diff --git a/.gitattributes b/.gitattributes index 69a90e3..b3352c2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11,7 +11,6 @@ /.gitignore linguist-generated /.mergify.yml linguist-generated /.npmignore linguist-generated -/.npmrc linguist-generated /.projen/** linguist-generated /.projen/deps.json linguist-generated /.projen/files.json linguist-generated diff --git a/.gitignore b/.gitignore index b601800..820dae2 100644 --- a/.gitignore +++ b/.gitignore @@ -40,7 +40,6 @@ junit.xml !/.mergify.yml !/.github/workflows/upgrade-main.yml !/.github/pull_request_template.md -!/.npmrc !/test/ !/tsconfig.json !/tsconfig.dev.json diff --git a/.projen/deps.json b/.projen/deps.json index 643cbf0..9bdcda4 100644 --- a/.projen/deps.json +++ b/.projen/deps.json @@ -49,7 +49,8 @@ "type": "build" }, { - "name": "eslint-import-resolver-node", + "name": "constructs", + "version": "^10.0.0", "type": "build" }, { diff --git a/.projen/files.json b/.projen/files.json index 8f99809..0b8ac3e 100644 --- a/.projen/files.json +++ b/.projen/files.json @@ -10,7 +10,6 @@ ".gitignore", ".mergify.yml", ".npmignore", - ".npmrc", ".projen/deps.json", ".projen/files.json", ".projen/tasks.json", diff --git a/.projen/tasks.json b/.projen/tasks.json index 506dd55..471cdc1 100644 --- a/.projen/tasks.json +++ b/.projen/tasks.json @@ -225,13 +225,13 @@ "exec": "yarn upgrade npm-check-updates" }, { - "exec": "npm-check-updates --upgrade --target=minor --filter=@swc/core,@swc/jest,@types/fs-extra,@types/jest,@types/mock-fs,@types/node,@typescript-eslint/eslint-plugin,@typescript-eslint/parser,@vercel/ncc,action-docs,aws-sdk-client-mock,eslint-import-resolver-node,eslint-import-resolver-typescript,eslint-plugin-import,eslint,jest,jest-junit,mock-fs,npm-check-updates,projen,projen-github-action-typescript,standard-version,ts-jest,ts-node,typescript,@actions/core,@actions/exec,@actions/github,@actions/io,@actions/tool-cache,@aws-cdk/cloud-assembly-schema,@aws-cdk/cloudformation-diff,@aws-sdk/client-cloudformation,@aws-sdk/credential-providers,@octokit/webhooks-definitions,@smithy/types,chalk,fs-extra" + "exec": "npm-check-updates --upgrade --target=minor --peer --dep=dev,peer,prod,optional --filter=@swc/core,@swc/jest,@types/fs-extra,@types/jest,@types/mock-fs,@types/node,@typescript-eslint/eslint-plugin,@typescript-eslint/parser,@vercel/ncc,action-docs,aws-sdk-client-mock,constructs,eslint-import-resolver-typescript,eslint-plugin-import,eslint,jest,jest-junit,mock-fs,npm-check-updates,projen,projen-github-action-typescript,standard-version,ts-jest,ts-node,typescript,@actions/core,@actions/exec,@actions/github,@actions/io,@actions/tool-cache,@aws-cdk/cloud-assembly-schema,@aws-cdk/cloudformation-diff,@aws-sdk/client-cloudformation,@aws-sdk/credential-providers,@octokit/webhooks-definitions,@smithy/types,chalk,fs-extra" }, { "exec": "yarn install --check-files" }, { - "exec": "yarn upgrade @swc/core @swc/jest @types/fs-extra @types/jest @types/mock-fs @types/node @typescript-eslint/eslint-plugin @typescript-eslint/parser @vercel/ncc action-docs aws-sdk-client-mock eslint-import-resolver-node eslint-import-resolver-typescript eslint-plugin-import eslint jest jest-junit mock-fs npm-check-updates projen projen-github-action-typescript standard-version ts-jest ts-node typescript @actions/core @actions/exec @actions/github @actions/io @actions/tool-cache @aws-cdk/cloud-assembly-schema @aws-cdk/cloudformation-diff @aws-sdk/client-cloudformation @aws-sdk/credential-providers @octokit/webhooks-definitions @smithy/types chalk fs-extra" + "exec": "yarn upgrade @swc/core @swc/jest @types/fs-extra @types/jest @types/mock-fs @types/node @typescript-eslint/eslint-plugin @typescript-eslint/parser @vercel/ncc action-docs aws-sdk-client-mock constructs eslint-import-resolver-typescript eslint-plugin-import eslint jest jest-junit mock-fs npm-check-updates projen projen-github-action-typescript standard-version ts-jest ts-node typescript @actions/core @actions/exec @actions/github @actions/io @actions/tool-cache @aws-cdk/cloud-assembly-schema @aws-cdk/cloudformation-diff @aws-sdk/client-cloudformation @aws-sdk/credential-providers @octokit/webhooks-definitions @smithy/types chalk fs-extra" }, { "exec": "npx projen" diff --git a/dist/index.js b/dist/index.js index 16d6d84..bcd28fc 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2745,417 +2745,7 @@ function isLoopbackAddress(host) { /***/ }), -/***/ 78694: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.cannedMetricsForService = void 0; -const canned_metrics_schema_1 = __nccwpck_require__(59859); -/** - * Return the list of canned metrics for the given service - */ -function cannedMetricsForService(cloudFormationNamespace) { - // One metricTemplate has a single set of dimensions, but the same metric NAME - // may occur in multiple metricTemplates (if it has multiple sets of dimensions) - const metricTemplates = cannedMetricsIndex()[cloudFormationNamespace] ?? []; - // First construct almost what we need, but with a single dimension per metric - const metricsWithDuplicates = flatMap(metricTemplates, metricSet => { - const dimensions = metricSet.dimensions.map(d => d.dimensionName); - return metricSet.metrics.map(metric => ({ - namespace: metricSet.namespace, - dimensions, - metricName: metric.name, - defaultStat: metric.defaultStat, - })); - }); - // Then combine the dimensions for the same metrics into a single list - return groupBy(metricsWithDuplicates, m => `${m.namespace}/${m.metricName}`).map(metrics => ({ - namespace: metrics[0].namespace, - metricName: metrics[0].metricName, - defaultStat: metrics[0].defaultStat, - dimensions: Array.from(dedupeStringLists(metrics.map(m => m.dimensions))), - })); -} -exports.cannedMetricsForService = cannedMetricsForService; -let cannedMetricsCache; -/** - * Load the canned metrics file and process it into an index, grouped by service namespace - */ -function cannedMetricsIndex() { - if (cannedMetricsCache === undefined) { - cannedMetricsCache = {}; - for (const group of (0, canned_metrics_schema_1.loadCannedMetricsFile)()) { - for (const metricTemplate of group.metricTemplates) { - const [aws, service] = metricTemplate.resourceType.split('::'); - const serviceKey = [aws, service].join('::'); - (cannedMetricsCache[serviceKey] ?? (cannedMetricsCache[serviceKey] = [])).push(metricTemplate); - } - } - } - return cannedMetricsCache; -} -function flatMap(xs, fn) { - return Array.prototype.concat.apply([], xs.map(fn)); -} -function groupBy(xs, keyFn) { - const obj = {}; - for (const x of xs) { - const key = keyFn(x); - if (key in obj) { - obj[key].push(x); - } - else { - obj[key] = [x]; - } - } - return Object.values(obj); -} -function* dedupeStringLists(xs) { - const seen = new Set(); - for (const x of xs) { - x.sort(); - const key = `${x.join(',')}`; - if (!seen.has(key)) { - yield x; - } - seen.add(key); - } -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FubmVkLW1ldHJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjYW5uZWQtbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrRkFBK0Y7QUE0Qy9GOztHQUVHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsdUJBQStCO0lBQ3JFLDhFQUE4RTtJQUM5RSxnRkFBZ0Y7SUFDaEYsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUU1RSw4RUFBOEU7SUFDOUUsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUztZQUM5QixVQUFVO1lBQ1YsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ3ZCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztTQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQyxDQUFDO0lBRUgsc0VBQXNFO0lBQ3RFLE9BQU8sT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0YsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQy9CLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVTtRQUNqQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVc7UUFDbkMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFRO0tBQ2pGLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQXZCRCwwREF1QkM7QUFJRCxJQUFJLGtCQUFrRCxDQUFDO0FBRXZEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0I7SUFDekIsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUU7UUFDcEMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBQSw2Q0FBcUIsR0FBRSxFQUFFO1lBQzNDLEtBQUssTUFBTSxjQUFjLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtnQkFDbEQsTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDaEc7U0FDRjtLQUNGO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQU8sRUFBTyxFQUFFLEVBQWlCO0lBQy9DLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFJLEVBQU8sRUFBRSxLQUF1QjtJQUNsRCxNQUFNLEdBQUcsR0FBcUMsRUFBRSxDQUFDO0lBQ2pELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7WUFDZCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xCO2FBQU07WUFDTCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQjtLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxRQUFRLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFjO0lBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDL0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1QsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxDQUFDLENBQUM7U0FDVDtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDZjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsb2FkQ2FubmVkTWV0cmljc0ZpbGUsIE1ldHJpY1RlbXBsYXRlIH0gZnJvbSAnLi9jYW5uZWQtbWV0cmljcy9jYW5uZWQtbWV0cmljcy1zY2hlbWEnO1xuXG5leHBvcnQgdHlwZSBOb25FbXB0eUFycmF5PFQ+ID0gW1QsIC4uLlRbXV07XG5cbi8qKlxuICogQSBzaW5nbGUgY2FubmVkIHNlcnZpY2UgbWV0cmljXG4gKlxuICogVGhlc2UgYXJlIGtpbmRseSBwcm92aWRlZCB0byB1cyBieSB0aGUgZ29vZCBwZW9wbGUgb2YgQ2xvdWRXYXRjaCBFeHBsb3Jlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYW5uZWRNZXRyaWMge1xuICAvKipcbiAgICogTWV0cmljIG5hbWVzcGFjZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBuYW1lXG4gICAqL1xuICByZWFkb25seSBtZXRyaWNOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYWxsIHBvc3NpYmxlIGRpbWVuc2lvbiBwZXJtdXRhdGlvbnMgZm9yIHRoaXMgbWV0cmljXG4gICAqXG4gICAqIE1vc3QgbWV0cmljcyB3aWxsIGhhdmUgYSBzaW5nbGUgbGlzdCBvZiBzdHJpbmdzIGFzIHRoZWlyIG9uZSBzZXQgb2ZcbiAgICogYWxsb3dlZCBkaW1lbnNpb25zLCBidXQgc29tZSBtZXRyaWNzIGFyZSBlbWl0dGVkIHVuZGVyIG11bHRpcGxlXG4gICAqIGNvbWJpbmF0aW9ucyBvZiBkaW1lbnNpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgZGltZW5zaW9uczogTm9uRW1wdHlBcnJheTxzdHJpbmdbXT47XG5cbiAgLyoqXG4gICAqIFN1Z2dlc3RlZCBkZWZhdWx0IGFnZ3JlZ3JhdGlvbiBzdGF0aXN0aWNcbiAgICpcbiAgICogTm90IGFsd2F5cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBvbmUgdG8gdXNlISBUaGVzZSBkZWZhdWx0cyBoYXZlXG4gICAqIGJlZW4gY2xhc3NpZmllZCBieSBwZW9wbGUgYW5kIHRoZXkgZ2VuZXJhbGx5IGp1c3QgcGljayBcIkF2ZXJhZ2VcIlxuICAgKiBhcyB0aGUgZGVmYXVsdCwgZXZlbiBpZiBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UuXG4gICAqXG4gICAqIEZvciBleGFtcGxlOiBmb3IgZXZlbnQtYmFzZWQgbWV0cmljcyB0aGF0IG9ubHkgZXZlciBlbWl0IGAxYFxuICAgKiAoYW5kIG5ldmVyIGAwYCkgdGhlIGJldHRlciBzdGF0aXN0aWMgd291bGQgYmUgYFN1bWAuXG4gICAqXG4gICAqIFVzZSB5b3VyIGp1ZGdlbWVudCBiYXNlZCBvbiB0aGUgdHlwZSBvZiBtZXRyaWMgdGhpcyBpcy5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRTdGF0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0IG9mIGNhbm5lZCBtZXRyaWNzIGZvciB0aGUgZ2l2ZW4gc2VydmljZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FubmVkTWV0cmljc0ZvclNlcnZpY2UoY2xvdWRGb3JtYXRpb25OYW1lc3BhY2U6IHN0cmluZyk6IENhbm5lZE1ldHJpY1tdIHtcbiAgLy8gT25lIG1ldHJpY1RlbXBsYXRlIGhhcyBhIHNpbmdsZSBzZXQgb2YgZGltZW5zaW9ucywgYnV0IHRoZSBzYW1lIG1ldHJpYyBOQU1FXG4gIC8vIG1heSBvY2N1ciBpbiBtdWx0aXBsZSBtZXRyaWNUZW1wbGF0ZXMgKGlmIGl0IGhhcyBtdWx0aXBsZSBzZXRzIG9mIGRpbWVuc2lvbnMpXG4gIGNvbnN0IG1ldHJpY1RlbXBsYXRlcyA9IGNhbm5lZE1ldHJpY3NJbmRleCgpW2Nsb3VkRm9ybWF0aW9uTmFtZXNwYWNlXSA/PyBbXTtcblxuICAvLyBGaXJzdCBjb25zdHJ1Y3QgYWxtb3N0IHdoYXQgd2UgbmVlZCwgYnV0IHdpdGggYSBzaW5nbGUgZGltZW5zaW9uIHBlciBtZXRyaWNcbiAgY29uc3QgbWV0cmljc1dpdGhEdXBsaWNhdGVzID0gZmxhdE1hcChtZXRyaWNUZW1wbGF0ZXMsIG1ldHJpY1NldCA9PiB7XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IG1ldHJpY1NldC5kaW1lbnNpb25zLm1hcChkID0+IGQuZGltZW5zaW9uTmFtZSk7XG4gICAgcmV0dXJuIG1ldHJpY1NldC5tZXRyaWNzLm1hcChtZXRyaWMgPT4gKHtcbiAgICAgIG5hbWVzcGFjZTogbWV0cmljU2V0Lm5hbWVzcGFjZSxcbiAgICAgIGRpbWVuc2lvbnMsXG4gICAgICBtZXRyaWNOYW1lOiBtZXRyaWMubmFtZSxcbiAgICAgIGRlZmF1bHRTdGF0OiBtZXRyaWMuZGVmYXVsdFN0YXQsXG4gICAgfSkpO1xuICB9KTtcblxuICAvLyBUaGVuIGNvbWJpbmUgdGhlIGRpbWVuc2lvbnMgZm9yIHRoZSBzYW1lIG1ldHJpY3MgaW50byBhIHNpbmdsZSBsaXN0XG4gIHJldHVybiBncm91cEJ5KG1ldHJpY3NXaXRoRHVwbGljYXRlcywgbSA9PiBgJHttLm5hbWVzcGFjZX0vJHttLm1ldHJpY05hbWV9YCkubWFwKG1ldHJpY3MgPT4gKHtcbiAgICBuYW1lc3BhY2U6IG1ldHJpY3NbMF0ubmFtZXNwYWNlLFxuICAgIG1ldHJpY05hbWU6IG1ldHJpY3NbMF0ubWV0cmljTmFtZSxcbiAgICBkZWZhdWx0U3RhdDogbWV0cmljc1swXS5kZWZhdWx0U3RhdCxcbiAgICBkaW1lbnNpb25zOiBBcnJheS5mcm9tKGRlZHVwZVN0cmluZ0xpc3RzKG1ldHJpY3MubWFwKG0gPT4gbS5kaW1lbnNpb25zKSkpIGFzIGFueSxcbiAgfSkpO1xufVxuXG50eXBlIENhbm5lZE1ldHJpY3NJbmRleCA9IFJlY29yZDxzdHJpbmcsIE1ldHJpY1RlbXBsYXRlW10+O1xuXG5sZXQgY2FubmVkTWV0cmljc0NhY2hlOiBDYW5uZWRNZXRyaWNzSW5kZXggfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogTG9hZCB0aGUgY2FubmVkIG1ldHJpY3MgZmlsZSBhbmQgcHJvY2VzcyBpdCBpbnRvIGFuIGluZGV4LCBncm91cGVkIGJ5IHNlcnZpY2UgbmFtZXNwYWNlXG4gKi9cbmZ1bmN0aW9uIGNhbm5lZE1ldHJpY3NJbmRleCgpIHtcbiAgaWYgKGNhbm5lZE1ldHJpY3NDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FubmVkTWV0cmljc0NhY2hlID0ge307XG4gICAgZm9yIChjb25zdCBncm91cCBvZiBsb2FkQ2FubmVkTWV0cmljc0ZpbGUoKSkge1xuICAgICAgZm9yIChjb25zdCBtZXRyaWNUZW1wbGF0ZSBvZiBncm91cC5tZXRyaWNUZW1wbGF0ZXMpIHtcbiAgICAgICAgY29uc3QgW2F3cywgc2VydmljZV0gPSBtZXRyaWNUZW1wbGF0ZS5yZXNvdXJjZVR5cGUuc3BsaXQoJzo6Jyk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBbYXdzLCBzZXJ2aWNlXS5qb2luKCc6OicpO1xuICAgICAgICAoY2FubmVkTWV0cmljc0NhY2hlW3NlcnZpY2VLZXldID8/IChjYW5uZWRNZXRyaWNzQ2FjaGVbc2VydmljZUtleV0gPSBbXSkpLnB1c2gobWV0cmljVGVtcGxhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2FubmVkTWV0cmljc0NhY2hlO1xufVxuXG5mdW5jdGlvbiBmbGF0TWFwPEEsIEI+KHhzOiBBW10sIGZuOiAoeDogQSkgPT4gQltdKTogQltdIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHhzLm1hcChmbikpO1xufVxuXG5mdW5jdGlvbiBncm91cEJ5PEE+KHhzOiBBW10sIGtleUZuOiAoeDogQSkgPT4gc3RyaW5nKTogQXJyYXk8Tm9uRW1wdHlBcnJheTxBPj4ge1xuICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIE5vbkVtcHR5QXJyYXk8QT4+ID0ge307XG4gIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgIGNvbnN0IGtleSA9IGtleUZuKHgpO1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICBvYmpba2V5XS5wdXNoKHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmpba2V5XSA9IFt4XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMob2JqKTtcbn1cblxuZnVuY3Rpb24qIGRlZHVwZVN0cmluZ0xpc3RzKHhzOiBzdHJpbmdbXVtdKTogSXRlcmFibGVJdGVyYXRvcjxzdHJpbmdbXT4ge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgIHguc29ydCgpO1xuICAgIGNvbnN0IGtleSA9IGAke3guam9pbignLCcpfWA7XG4gICAgaWYgKCFzZWVuLmhhcyhrZXkpKSB7XG4gICAgICB5aWVsZCB4O1xuICAgIH1cbiAgICBzZWVuLmFkZChrZXkpO1xuICB9XG59Il19 - -/***/ }), - -/***/ 59859: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.loadCannedMetricsFile = void 0; -/** - * Get the canned metrics source file - */ -function loadCannedMetricsFile() { - // eslint-disable-next-line @typescript-eslint/no-require-imports - return __nccwpck_require__(33522); -} -exports.loadCannedMetricsFile = loadCannedMetricsFile; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FubmVkLW1ldHJpY3Mtc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2FubmVkLW1ldHJpY3Mtc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCO0lBQ25DLGlFQUFpRTtJQUNqRSxPQUFPLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFIRCxzREFHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2V0IHRoZSBjYW5uZWQgbWV0cmljcyBzb3VyY2UgZmlsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZENhbm5lZE1ldHJpY3NGaWxlKCk6IENhbm5lZE1ldHJpY3NGaWxlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgcmV0dXJuIHJlcXVpcmUoJy4vc2VydmljZXMuanNvbicpO1xufVxuXG4vKipcbiAqIFNjaGVtYSBkZWZpbml0aW9ucyBmb3IgdGhlIGFjY29tcGFueWluZyBmaWxlIFwic2VydmljZXMuanNvblwiLlxuICovXG5leHBvcnQgdHlwZSBDYW5uZWRNZXRyaWNzRmlsZSA9IE1ldHJpY0luZm9Hcm91cFtdO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY0luZm9Hcm91cCB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIG1ldHJpYyB0ZW1wbGF0ZXNcbiAgICovXG4gIHJlYWRvbmx5IG1ldHJpY1RlbXBsYXRlczogTWV0cmljVGVtcGxhdGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNUZW1wbGF0ZSB7XG4gIC8qKlxuICAgKiBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBuYW1lXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZVR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogTWV0cmljIG5hbWVzcGFjZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNldCBvZiBkaW1lbnNpb25zIGZvciB0aGlzIHNldCBvZiBtZXRyaWNzXG4gICAqL1xuICByZWFkb25seSBkaW1lbnNpb25zOiBEaW1lbnNpb25bXTtcblxuICAvKipcbiAgICogU2V0IG9mIG1ldHJpY3MgdGhlc2UgZGltZW5zaW9ucyBhcHBseSB0b1xuICAgKi9cbiAgcmVhZG9ubHkgbWV0cmljczogTWV0cmljW107XG59XG5cbi8qKlxuICogRGltZW5zaW9uIGZvciB0aGlzIHNldCBvZiBtZXRyaWMgdGVtcGxhdGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9uIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGRpbWVuc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgZGltZW5zaW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHBvdGVudGlhbCBmaXhlZCB2YWx1ZSBmb3IgdGhpcyBkaW1lbnNpb25cbiAgICpcbiAgICogKEN1cnJlbnRseSB1bnVzZWQgYnkgdGhlIHNwZWMgcmVhZGVyLCBidXQgY291bGQgYmUgdXNlZClcbiAgICovXG4gIHJlYWRvbmx5IGRpbWVuc2lvblZhbHVlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2YgYW4gYXZhaWxhYmxlIG1ldHJpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBtZXRyaWNcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogRGVmYXVsdCAoc3VnZ2VzdGVkKSBzdGF0aXN0aWMgZm9yIHRoaXMgbWV0cmljXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0U3RhdDogc3RyaW5nO1xufSJdfQ== - -/***/ }), - -/***/ 72665: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -function __ncc_wildcard$0 (arg) { - if (arg === "AWS_EC2_VPNConnection") return __nccwpck_require__(3102); - else if (arg === "AWS_Lambda_Function") return __nccwpck_require__(15278); - else if (arg === "AWS_RDS_DBCluster") return __nccwpck_require__(46602); - else if (arg === "AWS_RDS_DBInstance") return __nccwpck_require__(48781); - else if (arg === "AWS_SNS_Topic") return __nccwpck_require__(49064); - else if (arg === "AWS_SQS_Queue") return __nccwpck_require__(27873); -} -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.scrutinizableResourceTypes = exports.scrutinizablePropertyNames = exports.filteredSpecification = exports.namespaces = exports.resourceTypes = exports.propertySpecification = exports.cfnLintAnnotations = exports.resourceAugmentation = exports.typeDocs = exports.resourceSpecification = exports.docs = exports.specification = exports.schema = void 0; -const crypto = __nccwpck_require__(6113); -const schema = __nccwpck_require__(23841); -exports.schema = schema; -const schema_1 = __nccwpck_require__(23841); -__exportStar(__nccwpck_require__(78694), exports); -/** - * The complete AWS CloudFormation Resource specification, having any CDK patches and enhancements included in it. - */ -function specification() { - // eslint-disable-next-line @typescript-eslint/no-require-imports - const spec = __nccwpck_require__(14081); - // Modify spec in place, remove complex attributes - for (const resource of Object.values(spec.ResourceTypes)) { - resource.Attributes = Object.fromEntries(Object.entries(resource.Attributes ?? []) - .filter(([_, attr]) => (0, schema_1.isPrimitiveAttribute)(attr) || (0, schema_1.isListAttribute)(attr) || (0, schema_1.isMapAttribute)(attr))); - } - return spec; -} -exports.specification = specification; -/** - * The complete AWS CloudFormation Resource specification, having any CDK patches and enhancements included in it. - */ -function docs() { - // eslint-disable-next-line @typescript-eslint/no-require-imports - return __nccwpck_require__(46510); -} -exports.docs = docs; -/** - * Return the resource specification for the given typename - * - * Validates that the resource exists. If you don't want this validating behavior, read from - * specification() directly. - */ -function resourceSpecification(typeName) { - const ret = specification().ResourceTypes[typeName]; - if (!ret) { - throw new Error(`No such resource type: ${typeName}`); - } - return ret; -} -exports.resourceSpecification = resourceSpecification; -/** - * Return documentation for the given type - */ -function typeDocs(resourceName, propertyTypeName) { - const key = propertyTypeName ? `${resourceName}.${propertyTypeName}` : resourceName; - const ret = docs().Types[key]; - if (!ret) { - return { - description: '', - properties: {}, - }; - } - return ret; -} -exports.typeDocs = typeDocs; -/** - * Get the resource augmentations for a given type - */ -function resourceAugmentation(typeName) { - const fileName = typeName.replace(/::/g, '_'); - try { - // eslint-disable-next-line @typescript-eslint/no-require-imports - return __ncc_wildcard$0(fileName); - } - catch { - return {}; - } -} -exports.resourceAugmentation = resourceAugmentation; -/** - * Get the resource augmentations for a given type - */ -function cfnLintAnnotations(typeName) { - // eslint-disable-next-line @typescript-eslint/no-require-imports - const allAnnotations = __nccwpck_require__(21507); - return { - stateful: !!allAnnotations.StatefulResources.ResourceTypes[typeName], - mustBeEmptyToDelete: allAnnotations.StatefulResources.ResourceTypes[typeName]?.DeleteRequiresEmptyResource ?? false, - }; -} -exports.cfnLintAnnotations = cfnLintAnnotations; -/** - * Return the property specification for the given resource's property - */ -function propertySpecification(typeName, propertyName) { - const ret = resourceSpecification(typeName).Properties[propertyName]; - if (!ret) { - throw new Error(`Resource ${typeName} has no property: ${propertyName}`); - } - return ret; -} -exports.propertySpecification = propertySpecification; -/** - * The list of resource type names defined in the ``specification``. - */ -function resourceTypes() { - return Object.keys(specification().ResourceTypes); -} -exports.resourceTypes = resourceTypes; -/** - * The list of namespaces defined in the ``specification``, that is resource name prefixes down to the second ``::``. - */ -function namespaces() { - return Array.from(new Set(resourceTypes().map(n => n.split('::', 2).join('::')))); -} -exports.namespaces = namespaces; -/** - * Obtain a filtered version of the AWS CloudFormation specification. - * - * @param filter the predicate to be used in order to filter which resource types from the ``Specification`` to extract. - * When passed as a ``string``, only the specified resource type will be extracted. When passed as a - * ``RegExp``, all matching resource types will be extracted. When passed as a ``function``, all resource - * types for which the function returned ``true`` will be extracted. - * - * @return a coherent sub-set of the AWS CloudFormation Resource specification, including all property types related - * to the selected resource types. - */ -function filteredSpecification(filter) { - const spec = specification(); - const result = { ResourceTypes: {}, PropertyTypes: {}, Fingerprint: spec.Fingerprint }; - const predicate = makePredicate(filter); - for (const type of resourceTypes()) { - if (!predicate(type)) { - continue; - } - result.ResourceTypes[type] = spec.ResourceTypes[type]; - const prefix = `${type}.`; - for (const propType of Object.keys(spec.PropertyTypes).filter(n => n.startsWith(prefix))) { - result.PropertyTypes[propType] = spec.PropertyTypes[propType]; - } - } - result.Fingerprint = crypto.createHash('sha256').update(JSON.stringify(result)).digest('base64'); - return result; -} -exports.filteredSpecification = filteredSpecification; -/** - * Creates a predicate function from a given filter. - * - * @param filter when provided as a ``string``, performs an exact match comparison. - * when provided as a ``RegExp``, performs uses ``str.match(RegExp)``. - * when provided as a ``function``, use the function as-is. - * - * @returns a predicate function. - */ -function makePredicate(filter) { - if (typeof filter === 'string') { - return s => s === filter; - } - else if (typeof filter === 'function') { - return filter; - } - else { - return s => s.match(filter) != null; - } -} -/** - * Return the properties of the given type that require the given scrutiny type - */ -function scrutinizablePropertyNames(resourceType, scrutinyTypes) { - const impl = specification().ResourceTypes[resourceType]; - if (!impl) { - return []; - } - const ret = new Array(); - for (const [propertyName, propertySpec] of Object.entries(impl.Properties || {})) { - if (scrutinyTypes.includes(propertySpec.ScrutinyType || schema.PropertyScrutinyType.None)) { - ret.push(propertyName); - } - } - return ret; -} -exports.scrutinizablePropertyNames = scrutinizablePropertyNames; -/** - * Return the names of the resource types that need to be subjected to additional scrutiny - */ -function scrutinizableResourceTypes(scrutinyTypes) { - const ret = new Array(); - for (const [resourceType, resourceSpec] of Object.entries(specification().ResourceTypes)) { - if (scrutinyTypes.includes(resourceSpec.ScrutinyType || schema.ResourceScrutinyType.None)) { - ret.push(resourceType); - } - } - return ret; -} -exports.scrutinizableResourceTypes = scrutinizableResourceTypes; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlDQUFpQztBQUVqQyxtQ0FBbUM7QUFFMUIsd0JBQU07QUFEZixxQ0FBaUY7QUFFakYsbURBQWlDO0FBRWpDOztHQUVHO0FBQ0gsU0FBZ0IsYUFBYTtJQUMzQixpRUFBaUU7SUFDakUsTUFBTSxJQUFJLEdBQXlCLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBRXpFLGtEQUFrRDtJQUNsRCxLQUFLLE1BQU0sUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQ3hELFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO2FBQy9FLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDZCQUFvQixFQUFDLElBQUksQ0FBQyxJQUFJLElBQUEsd0JBQWUsRUFBQyxJQUFJLENBQUMsSUFBSSxJQUFBLHVCQUFjLEVBQUMsSUFBSSxDQUFDLENBQUUsQ0FBQyxDQUFDO0tBQ3pHO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBWEQsc0NBV0M7QUFFRDs7R0FFRztBQUNILFNBQWdCLElBQUk7SUFDbEIsaUVBQWlFO0lBQ2pFLE9BQU8sT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUhELG9CQUdDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxRQUFnQjtJQUNwRCxNQUFNLEdBQUcsR0FBRyxhQUFhLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FDdkQ7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFORCxzREFNQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLFlBQW9CLEVBQUUsZ0JBQXlCO0lBQ3RFLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDcEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUixPQUFPO1lBQ0wsV0FBVyxFQUFFLEVBQUU7WUFDZixVQUFVLEVBQUUsRUFBRTtTQUNmLENBQUM7S0FDSDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQVZELDRCQVVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxRQUFnQjtJQUNuRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5QyxJQUFJO1FBQ0YsaUVBQWlFO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLG1CQUFtQixRQUFRLE9BQU8sQ0FBQyxDQUFDO0tBQ3BEO0lBQUMsTUFBTTtRQUNOLE9BQU8sRUFBRSxDQUFDO0tBQ1g7QUFDSCxDQUFDO0FBUkQsb0RBUUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLFFBQWdCO0lBQ2pELGlFQUFpRTtJQUNqRSxNQUFNLGNBQWMsR0FBc0IsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFFM0UsT0FBTztRQUNMLFFBQVEsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDcEUsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSwyQkFBMkIsSUFBSSxLQUFLO0tBQ3BILENBQUM7QUFDSixDQUFDO0FBUkQsZ0RBUUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLFFBQWdCLEVBQUUsWUFBb0I7SUFDMUUsTUFBTSxHQUFHLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RFLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUixNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksUUFBUSxxQkFBcUIsWUFBWSxFQUFFLENBQUMsQ0FBQztLQUMxRTtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQU5ELHNEQU1DO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixhQUFhO0lBQzNCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRkQsc0NBRUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFVBQVU7SUFDeEIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRixDQUFDO0FBRkQsZ0NBRUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsTUFBZ0M7SUFDcEUsTUFBTSxJQUFJLEdBQUcsYUFBYSxFQUFFLENBQUM7SUFFN0IsTUFBTSxNQUFNLEdBQXlCLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0csTUFBTSxTQUFTLEdBQVcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELEtBQUssTUFBTSxJQUFJLElBQUksYUFBYSxFQUFFLEVBQUU7UUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUFFLFNBQVM7U0FBRTtRQUNuQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUMxQixLQUFLLE1BQU0sUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtZQUN6RixNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDaEU7S0FDRjtJQUNELE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBZkQsc0RBZUM7QUFJRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsYUFBYSxDQUFDLE1BQWdDO0lBQ3JELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1FBQzlCLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDO0tBQzFCO1NBQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVLEVBQUU7UUFDdkMsT0FBTyxNQUFnQixDQUFDO0tBQ3pCO1NBQU07UUFDTCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUM7S0FDckM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQiwwQkFBMEIsQ0FBQyxZQUFvQixFQUFFLGFBQTRDO0lBQzNHLE1BQU0sSUFBSSxHQUFHLGFBQWEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUM7S0FBRTtJQUV6QixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBRWhDLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUU7UUFDaEYsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pGLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDeEI7S0FDRjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQWJELGdFQWFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQiwwQkFBMEIsQ0FBQyxhQUE0QztJQUNyRixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBQ2hDLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQ3hGLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN6RixHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3hCO0tBQ0Y7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFURCxnRUFTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgQ2ZuTGludEZpbGVTY2hlbWEgfSBmcm9tICcuL19wcml2YXRlX3NjaGVtYS9jZm4tbGludCc7XG5pbXBvcnQgKiBhcyBzY2hlbWEgZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgaXNQcmltaXRpdmVBdHRyaWJ1dGUsIGlzTGlzdEF0dHJpYnV0ZSwgaXNNYXBBdHRyaWJ1dGUgfSBmcm9tICcuL3NjaGVtYSc7XG5leHBvcnQgeyBzY2hlbWEgfTtcbmV4cG9ydCAqIGZyb20gJy4vY2FubmVkLW1ldHJpY3MnO1xuXG4vKipcbiAqIFRoZSBjb21wbGV0ZSBBV1MgQ2xvdWRGb3JtYXRpb24gUmVzb3VyY2Ugc3BlY2lmaWNhdGlvbiwgaGF2aW5nIGFueSBDREsgcGF0Y2hlcyBhbmQgZW5oYW5jZW1lbnRzIGluY2x1ZGVkIGluIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BlY2lmaWNhdGlvbigpOiBzY2hlbWEuU3BlY2lmaWNhdGlvbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHNwZWM6IHNjaGVtYS5TcGVjaWZpY2F0aW9uID0gcmVxdWlyZSgnLi4vc3BlYy9zcGVjaWZpY2F0aW9uLmpzb24nKTtcblxuICAvLyBNb2RpZnkgc3BlYyBpbiBwbGFjZSwgcmVtb3ZlIGNvbXBsZXggYXR0cmlidXRlc1xuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIE9iamVjdC52YWx1ZXMoc3BlYy5SZXNvdXJjZVR5cGVzKSkge1xuICAgIHJlc291cmNlLkF0dHJpYnV0ZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocmVzb3VyY2UuQXR0cmlidXRlcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKFtfLCBhdHRyXSkgPT4gaXNQcmltaXRpdmVBdHRyaWJ1dGUoYXR0cikgfHwgaXNMaXN0QXR0cmlidXRlKGF0dHIpIHx8IGlzTWFwQXR0cmlidXRlKGF0dHIpICkpO1xuICB9XG5cbiAgcmV0dXJuIHNwZWM7XG59XG5cbi8qKlxuICogVGhlIGNvbXBsZXRlIEFXUyBDbG91ZEZvcm1hdGlvbiBSZXNvdXJjZSBzcGVjaWZpY2F0aW9uLCBoYXZpbmcgYW55IENESyBwYXRjaGVzIGFuZCBlbmhhbmNlbWVudHMgaW5jbHVkZWQgaW4gaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2NzKCk6IHNjaGVtYS5DbG91ZEZvcm1hdGlvbkRvY3NGaWxlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgcmV0dXJuIHJlcXVpcmUoJy4uL3NwZWMvY2ZuLWRvY3MuanNvbicpO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcmVzb3VyY2Ugc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGdpdmVuIHR5cGVuYW1lXG4gKlxuICogVmFsaWRhdGVzIHRoYXQgdGhlIHJlc291cmNlIGV4aXN0cy4gSWYgeW91IGRvbid0IHdhbnQgdGhpcyB2YWxpZGF0aW5nIGJlaGF2aW9yLCByZWFkIGZyb21cbiAqIHNwZWNpZmljYXRpb24oKSBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc291cmNlU3BlY2lmaWNhdGlvbih0eXBlTmFtZTogc3RyaW5nKTogc2NoZW1hLlJlc291cmNlVHlwZSB7XG4gIGNvbnN0IHJldCA9IHNwZWNpZmljYXRpb24oKS5SZXNvdXJjZVR5cGVzW3R5cGVOYW1lXTtcbiAgaWYgKCFyZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggcmVzb3VyY2UgdHlwZTogJHt0eXBlTmFtZX1gKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIFJldHVybiBkb2N1bWVudGF0aW9uIGZvciB0aGUgZ2l2ZW4gdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZURvY3MocmVzb3VyY2VOYW1lOiBzdHJpbmcsIHByb3BlcnR5VHlwZU5hbWU/OiBzdHJpbmcpOiBzY2hlbWEuQ2xvdWRGb3JtYXRpb25UeXBlRG9jcyB7XG4gIGNvbnN0IGtleSA9IHByb3BlcnR5VHlwZU5hbWUgPyBgJHtyZXNvdXJjZU5hbWV9LiR7cHJvcGVydHlUeXBlTmFtZX1gIDogcmVzb3VyY2VOYW1lO1xuICBjb25zdCByZXQgPSBkb2NzKCkuVHlwZXNba2V5XTtcbiAgaWYgKCFyZXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgcHJvcGVydGllczoge30sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIEdldCB0aGUgcmVzb3VyY2UgYXVnbWVudGF0aW9ucyBmb3IgYSBnaXZlbiB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvdXJjZUF1Z21lbnRhdGlvbih0eXBlTmFtZTogc3RyaW5nKTogc2NoZW1hLlJlc291cmNlQXVnbWVudGF0aW9uIHtcbiAgY29uc3QgZmlsZU5hbWUgPSB0eXBlTmFtZS5yZXBsYWNlKC86Oi9nLCAnXycpO1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgcmV0dXJuIHJlcXVpcmUoYC4vYXVnbWVudGF0aW9ucy8ke2ZpbGVOYW1lfS5qc29uYCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgcmVzb3VyY2UgYXVnbWVudGF0aW9ucyBmb3IgYSBnaXZlbiB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZm5MaW50QW5ub3RhdGlvbnModHlwZU5hbWU6IHN0cmluZyk6IHNjaGVtYS5DZm5MaW50UmVzb3VyY2VBbm5vdGF0aW9ucyB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGFsbEFubm90YXRpb25zOiBDZm5MaW50RmlsZVNjaGVtYSA9IHJlcXVpcmUoJy4uL3NwZWMvY2ZuLWxpbnQuanNvbicpO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdGVmdWw6ICEhYWxsQW5ub3RhdGlvbnMuU3RhdGVmdWxSZXNvdXJjZXMuUmVzb3VyY2VUeXBlc1t0eXBlTmFtZV0sXG4gICAgbXVzdEJlRW1wdHlUb0RlbGV0ZTogYWxsQW5ub3RhdGlvbnMuU3RhdGVmdWxSZXNvdXJjZXMuUmVzb3VyY2VUeXBlc1t0eXBlTmFtZV0/LkRlbGV0ZVJlcXVpcmVzRW1wdHlSZXNvdXJjZSA/PyBmYWxzZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHByb3BlcnR5IHNwZWNpZmljYXRpb24gZm9yIHRoZSBnaXZlbiByZXNvdXJjZSdzIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eVNwZWNpZmljYXRpb24odHlwZU5hbWU6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzY2hlbWEuUHJvcGVydHkge1xuICBjb25zdCByZXQgPSByZXNvdXJjZVNwZWNpZmljYXRpb24odHlwZU5hbWUpLlByb3BlcnRpZXMhW3Byb3BlcnR5TmFtZV07XG4gIGlmICghcmV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXNvdXJjZSAke3R5cGVOYW1lfSBoYXMgbm8gcHJvcGVydHk6ICR7cHJvcGVydHlOYW1lfWApO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogVGhlIGxpc3Qgb2YgcmVzb3VyY2UgdHlwZSBuYW1lcyBkZWZpbmVkIGluIHRoZSBgYHNwZWNpZmljYXRpb25gYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc291cmNlVHlwZXMoKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzcGVjaWZpY2F0aW9uKCkuUmVzb3VyY2VUeXBlcyk7XG59XG5cbi8qKlxuICogVGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyBkZWZpbmVkIGluIHRoZSBgYHNwZWNpZmljYXRpb25gYCwgdGhhdCBpcyByZXNvdXJjZSBuYW1lIHByZWZpeGVzIGRvd24gdG8gdGhlIHNlY29uZCBgYDo6YGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lc3BhY2VzKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHJlc291cmNlVHlwZXMoKS5tYXAobiA9PiBuLnNwbGl0KCc6OicsIDIpLmpvaW4oJzo6JykpKSk7XG59XG5cbi8qKlxuICogT2J0YWluIGEgZmlsdGVyZWQgdmVyc2lvbiBvZiB0aGUgQVdTIENsb3VkRm9ybWF0aW9uIHNwZWNpZmljYXRpb24uXG4gKlxuICogQHBhcmFtIGZpbHRlciB0aGUgcHJlZGljYXRlIHRvIGJlIHVzZWQgaW4gb3JkZXIgdG8gZmlsdGVyIHdoaWNoIHJlc291cmNlIHR5cGVzIGZyb20gdGhlIGBgU3BlY2lmaWNhdGlvbmBgIHRvIGV4dHJhY3QuXG4gKiAgICAgICAgIFdoZW4gcGFzc2VkIGFzIGEgYGBzdHJpbmdgYCwgb25seSB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHR5cGUgd2lsbCBiZSBleHRyYWN0ZWQuIFdoZW4gcGFzc2VkIGFzIGFcbiAqICAgICAgICAgYGBSZWdFeHBgYCwgYWxsIG1hdGNoaW5nIHJlc291cmNlIHR5cGVzIHdpbGwgYmUgZXh0cmFjdGVkLiBXaGVuIHBhc3NlZCBhcyBhIGBgZnVuY3Rpb25gYCwgYWxsIHJlc291cmNlXG4gKiAgICAgICAgIHR5cGVzIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYGB0cnVlYGAgd2lsbCBiZSBleHRyYWN0ZWQuXG4gKlxuICogQHJldHVybiBhIGNvaGVyZW50IHN1Yi1zZXQgb2YgdGhlIEFXUyBDbG91ZEZvcm1hdGlvbiBSZXNvdXJjZSBzcGVjaWZpY2F0aW9uLCBpbmNsdWRpbmcgYWxsIHByb3BlcnR5IHR5cGVzIHJlbGF0ZWRcbiAqICAgICB0byB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgdHlwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJlZFNwZWNpZmljYXRpb24oZmlsdGVyOiBzdHJpbmcgfCBSZWdFeHAgfCBGaWx0ZXIpOiBzY2hlbWEuU3BlY2lmaWNhdGlvbiB7XG4gIGNvbnN0IHNwZWMgPSBzcGVjaWZpY2F0aW9uKCk7XG5cbiAgY29uc3QgcmVzdWx0OiBzY2hlbWEuU3BlY2lmaWNhdGlvbiA9IHsgUmVzb3VyY2VUeXBlczoge30sIFByb3BlcnR5VHlwZXM6IHt9LCBGaW5nZXJwcmludDogc3BlYy5GaW5nZXJwcmludCB9O1xuICBjb25zdCBwcmVkaWNhdGU6IEZpbHRlciA9IG1ha2VQcmVkaWNhdGUoZmlsdGVyKTtcbiAgZm9yIChjb25zdCB0eXBlIG9mIHJlc291cmNlVHlwZXMoKSkge1xuICAgIGlmICghcHJlZGljYXRlKHR5cGUpKSB7IGNvbnRpbnVlOyB9XG4gICAgcmVzdWx0LlJlc291cmNlVHlwZXNbdHlwZV0gPSBzcGVjLlJlc291cmNlVHlwZXNbdHlwZV07XG4gICAgY29uc3QgcHJlZml4ID0gYCR7dHlwZX0uYDtcbiAgICBmb3IgKGNvbnN0IHByb3BUeXBlIG9mIE9iamVjdC5rZXlzKHNwZWMuUHJvcGVydHlUeXBlcyEpLmZpbHRlcihuID0+IG4uc3RhcnRzV2l0aChwcmVmaXgpKSkge1xuICAgICAgcmVzdWx0LlByb3BlcnR5VHlwZXNbcHJvcFR5cGVdID0gc3BlYy5Qcm9wZXJ0eVR5cGVzIVtwcm9wVHlwZV07XG4gICAgfVxuICB9XG4gIHJlc3VsdC5GaW5nZXJwcmludCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSkuZGlnZXN0KCdiYXNlNjQnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IHR5cGUgRmlsdGVyID0gKG5hbWU6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJlZGljYXRlIGZ1bmN0aW9uIGZyb20gYSBnaXZlbiBmaWx0ZXIuXG4gKlxuICogQHBhcmFtIGZpbHRlciB3aGVuIHByb3ZpZGVkIGFzIGEgYGBzdHJpbmdgYCwgcGVyZm9ybXMgYW4gZXhhY3QgbWF0Y2ggY29tcGFyaXNvbi5cbiAqICAgICAgICAgd2hlbiBwcm92aWRlZCBhcyBhIGBgUmVnRXhwYGAsIHBlcmZvcm1zIHVzZXMgYGBzdHIubWF0Y2goUmVnRXhwKWBgLlxuICogICAgICAgICB3aGVuIHByb3ZpZGVkIGFzIGEgYGBmdW5jdGlvbmBgLCB1c2UgdGhlIGZ1bmN0aW9uIGFzLWlzLlxuICpcbiAqIEByZXR1cm5zIGEgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtYWtlUHJlZGljYXRlKGZpbHRlcjogc3RyaW5nIHwgUmVnRXhwIHwgRmlsdGVyKTogRmlsdGVyIHtcbiAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHMgPT4gcyA9PT0gZmlsdGVyO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmlsdGVyIGFzIEZpbHRlcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcyA9PiBzLm1hdGNoKGZpbHRlcikgIT0gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW4gdHlwZSB0aGF0IHJlcXVpcmUgdGhlIGdpdmVuIHNjcnV0aW55IHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcnV0aW5pemFibGVQcm9wZXJ0eU5hbWVzKHJlc291cmNlVHlwZTogc3RyaW5nLCBzY3J1dGlueVR5cGVzOiBzY2hlbWEuUHJvcGVydHlTY3J1dGlueVR5cGVbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaW1wbCA9IHNwZWNpZmljYXRpb24oKS5SZXNvdXJjZVR5cGVzW3Jlc291cmNlVHlwZV07XG4gIGlmICghaW1wbCkgeyByZXR1cm4gW107IH1cblxuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgcHJvcGVydHlTcGVjXSBvZiBPYmplY3QuZW50cmllcyhpbXBsLlByb3BlcnRpZXMgfHwge30pKSB7XG4gICAgaWYgKHNjcnV0aW55VHlwZXMuaW5jbHVkZXMocHJvcGVydHlTcGVjLlNjcnV0aW55VHlwZSB8fCBzY2hlbWEuUHJvcGVydHlTY3J1dGlueVR5cGUuTm9uZSkpIHtcbiAgICAgIHJldC5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSByZXNvdXJjZSB0eXBlcyB0aGF0IG5lZWQgdG8gYmUgc3ViamVjdGVkIHRvIGFkZGl0aW9uYWwgc2NydXRpbnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcnV0aW5pemFibGVSZXNvdXJjZVR5cGVzKHNjcnV0aW55VHlwZXM6IHNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZVtdKTogc3RyaW5nW10ge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIHJlc291cmNlU3BlY10gb2YgT2JqZWN0LmVudHJpZXMoc3BlY2lmaWNhdGlvbigpLlJlc291cmNlVHlwZXMpKSB7XG4gICAgaWYgKHNjcnV0aW55VHlwZXMuaW5jbHVkZXMocmVzb3VyY2VTcGVjLlNjcnV0aW55VHlwZSB8fCBzY2hlbWEuUmVzb3VyY2VTY3J1dGlueVR5cGUuTm9uZSkpIHtcbiAgICAgIHJldC5wdXNoKHJlc291cmNlVHlwZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ== - -/***/ }), - -/***/ 61733: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.MetricType = void 0; -var MetricType; -(function (MetricType) { - /** - * This metric measures an attribute of events - * - * It could be time, or request size, or similar. The default - * aggregate for this type of event is "Avg". - */ - MetricType["Attrib"] = "attrib"; - /** - * This metric is counting events. - * - * This means the metric "1" is emitted every time an event occurs. - * Only "Sum" is a meaningful aggregate of this type of metric. - */ - MetricType["Count"] = "count"; - /** - * This metric is emitting a size. - * - * The metric is not event-based, but measures some global ever-changing - * property. The most useful aggregate of this type of metric is "Max". - */ - MetricType["Gauge"] = "gauge"; -})(MetricType || (exports.MetricType = MetricType = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVnbWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXVnbWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXdFQSxJQUFZLFVBd0JYO0FBeEJELFdBQVksVUFBVTtJQUNwQjs7Ozs7T0FLRztJQUNILCtCQUFpQixDQUFBO0lBRWpCOzs7OztPQUtHO0lBQ0gsNkJBQWUsQ0FBQTtJQUVmOzs7OztPQUtHO0lBQ0gsNkJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBeEJXLFVBQVUsMEJBQVYsVUFBVSxRQXdCckIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1Z21lbnRhdGlvbnMgZm9yIGEgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlQXVnbWVudGF0aW9uIHtcbiAgLyoqXG4gICAqIE1ldHJpYyBhdWdtZW50YXRpb25zIGZvciB0aGlzIHJlc291cmNlIHR5cGVcbiAgICovXG4gIG1ldHJpY3M/OiBSZXNvdXJjZU1ldHJpY0F1Z21lbnRhdGlvbnM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIHRoaXMgcmVzb3VyY2UgYXVnbWVudGF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vIG9wdGlvbnNcbiAgICovXG4gIG9wdGlvbnM/OiBBdWdtZW50YXRpb25PcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1Z21lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MgdG8gYmUgXCJhdWdtZW50ZWRcIi5cbiAgICpcbiAgICogQGRlZmF1bHQga2ViYWIgY2FzZWQgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgbmFtZSArICctYmFzZSdcbiAgICovXG4gIGNsYXNzRmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIFwiYXVnbWVudGVkXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IENsb3VkRm9ybWF0aW9uIHJlc291cmNlIG5hbWUgKyAnQmFzZSdcbiAgICovXG4gIGNsYXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbnRlcmZhY2UgdG8gYmUgXCJhdWdtZW50ZWRcIi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzYW1lIGFzIGBgY2xhc3NGaWxlYGAuXG4gICAqL1xuICBpbnRlcmZhY2VGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRvIGJlIFwiYXVnbWVudGVkXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdJJyArIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIG5hbWVcbiAgICovXG4gIGludGVyZmFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZU1ldHJpY0F1Z21lbnRhdGlvbnMge1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgZGltZW5zaW9uczoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIG1ldHJpY3M6IFJlc291cmNlTWV0cmljW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VNZXRyaWMge1xuICAvKipcbiAgICogVXBwZXJjYXNlLWZpcnN0IG1ldHJpYyBuYW1lXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvY3VtZW50YXRpb24gbGluZVxuICAgKi9cbiAgZG9jdW1lbnRhdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYW4gZXZlbiBjb3VudCAoMSBnZXRzIGVtaXR0ZWQgZXZlcnkgdGltZSBzb21ldGhpbmcgb2NjdXJzKVxuICAgKlxuICAgKiBAZGVmYXVsdCBNZXRyaWNUeXBlLkF0dHJpYlxuICAgKi9cbiAgdHlwZT86IE1ldHJpY1R5cGU7XG59XG5cbmV4cG9ydCBlbnVtIE1ldHJpY1R5cGUge1xuICAvKipcbiAgICogVGhpcyBtZXRyaWMgbWVhc3VyZXMgYW4gYXR0cmlidXRlIG9mIGV2ZW50c1xuICAgKlxuICAgKiBJdCBjb3VsZCBiZSB0aW1lLCBvciByZXF1ZXN0IHNpemUsIG9yIHNpbWlsYXIuIFRoZSBkZWZhdWx0XG4gICAqIGFnZ3JlZ2F0ZSBmb3IgdGhpcyB0eXBlIG9mIGV2ZW50IGlzIFwiQXZnXCIuXG4gICAqL1xuICBBdHRyaWIgPSAnYXR0cmliJyxcblxuICAvKipcbiAgICogVGhpcyBtZXRyaWMgaXMgY291bnRpbmcgZXZlbnRzLlxuICAgKlxuICAgKiBUaGlzIG1lYW5zIHRoZSBtZXRyaWMgXCIxXCIgaXMgZW1pdHRlZCBldmVyeSB0aW1lIGFuIGV2ZW50IG9jY3Vycy5cbiAgICogT25seSBcIlN1bVwiIGlzIGEgbWVhbmluZ2Z1bCBhZ2dyZWdhdGUgb2YgdGhpcyB0eXBlIG9mIG1ldHJpYy5cbiAgICovXG4gIENvdW50ID0gJ2NvdW50JyxcblxuICAvKipcbiAgICogVGhpcyBtZXRyaWMgaXMgZW1pdHRpbmcgYSBzaXplLlxuICAgKlxuICAgKiBUaGUgbWV0cmljIGlzIG5vdCBldmVudC1iYXNlZCwgYnV0IG1lYXN1cmVzIHNvbWUgZ2xvYmFsIGV2ZXItY2hhbmdpbmdcbiAgICogcHJvcGVydHkuIFRoZSBtb3N0IHVzZWZ1bCBhZ2dyZWdhdGUgb2YgdGhpcyB0eXBlIG9mIG1ldHJpYyBpcyBcIk1heFwiLlxuICAgKi9cbiAgR2F1Z2UgPSAnZ2F1Z2UnXG59XG4iXX0= - -/***/ }), - -/***/ 82294: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isPrimitiveType = exports.PrimitiveType = void 0; -var PrimitiveType; -(function (PrimitiveType) { - PrimitiveType["String"] = "String"; - PrimitiveType["Long"] = "Long"; - PrimitiveType["Integer"] = "Integer"; - PrimitiveType["Double"] = "Double"; - PrimitiveType["Boolean"] = "Boolean"; - PrimitiveType["Timestamp"] = "Timestamp"; - PrimitiveType["Json"] = "Json"; -})(PrimitiveType || (exports.PrimitiveType = PrimitiveType = {})); -function isPrimitiveType(str) { - switch (str) { - case PrimitiveType.String: - case PrimitiveType.Long: - case PrimitiveType.Integer: - case PrimitiveType.Double: - case PrimitiveType.Boolean: - case PrimitiveType.Timestamp: - case PrimitiveType.Json: - return true; - default: - return false; - } -} -exports.isPrimitiveType = isPrimitiveType; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJhc2UtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsSUFBWSxhQVFYO0FBUkQsV0FBWSxhQUFhO0lBQ3ZCLGtDQUFpQixDQUFBO0lBQ2pCLDhCQUFhLENBQUE7SUFDYixvQ0FBbUIsQ0FBQTtJQUNuQixrQ0FBaUIsQ0FBQTtJQUNqQixvQ0FBbUIsQ0FBQTtJQUNuQix3Q0FBdUIsQ0FBQTtJQUN2Qiw4QkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQVJXLGFBQWEsNkJBQWIsYUFBYSxRQVF4QjtBQUVELFNBQWdCLGVBQWUsQ0FBQyxHQUFXO0lBQ3pDLFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQzFCLEtBQUssYUFBYSxDQUFDLElBQUksQ0FBQztRQUN4QixLQUFLLGFBQWEsQ0FBQyxPQUFPLENBQUM7UUFDM0IsS0FBSyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQzFCLEtBQUssYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUMzQixLQUFLLGFBQWEsQ0FBQyxTQUFTLENBQUM7UUFDN0IsS0FBSyxhQUFhLENBQUMsSUFBSTtZQUNyQixPQUFPLElBQUksQ0FBQztRQUNkO1lBQ0UsT0FBTyxLQUFLLENBQUM7S0FDaEI7QUFDSCxDQUFDO0FBYkQsMENBYUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIERvY3VtZW50ZWQge1xuICAvKiogQSBsaW5rIHRvIHRoZSBBV1MgQ2xvdWRGb3JtYXRpb24gVXNlciBHdWlkZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9ucyBhYm91dCB0aGUgZW50aXR5LiAqL1xuICBEb2N1bWVudGF0aW9uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBQcmltaXRpdmVUeXBlIHtcbiAgU3RyaW5nID0gJ1N0cmluZycsXG4gIExvbmcgPSAnTG9uZycsXG4gIEludGVnZXIgPSAnSW50ZWdlcicsXG4gIERvdWJsZSA9ICdEb3VibGUnLFxuICBCb29sZWFuID0gJ0Jvb2xlYW4nLFxuICBUaW1lc3RhbXAgPSAnVGltZXN0YW1wJyxcbiAgSnNvbiA9ICdKc29uJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmVUeXBlKHN0cjogc3RyaW5nKTogc3RyIGlzIFByaW1pdGl2ZVR5cGUge1xuICBzd2l0Y2ggKHN0cikge1xuICAgIGNhc2UgUHJpbWl0aXZlVHlwZS5TdHJpbmc6XG4gICAgY2FzZSBQcmltaXRpdmVUeXBlLkxvbmc6XG4gICAgY2FzZSBQcmltaXRpdmVUeXBlLkludGVnZXI6XG4gICAgY2FzZSBQcmltaXRpdmVUeXBlLkRvdWJsZTpcbiAgICBjYXNlIFByaW1pdGl2ZVR5cGUuQm9vbGVhbjpcbiAgICBjYXNlIFByaW1pdGl2ZVR5cGUuVGltZXN0YW1wOlxuICAgIGNhc2UgUHJpbWl0aXZlVHlwZS5Kc29uOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19 - -/***/ }), - -/***/ 67263: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2ZuLWxpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZm4tbGludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZGRpdGlvbmFsIHJlc291cmNlIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gY2ZuLWxpbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZm5MaW50UmVzb3VyY2VBbm5vdGF0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgc3RhdGVmdWxcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlZnVsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCBhIERlbGV0ZSBvcGVyYXRpb24gcmVxdWlyZXMgdGhlIHJlc291cmNlIHRvIGJlIGVtcHR5XG4gICAqL1xuICByZWFkb25seSBtdXN0QmVFbXB0eVRvRGVsZXRlOiBib29sZWFuO1xufSJdfQ== - -/***/ }), - -/***/ 43621: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRvY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRG9jcyBmb3IgYSBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBvciBwcm9wZXJ0eSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGb3JtYXRpb25UeXBlRG9jcyB7XG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBmb3IgdGhpcyB0eXBlXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbnMgZm9yIGVhY2ggb2YgdGhlIHR5cGUncyBwcm9wZXJ0aWVzXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbnMgZm9yIGVhY2ggb2YgdGhlIHJlc291cmNlJ3MgYXR0cmlidXRlc1xuICAgKi9cbiAgcmVhZG9ubHkgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGb3JtYXRpb25Eb2NzRmlsZSB7XG4gIHJlYWRvbmx5IFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBDbG91ZEZvcm1hdGlvblR5cGVEb2NzPjtcbn0iXX0= - -/***/ }), - -/***/ 23841: +/***/ 45617: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; @@ -3171,317 +2761,46 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi if (k2 === undefined) k2 = k; o[k2] = m[k]; })); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -__exportStar(__nccwpck_require__(82294), exports); -__exportStar(__nccwpck_require__(13058), exports); -__exportStar(__nccwpck_require__(74890), exports); -__exportStar(__nccwpck_require__(96178), exports); -__exportStar(__nccwpck_require__(61733), exports); -__exportStar(__nccwpck_require__(67263), exports); -__exportStar(__nccwpck_require__(43621), exports); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQTZCO0FBQzdCLDZDQUEyQjtBQUMzQixrREFBZ0M7QUFDaEMsa0RBQWdDO0FBQ2hDLGlEQUErQjtBQUMvQiw2Q0FBMkI7QUFDM0IseUNBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9iYXNlLXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvcGVydHknO1xuZXhwb3J0ICogZnJvbSAnLi9yZXNvdXJjZS10eXBlJztcbmV4cG9ydCAqIGZyb20gJy4vc3BlY2lmaWNhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2F1Z21lbnRhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2Nmbi1saW50JztcbmV4cG9ydCAqIGZyb20gJy4vZG9jcyc7Il19 - -/***/ }), - -/***/ 13058: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isTagPropertyStringMap = exports.isTagPropertyJson = exports.isTagPropertyAutoScalingGroup = exports.isTagPropertyStandard = exports.isTagProperty = exports.isTagPropertyName = exports.isPropertyScrutinyType = exports.PropertyScrutinyType = exports.isUnionProperty = exports.isMapOfListsOfPrimitivesProperty = exports.isMapOfStructsProperty = exports.isPrimitiveMapProperty = exports.isMapProperty = exports.isComplexListProperty = exports.isPrimitiveListProperty = exports.isListProperty = exports.isCollectionProperty = exports.isComplexProperty = exports.isPrimitiveProperty = exports.isScalarProperty = exports.isUpdateType = exports.UpdateType = void 0; -const base_types_1 = __nccwpck_require__(82294); -var UpdateType; -(function (UpdateType) { - UpdateType["Conditional"] = "Conditional"; - UpdateType["Immutable"] = "Immutable"; - UpdateType["Mutable"] = "Mutable"; -})(UpdateType || (exports.UpdateType = UpdateType = {})); -function isUpdateType(str) { - switch (str) { - case UpdateType.Conditional: - case UpdateType.Immutable: - case UpdateType.Mutable: - return true; - default: - return false; - } -} -exports.isUpdateType = isUpdateType; -function isScalarProperty(prop) { - return isPrimitiveProperty(prop) - || isComplexProperty(prop) - // A UnionProperty is only Scalar if it defines Types or PrimitiveTypes - || (isUnionProperty(prop) && !!(prop.Types || prop.PrimitiveTypes)); -} -exports.isScalarProperty = isScalarProperty; -function isPrimitiveProperty(prop) { - return !!prop.PrimitiveType; -} -exports.isPrimitiveProperty = isPrimitiveProperty; -function isComplexProperty(prop) { - const propType = prop.Type; - return propType != null && propType !== 'Map' && propType !== 'List'; -} -exports.isComplexProperty = isComplexProperty; -function isCollectionProperty(prop) { - return isListProperty(prop) - || isMapProperty(prop) - // A UnionProperty is only Collection if it defines ItemTypes or PrimitiveItemTypes - || (isUnionProperty(prop) && !!(prop.ItemTypes || prop.PrimitiveItemTypes || prop.InclusiveItemTypes || prop.InclusivePrimitiveItemTypes)); -} -exports.isCollectionProperty = isCollectionProperty; -function isListProperty(prop) { - return prop.Type === 'List'; -} -exports.isListProperty = isListProperty; -function isPrimitiveListProperty(prop) { - return isListProperty(prop) && !!prop.PrimitiveItemType; -} -exports.isPrimitiveListProperty = isPrimitiveListProperty; -function isComplexListProperty(prop) { - return isListProperty(prop) && !!prop.ItemType; -} -exports.isComplexListProperty = isComplexListProperty; -function isMapProperty(prop) { - return prop.Type === 'Map'; -} -exports.isMapProperty = isMapProperty; -function isPrimitiveMapProperty(prop) { - return isMapProperty(prop) && !!prop.PrimitiveItemType; -} -exports.isPrimitiveMapProperty = isPrimitiveMapProperty; -function isMapOfStructsProperty(prop) { - return isMapProperty(prop) && - !isPrimitiveMapProperty(prop) && - !isMapOfListsOfPrimitivesProperty(prop); -} -exports.isMapOfStructsProperty = isMapOfStructsProperty; -// note: this (and the MapOfListsOfPrimitives type) are not actually valid in the CFN spec! -// they are only here to support our patch of the CFN spec -// to alleviate https://github.com/aws/aws-cdk/issues/3092 -function isMapOfListsOfPrimitivesProperty(prop) { - return isMapProperty(prop) && prop.ItemType === 'List'; -} -exports.isMapOfListsOfPrimitivesProperty = isMapOfListsOfPrimitivesProperty; -function isUnionProperty(prop) { - const castProp = prop; - return !!(castProp.ItemTypes || - castProp.PrimitiveTypes || - castProp.Types || - castProp.PrimitiveItemTypes || - castProp.InclusiveItemTypes || - castProp.InclusivePrimitiveItemTypes); -} -exports.isUnionProperty = isUnionProperty; -var PropertyScrutinyType; -(function (PropertyScrutinyType) { - /** - * No additional scrutiny - */ - PropertyScrutinyType["None"] = "None"; - /** - * This is an IAM policy directly on a resource - */ - PropertyScrutinyType["InlineResourcePolicy"] = "InlineResourcePolicy"; - /** - * Either an AssumeRolePolicyDocument or a dictionary of policy documents - */ - PropertyScrutinyType["InlineIdentityPolicies"] = "InlineIdentityPolicies"; - /** - * A list of managed policies (on an identity resource) - */ - PropertyScrutinyType["ManagedPolicies"] = "ManagedPolicies"; - /** - * A set of ingress rules (on a security group) - */ - PropertyScrutinyType["IngressRules"] = "IngressRules"; - /** - * A set of egress rules (on a security group) - */ - PropertyScrutinyType["EgressRules"] = "EgressRules"; -})(PropertyScrutinyType || (exports.PropertyScrutinyType = PropertyScrutinyType = {})); -function isPropertyScrutinyType(str) { - return PropertyScrutinyType[str] !== undefined; -} -exports.isPropertyScrutinyType = isPropertyScrutinyType; -const tagPropertyNames = { - FileSystemTags: '', - HostedZoneTags: '', - Tags: '', - UserPoolTags: '', - AccessPointTags: '', -}; -function isTagPropertyName(name) { - if (undefined === name) { - return false; - } - return tagPropertyNames.hasOwnProperty(name); -} -exports.isTagPropertyName = isTagPropertyName; -/** - * This function validates that the property **can** be a Tag Property - * - * The property is only a Tag if the name of this property is Tags, which is - * validated using `ResourceType.isTaggable(resource)`. - */ -function isTagProperty(prop) { - return (isTagPropertyStandard(prop) || - isTagPropertyAutoScalingGroup(prop) || - isTagPropertyJson(prop) || - isTagPropertyStringMap(prop)); -} -exports.isTagProperty = isTagProperty; -function isTagPropertyStandard(prop) { - return (prop.ItemType === 'Tag' || - prop.ItemType === 'TagsEntry' || - prop.Type === 'Tags' || - prop.ItemType === 'TagRef' || - prop.ItemType === 'ElasticFileSystemTag' || - prop.ItemType === 'HostedZoneTag' || - prop.ItemType === 'AccessPointTag'); -} -exports.isTagPropertyStandard = isTagPropertyStandard; -function isTagPropertyAutoScalingGroup(prop) { - return prop.ItemType === 'TagProperty'; -} -exports.isTagPropertyAutoScalingGroup = isTagPropertyAutoScalingGroup; -function isTagPropertyJson(prop) { - return prop.PrimitiveType === base_types_1.PrimitiveType.Json; -} -exports.isTagPropertyJson = isTagPropertyJson; -function isTagPropertyStringMap(prop) { - return prop.PrimitiveItemType === 'String'; -} -exports.isTagPropertyStringMap = isTagPropertyStringMap; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcm9wZXJ0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBeUQ7QUFvSXpELElBQVksVUFJWDtBQUpELFdBQVksVUFBVTtJQUNwQix5Q0FBMkIsQ0FBQTtJQUMzQixxQ0FBdUIsQ0FBQTtJQUN2QixpQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBSlcsVUFBVSwwQkFBVixVQUFVLFFBSXJCO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLEdBQVc7SUFDdEMsUUFBUSxHQUFHLEVBQUU7UUFDWCxLQUFLLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDNUIsS0FBSyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQzFCLEtBQUssVUFBVSxDQUFDLE9BQU87WUFDckIsT0FBTyxJQUFJLENBQUM7UUFDZDtZQUNFLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0FBQ0gsQ0FBQztBQVRELG9DQVNDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsSUFBYztJQUM3QyxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQztXQUMzQixpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDMUIsdUVBQXVFO1dBQ3BFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUxELDRDQUtDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUMsSUFBYztJQUNoRCxPQUFPLENBQUMsQ0FBRSxJQUEwQixDQUFDLGFBQWEsQ0FBQztBQUNyRCxDQUFDO0FBRkQsa0RBRUM7QUFFRCxTQUFnQixpQkFBaUIsQ0FBQyxJQUFjO0lBQzlDLE1BQU0sUUFBUSxHQUFJLElBQXdCLENBQUMsSUFBSSxDQUFDO0lBQ2hELE9BQU8sUUFBUSxJQUFJLElBQUksSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFJLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFDdkUsQ0FBQztBQUhELDhDQUdDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsSUFBYztJQUNqRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUM7V0FDdEIsYUFBYSxDQUFDLElBQUksQ0FBQztRQUN0QixtRkFBbUY7V0FDaEYsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUM7QUFDL0ksQ0FBQztBQUxELG9EQUtDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLElBQWM7SUFDM0MsT0FBUSxJQUFxQixDQUFDLElBQUksS0FBSyxNQUFNLENBQUM7QUFDaEQsQ0FBQztBQUZELHdDQUVDO0FBRUQsU0FBZ0IsdUJBQXVCLENBQUMsSUFBYztJQUNwRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUUsSUFBOEIsQ0FBQyxpQkFBaUIsQ0FBQztBQUNyRixDQUFDO0FBRkQsMERBRUM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxJQUFjO0lBQ2xELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBRSxJQUE0QixDQUFDLFFBQVEsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUM7QUFFRCxTQUFnQixhQUFhLENBQUMsSUFBYztJQUMxQyxPQUFRLElBQW9CLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztBQUM5QyxDQUFDO0FBRkQsc0NBRUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FBQyxJQUFjO0lBQ25ELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBRSxJQUE2QixDQUFDLGlCQUFpQixDQUFDO0FBQ25GLENBQUM7QUFGRCx3REFFQztBQUVELFNBQWdCLHNCQUFzQixDQUFDLElBQWM7SUFDbkQsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ3hCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDO1FBQzdCLENBQUMsZ0NBQWdDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUpELHdEQUlDO0FBRUQsMkZBQTJGO0FBQzNGLDBEQUEwRDtBQUMxRCwwREFBMEQ7QUFDMUQsU0FBZ0IsZ0NBQWdDLENBQUMsSUFBYztJQUM3RCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSyxJQUEyQixDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFDakYsQ0FBQztBQUZELDRFQUVDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLElBQWM7SUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBcUIsQ0FBQztJQUN2QyxPQUFPLENBQUMsQ0FBQyxDQUNQLFFBQVEsQ0FBQyxTQUFTO1FBQ2xCLFFBQVEsQ0FBQyxjQUFjO1FBQ3ZCLFFBQVEsQ0FBQyxLQUFLO1FBQ2QsUUFBUSxDQUFDLGtCQUFrQjtRQUMzQixRQUFRLENBQUMsa0JBQWtCO1FBQzNCLFFBQVEsQ0FBQywyQkFBMkIsQ0FDckMsQ0FBQztBQUNKLENBQUM7QUFWRCwwQ0FVQztBQUVELElBQVksb0JBOEJYO0FBOUJELFdBQVksb0JBQW9CO0lBQzlCOztPQUVHO0lBQ0gscUNBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gscUVBQTZDLENBQUE7SUFFN0M7O09BRUc7SUFDSCx5RUFBaUQsQ0FBQTtJQUVqRDs7T0FFRztJQUNILDJEQUFtQyxDQUFBO0lBRW5DOztPQUVHO0lBQ0gscURBQTZCLENBQUE7SUFFN0I7O09BRUc7SUFDSCxtREFBMkIsQ0FBQTtBQUM3QixDQUFDLEVBOUJXLG9CQUFvQixvQ0FBcEIsb0JBQW9CLFFBOEIvQjtBQUVELFNBQWdCLHNCQUFzQixDQUFDLEdBQVc7SUFDaEQsT0FBUSxvQkFBNEIsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDMUQsQ0FBQztBQUZELHdEQUVDO0FBRUQsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QixjQUFjLEVBQUUsRUFBRTtJQUNsQixjQUFjLEVBQUUsRUFBRTtJQUNsQixJQUFJLEVBQUUsRUFBRTtJQUNSLFlBQVksRUFBRSxFQUFFO0lBQ2hCLGVBQWUsRUFBRSxFQUFFO0NBQ3BCLENBQUM7QUFJRixTQUFnQixpQkFBaUIsQ0FBQyxJQUFhO0lBQzdDLElBQUksU0FBUyxLQUFLLElBQUksRUFBRTtRQUN0QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUxELDhDQUtDO0FBQ0Q7Ozs7O0dBS0c7QUFDSCxTQUFnQixhQUFhLENBQUMsSUFBYztJQUMxQyxPQUFPLENBQ0wscUJBQXFCLENBQUMsSUFBSSxDQUFDO1FBQzNCLDZCQUE2QixDQUFDLElBQUksQ0FBQztRQUNuQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDdkIsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQzdCLENBQUM7QUFDSixDQUFDO0FBUEQsc0NBT0M7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxJQUFjO0lBQ2xELE9BQU8sQ0FDSixJQUE0QixDQUFDLFFBQVEsS0FBSyxLQUFLO1FBQy9DLElBQTRCLENBQUMsUUFBUSxLQUFLLFdBQVc7UUFDckQsSUFBNEIsQ0FBQyxJQUFJLEtBQUssTUFBTTtRQUM1QyxJQUE0QixDQUFDLFFBQVEsS0FBSyxRQUFRO1FBQ2xELElBQTRCLENBQUMsUUFBUSxLQUFLLHNCQUFzQjtRQUNoRSxJQUE0QixDQUFDLFFBQVEsS0FBSyxlQUFlO1FBQ3pELElBQTRCLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUM1RCxDQUFDO0FBRUosQ0FBQztBQVhELHNEQVdDO0FBRUQsU0FBZ0IsNkJBQTZCLENBQUMsSUFBYztJQUMxRCxPQUFRLElBQW9DLENBQUMsUUFBUSxLQUFLLGFBQWEsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0VBRUM7QUFFRCxTQUFnQixpQkFBaUIsQ0FBQyxJQUFjO0lBQzlDLE9BQVEsSUFBd0IsQ0FBQyxhQUFhLEtBQUssMEJBQWEsQ0FBQyxJQUFJLENBQUM7QUFDeEUsQ0FBQztBQUZELDhDQUVDO0FBRUQsU0FBZ0Isc0JBQXNCLENBQUMsSUFBYztJQUNuRCxPQUFRLElBQTZCLENBQUMsaUJBQWlCLEtBQUssUUFBUSxDQUFDO0FBQ3ZFLENBQUM7QUFGRCx3REFFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERvY3VtZW50ZWQsIFByaW1pdGl2ZVR5cGUgfSBmcm9tICcuL2Jhc2UtdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eSA9IFNjYWxhclByb3BlcnR5IHwgQ29sbGVjdGlvblByb3BlcnR5O1xuZXhwb3J0IHR5cGUgU2NhbGFyUHJvcGVydHkgPSBQcmltaXRpdmVQcm9wZXJ0eSB8IENvbXBsZXhQcm9wZXJ0eSB8IFVuaW9uUHJvcGVydHk7XG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUHJvcGVydHkgPSBMaXN0UHJvcGVydHkgfCBNYXBQcm9wZXJ0eSB8IFVuaW9uUHJvcGVydHk7XG5leHBvcnQgdHlwZSBMaXN0UHJvcGVydHkgPSBQcmltaXRpdmVMaXN0UHJvcGVydHkgfCBDb21wbGV4TGlzdFByb3BlcnR5O1xuZXhwb3J0IHR5cGUgTWFwUHJvcGVydHkgPSBQcmltaXRpdmVNYXBQcm9wZXJ0eSB8IENvbXBsZXhNYXBQcm9wZXJ0eTtcbmV4cG9ydCB0eXBlIENvbXBsZXhNYXBQcm9wZXJ0eSA9IE1hcE9mU3RydWN0cyB8IE1hcE9mTGlzdHNPZlByaW1pdGl2ZXM7XG5leHBvcnQgdHlwZSBUYWdQcm9wZXJ0eSA9IFRhZ1Byb3BlcnR5U3RhbmRhcmQgfCBUYWdQcm9wZXJ0eUF1dG9TY2FsaW5nR3JvdXAgfCBUYWdQcm9wZXJ0eUpzb24gfCBUYWdQcm9wZXJ0eVN0cmluZ01hcDtcblxuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eUJhc2UgZXh0ZW5kcyBEb2N1bWVudGVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIFJlcXVpcmVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIER1cmluZyBhIHN0YWNrIHVwZGF0ZSwgdGhlIHVwZGF0ZSBiZWhhdmlvciB3aGVuIHlvdSBhZGQsIHJlbW92ZSwgb3IgbW9kaWZ5IHRoZSBwcm9wZXJ0eS4gQVdTIENsb3VkRm9ybWF0aW9uXG4gICAqIHJlcGxhY2VzIHRoZSByZXNvdXJjZSB3aGVuIHlvdSBjaGFuZ2UgYMOMbW11dGFibGVgYHByb3BlcnRpZXMuIEFXUyBDbG91ZEZvcm1hdGlvbiBkb2Vzbid0IHJlcGxhY2UgdGhlIHJlc291cmNlXG4gICAqIHdoZW4geW91IGNoYW5nZSBgYE11dGFibGVgYCBwcm9wZXJ0aWVzLiBgYENvbmRpdGlvbmFsYGAgdXBkYXRlcyBjYW4gYmUgbXV0YWJsZSBvciBpbW11dGFibGUsIGRlcGVuZGluZyBvbiwgZm9yXG4gICAqIGV4YW1wbGUsIHdoaWNoIG90aGVyIHByb3BlcnRpZXMgeW91IHVwZGF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFVwZGF0ZVR5cGUuTXV0YWJsZVxuICAgKi9cbiAgVXBkYXRlVHlwZT86IFVwZGF0ZVR5cGU7XG5cbiAgLyoqXG4gICAqIER1cmluZyBhIHN0YWNrIHVwZGF0ZSwgd2hhdCBraW5kIG9mIGFkZGl0aW9uYWwgc2NydXRpbnkgY2hhbmdlcyB0byB0aGlzIHByb3BlcnR5IHNob3VsZCBiZSBzdWJqZWN0ZWQgdG9cbiAgICpcbiAgICogQGRlZmF1bHQgTm9uZVxuICAgKi9cbiAgU2NydXRpbnlUeXBlPzogUHJvcGVydHlTY3J1dGlueVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpbWl0aXZlUHJvcGVydHkgZXh0ZW5kcyBQcm9wZXJ0eUJhc2Uge1xuICAvKiogVGhlIHZhbGlkIHByaW1pdGl2ZSB0eXBlIGZvciB0aGUgcHJvcGVydHkuICovXG4gIFByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxleFByb3BlcnR5IGV4dGVuZHMgUHJvcGVydHlCYXNlIHtcbiAgLyoqIFRoZSB0eXBlIG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSAqL1xuICBUeXBlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFByb3BlcnR5QmFzZSBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIC8qKlxuICAgKiBBIGxpc3QgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2YWx1ZXMuXG4gICAqL1xuICBUeXBlOiAnTGlzdCc7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBBV1MgQ2xvdWRGb3JtYXRpb24gYWxsb3dzIGR1cGxpY2F0ZSB2YWx1ZXMuIElmIHRoZSB2YWx1ZSBpcyBgYHRydWVgYCwgQVdTIENsb3VkRm9ybWF0aW9uXG4gICAqIGlnbm9yZXMgZHVwbGljYXRlIHZhbHVlcy4gaWYgdGhlIHZhbHVlIGlzICBgYGZhbHNlYGAsIEFXUyBDbG91ZEZvcm1hdGlvbiByZXR1cm5zIGFuIGFycm9yIGlmIHlvdSBzdWJtaXQgZHVwbGljYXRlXG4gICAqIHZhbHVlcy5cbiAgICovXG4gIER1cGxpY2F0ZXNBbGxvd2VkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmltaXRpdmVMaXN0UHJvcGVydHkgZXh0ZW5kcyBMaXN0UHJvcGVydHlCYXNlIHtcbiAgLyoqIFRoZSB2YWxpZCBwcmltaXRpdmUgdHlwZSBmb3IgdGhlIHByb3BlcnR5LiAqL1xuICBQcmltaXRpdmVJdGVtVHlwZTogUHJpbWl0aXZlVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV4TGlzdFByb3BlcnR5IGV4dGVuZHMgTGlzdFByb3BlcnR5QmFzZSB7XG4gIC8qKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0eSAqL1xuICBJdGVtVHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcFByb3BlcnR5QmFzZSBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIC8qKiBBIG1hcCBpcyBhIHNldCBvZiBrZXktdmFsdWUgcGFpcnMsIHdoZXJlIHRoZSBrZXlzIGFyZSBhbHdheXMgc3RyaW5ncy4gKi9cbiAgVHlwZTogJ01hcCc7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBBV1MgQ2xvdWRGb3JtYXRpb24gYWxsb3dzIGR1cGxpY2F0ZSB2YWx1ZXMuIElmIHRoZSB2YWx1ZSBpcyBgYHRydWVgYCwgQVdTIENsb3VkRm9ybWF0aW9uXG4gICAqIGlnbm9yZXMgZHVwbGljYXRlIHZhbHVlcy4gaWYgdGhlIHZhbHVlIGlzICBgYGZhbHNlYGAsIEFXUyBDbG91ZEZvcm1hdGlvbiByZXR1cm5zIGFuIGFycm9yIGlmIHlvdSBzdWJtaXQgZHVwbGljYXRlXG4gICAqIHZhbHVlcy5cbiAgICovXG4gIER1cGxpY2F0ZXNBbGxvd2VkPzogZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpbWl0aXZlTWFwUHJvcGVydHkgZXh0ZW5kcyBNYXBQcm9wZXJ0eUJhc2Uge1xuICAvKiogVGhlIHZhbGlkIHByaW1pdGl2ZSB0eXBlIGZvciB0aGUgcHJvcGVydHkuICovXG4gIFByaW1pdGl2ZUl0ZW1UeXBlOiBQcmltaXRpdmVUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcE9mU3RydWN0cyBleHRlbmRzIE1hcFByb3BlcnR5QmFzZSB7XG4gIC8qKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0eSAqL1xuICBJdGVtVHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcE9mTGlzdHNPZlByaW1pdGl2ZXMgZXh0ZW5kcyBNYXBQcm9wZXJ0eUJhc2Uge1xuICAvKiogVGhlIHR5cGUgb2YgdGhlIG1hcCB2YWx1ZXMsIHdoaWNoIGluIHRoaXMgY2FzZSBpcyBhbHdheXMgJ0xpc3QnLiAqL1xuICBJdGVtVHlwZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdmFsaWQgcHJpbWl0aXZlIHR5cGUgZm9yIHRoZSBsaXN0cyB0aGF0IGFyZSB0aGUgdmFsdWVzIG9mIHRoaXMgbWFwLiAqL1xuICBQcmltaXRpdmVJdGVtSXRlbVR5cGU6IFByaW1pdGl2ZVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFnUHJvcGVydHlTdGFuZGFyZCBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIEl0ZW1UeXBlOiAnVGFnJyB8ICdUYWdzRW50cnknIHwgJ1RhZ1JlZicgfCAnRWxhc3RpY0ZpbGVTeXN0ZW1UYWcnIHwgJ0hvc3RlZFpvbmVUYWcnIHwgJ0FjY2Vzc1BvaW50VGFnJztcbiAgVHlwZTogJ1RhZ3MnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ1Byb3BlcnR5QXV0b1NjYWxpbmdHcm91cCBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIEl0ZW1UeXBlOiAnVGFnUHJvcGVydHknO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ1Byb3BlcnR5SnNvbiBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIFByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGUuSnNvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYWdQcm9wZXJ0eVN0cmluZ01hcCBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIFByaW1pdGl2ZUl0ZW1UeXBlOiAnU3RyaW5nJztcbn1cblxuLyoqXG4gKiBBIHByb3BlcnR5IHR5cGUgdGhhdCBjYW4gYmUgb25lIG9mIHNldmVyYWwgdHlwZXMuIEN1cnJlbnRseSB1c2VkIG9ubHkgaW4gU0FNLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaW9uUHJvcGVydHkgZXh0ZW5kcyBQcm9wZXJ0eUJhc2Uge1xuICAvKiogVmFsaWQgcHJpbWl0aXZlIHR5cGVzIGZvciB0aGUgcHJvcGVydHkgKi9cbiAgUHJpbWl0aXZlVHlwZXM/OiBQcmltaXRpdmVUeXBlW107XG4gIC8qKiBWYWxpZCBjb21wbGV4IHR5cGVzIGZvciB0aGUgcHJvcGVydHkgKi9cbiAgVHlwZXM/OiBzdHJpbmdbXVxuICAvKiogVmFsaWQgcHJpbWl0aXZlIGl0ZW0gdHlwZXMgZm9yIHRoaXMgcHJvcGVydHkgKi9cbiAgUHJpbWl0aXZlSXRlbVR5cGVzPzogUHJpbWl0aXZlVHlwZVtdO1xuICAvKiogVmFsaWQgbGlzdCBpdGVtIHR5cGVzIGZvciB0aGUgcHJvcGVydHkgKi9cbiAgSXRlbVR5cGVzPzogc3RyaW5nW107XG4gIC8qKiBWYWxpZCBjb21wbGV4IHR5cGVzIGZvciB0aGlzIHByb3BlcnR5ICovXG4gIEluY2x1c2l2ZUl0ZW1UeXBlcz86IHN0cmluZ1tdO1xuICAvKiogVmFsaWQgcHJpbWl0aXZlIGl0ZW0gdHlwZXMgZm9yIHRoaXMgcHJvcGVydHkgKi9cbiAgSW5jbHVzaXZlUHJpbWl0aXZlSXRlbVR5cGVzPzogUHJpbWl0aXZlVHlwZVtdO1xufVxuXG5leHBvcnQgZW51bSBVcGRhdGVUeXBlIHtcbiAgQ29uZGl0aW9uYWwgPSAnQ29uZGl0aW9uYWwnLFxuICBJbW11dGFibGUgPSAnSW1tdXRhYmxlJyxcbiAgTXV0YWJsZSA9ICdNdXRhYmxlJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVcGRhdGVUeXBlKHN0cjogc3RyaW5nKTogc3RyIGlzIFVwZGF0ZVR5cGUge1xuICBzd2l0Y2ggKHN0cikge1xuICAgIGNhc2UgVXBkYXRlVHlwZS5Db25kaXRpb25hbDpcbiAgICBjYXNlIFVwZGF0ZVR5cGUuSW1tdXRhYmxlOlxuICAgIGNhc2UgVXBkYXRlVHlwZS5NdXRhYmxlOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY2FsYXJQcm9wZXJ0eShwcm9wOiBQcm9wZXJ0eSk6IHByb3AgaXMgU2NhbGFyUHJvcGVydHkge1xuICByZXR1cm4gaXNQcmltaXRpdmVQcm9wZXJ0eShwcm9wKVxuICAgIHx8IGlzQ29tcGxleFByb3BlcnR5KHByb3ApXG4gICAgLy8gQSBVbmlvblByb3BlcnR5IGlzIG9ubHkgU2NhbGFyIGlmIGl0IGRlZmluZXMgVHlwZXMgb3IgUHJpbWl0aXZlVHlwZXNcbiAgICB8fCAoaXNVbmlvblByb3BlcnR5KHByb3ApICYmICEhKHByb3AuVHlwZXMgfHwgcHJvcC5QcmltaXRpdmVUeXBlcykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmVQcm9wZXJ0eShwcm9wOiBQcm9wZXJ0eSk6IHByb3AgaXMgUHJpbWl0aXZlUHJvcGVydHkge1xuICByZXR1cm4gISEocHJvcCBhcyBQcmltaXRpdmVQcm9wZXJ0eSkuUHJpbWl0aXZlVHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGxleFByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBDb21wbGV4UHJvcGVydHkge1xuICBjb25zdCBwcm9wVHlwZSA9IChwcm9wIGFzIENvbXBsZXhQcm9wZXJ0eSkuVHlwZTtcbiAgcmV0dXJuIHByb3BUeXBlICE9IG51bGwgJiYgcHJvcFR5cGUgIT09ICdNYXAnICYmIHByb3BUeXBlICE9PSAnTGlzdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbGxlY3Rpb25Qcm9wZXJ0eShwcm9wOiBQcm9wZXJ0eSk6IHByb3AgaXMgQ29sbGVjdGlvblByb3BlcnR5IHtcbiAgcmV0dXJuIGlzTGlzdFByb3BlcnR5KHByb3ApXG4gICAgfHwgaXNNYXBQcm9wZXJ0eShwcm9wKVxuICAgIC8vIEEgVW5pb25Qcm9wZXJ0eSBpcyBvbmx5IENvbGxlY3Rpb24gaWYgaXQgZGVmaW5lcyBJdGVtVHlwZXMgb3IgUHJpbWl0aXZlSXRlbVR5cGVzXG4gICAgfHwgKGlzVW5pb25Qcm9wZXJ0eShwcm9wKSAmJiAhIShwcm9wLkl0ZW1UeXBlcyB8fCBwcm9wLlByaW1pdGl2ZUl0ZW1UeXBlcyB8fCBwcm9wLkluY2x1c2l2ZUl0ZW1UeXBlcyB8fCBwcm9wLkluY2x1c2l2ZVByaW1pdGl2ZUl0ZW1UeXBlcykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMaXN0UHJvcGVydHkocHJvcDogUHJvcGVydHkpOiBwcm9wIGlzIExpc3RQcm9wZXJ0eSB7XG4gIHJldHVybiAocHJvcCBhcyBMaXN0UHJvcGVydHkpLlR5cGUgPT09ICdMaXN0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlTGlzdFByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBQcmltaXRpdmVMaXN0UHJvcGVydHkge1xuICByZXR1cm4gaXNMaXN0UHJvcGVydHkocHJvcCkgJiYgISEocHJvcCBhcyBQcmltaXRpdmVMaXN0UHJvcGVydHkpLlByaW1pdGl2ZUl0ZW1UeXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wbGV4TGlzdFByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBDb21wbGV4TGlzdFByb3BlcnR5IHtcbiAgcmV0dXJuIGlzTGlzdFByb3BlcnR5KHByb3ApICYmICEhKHByb3AgYXMgQ29tcGxleExpc3RQcm9wZXJ0eSkuSXRlbVR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hcFByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBNYXBQcm9wZXJ0eSB7XG4gIHJldHVybiAocHJvcCBhcyBNYXBQcm9wZXJ0eSkuVHlwZSA9PT0gJ01hcCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZU1hcFByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBQcmltaXRpdmVNYXBQcm9wZXJ0eSB7XG4gIHJldHVybiBpc01hcFByb3BlcnR5KHByb3ApICYmICEhKHByb3AgYXMgUHJpbWl0aXZlTWFwUHJvcGVydHkpLlByaW1pdGl2ZUl0ZW1UeXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNYXBPZlN0cnVjdHNQcm9wZXJ0eShwcm9wOiBQcm9wZXJ0eSk6IHByb3AgaXMgTWFwT2ZTdHJ1Y3RzIHtcbiAgcmV0dXJuIGlzTWFwUHJvcGVydHkocHJvcCkgJiZcbiAgICAhaXNQcmltaXRpdmVNYXBQcm9wZXJ0eShwcm9wKSAmJlxuICAgICFpc01hcE9mTGlzdHNPZlByaW1pdGl2ZXNQcm9wZXJ0eShwcm9wKTtcbn1cblxuLy8gbm90ZTogdGhpcyAoYW5kIHRoZSBNYXBPZkxpc3RzT2ZQcmltaXRpdmVzIHR5cGUpIGFyZSBub3QgYWN0dWFsbHkgdmFsaWQgaW4gdGhlIENGTiBzcGVjIVxuLy8gdGhleSBhcmUgb25seSBoZXJlIHRvIHN1cHBvcnQgb3VyIHBhdGNoIG9mIHRoZSBDRk4gc3BlY1xuLy8gdG8gYWxsZXZpYXRlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMzA5MlxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFwT2ZMaXN0c09mUHJpbWl0aXZlc1Byb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBNYXBPZkxpc3RzT2ZQcmltaXRpdmVzIHtcbiAgcmV0dXJuIGlzTWFwUHJvcGVydHkocHJvcCkgJiYgKHByb3AgYXMgQ29tcGxleE1hcFByb3BlcnR5KS5JdGVtVHlwZSA9PT0gJ0xpc3QnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmlvblByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBVbmlvblByb3BlcnR5IHtcbiAgY29uc3QgY2FzdFByb3AgPSBwcm9wIGFzIFVuaW9uUHJvcGVydHk7XG4gIHJldHVybiAhIShcbiAgICBjYXN0UHJvcC5JdGVtVHlwZXMgfHxcbiAgICBjYXN0UHJvcC5QcmltaXRpdmVUeXBlcyB8fFxuICAgIGNhc3RQcm9wLlR5cGVzIHx8XG4gICAgY2FzdFByb3AuUHJpbWl0aXZlSXRlbVR5cGVzIHx8XG4gICAgY2FzdFByb3AuSW5jbHVzaXZlSXRlbVR5cGVzIHx8XG4gICAgY2FzdFByb3AuSW5jbHVzaXZlUHJpbWl0aXZlSXRlbVR5cGVzXG4gICk7XG59XG5cbmV4cG9ydCBlbnVtIFByb3BlcnR5U2NydXRpbnlUeXBlIHtcbiAgLyoqXG4gICAqIE5vIGFkZGl0aW9uYWwgc2NydXRpbnlcbiAgICovXG4gIE5vbmUgPSAnTm9uZScsXG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYW4gSUFNIHBvbGljeSBkaXJlY3RseSBvbiBhIHJlc291cmNlXG4gICAqL1xuICBJbmxpbmVSZXNvdXJjZVBvbGljeSA9ICdJbmxpbmVSZXNvdXJjZVBvbGljeScsXG5cbiAgLyoqXG4gICAqIEVpdGhlciBhbiBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQgb3IgYSBkaWN0aW9uYXJ5IG9mIHBvbGljeSBkb2N1bWVudHNcbiAgICovXG4gIElubGluZUlkZW50aXR5UG9saWNpZXMgPSAnSW5saW5lSWRlbnRpdHlQb2xpY2llcycsXG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBtYW5hZ2VkIHBvbGljaWVzIChvbiBhbiBpZGVudGl0eSByZXNvdXJjZSlcbiAgICovXG4gIE1hbmFnZWRQb2xpY2llcyA9ICdNYW5hZ2VkUG9saWNpZXMnLFxuXG4gIC8qKlxuICAgKiBBIHNldCBvZiBpbmdyZXNzIHJ1bGVzIChvbiBhIHNlY3VyaXR5IGdyb3VwKVxuICAgKi9cbiAgSW5ncmVzc1J1bGVzID0gJ0luZ3Jlc3NSdWxlcycsXG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIGVncmVzcyBydWxlcyAob24gYSBzZWN1cml0eSBncm91cClcbiAgICovXG4gIEVncmVzc1J1bGVzID0gJ0VncmVzc1J1bGVzJyxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvcGVydHlTY3J1dGlueVR5cGUoc3RyOiBzdHJpbmcpOiBzdHIgaXMgUHJvcGVydHlTY3J1dGlueVR5cGUge1xuICByZXR1cm4gKFByb3BlcnR5U2NydXRpbnlUeXBlIGFzIGFueSlbc3RyXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5jb25zdCB0YWdQcm9wZXJ0eU5hbWVzID0ge1xuICBGaWxlU3lzdGVtVGFnczogJycsXG4gIEhvc3RlZFpvbmVUYWdzOiAnJyxcbiAgVGFnczogJycsXG4gIFVzZXJQb29sVGFnczogJycsXG4gIEFjY2Vzc1BvaW50VGFnczogJycsXG59O1xuXG5leHBvcnQgdHlwZSBUYWdQcm9wZXJ0eU5hbWUgPSBrZXlvZiB0eXBlb2YgdGFnUHJvcGVydHlOYW1lcztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFnUHJvcGVydHlOYW1lKG5hbWU/OiBzdHJpbmcpOiBuYW1lIGlzIFRhZ1Byb3BlcnR5TmFtZSB7XG4gIGlmICh1bmRlZmluZWQgPT09IG5hbWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRhZ1Byb3BlcnR5TmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSk7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIHRoYXQgdGhlIHByb3BlcnR5ICoqY2FuKiogYmUgYSBUYWcgUHJvcGVydHlcbiAqXG4gKiBUaGUgcHJvcGVydHkgaXMgb25seSBhIFRhZyBpZiB0aGUgbmFtZSBvZiB0aGlzIHByb3BlcnR5IGlzIFRhZ3MsIHdoaWNoIGlzXG4gKiB2YWxpZGF0ZWQgdXNpbmcgYFJlc291cmNlVHlwZS5pc1RhZ2dhYmxlKHJlc291cmNlKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RhZ1Byb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBUYWdQcm9wZXJ0eSB7XG4gIHJldHVybiAoXG4gICAgaXNUYWdQcm9wZXJ0eVN0YW5kYXJkKHByb3ApIHx8XG4gICAgaXNUYWdQcm9wZXJ0eUF1dG9TY2FsaW5nR3JvdXAocHJvcCkgfHxcbiAgICBpc1RhZ1Byb3BlcnR5SnNvbihwcm9wKSB8fFxuICAgIGlzVGFnUHJvcGVydHlTdHJpbmdNYXAocHJvcClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFnUHJvcGVydHlTdGFuZGFyZChwcm9wOiBQcm9wZXJ0eSk6IHByb3AgaXMgVGFnUHJvcGVydHlTdGFuZGFyZCB7XG4gIHJldHVybiAoXG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuSXRlbVR5cGUgPT09ICdUYWcnIHx8XG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuSXRlbVR5cGUgPT09ICdUYWdzRW50cnknIHx8XG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuVHlwZSA9PT0gJ1RhZ3MnIHx8XG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuSXRlbVR5cGUgPT09ICdUYWdSZWYnIHx8XG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuSXRlbVR5cGUgPT09ICdFbGFzdGljRmlsZVN5c3RlbVRhZycgfHxcbiAgICAocHJvcCBhcyBUYWdQcm9wZXJ0eVN0YW5kYXJkKS5JdGVtVHlwZSA9PT0gJ0hvc3RlZFpvbmVUYWcnIHx8XG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuSXRlbVR5cGUgPT09ICdBY2Nlc3NQb2ludFRhZydcbiAgKTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUYWdQcm9wZXJ0eUF1dG9TY2FsaW5nR3JvdXAocHJvcDogUHJvcGVydHkpOiBwcm9wIGlzIFRhZ1Byb3BlcnR5QXV0b1NjYWxpbmdHcm91cCB7XG4gIHJldHVybiAocHJvcCBhcyBUYWdQcm9wZXJ0eUF1dG9TY2FsaW5nR3JvdXApLkl0ZW1UeXBlID09PSAnVGFnUHJvcGVydHknO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUYWdQcm9wZXJ0eUpzb24ocHJvcDogUHJvcGVydHkpOiBwcm9wIGlzIFRhZ1Byb3BlcnR5SnNvbiB7XG4gIHJldHVybiAocHJvcCBhcyBUYWdQcm9wZXJ0eUpzb24pLlByaW1pdGl2ZVR5cGUgPT09IFByaW1pdGl2ZVR5cGUuSnNvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFnUHJvcGVydHlTdHJpbmdNYXAocHJvcDogUHJvcGVydHkpOiBwcm9wIGlzIFRhZ1Byb3BlcnR5U3RyaW5nTWFwIHtcbiAgcmV0dXJuIChwcm9wIGFzIFRhZ1Byb3BlcnR5U3RyaW5nTWFwKS5QcmltaXRpdmVJdGVtVHlwZSA9PT0gJ1N0cmluZyc7XG59XG4iXX0= - -/***/ }), - -/***/ 74890: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isResourceScrutinyType = exports.ResourceScrutinyType = exports.SpecialRefKind = exports.isPrimitiveMapAttribute = exports.isComplexListAttribute = exports.isPrimitiveListAttribute = exports.isMapAttribute = exports.isListAttribute = exports.isPrimitiveAttribute = exports.isTaggableResource = void 0; -const property_1 = __nccwpck_require__(13058); +exports.loadAwsServiceSpecSync = exports.loadAwsServiceSpec = void 0; +const node_fs_1 = __nccwpck_require__(87561); +const path = __importStar(__nccwpck_require__(49411)); +const node_zlib_1 = __nccwpck_require__(65628); +const service_spec_types_1 = __nccwpck_require__(504); +const DB_COMPRESSED = 'db.json.gz'; +const DB_PATH = path.join(__dirname, '..', DB_COMPRESSED); /** - * Determine if the resource supports tags - * - * This function combined with isTagProperty determines if the `cdk.TagManager` - * and `cdk.TaggableResource` can process these tags. If not, standard code - * generation of properties will be used. + * Load the provided built-in database */ -function isTaggableResource(spec) { - if (spec.Properties === undefined) { - return false; - } - for (const key of Object.keys(spec.Properties)) { - if ((0, property_1.isTagPropertyName)(key) && (0, property_1.isTagProperty)(spec.Properties[key])) { - return true; - } - } - return false; -} -exports.isTaggableResource = isTaggableResource; -function isPrimitiveAttribute(spec) { - return !!spec.PrimitiveType; +async function loadAwsServiceSpec() { + return loadBufferIntoDatabase(await node_fs_1.promises.readFile(DB_PATH)); } -exports.isPrimitiveAttribute = isPrimitiveAttribute; -function isListAttribute(spec) { - return spec.Type === 'List'; -} -exports.isListAttribute = isListAttribute; -function isMapAttribute(spec) { - return spec.Type === 'Map'; -} -exports.isMapAttribute = isMapAttribute; -function isPrimitiveListAttribute(spec) { - return isListAttribute(spec) && !!spec.PrimitiveItemType; -} -exports.isPrimitiveListAttribute = isPrimitiveListAttribute; -function isComplexListAttribute(spec) { - return isListAttribute(spec) && !!spec.ItemType; -} -exports.isComplexListAttribute = isComplexListAttribute; -function isPrimitiveMapAttribute(spec) { - return isMapAttribute(spec) && !!spec.PrimitiveItemType; -} -exports.isPrimitiveMapAttribute = isPrimitiveMapAttribute; +exports.loadAwsServiceSpec = loadAwsServiceSpec; /** - * Type declaration for special values of the "Ref" attribute represents. - * - * The attribute can take on more values than these, but these are treated specially. + * Synchronously load the provided built-in database */ -var SpecialRefKind; -(function (SpecialRefKind) { - /** - * No '.ref' member is generated for this type, because it doesn't have a meaningful value. - */ - SpecialRefKind["None"] = "None"; - /** - * The generated class will inherit from the built-in 'Arn' type. - */ - SpecialRefKind["Arn"] = "Arn"; -})(SpecialRefKind || (exports.SpecialRefKind = SpecialRefKind = {})); -var ResourceScrutinyType; -(function (ResourceScrutinyType) { - /** - * No additional scrutiny - */ - ResourceScrutinyType["None"] = "None"; - /** - * An externally attached policy document to a resource - * - * (Common for SQS, SNS, S3, ...) - */ - ResourceScrutinyType["ResourcePolicyResource"] = "ResourcePolicyResource"; - /** - * This is an IAM policy on an identity resource - * - * (Basically saying: this is AWS::IAM::Policy) - */ - ResourceScrutinyType["IdentityPolicyResource"] = "IdentityPolicyResource"; - /** - * This is a Lambda Permission policy - */ - ResourceScrutinyType["LambdaPermission"] = "LambdaPermission"; - /** - * An ingress rule object - */ - ResourceScrutinyType["IngressRuleResource"] = "IngressRuleResource"; - /** - * A set of egress rules - */ - ResourceScrutinyType["EgressRuleResource"] = "EgressRuleResource"; -})(ResourceScrutinyType || (exports.ResourceScrutinyType = ResourceScrutinyType = {})); -function isResourceScrutinyType(str) { - return ResourceScrutinyType[str] !== undefined; +function loadAwsServiceSpecSync() { + return loadBufferIntoDatabase((0, node_fs_1.readFileSync)(DB_PATH)); } -exports.isResourceScrutinyType = isResourceScrutinyType; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlc291cmNlLXR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXFGO0FBaUVyRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxJQUFrQjtJQUNuRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFO1FBQ2pDLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQzlDLElBQUksSUFBQSw0QkFBaUIsRUFBQyxHQUFHLENBQUMsSUFBSSxJQUFBLHdCQUFhLEVBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2pFLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVZELGdEQVVDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsSUFBZTtJQUNsRCxPQUFPLENBQUMsQ0FBRSxJQUEyQixDQUFDLGFBQWEsQ0FBQztBQUN0RCxDQUFDO0FBRkQsb0RBRUM7QUFFRCxTQUFnQixlQUFlLENBQUMsSUFBZTtJQUM3QyxPQUFRLElBQXNCLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUNqRCxDQUFDO0FBRkQsMENBRUM7QUFFRCxTQUFnQixjQUFjLENBQUMsSUFBZTtJQUM1QyxPQUFRLElBQXFCLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztBQUMvQyxDQUFDO0FBRkQsd0NBRUM7QUFFRCxTQUFnQix3QkFBd0IsQ0FBQyxJQUFlO0lBQ3RELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBRSxJQUErQixDQUFDLGlCQUFpQixDQUFDO0FBQ3ZGLENBQUM7QUFGRCw0REFFQztBQUVELFNBQWdCLHNCQUFzQixDQUFDLElBQWU7SUFDcEQsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFFLElBQTZCLENBQUMsUUFBUSxDQUFDO0FBQzVFLENBQUM7QUFGRCx3REFFQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLElBQWU7SUFDckQsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFFLElBQThCLENBQUMsaUJBQWlCLENBQUM7QUFDckYsQ0FBQztBQUZELDBEQUVDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksY0FVWDtBQVZELFdBQVksY0FBYztJQUN4Qjs7T0FFRztJQUNILCtCQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILDZCQUFXLENBQUE7QUFDYixDQUFDLEVBVlcsY0FBYyw4QkFBZCxjQUFjLFFBVXpCO0FBRUQsSUFBWSxvQkFrQ1g7QUFsQ0QsV0FBWSxvQkFBb0I7SUFDOUI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0lBRWI7Ozs7T0FJRztJQUNILHlFQUFpRCxDQUFBO0lBRWpEOzs7O09BSUc7SUFDSCx5RUFBaUQsQ0FBQTtJQUVqRDs7T0FFRztJQUNILDZEQUFxQyxDQUFBO0lBRXJDOztPQUVHO0lBQ0gsbUVBQTJDLENBQUE7SUFFM0M7O09BRUc7SUFDSCxpRUFBeUMsQ0FBQTtBQUMzQyxDQUFDLEVBbENXLG9CQUFvQixvQ0FBcEIsb0JBQW9CLFFBa0MvQjtBQUVELFNBQWdCLHNCQUFzQixDQUFDLEdBQVc7SUFDaEQsT0FBUSxvQkFBNEIsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDMUQsQ0FBQztBQUZELHdEQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRG9jdW1lbnRlZCwgUHJpbWl0aXZlVHlwZSB9IGZyb20gJy4vYmFzZS10eXBlcyc7XG5pbXBvcnQgeyBpc1RhZ1Byb3BlcnR5LCBpc1RhZ1Byb3BlcnR5TmFtZSwgUHJvcGVydHksIFRhZ1Byb3BlcnR5IH0gZnJvbSAnLi9wcm9wZXJ0eSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VUeXBlIGV4dGVuZHMgRG9jdW1lbnRlZCB7XG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlcyBleHBvc2VkIGJ5IHRoZSByZXNvdXJjZSB0eXBlLCBpZiBhbnkuXG4gICAqL1xuICBBdHRyaWJ1dGVzPzogeyBbbmFtZTogc3RyaW5nXTogQXR0cmlidXRlIH07XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBhY2NlcHRlZCBieSB0aGUgcmVzb3VyY2UgdHlwZSwgaWYgYW55LlxuICAgKi9cbiAgUHJvcGVydGllcz86IHsgW25hbWU6IHN0cmluZ106IFByb3BlcnR5IH07XG4gIC8qKlxuICAgKiBUaGUgYGBUcmFuc2Zvcm1gYCByZXF1aXJlZCBieSB0aGUgcmVzb3VyY2UgdHlwZSwgaWYgYW55LlxuICAgKi9cbiAgUmVxdWlyZWRUcmFuc2Zvcm0/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQga2luZCBvZiB2YWx1ZSB0aGUgJ1JlZicgb3BlcmF0b3IgcmVmZXJzIHRvLCBpZiBhbnkuXG4gICAqL1xuICBSZWZLaW5kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEdXJpbmcgYSBzdGFjayB1cGRhdGUsIHdoYXQga2luZCBvZiBhZGRpdGlvbmFsIHNjcnV0aW55IGNoYW5nZXMgdG8gdGhpcyByZXNvdXJjZSBzaG91bGQgYmUgc3ViamVjdGVkIHRvXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIFNjcnV0aW55VHlwZT86IFJlc291cmNlU2NydXRpbnlUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ2dhYmxlUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZVR5cGUge1xuICBQcm9wZXJ0aWVzOiB7XG4gICAgRmlsZVN5c3RlbVRhZ3M6IFRhZ1Byb3BlcnR5O1xuICAgIEhvc3RlZFpvbmVUYWdzOiBUYWdQcm9wZXJ0eTtcbiAgICBUYWdzOiBUYWdQcm9wZXJ0eTtcbiAgICBVc2VyUG9vbFRhZ3M6IFRhZ1Byb3BlcnR5O1xuICAgIEFjY2Vzc1BvaW50VGFnczogVGFnUHJvcGVydHk7XG4gICAgW25hbWU6IHN0cmluZ106IFByb3BlcnR5O1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEF0dHJpYnV0ZSA9IFByaW1pdGl2ZUF0dHJpYnV0ZSB8IExpc3RBdHRyaWJ1dGUgfCBNYXBBdHRyaWJ1dGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpbWl0aXZlQXR0cmlidXRlIHtcbiAgUHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZTtcbn1cblxuZXhwb3J0IHR5cGUgTGlzdEF0dHJpYnV0ZSA9IFByaW1pdGl2ZUxpc3RBdHRyaWJ1dGUgfCBDb21wbGV4TGlzdEF0dHJpYnV0ZTtcblxuZXhwb3J0IGludGVyZmFjZSBQcmltaXRpdmVMaXN0QXR0cmlidXRlIHtcbiAgVHlwZTogJ0xpc3QnO1xuICBQcmltaXRpdmVJdGVtVHlwZTogUHJpbWl0aXZlVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV4TGlzdEF0dHJpYnV0ZSB7XG4gIFR5cGU6ICdMaXN0JztcbiAgSXRlbVR5cGU6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTWFwQXR0cmlidXRlID0gUHJpbWl0aXZlTWFwQXR0cmlidXRlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByaW1pdGl2ZU1hcEF0dHJpYnV0ZSB7XG4gIFR5cGU6ICdNYXAnO1xuICBQcmltaXRpdmVJdGVtVHlwZTogUHJpbWl0aXZlVHlwZTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHJlc291cmNlIHN1cHBvcnRzIHRhZ3NcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGNvbWJpbmVkIHdpdGggaXNUYWdQcm9wZXJ0eSBkZXRlcm1pbmVzIGlmIHRoZSBgY2RrLlRhZ01hbmFnZXJgXG4gKiBhbmQgYGNkay5UYWdnYWJsZVJlc291cmNlYCBjYW4gcHJvY2VzcyB0aGVzZSB0YWdzLiBJZiBub3QsIHN0YW5kYXJkIGNvZGVcbiAqIGdlbmVyYXRpb24gb2YgcHJvcGVydGllcyB3aWxsIGJlIHVzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RhZ2dhYmxlUmVzb3VyY2Uoc3BlYzogUmVzb3VyY2VUeXBlKTogc3BlYyBpcyBUYWdnYWJsZVJlc291cmNlIHtcbiAgaWYgKHNwZWMuUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNwZWMuUHJvcGVydGllcykpIHtcbiAgICBpZiAoaXNUYWdQcm9wZXJ0eU5hbWUoa2V5KSAmJiBpc1RhZ1Byb3BlcnR5KHNwZWMuUHJvcGVydGllc1trZXldKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlQXR0cmlidXRlKHNwZWM6IEF0dHJpYnV0ZSk6IHNwZWMgaXMgUHJpbWl0aXZlQXR0cmlidXRlIHtcbiAgcmV0dXJuICEhKHNwZWMgYXMgUHJpbWl0aXZlQXR0cmlidXRlKS5QcmltaXRpdmVUeXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMaXN0QXR0cmlidXRlKHNwZWM6IEF0dHJpYnV0ZSk6IHNwZWMgaXMgTGlzdEF0dHJpYnV0ZSB7XG4gIHJldHVybiAoc3BlYyBhcyBMaXN0QXR0cmlidXRlKS5UeXBlID09PSAnTGlzdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hcEF0dHJpYnV0ZShzcGVjOiBBdHRyaWJ1dGUpOiBzcGVjIGlzIE1hcEF0dHJpYnV0ZSB7XG4gIHJldHVybiAoc3BlYyBhcyBNYXBBdHRyaWJ1dGUpLlR5cGUgPT09ICdNYXAnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmVMaXN0QXR0cmlidXRlKHNwZWM6IEF0dHJpYnV0ZSk6IHNwZWMgaXMgUHJpbWl0aXZlTGlzdEF0dHJpYnV0ZSB7XG4gIHJldHVybiBpc0xpc3RBdHRyaWJ1dGUoc3BlYykgJiYgISEoc3BlYyBhcyBQcmltaXRpdmVMaXN0QXR0cmlidXRlKS5QcmltaXRpdmVJdGVtVHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGxleExpc3RBdHRyaWJ1dGUoc3BlYzogQXR0cmlidXRlKTogc3BlYyBpcyBDb21wbGV4TGlzdEF0dHJpYnV0ZSB7XG4gIHJldHVybiBpc0xpc3RBdHRyaWJ1dGUoc3BlYykgJiYgISEoc3BlYyBhcyBDb21wbGV4TGlzdEF0dHJpYnV0ZSkuSXRlbVR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZU1hcEF0dHJpYnV0ZShzcGVjOiBBdHRyaWJ1dGUpOiBzcGVjIGlzIFByaW1pdGl2ZU1hcEF0dHJpYnV0ZSB7XG4gIHJldHVybiBpc01hcEF0dHJpYnV0ZShzcGVjKSAmJiAhIShzcGVjIGFzIFByaW1pdGl2ZU1hcEF0dHJpYnV0ZSkuUHJpbWl0aXZlSXRlbVR5cGU7XG59XG5cbi8qKlxuICogVHlwZSBkZWNsYXJhdGlvbiBmb3Igc3BlY2lhbCB2YWx1ZXMgb2YgdGhlIFwiUmVmXCIgYXR0cmlidXRlIHJlcHJlc2VudHMuXG4gKlxuICogVGhlIGF0dHJpYnV0ZSBjYW4gdGFrZSBvbiBtb3JlIHZhbHVlcyB0aGFuIHRoZXNlLCBidXQgdGhlc2UgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5LlxuICovXG5leHBvcnQgZW51bSBTcGVjaWFsUmVmS2luZCB7XG4gIC8qKlxuICAgKiBObyAnLnJlZicgbWVtYmVyIGlzIGdlbmVyYXRlZCBmb3IgdGhpcyB0eXBlLCBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBhIG1lYW5pbmdmdWwgdmFsdWUuXG4gICAqL1xuICBOb25lID0gJ05vbmUnLFxuXG4gIC8qKlxuICAgKiBUaGUgZ2VuZXJhdGVkIGNsYXNzIHdpbGwgaW5oZXJpdCBmcm9tIHRoZSBidWlsdC1pbiAnQXJuJyB0eXBlLlxuICAgKi9cbiAgQXJuID0gJ0Fybidcbn1cblxuZXhwb3J0IGVudW0gUmVzb3VyY2VTY3J1dGlueVR5cGUge1xuICAvKipcbiAgICogTm8gYWRkaXRpb25hbCBzY3J1dGlueVxuICAgKi9cbiAgTm9uZSA9ICdOb25lJyxcblxuICAvKipcbiAgICogQW4gZXh0ZXJuYWxseSBhdHRhY2hlZCBwb2xpY3kgZG9jdW1lbnQgdG8gYSByZXNvdXJjZVxuICAgKlxuICAgKiAoQ29tbW9uIGZvciBTUVMsIFNOUywgUzMsIC4uLilcbiAgICovXG4gIFJlc291cmNlUG9saWN5UmVzb3VyY2UgPSAnUmVzb3VyY2VQb2xpY3lSZXNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYW4gSUFNIHBvbGljeSBvbiBhbiBpZGVudGl0eSByZXNvdXJjZVxuICAgKlxuICAgKiAoQmFzaWNhbGx5IHNheWluZzogdGhpcyBpcyBBV1M6OklBTTo6UG9saWN5KVxuICAgKi9cbiAgSWRlbnRpdHlQb2xpY3lSZXNvdXJjZSA9ICdJZGVudGl0eVBvbGljeVJlc291cmNlJyxcblxuICAvKipcbiAgICogVGhpcyBpcyBhIExhbWJkYSBQZXJtaXNzaW9uIHBvbGljeVxuICAgKi9cbiAgTGFtYmRhUGVybWlzc2lvbiA9ICdMYW1iZGFQZXJtaXNzaW9uJyxcblxuICAvKipcbiAgICogQW4gaW5ncmVzcyBydWxlIG9iamVjdFxuICAgKi9cbiAgSW5ncmVzc1J1bGVSZXNvdXJjZSA9ICdJbmdyZXNzUnVsZVJlc291cmNlJyxcblxuICAvKipcbiAgICogQSBzZXQgb2YgZWdyZXNzIHJ1bGVzXG4gICAqL1xuICBFZ3Jlc3NSdWxlUmVzb3VyY2UgPSAnRWdyZXNzUnVsZVJlc291cmNlJyxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VTY3J1dGlueVR5cGUoc3RyOiBzdHJpbmcpOiBzdHIgaXMgUmVzb3VyY2VTY3J1dGlueVR5cGUge1xuICByZXR1cm4gKFJlc291cmNlU2NydXRpbnlUeXBlIGFzIGFueSlbc3RyXSAhPT0gdW5kZWZpbmVkO1xufVxuIl19 - -/***/ }), - -/***/ 96178: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isRecordType = void 0; -/** - * Whether the given type definition is a Record property - */ -function isRecordType(propertyType) { - return 'Properties' in propertyType; +exports.loadAwsServiceSpecSync = loadAwsServiceSpecSync; +function loadBufferIntoDatabase(spec) { + const db = (0, service_spec_types_1.emptyDatabase)(); + db.load(JSON.parse((0, node_zlib_1.gunzipSync)(spec).toString('utf-8'))); + return db; } -exports.isRecordType = isRecordType; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY2lmaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNwZWNpZmljYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBa0RBOztHQUVHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLFlBQTBCO0lBQ3JELE9BQU8sWUFBWSxJQUFJLFlBQVksQ0FBQztBQUN0QyxDQUFDO0FBRkQsb0NBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2N1bWVudGVkIH0gZnJvbSAnLi9iYXNlLXR5cGVzJztcbmltcG9ydCB7IFByb3BlcnR5IH0gZnJvbSAnLi9wcm9wZXJ0eSc7XG5pbXBvcnQgeyBSZXNvdXJjZVR5cGUgfSBmcm9tICcuL3Jlc291cmNlLXR5cGUnO1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvY2ZuLXJlc291cmNlLXNwZWNpZmljYXRpb24tZm9ybWF0Lmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGVjaWZpY2F0aW9uIHtcbiAgLyoqXG4gICAqIEEgZmluZ2VycHJpbnQgb2YgdGhlIHRlbXBsYXRlLCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBoYXMgY2hhbmdlZC5cbiAgICovXG4gIEZpbmdlcnByaW50OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGb3IgcmVzb3VyY2VzIHRoYXQgaGF2ZSBwcm9wZXJ0aWVzIHdpdGhpbiBhIHByb3BlcnR5IChhbHNvIGtub3duIGFzIHN1YnByb3BlcnRpZXMpLCBhIGxpc3Qgb2Ygc3VicHJvcGVydHlcbiAgICogc3BlY2lmaWNhdGlvbnMsIHN1Y2ggYXMgd2hpY2ggcHJvcGVydGllcyBhcmUgcmVxdWlyZWQsIHRoZSB0eXBlIG9mIGFsbG93ZWQgdmFsdWUgZm9yIGVhY2ggcHJvcGVydHksIGFuZCB0aGVpclxuICAgKiB1cGRhdGUgYmVoYXZpb3IuXG4gICAqL1xuICBQcm9wZXJ0eVR5cGVzOiB7IFtuYW1lOiBzdHJpbmddOiBQcm9wZXJ0eVR5cGUgfTtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHJlc291cmNlcyBhbmQgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZXNvdXJjZSdzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXQncyBwcm9wZXJ0eSBuYW1lcywgd2hpY2hcbiAgICogcHJvcGVydGllcyBhcmUgcmVxdWlyZWQsIGFuZCB0aGVpciB1cGRhdGUgYmVoYXZpb3IuXG4gICAqL1xuICBSZXNvdXJjZVR5cGVzOiB7IFtuYW1lOiBzdHJpbmddOiBSZXNvdXJjZVR5cGUgfTtcbn1cblxuLyoqXG4gKiBEZXNjcmliaW5nIGEgdXNlci1kZWZpbmVkIHByb3BlcnR5IHR5cGVcbiAqXG4gKiBFdmVuIHRob3VnaCBsb29rcyB3ZWlyZCwgdGhlIENsb3VkRm9ybWF0aW9uIHNwZWMgZG9lcyBub3QgbWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gcHJvcGVydGllcyBhbmRcbiAqIHByb3BlcnR5IFRZUEVTOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9jZm4tcmVzb3VyY2Utc3BlY2lmaWNhdGlvbi1mb3JtYXQuaHRtbFxuICpcbiAqIFRoYXQgbWVhbnMgdGhhdCBhIFwidHlwZVwiIGNvbWVzIHdpdGggZmllbGRzIHN1Y2ggYXMgXCJSZXF1aXJlZFwiLCBcIlVwZGF0ZVR5cGUgTXV0YWJsZVwiLCBldGNcbiAqIChldmVuIHRob3VnaCB0aG9zZSBvbmx5IG1ha2Ugc2Vuc2UgZm9yIGEgcGFydGljdWxhciBQUk9QRVJUWSBvZiB0aGF0IHR5cGUpLiBUaGV5IG9ubHkgc2VlbSB0byBvY2N1clxuICogb24gbm9uLVJlY29yZCBwcm9wZXJ0aWVzIHRob3VnaC5cbiAqXG4gKiBJbiBwcmFjdGljZSwgZXZlbiB0aG91Z2ggYWxpYXNlcyBmb3IgUHJpbWl0aXZlIHByb3BlcnRpZXMgYXJlIGFsbG93ZWQsIG9ubHkgUmVjb3JkUHJvcGVydGllc1xuICogYW5kIENvbGxlY3Rpb25Qcm9wZXJ0aWVzIHNlZW0gdG8gYWN0dWFsbHkgb2NjdXIgaW4gdGhlIHNwZWMgaW4gdGhlIFwidHlwZXNcIiBzZWN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGUgPSBSZWNvcmRQcm9wZXJ0eSB8IFByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBzcGVjaWZpY2F0aW9ucyBvZiBhIHByb3BlcnR5IG9iamVjdCB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZFByb3BlcnR5IGV4dGVuZHMgRG9jdW1lbnRlZCB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiB0aGUgUHJvcGVydHkgdHlwZS5cbiAgICovXG4gIFByb3BlcnRpZXM6IHsgW25hbWU6IHN0cmluZ106IFByb3BlcnR5IH07XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBkZWZpbml0aW9uIGlzIGEgUmVjb3JkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlY29yZFR5cGUocHJvcGVydHlUeXBlOiBQcm9wZXJ0eVR5cGUpOiBwcm9wZXJ0eVR5cGUgaXMgUmVjb3JkUHJvcGVydHkge1xuICByZXR1cm4gJ1Byb3BlcnRpZXMnIGluIHByb3BlcnR5VHlwZTtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBdUQ7QUFDdkQsZ0RBQWtDO0FBQ2xDLHlDQUF1QztBQUN2QyxvRUFBMEU7QUFFMUUsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDO0FBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztBQUUxRDs7R0FFRztBQUNJLEtBQUssVUFBVSxrQkFBa0I7SUFDdEMsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLGtCQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUZELGdEQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixzQkFBc0I7SUFDcEMsT0FBTyxzQkFBc0IsQ0FBQyxJQUFBLHNCQUFZLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRkQsd0RBRUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLElBQVk7SUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBQSxrQ0FBYSxHQUFFLENBQUM7SUFDM0IsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUEsc0JBQVUsRUFBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzLCByZWFkRmlsZVN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuaW1wb3J0IHsgZW1wdHlEYXRhYmFzZSwgU3BlY0RhdGFiYXNlIH0gZnJvbSAnQGF3cy1jZGsvc2VydmljZS1zcGVjLXR5cGVzJztcblxuY29uc3QgREJfQ09NUFJFU1NFRCA9ICdkYi5qc29uLmd6JztcbmNvbnN0IERCX1BBVEggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCBEQl9DT01QUkVTU0VEKTtcblxuLyoqXG4gKiBMb2FkIHRoZSBwcm92aWRlZCBidWlsdC1pbiBkYXRhYmFzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEF3c1NlcnZpY2VTcGVjKCk6IFByb21pc2U8U3BlY0RhdGFiYXNlPiB7XG4gIHJldHVybiBsb2FkQnVmZmVySW50b0RhdGFiYXNlKGF3YWl0IGZzLnJlYWRGaWxlKERCX1BBVEgpKTtcbn1cblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGxvYWQgdGhlIHByb3ZpZGVkIGJ1aWx0LWluIGRhdGFiYXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQXdzU2VydmljZVNwZWNTeW5jKCk6IFNwZWNEYXRhYmFzZSB7XG4gIHJldHVybiBsb2FkQnVmZmVySW50b0RhdGFiYXNlKHJlYWRGaWxlU3luYyhEQl9QQVRIKSk7XG59XG5cbmZ1bmN0aW9uIGxvYWRCdWZmZXJJbnRvRGF0YWJhc2Uoc3BlYzogQnVmZmVyKTogU3BlY0RhdGFiYXNlIHtcbiAgY29uc3QgZGIgPSBlbXB0eURhdGFiYXNlKCk7XG4gIGRiLmxvYWQoSlNPTi5wYXJzZShndW56aXBTeW5jKHNwZWMpLnRvU3RyaW5nKCd1dGYtOCcpKSk7XG4gIHJldHVybiBkYjtcbn1cbiJdfQ== /***/ }), @@ -4622,7 +3941,7 @@ class Manifest { } exports.Manifest = Manifest; _a = JSII_RTTI_SYMBOL_1; -Manifest[_a] = { fqn: "@aws-cdk/cloud-assembly-schema.Manifest", version: "2.103.1" }; +Manifest[_a] = { fqn: "@aws-cdk/cloud-assembly-schema.Manifest", version: "2.107.0" }; function mapValues(xs, fn) { if (!xs) { return undefined; @@ -9933,7 +9252,6 @@ function deepCopy(x) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.diffUnknown = exports.diffResource = exports.diffParameter = exports.diffOutput = exports.diffMetadata = exports.diffMapping = exports.diffCondition = exports.diffAttribute = void 0; -const cfnspec = __nccwpck_require__(72665); const types = __nccwpck_require__(9596); const util_1 = __nccwpck_require__(3089); function diffAttribute(oldValue, newValue) { @@ -9969,8 +9287,7 @@ function diffResource(oldValue, newValue) { let otherDiffs = {}; if (resourceType.oldType !== undefined && resourceType.oldType === resourceType.newType) { // Only makes sense to inspect deeper if the types stayed the same - const typeSpec = cfnspec.filteredSpecification(resourceType.oldType); - const impl = typeSpec.ResourceTypes[resourceType.oldType]; + const impl = (0, util_1.loadResourceModel)(resourceType.oldType); propertyDiffs = (0, util_1.diffKeyedEntities)(oldValue.Properties, newValue.Properties, (oldVal, newVal, key) => _diffProperty(oldVal, newVal, key, impl)); otherDiffs = (0, util_1.diffKeyedEntities)(oldValue, newValue, _diffOther); delete otherDiffs.Properties; @@ -9980,13 +9297,13 @@ function diffResource(oldValue, newValue) { }); function _diffProperty(oldV, newV, key, resourceSpec) { let changeImpact = types.ResourceImpact.NO_CHANGE; - const spec = resourceSpec && resourceSpec.Properties && resourceSpec.Properties[key]; + const spec = resourceSpec?.properties?.[key]; if (spec && !(0, util_1.deepEqual)(oldV, newV)) { - switch (spec.UpdateType) { - case cfnspec.schema.UpdateType.Immutable: + switch (spec.causesReplacement) { + case 'yes': changeImpact = types.ResourceImpact.WILL_REPLACE; break; - case cfnspec.schema.UpdateType.Conditional: + case 'maybe': changeImpact = types.ResourceImpact.MAY_REPLACE; break; default: @@ -10023,7 +9340,7 @@ function _asString(value) { } return JSON.stringify(value); } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0Q0FBNEM7QUFDNUMsaUNBQWlDO0FBQ2pDLGlDQUFzRDtBQUV0RCxTQUFnQixhQUFhLENBQUMsUUFBYSxFQUFFLFFBQWE7SUFDeEQsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQVMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFGRCxzQ0FFQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxRQUF5QixFQUFFLFFBQXlCO0lBQ2hGLE9BQU8sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFGRCxzQ0FFQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxRQUF1QixFQUFFLFFBQXVCO0lBQzFFLE9BQU8sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFGRCxrQ0FFQztBQUVELFNBQWdCLFlBQVksQ0FBQyxRQUF3QixFQUFFLFFBQXdCO0lBQzdFLE9BQU8sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFGRCxvQ0FFQztBQUVELFNBQWdCLFVBQVUsQ0FBQyxRQUFzQixFQUFFLFFBQXNCO0lBQ3ZFLE9BQU8sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFGRCxnQ0FFQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxRQUF5QixFQUFFLFFBQXlCO0lBQ2hGLE9BQU8sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFGRCxzQ0FFQztBQUVELFNBQWdCLFlBQVksQ0FBQyxRQUF5QixFQUFFLFFBQXlCO0lBQy9FLE1BQU0sWUFBWSxHQUFHO1FBQ25CLE9BQU8sRUFBRSxRQUFRLElBQUksUUFBUSxDQUFDLElBQUk7UUFDbEMsT0FBTyxFQUFFLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSTtLQUNuQyxDQUFDO0lBQ0YsSUFBSSxhQUFhLEdBQXFELEVBQUUsQ0FBQztJQUN6RSxJQUFJLFVBQVUsR0FBNkMsRUFBRSxDQUFDO0lBRTlELElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsT0FBTyxFQUFFO1FBQ3ZGLGtFQUFrRTtRQUNsRSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFELGFBQWEsR0FBRyxJQUFBLHdCQUFpQixFQUFDLFFBQVMsQ0FBQyxVQUFVLEVBQ3BELFFBQVMsQ0FBQyxVQUFVLEVBQ3BCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXJFLFVBQVUsR0FBRyxJQUFBLHdCQUFpQixFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0QsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDO0tBQzlCO0lBRUQsT0FBTyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFO1FBQ3RELFlBQVksRUFBRSxhQUFhLEVBQUUsVUFBVTtLQUN4QyxDQUFDLENBQUM7SUFFSCxTQUFTLGFBQWEsQ0FBQyxJQUFTLEVBQUUsSUFBUyxFQUFFLEdBQVcsRUFBRSxZQUEwQztRQUNsRyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUVsRCxNQUFNLElBQUksR0FBRyxZQUFZLElBQUksWUFBWSxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JGLElBQUksSUFBSSxJQUFJLENBQUMsSUFBQSxnQkFBUyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNsQyxRQUFRLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3ZCLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUztvQkFDdEMsWUFBWSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO29CQUNqRCxNQUFNO2dCQUNSLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVztvQkFDeEMsWUFBWSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO29CQUNoRCxNQUFNO2dCQUNSO29CQUNFLHVFQUF1RTtvQkFDdkUsWUFBWSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO2FBQ25EO1NBQ0Y7UUFFRCxPQUFPLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFTLEVBQUUsSUFBUztRQUN0QyxPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztBQUNILENBQUM7QUFoREQsb0NBZ0RDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLFFBQWEsRUFBRSxRQUFhO0lBQ3RELE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRkQsa0NBRUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsU0FBUyxDQUFDLEtBQVU7SUFDM0IsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBTyxLQUFlLENBQUM7S0FDeEI7SUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNmbnNwZWMgZnJvbSAnQGF3cy1jZGsvY2Zuc3BlYyc7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgZGlmZktleWVkRW50aXRpZXMgfSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkF0dHJpYnV0ZShvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KTogdHlwZXMuRGlmZmVyZW5jZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5EaWZmZXJlbmNlPHN0cmluZz4oX2FzU3RyaW5nKG9sZFZhbHVlKSwgX2FzU3RyaW5nKG5ld1ZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQ29uZGl0aW9uKG9sZFZhbHVlOiB0eXBlcy5Db25kaXRpb24sIG5ld1ZhbHVlOiB0eXBlcy5Db25kaXRpb24pOiB0eXBlcy5Db25kaXRpb25EaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5Db25kaXRpb25EaWZmZXJlbmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmTWFwcGluZyhvbGRWYWx1ZTogdHlwZXMuTWFwcGluZywgbmV3VmFsdWU6IHR5cGVzLk1hcHBpbmcpOiB0eXBlcy5NYXBwaW5nRGlmZmVyZW5jZSB7XG4gIHJldHVybiBuZXcgdHlwZXMuTWFwcGluZ0RpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZNZXRhZGF0YShvbGRWYWx1ZTogdHlwZXMuTWV0YWRhdGEsIG5ld1ZhbHVlOiB0eXBlcy5NZXRhZGF0YSk6IHR5cGVzLk1ldGFkYXRhRGlmZmVyZW5jZSB7XG4gIHJldHVybiBuZXcgdHlwZXMuTWV0YWRhdGFEaWZmZXJlbmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmT3V0cHV0KG9sZFZhbHVlOiB0eXBlcy5PdXRwdXQsIG5ld1ZhbHVlOiB0eXBlcy5PdXRwdXQpOiB0eXBlcy5PdXRwdXREaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5PdXRwdXREaWZmZXJlbmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmUGFyYW1ldGVyKG9sZFZhbHVlOiB0eXBlcy5QYXJhbWV0ZXIsIG5ld1ZhbHVlOiB0eXBlcy5QYXJhbWV0ZXIpOiB0eXBlcy5QYXJhbWV0ZXJEaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5QYXJhbWV0ZXJEaWZmZXJlbmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmUmVzb3VyY2Uob2xkVmFsdWU/OiB0eXBlcy5SZXNvdXJjZSwgbmV3VmFsdWU/OiB0eXBlcy5SZXNvdXJjZSk6IHR5cGVzLlJlc291cmNlRGlmZmVyZW5jZSB7XG4gIGNvbnN0IHJlc291cmNlVHlwZSA9IHtcbiAgICBvbGRUeXBlOiBvbGRWYWx1ZSAmJiBvbGRWYWx1ZS5UeXBlLFxuICAgIG5ld1R5cGU6IG5ld1ZhbHVlICYmIG5ld1ZhbHVlLlR5cGUsXG4gIH07XG4gIGxldCBwcm9wZXJ0eURpZmZzOiB7IFtrZXk6IHN0cmluZ106IHR5cGVzLlByb3BlcnR5RGlmZmVyZW5jZTxhbnk+IH0gPSB7fTtcbiAgbGV0IG90aGVyRGlmZnM6IHsgW2tleTogc3RyaW5nXTogdHlwZXMuRGlmZmVyZW5jZTxhbnk+IH0gPSB7fTtcblxuICBpZiAocmVzb3VyY2VUeXBlLm9sZFR5cGUgIT09IHVuZGVmaW5lZCAmJiByZXNvdXJjZVR5cGUub2xkVHlwZSA9PT0gcmVzb3VyY2VUeXBlLm5ld1R5cGUpIHtcbiAgICAvLyBPbmx5IG1ha2VzIHNlbnNlIHRvIGluc3BlY3QgZGVlcGVyIGlmIHRoZSB0eXBlcyBzdGF5ZWQgdGhlIHNhbWVcbiAgICBjb25zdCB0eXBlU3BlYyA9IGNmbnNwZWMuZmlsdGVyZWRTcGVjaWZpY2F0aW9uKHJlc291cmNlVHlwZS5vbGRUeXBlKTtcbiAgICBjb25zdCBpbXBsID0gdHlwZVNwZWMuUmVzb3VyY2VUeXBlc1tyZXNvdXJjZVR5cGUub2xkVHlwZV07XG4gICAgcHJvcGVydHlEaWZmcyA9IGRpZmZLZXllZEVudGl0aWVzKG9sZFZhbHVlIS5Qcm9wZXJ0aWVzLFxuICAgICAgbmV3VmFsdWUhLlByb3BlcnRpZXMsXG4gICAgICAob2xkVmFsLCBuZXdWYWwsIGtleSkgPT4gX2RpZmZQcm9wZXJ0eShvbGRWYWwsIG5ld1ZhbCwga2V5LCBpbXBsKSk7XG5cbiAgICBvdGhlckRpZmZzID0gZGlmZktleWVkRW50aXRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCBfZGlmZk90aGVyKTtcbiAgICBkZWxldGUgb3RoZXJEaWZmcy5Qcm9wZXJ0aWVzO1xuICB9XG5cbiAgcmV0dXJuIG5ldyB0eXBlcy5SZXNvdXJjZURpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlLCB7XG4gICAgcmVzb3VyY2VUeXBlLCBwcm9wZXJ0eURpZmZzLCBvdGhlckRpZmZzLFxuICB9KTtcblxuICBmdW5jdGlvbiBfZGlmZlByb3BlcnR5KG9sZFY6IGFueSwgbmV3VjogYW55LCBrZXk6IHN0cmluZywgcmVzb3VyY2VTcGVjPzogY2Zuc3BlYy5zY2hlbWEuUmVzb3VyY2VUeXBlKSB7XG4gICAgbGV0IGNoYW5nZUltcGFjdCA9IHR5cGVzLlJlc291cmNlSW1wYWN0Lk5PX0NIQU5HRTtcblxuICAgIGNvbnN0IHNwZWMgPSByZXNvdXJjZVNwZWMgJiYgcmVzb3VyY2VTcGVjLlByb3BlcnRpZXMgJiYgcmVzb3VyY2VTcGVjLlByb3BlcnRpZXNba2V5XTtcbiAgICBpZiAoc3BlYyAmJiAhZGVlcEVxdWFsKG9sZFYsIG5ld1YpKSB7XG4gICAgICBzd2l0Y2ggKHNwZWMuVXBkYXRlVHlwZSkge1xuICAgICAgICBjYXNlIGNmbnNwZWMuc2NoZW1hLlVwZGF0ZVR5cGUuSW1tdXRhYmxlOlxuICAgICAgICAgIGNoYW5nZUltcGFjdCA9IHR5cGVzLlJlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5VcGRhdGVUeXBlLkNvbmRpdGlvbmFsOlxuICAgICAgICAgIGNoYW5nZUltcGFjdCA9IHR5cGVzLlJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEluIHRob3NlIGNhc2VzLCB3aGF0ZXZlciBpcyB0aGUgY3VycmVudCB2YWx1ZSBpcyB3aGF0IHdlIHNob3VsZCBrZWVwXG4gICAgICAgICAgY2hhbmdlSW1wYWN0ID0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuV0lMTF9VUERBVEU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyB0eXBlcy5Qcm9wZXJ0eURpZmZlcmVuY2Uob2xkViwgbmV3ViwgeyBjaGFuZ2VJbXBhY3QgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBfZGlmZk90aGVyKG9sZFY6IGFueSwgbmV3VjogYW55KSB7XG4gICAgcmV0dXJuIG5ldyB0eXBlcy5EaWZmZXJlbmNlKG9sZFYsIG5ld1YpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmVW5rbm93bihvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KTogdHlwZXMuRGlmZmVyZW5jZTxhbnk+IHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5EaWZmZXJlbmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbi8qKlxuICogQ29lcmNlcyBhIGdpdmVuIHZhbHVlIHRvICtzdHJpbmcgfCB1bmRlZmluZWQrLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgY29lcmNlZC5cbiAqXG4gKiBAcmV0dXJucyArdW5kZWZpbmVkKyBpZiArdmFsdWUrIGlzICtudWxsKyBvciArdW5kZWZpbmVkKyxcbiAqICAgICAgK3ZhbHVlKyBpZiBpdCBpcyBhICtzdHJpbmcrLFxuICogICAgICBhIGNvbXBhY3QgSlNPTiByZXByZXNlbnRhdGlvbiBvZiArdmFsdWUrIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gX2FzU3RyaW5nKHZhbHVlOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgc3RyaW5nO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59XG4iXX0= +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxpQ0FBaUM7QUFDakMsaUNBQXlFO0FBRXpFLFNBQWdCLGFBQWEsQ0FBQyxRQUFhLEVBQUUsUUFBYTtJQUN4RCxPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBUyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUZELHNDQUVDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7SUFDaEYsT0FBTyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUZELHNDQUVDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLFFBQXVCLEVBQUUsUUFBdUI7SUFDMUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUZELGtDQUVDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLFFBQXdCLEVBQUUsUUFBd0I7SUFDN0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUZELG9DQUVDO0FBRUQsU0FBZ0IsVUFBVSxDQUFDLFFBQXNCLEVBQUUsUUFBc0I7SUFDdkUsT0FBTyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUZELGdDQUVDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7SUFDaEYsT0FBTyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUZELHNDQUVDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7SUFDL0UsTUFBTSxZQUFZLEdBQUc7UUFDbkIsT0FBTyxFQUFFLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSTtRQUNsQyxPQUFPLEVBQUUsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJO0tBQ25DLENBQUM7SUFDRixJQUFJLGFBQWEsR0FBcUQsRUFBRSxDQUFDO0lBQ3pFLElBQUksVUFBVSxHQUE2QyxFQUFFLENBQUM7SUFFOUQsSUFBSSxZQUFZLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxZQUFZLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxPQUFPLEVBQUU7UUFDdkYsa0VBQWtFO1FBQ2xFLE1BQU0sSUFBSSxHQUFHLElBQUEsd0JBQWlCLEVBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELGFBQWEsR0FBRyxJQUFBLHdCQUFpQixFQUFDLFFBQVMsQ0FBQyxVQUFVLEVBQ3BELFFBQVMsQ0FBQyxVQUFVLEVBQ3BCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXJFLFVBQVUsR0FBRyxJQUFBLHdCQUFpQixFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0QsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDO0tBQzlCO0lBRUQsT0FBTyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFO1FBQ3RELFlBQVksRUFBRSxhQUFhLEVBQUUsVUFBVTtLQUN4QyxDQUFDLENBQUM7SUFFSCxTQUFTLGFBQWEsQ0FBQyxJQUFTLEVBQUUsSUFBUyxFQUFFLEdBQVcsRUFBRSxZQUF1QjtRQUMvRSxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUVsRCxNQUFNLElBQUksR0FBRyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFBLGdCQUFTLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ2xDLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUM5QixLQUFLLEtBQUs7b0JBQ1IsWUFBWSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO29CQUNqRCxNQUFNO2dCQUNSLEtBQUssT0FBTztvQkFDVixZQUFZLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7b0JBQ2hELE1BQU07Z0JBQ1I7b0JBQ0UsdUVBQXVFO29CQUN2RSxZQUFZLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7YUFDbkQ7U0FDRjtRQUVELE9BQU8sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELFNBQVMsVUFBVSxDQUFDLElBQVMsRUFBRSxJQUFTO1FBQ3RDLE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0FBQ0gsQ0FBQztBQS9DRCxvQ0ErQ0M7QUFFRCxTQUFnQixXQUFXLENBQUMsUUFBYSxFQUFFLFFBQWE7SUFDdEQsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFGRCxrQ0FFQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBVTtJQUMzQixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7UUFDakIsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM3QixPQUFPLEtBQWUsQ0FBQztLQUN4QjtJQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVzb3VyY2UgfSBmcm9tICdAYXdzLWNkay9zZXJ2aWNlLXNwZWMtdHlwZXMnO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBkZWVwRXF1YWwsIGRpZmZLZXllZEVudGl0aWVzLCBsb2FkUmVzb3VyY2VNb2RlbCB9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQXR0cmlidXRlKG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB0eXBlcy5EaWZmZXJlbmNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IHR5cGVzLkRpZmZlcmVuY2U8c3RyaW5nPihfYXNTdHJpbmcob2xkVmFsdWUpLCBfYXNTdHJpbmcobmV3VmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZDb25kaXRpb24ob2xkVmFsdWU6IHR5cGVzLkNvbmRpdGlvbiwgbmV3VmFsdWU6IHR5cGVzLkNvbmRpdGlvbik6IHR5cGVzLkNvbmRpdGlvbkRpZmZlcmVuY2Uge1xuICByZXR1cm4gbmV3IHR5cGVzLkNvbmRpdGlvbkRpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZNYXBwaW5nKG9sZFZhbHVlOiB0eXBlcy5NYXBwaW5nLCBuZXdWYWx1ZTogdHlwZXMuTWFwcGluZyk6IHR5cGVzLk1hcHBpbmdEaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5NYXBwaW5nRGlmZmVyZW5jZShvbGRWYWx1ZSwgbmV3VmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlmZk1ldGFkYXRhKG9sZFZhbHVlOiB0eXBlcy5NZXRhZGF0YSwgbmV3VmFsdWU6IHR5cGVzLk1ldGFkYXRhKTogdHlwZXMuTWV0YWRhdGFEaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5NZXRhZGF0YURpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZPdXRwdXQob2xkVmFsdWU6IHR5cGVzLk91dHB1dCwgbmV3VmFsdWU6IHR5cGVzLk91dHB1dCk6IHR5cGVzLk91dHB1dERpZmZlcmVuY2Uge1xuICByZXR1cm4gbmV3IHR5cGVzLk91dHB1dERpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZQYXJhbWV0ZXIob2xkVmFsdWU6IHR5cGVzLlBhcmFtZXRlciwgbmV3VmFsdWU6IHR5cGVzLlBhcmFtZXRlcik6IHR5cGVzLlBhcmFtZXRlckRpZmZlcmVuY2Uge1xuICByZXR1cm4gbmV3IHR5cGVzLlBhcmFtZXRlckRpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZSZXNvdXJjZShvbGRWYWx1ZT86IHR5cGVzLlJlc291cmNlLCBuZXdWYWx1ZT86IHR5cGVzLlJlc291cmNlKTogdHlwZXMuUmVzb3VyY2VEaWZmZXJlbmNlIHtcbiAgY29uc3QgcmVzb3VyY2VUeXBlID0ge1xuICAgIG9sZFR5cGU6IG9sZFZhbHVlICYmIG9sZFZhbHVlLlR5cGUsXG4gICAgbmV3VHlwZTogbmV3VmFsdWUgJiYgbmV3VmFsdWUuVHlwZSxcbiAgfTtcbiAgbGV0IHByb3BlcnR5RGlmZnM6IHsgW2tleTogc3RyaW5nXTogdHlwZXMuUHJvcGVydHlEaWZmZXJlbmNlPGFueT4gfSA9IHt9O1xuICBsZXQgb3RoZXJEaWZmczogeyBba2V5OiBzdHJpbmddOiB0eXBlcy5EaWZmZXJlbmNlPGFueT4gfSA9IHt9O1xuXG4gIGlmIChyZXNvdXJjZVR5cGUub2xkVHlwZSAhPT0gdW5kZWZpbmVkICYmIHJlc291cmNlVHlwZS5vbGRUeXBlID09PSByZXNvdXJjZVR5cGUubmV3VHlwZSkge1xuICAgIC8vIE9ubHkgbWFrZXMgc2Vuc2UgdG8gaW5zcGVjdCBkZWVwZXIgaWYgdGhlIHR5cGVzIHN0YXllZCB0aGUgc2FtZVxuICAgIGNvbnN0IGltcGwgPSBsb2FkUmVzb3VyY2VNb2RlbChyZXNvdXJjZVR5cGUub2xkVHlwZSk7XG4gICAgcHJvcGVydHlEaWZmcyA9IGRpZmZLZXllZEVudGl0aWVzKG9sZFZhbHVlIS5Qcm9wZXJ0aWVzLFxuICAgICAgbmV3VmFsdWUhLlByb3BlcnRpZXMsXG4gICAgICAob2xkVmFsLCBuZXdWYWwsIGtleSkgPT4gX2RpZmZQcm9wZXJ0eShvbGRWYWwsIG5ld1ZhbCwga2V5LCBpbXBsKSk7XG5cbiAgICBvdGhlckRpZmZzID0gZGlmZktleWVkRW50aXRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCBfZGlmZk90aGVyKTtcbiAgICBkZWxldGUgb3RoZXJEaWZmcy5Qcm9wZXJ0aWVzO1xuICB9XG5cbiAgcmV0dXJuIG5ldyB0eXBlcy5SZXNvdXJjZURpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlLCB7XG4gICAgcmVzb3VyY2VUeXBlLCBwcm9wZXJ0eURpZmZzLCBvdGhlckRpZmZzLFxuICB9KTtcblxuICBmdW5jdGlvbiBfZGlmZlByb3BlcnR5KG9sZFY6IGFueSwgbmV3VjogYW55LCBrZXk6IHN0cmluZywgcmVzb3VyY2VTcGVjPzogUmVzb3VyY2UpIHtcbiAgICBsZXQgY2hhbmdlSW1wYWN0ID0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuTk9fQ0hBTkdFO1xuXG4gICAgY29uc3Qgc3BlYyA9IHJlc291cmNlU3BlYz8ucHJvcGVydGllcz8uW2tleV07XG4gICAgaWYgKHNwZWMgJiYgIWRlZXBFcXVhbChvbGRWLCBuZXdWKSkge1xuICAgICAgc3dpdGNoIChzcGVjLmNhdXNlc1JlcGxhY2VtZW50KSB7XG4gICAgICAgIGNhc2UgJ3llcyc6XG4gICAgICAgICAgY2hhbmdlSW1wYWN0ID0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuV0lMTF9SRVBMQUNFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtYXliZSc6XG4gICAgICAgICAgY2hhbmdlSW1wYWN0ID0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuTUFZX1JFUExBQ0U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW4gdGhvc2UgY2FzZXMsIHdoYXRldmVyIGlzIHRoZSBjdXJyZW50IHZhbHVlIGlzIHdoYXQgd2Ugc2hvdWxkIGtlZXBcbiAgICAgICAgICBjaGFuZ2VJbXBhY3QgPSB0eXBlcy5SZXNvdXJjZUltcGFjdC5XSUxMX1VQREFURTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHR5cGVzLlByb3BlcnR5RGlmZmVyZW5jZShvbGRWLCBuZXdWLCB7IGNoYW5nZUltcGFjdCB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9kaWZmT3RoZXIob2xkVjogYW55LCBuZXdWOiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IHR5cGVzLkRpZmZlcmVuY2Uob2xkViwgbmV3Vik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZVbmtub3duKG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB0eXBlcy5EaWZmZXJlbmNlPGFueT4ge1xuICByZXR1cm4gbmV3IHR5cGVzLkRpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDb2VyY2VzIGEgZ2l2ZW4gdmFsdWUgdG8gK3N0cmluZyB8IHVuZGVmaW5lZCsuXG4gKlxuICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjb2VyY2VkLlxuICpcbiAqIEByZXR1cm5zICt1bmRlZmluZWQrIGlmICt2YWx1ZSsgaXMgK251bGwrIG9yICt1bmRlZmluZWQrLFxuICogICAgICArdmFsdWUrIGlmIGl0IGlzIGEgK3N0cmluZyssXG4gKiAgICAgIGEgY29tcGFjdCBKU09OIHJlcHJlc2VudGF0aW9uIG9mICt2YWx1ZSsgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBfYXNTdHJpbmcodmFsdWU6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSBhcyBzdHJpbmc7XG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cbiJdfQ== /***/ }), @@ -10057,7 +9374,7 @@ exports.mkUnparseable = mkUnparseable; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isPropertyDifference = exports.ResourceDifference = exports.ResourceImpact = exports.ParameterDifference = exports.OutputDifference = exports.MetadataDifference = exports.MappingDifference = exports.ConditionDifference = exports.DifferenceCollection = exports.PropertyDifference = exports.Difference = exports.TemplateDiff = void 0; const assert_1 = __nccwpck_require__(39491); -const cfnspec = __nccwpck_require__(72665); +const service_spec_types_1 = __nccwpck_require__(504); const util_1 = __nccwpck_require__(3089); const iam_changes_1 = __nccwpck_require__(23154); const security_group_changes_1 = __nccwpck_require__(43847); @@ -10085,10 +9402,10 @@ class TemplateDiff { resourceChanges: this.scrutinizableResourceChanges(iam_changes_1.IamChanges.IamResourceScrutinies), }); this.securityGroupChanges = new security_group_changes_1.SecurityGroupChanges({ - egressRulePropertyChanges: this.scrutinizablePropertyChanges([cfnspec.schema.PropertyScrutinyType.EgressRules]), - ingressRulePropertyChanges: this.scrutinizablePropertyChanges([cfnspec.schema.PropertyScrutinyType.IngressRules]), - egressRuleResourceChanges: this.scrutinizableResourceChanges([cfnspec.schema.ResourceScrutinyType.EgressRuleResource]), - ingressRuleResourceChanges: this.scrutinizableResourceChanges([cfnspec.schema.ResourceScrutinyType.IngressRuleResource]), + egressRulePropertyChanges: this.scrutinizablePropertyChanges([service_spec_types_1.PropertyScrutinyType.EgressRules]), + ingressRulePropertyChanges: this.scrutinizablePropertyChanges([service_spec_types_1.PropertyScrutinyType.IngressRules]), + egressRuleResourceChanges: this.scrutinizableResourceChanges([service_spec_types_1.ResourceScrutinyType.EgressRuleResource]), + ingressRuleResourceChanges: this.scrutinizableResourceChanges([service_spec_types_1.ResourceScrutinyType.IngressRuleResource]), }); } get differenceCount() { @@ -10139,16 +9456,22 @@ class TemplateDiff { // we ignore resource type changes here, and handle them in scrutinizableResourceChanges() continue; } - const props = cfnspec.scrutinizablePropertyNames(resourceChange.newResourceType, scrutinyTypes); - for (const propertyName of props) { - ret.push({ - resourceLogicalId, - propertyName, - resourceType: resourceChange.resourceType, - scrutinyType: cfnspec.propertySpecification(resourceChange.resourceType, propertyName).ScrutinyType, - oldValue: resourceChange.oldProperties && resourceChange.oldProperties[propertyName], - newValue: resourceChange.newProperties && resourceChange.newProperties[propertyName], - }); + if (!resourceChange.newResourceType) { + continue; + } + const newTypeProps = (0, util_1.loadResourceModel)(resourceChange.newResourceType)?.properties || {}; + for (const [propertyName, prop] of Object.entries(newTypeProps)) { + const propScrutinyType = prop.scrutinizable || service_spec_types_1.PropertyScrutinyType.None; + if (scrutinyTypes.includes(propScrutinyType)) { + ret.push({ + resourceLogicalId, + propertyName, + resourceType: resourceChange.resourceType, + scrutinyType: propScrutinyType, + oldValue: resourceChange.oldProperties?.[propertyName], + newValue: resourceChange.newProperties?.[propertyName], + }); + } } } return ret; @@ -10161,7 +9484,6 @@ class TemplateDiff { */ scrutinizableResourceChanges(scrutinyTypes) { const ret = new Array(); - const scrutinizableTypes = new Set(cfnspec.scrutinizableResourceTypes(scrutinyTypes)); for (const [resourceLogicalId, resourceChange] of Object.entries(this.resources.changes)) { if (!resourceChange) { continue; @@ -10174,35 +9496,45 @@ class TemplateDiff { // changes to the Type of resources can happen when migrating from CFN templates that use Transforms if (resourceChange.resourceTypeChanged) { // Treat as DELETE+ADD - if (scrutinizableTypes.has(resourceChange.oldResourceType)) { - ret.push({ - ...commonProps, - newProperties: undefined, - resourceType: resourceChange.oldResourceType, - scrutinyType: cfnspec.resourceSpecification(resourceChange.oldResourceType).ScrutinyType, - }); + if (resourceChange.oldResourceType) { + const oldResourceModel = (0, util_1.loadResourceModel)(resourceChange.oldResourceType); + if (oldResourceModel && this.resourceIsScrutinizable(oldResourceModel, scrutinyTypes)) { + ret.push({ + ...commonProps, + newProperties: undefined, + resourceType: resourceChange.oldResourceType, + scrutinyType: oldResourceModel.scrutinizable, + }); + } } - if (scrutinizableTypes.has(resourceChange.newResourceType)) { - ret.push({ - ...commonProps, - oldProperties: undefined, - resourceType: resourceChange.newResourceType, - scrutinyType: cfnspec.resourceSpecification(resourceChange.newResourceType).ScrutinyType, - }); + if (resourceChange.newResourceType) { + const newResourceModel = (0, util_1.loadResourceModel)(resourceChange.newResourceType); + if (newResourceModel && this.resourceIsScrutinizable(newResourceModel, scrutinyTypes)) { + ret.push({ + ...commonProps, + oldProperties: undefined, + resourceType: resourceChange.newResourceType, + scrutinyType: newResourceModel.scrutinizable, + }); + } } } else { - if (scrutinizableTypes.has(resourceChange.resourceType)) { + const resourceModel = (0, util_1.loadResourceModel)(resourceChange.resourceType); + if (resourceModel && this.resourceIsScrutinizable(resourceModel, scrutinyTypes)) { ret.push({ ...commonProps, resourceType: resourceChange.resourceType, - scrutinyType: cfnspec.resourceSpecification(resourceChange.resourceType).ScrutinyType, + scrutinyType: resourceModel.scrutinizable, }); } } } return ret; } + resourceIsScrutinizable(res, scrutinyTypes) { + return scrutinyTypes.includes(res.scrutinizable || service_spec_types_1.ResourceScrutinyType.None); + } } exports.TemplateDiff = TemplateDiff; /** @@ -10509,17 +9841,18 @@ function onlyChanges(xs) { } return ret; } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBd0M7QUFDeEMsNENBQTRDO0FBQzVDLGlDQUFtQztBQUNuQyxvREFBZ0Q7QUFDaEQsOEVBQXlFO0FBSXpFLGlFQUFpRTtBQUNqRSxNQUFhLFlBQVk7SUF1QnZCLFlBQVksSUFBbUI7UUFDN0IsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUssU0FBUyxFQUFFO1lBQy9DLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7U0FDL0Q7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUNyQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHdCQUFVLENBQUM7WUFDL0IsZUFBZSxFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyx3QkFBVSxDQUFDLHFCQUFxQixDQUFDO1lBQ3BGLGVBQWUsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsd0JBQVUsQ0FBQyxxQkFBcUIsQ0FBQztTQUNyRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSw2Q0FBb0IsQ0FBQztZQUNuRCx5QkFBeUIsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9HLDBCQUEwQixFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakgseUJBQXlCLEVBQUUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3RILDBCQUEwQixFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN6SCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUVkLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtZQUMvQyxLQUFLLElBQUksQ0FBQyxDQUFDO1NBQ1o7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLEtBQUssSUFBSSxDQUFDLENBQUM7U0FDWjtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUNaO1FBRUQsS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO1FBQ3pDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUN2QyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDdkMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBQ3RDLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN6QyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7UUFDeEMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBRXRDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDO0lBQ3RGLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcscUJBQXFCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyw0QkFBNEIsQ0FBQyxhQUFvRDtRQUN2RixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBa0IsQ0FBQztRQUV4QyxLQUFLLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxjQUFjLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEYsSUFBSSxjQUFjLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3RDLDBGQUEwRjtnQkFDMUYsU0FBUzthQUNWO1lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxlQUFnQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ2pHLEtBQUssTUFBTSxZQUFZLElBQUksS0FBSyxFQUFFO2dCQUNoQyxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUNQLGlCQUFpQjtvQkFDakIsWUFBWTtvQkFDWixZQUFZLEVBQUUsY0FBYyxDQUFDLFlBQVk7b0JBQ3pDLFlBQVksRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQyxZQUFhO29CQUNwRyxRQUFRLEVBQUUsY0FBYyxDQUFDLGFBQWEsSUFBSSxjQUFjLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztvQkFDcEYsUUFBUSxFQUFFLGNBQWMsQ0FBQyxhQUFhLElBQUksY0FBYyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7aUJBQ3JGLENBQUMsQ0FBQzthQUNKO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLDRCQUE0QixDQUFDLGFBQW9EO1FBQ3ZGLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFrQixDQUFDO1FBRXhDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFFdEYsS0FBSyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3hGLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBRWxDLE1BQU0sV0FBVyxHQUFHO2dCQUNsQixhQUFhLEVBQUUsY0FBYyxDQUFDLGFBQWE7Z0JBQzNDLGFBQWEsRUFBRSxjQUFjLENBQUMsYUFBYTtnQkFDM0MsaUJBQWlCO2FBQ2xCLENBQUM7WUFFRixvR0FBb0c7WUFDcEcsSUFBSSxjQUFjLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3RDLHNCQUFzQjtnQkFDdEIsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLGVBQWdCLENBQUMsRUFBRTtvQkFDM0QsR0FBRyxDQUFDLElBQUksQ0FBQzt3QkFDUCxHQUFHLFdBQVc7d0JBQ2QsYUFBYSxFQUFFLFNBQVM7d0JBQ3hCLFlBQVksRUFBRSxjQUFjLENBQUMsZUFBZ0I7d0JBQzdDLFlBQVksRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLGVBQWdCLENBQUMsQ0FBQyxZQUFhO3FCQUMzRixDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLGVBQWdCLENBQUMsRUFBRTtvQkFDM0QsR0FBRyxDQUFDLElBQUksQ0FBQzt3QkFDUCxHQUFHLFdBQVc7d0JBQ2QsYUFBYSxFQUFFLFNBQVM7d0JBQ3hCLFlBQVksRUFBRSxjQUFjLENBQUMsZUFBZ0I7d0JBQzdDLFlBQVksRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLGVBQWdCLENBQUMsQ0FBQyxZQUFhO3FCQUMzRixDQUFDLENBQUM7aUJBQ0o7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUU7b0JBQ3ZELEdBQUcsQ0FBQyxJQUFJLENBQUM7d0JBQ1AsR0FBRyxXQUFXO3dCQUNkLFlBQVksRUFBRSxjQUFjLENBQUMsWUFBWTt3QkFDekMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsWUFBYTtxQkFDdkYsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7U0FDRjtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBcExELG9DQW9MQztBQW1GRDs7R0FFRztBQUNILE1BQWEsVUFBVTtJQVFyQjs7O09BR0c7SUFDSCxZQUE0QixRQUErQixFQUFrQixRQUErQjtRQUFoRixhQUFRLEdBQVIsUUFBUSxDQUF1QjtRQUFrQixhQUFRLEdBQVIsUUFBUSxDQUF1QjtRQUMxRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUNwRCxNQUFNLElBQUksdUJBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSwyQ0FBMkMsRUFBRSxDQUFDLENBQUM7U0FDcEY7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBQSxnQkFBUyxFQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7SUFDckMsQ0FBQztJQUVELGlGQUFpRjtJQUNqRixJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVM7ZUFDN0IsSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBbENELGdDQWtDQztBQUVELE1BQWEsa0JBQThCLFNBQVEsVUFBcUI7SUFHdEUsWUFBWSxRQUErQixFQUFFLFFBQStCLEVBQUUsSUFBdUM7UUFDbkgsS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDeEMsQ0FBQztDQUNGO0FBUEQsZ0RBT0M7QUFFRCxNQUFhLG9CQUFvQjtJQUMvQixZQUE2QixLQUFpQztRQUFqQyxVQUFLLEdBQUwsS0FBSyxDQUE0QjtJQUFHLENBQUM7SUFFbEUsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVDLENBQUM7SUFFTSxHQUFHLENBQUMsU0FBaUI7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsU0FBUyxHQUFHLENBQUMsQ0FBQztTQUFFO1FBQzFFLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsU0FBMkM7UUFDdkQsTUFBTSxVQUFVLEdBQStCLEVBQUcsQ0FBQztRQUNuRCxLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFOUIsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25CLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDdkI7U0FDRjtRQUVELE9BQU8sSUFBSSxvQkFBb0IsQ0FBTyxVQUFVLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGlCQUFpQixDQUFDLEVBQXlDO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxFQUFvQyxDQUFDO1FBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFvQyxDQUFDO1FBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxFQUFvQyxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxFQUFvQyxDQUFDO1FBRTdELEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN2QyxNQUFNLE1BQU0sR0FBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBRSxDQUFDO1lBQzNDLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtnQkFDckIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ25DO2lCQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ3JDO2lCQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ3JDO2lCQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtnQkFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ3BDO1NBQ0Y7UUFFRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDaEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNGO0FBekVELG9EQXlFQztBQXNCRCxNQUFhLG1CQUFvQixTQUFRLFVBQXFCO0NBRTdEO0FBRkQsa0RBRUM7QUFHRCxNQUFhLGlCQUFrQixTQUFRLFVBQW1CO0NBRXpEO0FBRkQsOENBRUM7QUFHRCxNQUFhLGtCQUFtQixTQUFRLFVBQW9CO0NBRTNEO0FBRkQsZ0RBRUM7QUFHRCxNQUFhLGdCQUFpQixTQUFRLFVBQWtCO0NBRXZEO0FBRkQsNENBRUM7QUFHRCxNQUFhLG1CQUFvQixTQUFRLFVBQXFCO0NBRTdEO0FBRkQsa0RBRUM7QUFFRCxJQUFZLGNBZVg7QUFmRCxXQUFZLGNBQWM7SUFDeEIscURBQXFEO0lBQ3JELDZDQUEyQixDQUFBO0lBQzNCLDhDQUE4QztJQUM5Qyw2Q0FBMkIsQ0FBQTtJQUMzQixzREFBc0Q7SUFDdEQsK0NBQTZCLENBQUE7SUFDN0IscURBQXFEO0lBQ3JELDZDQUEyQixDQUFBO0lBQzNCLHVEQUF1RDtJQUN2RCwrQ0FBNkIsQ0FBQTtJQUM3QixxRkFBcUY7SUFDckYsNkNBQTJCLENBQUE7SUFDM0IsMENBQTBDO0lBQzFDLHlDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFmVyxjQUFjLDhCQUFkLGNBQWMsUUFlekI7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxHQUFtQixFQUFFLEdBQW9CO0lBQzVELElBQUksQ0FBQyxHQUFHLEVBQUU7UUFBRSxPQUFPLEdBQUcsQ0FBQztLQUFFO0lBQ3pCLE1BQU0sT0FBTyxHQUFHO1FBQ2QsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM3QixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQy9CLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMvQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQy9CLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDaEMsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztLQUNqQyxDQUFDO0lBQ0YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUNqRCxDQUFDO0FBU0Q7Ozs7R0FJRztBQUNILE1BQWEsa0JBQWtCO0lBb0I3QixZQUNrQixRQUE4QixFQUM5QixRQUE4QixFQUM5QyxJQUlDO1FBTmUsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7UUFDOUIsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7UUFPOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLEtBQUssU0FBUyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxLQUFLLFNBQVMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDbkYsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFlBQVk7UUFDckIsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsbUJBQW1CO1FBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxTQUFTO2VBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxLQUFLLFNBQVM7ZUFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQVcsWUFBWTtRQUNyQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7U0FDM0U7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBUSxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksaUJBQWlCLENBQUMsWUFBb0IsRUFBRSxNQUErQjtRQUM1RSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLHVCQUF1QjtRQUN2QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFO1lBQzdELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUFFLE9BQU8sY0FBYyxDQUFDLFdBQVcsQ0FBQzthQUFFO1lBQ3BGLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUM1QyxPQUFPLElBQUksQ0FBQyxRQUFTLENBQUMsY0FBYyxLQUFLLFFBQVE7b0JBQy9DLENBQUMsQ0FBQyxjQUFjLENBQUMsV0FBVztvQkFDNUIsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7YUFDakM7WUFDRCxPQUFPLGNBQWMsQ0FBQyxZQUFZLENBQUM7U0FDcEM7UUFFRCxvRUFBb0U7UUFDcEUscUZBQXFGO1FBQ3JGLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7UUFFckgsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7YUFDckMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQzthQUM1QixNQUFNLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZUFBZTtRQUN4QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU07Y0FDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQixDQUFDLEVBQXVHO1FBQzlILEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDMUQsRUFBRSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2RCxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDeEM7SUFDSCxDQUFDO0NBQ0Y7QUE3SkQsZ0RBNkpDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUksSUFBbUI7SUFDekQsT0FBUSxJQUE4QixDQUFDLFlBQVksS0FBSyxTQUFTLENBQUM7QUFDcEUsQ0FBQztBQUZELG9EQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FBOEIsRUFBc0I7SUFDdEUsTUFBTSxHQUFHLEdBQXlCLEVBQUUsQ0FBQztJQUNyQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUM1QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUNqQjtLQUNGO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNzZXJ0aW9uRXJyb3IgfSBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgY2Zuc3BlYyBmcm9tICdAYXdzLWNkay9jZm5zcGVjJztcbmltcG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBJYW1DaGFuZ2VzIH0gZnJvbSAnLi4vaWFtL2lhbS1jaGFuZ2VzJztcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXBDaGFuZ2VzIH0gZnJvbSAnLi4vbmV0d29yay9zZWN1cml0eS1ncm91cC1jaGFuZ2VzJztcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlNYXAgPSB7W2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKiBTZW1hbnRpYyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZXMuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVEaWZmIGltcGxlbWVudHMgSVRlbXBsYXRlRGlmZiB7XG4gIHB1YmxpYyBhd3NUZW1wbGF0ZUZvcm1hdFZlcnNpb24/OiBEaWZmZXJlbmNlPHN0cmluZz47XG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IERpZmZlcmVuY2U8c3RyaW5nPjtcbiAgcHVibGljIHRyYW5zZm9ybT86IERpZmZlcmVuY2U8c3RyaW5nPjtcbiAgcHVibGljIGNvbmRpdGlvbnM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPENvbmRpdGlvbiwgQ29uZGl0aW9uRGlmZmVyZW5jZT47XG4gIHB1YmxpYyBtYXBwaW5nczogRGlmZmVyZW5jZUNvbGxlY3Rpb248TWFwcGluZywgTWFwcGluZ0RpZmZlcmVuY2U+O1xuICBwdWJsaWMgbWV0YWRhdGE6IERpZmZlcmVuY2VDb2xsZWN0aW9uPE1ldGFkYXRhLCBNZXRhZGF0YURpZmZlcmVuY2U+O1xuICBwdWJsaWMgb3V0cHV0czogRGlmZmVyZW5jZUNvbGxlY3Rpb248T3V0cHV0LCBPdXRwdXREaWZmZXJlbmNlPjtcbiAgcHVibGljIHBhcmFtZXRlcnM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPFBhcmFtZXRlciwgUGFyYW1ldGVyRGlmZmVyZW5jZT47XG4gIHB1YmxpYyByZXNvdXJjZXM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPFJlc291cmNlLCBSZXNvdXJjZURpZmZlcmVuY2U+O1xuICAvKiogVGhlIGRpZmZlcmVuY2VzIGluIHVua25vd24vdW5leHBlY3RlZCBwYXJ0cyBvZiB0aGUgdGVtcGxhdGUgKi9cbiAgcHVibGljIHVua25vd246IERpZmZlcmVuY2VDb2xsZWN0aW9uPGFueSwgRGlmZmVyZW5jZTxhbnk+PjtcblxuICAvKipcbiAgICogQ2hhbmdlcyB0byBJQU0gcG9saWNpZXNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpYW1DaGFuZ2VzOiBJYW1DaGFuZ2VzO1xuXG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRvIFNlY3VyaXR5IEdyb3VwIGluZ3Jlc3MgYW5kIGVncmVzcyBydWxlc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBDaGFuZ2VzOiBTZWN1cml0eUdyb3VwQ2hhbmdlcztcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBJVGVtcGxhdGVEaWZmKSB7XG4gICAgaWYgKGFyZ3MuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uID0gYXJncy5hd3NUZW1wbGF0ZUZvcm1hdFZlcnNpb247XG4gICAgfVxuICAgIGlmIChhcmdzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBhcmdzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAoYXJncy50cmFuc2Zvcm0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy50cmFuc2Zvcm0gPSBhcmdzLnRyYW5zZm9ybTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmRpdGlvbnMgPSBhcmdzLmNvbmRpdGlvbnMgfHwgbmV3IERpZmZlcmVuY2VDb2xsZWN0aW9uKHt9KTtcbiAgICB0aGlzLm1hcHBpbmdzID0gYXJncy5tYXBwaW5ncyB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuICAgIHRoaXMubWV0YWRhdGEgPSBhcmdzLm1ldGFkYXRhIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5vdXRwdXRzID0gYXJncy5vdXRwdXRzIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5wYXJhbWV0ZXJzID0gYXJncy5wYXJhbWV0ZXJzIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5yZXNvdXJjZXMgPSBhcmdzLnJlc291cmNlcyB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuICAgIHRoaXMudW5rbm93biA9IGFyZ3MudW5rbm93biB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuXG4gICAgdGhpcy5pYW1DaGFuZ2VzID0gbmV3IElhbUNoYW5nZXMoe1xuICAgICAgcHJvcGVydHlDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVQcm9wZXJ0eUNoYW5nZXMoSWFtQ2hhbmdlcy5JYW1Qcm9wZXJ0eVNjcnV0aW5pZXMpLFxuICAgICAgcmVzb3VyY2VDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVSZXNvdXJjZUNoYW5nZXMoSWFtQ2hhbmdlcy5JYW1SZXNvdXJjZVNjcnV0aW5pZXMpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWN1cml0eUdyb3VwQ2hhbmdlcyA9IG5ldyBTZWN1cml0eUdyb3VwQ2hhbmdlcyh7XG4gICAgICBlZ3Jlc3NSdWxlUHJvcGVydHlDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVQcm9wZXJ0eUNoYW5nZXMoW2NmbnNwZWMuc2NoZW1hLlByb3BlcnR5U2NydXRpbnlUeXBlLkVncmVzc1J1bGVzXSksXG4gICAgICBpbmdyZXNzUnVsZVByb3BlcnR5Q2hhbmdlczogdGhpcy5zY3J1dGluaXphYmxlUHJvcGVydHlDaGFuZ2VzKFtjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmdyZXNzUnVsZXNdKSxcbiAgICAgIGVncmVzc1J1bGVSZXNvdXJjZUNoYW5nZXM6IHRoaXMuc2NydXRpbml6YWJsZVJlc291cmNlQ2hhbmdlcyhbY2Zuc3BlYy5zY2hlbWEuUmVzb3VyY2VTY3J1dGlueVR5cGUuRWdyZXNzUnVsZVJlc291cmNlXSksXG4gICAgICBpbmdyZXNzUnVsZVJlc291cmNlQ2hhbmdlczogdGhpcy5zY3J1dGluaXphYmxlUmVzb3VyY2VDaGFuZ2VzKFtjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZS5JbmdyZXNzUnVsZVJlc291cmNlXSksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuXG4gICAgaWYgKHRoaXMuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLnRyYW5zZm9ybSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cblxuICAgIGNvdW50ICs9IHRoaXMuY29uZGl0aW9ucy5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5tYXBwaW5ncy5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5tZXRhZGF0YS5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5vdXRwdXRzLmRpZmZlcmVuY2VDb3VudDtcbiAgICBjb3VudCArPSB0aGlzLnBhcmFtZXRlcnMuZGlmZmVyZW5jZUNvdW50O1xuICAgIGNvdW50ICs9IHRoaXMucmVzb3VyY2VzLmRpZmZlcmVuY2VDb3VudDtcbiAgICBjb3VudCArPSB0aGlzLnVua25vd24uZGlmZmVyZW5jZUNvdW50O1xuXG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpZmZlcmVuY2VDb3VudCA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIHBlcm1pc3Npb25zIG9iamVjdHMgaW52b2x2ZSBhIGJyb2FkZW5pbmcgb2YgcGVybWlzc2lvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnNCcm9hZGVuZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWFtQ2hhbmdlcy5wZXJtaXNzaW9uc0Jyb2FkZW5lZCB8fCB0aGlzLnNlY3VyaXR5R3JvdXBDaGFuZ2VzLnJ1bGVzQWRkZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBwZXJtaXNzaW9ucyBvYmplY3RzIGhhdmUgY2hhbmdlZFxuICAgKi9cbiAgcHVibGljIGdldCBwZXJtaXNzaW9uc0FueUNoYW5nZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWFtQ2hhbmdlcy5oYXNDaGFuZ2VzIHx8IHRoaXMuc2VjdXJpdHlHcm91cENoYW5nZXMuaGFzQ2hhbmdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIHByb3BlcnR5IGNoYW5nZXMgb2YgYSBnaXZlbiBzY3J1dGlueSB0eXBlXG4gICAqXG4gICAqIFdlIGRvbid0IGp1c3QgbG9vayBhdCBwcm9wZXJ0eSB1cGRhdGVzOyB3ZSBhbHNvIGxvb2sgYXQgcmVzb3VyY2UgYWRkaXRpb25zIGFuZCBkZWxldGlvbnMgKGluIHdoaWNoXG4gICAqIGNhc2UgdGhlcmUgaXMgbm8gZnVydGhlciBkZXRhaWwgb24gcHJvcGVydHkgdmFsdWVzKSwgYW5kIHJlc291cmNlIHR5cGUgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgc2NydXRpbml6YWJsZVByb3BlcnR5Q2hhbmdlcyhzY3J1dGlueVR5cGVzOiBjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZVtdKTogUHJvcGVydHlDaGFuZ2VbXSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFByb3BlcnR5Q2hhbmdlPigpO1xuXG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2VMb2dpY2FsSWQsIHJlc291cmNlQ2hhbmdlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnJlc291cmNlcy5jaGFuZ2VzKSkge1xuICAgICAgaWYgKHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgICAgLy8gd2UgaWdub3JlIHJlc291cmNlIHR5cGUgY2hhbmdlcyBoZXJlLCBhbmQgaGFuZGxlIHRoZW0gaW4gc2NydXRpbml6YWJsZVJlc291cmNlQ2hhbmdlcygpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wcyA9IGNmbnNwZWMuc2NydXRpbml6YWJsZVByb3BlcnR5TmFtZXMocmVzb3VyY2VDaGFuZ2UubmV3UmVzb3VyY2VUeXBlISwgc2NydXRpbnlUeXBlcyk7XG4gICAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBwcm9wcykge1xuICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgcmVzb3VyY2VMb2dpY2FsSWQsXG4gICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgIHJlc291cmNlVHlwZTogcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VUeXBlLFxuICAgICAgICAgIHNjcnV0aW55VHlwZTogY2Zuc3BlYy5wcm9wZXJ0eVNwZWNpZmljYXRpb24ocmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VUeXBlLCBwcm9wZXJ0eU5hbWUpLlNjcnV0aW55VHlwZSEsXG4gICAgICAgICAgb2xkVmFsdWU6IHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMgJiYgcmVzb3VyY2VDaGFuZ2Uub2xkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLFxuICAgICAgICAgIG5ld1ZhbHVlOiByZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzICYmIHJlc291cmNlQ2hhbmdlLm5ld1Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIHJlc291cmNlIGNoYW5nZXMgb2YgYSBnaXZlbiBzY3J1dGlueSB0eXBlXG4gICAqXG4gICAqIFdlIGRvbid0IGp1c3QgbG9vayBhdCByZXNvdXJjZSB1cGRhdGVzOyB3ZSBhbHNvIGxvb2sgYXQgcmVzb3VyY2UgYWRkaXRpb25zIGFuZCBkZWxldGlvbnMgKGluIHdoaWNoXG4gICAqIGNhc2UgdGhlcmUgaXMgbm8gZnVydGhlciBkZXRhaWwgb24gcHJvcGVydHkgdmFsdWVzKSwgYW5kIHJlc291cmNlIHR5cGUgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgc2NydXRpbml6YWJsZVJlc291cmNlQ2hhbmdlcyhzY3J1dGlueVR5cGVzOiBjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZVtdKTogUmVzb3VyY2VDaGFuZ2VbXSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFJlc291cmNlQ2hhbmdlPigpO1xuXG4gICAgY29uc3Qgc2NydXRpbml6YWJsZVR5cGVzID0gbmV3IFNldChjZm5zcGVjLnNjcnV0aW5pemFibGVSZXNvdXJjZVR5cGVzKHNjcnV0aW55VHlwZXMpKTtcblxuICAgIGZvciAoY29uc3QgW3Jlc291cmNlTG9naWNhbElkLCByZXNvdXJjZUNoYW5nZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZXNvdXJjZXMuY2hhbmdlcykpIHtcbiAgICAgIGlmICghcmVzb3VyY2VDaGFuZ2UpIHsgY29udGludWU7IH1cblxuICAgICAgY29uc3QgY29tbW9uUHJvcHMgPSB7XG4gICAgICAgIG9sZFByb3BlcnRpZXM6IHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMsXG4gICAgICAgIG5ld1Byb3BlcnRpZXM6IHJlc291cmNlQ2hhbmdlLm5ld1Byb3BlcnRpZXMsXG4gICAgICAgIHJlc291cmNlTG9naWNhbElkLFxuICAgICAgfTtcblxuICAgICAgLy8gY2hhbmdlcyB0byB0aGUgVHlwZSBvZiByZXNvdXJjZXMgY2FuIGhhcHBlbiB3aGVuIG1pZ3JhdGluZyBmcm9tIENGTiB0ZW1wbGF0ZXMgdGhhdCB1c2UgVHJhbnNmb3Jtc1xuICAgICAgaWYgKHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgICAgLy8gVHJlYXQgYXMgREVMRVRFK0FERFxuICAgICAgICBpZiAoc2NydXRpbml6YWJsZVR5cGVzLmhhcyhyZXNvdXJjZUNoYW5nZS5vbGRSZXNvdXJjZVR5cGUhKSkge1xuICAgICAgICAgIHJldC5wdXNoKHtcbiAgICAgICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICAgICAgbmV3UHJvcGVydGllczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVzb3VyY2VUeXBlOiByZXNvdXJjZUNoYW5nZS5vbGRSZXNvdXJjZVR5cGUhLFxuICAgICAgICAgICAgc2NydXRpbnlUeXBlOiBjZm5zcGVjLnJlc291cmNlU3BlY2lmaWNhdGlvbihyZXNvdXJjZUNoYW5nZS5vbGRSZXNvdXJjZVR5cGUhKS5TY3J1dGlueVR5cGUhLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY3J1dGluaXphYmxlVHlwZXMuaGFzKHJlc291cmNlQ2hhbmdlLm5ld1Jlc291cmNlVHlwZSEpKSB7XG4gICAgICAgICAgcmV0LnB1c2goe1xuICAgICAgICAgICAgLi4uY29tbW9uUHJvcHMsXG4gICAgICAgICAgICBvbGRQcm9wZXJ0aWVzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICByZXNvdXJjZVR5cGU6IHJlc291cmNlQ2hhbmdlLm5ld1Jlc291cmNlVHlwZSEsXG4gICAgICAgICAgICBzY3J1dGlueVR5cGU6IGNmbnNwZWMucmVzb3VyY2VTcGVjaWZpY2F0aW9uKHJlc291cmNlQ2hhbmdlLm5ld1Jlc291cmNlVHlwZSEpLlNjcnV0aW55VHlwZSEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzY3J1dGluaXphYmxlVHlwZXMuaGFzKHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZSkpIHtcbiAgICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgICAuLi5jb21tb25Qcm9wcyxcbiAgICAgICAgICAgIHJlc291cmNlVHlwZTogcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VUeXBlLFxuICAgICAgICAgICAgc2NydXRpbnlUeXBlOiBjZm5zcGVjLnJlc291cmNlU3BlY2lmaWNhdGlvbihyZXNvdXJjZUNoYW5nZS5yZXNvdXJjZVR5cGUpLlNjcnV0aW55VHlwZSEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG5cbi8qKlxuICogQSBjaGFuZ2UgaW4gcHJvcGVydHkgdmFsdWVzXG4gKlxuICogTm90IG5lY2Vzc2FyaWx5IGFuIHVwZGF0ZSwgaXQgY291bGQgYmUgdGhhdCB0aGVyZSB1c2VkIHRvIGJlIG5vIHZhbHVlIHRoZXJlXG4gKiBiZWNhdXNlIHRoZXJlIHdhcyBubyByZXNvdXJjZSwgYW5kIG5vdyB0aGVyZSBpcyAob3IgdmljZSB2ZXJzYSkuXG4gKlxuICogVGhlcmVmb3JlLCB3ZSBqdXN0IGNvbnRhaW4gcGxhaW4gdmFsdWVzIGFuZCBub3QgYSBQcm9wZXJ0eURpZmZlcmVuY2U8YW55Pi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eUNoYW5nZSB7XG4gIC8qKlxuICAgKiBMb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZSB3aGVyZSB0aGlzIHByb3BlcnR5IGNoYW5nZSB3YXMgZm91bmRcbiAgICovXG4gIHJlc291cmNlTG9naWNhbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogU2NydXRpbnkgdHlwZSBmb3IgdGhpcyBwcm9wZXJ0eSBjaGFuZ2VcbiAgICovXG4gIHNjcnV0aW55VHlwZTogY2Zuc3BlYy5zY2hlbWEuUHJvcGVydHlTY3J1dGlueVR5cGU7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgaXMgY2hhbmdpbmdcbiAgICovXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHByb3BlcnR5IHZhbHVlXG4gICAqL1xuICBvbGRWYWx1ZT86IGFueTtcblxuICAvKipcbiAgICogVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZVxuICAgKi9cbiAgbmV3VmFsdWU/OiBhbnk7XG59XG5cbi8qKlxuICogQSByZXNvdXJjZSBjaGFuZ2VcbiAqXG4gKiBFaXRoZXIgYSBjcmVhdGlvbiwgZGVsZXRpb24gb3IgdXBkYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlQ2hhbmdlIHtcbiAgLyoqXG4gICAqIExvZ2ljYWwgSUQgb2YgdGhlIHJlc291cmNlIHdoZXJlIHRoaXMgcHJvcGVydHkgY2hhbmdlIHdhcyBmb3VuZFxuICAgKi9cbiAgcmVzb3VyY2VMb2dpY2FsSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU2NydXRpbnkgdHlwZSBmb3IgdGhpcyByZXNvdXJjZSBjaGFuZ2VcbiAgICovXG4gIHNjcnV0aW55VHlwZTogY2Zuc3BlYy5zY2hlbWEuUmVzb3VyY2VTY3J1dGlueVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcHJvcGVydGllcyB2YWx1ZSAobWlnaHQgYmUgdW5kZWZpbmVkIGluIGNhc2Ugb2YgY3JlYXRpb24pXG4gICAqL1xuICBvbGRQcm9wZXJ0aWVzPzogUHJvcGVydHlNYXA7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgcHJvcGVydGllcyB2YWx1ZSAobWlnaHQgYmUgdW5kZWZpbmVkIGluIGNhc2Ugb2YgZGVsZXRpb24pXG4gICAqL1xuICBuZXdQcm9wZXJ0aWVzPzogUHJvcGVydHlNYXA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpZmZlcmVuY2U8VmFsdWVUeXBlPiB7XG4gIHJlYWRvbmx5IG9sZFZhbHVlOiBWYWx1ZVR5cGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG5ld1ZhbHVlOiBWYWx1ZVR5cGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGlzRGlmZmVyZW50OiBib29sZWFuO1xuICByZWFkb25seSBpc0FkZGl0aW9uOiBib29sZWFuO1xuICByZWFkb25seSBpc1JlbW92YWw6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzVXBkYXRlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vZGVscyBhbiBlbnRpdHkgdGhhdCBjaGFuZ2VkIGJldHdlZW4gdHdvIHZlcnNpb25zIG9mIGEgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaWZmZXJlbmNlPFZhbHVlVHlwZT4gaW1wbGVtZW50cyBJRGlmZmVyZW5jZTxWYWx1ZVR5cGU+IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpcyBhbiBhY3R1YWwgZGlmZmVyZW50IG9yIHRoZSB2YWx1ZXMgYXJlIGFjdHVhbGx5IHRoZSBzYW1lXG4gICAqXG4gICAqIGlzRGlmZmVyZW50ID0+IChpc1VwZGF0ZSB8IGlzUmVtb3ZlZCB8IGlzVXBkYXRlKVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzRGlmZmVyZW50OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCB2YWx1ZSwgY2Fubm90IGJlIGVxdWFsICh0byB0aGUgc2Vuc2Ugb2YgK2RlZXBFcXVhbCspIHRvICtuZXdWYWx1ZSsuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlLCBjYW5ub3QgYmUgZXF1YWwgKHRvIHRoZSBzZW5zZSBvZiArZGVlcEVxdWFsKykgdG8gK29sZFZhbHVlKy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBvbGRWYWx1ZTogVmFsdWVUeXBlIHwgdW5kZWZpbmVkLCBwdWJsaWMgcmVhZG9ubHkgbmV3VmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6ICdvbGRWYWx1ZSBhbmQgbmV3VmFsdWUgYXJlIGJvdGggdW5kZWZpbmVkIScgfSk7XG4gICAgfVxuICAgIHRoaXMuaXNEaWZmZXJlbnQgPSAhZGVlcEVxdWFsKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gIH1cblxuICAvKiogQHJldHVybnMgK3RydWUrIGlmIHRoZSBlbGVtZW50IGlzIG5ldyB0byB0aGUgdGVtcGxhdGUuICovXG4gIHB1YmxpYyBnZXQgaXNBZGRpdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vbGRWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEByZXR1cm5zICt0cnVlKyBpZiB0aGUgZWxlbWVudCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB0ZW1wbGF0ZS4gKi9cbiAgcHVibGljIGdldCBpc1JlbW92YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyArdHJ1ZSsgaWYgdGhlIGVsZW1lbnQgd2FzIGFscmVhZHkgaW4gdGhlIHRlbXBsYXRlIGFuZCBpcyB1cGRhdGVkLiAqL1xuICBwdWJsaWMgZ2V0IGlzVXBkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9sZFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICYmIHRoaXMubmV3VmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlEaWZmZXJlbmNlPFZhbHVlVHlwZT4gZXh0ZW5kcyBEaWZmZXJlbmNlPFZhbHVlVHlwZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlSW1wYWN0PzogUmVzb3VyY2VJbXBhY3Q7XG5cbiAgY29uc3RydWN0b3Iob2xkVmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCwgYXJnczogeyBjaGFuZ2VJbXBhY3Q/OiBSZXNvdXJjZUltcGFjdCB9KSB7XG4gICAgc3VwZXIob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLmNoYW5nZUltcGFjdCA9IGFyZ3MuY2hhbmdlSW1wYWN0O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUIGV4dGVuZHMgSURpZmZlcmVuY2U8Vj4+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkaWZmczogeyBbbG9naWNhbElkOiBzdHJpbmddOiBUIH0pIHt9XG5cbiAgcHVibGljIGdldCBjaGFuZ2VzKCk6IHsgW2xvZ2ljYWxJZDogc3RyaW5nXTogVCB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5kaWZmcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY2hhbmdlcykubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGdldChsb2dpY2FsSWQ6IHN0cmluZyk6IFQge1xuICAgIGNvbnN0IHJldCA9IHRoaXMuZGlmZnNbbG9naWNhbElkXTtcbiAgICBpZiAoIXJldCkgeyB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCB3aXRoIGxvZ2ljYWwgSUQgJyR7bG9naWNhbElkfSdgKTsgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvZ2ljYWxJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgVGVtcGxhdGVEaWZmIHdoaWNoIG9ubHkgY29udGFpbnMgY2hhbmdlcyBmb3Igd2hpY2ggYHByZWRpY2F0ZWBcbiAgICogcmV0dXJucyBgdHJ1ZWAuXG4gICAqL1xuICBwdWJsaWMgZmlsdGVyKHByZWRpY2F0ZTogKGRpZmY6IFQgfCB1bmRlZmluZWQpID0+IGJvb2xlYW4pOiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUPiB7XG4gICAgY29uc3QgbmV3Q2hhbmdlczogeyBbbG9naWNhbElkOiBzdHJpbmddOiBUIH0gPSB7IH07XG4gICAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpKSB7XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5jaGFuZ2VzW2lkXTtcblxuICAgICAgaWYgKHByZWRpY2F0ZShkaWZmKSkge1xuICAgICAgICBuZXdDaGFuZ2VzW2lkXSA9IGRpZmY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUPihuZXdDaGFuZ2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGBjYmAgZm9yIGFsbCBjaGFuZ2VzIGluIHRoaXMgY29sbGVjdGlvbi5cbiAgICpcbiAgICogQ2hhbmdlcyB3aWxsIGJlIHNvcnRlZCBhcyBmb2xsb3dzOlxuICAgKiAgLSBSZW1vdmVkXG4gICAqICAtIEFkZGVkXG4gICAqICAtIFVwZGF0ZWRcbiAgICogIC0gT3RoZXJzXG4gICAqXG4gICAqIEBwYXJhbSBjYlxuICAgKi9cbiAgcHVibGljIGZvckVhY2hEaWZmZXJlbmNlKGNiOiAobG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogVCkgPT4gYW55KTogdm9pZCB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcbiAgICBjb25zdCBhZGRlZCA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcbiAgICBjb25zdCB1cGRhdGVkID0gbmV3IEFycmF5PHsgbG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogVCB9PigpO1xuICAgIGNvbnN0IG90aGVycyA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcblxuICAgIGZvciAoY29uc3QgbG9naWNhbElkIG9mIHRoaXMubG9naWNhbElkcykge1xuICAgICAgY29uc3QgY2hhbmdlOiBUID0gdGhpcy5jaGFuZ2VzW2xvZ2ljYWxJZF0hO1xuICAgICAgaWYgKGNoYW5nZS5pc0FkZGl0aW9uKSB7XG4gICAgICAgIGFkZGVkLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmlzUmVtb3ZhbCkge1xuICAgICAgICByZW1vdmVkLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmlzVXBkYXRlKSB7XG4gICAgICAgIHVwZGF0ZWQucHVzaCh7IGxvZ2ljYWxJZCwgY2hhbmdlIH0pO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2UuaXNEaWZmZXJlbnQpIHtcbiAgICAgICAgb3RoZXJzLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVkLmZvckVhY2godiA9PiBjYih2LmxvZ2ljYWxJZCwgdi5jaGFuZ2UpKTtcbiAgICBhZGRlZC5mb3JFYWNoKHYgPT4gY2Iodi5sb2dpY2FsSWQsIHYuY2hhbmdlKSk7XG4gICAgdXBkYXRlZC5mb3JFYWNoKHYgPT4gY2Iodi5sb2dpY2FsSWQsIHYuY2hhbmdlKSk7XG4gICAgb3RoZXJzLmZvckVhY2godiA9PiBjYih2LmxvZ2ljYWxJZCwgdi5jaGFuZ2UpKTtcbiAgfVxufVxuXG4vKipcbiAqIEFyZ3VtZW50cyBleHBlY3RlZCBieSB0aGUgY29uc3RydWN0b3Igb2YgK1RlbXBsYXRlRGlmZissIGV4dHJhY3RlZCBhcyBhbiBpbnRlcmZhY2UgZm9yIHRoZSBzYWtlXG4gKiBvZiAocmVsYXRpdmUpIGNvbmNpc2VuZXNzIG9mIHRoZSBjb25zdHJ1Y3RvcidzIHNpZ25hdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVGVtcGxhdGVEaWZmIHtcbiAgYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uPzogSURpZmZlcmVuY2U8c3RyaW5nPjtcbiAgZGVzY3JpcHRpb24/OiBJRGlmZmVyZW5jZTxzdHJpbmc+O1xuICB0cmFuc2Zvcm0/OiBJRGlmZmVyZW5jZTxzdHJpbmc+O1xuXG4gIGNvbmRpdGlvbnM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxDb25kaXRpb24sIENvbmRpdGlvbkRpZmZlcmVuY2U+O1xuICBtYXBwaW5ncz86IERpZmZlcmVuY2VDb2xsZWN0aW9uPE1hcHBpbmcsIE1hcHBpbmdEaWZmZXJlbmNlPjtcbiAgbWV0YWRhdGE/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxNZXRhZGF0YSwgTWV0YWRhdGFEaWZmZXJlbmNlPjtcbiAgb3V0cHV0cz86IERpZmZlcmVuY2VDb2xsZWN0aW9uPE91dHB1dCwgT3V0cHV0RGlmZmVyZW5jZT47XG4gIHBhcmFtZXRlcnM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxQYXJhbWV0ZXIsIFBhcmFtZXRlckRpZmZlcmVuY2U+O1xuICByZXNvdXJjZXM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxSZXNvdXJjZSwgUmVzb3VyY2VEaWZmZXJlbmNlPjtcblxuICB1bmtub3duPzogRGlmZmVyZW5jZUNvbGxlY3Rpb248YW55LCBJRGlmZmVyZW5jZTxhbnk+Pjtcbn1cblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uID0gYW55O1xuZXhwb3J0IGNsYXNzIENvbmRpdGlvbkRpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPENvbmRpdGlvbj4ge1xuICAvLyBUT0RPOiBkZWZpbmUgc3BlY2lmaWMgZGlmZmVyZW5jZSBhdHRyaWJ1dGVzXG59XG5cbmV4cG9ydCB0eXBlIE1hcHBpbmcgPSBhbnk7XG5leHBvcnQgY2xhc3MgTWFwcGluZ0RpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE1hcHBpbmc+IHtcbiAgLy8gVE9ETzogZGVmaW5lIHNwZWNpZmljIGRpZmZlcmVuY2UgYXR0cmlidXRlc1xufVxuXG5leHBvcnQgdHlwZSBNZXRhZGF0YSA9IGFueTtcbmV4cG9ydCBjbGFzcyBNZXRhZGF0YURpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE1ldGFkYXRhPiB7XG4gIC8vIFRPRE86IGRlZmluZSBzcGVjaWZpYyBkaWZmZXJlbmNlIGF0dHJpYnV0ZXNcbn1cblxuZXhwb3J0IHR5cGUgT3V0cHV0ID0gYW55O1xuZXhwb3J0IGNsYXNzIE91dHB1dERpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE91dHB1dD4ge1xuICAvLyBUT0RPOiBkZWZpbmUgc3BlY2lmaWMgZGlmZmVyZW5jZSBhdHRyaWJ1dGVzXG59XG5cbmV4cG9ydCB0eXBlIFBhcmFtZXRlciA9IGFueTtcbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJEaWZmZXJlbmNlIGV4dGVuZHMgRGlmZmVyZW5jZTxQYXJhbWV0ZXI+IHtcbiAgLy8gVE9ETzogZGVmaW5lIHNwZWNpZmljIGRpZmZlcmVuY2UgYXR0cmlidXRlc1xufVxuXG5leHBvcnQgZW51bSBSZXNvdXJjZUltcGFjdCB7XG4gIC8qKiBUaGUgZXhpc3RpbmcgcGh5c2ljYWwgcmVzb3VyY2Ugd2lsbCBiZSB1cGRhdGVkICovXG4gIFdJTExfVVBEQVRFID0gJ1dJTExfVVBEQVRFJyxcbiAgLyoqIEEgbmV3IHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgY3JlYXRlZCAqL1xuICBXSUxMX0NSRUFURSA9ICdXSUxMX0NSRUFURScsXG4gIC8qKiBUaGUgZXhpc3RpbmcgcGh5c2ljYWwgcmVzb3VyY2Ugd2lsbCBiZSByZXBsYWNlZCAqL1xuICBXSUxMX1JFUExBQ0UgPSAnV0lMTF9SRVBMQUNFJyxcbiAgLyoqIFRoZSBleGlzdGluZyBwaHlzaWNhbCByZXNvdXJjZSBtYXkgYmUgcmVwbGFjZWQgKi9cbiAgTUFZX1JFUExBQ0UgPSAnTUFZX1JFUExBQ0UnLFxuICAvKiogVGhlIGV4aXN0aW5nIHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgZGVzdHJveWVkICovXG4gIFdJTExfREVTVFJPWSA9ICdXSUxMX0RFU1RST1knLFxuICAvKiogVGhlIGV4aXN0aW5nIHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIENsb3VkRm9ybWF0aW9uIHN1cGVydmlzaW9uICovXG4gIFdJTExfT1JQSEFOID0gJ1dJTExfT1JQSEFOJyxcbiAgLyoqIFRoZXJlIGlzIG5vIGNoYW5nZSBpbiB0aGlzIHJlc291cmNlICovXG4gIE5PX0NIQU5HRSA9ICdOT19DSEFOR0UnLFxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYXMgYSByZWR1Y2VyIHRvIG9idGFpbiB0aGUgcmVzb3VyY2UtbGV2ZWwgaW1wYWN0IG9mIGEgbGlzdFxuICogb2YgcHJvcGVydHktbGV2ZWwgaW1wYWN0cy5cbiAqIEBwYXJhbSBvbmUgdGhlIGN1cnJlbnQgd29yc3QgaW1wYWN0IHNvIGZhci5cbiAqIEBwYXJhbSB0d28gdGhlIG5ldyBpbXBhY3QgYmVpbmcgY29uc2lkZXJlZCAoY2FuIGJlIHVuZGVmaW5lZCwgYXMgd2UgbWF5IG5vdCBhbHdheXMgYmVcbiAqICAgICAgYWJsZSB0byBkZXRlcm1pbmUgc29tZSBwZXJvcGVydHkncyBpbXBhY3QpLlxuICovXG5mdW5jdGlvbiB3b3JzdEltcGFjdChvbmU6IFJlc291cmNlSW1wYWN0LCB0d28/OiBSZXNvdXJjZUltcGFjdCk6IFJlc291cmNlSW1wYWN0IHtcbiAgaWYgKCF0d28pIHsgcmV0dXJuIG9uZTsgfVxuICBjb25zdCBiYWRuZXNzID0ge1xuICAgIFtSZXNvdXJjZUltcGFjdC5OT19DSEFOR0VdOiAwLFxuICAgIFtSZXNvdXJjZUltcGFjdC5XSUxMX1VQREFURV06IDEsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFXTogMixcbiAgICBbUmVzb3VyY2VJbXBhY3QuV0lMTF9PUlBIQU5dOiAzLFxuICAgIFtSZXNvdXJjZUltcGFjdC5NQVlfUkVQTEFDRV06IDQsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRV06IDUsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfREVTVFJPWV06IDYsXG4gIH07XG4gIHJldHVybiBiYWRuZXNzW29uZV0gPiBiYWRuZXNzW3R3b10gPyBvbmUgOiB0d287XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2Uge1xuICBUeXBlOiBzdHJpbmc7XG4gIFByb3BlcnRpZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ2hhbmdlIHRvIGEgc2luZ2xlIHJlc291cmNlIGJldHdlZW4gdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlc1xuICpcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIG11dGF0ZWQgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VEaWZmZXJlbmNlIGltcGxlbWVudHMgSURpZmZlcmVuY2U8UmVzb3VyY2U+IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyByZXNvdXJjZSB3YXMgYWRkZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc0FkZGl0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcmVzb3VyY2Ugd2FzIHJlbW92ZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc1JlbW92YWw6IGJvb2xlYW47XG5cbiAgLyoqIFByb3BlcnR5LWxldmVsIGNoYW5nZXMgb24gdGhlIHJlc291cmNlICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlEaWZmczogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9O1xuXG4gIC8qKiBDaGFuZ2VzIHRvIG5vbi1wcm9wZXJ0eSBsZXZlbCBhdHRyaWJ1dGVzIG9mIHRoZSByZXNvdXJjZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG90aGVyRGlmZnM6IHsgW2tleTogc3RyaW5nXTogRGlmZmVyZW5jZTxhbnk+IH07XG5cbiAgLyoqIFRoZSByZXNvdXJjZSB0eXBlIChvciBvbGQgYW5kIG5ldyB0eXBlIGlmIGl0IGhhcyBjaGFuZ2VkKSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlVHlwZXM6IHsgcmVhZG9ubHkgb2xkVHlwZT86IHN0cmluZywgcmVhZG9ubHkgbmV3VHlwZT86IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBvbGRWYWx1ZTogUmVzb3VyY2UgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IG5ld1ZhbHVlOiBSZXNvdXJjZSB8IHVuZGVmaW5lZCxcbiAgICBhcmdzOiB7XG4gICAgICByZXNvdXJjZVR5cGU6IHsgb2xkVHlwZT86IHN0cmluZywgbmV3VHlwZT86IHN0cmluZyB9LFxuICAgICAgcHJvcGVydHlEaWZmczogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9LFxuICAgICAgb3RoZXJEaWZmczogeyBba2V5OiBzdHJpbmddOiBEaWZmZXJlbmNlPGFueT4gfVxuICAgIH0sXG4gICkge1xuICAgIHRoaXMucmVzb3VyY2VUeXBlcyA9IGFyZ3MucmVzb3VyY2VUeXBlO1xuICAgIHRoaXMucHJvcGVydHlEaWZmcyA9IGFyZ3MucHJvcGVydHlEaWZmcztcbiAgICB0aGlzLm90aGVyRGlmZnMgPSBhcmdzLm90aGVyRGlmZnM7XG5cbiAgICB0aGlzLmlzQWRkaXRpb24gPSBvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNSZW1vdmFsID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2xkUHJvcGVydGllcygpOiBQcm9wZXJ0eU1hcCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub2xkVmFsdWUgJiYgdGhpcy5vbGRWYWx1ZS5Qcm9wZXJ0aWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdQcm9wZXJ0aWVzKCk6IFByb3BlcnR5TWFwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5uZXdWYWx1ZSAmJiB0aGlzLm5ld1ZhbHVlLlByb3BlcnRpZXM7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHJlc291cmNlIHdhcyBtb2RpZmllZCBhdCBhbGxcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEaWZmZXJlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlmZmVyZW5jZUNvdW50ID4gMCB8fCB0aGlzLm9sZFJlc291cmNlVHlwZSAhPT0gdGhpcy5uZXdSZXNvdXJjZVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVzb3VyY2Ugd2FzIHVwZGF0ZWQgaW4tcGxhY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNVcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaWZmZXJlbnQgJiYgIXRoaXMuaXNBZGRpdGlvbiAmJiAhdGhpcy5pc1JlbW92YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9sZFJlc291cmNlVHlwZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmV3UmVzb3VyY2VUeXBlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBhY3R1YWwgcHJvcGVydHkgdXBkYXRlc1xuICAgKi9cbiAgcHVibGljIGdldCBwcm9wZXJ0eVVwZGF0ZXMoKTogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5wcm9wZXJ0eURpZmZzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgYWN0dWFsIFwib3RoZXJcIiB1cGRhdGVzXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVyQ2hhbmdlcygpOiB7IFtrZXk6IHN0cmluZ106IERpZmZlcmVuY2U8YW55PiB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5vdGhlckRpZmZzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgcmVzb3VyY2UgdHlwZSB3YXMgY2hhbmdlZCBpbiB0aGlzIGRpZmZcbiAgICpcbiAgICogVGhpcyBpcyBub3QgYSB2YWxpZCBvcGVyYXRpb24gaW4gQ2xvdWRGb3JtYXRpb24gYnV0IHRvIGJlIGRlZmVuc2l2ZSB3ZSdyZSBnb2luZ1xuICAgKiB0byBiZSBhd2FyZSBvZiBpdCBhbnl3YXkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlVHlwZUNoYW5nZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgdGhpcy5yZXNvdXJjZVR5cGVzLm9sZFR5cGUgIT09IHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgaWYgaXQgd2FzIHVuY2hhbmdlZFxuICAgKlxuICAgKiBJZiB0aGUgcmVzb3VyY2UgdHlwZSB3YXMgY2hhbmdlZCwgaXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlVHlwZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCAucmVzb3VyY2VUeXBlLCBiZWNhdXNlIHRoZSB0eXBlIHdhcyBjaGFuZ2VkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZSB8fCB0aGlzLnJlc291cmNlVHlwZXMubmV3VHlwZSE7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBhIFByb3BlcnR5Q2hhbmdlIGluIHRoaXMgb2JqZWN0XG4gICAqXG4gICAqIFRoaXMgYWZmZWN0cyB0aGUgcHJvcGVydHkgZGlmZiBhcyBpdCBpcyBzdW1tYXJpemVkIHRvIHVzZXJzLCBidXQgaXQgRE9FU1xuICAgKiBOT1QgYWZmZWN0IGVpdGhlciB0aGUgXCJvbGRWYWx1ZVwiIG9yIFwibmV3VmFsdWVcIiB2YWx1ZXM7IHRob3NlIHN0aWxsIGNvbnRhaW5cbiAgICogdGhlIGFjdHVhbCB0ZW1wbGF0ZSB2YWx1ZXMgYXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgKHRoZXkgbWlnaHQgc3RpbGwgYmVcbiAgICogdXNlZCBmb3IgZG93bnN0cmVhbSBwcm9jZXNzaW5nKS5cbiAgICovXG4gIHB1YmxpYyBzZXRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWU6IHN0cmluZywgY2hhbmdlOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55Pikge1xuICAgIHRoaXMucHJvcGVydHlEaWZmc1twcm9wZXJ0eU5hbWVdID0gY2hhbmdlO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGFuZ2VJbXBhY3QoKTogUmVzb3VyY2VJbXBhY3Qge1xuICAgIC8vIENoZWNrIHRoZSBUeXBlIGZpcnN0XG4gICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlcy5vbGRUeXBlICE9PSB0aGlzLnJlc291cmNlVHlwZXMubmV3VHlwZSkge1xuICAgICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlcy5vbGRUeXBlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIFJlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFOyB9XG4gICAgICBpZiAodGhpcy5yZXNvdXJjZVR5cGVzLm5ld1R5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbGRWYWx1ZSEuRGVsZXRpb25Qb2xpY3kgPT09ICdSZXRhaW4nXG4gICAgICAgICAgPyBSZXNvdXJjZUltcGFjdC5XSUxMX09SUEhBTlxuICAgICAgICAgIDogUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRTtcbiAgICB9XG5cbiAgICAvLyBCYXNlIGltcGFjdCAoYmVmb3JlIHdlIG1peCBpbiB0aGUgd29yc3Qgb2YgdGhlIHByb3BlcnR5IGltcGFjdHMpO1xuICAgIC8vIFdJTExfVVBEQVRFIGlmIHdlIGhhdmUgXCJvdGhlclwiIGNoYW5nZXMsIE5PX0NIQU5HRSBpZiB0aGVyZSBhcmUgbm8gXCJvdGhlclwiIGNoYW5nZXMuXG4gICAgY29uc3QgYmFzZUltcGFjdCA9IE9iamVjdC5rZXlzKHRoaXMub3RoZXJDaGFuZ2VzKS5sZW5ndGggPiAwID8gUmVzb3VyY2VJbXBhY3QuV0lMTF9VUERBVEUgOiBSZXNvdXJjZUltcGFjdC5OT19DSEFOR0U7XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnByb3BlcnR5RGlmZnMpXG4gICAgICAubWFwKGVsdCA9PiBlbHQuY2hhbmdlSW1wYWN0KVxuICAgICAgLnJlZHVjZSh3b3JzdEltcGFjdCwgYmFzZUltcGFjdCk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgb2YgYWN0dWFsIGRpZmZlcmVuY2VzIChub3Qgb2YgZWxlbWVudHMpXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMucHJvcGVydHlVcGRhdGVzKS5sZW5ndGhcbiAgICAgICsgT2JqZWN0LnZhbHVlcyh0aGlzLm90aGVyQ2hhbmdlcykubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBhIGNhbGxiYWNrIGZvciBlYWNoIGFjdHVhbCBkaWZmZXJlbmNlXG4gICAqL1xuICBwdWJsaWMgZm9yRWFjaERpZmZlcmVuY2UoY2I6ICh0eXBlOiAnUHJvcGVydHknIHwgJ090aGVyJywgbmFtZTogc3RyaW5nLCB2YWx1ZTogRGlmZmVyZW5jZTxhbnk+IHwgUHJvcGVydHlEaWZmZXJlbmNlPGFueT4pID0+IGFueSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMucHJvcGVydHlVcGRhdGVzKS5zb3J0KCkpIHtcbiAgICAgIGNiKCdQcm9wZXJ0eScsIGtleSwgdGhpcy5wcm9wZXJ0eVVwZGF0ZXNba2V5XSk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMub3RoZXJDaGFuZ2VzKS5zb3J0KCkpIHtcbiAgICAgIGNiKCdPdGhlcicsIGtleSwgdGhpcy5vdGhlckRpZmZzW2tleV0pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wZXJ0eURpZmZlcmVuY2U8VD4oZGlmZjogRGlmZmVyZW5jZTxUPik6IGRpZmYgaXMgUHJvcGVydHlEaWZmZXJlbmNlPFQ+IHtcbiAgcmV0dXJuIChkaWZmIGFzIFByb3BlcnR5RGlmZmVyZW5jZTxUPikuY2hhbmdlSW1wYWN0ICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmlsdGVyIGEgbWFwIG9mIElEaWZmZXJlbmNlcyBkb3duIHRvIG9ubHkgcmV0YWluIHRoZSBhY3R1YWwgY2hhbmdlc1xuICovXG5mdW5jdGlvbiBvbmx5Q2hhbmdlczxWLCBUIGV4dGVuZHMgSURpZmZlcmVuY2U8Vj4+KHhzOiB7W2tleTogc3RyaW5nXTogVH0pOiB7W2tleTogc3RyaW5nXTogVH0ge1xuICBjb25zdCByZXQ6IHsgW2tleTogc3RyaW5nXTogVCB9ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgZGlmZl0gb2YgT2JqZWN0LmVudHJpZXMoeHMpKSB7XG4gICAgaWYgKGRpZmYuaXNEaWZmZXJlbnQpIHtcbiAgICAgIHJldFtrZXldID0gZGlmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBd0M7QUFDeEMsb0VBQW9IO0FBQ3BILGlDQUFzRDtBQUN0RCxvREFBZ0Q7QUFDaEQsOEVBQXlFO0FBSXpFLGlFQUFpRTtBQUNqRSxNQUFhLFlBQVk7SUF1QnZCLFlBQVksSUFBbUI7UUFDN0IsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUssU0FBUyxFQUFFO1lBQy9DLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7U0FDL0Q7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUNyQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHdCQUFVLENBQUM7WUFDL0IsZUFBZSxFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyx3QkFBVSxDQUFDLHFCQUFxQixDQUFDO1lBQ3BGLGVBQWUsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsd0JBQVUsQ0FBQyxxQkFBcUIsQ0FBQztTQUNyRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSw2Q0FBb0IsQ0FBQztZQUNuRCx5QkFBeUIsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyx5Q0FBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRywwQkFBMEIsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyx5Q0FBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsRyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyx5Q0FBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZHLDBCQUEwQixFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLHlDQUFvQixDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDMUcsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN4QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFFZCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxTQUFTLEVBQUU7WUFDL0MsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUNaO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNsQyxLQUFLLElBQUksQ0FBQyxDQUFDO1NBQ1o7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQ2hDLEtBQUssSUFBSSxDQUFDLENBQUM7U0FDWjtRQUVELEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN6QyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDdkMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ3ZDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUN0QyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUM7UUFDekMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO1FBQ3hDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUV0QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLG9CQUFvQjtRQUM3QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztJQUN0RixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLHFCQUFxQjtRQUM5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssNEJBQTRCLENBQUMsYUFBcUM7UUFDeEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQWtCLENBQUM7UUFFeEMsS0FBSyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3hGLElBQUksY0FBYyxDQUFDLG1CQUFtQixFQUFFO2dCQUN0QywwRkFBMEY7Z0JBQzFGLFNBQVM7YUFDVjtZQUVELElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFO2dCQUNuQyxTQUFTO2FBQ1Y7WUFFRCxNQUFNLFlBQVksR0FBRyxJQUFBLHdCQUFpQixFQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDO1lBQ3pGLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMvRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLElBQUkseUNBQW9CLENBQUMsSUFBSSxDQUFDO2dCQUN6RSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtvQkFDNUMsR0FBRyxDQUFDLElBQUksQ0FBQzt3QkFDUCxpQkFBaUI7d0JBQ2pCLFlBQVk7d0JBQ1osWUFBWSxFQUFFLGNBQWMsQ0FBQyxZQUFZO3dCQUN6QyxZQUFZLEVBQUUsZ0JBQWdCO3dCQUM5QixRQUFRLEVBQUUsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDLFlBQVksQ0FBQzt3QkFDdEQsUUFBUSxFQUFFLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxZQUFZLENBQUM7cUJBQ3ZELENBQUMsQ0FBQztpQkFDSjthQUNGO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLDRCQUE0QixDQUFDLGFBQXFDO1FBQ3hFLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFrQixDQUFDO1FBRXhDLEtBQUssTUFBTSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN4RixJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUFFLFNBQVM7YUFBRTtZQUVsQyxNQUFNLFdBQVcsR0FBRztnQkFDbEIsYUFBYSxFQUFFLGNBQWMsQ0FBQyxhQUFhO2dCQUMzQyxhQUFhLEVBQUUsY0FBYyxDQUFDLGFBQWE7Z0JBQzNDLGlCQUFpQjthQUNsQixDQUFDO1lBRUYsb0dBQW9HO1lBQ3BHLElBQUksY0FBYyxDQUFDLG1CQUFtQixFQUFFO2dCQUN0QyxzQkFBc0I7Z0JBQ3RCLElBQUksY0FBYyxDQUFDLGVBQWUsRUFBRTtvQkFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLHdCQUFpQixFQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDM0UsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLEVBQUU7d0JBQ3JGLEdBQUcsQ0FBQyxJQUFJLENBQUM7NEJBQ1AsR0FBRyxXQUFXOzRCQUNkLGFBQWEsRUFBRSxTQUFTOzRCQUN4QixZQUFZLEVBQUUsY0FBYyxDQUFDLGVBQWdCOzRCQUM3QyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsYUFBYzt5QkFDOUMsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO2dCQUVELElBQUksY0FBYyxDQUFDLGVBQWUsRUFBRTtvQkFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLHdCQUFpQixFQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDM0UsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLEVBQUU7d0JBQ3JGLEdBQUcsQ0FBQyxJQUFJLENBQUM7NEJBQ1AsR0FBRyxXQUFXOzRCQUNkLGFBQWEsRUFBRSxTQUFTOzRCQUN4QixZQUFZLEVBQUUsY0FBYyxDQUFDLGVBQWdCOzRCQUM3QyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsYUFBYzt5QkFDOUMsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxhQUFhLEdBQUcsSUFBQSx3QkFBaUIsRUFBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JFLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQUU7b0JBQy9FLEdBQUcsQ0FBQyxJQUFJLENBQUM7d0JBQ1AsR0FBRyxXQUFXO3dCQUNkLFlBQVksRUFBRSxjQUFjLENBQUMsWUFBWTt3QkFDekMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxhQUFjO3FCQUMzQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtTQUNGO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU8sdUJBQXVCLENBQUMsR0FBa0IsRUFBRSxhQUEwQztRQUM1RixPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSx5Q0FBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRixDQUFDO0NBQ0Y7QUFyTUQsb0NBcU1DO0FBbUZEOztHQUVHO0FBQ0gsTUFBYSxVQUFVO0lBUXJCOzs7T0FHRztJQUNILFlBQTRCLFFBQStCLEVBQWtCLFFBQStCO1FBQWhGLGFBQVEsR0FBUixRQUFRLENBQXVCO1FBQWtCLGFBQVEsR0FBUixRQUFRLENBQXVCO1FBQzFHLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3BELE1BQU0sSUFBSSx1QkFBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLDJDQUEyQyxFQUFFLENBQUMsQ0FBQztTQUNwRjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFBLGdCQUFTLEVBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7SUFDckMsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsaUZBQWlGO0lBQ2pGLElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUztlQUM3QixJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFsQ0QsZ0NBa0NDO0FBRUQsTUFBYSxrQkFBOEIsU0FBUSxVQUFxQjtJQUd0RSxZQUFZLFFBQStCLEVBQUUsUUFBK0IsRUFBRSxJQUF1QztRQUNuSCxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUFQRCxnREFPQztBQUVELE1BQWEsb0JBQW9CO0lBQy9CLFlBQTZCLEtBQWlDO1FBQWpDLFVBQUssR0FBTCxLQUFLLENBQTRCO0lBQUcsQ0FBQztJQUVsRSxJQUFXLE9BQU87UUFDaEIsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDNUMsQ0FBQztJQUVNLEdBQUcsQ0FBQyxTQUFpQjtRQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixTQUFTLEdBQUcsQ0FBQyxDQUFDO1NBQUU7UUFDMUUsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxTQUEyQztRQUN2RCxNQUFNLFVBQVUsR0FBK0IsRUFBRyxDQUFDO1FBQ25ELEtBQUssTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUU5QixJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkIsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUN2QjtTQUNGO1FBRUQsT0FBTyxJQUFJLG9CQUFvQixDQUFPLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksaUJBQWlCLENBQUMsRUFBeUM7UUFDaEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQW9DLENBQUM7UUFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQW9DLENBQUM7UUFDNUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQW9DLENBQUM7UUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQW9DLENBQUM7UUFFN0QsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3ZDLE1BQU0sTUFBTSxHQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFFLENBQUM7WUFDM0MsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUNyQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDbkM7aUJBQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDckM7aUJBQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDckM7aUJBQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO2dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDcEM7U0FDRjtRQUVELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0Y7QUF6RUQsb0RBeUVDO0FBc0JELE1BQWEsbUJBQW9CLFNBQVEsVUFBcUI7Q0FFN0Q7QUFGRCxrREFFQztBQUdELE1BQWEsaUJBQWtCLFNBQVEsVUFBbUI7Q0FFekQ7QUFGRCw4Q0FFQztBQUdELE1BQWEsa0JBQW1CLFNBQVEsVUFBb0I7Q0FFM0Q7QUFGRCxnREFFQztBQUdELE1BQWEsZ0JBQWlCLFNBQVEsVUFBa0I7Q0FFdkQ7QUFGRCw0Q0FFQztBQUdELE1BQWEsbUJBQW9CLFNBQVEsVUFBcUI7Q0FFN0Q7QUFGRCxrREFFQztBQUVELElBQVksY0FlWDtBQWZELFdBQVksY0FBYztJQUN4QixxREFBcUQ7SUFDckQsNkNBQTJCLENBQUE7SUFDM0IsOENBQThDO0lBQzlDLDZDQUEyQixDQUFBO0lBQzNCLHNEQUFzRDtJQUN0RCwrQ0FBNkIsQ0FBQTtJQUM3QixxREFBcUQ7SUFDckQsNkNBQTJCLENBQUE7SUFDM0IsdURBQXVEO0lBQ3ZELCtDQUE2QixDQUFBO0lBQzdCLHFGQUFxRjtJQUNyRiw2Q0FBMkIsQ0FBQTtJQUMzQiwwQ0FBMEM7SUFDMUMseUNBQXVCLENBQUE7QUFDekIsQ0FBQyxFQWZXLGNBQWMsOEJBQWQsY0FBYyxRQWV6QjtBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsV0FBVyxDQUFDLEdBQW1CLEVBQUUsR0FBb0I7SUFDNUQsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUFFLE9BQU8sR0FBRyxDQUFDO0tBQUU7SUFDekIsTUFBTSxPQUFPLEdBQUc7UUFDZCxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzdCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMvQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQy9CLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNoQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0tBQ2pDLENBQUM7SUFDRixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ2pELENBQUM7QUFTRDs7OztHQUlHO0FBQ0gsTUFBYSxrQkFBa0I7SUFvQjdCLFlBQ2tCLFFBQThCLEVBQzlCLFFBQThCLEVBQzlDLElBSUM7UUFOZSxhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQU85QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUVsQyxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUM7UUFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLEtBQUssU0FBUyxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUNuRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDakUsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsWUFBWTtRQUNyQixPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxLQUFLLFNBQVM7ZUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssU0FBUztlQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyxZQUFZO1FBQ3JCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztTQUMzRTtRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFRLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxpQkFBaUIsQ0FBQyxZQUFvQixFQUFFLE1BQStCO1FBQzVFLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFXLFlBQVk7UUFDckIsdUJBQXVCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUU7WUFDN0QsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7Z0JBQUUsT0FBTyxjQUFjLENBQUMsV0FBVyxDQUFDO2FBQUU7WUFDcEYsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7Z0JBQzVDLE9BQU8sSUFBSSxDQUFDLFFBQVMsQ0FBQyxjQUFjLEtBQUssUUFBUTtvQkFDL0MsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxXQUFXO29CQUM1QixDQUFDLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQzthQUNqQztZQUNELE9BQU8sY0FBYyxDQUFDLFlBQVksQ0FBQztTQUNwQztRQUVELG9FQUFvRTtRQUNwRSxxRkFBcUY7UUFDckYsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUVySCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzthQUNyQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO2FBQzVCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTTtjQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCLENBQUMsRUFBdUc7UUFDOUgsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMxRCxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3ZELEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7Q0FDRjtBQTdKRCxnREE2SkM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBSSxJQUFtQjtJQUN6RCxPQUFRLElBQThCLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQztBQUNwRSxDQUFDO0FBRkQsb0RBRUM7QUFFRDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUE4QixFQUFzQjtJQUN0RSxNQUFNLEdBQUcsR0FBeUIsRUFBRSxDQUFDO0lBQ3JDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQzVDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ2pCO0tBQ0Y7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3NlcnRpb25FcnJvciB9IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBQcm9wZXJ0eVNjcnV0aW55VHlwZSwgUmVzb3VyY2VTY3J1dGlueVR5cGUsIFJlc291cmNlIGFzIFJlc291cmNlTW9kZWwgfSBmcm9tICdAYXdzLWNkay9zZXJ2aWNlLXNwZWMtdHlwZXMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBsb2FkUmVzb3VyY2VNb2RlbCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBJYW1DaGFuZ2VzIH0gZnJvbSAnLi4vaWFtL2lhbS1jaGFuZ2VzJztcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXBDaGFuZ2VzIH0gZnJvbSAnLi4vbmV0d29yay9zZWN1cml0eS1ncm91cC1jaGFuZ2VzJztcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlNYXAgPSB7W2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKiBTZW1hbnRpYyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZXMuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVEaWZmIGltcGxlbWVudHMgSVRlbXBsYXRlRGlmZiB7XG4gIHB1YmxpYyBhd3NUZW1wbGF0ZUZvcm1hdFZlcnNpb24/OiBEaWZmZXJlbmNlPHN0cmluZz47XG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IERpZmZlcmVuY2U8c3RyaW5nPjtcbiAgcHVibGljIHRyYW5zZm9ybT86IERpZmZlcmVuY2U8c3RyaW5nPjtcbiAgcHVibGljIGNvbmRpdGlvbnM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPENvbmRpdGlvbiwgQ29uZGl0aW9uRGlmZmVyZW5jZT47XG4gIHB1YmxpYyBtYXBwaW5nczogRGlmZmVyZW5jZUNvbGxlY3Rpb248TWFwcGluZywgTWFwcGluZ0RpZmZlcmVuY2U+O1xuICBwdWJsaWMgbWV0YWRhdGE6IERpZmZlcmVuY2VDb2xsZWN0aW9uPE1ldGFkYXRhLCBNZXRhZGF0YURpZmZlcmVuY2U+O1xuICBwdWJsaWMgb3V0cHV0czogRGlmZmVyZW5jZUNvbGxlY3Rpb248T3V0cHV0LCBPdXRwdXREaWZmZXJlbmNlPjtcbiAgcHVibGljIHBhcmFtZXRlcnM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPFBhcmFtZXRlciwgUGFyYW1ldGVyRGlmZmVyZW5jZT47XG4gIHB1YmxpYyByZXNvdXJjZXM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPFJlc291cmNlLCBSZXNvdXJjZURpZmZlcmVuY2U+O1xuICAvKiogVGhlIGRpZmZlcmVuY2VzIGluIHVua25vd24vdW5leHBlY3RlZCBwYXJ0cyBvZiB0aGUgdGVtcGxhdGUgKi9cbiAgcHVibGljIHVua25vd246IERpZmZlcmVuY2VDb2xsZWN0aW9uPGFueSwgRGlmZmVyZW5jZTxhbnk+PjtcblxuICAvKipcbiAgICogQ2hhbmdlcyB0byBJQU0gcG9saWNpZXNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpYW1DaGFuZ2VzOiBJYW1DaGFuZ2VzO1xuXG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRvIFNlY3VyaXR5IEdyb3VwIGluZ3Jlc3MgYW5kIGVncmVzcyBydWxlc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBDaGFuZ2VzOiBTZWN1cml0eUdyb3VwQ2hhbmdlcztcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBJVGVtcGxhdGVEaWZmKSB7XG4gICAgaWYgKGFyZ3MuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uID0gYXJncy5hd3NUZW1wbGF0ZUZvcm1hdFZlcnNpb247XG4gICAgfVxuICAgIGlmIChhcmdzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBhcmdzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAoYXJncy50cmFuc2Zvcm0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy50cmFuc2Zvcm0gPSBhcmdzLnRyYW5zZm9ybTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmRpdGlvbnMgPSBhcmdzLmNvbmRpdGlvbnMgfHwgbmV3IERpZmZlcmVuY2VDb2xsZWN0aW9uKHt9KTtcbiAgICB0aGlzLm1hcHBpbmdzID0gYXJncy5tYXBwaW5ncyB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuICAgIHRoaXMubWV0YWRhdGEgPSBhcmdzLm1ldGFkYXRhIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5vdXRwdXRzID0gYXJncy5vdXRwdXRzIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5wYXJhbWV0ZXJzID0gYXJncy5wYXJhbWV0ZXJzIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5yZXNvdXJjZXMgPSBhcmdzLnJlc291cmNlcyB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuICAgIHRoaXMudW5rbm93biA9IGFyZ3MudW5rbm93biB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuXG4gICAgdGhpcy5pYW1DaGFuZ2VzID0gbmV3IElhbUNoYW5nZXMoe1xuICAgICAgcHJvcGVydHlDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVQcm9wZXJ0eUNoYW5nZXMoSWFtQ2hhbmdlcy5JYW1Qcm9wZXJ0eVNjcnV0aW5pZXMpLFxuICAgICAgcmVzb3VyY2VDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVSZXNvdXJjZUNoYW5nZXMoSWFtQ2hhbmdlcy5JYW1SZXNvdXJjZVNjcnV0aW5pZXMpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWN1cml0eUdyb3VwQ2hhbmdlcyA9IG5ldyBTZWN1cml0eUdyb3VwQ2hhbmdlcyh7XG4gICAgICBlZ3Jlc3NSdWxlUHJvcGVydHlDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVQcm9wZXJ0eUNoYW5nZXMoW1Byb3BlcnR5U2NydXRpbnlUeXBlLkVncmVzc1J1bGVzXSksXG4gICAgICBpbmdyZXNzUnVsZVByb3BlcnR5Q2hhbmdlczogdGhpcy5zY3J1dGluaXphYmxlUHJvcGVydHlDaGFuZ2VzKFtQcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmdyZXNzUnVsZXNdKSxcbiAgICAgIGVncmVzc1J1bGVSZXNvdXJjZUNoYW5nZXM6IHRoaXMuc2NydXRpbml6YWJsZVJlc291cmNlQ2hhbmdlcyhbUmVzb3VyY2VTY3J1dGlueVR5cGUuRWdyZXNzUnVsZVJlc291cmNlXSksXG4gICAgICBpbmdyZXNzUnVsZVJlc291cmNlQ2hhbmdlczogdGhpcy5zY3J1dGluaXphYmxlUmVzb3VyY2VDaGFuZ2VzKFtSZXNvdXJjZVNjcnV0aW55VHlwZS5JbmdyZXNzUnVsZVJlc291cmNlXSksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuXG4gICAgaWYgKHRoaXMuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLnRyYW5zZm9ybSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cblxuICAgIGNvdW50ICs9IHRoaXMuY29uZGl0aW9ucy5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5tYXBwaW5ncy5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5tZXRhZGF0YS5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5vdXRwdXRzLmRpZmZlcmVuY2VDb3VudDtcbiAgICBjb3VudCArPSB0aGlzLnBhcmFtZXRlcnMuZGlmZmVyZW5jZUNvdW50O1xuICAgIGNvdW50ICs9IHRoaXMucmVzb3VyY2VzLmRpZmZlcmVuY2VDb3VudDtcbiAgICBjb3VudCArPSB0aGlzLnVua25vd24uZGlmZmVyZW5jZUNvdW50O1xuXG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpZmZlcmVuY2VDb3VudCA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIHBlcm1pc3Npb25zIG9iamVjdHMgaW52b2x2ZSBhIGJyb2FkZW5pbmcgb2YgcGVybWlzc2lvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnNCcm9hZGVuZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWFtQ2hhbmdlcy5wZXJtaXNzaW9uc0Jyb2FkZW5lZCB8fCB0aGlzLnNlY3VyaXR5R3JvdXBDaGFuZ2VzLnJ1bGVzQWRkZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBwZXJtaXNzaW9ucyBvYmplY3RzIGhhdmUgY2hhbmdlZFxuICAgKi9cbiAgcHVibGljIGdldCBwZXJtaXNzaW9uc0FueUNoYW5nZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWFtQ2hhbmdlcy5oYXNDaGFuZ2VzIHx8IHRoaXMuc2VjdXJpdHlHcm91cENoYW5nZXMuaGFzQ2hhbmdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIHByb3BlcnR5IGNoYW5nZXMgb2YgYSBnaXZlbiBzY3J1dGlueSB0eXBlXG4gICAqXG4gICAqIFdlIGRvbid0IGp1c3QgbG9vayBhdCBwcm9wZXJ0eSB1cGRhdGVzOyB3ZSBhbHNvIGxvb2sgYXQgcmVzb3VyY2UgYWRkaXRpb25zIGFuZCBkZWxldGlvbnMgKGluIHdoaWNoXG4gICAqIGNhc2UgdGhlcmUgaXMgbm8gZnVydGhlciBkZXRhaWwgb24gcHJvcGVydHkgdmFsdWVzKSwgYW5kIHJlc291cmNlIHR5cGUgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgc2NydXRpbml6YWJsZVByb3BlcnR5Q2hhbmdlcyhzY3J1dGlueVR5cGVzOiBQcm9wZXJ0eVNjcnV0aW55VHlwZVtdKTogUHJvcGVydHlDaGFuZ2VbXSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFByb3BlcnR5Q2hhbmdlPigpO1xuXG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2VMb2dpY2FsSWQsIHJlc291cmNlQ2hhbmdlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnJlc291cmNlcy5jaGFuZ2VzKSkge1xuICAgICAgaWYgKHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgICAgLy8gd2UgaWdub3JlIHJlc291cmNlIHR5cGUgY2hhbmdlcyBoZXJlLCBhbmQgaGFuZGxlIHRoZW0gaW4gc2NydXRpbml6YWJsZVJlc291cmNlQ2hhbmdlcygpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc291cmNlQ2hhbmdlLm5ld1Jlc291cmNlVHlwZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3VHlwZVByb3BzID0gbG9hZFJlc291cmNlTW9kZWwocmVzb3VyY2VDaGFuZ2UubmV3UmVzb3VyY2VUeXBlKT8ucHJvcGVydGllcyB8fCB7fTtcbiAgICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgcHJvcF0gb2YgT2JqZWN0LmVudHJpZXMobmV3VHlwZVByb3BzKSkge1xuICAgICAgICBjb25zdCBwcm9wU2NydXRpbnlUeXBlID0gcHJvcC5zY3J1dGluaXphYmxlIHx8IFByb3BlcnR5U2NydXRpbnlUeXBlLk5vbmU7XG4gICAgICAgIGlmIChzY3J1dGlueVR5cGVzLmluY2x1ZGVzKHByb3BTY3J1dGlueVR5cGUpKSB7XG4gICAgICAgICAgcmV0LnB1c2goe1xuICAgICAgICAgICAgcmVzb3VyY2VMb2dpY2FsSWQsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICByZXNvdXJjZVR5cGU6IHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZSxcbiAgICAgICAgICAgIHNjcnV0aW55VHlwZTogcHJvcFNjcnV0aW55VHlwZSxcbiAgICAgICAgICAgIG9sZFZhbHVlOiByZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzPy5bcHJvcGVydHlOYW1lXSxcbiAgICAgICAgICAgIG5ld1ZhbHVlOiByZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzPy5bcHJvcGVydHlOYW1lXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFsbCByZXNvdXJjZSBjaGFuZ2VzIG9mIGEgZ2l2ZW4gc2NydXRpbnkgdHlwZVxuICAgKlxuICAgKiBXZSBkb24ndCBqdXN0IGxvb2sgYXQgcmVzb3VyY2UgdXBkYXRlczsgd2UgYWxzbyBsb29rIGF0IHJlc291cmNlIGFkZGl0aW9ucyBhbmQgZGVsZXRpb25zIChpbiB3aGljaFxuICAgKiBjYXNlIHRoZXJlIGlzIG5vIGZ1cnRoZXIgZGV0YWlsIG9uIHByb3BlcnR5IHZhbHVlcyksIGFuZCByZXNvdXJjZSB0eXBlIGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIHNjcnV0aW5pemFibGVSZXNvdXJjZUNoYW5nZXMoc2NydXRpbnlUeXBlczogUmVzb3VyY2VTY3J1dGlueVR5cGVbXSk6IFJlc291cmNlQ2hhbmdlW10ge1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxSZXNvdXJjZUNoYW5nZT4oKTtcblxuICAgIGZvciAoY29uc3QgW3Jlc291cmNlTG9naWNhbElkLCByZXNvdXJjZUNoYW5nZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZXNvdXJjZXMuY2hhbmdlcykpIHtcbiAgICAgIGlmICghcmVzb3VyY2VDaGFuZ2UpIHsgY29udGludWU7IH1cblxuICAgICAgY29uc3QgY29tbW9uUHJvcHMgPSB7XG4gICAgICAgIG9sZFByb3BlcnRpZXM6IHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMsXG4gICAgICAgIG5ld1Byb3BlcnRpZXM6IHJlc291cmNlQ2hhbmdlLm5ld1Byb3BlcnRpZXMsXG4gICAgICAgIHJlc291cmNlTG9naWNhbElkLFxuICAgICAgfTtcblxuICAgICAgLy8gY2hhbmdlcyB0byB0aGUgVHlwZSBvZiByZXNvdXJjZXMgY2FuIGhhcHBlbiB3aGVuIG1pZ3JhdGluZyBmcm9tIENGTiB0ZW1wbGF0ZXMgdGhhdCB1c2UgVHJhbnNmb3Jtc1xuICAgICAgaWYgKHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgICAgLy8gVHJlYXQgYXMgREVMRVRFK0FERFxuICAgICAgICBpZiAocmVzb3VyY2VDaGFuZ2Uub2xkUmVzb3VyY2VUeXBlKSB7XG4gICAgICAgICAgY29uc3Qgb2xkUmVzb3VyY2VNb2RlbCA9IGxvYWRSZXNvdXJjZU1vZGVsKHJlc291cmNlQ2hhbmdlLm9sZFJlc291cmNlVHlwZSk7XG4gICAgICAgICAgaWYgKG9sZFJlc291cmNlTW9kZWwgJiYgdGhpcy5yZXNvdXJjZUlzU2NydXRpbml6YWJsZShvbGRSZXNvdXJjZU1vZGVsLCBzY3J1dGlueVR5cGVzKSkge1xuICAgICAgICAgICAgcmV0LnB1c2goe1xuICAgICAgICAgICAgICAuLi5jb21tb25Qcm9wcyxcbiAgICAgICAgICAgICAgbmV3UHJvcGVydGllczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICByZXNvdXJjZVR5cGU6IHJlc291cmNlQ2hhbmdlLm9sZFJlc291cmNlVHlwZSEsXG4gICAgICAgICAgICAgIHNjcnV0aW55VHlwZTogb2xkUmVzb3VyY2VNb2RlbC5zY3J1dGluaXphYmxlISxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNvdXJjZUNoYW5nZS5uZXdSZXNvdXJjZVR5cGUpIHtcbiAgICAgICAgICBjb25zdCBuZXdSZXNvdXJjZU1vZGVsID0gbG9hZFJlc291cmNlTW9kZWwocmVzb3VyY2VDaGFuZ2UubmV3UmVzb3VyY2VUeXBlKTtcbiAgICAgICAgICBpZiAobmV3UmVzb3VyY2VNb2RlbCAmJiB0aGlzLnJlc291cmNlSXNTY3J1dGluaXphYmxlKG5ld1Jlc291cmNlTW9kZWwsIHNjcnV0aW55VHlwZXMpKSB7XG4gICAgICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICAgICAgICBvbGRQcm9wZXJ0aWVzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJlc291cmNlVHlwZTogcmVzb3VyY2VDaGFuZ2UubmV3UmVzb3VyY2VUeXBlISxcbiAgICAgICAgICAgICAgc2NydXRpbnlUeXBlOiBuZXdSZXNvdXJjZU1vZGVsLnNjcnV0aW5pemFibGUhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXNvdXJjZU1vZGVsID0gbG9hZFJlc291cmNlTW9kZWwocmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VUeXBlKTtcbiAgICAgICAgaWYgKHJlc291cmNlTW9kZWwgJiYgdGhpcy5yZXNvdXJjZUlzU2NydXRpbml6YWJsZShyZXNvdXJjZU1vZGVsLCBzY3J1dGlueVR5cGVzKSkge1xuICAgICAgICAgIHJldC5wdXNoKHtcbiAgICAgICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICAgICAgcmVzb3VyY2VUeXBlOiByZXNvdXJjZUNoYW5nZS5yZXNvdXJjZVR5cGUsXG4gICAgICAgICAgICBzY3J1dGlueVR5cGU6IHJlc291cmNlTW9kZWwuc2NydXRpbml6YWJsZSEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvdXJjZUlzU2NydXRpbml6YWJsZShyZXM6IFJlc291cmNlTW9kZWwsIHNjcnV0aW55VHlwZXM6IEFycmF5PFJlc291cmNlU2NydXRpbnlUeXBlPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzY3J1dGlueVR5cGVzLmluY2x1ZGVzKHJlcy5zY3J1dGluaXphYmxlIHx8IFJlc291cmNlU2NydXRpbnlUeXBlLk5vbmUpO1xuICB9XG59XG5cbi8qKlxuICogQSBjaGFuZ2UgaW4gcHJvcGVydHkgdmFsdWVzXG4gKlxuICogTm90IG5lY2Vzc2FyaWx5IGFuIHVwZGF0ZSwgaXQgY291bGQgYmUgdGhhdCB0aGVyZSB1c2VkIHRvIGJlIG5vIHZhbHVlIHRoZXJlXG4gKiBiZWNhdXNlIHRoZXJlIHdhcyBubyByZXNvdXJjZSwgYW5kIG5vdyB0aGVyZSBpcyAob3IgdmljZSB2ZXJzYSkuXG4gKlxuICogVGhlcmVmb3JlLCB3ZSBqdXN0IGNvbnRhaW4gcGxhaW4gdmFsdWVzIGFuZCBub3QgYSBQcm9wZXJ0eURpZmZlcmVuY2U8YW55Pi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eUNoYW5nZSB7XG4gIC8qKlxuICAgKiBMb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZSB3aGVyZSB0aGlzIHByb3BlcnR5IGNoYW5nZSB3YXMgZm91bmRcbiAgICovXG4gIHJlc291cmNlTG9naWNhbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogU2NydXRpbnkgdHlwZSBmb3IgdGhpcyBwcm9wZXJ0eSBjaGFuZ2VcbiAgICovXG4gIHNjcnV0aW55VHlwZTogUHJvcGVydHlTY3J1dGlueVR5cGU7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgaXMgY2hhbmdpbmdcbiAgICovXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHByb3BlcnR5IHZhbHVlXG4gICAqL1xuICBvbGRWYWx1ZT86IGFueTtcblxuICAvKipcbiAgICogVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZVxuICAgKi9cbiAgbmV3VmFsdWU/OiBhbnk7XG59XG5cbi8qKlxuICogQSByZXNvdXJjZSBjaGFuZ2VcbiAqXG4gKiBFaXRoZXIgYSBjcmVhdGlvbiwgZGVsZXRpb24gb3IgdXBkYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlQ2hhbmdlIHtcbiAgLyoqXG4gICAqIExvZ2ljYWwgSUQgb2YgdGhlIHJlc291cmNlIHdoZXJlIHRoaXMgcHJvcGVydHkgY2hhbmdlIHdhcyBmb3VuZFxuICAgKi9cbiAgcmVzb3VyY2VMb2dpY2FsSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU2NydXRpbnkgdHlwZSBmb3IgdGhpcyByZXNvdXJjZSBjaGFuZ2VcbiAgICovXG4gIHNjcnV0aW55VHlwZTogUmVzb3VyY2VTY3J1dGlueVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcHJvcGVydGllcyB2YWx1ZSAobWlnaHQgYmUgdW5kZWZpbmVkIGluIGNhc2Ugb2YgY3JlYXRpb24pXG4gICAqL1xuICBvbGRQcm9wZXJ0aWVzPzogUHJvcGVydHlNYXA7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgcHJvcGVydGllcyB2YWx1ZSAobWlnaHQgYmUgdW5kZWZpbmVkIGluIGNhc2Ugb2YgZGVsZXRpb24pXG4gICAqL1xuICBuZXdQcm9wZXJ0aWVzPzogUHJvcGVydHlNYXA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpZmZlcmVuY2U8VmFsdWVUeXBlPiB7XG4gIHJlYWRvbmx5IG9sZFZhbHVlOiBWYWx1ZVR5cGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG5ld1ZhbHVlOiBWYWx1ZVR5cGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGlzRGlmZmVyZW50OiBib29sZWFuO1xuICByZWFkb25seSBpc0FkZGl0aW9uOiBib29sZWFuO1xuICByZWFkb25seSBpc1JlbW92YWw6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzVXBkYXRlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vZGVscyBhbiBlbnRpdHkgdGhhdCBjaGFuZ2VkIGJldHdlZW4gdHdvIHZlcnNpb25zIG9mIGEgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaWZmZXJlbmNlPFZhbHVlVHlwZT4gaW1wbGVtZW50cyBJRGlmZmVyZW5jZTxWYWx1ZVR5cGU+IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpcyBhbiBhY3R1YWwgZGlmZmVyZW50IG9yIHRoZSB2YWx1ZXMgYXJlIGFjdHVhbGx5IHRoZSBzYW1lXG4gICAqXG4gICAqIGlzRGlmZmVyZW50ID0+IChpc1VwZGF0ZSB8IGlzUmVtb3ZlZCB8IGlzVXBkYXRlKVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzRGlmZmVyZW50OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCB2YWx1ZSwgY2Fubm90IGJlIGVxdWFsICh0byB0aGUgc2Vuc2Ugb2YgK2RlZXBFcXVhbCspIHRvICtuZXdWYWx1ZSsuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlLCBjYW5ub3QgYmUgZXF1YWwgKHRvIHRoZSBzZW5zZSBvZiArZGVlcEVxdWFsKykgdG8gK29sZFZhbHVlKy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBvbGRWYWx1ZTogVmFsdWVUeXBlIHwgdW5kZWZpbmVkLCBwdWJsaWMgcmVhZG9ubHkgbmV3VmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6ICdvbGRWYWx1ZSBhbmQgbmV3VmFsdWUgYXJlIGJvdGggdW5kZWZpbmVkIScgfSk7XG4gICAgfVxuICAgIHRoaXMuaXNEaWZmZXJlbnQgPSAhZGVlcEVxdWFsKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gIH1cblxuICAvKiogQHJldHVybnMgK3RydWUrIGlmIHRoZSBlbGVtZW50IGlzIG5ldyB0byB0aGUgdGVtcGxhdGUuICovXG4gIHB1YmxpYyBnZXQgaXNBZGRpdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vbGRWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEByZXR1cm5zICt0cnVlKyBpZiB0aGUgZWxlbWVudCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB0ZW1wbGF0ZS4gKi9cbiAgcHVibGljIGdldCBpc1JlbW92YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyArdHJ1ZSsgaWYgdGhlIGVsZW1lbnQgd2FzIGFscmVhZHkgaW4gdGhlIHRlbXBsYXRlIGFuZCBpcyB1cGRhdGVkLiAqL1xuICBwdWJsaWMgZ2V0IGlzVXBkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9sZFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICYmIHRoaXMubmV3VmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlEaWZmZXJlbmNlPFZhbHVlVHlwZT4gZXh0ZW5kcyBEaWZmZXJlbmNlPFZhbHVlVHlwZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlSW1wYWN0PzogUmVzb3VyY2VJbXBhY3Q7XG5cbiAgY29uc3RydWN0b3Iob2xkVmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCwgYXJnczogeyBjaGFuZ2VJbXBhY3Q/OiBSZXNvdXJjZUltcGFjdCB9KSB7XG4gICAgc3VwZXIob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLmNoYW5nZUltcGFjdCA9IGFyZ3MuY2hhbmdlSW1wYWN0O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUIGV4dGVuZHMgSURpZmZlcmVuY2U8Vj4+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkaWZmczogeyBbbG9naWNhbElkOiBzdHJpbmddOiBUIH0pIHt9XG5cbiAgcHVibGljIGdldCBjaGFuZ2VzKCk6IHsgW2xvZ2ljYWxJZDogc3RyaW5nXTogVCB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5kaWZmcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY2hhbmdlcykubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGdldChsb2dpY2FsSWQ6IHN0cmluZyk6IFQge1xuICAgIGNvbnN0IHJldCA9IHRoaXMuZGlmZnNbbG9naWNhbElkXTtcbiAgICBpZiAoIXJldCkgeyB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCB3aXRoIGxvZ2ljYWwgSUQgJyR7bG9naWNhbElkfSdgKTsgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvZ2ljYWxJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgVGVtcGxhdGVEaWZmIHdoaWNoIG9ubHkgY29udGFpbnMgY2hhbmdlcyBmb3Igd2hpY2ggYHByZWRpY2F0ZWBcbiAgICogcmV0dXJucyBgdHJ1ZWAuXG4gICAqL1xuICBwdWJsaWMgZmlsdGVyKHByZWRpY2F0ZTogKGRpZmY6IFQgfCB1bmRlZmluZWQpID0+IGJvb2xlYW4pOiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUPiB7XG4gICAgY29uc3QgbmV3Q2hhbmdlczogeyBbbG9naWNhbElkOiBzdHJpbmddOiBUIH0gPSB7IH07XG4gICAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpKSB7XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5jaGFuZ2VzW2lkXTtcblxuICAgICAgaWYgKHByZWRpY2F0ZShkaWZmKSkge1xuICAgICAgICBuZXdDaGFuZ2VzW2lkXSA9IGRpZmY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUPihuZXdDaGFuZ2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGBjYmAgZm9yIGFsbCBjaGFuZ2VzIGluIHRoaXMgY29sbGVjdGlvbi5cbiAgICpcbiAgICogQ2hhbmdlcyB3aWxsIGJlIHNvcnRlZCBhcyBmb2xsb3dzOlxuICAgKiAgLSBSZW1vdmVkXG4gICAqICAtIEFkZGVkXG4gICAqICAtIFVwZGF0ZWRcbiAgICogIC0gT3RoZXJzXG4gICAqXG4gICAqIEBwYXJhbSBjYlxuICAgKi9cbiAgcHVibGljIGZvckVhY2hEaWZmZXJlbmNlKGNiOiAobG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogVCkgPT4gYW55KTogdm9pZCB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcbiAgICBjb25zdCBhZGRlZCA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcbiAgICBjb25zdCB1cGRhdGVkID0gbmV3IEFycmF5PHsgbG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogVCB9PigpO1xuICAgIGNvbnN0IG90aGVycyA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcblxuICAgIGZvciAoY29uc3QgbG9naWNhbElkIG9mIHRoaXMubG9naWNhbElkcykge1xuICAgICAgY29uc3QgY2hhbmdlOiBUID0gdGhpcy5jaGFuZ2VzW2xvZ2ljYWxJZF0hO1xuICAgICAgaWYgKGNoYW5nZS5pc0FkZGl0aW9uKSB7XG4gICAgICAgIGFkZGVkLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmlzUmVtb3ZhbCkge1xuICAgICAgICByZW1vdmVkLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmlzVXBkYXRlKSB7XG4gICAgICAgIHVwZGF0ZWQucHVzaCh7IGxvZ2ljYWxJZCwgY2hhbmdlIH0pO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2UuaXNEaWZmZXJlbnQpIHtcbiAgICAgICAgb3RoZXJzLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVkLmZvckVhY2godiA9PiBjYih2LmxvZ2ljYWxJZCwgdi5jaGFuZ2UpKTtcbiAgICBhZGRlZC5mb3JFYWNoKHYgPT4gY2Iodi5sb2dpY2FsSWQsIHYuY2hhbmdlKSk7XG4gICAgdXBkYXRlZC5mb3JFYWNoKHYgPT4gY2Iodi5sb2dpY2FsSWQsIHYuY2hhbmdlKSk7XG4gICAgb3RoZXJzLmZvckVhY2godiA9PiBjYih2LmxvZ2ljYWxJZCwgdi5jaGFuZ2UpKTtcbiAgfVxufVxuXG4vKipcbiAqIEFyZ3VtZW50cyBleHBlY3RlZCBieSB0aGUgY29uc3RydWN0b3Igb2YgK1RlbXBsYXRlRGlmZissIGV4dHJhY3RlZCBhcyBhbiBpbnRlcmZhY2UgZm9yIHRoZSBzYWtlXG4gKiBvZiAocmVsYXRpdmUpIGNvbmNpc2VuZXNzIG9mIHRoZSBjb25zdHJ1Y3RvcidzIHNpZ25hdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVGVtcGxhdGVEaWZmIHtcbiAgYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uPzogSURpZmZlcmVuY2U8c3RyaW5nPjtcbiAgZGVzY3JpcHRpb24/OiBJRGlmZmVyZW5jZTxzdHJpbmc+O1xuICB0cmFuc2Zvcm0/OiBJRGlmZmVyZW5jZTxzdHJpbmc+O1xuXG4gIGNvbmRpdGlvbnM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxDb25kaXRpb24sIENvbmRpdGlvbkRpZmZlcmVuY2U+O1xuICBtYXBwaW5ncz86IERpZmZlcmVuY2VDb2xsZWN0aW9uPE1hcHBpbmcsIE1hcHBpbmdEaWZmZXJlbmNlPjtcbiAgbWV0YWRhdGE/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxNZXRhZGF0YSwgTWV0YWRhdGFEaWZmZXJlbmNlPjtcbiAgb3V0cHV0cz86IERpZmZlcmVuY2VDb2xsZWN0aW9uPE91dHB1dCwgT3V0cHV0RGlmZmVyZW5jZT47XG4gIHBhcmFtZXRlcnM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxQYXJhbWV0ZXIsIFBhcmFtZXRlckRpZmZlcmVuY2U+O1xuICByZXNvdXJjZXM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxSZXNvdXJjZSwgUmVzb3VyY2VEaWZmZXJlbmNlPjtcblxuICB1bmtub3duPzogRGlmZmVyZW5jZUNvbGxlY3Rpb248YW55LCBJRGlmZmVyZW5jZTxhbnk+Pjtcbn1cblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uID0gYW55O1xuZXhwb3J0IGNsYXNzIENvbmRpdGlvbkRpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPENvbmRpdGlvbj4ge1xuICAvLyBUT0RPOiBkZWZpbmUgc3BlY2lmaWMgZGlmZmVyZW5jZSBhdHRyaWJ1dGVzXG59XG5cbmV4cG9ydCB0eXBlIE1hcHBpbmcgPSBhbnk7XG5leHBvcnQgY2xhc3MgTWFwcGluZ0RpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE1hcHBpbmc+IHtcbiAgLy8gVE9ETzogZGVmaW5lIHNwZWNpZmljIGRpZmZlcmVuY2UgYXR0cmlidXRlc1xufVxuXG5leHBvcnQgdHlwZSBNZXRhZGF0YSA9IGFueTtcbmV4cG9ydCBjbGFzcyBNZXRhZGF0YURpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE1ldGFkYXRhPiB7XG4gIC8vIFRPRE86IGRlZmluZSBzcGVjaWZpYyBkaWZmZXJlbmNlIGF0dHJpYnV0ZXNcbn1cblxuZXhwb3J0IHR5cGUgT3V0cHV0ID0gYW55O1xuZXhwb3J0IGNsYXNzIE91dHB1dERpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE91dHB1dD4ge1xuICAvLyBUT0RPOiBkZWZpbmUgc3BlY2lmaWMgZGlmZmVyZW5jZSBhdHRyaWJ1dGVzXG59XG5cbmV4cG9ydCB0eXBlIFBhcmFtZXRlciA9IGFueTtcbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJEaWZmZXJlbmNlIGV4dGVuZHMgRGlmZmVyZW5jZTxQYXJhbWV0ZXI+IHtcbiAgLy8gVE9ETzogZGVmaW5lIHNwZWNpZmljIGRpZmZlcmVuY2UgYXR0cmlidXRlc1xufVxuXG5leHBvcnQgZW51bSBSZXNvdXJjZUltcGFjdCB7XG4gIC8qKiBUaGUgZXhpc3RpbmcgcGh5c2ljYWwgcmVzb3VyY2Ugd2lsbCBiZSB1cGRhdGVkICovXG4gIFdJTExfVVBEQVRFID0gJ1dJTExfVVBEQVRFJyxcbiAgLyoqIEEgbmV3IHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgY3JlYXRlZCAqL1xuICBXSUxMX0NSRUFURSA9ICdXSUxMX0NSRUFURScsXG4gIC8qKiBUaGUgZXhpc3RpbmcgcGh5c2ljYWwgcmVzb3VyY2Ugd2lsbCBiZSByZXBsYWNlZCAqL1xuICBXSUxMX1JFUExBQ0UgPSAnV0lMTF9SRVBMQUNFJyxcbiAgLyoqIFRoZSBleGlzdGluZyBwaHlzaWNhbCByZXNvdXJjZSBtYXkgYmUgcmVwbGFjZWQgKi9cbiAgTUFZX1JFUExBQ0UgPSAnTUFZX1JFUExBQ0UnLFxuICAvKiogVGhlIGV4aXN0aW5nIHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgZGVzdHJveWVkICovXG4gIFdJTExfREVTVFJPWSA9ICdXSUxMX0RFU1RST1knLFxuICAvKiogVGhlIGV4aXN0aW5nIHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIENsb3VkRm9ybWF0aW9uIHN1cGVydmlzaW9uICovXG4gIFdJTExfT1JQSEFOID0gJ1dJTExfT1JQSEFOJyxcbiAgLyoqIFRoZXJlIGlzIG5vIGNoYW5nZSBpbiB0aGlzIHJlc291cmNlICovXG4gIE5PX0NIQU5HRSA9ICdOT19DSEFOR0UnLFxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYXMgYSByZWR1Y2VyIHRvIG9idGFpbiB0aGUgcmVzb3VyY2UtbGV2ZWwgaW1wYWN0IG9mIGEgbGlzdFxuICogb2YgcHJvcGVydHktbGV2ZWwgaW1wYWN0cy5cbiAqIEBwYXJhbSBvbmUgdGhlIGN1cnJlbnQgd29yc3QgaW1wYWN0IHNvIGZhci5cbiAqIEBwYXJhbSB0d28gdGhlIG5ldyBpbXBhY3QgYmVpbmcgY29uc2lkZXJlZCAoY2FuIGJlIHVuZGVmaW5lZCwgYXMgd2UgbWF5IG5vdCBhbHdheXMgYmVcbiAqICAgICAgYWJsZSB0byBkZXRlcm1pbmUgc29tZSBwZXJvcGVydHkncyBpbXBhY3QpLlxuICovXG5mdW5jdGlvbiB3b3JzdEltcGFjdChvbmU6IFJlc291cmNlSW1wYWN0LCB0d28/OiBSZXNvdXJjZUltcGFjdCk6IFJlc291cmNlSW1wYWN0IHtcbiAgaWYgKCF0d28pIHsgcmV0dXJuIG9uZTsgfVxuICBjb25zdCBiYWRuZXNzID0ge1xuICAgIFtSZXNvdXJjZUltcGFjdC5OT19DSEFOR0VdOiAwLFxuICAgIFtSZXNvdXJjZUltcGFjdC5XSUxMX1VQREFURV06IDEsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFXTogMixcbiAgICBbUmVzb3VyY2VJbXBhY3QuV0lMTF9PUlBIQU5dOiAzLFxuICAgIFtSZXNvdXJjZUltcGFjdC5NQVlfUkVQTEFDRV06IDQsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRV06IDUsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfREVTVFJPWV06IDYsXG4gIH07XG4gIHJldHVybiBiYWRuZXNzW29uZV0gPiBiYWRuZXNzW3R3b10gPyBvbmUgOiB0d287XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2Uge1xuICBUeXBlOiBzdHJpbmc7XG4gIFByb3BlcnRpZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ2hhbmdlIHRvIGEgc2luZ2xlIHJlc291cmNlIGJldHdlZW4gdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlc1xuICpcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIG11dGF0ZWQgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VEaWZmZXJlbmNlIGltcGxlbWVudHMgSURpZmZlcmVuY2U8UmVzb3VyY2U+IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyByZXNvdXJjZSB3YXMgYWRkZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc0FkZGl0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcmVzb3VyY2Ugd2FzIHJlbW92ZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc1JlbW92YWw6IGJvb2xlYW47XG5cbiAgLyoqIFByb3BlcnR5LWxldmVsIGNoYW5nZXMgb24gdGhlIHJlc291cmNlICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlEaWZmczogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9O1xuXG4gIC8qKiBDaGFuZ2VzIHRvIG5vbi1wcm9wZXJ0eSBsZXZlbCBhdHRyaWJ1dGVzIG9mIHRoZSByZXNvdXJjZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG90aGVyRGlmZnM6IHsgW2tleTogc3RyaW5nXTogRGlmZmVyZW5jZTxhbnk+IH07XG5cbiAgLyoqIFRoZSByZXNvdXJjZSB0eXBlIChvciBvbGQgYW5kIG5ldyB0eXBlIGlmIGl0IGhhcyBjaGFuZ2VkKSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlVHlwZXM6IHsgcmVhZG9ubHkgb2xkVHlwZT86IHN0cmluZywgcmVhZG9ubHkgbmV3VHlwZT86IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBvbGRWYWx1ZTogUmVzb3VyY2UgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IG5ld1ZhbHVlOiBSZXNvdXJjZSB8IHVuZGVmaW5lZCxcbiAgICBhcmdzOiB7XG4gICAgICByZXNvdXJjZVR5cGU6IHsgb2xkVHlwZT86IHN0cmluZywgbmV3VHlwZT86IHN0cmluZyB9LFxuICAgICAgcHJvcGVydHlEaWZmczogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9LFxuICAgICAgb3RoZXJEaWZmczogeyBba2V5OiBzdHJpbmddOiBEaWZmZXJlbmNlPGFueT4gfVxuICAgIH0sXG4gICkge1xuICAgIHRoaXMucmVzb3VyY2VUeXBlcyA9IGFyZ3MucmVzb3VyY2VUeXBlO1xuICAgIHRoaXMucHJvcGVydHlEaWZmcyA9IGFyZ3MucHJvcGVydHlEaWZmcztcbiAgICB0aGlzLm90aGVyRGlmZnMgPSBhcmdzLm90aGVyRGlmZnM7XG5cbiAgICB0aGlzLmlzQWRkaXRpb24gPSBvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNSZW1vdmFsID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2xkUHJvcGVydGllcygpOiBQcm9wZXJ0eU1hcCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub2xkVmFsdWUgJiYgdGhpcy5vbGRWYWx1ZS5Qcm9wZXJ0aWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdQcm9wZXJ0aWVzKCk6IFByb3BlcnR5TWFwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5uZXdWYWx1ZSAmJiB0aGlzLm5ld1ZhbHVlLlByb3BlcnRpZXM7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHJlc291cmNlIHdhcyBtb2RpZmllZCBhdCBhbGxcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEaWZmZXJlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlmZmVyZW5jZUNvdW50ID4gMCB8fCB0aGlzLm9sZFJlc291cmNlVHlwZSAhPT0gdGhpcy5uZXdSZXNvdXJjZVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVzb3VyY2Ugd2FzIHVwZGF0ZWQgaW4tcGxhY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNVcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaWZmZXJlbnQgJiYgIXRoaXMuaXNBZGRpdGlvbiAmJiAhdGhpcy5pc1JlbW92YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9sZFJlc291cmNlVHlwZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmV3UmVzb3VyY2VUeXBlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBhY3R1YWwgcHJvcGVydHkgdXBkYXRlc1xuICAgKi9cbiAgcHVibGljIGdldCBwcm9wZXJ0eVVwZGF0ZXMoKTogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5wcm9wZXJ0eURpZmZzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgYWN0dWFsIFwib3RoZXJcIiB1cGRhdGVzXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVyQ2hhbmdlcygpOiB7IFtrZXk6IHN0cmluZ106IERpZmZlcmVuY2U8YW55PiB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5vdGhlckRpZmZzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgcmVzb3VyY2UgdHlwZSB3YXMgY2hhbmdlZCBpbiB0aGlzIGRpZmZcbiAgICpcbiAgICogVGhpcyBpcyBub3QgYSB2YWxpZCBvcGVyYXRpb24gaW4gQ2xvdWRGb3JtYXRpb24gYnV0IHRvIGJlIGRlZmVuc2l2ZSB3ZSdyZSBnb2luZ1xuICAgKiB0byBiZSBhd2FyZSBvZiBpdCBhbnl3YXkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlVHlwZUNoYW5nZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgdGhpcy5yZXNvdXJjZVR5cGVzLm9sZFR5cGUgIT09IHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgaWYgaXQgd2FzIHVuY2hhbmdlZFxuICAgKlxuICAgKiBJZiB0aGUgcmVzb3VyY2UgdHlwZSB3YXMgY2hhbmdlZCwgaXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlVHlwZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCAucmVzb3VyY2VUeXBlLCBiZWNhdXNlIHRoZSB0eXBlIHdhcyBjaGFuZ2VkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZSB8fCB0aGlzLnJlc291cmNlVHlwZXMubmV3VHlwZSE7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBhIFByb3BlcnR5Q2hhbmdlIGluIHRoaXMgb2JqZWN0XG4gICAqXG4gICAqIFRoaXMgYWZmZWN0cyB0aGUgcHJvcGVydHkgZGlmZiBhcyBpdCBpcyBzdW1tYXJpemVkIHRvIHVzZXJzLCBidXQgaXQgRE9FU1xuICAgKiBOT1QgYWZmZWN0IGVpdGhlciB0aGUgXCJvbGRWYWx1ZVwiIG9yIFwibmV3VmFsdWVcIiB2YWx1ZXM7IHRob3NlIHN0aWxsIGNvbnRhaW5cbiAgICogdGhlIGFjdHVhbCB0ZW1wbGF0ZSB2YWx1ZXMgYXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgKHRoZXkgbWlnaHQgc3RpbGwgYmVcbiAgICogdXNlZCBmb3IgZG93bnN0cmVhbSBwcm9jZXNzaW5nKS5cbiAgICovXG4gIHB1YmxpYyBzZXRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWU6IHN0cmluZywgY2hhbmdlOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55Pikge1xuICAgIHRoaXMucHJvcGVydHlEaWZmc1twcm9wZXJ0eU5hbWVdID0gY2hhbmdlO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGFuZ2VJbXBhY3QoKTogUmVzb3VyY2VJbXBhY3Qge1xuICAgIC8vIENoZWNrIHRoZSBUeXBlIGZpcnN0XG4gICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlcy5vbGRUeXBlICE9PSB0aGlzLnJlc291cmNlVHlwZXMubmV3VHlwZSkge1xuICAgICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlcy5vbGRUeXBlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIFJlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFOyB9XG4gICAgICBpZiAodGhpcy5yZXNvdXJjZVR5cGVzLm5ld1R5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbGRWYWx1ZSEuRGVsZXRpb25Qb2xpY3kgPT09ICdSZXRhaW4nXG4gICAgICAgICAgPyBSZXNvdXJjZUltcGFjdC5XSUxMX09SUEhBTlxuICAgICAgICAgIDogUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRTtcbiAgICB9XG5cbiAgICAvLyBCYXNlIGltcGFjdCAoYmVmb3JlIHdlIG1peCBpbiB0aGUgd29yc3Qgb2YgdGhlIHByb3BlcnR5IGltcGFjdHMpO1xuICAgIC8vIFdJTExfVVBEQVRFIGlmIHdlIGhhdmUgXCJvdGhlclwiIGNoYW5nZXMsIE5PX0NIQU5HRSBpZiB0aGVyZSBhcmUgbm8gXCJvdGhlclwiIGNoYW5nZXMuXG4gICAgY29uc3QgYmFzZUltcGFjdCA9IE9iamVjdC5rZXlzKHRoaXMub3RoZXJDaGFuZ2VzKS5sZW5ndGggPiAwID8gUmVzb3VyY2VJbXBhY3QuV0lMTF9VUERBVEUgOiBSZXNvdXJjZUltcGFjdC5OT19DSEFOR0U7XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnByb3BlcnR5RGlmZnMpXG4gICAgICAubWFwKGVsdCA9PiBlbHQuY2hhbmdlSW1wYWN0KVxuICAgICAgLnJlZHVjZSh3b3JzdEltcGFjdCwgYmFzZUltcGFjdCk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgb2YgYWN0dWFsIGRpZmZlcmVuY2VzIChub3Qgb2YgZWxlbWVudHMpXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMucHJvcGVydHlVcGRhdGVzKS5sZW5ndGhcbiAgICAgICsgT2JqZWN0LnZhbHVlcyh0aGlzLm90aGVyQ2hhbmdlcykubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBhIGNhbGxiYWNrIGZvciBlYWNoIGFjdHVhbCBkaWZmZXJlbmNlXG4gICAqL1xuICBwdWJsaWMgZm9yRWFjaERpZmZlcmVuY2UoY2I6ICh0eXBlOiAnUHJvcGVydHknIHwgJ090aGVyJywgbmFtZTogc3RyaW5nLCB2YWx1ZTogRGlmZmVyZW5jZTxhbnk+IHwgUHJvcGVydHlEaWZmZXJlbmNlPGFueT4pID0+IGFueSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMucHJvcGVydHlVcGRhdGVzKS5zb3J0KCkpIHtcbiAgICAgIGNiKCdQcm9wZXJ0eScsIGtleSwgdGhpcy5wcm9wZXJ0eVVwZGF0ZXNba2V5XSk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMub3RoZXJDaGFuZ2VzKS5zb3J0KCkpIHtcbiAgICAgIGNiKCdPdGhlcicsIGtleSwgdGhpcy5vdGhlckRpZmZzW2tleV0pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wZXJ0eURpZmZlcmVuY2U8VD4oZGlmZjogRGlmZmVyZW5jZTxUPik6IGRpZmYgaXMgUHJvcGVydHlEaWZmZXJlbmNlPFQ+IHtcbiAgcmV0dXJuIChkaWZmIGFzIFByb3BlcnR5RGlmZmVyZW5jZTxUPikuY2hhbmdlSW1wYWN0ICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmlsdGVyIGEgbWFwIG9mIElEaWZmZXJlbmNlcyBkb3duIHRvIG9ubHkgcmV0YWluIHRoZSBhY3R1YWwgY2hhbmdlc1xuICovXG5mdW5jdGlvbiBvbmx5Q2hhbmdlczxWLCBUIGV4dGVuZHMgSURpZmZlcmVuY2U8Vj4+KHhzOiB7W2tleTogc3RyaW5nXTogVH0pOiB7W2tleTogc3RyaW5nXTogVH0ge1xuICBjb25zdCByZXQ6IHsgW2tleTogc3RyaW5nXTogVCB9ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgZGlmZl0gb2YgT2JqZWN0LmVudHJpZXMoeHMpKSB7XG4gICAgaWYgKGRpZmYuaXNEaWZmZXJlbnQpIHtcbiAgICAgIHJldFtrZXldID0gZGlmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ== /***/ }), /***/ 3089: -/***/ ((__unused_webpack_module, exports) => { +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.mangleLikeCloudFormation = exports.unionOf = exports.diffKeyedEntities = exports.deepEqual = void 0; +exports.loadResourceModel = exports.mangleLikeCloudFormation = exports.unionOf = exports.diffKeyedEntities = exports.deepEqual = void 0; +const aws_service_spec_1 = __nccwpck_require__(45617); /** * Compares two objects for equality, deeply. The function handles arguments that are * +null+, +undefined+, arrays and objects. For objects, the function will not take the @@ -10697,7 +10030,26 @@ exports.mangleLikeCloudFormation = mangleLikeCloudFormation; function safeParseFloat(str) { return Number(str); } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFnQixTQUFTLENBQUMsTUFBVyxFQUFFLE1BQVc7SUFDaEQsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUM7S0FBRTtJQUN2QyxrRUFBa0U7SUFDbEUsSUFBSSxDQUFDLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQztRQUM1RCxDQUFDLE9BQU8sTUFBTSxLQUFLLFNBQVMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQzNDLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCwyREFBMkQ7SUFDM0QsMENBQTBDO0lBQzFDLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDO1FBQzFELGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDckQsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELElBQUksT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEVBQUU7UUFBRSxPQUFPLEtBQUssQ0FBQztLQUFFO0lBQ3RELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7S0FBRTtJQUN0RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsOEJBQThCLEVBQUU7UUFDeEQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO1FBQ3RELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFHLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUFFLE9BQU8sS0FBSyxDQUFDO2FBQUU7U0FDeEQ7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsbUNBQW1DLEVBQUU7UUFDbEUsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDdEMsMENBQTBDO1lBQzFDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1NBQUU7UUFDakUsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7YUFBRTtZQUNsRCxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO29CQUFFLE9BQU8sS0FBSyxDQUFDO2lCQUFFO2dCQUFBLENBQUM7Z0JBQ2pFLDJDQUEyQztnQkFDM0MsU0FBUzthQUNWO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7YUFBRTtTQUM1RDtRQUNELE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCw2REFBNkQ7SUFDN0Qsd0RBQXdEO0lBQ3hELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQTVDRCw4QkE0Q0M7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBVyxFQUFFLE1BQVc7SUFDOUMsMkNBQTJDO0lBQzNDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ25ELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRXpELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUN2RCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELG1GQUFtRjtJQUNuRixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNsRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1NBQUU7UUFDdEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUcsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO29CQUNuRSxPQUFPLEtBQUssQ0FBQztpQkFDZDtnQkFDRCxNQUFNO2FBQ1A7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLGlCQUFpQixDQUMvQixRQUE0QyxFQUM1QyxRQUE0QyxFQUM1QyxXQUFpRTtJQUNqRSxNQUFNLE1BQU0sR0FBMEIsRUFBRSxDQUFDO0lBQ3pDLEtBQUssTUFBTSxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDekYsTUFBTSxVQUFVLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRW5ELElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQ3hELDhEQUE4RDtZQUM5RCxTQUFTO1NBQ1Y7UUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDcEU7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBakJELDhDQWlCQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixPQUFPLENBQUMsRUFBMEIsRUFBRSxFQUEwQjtJQUM1RSxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzQixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2Y7SUFDRCxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQU5ELDBCQU1DO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLE9BQWU7SUFDdEQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFGRCw0REFFQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxHQUFXO0lBQ2pDLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXBhcmVzIHR3byBvYmplY3RzIGZvciBlcXVhbGl0eSwgZGVlcGx5LiBUaGUgZnVuY3Rpb24gaGFuZGxlcyBhcmd1bWVudHMgdGhhdCBhcmVcbiAqICtudWxsKywgK3VuZGVmaW5lZCssIGFycmF5cyBhbmQgb2JqZWN0cy4gRm9yIG9iamVjdHMsIHRoZSBmdW5jdGlvbiB3aWxsIG5vdCB0YWtlIHRoZVxuICogb2JqZWN0IHByb3RvdHlwZSBpbnRvIGFjY291bnQgZm9yIHRoZSBwdXJwb3NlIG9mIHRoZSBjb21wYXJpc29uLCBvbmx5IHRoZSB2YWx1ZXMgb2ZcbiAqIHByb3BlcnRpZXMgcmVwb3J0ZWQgYnkgK09iamVjdC5rZXlzKy5cbiAqXG4gKiBJZiBib3RoIG9wZXJhbmRzIGNhbiBiZSBwYXJzZWQgdG8gZXF1aXZhbGVudCBudW1iZXJzLCB3aWxsIHJldHVybiB0cnVlLlxuICogVGhpcyBtYWtlcyBkaWZmIGNvbnNpc3RlbnQgd2l0aCBDbG91ZEZvcm1hdGlvbiwgd2hlcmUgYSBudW1lcmljIDEwIGFuZCBhIGxpdGVyYWwgXCIxMFwiXG4gKiBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50LlxuICpcbiAqIEBwYXJhbSBsdmFsdWUgdGhlIGxlZnQgb3BlcmFuZCBvZiB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqIEBwYXJhbSBydmFsdWUgdGhlIHJpZ2h0IG9wZXJhbmQgb2YgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24uXG4gKlxuICogQHJldHVybnMgK3RydWUrIGlmIGJvdGggK2x2YWx1ZSsgYW5kICtydmFsdWUrIGFyZSBlcXVpdmFsZW50IHRvIGVhY2ggb3RoZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwobHZhbHVlOiBhbnksIHJ2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIGlmIChsdmFsdWUgPT09IHJ2YWx1ZSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAvLyBDbG91ZEZvcm1hdGlvbiBhbGxvd3MgcGFzc2luZyBzdHJpbmdzIGludG8gYm9vbGVhbi10eXBlZCBmaWVsZHNcbiAgaWYgKCgodHlwZW9mIGx2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHJ2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB8fFxuICAgICAgKHR5cGVvZiBsdmFsdWUgPT09ICdib29sZWFuJyAmJiB0eXBlb2YgcnZhbHVlID09PSAnc3RyaW5nJykpICYmXG4gICAgICBsdmFsdWUudG9TdHJpbmcoKSA9PT0gcnZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBhbGxvd3MgYSBudW1lcmljIDEwIGFuZCBhIGxpdGVyYWwgXCIxMFwiIHRvIGJlIGVxdWl2YWxlbnQ7XG4gIC8vIHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIENsb3VkRm9ybWF0aW9uLlxuICBpZiAoKHR5cGVvZiBsdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBydmFsdWUgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgc2FmZVBhcnNlRmxvYXQobHZhbHVlKSA9PT0gc2FmZVBhcnNlRmxvYXQocnZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgbHZhbHVlICE9PSB0eXBlb2YgcnZhbHVlKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoQXJyYXkuaXNBcnJheShsdmFsdWUpICE9PSBBcnJheS5pc0FycmF5KHJ2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChBcnJheS5pc0FycmF5KGx2YWx1ZSkgLyogJiYgQXJyYXkuaXNBcnJheShydmFsdWUpICovKSB7XG4gICAgaWYgKGx2YWx1ZS5sZW5ndGggIT09IHJ2YWx1ZS5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZm9yIChsZXQgaSA9IDAgOyBpIDwgbHZhbHVlLmxlbmd0aCA7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwobHZhbHVlW2ldLCBydmFsdWVbaV0pKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIGx2YWx1ZSA9PT0gJ29iamVjdCcgLyogJiYgdHlwZW9mIHJ2YWx1ZSA9PT0gJ29iamVjdCcgKi8pIHtcbiAgICBpZiAobHZhbHVlID09PSBudWxsIHx8IHJ2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgYm90aCB3ZXJlIG51bGwsIHRoZXknZCBoYXZlIGJlZW4gPT09XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhsdmFsdWUpO1xuICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMocnZhbHVlKS5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFydmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgIGlmIChrZXkgPT09ICdEZXBlbmRzT24nKSB7XG4gICAgICAgIGlmICghZGVwZW5kc09uRXF1YWwobHZhbHVlW2tleV0sIHJ2YWx1ZVtrZXldKSkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgICAgIC8vIGNoZWNrIGRpZmZlcmVuY2VzIG90aGVyIHRoYW4gYERlcGVuZHNPbmBcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWRlZXBFcXVhbChsdmFsdWVba2V5XSwgcnZhbHVlW2tleV0pKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBOZWl0aGVyIG9iamVjdCwgbm9yIGFycmF5OiBJIGRlZHVjZSB0aGlzIGlzIHByaW1pdGl2ZSB0eXBlXG4gIC8vIFByaW1pdGl2ZSB0eXBlIGFuZCBub3QgPT09LCBzbyBJIGRlZHVjZSBub3QgZGVlcEVxdWFsXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gYXJndW1lbnRzIHRvIERlcGVuZHNPbiBmb3IgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIGx2YWx1ZSB0aGUgbGVmdCBvcGVyYW5kIG9mIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uLlxuICogQHBhcmFtIHJ2YWx1ZSB0aGUgcmlnaHQgb3BlcmFuZCBvZiB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqXG4gKiBAcmV0dXJucyArdHJ1ZSsgaWYgYm90aCArbHZhbHVlKyBhbmQgK3J2YWx1ZSsgYXJlIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlci5cbiAqL1xuZnVuY3Rpb24gZGVwZW5kc09uRXF1YWwobHZhbHVlOiBhbnksIHJ2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIC8vIGFsbG93cyBbJ1ZhbHVlJ10gYW5kICdWYWx1ZScgdG8gYmUgZXF1YWxcbiAgaWYgKEFycmF5LmlzQXJyYXkobHZhbHVlKSAhPT0gQXJyYXkuaXNBcnJheShydmFsdWUpKSB7XG4gICAgY29uc3QgYXJyYXkgPSBBcnJheS5pc0FycmF5KGx2YWx1ZSkgPyBsdmFsdWUgOiBydmFsdWU7XG4gICAgY29uc3Qgbm9uQXJyYXkgPSBBcnJheS5pc0FycmF5KGx2YWx1ZSkgPyBydmFsdWUgOiBsdmFsdWU7XG5cbiAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAxICYmIGRlZXBFcXVhbChhcnJheVswXSwgbm9uQXJyYXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gYWxsb3dzIGFycmF5cyBwYXNzZWQgdG8gRGVwZW5kc09uIHRvIGJlIGVxdWl2YWxlbnQgaXJyZXNwZWN0aXZlIG9mIGVsZW1lbnQgb3JkZXJcbiAgaWYgKEFycmF5LmlzQXJyYXkobHZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHJ2YWx1ZSkpIHtcbiAgICBpZiAobHZhbHVlLmxlbmd0aCAhPT0gcnZhbHVlLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGxldCBpID0gMCA7IGkgPCBsdmFsdWUubGVuZ3RoIDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMCA7IGogPCBsdmFsdWUubGVuZ3RoIDsgaisrKSB7XG4gICAgICAgIGlmICgoIWRlZXBFcXVhbChsdmFsdWVbaV0sIHJ2YWx1ZVtqXSkpICYmIChqID09PSBsdmFsdWUubGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFByb2R1Y2UgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIG1hcHMsIGFzIGEgbWFwLCB1c2luZyBhIHNwZWNpZmllZCBkaWZmIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBvbGRWYWx1ZSAgdGhlIG9sZCBtYXAuXG4gKiBAcGFyYW0gbmV3VmFsdWUgIHRoZSBuZXcgbWFwLlxuICogQHBhcmFtIGVsZW1lbnREaWZmIHRoZSBkaWZmIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIGEgbWFwIHJlcHJlc2VudGluZyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiArb2xkVmFsdWUrIGFuZCArbmV3VmFsdWUrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZktleWVkRW50aXRpZXM8VD4oXG4gIG9sZFZhbHVlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkLFxuICBuZXdWYWx1ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCxcbiAgZWxlbWVudERpZmY6IChvbGRFbGVtZW50OiBhbnksIG5ld0VsZW1lbnQ6IGFueSwga2V5OiBzdHJpbmcpID0+IFQpOiB7IFtuYW1lOiBzdHJpbmddOiBUIH0ge1xuICBjb25zdCByZXN1bHQ6IHsgW25hbWU6IHN0cmluZ106IFQgfSA9IHt9O1xuICBmb3IgKGNvbnN0IGxvZ2ljYWxJZCBvZiB1bmlvbk9mKE9iamVjdC5rZXlzKG9sZFZhbHVlIHx8IHt9KSwgT2JqZWN0LmtleXMobmV3VmFsdWUgfHwge30pKSkge1xuICAgIGNvbnN0IG9sZEVsZW1lbnQgPSBvbGRWYWx1ZSAmJiBvbGRWYWx1ZVtsb2dpY2FsSWRdO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZVtsb2dpY2FsSWRdO1xuXG4gICAgaWYgKG9sZEVsZW1lbnQgPT09IHVuZGVmaW5lZCAmJiBuZXdFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFNob3VsZG4ndCBoYXBwZW4gaW4gcmVhbGl0eSwgYnV0IG1heSBoYXBwZW4gaW4gdGVzdHMuIFNraXAuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXN1bHRbbG9naWNhbElkXSA9IGVsZW1lbnREaWZmKG9sZEVsZW1lbnQsIG5ld0VsZW1lbnQsIGxvZ2ljYWxJZCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgdW5pb24gb2YgdHdvIHNldHMgb2Ygc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0gbHYgdGhlIGxlZnQgc2V0IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gcnYgdGhlIHJpZ2h0IHNldCBvZiBzdHJpbmdzLlxuICpcbiAqIEByZXR1cm5zIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lYnRzIGZyb20gK2x2KyBhbmQgK3J2Kywgd2l0aCBubyBkdXBsaWNhdGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pb25PZihsdjogc3RyaW5nW10gfCBTZXQ8c3RyaW5nPiwgcnY6IHN0cmluZ1tdIHwgU2V0PHN0cmluZz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQobHYpO1xuICBmb3IgKGNvbnN0IHYgb2YgcnYpIHtcbiAgICByZXN1bHQuYWRkKHYpO1xuICB9XG4gIHJldHVybiBuZXcgQXJyYXkoLi4ucmVzdWx0KTtcbn1cblxuLyoqXG4gKiBHZXRTdGFja1RlbXBsYXRlIGZsYXR0ZW5zIGFueSBjb2RlcG9pbnQgZ3JlYXRlciB0aGFuIFwiXFx1N2ZcIiB0byBcIj9cIi4gVGhpcyBpc1xuICogdHJ1ZSBldmVuIGZvciBjb2RlcG9pbnRzIGluIHRoZSBzdXBwbGVtZW50YWwgcGxhbmVzIHdoaWNoIGFyZSByZXByZXNlbnRlZFxuICogaW4gSlMgYXMgc3Vycm9nYXRlIHBhaXJzLCBhbGwgdGhlIHdheSB1cCB0byBcIlxcdXsxMGZmZmZ9XCIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBzYW1lIG1hbmdsaW5nIGluIG9yZGVyIHRvIHByb3ZpZGUgZGlhZ25vc3RpY1xuICogaW5mb3JtYXRpb24gaW4gYGNkayBkaWZmYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbmdsZUxpa2VDbG91ZEZvcm1hdGlvbihwYXlsb2FkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHBheWxvYWQucmVwbGFjZSgvW1xcdXs4MH0tXFx1ezEwZmZmZn1dL2d1LCAnPycpO1xufVxuXG4vKipcbiAqIEEgcGFyc2VGbG9hdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGZvclxuICogc3RyaW5ncyBsaWtlICcwLjAuMCdcbiAqIChmb3Igd2hpY2ggSmF2YVNjcmlwdCdzIHBhcnNlRmxvYXQoKSByZXR1cm5zIDApLlxuICogV2UgcmV0dXJuIE5hTiBmb3IgYWxsIG9mIHRoZXNlIHN0cmluZ3MgdGhhdCBkbyBub3QgcmVwcmVzZW50IG51bWJlcnMsXG4gKiBhbmQgc28gY29tcGFyaW5nIHRoZW0gZmFpbHMsXG4gKiBhbmQgZG9lc24ndCBzaG9ydC1jaXJjdWl0IHRoZSBkaWZmIGxvZ2ljLlxuICovXG5mdW5jdGlvbiBzYWZlUGFyc2VGbG9hdChzdHI6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBOdW1iZXIoc3RyKTtcbn1cbiJdfQ== +/** + * Lazily load the service spec database and cache the loaded db +*/ +let DATABASE; +function database() { + if (!DATABASE) { + DATABASE = (0, aws_service_spec_1.loadAwsServiceSpecSync)(); + } + return DATABASE; +} +/** + * Load a Resource model from the Service Spec Database + * + * The database is loaded lazily and cached across multiple calls to `loadResourceModel`. + */ +function loadResourceModel(type) { + return database().lookup('resource', 'cloudFormationType', 'equals', type).at(0); +} +exports.loadResourceModel = loadResourceModel; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0VBQW1FO0FBR25FOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLE1BQVcsRUFBRSxNQUFXO0lBQ2hELElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRTtRQUFFLE9BQU8sSUFBSSxDQUFDO0tBQUU7SUFDdkMsa0VBQWtFO0lBQ2xFLElBQUksQ0FBQyxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUM7UUFDNUQsQ0FBQyxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUMzQyxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsMkRBQTJEO0lBQzNELDBDQUEwQztJQUMxQyxJQUFJLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQztRQUMxRCxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3JELE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxJQUFJLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7S0FBRTtJQUN0RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0tBQUU7SUFDdEUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLDhCQUE4QixFQUFFO1FBQ3hELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7U0FBRTtRQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRyxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFBRSxPQUFPLEtBQUssQ0FBQzthQUFFO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLG1DQUFtQyxFQUFFO1FBQ2xFLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ3RDLDBDQUEwQztZQUMxQyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO1FBQ2pFLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUFFLE9BQU8sS0FBSyxDQUFDO2FBQUU7WUFDbEQsSUFBSSxHQUFHLEtBQUssV0FBVyxFQUFFO2dCQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFBRSxPQUFPLEtBQUssQ0FBQztpQkFBRTtnQkFBQSxDQUFDO2dCQUNqRSwyQ0FBMkM7Z0JBQzNDLFNBQVM7YUFDVjtZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUFFLE9BQU8sS0FBSyxDQUFDO2FBQUU7U0FDNUQ7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsNkRBQTZEO0lBQzdELHdEQUF3RDtJQUN4RCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUE1Q0QsOEJBNENDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQVcsRUFBRSxNQUFXO0lBQzlDLDJDQUEyQztJQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNuRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUV6RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDdkQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxtRkFBbUY7SUFDbkYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO1FBQ3RELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFHLENBQUMsRUFBRSxFQUFFO1lBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFHLENBQUMsRUFBRSxFQUFFO2dCQUN4QyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDbkUsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsTUFBTTthQUNQO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FDL0IsUUFBNEMsRUFDNUMsUUFBNEMsRUFDNUMsV0FBaUU7SUFDakUsTUFBTSxNQUFNLEdBQTBCLEVBQUUsQ0FBQztJQUN6QyxLQUFLLE1BQU0sU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ3pGLE1BQU0sVUFBVSxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVuRCxJQUFJLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUN4RCw4REFBOEQ7WUFDOUQsU0FBUztTQUNWO1FBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ3BFO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQWpCRCw4Q0FpQkM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsT0FBTyxDQUFDLEVBQTBCLEVBQUUsRUFBMEI7SUFDNUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNmO0lBQ0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFORCwwQkFNQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxPQUFlO0lBQ3RELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRkQsNERBRUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxjQUFjLENBQUMsR0FBVztJQUNqQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQ7O0VBRUU7QUFDRixJQUFJLFFBQWtDLENBQUM7QUFDdkMsU0FBUyxRQUFRO0lBQ2YsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNiLFFBQVEsR0FBRyxJQUFBLHlDQUFzQixHQUFFLENBQUM7S0FDckM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLElBQVk7SUFDNUMsT0FBTyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQUZELDhDQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9hZEF3c1NlcnZpY2VTcGVjU3luYyB9IGZyb20gJ0Bhd3MtY2RrL2F3cy1zZXJ2aWNlLXNwZWMnO1xuaW1wb3J0IHsgUmVzb3VyY2UsIFNwZWNEYXRhYmFzZSB9IGZyb20gJ0Bhd3MtY2RrL3NlcnZpY2Utc3BlYy10eXBlcyc7XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCBkZWVwbHkuIFRoZSBmdW5jdGlvbiBoYW5kbGVzIGFyZ3VtZW50cyB0aGF0IGFyZVxuICogK251bGwrLCArdW5kZWZpbmVkKywgYXJyYXlzIGFuZCBvYmplY3RzLiBGb3Igb2JqZWN0cywgdGhlIGZ1bmN0aW9uIHdpbGwgbm90IHRha2UgdGhlXG4gKiBvYmplY3QgcHJvdG90eXBlIGludG8gYWNjb3VudCBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhlIGNvbXBhcmlzb24sIG9ubHkgdGhlIHZhbHVlcyBvZlxuICogcHJvcGVydGllcyByZXBvcnRlZCBieSArT2JqZWN0LmtleXMrLlxuICpcbiAqIElmIGJvdGggb3BlcmFuZHMgY2FuIGJlIHBhcnNlZCB0byBlcXVpdmFsZW50IG51bWJlcnMsIHdpbGwgcmV0dXJuIHRydWUuXG4gKiBUaGlzIG1ha2VzIGRpZmYgY29uc2lzdGVudCB3aXRoIENsb3VkRm9ybWF0aW9uLCB3aGVyZSBhIG51bWVyaWMgMTAgYW5kIGEgbGl0ZXJhbCBcIjEwXCJcbiAqIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQuXG4gKlxuICogQHBhcmFtIGx2YWx1ZSB0aGUgbGVmdCBvcGVyYW5kIG9mIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uLlxuICogQHBhcmFtIHJ2YWx1ZSB0aGUgcmlnaHQgb3BlcmFuZCBvZiB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqXG4gKiBAcmV0dXJucyArdHJ1ZSsgaWYgYm90aCArbHZhbHVlKyBhbmQgK3J2YWx1ZSsgYXJlIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChsdmFsdWU6IGFueSwgcnZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKGx2YWx1ZSA9PT0gcnZhbHVlKSB7IHJldHVybiB0cnVlOyB9XG4gIC8vIENsb3VkRm9ybWF0aW9uIGFsbG93cyBwYXNzaW5nIHN0cmluZ3MgaW50byBib29sZWFuLXR5cGVkIGZpZWxkc1xuICBpZiAoKCh0eXBlb2YgbHZhbHVlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgcnZhbHVlID09PSAnYm9vbGVhbicpIHx8XG4gICAgICAodHlwZW9mIGx2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiBydmFsdWUgPT09ICdzdHJpbmcnKSkgJiZcbiAgICAgIGx2YWx1ZS50b1N0cmluZygpID09PSBydmFsdWUudG9TdHJpbmcoKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIGFsbG93cyBhIG51bWVyaWMgMTAgYW5kIGEgbGl0ZXJhbCBcIjEwXCIgdG8gYmUgZXF1aXZhbGVudDtcbiAgLy8gdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggQ2xvdWRGb3JtYXRpb24uXG4gIGlmICgodHlwZW9mIGx2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHJ2YWx1ZSA9PT0gJ3N0cmluZycpICYmXG4gICAgICBzYWZlUGFyc2VGbG9hdChsdmFsdWUpID09PSBzYWZlUGFyc2VGbG9hdChydmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBsdmFsdWUgIT09IHR5cGVvZiBydmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChBcnJheS5pc0FycmF5KGx2YWx1ZSkgIT09IEFycmF5LmlzQXJyYXkocnZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKEFycmF5LmlzQXJyYXkobHZhbHVlKSAvKiAmJiBBcnJheS5pc0FycmF5KHJ2YWx1ZSkgKi8pIHtcbiAgICBpZiAobHZhbHVlLmxlbmd0aCAhPT0gcnZhbHVlLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGxldCBpID0gMCA7IGkgPCBsdmFsdWUubGVuZ3RoIDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChsdmFsdWVbaV0sIHJ2YWx1ZVtpXSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgbHZhbHVlID09PSAnb2JqZWN0JyAvKiAmJiB0eXBlb2YgcnZhbHVlID09PSAnb2JqZWN0JyAqLykge1xuICAgIGlmIChsdmFsdWUgPT09IG51bGwgfHwgcnZhbHVlID09PSBudWxsKSB7XG4gICAgICAvLyBJZiBib3RoIHdlcmUgbnVsbCwgdGhleSdkIGhhdmUgYmVlbiA9PT1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGx2YWx1ZSk7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhydmFsdWUpLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoIXJ2YWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgaWYgKGtleSA9PT0gJ0RlcGVuZHNPbicpIHtcbiAgICAgICAgaWYgKCFkZXBlbmRzT25FcXVhbChsdmFsdWVba2V5XSwgcnZhbHVlW2tleV0pKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICAgICAgLy8gY2hlY2sgZGlmZmVyZW5jZXMgb3RoZXIgdGhhbiBgRGVwZW5kc09uYFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghZGVlcEVxdWFsKGx2YWx1ZVtrZXldLCBydmFsdWVba2V5XSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIE5laXRoZXIgb2JqZWN0LCBub3IgYXJyYXk6IEkgZGVkdWNlIHRoaXMgaXMgcHJpbWl0aXZlIHR5cGVcbiAgLy8gUHJpbWl0aXZlIHR5cGUgYW5kIG5vdCA9PT0sIHNvIEkgZGVkdWNlIG5vdCBkZWVwRXF1YWxcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBhcmd1bWVudHMgdG8gRGVwZW5kc09uIGZvciBlcXVhbGl0eS5cbiAqXG4gKiBAcGFyYW0gbHZhbHVlIHRoZSBsZWZ0IG9wZXJhbmQgb2YgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24uXG4gKiBAcGFyYW0gcnZhbHVlIHRoZSByaWdodCBvcGVyYW5kIG9mIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uLlxuICpcbiAqIEByZXR1cm5zICt0cnVlKyBpZiBib3RoICtsdmFsdWUrIGFuZCArcnZhbHVlKyBhcmUgZXF1aXZhbGVudCB0byBlYWNoIG90aGVyLlxuICovXG5mdW5jdGlvbiBkZXBlbmRzT25FcXVhbChsdmFsdWU6IGFueSwgcnZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgLy8gYWxsb3dzIFsnVmFsdWUnXSBhbmQgJ1ZhbHVlJyB0byBiZSBlcXVhbFxuICBpZiAoQXJyYXkuaXNBcnJheShsdmFsdWUpICE9PSBBcnJheS5pc0FycmF5KHJ2YWx1ZSkpIHtcbiAgICBjb25zdCBhcnJheSA9IEFycmF5LmlzQXJyYXkobHZhbHVlKSA/IGx2YWx1ZSA6IHJ2YWx1ZTtcbiAgICBjb25zdCBub25BcnJheSA9IEFycmF5LmlzQXJyYXkobHZhbHVlKSA/IHJ2YWx1ZSA6IGx2YWx1ZTtcblxuICAgIGlmIChhcnJheS5sZW5ndGggPT09IDEgJiYgZGVlcEVxdWFsKGFycmF5WzBdLCBub25BcnJheSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBhbGxvd3MgYXJyYXlzIHBhc3NlZCB0byBEZXBlbmRzT24gdG8gYmUgZXF1aXZhbGVudCBpcnJlc3BlY3RpdmUgb2YgZWxlbWVudCBvcmRlclxuICBpZiAoQXJyYXkuaXNBcnJheShsdmFsdWUpICYmIEFycmF5LmlzQXJyYXkocnZhbHVlKSkge1xuICAgIGlmIChsdmFsdWUubGVuZ3RoICE9PSBydmFsdWUubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGZvciAobGV0IGkgPSAwIDsgaSA8IGx2YWx1ZS5sZW5ndGggOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwIDsgaiA8IGx2YWx1ZS5sZW5ndGggOyBqKyspIHtcbiAgICAgICAgaWYgKCghZGVlcEVxdWFsKGx2YWx1ZVtpXSwgcnZhbHVlW2pdKSkgJiYgKGogPT09IGx2YWx1ZS5sZW5ndGggLSAxKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUHJvZHVjZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gbWFwcywgYXMgYSBtYXAsIHVzaW5nIGEgc3BlY2lmaWVkIGRpZmYgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIG9sZFZhbHVlICB0aGUgb2xkIG1hcC5cbiAqIEBwYXJhbSBuZXdWYWx1ZSAgdGhlIG5ldyBtYXAuXG4gKiBAcGFyYW0gZWxlbWVudERpZmYgdGhlIGRpZmYgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMgYSBtYXAgcmVwcmVzZW50aW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuICtvbGRWYWx1ZSsgYW5kICtuZXdWYWx1ZSsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmS2V5ZWRFbnRpdGllczxUPihcbiAgb2xkVmFsdWU6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQsXG4gIG5ld1ZhbHVlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkLFxuICBlbGVtZW50RGlmZjogKG9sZEVsZW1lbnQ6IGFueSwgbmV3RWxlbWVudDogYW55LCBrZXk6IHN0cmluZykgPT4gVCk6IHsgW25hbWU6IHN0cmluZ106IFQgfSB7XG4gIGNvbnN0IHJlc3VsdDogeyBbbmFtZTogc3RyaW5nXTogVCB9ID0ge307XG4gIGZvciAoY29uc3QgbG9naWNhbElkIG9mIHVuaW9uT2YoT2JqZWN0LmtleXMob2xkVmFsdWUgfHwge30pLCBPYmplY3Qua2V5cyhuZXdWYWx1ZSB8fCB7fSkpKSB7XG4gICAgY29uc3Qgb2xkRWxlbWVudCA9IG9sZFZhbHVlICYmIG9sZFZhbHVlW2xvZ2ljYWxJZF07XG4gICAgY29uc3QgbmV3RWxlbWVudCA9IG5ld1ZhbHVlICYmIG5ld1ZhbHVlW2xvZ2ljYWxJZF07XG5cbiAgICBpZiAob2xkRWxlbWVudCA9PT0gdW5kZWZpbmVkICYmIG5ld0VsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU2hvdWxkbid0IGhhcHBlbiBpbiByZWFsaXR5LCBidXQgbWF5IGhhcHBlbiBpbiB0ZXN0cy4gU2tpcC5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc3VsdFtsb2dpY2FsSWRdID0gZWxlbWVudERpZmYob2xkRWxlbWVudCwgbmV3RWxlbWVudCwgbG9naWNhbElkKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSB1bmlvbiBvZiB0d28gc2V0cyBvZiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSBsdiB0aGUgbGVmdCBzZXQgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSBydiB0aGUgcmlnaHQgc2V0IG9mIHN0cmluZ3MuXG4gKlxuICogQHJldHVybnMgYSBuZXcgYXJyYXkgY29udGFpbmluZyBhbGwgZWxlbWVidHMgZnJvbSArbHYrIGFuZCArcnYrLCB3aXRoIG5vIGR1cGxpY2F0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlvbk9mKGx2OiBzdHJpbmdbXSB8IFNldDxzdHJpbmc+LCBydjogc3RyaW5nW10gfCBTZXQ8c3RyaW5nPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFNldChsdik7XG4gIGZvciAoY29uc3QgdiBvZiBydikge1xuICAgIHJlc3VsdC5hZGQodik7XG4gIH1cbiAgcmV0dXJuIG5ldyBBcnJheSguLi5yZXN1bHQpO1xufVxuXG4vKipcbiAqIEdldFN0YWNrVGVtcGxhdGUgZmxhdHRlbnMgYW55IGNvZGVwb2ludCBncmVhdGVyIHRoYW4gXCJcXHU3ZlwiIHRvIFwiP1wiLiBUaGlzIGlzXG4gKiB0cnVlIGV2ZW4gZm9yIGNvZGVwb2ludHMgaW4gdGhlIHN1cHBsZW1lbnRhbCBwbGFuZXMgd2hpY2ggYXJlIHJlcHJlc2VudGVkXG4gKiBpbiBKUyBhcyBzdXJyb2dhdGUgcGFpcnMsIGFsbCB0aGUgd2F5IHVwIHRvIFwiXFx1ezEwZmZmZn1cIi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHNhbWUgbWFuZ2xpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZSBkaWFnbm9zdGljXG4gKiBpbmZvcm1hdGlvbiBpbiBgY2RrIGRpZmZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFuZ2xlTGlrZUNsb3VkRm9ybWF0aW9uKHBheWxvYWQ6IHN0cmluZykge1xuICByZXR1cm4gcGF5bG9hZC5yZXBsYWNlKC9bXFx1ezgwfS1cXHV7MTBmZmZmfV0vZ3UsICc/Jyk7XG59XG5cbi8qKlxuICogQSBwYXJzZUZsb2F0IGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyB0aGUgcmlnaHQgdGhpbmcgZm9yXG4gKiBzdHJpbmdzIGxpa2UgJzAuMC4wJ1xuICogKGZvciB3aGljaCBKYXZhU2NyaXB0J3MgcGFyc2VGbG9hdCgpIHJldHVybnMgMCkuXG4gKiBXZSByZXR1cm4gTmFOIGZvciBhbGwgb2YgdGhlc2Ugc3RyaW5ncyB0aGF0IGRvIG5vdCByZXByZXNlbnQgbnVtYmVycyxcbiAqIGFuZCBzbyBjb21wYXJpbmcgdGhlbSBmYWlscyxcbiAqIGFuZCBkb2Vzbid0IHNob3J0LWNpcmN1aXQgdGhlIGRpZmYgbG9naWMuXG4gKi9cbmZ1bmN0aW9uIHNhZmVQYXJzZUZsb2F0KHN0cjogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIE51bWJlcihzdHIpO1xufVxuXG4vKipcbiAqIExhemlseSBsb2FkIHRoZSBzZXJ2aWNlIHNwZWMgZGF0YWJhc2UgYW5kIGNhY2hlIHRoZSBsb2FkZWQgZGJcbiovXG5sZXQgREFUQUJBU0U6IFNwZWNEYXRhYmFzZSB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGRhdGFiYXNlKCk6IFNwZWNEYXRhYmFzZSB7XG4gIGlmICghREFUQUJBU0UpIHtcbiAgICBEQVRBQkFTRSA9IGxvYWRBd3NTZXJ2aWNlU3BlY1N5bmMoKTtcbiAgfVxuICByZXR1cm4gREFUQUJBU0U7XG59XG5cbi8qKlxuICogTG9hZCBhIFJlc291cmNlIG1vZGVsIGZyb20gdGhlIFNlcnZpY2UgU3BlYyBEYXRhYmFzZVxuICpcbiAqIFRoZSBkYXRhYmFzZSBpcyBsb2FkZWQgbGF6aWx5IGFuZCBjYWNoZWQgYWNyb3NzIG11bHRpcGxlIGNhbGxzIHRvIGBsb2FkUmVzb3VyY2VNb2RlbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUmVzb3VyY2VNb2RlbCh0eXBlOiBzdHJpbmcpOiBSZXNvdXJjZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBkYXRhYmFzZSgpLmxvb2t1cCgncmVzb3VyY2UnLCAnY2xvdWRGb3JtYXRpb25UeXBlJywgJ2VxdWFscycsIHR5cGUpLmF0KDApO1xufVxuIl19 /***/ }), @@ -11159,11 +10511,11 @@ class Formatter { if (!resourceDiff) { continue; } - const oldPathMetadata = resourceDiff.oldValue && resourceDiff.oldValue.Metadata && resourceDiff.oldValue.Metadata[PATH_METADATA_KEY]; + const oldPathMetadata = resourceDiff.oldValue?.Metadata?.[PATH_METADATA_KEY]; if (oldPathMetadata && !(logicalId in this.logicalToPathMap)) { this.logicalToPathMap[logicalId] = oldPathMetadata; } - const newPathMetadata = resourceDiff.newValue && resourceDiff.newValue.Metadata && resourceDiff.newValue.Metadata[PATH_METADATA_KEY]; + const newPathMetadata = resourceDiff.newValue?.Metadata?.[PATH_METADATA_KEY]; if (newPathMetadata && !(logicalId in this.logicalToPathMap)) { this.logicalToPathMap[logicalId] = newPathMetadata; } @@ -11288,7 +10640,7 @@ function _diffStrings(oldStr, newStr, context) { return indent; } } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUE4QjtBQUM5QiwrQkFBK0I7QUFFL0Isc0NBQXdDO0FBQ3hDLG1EQUF1RztBQUN2RyxpREFBNkM7QUFJN0MsY0FBYztBQUNkLE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDO0FBRXpDLDBEQUEwRDtBQUMxRCxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBTzVDOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLE1BQW9CLEVBQ3BCLFlBQTBCLEVBQzFCLG1CQUFvRCxFQUFHLEVBQ3ZELFVBQWtCLENBQUM7SUFDbkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVqRixJQUFJLFlBQVksQ0FBQyx3QkFBd0IsSUFBSSxZQUFZLENBQUMsU0FBUyxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUU7UUFDL0YsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsRUFBRSwwQkFBMEIsRUFBRSxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUMxSCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0UsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25GLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0tBQ2hDO0lBRUQsK0JBQStCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRXpELFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RSxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RFLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzdILFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBeEJELDhDQXdCQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQ25DLE1BQTZCLEVBQzdCLFlBQTBCLEVBQzFCLG1CQUFrRCxFQUFFLEVBQ3BELE9BQWdCO0lBQ2hCLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFakYsK0JBQStCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFSRCxzREFRQztBQUVELFNBQVMsK0JBQStCLENBQUMsU0FBb0IsRUFBRSxZQUEwQjtJQUN2RixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFO1FBQUUsT0FBTztLQUFFO0lBQ3JHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEQsU0FBUyxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRXhFLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0hBQWdILENBQUMsQ0FBQztJQUNwSSxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUVqQyxNQUFNLFNBQVM7SUFDYixZQUNtQixNQUFvQixFQUNwQixnQkFBaUQsRUFDbEUsSUFBbUIsRUFDRixVQUFrQixDQUFDO1FBSG5CLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQztRQUVqRCxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ3BDLGtFQUFrRTtRQUNsRSxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVztRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUEsYUFBTSxFQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBQSxhQUFNLEVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU0sYUFBYSxDQUNsQixLQUFhLEVBQ2IsU0FBaUIsRUFDakIsVUFBc0MsRUFDdEMsWUFBeUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFekYsSUFBSSxVQUFVLENBQUMsZUFBZSxLQUFLLENBQUMsRUFBRTtZQUNwQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sa0JBQWtCLENBQUMsS0FBYTtRQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGdCQUFnQixDQUFDLElBQVksRUFBRSxTQUFpQixFQUFFLElBQWlDO1FBQ3hGLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRTNDLElBQUksS0FBSyxDQUFDO1FBRVYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ2xCO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3hCLEtBQUssR0FBRyxHQUFHLFFBQVEsT0FBTyxRQUFRLEVBQUUsQ0FBQztTQUN0QzthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN6QixLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksd0JBQXdCLENBQUMsS0FBYSxFQUFFLFNBQWlCLEVBQUUsSUFBd0I7UUFDeEYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUVsRixtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWxLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzdDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUN6QyxjQUFjLElBQUksQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxLQUFLLGVBQWUsQ0FBQyxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU0sWUFBWSxDQUFJLElBQW1CO1FBQ3hDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU8sUUFBUSxDQUFDO1NBQUU7UUFDekMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQUUsT0FBTyxNQUFNLENBQUM7U0FBRTtRQUNyQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPLE9BQU8sQ0FBQztTQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxXQUFXLENBQUMsS0FBVSxFQUFFLEtBQThCO1FBQzNELElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtZQUFFLE9BQU8sU0FBUyxDQUFDO1NBQUU7UUFDeEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUFFO1FBQ3ZELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksWUFBWSxDQUFDLE1BQXNCO1FBQ3hDLFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyw4QkFBYyxDQUFDLFdBQVc7Z0JBQzdCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUN2RCxLQUFLLDhCQUFjLENBQUMsWUFBWTtnQkFDOUIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsS0FBSyw4QkFBYyxDQUFDLFlBQVk7Z0JBQzlCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELEtBQUssOEJBQWMsQ0FBQyxXQUFXO2dCQUM3QixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzlDLEtBQUssOEJBQWMsQ0FBQyxXQUFXLENBQUM7WUFDaEMsS0FBSyw4QkFBYyxDQUFDLFdBQVcsQ0FBQztZQUNoQyxLQUFLLDhCQUFjLENBQUMsU0FBUztnQkFDM0IsT0FBTyxFQUFFLENBQUMsQ0FBQywrQkFBK0I7U0FDN0M7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxjQUFjLENBQUMsSUFBWSxFQUFFLElBQXFCLEVBQUUsSUFBYTtRQUN0RSxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFBLG9DQUFvQixFQUFDLElBQUksQ0FBQyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyw4QkFBYyxDQUFDLFdBQVcsRUFBRTtnQkFDcEQsY0FBYyxHQUFHLDBCQUEwQixDQUFDO2FBQzdDO2lCQUFNLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyw4QkFBYyxDQUFDLFlBQVksRUFBRTtnQkFDNUQsY0FBYyxHQUFHLHlCQUF5QixDQUFDO2FBQzVDO1NBQ0Y7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2pILE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZ0JBQWdCLENBQUMsU0FBYyxFQUFFLFNBQWMsRUFBRSxVQUFrQjtRQUN4RSxJQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssT0FBTyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDekksSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7Z0JBQ3RELElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtvQkFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUcsQ0FBQyxFQUFFLEVBQUU7d0JBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdEU7aUJBQ0Y7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDekYsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDN0Y7YUFDRjtpQkFBTSxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsZ0NBQWdDLEVBQUU7Z0JBQ25FLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM5RTtpQkFBTSw2REFBNkQsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsT0FBTztTQUNSO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFBLGdCQUFTLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDdEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLFVBQVUsR0FBRyxHQUFHLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMvQyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtnQkFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsVUFBVSxNQUFNLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQzthQUM3RjtpQkFBTSxJQUFJLFFBQVEsS0FBSyxTQUFTLENBQUMsK0JBQStCLEVBQUU7Z0JBQ2pFLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMvRjtpQkFBTSwwREFBMEQsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzlGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksU0FBUyxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7UUFDbkUsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDcEQsT0FBTyxNQUFNLENBQUM7U0FDZjthQUFNLElBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQyw4QkFBOEIsRUFBRTtZQUNoRSxPQUFPLE9BQU8sQ0FBQztTQUNoQjthQUFNLDJEQUEyRCxDQUFDO1lBQ2pFLE9BQU8sUUFBUSxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksc0JBQXNCLENBQUMsWUFBMEI7UUFDdEQsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzlFLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBRWhDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNySSxJQUFJLGVBQWUsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsZUFBZSxDQUFDO2FBQ3BEO1lBRUQsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3JJLElBQUksZUFBZSxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxlQUFlLENBQUM7YUFDcEQ7U0FDRjtJQUNILENBQUM7SUFFTSxlQUFlLENBQUMsU0FBaUI7UUFDdEMsMENBQTBDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUzRCxJQUFJLFVBQVUsRUFBRTtZQUNkLE9BQU8sR0FBRyxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1NBQ2pEO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVNLHVCQUF1QixDQUFDLFNBQWlCO1FBQzlDLDBDQUEwQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlDOzs7O1dBSUc7UUFDSCxTQUFTLGFBQWEsQ0FBQyxDQUFTO1lBQzlCLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDckIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEI7WUFFRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BCLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2QixzR0FBc0c7Z0JBQ3RHLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3BCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTt3QkFDN0MsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQzFDO2lCQUNGO2dCQUVELENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3JCO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVNLGdCQUFnQixDQUFDLE9BQW1CO1FBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRXBDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7WUFDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLDBCQUFXLEVBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ2xIO1FBRUQsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRTtZQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUEsMEJBQVcsRUFBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDdkg7SUFDSCxDQUFDO0lBRU0sMEJBQTBCLENBQUMsT0FBNkI7UUFDN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLDBCQUFXLEVBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRU0sOEJBQThCLENBQUMsSUFBZ0I7UUFDcEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSwwQkFBMEIsQ0FBQyxNQUFjO1FBQzlDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0UsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBdUJEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxPQUFlO0lBQ25FLE1BQU0sS0FBSyxHQUFVLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUNuQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7UUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxRyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM3Qix3Q0FBd0M7WUFDeEMsSUFBSSxJQUFJLEtBQUssOEJBQThCLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBQzFELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDeEMsUUFBUSxNQUFNLEVBQUU7Z0JBQ2QsS0FBSyxHQUFHO29CQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDbEMsTUFBTTtnQkFDUixLQUFLLEdBQUc7b0JBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzVELE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN6RCxNQUFNO2dCQUNSO29CQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE1BQU0sZ0JBQWdCLElBQUksR0FBRyxDQUFDLENBQUM7YUFDN0U7U0FDRjtLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUM7SUFFZCxTQUFTLFdBQVcsQ0FBQyxLQUFlO1FBQ2xDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRyxDQUFDLEVBQUUsRUFBRTtnQkFDdEMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtvQkFDMUIsTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7b0JBQ3pDLE1BQU07aUJBQ1A7YUFDRjtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IERpZmZlcmVuY2VDb2xsZWN0aW9uLCBUZW1wbGF0ZURpZmYgfSBmcm9tICcuL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9kaWZmL3V0aWwnO1xuaW1wb3J0IHsgRGlmZmVyZW5jZSwgaXNQcm9wZXJ0eURpZmZlcmVuY2UsIFJlc291cmNlRGlmZmVyZW5jZSwgUmVzb3VyY2VJbXBhY3QgfSBmcm9tICcuL2RpZmYtdGVtcGxhdGUnO1xuaW1wb3J0IHsgZm9ybWF0VGFibGUgfSBmcm9tICcuL2Zvcm1hdC10YWJsZSc7XG5pbXBvcnQgeyBJYW1DaGFuZ2VzIH0gZnJvbSAnLi9pYW0vaWFtLWNoYW5nZXMnO1xuaW1wb3J0IHsgU2VjdXJpdHlHcm91cENoYW5nZXMgfSBmcm9tICcuL25ldHdvcmsvc2VjdXJpdHktZ3JvdXAtY2hhbmdlcyc7XG5cbi8vIGZyb20gY3gtYXBpXG5jb25zdCBQQVRIX01FVEFEQVRBX0tFWSA9ICdhd3M6Y2RrOnBhdGgnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5jb25zdCB7IHN0cnVjdHVyZWRQYXRjaCB9ID0gcmVxdWlyZSgnZGlmZicpO1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdFN0cmVhbSBleHRlbmRzIE5vZGVKUy5Xcml0YWJsZVN0cmVhbSB7XG4gIGNvbHVtbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVuZGVycyB0ZW1wbGF0ZSBkaWZmZXJlbmNlcyB0byB0aGUgcHJvY2VzcycgY29uc29sZS5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtICAgICAgICAgICBUaGUgSU8gc3RyZWFtIHdoZXJlIHRvIG91dHB1dCB0aGUgcmVuZGVyZWQgZGlmZi5cbiAqIEBwYXJhbSB0ZW1wbGF0ZURpZmYgICAgIFRlbXBsYXRlRGlmZiB0byBiZSByZW5kZXJlZCB0byB0aGUgY29uc29sZS5cbiAqIEBwYXJhbSBsb2dpY2FsVG9QYXRoTWFwIEEgbWFwIGZyb20gbG9naWNhbCBJRCB0byBjb25zdHJ1Y3QgcGF0aC4gVXNlZnVsIGluXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoZXJlIGlzIG5vIGF3czpjZGs6cGF0aCBtZXRhZGF0YSBpbiB0aGUgdGVtcGxhdGUuXG4gKiBAcGFyYW0gY29udGV4dCAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gdXNlIGluIGFyYml0cmFyeSBKU09OIGRpZmYgKGRlZmF1bHRzIHRvIDMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGlmZmVyZW5jZXMoXG4gIHN0cmVhbTogRm9ybWF0U3RyZWFtLFxuICB0ZW1wbGF0ZURpZmY6IFRlbXBsYXRlRGlmZixcbiAgbG9naWNhbFRvUGF0aE1hcDogeyBbbG9naWNhbElkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHsgfSxcbiAgY29udGV4dDogbnVtYmVyID0gMykge1xuICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKHN0cmVhbSwgbG9naWNhbFRvUGF0aE1hcCwgdGVtcGxhdGVEaWZmLCBjb250ZXh0KTtcblxuICBpZiAodGVtcGxhdGVEaWZmLmF3c1RlbXBsYXRlRm9ybWF0VmVyc2lvbiB8fCB0ZW1wbGF0ZURpZmYudHJhbnNmb3JtIHx8IHRlbXBsYXRlRGlmZi5kZXNjcmlwdGlvbikge1xuICAgIGZvcm1hdHRlci5wcmludFNlY3Rpb25IZWFkZXIoJ1RlbXBsYXRlJyk7XG4gICAgZm9ybWF0dGVyLmZvcm1hdERpZmZlcmVuY2UoJ0FXU1RlbXBsYXRlRm9ybWF0VmVyc2lvbicsICdBV1NUZW1wbGF0ZUZvcm1hdFZlcnNpb24nLCB0ZW1wbGF0ZURpZmYuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uKTtcbiAgICBmb3JtYXR0ZXIuZm9ybWF0RGlmZmVyZW5jZSgnVHJhbnNmb3JtJywgJ1RyYW5zZm9ybScsIHRlbXBsYXRlRGlmZi50cmFuc2Zvcm0pO1xuICAgIGZvcm1hdHRlci5mb3JtYXREaWZmZXJlbmNlKCdEZXNjcmlwdGlvbicsICdEZXNjcmlwdGlvbicsIHRlbXBsYXRlRGlmZi5kZXNjcmlwdGlvbik7XG4gICAgZm9ybWF0dGVyLnByaW50U2VjdGlvbkZvb3RlcigpO1xuICB9XG5cbiAgZm9ybWF0U2VjdXJpdHlDaGFuZ2VzV2l0aEJhbm5lcihmb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZik7XG5cbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ1BhcmFtZXRlcnMnLCAnUGFyYW1ldGVyJywgdGVtcGxhdGVEaWZmLnBhcmFtZXRlcnMpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignTWV0YWRhdGEnLCAnTWV0YWRhdGEnLCB0ZW1wbGF0ZURpZmYubWV0YWRhdGEpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignTWFwcGluZ3MnLCAnTWFwcGluZycsIHRlbXBsYXRlRGlmZi5tYXBwaW5ncyk7XG4gIGZvcm1hdHRlci5mb3JtYXRTZWN0aW9uKCdDb25kaXRpb25zJywgJ0NvbmRpdGlvbicsIHRlbXBsYXRlRGlmZi5jb25kaXRpb25zKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ1Jlc291cmNlcycsICdSZXNvdXJjZScsIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMsIGZvcm1hdHRlci5mb3JtYXRSZXNvdXJjZURpZmZlcmVuY2UuYmluZChmb3JtYXR0ZXIpKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ091dHB1dHMnLCAnT3V0cHV0JywgdGVtcGxhdGVEaWZmLm91dHB1dHMpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignT3RoZXIgQ2hhbmdlcycsICdVbmtub3duJywgdGVtcGxhdGVEaWZmLnVua25vd24pO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBkaWZmIG9mIHNlY3VyaXR5IGNoYW5nZXMgdG8gdGhlIGdpdmVuIHN0cmVhbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2VjdXJpdHlDaGFuZ2VzKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0YWJsZVN0cmVhbSxcbiAgdGVtcGxhdGVEaWZmOiBUZW1wbGF0ZURpZmYsXG4gIGxvZ2ljYWxUb1BhdGhNYXA6IHtbbG9naWNhbElkOiBzdHJpbmddOiBzdHJpbmd9ID0ge30sXG4gIGNvbnRleHQ/OiBudW1iZXIpIHtcbiAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcihzdHJlYW0sIGxvZ2ljYWxUb1BhdGhNYXAsIHRlbXBsYXRlRGlmZiwgY29udGV4dCk7XG5cbiAgZm9ybWF0U2VjdXJpdHlDaGFuZ2VzV2l0aEJhbm5lcihmb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlY3VyaXR5Q2hhbmdlc1dpdGhCYW5uZXIoZm9ybWF0dGVyOiBGb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZjogVGVtcGxhdGVEaWZmKSB7XG4gIGlmICghdGVtcGxhdGVEaWZmLmlhbUNoYW5nZXMuaGFzQ2hhbmdlcyAmJiAhdGVtcGxhdGVEaWZmLnNlY3VyaXR5R3JvdXBDaGFuZ2VzLmhhc0NoYW5nZXMpIHsgcmV0dXJuOyB9XG4gIGZvcm1hdHRlci5mb3JtYXRJYW1DaGFuZ2VzKHRlbXBsYXRlRGlmZi5pYW1DaGFuZ2VzKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3VyaXR5R3JvdXBDaGFuZ2VzKHRlbXBsYXRlRGlmZi5zZWN1cml0eUdyb3VwQ2hhbmdlcyk7XG5cbiAgZm9ybWF0dGVyLndhcm5pbmcoJyhOT1RFOiBUaGVyZSBtYXkgYmUgc2VjdXJpdHktcmVsYXRlZCBjaGFuZ2VzIG5vdCBpbiB0aGlzIGxpc3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzEyOTkpJyk7XG4gIGZvcm1hdHRlci5wcmludFNlY3Rpb25Gb290ZXIoKTtcbn1cblxuY29uc3QgQURESVRJT04gPSBjaGFsay5ncmVlbignWytdJyk7XG5jb25zdCBDT05URVhUID0gY2hhbGsuZ3JleSgnWyBdJyk7XG5jb25zdCBVUERBVEUgPSBjaGFsay55ZWxsb3coJ1t+XScpO1xuY29uc3QgUkVNT1ZBTCA9IGNoYWxrLnJlZCgnWy1dJyk7XG5cbmNsYXNzIEZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyZWFtOiBGb3JtYXRTdHJlYW0sXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dpY2FsVG9QYXRoTWFwOiB7IFtsb2dpY2FsSWQ6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIGRpZmY/OiBUZW1wbGF0ZURpZmYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBudW1iZXIgPSAzKSB7XG4gICAgLy8gUmVhZCBhZGRpdGlvbmFsIGNvbnN0cnVjdCBwYXRocyBmcm9tIHRoZSBkaWZmIGlmIGl0IGlzIHN1cHBsaWVkXG4gICAgaWYgKGRpZmYpIHtcbiAgICAgIHRoaXMucmVhZENvbnN0cnVjdFBhdGhzRnJvbShkaWZmKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJpbnQoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5zdHJlYW0ud3JpdGUoY2hhbGsud2hpdGUoZm9ybWF0KGZtdCwgLi4uYXJncykpICsgJ1xcbicpO1xuICB9XG5cbiAgcHVibGljIHdhcm5pbmcoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5zdHJlYW0ud3JpdGUoY2hhbGsueWVsbG93KGZvcm1hdChmbXQsIC4uLmFyZ3MpKSArICdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXRTZWN0aW9uPFYsIFQgZXh0ZW5kcyBEaWZmZXJlbmNlPFY+PihcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGVudHJ5VHlwZTogc3RyaW5nLFxuICAgIGNvbGxlY3Rpb246IERpZmZlcmVuY2VDb2xsZWN0aW9uPFYsIFQ+LFxuICAgIGZvcm1hdHRlcjogKHR5cGU6IHN0cmluZywgaWQ6IHN0cmluZywgZGlmZjogVCkgPT4gdm9pZCA9IHRoaXMuZm9ybWF0RGlmZmVyZW5jZS5iaW5kKHRoaXMpKSB7XG5cbiAgICBpZiAoY29sbGVjdGlvbi5kaWZmZXJlbmNlQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByaW50U2VjdGlvbkhlYWRlcih0aXRsZSk7XG4gICAgY29sbGVjdGlvbi5mb3JFYWNoRGlmZmVyZW5jZSgoaWQsIGRpZmYpID0+IGZvcm1hdHRlcihlbnRyeVR5cGUsIGlkLCBkaWZmKSk7XG4gICAgdGhpcy5wcmludFNlY3Rpb25Gb290ZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmludFNlY3Rpb25IZWFkZXIodGl0bGU6IHN0cmluZykge1xuICAgIHRoaXMucHJpbnQoY2hhbGsudW5kZXJsaW5lKGNoYWxrLmJvbGQodGl0bGUpKSk7XG4gIH1cblxuICBwdWJsaWMgcHJpbnRTZWN0aW9uRm9vdGVyKCkge1xuICAgIHRoaXMucHJpbnQoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IGEgc2ltcGxlIGRpZmZlcmVuY2UgZm9yIGEgZ2l2ZW4gbmFtZWQgZW50aXR5LlxuICAgKlxuICAgKiBAcGFyYW0gbG9naWNhbElkIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBkaWZmZXJlbnQuXG4gICAqIEBwYXJhbSBkaWZmIHRoZSBkaWZmZXJlbmNlIHRvIGJlIHJlbmRlcmVkLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdERpZmZlcmVuY2UodHlwZTogc3RyaW5nLCBsb2dpY2FsSWQ6IHN0cmluZywgZGlmZjogRGlmZmVyZW5jZTxhbnk+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFkaWZmIHx8ICFkaWZmLmlzRGlmZmVyZW50KSB7IHJldHVybjsgfVxuXG4gICAgbGV0IHZhbHVlO1xuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKGRpZmYub2xkVmFsdWUsIGNoYWxrLnJlZCk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKGRpZmYubmV3VmFsdWUsIGNoYWxrLmdyZWVuKTtcbiAgICBpZiAoZGlmZi5pc0FkZGl0aW9uKSB7XG4gICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH0gZWxzZSBpZiAoZGlmZi5pc1VwZGF0ZSkge1xuICAgICAgdmFsdWUgPSBgJHtvbGRWYWx1ZX0gdG8gJHtuZXdWYWx1ZX1gO1xuICAgIH0gZWxzZSBpZiAoZGlmZi5pc1JlbW92YWwpIHtcbiAgICAgIHZhbHVlID0gb2xkVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5wcmludChgJHt0aGlzLmZvcm1hdFByZWZpeChkaWZmKX0gJHtjaGFsay5jeWFuKHR5cGUpfSAke3RoaXMuZm9ybWF0TG9naWNhbElkKGxvZ2ljYWxJZCl9OiAke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IGEgcmVzb3VyY2UgZGlmZmVyZW5jZSBmb3IgYSBnaXZlbiBsb2dpY2FsIElELlxuICAgKlxuICAgKiBAcGFyYW0gbG9naWNhbElkIHRoZSBsb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZSB0aGF0IGNoYW5nZWQuXG4gICAqIEBwYXJhbSBkaWZmICAgICAgdGhlIGNoYW5nZSB0byBiZSByZW5kZXJlZC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRSZXNvdXJjZURpZmZlcmVuY2UoX3R5cGU6IHN0cmluZywgbG9naWNhbElkOiBzdHJpbmcsIGRpZmY6IFJlc291cmNlRGlmZmVyZW5jZSkge1xuICAgIGlmICghZGlmZi5pc0RpZmZlcmVudCkgeyByZXR1cm47IH1cblxuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGRpZmYuaXNSZW1vdmFsID8gZGlmZi5vbGRSZXNvdXJjZVR5cGUgOiBkaWZmLm5ld1Jlc291cmNlVHlwZTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgdGhpcy5wcmludChgJHt0aGlzLmZvcm1hdFByZWZpeChkaWZmKX0gJHt0aGlzLmZvcm1hdFZhbHVlKHJlc291cmNlVHlwZSwgY2hhbGsuY3lhbil9ICR7dGhpcy5mb3JtYXRMb2dpY2FsSWQobG9naWNhbElkKX0gJHt0aGlzLmZvcm1hdEltcGFjdChkaWZmLmNoYW5nZUltcGFjdCl9YCk7XG5cbiAgICBpZiAoZGlmZi5pc1VwZGF0ZSkge1xuICAgICAgY29uc3QgZGlmZmVyZW5jZUNvdW50ID0gZGlmZi5kaWZmZXJlbmNlQ291bnQ7XG4gICAgICBsZXQgcHJvY2Vzc2VkQ291bnQgPSAwO1xuICAgICAgZGlmZi5mb3JFYWNoRGlmZmVyZW5jZSgoXywgbmFtZSwgdmFsdWVzKSA9PiB7XG4gICAgICAgIHByb2Nlc3NlZENvdW50ICs9IDE7XG4gICAgICAgIHRoaXMuZm9ybWF0VHJlZURpZmYobmFtZSwgdmFsdWVzLCBwcm9jZXNzZWRDb3VudCA9PT0gZGlmZmVyZW5jZUNvdW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXRQcmVmaXg8VD4oZGlmZjogRGlmZmVyZW5jZTxUPikge1xuICAgIGlmIChkaWZmLmlzQWRkaXRpb24pIHsgcmV0dXJuIEFERElUSU9OOyB9XG4gICAgaWYgKGRpZmYuaXNVcGRhdGUpIHsgcmV0dXJuIFVQREFURTsgfVxuICAgIGlmIChkaWZmLmlzUmVtb3ZhbCkgeyByZXR1cm4gUkVNT1ZBTDsgfVxuICAgIHJldHVybiBjaGFsay53aGl0ZSgnWz9dJyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBmb3JtYXR0ZWQuXG4gICAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgdG8gYmUgdXNlZC5cbiAgICpcbiAgICogQHJldHVybnMgdGhlIGZvcm1hdHRlZCBzdHJpbmcsIHdpdGggY29sb3IgYXBwbGllZC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRWYWx1ZSh2YWx1ZTogYW55LCBjb2xvcjogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGNvbG9yKHZhbHVlKTsgfVxuICAgIHJldHVybiBjb2xvcihKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbXBhY3QgdGhlIGltcGFjdCB0byBiZSBmb3JtYXR0ZWRcbiAgICogQHJldHVybnMgYSB1c2VyLWZyaWVuZGx5LCBjb2xvcmVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGltcGFjdC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRJbXBhY3QoaW1wYWN0OiBSZXNvdXJjZUltcGFjdCkge1xuICAgIHN3aXRjaCAoaW1wYWN0KSB7XG4gICAgICBjYXNlIFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFOlxuICAgICAgICByZXR1cm4gY2hhbGsuaXRhbGljKGNoYWxrLnllbGxvdygnbWF5IGJlIHJlcGxhY2VkJykpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0U6XG4gICAgICAgIHJldHVybiBjaGFsay5pdGFsaWMoY2hhbGsuYm9sZChjaGFsay5yZWQoJ3JlcGxhY2UnKSkpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX0RFU1RST1k6XG4gICAgICAgIHJldHVybiBjaGFsay5pdGFsaWMoY2hhbGsuYm9sZChjaGFsay5yZWQoJ2Rlc3Ryb3knKSkpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX09SUEhBTjpcbiAgICAgICAgcmV0dXJuIGNoYWxrLml0YWxpYyhjaGFsay55ZWxsb3coJ29ycGhhbicpKTtcbiAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9VUERBVEU6XG4gICAgICBjYXNlIFJlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFOlxuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5OT19DSEFOR0U6XG4gICAgICAgIHJldHVybiAnJzsgLy8gbm8gZXh0cmEgaW5mbyBpcyBnYWluZWQgaGVyZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgdHJlZSBvZiBkaWZmZXJlbmNlcyB1bmRlciBhIHBhcnRpY3VsYXIgbmFtZS5cbiAgICogQHBhcmFtIG5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuXG4gICAqIEBwYXJhbSBkaWZmICAgIHRoZSBkaWZmZXJlbmNlIG9uIHRoZSB0cmVlLlxuICAgKiBAcGFyYW0gbGFzdCAgICB3aGV0aGVyIHRoaXMgaXMgdGhlIGxhc3Qgbm9kZSBvZiBhIHBhcmVudCB0cmVlLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdFRyZWVEaWZmKG5hbWU6IHN0cmluZywgZGlmZjogRGlmZmVyZW5jZTxhbnk+LCBsYXN0OiBib29sZWFuKSB7XG4gICAgbGV0IGFkZGl0aW9uYWxJbmZvID0gJyc7XG4gICAgaWYgKGlzUHJvcGVydHlEaWZmZXJlbmNlKGRpZmYpKSB7XG4gICAgICBpZiAoZGlmZi5jaGFuZ2VJbXBhY3QgPT09IFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFKSB7XG4gICAgICAgIGFkZGl0aW9uYWxJbmZvID0gJyAobWF5IGNhdXNlIHJlcGxhY2VtZW50KSc7XG4gICAgICB9IGVsc2UgaWYgKGRpZmYuY2hhbmdlSW1wYWN0ID09PSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0UpIHtcbiAgICAgICAgYWRkaXRpb25hbEluZm8gPSAnIChyZXF1aXJlcyByZXBsYWNlbWVudCknO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnByaW50KCcgJXPilIAgJXMgJXMlcycsIGxhc3QgPyAn4pSUJyA6ICfilJwnLCB0aGlzLmNoYW5nZVRhZyhkaWZmLm9sZFZhbHVlLCBkaWZmLm5ld1ZhbHVlKSwgbmFtZSwgYWRkaXRpb25hbEluZm8pO1xuICAgIHJldHVybiB0aGlzLmZvcm1hdE9iamVjdERpZmYoZGlmZi5vbGRWYWx1ZSwgZGlmZi5uZXdWYWx1ZSwgYCAke2xhc3QgPyAnICcgOiAn4pSCJ31gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG9iamVjdHMsIGxvb2tpbmcgZm9yIHRoZSBkaWZmZXJlbmNlcyBhcyBkZWVwIGFzIHBvc3NpYmxlLFxuICAgKiBhbmQgcmVuZGVyaW5nIGEgdHJlZSBncmFwaCBvZiB0aGUgcGF0aCB1bnRpbCB0aGUgZGlmZmVyZW5jZSBpcyBmb3VuZC5cbiAgICpcbiAgICogQHBhcmFtIG9sZE9iamVjdCAgdGhlIG9sZCBvYmplY3QuXG4gICAqIEBwYXJhbSBuZXdPYmplY3QgIHRoZSBuZXcgb2JqZWN0LlxuICAgKiBAcGFyYW0gbGluZVByZWZpeCBhIHByZWZpeCAoaW5kZW50LWxpa2UpIHRvIGJlIHVzZWQgb24gZXZlcnkgbGluZS5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRPYmplY3REaWZmKG9sZE9iamVjdDogYW55LCBuZXdPYmplY3Q6IGFueSwgbGluZVByZWZpeDogc3RyaW5nKSB7XG4gICAgaWYgKCh0eXBlb2Ygb2xkT2JqZWN0ICE9PSB0eXBlb2YgbmV3T2JqZWN0KSB8fCBBcnJheS5pc0FycmF5KG9sZE9iamVjdCkgfHwgdHlwZW9mIG9sZE9iamVjdCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9sZE9iamVjdCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChvbGRPYmplY3QgIT09IHVuZGVmaW5lZCAmJiBuZXdPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9sZE9iamVjdCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ld09iamVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBjb25zdCBvbGRTdHIgPSBKU09OLnN0cmluZ2lmeShvbGRPYmplY3QsIG51bGwsIDIpO1xuICAgICAgICAgIGNvbnN0IG5ld1N0ciA9IEpTT04uc3RyaW5naWZ5KG5ld09iamVjdCwgbnVsbCwgMik7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IF9kaWZmU3RyaW5ncyhvbGRTdHIsIG5ld1N0ciwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMCA7IGkgPCBkaWZmLmxlbmd0aCA7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5wcmludCgnJXMgICAlcyAlcycsIGxpbmVQcmVmaXgsIGkgPT09IDAgPyAn4pSU4pSAJyA6ICcgICcsIGRpZmZbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUnOKUgCAlcyAlcycsIGxpbmVQcmVmaXgsIFJFTU9WQUwsIHRoaXMuZm9ybWF0VmFsdWUob2xkT2JqZWN0LCBjaGFsay5yZWQpKTtcbiAgICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUlOKUgCAlcyAlcycsIGxpbmVQcmVmaXgsIEFERElUSU9OLCB0aGlzLmZvcm1hdFZhbHVlKG5ld09iamVjdCwgY2hhbGsuZ3JlZW4pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvbGRPYmplY3QgIT09IHVuZGVmaW5lZCAvKiAmJiBuZXdPYmplY3QgPT09IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUlOKUgCAlcycsIGxpbmVQcmVmaXgsIHRoaXMuZm9ybWF0VmFsdWUob2xkT2JqZWN0LCBjaGFsay5yZWQpKTtcbiAgICAgIH0gZWxzZSAvKiBpZiAob2xkT2JqZWN0ID09PSB1bmRlZmluZWQgJiYgbmV3T2JqZWN0ICE9PSB1bmRlZmluZWQpICovIHtcbiAgICAgICAgdGhpcy5wcmludCgnJXMgICDilJTilIAgJXMnLCBsaW5lUHJlZml4LCB0aGlzLmZvcm1hdFZhbHVlKG5ld09iamVjdCwgY2hhbGsuZ3JlZW4pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5U2V0ID0gbmV3IFNldChPYmplY3Qua2V5cyhvbGRPYmplY3QpKTtcbiAgICBPYmplY3Qua2V5cyhuZXdPYmplY3QpLmZvckVhY2goayA9PiBrZXlTZXQuYWRkKGspKTtcbiAgICBjb25zdCBrZXlzID0gbmV3IEFycmF5KC4uLmtleVNldCkuZmlsdGVyKGsgPT4gIWRlZXBFcXVhbChvbGRPYmplY3Rba10sIG5ld09iamVjdFtrXSkpLnNvcnQoKTtcbiAgICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkT2JqZWN0W2tleV07XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld09iamVjdFtrZXldO1xuICAgICAgY29uc3QgdHJlZVByZWZpeCA9IGtleSA9PT0gbGFzdEtleSA/ICfilJQnIDogJ+KUnCc7XG4gICAgICBpZiAob2xkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBuZXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucHJpbnQoJyVzICAgJXPilIAgJXMgJXM6JywgbGluZVByZWZpeCwgdHJlZVByZWZpeCwgdGhpcy5jaGFuZ2VUYWcob2xkVmFsdWUsIG5ld1ZhbHVlKSwgY2hhbGsuYmx1ZShgLiR7a2V5fWApKTtcbiAgICAgICAgdGhpcy5mb3JtYXRPYmplY3REaWZmKG9sZFZhbHVlLCBuZXdWYWx1ZSwgYCR7bGluZVByZWZpeH0gICAke2tleSA9PT0gbGFzdEtleSA/ICcgJyA6ICfilIInfWApO1xuICAgICAgfSBlbHNlIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkIC8qICYmIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKi8pIHtcbiAgICAgICAgdGhpcy5wcmludCgnJXMgICAlc+KUgCAlcyBSZW1vdmVkOiAlcycsIGxpbmVQcmVmaXgsIHRyZWVQcmVmaXgsIFJFTU9WQUwsIGNoYWxrLmJsdWUoYC4ke2tleX1gKSk7XG4gICAgICB9IGVsc2UgLyogaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCAqLyB7XG4gICAgICAgIHRoaXMucHJpbnQoJyVzICAgJXPilIAgJXMgQWRkZWQ6ICVzJywgbGluZVByZWZpeCwgdHJlZVByZWZpeCwgQURESVRJT04sIGNoYWxrLmJsdWUoYC4ke2tleX1gKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlIG9mIGEgZGlmZmVyZW5jZS5cbiAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgYSBkaWZmZXJlbmNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIHRhZyB0byBiZSByZW5kZXJlZCBpbiB0aGUgZGlmZiwgcmVmbGVjdGluZyB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlXG4gICAqICAgICAgd2FzIGFuIEFERElUSU9OLCBVUERBVEUgb3IgUkVNT1ZBTC5cbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VUYWcob2xkVmFsdWU6IGFueSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IGFueSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFVQREFURTtcbiAgICB9IGVsc2UgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQgLyogJiYgbmV3VmFsdWUgPT09IHVuZGVmaW5lZCovKSB7XG4gICAgICByZXR1cm4gUkVNT1ZBTDtcbiAgICB9IGVsc2UgLyogaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCkgKi8ge1xuICAgICAgcmV0dXJuIEFERElUSU9OO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kICdhd3M6Y2RrOnBhdGgnIG1ldGFkYXRhIGluIHRoZSBkaWZmIGFuZCBhZGQgaXQgdG8gdGhlIGxvZ2ljYWxUb1BhdGhNYXBcbiAgICpcbiAgICogVGhlcmUgYXJlIG11bHRpcGxlIHNvdXJjZXMgb2YgbG9naWNhbElEIC0+IHBhdGggbWFwcGluZ3M6IHN5bnRoIG1ldGFkYXRhXG4gICAqIGFuZCByZXNvdXJjZSBtZXRhZGF0YSwgYW5kIHdlIGNvbWJpbmUgYWxsIHNvdXJjZXMgaW50byBhIHNpbmdsZSBtYXAuXG4gICAqL1xuICBwdWJsaWMgcmVhZENvbnN0cnVjdFBhdGhzRnJvbSh0ZW1wbGF0ZURpZmY6IFRlbXBsYXRlRGlmZikge1xuICAgIGZvciAoY29uc3QgW2xvZ2ljYWxJZCwgcmVzb3VyY2VEaWZmXSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURpZmYucmVzb3VyY2VzKSkge1xuICAgICAgaWYgKCFyZXNvdXJjZURpZmYpIHsgY29udGludWU7IH1cblxuICAgICAgY29uc3Qgb2xkUGF0aE1ldGFkYXRhID0gcmVzb3VyY2VEaWZmLm9sZFZhbHVlICYmIHJlc291cmNlRGlmZi5vbGRWYWx1ZS5NZXRhZGF0YSAmJiByZXNvdXJjZURpZmYub2xkVmFsdWUuTWV0YWRhdGFbUEFUSF9NRVRBREFUQV9LRVldO1xuICAgICAgaWYgKG9sZFBhdGhNZXRhZGF0YSAmJiAhKGxvZ2ljYWxJZCBpbiB0aGlzLmxvZ2ljYWxUb1BhdGhNYXApKSB7XG4gICAgICAgIHRoaXMubG9naWNhbFRvUGF0aE1hcFtsb2dpY2FsSWRdID0gb2xkUGF0aE1ldGFkYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdQYXRoTWV0YWRhdGEgPSByZXNvdXJjZURpZmYubmV3VmFsdWUgJiYgcmVzb3VyY2VEaWZmLm5ld1ZhbHVlLk1ldGFkYXRhICYmIHJlc291cmNlRGlmZi5uZXdWYWx1ZS5NZXRhZGF0YVtQQVRIX01FVEFEQVRBX0tFWV07XG4gICAgICBpZiAobmV3UGF0aE1ldGFkYXRhICYmICEobG9naWNhbElkIGluIHRoaXMubG9naWNhbFRvUGF0aE1hcCkpIHtcbiAgICAgICAgdGhpcy5sb2dpY2FsVG9QYXRoTWFwW2xvZ2ljYWxJZF0gPSBuZXdQYXRoTWV0YWRhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvcm1hdExvZ2ljYWxJZChsb2dpY2FsSWQ6IHN0cmluZykge1xuICAgIC8vIGlmIHdlIGhhdmUgYSBwYXRoIGluIHRoZSBtYXAsIHJldHVybiBpdFxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZWRMb2dpY2FsSWRQYXRoKGxvZ2ljYWxJZCk7XG5cbiAgICBpZiAobm9ybWFsaXplZCkge1xuICAgICAgcmV0dXJuIGAke25vcm1hbGl6ZWR9ICR7Y2hhbGsuZ3JheShsb2dpY2FsSWQpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvZ2ljYWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBub3JtYWxpemVkTG9naWNhbElkUGF0aChsb2dpY2FsSWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gaWYgd2UgaGF2ZSBhIHBhdGggaW4gdGhlIG1hcCwgcmV0dXJuIGl0XG4gICAgY29uc3QgcGF0aCA9IHRoaXMubG9naWNhbFRvUGF0aE1hcFtsb2dpY2FsSWRdO1xuICAgIHJldHVybiBwYXRoID8gbm9ybWFsaXplUGF0aChwYXRoKSA6IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFBhdGggaXMgc3VwcG9zZWQgdG8gc3RhcnQgd2l0aCBcIi9zdGFjay1uYW1lXCIuIElmIHRoaXMgaXMgdGhlIGNhc2UgKGkuZS4gcGF0aCBoYXMgbW9yZSB0aGFuXG4gICAgICogdHdvIGNvbXBvbmVudHMsIHdlIHJlbW92ZSB0aGUgZmlyc3QgcGFydC4gT3RoZXJ3aXNlLCB3ZSBqdXN0IHVzZSB0aGUgZnVsbCBwYXRoLlxuICAgICAqIEBwYXJhbSBwXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwOiBzdHJpbmcpIHtcbiAgICAgIGlmIChwLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICBwID0gcC5zbGljZSgxKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHBhcnRzID0gcC5zcGxpdCgnLycpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcGFydHMgPSBwYXJ0cy5zbGljZSgxKTtcblxuICAgICAgICAvLyByZW1vdmUgdGhlIGxhc3QgY29tcG9uZW50IGlmIGl0J3MgXCJSZXNvdXJjZVwiIG9yIFwiRGVmYXVsdFwiIChpZiB3ZSBoYXZlIG1vcmUgdGhhbiBhIHNpbmdsZSBjb21wb25lbnQpXG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgY29uc3QgbGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChsYXN0ID09PSAnUmVzb3VyY2UnIHx8IGxhc3QgPT09ICdEZWZhdWx0Jykge1xuICAgICAgICAgICAgcGFydHMgPSBwYXJ0cy5zbGljZSgwLCBwYXJ0cy5sZW5ndGggLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwID0gcGFydHMuam9pbignLycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvcm1hdElhbUNoYW5nZXMoY2hhbmdlczogSWFtQ2hhbmdlcykge1xuICAgIGlmICghY2hhbmdlcy5oYXNDaGFuZ2VzKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKGNoYW5nZXMuc3RhdGVtZW50cy5oYXNDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnByaW50U2VjdGlvbkhlYWRlcignSUFNIFN0YXRlbWVudCBDaGFuZ2VzJyk7XG4gICAgICB0aGlzLnByaW50KGZvcm1hdFRhYmxlKHRoaXMuZGVlcFN1YnN0aXR1dGVCcmFjZWRMb2dpY2FsSWRzKGNoYW5nZXMuc3VtbWFyaXplU3RhdGVtZW50cygpKSwgdGhpcy5zdHJlYW0uY29sdW1ucykpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm1hbmFnZWRQb2xpY2llcy5oYXNDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnByaW50U2VjdGlvbkhlYWRlcignSUFNIFBvbGljeSBDaGFuZ2VzJyk7XG4gICAgICB0aGlzLnByaW50KGZvcm1hdFRhYmxlKHRoaXMuZGVlcFN1YnN0aXR1dGVCcmFjZWRMb2dpY2FsSWRzKGNoYW5nZXMuc3VtbWFyaXplTWFuYWdlZFBvbGljaWVzKCkpLCB0aGlzLnN0cmVhbS5jb2x1bW5zKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvcm1hdFNlY3VyaXR5R3JvdXBDaGFuZ2VzKGNoYW5nZXM6IFNlY3VyaXR5R3JvdXBDaGFuZ2VzKSB7XG4gICAgaWYgKCFjaGFuZ2VzLmhhc0NoYW5nZXMpIHsgcmV0dXJuOyB9XG5cbiAgICB0aGlzLnByaW50U2VjdGlvbkhlYWRlcignU2VjdXJpdHkgR3JvdXAgQ2hhbmdlcycpO1xuICAgIHRoaXMucHJpbnQoZm9ybWF0VGFibGUodGhpcy5kZWVwU3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMoY2hhbmdlcy5zdW1tYXJpemUoKSksIHRoaXMuc3RyZWFtLmNvbHVtbnMpKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWVwU3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMocm93czogc3RyaW5nW11bXSk6IHN0cmluZ1tdW10ge1xuICAgIHJldHVybiByb3dzLm1hcChyb3cgPT4gcm93Lm1hcCh0aGlzLnN1YnN0aXR1dGVCcmFjZWRMb2dpY2FsSWRzLmJpbmQodGhpcykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzdGl0dXRlIGFsbCBzdHJpbmdzIGxpa2UgJHtMb2dJZC54eHh9IHdpdGggdGhlIHBhdGggaW5zdGVhZCBvZiB0aGUgbG9naWNhbCBJRFxuICAgKi9cbiAgcHVibGljIHN1YnN0aXR1dGVCcmFjZWRMb2dpY2FsSWRzKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc291cmNlLnJlcGxhY2UoL1xcJFxceyhbXi59XSspKC5bXn1dKyk/XFx9L2lnLCAoX21hdGNoLCBsb2dJZCwgc3VmZml4KSA9PiB7XG4gICAgICByZXR1cm4gJyR7JyArICh0aGlzLm5vcm1hbGl6ZWRMb2dpY2FsSWRQYXRoKGxvZ0lkKSB8fCBsb2dJZCkgKyAoc3VmZml4IHx8ICcnKSArICd9JztcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcGF0Y2ggYXMgcmV0dXJuZWQgYnkgYGBkaWZmLnN0cnVjdHVyZWRQYXRjaGBgLlxuICovXG5pbnRlcmZhY2UgUGF0Y2gge1xuICAvKipcbiAgICogSHVua3MgaW4gdGhlIHBhdGNoLlxuICAgKi9cbiAgaHVua3M6IFJlYWRvbmx5QXJyYXk8UGF0Y2hIdW5rPjtcbn1cblxuLyoqXG4gKiBBIGh1bmsgaW4gYSBwYXRjaCBwcm9kdWNlZCBieSBgYGRpZmYuc3RydWN0dXJlZFBhdGNoYGAuXG4gKi9cbmludGVyZmFjZSBQYXRjaEh1bmsge1xuICBvbGRTdGFydDogbnVtYmVyO1xuICBvbGRMaW5lczogbnVtYmVyO1xuICBuZXdTdGFydDogbnVtYmVyO1xuICBuZXdMaW5lczogbnVtYmVyO1xuICBsaW5lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuaWZpZWQgZGlmZiBvZiB0d28gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0gb2xkU3RyICB0aGUgXCJvbGRcIiB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0gbmV3U3RyICB0aGUgXCJuZXdcIiB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0gY29udGV4dCB0aGUgbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gdXNlIGluIGFyYml0cmFyeSBKU09OIGRpZmYuXG4gKlxuICogQHJldHVybnMgYW4gYXJyYXkgb2YgZGlmZiBsaW5lcy5cbiAqL1xuZnVuY3Rpb24gX2RpZmZTdHJpbmdzKG9sZFN0cjogc3RyaW5nLCBuZXdTdHI6IHN0cmluZywgY29udGV4dDogbnVtYmVyKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXRjaDogUGF0Y2ggPSBzdHJ1Y3R1cmVkUGF0Y2gobnVsbCwgbnVsbCwgb2xkU3RyLCBuZXdTdHIsIG51bGwsIG51bGwsIHsgY29udGV4dCB9KTtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBodW5rIG9mIHBhdGNoLmh1bmtzKSB7XG4gICAgcmVzdWx0LnB1c2goY2hhbGsubWFnZW50YShgQEAgLSR7aHVuay5vbGRTdGFydH0sJHtodW5rLm9sZExpbmVzfSArJHtodW5rLm5ld1N0YXJ0fSwke2h1bmsubmV3TGluZXN9IEBAYCkpO1xuICAgIGNvbnN0IGJhc2VJbmRlbnQgPSBfZmluZEluZGVudChodW5rLmxpbmVzKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgaHVuay5saW5lcykge1xuICAgICAgLy8gRG9uJ3QgY2FyZSBhYm91dCB0ZXJtaW5hdGlvbiBuZXdsaW5lLlxuICAgICAgaWYgKGxpbmUgPT09ICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKSB7IGNvbnRpbnVlOyB9XG4gICAgICBjb25zdCBtYXJrZXIgPSBsaW5lLmNoYXJBdCgwKTtcbiAgICAgIGNvbnN0IHRleHQgPSBsaW5lLnNsaWNlKDEgKyBiYXNlSW5kZW50KTtcbiAgICAgIHN3aXRjaCAobWFya2VyKSB7XG4gICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgIHJlc3VsdC5wdXNoKGAke0NPTlRFWFR9ICR7dGV4dH1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgcmVzdWx0LnB1c2goY2hhbGsuYm9sZChgJHtBRERJVElPTn0gJHtjaGFsay5ncmVlbih0ZXh0KX1gKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgIHJlc3VsdC5wdXNoKGNoYWxrLmJvbGQoYCR7UkVNT1ZBTH0gJHtjaGFsay5yZWQodGV4dCl9YCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBkaWZmIG1hcmtlcjogJHttYXJrZXJ9IChmdWxsIGxpbmU6ICR7bGluZX0pYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG5cbiAgZnVuY3Rpb24gX2ZpbmRJbmRlbnQobGluZXM6IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgICBsZXQgaW5kZW50ID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMSA7IGkgPCBsaW5lLmxlbmd0aCA7IGkrKykge1xuICAgICAgICBpZiAobGluZS5jaGFyQXQoaSkgIT09ICcgJykge1xuICAgICAgICAgIGluZGVudCA9IGluZGVudCA+IGkgLSAxID8gaSAtIDEgOiBpbmRlbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGVudDtcbiAgfVxufVxuIl19 +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUE4QjtBQUM5QiwrQkFBK0I7QUFFL0Isc0NBQXdDO0FBQ3hDLG1EQUF1RztBQUN2RyxpREFBNkM7QUFJN0MsY0FBYztBQUNkLE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDO0FBRXpDLDBEQUEwRDtBQUMxRCxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBTzVDOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLE1BQW9CLEVBQ3BCLFlBQTBCLEVBQzFCLG1CQUFvRCxFQUFHLEVBQ3ZELFVBQWtCLENBQUM7SUFDbkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVqRixJQUFJLFlBQVksQ0FBQyx3QkFBd0IsSUFBSSxZQUFZLENBQUMsU0FBUyxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUU7UUFDL0YsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsRUFBRSwwQkFBMEIsRUFBRSxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUMxSCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0UsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25GLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0tBQ2hDO0lBRUQsK0JBQStCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRXpELFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RSxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RFLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzdILFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBeEJELDhDQXdCQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQ25DLE1BQTZCLEVBQzdCLFlBQTBCLEVBQzFCLG1CQUFrRCxFQUFFLEVBQ3BELE9BQWdCO0lBQ2hCLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFakYsK0JBQStCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFSRCxzREFRQztBQUVELFNBQVMsK0JBQStCLENBQUMsU0FBb0IsRUFBRSxZQUEwQjtJQUN2RixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFO1FBQUUsT0FBTztLQUFFO0lBQ3JHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEQsU0FBUyxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRXhFLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0hBQWdILENBQUMsQ0FBQztJQUNwSSxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUVqQyxNQUFNLFNBQVM7SUFDYixZQUNtQixNQUFvQixFQUNwQixnQkFBaUQsRUFDbEUsSUFBbUIsRUFDRixVQUFrQixDQUFDO1FBSG5CLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQztRQUVqRCxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ3BDLGtFQUFrRTtRQUNsRSxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVztRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUEsYUFBTSxFQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBQSxhQUFNLEVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU0sYUFBYSxDQUNsQixLQUFhLEVBQ2IsU0FBaUIsRUFDakIsVUFBc0MsRUFDdEMsWUFBeUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFekYsSUFBSSxVQUFVLENBQUMsZUFBZSxLQUFLLENBQUMsRUFBRTtZQUNwQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sa0JBQWtCLENBQUMsS0FBYTtRQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGdCQUFnQixDQUFDLElBQVksRUFBRSxTQUFpQixFQUFFLElBQWlDO1FBQ3hGLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRTNDLElBQUksS0FBSyxDQUFDO1FBRVYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ2xCO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3hCLEtBQUssR0FBRyxHQUFHLFFBQVEsT0FBTyxRQUFRLEVBQUUsQ0FBQztTQUN0QzthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN6QixLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksd0JBQXdCLENBQUMsS0FBYSxFQUFFLFNBQWlCLEVBQUUsSUFBd0I7UUFDeEYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUVsRixtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWxLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzdDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUN6QyxjQUFjLElBQUksQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxLQUFLLGVBQWUsQ0FBQyxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU0sWUFBWSxDQUFJLElBQW1CO1FBQ3hDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU8sUUFBUSxDQUFDO1NBQUU7UUFDekMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQUUsT0FBTyxNQUFNLENBQUM7U0FBRTtRQUNyQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPLE9BQU8sQ0FBQztTQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxXQUFXLENBQUMsS0FBVSxFQUFFLEtBQThCO1FBQzNELElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtZQUFFLE9BQU8sU0FBUyxDQUFDO1NBQUU7UUFDeEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUFFO1FBQ3ZELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksWUFBWSxDQUFDLE1BQXNCO1FBQ3hDLFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyw4QkFBYyxDQUFDLFdBQVc7Z0JBQzdCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUN2RCxLQUFLLDhCQUFjLENBQUMsWUFBWTtnQkFDOUIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsS0FBSyw4QkFBYyxDQUFDLFlBQVk7Z0JBQzlCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELEtBQUssOEJBQWMsQ0FBQyxXQUFXO2dCQUM3QixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzlDLEtBQUssOEJBQWMsQ0FBQyxXQUFXLENBQUM7WUFDaEMsS0FBSyw4QkFBYyxDQUFDLFdBQVcsQ0FBQztZQUNoQyxLQUFLLDhCQUFjLENBQUMsU0FBUztnQkFDM0IsT0FBTyxFQUFFLENBQUMsQ0FBQywrQkFBK0I7U0FDN0M7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxjQUFjLENBQUMsSUFBWSxFQUFFLElBQXFCLEVBQUUsSUFBYTtRQUN0RSxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFBLG9DQUFvQixFQUFDLElBQUksQ0FBQyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyw4QkFBYyxDQUFDLFdBQVcsRUFBRTtnQkFDcEQsY0FBYyxHQUFHLDBCQUEwQixDQUFDO2FBQzdDO2lCQUFNLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyw4QkFBYyxDQUFDLFlBQVksRUFBRTtnQkFDNUQsY0FBYyxHQUFHLHlCQUF5QixDQUFDO2FBQzVDO1NBQ0Y7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2pILE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZ0JBQWdCLENBQUMsU0FBYyxFQUFFLFNBQWMsRUFBRSxVQUFrQjtRQUN4RSxJQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssT0FBTyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDekksSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7Z0JBQ3RELElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtvQkFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUcsQ0FBQyxFQUFFLEVBQUU7d0JBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdEU7aUJBQ0Y7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDekYsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDN0Y7YUFDRjtpQkFBTSxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsZ0NBQWdDLEVBQUU7Z0JBQ25FLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM5RTtpQkFBTSw2REFBNkQsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsT0FBTztTQUNSO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFBLGdCQUFTLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDdEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLFVBQVUsR0FBRyxHQUFHLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMvQyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtnQkFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsVUFBVSxNQUFNLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQzthQUM3RjtpQkFBTSxJQUFJLFFBQVEsS0FBSyxTQUFTLENBQUMsK0JBQStCLEVBQUU7Z0JBQ2pFLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMvRjtpQkFBTSwwREFBMEQsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzlGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksU0FBUyxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7UUFDbkUsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDcEQsT0FBTyxNQUFNLENBQUM7U0FDZjthQUFNLElBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQyw4QkFBOEIsRUFBRTtZQUNoRSxPQUFPLE9BQU8sQ0FBQztTQUNoQjthQUFNLDJEQUEyRCxDQUFDO1lBQ2pFLE9BQU8sUUFBUSxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksc0JBQXNCLENBQUMsWUFBMEI7UUFDdEQsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzlFLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBRWhDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM3RSxJQUFJLGVBQWUsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsZUFBZSxDQUFDO2FBQ3BEO1lBRUQsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdFLElBQUksZUFBZSxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxlQUFlLENBQUM7YUFDcEQ7U0FDRjtJQUNILENBQUM7SUFFTSxlQUFlLENBQUMsU0FBaUI7UUFDdEMsMENBQTBDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUzRCxJQUFJLFVBQVUsRUFBRTtZQUNkLE9BQU8sR0FBRyxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1NBQ2pEO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVNLHVCQUF1QixDQUFDLFNBQWlCO1FBQzlDLDBDQUEwQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlDOzs7O1dBSUc7UUFDSCxTQUFTLGFBQWEsQ0FBQyxDQUFTO1lBQzlCLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDckIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEI7WUFFRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BCLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2QixzR0FBc0c7Z0JBQ3RHLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3BCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTt3QkFDN0MsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQzFDO2lCQUNGO2dCQUVELENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3JCO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVNLGdCQUFnQixDQUFDLE9BQW1CO1FBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRXBDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7WUFDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLDBCQUFXLEVBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ2xIO1FBRUQsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRTtZQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUEsMEJBQVcsRUFBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDdkg7SUFDSCxDQUFDO0lBRU0sMEJBQTBCLENBQUMsT0FBNkI7UUFDN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLDBCQUFXLEVBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRU0sOEJBQThCLENBQUMsSUFBZ0I7UUFDcEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSwwQkFBMEIsQ0FBQyxNQUFjO1FBQzlDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0UsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBdUJEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxPQUFlO0lBQ25FLE1BQU0sS0FBSyxHQUFVLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUNuQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7UUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxRyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM3Qix3Q0FBd0M7WUFDeEMsSUFBSSxJQUFJLEtBQUssOEJBQThCLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBQzFELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDeEMsUUFBUSxNQUFNLEVBQUU7Z0JBQ2QsS0FBSyxHQUFHO29CQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDbEMsTUFBTTtnQkFDUixLQUFLLEdBQUc7b0JBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzVELE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN6RCxNQUFNO2dCQUNSO29CQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE1BQU0sZ0JBQWdCLElBQUksR0FBRyxDQUFDLENBQUM7YUFDN0U7U0FDRjtLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUM7SUFFZCxTQUFTLFdBQVcsQ0FBQyxLQUFlO1FBQ2xDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRyxDQUFDLEVBQUUsRUFBRTtnQkFDdEMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtvQkFDMUIsTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7b0JBQ3pDLE1BQU07aUJBQ1A7YUFDRjtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IERpZmZlcmVuY2VDb2xsZWN0aW9uLCBUZW1wbGF0ZURpZmYgfSBmcm9tICcuL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9kaWZmL3V0aWwnO1xuaW1wb3J0IHsgRGlmZmVyZW5jZSwgaXNQcm9wZXJ0eURpZmZlcmVuY2UsIFJlc291cmNlRGlmZmVyZW5jZSwgUmVzb3VyY2VJbXBhY3QgfSBmcm9tICcuL2RpZmYtdGVtcGxhdGUnO1xuaW1wb3J0IHsgZm9ybWF0VGFibGUgfSBmcm9tICcuL2Zvcm1hdC10YWJsZSc7XG5pbXBvcnQgeyBJYW1DaGFuZ2VzIH0gZnJvbSAnLi9pYW0vaWFtLWNoYW5nZXMnO1xuaW1wb3J0IHsgU2VjdXJpdHlHcm91cENoYW5nZXMgfSBmcm9tICcuL25ldHdvcmsvc2VjdXJpdHktZ3JvdXAtY2hhbmdlcyc7XG5cbi8vIGZyb20gY3gtYXBpXG5jb25zdCBQQVRIX01FVEFEQVRBX0tFWSA9ICdhd3M6Y2RrOnBhdGgnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5jb25zdCB7IHN0cnVjdHVyZWRQYXRjaCB9ID0gcmVxdWlyZSgnZGlmZicpO1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdFN0cmVhbSBleHRlbmRzIE5vZGVKUy5Xcml0YWJsZVN0cmVhbSB7XG4gIGNvbHVtbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVuZGVycyB0ZW1wbGF0ZSBkaWZmZXJlbmNlcyB0byB0aGUgcHJvY2VzcycgY29uc29sZS5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtICAgICAgICAgICBUaGUgSU8gc3RyZWFtIHdoZXJlIHRvIG91dHB1dCB0aGUgcmVuZGVyZWQgZGlmZi5cbiAqIEBwYXJhbSB0ZW1wbGF0ZURpZmYgICAgIFRlbXBsYXRlRGlmZiB0byBiZSByZW5kZXJlZCB0byB0aGUgY29uc29sZS5cbiAqIEBwYXJhbSBsb2dpY2FsVG9QYXRoTWFwIEEgbWFwIGZyb20gbG9naWNhbCBJRCB0byBjb25zdHJ1Y3QgcGF0aC4gVXNlZnVsIGluXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoZXJlIGlzIG5vIGF3czpjZGs6cGF0aCBtZXRhZGF0YSBpbiB0aGUgdGVtcGxhdGUuXG4gKiBAcGFyYW0gY29udGV4dCAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gdXNlIGluIGFyYml0cmFyeSBKU09OIGRpZmYgKGRlZmF1bHRzIHRvIDMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGlmZmVyZW5jZXMoXG4gIHN0cmVhbTogRm9ybWF0U3RyZWFtLFxuICB0ZW1wbGF0ZURpZmY6IFRlbXBsYXRlRGlmZixcbiAgbG9naWNhbFRvUGF0aE1hcDogeyBbbG9naWNhbElkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHsgfSxcbiAgY29udGV4dDogbnVtYmVyID0gMykge1xuICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKHN0cmVhbSwgbG9naWNhbFRvUGF0aE1hcCwgdGVtcGxhdGVEaWZmLCBjb250ZXh0KTtcblxuICBpZiAodGVtcGxhdGVEaWZmLmF3c1RlbXBsYXRlRm9ybWF0VmVyc2lvbiB8fCB0ZW1wbGF0ZURpZmYudHJhbnNmb3JtIHx8IHRlbXBsYXRlRGlmZi5kZXNjcmlwdGlvbikge1xuICAgIGZvcm1hdHRlci5wcmludFNlY3Rpb25IZWFkZXIoJ1RlbXBsYXRlJyk7XG4gICAgZm9ybWF0dGVyLmZvcm1hdERpZmZlcmVuY2UoJ0FXU1RlbXBsYXRlRm9ybWF0VmVyc2lvbicsICdBV1NUZW1wbGF0ZUZvcm1hdFZlcnNpb24nLCB0ZW1wbGF0ZURpZmYuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uKTtcbiAgICBmb3JtYXR0ZXIuZm9ybWF0RGlmZmVyZW5jZSgnVHJhbnNmb3JtJywgJ1RyYW5zZm9ybScsIHRlbXBsYXRlRGlmZi50cmFuc2Zvcm0pO1xuICAgIGZvcm1hdHRlci5mb3JtYXREaWZmZXJlbmNlKCdEZXNjcmlwdGlvbicsICdEZXNjcmlwdGlvbicsIHRlbXBsYXRlRGlmZi5kZXNjcmlwdGlvbik7XG4gICAgZm9ybWF0dGVyLnByaW50U2VjdGlvbkZvb3RlcigpO1xuICB9XG5cbiAgZm9ybWF0U2VjdXJpdHlDaGFuZ2VzV2l0aEJhbm5lcihmb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZik7XG5cbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ1BhcmFtZXRlcnMnLCAnUGFyYW1ldGVyJywgdGVtcGxhdGVEaWZmLnBhcmFtZXRlcnMpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignTWV0YWRhdGEnLCAnTWV0YWRhdGEnLCB0ZW1wbGF0ZURpZmYubWV0YWRhdGEpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignTWFwcGluZ3MnLCAnTWFwcGluZycsIHRlbXBsYXRlRGlmZi5tYXBwaW5ncyk7XG4gIGZvcm1hdHRlci5mb3JtYXRTZWN0aW9uKCdDb25kaXRpb25zJywgJ0NvbmRpdGlvbicsIHRlbXBsYXRlRGlmZi5jb25kaXRpb25zKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ1Jlc291cmNlcycsICdSZXNvdXJjZScsIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMsIGZvcm1hdHRlci5mb3JtYXRSZXNvdXJjZURpZmZlcmVuY2UuYmluZChmb3JtYXR0ZXIpKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ091dHB1dHMnLCAnT3V0cHV0JywgdGVtcGxhdGVEaWZmLm91dHB1dHMpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignT3RoZXIgQ2hhbmdlcycsICdVbmtub3duJywgdGVtcGxhdGVEaWZmLnVua25vd24pO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBkaWZmIG9mIHNlY3VyaXR5IGNoYW5nZXMgdG8gdGhlIGdpdmVuIHN0cmVhbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2VjdXJpdHlDaGFuZ2VzKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0YWJsZVN0cmVhbSxcbiAgdGVtcGxhdGVEaWZmOiBUZW1wbGF0ZURpZmYsXG4gIGxvZ2ljYWxUb1BhdGhNYXA6IHtbbG9naWNhbElkOiBzdHJpbmddOiBzdHJpbmd9ID0ge30sXG4gIGNvbnRleHQ/OiBudW1iZXIpIHtcbiAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcihzdHJlYW0sIGxvZ2ljYWxUb1BhdGhNYXAsIHRlbXBsYXRlRGlmZiwgY29udGV4dCk7XG5cbiAgZm9ybWF0U2VjdXJpdHlDaGFuZ2VzV2l0aEJhbm5lcihmb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlY3VyaXR5Q2hhbmdlc1dpdGhCYW5uZXIoZm9ybWF0dGVyOiBGb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZjogVGVtcGxhdGVEaWZmKSB7XG4gIGlmICghdGVtcGxhdGVEaWZmLmlhbUNoYW5nZXMuaGFzQ2hhbmdlcyAmJiAhdGVtcGxhdGVEaWZmLnNlY3VyaXR5R3JvdXBDaGFuZ2VzLmhhc0NoYW5nZXMpIHsgcmV0dXJuOyB9XG4gIGZvcm1hdHRlci5mb3JtYXRJYW1DaGFuZ2VzKHRlbXBsYXRlRGlmZi5pYW1DaGFuZ2VzKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3VyaXR5R3JvdXBDaGFuZ2VzKHRlbXBsYXRlRGlmZi5zZWN1cml0eUdyb3VwQ2hhbmdlcyk7XG5cbiAgZm9ybWF0dGVyLndhcm5pbmcoJyhOT1RFOiBUaGVyZSBtYXkgYmUgc2VjdXJpdHktcmVsYXRlZCBjaGFuZ2VzIG5vdCBpbiB0aGlzIGxpc3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzEyOTkpJyk7XG4gIGZvcm1hdHRlci5wcmludFNlY3Rpb25Gb290ZXIoKTtcbn1cblxuY29uc3QgQURESVRJT04gPSBjaGFsay5ncmVlbignWytdJyk7XG5jb25zdCBDT05URVhUID0gY2hhbGsuZ3JleSgnWyBdJyk7XG5jb25zdCBVUERBVEUgPSBjaGFsay55ZWxsb3coJ1t+XScpO1xuY29uc3QgUkVNT1ZBTCA9IGNoYWxrLnJlZCgnWy1dJyk7XG5cbmNsYXNzIEZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyZWFtOiBGb3JtYXRTdHJlYW0sXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dpY2FsVG9QYXRoTWFwOiB7IFtsb2dpY2FsSWQ6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIGRpZmY/OiBUZW1wbGF0ZURpZmYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBudW1iZXIgPSAzKSB7XG4gICAgLy8gUmVhZCBhZGRpdGlvbmFsIGNvbnN0cnVjdCBwYXRocyBmcm9tIHRoZSBkaWZmIGlmIGl0IGlzIHN1cHBsaWVkXG4gICAgaWYgKGRpZmYpIHtcbiAgICAgIHRoaXMucmVhZENvbnN0cnVjdFBhdGhzRnJvbShkaWZmKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJpbnQoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5zdHJlYW0ud3JpdGUoY2hhbGsud2hpdGUoZm9ybWF0KGZtdCwgLi4uYXJncykpICsgJ1xcbicpO1xuICB9XG5cbiAgcHVibGljIHdhcm5pbmcoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5zdHJlYW0ud3JpdGUoY2hhbGsueWVsbG93KGZvcm1hdChmbXQsIC4uLmFyZ3MpKSArICdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXRTZWN0aW9uPFYsIFQgZXh0ZW5kcyBEaWZmZXJlbmNlPFY+PihcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGVudHJ5VHlwZTogc3RyaW5nLFxuICAgIGNvbGxlY3Rpb246IERpZmZlcmVuY2VDb2xsZWN0aW9uPFYsIFQ+LFxuICAgIGZvcm1hdHRlcjogKHR5cGU6IHN0cmluZywgaWQ6IHN0cmluZywgZGlmZjogVCkgPT4gdm9pZCA9IHRoaXMuZm9ybWF0RGlmZmVyZW5jZS5iaW5kKHRoaXMpKSB7XG5cbiAgICBpZiAoY29sbGVjdGlvbi5kaWZmZXJlbmNlQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByaW50U2VjdGlvbkhlYWRlcih0aXRsZSk7XG4gICAgY29sbGVjdGlvbi5mb3JFYWNoRGlmZmVyZW5jZSgoaWQsIGRpZmYpID0+IGZvcm1hdHRlcihlbnRyeVR5cGUsIGlkLCBkaWZmKSk7XG4gICAgdGhpcy5wcmludFNlY3Rpb25Gb290ZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmludFNlY3Rpb25IZWFkZXIodGl0bGU6IHN0cmluZykge1xuICAgIHRoaXMucHJpbnQoY2hhbGsudW5kZXJsaW5lKGNoYWxrLmJvbGQodGl0bGUpKSk7XG4gIH1cblxuICBwdWJsaWMgcHJpbnRTZWN0aW9uRm9vdGVyKCkge1xuICAgIHRoaXMucHJpbnQoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IGEgc2ltcGxlIGRpZmZlcmVuY2UgZm9yIGEgZ2l2ZW4gbmFtZWQgZW50aXR5LlxuICAgKlxuICAgKiBAcGFyYW0gbG9naWNhbElkIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBkaWZmZXJlbnQuXG4gICAqIEBwYXJhbSBkaWZmIHRoZSBkaWZmZXJlbmNlIHRvIGJlIHJlbmRlcmVkLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdERpZmZlcmVuY2UodHlwZTogc3RyaW5nLCBsb2dpY2FsSWQ6IHN0cmluZywgZGlmZjogRGlmZmVyZW5jZTxhbnk+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFkaWZmIHx8ICFkaWZmLmlzRGlmZmVyZW50KSB7IHJldHVybjsgfVxuXG4gICAgbGV0IHZhbHVlO1xuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKGRpZmYub2xkVmFsdWUsIGNoYWxrLnJlZCk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKGRpZmYubmV3VmFsdWUsIGNoYWxrLmdyZWVuKTtcbiAgICBpZiAoZGlmZi5pc0FkZGl0aW9uKSB7XG4gICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH0gZWxzZSBpZiAoZGlmZi5pc1VwZGF0ZSkge1xuICAgICAgdmFsdWUgPSBgJHtvbGRWYWx1ZX0gdG8gJHtuZXdWYWx1ZX1gO1xuICAgIH0gZWxzZSBpZiAoZGlmZi5pc1JlbW92YWwpIHtcbiAgICAgIHZhbHVlID0gb2xkVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5wcmludChgJHt0aGlzLmZvcm1hdFByZWZpeChkaWZmKX0gJHtjaGFsay5jeWFuKHR5cGUpfSAke3RoaXMuZm9ybWF0TG9naWNhbElkKGxvZ2ljYWxJZCl9OiAke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IGEgcmVzb3VyY2UgZGlmZmVyZW5jZSBmb3IgYSBnaXZlbiBsb2dpY2FsIElELlxuICAgKlxuICAgKiBAcGFyYW0gbG9naWNhbElkIHRoZSBsb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZSB0aGF0IGNoYW5nZWQuXG4gICAqIEBwYXJhbSBkaWZmICAgICAgdGhlIGNoYW5nZSB0byBiZSByZW5kZXJlZC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRSZXNvdXJjZURpZmZlcmVuY2UoX3R5cGU6IHN0cmluZywgbG9naWNhbElkOiBzdHJpbmcsIGRpZmY6IFJlc291cmNlRGlmZmVyZW5jZSkge1xuICAgIGlmICghZGlmZi5pc0RpZmZlcmVudCkgeyByZXR1cm47IH1cblxuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGRpZmYuaXNSZW1vdmFsID8gZGlmZi5vbGRSZXNvdXJjZVR5cGUgOiBkaWZmLm5ld1Jlc291cmNlVHlwZTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgdGhpcy5wcmludChgJHt0aGlzLmZvcm1hdFByZWZpeChkaWZmKX0gJHt0aGlzLmZvcm1hdFZhbHVlKHJlc291cmNlVHlwZSwgY2hhbGsuY3lhbil9ICR7dGhpcy5mb3JtYXRMb2dpY2FsSWQobG9naWNhbElkKX0gJHt0aGlzLmZvcm1hdEltcGFjdChkaWZmLmNoYW5nZUltcGFjdCl9YCk7XG5cbiAgICBpZiAoZGlmZi5pc1VwZGF0ZSkge1xuICAgICAgY29uc3QgZGlmZmVyZW5jZUNvdW50ID0gZGlmZi5kaWZmZXJlbmNlQ291bnQ7XG4gICAgICBsZXQgcHJvY2Vzc2VkQ291bnQgPSAwO1xuICAgICAgZGlmZi5mb3JFYWNoRGlmZmVyZW5jZSgoXywgbmFtZSwgdmFsdWVzKSA9PiB7XG4gICAgICAgIHByb2Nlc3NlZENvdW50ICs9IDE7XG4gICAgICAgIHRoaXMuZm9ybWF0VHJlZURpZmYobmFtZSwgdmFsdWVzLCBwcm9jZXNzZWRDb3VudCA9PT0gZGlmZmVyZW5jZUNvdW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXRQcmVmaXg8VD4oZGlmZjogRGlmZmVyZW5jZTxUPikge1xuICAgIGlmIChkaWZmLmlzQWRkaXRpb24pIHsgcmV0dXJuIEFERElUSU9OOyB9XG4gICAgaWYgKGRpZmYuaXNVcGRhdGUpIHsgcmV0dXJuIFVQREFURTsgfVxuICAgIGlmIChkaWZmLmlzUmVtb3ZhbCkgeyByZXR1cm4gUkVNT1ZBTDsgfVxuICAgIHJldHVybiBjaGFsay53aGl0ZSgnWz9dJyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBmb3JtYXR0ZWQuXG4gICAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgdG8gYmUgdXNlZC5cbiAgICpcbiAgICogQHJldHVybnMgdGhlIGZvcm1hdHRlZCBzdHJpbmcsIHdpdGggY29sb3IgYXBwbGllZC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRWYWx1ZSh2YWx1ZTogYW55LCBjb2xvcjogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGNvbG9yKHZhbHVlKTsgfVxuICAgIHJldHVybiBjb2xvcihKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbXBhY3QgdGhlIGltcGFjdCB0byBiZSBmb3JtYXR0ZWRcbiAgICogQHJldHVybnMgYSB1c2VyLWZyaWVuZGx5LCBjb2xvcmVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGltcGFjdC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRJbXBhY3QoaW1wYWN0OiBSZXNvdXJjZUltcGFjdCkge1xuICAgIHN3aXRjaCAoaW1wYWN0KSB7XG4gICAgICBjYXNlIFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFOlxuICAgICAgICByZXR1cm4gY2hhbGsuaXRhbGljKGNoYWxrLnllbGxvdygnbWF5IGJlIHJlcGxhY2VkJykpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0U6XG4gICAgICAgIHJldHVybiBjaGFsay5pdGFsaWMoY2hhbGsuYm9sZChjaGFsay5yZWQoJ3JlcGxhY2UnKSkpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX0RFU1RST1k6XG4gICAgICAgIHJldHVybiBjaGFsay5pdGFsaWMoY2hhbGsuYm9sZChjaGFsay5yZWQoJ2Rlc3Ryb3knKSkpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX09SUEhBTjpcbiAgICAgICAgcmV0dXJuIGNoYWxrLml0YWxpYyhjaGFsay55ZWxsb3coJ29ycGhhbicpKTtcbiAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9VUERBVEU6XG4gICAgICBjYXNlIFJlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFOlxuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5OT19DSEFOR0U6XG4gICAgICAgIHJldHVybiAnJzsgLy8gbm8gZXh0cmEgaW5mbyBpcyBnYWluZWQgaGVyZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgdHJlZSBvZiBkaWZmZXJlbmNlcyB1bmRlciBhIHBhcnRpY3VsYXIgbmFtZS5cbiAgICogQHBhcmFtIG5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuXG4gICAqIEBwYXJhbSBkaWZmICAgIHRoZSBkaWZmZXJlbmNlIG9uIHRoZSB0cmVlLlxuICAgKiBAcGFyYW0gbGFzdCAgICB3aGV0aGVyIHRoaXMgaXMgdGhlIGxhc3Qgbm9kZSBvZiBhIHBhcmVudCB0cmVlLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdFRyZWVEaWZmKG5hbWU6IHN0cmluZywgZGlmZjogRGlmZmVyZW5jZTxhbnk+LCBsYXN0OiBib29sZWFuKSB7XG4gICAgbGV0IGFkZGl0aW9uYWxJbmZvID0gJyc7XG4gICAgaWYgKGlzUHJvcGVydHlEaWZmZXJlbmNlKGRpZmYpKSB7XG4gICAgICBpZiAoZGlmZi5jaGFuZ2VJbXBhY3QgPT09IFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFKSB7XG4gICAgICAgIGFkZGl0aW9uYWxJbmZvID0gJyAobWF5IGNhdXNlIHJlcGxhY2VtZW50KSc7XG4gICAgICB9IGVsc2UgaWYgKGRpZmYuY2hhbmdlSW1wYWN0ID09PSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0UpIHtcbiAgICAgICAgYWRkaXRpb25hbEluZm8gPSAnIChyZXF1aXJlcyByZXBsYWNlbWVudCknO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnByaW50KCcgJXPilIAgJXMgJXMlcycsIGxhc3QgPyAn4pSUJyA6ICfilJwnLCB0aGlzLmNoYW5nZVRhZyhkaWZmLm9sZFZhbHVlLCBkaWZmLm5ld1ZhbHVlKSwgbmFtZSwgYWRkaXRpb25hbEluZm8pO1xuICAgIHJldHVybiB0aGlzLmZvcm1hdE9iamVjdERpZmYoZGlmZi5vbGRWYWx1ZSwgZGlmZi5uZXdWYWx1ZSwgYCAke2xhc3QgPyAnICcgOiAn4pSCJ31gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG9iamVjdHMsIGxvb2tpbmcgZm9yIHRoZSBkaWZmZXJlbmNlcyBhcyBkZWVwIGFzIHBvc3NpYmxlLFxuICAgKiBhbmQgcmVuZGVyaW5nIGEgdHJlZSBncmFwaCBvZiB0aGUgcGF0aCB1bnRpbCB0aGUgZGlmZmVyZW5jZSBpcyBmb3VuZC5cbiAgICpcbiAgICogQHBhcmFtIG9sZE9iamVjdCAgdGhlIG9sZCBvYmplY3QuXG4gICAqIEBwYXJhbSBuZXdPYmplY3QgIHRoZSBuZXcgb2JqZWN0LlxuICAgKiBAcGFyYW0gbGluZVByZWZpeCBhIHByZWZpeCAoaW5kZW50LWxpa2UpIHRvIGJlIHVzZWQgb24gZXZlcnkgbGluZS5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRPYmplY3REaWZmKG9sZE9iamVjdDogYW55LCBuZXdPYmplY3Q6IGFueSwgbGluZVByZWZpeDogc3RyaW5nKSB7XG4gICAgaWYgKCh0eXBlb2Ygb2xkT2JqZWN0ICE9PSB0eXBlb2YgbmV3T2JqZWN0KSB8fCBBcnJheS5pc0FycmF5KG9sZE9iamVjdCkgfHwgdHlwZW9mIG9sZE9iamVjdCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9sZE9iamVjdCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChvbGRPYmplY3QgIT09IHVuZGVmaW5lZCAmJiBuZXdPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9sZE9iamVjdCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ld09iamVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBjb25zdCBvbGRTdHIgPSBKU09OLnN0cmluZ2lmeShvbGRPYmplY3QsIG51bGwsIDIpO1xuICAgICAgICAgIGNvbnN0IG5ld1N0ciA9IEpTT04uc3RyaW5naWZ5KG5ld09iamVjdCwgbnVsbCwgMik7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IF9kaWZmU3RyaW5ncyhvbGRTdHIsIG5ld1N0ciwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMCA7IGkgPCBkaWZmLmxlbmd0aCA7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5wcmludCgnJXMgICAlcyAlcycsIGxpbmVQcmVmaXgsIGkgPT09IDAgPyAn4pSU4pSAJyA6ICcgICcsIGRpZmZbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUnOKUgCAlcyAlcycsIGxpbmVQcmVmaXgsIFJFTU9WQUwsIHRoaXMuZm9ybWF0VmFsdWUob2xkT2JqZWN0LCBjaGFsay5yZWQpKTtcbiAgICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUlOKUgCAlcyAlcycsIGxpbmVQcmVmaXgsIEFERElUSU9OLCB0aGlzLmZvcm1hdFZhbHVlKG5ld09iamVjdCwgY2hhbGsuZ3JlZW4pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvbGRPYmplY3QgIT09IHVuZGVmaW5lZCAvKiAmJiBuZXdPYmplY3QgPT09IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUlOKUgCAlcycsIGxpbmVQcmVmaXgsIHRoaXMuZm9ybWF0VmFsdWUob2xkT2JqZWN0LCBjaGFsay5yZWQpKTtcbiAgICAgIH0gZWxzZSAvKiBpZiAob2xkT2JqZWN0ID09PSB1bmRlZmluZWQgJiYgbmV3T2JqZWN0ICE9PSB1bmRlZmluZWQpICovIHtcbiAgICAgICAgdGhpcy5wcmludCgnJXMgICDilJTilIAgJXMnLCBsaW5lUHJlZml4LCB0aGlzLmZvcm1hdFZhbHVlKG5ld09iamVjdCwgY2hhbGsuZ3JlZW4pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5U2V0ID0gbmV3IFNldChPYmplY3Qua2V5cyhvbGRPYmplY3QpKTtcbiAgICBPYmplY3Qua2V5cyhuZXdPYmplY3QpLmZvckVhY2goayA9PiBrZXlTZXQuYWRkKGspKTtcbiAgICBjb25zdCBrZXlzID0gbmV3IEFycmF5KC4uLmtleVNldCkuZmlsdGVyKGsgPT4gIWRlZXBFcXVhbChvbGRPYmplY3Rba10sIG5ld09iamVjdFtrXSkpLnNvcnQoKTtcbiAgICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkT2JqZWN0W2tleV07XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld09iamVjdFtrZXldO1xuICAgICAgY29uc3QgdHJlZVByZWZpeCA9IGtleSA9PT0gbGFzdEtleSA/ICfilJQnIDogJ+KUnCc7XG4gICAgICBpZiAob2xkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBuZXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucHJpbnQoJyVzICAgJXPilIAgJXMgJXM6JywgbGluZVByZWZpeCwgdHJlZVByZWZpeCwgdGhpcy5jaGFuZ2VUYWcob2xkVmFsdWUsIG5ld1ZhbHVlKSwgY2hhbGsuYmx1ZShgLiR7a2V5fWApKTtcbiAgICAgICAgdGhpcy5mb3JtYXRPYmplY3REaWZmKG9sZFZhbHVlLCBuZXdWYWx1ZSwgYCR7bGluZVByZWZpeH0gICAke2tleSA9PT0gbGFzdEtleSA/ICcgJyA6ICfilIInfWApO1xuICAgICAgfSBlbHNlIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkIC8qICYmIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKi8pIHtcbiAgICAgICAgdGhpcy5wcmludCgnJXMgICAlc+KUgCAlcyBSZW1vdmVkOiAlcycsIGxpbmVQcmVmaXgsIHRyZWVQcmVmaXgsIFJFTU9WQUwsIGNoYWxrLmJsdWUoYC4ke2tleX1gKSk7XG4gICAgICB9IGVsc2UgLyogaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCAqLyB7XG4gICAgICAgIHRoaXMucHJpbnQoJyVzICAgJXPilIAgJXMgQWRkZWQ6ICVzJywgbGluZVByZWZpeCwgdHJlZVByZWZpeCwgQURESVRJT04sIGNoYWxrLmJsdWUoYC4ke2tleX1gKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlIG9mIGEgZGlmZmVyZW5jZS5cbiAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgYSBkaWZmZXJlbmNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIHRhZyB0byBiZSByZW5kZXJlZCBpbiB0aGUgZGlmZiwgcmVmbGVjdGluZyB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlXG4gICAqICAgICAgd2FzIGFuIEFERElUSU9OLCBVUERBVEUgb3IgUkVNT1ZBTC5cbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VUYWcob2xkVmFsdWU6IGFueSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IGFueSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFVQREFURTtcbiAgICB9IGVsc2UgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQgLyogJiYgbmV3VmFsdWUgPT09IHVuZGVmaW5lZCovKSB7XG4gICAgICByZXR1cm4gUkVNT1ZBTDtcbiAgICB9IGVsc2UgLyogaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCkgKi8ge1xuICAgICAgcmV0dXJuIEFERElUSU9OO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kICdhd3M6Y2RrOnBhdGgnIG1ldGFkYXRhIGluIHRoZSBkaWZmIGFuZCBhZGQgaXQgdG8gdGhlIGxvZ2ljYWxUb1BhdGhNYXBcbiAgICpcbiAgICogVGhlcmUgYXJlIG11bHRpcGxlIHNvdXJjZXMgb2YgbG9naWNhbElEIC0+IHBhdGggbWFwcGluZ3M6IHN5bnRoIG1ldGFkYXRhXG4gICAqIGFuZCByZXNvdXJjZSBtZXRhZGF0YSwgYW5kIHdlIGNvbWJpbmUgYWxsIHNvdXJjZXMgaW50byBhIHNpbmdsZSBtYXAuXG4gICAqL1xuICBwdWJsaWMgcmVhZENvbnN0cnVjdFBhdGhzRnJvbSh0ZW1wbGF0ZURpZmY6IFRlbXBsYXRlRGlmZikge1xuICAgIGZvciAoY29uc3QgW2xvZ2ljYWxJZCwgcmVzb3VyY2VEaWZmXSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURpZmYucmVzb3VyY2VzKSkge1xuICAgICAgaWYgKCFyZXNvdXJjZURpZmYpIHsgY29udGludWU7IH1cblxuICAgICAgY29uc3Qgb2xkUGF0aE1ldGFkYXRhID0gcmVzb3VyY2VEaWZmLm9sZFZhbHVlPy5NZXRhZGF0YT8uW1BBVEhfTUVUQURBVEFfS0VZXTtcbiAgICAgIGlmIChvbGRQYXRoTWV0YWRhdGEgJiYgIShsb2dpY2FsSWQgaW4gdGhpcy5sb2dpY2FsVG9QYXRoTWFwKSkge1xuICAgICAgICB0aGlzLmxvZ2ljYWxUb1BhdGhNYXBbbG9naWNhbElkXSA9IG9sZFBhdGhNZXRhZGF0YTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3UGF0aE1ldGFkYXRhID0gcmVzb3VyY2VEaWZmLm5ld1ZhbHVlPy5NZXRhZGF0YT8uW1BBVEhfTUVUQURBVEFfS0VZXTtcbiAgICAgIGlmIChuZXdQYXRoTWV0YWRhdGEgJiYgIShsb2dpY2FsSWQgaW4gdGhpcy5sb2dpY2FsVG9QYXRoTWFwKSkge1xuICAgICAgICB0aGlzLmxvZ2ljYWxUb1BhdGhNYXBbbG9naWNhbElkXSA9IG5ld1BhdGhNZXRhZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9ybWF0TG9naWNhbElkKGxvZ2ljYWxJZDogc3RyaW5nKSB7XG4gICAgLy8gaWYgd2UgaGF2ZSBhIHBhdGggaW4gdGhlIG1hcCwgcmV0dXJuIGl0XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplZExvZ2ljYWxJZFBhdGgobG9naWNhbElkKTtcblxuICAgIGlmIChub3JtYWxpemVkKSB7XG4gICAgICByZXR1cm4gYCR7bm9ybWFsaXplZH0gJHtjaGFsay5ncmF5KGxvZ2ljYWxJZCl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9naWNhbElkO1xuICB9XG5cbiAgcHVibGljIG5vcm1hbGl6ZWRMb2dpY2FsSWRQYXRoKGxvZ2ljYWxJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGEgcGF0aCBpbiB0aGUgbWFwLCByZXR1cm4gaXRcbiAgICBjb25zdCBwYXRoID0gdGhpcy5sb2dpY2FsVG9QYXRoTWFwW2xvZ2ljYWxJZF07XG4gICAgcmV0dXJuIHBhdGggPyBub3JtYWxpemVQYXRoKHBhdGgpIDogdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogUGF0aCBpcyBzdXBwb3NlZCB0byBzdGFydCB3aXRoIFwiL3N0YWNrLW5hbWVcIi4gSWYgdGhpcyBpcyB0aGUgY2FzZSAoaS5lLiBwYXRoIGhhcyBtb3JlIHRoYW5cbiAgICAgKiB0d28gY29tcG9uZW50cywgd2UgcmVtb3ZlIHRoZSBmaXJzdCBwYXJ0LiBPdGhlcndpc2UsIHdlIGp1c3QgdXNlIHRoZSBmdWxsIHBhdGguXG4gICAgICogQHBhcmFtIHBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHA6IHN0cmluZykge1xuICAgICAgaWYgKHAuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgIHAgPSBwLnNsaWNlKDEpO1xuICAgICAgfVxuXG4gICAgICBsZXQgcGFydHMgPSBwLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICBwYXJ0cyA9IHBhcnRzLnNsaWNlKDEpO1xuXG4gICAgICAgIC8vIHJlbW92ZSB0aGUgbGFzdCBjb21wb25lbnQgaWYgaXQncyBcIlJlc291cmNlXCIgb3IgXCJEZWZhdWx0XCIgKGlmIHdlIGhhdmUgbW9yZSB0aGFuIGEgc2luZ2xlIGNvbXBvbmVudClcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBjb25zdCBsYXN0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgaWYgKGxhc3QgPT09ICdSZXNvdXJjZScgfHwgbGFzdCA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIHBhcnRzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHAgPSBwYXJ0cy5qb2luKCcvJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9ybWF0SWFtQ2hhbmdlcyhjaGFuZ2VzOiBJYW1DaGFuZ2VzKSB7XG4gICAgaWYgKCFjaGFuZ2VzLmhhc0NoYW5nZXMpIHsgcmV0dXJuOyB9XG5cbiAgICBpZiAoY2hhbmdlcy5zdGF0ZW1lbnRzLmhhc0NoYW5nZXMpIHtcbiAgICAgIHRoaXMucHJpbnRTZWN0aW9uSGVhZGVyKCdJQU0gU3RhdGVtZW50IENoYW5nZXMnKTtcbiAgICAgIHRoaXMucHJpbnQoZm9ybWF0VGFibGUodGhpcy5kZWVwU3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMoY2hhbmdlcy5zdW1tYXJpemVTdGF0ZW1lbnRzKCkpLCB0aGlzLnN0cmVhbS5jb2x1bW5zKSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMubWFuYWdlZFBvbGljaWVzLmhhc0NoYW5nZXMpIHtcbiAgICAgIHRoaXMucHJpbnRTZWN0aW9uSGVhZGVyKCdJQU0gUG9saWN5IENoYW5nZXMnKTtcbiAgICAgIHRoaXMucHJpbnQoZm9ybWF0VGFibGUodGhpcy5kZWVwU3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMoY2hhbmdlcy5zdW1tYXJpemVNYW5hZ2VkUG9saWNpZXMoKSksIHRoaXMuc3RyZWFtLmNvbHVtbnMpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9ybWF0U2VjdXJpdHlHcm91cENoYW5nZXMoY2hhbmdlczogU2VjdXJpdHlHcm91cENoYW5nZXMpIHtcbiAgICBpZiAoIWNoYW5nZXMuaGFzQ2hhbmdlcykgeyByZXR1cm47IH1cblxuICAgIHRoaXMucHJpbnRTZWN0aW9uSGVhZGVyKCdTZWN1cml0eSBHcm91cCBDaGFuZ2VzJyk7XG4gICAgdGhpcy5wcmludChmb3JtYXRUYWJsZSh0aGlzLmRlZXBTdWJzdGl0dXRlQnJhY2VkTG9naWNhbElkcyhjaGFuZ2VzLnN1bW1hcml6ZSgpKSwgdGhpcy5zdHJlYW0uY29sdW1ucykpO1xuICB9XG5cbiAgcHVibGljIGRlZXBTdWJzdGl0dXRlQnJhY2VkTG9naWNhbElkcyhyb3dzOiBzdHJpbmdbXVtdKTogc3RyaW5nW11bXSB7XG4gICAgcmV0dXJuIHJvd3MubWFwKHJvdyA9PiByb3cubWFwKHRoaXMuc3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMuYmluZCh0aGlzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnN0aXR1dGUgYWxsIHN0cmluZ3MgbGlrZSAke0xvZ0lkLnh4eH0gd2l0aCB0aGUgcGF0aCBpbnN0ZWFkIG9mIHRoZSBsb2dpY2FsIElEXG4gICAqL1xuICBwdWJsaWMgc3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzb3VyY2UucmVwbGFjZSgvXFwkXFx7KFteLn1dKykoLltefV0rKT9cXH0vaWcsIChfbWF0Y2gsIGxvZ0lkLCBzdWZmaXgpID0+IHtcbiAgICAgIHJldHVybiAnJHsnICsgKHRoaXMubm9ybWFsaXplZExvZ2ljYWxJZFBhdGgobG9nSWQpIHx8IGxvZ0lkKSArIChzdWZmaXggfHwgJycpICsgJ30nO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQSBwYXRjaCBhcyByZXR1cm5lZCBieSBgYGRpZmYuc3RydWN0dXJlZFBhdGNoYGAuXG4gKi9cbmludGVyZmFjZSBQYXRjaCB7XG4gIC8qKlxuICAgKiBIdW5rcyBpbiB0aGUgcGF0Y2guXG4gICAqL1xuICBodW5rczogUmVhZG9ubHlBcnJheTxQYXRjaEh1bms+O1xufVxuXG4vKipcbiAqIEEgaHVuayBpbiBhIHBhdGNoIHByb2R1Y2VkIGJ5IGBgZGlmZi5zdHJ1Y3R1cmVkUGF0Y2hgYC5cbiAqL1xuaW50ZXJmYWNlIFBhdGNoSHVuayB7XG4gIG9sZFN0YXJ0OiBudW1iZXI7XG4gIG9sZExpbmVzOiBudW1iZXI7XG4gIG5ld1N0YXJ0OiBudW1iZXI7XG4gIG5ld0xpbmVzOiBudW1iZXI7XG4gIGxpbmVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdW5pZmllZCBkaWZmIG9mIHR3byBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSBvbGRTdHIgIHRoZSBcIm9sZFwiIHZlcnNpb24gb2YgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSBuZXdTdHIgIHRoZSBcIm5ld1wiIHZlcnNpb24gb2YgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSBjb250ZXh0IHRoZSBudW1iZXIgb2YgY29udGV4dCBsaW5lcyB0byB1c2UgaW4gYXJiaXRyYXJ5IEpTT04gZGlmZi5cbiAqXG4gKiBAcmV0dXJucyBhbiBhcnJheSBvZiBkaWZmIGxpbmVzLlxuICovXG5mdW5jdGlvbiBfZGlmZlN0cmluZ3Mob2xkU3RyOiBzdHJpbmcsIG5ld1N0cjogc3RyaW5nLCBjb250ZXh0OiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhdGNoOiBQYXRjaCA9IHN0cnVjdHVyZWRQYXRjaChudWxsLCBudWxsLCBvbGRTdHIsIG5ld1N0ciwgbnVsbCwgbnVsbCwgeyBjb250ZXh0IH0pO1xuICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGh1bmsgb2YgcGF0Y2guaHVua3MpIHtcbiAgICByZXN1bHQucHVzaChjaGFsay5tYWdlbnRhKGBAQCAtJHtodW5rLm9sZFN0YXJ0fSwke2h1bmsub2xkTGluZXN9ICske2h1bmsubmV3U3RhcnR9LCR7aHVuay5uZXdMaW5lc30gQEBgKSk7XG4gICAgY29uc3QgYmFzZUluZGVudCA9IF9maW5kSW5kZW50KGh1bmsubGluZXMpO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBodW5rLmxpbmVzKSB7XG4gICAgICAvLyBEb24ndCBjYXJlIGFib3V0IHRlcm1pbmF0aW9uIG5ld2xpbmUuXG4gICAgICBpZiAobGluZSA9PT0gJ1xcXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZScpIHsgY29udGludWU7IH1cbiAgICAgIGNvbnN0IG1hcmtlciA9IGxpbmUuY2hhckF0KDApO1xuICAgICAgY29uc3QgdGV4dCA9IGxpbmUuc2xpY2UoMSArIGJhc2VJbmRlbnQpO1xuICAgICAgc3dpdGNoIChtYXJrZXIpIHtcbiAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgcmVzdWx0LnB1c2goYCR7Q09OVEVYVH0gJHt0ZXh0fWApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICByZXN1bHQucHVzaChjaGFsay5ib2xkKGAke0FERElUSU9OfSAke2NoYWxrLmdyZWVuKHRleHQpfWApKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgcmVzdWx0LnB1c2goY2hhbGsuYm9sZChgJHtSRU1PVkFMfSAke2NoYWxrLnJlZCh0ZXh0KX1gKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGRpZmYgbWFya2VyOiAke21hcmtlcn0gKGZ1bGwgbGluZTogJHtsaW5lfSlgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcblxuICBmdW5jdGlvbiBfZmluZEluZGVudChsaW5lczogc3RyaW5nW10pOiBudW1iZXIge1xuICAgIGxldCBpbmRlbnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAxIDsgaSA8IGxpbmUubGVuZ3RoIDsgaSsrKSB7XG4gICAgICAgIGlmIChsaW5lLmNoYXJBdChpKSAhPT0gJyAnKSB7XG4gICAgICAgICAgaW5kZW50ID0gaW5kZW50ID4gaSAtIDEgPyBpIC0gMSA6IGluZGVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZW50O1xuICB9XG59XG4iXX0= /***/ }), @@ -11299,7 +10651,7 @@ function _diffStrings(oldStr, newStr, context) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.IamChanges = void 0; -const cfnspec = __nccwpck_require__(72665); +const service_spec_types_1 = __nccwpck_require__(504); const chalk = __nccwpck_require__(78818); const managed_policy_1 = __nccwpck_require__(67116); const statement_1 = __nccwpck_require__(68434); @@ -11408,17 +10760,17 @@ class IamChanges { } readPropertyChange(propertyChange) { switch (propertyChange.scrutinyType) { - case cfnspec.schema.PropertyScrutinyType.InlineIdentityPolicies: + case service_spec_types_1.PropertyScrutinyType.InlineIdentityPolicies: // AWS::IAM::{ Role | User | Group }.Policies this.statements.addOld(...this.readIdentityPolicies(propertyChange.oldValue, propertyChange.resourceLogicalId)); this.statements.addNew(...this.readIdentityPolicies(propertyChange.newValue, propertyChange.resourceLogicalId)); break; - case cfnspec.schema.PropertyScrutinyType.InlineResourcePolicy: + case service_spec_types_1.PropertyScrutinyType.InlineResourcePolicy: // Any PolicyDocument on a resource (including AssumeRolePolicyDocument) this.statements.addOld(...this.readResourceStatements(propertyChange.oldValue, propertyChange.resourceLogicalId)); this.statements.addNew(...this.readResourceStatements(propertyChange.newValue, propertyChange.resourceLogicalId)); break; - case cfnspec.schema.PropertyScrutinyType.ManagedPolicies: + case service_spec_types_1.PropertyScrutinyType.ManagedPolicies: // Just a list of managed policies this.managedPolicies.addOld(...this.readManagedPolicies(propertyChange.oldValue, propertyChange.resourceLogicalId)); this.managedPolicies.addNew(...this.readManagedPolicies(propertyChange.newValue, propertyChange.resourceLogicalId)); @@ -11427,17 +10779,17 @@ class IamChanges { } readResourceChange(resourceChange) { switch (resourceChange.scrutinyType) { - case cfnspec.schema.ResourceScrutinyType.IdentityPolicyResource: + case service_spec_types_1.ResourceScrutinyType.IdentityPolicyResource: // AWS::IAM::Policy this.statements.addOld(...this.readIdentityPolicyResource(resourceChange.oldProperties)); this.statements.addNew(...this.readIdentityPolicyResource(resourceChange.newProperties)); break; - case cfnspec.schema.ResourceScrutinyType.ResourcePolicyResource: + case service_spec_types_1.ResourceScrutinyType.ResourcePolicyResource: // AWS::*::{Bucket,Queue,Topic}Policy this.statements.addOld(...this.readResourcePolicyResource(resourceChange.oldProperties)); this.statements.addNew(...this.readResourcePolicyResource(resourceChange.newProperties)); break; - case cfnspec.schema.ResourceScrutinyType.LambdaPermission: + case service_spec_types_1.ResourceScrutinyType.LambdaPermission: this.statements.addOld(...this.readLambdaStatements(resourceChange.oldProperties)); this.statements.addNew(...this.readLambdaStatements(resourceChange.newProperties)); break; @@ -11516,14 +10868,14 @@ class IamChanges { } exports.IamChanges = IamChanges; IamChanges.IamPropertyScrutinies = [ - cfnspec.schema.PropertyScrutinyType.InlineIdentityPolicies, - cfnspec.schema.PropertyScrutinyType.InlineResourcePolicy, - cfnspec.schema.PropertyScrutinyType.ManagedPolicies, + service_spec_types_1.PropertyScrutinyType.InlineIdentityPolicies, + service_spec_types_1.PropertyScrutinyType.InlineResourcePolicy, + service_spec_types_1.PropertyScrutinyType.ManagedPolicies, ]; IamChanges.IamResourceScrutinies = [ - cfnspec.schema.ResourceScrutinyType.ResourcePolicyResource, - cfnspec.schema.ResourceScrutinyType.IdentityPolicyResource, - cfnspec.schema.ResourceScrutinyType.LambdaPermission, + service_spec_types_1.ResourceScrutinyType.ResourcePolicyResource, + service_spec_types_1.ResourceScrutinyType.IdentityPolicyResource, + service_spec_types_1.ResourceScrutinyType.LambdaPermission, ]; /** * Set an undefined or wildcarded principal on these statements @@ -11541,7 +10893,7 @@ function defaultResource(resource, statements) { statements.forEach(s => s.resources.replaceStar(resource)); return statements; } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWNoYW5nZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpYW0tY2hhbmdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0Q0FBNEM7QUFDNUMsK0JBQStCO0FBQy9CLHFEQUE4RTtBQUM5RSwyQ0FBK0Y7QUFHL0YsMENBQWlEO0FBQ2pELDREQUF3RDtBQUN4RCxrQ0FBb0Y7QUFPcEY7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFnQnJCLFlBQVksS0FBc0I7UUFIbEIsZUFBVSxHQUFHLElBQUksNkJBQWtCLEVBQWEsQ0FBQztRQUNqRCxvQkFBZSxHQUFHLElBQUksNkJBQWtCLEVBQTJCLENBQUM7UUFHbEYsS0FBSyxNQUFNLGNBQWMsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFO1lBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN6QztRQUNELEtBQUssTUFBTSxjQUFjLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDekM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7ZUFDM0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO2VBQ3pELElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNJLG1CQUFtQjtRQUN4QixNQUFNLEdBQUcsR0FBZSxFQUFFLENBQUM7UUFFM0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTlFLHlGQUF5RjtRQUN6RixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFO1lBQ2pELE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxpQkFBaUIsQ0FBQyxRQUFRO2dCQUMxQixpQkFBaUIsQ0FBQyxNQUFNO2dCQUN4QixpQkFBaUIsQ0FBQyxNQUFNO2dCQUN4QixpQkFBaUIsQ0FBQyxTQUFTO2dCQUMzQixpQkFBaUIsQ0FBQyxTQUFTO2FBQzVCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFDRCxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1lBQ2hELE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsaUJBQWlCLENBQUMsUUFBUTtnQkFDMUIsaUJBQWlCLENBQUMsTUFBTTtnQkFDeEIsaUJBQWlCLENBQUMsTUFBTTtnQkFDeEIsaUJBQWlCLENBQUMsU0FBUztnQkFDM0IsaUJBQWlCLENBQUMsU0FBUzthQUM1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCO1FBRUQscUJBQXFCO1FBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSxxQkFBYyxFQUFDLENBQUMsR0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFekIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sd0JBQXdCO1FBQzdCLE1BQU0sR0FBRyxHQUFlLEVBQUUsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUV0RCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFO1lBQ2hELEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxHQUFHLENBQUMsV0FBVztnQkFDZixHQUFHLENBQUMsZ0JBQWdCO2FBQ3JCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQy9DLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxHQUFHLENBQUMsV0FBVztnQkFDZixHQUFHLENBQUMsZ0JBQWdCO2FBQ3JCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFFRCxxQkFBcUI7UUFDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFBLHFCQUFjLEVBQUMsQ0FBQyxHQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRELEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUEsMEJBQW1CLEVBQUM7WUFDekIsa0JBQWtCLEVBQUUsSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLGlCQUFpQixFQUFFLElBQUEsa0JBQVcsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM5RSxzQkFBc0IsRUFBRSxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDekYscUJBQXFCLEVBQUUsSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3hGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxjQUE4QjtRQUN2RCxRQUFRLGNBQWMsQ0FBQyxZQUFZLEVBQUU7WUFDbkMsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQjtnQkFDN0QsNkNBQTZDO2dCQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hILElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDaEgsTUFBTTtZQUNSLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0I7Z0JBQzNELHdFQUF3RTtnQkFDeEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUNsSCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xILE1BQU07WUFDUixLQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsZUFBZTtnQkFDdEQsa0NBQWtDO2dCQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BILElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDcEgsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLGNBQThCO1FBQ3ZELFFBQVEsY0FBYyxDQUFDLFlBQVksRUFBRTtZQUNuQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCO2dCQUM3RCxtQkFBbUI7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUN6RixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDekYsTUFBTTtZQUNSLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0I7Z0JBQzdELHFDQUFxQztnQkFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUN6RixNQUFNO1lBQ1IsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQjtnQkFDdkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ25GLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FBQyxRQUFhLEVBQUUsU0FBaUI7UUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFdEUsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUV0RCxPQUFPLElBQUEsY0FBTyxFQUFDLFFBQVEsRUFBRSxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ3ZDLGlFQUFpRTtZQUNqRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsU0FBUztnQkFDeEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUztnQkFDakMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNYLE9BQU8sZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsSUFBQSwyQkFBZSxFQUFDLElBQUEsb0NBQWdCLEVBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSywwQkFBMEIsQ0FBQyxVQUFlO1FBQ2hELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFNUMsVUFBVSxHQUFHLElBQUEsb0NBQWdCLEVBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLE9BQU8sSUFBQSxjQUFPLEVBQUMsVUFBVSxFQUFFLENBQUMsU0FBaUIsRUFBRSxFQUFFO1lBQy9DLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUM7WUFDL0IsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBQSwyQkFBZSxFQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFXLEVBQUUsU0FBaUI7UUFDM0QsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7U0FBRTtRQUV4QyxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ3JELE9BQU8sZUFBZSxDQUFDLGlCQUFpQixFQUFFLElBQUEsMkJBQWUsRUFBQyxJQUFBLG9DQUFnQixFQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVEOztPQUVHO0lBQ0ssMEJBQTBCLENBQUMsVUFBZTtRQUNoRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBRTVDLFVBQVUsR0FBRyxJQUFBLG9DQUFnQixFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJGLHNFQUFzRTtRQUN0RSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMvRyxJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxGLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM3QixTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN6QjtRQUVELE9BQU8sSUFBQSxjQUFPLEVBQUMsU0FBUyxFQUFFLENBQUMsUUFBZ0IsRUFBRSxFQUFFO1lBQzdDLE9BQU8sZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFBLDJCQUFlLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsVUFBZSxFQUFFLFNBQWlCO1FBQzVELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBRS9CLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ25DLE9BQU8sd0NBQXVCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLElBQUEsb0NBQWdCLEVBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRU8sb0JBQW9CLENBQUMsVUFBd0I7UUFDbkQsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFL0IsT0FBTyxDQUFDLElBQUEsaUNBQXFCLEVBQUMsSUFBQSxvQ0FBZ0IsRUFBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7QUEvT0gsZ0NBZ1BDO0FBL09lLGdDQUFxQixHQUFHO0lBQ3BDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCO0lBQzFELE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CO0lBQ3hELE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsZUFBZTtDQUNwRCxBQUprQyxDQUlqQztBQUVZLGdDQUFxQixHQUFHO0lBQ3BDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCO0lBQzFELE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCO0lBQzFELE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCO0NBQ3JELEFBSmtDLENBSWpDO0FBdU9KOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxTQUFpQixFQUFFLFVBQXVCO0lBQ2xFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzlELFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzdELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLFFBQWdCLEVBQUUsVUFBdUI7SUFDaEUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDNUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNmbnNwZWMgZnJvbSAnQGF3cy1jZGsvY2Zuc3BlYyc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBNYW5hZ2VkUG9saWN5QXR0YWNobWVudCwgTWFuYWdlZFBvbGljeUpzb24gfSBmcm9tICcuL21hbmFnZWQtcG9saWN5JztcbmltcG9ydCB7IHBhcnNlTGFtYmRhUGVybWlzc2lvbiwgcGFyc2VTdGF0ZW1lbnRzLCBTdGF0ZW1lbnQsIFN0YXRlbWVudEpzb24gfSBmcm9tICcuL3N0YXRlbWVudCc7XG5pbXBvcnQgeyBNYXliZVBhcnNlZCB9IGZyb20gJy4uL2RpZmYvbWF5YmUtcGFyc2VkJztcbmltcG9ydCB7IFByb3BlcnR5Q2hhbmdlLCBQcm9wZXJ0eU1hcCwgUmVzb3VyY2VDaGFuZ2UgfSBmcm9tICcuLi9kaWZmL3R5cGVzJztcbmltcG9ydCB7IERpZmZhYmxlQ29sbGVjdGlvbiB9IGZyb20gJy4uL2RpZmZhYmxlJztcbmltcG9ydCB7IHJlbmRlckludHJpbnNpY3MgfSBmcm9tICcuLi9yZW5kZXItaW50cmluc2ljcyc7XG5pbXBvcnQgeyBkZWVwUmVtb3ZlVW5kZWZpbmVkLCBkcm9wSWZFbXB0eSwgZmxhdE1hcCwgbWFrZUNvbXBhcmF0b3IgfSBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBJYW1DaGFuZ2VzUHJvcHMge1xuICBwcm9wZXJ0eUNoYW5nZXM6IFByb3BlcnR5Q2hhbmdlW107XG4gIHJlc291cmNlQ2hhbmdlczogUmVzb3VyY2VDaGFuZ2VbXTtcbn1cblxuLyoqXG4gKiBDaGFuZ2VzIHRvIElBTSBzdGF0ZW1lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBJYW1DaGFuZ2VzIHtcbiAgcHVibGljIHN0YXRpYyBJYW1Qcm9wZXJ0eVNjcnV0aW5pZXMgPSBbXG4gICAgY2Zuc3BlYy5zY2hlbWEuUHJvcGVydHlTY3J1dGlueVR5cGUuSW5saW5lSWRlbnRpdHlQb2xpY2llcyxcbiAgICBjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVSZXNvdXJjZVBvbGljeSxcbiAgICBjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZS5NYW5hZ2VkUG9saWNpZXMsXG4gIF07XG5cbiAgcHVibGljIHN0YXRpYyBJYW1SZXNvdXJjZVNjcnV0aW5pZXMgPSBbXG4gICAgY2Zuc3BlYy5zY2hlbWEuUmVzb3VyY2VTY3J1dGlueVR5cGUuUmVzb3VyY2VQb2xpY3lSZXNvdXJjZSxcbiAgICBjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZS5JZGVudGl0eVBvbGljeVJlc291cmNlLFxuICAgIGNmbnNwZWMuc2NoZW1hLlJlc291cmNlU2NydXRpbnlUeXBlLkxhbWJkYVBlcm1pc3Npb24sXG4gIF07XG5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlbWVudHMgPSBuZXcgRGlmZmFibGVDb2xsZWN0aW9uPFN0YXRlbWVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IG1hbmFnZWRQb2xpY2llcyA9IG5ldyBEaWZmYWJsZUNvbGxlY3Rpb248TWFuYWdlZFBvbGljeUF0dGFjaG1lbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IElhbUNoYW5nZXNQcm9wcykge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlDaGFuZ2Ugb2YgcHJvcHMucHJvcGVydHlDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUNoYW5nZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VDaGFuZ2Ugb2YgcHJvcHMucmVzb3VyY2VDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRSZXNvdXJjZUNoYW5nZShyZXNvdXJjZUNoYW5nZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZW1lbnRzLmNhbGN1bGF0ZURpZmYoKTtcbiAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5jYWxjdWxhdGVEaWZmKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50cy5oYXNDaGFuZ2VzIHx8IHRoaXMubWFuYWdlZFBvbGljaWVzLmhhc0NoYW5nZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGNoYW5nZXMgaW5jbHVkZSBicm9hZGVuZWQgcGVybWlzc2lvbnNcbiAgICpcbiAgICogUGVybWlzc2lvbnMgYXJlIGJyb2FkZW5lZCBpZiBwb3NpdGl2ZSBzdGF0ZW1lbnRzIGFyZSBhZGRlZCBvclxuICAgKiBuZWdhdGl2ZSBzdGF0ZW1lbnRzIGFyZSByZW1vdmVkLCBvciBpZiBtYW5hZ2VkIHBvbGljaWVzIGFyZSBhZGRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnNCcm9hZGVuZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50cy5hZGRpdGlvbnMuc29tZShzID0+ICFzLmlzTmVnYXRpdmVTdGF0ZW1lbnQpXG4gICAgICAgIHx8IHRoaXMuc3RhdGVtZW50cy5yZW1vdmFscy5zb21lKHMgPT4gcy5pc05lZ2F0aXZlU3RhdGVtZW50KVxuICAgICAgICB8fCB0aGlzLm1hbmFnZWRQb2xpY2llcy5oYXNBZGRpdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3VtbWFyeSB0YWJsZSBvZiBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgc3VtbWFyaXplU3RhdGVtZW50cygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcblxuICAgIGNvbnN0IGhlYWRlciA9IFsnJywgJ1Jlc291cmNlJywgJ0VmZmVjdCcsICdBY3Rpb24nLCAnUHJpbmNpcGFsJywgJ0NvbmRpdGlvbiddO1xuXG4gICAgLy8gRmlyc3QgZ2VuZXJhdGUgYWxsIGxpbmVzLCB0aGVuIHNvcnQgb24gUmVzb3VyY2Ugc28gdGhhdCBzaW1pbGFyIHJlc291cmNlcyBhcmUgdG9nZXRoZXJcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMuYWRkaXRpb25zKSB7XG4gICAgICBjb25zdCByZW5kZXJlZFN0YXRlbWVudCA9IHN0YXRlbWVudC5yZW5kZXIoKTtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJysnLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5yZXNvdXJjZSxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuZWZmZWN0LFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5hY3Rpb24sXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LnByaW5jaXBhbCxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuY29uZGl0aW9uLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMucmVtb3ZhbHMpIHtcbiAgICAgIGNvbnN0IHJlbmRlcmVkU3RhdGVtZW50ID0gc3RhdGVtZW50LnJlbmRlcigpO1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICBjaGFsay5yZWQoJy0nKSxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQucmVzb3VyY2UsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LmVmZmVjdCxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuYWN0aW9uLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5wcmluY2lwYWwsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LmNvbmRpdGlvbixcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsucmVkKHMpKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSAybmQgY29sdW1uXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV1dKSk7XG5cbiAgICByZXQuc3BsaWNlKDAsIDAsIGhlYWRlcik7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIHN1bW1hcml6ZU1hbmFnZWRQb2xpY2llcygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcbiAgICBjb25zdCBoZWFkZXIgPSBbJycsICdSZXNvdXJjZScsICdNYW5hZ2VkIFBvbGljeSBBUk4nXTtcblxuICAgIGZvciAoY29uc3QgYXR0IG9mIHRoaXMubWFuYWdlZFBvbGljaWVzLmFkZGl0aW9ucykge1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICAnKycsXG4gICAgICAgIGF0dC5pZGVudGl0eUFybixcbiAgICAgICAgYXR0Lm1hbmFnZWRQb2xpY3lBcm4sXG4gICAgICBdLm1hcChzID0+IGNoYWxrLmdyZWVuKHMpKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgYXR0IG9mIHRoaXMubWFuYWdlZFBvbGljaWVzLnJlbW92YWxzKSB7XG4gICAgICByZXQucHVzaChbXG4gICAgICAgICctJyxcbiAgICAgICAgYXR0LmlkZW50aXR5QXJuLFxuICAgICAgICBhdHQubWFuYWdlZFBvbGljeUFybixcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsucmVkKHMpKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSAybmQgY29sdW1uXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV1dKSk7XG5cbiAgICByZXQuc3BsaWNlKDAsIDAsIGhlYWRlcik7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY2hhbmdlcy5cbiAgICogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGVzdHMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0pzb24oKTogSWFtQ2hhbmdlc0pzb24ge1xuICAgIHJldHVybiBkZWVwUmVtb3ZlVW5kZWZpbmVkKHtcbiAgICAgIHN0YXRlbWVudEFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5zdGF0ZW1lbnRzLmFkZGl0aW9ucy5tYXAocyA9PiBzLl90b0pzb24oKSkpLFxuICAgICAgc3RhdGVtZW50UmVtb3ZhbHM6IGRyb3BJZkVtcHR5KHRoaXMuc3RhdGVtZW50cy5yZW1vdmFscy5tYXAocyA9PiBzLl90b0pzb24oKSkpLFxuICAgICAgbWFuYWdlZFBvbGljeUFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5tYW5hZ2VkUG9saWNpZXMuYWRkaXRpb25zLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgICBtYW5hZ2VkUG9saWN5UmVtb3ZhbHM6IGRyb3BJZkVtcHR5KHRoaXMubWFuYWdlZFBvbGljaWVzLnJlbW92YWxzLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUNoYW5nZTogUHJvcGVydHlDaGFuZ2UpIHtcbiAgICBzd2l0Y2ggKHByb3BlcnR5Q2hhbmdlLnNjcnV0aW55VHlwZSkge1xuICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVJZGVudGl0eVBvbGljaWVzOlxuICAgICAgICAvLyBBV1M6OklBTTo6eyBSb2xlIHwgVXNlciB8IEdyb3VwIH0uUG9saWNpZXNcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE9sZCguLi50aGlzLnJlYWRJZGVudGl0eVBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZElkZW50aXR5UG9saWNpZXMocHJvcGVydHlDaGFuZ2UubmV3VmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVSZXNvdXJjZVBvbGljeTpcbiAgICAgICAgLy8gQW55IFBvbGljeURvY3VtZW50IG9uIGEgcmVzb3VyY2UgKGluY2x1ZGluZyBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQpXG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkUmVzb3VyY2VTdGF0ZW1lbnRzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZFJlc291cmNlU3RhdGVtZW50cyhwcm9wZXJ0eUNoYW5nZS5uZXdWYWx1ZSwgcHJvcGVydHlDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGNmbnNwZWMuc2NoZW1hLlByb3BlcnR5U2NydXRpbnlUeXBlLk1hbmFnZWRQb2xpY2llczpcbiAgICAgICAgLy8gSnVzdCBhIGxpc3Qgb2YgbWFuYWdlZCBwb2xpY2llc1xuICAgICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGRPbGQoLi4udGhpcy5yZWFkTWFuYWdlZFBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGROZXcoLi4udGhpcy5yZWFkTWFuYWdlZFBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm5ld1ZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRSZXNvdXJjZUNoYW5nZShyZXNvdXJjZUNoYW5nZTogUmVzb3VyY2VDaGFuZ2UpIHtcbiAgICBzd2l0Y2ggKHJlc291cmNlQ2hhbmdlLnNjcnV0aW55VHlwZSkge1xuICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZS5JZGVudGl0eVBvbGljeVJlc291cmNlOlxuICAgICAgICAvLyBBV1M6OklBTTo6UG9saWN5XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZS5SZXNvdXJjZVBvbGljeVJlc291cmNlOlxuICAgICAgICAvLyBBV1M6Oio6OntCdWNrZXQsUXVldWUsVG9waWN9UG9saWN5XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkUmVzb3VyY2VQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkUmVzb3VyY2VQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZS5MYW1iZGFQZXJtaXNzaW9uOlxuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkT2xkKC4uLnRoaXMucmVhZExhbWJkYVN0YXRlbWVudHMocmVzb3VyY2VDaGFuZ2Uub2xkUHJvcGVydGllcykpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZExhbWJkYVN0YXRlbWVudHMocmVzb3VyY2VDaGFuZ2UubmV3UHJvcGVydGllcykpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYSBsaXN0IG9mIHBvbGljaWVzIG9uIGFuIGlkZW50aXR5XG4gICAqL1xuICBwcml2YXRlIHJlYWRJZGVudGl0eVBvbGljaWVzKHBvbGljaWVzOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwb2xpY2llcyA9PT0gdW5kZWZpbmVkIHx8ICFBcnJheS5pc0FycmF5KHBvbGljaWVzKSkgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IGFwcGxpZXNUb1ByaW5jaXBhbCA9ICdBV1M6JHsnICsgbG9naWNhbElkICsgJ30nO1xuXG4gICAgcmV0dXJuIGZsYXRNYXAocG9saWNpZXMsIChwb2xpY3k6IGFueSkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIFBvbGljeSBpdHNlbGYgaXMgbm90IGFuIGludHJpbnNpYywgbGlrZSBhbiBGbjo6SWZcbiAgICAgIGNvbnN0IHVucGFyc2VkU3RhdGVtZW50ID0gcG9saWN5LlBvbGljeURvY3VtZW50Py5TdGF0ZW1lbnRcbiAgICAgICAgPyBwb2xpY3kuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50XG4gICAgICAgIDogcG9saWN5O1xuICAgICAgcmV0dXJuIGRlZmF1bHRQcmluY2lwYWwoYXBwbGllc1RvUHJpbmNpcGFsLCBwYXJzZVN0YXRlbWVudHMocmVuZGVySW50cmluc2ljcyh1bnBhcnNlZFN0YXRlbWVudCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbiBJQU06OlBvbGljeSByZXNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShwcm9wZXJ0aWVzOiBhbnkpOiBTdGF0ZW1lbnRbXSB7XG4gICAgaWYgKHByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIHByb3BlcnRpZXMgPSByZW5kZXJJbnRyaW5zaWNzKHByb3BlcnRpZXMpO1xuXG4gICAgY29uc3QgcHJpbmNpcGFscyA9IChwcm9wZXJ0aWVzLkdyb3VwcyB8fCBbXSkuY29uY2F0KHByb3BlcnRpZXMuVXNlcnMgfHwgW10pLmNvbmNhdChwcm9wZXJ0aWVzLlJvbGVzIHx8IFtdKTtcbiAgICByZXR1cm4gZmxhdE1hcChwcmluY2lwYWxzLCAocHJpbmNpcGFsOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHJlZiA9ICdBV1M6JyArIHByaW5jaXBhbDtcbiAgICAgIHJldHVybiBkZWZhdWx0UHJpbmNpcGFsKHJlZiwgcGFyc2VTdGF0ZW1lbnRzKHByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50KSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRSZXNvdXJjZVN0YXRlbWVudHMocG9saWN5OiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwb2xpY3kgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IGFwcGxpZXNUb1Jlc291cmNlID0gJyR7JyArIGxvZ2ljYWxJZCArICcuQXJufSc7XG4gICAgcmV0dXJuIGRlZmF1bHRSZXNvdXJjZShhcHBsaWVzVG9SZXNvdXJjZSwgcGFyc2VTdGF0ZW1lbnRzKHJlbmRlckludHJpbnNpY3MocG9saWN5LlN0YXRlbWVudCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbiBBV1M6Oio6OntCdWNrZXQsVG9waWMsUXVldWV9cG9saWN5XG4gICAqL1xuICBwcml2YXRlIHJlYWRSZXNvdXJjZVBvbGljeVJlc291cmNlKHByb3BlcnRpZXM6IGFueSk6IFN0YXRlbWVudFtdIHtcbiAgICBpZiAocHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBbXTsgfVxuXG4gICAgcHJvcGVydGllcyA9IHJlbmRlckludHJpbnNpY3MocHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBwb2xpY3lLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykuZmlsdGVyKGtleSA9PiBrZXkuaW5kZXhPZignUG9saWN5JykgPiAtMSk7XG5cbiAgICAvLyBGaW5kIHRoZSBrZXkgdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZShzKSB0aGlzIHBvbGljeSBhcHBsaWVzIHRvXG4gICAgY29uc3QgcmVzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykuZmlsdGVyKGtleSA9PiAhcG9saWN5S2V5cy5pbmNsdWRlcyhrZXkpICYmICFrZXkuZW5kc1dpdGgoJ05hbWUnKSk7XG4gICAgbGV0IHJlc291cmNlcyA9IHJlc291cmNlS2V5cy5sZW5ndGggPT09IDEgPyBwcm9wZXJ0aWVzW3Jlc291cmNlS2V5c1swXV0gOiBbJz8/PyddO1xuXG4gICAgLy8gRm9yIHNvbWUgcmVzb3VyY2VzLCB0aGlzIGlzIGEgc2luZ2xldG9uIHN0cmluZywgZm9yIHNvbWUgaXQncyBhbiBhcnJheVxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZXNvdXJjZXMpKSB7XG4gICAgICByZXNvdXJjZXMgPSBbcmVzb3VyY2VzXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdE1hcChyZXNvdXJjZXMsIChyZXNvdXJjZTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gZGVmYXVsdFJlc291cmNlKHJlc291cmNlLCBwYXJzZVN0YXRlbWVudHMocHJvcGVydGllc1twb2xpY3lLZXlzWzBdXS5TdGF0ZW1lbnQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZE1hbmFnZWRQb2xpY2llcyhwb2xpY3lBcm5zOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogTWFuYWdlZFBvbGljeUF0dGFjaG1lbnRbXSB7XG4gICAgaWYgKCFwb2xpY3lBcm5zKSB7IHJldHVybiBbXTsgfVxuXG4gICAgY29uc3QgcmVwID0gJyR7JyArIGxvZ2ljYWxJZCArICd9JztcbiAgICByZXR1cm4gTWFuYWdlZFBvbGljeUF0dGFjaG1lbnQucGFyc2VNYW5hZ2VkUG9saWNpZXMocmVwLCByZW5kZXJJbnRyaW5zaWNzKHBvbGljeUFybnMpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZExhbWJkYVN0YXRlbWVudHMocHJvcGVydGllcz86IFByb3BlcnR5TWFwKTogU3RhdGVtZW50W10ge1xuICAgIGlmICghcHJvcGVydGllcykgeyByZXR1cm4gW107IH1cblxuICAgIHJldHVybiBbcGFyc2VMYW1iZGFQZXJtaXNzaW9uKHJlbmRlckludHJpbnNpY3MocHJvcGVydGllcykpXTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBhbiB1bmRlZmluZWQgb3Igd2lsZGNhcmRlZCBwcmluY2lwYWwgb24gdGhlc2Ugc3RhdGVtZW50c1xuICovXG5mdW5jdGlvbiBkZWZhdWx0UHJpbmNpcGFsKHByaW5jaXBhbDogc3RyaW5nLCBzdGF0ZW1lbnRzOiBTdGF0ZW1lbnRbXSkge1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnByaW5jaXBhbHMucmVwbGFjZUVtcHR5KHByaW5jaXBhbCkpO1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnByaW5jaXBhbHMucmVwbGFjZVN0YXIocHJpbmNpcGFsKSk7XG4gIHJldHVybiBzdGF0ZW1lbnRzO1xufVxuXG4vKipcbiAqIFNldCBhbiB1bmRlZmluZWQgb3Igd2lsZGNhcmRlZCByZXNvdXJjZSBvbiB0aGVzZSBzdGF0ZW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRSZXNvdXJjZShyZXNvdXJjZTogc3RyaW5nLCBzdGF0ZW1lbnRzOiBTdGF0ZW1lbnRbXSkge1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnJlc291cmNlcy5yZXBsYWNlRW1wdHkocmVzb3VyY2UpKTtcbiAgc3RhdGVtZW50cy5mb3JFYWNoKHMgPT4gcy5yZXNvdXJjZXMucmVwbGFjZVN0YXIocmVzb3VyY2UpKTtcbiAgcmV0dXJuIHN0YXRlbWVudHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWFtQ2hhbmdlc0pzb24ge1xuICBzdGF0ZW1lbnRBZGRpdGlvbnM/OiBBcnJheTxNYXliZVBhcnNlZDxTdGF0ZW1lbnRKc29uPj47XG4gIHN0YXRlbWVudFJlbW92YWxzPzogQXJyYXk8TWF5YmVQYXJzZWQ8U3RhdGVtZW50SnNvbj4+O1xuICBtYW5hZ2VkUG9saWN5QWRkaXRpb25zPzogQXJyYXk8TWF5YmVQYXJzZWQ8TWFuYWdlZFBvbGljeUpzb24+PjtcbiAgbWFuYWdlZFBvbGljeVJlbW92YWxzPzogQXJyYXk8TWF5YmVQYXJzZWQ8TWFuYWdlZFBvbGljeUpzb24+Pjtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWNoYW5nZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpYW0tY2hhbmdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvRUFBeUY7QUFDekYsK0JBQStCO0FBQy9CLHFEQUE4RTtBQUM5RSwyQ0FBK0Y7QUFHL0YsMENBQWlEO0FBQ2pELDREQUF3RDtBQUN4RCxrQ0FBb0Y7QUFPcEY7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFnQnJCLFlBQVksS0FBc0I7UUFIbEIsZUFBVSxHQUFHLElBQUksNkJBQWtCLEVBQWEsQ0FBQztRQUNqRCxvQkFBZSxHQUFHLElBQUksNkJBQWtCLEVBQTJCLENBQUM7UUFHbEYsS0FBSyxNQUFNLGNBQWMsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFO1lBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN6QztRQUNELEtBQUssTUFBTSxjQUFjLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDekM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7ZUFDM0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO2VBQ3pELElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNJLG1CQUFtQjtRQUN4QixNQUFNLEdBQUcsR0FBZSxFQUFFLENBQUM7UUFFM0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTlFLHlGQUF5RjtRQUN6RixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFO1lBQ2pELE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxpQkFBaUIsQ0FBQyxRQUFRO2dCQUMxQixpQkFBaUIsQ0FBQyxNQUFNO2dCQUN4QixpQkFBaUIsQ0FBQyxNQUFNO2dCQUN4QixpQkFBaUIsQ0FBQyxTQUFTO2dCQUMzQixpQkFBaUIsQ0FBQyxTQUFTO2FBQzVCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFDRCxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1lBQ2hELE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsaUJBQWlCLENBQUMsUUFBUTtnQkFDMUIsaUJBQWlCLENBQUMsTUFBTTtnQkFDeEIsaUJBQWlCLENBQUMsTUFBTTtnQkFDeEIsaUJBQWlCLENBQUMsU0FBUztnQkFDM0IsaUJBQWlCLENBQUMsU0FBUzthQUM1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCO1FBRUQscUJBQXFCO1FBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSxxQkFBYyxFQUFDLENBQUMsR0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFekIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sd0JBQXdCO1FBQzdCLE1BQU0sR0FBRyxHQUFlLEVBQUUsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUV0RCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFO1lBQ2hELEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxHQUFHLENBQUMsV0FBVztnQkFDZixHQUFHLENBQUMsZ0JBQWdCO2FBQ3JCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQy9DLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxHQUFHLENBQUMsV0FBVztnQkFDZixHQUFHLENBQUMsZ0JBQWdCO2FBQ3JCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFFRCxxQkFBcUI7UUFDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFBLHFCQUFjLEVBQUMsQ0FBQyxHQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRELEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUEsMEJBQW1CLEVBQUM7WUFDekIsa0JBQWtCLEVBQUUsSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLGlCQUFpQixFQUFFLElBQUEsa0JBQVcsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM5RSxzQkFBc0IsRUFBRSxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDekYscUJBQXFCLEVBQUUsSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3hGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxjQUE4QjtRQUN2RCxRQUFRLGNBQWMsQ0FBQyxZQUFZLEVBQUU7WUFDbkMsS0FBSyx5Q0FBb0IsQ0FBQyxzQkFBc0I7Z0JBQzlDLDZDQUE2QztnQkFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUNoSCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hILE1BQU07WUFDUixLQUFLLHlDQUFvQixDQUFDLG9CQUFvQjtnQkFDNUMsd0VBQXdFO2dCQUN4RSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xILElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDbEgsTUFBTTtZQUNSLEtBQUsseUNBQW9CLENBQUMsZUFBZTtnQkFDdkMsa0NBQWtDO2dCQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BILElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDcEgsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLGNBQThCO1FBQ3ZELFFBQVEsY0FBYyxDQUFDLFlBQVksRUFBRTtZQUNuQyxLQUFLLHlDQUFvQixDQUFDLHNCQUFzQjtnQkFDOUMsbUJBQW1CO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDekYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLE1BQU07WUFDUixLQUFLLHlDQUFvQixDQUFDLHNCQUFzQjtnQkFDOUMscUNBQXFDO2dCQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDekYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLE1BQU07WUFDUixLQUFLLHlDQUFvQixDQUFDLGdCQUFnQjtnQkFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ25GLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FBQyxRQUFhLEVBQUUsU0FBaUI7UUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFdEUsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUV0RCxPQUFPLElBQUEsY0FBTyxFQUFDLFFBQVEsRUFBRSxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ3ZDLGlFQUFpRTtZQUNqRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsU0FBUztnQkFDeEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUztnQkFDakMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNYLE9BQU8sZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsSUFBQSwyQkFBZSxFQUFDLElBQUEsb0NBQWdCLEVBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSywwQkFBMEIsQ0FBQyxVQUFlO1FBQ2hELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFNUMsVUFBVSxHQUFHLElBQUEsb0NBQWdCLEVBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLE9BQU8sSUFBQSxjQUFPLEVBQUMsVUFBVSxFQUFFLENBQUMsU0FBaUIsRUFBRSxFQUFFO1lBQy9DLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUM7WUFDL0IsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBQSwyQkFBZSxFQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFXLEVBQUUsU0FBaUI7UUFDM0QsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7U0FBRTtRQUV4QyxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ3JELE9BQU8sZUFBZSxDQUFDLGlCQUFpQixFQUFFLElBQUEsMkJBQWUsRUFBQyxJQUFBLG9DQUFnQixFQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVEOztPQUVHO0lBQ0ssMEJBQTBCLENBQUMsVUFBZTtRQUNoRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBRTVDLFVBQVUsR0FBRyxJQUFBLG9DQUFnQixFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJGLHNFQUFzRTtRQUN0RSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMvRyxJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxGLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM3QixTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN6QjtRQUVELE9BQU8sSUFBQSxjQUFPLEVBQUMsU0FBUyxFQUFFLENBQUMsUUFBZ0IsRUFBRSxFQUFFO1lBQzdDLE9BQU8sZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFBLDJCQUFlLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsVUFBZSxFQUFFLFNBQWlCO1FBQzVELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBRS9CLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ25DLE9BQU8sd0NBQXVCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLElBQUEsb0NBQWdCLEVBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRU8sb0JBQW9CLENBQUMsVUFBd0I7UUFDbkQsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFL0IsT0FBTyxDQUFDLElBQUEsaUNBQXFCLEVBQUMsSUFBQSxvQ0FBZ0IsRUFBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7QUEvT0gsZ0NBZ1BDO0FBL09lLGdDQUFxQixHQUFHO0lBQ3BDLHlDQUFvQixDQUFDLHNCQUFzQjtJQUMzQyx5Q0FBb0IsQ0FBQyxvQkFBb0I7SUFDekMseUNBQW9CLENBQUMsZUFBZTtDQUNyQyxBQUprQyxDQUlqQztBQUVZLGdDQUFxQixHQUFHO0lBQ3BDLHlDQUFvQixDQUFDLHNCQUFzQjtJQUMzQyx5Q0FBb0IsQ0FBQyxzQkFBc0I7SUFDM0MseUNBQW9CLENBQUMsZ0JBQWdCO0NBQ3RDLEFBSmtDLENBSWpDO0FBdU9KOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxTQUFpQixFQUFFLFVBQXVCO0lBQ2xFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzlELFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzdELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLFFBQWdCLEVBQUUsVUFBdUI7SUFDaEUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDNUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3BlcnR5U2NydXRpbnlUeXBlLCBSZXNvdXJjZVNjcnV0aW55VHlwZSB9IGZyb20gJ0Bhd3MtY2RrL3NlcnZpY2Utc3BlYy10eXBlcyc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBNYW5hZ2VkUG9saWN5QXR0YWNobWVudCwgTWFuYWdlZFBvbGljeUpzb24gfSBmcm9tICcuL21hbmFnZWQtcG9saWN5JztcbmltcG9ydCB7IHBhcnNlTGFtYmRhUGVybWlzc2lvbiwgcGFyc2VTdGF0ZW1lbnRzLCBTdGF0ZW1lbnQsIFN0YXRlbWVudEpzb24gfSBmcm9tICcuL3N0YXRlbWVudCc7XG5pbXBvcnQgeyBNYXliZVBhcnNlZCB9IGZyb20gJy4uL2RpZmYvbWF5YmUtcGFyc2VkJztcbmltcG9ydCB7IFByb3BlcnR5Q2hhbmdlLCBQcm9wZXJ0eU1hcCwgUmVzb3VyY2VDaGFuZ2UgfSBmcm9tICcuLi9kaWZmL3R5cGVzJztcbmltcG9ydCB7IERpZmZhYmxlQ29sbGVjdGlvbiB9IGZyb20gJy4uL2RpZmZhYmxlJztcbmltcG9ydCB7IHJlbmRlckludHJpbnNpY3MgfSBmcm9tICcuLi9yZW5kZXItaW50cmluc2ljcyc7XG5pbXBvcnQgeyBkZWVwUmVtb3ZlVW5kZWZpbmVkLCBkcm9wSWZFbXB0eSwgZmxhdE1hcCwgbWFrZUNvbXBhcmF0b3IgfSBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBJYW1DaGFuZ2VzUHJvcHMge1xuICBwcm9wZXJ0eUNoYW5nZXM6IFByb3BlcnR5Q2hhbmdlW107XG4gIHJlc291cmNlQ2hhbmdlczogUmVzb3VyY2VDaGFuZ2VbXTtcbn1cblxuLyoqXG4gKiBDaGFuZ2VzIHRvIElBTSBzdGF0ZW1lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBJYW1DaGFuZ2VzIHtcbiAgcHVibGljIHN0YXRpYyBJYW1Qcm9wZXJ0eVNjcnV0aW5pZXMgPSBbXG4gICAgUHJvcGVydHlTY3J1dGlueVR5cGUuSW5saW5lSWRlbnRpdHlQb2xpY2llcyxcbiAgICBQcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVSZXNvdXJjZVBvbGljeSxcbiAgICBQcm9wZXJ0eVNjcnV0aW55VHlwZS5NYW5hZ2VkUG9saWNpZXMsXG4gIF07XG5cbiAgcHVibGljIHN0YXRpYyBJYW1SZXNvdXJjZVNjcnV0aW5pZXMgPSBbXG4gICAgUmVzb3VyY2VTY3J1dGlueVR5cGUuUmVzb3VyY2VQb2xpY3lSZXNvdXJjZSxcbiAgICBSZXNvdXJjZVNjcnV0aW55VHlwZS5JZGVudGl0eVBvbGljeVJlc291cmNlLFxuICAgIFJlc291cmNlU2NydXRpbnlUeXBlLkxhbWJkYVBlcm1pc3Npb24sXG4gIF07XG5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlbWVudHMgPSBuZXcgRGlmZmFibGVDb2xsZWN0aW9uPFN0YXRlbWVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IG1hbmFnZWRQb2xpY2llcyA9IG5ldyBEaWZmYWJsZUNvbGxlY3Rpb248TWFuYWdlZFBvbGljeUF0dGFjaG1lbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IElhbUNoYW5nZXNQcm9wcykge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlDaGFuZ2Ugb2YgcHJvcHMucHJvcGVydHlDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUNoYW5nZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VDaGFuZ2Ugb2YgcHJvcHMucmVzb3VyY2VDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRSZXNvdXJjZUNoYW5nZShyZXNvdXJjZUNoYW5nZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZW1lbnRzLmNhbGN1bGF0ZURpZmYoKTtcbiAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5jYWxjdWxhdGVEaWZmKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50cy5oYXNDaGFuZ2VzIHx8IHRoaXMubWFuYWdlZFBvbGljaWVzLmhhc0NoYW5nZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGNoYW5nZXMgaW5jbHVkZSBicm9hZGVuZWQgcGVybWlzc2lvbnNcbiAgICpcbiAgICogUGVybWlzc2lvbnMgYXJlIGJyb2FkZW5lZCBpZiBwb3NpdGl2ZSBzdGF0ZW1lbnRzIGFyZSBhZGRlZCBvclxuICAgKiBuZWdhdGl2ZSBzdGF0ZW1lbnRzIGFyZSByZW1vdmVkLCBvciBpZiBtYW5hZ2VkIHBvbGljaWVzIGFyZSBhZGRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnNCcm9hZGVuZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50cy5hZGRpdGlvbnMuc29tZShzID0+ICFzLmlzTmVnYXRpdmVTdGF0ZW1lbnQpXG4gICAgICAgIHx8IHRoaXMuc3RhdGVtZW50cy5yZW1vdmFscy5zb21lKHMgPT4gcy5pc05lZ2F0aXZlU3RhdGVtZW50KVxuICAgICAgICB8fCB0aGlzLm1hbmFnZWRQb2xpY2llcy5oYXNBZGRpdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3VtbWFyeSB0YWJsZSBvZiBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgc3VtbWFyaXplU3RhdGVtZW50cygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcblxuICAgIGNvbnN0IGhlYWRlciA9IFsnJywgJ1Jlc291cmNlJywgJ0VmZmVjdCcsICdBY3Rpb24nLCAnUHJpbmNpcGFsJywgJ0NvbmRpdGlvbiddO1xuXG4gICAgLy8gRmlyc3QgZ2VuZXJhdGUgYWxsIGxpbmVzLCB0aGVuIHNvcnQgb24gUmVzb3VyY2Ugc28gdGhhdCBzaW1pbGFyIHJlc291cmNlcyBhcmUgdG9nZXRoZXJcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMuYWRkaXRpb25zKSB7XG4gICAgICBjb25zdCByZW5kZXJlZFN0YXRlbWVudCA9IHN0YXRlbWVudC5yZW5kZXIoKTtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJysnLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5yZXNvdXJjZSxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuZWZmZWN0LFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5hY3Rpb24sXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LnByaW5jaXBhbCxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuY29uZGl0aW9uLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMucmVtb3ZhbHMpIHtcbiAgICAgIGNvbnN0IHJlbmRlcmVkU3RhdGVtZW50ID0gc3RhdGVtZW50LnJlbmRlcigpO1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICBjaGFsay5yZWQoJy0nKSxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQucmVzb3VyY2UsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LmVmZmVjdCxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuYWN0aW9uLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5wcmluY2lwYWwsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LmNvbmRpdGlvbixcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsucmVkKHMpKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSAybmQgY29sdW1uXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV1dKSk7XG5cbiAgICByZXQuc3BsaWNlKDAsIDAsIGhlYWRlcik7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIHN1bW1hcml6ZU1hbmFnZWRQb2xpY2llcygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcbiAgICBjb25zdCBoZWFkZXIgPSBbJycsICdSZXNvdXJjZScsICdNYW5hZ2VkIFBvbGljeSBBUk4nXTtcblxuICAgIGZvciAoY29uc3QgYXR0IG9mIHRoaXMubWFuYWdlZFBvbGljaWVzLmFkZGl0aW9ucykge1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICAnKycsXG4gICAgICAgIGF0dC5pZGVudGl0eUFybixcbiAgICAgICAgYXR0Lm1hbmFnZWRQb2xpY3lBcm4sXG4gICAgICBdLm1hcChzID0+IGNoYWxrLmdyZWVuKHMpKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgYXR0IG9mIHRoaXMubWFuYWdlZFBvbGljaWVzLnJlbW92YWxzKSB7XG4gICAgICByZXQucHVzaChbXG4gICAgICAgICctJyxcbiAgICAgICAgYXR0LmlkZW50aXR5QXJuLFxuICAgICAgICBhdHQubWFuYWdlZFBvbGljeUFybixcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsucmVkKHMpKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSAybmQgY29sdW1uXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV1dKSk7XG5cbiAgICByZXQuc3BsaWNlKDAsIDAsIGhlYWRlcik7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY2hhbmdlcy5cbiAgICogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGVzdHMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0pzb24oKTogSWFtQ2hhbmdlc0pzb24ge1xuICAgIHJldHVybiBkZWVwUmVtb3ZlVW5kZWZpbmVkKHtcbiAgICAgIHN0YXRlbWVudEFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5zdGF0ZW1lbnRzLmFkZGl0aW9ucy5tYXAocyA9PiBzLl90b0pzb24oKSkpLFxuICAgICAgc3RhdGVtZW50UmVtb3ZhbHM6IGRyb3BJZkVtcHR5KHRoaXMuc3RhdGVtZW50cy5yZW1vdmFscy5tYXAocyA9PiBzLl90b0pzb24oKSkpLFxuICAgICAgbWFuYWdlZFBvbGljeUFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5tYW5hZ2VkUG9saWNpZXMuYWRkaXRpb25zLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgICBtYW5hZ2VkUG9saWN5UmVtb3ZhbHM6IGRyb3BJZkVtcHR5KHRoaXMubWFuYWdlZFBvbGljaWVzLnJlbW92YWxzLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUNoYW5nZTogUHJvcGVydHlDaGFuZ2UpIHtcbiAgICBzd2l0Y2ggKHByb3BlcnR5Q2hhbmdlLnNjcnV0aW55VHlwZSkge1xuICAgICAgY2FzZSBQcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVJZGVudGl0eVBvbGljaWVzOlxuICAgICAgICAvLyBBV1M6OklBTTo6eyBSb2xlIHwgVXNlciB8IEdyb3VwIH0uUG9saWNpZXNcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE9sZCguLi50aGlzLnJlYWRJZGVudGl0eVBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZElkZW50aXR5UG9saWNpZXMocHJvcGVydHlDaGFuZ2UubmV3VmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVSZXNvdXJjZVBvbGljeTpcbiAgICAgICAgLy8gQW55IFBvbGljeURvY3VtZW50IG9uIGEgcmVzb3VyY2UgKGluY2x1ZGluZyBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQpXG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkUmVzb3VyY2VTdGF0ZW1lbnRzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZFJlc291cmNlU3RhdGVtZW50cyhwcm9wZXJ0eUNoYW5nZS5uZXdWYWx1ZSwgcHJvcGVydHlDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByb3BlcnR5U2NydXRpbnlUeXBlLk1hbmFnZWRQb2xpY2llczpcbiAgICAgICAgLy8gSnVzdCBhIGxpc3Qgb2YgbWFuYWdlZCBwb2xpY2llc1xuICAgICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGRPbGQoLi4udGhpcy5yZWFkTWFuYWdlZFBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGROZXcoLi4udGhpcy5yZWFkTWFuYWdlZFBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm5ld1ZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRSZXNvdXJjZUNoYW5nZShyZXNvdXJjZUNoYW5nZTogUmVzb3VyY2VDaGFuZ2UpIHtcbiAgICBzd2l0Y2ggKHJlc291cmNlQ2hhbmdlLnNjcnV0aW55VHlwZSkge1xuICAgICAgY2FzZSBSZXNvdXJjZVNjcnV0aW55VHlwZS5JZGVudGl0eVBvbGljeVJlc291cmNlOlxuICAgICAgICAvLyBBV1M6OklBTTo6UG9saWN5XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSZXNvdXJjZVNjcnV0aW55VHlwZS5SZXNvdXJjZVBvbGljeVJlc291cmNlOlxuICAgICAgICAvLyBBV1M6Oio6OntCdWNrZXQsUXVldWUsVG9waWN9UG9saWN5XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkUmVzb3VyY2VQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkUmVzb3VyY2VQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSZXNvdXJjZVNjcnV0aW55VHlwZS5MYW1iZGFQZXJtaXNzaW9uOlxuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkT2xkKC4uLnRoaXMucmVhZExhbWJkYVN0YXRlbWVudHMocmVzb3VyY2VDaGFuZ2Uub2xkUHJvcGVydGllcykpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZExhbWJkYVN0YXRlbWVudHMocmVzb3VyY2VDaGFuZ2UubmV3UHJvcGVydGllcykpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYSBsaXN0IG9mIHBvbGljaWVzIG9uIGFuIGlkZW50aXR5XG4gICAqL1xuICBwcml2YXRlIHJlYWRJZGVudGl0eVBvbGljaWVzKHBvbGljaWVzOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwb2xpY2llcyA9PT0gdW5kZWZpbmVkIHx8ICFBcnJheS5pc0FycmF5KHBvbGljaWVzKSkgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IGFwcGxpZXNUb1ByaW5jaXBhbCA9ICdBV1M6JHsnICsgbG9naWNhbElkICsgJ30nO1xuXG4gICAgcmV0dXJuIGZsYXRNYXAocG9saWNpZXMsIChwb2xpY3k6IGFueSkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIFBvbGljeSBpdHNlbGYgaXMgbm90IGFuIGludHJpbnNpYywgbGlrZSBhbiBGbjo6SWZcbiAgICAgIGNvbnN0IHVucGFyc2VkU3RhdGVtZW50ID0gcG9saWN5LlBvbGljeURvY3VtZW50Py5TdGF0ZW1lbnRcbiAgICAgICAgPyBwb2xpY3kuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50XG4gICAgICAgIDogcG9saWN5O1xuICAgICAgcmV0dXJuIGRlZmF1bHRQcmluY2lwYWwoYXBwbGllc1RvUHJpbmNpcGFsLCBwYXJzZVN0YXRlbWVudHMocmVuZGVySW50cmluc2ljcyh1bnBhcnNlZFN0YXRlbWVudCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbiBJQU06OlBvbGljeSByZXNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShwcm9wZXJ0aWVzOiBhbnkpOiBTdGF0ZW1lbnRbXSB7XG4gICAgaWYgKHByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIHByb3BlcnRpZXMgPSByZW5kZXJJbnRyaW5zaWNzKHByb3BlcnRpZXMpO1xuXG4gICAgY29uc3QgcHJpbmNpcGFscyA9IChwcm9wZXJ0aWVzLkdyb3VwcyB8fCBbXSkuY29uY2F0KHByb3BlcnRpZXMuVXNlcnMgfHwgW10pLmNvbmNhdChwcm9wZXJ0aWVzLlJvbGVzIHx8IFtdKTtcbiAgICByZXR1cm4gZmxhdE1hcChwcmluY2lwYWxzLCAocHJpbmNpcGFsOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHJlZiA9ICdBV1M6JyArIHByaW5jaXBhbDtcbiAgICAgIHJldHVybiBkZWZhdWx0UHJpbmNpcGFsKHJlZiwgcGFyc2VTdGF0ZW1lbnRzKHByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50KSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRSZXNvdXJjZVN0YXRlbWVudHMocG9saWN5OiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwb2xpY3kgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IGFwcGxpZXNUb1Jlc291cmNlID0gJyR7JyArIGxvZ2ljYWxJZCArICcuQXJufSc7XG4gICAgcmV0dXJuIGRlZmF1bHRSZXNvdXJjZShhcHBsaWVzVG9SZXNvdXJjZSwgcGFyc2VTdGF0ZW1lbnRzKHJlbmRlckludHJpbnNpY3MocG9saWN5LlN0YXRlbWVudCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbiBBV1M6Oio6OntCdWNrZXQsVG9waWMsUXVldWV9cG9saWN5XG4gICAqL1xuICBwcml2YXRlIHJlYWRSZXNvdXJjZVBvbGljeVJlc291cmNlKHByb3BlcnRpZXM6IGFueSk6IFN0YXRlbWVudFtdIHtcbiAgICBpZiAocHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBbXTsgfVxuXG4gICAgcHJvcGVydGllcyA9IHJlbmRlckludHJpbnNpY3MocHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBwb2xpY3lLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykuZmlsdGVyKGtleSA9PiBrZXkuaW5kZXhPZignUG9saWN5JykgPiAtMSk7XG5cbiAgICAvLyBGaW5kIHRoZSBrZXkgdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZShzKSB0aGlzIHBvbGljeSBhcHBsaWVzIHRvXG4gICAgY29uc3QgcmVzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykuZmlsdGVyKGtleSA9PiAhcG9saWN5S2V5cy5pbmNsdWRlcyhrZXkpICYmICFrZXkuZW5kc1dpdGgoJ05hbWUnKSk7XG4gICAgbGV0IHJlc291cmNlcyA9IHJlc291cmNlS2V5cy5sZW5ndGggPT09IDEgPyBwcm9wZXJ0aWVzW3Jlc291cmNlS2V5c1swXV0gOiBbJz8/PyddO1xuXG4gICAgLy8gRm9yIHNvbWUgcmVzb3VyY2VzLCB0aGlzIGlzIGEgc2luZ2xldG9uIHN0cmluZywgZm9yIHNvbWUgaXQncyBhbiBhcnJheVxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZXNvdXJjZXMpKSB7XG4gICAgICByZXNvdXJjZXMgPSBbcmVzb3VyY2VzXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdE1hcChyZXNvdXJjZXMsIChyZXNvdXJjZTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gZGVmYXVsdFJlc291cmNlKHJlc291cmNlLCBwYXJzZVN0YXRlbWVudHMocHJvcGVydGllc1twb2xpY3lLZXlzWzBdXS5TdGF0ZW1lbnQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZE1hbmFnZWRQb2xpY2llcyhwb2xpY3lBcm5zOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogTWFuYWdlZFBvbGljeUF0dGFjaG1lbnRbXSB7XG4gICAgaWYgKCFwb2xpY3lBcm5zKSB7IHJldHVybiBbXTsgfVxuXG4gICAgY29uc3QgcmVwID0gJyR7JyArIGxvZ2ljYWxJZCArICd9JztcbiAgICByZXR1cm4gTWFuYWdlZFBvbGljeUF0dGFjaG1lbnQucGFyc2VNYW5hZ2VkUG9saWNpZXMocmVwLCByZW5kZXJJbnRyaW5zaWNzKHBvbGljeUFybnMpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZExhbWJkYVN0YXRlbWVudHMocHJvcGVydGllcz86IFByb3BlcnR5TWFwKTogU3RhdGVtZW50W10ge1xuICAgIGlmICghcHJvcGVydGllcykgeyByZXR1cm4gW107IH1cblxuICAgIHJldHVybiBbcGFyc2VMYW1iZGFQZXJtaXNzaW9uKHJlbmRlckludHJpbnNpY3MocHJvcGVydGllcykpXTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBhbiB1bmRlZmluZWQgb3Igd2lsZGNhcmRlZCBwcmluY2lwYWwgb24gdGhlc2Ugc3RhdGVtZW50c1xuICovXG5mdW5jdGlvbiBkZWZhdWx0UHJpbmNpcGFsKHByaW5jaXBhbDogc3RyaW5nLCBzdGF0ZW1lbnRzOiBTdGF0ZW1lbnRbXSkge1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnByaW5jaXBhbHMucmVwbGFjZUVtcHR5KHByaW5jaXBhbCkpO1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnByaW5jaXBhbHMucmVwbGFjZVN0YXIocHJpbmNpcGFsKSk7XG4gIHJldHVybiBzdGF0ZW1lbnRzO1xufVxuXG4vKipcbiAqIFNldCBhbiB1bmRlZmluZWQgb3Igd2lsZGNhcmRlZCByZXNvdXJjZSBvbiB0aGVzZSBzdGF0ZW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRSZXNvdXJjZShyZXNvdXJjZTogc3RyaW5nLCBzdGF0ZW1lbnRzOiBTdGF0ZW1lbnRbXSkge1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnJlc291cmNlcy5yZXBsYWNlRW1wdHkocmVzb3VyY2UpKTtcbiAgc3RhdGVtZW50cy5mb3JFYWNoKHMgPT4gcy5yZXNvdXJjZXMucmVwbGFjZVN0YXIocmVzb3VyY2UpKTtcbiAgcmV0dXJuIHN0YXRlbWVudHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWFtQ2hhbmdlc0pzb24ge1xuICBzdGF0ZW1lbnRBZGRpdGlvbnM/OiBBcnJheTxNYXliZVBhcnNlZDxTdGF0ZW1lbnRKc29uPj47XG4gIHN0YXRlbWVudFJlbW92YWxzPzogQXJyYXk8TWF5YmVQYXJzZWQ8U3RhdGVtZW50SnNvbj4+O1xuICBtYW5hZ2VkUG9saWN5QWRkaXRpb25zPzogQXJyYXk8TWF5YmVQYXJzZWQ8TWFuYWdlZFBvbGljeUpzb24+PjtcbiAgbWFuYWdlZFBvbGljeVJlbW92YWxzPzogQXJyYXk8TWF5YmVQYXJzZWQ8TWFuYWdlZFBvbGljeUpzb24+Pjtcbn1cbiJdfQ== /***/ }), @@ -12254,7 +11606,489 @@ function flatMap(xs, f) { return ret; } exports.flatMap = flatMap; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQU8sS0FBb0I7SUFDdkQsT0FBTyxDQUFDLENBQUksRUFBRSxDQUFJLEVBQUUsRUFBRTtRQUNwQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFBRSxPQUFPLENBQUMsQ0FBQzthQUFFO1NBQzNCO1FBRUQsd0VBQXdFO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ25DLENBQUMsQ0FBQztBQUNKLENBQUM7QUFkRCx3Q0FjQztBQUVELFNBQVMsT0FBTyxDQUFJLENBQUksRUFBRSxDQUFJO0lBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FBRTtJQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFBRSxPQUFPLENBQUMsQ0FBQztLQUFFO0lBQ3hCLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBSSxFQUFPO0lBQ3BDLE9BQU8sRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3hDLENBQUM7QUFGRCxrQ0FFQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLENBQU07SUFDeEMsSUFBSSxPQUFPLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQUU7SUFDdkQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0FBRTtJQUM1RCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUN6QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FDN0M7UUFDRCxPQUFPLENBQUMsQ0FBQztLQUNWO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBWEQsa0RBV0M7QUFFRCxTQUFnQixPQUFPLENBQU8sRUFBTyxFQUFFLENBQWdCO0lBQ3JELE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFLLENBQUM7SUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBTkQsMEJBTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR1cm4gYSAobXVsdGkta2V5KSBleHRyYWN0aW9uIGZ1bmN0aW9uIGludG8gYSBjb21wYXJhdG9yIGZvciB1c2UgaW4gQXJyYXkuc29ydCgpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ29tcGFyYXRvcjxULCBVPihrZXlGbjogKHg6IFQpID0+IFVbXSkge1xuICByZXR1cm4gKGE6IFQsIGI6IFQpID0+IHtcbiAgICBjb25zdCBrZXlBID0ga2V5Rm4oYSk7XG4gICAgY29uc3Qga2V5QiA9IGtleUZuKGIpO1xuICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGtleUEubGVuZ3RoLCBrZXlCLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gY29tcGFyZShrZXlBW2ldLCBrZXlCW2ldKTtcbiAgICAgIGlmIChjICE9PSAwKSB7IHJldHVybiBjOyB9XG4gICAgfVxuXG4gICAgLy8gQXJyYXlzIGFyZSB0aGUgc2FtZSB1cCB0byB0aGUgbWluIGxlbmd0aCAtLSBzaG9ydGVyIGFycmF5IHNvcnRzIGZpcnN0XG4gICAgcmV0dXJuIGtleUEubGVuZ3RoIC0ga2V5Qi5sZW5ndGg7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmU8VD4oYTogVCwgYjogVCkge1xuICBpZiAoYSA8IGIpIHsgcmV0dXJuIC0xOyB9XG4gIGlmIChiIDwgYSkgeyByZXR1cm4gMTsgfVxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyb3BJZkVtcHR5PFQ+KHhzOiBUW10pOiBUW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4geHMubGVuZ3RoID4gMCA/IHhzIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFJlbW92ZVVuZGVmaW5lZCh4OiBhbnkpOiBhbnkge1xuICBpZiAodHlwZW9mIHggPT09IHVuZGVmaW5lZCB8fCB4ID09PSBudWxsKSB7IHJldHVybiB4OyB9XG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7IHJldHVybiB4Lm1hcChkZWVwUmVtb3ZlVW5kZWZpbmVkKTsgfVxuICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoeCkpIHtcbiAgICAgIHhba2V5XSA9IGRlZXBSZW1vdmVVbmRlZmluZWQodmFsdWUpO1xuICAgICAgaWYgKHhba2V5XSA9PT0gdW5kZWZpbmVkKSB7IGRlbGV0ZSB4W2tleV07IH1cbiAgICB9XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0TWFwPFQsIFU+KHhzOiBUW10sIGY6ICh4OiBUKSA9PiBVW10pOiBVW10ge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8VT4oKTtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgcmV0LnB1c2goLi4uZih4KSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn0iXX0= +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQU8sS0FBb0I7SUFDdkQsT0FBTyxDQUFDLENBQUksRUFBRSxDQUFJLEVBQUUsRUFBRTtRQUNwQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFBRSxPQUFPLENBQUMsQ0FBQzthQUFFO1NBQzNCO1FBRUQsd0VBQXdFO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ25DLENBQUMsQ0FBQztBQUNKLENBQUM7QUFkRCx3Q0FjQztBQUVELFNBQVMsT0FBTyxDQUFJLENBQUksRUFBRSxDQUFJO0lBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FBRTtJQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFBRSxPQUFPLENBQUMsQ0FBQztLQUFFO0lBQ3hCLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBSSxFQUFPO0lBQ3BDLE9BQU8sRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3hDLENBQUM7QUFGRCxrQ0FFQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLENBQU07SUFDeEMsSUFBSSxPQUFPLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQUU7SUFDdkQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0FBRTtJQUM1RCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUN6QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FDN0M7UUFDRCxPQUFPLENBQUMsQ0FBQztLQUNWO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBWEQsa0RBV0M7QUFFRCxTQUFnQixPQUFPLENBQU8sRUFBTyxFQUFFLENBQWdCO0lBQ3JELE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFLLENBQUM7SUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBTkQsMEJBTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR1cm4gYSAobXVsdGkta2V5KSBleHRyYWN0aW9uIGZ1bmN0aW9uIGludG8gYSBjb21wYXJhdG9yIGZvciB1c2UgaW4gQXJyYXkuc29ydCgpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ29tcGFyYXRvcjxULCBVPihrZXlGbjogKHg6IFQpID0+IFVbXSkge1xuICByZXR1cm4gKGE6IFQsIGI6IFQpID0+IHtcbiAgICBjb25zdCBrZXlBID0ga2V5Rm4oYSk7XG4gICAgY29uc3Qga2V5QiA9IGtleUZuKGIpO1xuICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGtleUEubGVuZ3RoLCBrZXlCLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gY29tcGFyZShrZXlBW2ldLCBrZXlCW2ldKTtcbiAgICAgIGlmIChjICE9PSAwKSB7IHJldHVybiBjOyB9XG4gICAgfVxuXG4gICAgLy8gQXJyYXlzIGFyZSB0aGUgc2FtZSB1cCB0byB0aGUgbWluIGxlbmd0aCAtLSBzaG9ydGVyIGFycmF5IHNvcnRzIGZpcnN0XG4gICAgcmV0dXJuIGtleUEubGVuZ3RoIC0ga2V5Qi5sZW5ndGg7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmU8VD4oYTogVCwgYjogVCkge1xuICBpZiAoYSA8IGIpIHsgcmV0dXJuIC0xOyB9XG4gIGlmIChiIDwgYSkgeyByZXR1cm4gMTsgfVxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyb3BJZkVtcHR5PFQ+KHhzOiBUW10pOiBUW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4geHMubGVuZ3RoID4gMCA/IHhzIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFJlbW92ZVVuZGVmaW5lZCh4OiBhbnkpOiBhbnkge1xuICBpZiAodHlwZW9mIHggPT09IHVuZGVmaW5lZCB8fCB4ID09PSBudWxsKSB7IHJldHVybiB4OyB9XG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7IHJldHVybiB4Lm1hcChkZWVwUmVtb3ZlVW5kZWZpbmVkKTsgfVxuICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoeCkpIHtcbiAgICAgIHhba2V5XSA9IGRlZXBSZW1vdmVVbmRlZmluZWQodmFsdWUpO1xuICAgICAgaWYgKHhba2V5XSA9PT0gdW5kZWZpbmVkKSB7IGRlbGV0ZSB4W2tleV07IH1cbiAgICB9XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0TWFwPFQsIFU+KHhzOiBUW10sIGY6ICh4OiBUKSA9PiBVW10pOiBVW10ge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8VT4oKTtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgcmV0LnB1c2goLi4uZih4KSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ== + +/***/ }), + +/***/ 504: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +__exportStar(__nccwpck_require__(97977), exports); +__exportStar(__nccwpck_require__(48605), exports); +__exportStar(__nccwpck_require__(9973), exports); +__exportStar(__nccwpck_require__(50256), exports); +__exportStar(__nccwpck_require__(35024), exports); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFpQztBQUNqQyxtREFBaUM7QUFDakMsd0RBQXNDO0FBQ3RDLGtEQUFnQztBQUNoQywrQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3R5cGVzL2RhdGFiYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvcmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy9hdWdtZW50YXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvbWV0cmljcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL2RpZmYnO1xuIl19 + +/***/ }), + +/***/ 9973: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVnbWVudGF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9hdWdtZW50YXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIFJlbGF0aW9uc2hpcCB9IGZyb20gJ0BjZGtsYWJzL3Rza2InO1xuaW1wb3J0IHsgUmVzb3VyY2UgfSBmcm9tICcuL3Jlc291cmNlJztcblxuLyoqXG4gKiBBdWdtZW50YXRpb25zIGZvciBhIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGVcbiAqXG4gKiBBdWdtZW50YXRpb25zIGFyZSBhIGRlcHJlY2F0ZWQgbWVjaGFuaXNtIGZvciBhdXRvbWF0aWNhbGx5IGdlbmVyYXRpbmcgbWV0cmljc1xuICogZnVuY3Rpb25zIGZvciBjZXJ0YWluIHJlc291cmNlcywgdXRpbGl6aW5nIFR5cGVTY3JpcHQgbWl4aW5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlQXVnbWVudGF0aW9uIGV4dGVuZHMgRW50aXR5IHtcbiAgLyoqXG4gICAqIE1ldHJpYyBhdWdtZW50YXRpb25zIGZvciB0aGlzIHJlc291cmNlIHR5cGVcbiAgICovXG4gIG1ldHJpY3M/OiBSZXNvdXJjZU1ldHJpY0F1Z21lbnRhdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIHRvIGJlIFwiYXVnbWVudGVkXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGtlYmFiIGNhc2VkIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIG5hbWUgKyAnLWJhc2UnXG4gICAqL1xuICBiYXNlQ2xhc3NGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgXCJhdWdtZW50ZWRcIi5cbiAgICpcbiAgICogQGRlZmF1bHQgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgbmFtZSArICdCYXNlJ1xuICAgKi9cbiAgYmFzZUNsYXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbnRlcmZhY2UgdG8gYmUgXCJhdWdtZW50ZWRcIi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzYW1lIGFzIGBgY2xhc3NGaWxlYGAuXG4gICAqL1xuICBpbnRlcmZhY2VGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRvIGJlIFwiYXVnbWVudGVkXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdJJyArIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIG5hbWVcbiAgICovXG4gIGludGVyZmFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgSXNBdWdtZW50ZWRSZXNvdXJjZSA9IFJlbGF0aW9uc2hpcDxSZXNvdXJjZSwgUmVzb3VyY2VBdWdtZW50YXRpb24+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlTWV0cmljQXVnbWVudGF0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIG9mIG1ldHJpY3MgZm9yIHRoaXMgc2VydmljZVxuICAgKi9cbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXNvdXJjZSBjbGFzcyB0aGF0IHByb3ZpZGUgdmFsdWVzIGZvciB0aGUgZGltZW5zaW9uc1xuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgYHsgUXVldWVOYW1lOiAncXVldWVOYW1lJyB9YCBzYXlzIHRoYXQgdGhlIG1ldHJpYyBoYXMgYSBgUXVldWVOYW1lYFxuICAgKiBkaW1lbnNpb24sIGZvciB3aGljaCB0aGUgdmFsdWUgY2FuIGJlIG9idGFpbmVkIGJ5IHJlYWRpbmcgYHRoaXMucXVldWVOYW1lYC5cbiAgICovXG4gIGRpbWVuc2lvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRyaWNzIGZvciB0aGlzIHJlc291cmNlXG4gICAqL1xuICBtZXRyaWNzOiBSZXNvdXJjZU1ldHJpY1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlTWV0cmljIHtcbiAgLyoqXG4gICAqIFVwcGVyY2FzZS1maXJzdCBtZXRyaWMgbmFtZVxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEb2N1bWVudGF0aW9uIGxpbmVcbiAgICovXG4gIGRvY3VtZW50YXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGlzIGFuIGV2ZW4gY291bnQgKDEgZ2V0cyBlbWl0dGVkIGV2ZXJ5IHRpbWUgc29tZXRoaW5nIG9jY3VycylcbiAgICpcbiAgICogQGRlZmF1bHQgTWV0cmljVHlwZS5BdHRyaWJcbiAgICovXG4gIHR5cGU/OiBNZXRyaWNUeXBlO1xufVxuXG5leHBvcnQgdHlwZSBNZXRyaWNUeXBlID1cbiAgLyoqXG4gICAqIFRoaXMgbWV0cmljIGlzIGVtaXR0ZWQgZm9yIGV2ZW50cywgbWVhc3VyaW5nIGEgYXR0cmlidXRlIG9mIHRoZSBldmVudC5cbiAgICpcbiAgICogVHlwaWNhbCBleGFtcGxlcyBvZiB0aGlzIHdvdWxkIGJlIGR1cmF0aW9uLCBvciByZXF1ZXN0IHNpemUsIG9yIHNpbWlsYXIuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGFnZ3JlZ2F0ZSBmb3IgdGhpcyB0eXBlIG9mIGV2ZW50IGlzIFwiQXZnXCIuXG4gICAqL1xuICB8ICdhdHRyaWInXG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0cmljIGlzIGVtaXR0ZWQgZm9yIGV2ZW50cywgYW5kIHRoZSB2YWx1ZSBpcyBhbHdheXMgYDFgLlxuICAgKlxuICAgKiBPbmx5IFwiU3VtXCIgaXMgYSBtZWFuaW5nZnVsIGFnZ3JlZ2F0ZSBvZiB0aGlzIHR5cGUgb2YgbWV0cmljOyBhbGwgb3RoZXJcbiAgICogYWdncmVnYXRpb25zIHdpbGwgb25seSBldmVyIHByb2R1Y2UgdGhlIHZhbHVlIGAxYC5cbiAgICovXG4gIHwgJ2NvdW50J1xuXG4gIC8qKlxuICAgKiBUaGlzIG1ldHJpYyBpcyBlbWl0dGVkIHBlcmlvZGljYWxseSwgcmVwcmVzZW50aW5nIGEgc3lzdGVtIHByb3BlcnR5LlxuICAgKlxuICAgKiBUaGUgbWV0cmljIG1lYXN1cmVzIHNvbWUgZ2xvYmFsIGV2ZXItY2hhbmdpbmcgcHJvcGVydHksIGFuZCBkb2VzIG5vdFxuICAgKiBtZWFzdXJlIGV2ZW50cy4gVGhlIG1vc3QgdXNlZnVsIGFnZ3JlZ2F0ZSBvZiB0aGlzIHR5cGUgb2YgbWV0cmljIGlzIFwiTWF4XCIuXG4gICAqL1xuICB8ICdnYXVnZSc7XG4iXX0= + +/***/ }), + +/***/ 97977: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RichSpecDatabase = exports.loadDatabase = exports.emptyDatabase = void 0; +const fs_1 = __nccwpck_require__(57147); +const zlib_1 = __nccwpck_require__(59796); +const tskb_1 = __nccwpck_require__(63194); +function emptyDatabase() { + return new tskb_1.Database({ + resource: (0, tskb_1.entityCollection)().index({ + cloudFormationType: (0, tskb_1.fieldIndex)('cloudFormationType', tskb_1.stringCmp), + }), + region: (0, tskb_1.entityCollection)().index({ + name: (0, tskb_1.fieldIndex)('name', tskb_1.stringCmp), + }), + service: (0, tskb_1.entityCollection)().index({ + name: (0, tskb_1.fieldIndex)('name', tskb_1.stringCmp), + cloudFormationNamespace: (0, tskb_1.fieldIndex)('cloudFormationNamespace', tskb_1.stringCmp), + }), + typeDefinition: (0, tskb_1.entityCollection)(), + augmentations: (0, tskb_1.entityCollection)(), + metric: (0, tskb_1.entityCollection)().index({ + name: (0, tskb_1.fieldIndex)('name', tskb_1.stringCmp), + namespace: (0, tskb_1.fieldIndex)('namespace', tskb_1.stringCmp), + dedupKey: (0, tskb_1.fieldIndex)('dedupKey', tskb_1.stringCmp), + }), + dimensionSet: (0, tskb_1.entityCollection)().index({ + dedupKey: (0, tskb_1.fieldIndex)('dedupKey', tskb_1.stringCmp), + }), + }, (r) => ({ + hasResource: r.relationship('service', 'resource'), + regionHasResource: r.relationship('region', 'resource'), + regionHasService: r.relationship('region', 'service'), + usesType: r.relationship('resource', 'typeDefinition'), + isAugmented: r.relationship('resource', 'augmentations'), + usesDimensionSet: r.relationship('metric', 'dimensionSet'), + resourceHasMetric: r.relationship('resource', 'metric'), + serviceHasMetric: r.relationship('service', 'metric'), + resourceHasDimensionSet: r.relationship('resource', 'dimensionSet'), + serviceHasDimensionSet: r.relationship('service', 'dimensionSet'), + })); +} +exports.emptyDatabase = emptyDatabase; +async function loadDatabase(pathToDb) { + const db = emptyDatabase(); + const contents = await fs_1.promises.readFile(pathToDb); + const json = pathToDb.endsWith('.gz') ? (0, zlib_1.gunzipSync)(contents).toString('utf-8') : contents.toString('utf-8'); + db.load(JSON.parse(json)); + return db; +} +exports.loadDatabase = loadDatabase; +/** + * Helpers for working with a SpecDatabase + */ +class RichSpecDatabase { + constructor(db) { + this.db = db; + } + /** + * Find all resources of a given type + */ + resourceByType(cfnType, operation = 'resourceByType') { + const res = this.db.lookup('resource', 'cloudFormationType', 'equals', cfnType); + if (res.length === 0) { + throw new Error(`${operation}: no such resource: ${cfnType}`); + } + return res[0]; + } + /** + * All type definitions used by a certain resource + */ + resourceTypeDefs(cfnType) { + const resource = this.db.lookup('resource', 'cloudFormationType', 'equals', cfnType).only(); + return this.db.follow('usesType', resource).map((x) => x.entity); + } + /** + * Find a type definition from a given property type + */ + tryFindDef(type) { + return type.type === 'ref' ? this.db.get('typeDefinition', type.reference.$ref) : undefined; + } +} +exports.RichSpecDatabase = RichSpecDatabase; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQW9DO0FBQ3BDLCtCQUFrQztBQUNsQyx3Q0FBa0Y7QUF1QmxGLFNBQWdCLGFBQWE7SUFDM0IsT0FBTyxJQUFJLGVBQVEsQ0FDakI7UUFDRSxRQUFRLEVBQUUsSUFBQSx1QkFBZ0IsR0FBWSxDQUFDLEtBQUssQ0FBQztZQUMzQyxrQkFBa0IsRUFBRSxJQUFBLGlCQUFVLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQVMsQ0FBQztTQUNoRSxDQUFDO1FBQ0YsTUFBTSxFQUFFLElBQUEsdUJBQWdCLEdBQVUsQ0FBQyxLQUFLLENBQUM7WUFDdkMsSUFBSSxFQUFFLElBQUEsaUJBQVUsRUFBQyxNQUFNLEVBQUUsZ0JBQVMsQ0FBQztTQUNwQyxDQUFDO1FBQ0YsT0FBTyxFQUFFLElBQUEsdUJBQWdCLEdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDekMsSUFBSSxFQUFFLElBQUEsaUJBQVUsRUFBQyxNQUFNLEVBQUUsZ0JBQVMsQ0FBQztZQUNuQyx1QkFBdUIsRUFBRSxJQUFBLGlCQUFVLEVBQUMseUJBQXlCLEVBQUUsZ0JBQVMsQ0FBQztTQUMxRSxDQUFDO1FBQ0YsY0FBYyxFQUFFLElBQUEsdUJBQWdCLEdBQWtCO1FBQ2xELGFBQWEsRUFBRSxJQUFBLHVCQUFnQixHQUF3QjtRQUN2RCxNQUFNLEVBQUUsSUFBQSx1QkFBZ0IsR0FBVSxDQUFDLEtBQUssQ0FBQztZQUN2QyxJQUFJLEVBQUUsSUFBQSxpQkFBVSxFQUFDLE1BQU0sRUFBRSxnQkFBUyxDQUFDO1lBQ25DLFNBQVMsRUFBRSxJQUFBLGlCQUFVLEVBQUMsV0FBVyxFQUFFLGdCQUFTLENBQUM7WUFDN0MsUUFBUSxFQUFFLElBQUEsaUJBQVUsRUFBQyxVQUFVLEVBQUUsZ0JBQVMsQ0FBQztTQUM1QyxDQUFDO1FBQ0YsWUFBWSxFQUFFLElBQUEsdUJBQWdCLEdBQWdCLENBQUMsS0FBSyxDQUFDO1lBQ25ELFFBQVEsRUFBRSxJQUFBLGlCQUFVLEVBQUMsVUFBVSxFQUFFLGdCQUFTLENBQUM7U0FDNUMsQ0FBQztLQUNILEVBQ0QsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDTixXQUFXLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBYyxTQUFTLEVBQUUsVUFBVSxDQUFDO1FBQy9ELGlCQUFpQixFQUFFLENBQUMsQ0FBQyxZQUFZLENBQW9CLFFBQVEsRUFBRSxVQUFVLENBQUM7UUFDMUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBbUIsUUFBUSxFQUFFLFNBQVMsQ0FBQztRQUN2RSxRQUFRLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBVyxVQUFVLEVBQUUsZ0JBQWdCLENBQUM7UUFDaEUsV0FBVyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQXNCLFVBQVUsRUFBRSxlQUFlLENBQUM7UUFDN0UsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBbUIsUUFBUSxFQUFFLGNBQWMsQ0FBQztRQUM1RSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFvQixVQUFVLEVBQUUsUUFBUSxDQUFDO1FBQzFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxZQUFZLENBQW1CLFNBQVMsRUFBRSxRQUFRLENBQUM7UUFDdkUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBMEIsVUFBVSxFQUFFLGNBQWMsQ0FBQztRQUM1RixzQkFBc0IsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUF5QixTQUFTLEVBQUUsY0FBYyxDQUFDO0tBQzFGLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQXJDRCxzQ0FxQ0M7QUFFTSxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCO0lBQ2pELE1BQU0sRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQzNCLE1BQU0sUUFBUSxHQUFHLE1BQU0sYUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGlCQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQU5ELG9DQU1DO0FBSUQ7O0dBRUc7QUFDSCxNQUFhLGdCQUFnQjtJQUMzQixZQUE2QixFQUFnQjtRQUFoQixPQUFFLEdBQUYsRUFBRSxDQUFjO0lBQUcsQ0FBQztJQUVqRDs7T0FFRztJQUNJLGNBQWMsQ0FBQyxPQUFlLEVBQUUsU0FBUyxHQUFHLGdCQUFnQjtRQUNqRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hGLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFNBQVMsdUJBQXVCLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDL0Q7UUFDRCxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBQyxPQUFlO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUYsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVSxDQUFDLElBQWtCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RixDQUFDO0NBQ0Y7QUE1QkQsNENBNEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBndW56aXBTeW5jIH0gZnJvbSAnemxpYic7XG5pbXBvcnQgeyBEYXRhYmFzZSwgZW50aXR5Q29sbGVjdGlvbiwgZmllbGRJbmRleCwgc3RyaW5nQ21wIH0gZnJvbSAnQGNka2xhYnMvdHNrYic7XG5pbXBvcnQgeyBJc0F1Z21lbnRlZFJlc291cmNlLCBSZXNvdXJjZUF1Z21lbnRhdGlvbiB9IGZyb20gJy4vYXVnbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBEaW1lbnNpb25TZXQsXG4gIE1ldHJpYyxcbiAgUmVzb3VyY2VIYXNEaW1lbnNpb25TZXQsXG4gIFNlcnZpY2VIYXNEaW1lbnNpb25TZXQsXG4gIFVzZXNEaW1lbnNpb25TZXQsXG4gIFJlc291cmNlSGFzTWV0cmljLFxuICBTZXJ2aWNlSGFzTWV0cmljLFxufSBmcm9tICcuL21ldHJpY3MnO1xuaW1wb3J0IHtcbiAgUmVzb3VyY2UsXG4gIFNlcnZpY2UsXG4gIFR5cGVEZWZpbml0aW9uLFxuICBQcm9wZXJ0eVR5cGUsXG4gIFJlZ2lvbixcbiAgSGFzUmVzb3VyY2UsXG4gIFJlZ2lvbkhhc1Jlc291cmNlLFxuICBSZWdpb25IYXNTZXJ2aWNlLFxuICBVc2VzVHlwZSxcbn0gZnJvbSAnLi9yZXNvdXJjZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbXB0eURhdGFiYXNlKCkge1xuICByZXR1cm4gbmV3IERhdGFiYXNlKFxuICAgIHtcbiAgICAgIHJlc291cmNlOiBlbnRpdHlDb2xsZWN0aW9uPFJlc291cmNlPigpLmluZGV4KHtcbiAgICAgICAgY2xvdWRGb3JtYXRpb25UeXBlOiBmaWVsZEluZGV4KCdjbG91ZEZvcm1hdGlvblR5cGUnLCBzdHJpbmdDbXApLFxuICAgICAgfSksXG4gICAgICByZWdpb246IGVudGl0eUNvbGxlY3Rpb248UmVnaW9uPigpLmluZGV4KHtcbiAgICAgICAgbmFtZTogZmllbGRJbmRleCgnbmFtZScsIHN0cmluZ0NtcCksXG4gICAgICB9KSxcbiAgICAgIHNlcnZpY2U6IGVudGl0eUNvbGxlY3Rpb248U2VydmljZT4oKS5pbmRleCh7XG4gICAgICAgIG5hbWU6IGZpZWxkSW5kZXgoJ25hbWUnLCBzdHJpbmdDbXApLFxuICAgICAgICBjbG91ZEZvcm1hdGlvbk5hbWVzcGFjZTogZmllbGRJbmRleCgnY2xvdWRGb3JtYXRpb25OYW1lc3BhY2UnLCBzdHJpbmdDbXApLFxuICAgICAgfSksXG4gICAgICB0eXBlRGVmaW5pdGlvbjogZW50aXR5Q29sbGVjdGlvbjxUeXBlRGVmaW5pdGlvbj4oKSxcbiAgICAgIGF1Z21lbnRhdGlvbnM6IGVudGl0eUNvbGxlY3Rpb248UmVzb3VyY2VBdWdtZW50YXRpb24+KCksXG4gICAgICBtZXRyaWM6IGVudGl0eUNvbGxlY3Rpb248TWV0cmljPigpLmluZGV4KHtcbiAgICAgICAgbmFtZTogZmllbGRJbmRleCgnbmFtZScsIHN0cmluZ0NtcCksXG4gICAgICAgIG5hbWVzcGFjZTogZmllbGRJbmRleCgnbmFtZXNwYWNlJywgc3RyaW5nQ21wKSxcbiAgICAgICAgZGVkdXBLZXk6IGZpZWxkSW5kZXgoJ2RlZHVwS2V5Jywgc3RyaW5nQ21wKSxcbiAgICAgIH0pLFxuICAgICAgZGltZW5zaW9uU2V0OiBlbnRpdHlDb2xsZWN0aW9uPERpbWVuc2lvblNldD4oKS5pbmRleCh7XG4gICAgICAgIGRlZHVwS2V5OiBmaWVsZEluZGV4KCdkZWR1cEtleScsIHN0cmluZ0NtcCksXG4gICAgICB9KSxcbiAgICB9LFxuICAgIChyKSA9PiAoe1xuICAgICAgaGFzUmVzb3VyY2U6IHIucmVsYXRpb25zaGlwPEhhc1Jlc291cmNlPignc2VydmljZScsICdyZXNvdXJjZScpLFxuICAgICAgcmVnaW9uSGFzUmVzb3VyY2U6IHIucmVsYXRpb25zaGlwPFJlZ2lvbkhhc1Jlc291cmNlPigncmVnaW9uJywgJ3Jlc291cmNlJyksXG4gICAgICByZWdpb25IYXNTZXJ2aWNlOiByLnJlbGF0aW9uc2hpcDxSZWdpb25IYXNTZXJ2aWNlPigncmVnaW9uJywgJ3NlcnZpY2UnKSxcbiAgICAgIHVzZXNUeXBlOiByLnJlbGF0aW9uc2hpcDxVc2VzVHlwZT4oJ3Jlc291cmNlJywgJ3R5cGVEZWZpbml0aW9uJyksXG4gICAgICBpc0F1Z21lbnRlZDogci5yZWxhdGlvbnNoaXA8SXNBdWdtZW50ZWRSZXNvdXJjZT4oJ3Jlc291cmNlJywgJ2F1Z21lbnRhdGlvbnMnKSxcbiAgICAgIHVzZXNEaW1lbnNpb25TZXQ6IHIucmVsYXRpb25zaGlwPFVzZXNEaW1lbnNpb25TZXQ+KCdtZXRyaWMnLCAnZGltZW5zaW9uU2V0JyksXG4gICAgICByZXNvdXJjZUhhc01ldHJpYzogci5yZWxhdGlvbnNoaXA8UmVzb3VyY2VIYXNNZXRyaWM+KCdyZXNvdXJjZScsICdtZXRyaWMnKSxcbiAgICAgIHNlcnZpY2VIYXNNZXRyaWM6IHIucmVsYXRpb25zaGlwPFNlcnZpY2VIYXNNZXRyaWM+KCdzZXJ2aWNlJywgJ21ldHJpYycpLFxuICAgICAgcmVzb3VyY2VIYXNEaW1lbnNpb25TZXQ6IHIucmVsYXRpb25zaGlwPFJlc291cmNlSGFzRGltZW5zaW9uU2V0PigncmVzb3VyY2UnLCAnZGltZW5zaW9uU2V0JyksXG4gICAgICBzZXJ2aWNlSGFzRGltZW5zaW9uU2V0OiByLnJlbGF0aW9uc2hpcDxTZXJ2aWNlSGFzRGltZW5zaW9uU2V0Pignc2VydmljZScsICdkaW1lbnNpb25TZXQnKSxcbiAgICB9KSxcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWREYXRhYmFzZShwYXRoVG9EYjogc3RyaW5nKSB7XG4gIGNvbnN0IGRiID0gZW1wdHlEYXRhYmFzZSgpO1xuICBjb25zdCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGhUb0RiKTtcbiAgY29uc3QganNvbiA9IHBhdGhUb0RiLmVuZHNXaXRoKCcuZ3onKSA/IGd1bnppcFN5bmMoY29udGVudHMpLnRvU3RyaW5nKCd1dGYtOCcpIDogY29udGVudHMudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIGRiLmxvYWQoSlNPTi5wYXJzZShqc29uKSk7XG4gIHJldHVybiBkYjtcbn1cblxuZXhwb3J0IHR5cGUgU3BlY0RhdGFiYXNlID0gUmV0dXJuVHlwZTx0eXBlb2YgZW1wdHlEYXRhYmFzZT47XG5cbi8qKlxuICogSGVscGVycyBmb3Igd29ya2luZyB3aXRoIGEgU3BlY0RhdGFiYXNlXG4gKi9cbmV4cG9ydCBjbGFzcyBSaWNoU3BlY0RhdGFiYXNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkYjogU3BlY0RhdGFiYXNlKSB7fVxuXG4gIC8qKlxuICAgKiBGaW5kIGFsbCByZXNvdXJjZXMgb2YgYSBnaXZlbiB0eXBlXG4gICAqL1xuICBwdWJsaWMgcmVzb3VyY2VCeVR5cGUoY2ZuVHlwZTogc3RyaW5nLCBvcGVyYXRpb24gPSAncmVzb3VyY2VCeVR5cGUnKTogUmVzb3VyY2Uge1xuICAgIGNvbnN0IHJlcyA9IHRoaXMuZGIubG9va3VwKCdyZXNvdXJjZScsICdjbG91ZEZvcm1hdGlvblR5cGUnLCAnZXF1YWxzJywgY2ZuVHlwZSk7XG4gICAgaWYgKHJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvcGVyYXRpb259OiBubyBzdWNoIHJlc291cmNlOiAke2NmblR5cGV9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXNbMF07XG4gIH1cblxuICAvKipcbiAgICogQWxsIHR5cGUgZGVmaW5pdGlvbnMgdXNlZCBieSBhIGNlcnRhaW4gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyByZXNvdXJjZVR5cGVEZWZzKGNmblR5cGU6IHN0cmluZyk6IHJlYWRvbmx5IFR5cGVEZWZpbml0aW9uW10ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5kYi5sb29rdXAoJ3Jlc291cmNlJywgJ2Nsb3VkRm9ybWF0aW9uVHlwZScsICdlcXVhbHMnLCBjZm5UeXBlKS5vbmx5KCk7XG4gICAgcmV0dXJuIHRoaXMuZGIuZm9sbG93KCd1c2VzVHlwZScsIHJlc291cmNlKS5tYXAoKHgpID0+IHguZW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgdHlwZSBkZWZpbml0aW9uIGZyb20gYSBnaXZlbiBwcm9wZXJ0eSB0eXBlXG4gICAqL1xuICBwdWJsaWMgdHJ5RmluZERlZih0eXBlOiBQcm9wZXJ0eVR5cGUpOiBUeXBlRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHR5cGUudHlwZSA9PT0gJ3JlZicgPyB0aGlzLmRiLmdldCgndHlwZURlZmluaXRpb24nLCB0eXBlLnJlZmVyZW5jZS4kcmVmKSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19 + +/***/ }), + +/***/ 35024: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9kaWZmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdHRyaWJ1dGUsIFByb3BlcnR5LCBSZXNvdXJjZSwgU2VydmljZSwgVHlwZURlZmluaXRpb24gfSBmcm9tICcuL3Jlc291cmNlJztcblxuZXhwb3J0IGludGVyZmFjZSBTcGVjRGF0YWJhc2VEaWZmIHtcbiAgc2VydmljZXM6IE1hcERpZmY8U2VydmljZSwgVXBkYXRlZFNlcnZpY2U+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3REaWZmPEUsIEVEPiB7XG4gIHJlYWRvbmx5IGFkZGVkPzogRVtdO1xuICByZWFkb25seSByZW1vdmVkPzogRVtdO1xuICByZWFkb25seSB1cGRhdGVkPzogRURbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXBEaWZmPEUsIEVEPiB7XG4gIHJlYWRvbmx5IGFkZGVkPzogUmVjb3JkPHN0cmluZywgRT47XG4gIHJlYWRvbmx5IHJlbW92ZWQ/OiBSZWNvcmQ8c3RyaW5nLCBFPjtcbiAgcmVhZG9ubHkgdXBkYXRlZD86IFJlY29yZDxzdHJpbmcsIEVEPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVkU2VydmljZSB7XG4gIHJlYWRvbmx5IG5hbWU/OiBTY2FsYXJEaWZmPFNlcnZpY2VbJ25hbWUnXT47XG4gIHJlYWRvbmx5IHNob3J0TmFtZT86IFNjYWxhckRpZmY8U2VydmljZVsnc2hvcnROYW1lJ10+O1xuICByZWFkb25seSBjYXBpdGFsaXplZD86IFNjYWxhckRpZmY8U2VydmljZVsnY2FwaXRhbGl6ZWQnXT47XG4gIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uTmFtZXNwYWNlPzogU2NhbGFyRGlmZjxTZXJ2aWNlWydjbG91ZEZvcm1hdGlvbk5hbWVzcGFjZSddPjtcbiAgcmVhZG9ubHkgcmVzb3VyY2VEaWZmPzogTWFwRGlmZjxSZXNvdXJjZSwgVXBkYXRlZFJlc291cmNlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVkUmVzb3VyY2Uge1xuICByZWFkb25seSBuYW1lPzogU2NhbGFyRGlmZjxzdHJpbmc+O1xuICByZWFkb25seSBjbG91ZEZvcm1hdGlvblR5cGU/OiBTY2FsYXJEaWZmPHN0cmluZz47XG4gIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uVHJhbnNmb3JtPzogU2NhbGFyRGlmZjxzdHJpbmc+O1xuICByZWFkb25seSBkb2N1bWVudGF0aW9uPzogU2NhbGFyRGlmZjxzdHJpbmc+O1xuICByZWFkb25seSBwcm9wZXJ0aWVzPzogTWFwRGlmZjxQcm9wZXJ0eSwgVXBkYXRlZFByb3BlcnR5PjtcbiAgcmVhZG9ubHkgYXR0cmlidXRlcz86IE1hcERpZmY8QXR0cmlidXRlLCBVcGRhdGVkQXR0cmlidXRlPjtcbiAgcmVhZG9ubHkgaWRlbnRpZmllcj86IFNjYWxhckRpZmY8UmVzb3VyY2VbJ2lkZW50aWZpZXInXT47XG4gIHJlYWRvbmx5IGlzU3RhdGVmdWw/OiBTY2FsYXJEaWZmPGJvb2xlYW4+O1xuICByZWFkb25seSB0YWdJbmZvcm1hdGlvbj86IFNjYWxhckRpZmY8UmVzb3VyY2VbJ3RhZ0luZm9ybWF0aW9uJ10+O1xuICByZWFkb25seSBzY3J1dGluaXphYmxlPzogU2NhbGFyRGlmZjxSZXNvdXJjZVsnc2NydXRpbml6YWJsZSddPjtcbiAgcmVhZG9ubHkgdHlwZURlZmluaXRpb25EaWZmPzogTWFwRGlmZjxUeXBlRGVmaW5pdGlvbiwgVXBkYXRlZFR5cGVEZWZpbml0aW9uPjtcbiAgcmVhZG9ubHkgcHJpbWFyeUlkZW50aWZpZXI/OiBMaXN0RGlmZjxzdHJpbmcsIHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZWRQcm9wZXJ0eSB7XG4gIHJlYWRvbmx5IG9sZDogUHJvcGVydHk7XG4gIHJlYWRvbmx5IG5ldzogUHJvcGVydHk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlZEF0dHJpYnV0ZSB7XG4gIHJlYWRvbmx5IG9sZDogQXR0cmlidXRlO1xuICByZWFkb25seSBuZXc6IEF0dHJpYnV0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVkVHlwZURlZmluaXRpb24ge1xuICByZWFkb25seSBuYW1lPzogU2NhbGFyRGlmZjxzdHJpbmc+O1xuICByZWFkb25seSBkb2N1bWVudGF0aW9uPzogU2NhbGFyRGlmZjxzdHJpbmc+O1xuICByZWFkb25seSBwcm9wZXJ0aWVzPzogTWFwRGlmZjxQcm9wZXJ0eSwgVXBkYXRlZFByb3BlcnR5PjtcbiAgcmVhZG9ubHkgbXVzdFJlbmRlckZvckJ3Q29tcGF0PzogU2NhbGFyRGlmZjxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2FsYXJEaWZmPEE+IHtcbiAgcmVhZG9ubHkgb2xkPzogQTtcbiAgcmVhZG9ubHkgbmV3PzogQTtcbn1cbiJdfQ== + +/***/ }), + +/***/ 50256: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIFJlbGF0aW9uc2hpcCB9IGZyb20gJ0BjZGtsYWJzL3Rza2InO1xuaW1wb3J0IHsgUmVzb3VyY2UsIFNlcnZpY2UgfSBmcm9tICcuL3Jlc291cmNlJztcblxuLyoqXG4gKiBBIE1ldHJpYyBEaW1lbnNpb24gKG5vdCBhbiBlbnRpdHkpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9uIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGRpbWVuc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogQSBwb3RlbnRpYWwgdmFsdWUgZm9yIHRoaXMgZGltZW5zaW9uXG4gICAqL1xuICByZWFkb25seSB2YWx1ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNldCBvZiBNZXRyaWMgRGltZW5zaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9uU2V0IGV4dGVuZHMgRW50aXR5IHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIHZhbHVlIHVzZWQgdG8gZGVkdXBsaWNhdGUgdGhlIGVudGl0eVxuICAgKi9cbiAgZGVkdXBLZXk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkaW1lbnNpb25zIGluIHRoaXMgc2V0XG4gICAqL1xuICBkaW1lbnNpb25zOiBEaW1lbnNpb25bXTtcbn1cbmV4cG9ydCB0eXBlIFJlc291cmNlSGFzRGltZW5zaW9uU2V0ID0gUmVsYXRpb25zaGlwPFJlc291cmNlLCBEaW1lbnNpb25TZXQ+O1xuZXhwb3J0IHR5cGUgU2VydmljZUhhc0RpbWVuc2lvblNldCA9IFJlbGF0aW9uc2hpcDxTZXJ2aWNlLCBEaW1lbnNpb25TZXQ+O1xuXG4vKipcbiAqIEEgQ2xvdWRXYXRjaCBNZXRyaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWMgZXh0ZW5kcyBFbnRpdHkge1xuICAvKipcbiAgICogTWV0cmljIG5hbWVzcGFjZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBtZXRyaWNcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIERlZmF1bHQgKHN1Z2dlc3RlZCkgc3RhdGlzdGljIGZvciB0aGlzIG1ldHJpY1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGlzdGljOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSB2YWx1ZSB1c2VkIHRvIGRlZHVwbGljYXRlIHRoZSBlbnRpdHlcbiAgICovXG4gIHJlYWRvbmx5IGRlZHVwS2V5OiBzdHJpbmc7XG59XG5leHBvcnQgdHlwZSBVc2VzRGltZW5zaW9uU2V0ID0gUmVsYXRpb25zaGlwPE1ldHJpYywgRGltZW5zaW9uU2V0PjtcbmV4cG9ydCB0eXBlIFJlc291cmNlSGFzTWV0cmljID0gUmVsYXRpb25zaGlwPFJlc291cmNlLCBNZXRyaWM+O1xuZXhwb3J0IHR5cGUgU2VydmljZUhhc01ldHJpYyA9IFJlbGF0aW9uc2hpcDxTZXJ2aWNlLCBNZXRyaWM+O1xuIl19 + +/***/ }), + +/***/ 48605: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RichPropertyType = exports.PropertyScrutinyType = exports.ResourceScrutinyType = exports.isCollectionType = exports.Deprecation = exports.RichAttribute = exports.RichProperty = exports.RichTypedField = void 0; +const sorting_1 = __nccwpck_require__(85844); +class RichTypedField { + constructor(field) { + this.field = field; + if (field === undefined) { + throw new Error('Field is undefined'); + } + } + types() { + var _a; + return [...((_a = this.field.previousTypes) !== null && _a !== void 0 ? _a : []), this.field.type]; + } + /** + * Update the type of this property with a new type + * + * Only if it's not in the set of types already. + */ + updateType(type) { + const richType = new RichPropertyType(type); + // Only add this type if we don't already have it. We are only doing comparisons where 'integer' and 'number' + // are treated the same, for all other types we need strict equality. We used to use 'assignableTo' as a + // condition, but these types will be rendered in both co- and contravariant positions, and so we really can't + // do much better than full equality. + if (this.types().some((t) => richType.equals(t))) { + // Nothing to do, type is already in there. + return false; + } + // Special case: if the new type is `string` and the old type is `date-time`, we assume this is + // the same type but we dropped some formatting information. No need to make this a separate type. + if (type.type === 'string' && this.types().some((t) => t.type === 'date-time')) { + return false; + } + if (!this.field.previousTypes) { + this.field.previousTypes = []; + } + this.field.previousTypes.push(this.field.type); + this.field.type = type; + return true; + } +} +exports.RichTypedField = RichTypedField; +class RichProperty extends RichTypedField { + constructor(property) { + super(property); + } +} +exports.RichProperty = RichProperty; +class RichAttribute extends RichTypedField { + constructor(attr) { + super(attr); + } +} +exports.RichAttribute = RichAttribute; +var Deprecation; +(function (Deprecation) { + /** + * Not deprecated + */ + Deprecation["NONE"] = "NONE"; + /** + * Warn about use + */ + Deprecation["WARN"] = "WARN"; + /** + * Do not emit the value at all + * + * (Handle properties that were incorrectly added to the spec) + */ + Deprecation["IGNORE"] = "IGNORE"; +})(Deprecation = exports.Deprecation || (exports.Deprecation = {})); +function isCollectionType(x) { + return x.type === 'array' || x.type === 'map'; +} +exports.isCollectionType = isCollectionType; +/** + * Mark a resource as a resource that needs additional scrutiy when added, removed or changed + * + * Used to mark resources that represent security policies. + */ +var ResourceScrutinyType; +(function (ResourceScrutinyType) { + /** + * No additional scrutiny + */ + ResourceScrutinyType["None"] = "None"; + /** + * An externally attached policy document to a resource + * + * (Common for SQS, SNS, S3, ...) + */ + ResourceScrutinyType["ResourcePolicyResource"] = "ResourcePolicyResource"; + /** + * This is an IAM policy on an identity resource + * + * (Basically saying: this is AWS::IAM::Policy) + */ + ResourceScrutinyType["IdentityPolicyResource"] = "IdentityPolicyResource"; + /** + * This is a Lambda Permission policy + */ + ResourceScrutinyType["LambdaPermission"] = "LambdaPermission"; + /** + * An ingress rule object + */ + ResourceScrutinyType["IngressRuleResource"] = "IngressRuleResource"; + /** + * A set of egress rules + */ + ResourceScrutinyType["EgressRuleResource"] = "EgressRuleResource"; +})(ResourceScrutinyType = exports.ResourceScrutinyType || (exports.ResourceScrutinyType = {})); +/** + * Mark a property as a property that needs additional scrutiny when it changes + * + * Used to mark sensitive properties that have security-related implications. + */ +var PropertyScrutinyType; +(function (PropertyScrutinyType) { + /** + * No additional scrutiny + */ + PropertyScrutinyType["None"] = "None"; + /** + * This is an IAM policy directly on a resource + */ + PropertyScrutinyType["InlineResourcePolicy"] = "InlineResourcePolicy"; + /** + * Either an AssumeRolePolicyDocument or a dictionary of policy documents + */ + PropertyScrutinyType["InlineIdentityPolicies"] = "InlineIdentityPolicies"; + /** + * A list of managed policies (on an identity resource) + */ + PropertyScrutinyType["ManagedPolicies"] = "ManagedPolicies"; + /** + * A set of ingress rules (on a security group) + */ + PropertyScrutinyType["IngressRules"] = "IngressRules"; + /** + * A set of egress rules (on a security group) + */ + PropertyScrutinyType["EgressRules"] = "EgressRules"; +})(PropertyScrutinyType = exports.PropertyScrutinyType || (exports.PropertyScrutinyType = {})); +class RichPropertyType { + constructor(type) { + this.type = type; + } + equals(rhs) { + switch (this.type.type) { + case 'integer': + case 'boolean': + case 'date-time': + case 'json': + case 'null': + case 'number': + case 'string': + case 'tag': + return rhs.type === this.type.type; + case 'array': + case 'map': + return rhs.type === this.type.type && new RichPropertyType(this.type.element).equals(rhs.element); + case 'ref': + return rhs.type === 'ref' && this.type.reference.$ref === rhs.reference.$ref; + case 'union': + const lhsKey = this.sortKey(); + const rhsKey = new RichPropertyType(rhs).sortKey(); + return lhsKey.length === rhsKey.length && lhsKey.every((l, i) => l === rhsKey[i]); + } + } + /** + * Whether the current type is JavaScript-equal to the RHS type + * + * Same as normal equality, but consider `integer` and `number` the same types. + */ + javascriptEquals(rhs) { + switch (this.type.type) { + case 'number': + case 'integer': + // Widening + return rhs.type === 'integer' || rhs.type === 'number'; + case 'array': + case 'map': + return rhs.type === this.type.type && new RichPropertyType(this.type.element).javascriptEquals(rhs.element); + case 'union': + if (rhs.type !== 'union') { + return false; + } + // Every type in this union needs to be equal one type in RHS + return this.type.types.every((t1) => rhs.types.some((t2) => new RichPropertyType(t1).javascriptEquals(t2))); + default: + // For anything else, need strict equality + return this.equals(rhs); + } + } + /** + * Whether the current type is assignable to the RHS type. + * + * This is means every type member of the LHS must be present in the RHS type + */ + assignableTo(rhs) { + const extractMembers = (type) => (type.type == 'union' ? type.types : [type]); + const asRichType = (type) => new RichPropertyType(type); + const rhsMembers = extractMembers(rhs); + for (const lhsMember of extractMembers(this.type).map(asRichType)) { + if (!rhsMembers.some((type) => lhsMember.equals(type))) { + return false; + } + } + return true; + } + /** + * Return a version of this type, but with all type unions in a regularized order + */ + normalize(db) { + switch (this.type.type) { + case 'array': + case 'map': + return new RichPropertyType({ + type: this.type.type, + element: new RichPropertyType(this.type.element).normalize(db).type, + }); + case 'union': + const types = this.type.types + .map((t) => new RichPropertyType(t).normalize(db)) + .map((t) => [t, t.sortKey(db)]); + types.sort((0, sorting_1.sortKeyComparator)(([_, sortKey]) => sortKey)); + return new RichPropertyType({ + type: 'union', + types: types.map(([t, _]) => t.type), + }); + default: + return this; + } + } + stringify(db, withId = true) { + switch (this.type.type) { + case 'integer': + case 'boolean': + case 'date-time': + case 'json': + case 'null': + case 'number': + case 'string': + case 'tag': + return this.type.type; + case 'array': + return `Array<${new RichPropertyType(this.type.element).stringify(db, withId)}>`; + case 'map': + return `Map`; + case 'ref': + const type = db.get('typeDefinition', this.type.reference); + return withId ? `${type.name}(${this.type.reference.$ref})` : type.name; + case 'union': + return this.type.types.map((t) => new RichPropertyType(t).stringify(db, withId)).join(' | '); + } + } + /** + * Return a sortable key based on this type + * + * If a database is given, type definitions will be sorted based on type name, + * otherwise on identifier + */ + sortKey(db) { + var _a, _b; + switch (this.type.type) { + case 'integer': + case 'boolean': + case 'date-time': + case 'json': + case 'null': + case 'number': + case 'string': + case 'tag': + return ['0', this.type.type]; + case 'array': + case 'map': + return ['1', this.type.type, ...new RichPropertyType(this.type.element).sortKey(db)]; + case 'ref': + return ['2', this.type.type, (_b = (_a = db === null || db === void 0 ? void 0 : db.get('typeDefinition', this.type.reference)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : this.type.reference.$ref]; + case 'union': + const typeKeys = this.type.types.map((t) => new RichPropertyType(t).sortKey(db)); + typeKeys.sort((0, sorting_1.sortKeyComparator)((x) => x)); + return ['3', this.type.type, ...typeKeys.flatMap((x) => x)]; + } + } +} +exports.RichPropertyType = RichPropertyType; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsNkNBQW9EO0FBdUtwRCxNQUFhLGNBQWM7SUFDekIsWUFBNkIsS0FBK0M7UUFBL0MsVUFBSyxHQUFMLEtBQUssQ0FBMEM7UUFDMUUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUN2QztJQUNILENBQUM7SUFFTSxLQUFLOztRQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsbUNBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFVBQVUsQ0FBQyxJQUFrQjtRQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVDLDZHQUE2RztRQUM3Ryx3R0FBd0c7UUFDeEcsOEdBQThHO1FBQzlHLHFDQUFxQztRQUNyQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNoRCwyQ0FBMkM7WUFDM0MsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELCtGQUErRjtRQUMvRixrR0FBa0c7UUFDbEcsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxFQUFFO1lBQzlFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBekNELHdDQXlDQztBQUVELE1BQWEsWUFBYSxTQUFRLGNBQWM7SUFDOUMsWUFBWSxRQUFrQjtRQUM1QixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBSkQsb0NBSUM7QUFFRCxNQUFhLGFBQWMsU0FBUSxjQUFjO0lBQy9DLFlBQVksSUFBZTtRQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFKRCxzQ0FJQztBQWFELElBQVksV0FpQlg7QUFqQkQsV0FBWSxXQUFXO0lBQ3JCOztPQUVHO0lBQ0gsNEJBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsNEJBQWEsQ0FBQTtJQUViOzs7O09BSUc7SUFDSCxnQ0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBakJXLFdBQVcsR0FBWCxtQkFBVyxLQUFYLG1CQUFXLFFBaUJ0QjtBQW9CRCxTQUFnQixnQkFBZ0IsQ0FBQyxDQUFlO0lBQzlDLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUM7QUFDaEQsQ0FBQztBQUZELDRDQUVDO0FBeUZEOzs7O0dBSUc7QUFDSCxJQUFZLG9CQWtDWDtBQWxDRCxXQUFZLG9CQUFvQjtJQUM5Qjs7T0FFRztJQUNILHFDQUFhLENBQUE7SUFFYjs7OztPQUlHO0lBQ0gseUVBQWlELENBQUE7SUFFakQ7Ozs7T0FJRztJQUNILHlFQUFpRCxDQUFBO0lBRWpEOztPQUVHO0lBQ0gsNkRBQXFDLENBQUE7SUFFckM7O09BRUc7SUFDSCxtRUFBMkMsQ0FBQTtJQUUzQzs7T0FFRztJQUNILGlFQUF5QyxDQUFBO0FBQzNDLENBQUMsRUFsQ1csb0JBQW9CLEdBQXBCLDRCQUFvQixLQUFwQiw0QkFBb0IsUUFrQy9CO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksb0JBOEJYO0FBOUJELFdBQVksb0JBQW9CO0lBQzlCOztPQUVHO0lBQ0gscUNBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gscUVBQTZDLENBQUE7SUFFN0M7O09BRUc7SUFDSCx5RUFBaUQsQ0FBQTtJQUVqRDs7T0FFRztJQUNILDJEQUFtQyxDQUFBO0lBRW5DOztPQUVHO0lBQ0gscURBQTZCLENBQUE7SUFFN0I7O09BRUc7SUFDSCxtREFBMkIsQ0FBQTtBQUM3QixDQUFDLEVBOUJXLG9CQUFvQixHQUFwQiw0QkFBb0IsS0FBcEIsNEJBQW9CLFFBOEIvQjtBQUVELE1BQWEsZ0JBQWdCO0lBQzNCLFlBQTZCLElBQWtCO1FBQWxCLFNBQUksR0FBSixJQUFJLENBQWM7SUFBRyxDQUFDO0lBRTVDLE1BQU0sQ0FBQyxHQUFpQjtRQUM3QixRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3RCLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssS0FBSztnQkFDUixPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDckMsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BHLEtBQUssS0FBSztnQkFDUixPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUMvRSxLQUFLLE9BQU87Z0JBQ1YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JGO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxnQkFBZ0IsQ0FBQyxHQUFpQjtRQUN2QyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3RCLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxTQUFTO2dCQUNaLFdBQVc7Z0JBQ1gsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztZQUV6RCxLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssS0FBSztnQkFDUixPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU5RyxLQUFLLE9BQU87Z0JBQ1YsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtvQkFDeEIsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsNkRBQTZEO2dCQUM3RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTlHO2dCQUNFLDBDQUEwQztnQkFDMUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxZQUFZLENBQUMsR0FBaUI7UUFDbkMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFrQixFQUFrQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVHLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBa0IsRUFBb0IsRUFBRSxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEYsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssTUFBTSxTQUFTLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDakUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDdEQsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQUMsRUFBZ0I7UUFDL0IsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUN0QixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssS0FBSztnQkFDUixPQUFPLElBQUksZ0JBQWdCLENBQUM7b0JBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7b0JBQ3BCLE9BQU8sRUFBRSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUk7aUJBQ3BFLENBQUMsQ0FBQztZQUNMLEtBQUssT0FBTztnQkFDVixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7cUJBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQ2pELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBVSxDQUFDLENBQUM7Z0JBQzNDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBQSwyQkFBaUIsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLElBQUksZ0JBQWdCLENBQUM7b0JBQzFCLElBQUksRUFBRSxPQUFPO29CQUNiLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7aUJBQ3JDLENBQUMsQ0FBQztZQUNMO2dCQUNFLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBRU0sU0FBUyxDQUFDLEVBQWdCLEVBQUUsTUFBTSxHQUFHLElBQUk7UUFDOUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUN0QixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN4QixLQUFLLE9BQU87Z0JBQ1YsT0FBTyxTQUFTLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDbkYsS0FBSyxLQUFLO2dCQUNSLE9BQU8sZUFBZSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQ3pGLEtBQUssS0FBSztnQkFDUixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzNELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDMUUsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEc7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxPQUFPLENBQUMsRUFBaUI7O1FBQzlCLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDdEIsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssV0FBVyxDQUFDO1lBQ2pCLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxLQUFLO2dCQUNSLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssS0FBSztnQkFDUixPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLEtBQUssS0FBSztnQkFDUixPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQUEsTUFBQSxFQUFFLGFBQUYsRUFBRSx1QkFBRixFQUFFLENBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLDBDQUFFLElBQUksbUNBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakgsS0FBSyxPQUFPO2dCQUNWLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDakYsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFBLDJCQUFpQixFQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7Q0FDRjtBQXRKRCw0Q0FzSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIFJlZmVyZW5jZSwgUmVsYXRpb25zaGlwIH0gZnJvbSAnQGNka2xhYnMvdHNrYic7XG5pbXBvcnQgeyBTcGVjRGF0YWJhc2UgfSBmcm9tICcuL2RhdGFiYXNlJztcbmltcG9ydCB7IHNvcnRLZXlDb21wYXJhdG9yIH0gZnJvbSAnLi4vdXRpbC9zb3J0aW5nJztcblxuZXhwb3J0IGludGVyZmFjZSBQYXJ0aXRpb24gZXh0ZW5kcyBFbnRpdHkge1xuICByZWFkb25seSBwYXJ0aXRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgSGFzUmVnaW9uID0gUmVsYXRpb25zaGlwPFBhcnRpdGlvbiwgUmVnaW9uLCB7IGlzUHJpbWFyeT86IGJvb2xlYW4gfT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSBleHRlbmRzIEVudGl0eSB7XG4gIC8qKlxuICAgKiBUaGUgZnVsbCBuYW1lIG9mIHRoZSBzZXJ2aWNlIGluY2x1ZGluZyB0aGUgZ3JvdXAgcHJlZml4LCBsb3dlcmNhc2VkIGFuZCBoeXBoZW5hdGVkLlxuICAgKlxuICAgKiBFLmcuIGBBV1M6OkR5bmFtb0RCYCAtPiBgYXdzLWR5bmFtb2RiYFxuICAgKlxuICAgKiBAZXhhbXBsZSBhd3MtZHluYW1vZGJcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIE9ubHkgdGhlIHNlcnZpY2UgcGFydCBvZiB0aGUgbmFtZSwgbG93ZXJjYXNlZC5cbiAgICpcbiAgICogRS5nLiBgQVdTOjpEeW5hbW9EQmAgLT4gYGR5bmFtb2RiYFxuICAgKlxuICAgKiBAZXhhbXBsZSBkeW5hbW9kYlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvcnROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2hvcnRuYW1lIG9mIHRoZSBzZXJ2aWNlIGluIGNhcGl0YWxpemVkIGZvcm1cbiAgICpcbiAgICogRS5nLiBgQVdTOjpEeW5hbW9EQmAgLT4gYER5bmFtb0RCYFxuICAgKlxuICAgKiBAZXhhbXBsZSBkeW5hbW9kYlxuICAgKi9cbiAgcmVhZG9ubHkgY2FwaXRhbGl6ZWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb21wbGV0ZSBjbG91ZGZvcm1hdGlvbiBzdHlsZSBuYW1lc3BhY2Ugb2YgdGhlIHNlcnZpY2VcbiAgICpcbiAgICogRS5nLiBgQVdTOjpEeW5hbW9EQmBcbiAgICpcbiAgICogQGV4YW1wbGUgZHluYW1vZGJcbiAgICovXG4gIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uTmFtZXNwYWNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uIGV4dGVuZHMgRW50aXR5IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudGF0aW9uIGV4dGVuZHMgRW50aXR5IHtcbiAgcmVhZG9ubHkgbWFya2Rvd246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZSBleHRlbmRzIEVudGl0eSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgY2xvdWRGb3JtYXRpb25UeXBlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJZiBzZXQsIHRoaXMgQ2xvdWRGb3JtYXRpb24gVHJhbnNmb3JtIGlzIHJlcXVpcmVkIGJ5IHRoZSByZXNvdXJjZVxuICAgKi9cbiAgY2xvdWRGb3JtYXRpb25UcmFuc2Zvcm0/OiBzdHJpbmc7XG4gIGRvY3VtZW50YXRpb24/OiBzdHJpbmc7XG4gIHByaW1hcnlJZGVudGlmaWVyPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IHByb3BlcnRpZXM6IFJlc291cmNlUHJvcGVydGllcztcbiAgcmVhZG9ubHkgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlPjtcbiAgcmVhZG9ubHkgdmFsaWRhdGlvbnM/OiB1bmtub3duO1xuICBpZGVudGlmaWVyPzogUmVzb3VyY2VJZGVudGlmaWVyO1xuICBpc1N0YXRlZnVsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZ2dhYmlsaXR5IG9mIHRoaXMgcmVzb3VyY2VcbiAgICpcbiAgICogVW5kZWZpbmVkIGlmIHRoZSByZXNvdXJjZSBpcyBub3QgdGFnZ2FibGUuXG4gICAqL1xuICB0YWdJbmZvcm1hdGlvbj86IFRhZ0luZm9ybWF0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNoYW5nZXMgdG8gdGhpcyByZXNvdXJjZSBuZWVkIHRvIGJlIHNjcnV0aW5pemVkXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlc291cmNlU2NydXRpbnlUeXBlLk5PTkVcbiAgICovXG4gIHNjcnV0aW5pemFibGU/OiBSZXNvdXJjZVNjcnV0aW55VHlwZTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBwYXRocyB0byBwcm9wZXJ0aWVzIHRoYXQgYWxzbyBjYXVzZSByZXBsYWNlbWVudC5cbiAgICpcbiAgICogVGhpcyBpcyB0byBpbmRpY2F0ZSB0aGF0IGNlcnRhaW4gcHJvcGVydHkgcGF0aHMgaW50byB0aGlzIHJlc291cmNlXG4gICAqIHdpbGwgY2F1c2UgcmVwbGFjZW1lbnQ7IG9ubHkgcmVwbGFjZW1lbnRzIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkXG4gICAqIGJ5IHRhZ2dpbmcgdGhlIHByb3BlcnR5IGluIGEgdHlwZSBkZWZpbml0aW9uIHdpbGwgYmUgaW5jbHVkZWQgaGVyZVxuICAgKiAoZm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhlIHRhZ2dlZCBwcm9wZXJ0eSB3b3VsZCBiZSBpbiBhIHByZWRlZmluZWRcbiAgICogdHlwZSBsaWtlIGB0YWdgKS5cbiAgICpcbiAgICogQWxsIHByb3BlcnRpZXMgaW4gdGhpcyBsaXN0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGBjYXVzZXNSZXBsYWNlbWVudDogJ3llcydgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtXG4gICAqL1xuICBhZGRpdGlvbmFsUmVwbGFjZW1lbnRQcm9wZXJ0aWVzPzogc3RyaW5nW11bXTtcbn1cblxuZXhwb3J0IHR5cGUgUmVzb3VyY2VQcm9wZXJ0aWVzID0gUmVjb3JkPHN0cmluZywgUHJvcGVydHk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVEZWZpbml0aW9uIGV4dGVuZHMgRW50aXR5IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBkb2N1bWVudGF0aW9uPzogc3RyaW5nO1xuICByZWFkb25seSBwcm9wZXJ0aWVzOiBSZXNvdXJjZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHJlbmRlciB0aGlzIHR5cGUgZXZlbiBpZiBpdCBpcyB1bnVzZWQuXG4gICAqL1xuICBtdXN0UmVuZGVyRm9yQndDb21wYXQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5IHtcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBwcm9wZXJ0eVxuICAgKi9cbiAgZG9jdW1lbnRhdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogSXMgdGhpcyBwcm9wZXJ0eSByZXF1aXJlZFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB0eXBlIG9mIHRoaXMgcHJvcGVydHlcbiAgICovXG4gIHR5cGU6IFByb3BlcnR5VHlwZTtcblxuICAvKipcbiAgICogQW4gb3JkZXJlZCBsaXN0IG9mIHByZXZpb3VzIHR5cGVzIG9mIHRoaXMgcHJvcGVydHkgaW4gYXNjZW5kaW5nIG9yZGVyXG4gICAqXG4gICAqIERvZXMgbm90IGluY2x1ZGUgdGhlIGN1cnJlbnQgdHlwZSwgdXNlIGB0eXBlYCBmb3IgdGhpcy5cbiAgICovXG4gIHByZXZpb3VzVHlwZXM/OiBQcm9wZXJ0eVR5cGVbXTtcblxuICAvKipcbiAgICogQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eVxuICAgKlxuICAgKiBUaGlzIHZhbHVlIGlzIG5vdCBkaXJlY3RseSBmdW5jdGlvbmFsOyBpdCBkZXNjcmliZXMgaG93IHRoZSB1bmRlcmx5aW5nIHJlc291cmNlXG4gICAqIHdpbGwgYmVoYXZlIGlmIHRoZSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgdW5rbm93blxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vdCBkZXByZWNhdGVkXG4gICAqL1xuICBkZXByZWNhdGVkPzogRGVwcmVjYXRpb247XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgY2hhbmdlcyB0byB0aGlzIHByb3BlcnR5IG5lZWRzIHRvIGJlIHNjcnV0aW5pemVkIHNwZWNpYWxseVxuICAgKlxuICAgKiBAZGVmYXVsdCBQcm9wZXJ0eVNjcnV0aW55VHlwZS5OT05FXG4gICAqL1xuICBzY3J1dGluaXphYmxlPzogUHJvcGVydHlTY3J1dGlueVR5cGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbnRhaW5pbmcgcmVzb3VyY2Ugd2lsbCBiZSByZXBsYWNlZCBpZiB0aGlzIHByb3BlcnR5IGlzIGNoYW5nZWRcbiAgICpcbiAgICogQGRlZmF1bHQgJ25vJ1xuICAgKi9cbiAgY2F1c2VzUmVwbGFjZW1lbnQ/OiAneWVzJyB8ICdubycgfCAnbWF5YmUnO1xufVxuXG5leHBvcnQgY2xhc3MgUmljaFR5cGVkRmllbGQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZpZWxkOiBQaWNrPFByb3BlcnR5LCAndHlwZScgfCAncHJldmlvdXNUeXBlcyc+KSB7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmllbGQgaXMgdW5kZWZpbmVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHR5cGVzKCk6IFByb3BlcnR5VHlwZVtdIHtcbiAgICByZXR1cm4gWy4uLih0aGlzLmZpZWxkLnByZXZpb3VzVHlwZXMgPz8gW10pLCB0aGlzLmZpZWxkLnR5cGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdHlwZSBvZiB0aGlzIHByb3BlcnR5IHdpdGggYSBuZXcgdHlwZVxuICAgKlxuICAgKiBPbmx5IGlmIGl0J3Mgbm90IGluIHRoZSBzZXQgb2YgdHlwZXMgYWxyZWFkeS5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVUeXBlKHR5cGU6IFByb3BlcnR5VHlwZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJpY2hUeXBlID0gbmV3IFJpY2hQcm9wZXJ0eVR5cGUodHlwZSk7XG5cbiAgICAvLyBPbmx5IGFkZCB0aGlzIHR5cGUgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGl0LiBXZSBhcmUgb25seSBkb2luZyBjb21wYXJpc29ucyB3aGVyZSAnaW50ZWdlcicgYW5kICdudW1iZXInXG4gICAgLy8gYXJlIHRyZWF0ZWQgdGhlIHNhbWUsIGZvciBhbGwgb3RoZXIgdHlwZXMgd2UgbmVlZCBzdHJpY3QgZXF1YWxpdHkuIFdlIHVzZWQgdG8gdXNlICdhc3NpZ25hYmxlVG8nIGFzIGFcbiAgICAvLyBjb25kaXRpb24sIGJ1dCB0aGVzZSB0eXBlcyB3aWxsIGJlIHJlbmRlcmVkIGluIGJvdGggY28tIGFuZCBjb250cmF2YXJpYW50IHBvc2l0aW9ucywgYW5kIHNvIHdlIHJlYWxseSBjYW4ndFxuICAgIC8vIGRvIG11Y2ggYmV0dGVyIHRoYW4gZnVsbCBlcXVhbGl0eS5cbiAgICBpZiAodGhpcy50eXBlcygpLnNvbWUoKHQpID0+IHJpY2hUeXBlLmVxdWFscyh0KSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gZG8sIHR5cGUgaXMgYWxyZWFkeSBpbiB0aGVyZS5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IGlmIHRoZSBuZXcgdHlwZSBpcyBgc3RyaW5nYCBhbmQgdGhlIG9sZCB0eXBlIGlzIGBkYXRlLXRpbWVgLCB3ZSBhc3N1bWUgdGhpcyBpc1xuICAgIC8vIHRoZSBzYW1lIHR5cGUgYnV0IHdlIGRyb3BwZWQgc29tZSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uLiBObyBuZWVkIHRvIG1ha2UgdGhpcyBhIHNlcGFyYXRlIHR5cGUuXG4gICAgaWYgKHR5cGUudHlwZSA9PT0gJ3N0cmluZycgJiYgdGhpcy50eXBlcygpLnNvbWUoKHQpID0+IHQudHlwZSA9PT0gJ2RhdGUtdGltZScpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpZWxkLnByZXZpb3VzVHlwZXMpIHtcbiAgICAgIHRoaXMuZmllbGQucHJldmlvdXNUeXBlcyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmZpZWxkLnByZXZpb3VzVHlwZXMucHVzaCh0aGlzLmZpZWxkLnR5cGUpO1xuICAgIHRoaXMuZmllbGQudHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJpY2hQcm9wZXJ0eSBleHRlbmRzIFJpY2hUeXBlZEZpZWxkIHtcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSaWNoQXR0cmlidXRlIGV4dGVuZHMgUmljaFR5cGVkRmllbGQge1xuICBjb25zdHJ1Y3RvcihhdHRyOiBBdHRyaWJ1dGUpIHtcbiAgICBzdXBlcihhdHRyKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZSB7XG4gIGRvY3VtZW50YXRpb24/OiBzdHJpbmc7XG4gIHR5cGU6IFByb3BlcnR5VHlwZTtcbiAgLyoqXG4gICAqIEFuIG9yZGVyZWQgbGlzdCBvZiBwcmV2aW91cyB0eXBlcyBvZiB0aGlzIHByb3BlcnR5IGluIGFzY2VuZGluZyBvcmRlclxuICAgKlxuICAgKiBEb2VzIG5vdCBpbmNsdWRlIHRoZSBjdXJyZW50IHR5cGUsIHVzZSBgdHlwZWAgZm9yIHRoaXMuXG4gICAqL1xuICBwcmV2aW91c1R5cGVzPzogUHJvcGVydHlUeXBlW107XG59XG5cbmV4cG9ydCBlbnVtIERlcHJlY2F0aW9uIHtcbiAgLyoqXG4gICAqIE5vdCBkZXByZWNhdGVkXG4gICAqL1xuICBOT05FID0gJ05PTkUnLFxuXG4gIC8qKlxuICAgKiBXYXJuIGFib3V0IHVzZVxuICAgKi9cbiAgV0FSTiA9ICdXQVJOJyxcblxuICAvKipcbiAgICogRG8gbm90IGVtaXQgdGhlIHZhbHVlIGF0IGFsbFxuICAgKlxuICAgKiAoSGFuZGxlIHByb3BlcnRpZXMgdGhhdCB3ZXJlIGluY29ycmVjdGx5IGFkZGVkIHRvIHRoZSBzcGVjKVxuICAgKi9cbiAgSUdOT1JFID0gJ0lHTk9SRScsXG59XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5VHlwZSA9XG4gIHwgUHJpbWl0aXZlVHlwZVxuICB8IERlZmluaXRpb25SZWZlcmVuY2VcbiAgfCBCdWlsdGluVGFnVHlwZVxuICB8IEFycmF5VHlwZTxQcm9wZXJ0eVR5cGU+XG4gIHwgTWFwVHlwZTxQcm9wZXJ0eVR5cGU+XG4gIHwgVHlwZVVuaW9uPFByb3BlcnR5VHlwZT47XG5cbmV4cG9ydCB0eXBlIFByaW1pdGl2ZVR5cGUgPVxuICB8IFN0cmluZ1R5cGVcbiAgfCBOdW1iZXJUeXBlXG4gIHwgSW50ZWdlclR5cGVcbiAgfCBCb29sZWFuVHlwZVxuICB8IEpzb25UeXBlXG4gIHwgRGF0ZVRpbWVUeXBlXG4gIHwgTnVsbFR5cGVcbiAgfCBCdWlsdGluVGFnVHlwZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sbGVjdGlvblR5cGUoeDogUHJvcGVydHlUeXBlKTogeCBpcyBBcnJheVR5cGU8YW55PiB8IE1hcFR5cGU8YW55PiB7XG4gIHJldHVybiB4LnR5cGUgPT09ICdhcnJheScgfHwgeC50eXBlID09PSAnbWFwJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYWdJbmZvcm1hdGlvbiB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGhvbGRzIHRoZSB0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdQcm9wZXJ0eU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVXNlZCB0byBpbnN0cnVjdCBjZGsuVGFnTWFuYWdlciBob3cgdG8gaGFuZGxlIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHZhcmlhbnQ6IFRhZ1ZhcmlhbnQ7XG59XG5cbmV4cG9ydCB0eXBlIFRhZ1ZhcmlhbnQgPSAnc3RhbmRhcmQnIHwgJ2FzZycgfCAnbWFwJztcblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdUeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ3N0cmluZyc7XG59XG5leHBvcnQgaW50ZXJmYWNlIEJ1aWx0aW5UYWdUeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ3RhZyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyVHlwZSB7XG4gIHJlYWRvbmx5IHR5cGU6ICdudW1iZXInO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVnZXJUeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ2ludGVnZXInO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvb2xlYW5UeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ2Jvb2xlYW4nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpzb25UeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ2pzb24nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE51bGxUeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ251bGwnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVUaW1lVHlwZSB7XG4gIHJlYWRvbmx5IHR5cGU6ICdkYXRlLXRpbWUnO1xufVxuXG4vKipcbiAqIFRoZSBcImxlZ2FjeVwiIHRhZyB0eXBlICh1c2VkIGluIHRoZSBvbGQgcmVzb3VyY2Ugc3BlYylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsdGluVGFnVHlwZSB7XG4gIHJlYWRvbmx5IHR5cGU6ICd0YWcnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmluaXRpb25SZWZlcmVuY2Uge1xuICByZWFkb25seSB0eXBlOiAncmVmJztcbiAgcmVhZG9ubHkgcmVmZXJlbmNlOiBSZWZlcmVuY2U8VHlwZURlZmluaXRpb24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFycmF5VHlwZTxFPiB7XG4gIHJlYWRvbmx5IHR5cGU6ICdhcnJheSc7XG4gIHJlYWRvbmx5IGVsZW1lbnQ6IEU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFwVHlwZTxFPiB7XG4gIHJlYWRvbmx5IHR5cGU6ICdtYXAnO1xuICByZWFkb25seSBlbGVtZW50OiBFO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVVbmlvbjxFPiB7XG4gIHJlYWRvbmx5IHR5cGU6ICd1bmlvbic7XG4gIHJlYWRvbmx5IHR5cGVzOiBFW107XG59XG5cbmV4cG9ydCB0eXBlIEhhc1Jlc291cmNlID0gUmVsYXRpb25zaGlwPFNlcnZpY2UsIFJlc291cmNlPjtcbmV4cG9ydCB0eXBlIFJlZ2lvbkhhc1Jlc291cmNlID0gUmVsYXRpb25zaGlwPFJlZ2lvbiwgUmVzb3VyY2U+O1xuZXhwb3J0IHR5cGUgUmVnaW9uSGFzU2VydmljZSA9IFJlbGF0aW9uc2hpcDxSZWdpb24sIFNlcnZpY2U+O1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VEb2MgPSBSZWxhdGlvbnNoaXA8UmVzb3VyY2UsIERvY3VtZW50YXRpb24+O1xuXG5leHBvcnQgdHlwZSBTZXJ2aWNlSW5SZWdpb24gPSBSZWxhdGlvbnNoaXA8UmVnaW9uLCBTZXJ2aWNlPjtcbmV4cG9ydCB0eXBlIFJlc291cmNlSW5SZWdpb24gPSBSZWxhdGlvbnNoaXA8UmVnaW9uLCBSZXNvdXJjZT47XG5cbmV4cG9ydCB0eXBlIFVzZXNUeXBlID0gUmVsYXRpb25zaGlwPFJlc291cmNlLCBUeXBlRGVmaW5pdGlvbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VJZGVudGlmaWVyIGV4dGVuZHMgRW50aXR5IHtcbiAgcmVhZG9ubHkgYXJuVGVtcGxhdGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByaW1hcnlJZGVudGlmaWVyPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogTWFyayBhIHJlc291cmNlIGFzIGEgcmVzb3VyY2UgdGhhdCBuZWVkcyBhZGRpdGlvbmFsIHNjcnV0aXkgd2hlbiBhZGRlZCwgcmVtb3ZlZCBvciBjaGFuZ2VkXG4gKlxuICogVXNlZCB0byBtYXJrIHJlc291cmNlcyB0aGF0IHJlcHJlc2VudCBzZWN1cml0eSBwb2xpY2llcy5cbiAqL1xuZXhwb3J0IGVudW0gUmVzb3VyY2VTY3J1dGlueVR5cGUge1xuICAvKipcbiAgICogTm8gYWRkaXRpb25hbCBzY3J1dGlueVxuICAgKi9cbiAgTm9uZSA9ICdOb25lJyxcblxuICAvKipcbiAgICogQW4gZXh0ZXJuYWxseSBhdHRhY2hlZCBwb2xpY3kgZG9jdW1lbnQgdG8gYSByZXNvdXJjZVxuICAgKlxuICAgKiAoQ29tbW9uIGZvciBTUVMsIFNOUywgUzMsIC4uLilcbiAgICovXG4gIFJlc291cmNlUG9saWN5UmVzb3VyY2UgPSAnUmVzb3VyY2VQb2xpY3lSZXNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYW4gSUFNIHBvbGljeSBvbiBhbiBpZGVudGl0eSByZXNvdXJjZVxuICAgKlxuICAgKiAoQmFzaWNhbGx5IHNheWluZzogdGhpcyBpcyBBV1M6OklBTTo6UG9saWN5KVxuICAgKi9cbiAgSWRlbnRpdHlQb2xpY3lSZXNvdXJjZSA9ICdJZGVudGl0eVBvbGljeVJlc291cmNlJyxcblxuICAvKipcbiAgICogVGhpcyBpcyBhIExhbWJkYSBQZXJtaXNzaW9uIHBvbGljeVxuICAgKi9cbiAgTGFtYmRhUGVybWlzc2lvbiA9ICdMYW1iZGFQZXJtaXNzaW9uJyxcblxuICAvKipcbiAgICogQW4gaW5ncmVzcyBydWxlIG9iamVjdFxuICAgKi9cbiAgSW5ncmVzc1J1bGVSZXNvdXJjZSA9ICdJbmdyZXNzUnVsZVJlc291cmNlJyxcblxuICAvKipcbiAgICogQSBzZXQgb2YgZWdyZXNzIHJ1bGVzXG4gICAqL1xuICBFZ3Jlc3NSdWxlUmVzb3VyY2UgPSAnRWdyZXNzUnVsZVJlc291cmNlJyxcbn1cblxuLyoqXG4gKiBNYXJrIGEgcHJvcGVydHkgYXMgYSBwcm9wZXJ0eSB0aGF0IG5lZWRzIGFkZGl0aW9uYWwgc2NydXRpbnkgd2hlbiBpdCBjaGFuZ2VzXG4gKlxuICogVXNlZCB0byBtYXJrIHNlbnNpdGl2ZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBzZWN1cml0eS1yZWxhdGVkIGltcGxpY2F0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gUHJvcGVydHlTY3J1dGlueVR5cGUge1xuICAvKipcbiAgICogTm8gYWRkaXRpb25hbCBzY3J1dGlueVxuICAgKi9cbiAgTm9uZSA9ICdOb25lJyxcblxuICAvKipcbiAgICogVGhpcyBpcyBhbiBJQU0gcG9saWN5IGRpcmVjdGx5IG9uIGEgcmVzb3VyY2VcbiAgICovXG4gIElubGluZVJlc291cmNlUG9saWN5ID0gJ0lubGluZVJlc291cmNlUG9saWN5JyxcblxuICAvKipcbiAgICogRWl0aGVyIGFuIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudCBvciBhIGRpY3Rpb25hcnkgb2YgcG9saWN5IGRvY3VtZW50c1xuICAgKi9cbiAgSW5saW5lSWRlbnRpdHlQb2xpY2llcyA9ICdJbmxpbmVJZGVudGl0eVBvbGljaWVzJyxcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG1hbmFnZWQgcG9saWNpZXMgKG9uIGFuIGlkZW50aXR5IHJlc291cmNlKVxuICAgKi9cbiAgTWFuYWdlZFBvbGljaWVzID0gJ01hbmFnZWRQb2xpY2llcycsXG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIGluZ3Jlc3MgcnVsZXMgKG9uIGEgc2VjdXJpdHkgZ3JvdXApXG4gICAqL1xuICBJbmdyZXNzUnVsZXMgPSAnSW5ncmVzc1J1bGVzJyxcblxuICAvKipcbiAgICogQSBzZXQgb2YgZWdyZXNzIHJ1bGVzIChvbiBhIHNlY3VyaXR5IGdyb3VwKVxuICAgKi9cbiAgRWdyZXNzUnVsZXMgPSAnRWdyZXNzUnVsZXMnLFxufVxuXG5leHBvcnQgY2xhc3MgUmljaFByb3BlcnR5VHlwZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdHlwZTogUHJvcGVydHlUeXBlKSB7fVxuXG4gIHB1YmxpYyBlcXVhbHMocmhzOiBQcm9wZXJ0eVR5cGUpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZS10aW1lJzpcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgIHJldHVybiByaHMudHlwZSA9PT0gdGhpcy50eXBlLnR5cGU7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdtYXAnOlxuICAgICAgICByZXR1cm4gcmhzLnR5cGUgPT09IHRoaXMudHlwZS50eXBlICYmIG5ldyBSaWNoUHJvcGVydHlUeXBlKHRoaXMudHlwZS5lbGVtZW50KS5lcXVhbHMocmhzLmVsZW1lbnQpO1xuICAgICAgY2FzZSAncmVmJzpcbiAgICAgICAgcmV0dXJuIHJocy50eXBlID09PSAncmVmJyAmJiB0aGlzLnR5cGUucmVmZXJlbmNlLiRyZWYgPT09IHJocy5yZWZlcmVuY2UuJHJlZjtcbiAgICAgIGNhc2UgJ3VuaW9uJzpcbiAgICAgICAgY29uc3QgbGhzS2V5ID0gdGhpcy5zb3J0S2V5KCk7XG4gICAgICAgIGNvbnN0IHJoc0tleSA9IG5ldyBSaWNoUHJvcGVydHlUeXBlKHJocykuc29ydEtleSgpO1xuICAgICAgICByZXR1cm4gbGhzS2V5Lmxlbmd0aCA9PT0gcmhzS2V5Lmxlbmd0aCAmJiBsaHNLZXkuZXZlcnkoKGwsIGkpID0+IGwgPT09IHJoc0tleVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgdHlwZSBpcyBKYXZhU2NyaXB0LWVxdWFsIHRvIHRoZSBSSFMgdHlwZVxuICAgKlxuICAgKiBTYW1lIGFzIG5vcm1hbCBlcXVhbGl0eSwgYnV0IGNvbnNpZGVyIGBpbnRlZ2VyYCBhbmQgYG51bWJlcmAgdGhlIHNhbWUgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgamF2YXNjcmlwdEVxdWFscyhyaHM6IFByb3BlcnR5VHlwZSk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAodGhpcy50eXBlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgICAgLy8gV2lkZW5pbmdcbiAgICAgICAgcmV0dXJuIHJocy50eXBlID09PSAnaW50ZWdlcicgfHwgcmhzLnR5cGUgPT09ICdudW1iZXInO1xuXG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdtYXAnOlxuICAgICAgICByZXR1cm4gcmhzLnR5cGUgPT09IHRoaXMudHlwZS50eXBlICYmIG5ldyBSaWNoUHJvcGVydHlUeXBlKHRoaXMudHlwZS5lbGVtZW50KS5qYXZhc2NyaXB0RXF1YWxzKHJocy5lbGVtZW50KTtcblxuICAgICAgY2FzZSAndW5pb24nOlxuICAgICAgICBpZiAocmhzLnR5cGUgIT09ICd1bmlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXZlcnkgdHlwZSBpbiB0aGlzIHVuaW9uIG5lZWRzIHRvIGJlIGVxdWFsIG9uZSB0eXBlIGluIFJIU1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLnR5cGVzLmV2ZXJ5KCh0MSkgPT4gcmhzLnR5cGVzLnNvbWUoKHQyKSA9PiBuZXcgUmljaFByb3BlcnR5VHlwZSh0MSkuamF2YXNjcmlwdEVxdWFscyh0MikpKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRm9yIGFueXRoaW5nIGVsc2UsIG5lZWQgc3RyaWN0IGVxdWFsaXR5XG4gICAgICAgIHJldHVybiB0aGlzLmVxdWFscyhyaHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHR5cGUgaXMgYXNzaWduYWJsZSB0byB0aGUgUkhTIHR5cGUuXG4gICAqXG4gICAqIFRoaXMgaXMgbWVhbnMgZXZlcnkgdHlwZSBtZW1iZXIgb2YgdGhlIExIUyBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIFJIUyB0eXBlXG4gICAqL1xuICBwdWJsaWMgYXNzaWduYWJsZVRvKHJoczogUHJvcGVydHlUeXBlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXh0cmFjdE1lbWJlcnMgPSAodHlwZTogUHJvcGVydHlUeXBlKTogUHJvcGVydHlUeXBlW10gPT4gKHR5cGUudHlwZSA9PSAndW5pb24nID8gdHlwZS50eXBlcyA6IFt0eXBlXSk7XG4gICAgY29uc3QgYXNSaWNoVHlwZSA9ICh0eXBlOiBQcm9wZXJ0eVR5cGUpOiBSaWNoUHJvcGVydHlUeXBlID0+IG5ldyBSaWNoUHJvcGVydHlUeXBlKHR5cGUpO1xuXG4gICAgY29uc3QgcmhzTWVtYmVycyA9IGV4dHJhY3RNZW1iZXJzKHJocyk7XG4gICAgZm9yIChjb25zdCBsaHNNZW1iZXIgb2YgZXh0cmFjdE1lbWJlcnModGhpcy50eXBlKS5tYXAoYXNSaWNoVHlwZSkpIHtcbiAgICAgIGlmICghcmhzTWVtYmVycy5zb21lKCh0eXBlKSA9PiBsaHNNZW1iZXIuZXF1YWxzKHR5cGUpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgdmVyc2lvbiBvZiB0aGlzIHR5cGUsIGJ1dCB3aXRoIGFsbCB0eXBlIHVuaW9ucyBpbiBhIHJlZ3VsYXJpemVkIG9yZGVyXG4gICAqL1xuICBwdWJsaWMgbm9ybWFsaXplKGRiOiBTcGVjRGF0YWJhc2UpOiBSaWNoUHJvcGVydHlUeXBlIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdtYXAnOlxuICAgICAgICByZXR1cm4gbmV3IFJpY2hQcm9wZXJ0eVR5cGUoe1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZS50eXBlLFxuICAgICAgICAgIGVsZW1lbnQ6IG5ldyBSaWNoUHJvcGVydHlUeXBlKHRoaXMudHlwZS5lbGVtZW50KS5ub3JtYWxpemUoZGIpLnR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSAndW5pb24nOlxuICAgICAgICBjb25zdCB0eXBlcyA9IHRoaXMudHlwZS50eXBlc1xuICAgICAgICAgIC5tYXAoKHQpID0+IG5ldyBSaWNoUHJvcGVydHlUeXBlKHQpLm5vcm1hbGl6ZShkYikpXG4gICAgICAgICAgLm1hcCgodCkgPT4gW3QsIHQuc29ydEtleShkYildIGFzIGNvbnN0KTtcbiAgICAgICAgdHlwZXMuc29ydChzb3J0S2V5Q29tcGFyYXRvcigoW18sIHNvcnRLZXldKSA9PiBzb3J0S2V5KSk7XG4gICAgICAgIHJldHVybiBuZXcgUmljaFByb3BlcnR5VHlwZSh7XG4gICAgICAgICAgdHlwZTogJ3VuaW9uJyxcbiAgICAgICAgICB0eXBlczogdHlwZXMubWFwKChbdCwgX10pID0+IHQudHlwZSksXG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0cmluZ2lmeShkYjogU3BlY0RhdGFiYXNlLCB3aXRoSWQgPSB0cnVlKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZS10aW1lJzpcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUudHlwZTtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgICAgcmV0dXJuIGBBcnJheTwke25ldyBSaWNoUHJvcGVydHlUeXBlKHRoaXMudHlwZS5lbGVtZW50KS5zdHJpbmdpZnkoZGIsIHdpdGhJZCl9PmA7XG4gICAgICBjYXNlICdtYXAnOlxuICAgICAgICByZXR1cm4gYE1hcDxzdHJpbmcsICR7bmV3IFJpY2hQcm9wZXJ0eVR5cGUodGhpcy50eXBlLmVsZW1lbnQpLnN0cmluZ2lmeShkYiwgd2l0aElkKX0+YDtcbiAgICAgIGNhc2UgJ3JlZic6XG4gICAgICAgIGNvbnN0IHR5cGUgPSBkYi5nZXQoJ3R5cGVEZWZpbml0aW9uJywgdGhpcy50eXBlLnJlZmVyZW5jZSk7XG4gICAgICAgIHJldHVybiB3aXRoSWQgPyBgJHt0eXBlLm5hbWV9KCR7dGhpcy50eXBlLnJlZmVyZW5jZS4kcmVmfSlgIDogdHlwZS5uYW1lO1xuICAgICAgY2FzZSAndW5pb24nOlxuICAgICAgICByZXR1cm4gdGhpcy50eXBlLnR5cGVzLm1hcCgodCkgPT4gbmV3IFJpY2hQcm9wZXJ0eVR5cGUodCkuc3RyaW5naWZ5KGRiLCB3aXRoSWQpKS5qb2luKCcgfCAnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc29ydGFibGUga2V5IGJhc2VkIG9uIHRoaXMgdHlwZVxuICAgKlxuICAgKiBJZiBhIGRhdGFiYXNlIGlzIGdpdmVuLCB0eXBlIGRlZmluaXRpb25zIHdpbGwgYmUgc29ydGVkIGJhc2VkIG9uIHR5cGUgbmFtZSxcbiAgICogb3RoZXJ3aXNlIG9uIGlkZW50aWZpZXJcbiAgICovXG4gIHB1YmxpYyBzb3J0S2V5KGRiPzogU3BlY0RhdGFiYXNlKTogc3RyaW5nW10ge1xuICAgIHN3aXRjaCAodGhpcy50eXBlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdkYXRlLXRpbWUnOlxuICAgICAgY2FzZSAnanNvbic6XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAndGFnJzpcbiAgICAgICAgcmV0dXJuIFsnMCcsIHRoaXMudHlwZS50eXBlXTtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ21hcCc6XG4gICAgICAgIHJldHVybiBbJzEnLCB0aGlzLnR5cGUudHlwZSwgLi4ubmV3IFJpY2hQcm9wZXJ0eVR5cGUodGhpcy50eXBlLmVsZW1lbnQpLnNvcnRLZXkoZGIpXTtcbiAgICAgIGNhc2UgJ3JlZic6XG4gICAgICAgIHJldHVybiBbJzInLCB0aGlzLnR5cGUudHlwZSwgZGI/LmdldCgndHlwZURlZmluaXRpb24nLCB0aGlzLnR5cGUucmVmZXJlbmNlKT8ubmFtZSA/PyB0aGlzLnR5cGUucmVmZXJlbmNlLiRyZWZdO1xuICAgICAgY2FzZSAndW5pb24nOlxuICAgICAgICBjb25zdCB0eXBlS2V5cyA9IHRoaXMudHlwZS50eXBlcy5tYXAoKHQpID0+IG5ldyBSaWNoUHJvcGVydHlUeXBlKHQpLnNvcnRLZXkoZGIpKTtcbiAgICAgICAgdHlwZUtleXMuc29ydChzb3J0S2V5Q29tcGFyYXRvcigoeCkgPT4geCkpO1xuICAgICAgICByZXR1cm4gWyczJywgdGhpcy50eXBlLnR5cGUsIC4uLnR5cGVLZXlzLmZsYXRNYXAoKHgpID0+IHgpXTtcbiAgICB9XG4gIH1cbn1cbiJdfQ== + +/***/ }), + +/***/ 85844: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.sortKeyComparator = void 0; +/** + * Make a sorting comparator that will sort by a given sort key + */ +function sortKeyComparator(keyFn) { + return (a, b) => { + const ak = keyFn(a); + const bk = keyFn(b); + for (let i = 0; i < ak.length && i < bk.length; i++) { + const av = ak[i]; + const bv = bk[i]; + let diff = 0; + if (typeof av === 'number' && typeof bv === 'number') { + diff = av - bv; + } + else if (typeof av === 'string' && typeof bv === 'string') { + diff = av.localeCompare(bv); + } + if (diff !== 0) { + return diff; + } + } + return bk.length - ak.length; + }; +} +exports.sortKeyComparator = sortKeyComparator; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3NvcnRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBSSxLQUF1QztJQUMxRSxPQUFPLENBQUMsQ0FBSSxFQUFFLENBQUksRUFBVSxFQUFFO1FBQzVCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkQsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVqQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLE9BQU8sRUFBRSxLQUFLLFFBQVEsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUU7Z0JBQ3BELElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2FBQ2hCO2lCQUFNLElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxJQUFJLE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRTtnQkFDM0QsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDN0I7WUFFRCxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7Z0JBQ2QsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBRUQsT0FBTyxFQUFFLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDL0IsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXZCRCw4Q0F1QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1ha2UgYSBzb3J0aW5nIGNvbXBhcmF0b3IgdGhhdCB3aWxsIHNvcnQgYnkgYSBnaXZlbiBzb3J0IGtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleUNvbXBhcmF0b3I8QT4oa2V5Rm46ICh4OiBBKSA9PiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSB7XG4gIHJldHVybiAoYTogQSwgYjogQSk6IG51bWJlciA9PiB7XG4gICAgY29uc3QgYWsgPSBrZXlGbihhKTtcbiAgICBjb25zdCBiayA9IGtleUZuKGIpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhay5sZW5ndGggJiYgaSA8IGJrLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhdiA9IGFrW2ldO1xuICAgICAgY29uc3QgYnYgPSBia1tpXTtcblxuICAgICAgbGV0IGRpZmYgPSAwO1xuICAgICAgaWYgKHR5cGVvZiBhdiA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGJ2ID09PSAnbnVtYmVyJykge1xuICAgICAgICBkaWZmID0gYXYgLSBidjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGF2ID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYnYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRpZmYgPSBhdi5sb2NhbGVDb21wYXJlKGJ2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpZmYgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJrLmxlbmd0aCAtIGFrLmxlbmd0aDtcbiAgfTtcbn1cbiJdfQ== /***/ }), @@ -17271,7 +17105,7 @@ exports.resolveClientEndpointParameters = resolveClientEndpointParameters; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.defaultEndpointResolver = void 0; -const util_endpoints_1 = __nccwpck_require__(13350); +const util_endpoints_1 = __nccwpck_require__(45473); const ruleset_1 = __nccwpck_require__(58349); const defaultEndpointResolver = (endpointParams, context = {}) => { return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, { @@ -17313,6 +17147,7 @@ tslib_1.__exportStar(__nccwpck_require__(50564), exports); tslib_1.__exportStar(__nccwpck_require__(69505), exports); tslib_1.__exportStar(__nccwpck_require__(23978), exports); tslib_1.__exportStar(__nccwpck_require__(19510), exports); +__nccwpck_require__(13350); var CloudFormationServiceException_1 = __nccwpck_require__(215); Object.defineProperty(exports, "CloudFormationServiceException", ({ enumerable: true, get: function () { return CloudFormationServiceException_1.CloudFormationServiceException; } })); @@ -17357,8 +17192,8 @@ tslib_1.__exportStar(__nccwpck_require__(75378), exports); "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HookStatus = exports.StackDriftStatus = exports.StackDriftDetectionStatus = exports.PublisherStatus = exports.IdentityProvider = exports.OrganizationStatus = exports.RegistryType = exports.StackSetNotEmptyException = exports.InvalidChangeSetStatusException = exports.NameAlreadyExistsException = exports.PermissionModels = exports.CreatedButModifiedException = exports.StaleRequestException = exports.StackSetNotFoundException = exports.OperationInProgressException = exports.OperationIdAlreadyExistsException = exports.RegionConcurrencyType = exports.OnFailure = exports.LimitExceededException = exports.InsufficientCapabilitiesException = exports.OnStackFailure = exports.ChangeSetType = exports.ExecutionStatus = exports.ChangeSetStatus = exports.ChangeSetNotFoundException = exports.ChangeSetHooksStatus = exports.HookTargetType = exports.HookInvocationPoint = exports.HookFailureMode = exports.ChangeType = exports.Replacement = exports.RequiresRecreation = exports.ResourceAttribute = exports.EvaluationType = exports.ChangeSource = exports.ChangeAction = exports.Category = exports.Capability = exports.TokenAlreadyExistsException = exports.CallAs = exports.TypeConfigurationNotFoundException = exports.AlreadyExistsException = exports.TypeNotFoundException = exports.CFNRegistryException = exports.VersionBump = exports.ThirdPartyType = exports.OperationNotFoundException = exports.InvalidOperationException = exports.AccountGateStatus = exports.AccountFilterType = void 0; -exports.ResourceSignalStatus = exports.HandlerErrorCode = exports.OperationStatus = exports.OperationStatusCheckFailedException = exports.InvalidStateTransitionException = exports.StackSetOperationResultStatus = exports.OperationResultFilterName = exports.StackInstanceFilterName = exports.StackNotFoundException = exports.TemplateStage = exports.RegistrationStatus = exports.Visibility = exports.TypeTestsStatus = exports.ProvisioningType = exports.DeprecatedStatus = exports.StackSetOperationStatus = exports.StackSetOperationAction = exports.StackSetStatus = exports.StackSetDriftStatus = exports.StackSetDriftDetectionStatus = exports.StackStatus = exports.DifferenceType = exports.StackResourceDriftStatus = exports.StackInstanceNotFoundException = exports.StackInstanceStatus = exports.StackInstanceDetailedStatus = exports.ResourceStatus = void 0; +exports.StackDriftStatus = exports.StackDriftDetectionStatus = exports.PublisherStatus = exports.IdentityProvider = exports.OrganizationStatus = exports.RegistryType = exports.StackSetNotEmptyException = exports.InvalidChangeSetStatusException = exports.NameAlreadyExistsException = exports.PermissionModels = exports.CreatedButModifiedException = exports.StaleRequestException = exports.StackSetNotFoundException = exports.OperationInProgressException = exports.OperationIdAlreadyExistsException = exports.RegionConcurrencyType = exports.ConcurrencyMode = exports.OnFailure = exports.LimitExceededException = exports.InsufficientCapabilitiesException = exports.OnStackFailure = exports.ChangeSetType = exports.ExecutionStatus = exports.ChangeSetStatus = exports.ChangeSetNotFoundException = exports.ChangeSetHooksStatus = exports.HookTargetType = exports.HookInvocationPoint = exports.HookFailureMode = exports.ChangeType = exports.Replacement = exports.RequiresRecreation = exports.ResourceAttribute = exports.EvaluationType = exports.ChangeSource = exports.ChangeAction = exports.Category = exports.Capability = exports.TokenAlreadyExistsException = exports.CallAs = exports.TypeConfigurationNotFoundException = exports.AlreadyExistsException = exports.TypeNotFoundException = exports.CFNRegistryException = exports.VersionBump = exports.ThirdPartyType = exports.OperationNotFoundException = exports.InvalidOperationException = exports.AccountGateStatus = exports.AccountFilterType = void 0; +exports.ResourceSignalStatus = exports.HandlerErrorCode = exports.OperationStatus = exports.OperationStatusCheckFailedException = exports.InvalidStateTransitionException = exports.StackSetOperationResultStatus = exports.OperationResultFilterName = exports.StackInstanceFilterName = exports.StackNotFoundException = exports.TemplateStage = exports.RegistrationStatus = exports.Visibility = exports.TypeTestsStatus = exports.ProvisioningType = exports.DeprecatedStatus = exports.StackSetOperationStatus = exports.StackSetOperationAction = exports.StackSetStatus = exports.StackSetDriftStatus = exports.StackSetDriftDetectionStatus = exports.StackStatus = exports.DifferenceType = exports.StackResourceDriftStatus = exports.StackInstanceNotFoundException = exports.StackInstanceStatus = exports.StackInstanceDetailedStatus = exports.ResourceStatus = exports.HookStatus = void 0; const CloudFormationServiceException_1 = __nccwpck_require__(215); exports.AccountFilterType = { DIFFERENCE: "DIFFERENCE", @@ -17623,6 +17458,10 @@ exports.OnFailure = { DO_NOTHING: "DO_NOTHING", ROLLBACK: "ROLLBACK", }; +exports.ConcurrencyMode = { + SOFT_FAILURE_TOLERANCE: "SOFT_FAILURE_TOLERANCE", + STRICT_FAILURE_TOLERANCE: "STRICT_FAILURE_TOLERANCE", +}; exports.RegionConcurrencyType = { PARALLEL: "PARALLEL", SEQUENTIAL: "SEQUENTIAL", @@ -23701,6 +23540,9 @@ const se_StackSetOperationPreferences = (input, context) => { if (input.MaxConcurrentPercentage != null) { entries["MaxConcurrentPercentage"] = input.MaxConcurrentPercentage; } + if (input.ConcurrencyMode != null) { + entries["ConcurrencyMode"] = input.ConcurrencyMode; + } return entries; }; const se_StackStatusFilter = (input, context) => { @@ -26289,6 +26131,9 @@ const de_StackSetOperationPreferences = (output, context) => { if (output["MaxConcurrentPercentage"] !== undefined) { contents.MaxConcurrentPercentage = (0, smithy_client_1.strictParseInt32)(output["MaxConcurrentPercentage"]); } + if (output["ConcurrencyMode"] !== undefined) { + contents.ConcurrencyMode = (0, smithy_client_1.expectString)(output["ConcurrencyMode"]); + } return contents; }; const de_StackSetOperationResultSummaries = (output, context) => { @@ -29308,7 +29153,7 @@ exports.resolveClientEndpointParameters = resolveClientEndpointParameters; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.defaultEndpointResolver = void 0; -const util_endpoints_1 = __nccwpck_require__(13350); +const util_endpoints_1 = __nccwpck_require__(45473); const ruleset_1 = __nccwpck_require__(6845); const defaultEndpointResolver = (endpointParams, context = {}) => { return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, { @@ -29349,6 +29194,7 @@ tslib_1.__exportStar(__nccwpck_require__(18427), exports); tslib_1.__exportStar(__nccwpck_require__(13608), exports); tslib_1.__exportStar(__nccwpck_require__(27405), exports); tslib_1.__exportStar(__nccwpck_require__(2572), exports); +__nccwpck_require__(13350); var CognitoIdentityServiceException_1 = __nccwpck_require__(61760); Object.defineProperty(exports, "CognitoIdentityServiceException", ({ enumerable: true, get: function () { return CognitoIdentityServiceException_1.CognitoIdentityServiceException; } })); @@ -31564,7 +31410,7 @@ exports.resolveClientEndpointParameters = resolveClientEndpointParameters; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.defaultEndpointResolver = void 0; -const util_endpoints_1 = __nccwpck_require__(13350); +const util_endpoints_1 = __nccwpck_require__(45473); const ruleset_1 = __nccwpck_require__(13341); const defaultEndpointResolver = (endpointParams, context = {}) => { return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, { @@ -31605,6 +31451,7 @@ tslib_1.__exportStar(__nccwpck_require__(69838), exports); tslib_1.__exportStar(__nccwpck_require__(65706), exports); tslib_1.__exportStar(__nccwpck_require__(36773), exports); tslib_1.__exportStar(__nccwpck_require__(14952), exports); +__nccwpck_require__(13350); var SSOServiceException_1 = __nccwpck_require__(81517); Object.defineProperty(exports, "SSOServiceException", ({ enumerable: true, get: function () { return SSOServiceException_1.SSOServiceException; } })); @@ -33078,7 +32925,7 @@ exports.resolveClientEndpointParameters = resolveClientEndpointParameters; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.defaultEndpointResolver = void 0; -const util_endpoints_1 = __nccwpck_require__(13350); +const util_endpoints_1 = __nccwpck_require__(45473); const ruleset_1 = __nccwpck_require__(86882); const defaultEndpointResolver = (endpointParams, context = {}) => { return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, { @@ -33119,6 +32966,7 @@ tslib_1.__exportStar(__nccwpck_require__(32605), exports); tslib_1.__exportStar(__nccwpck_require__(55716), exports); tslib_1.__exportStar(__nccwpck_require__(20106), exports); tslib_1.__exportStar(__nccwpck_require__(88028), exports); +__nccwpck_require__(13350); var STSServiceException_1 = __nccwpck_require__(26450); Object.defineProperty(exports, "STSServiceException", ({ enumerable: true, get: function () { return STSServiceException_1.STSServiceException; } })); @@ -34518,6 +34366,73 @@ tslib_1.__exportStar(__nccwpck_require__(7249), exports); tslib_1.__exportStar(__nccwpck_require__(53069), exports); +/***/ }), + +/***/ 26133: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports._toNum = exports._toBool = exports._toStr = void 0; +const _toStr = (val) => { + if (val == null) { + return val; + } + if (typeof val === "number" || typeof val === "bigint") { + const warning = new Error(`Received number ${val} where a string was expected.`); + warning.name = "Warning"; + console.warn(warning); + return String(val); + } + if (typeof val === "boolean") { + const warning = new Error(`Received boolean ${val} where a string was expected.`); + warning.name = "Warning"; + console.warn(warning); + return String(val); + } + return val; +}; +exports._toStr = _toStr; +const _toBool = (val) => { + if (val == null) { + return val; + } + if (typeof val === "number") { + } + if (typeof val === "string") { + const lowercase = val.toLowerCase(); + if (val !== "" && lowercase !== "false" && lowercase !== "true") { + const warning = new Error(`Received string "${val}" where a boolean was expected.`); + warning.name = "Warning"; + console.warn(warning); + } + return val !== "" && lowercase !== "false"; + } + return val; +}; +exports._toBool = _toBool; +const _toNum = (val) => { + if (val == null) { + return val; + } + if (typeof val === "boolean") { + } + if (typeof val === "string") { + const num = Number(val); + if (num.toString() !== val) { + const warning = new Error(`Received string "${val}" where a number was expected.`); + warning.name = "Warning"; + console.warn(warning); + return val; + } + return num; + } + return val; +}; +exports._toNum = _toNum; + + /***/ }), /***/ 53069: @@ -34527,6 +34442,7 @@ tslib_1.__exportStar(__nccwpck_require__(53069), exports); Object.defineProperty(exports, "__esModule", ({ value: true })); const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(26133), exports); tslib_1.__exportStar(__nccwpck_require__(11823), exports); @@ -36816,7 +36732,7 @@ const smithy_client_2 = __nccwpck_require__(63570); const url_parser_1 = __nccwpck_require__(14681); const util_base64_1 = __nccwpck_require__(75600); const util_utf8_1 = __nccwpck_require__(41895); -const util_endpoints_1 = __nccwpck_require__(13350); +const util_endpoints_1 = __nccwpck_require__(45473); var s = "required"; var t = "fn"; var u = "argv"; @@ -38081,485 +37997,22 @@ exports.writeSSOTokenToFile = writeSSOTokenToFile; /***/ }), -/***/ 52562: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 26913: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HttpAuthLocation = void 0; -var types_1 = __nccwpck_require__(55756); -Object.defineProperty(exports, "HttpAuthLocation", ({ enumerable: true, get: function () { return types_1.HttpAuthLocation; } })); - - -/***/ }), - -/***/ 14994: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 65861: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 76527: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 48470: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 28045: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 67736: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 13268: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 90142: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HostAddressType = void 0; -var HostAddressType; -(function (HostAddressType) { - HostAddressType["AAAA"] = "AAAA"; - HostAddressType["A"] = "A"; -})(HostAddressType = exports.HostAddressType || (exports.HostAddressType = {})); - - -/***/ }), - -/***/ 62338: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 99385: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.EndpointURLScheme = void 0; -var types_1 = __nccwpck_require__(55756); -Object.defineProperty(exports, "EndpointURLScheme", ({ enumerable: true, get: function () { return types_1.EndpointURLScheme; } })); - - -/***/ }), - -/***/ 37521: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 76244: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 61393: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 51821: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 92635: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 71301: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 21268: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 7192: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 10640: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(51821), exports); -tslib_1.__exportStar(__nccwpck_require__(92635), exports); -tslib_1.__exportStar(__nccwpck_require__(71301), exports); -tslib_1.__exportStar(__nccwpck_require__(21268), exports); -tslib_1.__exportStar(__nccwpck_require__(7192), exports); - - -/***/ }), - -/***/ 89029: +/***/ 15011: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(52562), exports); -tslib_1.__exportStar(__nccwpck_require__(26913), exports); -tslib_1.__exportStar(__nccwpck_require__(14994), exports); -tslib_1.__exportStar(__nccwpck_require__(65861), exports); -tslib_1.__exportStar(__nccwpck_require__(76527), exports); -tslib_1.__exportStar(__nccwpck_require__(48470), exports); -tslib_1.__exportStar(__nccwpck_require__(28045), exports); -tslib_1.__exportStar(__nccwpck_require__(67736), exports); -tslib_1.__exportStar(__nccwpck_require__(13268), exports); -tslib_1.__exportStar(__nccwpck_require__(90142), exports); -tslib_1.__exportStar(__nccwpck_require__(62338), exports); -tslib_1.__exportStar(__nccwpck_require__(99385), exports); -tslib_1.__exportStar(__nccwpck_require__(37521), exports); -tslib_1.__exportStar(__nccwpck_require__(76244), exports); -tslib_1.__exportStar(__nccwpck_require__(61393), exports); -tslib_1.__exportStar(__nccwpck_require__(10640), exports); -tslib_1.__exportStar(__nccwpck_require__(89910), exports); -tslib_1.__exportStar(__nccwpck_require__(36678), exports); -tslib_1.__exportStar(__nccwpck_require__(39931), exports); -tslib_1.__exportStar(__nccwpck_require__(42620), exports); -tslib_1.__exportStar(__nccwpck_require__(89062), exports); -tslib_1.__exportStar(__nccwpck_require__(89546), exports); -tslib_1.__exportStar(__nccwpck_require__(80316), exports); -tslib_1.__exportStar(__nccwpck_require__(57835), exports); -tslib_1.__exportStar(__nccwpck_require__(91678), exports); -tslib_1.__exportStar(__nccwpck_require__(93818), exports); -tslib_1.__exportStar(__nccwpck_require__(51991), exports); -tslib_1.__exportStar(__nccwpck_require__(24296), exports); -tslib_1.__exportStar(__nccwpck_require__(59416), exports); -tslib_1.__exportStar(__nccwpck_require__(92772), exports); -tslib_1.__exportStar(__nccwpck_require__(20134), exports); -tslib_1.__exportStar(__nccwpck_require__(34465), exports); - - -/***/ }), - -/***/ 89910: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 36678: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 39931: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 42620: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 89062: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 89546: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 80316: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 57835: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 91678: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 93818: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 51991: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 24296: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 59416: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RequestHandlerProtocol = void 0; -var types_1 = __nccwpck_require__(55756); -Object.defineProperty(exports, "RequestHandlerProtocol", ({ enumerable: true, get: function () { return types_1.RequestHandlerProtocol; } })); - - -/***/ }), - -/***/ 92772: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 20134: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 34465: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 81809: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.debugId = void 0; -exports.debugId = "endpoints"; - - -/***/ }), - -/***/ 27617: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(81809), exports); -tslib_1.__exportStar(__nccwpck_require__(46833), exports); - - -/***/ }), - -/***/ 46833: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.toDebugString = void 0; -function toDebugString(input) { - if (typeof input !== "object" || input == null) { - return input; - } - if ("ref" in input) { - return `$${toDebugString(input.ref)}`; - } - if ("fn" in input) { - return `${input.fn}(${(input.argv || []).map(toDebugString).join(", ")})`; - } - return JSON.stringify(input, null, 2); -} -exports.toDebugString = toDebugString; +const util_endpoints_1 = __nccwpck_require__(45473); +const isVirtualHostableS3Bucket_1 = __nccwpck_require__(48079); +const parseArn_1 = __nccwpck_require__(34711); +const partition_1 = __nccwpck_require__(37482); +const awsEndpointFunctions = { + isVirtualHostableS3Bucket: isVirtualHostableS3Bucket_1.isVirtualHostableS3Bucket, + parseArn: parseArn_1.parseArn, + partition: partition_1.partition, +}; +util_endpoints_1.customEndpointFunctions.aws = awsEndpointFunctions; /***/ }), @@ -38571,26 +38024,13 @@ exports.toDebugString = toDebugString; Object.defineProperty(exports, "__esModule", ({ value: true })); const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(15011), exports); tslib_1.__exportStar(__nccwpck_require__(37482), exports); tslib_1.__exportStar(__nccwpck_require__(92830), exports); tslib_1.__exportStar(__nccwpck_require__(36563), exports); tslib_1.__exportStar(__nccwpck_require__(57433), exports); -/***/ }), - -/***/ 46835: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(48079), exports); -tslib_1.__exportStar(__nccwpck_require__(34711), exports); -tslib_1.__exportStar(__nccwpck_require__(37482), exports); - - /***/ }), /***/ 48079: @@ -38600,8 +38040,8 @@ tslib_1.__exportStar(__nccwpck_require__(37482), exports); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isVirtualHostableS3Bucket = void 0; +const util_endpoints_1 = __nccwpck_require__(45473); const isIpAddress_1 = __nccwpck_require__(92830); -const isValidHostLabel_1 = __nccwpck_require__(57373); const isVirtualHostableS3Bucket = (value, allowSubDomains = false) => { if (allowSubDomains) { for (const label of value.split(".")) { @@ -38611,7 +38051,7 @@ const isVirtualHostableS3Bucket = (value, allowSubDomains = false) => { } return true; } - if (!(0, isValidHostLabel_1.isValidHostLabel)(value)) { + if (!(0, util_endpoints_1.isValidHostLabel)(value)) { return false; } if (value.length < 3 || value.length > 63) { @@ -38714,3633 +38154,2111 @@ exports.getUserAgentPrefix = getUserAgentPrefix; /***/ }), -/***/ 55370: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.booleanEquals = void 0; -const booleanEquals = (value1, value2) => value1 === value2; -exports.booleanEquals = booleanEquals; - - -/***/ }), - -/***/ 20767: +/***/ 92830: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getAttr = void 0; -const types_1 = __nccwpck_require__(57433); -const getAttrPathList_1 = __nccwpck_require__(81844); -const getAttr = (value, path) => (0, getAttrPathList_1.getAttrPathList)(path).reduce((acc, index) => { - if (typeof acc !== "object") { - throw new types_1.EndpointError(`Index '${index}' in '${path}' not found in '${JSON.stringify(value)}'`); - } - else if (Array.isArray(acc)) { - return acc[parseInt(index)]; - } - return acc[index]; -}, value); -exports.getAttr = getAttr; +exports.isIpAddress = void 0; +var util_endpoints_1 = __nccwpck_require__(45473); +Object.defineProperty(exports, "isIpAddress", ({ enumerable: true, get: function () { return util_endpoints_1.isIpAddress; } })); /***/ }), -/***/ 81844: +/***/ 36563: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getAttrPathList = void 0; -const types_1 = __nccwpck_require__(57433); -const getAttrPathList = (path) => { - const parts = path.split("."); - const pathList = []; - for (const part of parts) { - const squareBracketIndex = part.indexOf("["); - if (squareBracketIndex !== -1) { - if (part.indexOf("]") !== part.length - 1) { - throw new types_1.EndpointError(`Path: '${path}' does not end with ']'`); - } - const arrayIndex = part.slice(squareBracketIndex + 1, -1); - if (Number.isNaN(parseInt(arrayIndex))) { - throw new types_1.EndpointError(`Invalid array index: '${arrayIndex}' in path: '${path}'`); - } - if (squareBracketIndex !== 0) { - pathList.push(part.slice(0, squareBracketIndex)); - } - pathList.push(arrayIndex); - } - else { - pathList.push(part); - } - } - return pathList; -}; -exports.getAttrPathList = getAttrPathList; +exports.resolveEndpoint = void 0; +var util_endpoints_1 = __nccwpck_require__(45473); +Object.defineProperty(exports, "resolveEndpoint", ({ enumerable: true, get: function () { return util_endpoints_1.resolveEndpoint; } })); /***/ }), -/***/ 83188: +/***/ 82605: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.aws = void 0; -const tslib_1 = __nccwpck_require__(4351); -exports.aws = tslib_1.__importStar(__nccwpck_require__(46835)); -tslib_1.__exportStar(__nccwpck_require__(55370), exports); -tslib_1.__exportStar(__nccwpck_require__(20767), exports); -tslib_1.__exportStar(__nccwpck_require__(78816), exports); -tslib_1.__exportStar(__nccwpck_require__(57373), exports); -tslib_1.__exportStar(__nccwpck_require__(29692), exports); -tslib_1.__exportStar(__nccwpck_require__(22780), exports); -tslib_1.__exportStar(__nccwpck_require__(55182), exports); -tslib_1.__exportStar(__nccwpck_require__(48305), exports); -tslib_1.__exportStar(__nccwpck_require__(6535), exports); +exports.EndpointError = void 0; +var util_endpoints_1 = __nccwpck_require__(45473); +Object.defineProperty(exports, "EndpointError", ({ enumerable: true, get: function () { return util_endpoints_1.EndpointError; } })); /***/ }), -/***/ 92830: +/***/ 21261: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isIpAddress = void 0; -const IP_V4_REGEX = new RegExp(`^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}$`); -const isIpAddress = (value) => IP_V4_REGEX.test(value) || (value.startsWith("[") && value.endsWith("]")); -exports.isIpAddress = isIpAddress; /***/ }), -/***/ 78816: +/***/ 20312: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isSet = void 0; -const isSet = (value) => value != null; -exports.isSet = isSet; /***/ }), -/***/ 57373: +/***/ 56083: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isValidHostLabel = void 0; -const VALID_HOST_LABEL_REGEX = new RegExp(`^(?!.*-$)(?!-)[a-zA-Z0-9-]{1,63}$`); -const isValidHostLabel = (value, allowSubDomains = false) => { - if (!allowSubDomains) { - return VALID_HOST_LABEL_REGEX.test(value); - } - const labels = value.split("."); - for (const label of labels) { - if (!(0, exports.isValidHostLabel)(label)) { - return false; - } - } - return true; -}; -exports.isValidHostLabel = isValidHostLabel; /***/ }), -/***/ 29692: +/***/ 21767: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.not = void 0; -const not = (value) => !value; -exports.not = not; /***/ }), -/***/ 22780: +/***/ 57433: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.parseURL = void 0; -const types_1 = __nccwpck_require__(89029); -const isIpAddress_1 = __nccwpck_require__(92830); -const DEFAULT_PORTS = { - [types_1.EndpointURLScheme.HTTP]: 80, - [types_1.EndpointURLScheme.HTTPS]: 443, -}; -const parseURL = (value) => { - const whatwgURL = (() => { - try { - if (value instanceof URL) { - return value; - } - if (typeof value === "object" && "hostname" in value) { - const { hostname, port, protocol = "", path = "", query = {} } = value; - const url = new URL(`${protocol}//${hostname}${port ? `:${port}` : ""}${path}`); - url.search = Object.entries(query) - .map(([k, v]) => `${k}=${v}`) - .join("&"); - return url; - } - return new URL(value); - } - catch (error) { - return null; - } - })(); - if (!whatwgURL) { - console.error(`Unable to parse ${JSON.stringify(value)} as a whatwg URL.`); - return null; - } - const urlString = whatwgURL.href; - const { host, hostname, pathname, protocol, search } = whatwgURL; - if (search) { - return null; - } - const scheme = protocol.slice(0, -1); - if (!Object.values(types_1.EndpointURLScheme).includes(scheme)) { - return null; - } - const isIp = (0, isIpAddress_1.isIpAddress)(hostname); - const inputContainsDefaultPort = urlString.includes(`${host}:${DEFAULT_PORTS[scheme]}`) || - (typeof value === "string" && value.includes(`${host}:${DEFAULT_PORTS[scheme]}`)); - const authority = `${host}${inputContainsDefaultPort ? `:${DEFAULT_PORTS[scheme]}` : ``}`; - return { - scheme, - authority, - path: pathname, - normalizedPath: pathname.endsWith("/") ? pathname : `${pathname}/`, - isIp, - }; -}; -exports.parseURL = parseURL; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(82605), exports); +tslib_1.__exportStar(__nccwpck_require__(21261), exports); +tslib_1.__exportStar(__nccwpck_require__(20312), exports); +tslib_1.__exportStar(__nccwpck_require__(56083), exports); +tslib_1.__exportStar(__nccwpck_require__(21767), exports); +tslib_1.__exportStar(__nccwpck_require__(41811), exports); /***/ }), -/***/ 55182: +/***/ 41811: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.stringEquals = void 0; -const stringEquals = (value1, value2) => value1 === value2; -exports.stringEquals = stringEquals; /***/ }), -/***/ 48305: +/***/ 5865: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.substring = void 0; -const substring = (input, start, stop, reverse) => { - if (start >= stop || input.length < stop) { - return null; - } - if (!reverse) { - return input.substring(start, stop); - } - return input.substring(input.length - stop, input.length - start); +exports.crtAvailability = void 0; +exports.crtAvailability = { + isCrtAvailable: false, }; -exports.substring = substring; - - -/***/ }), - -/***/ 6535: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.uriEncode = void 0; -const uriEncode = (value) => encodeURIComponent(value).replace(/[!*'()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`); -exports.uriEncode = uriEncode; /***/ }), -/***/ 36563: +/***/ 98095: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveEndpoint = void 0; -const debug_1 = __nccwpck_require__(27617); -const types_1 = __nccwpck_require__(57433); -const utils_1 = __nccwpck_require__(81114); -const resolveEndpoint = (ruleSetObject, options) => { - var _a, _b, _c, _d, _e, _f; - const { endpointParams, logger } = options; - const { parameters, rules } = ruleSetObject; - (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, `${debug_1.debugId} Initial EndpointParams: ${(0, debug_1.toDebugString)(endpointParams)}`); - const paramsWithDefault = Object.entries(parameters) - .filter(([, v]) => v.default != null) - .map(([k, v]) => [k, v.default]); - if (paramsWithDefault.length > 0) { - for (const [paramKey, paramDefaultValue] of paramsWithDefault) { - endpointParams[paramKey] = (_c = endpointParams[paramKey]) !== null && _c !== void 0 ? _c : paramDefaultValue; - } +exports.defaultUserAgent = exports.UA_APP_ID_INI_NAME = exports.UA_APP_ID_ENV_NAME = exports.crtAvailability = void 0; +const node_config_provider_1 = __nccwpck_require__(33461); +const os_1 = __nccwpck_require__(22037); +const process_1 = __nccwpck_require__(77282); +const is_crt_available_1 = __nccwpck_require__(68390); +var crt_availability_1 = __nccwpck_require__(5865); +Object.defineProperty(exports, "crtAvailability", ({ enumerable: true, get: function () { return crt_availability_1.crtAvailability; } })); +exports.UA_APP_ID_ENV_NAME = "AWS_SDK_UA_APP_ID"; +exports.UA_APP_ID_INI_NAME = "sdk-ua-app-id"; +const defaultUserAgent = ({ serviceId, clientVersion }) => { + const sections = [ + ["aws-sdk-js", clientVersion], + ["ua", "2.0"], + [`os/${(0, os_1.platform)()}`, (0, os_1.release)()], + ["lang/js"], + ["md/nodejs", `${process_1.versions.node}`], + ]; + const crtAvailable = (0, is_crt_available_1.isCrtAvailable)(); + if (crtAvailable) { + sections.push(crtAvailable); } - const requiredParams = Object.entries(parameters) - .filter(([, v]) => v.required) - .map(([k]) => k); - for (const requiredParam of requiredParams) { - if (endpointParams[requiredParam] == null) { - throw new types_1.EndpointError(`Missing required parameter: '${requiredParam}'`); - } + if (serviceId) { + sections.push([`api/${serviceId}`, clientVersion]); } - const endpoint = (0, utils_1.evaluateRules)(rules, { endpointParams, logger, referenceRecord: {} }); - if ((_d = options.endpointParams) === null || _d === void 0 ? void 0 : _d.Endpoint) { - try { - const givenEndpoint = new URL(options.endpointParams.Endpoint); - const { protocol, port } = givenEndpoint; - endpoint.url.protocol = protocol; - endpoint.url.port = port; - } - catch (e) { - } + if (process_1.env.AWS_EXECUTION_ENV) { + sections.push([`exec-env/${process_1.env.AWS_EXECUTION_ENV}`]); } - (_f = (_e = options.logger) === null || _e === void 0 ? void 0 : _e.debug) === null || _f === void 0 ? void 0 : _f.call(_e, `${debug_1.debugId} Resolved endpoint: ${(0, debug_1.toDebugString)(endpoint)}`); - return endpoint; + const appIdPromise = (0, node_config_provider_1.loadConfig)({ + environmentVariableSelector: (env) => env[exports.UA_APP_ID_ENV_NAME], + configFileSelector: (profile) => profile[exports.UA_APP_ID_INI_NAME], + default: undefined, + })(); + let resolvedUserAgent = undefined; + return async () => { + if (!resolvedUserAgent) { + const appId = await appIdPromise; + resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; + } + return resolvedUserAgent; + }; }; -exports.resolveEndpoint = resolveEndpoint; +exports.defaultUserAgent = defaultUserAgent; /***/ }), -/***/ 82605: -/***/ ((__unused_webpack_module, exports) => { +/***/ 68390: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.EndpointError = void 0; -class EndpointError extends Error { - constructor(message) { - super(message); - this.name = "EndpointError"; +exports.isCrtAvailable = void 0; +const crt_availability_1 = __nccwpck_require__(5865); +const isCrtAvailable = () => { + if (crt_availability_1.crtAvailability.isCrtAvailable) { + return ["md/crt-avail"]; } -} -exports.EndpointError = EndpointError; + return null; +}; +exports.isCrtAvailable = isCrtAvailable; /***/ }), -/***/ 21261: -/***/ ((__unused_webpack_module, exports) => { +/***/ 28172: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.toUtf8 = exports.fromUtf8 = void 0; +const pureJs_1 = __nccwpck_require__(21590); +const whatwgEncodingApi_1 = __nccwpck_require__(89215); +const fromUtf8 = (input) => typeof TextEncoder === "function" ? (0, whatwgEncodingApi_1.fromUtf8)(input) : (0, pureJs_1.fromUtf8)(input); +exports.fromUtf8 = fromUtf8; +const toUtf8 = (input) => typeof TextDecoder === "function" ? (0, whatwgEncodingApi_1.toUtf8)(input) : (0, pureJs_1.toUtf8)(input); +exports.toUtf8 = toUtf8; /***/ }), -/***/ 20312: +/***/ 21590: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.toUtf8 = exports.fromUtf8 = void 0; +const fromUtf8 = (input) => { + const bytes = []; + for (let i = 0, len = input.length; i < len; i++) { + const value = input.charCodeAt(i); + if (value < 0x80) { + bytes.push(value); + } + else if (value < 0x800) { + bytes.push((value >> 6) | 0b11000000, (value & 0b111111) | 0b10000000); + } + else if (i + 1 < input.length && (value & 0xfc00) === 0xd800 && (input.charCodeAt(i + 1) & 0xfc00) === 0xdc00) { + const surrogatePair = 0x10000 + ((value & 0b1111111111) << 10) + (input.charCodeAt(++i) & 0b1111111111); + bytes.push((surrogatePair >> 18) | 0b11110000, ((surrogatePair >> 12) & 0b111111) | 0b10000000, ((surrogatePair >> 6) & 0b111111) | 0b10000000, (surrogatePair & 0b111111) | 0b10000000); + } + else { + bytes.push((value >> 12) | 0b11100000, ((value >> 6) & 0b111111) | 0b10000000, (value & 0b111111) | 0b10000000); + } + } + return Uint8Array.from(bytes); +}; +exports.fromUtf8 = fromUtf8; +const toUtf8 = (input) => { + let decoded = ""; + for (let i = 0, len = input.length; i < len; i++) { + const byte = input[i]; + if (byte < 0x80) { + decoded += String.fromCharCode(byte); + } + else if (0b11000000 <= byte && byte < 0b11100000) { + const nextByte = input[++i]; + decoded += String.fromCharCode(((byte & 0b11111) << 6) | (nextByte & 0b111111)); + } + else if (0b11110000 <= byte && byte < 0b101101101) { + const surrogatePair = [byte, input[++i], input[++i], input[++i]]; + const encoded = "%" + surrogatePair.map((byteValue) => byteValue.toString(16)).join("%"); + decoded += decodeURIComponent(encoded); + } + else { + decoded += String.fromCharCode(((byte & 0b1111) << 12) | ((input[++i] & 0b111111) << 6) | (input[++i] & 0b111111)); + } + } + return decoded; +}; +exports.toUtf8 = toUtf8; /***/ }), -/***/ 56083: +/***/ 89215: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.toUtf8 = exports.fromUtf8 = void 0; +function fromUtf8(input) { + return new TextEncoder().encode(input); +} +exports.fromUtf8 = fromUtf8; +function toUtf8(input) { + return new TextDecoder("utf-8").decode(input); +} +exports.toUtf8 = toUtf8; /***/ }), -/***/ 21767: -/***/ ((__unused_webpack_module, exports) => { +/***/ 838: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); - +exports.Database = void 0; +const entity_1 = __nccwpck_require__(86828); +const relationship_1 = __nccwpck_require__(39306); +class Database { + static entitiesOnly(entities) { + return new Database(entities, relationship_1.NO_RELATIONSHIPS); + } + constructor(entities, relationships) { + this.idCtr = 0; + this.schema = { + ...entities, + ...relationships({ + relationship: (fromKey, toKey) => (0, relationship_1.relationshipCollection)((id) => this.get(fromKey, id), (id) => this.get(toKey, id)), + }), + }; + } + id() { + return `${this.idCtr++}`; + } + /** + * Allocate an ID and store + */ + allocate(key, entity) { + return this.store(key, this.e(entity)); + } + /** + * Store with a preallocated ID + */ + store(key, entity) { + const coll = this.schema[key]; + coll.add(entity); + return entity; + } + /** + * Get an entity by key + */ + get(key, id) { + const coll = this.schema[key]; + const ret = coll.entities.get(typeof id === 'string' ? id : id.$ref); + if (!ret) { + throw new Error(`No such ${String(key)}: ${id}`); + } + return ret; + } + /** + * All entities of a given type + */ + all(key) { + const coll = this.schema[key]; + return Array.from(coll.entities.values()); + } + /** + * Lookup an entity by index + */ + lookup(key, index, lookup, value) { + const coll = this.schema[key]; + const ids = coll.indexes[index].lookups[lookup](value); + return addOnlyMethod(ids.map((id) => coll.entities.get(id)), `${String(key)} with ${String(index)} ${String(lookup)} ${JSON.stringify(value)}`); + } + /** + * Allocate an ID and store if the entity does not yet exist + */ + findOrAllocate(key, index, lookup, entity) { + const res = this.lookup(key, index, lookup, entity[index]); + if (res.length) { + return res.only(); + } + return this.allocate(key, entity); + } + link(key, from, to, attributes) { + const col = this.schema[key]; + col.add(from, to, attributes); + } + /** + * Follow a link + */ + follow(key, from) { + var _a; + const col = this.schema[key]; + const toLinks = (_a = col.forward.get(from.$id)) !== null && _a !== void 0 ? _a : []; + const ret = toLinks.map((i) => ({ entity: col.toColl(i.$id), ...removeId(i) })); + return addOnlyMethod(ret, `${String(key)} from ${from}`); + } + /** + * Follow incoming links backwards + */ + incoming(key, to) { + var _a; + const col = this.schema[key]; + const fromIds = (_a = col.backward.get(to.$id)) !== null && _a !== void 0 ? _a : []; + const ret = fromIds.map((i) => ({ entity: col.fromColl(i.$id), ...removeId(i) })); + return addOnlyMethod(ret, `${String(key)} to ${to}`); + } + e(entity) { + return { + $id: this.id(), + ...entity, + }; + } + /** + * Turn the current database collection into something that can be stored. + */ + save() { + return { + idCtr: this.idCtr, + schema: dehydrate(this.schema), + }; + function dehydrate(x) { + if ((0, entity_1.isEntityCollection)(x)) { + return x.dehydrate(); + } + if ((0, relationship_1.isRelationshipCollection)(x)) { + return x.dehydrate(); + } + if (Array.isArray(x)) { + return x.map(dehydrate); + } + if (!!x && typeof x === 'object') { + return Object.fromEntries(Object.entries(x).map(([k, v]) => [k, dehydrate(v)])); + } + return x; + } + } + load(db) { + this.idCtr = db.idCtr; + hydrate(this.schema, db.schema); + function hydrate(proto, x) { + if ((0, entity_1.isEntityCollection)(proto)) { + proto.hydrateFrom(x); + } + if ((0, relationship_1.isRelationshipCollection)(proto)) { + proto.hydrateFrom(x); + } + if (Array.isArray(x)) { + x.forEach(hydrate); + } + if (!!proto && typeof proto === 'object' && !!x && typeof x === 'object') { + for (const [k, v] of Object.entries(proto)) { + hydrate(v, x[k]); + } + } + } + } +} +exports.Database = Database; +function removeId(x) { + const ret = { ...x }; + delete ret.$id; + return ret; +} +function addOnlyMethod(xs, description) { + return Object.defineProperties(xs, { + only: { + enumerable: false, + value: () => { + if (xs.length !== 1) { + throw new Error(`Expected exactly 1 ${description}, found ${xs.length}`); + } + return xs[0]; + }, + }, + }); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUNBQXVHO0FBQ3ZHLGlEQU13QjtBQVN4QixNQUFhLFFBQVE7SUFDWixNQUFNLENBQUMsWUFBWSxDQUFvQixRQUFZO1FBQ3hELE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLCtCQUFnQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUtELFlBQVksUUFBWSxFQUFFLGFBQWtEO1FBRnBFLFVBQUssR0FBRyxDQUFDLENBQUM7UUFHaEIsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLEdBQUcsUUFBUTtZQUNYLEdBQUcsYUFBYSxDQUFDO2dCQUNmLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUMvQixJQUFBLHFDQUFzQixFQUNwQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQzdCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FDNUI7YUFDSixDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTSxFQUFFO1FBQ1AsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBcUIsR0FBTSxFQUFFLE1BQWdDO1FBQzFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBcUIsR0FBTSxFQUFFLE1BQXlCO1FBQ2hFLE1BQU0sSUFBSSxHQUEwQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBUSxDQUFDO1FBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakIsT0FBTyxNQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksR0FBRyxDQUFxQixHQUFNLEVBQUUsRUFBeUM7UUFDOUUsTUFBTSxJQUFJLEdBQTBCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFRLENBQUM7UUFDNUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7O09BRUc7SUFDSSxHQUFHLENBQXFCLEdBQU07UUFDbkMsTUFBTSxJQUFJLEdBQTBCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFRLENBQUM7UUFDNUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQ1gsR0FBTSxFQUNOLEtBQVEsRUFDUixNQUFvQyxFQUNwQyxLQUFxQztRQUVyQyxNQUFNLElBQUksR0FBMEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVEsQ0FBQztRQUM1RCxNQUFNLEdBQUcsR0FBSSxJQUFJLENBQUMsT0FBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRSxPQUFPLGFBQWEsQ0FDbEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDOUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ2xGLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxjQUFjLENBQ25CLEdBQU0sRUFDTixLQUFRLEVBQ1IsTUFBb0MsRUFDcEMsTUFBZ0M7UUFFaEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7WUFDZCxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNuQjtRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQWNNLElBQUksQ0FDVCxHQUFNLEVBQ04sSUFBNEIsRUFDNUIsRUFBd0IsRUFDeEIsVUFBbUM7UUFFbkMsTUFBTSxHQUFHLEdBQWdDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFRLENBQUM7UUFDakUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FDWCxHQUFNLEVBQ04sSUFBNEI7O1FBRTVCLE1BQU0sR0FBRyxHQUFnQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBUSxDQUFDO1FBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQUEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQ0FBSSxFQUFFLENBQUM7UUFDaEQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBVSxDQUFBLENBQUMsQ0FBQztRQUV2RixPQUFPLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQ2IsR0FBTSxFQUNOLEVBQXdCOztRQUV4QixNQUFNLEdBQUcsR0FBZ0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVEsQ0FBQztRQUNqRSxNQUFNLE9BQU8sR0FBRyxNQUFBLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsbUNBQUksRUFBRSxDQUFDO1FBQy9DLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQVUsQ0FBQSxDQUFDLENBQUM7UUFFekYsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLENBQUMsQ0FBbUIsTUFBZ0I7UUFDekMsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2QsR0FBRyxNQUFNO1NBQ0gsQ0FBQztJQUNYLENBQUM7SUFFRDs7T0FFRztJQUNJLElBQUk7UUFDVCxPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUMvQixDQUFDO1FBRUYsU0FBUyxTQUFTLENBQUMsQ0FBVTtZQUMzQixJQUFJLElBQUEsMkJBQWtCLEVBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxJQUFBLHVDQUF3QixFQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUMvQixPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUN0QjtZQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3pCO1lBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDaEMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqRjtZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFFTSxJQUFJLENBQUMsRUFBc0I7UUFDaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVoQyxTQUFTLE9BQU8sQ0FBQyxLQUFjLEVBQUUsQ0FBVTtZQUN6QyxJQUFJLElBQUEsMkJBQWtCLEVBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzdCLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEI7WUFDRCxJQUFJLElBQUEsdUNBQXdCLEVBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ25DLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEI7WUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDcEI7WUFDRCxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO2dCQUN4RSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDMUMsT0FBTyxDQUFDLENBQUMsRUFBRyxDQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0I7YUFDRjtRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF0TUQsNEJBc01DO0FBT0QsU0FBUyxRQUFRLENBQW1CLENBQUk7SUFDdEMsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ3JCLE9BQVEsR0FBVyxDQUFDLEdBQUcsQ0FBQztJQUN4QixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFzQ0QsU0FBUyxhQUFhLENBQUksRUFBTyxFQUFFLFdBQW1CO0lBQ3BELE9BQU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRTtRQUNqQyxJQUFJLEVBQUU7WUFDSixVQUFVLEVBQUUsS0FBSztZQUNqQixLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLFdBQVcsV0FBVyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDMUU7Z0JBQ0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixDQUFDO1NBQ0Y7S0FDRixDQUFRLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlDb2xsZWN0aW9uLCBFbnRpdHlJbmRleCwgaXNFbnRpdHlDb2xsZWN0aW9uLCBQbGFpbiwgUmVmZXJlbmNlIH0gZnJvbSAnLi9lbnRpdHknO1xuaW1wb3J0IHtcbiAgaXNSZWxhdGlvbnNoaXBDb2xsZWN0aW9uLFxuICBOT19SRUxBVElPTlNISVBTLFxuICBSZWxhdGlvbnNoaXAsXG4gIHJlbGF0aW9uc2hpcENvbGxlY3Rpb24sXG4gIFJlbGF0aW9uc2hpcENvbGxlY3Rpb24sXG59IGZyb20gJy4vcmVsYXRpb25zaGlwJztcblxuZXhwb3J0IGludGVyZmFjZSBSZWxhdGlvbnNoaXBzQnVpbGRlcjxFUyBleHRlbmRzIG9iamVjdD4ge1xuICByZWxhdGlvbnNoaXA8UiBleHRlbmRzIFJlbGF0aW9uc2hpcDxhbnksIGFueSwgYW55Pj4oXG4gICAgZnJvbUtleTogS2V5c0ZvcjxFUywgRW50aXR5Q29sbGVjdGlvbjxSWydmcm9tJ10sIGFueT4+LFxuICAgIHRvS2V5OiBLZXlzRm9yPEVTLCBFbnRpdHlDb2xsZWN0aW9uPFJbJ3RvJ10sIGFueT4+LFxuICApOiBSZWxhdGlvbnNoaXBDb2xsZWN0aW9uPFI+O1xufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2U8RVMgZXh0ZW5kcyBvYmplY3QsIFJTIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHB1YmxpYyBzdGF0aWMgZW50aXRpZXNPbmx5PEVTIGV4dGVuZHMgb2JqZWN0PihlbnRpdGllczogRVMpOiBEYXRhYmFzZTxFUywge30+IHtcbiAgICByZXR1cm4gbmV3IERhdGFiYXNlKGVudGl0aWVzLCBOT19SRUxBVElPTlNISVBTKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hOiBFUyAmIFJTO1xuICBwcml2YXRlIGlkQ3RyID0gMDtcblxuICBjb25zdHJ1Y3RvcihlbnRpdGllczogRVMsIHJlbGF0aW9uc2hpcHM6ICh4OiBSZWxhdGlvbnNoaXBzQnVpbGRlcjxFUz4pID0+IFJTKSB7XG4gICAgdGhpcy5zY2hlbWEgPSB7XG4gICAgICAuLi5lbnRpdGllcyxcbiAgICAgIC4uLnJlbGF0aW9uc2hpcHMoe1xuICAgICAgICByZWxhdGlvbnNoaXA6IChmcm9tS2V5LCB0b0tleSkgPT5cbiAgICAgICAgICByZWxhdGlvbnNoaXBDb2xsZWN0aW9uKFxuICAgICAgICAgICAgKGlkKSA9PiB0aGlzLmdldChmcm9tS2V5LCBpZCksXG4gICAgICAgICAgICAoaWQpID0+IHRoaXMuZ2V0KHRvS2V5LCBpZCksXG4gICAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgaWQoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuaWRDdHIrK31gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG9jYXRlIGFuIElEIGFuZCBzdG9yZVxuICAgKi9cbiAgcHVibGljIGFsbG9jYXRlPEsgZXh0ZW5kcyBrZXlvZiBFUz4oa2V5OiBLLCBlbnRpdHk6IFBsYWluPEVudGl0eVR5cGU8RVNbS10+Pik6IEVudGl0eVR5cGU8RVNbS10+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZShrZXksIHRoaXMuZShlbnRpdHkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSB3aXRoIGEgcHJlYWxsb2NhdGVkIElEXG4gICAqL1xuICBwdWJsaWMgc3RvcmU8SyBleHRlbmRzIGtleW9mIEVTPihrZXk6IEssIGVudGl0eTogRW50aXR5VHlwZTxFU1tLXT4pOiBFbnRpdHlUeXBlPEVTW0tdPiB7XG4gICAgY29uc3QgY29sbDogRW50aXR5Q29sbGVjdGlvbjxhbnk+ID0gdGhpcy5zY2hlbWFba2V5XSBhcyBhbnk7XG4gICAgY29sbC5hZGQoZW50aXR5KTtcbiAgICByZXR1cm4gZW50aXR5IGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gZW50aXR5IGJ5IGtleVxuICAgKi9cbiAgcHVibGljIGdldDxLIGV4dGVuZHMga2V5b2YgRVM+KGtleTogSywgaWQ6IHN0cmluZyB8IFJlZmVyZW5jZTxFbnRpdHlUeXBlPEVTW0tdPj4pOiBFbnRpdHlUeXBlPEVTW0tdPiB7XG4gICAgY29uc3QgY29sbDogRW50aXR5Q29sbGVjdGlvbjxhbnk+ID0gdGhpcy5zY2hlbWFba2V5XSBhcyBhbnk7XG4gICAgY29uc3QgcmV0ID0gY29sbC5lbnRpdGllcy5nZXQodHlwZW9mIGlkID09PSAnc3RyaW5nJyA/IGlkIDogaWQuJHJlZik7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCAke1N0cmluZyhrZXkpfTogJHtpZH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgZW50aXRpZXMgb2YgYSBnaXZlbiB0eXBlXG4gICAqL1xuICBwdWJsaWMgYWxsPEsgZXh0ZW5kcyBrZXlvZiBFUz4oa2V5OiBLKTogQXJyYXk8RW50aXR5VHlwZTxFU1tLXT4+IHtcbiAgICBjb25zdCBjb2xsOiBFbnRpdHlDb2xsZWN0aW9uPGFueT4gPSB0aGlzLnNjaGVtYVtrZXldIGFzIGFueTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShjb2xsLmVudGl0aWVzLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rdXAgYW4gZW50aXR5IGJ5IGluZGV4XG4gICAqL1xuICBwdWJsaWMgbG9va3VwPEsgZXh0ZW5kcyBrZXlvZiBFUywgSSBleHRlbmRzIEluZGV4TmFtZXNPZjxFU1tLXT4+KFxuICAgIGtleTogSyxcbiAgICBpbmRleDogSSxcbiAgICBsb29rdXA6IEluZGV4T2Y8RVNbS10sIEk+Wydsb29rdXBzJ10sXG4gICAgdmFsdWU6IEluZGV4T2Y8RVNbS10sIEk+Wyd2YWx1ZVR5cGUnXSxcbiAgKTogUmljaFJlYWRvbmx5QXJyYXk8RW50aXR5VHlwZTxFU1tLXT4+IHtcbiAgICBjb25zdCBjb2xsOiBFbnRpdHlDb2xsZWN0aW9uPGFueT4gPSB0aGlzLnNjaGVtYVtrZXldIGFzIGFueTtcbiAgICBjb25zdCBpZHMgPSAoY29sbC5pbmRleGVzIGFzIGFueSlbaW5kZXhdLmxvb2t1cHNbbG9va3VwXSh2YWx1ZSk7XG4gICAgcmV0dXJuIGFkZE9ubHlNZXRob2QoXG4gICAgICBpZHMubWFwKChpZDogc3RyaW5nKSA9PiBjb2xsLmVudGl0aWVzLmdldChpZCkpLFxuICAgICAgYCR7U3RyaW5nKGtleSl9IHdpdGggJHtTdHJpbmcoaW5kZXgpfSAke1N0cmluZyhsb29rdXApfSAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb2NhdGUgYW4gSUQgYW5kIHN0b3JlIGlmIHRoZSBlbnRpdHkgZG9lcyBub3QgeWV0IGV4aXN0XG4gICAqL1xuICBwdWJsaWMgZmluZE9yQWxsb2NhdGU8SyBleHRlbmRzIGtleW9mIEVTLCBJIGV4dGVuZHMga2V5b2YgUGxhaW48RW50aXR5VHlwZTxFU1tLXT4+ICYgSW5kZXhOYW1lc09mPEVTW0tdPj4oXG4gICAga2V5OiBLLFxuICAgIGluZGV4OiBJLFxuICAgIGxvb2t1cDogSW5kZXhPZjxFU1tLXSwgST5bJ2xvb2t1cHMnXSxcbiAgICBlbnRpdHk6IFBsYWluPEVudGl0eVR5cGU8RVNbS10+PixcbiAgKTogRW50aXR5VHlwZTxFU1tLXT4ge1xuICAgIGNvbnN0IHJlcyA9IHRoaXMubG9va3VwKGtleSwgaW5kZXgsIGxvb2t1cCwgZW50aXR5W2luZGV4XSk7XG4gICAgaWYgKHJlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiByZXMub25seSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hbGxvY2F0ZShrZXksIGVudGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGVudGl0aWVzXG4gICAqXG4gICAqIE92ZXJsb2FkIHRvIGFjY291bnQgZm9yIHdoZXRoZXIgd2UgaGF2ZSBhdHRyaWJ1dGVzIG9yIG5vdC5cbiAgICovXG4gIHB1YmxpYyBsaW5rPEsgZXh0ZW5kcyBSZWxXQXR0cnM8UlM+PihcbiAgICBrZXk6IEssXG4gICAgZnJvbTogUmVsVHlwZTxSU1tLXT5bJ2Zyb20nXSxcbiAgICB0bzogUmVsVHlwZTxSU1tLXT5bJ3RvJ10sXG4gICAgYXR0cmlidXRlczogUmVsVHlwZTxSU1tLXT5bJ2F0dHInXSxcbiAgKTogdm9pZDtcbiAgcHVibGljIGxpbms8SyBleHRlbmRzIFJlbFdvQXR0cnM8UlM+PihrZXk6IEssIGZyb206IFJlbFR5cGU8UlNbS10+Wydmcm9tJ10sIHRvOiBSZWxUeXBlPFJTW0tdPlsndG8nXSk6IHZvaWQ7XG4gIHB1YmxpYyBsaW5rPEsgZXh0ZW5kcyBrZXlvZiBSUz4oXG4gICAga2V5OiBLLFxuICAgIGZyb206IFJlbFR5cGU8UlNbS10+Wydmcm9tJ10sXG4gICAgdG86IFJlbFR5cGU8UlNbS10+Wyd0byddLFxuICAgIGF0dHJpYnV0ZXM/OiBSZWxUeXBlPFJTW0tdPlsnYXR0ciddLFxuICApIHtcbiAgICBjb25zdCBjb2w6IFJlbGF0aW9uc2hpcENvbGxlY3Rpb248YW55PiA9IHRoaXMuc2NoZW1hW2tleV0gYXMgYW55O1xuICAgIGNvbC5hZGQoZnJvbSwgdG8sIGF0dHJpYnV0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvbGxvdyBhIGxpbmtcbiAgICovXG4gIHB1YmxpYyBmb2xsb3c8SyBleHRlbmRzIGtleW9mIFJTPihcbiAgICBrZXk6IEssXG4gICAgZnJvbTogUmVsVHlwZTxSU1tLXT5bJ2Zyb20nXSxcbiAgKTogUmljaFJlYWRvbmx5QXJyYXk8TGluazxSZWxUeXBlPFJTW0tdPlsndG8nXSwgUmVsVHlwZTxSU1tLXT5bJ2F0dHInXT4+IHtcbiAgICBjb25zdCBjb2w6IFJlbGF0aW9uc2hpcENvbGxlY3Rpb248YW55PiA9IHRoaXMuc2NoZW1hW2tleV0gYXMgYW55O1xuICAgIGNvbnN0IHRvTGlua3MgPSBjb2wuZm9yd2FyZC5nZXQoZnJvbS4kaWQpID8/IFtdO1xuICAgIGNvbnN0IHJldCA9IHRvTGlua3MubWFwKChpKSA9PiAoeyBlbnRpdHk6IGNvbC50b0NvbGwoaS4kaWQpLCAuLi5yZW1vdmVJZChpKSB9IGFzIGFueSkpO1xuXG4gICAgcmV0dXJuIGFkZE9ubHlNZXRob2QocmV0LCBgJHtTdHJpbmcoa2V5KX0gZnJvbSAke2Zyb219YCk7XG4gIH1cblxuICAvKipcbiAgICogRm9sbG93IGluY29taW5nIGxpbmtzIGJhY2t3YXJkc1xuICAgKi9cbiAgcHVibGljIGluY29taW5nPEsgZXh0ZW5kcyBrZXlvZiBSUz4oXG4gICAga2V5OiBLLFxuICAgIHRvOiBSZWxUeXBlPFJTW0tdPlsndG8nXSxcbiAgKTogUmljaFJlYWRvbmx5QXJyYXk8TGluazxSZWxUeXBlPFJTW0tdPlsnZnJvbSddLCBSZWxUeXBlPFJTW0tdPlsnYXR0ciddPj4ge1xuICAgIGNvbnN0IGNvbDogUmVsYXRpb25zaGlwQ29sbGVjdGlvbjxhbnk+ID0gdGhpcy5zY2hlbWFba2V5XSBhcyBhbnk7XG4gICAgY29uc3QgZnJvbUlkcyA9IGNvbC5iYWNrd2FyZC5nZXQodG8uJGlkKSA/PyBbXTtcbiAgICBjb25zdCByZXQgPSBmcm9tSWRzLm1hcCgoaSkgPT4gKHsgZW50aXR5OiBjb2wuZnJvbUNvbGwoaS4kaWQpLCAuLi5yZW1vdmVJZChpKSB9IGFzIGFueSkpO1xuXG4gICAgcmV0dXJuIGFkZE9ubHlNZXRob2QocmV0LCBgJHtTdHJpbmcoa2V5KX0gdG8gJHt0b31gKTtcbiAgfVxuXG4gIHB1YmxpYyBlPEUgZXh0ZW5kcyBFbnRpdHk+KGVudGl0eTogUGxhaW48RT4pOiBFIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGlkOiB0aGlzLmlkKCksXG4gICAgICAuLi5lbnRpdHksXG4gICAgfSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogVHVybiB0aGUgY3VycmVudCBkYXRhYmFzZSBjb2xsZWN0aW9uIGludG8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIHN0b3JlZC5cbiAgICovXG4gIHB1YmxpYyBzYXZlKCk6IERlaHlkcmF0ZWREYXRhYmFzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkQ3RyOiB0aGlzLmlkQ3RyLFxuICAgICAgc2NoZW1hOiBkZWh5ZHJhdGUodGhpcy5zY2hlbWEpLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBkZWh5ZHJhdGUoeDogdW5rbm93bik6IGFueSB7XG4gICAgICBpZiAoaXNFbnRpdHlDb2xsZWN0aW9uKHgpKSB7XG4gICAgICAgIHJldHVybiB4LmRlaHlkcmF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25zaGlwQ29sbGVjdGlvbih4KSkge1xuICAgICAgICByZXR1cm4geC5kZWh5ZHJhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICAgIHJldHVybiB4Lm1hcChkZWh5ZHJhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKCEheCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh4KS5tYXAoKFtrLCB2XSkgPT4gW2ssIGRlaHlkcmF0ZSh2KV0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb2FkKGRiOiBEZWh5ZHJhdGVkRGF0YWJhc2UpIHtcbiAgICB0aGlzLmlkQ3RyID0gZGIuaWRDdHI7XG4gICAgaHlkcmF0ZSh0aGlzLnNjaGVtYSwgZGIuc2NoZW1hKTtcblxuICAgIGZ1bmN0aW9uIGh5ZHJhdGUocHJvdG86IHVua25vd24sIHg6IHVua25vd24pOiB2b2lkIHtcbiAgICAgIGlmIChpc0VudGl0eUNvbGxlY3Rpb24ocHJvdG8pKSB7XG4gICAgICAgIHByb3RvLmh5ZHJhdGVGcm9tKHgpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25zaGlwQ29sbGVjdGlvbihwcm90bykpIHtcbiAgICAgICAgcHJvdG8uaHlkcmF0ZUZyb20oeCk7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgICB4LmZvckVhY2goaHlkcmF0ZSk7XG4gICAgICB9XG4gICAgICBpZiAoISFwcm90byAmJiB0eXBlb2YgcHJvdG8gPT09ICdvYmplY3QnICYmICEheCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMocHJvdG8pKSB7XG4gICAgICAgICAgaHlkcmF0ZSh2LCAoeCBhcyBhbnkpW2tdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgRGVoeWRyYXRlZERhdGFiYXNlIHtcbiAgcmVhZG9ubHkgaWRDdHI6IG51bWJlcjtcbiAgcmVhZG9ubHkgc2NoZW1hOiBhbnk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUlkPEEgZXh0ZW5kcyBvYmplY3Q+KHg6IEEpOiBPbWl0PEEsICckaWQnPiB7XG4gIGNvbnN0IHJldCA9IHsgLi4ueCB9O1xuICBkZWxldGUgKHJldCBhcyBhbnkpLiRpZDtcbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IHR5cGUgTGluazxFLCBBPiA9IHsgcmVhZG9ubHkgZW50aXR5OiBFIH0gJiBBO1xuXG50eXBlIFJlbFdBdHRyczxSUz4gPSB7IFtLIGluIGtleW9mIFJTXToge30gZXh0ZW5kcyBSZWxUeXBlPFJTW0tdPlsnYXR0ciddID8gbmV2ZXIgOiBLIH1ba2V5b2YgUlNdO1xudHlwZSBSZWxXb0F0dHJzPFJTPiA9IHsgW0sgaW4ga2V5b2YgUlNdOiB7fSBleHRlbmRzIFJlbFR5cGU8UlNbS10+WydhdHRyJ10gPyBLIDogbmV2ZXIgfVtrZXlvZiBSU107XG5cbi8vIE5lY2Vzc2FyeSBiZWNhdXNlIHRoaXMgdHlwZSBtaWdodCBiZSBhIHVuaW9uXG50eXBlIEluZGV4TmFtZXNPZjxBPiA9IEEgZXh0ZW5kcyBFbnRpdHlDb2xsZWN0aW9uPGFueT4gPyBLZXlzT2ZVbmlvbjxBWydpbmRleGVzJ10+IDogbmV2ZXI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmV0dGllci9wcmV0dGllclxudHlwZSBJbmRleE9mPEVDLCBJIGV4dGVuZHMgSW5kZXhOYW1lc09mPEVDPj4gPVxuICBFQyBleHRlbmRzIEVudGl0eUNvbGxlY3Rpb248YW55PlxuICA/IEVDWydpbmRleGVzJ11bSV0gZXh0ZW5kcyBFbnRpdHlJbmRleDxhbnksIGluZmVyIEluZGV4VHlwZT5cbiAgICA/IHtcbiAgICAgICAgdmFsdWVUeXBlOiBJbmRleFR5cGU7XG4gICAgICAgIGxvb2t1cHM6IGtleW9mIEVDWydpbmRleGVzJ11bSV1bJ2xvb2t1cHMnXTtcbiAgICAgIH1cbiAgICA6IG5ldmVyXG4gIDogbmV2ZXI7XG5cbnR5cGUgRW50aXR5VHlwZTxBPiA9IEEgZXh0ZW5kcyBFbnRpdHlDb2xsZWN0aW9uPGluZmVyIEI+ID8gQiA6IG5ldmVyO1xuXG50eXBlIFJlbFR5cGU8QT4gPSBBIGV4dGVuZHMgUmVsYXRpb25zaGlwQ29sbGVjdGlvbjxpbmZlciBSPiA/IFIgOiBuZXZlcjtcblxudHlwZSBSZXNvbHZlVW5pb248VD4gPSBUIGV4dGVuZHMgVCA/IFQgOiBuZXZlcjtcblxudHlwZSBLZXlzT2ZVbmlvbjxUPiA9IGtleW9mIFJlc29sdmVVbmlvbjxUPjtcblxuZXhwb3J0IHR5cGUgRW50aXRpZXNPZjxEQj4gPSBEQiBleHRlbmRzIERhdGFiYXNlPGluZmVyIEVTLCBhbnk+ID8geyBbayBpbiBrZXlvZiBFU106IEVudGl0eVR5cGU8RVNba10+IH0gOiB7fTtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoUmVhZG9ubHlBcnJheTxBPiBleHRlbmRzIFJlYWRvbmx5QXJyYXk8QT4ge1xuICAvKipcbiAgICogUmV0dXJuIHRoZSBmaXJzdCBhbmQgb25seSBlbGVtZW50LCB0aHJvd2luZyBpZiB0aGVyZSBhcmUgIT0gMSBlbGVtZW50c1xuICAgKi9cbiAgb25seSgpOiBBO1xufVxuXG5mdW5jdGlvbiBhZGRPbmx5TWV0aG9kPEE+KHhzOiBBW10sIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBSaWNoUmVhZG9ubHlBcnJheTxBPiB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4cywge1xuICAgIG9ubHk6IHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6ICgpID0+IHtcbiAgICAgICAgaWYgKHhzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSAxICR7ZGVzY3JpcHRpb259LCBmb3VuZCAke3hzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geHNbMF07XG4gICAgICB9LFxuICAgIH0sXG4gIH0pIGFzIGFueTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGtleXMgb2YgYW4gb2JqZWN0IHRoYXQgbWFwIHRvIGEgcGFydGljdWxhciB0eXBlXG4gKi9cbnR5cGUgS2V5c0ZvcjxPIGV4dGVuZHMgb2JqZWN0LCBUPiA9IHsgW2sgaW4ga2V5b2YgT106IE9ba10gZXh0ZW5kcyBUID8gayA6IG5ldmVyIH1ba2V5b2YgT107XG4iXX0= /***/ }), -/***/ 57433: +/***/ 86828: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(82605), exports); -tslib_1.__exportStar(__nccwpck_require__(21261), exports); -tslib_1.__exportStar(__nccwpck_require__(20312), exports); -tslib_1.__exportStar(__nccwpck_require__(56083), exports); -tslib_1.__exportStar(__nccwpck_require__(21767), exports); -tslib_1.__exportStar(__nccwpck_require__(41811), exports); - +exports.optionalCmp = exports.numberCmp = exports.stringCmp = exports.ref = exports.isEntityCollection = exports.calculatedIndex = exports.fieldIndex = exports.entityCollection = void 0; +const sorted_map_1 = __nccwpck_require__(95801); +function entityCollection() { + const entities = new Map(); + const _indexes = {}; + function add(x) { + entities.set(x.$id, x); + for (const index of Object.values(_indexes)) { + // FIXME: why can't we type this? + index.add(x); + } + } + return { + type: 'entities', + entities, + indexes: _indexes, + add, + dehydrate: () => ({ + type: 'entities', + entities: Array.from(validatePlainObjects(entities).values()), + }), + hydrateFrom: (x) => { + entities.clear(); + for (const e of Object.values(x.entities)) { + add(e); + } + }, + index(indexes) { + // This limitation exists purely because I couldn't type it otherwise. + // Declaring a return type of `EntityCollection` would make a lot + // of our other type inspection code stop working (the union is hard to pick + // apart). Since adding indexes in multiple goes is not really a use case, + // the simpler solution is just to type it as if we replaced all indexes + // and add a runtime check to make sure the types aren't lying. + if (Object.keys(_indexes).length > 0) { + throw new Error('You may only call .index() once on a new collection'); + } + Object.assign(_indexes, indexes); + return this; + }, + }; +} +exports.entityCollection = entityCollection; +/** + * An index that uses the value of an entity's field + */ +function fieldIndex(propName, comparator) { + return calculatedIndex((x) => x[propName], comparator); +} +exports.fieldIndex = fieldIndex; +/** + * An index that is calculated based on a function applied to an entity + */ +function calculatedIndex(fn, comparator) { + const index = []; + return { + add: (x) => sorted_map_1.sortedMap.add(index, comparator, fn(x), x.$id), + lookups: { + equals: (value) => sorted_map_1.sortedMap.findAll(index, comparator, value), + }, + index, + }; +} +exports.calculatedIndex = calculatedIndex; +function isEntityCollection(x) { + return typeof x === 'object' && !!x && x.type === 'entities'; +} +exports.isEntityCollection = isEntityCollection; +function validatePlainObjects(xs) { + for (const x of xs.values()) { + if (x.constructor !== Object) { + throw new Error(`Entities should be plain-text objects, got instance of ${x.constructor}`); + } + } + return xs; +} +function ref(x) { + return typeof x === 'string' ? { $ref: x } : { $ref: x.$id }; +} +exports.ref = ref; +/** + * Determines whether two strings are equivalent in the current or specified locale. + */ +function stringCmp(a, b) { + return a.localeCompare(b); +} +exports.stringCmp = stringCmp; +/** + * Determines whether two numbers are equivalent. + */ +function numberCmp(a, b) { + return a - b; +} +exports.numberCmp = numberCmp; +/** + * Creates a comparator to determine equivalent of two values, using a given comparator, but allows values to be optional. + * + * @param frontOrder If `true`, returns so that undefined values are ordered at the front. If `false`, undefined values are ordered at the back. + */ +function optionalCmp(cmp, frontOrder = true) { + return (a, b) => { + if (a == undefined && b != undefined) { + return frontOrder ? -1 : 1; + } + if (a != undefined && b == undefined) { + return frontOrder ? 1 : -1; + } + if (a == undefined && b == undefined) { + return 0; + } + return cmp(a, b); + }; +} +exports.optionalCmp = optionalCmp; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2VudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBeUQ7QUE0RXpELFNBQWdCLGdCQUFnQjtJQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBYSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUVwQixTQUFTLEdBQUcsQ0FBQyxDQUFJO1FBQ2YsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzQyxpQ0FBaUM7WUFDaEMsS0FBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVU7UUFDaEIsUUFBUTtRQUNSLE9BQU8sRUFBRSxRQUFlO1FBQ3hCLEdBQUc7UUFDSCxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNoQixJQUFJLEVBQUUsVUFBVTtZQUNoQixRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM5RCxDQUFDO1FBQ0YsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDakIsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3pDLEdBQUcsQ0FBQyxDQUFRLENBQUMsQ0FBQzthQUNmO1FBQ0gsQ0FBQztRQUNELEtBQUssQ0FBQyxPQUFPO1lBQ1gsc0VBQXNFO1lBQ3RFLDRFQUE0RTtZQUM1RSw0RUFBNEU7WUFDNUUsMEVBQTBFO1lBQzFFLHdFQUF3RTtZQUN4RSwrREFBK0Q7WUFDL0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQzthQUN4RTtZQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sSUFBVyxDQUFDO1FBQ3JCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQXpDRCw0Q0F5Q0M7QUFFRDs7R0FFRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsUUFBVyxFQUNYLFVBQXNDO0lBRXRDLE9BQU8sZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUxELGdDQUtDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQXNCLEVBQWUsRUFBRSxVQUFtQztJQUN2RyxNQUFNLEtBQUssR0FBOEIsRUFBRSxDQUFDO0lBQzVDLE9BQU87UUFDTCxHQUFHLEVBQUUsQ0FBQyxDQUFJLEVBQUUsRUFBRSxDQUFDLHNCQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDN0QsT0FBTyxFQUFFO1lBQ1AsTUFBTSxFQUFFLENBQUMsS0FBUSxFQUFFLEVBQUUsQ0FBQyxzQkFBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQztTQUMzRDtRQUNSLEtBQUs7S0FDTixDQUFDO0FBQ0osQ0FBQztBQVRELDBDQVNDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsQ0FBVTtJQUMzQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQVMsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0FBQ3hFLENBQUM7QUFGRCxnREFFQztBQUVELFNBQVMsb0JBQW9CLENBQW1CLEVBQWtCO0lBQ2hFLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQzNCLElBQUksQ0FBQyxDQUFDLFdBQVcsS0FBSyxNQUFNLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDNUY7S0FDRjtJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQU1ELFNBQWdCLEdBQUcsQ0FBbUIsQ0FBYTtJQUNqRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMvRCxDQUFDO0FBRkQsa0JBRUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUM1QyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUZELDhCQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixTQUFTLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsQ0FBQztBQUZELDhCQUVDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVcsQ0FBSSxHQUEyQixFQUFFLFVBQVUsR0FBRyxJQUFJO0lBQzNFLE9BQU8sQ0FBQyxDQUFnQixFQUFFLENBQWdCLEVBQUUsRUFBRTtRQUM1QyxJQUFJLENBQUMsSUFBSSxTQUFTLElBQUksQ0FBQyxJQUFJLFNBQVMsRUFBRTtZQUNwQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QjtRQUNELElBQUksQ0FBQyxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksU0FBUyxFQUFFO1lBQ3BDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxTQUFTLEVBQUU7WUFDcEMsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUVELE9BQU8sR0FBRyxDQUFDLENBQUUsRUFBRSxDQUFFLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUM7QUFDSixDQUFDO0FBZEQsa0NBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3J0ZWRNYXAsIFNvcnRlZE11bHRpTWFwIH0gZnJvbSAnLi9zb3J0ZWQtbWFwJztcblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHkge1xuICByZWFkb25seSAkaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUGxhaW48RSBleHRlbmRzIEVudGl0eT4gPSBPbWl0PEUsICckaWQnPjtcblxudHlwZSBJbmRleGVzPEEgZXh0ZW5kcyBFbnRpdHk+ID0geyBbSyBpbiBQcm9wZXJ0eUtleV06IEVudGl0eUluZGV4PEEsIGFueT4gfTtcblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlDb2xsZWN0aW9uPEEgZXh0ZW5kcyBFbnRpdHksIEkgZXh0ZW5kcyBJbmRleGVzPEVudGl0eT4gPSB7fT4ge1xuICByZWFkb25seSB0eXBlOiAnZW50aXRpZXMnO1xuICByZWFkb25seSBlbnRpdGllczogTWFwPHN0cmluZywgQT47XG4gIHJlYWRvbmx5IGluZGV4ZXM6IEk7XG5cbiAgYWRkKHg6IEEpOiB2b2lkO1xuICBkZWh5ZHJhdGUoKTogYW55O1xuICBoeWRyYXRlRnJvbSh4OiBhbnkpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGQgaW5kZXhlcyB0byB0aGlzIGNvbGxlY3Rpb25cbiAgICpcbiAgICogQ3JlYXRpbmcgYW4gaW5kZXhlZCBjb2xsZWN0aW9uIGlzIGEgdHdvLXN0ZXAgb3BlcmF0aW9uIHNvIHRoYXQgd2UgY2FuIHNwZWNpZnkgdGhlXG4gICAqIEVudGl0eSB0eXBlLCBidXQgaW5mZXIgdGhlIGluZGV4IHR5cGVzIChUeXBlU2NyaXB0IGRvZXMgbm90IGFsbG93IGJvdGggc3BlY2lmeWluZyBBTkRcbiAgICogaW5mZXJyaW5nIGdlbmVyaWMgYXJndW1lbnRzIGluIGEgc2luZ2xlIGNhbGwpLlxuICAgKi9cbiAgaW5kZXg8SUkgZXh0ZW5kcyBJbmRleGVzPEE+PihpbmRleGVzOiBJSSk6IEVudGl0eUNvbGxlY3Rpb248QSwgSUk+O1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgaW5kZXggb2JqZWN0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUluZGV4PEEgZXh0ZW5kcyBFbnRpdHksIEluZGV4VHlwZT4ge1xuICAvKipcbiAgICogVGhlIGxvb2t1cHMgdGhhdCB0aGUgaW5kZXhlZCBmaWVsZCB0eXBlIGFmZm9yZHNcbiAgICpcbiAgICogRm9yIGV4YW1wbGUsICdlcXVhbHMnLCAnbGVzc1RoYW4nLCAncHJlZml4JywgZXRjLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwczogSW5kZXhMb29rdXBzPEluZGV4VHlwZT47XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRleCBkYXRhIHN0b3JlXG4gICAqL1xuICByZWFkb25seSBpbmRleDogU29ydGVkTXVsdGlNYXA8SW5kZXhUeXBlLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gZW50aXR5IHRvIHRoZSBpbmRleFxuICAgKi9cbiAgYWRkKHg6IEEpOiB2b2lkO1xufVxuXG4vKipcbiAqIE1hcCBhIHR5cGUgdGhlIHR5cGVzIG9mIGxvb2t1cHMgd2UgY2FuIGRvIG9uIHRoYXQgdHlwZVxuICovXG5leHBvcnQgdHlwZSBJbmRleExvb2t1cHM8UD4gPSBbUF0gZXh0ZW5kcyBbc3RyaW5nXVxuICA/IFN0cmluZ0luZGV4TG9va3Vwc1xuICA6IFtQXSBleHRlbmRzIFtzdHJpbmcgfCB1bmRlZmluZWRdXG4gID8gT3B0aW9uYWxTdHJpbmdJbmRleExvb2t1cHNcbiAgOiB7fTtcblxuLyoqXG4gKiBBbGwgdGhlIGxvb2t1cHMgb24gJ3N0cmluZycgdHlwZXNcbiAqXG4gKiBXZSBjdXJyZW50bHkgb25seSBoYXZlICdlcXVhbHMnIGJ1dCB3ZSBjb3VsZCBoYXZlIG1vcmUgOilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdJbmRleExvb2t1cHMge1xuICBlcXVhbHMoeDogc3RyaW5nKTogc3RyaW5nW107XG59XG5cbi8qKlxuICogQWxsIHRoZSBsb29rdXBzIG9uICdzdHJpbmcgfCB1bmRlZmluZWQnIHR5cGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uYWxTdHJpbmdJbmRleExvb2t1cHMge1xuICBlcXVhbHMoeDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnRpdHlDb2xsZWN0aW9uPEEgZXh0ZW5kcyBFbnRpdHk+KCk6IEVudGl0eUNvbGxlY3Rpb248QSwge30+IHtcbiAgY29uc3QgZW50aXRpZXMgPSBuZXcgTWFwPHN0cmluZywgQT4oKTtcbiAgY29uc3QgX2luZGV4ZXMgPSB7fTtcblxuICBmdW5jdGlvbiBhZGQoeDogQSkge1xuICAgIGVudGl0aWVzLnNldCh4LiRpZCwgeCk7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBPYmplY3QudmFsdWVzKF9pbmRleGVzKSkge1xuICAgICAgLy8gRklYTUU6IHdoeSBjYW4ndCB3ZSB0eXBlIHRoaXM/XG4gICAgICAoaW5kZXggYXMgYW55KS5hZGQoeCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnZW50aXRpZXMnLFxuICAgIGVudGl0aWVzLFxuICAgIGluZGV4ZXM6IF9pbmRleGVzIGFzIGFueSxcbiAgICBhZGQsXG4gICAgZGVoeWRyYXRlOiAoKSA9PiAoe1xuICAgICAgdHlwZTogJ2VudGl0aWVzJyxcbiAgICAgIGVudGl0aWVzOiBBcnJheS5mcm9tKHZhbGlkYXRlUGxhaW5PYmplY3RzKGVudGl0aWVzKS52YWx1ZXMoKSksXG4gICAgfSksXG4gICAgaHlkcmF0ZUZyb206ICh4KSA9PiB7XG4gICAgICBlbnRpdGllcy5jbGVhcigpO1xuICAgICAgZm9yIChjb25zdCBlIG9mIE9iamVjdC52YWx1ZXMoeC5lbnRpdGllcykpIHtcbiAgICAgICAgYWRkKGUgYXMgYW55KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluZGV4KGluZGV4ZXMpIHtcbiAgICAgIC8vIFRoaXMgbGltaXRhdGlvbiBleGlzdHMgcHVyZWx5IGJlY2F1c2UgSSBjb3VsZG4ndCB0eXBlIGl0IG90aGVyd2lzZS5cbiAgICAgIC8vIERlY2xhcmluZyBhIHJldHVybiB0eXBlIG9mIGBFbnRpdHlDb2xsZWN0aW9uPEEsIEkgfCBJST5gIHdvdWxkIG1ha2UgYSBsb3RcbiAgICAgIC8vIG9mIG91ciBvdGhlciB0eXBlIGluc3BlY3Rpb24gY29kZSBzdG9wIHdvcmtpbmcgKHRoZSB1bmlvbiBpcyBoYXJkIHRvIHBpY2tcbiAgICAgIC8vIGFwYXJ0KS4gU2luY2UgYWRkaW5nIGluZGV4ZXMgaW4gbXVsdGlwbGUgZ29lcyBpcyBub3QgcmVhbGx5IGEgdXNlIGNhc2UsXG4gICAgICAvLyB0aGUgc2ltcGxlciBzb2x1dGlvbiBpcyBqdXN0IHRvIHR5cGUgaXQgYXMgaWYgd2UgcmVwbGFjZWQgYWxsIGluZGV4ZXNcbiAgICAgIC8vIGFuZCBhZGQgYSBydW50aW1lIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgdHlwZXMgYXJlbid0IGx5aW5nLlxuICAgICAgaWYgKE9iamVjdC5rZXlzKF9pbmRleGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG1heSBvbmx5IGNhbGwgLmluZGV4KCkgb25jZSBvbiBhIG5ldyBjb2xsZWN0aW9uJyk7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKF9pbmRleGVzLCBpbmRleGVzKTtcbiAgICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEFuIGluZGV4IHRoYXQgdXNlcyB0aGUgdmFsdWUgb2YgYW4gZW50aXR5J3MgZmllbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkSW5kZXg8QSBleHRlbmRzIEVudGl0eSwgUCBleHRlbmRzIGtleW9mIEE+KFxuICBwcm9wTmFtZTogUCxcbiAgY29tcGFyYXRvcjogc29ydGVkTWFwLkNvbXBhcmF0b3I8QVtQXT4sXG4pOiBFbnRpdHlJbmRleDxBLCBBW1BdPiB7XG4gIHJldHVybiBjYWxjdWxhdGVkSW5kZXgoKHgpID0+IHhbcHJvcE5hbWVdLCBjb21wYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBBbiBpbmRleCB0aGF0IGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gYSBmdW5jdGlvbiBhcHBsaWVkIHRvIGFuIGVudGl0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlZEluZGV4PEEgZXh0ZW5kcyBFbnRpdHksIEI+KGZuOiAoeDogQSkgPT4gQiwgY29tcGFyYXRvcjogc29ydGVkTWFwLkNvbXBhcmF0b3I8Qj4pIHtcbiAgY29uc3QgaW5kZXg6IFNvcnRlZE11bHRpTWFwPEIsIHN0cmluZz4gPSBbXTtcbiAgcmV0dXJuIHtcbiAgICBhZGQ6ICh4OiBBKSA9PiBzb3J0ZWRNYXAuYWRkKGluZGV4LCBjb21wYXJhdG9yLCBmbih4KSwgeC4kaWQpLFxuICAgIGxvb2t1cHM6IHtcbiAgICAgIGVxdWFsczogKHZhbHVlOiBCKSA9PiBzb3J0ZWRNYXAuZmluZEFsbChpbmRleCwgY29tcGFyYXRvciwgdmFsdWUpLFxuICAgIH0gYXMgYW55LFxuICAgIGluZGV4LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbnRpdHlDb2xsZWN0aW9uKHg6IHVua25vd24pOiB4IGlzIEVudGl0eUNvbGxlY3Rpb248YW55PiB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgISF4ICYmICh4IGFzIGFueSkudHlwZSA9PT0gJ2VudGl0aWVzJztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQbGFpbk9iamVjdHM8QSBleHRlbmRzIG9iamVjdD4oeHM6IE1hcDxzdHJpbmcsIEE+KTogTWFwPHN0cmluZywgQT4ge1xuICBmb3IgKGNvbnN0IHggb2YgeHMudmFsdWVzKCkpIHtcbiAgICBpZiAoeC5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0aWVzIHNob3VsZCBiZSBwbGFpbi10ZXh0IG9iamVjdHMsIGdvdCBpbnN0YW5jZSBvZiAke3guY29uc3RydWN0b3J9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB4cztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWZlcmVuY2U8RSBleHRlbmRzIEVudGl0eT4ge1xuICByZWFkb25seSAkcmVmOiBFWyckaWQnXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZjxFIGV4dGVuZHMgRW50aXR5Pih4OiBFIHwgc3RyaW5nKTogUmVmZXJlbmNlPEU+IHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnc3RyaW5nJyA/IHsgJHJlZjogeCB9IDogeyAkcmVmOiB4LiRpZCB9O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0d28gc3RyaW5ncyBhcmUgZXF1aXZhbGVudCBpbiB0aGUgY3VycmVudCBvciBzcGVjaWZpZWQgbG9jYWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nQ21wKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIG51bWJlcnMgYXJlIGVxdWl2YWxlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJDbXAoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gYSAtIGI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBhcmF0b3IgdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnQgb2YgdHdvIHZhbHVlcywgdXNpbmcgYSBnaXZlbiBjb21wYXJhdG9yLCBidXQgYWxsb3dzIHZhbHVlcyB0byBiZSBvcHRpb25hbC5cbiAqXG4gKiBAcGFyYW0gZnJvbnRPcmRlciBJZiBgdHJ1ZWAsIHJldHVybnMgc28gdGhhdCB1bmRlZmluZWQgdmFsdWVzIGFyZSBvcmRlcmVkIGF0IHRoZSBmcm9udC4gSWYgYGZhbHNlYCwgdW5kZWZpbmVkIHZhbHVlcyBhcmUgb3JkZXJlZCBhdCB0aGUgYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsQ21wPEE+KGNtcDogKGE6IEEsIGI6IEEpID0+IG51bWJlciwgZnJvbnRPcmRlciA9IHRydWUpIHtcbiAgcmV0dXJuIChhOiBBIHwgdW5kZWZpbmVkLCBiOiBBIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKGEgPT0gdW5kZWZpbmVkICYmIGIgIT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJvbnRPcmRlciA/IC0xIDogMTtcbiAgICB9XG4gICAgaWYgKGEgIT0gdW5kZWZpbmVkICYmIGIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJvbnRPcmRlciA/IDEgOiAtMTtcbiAgICB9XG4gICAgaWYgKGEgPT0gdW5kZWZpbmVkICYmIGIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gY21wKGEhLCBiISk7XG4gIH07XG59XG4iXX0= /***/ }), -/***/ 41811: -/***/ ((__unused_webpack_module, exports) => { +/***/ 63194: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; Object.defineProperty(exports, "__esModule", ({ value: true })); - +__exportStar(__nccwpck_require__(86828), exports); +__exportStar(__nccwpck_require__(39306), exports); +__exportStar(__nccwpck_require__(838), exports); +__exportStar(__nccwpck_require__(86579), exports); +__exportStar(__nccwpck_require__(32576), exports); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUF5QjtBQUN6QixpREFBK0I7QUFDL0IsNkNBQTJCO0FBQzNCLDhDQUE0QjtBQUM1QiwyQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2VudGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL3JlbGF0aW9uc2hpcCc7XG5leHBvcnQgKiBmcm9tICcuL2RhdGFiYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW52YXJpYW50JztcbmV4cG9ydCAqIGZyb20gJy4vcmVzdWx0JztcbiJdfQ== /***/ }), -/***/ 65075: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 86579: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.callFunction = void 0; -const tslib_1 = __nccwpck_require__(4351); -const lib = tslib_1.__importStar(__nccwpck_require__(83188)); -const evaluateExpression_1 = __nccwpck_require__(82980); -const callFunction = ({ fn, argv }, options) => { - const evaluatedArgs = argv.map((arg) => ["boolean", "number"].includes(typeof arg) ? arg : (0, evaluateExpression_1.evaluateExpression)(arg, "arg", options)); - return fn.split(".").reduce((acc, key) => acc[key], lib)(...evaluatedArgs); -}; -exports.callFunction = callFunction; - +exports.impliesU = exports.implies = exports.evolutionInvariant = void 0; +function evolutionInvariant(description, pred) { + // TODO: Find a way + Array.isArray(description); + Array.isArray(pred); +} +exports.evolutionInvariant = evolutionInvariant; +function implies(x, y) { + return !x || y; +} +exports.implies = implies; +/** + * Implies, but treats 'undefined' as 'false' + */ +function impliesU(x, y) { + return !x || !!y; +} +exports.impliesU = impliesU; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52YXJpYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ludmFyaWFudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxTQUFnQixrQkFBa0IsQ0FBSSxXQUFtQixFQUFFLElBQStCO0lBQ3hGLG1CQUFtQjtJQUNuQixLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEIsQ0FBQztBQUpELGdEQUlDO0FBRUQsU0FBZ0IsT0FBTyxDQUFDLENBQVUsRUFBRSxDQUFVO0lBQzVDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pCLENBQUM7QUFGRCwwQkFFQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLENBQXNCLEVBQUUsQ0FBc0I7SUFDckUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFGRCw0QkFFQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEludmFyaWFudCA9IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIEV2b2x1dGlvbkludmFyaWFudFByZWQ8QT4gPSAocHJldmlvdXM6IEEsIGN1cnJlbnQ6IEEpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBmdW5jdGlvbiBldm9sdXRpb25JbnZhcmlhbnQ8QT4oZGVzY3JpcHRpb246IHN0cmluZywgcHJlZDogRXZvbHV0aW9uSW52YXJpYW50UHJlZDxBPik6IEludmFyaWFudCB7XG4gIC8vIFRPRE86IEZpbmQgYSB3YXlcbiAgQXJyYXkuaXNBcnJheShkZXNjcmlwdGlvbik7XG4gIEFycmF5LmlzQXJyYXkocHJlZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbXBsaWVzKHg6IGJvb2xlYW4sIHk6IGJvb2xlYW4pIHtcbiAgcmV0dXJuICF4IHx8IHk7XG59XG5cbi8qKlxuICogSW1wbGllcywgYnV0IHRyZWF0cyAndW5kZWZpbmVkJyBhcyAnZmFsc2UnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBsaWVzVSh4OiBib29sZWFuIHwgdW5kZWZpbmVkLCB5OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gIHJldHVybiAheCB8fCAhIXk7XG59XG4iXX0= /***/ }), -/***/ 77851: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 39306: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.evaluateCondition = void 0; -const debug_1 = __nccwpck_require__(27617); -const types_1 = __nccwpck_require__(57433); -const callFunction_1 = __nccwpck_require__(65075); -const evaluateCondition = ({ assign, ...fnArgs }, options) => { - var _a, _b; - if (assign && assign in options.referenceRecord) { - throw new types_1.EndpointError(`'${assign}' is already defined in Reference Record.`); +exports.isRelationshipCollection = exports.relationshipCollection = exports.NO_RELATIONSHIPS = void 0; +const NO_RELATIONSHIPS = () => ({}); +exports.NO_RELATIONSHIPS = NO_RELATIONSHIPS; +function relationshipCollection(fromField, toField) { + const forward = new Map(); + const backward = new Map(); + function add(fromId, toId, attrs) { + let f = forward.get(fromId); + if (!f) { + f = []; + forward.set(fromId, f); + } + let b = backward.get(toId); + if (!b) { + b = []; + backward.set(toId, b); + } + // Behaves like a set, only add new relationship if it is structurally distinct + const forwardRel = { $id: toId, ...attrs }; + const forwardRelStr = JSON.stringify(forwardRel); + const existingRelationship = f.find((x) => JSON.stringify(x) === forwardRelStr); + if (!existingRelationship) { + f.push(forwardRel); + b.push({ $id: fromId, ...attrs }); + } } - const value = (0, callFunction_1.callFunction)(fnArgs, options); - (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `evaluateCondition: ${(0, debug_1.toDebugString)(fnArgs)} = ${(0, debug_1.toDebugString)(value)}`); return { - result: value === "" ? true : !!value, - ...(assign != null && { toAssign: { name: assign, value } }), + type: 'rel', + fromColl: fromField, + toColl: toField, + forward, + backward, + add(from, to, attributes) { + add(from.$id, to.$id, attributes); + }, + dehydrate() { + return { + type: 'rel', + forward: Object.fromEntries(forward.entries()), + }; + }, + hydrateFrom(x) { + forward.clear(); + backward.clear(); + for (const [fromId, targets] of Object.entries(x.forward)) { + for (const target of targets) { + add(fromId, target.$id, removeId(target)); + } + } + }, }; -}; -exports.evaluateCondition = evaluateCondition; - +} +exports.relationshipCollection = relationshipCollection; +function isRelationshipCollection(x) { + return typeof x === 'object' && !!x && x.type === 'rel'; +} +exports.isRelationshipCollection = isRelationshipCollection; +function removeId(x) { + const ret = { ...x }; + delete ret.$id; + return ret; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb25zaGlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlbGF0aW9uc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2Qk8sTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQTlCLFFBQUEsZ0JBQWdCLG9CQUFjO0FBRTNDLFNBQWdCLHNCQUFzQixDQUNwQyxTQUF3QixFQUN4QixPQUFvQjtJQUVwQixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUNuRCxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUVwRCxTQUFTLEdBQUcsQ0FBQyxNQUFjLEVBQUUsSUFBWSxFQUFFLEtBQVU7UUFDbkQsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ04sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ04sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCO1FBRUQsK0VBQStFO1FBQy9FLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQzNDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakQsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxDQUFDO1FBRWhGLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLEtBQUs7UUFDWCxRQUFRLEVBQUUsU0FBUztRQUNuQixNQUFNLEVBQUUsT0FBTztRQUNmLE9BQU87UUFDUCxRQUFRO1FBQ1IsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsVUFBZTtZQUMzQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxTQUFTO1lBQ1AsT0FBTztnQkFDTCxJQUFJLEVBQUUsS0FBSztnQkFDWCxPQUFPLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDL0MsQ0FBQztRQUNKLENBQUM7UUFDRCxXQUFXLENBQUMsQ0FBTTtZQUNoQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRWpCLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDekQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUEwQixFQUFFO29CQUMvQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQzNDO2FBQ0Y7UUFDSCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUF4REQsd0RBd0RDO0FBRUQsU0FBZ0Isd0JBQXdCLENBQUMsQ0FBVTtJQUNqRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQVMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDO0FBQ25FLENBQUM7QUFGRCw0REFFQztBQUVELFNBQVMsUUFBUSxDQUFtQixDQUFJO0lBQ3RDLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNyQixPQUFRLEdBQVcsQ0FBQyxHQUFHLENBQUM7SUFDeEIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlDb2xsZWN0aW9uIH0gZnJvbSAnLi9lbnRpdHknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcDxGcm9tIGV4dGVuZHMgRW50aXR5LCBUbyBleHRlbmRzIEVudGl0eSwgQXR0cmlidXRlcyA9IHt9PiB7XG4gIHJlYWRvbmx5IGZyb206IEZyb207XG4gIHJlYWRvbmx5IHRvOiBUbztcbiAgcmVhZG9ubHkgYXR0cjogQXR0cmlidXRlcztcbn1cblxudHlwZSBGcm9tR2V0dGVyPFIgZXh0ZW5kcyBSZWxhdGlvbnNoaXA8YW55LCBhbnksIGFueT4+ID0gKGlkOiBzdHJpbmcpID0+IFJbJ2Zyb20nXTtcbnR5cGUgVG9HZXR0ZXI8UiBleHRlbmRzIFJlbGF0aW9uc2hpcDxhbnksIGFueSwgYW55Pj4gPSAoaWQ6IHN0cmluZykgPT4gUlsndG8nXTtcblxuZXhwb3J0IGludGVyZmFjZSBSZWxhdGlvbnNoaXBDb2xsZWN0aW9uPFIgZXh0ZW5kcyBSZWxhdGlvbnNoaXA8YW55LCBhbnksIGFueT4+IHtcbiAgcmVhZG9ubHkgdHlwZTogJ3JlbCc7XG4gIHJlYWRvbmx5IGZyb21Db2xsOiBGcm9tR2V0dGVyPFI+O1xuICByZWFkb25seSB0b0NvbGw6IFRvR2V0dGVyPFI+O1xuICByZWFkb25seSBmb3J3YXJkOiBNYXA8c3RyaW5nLCBSZWw8UlsnYXR0ciddPltdPjtcbiAgcmVhZG9ubHkgYmFja3dhcmQ6IE1hcDxzdHJpbmcsIFJlbDxSWydhdHRyJ10+W10+O1xuXG4gIGFkZChmcm9tOiBSWydmcm9tJ10sIHRvOiBSWyd0byddLCBhdHRyaWJ1dGVzOiBSWydhdHRyJ10pOiB2b2lkO1xuICBkZWh5ZHJhdGUoKTogYW55O1xuICBoeWRyYXRlRnJvbSh4OiBhbnkpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBSZWw8QXR0cmlidXRlcz4gPSB7IHJlYWRvbmx5ICRpZDogc3RyaW5nIH0gJiBBdHRyaWJ1dGVzO1xuXG5leHBvcnQgdHlwZSBLZXlGb3JFbnRpdHlDb2xsZWN0aW9uPFMsIEUgZXh0ZW5kcyBFbnRpdHk+ID0ge1xuICBbSyBpbiBrZXlvZiBTXTogU1tLXSBleHRlbmRzIEVudGl0eUNvbGxlY3Rpb248RT4gPyBLIDogbmV2ZXI7XG59W2tleW9mIFNdO1xuXG5leHBvcnQgY29uc3QgTk9fUkVMQVRJT05TSElQUyA9ICgpID0+ICh7fSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGlvbnNoaXBDb2xsZWN0aW9uPFIgZXh0ZW5kcyBSZWxhdGlvbnNoaXA8YW55LCBhbnksIGFueT4+KFxuICBmcm9tRmllbGQ6IEZyb21HZXR0ZXI8Uj4sXG4gIHRvRmllbGQ6IFRvR2V0dGVyPFI+LFxuKTogUmVsYXRpb25zaGlwQ29sbGVjdGlvbjxSPiB7XG4gIGNvbnN0IGZvcndhcmQgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8UmVsPGFueT4+PigpO1xuICBjb25zdCBiYWNrd2FyZCA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxSZWw8YW55Pj4+KCk7XG5cbiAgZnVuY3Rpb24gYWRkKGZyb21JZDogc3RyaW5nLCB0b0lkOiBzdHJpbmcsIGF0dHJzOiBhbnkpIHtcbiAgICBsZXQgZiA9IGZvcndhcmQuZ2V0KGZyb21JZCk7XG4gICAgaWYgKCFmKSB7XG4gICAgICBmID0gW107XG4gICAgICBmb3J3YXJkLnNldChmcm9tSWQsIGYpO1xuICAgIH1cbiAgICBsZXQgYiA9IGJhY2t3YXJkLmdldCh0b0lkKTtcbiAgICBpZiAoIWIpIHtcbiAgICAgIGIgPSBbXTtcbiAgICAgIGJhY2t3YXJkLnNldCh0b0lkLCBiKTtcbiAgICB9XG5cbiAgICAvLyBCZWhhdmVzIGxpa2UgYSBzZXQsIG9ubHkgYWRkIG5ldyByZWxhdGlvbnNoaXAgaWYgaXQgaXMgc3RydWN0dXJhbGx5IGRpc3RpbmN0XG4gICAgY29uc3QgZm9yd2FyZFJlbCA9IHsgJGlkOiB0b0lkLCAuLi5hdHRycyB9O1xuICAgIGNvbnN0IGZvcndhcmRSZWxTdHIgPSBKU09OLnN0cmluZ2lmeShmb3J3YXJkUmVsKTtcbiAgICBjb25zdCBleGlzdGluZ1JlbGF0aW9uc2hpcCA9IGYuZmluZCgoeCkgPT4gSlNPTi5zdHJpbmdpZnkoeCkgPT09IGZvcndhcmRSZWxTdHIpO1xuXG4gICAgaWYgKCFleGlzdGluZ1JlbGF0aW9uc2hpcCkge1xuICAgICAgZi5wdXNoKGZvcndhcmRSZWwpO1xuICAgICAgYi5wdXNoKHsgJGlkOiBmcm9tSWQsIC4uLmF0dHJzIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3JlbCcsXG4gICAgZnJvbUNvbGw6IGZyb21GaWVsZCxcbiAgICB0b0NvbGw6IHRvRmllbGQsXG4gICAgZm9yd2FyZCxcbiAgICBiYWNrd2FyZCxcbiAgICBhZGQoZnJvbTogRW50aXR5LCB0bzogRW50aXR5LCBhdHRyaWJ1dGVzOiBhbnkpIHtcbiAgICAgIGFkZChmcm9tLiRpZCwgdG8uJGlkLCBhdHRyaWJ1dGVzKTtcbiAgICB9LFxuICAgIGRlaHlkcmF0ZSgpOiBhbnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3JlbCcsXG4gICAgICAgIGZvcndhcmQ6IE9iamVjdC5mcm9tRW50cmllcyhmb3J3YXJkLmVudHJpZXMoKSksXG4gICAgICB9O1xuICAgIH0sXG4gICAgaHlkcmF0ZUZyb20oeDogYW55KTogdm9pZCB7XG4gICAgICBmb3J3YXJkLmNsZWFyKCk7XG4gICAgICBiYWNrd2FyZC5jbGVhcigpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtmcm9tSWQsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKHguZm9yd2FyZCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cyBhcyBBcnJheTxSZWw8YW55Pj4pIHtcbiAgICAgICAgICBhZGQoZnJvbUlkLCB0YXJnZXQuJGlkLCByZW1vdmVJZCh0YXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGF0aW9uc2hpcENvbGxlY3Rpb24oeDogdW5rbm93bik6IHggaXMgUmVsYXRpb25zaGlwQ29sbGVjdGlvbjxhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiAhIXggJiYgKHggYXMgYW55KS50eXBlID09PSAncmVsJztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlSWQ8QSBleHRlbmRzIG9iamVjdD4oeDogQSk6IE9taXQ8QSwgJyRpZCc+IHtcbiAgY29uc3QgcmV0ID0geyAuLi54IH07XG4gIGRlbGV0ZSAocmV0IGFzIGFueSkuJGlkO1xuICByZXR1cm4gcmV0O1xufVxuIl19 /***/ }), -/***/ 59169: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 32576: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.evaluateConditions = void 0; -const debug_1 = __nccwpck_require__(27617); -const evaluateCondition_1 = __nccwpck_require__(77851); -const evaluateConditions = (conditions = [], options) => { - var _a, _b; - const conditionsReferenceRecord = {}; - for (const condition of conditions) { - const { result, toAssign } = (0, evaluateCondition_1.evaluateCondition)(condition, { - ...options, - referenceRecord: { - ...options.referenceRecord, - ...conditionsReferenceRecord, - }, - }); - if (!result) { - return { result }; - } - if (toAssign) { - conditionsReferenceRecord[toAssign.name] = toAssign.value; - (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `assign: ${toAssign.name} := ${(0, debug_1.toDebugString)(toAssign.value)}`); - } +exports.liftUndefined = exports.liftResult = exports.locateFailure = exports.chain = exports.using = exports.tryCatch = exports.assertSuccess = exports.errorFrom = exports.errorMessage = exports.unpackOr = exports.unpack = exports.isSuccess = exports.isFailure = exports.failure = void 0; +// Ensures you must use `fail()` to construct an instance of type Failure +const errorSym = Symbol('error'); +function mkLocate(prefix) { + const ret = (error) => failure(`${prefix}: ${error}`); + ret.in = (prefix2) => mkLocate(`${prefix}: ${prefix2}`); + ret.locate = locateFailure(prefix); + return ret; +} +function failure(error) { + return { [errorSym]: error }; +} +exports.failure = failure; +failure.in = (prefix) => mkLocate(prefix); +failure.locate = (x) => x; +function isFailure(x) { + return !!x && typeof x === 'object' && x[errorSym]; +} +exports.isFailure = isFailure; +function isSuccess(x) { + return !isFailure(x); +} +exports.isSuccess = isSuccess; +function unpack(x) { + if (isFailure(x)) { + throw new Error(`unpack: ${x[errorSym]}`); } - return { result: true, referenceRecord: conditionsReferenceRecord }; -}; -exports.evaluateConditions = evaluateConditions; - - -/***/ }), - -/***/ 35324: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.evaluateEndpointRule = void 0; -const debug_1 = __nccwpck_require__(27617); -const evaluateConditions_1 = __nccwpck_require__(59169); -const getEndpointHeaders_1 = __nccwpck_require__(88268); -const getEndpointProperties_1 = __nccwpck_require__(34973); -const getEndpointUrl_1 = __nccwpck_require__(23602); -const evaluateEndpointRule = (endpointRule, options) => { - var _a, _b; - const { conditions, endpoint } = endpointRule; - const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options); - if (!result) { - return; + return x; +} +exports.unpack = unpack; +function unpackOr(x, def) { + return (isFailure(x) ? def : x); +} +exports.unpackOr = unpackOr; +function errorMessage(x) { + return x[errorSym]; +} +exports.errorMessage = errorMessage; +function errorFrom(x) { + return new Error(errorMessage(x)); +} +exports.errorFrom = errorFrom; +function assertSuccess(x) { + if (isFailure(x)) { + throw errorFrom(x); } - const endpointRuleOptions = { - ...options, - referenceRecord: { ...options.referenceRecord, ...referenceRecord }, - }; - const { url, properties, headers } = endpoint; - (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `Resolving endpoint from template: ${(0, debug_1.toDebugString)(endpoint)}`); - return { - ...(headers != undefined && { - headers: (0, getEndpointHeaders_1.getEndpointHeaders)(headers, endpointRuleOptions), - }), - ...(properties != undefined && { - properties: (0, getEndpointProperties_1.getEndpointProperties)(properties, endpointRuleOptions), - }), - url: (0, getEndpointUrl_1.getEndpointUrl)(url, endpointRuleOptions), - }; -}; -exports.evaluateEndpointRule = evaluateEndpointRule; - - -/***/ }), - -/***/ 12110: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.evaluateErrorRule = void 0; -const types_1 = __nccwpck_require__(57433); -const evaluateConditions_1 = __nccwpck_require__(59169); -const evaluateExpression_1 = __nccwpck_require__(82980); -const evaluateErrorRule = (errorRule, options) => { - const { conditions, error } = errorRule; - const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options); - if (!result) { - return; +} +exports.assertSuccess = assertSuccess; +function tryCatch(failOrBlock, maybeBlock) { + const block = (maybeBlock !== null && maybeBlock !== void 0 ? maybeBlock : failOrBlock); + const f = (maybeBlock ? failOrBlock : failure); + try { + return block(); } - throw new types_1.EndpointError((0, evaluateExpression_1.evaluateExpression)(error, "Error", { - ...options, - referenceRecord: { ...options.referenceRecord, ...referenceRecord }, - })); -}; -exports.evaluateErrorRule = evaluateErrorRule; - - -/***/ }), - -/***/ 82980: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.evaluateExpression = void 0; -const types_1 = __nccwpck_require__(57433); -const callFunction_1 = __nccwpck_require__(65075); -const evaluateTemplate_1 = __nccwpck_require__(57535); -const getReferenceValue_1 = __nccwpck_require__(68810); -const evaluateExpression = (obj, keyName, options) => { - if (typeof obj === "string") { - return (0, evaluateTemplate_1.evaluateTemplate)(obj, options); + catch (e) { + return f(`Error: ${e.message}\n${e.stack}`); } - else if (obj["fn"]) { - return (0, callFunction_1.callFunction)(obj, options); +} +exports.tryCatch = tryCatch; +function using(value, block) { + if (isFailure(value)) { + return value; } - else if (obj["ref"]) { - return (0, getReferenceValue_1.getReferenceValue)(obj, options); + return block(value); +} +exports.using = using; +function chain(value, ...fns) { + for (const fn of fns) { + if (isFailure(value)) { + return value; + } + value = fn(value); } - throw new types_1.EndpointError(`'${keyName}': ${String(obj)} is not a string, function or reference.`); -}; -exports.evaluateExpression = evaluateExpression; - + return value; +} +exports.chain = chain; +/* eslint-enable prettier/prettier */ +/** + * Make a function that will prepend a prefix to error messages + * + * This is one way to be specific about the location where errors originate, by prefixing + * errors as the call stack unwinds. + * + * A different method is to pass in a modified failure function using `failure.in(...)`, + * to build the error message as the call stack deepens. + */ +function locateFailure(prefix) { + return (x) => (isFailure(x) ? failure(`${prefix}: ${x[errorSym]}`) : x); +} +exports.locateFailure = locateFailure; +function liftResult(xs) { + const failures = Array.isArray(xs) ? xs.filter(isFailure) : Object.values(xs).filter(isFailure); + if (failures.length > 0) { + return failure(failures.map(errorMessage).join(', ')); + } + return xs; +} +exports.liftResult = liftResult; +function liftUndefined(valueOrFunction) { + if (typeof valueOrFunction === 'function') { + return (...args) => { + const value = valueOrFunction(...args); + return value !== undefined ? value : failure('value is undefined'); + }; + } + return valueOrFunction !== undefined ? valueOrFunction : failure('value is undefined'); +} +exports.liftUndefined = liftUndefined; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBeUU7QUFDekUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBYWpDLFNBQVMsUUFBUSxDQUFDLE1BQWM7SUFDOUIsTUFBTSxHQUFHLEdBQVMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUlELFNBQWdCLE9BQU8sQ0FBQyxLQUFhO0lBQ25DLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFGRCwwQkFFQztBQUNELE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsRCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUksQ0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFeEMsU0FBZ0IsU0FBUyxDQUFJLENBQVk7SUFDdkMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSyxDQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUZELDhCQUVDO0FBRUQsU0FBZ0IsU0FBUyxDQUFJLENBQVk7SUFDdkMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRkQsOEJBRUM7QUFFRCxTQUFnQixNQUFNLENBQUksQ0FBWTtJQUNwQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUMzQztJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUxELHdCQUtDO0FBRUQsU0FBZ0IsUUFBUSxDQUFPLENBQVksRUFBRSxHQUFNO0lBQ2pELE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFRLENBQUM7QUFDekMsQ0FBQztBQUZELDRCQUVDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLENBQVU7SUFDckMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsQ0FBQztBQUZELG9DQUVDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLENBQVU7SUFDbEMsT0FBTyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRkQsOEJBRUM7QUFJRCxTQUFnQixhQUFhLENBQUMsQ0FBVTtJQUN0QyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNoQixNQUFNLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNwQjtBQUNILENBQUM7QUFKRCxzQ0FJQztBQUlELFNBQWdCLFFBQVEsQ0FBSSxXQUE2QixFQUFFLFVBQW9CO0lBQzdFLE1BQU0sS0FBSyxHQUFZLENBQUMsVUFBVSxhQUFWLFVBQVUsY0FBVixVQUFVLEdBQUksV0FBVyxDQUFRLENBQUM7SUFDMUQsTUFBTSxDQUFDLEdBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFRLENBQUM7SUFFNUQsSUFBSTtRQUNGLE9BQU8sS0FBSyxFQUFFLENBQUM7S0FDaEI7SUFBQyxPQUFPLENBQU0sRUFBRTtRQUNmLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM3QztBQUNILENBQUM7QUFURCw0QkFTQztBQUVELFNBQWdCLEtBQUssQ0FBTyxLQUFnQixFQUFFLEtBQTBCO0lBQ3RFLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBTEQsc0JBS0M7QUFZRCxTQUFnQixLQUFLLENBQUMsS0FBa0IsRUFBRSxHQUFHLEdBQW1DO0lBQzlFLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3BCLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBUkQsc0JBUUM7QUFDRCxxQ0FBcUM7QUFFckM7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixhQUFhLENBQUMsTUFBYztJQUMxQyxPQUFPLENBQUksQ0FBWSxFQUFhLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25HLENBQUM7QUFGRCxzQ0FFQztBQU1ELFNBQWdCLFVBQVUsQ0FDeEIsRUFBZ0Q7SUFFaEQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEcsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN2QixPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ3ZEO0lBQ0QsT0FBTyxFQUFTLENBQUM7QUFDbkIsQ0FBQztBQVJELGdDQVFDO0FBT0QsU0FBZ0IsYUFBYSxDQUFDLGVBQW9CO0lBQ2hELElBQUksT0FBTyxlQUFlLEtBQUssVUFBVSxFQUFFO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLElBQVcsRUFBRSxFQUFFO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUM7S0FDSDtJQUNELE9BQU8sZUFBZSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBUkQsc0NBUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBFbnN1cmVzIHlvdSBtdXN0IHVzZSBgZmFpbCgpYCB0byBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdHlwZSBGYWlsdXJlXG5jb25zdCBlcnJvclN5bSA9IFN5bWJvbCgnZXJyb3InKTtcblxuZXhwb3J0IHR5cGUgUmVzdWx0PEE+ID0gQSB8IEZhaWx1cmU7XG5leHBvcnQgaW50ZXJmYWNlIEZhaWx1cmUge1xuICByZWFkb25seSBbZXJyb3JTeW1dOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbCB7XG4gIChlcnJvcjogc3RyaW5nKTogRmFpbHVyZTtcbiAgaW4ocHJlZml4OiBzdHJpbmcpOiBGYWlsO1xuICBsb2NhdGU8QT4oeDogUmVzdWx0PEE+KTogUmVzdWx0PEE+O1xufVxuXG5mdW5jdGlvbiBta0xvY2F0ZShwcmVmaXg6IHN0cmluZyk6IEZhaWwge1xuICBjb25zdCByZXQ6IEZhaWwgPSAoZXJyb3I6IHN0cmluZykgPT4gZmFpbHVyZShgJHtwcmVmaXh9OiAke2Vycm9yfWApO1xuICByZXQuaW4gPSAocHJlZml4Mjogc3RyaW5nKSA9PiBta0xvY2F0ZShgJHtwcmVmaXh9OiAke3ByZWZpeDJ9YCk7XG4gIHJldC5sb2NhdGUgPSBsb2NhdGVGYWlsdXJlKHByZWZpeCk7XG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgZmFpbHVyZSBleHRlbmRzIEZhaWwge31cblxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUoZXJyb3I6IHN0cmluZyk6IEZhaWx1cmUge1xuICByZXR1cm4geyBbZXJyb3JTeW1dOiBlcnJvciB9O1xufVxuZmFpbHVyZS5pbiA9IChwcmVmaXg6IHN0cmluZykgPT4gbWtMb2NhdGUocHJlZml4KTtcbmZhaWx1cmUubG9jYXRlID0gPEE+KHg6IFJlc3VsdDxBPikgPT4geDtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbHVyZTxBPih4OiBSZXN1bHQ8QT4pOiB4IGlzIEZhaWx1cmUge1xuICByZXR1cm4gISF4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiAoeCBhcyBhbnkpW2Vycm9yU3ltXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3VjY2VzczxBPih4OiBSZXN1bHQ8QT4pOiB4IGlzIEEge1xuICByZXR1cm4gIWlzRmFpbHVyZSh4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVucGFjazxBPih4OiBSZXN1bHQ8QT4pOiBBIHtcbiAgaWYgKGlzRmFpbHVyZSh4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5wYWNrOiAke3hbZXJyb3JTeW1dfWApO1xuICB9XG4gIHJldHVybiB4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5wYWNrT3I8QSwgQj4oeDogUmVzdWx0PEE+LCBkZWY6IEIpOiBCIGV4dGVuZHMgQSA/IEEgOiBBIHwgQiB7XG4gIHJldHVybiAoaXNGYWlsdXJlKHgpID8gZGVmIDogeCkgYXMgYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKHg6IEZhaWx1cmUpOiBzdHJpbmcge1xuICByZXR1cm4geFtlcnJvclN5bV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckZyb20oeDogRmFpbHVyZSk6IEVycm9yIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UoeCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3VjY2VzczxBPih4OiBSZXN1bHQ8QT4pOiBhc3NlcnRzIHggaXMgQTtcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdWNjZXNzKHg6IEZhaWx1cmUpOiBuZXZlcjtcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdWNjZXNzKHg6IEZhaWx1cmUpOiB2b2lkIHtcbiAgaWYgKGlzRmFpbHVyZSh4KSkge1xuICAgIHRocm93IGVycm9yRnJvbSh4KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5Q2F0Y2g8QT4oYmxvY2s6ICgpID0+IEEpOiBSZXN1bHQ8QT47XG5leHBvcnQgZnVuY3Rpb24gdHJ5Q2F0Y2g8QT4oZmFpbEZuOiBGYWlsLCBibG9jazogKCkgPT4gQSk6IFJlc3VsdDxBPjtcbmV4cG9ydCBmdW5jdGlvbiB0cnlDYXRjaDxBPihmYWlsT3JCbG9jazogRmFpbCB8ICgoKSA9PiBBKSwgbWF5YmVCbG9jaz86ICgpID0+IEEpOiBSZXN1bHQ8QT4ge1xuICBjb25zdCBibG9jazogKCkgPT4gQSA9IChtYXliZUJsb2NrID8/IGZhaWxPckJsb2NrKSBhcyBhbnk7XG4gIGNvbnN0IGY6IEZhaWwgPSAobWF5YmVCbG9jayA/IGZhaWxPckJsb2NrIDogZmFpbHVyZSkgYXMgYW55O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJsb2NrKCk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHJldHVybiBmKGBFcnJvcjogJHtlLm1lc3NhZ2V9XFxuJHtlLnN0YWNrfWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2luZzxBLCBCPih2YWx1ZTogUmVzdWx0PEE+LCBibG9jazogKHg6IEEpID0+IFJlc3VsdDxCPik6IFJlc3VsdDxCPiB7XG4gIGlmIChpc0ZhaWx1cmUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBibG9jayh2YWx1ZSk7XG59XG5cbi8qKlxuICogTGlrZSAndXNpbmcnLCBidXQgY2FuIHRha2UgYW55IG51bWJlciBvZiBmdW5jdGlvbnNcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgcHJldHRpZXIvcHJldHRpZXIgKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbjxBLCBCPih2YWx1ZTogUmVzdWx0PEE+LCBiMDogKHg6IEEpID0+IFJlc3VsdDxCPik6IFJlc3VsdDxCPjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbjxBLCBCLCBDPih2YWx1ZTogUmVzdWx0PEE+LCBiMDogKHg6IEEpID0+IFJlc3VsdDxCPiwgYjE6ICh4OiBCKSA9PiBSZXN1bHQ8Qz4pOiBSZXN1bHQ8Qz47XG5leHBvcnQgZnVuY3Rpb24gY2hhaW48QSwgQiwgQywgRD4odmFsdWU6IFJlc3VsdDxBPiwgYjA6ICh4OiBBKSA9PiBSZXN1bHQ8Qj4sIGIxOiAoeDogQikgPT4gUmVzdWx0PEM+LCBiMjogKHg6IEMpID0+IFJlc3VsdDxEPik6IFJlc3VsdDxEPjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbjxBLCBCLCBDLCBELCBFPih2YWx1ZTogUmVzdWx0PEE+LCBiMDogKHg6IEEpID0+IFJlc3VsdDxCPiwgYjE6ICh4OiBCKSA9PiBSZXN1bHQ8Qz4sIGIyOiAoeDogQykgPT4gUmVzdWx0PEQ+LCBiMzogKHg6IEQpID0+IFJlc3VsdDxFPik6IFJlc3VsdDxFPjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbjxBLCBCLCBDLCBELCBFLCBGPih2YWx1ZTogUmVzdWx0PEE+LCBiMDogKHg6IEEpID0+IFJlc3VsdDxCPiwgYjE6ICh4OiBCKSA9PiBSZXN1bHQ8Qz4sIGIyOiAoeDogQykgPT4gUmVzdWx0PEQ+LCBiMzogKHg6IEQpID0+IFJlc3VsdDxFPiwgYjQ6ICh4OiBFKSA9PiBSZXN1bHQ8Rj4pOiBSZXN1bHQ8Rj47XG5leHBvcnQgZnVuY3Rpb24gY2hhaW48QSwgQiwgQywgRCwgRSwgRiwgRz4odmFsdWU6IFJlc3VsdDxBPiwgYjA6ICh4OiBBKSA9PiBSZXN1bHQ8Qj4sIGIxOiAoeDogQikgPT4gUmVzdWx0PEM+LCBiMjogKHg6IEMpID0+IFJlc3VsdDxEPiwgYjM6ICh4OiBEKSA9PiBSZXN1bHQ8RT4sIGI0OiAoeDogRSkgPT4gUmVzdWx0PEY+LCBiNTogKHg6IEYpID0+IFJlc3VsdDxHPik6IFJlc3VsdDxHPjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbih2YWx1ZTogUmVzdWx0PGFueT4sIC4uLmZuczogQXJyYXk8KHg6IGFueSkgPT4gUmVzdWx0PGFueT4+KTogUmVzdWx0PGFueT4ge1xuICBmb3IgKGNvbnN0IGZuIG9mIGZucykge1xuICAgIGlmIChpc0ZhaWx1cmUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHZhbHVlID0gZm4odmFsdWUpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbi8qIGVzbGludC1lbmFibGUgcHJldHRpZXIvcHJldHRpZXIgKi9cblxuLyoqXG4gKiBNYWtlIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHByZXBlbmQgYSBwcmVmaXggdG8gZXJyb3IgbWVzc2FnZXNcbiAqXG4gKiBUaGlzIGlzIG9uZSB3YXkgdG8gYmUgc3BlY2lmaWMgYWJvdXQgdGhlIGxvY2F0aW9uIHdoZXJlIGVycm9ycyBvcmlnaW5hdGUsIGJ5IHByZWZpeGluZ1xuICogZXJyb3JzIGFzIHRoZSBjYWxsIHN0YWNrIHVud2luZHMuXG4gKlxuICogQSBkaWZmZXJlbnQgbWV0aG9kIGlzIHRvIHBhc3MgaW4gYSBtb2RpZmllZCBmYWlsdXJlIGZ1bmN0aW9uIHVzaW5nIGBmYWlsdXJlLmluKC4uLilgLFxuICogdG8gYnVpbGQgdGhlIGVycm9yIG1lc3NhZ2UgYXMgdGhlIGNhbGwgc3RhY2sgZGVlcGVucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2F0ZUZhaWx1cmUocHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIDxBPih4OiBSZXN1bHQ8QT4pOiBSZXN1bHQ8QT4gPT4gKGlzRmFpbHVyZSh4KSA/IGZhaWx1cmUoYCR7cHJlZml4fTogJHt4W2Vycm9yU3ltXX1gKSA6IHgpO1xufVxuXG5leHBvcnQgdHlwZSBGYWlsdXJlcyA9IEFycmF5PEZhaWx1cmU+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlmdFJlc3VsdDxBPih4czogUmVjb3JkPHN0cmluZywgUmVzdWx0PEE+Pik6IFJlc3VsdDxSZWNvcmQ8c3RyaW5nLCBBPj47XG5leHBvcnQgZnVuY3Rpb24gbGlmdFJlc3VsdDxBPih4czogQXJyYXk8UmVzdWx0PEE+Pik6IFJlc3VsdDxBcnJheTxBPj47XG5leHBvcnQgZnVuY3Rpb24gbGlmdFJlc3VsdDxBPihcbiAgeHM6IFJlY29yZDxzdHJpbmcsIFJlc3VsdDxBPj4gfCBBcnJheTxSZXN1bHQ8QT4+LFxuKTogUmVzdWx0PFJlY29yZDxzdHJpbmcsIEE+PiB8IFJlc3VsdDxBcnJheTxBPj4ge1xuICBjb25zdCBmYWlsdXJlcyA9IEFycmF5LmlzQXJyYXkoeHMpID8geHMuZmlsdGVyKGlzRmFpbHVyZSkgOiBPYmplY3QudmFsdWVzKHhzKS5maWx0ZXIoaXNGYWlsdXJlKTtcbiAgaWYgKGZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZmFpbHVyZShmYWlsdXJlcy5tYXAoZXJyb3JNZXNzYWdlKS5qb2luKCcsICcpKTtcbiAgfVxuICByZXR1cm4geHMgYXMgYW55O1xufVxuXG4vKipcbiAqIExpZnQgYSB2YWx1ZSB0aGF0IGNhbiBiZSAndW5kZWZpbmVkJyB0byBhIHJlc3VsdCwgb3IgYSBmdW5jdGlvbiB0aGF0IGNhbiByZXR1cm4gdW5kZWZpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlmdFVuZGVmaW5lZDxBPih2OiBBIHwgdW5kZWZpbmVkKTogUmVzdWx0PE5vbk51bGxhYmxlPEE+PjtcbmV4cG9ydCBmdW5jdGlvbiBsaWZ0VW5kZWZpbmVkPEEsIEYgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IEE+KHY6IEYpOiAoeDogUGFyYW1ldGVyczxGPikgPT4gUmVzdWx0PE5vbk51bGxhYmxlPEE+PjtcbmV4cG9ydCBmdW5jdGlvbiBsaWZ0VW5kZWZpbmVkKHZhbHVlT3JGdW5jdGlvbjogYW55KTogYW55IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZU9yRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlT3JGdW5jdGlvbiguLi5hcmdzKTtcbiAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBmYWlsdXJlKCd2YWx1ZSBpcyB1bmRlZmluZWQnKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiB2YWx1ZU9yRnVuY3Rpb24gIT09IHVuZGVmaW5lZCA/IHZhbHVlT3JGdW5jdGlvbiA6IGZhaWx1cmUoJ3ZhbHVlIGlzIHVuZGVmaW5lZCcpO1xufVxuIl19 /***/ }), -/***/ 59738: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 95801: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.evaluateRules = void 0; -const types_1 = __nccwpck_require__(57433); -const evaluateEndpointRule_1 = __nccwpck_require__(35324); -const evaluateErrorRule_1 = __nccwpck_require__(12110); -const evaluateTreeRule_1 = __nccwpck_require__(26587); -const evaluateRules = (rules, options) => { - for (const rule of rules) { - if (rule.type === "endpoint") { - const endpointOrUndefined = (0, evaluateEndpointRule_1.evaluateEndpointRule)(rule, options); - if (endpointOrUndefined) { - return endpointOrUndefined; - } +exports.sortedMap = void 0; +/** + * A sorted map that may contain the same key multiple times + * + * Stored as a sorted array of [key, value] pairs, using binary search to locate + * entries. + */ +var sortedMap; +(function (sortedMap) { + function add(map, cmp, key, value) { + const i = lowerBound(map, cmp, key); + map.splice(i, 0, [key, value]); + } + sortedMap.add = add; + function find(map, cmp, key) { + const i = lowerBound(map, cmp, key); + if (i === map.length) { + return undefined; } - else if (rule.type === "error") { - (0, evaluateErrorRule_1.evaluateErrorRule)(rule, options); + const [foundKey, value] = map[i]; + return cmp(foundKey, key) === 0 ? value : undefined; + } + sortedMap.find = find; + function findAll(map, cmp, key) { + let i = lowerBound(map, cmp, key); + const ret = []; + while (i < map.length && cmp(map[i][0], key) === 0) { + ret.push(map[i][1]); + i += 1; } - else if (rule.type === "tree") { - const endpointOrUndefined = (0, evaluateTreeRule_1.evaluateTreeRule)(rule, options); - if (endpointOrUndefined) { - return endpointOrUndefined; + return ret; + } + sortedMap.findAll = findAll; + /** + * Return the index to the first element in the the sorted map + * + * @see https://en.cppreference.com/w/cpp/algorithm/lower_bound#Version_2 + */ + function lowerBound(map, cmp, key) { + let first = 0; + let count = map.length; + while (count > 0) { + let it = first; + let step = Math.floor(count / 2); + it += step; + if (cmp(map[it][0], key) < 0) { + first = ++it; + count -= step + 1; + } + else { + count = step; } } - else { - throw new types_1.EndpointError(`Unknown endpoint rule: ${rule}`); - } + return first; } - throw new types_1.EndpointError(`Rules evaluation failed`); -}; -exports.evaluateRules = evaluateRules; - +})(sortedMap = exports.sortedMap || (exports.sortedMap = {})); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGVkLW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zb3J0ZWQtbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOzs7OztHQUtHO0FBQ0gsSUFBaUIsU0FBUyxDQXNEekI7QUF0REQsV0FBaUIsU0FBUztJQUd4QixTQUFnQixHQUFHLENBQU8sR0FBeUIsRUFBRSxHQUFrQixFQUFFLEdBQU0sRUFBRSxLQUFRO1FBQ3ZGLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFIZSxhQUFHLE1BR2xCLENBQUE7SUFFRCxTQUFnQixJQUFJLENBQU8sR0FBeUIsRUFBRSxHQUFrQixFQUFFLEdBQU07UUFDOUUsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNwQixPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3RELENBQUM7SUFSZSxjQUFJLE9BUW5CLENBQUE7SUFFRCxTQUFnQixPQUFPLENBQU8sR0FBeUIsRUFBRSxHQUFrQixFQUFFLEdBQU07UUFDakYsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFbEMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsRCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDUjtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQVZlLGlCQUFPLFVBVXRCLENBQUE7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxVQUFVLENBQU8sR0FBeUIsRUFBRSxHQUFrQixFQUFFLEdBQU07UUFDN0UsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUV2QixPQUFPLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDaEIsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBQ2YsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxJQUFJLElBQUksQ0FBQztZQUVYLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLEtBQUssR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDYixLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQzthQUNuQjtpQkFBTTtnQkFDTCxLQUFLLEdBQUcsSUFBSSxDQUFDO2FBQ2Q7U0FDRjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMsRUF0RGdCLFNBQVMsR0FBVCxpQkFBUyxLQUFULGlCQUFTLFFBc0R6QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFNvcnRlZE11bHRpTWFwPEEsIEI+ID0gQXJyYXk8W0EsIEJdPjtcblxuLyoqXG4gKiBBIHNvcnRlZCBtYXAgdGhhdCBtYXkgY29udGFpbiB0aGUgc2FtZSBrZXkgbXVsdGlwbGUgdGltZXNcbiAqXG4gKiBTdG9yZWQgYXMgYSBzb3J0ZWQgYXJyYXkgb2YgW2tleSwgdmFsdWVdIHBhaXJzLCB1c2luZyBiaW5hcnkgc2VhcmNoIHRvIGxvY2F0ZVxuICogZW50cmllcy5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBzb3J0ZWRNYXAge1xuICBleHBvcnQgdHlwZSBDb21wYXJhdG9yPEE+ID0gKGE6IEEsIGI6IEEpID0+IG51bWJlcjtcblxuICBleHBvcnQgZnVuY3Rpb24gYWRkPEEsIEI+KG1hcDogU29ydGVkTXVsdGlNYXA8QSwgQj4sIGNtcDogQ29tcGFyYXRvcjxBPiwga2V5OiBBLCB2YWx1ZTogQikge1xuICAgIGNvbnN0IGkgPSBsb3dlckJvdW5kKG1hcCwgY21wLCBrZXkpO1xuICAgIG1hcC5zcGxpY2UoaSwgMCwgW2tleSwgdmFsdWVdKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBmaW5kPEEsIEI+KG1hcDogU29ydGVkTXVsdGlNYXA8QSwgQj4sIGNtcDogQ29tcGFyYXRvcjxBPiwga2V5OiBBKTogQiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaSA9IGxvd2VyQm91bmQobWFwLCBjbXAsIGtleSk7XG4gICAgaWYgKGkgPT09IG1hcC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZvdW5kS2V5LCB2YWx1ZV0gPSBtYXBbaV07XG4gICAgcmV0dXJuIGNtcChmb3VuZEtleSwga2V5KSA9PT0gMCA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGZpbmRBbGw8QSwgQj4obWFwOiBTb3J0ZWRNdWx0aU1hcDxBLCBCPiwgY21wOiBDb21wYXJhdG9yPEE+LCBrZXk6IEEpOiBCW10ge1xuICAgIGxldCBpID0gbG93ZXJCb3VuZChtYXAsIGNtcCwga2V5KTtcblxuICAgIGNvbnN0IHJldCA9IFtdO1xuICAgIHdoaWxlIChpIDwgbWFwLmxlbmd0aCAmJiBjbXAobWFwW2ldWzBdLCBrZXkpID09PSAwKSB7XG4gICAgICByZXQucHVzaChtYXBbaV1bMV0pO1xuICAgICAgaSArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBpbmRleCB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgdGhlIHNvcnRlZCBtYXBcbiAgICpcbiAgICogQHNlZSBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvYWxnb3JpdGhtL2xvd2VyX2JvdW5kI1ZlcnNpb25fMlxuICAgKi9cbiAgZnVuY3Rpb24gbG93ZXJCb3VuZDxBLCBCPihtYXA6IFNvcnRlZE11bHRpTWFwPEEsIEI+LCBjbXA6IENvbXBhcmF0b3I8QT4sIGtleTogQSk6IG51bWJlciB7XG4gICAgbGV0IGZpcnN0ID0gMDtcbiAgICBsZXQgY291bnQgPSBtYXAubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGNvdW50ID4gMCkge1xuICAgICAgbGV0IGl0ID0gZmlyc3Q7XG4gICAgICBsZXQgc3RlcCA9IE1hdGguZmxvb3IoY291bnQgLyAyKTtcbiAgICAgIGl0ICs9IHN0ZXA7XG5cbiAgICAgIGlmIChjbXAobWFwW2l0XVswXSwga2V5KSA8IDApIHtcbiAgICAgICAgZmlyc3QgPSArK2l0O1xuICAgICAgICBjb3VudCAtPSBzdGVwICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvdW50ID0gc3RlcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlyc3Q7XG4gIH1cbn1cbiJdfQ== /***/ }), -/***/ 57535: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 40334: +/***/ ((module) => { "use strict"; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.evaluateTemplate = void 0; -const lib_1 = __nccwpck_require__(83188); -const evaluateTemplate = (template, options) => { - const evaluatedTemplateArr = []; - const templateContext = { - ...options.endpointParams, - ...options.referenceRecord, - }; - let currentIndex = 0; - while (currentIndex < template.length) { - const openingBraceIndex = template.indexOf("{", currentIndex); - if (openingBraceIndex === -1) { - evaluatedTemplateArr.push(template.slice(currentIndex)); - break; - } - evaluatedTemplateArr.push(template.slice(currentIndex, openingBraceIndex)); - const closingBraceIndex = template.indexOf("}", openingBraceIndex); - if (closingBraceIndex === -1) { - evaluatedTemplateArr.push(template.slice(openingBraceIndex)); - break; - } - if (template[openingBraceIndex + 1] === "{" && template[closingBraceIndex + 1] === "}") { - evaluatedTemplateArr.push(template.slice(openingBraceIndex + 1, closingBraceIndex)); - currentIndex = closingBraceIndex + 2; - } - const parameterName = template.substring(openingBraceIndex + 1, closingBraceIndex); - if (parameterName.includes("#")) { - const [refName, attrName] = parameterName.split("#"); - evaluatedTemplateArr.push((0, lib_1.getAttr)(templateContext[refName], attrName)); - } - else { - evaluatedTemplateArr.push(templateContext[parameterName]); - } - currentIndex = closingBraceIndex + 1; - } - return evaluatedTemplateArr.join(""); +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); }; -exports.evaluateTemplate = evaluateTemplate; - - -/***/ }), - -/***/ 26587: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.evaluateTreeRule = void 0; -const evaluateConditions_1 = __nccwpck_require__(59169); -const evaluateRules_1 = __nccwpck_require__(59738); -const evaluateTreeRule = (treeRule, options) => { - const { conditions, rules } = treeRule; - const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options); - if (!result) { - return; - } - return (0, evaluateRules_1.evaluateRules)(rules, { - ...options, - referenceRecord: { ...options.referenceRecord, ...referenceRecord }, - }); +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; }; -exports.evaluateTreeRule = evaluateTreeRule; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +// pkg/dist-src/index.js +var dist_src_exports = {}; +__export(dist_src_exports, { + createTokenAuth: () => createTokenAuth +}); +module.exports = __toCommonJS(dist_src_exports); -/***/ }), +// pkg/dist-src/auth.js +var REGEX_IS_INSTALLATION_LEGACY = /^v1\./; +var REGEX_IS_INSTALLATION = /^ghs_/; +var REGEX_IS_USER_TO_SERVER = /^ghu_/; +async function auth(token) { + const isApp = token.split(/\./).length === 3; + const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); + const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); + const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; + return { + type: "token", + token, + tokenType + }; +} -/***/ 88268: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +// pkg/dist-src/with-authorization-prefix.js +function withAuthorizationPrefix(token) { + if (token.split(/\./).length === 3) { + return `bearer ${token}`; + } + return `token ${token}`; +} -"use strict"; +// pkg/dist-src/hook.js +async function hook(token, request, route, parameters) { + const endpoint = request.endpoint.merge( + route, + parameters + ); + endpoint.headers.authorization = withAuthorizationPrefix(token); + return request(endpoint); +} -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getEndpointHeaders = void 0; -const types_1 = __nccwpck_require__(57433); -const evaluateExpression_1 = __nccwpck_require__(82980); -const getEndpointHeaders = (headers, options) => Object.entries(headers).reduce((acc, [headerKey, headerVal]) => ({ - ...acc, - [headerKey]: headerVal.map((headerValEntry) => { - const processedExpr = (0, evaluateExpression_1.evaluateExpression)(headerValEntry, "Header value entry", options); - if (typeof processedExpr !== "string") { - throw new types_1.EndpointError(`Header '${headerKey}' value '${processedExpr}' is not a string`); - } - return processedExpr; - }), -}), {}); -exports.getEndpointHeaders = getEndpointHeaders; +// pkg/dist-src/index.js +var createTokenAuth = function createTokenAuth2(token) { + if (!token) { + throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); + } + if (typeof token !== "string") { + throw new Error( + "[@octokit/auth-token] Token passed to createTokenAuth is not a string" + ); + } + token = token.replace(/^(token|bearer) +/i, ""); + return Object.assign(auth.bind(null, token), { + hook: hook.bind(null, token) + }); +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (0); /***/ }), -/***/ 34973: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 76762: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getEndpointProperties = void 0; -const getEndpointProperty_1 = __nccwpck_require__(42978); -const getEndpointProperties = (properties, options) => Object.entries(properties).reduce((acc, [propertyKey, propertyVal]) => ({ - ...acc, - [propertyKey]: (0, getEndpointProperty_1.getEndpointProperty)(propertyVal, options), -}), {}); -exports.getEndpointProperties = getEndpointProperties; - - -/***/ }), +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -/***/ 42978: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +// pkg/dist-src/index.js +var dist_src_exports = {}; +__export(dist_src_exports, { + Octokit: () => Octokit +}); +module.exports = __toCommonJS(dist_src_exports); +var import_universal_user_agent = __nccwpck_require__(45030); +var import_before_after_hook = __nccwpck_require__(83682); +var import_request = __nccwpck_require__(36234); +var import_graphql = __nccwpck_require__(88467); +var import_auth_token = __nccwpck_require__(40334); -"use strict"; +// pkg/dist-src/version.js +var VERSION = "5.0.1"; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getEndpointProperty = void 0; -const types_1 = __nccwpck_require__(57433); -const evaluateTemplate_1 = __nccwpck_require__(57535); -const getEndpointProperties_1 = __nccwpck_require__(34973); -const getEndpointProperty = (property, options) => { - if (Array.isArray(property)) { - return property.map((propertyEntry) => (0, exports.getEndpointProperty)(propertyEntry, options)); +// pkg/dist-src/index.js +var Octokit = class { + static { + this.VERSION = VERSION; + } + static defaults(defaults) { + const OctokitWithDefaults = class extends this { + constructor(...args) { + const options = args[0] || {}; + if (typeof defaults === "function") { + super(defaults(options)); + return; + } + super( + Object.assign( + {}, + defaults, + options, + options.userAgent && defaults.userAgent ? { + userAgent: `${options.userAgent} ${defaults.userAgent}` + } : null + ) + ); + } + }; + return OctokitWithDefaults; + } + static { + this.plugins = []; + } + /** + * Attach a plugin (or many) to your Octokit instance. + * + * @example + * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) + */ + static plugin(...newPlugins) { + const currentPlugins = this.plugins; + const NewOctokit = class extends this { + static { + this.plugins = currentPlugins.concat( + newPlugins.filter((plugin) => !currentPlugins.includes(plugin)) + ); + } + }; + return NewOctokit; + } + constructor(options = {}) { + const hook = new import_before_after_hook.Collection(); + const requestDefaults = { + baseUrl: import_request.request.endpoint.DEFAULTS.baseUrl, + headers: {}, + request: Object.assign({}, options.request, { + // @ts-ignore internal usage only, no need to type + hook: hook.bind(null, "request") + }), + mediaType: { + previews: [], + format: "" + } + }; + requestDefaults.headers["user-agent"] = [ + options.userAgent, + `octokit-core.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}` + ].filter(Boolean).join(" "); + if (options.baseUrl) { + requestDefaults.baseUrl = options.baseUrl; } - switch (typeof property) { - case "string": - return (0, evaluateTemplate_1.evaluateTemplate)(property, options); - case "object": - if (property === null) { - throw new types_1.EndpointError(`Unexpected endpoint property: ${property}`); - } - return (0, getEndpointProperties_1.getEndpointProperties)(property, options); - case "boolean": - return property; - default: - throw new types_1.EndpointError(`Unexpected endpoint property type: ${typeof property}`); + if (options.previews) { + requestDefaults.mediaType.previews = options.previews; + } + if (options.timeZone) { + requestDefaults.headers["time-zone"] = options.timeZone; + } + this.request = import_request.request.defaults(requestDefaults); + this.graphql = (0, import_graphql.withCustomRequest)(this.request).defaults(requestDefaults); + this.log = Object.assign( + { + debug: () => { + }, + info: () => { + }, + warn: console.warn.bind(console), + error: console.error.bind(console) + }, + options.log + ); + this.hook = hook; + if (!options.authStrategy) { + if (!options.auth) { + this.auth = async () => ({ + type: "unauthenticated" + }); + } else { + const auth = (0, import_auth_token.createTokenAuth)(options.auth); + hook.wrap("request", auth.hook); + this.auth = auth; + } + } else { + const { authStrategy, ...otherOptions } = options; + const auth = authStrategy( + Object.assign( + { + request: this.request, + log: this.log, + // we pass the current octokit instance as well as its constructor options + // to allow for authentication strategies that return a new octokit instance + // that shares the same internal state as the current one. The original + // requirement for this was the "event-octokit" authentication strategy + // of https://github.com/probot/octokit-auth-probot. + octokit: this, + octokitOptions: otherOptions + }, + options.auth + ) + ); + hook.wrap("request", auth.hook); + this.auth = auth; } + const classConstructor = this.constructor; + classConstructor.plugins.forEach((plugin) => { + Object.assign(this, plugin(this, options)); + }); + } }; -exports.getEndpointProperty = getEndpointProperty; +// Annotate the CommonJS export names for ESM import in node: +0 && (0); /***/ }), -/***/ 23602: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 59440: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getEndpointUrl = void 0; -const types_1 = __nccwpck_require__(57433); -const evaluateExpression_1 = __nccwpck_require__(82980); -const getEndpointUrl = (endpointUrl, options) => { - const expression = (0, evaluateExpression_1.evaluateExpression)(endpointUrl, "Endpoint URL", options); - if (typeof expression === "string") { - try { - return new URL(expression); - } - catch (error) { - console.error(`Failed to construct URL with ${expression}`, error); - throw error; - } - } - throw new types_1.EndpointError(`Endpoint URL must be a string, got ${typeof expression}`); +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); }; -exports.getEndpointUrl = getEndpointUrl; - - -/***/ }), - -/***/ 68810: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getReferenceValue = void 0; -const getReferenceValue = ({ ref }, options) => { - const referenceRecord = { - ...options.endpointParams, - ...options.referenceRecord, - }; - return referenceRecord[ref]; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; }; -exports.getReferenceValue = getReferenceValue; - - -/***/ }), - -/***/ 81114: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(59738), exports); - +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -/***/ }), +// pkg/dist-src/index.js +var dist_src_exports = {}; +__export(dist_src_exports, { + endpoint: () => endpoint +}); +module.exports = __toCommonJS(dist_src_exports); -/***/ 5865: -/***/ ((__unused_webpack_module, exports) => { +// pkg/dist-src/defaults.js +var import_universal_user_agent = __nccwpck_require__(45030); -"use strict"; +// pkg/dist-src/version.js +var VERSION = "9.0.2"; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.crtAvailability = void 0; -exports.crtAvailability = { - isCrtAvailable: false, +// pkg/dist-src/defaults.js +var userAgent = `octokit-endpoint.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`; +var DEFAULTS = { + method: "GET", + baseUrl: "https://api.github.com", + headers: { + accept: "application/vnd.github.v3+json", + "user-agent": userAgent + }, + mediaType: { + format: "" + } }; +// pkg/dist-src/util/lowercase-keys.js +function lowercaseKeys(object) { + if (!object) { + return {}; + } + return Object.keys(object).reduce((newObj, key) => { + newObj[key.toLowerCase()] = object[key]; + return newObj; + }, {}); +} -/***/ }), - -/***/ 98095: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.defaultUserAgent = exports.UA_APP_ID_INI_NAME = exports.UA_APP_ID_ENV_NAME = exports.crtAvailability = void 0; -const node_config_provider_1 = __nccwpck_require__(33461); -const os_1 = __nccwpck_require__(22037); -const process_1 = __nccwpck_require__(77282); -const is_crt_available_1 = __nccwpck_require__(68390); -var crt_availability_1 = __nccwpck_require__(5865); -Object.defineProperty(exports, "crtAvailability", ({ enumerable: true, get: function () { return crt_availability_1.crtAvailability; } })); -exports.UA_APP_ID_ENV_NAME = "AWS_SDK_UA_APP_ID"; -exports.UA_APP_ID_INI_NAME = "sdk-ua-app-id"; -const defaultUserAgent = ({ serviceId, clientVersion }) => { - const sections = [ - ["aws-sdk-js", clientVersion], - ["ua", "2.0"], - [`os/${(0, os_1.platform)()}`, (0, os_1.release)()], - ["lang/js"], - ["md/nodejs", `${process_1.versions.node}`], - ]; - const crtAvailable = (0, is_crt_available_1.isCrtAvailable)(); - if (crtAvailable) { - sections.push(crtAvailable); - } - if (serviceId) { - sections.push([`api/${serviceId}`, clientVersion]); - } - if (process_1.env.AWS_EXECUTION_ENV) { - sections.push([`exec-env/${process_1.env.AWS_EXECUTION_ENV}`]); +// pkg/dist-src/util/merge-deep.js +var import_is_plain_object = __nccwpck_require__(63287); +function mergeDeep(defaults, options) { + const result = Object.assign({}, defaults); + Object.keys(options).forEach((key) => { + if ((0, import_is_plain_object.isPlainObject)(options[key])) { + if (!(key in defaults)) + Object.assign(result, { [key]: options[key] }); + else + result[key] = mergeDeep(defaults[key], options[key]); + } else { + Object.assign(result, { [key]: options[key] }); } - const appIdPromise = (0, node_config_provider_1.loadConfig)({ - environmentVariableSelector: (env) => env[exports.UA_APP_ID_ENV_NAME], - configFileSelector: (profile) => profile[exports.UA_APP_ID_INI_NAME], - default: undefined, - })(); - let resolvedUserAgent = undefined; - return async () => { - if (!resolvedUserAgent) { - const appId = await appIdPromise; - resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; - } - return resolvedUserAgent; - }; -}; -exports.defaultUserAgent = defaultUserAgent; - - -/***/ }), - -/***/ 68390: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; + }); + return result; +} -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isCrtAvailable = void 0; -const crt_availability_1 = __nccwpck_require__(5865); -const isCrtAvailable = () => { - if (crt_availability_1.crtAvailability.isCrtAvailable) { - return ["md/crt-avail"]; +// pkg/dist-src/util/remove-undefined-properties.js +function removeUndefinedProperties(obj) { + for (const key in obj) { + if (obj[key] === void 0) { + delete obj[key]; } - return null; -}; -exports.isCrtAvailable = isCrtAvailable; - - -/***/ }), - -/***/ 28172: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.toUtf8 = exports.fromUtf8 = void 0; -const pureJs_1 = __nccwpck_require__(21590); -const whatwgEncodingApi_1 = __nccwpck_require__(89215); -const fromUtf8 = (input) => typeof TextEncoder === "function" ? (0, whatwgEncodingApi_1.fromUtf8)(input) : (0, pureJs_1.fromUtf8)(input); -exports.fromUtf8 = fromUtf8; -const toUtf8 = (input) => typeof TextDecoder === "function" ? (0, whatwgEncodingApi_1.toUtf8)(input) : (0, pureJs_1.toUtf8)(input); -exports.toUtf8 = toUtf8; + } + return obj; +} +// pkg/dist-src/merge.js +function merge(defaults, route, options) { + if (typeof route === "string") { + let [method, url] = route.split(" "); + options = Object.assign(url ? { method, url } : { url: method }, options); + } else { + options = Object.assign({}, route); + } + options.headers = lowercaseKeys(options.headers); + removeUndefinedProperties(options); + removeUndefinedProperties(options.headers); + const mergedOptions = mergeDeep(defaults || {}, options); + if (options.url === "/graphql") { + if (defaults && defaults.mediaType.previews?.length) { + mergedOptions.mediaType.previews = defaults.mediaType.previews.filter( + (preview) => !mergedOptions.mediaType.previews.includes(preview) + ).concat(mergedOptions.mediaType.previews); + } + mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, "")); + } + return mergedOptions; +} -/***/ }), +// pkg/dist-src/util/add-query-parameters.js +function addQueryParameters(url, parameters) { + const separator = /\?/.test(url) ? "&" : "?"; + const names = Object.keys(parameters); + if (names.length === 0) { + return url; + } + return url + separator + names.map((name) => { + if (name === "q") { + return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); + } + return `${name}=${encodeURIComponent(parameters[name])}`; + }).join("&"); +} -/***/ 21590: -/***/ ((__unused_webpack_module, exports) => { +// pkg/dist-src/util/extract-url-variable-names.js +var urlVariableRegex = /\{[^}]+\}/g; +function removeNonChars(variableName) { + return variableName.replace(/^\W+|\W+$/g, "").split(/,/); +} +function extractUrlVariableNames(url) { + const matches = url.match(urlVariableRegex); + if (!matches) { + return []; + } + return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); +} -"use strict"; +// pkg/dist-src/util/omit.js +function omit(object, keysToOmit) { + return Object.keys(object).filter((option) => !keysToOmit.includes(option)).reduce((obj, key) => { + obj[key] = object[key]; + return obj; + }, {}); +} -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.toUtf8 = exports.fromUtf8 = void 0; -const fromUtf8 = (input) => { - const bytes = []; - for (let i = 0, len = input.length; i < len; i++) { - const value = input.charCodeAt(i); - if (value < 0x80) { - bytes.push(value); - } - else if (value < 0x800) { - bytes.push((value >> 6) | 0b11000000, (value & 0b111111) | 0b10000000); +// pkg/dist-src/util/url-template.js +function encodeReserved(str) { + return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) { + if (!/%[0-9A-Fa-f]/.test(part)) { + part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); + } + return part; + }).join(""); +} +function encodeUnreserved(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); +} +function encodeValue(operator, value, key) { + value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); + if (key) { + return encodeUnreserved(key) + "=" + value; + } else { + return value; + } +} +function isDefined(value) { + return value !== void 0 && value !== null; +} +function isKeyOperator(operator) { + return operator === ";" || operator === "&" || operator === "?"; +} +function getValues(context, operator, key, modifier) { + var value = context[key], result = []; + if (isDefined(value) && value !== "") { + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + value = value.toString(); + if (modifier && modifier !== "*") { + value = value.substring(0, parseInt(modifier, 10)); + } + result.push( + encodeValue(operator, value, isKeyOperator(operator) ? key : "") + ); + } else { + if (modifier === "*") { + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function(value2) { + result.push( + encodeValue(operator, value2, isKeyOperator(operator) ? key : "") + ); + }); + } else { + Object.keys(value).forEach(function(k) { + if (isDefined(value[k])) { + result.push(encodeValue(operator, value[k], k)); + } + }); } - else if (i + 1 < input.length && (value & 0xfc00) === 0xd800 && (input.charCodeAt(i + 1) & 0xfc00) === 0xdc00) { - const surrogatePair = 0x10000 + ((value & 0b1111111111) << 10) + (input.charCodeAt(++i) & 0b1111111111); - bytes.push((surrogatePair >> 18) | 0b11110000, ((surrogatePair >> 12) & 0b111111) | 0b10000000, ((surrogatePair >> 6) & 0b111111) | 0b10000000, (surrogatePair & 0b111111) | 0b10000000); + } else { + const tmp = []; + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function(value2) { + tmp.push(encodeValue(operator, value2)); + }); + } else { + Object.keys(value).forEach(function(k) { + if (isDefined(value[k])) { + tmp.push(encodeUnreserved(k)); + tmp.push(encodeValue(operator, value[k].toString())); + } + }); } - else { - bytes.push((value >> 12) | 0b11100000, ((value >> 6) & 0b111111) | 0b10000000, (value & 0b111111) | 0b10000000); + if (isKeyOperator(operator)) { + result.push(encodeUnreserved(key) + "=" + tmp.join(",")); + } else if (tmp.length !== 0) { + result.push(tmp.join(",")); } + } } - return Uint8Array.from(bytes); -}; -exports.fromUtf8 = fromUtf8; -const toUtf8 = (input) => { - let decoded = ""; - for (let i = 0, len = input.length; i < len; i++) { - const byte = input[i]; - if (byte < 0x80) { - decoded += String.fromCharCode(byte); - } - else if (0b11000000 <= byte && byte < 0b11100000) { - const nextByte = input[++i]; - decoded += String.fromCharCode(((byte & 0b11111) << 6) | (nextByte & 0b111111)); - } - else if (0b11110000 <= byte && byte < 0b101101101) { - const surrogatePair = [byte, input[++i], input[++i], input[++i]]; - const encoded = "%" + surrogatePair.map((byteValue) => byteValue.toString(16)).join("%"); - decoded += decodeURIComponent(encoded); + } else { + if (operator === ";") { + if (isDefined(value)) { + result.push(encodeUnreserved(key)); + } + } else if (value === "" && (operator === "&" || operator === "?")) { + result.push(encodeUnreserved(key) + "="); + } else if (value === "") { + result.push(""); + } + } + return result; +} +function parseUrl(template) { + return { + expand: expand.bind(null, template) + }; +} +function expand(template, context) { + var operators = ["+", "#", ".", "/", ";", "?", "&"]; + template = template.replace( + /\{([^\{\}]+)\}|([^\{\}]+)/g, + function(_, expression, literal) { + if (expression) { + let operator = ""; + const values = []; + if (operators.indexOf(expression.charAt(0)) !== -1) { + operator = expression.charAt(0); + expression = expression.substr(1); } - else { - decoded += String.fromCharCode(((byte & 0b1111) << 12) | ((input[++i] & 0b111111) << 6) | (input[++i] & 0b111111)); + expression.split(/,/g).forEach(function(variable) { + var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); + values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); + }); + if (operator && operator !== "+") { + var separator = ","; + if (operator === "?") { + separator = "&"; + } else if (operator !== "#") { + separator = operator; + } + return (values.length !== 0 ? operator : "") + values.join(separator); + } else { + return values.join(","); } + } else { + return encodeReserved(literal); + } } - return decoded; -}; -exports.toUtf8 = toUtf8; - - -/***/ }), - -/***/ 89215: -/***/ ((__unused_webpack_module, exports) => { + ); + if (template === "/") { + return template; + } else { + return template.replace(/\/$/, ""); + } +} -"use strict"; +// pkg/dist-src/parse.js +function parse(options) { + let method = options.method.toUpperCase(); + let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); + let headers = Object.assign({}, options.headers); + let body; + let parameters = omit(options, [ + "method", + "baseUrl", + "url", + "headers", + "request", + "mediaType" + ]); + const urlVariableNames = extractUrlVariableNames(url); + url = parseUrl(url).expand(parameters); + if (!/^http/.test(url)) { + url = options.baseUrl + url; + } + const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl"); + const remainingParameters = omit(parameters, omittedParameters); + const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); + if (!isBinaryRequest) { + if (options.mediaType.format) { + headers.accept = headers.accept.split(/,/).map( + (format) => format.replace( + /application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, + `application/vnd$1$2.${options.mediaType.format}` + ) + ).join(","); + } + if (url.endsWith("/graphql")) { + if (options.mediaType.previews?.length) { + const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; + headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map((preview) => { + const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; + return `application/vnd.github.${preview}-preview${format}`; + }).join(","); + } + } + } + if (["GET", "HEAD"].includes(method)) { + url = addQueryParameters(url, remainingParameters); + } else { + if ("data" in remainingParameters) { + body = remainingParameters.data; + } else { + if (Object.keys(remainingParameters).length) { + body = remainingParameters; + } + } + } + if (!headers["content-type"] && typeof body !== "undefined") { + headers["content-type"] = "application/json; charset=utf-8"; + } + if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { + body = ""; + } + return Object.assign( + { method, url, headers }, + typeof body !== "undefined" ? { body } : null, + options.request ? { request: options.request } : null + ); +} -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.toUtf8 = exports.fromUtf8 = void 0; -function fromUtf8(input) { - return new TextEncoder().encode(input); +// pkg/dist-src/endpoint-with-defaults.js +function endpointWithDefaults(defaults, route, options) { + return parse(merge(defaults, route, options)); } -exports.fromUtf8 = fromUtf8; -function toUtf8(input) { - return new TextDecoder("utf-8").decode(input); + +// pkg/dist-src/with-defaults.js +function withDefaults(oldDefaults, newDefaults) { + const DEFAULTS2 = merge(oldDefaults, newDefaults); + const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2); + return Object.assign(endpoint2, { + DEFAULTS: DEFAULTS2, + defaults: withDefaults.bind(null, DEFAULTS2), + merge: merge.bind(null, DEFAULTS2), + parse + }); } -exports.toUtf8 = toUtf8; + +// pkg/dist-src/index.js +var endpoint = withDefaults(null, DEFAULTS); +// Annotate the CommonJS export names for ESM import in node: +0 && (0); /***/ }), -/***/ 2856: +/***/ 88467: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; - -const WritableStream = (__nccwpck_require__(84492).Writable) -const inherits = (__nccwpck_require__(47261).inherits) - -const StreamSearch = __nccwpck_require__(88534) - -const PartStream = __nccwpck_require__(38710) -const HeaderParser = __nccwpck_require__(90333) - -const DASH = 45 -const B_ONEDASH = Buffer.from('-') -const B_CRLF = Buffer.from('\r\n') -const EMPTY_FN = function () {} - -function Dicer (cfg) { - if (!(this instanceof Dicer)) { return new Dicer(cfg) } - WritableStream.call(this, cfg) - - if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') } - - if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined } - - this._headerFirst = cfg.headerFirst - - this._dashes = 0 - this._parts = 0 - this._finished = false - this._realFinish = false - this._isPreamble = true - this._justMatched = false - this._firstWrite = true - this._inHeader = true - this._part = undefined - this._cb = undefined - this._ignoreData = false - this._partOpts = { highWaterMark: cfg.partHwm } - this._pause = false - - const self = this - this._hparser = new HeaderParser(cfg) - this._hparser.on('header', function (header) { - self._inHeader = false - self._part.emit('header', header) - }) -} -inherits(Dicer, WritableStream) - -Dicer.prototype.emit = function (ev) { - if (ev === 'finish' && !this._realFinish) { - if (!this._finished) { - const self = this - process.nextTick(function () { - self.emit('error', new Error('Unexpected end of multipart data')) - if (self._part && !self._ignoreData) { - const type = (self._isPreamble ? 'Preamble' : 'Part') - self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data')) - self._part.push(null) - process.nextTick(function () { - self._realFinish = true - self.emit('finish') - self._realFinish = false - }) - return - } - self._realFinish = true - self.emit('finish') - self._realFinish = false - }) - } - } else { WritableStream.prototype.emit.apply(this, arguments) } -} - -Dicer.prototype._write = function (data, encoding, cb) { - // ignore unexpected data (e.g. extra trailer data after finished) - if (!this._hparser && !this._bparser) { return cb() } - - if (this._headerFirst && this._isPreamble) { - if (!this._part) { - this._part = new PartStream(this._partOpts) - if (this._events.preamble) { this.emit('preamble', this._part) } else { this._ignore() } - } - const r = this._hparser.push(data) - if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() } +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - // allows for "easier" testing - if (this._firstWrite) { - this._bparser.push(B_CRLF) - this._firstWrite = false - } +// pkg/dist-src/index.js +var dist_src_exports = {}; +__export(dist_src_exports, { + GraphqlResponseError: () => GraphqlResponseError, + graphql: () => graphql2, + withCustomRequest: () => withCustomRequest +}); +module.exports = __toCommonJS(dist_src_exports); +var import_request3 = __nccwpck_require__(36234); +var import_universal_user_agent = __nccwpck_require__(45030); - this._bparser.push(data) +// pkg/dist-src/version.js +var VERSION = "7.0.2"; - if (this._pause) { this._cb = cb } else { cb() } -} +// pkg/dist-src/with-defaults.js +var import_request2 = __nccwpck_require__(36234); -Dicer.prototype.reset = function () { - this._part = undefined - this._bparser = undefined - this._hparser = undefined -} +// pkg/dist-src/graphql.js +var import_request = __nccwpck_require__(36234); -Dicer.prototype.setBoundary = function (boundary) { - const self = this - this._bparser = new StreamSearch('\r\n--' + boundary) - this._bparser.on('info', function (isMatch, data, start, end) { - self._oninfo(isMatch, data, start, end) - }) +// pkg/dist-src/error.js +function _buildMessageForResponseErrors(data) { + return `Request failed due to following response errors: +` + data.errors.map((e) => ` - ${e.message}`).join("\n"); } - -Dicer.prototype._ignore = function () { - if (this._part && !this._ignoreData) { - this._ignoreData = true - this._part.on('error', EMPTY_FN) - // we must perform some kind of read on the stream even though we are - // ignoring the data, otherwise node's Readable stream will not emit 'end' - // after pushing null to the stream - this._part.resume() +var GraphqlResponseError = class extends Error { + constructor(request2, headers, response) { + super(_buildMessageForResponseErrors(response)); + this.request = request2; + this.headers = headers; + this.response = response; + this.name = "GraphqlResponseError"; + this.errors = response.errors; + this.data = response.data; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } } -} - -Dicer.prototype._oninfo = function (isMatch, data, start, end) { - let buf; const self = this; let i = 0; let r; let shouldWriteMore = true +}; - if (!this._part && this._justMatched && data) { - while (this._dashes < 2 && (start + i) < end) { - if (data[start + i] === DASH) { - ++i - ++this._dashes - } else { - if (this._dashes) { buf = B_ONEDASH } - this._dashes = 0 - break - } +// pkg/dist-src/graphql.js +var NON_VARIABLE_OPTIONS = [ + "method", + "baseUrl", + "url", + "headers", + "request", + "query", + "mediaType" +]; +var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; +var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; +function graphql(request2, query, options) { + if (options) { + if (typeof query === "string" && "query" in options) { + return Promise.reject( + new Error(`[@octokit/graphql] "query" cannot be used as variable name`) + ); } - if (this._dashes === 2) { - if ((start + i) < end && this._events.trailer) { this.emit('trailer', data.slice(start + i, end)) } - this.reset() - this._finished = true - // no more parts will be added - if (self._parts === 0) { - self._realFinish = true - self.emit('finish') - self._realFinish = false - } + for (const key in options) { + if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) + continue; + return Promise.reject( + new Error( + `[@octokit/graphql] "${key}" cannot be used as variable name` + ) + ); } - if (this._dashes) { return } } - if (this._justMatched) { this._justMatched = false } - if (!this._part) { - this._part = new PartStream(this._partOpts) - this._part._read = function (n) { - self._unpause() + const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query; + const requestOptions = Object.keys( + parsedOptions + ).reduce((result, key) => { + if (NON_VARIABLE_OPTIONS.includes(key)) { + result[key] = parsedOptions[key]; + return result; } - if (this._isPreamble && this._events.preamble) { this.emit('preamble', this._part) } else if (this._isPreamble !== true && this._events.part) { this.emit('part', this._part) } else { this._ignore() } - if (!this._isPreamble) { this._inHeader = true } - } - if (data && start < end && !this._ignoreData) { - if (this._isPreamble || !this._inHeader) { - if (buf) { shouldWriteMore = this._part.push(buf) } - shouldWriteMore = this._part.push(data.slice(start, end)) - if (!shouldWriteMore) { this._pause = true } - } else if (!this._isPreamble && this._inHeader) { - if (buf) { this._hparser.push(buf) } - r = this._hparser.push(data.slice(start, end)) - if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) } + if (!result.variables) { + result.variables = {}; } + result.variables[key] = parsedOptions[key]; + return result; + }, {}); + const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl; + if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { + requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); } - if (isMatch) { - this._hparser.reset() - if (this._isPreamble) { this._isPreamble = false } else { - if (start !== end) { - ++this._parts - this._part.on('end', function () { - if (--self._parts === 0) { - if (self._finished) { - self._realFinish = true - self.emit('finish') - self._realFinish = false - } else { - self._unpause() - } - } - }) + return request2(requestOptions).then((response) => { + if (response.data.errors) { + const headers = {}; + for (const key of Object.keys(response.headers)) { + headers[key] = response.headers[key]; } + throw new GraphqlResponseError( + requestOptions, + headers, + response.data + ); } - this._part.push(null) - this._part = undefined - this._ignoreData = false - this._justMatched = true - this._dashes = 0 - } + return response.data.data; + }); } -Dicer.prototype._unpause = function () { - if (!this._pause) { return } - - this._pause = false - if (this._cb) { - const cb = this._cb - this._cb = undefined - cb() - } +// pkg/dist-src/with-defaults.js +function withDefaults(request2, newDefaults) { + const newRequest = request2.defaults(newDefaults); + const newApi = (query, options) => { + return graphql(newRequest, query, options); + }; + return Object.assign(newApi, { + defaults: withDefaults.bind(null, newRequest), + endpoint: newRequest.endpoint + }); } -module.exports = Dicer +// pkg/dist-src/index.js +var graphql2 = withDefaults(import_request3.request, { + headers: { + "user-agent": `octokit-graphql.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}` + }, + method: "POST", + url: "/graphql" +}); +function withCustomRequest(customRequest) { + return withDefaults(customRequest, { + method: "POST", + url: "/graphql" + }); +} +// Annotate the CommonJS export names for ESM import in node: +0 && (0); /***/ }), -/***/ 90333: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ 64193: +/***/ ((module) => { "use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -const EventEmitter = (__nccwpck_require__(15673).EventEmitter) -const inherits = (__nccwpck_require__(47261).inherits) -const getLimit = __nccwpck_require__(49692) - -const StreamSearch = __nccwpck_require__(88534) - -const B_DCRLF = Buffer.from('\r\n\r\n') -const RE_CRLF = /\r\n/g -const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/ // eslint-disable-line no-control-regex - -function HeaderParser (cfg) { - EventEmitter.call(this) - - cfg = cfg || {} - const self = this - this.nread = 0 - this.maxed = false - this.npairs = 0 - this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000) - this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024) - this.buffer = '' - this.header = {} - this.finished = false - this.ss = new StreamSearch(B_DCRLF) - this.ss.on('info', function (isMatch, data, start, end) { - if (data && !self.maxed) { - if (self.nread + end - start >= self.maxHeaderSize) { - end = self.maxHeaderSize - self.nread + start - self.nread = self.maxHeaderSize - self.maxed = true - } else { self.nread += (end - start) } +// pkg/dist-src/index.js +var dist_src_exports = {}; +__export(dist_src_exports, { + composePaginateRest: () => composePaginateRest, + isPaginatingEndpoint: () => isPaginatingEndpoint, + paginateRest: () => paginateRest, + paginatingEndpoints: () => paginatingEndpoints +}); +module.exports = __toCommonJS(dist_src_exports); - self.buffer += data.toString('binary', start, end) - } - if (isMatch) { self._finish() } - }) -} -inherits(HeaderParser, EventEmitter) +// pkg/dist-src/version.js +var VERSION = "9.1.4"; -HeaderParser.prototype.push = function (data) { - const r = this.ss.push(data) - if (this.finished) { return r } +// pkg/dist-src/normalize-paginated-list-response.js +function normalizePaginatedListResponse(response) { + if (!response.data) { + return { + ...response, + data: [] + }; + } + const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); + if (!responseNeedsNormalization) + return response; + const incompleteResults = response.data.incomplete_results; + const repositorySelection = response.data.repository_selection; + const totalCount = response.data.total_count; + delete response.data.incomplete_results; + delete response.data.repository_selection; + delete response.data.total_count; + const namespaceKey = Object.keys(response.data)[0]; + const data = response.data[namespaceKey]; + response.data = data; + if (typeof incompleteResults !== "undefined") { + response.data.incomplete_results = incompleteResults; + } + if (typeof repositorySelection !== "undefined") { + response.data.repository_selection = repositorySelection; + } + response.data.total_count = totalCount; + return response; } -HeaderParser.prototype.reset = function () { - this.finished = false - this.buffer = '' - this.header = {} - this.ss.reset() +// pkg/dist-src/iterator.js +function iterator(octokit, route, parameters) { + const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); + const requestMethod = typeof route === "function" ? route : octokit.request; + const method = options.method; + const headers = options.headers; + let url = options.url; + return { + [Symbol.asyncIterator]: () => ({ + async next() { + if (!url) + return { done: true }; + try { + const response = await requestMethod({ method, url, headers }); + const normalizedResponse = normalizePaginatedListResponse(response); + url = ((normalizedResponse.headers.link || "").match( + /<([^>]+)>;\s*rel="next"/ + ) || [])[1]; + return { value: normalizedResponse }; + } catch (error) { + if (error.status !== 409) + throw error; + url = ""; + return { + value: { + status: 200, + headers: {}, + data: [] + } + }; + } + } + }) + }; } -HeaderParser.prototype._finish = function () { - if (this.buffer) { this._parseHeader() } - this.ss.matches = this.ss.maxMatches - const header = this.header - this.header = {} - this.buffer = '' - this.finished = true - this.nread = this.npairs = 0 - this.maxed = false - this.emit('header', header) +// pkg/dist-src/paginate.js +function paginate(octokit, route, parameters, mapFn) { + if (typeof parameters === "function") { + mapFn = parameters; + parameters = void 0; + } + return gather( + octokit, + [], + iterator(octokit, route, parameters)[Symbol.asyncIterator](), + mapFn + ); } - -HeaderParser.prototype._parseHeader = function () { - if (this.npairs === this.maxHeaderPairs) { return } - - const lines = this.buffer.split(RE_CRLF) - const len = lines.length - let m, h - - for (var i = 0; i < len; ++i) { // eslint-disable-line no-var - if (lines[i].length === 0) { continue } - if (lines[i][0] === '\t' || lines[i][0] === ' ') { - // folded header content - // RFC2822 says to just remove the CRLF and not the whitespace following - // it, so we follow the RFC and include the leading whitespace ... - if (h) { - this.header[h][this.header[h].length - 1] += lines[i] - continue - } +function gather(octokit, results, iterator2, mapFn) { + return iterator2.next().then((result) => { + if (result.done) { + return results; } - - const posColon = lines[i].indexOf(':') - if ( - posColon === -1 || - posColon === 0 - ) { - return + let earlyExit = false; + function done() { + earlyExit = true; } - m = RE_HDR.exec(lines[i]) - h = m[1].toLowerCase() - this.header[h] = this.header[h] || [] - this.header[h].push((m[2] || '')) - if (++this.npairs === this.maxHeaderPairs) { break } - } + results = results.concat( + mapFn ? mapFn(result.value, done) : result.value.data + ); + if (earlyExit) { + return results; + } + return gather(octokit, results, iterator2, mapFn); + }); } -module.exports = HeaderParser - - -/***/ }), - -/***/ 38710: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -const inherits = (__nccwpck_require__(47261).inherits) -const ReadableStream = (__nccwpck_require__(84492).Readable) - -function PartStream (opts) { - ReadableStream.call(this, opts) -} -inherits(PartStream, ReadableStream) - -PartStream.prototype._read = function (n) {} - -module.exports = PartStream - - -/***/ }), - -/***/ 88534: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -/** - * Copyright Brian White. All rights reserved. - * - * @see https://github.com/mscdex/streamsearch - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - * - * Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation - * by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool - */ -const EventEmitter = (__nccwpck_require__(15673).EventEmitter) -const inherits = (__nccwpck_require__(47261).inherits) - -function SBMH (needle) { - if (typeof needle === 'string') { - needle = Buffer.from(needle) - } - - if (!Buffer.isBuffer(needle)) { - throw new TypeError('The needle has to be a String or a Buffer.') - } - - const needleLength = needle.length - - if (needleLength === 0) { - throw new Error('The needle cannot be an empty String/Buffer.') - } - - if (needleLength > 256) { - throw new Error('The needle cannot have a length bigger than 256.') - } - - this.maxMatches = Infinity - this.matches = 0 - - this._occ = new Array(256) - .fill(needleLength) // Initialize occurrence table. - this._lookbehind_size = 0 - this._needle = needle - this._bufpos = 0 +// pkg/dist-src/compose-paginate.js +var composePaginateRest = Object.assign(paginate, { + iterator +}); - this._lookbehind = Buffer.alloc(needleLength) +// pkg/dist-src/generated/paginating-endpoints.js +var paginatingEndpoints = [ + "GET /advisories", + "GET /app/hook/deliveries", + "GET /app/installation-requests", + "GET /app/installations", + "GET /assignments/{assignment_id}/accepted_assignments", + "GET /classrooms", + "GET /classrooms/{classroom_id}/assignments", + "GET /enterprises/{enterprise}/dependabot/alerts", + "GET /enterprises/{enterprise}/secret-scanning/alerts", + "GET /events", + "GET /gists", + "GET /gists/public", + "GET /gists/starred", + "GET /gists/{gist_id}/comments", + "GET /gists/{gist_id}/commits", + "GET /gists/{gist_id}/forks", + "GET /installation/repositories", + "GET /issues", + "GET /licenses", + "GET /marketplace_listing/plans", + "GET /marketplace_listing/plans/{plan_id}/accounts", + "GET /marketplace_listing/stubbed/plans", + "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", + "GET /networks/{owner}/{repo}/events", + "GET /notifications", + "GET /organizations", + "GET /orgs/{org}/actions/cache/usage-by-repository", + "GET /orgs/{org}/actions/permissions/repositories", + "GET /orgs/{org}/actions/runners", + "GET /orgs/{org}/actions/secrets", + "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", + "GET /orgs/{org}/actions/variables", + "GET /orgs/{org}/actions/variables/{name}/repositories", + "GET /orgs/{org}/blocks", + "GET /orgs/{org}/code-scanning/alerts", + "GET /orgs/{org}/codespaces", + "GET /orgs/{org}/codespaces/secrets", + "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories", + "GET /orgs/{org}/copilot/billing/seats", + "GET /orgs/{org}/dependabot/alerts", + "GET /orgs/{org}/dependabot/secrets", + "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", + "GET /orgs/{org}/events", + "GET /orgs/{org}/failed_invitations", + "GET /orgs/{org}/hooks", + "GET /orgs/{org}/hooks/{hook_id}/deliveries", + "GET /orgs/{org}/installations", + "GET /orgs/{org}/invitations", + "GET /orgs/{org}/invitations/{invitation_id}/teams", + "GET /orgs/{org}/issues", + "GET /orgs/{org}/members", + "GET /orgs/{org}/members/{username}/codespaces", + "GET /orgs/{org}/migrations", + "GET /orgs/{org}/migrations/{migration_id}/repositories", + "GET /orgs/{org}/outside_collaborators", + "GET /orgs/{org}/packages", + "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", + "GET /orgs/{org}/personal-access-token-requests", + "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories", + "GET /orgs/{org}/personal-access-tokens", + "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories", + "GET /orgs/{org}/projects", + "GET /orgs/{org}/properties/values", + "GET /orgs/{org}/public_members", + "GET /orgs/{org}/repos", + "GET /orgs/{org}/rulesets", + "GET /orgs/{org}/rulesets/rule-suites", + "GET /orgs/{org}/secret-scanning/alerts", + "GET /orgs/{org}/security-advisories", + "GET /orgs/{org}/teams", + "GET /orgs/{org}/teams/{team_slug}/discussions", + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", + "GET /orgs/{org}/teams/{team_slug}/invitations", + "GET /orgs/{org}/teams/{team_slug}/members", + "GET /orgs/{org}/teams/{team_slug}/projects", + "GET /orgs/{org}/teams/{team_slug}/repos", + "GET /orgs/{org}/teams/{team_slug}/teams", + "GET /projects/columns/{column_id}/cards", + "GET /projects/{project_id}/collaborators", + "GET /projects/{project_id}/columns", + "GET /repos/{owner}/{repo}/actions/artifacts", + "GET /repos/{owner}/{repo}/actions/caches", + "GET /repos/{owner}/{repo}/actions/organization-secrets", + "GET /repos/{owner}/{repo}/actions/organization-variables", + "GET /repos/{owner}/{repo}/actions/runners", + "GET /repos/{owner}/{repo}/actions/runs", + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", + "GET /repos/{owner}/{repo}/actions/secrets", + "GET /repos/{owner}/{repo}/actions/variables", + "GET /repos/{owner}/{repo}/actions/workflows", + "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", + "GET /repos/{owner}/{repo}/activity", + "GET /repos/{owner}/{repo}/assignees", + "GET /repos/{owner}/{repo}/branches", + "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", + "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", + "GET /repos/{owner}/{repo}/code-scanning/alerts", + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", + "GET /repos/{owner}/{repo}/code-scanning/analyses", + "GET /repos/{owner}/{repo}/codespaces", + "GET /repos/{owner}/{repo}/codespaces/devcontainers", + "GET /repos/{owner}/{repo}/codespaces/secrets", + "GET /repos/{owner}/{repo}/collaborators", + "GET /repos/{owner}/{repo}/comments", + "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", + "GET /repos/{owner}/{repo}/commits", + "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", + "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", + "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", + "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", + "GET /repos/{owner}/{repo}/commits/{ref}/status", + "GET /repos/{owner}/{repo}/commits/{ref}/statuses", + "GET /repos/{owner}/{repo}/contributors", + "GET /repos/{owner}/{repo}/dependabot/alerts", + "GET /repos/{owner}/{repo}/dependabot/secrets", + "GET /repos/{owner}/{repo}/deployments", + "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", + "GET /repos/{owner}/{repo}/environments", + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies", + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps", + "GET /repos/{owner}/{repo}/events", + "GET /repos/{owner}/{repo}/forks", + "GET /repos/{owner}/{repo}/hooks", + "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", + "GET /repos/{owner}/{repo}/invitations", + "GET /repos/{owner}/{repo}/issues", + "GET /repos/{owner}/{repo}/issues/comments", + "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", + "GET /repos/{owner}/{repo}/issues/events", + "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", + "GET /repos/{owner}/{repo}/issues/{issue_number}/events", + "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", + "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", + "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", + "GET /repos/{owner}/{repo}/keys", + "GET /repos/{owner}/{repo}/labels", + "GET /repos/{owner}/{repo}/milestones", + "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", + "GET /repos/{owner}/{repo}/notifications", + "GET /repos/{owner}/{repo}/pages/builds", + "GET /repos/{owner}/{repo}/projects", + "GET /repos/{owner}/{repo}/pulls", + "GET /repos/{owner}/{repo}/pulls/comments", + "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", + "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", + "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", + "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", + "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", + "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", + "GET /repos/{owner}/{repo}/releases", + "GET /repos/{owner}/{repo}/releases/{release_id}/assets", + "GET /repos/{owner}/{repo}/releases/{release_id}/reactions", + "GET /repos/{owner}/{repo}/rules/branches/{branch}", + "GET /repos/{owner}/{repo}/rulesets", + "GET /repos/{owner}/{repo}/rulesets/rule-suites", + "GET /repos/{owner}/{repo}/secret-scanning/alerts", + "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", + "GET /repos/{owner}/{repo}/security-advisories", + "GET /repos/{owner}/{repo}/stargazers", + "GET /repos/{owner}/{repo}/subscribers", + "GET /repos/{owner}/{repo}/tags", + "GET /repos/{owner}/{repo}/teams", + "GET /repos/{owner}/{repo}/topics", + "GET /repositories", + "GET /repositories/{repository_id}/environments/{environment_name}/secrets", + "GET /repositories/{repository_id}/environments/{environment_name}/variables", + "GET /search/code", + "GET /search/commits", + "GET /search/issues", + "GET /search/labels", + "GET /search/repositories", + "GET /search/topics", + "GET /search/users", + "GET /teams/{team_id}/discussions", + "GET /teams/{team_id}/discussions/{discussion_number}/comments", + "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", + "GET /teams/{team_id}/discussions/{discussion_number}/reactions", + "GET /teams/{team_id}/invitations", + "GET /teams/{team_id}/members", + "GET /teams/{team_id}/projects", + "GET /teams/{team_id}/repos", + "GET /teams/{team_id}/teams", + "GET /user/blocks", + "GET /user/codespaces", + "GET /user/codespaces/secrets", + "GET /user/emails", + "GET /user/followers", + "GET /user/following", + "GET /user/gpg_keys", + "GET /user/installations", + "GET /user/installations/{installation_id}/repositories", + "GET /user/issues", + "GET /user/keys", + "GET /user/marketplace_purchases", + "GET /user/marketplace_purchases/stubbed", + "GET /user/memberships/orgs", + "GET /user/migrations", + "GET /user/migrations/{migration_id}/repositories", + "GET /user/orgs", + "GET /user/packages", + "GET /user/packages/{package_type}/{package_name}/versions", + "GET /user/public_emails", + "GET /user/repos", + "GET /user/repository_invitations", + "GET /user/social_accounts", + "GET /user/ssh_signing_keys", + "GET /user/starred", + "GET /user/subscriptions", + "GET /user/teams", + "GET /users", + "GET /users/{username}/events", + "GET /users/{username}/events/orgs/{org}", + "GET /users/{username}/events/public", + "GET /users/{username}/followers", + "GET /users/{username}/following", + "GET /users/{username}/gists", + "GET /users/{username}/gpg_keys", + "GET /users/{username}/keys", + "GET /users/{username}/orgs", + "GET /users/{username}/packages", + "GET /users/{username}/projects", + "GET /users/{username}/received_events", + "GET /users/{username}/received_events/public", + "GET /users/{username}/repos", + "GET /users/{username}/social_accounts", + "GET /users/{username}/ssh_signing_keys", + "GET /users/{username}/starred", + "GET /users/{username}/subscriptions" +]; - // Populate occurrence table with analysis of the needle, - // ignoring last letter. - for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var - this._occ[needle[i]] = needleLength - 1 - i +// pkg/dist-src/paginating-endpoints.js +function isPaginatingEndpoint(arg) { + if (typeof arg === "string") { + return paginatingEndpoints.includes(arg); + } else { + return false; } } -inherits(SBMH, EventEmitter) - -SBMH.prototype.reset = function () { - this._lookbehind_size = 0 - this.matches = 0 - this._bufpos = 0 -} -SBMH.prototype.push = function (chunk, pos) { - if (!Buffer.isBuffer(chunk)) { - chunk = Buffer.from(chunk, 'binary') - } - const chlen = chunk.length - this._bufpos = pos || 0 - let r - while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) } - return r +// pkg/dist-src/index.js +function paginateRest(octokit) { + return { + paginate: Object.assign(paginate.bind(null, octokit), { + iterator: iterator.bind(null, octokit) + }) + }; } +paginateRest.VERSION = VERSION; +// Annotate the CommonJS export names for ESM import in node: +0 && (0); -SBMH.prototype._sbmh_feed = function (data) { - const len = data.length - const needle = this._needle - const needleLength = needle.length - const lastNeedleChar = needle[needleLength - 1] - - // Positive: points to a position in `data` - // pos == 3 points to data[3] - // Negative: points to a position in the lookbehind buffer - // pos == -2 points to lookbehind[lookbehind_size - 2] - let pos = -this._lookbehind_size - let ch - - if (pos < 0) { - // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool - // search with character lookup code that considers both the - // lookbehind buffer and the current round's haystack data. - // - // Loop until - // there is a match. - // or until - // we've moved past the position that requires the - // lookbehind buffer. In this case we switch to the - // optimized loop. - // or until - // the character to look at lies outside the haystack. - while (pos < 0 && pos <= len - needleLength) { - ch = this._sbmh_lookup_char(data, pos + needleLength - 1) - - if ( - ch === lastNeedleChar && - this._sbmh_memcmp(data, pos, needleLength - 1) - ) { - this._lookbehind_size = 0 - ++this.matches - this.emit('info', true) - - return (this._bufpos = pos + needleLength) - } - pos += this._occ[ch] - } - - // No match. - - if (pos < 0) { - // There's too few data for Boyer-Moore-Horspool to run, - // so let's use a different algorithm to skip as much as - // we can. - // Forward pos until - // the trailing part of lookbehind + data - // looks like the beginning of the needle - // or until - // pos == 0 - while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos } - } - - if (pos >= 0) { - // Discard lookbehind buffer. - this.emit('info', false, this._lookbehind, 0, this._lookbehind_size) - this._lookbehind_size = 0 - } else { - // Cut off part of the lookbehind buffer that has - // been processed and append the entire haystack - // into it. - const bytesToCutOff = this._lookbehind_size + pos - if (bytesToCutOff > 0) { - // The cut off data is guaranteed not to contain the needle. - this.emit('info', false, this._lookbehind, 0, bytesToCutOff) - } - - this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff, - this._lookbehind_size - bytesToCutOff) - this._lookbehind_size -= bytesToCutOff - - data.copy(this._lookbehind, this._lookbehind_size) - this._lookbehind_size += len - - this._bufpos = len - return len - } - } - pos += (pos >= 0) * this._bufpos +/***/ }), - // Lookbehind buffer is now empty. We only need to check if the - // needle is in the haystack. - if (data.indexOf(needle, pos) !== -1) { - pos = data.indexOf(needle, pos) - ++this.matches - if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) } +/***/ 83044: +/***/ ((module) => { - return (this._bufpos = pos + needleLength) - } else { - pos = len - needleLength - } +"use strict"; - // There was no match. If there's trailing haystack data that we cannot - // match yet using the Boyer-Moore-Horspool algorithm (because the trailing - // data is less than the needle size) then match using a modified - // algorithm that starts matching from the beginning instead of the end. - // Whatever trailing data is left after running this algorithm is added to - // the lookbehind buffer. - while ( - pos < len && - ( - data[pos] !== needle[0] || - ( - (Buffer.compare( - data.subarray(pos, pos + len - pos), - needle.subarray(0, len - pos) - ) !== 0) - ) - ) - ) { - ++pos - } - if (pos < len) { - data.copy(this._lookbehind, 0, pos, pos + (len - pos)) - this._lookbehind_size = len - pos +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - // Everything until pos is guaranteed not to contain needle data. - if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) } - - this._bufpos = len - return len -} +// pkg/dist-src/index.js +var dist_src_exports = {}; +__export(dist_src_exports, { + legacyRestEndpointMethods: () => legacyRestEndpointMethods, + restEndpointMethods: () => restEndpointMethods +}); +module.exports = __toCommonJS(dist_src_exports); -SBMH.prototype._sbmh_lookup_char = function (data, pos) { - return (pos < 0) - ? this._lookbehind[this._lookbehind_size + pos] - : data[pos] -} - -SBMH.prototype._sbmh_memcmp = function (data, pos, len) { - for (var i = 0; i < len; ++i) { // eslint-disable-line no-var - if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false } - } - return true -} - -module.exports = SBMH - - -/***/ }), - -/***/ 33438: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -const WritableStream = (__nccwpck_require__(84492).Writable) -const { inherits } = __nccwpck_require__(47261) -const Dicer = __nccwpck_require__(2856) - -const MultipartParser = __nccwpck_require__(90415) -const UrlencodedParser = __nccwpck_require__(16780) -const parseParams = __nccwpck_require__(34426) - -function Busboy (opts) { - if (!(this instanceof Busboy)) { return new Busboy(opts) } - - if (typeof opts !== 'object') { - throw new TypeError('Busboy expected an options-Object.') - } - if (typeof opts.headers !== 'object') { - throw new TypeError('Busboy expected an options-Object with headers-attribute.') - } - if (typeof opts.headers['content-type'] !== 'string') { - throw new TypeError('Missing Content-Type-header.') - } - - const { - headers, - ...streamOptions - } = opts - - this.opts = { - autoDestroy: false, - ...streamOptions - } - WritableStream.call(this, this.opts) - - this._done = false - this._parser = this.getParserByHeaders(headers) - this._finished = false -} -inherits(Busboy, WritableStream) - -Busboy.prototype.emit = function (ev) { - if (ev === 'finish') { - if (!this._done) { - this._parser?.end() - return - } else if (this._finished) { - return - } - this._finished = true - } - WritableStream.prototype.emit.apply(this, arguments) -} - -Busboy.prototype.getParserByHeaders = function (headers) { - const parsed = parseParams(headers['content-type']) - - const cfg = { - defCharset: this.opts.defCharset, - fileHwm: this.opts.fileHwm, - headers, - highWaterMark: this.opts.highWaterMark, - isPartAFile: this.opts.isPartAFile, - limits: this.opts.limits, - parsedConType: parsed, - preservePath: this.opts.preservePath - } - - if (MultipartParser.detect.test(parsed[0])) { - return new MultipartParser(this, cfg) - } - if (UrlencodedParser.detect.test(parsed[0])) { - return new UrlencodedParser(this, cfg) - } - throw new Error('Unsupported Content-Type.') -} - -Busboy.prototype._write = function (chunk, encoding, cb) { - this._parser.write(chunk, cb) -} - -module.exports = Busboy -module.exports["default"] = Busboy -module.exports.Busboy = Busboy - -module.exports.Dicer = Dicer - - -/***/ }), - -/***/ 90415: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -// TODO: -// * support 1 nested multipart level -// (see second multipart example here: -// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data) -// * support limits.fieldNameSize -// -- this will require modifications to utils.parseParams - -const { Readable } = __nccwpck_require__(84492) -const { inherits } = __nccwpck_require__(47261) - -const Dicer = __nccwpck_require__(2856) - -const parseParams = __nccwpck_require__(34426) -const decodeText = __nccwpck_require__(99136) -const basename = __nccwpck_require__(60496) -const getLimit = __nccwpck_require__(49692) - -const RE_BOUNDARY = /^boundary$/i -const RE_FIELD = /^form-data$/i -const RE_CHARSET = /^charset$/i -const RE_FILENAME = /^filename$/i -const RE_NAME = /^name$/i - -Multipart.detect = /^multipart\/form-data/i -function Multipart (boy, cfg) { - let i - let len - const self = this - let boundary - const limits = cfg.limits - const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined)) - const parsedConType = cfg.parsedConType || [] - const defCharset = cfg.defCharset || 'utf8' - const preservePath = cfg.preservePath - const fileOpts = { highWaterMark: cfg.fileHwm } - - for (i = 0, len = parsedConType.length; i < len; ++i) { - if (Array.isArray(parsedConType[i]) && - RE_BOUNDARY.test(parsedConType[i][0])) { - boundary = parsedConType[i][1] - break - } - } - - function checkFinished () { - if (nends === 0 && finished && !boy._done) { - finished = false - self.end() - } - } - - if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') } - - const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024) - const fileSizeLimit = getLimit(limits, 'fileSize', Infinity) - const filesLimit = getLimit(limits, 'files', Infinity) - const fieldsLimit = getLimit(limits, 'fields', Infinity) - const partsLimit = getLimit(limits, 'parts', Infinity) - const headerPairsLimit = getLimit(limits, 'headerPairs', 2000) - const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024) - - let nfiles = 0 - let nfields = 0 - let nends = 0 - let curFile - let curField - let finished = false - - this._needDrain = false - this._pause = false - this._cb = undefined - this._nparts = 0 - this._boy = boy - - const parserCfg = { - boundary, - maxHeaderPairs: headerPairsLimit, - maxHeaderSize: headerSizeLimit, - partHwm: fileOpts.highWaterMark, - highWaterMark: cfg.highWaterMark - } - - this.parser = new Dicer(parserCfg) - this.parser.on('drain', function () { - self._needDrain = false - if (self._cb && !self._pause) { - const cb = self._cb - self._cb = undefined - cb() - } - }).on('part', function onPart (part) { - if (++self._nparts > partsLimit) { - self.parser.removeListener('part', onPart) - self.parser.on('part', skipPart) - boy.hitPartsLimit = true - boy.emit('partsLimit') - return skipPart(part) - } - - // hack because streams2 _always_ doesn't emit 'end' until nextTick, so let - // us emit 'end' early since we know the part has ended if we are already - // seeing the next part - if (curField) { - const field = curField - field.emit('end') - field.removeAllListeners('end') - } - - part.on('header', function (header) { - let contype - let fieldname - let parsed - let charset - let encoding - let filename - let nsize = 0 - - if (header['content-type']) { - parsed = parseParams(header['content-type'][0]) - if (parsed[0]) { - contype = parsed[0].toLowerCase() - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_CHARSET.test(parsed[i][0])) { - charset = parsed[i][1].toLowerCase() - break - } - } - } - } - - if (contype === undefined) { contype = 'text/plain' } - if (charset === undefined) { charset = defCharset } - - if (header['content-disposition']) { - parsed = parseParams(header['content-disposition'][0]) - if (!RE_FIELD.test(parsed[0])) { return skipPart(part) } - for (i = 0, len = parsed.length; i < len; ++i) { - if (RE_NAME.test(parsed[i][0])) { - fieldname = parsed[i][1] - } else if (RE_FILENAME.test(parsed[i][0])) { - filename = parsed[i][1] - if (!preservePath) { filename = basename(filename) } - } - } - } else { return skipPart(part) } - - if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' } - - let onData, - onEnd - - if (isPartAFile(fieldname, contype, filename)) { - // file/binary field - if (nfiles === filesLimit) { - if (!boy.hitFilesLimit) { - boy.hitFilesLimit = true - boy.emit('filesLimit') - } - return skipPart(part) - } - - ++nfiles - - if (!boy._events.file) { - self.parser._ignore() - return - } - - ++nends - const file = new FileStream(fileOpts) - curFile = file - file.on('end', function () { - --nends - self._pause = false - checkFinished() - if (self._cb && !self._needDrain) { - const cb = self._cb - self._cb = undefined - cb() - } - }) - file._read = function (n) { - if (!self._pause) { return } - self._pause = false - if (self._cb && !self._needDrain) { - const cb = self._cb - self._cb = undefined - cb() - } - } - boy.emit('file', fieldname, file, filename, encoding, contype) - - onData = function (data) { - if ((nsize += data.length) > fileSizeLimit) { - const extralen = fileSizeLimit - nsize + data.length - if (extralen > 0) { file.push(data.slice(0, extralen)) } - file.truncated = true - file.bytesRead = fileSizeLimit - part.removeAllListeners('data') - file.emit('limit') - return - } else if (!file.push(data)) { self._pause = true } - - file.bytesRead = nsize - } - - onEnd = function () { - curFile = undefined - file.push(null) - } - } else { - // non-file field - if (nfields === fieldsLimit) { - if (!boy.hitFieldsLimit) { - boy.hitFieldsLimit = true - boy.emit('fieldsLimit') - } - return skipPart(part) - } - - ++nfields - ++nends - let buffer = '' - let truncated = false - curField = part - - onData = function (data) { - if ((nsize += data.length) > fieldSizeLimit) { - const extralen = (fieldSizeLimit - (nsize - data.length)) - buffer += data.toString('binary', 0, extralen) - truncated = true - part.removeAllListeners('data') - } else { buffer += data.toString('binary') } - } - - onEnd = function () { - curField = undefined - if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) } - boy.emit('field', fieldname, buffer, false, truncated, encoding, contype) - --nends - checkFinished() - } - } - - /* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become - broken. Streams2/streams3 is a huge black box of confusion, but - somehow overriding the sync state seems to fix things again (and still - seems to work for previous node versions). - */ - part._readableState.sync = false - - part.on('data', onData) - part.on('end', onEnd) - }).on('error', function (err) { - if (curFile) { curFile.emit('error', err) } - }) - }).on('error', function (err) { - boy.emit('error', err) - }).on('finish', function () { - finished = true - checkFinished() - }) -} - -Multipart.prototype.write = function (chunk, cb) { - const r = this.parser.write(chunk) - if (r && !this._pause) { - cb() - } else { - this._needDrain = !r - this._cb = cb - } -} - -Multipart.prototype.end = function () { - const self = this - - if (self.parser.writable) { - self.parser.end() - } else if (!self._boy._done) { - process.nextTick(function () { - self._boy._done = true - self._boy.emit('finish') - }) - } -} - -function skipPart (part) { - part.resume() -} - -function FileStream (opts) { - Readable.call(this, opts) - - this.bytesRead = 0 - - this.truncated = false -} - -inherits(FileStream, Readable) - -FileStream.prototype._read = function (n) {} - -module.exports = Multipart - - -/***/ }), - -/***/ 16780: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -const Decoder = __nccwpck_require__(89730) -const decodeText = __nccwpck_require__(99136) -const getLimit = __nccwpck_require__(49692) - -const RE_CHARSET = /^charset$/i - -UrlEncoded.detect = /^application\/x-www-form-urlencoded/i -function UrlEncoded (boy, cfg) { - const limits = cfg.limits - const parsedConType = cfg.parsedConType - this.boy = boy - - this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024) - this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100) - this.fieldsLimit = getLimit(limits, 'fields', Infinity) - - let charset - for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var - if (Array.isArray(parsedConType[i]) && - RE_CHARSET.test(parsedConType[i][0])) { - charset = parsedConType[i][1].toLowerCase() - break - } - } - - if (charset === undefined) { charset = cfg.defCharset || 'utf8' } - - this.decoder = new Decoder() - this.charset = charset - this._fields = 0 - this._state = 'key' - this._checkingBytes = true - this._bytesKey = 0 - this._bytesVal = 0 - this._key = '' - this._val = '' - this._keyTrunc = false - this._valTrunc = false - this._hitLimit = false -} - -UrlEncoded.prototype.write = function (data, cb) { - if (this._fields === this.fieldsLimit) { - if (!this.boy.hitFieldsLimit) { - this.boy.hitFieldsLimit = true - this.boy.emit('fieldsLimit') - } - return cb() - } - - let idxeq; let idxamp; let i; let p = 0; const len = data.length - - while (p < len) { - if (this._state === 'key') { - idxeq = idxamp = undefined - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { ++p } - if (data[i] === 0x3D/* = */) { - idxeq = i - break - } else if (data[i] === 0x26/* & */) { - idxamp = i - break - } - if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { - this._hitLimit = true - break - } else if (this._checkingBytes) { ++this._bytesKey } - } - - if (idxeq !== undefined) { - // key with assignment - if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) } - this._state = 'val' - - this._hitLimit = false - this._checkingBytes = true - this._val = '' - this._bytesVal = 0 - this._valTrunc = false - this.decoder.reset() - - p = idxeq + 1 - } else if (idxamp !== undefined) { - // key with no assignment - ++this._fields - let key; const keyTrunc = this._keyTrunc - if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key } - - this._hitLimit = false - this._checkingBytes = true - this._key = '' - this._bytesKey = 0 - this._keyTrunc = false - this.decoder.reset() - - if (key.length) { - this.boy.emit('field', decodeText(key, 'binary', this.charset), - '', - keyTrunc, - false) - } - - p = idxamp + 1 - if (this._fields === this.fieldsLimit) { return cb() } - } else if (this._hitLimit) { - // we may not have hit the actual limit if there are encoded bytes... - if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) } - p = i - if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { - // yep, we actually did hit the limit - this._checkingBytes = false - this._keyTrunc = true - } - } else { - if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) } - p = len - } - } else { - idxamp = undefined - for (i = p; i < len; ++i) { - if (!this._checkingBytes) { ++p } - if (data[i] === 0x26/* & */) { - idxamp = i - break - } - if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { - this._hitLimit = true - break - } else if (this._checkingBytes) { ++this._bytesVal } - } - - if (idxamp !== undefined) { - ++this._fields - if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) } - this.boy.emit('field', decodeText(this._key, 'binary', this.charset), - decodeText(this._val, 'binary', this.charset), - this._keyTrunc, - this._valTrunc) - this._state = 'key' - - this._hitLimit = false - this._checkingBytes = true - this._key = '' - this._bytesKey = 0 - this._keyTrunc = false - this.decoder.reset() - - p = idxamp + 1 - if (this._fields === this.fieldsLimit) { return cb() } - } else if (this._hitLimit) { - // we may not have hit the actual limit if there are encoded bytes... - if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) } - p = i - if ((this._val === '' && this.fieldSizeLimit === 0) || - (this._bytesVal = this._val.length) === this.fieldSizeLimit) { - // yep, we actually did hit the limit - this._checkingBytes = false - this._valTrunc = true - } - } else { - if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) } - p = len - } - } - } - cb() -} - -UrlEncoded.prototype.end = function () { - if (this.boy._done) { return } - - if (this._state === 'key' && this._key.length > 0) { - this.boy.emit('field', decodeText(this._key, 'binary', this.charset), - '', - this._keyTrunc, - false) - } else if (this._state === 'val') { - this.boy.emit('field', decodeText(this._key, 'binary', this.charset), - decodeText(this._val, 'binary', this.charset), - this._keyTrunc, - this._valTrunc) - } - this.boy._done = true - this.boy.emit('finish') -} - -module.exports = UrlEncoded - - -/***/ }), - -/***/ 89730: -/***/ ((module) => { - -"use strict"; - - -const RE_PLUS = /\+/g - -const HEX = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -] - -function Decoder () { - this.buffer = undefined -} -Decoder.prototype.write = function (str) { - // Replace '+' with ' ' before decoding - str = str.replace(RE_PLUS, ' ') - let res = '' - let i = 0; let p = 0; const len = str.length - for (; i < len; ++i) { - if (this.buffer !== undefined) { - if (!HEX[str.charCodeAt(i)]) { - res += '%' + this.buffer - this.buffer = undefined - --i // retry character - } else { - this.buffer += str[i] - ++p - if (this.buffer.length === 2) { - res += String.fromCharCode(parseInt(this.buffer, 16)) - this.buffer = undefined - } - } - } else if (str[i] === '%') { - if (i > p) { - res += str.substring(p, i) - p = i - } - this.buffer = '' - ++p - } - } - if (p < len && this.buffer === undefined) { res += str.substring(p) } - return res -} -Decoder.prototype.reset = function () { - this.buffer = undefined -} - -module.exports = Decoder - - -/***/ }), - -/***/ 60496: -/***/ ((module) => { - -"use strict"; - - -module.exports = function basename (path) { - if (typeof path !== 'string') { return '' } - for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var - switch (path.charCodeAt(i)) { - case 0x2F: // '/' - case 0x5C: // '\' - path = path.slice(i + 1) - return (path === '..' || path === '.' ? '' : path) - } - } - return (path === '..' || path === '.' ? '' : path) -} - - -/***/ }), - -/***/ 99136: -/***/ ((module) => { - -"use strict"; - - -// Node has always utf-8 -const utf8Decoder = new TextDecoder('utf-8') -const textDecoders = new Map([ - ['utf-8', utf8Decoder], - ['utf8', utf8Decoder] -]) - -function decodeText (text, textEncoding, destEncoding) { - if (text) { - if (textDecoders.has(destEncoding)) { - try { - return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding)) - } catch (e) { } - } else { - try { - textDecoders.set(destEncoding, new TextDecoder(destEncoding)) - return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding)) - } catch (e) { } - } - } - return text -} - -module.exports = decodeText - - -/***/ }), - -/***/ 49692: -/***/ ((module) => { - -"use strict"; - - -module.exports = function getLimit (limits, name, defaultLimit) { - if ( - !limits || - limits[name] === undefined || - limits[name] === null - ) { return defaultLimit } - - if ( - typeof limits[name] !== 'number' || - isNaN(limits[name]) - ) { throw new TypeError('Limit ' + name + ' is not a valid number') } - - return limits[name] -} - - -/***/ }), - -/***/ 34426: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -const decodeText = __nccwpck_require__(99136) - -const RE_ENCODED = /%([a-fA-F0-9]{2})/g - -function encodedReplacer (match, byte) { - return String.fromCharCode(parseInt(byte, 16)) -} - -function parseParams (str) { - const res = [] - let state = 'key' - let charset = '' - let inquote = false - let escaping = false - let p = 0 - let tmp = '' - - for (var i = 0, len = str.length; i < len; ++i) { // eslint-disable-line no-var - const char = str[i] - if (char === '\\' && inquote) { - if (escaping) { escaping = false } else { - escaping = true - continue - } - } else if (char === '"') { - if (!escaping) { - if (inquote) { - inquote = false - state = 'key' - } else { inquote = true } - continue - } else { escaping = false } - } else { - if (escaping && inquote) { tmp += '\\' } - escaping = false - if ((state === 'charset' || state === 'lang') && char === "'") { - if (state === 'charset') { - state = 'lang' - charset = tmp.substring(1) - } else { state = 'value' } - tmp = '' - continue - } else if (state === 'key' && - (char === '*' || char === '=') && - res.length) { - if (char === '*') { state = 'charset' } else { state = 'value' } - res[p] = [tmp, undefined] - tmp = '' - continue - } else if (!inquote && char === ';') { - state = 'key' - if (charset) { - if (tmp.length) { - tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), - 'binary', - charset) - } - charset = '' - } else if (tmp.length) { - tmp = decodeText(tmp, 'binary', 'utf8') - } - if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp } - tmp = '' - ++p - continue - } else if (!inquote && (char === ' ' || char === '\t')) { continue } - } - tmp += char - } - if (charset && tmp.length) { - tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), - 'binary', - charset) - } else if (tmp) { - tmp = decodeText(tmp, 'binary', 'utf8') - } - - if (res[p] === undefined) { - if (tmp) { res[p] = tmp } - } else { res[p][1] = tmp } - - return res -} - -module.exports = parseParams - - -/***/ }), - -/***/ 40334: -/***/ ((module) => { - -"use strict"; - -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// pkg/dist-src/index.js -var dist_src_exports = {}; -__export(dist_src_exports, { - createTokenAuth: () => createTokenAuth -}); -module.exports = __toCommonJS(dist_src_exports); - -// pkg/dist-src/auth.js -var REGEX_IS_INSTALLATION_LEGACY = /^v1\./; -var REGEX_IS_INSTALLATION = /^ghs_/; -var REGEX_IS_USER_TO_SERVER = /^ghu_/; -async function auth(token) { - const isApp = token.split(/\./).length === 3; - const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); - const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); - const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; - return { - type: "token", - token, - tokenType - }; -} - -// pkg/dist-src/with-authorization-prefix.js -function withAuthorizationPrefix(token) { - if (token.split(/\./).length === 3) { - return `bearer ${token}`; - } - return `token ${token}`; -} - -// pkg/dist-src/hook.js -async function hook(token, request, route, parameters) { - const endpoint = request.endpoint.merge( - route, - parameters - ); - endpoint.headers.authorization = withAuthorizationPrefix(token); - return request(endpoint); -} - -// pkg/dist-src/index.js -var createTokenAuth = function createTokenAuth2(token) { - if (!token) { - throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); - } - if (typeof token !== "string") { - throw new Error( - "[@octokit/auth-token] Token passed to createTokenAuth is not a string" - ); - } - token = token.replace(/^(token|bearer) +/i, ""); - return Object.assign(auth.bind(null, token), { - hook: hook.bind(null, token) - }); -}; -// Annotate the CommonJS export names for ESM import in node: -0 && (0); - - -/***/ }), - -/***/ 76762: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// pkg/dist-src/index.js -var dist_src_exports = {}; -__export(dist_src_exports, { - Octokit: () => Octokit -}); -module.exports = __toCommonJS(dist_src_exports); -var import_universal_user_agent = __nccwpck_require__(45030); -var import_before_after_hook = __nccwpck_require__(83682); -var import_request = __nccwpck_require__(36234); -var import_graphql = __nccwpck_require__(88467); -var import_auth_token = __nccwpck_require__(40334); - -// pkg/dist-src/version.js -var VERSION = "5.0.1"; - -// pkg/dist-src/index.js -var Octokit = class { - static { - this.VERSION = VERSION; - } - static defaults(defaults) { - const OctokitWithDefaults = class extends this { - constructor(...args) { - const options = args[0] || {}; - if (typeof defaults === "function") { - super(defaults(options)); - return; - } - super( - Object.assign( - {}, - defaults, - options, - options.userAgent && defaults.userAgent ? { - userAgent: `${options.userAgent} ${defaults.userAgent}` - } : null - ) - ); - } - }; - return OctokitWithDefaults; - } - static { - this.plugins = []; - } - /** - * Attach a plugin (or many) to your Octokit instance. - * - * @example - * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) - */ - static plugin(...newPlugins) { - const currentPlugins = this.plugins; - const NewOctokit = class extends this { - static { - this.plugins = currentPlugins.concat( - newPlugins.filter((plugin) => !currentPlugins.includes(plugin)) - ); - } - }; - return NewOctokit; - } - constructor(options = {}) { - const hook = new import_before_after_hook.Collection(); - const requestDefaults = { - baseUrl: import_request.request.endpoint.DEFAULTS.baseUrl, - headers: {}, - request: Object.assign({}, options.request, { - // @ts-ignore internal usage only, no need to type - hook: hook.bind(null, "request") - }), - mediaType: { - previews: [], - format: "" - } - }; - requestDefaults.headers["user-agent"] = [ - options.userAgent, - `octokit-core.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}` - ].filter(Boolean).join(" "); - if (options.baseUrl) { - requestDefaults.baseUrl = options.baseUrl; - } - if (options.previews) { - requestDefaults.mediaType.previews = options.previews; - } - if (options.timeZone) { - requestDefaults.headers["time-zone"] = options.timeZone; - } - this.request = import_request.request.defaults(requestDefaults); - this.graphql = (0, import_graphql.withCustomRequest)(this.request).defaults(requestDefaults); - this.log = Object.assign( - { - debug: () => { - }, - info: () => { - }, - warn: console.warn.bind(console), - error: console.error.bind(console) - }, - options.log - ); - this.hook = hook; - if (!options.authStrategy) { - if (!options.auth) { - this.auth = async () => ({ - type: "unauthenticated" - }); - } else { - const auth = (0, import_auth_token.createTokenAuth)(options.auth); - hook.wrap("request", auth.hook); - this.auth = auth; - } - } else { - const { authStrategy, ...otherOptions } = options; - const auth = authStrategy( - Object.assign( - { - request: this.request, - log: this.log, - // we pass the current octokit instance as well as its constructor options - // to allow for authentication strategies that return a new octokit instance - // that shares the same internal state as the current one. The original - // requirement for this was the "event-octokit" authentication strategy - // of https://github.com/probot/octokit-auth-probot. - octokit: this, - octokitOptions: otherOptions - }, - options.auth - ) - ); - hook.wrap("request", auth.hook); - this.auth = auth; - } - const classConstructor = this.constructor; - classConstructor.plugins.forEach((plugin) => { - Object.assign(this, plugin(this, options)); - }); - } -}; -// Annotate the CommonJS export names for ESM import in node: -0 && (0); - - -/***/ }), - -/***/ 59440: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// pkg/dist-src/index.js -var dist_src_exports = {}; -__export(dist_src_exports, { - endpoint: () => endpoint -}); -module.exports = __toCommonJS(dist_src_exports); - -// pkg/dist-src/defaults.js -var import_universal_user_agent = __nccwpck_require__(45030); - -// pkg/dist-src/version.js -var VERSION = "9.0.1"; - -// pkg/dist-src/defaults.js -var userAgent = `octokit-endpoint.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`; -var DEFAULTS = { - method: "GET", - baseUrl: "https://api.github.com", - headers: { - accept: "application/vnd.github.v3+json", - "user-agent": userAgent - }, - mediaType: { - format: "" - } -}; - -// pkg/dist-src/util/lowercase-keys.js -function lowercaseKeys(object) { - if (!object) { - return {}; - } - return Object.keys(object).reduce((newObj, key) => { - newObj[key.toLowerCase()] = object[key]; - return newObj; - }, {}); -} - -// pkg/dist-src/util/merge-deep.js -var import_is_plain_object = __nccwpck_require__(63287); -function mergeDeep(defaults, options) { - const result = Object.assign({}, defaults); - Object.keys(options).forEach((key) => { - if ((0, import_is_plain_object.isPlainObject)(options[key])) { - if (!(key in defaults)) - Object.assign(result, { [key]: options[key] }); - else - result[key] = mergeDeep(defaults[key], options[key]); - } else { - Object.assign(result, { [key]: options[key] }); - } - }); - return result; -} - -// pkg/dist-src/util/remove-undefined-properties.js -function removeUndefinedProperties(obj) { - for (const key in obj) { - if (obj[key] === void 0) { - delete obj[key]; - } - } - return obj; -} - -// pkg/dist-src/merge.js -function merge(defaults, route, options) { - if (typeof route === "string") { - let [method, url] = route.split(" "); - options = Object.assign(url ? { method, url } : { url: method }, options); - } else { - options = Object.assign({}, route); - } - options.headers = lowercaseKeys(options.headers); - removeUndefinedProperties(options); - removeUndefinedProperties(options.headers); - const mergedOptions = mergeDeep(defaults || {}, options); - if (options.url === "/graphql") { - if (defaults && defaults.mediaType.previews?.length) { - mergedOptions.mediaType.previews = defaults.mediaType.previews.filter( - (preview) => !mergedOptions.mediaType.previews.includes(preview) - ).concat(mergedOptions.mediaType.previews); - } - mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, "")); - } - return mergedOptions; -} - -// pkg/dist-src/util/add-query-parameters.js -function addQueryParameters(url, parameters) { - const separator = /\?/.test(url) ? "&" : "?"; - const names = Object.keys(parameters); - if (names.length === 0) { - return url; - } - return url + separator + names.map((name) => { - if (name === "q") { - return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); - } - return `${name}=${encodeURIComponent(parameters[name])}`; - }).join("&"); -} - -// pkg/dist-src/util/extract-url-variable-names.js -var urlVariableRegex = /\{[^}]+\}/g; -function removeNonChars(variableName) { - return variableName.replace(/^\W+|\W+$/g, "").split(/,/); -} -function extractUrlVariableNames(url) { - const matches = url.match(urlVariableRegex); - if (!matches) { - return []; - } - return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); -} - -// pkg/dist-src/util/omit.js -function omit(object, keysToOmit) { - return Object.keys(object).filter((option) => !keysToOmit.includes(option)).reduce((obj, key) => { - obj[key] = object[key]; - return obj; - }, {}); -} - -// pkg/dist-src/util/url-template.js -function encodeReserved(str) { - return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) { - if (!/%[0-9A-Fa-f]/.test(part)) { - part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); - } - return part; - }).join(""); -} -function encodeUnreserved(str) { - return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { - return "%" + c.charCodeAt(0).toString(16).toUpperCase(); - }); -} -function encodeValue(operator, value, key) { - value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); - if (key) { - return encodeUnreserved(key) + "=" + value; - } else { - return value; - } -} -function isDefined(value) { - return value !== void 0 && value !== null; -} -function isKeyOperator(operator) { - return operator === ";" || operator === "&" || operator === "?"; -} -function getValues(context, operator, key, modifier) { - var value = context[key], result = []; - if (isDefined(value) && value !== "") { - if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { - value = value.toString(); - if (modifier && modifier !== "*") { - value = value.substring(0, parseInt(modifier, 10)); - } - result.push( - encodeValue(operator, value, isKeyOperator(operator) ? key : "") - ); - } else { - if (modifier === "*") { - if (Array.isArray(value)) { - value.filter(isDefined).forEach(function(value2) { - result.push( - encodeValue(operator, value2, isKeyOperator(operator) ? key : "") - ); - }); - } else { - Object.keys(value).forEach(function(k) { - if (isDefined(value[k])) { - result.push(encodeValue(operator, value[k], k)); - } - }); - } - } else { - const tmp = []; - if (Array.isArray(value)) { - value.filter(isDefined).forEach(function(value2) { - tmp.push(encodeValue(operator, value2)); - }); - } else { - Object.keys(value).forEach(function(k) { - if (isDefined(value[k])) { - tmp.push(encodeUnreserved(k)); - tmp.push(encodeValue(operator, value[k].toString())); - } - }); - } - if (isKeyOperator(operator)) { - result.push(encodeUnreserved(key) + "=" + tmp.join(",")); - } else if (tmp.length !== 0) { - result.push(tmp.join(",")); - } - } - } - } else { - if (operator === ";") { - if (isDefined(value)) { - result.push(encodeUnreserved(key)); - } - } else if (value === "" && (operator === "&" || operator === "?")) { - result.push(encodeUnreserved(key) + "="); - } else if (value === "") { - result.push(""); - } - } - return result; -} -function parseUrl(template) { - return { - expand: expand.bind(null, template) - }; -} -function expand(template, context) { - var operators = ["+", "#", ".", "/", ";", "?", "&"]; - return template.replace( - /\{([^\{\}]+)\}|([^\{\}]+)/g, - function(_, expression, literal) { - if (expression) { - let operator = ""; - const values = []; - if (operators.indexOf(expression.charAt(0)) !== -1) { - operator = expression.charAt(0); - expression = expression.substr(1); - } - expression.split(/,/g).forEach(function(variable) { - var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); - values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); - }); - if (operator && operator !== "+") { - var separator = ","; - if (operator === "?") { - separator = "&"; - } else if (operator !== "#") { - separator = operator; - } - return (values.length !== 0 ? operator : "") + values.join(separator); - } else { - return values.join(","); - } - } else { - return encodeReserved(literal); - } - } - ); -} - -// pkg/dist-src/parse.js -function parse(options) { - let method = options.method.toUpperCase(); - let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); - let headers = Object.assign({}, options.headers); - let body; - let parameters = omit(options, [ - "method", - "baseUrl", - "url", - "headers", - "request", - "mediaType" - ]); - const urlVariableNames = extractUrlVariableNames(url); - url = parseUrl(url).expand(parameters); - if (!/^http/.test(url)) { - url = options.baseUrl + url; - } - const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl"); - const remainingParameters = omit(parameters, omittedParameters); - const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); - if (!isBinaryRequest) { - if (options.mediaType.format) { - headers.accept = headers.accept.split(/,/).map( - (format) => format.replace( - /application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, - `application/vnd$1$2.${options.mediaType.format}` - ) - ).join(","); - } - if (url.endsWith("/graphql")) { - if (options.mediaType.previews?.length) { - const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; - headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map((preview) => { - const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; - return `application/vnd.github.${preview}-preview${format}`; - }).join(","); - } - } - } - if (["GET", "HEAD"].includes(method)) { - url = addQueryParameters(url, remainingParameters); - } else { - if ("data" in remainingParameters) { - body = remainingParameters.data; - } else { - if (Object.keys(remainingParameters).length) { - body = remainingParameters; - } - } - } - if (!headers["content-type"] && typeof body !== "undefined") { - headers["content-type"] = "application/json; charset=utf-8"; - } - if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { - body = ""; - } - return Object.assign( - { method, url, headers }, - typeof body !== "undefined" ? { body } : null, - options.request ? { request: options.request } : null - ); -} - -// pkg/dist-src/endpoint-with-defaults.js -function endpointWithDefaults(defaults, route, options) { - return parse(merge(defaults, route, options)); -} - -// pkg/dist-src/with-defaults.js -function withDefaults(oldDefaults, newDefaults) { - const DEFAULTS2 = merge(oldDefaults, newDefaults); - const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2); - return Object.assign(endpoint2, { - DEFAULTS: DEFAULTS2, - defaults: withDefaults.bind(null, DEFAULTS2), - merge: merge.bind(null, DEFAULTS2), - parse - }); -} - -// pkg/dist-src/index.js -var endpoint = withDefaults(null, DEFAULTS); -// Annotate the CommonJS export names for ESM import in node: -0 && (0); - - -/***/ }), - -/***/ 88467: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// pkg/dist-src/index.js -var dist_src_exports = {}; -__export(dist_src_exports, { - GraphqlResponseError: () => GraphqlResponseError, - graphql: () => graphql2, - withCustomRequest: () => withCustomRequest -}); -module.exports = __toCommonJS(dist_src_exports); -var import_request3 = __nccwpck_require__(36234); -var import_universal_user_agent = __nccwpck_require__(45030); - -// pkg/dist-src/version.js -var VERSION = "7.0.2"; - -// pkg/dist-src/with-defaults.js -var import_request2 = __nccwpck_require__(36234); - -// pkg/dist-src/graphql.js -var import_request = __nccwpck_require__(36234); - -// pkg/dist-src/error.js -function _buildMessageForResponseErrors(data) { - return `Request failed due to following response errors: -` + data.errors.map((e) => ` - ${e.message}`).join("\n"); -} -var GraphqlResponseError = class extends Error { - constructor(request2, headers, response) { - super(_buildMessageForResponseErrors(response)); - this.request = request2; - this.headers = headers; - this.response = response; - this.name = "GraphqlResponseError"; - this.errors = response.errors; - this.data = response.data; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - } -}; - -// pkg/dist-src/graphql.js -var NON_VARIABLE_OPTIONS = [ - "method", - "baseUrl", - "url", - "headers", - "request", - "query", - "mediaType" -]; -var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; -var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; -function graphql(request2, query, options) { - if (options) { - if (typeof query === "string" && "query" in options) { - return Promise.reject( - new Error(`[@octokit/graphql] "query" cannot be used as variable name`) - ); - } - for (const key in options) { - if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) - continue; - return Promise.reject( - new Error( - `[@octokit/graphql] "${key}" cannot be used as variable name` - ) - ); - } - } - const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query; - const requestOptions = Object.keys( - parsedOptions - ).reduce((result, key) => { - if (NON_VARIABLE_OPTIONS.includes(key)) { - result[key] = parsedOptions[key]; - return result; - } - if (!result.variables) { - result.variables = {}; - } - result.variables[key] = parsedOptions[key]; - return result; - }, {}); - const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl; - if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { - requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); - } - return request2(requestOptions).then((response) => { - if (response.data.errors) { - const headers = {}; - for (const key of Object.keys(response.headers)) { - headers[key] = response.headers[key]; - } - throw new GraphqlResponseError( - requestOptions, - headers, - response.data - ); - } - return response.data.data; - }); -} - -// pkg/dist-src/with-defaults.js -function withDefaults(request2, newDefaults) { - const newRequest = request2.defaults(newDefaults); - const newApi = (query, options) => { - return graphql(newRequest, query, options); - }; - return Object.assign(newApi, { - defaults: withDefaults.bind(null, newRequest), - endpoint: newRequest.endpoint - }); -} - -// pkg/dist-src/index.js -var graphql2 = withDefaults(import_request3.request, { - headers: { - "user-agent": `octokit-graphql.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}` - }, - method: "POST", - url: "/graphql" -}); -function withCustomRequest(customRequest) { - return withDefaults(customRequest, { - method: "POST", - url: "/graphql" - }); -} -// Annotate the CommonJS export names for ESM import in node: -0 && (0); - - -/***/ }), - -/***/ 64193: -/***/ ((module) => { - -"use strict"; - -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// pkg/dist-src/index.js -var dist_src_exports = {}; -__export(dist_src_exports, { - composePaginateRest: () => composePaginateRest, - isPaginatingEndpoint: () => isPaginatingEndpoint, - paginateRest: () => paginateRest, - paginatingEndpoints: () => paginatingEndpoints -}); -module.exports = __toCommonJS(dist_src_exports); - -// pkg/dist-src/version.js -var VERSION = "9.0.0"; - -// pkg/dist-src/normalize-paginated-list-response.js -function normalizePaginatedListResponse(response) { - if (!response.data) { - return { - ...response, - data: [] - }; - } - const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); - if (!responseNeedsNormalization) - return response; - const incompleteResults = response.data.incomplete_results; - const repositorySelection = response.data.repository_selection; - const totalCount = response.data.total_count; - delete response.data.incomplete_results; - delete response.data.repository_selection; - delete response.data.total_count; - const namespaceKey = Object.keys(response.data)[0]; - const data = response.data[namespaceKey]; - response.data = data; - if (typeof incompleteResults !== "undefined") { - response.data.incomplete_results = incompleteResults; - } - if (typeof repositorySelection !== "undefined") { - response.data.repository_selection = repositorySelection; - } - response.data.total_count = totalCount; - return response; -} - -// pkg/dist-src/iterator.js -function iterator(octokit, route, parameters) { - const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); - const requestMethod = typeof route === "function" ? route : octokit.request; - const method = options.method; - const headers = options.headers; - let url = options.url; - return { - [Symbol.asyncIterator]: () => ({ - async next() { - if (!url) - return { done: true }; - try { - const response = await requestMethod({ method, url, headers }); - const normalizedResponse = normalizePaginatedListResponse(response); - url = ((normalizedResponse.headers.link || "").match( - /<([^>]+)>;\s*rel="next"/ - ) || [])[1]; - return { value: normalizedResponse }; - } catch (error) { - if (error.status !== 409) - throw error; - url = ""; - return { - value: { - status: 200, - headers: {}, - data: [] - } - }; - } - } - }) - }; -} - -// pkg/dist-src/paginate.js -function paginate(octokit, route, parameters, mapFn) { - if (typeof parameters === "function") { - mapFn = parameters; - parameters = void 0; - } - return gather( - octokit, - [], - iterator(octokit, route, parameters)[Symbol.asyncIterator](), - mapFn - ); -} -function gather(octokit, results, iterator2, mapFn) { - return iterator2.next().then((result) => { - if (result.done) { - return results; - } - let earlyExit = false; - function done() { - earlyExit = true; - } - results = results.concat( - mapFn ? mapFn(result.value, done) : result.value.data - ); - if (earlyExit) { - return results; - } - return gather(octokit, results, iterator2, mapFn); - }); -} - -// pkg/dist-src/compose-paginate.js -var composePaginateRest = Object.assign(paginate, { - iterator -}); - -// pkg/dist-src/generated/paginating-endpoints.js -var paginatingEndpoints = [ - "GET /advisories", - "GET /app/hook/deliveries", - "GET /app/installation-requests", - "GET /app/installations", - "GET /assignments/{assignment_id}/accepted_assignments", - "GET /classrooms", - "GET /classrooms/{classroom_id}/assignments", - "GET /enterprises/{enterprise}/dependabot/alerts", - "GET /enterprises/{enterprise}/secret-scanning/alerts", - "GET /events", - "GET /gists", - "GET /gists/public", - "GET /gists/starred", - "GET /gists/{gist_id}/comments", - "GET /gists/{gist_id}/commits", - "GET /gists/{gist_id}/forks", - "GET /installation/repositories", - "GET /issues", - "GET /licenses", - "GET /marketplace_listing/plans", - "GET /marketplace_listing/plans/{plan_id}/accounts", - "GET /marketplace_listing/stubbed/plans", - "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", - "GET /networks/{owner}/{repo}/events", - "GET /notifications", - "GET /organizations", - "GET /orgs/{org}/actions/cache/usage-by-repository", - "GET /orgs/{org}/actions/permissions/repositories", - "GET /orgs/{org}/actions/runners", - "GET /orgs/{org}/actions/secrets", - "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", - "GET /orgs/{org}/actions/variables", - "GET /orgs/{org}/actions/variables/{name}/repositories", - "GET /orgs/{org}/blocks", - "GET /orgs/{org}/code-scanning/alerts", - "GET /orgs/{org}/codespaces", - "GET /orgs/{org}/codespaces/secrets", - "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories", - "GET /orgs/{org}/copilot/billing/seats", - "GET /orgs/{org}/dependabot/alerts", - "GET /orgs/{org}/dependabot/secrets", - "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", - "GET /orgs/{org}/events", - "GET /orgs/{org}/failed_invitations", - "GET /orgs/{org}/hooks", - "GET /orgs/{org}/hooks/{hook_id}/deliveries", - "GET /orgs/{org}/installations", - "GET /orgs/{org}/invitations", - "GET /orgs/{org}/invitations/{invitation_id}/teams", - "GET /orgs/{org}/issues", - "GET /orgs/{org}/members", - "GET /orgs/{org}/members/{username}/codespaces", - "GET /orgs/{org}/migrations", - "GET /orgs/{org}/migrations/{migration_id}/repositories", - "GET /orgs/{org}/outside_collaborators", - "GET /orgs/{org}/packages", - "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", - "GET /orgs/{org}/personal-access-token-requests", - "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories", - "GET /orgs/{org}/personal-access-tokens", - "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories", - "GET /orgs/{org}/projects", - "GET /orgs/{org}/public_members", - "GET /orgs/{org}/repos", - "GET /orgs/{org}/rulesets", - "GET /orgs/{org}/secret-scanning/alerts", - "GET /orgs/{org}/security-advisories", - "GET /orgs/{org}/teams", - "GET /orgs/{org}/teams/{team_slug}/discussions", - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", - "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", - "GET /orgs/{org}/teams/{team_slug}/invitations", - "GET /orgs/{org}/teams/{team_slug}/members", - "GET /orgs/{org}/teams/{team_slug}/projects", - "GET /orgs/{org}/teams/{team_slug}/repos", - "GET /orgs/{org}/teams/{team_slug}/teams", - "GET /projects/columns/{column_id}/cards", - "GET /projects/{project_id}/collaborators", - "GET /projects/{project_id}/columns", - "GET /repos/{owner}/{repo}/actions/artifacts", - "GET /repos/{owner}/{repo}/actions/caches", - "GET /repos/{owner}/{repo}/actions/organization-secrets", - "GET /repos/{owner}/{repo}/actions/organization-variables", - "GET /repos/{owner}/{repo}/actions/runners", - "GET /repos/{owner}/{repo}/actions/runs", - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", - "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", - "GET /repos/{owner}/{repo}/actions/secrets", - "GET /repos/{owner}/{repo}/actions/variables", - "GET /repos/{owner}/{repo}/actions/workflows", - "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", - "GET /repos/{owner}/{repo}/activity", - "GET /repos/{owner}/{repo}/assignees", - "GET /repos/{owner}/{repo}/branches", - "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", - "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", - "GET /repos/{owner}/{repo}/code-scanning/alerts", - "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", - "GET /repos/{owner}/{repo}/code-scanning/analyses", - "GET /repos/{owner}/{repo}/codespaces", - "GET /repos/{owner}/{repo}/codespaces/devcontainers", - "GET /repos/{owner}/{repo}/codespaces/secrets", - "GET /repos/{owner}/{repo}/collaborators", - "GET /repos/{owner}/{repo}/comments", - "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", - "GET /repos/{owner}/{repo}/commits", - "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", - "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", - "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", - "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", - "GET /repos/{owner}/{repo}/commits/{ref}/status", - "GET /repos/{owner}/{repo}/commits/{ref}/statuses", - "GET /repos/{owner}/{repo}/contributors", - "GET /repos/{owner}/{repo}/dependabot/alerts", - "GET /repos/{owner}/{repo}/dependabot/secrets", - "GET /repos/{owner}/{repo}/deployments", - "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", - "GET /repos/{owner}/{repo}/environments", - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies", - "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps", - "GET /repos/{owner}/{repo}/events", - "GET /repos/{owner}/{repo}/forks", - "GET /repos/{owner}/{repo}/hooks", - "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", - "GET /repos/{owner}/{repo}/invitations", - "GET /repos/{owner}/{repo}/issues", - "GET /repos/{owner}/{repo}/issues/comments", - "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", - "GET /repos/{owner}/{repo}/issues/events", - "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", - "GET /repos/{owner}/{repo}/issues/{issue_number}/events", - "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", - "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", - "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", - "GET /repos/{owner}/{repo}/keys", - "GET /repos/{owner}/{repo}/labels", - "GET /repos/{owner}/{repo}/milestones", - "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", - "GET /repos/{owner}/{repo}/notifications", - "GET /repos/{owner}/{repo}/pages/builds", - "GET /repos/{owner}/{repo}/projects", - "GET /repos/{owner}/{repo}/pulls", - "GET /repos/{owner}/{repo}/pulls/comments", - "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", - "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", - "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", - "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", - "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", - "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", - "GET /repos/{owner}/{repo}/releases", - "GET /repos/{owner}/{repo}/releases/{release_id}/assets", - "GET /repos/{owner}/{repo}/releases/{release_id}/reactions", - "GET /repos/{owner}/{repo}/rules/branches/{branch}", - "GET /repos/{owner}/{repo}/rulesets", - "GET /repos/{owner}/{repo}/secret-scanning/alerts", - "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", - "GET /repos/{owner}/{repo}/security-advisories", - "GET /repos/{owner}/{repo}/stargazers", - "GET /repos/{owner}/{repo}/subscribers", - "GET /repos/{owner}/{repo}/tags", - "GET /repos/{owner}/{repo}/teams", - "GET /repos/{owner}/{repo}/topics", - "GET /repositories", - "GET /repositories/{repository_id}/environments/{environment_name}/secrets", - "GET /repositories/{repository_id}/environments/{environment_name}/variables", - "GET /search/code", - "GET /search/commits", - "GET /search/issues", - "GET /search/labels", - "GET /search/repositories", - "GET /search/topics", - "GET /search/users", - "GET /teams/{team_id}/discussions", - "GET /teams/{team_id}/discussions/{discussion_number}/comments", - "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", - "GET /teams/{team_id}/discussions/{discussion_number}/reactions", - "GET /teams/{team_id}/invitations", - "GET /teams/{team_id}/members", - "GET /teams/{team_id}/projects", - "GET /teams/{team_id}/repos", - "GET /teams/{team_id}/teams", - "GET /user/blocks", - "GET /user/codespaces", - "GET /user/codespaces/secrets", - "GET /user/emails", - "GET /user/followers", - "GET /user/following", - "GET /user/gpg_keys", - "GET /user/installations", - "GET /user/installations/{installation_id}/repositories", - "GET /user/issues", - "GET /user/keys", - "GET /user/marketplace_purchases", - "GET /user/marketplace_purchases/stubbed", - "GET /user/memberships/orgs", - "GET /user/migrations", - "GET /user/migrations/{migration_id}/repositories", - "GET /user/orgs", - "GET /user/packages", - "GET /user/packages/{package_type}/{package_name}/versions", - "GET /user/public_emails", - "GET /user/repos", - "GET /user/repository_invitations", - "GET /user/social_accounts", - "GET /user/ssh_signing_keys", - "GET /user/starred", - "GET /user/subscriptions", - "GET /user/teams", - "GET /users", - "GET /users/{username}/events", - "GET /users/{username}/events/orgs/{org}", - "GET /users/{username}/events/public", - "GET /users/{username}/followers", - "GET /users/{username}/following", - "GET /users/{username}/gists", - "GET /users/{username}/gpg_keys", - "GET /users/{username}/keys", - "GET /users/{username}/orgs", - "GET /users/{username}/packages", - "GET /users/{username}/projects", - "GET /users/{username}/received_events", - "GET /users/{username}/received_events/public", - "GET /users/{username}/repos", - "GET /users/{username}/social_accounts", - "GET /users/{username}/ssh_signing_keys", - "GET /users/{username}/starred", - "GET /users/{username}/subscriptions" -]; - -// pkg/dist-src/paginating-endpoints.js -function isPaginatingEndpoint(arg) { - if (typeof arg === "string") { - return paginatingEndpoints.includes(arg); - } else { - return false; - } -} - -// pkg/dist-src/index.js -function paginateRest(octokit) { - return { - paginate: Object.assign(paginate.bind(null, octokit), { - iterator: iterator.bind(null, octokit) - }) - }; -} -paginateRest.VERSION = VERSION; -// Annotate the CommonJS export names for ESM import in node: -0 && (0); - - -/***/ }), - -/***/ 83044: -/***/ ((module) => { - -"use strict"; - -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// pkg/dist-src/index.js -var dist_src_exports = {}; -__export(dist_src_exports, { - legacyRestEndpointMethods: () => legacyRestEndpointMethods, - restEndpointMethods: () => restEndpointMethods -}); -module.exports = __toCommonJS(dist_src_exports); - -// pkg/dist-src/version.js -var VERSION = "10.0.1"; +// pkg/dist-src/version.js +var VERSION = "10.1.4"; // pkg/dist-src/generated/endpoints.js var Endpoints = { @@ -42445,6 +40363,9 @@ var Endpoints = { enableWorkflow: [ "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable" ], + forceCancelWorkflowRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel" + ], generateRunnerJitconfigForOrg: [ "POST /orgs/{org}/actions/runners/generate-jitconfig" ], @@ -42854,6 +40775,9 @@ var Endpoints = { addSelectedRepoToOrgSecret: [ "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}" ], + checkPermissionsForDevcontainer: [ + "GET /repos/{owner}/{repo}/codespaces/permissions_check" + ], codespaceMachinesForAuthenticatedUser: [ "GET /user/codespaces/{codespace_name}/machines" ], @@ -42971,7 +40895,7 @@ var Endpoints = { "DELETE /orgs/{org}/copilot/billing/selected_users" ], getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"], - getCopilotSeatAssignmentDetailsForUser: [ + getCopilotSeatDetailsForUser: [ "GET /orgs/{org}/members/{username}/copilot" ], listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"] @@ -43184,7 +41108,13 @@ var Endpoints = { root: ["GET /"] }, migrations: { - cancelImport: ["DELETE /repos/{owner}/{repo}/import"], + cancelImport: [ + "DELETE /repos/{owner}/{repo}/import", + {}, + { + deprecated: "octokit.rest.migrations.cancelImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#cancel-an-import" + } + ], deleteArchiveForAuthenticatedUser: [ "DELETE /user/migrations/{migration_id}/archive" ], @@ -43197,9 +41127,27 @@ var Endpoints = { getArchiveForAuthenticatedUser: [ "GET /user/migrations/{migration_id}/archive" ], - getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"], - getImportStatus: ["GET /repos/{owner}/{repo}/import"], - getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"], + getCommitAuthors: [ + "GET /repos/{owner}/{repo}/import/authors", + {}, + { + deprecated: "octokit.rest.migrations.getCommitAuthors() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-commit-authors" + } + ], + getImportStatus: [ + "GET /repos/{owner}/{repo}/import", + {}, + { + deprecated: "octokit.rest.migrations.getImportStatus() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-an-import-status" + } + ], + getLargeFiles: [ + "GET /repos/{owner}/{repo}/import/large_files", + {}, + { + deprecated: "octokit.rest.migrations.getLargeFiles() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-large-files" + } + ], getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"], getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"], listForAuthenticatedUser: ["GET /user/migrations"], @@ -43213,18 +41161,42 @@ var Endpoints = { {}, { renamed: ["migrations", "listReposForAuthenticatedUser"] } ], - mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"], - setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"], + mapCommitAuthor: [ + "PATCH /repos/{owner}/{repo}/import/authors/{author_id}", + {}, + { + deprecated: "octokit.rest.migrations.mapCommitAuthor() is deprecated, see https://docs.github.com/rest/migrations/source-imports#map-a-commit-author" + } + ], + setLfsPreference: [ + "PATCH /repos/{owner}/{repo}/import/lfs", + {}, + { + deprecated: "octokit.rest.migrations.setLfsPreference() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-git-lfs-preference" + } + ], startForAuthenticatedUser: ["POST /user/migrations"], startForOrg: ["POST /orgs/{org}/migrations"], - startImport: ["PUT /repos/{owner}/{repo}/import"], + startImport: [ + "PUT /repos/{owner}/{repo}/import", + {}, + { + deprecated: "octokit.rest.migrations.startImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#start-an-import" + } + ], unlockRepoForAuthenticatedUser: [ "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock" ], unlockRepoForOrg: [ "DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock" ], - updateImport: ["PATCH /repos/{owner}/{repo}/import"] + updateImport: [ + "PATCH /repos/{owner}/{repo}/import", + {}, + { + deprecated: "octokit.rest.migrations.updateImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-an-import" + } + ] }, orgs: { addSecurityManagerTeam: [ @@ -43239,6 +41211,13 @@ var Endpoints = { "PUT /orgs/{org}/outside_collaborators/{username}" ], createInvitation: ["POST /orgs/{org}/invitations"], + createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"], + createOrUpdateCustomPropertiesValuesForRepos: [ + "PATCH /orgs/{org}/properties/values" + ], + createOrUpdateCustomProperty: [ + "PUT /orgs/{org}/properties/schema/{custom_property_name}" + ], createWebhook: ["POST /orgs/{org}/hooks"], delete: ["DELETE /orgs/{org}"], deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], @@ -43246,6 +41225,10 @@ var Endpoints = { "POST /orgs/{org}/{security_product}/{enablement}" ], get: ["GET /orgs/{org}"], + getAllCustomProperties: ["GET /orgs/{org}/properties/schema"], + getCustomProperty: [ + "GET /orgs/{org}/properties/schema/{custom_property_name}" + ], getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], @@ -43256,6 +41239,7 @@ var Endpoints = { list: ["GET /organizations"], listAppInstallations: ["GET /orgs/{org}/installations"], listBlockedUsers: ["GET /orgs/{org}/blocks"], + listCustomPropertiesValuesForRepos: ["GET /orgs/{org}/properties/values"], listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], listForAuthenticatedUser: ["GET /user/orgs"], listForUser: ["GET /users/{username}/orgs"], @@ -43280,6 +41264,9 @@ var Endpoints = { redeliverWebhookDelivery: [ "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" ], + removeCustomProperty: [ + "DELETE /orgs/{org}/properties/schema/{custom_property_name}" + ], removeMember: ["DELETE /orgs/{org}/members/{username}"], removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], removeOutsideCollaborator: [ @@ -43760,6 +41747,7 @@ var Endpoints = { getCustomDeploymentProtectionRule: [ "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}" ], + getCustomPropertiesValues: ["GET /repos/{owner}/{repo}/properties/values"], getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], getDeploymentBranchPolicy: [ @@ -43773,6 +41761,8 @@ var Endpoints = { ], getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], + getOrgRuleSuite: ["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"], + getOrgRuleSuites: ["GET /orgs/{org}/rulesets/rule-suites"], getOrgRuleset: ["GET /orgs/{org}/rulesets/{ruleset_id}"], getOrgRulesets: ["GET /orgs/{org}/rulesets"], getPages: ["GET /repos/{owner}/{repo}/pages"], @@ -43788,6 +41778,10 @@ var Endpoints = { getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], + getRepoRuleSuite: [ + "GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}" + ], + getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"], getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"], getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"], getStatusChecksProtection: [ @@ -44196,716 +42190,1734 @@ var Endpoints = { updateAuthenticated: ["PATCH /user"] } }; -var endpoints_default = Endpoints; +var endpoints_default = Endpoints; + +// pkg/dist-src/endpoints-to-methods.js +var endpointMethodsMap = /* @__PURE__ */ new Map(); +for (const [scope, endpoints] of Object.entries(endpoints_default)) { + for (const [methodName, endpoint] of Object.entries(endpoints)) { + const [route, defaults, decorations] = endpoint; + const [method, url] = route.split(/ /); + const endpointDefaults = Object.assign( + { + method, + url + }, + defaults + ); + if (!endpointMethodsMap.has(scope)) { + endpointMethodsMap.set(scope, /* @__PURE__ */ new Map()); + } + endpointMethodsMap.get(scope).set(methodName, { + scope, + methodName, + endpointDefaults, + decorations + }); + } +} +var handler = { + has({ scope }, methodName) { + return endpointMethodsMap.get(scope).has(methodName); + }, + getOwnPropertyDescriptor(target, methodName) { + return { + value: this.get(target, methodName), + // ensures method is in the cache + configurable: true, + writable: true, + enumerable: true + }; + }, + defineProperty(target, methodName, descriptor) { + Object.defineProperty(target.cache, methodName, descriptor); + return true; + }, + deleteProperty(target, methodName) { + delete target.cache[methodName]; + return true; + }, + ownKeys({ scope }) { + return [...endpointMethodsMap.get(scope).keys()]; + }, + set(target, methodName, value) { + return target.cache[methodName] = value; + }, + get({ octokit, scope, cache }, methodName) { + if (cache[methodName]) { + return cache[methodName]; + } + const method = endpointMethodsMap.get(scope).get(methodName); + if (!method) { + return void 0; + } + const { endpointDefaults, decorations } = method; + if (decorations) { + cache[methodName] = decorate( + octokit, + scope, + methodName, + endpointDefaults, + decorations + ); + } else { + cache[methodName] = octokit.request.defaults(endpointDefaults); + } + return cache[methodName]; + } +}; +function endpointsToMethods(octokit) { + const newMethods = {}; + for (const scope of endpointMethodsMap.keys()) { + newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler); + } + return newMethods; +} +function decorate(octokit, scope, methodName, defaults, decorations) { + const requestWithDefaults = octokit.request.defaults(defaults); + function withDecorations(...args) { + let options = requestWithDefaults.endpoint.merge(...args); + if (decorations.mapToData) { + options = Object.assign({}, options, { + data: options[decorations.mapToData], + [decorations.mapToData]: void 0 + }); + return requestWithDefaults(options); + } + if (decorations.renamed) { + const [newScope, newMethodName] = decorations.renamed; + octokit.log.warn( + `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()` + ); + } + if (decorations.deprecated) { + octokit.log.warn(decorations.deprecated); + } + if (decorations.renamedParameters) { + const options2 = requestWithDefaults.endpoint.merge(...args); + for (const [name, alias] of Object.entries( + decorations.renamedParameters + )) { + if (name in options2) { + octokit.log.warn( + `"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead` + ); + if (!(alias in options2)) { + options2[alias] = options2[name]; + } + delete options2[name]; + } + } + return requestWithDefaults(options2); + } + return requestWithDefaults(...args); + } + return Object.assign(withDecorations, requestWithDefaults); +} + +// pkg/dist-src/index.js +function restEndpointMethods(octokit) { + const api = endpointsToMethods(octokit); + return { + rest: api + }; +} +restEndpointMethods.VERSION = VERSION; +function legacyRestEndpointMethods(octokit) { + const api = endpointsToMethods(octokit); + return { + ...api, + rest: api + }; +} +legacyRestEndpointMethods.VERSION = VERSION; +// Annotate the CommonJS export names for ESM import in node: +0 && (0); + + +/***/ }), + +/***/ 10537: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// pkg/dist-src/index.js +var dist_src_exports = {}; +__export(dist_src_exports, { + RequestError: () => RequestError +}); +module.exports = __toCommonJS(dist_src_exports); +var import_deprecation = __nccwpck_require__(58932); +var import_once = __toESM(__nccwpck_require__(1223)); +var logOnceCode = (0, import_once.default)((deprecation) => console.warn(deprecation)); +var logOnceHeaders = (0, import_once.default)((deprecation) => console.warn(deprecation)); +var RequestError = class extends Error { + constructor(message, statusCode, options) { + super(message); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + this.name = "HttpError"; + this.status = statusCode; + let headers; + if ("headers" in options && typeof options.headers !== "undefined") { + headers = options.headers; + } + if ("response" in options) { + this.response = options.response; + headers = options.response.headers; + } + const requestCopy = Object.assign({}, options.request); + if (options.request.headers.authorization) { + requestCopy.headers = Object.assign({}, options.request.headers, { + authorization: options.request.headers.authorization.replace( + / .*$/, + " [REDACTED]" + ) + }); + } + requestCopy.url = requestCopy.url.replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]").replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); + this.request = requestCopy; + Object.defineProperty(this, "code", { + get() { + logOnceCode( + new import_deprecation.Deprecation( + "[@octokit/request-error] `error.code` is deprecated, use `error.status`." + ) + ); + return statusCode; + } + }); + Object.defineProperty(this, "headers", { + get() { + logOnceHeaders( + new import_deprecation.Deprecation( + "[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`." + ) + ); + return headers || {}; + } + }); + } +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (0); + + +/***/ }), + +/***/ 36234: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// pkg/dist-src/index.js +var dist_src_exports = {}; +__export(dist_src_exports, { + request: () => request +}); +module.exports = __toCommonJS(dist_src_exports); +var import_endpoint = __nccwpck_require__(59440); +var import_universal_user_agent = __nccwpck_require__(45030); + +// pkg/dist-src/version.js +var VERSION = "8.1.5"; + +// pkg/dist-src/fetch-wrapper.js +var import_is_plain_object = __nccwpck_require__(63287); +var import_request_error = __nccwpck_require__(10537); + +// pkg/dist-src/get-buffer-response.js +function getBufferResponse(response) { + return response.arrayBuffer(); +} + +// pkg/dist-src/fetch-wrapper.js +function fetchWrapper(requestOptions) { + var _a, _b, _c; + const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console; + const parseSuccessResponseBody = ((_a = requestOptions.request) == null ? void 0 : _a.parseSuccessResponseBody) !== false; + if ((0, import_is_plain_object.isPlainObject)(requestOptions.body) || Array.isArray(requestOptions.body)) { + requestOptions.body = JSON.stringify(requestOptions.body); + } + let headers = {}; + let status; + let url; + let { fetch } = globalThis; + if ((_b = requestOptions.request) == null ? void 0 : _b.fetch) { + fetch = requestOptions.request.fetch; + } + if (!fetch) { + throw new Error( + "fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing" + ); + } + return fetch(requestOptions.url, { + method: requestOptions.method, + body: requestOptions.body, + headers: requestOptions.headers, + signal: (_c = requestOptions.request) == null ? void 0 : _c.signal, + // duplex must be set if request.body is ReadableStream or Async Iterables. + // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex. + ...requestOptions.body && { duplex: "half" } + }).then(async (response) => { + url = response.url; + status = response.status; + for (const keyAndValue of response.headers) { + headers[keyAndValue[0]] = keyAndValue[1]; + } + if ("deprecation" in headers) { + const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/); + const deprecationLink = matches && matches.pop(); + log.warn( + `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}` + ); + } + if (status === 204 || status === 205) { + return; + } + if (requestOptions.method === "HEAD") { + if (status < 400) { + return; + } + throw new import_request_error.RequestError(response.statusText, status, { + response: { + url, + status, + headers, + data: void 0 + }, + request: requestOptions + }); + } + if (status === 304) { + throw new import_request_error.RequestError("Not modified", status, { + response: { + url, + status, + headers, + data: await getResponseData(response) + }, + request: requestOptions + }); + } + if (status >= 400) { + const data = await getResponseData(response); + const error = new import_request_error.RequestError(toErrorMessage(data), status, { + response: { + url, + status, + headers, + data + }, + request: requestOptions + }); + throw error; + } + return parseSuccessResponseBody ? await getResponseData(response) : response.body; + }).then((data) => { + return { + status, + url, + headers, + data + }; + }).catch((error) => { + if (error instanceof import_request_error.RequestError) + throw error; + else if (error.name === "AbortError") + throw error; + let message = error.message; + if (error.name === "TypeError" && "cause" in error) { + if (error.cause instanceof Error) { + message = error.cause.message; + } else if (typeof error.cause === "string") { + message = error.cause; + } + } + throw new import_request_error.RequestError(message, 500, { + request: requestOptions + }); + }); +} +async function getResponseData(response) { + const contentType = response.headers.get("content-type"); + if (/application\/json/.test(contentType)) { + return response.json().catch(() => response.text()).catch(() => ""); + } + if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { + return response.text(); + } + return getBufferResponse(response); +} +function toErrorMessage(data) { + if (typeof data === "string") + return data; + if ("message" in data) { + if (Array.isArray(data.errors)) { + return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; + } + return data.message; + } + return `Unknown error: ${JSON.stringify(data)}`; +} + +// pkg/dist-src/with-defaults.js +function withDefaults(oldEndpoint, newDefaults) { + const endpoint2 = oldEndpoint.defaults(newDefaults); + const newApi = function(route, parameters) { + const endpointOptions = endpoint2.merge(route, parameters); + if (!endpointOptions.request || !endpointOptions.request.hook) { + return fetchWrapper(endpoint2.parse(endpointOptions)); + } + const request2 = (route2, parameters2) => { + return fetchWrapper( + endpoint2.parse(endpoint2.merge(route2, parameters2)) + ); + }; + Object.assign(request2, { + endpoint: endpoint2, + defaults: withDefaults.bind(null, endpoint2) + }); + return endpointOptions.request.hook(request2, endpointOptions); + }; + return Object.assign(newApi, { + endpoint: endpoint2, + defaults: withDefaults.bind(null, endpoint2) + }); +} + +// pkg/dist-src/index.js +var request = withDefaults(import_endpoint.endpoint, { + headers: { + "user-agent": `octokit-request.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}` + } +}); +// Annotate the CommonJS export names for ESM import in node: +0 && (0); + + +/***/ }), + +/***/ 43779: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = exports.DEFAULT_USE_DUALSTACK_ENDPOINT = exports.CONFIG_USE_DUALSTACK_ENDPOINT = exports.ENV_USE_DUALSTACK_ENDPOINT = void 0; +const util_config_provider_1 = __nccwpck_require__(83375); +exports.ENV_USE_DUALSTACK_ENDPOINT = "AWS_USE_DUALSTACK_ENDPOINT"; +exports.CONFIG_USE_DUALSTACK_ENDPOINT = "use_dualstack_endpoint"; +exports.DEFAULT_USE_DUALSTACK_ENDPOINT = false; +exports.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = { + environmentVariableSelector: (env) => (0, util_config_provider_1.booleanSelector)(env, exports.ENV_USE_DUALSTACK_ENDPOINT, util_config_provider_1.SelectorType.ENV), + configFileSelector: (profile) => (0, util_config_provider_1.booleanSelector)(profile, exports.CONFIG_USE_DUALSTACK_ENDPOINT, util_config_provider_1.SelectorType.CONFIG), + default: false, +}; + + +/***/ }), + +/***/ 17994: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = exports.DEFAULT_USE_FIPS_ENDPOINT = exports.CONFIG_USE_FIPS_ENDPOINT = exports.ENV_USE_FIPS_ENDPOINT = void 0; +const util_config_provider_1 = __nccwpck_require__(83375); +exports.ENV_USE_FIPS_ENDPOINT = "AWS_USE_FIPS_ENDPOINT"; +exports.CONFIG_USE_FIPS_ENDPOINT = "use_fips_endpoint"; +exports.DEFAULT_USE_FIPS_ENDPOINT = false; +exports.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = { + environmentVariableSelector: (env) => (0, util_config_provider_1.booleanSelector)(env, exports.ENV_USE_FIPS_ENDPOINT, util_config_provider_1.SelectorType.ENV), + configFileSelector: (profile) => (0, util_config_provider_1.booleanSelector)(profile, exports.CONFIG_USE_FIPS_ENDPOINT, util_config_provider_1.SelectorType.CONFIG), + default: false, +}; + + +/***/ }), + +/***/ 18421: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(43779), exports); +tslib_1.__exportStar(__nccwpck_require__(17994), exports); +tslib_1.__exportStar(__nccwpck_require__(37432), exports); +tslib_1.__exportStar(__nccwpck_require__(61892), exports); + + +/***/ }), + +/***/ 37432: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.resolveCustomEndpointsConfig = void 0; +const util_middleware_1 = __nccwpck_require__(2390); +const resolveCustomEndpointsConfig = (input) => { + var _a, _b; + const { endpoint, urlParser } = input; + return { + ...input, + tls: (_a = input.tls) !== null && _a !== void 0 ? _a : true, + endpoint: (0, util_middleware_1.normalizeProvider)(typeof endpoint === "string" ? urlParser(endpoint) : endpoint), + isCustomEndpoint: true, + useDualstackEndpoint: (0, util_middleware_1.normalizeProvider)((_b = input.useDualstackEndpoint) !== null && _b !== void 0 ? _b : false), + }; +}; +exports.resolveCustomEndpointsConfig = resolveCustomEndpointsConfig; + + +/***/ }), + +/***/ 61892: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.resolveEndpointsConfig = void 0; +const util_middleware_1 = __nccwpck_require__(2390); +const getEndpointFromRegion_1 = __nccwpck_require__(48570); +const resolveEndpointsConfig = (input) => { + var _a, _b; + const useDualstackEndpoint = (0, util_middleware_1.normalizeProvider)((_a = input.useDualstackEndpoint) !== null && _a !== void 0 ? _a : false); + const { endpoint, useFipsEndpoint, urlParser } = input; + return { + ...input, + tls: (_b = input.tls) !== null && _b !== void 0 ? _b : true, + endpoint: endpoint + ? (0, util_middleware_1.normalizeProvider)(typeof endpoint === "string" ? urlParser(endpoint) : endpoint) + : () => (0, getEndpointFromRegion_1.getEndpointFromRegion)({ ...input, useDualstackEndpoint, useFipsEndpoint }), + isCustomEndpoint: !!endpoint, + useDualstackEndpoint, + }; +}; +exports.resolveEndpointsConfig = resolveEndpointsConfig; + + +/***/ }), + +/***/ 48570: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getEndpointFromRegion = void 0; +const getEndpointFromRegion = async (input) => { + var _a; + const { tls = true } = input; + const region = await input.region(); + const dnsHostRegex = new RegExp(/^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$/); + if (!dnsHostRegex.test(region)) { + throw new Error("Invalid region in client config"); + } + const useDualstackEndpoint = await input.useDualstackEndpoint(); + const useFipsEndpoint = await input.useFipsEndpoint(); + const { hostname } = (_a = (await input.regionInfoProvider(region, { useDualstackEndpoint, useFipsEndpoint }))) !== null && _a !== void 0 ? _a : {}; + if (!hostname) { + throw new Error("Cannot resolve hostname from client config"); + } + return input.urlParser(`${tls ? "https:" : "http:"}//${hostname}`); +}; +exports.getEndpointFromRegion = getEndpointFromRegion; + + +/***/ }), + +/***/ 53098: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(18421), exports); +tslib_1.__exportStar(__nccwpck_require__(221), exports); +tslib_1.__exportStar(__nccwpck_require__(86985), exports); + + +/***/ }), + +/***/ 33898: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NODE_REGION_CONFIG_FILE_OPTIONS = exports.NODE_REGION_CONFIG_OPTIONS = exports.REGION_INI_NAME = exports.REGION_ENV_NAME = void 0; +exports.REGION_ENV_NAME = "AWS_REGION"; +exports.REGION_INI_NAME = "region"; +exports.NODE_REGION_CONFIG_OPTIONS = { + environmentVariableSelector: (env) => env[exports.REGION_ENV_NAME], + configFileSelector: (profile) => profile[exports.REGION_INI_NAME], + default: () => { + throw new Error("Region is missing"); + }, +}; +exports.NODE_REGION_CONFIG_FILE_OPTIONS = { + preferredFile: "credentials", +}; + + +/***/ }), + +/***/ 49506: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getRealRegion = void 0; +const isFipsRegion_1 = __nccwpck_require__(43870); +const getRealRegion = (region) => (0, isFipsRegion_1.isFipsRegion)(region) + ? ["fips-aws-global", "aws-fips"].includes(region) + ? "us-east-1" + : region.replace(/fips-(dkr-|prod-)?|-fips/, "") + : region; +exports.getRealRegion = getRealRegion; + + +/***/ }), + +/***/ 221: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(33898), exports); +tslib_1.__exportStar(__nccwpck_require__(87065), exports); + + +/***/ }), + +/***/ 43870: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isFipsRegion = void 0; +const isFipsRegion = (region) => typeof region === "string" && (region.startsWith("fips-") || region.endsWith("-fips")); +exports.isFipsRegion = isFipsRegion; + + +/***/ }), + +/***/ 87065: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.resolveRegionConfig = void 0; +const getRealRegion_1 = __nccwpck_require__(49506); +const isFipsRegion_1 = __nccwpck_require__(43870); +const resolveRegionConfig = (input) => { + const { region, useFipsEndpoint } = input; + if (!region) { + throw new Error("Region is missing"); + } + return { + ...input, + region: async () => { + if (typeof region === "string") { + return (0, getRealRegion_1.getRealRegion)(region); + } + const providedRegion = await region(); + return (0, getRealRegion_1.getRealRegion)(providedRegion); + }, + useFipsEndpoint: async () => { + const providedRegion = typeof region === "string" ? region : await region(); + if ((0, isFipsRegion_1.isFipsRegion)(providedRegion)) { + return true; + } + return typeof useFipsEndpoint !== "function" ? Promise.resolve(!!useFipsEndpoint) : useFipsEndpoint(); + }, + }; +}; +exports.resolveRegionConfig = resolveRegionConfig; -// pkg/dist-src/endpoints-to-methods.js -var endpointMethodsMap = /* @__PURE__ */ new Map(); -for (const [scope, endpoints] of Object.entries(endpoints_default)) { - for (const [methodName, endpoint] of Object.entries(endpoints)) { - const [route, defaults, decorations] = endpoint; - const [method, url] = route.split(/ /); - const endpointDefaults = Object.assign( - { - method, - url - }, - defaults - ); - if (!endpointMethodsMap.has(scope)) { - endpointMethodsMap.set(scope, /* @__PURE__ */ new Map()); + +/***/ }), + +/***/ 19814: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 14832: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 99760: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getHostnameFromVariants = void 0; +const getHostnameFromVariants = (variants = [], { useFipsEndpoint, useDualstackEndpoint }) => { + var _a; + return (_a = variants.find(({ tags }) => useFipsEndpoint === tags.includes("fips") && useDualstackEndpoint === tags.includes("dualstack"))) === null || _a === void 0 ? void 0 : _a.hostname; +}; +exports.getHostnameFromVariants = getHostnameFromVariants; + + +/***/ }), + +/***/ 77792: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getRegionInfo = void 0; +const getHostnameFromVariants_1 = __nccwpck_require__(99760); +const getResolvedHostname_1 = __nccwpck_require__(1487); +const getResolvedPartition_1 = __nccwpck_require__(44441); +const getResolvedSigningRegion_1 = __nccwpck_require__(92281); +const getRegionInfo = (region, { useFipsEndpoint = false, useDualstackEndpoint = false, signingService, regionHash, partitionHash, }) => { + var _a, _b, _c, _d, _e, _f; + const partition = (0, getResolvedPartition_1.getResolvedPartition)(region, { partitionHash }); + const resolvedRegion = region in regionHash ? region : (_b = (_a = partitionHash[partition]) === null || _a === void 0 ? void 0 : _a.endpoint) !== null && _b !== void 0 ? _b : region; + const hostnameOptions = { useFipsEndpoint, useDualstackEndpoint }; + const regionHostname = (0, getHostnameFromVariants_1.getHostnameFromVariants)((_c = regionHash[resolvedRegion]) === null || _c === void 0 ? void 0 : _c.variants, hostnameOptions); + const partitionHostname = (0, getHostnameFromVariants_1.getHostnameFromVariants)((_d = partitionHash[partition]) === null || _d === void 0 ? void 0 : _d.variants, hostnameOptions); + const hostname = (0, getResolvedHostname_1.getResolvedHostname)(resolvedRegion, { regionHostname, partitionHostname }); + if (hostname === undefined) { + throw new Error(`Endpoint resolution failed for: ${{ resolvedRegion, useFipsEndpoint, useDualstackEndpoint }}`); } - endpointMethodsMap.get(scope).set(methodName, { - scope, - methodName, - endpointDefaults, - decorations + const signingRegion = (0, getResolvedSigningRegion_1.getResolvedSigningRegion)(hostname, { + signingRegion: (_e = regionHash[resolvedRegion]) === null || _e === void 0 ? void 0 : _e.signingRegion, + regionRegex: partitionHash[partition].regionRegex, + useFipsEndpoint, }); - } -} -var handler = { - has({ scope }, methodName) { - return endpointMethodsMap.get(scope).has(methodName); - }, - getOwnPropertyDescriptor(target, methodName) { return { - value: this.get(target, methodName), - // ensures method is in the cache - configurable: true, - writable: true, - enumerable: true + partition, + signingService, + hostname, + ...(signingRegion && { signingRegion }), + ...(((_f = regionHash[resolvedRegion]) === null || _f === void 0 ? void 0 : _f.signingService) && { + signingService: regionHash[resolvedRegion].signingService, + }), }; - }, - defineProperty(target, methodName, descriptor) { - Object.defineProperty(target.cache, methodName, descriptor); - return true; - }, - deleteProperty(target, methodName) { - delete target.cache[methodName]; - return true; - }, - ownKeys({ scope }) { - return [...endpointMethodsMap.get(scope).keys()]; - }, - set(target, methodName, value) { - return target.cache[methodName] = value; - }, - get({ octokit, scope, cache }, methodName) { - if (cache[methodName]) { - return cache[methodName]; - } - const method = endpointMethodsMap.get(scope).get(methodName); - if (!method) { - return void 0; - } - const { endpointDefaults, decorations } = method; - if (decorations) { - cache[methodName] = decorate( - octokit, - scope, - methodName, - endpointDefaults, - decorations - ); - } else { - cache[methodName] = octokit.request.defaults(endpointDefaults); - } - return cache[methodName]; - } }; -function endpointsToMethods(octokit) { - const newMethods = {}; - for (const scope of endpointMethodsMap.keys()) { - newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler); - } - return newMethods; -} -function decorate(octokit, scope, methodName, defaults, decorations) { - const requestWithDefaults = octokit.request.defaults(defaults); - function withDecorations(...args) { - let options = requestWithDefaults.endpoint.merge(...args); - if (decorations.mapToData) { - options = Object.assign({}, options, { - data: options[decorations.mapToData], - [decorations.mapToData]: void 0 - }); - return requestWithDefaults(options); - } - if (decorations.renamed) { - const [newScope, newMethodName] = decorations.renamed; - octokit.log.warn( - `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()` - ); - } - if (decorations.deprecated) { - octokit.log.warn(decorations.deprecated); +exports.getRegionInfo = getRegionInfo; + + +/***/ }), + +/***/ 1487: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getResolvedHostname = void 0; +const getResolvedHostname = (resolvedRegion, { regionHostname, partitionHostname }) => regionHostname + ? regionHostname + : partitionHostname + ? partitionHostname.replace("{region}", resolvedRegion) + : undefined; +exports.getResolvedHostname = getResolvedHostname; + + +/***/ }), + +/***/ 44441: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getResolvedPartition = void 0; +const getResolvedPartition = (region, { partitionHash }) => { var _a; return (_a = Object.keys(partitionHash || {}).find((key) => partitionHash[key].regions.includes(region))) !== null && _a !== void 0 ? _a : "aws"; }; +exports.getResolvedPartition = getResolvedPartition; + + +/***/ }), + +/***/ 92281: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getResolvedSigningRegion = void 0; +const getResolvedSigningRegion = (hostname, { signingRegion, regionRegex, useFipsEndpoint }) => { + if (signingRegion) { + return signingRegion; } - if (decorations.renamedParameters) { - const options2 = requestWithDefaults.endpoint.merge(...args); - for (const [name, alias] of Object.entries( - decorations.renamedParameters - )) { - if (name in options2) { - octokit.log.warn( - `"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead` - ); - if (!(alias in options2)) { - options2[alias] = options2[name]; - } - delete options2[name]; + else if (useFipsEndpoint) { + const regionRegexJs = regionRegex.replace("\\\\", "\\").replace(/^\^/g, "\\.").replace(/\$$/g, "\\."); + const regionRegexmatchArray = hostname.match(regionRegexJs); + if (regionRegexmatchArray) { + return regionRegexmatchArray[0].slice(1, -1); } - } - return requestWithDefaults(options2); } - return requestWithDefaults(...args); - } - return Object.assign(withDecorations, requestWithDefaults); -} +}; +exports.getResolvedSigningRegion = getResolvedSigningRegion; -// pkg/dist-src/index.js -function restEndpointMethods(octokit) { - const api = endpointsToMethods(octokit); - return { - rest: api - }; -} -restEndpointMethods.VERSION = VERSION; -function legacyRestEndpointMethods(octokit) { - const api = endpointsToMethods(octokit); - return { - ...api, - rest: api - }; -} -legacyRestEndpointMethods.VERSION = VERSION; -// Annotate the CommonJS export names for ESM import in node: -0 && (0); + +/***/ }), + +/***/ 86985: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(19814), exports); +tslib_1.__exportStar(__nccwpck_require__(14832), exports); +tslib_1.__exportStar(__nccwpck_require__(77792), exports); /***/ }), -/***/ 10537: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ 18044: +/***/ ((__unused_webpack_module, exports) => { "use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Endpoint = void 0; +var Endpoint; +(function (Endpoint) { + Endpoint["IPv4"] = "http://169.254.169.254"; + Endpoint["IPv6"] = "http://[fd00:ec2::254]"; +})(Endpoint = exports.Endpoint || (exports.Endpoint = {})); + + +/***/ }), + +/***/ 57342: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ENDPOINT_CONFIG_OPTIONS = exports.CONFIG_ENDPOINT_NAME = exports.ENV_ENDPOINT_NAME = void 0; +exports.ENV_ENDPOINT_NAME = "AWS_EC2_METADATA_SERVICE_ENDPOINT"; +exports.CONFIG_ENDPOINT_NAME = "ec2_metadata_service_endpoint"; +exports.ENDPOINT_CONFIG_OPTIONS = { + environmentVariableSelector: (env) => env[exports.ENV_ENDPOINT_NAME], + configFileSelector: (profile) => profile[exports.CONFIG_ENDPOINT_NAME], + default: undefined, }; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; + + +/***/ }), + +/***/ 80991: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.EndpointMode = void 0; +var EndpointMode; +(function (EndpointMode) { + EndpointMode["IPv4"] = "IPv4"; + EndpointMode["IPv6"] = "IPv6"; +})(EndpointMode = exports.EndpointMode || (exports.EndpointMode = {})); + + +/***/ }), + +/***/ 88337: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ENDPOINT_MODE_CONFIG_OPTIONS = exports.CONFIG_ENDPOINT_MODE_NAME = exports.ENV_ENDPOINT_MODE_NAME = void 0; +const EndpointMode_1 = __nccwpck_require__(80991); +exports.ENV_ENDPOINT_MODE_NAME = "AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE"; +exports.CONFIG_ENDPOINT_MODE_NAME = "ec2_metadata_service_endpoint_mode"; +exports.ENDPOINT_MODE_CONFIG_OPTIONS = { + environmentVariableSelector: (env) => env[exports.ENV_ENDPOINT_MODE_NAME], + configFileSelector: (profile) => profile[exports.CONFIG_ENDPOINT_MODE_NAME], + default: EndpointMode_1.EndpointMode.IPv4, }; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -// pkg/dist-src/index.js -var dist_src_exports = {}; -__export(dist_src_exports, { - RequestError: () => RequestError -}); -module.exports = __toCommonJS(dist_src_exports); -var import_deprecation = __nccwpck_require__(58932); -var import_once = __toESM(__nccwpck_require__(1223)); -var logOnceCode = (0, import_once.default)((deprecation) => console.warn(deprecation)); -var logOnceHeaders = (0, import_once.default)((deprecation) => console.warn(deprecation)); -var RequestError = class extends Error { - constructor(message, statusCode, options) { - super(message); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); + +/***/ }), + +/***/ 58232: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.InstanceMetadataV1FallbackError = void 0; +const property_provider_1 = __nccwpck_require__(79721); +class InstanceMetadataV1FallbackError extends property_provider_1.CredentialsProviderError { + constructor(message, tryNextLink = true) { + super(message, tryNextLink); + this.tryNextLink = tryNextLink; + this.name = "InstanceMetadataV1FallbackError"; + Object.setPrototypeOf(this, InstanceMetadataV1FallbackError.prototype); } - this.name = "HttpError"; - this.status = statusCode; - let headers; - if ("headers" in options && typeof options.headers !== "undefined") { - headers = options.headers; +} +exports.InstanceMetadataV1FallbackError = InstanceMetadataV1FallbackError; + + +/***/ }), + +/***/ 89227: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fromContainerMetadata = exports.ENV_CMDS_AUTH_TOKEN = exports.ENV_CMDS_RELATIVE_URI = exports.ENV_CMDS_FULL_URI = void 0; +const property_provider_1 = __nccwpck_require__(79721); +const url_1 = __nccwpck_require__(57310); +const httpRequest_1 = __nccwpck_require__(32199); +const ImdsCredentials_1 = __nccwpck_require__(6894); +const RemoteProviderInit_1 = __nccwpck_require__(98533); +const retry_1 = __nccwpck_require__(91351); +exports.ENV_CMDS_FULL_URI = "AWS_CONTAINER_CREDENTIALS_FULL_URI"; +exports.ENV_CMDS_RELATIVE_URI = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"; +exports.ENV_CMDS_AUTH_TOKEN = "AWS_CONTAINER_AUTHORIZATION_TOKEN"; +const fromContainerMetadata = (init = {}) => { + const { timeout, maxRetries } = (0, RemoteProviderInit_1.providerConfigFromInit)(init); + return () => (0, retry_1.retry)(async () => { + const requestOptions = await getCmdsUri(); + const credsResponse = JSON.parse(await requestFromEcsImds(timeout, requestOptions)); + if (!(0, ImdsCredentials_1.isImdsCredentials)(credsResponse)) { + throw new property_provider_1.CredentialsProviderError("Invalid response received from instance metadata service."); + } + return (0, ImdsCredentials_1.fromImdsCredentials)(credsResponse); + }, maxRetries); +}; +exports.fromContainerMetadata = fromContainerMetadata; +const requestFromEcsImds = async (timeout, options) => { + if (process.env[exports.ENV_CMDS_AUTH_TOKEN]) { + options.headers = { + ...options.headers, + Authorization: process.env[exports.ENV_CMDS_AUTH_TOKEN], + }; } - if ("response" in options) { - this.response = options.response; - headers = options.response.headers; + const buffer = await (0, httpRequest_1.httpRequest)({ + ...options, + timeout, + }); + return buffer.toString(); +}; +const CMDS_IP = "169.254.170.2"; +const GREENGRASS_HOSTS = { + localhost: true, + "127.0.0.1": true, +}; +const GREENGRASS_PROTOCOLS = { + "http:": true, + "https:": true, +}; +const getCmdsUri = async () => { + if (process.env[exports.ENV_CMDS_RELATIVE_URI]) { + return { + hostname: CMDS_IP, + path: process.env[exports.ENV_CMDS_RELATIVE_URI], + }; } - const requestCopy = Object.assign({}, options.request); - if (options.request.headers.authorization) { - requestCopy.headers = Object.assign({}, options.request.headers, { - authorization: options.request.headers.authorization.replace( - / .*$/, - " [REDACTED]" - ) - }); + if (process.env[exports.ENV_CMDS_FULL_URI]) { + const parsed = (0, url_1.parse)(process.env[exports.ENV_CMDS_FULL_URI]); + if (!parsed.hostname || !(parsed.hostname in GREENGRASS_HOSTS)) { + throw new property_provider_1.CredentialsProviderError(`${parsed.hostname} is not a valid container metadata service hostname`, false); + } + if (!parsed.protocol || !(parsed.protocol in GREENGRASS_PROTOCOLS)) { + throw new property_provider_1.CredentialsProviderError(`${parsed.protocol} is not a valid container metadata service protocol`, false); + } + return { + ...parsed, + port: parsed.port ? parseInt(parsed.port, 10) : undefined, + }; } - requestCopy.url = requestCopy.url.replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]").replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); - this.request = requestCopy; - Object.defineProperty(this, "code", { - get() { - logOnceCode( - new import_deprecation.Deprecation( - "[@octokit/request-error] `error.code` is deprecated, use `error.status`." - ) - ); - return statusCode; - } - }); - Object.defineProperty(this, "headers", { - get() { - logOnceHeaders( - new import_deprecation.Deprecation( - "[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`." - ) - ); - return headers || {}; - } - }); - } + throw new property_provider_1.CredentialsProviderError("The container metadata credential provider cannot be used unless" + + ` the ${exports.ENV_CMDS_RELATIVE_URI} or ${exports.ENV_CMDS_FULL_URI} environment` + + " variable is set", false); }; -// Annotate the CommonJS export names for ESM import in node: -0 && (0); /***/ }), -/***/ 36234: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ 52207: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// pkg/dist-src/index.js -var dist_src_exports = {}; -__export(dist_src_exports, { - request: () => request -}); -module.exports = __toCommonJS(dist_src_exports); -var import_endpoint = __nccwpck_require__(59440); -var import_universal_user_agent = __nccwpck_require__(45030); - -// pkg/dist-src/version.js -var VERSION = "8.1.4"; - -// pkg/dist-src/fetch-wrapper.js -var import_is_plain_object = __nccwpck_require__(63287); -var import_request_error = __nccwpck_require__(10537); - -// pkg/dist-src/get-buffer-response.js -function getBufferResponse(response) { - return response.arrayBuffer(); -} - -// pkg/dist-src/fetch-wrapper.js -function fetchWrapper(requestOptions) { - var _a, _b, _c; - const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console; - const parseSuccessResponseBody = ((_a = requestOptions.request) == null ? void 0 : _a.parseSuccessResponseBody) !== false; - if ((0, import_is_plain_object.isPlainObject)(requestOptions.body) || Array.isArray(requestOptions.body)) { - requestOptions.body = JSON.stringify(requestOptions.body); - } - let headers = {}; - let status; - let url; - let { fetch } = globalThis; - if ((_b = requestOptions.request) == null ? void 0 : _b.fetch) { - fetch = requestOptions.request.fetch; - } - if (!fetch) { - throw new Error( - "fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing" - ); - } - return fetch(requestOptions.url, { - method: requestOptions.method, - body: requestOptions.body, - headers: requestOptions.headers, - signal: (_c = requestOptions.request) == null ? void 0 : _c.signal, - // duplex must be set if request.body is ReadableStream or Async Iterables. - // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex. - ...requestOptions.body && { duplex: "half" } - }).then(async (response) => { - url = response.url; - status = response.status; - for (const keyAndValue of response.headers) { - headers[keyAndValue[0]] = keyAndValue[1]; - } - if ("deprecation" in headers) { - const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/); - const deprecationLink = matches && matches.pop(); - log.warn( - `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}` - ); - } - if (status === 204 || status === 205) { - return; - } - if (requestOptions.method === "HEAD") { - if (status < 400) { - return; - } - throw new import_request_error.RequestError(response.statusText, status, { - response: { - url, - status, - headers, - data: void 0 - }, - request: requestOptions - }); - } - if (status === 304) { - throw new import_request_error.RequestError("Not modified", status, { - response: { - url, - status, - headers, - data: await getResponseData(response) - }, - request: requestOptions - }); - } - if (status >= 400) { - const data = await getResponseData(response); - const error = new import_request_error.RequestError(toErrorMessage(data), status, { - response: { - url, - status, - headers, - data - }, - request: requestOptions - }); - throw error; - } - return parseSuccessResponseBody ? await getResponseData(response) : response.body; - }).then((data) => { - return { - status, - url, - headers, - data +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fromInstanceMetadata = void 0; +const node_config_provider_1 = __nccwpck_require__(33461); +const property_provider_1 = __nccwpck_require__(79721); +const InstanceMetadataV1FallbackError_1 = __nccwpck_require__(58232); +const httpRequest_1 = __nccwpck_require__(32199); +const ImdsCredentials_1 = __nccwpck_require__(6894); +const RemoteProviderInit_1 = __nccwpck_require__(98533); +const retry_1 = __nccwpck_require__(91351); +const getInstanceMetadataEndpoint_1 = __nccwpck_require__(92460); +const staticStabilityProvider_1 = __nccwpck_require__(74035); +const IMDS_PATH = "/latest/meta-data/iam/security-credentials/"; +const IMDS_TOKEN_PATH = "/latest/api/token"; +const AWS_EC2_METADATA_V1_DISABLED = "AWS_EC2_METADATA_V1_DISABLED"; +const PROFILE_AWS_EC2_METADATA_V1_DISABLED = "ec2_metadata_v1_disabled"; +const X_AWS_EC2_METADATA_TOKEN = "x-aws-ec2-metadata-token"; +const fromInstanceMetadata = (init = {}) => (0, staticStabilityProvider_1.staticStabilityProvider)(getInstanceImdsProvider(init), { logger: init.logger }); +exports.fromInstanceMetadata = fromInstanceMetadata; +const getInstanceImdsProvider = (init) => { + let disableFetchToken = false; + const { logger, profile } = init; + const { timeout, maxRetries } = (0, RemoteProviderInit_1.providerConfigFromInit)(init); + const getCredentials = async (maxRetries, options) => { + var _a; + const isImdsV1Fallback = disableFetchToken || ((_a = options.headers) === null || _a === void 0 ? void 0 : _a[X_AWS_EC2_METADATA_TOKEN]) == null; + if (isImdsV1Fallback) { + let fallbackBlockedFromProfile = false; + let fallbackBlockedFromProcessEnv = false; + const configValue = await (0, node_config_provider_1.loadConfig)({ + environmentVariableSelector: (env) => { + const envValue = env[AWS_EC2_METADATA_V1_DISABLED]; + fallbackBlockedFromProcessEnv = !!envValue && envValue !== "false"; + if (envValue === undefined) { + throw new property_provider_1.CredentialsProviderError(`${AWS_EC2_METADATA_V1_DISABLED} not set in env, checking config file next.`); + } + return fallbackBlockedFromProcessEnv; + }, + configFileSelector: (profile) => { + const profileValue = profile[PROFILE_AWS_EC2_METADATA_V1_DISABLED]; + fallbackBlockedFromProfile = !!profileValue && profileValue !== "false"; + return fallbackBlockedFromProfile; + }, + default: false, + }, { + profile, + })(); + if (init.ec2MetadataV1Disabled || configValue) { + const causes = []; + if (init.ec2MetadataV1Disabled) + causes.push("credential provider initialization (runtime option ec2MetadataV1Disabled)"); + if (fallbackBlockedFromProfile) + causes.push(`config file profile (${PROFILE_AWS_EC2_METADATA_V1_DISABLED})`); + if (fallbackBlockedFromProcessEnv) + causes.push(`process environment variable (${AWS_EC2_METADATA_V1_DISABLED})`); + throw new InstanceMetadataV1FallbackError_1.InstanceMetadataV1FallbackError(`AWS EC2 Metadata v1 fallback has been blocked by AWS SDK configuration in the following: [${causes.join(", ")}].`); + } + } + const imdsProfile = (await (0, retry_1.retry)(async () => { + let profile; + try { + profile = await getProfile(options); + } + catch (err) { + if (err.statusCode === 401) { + disableFetchToken = false; + } + throw err; + } + return profile; + }, maxRetries)).trim(); + return (0, retry_1.retry)(async () => { + let creds; + try { + creds = await getCredentialsFromProfile(imdsProfile, options); + } + catch (err) { + if (err.statusCode === 401) { + disableFetchToken = false; + } + throw err; + } + return creds; + }, maxRetries); }; - }).catch((error) => { - if (error instanceof import_request_error.RequestError) - throw error; - else if (error.name === "AbortError") - throw error; - let message = error.message; - if (error.name === "TypeError" && "cause" in error) { - if (error.cause instanceof Error) { - message = error.cause.message; - } else if (typeof error.cause === "string") { - message = error.cause; - } - } - throw new import_request_error.RequestError(message, 500, { - request: requestOptions - }); - }); -} -async function getResponseData(response) { - const contentType = response.headers.get("content-type"); - if (/application\/json/.test(contentType)) { - return response.json(); - } - if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { - return response.text(); - } - return getBufferResponse(response); -} -function toErrorMessage(data) { - if (typeof data === "string") - return data; - if ("message" in data) { - if (Array.isArray(data.errors)) { - return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; - } - return data.message; - } - return `Unknown error: ${JSON.stringify(data)}`; -} - -// pkg/dist-src/with-defaults.js -function withDefaults(oldEndpoint, newDefaults) { - const endpoint2 = oldEndpoint.defaults(newDefaults); - const newApi = function(route, parameters) { - const endpointOptions = endpoint2.merge(route, parameters); - if (!endpointOptions.request || !endpointOptions.request.hook) { - return fetchWrapper(endpoint2.parse(endpointOptions)); - } - const request2 = (route2, parameters2) => { - return fetchWrapper( - endpoint2.parse(endpoint2.merge(route2, parameters2)) - ); + return async () => { + const endpoint = await (0, getInstanceMetadataEndpoint_1.getInstanceMetadataEndpoint)(); + if (disableFetchToken) { + logger === null || logger === void 0 ? void 0 : logger.debug("AWS SDK Instance Metadata", "using v1 fallback (no token fetch)"); + return getCredentials(maxRetries, { ...endpoint, timeout }); + } + else { + let token; + try { + token = (await getMetadataToken({ ...endpoint, timeout })).toString(); + } + catch (error) { + if ((error === null || error === void 0 ? void 0 : error.statusCode) === 400) { + throw Object.assign(error, { + message: "EC2 Metadata token request returned error", + }); + } + else if (error.message === "TimeoutError" || [403, 404, 405].includes(error.statusCode)) { + disableFetchToken = true; + } + logger === null || logger === void 0 ? void 0 : logger.debug("AWS SDK Instance Metadata", "using v1 fallback (initial)"); + return getCredentials(maxRetries, { ...endpoint, timeout }); + } + return getCredentials(maxRetries, { + ...endpoint, + headers: { + [X_AWS_EC2_METADATA_TOKEN]: token, + }, + timeout, + }); + } }; - Object.assign(request2, { - endpoint: endpoint2, - defaults: withDefaults.bind(null, endpoint2) - }); - return endpointOptions.request.hook(request2, endpointOptions); - }; - return Object.assign(newApi, { - endpoint: endpoint2, - defaults: withDefaults.bind(null, endpoint2) - }); -} - -// pkg/dist-src/index.js -var request = withDefaults(import_endpoint.endpoint, { - headers: { - "user-agent": `octokit-request.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}` - } +}; +const getMetadataToken = async (options) => (0, httpRequest_1.httpRequest)({ + ...options, + path: IMDS_TOKEN_PATH, + method: "PUT", + headers: { + "x-aws-ec2-metadata-token-ttl-seconds": "21600", + }, }); -// Annotate the CommonJS export names for ESM import in node: -0 && (0); +const getProfile = async (options) => (await (0, httpRequest_1.httpRequest)({ ...options, path: IMDS_PATH })).toString(); +const getCredentialsFromProfile = async (profile, options) => { + const credsResponse = JSON.parse((await (0, httpRequest_1.httpRequest)({ + ...options, + path: IMDS_PATH + profile, + })).toString()); + if (!(0, ImdsCredentials_1.isImdsCredentials)(credsResponse)) { + throw new property_provider_1.CredentialsProviderError("Invalid response received from instance metadata service."); + } + return (0, ImdsCredentials_1.fromImdsCredentials)(credsResponse); +}; /***/ }), -/***/ 43779: +/***/ 7477: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = exports.DEFAULT_USE_DUALSTACK_ENDPOINT = exports.CONFIG_USE_DUALSTACK_ENDPOINT = exports.ENV_USE_DUALSTACK_ENDPOINT = void 0; -const util_config_provider_1 = __nccwpck_require__(83375); -exports.ENV_USE_DUALSTACK_ENDPOINT = "AWS_USE_DUALSTACK_ENDPOINT"; -exports.CONFIG_USE_DUALSTACK_ENDPOINT = "use_dualstack_endpoint"; -exports.DEFAULT_USE_DUALSTACK_ENDPOINT = false; -exports.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = { - environmentVariableSelector: (env) => (0, util_config_provider_1.booleanSelector)(env, exports.ENV_USE_DUALSTACK_ENDPOINT, util_config_provider_1.SelectorType.ENV), - configFileSelector: (profile) => (0, util_config_provider_1.booleanSelector)(profile, exports.CONFIG_USE_DUALSTACK_ENDPOINT, util_config_provider_1.SelectorType.CONFIG), - default: false, -}; +exports.getInstanceMetadataEndpoint = exports.httpRequest = void 0; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(89227), exports); +tslib_1.__exportStar(__nccwpck_require__(52207), exports); +tslib_1.__exportStar(__nccwpck_require__(98533), exports); +tslib_1.__exportStar(__nccwpck_require__(45036), exports); +var httpRequest_1 = __nccwpck_require__(32199); +Object.defineProperty(exports, "httpRequest", ({ enumerable: true, get: function () { return httpRequest_1.httpRequest; } })); +var getInstanceMetadataEndpoint_1 = __nccwpck_require__(92460); +Object.defineProperty(exports, "getInstanceMetadataEndpoint", ({ enumerable: true, get: function () { return getInstanceMetadataEndpoint_1.getInstanceMetadataEndpoint; } })); /***/ }), -/***/ 17994: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 6894: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = exports.DEFAULT_USE_FIPS_ENDPOINT = exports.CONFIG_USE_FIPS_ENDPOINT = exports.ENV_USE_FIPS_ENDPOINT = void 0; -const util_config_provider_1 = __nccwpck_require__(83375); -exports.ENV_USE_FIPS_ENDPOINT = "AWS_USE_FIPS_ENDPOINT"; -exports.CONFIG_USE_FIPS_ENDPOINT = "use_fips_endpoint"; -exports.DEFAULT_USE_FIPS_ENDPOINT = false; -exports.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = { - environmentVariableSelector: (env) => (0, util_config_provider_1.booleanSelector)(env, exports.ENV_USE_FIPS_ENDPOINT, util_config_provider_1.SelectorType.ENV), - configFileSelector: (profile) => (0, util_config_provider_1.booleanSelector)(profile, exports.CONFIG_USE_FIPS_ENDPOINT, util_config_provider_1.SelectorType.CONFIG), - default: false, -}; +exports.fromImdsCredentials = exports.isImdsCredentials = void 0; +const isImdsCredentials = (arg) => Boolean(arg) && + typeof arg === "object" && + typeof arg.AccessKeyId === "string" && + typeof arg.SecretAccessKey === "string" && + typeof arg.Token === "string" && + typeof arg.Expiration === "string"; +exports.isImdsCredentials = isImdsCredentials; +const fromImdsCredentials = (creds) => ({ + accessKeyId: creds.AccessKeyId, + secretAccessKey: creds.SecretAccessKey, + sessionToken: creds.Token, + expiration: new Date(creds.Expiration), +}); +exports.fromImdsCredentials = fromImdsCredentials; /***/ }), -/***/ 18421: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 98533: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(43779), exports); -tslib_1.__exportStar(__nccwpck_require__(17994), exports); -tslib_1.__exportStar(__nccwpck_require__(37432), exports); -tslib_1.__exportStar(__nccwpck_require__(61892), exports); +exports.providerConfigFromInit = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_TIMEOUT = void 0; +exports.DEFAULT_TIMEOUT = 1000; +exports.DEFAULT_MAX_RETRIES = 0; +const providerConfigFromInit = ({ maxRetries = exports.DEFAULT_MAX_RETRIES, timeout = exports.DEFAULT_TIMEOUT, }) => ({ maxRetries, timeout }); +exports.providerConfigFromInit = providerConfigFromInit; /***/ }), -/***/ 37432: +/***/ 32199: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveCustomEndpointsConfig = void 0; -const util_middleware_1 = __nccwpck_require__(2390); -const resolveCustomEndpointsConfig = (input) => { - var _a, _b; - const { endpoint, urlParser } = input; - return { - ...input, - tls: (_a = input.tls) !== null && _a !== void 0 ? _a : true, - endpoint: (0, util_middleware_1.normalizeProvider)(typeof endpoint === "string" ? urlParser(endpoint) : endpoint), - isCustomEndpoint: true, - useDualstackEndpoint: (0, util_middleware_1.normalizeProvider)((_b = input.useDualstackEndpoint) !== null && _b !== void 0 ? _b : false), - }; -}; -exports.resolveCustomEndpointsConfig = resolveCustomEndpointsConfig; +exports.httpRequest = void 0; +const property_provider_1 = __nccwpck_require__(79721); +const buffer_1 = __nccwpck_require__(14300); +const http_1 = __nccwpck_require__(13685); +function httpRequest(options) { + return new Promise((resolve, reject) => { + var _a; + const req = (0, http_1.request)({ + method: "GET", + ...options, + hostname: (_a = options.hostname) === null || _a === void 0 ? void 0 : _a.replace(/^\[(.+)\]$/, "$1"), + }); + req.on("error", (err) => { + reject(Object.assign(new property_provider_1.ProviderError("Unable to connect to instance metadata service"), err)); + req.destroy(); + }); + req.on("timeout", () => { + reject(new property_provider_1.ProviderError("TimeoutError from instance metadata service")); + req.destroy(); + }); + req.on("response", (res) => { + const { statusCode = 400 } = res; + if (statusCode < 200 || 300 <= statusCode) { + reject(Object.assign(new property_provider_1.ProviderError("Error response received from instance metadata service"), { statusCode })); + req.destroy(); + } + const chunks = []; + res.on("data", (chunk) => { + chunks.push(chunk); + }); + res.on("end", () => { + resolve(buffer_1.Buffer.concat(chunks)); + req.destroy(); + }); + }); + req.end(); + }); +} +exports.httpRequest = httpRequest; /***/ }), -/***/ 61892: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 91351: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveEndpointsConfig = void 0; -const util_middleware_1 = __nccwpck_require__(2390); -const getEndpointFromRegion_1 = __nccwpck_require__(48570); -const resolveEndpointsConfig = (input) => { - var _a, _b; - const useDualstackEndpoint = (0, util_middleware_1.normalizeProvider)((_a = input.useDualstackEndpoint) !== null && _a !== void 0 ? _a : false); - const { endpoint, useFipsEndpoint, urlParser } = input; - return { - ...input, - tls: (_b = input.tls) !== null && _b !== void 0 ? _b : true, - endpoint: endpoint - ? (0, util_middleware_1.normalizeProvider)(typeof endpoint === "string" ? urlParser(endpoint) : endpoint) - : () => (0, getEndpointFromRegion_1.getEndpointFromRegion)({ ...input, useDualstackEndpoint, useFipsEndpoint }), - isCustomEndpoint: !!endpoint, - useDualstackEndpoint, - }; +exports.retry = void 0; +const retry = (toRetry, maxRetries) => { + let promise = toRetry(); + for (let i = 0; i < maxRetries; i++) { + promise = promise.catch(toRetry); + } + return promise; }; -exports.resolveEndpointsConfig = resolveEndpointsConfig; +exports.retry = retry; /***/ }), -/***/ 48570: +/***/ 45036: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getEndpointFromRegion = void 0; -const getEndpointFromRegion = async (input) => { - var _a; - const { tls = true } = input; - const region = await input.region(); - const dnsHostRegex = new RegExp(/^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$/); - if (!dnsHostRegex.test(region)) { - throw new Error("Invalid region in client config"); - } - const useDualstackEndpoint = await input.useDualstackEndpoint(); - const useFipsEndpoint = await input.useFipsEndpoint(); - const { hostname } = (_a = (await input.regionInfoProvider(region, { useDualstackEndpoint, useFipsEndpoint }))) !== null && _a !== void 0 ? _a : {}; - if (!hostname) { - throw new Error("Cannot resolve hostname from client config"); - } - return input.urlParser(`${tls ? "https:" : "http:"}//${hostname}`); -}; -exports.getEndpointFromRegion = getEndpointFromRegion; /***/ }), -/***/ 53098: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 22666: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(18421), exports); -tslib_1.__exportStar(__nccwpck_require__(221), exports); -tslib_1.__exportStar(__nccwpck_require__(86985), exports); +exports.getExtendedInstanceMetadataCredentials = void 0; +const STATIC_STABILITY_REFRESH_INTERVAL_SECONDS = 5 * 60; +const STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS = 5 * 60; +const STATIC_STABILITY_DOC_URL = "https://docs.aws.amazon.com/sdkref/latest/guide/feature-static-credentials.html"; +const getExtendedInstanceMetadataCredentials = (credentials, logger) => { + var _a; + const refreshInterval = STATIC_STABILITY_REFRESH_INTERVAL_SECONDS + + Math.floor(Math.random() * STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS); + const newExpiration = new Date(Date.now() + refreshInterval * 1000); + logger.warn("Attempting credential expiration extension due to a credential service availability issue. A refresh of these " + + "credentials will be attempted after ${new Date(newExpiration)}.\nFor more information, please visit: " + + STATIC_STABILITY_DOC_URL); + const originalExpiration = (_a = credentials.originalExpiration) !== null && _a !== void 0 ? _a : credentials.expiration; + return { + ...credentials, + ...(originalExpiration ? { originalExpiration } : {}), + expiration: newExpiration, + }; +}; +exports.getExtendedInstanceMetadataCredentials = getExtendedInstanceMetadataCredentials; /***/ }), -/***/ 33898: -/***/ ((__unused_webpack_module, exports) => { +/***/ 92460: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NODE_REGION_CONFIG_FILE_OPTIONS = exports.NODE_REGION_CONFIG_OPTIONS = exports.REGION_INI_NAME = exports.REGION_ENV_NAME = void 0; -exports.REGION_ENV_NAME = "AWS_REGION"; -exports.REGION_INI_NAME = "region"; -exports.NODE_REGION_CONFIG_OPTIONS = { - environmentVariableSelector: (env) => env[exports.REGION_ENV_NAME], - configFileSelector: (profile) => profile[exports.REGION_INI_NAME], - default: () => { - throw new Error("Region is missing"); - }, -}; -exports.NODE_REGION_CONFIG_FILE_OPTIONS = { - preferredFile: "credentials", +exports.getInstanceMetadataEndpoint = void 0; +const node_config_provider_1 = __nccwpck_require__(33461); +const url_parser_1 = __nccwpck_require__(14681); +const Endpoint_1 = __nccwpck_require__(18044); +const EndpointConfigOptions_1 = __nccwpck_require__(57342); +const EndpointMode_1 = __nccwpck_require__(80991); +const EndpointModeConfigOptions_1 = __nccwpck_require__(88337); +const getInstanceMetadataEndpoint = async () => (0, url_parser_1.parseUrl)((await getFromEndpointConfig()) || (await getFromEndpointModeConfig())); +exports.getInstanceMetadataEndpoint = getInstanceMetadataEndpoint; +const getFromEndpointConfig = async () => (0, node_config_provider_1.loadConfig)(EndpointConfigOptions_1.ENDPOINT_CONFIG_OPTIONS)(); +const getFromEndpointModeConfig = async () => { + const endpointMode = await (0, node_config_provider_1.loadConfig)(EndpointModeConfigOptions_1.ENDPOINT_MODE_CONFIG_OPTIONS)(); + switch (endpointMode) { + case EndpointMode_1.EndpointMode.IPv4: + return Endpoint_1.Endpoint.IPv4; + case EndpointMode_1.EndpointMode.IPv6: + return Endpoint_1.Endpoint.IPv6; + default: + throw new Error(`Unsupported endpoint mode: ${endpointMode}.` + ` Select from ${Object.values(EndpointMode_1.EndpointMode)}`); + } }; /***/ }), -/***/ 49506: +/***/ 74035: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getRealRegion = void 0; -const isFipsRegion_1 = __nccwpck_require__(43870); -const getRealRegion = (region) => (0, isFipsRegion_1.isFipsRegion)(region) - ? ["fips-aws-global", "aws-fips"].includes(region) - ? "us-east-1" - : region.replace(/fips-(dkr-|prod-)?|-fips/, "") - : region; -exports.getRealRegion = getRealRegion; +exports.staticStabilityProvider = void 0; +const getExtendedInstanceMetadataCredentials_1 = __nccwpck_require__(22666); +const staticStabilityProvider = (provider, options = {}) => { + const logger = (options === null || options === void 0 ? void 0 : options.logger) || console; + let pastCredentials; + return async () => { + let credentials; + try { + credentials = await provider(); + if (credentials.expiration && credentials.expiration.getTime() < Date.now()) { + credentials = (0, getExtendedInstanceMetadataCredentials_1.getExtendedInstanceMetadataCredentials)(credentials, logger); + } + } + catch (e) { + if (pastCredentials) { + logger.warn("Credential renew failed: ", e); + credentials = (0, getExtendedInstanceMetadataCredentials_1.getExtendedInstanceMetadataCredentials)(pastCredentials, logger); + } + else { + throw e; + } + } + pastCredentials = credentials; + return credentials; + }; +}; +exports.staticStabilityProvider = staticStabilityProvider; /***/ }), -/***/ 221: +/***/ 11014: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(33898), exports); -tslib_1.__exportStar(__nccwpck_require__(87065), exports); +exports.EventStreamCodec = void 0; +const crc32_1 = __nccwpck_require__(47327); +const HeaderMarshaller_1 = __nccwpck_require__(74712); +const splitMessage_1 = __nccwpck_require__(20597); +class EventStreamCodec { + constructor(toUtf8, fromUtf8) { + this.headerMarshaller = new HeaderMarshaller_1.HeaderMarshaller(toUtf8, fromUtf8); + this.messageBuffer = []; + this.isEndOfStream = false; + } + feed(message) { + this.messageBuffer.push(this.decode(message)); + } + endOfStream() { + this.isEndOfStream = true; + } + getMessage() { + const message = this.messageBuffer.pop(); + const isEndOfStream = this.isEndOfStream; + return { + getMessage() { + return message; + }, + isEndOfStream() { + return isEndOfStream; + }, + }; + } + getAvailableMessages() { + const messages = this.messageBuffer; + this.messageBuffer = []; + const isEndOfStream = this.isEndOfStream; + return { + getMessages() { + return messages; + }, + isEndOfStream() { + return isEndOfStream; + }, + }; + } + encode({ headers: rawHeaders, body }) { + const headers = this.headerMarshaller.format(rawHeaders); + const length = headers.byteLength + body.byteLength + 16; + const out = new Uint8Array(length); + const view = new DataView(out.buffer, out.byteOffset, out.byteLength); + const checksum = new crc32_1.Crc32(); + view.setUint32(0, length, false); + view.setUint32(4, headers.byteLength, false); + view.setUint32(8, checksum.update(out.subarray(0, 8)).digest(), false); + out.set(headers, 12); + out.set(body, headers.byteLength + 12); + view.setUint32(length - 4, checksum.update(out.subarray(8, length - 4)).digest(), false); + return out; + } + decode(message) { + const { headers, body } = (0, splitMessage_1.splitMessage)(message); + return { headers: this.headerMarshaller.parse(headers), body }; + } + formatHeaders(rawHeaders) { + return this.headerMarshaller.format(rawHeaders); + } +} +exports.EventStreamCodec = EventStreamCodec; /***/ }), -/***/ 43870: -/***/ ((__unused_webpack_module, exports) => { +/***/ 74712: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isFipsRegion = void 0; -const isFipsRegion = (region) => typeof region === "string" && (region.startsWith("fips-") || region.endsWith("-fips")); -exports.isFipsRegion = isFipsRegion; +exports.HeaderMarshaller = void 0; +const util_hex_encoding_1 = __nccwpck_require__(45364); +const Int64_1 = __nccwpck_require__(46086); +class HeaderMarshaller { + constructor(toUtf8, fromUtf8) { + this.toUtf8 = toUtf8; + this.fromUtf8 = fromUtf8; + } + format(headers) { + const chunks = []; + for (const headerName of Object.keys(headers)) { + const bytes = this.fromUtf8(headerName); + chunks.push(Uint8Array.from([bytes.byteLength]), bytes, this.formatHeaderValue(headers[headerName])); + } + const out = new Uint8Array(chunks.reduce((carry, bytes) => carry + bytes.byteLength, 0)); + let position = 0; + for (const chunk of chunks) { + out.set(chunk, position); + position += chunk.byteLength; + } + return out; + } + formatHeaderValue(header) { + switch (header.type) { + case "boolean": + return Uint8Array.from([header.value ? 0 : 1]); + case "byte": + return Uint8Array.from([2, header.value]); + case "short": + const shortView = new DataView(new ArrayBuffer(3)); + shortView.setUint8(0, 3); + shortView.setInt16(1, header.value, false); + return new Uint8Array(shortView.buffer); + case "integer": + const intView = new DataView(new ArrayBuffer(5)); + intView.setUint8(0, 4); + intView.setInt32(1, header.value, false); + return new Uint8Array(intView.buffer); + case "long": + const longBytes = new Uint8Array(9); + longBytes[0] = 5; + longBytes.set(header.value.bytes, 1); + return longBytes; + case "binary": + const binView = new DataView(new ArrayBuffer(3 + header.value.byteLength)); + binView.setUint8(0, 6); + binView.setUint16(1, header.value.byteLength, false); + const binBytes = new Uint8Array(binView.buffer); + binBytes.set(header.value, 3); + return binBytes; + case "string": + const utf8Bytes = this.fromUtf8(header.value); + const strView = new DataView(new ArrayBuffer(3 + utf8Bytes.byteLength)); + strView.setUint8(0, 7); + strView.setUint16(1, utf8Bytes.byteLength, false); + const strBytes = new Uint8Array(strView.buffer); + strBytes.set(utf8Bytes, 3); + return strBytes; + case "timestamp": + const tsBytes = new Uint8Array(9); + tsBytes[0] = 8; + tsBytes.set(Int64_1.Int64.fromNumber(header.value.valueOf()).bytes, 1); + return tsBytes; + case "uuid": + if (!UUID_PATTERN.test(header.value)) { + throw new Error(`Invalid UUID received: ${header.value}`); + } + const uuidBytes = new Uint8Array(17); + uuidBytes[0] = 9; + uuidBytes.set((0, util_hex_encoding_1.fromHex)(header.value.replace(/\-/g, "")), 1); + return uuidBytes; + } + } + parse(headers) { + const out = {}; + let position = 0; + while (position < headers.byteLength) { + const nameLength = headers.getUint8(position++); + const name = this.toUtf8(new Uint8Array(headers.buffer, headers.byteOffset + position, nameLength)); + position += nameLength; + switch (headers.getUint8(position++)) { + case 0: + out[name] = { + type: BOOLEAN_TAG, + value: true, + }; + break; + case 1: + out[name] = { + type: BOOLEAN_TAG, + value: false, + }; + break; + case 2: + out[name] = { + type: BYTE_TAG, + value: headers.getInt8(position++), + }; + break; + case 3: + out[name] = { + type: SHORT_TAG, + value: headers.getInt16(position, false), + }; + position += 2; + break; + case 4: + out[name] = { + type: INT_TAG, + value: headers.getInt32(position, false), + }; + position += 4; + break; + case 5: + out[name] = { + type: LONG_TAG, + value: new Int64_1.Int64(new Uint8Array(headers.buffer, headers.byteOffset + position, 8)), + }; + position += 8; + break; + case 6: + const binaryLength = headers.getUint16(position, false); + position += 2; + out[name] = { + type: BINARY_TAG, + value: new Uint8Array(headers.buffer, headers.byteOffset + position, binaryLength), + }; + position += binaryLength; + break; + case 7: + const stringLength = headers.getUint16(position, false); + position += 2; + out[name] = { + type: STRING_TAG, + value: this.toUtf8(new Uint8Array(headers.buffer, headers.byteOffset + position, stringLength)), + }; + position += stringLength; + break; + case 8: + out[name] = { + type: TIMESTAMP_TAG, + value: new Date(new Int64_1.Int64(new Uint8Array(headers.buffer, headers.byteOffset + position, 8)).valueOf()), + }; + position += 8; + break; + case 9: + const uuidBytes = new Uint8Array(headers.buffer, headers.byteOffset + position, 16); + position += 16; + out[name] = { + type: UUID_TAG, + value: `${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(0, 4))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(4, 6))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(6, 8))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(8, 10))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(10))}`, + }; + break; + default: + throw new Error(`Unrecognized header type tag`); + } + } + return out; + } +} +exports.HeaderMarshaller = HeaderMarshaller; +var HEADER_VALUE_TYPE; +(function (HEADER_VALUE_TYPE) { + HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["boolTrue"] = 0] = "boolTrue"; + HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["boolFalse"] = 1] = "boolFalse"; + HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["byte"] = 2] = "byte"; + HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["short"] = 3] = "short"; + HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["integer"] = 4] = "integer"; + HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["long"] = 5] = "long"; + HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["byteArray"] = 6] = "byteArray"; + HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["string"] = 7] = "string"; + HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["timestamp"] = 8] = "timestamp"; + HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["uuid"] = 9] = "uuid"; +})(HEADER_VALUE_TYPE || (HEADER_VALUE_TYPE = {})); +const BOOLEAN_TAG = "boolean"; +const BYTE_TAG = "byte"; +const SHORT_TAG = "short"; +const INT_TAG = "integer"; +const LONG_TAG = "long"; +const BINARY_TAG = "binary"; +const STRING_TAG = "string"; +const TIMESTAMP_TAG = "timestamp"; +const UUID_TAG = "uuid"; +const UUID_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/; /***/ }), -/***/ 87065: +/***/ 46086: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveRegionConfig = void 0; -const getRealRegion_1 = __nccwpck_require__(49506); -const isFipsRegion_1 = __nccwpck_require__(43870); -const resolveRegionConfig = (input) => { - const { region, useFipsEndpoint } = input; - if (!region) { - throw new Error("Region is missing"); +exports.Int64 = void 0; +const util_hex_encoding_1 = __nccwpck_require__(45364); +class Int64 { + constructor(bytes) { + this.bytes = bytes; + if (bytes.byteLength !== 8) { + throw new Error("Int64 buffers must be exactly 8 bytes"); + } } - return { - ...input, - region: async () => { - if (typeof region === "string") { - return (0, getRealRegion_1.getRealRegion)(region); - } - const providedRegion = await region(); - return (0, getRealRegion_1.getRealRegion)(providedRegion); - }, - useFipsEndpoint: async () => { - const providedRegion = typeof region === "string" ? region : await region(); - if ((0, isFipsRegion_1.isFipsRegion)(providedRegion)) { - return true; - } - return typeof useFipsEndpoint !== "function" ? Promise.resolve(!!useFipsEndpoint) : useFipsEndpoint(); - }, - }; -}; -exports.resolveRegionConfig = resolveRegionConfig; + static fromNumber(number) { + if (number > 9223372036854776000 || number < -9223372036854776000) { + throw new Error(`${number} is too large (or, if negative, too small) to represent as an Int64`); + } + const bytes = new Uint8Array(8); + for (let i = 7, remaining = Math.abs(Math.round(number)); i > -1 && remaining > 0; i--, remaining /= 256) { + bytes[i] = remaining; + } + if (number < 0) { + negate(bytes); + } + return new Int64(bytes); + } + valueOf() { + const bytes = this.bytes.slice(0); + const negative = bytes[0] & 0b10000000; + if (negative) { + negate(bytes); + } + return parseInt((0, util_hex_encoding_1.toHex)(bytes), 16) * (negative ? -1 : 1); + } + toString() { + return String(this.valueOf()); + } +} +exports.Int64 = Int64; +function negate(bytes) { + for (let i = 0; i < 8; i++) { + bytes[i] ^= 0xff; + } + for (let i = 7; i > -1; i--) { + bytes[i]++; + if (bytes[i] !== 0) + break; + } +} /***/ }), -/***/ 19814: +/***/ 73684: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -44915,5339 +43927,5421 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 14832: +/***/ 57255: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MessageDecoderStream = void 0; +class MessageDecoderStream { + constructor(options) { + this.options = options; + } + [Symbol.asyncIterator]() { + return this.asyncIterator(); + } + async *asyncIterator() { + for await (const bytes of this.options.inputStream) { + const decoded = this.options.decoder.decode(bytes); + yield decoded; + } + } +} +exports.MessageDecoderStream = MessageDecoderStream; /***/ }), -/***/ 99760: +/***/ 52362: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getHostnameFromVariants = void 0; -const getHostnameFromVariants = (variants = [], { useFipsEndpoint, useDualstackEndpoint }) => { - var _a; - return (_a = variants.find(({ tags }) => useFipsEndpoint === tags.includes("fips") && useDualstackEndpoint === tags.includes("dualstack"))) === null || _a === void 0 ? void 0 : _a.hostname; -}; -exports.getHostnameFromVariants = getHostnameFromVariants; +exports.MessageEncoderStream = void 0; +class MessageEncoderStream { + constructor(options) { + this.options = options; + } + [Symbol.asyncIterator]() { + return this.asyncIterator(); + } + async *asyncIterator() { + for await (const msg of this.options.messageStream) { + const encoded = this.options.encoder.encode(msg); + yield encoded; + } + if (this.options.includeEndFrame) { + yield new Uint8Array(0); + } + } +} +exports.MessageEncoderStream = MessageEncoderStream; /***/ }), -/***/ 77792: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 62379: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getRegionInfo = void 0; -const getHostnameFromVariants_1 = __nccwpck_require__(99760); -const getResolvedHostname_1 = __nccwpck_require__(1487); -const getResolvedPartition_1 = __nccwpck_require__(44441); -const getResolvedSigningRegion_1 = __nccwpck_require__(92281); -const getRegionInfo = (region, { useFipsEndpoint = false, useDualstackEndpoint = false, signingService, regionHash, partitionHash, }) => { - var _a, _b, _c, _d, _e, _f; - const partition = (0, getResolvedPartition_1.getResolvedPartition)(region, { partitionHash }); - const resolvedRegion = region in regionHash ? region : (_b = (_a = partitionHash[partition]) === null || _a === void 0 ? void 0 : _a.endpoint) !== null && _b !== void 0 ? _b : region; - const hostnameOptions = { useFipsEndpoint, useDualstackEndpoint }; - const regionHostname = (0, getHostnameFromVariants_1.getHostnameFromVariants)((_c = regionHash[resolvedRegion]) === null || _c === void 0 ? void 0 : _c.variants, hostnameOptions); - const partitionHostname = (0, getHostnameFromVariants_1.getHostnameFromVariants)((_d = partitionHash[partition]) === null || _d === void 0 ? void 0 : _d.variants, hostnameOptions); - const hostname = (0, getResolvedHostname_1.getResolvedHostname)(resolvedRegion, { regionHostname, partitionHostname }); - if (hostname === undefined) { - throw new Error(`Endpoint resolution failed for: ${{ resolvedRegion, useFipsEndpoint, useDualstackEndpoint }}`); +exports.SmithyMessageDecoderStream = void 0; +class SmithyMessageDecoderStream { + constructor(options) { + this.options = options; } - const signingRegion = (0, getResolvedSigningRegion_1.getResolvedSigningRegion)(hostname, { - signingRegion: (_e = regionHash[resolvedRegion]) === null || _e === void 0 ? void 0 : _e.signingRegion, - regionRegex: partitionHash[partition].regionRegex, - useFipsEndpoint, - }); - return { - partition, - signingService, - hostname, - ...(signingRegion && { signingRegion }), - ...(((_f = regionHash[resolvedRegion]) === null || _f === void 0 ? void 0 : _f.signingService) && { - signingService: regionHash[resolvedRegion].signingService, - }), - }; -}; -exports.getRegionInfo = getRegionInfo; + [Symbol.asyncIterator]() { + return this.asyncIterator(); + } + async *asyncIterator() { + for await (const message of this.options.messageStream) { + const deserialized = await this.options.deserializer(message); + if (deserialized === undefined) + continue; + yield deserialized; + } + } +} +exports.SmithyMessageDecoderStream = SmithyMessageDecoderStream; /***/ }), -/***/ 1487: +/***/ 12484: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getResolvedHostname = void 0; -const getResolvedHostname = (resolvedRegion, { regionHostname, partitionHostname }) => regionHostname - ? regionHostname - : partitionHostname - ? partitionHostname.replace("{region}", resolvedRegion) - : undefined; -exports.getResolvedHostname = getResolvedHostname; +exports.SmithyMessageEncoderStream = void 0; +class SmithyMessageEncoderStream { + constructor(options) { + this.options = options; + } + [Symbol.asyncIterator]() { + return this.asyncIterator(); + } + async *asyncIterator() { + for await (const chunk of this.options.inputStream) { + const payloadBuf = this.options.serializer(chunk); + yield payloadBuf; + } + } +} +exports.SmithyMessageEncoderStream = SmithyMessageEncoderStream; /***/ }), -/***/ 44441: -/***/ ((__unused_webpack_module, exports) => { +/***/ 56459: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getResolvedPartition = void 0; -const getResolvedPartition = (region, { partitionHash }) => { var _a; return (_a = Object.keys(partitionHash || {}).find((key) => partitionHash[key].regions.includes(region))) !== null && _a !== void 0 ? _a : "aws"; }; -exports.getResolvedPartition = getResolvedPartition; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(11014), exports); +tslib_1.__exportStar(__nccwpck_require__(74712), exports); +tslib_1.__exportStar(__nccwpck_require__(46086), exports); +tslib_1.__exportStar(__nccwpck_require__(73684), exports); +tslib_1.__exportStar(__nccwpck_require__(57255), exports); +tslib_1.__exportStar(__nccwpck_require__(52362), exports); +tslib_1.__exportStar(__nccwpck_require__(62379), exports); +tslib_1.__exportStar(__nccwpck_require__(12484), exports); /***/ }), -/***/ 92281: -/***/ ((__unused_webpack_module, exports) => { +/***/ 20597: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getResolvedSigningRegion = void 0; -const getResolvedSigningRegion = (hostname, { signingRegion, regionRegex, useFipsEndpoint }) => { - if (signingRegion) { - return signingRegion; +exports.splitMessage = void 0; +const crc32_1 = __nccwpck_require__(47327); +const PRELUDE_MEMBER_LENGTH = 4; +const PRELUDE_LENGTH = PRELUDE_MEMBER_LENGTH * 2; +const CHECKSUM_LENGTH = 4; +const MINIMUM_MESSAGE_LENGTH = PRELUDE_LENGTH + CHECKSUM_LENGTH * 2; +function splitMessage({ byteLength, byteOffset, buffer }) { + if (byteLength < MINIMUM_MESSAGE_LENGTH) { + throw new Error("Provided message too short to accommodate event stream message overhead"); } - else if (useFipsEndpoint) { - const regionRegexJs = regionRegex.replace("\\\\", "\\").replace(/^\^/g, "\\.").replace(/\$$/g, "\\."); - const regionRegexmatchArray = hostname.match(regionRegexJs); - if (regionRegexmatchArray) { - return regionRegexmatchArray[0].slice(1, -1); - } + const view = new DataView(buffer, byteOffset, byteLength); + const messageLength = view.getUint32(0, false); + if (byteLength !== messageLength) { + throw new Error("Reported message length does not match received message length"); } -}; -exports.getResolvedSigningRegion = getResolvedSigningRegion; + const headerLength = view.getUint32(PRELUDE_MEMBER_LENGTH, false); + const expectedPreludeChecksum = view.getUint32(PRELUDE_LENGTH, false); + const expectedMessageChecksum = view.getUint32(byteLength - CHECKSUM_LENGTH, false); + const checksummer = new crc32_1.Crc32().update(new Uint8Array(buffer, byteOffset, PRELUDE_LENGTH)); + if (expectedPreludeChecksum !== checksummer.digest()) { + throw new Error(`The prelude checksum specified in the message (${expectedPreludeChecksum}) does not match the calculated CRC32 checksum (${checksummer.digest()})`); + } + checksummer.update(new Uint8Array(buffer, byteOffset + PRELUDE_LENGTH, byteLength - (PRELUDE_LENGTH + CHECKSUM_LENGTH))); + if (expectedMessageChecksum !== checksummer.digest()) { + throw new Error(`The message checksum (${checksummer.digest()}) did not match the expected value of ${expectedMessageChecksum}`); + } + return { + headers: new DataView(buffer, byteOffset + PRELUDE_LENGTH + CHECKSUM_LENGTH, headerLength), + body: new Uint8Array(buffer, byteOffset + PRELUDE_LENGTH + CHECKSUM_LENGTH + headerLength, messageLength - headerLength - (PRELUDE_LENGTH + CHECKSUM_LENGTH + CHECKSUM_LENGTH)), + }; +} +exports.splitMessage = splitMessage; /***/ }), -/***/ 86985: +/***/ 3081: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(19814), exports); -tslib_1.__exportStar(__nccwpck_require__(14832), exports); -tslib_1.__exportStar(__nccwpck_require__(77792), exports); +exports.Hash = void 0; +const util_buffer_from_1 = __nccwpck_require__(31381); +const util_utf8_1 = __nccwpck_require__(41895); +const buffer_1 = __nccwpck_require__(14300); +const crypto_1 = __nccwpck_require__(6113); +class Hash { + constructor(algorithmIdentifier, secret) { + this.algorithmIdentifier = algorithmIdentifier; + this.secret = secret; + this.reset(); + } + update(toHash, encoding) { + this.hash.update((0, util_utf8_1.toUint8Array)(castSourceData(toHash, encoding))); + } + digest() { + return Promise.resolve(this.hash.digest()); + } + reset() { + this.hash = this.secret + ? (0, crypto_1.createHmac)(this.algorithmIdentifier, castSourceData(this.secret)) + : (0, crypto_1.createHash)(this.algorithmIdentifier); + } +} +exports.Hash = Hash; +function castSourceData(toCast, encoding) { + if (buffer_1.Buffer.isBuffer(toCast)) { + return toCast; + } + if (typeof toCast === "string") { + return (0, util_buffer_from_1.fromString)(toCast, encoding); + } + if (ArrayBuffer.isView(toCast)) { + return (0, util_buffer_from_1.fromArrayBuffer)(toCast.buffer, toCast.byteOffset, toCast.byteLength); + } + return (0, util_buffer_from_1.fromArrayBuffer)(toCast); +} /***/ }), -/***/ 18044: +/***/ 10780: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Endpoint = void 0; -var Endpoint; -(function (Endpoint) { - Endpoint["IPv4"] = "http://169.254.169.254"; - Endpoint["IPv6"] = "http://[fd00:ec2::254]"; -})(Endpoint = exports.Endpoint || (exports.Endpoint = {})); +exports.isArrayBuffer = void 0; +const isArrayBuffer = (arg) => (typeof ArrayBuffer === "function" && arg instanceof ArrayBuffer) || + Object.prototype.toString.call(arg) === "[object ArrayBuffer]"; +exports.isArrayBuffer = isArrayBuffer; /***/ }), -/***/ 57342: -/***/ ((__unused_webpack_module, exports) => { +/***/ 82800: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ENDPOINT_CONFIG_OPTIONS = exports.CONFIG_ENDPOINT_NAME = exports.ENV_ENDPOINT_NAME = void 0; -exports.ENV_ENDPOINT_NAME = "AWS_EC2_METADATA_SERVICE_ENDPOINT"; -exports.CONFIG_ENDPOINT_NAME = "ec2_metadata_service_endpoint"; -exports.ENDPOINT_CONFIG_OPTIONS = { - environmentVariableSelector: (env) => env[exports.ENV_ENDPOINT_NAME], - configFileSelector: (profile) => profile[exports.CONFIG_ENDPOINT_NAME], - default: undefined, +exports.getContentLengthPlugin = exports.contentLengthMiddlewareOptions = exports.contentLengthMiddleware = void 0; +const protocol_http_1 = __nccwpck_require__(64418); +const CONTENT_LENGTH_HEADER = "content-length"; +function contentLengthMiddleware(bodyLengthChecker) { + return (next) => async (args) => { + const request = args.request; + if (protocol_http_1.HttpRequest.isInstance(request)) { + const { body, headers } = request; + if (body && + Object.keys(headers) + .map((str) => str.toLowerCase()) + .indexOf(CONTENT_LENGTH_HEADER) === -1) { + try { + const length = bodyLengthChecker(body); + request.headers = { + ...request.headers, + [CONTENT_LENGTH_HEADER]: String(length), + }; + } + catch (error) { + } + } + } + return next({ + ...args, + request, + }); + }; +} +exports.contentLengthMiddleware = contentLengthMiddleware; +exports.contentLengthMiddlewareOptions = { + step: "build", + tags: ["SET_CONTENT_LENGTH", "CONTENT_LENGTH"], + name: "contentLengthMiddleware", + override: true, }; +const getContentLengthPlugin = (options) => ({ + applyToStack: (clientStack) => { + clientStack.add(contentLengthMiddleware(options.bodyLengthChecker), exports.contentLengthMiddlewareOptions); + }, +}); +exports.getContentLengthPlugin = getContentLengthPlugin; /***/ }), -/***/ 80991: +/***/ 465: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.EndpointMode = void 0; -var EndpointMode; -(function (EndpointMode) { - EndpointMode["IPv4"] = "IPv4"; - EndpointMode["IPv6"] = "IPv6"; -})(EndpointMode = exports.EndpointMode || (exports.EndpointMode = {})); +exports.createConfigValueProvider = void 0; +const createConfigValueProvider = (configKey, canonicalEndpointParamKey, config) => { + const configProvider = async () => { + var _a; + const configValue = (_a = config[configKey]) !== null && _a !== void 0 ? _a : config[canonicalEndpointParamKey]; + if (typeof configValue === "function") { + return configValue(); + } + return configValue; + }; + if (configKey === "endpoint" || canonicalEndpointParamKey === "endpoint") { + return async () => { + const endpoint = await configProvider(); + if (endpoint && typeof endpoint === "object") { + if ("url" in endpoint) { + return endpoint.url.href; + } + if ("hostname" in endpoint) { + const { protocol, hostname, port, path } = endpoint; + return `${protocol}//${hostname}${port ? ":" + port : ""}${path}`; + } + } + return endpoint; + }; + } + return configProvider; +}; +exports.createConfigValueProvider = createConfigValueProvider; /***/ }), -/***/ 88337: +/***/ 31518: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ENDPOINT_MODE_CONFIG_OPTIONS = exports.CONFIG_ENDPOINT_MODE_NAME = exports.ENV_ENDPOINT_MODE_NAME = void 0; -const EndpointMode_1 = __nccwpck_require__(80991); -exports.ENV_ENDPOINT_MODE_NAME = "AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE"; -exports.CONFIG_ENDPOINT_MODE_NAME = "ec2_metadata_service_endpoint_mode"; -exports.ENDPOINT_MODE_CONFIG_OPTIONS = { - environmentVariableSelector: (env) => env[exports.ENV_ENDPOINT_MODE_NAME], - configFileSelector: (profile) => profile[exports.CONFIG_ENDPOINT_MODE_NAME], - default: EndpointMode_1.EndpointMode.IPv4, -}; +exports.getEndpointFromConfig = void 0; +const node_config_provider_1 = __nccwpck_require__(33461); +const getEndpointUrlConfig_1 = __nccwpck_require__(7574); +const getEndpointFromConfig = async (serviceId) => (0, node_config_provider_1.loadConfig)((0, getEndpointUrlConfig_1.getEndpointUrlConfig)(serviceId))(); +exports.getEndpointFromConfig = getEndpointFromConfig; /***/ }), -/***/ 89227: +/***/ 73929: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fromContainerMetadata = exports.ENV_CMDS_AUTH_TOKEN = exports.ENV_CMDS_RELATIVE_URI = exports.ENV_CMDS_FULL_URI = void 0; -const property_provider_1 = __nccwpck_require__(79721); -const url_1 = __nccwpck_require__(57310); -const httpRequest_1 = __nccwpck_require__(32199); -const ImdsCredentials_1 = __nccwpck_require__(6894); -const RemoteProviderInit_1 = __nccwpck_require__(98533); -const retry_1 = __nccwpck_require__(91351); -exports.ENV_CMDS_FULL_URI = "AWS_CONTAINER_CREDENTIALS_FULL_URI"; -exports.ENV_CMDS_RELATIVE_URI = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"; -exports.ENV_CMDS_AUTH_TOKEN = "AWS_CONTAINER_AUTHORIZATION_TOKEN"; -const fromContainerMetadata = (init = {}) => { - const { timeout, maxRetries } = (0, RemoteProviderInit_1.providerConfigFromInit)(init); - return () => (0, retry_1.retry)(async () => { - const requestOptions = await getCmdsUri(); - const credsResponse = JSON.parse(await requestFromEcsImds(timeout, requestOptions)); - if (!(0, ImdsCredentials_1.isImdsCredentials)(credsResponse)) { - throw new property_provider_1.CredentialsProviderError("Invalid response received from instance metadata service."); +exports.resolveParams = exports.getEndpointFromInstructions = void 0; +const service_customizations_1 = __nccwpck_require__(13105); +const createConfigValueProvider_1 = __nccwpck_require__(465); +const getEndpointFromConfig_1 = __nccwpck_require__(31518); +const toEndpointV1_1 = __nccwpck_require__(38938); +const getEndpointFromInstructions = async (commandInput, instructionsSupplier, clientConfig, context) => { + if (!clientConfig.endpoint) { + const endpointFromConfig = await (0, getEndpointFromConfig_1.getEndpointFromConfig)(clientConfig.serviceId || ""); + if (endpointFromConfig) { + clientConfig.endpoint = () => Promise.resolve((0, toEndpointV1_1.toEndpointV1)(endpointFromConfig)); } - return (0, ImdsCredentials_1.fromImdsCredentials)(credsResponse); - }, maxRetries); -}; -exports.fromContainerMetadata = fromContainerMetadata; -const requestFromEcsImds = async (timeout, options) => { - if (process.env[exports.ENV_CMDS_AUTH_TOKEN]) { - options.headers = { - ...options.headers, - Authorization: process.env[exports.ENV_CMDS_AUTH_TOKEN], - }; } - const buffer = await (0, httpRequest_1.httpRequest)({ - ...options, - timeout, - }); - return buffer.toString(); -}; -const CMDS_IP = "169.254.170.2"; -const GREENGRASS_HOSTS = { - localhost: true, - "127.0.0.1": true, -}; -const GREENGRASS_PROTOCOLS = { - "http:": true, - "https:": true, -}; -const getCmdsUri = async () => { - if (process.env[exports.ENV_CMDS_RELATIVE_URI]) { - return { - hostname: CMDS_IP, - path: process.env[exports.ENV_CMDS_RELATIVE_URI], - }; + const endpointParams = await (0, exports.resolveParams)(commandInput, instructionsSupplier, clientConfig); + if (typeof clientConfig.endpointProvider !== "function") { + throw new Error("config.endpointProvider is not set."); } - if (process.env[exports.ENV_CMDS_FULL_URI]) { - const parsed = (0, url_1.parse)(process.env[exports.ENV_CMDS_FULL_URI]); - if (!parsed.hostname || !(parsed.hostname in GREENGRASS_HOSTS)) { - throw new property_provider_1.CredentialsProviderError(`${parsed.hostname} is not a valid container metadata service hostname`, false); - } - if (!parsed.protocol || !(parsed.protocol in GREENGRASS_PROTOCOLS)) { - throw new property_provider_1.CredentialsProviderError(`${parsed.protocol} is not a valid container metadata service protocol`, false); + const endpoint = clientConfig.endpointProvider(endpointParams, context); + return endpoint; +}; +exports.getEndpointFromInstructions = getEndpointFromInstructions; +const resolveParams = async (commandInput, instructionsSupplier, clientConfig) => { + var _a; + const endpointParams = {}; + const instructions = ((_a = instructionsSupplier === null || instructionsSupplier === void 0 ? void 0 : instructionsSupplier.getEndpointParameterInstructions) === null || _a === void 0 ? void 0 : _a.call(instructionsSupplier)) || {}; + for (const [name, instruction] of Object.entries(instructions)) { + switch (instruction.type) { + case "staticContextParams": + endpointParams[name] = instruction.value; + break; + case "contextParams": + endpointParams[name] = commandInput[instruction.name]; + break; + case "clientContextParams": + case "builtInParams": + endpointParams[name] = await (0, createConfigValueProvider_1.createConfigValueProvider)(instruction.name, name, clientConfig)(); + break; + default: + throw new Error("Unrecognized endpoint parameter instruction: " + JSON.stringify(instruction)); } - return { - ...parsed, - port: parsed.port ? parseInt(parsed.port, 10) : undefined, - }; } - throw new property_provider_1.CredentialsProviderError("The container metadata credential provider cannot be used unless" + - ` the ${exports.ENV_CMDS_RELATIVE_URI} or ${exports.ENV_CMDS_FULL_URI} environment` + - " variable is set", false); + if (Object.keys(instructions).length === 0) { + Object.assign(endpointParams, clientConfig); + } + if (String(clientConfig.serviceId).toLowerCase() === "s3") { + await (0, service_customizations_1.resolveParamsForS3)(endpointParams); + } + return endpointParams; }; +exports.resolveParams = resolveParams; /***/ }), -/***/ 52207: +/***/ 7574: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fromInstanceMetadata = void 0; -const property_provider_1 = __nccwpck_require__(79721); -const httpRequest_1 = __nccwpck_require__(32199); -const ImdsCredentials_1 = __nccwpck_require__(6894); -const RemoteProviderInit_1 = __nccwpck_require__(98533); -const retry_1 = __nccwpck_require__(91351); -const getInstanceMetadataEndpoint_1 = __nccwpck_require__(92460); -const staticStabilityProvider_1 = __nccwpck_require__(74035); -const IMDS_PATH = "/latest/meta-data/iam/security-credentials/"; -const IMDS_TOKEN_PATH = "/latest/api/token"; -const fromInstanceMetadata = (init = {}) => (0, staticStabilityProvider_1.staticStabilityProvider)(getInstanceImdsProvider(init), { logger: init.logger }); -exports.fromInstanceMetadata = fromInstanceMetadata; -const getInstanceImdsProvider = (init) => { - let disableFetchToken = false; - const { timeout, maxRetries } = (0, RemoteProviderInit_1.providerConfigFromInit)(init); - const getCredentials = async (maxRetries, options) => { - const profile = (await (0, retry_1.retry)(async () => { - let profile; - try { - profile = await getProfile(options); - } - catch (err) { - if (err.statusCode === 401) { - disableFetchToken = false; - } - throw err; - } - return profile; - }, maxRetries)).trim(); - return (0, retry_1.retry)(async () => { - let creds; - try { - creds = await getCredentialsFromProfile(profile, options); - } - catch (err) { - if (err.statusCode === 401) { - disableFetchToken = false; - } - throw err; - } - return creds; - }, maxRetries); - }; - return async () => { - const endpoint = await (0, getInstanceMetadataEndpoint_1.getInstanceMetadataEndpoint)(); - if (disableFetchToken) { - return getCredentials(maxRetries, { ...endpoint, timeout }); - } - else { - let token; - try { - token = (await getMetadataToken({ ...endpoint, timeout })).toString(); - } - catch (error) { - if ((error === null || error === void 0 ? void 0 : error.statusCode) === 400) { - throw Object.assign(error, { - message: "EC2 Metadata token request returned error", - }); - } - else if (error.message === "TimeoutError" || [403, 404, 405].includes(error.statusCode)) { - disableFetchToken = true; - } - return getCredentials(maxRetries, { ...endpoint, timeout }); +exports.getEndpointUrlConfig = void 0; +const shared_ini_file_loader_1 = __nccwpck_require__(43507); +const ENV_ENDPOINT_URL = "AWS_ENDPOINT_URL"; +const CONFIG_ENDPOINT_URL = "endpoint_url"; +const getEndpointUrlConfig = (serviceId) => ({ + environmentVariableSelector: (env) => { + const serviceSuffixParts = serviceId.split(" ").map((w) => w.toUpperCase()); + const serviceEndpointUrl = env[[ENV_ENDPOINT_URL, ...serviceSuffixParts].join("_")]; + if (serviceEndpointUrl) + return serviceEndpointUrl; + const endpointUrl = env[ENV_ENDPOINT_URL]; + if (endpointUrl) + return endpointUrl; + return undefined; + }, + configFileSelector: (profile, config) => { + if (config && profile.services) { + const servicesSection = config[["services", profile.services].join(shared_ini_file_loader_1.CONFIG_PREFIX_SEPARATOR)]; + if (servicesSection) { + const servicePrefixParts = serviceId.split(" ").map((w) => w.toLowerCase()); + const endpointUrl = servicesSection[[servicePrefixParts.join("_"), CONFIG_ENDPOINT_URL].join(shared_ini_file_loader_1.CONFIG_PREFIX_SEPARATOR)]; + if (endpointUrl) + return endpointUrl; } - return getCredentials(maxRetries, { - ...endpoint, - headers: { - "x-aws-ec2-metadata-token": token, - }, - timeout, - }); } - }; -}; -const getMetadataToken = async (options) => (0, httpRequest_1.httpRequest)({ - ...options, - path: IMDS_TOKEN_PATH, - method: "PUT", - headers: { - "x-aws-ec2-metadata-token-ttl-seconds": "21600", + const endpointUrl = profile[CONFIG_ENDPOINT_URL]; + if (endpointUrl) + return endpointUrl; + return undefined; }, + default: undefined, }); -const getProfile = async (options) => (await (0, httpRequest_1.httpRequest)({ ...options, path: IMDS_PATH })).toString(); -const getCredentialsFromProfile = async (profile, options) => { - const credsResponse = JSON.parse((await (0, httpRequest_1.httpRequest)({ - ...options, - path: IMDS_PATH + profile, - })).toString()); - if (!(0, ImdsCredentials_1.isImdsCredentials)(credsResponse)) { - throw new property_provider_1.CredentialsProviderError("Invalid response received from instance metadata service."); - } - return (0, ImdsCredentials_1.fromImdsCredentials)(credsResponse); -}; +exports.getEndpointUrlConfig = getEndpointUrlConfig; /***/ }), -/***/ 7477: +/***/ 50890: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getInstanceMetadataEndpoint = exports.httpRequest = void 0; const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(89227), exports); -tslib_1.__exportStar(__nccwpck_require__(52207), exports); -tslib_1.__exportStar(__nccwpck_require__(98533), exports); -tslib_1.__exportStar(__nccwpck_require__(45036), exports); -var httpRequest_1 = __nccwpck_require__(32199); -Object.defineProperty(exports, "httpRequest", ({ enumerable: true, get: function () { return httpRequest_1.httpRequest; } })); -var getInstanceMetadataEndpoint_1 = __nccwpck_require__(92460); -Object.defineProperty(exports, "getInstanceMetadataEndpoint", ({ enumerable: true, get: function () { return getInstanceMetadataEndpoint_1.getInstanceMetadataEndpoint; } })); - - -/***/ }), - -/***/ 6894: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fromImdsCredentials = exports.isImdsCredentials = void 0; -const isImdsCredentials = (arg) => Boolean(arg) && - typeof arg === "object" && - typeof arg.AccessKeyId === "string" && - typeof arg.SecretAccessKey === "string" && - typeof arg.Token === "string" && - typeof arg.Expiration === "string"; -exports.isImdsCredentials = isImdsCredentials; -const fromImdsCredentials = (creds) => ({ - accessKeyId: creds.AccessKeyId, - secretAccessKey: creds.SecretAccessKey, - sessionToken: creds.Token, - expiration: new Date(creds.Expiration), -}); -exports.fromImdsCredentials = fromImdsCredentials; +tslib_1.__exportStar(__nccwpck_require__(73929), exports); +tslib_1.__exportStar(__nccwpck_require__(38938), exports); /***/ }), -/***/ 98533: -/***/ ((__unused_webpack_module, exports) => { +/***/ 38938: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.providerConfigFromInit = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_TIMEOUT = void 0; -exports.DEFAULT_TIMEOUT = 1000; -exports.DEFAULT_MAX_RETRIES = 0; -const providerConfigFromInit = ({ maxRetries = exports.DEFAULT_MAX_RETRIES, timeout = exports.DEFAULT_TIMEOUT, }) => ({ maxRetries, timeout }); -exports.providerConfigFromInit = providerConfigFromInit; +exports.toEndpointV1 = void 0; +const url_parser_1 = __nccwpck_require__(14681); +const toEndpointV1 = (endpoint) => { + if (typeof endpoint === "object") { + if ("url" in endpoint) { + return (0, url_parser_1.parseUrl)(endpoint.url); + } + return endpoint; + } + return (0, url_parser_1.parseUrl)(endpoint); +}; +exports.toEndpointV1 = toEndpointV1; /***/ }), -/***/ 32199: +/***/ 55520: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.httpRequest = void 0; -const property_provider_1 = __nccwpck_require__(79721); -const buffer_1 = __nccwpck_require__(14300); -const http_1 = __nccwpck_require__(13685); -function httpRequest(options) { - return new Promise((resolve, reject) => { - var _a; - const req = (0, http_1.request)({ - method: "GET", - ...options, - hostname: (_a = options.hostname) === null || _a === void 0 ? void 0 : _a.replace(/^\[(.+)\]$/, "$1"), - }); - req.on("error", (err) => { - reject(Object.assign(new property_provider_1.ProviderError("Unable to connect to instance metadata service"), err)); - req.destroy(); - }); - req.on("timeout", () => { - reject(new property_provider_1.ProviderError("TimeoutError from instance metadata service")); - req.destroy(); - }); - req.on("response", (res) => { - const { statusCode = 400 } = res; - if (statusCode < 200 || 300 <= statusCode) { - reject(Object.assign(new property_provider_1.ProviderError("Error response received from instance metadata service"), { statusCode })); - req.destroy(); +exports.endpointMiddleware = void 0; +const util_middleware_1 = __nccwpck_require__(2390); +const getEndpointFromInstructions_1 = __nccwpck_require__(73929); +const endpointMiddleware = ({ config, instructions, }) => { + return (next, context) => async (args) => { + var _a, _b, _c; + const endpoint = await (0, getEndpointFromInstructions_1.getEndpointFromInstructions)(args.input, { + getEndpointParameterInstructions() { + return instructions; + }, + }, { ...config }, context); + context.endpointV2 = endpoint; + context.authSchemes = (_a = endpoint.properties) === null || _a === void 0 ? void 0 : _a.authSchemes; + const authScheme = (_b = context.authSchemes) === null || _b === void 0 ? void 0 : _b[0]; + if (authScheme) { + context["signing_region"] = authScheme.signingRegion; + context["signing_service"] = authScheme.signingName; + const smithyContext = (0, util_middleware_1.getSmithyContext)(context); + const httpAuthOption = (_c = smithyContext === null || smithyContext === void 0 ? void 0 : smithyContext.selectedHttpAuthScheme) === null || _c === void 0 ? void 0 : _c.httpAuthOption; + if (httpAuthOption) { + httpAuthOption.signingProperties = Object.assign(httpAuthOption.signingProperties || {}, { + signing_region: authScheme.signingRegion, + signingRegion: authScheme.signingRegion, + signing_service: authScheme.signingName, + signingName: authScheme.signingName, + signingRegionSet: authScheme.signingRegionSet, + }, authScheme.properties); } - const chunks = []; - res.on("data", (chunk) => { - chunks.push(chunk); - }); - res.on("end", () => { - resolve(buffer_1.Buffer.concat(chunks)); - req.destroy(); - }); + } + return next({ + ...args, }); - req.end(); - }); -} -exports.httpRequest = httpRequest; + }; +}; +exports.endpointMiddleware = endpointMiddleware; /***/ }), -/***/ 91351: -/***/ ((__unused_webpack_module, exports) => { +/***/ 71329: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.retry = void 0; -const retry = (toRetry, maxRetries) => { - let promise = toRetry(); - for (let i = 0; i < maxRetries; i++) { - promise = promise.catch(toRetry); - } - return promise; +exports.getEndpointPlugin = exports.endpointMiddlewareOptions = void 0; +const middleware_serde_1 = __nccwpck_require__(81238); +const endpointMiddleware_1 = __nccwpck_require__(55520); +exports.endpointMiddlewareOptions = { + step: "serialize", + tags: ["ENDPOINT_PARAMETERS", "ENDPOINT_V2", "ENDPOINT"], + name: "endpointV2Middleware", + override: true, + relation: "before", + toMiddleware: middleware_serde_1.serializerMiddlewareOption.name, }; -exports.retry = retry; +const getEndpointPlugin = (config, instructions) => ({ + applyToStack: (clientStack) => { + clientStack.addRelativeTo((0, endpointMiddleware_1.endpointMiddleware)({ + config, + instructions, + }), exports.endpointMiddlewareOptions); + }, +}); +exports.getEndpointPlugin = getEndpointPlugin; /***/ }), -/***/ 45036: -/***/ ((__unused_webpack_module, exports) => { +/***/ 82918: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(50890), exports); +tslib_1.__exportStar(__nccwpck_require__(55520), exports); +tslib_1.__exportStar(__nccwpck_require__(71329), exports); +tslib_1.__exportStar(__nccwpck_require__(74139), exports); +tslib_1.__exportStar(__nccwpck_require__(39720), exports); /***/ }), -/***/ 22666: -/***/ ((__unused_webpack_module, exports) => { +/***/ 74139: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getExtendedInstanceMetadataCredentials = void 0; -const STATIC_STABILITY_REFRESH_INTERVAL_SECONDS = 5 * 60; -const STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS = 5 * 60; -const STATIC_STABILITY_DOC_URL = "https://docs.aws.amazon.com/sdkref/latest/guide/feature-static-credentials.html"; -const getExtendedInstanceMetadataCredentials = (credentials, logger) => { - var _a; - const refreshInterval = STATIC_STABILITY_REFRESH_INTERVAL_SECONDS + - Math.floor(Math.random() * STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS); - const newExpiration = new Date(Date.now() + refreshInterval * 1000); - logger.warn("Attempting credential expiration extension due to a credential service availability issue. A refresh of these " + - "credentials will be attempted after ${new Date(newExpiration)}.\nFor more information, please visit: " + - STATIC_STABILITY_DOC_URL); - const originalExpiration = (_a = credentials.originalExpiration) !== null && _a !== void 0 ? _a : credentials.expiration; +exports.resolveEndpointConfig = void 0; +const util_middleware_1 = __nccwpck_require__(2390); +const toEndpointV1_1 = __nccwpck_require__(38938); +const resolveEndpointConfig = (input) => { + var _a, _b, _c; + const tls = (_a = input.tls) !== null && _a !== void 0 ? _a : true; + const { endpoint } = input; + const customEndpointProvider = endpoint != null ? async () => (0, toEndpointV1_1.toEndpointV1)(await (0, util_middleware_1.normalizeProvider)(endpoint)()) : undefined; + const isCustomEndpoint = !!endpoint; return { - ...credentials, - ...(originalExpiration ? { originalExpiration } : {}), - expiration: newExpiration, + ...input, + endpoint: customEndpointProvider, + tls, + isCustomEndpoint, + useDualstackEndpoint: (0, util_middleware_1.normalizeProvider)((_b = input.useDualstackEndpoint) !== null && _b !== void 0 ? _b : false), + useFipsEndpoint: (0, util_middleware_1.normalizeProvider)((_c = input.useFipsEndpoint) !== null && _c !== void 0 ? _c : false), }; }; -exports.getExtendedInstanceMetadataCredentials = getExtendedInstanceMetadataCredentials; +exports.resolveEndpointConfig = resolveEndpointConfig; /***/ }), -/***/ 92460: +/***/ 13105: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getInstanceMetadataEndpoint = void 0; -const node_config_provider_1 = __nccwpck_require__(33461); -const url_parser_1 = __nccwpck_require__(14681); -const Endpoint_1 = __nccwpck_require__(18044); -const EndpointConfigOptions_1 = __nccwpck_require__(57342); -const EndpointMode_1 = __nccwpck_require__(80991); -const EndpointModeConfigOptions_1 = __nccwpck_require__(88337); -const getInstanceMetadataEndpoint = async () => (0, url_parser_1.parseUrl)((await getFromEndpointConfig()) || (await getFromEndpointModeConfig())); -exports.getInstanceMetadataEndpoint = getInstanceMetadataEndpoint; -const getFromEndpointConfig = async () => (0, node_config_provider_1.loadConfig)(EndpointConfigOptions_1.ENDPOINT_CONFIG_OPTIONS)(); -const getFromEndpointModeConfig = async () => { - const endpointMode = await (0, node_config_provider_1.loadConfig)(EndpointModeConfigOptions_1.ENDPOINT_MODE_CONFIG_OPTIONS)(); - switch (endpointMode) { - case EndpointMode_1.EndpointMode.IPv4: - return Endpoint_1.Endpoint.IPv4; - case EndpointMode_1.EndpointMode.IPv6: - return Endpoint_1.Endpoint.IPv6; - default: - throw new Error(`Unsupported endpoint mode: ${endpointMode}.` + ` Select from ${Object.values(EndpointMode_1.EndpointMode)}`); - } -}; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(19194), exports); /***/ }), -/***/ 74035: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 19194: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.staticStabilityProvider = void 0; -const getExtendedInstanceMetadataCredentials_1 = __nccwpck_require__(22666); -const staticStabilityProvider = (provider, options = {}) => { - const logger = (options === null || options === void 0 ? void 0 : options.logger) || console; - let pastCredentials; - return async () => { - let credentials; - try { - credentials = await provider(); - if (credentials.expiration && credentials.expiration.getTime() < Date.now()) { - credentials = (0, getExtendedInstanceMetadataCredentials_1.getExtendedInstanceMetadataCredentials)(credentials, logger); - } - } - catch (e) { - if (pastCredentials) { - logger.warn("Credential renew failed: ", e); - credentials = (0, getExtendedInstanceMetadataCredentials_1.getExtendedInstanceMetadataCredentials)(pastCredentials, logger); - } - else { - throw e; - } +exports.isArnBucketName = exports.isDnsCompatibleBucketName = exports.S3_HOSTNAME_PATTERN = exports.DOT_PATTERN = exports.resolveParamsForS3 = void 0; +const resolveParamsForS3 = async (endpointParams) => { + const bucket = (endpointParams === null || endpointParams === void 0 ? void 0 : endpointParams.Bucket) || ""; + if (typeof endpointParams.Bucket === "string") { + endpointParams.Bucket = bucket.replace(/#/g, encodeURIComponent("#")).replace(/\?/g, encodeURIComponent("?")); + } + if ((0, exports.isArnBucketName)(bucket)) { + if (endpointParams.ForcePathStyle === true) { + throw new Error("Path-style addressing cannot be used with ARN buckets"); } - pastCredentials = credentials; - return credentials; - }; + } + else if (!(0, exports.isDnsCompatibleBucketName)(bucket) || + (bucket.indexOf(".") !== -1 && !String(endpointParams.Endpoint).startsWith("http:")) || + bucket.toLowerCase() !== bucket || + bucket.length < 3) { + endpointParams.ForcePathStyle = true; + } + if (endpointParams.DisableMultiRegionAccessPoints) { + endpointParams.disableMultiRegionAccessPoints = true; + endpointParams.DisableMRAP = true; + } + return endpointParams; }; -exports.staticStabilityProvider = staticStabilityProvider; +exports.resolveParamsForS3 = resolveParamsForS3; +const DOMAIN_PATTERN = /^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/; +const IP_ADDRESS_PATTERN = /(\d+\.){3}\d+/; +const DOTS_PATTERN = /\.\./; +exports.DOT_PATTERN = /\./; +exports.S3_HOSTNAME_PATTERN = /^(.+\.)?s3(-fips)?(\.dualstack)?[.-]([a-z0-9-]+)\./; +const isDnsCompatibleBucketName = (bucketName) => DOMAIN_PATTERN.test(bucketName) && !IP_ADDRESS_PATTERN.test(bucketName) && !DOTS_PATTERN.test(bucketName); +exports.isDnsCompatibleBucketName = isDnsCompatibleBucketName; +const isArnBucketName = (bucketName) => { + const [arn, partition, service, region, account, typeOrId] = bucketName.split(":"); + const isArn = arn === "arn" && bucketName.split(":").length >= 6; + const isValidArn = [arn, partition, service, account, typeOrId].filter(Boolean).length === 5; + if (isArn && !isValidArn) { + throw new Error(`Invalid ARN: ${bucketName} was an invalid ARN.`); + } + return arn === "arn" && !!partition && !!service && !!account && !!typeOrId; +}; +exports.isArnBucketName = isArnBucketName; /***/ }), -/***/ 11014: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 39720: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.EventStreamCodec = void 0; -const crc32_1 = __nccwpck_require__(47327); -const HeaderMarshaller_1 = __nccwpck_require__(74712); -const splitMessage_1 = __nccwpck_require__(20597); -class EventStreamCodec { - constructor(toUtf8, fromUtf8) { - this.headerMarshaller = new HeaderMarshaller_1.HeaderMarshaller(toUtf8, fromUtf8); - this.messageBuffer = []; - this.isEndOfStream = false; - } - feed(message) { - this.messageBuffer.push(this.decode(message)); - } - endOfStream() { - this.isEndOfStream = true; - } - getMessage() { - const message = this.messageBuffer.pop(); - const isEndOfStream = this.isEndOfStream; - return { - getMessage() { - return message; - }, - isEndOfStream() { - return isEndOfStream; - }, - }; - } - getAvailableMessages() { - const messages = this.messageBuffer; - this.messageBuffer = []; - const isEndOfStream = this.isEndOfStream; - return { - getMessages() { - return messages; - }, - isEndOfStream() { - return isEndOfStream; - }, - }; - } - encode({ headers: rawHeaders, body }) { - const headers = this.headerMarshaller.format(rawHeaders); - const length = headers.byteLength + body.byteLength + 16; - const out = new Uint8Array(length); - const view = new DataView(out.buffer, out.byteOffset, out.byteLength); - const checksum = new crc32_1.Crc32(); - view.setUint32(0, length, false); - view.setUint32(4, headers.byteLength, false); - view.setUint32(8, checksum.update(out.subarray(0, 8)).digest(), false); - out.set(headers, 12); - out.set(body, headers.byteLength + 12); - view.setUint32(length - 4, checksum.update(out.subarray(8, length - 4)).digest(), false); - return out; - } - decode(message) { - const { headers, body } = (0, splitMessage_1.splitMessage)(message); - return { headers: this.headerMarshaller.parse(headers), body }; - } - formatHeaders(rawHeaders) { - return this.headerMarshaller.format(rawHeaders); - } -} -exports.EventStreamCodec = EventStreamCodec; /***/ }), -/***/ 74712: +/***/ 80155: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HeaderMarshaller = void 0; -const util_hex_encoding_1 = __nccwpck_require__(45364); -const Int64_1 = __nccwpck_require__(46086); -class HeaderMarshaller { - constructor(toUtf8, fromUtf8) { - this.toUtf8 = toUtf8; - this.fromUtf8 = fromUtf8; - } - format(headers) { - const chunks = []; - for (const headerName of Object.keys(headers)) { - const bytes = this.fromUtf8(headerName); - chunks.push(Uint8Array.from([bytes.byteLength]), bytes, this.formatHeaderValue(headers[headerName])); - } - const out = new Uint8Array(chunks.reduce((carry, bytes) => carry + bytes.byteLength, 0)); - let position = 0; - for (const chunk of chunks) { - out.set(chunk, position); - position += chunk.byteLength; - } - return out; - } - formatHeaderValue(header) { - switch (header.type) { - case "boolean": - return Uint8Array.from([header.value ? 0 : 1]); - case "byte": - return Uint8Array.from([2, header.value]); - case "short": - const shortView = new DataView(new ArrayBuffer(3)); - shortView.setUint8(0, 3); - shortView.setInt16(1, header.value, false); - return new Uint8Array(shortView.buffer); - case "integer": - const intView = new DataView(new ArrayBuffer(5)); - intView.setUint8(0, 4); - intView.setInt32(1, header.value, false); - return new Uint8Array(intView.buffer); - case "long": - const longBytes = new Uint8Array(9); - longBytes[0] = 5; - longBytes.set(header.value.bytes, 1); - return longBytes; - case "binary": - const binView = new DataView(new ArrayBuffer(3 + header.value.byteLength)); - binView.setUint8(0, 6); - binView.setUint16(1, header.value.byteLength, false); - const binBytes = new Uint8Array(binView.buffer); - binBytes.set(header.value, 3); - return binBytes; - case "string": - const utf8Bytes = this.fromUtf8(header.value); - const strView = new DataView(new ArrayBuffer(3 + utf8Bytes.byteLength)); - strView.setUint8(0, 7); - strView.setUint16(1, utf8Bytes.byteLength, false); - const strBytes = new Uint8Array(strView.buffer); - strBytes.set(utf8Bytes, 3); - return strBytes; - case "timestamp": - const tsBytes = new Uint8Array(9); - tsBytes[0] = 8; - tsBytes.set(Int64_1.Int64.fromNumber(header.value.valueOf()).bytes, 1); - return tsBytes; - case "uuid": - if (!UUID_PATTERN.test(header.value)) { - throw new Error(`Invalid UUID received: ${header.value}`); - } - const uuidBytes = new Uint8Array(17); - uuidBytes[0] = 9; - uuidBytes.set((0, util_hex_encoding_1.fromHex)(header.value.replace(/\-/g, "")), 1); - return uuidBytes; - } - } - parse(headers) { - const out = {}; - let position = 0; - while (position < headers.byteLength) { - const nameLength = headers.getUint8(position++); - const name = this.toUtf8(new Uint8Array(headers.buffer, headers.byteOffset + position, nameLength)); - position += nameLength; - switch (headers.getUint8(position++)) { - case 0: - out[name] = { - type: BOOLEAN_TAG, - value: true, - }; - break; - case 1: - out[name] = { - type: BOOLEAN_TAG, - value: false, - }; - break; - case 2: - out[name] = { - type: BYTE_TAG, - value: headers.getInt8(position++), - }; - break; - case 3: - out[name] = { - type: SHORT_TAG, - value: headers.getInt16(position, false), - }; - position += 2; - break; - case 4: - out[name] = { - type: INT_TAG, - value: headers.getInt32(position, false), - }; - position += 4; - break; - case 5: - out[name] = { - type: LONG_TAG, - value: new Int64_1.Int64(new Uint8Array(headers.buffer, headers.byteOffset + position, 8)), - }; - position += 8; - break; - case 6: - const binaryLength = headers.getUint16(position, false); - position += 2; - out[name] = { - type: BINARY_TAG, - value: new Uint8Array(headers.buffer, headers.byteOffset + position, binaryLength), - }; - position += binaryLength; - break; - case 7: - const stringLength = headers.getUint16(position, false); - position += 2; - out[name] = { - type: STRING_TAG, - value: this.toUtf8(new Uint8Array(headers.buffer, headers.byteOffset + position, stringLength)), - }; - position += stringLength; - break; - case 8: - out[name] = { - type: TIMESTAMP_TAG, - value: new Date(new Int64_1.Int64(new Uint8Array(headers.buffer, headers.byteOffset + position, 8)).valueOf()), - }; - position += 8; - break; - case 9: - const uuidBytes = new Uint8Array(headers.buffer, headers.byteOffset + position, 16); - position += 16; - out[name] = { - type: UUID_TAG, - value: `${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(0, 4))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(4, 6))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(6, 8))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(8, 10))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(10))}`, - }; - break; - default: - throw new Error(`Unrecognized header type tag`); - } - } - return out; - } -} -exports.HeaderMarshaller = HeaderMarshaller; -var HEADER_VALUE_TYPE; -(function (HEADER_VALUE_TYPE) { - HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["boolTrue"] = 0] = "boolTrue"; - HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["boolFalse"] = 1] = "boolFalse"; - HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["byte"] = 2] = "byte"; - HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["short"] = 3] = "short"; - HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["integer"] = 4] = "integer"; - HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["long"] = 5] = "long"; - HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["byteArray"] = 6] = "byteArray"; - HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["string"] = 7] = "string"; - HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["timestamp"] = 8] = "timestamp"; - HEADER_VALUE_TYPE[HEADER_VALUE_TYPE["uuid"] = 9] = "uuid"; -})(HEADER_VALUE_TYPE || (HEADER_VALUE_TYPE = {})); -const BOOLEAN_TAG = "boolean"; -const BYTE_TAG = "byte"; -const SHORT_TAG = "short"; -const INT_TAG = "integer"; -const LONG_TAG = "long"; -const BINARY_TAG = "binary"; -const STRING_TAG = "string"; -const TIMESTAMP_TAG = "timestamp"; -const UUID_TAG = "uuid"; -const UUID_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/; +exports.AdaptiveRetryStrategy = void 0; +const util_retry_1 = __nccwpck_require__(84902); +const StandardRetryStrategy_1 = __nccwpck_require__(94582); +class AdaptiveRetryStrategy extends StandardRetryStrategy_1.StandardRetryStrategy { + constructor(maxAttemptsProvider, options) { + const { rateLimiter, ...superOptions } = options !== null && options !== void 0 ? options : {}; + super(maxAttemptsProvider, superOptions); + this.rateLimiter = rateLimiter !== null && rateLimiter !== void 0 ? rateLimiter : new util_retry_1.DefaultRateLimiter(); + this.mode = util_retry_1.RETRY_MODES.ADAPTIVE; + } + async retry(next, args) { + return super.retry(next, args, { + beforeRequest: async () => { + return this.rateLimiter.getSendToken(); + }, + afterRequest: (response) => { + this.rateLimiter.updateClientSendingRate(response); + }, + }); + } +} +exports.AdaptiveRetryStrategy = AdaptiveRetryStrategy; /***/ }), -/***/ 46086: +/***/ 94582: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Int64 = void 0; -const util_hex_encoding_1 = __nccwpck_require__(45364); -class Int64 { - constructor(bytes) { - this.bytes = bytes; - if (bytes.byteLength !== 8) { - throw new Error("Int64 buffers must be exactly 8 bytes"); - } +exports.StandardRetryStrategy = void 0; +const protocol_http_1 = __nccwpck_require__(64418); +const service_error_classification_1 = __nccwpck_require__(6375); +const util_retry_1 = __nccwpck_require__(84902); +const uuid_1 = __nccwpck_require__(75840); +const defaultRetryQuota_1 = __nccwpck_require__(29991); +const delayDecider_1 = __nccwpck_require__(9465); +const retryDecider_1 = __nccwpck_require__(67653); +const util_1 = __nccwpck_require__(42827); +class StandardRetryStrategy { + constructor(maxAttemptsProvider, options) { + var _a, _b, _c; + this.maxAttemptsProvider = maxAttemptsProvider; + this.mode = util_retry_1.RETRY_MODES.STANDARD; + this.retryDecider = (_a = options === null || options === void 0 ? void 0 : options.retryDecider) !== null && _a !== void 0 ? _a : retryDecider_1.defaultRetryDecider; + this.delayDecider = (_b = options === null || options === void 0 ? void 0 : options.delayDecider) !== null && _b !== void 0 ? _b : delayDecider_1.defaultDelayDecider; + this.retryQuota = (_c = options === null || options === void 0 ? void 0 : options.retryQuota) !== null && _c !== void 0 ? _c : (0, defaultRetryQuota_1.getDefaultRetryQuota)(util_retry_1.INITIAL_RETRY_TOKENS); } - static fromNumber(number) { - if (number > 9223372036854776000 || number < -9223372036854776000) { - throw new Error(`${number} is too large (or, if negative, too small) to represent as an Int64`); - } - const bytes = new Uint8Array(8); - for (let i = 7, remaining = Math.abs(Math.round(number)); i > -1 && remaining > 0; i--, remaining /= 256) { - bytes[i] = remaining; + shouldRetry(error, attempts, maxAttempts) { + return attempts < maxAttempts && this.retryDecider(error) && this.retryQuota.hasRetryTokens(error); + } + async getMaxAttempts() { + let maxAttempts; + try { + maxAttempts = await this.maxAttemptsProvider(); } - if (number < 0) { - negate(bytes); + catch (error) { + maxAttempts = util_retry_1.DEFAULT_MAX_ATTEMPTS; } - return new Int64(bytes); + return maxAttempts; } - valueOf() { - const bytes = this.bytes.slice(0); - const negative = bytes[0] & 0b10000000; - if (negative) { - negate(bytes); + async retry(next, args, options) { + let retryTokenAmount; + let attempts = 0; + let totalDelay = 0; + const maxAttempts = await this.getMaxAttempts(); + const { request } = args; + if (protocol_http_1.HttpRequest.isInstance(request)) { + request.headers[util_retry_1.INVOCATION_ID_HEADER] = (0, uuid_1.v4)(); + } + while (true) { + try { + if (protocol_http_1.HttpRequest.isInstance(request)) { + request.headers[util_retry_1.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`; + } + if (options === null || options === void 0 ? void 0 : options.beforeRequest) { + await options.beforeRequest(); + } + const { response, output } = await next(args); + if (options === null || options === void 0 ? void 0 : options.afterRequest) { + options.afterRequest(response); + } + this.retryQuota.releaseRetryTokens(retryTokenAmount); + output.$metadata.attempts = attempts + 1; + output.$metadata.totalRetryDelay = totalDelay; + return { response, output }; + } + catch (e) { + const err = (0, util_1.asSdkError)(e); + attempts++; + if (this.shouldRetry(err, attempts, maxAttempts)) { + retryTokenAmount = this.retryQuota.retrieveRetryTokens(err); + const delayFromDecider = this.delayDecider((0, service_error_classification_1.isThrottlingError)(err) ? util_retry_1.THROTTLING_RETRY_DELAY_BASE : util_retry_1.DEFAULT_RETRY_DELAY_BASE, attempts); + const delayFromResponse = getDelayFromRetryAfterHeader(err.$response); + const delay = Math.max(delayFromResponse || 0, delayFromDecider); + totalDelay += delay; + await new Promise((resolve) => setTimeout(resolve, delay)); + continue; + } + if (!err.$metadata) { + err.$metadata = {}; + } + err.$metadata.attempts = attempts; + err.$metadata.totalRetryDelay = totalDelay; + throw err; + } } - return parseInt((0, util_hex_encoding_1.toHex)(bytes), 16) * (negative ? -1 : 1); - } - toString() { - return String(this.valueOf()); - } -} -exports.Int64 = Int64; -function negate(bytes) { - for (let i = 0; i < 8; i++) { - bytes[i] ^= 0xff; - } - for (let i = 7; i > -1; i--) { - bytes[i]++; - if (bytes[i] !== 0) - break; } } +exports.StandardRetryStrategy = StandardRetryStrategy; +const getDelayFromRetryAfterHeader = (response) => { + if (!protocol_http_1.HttpResponse.isInstance(response)) + return; + const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === "retry-after"); + if (!retryAfterHeaderName) + return; + const retryAfter = response.headers[retryAfterHeaderName]; + const retryAfterSeconds = Number(retryAfter); + if (!Number.isNaN(retryAfterSeconds)) + return retryAfterSeconds * 1000; + const retryAfterDate = new Date(retryAfter); + return retryAfterDate.getTime() - Date.now(); +}; /***/ }), -/***/ 73684: -/***/ ((__unused_webpack_module, exports) => { +/***/ 58709: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NODE_RETRY_MODE_CONFIG_OPTIONS = exports.CONFIG_RETRY_MODE = exports.ENV_RETRY_MODE = exports.resolveRetryConfig = exports.NODE_MAX_ATTEMPT_CONFIG_OPTIONS = exports.CONFIG_MAX_ATTEMPTS = exports.ENV_MAX_ATTEMPTS = void 0; +const util_middleware_1 = __nccwpck_require__(2390); +const util_retry_1 = __nccwpck_require__(84902); +exports.ENV_MAX_ATTEMPTS = "AWS_MAX_ATTEMPTS"; +exports.CONFIG_MAX_ATTEMPTS = "max_attempts"; +exports.NODE_MAX_ATTEMPT_CONFIG_OPTIONS = { + environmentVariableSelector: (env) => { + const value = env[exports.ENV_MAX_ATTEMPTS]; + if (!value) + return undefined; + const maxAttempt = parseInt(value); + if (Number.isNaN(maxAttempt)) { + throw new Error(`Environment variable ${exports.ENV_MAX_ATTEMPTS} mast be a number, got "${value}"`); + } + return maxAttempt; + }, + configFileSelector: (profile) => { + const value = profile[exports.CONFIG_MAX_ATTEMPTS]; + if (!value) + return undefined; + const maxAttempt = parseInt(value); + if (Number.isNaN(maxAttempt)) { + throw new Error(`Shared config file entry ${exports.CONFIG_MAX_ATTEMPTS} mast be a number, got "${value}"`); + } + return maxAttempt; + }, + default: util_retry_1.DEFAULT_MAX_ATTEMPTS, +}; +const resolveRetryConfig = (input) => { + var _a; + const { retryStrategy } = input; + const maxAttempts = (0, util_middleware_1.normalizeProvider)((_a = input.maxAttempts) !== null && _a !== void 0 ? _a : util_retry_1.DEFAULT_MAX_ATTEMPTS); + return { + ...input, + maxAttempts, + retryStrategy: async () => { + if (retryStrategy) { + return retryStrategy; + } + const retryMode = await (0, util_middleware_1.normalizeProvider)(input.retryMode)(); + if (retryMode === util_retry_1.RETRY_MODES.ADAPTIVE) { + return new util_retry_1.AdaptiveRetryStrategy(maxAttempts); + } + return new util_retry_1.StandardRetryStrategy(maxAttempts); + }, + }; +}; +exports.resolveRetryConfig = resolveRetryConfig; +exports.ENV_RETRY_MODE = "AWS_RETRY_MODE"; +exports.CONFIG_RETRY_MODE = "retry_mode"; +exports.NODE_RETRY_MODE_CONFIG_OPTIONS = { + environmentVariableSelector: (env) => env[exports.ENV_RETRY_MODE], + configFileSelector: (profile) => profile[exports.CONFIG_RETRY_MODE], + default: util_retry_1.DEFAULT_RETRY_MODE, +}; /***/ }), -/***/ 57255: -/***/ ((__unused_webpack_module, exports) => { +/***/ 29991: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.MessageDecoderStream = void 0; -class MessageDecoderStream { - constructor(options) { - this.options = options; - } - [Symbol.asyncIterator]() { - return this.asyncIterator(); - } - async *asyncIterator() { - for await (const bytes of this.options.inputStream) { - const decoded = this.options.decoder.decode(bytes); - yield decoded; +exports.getDefaultRetryQuota = void 0; +const util_retry_1 = __nccwpck_require__(84902); +const getDefaultRetryQuota = (initialRetryTokens, options) => { + var _a, _b, _c; + const MAX_CAPACITY = initialRetryTokens; + const noRetryIncrement = (_a = options === null || options === void 0 ? void 0 : options.noRetryIncrement) !== null && _a !== void 0 ? _a : util_retry_1.NO_RETRY_INCREMENT; + const retryCost = (_b = options === null || options === void 0 ? void 0 : options.retryCost) !== null && _b !== void 0 ? _b : util_retry_1.RETRY_COST; + const timeoutRetryCost = (_c = options === null || options === void 0 ? void 0 : options.timeoutRetryCost) !== null && _c !== void 0 ? _c : util_retry_1.TIMEOUT_RETRY_COST; + let availableCapacity = initialRetryTokens; + const getCapacityAmount = (error) => (error.name === "TimeoutError" ? timeoutRetryCost : retryCost); + const hasRetryTokens = (error) => getCapacityAmount(error) <= availableCapacity; + const retrieveRetryTokens = (error) => { + if (!hasRetryTokens(error)) { + throw new Error("No retry token available"); } - } -} -exports.MessageDecoderStream = MessageDecoderStream; + const capacityAmount = getCapacityAmount(error); + availableCapacity -= capacityAmount; + return capacityAmount; + }; + const releaseRetryTokens = (capacityReleaseAmount) => { + availableCapacity += capacityReleaseAmount !== null && capacityReleaseAmount !== void 0 ? capacityReleaseAmount : noRetryIncrement; + availableCapacity = Math.min(availableCapacity, MAX_CAPACITY); + }; + return Object.freeze({ + hasRetryTokens, + retrieveRetryTokens, + releaseRetryTokens, + }); +}; +exports.getDefaultRetryQuota = getDefaultRetryQuota; /***/ }), -/***/ 52362: -/***/ ((__unused_webpack_module, exports) => { +/***/ 9465: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.MessageEncoderStream = void 0; -class MessageEncoderStream { - constructor(options) { - this.options = options; - } - [Symbol.asyncIterator]() { - return this.asyncIterator(); - } - async *asyncIterator() { - for await (const msg of this.options.messageStream) { - const encoded = this.options.encoder.encode(msg); - yield encoded; - } - if (this.options.includeEndFrame) { - yield new Uint8Array(0); - } - } -} -exports.MessageEncoderStream = MessageEncoderStream; +exports.defaultDelayDecider = void 0; +const util_retry_1 = __nccwpck_require__(84902); +const defaultDelayDecider = (delayBase, attempts) => Math.floor(Math.min(util_retry_1.MAXIMUM_RETRY_DELAY, Math.random() * 2 ** attempts * delayBase)); +exports.defaultDelayDecider = defaultDelayDecider; /***/ }), -/***/ 62379: -/***/ ((__unused_webpack_module, exports) => { +/***/ 96039: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SmithyMessageDecoderStream = void 0; -class SmithyMessageDecoderStream { - constructor(options) { - this.options = options; - } - [Symbol.asyncIterator]() { - return this.asyncIterator(); - } - async *asyncIterator() { - for await (const message of this.options.messageStream) { - const deserialized = await this.options.deserializer(message); - if (deserialized === undefined) - continue; - yield deserialized; - } - } -} -exports.SmithyMessageDecoderStream = SmithyMessageDecoderStream; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(80155), exports); +tslib_1.__exportStar(__nccwpck_require__(94582), exports); +tslib_1.__exportStar(__nccwpck_require__(58709), exports); +tslib_1.__exportStar(__nccwpck_require__(9465), exports); +tslib_1.__exportStar(__nccwpck_require__(76556), exports); +tslib_1.__exportStar(__nccwpck_require__(67653), exports); +tslib_1.__exportStar(__nccwpck_require__(81434), exports); /***/ }), -/***/ 12484: -/***/ ((__unused_webpack_module, exports) => { +/***/ 76556: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SmithyMessageEncoderStream = void 0; -class SmithyMessageEncoderStream { - constructor(options) { - this.options = options; - } - [Symbol.asyncIterator]() { - return this.asyncIterator(); - } - async *asyncIterator() { - for await (const chunk of this.options.inputStream) { - const payloadBuf = this.options.serializer(chunk); - yield payloadBuf; - } +exports.getOmitRetryHeadersPlugin = exports.omitRetryHeadersMiddlewareOptions = exports.omitRetryHeadersMiddleware = void 0; +const protocol_http_1 = __nccwpck_require__(64418); +const util_retry_1 = __nccwpck_require__(84902); +const omitRetryHeadersMiddleware = () => (next) => async (args) => { + const { request } = args; + if (protocol_http_1.HttpRequest.isInstance(request)) { + delete request.headers[util_retry_1.INVOCATION_ID_HEADER]; + delete request.headers[util_retry_1.REQUEST_HEADER]; } -} -exports.SmithyMessageEncoderStream = SmithyMessageEncoderStream; + return next(args); +}; +exports.omitRetryHeadersMiddleware = omitRetryHeadersMiddleware; +exports.omitRetryHeadersMiddlewareOptions = { + name: "omitRetryHeadersMiddleware", + tags: ["RETRY", "HEADERS", "OMIT_RETRY_HEADERS"], + relation: "before", + toMiddleware: "awsAuthMiddleware", + override: true, +}; +const getOmitRetryHeadersPlugin = (options) => ({ + applyToStack: (clientStack) => { + clientStack.addRelativeTo((0, exports.omitRetryHeadersMiddleware)(), exports.omitRetryHeadersMiddlewareOptions); + }, +}); +exports.getOmitRetryHeadersPlugin = getOmitRetryHeadersPlugin; /***/ }), -/***/ 56459: +/***/ 67653: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(11014), exports); -tslib_1.__exportStar(__nccwpck_require__(74712), exports); -tslib_1.__exportStar(__nccwpck_require__(46086), exports); -tslib_1.__exportStar(__nccwpck_require__(73684), exports); -tslib_1.__exportStar(__nccwpck_require__(57255), exports); -tslib_1.__exportStar(__nccwpck_require__(52362), exports); -tslib_1.__exportStar(__nccwpck_require__(62379), exports); -tslib_1.__exportStar(__nccwpck_require__(12484), exports); +exports.defaultRetryDecider = void 0; +const service_error_classification_1 = __nccwpck_require__(6375); +const defaultRetryDecider = (error) => { + if (!error) { + return false; + } + return (0, service_error_classification_1.isRetryableByTrait)(error) || (0, service_error_classification_1.isClockSkewError)(error) || (0, service_error_classification_1.isThrottlingError)(error) || (0, service_error_classification_1.isTransientError)(error); +}; +exports.defaultRetryDecider = defaultRetryDecider; /***/ }), -/***/ 20597: +/***/ 81434: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.splitMessage = void 0; -const crc32_1 = __nccwpck_require__(47327); -const PRELUDE_MEMBER_LENGTH = 4; -const PRELUDE_LENGTH = PRELUDE_MEMBER_LENGTH * 2; -const CHECKSUM_LENGTH = 4; -const MINIMUM_MESSAGE_LENGTH = PRELUDE_LENGTH + CHECKSUM_LENGTH * 2; -function splitMessage({ byteLength, byteOffset, buffer }) { - if (byteLength < MINIMUM_MESSAGE_LENGTH) { - throw new Error("Provided message too short to accommodate event stream message overhead"); - } - const view = new DataView(buffer, byteOffset, byteLength); - const messageLength = view.getUint32(0, false); - if (byteLength !== messageLength) { - throw new Error("Reported message length does not match received message length"); - } - const headerLength = view.getUint32(PRELUDE_MEMBER_LENGTH, false); - const expectedPreludeChecksum = view.getUint32(PRELUDE_LENGTH, false); - const expectedMessageChecksum = view.getUint32(byteLength - CHECKSUM_LENGTH, false); - const checksummer = new crc32_1.Crc32().update(new Uint8Array(buffer, byteOffset, PRELUDE_LENGTH)); - if (expectedPreludeChecksum !== checksummer.digest()) { - throw new Error(`The prelude checksum specified in the message (${expectedPreludeChecksum}) does not match the calculated CRC32 checksum (${checksummer.digest()})`); +exports.getRetryAfterHint = exports.getRetryPlugin = exports.retryMiddlewareOptions = exports.retryMiddleware = void 0; +const protocol_http_1 = __nccwpck_require__(64418); +const service_error_classification_1 = __nccwpck_require__(6375); +const util_retry_1 = __nccwpck_require__(84902); +const uuid_1 = __nccwpck_require__(75840); +const util_1 = __nccwpck_require__(42827); +const retryMiddleware = (options) => (next, context) => async (args) => { + let retryStrategy = await options.retryStrategy(); + const maxAttempts = await options.maxAttempts(); + if (isRetryStrategyV2(retryStrategy)) { + retryStrategy = retryStrategy; + let retryToken = await retryStrategy.acquireInitialRetryToken(context["partition_id"]); + let lastError = new Error(); + let attempts = 0; + let totalRetryDelay = 0; + const { request } = args; + if (protocol_http_1.HttpRequest.isInstance(request)) { + request.headers[util_retry_1.INVOCATION_ID_HEADER] = (0, uuid_1.v4)(); + } + while (true) { + try { + if (protocol_http_1.HttpRequest.isInstance(request)) { + request.headers[util_retry_1.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`; + } + const { response, output } = await next(args); + retryStrategy.recordSuccess(retryToken); + output.$metadata.attempts = attempts + 1; + output.$metadata.totalRetryDelay = totalRetryDelay; + return { response, output }; + } + catch (e) { + const retryErrorInfo = getRetryErrorInfo(e); + lastError = (0, util_1.asSdkError)(e); + try { + retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo); + } + catch (refreshError) { + if (!lastError.$metadata) { + lastError.$metadata = {}; + } + lastError.$metadata.attempts = attempts + 1; + lastError.$metadata.totalRetryDelay = totalRetryDelay; + throw lastError; + } + attempts = retryToken.getRetryCount(); + const delay = retryToken.getRetryDelay(); + totalRetryDelay += delay; + await new Promise((resolve) => setTimeout(resolve, delay)); + } + } } - checksummer.update(new Uint8Array(buffer, byteOffset + PRELUDE_LENGTH, byteLength - (PRELUDE_LENGTH + CHECKSUM_LENGTH))); - if (expectedMessageChecksum !== checksummer.digest()) { - throw new Error(`The message checksum (${checksummer.digest()}) did not match the expected value of ${expectedMessageChecksum}`); + else { + retryStrategy = retryStrategy; + if (retryStrategy === null || retryStrategy === void 0 ? void 0 : retryStrategy.mode) + context.userAgent = [...(context.userAgent || []), ["cfg/retry-mode", retryStrategy.mode]]; + return retryStrategy.retry(next, args); } - return { - headers: new DataView(buffer, byteOffset + PRELUDE_LENGTH + CHECKSUM_LENGTH, headerLength), - body: new Uint8Array(buffer, byteOffset + PRELUDE_LENGTH + CHECKSUM_LENGTH + headerLength, messageLength - headerLength - (PRELUDE_LENGTH + CHECKSUM_LENGTH + CHECKSUM_LENGTH)), +}; +exports.retryMiddleware = retryMiddleware; +const isRetryStrategyV2 = (retryStrategy) => typeof retryStrategy.acquireInitialRetryToken !== "undefined" && + typeof retryStrategy.refreshRetryTokenForRetry !== "undefined" && + typeof retryStrategy.recordSuccess !== "undefined"; +const getRetryErrorInfo = (error) => { + const errorInfo = { + errorType: getRetryErrorType(error), }; -} -exports.splitMessage = splitMessage; + const retryAfterHint = (0, exports.getRetryAfterHint)(error.$response); + if (retryAfterHint) { + errorInfo.retryAfterHint = retryAfterHint; + } + return errorInfo; +}; +const getRetryErrorType = (error) => { + if ((0, service_error_classification_1.isThrottlingError)(error)) + return "THROTTLING"; + if ((0, service_error_classification_1.isTransientError)(error)) + return "TRANSIENT"; + if ((0, service_error_classification_1.isServerError)(error)) + return "SERVER_ERROR"; + return "CLIENT_ERROR"; +}; +exports.retryMiddlewareOptions = { + name: "retryMiddleware", + tags: ["RETRY"], + step: "finalizeRequest", + priority: "high", + override: true, +}; +const getRetryPlugin = (options) => ({ + applyToStack: (clientStack) => { + clientStack.add((0, exports.retryMiddleware)(options), exports.retryMiddlewareOptions); + }, +}); +exports.getRetryPlugin = getRetryPlugin; +const getRetryAfterHint = (response) => { + if (!protocol_http_1.HttpResponse.isInstance(response)) + return; + const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === "retry-after"); + if (!retryAfterHeaderName) + return; + const retryAfter = response.headers[retryAfterHeaderName]; + const retryAfterSeconds = Number(retryAfter); + if (!Number.isNaN(retryAfterSeconds)) + return new Date(retryAfterSeconds * 1000); + const retryAfterDate = new Date(retryAfter); + return retryAfterDate; +}; +exports.getRetryAfterHint = getRetryAfterHint; + + +/***/ }), + +/***/ 42827: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.asSdkError = void 0; +const asSdkError = (error) => { + if (error instanceof Error) + return error; + if (error instanceof Object) + return Object.assign(new Error(), error); + if (typeof error === "string") + return new Error(error); + return new Error(`AWS SDK error wrapper for ${error}`); +}; +exports.asSdkError = asSdkError; /***/ }), -/***/ 3081: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 21595: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Hash = void 0; -const util_buffer_from_1 = __nccwpck_require__(31381); -const util_utf8_1 = __nccwpck_require__(41895); -const buffer_1 = __nccwpck_require__(14300); -const crypto_1 = __nccwpck_require__(6113); -class Hash { - constructor(algorithmIdentifier, secret) { - this.algorithmIdentifier = algorithmIdentifier; - this.secret = secret; - this.reset(); - } - update(toHash, encoding) { - this.hash.update((0, util_utf8_1.toUint8Array)(castSourceData(toHash, encoding))); - } - digest() { - return Promise.resolve(this.hash.digest()); - } - reset() { - this.hash = this.secret - ? (0, crypto_1.createHmac)(this.algorithmIdentifier, castSourceData(this.secret)) - : (0, crypto_1.createHash)(this.algorithmIdentifier); - } -} -exports.Hash = Hash; -function castSourceData(toCast, encoding) { - if (buffer_1.Buffer.isBuffer(toCast)) { - return toCast; - } - if (typeof toCast === "string") { - return (0, util_buffer_from_1.fromString)(toCast, encoding); +exports.deserializerMiddleware = void 0; +const deserializerMiddleware = (options, deserializer) => (next, context) => async (args) => { + const { response } = await next(args); + try { + const parsed = await deserializer(response, options); + return { + response, + output: parsed, + }; } - if (ArrayBuffer.isView(toCast)) { - return (0, util_buffer_from_1.fromArrayBuffer)(toCast.buffer, toCast.byteOffset, toCast.byteLength); + catch (error) { + Object.defineProperty(error, "$response", { + value: response, + }); + if (!("$metadata" in error)) { + const hint = `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.`; + error.message += "\n " + hint; + } + throw error; } - return (0, util_buffer_from_1.fromArrayBuffer)(toCast); -} +}; +exports.deserializerMiddleware = deserializerMiddleware; /***/ }), -/***/ 10780: -/***/ ((__unused_webpack_module, exports) => { +/***/ 81238: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isArrayBuffer = void 0; -const isArrayBuffer = (arg) => (typeof ArrayBuffer === "function" && arg instanceof ArrayBuffer) || - Object.prototype.toString.call(arg) === "[object ArrayBuffer]"; -exports.isArrayBuffer = isArrayBuffer; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(21595), exports); +tslib_1.__exportStar(__nccwpck_require__(72338), exports); +tslib_1.__exportStar(__nccwpck_require__(23566), exports); /***/ }), -/***/ 82800: +/***/ 72338: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getContentLengthPlugin = exports.contentLengthMiddlewareOptions = exports.contentLengthMiddleware = void 0; -const protocol_http_1 = __nccwpck_require__(64418); -const CONTENT_LENGTH_HEADER = "content-length"; -function contentLengthMiddleware(bodyLengthChecker) { - return (next) => async (args) => { - const request = args.request; - if (protocol_http_1.HttpRequest.isInstance(request)) { - const { body, headers } = request; - if (body && - Object.keys(headers) - .map((str) => str.toLowerCase()) - .indexOf(CONTENT_LENGTH_HEADER) === -1) { - try { - const length = bodyLengthChecker(body); - request.headers = { - ...request.headers, - [CONTENT_LENGTH_HEADER]: String(length), - }; - } - catch (error) { - } - } - } - return next({ - ...args, - request, - }); - }; -} -exports.contentLengthMiddleware = contentLengthMiddleware; -exports.contentLengthMiddlewareOptions = { - step: "build", - tags: ["SET_CONTENT_LENGTH", "CONTENT_LENGTH"], - name: "contentLengthMiddleware", +exports.getSerdePlugin = exports.serializerMiddlewareOption = exports.deserializerMiddlewareOption = void 0; +const deserializerMiddleware_1 = __nccwpck_require__(21595); +const serializerMiddleware_1 = __nccwpck_require__(23566); +exports.deserializerMiddlewareOption = { + name: "deserializerMiddleware", + step: "deserialize", + tags: ["DESERIALIZER"], override: true, }; -const getContentLengthPlugin = (options) => ({ - applyToStack: (clientStack) => { - clientStack.add(contentLengthMiddleware(options.bodyLengthChecker), exports.contentLengthMiddlewareOptions); - }, -}); -exports.getContentLengthPlugin = getContentLengthPlugin; +exports.serializerMiddlewareOption = { + name: "serializerMiddleware", + step: "serialize", + tags: ["SERIALIZER"], + override: true, +}; +function getSerdePlugin(config, serializer, deserializer) { + return { + applyToStack: (commandStack) => { + commandStack.add((0, deserializerMiddleware_1.deserializerMiddleware)(config, deserializer), exports.deserializerMiddlewareOption); + commandStack.add((0, serializerMiddleware_1.serializerMiddleware)(config, serializer), exports.serializerMiddlewareOption); + }, + }; +} +exports.getSerdePlugin = getSerdePlugin; /***/ }), -/***/ 465: +/***/ 23566: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.createConfigValueProvider = void 0; -const createConfigValueProvider = (configKey, canonicalEndpointParamKey, config) => { - const configProvider = async () => { - var _a; - const configValue = (_a = config[configKey]) !== null && _a !== void 0 ? _a : config[canonicalEndpointParamKey]; - if (typeof configValue === "function") { - return configValue(); - } - return configValue; - }; - if (configKey === "endpoint" || canonicalEndpointParamKey === "endpoint") { - return async () => { - const endpoint = await configProvider(); - if (endpoint && typeof endpoint === "object") { - if ("url" in endpoint) { - return endpoint.url.href; - } - if ("hostname" in endpoint) { - const { protocol, hostname, port, path } = endpoint; - return `${protocol}//${hostname}${port ? ":" + port : ""}${path}`; - } - } - return endpoint; - }; +exports.serializerMiddleware = void 0; +const serializerMiddleware = (options, serializer) => (next, context) => async (args) => { + var _a; + const endpoint = ((_a = context.endpointV2) === null || _a === void 0 ? void 0 : _a.url) && options.urlParser + ? async () => options.urlParser(context.endpointV2.url) + : options.endpoint; + if (!endpoint) { + throw new Error("No valid endpoint provider available."); } - return configProvider; + const request = await serializer(args.input, { ...options, endpoint }); + return next({ + ...args, + request, + }); }; -exports.createConfigValueProvider = createConfigValueProvider; - - -/***/ }), - -/***/ 31518: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getEndpointFromConfig = void 0; -const node_config_provider_1 = __nccwpck_require__(33461); -const getEndpointUrlConfig_1 = __nccwpck_require__(7574); -const getEndpointFromConfig = async (serviceId) => (0, node_config_provider_1.loadConfig)((0, getEndpointUrlConfig_1.getEndpointUrlConfig)(serviceId))(); -exports.getEndpointFromConfig = getEndpointFromConfig; +exports.serializerMiddleware = serializerMiddleware; /***/ }), -/***/ 73929: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 2404: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveParams = exports.getEndpointFromInstructions = void 0; -const service_customizations_1 = __nccwpck_require__(13105); -const createConfigValueProvider_1 = __nccwpck_require__(465); -const getEndpointFromConfig_1 = __nccwpck_require__(31518); -const toEndpointV1_1 = __nccwpck_require__(38938); -const getEndpointFromInstructions = async (commandInput, instructionsSupplier, clientConfig, context) => { - if (!clientConfig.endpoint) { - const endpointFromConfig = await (0, getEndpointFromConfig_1.getEndpointFromConfig)(clientConfig.serviceId || ""); - if (endpointFromConfig) { - clientConfig.endpoint = () => Promise.resolve((0, toEndpointV1_1.toEndpointV1)(endpointFromConfig)); - } - } - const endpointParams = await (0, exports.resolveParams)(commandInput, instructionsSupplier, clientConfig); - if (typeof clientConfig.endpointProvider !== "function") { - throw new Error("config.endpointProvider is not set."); +exports.constructStack = void 0; +const getAllAliases = (name, aliases) => { + const _aliases = []; + if (name) { + _aliases.push(name); } - const endpoint = clientConfig.endpointProvider(endpointParams, context); - return endpoint; -}; -exports.getEndpointFromInstructions = getEndpointFromInstructions; -const resolveParams = async (commandInput, instructionsSupplier, clientConfig) => { - var _a; - const endpointParams = {}; - const instructions = ((_a = instructionsSupplier === null || instructionsSupplier === void 0 ? void 0 : instructionsSupplier.getEndpointParameterInstructions) === null || _a === void 0 ? void 0 : _a.call(instructionsSupplier)) || {}; - for (const [name, instruction] of Object.entries(instructions)) { - switch (instruction.type) { - case "staticContextParams": - endpointParams[name] = instruction.value; - break; - case "contextParams": - endpointParams[name] = commandInput[instruction.name]; - break; - case "clientContextParams": - case "builtInParams": - endpointParams[name] = await (0, createConfigValueProvider_1.createConfigValueProvider)(instruction.name, name, clientConfig)(); - break; - default: - throw new Error("Unrecognized endpoint parameter instruction: " + JSON.stringify(instruction)); + if (aliases) { + for (const alias of aliases) { + _aliases.push(alias); } } - if (Object.keys(instructions).length === 0) { - Object.assign(endpointParams, clientConfig); - } - if (String(clientConfig.serviceId).toLowerCase() === "s3") { - await (0, service_customizations_1.resolveParamsForS3)(endpointParams); - } - return endpointParams; + return _aliases; +}; +const getMiddlewareNameWithAliases = (name, aliases) => { + return `${name || "anonymous"}${aliases && aliases.length > 0 ? ` (a.k.a. ${aliases.join(",")})` : ""}`; +}; +const constructStack = () => { + let absoluteEntries = []; + let relativeEntries = []; + let identifyOnResolve = false; + const entriesNameSet = new Set(); + const sort = (entries) => entries.sort((a, b) => stepWeights[b.step] - stepWeights[a.step] || + priorityWeights[b.priority || "normal"] - priorityWeights[a.priority || "normal"]); + const removeByName = (toRemove) => { + let isRemoved = false; + const filterCb = (entry) => { + const aliases = getAllAliases(entry.name, entry.aliases); + if (aliases.includes(toRemove)) { + isRemoved = true; + for (const alias of aliases) { + entriesNameSet.delete(alias); + } + return false; + } + return true; + }; + absoluteEntries = absoluteEntries.filter(filterCb); + relativeEntries = relativeEntries.filter(filterCb); + return isRemoved; + }; + const removeByReference = (toRemove) => { + let isRemoved = false; + const filterCb = (entry) => { + if (entry.middleware === toRemove) { + isRemoved = true; + for (const alias of getAllAliases(entry.name, entry.aliases)) { + entriesNameSet.delete(alias); + } + return false; + } + return true; + }; + absoluteEntries = absoluteEntries.filter(filterCb); + relativeEntries = relativeEntries.filter(filterCb); + return isRemoved; + }; + const cloneTo = (toStack) => { + var _a; + absoluteEntries.forEach((entry) => { + toStack.add(entry.middleware, { ...entry }); + }); + relativeEntries.forEach((entry) => { + toStack.addRelativeTo(entry.middleware, { ...entry }); + }); + (_a = toStack.identifyOnResolve) === null || _a === void 0 ? void 0 : _a.call(toStack, stack.identifyOnResolve()); + return toStack; + }; + const expandRelativeMiddlewareList = (from) => { + const expandedMiddlewareList = []; + from.before.forEach((entry) => { + if (entry.before.length === 0 && entry.after.length === 0) { + expandedMiddlewareList.push(entry); + } + else { + expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry)); + } + }); + expandedMiddlewareList.push(from); + from.after.reverse().forEach((entry) => { + if (entry.before.length === 0 && entry.after.length === 0) { + expandedMiddlewareList.push(entry); + } + else { + expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry)); + } + }); + return expandedMiddlewareList; + }; + const getMiddlewareList = (debug = false) => { + const normalizedAbsoluteEntries = []; + const normalizedRelativeEntries = []; + const normalizedEntriesNameMap = {}; + absoluteEntries.forEach((entry) => { + const normalizedEntry = { + ...entry, + before: [], + after: [], + }; + for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) { + normalizedEntriesNameMap[alias] = normalizedEntry; + } + normalizedAbsoluteEntries.push(normalizedEntry); + }); + relativeEntries.forEach((entry) => { + const normalizedEntry = { + ...entry, + before: [], + after: [], + }; + for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) { + normalizedEntriesNameMap[alias] = normalizedEntry; + } + normalizedRelativeEntries.push(normalizedEntry); + }); + normalizedRelativeEntries.forEach((entry) => { + if (entry.toMiddleware) { + const toMiddleware = normalizedEntriesNameMap[entry.toMiddleware]; + if (toMiddleware === undefined) { + if (debug) { + return; + } + throw new Error(`${entry.toMiddleware} is not found when adding ` + + `${getMiddlewareNameWithAliases(entry.name, entry.aliases)} ` + + `middleware ${entry.relation} ${entry.toMiddleware}`); + } + if (entry.relation === "after") { + toMiddleware.after.push(entry); + } + if (entry.relation === "before") { + toMiddleware.before.push(entry); + } + } + }); + const mainChain = sort(normalizedAbsoluteEntries) + .map(expandRelativeMiddlewareList) + .reduce((wholeList, expandedMiddlewareList) => { + wholeList.push(...expandedMiddlewareList); + return wholeList; + }, []); + return mainChain; + }; + const stack = { + add: (middleware, options = {}) => { + const { name, override, aliases: _aliases } = options; + const entry = { + step: "initialize", + priority: "normal", + middleware, + ...options, + }; + const aliases = getAllAliases(name, _aliases); + if (aliases.length > 0) { + if (aliases.some((alias) => entriesNameSet.has(alias))) { + if (!override) + throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`); + for (const alias of aliases) { + const toOverrideIndex = absoluteEntries.findIndex((entry) => { var _a; return entry.name === alias || ((_a = entry.aliases) === null || _a === void 0 ? void 0 : _a.some((a) => a === alias)); }); + if (toOverrideIndex === -1) { + continue; + } + const toOverride = absoluteEntries[toOverrideIndex]; + if (toOverride.step !== entry.step || entry.priority !== toOverride.priority) { + throw new Error(`"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}" middleware with ` + + `${toOverride.priority} priority in ${toOverride.step} step cannot ` + + `be overridden by "${getMiddlewareNameWithAliases(name, _aliases)}" middleware with ` + + `${entry.priority} priority in ${entry.step} step.`); + } + absoluteEntries.splice(toOverrideIndex, 1); + } + } + for (const alias of aliases) { + entriesNameSet.add(alias); + } + } + absoluteEntries.push(entry); + }, + addRelativeTo: (middleware, options) => { + const { name, override, aliases: _aliases } = options; + const entry = { + middleware, + ...options, + }; + const aliases = getAllAliases(name, _aliases); + if (aliases.length > 0) { + if (aliases.some((alias) => entriesNameSet.has(alias))) { + if (!override) + throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`); + for (const alias of aliases) { + const toOverrideIndex = relativeEntries.findIndex((entry) => { var _a; return entry.name === alias || ((_a = entry.aliases) === null || _a === void 0 ? void 0 : _a.some((a) => a === alias)); }); + if (toOverrideIndex === -1) { + continue; + } + const toOverride = relativeEntries[toOverrideIndex]; + if (toOverride.toMiddleware !== entry.toMiddleware || toOverride.relation !== entry.relation) { + throw new Error(`"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}" middleware ` + + `${toOverride.relation} "${toOverride.toMiddleware}" middleware cannot be overridden ` + + `by "${getMiddlewareNameWithAliases(name, _aliases)}" middleware ${entry.relation} ` + + `"${entry.toMiddleware}" middleware.`); + } + relativeEntries.splice(toOverrideIndex, 1); + } + } + for (const alias of aliases) { + entriesNameSet.add(alias); + } + } + relativeEntries.push(entry); + }, + clone: () => cloneTo((0, exports.constructStack)()), + use: (plugin) => { + plugin.applyToStack(stack); + }, + remove: (toRemove) => { + if (typeof toRemove === "string") + return removeByName(toRemove); + else + return removeByReference(toRemove); + }, + removeByTag: (toRemove) => { + let isRemoved = false; + const filterCb = (entry) => { + const { tags, name, aliases: _aliases } = entry; + if (tags && tags.includes(toRemove)) { + const aliases = getAllAliases(name, _aliases); + for (const alias of aliases) { + entriesNameSet.delete(alias); + } + isRemoved = true; + return false; + } + return true; + }; + absoluteEntries = absoluteEntries.filter(filterCb); + relativeEntries = relativeEntries.filter(filterCb); + return isRemoved; + }, + concat: (from) => { + var _a, _b; + const cloned = cloneTo((0, exports.constructStack)()); + cloned.use(from); + cloned.identifyOnResolve(identifyOnResolve || cloned.identifyOnResolve() || ((_b = (_a = from.identifyOnResolve) === null || _a === void 0 ? void 0 : _a.call(from)) !== null && _b !== void 0 ? _b : false)); + return cloned; + }, + applyToStack: cloneTo, + identify: () => { + return getMiddlewareList(true).map((mw) => { + var _a; + const step = (_a = mw.step) !== null && _a !== void 0 ? _a : mw.relation + + " " + + mw.toMiddleware; + return getMiddlewareNameWithAliases(mw.name, mw.aliases) + " - " + step; + }); + }, + identifyOnResolve(toggle) { + if (typeof toggle === "boolean") + identifyOnResolve = toggle; + return identifyOnResolve; + }, + resolve: (handler, context) => { + for (const middleware of getMiddlewareList() + .map((entry) => entry.middleware) + .reverse()) { + handler = middleware(handler, context); + } + if (identifyOnResolve) { + console.log(stack.identify()); + } + return handler; + }, + }; + return stack; +}; +exports.constructStack = constructStack; +const stepWeights = { + initialize: 5, + serialize: 4, + build: 3, + finalizeRequest: 2, + deserialize: 1, +}; +const priorityWeights = { + high: 3, + normal: 2, + low: 1, }; -exports.resolveParams = resolveParams; /***/ }), -/***/ 7574: +/***/ 97911: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getEndpointUrlConfig = void 0; -const shared_ini_file_loader_1 = __nccwpck_require__(43507); -const ENV_ENDPOINT_URL = "AWS_ENDPOINT_URL"; -const CONFIG_ENDPOINT_URL = "endpoint_url"; -const getEndpointUrlConfig = (serviceId) => ({ - environmentVariableSelector: (env) => { - const serviceSuffixParts = serviceId.split(" ").map((w) => w.toUpperCase()); - const serviceEndpointUrl = env[[ENV_ENDPOINT_URL, ...serviceSuffixParts].join("_")]; - if (serviceEndpointUrl) - return serviceEndpointUrl; - const endpointUrl = env[ENV_ENDPOINT_URL]; - if (endpointUrl) - return endpointUrl; - return undefined; - }, - configFileSelector: (profile, config) => { - if (config && profile.services) { - const servicesSection = config[["services", profile.services].join(shared_ini_file_loader_1.CONFIG_PREFIX_SEPARATOR)]; - if (servicesSection) { - const servicePrefixParts = serviceId.split(" ").map((w) => w.toLowerCase()); - const endpointUrl = servicesSection[[servicePrefixParts.join("_"), CONFIG_ENDPOINT_URL].join(shared_ini_file_loader_1.CONFIG_PREFIX_SEPARATOR)]; - if (endpointUrl) - return endpointUrl; - } - } - const endpointUrl = profile[CONFIG_ENDPOINT_URL]; - if (endpointUrl) - return endpointUrl; - return undefined; - }, - default: undefined, -}); -exports.getEndpointUrlConfig = getEndpointUrlConfig; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(2404), exports); /***/ }), -/***/ 50890: +/***/ 54766: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(73929), exports); -tslib_1.__exportStar(__nccwpck_require__(38938), exports); +exports.loadConfig = void 0; +const property_provider_1 = __nccwpck_require__(79721); +const fromEnv_1 = __nccwpck_require__(15606); +const fromSharedConfigFiles_1 = __nccwpck_require__(45784); +const fromStatic_1 = __nccwpck_require__(23091); +const loadConfig = ({ environmentVariableSelector, configFileSelector, default: defaultValue }, configuration = {}) => (0, property_provider_1.memoize)((0, property_provider_1.chain)((0, fromEnv_1.fromEnv)(environmentVariableSelector), (0, fromSharedConfigFiles_1.fromSharedConfigFiles)(configFileSelector, configuration), (0, fromStatic_1.fromStatic)(defaultValue))); +exports.loadConfig = loadConfig; /***/ }), -/***/ 38938: +/***/ 15606: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.toEndpointV1 = void 0; -const url_parser_1 = __nccwpck_require__(14681); -const toEndpointV1 = (endpoint) => { - if (typeof endpoint === "object") { - if ("url" in endpoint) { - return (0, url_parser_1.parseUrl)(endpoint.url); +exports.fromEnv = void 0; +const property_provider_1 = __nccwpck_require__(79721); +const fromEnv = (envVarSelector) => async () => { + try { + const config = envVarSelector(process.env); + if (config === undefined) { + throw new Error(); } - return endpoint; + return config; + } + catch (e) { + throw new property_provider_1.CredentialsProviderError(e.message || `Cannot load config from environment variables with getter: ${envVarSelector}`); } - return (0, url_parser_1.parseUrl)(endpoint); }; -exports.toEndpointV1 = toEndpointV1; +exports.fromEnv = fromEnv; /***/ }), -/***/ 55520: +/***/ 45784: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.endpointMiddleware = void 0; -const getEndpointFromInstructions_1 = __nccwpck_require__(73929); -const endpointMiddleware = ({ config, instructions, }) => { - return (next, context) => async (args) => { - var _a, _b; - const endpoint = await (0, getEndpointFromInstructions_1.getEndpointFromInstructions)(args.input, { - getEndpointParameterInstructions() { - return instructions; - }, - }, { ...config }, context); - context.endpointV2 = endpoint; - context.authSchemes = (_a = endpoint.properties) === null || _a === void 0 ? void 0 : _a.authSchemes; - const authScheme = (_b = context.authSchemes) === null || _b === void 0 ? void 0 : _b[0]; - if (authScheme) { - context["signing_region"] = authScheme.signingRegion; - context["signing_service"] = authScheme.signingName; +exports.fromSharedConfigFiles = void 0; +const property_provider_1 = __nccwpck_require__(79721); +const shared_ini_file_loader_1 = __nccwpck_require__(43507); +const fromSharedConfigFiles = (configSelector, { preferredFile = "config", ...init } = {}) => async () => { + const profile = (0, shared_ini_file_loader_1.getProfileName)(init); + const { configFile, credentialsFile } = await (0, shared_ini_file_loader_1.loadSharedConfigFiles)(init); + const profileFromCredentials = credentialsFile[profile] || {}; + const profileFromConfig = configFile[profile] || {}; + const mergedProfile = preferredFile === "config" + ? { ...profileFromCredentials, ...profileFromConfig } + : { ...profileFromConfig, ...profileFromCredentials }; + try { + const cfgFile = preferredFile === "config" ? configFile : credentialsFile; + const configValue = configSelector(mergedProfile, cfgFile); + if (configValue === undefined) { + throw new Error(); } - return next({ - ...args, - }); - }; + return configValue; + } + catch (e) { + throw new property_provider_1.CredentialsProviderError(e.message || `Cannot load config for profile ${profile} in SDK configuration files with getter: ${configSelector}`); + } }; -exports.endpointMiddleware = endpointMiddleware; +exports.fromSharedConfigFiles = fromSharedConfigFiles; /***/ }), -/***/ 71329: +/***/ 23091: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getEndpointPlugin = exports.endpointMiddlewareOptions = void 0; -const middleware_serde_1 = __nccwpck_require__(81238); -const endpointMiddleware_1 = __nccwpck_require__(55520); -exports.endpointMiddlewareOptions = { - step: "serialize", - tags: ["ENDPOINT_PARAMETERS", "ENDPOINT_V2", "ENDPOINT"], - name: "endpointV2Middleware", - override: true, - relation: "before", - toMiddleware: middleware_serde_1.serializerMiddlewareOption.name, -}; -const getEndpointPlugin = (config, instructions) => ({ - applyToStack: (clientStack) => { - clientStack.addRelativeTo((0, endpointMiddleware_1.endpointMiddleware)({ - config, - instructions, - }), exports.endpointMiddlewareOptions); - }, -}); -exports.getEndpointPlugin = getEndpointPlugin; +exports.fromStatic = void 0; +const property_provider_1 = __nccwpck_require__(79721); +const isFunction = (func) => typeof func === "function"; +const fromStatic = (defaultValue) => isFunction(defaultValue) ? async () => await defaultValue() : (0, property_provider_1.fromStatic)(defaultValue); +exports.fromStatic = fromStatic; /***/ }), -/***/ 82918: +/***/ 33461: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(50890), exports); -tslib_1.__exportStar(__nccwpck_require__(55520), exports); -tslib_1.__exportStar(__nccwpck_require__(71329), exports); -tslib_1.__exportStar(__nccwpck_require__(74139), exports); -tslib_1.__exportStar(__nccwpck_require__(39720), exports); - - -/***/ }), - -/***/ 74139: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveEndpointConfig = void 0; -const util_middleware_1 = __nccwpck_require__(2390); -const toEndpointV1_1 = __nccwpck_require__(38938); -const resolveEndpointConfig = (input) => { - var _a, _b, _c; - const tls = (_a = input.tls) !== null && _a !== void 0 ? _a : true; - const { endpoint } = input; - const customEndpointProvider = endpoint != null ? async () => (0, toEndpointV1_1.toEndpointV1)(await (0, util_middleware_1.normalizeProvider)(endpoint)()) : undefined; - const isCustomEndpoint = !!endpoint; - return { - ...input, - endpoint: customEndpointProvider, - tls, - isCustomEndpoint, - useDualstackEndpoint: (0, util_middleware_1.normalizeProvider)((_b = input.useDualstackEndpoint) !== null && _b !== void 0 ? _b : false), - useFipsEndpoint: (0, util_middleware_1.normalizeProvider)((_c = input.useFipsEndpoint) !== null && _c !== void 0 ? _c : false), - }; -}; -exports.resolveEndpointConfig = resolveEndpointConfig; +tslib_1.__exportStar(__nccwpck_require__(54766), exports); /***/ }), -/***/ 13105: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 33946: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(19194), exports); +exports.NODEJS_TIMEOUT_ERROR_CODES = void 0; +exports.NODEJS_TIMEOUT_ERROR_CODES = ["ECONNRESET", "EPIPE", "ETIMEDOUT"]; /***/ }), -/***/ 19194: +/***/ 70508: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isArnBucketName = exports.isDnsCompatibleBucketName = exports.S3_HOSTNAME_PATTERN = exports.DOT_PATTERN = exports.resolveParamsForS3 = void 0; -const resolveParamsForS3 = async (endpointParams) => { - const bucket = (endpointParams === null || endpointParams === void 0 ? void 0 : endpointParams.Bucket) || ""; - if (typeof endpointParams.Bucket === "string") { - endpointParams.Bucket = bucket.replace(/#/g, encodeURIComponent("#")).replace(/\?/g, encodeURIComponent("?")); - } - if ((0, exports.isArnBucketName)(bucket)) { - if (endpointParams.ForcePathStyle === true) { - throw new Error("Path-style addressing cannot be used with ARN buckets"); - } - } - else if (!(0, exports.isDnsCompatibleBucketName)(bucket) || - (bucket.indexOf(".") !== -1 && !String(endpointParams.Endpoint).startsWith("http:")) || - bucket.toLowerCase() !== bucket || - bucket.length < 3) { - endpointParams.ForcePathStyle = true; - } - if (endpointParams.DisableMultiRegionAccessPoints) { - endpointParams.disableMultiRegionAccessPoints = true; - endpointParams.DisableMRAP = true; - } - return endpointParams; -}; -exports.resolveParamsForS3 = resolveParamsForS3; -const DOMAIN_PATTERN = /^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/; -const IP_ADDRESS_PATTERN = /(\d+\.){3}\d+/; -const DOTS_PATTERN = /\.\./; -exports.DOT_PATTERN = /\./; -exports.S3_HOSTNAME_PATTERN = /^(.+\.)?s3(-fips)?(\.dualstack)?[.-]([a-z0-9-]+)\./; -const isDnsCompatibleBucketName = (bucketName) => DOMAIN_PATTERN.test(bucketName) && !IP_ADDRESS_PATTERN.test(bucketName) && !DOTS_PATTERN.test(bucketName); -exports.isDnsCompatibleBucketName = isDnsCompatibleBucketName; -const isArnBucketName = (bucketName) => { - const [arn, partition, service, region, account, typeOrId] = bucketName.split(":"); - const isArn = arn === "arn" && bucketName.split(":").length >= 6; - const isValidArn = [arn, partition, service, account, typeOrId].filter(Boolean).length === 5; - if (isArn && !isValidArn) { - throw new Error(`Invalid ARN: ${bucketName} was an invalid ARN.`); +exports.getTransformedHeaders = void 0; +const getTransformedHeaders = (headers) => { + const transformedHeaders = {}; + for (const name of Object.keys(headers)) { + const headerValues = headers[name]; + transformedHeaders[name] = Array.isArray(headerValues) ? headerValues.join(",") : headerValues; } - return arn === "arn" && !!partition && !!service && !!account && !!typeOrId; + return transformedHeaders; }; -exports.isArnBucketName = isArnBucketName; - - -/***/ }), - -/***/ 39720: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getTransformedHeaders = getTransformedHeaders; /***/ }), -/***/ 80155: +/***/ 20258: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AdaptiveRetryStrategy = void 0; -const util_retry_1 = __nccwpck_require__(84902); -const StandardRetryStrategy_1 = __nccwpck_require__(94582); -class AdaptiveRetryStrategy extends StandardRetryStrategy_1.StandardRetryStrategy { - constructor(maxAttemptsProvider, options) { - const { rateLimiter, ...superOptions } = options !== null && options !== void 0 ? options : {}; - super(maxAttemptsProvider, superOptions); - this.rateLimiter = rateLimiter !== null && rateLimiter !== void 0 ? rateLimiter : new util_retry_1.DefaultRateLimiter(); - this.mode = util_retry_1.RETRY_MODES.ADAPTIVE; - } - async retry(next, args) { - return super.retry(next, args, { - beforeRequest: async () => { - return this.rateLimiter.getSendToken(); - }, - afterRequest: (response) => { - this.rateLimiter.updateClientSendingRate(response); - }, - }); - } -} -exports.AdaptiveRetryStrategy = AdaptiveRetryStrategy; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(96948), exports); +tslib_1.__exportStar(__nccwpck_require__(46999), exports); +tslib_1.__exportStar(__nccwpck_require__(81030), exports); /***/ }), -/***/ 94582: +/***/ 96948: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.StandardRetryStrategy = void 0; +exports.NodeHttpHandler = exports.DEFAULT_REQUEST_TIMEOUT = void 0; const protocol_http_1 = __nccwpck_require__(64418); -const service_error_classification_1 = __nccwpck_require__(6375); -const util_retry_1 = __nccwpck_require__(84902); -const uuid_1 = __nccwpck_require__(75840); -const defaultRetryQuota_1 = __nccwpck_require__(29991); -const delayDecider_1 = __nccwpck_require__(9465); -const retryDecider_1 = __nccwpck_require__(67653); -const util_1 = __nccwpck_require__(42827); -class StandardRetryStrategy { - constructor(maxAttemptsProvider, options) { - var _a, _b, _c; - this.maxAttemptsProvider = maxAttemptsProvider; - this.mode = util_retry_1.RETRY_MODES.STANDARD; - this.retryDecider = (_a = options === null || options === void 0 ? void 0 : options.retryDecider) !== null && _a !== void 0 ? _a : retryDecider_1.defaultRetryDecider; - this.delayDecider = (_b = options === null || options === void 0 ? void 0 : options.delayDecider) !== null && _b !== void 0 ? _b : delayDecider_1.defaultDelayDecider; - this.retryQuota = (_c = options === null || options === void 0 ? void 0 : options.retryQuota) !== null && _c !== void 0 ? _c : (0, defaultRetryQuota_1.getDefaultRetryQuota)(util_retry_1.INITIAL_RETRY_TOKENS); +const querystring_builder_1 = __nccwpck_require__(68031); +const http_1 = __nccwpck_require__(13685); +const https_1 = __nccwpck_require__(95687); +const constants_1 = __nccwpck_require__(33946); +const get_transformed_headers_1 = __nccwpck_require__(70508); +const set_connection_timeout_1 = __nccwpck_require__(25545); +const set_socket_keep_alive_1 = __nccwpck_require__(83751); +const set_socket_timeout_1 = __nccwpck_require__(42618); +const write_request_body_1 = __nccwpck_require__(73766); +exports.DEFAULT_REQUEST_TIMEOUT = 0; +class NodeHttpHandler { + constructor(options) { + this.metadata = { handlerProtocol: "http/1.1" }; + this.configProvider = new Promise((resolve, reject) => { + if (typeof options === "function") { + options() + .then((_options) => { + resolve(this.resolveDefaultConfig(_options)); + }) + .catch(reject); + } + else { + resolve(this.resolveDefaultConfig(options)); + } + }); } - shouldRetry(error, attempts, maxAttempts) { - return attempts < maxAttempts && this.retryDecider(error) && this.retryQuota.hasRetryTokens(error); + resolveDefaultConfig(options) { + const { requestTimeout, connectionTimeout, socketTimeout, httpAgent, httpsAgent } = options || {}; + const keepAlive = true; + const maxSockets = 50; + return { + connectionTimeout, + requestTimeout: requestTimeout !== null && requestTimeout !== void 0 ? requestTimeout : socketTimeout, + httpAgent: httpAgent || new http_1.Agent({ keepAlive, maxSockets }), + httpsAgent: httpsAgent || new https_1.Agent({ keepAlive, maxSockets }), + }; } - async getMaxAttempts() { - let maxAttempts; - try { - maxAttempts = await this.maxAttemptsProvider(); - } - catch (error) { - maxAttempts = util_retry_1.DEFAULT_MAX_ATTEMPTS; - } - return maxAttempts; + destroy() { + var _a, _b, _c, _d; + (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.httpAgent) === null || _b === void 0 ? void 0 : _b.destroy(); + (_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.httpsAgent) === null || _d === void 0 ? void 0 : _d.destroy(); } - async retry(next, args, options) { - let retryTokenAmount; - let attempts = 0; - let totalDelay = 0; - const maxAttempts = await this.getMaxAttempts(); - const { request } = args; - if (protocol_http_1.HttpRequest.isInstance(request)) { - request.headers[util_retry_1.INVOCATION_ID_HEADER] = (0, uuid_1.v4)(); + async handle(request, { abortSignal } = {}) { + if (!this.config) { + this.config = await this.configProvider; } - while (true) { - try { - if (protocol_http_1.HttpRequest.isInstance(request)) { - request.headers[util_retry_1.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`; - } - if (options === null || options === void 0 ? void 0 : options.beforeRequest) { - await options.beforeRequest(); - } - const { response, output } = await next(args); - if (options === null || options === void 0 ? void 0 : options.afterRequest) { - options.afterRequest(response); - } - this.retryQuota.releaseRetryTokens(retryTokenAmount); - output.$metadata.attempts = attempts + 1; - output.$metadata.totalRetryDelay = totalDelay; - return { response, output }; + return new Promise((_resolve, _reject) => { + var _a, _b; + let writeRequestBodyPromise = undefined; + const resolve = async (arg) => { + await writeRequestBodyPromise; + _resolve(arg); + }; + const reject = async (arg) => { + await writeRequestBodyPromise; + _reject(arg); + }; + if (!this.config) { + throw new Error("Node HTTP request handler config is not resolved"); } - catch (e) { - const err = (0, util_1.asSdkError)(e); - attempts++; - if (this.shouldRetry(err, attempts, maxAttempts)) { - retryTokenAmount = this.retryQuota.retrieveRetryTokens(err); - const delayFromDecider = this.delayDecider((0, service_error_classification_1.isThrottlingError)(err) ? util_retry_1.THROTTLING_RETRY_DELAY_BASE : util_retry_1.DEFAULT_RETRY_DELAY_BASE, attempts); - const delayFromResponse = getDelayFromRetryAfterHeader(err.$response); - const delay = Math.max(delayFromResponse || 0, delayFromDecider); - totalDelay += delay; - await new Promise((resolve) => setTimeout(resolve, delay)); - continue; + if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) { + const abortError = new Error("Request aborted"); + abortError.name = "AbortError"; + reject(abortError); + return; + } + const isSSL = request.protocol === "https:"; + const queryString = (0, querystring_builder_1.buildQueryString)(request.query || {}); + let auth = undefined; + if (request.username != null || request.password != null) { + const username = (_a = request.username) !== null && _a !== void 0 ? _a : ""; + const password = (_b = request.password) !== null && _b !== void 0 ? _b : ""; + auth = `${username}:${password}`; + } + let path = request.path; + if (queryString) { + path += `?${queryString}`; + } + if (request.fragment) { + path += `#${request.fragment}`; + } + const nodeHttpsOptions = { + headers: request.headers, + host: request.hostname, + method: request.method, + path, + port: request.port, + agent: isSSL ? this.config.httpsAgent : this.config.httpAgent, + auth, + }; + const requestFunc = isSSL ? https_1.request : http_1.request; + const req = requestFunc(nodeHttpsOptions, (res) => { + const httpResponse = new protocol_http_1.HttpResponse({ + statusCode: res.statusCode || -1, + reason: res.statusMessage, + headers: (0, get_transformed_headers_1.getTransformedHeaders)(res.headers), + body: res, + }); + resolve({ response: httpResponse }); + }); + req.on("error", (err) => { + if (constants_1.NODEJS_TIMEOUT_ERROR_CODES.includes(err.code)) { + reject(Object.assign(err, { name: "TimeoutError" })); } - if (!err.$metadata) { - err.$metadata = {}; + else { + reject(err); } - err.$metadata.attempts = attempts; - err.$metadata.totalRetryDelay = totalDelay; - throw err; + }); + (0, set_connection_timeout_1.setConnectionTimeout)(req, reject, this.config.connectionTimeout); + (0, set_socket_timeout_1.setSocketTimeout)(req, reject, this.config.requestTimeout); + if (abortSignal) { + abortSignal.onabort = () => { + req.abort(); + const abortError = new Error("Request aborted"); + abortError.name = "AbortError"; + reject(abortError); + }; } - } + const httpAgent = nodeHttpsOptions.agent; + if (typeof httpAgent === "object" && "keepAlive" in httpAgent) { + (0, set_socket_keep_alive_1.setSocketKeepAlive)(req, { + keepAlive: httpAgent.keepAlive, + keepAliveMsecs: httpAgent.keepAliveMsecs, + }); + } + writeRequestBodyPromise = (0, write_request_body_1.writeRequestBody)(req, request, this.config.requestTimeout).catch(_reject); + }); } -} -exports.StandardRetryStrategy = StandardRetryStrategy; -const getDelayFromRetryAfterHeader = (response) => { - if (!protocol_http_1.HttpResponse.isInstance(response)) - return; - const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === "retry-after"); - if (!retryAfterHeaderName) - return; - const retryAfter = response.headers[retryAfterHeaderName]; - const retryAfterSeconds = Number(retryAfter); - if (!Number.isNaN(retryAfterSeconds)) - return retryAfterSeconds * 1000; - const retryAfterDate = new Date(retryAfter); - return retryAfterDate.getTime() - Date.now(); -}; + updateHttpClientConfig(key, value) { + this.config = undefined; + this.configProvider = this.configProvider.then((config) => { + return { + ...config, + [key]: value, + }; + }); + } + httpHandlerConfigs() { + var _a; + return (_a = this.config) !== null && _a !== void 0 ? _a : {}; + } +} +exports.NodeHttpHandler = NodeHttpHandler; /***/ }), -/***/ 58709: +/***/ 5771: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NODE_RETRY_MODE_CONFIG_OPTIONS = exports.CONFIG_RETRY_MODE = exports.ENV_RETRY_MODE = exports.resolveRetryConfig = exports.NODE_MAX_ATTEMPT_CONFIG_OPTIONS = exports.CONFIG_MAX_ATTEMPTS = exports.ENV_MAX_ATTEMPTS = void 0; -const util_middleware_1 = __nccwpck_require__(2390); -const util_retry_1 = __nccwpck_require__(84902); -exports.ENV_MAX_ATTEMPTS = "AWS_MAX_ATTEMPTS"; -exports.CONFIG_MAX_ATTEMPTS = "max_attempts"; -exports.NODE_MAX_ATTEMPT_CONFIG_OPTIONS = { - environmentVariableSelector: (env) => { - const value = env[exports.ENV_MAX_ATTEMPTS]; - if (!value) - return undefined; - const maxAttempt = parseInt(value); - if (Number.isNaN(maxAttempt)) { - throw new Error(`Environment variable ${exports.ENV_MAX_ATTEMPTS} mast be a number, got "${value}"`); - } - return maxAttempt; - }, - configFileSelector: (profile) => { - const value = profile[exports.CONFIG_MAX_ATTEMPTS]; - if (!value) - return undefined; - const maxAttempt = parseInt(value); - if (Number.isNaN(maxAttempt)) { - throw new Error(`Shared config file entry ${exports.CONFIG_MAX_ATTEMPTS} mast be a number, got "${value}"`); +exports.NodeHttp2ConnectionManager = void 0; +const tslib_1 = __nccwpck_require__(4351); +const http2_1 = tslib_1.__importDefault(__nccwpck_require__(85158)); +const node_http2_connection_pool_1 = __nccwpck_require__(95157); +class NodeHttp2ConnectionManager { + constructor(config) { + this.sessionCache = new Map(); + this.config = config; + if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) { + throw new RangeError("maxConcurrency must be greater than zero."); } - return maxAttempt; - }, - default: util_retry_1.DEFAULT_MAX_ATTEMPTS, -}; -const resolveRetryConfig = (input) => { - var _a; - const { retryStrategy } = input; - const maxAttempts = (0, util_middleware_1.normalizeProvider)((_a = input.maxAttempts) !== null && _a !== void 0 ? _a : util_retry_1.DEFAULT_MAX_ATTEMPTS); - return { - ...input, - maxAttempts, - retryStrategy: async () => { - if (retryStrategy) { - return retryStrategy; + } + lease(requestContext, connectionConfiguration) { + const url = this.getUrlString(requestContext); + const existingPool = this.sessionCache.get(url); + if (existingPool) { + const existingSession = existingPool.poll(); + if (existingSession && !this.config.disableConcurrency) { + return existingSession; } - const retryMode = await (0, util_middleware_1.normalizeProvider)(input.retryMode)(); - if (retryMode === util_retry_1.RETRY_MODES.ADAPTIVE) { - return new util_retry_1.AdaptiveRetryStrategy(maxAttempts); + } + const session = http2_1.default.connect(url); + if (this.config.maxConcurrency) { + session.settings({ maxConcurrentStreams: this.config.maxConcurrency }, (err) => { + if (err) { + throw new Error("Fail to set maxConcurrentStreams to " + + this.config.maxConcurrency + + "when creating new session for " + + requestContext.destination.toString()); + } + }); + } + session.unref(); + const destroySessionCb = () => { + session.destroy(); + this.deleteSession(url, session); + }; + session.on("goaway", destroySessionCb); + session.on("error", destroySessionCb); + session.on("frameError", destroySessionCb); + session.on("close", () => this.deleteSession(url, session)); + if (connectionConfiguration.requestTimeout) { + session.setTimeout(connectionConfiguration.requestTimeout, destroySessionCb); + } + const connectionPool = this.sessionCache.get(url) || new node_http2_connection_pool_1.NodeHttp2ConnectionPool(); + connectionPool.offerLast(session); + this.sessionCache.set(url, connectionPool); + return session; + } + deleteSession(authority, session) { + const existingConnectionPool = this.sessionCache.get(authority); + if (!existingConnectionPool) { + return; + } + if (!existingConnectionPool.contains(session)) { + return; + } + existingConnectionPool.remove(session); + this.sessionCache.set(authority, existingConnectionPool); + } + release(requestContext, session) { + var _a; + const cacheKey = this.getUrlString(requestContext); + (_a = this.sessionCache.get(cacheKey)) === null || _a === void 0 ? void 0 : _a.offerLast(session); + } + destroy() { + for (const [key, connectionPool] of this.sessionCache) { + for (const session of connectionPool) { + if (!session.destroyed) { + session.destroy(); + } + connectionPool.remove(session); } - return new util_retry_1.StandardRetryStrategy(maxAttempts); - }, - }; -}; -exports.resolveRetryConfig = resolveRetryConfig; -exports.ENV_RETRY_MODE = "AWS_RETRY_MODE"; -exports.CONFIG_RETRY_MODE = "retry_mode"; -exports.NODE_RETRY_MODE_CONFIG_OPTIONS = { - environmentVariableSelector: (env) => env[exports.ENV_RETRY_MODE], - configFileSelector: (profile) => profile[exports.CONFIG_RETRY_MODE], - default: util_retry_1.DEFAULT_RETRY_MODE, -}; - - -/***/ }), - -/***/ 29991: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getDefaultRetryQuota = void 0; -const util_retry_1 = __nccwpck_require__(84902); -const getDefaultRetryQuota = (initialRetryTokens, options) => { - var _a, _b, _c; - const MAX_CAPACITY = initialRetryTokens; - const noRetryIncrement = (_a = options === null || options === void 0 ? void 0 : options.noRetryIncrement) !== null && _a !== void 0 ? _a : util_retry_1.NO_RETRY_INCREMENT; - const retryCost = (_b = options === null || options === void 0 ? void 0 : options.retryCost) !== null && _b !== void 0 ? _b : util_retry_1.RETRY_COST; - const timeoutRetryCost = (_c = options === null || options === void 0 ? void 0 : options.timeoutRetryCost) !== null && _c !== void 0 ? _c : util_retry_1.TIMEOUT_RETRY_COST; - let availableCapacity = initialRetryTokens; - const getCapacityAmount = (error) => (error.name === "TimeoutError" ? timeoutRetryCost : retryCost); - const hasRetryTokens = (error) => getCapacityAmount(error) <= availableCapacity; - const retrieveRetryTokens = (error) => { - if (!hasRetryTokens(error)) { - throw new Error("No retry token available"); + this.sessionCache.delete(key); } - const capacityAmount = getCapacityAmount(error); - availableCapacity -= capacityAmount; - return capacityAmount; - }; - const releaseRetryTokens = (capacityReleaseAmount) => { - availableCapacity += capacityReleaseAmount !== null && capacityReleaseAmount !== void 0 ? capacityReleaseAmount : noRetryIncrement; - availableCapacity = Math.min(availableCapacity, MAX_CAPACITY); - }; - return Object.freeze({ - hasRetryTokens, - retrieveRetryTokens, - releaseRetryTokens, - }); -}; -exports.getDefaultRetryQuota = getDefaultRetryQuota; - - -/***/ }), - -/***/ 9465: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.defaultDelayDecider = void 0; -const util_retry_1 = __nccwpck_require__(84902); -const defaultDelayDecider = (delayBase, attempts) => Math.floor(Math.min(util_retry_1.MAXIMUM_RETRY_DELAY, Math.random() * 2 ** attempts * delayBase)); -exports.defaultDelayDecider = defaultDelayDecider; - - -/***/ }), - -/***/ 96039: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(80155), exports); -tslib_1.__exportStar(__nccwpck_require__(94582), exports); -tslib_1.__exportStar(__nccwpck_require__(58709), exports); -tslib_1.__exportStar(__nccwpck_require__(9465), exports); -tslib_1.__exportStar(__nccwpck_require__(76556), exports); -tslib_1.__exportStar(__nccwpck_require__(67653), exports); -tslib_1.__exportStar(__nccwpck_require__(81434), exports); - - -/***/ }), - -/***/ 76556: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getOmitRetryHeadersPlugin = exports.omitRetryHeadersMiddlewareOptions = exports.omitRetryHeadersMiddleware = void 0; -const protocol_http_1 = __nccwpck_require__(64418); -const util_retry_1 = __nccwpck_require__(84902); -const omitRetryHeadersMiddleware = () => (next) => async (args) => { - const { request } = args; - if (protocol_http_1.HttpRequest.isInstance(request)) { - delete request.headers[util_retry_1.INVOCATION_ID_HEADER]; - delete request.headers[util_retry_1.REQUEST_HEADER]; } - return next(args); -}; -exports.omitRetryHeadersMiddleware = omitRetryHeadersMiddleware; -exports.omitRetryHeadersMiddlewareOptions = { - name: "omitRetryHeadersMiddleware", - tags: ["RETRY", "HEADERS", "OMIT_RETRY_HEADERS"], - relation: "before", - toMiddleware: "awsAuthMiddleware", - override: true, -}; -const getOmitRetryHeadersPlugin = (options) => ({ - applyToStack: (clientStack) => { - clientStack.addRelativeTo((0, exports.omitRetryHeadersMiddleware)(), exports.omitRetryHeadersMiddlewareOptions); - }, -}); -exports.getOmitRetryHeadersPlugin = getOmitRetryHeadersPlugin; + setMaxConcurrentStreams(maxConcurrentStreams) { + if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) { + throw new RangeError("maxConcurrentStreams must be greater than zero."); + } + this.config.maxConcurrency = maxConcurrentStreams; + } + setDisableConcurrentStreams(disableConcurrentStreams) { + this.config.disableConcurrency = disableConcurrentStreams; + } + getUrlString(request) { + return request.destination.toString(); + } +} +exports.NodeHttp2ConnectionManager = NodeHttp2ConnectionManager; /***/ }), -/***/ 67653: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 95157: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.defaultRetryDecider = void 0; -const service_error_classification_1 = __nccwpck_require__(6375); -const defaultRetryDecider = (error) => { - if (!error) { - return false; +exports.NodeHttp2ConnectionPool = void 0; +class NodeHttp2ConnectionPool { + constructor(sessions) { + this.sessions = []; + this.sessions = sessions !== null && sessions !== void 0 ? sessions : []; } - return (0, service_error_classification_1.isRetryableByTrait)(error) || (0, service_error_classification_1.isClockSkewError)(error) || (0, service_error_classification_1.isThrottlingError)(error) || (0, service_error_classification_1.isTransientError)(error); -}; -exports.defaultRetryDecider = defaultRetryDecider; + poll() { + if (this.sessions.length > 0) { + return this.sessions.shift(); + } + } + offerLast(session) { + this.sessions.push(session); + } + contains(session) { + return this.sessions.includes(session); + } + remove(session) { + this.sessions = this.sessions.filter((s) => s !== session); + } + [Symbol.iterator]() { + return this.sessions[Symbol.iterator](); + } + destroy(connection) { + for (const session of this.sessions) { + if (session === connection) { + if (!session.destroyed) { + session.destroy(); + } + } + } + } +} +exports.NodeHttp2ConnectionPool = NodeHttp2ConnectionPool; /***/ }), -/***/ 81434: +/***/ 46999: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getRetryAfterHint = exports.getRetryPlugin = exports.retryMiddlewareOptions = exports.retryMiddleware = void 0; +exports.NodeHttp2Handler = void 0; const protocol_http_1 = __nccwpck_require__(64418); -const service_error_classification_1 = __nccwpck_require__(6375); -const util_retry_1 = __nccwpck_require__(84902); -const uuid_1 = __nccwpck_require__(75840); -const util_1 = __nccwpck_require__(42827); -const retryMiddleware = (options) => (next, context) => async (args) => { - let retryStrategy = await options.retryStrategy(); - const maxAttempts = await options.maxAttempts(); - if (isRetryStrategyV2(retryStrategy)) { - retryStrategy = retryStrategy; - let retryToken = await retryStrategy.acquireInitialRetryToken(context["partition_id"]); - let lastError = new Error(); - let attempts = 0; - let totalRetryDelay = 0; - const { request } = args; - if (protocol_http_1.HttpRequest.isInstance(request)) { - request.headers[util_retry_1.INVOCATION_ID_HEADER] = (0, uuid_1.v4)(); +const querystring_builder_1 = __nccwpck_require__(68031); +const http2_1 = __nccwpck_require__(85158); +const get_transformed_headers_1 = __nccwpck_require__(70508); +const node_http2_connection_manager_1 = __nccwpck_require__(5771); +const write_request_body_1 = __nccwpck_require__(73766); +class NodeHttp2Handler { + constructor(options) { + this.metadata = { handlerProtocol: "h2" }; + this.connectionManager = new node_http2_connection_manager_1.NodeHttp2ConnectionManager({}); + this.configProvider = new Promise((resolve, reject) => { + if (typeof options === "function") { + options() + .then((opts) => { + resolve(opts || {}); + }) + .catch(reject); + } + else { + resolve(options || {}); + } + }); + } + destroy() { + this.connectionManager.destroy(); + } + async handle(request, { abortSignal } = {}) { + if (!this.config) { + this.config = await this.configProvider; + this.connectionManager.setDisableConcurrentStreams(this.config.disableConcurrentStreams || false); + if (this.config.maxConcurrentStreams) { + this.connectionManager.setMaxConcurrentStreams(this.config.maxConcurrentStreams); + } } - while (true) { - try { - if (protocol_http_1.HttpRequest.isInstance(request)) { - request.headers[util_retry_1.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`; - } - const { response, output } = await next(args); - retryStrategy.recordSuccess(retryToken); - output.$metadata.attempts = attempts + 1; - output.$metadata.totalRetryDelay = totalRetryDelay; - return { response, output }; + const { requestTimeout, disableConcurrentStreams } = this.config; + return new Promise((_resolve, _reject) => { + var _a, _b, _c; + let fulfilled = false; + let writeRequestBodyPromise = undefined; + const resolve = async (arg) => { + await writeRequestBodyPromise; + _resolve(arg); + }; + const reject = async (arg) => { + await writeRequestBodyPromise; + _reject(arg); + }; + if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) { + fulfilled = true; + const abortError = new Error("Request aborted"); + abortError.name = "AbortError"; + reject(abortError); + return; } - catch (e) { - const retryErrorInfo = getRetryErrorInfo(e); - lastError = (0, util_1.asSdkError)(e); - try { - retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo); + const { hostname, method, port, protocol, query } = request; + let auth = ""; + if (request.username != null || request.password != null) { + const username = (_a = request.username) !== null && _a !== void 0 ? _a : ""; + const password = (_b = request.password) !== null && _b !== void 0 ? _b : ""; + auth = `${username}:${password}@`; + } + const authority = `${protocol}//${auth}${hostname}${port ? `:${port}` : ""}`; + const requestContext = { destination: new URL(authority) }; + const session = this.connectionManager.lease(requestContext, { + requestTimeout: (_c = this.config) === null || _c === void 0 ? void 0 : _c.sessionTimeout, + disableConcurrentStreams: disableConcurrentStreams || false, + }); + const rejectWithDestroy = (err) => { + if (disableConcurrentStreams) { + this.destroySession(session); } - catch (refreshError) { - if (!lastError.$metadata) { - lastError.$metadata = {}; - } - lastError.$metadata.attempts = attempts + 1; - lastError.$metadata.totalRetryDelay = totalRetryDelay; - throw lastError; + fulfilled = true; + reject(err); + }; + const queryString = (0, querystring_builder_1.buildQueryString)(query || {}); + let path = request.path; + if (queryString) { + path += `?${queryString}`; + } + if (request.fragment) { + path += `#${request.fragment}`; + } + const req = session.request({ + ...request.headers, + [http2_1.constants.HTTP2_HEADER_PATH]: path, + [http2_1.constants.HTTP2_HEADER_METHOD]: method, + }); + session.ref(); + req.on("response", (headers) => { + const httpResponse = new protocol_http_1.HttpResponse({ + statusCode: headers[":status"] || -1, + headers: (0, get_transformed_headers_1.getTransformedHeaders)(headers), + body: req, + }); + fulfilled = true; + resolve({ response: httpResponse }); + if (disableConcurrentStreams) { + session.close(); + this.connectionManager.deleteSession(authority, session); } - attempts = retryToken.getRetryCount(); - const delay = retryToken.getRetryDelay(); - totalRetryDelay += delay; - await new Promise((resolve) => setTimeout(resolve, delay)); + }); + if (requestTimeout) { + req.setTimeout(requestTimeout, () => { + req.close(); + const timeoutError = new Error(`Stream timed out because of no activity for ${requestTimeout} ms`); + timeoutError.name = "TimeoutError"; + rejectWithDestroy(timeoutError); + }); } - } - } - else { - retryStrategy = retryStrategy; - if (retryStrategy === null || retryStrategy === void 0 ? void 0 : retryStrategy.mode) - context.userAgent = [...(context.userAgent || []), ["cfg/retry-mode", retryStrategy.mode]]; - return retryStrategy.retry(next, args); - } -}; -exports.retryMiddleware = retryMiddleware; -const isRetryStrategyV2 = (retryStrategy) => typeof retryStrategy.acquireInitialRetryToken !== "undefined" && - typeof retryStrategy.refreshRetryTokenForRetry !== "undefined" && - typeof retryStrategy.recordSuccess !== "undefined"; -const getRetryErrorInfo = (error) => { - const errorInfo = { - errorType: getRetryErrorType(error), - }; - const retryAfterHint = (0, exports.getRetryAfterHint)(error.$response); - if (retryAfterHint) { - errorInfo.retryAfterHint = retryAfterHint; - } - return errorInfo; -}; -const getRetryErrorType = (error) => { - if ((0, service_error_classification_1.isThrottlingError)(error)) - return "THROTTLING"; - if ((0, service_error_classification_1.isTransientError)(error)) - return "TRANSIENT"; - if ((0, service_error_classification_1.isServerError)(error)) - return "SERVER_ERROR"; - return "CLIENT_ERROR"; -}; -exports.retryMiddlewareOptions = { - name: "retryMiddleware", - tags: ["RETRY"], - step: "finalizeRequest", - priority: "high", - override: true, -}; -const getRetryPlugin = (options) => ({ - applyToStack: (clientStack) => { - clientStack.add((0, exports.retryMiddleware)(options), exports.retryMiddlewareOptions); - }, -}); -exports.getRetryPlugin = getRetryPlugin; -const getRetryAfterHint = (response) => { - if (!protocol_http_1.HttpResponse.isInstance(response)) - return; - const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === "retry-after"); - if (!retryAfterHeaderName) - return; - const retryAfter = response.headers[retryAfterHeaderName]; - const retryAfterSeconds = Number(retryAfter); - if (!Number.isNaN(retryAfterSeconds)) - return new Date(retryAfterSeconds * 1000); - const retryAfterDate = new Date(retryAfter); - return retryAfterDate; -}; -exports.getRetryAfterHint = getRetryAfterHint; + if (abortSignal) { + abortSignal.onabort = () => { + req.close(); + const abortError = new Error("Request aborted"); + abortError.name = "AbortError"; + rejectWithDestroy(abortError); + }; + } + req.on("frameError", (type, code, id) => { + rejectWithDestroy(new Error(`Frame type id ${type} in stream id ${id} has failed with code ${code}.`)); + }); + req.on("error", rejectWithDestroy); + req.on("aborted", () => { + rejectWithDestroy(new Error(`HTTP/2 stream is abnormally aborted in mid-communication with result code ${req.rstCode}.`)); + }); + req.on("close", () => { + session.unref(); + if (disableConcurrentStreams) { + session.destroy(); + } + if (!fulfilled) { + rejectWithDestroy(new Error("Unexpected error: http2 request did not get a response")); + } + }); + writeRequestBodyPromise = (0, write_request_body_1.writeRequestBody)(req, request, requestTimeout); + }); + } + updateHttpClientConfig(key, value) { + this.config = undefined; + this.configProvider = this.configProvider.then((config) => { + return { + ...config, + [key]: value, + }; + }); + } + httpHandlerConfigs() { + var _a; + return (_a = this.config) !== null && _a !== void 0 ? _a : {}; + } + destroySession(session) { + if (!session.destroyed) { + session.destroy(); + } + } +} +exports.NodeHttp2Handler = NodeHttp2Handler; /***/ }), -/***/ 42827: +/***/ 25545: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.asSdkError = void 0; -const asSdkError = (error) => { - if (error instanceof Error) - return error; - if (error instanceof Object) - return Object.assign(new Error(), error); - if (typeof error === "string") - return new Error(error); - return new Error(`AWS SDK error wrapper for ${error}`); +exports.setConnectionTimeout = void 0; +const setConnectionTimeout = (request, reject, timeoutInMs = 0) => { + if (!timeoutInMs) { + return; + } + const timeoutId = setTimeout(() => { + request.destroy(); + reject(Object.assign(new Error(`Socket timed out without establishing a connection within ${timeoutInMs} ms`), { + name: "TimeoutError", + })); + }, timeoutInMs); + request.on("socket", (socket) => { + if (socket.connecting) { + socket.on("connect", () => { + clearTimeout(timeoutId); + }); + } + else { + clearTimeout(timeoutId); + } + }); }; -exports.asSdkError = asSdkError; +exports.setConnectionTimeout = setConnectionTimeout; /***/ }), -/***/ 21595: +/***/ 83751: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.deserializerMiddleware = void 0; -const deserializerMiddleware = (options, deserializer) => (next, context) => async (args) => { - const { response } = await next(args); - try { - const parsed = await deserializer(response, options); - return { - response, - output: parsed, - }; - } - catch (error) { - Object.defineProperty(error, "$response", { - value: response, - }); - if (!("$metadata" in error)) { - const hint = `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.`; - error.message += "\n " + hint; - } - throw error; +exports.setSocketKeepAlive = void 0; +const setSocketKeepAlive = (request, { keepAlive, keepAliveMsecs }) => { + if (keepAlive !== true) { + return; } + request.on("socket", (socket) => { + socket.setKeepAlive(keepAlive, keepAliveMsecs || 0); + }); }; -exports.deserializerMiddleware = deserializerMiddleware; +exports.setSocketKeepAlive = setSocketKeepAlive; /***/ }), -/***/ 81238: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 42618: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(21595), exports); -tslib_1.__exportStar(__nccwpck_require__(72338), exports); -tslib_1.__exportStar(__nccwpck_require__(23566), exports); +exports.setSocketTimeout = void 0; +const setSocketTimeout = (request, reject, timeoutInMs = 0) => { + request.setTimeout(timeoutInMs, () => { + request.destroy(); + reject(Object.assign(new Error(`Connection timed out after ${timeoutInMs} ms`), { name: "TimeoutError" })); + }); +}; +exports.setSocketTimeout = setSocketTimeout; /***/ }), -/***/ 72338: +/***/ 23211: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getSerdePlugin = exports.serializerMiddlewareOption = exports.deserializerMiddlewareOption = void 0; -const deserializerMiddleware_1 = __nccwpck_require__(21595); -const serializerMiddleware_1 = __nccwpck_require__(23566); -exports.deserializerMiddlewareOption = { - name: "deserializerMiddleware", - step: "deserialize", - tags: ["DESERIALIZER"], - override: true, -}; -exports.serializerMiddlewareOption = { - name: "serializerMiddleware", - step: "serialize", - tags: ["SERIALIZER"], - override: true, -}; -function getSerdePlugin(config, serializer, deserializer) { - return { - applyToStack: (commandStack) => { - commandStack.add((0, deserializerMiddleware_1.deserializerMiddleware)(config, deserializer), exports.deserializerMiddlewareOption); - commandStack.add((0, serializerMiddleware_1.serializerMiddleware)(config, serializer), exports.serializerMiddlewareOption); - }, - }; +exports.Collector = void 0; +const stream_1 = __nccwpck_require__(12781); +class Collector extends stream_1.Writable { + constructor() { + super(...arguments); + this.bufferedBytes = []; + } + _write(chunk, encoding, callback) { + this.bufferedBytes.push(chunk); + callback(); + } } -exports.getSerdePlugin = getSerdePlugin; +exports.Collector = Collector; /***/ }), -/***/ 23566: -/***/ ((__unused_webpack_module, exports) => { +/***/ 81030: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.serializerMiddleware = void 0; -const serializerMiddleware = (options, serializer) => (next, context) => async (args) => { - var _a; - const endpoint = ((_a = context.endpointV2) === null || _a === void 0 ? void 0 : _a.url) && options.urlParser - ? async () => options.urlParser(context.endpointV2.url) - : options.endpoint; - if (!endpoint) { - throw new Error("No valid endpoint provider available."); - } - const request = await serializer(args.input, { ...options, endpoint }); - return next({ - ...args, - request, +exports.streamCollector = void 0; +const collector_1 = __nccwpck_require__(23211); +const streamCollector = (stream) => new Promise((resolve, reject) => { + const collector = new collector_1.Collector(); + stream.pipe(collector); + stream.on("error", (err) => { + collector.end(); + reject(err); }); -}; -exports.serializerMiddleware = serializerMiddleware; + collector.on("error", reject); + collector.on("finish", function () { + const bytes = new Uint8Array(Buffer.concat(this.bufferedBytes)); + resolve(bytes); + }); +}); +exports.streamCollector = streamCollector; /***/ }), -/***/ 2404: -/***/ ((__unused_webpack_module, exports) => { +/***/ 73766: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.constructStack = void 0; -const getAllAliases = (name, aliases) => { - const _aliases = []; - if (name) { - _aliases.push(name); +exports.writeRequestBody = void 0; +const stream_1 = __nccwpck_require__(12781); +const MIN_WAIT_TIME = 1000; +async function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) { + var _a; + const headers = (_a = request.headers) !== null && _a !== void 0 ? _a : {}; + const expect = headers["Expect"] || headers["expect"]; + let timeoutId = -1; + let hasError = false; + if (expect === "100-continue") { + await Promise.race([ + new Promise((resolve) => { + timeoutId = Number(setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs))); + }), + new Promise((resolve) => { + httpRequest.on("continue", () => { + clearTimeout(timeoutId); + resolve(); + }); + httpRequest.on("error", () => { + hasError = true; + clearTimeout(timeoutId); + resolve(); + }); + }), + ]); } - if (aliases) { - for (const alias of aliases) { - _aliases.push(alias); - } + if (!hasError) { + writeBody(httpRequest, request.body); } - return _aliases; -}; -const getMiddlewareNameWithAliases = (name, aliases) => { - return `${name || "anonymous"}${aliases && aliases.length > 0 ? ` (a.k.a. ${aliases.join(",")})` : ""}`; -}; -const constructStack = () => { - let absoluteEntries = []; - let relativeEntries = []; - let identifyOnResolve = false; - const entriesNameSet = new Set(); - const sort = (entries) => entries.sort((a, b) => stepWeights[b.step] - stepWeights[a.step] || - priorityWeights[b.priority || "normal"] - priorityWeights[a.priority || "normal"]); - const removeByName = (toRemove) => { - let isRemoved = false; - const filterCb = (entry) => { - const aliases = getAllAliases(entry.name, entry.aliases); - if (aliases.includes(toRemove)) { - isRemoved = true; - for (const alias of aliases) { - entriesNameSet.delete(alias); - } - return false; - } - return true; - }; - absoluteEntries = absoluteEntries.filter(filterCb); - relativeEntries = relativeEntries.filter(filterCb); - return isRemoved; - }; - const removeByReference = (toRemove) => { - let isRemoved = false; - const filterCb = (entry) => { - if (entry.middleware === toRemove) { - isRemoved = true; - for (const alias of getAllAliases(entry.name, entry.aliases)) { - entriesNameSet.delete(alias); - } - return false; - } - return true; - }; - absoluteEntries = absoluteEntries.filter(filterCb); - relativeEntries = relativeEntries.filter(filterCb); - return isRemoved; - }; - const cloneTo = (toStack) => { - var _a; - absoluteEntries.forEach((entry) => { - toStack.add(entry.middleware, { ...entry }); - }); - relativeEntries.forEach((entry) => { - toStack.addRelativeTo(entry.middleware, { ...entry }); - }); - (_a = toStack.identifyOnResolve) === null || _a === void 0 ? void 0 : _a.call(toStack, stack.identifyOnResolve()); - return toStack; - }; - const expandRelativeMiddlewareList = (from) => { - const expandedMiddlewareList = []; - from.before.forEach((entry) => { - if (entry.before.length === 0 && entry.after.length === 0) { - expandedMiddlewareList.push(entry); - } - else { - expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry)); - } - }); - expandedMiddlewareList.push(from); - from.after.reverse().forEach((entry) => { - if (entry.before.length === 0 && entry.after.length === 0) { - expandedMiddlewareList.push(entry); - } - else { - expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry)); - } - }); - return expandedMiddlewareList; - }; - const getMiddlewareList = (debug = false) => { - const normalizedAbsoluteEntries = []; - const normalizedRelativeEntries = []; - const normalizedEntriesNameMap = {}; - absoluteEntries.forEach((entry) => { - const normalizedEntry = { - ...entry, - before: [], - after: [], - }; - for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) { - normalizedEntriesNameMap[alias] = normalizedEntry; - } - normalizedAbsoluteEntries.push(normalizedEntry); - }); - relativeEntries.forEach((entry) => { - const normalizedEntry = { - ...entry, - before: [], - after: [], - }; - for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) { - normalizedEntriesNameMap[alias] = normalizedEntry; - } - normalizedRelativeEntries.push(normalizedEntry); - }); - normalizedRelativeEntries.forEach((entry) => { - if (entry.toMiddleware) { - const toMiddleware = normalizedEntriesNameMap[entry.toMiddleware]; - if (toMiddleware === undefined) { - if (debug) { - return; - } - throw new Error(`${entry.toMiddleware} is not found when adding ` + - `${getMiddlewareNameWithAliases(entry.name, entry.aliases)} ` + - `middleware ${entry.relation} ${entry.toMiddleware}`); - } - if (entry.relation === "after") { - toMiddleware.after.push(entry); - } - if (entry.relation === "before") { - toMiddleware.before.push(entry); - } - } - }); - const mainChain = sort(normalizedAbsoluteEntries) - .map(expandRelativeMiddlewareList) - .reduce((wholeList, expandedMiddlewareList) => { - wholeList.push(...expandedMiddlewareList); - return wholeList; - }, []); - return mainChain; - }; - const stack = { - add: (middleware, options = {}) => { - const { name, override, aliases: _aliases } = options; - const entry = { - step: "initialize", - priority: "normal", - middleware, - ...options, - }; - const aliases = getAllAliases(name, _aliases); - if (aliases.length > 0) { - if (aliases.some((alias) => entriesNameSet.has(alias))) { - if (!override) - throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`); - for (const alias of aliases) { - const toOverrideIndex = absoluteEntries.findIndex((entry) => { var _a; return entry.name === alias || ((_a = entry.aliases) === null || _a === void 0 ? void 0 : _a.some((a) => a === alias)); }); - if (toOverrideIndex === -1) { - continue; - } - const toOverride = absoluteEntries[toOverrideIndex]; - if (toOverride.step !== entry.step || entry.priority !== toOverride.priority) { - throw new Error(`"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}" middleware with ` + - `${toOverride.priority} priority in ${toOverride.step} step cannot ` + - `be overridden by "${getMiddlewareNameWithAliases(name, _aliases)}" middleware with ` + - `${entry.priority} priority in ${entry.step} step.`); - } - absoluteEntries.splice(toOverrideIndex, 1); - } - } - for (const alias of aliases) { - entriesNameSet.add(alias); - } - } - absoluteEntries.push(entry); - }, - addRelativeTo: (middleware, options) => { - const { name, override, aliases: _aliases } = options; - const entry = { - middleware, - ...options, - }; - const aliases = getAllAliases(name, _aliases); - if (aliases.length > 0) { - if (aliases.some((alias) => entriesNameSet.has(alias))) { - if (!override) - throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`); - for (const alias of aliases) { - const toOverrideIndex = relativeEntries.findIndex((entry) => { var _a; return entry.name === alias || ((_a = entry.aliases) === null || _a === void 0 ? void 0 : _a.some((a) => a === alias)); }); - if (toOverrideIndex === -1) { - continue; - } - const toOverride = relativeEntries[toOverrideIndex]; - if (toOverride.toMiddleware !== entry.toMiddleware || toOverride.relation !== entry.relation) { - throw new Error(`"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}" middleware ` + - `${toOverride.relation} "${toOverride.toMiddleware}" middleware cannot be overridden ` + - `by "${getMiddlewareNameWithAliases(name, _aliases)}" middleware ${entry.relation} ` + - `"${entry.toMiddleware}" middleware.`); - } - relativeEntries.splice(toOverrideIndex, 1); - } - } - for (const alias of aliases) { - entriesNameSet.add(alias); - } - } - relativeEntries.push(entry); - }, - clone: () => cloneTo((0, exports.constructStack)()), - use: (plugin) => { - plugin.applyToStack(stack); - }, - remove: (toRemove) => { - if (typeof toRemove === "string") - return removeByName(toRemove); - else - return removeByReference(toRemove); - }, - removeByTag: (toRemove) => { - let isRemoved = false; - const filterCb = (entry) => { - const { tags, name, aliases: _aliases } = entry; - if (tags && tags.includes(toRemove)) { - const aliases = getAllAliases(name, _aliases); - for (const alias of aliases) { - entriesNameSet.delete(alias); - } - isRemoved = true; - return false; - } - return true; - }; - absoluteEntries = absoluteEntries.filter(filterCb); - relativeEntries = relativeEntries.filter(filterCb); - return isRemoved; - }, - concat: (from) => { - var _a, _b; - const cloned = cloneTo((0, exports.constructStack)()); - cloned.use(from); - cloned.identifyOnResolve(identifyOnResolve || cloned.identifyOnResolve() || ((_b = (_a = from.identifyOnResolve) === null || _a === void 0 ? void 0 : _a.call(from)) !== null && _b !== void 0 ? _b : false)); - return cloned; - }, - applyToStack: cloneTo, - identify: () => { - return getMiddlewareList(true).map((mw) => { - var _a; - const step = (_a = mw.step) !== null && _a !== void 0 ? _a : mw.relation + - " " + - mw.toMiddleware; - return getMiddlewareNameWithAliases(mw.name, mw.aliases) + " - " + step; - }); - }, - identifyOnResolve(toggle) { - if (typeof toggle === "boolean") - identifyOnResolve = toggle; - return identifyOnResolve; - }, - resolve: (handler, context) => { - for (const middleware of getMiddlewareList() - .map((entry) => entry.middleware) - .reverse()) { - handler = middleware(handler, context); - } - if (identifyOnResolve) { - console.log(stack.identify()); - } - return handler; - }, - }; - return stack; -}; -exports.constructStack = constructStack; -const stepWeights = { - initialize: 5, - serialize: 4, - build: 3, - finalizeRequest: 2, - deserialize: 1, -}; -const priorityWeights = { - high: 3, - normal: 2, - low: 1, -}; +} +exports.writeRequestBody = writeRequestBody; +function writeBody(httpRequest, body) { + if (body instanceof stream_1.Readable) { + body.pipe(httpRequest); + } + else if (body) { + httpRequest.end(Buffer.from(body)); + } + else { + httpRequest.end(); + } +} /***/ }), -/***/ 97911: +/***/ 63936: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(2404), exports); +exports.CredentialsProviderError = void 0; +const ProviderError_1 = __nccwpck_require__(23324); +class CredentialsProviderError extends ProviderError_1.ProviderError { + constructor(message, tryNextLink = true) { + super(message, tryNextLink); + this.tryNextLink = tryNextLink; + this.name = "CredentialsProviderError"; + Object.setPrototypeOf(this, CredentialsProviderError.prototype); + } +} +exports.CredentialsProviderError = CredentialsProviderError; /***/ }), -/***/ 54766: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 23324: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.loadConfig = void 0; -const property_provider_1 = __nccwpck_require__(79721); -const fromEnv_1 = __nccwpck_require__(15606); -const fromSharedConfigFiles_1 = __nccwpck_require__(45784); -const fromStatic_1 = __nccwpck_require__(23091); -const loadConfig = ({ environmentVariableSelector, configFileSelector, default: defaultValue }, configuration = {}) => (0, property_provider_1.memoize)((0, property_provider_1.chain)((0, fromEnv_1.fromEnv)(environmentVariableSelector), (0, fromSharedConfigFiles_1.fromSharedConfigFiles)(configFileSelector, configuration), (0, fromStatic_1.fromStatic)(defaultValue))); -exports.loadConfig = loadConfig; +exports.ProviderError = void 0; +class ProviderError extends Error { + constructor(message, tryNextLink = true) { + super(message); + this.tryNextLink = tryNextLink; + this.name = "ProviderError"; + Object.setPrototypeOf(this, ProviderError.prototype); + } + static from(error, tryNextLink = true) { + return Object.assign(new this(error.message, tryNextLink), error); + } +} +exports.ProviderError = ProviderError; /***/ }), -/***/ 15606: +/***/ 50429: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fromEnv = void 0; -const property_provider_1 = __nccwpck_require__(79721); -const fromEnv = (envVarSelector) => async () => { - try { - const config = envVarSelector(process.env); - if (config === undefined) { - throw new Error(); - } - return config; - } - catch (e) { - throw new property_provider_1.CredentialsProviderError(e.message || `Cannot load config from environment variables with getter: ${envVarSelector}`); +exports.TokenProviderError = void 0; +const ProviderError_1 = __nccwpck_require__(23324); +class TokenProviderError extends ProviderError_1.ProviderError { + constructor(message, tryNextLink = true) { + super(message, tryNextLink); + this.tryNextLink = tryNextLink; + this.name = "TokenProviderError"; + Object.setPrototypeOf(this, TokenProviderError.prototype); } -}; -exports.fromEnv = fromEnv; +} +exports.TokenProviderError = TokenProviderError; /***/ }), -/***/ 45784: +/***/ 45079: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fromSharedConfigFiles = void 0; -const property_provider_1 = __nccwpck_require__(79721); -const shared_ini_file_loader_1 = __nccwpck_require__(43507); -const fromSharedConfigFiles = (configSelector, { preferredFile = "config", ...init } = {}) => async () => { - const profile = (0, shared_ini_file_loader_1.getProfileName)(init); - const { configFile, credentialsFile } = await (0, shared_ini_file_loader_1.loadSharedConfigFiles)(init); - const profileFromCredentials = credentialsFile[profile] || {}; - const profileFromConfig = configFile[profile] || {}; - const mergedProfile = preferredFile === "config" - ? { ...profileFromCredentials, ...profileFromConfig } - : { ...profileFromConfig, ...profileFromCredentials }; - try { - const cfgFile = preferredFile === "config" ? configFile : credentialsFile; - const configValue = configSelector(mergedProfile, cfgFile); - if (configValue === undefined) { - throw new Error(); - } - return configValue; +exports.chain = void 0; +const ProviderError_1 = __nccwpck_require__(23324); +const chain = (...providers) => async () => { + if (providers.length === 0) { + throw new ProviderError_1.ProviderError("No providers in chain"); } - catch (e) { - throw new property_provider_1.CredentialsProviderError(e.message || `Cannot load config for profile ${profile} in SDK configuration files with getter: ${configSelector}`); + let lastProviderError; + for (const provider of providers) { + try { + const credentials = await provider(); + return credentials; + } + catch (err) { + lastProviderError = err; + if (err === null || err === void 0 ? void 0 : err.tryNextLink) { + continue; + } + throw err; + } } + throw lastProviderError; }; -exports.fromSharedConfigFiles = fromSharedConfigFiles; +exports.chain = chain; /***/ }), -/***/ 23091: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 51322: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.fromStatic = void 0; -const property_provider_1 = __nccwpck_require__(79721); -const isFunction = (func) => typeof func === "function"; -const fromStatic = (defaultValue) => isFunction(defaultValue) ? async () => await defaultValue() : (0, property_provider_1.fromStatic)(defaultValue); +const fromStatic = (staticValue) => () => Promise.resolve(staticValue); exports.fromStatic = fromStatic; /***/ }), -/***/ 33461: +/***/ 79721: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(54766), exports); +tslib_1.__exportStar(__nccwpck_require__(63936), exports); +tslib_1.__exportStar(__nccwpck_require__(23324), exports); +tslib_1.__exportStar(__nccwpck_require__(50429), exports); +tslib_1.__exportStar(__nccwpck_require__(45079), exports); +tslib_1.__exportStar(__nccwpck_require__(51322), exports); +tslib_1.__exportStar(__nccwpck_require__(49762), exports); /***/ }), -/***/ 33946: +/***/ 49762: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NODEJS_TIMEOUT_ERROR_CODES = void 0; -exports.NODEJS_TIMEOUT_ERROR_CODES = ["ECONNRESET", "EPIPE", "ETIMEDOUT"]; +exports.memoize = void 0; +const memoize = (provider, isExpired, requiresRefresh) => { + let resolved; + let pending; + let hasResult; + let isConstant = false; + const coalesceProvider = async () => { + if (!pending) { + pending = provider(); + } + try { + resolved = await pending; + hasResult = true; + isConstant = false; + } + finally { + pending = undefined; + } + return resolved; + }; + if (isExpired === undefined) { + return async (options) => { + if (!hasResult || (options === null || options === void 0 ? void 0 : options.forceRefresh)) { + resolved = await coalesceProvider(); + } + return resolved; + }; + } + return async (options) => { + if (!hasResult || (options === null || options === void 0 ? void 0 : options.forceRefresh)) { + resolved = await coalesceProvider(); + } + if (isConstant) { + return resolved; + } + if (requiresRefresh && !requiresRefresh(resolved)) { + isConstant = true; + return resolved; + } + if (isExpired(resolved)) { + await coalesceProvider(); + return resolved; + } + return resolved; + }; +}; +exports.memoize = memoize; /***/ }), -/***/ 70508: +/***/ 89179: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Field = void 0; +const types_1 = __nccwpck_require__(55756); +class Field { + constructor({ name, kind = types_1.FieldPosition.HEADER, values = [] }) { + this.name = name; + this.kind = kind; + this.values = values; + } + add(value) { + this.values.push(value); + } + set(values) { + this.values = values; + } + remove(value) { + this.values = this.values.filter((v) => v !== value); + } + toString() { + return this.values.map((v) => (v.includes(",") || v.includes(" ") ? `"${v}"` : v)).join(", "); + } + get() { + return this.values; + } +} +exports.Field = Field; + + +/***/ }), + +/***/ 99242: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getTransformedHeaders = void 0; -const getTransformedHeaders = (headers) => { - const transformedHeaders = {}; - for (const name of Object.keys(headers)) { - const headerValues = headers[name]; - transformedHeaders[name] = Array.isArray(headerValues) ? headerValues.join(",") : headerValues; +exports.Fields = void 0; +class Fields { + constructor({ fields = [], encoding = "utf-8" }) { + this.entries = {}; + fields.forEach(this.setField.bind(this)); + this.encoding = encoding; } - return transformedHeaders; + setField(field) { + this.entries[field.name.toLowerCase()] = field; + } + getField(name) { + return this.entries[name.toLowerCase()]; + } + removeField(name) { + delete this.entries[name.toLowerCase()]; + } + getByType(kind) { + return Object.values(this.entries).filter((field) => field.kind === kind); + } +} +exports.Fields = Fields; + + +/***/ }), + +/***/ 22474: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.resolveHttpHandlerRuntimeConfig = exports.getHttpHandlerExtensionConfiguration = void 0; +const getHttpHandlerExtensionConfiguration = (runtimeConfig) => { + let httpHandler = runtimeConfig.httpHandler; + return { + setHttpHandler(handler) { + httpHandler = handler; + }, + httpHandler() { + return httpHandler; + }, + updateHttpClientConfig(key, value) { + httpHandler.updateHttpClientConfig(key, value); + }, + httpHandlerConfigs() { + return httpHandler.httpHandlerConfigs(); + }, + }; }; -exports.getTransformedHeaders = getTransformedHeaders; +exports.getHttpHandlerExtensionConfiguration = getHttpHandlerExtensionConfiguration; +const resolveHttpHandlerRuntimeConfig = (httpHandlerExtensionConfiguration) => { + return { + httpHandler: httpHandlerExtensionConfiguration.httpHandler(), + }; +}; +exports.resolveHttpHandlerRuntimeConfig = resolveHttpHandlerRuntimeConfig; /***/ }), -/***/ 20258: +/***/ 91654: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(96948), exports); -tslib_1.__exportStar(__nccwpck_require__(46999), exports); -tslib_1.__exportStar(__nccwpck_require__(81030), exports); +tslib_1.__exportStar(__nccwpck_require__(22474), exports); /***/ }), -/***/ 96948: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 63206: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NodeHttpHandler = exports.DEFAULT_REQUEST_TIMEOUT = void 0; -const protocol_http_1 = __nccwpck_require__(64418); -const querystring_builder_1 = __nccwpck_require__(68031); -const http_1 = __nccwpck_require__(13685); -const https_1 = __nccwpck_require__(95687); -const constants_1 = __nccwpck_require__(33946); -const get_transformed_headers_1 = __nccwpck_require__(70508); -const set_connection_timeout_1 = __nccwpck_require__(25545); -const set_socket_keep_alive_1 = __nccwpck_require__(83751); -const set_socket_timeout_1 = __nccwpck_require__(42618); -const write_request_body_1 = __nccwpck_require__(73766); -exports.DEFAULT_REQUEST_TIMEOUT = 0; -class NodeHttpHandler { + + +/***/ }), + +/***/ 38746: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.HttpRequest = void 0; +class HttpRequest { constructor(options) { - this.metadata = { handlerProtocol: "http/1.1" }; - this.configProvider = new Promise((resolve, reject) => { - if (typeof options === "function") { - options() - .then((_options) => { - resolve(this.resolveDefaultConfig(_options)); - }) - .catch(reject); - } - else { - resolve(this.resolveDefaultConfig(options)); - } - }); - } - resolveDefaultConfig(options) { - const { requestTimeout, connectionTimeout, socketTimeout, httpAgent, httpsAgent } = options || {}; - const keepAlive = true; - const maxSockets = 50; - return { - connectionTimeout, - requestTimeout: requestTimeout !== null && requestTimeout !== void 0 ? requestTimeout : socketTimeout, - httpAgent: httpAgent || new http_1.Agent({ keepAlive, maxSockets }), - httpsAgent: httpsAgent || new https_1.Agent({ keepAlive, maxSockets }), - }; + this.method = options.method || "GET"; + this.hostname = options.hostname || "localhost"; + this.port = options.port; + this.query = options.query || {}; + this.headers = options.headers || {}; + this.body = options.body; + this.protocol = options.protocol + ? options.protocol.slice(-1) !== ":" + ? `${options.protocol}:` + : options.protocol + : "https:"; + this.path = options.path ? (options.path.charAt(0) !== "/" ? `/${options.path}` : options.path) : "/"; + this.username = options.username; + this.password = options.password; + this.fragment = options.fragment; } - destroy() { - var _a, _b, _c, _d; - (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.httpAgent) === null || _b === void 0 ? void 0 : _b.destroy(); - (_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.httpsAgent) === null || _d === void 0 ? void 0 : _d.destroy(); + static isInstance(request) { + if (!request) + return false; + const req = request; + return ("method" in req && + "protocol" in req && + "hostname" in req && + "path" in req && + typeof req["query"] === "object" && + typeof req["headers"] === "object"); } - async handle(request, { abortSignal } = {}) { - if (!this.config) { - this.config = await this.configProvider; - } - return new Promise((_resolve, _reject) => { - var _a, _b; - let writeRequestBodyPromise = undefined; - const resolve = async (arg) => { - await writeRequestBodyPromise; - _resolve(arg); - }; - const reject = async (arg) => { - await writeRequestBodyPromise; - _reject(arg); - }; - if (!this.config) { - throw new Error("Node HTTP request handler config is not resolved"); - } - if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) { - const abortError = new Error("Request aborted"); - abortError.name = "AbortError"; - reject(abortError); - return; - } - const isSSL = request.protocol === "https:"; - const queryString = (0, querystring_builder_1.buildQueryString)(request.query || {}); - let auth = undefined; - if (request.username != null || request.password != null) { - const username = (_a = request.username) !== null && _a !== void 0 ? _a : ""; - const password = (_b = request.password) !== null && _b !== void 0 ? _b : ""; - auth = `${username}:${password}`; - } - let path = request.path; - if (queryString) { - path += `?${queryString}`; - } - if (request.fragment) { - path += `#${request.fragment}`; - } - const nodeHttpsOptions = { - headers: request.headers, - host: request.hostname, - method: request.method, - path, - port: request.port, - agent: isSSL ? this.config.httpsAgent : this.config.httpAgent, - auth, - }; - const requestFunc = isSSL ? https_1.request : http_1.request; - const req = requestFunc(nodeHttpsOptions, (res) => { - const httpResponse = new protocol_http_1.HttpResponse({ - statusCode: res.statusCode || -1, - reason: res.statusMessage, - headers: (0, get_transformed_headers_1.getTransformedHeaders)(res.headers), - body: res, - }); - resolve({ response: httpResponse }); - }); - req.on("error", (err) => { - if (constants_1.NODEJS_TIMEOUT_ERROR_CODES.includes(err.code)) { - reject(Object.assign(err, { name: "TimeoutError" })); - } - else { - reject(err); - } - }); - (0, set_connection_timeout_1.setConnectionTimeout)(req, reject, this.config.connectionTimeout); - (0, set_socket_timeout_1.setSocketTimeout)(req, reject, this.config.requestTimeout); - if (abortSignal) { - abortSignal.onabort = () => { - req.abort(); - const abortError = new Error("Request aborted"); - abortError.name = "AbortError"; - reject(abortError); - }; - } - const httpAgent = nodeHttpsOptions.agent; - if (typeof httpAgent === "object" && "keepAlive" in httpAgent) { - (0, set_socket_keep_alive_1.setSocketKeepAlive)(req, { - keepAlive: httpAgent.keepAlive, - keepAliveMsecs: httpAgent.keepAliveMsecs, - }); - } - writeRequestBodyPromise = (0, write_request_body_1.writeRequestBody)(req, request, this.config.requestTimeout).catch(_reject); + clone() { + const cloned = new HttpRequest({ + ...this, + headers: { ...this.headers }, }); + if (cloned.query) + cloned.query = cloneQuery(cloned.query); + return cloned; } - updateHttpClientConfig(key, value) { - this.config = undefined; - this.configProvider = this.configProvider.then((config) => { - return { - ...config, - [key]: value, - }; - }); +} +exports.HttpRequest = HttpRequest; +function cloneQuery(query) { + return Object.keys(query).reduce((carry, paramName) => { + const param = query[paramName]; + return { + ...carry, + [paramName]: Array.isArray(param) ? [...param] : param, + }; + }, {}); +} + + +/***/ }), + +/***/ 26322: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.HttpResponse = void 0; +class HttpResponse { + constructor(options) { + this.statusCode = options.statusCode; + this.reason = options.reason; + this.headers = options.headers || {}; + this.body = options.body; } - httpHandlerConfigs() { - var _a; - return (_a = this.config) !== null && _a !== void 0 ? _a : {}; + static isInstance(response) { + if (!response) + return false; + const resp = response; + return typeof resp.statusCode === "number" && typeof resp.headers === "object"; } } -exports.NodeHttpHandler = NodeHttpHandler; +exports.HttpResponse = HttpResponse; + + +/***/ }), + +/***/ 64418: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(91654), exports); +tslib_1.__exportStar(__nccwpck_require__(89179), exports); +tslib_1.__exportStar(__nccwpck_require__(99242), exports); +tslib_1.__exportStar(__nccwpck_require__(63206), exports); +tslib_1.__exportStar(__nccwpck_require__(38746), exports); +tslib_1.__exportStar(__nccwpck_require__(26322), exports); +tslib_1.__exportStar(__nccwpck_require__(61466), exports); +tslib_1.__exportStar(__nccwpck_require__(19135), exports); + + +/***/ }), + +/***/ 61466: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isValidHostname = void 0; +function isValidHostname(hostname) { + const hostPattern = /^[a-z0-9][a-z0-9\.\-]*[a-z0-9]$/; + return hostPattern.test(hostname); +} +exports.isValidHostname = isValidHostname; /***/ }), -/***/ 5771: +/***/ 19135: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 68031: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NodeHttp2ConnectionManager = void 0; -const tslib_1 = __nccwpck_require__(4351); -const http2_1 = tslib_1.__importDefault(__nccwpck_require__(85158)); -const node_http2_connection_pool_1 = __nccwpck_require__(95157); -class NodeHttp2ConnectionManager { - constructor(config) { - this.sessionCache = new Map(); - this.config = config; - if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) { - throw new RangeError("maxConcurrency must be greater than zero."); - } - } - lease(requestContext, connectionConfiguration) { - const url = this.getUrlString(requestContext); - const existingPool = this.sessionCache.get(url); - if (existingPool) { - const existingSession = existingPool.poll(); - if (existingSession && !this.config.disableConcurrency) { - return existingSession; +exports.buildQueryString = void 0; +const util_uri_escape_1 = __nccwpck_require__(54197); +function buildQueryString(query) { + const parts = []; + for (let key of Object.keys(query).sort()) { + const value = query[key]; + key = (0, util_uri_escape_1.escapeUri)(key); + if (Array.isArray(value)) { + for (let i = 0, iLen = value.length; i < iLen; i++) { + parts.push(`${key}=${(0, util_uri_escape_1.escapeUri)(value[i])}`); } } - const session = http2_1.default.connect(url); - if (this.config.maxConcurrency) { - session.settings({ maxConcurrentStreams: this.config.maxConcurrency }, (err) => { - if (err) { - throw new Error("Fail to set maxConcurrentStreams to " + - this.config.maxConcurrency + - "when creating new session for " + - requestContext.destination.toString()); - } - }); - } - session.unref(); - const destroySessionCb = () => { - session.destroy(); - this.deleteSession(url, session); - }; - session.on("goaway", destroySessionCb); - session.on("error", destroySessionCb); - session.on("frameError", destroySessionCb); - session.on("close", () => this.deleteSession(url, session)); - if (connectionConfiguration.requestTimeout) { - session.setTimeout(connectionConfiguration.requestTimeout, destroySessionCb); - } - const connectionPool = this.sessionCache.get(url) || new node_http2_connection_pool_1.NodeHttp2ConnectionPool(); - connectionPool.offerLast(session); - this.sessionCache.set(url, connectionPool); - return session; - } - deleteSession(authority, session) { - const existingConnectionPool = this.sessionCache.get(authority); - if (!existingConnectionPool) { - return; - } - if (!existingConnectionPool.contains(session)) { - return; - } - existingConnectionPool.remove(session); - this.sessionCache.set(authority, existingConnectionPool); - } - release(requestContext, session) { - var _a; - const cacheKey = this.getUrlString(requestContext); - (_a = this.sessionCache.get(cacheKey)) === null || _a === void 0 ? void 0 : _a.offerLast(session); - } - destroy() { - for (const [key, connectionPool] of this.sessionCache) { - for (const session of connectionPool) { - if (!session.destroyed) { - session.destroy(); - } - connectionPool.remove(session); + else { + let qsEntry = key; + if (value || typeof value === "string") { + qsEntry += `=${(0, util_uri_escape_1.escapeUri)(value)}`; } - this.sessionCache.delete(key); - } - } - setMaxConcurrentStreams(maxConcurrentStreams) { - if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) { - throw new RangeError("maxConcurrentStreams must be greater than zero."); + parts.push(qsEntry); } - this.config.maxConcurrency = maxConcurrentStreams; - } - setDisableConcurrentStreams(disableConcurrentStreams) { - this.config.disableConcurrency = disableConcurrentStreams; - } - getUrlString(request) { - return request.destination.toString(); } + return parts.join("&"); } -exports.NodeHttp2ConnectionManager = NodeHttp2ConnectionManager; +exports.buildQueryString = buildQueryString; /***/ }), -/***/ 95157: +/***/ 4769: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NodeHttp2ConnectionPool = void 0; -class NodeHttp2ConnectionPool { - constructor(sessions) { - this.sessions = []; - this.sessions = sessions !== null && sessions !== void 0 ? sessions : []; - } - poll() { - if (this.sessions.length > 0) { - return this.sessions.shift(); - } - } - offerLast(session) { - this.sessions.push(session); - } - contains(session) { - return this.sessions.includes(session); - } - remove(session) { - this.sessions = this.sessions.filter((s) => s !== session); - } - [Symbol.iterator]() { - return this.sessions[Symbol.iterator](); - } - destroy(connection) { - for (const session of this.sessions) { - if (session === connection) { - if (!session.destroyed) { - session.destroy(); - } +exports.parseQueryString = void 0; +function parseQueryString(querystring) { + const query = {}; + querystring = querystring.replace(/^\?/, ""); + if (querystring) { + for (const pair of querystring.split("&")) { + let [key, value = null] = pair.split("="); + key = decodeURIComponent(key); + if (value) { + value = decodeURIComponent(value); + } + if (!(key in query)) { + query[key] = value; + } + else if (Array.isArray(query[key])) { + query[key].push(value); + } + else { + query[key] = [query[key], value]; } } } + return query; } -exports.NodeHttp2ConnectionPool = NodeHttp2ConnectionPool; +exports.parseQueryString = parseQueryString; /***/ }), -/***/ 46999: +/***/ 68415: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NODEJS_TIMEOUT_ERROR_CODES = exports.TRANSIENT_ERROR_STATUS_CODES = exports.TRANSIENT_ERROR_CODES = exports.THROTTLING_ERROR_CODES = exports.CLOCK_SKEW_ERROR_CODES = void 0; +exports.CLOCK_SKEW_ERROR_CODES = [ + "AuthFailure", + "InvalidSignatureException", + "RequestExpired", + "RequestInTheFuture", + "RequestTimeTooSkewed", + "SignatureDoesNotMatch", +]; +exports.THROTTLING_ERROR_CODES = [ + "BandwidthLimitExceeded", + "EC2ThrottledException", + "LimitExceededException", + "PriorRequestNotComplete", + "ProvisionedThroughputExceededException", + "RequestLimitExceeded", + "RequestThrottled", + "RequestThrottledException", + "SlowDown", + "ThrottledException", + "Throttling", + "ThrottlingException", + "TooManyRequestsException", + "TransactionInProgressException", +]; +exports.TRANSIENT_ERROR_CODES = ["TimeoutError", "RequestTimeout", "RequestTimeoutException"]; +exports.TRANSIENT_ERROR_STATUS_CODES = [500, 502, 503, 504]; +exports.NODEJS_TIMEOUT_ERROR_CODES = ["ECONNRESET", "ECONNREFUSED", "EPIPE", "ETIMEDOUT"]; + + +/***/ }), + +/***/ 6375: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NodeHttp2Handler = void 0; -const protocol_http_1 = __nccwpck_require__(64418); -const querystring_builder_1 = __nccwpck_require__(68031); -const http2_1 = __nccwpck_require__(85158); -const get_transformed_headers_1 = __nccwpck_require__(70508); -const node_http2_connection_manager_1 = __nccwpck_require__(5771); -const write_request_body_1 = __nccwpck_require__(73766); -class NodeHttp2Handler { - constructor(options) { - this.metadata = { handlerProtocol: "h2" }; - this.connectionManager = new node_http2_connection_manager_1.NodeHttp2ConnectionManager({}); - this.configProvider = new Promise((resolve, reject) => { - if (typeof options === "function") { - options() - .then((opts) => { - resolve(opts || {}); - }) - .catch(reject); - } - else { - resolve(options || {}); - } - }); - } - destroy() { - this.connectionManager.destroy(); - } - async handle(request, { abortSignal } = {}) { - if (!this.config) { - this.config = await this.configProvider; - this.connectionManager.setDisableConcurrentStreams(this.config.disableConcurrentStreams || false); - if (this.config.maxConcurrentStreams) { - this.connectionManager.setMaxConcurrentStreams(this.config.maxConcurrentStreams); - } +exports.isServerError = exports.isTransientError = exports.isThrottlingError = exports.isClockSkewError = exports.isRetryableByTrait = void 0; +const constants_1 = __nccwpck_require__(68415); +const isRetryableByTrait = (error) => error.$retryable !== undefined; +exports.isRetryableByTrait = isRetryableByTrait; +const isClockSkewError = (error) => constants_1.CLOCK_SKEW_ERROR_CODES.includes(error.name); +exports.isClockSkewError = isClockSkewError; +const isThrottlingError = (error) => { + var _a, _b; + return ((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) === 429 || + constants_1.THROTTLING_ERROR_CODES.includes(error.name) || + ((_b = error.$retryable) === null || _b === void 0 ? void 0 : _b.throttling) == true; +}; +exports.isThrottlingError = isThrottlingError; +const isTransientError = (error) => { + var _a; + return constants_1.TRANSIENT_ERROR_CODES.includes(error.name) || + constants_1.NODEJS_TIMEOUT_ERROR_CODES.includes((error === null || error === void 0 ? void 0 : error.code) || "") || + constants_1.TRANSIENT_ERROR_STATUS_CODES.includes(((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) || 0); +}; +exports.isTransientError = isTransientError; +const isServerError = (error) => { + var _a; + if (((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) !== undefined) { + const statusCode = error.$metadata.httpStatusCode; + if (500 <= statusCode && statusCode <= 599 && !(0, exports.isTransientError)(error)) { + return true; } - const { requestTimeout, disableConcurrentStreams } = this.config; - return new Promise((_resolve, _reject) => { - var _a, _b, _c; - let fulfilled = false; - let writeRequestBodyPromise = undefined; - const resolve = async (arg) => { - await writeRequestBodyPromise; - _resolve(arg); - }; - const reject = async (arg) => { - await writeRequestBodyPromise; - _reject(arg); - }; - if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) { - fulfilled = true; - const abortError = new Error("Request aborted"); - abortError.name = "AbortError"; - reject(abortError); - return; - } - const { hostname, method, port, protocol, query } = request; - let auth = ""; - if (request.username != null || request.password != null) { - const username = (_a = request.username) !== null && _a !== void 0 ? _a : ""; - const password = (_b = request.password) !== null && _b !== void 0 ? _b : ""; - auth = `${username}:${password}@`; - } - const authority = `${protocol}//${auth}${hostname}${port ? `:${port}` : ""}`; - const requestContext = { destination: new URL(authority) }; - const session = this.connectionManager.lease(requestContext, { - requestTimeout: (_c = this.config) === null || _c === void 0 ? void 0 : _c.sessionTimeout, - disableConcurrentStreams: disableConcurrentStreams || false, - }); - const rejectWithDestroy = (err) => { - if (disableConcurrentStreams) { - this.destroySession(session); - } - fulfilled = true; - reject(err); - }; - const queryString = (0, querystring_builder_1.buildQueryString)(query || {}); - let path = request.path; - if (queryString) { - path += `?${queryString}`; - } - if (request.fragment) { - path += `#${request.fragment}`; - } - const req = session.request({ - ...request.headers, - [http2_1.constants.HTTP2_HEADER_PATH]: path, - [http2_1.constants.HTTP2_HEADER_METHOD]: method, - }); - session.ref(); - req.on("response", (headers) => { - const httpResponse = new protocol_http_1.HttpResponse({ - statusCode: headers[":status"] || -1, - headers: (0, get_transformed_headers_1.getTransformedHeaders)(headers), - body: req, - }); - fulfilled = true; - resolve({ response: httpResponse }); - if (disableConcurrentStreams) { - session.close(); - this.connectionManager.deleteSession(authority, session); - } - }); - if (requestTimeout) { - req.setTimeout(requestTimeout, () => { - req.close(); - const timeoutError = new Error(`Stream timed out because of no activity for ${requestTimeout} ms`); - timeoutError.name = "TimeoutError"; - rejectWithDestroy(timeoutError); - }); - } - if (abortSignal) { - abortSignal.onabort = () => { - req.close(); - const abortError = new Error("Request aborted"); - abortError.name = "AbortError"; - rejectWithDestroy(abortError); - }; - } - req.on("frameError", (type, code, id) => { - rejectWithDestroy(new Error(`Frame type id ${type} in stream id ${id} has failed with code ${code}.`)); - }); - req.on("error", rejectWithDestroy); - req.on("aborted", () => { - rejectWithDestroy(new Error(`HTTP/2 stream is abnormally aborted in mid-communication with result code ${req.rstCode}.`)); - }); - req.on("close", () => { - session.unref(); - if (disableConcurrentStreams) { - session.destroy(); - } - if (!fulfilled) { - rejectWithDestroy(new Error("Unexpected error: http2 request did not get a response")); - } - }); - writeRequestBodyPromise = (0, write_request_body_1.writeRequestBody)(req, request, requestTimeout); - }); - } - updateHttpClientConfig(key, value) { - this.config = undefined; - this.configProvider = this.configProvider.then((config) => { - return { - ...config, - [key]: value, - }; - }); - } - httpHandlerConfigs() { - var _a; - return (_a = this.config) !== null && _a !== void 0 ? _a : {}; + return false; } - destroySession(session) { - if (!session.destroyed) { - session.destroy(); - } + return false; +}; +exports.isServerError = isServerError; + + +/***/ }), + +/***/ 46062: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getConfigData = void 0; +const types_1 = __nccwpck_require__(55756); +const loadSharedConfigFiles_1 = __nccwpck_require__(41879); +const getConfigData = (data) => Object.entries(data) + .filter(([key]) => { + const sections = key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR); + if (sections.length === 2 && Object.values(types_1.IniSectionType).includes(sections[0])) { + return true; } -} -exports.NodeHttp2Handler = NodeHttp2Handler; + return false; +}) + .reduce((acc, [key, value]) => { + const updatedKey = key.startsWith(types_1.IniSectionType.PROFILE) ? key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR)[1] : key; + acc[updatedKey] = value; + return acc; +}, { + ...(data.default && { default: data.default }), +}); +exports.getConfigData = getConfigData; /***/ }), -/***/ 25545: -/***/ ((__unused_webpack_module, exports) => { +/***/ 47237: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.setConnectionTimeout = void 0; -const setConnectionTimeout = (request, reject, timeoutInMs = 0) => { - if (!timeoutInMs) { - return; +exports.getConfigFilepath = exports.ENV_CONFIG_PATH = void 0; +const path_1 = __nccwpck_require__(71017); +const getHomeDir_1 = __nccwpck_require__(68340); +exports.ENV_CONFIG_PATH = "AWS_CONFIG_FILE"; +const getConfigFilepath = () => process.env[exports.ENV_CONFIG_PATH] || (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), ".aws", "config"); +exports.getConfigFilepath = getConfigFilepath; + + +/***/ }), + +/***/ 99036: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getCredentialsFilepath = exports.ENV_CREDENTIALS_PATH = void 0; +const path_1 = __nccwpck_require__(71017); +const getHomeDir_1 = __nccwpck_require__(68340); +exports.ENV_CREDENTIALS_PATH = "AWS_SHARED_CREDENTIALS_FILE"; +const getCredentialsFilepath = () => process.env[exports.ENV_CREDENTIALS_PATH] || (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), ".aws", "credentials"); +exports.getCredentialsFilepath = getCredentialsFilepath; + + +/***/ }), + +/***/ 68340: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getHomeDir = void 0; +const os_1 = __nccwpck_require__(22037); +const path_1 = __nccwpck_require__(71017); +const homeDirCache = {}; +const getHomeDirCacheKey = () => { + if (process && process.geteuid) { + return `${process.geteuid()}`; } - const timeoutId = setTimeout(() => { - request.destroy(); - reject(Object.assign(new Error(`Socket timed out without establishing a connection within ${timeoutInMs} ms`), { - name: "TimeoutError", - })); - }, timeoutInMs); - request.on("socket", (socket) => { - if (socket.connecting) { - socket.on("connect", () => { - clearTimeout(timeoutId); - }); - } - else { - clearTimeout(timeoutId); - } - }); + return "DEFAULT"; +}; +const getHomeDir = () => { + const { HOME, USERPROFILE, HOMEPATH, HOMEDRIVE = `C:${path_1.sep}` } = process.env; + if (HOME) + return HOME; + if (USERPROFILE) + return USERPROFILE; + if (HOMEPATH) + return `${HOMEDRIVE}${HOMEPATH}`; + const homeDirCacheKey = getHomeDirCacheKey(); + if (!homeDirCache[homeDirCacheKey]) + homeDirCache[homeDirCacheKey] = (0, os_1.homedir)(); + return homeDirCache[homeDirCacheKey]; }; -exports.setConnectionTimeout = setConnectionTimeout; +exports.getHomeDir = getHomeDir; /***/ }), -/***/ 83751: +/***/ 52802: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.setSocketKeepAlive = void 0; -const setSocketKeepAlive = (request, { keepAlive, keepAliveMsecs }) => { - if (keepAlive !== true) { - return; - } - request.on("socket", (socket) => { - socket.setKeepAlive(keepAlive, keepAliveMsecs || 0); - }); -}; -exports.setSocketKeepAlive = setSocketKeepAlive; +exports.getProfileName = exports.DEFAULT_PROFILE = exports.ENV_PROFILE = void 0; +exports.ENV_PROFILE = "AWS_PROFILE"; +exports.DEFAULT_PROFILE = "default"; +const getProfileName = (init) => init.profile || process.env[exports.ENV_PROFILE] || exports.DEFAULT_PROFILE; +exports.getProfileName = getProfileName; /***/ }), -/***/ 42618: -/***/ ((__unused_webpack_module, exports) => { +/***/ 24740: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.setSocketTimeout = void 0; -const setSocketTimeout = (request, reject, timeoutInMs = 0) => { - request.setTimeout(timeoutInMs, () => { - request.destroy(); - reject(Object.assign(new Error(`Connection timed out after ${timeoutInMs} ms`), { name: "TimeoutError" })); - }); +exports.getSSOTokenFilepath = void 0; +const crypto_1 = __nccwpck_require__(6113); +const path_1 = __nccwpck_require__(71017); +const getHomeDir_1 = __nccwpck_require__(68340); +const getSSOTokenFilepath = (id) => { + const hasher = (0, crypto_1.createHash)("sha1"); + const cacheName = hasher.update(id).digest("hex"); + return (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), ".aws", "sso", "cache", `${cacheName}.json`); }; -exports.setSocketTimeout = setSocketTimeout; +exports.getSSOTokenFilepath = getSSOTokenFilepath; /***/ }), -/***/ 23211: +/***/ 69678: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Collector = void 0; -const stream_1 = __nccwpck_require__(12781); -class Collector extends stream_1.Writable { - constructor() { - super(...arguments); - this.bufferedBytes = []; - } - _write(chunk, encoding, callback) { - this.bufferedBytes.push(chunk); - callback(); - } -} -exports.Collector = Collector; +exports.getSSOTokenFromFile = void 0; +const fs_1 = __nccwpck_require__(57147); +const getSSOTokenFilepath_1 = __nccwpck_require__(24740); +const { readFile } = fs_1.promises; +const getSSOTokenFromFile = async (id) => { + const ssoTokenFilepath = (0, getSSOTokenFilepath_1.getSSOTokenFilepath)(id); + const ssoTokenText = await readFile(ssoTokenFilepath, "utf8"); + return JSON.parse(ssoTokenText); +}; +exports.getSSOTokenFromFile = getSSOTokenFromFile; /***/ }), -/***/ 81030: +/***/ 82820: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.streamCollector = void 0; -const collector_1 = __nccwpck_require__(23211); -const streamCollector = (stream) => new Promise((resolve, reject) => { - const collector = new collector_1.Collector(); - stream.pipe(collector); - stream.on("error", (err) => { - collector.end(); - reject(err); - }); - collector.on("error", reject); - collector.on("finish", function () { - const bytes = new Uint8Array(Buffer.concat(this.bufferedBytes)); - resolve(bytes); - }); -}); -exports.streamCollector = streamCollector; +exports.getSsoSessionData = void 0; +const types_1 = __nccwpck_require__(55756); +const loadSharedConfigFiles_1 = __nccwpck_require__(41879); +const getSsoSessionData = (data) => Object.entries(data) + .filter(([key]) => key.startsWith(types_1.IniSectionType.SSO_SESSION + loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR)) + .reduce((acc, [key, value]) => ({ ...acc, [key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR)[1]]: value }), {}); +exports.getSsoSessionData = getSsoSessionData; /***/ }), -/***/ 73766: +/***/ 43507: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.writeRequestBody = void 0; -const stream_1 = __nccwpck_require__(12781); -const MIN_WAIT_TIME = 1000; -async function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) { - var _a; - const headers = (_a = request.headers) !== null && _a !== void 0 ? _a : {}; - const expect = headers["Expect"] || headers["expect"]; - let timeoutId = -1; - let hasError = false; - if (expect === "100-continue") { - await Promise.race([ - new Promise((resolve) => { - timeoutId = Number(setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs))); - }), - new Promise((resolve) => { - httpRequest.on("continue", () => { - clearTimeout(timeoutId); - resolve(); - }); - httpRequest.on("error", () => { - hasError = true; - clearTimeout(timeoutId); - resolve(); - }); - }), - ]); - } - if (!hasError) { - writeBody(httpRequest, request.body); - } -} -exports.writeRequestBody = writeRequestBody; -function writeBody(httpRequest, body) { - if (body instanceof stream_1.Readable) { - body.pipe(httpRequest); - } - else if (body) { - httpRequest.end(Buffer.from(body)); - } - else { - httpRequest.end(); - } -} +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(68340), exports); +tslib_1.__exportStar(__nccwpck_require__(52802), exports); +tslib_1.__exportStar(__nccwpck_require__(24740), exports); +tslib_1.__exportStar(__nccwpck_require__(69678), exports); +tslib_1.__exportStar(__nccwpck_require__(41879), exports); +tslib_1.__exportStar(__nccwpck_require__(34649), exports); +tslib_1.__exportStar(__nccwpck_require__(2546), exports); +tslib_1.__exportStar(__nccwpck_require__(63191), exports); /***/ }), -/***/ 63936: +/***/ 41879: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.CredentialsProviderError = void 0; -const ProviderError_1 = __nccwpck_require__(23324); -class CredentialsProviderError extends ProviderError_1.ProviderError { - constructor(message, tryNextLink = true) { - super(message, tryNextLink); - this.tryNextLink = tryNextLink; - this.name = "CredentialsProviderError"; - Object.setPrototypeOf(this, CredentialsProviderError.prototype); - } -} -exports.CredentialsProviderError = CredentialsProviderError; +exports.loadSharedConfigFiles = exports.CONFIG_PREFIX_SEPARATOR = void 0; +const getConfigData_1 = __nccwpck_require__(46062); +const getConfigFilepath_1 = __nccwpck_require__(47237); +const getCredentialsFilepath_1 = __nccwpck_require__(99036); +const parseIni_1 = __nccwpck_require__(54262); +const slurpFile_1 = __nccwpck_require__(19155); +const swallowError = () => ({}); +exports.CONFIG_PREFIX_SEPARATOR = "."; +const loadSharedConfigFiles = async (init = {}) => { + const { filepath = (0, getCredentialsFilepath_1.getCredentialsFilepath)(), configFilepath = (0, getConfigFilepath_1.getConfigFilepath)() } = init; + const parsedFiles = await Promise.all([ + (0, slurpFile_1.slurpFile)(configFilepath, { + ignoreCache: init.ignoreCache, + }) + .then(parseIni_1.parseIni) + .then(getConfigData_1.getConfigData) + .catch(swallowError), + (0, slurpFile_1.slurpFile)(filepath, { + ignoreCache: init.ignoreCache, + }) + .then(parseIni_1.parseIni) + .catch(swallowError), + ]); + return { + configFile: parsedFiles[0], + credentialsFile: parsedFiles[1], + }; +}; +exports.loadSharedConfigFiles = loadSharedConfigFiles; /***/ }), -/***/ 23324: -/***/ ((__unused_webpack_module, exports) => { +/***/ 34649: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ProviderError = void 0; -class ProviderError extends Error { - constructor(message, tryNextLink = true) { - super(message); - this.tryNextLink = tryNextLink; - this.name = "ProviderError"; - Object.setPrototypeOf(this, ProviderError.prototype); - } - static from(error, tryNextLink = true) { - return Object.assign(new this(error.message, tryNextLink), error); - } -} -exports.ProviderError = ProviderError; +exports.loadSsoSessionData = void 0; +const getConfigFilepath_1 = __nccwpck_require__(47237); +const getSsoSessionData_1 = __nccwpck_require__(82820); +const parseIni_1 = __nccwpck_require__(54262); +const slurpFile_1 = __nccwpck_require__(19155); +const swallowError = () => ({}); +const loadSsoSessionData = async (init = {}) => { + var _a; + return (0, slurpFile_1.slurpFile)((_a = init.configFilepath) !== null && _a !== void 0 ? _a : (0, getConfigFilepath_1.getConfigFilepath)()) + .then(parseIni_1.parseIni) + .then(getSsoSessionData_1.getSsoSessionData) + .catch(swallowError); +}; +exports.loadSsoSessionData = loadSsoSessionData; /***/ }), -/***/ 50429: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 19447: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.TokenProviderError = void 0; -const ProviderError_1 = __nccwpck_require__(23324); -class TokenProviderError extends ProviderError_1.ProviderError { - constructor(message, tryNextLink = true) { - super(message, tryNextLink); - this.tryNextLink = tryNextLink; - this.name = "TokenProviderError"; - Object.setPrototypeOf(this, TokenProviderError.prototype); +exports.mergeConfigFiles = void 0; +const mergeConfigFiles = (...files) => { + const merged = {}; + for (const file of files) { + for (const [key, values] of Object.entries(file)) { + if (merged[key] !== undefined) { + Object.assign(merged[key], values); + } + else { + merged[key] = values; + } + } } -} -exports.TokenProviderError = TokenProviderError; + return merged; +}; +exports.mergeConfigFiles = mergeConfigFiles; /***/ }), -/***/ 45079: +/***/ 54262: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.chain = void 0; -const ProviderError_1 = __nccwpck_require__(23324); -const chain = (...providers) => async () => { - if (providers.length === 0) { - throw new ProviderError_1.ProviderError("No providers in chain"); - } - let lastProviderError; - for (const provider of providers) { - try { - const credentials = await provider(); - return credentials; +exports.parseIni = void 0; +const types_1 = __nccwpck_require__(55756); +const loadSharedConfigFiles_1 = __nccwpck_require__(41879); +const prefixKeyRegex = /^([\w-]+)\s(["'])?([\w-@\+\.%:/]+)\2$/; +const profileNameBlockList = ["__proto__", "profile __proto__"]; +const parseIni = (iniData) => { + const map = {}; + let currentSection; + let currentSubSection; + for (const iniLine of iniData.split(/\r?\n/)) { + const trimmedLine = iniLine.split(/(^|\s)[;#]/)[0].trim(); + const isSection = trimmedLine[0] === "[" && trimmedLine[trimmedLine.length - 1] === "]"; + if (isSection) { + currentSection = undefined; + currentSubSection = undefined; + const sectionName = trimmedLine.substring(1, trimmedLine.length - 1); + const matches = prefixKeyRegex.exec(sectionName); + if (matches) { + const [, prefix, , name] = matches; + if (Object.values(types_1.IniSectionType).includes(prefix)) { + currentSection = [prefix, name].join(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR); + } + } + else { + currentSection = sectionName; + } + if (profileNameBlockList.includes(sectionName)) { + throw new Error(`Found invalid profile name "${sectionName}"`); + } } - catch (err) { - lastProviderError = err; - if (err === null || err === void 0 ? void 0 : err.tryNextLink) { - continue; + else if (currentSection) { + const indexOfEqualsSign = trimmedLine.indexOf("="); + if (![0, -1].includes(indexOfEqualsSign)) { + const [name, value] = [ + trimmedLine.substring(0, indexOfEqualsSign).trim(), + trimmedLine.substring(indexOfEqualsSign + 1).trim(), + ]; + if (value === "") { + currentSubSection = name; + } + else { + if (currentSubSection && iniLine.trimStart() === iniLine) { + currentSubSection = undefined; + } + map[currentSection] = map[currentSection] || {}; + const key = currentSubSection ? [currentSubSection, name].join(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR) : name; + map[currentSection][key] = value; + } } - throw err; } } - throw lastProviderError; + return map; }; -exports.chain = chain; +exports.parseIni = parseIni; /***/ }), -/***/ 51322: -/***/ ((__unused_webpack_module, exports) => { +/***/ 2546: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fromStatic = void 0; -const fromStatic = (staticValue) => () => Promise.resolve(staticValue); -exports.fromStatic = fromStatic; +exports.parseKnownFiles = void 0; +const loadSharedConfigFiles_1 = __nccwpck_require__(41879); +const mergeConfigFiles_1 = __nccwpck_require__(19447); +const parseKnownFiles = async (init) => { + const parsedFiles = await (0, loadSharedConfigFiles_1.loadSharedConfigFiles)(init); + return (0, mergeConfigFiles_1.mergeConfigFiles)(parsedFiles.configFile, parsedFiles.credentialsFile); +}; +exports.parseKnownFiles = parseKnownFiles; /***/ }), -/***/ 79721: +/***/ 19155: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(63936), exports); -tslib_1.__exportStar(__nccwpck_require__(23324), exports); -tslib_1.__exportStar(__nccwpck_require__(50429), exports); -tslib_1.__exportStar(__nccwpck_require__(45079), exports); -tslib_1.__exportStar(__nccwpck_require__(51322), exports); -tslib_1.__exportStar(__nccwpck_require__(49762), exports); +exports.slurpFile = void 0; +const fs_1 = __nccwpck_require__(57147); +const { readFile } = fs_1.promises; +const filePromisesHash = {}; +const slurpFile = (path, options) => { + if (!filePromisesHash[path] || (options === null || options === void 0 ? void 0 : options.ignoreCache)) { + filePromisesHash[path] = readFile(path, "utf8"); + } + return filePromisesHash[path]; +}; +exports.slurpFile = slurpFile; /***/ }), -/***/ 49762: +/***/ 63191: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.memoize = void 0; -const memoize = (provider, isExpired, requiresRefresh) => { - let resolved; - let pending; - let hasResult; - let isConstant = false; - const coalesceProvider = async () => { - if (!pending) { - pending = provider(); - } - try { - resolved = await pending; - hasResult = true; - isConstant = false; - } - finally { - pending = undefined; - } - return resolved; - }; - if (isExpired === undefined) { - return async (options) => { - if (!hasResult || (options === null || options === void 0 ? void 0 : options.forceRefresh)) { - resolved = await coalesceProvider(); - } - return resolved; - }; - } - return async (options) => { - if (!hasResult || (options === null || options === void 0 ? void 0 : options.forceRefresh)) { - resolved = await coalesceProvider(); - } - if (isConstant) { - return resolved; - } - if (requiresRefresh && !requiresRefresh(resolved)) { - isConstant = true; - return resolved; - } - if (isExpired(resolved)) { - await coalesceProvider(); - return resolved; - } - return resolved; - }; -}; -exports.memoize = memoize; /***/ }), -/***/ 89179: +/***/ 39733: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Field = void 0; -const types_1 = __nccwpck_require__(55756); -class Field { - constructor({ name, kind = types_1.FieldPosition.HEADER, values = [] }) { - this.name = name; - this.kind = kind; - this.values = values; +exports.SignatureV4 = void 0; +const eventstream_codec_1 = __nccwpck_require__(56459); +const util_hex_encoding_1 = __nccwpck_require__(45364); +const util_middleware_1 = __nccwpck_require__(2390); +const util_utf8_1 = __nccwpck_require__(41895); +const constants_1 = __nccwpck_require__(48644); +const credentialDerivation_1 = __nccwpck_require__(19623); +const getCanonicalHeaders_1 = __nccwpck_require__(51393); +const getCanonicalQuery_1 = __nccwpck_require__(33243); +const getPayloadHash_1 = __nccwpck_require__(48545); +const headerUtil_1 = __nccwpck_require__(62179); +const moveHeadersToQuery_1 = __nccwpck_require__(49828); +const prepareRequest_1 = __nccwpck_require__(60075); +const utilDate_1 = __nccwpck_require__(39299); +class SignatureV4 { + constructor({ applyChecksum, credentials, region, service, sha256, uriEscapePath = true, }) { + this.headerMarshaller = new eventstream_codec_1.HeaderMarshaller(util_utf8_1.toUtf8, util_utf8_1.fromUtf8); + this.service = service; + this.sha256 = sha256; + this.uriEscapePath = uriEscapePath; + this.applyChecksum = typeof applyChecksum === "boolean" ? applyChecksum : true; + this.regionProvider = (0, util_middleware_1.normalizeProvider)(region); + this.credentialProvider = (0, util_middleware_1.normalizeProvider)(credentials); } - add(value) { - this.values.push(value); + async presign(originalRequest, options = {}) { + const { signingDate = new Date(), expiresIn = 3600, unsignableHeaders, unhoistableHeaders, signableHeaders, signingRegion, signingService, } = options; + const credentials = await this.credentialProvider(); + this.validateResolvedCredentials(credentials); + const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider()); + const { longDate, shortDate } = formatDate(signingDate); + if (expiresIn > constants_1.MAX_PRESIGNED_TTL) { + return Promise.reject("Signature version 4 presigned URLs" + " must have an expiration date less than one week in" + " the future"); + } + const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service); + const request = (0, moveHeadersToQuery_1.moveHeadersToQuery)((0, prepareRequest_1.prepareRequest)(originalRequest), { unhoistableHeaders }); + if (credentials.sessionToken) { + request.query[constants_1.TOKEN_QUERY_PARAM] = credentials.sessionToken; + } + request.query[constants_1.ALGORITHM_QUERY_PARAM] = constants_1.ALGORITHM_IDENTIFIER; + request.query[constants_1.CREDENTIAL_QUERY_PARAM] = `${credentials.accessKeyId}/${scope}`; + request.query[constants_1.AMZ_DATE_QUERY_PARAM] = longDate; + request.query[constants_1.EXPIRES_QUERY_PARAM] = expiresIn.toString(10); + const canonicalHeaders = (0, getCanonicalHeaders_1.getCanonicalHeaders)(request, unsignableHeaders, signableHeaders); + request.query[constants_1.SIGNED_HEADERS_QUERY_PARAM] = getCanonicalHeaderList(canonicalHeaders); + request.query[constants_1.SIGNATURE_QUERY_PARAM] = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, await (0, getPayloadHash_1.getPayloadHash)(originalRequest, this.sha256))); + return request; } - set(values) { - this.values = values; + async sign(toSign, options) { + if (typeof toSign === "string") { + return this.signString(toSign, options); + } + else if (toSign.headers && toSign.payload) { + return this.signEvent(toSign, options); + } + else if (toSign.message) { + return this.signMessage(toSign, options); + } + else { + return this.signRequest(toSign, options); + } } - remove(value) { - this.values = this.values.filter((v) => v !== value); + async signEvent({ headers, payload }, { signingDate = new Date(), priorSignature, signingRegion, signingService }) { + const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider()); + const { shortDate, longDate } = formatDate(signingDate); + const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service); + const hashedPayload = await (0, getPayloadHash_1.getPayloadHash)({ headers: {}, body: payload }, this.sha256); + const hash = new this.sha256(); + hash.update(headers); + const hashedHeaders = (0, util_hex_encoding_1.toHex)(await hash.digest()); + const stringToSign = [ + constants_1.EVENT_ALGORITHM_IDENTIFIER, + longDate, + scope, + priorSignature, + hashedHeaders, + hashedPayload, + ].join("\n"); + return this.signString(stringToSign, { signingDate, signingRegion: region, signingService }); + } + async signMessage(signableMessage, { signingDate = new Date(), signingRegion, signingService }) { + const promise = this.signEvent({ + headers: this.headerMarshaller.format(signableMessage.message.headers), + payload: signableMessage.message.body, + }, { + signingDate, + signingRegion, + signingService, + priorSignature: signableMessage.priorSignature, + }); + return promise.then((signature) => { + return { message: signableMessage.message, signature }; + }); } - toString() { - return this.values.map((v) => (v.includes(",") || v.includes(" ") ? `"${v}"` : v)).join(", "); + async signString(stringToSign, { signingDate = new Date(), signingRegion, signingService } = {}) { + const credentials = await this.credentialProvider(); + this.validateResolvedCredentials(credentials); + const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider()); + const { shortDate } = formatDate(signingDate); + const hash = new this.sha256(await this.getSigningKey(credentials, region, shortDate, signingService)); + hash.update((0, util_utf8_1.toUint8Array)(stringToSign)); + return (0, util_hex_encoding_1.toHex)(await hash.digest()); } - get() { - return this.values; + async signRequest(requestToSign, { signingDate = new Date(), signableHeaders, unsignableHeaders, signingRegion, signingService, } = {}) { + const credentials = await this.credentialProvider(); + this.validateResolvedCredentials(credentials); + const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider()); + const request = (0, prepareRequest_1.prepareRequest)(requestToSign); + const { longDate, shortDate } = formatDate(signingDate); + const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service); + request.headers[constants_1.AMZ_DATE_HEADER] = longDate; + if (credentials.sessionToken) { + request.headers[constants_1.TOKEN_HEADER] = credentials.sessionToken; + } + const payloadHash = await (0, getPayloadHash_1.getPayloadHash)(request, this.sha256); + if (!(0, headerUtil_1.hasHeader)(constants_1.SHA256_HEADER, request.headers) && this.applyChecksum) { + request.headers[constants_1.SHA256_HEADER] = payloadHash; + } + const canonicalHeaders = (0, getCanonicalHeaders_1.getCanonicalHeaders)(request, unsignableHeaders, signableHeaders); + const signature = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, payloadHash)); + request.headers[constants_1.AUTH_HEADER] = + `${constants_1.ALGORITHM_IDENTIFIER} ` + + `Credential=${credentials.accessKeyId}/${scope}, ` + + `SignedHeaders=${getCanonicalHeaderList(canonicalHeaders)}, ` + + `Signature=${signature}`; + return request; } -} -exports.Field = Field; - - -/***/ }), - -/***/ 99242: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; + createCanonicalRequest(request, canonicalHeaders, payloadHash) { + const sortedHeaders = Object.keys(canonicalHeaders).sort(); + return `${request.method} +${this.getCanonicalPath(request)} +${(0, getCanonicalQuery_1.getCanonicalQuery)(request)} +${sortedHeaders.map((name) => `${name}:${canonicalHeaders[name]}`).join("\n")} -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Fields = void 0; -class Fields { - constructor({ fields = [], encoding = "utf-8" }) { - this.entries = {}; - fields.forEach(this.setField.bind(this)); - this.encoding = encoding; +${sortedHeaders.join(";")} +${payloadHash}`; } - setField(field) { - this.entries[field.name.toLowerCase()] = field; + async createStringToSign(longDate, credentialScope, canonicalRequest) { + const hash = new this.sha256(); + hash.update((0, util_utf8_1.toUint8Array)(canonicalRequest)); + const hashedRequest = await hash.digest(); + return `${constants_1.ALGORITHM_IDENTIFIER} +${longDate} +${credentialScope} +${(0, util_hex_encoding_1.toHex)(hashedRequest)}`; } - getField(name) { - return this.entries[name.toLowerCase()]; + getCanonicalPath({ path }) { + if (this.uriEscapePath) { + const normalizedPathSegments = []; + for (const pathSegment of path.split("/")) { + if ((pathSegment === null || pathSegment === void 0 ? void 0 : pathSegment.length) === 0) + continue; + if (pathSegment === ".") + continue; + if (pathSegment === "..") { + normalizedPathSegments.pop(); + } + else { + normalizedPathSegments.push(pathSegment); + } + } + const normalizedPath = `${(path === null || path === void 0 ? void 0 : path.startsWith("/")) ? "/" : ""}${normalizedPathSegments.join("/")}${normalizedPathSegments.length > 0 && (path === null || path === void 0 ? void 0 : path.endsWith("/")) ? "/" : ""}`; + const doubleEncoded = encodeURIComponent(normalizedPath); + return doubleEncoded.replace(/%2F/g, "/"); + } + return path; } - removeField(name) { - delete this.entries[name.toLowerCase()]; + async getSignature(longDate, credentialScope, keyPromise, canonicalRequest) { + const stringToSign = await this.createStringToSign(longDate, credentialScope, canonicalRequest); + const hash = new this.sha256(await keyPromise); + hash.update((0, util_utf8_1.toUint8Array)(stringToSign)); + return (0, util_hex_encoding_1.toHex)(await hash.digest()); } - getByType(kind) { - return Object.values(this.entries).filter((field) => field.kind === kind); + getSigningKey(credentials, region, shortDate, service) { + return (0, credentialDerivation_1.getSigningKey)(this.sha256, credentials, shortDate, region, service || this.service); + } + validateResolvedCredentials(credentials) { + if (typeof credentials !== "object" || + typeof credentials.accessKeyId !== "string" || + typeof credentials.secretAccessKey !== "string") { + throw new Error("Resolved credential object is not valid"); + } } } -exports.Fields = Fields; - - -/***/ }), - -/***/ 22474: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveHttpHandlerRuntimeConfig = exports.getHttpHandlerExtensionConfiguration = void 0; -const getHttpHandlerExtensionConfiguration = (runtimeConfig) => { - let httpHandler = runtimeConfig.httpHandler; - return { - setHttpHandler(handler) { - httpHandler = handler; - }, - httpHandler() { - return httpHandler; - }, - updateHttpClientConfig(key, value) { - httpHandler.updateHttpClientConfig(key, value); - }, - httpHandlerConfigs() { - return httpHandler.httpHandlerConfigs(); - }, - }; -}; -exports.getHttpHandlerExtensionConfiguration = getHttpHandlerExtensionConfiguration; -const resolveHttpHandlerRuntimeConfig = (httpHandlerExtensionConfiguration) => { +exports.SignatureV4 = SignatureV4; +const formatDate = (now) => { + const longDate = (0, utilDate_1.iso8601)(now).replace(/[\-:]/g, ""); return { - httpHandler: httpHandlerExtensionConfiguration.httpHandler(), + longDate, + shortDate: longDate.slice(0, 8), }; }; -exports.resolveHttpHandlerRuntimeConfig = resolveHttpHandlerRuntimeConfig; +const getCanonicalHeaderList = (headers) => Object.keys(headers).sort().join(";"); /***/ }), -/***/ 91654: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 69098: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(22474), exports); +exports.cloneQuery = exports.cloneRequest = void 0; +const cloneRequest = ({ headers, query, ...rest }) => ({ + ...rest, + headers: { ...headers }, + query: query ? (0, exports.cloneQuery)(query) : undefined, +}); +exports.cloneRequest = cloneRequest; +const cloneQuery = (query) => Object.keys(query).reduce((carry, paramName) => { + const param = query[paramName]; + return { + ...carry, + [paramName]: Array.isArray(param) ? [...param] : param, + }; +}, {}); +exports.cloneQuery = cloneQuery; /***/ }), -/***/ 63206: +/***/ 48644: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MAX_PRESIGNED_TTL = exports.KEY_TYPE_IDENTIFIER = exports.MAX_CACHE_SIZE = exports.UNSIGNED_PAYLOAD = exports.EVENT_ALGORITHM_IDENTIFIER = exports.ALGORITHM_IDENTIFIER_V4A = exports.ALGORITHM_IDENTIFIER = exports.UNSIGNABLE_PATTERNS = exports.SEC_HEADER_PATTERN = exports.PROXY_HEADER_PATTERN = exports.ALWAYS_UNSIGNABLE_HEADERS = exports.HOST_HEADER = exports.TOKEN_HEADER = exports.SHA256_HEADER = exports.SIGNATURE_HEADER = exports.GENERATED_HEADERS = exports.DATE_HEADER = exports.AMZ_DATE_HEADER = exports.AUTH_HEADER = exports.REGION_SET_PARAM = exports.TOKEN_QUERY_PARAM = exports.SIGNATURE_QUERY_PARAM = exports.EXPIRES_QUERY_PARAM = exports.SIGNED_HEADERS_QUERY_PARAM = exports.AMZ_DATE_QUERY_PARAM = exports.CREDENTIAL_QUERY_PARAM = exports.ALGORITHM_QUERY_PARAM = void 0; +exports.ALGORITHM_QUERY_PARAM = "X-Amz-Algorithm"; +exports.CREDENTIAL_QUERY_PARAM = "X-Amz-Credential"; +exports.AMZ_DATE_QUERY_PARAM = "X-Amz-Date"; +exports.SIGNED_HEADERS_QUERY_PARAM = "X-Amz-SignedHeaders"; +exports.EXPIRES_QUERY_PARAM = "X-Amz-Expires"; +exports.SIGNATURE_QUERY_PARAM = "X-Amz-Signature"; +exports.TOKEN_QUERY_PARAM = "X-Amz-Security-Token"; +exports.REGION_SET_PARAM = "X-Amz-Region-Set"; +exports.AUTH_HEADER = "authorization"; +exports.AMZ_DATE_HEADER = exports.AMZ_DATE_QUERY_PARAM.toLowerCase(); +exports.DATE_HEADER = "date"; +exports.GENERATED_HEADERS = [exports.AUTH_HEADER, exports.AMZ_DATE_HEADER, exports.DATE_HEADER]; +exports.SIGNATURE_HEADER = exports.SIGNATURE_QUERY_PARAM.toLowerCase(); +exports.SHA256_HEADER = "x-amz-content-sha256"; +exports.TOKEN_HEADER = exports.TOKEN_QUERY_PARAM.toLowerCase(); +exports.HOST_HEADER = "host"; +exports.ALWAYS_UNSIGNABLE_HEADERS = { + authorization: true, + "cache-control": true, + connection: true, + expect: true, + from: true, + "keep-alive": true, + "max-forwards": true, + pragma: true, + referer: true, + te: true, + trailer: true, + "transfer-encoding": true, + upgrade: true, + "user-agent": true, + "x-amzn-trace-id": true, +}; +exports.PROXY_HEADER_PATTERN = /^proxy-/; +exports.SEC_HEADER_PATTERN = /^sec-/; +exports.UNSIGNABLE_PATTERNS = [/^proxy-/i, /^sec-/i]; +exports.ALGORITHM_IDENTIFIER = "AWS4-HMAC-SHA256"; +exports.ALGORITHM_IDENTIFIER_V4A = "AWS4-ECDSA-P256-SHA256"; +exports.EVENT_ALGORITHM_IDENTIFIER = "AWS4-HMAC-SHA256-PAYLOAD"; +exports.UNSIGNED_PAYLOAD = "UNSIGNED-PAYLOAD"; +exports.MAX_CACHE_SIZE = 50; +exports.KEY_TYPE_IDENTIFIER = "aws4_request"; +exports.MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7; /***/ }), -/***/ 38746: -/***/ ((__unused_webpack_module, exports) => { +/***/ 19623: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HttpRequest = void 0; -class HttpRequest { - constructor(options) { - this.method = options.method || "GET"; - this.hostname = options.hostname || "localhost"; - this.port = options.port; - this.query = options.query || {}; - this.headers = options.headers || {}; - this.body = options.body; - this.protocol = options.protocol - ? options.protocol.slice(-1) !== ":" - ? `${options.protocol}:` - : options.protocol - : "https:"; - this.path = options.path ? (options.path.charAt(0) !== "/" ? `/${options.path}` : options.path) : "/"; - this.username = options.username; - this.password = options.password; - this.fragment = options.fragment; +exports.clearCredentialCache = exports.getSigningKey = exports.createScope = void 0; +const util_hex_encoding_1 = __nccwpck_require__(45364); +const util_utf8_1 = __nccwpck_require__(41895); +const constants_1 = __nccwpck_require__(48644); +const signingKeyCache = {}; +const cacheQueue = []; +const createScope = (shortDate, region, service) => `${shortDate}/${region}/${service}/${constants_1.KEY_TYPE_IDENTIFIER}`; +exports.createScope = createScope; +const getSigningKey = async (sha256Constructor, credentials, shortDate, region, service) => { + const credsHash = await hmac(sha256Constructor, credentials.secretAccessKey, credentials.accessKeyId); + const cacheKey = `${shortDate}:${region}:${service}:${(0, util_hex_encoding_1.toHex)(credsHash)}:${credentials.sessionToken}`; + if (cacheKey in signingKeyCache) { + return signingKeyCache[cacheKey]; } - static isInstance(request) { - if (!request) - return false; - const req = request; - return ("method" in req && - "protocol" in req && - "hostname" in req && - "path" in req && - typeof req["query"] === "object" && - typeof req["headers"] === "object"); + cacheQueue.push(cacheKey); + while (cacheQueue.length > constants_1.MAX_CACHE_SIZE) { + delete signingKeyCache[cacheQueue.shift()]; } - clone() { - const cloned = new HttpRequest({ - ...this, - headers: { ...this.headers }, - }); - if (cloned.query) - cloned.query = cloneQuery(cloned.query); - return cloned; + let key = `AWS4${credentials.secretAccessKey}`; + for (const signable of [shortDate, region, service, constants_1.KEY_TYPE_IDENTIFIER]) { + key = await hmac(sha256Constructor, key, signable); } -} -exports.HttpRequest = HttpRequest; -function cloneQuery(query) { - return Object.keys(query).reduce((carry, paramName) => { - const param = query[paramName]; - return { - ...carry, - [paramName]: Array.isArray(param) ? [...param] : param, - }; - }, {}); -} + return (signingKeyCache[cacheKey] = key); +}; +exports.getSigningKey = getSigningKey; +const clearCredentialCache = () => { + cacheQueue.length = 0; + Object.keys(signingKeyCache).forEach((cacheKey) => { + delete signingKeyCache[cacheKey]; + }); +}; +exports.clearCredentialCache = clearCredentialCache; +const hmac = (ctor, secret, data) => { + const hash = new ctor(secret); + hash.update((0, util_utf8_1.toUint8Array)(data)); + return hash.digest(); +}; /***/ }), -/***/ 26322: -/***/ ((__unused_webpack_module, exports) => { +/***/ 51393: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HttpResponse = void 0; -class HttpResponse { - constructor(options) { - this.statusCode = options.statusCode; - this.reason = options.reason; - this.headers = options.headers || {}; - this.body = options.body; - } - static isInstance(response) { - if (!response) - return false; - const resp = response; - return typeof resp.statusCode === "number" && typeof resp.headers === "object"; +exports.getCanonicalHeaders = void 0; +const constants_1 = __nccwpck_require__(48644); +const getCanonicalHeaders = ({ headers }, unsignableHeaders, signableHeaders) => { + const canonical = {}; + for (const headerName of Object.keys(headers).sort()) { + if (headers[headerName] == undefined) { + continue; + } + const canonicalHeaderName = headerName.toLowerCase(); + if (canonicalHeaderName in constants_1.ALWAYS_UNSIGNABLE_HEADERS || + (unsignableHeaders === null || unsignableHeaders === void 0 ? void 0 : unsignableHeaders.has(canonicalHeaderName)) || + constants_1.PROXY_HEADER_PATTERN.test(canonicalHeaderName) || + constants_1.SEC_HEADER_PATTERN.test(canonicalHeaderName)) { + if (!signableHeaders || (signableHeaders && !signableHeaders.has(canonicalHeaderName))) { + continue; + } + } + canonical[canonicalHeaderName] = headers[headerName].trim().replace(/\s+/g, " "); } -} -exports.HttpResponse = HttpResponse; + return canonical; +}; +exports.getCanonicalHeaders = getCanonicalHeaders; /***/ }), -/***/ 64418: +/***/ 33243: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(91654), exports); -tslib_1.__exportStar(__nccwpck_require__(89179), exports); -tslib_1.__exportStar(__nccwpck_require__(99242), exports); -tslib_1.__exportStar(__nccwpck_require__(63206), exports); -tslib_1.__exportStar(__nccwpck_require__(38746), exports); -tslib_1.__exportStar(__nccwpck_require__(26322), exports); -tslib_1.__exportStar(__nccwpck_require__(61466), exports); -tslib_1.__exportStar(__nccwpck_require__(19135), exports); +exports.getCanonicalQuery = void 0; +const util_uri_escape_1 = __nccwpck_require__(54197); +const constants_1 = __nccwpck_require__(48644); +const getCanonicalQuery = ({ query = {} }) => { + const keys = []; + const serialized = {}; + for (const key of Object.keys(query).sort()) { + if (key.toLowerCase() === constants_1.SIGNATURE_HEADER) { + continue; + } + keys.push(key); + const value = query[key]; + if (typeof value === "string") { + serialized[key] = `${(0, util_uri_escape_1.escapeUri)(key)}=${(0, util_uri_escape_1.escapeUri)(value)}`; + } + else if (Array.isArray(value)) { + serialized[key] = value + .slice(0) + .reduce((encoded, value) => encoded.concat([`${(0, util_uri_escape_1.escapeUri)(key)}=${(0, util_uri_escape_1.escapeUri)(value)}`]), []) + .sort() + .join("&"); + } + } + return keys + .map((key) => serialized[key]) + .filter((serialized) => serialized) + .join("&"); +}; +exports.getCanonicalQuery = getCanonicalQuery; /***/ }), -/***/ 61466: -/***/ ((__unused_webpack_module, exports) => { +/***/ 48545: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isValidHostname = void 0; -function isValidHostname(hostname) { - const hostPattern = /^[a-z0-9][a-z0-9\.\-]*[a-z0-9]$/; - return hostPattern.test(hostname); -} -exports.isValidHostname = isValidHostname; +exports.getPayloadHash = void 0; +const is_array_buffer_1 = __nccwpck_require__(10780); +const util_hex_encoding_1 = __nccwpck_require__(45364); +const util_utf8_1 = __nccwpck_require__(41895); +const constants_1 = __nccwpck_require__(48644); +const getPayloadHash = async ({ headers, body }, hashConstructor) => { + for (const headerName of Object.keys(headers)) { + if (headerName.toLowerCase() === constants_1.SHA256_HEADER) { + return headers[headerName]; + } + } + if (body == undefined) { + return "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + } + else if (typeof body === "string" || ArrayBuffer.isView(body) || (0, is_array_buffer_1.isArrayBuffer)(body)) { + const hashCtor = new hashConstructor(); + hashCtor.update((0, util_utf8_1.toUint8Array)(body)); + return (0, util_hex_encoding_1.toHex)(await hashCtor.digest()); + } + return constants_1.UNSIGNED_PAYLOAD; +}; +exports.getPayloadHash = getPayloadHash; /***/ }), -/***/ 19135: +/***/ 62179: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.deleteHeader = exports.getHeaderValue = exports.hasHeader = void 0; +const hasHeader = (soughtHeader, headers) => { + soughtHeader = soughtHeader.toLowerCase(); + for (const headerName of Object.keys(headers)) { + if (soughtHeader === headerName.toLowerCase()) { + return true; + } + } + return false; +}; +exports.hasHeader = hasHeader; +const getHeaderValue = (soughtHeader, headers) => { + soughtHeader = soughtHeader.toLowerCase(); + for (const headerName of Object.keys(headers)) { + if (soughtHeader === headerName.toLowerCase()) { + return headers[headerName]; + } + } + return undefined; +}; +exports.getHeaderValue = getHeaderValue; +const deleteHeader = (soughtHeader, headers) => { + soughtHeader = soughtHeader.toLowerCase(); + for (const headerName of Object.keys(headers)) { + if (soughtHeader === headerName.toLowerCase()) { + delete headers[headerName]; + } + } +}; +exports.deleteHeader = deleteHeader; /***/ }), -/***/ 68031: +/***/ 11528: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.buildQueryString = void 0; -const util_uri_escape_1 = __nccwpck_require__(54197); -function buildQueryString(query) { - const parts = []; - for (let key of Object.keys(query).sort()) { - const value = query[key]; - key = (0, util_uri_escape_1.escapeUri)(key); - if (Array.isArray(value)) { - for (let i = 0, iLen = value.length; i < iLen; i++) { - parts.push(`${key}=${(0, util_uri_escape_1.escapeUri)(value[i])}`); - } - } - else { - let qsEntry = key; - if (value || typeof value === "string") { - qsEntry += `=${(0, util_uri_escape_1.escapeUri)(value)}`; - } - parts.push(qsEntry); - } - } - return parts.join("&"); -} -exports.buildQueryString = buildQueryString; +exports.prepareRequest = exports.moveHeadersToQuery = exports.getPayloadHash = exports.getCanonicalQuery = exports.getCanonicalHeaders = void 0; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(39733), exports); +var getCanonicalHeaders_1 = __nccwpck_require__(51393); +Object.defineProperty(exports, "getCanonicalHeaders", ({ enumerable: true, get: function () { return getCanonicalHeaders_1.getCanonicalHeaders; } })); +var getCanonicalQuery_1 = __nccwpck_require__(33243); +Object.defineProperty(exports, "getCanonicalQuery", ({ enumerable: true, get: function () { return getCanonicalQuery_1.getCanonicalQuery; } })); +var getPayloadHash_1 = __nccwpck_require__(48545); +Object.defineProperty(exports, "getPayloadHash", ({ enumerable: true, get: function () { return getPayloadHash_1.getPayloadHash; } })); +var moveHeadersToQuery_1 = __nccwpck_require__(49828); +Object.defineProperty(exports, "moveHeadersToQuery", ({ enumerable: true, get: function () { return moveHeadersToQuery_1.moveHeadersToQuery; } })); +var prepareRequest_1 = __nccwpck_require__(60075); +Object.defineProperty(exports, "prepareRequest", ({ enumerable: true, get: function () { return prepareRequest_1.prepareRequest; } })); +tslib_1.__exportStar(__nccwpck_require__(19623), exports); /***/ }), -/***/ 4769: -/***/ ((__unused_webpack_module, exports) => { +/***/ 49828: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.parseQueryString = void 0; -function parseQueryString(querystring) { - const query = {}; - querystring = querystring.replace(/^\?/, ""); - if (querystring) { - for (const pair of querystring.split("&")) { - let [key, value = null] = pair.split("="); - key = decodeURIComponent(key); - if (value) { - value = decodeURIComponent(value); - } - if (!(key in query)) { - query[key] = value; - } - else if (Array.isArray(query[key])) { - query[key].push(value); - } - else { - query[key] = [query[key], value]; - } +exports.moveHeadersToQuery = void 0; +const cloneRequest_1 = __nccwpck_require__(69098); +const moveHeadersToQuery = (request, options = {}) => { + var _a; + const { headers, query = {} } = typeof request.clone === "function" ? request.clone() : (0, cloneRequest_1.cloneRequest)(request); + for (const name of Object.keys(headers)) { + const lname = name.toLowerCase(); + if (lname.slice(0, 6) === "x-amz-" && !((_a = options.unhoistableHeaders) === null || _a === void 0 ? void 0 : _a.has(lname))) { + query[name] = headers[name]; + delete headers[name]; } } - return query; -} -exports.parseQueryString = parseQueryString; + return { + ...request, + headers, + query, + }; +}; +exports.moveHeadersToQuery = moveHeadersToQuery; /***/ }), -/***/ 68415: -/***/ ((__unused_webpack_module, exports) => { +/***/ 60075: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NODEJS_TIMEOUT_ERROR_CODES = exports.TRANSIENT_ERROR_STATUS_CODES = exports.TRANSIENT_ERROR_CODES = exports.THROTTLING_ERROR_CODES = exports.CLOCK_SKEW_ERROR_CODES = void 0; -exports.CLOCK_SKEW_ERROR_CODES = [ - "AuthFailure", - "InvalidSignatureException", - "RequestExpired", - "RequestInTheFuture", - "RequestTimeTooSkewed", - "SignatureDoesNotMatch", -]; -exports.THROTTLING_ERROR_CODES = [ - "BandwidthLimitExceeded", - "EC2ThrottledException", - "LimitExceededException", - "PriorRequestNotComplete", - "ProvisionedThroughputExceededException", - "RequestLimitExceeded", - "RequestThrottled", - "RequestThrottledException", - "SlowDown", - "ThrottledException", - "Throttling", - "ThrottlingException", - "TooManyRequestsException", - "TransactionInProgressException", -]; -exports.TRANSIENT_ERROR_CODES = ["TimeoutError", "RequestTimeout", "RequestTimeoutException"]; -exports.TRANSIENT_ERROR_STATUS_CODES = [500, 502, 503, 504]; -exports.NODEJS_TIMEOUT_ERROR_CODES = ["ECONNRESET", "ECONNREFUSED", "EPIPE", "ETIMEDOUT"]; +exports.prepareRequest = void 0; +const cloneRequest_1 = __nccwpck_require__(69098); +const constants_1 = __nccwpck_require__(48644); +const prepareRequest = (request) => { + request = typeof request.clone === "function" ? request.clone() : (0, cloneRequest_1.cloneRequest)(request); + for (const headerName of Object.keys(request.headers)) { + if (constants_1.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) { + delete request.headers[headerName]; + } + } + return request; +}; +exports.prepareRequest = prepareRequest; /***/ }), -/***/ 6375: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 39299: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isServerError = exports.isTransientError = exports.isThrottlingError = exports.isClockSkewError = exports.isRetryableByTrait = void 0; -const constants_1 = __nccwpck_require__(68415); -const isRetryableByTrait = (error) => error.$retryable !== undefined; -exports.isRetryableByTrait = isRetryableByTrait; -const isClockSkewError = (error) => constants_1.CLOCK_SKEW_ERROR_CODES.includes(error.name); -exports.isClockSkewError = isClockSkewError; -const isThrottlingError = (error) => { - var _a, _b; - return ((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) === 429 || - constants_1.THROTTLING_ERROR_CODES.includes(error.name) || - ((_b = error.$retryable) === null || _b === void 0 ? void 0 : _b.throttling) == true; -}; -exports.isThrottlingError = isThrottlingError; -const isTransientError = (error) => { - var _a; - return constants_1.TRANSIENT_ERROR_CODES.includes(error.name) || - constants_1.NODEJS_TIMEOUT_ERROR_CODES.includes((error === null || error === void 0 ? void 0 : error.code) || "") || - constants_1.TRANSIENT_ERROR_STATUS_CODES.includes(((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) || 0); -}; -exports.isTransientError = isTransientError; -const isServerError = (error) => { - var _a; - if (((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) !== undefined) { - const statusCode = error.$metadata.httpStatusCode; - if (500 <= statusCode && statusCode <= 599 && !(0, exports.isTransientError)(error)) { - return true; +exports.toDate = exports.iso8601 = void 0; +const iso8601 = (time) => (0, exports.toDate)(time) + .toISOString() + .replace(/\.\d{3}Z$/, "Z"); +exports.iso8601 = iso8601; +const toDate = (time) => { + if (typeof time === "number") { + return new Date(time * 1000); + } + if (typeof time === "string") { + if (Number(time)) { + return new Date(Number(time) * 1000); } - return false; + return new Date(time); } - return false; + return time; }; -exports.isServerError = isServerError; +exports.toDate = toDate; /***/ }), -/***/ 46062: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 70438: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getConfigData = void 0; -const types_1 = __nccwpck_require__(55756); -const loadSharedConfigFiles_1 = __nccwpck_require__(41879); -const getConfigData = (data) => Object.entries(data) - .filter(([key]) => { - const sections = key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR); - if (sections.length === 2 && Object.values(types_1.IniSectionType).includes(sections[0])) { - return true; - } - return false; -}) - .reduce((acc, [key, value]) => { - const updatedKey = key.startsWith(types_1.IniSectionType.PROFILE) ? key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR)[1] : key; - acc[updatedKey] = value; - return acc; -}, { - ...(data.default && { default: data.default }), -}); -exports.getConfigData = getConfigData; +exports.NoOpLogger = void 0; +class NoOpLogger { + trace() { } + debug() { } + info() { } + warn() { } + error() { } +} +exports.NoOpLogger = NoOpLogger; /***/ }), -/***/ 47237: +/***/ 61600: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getConfigFilepath = exports.ENV_CONFIG_PATH = void 0; -const path_1 = __nccwpck_require__(71017); -const getHomeDir_1 = __nccwpck_require__(68340); -exports.ENV_CONFIG_PATH = "AWS_CONFIG_FILE"; -const getConfigFilepath = () => process.env[exports.ENV_CONFIG_PATH] || (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), ".aws", "config"); -exports.getConfigFilepath = getConfigFilepath; +exports.Client = void 0; +const middleware_stack_1 = __nccwpck_require__(97911); +class Client { + constructor(config) { + this.middlewareStack = (0, middleware_stack_1.constructStack)(); + this.config = config; + } + send(command, optionsOrCb, cb) { + const options = typeof optionsOrCb !== "function" ? optionsOrCb : undefined; + const callback = typeof optionsOrCb === "function" ? optionsOrCb : cb; + const handler = command.resolveMiddleware(this.middlewareStack, this.config, options); + if (callback) { + handler(command) + .then((result) => callback(null, result.output), (err) => callback(err)) + .catch(() => { }); + } + else { + return handler(command).then((result) => result.output); + } + } + destroy() { + if (this.config.requestHandler.destroy) + this.config.requestHandler.destroy(); + } +} +exports.Client = Client; /***/ }), -/***/ 99036: +/***/ 32813: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getCredentialsFilepath = exports.ENV_CREDENTIALS_PATH = void 0; -const path_1 = __nccwpck_require__(71017); -const getHomeDir_1 = __nccwpck_require__(68340); -exports.ENV_CREDENTIALS_PATH = "AWS_SHARED_CREDENTIALS_FILE"; -const getCredentialsFilepath = () => process.env[exports.ENV_CREDENTIALS_PATH] || (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), ".aws", "credentials"); -exports.getCredentialsFilepath = getCredentialsFilepath; +exports.collectBody = void 0; +const util_stream_1 = __nccwpck_require__(96607); +const collectBody = async (streamBody = new Uint8Array(), context) => { + if (streamBody instanceof Uint8Array) { + return util_stream_1.Uint8ArrayBlobAdapter.mutate(streamBody); + } + if (!streamBody) { + return util_stream_1.Uint8ArrayBlobAdapter.mutate(new Uint8Array()); + } + const fromContext = context.streamCollector(streamBody); + return util_stream_1.Uint8ArrayBlobAdapter.mutate(await fromContext); +}; +exports.collectBody = collectBody; /***/ }), -/***/ 68340: +/***/ 75414: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getHomeDir = void 0; -const os_1 = __nccwpck_require__(22037); -const path_1 = __nccwpck_require__(71017); -const homeDirCache = {}; -const getHomeDirCacheKey = () => { - if (process && process.geteuid) { - return `${process.geteuid()}`; +exports.Command = void 0; +const middleware_stack_1 = __nccwpck_require__(97911); +class Command { + constructor() { + this.middlewareStack = (0, middleware_stack_1.constructStack)(); } - return "DEFAULT"; -}; -const getHomeDir = () => { - const { HOME, USERPROFILE, HOMEPATH, HOMEDRIVE = `C:${path_1.sep}` } = process.env; - if (HOME) - return HOME; - if (USERPROFILE) - return USERPROFILE; - if (HOMEPATH) - return `${HOMEDRIVE}${HOMEPATH}`; - const homeDirCacheKey = getHomeDirCacheKey(); - if (!homeDirCache[homeDirCacheKey]) - homeDirCache[homeDirCacheKey] = (0, os_1.homedir)(); - return homeDirCache[homeDirCacheKey]; -}; -exports.getHomeDir = getHomeDir; +} +exports.Command = Command; /***/ }), -/***/ 52802: +/***/ 92541: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getProfileName = exports.DEFAULT_PROFILE = exports.ENV_PROFILE = void 0; -exports.ENV_PROFILE = "AWS_PROFILE"; -exports.DEFAULT_PROFILE = "default"; -const getProfileName = (init) => init.profile || process.env[exports.ENV_PROFILE] || exports.DEFAULT_PROFILE; -exports.getProfileName = getProfileName; +exports.SENSITIVE_STRING = void 0; +exports.SENSITIVE_STRING = "***SensitiveInformation***"; /***/ }), -/***/ 24740: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 56929: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getSSOTokenFilepath = void 0; -const crypto_1 = __nccwpck_require__(6113); -const path_1 = __nccwpck_require__(71017); -const getHomeDir_1 = __nccwpck_require__(68340); -const getSSOTokenFilepath = (id) => { - const hasher = (0, crypto_1.createHash)("sha1"); - const cacheName = hasher.update(id).digest("hex"); - return (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), ".aws", "sso", "cache", `${cacheName}.json`); +exports.createAggregatedClient = void 0; +const createAggregatedClient = (commands, Client) => { + for (const command of Object.keys(commands)) { + const CommandCtor = commands[command]; + const methodImpl = async function (args, optionsOrCb, cb) { + const command = new CommandCtor(args); + if (typeof optionsOrCb === "function") { + this.send(command, optionsOrCb); + } + else if (typeof cb === "function") { + if (typeof optionsOrCb !== "object") + throw new Error(`Expected http options but got ${typeof optionsOrCb}`); + this.send(command, optionsOrCb || {}, cb); + } + else { + return this.send(command, optionsOrCb); + } + }; + const methodName = (command[0].toLowerCase() + command.slice(1)).replace(/Command$/, ""); + Client.prototype[methodName] = methodImpl; + } }; -exports.getSSOTokenFilepath = getSSOTokenFilepath; +exports.createAggregatedClient = createAggregatedClient; /***/ }), -/***/ 69678: +/***/ 21737: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getSSOTokenFromFile = void 0; -const fs_1 = __nccwpck_require__(57147); -const getSSOTokenFilepath_1 = __nccwpck_require__(24740); -const { readFile } = fs_1.promises; -const getSSOTokenFromFile = async (id) => { - const ssoTokenFilepath = (0, getSSOTokenFilepath_1.getSSOTokenFilepath)(id); - const ssoTokenText = await readFile(ssoTokenFilepath, "utf8"); - return JSON.parse(ssoTokenText); +exports.parseEpochTimestamp = exports.parseRfc7231DateTime = exports.parseRfc3339DateTimeWithOffset = exports.parseRfc3339DateTime = exports.dateToUtcString = void 0; +const parse_utils_1 = __nccwpck_require__(74857); +const DAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; +const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; +function dateToUtcString(date) { + const year = date.getUTCFullYear(); + const month = date.getUTCMonth(); + const dayOfWeek = date.getUTCDay(); + const dayOfMonthInt = date.getUTCDate(); + const hoursInt = date.getUTCHours(); + const minutesInt = date.getUTCMinutes(); + const secondsInt = date.getUTCSeconds(); + const dayOfMonthString = dayOfMonthInt < 10 ? `0${dayOfMonthInt}` : `${dayOfMonthInt}`; + const hoursString = hoursInt < 10 ? `0${hoursInt}` : `${hoursInt}`; + const minutesString = minutesInt < 10 ? `0${minutesInt}` : `${minutesInt}`; + const secondsString = secondsInt < 10 ? `0${secondsInt}` : `${secondsInt}`; + return `${DAYS[dayOfWeek]}, ${dayOfMonthString} ${MONTHS[month]} ${year} ${hoursString}:${minutesString}:${secondsString} GMT`; +} +exports.dateToUtcString = dateToUtcString; +const RFC3339 = new RegExp(/^(\d{4})-(\d{2})-(\d{2})[tT](\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?[zZ]$/); +const parseRfc3339DateTime = (value) => { + if (value === null || value === undefined) { + return undefined; + } + if (typeof value !== "string") { + throw new TypeError("RFC-3339 date-times must be expressed as strings"); + } + const match = RFC3339.exec(value); + if (!match) { + throw new TypeError("Invalid RFC-3339 date-time value"); + } + const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds] = match; + const year = (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)); + const month = parseDateValue(monthStr, "month", 1, 12); + const day = parseDateValue(dayStr, "day", 1, 31); + return buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds }); +}; +exports.parseRfc3339DateTime = parseRfc3339DateTime; +const RFC3339_WITH_OFFSET = new RegExp(/^(\d{4})-(\d{2})-(\d{2})[tT](\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?(([-+]\d{2}\:\d{2})|[zZ])$/); +const parseRfc3339DateTimeWithOffset = (value) => { + if (value === null || value === undefined) { + return undefined; + } + if (typeof value !== "string") { + throw new TypeError("RFC-3339 date-times must be expressed as strings"); + } + const match = RFC3339_WITH_OFFSET.exec(value); + if (!match) { + throw new TypeError("Invalid RFC-3339 date-time value"); + } + const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, offsetStr] = match; + const year = (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)); + const month = parseDateValue(monthStr, "month", 1, 12); + const day = parseDateValue(dayStr, "day", 1, 31); + const date = buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds }); + if (offsetStr.toUpperCase() != "Z") { + date.setTime(date.getTime() - parseOffsetToMilliseconds(offsetStr)); + } + return date; +}; +exports.parseRfc3339DateTimeWithOffset = parseRfc3339DateTimeWithOffset; +const IMF_FIXDATE = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d{1,2}):(\d{2}):(\d{2})(?:\.(\d+))? GMT$/); +const RFC_850_DATE = new RegExp(/^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{2}) (\d{1,2}):(\d{2}):(\d{2})(?:\.(\d+))? GMT$/); +const ASC_TIME = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( [1-9]|\d{2}) (\d{1,2}):(\d{2}):(\d{2})(?:\.(\d+))? (\d{4})$/); +const parseRfc7231DateTime = (value) => { + if (value === null || value === undefined) { + return undefined; + } + if (typeof value !== "string") { + throw new TypeError("RFC-7231 date-times must be expressed as strings"); + } + let match = IMF_FIXDATE.exec(value); + if (match) { + const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match; + return buildDate((0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr, "day", 1, 31), { hours, minutes, seconds, fractionalMilliseconds }); + } + match = RFC_850_DATE.exec(value); + if (match) { + const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match; + return adjustRfc850Year(buildDate(parseTwoDigitYear(yearStr), parseMonthByShortName(monthStr), parseDateValue(dayStr, "day", 1, 31), { + hours, + minutes, + seconds, + fractionalMilliseconds, + })); + } + match = ASC_TIME.exec(value); + if (match) { + const [_, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, yearStr] = match; + return buildDate((0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr.trimLeft(), "day", 1, 31), { hours, minutes, seconds, fractionalMilliseconds }); + } + throw new TypeError("Invalid RFC-7231 date-time value"); +}; +exports.parseRfc7231DateTime = parseRfc7231DateTime; +const parseEpochTimestamp = (value) => { + if (value === null || value === undefined) { + return undefined; + } + let valueAsDouble; + if (typeof value === "number") { + valueAsDouble = value; + } + else if (typeof value === "string") { + valueAsDouble = (0, parse_utils_1.strictParseDouble)(value); + } + else { + throw new TypeError("Epoch timestamps must be expressed as floating point numbers or their string representation"); + } + if (Number.isNaN(valueAsDouble) || valueAsDouble === Infinity || valueAsDouble === -Infinity) { + throw new TypeError("Epoch timestamps must be valid, non-Infinite, non-NaN numerics"); + } + return new Date(Math.round(valueAsDouble * 1000)); +}; +exports.parseEpochTimestamp = parseEpochTimestamp; +const buildDate = (year, month, day, time) => { + const adjustedMonth = month - 1; + validateDayOfMonth(year, adjustedMonth, day); + return new Date(Date.UTC(year, adjustedMonth, day, parseDateValue(time.hours, "hour", 0, 23), parseDateValue(time.minutes, "minute", 0, 59), parseDateValue(time.seconds, "seconds", 0, 60), parseMilliseconds(time.fractionalMilliseconds))); +}; +const parseTwoDigitYear = (value) => { + const thisYear = new Date().getUTCFullYear(); + const valueInThisCentury = Math.floor(thisYear / 100) * 100 + (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(value)); + if (valueInThisCentury < thisYear) { + return valueInThisCentury + 100; + } + return valueInThisCentury; +}; +const FIFTY_YEARS_IN_MILLIS = 50 * 365 * 24 * 60 * 60 * 1000; +const adjustRfc850Year = (input) => { + if (input.getTime() - new Date().getTime() > FIFTY_YEARS_IN_MILLIS) { + return new Date(Date.UTC(input.getUTCFullYear() - 100, input.getUTCMonth(), input.getUTCDate(), input.getUTCHours(), input.getUTCMinutes(), input.getUTCSeconds(), input.getUTCMilliseconds())); + } + return input; +}; +const parseMonthByShortName = (value) => { + const monthIdx = MONTHS.indexOf(value); + if (monthIdx < 0) { + throw new TypeError(`Invalid month: ${value}`); + } + return monthIdx + 1; +}; +const DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; +const validateDayOfMonth = (year, month, day) => { + let maxDays = DAYS_IN_MONTH[month]; + if (month === 1 && isLeapYear(year)) { + maxDays = 29; + } + if (day > maxDays) { + throw new TypeError(`Invalid day for ${MONTHS[month]} in ${year}: ${day}`); + } +}; +const isLeapYear = (year) => { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +}; +const parseDateValue = (value, type, lower, upper) => { + const dateVal = (0, parse_utils_1.strictParseByte)(stripLeadingZeroes(value)); + if (dateVal < lower || dateVal > upper) { + throw new TypeError(`${type} must be between ${lower} and ${upper}, inclusive`); + } + return dateVal; +}; +const parseMilliseconds = (value) => { + if (value === null || value === undefined) { + return 0; + } + return (0, parse_utils_1.strictParseFloat32)("0." + value) * 1000; +}; +const parseOffsetToMilliseconds = (value) => { + const directionStr = value[0]; + let direction = 1; + if (directionStr == "+") { + direction = 1; + } + else if (directionStr == "-") { + direction = -1; + } + else { + throw new TypeError(`Offset direction, ${directionStr}, must be "+" or "-"`); + } + const hour = Number(value.substring(1, 3)); + const minute = Number(value.substring(4, 6)); + return direction * (hour * 60 + minute) * 60 * 1000; +}; +const stripLeadingZeroes = (value) => { + let idx = 0; + while (idx < value.length - 1 && value.charAt(idx) === "0") { + idx++; + } + if (idx === 0) { + return value; + } + return value.slice(idx); }; -exports.getSSOTokenFromFile = getSSOTokenFromFile; /***/ }), -/***/ 82820: +/***/ 9681: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getSsoSessionData = void 0; -const types_1 = __nccwpck_require__(55756); -const loadSharedConfigFiles_1 = __nccwpck_require__(41879); -const getSsoSessionData = (data) => Object.entries(data) - .filter(([key]) => key.startsWith(types_1.IniSectionType.SSO_SESSION + loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR)) - .reduce((acc, [key, value]) => ({ ...acc, [key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR)[1]]: value }), {}); -exports.getSsoSessionData = getSsoSessionData; +exports.withBaseException = exports.throwDefaultError = void 0; +const exceptions_1 = __nccwpck_require__(88074); +const throwDefaultError = ({ output, parsedBody, exceptionCtor, errorCode }) => { + const $metadata = deserializeMetadata(output); + const statusCode = $metadata.httpStatusCode ? $metadata.httpStatusCode + "" : undefined; + const response = new exceptionCtor({ + name: (parsedBody === null || parsedBody === void 0 ? void 0 : parsedBody.code) || (parsedBody === null || parsedBody === void 0 ? void 0 : parsedBody.Code) || errorCode || statusCode || "UnknownError", + $fault: "client", + $metadata, + }); + throw (0, exceptions_1.decorateServiceException)(response, parsedBody); +}; +exports.throwDefaultError = throwDefaultError; +const withBaseException = (ExceptionCtor) => { + return ({ output, parsedBody, errorCode }) => { + (0, exports.throwDefaultError)({ output, parsedBody, exceptionCtor: ExceptionCtor, errorCode }); + }; +}; +exports.withBaseException = withBaseException; +const deserializeMetadata = (output) => { + var _a, _b; + return ({ + httpStatusCode: output.statusCode, + requestId: (_b = (_a = output.headers["x-amzn-requestid"]) !== null && _a !== void 0 ? _a : output.headers["x-amzn-request-id"]) !== null && _b !== void 0 ? _b : output.headers["x-amz-request-id"], + extendedRequestId: output.headers["x-amz-id-2"], + cfId: output.headers["x-amz-cf-id"], + }); +}; /***/ }), -/***/ 43507: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 11163: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(68340), exports); -tslib_1.__exportStar(__nccwpck_require__(52802), exports); -tslib_1.__exportStar(__nccwpck_require__(24740), exports); -tslib_1.__exportStar(__nccwpck_require__(69678), exports); -tslib_1.__exportStar(__nccwpck_require__(41879), exports); -tslib_1.__exportStar(__nccwpck_require__(34649), exports); -tslib_1.__exportStar(__nccwpck_require__(2546), exports); -tslib_1.__exportStar(__nccwpck_require__(63191), exports); +exports.loadConfigsForDefaultMode = void 0; +const loadConfigsForDefaultMode = (mode) => { + switch (mode) { + case "standard": + return { + retryMode: "standard", + connectionTimeout: 3100, + }; + case "in-region": + return { + retryMode: "standard", + connectionTimeout: 1100, + }; + case "cross-region": + return { + retryMode: "standard", + connectionTimeout: 3100, + }; + case "mobile": + return { + retryMode: "standard", + connectionTimeout: 30000, + }; + default: + return {}; + } +}; +exports.loadConfigsForDefaultMode = loadConfigsForDefaultMode; /***/ }), -/***/ 41879: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 91809: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.loadSharedConfigFiles = exports.CONFIG_PREFIX_SEPARATOR = void 0; -const getConfigData_1 = __nccwpck_require__(46062); -const getConfigFilepath_1 = __nccwpck_require__(47237); -const getCredentialsFilepath_1 = __nccwpck_require__(99036); -const parseIni_1 = __nccwpck_require__(54262); -const slurpFile_1 = __nccwpck_require__(19155); -const swallowError = () => ({}); -exports.CONFIG_PREFIX_SEPARATOR = "."; -const loadSharedConfigFiles = async (init = {}) => { - const { filepath = (0, getCredentialsFilepath_1.getCredentialsFilepath)(), configFilepath = (0, getConfigFilepath_1.getConfigFilepath)() } = init; - const parsedFiles = await Promise.all([ - (0, slurpFile_1.slurpFile)(configFilepath, { - ignoreCache: init.ignoreCache, - }) - .then(parseIni_1.parseIni) - .then(getConfigData_1.getConfigData) - .catch(swallowError), - (0, slurpFile_1.slurpFile)(filepath, { - ignoreCache: init.ignoreCache, - }) - .then(parseIni_1.parseIni) - .catch(swallowError), - ]); - return { - configFile: parsedFiles[0], - credentialsFile: parsedFiles[1], - }; +exports.emitWarningIfUnsupportedVersion = void 0; +let warningEmitted = false; +const emitWarningIfUnsupportedVersion = (version) => { + if (version && !warningEmitted && parseInt(version.substring(1, version.indexOf("."))) < 14) { + warningEmitted = true; + } }; -exports.loadSharedConfigFiles = loadSharedConfigFiles; +exports.emitWarningIfUnsupportedVersion = emitWarningIfUnsupportedVersion; /***/ }), -/***/ 34649: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 88074: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.loadSsoSessionData = void 0; -const getConfigFilepath_1 = __nccwpck_require__(47237); -const getSsoSessionData_1 = __nccwpck_require__(82820); -const parseIni_1 = __nccwpck_require__(54262); -const slurpFile_1 = __nccwpck_require__(19155); -const swallowError = () => ({}); -const loadSsoSessionData = async (init = {}) => { - var _a; - return (0, slurpFile_1.slurpFile)((_a = init.configFilepath) !== null && _a !== void 0 ? _a : (0, getConfigFilepath_1.getConfigFilepath)()) - .then(parseIni_1.parseIni) - .then(getSsoSessionData_1.getSsoSessionData) - .catch(swallowError); +exports.decorateServiceException = exports.ServiceException = void 0; +class ServiceException extends Error { + constructor(options) { + super(options.message); + Object.setPrototypeOf(this, ServiceException.prototype); + this.name = options.name; + this.$fault = options.$fault; + this.$metadata = options.$metadata; + } +} +exports.ServiceException = ServiceException; +const decorateServiceException = (exception, additions = {}) => { + Object.entries(additions) + .filter(([, v]) => v !== undefined) + .forEach(([k, v]) => { + if (exception[k] == undefined || exception[k] === "") { + exception[k] = v; + } + }); + const message = exception.message || exception.Message || "UnknownError"; + exception.message = message; + delete exception.Message; + return exception; }; -exports.loadSsoSessionData = loadSsoSessionData; +exports.decorateServiceException = decorateServiceException; /***/ }), -/***/ 19447: +/***/ 76016: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.mergeConfigFiles = void 0; -const mergeConfigFiles = (...files) => { - const merged = {}; - for (const file of files) { - for (const [key, values] of Object.entries(file)) { - if (merged[key] !== undefined) { - Object.assign(merged[key], values); - } - else { - merged[key] = values; - } - } - } - return merged; -}; -exports.mergeConfigFiles = mergeConfigFiles; +exports.extendedEncodeURIComponent = void 0; +function extendedEncodeURIComponent(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); +} +exports.extendedEncodeURIComponent = extendedEncodeURIComponent; /***/ }), -/***/ 54262: +/***/ 30941: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.parseIni = void 0; +exports.resolveChecksumRuntimeConfig = exports.getChecksumConfiguration = exports.AlgorithmId = void 0; const types_1 = __nccwpck_require__(55756); -const loadSharedConfigFiles_1 = __nccwpck_require__(41879); -const prefixKeyRegex = /^([\w-]+)\s(["'])?([\w-@\+]+)\2$/; -const profileNameBlockList = ["__proto__", "profile __proto__"]; -const parseIni = (iniData) => { - const map = {}; - let currentSection; - let currentSubSection; - for (const iniLine of iniData.split(/\r?\n/)) { - const trimmedLine = iniLine.split(/(^|\s)[;#]/)[0].trim(); - const isSection = trimmedLine[0] === "[" && trimmedLine[trimmedLine.length - 1] === "]"; - if (isSection) { - currentSection = undefined; - currentSubSection = undefined; - const sectionName = trimmedLine.substring(1, trimmedLine.length - 1); - const matches = prefixKeyRegex.exec(sectionName); - if (matches) { - const [, prefix, , name] = matches; - if (Object.values(types_1.IniSectionType).includes(prefix)) { - currentSection = [prefix, name].join(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR); - } - } - else { - currentSection = sectionName; - } - if (profileNameBlockList.includes(sectionName)) { - throw new Error(`Found invalid profile name "${sectionName}"`); - } - } - else if (currentSection) { - const indexOfEqualsSign = trimmedLine.indexOf("="); - if (![0, -1].includes(indexOfEqualsSign)) { - const [name, value] = [ - trimmedLine.substring(0, indexOfEqualsSign).trim(), - trimmedLine.substring(indexOfEqualsSign + 1).trim(), - ]; - if (value === "") { - currentSubSection = name; - } - else { - if (currentSubSection && iniLine.trimStart() === iniLine) { - currentSubSection = undefined; - } - map[currentSection] = map[currentSection] || {}; - const key = currentSubSection ? [currentSubSection, name].join(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR) : name; - map[currentSection][key] = value; - } - } +Object.defineProperty(exports, "AlgorithmId", ({ enumerable: true, get: function () { return types_1.AlgorithmId; } })); +const getChecksumConfiguration = (runtimeConfig) => { + const checksumAlgorithms = []; + for (const id in types_1.AlgorithmId) { + const algorithmId = types_1.AlgorithmId[id]; + if (runtimeConfig[algorithmId] === undefined) { + continue; } + checksumAlgorithms.push({ + algorithmId: () => algorithmId, + checksumConstructor: () => runtimeConfig[algorithmId], + }); } - return map; + return { + _checksumAlgorithms: checksumAlgorithms, + addChecksumAlgorithm(algo) { + this._checksumAlgorithms.push(algo); + }, + checksumAlgorithms() { + return this._checksumAlgorithms; + }, + }; }; -exports.parseIni = parseIni; +exports.getChecksumConfiguration = getChecksumConfiguration; +const resolveChecksumRuntimeConfig = (clientConfig) => { + const runtimeConfig = {}; + clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => { + runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor(); + }); + return runtimeConfig; +}; +exports.resolveChecksumRuntimeConfig = resolveChecksumRuntimeConfig; /***/ }), -/***/ 2546: +/***/ 78643: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.parseKnownFiles = void 0; -const loadSharedConfigFiles_1 = __nccwpck_require__(41879); -const mergeConfigFiles_1 = __nccwpck_require__(19447); -const parseKnownFiles = async (init) => { - const parsedFiles = await (0, loadSharedConfigFiles_1.loadSharedConfigFiles)(init); - return (0, mergeConfigFiles_1.mergeConfigFiles)(parsedFiles.configFile, parsedFiles.credentialsFile); +exports.resolveDefaultRuntimeConfig = exports.getDefaultClientConfiguration = exports.getDefaultExtensionConfiguration = void 0; +const checksum_1 = __nccwpck_require__(30941); +const retry_1 = __nccwpck_require__(67367); +const getDefaultExtensionConfiguration = (runtimeConfig) => { + return { + ...(0, checksum_1.getChecksumConfiguration)(runtimeConfig), + ...(0, retry_1.getRetryConfiguration)(runtimeConfig), + }; }; -exports.parseKnownFiles = parseKnownFiles; +exports.getDefaultExtensionConfiguration = getDefaultExtensionConfiguration; +exports.getDefaultClientConfiguration = exports.getDefaultExtensionConfiguration; +const resolveDefaultRuntimeConfig = (config) => { + return { + ...(0, checksum_1.resolveChecksumRuntimeConfig)(config), + ...(0, retry_1.resolveRetryRuntimeConfig)(config), + }; +}; +exports.resolveDefaultRuntimeConfig = resolveDefaultRuntimeConfig; /***/ }), -/***/ 19155: +/***/ 1822: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.slurpFile = void 0; -const fs_1 = __nccwpck_require__(57147); -const { readFile } = fs_1.promises; -const filePromisesHash = {}; -const slurpFile = (path, options) => { - if (!filePromisesHash[path] || (options === null || options === void 0 ? void 0 : options.ignoreCache)) { - filePromisesHash[path] = readFile(path, "utf8"); - } - return filePromisesHash[path]; -}; -exports.slurpFile = slurpFile; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(78643), exports); /***/ }), -/***/ 63191: +/***/ 67367: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.resolveRetryRuntimeConfig = exports.getRetryConfiguration = void 0; +const getRetryConfiguration = (runtimeConfig) => { + let _retryStrategy = runtimeConfig.retryStrategy; + return { + setRetryStrategy(retryStrategy) { + _retryStrategy = retryStrategy; + }, + retryStrategy() { + return _retryStrategy; + }, + }; +}; +exports.getRetryConfiguration = getRetryConfiguration; +const resolveRetryRuntimeConfig = (retryStrategyConfiguration) => { + const runtimeConfig = {}; + runtimeConfig.retryStrategy = retryStrategyConfiguration.retryStrategy(); + return runtimeConfig; +}; +exports.resolveRetryRuntimeConfig = resolveRetryRuntimeConfig; /***/ }), -/***/ 39733: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 42638: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SignatureV4 = void 0; -const eventstream_codec_1 = __nccwpck_require__(56459); -const util_hex_encoding_1 = __nccwpck_require__(45364); -const util_middleware_1 = __nccwpck_require__(2390); -const util_utf8_1 = __nccwpck_require__(41895); -const constants_1 = __nccwpck_require__(48644); -const credentialDerivation_1 = __nccwpck_require__(19623); -const getCanonicalHeaders_1 = __nccwpck_require__(51393); -const getCanonicalQuery_1 = __nccwpck_require__(33243); -const getPayloadHash_1 = __nccwpck_require__(48545); -const headerUtil_1 = __nccwpck_require__(62179); -const moveHeadersToQuery_1 = __nccwpck_require__(49828); -const prepareRequest_1 = __nccwpck_require__(60075); -const utilDate_1 = __nccwpck_require__(39299); -class SignatureV4 { - constructor({ applyChecksum, credentials, region, service, sha256, uriEscapePath = true, }) { - this.headerMarshaller = new eventstream_codec_1.HeaderMarshaller(util_utf8_1.toUtf8, util_utf8_1.fromUtf8); - this.service = service; - this.sha256 = sha256; - this.uriEscapePath = uriEscapePath; - this.applyChecksum = typeof applyChecksum === "boolean" ? applyChecksum : true; - this.regionProvider = (0, util_middleware_1.normalizeProvider)(region); - this.credentialProvider = (0, util_middleware_1.normalizeProvider)(credentials); - } - async presign(originalRequest, options = {}) { - const { signingDate = new Date(), expiresIn = 3600, unsignableHeaders, unhoistableHeaders, signableHeaders, signingRegion, signingService, } = options; - const credentials = await this.credentialProvider(); - this.validateResolvedCredentials(credentials); - const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider()); - const { longDate, shortDate } = formatDate(signingDate); - if (expiresIn > constants_1.MAX_PRESIGNED_TTL) { - return Promise.reject("Signature version 4 presigned URLs" + " must have an expiration date less than one week in" + " the future"); - } - const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service); - const request = (0, moveHeadersToQuery_1.moveHeadersToQuery)((0, prepareRequest_1.prepareRequest)(originalRequest), { unhoistableHeaders }); - if (credentials.sessionToken) { - request.query[constants_1.TOKEN_QUERY_PARAM] = credentials.sessionToken; - } - request.query[constants_1.ALGORITHM_QUERY_PARAM] = constants_1.ALGORITHM_IDENTIFIER; - request.query[constants_1.CREDENTIAL_QUERY_PARAM] = `${credentials.accessKeyId}/${scope}`; - request.query[constants_1.AMZ_DATE_QUERY_PARAM] = longDate; - request.query[constants_1.EXPIRES_QUERY_PARAM] = expiresIn.toString(10); - const canonicalHeaders = (0, getCanonicalHeaders_1.getCanonicalHeaders)(request, unsignableHeaders, signableHeaders); - request.query[constants_1.SIGNED_HEADERS_QUERY_PARAM] = getCanonicalHeaderList(canonicalHeaders); - request.query[constants_1.SIGNATURE_QUERY_PARAM] = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, await (0, getPayloadHash_1.getPayloadHash)(originalRequest, this.sha256))); - return request; - } - async sign(toSign, options) { - if (typeof toSign === "string") { - return this.signString(toSign, options); - } - else if (toSign.headers && toSign.payload) { - return this.signEvent(toSign, options); - } - else if (toSign.message) { - return this.signMessage(toSign, options); - } - else { - return this.signRequest(toSign, options); - } - } - async signEvent({ headers, payload }, { signingDate = new Date(), priorSignature, signingRegion, signingService }) { - const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider()); - const { shortDate, longDate } = formatDate(signingDate); - const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service); - const hashedPayload = await (0, getPayloadHash_1.getPayloadHash)({ headers: {}, body: payload }, this.sha256); - const hash = new this.sha256(); - hash.update(headers); - const hashedHeaders = (0, util_hex_encoding_1.toHex)(await hash.digest()); - const stringToSign = [ - constants_1.EVENT_ALGORITHM_IDENTIFIER, - longDate, - scope, - priorSignature, - hashedHeaders, - hashedPayload, - ].join("\n"); - return this.signString(stringToSign, { signingDate, signingRegion: region, signingService }); - } - async signMessage(signableMessage, { signingDate = new Date(), signingRegion, signingService }) { - const promise = this.signEvent({ - headers: this.headerMarshaller.format(signableMessage.message.headers), - payload: signableMessage.message.body, - }, { - signingDate, - signingRegion, - signingService, - priorSignature: signableMessage.priorSignature, - }); - return promise.then((signature) => { - return { message: signableMessage.message, signature }; - }); - } - async signString(stringToSign, { signingDate = new Date(), signingRegion, signingService } = {}) { - const credentials = await this.credentialProvider(); - this.validateResolvedCredentials(credentials); - const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider()); - const { shortDate } = formatDate(signingDate); - const hash = new this.sha256(await this.getSigningKey(credentials, region, shortDate, signingService)); - hash.update((0, util_utf8_1.toUint8Array)(stringToSign)); - return (0, util_hex_encoding_1.toHex)(await hash.digest()); - } - async signRequest(requestToSign, { signingDate = new Date(), signableHeaders, unsignableHeaders, signingRegion, signingService, } = {}) { - const credentials = await this.credentialProvider(); - this.validateResolvedCredentials(credentials); - const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider()); - const request = (0, prepareRequest_1.prepareRequest)(requestToSign); - const { longDate, shortDate } = formatDate(signingDate); - const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service); - request.headers[constants_1.AMZ_DATE_HEADER] = longDate; - if (credentials.sessionToken) { - request.headers[constants_1.TOKEN_HEADER] = credentials.sessionToken; - } - const payloadHash = await (0, getPayloadHash_1.getPayloadHash)(request, this.sha256); - if (!(0, headerUtil_1.hasHeader)(constants_1.SHA256_HEADER, request.headers) && this.applyChecksum) { - request.headers[constants_1.SHA256_HEADER] = payloadHash; - } - const canonicalHeaders = (0, getCanonicalHeaders_1.getCanonicalHeaders)(request, unsignableHeaders, signableHeaders); - const signature = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, payloadHash)); - request.headers[constants_1.AUTH_HEADER] = - `${constants_1.ALGORITHM_IDENTIFIER} ` + - `Credential=${credentials.accessKeyId}/${scope}, ` + - `SignedHeaders=${getCanonicalHeaderList(canonicalHeaders)}, ` + - `Signature=${signature}`; - return request; - } - createCanonicalRequest(request, canonicalHeaders, payloadHash) { - const sortedHeaders = Object.keys(canonicalHeaders).sort(); - return `${request.method} -${this.getCanonicalPath(request)} -${(0, getCanonicalQuery_1.getCanonicalQuery)(request)} -${sortedHeaders.map((name) => `${name}:${canonicalHeaders[name]}`).join("\n")} - -${sortedHeaders.join(";")} -${payloadHash}`; - } - async createStringToSign(longDate, credentialScope, canonicalRequest) { - const hash = new this.sha256(); - hash.update((0, util_utf8_1.toUint8Array)(canonicalRequest)); - const hashedRequest = await hash.digest(); - return `${constants_1.ALGORITHM_IDENTIFIER} -${longDate} -${credentialScope} -${(0, util_hex_encoding_1.toHex)(hashedRequest)}`; - } - getCanonicalPath({ path }) { - if (this.uriEscapePath) { - const normalizedPathSegments = []; - for (const pathSegment of path.split("/")) { - if ((pathSegment === null || pathSegment === void 0 ? void 0 : pathSegment.length) === 0) - continue; - if (pathSegment === ".") - continue; - if (pathSegment === "..") { - normalizedPathSegments.pop(); - } - else { - normalizedPathSegments.push(pathSegment); - } - } - const normalizedPath = `${(path === null || path === void 0 ? void 0 : path.startsWith("/")) ? "/" : ""}${normalizedPathSegments.join("/")}${normalizedPathSegments.length > 0 && (path === null || path === void 0 ? void 0 : path.endsWith("/")) ? "/" : ""}`; - const doubleEncoded = encodeURIComponent(normalizedPath); - return doubleEncoded.replace(/%2F/g, "/"); - } - return path; - } - async getSignature(longDate, credentialScope, keyPromise, canonicalRequest) { - const stringToSign = await this.createStringToSign(longDate, credentialScope, canonicalRequest); - const hash = new this.sha256(await keyPromise); - hash.update((0, util_utf8_1.toUint8Array)(stringToSign)); - return (0, util_hex_encoding_1.toHex)(await hash.digest()); - } - getSigningKey(credentials, region, shortDate, service) { - return (0, credentialDerivation_1.getSigningKey)(this.sha256, credentials, shortDate, region, service || this.service); - } - validateResolvedCredentials(credentials) { - if (typeof credentials !== "object" || - typeof credentials.accessKeyId !== "string" || - typeof credentials.secretAccessKey !== "string") { - throw new Error("Resolved credential object is not valid"); - } - } -} -exports.SignatureV4 = SignatureV4; -const formatDate = (now) => { - const longDate = (0, utilDate_1.iso8601)(now).replace(/[\-:]/g, ""); - return { - longDate, - shortDate: longDate.slice(0, 8), - }; -}; -const getCanonicalHeaderList = (headers) => Object.keys(headers).sort().join(";"); +exports.getArrayIfSingleItem = void 0; +const getArrayIfSingleItem = (mayBeArray) => Array.isArray(mayBeArray) ? mayBeArray : [mayBeArray]; +exports.getArrayIfSingleItem = getArrayIfSingleItem; /***/ }), -/***/ 69098: +/***/ 92188: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.cloneQuery = exports.cloneRequest = void 0; -const cloneRequest = ({ headers, query, ...rest }) => ({ - ...rest, - headers: { ...headers }, - query: query ? (0, exports.cloneQuery)(query) : undefined, -}); -exports.cloneRequest = cloneRequest; -const cloneQuery = (query) => Object.keys(query).reduce((carry, paramName) => { - const param = query[paramName]; - return { - ...carry, - [paramName]: Array.isArray(param) ? [...param] : param, - }; -}, {}); -exports.cloneQuery = cloneQuery; +exports.getValueFromTextNode = void 0; +const getValueFromTextNode = (obj) => { + const textNodeName = "#text"; + for (const key in obj) { + if (obj.hasOwnProperty(key) && obj[key][textNodeName] !== undefined) { + obj[key] = obj[key][textNodeName]; + } + else if (typeof obj[key] === "object" && obj[key] !== null) { + obj[key] = (0, exports.getValueFromTextNode)(obj[key]); + } + } + return obj; +}; +exports.getValueFromTextNode = getValueFromTextNode; /***/ }), -/***/ 48644: -/***/ ((__unused_webpack_module, exports) => { +/***/ 63570: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.MAX_PRESIGNED_TTL = exports.KEY_TYPE_IDENTIFIER = exports.MAX_CACHE_SIZE = exports.UNSIGNED_PAYLOAD = exports.EVENT_ALGORITHM_IDENTIFIER = exports.ALGORITHM_IDENTIFIER_V4A = exports.ALGORITHM_IDENTIFIER = exports.UNSIGNABLE_PATTERNS = exports.SEC_HEADER_PATTERN = exports.PROXY_HEADER_PATTERN = exports.ALWAYS_UNSIGNABLE_HEADERS = exports.HOST_HEADER = exports.TOKEN_HEADER = exports.SHA256_HEADER = exports.SIGNATURE_HEADER = exports.GENERATED_HEADERS = exports.DATE_HEADER = exports.AMZ_DATE_HEADER = exports.AUTH_HEADER = exports.REGION_SET_PARAM = exports.TOKEN_QUERY_PARAM = exports.SIGNATURE_QUERY_PARAM = exports.EXPIRES_QUERY_PARAM = exports.SIGNED_HEADERS_QUERY_PARAM = exports.AMZ_DATE_QUERY_PARAM = exports.CREDENTIAL_QUERY_PARAM = exports.ALGORITHM_QUERY_PARAM = void 0; -exports.ALGORITHM_QUERY_PARAM = "X-Amz-Algorithm"; -exports.CREDENTIAL_QUERY_PARAM = "X-Amz-Credential"; -exports.AMZ_DATE_QUERY_PARAM = "X-Amz-Date"; -exports.SIGNED_HEADERS_QUERY_PARAM = "X-Amz-SignedHeaders"; -exports.EXPIRES_QUERY_PARAM = "X-Amz-Expires"; -exports.SIGNATURE_QUERY_PARAM = "X-Amz-Signature"; -exports.TOKEN_QUERY_PARAM = "X-Amz-Security-Token"; -exports.REGION_SET_PARAM = "X-Amz-Region-Set"; -exports.AUTH_HEADER = "authorization"; -exports.AMZ_DATE_HEADER = exports.AMZ_DATE_QUERY_PARAM.toLowerCase(); -exports.DATE_HEADER = "date"; -exports.GENERATED_HEADERS = [exports.AUTH_HEADER, exports.AMZ_DATE_HEADER, exports.DATE_HEADER]; -exports.SIGNATURE_HEADER = exports.SIGNATURE_QUERY_PARAM.toLowerCase(); -exports.SHA256_HEADER = "x-amz-content-sha256"; -exports.TOKEN_HEADER = exports.TOKEN_QUERY_PARAM.toLowerCase(); -exports.HOST_HEADER = "host"; -exports.ALWAYS_UNSIGNABLE_HEADERS = { - authorization: true, - "cache-control": true, - connection: true, - expect: true, - from: true, - "keep-alive": true, - "max-forwards": true, - pragma: true, - referer: true, - te: true, - trailer: true, - "transfer-encoding": true, - upgrade: true, - "user-agent": true, - "x-amzn-trace-id": true, -}; -exports.PROXY_HEADER_PATTERN = /^proxy-/; -exports.SEC_HEADER_PATTERN = /^sec-/; -exports.UNSIGNABLE_PATTERNS = [/^proxy-/i, /^sec-/i]; -exports.ALGORITHM_IDENTIFIER = "AWS4-HMAC-SHA256"; -exports.ALGORITHM_IDENTIFIER_V4A = "AWS4-ECDSA-P256-SHA256"; -exports.EVENT_ALGORITHM_IDENTIFIER = "AWS4-HMAC-SHA256-PAYLOAD"; -exports.UNSIGNED_PAYLOAD = "UNSIGNED-PAYLOAD"; -exports.MAX_CACHE_SIZE = 50; -exports.KEY_TYPE_IDENTIFIER = "aws4_request"; -exports.MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(70438), exports); +tslib_1.__exportStar(__nccwpck_require__(61600), exports); +tslib_1.__exportStar(__nccwpck_require__(32813), exports); +tslib_1.__exportStar(__nccwpck_require__(75414), exports); +tslib_1.__exportStar(__nccwpck_require__(92541), exports); +tslib_1.__exportStar(__nccwpck_require__(56929), exports); +tslib_1.__exportStar(__nccwpck_require__(21737), exports); +tslib_1.__exportStar(__nccwpck_require__(9681), exports); +tslib_1.__exportStar(__nccwpck_require__(11163), exports); +tslib_1.__exportStar(__nccwpck_require__(91809), exports); +tslib_1.__exportStar(__nccwpck_require__(1822), exports); +tslib_1.__exportStar(__nccwpck_require__(88074), exports); +tslib_1.__exportStar(__nccwpck_require__(76016), exports); +tslib_1.__exportStar(__nccwpck_require__(42638), exports); +tslib_1.__exportStar(__nccwpck_require__(92188), exports); +tslib_1.__exportStar(__nccwpck_require__(32964), exports); +tslib_1.__exportStar(__nccwpck_require__(83495), exports); +tslib_1.__exportStar(__nccwpck_require__(74857), exports); +tslib_1.__exportStar(__nccwpck_require__(15342), exports); +tslib_1.__exportStar(__nccwpck_require__(53456), exports); +tslib_1.__exportStar(__nccwpck_require__(1752), exports); +tslib_1.__exportStar(__nccwpck_require__(92480), exports); /***/ }), -/***/ 19623: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 32964: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.clearCredentialCache = exports.getSigningKey = exports.createScope = void 0; -const util_hex_encoding_1 = __nccwpck_require__(45364); -const util_utf8_1 = __nccwpck_require__(41895); -const constants_1 = __nccwpck_require__(48644); -const signingKeyCache = {}; -const cacheQueue = []; -const createScope = (shortDate, region, service) => `${shortDate}/${region}/${service}/${constants_1.KEY_TYPE_IDENTIFIER}`; -exports.createScope = createScope; -const getSigningKey = async (sha256Constructor, credentials, shortDate, region, service) => { - const credsHash = await hmac(sha256Constructor, credentials.secretAccessKey, credentials.accessKeyId); - const cacheKey = `${shortDate}:${region}:${service}:${(0, util_hex_encoding_1.toHex)(credsHash)}:${credentials.sessionToken}`; - if (cacheKey in signingKeyCache) { - return signingKeyCache[cacheKey]; +exports.LazyJsonString = exports.StringWrapper = void 0; +const StringWrapper = function () { + const Class = Object.getPrototypeOf(this).constructor; + const Constructor = Function.bind.apply(String, [null, ...arguments]); + const instance = new Constructor(); + Object.setPrototypeOf(instance, Class.prototype); + return instance; +}; +exports.StringWrapper = StringWrapper; +exports.StringWrapper.prototype = Object.create(String.prototype, { + constructor: { + value: exports.StringWrapper, + enumerable: false, + writable: true, + configurable: true, + }, +}); +Object.setPrototypeOf(exports.StringWrapper, String); +class LazyJsonString extends exports.StringWrapper { + deserializeJSON() { + return JSON.parse(super.toString()); } - cacheQueue.push(cacheKey); - while (cacheQueue.length > constants_1.MAX_CACHE_SIZE) { - delete signingKeyCache[cacheQueue.shift()]; + toJSON() { + return super.toString(); } - let key = `AWS4${credentials.secretAccessKey}`; - for (const signable of [shortDate, region, service, constants_1.KEY_TYPE_IDENTIFIER]) { - key = await hmac(sha256Constructor, key, signable); + static fromObject(object) { + if (object instanceof LazyJsonString) { + return object; + } + else if (object instanceof String || typeof object === "string") { + return new LazyJsonString(object); + } + return new LazyJsonString(JSON.stringify(object)); } - return (signingKeyCache[cacheKey] = key); -}; -exports.getSigningKey = getSigningKey; -const clearCredentialCache = () => { - cacheQueue.length = 0; - Object.keys(signingKeyCache).forEach((cacheKey) => { - delete signingKeyCache[cacheKey]; - }); -}; -exports.clearCredentialCache = clearCredentialCache; -const hmac = (ctor, secret, data) => { - const hash = new ctor(secret); - hash.update((0, util_utf8_1.toUint8Array)(data)); - return hash.digest(); -}; +} +exports.LazyJsonString = LazyJsonString; /***/ }), -/***/ 51393: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 83495: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getCanonicalHeaders = void 0; -const constants_1 = __nccwpck_require__(48644); -const getCanonicalHeaders = ({ headers }, unsignableHeaders, signableHeaders) => { - const canonical = {}; - for (const headerName of Object.keys(headers).sort()) { - if (headers[headerName] == undefined) { +exports.take = exports.convertMap = exports.map = void 0; +function map(arg0, arg1, arg2) { + let target; + let filter; + let instructions; + if (typeof arg1 === "undefined" && typeof arg2 === "undefined") { + target = {}; + instructions = arg0; + } + else { + target = arg0; + if (typeof arg1 === "function") { + filter = arg1; + instructions = arg2; + return mapWithFilter(target, filter, instructions); + } + else { + instructions = arg1; + } + } + for (const key of Object.keys(instructions)) { + if (!Array.isArray(instructions[key])) { + target[key] = instructions[key]; continue; } - const canonicalHeaderName = headerName.toLowerCase(); - if (canonicalHeaderName in constants_1.ALWAYS_UNSIGNABLE_HEADERS || - (unsignableHeaders === null || unsignableHeaders === void 0 ? void 0 : unsignableHeaders.has(canonicalHeaderName)) || - constants_1.PROXY_HEADER_PATTERN.test(canonicalHeaderName) || - constants_1.SEC_HEADER_PATTERN.test(canonicalHeaderName)) { - if (!signableHeaders || (signableHeaders && !signableHeaders.has(canonicalHeaderName))) { - continue; + applyInstruction(target, null, instructions, key); + } + return target; +} +exports.map = map; +const convertMap = (target) => { + const output = {}; + for (const [k, v] of Object.entries(target || {})) { + output[k] = [, v]; + } + return output; +}; +exports.convertMap = convertMap; +const take = (source, instructions) => { + const out = {}; + for (const key in instructions) { + applyInstruction(out, source, instructions, key); + } + return out; +}; +exports.take = take; +const mapWithFilter = (target, filter, instructions) => { + return map(target, Object.entries(instructions).reduce((_instructions, [key, value]) => { + if (Array.isArray(value)) { + _instructions[key] = value; + } + else { + if (typeof value === "function") { + _instructions[key] = [filter, value()]; + } + else { + _instructions[key] = [filter, value]; } } - canonical[canonicalHeaderName] = headers[headerName].trim().replace(/\s+/g, " "); + return _instructions; + }, {})); +}; +const applyInstruction = (target, source, instructions, targetKey) => { + if (source !== null) { + let instruction = instructions[targetKey]; + if (typeof instruction === "function") { + instruction = [, instruction]; + } + const [filter = nonNullish, valueFn = pass, sourceKey = targetKey] = instruction; + if ((typeof filter === "function" && filter(source[sourceKey])) || (typeof filter !== "function" && !!filter)) { + target[targetKey] = valueFn(source[sourceKey]); + } + return; + } + let [filter, value] = instructions[targetKey]; + if (typeof value === "function") { + let _value; + const defaultFilterPassed = filter === undefined && (_value = value()) != null; + const customFilterPassed = (typeof filter === "function" && !!filter(void 0)) || (typeof filter !== "function" && !!filter); + if (defaultFilterPassed) { + target[targetKey] = _value; + } + else if (customFilterPassed) { + target[targetKey] = value(); + } + } + else { + const defaultFilterPassed = filter === undefined && value != null; + const customFilterPassed = (typeof filter === "function" && !!filter(value)) || (typeof filter !== "function" && !!filter); + if (defaultFilterPassed || customFilterPassed) { + target[targetKey] = value; + } } - return canonical; }; -exports.getCanonicalHeaders = getCanonicalHeaders; +const nonNullish = (_) => _ != null; +const pass = (_) => _; /***/ }), -/***/ 33243: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 74857: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getCanonicalQuery = void 0; -const util_uri_escape_1 = __nccwpck_require__(54197); -const constants_1 = __nccwpck_require__(48644); -const getCanonicalQuery = ({ query = {} }) => { - const keys = []; - const serialized = {}; - for (const key of Object.keys(query).sort()) { - if (key.toLowerCase() === constants_1.SIGNATURE_HEADER) { - continue; +exports.logger = exports.strictParseByte = exports.strictParseShort = exports.strictParseInt32 = exports.strictParseInt = exports.strictParseLong = exports.limitedParseFloat32 = exports.limitedParseFloat = exports.handleFloat = exports.limitedParseDouble = exports.strictParseFloat32 = exports.strictParseFloat = exports.strictParseDouble = exports.expectUnion = exports.expectString = exports.expectObject = exports.expectNonNull = exports.expectByte = exports.expectShort = exports.expectInt32 = exports.expectInt = exports.expectLong = exports.expectFloat32 = exports.expectNumber = exports.expectBoolean = exports.parseBoolean = void 0; +const parseBoolean = (value) => { + switch (value) { + case "true": + return true; + case "false": + return false; + default: + throw new Error(`Unable to parse boolean value "${value}"`); + } +}; +exports.parseBoolean = parseBoolean; +const expectBoolean = (value) => { + if (value === null || value === undefined) { + return undefined; + } + if (typeof value === "number") { + if (value === 0 || value === 1) { + exports.logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`)); } - keys.push(key); - const value = query[key]; - if (typeof value === "string") { - serialized[key] = `${(0, util_uri_escape_1.escapeUri)(key)}=${(0, util_uri_escape_1.escapeUri)(value)}`; + if (value === 0) { + return false; } - else if (Array.isArray(value)) { - serialized[key] = value - .slice(0) - .reduce((encoded, value) => encoded.concat([`${(0, util_uri_escape_1.escapeUri)(key)}=${(0, util_uri_escape_1.escapeUri)(value)}`]), []) - .sort() - .join("&"); + if (value === 1) { + return true; } } - return keys - .map((key) => serialized[key]) - .filter((serialized) => serialized) - .join("&"); + if (typeof value === "string") { + const lower = value.toLowerCase(); + if (lower === "false" || lower === "true") { + exports.logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`)); + } + if (lower === "false") { + return false; + } + if (lower === "true") { + return true; + } + } + if (typeof value === "boolean") { + return value; + } + throw new TypeError(`Expected boolean, got ${typeof value}: ${value}`); }; -exports.getCanonicalQuery = getCanonicalQuery; - - -/***/ }), - -/***/ 48545: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getPayloadHash = void 0; -const is_array_buffer_1 = __nccwpck_require__(10780); -const util_hex_encoding_1 = __nccwpck_require__(45364); -const util_utf8_1 = __nccwpck_require__(41895); -const constants_1 = __nccwpck_require__(48644); -const getPayloadHash = async ({ headers, body }, hashConstructor) => { - for (const headerName of Object.keys(headers)) { - if (headerName.toLowerCase() === constants_1.SHA256_HEADER) { - return headers[headerName]; +exports.expectBoolean = expectBoolean; +const expectNumber = (value) => { + if (value === null || value === undefined) { + return undefined; + } + if (typeof value === "string") { + const parsed = parseFloat(value); + if (!Number.isNaN(parsed)) { + if (String(parsed) !== String(value)) { + exports.logger.warn(stackTraceWarning(`Expected number but observed string: ${value}`)); + } + return parsed; } } - if (body == undefined) { - return "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + if (typeof value === "number") { + return value; + } + throw new TypeError(`Expected number, got ${typeof value}: ${value}`); +}; +exports.expectNumber = expectNumber; +const MAX_FLOAT = Math.ceil(2 ** 127 * (2 - 2 ** -23)); +const expectFloat32 = (value) => { + const expected = (0, exports.expectNumber)(value); + if (expected !== undefined && !Number.isNaN(expected) && expected !== Infinity && expected !== -Infinity) { + if (Math.abs(expected) > MAX_FLOAT) { + throw new TypeError(`Expected 32-bit float, got ${value}`); + } + } + return expected; +}; +exports.expectFloat32 = expectFloat32; +const expectLong = (value) => { + if (value === null || value === undefined) { + return undefined; + } + if (Number.isInteger(value) && !Number.isNaN(value)) { + return value; + } + throw new TypeError(`Expected integer, got ${typeof value}: ${value}`); +}; +exports.expectLong = expectLong; +exports.expectInt = exports.expectLong; +const expectInt32 = (value) => expectSizedInt(value, 32); +exports.expectInt32 = expectInt32; +const expectShort = (value) => expectSizedInt(value, 16); +exports.expectShort = expectShort; +const expectByte = (value) => expectSizedInt(value, 8); +exports.expectByte = expectByte; +const expectSizedInt = (value, size) => { + const expected = (0, exports.expectLong)(value); + if (expected !== undefined && castInt(expected, size) !== expected) { + throw new TypeError(`Expected ${size}-bit integer, got ${value}`); + } + return expected; +}; +const castInt = (value, size) => { + switch (size) { + case 32: + return Int32Array.of(value)[0]; + case 16: + return Int16Array.of(value)[0]; + case 8: + return Int8Array.of(value)[0]; + } +}; +const expectNonNull = (value, location) => { + if (value === null || value === undefined) { + if (location) { + throw new TypeError(`Expected a non-null value for ${location}`); + } + throw new TypeError("Expected a non-null value"); + } + return value; +}; +exports.expectNonNull = expectNonNull; +const expectObject = (value) => { + if (value === null || value === undefined) { + return undefined; + } + if (typeof value === "object" && !Array.isArray(value)) { + return value; + } + const receivedType = Array.isArray(value) ? "array" : typeof value; + throw new TypeError(`Expected object, got ${receivedType}: ${value}`); +}; +exports.expectObject = expectObject; +const expectString = (value) => { + if (value === null || value === undefined) { + return undefined; + } + if (typeof value === "string") { + return value; + } + if (["boolean", "number", "bigint"].includes(typeof value)) { + exports.logger.warn(stackTraceWarning(`Expected string, got ${typeof value}: ${value}`)); + return String(value); + } + throw new TypeError(`Expected string, got ${typeof value}: ${value}`); +}; +exports.expectString = expectString; +const expectUnion = (value) => { + if (value === null || value === undefined) { + return undefined; + } + const asObject = (0, exports.expectObject)(value); + const setKeys = Object.entries(asObject) + .filter(([, v]) => v != null) + .map(([k]) => k); + if (setKeys.length === 0) { + throw new TypeError(`Unions must have exactly one non-null member. None were found.`); + } + if (setKeys.length > 1) { + throw new TypeError(`Unions must have exactly one non-null member. Keys ${setKeys} were not null.`); + } + return asObject; +}; +exports.expectUnion = expectUnion; +const strictParseDouble = (value) => { + if (typeof value == "string") { + return (0, exports.expectNumber)(parseNumber(value)); + } + return (0, exports.expectNumber)(value); +}; +exports.strictParseDouble = strictParseDouble; +exports.strictParseFloat = exports.strictParseDouble; +const strictParseFloat32 = (value) => { + if (typeof value == "string") { + return (0, exports.expectFloat32)(parseNumber(value)); + } + return (0, exports.expectFloat32)(value); +}; +exports.strictParseFloat32 = strictParseFloat32; +const NUMBER_REGEX = /(-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?)|(-?Infinity)|(NaN)/g; +const parseNumber = (value) => { + const matches = value.match(NUMBER_REGEX); + if (matches === null || matches[0].length !== value.length) { + throw new TypeError(`Expected real number, got implicit NaN`); + } + return parseFloat(value); +}; +const limitedParseDouble = (value) => { + if (typeof value == "string") { + return parseFloatString(value); + } + return (0, exports.expectNumber)(value); +}; +exports.limitedParseDouble = limitedParseDouble; +exports.handleFloat = exports.limitedParseDouble; +exports.limitedParseFloat = exports.limitedParseDouble; +const limitedParseFloat32 = (value) => { + if (typeof value == "string") { + return parseFloatString(value); + } + return (0, exports.expectFloat32)(value); +}; +exports.limitedParseFloat32 = limitedParseFloat32; +const parseFloatString = (value) => { + switch (value) { + case "NaN": + return NaN; + case "Infinity": + return Infinity; + case "-Infinity": + return -Infinity; + default: + throw new Error(`Unable to parse float value: ${value}`); } - else if (typeof body === "string" || ArrayBuffer.isView(body) || (0, is_array_buffer_1.isArrayBuffer)(body)) { - const hashCtor = new hashConstructor(); - hashCtor.update((0, util_utf8_1.toUint8Array)(body)); - return (0, util_hex_encoding_1.toHex)(await hashCtor.digest()); +}; +const strictParseLong = (value) => { + if (typeof value === "string") { + return (0, exports.expectLong)(parseNumber(value)); } - return constants_1.UNSIGNED_PAYLOAD; + return (0, exports.expectLong)(value); }; -exports.getPayloadHash = getPayloadHash; - - -/***/ }), - -/***/ 62179: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.deleteHeader = exports.getHeaderValue = exports.hasHeader = void 0; -const hasHeader = (soughtHeader, headers) => { - soughtHeader = soughtHeader.toLowerCase(); - for (const headerName of Object.keys(headers)) { - if (soughtHeader === headerName.toLowerCase()) { - return true; - } +exports.strictParseLong = strictParseLong; +exports.strictParseInt = exports.strictParseLong; +const strictParseInt32 = (value) => { + if (typeof value === "string") { + return (0, exports.expectInt32)(parseNumber(value)); } - return false; + return (0, exports.expectInt32)(value); }; -exports.hasHeader = hasHeader; -const getHeaderValue = (soughtHeader, headers) => { - soughtHeader = soughtHeader.toLowerCase(); - for (const headerName of Object.keys(headers)) { - if (soughtHeader === headerName.toLowerCase()) { - return headers[headerName]; - } +exports.strictParseInt32 = strictParseInt32; +const strictParseShort = (value) => { + if (typeof value === "string") { + return (0, exports.expectShort)(parseNumber(value)); } - return undefined; + return (0, exports.expectShort)(value); }; -exports.getHeaderValue = getHeaderValue; -const deleteHeader = (soughtHeader, headers) => { - soughtHeader = soughtHeader.toLowerCase(); - for (const headerName of Object.keys(headers)) { - if (soughtHeader === headerName.toLowerCase()) { - delete headers[headerName]; - } +exports.strictParseShort = strictParseShort; +const strictParseByte = (value) => { + if (typeof value === "string") { + return (0, exports.expectByte)(parseNumber(value)); } + return (0, exports.expectByte)(value); +}; +exports.strictParseByte = strictParseByte; +const stackTraceWarning = (message) => { + return String(new TypeError(message).stack || message) + .split("\n") + .slice(0, 5) + .filter((s) => !s.includes("stackTraceWarning")) + .join("\n"); +}; +exports.logger = { + warn: console.warn, }; -exports.deleteHeader = deleteHeader; /***/ }), -/***/ 11528: +/***/ 15342: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.prepareRequest = exports.moveHeadersToQuery = exports.getPayloadHash = exports.getCanonicalQuery = exports.getCanonicalHeaders = void 0; -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(39733), exports); -var getCanonicalHeaders_1 = __nccwpck_require__(51393); -Object.defineProperty(exports, "getCanonicalHeaders", ({ enumerable: true, get: function () { return getCanonicalHeaders_1.getCanonicalHeaders; } })); -var getCanonicalQuery_1 = __nccwpck_require__(33243); -Object.defineProperty(exports, "getCanonicalQuery", ({ enumerable: true, get: function () { return getCanonicalQuery_1.getCanonicalQuery; } })); -var getPayloadHash_1 = __nccwpck_require__(48545); -Object.defineProperty(exports, "getPayloadHash", ({ enumerable: true, get: function () { return getPayloadHash_1.getPayloadHash; } })); -var moveHeadersToQuery_1 = __nccwpck_require__(49828); -Object.defineProperty(exports, "moveHeadersToQuery", ({ enumerable: true, get: function () { return moveHeadersToQuery_1.moveHeadersToQuery; } })); -var prepareRequest_1 = __nccwpck_require__(60075); -Object.defineProperty(exports, "prepareRequest", ({ enumerable: true, get: function () { return prepareRequest_1.prepareRequest; } })); -tslib_1.__exportStar(__nccwpck_require__(19623), exports); +exports.resolvedPath = void 0; +const extended_encode_uri_component_1 = __nccwpck_require__(76016); +const resolvedPath = (resolvedPath, input, memberName, labelValueProvider, uriLabel, isGreedyLabel) => { + if (input != null && input[memberName] !== undefined) { + const labelValue = labelValueProvider(); + if (labelValue.length <= 0) { + throw new Error("Empty value provided for input HTTP label: " + memberName + "."); + } + resolvedPath = resolvedPath.replace(uriLabel, isGreedyLabel + ? labelValue + .split("/") + .map((segment) => (0, extended_encode_uri_component_1.extendedEncodeURIComponent)(segment)) + .join("/") + : (0, extended_encode_uri_component_1.extendedEncodeURIComponent)(labelValue)); + } + else { + throw new Error("No value provided for input HTTP label: " + memberName + "."); + } + return resolvedPath; +}; +exports.resolvedPath = resolvedPath; /***/ }), -/***/ 49828: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 53456: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.moveHeadersToQuery = void 0; -const cloneRequest_1 = __nccwpck_require__(69098); -const moveHeadersToQuery = (request, options = {}) => { - var _a; - const { headers, query = {} } = typeof request.clone === "function" ? request.clone() : (0, cloneRequest_1.cloneRequest)(request); - for (const name of Object.keys(headers)) { - const lname = name.toLowerCase(); - if (lname.slice(0, 6) === "x-amz-" && !((_a = options.unhoistableHeaders) === null || _a === void 0 ? void 0 : _a.has(lname))) { - query[name] = headers[name]; - delete headers[name]; - } +exports.serializeFloat = void 0; +const serializeFloat = (value) => { + if (value !== value) { + return "NaN"; + } + switch (value) { + case Infinity: + return "Infinity"; + case -Infinity: + return "-Infinity"; + default: + return value; } - return { - ...request, - headers, - query, - }; }; -exports.moveHeadersToQuery = moveHeadersToQuery; +exports.serializeFloat = serializeFloat; /***/ }), -/***/ 60075: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 1752: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.prepareRequest = void 0; -const cloneRequest_1 = __nccwpck_require__(69098); -const constants_1 = __nccwpck_require__(48644); -const prepareRequest = (request) => { - request = typeof request.clone === "function" ? request.clone() : (0, cloneRequest_1.cloneRequest)(request); - for (const headerName of Object.keys(request.headers)) { - if (constants_1.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) { - delete request.headers[headerName]; +exports._json = void 0; +const _json = (obj) => { + if (obj == null) { + return {}; + } + if (Array.isArray(obj)) { + return obj.filter((_) => _ != null); + } + if (typeof obj === "object") { + const target = {}; + for (const key of Object.keys(obj)) { + if (obj[key] == null) { + continue; + } + target[key] = (0, exports._json)(obj[key]); } + return target; } - return request; + return obj; }; -exports.prepareRequest = prepareRequest; +exports._json = _json; /***/ }), -/***/ 39299: +/***/ 92480: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.toDate = exports.iso8601 = void 0; -const iso8601 = (time) => (0, exports.toDate)(time) - .toISOString() - .replace(/\.\d{3}Z$/, "Z"); -exports.iso8601 = iso8601; -const toDate = (time) => { - if (typeof time === "number") { - return new Date(time * 1000); +exports.splitEvery = void 0; +function splitEvery(value, delimiter, numDelimiters) { + if (numDelimiters <= 0 || !Number.isInteger(numDelimiters)) { + throw new Error("Invalid number of delimiters (" + numDelimiters + ") for splitEvery."); } - if (typeof time === "string") { - if (Number(time)) { - return new Date(Number(time) * 1000); + const segments = value.split(delimiter); + if (numDelimiters === 1) { + return segments; + } + const compoundSegments = []; + let currentSegment = ""; + for (let i = 0; i < segments.length; i++) { + if (currentSegment === "") { + currentSegment = segments[i]; + } + else { + currentSegment += delimiter + segments[i]; + } + if ((i + 1) % numDelimiters === 0) { + compoundSegments.push(currentSegment); + currentSegment = ""; } - return new Date(time); } - return time; -}; -exports.toDate = toDate; + if (currentSegment !== "") { + compoundSegments.push(currentSegment); + } + return compoundSegments; +} +exports.splitEvery = splitEvery; /***/ }), -/***/ 70438: +/***/ 74075: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NoOpLogger = void 0; -class NoOpLogger { - trace() { } - debug() { } - info() { } - warn() { } - error() { } -} -exports.NoOpLogger = NoOpLogger; /***/ }), -/***/ 61600: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 93242: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Client = void 0; -const middleware_stack_1 = __nccwpck_require__(97911); -class Client { - constructor(config) { - this.middlewareStack = (0, middleware_stack_1.constructStack)(); - this.config = config; - } - send(command, optionsOrCb, cb) { - const options = typeof optionsOrCb !== "function" ? optionsOrCb : undefined; - const callback = typeof optionsOrCb === "function" ? optionsOrCb : cb; - const handler = command.resolveMiddleware(this.middlewareStack, this.config, options); - if (callback) { - handler(command) - .then((result) => callback(null, result.output), (err) => callback(err)) - .catch(() => { }); - } - else { - return handler(command).then((result) => result.output); - } - } - destroy() { - if (this.config.requestHandler.destroy) - this.config.requestHandler.destroy(); - } -} -exports.Client = Client; +exports.HttpApiKeyAuthLocation = void 0; +var HttpApiKeyAuthLocation; +(function (HttpApiKeyAuthLocation) { + HttpApiKeyAuthLocation["HEADER"] = "header"; + HttpApiKeyAuthLocation["QUERY"] = "query"; +})(HttpApiKeyAuthLocation = exports.HttpApiKeyAuthLocation || (exports.HttpApiKeyAuthLocation = {})); /***/ }), -/***/ 32813: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 81851: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.collectBody = void 0; -const util_stream_1 = __nccwpck_require__(96607); -const collectBody = async (streamBody = new Uint8Array(), context) => { - if (streamBody instanceof Uint8Array) { - return util_stream_1.Uint8ArrayBlobAdapter.mutate(streamBody); - } - if (!streamBody) { - return util_stream_1.Uint8ArrayBlobAdapter.mutate(new Uint8Array()); - } - const fromContext = context.streamCollector(streamBody); - return util_stream_1.Uint8ArrayBlobAdapter.mutate(await fromContext); -}; -exports.collectBody = collectBody; /***/ }), -/***/ 75414: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 91530: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Command = void 0; -const middleware_stack_1 = __nccwpck_require__(97911); -class Command { - constructor() { - this.middlewareStack = (0, middleware_stack_1.constructStack)(); - } -} -exports.Command = Command; /***/ }), -/***/ 92541: +/***/ 74020: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SENSITIVE_STRING = void 0; -exports.SENSITIVE_STRING = "***SensitiveInformation***"; /***/ }), -/***/ 56929: +/***/ 52263: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.createAggregatedClient = void 0; -const createAggregatedClient = (commands, Client) => { - for (const command of Object.keys(commands)) { - const CommandCtor = commands[command]; - const methodImpl = async function (args, optionsOrCb, cb) { - const command = new CommandCtor(args); - if (typeof optionsOrCb === "function") { - this.send(command, optionsOrCb); - } - else if (typeof cb === "function") { - if (typeof optionsOrCb !== "object") - throw new Error(`Expected http options but got ${typeof optionsOrCb}`); - this.send(command, optionsOrCb || {}, cb); - } - else { - return this.send(command, optionsOrCb); - } - }; - const methodName = (command[0].toLowerCase() + command.slice(1)).replace(/Command$/, ""); - Client.prototype[methodName] = methodImpl; - } -}; -exports.createAggregatedClient = createAggregatedClient; /***/ }), -/***/ 21737: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 79467: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.parseEpochTimestamp = exports.parseRfc7231DateTime = exports.parseRfc3339DateTimeWithOffset = exports.parseRfc3339DateTime = exports.dateToUtcString = void 0; -const parse_utils_1 = __nccwpck_require__(74857); -const DAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; -const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; -function dateToUtcString(date) { - const year = date.getUTCFullYear(); - const month = date.getUTCMonth(); - const dayOfWeek = date.getUTCDay(); - const dayOfMonthInt = date.getUTCDate(); - const hoursInt = date.getUTCHours(); - const minutesInt = date.getUTCMinutes(); - const secondsInt = date.getUTCSeconds(); - const dayOfMonthString = dayOfMonthInt < 10 ? `0${dayOfMonthInt}` : `${dayOfMonthInt}`; - const hoursString = hoursInt < 10 ? `0${hoursInt}` : `${hoursInt}`; - const minutesString = minutesInt < 10 ? `0${minutesInt}` : `${minutesInt}`; - const secondsString = secondsInt < 10 ? `0${secondsInt}` : `${secondsInt}`; - return `${DAYS[dayOfWeek]}, ${dayOfMonthString} ${MONTHS[month]} ${year} ${hoursString}:${minutesString}:${secondsString} GMT`; -} -exports.dateToUtcString = dateToUtcString; -const RFC3339 = new RegExp(/^(\d{4})-(\d{2})-(\d{2})[tT](\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?[zZ]$/); -const parseRfc3339DateTime = (value) => { - if (value === null || value === undefined) { - return undefined; - } - if (typeof value !== "string") { - throw new TypeError("RFC-3339 date-times must be expressed as strings"); - } - const match = RFC3339.exec(value); - if (!match) { - throw new TypeError("Invalid RFC-3339 date-time value"); - } - const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds] = match; - const year = (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)); - const month = parseDateValue(monthStr, "month", 1, 12); - const day = parseDateValue(dayStr, "day", 1, 31); - return buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds }); -}; -exports.parseRfc3339DateTime = parseRfc3339DateTime; -const RFC3339_WITH_OFFSET = new RegExp(/^(\d{4})-(\d{2})-(\d{2})[tT](\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?(([-+]\d{2}\:\d{2})|[zZ])$/); -const parseRfc3339DateTimeWithOffset = (value) => { - if (value === null || value === undefined) { - return undefined; - } - if (typeof value !== "string") { - throw new TypeError("RFC-3339 date-times must be expressed as strings"); - } - const match = RFC3339_WITH_OFFSET.exec(value); - if (!match) { - throw new TypeError("Invalid RFC-3339 date-time value"); - } - const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, offsetStr] = match; - const year = (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)); - const month = parseDateValue(monthStr, "month", 1, 12); - const day = parseDateValue(dayStr, "day", 1, 31); - const date = buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds }); - if (offsetStr.toUpperCase() != "Z") { - date.setTime(date.getTime() - parseOffsetToMilliseconds(offsetStr)); - } - return date; -}; -exports.parseRfc3339DateTimeWithOffset = parseRfc3339DateTimeWithOffset; -const IMF_FIXDATE = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d{1,2}):(\d{2}):(\d{2})(?:\.(\d+))? GMT$/); -const RFC_850_DATE = new RegExp(/^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{2}) (\d{1,2}):(\d{2}):(\d{2})(?:\.(\d+))? GMT$/); -const ASC_TIME = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( [1-9]|\d{2}) (\d{1,2}):(\d{2}):(\d{2})(?:\.(\d+))? (\d{4})$/); -const parseRfc7231DateTime = (value) => { - if (value === null || value === undefined) { - return undefined; - } - if (typeof value !== "string") { - throw new TypeError("RFC-7231 date-times must be expressed as strings"); - } - let match = IMF_FIXDATE.exec(value); - if (match) { - const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match; - return buildDate((0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr, "day", 1, 31), { hours, minutes, seconds, fractionalMilliseconds }); - } - match = RFC_850_DATE.exec(value); - if (match) { - const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match; - return adjustRfc850Year(buildDate(parseTwoDigitYear(yearStr), parseMonthByShortName(monthStr), parseDateValue(dayStr, "day", 1, 31), { - hours, - minutes, - seconds, - fractionalMilliseconds, - })); - } - match = ASC_TIME.exec(value); - if (match) { - const [_, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, yearStr] = match; - return buildDate((0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr.trimLeft(), "day", 1, 31), { hours, minutes, seconds, fractionalMilliseconds }); - } - throw new TypeError("Invalid RFC-7231 date-time value"); -}; -exports.parseRfc7231DateTime = parseRfc7231DateTime; -const parseEpochTimestamp = (value) => { - if (value === null || value === undefined) { - return undefined; - } - let valueAsDouble; - if (typeof value === "number") { - valueAsDouble = value; - } - else if (typeof value === "string") { - valueAsDouble = (0, parse_utils_1.strictParseDouble)(value); - } - else { - throw new TypeError("Epoch timestamps must be expressed as floating point numbers or their string representation"); - } - if (Number.isNaN(valueAsDouble) || valueAsDouble === Infinity || valueAsDouble === -Infinity) { - throw new TypeError("Epoch timestamps must be valid, non-Infinite, non-NaN numerics"); - } - return new Date(Math.round(valueAsDouble * 1000)); -}; -exports.parseEpochTimestamp = parseEpochTimestamp; -const buildDate = (year, month, day, time) => { - const adjustedMonth = month - 1; - validateDayOfMonth(year, adjustedMonth, day); - return new Date(Date.UTC(year, adjustedMonth, day, parseDateValue(time.hours, "hour", 0, 23), parseDateValue(time.minutes, "minute", 0, 59), parseDateValue(time.seconds, "seconds", 0, 60), parseMilliseconds(time.fractionalMilliseconds))); -}; -const parseTwoDigitYear = (value) => { - const thisYear = new Date().getUTCFullYear(); - const valueInThisCentury = Math.floor(thisYear / 100) * 100 + (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(value)); - if (valueInThisCentury < thisYear) { - return valueInThisCentury + 100; - } - return valueInThisCentury; -}; -const FIFTY_YEARS_IN_MILLIS = 50 * 365 * 24 * 60 * 60 * 1000; -const adjustRfc850Year = (input) => { - if (input.getTime() - new Date().getTime() > FIFTY_YEARS_IN_MILLIS) { - return new Date(Date.UTC(input.getUTCFullYear() - 100, input.getUTCMonth(), input.getUTCDate(), input.getUTCHours(), input.getUTCMinutes(), input.getUTCSeconds(), input.getUTCMilliseconds())); - } - return input; -}; -const parseMonthByShortName = (value) => { - const monthIdx = MONTHS.indexOf(value); - if (monthIdx < 0) { - throw new TypeError(`Invalid month: ${value}`); - } - return monthIdx + 1; -}; -const DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; -const validateDayOfMonth = (year, month, day) => { - let maxDays = DAYS_IN_MONTH[month]; - if (month === 1 && isLeapYear(year)) { - maxDays = 29; - } - if (day > maxDays) { - throw new TypeError(`Invalid day for ${MONTHS[month]} in ${year}: ${day}`); - } -}; -const isLeapYear = (year) => { - return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); -}; -const parseDateValue = (value, type, lower, upper) => { - const dateVal = (0, parse_utils_1.strictParseByte)(stripLeadingZeroes(value)); - if (dateVal < lower || dateVal > upper) { - throw new TypeError(`${type} must be between ${lower} and ${upper}, inclusive`); - } - return dateVal; -}; -const parseMilliseconds = (value) => { - if (value === null || value === undefined) { - return 0; - } - return (0, parse_utils_1.strictParseFloat32)("0." + value) * 1000; -}; -const parseOffsetToMilliseconds = (value) => { - const directionStr = value[0]; - let direction = 1; - if (directionStr == "+") { - direction = 1; - } - else if (directionStr == "-") { - direction = -1; - } - else { - throw new TypeError(`Offset direction, ${directionStr}, must be "+" or "-"`); - } - const hour = Number(value.substring(1, 3)); - const minute = Number(value.substring(4, 6)); - return direction * (hour * 60 + minute) * 60 * 1000; -}; -const stripLeadingZeroes = (value) => { - let idx = 0; - while (idx < value.length - 1 && value.charAt(idx) === "0") { - idx++; - } - if (idx === 0) { - return value; - } - return value.slice(idx); -}; +exports.HttpAuthLocation = void 0; +var HttpAuthLocation; +(function (HttpAuthLocation) { + HttpAuthLocation["HEADER"] = "header"; + HttpAuthLocation["QUERY"] = "query"; +})(HttpAuthLocation = exports.HttpAuthLocation || (exports.HttpAuthLocation = {})); /***/ }), -/***/ 9681: +/***/ 11239: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.withBaseException = exports.throwDefaultError = void 0; -const exceptions_1 = __nccwpck_require__(88074); -const throwDefaultError = ({ output, parsedBody, exceptionCtor, errorCode }) => { - const $metadata = deserializeMetadata(output); - const statusCode = $metadata.httpStatusCode ? $metadata.httpStatusCode + "" : undefined; - const response = new exceptionCtor({ - name: (parsedBody === null || parsedBody === void 0 ? void 0 : parsedBody.code) || (parsedBody === null || parsedBody === void 0 ? void 0 : parsedBody.Code) || errorCode || statusCode || "UnknownError", - $fault: "client", - $metadata, - }); - throw (0, exceptions_1.decorateServiceException)(response, parsedBody); -}; -exports.throwDefaultError = throwDefaultError; -const withBaseException = (ExceptionCtor) => { - return ({ output, parsedBody, errorCode }) => { - (0, exports.throwDefaultError)({ output, parsedBody, exceptionCtor: ExceptionCtor, errorCode }); - }; -}; -exports.withBaseException = withBaseException; -const deserializeMetadata = (output) => { - var _a, _b; - return ({ - httpStatusCode: output.statusCode, - requestId: (_b = (_a = output.headers["x-amzn-requestid"]) !== null && _a !== void 0 ? _a : output.headers["x-amzn-request-id"]) !== null && _b !== void 0 ? _b : output.headers["x-amz-request-id"], - extendedRequestId: output.headers["x-amz-id-2"], - cfId: output.headers["x-amz-cf-id"], - }); -}; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(79467), exports); +tslib_1.__exportStar(__nccwpck_require__(93242), exports); +tslib_1.__exportStar(__nccwpck_require__(81851), exports); +tslib_1.__exportStar(__nccwpck_require__(91530), exports); +tslib_1.__exportStar(__nccwpck_require__(74020), exports); +tslib_1.__exportStar(__nccwpck_require__(52263), exports); /***/ }), -/***/ 11163: +/***/ 63274: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.loadConfigsForDefaultMode = void 0; -const loadConfigsForDefaultMode = (mode) => { - switch (mode) { - case "standard": - return { - retryMode: "standard", - connectionTimeout: 3100, - }; - case "in-region": - return { - retryMode: "standard", - connectionTimeout: 1100, - }; - case "cross-region": - return { - retryMode: "standard", - connectionTimeout: 3100, - }; - case "mobile": - return { - retryMode: "standard", - connectionTimeout: 30000, - }; - default: - return {}; - } -}; -exports.loadConfigsForDefaultMode = loadConfigsForDefaultMode; /***/ }), -/***/ 91809: +/***/ 78340: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.emitWarningIfUnsupportedVersion = void 0; -let warningEmitted = false; -const emitWarningIfUnsupportedVersion = (version) => { - if (version && !warningEmitted && parseInt(version.substring(1, version.indexOf("."))) < 14) { - warningEmitted = true; - } -}; -exports.emitWarningIfUnsupportedVersion = emitWarningIfUnsupportedVersion; /***/ }), -/***/ 88074: +/***/ 4744: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.decorateServiceException = exports.ServiceException = void 0; -class ServiceException extends Error { - constructor(options) { - super(options.message); - Object.setPrototypeOf(this, ServiceException.prototype); - this.name = options.name; - this.$fault = options.$fault; - this.$metadata = options.$metadata; - } -} -exports.ServiceException = ServiceException; -const decorateServiceException = (exception, additions = {}) => { - Object.entries(additions) - .filter(([, v]) => v !== undefined) - .forEach(([k, v]) => { - if (exception[k] == undefined || exception[k] === "") { - exception[k] = v; - } - }); - const message = exception.message || exception.Message || "UnknownError"; - exception.message = message; - delete exception.Message; - return exception; -}; -exports.decorateServiceException = decorateServiceException; /***/ }), -/***/ 76016: +/***/ 68270: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.extendedEncodeURIComponent = void 0; -function extendedEncodeURIComponent(str) { - return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { - return "%" + c.charCodeAt(0).toString(16).toUpperCase(); - }); -} -exports.extendedEncodeURIComponent = extendedEncodeURIComponent; /***/ }), -/***/ 30941: +/***/ 39580: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 57628: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(39580), exports); +tslib_1.__exportStar(__nccwpck_require__(98398), exports); +tslib_1.__exportStar(__nccwpck_require__(76522), exports); + + +/***/ }), + +/***/ 98398: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 76522: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 89035: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 7225: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 54126: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.EndpointURLScheme = void 0; +var EndpointURLScheme; +(function (EndpointURLScheme) { + EndpointURLScheme["HTTP"] = "http"; + EndpointURLScheme["HTTPS"] = "https"; +})(EndpointURLScheme = exports.EndpointURLScheme || (exports.EndpointURLScheme = {})); + + +/***/ }), + +/***/ 55612: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 43084: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 89843: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 63799: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 21550: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(55612), exports); +tslib_1.__exportStar(__nccwpck_require__(43084), exports); +tslib_1.__exportStar(__nccwpck_require__(89843), exports); +tslib_1.__exportStar(__nccwpck_require__(57658), exports); +tslib_1.__exportStar(__nccwpck_require__(63799), exports); + + +/***/ }), + +/***/ 57658: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 88508: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 8947: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + Object.defineProperty(exports, "__esModule", ({ value: true })); exports.resolveChecksumRuntimeConfig = exports.getChecksumConfiguration = exports.AlgorithmId = void 0; -const types_1 = __nccwpck_require__(55756); -Object.defineProperty(exports, "AlgorithmId", ({ enumerable: true, get: function () { return types_1.AlgorithmId; } })); +var AlgorithmId; +(function (AlgorithmId) { + AlgorithmId["MD5"] = "md5"; + AlgorithmId["CRC32"] = "crc32"; + AlgorithmId["CRC32C"] = "crc32c"; + AlgorithmId["SHA1"] = "sha1"; + AlgorithmId["SHA256"] = "sha256"; +})(AlgorithmId = exports.AlgorithmId || (exports.AlgorithmId = {})); const getChecksumConfiguration = (runtimeConfig) => { const checksumAlgorithms = []; - for (const id in types_1.AlgorithmId) { - const algorithmId = types_1.AlgorithmId[id]; - if (runtimeConfig[algorithmId] === undefined) { - continue; - } + if (runtimeConfig.sha256 !== undefined) { checksumAlgorithms.push({ - algorithmId: () => algorithmId, - checksumConstructor: () => runtimeConfig[algorithmId], + algorithmId: () => AlgorithmId.SHA256, + checksumConstructor: () => runtimeConfig.sha256, + }); + } + if (runtimeConfig.md5 != undefined) { + checksumAlgorithms.push({ + algorithmId: () => AlgorithmId.MD5, + checksumConstructor: () => runtimeConfig.md5, }); } return { @@ -50273,27 +49367,23 @@ exports.resolveChecksumRuntimeConfig = resolveChecksumRuntimeConfig; /***/ }), -/***/ 78643: +/***/ 89169: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveDefaultRuntimeConfig = exports.getDefaultClientConfiguration = exports.getDefaultExtensionConfiguration = void 0; -const checksum_1 = __nccwpck_require__(30941); -const retry_1 = __nccwpck_require__(67367); -const getDefaultExtensionConfiguration = (runtimeConfig) => { +exports.resolveDefaultRuntimeConfig = exports.getDefaultClientConfiguration = void 0; +const checksum_1 = __nccwpck_require__(8947); +const getDefaultClientConfiguration = (runtimeConfig) => { return { ...(0, checksum_1.getChecksumConfiguration)(runtimeConfig), - ...(0, retry_1.getRetryConfiguration)(runtimeConfig), }; }; -exports.getDefaultExtensionConfiguration = getDefaultExtensionConfiguration; -exports.getDefaultClientConfiguration = exports.getDefaultExtensionConfiguration; +exports.getDefaultClientConfiguration = getDefaultClientConfiguration; const resolveDefaultRuntimeConfig = (config) => { return { ...(0, checksum_1.resolveChecksumRuntimeConfig)(config), - ...(0, retry_1.resolveRetryRuntimeConfig)(config), }; }; exports.resolveDefaultRuntimeConfig = resolveDefaultRuntimeConfig; @@ -50301,657 +49391,278 @@ exports.resolveDefaultRuntimeConfig = resolveDefaultRuntimeConfig; /***/ }), -/***/ 1822: +/***/ 32245: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 47447: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AlgorithmId = void 0; const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(78643), exports); +tslib_1.__exportStar(__nccwpck_require__(89169), exports); +tslib_1.__exportStar(__nccwpck_require__(32245), exports); +var checksum_1 = __nccwpck_require__(8947); +Object.defineProperty(exports, "AlgorithmId", ({ enumerable: true, get: function () { return checksum_1.AlgorithmId; } })); /***/ }), -/***/ 67367: +/***/ 18883: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveRetryRuntimeConfig = exports.getRetryConfiguration = void 0; -const getRetryConfiguration = (runtimeConfig) => { - let _retryStrategy = runtimeConfig.retryStrategy; - return { - setRetryStrategy(retryStrategy) { - _retryStrategy = retryStrategy; - }, - retryStrategy() { - return _retryStrategy; - }, - }; -}; -exports.getRetryConfiguration = getRetryConfiguration; -const resolveRetryRuntimeConfig = (retryStrategyConfiguration) => { - const runtimeConfig = {}; - runtimeConfig.retryStrategy = retryStrategyConfiguration.retryStrategy(); - return runtimeConfig; -}; -exports.resolveRetryRuntimeConfig = resolveRetryRuntimeConfig; +exports.FieldPosition = void 0; +var FieldPosition; +(function (FieldPosition) { + FieldPosition[FieldPosition["HEADER"] = 0] = "HEADER"; + FieldPosition[FieldPosition["TRAILER"] = 1] = "TRAILER"; +})(FieldPosition = exports.FieldPosition || (exports.FieldPosition = {})); /***/ }), -/***/ 42638: +/***/ 197: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getArrayIfSingleItem = void 0; -const getArrayIfSingleItem = (mayBeArray) => Array.isArray(mayBeArray) ? mayBeArray : [mayBeArray]; -exports.getArrayIfSingleItem = getArrayIfSingleItem; /***/ }), -/***/ 92188: +/***/ 7545: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getValueFromTextNode = void 0; -const getValueFromTextNode = (obj) => { - const textNodeName = "#text"; - for (const key in obj) { - if (obj.hasOwnProperty(key) && obj[key][textNodeName] !== undefined) { - obj[key] = obj[key][textNodeName]; - } - else if (typeof obj[key] === "object" && obj[key] !== null) { - obj[key] = (0, exports.getValueFromTextNode)(obj[key]); - } - } - return obj; -}; -exports.getValueFromTextNode = getValueFromTextNode; /***/ }), -/***/ 63570: +/***/ 49123: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 28006: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(70438), exports); -tslib_1.__exportStar(__nccwpck_require__(61600), exports); -tslib_1.__exportStar(__nccwpck_require__(32813), exports); -tslib_1.__exportStar(__nccwpck_require__(75414), exports); -tslib_1.__exportStar(__nccwpck_require__(92541), exports); -tslib_1.__exportStar(__nccwpck_require__(56929), exports); -tslib_1.__exportStar(__nccwpck_require__(21737), exports); -tslib_1.__exportStar(__nccwpck_require__(9681), exports); -tslib_1.__exportStar(__nccwpck_require__(11163), exports); -tslib_1.__exportStar(__nccwpck_require__(91809), exports); -tslib_1.__exportStar(__nccwpck_require__(1822), exports); -tslib_1.__exportStar(__nccwpck_require__(88074), exports); -tslib_1.__exportStar(__nccwpck_require__(76016), exports); -tslib_1.__exportStar(__nccwpck_require__(42638), exports); -tslib_1.__exportStar(__nccwpck_require__(92188), exports); -tslib_1.__exportStar(__nccwpck_require__(32964), exports); -tslib_1.__exportStar(__nccwpck_require__(83495), exports); -tslib_1.__exportStar(__nccwpck_require__(74857), exports); -tslib_1.__exportStar(__nccwpck_require__(15342), exports); -tslib_1.__exportStar(__nccwpck_require__(53456), exports); -tslib_1.__exportStar(__nccwpck_require__(1752), exports); -tslib_1.__exportStar(__nccwpck_require__(92480), exports); +tslib_1.__exportStar(__nccwpck_require__(197), exports); +tslib_1.__exportStar(__nccwpck_require__(7545), exports); +tslib_1.__exportStar(__nccwpck_require__(49123), exports); +tslib_1.__exportStar(__nccwpck_require__(84476), exports); + + +/***/ }), + +/***/ 84476: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 55756: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(74075), exports); +tslib_1.__exportStar(__nccwpck_require__(11239), exports); +tslib_1.__exportStar(__nccwpck_require__(63274), exports); +tslib_1.__exportStar(__nccwpck_require__(78340), exports); +tslib_1.__exportStar(__nccwpck_require__(4744), exports); +tslib_1.__exportStar(__nccwpck_require__(68270), exports); +tslib_1.__exportStar(__nccwpck_require__(57628), exports); +tslib_1.__exportStar(__nccwpck_require__(89035), exports); +tslib_1.__exportStar(__nccwpck_require__(7225), exports); +tslib_1.__exportStar(__nccwpck_require__(54126), exports); +tslib_1.__exportStar(__nccwpck_require__(21550), exports); +tslib_1.__exportStar(__nccwpck_require__(88508), exports); +tslib_1.__exportStar(__nccwpck_require__(47447), exports); +tslib_1.__exportStar(__nccwpck_require__(18883), exports); +tslib_1.__exportStar(__nccwpck_require__(28006), exports); +tslib_1.__exportStar(__nccwpck_require__(52866), exports); +tslib_1.__exportStar(__nccwpck_require__(17756), exports); +tslib_1.__exportStar(__nccwpck_require__(45489), exports); +tslib_1.__exportStar(__nccwpck_require__(26524), exports); +tslib_1.__exportStar(__nccwpck_require__(14603), exports); +tslib_1.__exportStar(__nccwpck_require__(83752), exports); +tslib_1.__exportStar(__nccwpck_require__(30774), exports); +tslib_1.__exportStar(__nccwpck_require__(14089), exports); +tslib_1.__exportStar(__nccwpck_require__(45678), exports); +tslib_1.__exportStar(__nccwpck_require__(69926), exports); +tslib_1.__exportStar(__nccwpck_require__(9945), exports); +tslib_1.__exportStar(__nccwpck_require__(28564), exports); +tslib_1.__exportStar(__nccwpck_require__(61285), exports); +tslib_1.__exportStar(__nccwpck_require__(50364), exports); +tslib_1.__exportStar(__nccwpck_require__(69304), exports); +tslib_1.__exportStar(__nccwpck_require__(10375), exports); +tslib_1.__exportStar(__nccwpck_require__(66894), exports); +tslib_1.__exportStar(__nccwpck_require__(57887), exports); +tslib_1.__exportStar(__nccwpck_require__(66255), exports); + + +/***/ }), + +/***/ 52866: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 17756: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SMITHY_CONTEXT_KEY = void 0; +exports.SMITHY_CONTEXT_KEY = "__smithy_context"; + + +/***/ }), + +/***/ 45489: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 26524: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.IniSectionType = void 0; +var IniSectionType; +(function (IniSectionType) { + IniSectionType["PROFILE"] = "profile"; + IniSectionType["SSO_SESSION"] = "sso-session"; + IniSectionType["SERVICES"] = "services"; +})(IniSectionType = exports.IniSectionType || (exports.IniSectionType = {})); + + +/***/ }), + +/***/ 14603: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 32964: +/***/ 83752: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.LazyJsonString = exports.StringWrapper = void 0; -const StringWrapper = function () { - const Class = Object.getPrototypeOf(this).constructor; - const Constructor = Function.bind.apply(String, [null, ...arguments]); - const instance = new Constructor(); - Object.setPrototypeOf(instance, Class.prototype); - return instance; -}; -exports.StringWrapper = StringWrapper; -exports.StringWrapper.prototype = Object.create(String.prototype, { - constructor: { - value: exports.StringWrapper, - enumerable: false, - writable: true, - configurable: true, - }, -}); -Object.setPrototypeOf(exports.StringWrapper, String); -class LazyJsonString extends exports.StringWrapper { - deserializeJSON() { - return JSON.parse(super.toString()); - } - toJSON() { - return super.toString(); - } - static fromObject(object) { - if (object instanceof LazyJsonString) { - return object; - } - else if (object instanceof String || typeof object === "string") { - return new LazyJsonString(object); - } - return new LazyJsonString(JSON.stringify(object)); - } -} -exports.LazyJsonString = LazyJsonString; /***/ }), -/***/ 83495: +/***/ 30774: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.take = exports.convertMap = exports.map = void 0; -function map(arg0, arg1, arg2) { - let target; - let filter; - let instructions; - if (typeof arg1 === "undefined" && typeof arg2 === "undefined") { - target = {}; - instructions = arg0; - } - else { - target = arg0; - if (typeof arg1 === "function") { - filter = arg1; - instructions = arg2; - return mapWithFilter(target, filter, instructions); - } - else { - instructions = arg1; - } - } - for (const key of Object.keys(instructions)) { - if (!Array.isArray(instructions[key])) { - target[key] = instructions[key]; - continue; - } - applyInstruction(target, null, instructions, key); - } - return target; -} -exports.map = map; -const convertMap = (target) => { - const output = {}; - for (const [k, v] of Object.entries(target || {})) { - output[k] = [, v]; - } - return output; -}; -exports.convertMap = convertMap; -const take = (source, instructions) => { - const out = {}; - for (const key in instructions) { - applyInstruction(out, source, instructions, key); - } - return out; -}; -exports.take = take; -const mapWithFilter = (target, filter, instructions) => { - return map(target, Object.entries(instructions).reduce((_instructions, [key, value]) => { - if (Array.isArray(value)) { - _instructions[key] = value; - } - else { - if (typeof value === "function") { - _instructions[key] = [filter, value()]; - } - else { - _instructions[key] = [filter, value]; - } - } - return _instructions; - }, {})); -}; -const applyInstruction = (target, source, instructions, targetKey) => { - if (source !== null) { - let instruction = instructions[targetKey]; - if (typeof instruction === "function") { - instruction = [, instruction]; - } - const [filter = nonNullish, valueFn = pass, sourceKey = targetKey] = instruction; - if ((typeof filter === "function" && filter(source[sourceKey])) || (typeof filter !== "function" && !!filter)) { - target[targetKey] = valueFn(source[sourceKey]); - } - return; - } - let [filter, value] = instructions[targetKey]; - if (typeof value === "function") { - let _value; - const defaultFilterPassed = filter === undefined && (_value = value()) != null; - const customFilterPassed = (typeof filter === "function" && !!filter(void 0)) || (typeof filter !== "function" && !!filter); - if (defaultFilterPassed) { - target[targetKey] = _value; - } - else if (customFilterPassed) { - target[targetKey] = value(); - } - } - else { - const defaultFilterPassed = filter === undefined && value != null; - const customFilterPassed = (typeof filter === "function" && !!filter(value)) || (typeof filter !== "function" && !!filter); - if (defaultFilterPassed || customFilterPassed) { - target[targetKey] = value; - } - } -}; -const nonNullish = (_) => _ != null; -const pass = (_) => _; /***/ }), -/***/ 74857: +/***/ 14089: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.logger = exports.strictParseByte = exports.strictParseShort = exports.strictParseInt32 = exports.strictParseInt = exports.strictParseLong = exports.limitedParseFloat32 = exports.limitedParseFloat = exports.handleFloat = exports.limitedParseDouble = exports.strictParseFloat32 = exports.strictParseFloat = exports.strictParseDouble = exports.expectUnion = exports.expectString = exports.expectObject = exports.expectNonNull = exports.expectByte = exports.expectShort = exports.expectInt32 = exports.expectInt = exports.expectLong = exports.expectFloat32 = exports.expectNumber = exports.expectBoolean = exports.parseBoolean = void 0; -const parseBoolean = (value) => { - switch (value) { - case "true": - return true; - case "false": - return false; - default: - throw new Error(`Unable to parse boolean value "${value}"`); - } -}; -exports.parseBoolean = parseBoolean; -const expectBoolean = (value) => { - if (value === null || value === undefined) { - return undefined; - } - if (typeof value === "number") { - if (value === 0 || value === 1) { - exports.logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`)); - } - if (value === 0) { - return false; - } - if (value === 1) { - return true; - } - } - if (typeof value === "string") { - const lower = value.toLowerCase(); - if (lower === "false" || lower === "true") { - exports.logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`)); - } - if (lower === "false") { - return false; - } - if (lower === "true") { - return true; - } - } - if (typeof value === "boolean") { - return value; - } - throw new TypeError(`Expected boolean, got ${typeof value}: ${value}`); -}; -exports.expectBoolean = expectBoolean; -const expectNumber = (value) => { - if (value === null || value === undefined) { - return undefined; - } - if (typeof value === "string") { - const parsed = parseFloat(value); - if (!Number.isNaN(parsed)) { - if (String(parsed) !== String(value)) { - exports.logger.warn(stackTraceWarning(`Expected number but observed string: ${value}`)); - } - return parsed; - } - } - if (typeof value === "number") { - return value; - } - throw new TypeError(`Expected number, got ${typeof value}: ${value}`); -}; -exports.expectNumber = expectNumber; -const MAX_FLOAT = Math.ceil(2 ** 127 * (2 - 2 ** -23)); -const expectFloat32 = (value) => { - const expected = (0, exports.expectNumber)(value); - if (expected !== undefined && !Number.isNaN(expected) && expected !== Infinity && expected !== -Infinity) { - if (Math.abs(expected) > MAX_FLOAT) { - throw new TypeError(`Expected 32-bit float, got ${value}`); - } - } - return expected; -}; -exports.expectFloat32 = expectFloat32; -const expectLong = (value) => { - if (value === null || value === undefined) { - return undefined; - } - if (Number.isInteger(value) && !Number.isNaN(value)) { - return value; - } - throw new TypeError(`Expected integer, got ${typeof value}: ${value}`); -}; -exports.expectLong = expectLong; -exports.expectInt = exports.expectLong; -const expectInt32 = (value) => expectSizedInt(value, 32); -exports.expectInt32 = expectInt32; -const expectShort = (value) => expectSizedInt(value, 16); -exports.expectShort = expectShort; -const expectByte = (value) => expectSizedInt(value, 8); -exports.expectByte = expectByte; -const expectSizedInt = (value, size) => { - const expected = (0, exports.expectLong)(value); - if (expected !== undefined && castInt(expected, size) !== expected) { - throw new TypeError(`Expected ${size}-bit integer, got ${value}`); - } - return expected; -}; -const castInt = (value, size) => { - switch (size) { - case 32: - return Int32Array.of(value)[0]; - case 16: - return Int16Array.of(value)[0]; - case 8: - return Int8Array.of(value)[0]; - } -}; -const expectNonNull = (value, location) => { - if (value === null || value === undefined) { - if (location) { - throw new TypeError(`Expected a non-null value for ${location}`); - } - throw new TypeError("Expected a non-null value"); - } - return value; -}; -exports.expectNonNull = expectNonNull; -const expectObject = (value) => { - if (value === null || value === undefined) { - return undefined; - } - if (typeof value === "object" && !Array.isArray(value)) { - return value; - } - const receivedType = Array.isArray(value) ? "array" : typeof value; - throw new TypeError(`Expected object, got ${receivedType}: ${value}`); -}; -exports.expectObject = expectObject; -const expectString = (value) => { - if (value === null || value === undefined) { - return undefined; - } - if (typeof value === "string") { - return value; - } - if (["boolean", "number", "bigint"].includes(typeof value)) { - exports.logger.warn(stackTraceWarning(`Expected string, got ${typeof value}: ${value}`)); - return String(value); - } - throw new TypeError(`Expected string, got ${typeof value}: ${value}`); -}; -exports.expectString = expectString; -const expectUnion = (value) => { - if (value === null || value === undefined) { - return undefined; - } - const asObject = (0, exports.expectObject)(value); - const setKeys = Object.entries(asObject) - .filter(([, v]) => v != null) - .map(([k]) => k); - if (setKeys.length === 0) { - throw new TypeError(`Unions must have exactly one non-null member. None were found.`); - } - if (setKeys.length > 1) { - throw new TypeError(`Unions must have exactly one non-null member. Keys ${setKeys} were not null.`); - } - return asObject; -}; -exports.expectUnion = expectUnion; -const strictParseDouble = (value) => { - if (typeof value == "string") { - return (0, exports.expectNumber)(parseNumber(value)); - } - return (0, exports.expectNumber)(value); -}; -exports.strictParseDouble = strictParseDouble; -exports.strictParseFloat = exports.strictParseDouble; -const strictParseFloat32 = (value) => { - if (typeof value == "string") { - return (0, exports.expectFloat32)(parseNumber(value)); - } - return (0, exports.expectFloat32)(value); -}; -exports.strictParseFloat32 = strictParseFloat32; -const NUMBER_REGEX = /(-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?)|(-?Infinity)|(NaN)/g; -const parseNumber = (value) => { - const matches = value.match(NUMBER_REGEX); - if (matches === null || matches[0].length !== value.length) { - throw new TypeError(`Expected real number, got implicit NaN`); - } - return parseFloat(value); -}; -const limitedParseDouble = (value) => { - if (typeof value == "string") { - return parseFloatString(value); - } - return (0, exports.expectNumber)(value); -}; -exports.limitedParseDouble = limitedParseDouble; -exports.handleFloat = exports.limitedParseDouble; -exports.limitedParseFloat = exports.limitedParseDouble; -const limitedParseFloat32 = (value) => { - if (typeof value == "string") { - return parseFloatString(value); - } - return (0, exports.expectFloat32)(value); -}; -exports.limitedParseFloat32 = limitedParseFloat32; -const parseFloatString = (value) => { - switch (value) { - case "NaN": - return NaN; - case "Infinity": - return Infinity; - case "-Infinity": - return -Infinity; - default: - throw new Error(`Unable to parse float value: ${value}`); - } -}; -const strictParseLong = (value) => { - if (typeof value === "string") { - return (0, exports.expectLong)(parseNumber(value)); - } - return (0, exports.expectLong)(value); -}; -exports.strictParseLong = strictParseLong; -exports.strictParseInt = exports.strictParseLong; -const strictParseInt32 = (value) => { - if (typeof value === "string") { - return (0, exports.expectInt32)(parseNumber(value)); - } - return (0, exports.expectInt32)(value); -}; -exports.strictParseInt32 = strictParseInt32; -const strictParseShort = (value) => { - if (typeof value === "string") { - return (0, exports.expectShort)(parseNumber(value)); - } - return (0, exports.expectShort)(value); -}; -exports.strictParseShort = strictParseShort; -const strictParseByte = (value) => { - if (typeof value === "string") { - return (0, exports.expectByte)(parseNumber(value)); - } - return (0, exports.expectByte)(value); -}; -exports.strictParseByte = strictParseByte; -const stackTraceWarning = (message) => { - return String(new TypeError(message).stack || message) - .split("\n") - .slice(0, 5) - .filter((s) => !s.includes("stackTraceWarning")) - .join("\n"); -}; -exports.logger = { - warn: console.warn, -}; /***/ }), -/***/ 15342: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 45678: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolvedPath = void 0; -const extended_encode_uri_component_1 = __nccwpck_require__(76016); -const resolvedPath = (resolvedPath, input, memberName, labelValueProvider, uriLabel, isGreedyLabel) => { - if (input != null && input[memberName] !== undefined) { - const labelValue = labelValueProvider(); - if (labelValue.length <= 0) { - throw new Error("Empty value provided for input HTTP label: " + memberName + "."); - } - resolvedPath = resolvedPath.replace(uriLabel, isGreedyLabel - ? labelValue - .split("/") - .map((segment) => (0, extended_encode_uri_component_1.extendedEncodeURIComponent)(segment)) - .join("/") - : (0, extended_encode_uri_component_1.extendedEncodeURIComponent)(labelValue)); - } - else { - throw new Error("No value provided for input HTTP label: " + memberName + "."); - } - return resolvedPath; -}; -exports.resolvedPath = resolvedPath; /***/ }), -/***/ 53456: +/***/ 69926: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.serializeFloat = void 0; -const serializeFloat = (value) => { - if (value !== value) { - return "NaN"; - } - switch (value) { - case Infinity: - return "Infinity"; - case -Infinity: - return "-Infinity"; - default: - return value; - } -}; -exports.serializeFloat = serializeFloat; /***/ }), -/***/ 1752: +/***/ 9945: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports._json = void 0; -const _json = (obj) => { - if (obj == null) { - return {}; - } - if (Array.isArray(obj)) { - return obj.filter((_) => _ != null); - } - if (typeof obj === "object") { - const target = {}; - for (const key of Object.keys(obj)) { - if (obj[key] == null) { - continue; - } - target[key] = (0, exports._json)(obj[key]); - } - return target; - } - return obj; -}; -exports._json = _json; /***/ }), -/***/ 92480: +/***/ 28564: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.splitEvery = void 0; -function splitEvery(value, delimiter, numDelimiters) { - if (numDelimiters <= 0 || !Number.isInteger(numDelimiters)) { - throw new Error("Invalid number of delimiters (" + numDelimiters + ") for splitEvery."); - } - const segments = value.split(delimiter); - if (numDelimiters === 1) { - return segments; - } - const compoundSegments = []; - let currentSegment = ""; - for (let i = 0; i < segments.length; i++) { - if (currentSegment === "") { - currentSegment = segments[i]; - } - else { - currentSegment += delimiter + segments[i]; - } - if ((i + 1) % numDelimiters === 0) { - compoundSegments.push(currentSegment); - currentSegment = ""; - } - } - if (currentSegment !== "") { - compoundSegments.push(currentSegment); - } - return compoundSegments; -} -exports.splitEvery = splitEvery; /***/ }), -/***/ 74075: +/***/ 61285: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -50961,23 +49672,24 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 48960: +/***/ 50364: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HttpAuthLocation = void 0; -var HttpAuthLocation; -(function (HttpAuthLocation) { - HttpAuthLocation["HEADER"] = "header"; - HttpAuthLocation["QUERY"] = "query"; -})(HttpAuthLocation = exports.HttpAuthLocation || (exports.HttpAuthLocation = {})); +exports.RequestHandlerProtocol = void 0; +var RequestHandlerProtocol; +(function (RequestHandlerProtocol) { + RequestHandlerProtocol["HTTP_0_9"] = "http/0.9"; + RequestHandlerProtocol["HTTP_1_0"] = "http/1.0"; + RequestHandlerProtocol["TDS_8_0"] = "tds/8.0"; +})(RequestHandlerProtocol = exports.RequestHandlerProtocol || (exports.RequestHandlerProtocol = {})); /***/ }), -/***/ 63274: +/***/ 69304: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -50987,7 +49699,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 78340: +/***/ 10375: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -50997,7 +49709,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 4744: +/***/ 66894: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -51007,7 +49719,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 68270: +/***/ 57887: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -51017,7 +49729,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 39580: +/***/ 66255: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -51027,448 +49739,719 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 57628: +/***/ 14681: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(39580), exports); -tslib_1.__exportStar(__nccwpck_require__(98398), exports); -tslib_1.__exportStar(__nccwpck_require__(76522), exports); +exports.parseUrl = void 0; +const querystring_parser_1 = __nccwpck_require__(4769); +const parseUrl = (url) => { + if (typeof url === "string") { + return (0, exports.parseUrl)(new URL(url)); + } + const { hostname, pathname, port, protocol, search } = url; + let query; + if (search) { + query = (0, querystring_parser_1.parseQueryString)(search); + } + return { + hostname, + port: port ? parseInt(port) : undefined, + protocol, + path: pathname, + query, + }; +}; +exports.parseUrl = parseUrl; /***/ }), -/***/ 98398: -/***/ ((__unused_webpack_module, exports) => { +/***/ 30305: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fromBase64 = void 0; +const util_buffer_from_1 = __nccwpck_require__(31381); +const BASE64_REGEX = /^[A-Za-z0-9+/]*={0,2}$/; +const fromBase64 = (input) => { + if ((input.length * 3) % 4 !== 0) { + throw new TypeError(`Incorrect padding on base64 string.`); + } + if (!BASE64_REGEX.exec(input)) { + throw new TypeError(`Invalid base64 string.`); + } + const buffer = (0, util_buffer_from_1.fromString)(input, "base64"); + return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength); +}; +exports.fromBase64 = fromBase64; /***/ }), -/***/ 76522: -/***/ ((__unused_webpack_module, exports) => { +/***/ 75600: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(30305), exports); +tslib_1.__exportStar(__nccwpck_require__(74730), exports); /***/ }), -/***/ 89035: -/***/ ((__unused_webpack_module, exports) => { +/***/ 74730: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.toBase64 = void 0; +const util_buffer_from_1 = __nccwpck_require__(31381); +const toBase64 = (input) => (0, util_buffer_from_1.fromArrayBuffer)(input.buffer, input.byteOffset, input.byteLength).toString("base64"); +exports.toBase64 = toBase64; /***/ }), -/***/ 7225: -/***/ ((__unused_webpack_module, exports) => { +/***/ 54880: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.calculateBodyLength = void 0; +const fs_1 = __nccwpck_require__(57147); +const calculateBodyLength = (body) => { + if (!body) { + return 0; + } + if (typeof body === "string") { + return Buffer.from(body).length; + } + else if (typeof body.byteLength === "number") { + return body.byteLength; + } + else if (typeof body.size === "number") { + return body.size; + } + else if (typeof body.start === "number" && typeof body.end === "number") { + return body.end + 1 - body.start; + } + else if (typeof body.path === "string" || Buffer.isBuffer(body.path)) { + return (0, fs_1.lstatSync)(body.path).size; + } + else if (typeof body.fd === "number") { + return (0, fs_1.fstatSync)(body.fd).size; + } + throw new Error(`Body Length computation failed for ${body}`); +}; +exports.calculateBodyLength = calculateBodyLength; /***/ }), -/***/ 54126: -/***/ ((__unused_webpack_module, exports) => { +/***/ 68075: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.EndpointURLScheme = void 0; -var EndpointURLScheme; -(function (EndpointURLScheme) { - EndpointURLScheme["HTTP"] = "http"; - EndpointURLScheme["HTTPS"] = "https"; -})(EndpointURLScheme = exports.EndpointURLScheme || (exports.EndpointURLScheme = {})); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(54880), exports); /***/ }), -/***/ 55612: -/***/ ((__unused_webpack_module, exports) => { +/***/ 31381: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fromString = exports.fromArrayBuffer = void 0; +const is_array_buffer_1 = __nccwpck_require__(10780); +const buffer_1 = __nccwpck_require__(14300); +const fromArrayBuffer = (input, offset = 0, length = input.byteLength - offset) => { + if (!(0, is_array_buffer_1.isArrayBuffer)(input)) { + throw new TypeError(`The "input" argument must be ArrayBuffer. Received type ${typeof input} (${input})`); + } + return buffer_1.Buffer.from(input, offset, length); +}; +exports.fromArrayBuffer = fromArrayBuffer; +const fromString = (input, encoding) => { + if (typeof input !== "string") { + throw new TypeError(`The "input" argument must be of type string. Received type ${typeof input} (${input})`); + } + return encoding ? buffer_1.Buffer.from(input, encoding) : buffer_1.Buffer.from(input); +}; +exports.fromString = fromString; /***/ }), -/***/ 43084: +/***/ 42491: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.booleanSelector = exports.SelectorType = void 0; +var SelectorType; +(function (SelectorType) { + SelectorType["ENV"] = "env"; + SelectorType["CONFIG"] = "shared config entry"; +})(SelectorType = exports.SelectorType || (exports.SelectorType = {})); +const booleanSelector = (obj, key, type) => { + if (!(key in obj)) + return undefined; + if (obj[key] === "true") + return true; + if (obj[key] === "false") + return false; + throw new Error(`Cannot load ${type} "${key}". Expected "true" or "false", got ${obj[key]}.`); +}; +exports.booleanSelector = booleanSelector; /***/ }), -/***/ 89843: -/***/ ((__unused_webpack_module, exports) => { +/***/ 83375: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(42491), exports); /***/ }), -/***/ 63799: +/***/ 56470: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.IMDS_REGION_PATH = exports.DEFAULTS_MODE_OPTIONS = exports.ENV_IMDS_DISABLED = exports.AWS_DEFAULT_REGION_ENV = exports.AWS_REGION_ENV = exports.AWS_EXECUTION_ENV = void 0; +exports.AWS_EXECUTION_ENV = "AWS_EXECUTION_ENV"; +exports.AWS_REGION_ENV = "AWS_REGION"; +exports.AWS_DEFAULT_REGION_ENV = "AWS_DEFAULT_REGION"; +exports.ENV_IMDS_DISABLED = "AWS_EC2_METADATA_DISABLED"; +exports.DEFAULTS_MODE_OPTIONS = ["in-region", "cross-region", "mobile", "standard", "legacy"]; +exports.IMDS_REGION_PATH = "/latest/meta-data/placement/region"; /***/ }), -/***/ 21550: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 15577: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(55612), exports); -tslib_1.__exportStar(__nccwpck_require__(43084), exports); -tslib_1.__exportStar(__nccwpck_require__(89843), exports); -tslib_1.__exportStar(__nccwpck_require__(57658), exports); -tslib_1.__exportStar(__nccwpck_require__(63799), exports); +exports.NODE_DEFAULTS_MODE_CONFIG_OPTIONS = void 0; +const AWS_DEFAULTS_MODE_ENV = "AWS_DEFAULTS_MODE"; +const AWS_DEFAULTS_MODE_CONFIG = "defaults_mode"; +exports.NODE_DEFAULTS_MODE_CONFIG_OPTIONS = { + environmentVariableSelector: (env) => { + return env[AWS_DEFAULTS_MODE_ENV]; + }, + configFileSelector: (profile) => { + return profile[AWS_DEFAULTS_MODE_CONFIG]; + }, + default: "legacy", +}; /***/ }), -/***/ 57658: -/***/ ((__unused_webpack_module, exports) => { +/***/ 72429: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(46217), exports); /***/ }), -/***/ 88508: -/***/ ((__unused_webpack_module, exports) => { +/***/ 46217: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.resolveDefaultsModeConfig = void 0; +const config_resolver_1 = __nccwpck_require__(53098); +const credential_provider_imds_1 = __nccwpck_require__(7477); +const node_config_provider_1 = __nccwpck_require__(33461); +const property_provider_1 = __nccwpck_require__(79721); +const constants_1 = __nccwpck_require__(56470); +const defaultsModeConfig_1 = __nccwpck_require__(15577); +const resolveDefaultsModeConfig = ({ region = (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS), defaultsMode = (0, node_config_provider_1.loadConfig)(defaultsModeConfig_1.NODE_DEFAULTS_MODE_CONFIG_OPTIONS), } = {}) => (0, property_provider_1.memoize)(async () => { + const mode = typeof defaultsMode === "function" ? await defaultsMode() : defaultsMode; + switch (mode === null || mode === void 0 ? void 0 : mode.toLowerCase()) { + case "auto": + return resolveNodeDefaultsModeAuto(region); + case "in-region": + case "cross-region": + case "mobile": + case "standard": + case "legacy": + return Promise.resolve(mode === null || mode === void 0 ? void 0 : mode.toLocaleLowerCase()); + case undefined: + return Promise.resolve("legacy"); + default: + throw new Error(`Invalid parameter for "defaultsMode", expect ${constants_1.DEFAULTS_MODE_OPTIONS.join(", ")}, got ${mode}`); + } +}); +exports.resolveDefaultsModeConfig = resolveDefaultsModeConfig; +const resolveNodeDefaultsModeAuto = async (clientRegion) => { + if (clientRegion) { + const resolvedRegion = typeof clientRegion === "function" ? await clientRegion() : clientRegion; + const inferredRegion = await inferPhysicalRegion(); + if (!inferredRegion) { + return "standard"; + } + if (resolvedRegion === inferredRegion) { + return "in-region"; + } + else { + return "cross-region"; + } + } + return "standard"; +}; +const inferPhysicalRegion = async () => { + var _a; + if (process.env[constants_1.AWS_EXECUTION_ENV] && (process.env[constants_1.AWS_REGION_ENV] || process.env[constants_1.AWS_DEFAULT_REGION_ENV])) { + return (_a = process.env[constants_1.AWS_REGION_ENV]) !== null && _a !== void 0 ? _a : process.env[constants_1.AWS_DEFAULT_REGION_ENV]; + } + if (!process.env[constants_1.ENV_IMDS_DISABLED]) { + try { + const endpoint = await (0, credential_provider_imds_1.getInstanceMetadataEndpoint)(); + return (await (0, credential_provider_imds_1.httpRequest)({ ...endpoint, path: constants_1.IMDS_REGION_PATH })).toString(); + } + catch (e) { + } + } +}; /***/ }), -/***/ 8947: +/***/ 71280: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveChecksumRuntimeConfig = exports.getChecksumConfiguration = exports.AlgorithmId = void 0; -var AlgorithmId; -(function (AlgorithmId) { - AlgorithmId["MD5"] = "md5"; - AlgorithmId["CRC32"] = "crc32"; - AlgorithmId["CRC32C"] = "crc32c"; - AlgorithmId["SHA1"] = "sha1"; - AlgorithmId["SHA256"] = "sha256"; -})(AlgorithmId = exports.AlgorithmId || (exports.AlgorithmId = {})); -const getChecksumConfiguration = (runtimeConfig) => { - const checksumAlgorithms = []; - if (runtimeConfig.sha256 !== undefined) { - checksumAlgorithms.push({ - algorithmId: () => AlgorithmId.SHA256, - checksumConstructor: () => runtimeConfig.sha256, - }); - } - if (runtimeConfig.md5 != undefined) { - checksumAlgorithms.push({ - algorithmId: () => AlgorithmId.MD5, - checksumConstructor: () => runtimeConfig.md5, - }); - } - return { - _checksumAlgorithms: checksumAlgorithms, - addChecksumAlgorithm(algo) { - this._checksumAlgorithms.push(algo); - }, - checksumAlgorithms() { - return this._checksumAlgorithms; - }, - }; -}; -exports.getChecksumConfiguration = getChecksumConfiguration; -const resolveChecksumRuntimeConfig = (clientConfig) => { - const runtimeConfig = {}; - clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => { - runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor(); - }); - return runtimeConfig; -}; -exports.resolveChecksumRuntimeConfig = resolveChecksumRuntimeConfig; +exports.debugId = void 0; +exports.debugId = "endpoints"; /***/ }), -/***/ 89169: +/***/ 30540: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveDefaultRuntimeConfig = exports.getDefaultClientConfiguration = void 0; -const checksum_1 = __nccwpck_require__(8947); -const getDefaultClientConfiguration = (runtimeConfig) => { - return { - ...(0, checksum_1.getChecksumConfiguration)(runtimeConfig), - }; -}; -exports.getDefaultClientConfiguration = getDefaultClientConfiguration; -const resolveDefaultRuntimeConfig = (config) => { - return { - ...(0, checksum_1.resolveChecksumRuntimeConfig)(config), - }; -}; -exports.resolveDefaultRuntimeConfig = resolveDefaultRuntimeConfig; +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(71280), exports); +tslib_1.__exportStar(__nccwpck_require__(48927), exports); /***/ }), -/***/ 32245: +/***/ 48927: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.toDebugString = void 0; +function toDebugString(input) { + if (typeof input !== "object" || input == null) { + return input; + } + if ("ref" in input) { + return `$${toDebugString(input.ref)}`; + } + if ("fn" in input) { + return `${input.fn}(${(input.argv || []).map(toDebugString).join(", ")})`; + } + return JSON.stringify(input, null, 2); +} +exports.toDebugString = toDebugString; /***/ }), -/***/ 47447: +/***/ 45473: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AlgorithmId = void 0; const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(89169), exports); -tslib_1.__exportStar(__nccwpck_require__(32245), exports); -var checksum_1 = __nccwpck_require__(8947); -Object.defineProperty(exports, "AlgorithmId", ({ enumerable: true, get: function () { return checksum_1.AlgorithmId; } })); +tslib_1.__exportStar(__nccwpck_require__(55402), exports); +tslib_1.__exportStar(__nccwpck_require__(55021), exports); +tslib_1.__exportStar(__nccwpck_require__(38824), exports); +tslib_1.__exportStar(__nccwpck_require__(78693), exports); +tslib_1.__exportStar(__nccwpck_require__(75442), exports); /***/ }), -/***/ 18883: +/***/ 29132: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.FieldPosition = void 0; -var FieldPosition; -(function (FieldPosition) { - FieldPosition[FieldPosition["HEADER"] = 0] = "HEADER"; - FieldPosition[FieldPosition["TRAILER"] = 1] = "TRAILER"; -})(FieldPosition = exports.FieldPosition || (exports.FieldPosition = {})); +exports.booleanEquals = void 0; +const booleanEquals = (value1, value2) => value1 === value2; +exports.booleanEquals = booleanEquals; /***/ }), -/***/ 7545: -/***/ ((__unused_webpack_module, exports) => { +/***/ 84624: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getAttr = void 0; +const types_1 = __nccwpck_require__(75442); +const getAttrPathList_1 = __nccwpck_require__(91311); +const getAttr = (value, path) => (0, getAttrPathList_1.getAttrPathList)(path).reduce((acc, index) => { + if (typeof acc !== "object") { + throw new types_1.EndpointError(`Index '${index}' in '${path}' not found in '${JSON.stringify(value)}'`); + } + else if (Array.isArray(acc)) { + return acc[parseInt(index)]; + } + return acc[index]; +}, value); +exports.getAttr = getAttr; /***/ }), -/***/ 49123: -/***/ ((__unused_webpack_module, exports) => { +/***/ 91311: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getAttrPathList = void 0; +const types_1 = __nccwpck_require__(75442); +const getAttrPathList = (path) => { + const parts = path.split("."); + const pathList = []; + for (const part of parts) { + const squareBracketIndex = part.indexOf("["); + if (squareBracketIndex !== -1) { + if (part.indexOf("]") !== part.length - 1) { + throw new types_1.EndpointError(`Path: '${path}' does not end with ']'`); + } + const arrayIndex = part.slice(squareBracketIndex + 1, -1); + if (Number.isNaN(parseInt(arrayIndex))) { + throw new types_1.EndpointError(`Invalid array index: '${arrayIndex}' in path: '${path}'`); + } + if (squareBracketIndex !== 0) { + pathList.push(part.slice(0, squareBracketIndex)); + } + pathList.push(arrayIndex); + } + else { + pathList.push(part); + } + } + return pathList; +}; +exports.getAttrPathList = getAttrPathList; /***/ }), -/***/ 28006: +/***/ 36559: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(7545), exports); -tslib_1.__exportStar(__nccwpck_require__(49123), exports); +tslib_1.__exportStar(__nccwpck_require__(29132), exports); +tslib_1.__exportStar(__nccwpck_require__(84624), exports); +tslib_1.__exportStar(__nccwpck_require__(71231), exports); +tslib_1.__exportStar(__nccwpck_require__(55021), exports); +tslib_1.__exportStar(__nccwpck_require__(42249), exports); +tslib_1.__exportStar(__nccwpck_require__(84654), exports); +tslib_1.__exportStar(__nccwpck_require__(72512), exports); +tslib_1.__exportStar(__nccwpck_require__(49245), exports); +tslib_1.__exportStar(__nccwpck_require__(51482), exports); /***/ }), -/***/ 55756: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 55402: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(74075), exports); -tslib_1.__exportStar(__nccwpck_require__(48960), exports); -tslib_1.__exportStar(__nccwpck_require__(63274), exports); -tslib_1.__exportStar(__nccwpck_require__(78340), exports); -tslib_1.__exportStar(__nccwpck_require__(4744), exports); -tslib_1.__exportStar(__nccwpck_require__(68270), exports); -tslib_1.__exportStar(__nccwpck_require__(57628), exports); -tslib_1.__exportStar(__nccwpck_require__(89035), exports); -tslib_1.__exportStar(__nccwpck_require__(7225), exports); -tslib_1.__exportStar(__nccwpck_require__(54126), exports); -tslib_1.__exportStar(__nccwpck_require__(21550), exports); -tslib_1.__exportStar(__nccwpck_require__(88508), exports); -tslib_1.__exportStar(__nccwpck_require__(47447), exports); -tslib_1.__exportStar(__nccwpck_require__(18883), exports); -tslib_1.__exportStar(__nccwpck_require__(28006), exports); -tslib_1.__exportStar(__nccwpck_require__(52866), exports); -tslib_1.__exportStar(__nccwpck_require__(17756), exports); -tslib_1.__exportStar(__nccwpck_require__(45489), exports); -tslib_1.__exportStar(__nccwpck_require__(26524), exports); -tslib_1.__exportStar(__nccwpck_require__(14603), exports); -tslib_1.__exportStar(__nccwpck_require__(83752), exports); -tslib_1.__exportStar(__nccwpck_require__(30774), exports); -tslib_1.__exportStar(__nccwpck_require__(14089), exports); -tslib_1.__exportStar(__nccwpck_require__(45678), exports); -tslib_1.__exportStar(__nccwpck_require__(69926), exports); -tslib_1.__exportStar(__nccwpck_require__(9945), exports); -tslib_1.__exportStar(__nccwpck_require__(28564), exports); -tslib_1.__exportStar(__nccwpck_require__(61285), exports); -tslib_1.__exportStar(__nccwpck_require__(50364), exports); -tslib_1.__exportStar(__nccwpck_require__(69304), exports); -tslib_1.__exportStar(__nccwpck_require__(10375), exports); -tslib_1.__exportStar(__nccwpck_require__(66894), exports); -tslib_1.__exportStar(__nccwpck_require__(57887), exports); -tslib_1.__exportStar(__nccwpck_require__(66255), exports); +exports.isIpAddress = void 0; +const IP_V4_REGEX = new RegExp(`^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}$`); +const isIpAddress = (value) => IP_V4_REGEX.test(value) || (value.startsWith("[") && value.endsWith("]")); +exports.isIpAddress = isIpAddress; /***/ }), -/***/ 52866: +/***/ 71231: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isSet = void 0; +const isSet = (value) => value != null; +exports.isSet = isSet; /***/ }), -/***/ 17756: +/***/ 55021: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SMITHY_CONTEXT_KEY = void 0; -exports.SMITHY_CONTEXT_KEY = "__smithy_context"; +exports.isValidHostLabel = void 0; +const VALID_HOST_LABEL_REGEX = new RegExp(`^(?!.*-$)(?!-)[a-zA-Z0-9-]{1,63}$`); +const isValidHostLabel = (value, allowSubDomains = false) => { + if (!allowSubDomains) { + return VALID_HOST_LABEL_REGEX.test(value); + } + const labels = value.split("."); + for (const label of labels) { + if (!(0, exports.isValidHostLabel)(label)) { + return false; + } + } + return true; +}; +exports.isValidHostLabel = isValidHostLabel; /***/ }), -/***/ 45489: +/***/ 42249: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.not = void 0; +const not = (value) => !value; +exports.not = not; /***/ }), -/***/ 26524: -/***/ ((__unused_webpack_module, exports) => { +/***/ 84654: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.IniSectionType = void 0; -var IniSectionType; -(function (IniSectionType) { - IniSectionType["PROFILE"] = "profile"; - IniSectionType["SSO_SESSION"] = "sso-session"; - IniSectionType["SERVICES"] = "services"; -})(IniSectionType = exports.IniSectionType || (exports.IniSectionType = {})); +exports.parseURL = void 0; +const types_1 = __nccwpck_require__(55756); +const isIpAddress_1 = __nccwpck_require__(55402); +const DEFAULT_PORTS = { + [types_1.EndpointURLScheme.HTTP]: 80, + [types_1.EndpointURLScheme.HTTPS]: 443, +}; +const parseURL = (value) => { + const whatwgURL = (() => { + try { + if (value instanceof URL) { + return value; + } + if (typeof value === "object" && "hostname" in value) { + const { hostname, port, protocol = "", path = "", query = {} } = value; + const url = new URL(`${protocol}//${hostname}${port ? `:${port}` : ""}${path}`); + url.search = Object.entries(query) + .map(([k, v]) => `${k}=${v}`) + .join("&"); + return url; + } + return new URL(value); + } + catch (error) { + return null; + } + })(); + if (!whatwgURL) { + console.error(`Unable to parse ${JSON.stringify(value)} as a whatwg URL.`); + return null; + } + const urlString = whatwgURL.href; + const { host, hostname, pathname, protocol, search } = whatwgURL; + if (search) { + return null; + } + const scheme = protocol.slice(0, -1); + if (!Object.values(types_1.EndpointURLScheme).includes(scheme)) { + return null; + } + const isIp = (0, isIpAddress_1.isIpAddress)(hostname); + const inputContainsDefaultPort = urlString.includes(`${host}:${DEFAULT_PORTS[scheme]}`) || + (typeof value === "string" && value.includes(`${host}:${DEFAULT_PORTS[scheme]}`)); + const authority = `${host}${inputContainsDefaultPort ? `:${DEFAULT_PORTS[scheme]}` : ``}`; + return { + scheme, + authority, + path: pathname, + normalizedPath: pathname.endsWith("/") ? pathname : `${pathname}/`, + isIp, + }; +}; +exports.parseURL = parseURL; /***/ }), -/***/ 14603: +/***/ 72512: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.stringEquals = void 0; +const stringEquals = (value1, value2) => value1 === value2; +exports.stringEquals = stringEquals; /***/ }), -/***/ 83752: +/***/ 49245: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.substring = void 0; +const substring = (input, start, stop, reverse) => { + if (start >= stop || input.length < stop) { + return null; + } + if (!reverse) { + return input.substring(start, stop); + } + return input.substring(input.length - stop, input.length - start); +}; +exports.substring = substring; /***/ }), -/***/ 30774: +/***/ 51482: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.uriEncode = void 0; +const uriEncode = (value) => encodeURIComponent(value).replace(/[!*'()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`); +exports.uriEncode = uriEncode; /***/ }), -/***/ 14089: -/***/ ((__unused_webpack_module, exports) => { +/***/ 78693: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.resolveEndpoint = void 0; +const debug_1 = __nccwpck_require__(30540); +const types_1 = __nccwpck_require__(75442); +const utils_1 = __nccwpck_require__(96871); +const resolveEndpoint = (ruleSetObject, options) => { + var _a, _b, _c, _d, _e, _f; + const { endpointParams, logger } = options; + const { parameters, rules } = ruleSetObject; + (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, `${debug_1.debugId} Initial EndpointParams: ${(0, debug_1.toDebugString)(endpointParams)}`); + const paramsWithDefault = Object.entries(parameters) + .filter(([, v]) => v.default != null) + .map(([k, v]) => [k, v.default]); + if (paramsWithDefault.length > 0) { + for (const [paramKey, paramDefaultValue] of paramsWithDefault) { + endpointParams[paramKey] = (_c = endpointParams[paramKey]) !== null && _c !== void 0 ? _c : paramDefaultValue; + } + } + const requiredParams = Object.entries(parameters) + .filter(([, v]) => v.required) + .map(([k]) => k); + for (const requiredParam of requiredParams) { + if (endpointParams[requiredParam] == null) { + throw new types_1.EndpointError(`Missing required parameter: '${requiredParam}'`); + } + } + const endpoint = (0, utils_1.evaluateRules)(rules, { endpointParams, logger, referenceRecord: {} }); + if ((_d = options.endpointParams) === null || _d === void 0 ? void 0 : _d.Endpoint) { + try { + const givenEndpoint = new URL(options.endpointParams.Endpoint); + const { protocol, port } = givenEndpoint; + endpoint.url.protocol = protocol; + endpoint.url.port = port; + } + catch (e) { + } + } + (_f = (_e = options.logger) === null || _e === void 0 ? void 0 : _e.debug) === null || _f === void 0 ? void 0 : _f.call(_e, `${debug_1.debugId} Resolved endpoint: ${(0, debug_1.toDebugString)(endpoint)}`); + return endpoint; +}; +exports.resolveEndpoint = resolveEndpoint; /***/ }), -/***/ 45678: +/***/ 84213: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.EndpointError = void 0; +class EndpointError extends Error { + constructor(message) { + super(message); + this.name = "EndpointError"; + } +} +exports.EndpointError = EndpointError; /***/ }), -/***/ 69926: +/***/ 34073: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -51478,7 +50461,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 9945: +/***/ 72533: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -51488,7 +50471,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 28564: +/***/ 63135: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -51498,7 +50481,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 61285: +/***/ 19136: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -51508,34 +50491,35 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 50364: +/***/ 28344: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RequestHandlerProtocol = void 0; -var RequestHandlerProtocol; -(function (RequestHandlerProtocol) { - RequestHandlerProtocol["HTTP_0_9"] = "http/0.9"; - RequestHandlerProtocol["HTTP_1_0"] = "http/1.0"; - RequestHandlerProtocol["TDS_8_0"] = "tds/8.0"; -})(RequestHandlerProtocol = exports.RequestHandlerProtocol || (exports.RequestHandlerProtocol = {})); /***/ }), -/***/ 69304: -/***/ ((__unused_webpack_module, exports) => { +/***/ 75442: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(84213), exports); +tslib_1.__exportStar(__nccwpck_require__(34073), exports); +tslib_1.__exportStar(__nccwpck_require__(72533), exports); +tslib_1.__exportStar(__nccwpck_require__(63135), exports); +tslib_1.__exportStar(__nccwpck_require__(19136), exports); +tslib_1.__exportStar(__nccwpck_require__(28344), exports); +tslib_1.__exportStar(__nccwpck_require__(42535), exports); /***/ }), -/***/ 10375: +/***/ 42535: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -51545,343 +50529,461 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), -/***/ 66894: -/***/ ((__unused_webpack_module, exports) => { +/***/ 66318: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.callFunction = void 0; +const customEndpointFunctions_1 = __nccwpck_require__(38824); +const endpointFunctions_1 = __nccwpck_require__(70953); +const evaluateExpression_1 = __nccwpck_require__(91692); +const callFunction = ({ fn, argv }, options) => { + const evaluatedArgs = argv.map((arg) => ["boolean", "number"].includes(typeof arg) ? arg : (0, evaluateExpression_1.evaluateExpression)(arg, "arg", options)); + const fnSegments = fn.split("."); + if (fnSegments[0] in customEndpointFunctions_1.customEndpointFunctions && fnSegments[1] != null) { + return customEndpointFunctions_1.customEndpointFunctions[fnSegments[0]][fnSegments[1]](...evaluatedArgs); + } + return endpointFunctions_1.endpointFunctions[fn](...evaluatedArgs); +}; +exports.callFunction = callFunction; /***/ }), -/***/ 57887: +/***/ 38824: /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.customEndpointFunctions = void 0; +exports.customEndpointFunctions = {}; /***/ }), -/***/ 66255: -/***/ ((__unused_webpack_module, exports) => { +/***/ 70953: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.endpointFunctions = void 0; +const lib_1 = __nccwpck_require__(36559); +exports.endpointFunctions = { + booleanEquals: lib_1.booleanEquals, + getAttr: lib_1.getAttr, + isSet: lib_1.isSet, + isValidHostLabel: lib_1.isValidHostLabel, + not: lib_1.not, + parseURL: lib_1.parseURL, + stringEquals: lib_1.stringEquals, + substring: lib_1.substring, + uriEncode: lib_1.uriEncode, +}; /***/ }), -/***/ 14681: +/***/ 42138: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.parseUrl = void 0; -const querystring_parser_1 = __nccwpck_require__(4769); -const parseUrl = (url) => { - if (typeof url === "string") { - return (0, exports.parseUrl)(new URL(url)); - } - const { hostname, pathname, port, protocol, search } = url; - let query; - if (search) { - query = (0, querystring_parser_1.parseQueryString)(search); +exports.evaluateCondition = void 0; +const debug_1 = __nccwpck_require__(30540); +const types_1 = __nccwpck_require__(75442); +const callFunction_1 = __nccwpck_require__(66318); +const evaluateCondition = ({ assign, ...fnArgs }, options) => { + var _a, _b; + if (assign && assign in options.referenceRecord) { + throw new types_1.EndpointError(`'${assign}' is already defined in Reference Record.`); } + const value = (0, callFunction_1.callFunction)(fnArgs, options); + (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `evaluateCondition: ${(0, debug_1.toDebugString)(fnArgs)} = ${(0, debug_1.toDebugString)(value)}`); return { - hostname, - port: port ? parseInt(port) : undefined, - protocol, - path: pathname, - query, + result: value === "" ? true : !!value, + ...(assign != null && { toAssign: { name: assign, value } }), }; }; -exports.parseUrl = parseUrl; +exports.evaluateCondition = evaluateCondition; /***/ }), -/***/ 30305: +/***/ 69584: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fromBase64 = void 0; -const util_buffer_from_1 = __nccwpck_require__(31381); -const BASE64_REGEX = /^[A-Za-z0-9+/]*={0,2}$/; -const fromBase64 = (input) => { - if ((input.length * 3) % 4 !== 0) { - throw new TypeError(`Incorrect padding on base64 string.`); - } - if (!BASE64_REGEX.exec(input)) { - throw new TypeError(`Invalid base64 string.`); +exports.evaluateConditions = void 0; +const debug_1 = __nccwpck_require__(30540); +const evaluateCondition_1 = __nccwpck_require__(42138); +const evaluateConditions = (conditions = [], options) => { + var _a, _b; + const conditionsReferenceRecord = {}; + for (const condition of conditions) { + const { result, toAssign } = (0, evaluateCondition_1.evaluateCondition)(condition, { + ...options, + referenceRecord: { + ...options.referenceRecord, + ...conditionsReferenceRecord, + }, + }); + if (!result) { + return { result }; + } + if (toAssign) { + conditionsReferenceRecord[toAssign.name] = toAssign.value; + (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `assign: ${toAssign.name} := ${(0, debug_1.toDebugString)(toAssign.value)}`); + } } - const buffer = (0, util_buffer_from_1.fromString)(input, "base64"); - return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength); + return { result: true, referenceRecord: conditionsReferenceRecord }; }; -exports.fromBase64 = fromBase64; +exports.evaluateConditions = evaluateConditions; /***/ }), -/***/ 75600: +/***/ 14405: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(30305), exports); -tslib_1.__exportStar(__nccwpck_require__(74730), exports); +exports.evaluateEndpointRule = void 0; +const debug_1 = __nccwpck_require__(30540); +const evaluateConditions_1 = __nccwpck_require__(69584); +const getEndpointHeaders_1 = __nccwpck_require__(49452); +const getEndpointProperties_1 = __nccwpck_require__(83067); +const getEndpointUrl_1 = __nccwpck_require__(25672); +const evaluateEndpointRule = (endpointRule, options) => { + var _a, _b; + const { conditions, endpoint } = endpointRule; + const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options); + if (!result) { + return; + } + const endpointRuleOptions = { + ...options, + referenceRecord: { ...options.referenceRecord, ...referenceRecord }, + }; + const { url, properties, headers } = endpoint; + (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `Resolving endpoint from template: ${(0, debug_1.toDebugString)(endpoint)}`); + return { + ...(headers != undefined && { + headers: (0, getEndpointHeaders_1.getEndpointHeaders)(headers, endpointRuleOptions), + }), + ...(properties != undefined && { + properties: (0, getEndpointProperties_1.getEndpointProperties)(properties, endpointRuleOptions), + }), + url: (0, getEndpointUrl_1.getEndpointUrl)(url, endpointRuleOptions), + }; +}; +exports.evaluateEndpointRule = evaluateEndpointRule; /***/ }), -/***/ 74730: +/***/ 57563: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.toBase64 = void 0; -const util_buffer_from_1 = __nccwpck_require__(31381); -const toBase64 = (input) => (0, util_buffer_from_1.fromArrayBuffer)(input.buffer, input.byteOffset, input.byteLength).toString("base64"); -exports.toBase64 = toBase64; +exports.evaluateErrorRule = void 0; +const types_1 = __nccwpck_require__(75442); +const evaluateConditions_1 = __nccwpck_require__(69584); +const evaluateExpression_1 = __nccwpck_require__(91692); +const evaluateErrorRule = (errorRule, options) => { + const { conditions, error } = errorRule; + const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options); + if (!result) { + return; + } + throw new types_1.EndpointError((0, evaluateExpression_1.evaluateExpression)(error, "Error", { + ...options, + referenceRecord: { ...options.referenceRecord, ...referenceRecord }, + })); +}; +exports.evaluateErrorRule = evaluateErrorRule; /***/ }), -/***/ 54880: +/***/ 91692: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.calculateBodyLength = void 0; -const fs_1 = __nccwpck_require__(57147); -const calculateBodyLength = (body) => { - if (!body) { - return 0; - } - if (typeof body === "string") { - return Buffer.from(body).length; - } - else if (typeof body.byteLength === "number") { - return body.byteLength; - } - else if (typeof body.size === "number") { - return body.size; - } - else if (typeof body.start === "number" && typeof body.end === "number") { - return body.end + 1 - body.start; +exports.evaluateExpression = void 0; +const types_1 = __nccwpck_require__(75442); +const callFunction_1 = __nccwpck_require__(66318); +const evaluateTemplate_1 = __nccwpck_require__(21922); +const getReferenceValue_1 = __nccwpck_require__(17142); +const evaluateExpression = (obj, keyName, options) => { + if (typeof obj === "string") { + return (0, evaluateTemplate_1.evaluateTemplate)(obj, options); } - else if (typeof body.path === "string" || Buffer.isBuffer(body.path)) { - return (0, fs_1.lstatSync)(body.path).size; + else if (obj["fn"]) { + return (0, callFunction_1.callFunction)(obj, options); } - else if (typeof body.fd === "number") { - return (0, fs_1.fstatSync)(body.fd).size; + else if (obj["ref"]) { + return (0, getReferenceValue_1.getReferenceValue)(obj, options); } - throw new Error(`Body Length computation failed for ${body}`); + throw new types_1.EndpointError(`'${keyName}': ${String(obj)} is not a string, function or reference.`); }; -exports.calculateBodyLength = calculateBodyLength; +exports.evaluateExpression = evaluateExpression; /***/ }), -/***/ 68075: +/***/ 48830: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(54880), exports); +exports.evaluateRules = void 0; +const types_1 = __nccwpck_require__(75442); +const evaluateEndpointRule_1 = __nccwpck_require__(14405); +const evaluateErrorRule_1 = __nccwpck_require__(57563); +const evaluateTreeRule_1 = __nccwpck_require__(55085); +const evaluateRules = (rules, options) => { + for (const rule of rules) { + if (rule.type === "endpoint") { + const endpointOrUndefined = (0, evaluateEndpointRule_1.evaluateEndpointRule)(rule, options); + if (endpointOrUndefined) { + return endpointOrUndefined; + } + } + else if (rule.type === "error") { + (0, evaluateErrorRule_1.evaluateErrorRule)(rule, options); + } + else if (rule.type === "tree") { + const endpointOrUndefined = (0, evaluateTreeRule_1.evaluateTreeRule)(rule, options); + if (endpointOrUndefined) { + return endpointOrUndefined; + } + } + else { + throw new types_1.EndpointError(`Unknown endpoint rule: ${rule}`); + } + } + throw new types_1.EndpointError(`Rules evaluation failed`); +}; +exports.evaluateRules = evaluateRules; /***/ }), -/***/ 31381: +/***/ 21922: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fromString = exports.fromArrayBuffer = void 0; -const is_array_buffer_1 = __nccwpck_require__(10780); -const buffer_1 = __nccwpck_require__(14300); -const fromArrayBuffer = (input, offset = 0, length = input.byteLength - offset) => { - if (!(0, is_array_buffer_1.isArrayBuffer)(input)) { - throw new TypeError(`The "input" argument must be ArrayBuffer. Received type ${typeof input} (${input})`); - } - return buffer_1.Buffer.from(input, offset, length); -}; -exports.fromArrayBuffer = fromArrayBuffer; -const fromString = (input, encoding) => { - if (typeof input !== "string") { - throw new TypeError(`The "input" argument must be of type string. Received type ${typeof input} (${input})`); +exports.evaluateTemplate = void 0; +const lib_1 = __nccwpck_require__(36559); +const evaluateTemplate = (template, options) => { + const evaluatedTemplateArr = []; + const templateContext = { + ...options.endpointParams, + ...options.referenceRecord, + }; + let currentIndex = 0; + while (currentIndex < template.length) { + const openingBraceIndex = template.indexOf("{", currentIndex); + if (openingBraceIndex === -1) { + evaluatedTemplateArr.push(template.slice(currentIndex)); + break; + } + evaluatedTemplateArr.push(template.slice(currentIndex, openingBraceIndex)); + const closingBraceIndex = template.indexOf("}", openingBraceIndex); + if (closingBraceIndex === -1) { + evaluatedTemplateArr.push(template.slice(openingBraceIndex)); + break; + } + if (template[openingBraceIndex + 1] === "{" && template[closingBraceIndex + 1] === "}") { + evaluatedTemplateArr.push(template.slice(openingBraceIndex + 1, closingBraceIndex)); + currentIndex = closingBraceIndex + 2; + } + const parameterName = template.substring(openingBraceIndex + 1, closingBraceIndex); + if (parameterName.includes("#")) { + const [refName, attrName] = parameterName.split("#"); + evaluatedTemplateArr.push((0, lib_1.getAttr)(templateContext[refName], attrName)); + } + else { + evaluatedTemplateArr.push(templateContext[parameterName]); + } + currentIndex = closingBraceIndex + 1; } - return encoding ? buffer_1.Buffer.from(input, encoding) : buffer_1.Buffer.from(input); + return evaluatedTemplateArr.join(""); }; -exports.fromString = fromString; +exports.evaluateTemplate = evaluateTemplate; /***/ }), -/***/ 42491: -/***/ ((__unused_webpack_module, exports) => { +/***/ 55085: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.booleanSelector = exports.SelectorType = void 0; -var SelectorType; -(function (SelectorType) { - SelectorType["ENV"] = "env"; - SelectorType["CONFIG"] = "shared config entry"; -})(SelectorType = exports.SelectorType || (exports.SelectorType = {})); -const booleanSelector = (obj, key, type) => { - if (!(key in obj)) - return undefined; - if (obj[key] === "true") - return true; - if (obj[key] === "false") - return false; - throw new Error(`Cannot load ${type} "${key}". Expected "true" or "false", got ${obj[key]}.`); +exports.evaluateTreeRule = void 0; +const evaluateConditions_1 = __nccwpck_require__(69584); +const evaluateRules_1 = __nccwpck_require__(48830); +const evaluateTreeRule = (treeRule, options) => { + const { conditions, rules } = treeRule; + const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options); + if (!result) { + return; + } + return (0, evaluateRules_1.evaluateRules)(rules, { + ...options, + referenceRecord: { ...options.referenceRecord, ...referenceRecord }, + }); }; -exports.booleanSelector = booleanSelector; +exports.evaluateTreeRule = evaluateTreeRule; /***/ }), -/***/ 83375: +/***/ 49452: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(42491), exports); +exports.getEndpointHeaders = void 0; +const types_1 = __nccwpck_require__(75442); +const evaluateExpression_1 = __nccwpck_require__(91692); +const getEndpointHeaders = (headers, options) => Object.entries(headers).reduce((acc, [headerKey, headerVal]) => ({ + ...acc, + [headerKey]: headerVal.map((headerValEntry) => { + const processedExpr = (0, evaluateExpression_1.evaluateExpression)(headerValEntry, "Header value entry", options); + if (typeof processedExpr !== "string") { + throw new types_1.EndpointError(`Header '${headerKey}' value '${processedExpr}' is not a string`); + } + return processedExpr; + }), +}), {}); +exports.getEndpointHeaders = getEndpointHeaders; /***/ }), -/***/ 56470: -/***/ ((__unused_webpack_module, exports) => { +/***/ 83067: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.IMDS_REGION_PATH = exports.DEFAULTS_MODE_OPTIONS = exports.ENV_IMDS_DISABLED = exports.AWS_DEFAULT_REGION_ENV = exports.AWS_REGION_ENV = exports.AWS_EXECUTION_ENV = void 0; -exports.AWS_EXECUTION_ENV = "AWS_EXECUTION_ENV"; -exports.AWS_REGION_ENV = "AWS_REGION"; -exports.AWS_DEFAULT_REGION_ENV = "AWS_DEFAULT_REGION"; -exports.ENV_IMDS_DISABLED = "AWS_EC2_METADATA_DISABLED"; -exports.DEFAULTS_MODE_OPTIONS = ["in-region", "cross-region", "mobile", "standard", "legacy"]; -exports.IMDS_REGION_PATH = "/latest/meta-data/placement/region"; +exports.getEndpointProperties = void 0; +const getEndpointProperty_1 = __nccwpck_require__(26152); +const getEndpointProperties = (properties, options) => Object.entries(properties).reduce((acc, [propertyKey, propertyVal]) => ({ + ...acc, + [propertyKey]: (0, getEndpointProperty_1.getEndpointProperty)(propertyVal, options), +}), {}); +exports.getEndpointProperties = getEndpointProperties; /***/ }), -/***/ 15577: -/***/ ((__unused_webpack_module, exports) => { +/***/ 26152: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.NODE_DEFAULTS_MODE_CONFIG_OPTIONS = void 0; -const AWS_DEFAULTS_MODE_ENV = "AWS_DEFAULTS_MODE"; -const AWS_DEFAULTS_MODE_CONFIG = "defaults_mode"; -exports.NODE_DEFAULTS_MODE_CONFIG_OPTIONS = { - environmentVariableSelector: (env) => { - return env[AWS_DEFAULTS_MODE_ENV]; - }, - configFileSelector: (profile) => { - return profile[AWS_DEFAULTS_MODE_CONFIG]; - }, - default: "legacy", +exports.getEndpointProperty = void 0; +const types_1 = __nccwpck_require__(75442); +const evaluateTemplate_1 = __nccwpck_require__(21922); +const getEndpointProperties_1 = __nccwpck_require__(83067); +const getEndpointProperty = (property, options) => { + if (Array.isArray(property)) { + return property.map((propertyEntry) => (0, exports.getEndpointProperty)(propertyEntry, options)); + } + switch (typeof property) { + case "string": + return (0, evaluateTemplate_1.evaluateTemplate)(property, options); + case "object": + if (property === null) { + throw new types_1.EndpointError(`Unexpected endpoint property: ${property}`); + } + return (0, getEndpointProperties_1.getEndpointProperties)(property, options); + case "boolean": + return property; + default: + throw new types_1.EndpointError(`Unexpected endpoint property type: ${typeof property}`); + } }; +exports.getEndpointProperty = getEndpointProperty; /***/ }), -/***/ 72429: +/***/ 25672: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -const tslib_1 = __nccwpck_require__(4351); -tslib_1.__exportStar(__nccwpck_require__(46217), exports); +exports.getEndpointUrl = void 0; +const types_1 = __nccwpck_require__(75442); +const evaluateExpression_1 = __nccwpck_require__(91692); +const getEndpointUrl = (endpointUrl, options) => { + const expression = (0, evaluateExpression_1.evaluateExpression)(endpointUrl, "Endpoint URL", options); + if (typeof expression === "string") { + try { + return new URL(expression); + } + catch (error) { + console.error(`Failed to construct URL with ${expression}`, error); + throw error; + } + } + throw new types_1.EndpointError(`Endpoint URL must be a string, got ${typeof expression}`); +}; +exports.getEndpointUrl = getEndpointUrl; /***/ }), -/***/ 46217: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 17142: +/***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.resolveDefaultsModeConfig = void 0; -const config_resolver_1 = __nccwpck_require__(53098); -const credential_provider_imds_1 = __nccwpck_require__(7477); -const node_config_provider_1 = __nccwpck_require__(33461); -const property_provider_1 = __nccwpck_require__(79721); -const constants_1 = __nccwpck_require__(56470); -const defaultsModeConfig_1 = __nccwpck_require__(15577); -const resolveDefaultsModeConfig = ({ region = (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS), defaultsMode = (0, node_config_provider_1.loadConfig)(defaultsModeConfig_1.NODE_DEFAULTS_MODE_CONFIG_OPTIONS), } = {}) => (0, property_provider_1.memoize)(async () => { - const mode = typeof defaultsMode === "function" ? await defaultsMode() : defaultsMode; - switch (mode === null || mode === void 0 ? void 0 : mode.toLowerCase()) { - case "auto": - return resolveNodeDefaultsModeAuto(region); - case "in-region": - case "cross-region": - case "mobile": - case "standard": - case "legacy": - return Promise.resolve(mode === null || mode === void 0 ? void 0 : mode.toLocaleLowerCase()); - case undefined: - return Promise.resolve("legacy"); - default: - throw new Error(`Invalid parameter for "defaultsMode", expect ${constants_1.DEFAULTS_MODE_OPTIONS.join(", ")}, got ${mode}`); - } -}); -exports.resolveDefaultsModeConfig = resolveDefaultsModeConfig; -const resolveNodeDefaultsModeAuto = async (clientRegion) => { - if (clientRegion) { - const resolvedRegion = typeof clientRegion === "function" ? await clientRegion() : clientRegion; - const inferredRegion = await inferPhysicalRegion(); - if (!inferredRegion) { - return "standard"; - } - if (resolvedRegion === inferredRegion) { - return "in-region"; - } - else { - return "cross-region"; - } - } - return "standard"; -}; -const inferPhysicalRegion = async () => { - var _a; - if (process.env[constants_1.AWS_EXECUTION_ENV] && (process.env[constants_1.AWS_REGION_ENV] || process.env[constants_1.AWS_DEFAULT_REGION_ENV])) { - return (_a = process.env[constants_1.AWS_REGION_ENV]) !== null && _a !== void 0 ? _a : process.env[constants_1.AWS_DEFAULT_REGION_ENV]; - } - if (!process.env[constants_1.ENV_IMDS_DISABLED]) { - try { - const endpoint = await (0, credential_provider_imds_1.getInstanceMetadataEndpoint)(); - return (await (0, credential_provider_imds_1.httpRequest)({ ...endpoint, path: constants_1.IMDS_REGION_PATH })).toString(); - } - catch (e) { - } - } +exports.getReferenceValue = void 0; +const getReferenceValue = ({ ref }, options) => { + const referenceRecord = { + ...options.endpointParams, + ...options.referenceRecord, + }; + return referenceRecord[ref]; }; +exports.getReferenceValue = getReferenceValue; + + +/***/ }), + +/***/ 96871: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const tslib_1 = __nccwpck_require__(4351); +tslib_1.__exportStar(__nccwpck_require__(38824), exports); +tslib_1.__exportStar(__nccwpck_require__(48830), exports); /***/ }), @@ -70571,109 +69673,547 @@ class BalancedPool extends PoolBase { return } - let counter = 0 + let counter = 0 + + let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]) + + while (counter++ < this[kClients].length) { + this[kIndex] = (this[kIndex] + 1) % this[kClients].length + const pool = this[kClients][this[kIndex]] + + // find pool index with the largest weight + if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { + maxWeightIndex = this[kIndex] + } + + // decrease the current weight every `this[kClients].length`. + if (this[kIndex] === 0) { + // Set the current weight to the next lower weight. + this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor] + + if (this[kCurrentWeight] <= 0) { + this[kCurrentWeight] = this[kMaxWeightPerServer] + } + } + if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { + return pool + } + } + + this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight] + this[kIndex] = maxWeightIndex + return this[kClients][maxWeightIndex] + } +} + +module.exports = BalancedPool + + +/***/ }), + +/***/ 66101: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +const { kConstruct } = __nccwpck_require__(29174) +const { urlEquals, fieldValues: getFieldValues } = __nccwpck_require__(82396) +const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(83983) +const { kHeadersList } = __nccwpck_require__(72785) +const { webidl } = __nccwpck_require__(21744) +const { Response, cloneResponse } = __nccwpck_require__(27823) +const { Request } = __nccwpck_require__(48359) +const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(15861) +const { fetching } = __nccwpck_require__(74881) +const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(52538) +const assert = __nccwpck_require__(39491) +const { getGlobalDispatcher } = __nccwpck_require__(21892) + +/** + * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation + * @typedef {Object} CacheBatchOperation + * @property {'delete' | 'put'} type + * @property {any} request + * @property {any} response + * @property {import('../../types/cache').CacheQueryOptions} options + */ + +/** + * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list + * @typedef {[any, any][]} requestResponseList + */ + +class Cache { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list + * @type {requestResponseList} + */ + #relevantRequestResponseList + + constructor () { + if (arguments[0] !== kConstruct) { + webidl.illegalConstructor() + } + + this.#relevantRequestResponseList = arguments[1] + } + + async match (request, options = {}) { + webidl.brandCheck(this, Cache) + webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.match' }) + + request = webidl.converters.RequestInfo(request) + options = webidl.converters.CacheQueryOptions(options) + + const p = await this.matchAll(request, options) + + if (p.length === 0) { + return + } + + return p[0] + } + + async matchAll (request = undefined, options = {}) { + webidl.brandCheck(this, Cache) + + if (request !== undefined) request = webidl.converters.RequestInfo(request) + options = webidl.converters.CacheQueryOptions(options) + + // 1. + let r = null + + // 2. + if (request !== undefined) { + if (request instanceof Request) { + // 2.1.1 + r = request[kState] + + // 2.1.2 + if (r.method !== 'GET' && !options.ignoreMethod) { + return [] + } + } else if (typeof request === 'string') { + // 2.2.1 + r = new Request(request)[kState] + } + } + + // 5. + // 5.1 + const responses = [] + + // 5.2 + if (request === undefined) { + // 5.2.1 + for (const requestResponse of this.#relevantRequestResponseList) { + responses.push(requestResponse[1]) + } + } else { // 5.3 + // 5.3.1 + const requestResponses = this.#queryCache(r, options) + + // 5.3.2 + for (const requestResponse of requestResponses) { + responses.push(requestResponse[1]) + } + } + + // 5.4 + // We don't implement CORs so we don't need to loop over the responses, yay! + + // 5.5.1 + const responseList = [] + + // 5.5.2 + for (const response of responses) { + // 5.5.2.1 + const responseObject = new Response(response.body?.source ?? null) + const body = responseObject[kState].body + responseObject[kState] = response + responseObject[kState].body = body + responseObject[kHeaders][kHeadersList] = response.headersList + responseObject[kHeaders][kGuard] = 'immutable' + + responseList.push(responseObject) + } + + // 6. + return Object.freeze(responseList) + } + + async add (request) { + webidl.brandCheck(this, Cache) + webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.add' }) + + request = webidl.converters.RequestInfo(request) + + // 1. + const requests = [request] + + // 2. + const responseArrayPromise = this.addAll(requests) + + // 3. + return await responseArrayPromise + } + + async addAll (requests) { + webidl.brandCheck(this, Cache) + webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.addAll' }) + + requests = webidl.converters['sequence'](requests) + + // 1. + const responsePromises = [] + + // 2. + const requestList = [] + + // 3. + for (const request of requests) { + if (typeof request === 'string') { + continue + } + + // 3.1 + const r = request[kState] + + // 3.2 + if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') { + throw webidl.errors.exception({ + header: 'Cache.addAll', + message: 'Expected http/s scheme when method is not GET.' + }) + } + } + + // 4. + /** @type {ReturnType[]} */ + const fetchControllers = [] + + // 5. + for (const request of requests) { + // 5.1 + const r = new Request(request)[kState] + + // 5.2 + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: 'Cache.addAll', + message: 'Expected http/s scheme.' + }) + } + + // 5.4 + r.initiator = 'fetch' + r.destination = 'subresource' + + // 5.5 + requestList.push(r) + + // 5.6 + const responsePromise = createDeferredPromise() + + // 5.7 + fetchControllers.push(fetching({ + request: r, + dispatcher: getGlobalDispatcher(), + processResponse (response) { + // 1. + if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) { + responsePromise.reject(webidl.errors.exception({ + header: 'Cache.addAll', + message: 'Received an invalid status code or the request failed.' + })) + } else if (response.headersList.contains('vary')) { // 2. + // 2.1 + const fieldValues = getFieldValues(response.headersList.get('vary')) + + // 2.2 + for (const fieldValue of fieldValues) { + // 2.2.1 + if (fieldValue === '*') { + responsePromise.reject(webidl.errors.exception({ + header: 'Cache.addAll', + message: 'invalid vary field value' + })) + + for (const controller of fetchControllers) { + controller.abort() + } + + return + } + } + } + }, + processResponseEndOfBody (response) { + // 1. + if (response.aborted) { + responsePromise.reject(new DOMException('aborted', 'AbortError')) + return + } + + // 2. + responsePromise.resolve(response) + } + })) + + // 5.8 + responsePromises.push(responsePromise.promise) + } + + // 6. + const p = Promise.all(responsePromises) + + // 7. + const responses = await p + + // 7.1 + const operations = [] + + // 7.2 + let index = 0 + + // 7.3 + for (const response of responses) { + // 7.3.1 + /** @type {CacheBatchOperation} */ + const operation = { + type: 'put', // 7.3.2 + request: requestList[index], // 7.3.3 + response // 7.3.4 + } + + operations.push(operation) // 7.3.5 + + index++ // 7.3.6 + } + + // 7.5 + const cacheJobPromise = createDeferredPromise() + + // 7.6.1 + let errorData = null + + // 7.6.2 + try { + this.#batchCacheOperations(operations) + } catch (e) { + errorData = e + } + + // 7.6.3 + queueMicrotask(() => { + // 7.6.3.1 + if (errorData === null) { + cacheJobPromise.resolve(undefined) + } else { + // 7.6.3.2 + cacheJobPromise.reject(errorData) + } + }) + + // 7.7 + return cacheJobPromise.promise + } + + async put (request, response) { + webidl.brandCheck(this, Cache) + webidl.argumentLengthCheck(arguments, 2, { header: 'Cache.put' }) + + request = webidl.converters.RequestInfo(request) + response = webidl.converters.Response(response) + + // 1. + let innerRequest = null + + // 2. + if (request instanceof Request) { + innerRequest = request[kState] + } else { // 3. + innerRequest = new Request(request)[kState] + } + + // 4. + if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') { + throw webidl.errors.exception({ + header: 'Cache.put', + message: 'Expected an http/s scheme when method is not GET' + }) + } + + // 5. + const innerResponse = response[kState] + + // 6. + if (innerResponse.status === 206) { + throw webidl.errors.exception({ + header: 'Cache.put', + message: 'Got 206 status' + }) + } + + // 7. + if (innerResponse.headersList.contains('vary')) { + // 7.1. + const fieldValues = getFieldValues(innerResponse.headersList.get('vary')) + + // 7.2. + for (const fieldValue of fieldValues) { + // 7.2.1 + if (fieldValue === '*') { + throw webidl.errors.exception({ + header: 'Cache.put', + message: 'Got * vary field value' + }) + } + } + } + + // 8. + if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { + throw webidl.errors.exception({ + header: 'Cache.put', + message: 'Response body is locked or disturbed' + }) + } + + // 9. + const clonedResponse = cloneResponse(innerResponse) + + // 10. + const bodyReadPromise = createDeferredPromise() + + // 11. + if (innerResponse.body != null) { + // 11.1 + const stream = innerResponse.body.stream + + // 11.2 + const reader = stream.getReader() + + // 11.3 + readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject) + } else { + bodyReadPromise.resolve(undefined) + } + + // 12. + /** @type {CacheBatchOperation[]} */ + const operations = [] + + // 13. + /** @type {CacheBatchOperation} */ + const operation = { + type: 'put', // 14. + request: innerRequest, // 15. + response: clonedResponse // 16. + } + + // 17. + operations.push(operation) - let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]) + // 19. + const bytes = await bodyReadPromise.promise - while (counter++ < this[kClients].length) { - this[kIndex] = (this[kIndex] + 1) % this[kClients].length - const pool = this[kClients][this[kIndex]] + if (clonedResponse.body != null) { + clonedResponse.body.source = bytes + } - // find pool index with the largest weight - if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { - maxWeightIndex = this[kIndex] - } + // 19.1 + const cacheJobPromise = createDeferredPromise() - // decrease the current weight every `this[kClients].length`. - if (this[kIndex] === 0) { - // Set the current weight to the next lower weight. - this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor] + // 19.2.1 + let errorData = null - if (this[kCurrentWeight] <= 0) { - this[kCurrentWeight] = this[kMaxWeightPerServer] - } - } - if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { - return pool - } + // 19.2.2 + try { + this.#batchCacheOperations(operations) + } catch (e) { + errorData = e } - this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight] - this[kIndex] = maxWeightIndex - return this[kClients][maxWeightIndex] - } -} - -module.exports = BalancedPool - + // 19.2.3 + queueMicrotask(() => { + // 19.2.3.1 + if (errorData === null) { + cacheJobPromise.resolve() + } else { // 19.2.3.2 + cacheJobPromise.reject(errorData) + } + }) -/***/ }), + return cacheJobPromise.promise + } -/***/ 66101: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + async delete (request, options = {}) { + webidl.brandCheck(this, Cache) + webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.delete' }) -"use strict"; + request = webidl.converters.RequestInfo(request) + options = webidl.converters.CacheQueryOptions(options) + /** + * @type {Request} + */ + let r = null -const { kConstruct } = __nccwpck_require__(29174) -const { urlEquals, fieldValues: getFieldValues } = __nccwpck_require__(82396) -const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(83983) -const { kHeadersList } = __nccwpck_require__(72785) -const { webidl } = __nccwpck_require__(21744) -const { Response, cloneResponse } = __nccwpck_require__(27823) -const { Request } = __nccwpck_require__(48359) -const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(15861) -const { fetching } = __nccwpck_require__(74881) -const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(52538) -const assert = __nccwpck_require__(39491) -const { getGlobalDispatcher } = __nccwpck_require__(21892) + if (request instanceof Request) { + r = request[kState] -/** - * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation - * @typedef {Object} CacheBatchOperation - * @property {'delete' | 'put'} type - * @property {any} request - * @property {any} response - * @property {import('../../types/cache').CacheQueryOptions} options - */ + if (r.method !== 'GET' && !options.ignoreMethod) { + return false + } + } else { + assert(typeof request === 'string') -/** - * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list - * @typedef {[any, any][]} requestResponseList - */ + r = new Request(request)[kState] + } -class Cache { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list - * @type {requestResponseList} - */ - #relevantRequestResponseList + /** @type {CacheBatchOperation[]} */ + const operations = [] - constructor () { - if (arguments[0] !== kConstruct) { - webidl.illegalConstructor() + /** @type {CacheBatchOperation} */ + const operation = { + type: 'delete', + request: r, + options } - this.#relevantRequestResponseList = arguments[1] - } - - async match (request, options = {}) { - webidl.brandCheck(this, Cache) - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.match' }) + operations.push(operation) - request = webidl.converters.RequestInfo(request) - options = webidl.converters.CacheQueryOptions(options) + const cacheJobPromise = createDeferredPromise() - const p = await this.matchAll(request, options) + let errorData = null + let requestResponses - if (p.length === 0) { - return + try { + requestResponses = this.#batchCacheOperations(operations) + } catch (e) { + errorData = e } - return p[0] + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(!!requestResponses?.length) + } else { + cacheJobPromise.reject(errorData) + } + }) + + return cacheJobPromise.promise } - async matchAll (request = undefined, options = {}) { + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys + * @param {any} request + * @param {import('../../types/cache').CacheQueryOptions} options + * @returns {readonly Request[]} + */ + async keys (request = undefined, options = {}) { webidl.brandCheck(this, Cache) if (request !== undefined) request = webidl.converters.RequestInfo(request) @@ -70684,6 +70224,7 @@ class Cache { // 2. if (request !== undefined) { + // 2.1 if (request instanceof Request) { // 2.1.1 r = request[kState] @@ -70692,21 +70233,24 @@ class Cache { if (r.method !== 'GET' && !options.ignoreMethod) { return [] } - } else if (typeof request === 'string') { - // 2.2.1 + } else if (typeof request === 'string') { // 2.2 r = new Request(request)[kState] } } + // 4. + const promise = createDeferredPromise() + // 5. // 5.1 - const responses = [] + const requests = [] // 5.2 if (request === undefined) { // 5.2.1 for (const requestResponse of this.#relevantRequestResponseList) { - responses.push(requestResponse[1]) + // 5.2.1.1 + requests.push(requestResponse[0]) } } else { // 5.3 // 5.3.1 @@ -70714,1439 +70258,1689 @@ class Cache { // 5.3.2 for (const requestResponse of requestResponses) { - responses.push(requestResponse[1]) + // 5.3.2.1 + requests.push(requestResponse[0]) } } // 5.4 - // We don't implement CORs so we don't need to loop over the responses, yay! + queueMicrotask(() => { + // 5.4.1 + const requestList = [] - // 5.5.1 - const responseList = [] + // 5.4.2 + for (const request of requests) { + const requestObject = new Request('https://a') + requestObject[kState] = request + requestObject[kHeaders][kHeadersList] = request.headersList + requestObject[kHeaders][kGuard] = 'immutable' + requestObject[kRealm] = request.client - // 5.5.2 - for (const response of responses) { - // 5.5.2.1 - const responseObject = new Response(response.body?.source ?? null) - const body = responseObject[kState].body - responseObject[kState] = response - responseObject[kState].body = body - responseObject[kHeaders][kHeadersList] = response.headersList - responseObject[kHeaders][kGuard] = 'immutable' + // 5.4.2.1 + requestList.push(requestObject) + } - responseList.push(responseObject) - } + // 5.4.3 + promise.resolve(Object.freeze(requestList)) + }) - // 6. - return Object.freeze(responseList) + return promise.promise } - async add (request) { - webidl.brandCheck(this, Cache) - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.add' }) - - request = webidl.converters.RequestInfo(request) - + /** + * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm + * @param {CacheBatchOperation[]} operations + * @returns {requestResponseList} + */ + #batchCacheOperations (operations) { // 1. - const requests = [request] + const cache = this.#relevantRequestResponseList // 2. - const responseArrayPromise = this.addAll(requests) + const backupCache = [...cache] // 3. - return await responseArrayPromise - } + const addedItems = [] - async addAll (requests) { - webidl.brandCheck(this, Cache) - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.addAll' }) + // 4.1 + const resultList = [] - requests = webidl.converters['sequence'](requests) + try { + // 4.2 + for (const operation of operations) { + // 4.2.1 + if (operation.type !== 'delete' && operation.type !== 'put') { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'operation type does not match "delete" or "put"' + }) + } - // 1. - const responsePromises = [] + // 4.2.2 + if (operation.type === 'delete' && operation.response != null) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'delete operation should not have an associated response' + }) + } - // 2. - const requestList = [] + // 4.2.3 + if (this.#queryCache(operation.request, operation.options, addedItems).length) { + throw new DOMException('???', 'InvalidStateError') + } - // 3. - for (const request of requests) { - if (typeof request === 'string') { - continue - } + // 4.2.4 + let requestResponses - // 3.1 - const r = request[kState] + // 4.2.5 + if (operation.type === 'delete') { + // 4.2.5.1 + requestResponses = this.#queryCache(operation.request, operation.options) - // 3.2 - if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') { - throw webidl.errors.exception({ - header: 'Cache.addAll', - message: 'Expected http/s scheme when method is not GET.' - }) - } - } + // TODO: the spec is wrong, this is needed to pass WPTs + if (requestResponses.length === 0) { + return [] + } - // 4. - /** @type {ReturnType[]} */ - const fetchControllers = [] + // 4.2.5.2 + for (const requestResponse of requestResponses) { + const idx = cache.indexOf(requestResponse) + assert(idx !== -1) - // 5. - for (const request of requests) { + // 4.2.5.2.1 + cache.splice(idx, 1) + } + } else if (operation.type === 'put') { // 4.2.6 + // 4.2.6.1 + if (operation.response == null) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'put operation should have an associated response' + }) + } + + // 4.2.6.2 + const r = operation.request + + // 4.2.6.3 + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'expected http or https scheme' + }) + } + + // 4.2.6.4 + if (r.method !== 'GET') { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'not get method' + }) + } + + // 4.2.6.5 + if (operation.options != null) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'options must not be defined' + }) + } + + // 4.2.6.6 + requestResponses = this.#queryCache(operation.request) + + // 4.2.6.7 + for (const requestResponse of requestResponses) { + const idx = cache.indexOf(requestResponse) + assert(idx !== -1) + + // 4.2.6.7.1 + cache.splice(idx, 1) + } + + // 4.2.6.8 + cache.push([operation.request, operation.response]) + + // 4.2.6.10 + addedItems.push([operation.request, operation.response]) + } + + // 4.2.7 + resultList.push([operation.request, operation.response]) + } + + // 4.3 + return resultList + } catch (e) { // 5. // 5.1 - const r = new Request(request)[kState] + this.#relevantRequestResponseList.length = 0 // 5.2 - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: 'Cache.addAll', - message: 'Expected http/s scheme.' - }) + this.#relevantRequestResponseList = backupCache + + // 5.3 + throw e + } + } + + /** + * @see https://w3c.github.io/ServiceWorker/#query-cache + * @param {any} requestQuery + * @param {import('../../types/cache').CacheQueryOptions} options + * @param {requestResponseList} targetStorage + * @returns {requestResponseList} + */ + #queryCache (requestQuery, options, targetStorage) { + /** @type {requestResponseList} */ + const resultList = [] + + const storage = targetStorage ?? this.#relevantRequestResponseList + + for (const requestResponse of storage) { + const [cachedRequest, cachedResponse] = requestResponse + if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { + resultList.push(requestResponse) } + } - // 5.4 - r.initiator = 'fetch' - r.destination = 'subresource' + return resultList + } - // 5.5 - requestList.push(r) + /** + * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm + * @param {any} requestQuery + * @param {any} request + * @param {any | null} response + * @param {import('../../types/cache').CacheQueryOptions | undefined} options + * @returns {boolean} + */ + #requestMatchesCachedItem (requestQuery, request, response = null, options) { + // if (options?.ignoreMethod === false && request.method === 'GET') { + // return false + // } - // 5.6 - const responsePromise = createDeferredPromise() + const queryURL = new URL(requestQuery.url) - // 5.7 - fetchControllers.push(fetching({ - request: r, - dispatcher: getGlobalDispatcher(), - processResponse (response) { - // 1. - if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) { - responsePromise.reject(webidl.errors.exception({ - header: 'Cache.addAll', - message: 'Received an invalid status code or the request failed.' - })) - } else if (response.headersList.contains('vary')) { // 2. - // 2.1 - const fieldValues = getFieldValues(response.headersList.get('vary')) + const cachedURL = new URL(request.url) - // 2.2 - for (const fieldValue of fieldValues) { - // 2.2.1 - if (fieldValue === '*') { - responsePromise.reject(webidl.errors.exception({ - header: 'Cache.addAll', - message: 'invalid vary field value' - })) + if (options?.ignoreSearch) { + cachedURL.search = '' - for (const controller of fetchControllers) { - controller.abort() - } + queryURL.search = '' + } - return - } - } - } - }, - processResponseEndOfBody (response) { - // 1. - if (response.aborted) { - responsePromise.reject(new DOMException('aborted', 'AbortError')) - return - } + if (!urlEquals(queryURL, cachedURL, true)) { + return false + } - // 2. - responsePromise.resolve(response) - } - })) + if ( + response == null || + options?.ignoreVary || + !response.headersList.contains('vary') + ) { + return true + } + + const fieldValues = getFieldValues(response.headersList.get('vary')) + + for (const fieldValue of fieldValues) { + if (fieldValue === '*') { + return false + } + + const requestValue = request.headersList.get(fieldValue) + const queryValue = requestQuery.headersList.get(fieldValue) + + // If one has the header and the other doesn't, or one has + // a different value than the other, return false + if (requestValue !== queryValue) { + return false + } + } + + return true + } +} + +Object.defineProperties(Cache.prototype, { + [Symbol.toStringTag]: { + value: 'Cache', + configurable: true + }, + match: kEnumerableProperty, + matchAll: kEnumerableProperty, + add: kEnumerableProperty, + addAll: kEnumerableProperty, + put: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty +}) + +const cacheQueryOptionConverters = [ + { + key: 'ignoreSearch', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'ignoreMethod', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'ignoreVary', + converter: webidl.converters.boolean, + defaultValue: false + } +] - // 5.8 - responsePromises.push(responsePromise.promise) - } +webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters) - // 6. - const p = Promise.all(responsePromises) +webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ + ...cacheQueryOptionConverters, + { + key: 'cacheName', + converter: webidl.converters.DOMString + } +]) - // 7. - const responses = await p +webidl.converters.Response = webidl.interfaceConverter(Response) - // 7.1 - const operations = [] +webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.RequestInfo +) - // 7.2 - let index = 0 +module.exports = { + Cache +} - // 7.3 - for (const response of responses) { - // 7.3.1 - /** @type {CacheBatchOperation} */ - const operation = { - type: 'put', // 7.3.2 - request: requestList[index], // 7.3.3 - response // 7.3.4 - } - operations.push(operation) // 7.3.5 +/***/ }), - index++ // 7.3.6 - } +/***/ 37907: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 7.5 - const cacheJobPromise = createDeferredPromise() +"use strict"; - // 7.6.1 - let errorData = null - // 7.6.2 - try { - this.#batchCacheOperations(operations) - } catch (e) { - errorData = e - } +const { kConstruct } = __nccwpck_require__(29174) +const { Cache } = __nccwpck_require__(66101) +const { webidl } = __nccwpck_require__(21744) +const { kEnumerableProperty } = __nccwpck_require__(83983) - // 7.6.3 - queueMicrotask(() => { - // 7.6.3.1 - if (errorData === null) { - cacheJobPromise.resolve(undefined) - } else { - // 7.6.3.2 - cacheJobPromise.reject(errorData) - } - }) +class CacheStorage { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map + * @type {Map} + */ + async has (cacheName) { + webidl.brandCheck(this, CacheStorage) + webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.has' }) - // 9. - const clonedResponse = cloneResponse(innerResponse) + cacheName = webidl.converters.DOMString(cacheName) - // 10. - const bodyReadPromise = createDeferredPromise() + // 2.1.1 + // 2.2 + return this.#caches.has(cacheName) + } - // 11. - if (innerResponse.body != null) { - // 11.1 - const stream = innerResponse.body.stream + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open + * @param {string} cacheName + * @returns {Promise} + */ + async open (cacheName) { + webidl.brandCheck(this, CacheStorage) + webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.open' }) - // 11.2 - const reader = stream.getReader() + cacheName = webidl.converters.DOMString(cacheName) - // 11.3 - readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject) - } else { - bodyReadPromise.resolve(undefined) - } + // 2.1 + if (this.#caches.has(cacheName)) { + // await caches.open('v1') !== await caches.open('v1') - // 12. - /** @type {CacheBatchOperation[]} */ - const operations = [] + // 2.1.1 + const cache = this.#caches.get(cacheName) - // 13. - /** @type {CacheBatchOperation} */ - const operation = { - type: 'put', // 14. - request: innerRequest, // 15. - response: clonedResponse // 16. + // 2.1.1.1 + return new Cache(kConstruct, cache) } - // 17. - operations.push(operation) + // 2.2 + const cache = [] - // 19. - const bytes = await bodyReadPromise.promise + // 2.3 + this.#caches.set(cacheName, cache) - if (clonedResponse.body != null) { - clonedResponse.body.source = bytes - } + // 2.4 + return new Cache(kConstruct, cache) + } - // 19.1 - const cacheJobPromise = createDeferredPromise() + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete + * @param {string} cacheName + * @returns {Promise} + */ + async delete (cacheName) { + webidl.brandCheck(this, CacheStorage) + webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.delete' }) - // 19.2.1 - let errorData = null + cacheName = webidl.converters.DOMString(cacheName) - // 19.2.2 - try { - this.#batchCacheOperations(operations) - } catch (e) { - errorData = e - } + return this.#caches.delete(cacheName) + } - // 19.2.3 - queueMicrotask(() => { - // 19.2.3.1 - if (errorData === null) { - cacheJobPromise.resolve() - } else { // 19.2.3.2 - cacheJobPromise.reject(errorData) - } - }) + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys + * @returns {string[]} + */ + async keys () { + webidl.brandCheck(this, CacheStorage) - return cacheJobPromise.promise + // 2.1 + const keys = this.#caches.keys() + + // 2.2 + return [...keys] } +} - async delete (request, options = {}) { - webidl.brandCheck(this, Cache) - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.delete' }) +Object.defineProperties(CacheStorage.prototype, { + [Symbol.toStringTag]: { + value: 'CacheStorage', + configurable: true + }, + match: kEnumerableProperty, + has: kEnumerableProperty, + open: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty +}) - request = webidl.converters.RequestInfo(request) - options = webidl.converters.CacheQueryOptions(options) +module.exports = { + CacheStorage +} - /** - * @type {Request} - */ - let r = null - if (request instanceof Request) { - r = request[kState] +/***/ }), - if (r.method !== 'GET' && !options.ignoreMethod) { - return false - } - } else { - assert(typeof request === 'string') +/***/ 29174: +/***/ ((module) => { - r = new Request(request)[kState] - } +"use strict"; - /** @type {CacheBatchOperation[]} */ - const operations = [] - /** @type {CacheBatchOperation} */ - const operation = { - type: 'delete', - request: r, - options - } +module.exports = { + kConstruct: Symbol('constructable') +} - operations.push(operation) - const cacheJobPromise = createDeferredPromise() +/***/ }), - let errorData = null - let requestResponses +/***/ 82396: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - try { - requestResponses = this.#batchCacheOperations(operations) - } catch (e) { - errorData = e - } +"use strict"; - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(!!requestResponses?.length) - } else { - cacheJobPromise.reject(errorData) - } - }) - return cacheJobPromise.promise - } +const assert = __nccwpck_require__(39491) +const { URLSerializer } = __nccwpck_require__(685) +const { isValidHeaderName } = __nccwpck_require__(52538) - /** - * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys - * @param {any} request - * @param {import('../../types/cache').CacheQueryOptions} options - * @returns {readonly Request[]} - */ - async keys (request = undefined, options = {}) { - webidl.brandCheck(this, Cache) +/** + * @see https://url.spec.whatwg.org/#concept-url-equals + * @param {URL} A + * @param {URL} B + * @param {boolean | undefined} excludeFragment + * @returns {boolean} + */ +function urlEquals (A, B, excludeFragment = false) { + const serializedA = URLSerializer(A, excludeFragment) - if (request !== undefined) request = webidl.converters.RequestInfo(request) - options = webidl.converters.CacheQueryOptions(options) + const serializedB = URLSerializer(B, excludeFragment) - // 1. - let r = null + return serializedA === serializedB +} - // 2. - if (request !== undefined) { - // 2.1 - if (request instanceof Request) { - // 2.1.1 - r = request[kState] +/** + * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262 + * @param {string} header + */ +function fieldValues (header) { + assert(header !== null) - // 2.1.2 - if (r.method !== 'GET' && !options.ignoreMethod) { - return [] - } - } else if (typeof request === 'string') { // 2.2 - r = new Request(request)[kState] - } + const values = [] + + for (let value of header.split(',')) { + value = value.trim() + + if (!value.length) { + continue + } else if (!isValidHeaderName(value)) { + continue } - // 4. - const promise = createDeferredPromise() + values.push(value) + } - // 5. - // 5.1 - const requests = [] + return values +} - // 5.2 - if (request === undefined) { - // 5.2.1 - for (const requestResponse of this.#relevantRequestResponseList) { - // 5.2.1.1 - requests.push(requestResponse[0]) - } - } else { // 5.3 - // 5.3.1 - const requestResponses = this.#queryCache(r, options) +module.exports = { + urlEquals, + fieldValues +} - // 5.3.2 - for (const requestResponse of requestResponses) { - // 5.3.2.1 - requests.push(requestResponse[0]) - } - } - // 5.4 - queueMicrotask(() => { - // 5.4.1 - const requestList = [] +/***/ }), - // 5.4.2 - for (const request of requests) { - const requestObject = new Request('https://a') - requestObject[kState] = request - requestObject[kHeaders][kHeadersList] = request.headersList - requestObject[kHeaders][kGuard] = 'immutable' - requestObject[kRealm] = request.client +/***/ 33598: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 5.4.2.1 - requestList.push(requestObject) - } +"use strict"; +// @ts-check + + + +/* global WebAssembly */ + +const assert = __nccwpck_require__(39491) +const net = __nccwpck_require__(41808) +const http = __nccwpck_require__(13685) +const { pipeline } = __nccwpck_require__(12781) +const util = __nccwpck_require__(83983) +const timers = __nccwpck_require__(29459) +const Request = __nccwpck_require__(62905) +const DispatcherBase = __nccwpck_require__(74839) +const { + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + InvalidArgumentError, + RequestAbortedError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError, + ClientDestroyedError +} = __nccwpck_require__(48045) +const buildConnector = __nccwpck_require__(82067) +const { + kUrl, + kReset, + kServerName, + kClient, + kBusy, + kParser, + kConnect, + kBlocking, + kResuming, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize, + kHTTPConnVersion, + // HTTP2 + kHost, + kHTTP2Session, + kHTTP2SessionState, + kHTTP2BuildRequest, + kHTTP2CopyHeaders, + kHTTP1BuildRequest +} = __nccwpck_require__(72785) - // 5.4.3 - promise.resolve(Object.freeze(requestList)) - }) +/** @type {import('http2')} */ +let http2 +try { + http2 = __nccwpck_require__(85158) +} catch { + // @ts-ignore + http2 = { constants: {} } +} - return promise.promise +const { + constants: { + HTTP2_HEADER_AUTHORITY, + HTTP2_HEADER_METHOD, + HTTP2_HEADER_PATH, + HTTP2_HEADER_SCHEME, + HTTP2_HEADER_CONTENT_LENGTH, + HTTP2_HEADER_EXPECT, + HTTP2_HEADER_STATUS } +} = http2 - /** - * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm - * @param {CacheBatchOperation[]} operations - * @returns {requestResponseList} - */ - #batchCacheOperations (operations) { - // 1. - const cache = this.#relevantRequestResponseList - - // 2. - const backupCache = [...cache] - - // 3. - const addedItems = [] - - // 4.1 - const resultList = [] - - try { - // 4.2 - for (const operation of operations) { - // 4.2.1 - if (operation.type !== 'delete' && operation.type !== 'put') { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'operation type does not match "delete" or "put"' - }) - } - - // 4.2.2 - if (operation.type === 'delete' && operation.response != null) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'delete operation should not have an associated response' - }) - } - - // 4.2.3 - if (this.#queryCache(operation.request, operation.options, addedItems).length) { - throw new DOMException('???', 'InvalidStateError') - } - - // 4.2.4 - let requestResponses - - // 4.2.5 - if (operation.type === 'delete') { - // 4.2.5.1 - requestResponses = this.#queryCache(operation.request, operation.options) - - // TODO: the spec is wrong, this is needed to pass WPTs - if (requestResponses.length === 0) { - return [] - } - - // 4.2.5.2 - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse) - assert(idx !== -1) - - // 4.2.5.2.1 - cache.splice(idx, 1) - } - } else if (operation.type === 'put') { // 4.2.6 - // 4.2.6.1 - if (operation.response == null) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'put operation should have an associated response' - }) - } +// Experimental +let h2ExperimentalWarned = false - // 4.2.6.2 - const r = operation.request +const FastBuffer = Buffer[Symbol.species] - // 4.2.6.3 - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'expected http or https scheme' - }) - } +const kClosedResolve = Symbol('kClosedResolve') - // 4.2.6.4 - if (r.method !== 'GET') { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'not get method' - }) - } +const channels = {} - // 4.2.6.5 - if (operation.options != null) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'options must not be defined' - }) - } +try { + const diagnosticsChannel = __nccwpck_require__(67643) + channels.sendHeaders = diagnosticsChannel.channel('undici:client:sendHeaders') + channels.beforeConnect = diagnosticsChannel.channel('undici:client:beforeConnect') + channels.connectError = diagnosticsChannel.channel('undici:client:connectError') + channels.connected = diagnosticsChannel.channel('undici:client:connected') +} catch { + channels.sendHeaders = { hasSubscribers: false } + channels.beforeConnect = { hasSubscribers: false } + channels.connectError = { hasSubscribers: false } + channels.connected = { hasSubscribers: false } +} - // 4.2.6.6 - requestResponses = this.#queryCache(operation.request) +/** + * @type {import('../types/client').default} + */ +class Client extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../types/client').Client.Options} options + */ + constructor (url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + maxRedirections, + connect, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + // h2 + allowH2, + maxConcurrentStreams + } = {}) { + super() - // 4.2.6.7 - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse) - assert(idx !== -1) + if (keepAlive !== undefined) { + throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') + } - // 4.2.6.7.1 - cache.splice(idx, 1) - } + if (socketTimeout !== undefined) { + throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') + } - // 4.2.6.8 - cache.push([operation.request, operation.response]) + if (requestTimeout !== undefined) { + throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') + } - // 4.2.6.10 - addedItems.push([operation.request, operation.response]) - } + if (idleTimeout !== undefined) { + throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') + } - // 4.2.7 - resultList.push([operation.request, operation.response]) - } + if (maxKeepAliveTimeout !== undefined) { + throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') + } - // 4.3 - return resultList - } catch (e) { // 5. - // 5.1 - this.#relevantRequestResponseList.length = 0 + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError('invalid maxHeaderSize') + } - // 5.2 - this.#relevantRequestResponseList = backupCache + if (socketPath != null && typeof socketPath !== 'string') { + throw new InvalidArgumentError('invalid socketPath') + } - // 5.3 - throw e + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError('invalid connectTimeout') } - } - /** - * @see https://w3c.github.io/ServiceWorker/#query-cache - * @param {any} requestQuery - * @param {import('../../types/cache').CacheQueryOptions} options - * @param {requestResponseList} targetStorage - * @returns {requestResponseList} - */ - #queryCache (requestQuery, options, targetStorage) { - /** @type {requestResponseList} */ - const resultList = [] + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveTimeout') + } - const storage = targetStorage ?? this.#relevantRequestResponseList + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveMaxTimeout') + } - for (const requestResponse of storage) { - const [cachedRequest, cachedResponse] = requestResponse - if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { - resultList.push(requestResponse) - } + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') } - return resultList - } + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') + } - /** - * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm - * @param {any} requestQuery - * @param {any} request - * @param {any | null} response - * @param {import('../../types/cache').CacheQueryOptions | undefined} options - * @returns {boolean} - */ - #requestMatchesCachedItem (requestQuery, request, response = null, options) { - // if (options?.ignoreMethod === false && request.method === 'GET') { - // return false - // } + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') + } - const queryURL = new URL(requestQuery.url) + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } - const cachedURL = new URL(request.url) + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } - if (options?.ignoreSearch) { - cachedURL.search = '' + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') + } - queryURL.search = '' + if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError('localAddress must be valid string IP address') } - if (!urlEquals(queryURL, cachedURL, true)) { - return false + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError('maxResponseSize must be a positive number') } if ( - response == null || - options?.ignoreVary || - !response.headersList.contains('vary') + autoSelectFamilyAttemptTimeout != null && + (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1) ) { - return true + throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number') } - const fieldValues = getFieldValues(response.headersList.get('vary')) - - for (const fieldValue of fieldValues) { - if (fieldValue === '*') { - return false - } - - const requestValue = request.headersList.get(fieldValue) - const queryValue = requestQuery.headersList.get(fieldValue) + // h2 + if (allowH2 != null && typeof allowH2 !== 'boolean') { + throw new InvalidArgumentError('allowH2 must be a valid boolean value') + } - // If one has the header and the other doesn't, or one has - // a different value than the other, return false - if (requestValue !== queryValue) { - return false - } + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError('maxConcurrentStreams must be a possitive integer, greater than 0') } - return true - } -} + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect + }) + } -Object.defineProperties(Cache.prototype, { - [Symbol.toStringTag]: { - value: 'Cache', - configurable: true - }, - match: kEnumerableProperty, - matchAll: kEnumerableProperty, - add: kEnumerableProperty, - addAll: kEnumerableProperty, - put: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty -}) + this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) + ? interceptors.Client + : [createRedirectInterceptor({ maxRedirections })] + this[kUrl] = util.parseOrigin(url) + this[kConnector] = connect + this[kSocket] = null + this[kPipelining] = pipelining != null ? pipelining : 1 + this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout] + this[kServerName] = null + this[kLocalAddress] = localAddress != null ? localAddress : null + this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming + this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n` + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3 + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3 + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength + this[kMaxRedirections] = maxRedirections + this[kMaxRequests] = maxRequestsPerClient + this[kClosedResolve] = null + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1 + this[kHTTPConnVersion] = 'h1' -const cacheQueryOptionConverters = [ - { - key: 'ignoreSearch', - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: 'ignoreMethod', - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: 'ignoreVary', - converter: webidl.converters.boolean, - defaultValue: false - } -] + // HTTP/2 + this[kHTTP2Session] = null + this[kHTTP2SessionState] = !allowH2 + ? null + : { + // streams: null, // Fixed queue of streams - For future support of `push` + openStreams: 0, // Keep track of them to decide wether or not unref the session + maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server + } + this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}` -webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters) + // kQueue is built up of 3 sections separated by + // the kRunningIdx and kPendingIdx indices. + // | complete | running | pending | + // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length + // kRunningIdx points to the first running element. + // kPendingIdx points to the first pending element. + // This implements a fast queue with an amortized + // time of O(1). -webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ - ...cacheQueryOptionConverters, - { - key: 'cacheName', - converter: webidl.converters.DOMString + this[kQueue] = [] + this[kRunningIdx] = 0 + this[kPendingIdx] = 0 } -]) -webidl.converters.Response = webidl.interfaceConverter(Response) + get pipelining () { + return this[kPipelining] + } -webidl.converters['sequence'] = webidl.sequenceConverter( - webidl.converters.RequestInfo -) + set pipelining (value) { + this[kPipelining] = value + resume(this, true) + } -module.exports = { - Cache -} + get [kPending] () { + return this[kQueue].length - this[kPendingIdx] + } + get [kRunning] () { + return this[kPendingIdx] - this[kRunningIdx] + } -/***/ }), + get [kSize] () { + return this[kQueue].length - this[kRunningIdx] + } -/***/ 37907: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + get [kConnected] () { + return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed + } -"use strict"; + get [kBusy] () { + const socket = this[kSocket] + return ( + (socket && (socket[kReset] || socket[kWriting] || socket[kBlocking])) || + (this[kSize] >= (this[kPipelining] || 1)) || + this[kPending] > 0 + ) + } + /* istanbul ignore: only used for test */ + [kConnect] (cb) { + connect(this) + this.once('connect', cb) + } -const { kConstruct } = __nccwpck_require__(29174) -const { Cache } = __nccwpck_require__(66101) -const { webidl } = __nccwpck_require__(21744) -const { kEnumerableProperty } = __nccwpck_require__(83983) + [kDispatch] (opts, handler) { + const origin = opts.origin || this[kUrl].origin -class CacheStorage { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map - * @type {Map { + if (!this[kSize]) { + resolve(null) + } else { + this[kClosedResolve] = resolve + } + }) + } - return await cache.match(request, options) + async [kDestroy] (err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + errorRequest(this, request, err) } - } else { // 2. - // 2.2 - for (const cacheList of this.#caches.values()) { - const cache = new Cache(kConstruct, cacheList) - - // 2.2.1.2 - const response = await cache.match(request, options) - if (response !== undefined) { - return response + const callback = () => { + if (this[kClosedResolve]) { + // TODO (fix): Should we error here with ClientDestroyedError? + this[kClosedResolve]() + this[kClosedResolve] = null } + resolve() } - } - } - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-has - * @param {string} cacheName - * @returns {Promise} - */ - async has (cacheName) { - webidl.brandCheck(this, CacheStorage) - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.has' }) + if (this[kHTTP2Session] != null) { + util.destroy(this[kHTTP2Session], err) + this[kHTTP2Session] = null + this[kHTTP2SessionState] = null + } - cacheName = webidl.converters.DOMString(cacheName) + if (!this[kSocket]) { + queueMicrotask(callback) + } else { + util.destroy(this[kSocket].on('close', callback), err) + } - // 2.1.1 - // 2.2 - return this.#caches.has(cacheName) + resume(this) + }) } +} - /** - * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open - * @param {string} cacheName - * @returns {Promise} - */ - async open (cacheName) { - webidl.brandCheck(this, CacheStorage) - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.open' }) +function onHttp2SessionError (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - cacheName = webidl.converters.DOMString(cacheName) + this[kSocket][kError] = err - // 2.1 - if (this.#caches.has(cacheName)) { - // await caches.open('v1') !== await caches.open('v1') + onError(this[kClient], err) +} - // 2.1.1 - const cache = this.#caches.get(cacheName) +function onHttp2FrameError (type, code, id) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`) - // 2.1.1.1 - return new Cache(kConstruct, cache) - } + if (id === 0) { + this[kSocket][kError] = err + onError(this[kClient], err) + } +} - // 2.2 - const cache = [] +function onHttp2SessionEnd () { + util.destroy(this, new SocketError('other side closed')) + util.destroy(this[kSocket], new SocketError('other side closed')) +} - // 2.3 - this.#caches.set(cacheName, cache) +function onHTTP2GoAway (code) { + const client = this[kClient] + const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`) + client[kSocket] = null + client[kHTTP2Session] = null - // 2.4 - return new Cache(kConstruct, cache) + if (client.destroyed) { + assert(this[kPending] === 0) + + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + errorRequest(this, request, err) + } + } else if (client[kRunning] > 0) { + // Fail head of pipeline. + const request = client[kQueue][client[kRunningIdx]] + client[kQueue][client[kRunningIdx]++] = null + + errorRequest(client, request, err) } - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete - * @param {string} cacheName - * @returns {Promise} - */ - async delete (cacheName) { - webidl.brandCheck(this, CacheStorage) - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.delete' }) + client[kPendingIdx] = client[kRunningIdx] - cacheName = webidl.converters.DOMString(cacheName) + assert(client[kRunning] === 0) - return this.#caches.delete(cacheName) - } + client.emit('disconnect', + client[kUrl], + [client], + err + ) - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys - * @returns {string[]} - */ - async keys () { - webidl.brandCheck(this, CacheStorage) + resume(client) +} - // 2.1 - const keys = this.#caches.keys() +const constants = __nccwpck_require__(30953) +const createRedirectInterceptor = __nccwpck_require__(38861) +const EMPTY_BUF = Buffer.alloc(0) - // 2.2 - return [...keys] +async function lazyllhttp () { + const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(61145) : undefined + + let mod + try { + mod = await WebAssembly.compile(Buffer.from(__nccwpck_require__(95627), 'base64')) + } catch (e) { + /* istanbul ignore next */ + + // We could check if the error was caused by the simd option not + // being enabled, but the occurring of this other error + // * https://github.com/emscripten-core/emscripten/issues/11495 + // got me to remove that check to avoid breaking Node 12. + mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || __nccwpck_require__(61145), 'base64')) } -} -Object.defineProperties(CacheStorage.prototype, { - [Symbol.toStringTag]: { - value: 'CacheStorage', - configurable: true - }, - match: kEnumerableProperty, - has: kEnumerableProperty, - open: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty -}) + return await WebAssembly.instantiate(mod, { + env: { + /* eslint-disable camelcase */ -module.exports = { - CacheStorage + wasm_on_url: (p, at, len) => { + /* istanbul ignore next */ + return 0 + }, + wasm_on_status: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_begin: (p) => { + assert.strictEqual(currentParser.ptr, p) + return currentParser.onMessageBegin() || 0 + }, + wasm_on_header_field: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_header_value: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert.strictEqual(currentParser.ptr, p) + return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 + }, + wasm_on_body: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_complete: (p) => { + assert.strictEqual(currentParser.ptr, p) + return currentParser.onMessageComplete() || 0 + } + + /* eslint-enable camelcase */ + } + }) } +let llhttpInstance = null +let llhttpPromise = lazyllhttp() +llhttpPromise.catch() -/***/ }), +let currentParser = null +let currentBufferRef = null +let currentBufferSize = 0 +let currentBufferPtr = null -/***/ 29174: -/***/ ((module) => { +const TIMEOUT_HEADERS = 1 +const TIMEOUT_BODY = 2 +const TIMEOUT_IDLE = 3 -"use strict"; +class Parser { + constructor (client, socket, { exports }) { + assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0) + this.llhttp = exports + this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE) + this.client = client + this.socket = socket + this.timeout = null + this.timeoutValue = null + this.timeoutType = null + this.statusCode = null + this.statusText = '' + this.upgrade = false + this.headers = [] + this.headersSize = 0 + this.headersMaxSize = client[kMaxHeadersSize] + this.shouldKeepAlive = false + this.paused = false + this.resume = this.resume.bind(this) -module.exports = { - kConstruct: Symbol('constructable') -} + this.bytesRead = 0 + this.keepAlive = '' + this.contentLength = '' + this.connection = '' + this.maxResponseSize = client[kMaxResponseSize] + } -/***/ }), + setTimeout (value, type) { + this.timeoutType = type + if (value !== this.timeoutValue) { + timers.clearTimeout(this.timeout) + if (value) { + this.timeout = timers.setTimeout(onParserTimeout, value, this) + // istanbul ignore else: only for jest + if (this.timeout.unref) { + this.timeout.unref() + } + } else { + this.timeout = null + } + this.timeoutValue = value + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() + } + } + } -/***/ 82396: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + resume () { + if (this.socket.destroyed || !this.paused) { + return + } -"use strict"; + assert(this.ptr != null) + assert(currentParser == null) + this.llhttp.llhttp_resume(this.ptr) -const assert = __nccwpck_require__(39491) -const { URLSerializer } = __nccwpck_require__(685) -const { isValidHeaderName } = __nccwpck_require__(52538) + assert(this.timeoutType === TIMEOUT_BODY) + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() + } + } -/** - * @see https://url.spec.whatwg.org/#concept-url-equals - * @param {URL} A - * @param {URL} B - * @param {boolean | undefined} excludeFragment - * @returns {boolean} - */ -function urlEquals (A, B, excludeFragment = false) { - const serializedA = URLSerializer(A, excludeFragment) + this.paused = false + this.execute(this.socket.read() || EMPTY_BUF) // Flush parser. + this.readMore() + } - const serializedB = URLSerializer(B, excludeFragment) + readMore () { + while (!this.paused && this.ptr) { + const chunk = this.socket.read() + if (chunk === null) { + break + } + this.execute(chunk) + } + } - return serializedA === serializedB -} + execute (data) { + assert(this.ptr != null) + assert(currentParser == null) + assert(!this.paused) -/** - * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262 - * @param {string} header - */ -function fieldValues (header) { - assert(header !== null) + const { socket, llhttp } = this - const values = [] + if (data.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr) + } + currentBufferSize = Math.ceil(data.length / 4096) * 4096 + currentBufferPtr = llhttp.malloc(currentBufferSize) + } - for (let value of header.split(',')) { - value = value.trim() + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data) - if (!value.length) { - continue - } else if (!isValidHeaderName(value)) { - continue - } + // Call `execute` on the wasm parser. + // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, + // and finally the length of bytes to parse. + // The return value is an error code or `constants.ERROR.OK`. + try { + let ret - values.push(value) + try { + currentBufferRef = data + currentParser = this + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length) + /* eslint-disable-next-line no-useless-catch */ + } catch (err) { + /* istanbul ignore next: difficult to make a test case for */ + throw err + } finally { + currentParser = null + currentBufferRef = null + } + + const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr + + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data.slice(offset)) + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true + socket.unshift(data.slice(offset)) + } else if (ret !== constants.ERROR.OK) { + const ptr = llhttp.llhttp_get_error_reason(this.ptr) + let message = '' + /* istanbul ignore else: difficult to make a test case for */ + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) + message = + 'Response does not match the HTTP/1.1 protocol (' + + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + + ')' + } + throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) + } + } catch (err) { + util.destroy(socket, err) + } } - return values -} + destroy () { + assert(this.ptr != null) + assert(currentParser == null) -module.exports = { - urlEquals, - fieldValues -} + this.llhttp.llhttp_free(this.ptr) + this.ptr = null + timers.clearTimeout(this.timeout) + this.timeout = null + this.timeoutValue = null + this.timeoutType = null -/***/ }), + this.paused = false + } -/***/ 33598: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + onStatus (buf) { + this.statusText = buf.toString() + } -"use strict"; -// @ts-check + onMessageBegin () { + const { socket, client } = this + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 + } + const request = client[kQueue][client[kRunningIdx]] + if (!request) { + return -1 + } + } -/* global WebAssembly */ + onHeaderField (buf) { + const len = this.headers.length -const assert = __nccwpck_require__(39491) -const net = __nccwpck_require__(41808) -const http = __nccwpck_require__(13685) -const { pipeline } = __nccwpck_require__(12781) -const util = __nccwpck_require__(83983) -const timers = __nccwpck_require__(29459) -const Request = __nccwpck_require__(62905) -const DispatcherBase = __nccwpck_require__(74839) -const { - RequestContentLengthMismatchError, - ResponseContentLengthMismatchError, - InvalidArgumentError, - RequestAbortedError, - HeadersTimeoutError, - HeadersOverflowError, - SocketError, - InformationalError, - BodyTimeoutError, - HTTPParserError, - ResponseExceededMaxSizeError, - ClientDestroyedError -} = __nccwpck_require__(48045) -const buildConnector = __nccwpck_require__(82067) -const { - kUrl, - kReset, - kServerName, - kClient, - kBusy, - kParser, - kConnect, - kBlocking, - kResuming, - kRunning, - kPending, - kSize, - kWriting, - kQueue, - kConnected, - kConnecting, - kNeedDrain, - kNoRef, - kKeepAliveDefaultTimeout, - kHostHeader, - kPendingIdx, - kRunningIdx, - kError, - kPipelining, - kSocket, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, - kStrictContentLength, - kConnector, - kMaxRedirections, - kMaxRequests, - kCounter, - kClose, - kDestroy, - kDispatch, - kInterceptors, - kLocalAddress, - kMaxResponseSize, - kHTTPConnVersion, - // HTTP2 - kHost, - kHTTP2Session, - kHTTP2SessionState, - kHTTP2BuildRequest, - kHTTP2CopyHeaders, - kHTTP1BuildRequest -} = __nccwpck_require__(72785) + if ((len & 1) === 0) { + this.headers.push(buf) + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) + } + + this.trackHeader(buf.length) + } -/** @type {import('http2')} */ -let http2 -try { - http2 = __nccwpck_require__(85158) -} catch { - // @ts-ignore - http2 = { constants: {} } -} + onHeaderValue (buf) { + let len = this.headers.length -const { - constants: { - HTTP2_HEADER_AUTHORITY, - HTTP2_HEADER_METHOD, - HTTP2_HEADER_PATH, - HTTP2_HEADER_SCHEME, - HTTP2_HEADER_CONTENT_LENGTH, - HTTP2_HEADER_EXPECT, - HTTP2_HEADER_STATUS + if ((len & 1) === 1) { + this.headers.push(buf) + len += 1 + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) + } + + const key = this.headers[len - 2] + if (key.length === 10 && key.toString().toLowerCase() === 'keep-alive') { + this.keepAlive += buf.toString() + } else if (key.length === 10 && key.toString().toLowerCase() === 'connection') { + this.connection += buf.toString() + } else if (key.length === 14 && key.toString().toLowerCase() === 'content-length') { + this.contentLength += buf.toString() + } + + this.trackHeader(buf.length) } -} = http2 -// Experimental -let h2ExperimentalWarned = false + trackHeader (len) { + this.headersSize += len + if (this.headersSize >= this.headersMaxSize) { + util.destroy(this.socket, new HeadersOverflowError()) + } + } -const FastBuffer = Buffer[Symbol.species] + onUpgrade (head) { + const { upgrade, client, socket, headers, statusCode } = this -const kClosedResolve = Symbol('kClosedResolve') + assert(upgrade) -const channels = {} + const request = client[kQueue][client[kRunningIdx]] + assert(request) -try { - const diagnosticsChannel = __nccwpck_require__(67643) - channels.sendHeaders = diagnosticsChannel.channel('undici:client:sendHeaders') - channels.beforeConnect = diagnosticsChannel.channel('undici:client:beforeConnect') - channels.connectError = diagnosticsChannel.channel('undici:client:connectError') - channels.connected = diagnosticsChannel.channel('undici:client:connected') -} catch { - channels.sendHeaders = { hasSubscribers: false } - channels.beforeConnect = { hasSubscribers: false } - channels.connectError = { hasSubscribers: false } - channels.connected = { hasSubscribers: false } -} + assert(!socket.destroyed) + assert(socket === client[kSocket]) + assert(!this.paused) + assert(request.upgrade || request.method === 'CONNECT') -/** - * @type {import('../types/client').default} - */ -class Client extends DispatcherBase { - /** - * - * @param {string|URL} url - * @param {import('../types/client').Client.Options} options - */ - constructor (url, { - interceptors, - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - maxRedirections, - connect, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - // h2 - allowH2, - maxConcurrentStreams - } = {}) { - super() + this.statusCode = null + this.statusText = '' + this.shouldKeepAlive = null - if (keepAlive !== undefined) { - throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') - } + assert(this.headers.length % 2 === 0) + this.headers = [] + this.headersSize = 0 - if (socketTimeout !== undefined) { - throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') - } + socket.unshift(head) - if (requestTimeout !== undefined) { - throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') - } + socket[kParser].destroy() + socket[kParser] = null - if (idleTimeout !== undefined) { - throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') - } + socket[kClient] = null + socket[kError] = null + socket + .removeListener('error', onSocketError) + .removeListener('readable', onSocketReadable) + .removeListener('end', onSocketEnd) + .removeListener('close', onSocketClose) - if (maxKeepAliveTimeout !== undefined) { - throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') - } + client[kSocket] = null + client[kQueue][client[kRunningIdx]++] = null + client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')) - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError('invalid maxHeaderSize') + try { + request.onUpgrade(statusCode, headers, socket) + } catch (err) { + util.destroy(socket, err) } - if (socketPath != null && typeof socketPath !== 'string') { - throw new InvalidArgumentError('invalid socketPath') - } + resume(client) + } - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError('invalid connectTimeout') - } + onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { + const { client, socket, headers, statusText } = this - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError('invalid keepAliveTimeout') + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 } - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError('invalid keepAliveMaxTimeout') - } + const request = client[kQueue][client[kRunningIdx]] - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') + /* istanbul ignore next: difficult to make a test case for */ + if (!request) { + return -1 } - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') + assert(!this.upgrade) + assert(this.statusCode < 200) + + if (statusCode === 100) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) + return -1 } - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') + /* this can only happen if server is misbehaving */ + if (upgrade && !request.upgrade) { + util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))) + return -1 } - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') + assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS) + + this.statusCode = statusCode + this.shouldKeepAlive = ( + shouldKeepAlive || + // Override llhttp value which does not allow keepAlive for HEAD. + (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive') + ) + + if (this.statusCode >= 200) { + const bodyTimeout = request.bodyTimeout != null + ? request.bodyTimeout + : client[kBodyTimeout] + this.setTimeout(bodyTimeout, TIMEOUT_BODY) + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() + } } - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError('maxRedirections must be a positive number') + if (request.method === 'CONNECT') { + assert(client[kRunning] === 1) + this.upgrade = true + return 2 } - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') + if (upgrade) { + assert(client[kRunning] === 1) + this.upgrade = true + return 2 } - if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError('localAddress must be valid string IP address') + assert(this.headers.length % 2 === 0) + this.headers = [] + this.headersSize = 0 + + if (this.shouldKeepAlive && client[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null + + if (keepAliveTimeout != null) { + const timeout = Math.min( + keepAliveTimeout - client[kKeepAliveTimeoutThreshold], + client[kKeepAliveMaxTimeout] + ) + if (timeout <= 0) { + socket[kReset] = true + } else { + client[kKeepAliveTimeoutValue] = timeout + } + } else { + client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout] + } + } else { + // Stop more requests from being dispatched. + socket[kReset] = true } - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError('maxResponseSize must be a positive number') + let pause + try { + pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false + } catch (err) { + util.destroy(socket, err) + return -1 } - if ( - autoSelectFamilyAttemptTimeout != null && - (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1) - ) { - throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number') + if (request.method === 'HEAD') { + return 1 } - // h2 - if (allowH2 != null && typeof allowH2 !== 'boolean') { - throw new InvalidArgumentError('allowH2 must be a valid boolean value') + if (statusCode < 200) { + return 1 } - if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) { - throw new InvalidArgumentError('maxConcurrentStreams must be a possitive integer, greater than 0') + if (socket[kBlocking]) { + socket[kBlocking] = false + resume(client) } - if (typeof connect !== 'function') { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), - ...connect - }) + return pause ? constants.ERROR.PAUSED : 0 + } + + onBody (buf) { + const { client, socket, statusCode, maxResponseSize } = this + + if (socket.destroyed) { + return -1 } - this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) - ? interceptors.Client - : [createRedirectInterceptor({ maxRedirections })] - this[kUrl] = util.parseOrigin(url) - this[kConnector] = connect - this[kSocket] = null - this[kPipelining] = pipelining != null ? pipelining : 1 - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout] - this[kServerName] = null - this[kLocalAddress] = localAddress != null ? localAddress : null - this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming - this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n` - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3 - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3 - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength - this[kMaxRedirections] = maxRedirections - this[kMaxRequests] = maxRequestsPerClient - this[kClosedResolve] = null - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1 - this[kHTTPConnVersion] = 'h1' + const request = client[kQueue][client[kRunningIdx]] + assert(request) - // HTTP/2 - this[kHTTP2Session] = null - this[kHTTP2SessionState] = !allowH2 - ? null - : { - // streams: null, // Fixed queue of streams - For future support of `push` - openStreams: 0, // Keep track of them to decide wether or not unref the session - maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server - } - this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}` + assert.strictEqual(this.timeoutType, TIMEOUT_BODY) + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() + } + } - // kQueue is built up of 3 sections separated by - // the kRunningIdx and kPendingIdx indices. - // | complete | running | pending | - // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length - // kRunningIdx points to the first running element. - // kPendingIdx points to the first pending element. - // This implements a fast queue with an amortized - // time of O(1). + assert(statusCode >= 200) - this[kQueue] = [] - this[kRunningIdx] = 0 - this[kPendingIdx] = 0 - } + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util.destroy(socket, new ResponseExceededMaxSizeError()) + return -1 + } - get pipelining () { - return this[kPipelining] - } + this.bytesRead += buf.length - set pipelining (value) { - this[kPipelining] = value - resume(this, true) + try { + if (request.onData(buf) === false) { + return constants.ERROR.PAUSED + } + } catch (err) { + util.destroy(socket, err) + return -1 + } } - get [kPending] () { - return this[kQueue].length - this[kPendingIdx] - } + onMessageComplete () { + const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this - get [kRunning] () { - return this[kPendingIdx] - this[kRunningIdx] - } + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1 + } - get [kSize] () { - return this[kQueue].length - this[kRunningIdx] - } + if (upgrade) { + return + } - get [kConnected] () { - return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed - } + const request = client[kQueue][client[kRunningIdx]] + assert(request) - get [kBusy] () { - const socket = this[kSocket] - return ( - (socket && (socket[kReset] || socket[kWriting] || socket[kBlocking])) || - (this[kSize] >= (this[kPipelining] || 1)) || - this[kPending] > 0 - ) - } + assert(statusCode >= 100) - /* istanbul ignore: only used for test */ - [kConnect] (cb) { - connect(this) - this.once('connect', cb) - } + this.statusCode = null + this.statusText = '' + this.bytesRead = 0 + this.contentLength = '' + this.keepAlive = '' + this.connection = '' - [kDispatch] (opts, handler) { - const origin = opts.origin || this[kUrl].origin + assert(this.headers.length % 2 === 0) + this.headers = [] + this.headersSize = 0 - const request = this[kHTTPConnVersion] === 'h2' - ? Request[kHTTP2BuildRequest](origin, opts, handler) - : Request[kHTTP1BuildRequest](origin, opts, handler) + if (statusCode < 200) { + return + } - this[kQueue].push(request) - if (this[kResuming]) { - // Do nothing. - } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { - // Wait a tick in case stream/iterator is ended in the same tick. - this[kResuming] = 1 - process.nextTick(resume, this) - } else { - resume(this, true) + /* istanbul ignore next: should be handled by llhttp? */ + if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util.destroy(socket, new ResponseContentLengthMismatchError()) + return -1 } - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2 + try { + request.onComplete(headers) + } catch (err) { + errorRequest(client, request, err) } - return this[kNeedDrain] < 2 - } + client[kQueue][client[kRunningIdx]++] = null - async [kClose] () { - // TODO: for H2 we need to gracefully flush the remaining enqueued - // request and close each stream. - return new Promise((resolve) => { - if (!this[kSize]) { - resolve(null) - } else { - this[kClosedResolve] = resolve - } - }) + if (socket[kWriting]) { + assert.strictEqual(client[kRunning], 0) + // Response completed before request. + util.destroy(socket, new InformationalError('reset')) + return constants.ERROR.PAUSED + } else if (!shouldKeepAlive) { + util.destroy(socket, new InformationalError('reset')) + return constants.ERROR.PAUSED + } else if (socket[kReset] && client[kRunning] === 0) { + // Destroy socket once all requests have completed. + // The request at the tail of the pipeline is the one + // that requested reset and no further requests should + // have been queued since then. + util.destroy(socket, new InformationalError('reset')) + return constants.ERROR.PAUSED + } else if (client[kPipelining] === 1) { + // We must wait a full event loop cycle to reuse this socket to make sure + // that non-spec compliant servers are not closing the connection even if they + // said they won't. + setImmediate(resume, client) + } else { + resume(client) + } } +} - async [kDestroy] (err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - errorRequest(this, request, err) - } - - const callback = () => { - if (this[kClosedResolve]) { - // TODO (fix): Should we error here with ClientDestroyedError? - this[kClosedResolve]() - this[kClosedResolve] = null - } - resolve() - } - - if (this[kHTTP2Session] != null) { - util.destroy(this[kHTTP2Session], err) - this[kHTTP2Session] = null - this[kHTTP2SessionState] = null - } +function onParserTimeout (parser) { + const { socket, timeoutType, client } = parser - if (!this[kSocket]) { - queueMicrotask(callback) - } else { - util.destroy(this[kSocket].on('close', callback), err) - } + /* istanbul ignore else */ + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { + assert(!parser.paused, 'cannot be paused while waiting for headers') + util.destroy(socket, new HeadersTimeoutError()) + } + } else if (timeoutType === TIMEOUT_BODY) { + if (!parser.paused) { + util.destroy(socket, new BodyTimeoutError()) + } + } else if (timeoutType === TIMEOUT_IDLE) { + assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]) + util.destroy(socket, new InformationalError('socket idle timeout')) + } +} - resume(this) - }) +function onSocketReadable () { + const { [kParser]: parser } = this + if (parser) { + parser.readMore() } } -function onHttp2SessionError (err) { +function onSocketError (err) { + const { [kClient]: client, [kParser]: parser } = this + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - this[kSocket][kError] = err + if (client[kHTTPConnVersion] !== 'h2') { + // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded + // to the user. + if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so for as a valid response. + parser.onMessageComplete() + return + } + } + + this[kError] = err onError(this[kClient], err) } -function onHttp2FrameError (type, code, id) { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`) +function onError (client, err) { + if ( + client[kRunning] === 0 && + err.code !== 'UND_ERR_INFO' && + err.code !== 'UND_ERR_SOCKET' + ) { + // Error is not caused by running request and not a recoverable + // socket error. - if (id === 0) { - this[kSocket][kError] = err - onError(this[kClient], err) + assert(client[kPendingIdx] === client[kRunningIdx]) + + const requests = client[kQueue].splice(client[kRunningIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + errorRequest(client, request, err) + } + assert(client[kSize] === 0) } } -function onHttp2SessionEnd () { - util.destroy(this, new SocketError('other side closed')) - util.destroy(this[kSocket], new SocketError('other side closed')) +function onSocketEnd () { + const { [kParser]: parser, [kClient]: client } = this + + if (client[kHTTPConnVersion] !== 'h2') { + if (parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete() + return + } + } + + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) } -function onHTTP2GoAway (code) { - const client = this[kClient] - const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`) +function onSocketClose () { + const { [kClient]: client, [kParser]: parser } = this + + if (client[kHTTPConnVersion] === 'h1' && parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete() + } + + this[kParser].destroy() + this[kParser] = null + } + + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) + client[kSocket] = null - client[kHTTP2Session] = null if (client.destroyed) { - assert(this[kPending] === 0) + assert(client[kPending] === 0) // Fail entire queue. const requests = client[kQueue].splice(client[kRunningIdx]) for (let i = 0; i < requests.length; i++) { const request = requests[i] - errorRequest(this, request, err) + errorRequest(client, request, err) } - } else if (client[kRunning] > 0) { + } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { // Fail head of pipeline. const request = client[kQueue][client[kRunningIdx]] client[kQueue][client[kRunningIdx]++] = null @@ -72158,19097 +71952,20033 @@ function onHTTP2GoAway (code) { assert(client[kRunning] === 0) - client.emit('disconnect', - client[kUrl], - [client], - err - ) + client.emit('disconnect', client[kUrl], [client], err) resume(client) } -const constants = __nccwpck_require__(30953) -const createRedirectInterceptor = __nccwpck_require__(38861) -const EMPTY_BUF = Buffer.alloc(0) +async function connect (client) { + assert(!client[kConnecting]) + assert(!client[kSocket]) -async function lazyllhttp () { - const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(61145) : undefined + let { host, hostname, protocol, port } = client[kUrl] - let mod - try { - mod = await WebAssembly.compile(Buffer.from(__nccwpck_require__(95627), 'base64')) - } catch (e) { - /* istanbul ignore next */ + // Resolve ipv6 + if (hostname[0] === '[') { + const idx = hostname.indexOf(']') - // We could check if the error was caused by the simd option not - // being enabled, but the occurring of this other error - // * https://github.com/emscripten-core/emscripten/issues/11495 - // got me to remove that check to avoid breaking Node 12. - mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || __nccwpck_require__(61145), 'base64')) + assert(idx !== -1) + const ip = hostname.substr(1, idx - 1) + + assert(net.isIP(ip)) + hostname = ip } - return await WebAssembly.instantiate(mod, { - env: { - /* eslint-disable camelcase */ + client[kConnecting] = true - wasm_on_url: (p, at, len) => { - /* istanbul ignore next */ - return 0 - }, - wasm_on_status: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_message_begin: (p) => { - assert.strictEqual(currentParser.ptr, p) - return currentParser.onMessageBegin() || 0 - }, - wasm_on_header_field: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_header_value: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert.strictEqual(currentParser.ptr, p) - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 - }, - wasm_on_body: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + if (channels.beforeConnect.hasSubscribers) { + channels.beforeConnect.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] }, - wasm_on_message_complete: (p) => { - assert.strictEqual(currentParser.ptr, p) - return currentParser.onMessageComplete() || 0 + connector: client[kConnector] + }) + } + + try { + const socket = await new Promise((resolve, reject) => { + client[kConnector]({ + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, (err, socket) => { + if (err) { + reject(err) + } else { + resolve(socket) + } + }) + }) + + if (client.destroyed) { + util.destroy(socket.on('error', () => {}), new ClientDestroyedError()) + return + } + + client[kConnecting] = false + + assert(socket) + + const isH2 = socket.alpnProtocol === 'h2' + if (isH2) { + if (!h2ExperimentalWarned) { + h2ExperimentalWarned = true + process.emitWarning('H2 support is experimental, expect them to change at any time.', { + code: 'UNDICI-H2' + }) } - /* eslint-enable camelcase */ + const session = http2.connect(client[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams + }) + + client[kHTTPConnVersion] = 'h2' + session[kClient] = client + session[kSocket] = socket + session.on('error', onHttp2SessionError) + session.on('frameError', onHttp2FrameError) + session.on('end', onHttp2SessionEnd) + session.on('goaway', onHTTP2GoAway) + session.on('close', onSocketClose) + session.unref() + + client[kHTTP2Session] = session + socket[kHTTP2Session] = session + } else { + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise + llhttpPromise = null + } + + socket[kNoRef] = false + socket[kWriting] = false + socket[kReset] = false + socket[kBlocking] = false + socket[kParser] = new Parser(client, socket, llhttpInstance) } - }) -} -let llhttpInstance = null -let llhttpPromise = lazyllhttp() -llhttpPromise.catch() + socket[kCounter] = 0 + socket[kMaxRequests] = client[kMaxRequests] + socket[kClient] = client + socket[kError] = null -let currentParser = null -let currentBufferRef = null -let currentBufferSize = 0 -let currentBufferPtr = null + socket + .on('error', onSocketError) + .on('readable', onSocketReadable) + .on('end', onSocketEnd) + .on('close', onSocketClose) -const TIMEOUT_HEADERS = 1 -const TIMEOUT_BODY = 2 -const TIMEOUT_IDLE = 3 + client[kSocket] = socket -class Parser { - constructor (client, socket, { exports }) { - assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0) + if (channels.connected.hasSubscribers) { + channels.connected.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + socket + }) + } + client.emit('connect', client[kUrl], [client]) + } catch (err) { + if (client.destroyed) { + return + } - this.llhttp = exports - this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE) - this.client = client - this.socket = socket - this.timeout = null - this.timeoutValue = null - this.timeoutType = null - this.statusCode = null - this.statusText = '' - this.upgrade = false - this.headers = [] - this.headersSize = 0 - this.headersMaxSize = client[kMaxHeadersSize] - this.shouldKeepAlive = false - this.paused = false - this.resume = this.resume.bind(this) + client[kConnecting] = false - this.bytesRead = 0 + if (channels.connectError.hasSubscribers) { + channels.connectError.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + error: err + }) + } - this.keepAlive = '' - this.contentLength = '' - this.connection = '' - this.maxResponseSize = client[kMaxResponseSize] + if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { + assert(client[kRunning] === 0) + while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { + const request = client[kQueue][client[kPendingIdx]++] + errorRequest(client, request, err) + } + } else { + onError(client, err) + } + + client.emit('connectionError', client[kUrl], [client], err) } - setTimeout (value, type) { - this.timeoutType = type - if (value !== this.timeoutValue) { - timers.clearTimeout(this.timeout) - if (value) { - this.timeout = timers.setTimeout(onParserTimeout, value, this) - // istanbul ignore else: only for jest - if (this.timeout.unref) { - this.timeout.unref() + resume(client) +} + +function emitDrain (client) { + client[kNeedDrain] = 0 + client.emit('drain', client[kUrl], [client]) +} + +function resume (client, sync) { + if (client[kResuming] === 2) { + return + } + + client[kResuming] = 2 + + _resume(client, sync) + client[kResuming] = 0 + + if (client[kRunningIdx] > 256) { + client[kQueue].splice(0, client[kRunningIdx]) + client[kPendingIdx] -= client[kRunningIdx] + client[kRunningIdx] = 0 + } +} + +function _resume (client, sync) { + while (true) { + if (client.destroyed) { + assert(client[kPending] === 0) + return + } + + if (client[kClosedResolve] && !client[kSize]) { + client[kClosedResolve]() + client[kClosedResolve] = null + return + } + + const socket = client[kSocket] + + if (socket && !socket.destroyed && socket.alpnProtocol !== 'h2') { + if (client[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref() + socket[kNoRef] = true + } + } else if (socket[kNoRef] && socket.ref) { + socket.ref() + socket[kNoRef] = false + } + + if (client[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { + socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE) + } + } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request = client[kQueue][client[kRunningIdx]] + const headersTimeout = request.headersTimeout != null + ? request.headersTimeout + : client[kHeadersTimeout] + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS) } + } + } + + if (client[kBusy]) { + client[kNeedDrain] = 2 + } else if (client[kNeedDrain] === 2) { + if (sync) { + client[kNeedDrain] = 1 + process.nextTick(emitDrain, client) } else { - this.timeout = null + emitDrain(client) } - this.timeoutValue = value - } else if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() + continue + } + + if (client[kPending] === 0) { + return + } + + if (client[kRunning] >= (client[kPipelining] || 1)) { + return + } + + const request = client[kQueue][client[kPendingIdx]] + + if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) { + if (client[kRunning] > 0) { + return + } + + client[kServerName] = request.servername + + if (socket && socket.servername !== request.servername) { + util.destroy(socket, new InformationalError('servername changed')) + return } } - } - resume () { - if (this.socket.destroyed || !this.paused) { + if (client[kConnecting]) { + return + } + + if (!socket && !client[kHTTP2Session]) { + connect(client) + return + } + + if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return + } + + if (client[kRunning] > 0 && !request.idempotent) { + // Non-idempotent request cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return + } + + if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { + // Don't dispatch an upgrade until all preceding requests have completed. + // A misbehaving server might upgrade the connection before all pipelined + // request has completed. return } - assert(this.ptr != null) - assert(currentParser == null) + if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && + (util.isStream(request.body) || util.isAsyncIterable(request.body))) { + // Request with stream or iterator body can error while other requests + // are inflight and indirectly error those as well. + // Ensure this doesn't happen by waiting for inflight + // to complete before dispatching. + + // Request with stream or iterator body cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return + } + + if (!request.aborted && write(client, request)) { + client[kPendingIdx]++ + } else { + client[kQueue].splice(client[kPendingIdx], 1) + } + } +} + +// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 +function shouldSendContentLength (method) { + return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' +} + +function write (client, request) { + if (client[kHTTPConnVersion] === 'h2') { + writeH2(client, client[kHTTP2Session], request) + return + } + + const { body, method, path, host, upgrade, headers, blocking, reset } = request + + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 + + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. + + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' + ) + + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0) + } + + const bodyLength = util.bodyLength(body) - this.llhttp.llhttp_resume(this.ptr) + let contentLength = bodyLength - assert(this.timeoutType === TIMEOUT_BODY) - if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() - } - } + if (contentLength === null) { + contentLength = request.contentLength + } - this.paused = false - this.execute(this.socket.read() || EMPTY_BUF) // Flush parser. - this.readMore() + if (contentLength === 0 && !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. + + contentLength = null } - readMore () { - while (!this.paused && this.ptr) { - const chunk = this.socket.read() - if (chunk === null) { - break - } - this.execute(chunk) + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + errorRequest(client, request, new RequestContentLengthMismatchError()) + return false } - } - execute (data) { - assert(this.ptr != null) - assert(currentParser == null) - assert(!this.paused) + process.emitWarning(new RequestContentLengthMismatchError()) + } - const { socket, llhttp } = this + const socket = client[kSocket] - if (data.length > currentBufferSize) { - if (currentBufferPtr) { - llhttp.free(currentBufferPtr) + try { + request.onConnect((err) => { + if (request.aborted || request.completed) { + return } - currentBufferSize = Math.ceil(data.length / 4096) * 4096 - currentBufferPtr = llhttp.malloc(currentBufferSize) - } - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data) + errorRequest(client, request, err || new RequestAbortedError()) - // Call `execute` on the wasm parser. - // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, - // and finally the length of bytes to parse. - // The return value is an error code or `constants.ERROR.OK`. - try { - let ret + util.destroy(socket, new InformationalError('aborted')) + }) + } catch (err) { + errorRequest(client, request, err) + } - try { - currentBufferRef = data - currentParser = this - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length) - /* eslint-disable-next-line no-useless-catch */ - } catch (err) { - /* istanbul ignore next: difficult to make a test case for */ - throw err - } finally { - currentParser = null - currentBufferRef = null - } + if (request.aborted) { + return false + } - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr + if (method === 'HEAD') { + // https://github.com/mcollina/undici/issues/258 + // Close after a HEAD request to interop with misbehaving servers + // that may send a body in the response. - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)) - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true - socket.unshift(data.slice(offset)) - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr) - let message = '' - /* istanbul ignore else: difficult to make a test case for */ - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) - message = - 'Response does not match the HTTP/1.1 protocol (' + - Buffer.from(llhttp.memory.buffer, ptr, len).toString() + - ')' - } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) - } - } catch (err) { - util.destroy(socket, err) - } + socket[kReset] = true } - destroy () { - assert(this.ptr != null) - assert(currentParser == null) + if (upgrade || method === 'CONNECT') { + // On CONNECT or upgrade, block pipeline from dispatching further + // requests on this connection. - this.llhttp.llhttp_free(this.ptr) - this.ptr = null + socket[kReset] = true + } - timers.clearTimeout(this.timeout) - this.timeout = null - this.timeoutValue = null - this.timeoutType = null + if (reset != null) { + socket[kReset] = reset + } - this.paused = false + if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { + socket[kReset] = true } - onStatus (buf) { - this.statusText = buf.toString() + if (blocking) { + socket[kBlocking] = true } - onMessageBegin () { - const { socket, client } = this + let header = `${method} ${path} HTTP/1.1\r\n` - /* istanbul ignore next: difficult to make a test case for */ - if (socket.destroyed) { - return -1 - } + if (typeof host === 'string') { + header += `host: ${host}\r\n` + } else { + header += client[kHostHeader] + } - const request = client[kQueue][client[kRunningIdx]] - if (!request) { - return -1 - } + if (upgrade) { + header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n` + } else if (client[kPipelining] && !socket[kReset]) { + header += 'connection: keep-alive\r\n' + } else { + header += 'connection: close\r\n' } - onHeaderField (buf) { - const len = this.headers.length + if (headers) { + header += headers + } - if ((len & 1) === 0) { - this.headers.push(buf) + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request, headers: header, socket }) + } + + /* istanbul ignore else: assertion */ + if (!body || bodyLength === 0) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) + assert(contentLength === null, 'no body must not have content length') + socket.write(`${header}\r\n`, 'latin1') } + request.onRequestSent() + } else if (util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length') - this.trackHeader(buf.length) + socket.cork() + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') + socket.write(body) + socket.uncork() + request.onBodySent(body) + request.onRequestSent() + if (!expectsPayload) { + socket[kReset] = true + } + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }) + } else { + writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }) + } + } else if (util.isStream(body)) { + writeStream({ body, client, request, socket, contentLength, header, expectsPayload }) + } else if (util.isIterable(body)) { + writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }) + } else { + assert(false) } - onHeaderValue (buf) { - let len = this.headers.length + return true +} - if ((len & 1) === 1) { - this.headers.push(buf) - len += 1 - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) - } +function writeH2 (client, session, request) { + const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request - const key = this.headers[len - 2] - if (key.length === 10 && key.toString().toLowerCase() === 'keep-alive') { - this.keepAlive += buf.toString() - } else if (key.length === 10 && key.toString().toLowerCase() === 'connection') { - this.connection += buf.toString() - } else if (key.length === 14 && key.toString().toLowerCase() === 'content-length') { - this.contentLength += buf.toString() - } + let headers + if (typeof reqHeaders === 'string') headers = Request[kHTTP2CopyHeaders](reqHeaders.trim()) + else headers = reqHeaders - this.trackHeader(buf.length) + if (upgrade) { + errorRequest(client, request, new Error('Upgrade not supported for H2')) + return false } - trackHeader (len) { - this.headersSize += len - if (this.headersSize >= this.headersMaxSize) { - util.destroy(this.socket, new HeadersOverflowError()) + try { + // TODO(HTTP/2): Should we call onConnect immediately or on stream ready event? + request.onConnect((err) => { + if (request.aborted || request.completed) { + return + } + + errorRequest(client, request, err || new RequestAbortedError()) + }) + } catch (err) { + errorRequest(client, request, err) + } + + if (request.aborted) { + return false + } + + let stream + const h2State = client[kHTTP2SessionState] + + headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost] + headers[HTTP2_HEADER_METHOD] = method + + if (method === 'CONNECT') { + session.ref() + // we are already connected, streams are pending, first request + // will create a new stream. We trigger a request to create the stream and wait until + // `ready` event is triggered + // We disabled endStream to allow the user to write to the stream + stream = session.request(headers, { endStream: false, signal }) + + if (stream.id && !stream.pending) { + request.onUpgrade(null, null, stream) + ++h2State.openStreams + } else { + stream.once('ready', () => { + request.onUpgrade(null, null, stream) + ++h2State.openStreams + }) } + + stream.once('close', () => { + h2State.openStreams -= 1 + // TODO(HTTP/2): unref only if current streams count is 0 + if (h2State.openStreams === 0) session.unref() + }) + + return true } - onUpgrade (head) { - const { upgrade, client, socket, headers, statusCode } = this + // https://tools.ietf.org/html/rfc7540#section-8.3 + // :path and :scheme headers must be omited when sending CONNECT - assert(upgrade) + headers[HTTP2_HEADER_PATH] = path + headers[HTTP2_HEADER_SCHEME] = 'https' - const request = client[kQueue][client[kRunningIdx]] - assert(request) + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 - assert(!socket.destroyed) - assert(socket === client[kSocket]) - assert(!this.paused) - assert(request.upgrade || request.method === 'CONNECT') + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. - this.statusCode = null - this.statusText = '' - this.shouldKeepAlive = null + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' + ) - assert(this.headers.length % 2 === 0) - this.headers = [] - this.headersSize = 0 + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0) + } - socket.unshift(head) + let contentLength = util.bodyLength(body) - socket[kParser].destroy() - socket[kParser] = null + if (contentLength == null) { + contentLength = request.contentLength + } - socket[kClient] = null - socket[kError] = null - socket - .removeListener('error', onSocketError) - .removeListener('readable', onSocketReadable) - .removeListener('end', onSocketEnd) - .removeListener('close', onSocketClose) + if (contentLength === 0 || !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. - client[kSocket] = null - client[kQueue][client[kRunningIdx]++] = null - client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')) + contentLength = null + } - try { - request.onUpgrade(statusCode, headers, socket) - } catch (err) { - util.destroy(socket, err) + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + errorRequest(client, request, new RequestContentLengthMismatchError()) + return false } - resume(client) + process.emitWarning(new RequestContentLengthMismatchError()) } - onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { - const { client, socket, headers, statusText } = this + if (contentLength != null) { + assert(body, 'no body must not have content length') + headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}` + } - /* istanbul ignore next: difficult to make a test case for */ - if (socket.destroyed) { - return -1 - } + session.ref() - const request = client[kQueue][client[kRunningIdx]] + const shouldEndStream = method === 'GET' || method === 'HEAD' + if (expectContinue) { + headers[HTTP2_HEADER_EXPECT] = '100-continue' + /** + * @type {import('node:http2').ClientHttp2Stream} + */ + stream = session.request(headers, { endStream: shouldEndStream, signal }) - /* istanbul ignore next: difficult to make a test case for */ - if (!request) { - return -1 - } + stream.once('continue', writeBodyH2) + } else { + /** @type {import('node:http2').ClientHttp2Stream} */ + stream = session.request(headers, { + endStream: shouldEndStream, + signal + }) + writeBodyH2() + } - assert(!this.upgrade) - assert(this.statusCode < 200) + // Increment counter as we have new several streams open + ++h2State.openStreams - if (statusCode === 100) { - util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) - return -1 + stream.once('response', headers => { + if (request.onHeaders(Number(headers[HTTP2_HEADER_STATUS]), headers, stream.resume.bind(stream), '') === false) { + stream.pause() } + }) - /* this can only happen if server is misbehaving */ - if (upgrade && !request.upgrade) { - util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))) - return -1 - } + stream.once('end', () => { + request.onComplete([]) + }) - assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS) + stream.on('data', (chunk) => { + if (request.onData(chunk) === false) stream.pause() + }) - this.statusCode = statusCode - this.shouldKeepAlive = ( - shouldKeepAlive || - // Override llhttp value which does not allow keepAlive for HEAD. - (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive') - ) + stream.once('close', () => { + h2State.openStreams -= 1 + // TODO(HTTP/2): unref only if current streams count is 0 + if (h2State.openStreams === 0) session.unref() + }) - if (this.statusCode >= 200) { - const bodyTimeout = request.bodyTimeout != null - ? request.bodyTimeout - : client[kBodyTimeout] - this.setTimeout(bodyTimeout, TIMEOUT_BODY) - } else if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() - } + stream.once('error', function (err) { + if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { + h2State.streams -= 1 + util.destroy(stream, err) } + }) - if (request.method === 'CONNECT') { - assert(client[kRunning] === 1) - this.upgrade = true - return 2 + stream.once('frameError', (type, code) => { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`) + errorRequest(client, request, err) + + if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { + h2State.streams -= 1 + util.destroy(stream, err) } + }) - if (upgrade) { - assert(client[kRunning] === 1) - this.upgrade = true - return 2 + // stream.on('aborted', () => { + // // TODO(HTTP/2): Support aborted + // }) + + // stream.on('timeout', () => { + // // TODO(HTTP/2): Support timeout + // }) + + // stream.on('push', headers => { + // // TODO(HTTP/2): Suppor push + // }) + + // stream.on('trailers', headers => { + // // TODO(HTTP/2): Support trailers + // }) + + return true + + function writeBodyH2 () { + /* istanbul ignore else: assertion */ + if (!body) { + request.onRequestSent() + } else if (util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length') + stream.cork() + stream.write(body) + stream.uncork() + stream.end() + request.onBodySent(body) + request.onRequestSent() + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable({ + client, + request, + contentLength, + h2stream: stream, + expectsPayload, + body: body.stream(), + socket: client[kSocket], + header: '' + }) + } else { + writeBlob({ + body, + client, + request, + contentLength, + expectsPayload, + h2stream: stream, + header: '', + socket: client[kSocket] + }) + } + } else if (util.isStream(body)) { + writeStream({ + body, + client, + request, + contentLength, + expectsPayload, + socket: client[kSocket], + h2stream: stream, + header: '' + }) + } else if (util.isIterable(body)) { + writeIterable({ + body, + client, + request, + contentLength, + expectsPayload, + header: '', + h2stream: stream, + socket: client[kSocket] + }) + } else { + assert(false) } + } +} - assert(this.headers.length % 2 === 0) - this.headers = [] - this.headersSize = 0 - - if (this.shouldKeepAlive && client[kPipelining]) { - const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null +function writeStream ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined') - if (keepAliveTimeout != null) { - const timeout = Math.min( - keepAliveTimeout - client[kKeepAliveTimeoutThreshold], - client[kKeepAliveMaxTimeout] - ) - if (timeout <= 0) { - socket[kReset] = true + if (client[kHTTPConnVersion] === 'h2') { + // For HTTP/2, is enough to pipe the stream + const pipe = pipeline( + body, + h2stream, + (err) => { + if (err) { + util.destroy(body, err) + util.destroy(h2stream, err) } else { - client[kKeepAliveTimeoutValue] = timeout + request.onRequestSent() } - } else { - client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout] } - } else { - // Stop more requests from being dispatched. - socket[kReset] = true - } - - let pause - try { - pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false - } catch (err) { - util.destroy(socket, err) - return -1 - } - - if (request.method === 'HEAD') { - return 1 - } + ) - if (statusCode < 200) { - return 1 - } + pipe.on('data', onPipeData) + pipe.once('end', () => { + pipe.removeListener('data', onPipeData) + util.destroy(pipe) + }) - if (socket[kBlocking]) { - socket[kBlocking] = false - resume(client) + function onPipeData (chunk) { + request.onBodySent(chunk) } - return pause ? constants.ERROR.PAUSED : 0 + return } - onBody (buf) { - const { client, socket, statusCode, maxResponseSize } = this - - if (socket.destroyed) { - return -1 - } - - const request = client[kQueue][client[kRunningIdx]] - assert(request) - - assert.strictEqual(this.timeoutType, TIMEOUT_BODY) - if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() - } - } + let finished = false - assert(statusCode >= 200) + const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }) - if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { - util.destroy(socket, new ResponseExceededMaxSizeError()) - return -1 + const onData = function (chunk) { + if (finished) { + return } - this.bytesRead += buf.length - try { - if (request.onData(buf) === false) { - return constants.ERROR.PAUSED + if (!writer.write(chunk) && this.pause) { + this.pause() } } catch (err) { - util.destroy(socket, err) - return -1 + util.destroy(this, err) } } - - onMessageComplete () { - const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this - - if (socket.destroyed && (!statusCode || shouldKeepAlive)) { - return -1 + const onDrain = function () { + if (finished) { + return } - if (upgrade) { + if (body.resume) { + body.resume() + } + } + const onAbort = function () { + onFinished(new RequestAbortedError()) + } + const onFinished = function (err) { + if (finished) { return } - const request = client[kQueue][client[kRunningIdx]] - assert(request) - - assert(statusCode >= 100) - - this.statusCode = null - this.statusText = '' - this.bytesRead = 0 - this.contentLength = '' - this.keepAlive = '' - this.connection = '' + finished = true - assert(this.headers.length % 2 === 0) - this.headers = [] - this.headersSize = 0 + assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)) - if (statusCode < 200) { - return - } + socket + .off('drain', onDrain) + .off('error', onFinished) - /* istanbul ignore next: should be handled by llhttp? */ - if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { - util.destroy(socket, new ResponseContentLengthMismatchError()) - return -1 - } + body + .removeListener('data', onData) + .removeListener('end', onFinished) + .removeListener('error', onFinished) + .removeListener('close', onAbort) - try { - request.onComplete(headers) - } catch (err) { - errorRequest(client, request, err) + if (!err) { + try { + writer.end() + } catch (er) { + err = er + } } - client[kQueue][client[kRunningIdx]++] = null + writer.destroy(err) - if (socket[kWriting]) { - assert.strictEqual(client[kRunning], 0) - // Response completed before request. - util.destroy(socket, new InformationalError('reset')) - return constants.ERROR.PAUSED - } else if (!shouldKeepAlive) { - util.destroy(socket, new InformationalError('reset')) - return constants.ERROR.PAUSED - } else if (socket[kReset] && client[kRunning] === 0) { - // Destroy socket once all requests have completed. - // The request at the tail of the pipeline is the one - // that requested reset and no further requests should - // have been queued since then. - util.destroy(socket, new InformationalError('reset')) - return constants.ERROR.PAUSED - } else if (client[kPipelining] === 1) { - // We must wait a full event loop cycle to reuse this socket to make sure - // that non-spec compliant servers are not closing the connection even if they - // said they won't. - setImmediate(resume, client) + if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { + util.destroy(body, err) } else { - resume(client) + util.destroy(body) } } -} -function onParserTimeout (parser) { - const { socket, timeoutType, client } = parser + body + .on('data', onData) + .on('end', onFinished) + .on('error', onFinished) + .on('close', onAbort) - /* istanbul ignore else */ - if (timeoutType === TIMEOUT_HEADERS) { - if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { - assert(!parser.paused, 'cannot be paused while waiting for headers') - util.destroy(socket, new HeadersTimeoutError()) - } - } else if (timeoutType === TIMEOUT_BODY) { - if (!parser.paused) { - util.destroy(socket, new BodyTimeoutError()) - } - } else if (timeoutType === TIMEOUT_IDLE) { - assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]) - util.destroy(socket, new InformationalError('socket idle timeout')) + if (body.resume) { + body.resume() } -} -function onSocketReadable () { - const { [kParser]: parser } = this - if (parser) { - parser.readMore() - } + socket + .on('drain', onDrain) + .on('error', onFinished) } -function onSocketError (err) { - const { [kClient]: client, [kParser]: parser } = this - - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') +async function writeBlob ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength === body.size, 'blob body must have content length') - if (client[kHTTPConnVersion] !== 'h2') { - // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded - // to the user. - if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so for as a valid response. - parser.onMessageComplete() - return + const isH2 = client[kHTTPConnVersion] === 'h2' + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError() } - } - this[kError] = err - - onError(this[kClient], err) -} - -function onError (client, err) { - if ( - client[kRunning] === 0 && - err.code !== 'UND_ERR_INFO' && - err.code !== 'UND_ERR_SOCKET' - ) { - // Error is not caused by running request and not a recoverable - // socket error. - - assert(client[kPendingIdx] === client[kRunningIdx]) + const buffer = Buffer.from(await body.arrayBuffer()) - const requests = client[kQueue].splice(client[kRunningIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - errorRequest(client, request, err) + if (isH2) { + h2stream.cork() + h2stream.write(buffer) + h2stream.uncork() + } else { + socket.cork() + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') + socket.write(buffer) + socket.uncork() } - assert(client[kSize] === 0) - } -} -function onSocketEnd () { - const { [kParser]: parser, [kClient]: client } = this + request.onBodySent(buffer) + request.onRequestSent() - if (client[kHTTPConnVersion] !== 'h2') { - if (parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete() - return + if (!expectsPayload) { + socket[kReset] = true } - } - util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) + resume(client) + } catch (err) { + util.destroy(isH2 ? h2stream : socket, err) + } } -function onSocketClose () { - const { [kClient]: client, [kParser]: parser } = this +async function writeIterable ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined') - if (client[kHTTPConnVersion] === 'h1' && parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete() + let callback = null + function onDrain () { + if (callback) { + const cb = callback + callback = null + cb() } - - this[kParser].destroy() - this[kParser] = null } - const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) - - client[kSocket] = null - - if (client.destroyed) { - assert(client[kPending] === 0) + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null) - // Fail entire queue. - const requests = client[kQueue].splice(client[kRunningIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - errorRequest(client, request, err) + if (socket[kError]) { + reject(socket[kError]) + } else { + callback = resolve } - } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { - // Fail head of pipeline. - const request = client[kQueue][client[kRunningIdx]] - client[kQueue][client[kRunningIdx]++] = null - - errorRequest(client, request, err) - } - - client[kPendingIdx] = client[kRunningIdx] - - assert(client[kRunning] === 0) - - client.emit('disconnect', client[kUrl], [client], err) - - resume(client) -} - -async function connect (client) { - assert(!client[kConnecting]) - assert(!client[kSocket]) - - let { host, hostname, protocol, port } = client[kUrl] - - // Resolve ipv6 - if (hostname[0] === '[') { - const idx = hostname.indexOf(']') - - assert(idx !== -1) - const ip = hostname.substr(1, idx - 1) - - assert(net.isIP(ip)) - hostname = ip - } - - client[kConnecting] = true + }) - if (channels.beforeConnect.hasSubscribers) { - channels.beforeConnect.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector] - }) - } + if (client[kHTTPConnVersion] === 'h2') { + h2stream + .on('close', onDrain) + .on('drain', onDrain) - try { - const socket = await new Promise((resolve, reject) => { - client[kConnector]({ - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, (err, socket) => { - if (err) { - reject(err) - } else { - resolve(socket) + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] } - }) - }) - - if (client.destroyed) { - util.destroy(socket.on('error', () => {}), new ClientDestroyedError()) - return - } - - client[kConnecting] = false - - assert(socket) - - const isH2 = socket.alpnProtocol === 'h2' - if (isH2) { - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true - process.emitWarning('H2 support is experimental, expect them to change at any time.', { - code: 'UNDICI-H2' - }) - } - - const session = http2.connect(client[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams - }) - - client[kHTTPConnVersion] = 'h2' - session[kClient] = client - session[kSocket] = socket - session.on('error', onHttp2SessionError) - session.on('frameError', onHttp2FrameError) - session.on('end', onHttp2SessionEnd) - session.on('goaway', onHTTP2GoAway) - session.on('close', onSocketClose) - session.unref() - client[kHTTP2Session] = session - socket[kHTTP2Session] = session - } else { - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise - llhttpPromise = null + const res = h2stream.write(chunk) + request.onBodySent(chunk) + if (!res) { + await waitForDrain() + } } - - socket[kNoRef] = false - socket[kWriting] = false - socket[kReset] = false - socket[kBlocking] = false - socket[kParser] = new Parser(client, socket, llhttpInstance) + } catch (err) { + h2stream.destroy(err) + } finally { + request.onRequestSent() + h2stream.end() + h2stream + .off('close', onDrain) + .off('drain', onDrain) } - socket[kCounter] = 0 - socket[kMaxRequests] = client[kMaxRequests] - socket[kClient] = client - socket[kError] = null - - socket - .on('error', onSocketError) - .on('readable', onSocketReadable) - .on('end', onSocketEnd) - .on('close', onSocketClose) - - client[kSocket] = socket - - if (channels.connected.hasSubscribers) { - channels.connected.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - socket - }) - } - client.emit('connect', client[kUrl], [client]) - } catch (err) { - if (client.destroyed) { - return - } + return + } - client[kConnecting] = false + socket + .on('close', onDrain) + .on('drain', onDrain) - if (channels.connectError.hasSubscribers) { - channels.connectError.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - error: err - }) - } + const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }) + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] + } - if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { - assert(client[kRunning] === 0) - while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { - const request = client[kQueue][client[kPendingIdx]++] - errorRequest(client, request, err) + if (!writer.write(chunk)) { + await waitForDrain() } - } else { - onError(client, err) } - client.emit('connectionError', client[kUrl], [client], err) + writer.end() + } catch (err) { + writer.destroy(err) + } finally { + socket + .off('close', onDrain) + .off('drain', onDrain) } - - resume(client) } -function emitDrain (client) { - client[kNeedDrain] = 0 - client.emit('drain', client[kUrl], [client]) -} +class AsyncWriter { + constructor ({ socket, request, contentLength, client, expectsPayload, header }) { + this.socket = socket + this.request = request + this.contentLength = contentLength + this.client = client + this.bytesWritten = 0 + this.expectsPayload = expectsPayload + this.header = header -function resume (client, sync) { - if (client[kResuming] === 2) { - return + socket[kWriting] = true } - client[kResuming] = 2 - - _resume(client, sync) - client[kResuming] = 0 - - if (client[kRunningIdx] > 256) { - client[kQueue].splice(0, client[kRunningIdx]) - client[kPendingIdx] -= client[kRunningIdx] - client[kRunningIdx] = 0 - } -} + write (chunk) { + const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this -function _resume (client, sync) { - while (true) { - if (client.destroyed) { - assert(client[kPending] === 0) - return + if (socket[kError]) { + throw socket[kError] } - if (client[kClosedResolve] && !client[kSize]) { - client[kClosedResolve]() - client[kClosedResolve] = null - return + if (socket.destroyed) { + return false } - const socket = client[kSocket] + const len = Buffer.byteLength(chunk) + if (!len) { + return true + } - if (socket && !socket.destroyed && socket.alpnProtocol !== 'h2') { - if (client[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref() - socket[kNoRef] = true - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref() - socket[kNoRef] = false + // We should defer writing chunks. + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() } - if (client[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { - socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE) - } - } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request = client[kQueue][client[kRunningIdx]] - const headersTimeout = request.headersTimeout != null - ? request.headersTimeout - : client[kHeadersTimeout] - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS) - } - } + process.emitWarning(new RequestContentLengthMismatchError()) } - if (client[kBusy]) { - client[kNeedDrain] = 2 - } else if (client[kNeedDrain] === 2) { - if (sync) { - client[kNeedDrain] = 1 - process.nextTick(emitDrain, client) + socket.cork() + + if (bytesWritten === 0) { + if (!expectsPayload) { + socket[kReset] = true + } + + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1') } else { - emitDrain(client) + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') } - continue } - if (client[kPending] === 0) { - return + if (contentLength === null) { + socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1') } - if (client[kRunning] >= (client[kPipelining] || 1)) { - return - } + this.bytesWritten += len - const request = client[kQueue][client[kPendingIdx]] + const ret = socket.write(chunk) - if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) { - if (client[kRunning] > 0) { - return - } + socket.uncork() - client[kServerName] = request.servername + request.onBodySent(chunk) - if (socket && socket.servername !== request.servername) { - util.destroy(socket, new InformationalError('servername changed')) - return + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh() + } } } - if (client[kConnecting]) { - return + return ret + } + + end () { + const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this + request.onRequestSent() + + socket[kWriting] = false + + if (socket[kError]) { + throw socket[kError] } - if (!socket && !client[kHTTP2Session]) { - connect(client) + if (socket.destroyed) { return } - if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { - return + if (bytesWritten === 0) { + if (expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD send a Content-Length in a request message when + // no Transfer-Encoding is sent and the request method defines a meaning + // for an enclosed payload body. + + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') + } else { + socket.write(`${header}\r\n`, 'latin1') + } + } else if (contentLength === null) { + socket.write('\r\n0\r\n\r\n', 'latin1') } - if (client[kRunning] > 0 && !request.idempotent) { - // Non-idempotent request cannot be retried. - // Ensure that no other requests are inflight and - // could cause failure. - return + if (contentLength !== null && bytesWritten !== contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() + } else { + process.emitWarning(new RequestContentLengthMismatchError()) + } } - if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { - // Don't dispatch an upgrade until all preceding requests have completed. - // A misbehaving server might upgrade the connection before all pipelined - // request has completed. - return + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh() + } } - if (util.isStream(request.body) && util.bodyLength(request.body) === 0) { - request.body - .on('data', /* istanbul ignore next */ function () { - /* istanbul ignore next */ - assert(false) - }) - .on('error', function (err) { - errorRequest(client, request, err) - }) - .on('end', function () { - util.destroy(this) - }) + resume(client) + } - request.body = null - } + destroy (err) { + const { socket, client } = this - if (client[kRunning] > 0 && - (util.isStream(request.body) || util.isAsyncIterable(request.body))) { - // Request with stream or iterator body can error while other requests - // are inflight and indirectly error those as well. - // Ensure this doesn't happen by waiting for inflight - // to complete before dispatching. + socket[kWriting] = false - // Request with stream or iterator body cannot be retried. - // Ensure that no other requests are inflight and - // could cause failure. - return + if (err) { + assert(client[kRunning] <= 1, 'pipeline should only contain this request') + util.destroy(socket, err) } + } +} - if (!request.aborted && write(client, request)) { - client[kPendingIdx]++ - } else { - client[kQueue].splice(client[kPendingIdx], 1) +function errorRequest (client, request, err) { + try { + request.onError(err) + assert(request.aborted) + } catch (err) { + client.emit('error', err) + } +} + +module.exports = Client + + +/***/ }), + +/***/ 56436: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +/* istanbul ignore file: only for Node 12 */ + +const { kConnected, kSize } = __nccwpck_require__(72785) + +class CompatWeakRef { + constructor (value) { + this.value = value + } + + deref () { + return this.value[kConnected] === 0 && this.value[kSize] === 0 + ? undefined + : this.value + } +} + +class CompatFinalizer { + constructor (finalizer) { + this.finalizer = finalizer + } + + register (dispatcher, key) { + if (dispatcher.on) { + dispatcher.on('disconnect', () => { + if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { + this.finalizer(key) + } + }) } } } -function write (client, request) { - if (client[kHTTPConnVersion] === 'h2') { - writeH2(client, client[kHTTP2Session], request) - return +module.exports = function () { + // FIXME: remove workaround when the Node bug is fixed + // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 + if (process.env.NODE_V8_COVERAGE) { + return { + WeakRef: CompatWeakRef, + FinalizationRegistry: CompatFinalizer + } } + return { + WeakRef: global.WeakRef || CompatWeakRef, + FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer + } +} - const { body, method, path, host, upgrade, headers, blocking, reset } = request - // https://tools.ietf.org/html/rfc7231#section-4.3.1 - // https://tools.ietf.org/html/rfc7231#section-4.3.2 - // https://tools.ietf.org/html/rfc7231#section-4.3.5 +/***/ }), - // Sending a payload body on a request that does not - // expect it can cause undefined behavior on some - // servers and corrupt connection state. Do not - // re-use the connection for further requests. +/***/ 20663: +/***/ ((module) => { - const expectsPayload = ( - method === 'PUT' || - method === 'POST' || - method === 'PATCH' - ) +"use strict"; - if (body && typeof body.read === 'function') { - // Try to read EOF in order to get length. - body.read(0) - } - let contentLength = util.bodyLength(body) +// https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size +const maxAttributeValueSize = 1024 - if (contentLength === null) { - contentLength = request.contentLength +// https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size +const maxNameValuePairSize = 4096 + +module.exports = { + maxAttributeValueSize, + maxNameValuePairSize +} + + +/***/ }), + +/***/ 41724: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +const { parseSetCookie } = __nccwpck_require__(24408) +const { stringify, getHeadersList } = __nccwpck_require__(43121) +const { webidl } = __nccwpck_require__(21744) +const { Headers } = __nccwpck_require__(10554) + +/** + * @typedef {Object} Cookie + * @property {string} name + * @property {string} value + * @property {Date|number|undefined} expires + * @property {number|undefined} maxAge + * @property {string|undefined} domain + * @property {string|undefined} path + * @property {boolean|undefined} secure + * @property {boolean|undefined} httpOnly + * @property {'Strict'|'Lax'|'None'} sameSite + * @property {string[]} unparsed + */ + +/** + * @param {Headers} headers + * @returns {Record} + */ +function getCookies (headers) { + webidl.argumentLengthCheck(arguments, 1, { header: 'getCookies' }) + + webidl.brandCheck(headers, Headers, { strict: false }) + + const cookie = headers.get('cookie') + const out = {} + + if (!cookie) { + return out } - if (contentLength === 0 && !expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD NOT send a Content-Length header field when - // the request message does not contain a payload body and the method - // semantics do not anticipate such a body. + for (const piece of cookie.split(';')) { + const [name, ...value] = piece.split('=') - contentLength = null + out[name.trim()] = value.join('=') } - if (request.contentLength !== null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()) - return false - } + return out +} - process.emitWarning(new RequestContentLengthMismatchError()) +/** + * @param {Headers} headers + * @param {string} name + * @param {{ path?: string, domain?: string }|undefined} attributes + * @returns {void} + */ +function deleteCookie (headers, name, attributes) { + webidl.argumentLengthCheck(arguments, 2, { header: 'deleteCookie' }) + + webidl.brandCheck(headers, Headers, { strict: false }) + + name = webidl.converters.DOMString(name) + attributes = webidl.converters.DeleteCookieAttributes(attributes) + + // Matches behavior of + // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278 + setCookie(headers, { + name, + value: '', + expires: new Date(0), + ...attributes + }) +} + +/** + * @param {Headers} headers + * @returns {Cookie[]} + */ +function getSetCookies (headers) { + webidl.argumentLengthCheck(arguments, 1, { header: 'getSetCookies' }) + + webidl.brandCheck(headers, Headers, { strict: false }) + + const cookies = getHeadersList(headers).cookies + + if (!cookies) { + return [] } - const socket = client[kSocket] + // In older versions of undici, cookies is a list of name:value. + return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)) +} - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return - } +/** + * @param {Headers} headers + * @param {Cookie} cookie + * @returns {void} + */ +function setCookie (headers, cookie) { + webidl.argumentLengthCheck(arguments, 2, { header: 'setCookie' }) - errorRequest(client, request, err || new RequestAbortedError()) + webidl.brandCheck(headers, Headers, { strict: false }) - util.destroy(socket, new InformationalError('aborted')) - }) - } catch (err) { - errorRequest(client, request, err) + cookie = webidl.converters.Cookie(cookie) + + const str = stringify(cookie) + + if (str) { + headers.append('Set-Cookie', stringify(cookie)) } +} - if (request.aborted) { - return false +webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'path', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'domain', + defaultValue: null + } +]) + +webidl.converters.Cookie = webidl.dictionaryConverter([ + { + converter: webidl.converters.DOMString, + key: 'name' + }, + { + converter: webidl.converters.DOMString, + key: 'value' + }, + { + converter: webidl.nullableConverter((value) => { + if (typeof value === 'number') { + return webidl.converters['unsigned long long'](value) + } + + return new Date(value) + }), + key: 'expires', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters['long long']), + key: 'maxAge', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'domain', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'path', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: 'secure', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: 'httpOnly', + defaultValue: null + }, + { + converter: webidl.converters.USVString, + key: 'sameSite', + allowedValues: ['Strict', 'Lax', 'None'] + }, + { + converter: webidl.sequenceConverter(webidl.converters.DOMString), + key: 'unparsed', + defaultValue: [] } +]) - if (method === 'HEAD') { - // https://github.com/mcollina/undici/issues/258 - // Close after a HEAD request to interop with misbehaving servers - // that may send a body in the response. +module.exports = { + getCookies, + deleteCookie, + getSetCookies, + setCookie +} - socket[kReset] = true - } - if (upgrade || method === 'CONNECT') { - // On CONNECT or upgrade, block pipeline from dispatching further - // requests on this connection. +/***/ }), - socket[kReset] = true - } +/***/ 24408: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (reset != null) { - socket[kReset] = reset - } +"use strict"; - if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { - socket[kReset] = true - } - if (blocking) { - socket[kBlocking] = true +const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(20663) +const { isCTLExcludingHtab } = __nccwpck_require__(43121) +const { collectASequenceOfCodePointsFast } = __nccwpck_require__(685) +const assert = __nccwpck_require__(39491) + +/** + * @description Parses the field-value attributes of a set-cookie header string. + * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 + * @param {string} header + * @returns if the header is invalid, null will be returned + */ +function parseSetCookie (header) { + // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F + // character (CTL characters excluding HTAB): Abort these steps and + // ignore the set-cookie-string entirely. + if (isCTLExcludingHtab(header)) { + return null } - let header = `${method} ${path} HTTP/1.1\r\n` + let nameValuePair = '' + let unparsedAttributes = '' + let name = '' + let value = '' - if (typeof host === 'string') { - header += `host: ${host}\r\n` - } else { - header += client[kHostHeader] - } + // 2. If the set-cookie-string contains a %x3B (";") character: + if (header.includes(';')) { + // 1. The name-value-pair string consists of the characters up to, + // but not including, the first %x3B (";"), and the unparsed- + // attributes consist of the remainder of the set-cookie-string + // (including the %x3B (";") in question). + const position = { position: 0 } - if (upgrade) { - header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n` - } else if (client[kPipelining] && !socket[kReset]) { - header += 'connection: keep-alive\r\n' + nameValuePair = collectASequenceOfCodePointsFast(';', header, position) + unparsedAttributes = header.slice(position.position) } else { - header += 'connection: close\r\n' - } - - if (headers) { - header += headers - } + // Otherwise: - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request, headers: header, socket }) + // 1. The name-value-pair string consists of all the characters + // contained in the set-cookie-string, and the unparsed- + // attributes is the empty string. + nameValuePair = header } - /* istanbul ignore else: assertion */ - if (!body) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') - } else { - assert(contentLength === null, 'no body must not have content length') - socket.write(`${header}\r\n`, 'latin1') - } - request.onRequestSent() - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, 'buffer body must have content length') - - socket.cork() - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') - socket.write(body) - socket.uncork() - request.onBodySent(body) - request.onRequestSent() - if (!expectsPayload) { - socket[kReset] = true - } - } else if (util.isBlobLike(body)) { - if (typeof body.stream === 'function') { - writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }) - } else { - writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }) - } - } else if (util.isStream(body)) { - writeStream({ body, client, request, socket, contentLength, header, expectsPayload }) - } else if (util.isIterable(body)) { - writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }) + // 3. If the name-value-pair string lacks a %x3D ("=") character, then + // the name string is empty, and the value string is the value of + // name-value-pair. + if (!nameValuePair.includes('=')) { + value = nameValuePair } else { - assert(false) + // Otherwise, the name string consists of the characters up to, but + // not including, the first %x3D ("=") character, and the (possibly + // empty) value string consists of the characters after the first + // %x3D ("=") character. + const position = { position: 0 } + name = collectASequenceOfCodePointsFast( + '=', + nameValuePair, + position + ) + value = nameValuePair.slice(position.position + 1) } - return true -} - -function writeH2 (client, session, request) { - const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request - - let headers - if (typeof reqHeaders === 'string') headers = Request[kHTTP2CopyHeaders](reqHeaders.trim()) - else headers = reqHeaders + // 4. Remove any leading or trailing WSP characters from the name + // string and the value string. + name = name.trim() + value = value.trim() - if (upgrade) { - errorRequest(client, request, new Error('Upgrade not supported for H2')) - return false + // 5. If the sum of the lengths of the name string and the value string + // is more than 4096 octets, abort these steps and ignore the set- + // cookie-string entirely. + if (name.length + value.length > maxNameValuePairSize) { + return null } - try { - // TODO(HTTP/2): Should we call onConnect immediately or on stream ready event? - request.onConnect((err) => { - if (request.aborted || request.completed) { - return - } - - errorRequest(client, request, err || new RequestAbortedError()) - }) - } catch (err) { - errorRequest(client, request, err) + // 6. The cookie-name is the name string, and the cookie-value is the + // value string. + return { + name, value, ...parseUnparsedAttributes(unparsedAttributes) } +} - if (request.aborted) { - return false +/** + * Parses the remaining attributes of a set-cookie header + * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 + * @param {string} unparsedAttributes + * @param {[Object.]={}} cookieAttributeList + */ +function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) { + // 1. If the unparsed-attributes string is empty, skip the rest of + // these steps. + if (unparsedAttributes.length === 0) { + return cookieAttributeList } - let stream - const h2State = client[kHTTP2SessionState] - - headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost] - headers[HTTP2_HEADER_METHOD] = method - - if (method === 'CONNECT') { - session.ref() - // we are already connected, streams are pending, first request - // will create a new stream. We trigger a request to create the stream and wait until - // `ready` event is triggered - // We disabled endStream to allow the user to write to the stream - stream = session.request(headers, { endStream: false, signal }) + // 2. Discard the first character of the unparsed-attributes (which + // will be a %x3B (";") character). + assert(unparsedAttributes[0] === ';') + unparsedAttributes = unparsedAttributes.slice(1) - if (stream.id && !stream.pending) { - request.onUpgrade(null, null, stream) - ++h2State.openStreams - } else { - stream.once('ready', () => { - request.onUpgrade(null, null, stream) - ++h2State.openStreams - }) - } + let cookieAv = '' - stream.once('close', () => { - h2State.openStreams -= 1 - // TODO(HTTP/2): unref only if current streams count is 0 - if (h2State.openStreams === 0) session.unref() - }) + // 3. If the remaining unparsed-attributes contains a %x3B (";") + // character: + if (unparsedAttributes.includes(';')) { + // 1. Consume the characters of the unparsed-attributes up to, but + // not including, the first %x3B (";") character. + cookieAv = collectASequenceOfCodePointsFast( + ';', + unparsedAttributes, + { position: 0 } + ) + unparsedAttributes = unparsedAttributes.slice(cookieAv.length) + } else { + // Otherwise: - return true + // 1. Consume the remainder of the unparsed-attributes. + cookieAv = unparsedAttributes + unparsedAttributes = '' } - // https://tools.ietf.org/html/rfc7540#section-8.3 - // :path and :scheme headers must be omited when sending CONNECT - - headers[HTTP2_HEADER_PATH] = path - headers[HTTP2_HEADER_SCHEME] = 'https' + // Let the cookie-av string be the characters consumed in this step. - // https://tools.ietf.org/html/rfc7231#section-4.3.1 - // https://tools.ietf.org/html/rfc7231#section-4.3.2 - // https://tools.ietf.org/html/rfc7231#section-4.3.5 + let attributeName = '' + let attributeValue = '' - // Sending a payload body on a request that does not - // expect it can cause undefined behavior on some - // servers and corrupt connection state. Do not - // re-use the connection for further requests. + // 4. If the cookie-av string contains a %x3D ("=") character: + if (cookieAv.includes('=')) { + // 1. The (possibly empty) attribute-name string consists of the + // characters up to, but not including, the first %x3D ("=") + // character, and the (possibly empty) attribute-value string + // consists of the characters after the first %x3D ("=") + // character. + const position = { position: 0 } - const expectsPayload = ( - method === 'PUT' || - method === 'POST' || - method === 'PATCH' - ) + attributeName = collectASequenceOfCodePointsFast( + '=', + cookieAv, + position + ) + attributeValue = cookieAv.slice(position.position + 1) + } else { + // Otherwise: - if (body && typeof body.read === 'function') { - // Try to read EOF in order to get length. - body.read(0) + // 1. The attribute-name string consists of the entire cookie-av + // string, and the attribute-value string is empty. + attributeName = cookieAv } - let contentLength = util.bodyLength(body) + // 5. Remove any leading or trailing WSP characters from the attribute- + // name string and the attribute-value string. + attributeName = attributeName.trim() + attributeValue = attributeValue.trim() - if (contentLength == null) { - contentLength = request.contentLength + // 6. If the attribute-value is longer than 1024 octets, ignore the + // cookie-av string and return to Step 1 of this algorithm. + if (attributeValue.length > maxAttributeValueSize) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) } - if (contentLength === 0 || !expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD NOT send a Content-Length header field when - // the request message does not contain a payload body and the method - // semantics do not anticipate such a body. + // 7. Process the attribute-name and attribute-value according to the + // requirements in the following subsections. (Notice that + // attributes with unrecognized attribute-names are ignored.) + const attributeNameLowercase = attributeName.toLowerCase() - contentLength = null - } + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1 + // If the attribute-name case-insensitively matches the string + // "Expires", the user agent MUST process the cookie-av as follows. + if (attributeNameLowercase === 'expires') { + // 1. Let the expiry-time be the result of parsing the attribute-value + // as cookie-date (see Section 5.1.1). + const expiryTime = new Date(attributeValue) - if (request.contentLength != null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()) - return false - } + // 2. If the attribute-value failed to parse as a cookie date, ignore + // the cookie-av. - process.emitWarning(new RequestContentLengthMismatchError()) - } + cookieAttributeList.expires = expiryTime + } else if (attributeNameLowercase === 'max-age') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2 + // If the attribute-name case-insensitively matches the string "Max- + // Age", the user agent MUST process the cookie-av as follows. - if (contentLength != null) { - assert(body, 'no body must not have content length') - headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}` - } + // 1. If the first character of the attribute-value is not a DIGIT or a + // "-" character, ignore the cookie-av. + const charCode = attributeValue.charCodeAt(0) - session.ref() + if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + } - const shouldEndStream = method === 'GET' || method === 'HEAD' - if (expectContinue) { - headers[HTTP2_HEADER_EXPECT] = '100-continue' - /** - * @type {import('node:http2').ClientHttp2Stream} - */ - stream = session.request(headers, { endStream: shouldEndStream, signal }) + // 2. If the remainder of attribute-value contains a non-DIGIT + // character, ignore the cookie-av. + if (!/^\d+$/.test(attributeValue)) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + } - stream.once('continue', writeBodyH2) - } else { - /** @type {import('node:http2').ClientHttp2Stream} */ - stream = session.request(headers, { - endStream: shouldEndStream, - signal - }) - writeBodyH2() - } + // 3. Let delta-seconds be the attribute-value converted to an integer. + const deltaSeconds = Number(attributeValue) - // Increment counter as we have new several streams open - ++h2State.openStreams + // 4. Let cookie-age-limit be the maximum age of the cookie (which + // SHOULD be 400 days or less, see Section 4.1.2.2). - stream.once('response', headers => { - if (request.onHeaders(Number(headers[HTTP2_HEADER_STATUS]), headers, stream.resume.bind(stream), '') === false) { - stream.pause() - } - }) + // 5. Set delta-seconds to the smaller of its present value and cookie- + // age-limit. + // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs) - stream.once('end', () => { - request.onComplete([]) - }) + // 6. If delta-seconds is less than or equal to zero (0), let expiry- + // time be the earliest representable date and time. Otherwise, let + // the expiry-time be the current date and time plus delta-seconds + // seconds. + // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds - stream.on('data', (chunk) => { - if (request.onData(chunk) === false) stream.pause() - }) + // 7. Append an attribute to the cookie-attribute-list with an + // attribute-name of Max-Age and an attribute-value of expiry-time. + cookieAttributeList.maxAge = deltaSeconds + } else if (attributeNameLowercase === 'domain') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3 + // If the attribute-name case-insensitively matches the string "Domain", + // the user agent MUST process the cookie-av as follows. - stream.once('close', () => { - h2State.openStreams -= 1 - // TODO(HTTP/2): unref only if current streams count is 0 - if (h2State.openStreams === 0) session.unref() - }) + // 1. Let cookie-domain be the attribute-value. + let cookieDomain = attributeValue - stream.once('error', function (err) { - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1 - util.destroy(stream, err) + // 2. If cookie-domain starts with %x2E ("."), let cookie-domain be + // cookie-domain without its leading %x2E ("."). + if (cookieDomain[0] === '.') { + cookieDomain = cookieDomain.slice(1) } - }) - - stream.once('frameError', (type, code) => { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`) - errorRequest(client, request, err) - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1 - util.destroy(stream, err) - } - }) + // 3. Convert the cookie-domain to lower case. + cookieDomain = cookieDomain.toLowerCase() - // stream.on('aborted', () => { - // // TODO(HTTP/2): Support aborted - // }) + // 4. Append an attribute to the cookie-attribute-list with an + // attribute-name of Domain and an attribute-value of cookie-domain. + cookieAttributeList.domain = cookieDomain + } else if (attributeNameLowercase === 'path') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4 + // If the attribute-name case-insensitively matches the string "Path", + // the user agent MUST process the cookie-av as follows. - // stream.on('timeout', () => { - // // TODO(HTTP/2): Support timeout - // }) + // 1. If the attribute-value is empty or if the first character of the + // attribute-value is not %x2F ("/"): + let cookiePath = '' + if (attributeValue.length === 0 || attributeValue[0] !== '/') { + // 1. Let cookie-path be the default-path. + cookiePath = '/' + } else { + // Otherwise: - // stream.on('push', headers => { - // // TODO(HTTP/2): Suppor push - // }) + // 1. Let cookie-path be the attribute-value. + cookiePath = attributeValue + } - // stream.on('trailers', headers => { - // // TODO(HTTP/2): Support trailers - // }) + // 2. Append an attribute to the cookie-attribute-list with an + // attribute-name of Path and an attribute-value of cookie-path. + cookieAttributeList.path = cookiePath + } else if (attributeNameLowercase === 'secure') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5 + // If the attribute-name case-insensitively matches the string "Secure", + // the user agent MUST append an attribute to the cookie-attribute-list + // with an attribute-name of Secure and an empty attribute-value. - return true + cookieAttributeList.secure = true + } else if (attributeNameLowercase === 'httponly') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6 + // If the attribute-name case-insensitively matches the string + // "HttpOnly", the user agent MUST append an attribute to the cookie- + // attribute-list with an attribute-name of HttpOnly and an empty + // attribute-value. - function writeBodyH2 () { - /* istanbul ignore else: assertion */ - if (!body) { - request.onRequestSent() - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, 'buffer body must have content length') - stream.cork() - stream.write(body) - stream.uncork() - stream.end() - request.onBodySent(body) - request.onRequestSent() - } else if (util.isBlobLike(body)) { - if (typeof body.stream === 'function') { - writeIterable({ - client, - request, - contentLength, - h2stream: stream, - expectsPayload, - body: body.stream(), - socket: client[kSocket], - header: '' - }) - } else { - writeBlob({ - body, - client, - request, - contentLength, - expectsPayload, - h2stream: stream, - header: '', - socket: client[kSocket] - }) - } - } else if (util.isStream(body)) { - writeStream({ - body, - client, - request, - contentLength, - expectsPayload, - socket: client[kSocket], - h2stream: stream, - header: '' - }) - } else if (util.isIterable(body)) { - writeIterable({ - body, - client, - request, - contentLength, - expectsPayload, - header: '', - h2stream: stream, - socket: client[kSocket] - }) - } else { - assert(false) + cookieAttributeList.httpOnly = true + } else if (attributeNameLowercase === 'samesite') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7 + // If the attribute-name case-insensitively matches the string + // "SameSite", the user agent MUST process the cookie-av as follows: + + // 1. Let enforcement be "Default". + let enforcement = 'Default' + + const attributeValueLowercase = attributeValue.toLowerCase() + // 2. If cookie-av's attribute-value is a case-insensitive match for + // "None", set enforcement to "None". + if (attributeValueLowercase.includes('none')) { + enforcement = 'None' + } + + // 3. If cookie-av's attribute-value is a case-insensitive match for + // "Strict", set enforcement to "Strict". + if (attributeValueLowercase.includes('strict')) { + enforcement = 'Strict' + } + + // 4. If cookie-av's attribute-value is a case-insensitive match for + // "Lax", set enforcement to "Lax". + if (attributeValueLowercase.includes('lax')) { + enforcement = 'Lax' } + + // 5. Append an attribute to the cookie-attribute-list with an + // attribute-name of "SameSite" and an attribute-value of + // enforcement. + cookieAttributeList.sameSite = enforcement + } else { + cookieAttributeList.unparsed ??= [] + + cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`) } + + // 8. Return to Step 1 of this algorithm. + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) } -function writeStream ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined') +module.exports = { + parseSetCookie, + parseUnparsedAttributes +} - if (client[kHTTPConnVersion] === 'h2') { - // For HTTP/2, is enough to pipe the stream - const pipe = pipeline( - body, - h2stream, - (err) => { - if (err) { - util.destroy(body, err) - util.destroy(h2stream, err) - } else { - request.onRequestSent() - } - } - ) - pipe.on('data', onPipeData) - pipe.once('end', () => { - pipe.removeListener('data', onPipeData) - util.destroy(pipe) - }) +/***/ }), - function onPipeData (chunk) { - request.onBodySent(chunk) - } +/***/ 43121: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - return - } +"use strict"; - let finished = false - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }) +const assert = __nccwpck_require__(39491) +const { kHeadersList } = __nccwpck_require__(72785) - const onData = function (chunk) { - if (finished) { - return - } +function isCTLExcludingHtab (value) { + if (value.length === 0) { + return false + } - try { - if (!writer.write(chunk) && this.pause) { - this.pause() - } - } catch (err) { - util.destroy(this, err) + for (const char of value) { + const code = char.charCodeAt(0) + + if ( + (code >= 0x00 || code <= 0x08) || + (code >= 0x0A || code <= 0x1F) || + code === 0x7F + ) { + return false } } - const onDrain = function () { - if (finished) { - return - } +} - if (body.resume) { - body.resume() +/** + CHAR = + token = 1* + separators = "(" | ")" | "<" | ">" | "@" + | "," | ";" | ":" | "\" | <"> + | "/" | "[" | "]" | "?" | "=" + | "{" | "}" | SP | HT + * @param {string} name + */ +function validateCookieName (name) { + for (const char of name) { + const code = char.charCodeAt(0) + + if ( + (code <= 0x20 || code > 0x7F) || + char === '(' || + char === ')' || + char === '>' || + char === '<' || + char === '@' || + char === ',' || + char === ';' || + char === ':' || + char === '\\' || + char === '"' || + char === '/' || + char === '[' || + char === ']' || + char === '?' || + char === '=' || + char === '{' || + char === '}' + ) { + throw new Error('Invalid cookie name') } } - const onAbort = function () { - onFinished(new RequestAbortedError()) +} + +/** + cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) + cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E + ; US-ASCII characters excluding CTLs, + ; whitespace DQUOTE, comma, semicolon, + ; and backslash + * @param {string} value + */ +function validateCookieValue (value) { + for (const char of value) { + const code = char.charCodeAt(0) + + if ( + code < 0x21 || // exclude CTLs (0-31) + code === 0x22 || + code === 0x2C || + code === 0x3B || + code === 0x5C || + code > 0x7E // non-ascii + ) { + throw new Error('Invalid header value') + } } - const onFinished = function (err) { - if (finished) { - return +} + +/** + * path-value = + * @param {string} path + */ +function validateCookiePath (path) { + for (const char of path) { + const code = char.charCodeAt(0) + + if (code < 0x21 || char === ';') { + throw new Error('Invalid cookie path') } + } +} - finished = true +/** + * I have no idea why these values aren't allowed to be honest, + * but Deno tests these. - Khafra + * @param {string} domain + */ +function validateCookieDomain (domain) { + if ( + domain.startsWith('-') || + domain.endsWith('.') || + domain.endsWith('-') + ) { + throw new Error('Invalid cookie domain') + } +} - assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)) +/** + * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1 + * @param {number|Date} date + IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT + ; fixed length/zone/capitalization subset of the format + ; see Section 3.3 of [RFC5322] - socket - .off('drain', onDrain) - .off('error', onFinished) + day-name = %x4D.6F.6E ; "Mon", case-sensitive + / %x54.75.65 ; "Tue", case-sensitive + / %x57.65.64 ; "Wed", case-sensitive + / %x54.68.75 ; "Thu", case-sensitive + / %x46.72.69 ; "Fri", case-sensitive + / %x53.61.74 ; "Sat", case-sensitive + / %x53.75.6E ; "Sun", case-sensitive + date1 = day SP month SP year + ; e.g., 02 Jun 1982 - body - .removeListener('data', onData) - .removeListener('end', onFinished) - .removeListener('error', onFinished) - .removeListener('close', onAbort) + day = 2DIGIT + month = %x4A.61.6E ; "Jan", case-sensitive + / %x46.65.62 ; "Feb", case-sensitive + / %x4D.61.72 ; "Mar", case-sensitive + / %x41.70.72 ; "Apr", case-sensitive + / %x4D.61.79 ; "May", case-sensitive + / %x4A.75.6E ; "Jun", case-sensitive + / %x4A.75.6C ; "Jul", case-sensitive + / %x41.75.67 ; "Aug", case-sensitive + / %x53.65.70 ; "Sep", case-sensitive + / %x4F.63.74 ; "Oct", case-sensitive + / %x4E.6F.76 ; "Nov", case-sensitive + / %x44.65.63 ; "Dec", case-sensitive + year = 4DIGIT - if (!err) { - try { - writer.end() - } catch (er) { - err = er - } - } + GMT = %x47.4D.54 ; "GMT", case-sensitive - writer.destroy(err) + time-of-day = hour ":" minute ":" second + ; 00:00:00 - 23:59:60 (leap second) - if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { - util.destroy(body, err) - } else { - util.destroy(body) - } + hour = 2DIGIT + minute = 2DIGIT + second = 2DIGIT + */ +function toIMFDate (date) { + if (typeof date === 'number') { + date = new Date(date) } - body - .on('data', onData) - .on('end', onFinished) - .on('error', onFinished) - .on('close', onAbort) + const days = [ + 'Sun', 'Mon', 'Tue', 'Wed', + 'Thu', 'Fri', 'Sat' + ] - if (body.resume) { - body.resume() - } + const months = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' + ] - socket - .on('drain', onDrain) - .on('error', onFinished) + const dayName = days[date.getUTCDay()] + const day = date.getUTCDate().toString().padStart(2, '0') + const month = months[date.getUTCMonth()] + const year = date.getUTCFullYear() + const hour = date.getUTCHours().toString().padStart(2, '0') + const minute = date.getUTCMinutes().toString().padStart(2, '0') + const second = date.getUTCSeconds().toString().padStart(2, '0') + + return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT` } -async function writeBlob ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength === body.size, 'blob body must have content length') +/** + max-age-av = "Max-Age=" non-zero-digit *DIGIT + ; In practice, both expires-av and max-age-av + ; are limited to dates representable by the + ; user agent. + * @param {number} maxAge + */ +function validateCookieMaxAge (maxAge) { + if (maxAge < 0) { + throw new Error('Invalid cookie max-age') + } +} - const isH2 = client[kHTTPConnVersion] === 'h2' - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError() - } +/** + * @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1 + * @param {import('./index').Cookie} cookie + */ +function stringify (cookie) { + if (cookie.name.length === 0) { + return null + } - const buffer = Buffer.from(await body.arrayBuffer()) + validateCookieName(cookie.name) + validateCookieValue(cookie.value) - if (isH2) { - h2stream.cork() - h2stream.write(buffer) - h2stream.uncork() - } else { - socket.cork() - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') - socket.write(buffer) - socket.uncork() - } + const out = [`${cookie.name}=${cookie.value}`] - request.onBodySent(buffer) - request.onRequestSent() + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1 + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2 + if (cookie.name.startsWith('__Secure-')) { + cookie.secure = true + } - if (!expectsPayload) { - socket[kReset] = true - } + if (cookie.name.startsWith('__Host-')) { + cookie.secure = true + cookie.domain = null + cookie.path = '/' + } - resume(client) - } catch (err) { - util.destroy(isH2 ? h2stream : socket, err) + if (cookie.secure) { + out.push('Secure') } -} -async function writeIterable ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined') + if (cookie.httpOnly) { + out.push('HttpOnly') + } - let callback = null - function onDrain () { - if (callback) { - const cb = callback - callback = null - cb() - } + if (typeof cookie.maxAge === 'number') { + validateCookieMaxAge(cookie.maxAge) + out.push(`Max-Age=${cookie.maxAge}`) } - const waitForDrain = () => new Promise((resolve, reject) => { - assert(callback === null) + if (cookie.domain) { + validateCookieDomain(cookie.domain) + out.push(`Domain=${cookie.domain}`) + } - if (socket[kError]) { - reject(socket[kError]) - } else { - callback = resolve - } - }) + if (cookie.path) { + validateCookiePath(cookie.path) + out.push(`Path=${cookie.path}`) + } - if (client[kHTTPConnVersion] === 'h2') { - h2stream - .on('close', onDrain) - .on('drain', onDrain) + if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') { + out.push(`Expires=${toIMFDate(cookie.expires)}`) + } - try { - // It's up to the user to somehow abort the async iterable. - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError] - } + if (cookie.sameSite) { + out.push(`SameSite=${cookie.sameSite}`) + } - const res = h2stream.write(chunk) - request.onBodySent(chunk) - if (!res) { - await waitForDrain() - } - } - } catch (err) { - h2stream.destroy(err) - } finally { - request.onRequestSent() - h2stream.end() - h2stream - .off('close', onDrain) - .off('drain', onDrain) + for (const part of cookie.unparsed) { + if (!part.includes('=')) { + throw new Error('Invalid unparsed') } - return + const [key, ...value] = part.split('=') + + out.push(`${key.trim()}=${value.join('=')}`) } - socket - .on('close', onDrain) - .on('drain', onDrain) + return out.join('; ') +} - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }) - try { - // It's up to the user to somehow abort the async iterable. - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError] - } +let kHeadersListNode - if (!writer.write(chunk)) { - await waitForDrain() - } - } +function getHeadersList (headers) { + if (headers[kHeadersList]) { + return headers[kHeadersList] + } - writer.end() - } catch (err) { - writer.destroy(err) - } finally { - socket - .off('close', onDrain) - .off('drain', onDrain) + if (!kHeadersListNode) { + kHeadersListNode = Object.getOwnPropertySymbols(headers).find( + (symbol) => symbol.description === 'headers list' + ) + + assert(kHeadersListNode, 'Headers cannot be parsed') } + + const headersList = headers[kHeadersListNode] + assert(headersList) + + return headersList } -class AsyncWriter { - constructor ({ socket, request, contentLength, client, expectsPayload, header }) { - this.socket = socket - this.request = request - this.contentLength = contentLength - this.client = client - this.bytesWritten = 0 - this.expectsPayload = expectsPayload - this.header = header +module.exports = { + isCTLExcludingHtab, + stringify, + getHeadersList +} - socket[kWriting] = true - } - write (chunk) { - const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this +/***/ }), - if (socket[kError]) { - throw socket[kError] - } +/***/ 82067: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (socket.destroyed) { - return false +"use strict"; + + +const net = __nccwpck_require__(41808) +const assert = __nccwpck_require__(39491) +const util = __nccwpck_require__(83983) +const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(48045) + +let tls // include tls conditionally since it is not always available + +// TODO: session re-use does not wait for the first +// connection to resolve the session and might therefore +// resolve the same servername multiple times even when +// re-use is enabled. + +let SessionCache +// FIXME: remove workaround when the Node bug is fixed +// https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 +if (global.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) { + SessionCache = class WeakSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions + this._sessionCache = new Map() + this._sessionRegistry = new global.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return + } + + const ref = this._sessionCache.get(key) + if (ref !== undefined && ref.deref() === undefined) { + this._sessionCache.delete(key) + } + }) } - const len = Buffer.byteLength(chunk) - if (!len) { - return true + get (sessionKey) { + const ref = this._sessionCache.get(sessionKey) + return ref ? ref.deref() : null } - // We should defer writing chunks. - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError() + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return } - process.emitWarning(new RequestContentLengthMismatchError()) + this._sessionCache.set(sessionKey, new WeakRef(session)) + this._sessionRegistry.register(session, sessionKey) + } + } +} else { + SessionCache = class SimpleSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions + this._sessionCache = new Map() } - socket.cork() + get (sessionKey) { + return this._sessionCache.get(sessionKey) + } - if (bytesWritten === 0) { - if (!expectsPayload) { - socket[kReset] = true + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return } - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1') - } else { - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') + if (this._sessionCache.size >= this._maxCachedSessions) { + // remove the oldest session + const { value: oldestKey } = this._sessionCache.keys().next() + this._sessionCache.delete(oldestKey) } - } - if (contentLength === null) { - socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1') + this._sessionCache.set(sessionKey, session) } + } +} - this.bytesWritten += len - - const ret = socket.write(chunk) - - socket.uncork() - - request.onBodySent(chunk) +function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') + } - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - // istanbul ignore else: only for jest - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh() - } + const options = { path: socketPath, ...opts } + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions) + timeout = timeout == null ? 10e3 : timeout + allowH2 = allowH2 != null ? allowH2 : false + return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket + if (protocol === 'https:') { + if (!tls) { + tls = __nccwpck_require__(24404) } - } + servername = servername || options.servername || util.getServerName(host) || null - return ret - } + const sessionKey = servername || hostname + const session = sessionCache.get(sessionKey) || null - end () { - const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this - request.onRequestSent() + assert(sessionKey) - socket[kWriting] = false + socket = tls.connect({ + highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... + ...options, + servername, + session, + localAddress, + // TODO(HTTP/2): Add support for h2c + ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], + socket: httpSocket, // upgrade socket connection + port: port || 443, + host: hostname + }) - if (socket[kError]) { - throw socket[kError] + socket + .on('session', function (session) { + // TODO (fix): Can a session become invalid once established? Don't think so? + sessionCache.set(sessionKey, session) + }) + } else { + assert(!httpSocket, 'httpSocket can only be sent on TLS update') + socket = net.connect({ + highWaterMark: 64 * 1024, // Same as nodejs fs streams. + ...options, + localAddress, + port: port || 80, + host: hostname + }) } - if (socket.destroyed) { - return + // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay + socket.setKeepAlive(true, keepAliveInitialDelay) } - if (bytesWritten === 0) { - if (expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD send a Content-Length in a request message when - // no Transfer-Encoding is sent and the request method defines a meaning - // for an enclosed payload body. + const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout) - socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') - } else { - socket.write(`${header}\r\n`, 'latin1') - } - } else if (contentLength === null) { - socket.write('\r\n0\r\n\r\n', 'latin1') - } + socket + .setNoDelay(true) + .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { + cancelTimeout() - if (contentLength !== null && bytesWritten !== contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError() - } else { - process.emitWarning(new RequestContentLengthMismatchError()) - } - } + if (callback) { + const cb = callback + callback = null + cb(null, this) + } + }) + .on('error', function (err) { + cancelTimeout() - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - // istanbul ignore else: only for jest - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh() - } - } + if (callback) { + const cb = callback + callback = null + cb(err) + } + }) - resume(client) + return socket } +} - destroy (err) { - const { socket, client } = this - - socket[kWriting] = false +function setupTimeout (onConnectTimeout, timeout) { + if (!timeout) { + return () => {} + } - if (err) { - assert(client[kRunning] <= 1, 'pipeline should only contain this request') - util.destroy(socket, err) - } + let s1 = null + let s2 = null + const timeoutId = setTimeout(() => { + // setImmediate is added to make sure that we priotorise socket error events over timeouts + s1 = setImmediate(() => { + if (process.platform === 'win32') { + // Windows needs an extra setImmediate probably due to implementation differences in the socket logic + s2 = setImmediate(() => onConnectTimeout()) + } else { + onConnectTimeout() + } + }) + }, timeout) + return () => { + clearTimeout(timeoutId) + clearImmediate(s1) + clearImmediate(s2) } } -function errorRequest (client, request, err) { - try { - request.onError(err) - assert(request.aborted) - } catch (err) { - client.emit('error', err) - } +function onConnectTimeout (socket) { + util.destroy(socket, new ConnectTimeoutError()) } -module.exports = Client +module.exports = buildConnector /***/ }), -/***/ 56436: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ 48045: +/***/ ((module) => { "use strict"; -/* istanbul ignore file: only for Node 12 */ +class UndiciError extends Error { + constructor (message) { + super(message) + this.name = 'UndiciError' + this.code = 'UND_ERR' + } +} -const { kConnected, kSize } = __nccwpck_require__(72785) +class ConnectTimeoutError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, ConnectTimeoutError) + this.name = 'ConnectTimeoutError' + this.message = message || 'Connect Timeout Error' + this.code = 'UND_ERR_CONNECT_TIMEOUT' + } +} -class CompatWeakRef { - constructor (value) { - this.value = value +class HeadersTimeoutError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, HeadersTimeoutError) + this.name = 'HeadersTimeoutError' + this.message = message || 'Headers Timeout Error' + this.code = 'UND_ERR_HEADERS_TIMEOUT' } +} - deref () { - return this.value[kConnected] === 0 && this.value[kSize] === 0 - ? undefined - : this.value +class HeadersOverflowError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, HeadersOverflowError) + this.name = 'HeadersOverflowError' + this.message = message || 'Headers Overflow Error' + this.code = 'UND_ERR_HEADERS_OVERFLOW' } } -class CompatFinalizer { - constructor (finalizer) { - this.finalizer = finalizer +class BodyTimeoutError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, BodyTimeoutError) + this.name = 'BodyTimeoutError' + this.message = message || 'Body Timeout Error' + this.code = 'UND_ERR_BODY_TIMEOUT' } +} - register (dispatcher, key) { - if (dispatcher.on) { - dispatcher.on('disconnect', () => { - if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { - this.finalizer(key) - } - }) - } +class ResponseStatusCodeError extends UndiciError { + constructor (message, statusCode, headers, body) { + super(message) + Error.captureStackTrace(this, ResponseStatusCodeError) + this.name = 'ResponseStatusCodeError' + this.message = message || 'Response Status Code Error' + this.code = 'UND_ERR_RESPONSE_STATUS_CODE' + this.body = body + this.status = statusCode + this.statusCode = statusCode + this.headers = headers } } -module.exports = function () { - // FIXME: remove workaround when the Node bug is fixed - // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 - if (process.env.NODE_V8_COVERAGE) { - return { - WeakRef: CompatWeakRef, - FinalizationRegistry: CompatFinalizer - } +class InvalidArgumentError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, InvalidArgumentError) + this.name = 'InvalidArgumentError' + this.message = message || 'Invalid Argument Error' + this.code = 'UND_ERR_INVALID_ARG' } - return { - WeakRef: global.WeakRef || CompatWeakRef, - FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer +} + +class InvalidReturnValueError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, InvalidReturnValueError) + this.name = 'InvalidReturnValueError' + this.message = message || 'Invalid Return Value Error' + this.code = 'UND_ERR_INVALID_RETURN_VALUE' } } +class RequestAbortedError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, RequestAbortedError) + this.name = 'AbortError' + this.message = message || 'Request aborted' + this.code = 'UND_ERR_ABORTED' + } +} -/***/ }), +class InformationalError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, InformationalError) + this.name = 'InformationalError' + this.message = message || 'Request information' + this.code = 'UND_ERR_INFO' + } +} -/***/ 20663: -/***/ ((module) => { +class RequestContentLengthMismatchError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, RequestContentLengthMismatchError) + this.name = 'RequestContentLengthMismatchError' + this.message = message || 'Request body length does not match content-length header' + this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH' + } +} -"use strict"; +class ResponseContentLengthMismatchError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, ResponseContentLengthMismatchError) + this.name = 'ResponseContentLengthMismatchError' + this.message = message || 'Response body length does not match content-length header' + this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH' + } +} + +class ClientDestroyedError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, ClientDestroyedError) + this.name = 'ClientDestroyedError' + this.message = message || 'The client is destroyed' + this.code = 'UND_ERR_DESTROYED' + } +} +class ClientClosedError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, ClientClosedError) + this.name = 'ClientClosedError' + this.message = message || 'The client is closed' + this.code = 'UND_ERR_CLOSED' + } +} -// https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size -const maxAttributeValueSize = 1024 +class SocketError extends UndiciError { + constructor (message, socket) { + super(message) + Error.captureStackTrace(this, SocketError) + this.name = 'SocketError' + this.message = message || 'Socket error' + this.code = 'UND_ERR_SOCKET' + this.socket = socket + } +} -// https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size -const maxNameValuePairSize = 4096 +class NotSupportedError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, NotSupportedError) + this.name = 'NotSupportedError' + this.message = message || 'Not supported error' + this.code = 'UND_ERR_NOT_SUPPORTED' + } +} + +class BalancedPoolMissingUpstreamError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, NotSupportedError) + this.name = 'MissingUpstreamError' + this.message = message || 'No upstream has been added to the BalancedPool' + this.code = 'UND_ERR_BPL_MISSING_UPSTREAM' + } +} + +class HTTPParserError extends Error { + constructor (message, code, data) { + super(message) + Error.captureStackTrace(this, HTTPParserError) + this.name = 'HTTPParserError' + this.code = code ? `HPE_${code}` : undefined + this.data = data ? data.toString() : undefined + } +} + +class ResponseExceededMaxSizeError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, ResponseExceededMaxSizeError) + this.name = 'ResponseExceededMaxSizeError' + this.message = message || 'Response content exceeded max size' + this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE' + } +} module.exports = { - maxAttributeValueSize, - maxNameValuePairSize + HTTPParserError, + UndiciError, + HeadersTimeoutError, + HeadersOverflowError, + BodyTimeoutError, + RequestContentLengthMismatchError, + ConnectTimeoutError, + ResponseStatusCodeError, + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError, + ClientDestroyedError, + ClientClosedError, + InformationalError, + SocketError, + NotSupportedError, + ResponseContentLengthMismatchError, + BalancedPoolMissingUpstreamError, + ResponseExceededMaxSizeError } /***/ }), -/***/ 41724: +/***/ 62905: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { parseSetCookie } = __nccwpck_require__(24408) -const { stringify, getHeadersList } = __nccwpck_require__(43121) -const { webidl } = __nccwpck_require__(21744) -const { Headers } = __nccwpck_require__(10554) +const { + InvalidArgumentError, + NotSupportedError +} = __nccwpck_require__(48045) +const assert = __nccwpck_require__(39491) +const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = __nccwpck_require__(72785) +const util = __nccwpck_require__(83983) + +// tokenRegExp and headerCharRegex have been lifted from +// https://github.com/nodejs/node/blob/main/lib/_http_common.js /** - * @typedef {Object} Cookie - * @property {string} name - * @property {string} value - * @property {Date|number|undefined} expires - * @property {number|undefined} maxAge - * @property {string|undefined} domain - * @property {string|undefined} path - * @property {boolean|undefined} secure - * @property {boolean|undefined} httpOnly - * @property {'Strict'|'Lax'|'None'} sameSite - * @property {string[]} unparsed + * Verifies that the given val is a valid HTTP token + * per the rules defined in RFC 7230 + * See https://tools.ietf.org/html/rfc7230#section-3.2.6 */ +const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/ /** - * @param {Headers} headers - * @returns {Record} + * Matches if val contains an invalid field-vchar + * field-value = *( field-content / obs-fold ) + * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] + * field-vchar = VCHAR / obs-text */ -function getCookies (headers) { - webidl.argumentLengthCheck(arguments, 1, { header: 'getCookies' }) +const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/ + +// Verifies that a given path is valid does not contain control chars \x00 to \x20 +const invalidPathRegex = /[^\u0021-\u00ff]/ + +const kHandler = Symbol('handler') + +const channels = {} + +let extractBody + +try { + const diagnosticsChannel = __nccwpck_require__(67643) + channels.create = diagnosticsChannel.channel('undici:request:create') + channels.bodySent = diagnosticsChannel.channel('undici:request:bodySent') + channels.headers = diagnosticsChannel.channel('undici:request:headers') + channels.trailers = diagnosticsChannel.channel('undici:request:trailers') + channels.error = diagnosticsChannel.channel('undici:request:error') +} catch { + channels.create = { hasSubscribers: false } + channels.bodySent = { hasSubscribers: false } + channels.headers = { hasSubscribers: false } + channels.trailers = { hasSubscribers: false } + channels.error = { hasSubscribers: false } +} + +class Request { + constructor (origin, { + path, + method, + body, + headers, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError, + expectContinue + }, handler) { + if (typeof path !== 'string') { + throw new InvalidArgumentError('path must be a string') + } else if ( + path[0] !== '/' && + !(path.startsWith('http://') || path.startsWith('https://')) && + method !== 'CONNECT' + ) { + throw new InvalidArgumentError('path must be an absolute URL or start with a slash') + } else if (invalidPathRegex.exec(path) !== null) { + throw new InvalidArgumentError('invalid request path') + } - webidl.brandCheck(headers, Headers, { strict: false }) + if (typeof method !== 'string') { + throw new InvalidArgumentError('method must be a string') + } else if (tokenRegExp.exec(method) === null) { + throw new InvalidArgumentError('invalid request method') + } - const cookie = headers.get('cookie') - const out = {} + if (upgrade && typeof upgrade !== 'string') { + throw new InvalidArgumentError('upgrade must be a string') + } - if (!cookie) { - return out - } + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('invalid headersTimeout') + } - for (const piece of cookie.split(';')) { - const [name, ...value] = piece.split('=') + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('invalid bodyTimeout') + } - out[name.trim()] = value.join('=') - } + if (reset != null && typeof reset !== 'boolean') { + throw new InvalidArgumentError('invalid reset') + } - return out -} + if (expectContinue != null && typeof expectContinue !== 'boolean') { + throw new InvalidArgumentError('invalid expectContinue') + } -/** - * @param {Headers} headers - * @param {string} name - * @param {{ path?: string, domain?: string }|undefined} attributes - * @returns {void} - */ -function deleteCookie (headers, name, attributes) { - webidl.argumentLengthCheck(arguments, 2, { header: 'deleteCookie' }) + this.headersTimeout = headersTimeout - webidl.brandCheck(headers, Headers, { strict: false }) + this.bodyTimeout = bodyTimeout - name = webidl.converters.DOMString(name) - attributes = webidl.converters.DeleteCookieAttributes(attributes) + this.throwOnError = throwOnError === true - // Matches behavior of - // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278 - setCookie(headers, { - name, - value: '', - expires: new Date(0), - ...attributes - }) -} + this.method = method -/** - * @param {Headers} headers - * @returns {Cookie[]} - */ -function getSetCookies (headers) { - webidl.argumentLengthCheck(arguments, 1, { header: 'getSetCookies' }) + this.abort = null - webidl.brandCheck(headers, Headers, { strict: false }) + if (body == null) { + this.body = null + } else if (util.isStream(body)) { + this.body = body - const cookies = getHeadersList(headers).cookies + const rState = this.body._readableState + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy () { + util.destroy(this) + } + this.body.on('end', this.endHandler) + } - if (!cookies) { - return [] - } + this.errorHandler = err => { + if (this.abort) { + this.abort(err) + } else { + this.error = err + } + } + this.body.on('error', this.errorHandler) + } else if (util.isBuffer(body)) { + this.body = body.byteLength ? body : null + } else if (ArrayBuffer.isView(body)) { + this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null + } else if (body instanceof ArrayBuffer) { + this.body = body.byteLength ? Buffer.from(body) : null + } else if (typeof body === 'string') { + this.body = body.length ? Buffer.from(body) : null + } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { + this.body = body + } else { + throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') + } - // In older versions of undici, cookies is a list of name:value. - return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)) -} + this.completed = false -/** - * @param {Headers} headers - * @param {Cookie} cookie - * @returns {void} - */ -function setCookie (headers, cookie) { - webidl.argumentLengthCheck(arguments, 2, { header: 'setCookie' }) + this.aborted = false - webidl.brandCheck(headers, Headers, { strict: false }) + this.upgrade = upgrade || null - cookie = webidl.converters.Cookie(cookie) + this.path = query ? util.buildURL(path, query) : path - const str = stringify(cookie) + this.origin = origin - if (str) { - headers.append('Set-Cookie', stringify(cookie)) - } -} + this.idempotent = idempotent == null + ? method === 'HEAD' || method === 'GET' + : idempotent -webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'path', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'domain', - defaultValue: null - } -]) + this.blocking = blocking == null ? false : blocking -webidl.converters.Cookie = webidl.dictionaryConverter([ - { - converter: webidl.converters.DOMString, - key: 'name' - }, - { - converter: webidl.converters.DOMString, - key: 'value' - }, - { - converter: webidl.nullableConverter((value) => { - if (typeof value === 'number') { - return webidl.converters['unsigned long long'](value) - } + this.reset = reset == null ? null : reset - return new Date(value) - }), - key: 'expires', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters['long long']), - key: 'maxAge', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'domain', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'path', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: 'secure', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: 'httpOnly', - defaultValue: null - }, - { - converter: webidl.converters.USVString, - key: 'sameSite', - allowedValues: ['Strict', 'Lax', 'None'] - }, - { - converter: webidl.sequenceConverter(webidl.converters.DOMString), - key: 'unparsed', - defaultValue: [] - } -]) + this.host = null -module.exports = { - getCookies, - deleteCookie, - getSetCookies, - setCookie -} + this.contentLength = null + this.contentType = null -/***/ }), + this.headers = '' -/***/ 24408: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + // Only for H2 + this.expectContinue = expectContinue != null ? expectContinue : false -"use strict"; + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError('headers array must be even') + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(this, headers[i], headers[i + 1]) + } + } else if (headers && typeof headers === 'object') { + const keys = Object.keys(headers) + for (let i = 0; i < keys.length; i++) { + const key = keys[i] + processHeader(this, key, headers[key]) + } + } else if (headers != null) { + throw new InvalidArgumentError('headers must be an object or an array') + } + if (util.isFormDataLike(this.body)) { + if (util.nodeMajor < 16 || (util.nodeMajor === 16 && util.nodeMinor < 8)) { + throw new InvalidArgumentError('Form-Data bodies are only supported in node v16.8 and newer.') + } -const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(20663) -const { isCTLExcludingHtab } = __nccwpck_require__(43121) -const { collectASequenceOfCodePointsFast } = __nccwpck_require__(685) -const assert = __nccwpck_require__(39491) + if (!extractBody) { + extractBody = (__nccwpck_require__(41472).extractBody) + } -/** - * @description Parses the field-value attributes of a set-cookie header string. - * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 - * @param {string} header - * @returns if the header is invalid, null will be returned - */ -function parseSetCookie (header) { - // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F - // character (CTL characters excluding HTAB): Abort these steps and - // ignore the set-cookie-string entirely. - if (isCTLExcludingHtab(header)) { - return null - } + const [bodyStream, contentType] = extractBody(body) + if (this.contentType == null) { + this.contentType = contentType + this.headers += `content-type: ${contentType}\r\n` + } + this.body = bodyStream.stream + this.contentLength = bodyStream.length + } else if (util.isBlobLike(body) && this.contentType == null && body.type) { + this.contentType = body.type + this.headers += `content-type: ${body.type}\r\n` + } - let nameValuePair = '' - let unparsedAttributes = '' - let name = '' - let value = '' + util.validateHandler(handler, method, upgrade) - // 2. If the set-cookie-string contains a %x3B (";") character: - if (header.includes(';')) { - // 1. The name-value-pair string consists of the characters up to, - // but not including, the first %x3B (";"), and the unparsed- - // attributes consist of the remainder of the set-cookie-string - // (including the %x3B (";") in question). - const position = { position: 0 } + this.servername = util.getServerName(this.host) - nameValuePair = collectASequenceOfCodePointsFast(';', header, position) - unparsedAttributes = header.slice(position.position) - } else { - // Otherwise: + this[kHandler] = handler - // 1. The name-value-pair string consists of all the characters - // contained in the set-cookie-string, and the unparsed- - // attributes is the empty string. - nameValuePair = header + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }) + } } - // 3. If the name-value-pair string lacks a %x3D ("=") character, then - // the name string is empty, and the value string is the value of - // name-value-pair. - if (!nameValuePair.includes('=')) { - value = nameValuePair - } else { - // Otherwise, the name string consists of the characters up to, but - // not including, the first %x3D ("=") character, and the (possibly - // empty) value string consists of the characters after the first - // %x3D ("=") character. - const position = { position: 0 } - name = collectASequenceOfCodePointsFast( - '=', - nameValuePair, - position - ) - value = nameValuePair.slice(position.position + 1) + onBodySent (chunk) { + if (this[kHandler].onBodySent) { + try { + this[kHandler].onBodySent(chunk) + } catch (err) { + this.onError(err) + } + } } - // 4. Remove any leading or trailing WSP characters from the name - // string and the value string. - name = name.trim() - value = value.trim() + onRequestSent () { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }) + } - // 5. If the sum of the lengths of the name string and the value string - // is more than 4096 octets, abort these steps and ignore the set- - // cookie-string entirely. - if (name.length + value.length > maxNameValuePairSize) { - return null + if (this[kHandler].onRequestSent) { + try { + this[kHandler].onRequestSent() + } catch (err) { + this.onError(err) + } + } } - // 6. The cookie-name is the name string, and the cookie-value is the - // value string. - return { - name, value, ...parseUnparsedAttributes(unparsedAttributes) - } -} + onConnect (abort) { + assert(!this.aborted) + assert(!this.completed) -/** - * Parses the remaining attributes of a set-cookie header - * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 - * @param {string} unparsedAttributes - * @param {[Object.]={}} cookieAttributeList - */ -function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) { - // 1. If the unparsed-attributes string is empty, skip the rest of - // these steps. - if (unparsedAttributes.length === 0) { - return cookieAttributeList + if (this.error) { + abort(this.error) + } else { + this.abort = abort + return this[kHandler].onConnect(abort) + } } - // 2. Discard the first character of the unparsed-attributes (which - // will be a %x3B (";") character). - assert(unparsedAttributes[0] === ';') - unparsedAttributes = unparsedAttributes.slice(1) - - let cookieAv = '' + onHeaders (statusCode, headers, resume, statusText) { + assert(!this.aborted) + assert(!this.completed) - // 3. If the remaining unparsed-attributes contains a %x3B (";") - // character: - if (unparsedAttributes.includes(';')) { - // 1. Consume the characters of the unparsed-attributes up to, but - // not including, the first %x3B (";") character. - cookieAv = collectASequenceOfCodePointsFast( - ';', - unparsedAttributes, - { position: 0 } - ) - unparsedAttributes = unparsedAttributes.slice(cookieAv.length) - } else { - // Otherwise: + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) + } - // 1. Consume the remainder of the unparsed-attributes. - cookieAv = unparsedAttributes - unparsedAttributes = '' + return this[kHandler].onHeaders(statusCode, headers, resume, statusText) } - // Let the cookie-av string be the characters consumed in this step. - - let attributeName = '' - let attributeValue = '' - - // 4. If the cookie-av string contains a %x3D ("=") character: - if (cookieAv.includes('=')) { - // 1. The (possibly empty) attribute-name string consists of the - // characters up to, but not including, the first %x3D ("=") - // character, and the (possibly empty) attribute-value string - // consists of the characters after the first %x3D ("=") - // character. - const position = { position: 0 } - - attributeName = collectASequenceOfCodePointsFast( - '=', - cookieAv, - position - ) - attributeValue = cookieAv.slice(position.position + 1) - } else { - // Otherwise: + onData (chunk) { + assert(!this.aborted) + assert(!this.completed) - // 1. The attribute-name string consists of the entire cookie-av - // string, and the attribute-value string is empty. - attributeName = cookieAv + return this[kHandler].onData(chunk) } - // 5. Remove any leading or trailing WSP characters from the attribute- - // name string and the attribute-value string. - attributeName = attributeName.trim() - attributeValue = attributeValue.trim() + onUpgrade (statusCode, headers, socket) { + assert(!this.aborted) + assert(!this.completed) - // 6. If the attribute-value is longer than 1024 octets, ignore the - // cookie-av string and return to Step 1 of this algorithm. - if (attributeValue.length > maxAttributeValueSize) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + return this[kHandler].onUpgrade(statusCode, headers, socket) } - // 7. Process the attribute-name and attribute-value according to the - // requirements in the following subsections. (Notice that - // attributes with unrecognized attribute-names are ignored.) - const attributeNameLowercase = attributeName.toLowerCase() + onComplete (trailers) { + this.onFinally() - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1 - // If the attribute-name case-insensitively matches the string - // "Expires", the user agent MUST process the cookie-av as follows. - if (attributeNameLowercase === 'expires') { - // 1. Let the expiry-time be the result of parsing the attribute-value - // as cookie-date (see Section 5.1.1). - const expiryTime = new Date(attributeValue) + assert(!this.aborted) - // 2. If the attribute-value failed to parse as a cookie date, ignore - // the cookie-av. + this.completed = true + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }) + } + return this[kHandler].onComplete(trailers) + } - cookieAttributeList.expires = expiryTime - } else if (attributeNameLowercase === 'max-age') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2 - // If the attribute-name case-insensitively matches the string "Max- - // Age", the user agent MUST process the cookie-av as follows. + onError (error) { + this.onFinally() - // 1. If the first character of the attribute-value is not a DIGIT or a - // "-" character, ignore the cookie-av. - const charCode = attributeValue.charCodeAt(0) + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }) + } - if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + if (this.aborted) { + return } + this.aborted = true + return this[kHandler].onError(error) + } - // 2. If the remainder of attribute-value contains a non-DIGIT - // character, ignore the cookie-av. - if (!/^\d+$/.test(attributeValue)) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + onFinally () { + if (this.errorHandler) { + this.body.off('error', this.errorHandler) + this.errorHandler = null } - // 3. Let delta-seconds be the attribute-value converted to an integer. - const deltaSeconds = Number(attributeValue) + if (this.endHandler) { + this.body.off('end', this.endHandler) + this.endHandler = null + } + } - // 4. Let cookie-age-limit be the maximum age of the cookie (which - // SHOULD be 400 days or less, see Section 4.1.2.2). + // TODO: adjust to support H2 + addHeader (key, value) { + processHeader(this, key, value) + return this + } - // 5. Set delta-seconds to the smaller of its present value and cookie- - // age-limit. - // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs) + static [kHTTP1BuildRequest] (origin, opts, handler) { + // TODO: Migrate header parsing here, to make Requests + // HTTP agnostic + return new Request(origin, opts, handler) + } - // 6. If delta-seconds is less than or equal to zero (0), let expiry- - // time be the earliest representable date and time. Otherwise, let - // the expiry-time be the current date and time plus delta-seconds - // seconds. - // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds + static [kHTTP2BuildRequest] (origin, opts, handler) { + const headers = opts.headers + opts = { ...opts, headers: null } - // 7. Append an attribute to the cookie-attribute-list with an - // attribute-name of Max-Age and an attribute-value of expiry-time. - cookieAttributeList.maxAge = deltaSeconds - } else if (attributeNameLowercase === 'domain') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3 - // If the attribute-name case-insensitively matches the string "Domain", - // the user agent MUST process the cookie-av as follows. + const request = new Request(origin, opts, handler) - // 1. Let cookie-domain be the attribute-value. - let cookieDomain = attributeValue + request.headers = {} - // 2. If cookie-domain starts with %x2E ("."), let cookie-domain be - // cookie-domain without its leading %x2E ("."). - if (cookieDomain[0] === '.') { - cookieDomain = cookieDomain.slice(1) + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError('headers array must be even') + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(request, headers[i], headers[i + 1], true) + } + } else if (headers && typeof headers === 'object') { + const keys = Object.keys(headers) + for (let i = 0; i < keys.length; i++) { + const key = keys[i] + processHeader(request, key, headers[key], true) + } + } else if (headers != null) { + throw new InvalidArgumentError('headers must be an object or an array') } - // 3. Convert the cookie-domain to lower case. - cookieDomain = cookieDomain.toLowerCase() + return request + } - // 4. Append an attribute to the cookie-attribute-list with an - // attribute-name of Domain and an attribute-value of cookie-domain. - cookieAttributeList.domain = cookieDomain - } else if (attributeNameLowercase === 'path') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4 - // If the attribute-name case-insensitively matches the string "Path", - // the user agent MUST process the cookie-av as follows. + static [kHTTP2CopyHeaders] (raw) { + const rawHeaders = raw.split('\r\n') + const headers = {} - // 1. If the attribute-value is empty or if the first character of the - // attribute-value is not %x2F ("/"): - let cookiePath = '' - if (attributeValue.length === 0 || attributeValue[0] !== '/') { - // 1. Let cookie-path be the default-path. - cookiePath = '/' - } else { - // Otherwise: + for (const header of rawHeaders) { + const [key, value] = header.split(': ') - // 1. Let cookie-path be the attribute-value. - cookiePath = attributeValue + if (value == null || value.length === 0) continue + + if (headers[key]) headers[key] += `,${value}` + else headers[key] = value } - // 2. Append an attribute to the cookie-attribute-list with an - // attribute-name of Path and an attribute-value of cookie-path. - cookieAttributeList.path = cookiePath - } else if (attributeNameLowercase === 'secure') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5 - // If the attribute-name case-insensitively matches the string "Secure", - // the user agent MUST append an attribute to the cookie-attribute-list - // with an attribute-name of Secure and an empty attribute-value. + return headers + } +} - cookieAttributeList.secure = true - } else if (attributeNameLowercase === 'httponly') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6 - // If the attribute-name case-insensitively matches the string - // "HttpOnly", the user agent MUST append an attribute to the cookie- - // attribute-list with an attribute-name of HttpOnly and an empty - // attribute-value. +function processHeaderValue (key, val, skipAppend) { + if (val && typeof val === 'object') { + throw new InvalidArgumentError(`invalid ${key} header`) + } - cookieAttributeList.httpOnly = true - } else if (attributeNameLowercase === 'samesite') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7 - // If the attribute-name case-insensitively matches the string - // "SameSite", the user agent MUST process the cookie-av as follows: + val = val != null ? `${val}` : '' - // 1. Let enforcement be "Default". - let enforcement = 'Default' + if (headerCharRegex.exec(val) !== null) { + throw new InvalidArgumentError(`invalid ${key} header`) + } - const attributeValueLowercase = attributeValue.toLowerCase() - // 2. If cookie-av's attribute-value is a case-insensitive match for - // "None", set enforcement to "None". - if (attributeValueLowercase.includes('none')) { - enforcement = 'None' - } + return skipAppend ? val : `${key}: ${val}\r\n` +} - // 3. If cookie-av's attribute-value is a case-insensitive match for - // "Strict", set enforcement to "Strict". - if (attributeValueLowercase.includes('strict')) { - enforcement = 'Strict' - } +function processHeader (request, key, val, skipAppend = false) { + if (val && (typeof val === 'object' && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`) + } else if (val === undefined) { + return + } - // 4. If cookie-av's attribute-value is a case-insensitive match for - // "Lax", set enforcement to "Lax". - if (attributeValueLowercase.includes('lax')) { - enforcement = 'Lax' + if ( + request.host === null && + key.length === 4 && + key.toLowerCase() === 'host' + ) { + if (headerCharRegex.exec(val) !== null) { + throw new InvalidArgumentError(`invalid ${key} header`) } - - // 5. Append an attribute to the cookie-attribute-list with an - // attribute-name of "SameSite" and an attribute-value of - // enforcement. - cookieAttributeList.sameSite = enforcement + // Consumed by Client + request.host = val + } else if ( + request.contentLength === null && + key.length === 14 && + key.toLowerCase() === 'content-length' + ) { + request.contentLength = parseInt(val, 10) + if (!Number.isFinite(request.contentLength)) { + throw new InvalidArgumentError('invalid content-length header') + } + } else if ( + request.contentType === null && + key.length === 12 && + key.toLowerCase() === 'content-type' + ) { + request.contentType = val + if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend) + else request.headers += processHeaderValue(key, val) + } else if ( + key.length === 17 && + key.toLowerCase() === 'transfer-encoding' + ) { + throw new InvalidArgumentError('invalid transfer-encoding header') + } else if ( + key.length === 10 && + key.toLowerCase() === 'connection' + ) { + const value = typeof val === 'string' ? val.toLowerCase() : null + if (value !== 'close' && value !== 'keep-alive') { + throw new InvalidArgumentError('invalid connection header') + } else if (value === 'close') { + request.reset = true + } + } else if ( + key.length === 10 && + key.toLowerCase() === 'keep-alive' + ) { + throw new InvalidArgumentError('invalid keep-alive header') + } else if ( + key.length === 7 && + key.toLowerCase() === 'upgrade' + ) { + throw new InvalidArgumentError('invalid upgrade header') + } else if ( + key.length === 6 && + key.toLowerCase() === 'expect' + ) { + throw new NotSupportedError('expect header not supported') + } else if (tokenRegExp.exec(key) === null) { + throw new InvalidArgumentError('invalid header key') } else { - cookieAttributeList.unparsed ??= [] - - cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`) + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + if (skipAppend) { + if (request.headers[key]) request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}` + else request.headers[key] = processHeaderValue(key, val[i], skipAppend) + } else { + request.headers += processHeaderValue(key, val[i]) + } + } + } else { + if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend) + else request.headers += processHeaderValue(key, val) + } } - - // 8. Return to Step 1 of this algorithm. - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) } +module.exports = Request + + +/***/ }), + +/***/ 72785: +/***/ ((module) => { + module.exports = { - parseSetCookie, - parseUnparsedAttributes + kClose: Symbol('close'), + kDestroy: Symbol('destroy'), + kDispatch: Symbol('dispatch'), + kUrl: Symbol('url'), + kWriting: Symbol('writing'), + kResuming: Symbol('resuming'), + kQueue: Symbol('queue'), + kConnect: Symbol('connect'), + kConnecting: Symbol('connecting'), + kHeadersList: Symbol('headers list'), + kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'), + kKeepAliveMaxTimeout: Symbol('max keep alive timeout'), + kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'), + kKeepAliveTimeoutValue: Symbol('keep alive timeout'), + kKeepAlive: Symbol('keep alive'), + kHeadersTimeout: Symbol('headers timeout'), + kBodyTimeout: Symbol('body timeout'), + kServerName: Symbol('server name'), + kLocalAddress: Symbol('local address'), + kHost: Symbol('host'), + kNoRef: Symbol('no ref'), + kBodyUsed: Symbol('used'), + kRunning: Symbol('running'), + kBlocking: Symbol('blocking'), + kPending: Symbol('pending'), + kSize: Symbol('size'), + kBusy: Symbol('busy'), + kQueued: Symbol('queued'), + kFree: Symbol('free'), + kConnected: Symbol('connected'), + kClosed: Symbol('closed'), + kNeedDrain: Symbol('need drain'), + kReset: Symbol('reset'), + kDestroyed: Symbol.for('nodejs.stream.destroyed'), + kMaxHeadersSize: Symbol('max headers size'), + kRunningIdx: Symbol('running index'), + kPendingIdx: Symbol('pending index'), + kError: Symbol('error'), + kClients: Symbol('clients'), + kClient: Symbol('client'), + kParser: Symbol('parser'), + kOnDestroyed: Symbol('destroy callbacks'), + kPipelining: Symbol('pipelining'), + kSocket: Symbol('socket'), + kHostHeader: Symbol('host header'), + kConnector: Symbol('connector'), + kStrictContentLength: Symbol('strict content length'), + kMaxRedirections: Symbol('maxRedirections'), + kMaxRequests: Symbol('maxRequestsPerClient'), + kProxy: Symbol('proxy agent options'), + kCounter: Symbol('socket request counter'), + kInterceptors: Symbol('dispatch interceptors'), + kMaxResponseSize: Symbol('max response size'), + kHTTP2Session: Symbol('http2Session'), + kHTTP2SessionState: Symbol('http2Session state'), + kHTTP2BuildRequest: Symbol('http2 build request'), + kHTTP1BuildRequest: Symbol('http1 build request'), + kHTTP2CopyHeaders: Symbol('http2 copy headers'), + kHTTPConnVersion: Symbol('http connection version') } /***/ }), -/***/ 43121: +/***/ 83983: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const assert = __nccwpck_require__(39491) -const { kHeadersList } = __nccwpck_require__(72785) +const { kDestroyed, kBodyUsed } = __nccwpck_require__(72785) +const { IncomingMessage } = __nccwpck_require__(13685) +const stream = __nccwpck_require__(12781) +const net = __nccwpck_require__(41808) +const { InvalidArgumentError } = __nccwpck_require__(48045) +const { Blob } = __nccwpck_require__(14300) +const nodeUtil = __nccwpck_require__(73837) +const { stringify } = __nccwpck_require__(63477) -function isCTLExcludingHtab (value) { - if (value.length === 0) { - return false +const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) + +function nop () {} + +function isStream (obj) { + return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function' +} + +// based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) +function isBlobLike (object) { + return (Blob && object instanceof Blob) || ( + object && + typeof object === 'object' && + (typeof object.stream === 'function' || + typeof object.arrayBuffer === 'function') && + /^(Blob|File)$/.test(object[Symbol.toStringTag]) + ) +} + +function buildURL (url, queryParams) { + if (url.includes('?') || url.includes('#')) { + throw new Error('Query params cannot be passed when url already contains "?" or "#".') } - for (const char of value) { - const code = char.charCodeAt(0) + const stringified = stringify(queryParams) - if ( - (code >= 0x00 || code <= 0x08) || - (code >= 0x0A || code <= 0x1F) || - code === 0x7F - ) { - return false - } + if (stringified) { + url += '?' + stringified } + + return url } -/** - CHAR = - token = 1* - separators = "(" | ")" | "<" | ">" | "@" - | "," | ";" | ":" | "\" | <"> - | "/" | "[" | "]" | "?" | "=" - | "{" | "}" | SP | HT - * @param {string} name - */ -function validateCookieName (name) { - for (const char of name) { - const code = char.charCodeAt(0) +function parseURL (url) { + if (typeof url === 'string') { + url = new URL(url) - if ( - (code <= 0x20 || code > 0x7F) || - char === '(' || - char === ')' || - char === '>' || - char === '<' || - char === '@' || - char === ',' || - char === ';' || - char === ':' || - char === '\\' || - char === '"' || - char === '/' || - char === '[' || - char === ']' || - char === '?' || - char === '=' || - char === '{' || - char === '}' - ) { - throw new Error('Invalid cookie name') + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') } + + return url } -} -/** - cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) - cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E - ; US-ASCII characters excluding CTLs, - ; whitespace DQUOTE, comma, semicolon, - ; and backslash - * @param {string} value - */ -function validateCookieValue (value) { - for (const char of value) { - const code = char.charCodeAt(0) + if (!url || typeof url !== 'object') { + throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.') + } - if ( - code < 0x21 || // exclude CTLs (0-31) - code === 0x22 || - code === 0x2C || - code === 0x3B || - code === 0x5C || - code > 0x7E // non-ascii - ) { - throw new Error('Invalid header value') - } + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') } -} -/** - * path-value = - * @param {string} path - */ -function validateCookiePath (path) { - for (const char of path) { - const code = char.charCodeAt(0) + if (!(url instanceof URL)) { + if (url.port != null && url.port !== '' && !Number.isFinite(parseInt(url.port))) { + throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.') + } - if (code < 0x21 || char === ';') { - throw new Error('Invalid cookie path') + if (url.path != null && typeof url.path !== 'string') { + throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.') + } + + if (url.pathname != null && typeof url.pathname !== 'string') { + throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.') + } + + if (url.hostname != null && typeof url.hostname !== 'string') { + throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.') + } + + if (url.origin != null && typeof url.origin !== 'string') { + throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.') + } + + const port = url.port != null + ? url.port + : (url.protocol === 'https:' ? 443 : 80) + let origin = url.origin != null + ? url.origin + : `${url.protocol}//${url.hostname}:${port}` + let path = url.path != null + ? url.path + : `${url.pathname || ''}${url.search || ''}` + + if (origin.endsWith('/')) { + origin = origin.substring(0, origin.length - 1) + } + + if (path && !path.startsWith('/')) { + path = `/${path}` } + // new URL(path, origin) is unsafe when `path` contains an absolute URL + // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL: + // If first parameter is a relative URL, second param is required, and will be used as the base URL. + // If first parameter is an absolute URL, a given second param will be ignored. + url = new URL(origin + path) } + + return url } -/** - * I have no idea why these values aren't allowed to be honest, - * but Deno tests these. - Khafra - * @param {string} domain - */ -function validateCookieDomain (domain) { - if ( - domain.startsWith('-') || - domain.endsWith('.') || - domain.endsWith('-') - ) { - throw new Error('Invalid cookie domain') +function parseOrigin (url) { + url = parseURL(url) + + if (url.pathname !== '/' || url.search || url.hash) { + throw new InvalidArgumentError('invalid url') } -} -/** - * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1 - * @param {number|Date} date - IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT - ; fixed length/zone/capitalization subset of the format - ; see Section 3.3 of [RFC5322] + return url +} - day-name = %x4D.6F.6E ; "Mon", case-sensitive - / %x54.75.65 ; "Tue", case-sensitive - / %x57.65.64 ; "Wed", case-sensitive - / %x54.68.75 ; "Thu", case-sensitive - / %x46.72.69 ; "Fri", case-sensitive - / %x53.61.74 ; "Sat", case-sensitive - / %x53.75.6E ; "Sun", case-sensitive - date1 = day SP month SP year - ; e.g., 02 Jun 1982 +function getHostname (host) { + if (host[0] === '[') { + const idx = host.indexOf(']') - day = 2DIGIT - month = %x4A.61.6E ; "Jan", case-sensitive - / %x46.65.62 ; "Feb", case-sensitive - / %x4D.61.72 ; "Mar", case-sensitive - / %x41.70.72 ; "Apr", case-sensitive - / %x4D.61.79 ; "May", case-sensitive - / %x4A.75.6E ; "Jun", case-sensitive - / %x4A.75.6C ; "Jul", case-sensitive - / %x41.75.67 ; "Aug", case-sensitive - / %x53.65.70 ; "Sep", case-sensitive - / %x4F.63.74 ; "Oct", case-sensitive - / %x4E.6F.76 ; "Nov", case-sensitive - / %x44.65.63 ; "Dec", case-sensitive - year = 4DIGIT + assert(idx !== -1) + return host.substr(1, idx - 1) + } - GMT = %x47.4D.54 ; "GMT", case-sensitive + const idx = host.indexOf(':') + if (idx === -1) return host - time-of-day = hour ":" minute ":" second - ; 00:00:00 - 23:59:60 (leap second) + return host.substr(0, idx) +} - hour = 2DIGIT - minute = 2DIGIT - second = 2DIGIT - */ -function toIMFDate (date) { - if (typeof date === 'number') { - date = new Date(date) +// IP addresses are not valid server names per RFC6066 +// > Currently, the only server names supported are DNS hostnames +function getServerName (host) { + if (!host) { + return null } - const days = [ - 'Sun', 'Mon', 'Tue', 'Wed', - 'Thu', 'Fri', 'Sat' - ] + assert.strictEqual(typeof host, 'string') + + const servername = getHostname(host) + if (net.isIP(servername)) { + return '' + } - const months = [ - 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' - ] + return servername +} - const dayName = days[date.getUTCDay()] - const day = date.getUTCDate().toString().padStart(2, '0') - const month = months[date.getUTCMonth()] - const year = date.getUTCFullYear() - const hour = date.getUTCHours().toString().padStart(2, '0') - const minute = date.getUTCMinutes().toString().padStart(2, '0') - const second = date.getUTCSeconds().toString().padStart(2, '0') +function deepClone (obj) { + return JSON.parse(JSON.stringify(obj)) +} - return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT` +function isAsyncIterable (obj) { + return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function') } -/** - max-age-av = "Max-Age=" non-zero-digit *DIGIT - ; In practice, both expires-av and max-age-av - ; are limited to dates representable by the - ; user agent. - * @param {number} maxAge - */ -function validateCookieMaxAge (maxAge) { - if (maxAge < 0) { - throw new Error('Invalid cookie max-age') - } +function isIterable (obj) { + return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function')) } -/** - * @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1 - * @param {import('./index').Cookie} cookie - */ -function stringify (cookie) { - if (cookie.name.length === 0) { - return null +function bodyLength (body) { + if (body == null) { + return 0 + } else if (isStream(body)) { + const state = body._readableState + return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) + ? state.length + : null + } else if (isBlobLike(body)) { + return body.size != null ? body.size : null + } else if (isBuffer(body)) { + return body.byteLength } - validateCookieName(cookie.name) - validateCookieValue(cookie.value) + return null +} - const out = [`${cookie.name}=${cookie.value}`] +function isDestroyed (stream) { + return !stream || !!(stream.destroyed || stream[kDestroyed]) +} - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1 - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2 - if (cookie.name.startsWith('__Secure-')) { - cookie.secure = true - } +function isReadableAborted (stream) { + const state = stream && stream._readableState + return isDestroyed(stream) && state && !state.endEmitted +} - if (cookie.name.startsWith('__Host-')) { - cookie.secure = true - cookie.domain = null - cookie.path = '/' +function destroy (stream, err) { + if (stream == null || !isStream(stream) || isDestroyed(stream)) { + return } - if (cookie.secure) { - out.push('Secure') - } + if (typeof stream.destroy === 'function') { + if (Object.getPrototypeOf(stream).constructor === IncomingMessage) { + // See: https://github.com/nodejs/node/pull/38505/files + stream.socket = null + } - if (cookie.httpOnly) { - out.push('HttpOnly') + stream.destroy(err) + } else if (err) { + process.nextTick((stream, err) => { + stream.emit('error', err) + }, stream, err) } - if (typeof cookie.maxAge === 'number') { - validateCookieMaxAge(cookie.maxAge) - out.push(`Max-Age=${cookie.maxAge}`) + if (stream.destroyed !== true) { + stream[kDestroyed] = true } +} - if (cookie.domain) { - validateCookieDomain(cookie.domain) - out.push(`Domain=${cookie.domain}`) - } +const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/ +function parseKeepAliveTimeout (val) { + const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR) + return m ? parseInt(m[1], 10) * 1000 : null +} - if (cookie.path) { - validateCookiePath(cookie.path) - out.push(`Path=${cookie.path}`) - } +function parseHeaders (headers, obj = {}) { + // For H2 support + if (!Array.isArray(headers)) return headers - if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') { - out.push(`Expires=${toIMFDate(cookie.expires)}`) + for (let i = 0; i < headers.length; i += 2) { + const key = headers[i].toString().toLowerCase() + let val = obj[key] + + if (!val) { + if (Array.isArray(headers[i + 1])) { + obj[key] = headers[i + 1] + } else { + obj[key] = headers[i + 1].toString('utf8') + } + } else { + if (!Array.isArray(val)) { + val = [val] + obj[key] = val + } + val.push(headers[i + 1].toString('utf8')) + } } - if (cookie.sameSite) { - out.push(`SameSite=${cookie.sameSite}`) + // See https://github.com/nodejs/node/pull/46528 + if ('content-length' in obj && 'content-disposition' in obj) { + obj['content-disposition'] = Buffer.from(obj['content-disposition']).toString('latin1') } - for (const part of cookie.unparsed) { - if (!part.includes('=')) { - throw new Error('Invalid unparsed') - } + return obj +} - const [key, ...value] = part.split('=') +function parseRawHeaders (headers) { + const ret = [] + let hasContentLength = false + let contentDispositionIdx = -1 - out.push(`${key.trim()}=${value.join('=')}`) + for (let n = 0; n < headers.length; n += 2) { + const key = headers[n + 0].toString() + const val = headers[n + 1].toString('utf8') + + if (key.length === 14 && (key === 'content-length' || key.toLowerCase() === 'content-length')) { + ret.push(key, val) + hasContentLength = true + } else if (key.length === 19 && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) { + contentDispositionIdx = ret.push(key, val) - 1 + } else { + ret.push(key, val) + } } - return out.join('; ') + // See https://github.com/nodejs/node/pull/46528 + if (hasContentLength && contentDispositionIdx !== -1) { + ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString('latin1') + } + + return ret } -let kHeadersListNode +function isBuffer (buffer) { + // See, https://github.com/mcollina/undici/pull/319 + return buffer instanceof Uint8Array || Buffer.isBuffer(buffer) +} -function getHeadersList (headers) { - if (headers[kHeadersList]) { - return headers[kHeadersList] +function validateHandler (handler, method, upgrade) { + if (!handler || typeof handler !== 'object') { + throw new InvalidArgumentError('handler must be an object') } - if (!kHeadersListNode) { - kHeadersListNode = Object.getOwnPropertySymbols(headers).find( - (symbol) => symbol.description === 'headers list' - ) + if (typeof handler.onConnect !== 'function') { + throw new InvalidArgumentError('invalid onConnect method') + } - assert(kHeadersListNode, 'Headers cannot be parsed') + if (typeof handler.onError !== 'function') { + throw new InvalidArgumentError('invalid onError method') } - const headersList = headers[kHeadersListNode] - assert(headersList) + if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) { + throw new InvalidArgumentError('invalid onBodySent method') + } - return headersList -} + if (upgrade || method === 'CONNECT') { + if (typeof handler.onUpgrade !== 'function') { + throw new InvalidArgumentError('invalid onUpgrade method') + } + } else { + if (typeof handler.onHeaders !== 'function') { + throw new InvalidArgumentError('invalid onHeaders method') + } -module.exports = { - isCTLExcludingHtab, - stringify, - getHeadersList -} + if (typeof handler.onData !== 'function') { + throw new InvalidArgumentError('invalid onData method') + } + if (typeof handler.onComplete !== 'function') { + throw new InvalidArgumentError('invalid onComplete method') + } + } +} -/***/ }), +// A body is disturbed if it has been read from and it cannot +// be re-used without losing state or data. +function isDisturbed (body) { + return !!(body && ( + stream.isDisturbed + ? stream.isDisturbed(body) || body[kBodyUsed] // TODO (fix): Why is body[kBodyUsed] needed? + : body[kBodyUsed] || + body.readableDidRead || + (body._readableState && body._readableState.dataEmitted) || + isReadableAborted(body) + )) +} -/***/ 82067: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +function isErrored (body) { + return !!(body && ( + stream.isErrored + ? stream.isErrored(body) + : /state: 'errored'/.test(nodeUtil.inspect(body) + ))) +} -"use strict"; +function isReadable (body) { + return !!(body && ( + stream.isReadable + ? stream.isReadable(body) + : /state: 'readable'/.test(nodeUtil.inspect(body) + ))) +} +function getSocketInfo (socket) { + return { + localAddress: socket.localAddress, + localPort: socket.localPort, + remoteAddress: socket.remoteAddress, + remotePort: socket.remotePort, + remoteFamily: socket.remoteFamily, + timeout: socket.timeout, + bytesWritten: socket.bytesWritten, + bytesRead: socket.bytesRead + } +} -const net = __nccwpck_require__(41808) -const assert = __nccwpck_require__(39491) -const util = __nccwpck_require__(83983) -const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(48045) +async function * convertIterableToBuffer (iterable) { + for await (const chunk of iterable) { + yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk) + } +} -let tls // include tls conditionally since it is not always available +let ReadableStream +function ReadableStreamFrom (iterable) { + if (!ReadableStream) { + ReadableStream = (__nccwpck_require__(35356).ReadableStream) + } -// TODO: session re-use does not wait for the first -// connection to resolve the session and might therefore -// resolve the same servername multiple times even when -// re-use is enabled. + if (ReadableStream.from) { + return ReadableStream.from(convertIterableToBuffer(iterable)) + } -let SessionCache -// FIXME: remove workaround when the Node bug is fixed -// https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 -if (global.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) { - SessionCache = class WeakSessionCache { - constructor (maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions - this._sessionCache = new Map() - this._sessionRegistry = new global.FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return + let iterator + return new ReadableStream( + { + async start () { + iterator = iterable[Symbol.asyncIterator]() + }, + async pull (controller) { + const { done, value } = await iterator.next() + if (done) { + queueMicrotask(() => { + controller.close() + }) + } else { + const buf = Buffer.isBuffer(value) ? value : Buffer.from(value) + controller.enqueue(new Uint8Array(buf)) } + return controller.desiredSize > 0 + }, + async cancel (reason) { + await iterator.return() + } + }, + 0 + ) +} - const ref = this._sessionCache.get(key) - if (ref !== undefined && ref.deref() === undefined) { - this._sessionCache.delete(key) - } - }) - } +// The chunk should be a FormData instance and contains +// all the required methods. +function isFormDataLike (object) { + return ( + object && + typeof object === 'object' && + typeof object.append === 'function' && + typeof object.delete === 'function' && + typeof object.get === 'function' && + typeof object.getAll === 'function' && + typeof object.has === 'function' && + typeof object.set === 'function' && + object[Symbol.toStringTag] === 'FormData' + ) +} - get (sessionKey) { - const ref = this._sessionCache.get(sessionKey) - return ref ? ref.deref() : null +function throwIfAborted (signal) { + if (!signal) { return } + if (typeof signal.throwIfAborted === 'function') { + signal.throwIfAborted() + } else { + if (signal.aborted) { + // DOMException not available < v17.0.0 + const err = new Error('The operation was aborted') + err.name = 'AbortError' + throw err } + } +} - set (sessionKey, session) { - if (this._maxCachedSessions === 0) { - return - } - - this._sessionCache.set(sessionKey, new WeakRef(session)) - this._sessionRegistry.register(session, sessionKey) +let events +function addAbortListener (signal, listener) { + if (typeof Symbol.dispose === 'symbol') { + if (!events) { + events = __nccwpck_require__(82361) } - } -} else { - SessionCache = class SimpleSessionCache { - constructor (maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions - this._sessionCache = new Map() + if (typeof events.addAbortListener === 'function' && 'aborted' in signal) { + return events.addAbortListener(signal, listener) } + } + if ('addEventListener' in signal) { + signal.addEventListener('abort', listener, { once: true }) + return () => signal.removeEventListener('abort', listener) + } + signal.addListener('abort', listener) + return () => signal.removeListener('abort', listener) +} - get (sessionKey) { - return this._sessionCache.get(sessionKey) - } +const hasToWellFormed = !!String.prototype.toWellFormed - set (sessionKey, session) { - if (this._maxCachedSessions === 0) { - return - } +/** + * @param {string} val + */ +function toUSVString (val) { + if (hasToWellFormed) { + return `${val}`.toWellFormed() + } else if (nodeUtil.toUSVString) { + return nodeUtil.toUSVString(val) + } - if (this._sessionCache.size >= this._maxCachedSessions) { - // remove the oldest session - const { value: oldestKey } = this._sessionCache.keys().next() - this._sessionCache.delete(oldestKey) - } + return `${val}` +} - this._sessionCache.set(sessionKey, session) - } - } +const kEnumerableProperty = Object.create(null) +kEnumerableProperty.enumerable = true + +module.exports = { + kEnumerableProperty, + nop, + isDisturbed, + isErrored, + isReadable, + toUSVString, + isReadableAborted, + isBlobLike, + parseOrigin, + parseURL, + getServerName, + isStream, + isIterable, + isAsyncIterable, + isDestroyed, + parseRawHeaders, + parseHeaders, + parseKeepAliveTimeout, + destroy, + bodyLength, + deepClone, + ReadableStreamFrom, + isBuffer, + validateHandler, + getSocketInfo, + isFormDataLike, + buildURL, + throwIfAborted, + addAbortListener, + nodeMajor, + nodeMinor, + nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13) } -function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') - } - const options = { path: socketPath, ...opts } - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions) - timeout = timeout == null ? 10e3 : timeout - allowH2 = allowH2 != null ? allowH2 : false - return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket - if (protocol === 'https:') { - if (!tls) { - tls = __nccwpck_require__(24404) - } - servername = servername || options.servername || util.getServerName(host) || null +/***/ }), - const sessionKey = servername || hostname - const session = sessionCache.get(sessionKey) || null +/***/ 74839: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - assert(sessionKey) +"use strict"; - socket = tls.connect({ - highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... - ...options, - servername, - session, - localAddress, - // TODO(HTTP/2): Add support for h2c - ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], - socket: httpSocket, // upgrade socket connection - port: port || 443, - host: hostname - }) - socket - .on('session', function (session) { - // TODO (fix): Can a session become invalid once established? Don't think so? - sessionCache.set(sessionKey, session) - }) - } else { - assert(!httpSocket, 'httpSocket can only be sent on TLS update') - socket = net.connect({ - highWaterMark: 64 * 1024, // Same as nodejs fs streams. - ...options, - localAddress, - port: port || 80, - host: hostname - }) - } +const Dispatcher = __nccwpck_require__(60412) +const { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError +} = __nccwpck_require__(48045) +const { kDestroy, kClose, kDispatch, kInterceptors } = __nccwpck_require__(72785) + +const kDestroyed = Symbol('destroyed') +const kClosed = Symbol('closed') +const kOnDestroyed = Symbol('onDestroyed') +const kOnClosed = Symbol('onClosed') +const kInterceptedDispatch = Symbol('Intercepted Dispatch') + +class DispatcherBase extends Dispatcher { + constructor () { + super() + + this[kDestroyed] = false + this[kOnDestroyed] = null + this[kClosed] = false + this[kOnClosed] = [] + } - // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket - if (options.keepAlive == null || options.keepAlive) { - const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay - socket.setKeepAlive(true, keepAliveInitialDelay) - } + get destroyed () { + return this[kDestroyed] + } - const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout) + get closed () { + return this[kClosed] + } - socket - .setNoDelay(true) - .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { - cancelTimeout() + get interceptors () { + return this[kInterceptors] + } - if (callback) { - const cb = callback - callback = null - cb(null, this) + set interceptors (newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1; i >= 0; i--) { + const interceptor = this[kInterceptors][i] + if (typeof interceptor !== 'function') { + throw new InvalidArgumentError('interceptor must be an function') } - }) - .on('error', function (err) { - cancelTimeout() + } + } - if (callback) { - const cb = callback - callback = null - cb(err) - } + this[kInterceptors] = newInterceptors + } + + close (callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data) + }) }) + } - return socket - } -} + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } -function setupTimeout (onConnectTimeout, timeout) { - if (!timeout) { - return () => {} - } + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)) + return + } - let s1 = null - let s2 = null - const timeoutId = setTimeout(() => { - // setImmediate is added to make sure that we priotorise socket error events over timeouts - s1 = setImmediate(() => { - if (process.platform === 'win32') { - // Windows needs an extra setImmediate probably due to implementation differences in the socket logic - s2 = setImmediate(() => onConnectTimeout()) + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback) } else { - onConnectTimeout() + queueMicrotask(() => callback(null, null)) } - }) - }, timeout) - return () => { - clearTimeout(timeoutId) - clearImmediate(s1) - clearImmediate(s2) + return + } + + this[kClosed] = true + this[kOnClosed].push(callback) + + const onClosed = () => { + const callbacks = this[kOnClosed] + this[kOnClosed] = null + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null) + } + } + + // Should not error. + this[kClose]() + .then(() => this.destroy()) + .then(() => { + queueMicrotask(onClosed) + }) } -} -function onConnectTimeout (socket) { - util.destroy(socket, new ConnectTimeoutError()) -} + destroy (err, callback) { + if (typeof err === 'function') { + callback = err + err = null + } -module.exports = buildConnector + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.destroy(err, (err, data) => { + return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) + }) + }) + } + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } -/***/ }), + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback) + } else { + queueMicrotask(() => callback(null, null)) + } + return + } -/***/ 48045: -/***/ ((module) => { + if (!err) { + err = new ClientDestroyedError() + } -"use strict"; + this[kDestroyed] = true + this[kOnDestroyed] = this[kOnDestroyed] || [] + this[kOnDestroyed].push(callback) + const onDestroyed = () => { + const callbacks = this[kOnDestroyed] + this[kOnDestroyed] = null + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null) + } + } -class UndiciError extends Error { - constructor (message) { - super(message) - this.name = 'UndiciError' - this.code = 'UND_ERR' + // Should not error. + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed) + }) } -} -class ConnectTimeoutError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, ConnectTimeoutError) - this.name = 'ConnectTimeoutError' - this.message = message || 'Connect Timeout Error' - this.code = 'UND_ERR_CONNECT_TIMEOUT' - } -} + [kInterceptedDispatch] (opts, handler) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch] + return this[kDispatch](opts, handler) + } -class HeadersTimeoutError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, HeadersTimeoutError) - this.name = 'HeadersTimeoutError' - this.message = message || 'Headers Timeout Error' - this.code = 'UND_ERR_HEADERS_TIMEOUT' + let dispatch = this[kDispatch].bind(this) + for (let i = this[kInterceptors].length - 1; i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch) + } + this[kInterceptedDispatch] = dispatch + return dispatch(opts, handler) } -} -class HeadersOverflowError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, HeadersOverflowError) - this.name = 'HeadersOverflowError' - this.message = message || 'Headers Overflow Error' - this.code = 'UND_ERR_HEADERS_OVERFLOW' - } -} + dispatch (opts, handler) { + if (!handler || typeof handler !== 'object') { + throw new InvalidArgumentError('handler must be an object') + } -class BodyTimeoutError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, BodyTimeoutError) - this.name = 'BodyTimeoutError' - this.message = message || 'Body Timeout Error' - this.code = 'UND_ERR_BODY_TIMEOUT' - } -} + try { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('opts must be an object.') + } -class ResponseStatusCodeError extends UndiciError { - constructor (message, statusCode, headers, body) { - super(message) - Error.captureStackTrace(this, ResponseStatusCodeError) - this.name = 'ResponseStatusCodeError' - this.message = message || 'Response Status Code Error' - this.code = 'UND_ERR_RESPONSE_STATUS_CODE' - this.body = body - this.status = statusCode - this.statusCode = statusCode - this.headers = headers - } -} + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError() + } -class InvalidArgumentError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, InvalidArgumentError) - this.name = 'InvalidArgumentError' - this.message = message || 'Invalid Argument Error' - this.code = 'UND_ERR_INVALID_ARG' - } -} + if (this[kClosed]) { + throw new ClientClosedError() + } -class InvalidReturnValueError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, InvalidReturnValueError) - this.name = 'InvalidReturnValueError' - this.message = message || 'Invalid Return Value Error' - this.code = 'UND_ERR_INVALID_RETURN_VALUE' - } -} + return this[kInterceptedDispatch](opts, handler) + } catch (err) { + if (typeof handler.onError !== 'function') { + throw new InvalidArgumentError('invalid onError method') + } -class RequestAbortedError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, RequestAbortedError) - this.name = 'AbortError' - this.message = message || 'Request aborted' - this.code = 'UND_ERR_ABORTED' - } -} + handler.onError(err) -class InformationalError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, InformationalError) - this.name = 'InformationalError' - this.message = message || 'Request information' - this.code = 'UND_ERR_INFO' + return false + } } } -class RequestContentLengthMismatchError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, RequestContentLengthMismatchError) - this.name = 'RequestContentLengthMismatchError' - this.message = message || 'Request body length does not match content-length header' - this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH' - } -} +module.exports = DispatcherBase -class ResponseContentLengthMismatchError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, ResponseContentLengthMismatchError) - this.name = 'ResponseContentLengthMismatchError' - this.message = message || 'Response body length does not match content-length header' - this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH' - } -} -class ClientDestroyedError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, ClientDestroyedError) - this.name = 'ClientDestroyedError' - this.message = message || 'The client is destroyed' - this.code = 'UND_ERR_DESTROYED' - } -} +/***/ }), -class ClientClosedError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, ClientClosedError) - this.name = 'ClientClosedError' - this.message = message || 'The client is closed' - this.code = 'UND_ERR_CLOSED' - } -} +/***/ 60412: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -class SocketError extends UndiciError { - constructor (message, socket) { - super(message) - Error.captureStackTrace(this, SocketError) - this.name = 'SocketError' - this.message = message || 'Socket error' - this.code = 'UND_ERR_SOCKET' - this.socket = socket - } -} +"use strict"; -class NotSupportedError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, NotSupportedError) - this.name = 'NotSupportedError' - this.message = message || 'Not supported error' - this.code = 'UND_ERR_NOT_SUPPORTED' - } -} -class BalancedPoolMissingUpstreamError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, NotSupportedError) - this.name = 'MissingUpstreamError' - this.message = message || 'No upstream has been added to the BalancedPool' - this.code = 'UND_ERR_BPL_MISSING_UPSTREAM' +const EventEmitter = __nccwpck_require__(82361) + +class Dispatcher extends EventEmitter { + dispatch () { + throw new Error('not implemented') } -} -class HTTPParserError extends Error { - constructor (message, code, data) { - super(message) - Error.captureStackTrace(this, HTTPParserError) - this.name = 'HTTPParserError' - this.code = code ? `HPE_${code}` : undefined - this.data = data ? data.toString() : undefined + close () { + throw new Error('not implemented') } -} -class ResponseExceededMaxSizeError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, ResponseExceededMaxSizeError) - this.name = 'ResponseExceededMaxSizeError' - this.message = message || 'Response content exceeded max size' - this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE' + destroy () { + throw new Error('not implemented') } } -module.exports = { - HTTPParserError, - UndiciError, - HeadersTimeoutError, - HeadersOverflowError, - BodyTimeoutError, - RequestContentLengthMismatchError, - ConnectTimeoutError, - ResponseStatusCodeError, - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError, - ClientDestroyedError, - ClientClosedError, - InformationalError, - SocketError, - NotSupportedError, - ResponseContentLengthMismatchError, - BalancedPoolMissingUpstreamError, - ResponseExceededMaxSizeError -} +module.exports = Dispatcher /***/ }), -/***/ 62905: +/***/ 41472: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; +const Busboy = __nccwpck_require__(50727) +const util = __nccwpck_require__(83983) const { - InvalidArgumentError, - NotSupportedError -} = __nccwpck_require__(48045) + ReadableStreamFrom, + isBlobLike, + isReadableStreamLike, + readableStreamClose, + createDeferredPromise, + fullyReadBody +} = __nccwpck_require__(52538) +const { FormData } = __nccwpck_require__(72015) +const { kState } = __nccwpck_require__(15861) +const { webidl } = __nccwpck_require__(21744) +const { DOMException, structuredClone } = __nccwpck_require__(41037) +const { Blob, File: NativeFile } = __nccwpck_require__(14300) +const { kBodyUsed } = __nccwpck_require__(72785) const assert = __nccwpck_require__(39491) -const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = __nccwpck_require__(72785) -const util = __nccwpck_require__(83983) +const { isErrored } = __nccwpck_require__(83983) +const { isUint8Array, isArrayBuffer } = __nccwpck_require__(29830) +const { File: UndiciFile } = __nccwpck_require__(78511) +const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685) -// tokenRegExp and headerCharRegex have been lifted from -// https://github.com/nodejs/node/blob/main/lib/_http_common.js +let ReadableStream = globalThis.ReadableStream -/** - * Verifies that the given val is a valid HTTP token - * per the rules defined in RFC 7230 - * See https://tools.ietf.org/html/rfc7230#section-3.2.6 - */ -const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/ +/** @type {globalThis['File']} */ +const File = NativeFile ?? UndiciFile +const textEncoder = new TextEncoder() +const textDecoder = new TextDecoder() -/** - * Matches if val contains an invalid field-vchar - * field-value = *( field-content / obs-fold ) - * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] - * field-vchar = VCHAR / obs-text - */ -const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/ +// https://fetch.spec.whatwg.org/#concept-bodyinit-extract +function extractBody (object, keepalive = false) { + if (!ReadableStream) { + ReadableStream = (__nccwpck_require__(35356).ReadableStream) + } -// Verifies that a given path is valid does not contain control chars \x00 to \x20 -const invalidPathRegex = /[^\u0021-\u00ff]/ + // 1. Let stream be null. + let stream = null -const kHandler = Symbol('handler') + // 2. If object is a ReadableStream object, then set stream to object. + if (object instanceof ReadableStream) { + stream = object + } else if (isBlobLike(object)) { + // 3. Otherwise, if object is a Blob object, set stream to the + // result of running object’s get stream. + stream = object.stream() + } else { + // 4. Otherwise, set stream to a new ReadableStream object, and set + // up stream. + stream = new ReadableStream({ + async pull (controller) { + controller.enqueue( + typeof source === 'string' ? textEncoder.encode(source) : source + ) + queueMicrotask(() => readableStreamClose(controller)) + }, + start () {}, + type: undefined + }) + } -const channels = {} + // 5. Assert: stream is a ReadableStream object. + assert(isReadableStreamLike(stream)) -let extractBody + // 6. Let action be null. + let action = null -try { - const diagnosticsChannel = __nccwpck_require__(67643) - channels.create = diagnosticsChannel.channel('undici:request:create') - channels.bodySent = diagnosticsChannel.channel('undici:request:bodySent') - channels.headers = diagnosticsChannel.channel('undici:request:headers') - channels.trailers = diagnosticsChannel.channel('undici:request:trailers') - channels.error = diagnosticsChannel.channel('undici:request:error') -} catch { - channels.create = { hasSubscribers: false } - channels.bodySent = { hasSubscribers: false } - channels.headers = { hasSubscribers: false } - channels.trailers = { hasSubscribers: false } - channels.error = { hasSubscribers: false } -} + // 7. Let source be null. + let source = null + + // 8. Let length be null. + let length = null + + // 9. Let type be null. + let type = null + + // 10. Switch on object: + if (typeof object === 'string') { + // Set source to the UTF-8 encoding of object. + // Note: setting source to a Uint8Array here breaks some mocking assumptions. + source = object + + // Set type to `text/plain;charset=UTF-8`. + type = 'text/plain;charset=UTF-8' + } else if (object instanceof URLSearchParams) { + // URLSearchParams + + // spec says to run application/x-www-form-urlencoded on body.list + // this is implemented in Node.js as apart of an URLSearchParams instance toString method + // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490 + // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100 + + // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list. + source = object.toString() + + // Set type to `application/x-www-form-urlencoded;charset=UTF-8`. + type = 'application/x-www-form-urlencoded;charset=UTF-8' + } else if (isArrayBuffer(object)) { + // BufferSource/ArrayBuffer -class Request { - constructor (origin, { - path, - method, - body, - headers, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - throwOnError, - expectContinue - }, handler) { - if (typeof path !== 'string') { - throw new InvalidArgumentError('path must be a string') - } else if ( - path[0] !== '/' && - !(path.startsWith('http://') || path.startsWith('https://')) && - method !== 'CONNECT' - ) { - throw new InvalidArgumentError('path must be an absolute URL or start with a slash') - } else if (invalidPathRegex.exec(path) !== null) { - throw new InvalidArgumentError('invalid request path') - } + // Set source to a copy of the bytes held by object. + source = new Uint8Array(object.slice()) + } else if (ArrayBuffer.isView(object)) { + // BufferSource/ArrayBufferView - if (typeof method !== 'string') { - throw new InvalidArgumentError('method must be a string') - } else if (tokenRegExp.exec(method) === null) { - throw new InvalidArgumentError('invalid request method') - } + // Set source to a copy of the bytes held by object. + source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)) + } else if (util.isFormDataLike(object)) { + const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '0')}` + const prefix = `--${boundary}\r\nContent-Disposition: form-data` - if (upgrade && typeof upgrade !== 'string') { - throw new InvalidArgumentError('upgrade must be a string') - } + /*! formdata-polyfill. MIT License. Jimmy Wärting */ + const escape = (str) => + str.replace(/\n/g, '%0A').replace(/\r/g, '%0D').replace(/"/g, '%22') + const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, '\r\n') - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError('invalid headersTimeout') - } + // Set action to this step: run the multipart/form-data + // encoding algorithm, with object’s entry list and UTF-8. + // - This ensures that the body is immutable and can't be changed afterwords + // - That the content-length is calculated in advance. + // - And that all parts are pre-encoded and ready to be sent. - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError('invalid bodyTimeout') + const blobParts = [] + const rn = new Uint8Array([13, 10]) // '\r\n' + length = 0 + let hasUnknownSizeValue = false + + for (const [name, value] of object) { + if (typeof value === 'string') { + const chunk = textEncoder.encode(prefix + + `; name="${escape(normalizeLinefeeds(name))}"` + + `\r\n\r\n${normalizeLinefeeds(value)}\r\n`) + blobParts.push(chunk) + length += chunk.byteLength + } else { + const chunk = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + + (value.name ? `; filename="${escape(value.name)}"` : '') + '\r\n' + + `Content-Type: ${ + value.type || 'application/octet-stream' + }\r\n\r\n`) + blobParts.push(chunk, value, rn) + if (typeof value.size === 'number') { + length += chunk.byteLength + value.size + rn.byteLength + } else { + hasUnknownSizeValue = true + } + } } - if (reset != null && typeof reset !== 'boolean') { - throw new InvalidArgumentError('invalid reset') + const chunk = textEncoder.encode(`--${boundary}--`) + blobParts.push(chunk) + length += chunk.byteLength + if (hasUnknownSizeValue) { + length = null } - if (expectContinue != null && typeof expectContinue !== 'boolean') { - throw new InvalidArgumentError('invalid expectContinue') + // Set source to object. + source = object + + action = async function * () { + for (const part of blobParts) { + if (part.stream) { + yield * part.stream() + } else { + yield part + } + } } - this.headersTimeout = headersTimeout + // Set type to `multipart/form-data; boundary=`, + // followed by the multipart/form-data boundary string generated + // by the multipart/form-data encoding algorithm. + type = 'multipart/form-data; boundary=' + boundary + } else if (isBlobLike(object)) { + // Blob - this.bodyTimeout = bodyTimeout + // Set source to object. + source = object - this.throwOnError = throwOnError === true + // Set length to object’s size. + length = object.size - this.method = method + // If object’s type attribute is not the empty byte sequence, set + // type to its value. + if (object.type) { + type = object.type + } + } else if (typeof object[Symbol.asyncIterator] === 'function') { + // If keepalive is true, then throw a TypeError. + if (keepalive) { + throw new TypeError('keepalive') + } - if (body == null) { - this.body = null - } else if (util.isStream(body)) { - this.body = body - } else if (util.isBuffer(body)) { - this.body = body.byteLength ? body : null - } else if (ArrayBuffer.isView(body)) { - this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null - } else if (body instanceof ArrayBuffer) { - this.body = body.byteLength ? Buffer.from(body) : null - } else if (typeof body === 'string') { - this.body = body.length ? Buffer.from(body) : null - } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { - this.body = body - } else { - throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') + // If object is disturbed or locked, then throw a TypeError. + if (util.isDisturbed(object) || object.locked) { + throw new TypeError( + 'Response body object should not be disturbed or locked' + ) } - this.completed = false + stream = + object instanceof ReadableStream ? object : ReadableStreamFrom(object) + } - this.aborted = false + // 11. If source is a byte sequence, then set action to a + // step that returns source and length to source’s length. + if (typeof source === 'string' || util.isBuffer(source)) { + length = Buffer.byteLength(source) + } - this.upgrade = upgrade || null + // 12. If action is non-null, then run these steps in in parallel: + if (action != null) { + // Run action. + let iterator + stream = new ReadableStream({ + async start () { + iterator = action(object)[Symbol.asyncIterator]() + }, + async pull (controller) { + const { value, done } = await iterator.next() + if (done) { + // When running action is done, close stream. + queueMicrotask(() => { + controller.close() + }) + } else { + // Whenever one or more bytes are available and stream is not errored, + // enqueue a Uint8Array wrapping an ArrayBuffer containing the available + // bytes into stream. + if (!isErrored(stream)) { + controller.enqueue(new Uint8Array(value)) + } + } + return controller.desiredSize > 0 + }, + async cancel (reason) { + await iterator.return() + }, + type: undefined + }) + } - this.path = query ? util.buildURL(path, query) : path + // 13. Let body be a body whose stream is stream, source is source, + // and length is length. + const body = { stream, source, length } - this.origin = origin + // 14. Return (body, type). + return [body, type] +} - this.idempotent = idempotent == null - ? method === 'HEAD' || method === 'GET' - : idempotent +// https://fetch.spec.whatwg.org/#bodyinit-safely-extract +function safelyExtractBody (object, keepalive = false) { + if (!ReadableStream) { + // istanbul ignore next + ReadableStream = (__nccwpck_require__(35356).ReadableStream) + } - this.blocking = blocking == null ? false : blocking + // To safely extract a body and a `Content-Type` value from + // a byte sequence or BodyInit object object, run these steps: - this.reset = reset == null ? null : reset + // 1. If object is a ReadableStream object, then: + if (object instanceof ReadableStream) { + // Assert: object is neither disturbed nor locked. + // istanbul ignore next + assert(!util.isDisturbed(object), 'The body has already been consumed.') + // istanbul ignore next + assert(!object.locked, 'The stream is locked.') + } - this.host = null + // 2. Return the results of extracting object. + return extractBody(object, keepalive) +} - this.contentLength = null +function cloneBody (body) { + // To clone a body body, run these steps: - this.contentType = null + // https://fetch.spec.whatwg.org/#concept-body-clone - this.headers = '' + // 1. Let « out1, out2 » be the result of teeing body’s stream. + const [out1, out2] = body.stream.tee() + const out2Clone = structuredClone(out2, { transfer: [out2] }) + // This, for whatever reasons, unrefs out2Clone which allows + // the process to exit by itself. + const [, finalClone] = out2Clone.tee() - // Only for H2 - this.expectContinue = expectContinue != null ? expectContinue : false + // 2. Set body’s stream to out1. + body.stream = out1 - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError('headers array must be even') - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(this, headers[i], headers[i + 1]) - } - } else if (headers && typeof headers === 'object') { - const keys = Object.keys(headers) - for (let i = 0; i < keys.length; i++) { - const key = keys[i] - processHeader(this, key, headers[key]) - } - } else if (headers != null) { - throw new InvalidArgumentError('headers must be an object or an array') - } + // 3. Return a body whose stream is out2 and other members are copied from body. + return { + stream: finalClone, + length: body.length, + source: body.source + } +} - if (util.isFormDataLike(this.body)) { - if (util.nodeMajor < 16 || (util.nodeMajor === 16 && util.nodeMinor < 8)) { - throw new InvalidArgumentError('Form-Data bodies are only supported in node v16.8 and newer.') - } +async function * consumeBody (body) { + if (body) { + if (isUint8Array(body)) { + yield body + } else { + const stream = body.stream - if (!extractBody) { - extractBody = (__nccwpck_require__(41472).extractBody) + if (util.isDisturbed(stream)) { + throw new TypeError('The body has already been consumed.') } - const [bodyStream, contentType] = extractBody(body) - if (this.contentType == null) { - this.contentType = contentType - this.headers += `content-type: ${contentType}\r\n` + if (stream.locked) { + throw new TypeError('The stream is locked.') } - this.body = bodyStream.stream - this.contentLength = bodyStream.length - } else if (util.isBlobLike(body) && this.contentType == null && body.type) { - this.contentType = body.type - this.headers += `content-type: ${body.type}\r\n` - } - - util.validateHandler(handler, method, upgrade) - this.servername = util.getServerName(this.host) - - this[kHandler] = handler + // Compat. + stream[kBodyUsed] = true - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }) + yield * stream } } +} - onBodySent (chunk) { - if (this[kHandler].onBodySent) { - try { - this[kHandler].onBodySent(chunk) - } catch (err) { - this.onError(err) - } - } +function throwIfAborted (state) { + if (state.aborted) { + throw new DOMException('The operation was aborted.', 'AbortError') } +} - onRequestSent () { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }) - } - } +function bodyMixinMethods (instance) { + const methods = { + blob () { + // The blob() method steps are to return the result of + // running consume body with this and the following step + // given a byte sequence bytes: return a Blob whose + // contents are bytes and whose type attribute is this’s + // MIME type. + return specConsumeBody(this, (bytes) => { + let mimeType = bodyMimeType(this) - onConnect (abort) { - assert(!this.aborted) - assert(!this.completed) + if (mimeType === 'failure') { + mimeType = '' + } else if (mimeType) { + mimeType = serializeAMimeType(mimeType) + } - return this[kHandler].onConnect(abort) - } + // Return a Blob whose contents are bytes and type attribute + // is mimeType. + return new Blob([bytes], { type: mimeType }) + }, instance) + }, - onHeaders (statusCode, headers, resume, statusText) { - assert(!this.aborted) - assert(!this.completed) + arrayBuffer () { + // The arrayBuffer() method steps are to return the result + // of running consume body with this and the following step + // given a byte sequence bytes: return a new ArrayBuffer + // whose contents are bytes. + return specConsumeBody(this, (bytes) => { + return new Uint8Array(bytes).buffer + }, instance) + }, - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) - } + text () { + // The text() method steps are to return the result of running + // consume body with this and UTF-8 decode. + return specConsumeBody(this, utf8DecodeBytes, instance) + }, - return this[kHandler].onHeaders(statusCode, headers, resume, statusText) - } + json () { + // The json() method steps are to return the result of running + // consume body with this and parse JSON from bytes. + return specConsumeBody(this, parseJSONFromBytes, instance) + }, - onData (chunk) { - assert(!this.aborted) - assert(!this.completed) + async formData () { + webidl.brandCheck(this, instance) - return this[kHandler].onData(chunk) - } + throwIfAborted(this[kState]) - onUpgrade (statusCode, headers, socket) { - assert(!this.aborted) - assert(!this.completed) + const contentType = this.headers.get('Content-Type') - return this[kHandler].onUpgrade(statusCode, headers, socket) - } + // If mimeType’s essence is "multipart/form-data", then: + if (/multipart\/form-data/.test(contentType)) { + const headers = {} + for (const [key, value] of this.headers) headers[key.toLowerCase()] = value - onComplete (trailers) { - assert(!this.aborted) + const responseFormData = new FormData() - this.completed = true - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }) - } - return this[kHandler].onComplete(trailers) - } + let busboy - onError (error) { - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }) - } + try { + busboy = new Busboy({ + headers, + preservePath: true + }) + } catch (err) { + throw new DOMException(`${err}`, 'AbortError') + } - if (this.aborted) { - return - } - this.aborted = true - return this[kHandler].onError(error) - } + busboy.on('field', (name, value) => { + responseFormData.append(name, value) + }) + busboy.on('file', (name, value, filename, encoding, mimeType) => { + const chunks = [] - // TODO: adjust to support H2 - addHeader (key, value) { - processHeader(this, key, value) - return this - } + if (encoding === 'base64' || encoding.toLowerCase() === 'base64') { + let base64chunk = '' - static [kHTTP1BuildRequest] (origin, opts, handler) { - // TODO: Migrate header parsing here, to make Requests - // HTTP agnostic - return new Request(origin, opts, handler) - } + value.on('data', (chunk) => { + base64chunk += chunk.toString().replace(/[\r\n]/gm, '') - static [kHTTP2BuildRequest] (origin, opts, handler) { - const headers = opts.headers - opts = { ...opts, headers: null } + const end = base64chunk.length - base64chunk.length % 4 + chunks.push(Buffer.from(base64chunk.slice(0, end), 'base64')) - const request = new Request(origin, opts, handler) + base64chunk = base64chunk.slice(end) + }) + value.on('end', () => { + chunks.push(Buffer.from(base64chunk, 'base64')) + responseFormData.append(name, new File(chunks, filename, { type: mimeType })) + }) + } else { + value.on('data', (chunk) => { + chunks.push(chunk) + }) + value.on('end', () => { + responseFormData.append(name, new File(chunks, filename, { type: mimeType })) + }) + } + }) - request.headers = {} + const busboyResolve = new Promise((resolve, reject) => { + busboy.on('finish', resolve) + busboy.on('error', (err) => reject(new TypeError(err))) + }) - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError('headers array must be even') - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(request, headers[i], headers[i + 1], true) - } - } else if (headers && typeof headers === 'object') { - const keys = Object.keys(headers) - for (let i = 0; i < keys.length; i++) { - const key = keys[i] - processHeader(request, key, headers[key], true) - } - } else if (headers != null) { - throw new InvalidArgumentError('headers must be an object or an array') - } + if (this.body !== null) for await (const chunk of consumeBody(this[kState].body)) busboy.write(chunk) + busboy.end() + await busboyResolve - return request - } + return responseFormData + } else if (/application\/x-www-form-urlencoded/.test(contentType)) { + // Otherwise, if mimeType’s essence is "application/x-www-form-urlencoded", then: - static [kHTTP2CopyHeaders] (raw) { - const rawHeaders = raw.split('\r\n') - const headers = {} + // 1. Let entries be the result of parsing bytes. + let entries + try { + let text = '' + // application/x-www-form-urlencoded parser will keep the BOM. + // https://url.spec.whatwg.org/#concept-urlencoded-parser + // Note that streaming decoder is stateful and cannot be reused + const streamingDecoder = new TextDecoder('utf-8', { ignoreBOM: true }) - for (const header of rawHeaders) { - const [key, value] = header.split(': ') + for await (const chunk of consumeBody(this[kState].body)) { + if (!isUint8Array(chunk)) { + throw new TypeError('Expected Uint8Array chunk') + } + text += streamingDecoder.decode(chunk, { stream: true }) + } + text += streamingDecoder.decode() + entries = new URLSearchParams(text) + } catch (err) { + // istanbul ignore next: Unclear when new URLSearchParams can fail on a string. + // 2. If entries is failure, then throw a TypeError. + throw Object.assign(new TypeError(), { cause: err }) + } + + // 3. Return a new FormData object whose entries are entries. + const formData = new FormData() + for (const [name, value] of entries) { + formData.append(name, value) + } + return formData + } else { + // Wait a tick before checking if the request has been aborted. + // Otherwise, a TypeError can be thrown when an AbortError should. + await Promise.resolve() - if (value == null || value.length === 0) continue + throwIfAborted(this[kState]) - if (headers[key]) headers[key] += `,${value}` - else headers[key] = value + // Otherwise, throw a TypeError. + throw webidl.errors.exception({ + header: `${instance.name}.formData`, + message: 'Could not parse content as FormData.' + }) + } } - - return headers } + + return methods } -function processHeaderValue (key, val, skipAppend) { - if (val && typeof val === 'object') { - throw new InvalidArgumentError(`invalid ${key} header`) - } +function mixinBody (prototype) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype)) +} - val = val != null ? `${val}` : '' +/** + * @see https://fetch.spec.whatwg.org/#concept-body-consume-body + * @param {Response|Request} object + * @param {(value: unknown) => unknown} convertBytesToJSValue + * @param {Response|Request} instance + */ +async function specConsumeBody (object, convertBytesToJSValue, instance) { + webidl.brandCheck(object, instance) - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`) + throwIfAborted(object[kState]) + + // 1. If object is unusable, then return a promise rejected + // with a TypeError. + if (bodyUnusable(object[kState].body)) { + throw new TypeError('Body is unusable') } - return skipAppend ? val : `${key}: ${val}\r\n` -} + // 2. Let promise be a new promise. + const promise = createDeferredPromise() -function processHeader (request, key, val, skipAppend = false) { - if (val && (typeof val === 'object' && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`) - } else if (val === undefined) { - return - } + // 3. Let errorSteps given error be to reject promise with error. + const errorSteps = (error) => promise.reject(error) - if ( - request.host === null && - key.length === 4 && - key.toLowerCase() === 'host' - ) { - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`) - } - // Consumed by Client - request.host = val - } else if ( - request.contentLength === null && - key.length === 14 && - key.toLowerCase() === 'content-length' - ) { - request.contentLength = parseInt(val, 10) - if (!Number.isFinite(request.contentLength)) { - throw new InvalidArgumentError('invalid content-length header') - } - } else if ( - request.contentType === null && - key.length === 12 && - key.toLowerCase() === 'content-type' - ) { - request.contentType = val - if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend) - else request.headers += processHeaderValue(key, val) - } else if ( - key.length === 17 && - key.toLowerCase() === 'transfer-encoding' - ) { - throw new InvalidArgumentError('invalid transfer-encoding header') - } else if ( - key.length === 10 && - key.toLowerCase() === 'connection' - ) { - const value = typeof val === 'string' ? val.toLowerCase() : null - if (value !== 'close' && value !== 'keep-alive') { - throw new InvalidArgumentError('invalid connection header') - } else if (value === 'close') { - request.reset = true - } - } else if ( - key.length === 10 && - key.toLowerCase() === 'keep-alive' - ) { - throw new InvalidArgumentError('invalid keep-alive header') - } else if ( - key.length === 7 && - key.toLowerCase() === 'upgrade' - ) { - throw new InvalidArgumentError('invalid upgrade header') - } else if ( - key.length === 6 && - key.toLowerCase() === 'expect' - ) { - throw new NotSupportedError('expect header not supported') - } else if (tokenRegExp.exec(key) === null) { - throw new InvalidArgumentError('invalid header key') - } else { - if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - if (skipAppend) { - if (request.headers[key]) request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}` - else request.headers[key] = processHeaderValue(key, val[i], skipAppend) - } else { - request.headers += processHeaderValue(key, val[i]) - } - } - } else { - if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend) - else request.headers += processHeaderValue(key, val) + // 4. Let successSteps given a byte sequence data be to resolve + // promise with the result of running convertBytesToJSValue + // with data. If that threw an exception, then run errorSteps + // with that exception. + const successSteps = (data) => { + try { + promise.resolve(convertBytesToJSValue(data)) + } catch (e) { + errorSteps(e) } } -} - -module.exports = Request - -/***/ }), + // 5. If object’s body is null, then run successSteps with an + // empty byte sequence. + if (object[kState].body == null) { + successSteps(new Uint8Array()) + return promise.promise + } -/***/ 72785: -/***/ ((module) => { + // 6. Otherwise, fully read object’s body given successSteps, + // errorSteps, and object’s relevant global object. + await fullyReadBody(object[kState].body, successSteps, errorSteps) -module.exports = { - kClose: Symbol('close'), - kDestroy: Symbol('destroy'), - kDispatch: Symbol('dispatch'), - kUrl: Symbol('url'), - kWriting: Symbol('writing'), - kResuming: Symbol('resuming'), - kQueue: Symbol('queue'), - kConnect: Symbol('connect'), - kConnecting: Symbol('connecting'), - kHeadersList: Symbol('headers list'), - kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'), - kKeepAliveMaxTimeout: Symbol('max keep alive timeout'), - kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'), - kKeepAliveTimeoutValue: Symbol('keep alive timeout'), - kKeepAlive: Symbol('keep alive'), - kHeadersTimeout: Symbol('headers timeout'), - kBodyTimeout: Symbol('body timeout'), - kServerName: Symbol('server name'), - kLocalAddress: Symbol('local address'), - kHost: Symbol('host'), - kNoRef: Symbol('no ref'), - kBodyUsed: Symbol('used'), - kRunning: Symbol('running'), - kBlocking: Symbol('blocking'), - kPending: Symbol('pending'), - kSize: Symbol('size'), - kBusy: Symbol('busy'), - kQueued: Symbol('queued'), - kFree: Symbol('free'), - kConnected: Symbol('connected'), - kClosed: Symbol('closed'), - kNeedDrain: Symbol('need drain'), - kReset: Symbol('reset'), - kDestroyed: Symbol.for('nodejs.stream.destroyed'), - kMaxHeadersSize: Symbol('max headers size'), - kRunningIdx: Symbol('running index'), - kPendingIdx: Symbol('pending index'), - kError: Symbol('error'), - kClients: Symbol('clients'), - kClient: Symbol('client'), - kParser: Symbol('parser'), - kOnDestroyed: Symbol('destroy callbacks'), - kPipelining: Symbol('pipelining'), - kSocket: Symbol('socket'), - kHostHeader: Symbol('host header'), - kConnector: Symbol('connector'), - kStrictContentLength: Symbol('strict content length'), - kMaxRedirections: Symbol('maxRedirections'), - kMaxRequests: Symbol('maxRequestsPerClient'), - kProxy: Symbol('proxy agent options'), - kCounter: Symbol('socket request counter'), - kInterceptors: Symbol('dispatch interceptors'), - kMaxResponseSize: Symbol('max response size'), - kHTTP2Session: Symbol('http2Session'), - kHTTP2SessionState: Symbol('http2Session state'), - kHTTP2BuildRequest: Symbol('http2 build request'), - kHTTP1BuildRequest: Symbol('http1 build request'), - kHTTP2CopyHeaders: Symbol('http2 copy headers'), - kHTTPConnVersion: Symbol('http connection version') + // 7. Return promise. + return promise.promise } +// https://fetch.spec.whatwg.org/#body-unusable +function bodyUnusable (body) { + // An object including the Body interface mixin is + // said to be unusable if its body is non-null and + // its body’s stream is disturbed or locked. + return body != null && (body.stream.locked || util.isDisturbed(body.stream)) +} -/***/ }), - -/***/ 83983: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - +/** + * @see https://encoding.spec.whatwg.org/#utf-8-decode + * @param {Buffer} buffer + */ +function utf8DecodeBytes (buffer) { + if (buffer.length === 0) { + return '' + } -const assert = __nccwpck_require__(39491) -const { kDestroyed, kBodyUsed } = __nccwpck_require__(72785) -const { IncomingMessage } = __nccwpck_require__(13685) -const stream = __nccwpck_require__(12781) -const net = __nccwpck_require__(41808) -const { InvalidArgumentError } = __nccwpck_require__(48045) -const { Blob } = __nccwpck_require__(14300) -const nodeUtil = __nccwpck_require__(73837) -const { stringify } = __nccwpck_require__(63477) + // 1. Let buffer be the result of peeking three bytes from + // ioQueue, converted to a byte sequence. -const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) + // 2. If buffer is 0xEF 0xBB 0xBF, then read three + // bytes from ioQueue. (Do nothing with those bytes.) + if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) { + buffer = buffer.subarray(3) + } -function nop () {} + // 3. Process a queue with an instance of UTF-8’s + // decoder, ioQueue, output, and "replacement". + const output = textDecoder.decode(buffer) -function isStream (obj) { - return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function' + // 4. Return output. + return output } -// based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) -function isBlobLike (object) { - return (Blob && object instanceof Blob) || ( - object && - typeof object === 'object' && - (typeof object.stream === 'function' || - typeof object.arrayBuffer === 'function') && - /^(Blob|File)$/.test(object[Symbol.toStringTag]) - ) +/** + * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value + * @param {Uint8Array} bytes + */ +function parseJSONFromBytes (bytes) { + return JSON.parse(utf8DecodeBytes(bytes)) } -function buildURL (url, queryParams) { - if (url.includes('?') || url.includes('#')) { - throw new Error('Query params cannot be passed when url already contains "?" or "#".') - } - - const stringified = stringify(queryParams) +/** + * @see https://fetch.spec.whatwg.org/#concept-body-mime-type + * @param {import('./response').Response|import('./request').Request} object + */ +function bodyMimeType (object) { + const { headersList } = object[kState] + const contentType = headersList.get('content-type') - if (stringified) { - url += '?' + stringified + if (contentType === null) { + return 'failure' } - return url + return parseMIMEType(contentType) } -function parseURL (url) { - if (typeof url === 'string') { - url = new URL(url) - - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') - } +module.exports = { + extractBody, + safelyExtractBody, + cloneBody, + mixinBody +} - return url - } - if (!url || typeof url !== 'object') { - throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.') - } +/***/ }), - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') - } +/***/ 41037: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (!(url instanceof URL)) { - if (url.port != null && url.port !== '' && !Number.isFinite(parseInt(url.port))) { - throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.') - } +"use strict"; - if (url.path != null && typeof url.path !== 'string') { - throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.') - } - if (url.pathname != null && typeof url.pathname !== 'string') { - throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.') - } +const { MessageChannel, receiveMessageOnPort } = __nccwpck_require__(71267) - if (url.hostname != null && typeof url.hostname !== 'string') { - throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.') - } +const corsSafeListedMethods = ['GET', 'HEAD', 'POST'] +const corsSafeListedMethodsSet = new Set(corsSafeListedMethods) - if (url.origin != null && typeof url.origin !== 'string') { - throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.') - } +const nullBodyStatus = [101, 204, 205, 304] - const port = url.port != null - ? url.port - : (url.protocol === 'https:' ? 443 : 80) - let origin = url.origin != null - ? url.origin - : `${url.protocol}//${url.hostname}:${port}` - let path = url.path != null - ? url.path - : `${url.pathname || ''}${url.search || ''}` +const redirectStatus = [301, 302, 303, 307, 308] +const redirectStatusSet = new Set(redirectStatus) - if (origin.endsWith('/')) { - origin = origin.substring(0, origin.length - 1) - } +// https://fetch.spec.whatwg.org/#block-bad-port +const badPorts = [ + '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79', + '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137', + '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532', + '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723', + '2049', '3659', '4045', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6697', + '10080' +] - if (path && !path.startsWith('/')) { - path = `/${path}` - } - // new URL(path, origin) is unsafe when `path` contains an absolute URL - // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL: - // If first parameter is a relative URL, second param is required, and will be used as the base URL. - // If first parameter is an absolute URL, a given second param will be ignored. - url = new URL(origin + path) - } +const badPortsSet = new Set(badPorts) - return url -} +// https://w3c.github.io/webappsec-referrer-policy/#referrer-policies +const referrerPolicy = [ + '', + 'no-referrer', + 'no-referrer-when-downgrade', + 'same-origin', + 'origin', + 'strict-origin', + 'origin-when-cross-origin', + 'strict-origin-when-cross-origin', + 'unsafe-url' +] +const referrerPolicySet = new Set(referrerPolicy) -function parseOrigin (url) { - url = parseURL(url) +const requestRedirect = ['follow', 'manual', 'error'] - if (url.pathname !== '/' || url.search || url.hash) { - throw new InvalidArgumentError('invalid url') - } +const safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE'] +const safeMethodsSet = new Set(safeMethods) - return url -} +const requestMode = ['navigate', 'same-origin', 'no-cors', 'cors'] -function getHostname (host) { - if (host[0] === '[') { - const idx = host.indexOf(']') +const requestCredentials = ['omit', 'same-origin', 'include'] - assert(idx !== -1) - return host.substr(1, idx - 1) - } +const requestCache = [ + 'default', + 'no-store', + 'reload', + 'no-cache', + 'force-cache', + 'only-if-cached' +] - const idx = host.indexOf(':') - if (idx === -1) return host +// https://fetch.spec.whatwg.org/#request-body-header-name +const requestBodyHeader = [ + 'content-encoding', + 'content-language', + 'content-location', + 'content-type', + // See https://github.com/nodejs/undici/issues/2021 + // 'Content-Length' is a forbidden header name, which is typically + // removed in the Headers implementation. However, undici doesn't + // filter out headers, so we add it here. + 'content-length' +] - return host.substr(0, idx) -} +// https://fetch.spec.whatwg.org/#enumdef-requestduplex +const requestDuplex = [ + 'half' +] -// IP addresses are not valid server names per RFC6066 -// > Currently, the only server names supported are DNS hostnames -function getServerName (host) { - if (!host) { - return null - } +// http://fetch.spec.whatwg.org/#forbidden-method +const forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK'] +const forbiddenMethodsSet = new Set(forbiddenMethods) - assert.strictEqual(typeof host, 'string') +const subresource = [ + 'audio', + 'audioworklet', + 'font', + 'image', + 'manifest', + 'paintworklet', + 'script', + 'style', + 'track', + 'video', + 'xslt', + '' +] +const subresourceSet = new Set(subresource) - const servername = getHostname(host) - if (net.isIP(servername)) { - return '' +/** @type {globalThis['DOMException']} */ +const DOMException = globalThis.DOMException ?? (() => { + // DOMException was only made a global in Node v17.0.0, + // but fetch supports >= v16.8. + try { + atob('~') + } catch (err) { + return Object.getPrototypeOf(err).constructor } +})() - return servername -} - -function deepClone (obj) { - return JSON.parse(JSON.stringify(obj)) -} - -function isAsyncIterable (obj) { - return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function') -} +let channel -function isIterable (obj) { - return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function')) -} +/** @type {globalThis['structuredClone']} */ +const structuredClone = + globalThis.structuredClone ?? + // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js + // structuredClone was added in v17.0.0, but fetch supports v16.8 + function structuredClone (value, options = undefined) { + if (arguments.length === 0) { + throw new TypeError('missing argument') + } -function bodyLength (body) { - if (body == null) { - return 0 - } else if (isStream(body)) { - const state = body._readableState - return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) - ? state.length - : null - } else if (isBlobLike(body)) { - return body.size != null ? body.size : null - } else if (isBuffer(body)) { - return body.byteLength + if (!channel) { + channel = new MessageChannel() + } + channel.port1.unref() + channel.port2.unref() + channel.port1.postMessage(value, options?.transfer) + return receiveMessageOnPort(channel.port2).message } - return null +module.exports = { + DOMException, + structuredClone, + subresource, + forbiddenMethods, + requestBodyHeader, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + redirectStatus, + corsSafeListedMethods, + nullBodyStatus, + safeMethods, + badPorts, + requestDuplex, + subresourceSet, + badPortsSet, + redirectStatusSet, + corsSafeListedMethodsSet, + safeMethodsSet, + forbiddenMethodsSet, + referrerPolicySet } -function isDestroyed (stream) { - return !stream || !!(stream.destroyed || stream[kDestroyed]) -} -function isReadableAborted (stream) { - const state = stream && stream._readableState - return isDestroyed(stream) && state && !state.endEmitted -} +/***/ }), -function destroy (stream, err) { - if (!isStream(stream) || isDestroyed(stream)) { - return - } +/***/ 685: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (typeof stream.destroy === 'function') { - if (Object.getPrototypeOf(stream).constructor === IncomingMessage) { - // See: https://github.com/nodejs/node/pull/38505/files - stream.socket = null - } +const assert = __nccwpck_require__(39491) +const { atob } = __nccwpck_require__(14300) +const { isomorphicDecode } = __nccwpck_require__(52538) - stream.destroy(err) - } else if (err) { - process.nextTick((stream, err) => { - stream.emit('error', err) - }, stream, err) - } +const encoder = new TextEncoder() - if (stream.destroyed !== true) { - stream[kDestroyed] = true - } -} +/** + * @see https://mimesniff.spec.whatwg.org/#http-token-code-point + */ +const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/ +const HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/ // eslint-disable-line +/** + * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point + */ +const HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/ // eslint-disable-line -const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/ -function parseKeepAliveTimeout (val) { - const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR) - return m ? parseInt(m[1], 10) * 1000 : null -} +// https://fetch.spec.whatwg.org/#data-url-processor +/** @param {URL} dataURL */ +function dataURLProcessor (dataURL) { + // 1. Assert: dataURL’s scheme is "data". + assert(dataURL.protocol === 'data:') -function parseHeaders (headers, obj = {}) { - // For H2 support - if (!Array.isArray(headers)) return headers + // 2. Let input be the result of running the URL + // serializer on dataURL with exclude fragment + // set to true. + let input = URLSerializer(dataURL, true) - for (let i = 0; i < headers.length; i += 2) { - const key = headers[i].toString().toLowerCase() - let val = obj[key] + // 3. Remove the leading "data:" string from input. + input = input.slice(5) - if (!val) { - if (Array.isArray(headers[i + 1])) { - obj[key] = headers[i + 1] - } else { - obj[key] = headers[i + 1].toString('utf8') - } - } else { - if (!Array.isArray(val)) { - val = [val] - obj[key] = val - } - val.push(headers[i + 1].toString('utf8')) - } - } + // 4. Let position point at the start of input. + const position = { position: 0 } - // See https://github.com/nodejs/node/pull/46528 - if ('content-length' in obj && 'content-disposition' in obj) { - obj['content-disposition'] = Buffer.from(obj['content-disposition']).toString('latin1') + // 5. Let mimeType be the result of collecting a + // sequence of code points that are not equal + // to U+002C (,), given position. + let mimeType = collectASequenceOfCodePointsFast( + ',', + input, + position + ) + + // 6. Strip leading and trailing ASCII whitespace + // from mimeType. + // Undici implementation note: we need to store the + // length because if the mimetype has spaces removed, + // the wrong amount will be sliced from the input in + // step #9 + const mimeTypeLength = mimeType.length + mimeType = removeASCIIWhitespace(mimeType, true, true) + + // 7. If position is past the end of input, then + // return failure + if (position.position >= input.length) { + return 'failure' } - return obj -} + // 8. Advance position by 1. + position.position++ -function parseRawHeaders (headers) { - const ret = [] - let hasContentLength = false - let contentDispositionIdx = -1 + // 9. Let encodedBody be the remainder of input. + const encodedBody = input.slice(mimeTypeLength + 1) - for (let n = 0; n < headers.length; n += 2) { - const key = headers[n + 0].toString() - const val = headers[n + 1].toString('utf8') + // 10. Let body be the percent-decoding of encodedBody. + let body = stringPercentDecode(encodedBody) - if (key.length === 14 && (key === 'content-length' || key.toLowerCase() === 'content-length')) { - ret.push(key, val) - hasContentLength = true - } else if (key.length === 19 && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) { - contentDispositionIdx = ret.push(key, val) - 1 - } else { - ret.push(key, val) - } - } + // 11. If mimeType ends with U+003B (;), followed by + // zero or more U+0020 SPACE, followed by an ASCII + // case-insensitive match for "base64", then: + if (/;(\u0020){0,}base64$/i.test(mimeType)) { + // 1. Let stringBody be the isomorphic decode of body. + const stringBody = isomorphicDecode(body) - // See https://github.com/nodejs/node/pull/46528 - if (hasContentLength && contentDispositionIdx !== -1) { - ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString('latin1') - } + // 2. Set body to the forgiving-base64 decode of + // stringBody. + body = forgivingBase64(stringBody) - return ret -} + // 3. If body is failure, then return failure. + if (body === 'failure') { + return 'failure' + } -function isBuffer (buffer) { - // See, https://github.com/mcollina/undici/pull/319 - return buffer instanceof Uint8Array || Buffer.isBuffer(buffer) -} + // 4. Remove the last 6 code points from mimeType. + mimeType = mimeType.slice(0, -6) -function validateHandler (handler, method, upgrade) { - if (!handler || typeof handler !== 'object') { - throw new InvalidArgumentError('handler must be an object') - } + // 5. Remove trailing U+0020 SPACE code points from mimeType, + // if any. + mimeType = mimeType.replace(/(\u0020)+$/, '') - if (typeof handler.onConnect !== 'function') { - throw new InvalidArgumentError('invalid onConnect method') + // 6. Remove the last U+003B (;) code point from mimeType. + mimeType = mimeType.slice(0, -1) } - if (typeof handler.onError !== 'function') { - throw new InvalidArgumentError('invalid onError method') + // 12. If mimeType starts with U+003B (;), then prepend + // "text/plain" to mimeType. + if (mimeType.startsWith(';')) { + mimeType = 'text/plain' + mimeType } - if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) { - throw new InvalidArgumentError('invalid onBodySent method') + // 13. Let mimeTypeRecord be the result of parsing + // mimeType. + let mimeTypeRecord = parseMIMEType(mimeType) + + // 14. If mimeTypeRecord is failure, then set + // mimeTypeRecord to text/plain;charset=US-ASCII. + if (mimeTypeRecord === 'failure') { + mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII') } - if (upgrade || method === 'CONNECT') { - if (typeof handler.onUpgrade !== 'function') { - throw new InvalidArgumentError('invalid onUpgrade method') - } - } else { - if (typeof handler.onHeaders !== 'function') { - throw new InvalidArgumentError('invalid onHeaders method') - } + // 15. Return a new data: URL struct whose MIME + // type is mimeTypeRecord and body is body. + // https://fetch.spec.whatwg.org/#data-url-struct + return { mimeType: mimeTypeRecord, body } +} - if (typeof handler.onData !== 'function') { - throw new InvalidArgumentError('invalid onData method') - } +// https://url.spec.whatwg.org/#concept-url-serializer +/** + * @param {URL} url + * @param {boolean} excludeFragment + */ +function URLSerializer (url, excludeFragment = false) { + const href = url.href - if (typeof handler.onComplete !== 'function') { - throw new InvalidArgumentError('invalid onComplete method') - } + if (!excludeFragment) { + return href } -} -// A body is disturbed if it has been read from and it cannot -// be re-used without losing state or data. -function isDisturbed (body) { - return !!(body && ( - stream.isDisturbed - ? stream.isDisturbed(body) || body[kBodyUsed] // TODO (fix): Why is body[kBodyUsed] needed? - : body[kBodyUsed] || - body.readableDidRead || - (body._readableState && body._readableState.dataEmitted) || - isReadableAborted(body) - )) + const hash = href.lastIndexOf('#') + if (hash === -1) { + return href + } + return href.slice(0, hash) } -function isErrored (body) { - return !!(body && ( - stream.isErrored - ? stream.isErrored(body) - : /state: 'errored'/.test(nodeUtil.inspect(body) - ))) -} +// https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points +/** + * @param {(char: string) => boolean} condition + * @param {string} input + * @param {{ position: number }} position + */ +function collectASequenceOfCodePoints (condition, input, position) { + // 1. Let result be the empty string. + let result = '' -function isReadable (body) { - return !!(body && ( - stream.isReadable - ? stream.isReadable(body) - : /state: 'readable'/.test(nodeUtil.inspect(body) - ))) -} + // 2. While position doesn’t point past the end of input and the + // code point at position within input meets the condition condition: + while (position.position < input.length && condition(input[position.position])) { + // 1. Append that code point to the end of result. + result += input[position.position] -function getSocketInfo (socket) { - return { - localAddress: socket.localAddress, - localPort: socket.localPort, - remoteAddress: socket.remoteAddress, - remotePort: socket.remotePort, - remoteFamily: socket.remoteFamily, - timeout: socket.timeout, - bytesWritten: socket.bytesWritten, - bytesRead: socket.bytesRead + // 2. Advance position by 1. + position.position++ } -} -async function * convertIterableToBuffer (iterable) { - for await (const chunk of iterable) { - yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk) - } + // 3. Return result. + return result } -let ReadableStream -function ReadableStreamFrom (iterable) { - if (!ReadableStream) { - ReadableStream = (__nccwpck_require__(35356).ReadableStream) - } +/** + * A faster collectASequenceOfCodePoints that only works when comparing a single character. + * @param {string} char + * @param {string} input + * @param {{ position: number }} position + */ +function collectASequenceOfCodePointsFast (char, input, position) { + const idx = input.indexOf(char, position.position) + const start = position.position - if (ReadableStream.from) { - return ReadableStream.from(convertIterableToBuffer(iterable)) + if (idx === -1) { + position.position = input.length + return input.slice(start) } - let iterator - return new ReadableStream( - { - async start () { - iterator = iterable[Symbol.asyncIterator]() - }, - async pull (controller) { - const { done, value } = await iterator.next() - if (done) { - queueMicrotask(() => { - controller.close() - }) - } else { - const buf = Buffer.isBuffer(value) ? value : Buffer.from(value) - controller.enqueue(new Uint8Array(buf)) - } - return controller.desiredSize > 0 - }, - async cancel (reason) { - await iterator.return() - } - }, - 0 - ) + position.position = idx + return input.slice(start, position.position) } -// The chunk should be a FormData instance and contains -// all the required methods. -function isFormDataLike (object) { - return ( - object && - typeof object === 'object' && - typeof object.append === 'function' && - typeof object.delete === 'function' && - typeof object.get === 'function' && - typeof object.getAll === 'function' && - typeof object.has === 'function' && - typeof object.set === 'function' && - object[Symbol.toStringTag] === 'FormData' - ) -} +// https://url.spec.whatwg.org/#string-percent-decode +/** @param {string} input */ +function stringPercentDecode (input) { + // 1. Let bytes be the UTF-8 encoding of input. + const bytes = encoder.encode(input) -function throwIfAborted (signal) { - if (!signal) { return } - if (typeof signal.throwIfAborted === 'function') { - signal.throwIfAborted() - } else { - if (signal.aborted) { - // DOMException not available < v17.0.0 - const err = new Error('The operation was aborted') - err.name = 'AbortError' - throw err - } - } + // 2. Return the percent-decoding of bytes. + return percentDecode(bytes) } -let events -function addAbortListener (signal, listener) { - if (typeof Symbol.dispose === 'symbol') { - if (!events) { - events = __nccwpck_require__(82361) - } - if (typeof events.addAbortListener === 'function' && 'aborted' in signal) { - return events.addAbortListener(signal, listener) - } - } - if ('addEventListener' in signal) { - signal.addEventListener('abort', listener, { once: true }) - return () => signal.removeEventListener('abort', listener) - } - signal.addListener('abort', listener) - return () => signal.removeListener('abort', listener) -} +// https://url.spec.whatwg.org/#percent-decode +/** @param {Uint8Array} input */ +function percentDecode (input) { + // 1. Let output be an empty byte sequence. + /** @type {number[]} */ + const output = [] -const hasToWellFormed = !!String.prototype.toWellFormed + // 2. For each byte byte in input: + for (let i = 0; i < input.length; i++) { + const byte = input[i] -/** - * @param {string} val - */ -function toUSVString (val) { - if (hasToWellFormed) { - return `${val}`.toWellFormed() - } else if (nodeUtil.toUSVString) { - return nodeUtil.toUSVString(val) - } + // 1. If byte is not 0x25 (%), then append byte to output. + if (byte !== 0x25) { + output.push(byte) - return `${val}` -} + // 2. Otherwise, if byte is 0x25 (%) and the next two bytes + // after byte in input are not in the ranges + // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F), + // and 0x61 (a) to 0x66 (f), all inclusive, append byte + // to output. + } else if ( + byte === 0x25 && + !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2])) + ) { + output.push(0x25) -const kEnumerableProperty = Object.create(null) -kEnumerableProperty.enumerable = true + // 3. Otherwise: + } else { + // 1. Let bytePoint be the two bytes after byte in input, + // decoded, and then interpreted as hexadecimal number. + const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]) + const bytePoint = Number.parseInt(nextTwoBytes, 16) -module.exports = { - kEnumerableProperty, - nop, - isDisturbed, - isErrored, - isReadable, - toUSVString, - isReadableAborted, - isBlobLike, - parseOrigin, - parseURL, - getServerName, - isStream, - isIterable, - isAsyncIterable, - isDestroyed, - parseRawHeaders, - parseHeaders, - parseKeepAliveTimeout, - destroy, - bodyLength, - deepClone, - ReadableStreamFrom, - isBuffer, - validateHandler, - getSocketInfo, - isFormDataLike, - buildURL, - throwIfAborted, - addAbortListener, - nodeMajor, - nodeMinor, - nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13) + // 2. Append a byte whose value is bytePoint to output. + output.push(bytePoint) + + // 3. Skip the next two bytes in input. + i += 2 + } + } + + // 3. Return output. + return Uint8Array.from(output) } +// https://mimesniff.spec.whatwg.org/#parse-a-mime-type +/** @param {string} input */ +function parseMIMEType (input) { + // 1. Remove any leading and trailing HTTP whitespace + // from input. + input = removeHTTPWhitespace(input, true, true) -/***/ }), + // 2. Let position be a position variable for input, + // initially pointing at the start of input. + const position = { position: 0 } -/***/ 74839: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + // 3. Let type be the result of collecting a sequence + // of code points that are not U+002F (/) from + // input, given position. + const type = collectASequenceOfCodePointsFast( + '/', + input, + position + ) -"use strict"; + // 4. If type is the empty string or does not solely + // contain HTTP token code points, then return failure. + // https://mimesniff.spec.whatwg.org/#http-token-code-point + if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { + return 'failure' + } + // 5. If position is past the end of input, then return + // failure + if (position.position > input.length) { + return 'failure' + } -const Dispatcher = __nccwpck_require__(60412) -const { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError -} = __nccwpck_require__(48045) -const { kDestroy, kClose, kDispatch, kInterceptors } = __nccwpck_require__(72785) + // 6. Advance position by 1. (This skips past U+002F (/).) + position.position++ -const kDestroyed = Symbol('destroyed') -const kClosed = Symbol('closed') -const kOnDestroyed = Symbol('onDestroyed') -const kOnClosed = Symbol('onClosed') -const kInterceptedDispatch = Symbol('Intercepted Dispatch') + // 7. Let subtype be the result of collecting a sequence of + // code points that are not U+003B (;) from input, given + // position. + let subtype = collectASequenceOfCodePointsFast( + ';', + input, + position + ) -class DispatcherBase extends Dispatcher { - constructor () { - super() + // 8. Remove any trailing HTTP whitespace from subtype. + subtype = removeHTTPWhitespace(subtype, false, true) - this[kDestroyed] = false - this[kOnDestroyed] = null - this[kClosed] = false - this[kOnClosed] = [] + // 9. If subtype is the empty string or does not solely + // contain HTTP token code points, then return failure. + if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { + return 'failure' } - get destroyed () { - return this[kDestroyed] - } + const typeLowercase = type.toLowerCase() + const subtypeLowercase = subtype.toLowerCase() - get closed () { - return this[kClosed] + // 10. Let mimeType be a new MIME type record whose type + // is type, in ASCII lowercase, and subtype is subtype, + // in ASCII lowercase. + // https://mimesniff.spec.whatwg.org/#mime-type + const mimeType = { + type: typeLowercase, + subtype: subtypeLowercase, + /** @type {Map} */ + parameters: new Map(), + // https://mimesniff.spec.whatwg.org/#mime-type-essence + essence: `${typeLowercase}/${subtypeLowercase}` } - get interceptors () { - return this[kInterceptors] - } + // 11. While position is not past the end of input: + while (position.position < input.length) { + // 1. Advance position by 1. (This skips past U+003B (;).) + position.position++ - set interceptors (newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1; i >= 0; i--) { - const interceptor = this[kInterceptors][i] - if (typeof interceptor !== 'function') { - throw new InvalidArgumentError('interceptor must be an function') - } - } - } + // 2. Collect a sequence of code points that are HTTP + // whitespace from input given position. + collectASequenceOfCodePoints( + // https://fetch.spec.whatwg.org/#http-whitespace + char => HTTP_WHITESPACE_REGEX.test(char), + input, + position + ) - this[kInterceptors] = newInterceptors - } + // 3. Let parameterName be the result of collecting a + // sequence of code points that are not U+003B (;) + // or U+003D (=) from input, given position. + let parameterName = collectASequenceOfCodePoints( + (char) => char !== ';' && char !== '=', + input, + position + ) - close (callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data) - }) - }) - } + // 4. Set parameterName to parameterName, in ASCII + // lowercase. + parameterName = parameterName.toLowerCase() - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } + // 5. If position is not past the end of input, then: + if (position.position < input.length) { + // 1. If the code point at position within input is + // U+003B (;), then continue. + if (input[position.position] === ';') { + continue + } - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError(), null)) - return + // 2. Advance position by 1. (This skips past U+003D (=).) + position.position++ } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback) - } else { - queueMicrotask(() => callback(null, null)) - } - return + // 6. If position is past the end of input, then break. + if (position.position > input.length) { + break } - this[kClosed] = true - this[kOnClosed].push(callback) - - const onClosed = () => { - const callbacks = this[kOnClosed] - this[kOnClosed] = null - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null) - } - } + // 7. Let parameterValue be null. + let parameterValue = null - // Should not error. - this[kClose]() - .then(() => this.destroy()) - .then(() => { - queueMicrotask(onClosed) - }) - } + // 8. If the code point at position within input is + // U+0022 ("), then: + if (input[position.position] === '"') { + // 1. Set parameterValue to the result of collecting + // an HTTP quoted string from input, given position + // and the extract-value flag. + parameterValue = collectAnHTTPQuotedString(input, position, true) - destroy (err, callback) { - if (typeof err === 'function') { - callback = err - err = null - } + // 2. Collect a sequence of code points that are not + // U+003B (;) from input, given position. + collectASequenceOfCodePointsFast( + ';', + input, + position + ) - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.destroy(err, (err, data) => { - return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) - }) - }) - } + // 9. Otherwise: + } else { + // 1. Set parameterValue to the result of collecting + // a sequence of code points that are not U+003B (;) + // from input, given position. + parameterValue = collectASequenceOfCodePointsFast( + ';', + input, + position + ) - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } + // 2. Remove any trailing HTTP whitespace from parameterValue. + parameterValue = removeHTTPWhitespace(parameterValue, false, true) - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback) - } else { - queueMicrotask(() => callback(null, null)) + // 3. If parameterValue is the empty string, then continue. + if (parameterValue.length === 0) { + continue } - return } - if (!err) { - err = new ClientDestroyedError() + // 10. If all of the following are true + // - parameterName is not the empty string + // - parameterName solely contains HTTP token code points + // - parameterValue solely contains HTTP quoted-string token code points + // - mimeType’s parameters[parameterName] does not exist + // then set mimeType’s parameters[parameterName] to parameterValue. + if ( + parameterName.length !== 0 && + HTTP_TOKEN_CODEPOINTS.test(parameterName) && + (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && + !mimeType.parameters.has(parameterName) + ) { + mimeType.parameters.set(parameterName, parameterValue) } + } - this[kDestroyed] = true - this[kOnDestroyed] = this[kOnDestroyed] || [] - this[kOnDestroyed].push(callback) + // 12. Return mimeType. + return mimeType +} - const onDestroyed = () => { - const callbacks = this[kOnDestroyed] - this[kOnDestroyed] = null - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null) - } - } +// https://infra.spec.whatwg.org/#forgiving-base64-decode +/** @param {string} data */ +function forgivingBase64 (data) { + // 1. Remove all ASCII whitespace from data. + data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, '') // eslint-disable-line - // Should not error. - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed) - }) + // 2. If data’s code point length divides by 4 leaving + // no remainder, then: + if (data.length % 4 === 0) { + // 1. If data ends with one or two U+003D (=) code points, + // then remove them from data. + data = data.replace(/=?=$/, '') } - [kInterceptedDispatch] (opts, handler) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch] - return this[kDispatch](opts, handler) - } + // 3. If data’s code point length divides by 4 leaving + // a remainder of 1, then return failure. + if (data.length % 4 === 1) { + return 'failure' + } - let dispatch = this[kDispatch].bind(this) - for (let i = this[kInterceptors].length - 1; i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch) - } - this[kInterceptedDispatch] = dispatch - return dispatch(opts, handler) + // 4. If data contains a code point that is not one of + // U+002B (+) + // U+002F (/) + // ASCII alphanumeric + // then return failure. + if (/[^+/0-9A-Za-z]/.test(data)) { + return 'failure' } - dispatch (opts, handler) { - if (!handler || typeof handler !== 'object') { - throw new InvalidArgumentError('handler must be an object') - } + const binary = atob(data) + const bytes = new Uint8Array(binary.length) - try { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('opts must be an object.') - } + for (let byte = 0; byte < binary.length; byte++) { + bytes[byte] = binary.charCodeAt(byte) + } - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError() - } + return bytes +} - if (this[kClosed]) { - throw new ClientClosedError() - } +// https://fetch.spec.whatwg.org/#collect-an-http-quoted-string +// tests: https://fetch.spec.whatwg.org/#example-http-quoted-string +/** + * @param {string} input + * @param {{ position: number }} position + * @param {boolean?} extractValue + */ +function collectAnHTTPQuotedString (input, position, extractValue) { + // 1. Let positionStart be position. + const positionStart = position.position - return this[kInterceptedDispatch](opts, handler) - } catch (err) { - if (typeof handler.onError !== 'function') { - throw new InvalidArgumentError('invalid onError method') - } + // 2. Let value be the empty string. + let value = '' - handler.onError(err) + // 3. Assert: the code point at position within input + // is U+0022 ("). + assert(input[position.position] === '"') - return false - } - } -} + // 4. Advance position by 1. + position.position++ -module.exports = DispatcherBase + // 5. While true: + while (true) { + // 1. Append the result of collecting a sequence of code points + // that are not U+0022 (") or U+005C (\) from input, given + // position, to value. + value += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== '\\', + input, + position + ) + // 2. If position is past the end of input, then break. + if (position.position >= input.length) { + break + } -/***/ }), + // 3. Let quoteOrBackslash be the code point at position within + // input. + const quoteOrBackslash = input[position.position] -/***/ 60412: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + // 4. Advance position by 1. + position.position++ -"use strict"; + // 5. If quoteOrBackslash is U+005C (\), then: + if (quoteOrBackslash === '\\') { + // 1. If position is past the end of input, then append + // U+005C (\) to value and break. + if (position.position >= input.length) { + value += '\\' + break + } + + // 2. Append the code point at position within input to value. + value += input[position.position] + // 3. Advance position by 1. + position.position++ -const EventEmitter = __nccwpck_require__(82361) + // 6. Otherwise: + } else { + // 1. Assert: quoteOrBackslash is U+0022 ("). + assert(quoteOrBackslash === '"') -class Dispatcher extends EventEmitter { - dispatch () { - throw new Error('not implemented') + // 2. Break. + break + } } - close () { - throw new Error('not implemented') + // 6. If the extract-value flag is set, then return value. + if (extractValue) { + return value } - destroy () { - throw new Error('not implemented') - } + // 7. Return the code points from positionStart to position, + // inclusive, within input. + return input.slice(positionStart, position.position) } -module.exports = Dispatcher - +/** + * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type + */ +function serializeAMimeType (mimeType) { + assert(mimeType !== 'failure') + const { parameters, essence } = mimeType -/***/ }), + // 1. Let serialization be the concatenation of mimeType’s + // type, U+002F (/), and mimeType’s subtype. + let serialization = essence -/***/ 41472: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + // 2. For each name → value of mimeType’s parameters: + for (let [name, value] of parameters.entries()) { + // 1. Append U+003B (;) to serialization. + serialization += ';' -"use strict"; + // 2. Append name to serialization. + serialization += name + // 3. Append U+003D (=) to serialization. + serialization += '=' -const Busboy = __nccwpck_require__(33438) -const util = __nccwpck_require__(83983) -const { - ReadableStreamFrom, - isBlobLike, - isReadableStreamLike, - readableStreamClose, - createDeferredPromise, - fullyReadBody -} = __nccwpck_require__(52538) -const { FormData } = __nccwpck_require__(72015) -const { kState } = __nccwpck_require__(15861) -const { webidl } = __nccwpck_require__(21744) -const { DOMException, structuredClone } = __nccwpck_require__(41037) -const { Blob, File: NativeFile } = __nccwpck_require__(14300) -const { kBodyUsed } = __nccwpck_require__(72785) -const assert = __nccwpck_require__(39491) -const { isErrored } = __nccwpck_require__(83983) -const { isUint8Array, isArrayBuffer } = __nccwpck_require__(29830) -const { File: UndiciFile } = __nccwpck_require__(78511) -const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685) + // 4. If value does not solely contain HTTP token code + // points or value is the empty string, then: + if (!HTTP_TOKEN_CODEPOINTS.test(value)) { + // 1. Precede each occurence of U+0022 (") or + // U+005C (\) in value with U+005C (\). + value = value.replace(/(\\|")/g, '\\$1') -let ReadableStream = globalThis.ReadableStream + // 2. Prepend U+0022 (") to value. + value = '"' + value -/** @type {globalThis['File']} */ -const File = NativeFile ?? UndiciFile + // 3. Append U+0022 (") to value. + value += '"' + } -// https://fetch.spec.whatwg.org/#concept-bodyinit-extract -function extractBody (object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = (__nccwpck_require__(35356).ReadableStream) + // 5. Append value to serialization. + serialization += value } - // 1. Let stream be null. - let stream = null + // 3. Return serialization. + return serialization +} - // 2. If object is a ReadableStream object, then set stream to object. - if (object instanceof ReadableStream) { - stream = object - } else if (isBlobLike(object)) { - // 3. Otherwise, if object is a Blob object, set stream to the - // result of running object’s get stream. - stream = object.stream() - } else { - // 4. Otherwise, set stream to a new ReadableStream object, and set - // up stream. - stream = new ReadableStream({ - async pull (controller) { - controller.enqueue( - typeof source === 'string' ? new TextEncoder().encode(source) : source - ) - queueMicrotask(() => readableStreamClose(controller)) - }, - start () {}, - type: undefined - }) +/** + * @see https://fetch.spec.whatwg.org/#http-whitespace + * @param {string} char + */ +function isHTTPWhiteSpace (char) { + return char === '\r' || char === '\n' || char === '\t' || char === ' ' +} + +/** + * @see https://fetch.spec.whatwg.org/#http-whitespace + * @param {string} str + */ +function removeHTTPWhitespace (str, leading = true, trailing = true) { + let lead = 0 + let trail = str.length - 1 + + if (leading) { + for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++); } - // 5. Assert: stream is a ReadableStream object. - assert(isReadableStreamLike(stream)) + if (trailing) { + for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--); + } - // 6. Let action be null. - let action = null + return str.slice(lead, trail + 1) +} - // 7. Let source be null. - let source = null +/** + * @see https://infra.spec.whatwg.org/#ascii-whitespace + * @param {string} char + */ +function isASCIIWhitespace (char) { + return char === '\r' || char === '\n' || char === '\t' || char === '\f' || char === ' ' +} - // 8. Let length be null. - let length = null +/** + * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace + */ +function removeASCIIWhitespace (str, leading = true, trailing = true) { + let lead = 0 + let trail = str.length - 1 - // 9. Let type be null. - let type = null + if (leading) { + for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++); + } - // 10. Switch on object: - if (typeof object === 'string') { - // Set source to the UTF-8 encoding of object. - // Note: setting source to a Uint8Array here breaks some mocking assumptions. - source = object + if (trailing) { + for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--); + } - // Set type to `text/plain;charset=UTF-8`. - type = 'text/plain;charset=UTF-8' - } else if (object instanceof URLSearchParams) { - // URLSearchParams + return str.slice(lead, trail + 1) +} - // spec says to run application/x-www-form-urlencoded on body.list - // this is implemented in Node.js as apart of an URLSearchParams instance toString method - // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490 - // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100 +module.exports = { + dataURLProcessor, + URLSerializer, + collectASequenceOfCodePoints, + collectASequenceOfCodePointsFast, + stringPercentDecode, + parseMIMEType, + collectAnHTTPQuotedString, + serializeAMimeType +} - // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list. - source = object.toString() - // Set type to `application/x-www-form-urlencoded;charset=UTF-8`. - type = 'application/x-www-form-urlencoded;charset=UTF-8' - } else if (isArrayBuffer(object)) { - // BufferSource/ArrayBuffer +/***/ }), + +/***/ 78511: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // Set source to a copy of the bytes held by object. - source = new Uint8Array(object.slice()) - } else if (ArrayBuffer.isView(object)) { - // BufferSource/ArrayBufferView +"use strict"; - // Set source to a copy of the bytes held by object. - source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)) - } else if (util.isFormDataLike(object)) { - const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '0')}` - const prefix = `--${boundary}\r\nContent-Disposition: form-data` - /*! formdata-polyfill. MIT License. Jimmy Wärting */ - const escape = (str) => - str.replace(/\n/g, '%0A').replace(/\r/g, '%0D').replace(/"/g, '%22') - const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, '\r\n') +const { Blob, File: NativeFile } = __nccwpck_require__(14300) +const { types } = __nccwpck_require__(73837) +const { kState } = __nccwpck_require__(15861) +const { isBlobLike } = __nccwpck_require__(52538) +const { webidl } = __nccwpck_require__(21744) +const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685) +const { kEnumerableProperty } = __nccwpck_require__(83983) +const encoder = new TextEncoder() - // Set action to this step: run the multipart/form-data - // encoding algorithm, with object’s entry list and UTF-8. - // - This ensures that the body is immutable and can't be changed afterwords - // - That the content-length is calculated in advance. - // - And that all parts are pre-encoded and ready to be sent. +class File extends Blob { + constructor (fileBits, fileName, options = {}) { + // The File constructor is invoked with two or three parameters, depending + // on whether the optional dictionary parameter is used. When the File() + // constructor is invoked, user agents must run the following steps: + webidl.argumentLengthCheck(arguments, 2, { header: 'File constructor' }) - const enc = new TextEncoder() - const blobParts = [] - const rn = new Uint8Array([13, 10]) // '\r\n' - length = 0 - let hasUnknownSizeValue = false + fileBits = webidl.converters['sequence'](fileBits) + fileName = webidl.converters.USVString(fileName) + options = webidl.converters.FilePropertyBag(options) - for (const [name, value] of object) { - if (typeof value === 'string') { - const chunk = enc.encode(prefix + - `; name="${escape(normalizeLinefeeds(name))}"` + - `\r\n\r\n${normalizeLinefeeds(value)}\r\n`) - blobParts.push(chunk) - length += chunk.byteLength - } else { - const chunk = enc.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + - (value.name ? `; filename="${escape(value.name)}"` : '') + '\r\n' + - `Content-Type: ${ - value.type || 'application/octet-stream' - }\r\n\r\n`) - blobParts.push(chunk, value, rn) - if (typeof value.size === 'number') { - length += chunk.byteLength + value.size + rn.byteLength - } else { - hasUnknownSizeValue = true - } - } - } + // 1. Let bytes be the result of processing blob parts given fileBits and + // options. + // Note: Blob handles this for us - const chunk = enc.encode(`--${boundary}--`) - blobParts.push(chunk) - length += chunk.byteLength - if (hasUnknownSizeValue) { - length = null - } + // 2. Let n be the fileName argument to the constructor. + const n = fileName - // Set source to object. - source = object + // 3. Process FilePropertyBag dictionary argument by running the following + // substeps: - action = async function * () { - for (const part of blobParts) { - if (part.stream) { - yield * part.stream() - } else { - yield part - } - } - } + // 1. If the type member is provided and is not the empty string, let t + // be set to the type dictionary member. If t contains any characters + // outside the range U+0020 to U+007E, then set t to the empty string + // and return from these substeps. + // 2. Convert every character in t to ASCII lowercase. + let t = options.type + let d - // Set type to `multipart/form-data; boundary=`, - // followed by the multipart/form-data boundary string generated - // by the multipart/form-data encoding algorithm. - type = 'multipart/form-data; boundary=' + boundary - } else if (isBlobLike(object)) { - // Blob + // eslint-disable-next-line no-labels + substep: { + if (t) { + t = parseMIMEType(t) - // Set source to object. - source = object + if (t === 'failure') { + t = '' + // eslint-disable-next-line no-labels + break substep + } - // Set length to object’s size. - length = object.size + t = serializeAMimeType(t).toLowerCase() + } - // If object’s type attribute is not the empty byte sequence, set - // type to its value. - if (object.type) { - type = object.type - } - } else if (typeof object[Symbol.asyncIterator] === 'function') { - // If keepalive is true, then throw a TypeError. - if (keepalive) { - throw new TypeError('keepalive') + // 3. If the lastModified member is provided, let d be set to the + // lastModified dictionary member. If it is not provided, set d to the + // current date and time represented as the number of milliseconds since + // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). + d = options.lastModified } - // If object is disturbed or locked, then throw a TypeError. - if (util.isDisturbed(object) || object.locked) { - throw new TypeError( - 'Response body object should not be disturbed or locked' - ) - } + // 4. Return a new File object F such that: + // F refers to the bytes byte sequence. + // F.size is set to the number of total bytes in bytes. + // F.name is set to n. + // F.type is set to t. + // F.lastModified is set to d. - stream = - object instanceof ReadableStream ? object : ReadableStreamFrom(object) + super(processBlobParts(fileBits, options), { type: t }) + this[kState] = { + name: n, + lastModified: d, + type: t + } } - // 11. If source is a byte sequence, then set action to a - // step that returns source and length to source’s length. - if (typeof source === 'string' || util.isBuffer(source)) { - length = Buffer.byteLength(source) - } + get name () { + webidl.brandCheck(this, File) - // 12. If action is non-null, then run these steps in in parallel: - if (action != null) { - // Run action. - let iterator - stream = new ReadableStream({ - async start () { - iterator = action(object)[Symbol.asyncIterator]() - }, - async pull (controller) { - const { value, done } = await iterator.next() - if (done) { - // When running action is done, close stream. - queueMicrotask(() => { - controller.close() - }) - } else { - // Whenever one or more bytes are available and stream is not errored, - // enqueue a Uint8Array wrapping an ArrayBuffer containing the available - // bytes into stream. - if (!isErrored(stream)) { - controller.enqueue(new Uint8Array(value)) - } - } - return controller.desiredSize > 0 - }, - async cancel (reason) { - await iterator.return() - }, - type: undefined - }) + return this[kState].name } - // 13. Let body be a body whose stream is stream, source is source, - // and length is length. - const body = { stream, source, length } - - // 14. Return (body, type). - return [body, type] -} + get lastModified () { + webidl.brandCheck(this, File) -// https://fetch.spec.whatwg.org/#bodyinit-safely-extract -function safelyExtractBody (object, keepalive = false) { - if (!ReadableStream) { - // istanbul ignore next - ReadableStream = (__nccwpck_require__(35356).ReadableStream) + return this[kState].lastModified } - // To safely extract a body and a `Content-Type` value from - // a byte sequence or BodyInit object object, run these steps: + get type () { + webidl.brandCheck(this, File) - // 1. If object is a ReadableStream object, then: - if (object instanceof ReadableStream) { - // Assert: object is neither disturbed nor locked. - // istanbul ignore next - assert(!util.isDisturbed(object), 'The body has already been consumed.') - // istanbul ignore next - assert(!object.locked, 'The stream is locked.') + return this[kState].type } - - // 2. Return the results of extracting object. - return extractBody(object, keepalive) } -function cloneBody (body) { - // To clone a body body, run these steps: +class FileLike { + constructor (blobLike, fileName, options = {}) { + // TODO: argument idl type check - // https://fetch.spec.whatwg.org/#concept-body-clone + // The File constructor is invoked with two or three parameters, depending + // on whether the optional dictionary parameter is used. When the File() + // constructor is invoked, user agents must run the following steps: - // 1. Let « out1, out2 » be the result of teeing body’s stream. - const [out1, out2] = body.stream.tee() - const out2Clone = structuredClone(out2, { transfer: [out2] }) - // This, for whatever reasons, unrefs out2Clone which allows - // the process to exit by itself. - const [, finalClone] = out2Clone.tee() + // 1. Let bytes be the result of processing blob parts given fileBits and + // options. - // 2. Set body’s stream to out1. - body.stream = out1 + // 2. Let n be the fileName argument to the constructor. + const n = fileName - // 3. Return a body whose stream is out2 and other members are copied from body. - return { - stream: finalClone, - length: body.length, - source: body.source - } -} + // 3. Process FilePropertyBag dictionary argument by running the following + // substeps: -async function * consumeBody (body) { - if (body) { - if (isUint8Array(body)) { - yield body - } else { - const stream = body.stream + // 1. If the type member is provided and is not the empty string, let t + // be set to the type dictionary member. If t contains any characters + // outside the range U+0020 to U+007E, then set t to the empty string + // and return from these substeps. + // TODO + const t = options.type - if (util.isDisturbed(stream)) { - throw new TypeError('The body has already been consumed.') - } + // 2. Convert every character in t to ASCII lowercase. + // TODO - if (stream.locked) { - throw new TypeError('The stream is locked.') - } + // 3. If the lastModified member is provided, let d be set to the + // lastModified dictionary member. If it is not provided, set d to the + // current date and time represented as the number of milliseconds since + // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). + const d = options.lastModified ?? Date.now() - // Compat. - stream[kBodyUsed] = true + // 4. Return a new File object F such that: + // F refers to the bytes byte sequence. + // F.size is set to the number of total bytes in bytes. + // F.name is set to n. + // F.type is set to t. + // F.lastModified is set to d. - yield * stream + this[kState] = { + blobLike, + name: n, + type: t, + lastModified: d } } -} -function throwIfAborted (state) { - if (state.aborted) { - throw new DOMException('The operation was aborted.', 'AbortError') + stream (...args) { + webidl.brandCheck(this, FileLike) + + return this[kState].blobLike.stream(...args) } -} -function bodyMixinMethods (instance) { - const methods = { - blob () { - // The blob() method steps are to return the result of - // running consume body with this and the following step - // given a byte sequence bytes: return a Blob whose - // contents are bytes and whose type attribute is this’s - // MIME type. - return specConsumeBody(this, (bytes) => { - let mimeType = bodyMimeType(this) + arrayBuffer (...args) { + webidl.brandCheck(this, FileLike) - if (mimeType === 'failure') { - mimeType = '' - } else if (mimeType) { - mimeType = serializeAMimeType(mimeType) - } + return this[kState].blobLike.arrayBuffer(...args) + } - // Return a Blob whose contents are bytes and type attribute - // is mimeType. - return new Blob([bytes], { type: mimeType }) - }, instance) - }, + slice (...args) { + webidl.brandCheck(this, FileLike) - arrayBuffer () { - // The arrayBuffer() method steps are to return the result - // of running consume body with this and the following step - // given a byte sequence bytes: return a new ArrayBuffer - // whose contents are bytes. - return specConsumeBody(this, (bytes) => { - return new Uint8Array(bytes).buffer - }, instance) - }, + return this[kState].blobLike.slice(...args) + } - text () { - // The text() method steps are to return the result of running - // consume body with this and UTF-8 decode. - return specConsumeBody(this, utf8DecodeBytes, instance) - }, + text (...args) { + webidl.brandCheck(this, FileLike) - json () { - // The json() method steps are to return the result of running - // consume body with this and parse JSON from bytes. - return specConsumeBody(this, parseJSONFromBytes, instance) - }, + return this[kState].blobLike.text(...args) + } - async formData () { - webidl.brandCheck(this, instance) + get size () { + webidl.brandCheck(this, FileLike) - throwIfAborted(this[kState]) + return this[kState].blobLike.size + } - const contentType = this.headers.get('Content-Type') + get type () { + webidl.brandCheck(this, FileLike) - // If mimeType’s essence is "multipart/form-data", then: - if (/multipart\/form-data/.test(contentType)) { - const headers = {} - for (const [key, value] of this.headers) headers[key.toLowerCase()] = value + return this[kState].blobLike.type + } - const responseFormData = new FormData() + get name () { + webidl.brandCheck(this, FileLike) - let busboy + return this[kState].name + } - try { - busboy = new Busboy({ - headers, - preservePath: true - }) - } catch (err) { - throw new DOMException(`${err}`, 'AbortError') - } + get lastModified () { + webidl.brandCheck(this, FileLike) - busboy.on('field', (name, value) => { - responseFormData.append(name, value) - }) - busboy.on('file', (name, value, filename, encoding, mimeType) => { - const chunks = [] + return this[kState].lastModified + } - if (encoding === 'base64' || encoding.toLowerCase() === 'base64') { - let base64chunk = '' + get [Symbol.toStringTag] () { + return 'File' + } +} - value.on('data', (chunk) => { - base64chunk += chunk.toString().replace(/[\r\n]/gm, '') +Object.defineProperties(File.prototype, { + [Symbol.toStringTag]: { + value: 'File', + configurable: true + }, + name: kEnumerableProperty, + lastModified: kEnumerableProperty +}) - const end = base64chunk.length - base64chunk.length % 4 - chunks.push(Buffer.from(base64chunk.slice(0, end), 'base64')) +webidl.converters.Blob = webidl.interfaceConverter(Blob) - base64chunk = base64chunk.slice(end) - }) - value.on('end', () => { - chunks.push(Buffer.from(base64chunk, 'base64')) - responseFormData.append(name, new File(chunks, filename, { type: mimeType })) - }) - } else { - value.on('data', (chunk) => { - chunks.push(chunk) - }) - value.on('end', () => { - responseFormData.append(name, new File(chunks, filename, { type: mimeType })) - }) - } - }) +webidl.converters.BlobPart = function (V, opts) { + if (webidl.util.Type(V) === 'Object') { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }) + } - const busboyResolve = new Promise((resolve, reject) => { - busboy.on('finish', resolve) - busboy.on('error', (err) => reject(new TypeError(err))) - }) + if ( + ArrayBuffer.isView(V) || + types.isAnyArrayBuffer(V) + ) { + return webidl.converters.BufferSource(V, opts) + } + } - if (this.body !== null) for await (const chunk of consumeBody(this[kState].body)) busboy.write(chunk) - busboy.end() - await busboyResolve + return webidl.converters.USVString(V, opts) +} - return responseFormData - } else if (/application\/x-www-form-urlencoded/.test(contentType)) { - // Otherwise, if mimeType’s essence is "application/x-www-form-urlencoded", then: +webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.BlobPart +) - // 1. Let entries be the result of parsing bytes. - let entries - try { - let text = '' - // application/x-www-form-urlencoded parser will keep the BOM. - // https://url.spec.whatwg.org/#concept-urlencoded-parser - const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true }) - for await (const chunk of consumeBody(this[kState].body)) { - if (!isUint8Array(chunk)) { - throw new TypeError('Expected Uint8Array chunk') - } - text += textDecoder.decode(chunk, { stream: true }) - } - text += textDecoder.decode() - entries = new URLSearchParams(text) - } catch (err) { - // istanbul ignore next: Unclear when new URLSearchParams can fail on a string. - // 2. If entries is failure, then throw a TypeError. - throw Object.assign(new TypeError(), { cause: err }) - } +// https://www.w3.org/TR/FileAPI/#dfn-FilePropertyBag +webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ + { + key: 'lastModified', + converter: webidl.converters['long long'], + get defaultValue () { + return Date.now() + } + }, + { + key: 'type', + converter: webidl.converters.DOMString, + defaultValue: '' + }, + { + key: 'endings', + converter: (value) => { + value = webidl.converters.DOMString(value) + value = value.toLowerCase() - // 3. Return a new FormData object whose entries are entries. - const formData = new FormData() - for (const [name, value] of entries) { - formData.append(name, value) - } - return formData - } else { - // Wait a tick before checking if the request has been aborted. - // Otherwise, a TypeError can be thrown when an AbortError should. - await Promise.resolve() + if (value !== 'native') { + value = 'transparent' + } + + return value + }, + defaultValue: 'transparent' + } +]) + +/** + * @see https://www.w3.org/TR/FileAPI/#process-blob-parts + * @param {(NodeJS.TypedArray|Blob|string)[]} parts + * @param {{ type: string, endings: string }} options + */ +function processBlobParts (parts, options) { + // 1. Let bytes be an empty sequence of bytes. + /** @type {NodeJS.TypedArray[]} */ + const bytes = [] - throwIfAborted(this[kState]) + // 2. For each element in parts: + for (const element of parts) { + // 1. If element is a USVString, run the following substeps: + if (typeof element === 'string') { + // 1. Let s be element. + let s = element - // Otherwise, throw a TypeError. - throw webidl.errors.exception({ - header: `${instance.name}.formData`, - message: 'Could not parse content as FormData.' - }) + // 2. If the endings member of options is "native", set s + // to the result of converting line endings to native + // of element. + if (options.endings === 'native') { + s = convertLineEndingsNative(s) + } + + // 3. Append the result of UTF-8 encoding s to bytes. + bytes.push(encoder.encode(s)) + } else if ( + types.isAnyArrayBuffer(element) || + types.isTypedArray(element) + ) { + // 2. If element is a BufferSource, get a copy of the + // bytes held by the buffer source, and append those + // bytes to bytes. + if (!element.buffer) { // ArrayBuffer + bytes.push(new Uint8Array(element)) + } else { + bytes.push( + new Uint8Array(element.buffer, element.byteOffset, element.byteLength) + ) } + } else if (isBlobLike(element)) { + // 3. If element is a Blob, append the bytes it represents + // to bytes. + bytes.push(element) } } - return methods -} - -function mixinBody (prototype) { - Object.assign(prototype.prototype, bodyMixinMethods(prototype)) + // 3. Return bytes. + return bytes } /** - * @see https://fetch.spec.whatwg.org/#concept-body-consume-body - * @param {Response|Request} object - * @param {(value: unknown) => unknown} convertBytesToJSValue - * @param {Response|Request} instance + * @see https://www.w3.org/TR/FileAPI/#convert-line-endings-to-native + * @param {string} s */ -async function specConsumeBody (object, convertBytesToJSValue, instance) { - webidl.brandCheck(object, instance) - - throwIfAborted(object[kState]) +function convertLineEndingsNative (s) { + // 1. Let native line ending be be the code point U+000A LF. + let nativeLineEnding = '\n' - // 1. If object is unusable, then return a promise rejected - // with a TypeError. - if (bodyUnusable(object[kState].body)) { - throw new TypeError('Body is unusable') + // 2. If the underlying platform’s conventions are to + // represent newlines as a carriage return and line feed + // sequence, set native line ending to the code point + // U+000D CR followed by the code point U+000A LF. + if (process.platform === 'win32') { + nativeLineEnding = '\r\n' } - // 2. Let promise be a new promise. - const promise = createDeferredPromise() + return s.replace(/\r?\n/g, nativeLineEnding) +} - // 3. Let errorSteps given error be to reject promise with error. - const errorSteps = (error) => promise.reject(error) +// If this function is moved to ./util.js, some tools (such as +// rollup) will warn about circular dependencies. See: +// https://github.com/nodejs/undici/issues/1629 +function isFileLike (object) { + return ( + (NativeFile && object instanceof NativeFile) || + object instanceof File || ( + object && + (typeof object.stream === 'function' || + typeof object.arrayBuffer === 'function') && + object[Symbol.toStringTag] === 'File' + ) + ) +} - // 4. Let successSteps given a byte sequence data be to resolve - // promise with the result of running convertBytesToJSValue - // with data. If that threw an exception, then run errorSteps - // with that exception. - const successSteps = (data) => { - try { - promise.resolve(convertBytesToJSValue(data)) - } catch (e) { - errorSteps(e) - } - } +module.exports = { File, FileLike, isFileLike } - // 5. If object’s body is null, then run successSteps with an - // empty byte sequence. - if (object[kState].body == null) { - successSteps(new Uint8Array()) - return promise.promise - } - // 6. Otherwise, fully read object’s body given successSteps, - // errorSteps, and object’s relevant global object. - await fullyReadBody(object[kState].body, successSteps, errorSteps) +/***/ }), - // 7. Return promise. - return promise.promise -} +/***/ 72015: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -// https://fetch.spec.whatwg.org/#body-unusable -function bodyUnusable (body) { - // An object including the Body interface mixin is - // said to be unusable if its body is non-null and - // its body’s stream is disturbed or locked. - return body != null && (body.stream.locked || util.isDisturbed(body.stream)) -} +"use strict"; -/** - * @see https://encoding.spec.whatwg.org/#utf-8-decode - * @param {Buffer} buffer - */ -function utf8DecodeBytes (buffer) { - if (buffer.length === 0) { - return '' - } - // 1. Let buffer be the result of peeking three bytes from - // ioQueue, converted to a byte sequence. +const { isBlobLike, toUSVString, makeIterator } = __nccwpck_require__(52538) +const { kState } = __nccwpck_require__(15861) +const { File: UndiciFile, FileLike, isFileLike } = __nccwpck_require__(78511) +const { webidl } = __nccwpck_require__(21744) +const { Blob, File: NativeFile } = __nccwpck_require__(14300) - // 2. If buffer is 0xEF 0xBB 0xBF, then read three - // bytes from ioQueue. (Do nothing with those bytes.) - if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) { - buffer = buffer.subarray(3) +/** @type {globalThis['File']} */ +const File = NativeFile ?? UndiciFile + +// https://xhr.spec.whatwg.org/#formdata +class FormData { + constructor (form) { + if (form !== undefined) { + throw webidl.errors.conversionFailed({ + prefix: 'FormData constructor', + argument: 'Argument 1', + types: ['undefined'] + }) + } + + this[kState] = [] } - // 3. Process a queue with an instance of UTF-8’s - // decoder, ioQueue, output, and "replacement". - const output = new TextDecoder().decode(buffer) + append (name, value, filename = undefined) { + webidl.brandCheck(this, FormData) - // 4. Return output. - return output -} + webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.append' }) -/** - * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value - * @param {Uint8Array} bytes - */ -function parseJSONFromBytes (bytes) { - return JSON.parse(utf8DecodeBytes(bytes)) -} + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" + ) + } -/** - * @see https://fetch.spec.whatwg.org/#concept-body-mime-type - * @param {import('./response').Response|import('./request').Request} object - */ -function bodyMimeType (object) { - const { headersList } = object[kState] - const contentType = headersList.get('content-type') + // 1. Let value be value if given; otherwise blobValue. - if (contentType === null) { - return 'failure' + name = webidl.converters.USVString(name) + value = isBlobLike(value) + ? webidl.converters.Blob(value, { strict: false }) + : webidl.converters.USVString(value) + filename = arguments.length === 3 + ? webidl.converters.USVString(filename) + : undefined + + // 2. Let entry be the result of creating an entry with + // name, value, and filename if given. + const entry = makeEntry(name, value, filename) + + // 3. Append entry to this’s entry list. + this[kState].push(entry) } - return parseMIMEType(contentType) -} + delete (name) { + webidl.brandCheck(this, FormData) -module.exports = { - extractBody, - safelyExtractBody, - cloneBody, - mixinBody -} + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.delete' }) + name = webidl.converters.USVString(name) -/***/ }), + // The delete(name) method steps are to remove all entries whose name + // is name from this’s entry list. + this[kState] = this[kState].filter(entry => entry.name !== name) + } -/***/ 41037: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + get (name) { + webidl.brandCheck(this, FormData) -"use strict"; + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.get' }) + name = webidl.converters.USVString(name) -const { MessageChannel, receiveMessageOnPort } = __nccwpck_require__(71267) + // 1. If there is no entry whose name is name in this’s entry list, + // then return null. + const idx = this[kState].findIndex((entry) => entry.name === name) + if (idx === -1) { + return null + } -const corsSafeListedMethods = ['GET', 'HEAD', 'POST'] + // 2. Return the value of the first entry whose name is name from + // this’s entry list. + return this[kState][idx].value + } -const nullBodyStatus = [101, 204, 205, 304] + getAll (name) { + webidl.brandCheck(this, FormData) -const redirectStatus = [301, 302, 303, 307, 308] + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.getAll' }) -// https://fetch.spec.whatwg.org/#block-bad-port -const badPorts = [ - '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79', - '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137', - '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532', - '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723', - '2049', '3659', '4045', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6697', - '10080' -] + name = webidl.converters.USVString(name) -// https://w3c.github.io/webappsec-referrer-policy/#referrer-policies -const referrerPolicy = [ - '', - 'no-referrer', - 'no-referrer-when-downgrade', - 'same-origin', - 'origin', - 'strict-origin', - 'origin-when-cross-origin', - 'strict-origin-when-cross-origin', - 'unsafe-url' -] + // 1. If there is no entry whose name is name in this’s entry list, + // then return the empty list. + // 2. Return the values of all entries whose name is name, in order, + // from this’s entry list. + return this[kState] + .filter((entry) => entry.name === name) + .map((entry) => entry.value) + } -const requestRedirect = ['follow', 'manual', 'error'] + has (name) { + webidl.brandCheck(this, FormData) -const safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE'] + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.has' }) -const requestMode = ['navigate', 'same-origin', 'no-cors', 'cors'] + name = webidl.converters.USVString(name) -const requestCredentials = ['omit', 'same-origin', 'include'] + // The has(name) method steps are to return true if there is an entry + // whose name is name in this’s entry list; otherwise false. + return this[kState].findIndex((entry) => entry.name === name) !== -1 + } -const requestCache = [ - 'default', - 'no-store', - 'reload', - 'no-cache', - 'force-cache', - 'only-if-cached' -] + set (name, value, filename = undefined) { + webidl.brandCheck(this, FormData) -// https://fetch.spec.whatwg.org/#request-body-header-name -const requestBodyHeader = [ - 'content-encoding', - 'content-language', - 'content-location', - 'content-type', - // See https://github.com/nodejs/undici/issues/2021 - // 'Content-Length' is a forbidden header name, which is typically - // removed in the Headers implementation. However, undici doesn't - // filter out headers, so we add it here. - 'content-length' -] + webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.set' }) -// https://fetch.spec.whatwg.org/#enumdef-requestduplex -const requestDuplex = [ - 'half' -] + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" + ) + } -// http://fetch.spec.whatwg.org/#forbidden-method -const forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK'] + // The set(name, value) and set(name, blobValue, filename) method steps + // are: -const subresource = [ - 'audio', - 'audioworklet', - 'font', - 'image', - 'manifest', - 'paintworklet', - 'script', - 'style', - 'track', - 'video', - 'xslt', - '' -] + // 1. Let value be value if given; otherwise blobValue. -/** @type {globalThis['DOMException']} */ -const DOMException = globalThis.DOMException ?? (() => { - // DOMException was only made a global in Node v17.0.0, - // but fetch supports >= v16.8. - try { - atob('~') - } catch (err) { - return Object.getPrototypeOf(err).constructor - } -})() + name = webidl.converters.USVString(name) + value = isBlobLike(value) + ? webidl.converters.Blob(value, { strict: false }) + : webidl.converters.USVString(value) + filename = arguments.length === 3 + ? toUSVString(filename) + : undefined -let channel + // 2. Let entry be the result of creating an entry with name, value, and + // filename if given. + const entry = makeEntry(name, value, filename) -/** @type {globalThis['structuredClone']} */ -const structuredClone = - globalThis.structuredClone ?? - // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js - // structuredClone was added in v17.0.0, but fetch supports v16.8 - function structuredClone (value, options = undefined) { - if (arguments.length === 0) { - throw new TypeError('missing argument') + // 3. If there are entries in this’s entry list whose name is name, then + // replace the first such entry with entry and remove the others. + const idx = this[kState].findIndex((entry) => entry.name === name) + if (idx !== -1) { + this[kState] = [ + ...this[kState].slice(0, idx), + entry, + ...this[kState].slice(idx + 1).filter((entry) => entry.name !== name) + ] + } else { + // 4. Otherwise, append entry to this’s entry list. + this[kState].push(entry) } + } - if (!channel) { - channel = new MessageChannel() - } - channel.port1.unref() - channel.port2.unref() - channel.port1.postMessage(value, options?.transfer) - return receiveMessageOnPort(channel.port2).message + entries () { + webidl.brandCheck(this, FormData) + + return makeIterator( + () => this[kState].map(pair => [pair.name, pair.value]), + 'FormData', + 'key+value' + ) } -module.exports = { - DOMException, - structuredClone, - subresource, - forbiddenMethods, - requestBodyHeader, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - redirectStatus, - corsSafeListedMethods, - nullBodyStatus, - safeMethods, - badPorts, - requestDuplex -} + keys () { + webidl.brandCheck(this, FormData) + return makeIterator( + () => this[kState].map(pair => [pair.name, pair.value]), + 'FormData', + 'key' + ) + } -/***/ }), + values () { + webidl.brandCheck(this, FormData) -/***/ 685: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + return makeIterator( + () => this[kState].map(pair => [pair.name, pair.value]), + 'FormData', + 'value' + ) + } -const assert = __nccwpck_require__(39491) -const { atob } = __nccwpck_require__(14300) -const { isomorphicDecode } = __nccwpck_require__(52538) + /** + * @param {(value: string, key: string, self: FormData) => void} callbackFn + * @param {unknown} thisArg + */ + forEach (callbackFn, thisArg = globalThis) { + webidl.brandCheck(this, FormData) -const encoder = new TextEncoder() + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.forEach' }) -/** - * @see https://mimesniff.spec.whatwg.org/#http-token-code-point - */ -const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/ -const HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/ // eslint-disable-line -/** - * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point - */ -const HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/ // eslint-disable-line + if (typeof callbackFn !== 'function') { + throw new TypeError( + "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." + ) + } -// https://fetch.spec.whatwg.org/#data-url-processor -/** @param {URL} dataURL */ -function dataURLProcessor (dataURL) { - // 1. Assert: dataURL’s scheme is "data". - assert(dataURL.protocol === 'data:') + for (const [key, value] of this) { + callbackFn.apply(thisArg, [value, key, this]) + } + } +} - // 2. Let input be the result of running the URL - // serializer on dataURL with exclude fragment - // set to true. - let input = URLSerializer(dataURL, true) +FormData.prototype[Symbol.iterator] = FormData.prototype.entries - // 3. Remove the leading "data:" string from input. - input = input.slice(5) +Object.defineProperties(FormData.prototype, { + [Symbol.toStringTag]: { + value: 'FormData', + configurable: true + } +}) - // 4. Let position point at the start of input. - const position = { position: 0 } +/** + * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry + * @param {string} name + * @param {string|Blob} value + * @param {?string} filename + * @returns + */ +function makeEntry (name, value, filename) { + // 1. Set name to the result of converting name into a scalar value string. + // "To convert a string into a scalar value string, replace any surrogates + // with U+FFFD." + // see: https://nodejs.org/dist/latest-v18.x/docs/api/buffer.html#buftostringencoding-start-end + name = Buffer.from(name).toString('utf8') - // 5. Let mimeType be the result of collecting a - // sequence of code points that are not equal - // to U+002C (,), given position. - let mimeType = collectASequenceOfCodePointsFast( - ',', - input, - position - ) + // 2. If value is a string, then set value to the result of converting + // value into a scalar value string. + if (typeof value === 'string') { + value = Buffer.from(value).toString('utf8') + } else { + // 3. Otherwise: + + // 1. If value is not a File object, then set value to a new File object, + // representing the same bytes, whose name attribute value is "blob" + if (!isFileLike(value)) { + value = value instanceof Blob + ? new File([value], 'blob', { type: value.type }) + : new FileLike(value, 'blob', { type: value.type }) + } - // 6. Strip leading and trailing ASCII whitespace - // from mimeType. - // Undici implementation note: we need to store the - // length because if the mimetype has spaces removed, - // the wrong amount will be sliced from the input in - // step #9 - const mimeTypeLength = mimeType.length - mimeType = removeASCIIWhitespace(mimeType, true, true) + // 2. If filename is given, then set value to a new File object, + // representing the same bytes, whose name attribute is filename. + if (filename !== undefined) { + /** @type {FilePropertyBag} */ + const options = { + type: value.type, + lastModified: value.lastModified + } - // 7. If position is past the end of input, then - // return failure - if (position.position >= input.length) { - return 'failure' + value = (NativeFile && value instanceof NativeFile) || value instanceof UndiciFile + ? new File([value], filename, options) + : new FileLike(value, filename, options) + } } - // 8. Advance position by 1. - position.position++ + // 4. Return an entry whose name is name and whose value is value. + return { name, value } +} - // 9. Let encodedBody be the remainder of input. - const encodedBody = input.slice(mimeTypeLength + 1) +module.exports = { FormData } - // 10. Let body be the percent-decoding of encodedBody. - let body = stringPercentDecode(encodedBody) - // 11. If mimeType ends with U+003B (;), followed by - // zero or more U+0020 SPACE, followed by an ASCII - // case-insensitive match for "base64", then: - if (/;(\u0020){0,}base64$/i.test(mimeType)) { - // 1. Let stringBody be the isomorphic decode of body. - const stringBody = isomorphicDecode(body) +/***/ }), - // 2. Set body to the forgiving-base64 decode of - // stringBody. - body = forgivingBase64(stringBody) +/***/ 71246: +/***/ ((module) => { - // 3. If body is failure, then return failure. - if (body === 'failure') { - return 'failure' - } +"use strict"; - // 4. Remove the last 6 code points from mimeType. - mimeType = mimeType.slice(0, -6) - // 5. Remove trailing U+0020 SPACE code points from mimeType, - // if any. - mimeType = mimeType.replace(/(\u0020)+$/, '') +// In case of breaking changes, increase the version +// number to avoid conflicts. +const globalOrigin = Symbol.for('undici.globalOrigin.1') - // 6. Remove the last U+003B (;) code point from mimeType. - mimeType = mimeType.slice(0, -1) - } +function getGlobalOrigin () { + return globalThis[globalOrigin] +} - // 12. If mimeType starts with U+003B (;), then prepend - // "text/plain" to mimeType. - if (mimeType.startsWith(';')) { - mimeType = 'text/plain' + mimeType +function setGlobalOrigin (newOrigin) { + if (newOrigin === undefined) { + Object.defineProperty(globalThis, globalOrigin, { + value: undefined, + writable: true, + enumerable: false, + configurable: false + }) + + return } - // 13. Let mimeTypeRecord be the result of parsing - // mimeType. - let mimeTypeRecord = parseMIMEType(mimeType) + const parsedURL = new URL(newOrigin) - // 14. If mimeTypeRecord is failure, then set - // mimeTypeRecord to text/plain;charset=US-ASCII. - if (mimeTypeRecord === 'failure') { - mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII') + if (parsedURL.protocol !== 'http:' && parsedURL.protocol !== 'https:') { + throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`) } - // 15. Return a new data: URL struct whose MIME - // type is mimeTypeRecord and body is body. - // https://fetch.spec.whatwg.org/#data-url-struct - return { mimeType: mimeTypeRecord, body } + Object.defineProperty(globalThis, globalOrigin, { + value: parsedURL, + writable: true, + enumerable: false, + configurable: false + }) } -// https://url.spec.whatwg.org/#concept-url-serializer -/** - * @param {URL} url - * @param {boolean} excludeFragment - */ -function URLSerializer (url, excludeFragment = false) { - const href = url.href +module.exports = { + getGlobalOrigin, + setGlobalOrigin +} - if (!excludeFragment) { - return href - } - const hash = href.lastIndexOf('#') - if (hash === -1) { - return href - } - return href.slice(0, hash) -} +/***/ }), -// https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points -/** - * @param {(char: string) => boolean} condition - * @param {string} input - * @param {{ position: number }} position - */ -function collectASequenceOfCodePoints (condition, input, position) { - // 1. Let result be the empty string. - let result = '' +/***/ 10554: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 2. While position doesn’t point past the end of input and the - // code point at position within input meets the condition condition: - while (position.position < input.length && condition(input[position.position])) { - // 1. Append that code point to the end of result. - result += input[position.position] +"use strict"; +// https://github.com/Ethan-Arrowood/undici-fetch - // 2. Advance position by 1. - position.position++ - } - // 3. Return result. - return result -} + +const { kHeadersList } = __nccwpck_require__(72785) +const { kGuard } = __nccwpck_require__(15861) +const { kEnumerableProperty } = __nccwpck_require__(83983) +const { + makeIterator, + isValidHeaderName, + isValidHeaderValue +} = __nccwpck_require__(52538) +const { webidl } = __nccwpck_require__(21744) +const assert = __nccwpck_require__(39491) + +const kHeadersMap = Symbol('headers map') +const kHeadersSortedMap = Symbol('headers map sorted') /** - * A faster collectASequenceOfCodePoints that only works when comparing a single character. - * @param {string} char - * @param {string} input - * @param {{ position: number }} position + * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize + * @param {string} potentialValue */ -function collectASequenceOfCodePointsFast (char, input, position) { - const idx = input.indexOf(char, position.position) - const start = position.position - - if (idx === -1) { - position.position = input.length - return input.slice(start) - } +function headerValueNormalize (potentialValue) { + // To normalize a byte sequence potentialValue, remove + // any leading and trailing HTTP whitespace bytes from + // potentialValue. - position.position = idx - return input.slice(start, position.position) + // Trimming the end with `.replace()` and a RegExp is typically subject to + // ReDoS. This is safer and faster. + let i = potentialValue.length + while (/[\r\n\t ]/.test(potentialValue.charAt(--i))); + return potentialValue.slice(0, i + 1).replace(/^[\r\n\t ]+/, '') } -// https://url.spec.whatwg.org/#string-percent-decode -/** @param {string} input */ -function stringPercentDecode (input) { - // 1. Let bytes be the UTF-8 encoding of input. - const bytes = encoder.encode(input) +function fill (headers, object) { + // To fill a Headers object headers with a given object object, run these steps: - // 2. Return the percent-decoding of bytes. - return percentDecode(bytes) + // 1. If object is a sequence, then for each header in object: + // Note: webidl conversion to array has already been done. + if (Array.isArray(object)) { + for (const header of object) { + // 1. If header does not contain exactly two items, then throw a TypeError. + if (header.length !== 2) { + throw webidl.errors.exception({ + header: 'Headers constructor', + message: `expected name/value pair to be length 2, found ${header.length}.` + }) + } + + // 2. Append (header’s first item, header’s second item) to headers. + headers.append(header[0], header[1]) + } + } else if (typeof object === 'object' && object !== null) { + // Note: null should throw + + // 2. Otherwise, object is a record, then for each key → value in object, + // append (key, value) to headers + for (const [key, value] of Object.entries(object)) { + headers.append(key, value) + } + } else { + throw webidl.errors.conversionFailed({ + prefix: 'Headers constructor', + argument: 'Argument 1', + types: ['sequence>', 'record'] + }) + } } -// https://url.spec.whatwg.org/#percent-decode -/** @param {Uint8Array} input */ -function percentDecode (input) { - // 1. Let output be an empty byte sequence. - /** @type {number[]} */ - const output = [] +class HeadersList { + /** @type {[string, string][]|null} */ + cookies = null - // 2. For each byte byte in input: - for (let i = 0; i < input.length; i++) { - const byte = input[i] + constructor (init) { + if (init instanceof HeadersList) { + this[kHeadersMap] = new Map(init[kHeadersMap]) + this[kHeadersSortedMap] = init[kHeadersSortedMap] + this.cookies = init.cookies + } else { + this[kHeadersMap] = new Map(init) + this[kHeadersSortedMap] = null + } + } - // 1. If byte is not 0x25 (%), then append byte to output. - if (byte !== 0x25) { - output.push(byte) + // https://fetch.spec.whatwg.org/#header-list-contains + contains (name) { + // A header list list contains a header name name if list + // contains a header whose name is a byte-case-insensitive + // match for name. + name = name.toLowerCase() - // 2. Otherwise, if byte is 0x25 (%) and the next two bytes - // after byte in input are not in the ranges - // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F), - // and 0x61 (a) to 0x66 (f), all inclusive, append byte - // to output. - } else if ( - byte === 0x25 && - !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2])) - ) { - output.push(0x25) + return this[kHeadersMap].has(name) + } - // 3. Otherwise: - } else { - // 1. Let bytePoint be the two bytes after byte in input, - // decoded, and then interpreted as hexadecimal number. - const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]) - const bytePoint = Number.parseInt(nextTwoBytes, 16) + clear () { + this[kHeadersMap].clear() + this[kHeadersSortedMap] = null + this.cookies = null + } - // 2. Append a byte whose value is bytePoint to output. - output.push(bytePoint) + // https://fetch.spec.whatwg.org/#concept-header-list-append + append (name, value) { + this[kHeadersSortedMap] = null - // 3. Skip the next two bytes in input. - i += 2 + // 1. If list contains name, then set name to the first such + // header’s name. + const lowercaseName = name.toLowerCase() + const exists = this[kHeadersMap].get(lowercaseName) + + // 2. Append (name, value) to list. + if (exists) { + const delimiter = lowercaseName === 'cookie' ? '; ' : ', ' + this[kHeadersMap].set(lowercaseName, { + name: exists.name, + value: `${exists.value}${delimiter}${value}` + }) + } else { + this[kHeadersMap].set(lowercaseName, { name, value }) + } + + if (lowercaseName === 'set-cookie') { + this.cookies ??= [] + this.cookies.push(value) } } - // 3. Return output. - return Uint8Array.from(output) -} + // https://fetch.spec.whatwg.org/#concept-header-list-set + set (name, value) { + this[kHeadersSortedMap] = null + const lowercaseName = name.toLowerCase() -// https://mimesniff.spec.whatwg.org/#parse-a-mime-type -/** @param {string} input */ -function parseMIMEType (input) { - // 1. Remove any leading and trailing HTTP whitespace - // from input. - input = removeHTTPWhitespace(input, true, true) + if (lowercaseName === 'set-cookie') { + this.cookies = [value] + } - // 2. Let position be a position variable for input, - // initially pointing at the start of input. - const position = { position: 0 } + // 1. If list contains name, then set the value of + // the first such header to value and remove the + // others. + // 2. Otherwise, append header (name, value) to list. + return this[kHeadersMap].set(lowercaseName, { name, value }) + } - // 3. Let type be the result of collecting a sequence - // of code points that are not U+002F (/) from - // input, given position. - const type = collectASequenceOfCodePointsFast( - '/', - input, - position - ) + // https://fetch.spec.whatwg.org/#concept-header-list-delete + delete (name) { + this[kHeadersSortedMap] = null - // 4. If type is the empty string or does not solely - // contain HTTP token code points, then return failure. - // https://mimesniff.spec.whatwg.org/#http-token-code-point - if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { - return 'failure' + name = name.toLowerCase() + + if (name === 'set-cookie') { + this.cookies = null + } + + return this[kHeadersMap].delete(name) } - // 5. If position is past the end of input, then return - // failure - if (position.position > input.length) { - return 'failure' + // https://fetch.spec.whatwg.org/#concept-header-list-get + get (name) { + // 1. If list does not contain name, then return null. + if (!this.contains(name)) { + return null + } + + // 2. Return the values of all headers in list whose name + // is a byte-case-insensitive match for name, + // separated from each other by 0x2C 0x20, in order. + return this[kHeadersMap].get(name.toLowerCase())?.value ?? null } - // 6. Advance position by 1. (This skips past U+002F (/).) - position.position++ + * [Symbol.iterator] () { + // use the lowercased name + for (const [name, { value }] of this[kHeadersMap]) { + yield [name, value] + } + } - // 7. Let subtype be the result of collecting a sequence of - // code points that are not U+003B (;) from input, given - // position. - let subtype = collectASequenceOfCodePointsFast( - ';', - input, - position - ) + get entries () { + const headers = {} - // 8. Remove any trailing HTTP whitespace from subtype. - subtype = removeHTTPWhitespace(subtype, false, true) + if (this[kHeadersMap].size) { + for (const { name, value } of this[kHeadersMap].values()) { + headers[name] = value + } + } - // 9. If subtype is the empty string or does not solely - // contain HTTP token code points, then return failure. - if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { - return 'failure' + return headers } +} - const typeLowercase = type.toLowerCase() - const subtypeLowercase = subtype.toLowerCase() +// https://fetch.spec.whatwg.org/#headers-class +class Headers { + constructor (init = undefined) { + this[kHeadersList] = new HeadersList() - // 10. Let mimeType be a new MIME type record whose type - // is type, in ASCII lowercase, and subtype is subtype, - // in ASCII lowercase. - // https://mimesniff.spec.whatwg.org/#mime-type - const mimeType = { - type: typeLowercase, - subtype: subtypeLowercase, - /** @type {Map} */ - parameters: new Map(), - // https://mimesniff.spec.whatwg.org/#mime-type-essence - essence: `${typeLowercase}/${subtypeLowercase}` - } + // The new Headers(init) constructor steps are: - // 11. While position is not past the end of input: - while (position.position < input.length) { - // 1. Advance position by 1. (This skips past U+003B (;).) - position.position++ + // 1. Set this’s guard to "none". + this[kGuard] = 'none' - // 2. Collect a sequence of code points that are HTTP - // whitespace from input given position. - collectASequenceOfCodePoints( - // https://fetch.spec.whatwg.org/#http-whitespace - char => HTTP_WHITESPACE_REGEX.test(char), - input, - position - ) + // 2. If init is given, then fill this with init. + if (init !== undefined) { + init = webidl.converters.HeadersInit(init) + fill(this, init) + } + } - // 3. Let parameterName be the result of collecting a - // sequence of code points that are not U+003B (;) - // or U+003D (=) from input, given position. - let parameterName = collectASequenceOfCodePoints( - (char) => char !== ';' && char !== '=', - input, - position - ) + // https://fetch.spec.whatwg.org/#dom-headers-append + append (name, value) { + webidl.brandCheck(this, Headers) - // 4. Set parameterName to parameterName, in ASCII - // lowercase. - parameterName = parameterName.toLowerCase() + webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.append' }) - // 5. If position is not past the end of input, then: - if (position.position < input.length) { - // 1. If the code point at position within input is - // U+003B (;), then continue. - if (input[position.position] === ';') { - continue - } + name = webidl.converters.ByteString(name) + value = webidl.converters.ByteString(value) - // 2. Advance position by 1. (This skips past U+003D (=).) - position.position++ + // 1. Normalize value. + value = headerValueNormalize(value) + + // 2. If name is not a header name or value is not a + // header value, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.append', + value: name, + type: 'header name' + }) + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.append', + value, + type: 'header value' + }) } - // 6. If position is past the end of input, then break. - if (position.position > input.length) { - break + // 3. If headers’s guard is "immutable", then throw a TypeError. + // 4. Otherwise, if headers’s guard is "request" and name is a + // forbidden header name, return. + // Note: undici does not implement forbidden header names + if (this[kGuard] === 'immutable') { + throw new TypeError('immutable') + } else if (this[kGuard] === 'request-no-cors') { + // 5. Otherwise, if headers’s guard is "request-no-cors": + // TODO } - // 7. Let parameterValue be null. - let parameterValue = null + // 6. Otherwise, if headers’s guard is "response" and name is a + // forbidden response-header name, return. - // 8. If the code point at position within input is - // U+0022 ("), then: - if (input[position.position] === '"') { - // 1. Set parameterValue to the result of collecting - // an HTTP quoted string from input, given position - // and the extract-value flag. - parameterValue = collectAnHTTPQuotedString(input, position, true) + // 7. Append (name, value) to headers’s header list. + // 8. If headers’s guard is "request-no-cors", then remove + // privileged no-CORS request headers from headers + return this[kHeadersList].append(name, value) + } + + // https://fetch.spec.whatwg.org/#dom-headers-delete + delete (name) { + webidl.brandCheck(this, Headers) - // 2. Collect a sequence of code points that are not - // U+003B (;) from input, given position. - collectASequenceOfCodePointsFast( - ';', - input, - position - ) + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.delete' }) - // 9. Otherwise: - } else { - // 1. Set parameterValue to the result of collecting - // a sequence of code points that are not U+003B (;) - // from input, given position. - parameterValue = collectASequenceOfCodePointsFast( - ';', - input, - position - ) + name = webidl.converters.ByteString(name) - // 2. Remove any trailing HTTP whitespace from parameterValue. - parameterValue = removeHTTPWhitespace(parameterValue, false, true) + // 1. If name is not a header name, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.delete', + value: name, + type: 'header name' + }) + } - // 3. If parameterValue is the empty string, then continue. - if (parameterValue.length === 0) { - continue - } + // 2. If this’s guard is "immutable", then throw a TypeError. + // 3. Otherwise, if this’s guard is "request" and name is a + // forbidden header name, return. + // 4. Otherwise, if this’s guard is "request-no-cors", name + // is not a no-CORS-safelisted request-header name, and + // name is not a privileged no-CORS request-header name, + // return. + // 5. Otherwise, if this’s guard is "response" and name is + // a forbidden response-header name, return. + // Note: undici does not implement forbidden header names + if (this[kGuard] === 'immutable') { + throw new TypeError('immutable') + } else if (this[kGuard] === 'request-no-cors') { + // TODO } - // 10. If all of the following are true - // - parameterName is not the empty string - // - parameterName solely contains HTTP token code points - // - parameterValue solely contains HTTP quoted-string token code points - // - mimeType’s parameters[parameterName] does not exist - // then set mimeType’s parameters[parameterName] to parameterValue. - if ( - parameterName.length !== 0 && - HTTP_TOKEN_CODEPOINTS.test(parameterName) && - (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && - !mimeType.parameters.has(parameterName) - ) { - mimeType.parameters.set(parameterName, parameterValue) + // 6. If this’s header list does not contain name, then + // return. + if (!this[kHeadersList].contains(name)) { + return } + + // 7. Delete name from this’s header list. + // 8. If this’s guard is "request-no-cors", then remove + // privileged no-CORS request headers from this. + return this[kHeadersList].delete(name) } - // 12. Return mimeType. - return mimeType -} + // https://fetch.spec.whatwg.org/#dom-headers-get + get (name) { + webidl.brandCheck(this, Headers) -// https://infra.spec.whatwg.org/#forgiving-base64-decode -/** @param {string} data */ -function forgivingBase64 (data) { - // 1. Remove all ASCII whitespace from data. - data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, '') // eslint-disable-line + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.get' }) - // 2. If data’s code point length divides by 4 leaving - // no remainder, then: - if (data.length % 4 === 0) { - // 1. If data ends with one or two U+003D (=) code points, - // then remove them from data. - data = data.replace(/=?=$/, '') - } + name = webidl.converters.ByteString(name) - // 3. If data’s code point length divides by 4 leaving - // a remainder of 1, then return failure. - if (data.length % 4 === 1) { - return 'failure' - } + // 1. If name is not a header name, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.get', + value: name, + type: 'header name' + }) + } - // 4. If data contains a code point that is not one of - // U+002B (+) - // U+002F (/) - // ASCII alphanumeric - // then return failure. - if (/[^+/0-9A-Za-z]/.test(data)) { - return 'failure' + // 2. Return the result of getting name from this’s header + // list. + return this[kHeadersList].get(name) } - const binary = atob(data) - const bytes = new Uint8Array(binary.length) + // https://fetch.spec.whatwg.org/#dom-headers-has + has (name) { + webidl.brandCheck(this, Headers) - for (let byte = 0; byte < binary.length; byte++) { - bytes[byte] = binary.charCodeAt(byte) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.has' }) - return bytes -} + name = webidl.converters.ByteString(name) -// https://fetch.spec.whatwg.org/#collect-an-http-quoted-string -// tests: https://fetch.spec.whatwg.org/#example-http-quoted-string -/** - * @param {string} input - * @param {{ position: number }} position - * @param {boolean?} extractValue - */ -function collectAnHTTPQuotedString (input, position, extractValue) { - // 1. Let positionStart be position. - const positionStart = position.position + // 1. If name is not a header name, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.has', + value: name, + type: 'header name' + }) + } - // 2. Let value be the empty string. - let value = '' + // 2. Return true if this’s header list contains name; + // otherwise false. + return this[kHeadersList].contains(name) + } - // 3. Assert: the code point at position within input - // is U+0022 ("). - assert(input[position.position] === '"') + // https://fetch.spec.whatwg.org/#dom-headers-set + set (name, value) { + webidl.brandCheck(this, Headers) - // 4. Advance position by 1. - position.position++ + webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.set' }) - // 5. While true: - while (true) { - // 1. Append the result of collecting a sequence of code points - // that are not U+0022 (") or U+005C (\) from input, given - // position, to value. - value += collectASequenceOfCodePoints( - (char) => char !== '"' && char !== '\\', - input, - position - ) + name = webidl.converters.ByteString(name) + value = webidl.converters.ByteString(value) - // 2. If position is past the end of input, then break. - if (position.position >= input.length) { - break - } + // 1. Normalize value. + value = headerValueNormalize(value) - // 3. Let quoteOrBackslash be the code point at position within - // input. - const quoteOrBackslash = input[position.position] + // 2. If name is not a header name or value is not a + // header value, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.set', + value: name, + type: 'header name' + }) + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.set', + value, + type: 'header value' + }) + } - // 4. Advance position by 1. - position.position++ + // 3. If this’s guard is "immutable", then throw a TypeError. + // 4. Otherwise, if this’s guard is "request" and name is a + // forbidden header name, return. + // 5. Otherwise, if this’s guard is "request-no-cors" and + // name/value is not a no-CORS-safelisted request-header, + // return. + // 6. Otherwise, if this’s guard is "response" and name is a + // forbidden response-header name, return. + // Note: undici does not implement forbidden header names + if (this[kGuard] === 'immutable') { + throw new TypeError('immutable') + } else if (this[kGuard] === 'request-no-cors') { + // TODO + } - // 5. If quoteOrBackslash is U+005C (\), then: - if (quoteOrBackslash === '\\') { - // 1. If position is past the end of input, then append - // U+005C (\) to value and break. - if (position.position >= input.length) { - value += '\\' - break - } + // 7. Set (name, value) in this’s header list. + // 8. If this’s guard is "request-no-cors", then remove + // privileged no-CORS request headers from this + return this[kHeadersList].set(name, value) + } - // 2. Append the code point at position within input to value. - value += input[position.position] + // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie + getSetCookie () { + webidl.brandCheck(this, Headers) - // 3. Advance position by 1. - position.position++ + // 1. If this’s header list does not contain `Set-Cookie`, then return « ». + // 2. Return the values of all headers in this’s header list whose name is + // a byte-case-insensitive match for `Set-Cookie`, in order. - // 6. Otherwise: - } else { - // 1. Assert: quoteOrBackslash is U+0022 ("). - assert(quoteOrBackslash === '"') + const list = this[kHeadersList].cookies - // 2. Break. - break + if (list) { + return [...list] } - } - // 6. If the extract-value flag is set, then return value. - if (extractValue) { - return value + return [] } - // 7. Return the code points from positionStart to position, - // inclusive, within input. - return input.slice(positionStart, position.position) -} - -/** - * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type - */ -function serializeAMimeType (mimeType) { - assert(mimeType !== 'failure') - const { parameters, essence } = mimeType + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + get [kHeadersSortedMap] () { + if (this[kHeadersList][kHeadersSortedMap]) { + return this[kHeadersList][kHeadersSortedMap] + } - // 1. Let serialization be the concatenation of mimeType’s - // type, U+002F (/), and mimeType’s subtype. - let serialization = essence + // 1. Let headers be an empty list of headers with the key being the name + // and value the value. + const headers = [] - // 2. For each name → value of mimeType’s parameters: - for (let [name, value] of parameters.entries()) { - // 1. Append U+003B (;) to serialization. - serialization += ';' + // 2. Let names be the result of convert header names to a sorted-lowercase + // set with all the names of the headers in list. + const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1) + const cookies = this[kHeadersList].cookies - // 2. Append name to serialization. - serialization += name + // 3. For each name of names: + for (const [name, value] of names) { + // 1. If name is `set-cookie`, then: + if (name === 'set-cookie') { + // 1. Let values be a list of all values of headers in list whose name + // is a byte-case-insensitive match for name, in order. - // 3. Append U+003D (=) to serialization. - serialization += '=' + // 2. For each value of values: + // 1. Append (name, value) to headers. + for (const value of cookies) { + headers.push([name, value]) + } + } else { + // 2. Otherwise: - // 4. If value does not solely contain HTTP token code - // points or value is the empty string, then: - if (!HTTP_TOKEN_CODEPOINTS.test(value)) { - // 1. Precede each occurence of U+0022 (") or - // U+005C (\) in value with U+005C (\). - value = value.replace(/(\\|")/g, '\\$1') + // 1. Let value be the result of getting name from list. - // 2. Prepend U+0022 (") to value. - value = '"' + value + // 2. Assert: value is non-null. + assert(value !== null) - // 3. Append U+0022 (") to value. - value += '"' + // 3. Append (name, value) to headers. + headers.push([name, value]) + } } - // 5. Append value to serialization. - serialization += value + this[kHeadersList][kHeadersSortedMap] = headers + + // 4. Return headers. + return headers } - // 3. Return serialization. - return serialization -} + keys () { + webidl.brandCheck(this, Headers) -/** - * @see https://fetch.spec.whatwg.org/#http-whitespace - * @param {string} char - */ -function isHTTPWhiteSpace (char) { - return char === '\r' || char === '\n' || char === '\t' || char === ' ' -} + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + 'Headers', + 'key' + ) + } -/** - * @see https://fetch.spec.whatwg.org/#http-whitespace - * @param {string} str - */ -function removeHTTPWhitespace (str, leading = true, trailing = true) { - let lead = 0 - let trail = str.length - 1 + values () { + webidl.brandCheck(this, Headers) - if (leading) { - for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++); + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + 'Headers', + 'value' + ) } - if (trailing) { - for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--); + entries () { + webidl.brandCheck(this, Headers) + + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + 'Headers', + 'key+value' + ) } - return str.slice(lead, trail + 1) -} + /** + * @param {(value: string, key: string, self: Headers) => void} callbackFn + * @param {unknown} thisArg + */ + forEach (callbackFn, thisArg = globalThis) { + webidl.brandCheck(this, Headers) -/** - * @see https://infra.spec.whatwg.org/#ascii-whitespace - * @param {string} char - */ -function isASCIIWhitespace (char) { - return char === '\r' || char === '\n' || char === '\t' || char === '\f' || char === ' ' + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.forEach' }) + + if (typeof callbackFn !== 'function') { + throw new TypeError( + "Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'." + ) + } + + for (const [key, value] of this) { + callbackFn.apply(thisArg, [value, key, this]) + } + } + + [Symbol.for('nodejs.util.inspect.custom')] () { + webidl.brandCheck(this, Headers) + + return this[kHeadersList] + } } -/** - * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace - */ -function removeASCIIWhitespace (str, leading = true, trailing = true) { - let lead = 0 - let trail = str.length - 1 +Headers.prototype[Symbol.iterator] = Headers.prototype.entries - if (leading) { - for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++); +Object.defineProperties(Headers.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + getSetCookie: kEnumerableProperty, + keys: kEnumerableProperty, + values: kEnumerableProperty, + entries: kEnumerableProperty, + forEach: kEnumerableProperty, + [Symbol.iterator]: { enumerable: false }, + [Symbol.toStringTag]: { + value: 'Headers', + configurable: true } +}) - if (trailing) { - for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--); +webidl.converters.HeadersInit = function (V) { + if (webidl.util.Type(V) === 'Object') { + if (V[Symbol.iterator]) { + return webidl.converters['sequence>'](V) + } + + return webidl.converters['record'](V) } - return str.slice(lead, trail + 1) + throw webidl.errors.conversionFailed({ + prefix: 'Headers constructor', + argument: 'Argument 1', + types: ['sequence>', 'record'] + }) } module.exports = { - dataURLProcessor, - URLSerializer, - collectASequenceOfCodePoints, - collectASequenceOfCodePointsFast, - stringPercentDecode, - parseMIMEType, - collectAnHTTPQuotedString, - serializeAMimeType + fill, + Headers, + HeadersList } /***/ }), -/***/ 78511: +/***/ 74881: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; +// https://github.com/Ethan-Arrowood/undici-fetch -const { Blob, File: NativeFile } = __nccwpck_require__(14300) -const { types } = __nccwpck_require__(73837) -const { kState } = __nccwpck_require__(15861) -const { isBlobLike } = __nccwpck_require__(52538) -const { webidl } = __nccwpck_require__(21744) -const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685) -const { kEnumerableProperty } = __nccwpck_require__(83983) - -class File extends Blob { - constructor (fileBits, fileName, options = {}) { - // The File constructor is invoked with two or three parameters, depending - // on whether the optional dictionary parameter is used. When the File() - // constructor is invoked, user agents must run the following steps: - webidl.argumentLengthCheck(arguments, 2, { header: 'File constructor' }) - fileBits = webidl.converters['sequence'](fileBits) - fileName = webidl.converters.USVString(fileName) - options = webidl.converters.FilePropertyBag(options) +const { + Response, + makeNetworkError, + makeAppropriateNetworkError, + filterResponse, + makeResponse +} = __nccwpck_require__(27823) +const { Headers } = __nccwpck_require__(10554) +const { Request, makeRequest } = __nccwpck_require__(48359) +const zlib = __nccwpck_require__(59796) +const { + bytesMatch, + makePolicyContainer, + clonePolicyContainer, + requestBadPort, + TAOCheck, + appendRequestOriginHeader, + responseLocationURL, + requestCurrentURL, + setRequestReferrerPolicyOnRedirect, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + createOpaqueTimingInfo, + appendFetchMetadata, + corsCheck, + crossOriginResourcePolicyCheck, + determineRequestsReferrer, + coarsenedSharedCurrentTime, + createDeferredPromise, + isBlobLike, + sameOrigin, + isCancelled, + isAborted, + isErrorLike, + fullyReadBody, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlIsHttpHttpsScheme, + urlHasHttpsScheme +} = __nccwpck_require__(52538) +const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(15861) +const assert = __nccwpck_require__(39491) +const { safelyExtractBody } = __nccwpck_require__(41472) +const { + redirectStatusSet, + nullBodyStatus, + safeMethodsSet, + requestBodyHeader, + subresourceSet, + DOMException +} = __nccwpck_require__(41037) +const { kHeadersList } = __nccwpck_require__(72785) +const EE = __nccwpck_require__(82361) +const { Readable, pipeline } = __nccwpck_require__(12781) +const { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = __nccwpck_require__(83983) +const { dataURLProcessor, serializeAMimeType } = __nccwpck_require__(685) +const { TransformStream } = __nccwpck_require__(35356) +const { getGlobalDispatcher } = __nccwpck_require__(21892) +const { webidl } = __nccwpck_require__(21744) +const { STATUS_CODES } = __nccwpck_require__(13685) +const GET_OR_HEAD = ['GET', 'HEAD'] - // 1. Let bytes be the result of processing blob parts given fileBits and - // options. - // Note: Blob handles this for us +/** @type {import('buffer').resolveObjectURL} */ +let resolveObjectURL +let ReadableStream = globalThis.ReadableStream - // 2. Let n be the fileName argument to the constructor. - const n = fileName +class Fetch extends EE { + constructor (dispatcher) { + super() - // 3. Process FilePropertyBag dictionary argument by running the following - // substeps: + this.dispatcher = dispatcher + this.connection = null + this.dump = false + this.state = 'ongoing' + // 2 terminated listeners get added per request, + // but only 1 gets removed. If there are 20 redirects, + // 21 listeners will be added. + // See https://github.com/nodejs/undici/issues/1711 + // TODO (fix): Find and fix root cause for leaked listener. + this.setMaxListeners(21) + } - // 1. If the type member is provided and is not the empty string, let t - // be set to the type dictionary member. If t contains any characters - // outside the range U+0020 to U+007E, then set t to the empty string - // and return from these substeps. - // 2. Convert every character in t to ASCII lowercase. - let t = options.type - let d + terminate (reason) { + if (this.state !== 'ongoing') { + return + } - // eslint-disable-next-line no-labels - substep: { - if (t) { - t = parseMIMEType(t) + this.state = 'terminated' + this.connection?.destroy(reason) + this.emit('terminated', reason) + } - if (t === 'failure') { - t = '' - // eslint-disable-next-line no-labels - break substep - } + // https://fetch.spec.whatwg.org/#fetch-controller-abort + abort (error) { + if (this.state !== 'ongoing') { + return + } - t = serializeAMimeType(t).toLowerCase() - } + // 1. Set controller’s state to "aborted". + this.state = 'aborted' - // 3. If the lastModified member is provided, let d be set to the - // lastModified dictionary member. If it is not provided, set d to the - // current date and time represented as the number of milliseconds since - // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). - d = options.lastModified + // 2. Let fallbackError be an "AbortError" DOMException. + // 3. Set error to fallbackError if it is not given. + if (!error) { + error = new DOMException('The operation was aborted.', 'AbortError') } - // 4. Return a new File object F such that: - // F refers to the bytes byte sequence. - // F.size is set to the number of total bytes in bytes. - // F.name is set to n. - // F.type is set to t. - // F.lastModified is set to d. + // 4. Let serializedError be StructuredSerialize(error). + // If that threw an exception, catch it, and let + // serializedError be StructuredSerialize(fallbackError). - super(processBlobParts(fileBits, options), { type: t }) - this[kState] = { - name: n, - lastModified: d, - type: t - } + // 5. Set controller’s serialized abort reason to serializedError. + this.serializedAbortReason = error + + this.connection?.destroy(error) + this.emit('terminated', error) } +} - get name () { - webidl.brandCheck(this, File) +// https://fetch.spec.whatwg.org/#fetch-method +function fetch (input, init = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' }) - return this[kState].name - } + // 1. Let p be a new promise. + const p = createDeferredPromise() - get lastModified () { - webidl.brandCheck(this, File) + // 2. Let requestObject be the result of invoking the initial value of + // Request as constructor with input and init as arguments. If this throws + // an exception, reject p with it and return p. + let requestObject - return this[kState].lastModified + try { + requestObject = new Request(input, init) + } catch (e) { + p.reject(e) + return p.promise } - get type () { - webidl.brandCheck(this, File) + // 3. Let request be requestObject’s request. + const request = requestObject[kState] - return this[kState].type + // 4. If requestObject’s signal’s aborted flag is set, then: + if (requestObject.signal.aborted) { + // 1. Abort the fetch() call with p, request, null, and + // requestObject’s signal’s abort reason. + abortFetch(p, request, null, requestObject.signal.reason) + + // 2. Return p. + return p.promise } -} -class FileLike { - constructor (blobLike, fileName, options = {}) { - // TODO: argument idl type check + // 5. Let globalObject be request’s client’s global object. + const globalObject = request.client.globalObject - // The File constructor is invoked with two or three parameters, depending - // on whether the optional dictionary parameter is used. When the File() - // constructor is invoked, user agents must run the following steps: + // 6. If globalObject is a ServiceWorkerGlobalScope object, then set + // request’s service-workers mode to "none". + if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') { + request.serviceWorkers = 'none' + } - // 1. Let bytes be the result of processing blob parts given fileBits and - // options. + // 7. Let responseObject be null. + let responseObject = null - // 2. Let n be the fileName argument to the constructor. - const n = fileName + // 8. Let relevantRealm be this’s relevant Realm. + const relevantRealm = null - // 3. Process FilePropertyBag dictionary argument by running the following - // substeps: + // 9. Let locallyAborted be false. + let locallyAborted = false - // 1. If the type member is provided and is not the empty string, let t - // be set to the type dictionary member. If t contains any characters - // outside the range U+0020 to U+007E, then set t to the empty string - // and return from these substeps. - // TODO - const t = options.type + // 10. Let controller be null. + let controller = null - // 2. Convert every character in t to ASCII lowercase. - // TODO + // 11. Add the following abort steps to requestObject’s signal: + addAbortListener( + requestObject.signal, + () => { + // 1. Set locallyAborted to true. + locallyAborted = true - // 3. If the lastModified member is provided, let d be set to the - // lastModified dictionary member. If it is not provided, set d to the - // current date and time represented as the number of milliseconds since - // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). - const d = options.lastModified ?? Date.now() + // 2. Assert: controller is non-null. + assert(controller != null) - // 4. Return a new File object F such that: - // F refers to the bytes byte sequence. - // F.size is set to the number of total bytes in bytes. - // F.name is set to n. - // F.type is set to t. - // F.lastModified is set to d. + // 3. Abort controller with requestObject’s signal’s abort reason. + controller.abort(requestObject.signal.reason) - this[kState] = { - blobLike, - name: n, - type: t, - lastModified: d + // 4. Abort the fetch() call with p, request, responseObject, + // and requestObject’s signal’s abort reason. + abortFetch(p, request, responseObject, requestObject.signal.reason) } - } + ) - stream (...args) { - webidl.brandCheck(this, FileLike) + // 12. Let handleFetchDone given response response be to finalize and + // report timing with response, globalObject, and "fetch". + const handleFetchDone = (response) => + finalizeAndReportTiming(response, 'fetch') - return this[kState].blobLike.stream(...args) - } + // 13. Set controller to the result of calling fetch given request, + // with processResponseEndOfBody set to handleFetchDone, and processResponse + // given response being these substeps: - arrayBuffer (...args) { - webidl.brandCheck(this, FileLike) + const processResponse = (response) => { + // 1. If locallyAborted is true, terminate these substeps. + if (locallyAborted) { + return Promise.resolve() + } - return this[kState].blobLike.arrayBuffer(...args) - } + // 2. If response’s aborted flag is set, then: + if (response.aborted) { + // 1. Let deserializedError be the result of deserialize a serialized + // abort reason given controller’s serialized abort reason and + // relevantRealm. - slice (...args) { - webidl.brandCheck(this, FileLike) + // 2. Abort the fetch() call with p, request, responseObject, and + // deserializedError. - return this[kState].blobLike.slice(...args) - } + abortFetch(p, request, responseObject, controller.serializedAbortReason) + return Promise.resolve() + } - text (...args) { - webidl.brandCheck(this, FileLike) + // 3. If response is a network error, then reject p with a TypeError + // and terminate these substeps. + if (response.type === 'error') { + p.reject( + Object.assign(new TypeError('fetch failed'), { cause: response.error }) + ) + return Promise.resolve() + } - return this[kState].blobLike.text(...args) + // 4. Set responseObject to the result of creating a Response object, + // given response, "immutable", and relevantRealm. + responseObject = new Response() + responseObject[kState] = response + responseObject[kRealm] = relevantRealm + responseObject[kHeaders][kHeadersList] = response.headersList + responseObject[kHeaders][kGuard] = 'immutable' + responseObject[kHeaders][kRealm] = relevantRealm + + // 5. Resolve p with responseObject. + p.resolve(responseObject) } - get size () { - webidl.brandCheck(this, FileLike) + controller = fetching({ + request, + processResponseEndOfBody: handleFetchDone, + processResponse, + dispatcher: init.dispatcher ?? getGlobalDispatcher() // undici + }) - return this[kState].blobLike.size - } + // 14. Return p. + return p.promise +} - get type () { - webidl.brandCheck(this, FileLike) +// https://fetch.spec.whatwg.org/#finalize-and-report-timing +function finalizeAndReportTiming (response, initiatorType = 'other') { + // 1. If response is an aborted network error, then return. + if (response.type === 'error' && response.aborted) { + return + } - return this[kState].blobLike.type + // 2. If response’s URL list is null or empty, then return. + if (!response.urlList?.length) { + return } - get name () { - webidl.brandCheck(this, FileLike) + // 3. Let originalURL be response’s URL list[0]. + const originalURL = response.urlList[0] - return this[kState].name - } + // 4. Let timingInfo be response’s timing info. + let timingInfo = response.timingInfo - get lastModified () { - webidl.brandCheck(this, FileLike) + // 5. Let cacheState be response’s cache state. + let cacheState = response.cacheState - return this[kState].lastModified + // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return. + if (!urlIsHttpHttpsScheme(originalURL)) { + return } - get [Symbol.toStringTag] () { - return 'File' + // 7. If timingInfo is null, then return. + if (timingInfo === null) { + return } -} - -Object.defineProperties(File.prototype, { - [Symbol.toStringTag]: { - value: 'File', - configurable: true - }, - name: kEnumerableProperty, - lastModified: kEnumerableProperty -}) - -webidl.converters.Blob = webidl.interfaceConverter(Blob) -webidl.converters.BlobPart = function (V, opts) { - if (webidl.util.Type(V) === 'Object') { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }) - } + // 8. If response’s timing allow passed flag is not set, then: + if (!timingInfo.timingAllowPassed) { + // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo. + timingInfo = createOpaqueTimingInfo({ + startTime: timingInfo.startTime + }) - if ( - ArrayBuffer.isView(V) || - types.isAnyArrayBuffer(V) - ) { - return webidl.converters.BufferSource(V, opts) - } + // 2. Set cacheState to the empty string. + cacheState = '' } - return webidl.converters.USVString(V, opts) -} - -webidl.converters['sequence'] = webidl.sequenceConverter( - webidl.converters.BlobPart -) + // 9. Set timingInfo’s end time to the coarsened shared current time + // given global’s relevant settings object’s cross-origin isolated + // capability. + // TODO: given global’s relevant settings object’s cross-origin isolated + // capability? + timingInfo.endTime = coarsenedSharedCurrentTime() -// https://www.w3.org/TR/FileAPI/#dfn-FilePropertyBag -webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ - { - key: 'lastModified', - converter: webidl.converters['long long'], - get defaultValue () { - return Date.now() - } - }, - { - key: 'type', - converter: webidl.converters.DOMString, - defaultValue: '' - }, - { - key: 'endings', - converter: (value) => { - value = webidl.converters.DOMString(value) - value = value.toLowerCase() + // 10. Set response’s timing info to timingInfo. + response.timingInfo = timingInfo - if (value !== 'native') { - value = 'transparent' - } + // 11. Mark resource timing for timingInfo, originalURL, initiatorType, + // global, and cacheState. + markResourceTiming( + timingInfo, + originalURL, + initiatorType, + globalThis, + cacheState + ) +} - return value - }, - defaultValue: 'transparent' +// https://w3c.github.io/resource-timing/#dfn-mark-resource-timing +function markResourceTiming (timingInfo, originalURL, initiatorType, globalThis, cacheState) { + if (nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 2)) { + performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis, cacheState) } -]) - -/** - * @see https://www.w3.org/TR/FileAPI/#process-blob-parts - * @param {(NodeJS.TypedArray|Blob|string)[]} parts - * @param {{ type: string, endings: string }} options - */ -function processBlobParts (parts, options) { - // 1. Let bytes be an empty sequence of bytes. - /** @type {NodeJS.TypedArray[]} */ - const bytes = [] +} - // 2. For each element in parts: - for (const element of parts) { - // 1. If element is a USVString, run the following substeps: - if (typeof element === 'string') { - // 1. Let s be element. - let s = element +// https://fetch.spec.whatwg.org/#abort-fetch +function abortFetch (p, request, responseObject, error) { + // Note: AbortSignal.reason was added in node v17.2.0 + // which would give us an undefined error to reject with. + // Remove this once node v16 is no longer supported. + if (!error) { + error = new DOMException('The operation was aborted.', 'AbortError') + } - // 2. If the endings member of options is "native", set s - // to the result of converting line endings to native - // of element. - if (options.endings === 'native') { - s = convertLineEndingsNative(s) - } + // 1. Reject promise with error. + p.reject(error) - // 3. Append the result of UTF-8 encoding s to bytes. - bytes.push(new TextEncoder().encode(s)) - } else if ( - types.isAnyArrayBuffer(element) || - types.isTypedArray(element) - ) { - // 2. If element is a BufferSource, get a copy of the - // bytes held by the buffer source, and append those - // bytes to bytes. - if (!element.buffer) { // ArrayBuffer - bytes.push(new Uint8Array(element)) - } else { - bytes.push( - new Uint8Array(element.buffer, element.byteOffset, element.byteLength) - ) + // 2. If request’s body is not null and is readable, then cancel request’s + // body with error. + if (request.body != null && isReadable(request.body?.stream)) { + request.body.stream.cancel(error).catch((err) => { + if (err.code === 'ERR_INVALID_STATE') { + // Node bug? + return } - } else if (isBlobLike(element)) { - // 3. If element is a Blob, append the bytes it represents - // to bytes. - bytes.push(element) - } + throw err + }) } - // 3. Return bytes. - return bytes -} - -/** - * @see https://www.w3.org/TR/FileAPI/#convert-line-endings-to-native - * @param {string} s - */ -function convertLineEndingsNative (s) { - // 1. Let native line ending be be the code point U+000A LF. - let nativeLineEnding = '\n' - - // 2. If the underlying platform’s conventions are to - // represent newlines as a carriage return and line feed - // sequence, set native line ending to the code point - // U+000D CR followed by the code point U+000A LF. - if (process.platform === 'win32') { - nativeLineEnding = '\r\n' + // 3. If responseObject is null, then return. + if (responseObject == null) { + return } - return s.replace(/\r?\n/g, nativeLineEnding) -} + // 4. Let response be responseObject’s response. + const response = responseObject[kState] -// If this function is moved to ./util.js, some tools (such as -// rollup) will warn about circular dependencies. See: -// https://github.com/nodejs/undici/issues/1629 -function isFileLike (object) { - return ( - (NativeFile && object instanceof NativeFile) || - object instanceof File || ( - object && - (typeof object.stream === 'function' || - typeof object.arrayBuffer === 'function') && - object[Symbol.toStringTag] === 'File' - ) - ) + // 5. If response’s body is not null and is readable, then error response’s + // body with error. + if (response.body != null && isReadable(response.body?.stream)) { + response.body.stream.cancel(error).catch((err) => { + if (err.code === 'ERR_INVALID_STATE') { + // Node bug? + return + } + throw err + }) + } } -module.exports = { File, FileLike, isFileLike } - - -/***/ }), +// https://fetch.spec.whatwg.org/#fetching +function fetching ({ + request, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseEndOfBody, + processResponseConsumeBody, + useParallelQueue = false, + dispatcher // undici +}) { + // 1. Let taskDestination be null. + let taskDestination = null -/***/ 72015: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + // 2. Let crossOriginIsolatedCapability be false. + let crossOriginIsolatedCapability = false -"use strict"; + // 3. If request’s client is non-null, then: + if (request.client != null) { + // 1. Set taskDestination to request’s client’s global object. + taskDestination = request.client.globalObject + // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin + // isolated capability. + crossOriginIsolatedCapability = + request.client.crossOriginIsolatedCapability + } -const { isBlobLike, toUSVString, makeIterator } = __nccwpck_require__(52538) -const { kState } = __nccwpck_require__(15861) -const { File: UndiciFile, FileLike, isFileLike } = __nccwpck_require__(78511) -const { webidl } = __nccwpck_require__(21744) -const { Blob, File: NativeFile } = __nccwpck_require__(14300) + // 4. If useParallelQueue is true, then set taskDestination to the result of + // starting a new parallel queue. + // TODO -/** @type {globalThis['File']} */ -const File = NativeFile ?? UndiciFile + // 5. Let timingInfo be a new fetch timing info whose start time and + // post-redirect start time are the coarsened shared current time given + // crossOriginIsolatedCapability. + const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability) + const timingInfo = createOpaqueTimingInfo({ + startTime: currenTime + }) -// https://xhr.spec.whatwg.org/#formdata -class FormData { - constructor (form) { - if (form !== undefined) { - throw webidl.errors.conversionFailed({ - prefix: 'FormData constructor', - argument: 'Argument 1', - types: ['undefined'] - }) - } + // 6. Let fetchParams be a new fetch params whose + // request is request, + // timing info is timingInfo, + // process request body chunk length is processRequestBodyChunkLength, + // process request end-of-body is processRequestEndOfBody, + // process response is processResponse, + // process response consume body is processResponseConsumeBody, + // process response end-of-body is processResponseEndOfBody, + // task destination is taskDestination, + // and cross-origin isolated capability is crossOriginIsolatedCapability. + const fetchParams = { + controller: new Fetch(dispatcher), + request, + timingInfo, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseConsumeBody, + processResponseEndOfBody, + taskDestination, + crossOriginIsolatedCapability + } - this[kState] = [] + // 7. If request’s body is a byte sequence, then set request’s body to + // request’s body as a body. + // NOTE: Since fetching is only called from fetch, body should already be + // extracted. + assert(!request.body || request.body.stream) + + // 8. If request’s window is "client", then set request’s window to request’s + // client, if request’s client’s global object is a Window object; otherwise + // "no-window". + if (request.window === 'client') { + // TODO: What if request.client is null? + request.window = + request.client?.globalObject?.constructor?.name === 'Window' + ? request.client + : 'no-window' } - append (name, value, filename = undefined) { - webidl.brandCheck(this, FormData) + // 9. If request’s origin is "client", then set request’s origin to request’s + // client’s origin. + if (request.origin === 'client') { + // TODO: What if request.client is null? + request.origin = request.client?.origin + } - webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.append' }) + // 10. If all of the following conditions are true: + // TODO - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" + // 11. If request’s policy container is "client", then: + if (request.policyContainer === 'client') { + // 1. If request’s client is non-null, then set request’s policy + // container to a clone of request’s client’s policy container. [HTML] + if (request.client != null) { + request.policyContainer = clonePolicyContainer( + request.client.policyContainer ) + } else { + // 2. Otherwise, set request’s policy container to a new policy + // container. + request.policyContainer = makePolicyContainer() } + } - // 1. Let value be value if given; otherwise blobValue. - - name = webidl.converters.USVString(name) - value = isBlobLike(value) - ? webidl.converters.Blob(value, { strict: false }) - : webidl.converters.USVString(value) - filename = arguments.length === 3 - ? webidl.converters.USVString(filename) - : undefined + // 12. If request’s header list does not contain `Accept`, then: + if (!request.headersList.contains('accept')) { + // 1. Let value be `*/*`. + const value = '*/*' - // 2. Let entry be the result of creating an entry with - // name, value, and filename if given. - const entry = makeEntry(name, value, filename) + // 2. A user agent should set value to the first matching statement, if + // any, switching on request’s destination: + // "document" + // "frame" + // "iframe" + // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8` + // "image" + // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5` + // "style" + // `text/css,*/*;q=0.1` + // TODO - // 3. Append entry to this’s entry list. - this[kState].push(entry) + // 3. Append `Accept`/value to request’s header list. + request.headersList.append('accept', value) } - delete (name) { - webidl.brandCheck(this, FormData) - - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.delete' }) + // 13. If request’s header list does not contain `Accept-Language`, then + // user agents should append `Accept-Language`/an appropriate value to + // request’s header list. + if (!request.headersList.contains('accept-language')) { + request.headersList.append('accept-language', '*') + } - name = webidl.converters.USVString(name) + // 14. If request’s priority is null, then use request’s initiator and + // destination appropriately in setting request’s priority to a + // user-agent-defined object. + if (request.priority === null) { + // TODO + } - // The delete(name) method steps are to remove all entries whose name - // is name from this’s entry list. - this[kState] = this[kState].filter(entry => entry.name !== name) + // 15. If request is a subresource request, then: + if (subresourceSet.has(request.destination)) { + // TODO } - get (name) { - webidl.brandCheck(this, FormData) + // 16. Run main fetch given fetchParams. + mainFetch(fetchParams) + .catch(err => { + fetchParams.controller.terminate(err) + }) - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.get' }) + // 17. Return fetchParam's controller + return fetchParams.controller +} - name = webidl.converters.USVString(name) +// https://fetch.spec.whatwg.org/#concept-main-fetch +async function mainFetch (fetchParams, recursive = false) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request - // 1. If there is no entry whose name is name in this’s entry list, - // then return null. - const idx = this[kState].findIndex((entry) => entry.name === name) - if (idx === -1) { - return null - } + // 2. Let response be null. + let response = null - // 2. Return the value of the first entry whose name is name from - // this’s entry list. - return this[kState][idx].value + // 3. If request’s local-URLs-only flag is set and request’s current URL is + // not local, then set response to a network error. + if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { + response = makeNetworkError('local URLs only') } - getAll (name) { - webidl.brandCheck(this, FormData) - - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.getAll' }) + // 4. Run report Content Security Policy violations for request. + // TODO - name = webidl.converters.USVString(name) + // 5. Upgrade request to a potentially trustworthy URL, if appropriate. + tryUpgradeRequestToAPotentiallyTrustworthyURL(request) - // 1. If there is no entry whose name is name in this’s entry list, - // then return the empty list. - // 2. Return the values of all entries whose name is name, in order, - // from this’s entry list. - return this[kState] - .filter((entry) => entry.name === name) - .map((entry) => entry.value) + // 6. If should request be blocked due to a bad port, should fetching request + // be blocked as mixed content, or should request be blocked by Content + // Security Policy returns blocked, then set response to a network error. + if (requestBadPort(request) === 'blocked') { + response = makeNetworkError('bad port') } + // TODO: should fetching request be blocked as mixed content? + // TODO: should request be blocked by Content Security Policy? - has (name) { - webidl.brandCheck(this, FormData) - - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.has' }) - - name = webidl.converters.USVString(name) - - // The has(name) method steps are to return true if there is an entry - // whose name is name in this’s entry list; otherwise false. - return this[kState].findIndex((entry) => entry.name === name) !== -1 + // 7. If request’s referrer policy is the empty string, then set request’s + // referrer policy to request’s policy container’s referrer policy. + if (request.referrerPolicy === '') { + request.referrerPolicy = request.policyContainer.referrerPolicy } - set (name, value, filename = undefined) { - webidl.brandCheck(this, FormData) + // 8. If request’s referrer is not "no-referrer", then set request’s + // referrer to the result of invoking determine request’s referrer. + if (request.referrer !== 'no-referrer') { + request.referrer = determineRequestsReferrer(request) + } - webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.set' }) + // 9. Set request’s current URL’s scheme to "https" if all of the following + // conditions are true: + // - request’s current URL’s scheme is "http" + // - request’s current URL’s host is a domain + // - Matching request’s current URL’s host per Known HSTS Host Domain Name + // Matching results in either a superdomain match with an asserted + // includeSubDomains directive or a congruent match (with or without an + // asserted includeSubDomains directive). [HSTS] + // TODO - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" - ) - } + // 10. If recursive is false, then run the remaining steps in parallel. + // TODO - // The set(name, value) and set(name, blobValue, filename) method steps - // are: + // 11. If response is null, then set response to the result of running + // the steps corresponding to the first matching statement: + if (response === null) { + response = await (async () => { + const currentURL = requestCurrentURL(request) - // 1. Let value be value if given; otherwise blobValue. + if ( + // - request’s current URL’s origin is same origin with request’s origin, + // and request’s response tainting is "basic" + (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') || + // request’s current URL’s scheme is "data" + (currentURL.protocol === 'data:') || + // - request’s mode is "navigate" or "websocket" + (request.mode === 'navigate' || request.mode === 'websocket') + ) { + // 1. Set request’s response tainting to "basic". + request.responseTainting = 'basic' - name = webidl.converters.USVString(name) - value = isBlobLike(value) - ? webidl.converters.Blob(value, { strict: false }) - : webidl.converters.USVString(value) - filename = arguments.length === 3 - ? toUSVString(filename) - : undefined + // 2. Return the result of running scheme fetch given fetchParams. + return await schemeFetch(fetchParams) + } - // 2. Let entry be the result of creating an entry with name, value, and - // filename if given. - const entry = makeEntry(name, value, filename) + // request’s mode is "same-origin" + if (request.mode === 'same-origin') { + // 1. Return a network error. + return makeNetworkError('request mode cannot be "same-origin"') + } - // 3. If there are entries in this’s entry list whose name is name, then - // replace the first such entry with entry and remove the others. - const idx = this[kState].findIndex((entry) => entry.name === name) - if (idx !== -1) { - this[kState] = [ - ...this[kState].slice(0, idx), - entry, - ...this[kState].slice(idx + 1).filter((entry) => entry.name !== name) - ] - } else { - // 4. Otherwise, append entry to this’s entry list. - this[kState].push(entry) - } - } + // request’s mode is "no-cors" + if (request.mode === 'no-cors') { + // 1. If request’s redirect mode is not "follow", then return a network + // error. + if (request.redirect !== 'follow') { + return makeNetworkError( + 'redirect mode cannot be "follow" for "no-cors" request' + ) + } - entries () { - webidl.brandCheck(this, FormData) + // 2. Set request’s response tainting to "opaque". + request.responseTainting = 'opaque' - return makeIterator( - () => this[kState].map(pair => [pair.name, pair.value]), - 'FormData', - 'key+value' - ) - } + // 3. Return the result of running scheme fetch given fetchParams. + return await schemeFetch(fetchParams) + } - keys () { - webidl.brandCheck(this, FormData) + // request’s current URL’s scheme is not an HTTP(S) scheme + if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { + // Return a network error. + return makeNetworkError('URL scheme must be a HTTP(S) scheme') + } - return makeIterator( - () => this[kState].map(pair => [pair.name, pair.value]), - 'FormData', - 'key' - ) - } + // - request’s use-CORS-preflight flag is set + // - request’s unsafe-request flag is set and either request’s method is + // not a CORS-safelisted method or CORS-unsafe request-header names with + // request’s header list is not empty + // 1. Set request’s response tainting to "cors". + // 2. Let corsWithPreflightResponse be the result of running HTTP fetch + // given fetchParams and true. + // 3. If corsWithPreflightResponse is a network error, then clear cache + // entries using request. + // 4. Return corsWithPreflightResponse. + // TODO - values () { - webidl.brandCheck(this, FormData) + // Otherwise + // 1. Set request’s response tainting to "cors". + request.responseTainting = 'cors' - return makeIterator( - () => this[kState].map(pair => [pair.name, pair.value]), - 'FormData', - 'value' - ) + // 2. Return the result of running HTTP fetch given fetchParams. + return await httpFetch(fetchParams) + })() } - /** - * @param {(value: string, key: string, self: FormData) => void} callbackFn - * @param {unknown} thisArg - */ - forEach (callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, FormData) - - webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.forEach' }) + // 12. If recursive is true, then return response. + if (recursive) { + return response + } - if (typeof callbackFn !== 'function') { - throw new TypeError( - "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." - ) + // 13. If response is not a network error and response is not a filtered + // response, then: + if (response.status !== 0 && !response.internalResponse) { + // If request’s response tainting is "cors", then: + if (request.responseTainting === 'cors') { + // 1. Let headerNames be the result of extracting header list values + // given `Access-Control-Expose-Headers` and response’s header list. + // TODO + // 2. If request’s credentials mode is not "include" and headerNames + // contains `*`, then set response’s CORS-exposed header-name list to + // all unique header names in response’s header list. + // TODO + // 3. Otherwise, if headerNames is not null or failure, then set + // response’s CORS-exposed header-name list to headerNames. + // TODO } - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]) + // Set response to the following filtered response with response as its + // internal response, depending on request’s response tainting: + if (request.responseTainting === 'basic') { + response = filterResponse(response, 'basic') + } else if (request.responseTainting === 'cors') { + response = filterResponse(response, 'cors') + } else if (request.responseTainting === 'opaque') { + response = filterResponse(response, 'opaque') + } else { + assert(false) } } -} -FormData.prototype[Symbol.iterator] = FormData.prototype.entries + // 14. Let internalResponse be response, if response is a network error, + // and response’s internal response otherwise. + let internalResponse = + response.status === 0 ? response : response.internalResponse -Object.defineProperties(FormData.prototype, { - [Symbol.toStringTag]: { - value: 'FormData', - configurable: true + // 15. If internalResponse’s URL list is empty, then set it to a clone of + // request’s URL list. + if (internalResponse.urlList.length === 0) { + internalResponse.urlList.push(...request.urlList) } -}) - -/** - * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry - * @param {string} name - * @param {string|Blob} value - * @param {?string} filename - * @returns - */ -function makeEntry (name, value, filename) { - // 1. Set name to the result of converting name into a scalar value string. - // "To convert a string into a scalar value string, replace any surrogates - // with U+FFFD." - // see: https://nodejs.org/dist/latest-v18.x/docs/api/buffer.html#buftostringencoding-start-end - name = Buffer.from(name).toString('utf8') - - // 2. If value is a string, then set value to the result of converting - // value into a scalar value string. - if (typeof value === 'string') { - value = Buffer.from(value).toString('utf8') - } else { - // 3. Otherwise: - - // 1. If value is not a File object, then set value to a new File object, - // representing the same bytes, whose name attribute value is "blob" - if (!isFileLike(value)) { - value = value instanceof Blob - ? new File([value], 'blob', { type: value.type }) - : new FileLike(value, 'blob', { type: value.type }) - } - - // 2. If filename is given, then set value to a new File object, - // representing the same bytes, whose name attribute is filename. - if (filename !== undefined) { - /** @type {FilePropertyBag} */ - const options = { - type: value.type, - lastModified: value.lastModified - } - value = (NativeFile && value instanceof NativeFile) || value instanceof UndiciFile - ? new File([value], filename, options) - : new FileLike(value, filename, options) - } + // 16. If request’s timing allow failed flag is unset, then set + // internalResponse’s timing allow passed flag. + if (!request.timingAllowFailed) { + response.timingAllowPassed = true } - // 4. Return an entry whose name is name and whose value is value. - return { name, value } -} + // 17. If response is not a network error and any of the following returns + // blocked + // - should internalResponse to request be blocked as mixed content + // - should internalResponse to request be blocked by Content Security Policy + // - should internalResponse to request be blocked due to its MIME type + // - should internalResponse to request be blocked due to nosniff + // TODO -module.exports = { FormData } + // 18. If response’s type is "opaque", internalResponse’s status is 206, + // internalResponse’s range-requested flag is set, and request’s header + // list does not contain `Range`, then set response and internalResponse + // to a network error. + if ( + response.type === 'opaque' && + internalResponse.status === 206 && + internalResponse.rangeRequested && + !request.headers.contains('range') + ) { + response = internalResponse = makeNetworkError() + } + // 19. If response is not a network error and either request’s method is + // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status, + // set internalResponse’s body to null and disregard any enqueuing toward + // it (if any). + if ( + response.status !== 0 && + (request.method === 'HEAD' || + request.method === 'CONNECT' || + nullBodyStatus.includes(internalResponse.status)) + ) { + internalResponse.body = null + fetchParams.controller.dump = true + } -/***/ }), + // 20. If request’s integrity metadata is not the empty string, then: + if (request.integrity) { + // 1. Let processBodyError be this step: run fetch finale given fetchParams + // and a network error. + const processBodyError = (reason) => + fetchFinale(fetchParams, makeNetworkError(reason)) -/***/ 71246: -/***/ ((module) => { + // 2. If request’s response tainting is "opaque", or response’s body is null, + // then run processBodyError and abort these steps. + if (request.responseTainting === 'opaque' || response.body == null) { + processBodyError(response.error) + return + } -"use strict"; + // 3. Let processBody given bytes be these steps: + const processBody = (bytes) => { + // 1. If bytes do not match request’s integrity metadata, + // then run processBodyError and abort these steps. [SRI] + if (!bytesMatch(bytes, request.integrity)) { + processBodyError('integrity mismatch') + return + } + // 2. Set response’s body to bytes as a body. + response.body = safelyExtractBody(bytes)[0] -// In case of breaking changes, increase the version -// number to avoid conflicts. -const globalOrigin = Symbol.for('undici.globalOrigin.1') + // 3. Run fetch finale given fetchParams and response. + fetchFinale(fetchParams, response) + } -function getGlobalOrigin () { - return globalThis[globalOrigin] + // 4. Fully read response’s body given processBody and processBodyError. + await fullyReadBody(response.body, processBody, processBodyError) + } else { + // 21. Otherwise, run fetch finale given fetchParams and response. + fetchFinale(fetchParams, response) + } } -function setGlobalOrigin (newOrigin) { - if (newOrigin === undefined) { - Object.defineProperty(globalThis, globalOrigin, { - value: undefined, - writable: true, - enumerable: false, - configurable: false - }) - - return +// https://fetch.spec.whatwg.org/#concept-scheme-fetch +// given a fetch params fetchParams +function schemeFetch (fetchParams) { + // Note: since the connection is destroyed on redirect, which sets fetchParams to a + // cancelled state, we do not want this condition to trigger *unless* there have been + // no redirects. See https://github.com/nodejs/undici/issues/1776 + // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams. + if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { + return Promise.resolve(makeAppropriateNetworkError(fetchParams)) } - const parsedURL = new URL(newOrigin) + // 2. Let request be fetchParams’s request. + const { request } = fetchParams - if (parsedURL.protocol !== 'http:' && parsedURL.protocol !== 'https:') { - throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`) - } + const { protocol: scheme } = requestCurrentURL(request) - Object.defineProperty(globalThis, globalOrigin, { - value: parsedURL, - writable: true, - enumerable: false, - configurable: false - }) -} + // 3. Switch on request’s current URL’s scheme and run the associated steps: + switch (scheme) { + case 'about:': { + // If request’s current URL’s path is the string "blank", then return a new response + // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) », + // and body is the empty byte sequence as a body. -module.exports = { - getGlobalOrigin, - setGlobalOrigin -} + // Otherwise, return a network error. + return Promise.resolve(makeNetworkError('about scheme is not supported')) + } + case 'blob:': { + if (!resolveObjectURL) { + resolveObjectURL = (__nccwpck_require__(14300).resolveObjectURL) + } + // 1. Let blobURLEntry be request’s current URL’s blob URL entry. + const blobURLEntry = requestCurrentURL(request) -/***/ }), + // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56 + // Buffer.resolveObjectURL does not ignore URL queries. + if (blobURLEntry.search.length !== 0) { + return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.')) + } -/***/ 10554: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()) -"use strict"; -// https://github.com/Ethan-Arrowood/undici-fetch + // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s + // object is not a Blob object, then return a network error. + if (request.method !== 'GET' || !isBlobLike(blobURLEntryObject)) { + return Promise.resolve(makeNetworkError('invalid method')) + } + // 3. Let bodyWithType be the result of safely extracting blobURLEntry’s object. + const bodyWithType = safelyExtractBody(blobURLEntryObject) + // 4. Let body be bodyWithType’s body. + const body = bodyWithType[0] -const { kHeadersList } = __nccwpck_require__(72785) -const { kGuard } = __nccwpck_require__(15861) -const { kEnumerableProperty } = __nccwpck_require__(83983) -const { - makeIterator, - isValidHeaderName, - isValidHeaderValue -} = __nccwpck_require__(52538) -const { webidl } = __nccwpck_require__(21744) -const assert = __nccwpck_require__(39491) + // 5. Let length be body’s length, serialized and isomorphic encoded. + const length = isomorphicEncode(`${body.length}`) -const kHeadersMap = Symbol('headers map') -const kHeadersSortedMap = Symbol('headers map sorted') + // 6. Let type be bodyWithType’s type if it is non-null; otherwise the empty byte sequence. + const type = bodyWithType[1] ?? '' -/** - * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize - * @param {string} potentialValue - */ -function headerValueNormalize (potentialValue) { - // To normalize a byte sequence potentialValue, remove - // any leading and trailing HTTP whitespace bytes from - // potentialValue. + // 7. Return a new response whose status message is `OK`, header list is + // « (`Content-Length`, length), (`Content-Type`, type) », and body is body. + const response = makeResponse({ + statusText: 'OK', + headersList: [ + ['content-length', { name: 'Content-Length', value: length }], + ['content-type', { name: 'Content-Type', value: type }] + ] + }) - // Trimming the end with `.replace()` and a RegExp is typically subject to - // ReDoS. This is safer and faster. - let i = potentialValue.length - while (/[\r\n\t ]/.test(potentialValue.charAt(--i))); - return potentialValue.slice(0, i + 1).replace(/^[\r\n\t ]+/, '') -} + response.body = body -function fill (headers, object) { - // To fill a Headers object headers with a given object object, run these steps: + return Promise.resolve(response) + } + case 'data:': { + // 1. Let dataURLStruct be the result of running the + // data: URL processor on request’s current URL. + const currentURL = requestCurrentURL(request) + const dataURLStruct = dataURLProcessor(currentURL) - // 1. If object is a sequence, then for each header in object: - // Note: webidl conversion to array has already been done. - if (Array.isArray(object)) { - for (const header of object) { - // 1. If header does not contain exactly two items, then throw a TypeError. - if (header.length !== 2) { - throw webidl.errors.exception({ - header: 'Headers constructor', - message: `expected name/value pair to be length 2, found ${header.length}.` - }) + // 2. If dataURLStruct is failure, then return a + // network error. + if (dataURLStruct === 'failure') { + return Promise.resolve(makeNetworkError('failed to fetch the data URL')) } - // 2. Append (header’s first item, header’s second item) to headers. - headers.append(header[0], header[1]) + // 3. Let mimeType be dataURLStruct’s MIME type, serialized. + const mimeType = serializeAMimeType(dataURLStruct.mimeType) + + // 4. Return a response whose status message is `OK`, + // header list is « (`Content-Type`, mimeType) », + // and body is dataURLStruct’s body as a body. + return Promise.resolve(makeResponse({ + statusText: 'OK', + headersList: [ + ['content-type', { name: 'Content-Type', value: mimeType }] + ], + body: safelyExtractBody(dataURLStruct.body)[0] + })) } - } else if (typeof object === 'object' && object !== null) { - // Note: null should throw + case 'file:': { + // For now, unfortunate as it is, file URLs are left as an exercise for the reader. + // When in doubt, return a network error. + return Promise.resolve(makeNetworkError('not implemented... yet...')) + } + case 'http:': + case 'https:': { + // Return the result of running HTTP fetch given fetchParams. - // 2. Otherwise, object is a record, then for each key → value in object, - // append (key, value) to headers - for (const [key, value] of Object.entries(object)) { - headers.append(key, value) + return httpFetch(fetchParams) + .catch((err) => makeNetworkError(err)) + } + default: { + return Promise.resolve(makeNetworkError('unknown scheme')) } - } else { - throw webidl.errors.conversionFailed({ - prefix: 'Headers constructor', - argument: 'Argument 1', - types: ['sequence>', 'record'] - }) } } -class HeadersList { - /** @type {[string, string][]|null} */ - cookies = null +// https://fetch.spec.whatwg.org/#finalize-response +function finalizeResponse (fetchParams, response) { + // 1. Set fetchParams’s request’s done flag. + fetchParams.request.done = true - constructor (init) { - if (init instanceof HeadersList) { - this[kHeadersMap] = new Map(init[kHeadersMap]) - this[kHeadersSortedMap] = init[kHeadersSortedMap] - this.cookies = init.cookies - } else { - this[kHeadersMap] = new Map(init) - this[kHeadersSortedMap] = null - } + // 2, If fetchParams’s process response done is not null, then queue a fetch + // task to run fetchParams’s process response done given response, with + // fetchParams’s task destination. + if (fetchParams.processResponseDone != null) { + queueMicrotask(() => fetchParams.processResponseDone(response)) } +} - // https://fetch.spec.whatwg.org/#header-list-contains - contains (name) { - // A header list list contains a header name name if list - // contains a header whose name is a byte-case-insensitive - // match for name. - name = name.toLowerCase() - - return this[kHeadersMap].has(name) - } +// https://fetch.spec.whatwg.org/#fetch-finale +function fetchFinale (fetchParams, response) { + // 1. If response is a network error, then: + if (response.type === 'error') { + // 1. Set response’s URL list to « fetchParams’s request’s URL list[0] ». + response.urlList = [fetchParams.request.urlList[0]] - clear () { - this[kHeadersMap].clear() - this[kHeadersSortedMap] = null - this.cookies = null + // 2. Set response’s timing info to the result of creating an opaque timing + // info for fetchParams’s timing info. + response.timingInfo = createOpaqueTimingInfo({ + startTime: fetchParams.timingInfo.startTime + }) } - // https://fetch.spec.whatwg.org/#concept-header-list-append - append (name, value) { - this[kHeadersSortedMap] = null - - // 1. If list contains name, then set name to the first such - // header’s name. - const lowercaseName = name.toLowerCase() - const exists = this[kHeadersMap].get(lowercaseName) - - // 2. Append (name, value) to list. - if (exists) { - const delimiter = lowercaseName === 'cookie' ? '; ' : ', ' - this[kHeadersMap].set(lowercaseName, { - name: exists.name, - value: `${exists.value}${delimiter}${value}` - }) - } else { - this[kHeadersMap].set(lowercaseName, { name, value }) - } + // 2. Let processResponseEndOfBody be the following steps: + const processResponseEndOfBody = () => { + // 1. Set fetchParams’s request’s done flag. + fetchParams.request.done = true - if (lowercaseName === 'set-cookie') { - this.cookies ??= [] - this.cookies.push(value) + // If fetchParams’s process response end-of-body is not null, + // then queue a fetch task to run fetchParams’s process response + // end-of-body given response with fetchParams’s task destination. + if (fetchParams.processResponseEndOfBody != null) { + queueMicrotask(() => fetchParams.processResponseEndOfBody(response)) } } - // https://fetch.spec.whatwg.org/#concept-header-list-set - set (name, value) { - this[kHeadersSortedMap] = null - const lowercaseName = name.toLowerCase() - - if (lowercaseName === 'set-cookie') { - this.cookies = [value] - } - - // 1. If list contains name, then set the value of - // the first such header to value and remove the - // others. - // 2. Otherwise, append header (name, value) to list. - return this[kHeadersMap].set(lowercaseName, { name, value }) + // 3. If fetchParams’s process response is non-null, then queue a fetch task + // to run fetchParams’s process response given response, with fetchParams’s + // task destination. + if (fetchParams.processResponse != null) { + queueMicrotask(() => fetchParams.processResponse(response)) } - // https://fetch.spec.whatwg.org/#concept-header-list-delete - delete (name) { - this[kHeadersSortedMap] = null + // 4. If response’s body is null, then run processResponseEndOfBody. + if (response.body == null) { + processResponseEndOfBody() + } else { + // 5. Otherwise: - name = name.toLowerCase() + // 1. Let transformStream be a new a TransformStream. - if (name === 'set-cookie') { - this.cookies = null + // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, + // enqueues chunk in transformStream. + const identityTransformAlgorithm = (chunk, controller) => { + controller.enqueue(chunk) } - return this[kHeadersMap].delete(name) - } - - // https://fetch.spec.whatwg.org/#concept-header-list-get - get (name) { - // 1. If list does not contain name, then return null. - if (!this.contains(name)) { - return null - } + // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm + // and flushAlgorithm set to processResponseEndOfBody. + const transformStream = new TransformStream({ + start () {}, + transform: identityTransformAlgorithm, + flush: processResponseEndOfBody + }, { + size () { + return 1 + } + }, { + size () { + return 1 + } + }) - // 2. Return the values of all headers in list whose name - // is a byte-case-insensitive match for name, - // separated from each other by 0x2C 0x20, in order. - return this[kHeadersMap].get(name.toLowerCase())?.value ?? null + // 4. Set response’s body to the result of piping response’s body through transformStream. + response.body = { stream: response.body.stream.pipeThrough(transformStream) } } - * [Symbol.iterator] () { - // use the lowercased name - for (const [name, { value }] of this[kHeadersMap]) { - yield [name, value] - } - } + // 6. If fetchParams’s process response consume body is non-null, then: + if (fetchParams.processResponseConsumeBody != null) { + // 1. Let processBody given nullOrBytes be this step: run fetchParams’s + // process response consume body given response and nullOrBytes. + const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes) - get entries () { - const headers = {} + // 2. Let processBodyError be this step: run fetchParams’s process + // response consume body given response and failure. + const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure) - if (this[kHeadersMap].size) { - for (const { name, value } of this[kHeadersMap].values()) { - headers[name] = value - } + // 3. If response’s body is null, then queue a fetch task to run processBody + // given null, with fetchParams’s task destination. + if (response.body == null) { + queueMicrotask(() => processBody(null)) + } else { + // 4. Otherwise, fully read response’s body given processBody, processBodyError, + // and fetchParams’s task destination. + return fullyReadBody(response.body, processBody, processBodyError) } - - return headers + return Promise.resolve() } } -// https://fetch.spec.whatwg.org/#headers-class -class Headers { - constructor (init = undefined) { - this[kHeadersList] = new HeadersList() +// https://fetch.spec.whatwg.org/#http-fetch +async function httpFetch (fetchParams) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request - // The new Headers(init) constructor steps are: + // 2. Let response be null. + let response = null - // 1. Set this’s guard to "none". - this[kGuard] = 'none' + // 3. Let actualResponse be null. + let actualResponse = null - // 2. If init is given, then fill this with init. - if (init !== undefined) { - init = webidl.converters.HeadersInit(init) - fill(this, init) - } - } + // 4. Let timingInfo be fetchParams’s timing info. + const timingInfo = fetchParams.timingInfo - // https://fetch.spec.whatwg.org/#dom-headers-append - append (name, value) { - webidl.brandCheck(this, Headers) + // 5. If request’s service-workers mode is "all", then: + if (request.serviceWorkers === 'all') { + // TODO + } - webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.append' }) + // 6. If response is null, then: + if (response === null) { + // 1. If makeCORSPreflight is true and one of these conditions is true: + // TODO - name = webidl.converters.ByteString(name) - value = webidl.converters.ByteString(value) + // 2. If request’s redirect mode is "follow", then set request’s + // service-workers mode to "none". + if (request.redirect === 'follow') { + request.serviceWorkers = 'none' + } - // 1. Normalize value. - value = headerValueNormalize(value) + // 3. Set response and actualResponse to the result of running + // HTTP-network-or-cache fetch given fetchParams. + actualResponse = response = await httpNetworkOrCacheFetch(fetchParams) - // 2. If name is not a header name or value is not a - // header value, then throw a TypeError. - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: 'Headers.append', - value: name, - type: 'header name' - }) - } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix: 'Headers.append', - value, - type: 'header value' - }) + // 4. If request’s response tainting is "cors" and a CORS check + // for request and response returns failure, then return a network error. + if ( + request.responseTainting === 'cors' && + corsCheck(request, response) === 'failure' + ) { + return makeNetworkError('cors failure') } - // 3. If headers’s guard is "immutable", then throw a TypeError. - // 4. Otherwise, if headers’s guard is "request" and name is a - // forbidden header name, return. - // Note: undici does not implement forbidden header names - if (this[kGuard] === 'immutable') { - throw new TypeError('immutable') - } else if (this[kGuard] === 'request-no-cors') { - // 5. Otherwise, if headers’s guard is "request-no-cors": - // TODO + // 5. If the TAO check for request and response returns failure, then set + // request’s timing allow failed flag. + if (TAOCheck(request, response) === 'failure') { + request.timingAllowFailed = true } - - // 6. Otherwise, if headers’s guard is "response" and name is a - // forbidden response-header name, return. - - // 7. Append (name, value) to headers’s header list. - // 8. If headers’s guard is "request-no-cors", then remove - // privileged no-CORS request headers from headers - return this[kHeadersList].append(name, value) } - // https://fetch.spec.whatwg.org/#dom-headers-delete - delete (name) { - webidl.brandCheck(this, Headers) - - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.delete' }) - - name = webidl.converters.ByteString(name) + // 7. If either request’s response tainting or response’s type + // is "opaque", and the cross-origin resource policy check with + // request’s origin, request’s client, request’s destination, + // and actualResponse returns blocked, then return a network error. + if ( + (request.responseTainting === 'opaque' || response.type === 'opaque') && + crossOriginResourcePolicyCheck( + request.origin, + request.client, + request.destination, + actualResponse + ) === 'blocked' + ) { + return makeNetworkError('blocked') + } - // 1. If name is not a header name, then throw a TypeError. - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: 'Headers.delete', - value: name, - type: 'header name' - }) + // 8. If actualResponse’s status is a redirect status, then: + if (redirectStatusSet.has(actualResponse.status)) { + // 1. If actualResponse’s status is not 303, request’s body is not null, + // and the connection uses HTTP/2, then user agents may, and are even + // encouraged to, transmit an RST_STREAM frame. + // See, https://github.com/whatwg/fetch/issues/1288 + if (request.redirect !== 'manual') { + fetchParams.controller.connection.destroy() } - // 2. If this’s guard is "immutable", then throw a TypeError. - // 3. Otherwise, if this’s guard is "request" and name is a - // forbidden header name, return. - // 4. Otherwise, if this’s guard is "request-no-cors", name - // is not a no-CORS-safelisted request-header name, and - // name is not a privileged no-CORS request-header name, - // return. - // 5. Otherwise, if this’s guard is "response" and name is - // a forbidden response-header name, return. - // Note: undici does not implement forbidden header names - if (this[kGuard] === 'immutable') { - throw new TypeError('immutable') - } else if (this[kGuard] === 'request-no-cors') { - // TODO + // 2. Switch on request’s redirect mode: + if (request.redirect === 'error') { + // Set response to a network error. + response = makeNetworkError('unexpected redirect') + } else if (request.redirect === 'manual') { + // Set response to an opaque-redirect filtered response whose internal + // response is actualResponse. + // NOTE(spec): On the web this would return an `opaqueredirect` response, + // but that doesn't make sense server side. + // See https://github.com/nodejs/undici/issues/1193. + response = actualResponse + } else if (request.redirect === 'follow') { + // Set response to the result of running HTTP-redirect fetch given + // fetchParams and response. + response = await httpRedirectFetch(fetchParams, response) + } else { + assert(false) } + } - // 6. If this’s header list does not contain name, then - // return. - if (!this[kHeadersList].contains(name)) { - return - } + // 9. Set response’s timing info to timingInfo. + response.timingInfo = timingInfo - // 7. Delete name from this’s header list. - // 8. If this’s guard is "request-no-cors", then remove - // privileged no-CORS request headers from this. - return this[kHeadersList].delete(name) - } + // 10. Return response. + return response +} - // https://fetch.spec.whatwg.org/#dom-headers-get - get (name) { - webidl.brandCheck(this, Headers) +// https://fetch.spec.whatwg.org/#http-redirect-fetch +function httpRedirectFetch (fetchParams, response) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.get' }) + // 2. Let actualResponse be response, if response is not a filtered response, + // and response’s internal response otherwise. + const actualResponse = response.internalResponse + ? response.internalResponse + : response - name = webidl.converters.ByteString(name) + // 3. Let locationURL be actualResponse’s location URL given request’s current + // URL’s fragment. + let locationURL - // 1. If name is not a header name, then throw a TypeError. - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: 'Headers.get', - value: name, - type: 'header name' - }) - } + try { + locationURL = responseLocationURL( + actualResponse, + requestCurrentURL(request).hash + ) - // 2. Return the result of getting name from this’s header - // list. - return this[kHeadersList].get(name) + // 4. If locationURL is null, then return response. + if (locationURL == null) { + return response + } + } catch (err) { + // 5. If locationURL is failure, then return a network error. + return Promise.resolve(makeNetworkError(err)) } - // https://fetch.spec.whatwg.org/#dom-headers-has - has (name) { - webidl.brandCheck(this, Headers) - - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.has' }) + // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network + // error. + if (!urlIsHttpHttpsScheme(locationURL)) { + return Promise.resolve(makeNetworkError('URL scheme must be a HTTP(S) scheme')) + } - name = webidl.converters.ByteString(name) + // 7. If request’s redirect count is 20, then return a network error. + if (request.redirectCount === 20) { + return Promise.resolve(makeNetworkError('redirect count exceeded')) + } - // 1. If name is not a header name, then throw a TypeError. - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: 'Headers.has', - value: name, - type: 'header name' - }) - } + // 8. Increase request’s redirect count by 1. + request.redirectCount += 1 - // 2. Return true if this’s header list contains name; - // otherwise false. - return this[kHeadersList].contains(name) + // 9. If request’s mode is "cors", locationURL includes credentials, and + // request’s origin is not same origin with locationURL’s origin, then return + // a network error. + if ( + request.mode === 'cors' && + (locationURL.username || locationURL.password) && + !sameOrigin(request, locationURL) + ) { + return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"')) } - // https://fetch.spec.whatwg.org/#dom-headers-set - set (name, value) { - webidl.brandCheck(this, Headers) - - webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.set' }) + // 10. If request’s response tainting is "cors" and locationURL includes + // credentials, then return a network error. + if ( + request.responseTainting === 'cors' && + (locationURL.username || locationURL.password) + ) { + return Promise.resolve(makeNetworkError( + 'URL cannot contain credentials for request mode "cors"' + )) + } - name = webidl.converters.ByteString(name) - value = webidl.converters.ByteString(value) + // 11. If actualResponse’s status is not 303, request’s body is non-null, + // and request’s body’s source is null, then return a network error. + if ( + actualResponse.status !== 303 && + request.body != null && + request.body.source == null + ) { + return Promise.resolve(makeNetworkError()) + } - // 1. Normalize value. - value = headerValueNormalize(value) + // 12. If one of the following is true + // - actualResponse’s status is 301 or 302 and request’s method is `POST` + // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD` + if ( + ([301, 302].includes(actualResponse.status) && request.method === 'POST') || + (actualResponse.status === 303 && + !GET_OR_HEAD.includes(request.method)) + ) { + // then: + // 1. Set request’s method to `GET` and request’s body to null. + request.method = 'GET' + request.body = null - // 2. If name is not a header name or value is not a - // header value, then throw a TypeError. - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: 'Headers.set', - value: name, - type: 'header name' - }) - } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix: 'Headers.set', - value, - type: 'header value' - }) + // 2. For each headerName of request-body-header name, delete headerName from + // request’s header list. + for (const headerName of requestBodyHeader) { + request.headersList.delete(headerName) } + } - // 3. If this’s guard is "immutable", then throw a TypeError. - // 4. Otherwise, if this’s guard is "request" and name is a - // forbidden header name, return. - // 5. Otherwise, if this’s guard is "request-no-cors" and - // name/value is not a no-CORS-safelisted request-header, - // return. - // 6. Otherwise, if this’s guard is "response" and name is a - // forbidden response-header name, return. - // Note: undici does not implement forbidden header names - if (this[kGuard] === 'immutable') { - throw new TypeError('immutable') - } else if (this[kGuard] === 'request-no-cors') { - // TODO - } + // 13. If request’s current URL’s origin is not same origin with locationURL’s + // origin, then for each headerName of CORS non-wildcard request-header name, + // delete headerName from request’s header list. + if (!sameOrigin(requestCurrentURL(request), locationURL)) { + // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name + request.headersList.delete('authorization') - // 7. Set (name, value) in this’s header list. - // 8. If this’s guard is "request-no-cors", then remove - // privileged no-CORS request headers from this - return this[kHeadersList].set(name, value) + // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. + request.headersList.delete('cookie') + request.headersList.delete('host') } - // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie - getSetCookie () { - webidl.brandCheck(this, Headers) - - // 1. If this’s header list does not contain `Set-Cookie`, then return « ». - // 2. Return the values of all headers in this’s header list whose name is - // a byte-case-insensitive match for `Set-Cookie`, in order. + // 14. If request’s body is non-null, then set request’s body to the first return + // value of safely extracting request’s body’s source. + if (request.body != null) { + assert(request.body.source != null) + request.body = safelyExtractBody(request.body.source)[0] + } - const list = this[kHeadersList].cookies + // 15. Let timingInfo be fetchParams’s timing info. + const timingInfo = fetchParams.timingInfo - if (list) { - return [...list] - } + // 16. Set timingInfo’s redirect end time and post-redirect start time to the + // coarsened shared current time given fetchParams’s cross-origin isolated + // capability. + timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = + coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability) - return [] + // 17. If timingInfo’s redirect start time is 0, then set timingInfo’s + // redirect start time to timingInfo’s start time. + if (timingInfo.redirectStartTime === 0) { + timingInfo.redirectStartTime = timingInfo.startTime } - // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine - get [kHeadersSortedMap] () { - if (this[kHeadersList][kHeadersSortedMap]) { - return this[kHeadersList][kHeadersSortedMap] - } - - // 1. Let headers be an empty list of headers with the key being the name - // and value the value. - const headers = [] + // 18. Append locationURL to request’s URL list. + request.urlList.push(locationURL) - // 2. Let names be the result of convert header names to a sorted-lowercase - // set with all the names of the headers in list. - const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1) - const cookies = this[kHeadersList].cookies + // 19. Invoke set request’s referrer policy on redirect on request and + // actualResponse. + setRequestReferrerPolicyOnRedirect(request, actualResponse) - // 3. For each name of names: - for (const [name, value] of names) { - // 1. If name is `set-cookie`, then: - if (name === 'set-cookie') { - // 1. Let values be a list of all values of headers in list whose name - // is a byte-case-insensitive match for name, in order. + // 20. Return the result of running main fetch given fetchParams and true. + return mainFetch(fetchParams, true) +} - // 2. For each value of values: - // 1. Append (name, value) to headers. - for (const value of cookies) { - headers.push([name, value]) - } - } else { - // 2. Otherwise: +// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch +async function httpNetworkOrCacheFetch ( + fetchParams, + isAuthenticationFetch = false, + isNewConnectionFetch = false +) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request - // 1. Let value be the result of getting name from list. + // 2. Let httpFetchParams be null. + let httpFetchParams = null - // 2. Assert: value is non-null. - assert(value !== null) + // 3. Let httpRequest be null. + let httpRequest = null - // 3. Append (name, value) to headers. - headers.push([name, value]) - } - } + // 4. Let response be null. + let response = null - this[kHeadersList][kHeadersSortedMap] = headers + // 5. Let storedResponse be null. + // TODO: cache - // 4. Return headers. - return headers - } + // 6. Let httpCache be null. + const httpCache = null - keys () { - webidl.brandCheck(this, Headers) + // 7. Let the revalidatingFlag be unset. + const revalidatingFlag = false - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - 'Headers', - 'key' - ) - } + // 8. Run these steps, but abort when the ongoing fetch is terminated: - values () { - webidl.brandCheck(this, Headers) + // 1. If request’s window is "no-window" and request’s redirect mode is + // "error", then set httpFetchParams to fetchParams and httpRequest to + // request. + if (request.window === 'no-window' && request.redirect === 'error') { + httpFetchParams = fetchParams + httpRequest = request + } else { + // Otherwise: - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - 'Headers', - 'value' - ) - } + // 1. Set httpRequest to a clone of request. + httpRequest = makeRequest(request) - entries () { - webidl.brandCheck(this, Headers) + // 2. Set httpFetchParams to a copy of fetchParams. + httpFetchParams = { ...fetchParams } - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - 'Headers', - 'key+value' - ) + // 3. Set httpFetchParams’s request to httpRequest. + httpFetchParams.request = httpRequest } - /** - * @param {(value: string, key: string, self: Headers) => void} callbackFn - * @param {unknown} thisArg - */ - forEach (callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, Headers) + // 3. Let includeCredentials be true if one of + const includeCredentials = + request.credentials === 'include' || + (request.credentials === 'same-origin' && + request.responseTainting === 'basic') - webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.forEach' }) + // 4. Let contentLength be httpRequest’s body’s length, if httpRequest’s + // body is non-null; otherwise null. + const contentLength = httpRequest.body ? httpRequest.body.length : null - if (typeof callbackFn !== 'function') { - throw new TypeError( - "Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'." - ) - } + // 5. Let contentLengthHeaderValue be null. + let contentLengthHeaderValue = null - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]) - } + // 6. If httpRequest’s body is null and httpRequest’s method is `POST` or + // `PUT`, then set contentLengthHeaderValue to `0`. + if ( + httpRequest.body == null && + ['POST', 'PUT'].includes(httpRequest.method) + ) { + contentLengthHeaderValue = '0' } - [Symbol.for('nodejs.util.inspect.custom')] () { - webidl.brandCheck(this, Headers) - - return this[kHeadersList] + // 7. If contentLength is non-null, then set contentLengthHeaderValue to + // contentLength, serialized and isomorphic encoded. + if (contentLength != null) { + contentLengthHeaderValue = isomorphicEncode(`${contentLength}`) } -} - -Headers.prototype[Symbol.iterator] = Headers.prototype.entries -Object.defineProperties(Headers.prototype, { - append: kEnumerableProperty, - delete: kEnumerableProperty, - get: kEnumerableProperty, - has: kEnumerableProperty, - set: kEnumerableProperty, - getSetCookie: kEnumerableProperty, - keys: kEnumerableProperty, - values: kEnumerableProperty, - entries: kEnumerableProperty, - forEach: kEnumerableProperty, - [Symbol.iterator]: { enumerable: false }, - [Symbol.toStringTag]: { - value: 'Headers', - configurable: true + // 8. If contentLengthHeaderValue is non-null, then append + // `Content-Length`/contentLengthHeaderValue to httpRequest’s header + // list. + if (contentLengthHeaderValue != null) { + httpRequest.headersList.append('content-length', contentLengthHeaderValue) } -}) -webidl.converters.HeadersInit = function (V) { - if (webidl.util.Type(V) === 'Object') { - if (V[Symbol.iterator]) { - return webidl.converters['sequence>'](V) - } + // 9. If contentLengthHeaderValue is non-null, then append (`Content-Length`, + // contentLengthHeaderValue) to httpRequest’s header list. - return webidl.converters['record'](V) + // 10. If contentLength is non-null and httpRequest’s keepalive is true, + // then: + if (contentLength != null && httpRequest.keepalive) { + // NOTE: keepalive is a noop outside of browser context. } - throw webidl.errors.conversionFailed({ - prefix: 'Headers constructor', - argument: 'Argument 1', - types: ['sequence>', 'record'] - }) -} - -module.exports = { - fill, - Headers, - HeadersList -} - - -/***/ }), - -/***/ 74881: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; -// https://github.com/Ethan-Arrowood/undici-fetch - - - -const { - Response, - makeNetworkError, - makeAppropriateNetworkError, - filterResponse, - makeResponse -} = __nccwpck_require__(27823) -const { Headers } = __nccwpck_require__(10554) -const { Request, makeRequest } = __nccwpck_require__(48359) -const zlib = __nccwpck_require__(59796) -const { - bytesMatch, - makePolicyContainer, - clonePolicyContainer, - requestBadPort, - TAOCheck, - appendRequestOriginHeader, - responseLocationURL, - requestCurrentURL, - setRequestReferrerPolicyOnRedirect, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - createOpaqueTimingInfo, - appendFetchMetadata, - corsCheck, - crossOriginResourcePolicyCheck, - determineRequestsReferrer, - coarsenedSharedCurrentTime, - createDeferredPromise, - isBlobLike, - sameOrigin, - isCancelled, - isAborted, - isErrorLike, - fullyReadBody, - readableStreamClose, - isomorphicEncode, - urlIsLocal, - urlIsHttpHttpsScheme, - urlHasHttpsScheme -} = __nccwpck_require__(52538) -const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(15861) -const assert = __nccwpck_require__(39491) -const { safelyExtractBody } = __nccwpck_require__(41472) -const { - redirectStatus, - nullBodyStatus, - safeMethods, - requestBodyHeader, - subresource, - DOMException -} = __nccwpck_require__(41037) -const { kHeadersList } = __nccwpck_require__(72785) -const EE = __nccwpck_require__(82361) -const { Readable, pipeline } = __nccwpck_require__(12781) -const { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = __nccwpck_require__(83983) -const { dataURLProcessor, serializeAMimeType } = __nccwpck_require__(685) -const { TransformStream } = __nccwpck_require__(35356) -const { getGlobalDispatcher } = __nccwpck_require__(21892) -const { webidl } = __nccwpck_require__(21744) -const { STATUS_CODES } = __nccwpck_require__(13685) + // 11. If httpRequest’s referrer is a URL, then append + // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded, + // to httpRequest’s header list. + if (httpRequest.referrer instanceof URL) { + httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href)) + } -/** @type {import('buffer').resolveObjectURL} */ -let resolveObjectURL -let ReadableStream = globalThis.ReadableStream + // 12. Append a request `Origin` header for httpRequest. + appendRequestOriginHeader(httpRequest) -class Fetch extends EE { - constructor (dispatcher) { - super() + // 13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA] + appendFetchMetadata(httpRequest) - this.dispatcher = dispatcher - this.connection = null - this.dump = false - this.state = 'ongoing' - // 2 terminated listeners get added per request, - // but only 1 gets removed. If there are 20 redirects, - // 21 listeners will be added. - // See https://github.com/nodejs/undici/issues/1711 - // TODO (fix): Find and fix root cause for leaked listener. - this.setMaxListeners(21) + // 14. If httpRequest’s header list does not contain `User-Agent`, then + // user agents should append `User-Agent`/default `User-Agent` value to + // httpRequest’s header list. + if (!httpRequest.headersList.contains('user-agent')) { + httpRequest.headersList.append('user-agent', typeof esbuildDetection === 'undefined' ? 'undici' : 'node') } - terminate (reason) { - if (this.state !== 'ongoing') { - return - } + // 15. If httpRequest’s cache mode is "default" and httpRequest’s header + // list contains `If-Modified-Since`, `If-None-Match`, + // `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set + // httpRequest’s cache mode to "no-store". + if ( + httpRequest.cache === 'default' && + (httpRequest.headersList.contains('if-modified-since') || + httpRequest.headersList.contains('if-none-match') || + httpRequest.headersList.contains('if-unmodified-since') || + httpRequest.headersList.contains('if-match') || + httpRequest.headersList.contains('if-range')) + ) { + httpRequest.cache = 'no-store' + } - this.state = 'terminated' - this.connection?.destroy(reason) - this.emit('terminated', reason) + // 16. If httpRequest’s cache mode is "no-cache", httpRequest’s prevent + // no-cache cache-control header modification flag is unset, and + // httpRequest’s header list does not contain `Cache-Control`, then append + // `Cache-Control`/`max-age=0` to httpRequest’s header list. + if ( + httpRequest.cache === 'no-cache' && + !httpRequest.preventNoCacheCacheControlHeaderModification && + !httpRequest.headersList.contains('cache-control') + ) { + httpRequest.headersList.append('cache-control', 'max-age=0') } - // https://fetch.spec.whatwg.org/#fetch-controller-abort - abort (error) { - if (this.state !== 'ongoing') { - return + // 17. If httpRequest’s cache mode is "no-store" or "reload", then: + if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') { + // 1. If httpRequest’s header list does not contain `Pragma`, then append + // `Pragma`/`no-cache` to httpRequest’s header list. + if (!httpRequest.headersList.contains('pragma')) { + httpRequest.headersList.append('pragma', 'no-cache') } - // 1. Set controller’s state to "aborted". - this.state = 'aborted' - - // 2. Let fallbackError be an "AbortError" DOMException. - // 3. Set error to fallbackError if it is not given. - if (!error) { - error = new DOMException('The operation was aborted.', 'AbortError') + // 2. If httpRequest’s header list does not contain `Cache-Control`, + // then append `Cache-Control`/`no-cache` to httpRequest’s header list. + if (!httpRequest.headersList.contains('cache-control')) { + httpRequest.headersList.append('cache-control', 'no-cache') } - - // 4. Let serializedError be StructuredSerialize(error). - // If that threw an exception, catch it, and let - // serializedError be StructuredSerialize(fallbackError). - - // 5. Set controller’s serialized abort reason to serializedError. - this.serializedAbortReason = error - - this.connection?.destroy(error) - this.emit('terminated', error) } -} -// https://fetch.spec.whatwg.org/#fetch-method -async function fetch (input, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' }) + // 18. If httpRequest’s header list contains `Range`, then append + // `Accept-Encoding`/`identity` to httpRequest’s header list. + if (httpRequest.headersList.contains('range')) { + httpRequest.headersList.append('accept-encoding', 'identity') + } - // 1. Let p be a new promise. - const p = createDeferredPromise() + // 19. Modify httpRequest’s header list per HTTP. Do not append a given + // header if httpRequest’s header list contains that header’s name. + // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129 + if (!httpRequest.headersList.contains('accept-encoding')) { + if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { + httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate') + } else { + httpRequest.headersList.append('accept-encoding', 'gzip, deflate') + } + } - // 2. Let requestObject be the result of invoking the initial value of - // Request as constructor with input and init as arguments. If this throws - // an exception, reject p with it and return p. - let requestObject + httpRequest.headersList.delete('host') - try { - requestObject = new Request(input, init) - } catch (e) { - p.reject(e) - return p.promise + // 20. If includeCredentials is true, then: + if (includeCredentials) { + // 1. If the user agent is not configured to block cookies for httpRequest + // (see section 7 of [COOKIES]), then: + // TODO: credentials + // 2. If httpRequest’s header list does not contain `Authorization`, then: + // TODO: credentials } - // 3. Let request be requestObject’s request. - const request = requestObject[kState] + // 21. If there’s a proxy-authentication entry, use it as appropriate. + // TODO: proxy-authentication - // 4. If requestObject’s signal’s aborted flag is set, then: - if (requestObject.signal.aborted) { - // 1. Abort the fetch() call with p, request, null, and - // requestObject’s signal’s abort reason. - abortFetch(p, request, null, requestObject.signal.reason) + // 22. Set httpCache to the result of determining the HTTP cache + // partition, given httpRequest. + // TODO: cache - // 2. Return p. - return p.promise + // 23. If httpCache is null, then set httpRequest’s cache mode to + // "no-store". + if (httpCache == null) { + httpRequest.cache = 'no-store' } - // 5. Let globalObject be request’s client’s global object. - const globalObject = request.client.globalObject - - // 6. If globalObject is a ServiceWorkerGlobalScope object, then set - // request’s service-workers mode to "none". - if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') { - request.serviceWorkers = 'none' + // 24. If httpRequest’s cache mode is neither "no-store" nor "reload", + // then: + if (httpRequest.mode !== 'no-store' && httpRequest.mode !== 'reload') { + // TODO: cache } - // 7. Let responseObject be null. - let responseObject = null - - // 8. Let relevantRealm be this’s relevant Realm. - const relevantRealm = null + // 9. If aborted, then return the appropriate network error for fetchParams. + // TODO - // 9. Let locallyAborted be false. - let locallyAborted = false + // 10. If response is null, then: + if (response == null) { + // 1. If httpRequest’s cache mode is "only-if-cached", then return a + // network error. + if (httpRequest.mode === 'only-if-cached') { + return makeNetworkError('only if cached') + } - // 10. Let controller be null. - let controller = null + // 2. Let forwardResponse be the result of running HTTP-network fetch + // given httpFetchParams, includeCredentials, and isNewConnectionFetch. + const forwardResponse = await httpNetworkFetch( + httpFetchParams, + includeCredentials, + isNewConnectionFetch + ) - // 11. Add the following abort steps to requestObject’s signal: - addAbortListener( - requestObject.signal, - () => { - // 1. Set locallyAborted to true. - locallyAborted = true + // 3. If httpRequest’s method is unsafe and forwardResponse’s status is + // in the range 200 to 399, inclusive, invalidate appropriate stored + // responses in httpCache, as per the "Invalidation" chapter of HTTP + // Caching, and set storedResponse to null. [HTTP-CACHING] + if ( + !safeMethodsSet.has(httpRequest.method) && + forwardResponse.status >= 200 && + forwardResponse.status <= 399 + ) { + // TODO: cache + } - // 2. Assert: controller is non-null. - assert(controller != null) + // 4. If the revalidatingFlag is set and forwardResponse’s status is 304, + // then: + if (revalidatingFlag && forwardResponse.status === 304) { + // TODO: cache + } - // 3. Abort controller with requestObject’s signal’s abort reason. - controller.abort(requestObject.signal.reason) + // 5. If response is null, then: + if (response == null) { + // 1. Set response to forwardResponse. + response = forwardResponse - // 4. Abort the fetch() call with p, request, responseObject, - // and requestObject’s signal’s abort reason. - abortFetch(p, request, responseObject, requestObject.signal.reason) + // 2. Store httpRequest and forwardResponse in httpCache, as per the + // "Storing Responses in Caches" chapter of HTTP Caching. [HTTP-CACHING] + // TODO: cache } - ) - - // 12. Let handleFetchDone given response response be to finalize and - // report timing with response, globalObject, and "fetch". - const handleFetchDone = (response) => - finalizeAndReportTiming(response, 'fetch') + } - // 13. Set controller to the result of calling fetch given request, - // with processResponseEndOfBody set to handleFetchDone, and processResponse - // given response being these substeps: + // 11. Set response’s URL list to a clone of httpRequest’s URL list. + response.urlList = [...httpRequest.urlList] - const processResponse = (response) => { - // 1. If locallyAborted is true, terminate these substeps. - if (locallyAborted) { - return - } + // 12. If httpRequest’s header list contains `Range`, then set response’s + // range-requested flag. + if (httpRequest.headersList.contains('range')) { + response.rangeRequested = true + } - // 2. If response’s aborted flag is set, then: - if (response.aborted) { - // 1. Let deserializedError be the result of deserialize a serialized - // abort reason given controller’s serialized abort reason and - // relevantRealm. + // 13. Set response’s request-includes-credentials to includeCredentials. + response.requestIncludesCredentials = includeCredentials - // 2. Abort the fetch() call with p, request, responseObject, and - // deserializedError. + // 14. If response’s status is 401, httpRequest’s response tainting is not + // "cors", includeCredentials is true, and request’s window is an environment + // settings object, then: + // TODO - abortFetch(p, request, responseObject, controller.serializedAbortReason) - return + // 15. If response’s status is 407, then: + if (response.status === 407) { + // 1. If request’s window is "no-window", then return a network error. + if (request.window === 'no-window') { + return makeNetworkError() } - // 3. If response is a network error, then reject p with a TypeError - // and terminate these substeps. - if (response.type === 'error') { - p.reject( - Object.assign(new TypeError('fetch failed'), { cause: response.error }) - ) - return + // 2. ??? + + // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams. + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams) } - // 4. Set responseObject to the result of creating a Response object, - // given response, "immutable", and relevantRealm. - responseObject = new Response() - responseObject[kState] = response - responseObject[kRealm] = relevantRealm - responseObject[kHeaders][kHeadersList] = response.headersList - responseObject[kHeaders][kGuard] = 'immutable' - responseObject[kHeaders][kRealm] = relevantRealm + // 4. Prompt the end user as appropriate in request’s window and store + // the result as a proxy-authentication entry. [HTTP-AUTH] + // TODO: Invoke some kind of callback? - // 5. Resolve p with responseObject. - p.resolve(responseObject) + // 5. Set response to the result of running HTTP-network-or-cache fetch given + // fetchParams. + // TODO + return makeNetworkError('proxy authentication required') } - controller = fetching({ - request, - processResponseEndOfBody: handleFetchDone, - processResponse, - dispatcher: init.dispatcher ?? getGlobalDispatcher() // undici - }) + // 16. If all of the following are true + if ( + // response’s status is 421 + response.status === 421 && + // isNewConnectionFetch is false + !isNewConnectionFetch && + // request’s body is null, or request’s body is non-null and request’s body’s source is non-null + (request.body == null || request.body.source != null) + ) { + // then: - // 14. Return p. - return p.promise -} + // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams. + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams) + } -// https://fetch.spec.whatwg.org/#finalize-and-report-timing -function finalizeAndReportTiming (response, initiatorType = 'other') { - // 1. If response is an aborted network error, then return. - if (response.type === 'error' && response.aborted) { - return - } + // 2. Set response to the result of running HTTP-network-or-cache + // fetch given fetchParams, isAuthenticationFetch, and true. - // 2. If response’s URL list is null or empty, then return. - if (!response.urlList?.length) { - return + // TODO (spec): The spec doesn't specify this but we need to cancel + // the active response before we can start a new one. + // https://github.com/whatwg/fetch/issues/1293 + fetchParams.controller.connection.destroy() + + response = await httpNetworkOrCacheFetch( + fetchParams, + isAuthenticationFetch, + true + ) } - // 3. Let originalURL be response’s URL list[0]. - const originalURL = response.urlList[0] + // 17. If isAuthenticationFetch is true, then create an authentication entry + if (isAuthenticationFetch) { + // TODO + } - // 4. Let timingInfo be response’s timing info. - let timingInfo = response.timingInfo + // 18. Return response. + return response +} - // 5. Let cacheState be response’s cache state. - let cacheState = response.cacheState +// https://fetch.spec.whatwg.org/#http-network-fetch +async function httpNetworkFetch ( + fetchParams, + includeCredentials = false, + forceNewConnection = false +) { + assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed) - // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return. - if (!urlIsHttpHttpsScheme(originalURL)) { - return + fetchParams.controller.connection = { + abort: null, + destroyed: false, + destroy (err) { + if (!this.destroyed) { + this.destroyed = true + this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError')) + } + } } - // 7. If timingInfo is null, then return. - if (timingInfo === null) { - return - } + // 1. Let request be fetchParams’s request. + const request = fetchParams.request - // 8. If response’s timing allow passed flag is not set, then: - if (!timingInfo.timingAllowPassed) { - // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo. - timingInfo = createOpaqueTimingInfo({ - startTime: timingInfo.startTime - }) + // 2. Let response be null. + let response = null - // 2. Set cacheState to the empty string. - cacheState = '' - } + // 3. Let timingInfo be fetchParams’s timing info. + const timingInfo = fetchParams.timingInfo - // 9. Set timingInfo’s end time to the coarsened shared current time - // given global’s relevant settings object’s cross-origin isolated - // capability. - // TODO: given global’s relevant settings object’s cross-origin isolated - // capability? - timingInfo.endTime = coarsenedSharedCurrentTime() + // 4. Let httpCache be the result of determining the HTTP cache partition, + // given request. + // TODO: cache + const httpCache = null - // 10. Set response’s timing info to timingInfo. - response.timingInfo = timingInfo + // 5. If httpCache is null, then set request’s cache mode to "no-store". + if (httpCache == null) { + request.cache = 'no-store' + } - // 11. Mark resource timing for timingInfo, originalURL, initiatorType, - // global, and cacheState. - markResourceTiming( - timingInfo, - originalURL, - initiatorType, - globalThis, - cacheState - ) -} + // 6. Let networkPartitionKey be the result of determining the network + // partition key given request. + // TODO -// https://w3c.github.io/resource-timing/#dfn-mark-resource-timing -function markResourceTiming (timingInfo, originalURL, initiatorType, globalThis, cacheState) { - if (nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 2)) { - performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis, cacheState) - } -} + // 7. Let newConnection be "yes" if forceNewConnection is true; otherwise + // "no". + const newConnection = forceNewConnection ? 'yes' : 'no' // eslint-disable-line no-unused-vars -// https://fetch.spec.whatwg.org/#abort-fetch -function abortFetch (p, request, responseObject, error) { - // Note: AbortSignal.reason was added in node v17.2.0 - // which would give us an undefined error to reject with. - // Remove this once node v16 is no longer supported. - if (!error) { - error = new DOMException('The operation was aborted.', 'AbortError') + // 8. Switch on request’s mode: + if (request.mode === 'websocket') { + // Let connection be the result of obtaining a WebSocket connection, + // given request’s current URL. + // TODO + } else { + // Let connection be the result of obtaining a connection, given + // networkPartitionKey, request’s current URL’s origin, + // includeCredentials, and forceNewConnection. + // TODO } - // 1. Reject promise with error. - p.reject(error) + // 9. Run these steps, but abort when the ongoing fetch is terminated: - // 2. If request’s body is not null and is readable, then cancel request’s - // body with error. - if (request.body != null && isReadable(request.body?.stream)) { - request.body.stream.cancel(error).catch((err) => { - if (err.code === 'ERR_INVALID_STATE') { - // Node bug? - return - } - throw err - }) - } + // 1. If connection is failure, then return a network error. - // 3. If responseObject is null, then return. - if (responseObject == null) { - return - } + // 2. Set timingInfo’s final connection timing info to the result of + // calling clamp and coarsen connection timing info with connection’s + // timing info, timingInfo’s post-redirect start time, and fetchParams’s + // cross-origin isolated capability. - // 4. Let response be responseObject’s response. - const response = responseObject[kState] + // 3. If connection is not an HTTP/2 connection, request’s body is non-null, + // and request’s body’s source is null, then append (`Transfer-Encoding`, + // `chunked`) to request’s header list. - // 5. If response’s body is not null and is readable, then error response’s - // body with error. - if (response.body != null && isReadable(response.body?.stream)) { - response.body.stream.cancel(error).catch((err) => { - if (err.code === 'ERR_INVALID_STATE') { - // Node bug? - return - } - throw err - }) - } -} + // 4. Set timingInfo’s final network-request start time to the coarsened + // shared current time given fetchParams’s cross-origin isolated + // capability. -// https://fetch.spec.whatwg.org/#fetching -function fetching ({ - request, - processRequestBodyChunkLength, - processRequestEndOfBody, - processResponse, - processResponseEndOfBody, - processResponseConsumeBody, - useParallelQueue = false, - dispatcher // undici -}) { - // 1. Let taskDestination be null. - let taskDestination = null + // 5. Set response to the result of making an HTTP request over connection + // using request with the following caveats: - // 2. Let crossOriginIsolatedCapability be false. - let crossOriginIsolatedCapability = false + // - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS] + // [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH] - // 3. If request’s client is non-null, then: - if (request.client != null) { - // 1. Set taskDestination to request’s client’s global object. - taskDestination = request.client.globalObject + // - If request’s body is non-null, and request’s body’s source is null, + // then the user agent may have a buffer of up to 64 kibibytes and store + // a part of request’s body in that buffer. If the user agent reads from + // request’s body beyond that buffer’s size and the user agent needs to + // resend request, then instead return a network error. - // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin - // isolated capability. - crossOriginIsolatedCapability = - request.client.crossOriginIsolatedCapability - } + // - Set timingInfo’s final network-response start time to the coarsened + // shared current time given fetchParams’s cross-origin isolated capability, + // immediately after the user agent’s HTTP parser receives the first byte + // of the response (e.g., frame header bytes for HTTP/2 or response status + // line for HTTP/1.x). - // 4. If useParallelQueue is true, then set taskDestination to the result of - // starting a new parallel queue. - // TODO + // - Wait until all the headers are transmitted. - // 5. Let timingInfo be a new fetch timing info whose start time and - // post-redirect start time are the coarsened shared current time given - // crossOriginIsolatedCapability. - const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability) - const timingInfo = createOpaqueTimingInfo({ - startTime: currenTime - }) + // - Any responses whose status is in the range 100 to 199, inclusive, + // and is not 101, are to be ignored, except for the purposes of setting + // timingInfo’s final network-response start time above. - // 6. Let fetchParams be a new fetch params whose - // request is request, - // timing info is timingInfo, - // process request body chunk length is processRequestBodyChunkLength, - // process request end-of-body is processRequestEndOfBody, - // process response is processResponse, - // process response consume body is processResponseConsumeBody, - // process response end-of-body is processResponseEndOfBody, - // task destination is taskDestination, - // and cross-origin isolated capability is crossOriginIsolatedCapability. - const fetchParams = { - controller: new Fetch(dispatcher), - request, - timingInfo, - processRequestBodyChunkLength, - processRequestEndOfBody, - processResponse, - processResponseConsumeBody, - processResponseEndOfBody, - taskDestination, - crossOriginIsolatedCapability - } + // - If request’s header list contains `Transfer-Encoding`/`chunked` and + // response is transferred via HTTP/1.0 or older, then return a network + // error. - // 7. If request’s body is a byte sequence, then set request’s body to - // request’s body as a body. - // NOTE: Since fetching is only called from fetch, body should already be - // extracted. - assert(!request.body || request.body.stream) + // - If the HTTP request results in a TLS client certificate dialog, then: - // 8. If request’s window is "client", then set request’s window to request’s - // client, if request’s client’s global object is a Window object; otherwise - // "no-window". - if (request.window === 'client') { - // TODO: What if request.client is null? - request.window = - request.client?.globalObject?.constructor?.name === 'Window' - ? request.client - : 'no-window' - } + // 1. If request’s window is an environment settings object, make the + // dialog available in request’s window. - // 9. If request’s origin is "client", then set request’s origin to request’s - // client’s origin. - if (request.origin === 'client') { - // TODO: What if request.client is null? - request.origin = request.client?.origin - } + // 2. Otherwise, return a network error. - // 10. If all of the following conditions are true: - // TODO + // To transmit request’s body body, run these steps: + let requestBody = null + // 1. If body is null and fetchParams’s process request end-of-body is + // non-null, then queue a fetch task given fetchParams’s process request + // end-of-body and fetchParams’s task destination. + if (request.body == null && fetchParams.processRequestEndOfBody) { + queueMicrotask(() => fetchParams.processRequestEndOfBody()) + } else if (request.body != null) { + // 2. Otherwise, if body is non-null: - // 11. If request’s policy container is "client", then: - if (request.policyContainer === 'client') { - // 1. If request’s client is non-null, then set request’s policy - // container to a clone of request’s client’s policy container. [HTML] - if (request.client != null) { - request.policyContainer = clonePolicyContainer( - request.client.policyContainer - ) - } else { - // 2. Otherwise, set request’s policy container to a new policy - // container. - request.policyContainer = makePolicyContainer() + // 1. Let processBodyChunk given bytes be these steps: + const processBodyChunk = async function * (bytes) { + // 1. If the ongoing fetch is terminated, then abort these steps. + if (isCancelled(fetchParams)) { + return + } + + // 2. Run this step in parallel: transmit bytes. + yield bytes + + // 3. If fetchParams’s process request body is non-null, then run + // fetchParams’s process request body given bytes’s length. + fetchParams.processRequestBodyChunkLength?.(bytes.byteLength) } - } - // 12. If request’s header list does not contain `Accept`, then: - if (!request.headersList.contains('accept')) { - // 1. Let value be `*/*`. - const value = '*/*' + // 2. Let processEndOfBody be these steps: + const processEndOfBody = () => { + // 1. If fetchParams is canceled, then abort these steps. + if (isCancelled(fetchParams)) { + return + } - // 2. A user agent should set value to the first matching statement, if - // any, switching on request’s destination: - // "document" - // "frame" - // "iframe" - // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8` - // "image" - // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5` - // "style" - // `text/css,*/*;q=0.1` - // TODO + // 2. If fetchParams’s process request end-of-body is non-null, + // then run fetchParams’s process request end-of-body. + if (fetchParams.processRequestEndOfBody) { + fetchParams.processRequestEndOfBody() + } + } - // 3. Append `Accept`/value to request’s header list. - request.headersList.append('accept', value) - } + // 3. Let processBodyError given e be these steps: + const processBodyError = (e) => { + // 1. If fetchParams is canceled, then abort these steps. + if (isCancelled(fetchParams)) { + return + } - // 13. If request’s header list does not contain `Accept-Language`, then - // user agents should append `Accept-Language`/an appropriate value to - // request’s header list. - if (!request.headersList.contains('accept-language')) { - request.headersList.append('accept-language', '*') - } + // 2. If e is an "AbortError" DOMException, then abort fetchParams’s controller. + if (e.name === 'AbortError') { + fetchParams.controller.abort() + } else { + fetchParams.controller.terminate(e) + } + } - // 14. If request’s priority is null, then use request’s initiator and - // destination appropriately in setting request’s priority to a - // user-agent-defined object. - if (request.priority === null) { - // TODO + // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody, + // processBodyError, and fetchParams’s task destination. + requestBody = (async function * () { + try { + for await (const bytes of request.body.stream) { + yield * processBodyChunk(bytes) + } + processEndOfBody() + } catch (err) { + processBodyError(err) + } + })() } - // 15. If request is a subresource request, then: - if (subresource.includes(request.destination)) { - // TODO - } + try { + // socket is only provided for websockets + const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody }) - // 16. Run main fetch given fetchParams. - mainFetch(fetchParams) - .catch(err => { - fetchParams.controller.terminate(err) - }) + if (socket) { + response = makeResponse({ status, statusText, headersList, socket }) + } else { + const iterator = body[Symbol.asyncIterator]() + fetchParams.controller.next = () => iterator.next() - // 17. Return fetchParam's controller - return fetchParams.controller -} + response = makeResponse({ status, statusText, headersList }) + } + } catch (err) { + // 10. If aborted, then: + if (err.name === 'AbortError') { + // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame. + fetchParams.controller.connection.destroy() -// https://fetch.spec.whatwg.org/#concept-main-fetch -async function mainFetch (fetchParams, recursive = false) { - // 1. Let request be fetchParams’s request. - const request = fetchParams.request + // 2. Return the appropriate network error for fetchParams. + return makeAppropriateNetworkError(fetchParams, err) + } - // 2. Let response be null. - let response = null + return makeNetworkError(err) + } - // 3. If request’s local-URLs-only flag is set and request’s current URL is - // not local, then set response to a network error. - if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { - response = makeNetworkError('local URLs only') + // 11. Let pullAlgorithm be an action that resumes the ongoing fetch + // if it is suspended. + const pullAlgorithm = () => { + fetchParams.controller.resume() } - // 4. Run report Content Security Policy violations for request. + // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s + // controller with reason, given reason. + const cancelAlgorithm = (reason) => { + fetchParams.controller.abort(reason) + } + + // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by + // the user agent. // TODO - // 5. Upgrade request to a potentially trustworthy URL, if appropriate. - tryUpgradeRequestToAPotentiallyTrustworthyURL(request) + // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object + // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent. + // TODO - // 6. If should request be blocked due to a bad port, should fetching request - // be blocked as mixed content, or should request be blocked by Content - // Security Policy returns blocked, then set response to a network error. - if (requestBadPort(request) === 'blocked') { - response = makeNetworkError('bad port') + // 15. Let stream be a new ReadableStream. + // 16. Set up stream with pullAlgorithm set to pullAlgorithm, + // cancelAlgorithm set to cancelAlgorithm, highWaterMark set to + // highWaterMark, and sizeAlgorithm set to sizeAlgorithm. + if (!ReadableStream) { + ReadableStream = (__nccwpck_require__(35356).ReadableStream) } - // TODO: should fetching request be blocked as mixed content? - // TODO: should request be blocked by Content Security Policy? - // 7. If request’s referrer policy is the empty string, then set request’s - // referrer policy to request’s policy container’s referrer policy. - if (request.referrerPolicy === '') { - request.referrerPolicy = request.policyContainer.referrerPolicy - } + const stream = new ReadableStream( + { + async start (controller) { + fetchParams.controller.controller = controller + }, + async pull (controller) { + await pullAlgorithm(controller) + }, + async cancel (reason) { + await cancelAlgorithm(reason) + } + }, + { + highWaterMark: 0, + size () { + return 1 + } + } + ) - // 8. If request’s referrer is not "no-referrer", then set request’s - // referrer to the result of invoking determine request’s referrer. - if (request.referrer !== 'no-referrer') { - request.referrer = determineRequestsReferrer(request) - } + // 17. Run these steps, but abort when the ongoing fetch is terminated: - // 9. Set request’s current URL’s scheme to "https" if all of the following - // conditions are true: - // - request’s current URL’s scheme is "http" - // - request’s current URL’s host is a domain - // - Matching request’s current URL’s host per Known HSTS Host Domain Name - // Matching results in either a superdomain match with an asserted - // includeSubDomains directive or a congruent match (with or without an - // asserted includeSubDomains directive). [HSTS] - // TODO + // 1. Set response’s body to a new body whose stream is stream. + response.body = { stream } - // 10. If recursive is false, then run the remaining steps in parallel. - // TODO + // 2. If response is not a network error and request’s cache mode is + // not "no-store", then update response in httpCache for request. + // TODO - // 11. If response is null, then set response to the result of running - // the steps corresponding to the first matching statement: - if (response === null) { - response = await (async () => { - const currentURL = requestCurrentURL(request) + // 3. If includeCredentials is true and the user agent is not configured + // to block cookies for request (see section 7 of [COOKIES]), then run the + // "set-cookie-string" parsing algorithm (see section 5.2 of [COOKIES]) on + // the value of each header whose name is a byte-case-insensitive match for + // `Set-Cookie` in response’s header list, if any, and request’s current URL. + // TODO - if ( - // - request’s current URL’s origin is same origin with request’s origin, - // and request’s response tainting is "basic" - (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') || - // request’s current URL’s scheme is "data" - (currentURL.protocol === 'data:') || - // - request’s mode is "navigate" or "websocket" - (request.mode === 'navigate' || request.mode === 'websocket') - ) { - // 1. Set request’s response tainting to "basic". - request.responseTainting = 'basic' + // 18. If aborted, then: + // TODO - // 2. Return the result of running scheme fetch given fetchParams. - return await schemeFetch(fetchParams) - } + // 19. Run these steps in parallel: - // request’s mode is "same-origin" - if (request.mode === 'same-origin') { - // 1. Return a network error. - return makeNetworkError('request mode cannot be "same-origin"') - } + // 1. Run these steps, but abort when fetchParams is canceled: + fetchParams.controller.on('terminated', onAborted) + fetchParams.controller.resume = async () => { + // 1. While true + while (true) { + // 1-3. See onData... - // request’s mode is "no-cors" - if (request.mode === 'no-cors') { - // 1. If request’s redirect mode is not "follow", then return a network - // error. - if (request.redirect !== 'follow') { - return makeNetworkError( - 'redirect mode cannot be "follow" for "no-cors" request' - ) + // 4. Set bytes to the result of handling content codings given + // codings and bytes. + let bytes + let isFailure + try { + const { done, value } = await fetchParams.controller.next() + + if (isAborted(fetchParams)) { + break } - // 2. Set request’s response tainting to "opaque". - request.responseTainting = 'opaque' + bytes = done ? undefined : value + } catch (err) { + if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { + // zlib doesn't like empty streams. + bytes = undefined + } else { + bytes = err - // 3. Return the result of running scheme fetch given fetchParams. - return await schemeFetch(fetchParams) + // err may be propagated from the result of calling readablestream.cancel, + // which might not be an error. https://github.com/nodejs/undici/issues/2009 + isFailure = true + } } - // request’s current URL’s scheme is not an HTTP(S) scheme - if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { - // Return a network error. - return makeNetworkError('URL scheme must be a HTTP(S) scheme') - } + if (bytes === undefined) { + // 2. Otherwise, if the bytes transmission for response’s message + // body is done normally and stream is readable, then close + // stream, finalize response for fetchParams and response, and + // abort these in-parallel steps. + readableStreamClose(fetchParams.controller.controller) - // - request’s use-CORS-preflight flag is set - // - request’s unsafe-request flag is set and either request’s method is - // not a CORS-safelisted method or CORS-unsafe request-header names with - // request’s header list is not empty - // 1. Set request’s response tainting to "cors". - // 2. Let corsWithPreflightResponse be the result of running HTTP fetch - // given fetchParams and true. - // 3. If corsWithPreflightResponse is a network error, then clear cache - // entries using request. - // 4. Return corsWithPreflightResponse. - // TODO + finalizeResponse(fetchParams, response) - // Otherwise - // 1. Set request’s response tainting to "cors". - request.responseTainting = 'cors' + return + } - // 2. Return the result of running HTTP fetch given fetchParams. - return await httpFetch(fetchParams) - })() - } + // 5. Increase timingInfo’s decoded body size by bytes’s length. + timingInfo.decodedBodySize += bytes?.byteLength ?? 0 - // 12. If recursive is true, then return response. - if (recursive) { - return response - } + // 6. If bytes is failure, then terminate fetchParams’s controller. + if (isFailure) { + fetchParams.controller.terminate(bytes) + return + } - // 13. If response is not a network error and response is not a filtered - // response, then: - if (response.status !== 0 && !response.internalResponse) { - // If request’s response tainting is "cors", then: - if (request.responseTainting === 'cors') { - // 1. Let headerNames be the result of extracting header list values - // given `Access-Control-Expose-Headers` and response’s header list. - // TODO - // 2. If request’s credentials mode is not "include" and headerNames - // contains `*`, then set response’s CORS-exposed header-name list to - // all unique header names in response’s header list. - // TODO - // 3. Otherwise, if headerNames is not null or failure, then set - // response’s CORS-exposed header-name list to headerNames. - // TODO - } + // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes + // into stream. + fetchParams.controller.controller.enqueue(new Uint8Array(bytes)) - // Set response to the following filtered response with response as its - // internal response, depending on request’s response tainting: - if (request.responseTainting === 'basic') { - response = filterResponse(response, 'basic') - } else if (request.responseTainting === 'cors') { - response = filterResponse(response, 'cors') - } else if (request.responseTainting === 'opaque') { - response = filterResponse(response, 'opaque') - } else { - assert(false) + // 8. If stream is errored, then terminate the ongoing fetch. + if (isErrored(stream)) { + fetchParams.controller.terminate() + return + } + + // 9. If stream doesn’t need more data ask the user agent to suspend + // the ongoing fetch. + if (!fetchParams.controller.controller.desiredSize) { + return + } } } - // 14. Let internalResponse be response, if response is a network error, - // and response’s internal response otherwise. - let internalResponse = - response.status === 0 ? response : response.internalResponse + // 2. If aborted, then: + function onAborted (reason) { + // 2. If fetchParams is aborted, then: + if (isAborted(fetchParams)) { + // 1. Set response’s aborted flag. + response.aborted = true - // 15. If internalResponse’s URL list is empty, then set it to a clone of - // request’s URL list. - if (internalResponse.urlList.length === 0) { - internalResponse.urlList.push(...request.urlList) - } + // 2. If stream is readable, then error stream with the result of + // deserialize a serialized abort reason given fetchParams’s + // controller’s serialized abort reason and an + // implementation-defined realm. + if (isReadable(stream)) { + fetchParams.controller.controller.error( + fetchParams.controller.serializedAbortReason + ) + } + } else { + // 3. Otherwise, if stream is readable, error stream with a TypeError. + if (isReadable(stream)) { + fetchParams.controller.controller.error(new TypeError('terminated', { + cause: isErrorLike(reason) ? reason : undefined + })) + } + } - // 16. If request’s timing allow failed flag is unset, then set - // internalResponse’s timing allow passed flag. - if (!request.timingAllowFailed) { - response.timingAllowPassed = true + // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame. + // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so. + fetchParams.controller.connection.destroy() } - // 17. If response is not a network error and any of the following returns - // blocked - // - should internalResponse to request be blocked as mixed content - // - should internalResponse to request be blocked by Content Security Policy - // - should internalResponse to request be blocked due to its MIME type - // - should internalResponse to request be blocked due to nosniff - // TODO + // 20. Return response. + return response - // 18. If response’s type is "opaque", internalResponse’s status is 206, - // internalResponse’s range-requested flag is set, and request’s header - // list does not contain `Range`, then set response and internalResponse - // to a network error. - if ( - response.type === 'opaque' && - internalResponse.status === 206 && - internalResponse.rangeRequested && - !request.headers.contains('range') - ) { - response = internalResponse = makeNetworkError() - } + async function dispatch ({ body }) { + const url = requestCurrentURL(request) + /** @type {import('../..').Agent} */ + const agent = fetchParams.controller.dispatcher - // 19. If response is not a network error and either request’s method is - // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status, - // set internalResponse’s body to null and disregard any enqueuing toward - // it (if any). - if ( - response.status !== 0 && - (request.method === 'HEAD' || - request.method === 'CONNECT' || - nullBodyStatus.includes(internalResponse.status)) - ) { - internalResponse.body = null - fetchParams.controller.dump = true - } + return new Promise((resolve, reject) => agent.dispatch( + { + path: url.pathname + url.search, + origin: url.origin, + method: request.method, + body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body, + headers: request.headersList.entries, + maxRedirections: 0, + upgrade: request.mode === 'websocket' ? 'websocket' : undefined + }, + { + body: null, + abort: null, - // 20. If request’s integrity metadata is not the empty string, then: - if (request.integrity) { - // 1. Let processBodyError be this step: run fetch finale given fetchParams - // and a network error. - const processBodyError = (reason) => - fetchFinale(fetchParams, makeNetworkError(reason)) + onConnect (abort) { + // TODO (fix): Do we need connection here? + const { connection } = fetchParams.controller - // 2. If request’s response tainting is "opaque", or response’s body is null, - // then run processBodyError and abort these steps. - if (request.responseTainting === 'opaque' || response.body == null) { - processBodyError(response.error) - return - } + if (connection.destroyed) { + abort(new DOMException('The operation was aborted.', 'AbortError')) + } else { + fetchParams.controller.on('terminated', abort) + this.abort = connection.abort = abort + } + }, - // 3. Let processBody given bytes be these steps: - const processBody = (bytes) => { - // 1. If bytes do not match request’s integrity metadata, - // then run processBodyError and abort these steps. [SRI] - if (!bytesMatch(bytes, request.integrity)) { - processBodyError('integrity mismatch') - return - } + onHeaders (status, headersList, resume, statusText) { + if (status < 200) { + return + } - // 2. Set response’s body to bytes as a body. - response.body = safelyExtractBody(bytes)[0] + let codings = [] + let location = '' - // 3. Run fetch finale given fetchParams and response. - fetchFinale(fetchParams, response) - } + const headers = new Headers() - // 4. Fully read response’s body given processBody and processBodyError. - await fullyReadBody(response.body, processBody, processBodyError) - } else { - // 21. Otherwise, run fetch finale given fetchParams and response. - fetchFinale(fetchParams, response) - } -} + // For H2, the headers are a plain JS object + // We distinguish between them and iterate accordingly + if (Array.isArray(headersList)) { + for (let n = 0; n < headersList.length; n += 2) { + const key = headersList[n + 0].toString('latin1') + const val = headersList[n + 1].toString('latin1') + if (key.toLowerCase() === 'content-encoding') { + // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 + // "All content-coding values are case-insensitive..." + codings = val.toLowerCase().split(',').map((x) => x.trim()) + } else if (key.toLowerCase() === 'location') { + location = val + } -// https://fetch.spec.whatwg.org/#concept-scheme-fetch -// given a fetch params fetchParams -async function schemeFetch (fetchParams) { - // Note: since the connection is destroyed on redirect, which sets fetchParams to a - // cancelled state, we do not want this condition to trigger *unless* there have been - // no redirects. See https://github.com/nodejs/undici/issues/1776 - // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams. - if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { - return makeAppropriateNetworkError(fetchParams) - } + headers.append(key, val) + } + } else { + const keys = Object.keys(headersList) + for (const key of keys) { + const val = headersList[key] + if (key.toLowerCase() === 'content-encoding') { + // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 + // "All content-coding values are case-insensitive..." + codings = val.toLowerCase().split(',').map((x) => x.trim()).reverse() + } else if (key.toLowerCase() === 'location') { + location = val + } - // 2. Let request be fetchParams’s request. - const { request } = fetchParams + headers.append(key, val) + } + } - const { protocol: scheme } = requestCurrentURL(request) + this.body = new Readable({ read: resume }) - // 3. Switch on request’s current URL’s scheme and run the associated steps: - switch (scheme) { - case 'about:': { - // If request’s current URL’s path is the string "blank", then return a new response - // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) », - // and body is the empty byte sequence as a body. + const decoders = [] - // Otherwise, return a network error. - return makeNetworkError('about scheme is not supported') - } - case 'blob:': { - if (!resolveObjectURL) { - resolveObjectURL = (__nccwpck_require__(14300).resolveObjectURL) - } + const willFollow = request.redirect === 'follow' && + location && + redirectStatusSet.has(status) - // 1. Let blobURLEntry be request’s current URL’s blob URL entry. - const blobURLEntry = requestCurrentURL(request) + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding + if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) { + for (const coding of codings) { + // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 + if (coding === 'x-gzip' || coding === 'gzip') { + decoders.push(zlib.createGunzip({ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })) + } else if (coding === 'deflate') { + decoders.push(zlib.createInflate()) + } else if (coding === 'br') { + decoders.push(zlib.createBrotliDecompress()) + } else { + decoders.length = 0 + break + } + } + } - // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56 - // Buffer.resolveObjectURL does not ignore URL queries. - if (blobURLEntry.search.length !== 0) { - return makeNetworkError('NetworkError when attempting to fetch resource.') - } + resolve({ + status, + statusText, + headersList: headers[kHeadersList], + body: decoders.length + ? pipeline(this.body, ...decoders, () => { }) + : this.body.on('error', () => {}) + }) - const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()) + return true + }, - // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s - // object is not a Blob object, then return a network error. - if (request.method !== 'GET' || !isBlobLike(blobURLEntryObject)) { - return makeNetworkError('invalid method') - } + onData (chunk) { + if (fetchParams.controller.dump) { + return + } - // 3. Let bodyWithType be the result of safely extracting blobURLEntry’s object. - const bodyWithType = safelyExtractBody(blobURLEntryObject) + // 1. If one or more bytes have been transmitted from response’s + // message body, then: - // 4. Let body be bodyWithType’s body. - const body = bodyWithType[0] + // 1. Let bytes be the transmitted bytes. + const bytes = chunk - // 5. Let length be body’s length, serialized and isomorphic encoded. - const length = isomorphicEncode(`${body.length}`) + // 2. Let codings be the result of extracting header list values + // given `Content-Encoding` and response’s header list. + // See pullAlgorithm. - // 6. Let type be bodyWithType’s type if it is non-null; otherwise the empty byte sequence. - const type = bodyWithType[1] ?? '' + // 3. Increase timingInfo’s encoded body size by bytes’s length. + timingInfo.encodedBodySize += bytes.byteLength - // 7. Return a new response whose status message is `OK`, header list is - // « (`Content-Length`, length), (`Content-Type`, type) », and body is body. - const response = makeResponse({ - statusText: 'OK', - headersList: [ - ['content-length', { name: 'Content-Length', value: length }], - ['content-type', { name: 'Content-Type', value: type }] - ] - }) + // 4. See pullAlgorithm... - response.body = body + return this.body.push(bytes) + }, - return response - } - case 'data:': { - // 1. Let dataURLStruct be the result of running the - // data: URL processor on request’s current URL. - const currentURL = requestCurrentURL(request) - const dataURLStruct = dataURLProcessor(currentURL) + onComplete () { + if (this.abort) { + fetchParams.controller.off('terminated', this.abort) + } - // 2. If dataURLStruct is failure, then return a - // network error. - if (dataURLStruct === 'failure') { - return makeNetworkError('failed to fetch the data URL') - } + fetchParams.controller.ended = true - // 3. Let mimeType be dataURLStruct’s MIME type, serialized. - const mimeType = serializeAMimeType(dataURLStruct.mimeType) + this.body.push(null) + }, - // 4. Return a response whose status message is `OK`, - // header list is « (`Content-Type`, mimeType) », - // and body is dataURLStruct’s body as a body. - return makeResponse({ - statusText: 'OK', - headersList: [ - ['content-type', { name: 'Content-Type', value: mimeType }] - ], - body: safelyExtractBody(dataURLStruct.body)[0] - }) - } - case 'file:': { - // For now, unfortunate as it is, file URLs are left as an exercise for the reader. - // When in doubt, return a network error. - return makeNetworkError('not implemented... yet...') - } - case 'http:': - case 'https:': { - // Return the result of running HTTP fetch given fetchParams. + onError (error) { + if (this.abort) { + fetchParams.controller.off('terminated', this.abort) + } - return await httpFetch(fetchParams) - .catch((err) => makeNetworkError(err)) - } - default: { - return makeNetworkError('unknown scheme') - } - } -} + this.body?.destroy(error) -// https://fetch.spec.whatwg.org/#finalize-response -function finalizeResponse (fetchParams, response) { - // 1. Set fetchParams’s request’s done flag. - fetchParams.request.done = true + fetchParams.controller.terminate(error) - // 2, If fetchParams’s process response done is not null, then queue a fetch - // task to run fetchParams’s process response done given response, with - // fetchParams’s task destination. - if (fetchParams.processResponseDone != null) { - queueMicrotask(() => fetchParams.processResponseDone(response)) - } -} + reject(error) + }, -// https://fetch.spec.whatwg.org/#fetch-finale -async function fetchFinale (fetchParams, response) { - // 1. If response is a network error, then: - if (response.type === 'error') { - // 1. Set response’s URL list to « fetchParams’s request’s URL list[0] ». - response.urlList = [fetchParams.request.urlList[0]] + onUpgrade (status, headersList, socket) { + if (status !== 101) { + return + } - // 2. Set response’s timing info to the result of creating an opaque timing - // info for fetchParams’s timing info. - response.timingInfo = createOpaqueTimingInfo({ - startTime: fetchParams.timingInfo.startTime - }) - } + const headers = new Headers() - // 2. Let processResponseEndOfBody be the following steps: - const processResponseEndOfBody = () => { - // 1. Set fetchParams’s request’s done flag. - fetchParams.request.done = true + for (let n = 0; n < headersList.length; n += 2) { + const key = headersList[n + 0].toString('latin1') + const val = headersList[n + 1].toString('latin1') - // If fetchParams’s process response end-of-body is not null, - // then queue a fetch task to run fetchParams’s process response - // end-of-body given response with fetchParams’s task destination. - if (fetchParams.processResponseEndOfBody != null) { - queueMicrotask(() => fetchParams.processResponseEndOfBody(response)) - } - } + headers.append(key, val) + } - // 3. If fetchParams’s process response is non-null, then queue a fetch task - // to run fetchParams’s process response given response, with fetchParams’s - // task destination. - if (fetchParams.processResponse != null) { - queueMicrotask(() => fetchParams.processResponse(response)) + resolve({ + status, + statusText: STATUS_CODES[status], + headersList: headers[kHeadersList], + socket + }) + + return true + } + } + )) } +} - // 4. If response’s body is null, then run processResponseEndOfBody. - if (response.body == null) { - processResponseEndOfBody() - } else { - // 5. Otherwise: +module.exports = { + fetch, + Fetch, + fetching, + finalizeAndReportTiming +} - // 1. Let transformStream be a new a TransformStream. - // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, - // enqueues chunk in transformStream. - const identityTransformAlgorithm = (chunk, controller) => { - controller.enqueue(chunk) - } +/***/ }), - // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm - // and flushAlgorithm set to processResponseEndOfBody. - const transformStream = new TransformStream({ - start () {}, - transform: identityTransformAlgorithm, - flush: processResponseEndOfBody - }, { - size () { - return 1 - } - }, { - size () { - return 1 - } - }) +/***/ 48359: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 4. Set response’s body to the result of piping response’s body through transformStream. - response.body = { stream: response.body.stream.pipeThrough(transformStream) } - } +"use strict"; +/* globals AbortController */ - // 6. If fetchParams’s process response consume body is non-null, then: - if (fetchParams.processResponseConsumeBody != null) { - // 1. Let processBody given nullOrBytes be this step: run fetchParams’s - // process response consume body given response and nullOrBytes. - const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes) - // 2. Let processBodyError be this step: run fetchParams’s process - // response consume body given response and failure. - const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure) - // 3. If response’s body is null, then queue a fetch task to run processBody - // given null, with fetchParams’s task destination. - if (response.body == null) { - queueMicrotask(() => processBody(null)) - } else { - // 4. Otherwise, fully read response’s body given processBody, processBodyError, - // and fetchParams’s task destination. - await fullyReadBody(response.body, processBody, processBodyError) - } - } -} +const { extractBody, mixinBody, cloneBody } = __nccwpck_require__(41472) +const { Headers, fill: fillHeaders, HeadersList } = __nccwpck_require__(10554) +const { FinalizationRegistry } = __nccwpck_require__(56436)() +const util = __nccwpck_require__(83983) +const { + isValidHTTPToken, + sameOrigin, + normalizeMethod, + makePolicyContainer +} = __nccwpck_require__(52538) +const { + forbiddenMethodsSet, + corsSafeListedMethodsSet, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + requestDuplex +} = __nccwpck_require__(41037) +const { kEnumerableProperty } = util +const { kHeaders, kSignal, kState, kGuard, kRealm } = __nccwpck_require__(15861) +const { webidl } = __nccwpck_require__(21744) +const { getGlobalOrigin } = __nccwpck_require__(71246) +const { URLSerializer } = __nccwpck_require__(685) +const { kHeadersList } = __nccwpck_require__(72785) +const assert = __nccwpck_require__(39491) +const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(82361) -// https://fetch.spec.whatwg.org/#http-fetch -async function httpFetch (fetchParams) { - // 1. Let request be fetchParams’s request. - const request = fetchParams.request +let TransformStream = globalThis.TransformStream - // 2. Let response be null. - let response = null +const kInit = Symbol('init') +const kAbortController = Symbol('abortController') - // 3. Let actualResponse be null. - let actualResponse = null +const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { + signal.removeEventListener('abort', abort) +}) - // 4. Let timingInfo be fetchParams’s timing info. - const timingInfo = fetchParams.timingInfo +// https://fetch.spec.whatwg.org/#request-class +class Request { + // https://fetch.spec.whatwg.org/#dom-request + constructor (input, init = {}) { + if (input === kInit) { + return + } - // 5. If request’s service-workers mode is "all", then: - if (request.serviceWorkers === 'all') { - // TODO - } + webidl.argumentLengthCheck(arguments, 1, { header: 'Request constructor' }) - // 6. If response is null, then: - if (response === null) { - // 1. If makeCORSPreflight is true and one of these conditions is true: - // TODO + input = webidl.converters.RequestInfo(input) + init = webidl.converters.RequestInit(init) - // 2. If request’s redirect mode is "follow", then set request’s - // service-workers mode to "none". - if (request.redirect === 'follow') { - request.serviceWorkers = 'none' + // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object + this[kRealm] = { + settingsObject: { + baseUrl: getGlobalOrigin(), + get origin () { + return this.baseUrl?.origin + }, + policyContainer: makePolicyContainer() + } } - // 3. Set response and actualResponse to the result of running - // HTTP-network-or-cache fetch given fetchParams. - actualResponse = response = await httpNetworkOrCacheFetch(fetchParams) + // 1. Let request be null. + let request = null - // 4. If request’s response tainting is "cors" and a CORS check - // for request and response returns failure, then return a network error. - if ( - request.responseTainting === 'cors' && - corsCheck(request, response) === 'failure' - ) { - return makeNetworkError('cors failure') - } + // 2. Let fallbackMode be null. + let fallbackMode = null - // 5. If the TAO check for request and response returns failure, then set - // request’s timing allow failed flag. - if (TAOCheck(request, response) === 'failure') { - request.timingAllowFailed = true - } - } + // 3. Let baseURL be this’s relevant settings object’s API base URL. + const baseUrl = this[kRealm].settingsObject.baseUrl - // 7. If either request’s response tainting or response’s type - // is "opaque", and the cross-origin resource policy check with - // request’s origin, request’s client, request’s destination, - // and actualResponse returns blocked, then return a network error. - if ( - (request.responseTainting === 'opaque' || response.type === 'opaque') && - crossOriginResourcePolicyCheck( - request.origin, - request.client, - request.destination, - actualResponse - ) === 'blocked' - ) { - return makeNetworkError('blocked') - } + // 4. Let signal be null. + let signal = null - // 8. If actualResponse’s status is a redirect status, then: - if (redirectStatus.includes(actualResponse.status)) { - // 1. If actualResponse’s status is not 303, request’s body is not null, - // and the connection uses HTTP/2, then user agents may, and are even - // encouraged to, transmit an RST_STREAM frame. - // See, https://github.com/whatwg/fetch/issues/1288 - if (request.redirect !== 'manual') { - fetchParams.controller.connection.destroy() - } + // 5. If input is a string, then: + if (typeof input === 'string') { + // 1. Let parsedURL be the result of parsing input with baseURL. + // 2. If parsedURL is failure, then throw a TypeError. + let parsedURL + try { + parsedURL = new URL(input, baseUrl) + } catch (err) { + throw new TypeError('Failed to parse URL from ' + input, { cause: err }) + } - // 2. Switch on request’s redirect mode: - if (request.redirect === 'error') { - // Set response to a network error. - response = makeNetworkError('unexpected redirect') - } else if (request.redirect === 'manual') { - // Set response to an opaque-redirect filtered response whose internal - // response is actualResponse. - // NOTE(spec): On the web this would return an `opaqueredirect` response, - // but that doesn't make sense server side. - // See https://github.com/nodejs/undici/issues/1193. - response = actualResponse - } else if (request.redirect === 'follow') { - // Set response to the result of running HTTP-redirect fetch given - // fetchParams and response. - response = await httpRedirectFetch(fetchParams, response) + // 3. If parsedURL includes credentials, then throw a TypeError. + if (parsedURL.username || parsedURL.password) { + throw new TypeError( + 'Request cannot be constructed from a URL that includes credentials: ' + + input + ) + } + + // 4. Set request to a new request whose URL is parsedURL. + request = makeRequest({ urlList: [parsedURL] }) + + // 5. Set fallbackMode to "cors". + fallbackMode = 'cors' } else { - assert(false) - } - } + // 6. Otherwise: - // 9. Set response’s timing info to timingInfo. - response.timingInfo = timingInfo + // 7. Assert: input is a Request object. + assert(input instanceof Request) - // 10. Return response. - return response -} + // 8. Set request to input’s request. + request = input[kState] -// https://fetch.spec.whatwg.org/#http-redirect-fetch -async function httpRedirectFetch (fetchParams, response) { - // 1. Let request be fetchParams’s request. - const request = fetchParams.request + // 9. Set signal to input’s signal. + signal = input[kSignal] + } + + // 7. Let origin be this’s relevant settings object’s origin. + const origin = this[kRealm].settingsObject.origin - // 2. Let actualResponse be response, if response is not a filtered response, - // and response’s internal response otherwise. - const actualResponse = response.internalResponse - ? response.internalResponse - : response + // 8. Let window be "client". + let window = 'client' - // 3. Let locationURL be actualResponse’s location URL given request’s current - // URL’s fragment. - let locationURL + // 9. If request’s window is an environment settings object and its origin + // is same origin with origin, then set window to request’s window. + if ( + request.window?.constructor?.name === 'EnvironmentSettingsObject' && + sameOrigin(request.window, origin) + ) { + window = request.window + } - try { - locationURL = responseLocationURL( - actualResponse, - requestCurrentURL(request).hash - ) + // 10. If init["window"] exists and is non-null, then throw a TypeError. + if (init.window != null) { + throw new TypeError(`'window' option '${window}' must be null`) + } - // 4. If locationURL is null, then return response. - if (locationURL == null) { - return response + // 11. If init["window"] exists, then set window to "no-window". + if ('window' in init) { + window = 'no-window' } - } catch (err) { - // 5. If locationURL is failure, then return a network error. - return makeNetworkError(err) - } - // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network - // error. - if (!urlIsHttpHttpsScheme(locationURL)) { - return makeNetworkError('URL scheme must be a HTTP(S) scheme') - } + // 12. Set request to a new request with the following properties: + request = makeRequest({ + // URL request’s URL. + // undici implementation note: this is set as the first item in request's urlList in makeRequest + // method request’s method. + method: request.method, + // header list A copy of request’s header list. + // undici implementation note: headersList is cloned in makeRequest + headersList: request.headersList, + // unsafe-request flag Set. + unsafeRequest: request.unsafeRequest, + // client This’s relevant settings object. + client: this[kRealm].settingsObject, + // window window. + window, + // priority request’s priority. + priority: request.priority, + // origin request’s origin. The propagation of the origin is only significant for navigation requests + // being handled by a service worker. In this scenario a request can have an origin that is different + // from the current client. + origin: request.origin, + // referrer request’s referrer. + referrer: request.referrer, + // referrer policy request’s referrer policy. + referrerPolicy: request.referrerPolicy, + // mode request’s mode. + mode: request.mode, + // credentials mode request’s credentials mode. + credentials: request.credentials, + // cache mode request’s cache mode. + cache: request.cache, + // redirect mode request’s redirect mode. + redirect: request.redirect, + // integrity metadata request’s integrity metadata. + integrity: request.integrity, + // keepalive request’s keepalive. + keepalive: request.keepalive, + // reload-navigation flag request’s reload-navigation flag. + reloadNavigation: request.reloadNavigation, + // history-navigation flag request’s history-navigation flag. + historyNavigation: request.historyNavigation, + // URL list A clone of request’s URL list. + urlList: [...request.urlList] + }) - // 7. If request’s redirect count is 20, then return a network error. - if (request.redirectCount === 20) { - return makeNetworkError('redirect count exceeded') - } + // 13. If init is not empty, then: + if (Object.keys(init).length > 0) { + // 1. If request’s mode is "navigate", then set it to "same-origin". + if (request.mode === 'navigate') { + request.mode = 'same-origin' + } - // 8. Increase request’s redirect count by 1. - request.redirectCount += 1 + // 2. Unset request’s reload-navigation flag. + request.reloadNavigation = false - // 9. If request’s mode is "cors", locationURL includes credentials, and - // request’s origin is not same origin with locationURL’s origin, then return - // a network error. - if ( - request.mode === 'cors' && - (locationURL.username || locationURL.password) && - !sameOrigin(request, locationURL) - ) { - return makeNetworkError('cross origin not allowed for request mode "cors"') - } + // 3. Unset request’s history-navigation flag. + request.historyNavigation = false - // 10. If request’s response tainting is "cors" and locationURL includes - // credentials, then return a network error. - if ( - request.responseTainting === 'cors' && - (locationURL.username || locationURL.password) - ) { - return makeNetworkError( - 'URL cannot contain credentials for request mode "cors"' - ) - } + // 4. Set request’s origin to "client". + request.origin = 'client' - // 11. If actualResponse’s status is not 303, request’s body is non-null, - // and request’s body’s source is null, then return a network error. - if ( - actualResponse.status !== 303 && - request.body != null && - request.body.source == null - ) { - return makeNetworkError() - } + // 5. Set request’s referrer to "client" + request.referrer = 'client' - // 12. If one of the following is true - // - actualResponse’s status is 301 or 302 and request’s method is `POST` - // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD` - if ( - ([301, 302].includes(actualResponse.status) && request.method === 'POST') || - (actualResponse.status === 303 && - !['GET', 'HEAD'].includes(request.method)) - ) { - // then: - // 1. Set request’s method to `GET` and request’s body to null. - request.method = 'GET' - request.body = null + // 6. Set request’s referrer policy to the empty string. + request.referrerPolicy = '' - // 2. For each headerName of request-body-header name, delete headerName from - // request’s header list. - for (const headerName of requestBodyHeader) { - request.headersList.delete(headerName) - } - } + // 7. Set request’s URL to request’s current URL. + request.url = request.urlList[request.urlList.length - 1] - // 13. If request’s current URL’s origin is not same origin with locationURL’s - // origin, then for each headerName of CORS non-wildcard request-header name, - // delete headerName from request’s header list. - if (!sameOrigin(requestCurrentURL(request), locationURL)) { - // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name - request.headersList.delete('authorization') + // 8. Set request’s URL list to « request’s URL ». + request.urlList = [request.url] + } - // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. - request.headersList.delete('cookie') - request.headersList.delete('host') - } + // 14. If init["referrer"] exists, then: + if (init.referrer !== undefined) { + // 1. Let referrer be init["referrer"]. + const referrer = init.referrer - // 14. If request’s body is non-null, then set request’s body to the first return - // value of safely extracting request’s body’s source. - if (request.body != null) { - assert(request.body.source != null) - request.body = safelyExtractBody(request.body.source)[0] - } + // 2. If referrer is the empty string, then set request’s referrer to "no-referrer". + if (referrer === '') { + request.referrer = 'no-referrer' + } else { + // 1. Let parsedReferrer be the result of parsing referrer with + // baseURL. + // 2. If parsedReferrer is failure, then throw a TypeError. + let parsedReferrer + try { + parsedReferrer = new URL(referrer, baseUrl) + } catch (err) { + throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }) + } - // 15. Let timingInfo be fetchParams’s timing info. - const timingInfo = fetchParams.timingInfo + // 3. If one of the following is true + // - parsedReferrer’s scheme is "about" and path is the string "client" + // - parsedReferrer’s origin is not same origin with origin + // then set request’s referrer to "client". + if ( + (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') || + (origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) + ) { + request.referrer = 'client' + } else { + // 4. Otherwise, set request’s referrer to parsedReferrer. + request.referrer = parsedReferrer + } + } + } - // 16. Set timingInfo’s redirect end time and post-redirect start time to the - // coarsened shared current time given fetchParams’s cross-origin isolated - // capability. - timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = - coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability) + // 15. If init["referrerPolicy"] exists, then set request’s referrer policy + // to it. + if (init.referrerPolicy !== undefined) { + request.referrerPolicy = init.referrerPolicy + } - // 17. If timingInfo’s redirect start time is 0, then set timingInfo’s - // redirect start time to timingInfo’s start time. - if (timingInfo.redirectStartTime === 0) { - timingInfo.redirectStartTime = timingInfo.startTime - } + // 16. Let mode be init["mode"] if it exists, and fallbackMode otherwise. + let mode + if (init.mode !== undefined) { + mode = init.mode + } else { + mode = fallbackMode + } - // 18. Append locationURL to request’s URL list. - request.urlList.push(locationURL) + // 17. If mode is "navigate", then throw a TypeError. + if (mode === 'navigate') { + throw webidl.errors.exception({ + header: 'Request constructor', + message: 'invalid request mode navigate.' + }) + } - // 19. Invoke set request’s referrer policy on redirect on request and - // actualResponse. - setRequestReferrerPolicyOnRedirect(request, actualResponse) + // 18. If mode is non-null, set request’s mode to mode. + if (mode != null) { + request.mode = mode + } - // 20. Return the result of running main fetch given fetchParams and true. - return mainFetch(fetchParams, true) -} + // 19. If init["credentials"] exists, then set request’s credentials mode + // to it. + if (init.credentials !== undefined) { + request.credentials = init.credentials + } -// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch -async function httpNetworkOrCacheFetch ( - fetchParams, - isAuthenticationFetch = false, - isNewConnectionFetch = false -) { - // 1. Let request be fetchParams’s request. - const request = fetchParams.request + // 18. If init["cache"] exists, then set request’s cache mode to it. + if (init.cache !== undefined) { + request.cache = init.cache + } - // 2. Let httpFetchParams be null. - let httpFetchParams = null + // 21. If request’s cache mode is "only-if-cached" and request’s mode is + // not "same-origin", then throw a TypeError. + if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + throw new TypeError( + "'only-if-cached' can be set only with 'same-origin' mode" + ) + } - // 3. Let httpRequest be null. - let httpRequest = null + // 22. If init["redirect"] exists, then set request’s redirect mode to it. + if (init.redirect !== undefined) { + request.redirect = init.redirect + } - // 4. Let response be null. - let response = null + // 23. If init["integrity"] exists, then set request’s integrity metadata to it. + if (init.integrity !== undefined && init.integrity != null) { + request.integrity = String(init.integrity) + } - // 5. Let storedResponse be null. - // TODO: cache + // 24. If init["keepalive"] exists, then set request’s keepalive to it. + if (init.keepalive !== undefined) { + request.keepalive = Boolean(init.keepalive) + } - // 6. Let httpCache be null. - const httpCache = null + // 25. If init["method"] exists, then: + if (init.method !== undefined) { + // 1. Let method be init["method"]. + let method = init.method - // 7. Let the revalidatingFlag be unset. - const revalidatingFlag = false + // 2. If method is not a method or method is a forbidden method, then + // throw a TypeError. + if (!isValidHTTPToken(init.method)) { + throw TypeError(`'${init.method}' is not a valid HTTP method.`) + } - // 8. Run these steps, but abort when the ongoing fetch is terminated: + if (forbiddenMethodsSet.has(method.toUpperCase())) { + throw TypeError(`'${init.method}' HTTP method is unsupported.`) + } - // 1. If request’s window is "no-window" and request’s redirect mode is - // "error", then set httpFetchParams to fetchParams and httpRequest to - // request. - if (request.window === 'no-window' && request.redirect === 'error') { - httpFetchParams = fetchParams - httpRequest = request - } else { - // Otherwise: + // 3. Normalize method. + method = normalizeMethod(init.method) - // 1. Set httpRequest to a clone of request. - httpRequest = makeRequest(request) + // 4. Set request’s method to method. + request.method = method + } - // 2. Set httpFetchParams to a copy of fetchParams. - httpFetchParams = { ...fetchParams } + // 26. If init["signal"] exists, then set signal to it. + if (init.signal !== undefined) { + signal = init.signal + } - // 3. Set httpFetchParams’s request to httpRequest. - httpFetchParams.request = httpRequest - } + // 27. Set this’s request to request. + this[kState] = request - // 3. Let includeCredentials be true if one of - const includeCredentials = - request.credentials === 'include' || - (request.credentials === 'same-origin' && - request.responseTainting === 'basic') + // 28. Set this’s signal to a new AbortSignal object with this’s relevant + // Realm. + // TODO: could this be simplified with AbortSignal.any + // (https://dom.spec.whatwg.org/#dom-abortsignal-any) + const ac = new AbortController() + this[kSignal] = ac.signal + this[kSignal][kRealm] = this[kRealm] - // 4. Let contentLength be httpRequest’s body’s length, if httpRequest’s - // body is non-null; otherwise null. - const contentLength = httpRequest.body ? httpRequest.body.length : null + // 29. If signal is not null, then make this’s signal follow signal. + if (signal != null) { + if ( + !signal || + typeof signal.aborted !== 'boolean' || + typeof signal.addEventListener !== 'function' + ) { + throw new TypeError( + "Failed to construct 'Request': member signal is not of type AbortSignal." + ) + } - // 5. Let contentLengthHeaderValue be null. - let contentLengthHeaderValue = null + if (signal.aborted) { + ac.abort(signal.reason) + } else { + // Keep a strong ref to ac while request object + // is alive. This is needed to prevent AbortController + // from being prematurely garbage collected. + // See, https://github.com/nodejs/undici/issues/1926. + this[kAbortController] = ac - // 6. If httpRequest’s body is null and httpRequest’s method is `POST` or - // `PUT`, then set contentLengthHeaderValue to `0`. - if ( - httpRequest.body == null && - ['POST', 'PUT'].includes(httpRequest.method) - ) { - contentLengthHeaderValue = '0' - } + const acRef = new WeakRef(ac) + const abort = function () { + const ac = acRef.deref() + if (ac !== undefined) { + ac.abort(this.reason) + } + } - // 7. If contentLength is non-null, then set contentLengthHeaderValue to - // contentLength, serialized and isomorphic encoded. - if (contentLength != null) { - contentLengthHeaderValue = isomorphicEncode(`${contentLength}`) - } + // Third-party AbortControllers may not work with these. + // See, https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619. + try { + // If the max amount of listeners is equal to the default, increase it + // This is only available in node >= v19.9.0 + if (typeof getMaxListeners === 'function' && getMaxListeners(signal) === defaultMaxListeners) { + setMaxListeners(100, signal) + } else if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) { + setMaxListeners(100, signal) + } + } catch {} - // 8. If contentLengthHeaderValue is non-null, then append - // `Content-Length`/contentLengthHeaderValue to httpRequest’s header - // list. - if (contentLengthHeaderValue != null) { - httpRequest.headersList.append('content-length', contentLengthHeaderValue) - } + util.addAbortListener(signal, abort) + requestFinalizer.register(ac, { signal, abort }) + } + } - // 9. If contentLengthHeaderValue is non-null, then append (`Content-Length`, - // contentLengthHeaderValue) to httpRequest’s header list. + // 30. Set this’s headers to a new Headers object with this’s relevant + // Realm, whose header list is request’s header list and guard is + // "request". + this[kHeaders] = new Headers() + this[kHeaders][kHeadersList] = request.headersList + this[kHeaders][kGuard] = 'request' + this[kHeaders][kRealm] = this[kRealm] - // 10. If contentLength is non-null and httpRequest’s keepalive is true, - // then: - if (contentLength != null && httpRequest.keepalive) { - // NOTE: keepalive is a noop outside of browser context. - } + // 31. If this’s request’s mode is "no-cors", then: + if (mode === 'no-cors') { + // 1. If this’s request’s method is not a CORS-safelisted method, + // then throw a TypeError. + if (!corsSafeListedMethodsSet.has(request.method)) { + throw new TypeError( + `'${request.method} is unsupported in no-cors mode.` + ) + } - // 11. If httpRequest’s referrer is a URL, then append - // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded, - // to httpRequest’s header list. - if (httpRequest.referrer instanceof URL) { - httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href)) - } + // 2. Set this’s headers’s guard to "request-no-cors". + this[kHeaders][kGuard] = 'request-no-cors' + } - // 12. Append a request `Origin` header for httpRequest. - appendRequestOriginHeader(httpRequest) + // 32. If init is not empty, then: + if (Object.keys(init).length !== 0) { + // 1. Let headers be a copy of this’s headers and its associated header + // list. + let headers = new Headers(this[kHeaders]) - // 13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA] - appendFetchMetadata(httpRequest) + // 2. If init["headers"] exists, then set headers to init["headers"]. + if (init.headers !== undefined) { + headers = init.headers + } - // 14. If httpRequest’s header list does not contain `User-Agent`, then - // user agents should append `User-Agent`/default `User-Agent` value to - // httpRequest’s header list. - if (!httpRequest.headersList.contains('user-agent')) { - httpRequest.headersList.append('user-agent', typeof esbuildDetection === 'undefined' ? 'undici' : 'node') - } + // 3. Empty this’s headers’s header list. + this[kHeaders][kHeadersList].clear() - // 15. If httpRequest’s cache mode is "default" and httpRequest’s header - // list contains `If-Modified-Since`, `If-None-Match`, - // `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set - // httpRequest’s cache mode to "no-store". - if ( - httpRequest.cache === 'default' && - (httpRequest.headersList.contains('if-modified-since') || - httpRequest.headersList.contains('if-none-match') || - httpRequest.headersList.contains('if-unmodified-since') || - httpRequest.headersList.contains('if-match') || - httpRequest.headersList.contains('if-range')) - ) { - httpRequest.cache = 'no-store' - } + // 4. If headers is a Headers object, then for each header in its header + // list, append header’s name/header’s value to this’s headers. + if (headers.constructor.name === 'Headers') { + for (const [key, val] of headers) { + this[kHeaders].append(key, val) + } + } else { + // 5. Otherwise, fill this’s headers with headers. + fillHeaders(this[kHeaders], headers) + } + } - // 16. If httpRequest’s cache mode is "no-cache", httpRequest’s prevent - // no-cache cache-control header modification flag is unset, and - // httpRequest’s header list does not contain `Cache-Control`, then append - // `Cache-Control`/`max-age=0` to httpRequest’s header list. - if ( - httpRequest.cache === 'no-cache' && - !httpRequest.preventNoCacheCacheControlHeaderModification && - !httpRequest.headersList.contains('cache-control') - ) { - httpRequest.headersList.append('cache-control', 'max-age=0') - } + // 33. Let inputBody be input’s request’s body if input is a Request + // object; otherwise null. + const inputBody = input instanceof Request ? input[kState].body : null - // 17. If httpRequest’s cache mode is "no-store" or "reload", then: - if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') { - // 1. If httpRequest’s header list does not contain `Pragma`, then append - // `Pragma`/`no-cache` to httpRequest’s header list. - if (!httpRequest.headersList.contains('pragma')) { - httpRequest.headersList.append('pragma', 'no-cache') + // 34. If either init["body"] exists and is non-null or inputBody is + // non-null, and request’s method is `GET` or `HEAD`, then throw a + // TypeError. + if ( + (init.body != null || inputBody != null) && + (request.method === 'GET' || request.method === 'HEAD') + ) { + throw new TypeError('Request with GET/HEAD method cannot have body.') } - // 2. If httpRequest’s header list does not contain `Cache-Control`, - // then append `Cache-Control`/`no-cache` to httpRequest’s header list. - if (!httpRequest.headersList.contains('cache-control')) { - httpRequest.headersList.append('cache-control', 'no-cache') - } - } + // 35. Let initBody be null. + let initBody = null - // 18. If httpRequest’s header list contains `Range`, then append - // `Accept-Encoding`/`identity` to httpRequest’s header list. - if (httpRequest.headersList.contains('range')) { - httpRequest.headersList.append('accept-encoding', 'identity') - } + // 36. If init["body"] exists and is non-null, then: + if (init.body != null) { + // 1. Let Content-Type be null. + // 2. Set initBody and Content-Type to the result of extracting + // init["body"], with keepalive set to request’s keepalive. + const [extractedBody, contentType] = extractBody( + init.body, + request.keepalive + ) + initBody = extractedBody - // 19. Modify httpRequest’s header list per HTTP. Do not append a given - // header if httpRequest’s header list contains that header’s name. - // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129 - if (!httpRequest.headersList.contains('accept-encoding')) { - if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { - httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate') - } else { - httpRequest.headersList.append('accept-encoding', 'gzip, deflate') + // 3, If Content-Type is non-null and this’s headers’s header list does + // not contain `Content-Type`, then append `Content-Type`/Content-Type to + // this’s headers. + if (contentType && !this[kHeaders][kHeadersList].contains('content-type')) { + this[kHeaders].append('content-type', contentType) + } } - } - httpRequest.headersList.delete('host') + // 37. Let inputOrInitBody be initBody if it is non-null; otherwise + // inputBody. + const inputOrInitBody = initBody ?? inputBody - // 20. If includeCredentials is true, then: - if (includeCredentials) { - // 1. If the user agent is not configured to block cookies for httpRequest - // (see section 7 of [COOKIES]), then: - // TODO: credentials - // 2. If httpRequest’s header list does not contain `Authorization`, then: - // TODO: credentials - } + // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is + // null, then: + if (inputOrInitBody != null && inputOrInitBody.source == null) { + // 1. If initBody is non-null and init["duplex"] does not exist, + // then throw a TypeError. + if (initBody != null && init.duplex == null) { + throw new TypeError('RequestInit: duplex option is required when sending a body.') + } - // 21. If there’s a proxy-authentication entry, use it as appropriate. - // TODO: proxy-authentication + // 2. If this’s request’s mode is neither "same-origin" nor "cors", + // then throw a TypeError. + if (request.mode !== 'same-origin' && request.mode !== 'cors') { + throw new TypeError( + 'If request is made from ReadableStream, mode should be "same-origin" or "cors"' + ) + } - // 22. Set httpCache to the result of determining the HTTP cache - // partition, given httpRequest. - // TODO: cache + // 3. Set this’s request’s use-CORS-preflight flag. + request.useCORSPreflightFlag = true + } - // 23. If httpCache is null, then set httpRequest’s cache mode to - // "no-store". - if (httpCache == null) { - httpRequest.cache = 'no-store' - } + // 39. Let finalBody be inputOrInitBody. + let finalBody = inputOrInitBody - // 24. If httpRequest’s cache mode is neither "no-store" nor "reload", - // then: - if (httpRequest.mode !== 'no-store' && httpRequest.mode !== 'reload') { - // TODO: cache - } + // 40. If initBody is null and inputBody is non-null, then: + if (initBody == null && inputBody != null) { + // 1. If input is unusable, then throw a TypeError. + if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) { + throw new TypeError( + 'Cannot construct a Request with a Request object that has already been used.' + ) + } - // 9. If aborted, then return the appropriate network error for fetchParams. - // TODO + // 2. Set finalBody to the result of creating a proxy for inputBody. + if (!TransformStream) { + TransformStream = (__nccwpck_require__(35356).TransformStream) + } - // 10. If response is null, then: - if (response == null) { - // 1. If httpRequest’s cache mode is "only-if-cached", then return a - // network error. - if (httpRequest.mode === 'only-if-cached') { - return makeNetworkError('only if cached') + // https://streams.spec.whatwg.org/#readablestream-create-a-proxy + const identityTransform = new TransformStream() + inputBody.stream.pipeThrough(identityTransform) + finalBody = { + source: inputBody.source, + length: inputBody.length, + stream: identityTransform.readable + } } - // 2. Let forwardResponse be the result of running HTTP-network fetch - // given httpFetchParams, includeCredentials, and isNewConnectionFetch. - const forwardResponse = await httpNetworkFetch( - httpFetchParams, - includeCredentials, - isNewConnectionFetch - ) + // 41. Set this’s request’s body to finalBody. + this[kState].body = finalBody + } - // 3. If httpRequest’s method is unsafe and forwardResponse’s status is - // in the range 200 to 399, inclusive, invalidate appropriate stored - // responses in httpCache, as per the "Invalidation" chapter of HTTP - // Caching, and set storedResponse to null. [HTTP-CACHING] - if ( - !safeMethods.includes(httpRequest.method) && - forwardResponse.status >= 200 && - forwardResponse.status <= 399 - ) { - // TODO: cache - } + // Returns request’s HTTP method, which is "GET" by default. + get method () { + webidl.brandCheck(this, Request) - // 4. If the revalidatingFlag is set and forwardResponse’s status is 304, - // then: - if (revalidatingFlag && forwardResponse.status === 304) { - // TODO: cache - } + // The method getter steps are to return this’s request’s method. + return this[kState].method + } - // 5. If response is null, then: - if (response == null) { - // 1. Set response to forwardResponse. - response = forwardResponse + // Returns the URL of request as a string. + get url () { + webidl.brandCheck(this, Request) - // 2. Store httpRequest and forwardResponse in httpCache, as per the - // "Storing Responses in Caches" chapter of HTTP Caching. [HTTP-CACHING] - // TODO: cache - } + // The url getter steps are to return this’s request’s URL, serialized. + return URLSerializer(this[kState].url) } - // 11. Set response’s URL list to a clone of httpRequest’s URL list. - response.urlList = [...httpRequest.urlList] + // Returns a Headers object consisting of the headers associated with request. + // Note that headers added in the network layer by the user agent will not + // be accounted for in this object, e.g., the "Host" header. + get headers () { + webidl.brandCheck(this, Request) - // 12. If httpRequest’s header list contains `Range`, then set response’s - // range-requested flag. - if (httpRequest.headersList.contains('range')) { - response.rangeRequested = true + // The headers getter steps are to return this’s headers. + return this[kHeaders] } - // 13. Set response’s request-includes-credentials to includeCredentials. - response.requestIncludesCredentials = includeCredentials - - // 14. If response’s status is 401, httpRequest’s response tainting is not - // "cors", includeCredentials is true, and request’s window is an environment - // settings object, then: - // TODO + // Returns the kind of resource requested by request, e.g., "document" + // or "script". + get destination () { + webidl.brandCheck(this, Request) - // 15. If response’s status is 407, then: - if (response.status === 407) { - // 1. If request’s window is "no-window", then return a network error. - if (request.window === 'no-window') { - return makeNetworkError() - } + // The destination getter are to return this’s request’s destination. + return this[kState].destination + } - // 2. ??? + // Returns the referrer of request. Its value can be a same-origin URL if + // explicitly set in init, the empty string to indicate no referrer, and + // "about:client" when defaulting to the global’s default. This is used + // during fetching to determine the value of the `Referer` header of the + // request being made. + get referrer () { + webidl.brandCheck(this, Request) - // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams. - if (isCancelled(fetchParams)) { - return makeAppropriateNetworkError(fetchParams) + // 1. If this’s request’s referrer is "no-referrer", then return the + // empty string. + if (this[kState].referrer === 'no-referrer') { + return '' } - // 4. Prompt the end user as appropriate in request’s window and store - // the result as a proxy-authentication entry. [HTTP-AUTH] - // TODO: Invoke some kind of callback? + // 2. If this’s request’s referrer is "client", then return + // "about:client". + if (this[kState].referrer === 'client') { + return 'about:client' + } - // 5. Set response to the result of running HTTP-network-or-cache fetch given - // fetchParams. - // TODO - return makeNetworkError('proxy authentication required') + // Return this’s request’s referrer, serialized. + return this[kState].referrer.toString() } - // 16. If all of the following are true - if ( - // response’s status is 421 - response.status === 421 && - // isNewConnectionFetch is false - !isNewConnectionFetch && - // request’s body is null, or request’s body is non-null and request’s body’s source is non-null - (request.body == null || request.body.source != null) - ) { - // then: - - // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams. - if (isCancelled(fetchParams)) { - return makeAppropriateNetworkError(fetchParams) - } + // Returns the referrer policy associated with request. + // This is used during fetching to compute the value of the request’s + // referrer. + get referrerPolicy () { + webidl.brandCheck(this, Request) - // 2. Set response to the result of running HTTP-network-or-cache - // fetch given fetchParams, isAuthenticationFetch, and true. + // The referrerPolicy getter steps are to return this’s request’s referrer policy. + return this[kState].referrerPolicy + } - // TODO (spec): The spec doesn't specify this but we need to cancel - // the active response before we can start a new one. - // https://github.com/whatwg/fetch/issues/1293 - fetchParams.controller.connection.destroy() + // Returns the mode associated with request, which is a string indicating + // whether the request will use CORS, or will be restricted to same-origin + // URLs. + get mode () { + webidl.brandCheck(this, Request) - response = await httpNetworkOrCacheFetch( - fetchParams, - isAuthenticationFetch, - true - ) + // The mode getter steps are to return this’s request’s mode. + return this[kState].mode } - // 17. If isAuthenticationFetch is true, then create an authentication entry - if (isAuthenticationFetch) { - // TODO + // Returns the credentials mode associated with request, + // which is a string indicating whether credentials will be sent with the + // request always, never, or only when sent to a same-origin URL. + get credentials () { + // The credentials getter steps are to return this’s request’s credentials mode. + return this[kState].credentials } - // 18. Return response. - return response -} + // Returns the cache mode associated with request, + // which is a string indicating how the request will + // interact with the browser’s cache when fetching. + get cache () { + webidl.brandCheck(this, Request) -// https://fetch.spec.whatwg.org/#http-network-fetch -async function httpNetworkFetch ( - fetchParams, - includeCredentials = false, - forceNewConnection = false -) { - assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed) + // The cache getter steps are to return this’s request’s cache mode. + return this[kState].cache + } - fetchParams.controller.connection = { - abort: null, - destroyed: false, - destroy (err) { - if (!this.destroyed) { - this.destroyed = true - this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError')) - } - } + // Returns the redirect mode associated with request, + // which is a string indicating how redirects for the + // request will be handled during fetching. A request + // will follow redirects by default. + get redirect () { + webidl.brandCheck(this, Request) + + // The redirect getter steps are to return this’s request’s redirect mode. + return this[kState].redirect } - // 1. Let request be fetchParams’s request. - const request = fetchParams.request + // Returns request’s subresource integrity metadata, which is a + // cryptographic hash of the resource being fetched. Its value + // consists of multiple hashes separated by whitespace. [SRI] + get integrity () { + webidl.brandCheck(this, Request) - // 2. Let response be null. - let response = null + // The integrity getter steps are to return this’s request’s integrity + // metadata. + return this[kState].integrity + } - // 3. Let timingInfo be fetchParams’s timing info. - const timingInfo = fetchParams.timingInfo + // Returns a boolean indicating whether or not request can outlive the + // global in which it was created. + get keepalive () { + webidl.brandCheck(this, Request) - // 4. Let httpCache be the result of determining the HTTP cache partition, - // given request. - // TODO: cache - const httpCache = null + // The keepalive getter steps are to return this’s request’s keepalive. + return this[kState].keepalive + } - // 5. If httpCache is null, then set request’s cache mode to "no-store". - if (httpCache == null) { - request.cache = 'no-store' + // Returns a boolean indicating whether or not request is for a reload + // navigation. + get isReloadNavigation () { + webidl.brandCheck(this, Request) + + // The isReloadNavigation getter steps are to return true if this’s + // request’s reload-navigation flag is set; otherwise false. + return this[kState].reloadNavigation } - // 6. Let networkPartitionKey be the result of determining the network - // partition key given request. - // TODO + // Returns a boolean indicating whether or not request is for a history + // navigation (a.k.a. back-foward navigation). + get isHistoryNavigation () { + webidl.brandCheck(this, Request) - // 7. Let newConnection be "yes" if forceNewConnection is true; otherwise - // "no". - const newConnection = forceNewConnection ? 'yes' : 'no' // eslint-disable-line no-unused-vars + // The isHistoryNavigation getter steps are to return true if this’s request’s + // history-navigation flag is set; otherwise false. + return this[kState].historyNavigation + } - // 8. Switch on request’s mode: - if (request.mode === 'websocket') { - // Let connection be the result of obtaining a WebSocket connection, - // given request’s current URL. - // TODO - } else { - // Let connection be the result of obtaining a connection, given - // networkPartitionKey, request’s current URL’s origin, - // includeCredentials, and forceNewConnection. - // TODO + // Returns the signal associated with request, which is an AbortSignal + // object indicating whether or not request has been aborted, and its + // abort event handler. + get signal () { + webidl.brandCheck(this, Request) + + // The signal getter steps are to return this’s signal. + return this[kSignal] } - // 9. Run these steps, but abort when the ongoing fetch is terminated: + get body () { + webidl.brandCheck(this, Request) - // 1. If connection is failure, then return a network error. + return this[kState].body ? this[kState].body.stream : null + } - // 2. Set timingInfo’s final connection timing info to the result of - // calling clamp and coarsen connection timing info with connection’s - // timing info, timingInfo’s post-redirect start time, and fetchParams’s - // cross-origin isolated capability. + get bodyUsed () { + webidl.brandCheck(this, Request) - // 3. If connection is not an HTTP/2 connection, request’s body is non-null, - // and request’s body’s source is null, then append (`Transfer-Encoding`, - // `chunked`) to request’s header list. + return !!this[kState].body && util.isDisturbed(this[kState].body.stream) + } - // 4. Set timingInfo’s final network-request start time to the coarsened - // shared current time given fetchParams’s cross-origin isolated - // capability. + get duplex () { + webidl.brandCheck(this, Request) - // 5. Set response to the result of making an HTTP request over connection - // using request with the following caveats: + return 'half' + } - // - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS] - // [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH] + // Returns a clone of request. + clone () { + webidl.brandCheck(this, Request) - // - If request’s body is non-null, and request’s body’s source is null, - // then the user agent may have a buffer of up to 64 kibibytes and store - // a part of request’s body in that buffer. If the user agent reads from - // request’s body beyond that buffer’s size and the user agent needs to - // resend request, then instead return a network error. + // 1. If this is unusable, then throw a TypeError. + if (this.bodyUsed || this.body?.locked) { + throw new TypeError('unusable') + } - // - Set timingInfo’s final network-response start time to the coarsened - // shared current time given fetchParams’s cross-origin isolated capability, - // immediately after the user agent’s HTTP parser receives the first byte - // of the response (e.g., frame header bytes for HTTP/2 or response status - // line for HTTP/1.x). + // 2. Let clonedRequest be the result of cloning this’s request. + const clonedRequest = cloneRequest(this[kState]) - // - Wait until all the headers are transmitted. + // 3. Let clonedRequestObject be the result of creating a Request object, + // given clonedRequest, this’s headers’s guard, and this’s relevant Realm. + const clonedRequestObject = new Request(kInit) + clonedRequestObject[kState] = clonedRequest + clonedRequestObject[kRealm] = this[kRealm] + clonedRequestObject[kHeaders] = new Headers() + clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList + clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard] + clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm] - // - Any responses whose status is in the range 100 to 199, inclusive, - // and is not 101, are to be ignored, except for the purposes of setting - // timingInfo’s final network-response start time above. + // 4. Make clonedRequestObject’s signal follow this’s signal. + const ac = new AbortController() + if (this.signal.aborted) { + ac.abort(this.signal.reason) + } else { + util.addAbortListener( + this.signal, + () => { + ac.abort(this.signal.reason) + } + ) + } + clonedRequestObject[kSignal] = ac.signal - // - If request’s header list contains `Transfer-Encoding`/`chunked` and - // response is transferred via HTTP/1.0 or older, then return a network - // error. + // 4. Return clonedRequestObject. + return clonedRequestObject + } +} - // - If the HTTP request results in a TLS client certificate dialog, then: +mixinBody(Request) - // 1. If request’s window is an environment settings object, make the - // dialog available in request’s window. +function makeRequest (init) { + // https://fetch.spec.whatwg.org/#requests + const request = { + method: 'GET', + localURLsOnly: false, + unsafeRequest: false, + body: null, + client: null, + reservedClient: null, + replacesClientId: '', + window: 'client', + keepalive: false, + serviceWorkers: 'all', + initiator: '', + destination: '', + priority: null, + origin: 'client', + policyContainer: 'client', + referrer: 'client', + referrerPolicy: '', + mode: 'no-cors', + useCORSPreflightFlag: false, + credentials: 'same-origin', + useCredentials: false, + cache: 'default', + redirect: 'follow', + integrity: '', + cryptoGraphicsNonceMetadata: '', + parserMetadata: '', + reloadNavigation: false, + historyNavigation: false, + userActivation: false, + taintedOrigin: false, + redirectCount: 0, + responseTainting: 'basic', + preventNoCacheCacheControlHeaderModification: false, + done: false, + timingAllowFailed: false, + ...init, + headersList: init.headersList + ? new HeadersList(init.headersList) + : new HeadersList() + } + request.url = request.urlList[0] + return request +} - // 2. Otherwise, return a network error. +// https://fetch.spec.whatwg.org/#concept-request-clone +function cloneRequest (request) { + // To clone a request request, run these steps: + + // 1. Let newRequest be a copy of request, except for its body. + const newRequest = makeRequest({ ...request, body: null }) - // To transmit request’s body body, run these steps: - let requestBody = null - // 1. If body is null and fetchParams’s process request end-of-body is - // non-null, then queue a fetch task given fetchParams’s process request - // end-of-body and fetchParams’s task destination. - if (request.body == null && fetchParams.processRequestEndOfBody) { - queueMicrotask(() => fetchParams.processRequestEndOfBody()) - } else if (request.body != null) { - // 2. Otherwise, if body is non-null: + // 2. If request’s body is non-null, set newRequest’s body to the + // result of cloning request’s body. + if (request.body != null) { + newRequest.body = cloneBody(request.body) + } - // 1. Let processBodyChunk given bytes be these steps: - const processBodyChunk = async function * (bytes) { - // 1. If the ongoing fetch is terminated, then abort these steps. - if (isCancelled(fetchParams)) { - return - } + // 3. Return newRequest. + return newRequest +} - // 2. Run this step in parallel: transmit bytes. - yield bytes +Object.defineProperties(Request.prototype, { + method: kEnumerableProperty, + url: kEnumerableProperty, + headers: kEnumerableProperty, + redirect: kEnumerableProperty, + clone: kEnumerableProperty, + signal: kEnumerableProperty, + duplex: kEnumerableProperty, + destination: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + isHistoryNavigation: kEnumerableProperty, + isReloadNavigation: kEnumerableProperty, + keepalive: kEnumerableProperty, + integrity: kEnumerableProperty, + cache: kEnumerableProperty, + credentials: kEnumerableProperty, + attribute: kEnumerableProperty, + referrerPolicy: kEnumerableProperty, + referrer: kEnumerableProperty, + mode: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'Request', + configurable: true + } +}) - // 3. If fetchParams’s process request body is non-null, then run - // fetchParams’s process request body given bytes’s length. - fetchParams.processRequestBodyChunkLength?.(bytes.byteLength) - } +webidl.converters.Request = webidl.interfaceConverter( + Request +) - // 2. Let processEndOfBody be these steps: - const processEndOfBody = () => { - // 1. If fetchParams is canceled, then abort these steps. - if (isCancelled(fetchParams)) { - return - } +// https://fetch.spec.whatwg.org/#requestinfo +webidl.converters.RequestInfo = function (V) { + if (typeof V === 'string') { + return webidl.converters.USVString(V) + } - // 2. If fetchParams’s process request end-of-body is non-null, - // then run fetchParams’s process request end-of-body. - if (fetchParams.processRequestEndOfBody) { - fetchParams.processRequestEndOfBody() - } - } + if (V instanceof Request) { + return webidl.converters.Request(V) + } - // 3. Let processBodyError given e be these steps: - const processBodyError = (e) => { - // 1. If fetchParams is canceled, then abort these steps. - if (isCancelled(fetchParams)) { - return - } + return webidl.converters.USVString(V) +} - // 2. If e is an "AbortError" DOMException, then abort fetchParams’s controller. - if (e.name === 'AbortError') { - fetchParams.controller.abort() - } else { - fetchParams.controller.terminate(e) - } - } +webidl.converters.AbortSignal = webidl.interfaceConverter( + AbortSignal +) - // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody, - // processBodyError, and fetchParams’s task destination. - requestBody = (async function * () { - try { - for await (const bytes of request.body.stream) { - yield * processBodyChunk(bytes) - } - processEndOfBody() - } catch (err) { - processBodyError(err) - } - })() +// https://fetch.spec.whatwg.org/#requestinit +webidl.converters.RequestInit = webidl.dictionaryConverter([ + { + key: 'method', + converter: webidl.converters.ByteString + }, + { + key: 'headers', + converter: webidl.converters.HeadersInit + }, + { + key: 'body', + converter: webidl.nullableConverter( + webidl.converters.BodyInit + ) + }, + { + key: 'referrer', + converter: webidl.converters.USVString + }, + { + key: 'referrerPolicy', + converter: webidl.converters.DOMString, + // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy + allowedValues: referrerPolicy + }, + { + key: 'mode', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#concept-request-mode + allowedValues: requestMode + }, + { + key: 'credentials', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcredentials + allowedValues: requestCredentials + }, + { + key: 'cache', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcache + allowedValues: requestCache + }, + { + key: 'redirect', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestredirect + allowedValues: requestRedirect + }, + { + key: 'integrity', + converter: webidl.converters.DOMString + }, + { + key: 'keepalive', + converter: webidl.converters.boolean + }, + { + key: 'signal', + converter: webidl.nullableConverter( + (signal) => webidl.converters.AbortSignal( + signal, + { strict: false } + ) + ) + }, + { + key: 'window', + converter: webidl.converters.any + }, + { + key: 'duplex', + converter: webidl.converters.DOMString, + allowedValues: requestDuplex } +]) - try { - // socket is only provided for websockets - const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody }) +module.exports = { Request, makeRequest } - if (socket) { - response = makeResponse({ status, statusText, headersList, socket }) - } else { - const iterator = body[Symbol.asyncIterator]() - fetchParams.controller.next = () => iterator.next() - response = makeResponse({ status, statusText, headersList }) - } - } catch (err) { - // 10. If aborted, then: - if (err.name === 'AbortError') { - // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame. - fetchParams.controller.connection.destroy() +/***/ }), - // 2. Return the appropriate network error for fetchParams. - return makeAppropriateNetworkError(fetchParams, err) - } +/***/ 27823: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - return makeNetworkError(err) - } +"use strict"; - // 11. Let pullAlgorithm be an action that resumes the ongoing fetch - // if it is suspended. - const pullAlgorithm = () => { - fetchParams.controller.resume() - } - // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s - // controller with reason, given reason. - const cancelAlgorithm = (reason) => { - fetchParams.controller.abort(reason) - } +const { Headers, HeadersList, fill } = __nccwpck_require__(10554) +const { extractBody, cloneBody, mixinBody } = __nccwpck_require__(41472) +const util = __nccwpck_require__(83983) +const { kEnumerableProperty } = util +const { + isValidReasonPhrase, + isCancelled, + isAborted, + isBlobLike, + serializeJavascriptValueToJSONString, + isErrorLike, + isomorphicEncode +} = __nccwpck_require__(52538) +const { + redirectStatusSet, + nullBodyStatus, + DOMException +} = __nccwpck_require__(41037) +const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(15861) +const { webidl } = __nccwpck_require__(21744) +const { FormData } = __nccwpck_require__(72015) +const { getGlobalOrigin } = __nccwpck_require__(71246) +const { URLSerializer } = __nccwpck_require__(685) +const { kHeadersList } = __nccwpck_require__(72785) +const assert = __nccwpck_require__(39491) +const { types } = __nccwpck_require__(73837) - // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by - // the user agent. - // TODO +const ReadableStream = globalThis.ReadableStream || (__nccwpck_require__(35356).ReadableStream) +const textEncoder = new TextEncoder('utf-8') - // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object - // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent. - // TODO +// https://fetch.spec.whatwg.org/#response-class +class Response { + // Creates network error Response. + static error () { + // TODO + const relevantRealm = { settingsObject: {} } - // 15. Let stream be a new ReadableStream. - // 16. Set up stream with pullAlgorithm set to pullAlgorithm, - // cancelAlgorithm set to cancelAlgorithm, highWaterMark set to - // highWaterMark, and sizeAlgorithm set to sizeAlgorithm. - if (!ReadableStream) { - ReadableStream = (__nccwpck_require__(35356).ReadableStream) + // The static error() method steps are to return the result of creating a + // Response object, given a new network error, "immutable", and this’s + // relevant Realm. + const responseObject = new Response() + responseObject[kState] = makeNetworkError() + responseObject[kRealm] = relevantRealm + responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList + responseObject[kHeaders][kGuard] = 'immutable' + responseObject[kHeaders][kRealm] = relevantRealm + return responseObject } - const stream = new ReadableStream( - { - async start (controller) { - fetchParams.controller.controller = controller - }, - async pull (controller) { - await pullAlgorithm(controller) - }, - async cancel (reason) { - await cancelAlgorithm(reason) - } - }, - { - highWaterMark: 0, - size () { - return 1 - } + // https://fetch.spec.whatwg.org/#dom-response-json + static json (data, init = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: 'Response.json' }) + + if (init !== null) { + init = webidl.converters.ResponseInit(init) } - ) - // 17. Run these steps, but abort when the ongoing fetch is terminated: + // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data. + const bytes = textEncoder.encode( + serializeJavascriptValueToJSONString(data) + ) - // 1. Set response’s body to a new body whose stream is stream. - response.body = { stream } + // 2. Let body be the result of extracting bytes. + const body = extractBody(bytes) - // 2. If response is not a network error and request’s cache mode is - // not "no-store", then update response in httpCache for request. - // TODO + // 3. Let responseObject be the result of creating a Response object, given a new response, + // "response", and this’s relevant Realm. + const relevantRealm = { settingsObject: {} } + const responseObject = new Response() + responseObject[kRealm] = relevantRealm + responseObject[kHeaders][kGuard] = 'response' + responseObject[kHeaders][kRealm] = relevantRealm - // 3. If includeCredentials is true and the user agent is not configured - // to block cookies for request (see section 7 of [COOKIES]), then run the - // "set-cookie-string" parsing algorithm (see section 5.2 of [COOKIES]) on - // the value of each header whose name is a byte-case-insensitive match for - // `Set-Cookie` in response’s header list, if any, and request’s current URL. - // TODO + // 4. Perform initialize a response given responseObject, init, and (body, "application/json"). + initializeResponse(responseObject, init, { body: body[0], type: 'application/json' }) - // 18. If aborted, then: - // TODO + // 5. Return responseObject. + return responseObject + } - // 19. Run these steps in parallel: + // Creates a redirect Response that redirects to url with status status. + static redirect (url, status = 302) { + const relevantRealm = { settingsObject: {} } - // 1. Run these steps, but abort when fetchParams is canceled: - fetchParams.controller.on('terminated', onAborted) - fetchParams.controller.resume = async () => { - // 1. While true - while (true) { - // 1-3. See onData... + webidl.argumentLengthCheck(arguments, 1, { header: 'Response.redirect' }) - // 4. Set bytes to the result of handling content codings given - // codings and bytes. - let bytes - let isFailure - try { - const { done, value } = await fetchParams.controller.next() + url = webidl.converters.USVString(url) + status = webidl.converters['unsigned short'](status) - if (isAborted(fetchParams)) { - break - } + // 1. Let parsedURL be the result of parsing url with current settings + // object’s API base URL. + // 2. If parsedURL is failure, then throw a TypeError. + // TODO: base-URL? + let parsedURL + try { + parsedURL = new URL(url, getGlobalOrigin()) + } catch (err) { + throw Object.assign(new TypeError('Failed to parse URL from ' + url), { + cause: err + }) + } - bytes = done ? undefined : value - } catch (err) { - if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { - // zlib doesn't like empty streams. - bytes = undefined - } else { - bytes = err + // 3. If status is not a redirect status, then throw a RangeError. + if (!redirectStatusSet.has(status)) { + throw new RangeError('Invalid status code ' + status) + } - // err may be propagated from the result of calling readablestream.cancel, - // which might not be an error. https://github.com/nodejs/undici/issues/2009 - isFailure = true - } - } + // 4. Let responseObject be the result of creating a Response object, + // given a new response, "immutable", and this’s relevant Realm. + const responseObject = new Response() + responseObject[kRealm] = relevantRealm + responseObject[kHeaders][kGuard] = 'immutable' + responseObject[kHeaders][kRealm] = relevantRealm - if (bytes === undefined) { - // 2. Otherwise, if the bytes transmission for response’s message - // body is done normally and stream is readable, then close - // stream, finalize response for fetchParams and response, and - // abort these in-parallel steps. - readableStreamClose(fetchParams.controller.controller) + // 5. Set responseObject’s response’s status to status. + responseObject[kState].status = status - finalizeResponse(fetchParams, response) + // 6. Let value be parsedURL, serialized and isomorphic encoded. + const value = isomorphicEncode(URLSerializer(parsedURL)) - return - } + // 7. Append `Location`/value to responseObject’s response’s header list. + responseObject[kState].headersList.append('location', value) - // 5. Increase timingInfo’s decoded body size by bytes’s length. - timingInfo.decodedBodySize += bytes?.byteLength ?? 0 + // 8. Return responseObject. + return responseObject + } - // 6. If bytes is failure, then terminate fetchParams’s controller. - if (isFailure) { - fetchParams.controller.terminate(bytes) - return - } + // https://fetch.spec.whatwg.org/#dom-response + constructor (body = null, init = {}) { + if (body !== null) { + body = webidl.converters.BodyInit(body) + } - // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes - // into stream. - fetchParams.controller.controller.enqueue(new Uint8Array(bytes)) + init = webidl.converters.ResponseInit(init) - // 8. If stream is errored, then terminate the ongoing fetch. - if (isErrored(stream)) { - fetchParams.controller.terminate() - return - } + // TODO + this[kRealm] = { settingsObject: {} } - // 9. If stream doesn’t need more data ask the user agent to suspend - // the ongoing fetch. - if (!fetchParams.controller.controller.desiredSize) { - return - } - } - } + // 1. Set this’s response to a new response. + this[kState] = makeResponse({}) - // 2. If aborted, then: - function onAborted (reason) { - // 2. If fetchParams is aborted, then: - if (isAborted(fetchParams)) { - // 1. Set response’s aborted flag. - response.aborted = true + // 2. Set this’s headers to a new Headers object with this’s relevant + // Realm, whose header list is this’s response’s header list and guard + // is "response". + this[kHeaders] = new Headers() + this[kHeaders][kGuard] = 'response' + this[kHeaders][kHeadersList] = this[kState].headersList + this[kHeaders][kRealm] = this[kRealm] - // 2. If stream is readable, then error stream with the result of - // deserialize a serialized abort reason given fetchParams’s - // controller’s serialized abort reason and an - // implementation-defined realm. - if (isReadable(stream)) { - fetchParams.controller.controller.error( - fetchParams.controller.serializedAbortReason - ) - } - } else { - // 3. Otherwise, if stream is readable, error stream with a TypeError. - if (isReadable(stream)) { - fetchParams.controller.controller.error(new TypeError('terminated', { - cause: isErrorLike(reason) ? reason : undefined - })) - } + // 3. Let bodyWithType be null. + let bodyWithType = null + + // 4. If body is non-null, then set bodyWithType to the result of extracting body. + if (body != null) { + const [extractedBody, type] = extractBody(body) + bodyWithType = { body: extractedBody, type } } - // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame. - // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so. - fetchParams.controller.connection.destroy() + // 5. Perform initialize a response given this, init, and bodyWithType. + initializeResponse(this, init, bodyWithType) } - // 20. Return response. - return response - - async function dispatch ({ body }) { - const url = requestCurrentURL(request) - /** @type {import('../..').Agent} */ - const agent = fetchParams.controller.dispatcher - - return new Promise((resolve, reject) => agent.dispatch( - { - path: url.pathname + url.search, - origin: url.origin, - method: request.method, - body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body, - headers: request.headersList.entries, - maxRedirections: 0, - upgrade: request.mode === 'websocket' ? 'websocket' : undefined - }, - { - body: null, - abort: null, - - onConnect (abort) { - // TODO (fix): Do we need connection here? - const { connection } = fetchParams.controller + // Returns response’s type, e.g., "cors". + get type () { + webidl.brandCheck(this, Response) - if (connection.destroyed) { - abort(new DOMException('The operation was aborted.', 'AbortError')) - } else { - fetchParams.controller.on('terminated', abort) - this.abort = connection.abort = abort - } - }, + // The type getter steps are to return this’s response’s type. + return this[kState].type + } - onHeaders (status, headersList, resume, statusText) { - if (status < 200) { - return - } + // Returns response’s URL, if it has one; otherwise the empty string. + get url () { + webidl.brandCheck(this, Response) - let codings = [] - let location = '' + const urlList = this[kState].urlList - const headers = new Headers() + // The url getter steps are to return the empty string if this’s + // response’s URL is null; otherwise this’s response’s URL, + // serialized with exclude fragment set to true. + const url = urlList[urlList.length - 1] ?? null - // For H2, the headers are a plain JS object - // We distinguish between them and iterate accordingly - if (Array.isArray(headersList)) { - for (let n = 0; n < headersList.length; n += 2) { - const key = headersList[n + 0].toString('latin1') - const val = headersList[n + 1].toString('latin1') - if (key.toLowerCase() === 'content-encoding') { - // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 - // "All content-coding values are case-insensitive..." - codings = val.toLowerCase().split(',').map((x) => x.trim()) - } else if (key.toLowerCase() === 'location') { - location = val - } + if (url === null) { + return '' + } - headers.append(key, val) - } - } else { - const keys = Object.keys(headersList) - for (const key of keys) { - const val = headersList[key] - if (key.toLowerCase() === 'content-encoding') { - // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 - // "All content-coding values are case-insensitive..." - codings = val.toLowerCase().split(',').map((x) => x.trim()).reverse() - } else if (key.toLowerCase() === 'location') { - location = val - } + return URLSerializer(url, true) + } - headers.append(key, val) - } - } + // Returns whether response was obtained through a redirect. + get redirected () { + webidl.brandCheck(this, Response) - this.body = new Readable({ read: resume }) + // The redirected getter steps are to return true if this’s response’s URL + // list has more than one item; otherwise false. + return this[kState].urlList.length > 1 + } - const decoders = [] + // Returns response’s status. + get status () { + webidl.brandCheck(this, Response) - const willFollow = request.redirect === 'follow' && - location && - redirectStatus.includes(status) + // The status getter steps are to return this’s response’s status. + return this[kState].status + } - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding - if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) { - for (const coding of codings) { - // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 - if (coding === 'x-gzip' || coding === 'gzip') { - decoders.push(zlib.createGunzip({ - // Be less strict when decoding compressed responses, since sometimes - // servers send slightly invalid responses that are still accepted - // by common browsers. - // Always using Z_SYNC_FLUSH is what cURL does. - flush: zlib.constants.Z_SYNC_FLUSH, - finishFlush: zlib.constants.Z_SYNC_FLUSH - })) - } else if (coding === 'deflate') { - decoders.push(zlib.createInflate()) - } else if (coding === 'br') { - decoders.push(zlib.createBrotliDecompress()) - } else { - decoders.length = 0 - break - } - } - } + // Returns whether response’s status is an ok status. + get ok () { + webidl.brandCheck(this, Response) - resolve({ - status, - statusText, - headersList: headers[kHeadersList], - body: decoders.length - ? pipeline(this.body, ...decoders, () => { }) - : this.body.on('error', () => {}) - }) + // The ok getter steps are to return true if this’s response’s status is an + // ok status; otherwise false. + return this[kState].status >= 200 && this[kState].status <= 299 + } - return true - }, + // Returns response’s status message. + get statusText () { + webidl.brandCheck(this, Response) - onData (chunk) { - if (fetchParams.controller.dump) { - return - } + // The statusText getter steps are to return this’s response’s status + // message. + return this[kState].statusText + } - // 1. If one or more bytes have been transmitted from response’s - // message body, then: + // Returns response’s headers as Headers. + get headers () { + webidl.brandCheck(this, Response) - // 1. Let bytes be the transmitted bytes. - const bytes = chunk + // The headers getter steps are to return this’s headers. + return this[kHeaders] + } - // 2. Let codings be the result of extracting header list values - // given `Content-Encoding` and response’s header list. - // See pullAlgorithm. + get body () { + webidl.brandCheck(this, Response) - // 3. Increase timingInfo’s encoded body size by bytes’s length. - timingInfo.encodedBodySize += bytes.byteLength + return this[kState].body ? this[kState].body.stream : null + } - // 4. See pullAlgorithm... + get bodyUsed () { + webidl.brandCheck(this, Response) - return this.body.push(bytes) - }, + return !!this[kState].body && util.isDisturbed(this[kState].body.stream) + } - onComplete () { - if (this.abort) { - fetchParams.controller.off('terminated', this.abort) - } + // Returns a clone of response. + clone () { + webidl.brandCheck(this, Response) - fetchParams.controller.ended = true + // 1. If this is unusable, then throw a TypeError. + if (this.bodyUsed || (this.body && this.body.locked)) { + throw webidl.errors.exception({ + header: 'Response.clone', + message: 'Body has already been consumed.' + }) + } - this.body.push(null) - }, + // 2. Let clonedResponse be the result of cloning this’s response. + const clonedResponse = cloneResponse(this[kState]) - onError (error) { - if (this.abort) { - fetchParams.controller.off('terminated', this.abort) - } + // 3. Return the result of creating a Response object, given + // clonedResponse, this’s headers’s guard, and this’s relevant Realm. + const clonedResponseObject = new Response() + clonedResponseObject[kState] = clonedResponse + clonedResponseObject[kRealm] = this[kRealm] + clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList + clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard] + clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm] - this.body?.destroy(error) + return clonedResponseObject + } +} - fetchParams.controller.terminate(error) +mixinBody(Response) - reject(error) - }, +Object.defineProperties(Response.prototype, { + type: kEnumerableProperty, + url: kEnumerableProperty, + status: kEnumerableProperty, + ok: kEnumerableProperty, + redirected: kEnumerableProperty, + statusText: kEnumerableProperty, + headers: kEnumerableProperty, + clone: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'Response', + configurable: true + } +}) - onUpgrade (status, headersList, socket) { - if (status !== 101) { - return - } +Object.defineProperties(Response, { + json: kEnumerableProperty, + redirect: kEnumerableProperty, + error: kEnumerableProperty +}) - const headers = new Headers() +// https://fetch.spec.whatwg.org/#concept-response-clone +function cloneResponse (response) { + // To clone a response response, run these steps: - for (let n = 0; n < headersList.length; n += 2) { - const key = headersList[n + 0].toString('latin1') - const val = headersList[n + 1].toString('latin1') + // 1. If response is a filtered response, then return a new identical + // filtered response whose internal response is a clone of response’s + // internal response. + if (response.internalResponse) { + return filterResponse( + cloneResponse(response.internalResponse), + response.type + ) + } - headers.append(key, val) - } + // 2. Let newResponse be a copy of response, except for its body. + const newResponse = makeResponse({ ...response, body: null }) - resolve({ - status, - statusText: STATUS_CODES[status], - headersList: headers[kHeadersList], - socket - }) + // 3. If response’s body is non-null, then set newResponse’s body to the + // result of cloning response’s body. + if (response.body != null) { + newResponse.body = cloneBody(response.body) + } - return true - } - } - )) + // 4. Return newResponse. + return newResponse +} + +function makeResponse (init) { + return { + aborted: false, + rangeRequested: false, + timingAllowPassed: false, + requestIncludesCredentials: false, + type: 'default', + status: 200, + timingInfo: null, + cacheState: '', + statusText: '', + ...init, + headersList: init.headersList + ? new HeadersList(init.headersList) + : new HeadersList(), + urlList: init.urlList ? [...init.urlList] : [] } } -module.exports = { - fetch, - Fetch, - fetching, - finalizeAndReportTiming +function makeNetworkError (reason) { + const isError = isErrorLike(reason) + return makeResponse({ + type: 'error', + status: 0, + error: isError + ? reason + : new Error(reason ? String(reason) : reason), + aborted: reason && reason.name === 'AbortError' + }) } +function makeFilteredResponse (response, state) { + state = { + internalResponse: response, + ...state + } -/***/ }), + return new Proxy(response, { + get (target, p) { + return p in state ? state[p] : target[p] + }, + set (target, p, value) { + assert(!(p in state)) + target[p] = value + return true + } + }) +} -/***/ 48359: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +// https://fetch.spec.whatwg.org/#concept-filtered-response +function filterResponse (response, type) { + // Set response to the following filtered response with response as its + // internal response, depending on request’s response tainting: + if (type === 'basic') { + // A basic filtered response is a filtered response whose type is "basic" + // and header list excludes any headers in internal response’s header list + // whose name is a forbidden response-header name. -"use strict"; -/* globals AbortController */ + // Note: undici does not implement forbidden response-header names + return makeFilteredResponse(response, { + type: 'basic', + headersList: response.headersList + }) + } else if (type === 'cors') { + // A CORS filtered response is a filtered response whose type is "cors" + // and header list excludes any headers in internal response’s header + // list whose name is not a CORS-safelisted response-header name, given + // internal response’s CORS-exposed header-name list. + // Note: undici does not implement CORS-safelisted response-header names + return makeFilteredResponse(response, { + type: 'cors', + headersList: response.headersList + }) + } else if (type === 'opaque') { + // An opaque filtered response is a filtered response whose type is + // "opaque", URL list is the empty list, status is 0, status message + // is the empty byte sequence, header list is empty, and body is null. + return makeFilteredResponse(response, { + type: 'opaque', + urlList: Object.freeze([]), + status: 0, + statusText: '', + body: null + }) + } else if (type === 'opaqueredirect') { + // An opaque-redirect filtered response is a filtered response whose type + // is "opaqueredirect", status is 0, status message is the empty byte + // sequence, header list is empty, and body is null. -const { extractBody, mixinBody, cloneBody } = __nccwpck_require__(41472) -const { Headers, fill: fillHeaders, HeadersList } = __nccwpck_require__(10554) -const { FinalizationRegistry } = __nccwpck_require__(56436)() -const util = __nccwpck_require__(83983) -const { - isValidHTTPToken, - sameOrigin, - normalizeMethod, - makePolicyContainer -} = __nccwpck_require__(52538) -const { - forbiddenMethods, - corsSafeListedMethods, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - requestDuplex -} = __nccwpck_require__(41037) -const { kEnumerableProperty } = util -const { kHeaders, kSignal, kState, kGuard, kRealm } = __nccwpck_require__(15861) -const { webidl } = __nccwpck_require__(21744) -const { getGlobalOrigin } = __nccwpck_require__(71246) -const { URLSerializer } = __nccwpck_require__(685) -const { kHeadersList } = __nccwpck_require__(72785) -const assert = __nccwpck_require__(39491) -const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(82361) + return makeFilteredResponse(response, { + type: 'opaqueredirect', + status: 0, + statusText: '', + headersList: [], + body: null + }) + } else { + assert(false) + } +} -let TransformStream = globalThis.TransformStream +// https://fetch.spec.whatwg.org/#appropriate-network-error +function makeAppropriateNetworkError (fetchParams, err = null) { + // 1. Assert: fetchParams is canceled. + assert(isCancelled(fetchParams)) -const kInit = Symbol('init') -const kAbortController = Symbol('abortController') + // 2. Return an aborted network error if fetchParams is aborted; + // otherwise return a network error. + return isAborted(fetchParams) + ? makeNetworkError(Object.assign(new DOMException('The operation was aborted.', 'AbortError'), { cause: err })) + : makeNetworkError(Object.assign(new DOMException('Request was cancelled.'), { cause: err })) +} -const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { - signal.removeEventListener('abort', abort) -}) +// https://whatpr.org/fetch/1392.html#initialize-a-response +function initializeResponse (response, init, body) { + // 1. If init["status"] is not in the range 200 to 599, inclusive, then + // throw a RangeError. + if (init.status !== null && (init.status < 200 || init.status > 599)) { + throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.') + } -// https://fetch.spec.whatwg.org/#request-class -class Request { - // https://fetch.spec.whatwg.org/#dom-request - constructor (input, init = {}) { - if (input === kInit) { - return + // 2. If init["statusText"] does not match the reason-phrase token production, + // then throw a TypeError. + if ('statusText' in init && init.statusText != null) { + // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2: + // reason-phrase = *( HTAB / SP / VCHAR / obs-text ) + if (!isValidReasonPhrase(String(init.statusText))) { + throw new TypeError('Invalid statusText') } + } - webidl.argumentLengthCheck(arguments, 1, { header: 'Request constructor' }) + // 3. Set response’s response’s status to init["status"]. + if ('status' in init && init.status != null) { + response[kState].status = init.status + } - input = webidl.converters.RequestInfo(input) - init = webidl.converters.RequestInit(init) + // 4. Set response’s response’s status message to init["statusText"]. + if ('statusText' in init && init.statusText != null) { + response[kState].statusText = init.statusText + } - // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object - this[kRealm] = { - settingsObject: { - baseUrl: getGlobalOrigin(), - get origin () { - return this.baseUrl?.origin - }, - policyContainer: makePolicyContainer() - } + // 5. If init["headers"] exists, then fill response’s headers with init["headers"]. + if ('headers' in init && init.headers != null) { + fill(response[kHeaders], init.headers) + } + + // 6. If body was given, then: + if (body) { + // 1. If response's status is a null body status, then throw a TypeError. + if (nullBodyStatus.includes(response.status)) { + throw webidl.errors.exception({ + header: 'Response constructor', + message: 'Invalid response status code ' + response.status + }) } - // 1. Let request be null. - let request = null + // 2. Set response's body to body's body. + response[kState].body = body.body - // 2. Let fallbackMode be null. - let fallbackMode = null + // 3. If body's type is non-null and response's header list does not contain + // `Content-Type`, then append (`Content-Type`, body's type) to response's header list. + if (body.type != null && !response[kState].headersList.contains('Content-Type')) { + response[kState].headersList.append('content-type', body.type) + } + } +} - // 3. Let baseURL be this’s relevant settings object’s API base URL. - const baseUrl = this[kRealm].settingsObject.baseUrl +webidl.converters.ReadableStream = webidl.interfaceConverter( + ReadableStream +) - // 4. Let signal be null. - let signal = null +webidl.converters.FormData = webidl.interfaceConverter( + FormData +) - // 5. If input is a string, then: - if (typeof input === 'string') { - // 1. Let parsedURL be the result of parsing input with baseURL. - // 2. If parsedURL is failure, then throw a TypeError. - let parsedURL - try { - parsedURL = new URL(input, baseUrl) - } catch (err) { - throw new TypeError('Failed to parse URL from ' + input, { cause: err }) - } +webidl.converters.URLSearchParams = webidl.interfaceConverter( + URLSearchParams +) + +// https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit +webidl.converters.XMLHttpRequestBodyInit = function (V) { + if (typeof V === 'string') { + return webidl.converters.USVString(V) + } + + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }) + } + + if ( + types.isAnyArrayBuffer(V) || + types.isTypedArray(V) || + types.isDataView(V) + ) { + return webidl.converters.BufferSource(V) + } + + if (util.isFormDataLike(V)) { + return webidl.converters.FormData(V, { strict: false }) + } + + if (V instanceof URLSearchParams) { + return webidl.converters.URLSearchParams(V) + } + + return webidl.converters.DOMString(V) +} + +// https://fetch.spec.whatwg.org/#bodyinit +webidl.converters.BodyInit = function (V) { + if (V instanceof ReadableStream) { + return webidl.converters.ReadableStream(V) + } - // 3. If parsedURL includes credentials, then throw a TypeError. - if (parsedURL.username || parsedURL.password) { - throw new TypeError( - 'Request cannot be constructed from a URL that includes credentials: ' + - input - ) - } + // Note: the spec doesn't include async iterables, + // this is an undici extension. + if (V?.[Symbol.asyncIterator]) { + return V + } - // 4. Set request to a new request whose URL is parsedURL. - request = makeRequest({ urlList: [parsedURL] }) + return webidl.converters.XMLHttpRequestBodyInit(V) +} - // 5. Set fallbackMode to "cors". - fallbackMode = 'cors' - } else { - // 6. Otherwise: +webidl.converters.ResponseInit = webidl.dictionaryConverter([ + { + key: 'status', + converter: webidl.converters['unsigned short'], + defaultValue: 200 + }, + { + key: 'statusText', + converter: webidl.converters.ByteString, + defaultValue: '' + }, + { + key: 'headers', + converter: webidl.converters.HeadersInit + } +]) - // 7. Assert: input is a Request object. - assert(input instanceof Request) +module.exports = { + makeNetworkError, + makeResponse, + makeAppropriateNetworkError, + filterResponse, + Response, + cloneResponse +} - // 8. Set request to input’s request. - request = input[kState] - // 9. Set signal to input’s signal. - signal = input[kSignal] - } +/***/ }), - // 7. Let origin be this’s relevant settings object’s origin. - const origin = this[kRealm].settingsObject.origin +/***/ 15861: +/***/ ((module) => { - // 8. Let window be "client". - let window = 'client' +"use strict"; - // 9. If request’s window is an environment settings object and its origin - // is same origin with origin, then set window to request’s window. - if ( - request.window?.constructor?.name === 'EnvironmentSettingsObject' && - sameOrigin(request.window, origin) - ) { - window = request.window - } - // 10. If init["window"] exists and is non-null, then throw a TypeError. - if (init.window != null) { - throw new TypeError(`'window' option '${window}' must be null`) - } +module.exports = { + kUrl: Symbol('url'), + kHeaders: Symbol('headers'), + kSignal: Symbol('signal'), + kState: Symbol('state'), + kGuard: Symbol('guard'), + kRealm: Symbol('realm') +} - // 11. If init["window"] exists, then set window to "no-window". - if ('window' in init) { - window = 'no-window' - } - // 12. Set request to a new request with the following properties: - request = makeRequest({ - // URL request’s URL. - // undici implementation note: this is set as the first item in request's urlList in makeRequest - // method request’s method. - method: request.method, - // header list A copy of request’s header list. - // undici implementation note: headersList is cloned in makeRequest - headersList: request.headersList, - // unsafe-request flag Set. - unsafeRequest: request.unsafeRequest, - // client This’s relevant settings object. - client: this[kRealm].settingsObject, - // window window. - window, - // priority request’s priority. - priority: request.priority, - // origin request’s origin. The propagation of the origin is only significant for navigation requests - // being handled by a service worker. In this scenario a request can have an origin that is different - // from the current client. - origin: request.origin, - // referrer request’s referrer. - referrer: request.referrer, - // referrer policy request’s referrer policy. - referrerPolicy: request.referrerPolicy, - // mode request’s mode. - mode: request.mode, - // credentials mode request’s credentials mode. - credentials: request.credentials, - // cache mode request’s cache mode. - cache: request.cache, - // redirect mode request’s redirect mode. - redirect: request.redirect, - // integrity metadata request’s integrity metadata. - integrity: request.integrity, - // keepalive request’s keepalive. - keepalive: request.keepalive, - // reload-navigation flag request’s reload-navigation flag. - reloadNavigation: request.reloadNavigation, - // history-navigation flag request’s history-navigation flag. - historyNavigation: request.historyNavigation, - // URL list A clone of request’s URL list. - urlList: [...request.urlList] - }) +/***/ }), - // 13. If init is not empty, then: - if (Object.keys(init).length > 0) { - // 1. If request’s mode is "navigate", then set it to "same-origin". - if (request.mode === 'navigate') { - request.mode = 'same-origin' - } +/***/ 52538: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 2. Unset request’s reload-navigation flag. - request.reloadNavigation = false +"use strict"; - // 3. Unset request’s history-navigation flag. - request.historyNavigation = false - // 4. Set request’s origin to "client". - request.origin = 'client' +const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = __nccwpck_require__(41037) +const { getGlobalOrigin } = __nccwpck_require__(71246) +const { performance } = __nccwpck_require__(4074) +const { isBlobLike, toUSVString, ReadableStreamFrom } = __nccwpck_require__(83983) +const assert = __nccwpck_require__(39491) +const { isUint8Array } = __nccwpck_require__(29830) - // 5. Set request’s referrer to "client" - request.referrer = 'client' +// https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable +/** @type {import('crypto')|undefined} */ +let crypto - // 6. Set request’s referrer policy to the empty string. - request.referrerPolicy = '' +try { + crypto = __nccwpck_require__(6113) +} catch { - // 7. Set request’s URL to request’s current URL. - request.url = request.urlList[request.urlList.length - 1] +} - // 8. Set request’s URL list to « request’s URL ». - request.urlList = [request.url] - } +function responseURL (response) { + // https://fetch.spec.whatwg.org/#responses + // A response has an associated URL. It is a pointer to the last URL + // in response’s URL list and null if response’s URL list is empty. + const urlList = response.urlList + const length = urlList.length + return length === 0 ? null : urlList[length - 1].toString() +} - // 14. If init["referrer"] exists, then: - if (init.referrer !== undefined) { - // 1. Let referrer be init["referrer"]. - const referrer = init.referrer +// https://fetch.spec.whatwg.org/#concept-response-location-url +function responseLocationURL (response, requestFragment) { + // 1. If response’s status is not a redirect status, then return null. + if (!redirectStatusSet.has(response.status)) { + return null + } - // 2. If referrer is the empty string, then set request’s referrer to "no-referrer". - if (referrer === '') { - request.referrer = 'no-referrer' - } else { - // 1. Let parsedReferrer be the result of parsing referrer with - // baseURL. - // 2. If parsedReferrer is failure, then throw a TypeError. - let parsedReferrer - try { - parsedReferrer = new URL(referrer, baseUrl) - } catch (err) { - throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }) - } + // 2. Let location be the result of extracting header list values given + // `Location` and response’s header list. + let location = response.headersList.get('location') - // 3. If one of the following is true - // - parsedReferrer’s scheme is "about" and path is the string "client" - // - parsedReferrer’s origin is not same origin with origin - // then set request’s referrer to "client". - if ( - (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') || - (origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) - ) { - request.referrer = 'client' - } else { - // 4. Otherwise, set request’s referrer to parsedReferrer. - request.referrer = parsedReferrer - } - } - } + // 3. If location is a header value, then set location to the result of + // parsing location with response’s URL. + if (location !== null && isValidHeaderValue(location)) { + location = new URL(location, responseURL(response)) + } - // 15. If init["referrerPolicy"] exists, then set request’s referrer policy - // to it. - if (init.referrerPolicy !== undefined) { - request.referrerPolicy = init.referrerPolicy - } + // 4. If location is a URL whose fragment is null, then set location’s + // fragment to requestFragment. + if (location && !location.hash) { + location.hash = requestFragment + } - // 16. Let mode be init["mode"] if it exists, and fallbackMode otherwise. - let mode - if (init.mode !== undefined) { - mode = init.mode - } else { - mode = fallbackMode - } + // 5. Return location. + return location +} - // 17. If mode is "navigate", then throw a TypeError. - if (mode === 'navigate') { - throw webidl.errors.exception({ - header: 'Request constructor', - message: 'invalid request mode navigate.' - }) - } +/** @returns {URL} */ +function requestCurrentURL (request) { + return request.urlList[request.urlList.length - 1] +} - // 18. If mode is non-null, set request’s mode to mode. - if (mode != null) { - request.mode = mode - } +function requestBadPort (request) { + // 1. Let url be request’s current URL. + const url = requestCurrentURL(request) - // 19. If init["credentials"] exists, then set request’s credentials mode - // to it. - if (init.credentials !== undefined) { - request.credentials = init.credentials - } + // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port, + // then return blocked. + if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { + return 'blocked' + } - // 18. If init["cache"] exists, then set request’s cache mode to it. - if (init.cache !== undefined) { - request.cache = init.cache - } + // 3. Return allowed. + return 'allowed' +} - // 21. If request’s cache mode is "only-if-cached" and request’s mode is - // not "same-origin", then throw a TypeError. - if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { - throw new TypeError( - "'only-if-cached' can be set only with 'same-origin' mode" +function isErrorLike (object) { + return object instanceof Error || ( + object?.constructor?.name === 'Error' || + object?.constructor?.name === 'DOMException' + ) +} + +// Check whether |statusText| is a ByteString and +// matches the Reason-Phrase token production. +// RFC 2616: https://tools.ietf.org/html/rfc2616 +// RFC 7230: https://tools.ietf.org/html/rfc7230 +// "reason-phrase = *( HTAB / SP / VCHAR / obs-text )" +// https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116 +function isValidReasonPhrase (statusText) { + for (let i = 0; i < statusText.length; ++i) { + const c = statusText.charCodeAt(i) + if ( + !( + ( + c === 0x09 || // HTAB + (c >= 0x20 && c <= 0x7e) || // SP / VCHAR + (c >= 0x80 && c <= 0xff) + ) // obs-text ) + ) { + return false } + } + return true +} - // 22. If init["redirect"] exists, then set request’s redirect mode to it. - if (init.redirect !== undefined) { - request.redirect = init.redirect - } +function isTokenChar (c) { + return !( + c >= 0x7f || + c <= 0x20 || + c === '(' || + c === ')' || + c === '<' || + c === '>' || + c === '@' || + c === ',' || + c === ';' || + c === ':' || + c === '\\' || + c === '"' || + c === '/' || + c === '[' || + c === ']' || + c === '?' || + c === '=' || + c === '{' || + c === '}' + ) +} - // 23. If init["integrity"] exists, then set request’s integrity metadata to it. - if (init.integrity !== undefined && init.integrity != null) { - request.integrity = String(init.integrity) +// See RFC 7230, Section 3.2.6. +// https://github.com/chromium/chromium/blob/d7da0240cae77824d1eda25745c4022757499131/third_party/blink/renderer/platform/network/http_parsers.cc#L321 +function isValidHTTPToken (characters) { + if (!characters || typeof characters !== 'string') { + return false + } + for (let i = 0; i < characters.length; ++i) { + const c = characters.charCodeAt(i) + if (c > 0x7f || !isTokenChar(c)) { + return false } + } + return true +} - // 24. If init["keepalive"] exists, then set request’s keepalive to it. - if (init.keepalive !== undefined) { - request.keepalive = Boolean(init.keepalive) - } +// https://fetch.spec.whatwg.org/#header-name +// https://github.com/chromium/chromium/blob/b3d37e6f94f87d59e44662d6078f6a12de845d17/net/http/http_util.cc#L342 +function isValidHeaderName (potentialValue) { + if (potentialValue.length === 0) { + return false + } - // 25. If init["method"] exists, then: - if (init.method !== undefined) { - // 1. Let method be init["method"]. - let method = init.method + return isValidHTTPToken(potentialValue) +} - // 2. If method is not a method or method is a forbidden method, then - // throw a TypeError. - if (!isValidHTTPToken(init.method)) { - throw TypeError(`'${init.method}' is not a valid HTTP method.`) - } +/** + * @see https://fetch.spec.whatwg.org/#header-value + * @param {string} potentialValue + */ +function isValidHeaderValue (potentialValue) { + // - Has no leading or trailing HTTP tab or space bytes. + // - Contains no 0x00 (NUL) or HTTP newline bytes. + if ( + potentialValue.startsWith('\t') || + potentialValue.startsWith(' ') || + potentialValue.endsWith('\t') || + potentialValue.endsWith(' ') + ) { + return false + } - if (forbiddenMethods.indexOf(method.toUpperCase()) !== -1) { - throw TypeError(`'${init.method}' HTTP method is unsupported.`) - } + if ( + potentialValue.includes('\0') || + potentialValue.includes('\r') || + potentialValue.includes('\n') + ) { + return false + } - // 3. Normalize method. - method = normalizeMethod(init.method) + return true +} - // 4. Set request’s method to method. - request.method = method - } +// https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect +function setRequestReferrerPolicyOnRedirect (request, actualResponse) { + // Given a request request and a response actualResponse, this algorithm + // updates request’s referrer policy according to the Referrer-Policy + // header (if any) in actualResponse. - // 26. If init["signal"] exists, then set signal to it. - if (init.signal !== undefined) { - signal = init.signal + // 1. Let policy be the result of executing § 8.1 Parse a referrer policy + // from a Referrer-Policy header on actualResponse. + + // 8.1 Parse a referrer policy from a Referrer-Policy header + // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list. + const { headersList } = actualResponse + // 2. Let policy be the empty string. + // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token. + // 4. Return policy. + const policyHeader = (headersList.get('referrer-policy') ?? '').split(',') + + // Note: As the referrer-policy can contain multiple policies + // separated by comma, we need to loop through all of them + // and pick the first valid one. + // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy + let policy = '' + if (policyHeader.length > 0) { + // The right-most policy takes precedence. + // The left-most policy is the fallback. + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim() + if (referrerPolicyTokens.has(token)) { + policy = token + break + } } + } - // 27. Set this’s request to request. - this[kState] = request + // 2. If policy is not the empty string, then set request’s referrer policy to policy. + if (policy !== '') { + request.referrerPolicy = policy + } +} - // 28. Set this’s signal to a new AbortSignal object with this’s relevant - // Realm. - // TODO: could this be simplified with AbortSignal.any - // (https://dom.spec.whatwg.org/#dom-abortsignal-any) - const ac = new AbortController() - this[kSignal] = ac.signal - this[kSignal][kRealm] = this[kRealm] +// https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check +function crossOriginResourcePolicyCheck () { + // TODO + return 'allowed' +} - // 29. If signal is not null, then make this’s signal follow signal. - if (signal != null) { - if ( - !signal || - typeof signal.aborted !== 'boolean' || - typeof signal.addEventListener !== 'function' - ) { - throw new TypeError( - "Failed to construct 'Request': member signal is not of type AbortSignal." - ) - } +// https://fetch.spec.whatwg.org/#concept-cors-check +function corsCheck () { + // TODO + return 'success' +} - if (signal.aborted) { - ac.abort(signal.reason) - } else { - // Keep a strong ref to ac while request object - // is alive. This is needed to prevent AbortController - // from being prematurely garbage collected. - // See, https://github.com/nodejs/undici/issues/1926. - this[kAbortController] = ac +// https://fetch.spec.whatwg.org/#concept-tao-check +function TAOCheck () { + // TODO + return 'success' +} - const acRef = new WeakRef(ac) - const abort = function () { - const ac = acRef.deref() - if (ac !== undefined) { - ac.abort(this.reason) - } - } +function appendFetchMetadata (httpRequest) { + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header + // TODO - // Third-party AbortControllers may not work with these. - // See, https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619. - try { - // If the max amount of listeners is equal to the default, increase it - // This is only available in node >= v19.9.0 - if (typeof getMaxListeners === 'function' && getMaxListeners(signal) === defaultMaxListeners) { - setMaxListeners(100, signal) - } else if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) { - setMaxListeners(100, signal) - } - } catch {} + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header - util.addAbortListener(signal, abort) - requestFinalizer.register(ac, { signal, abort }) - } - } + // 1. Assert: r’s url is a potentially trustworthy URL. + // TODO - // 30. Set this’s headers to a new Headers object with this’s relevant - // Realm, whose header list is request’s header list and guard is - // "request". - this[kHeaders] = new Headers() - this[kHeaders][kHeadersList] = request.headersList - this[kHeaders][kGuard] = 'request' - this[kHeaders][kRealm] = this[kRealm] + // 2. Let header be a Structured Header whose value is a token. + let header = null - // 31. If this’s request’s mode is "no-cors", then: - if (mode === 'no-cors') { - // 1. If this’s request’s method is not a CORS-safelisted method, - // then throw a TypeError. - if (!corsSafeListedMethods.includes(request.method)) { - throw new TypeError( - `'${request.method} is unsupported in no-cors mode.` - ) - } + // 3. Set header’s value to r’s mode. + header = httpRequest.mode - // 2. Set this’s headers’s guard to "request-no-cors". - this[kHeaders][kGuard] = 'request-no-cors' - } + // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list. + httpRequest.headersList.set('sec-fetch-mode', header) - // 32. If init is not empty, then: - if (Object.keys(init).length !== 0) { - // 1. Let headers be a copy of this’s headers and its associated header - // list. - let headers = new Headers(this[kHeaders]) + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header + // TODO - // 2. If init["headers"] exists, then set headers to init["headers"]. - if (init.headers !== undefined) { - headers = init.headers - } + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header + // TODO +} - // 3. Empty this’s headers’s header list. - this[kHeaders][kHeadersList].clear() +// https://fetch.spec.whatwg.org/#append-a-request-origin-header +function appendRequestOriginHeader (request) { + // 1. Let serializedOrigin be the result of byte-serializing a request origin with request. + let serializedOrigin = request.origin - // 4. If headers is a Headers object, then for each header in its header - // list, append header’s name/header’s value to this’s headers. - if (headers.constructor.name === 'Headers') { - for (const [key, val] of headers) { - this[kHeaders].append(key, val) - } - } else { - // 5. Otherwise, fill this’s headers with headers. - fillHeaders(this[kHeaders], headers) - } + // 2. If request’s response tainting is "cors" or request’s mode is "websocket", then append (`Origin`, serializedOrigin) to request’s header list. + if (request.responseTainting === 'cors' || request.mode === 'websocket') { + if (serializedOrigin) { + request.headersList.append('origin', serializedOrigin) } - // 33. Let inputBody be input’s request’s body if input is a Request - // object; otherwise null. - const inputBody = input instanceof Request ? input[kState].body : null + // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then: + } else if (request.method !== 'GET' && request.method !== 'HEAD') { + // 1. Switch on request’s referrer policy: + switch (request.referrerPolicy) { + case 'no-referrer': + // Set serializedOrigin to `null`. + serializedOrigin = null + break + case 'no-referrer-when-downgrade': + case 'strict-origin': + case 'strict-origin-when-cross-origin': + // If request’s origin is a tuple origin, its scheme is "https", and request’s current URL’s scheme is not "https", then set serializedOrigin to `null`. + if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { + serializedOrigin = null + } + break + case 'same-origin': + // If request’s origin is not same origin with request’s current URL’s origin, then set serializedOrigin to `null`. + if (!sameOrigin(request, requestCurrentURL(request))) { + serializedOrigin = null + } + break + default: + // Do nothing. + } - // 34. If either init["body"] exists and is non-null or inputBody is - // non-null, and request’s method is `GET` or `HEAD`, then throw a - // TypeError. - if ( - (init.body != null || inputBody != null) && - (request.method === 'GET' || request.method === 'HEAD') - ) { - throw new TypeError('Request with GET/HEAD method cannot have body.') + if (serializedOrigin) { + // 2. Append (`Origin`, serializedOrigin) to request’s header list. + request.headersList.append('origin', serializedOrigin) } + } +} - // 35. Let initBody be null. - let initBody = null +function coarsenedSharedCurrentTime (crossOriginIsolatedCapability) { + // TODO + return performance.now() +} - // 36. If init["body"] exists and is non-null, then: - if (init.body != null) { - // 1. Let Content-Type be null. - // 2. Set initBody and Content-Type to the result of extracting - // init["body"], with keepalive set to request’s keepalive. - const [extractedBody, contentType] = extractBody( - init.body, - request.keepalive - ) - initBody = extractedBody +// https://fetch.spec.whatwg.org/#create-an-opaque-timing-info +function createOpaqueTimingInfo (timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + } +} - // 3, If Content-Type is non-null and this’s headers’s header list does - // not contain `Content-Type`, then append `Content-Type`/Content-Type to - // this’s headers. - if (contentType && !this[kHeaders][kHeadersList].contains('content-type')) { - this[kHeaders].append('content-type', contentType) - } - } +// https://html.spec.whatwg.org/multipage/origin.html#policy-container +function makePolicyContainer () { + // Note: the fetch spec doesn't make use of embedder policy or CSP list + return { + referrerPolicy: 'strict-origin-when-cross-origin' + } +} - // 37. Let inputOrInitBody be initBody if it is non-null; otherwise - // inputBody. - const inputOrInitBody = initBody ?? inputBody +// https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container +function clonePolicyContainer (policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + } +} - // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is - // null, then: - if (inputOrInitBody != null && inputOrInitBody.source == null) { - // 1. If initBody is non-null and init["duplex"] does not exist, - // then throw a TypeError. - if (initBody != null && init.duplex == null) { - throw new TypeError('RequestInit: duplex option is required when sending a body.') - } +// https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer +function determineRequestsReferrer (request) { + // 1. Let policy be request's referrer policy. + const policy = request.referrerPolicy - // 2. If this’s request’s mode is neither "same-origin" nor "cors", - // then throw a TypeError. - if (request.mode !== 'same-origin' && request.mode !== 'cors') { - throw new TypeError( - 'If request is made from ReadableStream, mode should be "same-origin" or "cors"' - ) - } + // Note: policy cannot (shouldn't) be null or an empty string. + assert(policy) - // 3. Set this’s request’s use-CORS-preflight flag. - request.useCORSPreflightFlag = true - } + // 2. Let environment be request’s client. - // 39. Let finalBody be inputOrInitBody. - let finalBody = inputOrInitBody + let referrerSource = null - // 40. If initBody is null and inputBody is non-null, then: - if (initBody == null && inputBody != null) { - // 1. If input is unusable, then throw a TypeError. - if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) { - throw new TypeError( - 'Cannot construct a Request with a Request object that has already been used.' - ) - } + // 3. Switch on request’s referrer: + if (request.referrer === 'client') { + // Note: node isn't a browser and doesn't implement document/iframes, + // so we bypass this step and replace it with our own. - // 2. Set finalBody to the result of creating a proxy for inputBody. - if (!TransformStream) { - TransformStream = (__nccwpck_require__(35356).TransformStream) - } + const globalOrigin = getGlobalOrigin() - // https://streams.spec.whatwg.org/#readablestream-create-a-proxy - const identityTransform = new TransformStream() - inputBody.stream.pipeThrough(identityTransform) - finalBody = { - source: inputBody.source, - length: inputBody.length, - stream: identityTransform.readable - } + if (!globalOrigin || globalOrigin.origin === 'null') { + return 'no-referrer' } - // 41. Set this’s request’s body to finalBody. - this[kState].body = finalBody + // note: we need to clone it as it's mutated + referrerSource = new URL(globalOrigin) + } else if (request.referrer instanceof URL) { + // Let referrerSource be request’s referrer. + referrerSource = request.referrer } - // Returns request’s HTTP method, which is "GET" by default. - get method () { - webidl.brandCheck(this, Request) + // 4. Let request’s referrerURL be the result of stripping referrerSource for + // use as a referrer. + let referrerURL = stripURLForReferrer(referrerSource) - // The method getter steps are to return this’s request’s method. - return this[kState].method + // 5. Let referrerOrigin be the result of stripping referrerSource for use as + // a referrer, with the origin-only flag set to true. + const referrerOrigin = stripURLForReferrer(referrerSource, true) + + // 6. If the result of serializing referrerURL is a string whose length is + // greater than 4096, set referrerURL to referrerOrigin. + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin } - // Returns the URL of request as a string. - get url () { - webidl.brandCheck(this, Request) + const areSameOrigin = sameOrigin(request, referrerURL) + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && + !isURLPotentiallyTrustworthy(request.url) - // The url getter steps are to return this’s request’s URL, serialized. - return URLSerializer(this[kState].url) - } + // 8. Execute the switch statements corresponding to the value of policy: + switch (policy) { + case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true) + case 'unsafe-url': return referrerURL + case 'same-origin': + return areSameOrigin ? referrerOrigin : 'no-referrer' + case 'origin-when-cross-origin': + return areSameOrigin ? referrerURL : referrerOrigin + case 'strict-origin-when-cross-origin': { + const currentURL = requestCurrentURL(request) - // Returns a Headers object consisting of the headers associated with request. - // Note that headers added in the network layer by the user agent will not - // be accounted for in this object, e.g., the "Host" header. - get headers () { - webidl.brandCheck(this, Request) + // 1. If the origin of referrerURL and the origin of request’s current + // URL are the same, then return referrerURL. + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL + } - // The headers getter steps are to return this’s headers. - return this[kHeaders] - } + // 2. If referrerURL is a potentially trustworthy URL and request’s + // current URL is not a potentially trustworthy URL, then return no + // referrer. + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return 'no-referrer' + } - // Returns the kind of resource requested by request, e.g., "document" - // or "script". - get destination () { - webidl.brandCheck(this, Request) + // 3. Return referrerOrigin. + return referrerOrigin + } + case 'strict-origin': // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + case 'no-referrer-when-downgrade': // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ - // The destination getter are to return this’s request’s destination. - return this[kState].destination + default: // eslint-disable-line + return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin } +} - // Returns the referrer of request. Its value can be a same-origin URL if - // explicitly set in init, the empty string to indicate no referrer, and - // "about:client" when defaulting to the global’s default. This is used - // during fetching to determine the value of the `Referer` header of the - // request being made. - get referrer () { - webidl.brandCheck(this, Request) +/** + * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url + * @param {URL} url + * @param {boolean|undefined} originOnly + */ +function stripURLForReferrer (url, originOnly) { + // 1. Assert: url is a URL. + assert(url instanceof URL) - // 1. If this’s request’s referrer is "no-referrer", then return the - // empty string. - if (this[kState].referrer === 'no-referrer') { - return '' - } + // 2. If url’s scheme is a local scheme, then return no referrer. + if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') { + return 'no-referrer' + } - // 2. If this’s request’s referrer is "client", then return - // "about:client". - if (this[kState].referrer === 'client') { - return 'about:client' - } + // 3. Set url’s username to the empty string. + url.username = '' - // Return this’s request’s referrer, serialized. - return this[kState].referrer.toString() - } + // 4. Set url’s password to the empty string. + url.password = '' - // Returns the referrer policy associated with request. - // This is used during fetching to compute the value of the request’s - // referrer. - get referrerPolicy () { - webidl.brandCheck(this, Request) + // 5. Set url’s fragment to null. + url.hash = '' - // The referrerPolicy getter steps are to return this’s request’s referrer policy. - return this[kState].referrerPolicy + // 6. If the origin-only flag is true, then: + if (originOnly) { + // 1. Set url’s path to « the empty string ». + url.pathname = '' + + // 2. Set url’s query to null. + url.search = '' } - // Returns the mode associated with request, which is a string indicating - // whether the request will use CORS, or will be restricted to same-origin - // URLs. - get mode () { - webidl.brandCheck(this, Request) + // 7. Return url. + return url +} - // The mode getter steps are to return this’s request’s mode. - return this[kState].mode +function isURLPotentiallyTrustworthy (url) { + if (!(url instanceof URL)) { + return false } - // Returns the credentials mode associated with request, - // which is a string indicating whether credentials will be sent with the - // request always, never, or only when sent to a same-origin URL. - get credentials () { - // The credentials getter steps are to return this’s request’s credentials mode. - return this[kState].credentials + // If child of about, return true + if (url.href === 'about:blank' || url.href === 'about:srcdoc') { + return true } - // Returns the cache mode associated with request, - // which is a string indicating how the request will - // interact with the browser’s cache when fetching. - get cache () { - webidl.brandCheck(this, Request) + // If scheme is data, return true + if (url.protocol === 'data:') return true - // The cache getter steps are to return this’s request’s cache mode. - return this[kState].cache - } + // If file, return true + if (url.protocol === 'file:') return true - // Returns the redirect mode associated with request, - // which is a string indicating how redirects for the - // request will be handled during fetching. A request - // will follow redirects by default. - get redirect () { - webidl.brandCheck(this, Request) + return isOriginPotentiallyTrustworthy(url.origin) - // The redirect getter steps are to return this’s request’s redirect mode. - return this[kState].redirect - } + function isOriginPotentiallyTrustworthy (origin) { + // If origin is explicitly null, return false + if (origin == null || origin === 'null') return false - // Returns request’s subresource integrity metadata, which is a - // cryptographic hash of the resource being fetched. Its value - // consists of multiple hashes separated by whitespace. [SRI] - get integrity () { - webidl.brandCheck(this, Request) + const originAsURL = new URL(origin) - // The integrity getter steps are to return this’s request’s integrity - // metadata. - return this[kState].integrity - } + // If secure, return true + if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') { + return true + } - // Returns a boolean indicating whether or not request can outlive the - // global in which it was created. - get keepalive () { - webidl.brandCheck(this, Request) + // If localhost or variants, return true + if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || + (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) || + (originAsURL.hostname.endsWith('.localhost'))) { + return true + } - // The keepalive getter steps are to return this’s request’s keepalive. - return this[kState].keepalive + // If any other, return false + return false } +} - // Returns a boolean indicating whether or not request is for a reload - // navigation. - get isReloadNavigation () { - webidl.brandCheck(this, Request) - - // The isReloadNavigation getter steps are to return true if this’s - // request’s reload-navigation flag is set; otherwise false. - return this[kState].reloadNavigation +/** + * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist + * @param {Uint8Array} bytes + * @param {string} metadataList + */ +function bytesMatch (bytes, metadataList) { + // If node is not built with OpenSSL support, we cannot check + // a request's integrity, so allow it by default (the spec will + // allow requests if an invalid hash is given, as precedence). + /* istanbul ignore if: only if node is built with --without-ssl */ + if (crypto === undefined) { + return true } - // Returns a boolean indicating whether or not request is for a history - // navigation (a.k.a. back-foward navigation). - get isHistoryNavigation () { - webidl.brandCheck(this, Request) + // 1. Let parsedMetadata be the result of parsing metadataList. + const parsedMetadata = parseMetadata(metadataList) - // The isHistoryNavigation getter steps are to return true if this’s request’s - // history-navigation flag is set; otherwise false. - return this[kState].historyNavigation + // 2. If parsedMetadata is no metadata, return true. + if (parsedMetadata === 'no metadata') { + return true } - // Returns the signal associated with request, which is an AbortSignal - // object indicating whether or not request has been aborted, and its - // abort event handler. - get signal () { - webidl.brandCheck(this, Request) - - // The signal getter steps are to return this’s signal. - return this[kSignal] + // 3. If parsedMetadata is the empty set, return true. + if (parsedMetadata.length === 0) { + return true } - get body () { - webidl.brandCheck(this, Request) + // 4. Let metadata be the result of getting the strongest + // metadata from parsedMetadata. + const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)) + // get the strongest algorithm + const strongest = list[0].algo + // get all entries that use the strongest algorithm; ignore weaker + const metadata = list.filter((item) => item.algo === strongest) - return this[kState].body ? this[kState].body.stream : null - } + // 5. For each item in metadata: + for (const item of metadata) { + // 1. Let algorithm be the alg component of item. + const algorithm = item.algo - get bodyUsed () { - webidl.brandCheck(this, Request) + // 2. Let expectedValue be the val component of item. + let expectedValue = item.hash - return !!this[kState].body && util.isDisturbed(this[kState].body.stream) - } + // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e + // "be liberal with padding". This is annoying, and it's not even in the spec. - get duplex () { - webidl.brandCheck(this, Request) + if (expectedValue.endsWith('==')) { + expectedValue = expectedValue.slice(0, -2) + } - return 'half' - } + // 3. Let actualValue be the result of applying algorithm to bytes. + let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64') - // Returns a clone of request. - clone () { - webidl.brandCheck(this, Request) + if (actualValue.endsWith('==')) { + actualValue = actualValue.slice(0, -2) + } - // 1. If this is unusable, then throw a TypeError. - if (this.bodyUsed || this.body?.locked) { - throw new TypeError('unusable') + // 4. If actualValue is a case-sensitive match for expectedValue, + // return true. + if (actualValue === expectedValue) { + return true } - // 2. Let clonedRequest be the result of cloning this’s request. - const clonedRequest = cloneRequest(this[kState]) - - // 3. Let clonedRequestObject be the result of creating a Request object, - // given clonedRequest, this’s headers’s guard, and this’s relevant Realm. - const clonedRequestObject = new Request(kInit) - clonedRequestObject[kState] = clonedRequest - clonedRequestObject[kRealm] = this[kRealm] - clonedRequestObject[kHeaders] = new Headers() - clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList - clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard] - clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm] + let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest('base64url') - // 4. Make clonedRequestObject’s signal follow this’s signal. - const ac = new AbortController() - if (this.signal.aborted) { - ac.abort(this.signal.reason) - } else { - util.addAbortListener( - this.signal, - () => { - ac.abort(this.signal.reason) - } - ) + if (actualBase64URL.endsWith('==')) { + actualBase64URL = actualBase64URL.slice(0, -2) } - clonedRequestObject[kSignal] = ac.signal - // 4. Return clonedRequestObject. - return clonedRequestObject + if (actualBase64URL === expectedValue) { + return true + } } + + // 6. Return false. + return false } -mixinBody(Request) +// https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options +// https://www.w3.org/TR/CSP2/#source-list-syntax +// https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 +const parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\x21-\x7e]?)?/i -function makeRequest (init) { - // https://fetch.spec.whatwg.org/#requests - const request = { - method: 'GET', - localURLsOnly: false, - unsafeRequest: false, - body: null, - client: null, - reservedClient: null, - replacesClientId: '', - window: 'client', - keepalive: false, - serviceWorkers: 'all', - initiator: '', - destination: '', - priority: null, - origin: 'client', - policyContainer: 'client', - referrer: 'client', - referrerPolicy: '', - mode: 'no-cors', - useCORSPreflightFlag: false, - credentials: 'same-origin', - useCredentials: false, - cache: 'default', - redirect: 'follow', - integrity: '', - cryptoGraphicsNonceMetadata: '', - parserMetadata: '', - reloadNavigation: false, - historyNavigation: false, - userActivation: false, - taintedOrigin: false, - redirectCount: 0, - responseTainting: 'basic', - preventNoCacheCacheControlHeaderModification: false, - done: false, - timingAllowFailed: false, - ...init, - headersList: init.headersList - ? new HeadersList(init.headersList) - : new HeadersList() - } - request.url = request.urlList[0] - return request -} +/** + * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata + * @param {string} metadata + */ +function parseMetadata (metadata) { + // 1. Let result be the empty set. + /** @type {{ algo: string, hash: string }[]} */ + const result = [] -// https://fetch.spec.whatwg.org/#concept-request-clone -function cloneRequest (request) { - // To clone a request request, run these steps: + // 2. Let empty be equal to true. + let empty = true - // 1. Let newRequest be a copy of request, except for its body. - const newRequest = makeRequest({ ...request, body: null }) + const supportedHashes = crypto.getHashes() - // 2. If request’s body is non-null, set newRequest’s body to the - // result of cloning request’s body. - if (request.body != null) { - newRequest.body = cloneBody(request.body) - } + // 3. For each token returned by splitting metadata on spaces: + for (const token of metadata.split(' ')) { + // 1. Set empty to false. + empty = false - // 3. Return newRequest. - return newRequest -} + // 2. Parse token as a hash-with-options. + const parsedToken = parseHashWithOptions.exec(token) -Object.defineProperties(Request.prototype, { - method: kEnumerableProperty, - url: kEnumerableProperty, - headers: kEnumerableProperty, - redirect: kEnumerableProperty, - clone: kEnumerableProperty, - signal: kEnumerableProperty, - duplex: kEnumerableProperty, - destination: kEnumerableProperty, - body: kEnumerableProperty, - bodyUsed: kEnumerableProperty, - isHistoryNavigation: kEnumerableProperty, - isReloadNavigation: kEnumerableProperty, - keepalive: kEnumerableProperty, - integrity: kEnumerableProperty, - cache: kEnumerableProperty, - credentials: kEnumerableProperty, - attribute: kEnumerableProperty, - referrerPolicy: kEnumerableProperty, - referrer: kEnumerableProperty, - mode: kEnumerableProperty, - [Symbol.toStringTag]: { - value: 'Request', - configurable: true - } -}) + // 3. If token does not parse, continue to the next token. + if (parsedToken === null || parsedToken.groups === undefined) { + // Note: Chromium blocks the request at this point, but Firefox + // gives a warning that an invalid integrity was given. The + // correct behavior is to ignore these, and subsequently not + // check the integrity of the resource. + continue + } -webidl.converters.Request = webidl.interfaceConverter( - Request -) + // 4. Let algorithm be the hash-algo component of token. + const algorithm = parsedToken.groups.algo -// https://fetch.spec.whatwg.org/#requestinfo -webidl.converters.RequestInfo = function (V) { - if (typeof V === 'string') { - return webidl.converters.USVString(V) + // 5. If algorithm is a hash function recognized by the user + // agent, add the parsed token to result. + if (supportedHashes.includes(algorithm.toLowerCase())) { + result.push(parsedToken.groups) + } } - if (V instanceof Request) { - return webidl.converters.Request(V) + // 4. Return no metadata if empty is true, otherwise return result. + if (empty === true) { + return 'no metadata' } - return webidl.converters.USVString(V) + return result } -webidl.converters.AbortSignal = webidl.interfaceConverter( - AbortSignal -) +// https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request +function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { + // TODO +} -// https://fetch.spec.whatwg.org/#requestinit -webidl.converters.RequestInit = webidl.dictionaryConverter([ - { - key: 'method', - converter: webidl.converters.ByteString - }, - { - key: 'headers', - converter: webidl.converters.HeadersInit - }, - { - key: 'body', - converter: webidl.nullableConverter( - webidl.converters.BodyInit - ) - }, - { - key: 'referrer', - converter: webidl.converters.USVString - }, - { - key: 'referrerPolicy', - converter: webidl.converters.DOMString, - // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy - allowedValues: referrerPolicy - }, - { - key: 'mode', - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#concept-request-mode - allowedValues: requestMode - }, - { - key: 'credentials', - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#requestcredentials - allowedValues: requestCredentials - }, - { - key: 'cache', - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#requestcache - allowedValues: requestCache - }, - { - key: 'redirect', - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#requestredirect - allowedValues: requestRedirect - }, - { - key: 'integrity', - converter: webidl.converters.DOMString - }, - { - key: 'keepalive', - converter: webidl.converters.boolean - }, - { - key: 'signal', - converter: webidl.nullableConverter( - (signal) => webidl.converters.AbortSignal( - signal, - { strict: false } - ) - ) - }, - { - key: 'window', - converter: webidl.converters.any - }, - { - key: 'duplex', - converter: webidl.converters.DOMString, - allowedValues: requestDuplex +/** + * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin} + * @param {URL} A + * @param {URL} B + */ +function sameOrigin (A, B) { + // 1. If A and B are the same opaque origin, then return true. + if (A.origin === B.origin && A.origin === 'null') { + return true } -]) - -module.exports = { Request, makeRequest } + // 2. If A and B are both tuple origins and their schemes, + // hosts, and port are identical, then return true. + if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { + return true + } -/***/ }), + // 3. Return false. + return false +} -/***/ 27823: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +function createDeferredPromise () { + let res + let rej + const promise = new Promise((resolve, reject) => { + res = resolve + rej = reject + }) -"use strict"; + return { promise, resolve: res, reject: rej } +} +function isAborted (fetchParams) { + return fetchParams.controller.state === 'aborted' +} -const { Headers, HeadersList, fill } = __nccwpck_require__(10554) -const { extractBody, cloneBody, mixinBody } = __nccwpck_require__(41472) -const util = __nccwpck_require__(83983) -const { kEnumerableProperty } = util -const { - isValidReasonPhrase, - isCancelled, - isAborted, - isBlobLike, - serializeJavascriptValueToJSONString, - isErrorLike, - isomorphicEncode -} = __nccwpck_require__(52538) -const { - redirectStatus, - nullBodyStatus, - DOMException -} = __nccwpck_require__(41037) -const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(15861) -const { webidl } = __nccwpck_require__(21744) -const { FormData } = __nccwpck_require__(72015) -const { getGlobalOrigin } = __nccwpck_require__(71246) -const { URLSerializer } = __nccwpck_require__(685) -const { kHeadersList } = __nccwpck_require__(72785) -const assert = __nccwpck_require__(39491) -const { types } = __nccwpck_require__(73837) +function isCancelled (fetchParams) { + return fetchParams.controller.state === 'aborted' || + fetchParams.controller.state === 'terminated' +} -const ReadableStream = globalThis.ReadableStream || (__nccwpck_require__(35356).ReadableStream) +// https://fetch.spec.whatwg.org/#concept-method-normalize +function normalizeMethod (method) { + return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method) + ? method.toUpperCase() + : method +} -// https://fetch.spec.whatwg.org/#response-class -class Response { - // Creates network error Response. - static error () { - // TODO - const relevantRealm = { settingsObject: {} } +// https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string +function serializeJavascriptValueToJSONString (value) { + // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »). + const result = JSON.stringify(value) - // The static error() method steps are to return the result of creating a - // Response object, given a new network error, "immutable", and this’s - // relevant Realm. - const responseObject = new Response() - responseObject[kState] = makeNetworkError() - responseObject[kRealm] = relevantRealm - responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList - responseObject[kHeaders][kGuard] = 'immutable' - responseObject[kHeaders][kRealm] = relevantRealm - return responseObject + // 2. If result is undefined, then throw a TypeError. + if (result === undefined) { + throw new TypeError('Value is not JSON serializable') } - // https://fetch.spec.whatwg.org/#dom-response-json - static json (data, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'Response.json' }) + // 3. Assert: result is a string. + assert(typeof result === 'string') - if (init !== null) { - init = webidl.converters.ResponseInit(init) - } + // 4. Return result. + return result +} - // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data. - const bytes = new TextEncoder('utf-8').encode( - serializeJavascriptValueToJSONString(data) - ) +// https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object +const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())) - // 2. Let body be the result of extracting bytes. - const body = extractBody(bytes) +/** + * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object + * @param {() => unknown[]} iterator + * @param {string} name name of the instance + * @param {'key'|'value'|'key+value'} kind + */ +function makeIterator (iterator, name, kind) { + const object = { + index: 0, + kind, + target: iterator + } - // 3. Let responseObject be the result of creating a Response object, given a new response, - // "response", and this’s relevant Realm. - const relevantRealm = { settingsObject: {} } - const responseObject = new Response() - responseObject[kRealm] = relevantRealm - responseObject[kHeaders][kGuard] = 'response' - responseObject[kHeaders][kRealm] = relevantRealm + const i = { + next () { + // 1. Let interface be the interface for which the iterator prototype object exists. - // 4. Perform initialize a response given responseObject, init, and (body, "application/json"). - initializeResponse(responseObject, init, { body: body[0], type: 'application/json' }) + // 2. Let thisValue be the this value. - // 5. Return responseObject. - return responseObject - } + // 3. Let object be ? ToObject(thisValue). - // Creates a redirect Response that redirects to url with status status. - static redirect (url, status = 302) { - const relevantRealm = { settingsObject: {} } + // 4. If object is a platform object, then perform a security + // check, passing: - webidl.argumentLengthCheck(arguments, 1, { header: 'Response.redirect' }) + // 5. If object is not a default iterator object for interface, + // then throw a TypeError. + if (Object.getPrototypeOf(this) !== i) { + throw new TypeError( + `'next' called on an object that does not implement interface ${name} Iterator.` + ) + } - url = webidl.converters.USVString(url) - status = webidl.converters['unsigned short'](status) + // 6. Let index be object’s index. + // 7. Let kind be object’s kind. + // 8. Let values be object’s target's value pairs to iterate over. + const { index, kind, target } = object + const values = target() - // 1. Let parsedURL be the result of parsing url with current settings - // object’s API base URL. - // 2. If parsedURL is failure, then throw a TypeError. - // TODO: base-URL? - let parsedURL - try { - parsedURL = new URL(url, getGlobalOrigin()) - } catch (err) { - throw Object.assign(new TypeError('Failed to parse URL from ' + url), { - cause: err - }) - } + // 9. Let len be the length of values. + const len = values.length - // 3. If status is not a redirect status, then throw a RangeError. - if (!redirectStatus.includes(status)) { - throw new RangeError('Invalid status code ' + status) - } + // 10. If index is greater than or equal to len, then return + // CreateIterResultObject(undefined, true). + if (index >= len) { + return { value: undefined, done: true } + } - // 4. Let responseObject be the result of creating a Response object, - // given a new response, "immutable", and this’s relevant Realm. - const responseObject = new Response() - responseObject[kRealm] = relevantRealm - responseObject[kHeaders][kGuard] = 'immutable' - responseObject[kHeaders][kRealm] = relevantRealm + // 11. Let pair be the entry in values at index index. + const pair = values[index] - // 5. Set responseObject’s response’s status to status. - responseObject[kState].status = status + // 12. Set object’s index to index + 1. + object.index = index + 1 - // 6. Let value be parsedURL, serialized and isomorphic encoded. - const value = isomorphicEncode(URLSerializer(parsedURL)) + // 13. Return the iterator result for pair and kind. + return iteratorResult(pair, kind) + }, + // The class string of an iterator prototype object for a given interface is the + // result of concatenating the identifier of the interface and the string " Iterator". + [Symbol.toStringTag]: `${name} Iterator` + } - // 7. Append `Location`/value to responseObject’s response’s header list. - responseObject[kState].headersList.append('location', value) + // The [[Prototype]] internal slot of an iterator prototype object must be %IteratorPrototype%. + Object.setPrototypeOf(i, esIteratorPrototype) + // esIteratorPrototype needs to be the prototype of i + // which is the prototype of an empty object. Yes, it's confusing. + return Object.setPrototypeOf({}, i) +} - // 8. Return responseObject. - return responseObject - } +// https://webidl.spec.whatwg.org/#iterator-result +function iteratorResult (pair, kind) { + let result - // https://fetch.spec.whatwg.org/#dom-response - constructor (body = null, init = {}) { - if (body !== null) { - body = webidl.converters.BodyInit(body) + // 1. Let result be a value determined by the value of kind: + switch (kind) { + case 'key': { + // 1. Let idlKey be pair’s key. + // 2. Let key be the result of converting idlKey to an + // ECMAScript value. + // 3. result is key. + result = pair[0] + break + } + case 'value': { + // 1. Let idlValue be pair’s value. + // 2. Let value be the result of converting idlValue to + // an ECMAScript value. + // 3. result is value. + result = pair[1] + break + } + case 'key+value': { + // 1. Let idlKey be pair’s key. + // 2. Let idlValue be pair’s value. + // 3. Let key be the result of converting idlKey to an + // ECMAScript value. + // 4. Let value be the result of converting idlValue to + // an ECMAScript value. + // 5. Let array be ! ArrayCreate(2). + // 6. Call ! CreateDataProperty(array, "0", key). + // 7. Call ! CreateDataProperty(array, "1", value). + // 8. result is array. + result = pair + break } + } - init = webidl.converters.ResponseInit(init) + // 2. Return CreateIterResultObject(result, false). + return { value: result, done: false } +} - // TODO - this[kRealm] = { settingsObject: {} } +/** + * @see https://fetch.spec.whatwg.org/#body-fully-read + */ +async function fullyReadBody (body, processBody, processBodyError) { + // 1. If taskDestination is null, then set taskDestination to + // the result of starting a new parallel queue. - // 1. Set this’s response to a new response. - this[kState] = makeResponse({}) + // 2. Let successSteps given a byte sequence bytes be to queue a + // fetch task to run processBody given bytes, with taskDestination. + const successSteps = processBody - // 2. Set this’s headers to a new Headers object with this’s relevant - // Realm, whose header list is this’s response’s header list and guard - // is "response". - this[kHeaders] = new Headers() - this[kHeaders][kGuard] = 'response' - this[kHeaders][kHeadersList] = this[kState].headersList - this[kHeaders][kRealm] = this[kRealm] + // 3. Let errorSteps be to queue a fetch task to run processBodyError, + // with taskDestination. + const errorSteps = processBodyError - // 3. Let bodyWithType be null. - let bodyWithType = null + // 4. Let reader be the result of getting a reader for body’s stream. + // If that threw an exception, then run errorSteps with that + // exception and return. + let reader - // 4. If body is non-null, then set bodyWithType to the result of extracting body. - if (body != null) { - const [extractedBody, type] = extractBody(body) - bodyWithType = { body: extractedBody, type } - } + try { + reader = body.stream.getReader() + } catch (e) { + errorSteps(e) + return + } - // 5. Perform initialize a response given this, init, and bodyWithType. - initializeResponse(this, init, bodyWithType) + // 5. Read all bytes from reader, given successSteps and errorSteps. + try { + const result = await readAllBytes(reader) + successSteps(result) + } catch (e) { + errorSteps(e) } +} - // Returns response’s type, e.g., "cors". - get type () { - webidl.brandCheck(this, Response) +/** @type {ReadableStream} */ +let ReadableStream = globalThis.ReadableStream - // The type getter steps are to return this’s response’s type. - return this[kState].type +function isReadableStreamLike (stream) { + if (!ReadableStream) { + ReadableStream = (__nccwpck_require__(35356).ReadableStream) } - // Returns response’s URL, if it has one; otherwise the empty string. - get url () { - webidl.brandCheck(this, Response) - - const urlList = this[kState].urlList + return stream instanceof ReadableStream || ( + stream[Symbol.toStringTag] === 'ReadableStream' && + typeof stream.tee === 'function' + ) +} - // The url getter steps are to return the empty string if this’s - // response’s URL is null; otherwise this’s response’s URL, - // serialized with exclude fragment set to true. - const url = urlList[urlList.length - 1] ?? null +const MAXIMUM_ARGUMENT_LENGTH = 65535 - if (url === null) { - return '' - } +/** + * @see https://infra.spec.whatwg.org/#isomorphic-decode + * @param {number[]|Uint8Array} input + */ +function isomorphicDecode (input) { + // 1. To isomorphic decode a byte sequence input, return a string whose code point + // length is equal to input’s length and whose code points have the same values + // as the values of input’s bytes, in the same order. - return URLSerializer(url, true) + if (input.length < MAXIMUM_ARGUMENT_LENGTH) { + return String.fromCharCode(...input) } - // Returns whether response was obtained through a redirect. - get redirected () { - webidl.brandCheck(this, Response) + return input.reduce((previous, current) => previous + String.fromCharCode(current), '') +} - // The redirected getter steps are to return true if this’s response’s URL - // list has more than one item; otherwise false. - return this[kState].urlList.length > 1 +/** + * @param {ReadableStreamController} controller + */ +function readableStreamClose (controller) { + try { + controller.close() + } catch (err) { + // TODO: add comment explaining why this error occurs. + if (!err.message.includes('Controller is already closed')) { + throw err + } } +} - // Returns response’s status. - get status () { - webidl.brandCheck(this, Response) - - // The status getter steps are to return this’s response’s status. - return this[kState].status +/** + * @see https://infra.spec.whatwg.org/#isomorphic-encode + * @param {string} input + */ +function isomorphicEncode (input) { + // 1. Assert: input contains no code points greater than U+00FF. + for (let i = 0; i < input.length; i++) { + assert(input.charCodeAt(i) <= 0xFF) } - // Returns whether response’s status is an ok status. - get ok () { - webidl.brandCheck(this, Response) + // 2. Return a byte sequence whose length is equal to input’s code + // point length and whose bytes have the same values as the + // values of input’s code points, in the same order + return input +} - // The ok getter steps are to return true if this’s response’s status is an - // ok status; otherwise false. - return this[kState].status >= 200 && this[kState].status <= 299 - } +/** + * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes + * @see https://streams.spec.whatwg.org/#read-loop + * @param {ReadableStreamDefaultReader} reader + */ +async function readAllBytes (reader) { + const bytes = [] + let byteLength = 0 - // Returns response’s status message. - get statusText () { - webidl.brandCheck(this, Response) + while (true) { + const { done, value: chunk } = await reader.read() - // The statusText getter steps are to return this’s response’s status - // message. - return this[kState].statusText - } + if (done) { + // 1. Call successSteps with bytes. + return Buffer.concat(bytes, byteLength) + } - // Returns response’s headers as Headers. - get headers () { - webidl.brandCheck(this, Response) + // 1. If chunk is not a Uint8Array object, call failureSteps + // with a TypeError and abort these steps. + if (!isUint8Array(chunk)) { + throw new TypeError('Received non-Uint8Array chunk') + } - // The headers getter steps are to return this’s headers. - return this[kHeaders] + // 2. Append the bytes represented by chunk to bytes. + bytes.push(chunk) + byteLength += chunk.length + + // 3. Read-loop given reader, bytes, successSteps, and failureSteps. } +} - get body () { - webidl.brandCheck(this, Response) +/** + * @see https://fetch.spec.whatwg.org/#is-local + * @param {URL} url + */ +function urlIsLocal (url) { + assert('protocol' in url) // ensure it's a url object - return this[kState].body ? this[kState].body.stream : null - } + const protocol = url.protocol - get bodyUsed () { - webidl.brandCheck(this, Response) + return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:' +} - return !!this[kState].body && util.isDisturbed(this[kState].body.stream) +/** + * @param {string|URL} url + */ +function urlHasHttpsScheme (url) { + if (typeof url === 'string') { + return url.startsWith('https:') } - // Returns a clone of response. - clone () { - webidl.brandCheck(this, Response) + return url.protocol === 'https:' +} - // 1. If this is unusable, then throw a TypeError. - if (this.bodyUsed || (this.body && this.body.locked)) { - throw webidl.errors.exception({ - header: 'Response.clone', - message: 'Body has already been consumed.' - }) - } +/** + * @see https://fetch.spec.whatwg.org/#http-scheme + * @param {URL} url + */ +function urlIsHttpHttpsScheme (url) { + assert('protocol' in url) // ensure it's a url object - // 2. Let clonedResponse be the result of cloning this’s response. - const clonedResponse = cloneResponse(this[kState]) + const protocol = url.protocol - // 3. Return the result of creating a Response object, given - // clonedResponse, this’s headers’s guard, and this’s relevant Realm. - const clonedResponseObject = new Response() - clonedResponseObject[kState] = clonedResponse - clonedResponseObject[kRealm] = this[kRealm] - clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList - clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard] - clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm] + return protocol === 'http:' || protocol === 'https:' +} - return clonedResponseObject - } +/** + * Fetch supports node >= 16.8.0, but Object.hasOwn was added in v16.9.0. + */ +const hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)) + +module.exports = { + isAborted, + isCancelled, + createDeferredPromise, + ReadableStreamFrom, + toUSVString, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isBlobLike, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + serializeJavascriptValueToJSONString, + makeIterator, + isValidHeaderName, + isValidHeaderValue, + hasOwn, + isErrorLike, + fullyReadBody, + bytesMatch, + isReadableStreamLike, + readableStreamClose, + isomorphicEncode, + isomorphicDecode, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes } -mixinBody(Response) -Object.defineProperties(Response.prototype, { - type: kEnumerableProperty, - url: kEnumerableProperty, - status: kEnumerableProperty, - ok: kEnumerableProperty, - redirected: kEnumerableProperty, - statusText: kEnumerableProperty, - headers: kEnumerableProperty, - clone: kEnumerableProperty, - body: kEnumerableProperty, - bodyUsed: kEnumerableProperty, - [Symbol.toStringTag]: { - value: 'Response', - configurable: true - } -}) +/***/ }), -Object.defineProperties(Response, { - json: kEnumerableProperty, - redirect: kEnumerableProperty, - error: kEnumerableProperty -}) +/***/ 21744: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -// https://fetch.spec.whatwg.org/#concept-response-clone -function cloneResponse (response) { - // To clone a response response, run these steps: +"use strict"; - // 1. If response is a filtered response, then return a new identical - // filtered response whose internal response is a clone of response’s - // internal response. - if (response.internalResponse) { - return filterResponse( - cloneResponse(response.internalResponse), - response.type - ) - } - // 2. Let newResponse be a copy of response, except for its body. - const newResponse = makeResponse({ ...response, body: null }) +const { types } = __nccwpck_require__(73837) +const { hasOwn, toUSVString } = __nccwpck_require__(52538) - // 3. If response’s body is non-null, then set newResponse’s body to the - // result of cloning response’s body. - if (response.body != null) { - newResponse.body = cloneBody(response.body) - } +/** @type {import('../../types/webidl').Webidl} */ +const webidl = {} +webidl.converters = {} +webidl.util = {} +webidl.errors = {} - // 4. Return newResponse. - return newResponse +webidl.errors.exception = function (message) { + return new TypeError(`${message.header}: ${message.message}`) } -function makeResponse (init) { - return { - aborted: false, - rangeRequested: false, - timingAllowPassed: false, - requestIncludesCredentials: false, - type: 'default', - status: 200, - timingInfo: null, - cacheState: '', - statusText: '', - ...init, - headersList: init.headersList - ? new HeadersList(init.headersList) - : new HeadersList(), - urlList: init.urlList ? [...init.urlList] : [] - } -} +webidl.errors.conversionFailed = function (context) { + const plural = context.types.length === 1 ? '' : ' one of' + const message = + `${context.argument} could not be converted to` + + `${plural}: ${context.types.join(', ')}.` -function makeNetworkError (reason) { - const isError = isErrorLike(reason) - return makeResponse({ - type: 'error', - status: 0, - error: isError - ? reason - : new Error(reason ? String(reason) : reason), - aborted: reason && reason.name === 'AbortError' + return webidl.errors.exception({ + header: context.prefix, + message }) } -function makeFilteredResponse (response, state) { - state = { - internalResponse: response, - ...state - } - - return new Proxy(response, { - get (target, p) { - return p in state ? state[p] : target[p] - }, - set (target, p, value) { - assert(!(p in state)) - target[p] = value - return true - } +webidl.errors.invalidArgument = function (context) { + return webidl.errors.exception({ + header: context.prefix, + message: `"${context.value}" is an invalid ${context.type}.` }) } -// https://fetch.spec.whatwg.org/#concept-filtered-response -function filterResponse (response, type) { - // Set response to the following filtered response with response as its - // internal response, depending on request’s response tainting: - if (type === 'basic') { - // A basic filtered response is a filtered response whose type is "basic" - // and header list excludes any headers in internal response’s header list - // whose name is a forbidden response-header name. +// https://webidl.spec.whatwg.org/#implements +webidl.brandCheck = function (V, I, opts = undefined) { + if (opts?.strict !== false && !(V instanceof I)) { + throw new TypeError('Illegal invocation') + } else { + return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag] + } +} - // Note: undici does not implement forbidden response-header names - return makeFilteredResponse(response, { - type: 'basic', - headersList: response.headersList +webidl.argumentLengthCheck = function ({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? 's' : ''} required, ` + + `but${length ? ' only' : ''} ${length} found.`, + ...ctx }) - } else if (type === 'cors') { - // A CORS filtered response is a filtered response whose type is "cors" - // and header list excludes any headers in internal response’s header - // list whose name is not a CORS-safelisted response-header name, given - // internal response’s CORS-exposed header-name list. + } +} - // Note: undici does not implement CORS-safelisted response-header names - return makeFilteredResponse(response, { - type: 'cors', - headersList: response.headersList - }) - } else if (type === 'opaque') { - // An opaque filtered response is a filtered response whose type is - // "opaque", URL list is the empty list, status is 0, status message - // is the empty byte sequence, header list is empty, and body is null. +webidl.illegalConstructor = function () { + throw webidl.errors.exception({ + header: 'TypeError', + message: 'Illegal constructor' + }) +} - return makeFilteredResponse(response, { - type: 'opaque', - urlList: Object.freeze([]), - status: 0, - statusText: '', - body: null - }) - } else if (type === 'opaqueredirect') { - // An opaque-redirect filtered response is a filtered response whose type - // is "opaqueredirect", status is 0, status message is the empty byte - // sequence, header list is empty, and body is null. +// https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values +webidl.util.Type = function (V) { + switch (typeof V) { + case 'undefined': return 'Undefined' + case 'boolean': return 'Boolean' + case 'string': return 'String' + case 'symbol': return 'Symbol' + case 'number': return 'Number' + case 'bigint': return 'BigInt' + case 'function': + case 'object': { + if (V === null) { + return 'Null' + } - return makeFilteredResponse(response, { - type: 'opaqueredirect', - status: 0, - statusText: '', - headersList: [], - body: null - }) - } else { - assert(false) + return 'Object' + } } } -// https://fetch.spec.whatwg.org/#appropriate-network-error -function makeAppropriateNetworkError (fetchParams, err = null) { - // 1. Assert: fetchParams is canceled. - assert(isCancelled(fetchParams)) +// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint +webidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) { + let upperBound + let lowerBound - // 2. Return an aborted network error if fetchParams is aborted; - // otherwise return a network error. - return isAborted(fetchParams) - ? makeNetworkError(Object.assign(new DOMException('The operation was aborted.', 'AbortError'), { cause: err })) - : makeNetworkError(Object.assign(new DOMException('Request was cancelled.'), { cause: err })) -} + // 1. If bitLength is 64, then: + if (bitLength === 64) { + // 1. Let upperBound be 2^53 − 1. + upperBound = Math.pow(2, 53) - 1 -// https://whatpr.org/fetch/1392.html#initialize-a-response -function initializeResponse (response, init, body) { - // 1. If init["status"] is not in the range 200 to 599, inclusive, then - // throw a RangeError. - if (init.status !== null && (init.status < 200 || init.status > 599)) { - throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.') - } + // 2. If signedness is "unsigned", then let lowerBound be 0. + if (signedness === 'unsigned') { + lowerBound = 0 + } else { + // 3. Otherwise let lowerBound be −2^53 + 1. + lowerBound = Math.pow(-2, 53) + 1 + } + } else if (signedness === 'unsigned') { + // 2. Otherwise, if signedness is "unsigned", then: + + // 1. Let lowerBound be 0. + lowerBound = 0 + + // 2. Let upperBound be 2^bitLength − 1. + upperBound = Math.pow(2, bitLength) - 1 + } else { + // 3. Otherwise: - // 2. If init["statusText"] does not match the reason-phrase token production, - // then throw a TypeError. - if ('statusText' in init && init.statusText != null) { - // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2: - // reason-phrase = *( HTAB / SP / VCHAR / obs-text ) - if (!isValidReasonPhrase(String(init.statusText))) { - throw new TypeError('Invalid statusText') - } - } + // 1. Let lowerBound be -2^bitLength − 1. + lowerBound = Math.pow(-2, bitLength) - 1 - // 3. Set response’s response’s status to init["status"]. - if ('status' in init && init.status != null) { - response[kState].status = init.status + // 2. Let upperBound be 2^bitLength − 1 − 1. + upperBound = Math.pow(2, bitLength - 1) - 1 } - // 4. Set response’s response’s status message to init["statusText"]. - if ('statusText' in init && init.statusText != null) { - response[kState].statusText = init.statusText - } + // 4. Let x be ? ToNumber(V). + let x = Number(V) - // 5. If init["headers"] exists, then fill response’s headers with init["headers"]. - if ('headers' in init && init.headers != null) { - fill(response[kHeaders], init.headers) + // 5. If x is −0, then set x to +0. + if (x === 0) { + x = 0 } - // 6. If body was given, then: - if (body) { - // 1. If response's status is a null body status, then throw a TypeError. - if (nullBodyStatus.includes(response.status)) { + // 6. If the conversion is to an IDL type associated + // with the [EnforceRange] extended attribute, then: + if (opts.enforceRange === true) { + // 1. If x is NaN, +∞, or −∞, then throw a TypeError. + if ( + Number.isNaN(x) || + x === Number.POSITIVE_INFINITY || + x === Number.NEGATIVE_INFINITY + ) { throw webidl.errors.exception({ - header: 'Response constructor', - message: 'Invalid response status code ' + response.status + header: 'Integer conversion', + message: `Could not convert ${V} to an integer.` }) } - // 2. Set response's body to body's body. - response[kState].body = body.body + // 2. Set x to IntegerPart(x). + x = webidl.util.IntegerPart(x) - // 3. If body's type is non-null and response's header list does not contain - // `Content-Type`, then append (`Content-Type`, body's type) to response's header list. - if (body.type != null && !response[kState].headersList.contains('Content-Type')) { - response[kState].headersList.append('content-type', body.type) + // 3. If x < lowerBound or x > upperBound, then + // throw a TypeError. + if (x < lowerBound || x > upperBound) { + throw webidl.errors.exception({ + header: 'Integer conversion', + message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` + }) } - } -} - -webidl.converters.ReadableStream = webidl.interfaceConverter( - ReadableStream -) -webidl.converters.FormData = webidl.interfaceConverter( - FormData -) + // 4. Return x. + return x + } -webidl.converters.URLSearchParams = webidl.interfaceConverter( - URLSearchParams -) + // 7. If x is not NaN and the conversion is to an IDL + // type associated with the [Clamp] extended + // attribute, then: + if (!Number.isNaN(x) && opts.clamp === true) { + // 1. Set x to min(max(x, lowerBound), upperBound). + x = Math.min(Math.max(x, lowerBound), upperBound) -// https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit -webidl.converters.XMLHttpRequestBodyInit = function (V) { - if (typeof V === 'string') { - return webidl.converters.USVString(V) - } + // 2. Round x to the nearest integer, choosing the + // even integer if it lies halfway between two, + // and choosing +0 rather than −0. + if (Math.floor(x) % 2 === 0) { + x = Math.floor(x) + } else { + x = Math.ceil(x) + } - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }) + // 3. Return x. + return x } + // 8. If x is NaN, +0, +∞, or −∞, then return +0. if ( - types.isAnyArrayBuffer(V) || - types.isTypedArray(V) || - types.isDataView(V) + Number.isNaN(x) || + (x === 0 && Object.is(0, x)) || + x === Number.POSITIVE_INFINITY || + x === Number.NEGATIVE_INFINITY ) { - return webidl.converters.BufferSource(V) + return 0 } - if (util.isFormDataLike(V)) { - return webidl.converters.FormData(V, { strict: false }) - } + // 9. Set x to IntegerPart(x). + x = webidl.util.IntegerPart(x) - if (V instanceof URLSearchParams) { - return webidl.converters.URLSearchParams(V) + // 10. Set x to x modulo 2^bitLength. + x = x % Math.pow(2, bitLength) + + // 11. If signedness is "signed" and x ≥ 2^bitLength − 1, + // then return x − 2^bitLength. + if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) { + return x - Math.pow(2, bitLength) } - return webidl.converters.DOMString(V) + // 12. Otherwise, return x. + return x } -// https://fetch.spec.whatwg.org/#bodyinit -webidl.converters.BodyInit = function (V) { - if (V instanceof ReadableStream) { - return webidl.converters.ReadableStream(V) - } +// https://webidl.spec.whatwg.org/#abstract-opdef-integerpart +webidl.util.IntegerPart = function (n) { + // 1. Let r be floor(abs(n)). + const r = Math.floor(Math.abs(n)) - // Note: the spec doesn't include async iterables, - // this is an undici extension. - if (V?.[Symbol.asyncIterator]) { - return V + // 2. If n < 0, then return -1 × r. + if (n < 0) { + return -1 * r } - return webidl.converters.XMLHttpRequestBodyInit(V) + // 3. Otherwise, return r. + return r } -webidl.converters.ResponseInit = webidl.dictionaryConverter([ - { - key: 'status', - converter: webidl.converters['unsigned short'], - defaultValue: 200 - }, - { - key: 'statusText', - converter: webidl.converters.ByteString, - defaultValue: '' - }, - { - key: 'headers', - converter: webidl.converters.HeadersInit - } -]) - -module.exports = { - makeNetworkError, - makeResponse, - makeAppropriateNetworkError, - filterResponse, - Response, - cloneResponse -} +// https://webidl.spec.whatwg.org/#es-sequence +webidl.sequenceConverter = function (converter) { + return (V) => { + // 1. If Type(V) is not Object, throw a TypeError. + if (webidl.util.Type(V) !== 'Object') { + throw webidl.errors.exception({ + header: 'Sequence', + message: `Value of type ${webidl.util.Type(V)} is not an Object.` + }) + } + // 2. Let method be ? GetMethod(V, @@iterator). + /** @type {Generator} */ + const method = V?.[Symbol.iterator]?.() + const seq = [] -/***/ }), + // 3. If method is undefined, throw a TypeError. + if ( + method === undefined || + typeof method.next !== 'function' + ) { + throw webidl.errors.exception({ + header: 'Sequence', + message: 'Object is not an iterator.' + }) + } -/***/ 15861: -/***/ ((module) => { + // https://webidl.spec.whatwg.org/#create-sequence-from-iterable + while (true) { + const { done, value } = method.next() -"use strict"; + if (done) { + break + } + seq.push(converter(value)) + } -module.exports = { - kUrl: Symbol('url'), - kHeaders: Symbol('headers'), - kSignal: Symbol('signal'), - kState: Symbol('state'), - kGuard: Symbol('guard'), - kRealm: Symbol('realm') + return seq + } } +// https://webidl.spec.whatwg.org/#es-to-record +webidl.recordConverter = function (keyConverter, valueConverter) { + return (O) => { + // 1. If Type(O) is not Object, throw a TypeError. + if (webidl.util.Type(O) !== 'Object') { + throw webidl.errors.exception({ + header: 'Record', + message: `Value of type ${webidl.util.Type(O)} is not an Object.` + }) + } -/***/ }), + // 2. Let result be a new empty instance of record. + const result = {} -/***/ 52538: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + if (!types.isProxy(O)) { + // Object.keys only returns enumerable properties + const keys = Object.keys(O) -"use strict"; + for (const key of keys) { + // 1. Let typedKey be key converted to an IDL value of type K. + const typedKey = keyConverter(key) + // 2. Let value be ? Get(O, key). + // 3. Let typedValue be value converted to an IDL value of type V. + const typedValue = valueConverter(O[key]) -const { redirectStatus, badPorts, referrerPolicy: referrerPolicyTokens } = __nccwpck_require__(41037) -const { getGlobalOrigin } = __nccwpck_require__(71246) -const { performance } = __nccwpck_require__(4074) -const { isBlobLike, toUSVString, ReadableStreamFrom } = __nccwpck_require__(83983) -const assert = __nccwpck_require__(39491) -const { isUint8Array } = __nccwpck_require__(29830) + // 4. Set result[typedKey] to typedValue. + result[typedKey] = typedValue + } -// https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable -/** @type {import('crypto')|undefined} */ -let crypto + // 5. Return result. + return result + } -try { - crypto = __nccwpck_require__(6113) -} catch { + // 3. Let keys be ? O.[[OwnPropertyKeys]](). + const keys = Reflect.ownKeys(O) -} + // 4. For each key of keys. + for (const key of keys) { + // 1. Let desc be ? O.[[GetOwnProperty]](key). + const desc = Reflect.getOwnPropertyDescriptor(O, key) -function responseURL (response) { - // https://fetch.spec.whatwg.org/#responses - // A response has an associated URL. It is a pointer to the last URL - // in response’s URL list and null if response’s URL list is empty. - const urlList = response.urlList - const length = urlList.length - return length === 0 ? null : urlList[length - 1].toString() -} + // 2. If desc is not undefined and desc.[[Enumerable]] is true: + if (desc?.enumerable) { + // 1. Let typedKey be key converted to an IDL value of type K. + const typedKey = keyConverter(key) -// https://fetch.spec.whatwg.org/#concept-response-location-url -function responseLocationURL (response, requestFragment) { - // 1. If response’s status is not a redirect status, then return null. - if (!redirectStatus.includes(response.status)) { - return null - } + // 2. Let value be ? Get(O, key). + // 3. Let typedValue be value converted to an IDL value of type V. + const typedValue = valueConverter(O[key]) - // 2. Let location be the result of extracting header list values given - // `Location` and response’s header list. - let location = response.headersList.get('location') + // 4. Set result[typedKey] to typedValue. + result[typedKey] = typedValue + } + } - // 3. If location is a header value, then set location to the result of - // parsing location with response’s URL. - if (location !== null && isValidHeaderValue(location)) { - location = new URL(location, responseURL(response)) + // 5. Return result. + return result } +} - // 4. If location is a URL whose fragment is null, then set location’s - // fragment to requestFragment. - if (location && !location.hash) { - location.hash = requestFragment +webidl.interfaceConverter = function (i) { + return (V, opts = {}) => { + if (opts.strict !== false && !(V instanceof i)) { + throw webidl.errors.exception({ + header: i.name, + message: `Expected ${V} to be an instance of ${i.name}.` + }) + } + + return V } +} - // 5. Return location. - return location +webidl.dictionaryConverter = function (converters) { + return (dictionary) => { + const type = webidl.util.Type(dictionary) + const dict = {} + + if (type === 'Null' || type === 'Undefined') { + return dict + } else if (type !== 'Object') { + throw webidl.errors.exception({ + header: 'Dictionary', + message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` + }) + } + + for (const options of converters) { + const { key, defaultValue, required, converter } = options + + if (required === true) { + if (!hasOwn(dictionary, key)) { + throw webidl.errors.exception({ + header: 'Dictionary', + message: `Missing required key "${key}".` + }) + } + } + + let value = dictionary[key] + const hasDefault = hasOwn(options, 'defaultValue') + + // Only use defaultValue if value is undefined and + // a defaultValue options was provided. + if (hasDefault && value !== null) { + value = value ?? defaultValue + } + + // A key can be optional and have no default value. + // When this happens, do not perform a conversion, + // and do not assign the key a value. + if (required || hasDefault || value !== undefined) { + value = converter(value) + + if ( + options.allowedValues && + !options.allowedValues.includes(value) + ) { + throw webidl.errors.exception({ + header: 'Dictionary', + message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.` + }) + } + + dict[key] = value + } + } + + return dict + } } -/** @returns {URL} */ -function requestCurrentURL (request) { - return request.urlList[request.urlList.length - 1] +webidl.nullableConverter = function (converter) { + return (V) => { + if (V === null) { + return V + } + + return converter(V) + } } -function requestBadPort (request) { - // 1. Let url be request’s current URL. - const url = requestCurrentURL(request) +// https://webidl.spec.whatwg.org/#es-DOMString +webidl.converters.DOMString = function (V, opts = {}) { + // 1. If V is null and the conversion is to an IDL type + // associated with the [LegacyNullToEmptyString] + // extended attribute, then return the DOMString value + // that represents the empty string. + if (V === null && opts.legacyNullToEmptyString) { + return '' + } - // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port, - // then return blocked. - if (urlIsHttpHttpsScheme(url) && badPorts.includes(url.port)) { - return 'blocked' + // 2. Let x be ? ToString(V). + if (typeof V === 'symbol') { + throw new TypeError('Could not convert argument of type symbol to string.') } - // 3. Return allowed. - return 'allowed' + // 3. Return the IDL DOMString value that represents the + // same sequence of code units as the one the + // ECMAScript String value x represents. + return String(V) } -function isErrorLike (object) { - return object instanceof Error || ( - object?.constructor?.name === 'Error' || - object?.constructor?.name === 'DOMException' - ) -} +// https://webidl.spec.whatwg.org/#es-ByteString +webidl.converters.ByteString = function (V) { + // 1. Let x be ? ToString(V). + // Note: DOMString converter perform ? ToString(V) + const x = webidl.converters.DOMString(V) -// Check whether |statusText| is a ByteString and -// matches the Reason-Phrase token production. -// RFC 2616: https://tools.ietf.org/html/rfc2616 -// RFC 7230: https://tools.ietf.org/html/rfc7230 -// "reason-phrase = *( HTAB / SP / VCHAR / obs-text )" -// https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116 -function isValidReasonPhrase (statusText) { - for (let i = 0; i < statusText.length; ++i) { - const c = statusText.charCodeAt(i) - if ( - !( - ( - c === 0x09 || // HTAB - (c >= 0x20 && c <= 0x7e) || // SP / VCHAR - (c >= 0x80 && c <= 0xff) - ) // obs-text + // 2. If the value of any element of x is greater than + // 255, then throw a TypeError. + for (let index = 0; index < x.length; index++) { + const charCode = x.charCodeAt(index) + + if (charCode > 255) { + throw new TypeError( + 'Cannot convert argument to a ByteString because the character at ' + + `index ${index} has a value of ${charCode} which is greater than 255.` ) - ) { - return false } } - return true + + // 3. Return an IDL ByteString value whose length is the + // length of x, and where the value of each element is + // the value of the corresponding element of x. + return x } -function isTokenChar (c) { - return !( - c >= 0x7f || - c <= 0x20 || - c === '(' || - c === ')' || - c === '<' || - c === '>' || - c === '@' || - c === ',' || - c === ';' || - c === ':' || - c === '\\' || - c === '"' || - c === '/' || - c === '[' || - c === ']' || - c === '?' || - c === '=' || - c === '{' || - c === '}' - ) +// https://webidl.spec.whatwg.org/#es-USVString +webidl.converters.USVString = toUSVString + +// https://webidl.spec.whatwg.org/#es-boolean +webidl.converters.boolean = function (V) { + // 1. Let x be the result of computing ToBoolean(V). + const x = Boolean(V) + + // 2. Return the IDL boolean value that is the one that represents + // the same truth value as the ECMAScript Boolean value x. + return x +} + +// https://webidl.spec.whatwg.org/#es-any +webidl.converters.any = function (V) { + return V +} + +// https://webidl.spec.whatwg.org/#es-long-long +webidl.converters['long long'] = function (V) { + // 1. Let x be ? ConvertToInt(V, 64, "signed"). + const x = webidl.util.ConvertToInt(V, 64, 'signed') + + // 2. Return the IDL long long value that represents + // the same numeric value as x. + return x +} + +// https://webidl.spec.whatwg.org/#es-unsigned-long-long +webidl.converters['unsigned long long'] = function (V) { + // 1. Let x be ? ConvertToInt(V, 64, "unsigned"). + const x = webidl.util.ConvertToInt(V, 64, 'unsigned') + + // 2. Return the IDL unsigned long long value that + // represents the same numeric value as x. + return x } -// See RFC 7230, Section 3.2.6. -// https://github.com/chromium/chromium/blob/d7da0240cae77824d1eda25745c4022757499131/third_party/blink/renderer/platform/network/http_parsers.cc#L321 -function isValidHTTPToken (characters) { - if (!characters || typeof characters !== 'string') { - return false - } - for (let i = 0; i < characters.length; ++i) { - const c = characters.charCodeAt(i) - if (c > 0x7f || !isTokenChar(c)) { - return false - } - } - return true +// https://webidl.spec.whatwg.org/#es-unsigned-long +webidl.converters['unsigned long'] = function (V) { + // 1. Let x be ? ConvertToInt(V, 32, "unsigned"). + const x = webidl.util.ConvertToInt(V, 32, 'unsigned') + + // 2. Return the IDL unsigned long value that + // represents the same numeric value as x. + return x } -// https://fetch.spec.whatwg.org/#header-name -// https://github.com/chromium/chromium/blob/b3d37e6f94f87d59e44662d6078f6a12de845d17/net/http/http_util.cc#L342 -function isValidHeaderName (potentialValue) { - if (potentialValue.length === 0) { - return false - } +// https://webidl.spec.whatwg.org/#es-unsigned-short +webidl.converters['unsigned short'] = function (V, opts) { + // 1. Let x be ? ConvertToInt(V, 16, "unsigned"). + const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts) - return isValidHTTPToken(potentialValue) + // 2. Return the IDL unsigned short value that represents + // the same numeric value as x. + return x } -/** - * @see https://fetch.spec.whatwg.org/#header-value - * @param {string} potentialValue - */ -function isValidHeaderValue (potentialValue) { - // - Has no leading or trailing HTTP tab or space bytes. - // - Contains no 0x00 (NUL) or HTTP newline bytes. +// https://webidl.spec.whatwg.org/#idl-ArrayBuffer +webidl.converters.ArrayBuffer = function (V, opts = {}) { + // 1. If Type(V) is not Object, or V does not have an + // [[ArrayBufferData]] internal slot, then throw a + // TypeError. + // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances + // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances if ( - potentialValue.startsWith('\t') || - potentialValue.startsWith(' ') || - potentialValue.endsWith('\t') || - potentialValue.endsWith(' ') + webidl.util.Type(V) !== 'Object' || + !types.isAnyArrayBuffer(V) ) { - return false + throw webidl.errors.conversionFailed({ + prefix: `${V}`, + argument: `${V}`, + types: ['ArrayBuffer'] + }) + } + + // 2. If the conversion is not to an IDL type associated + // with the [AllowShared] extended attribute, and + // IsSharedArrayBuffer(V) is true, then throw a + // TypeError. + if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'SharedArrayBuffer is not allowed.' + }) } + // 3. If the conversion is not to an IDL type associated + // with the [AllowResizable] extended attribute, and + // IsResizableArrayBuffer(V) is true, then throw a + // TypeError. + // Note: resizable ArrayBuffers are currently a proposal. + + // 4. Return the IDL ArrayBuffer value that is a + // reference to the same object as V. + return V +} + +webidl.converters.TypedArray = function (V, T, opts = {}) { + // 1. Let T be the IDL type V is being converted to. + + // 2. If Type(V) is not Object, or V does not have a + // [[TypedArrayName]] internal slot with a value + // equal to T’s name, then throw a TypeError. if ( - potentialValue.includes('\0') || - potentialValue.includes('\r') || - potentialValue.includes('\n') + webidl.util.Type(V) !== 'Object' || + !types.isTypedArray(V) || + V.constructor.name !== T.name ) { - return false + throw webidl.errors.conversionFailed({ + prefix: `${T.name}`, + argument: `${V}`, + types: [T.name] + }) } - return true + // 3. If the conversion is not to an IDL type associated + // with the [AllowShared] extended attribute, and + // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is + // true, then throw a TypeError. + if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'SharedArrayBuffer is not allowed.' + }) + } + + // 4. If the conversion is not to an IDL type associated + // with the [AllowResizable] extended attribute, and + // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is + // true, then throw a TypeError. + // Note: resizable array buffers are currently a proposal + + // 5. Return the IDL value of type T that is a reference + // to the same object as V. + return V } -// https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect -function setRequestReferrerPolicyOnRedirect (request, actualResponse) { - // Given a request request and a response actualResponse, this algorithm - // updates request’s referrer policy according to the Referrer-Policy - // header (if any) in actualResponse. +webidl.converters.DataView = function (V, opts = {}) { + // 1. If Type(V) is not Object, or V does not have a + // [[DataView]] internal slot, then throw a TypeError. + if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) { + throw webidl.errors.exception({ + header: 'DataView', + message: 'Object is not a DataView.' + }) + } - // 1. Let policy be the result of executing § 8.1 Parse a referrer policy - // from a Referrer-Policy header on actualResponse. + // 2. If the conversion is not to an IDL type associated + // with the [AllowShared] extended attribute, and + // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true, + // then throw a TypeError. + if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'SharedArrayBuffer is not allowed.' + }) + } - // 8.1 Parse a referrer policy from a Referrer-Policy header - // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list. - const { headersList } = actualResponse - // 2. Let policy be the empty string. - // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token. - // 4. Return policy. - const policyHeader = (headersList.get('referrer-policy') ?? '').split(',') + // 3. If the conversion is not to an IDL type associated + // with the [AllowResizable] extended attribute, and + // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is + // true, then throw a TypeError. + // Note: resizable ArrayBuffers are currently a proposal - // Note: As the referrer-policy can contain multiple policies - // separated by comma, we need to loop through all of them - // and pick the first valid one. - // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy - let policy = '' - if (policyHeader.length > 0) { - // The right-most policy takes precedence. - // The left-most policy is the fallback. - for (let i = policyHeader.length; i !== 0; i--) { - const token = policyHeader[i - 1].trim() - if (referrerPolicyTokens.includes(token)) { - policy = token - break - } - } + // 4. Return the IDL DataView value that is a reference + // to the same object as V. + return V +} + +// https://webidl.spec.whatwg.org/#BufferSource +webidl.converters.BufferSource = function (V, opts = {}) { + if (types.isAnyArrayBuffer(V)) { + return webidl.converters.ArrayBuffer(V, opts) } - // 2. If policy is not the empty string, then set request’s referrer policy to policy. - if (policy !== '') { - request.referrerPolicy = policy + if (types.isTypedArray(V)) { + return webidl.converters.TypedArray(V, V.constructor) } -} -// https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check -function crossOriginResourcePolicyCheck () { - // TODO - return 'allowed' -} + if (types.isDataView(V)) { + return webidl.converters.DataView(V, opts) + } -// https://fetch.spec.whatwg.org/#concept-cors-check -function corsCheck () { - // TODO - return 'success' + throw new TypeError(`Could not convert ${V} to a BufferSource.`) } -// https://fetch.spec.whatwg.org/#concept-tao-check -function TAOCheck () { - // TODO - return 'success' +webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.ByteString +) + +webidl.converters['sequence>'] = webidl.sequenceConverter( + webidl.converters['sequence'] +) + +webidl.converters['record'] = webidl.recordConverter( + webidl.converters.ByteString, + webidl.converters.ByteString +) + +module.exports = { + webidl } -function appendFetchMetadata (httpRequest) { - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header - // TODO - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header +/***/ }), - // 1. Assert: r’s url is a potentially trustworthy URL. - // TODO +/***/ 84854: +/***/ ((module) => { + +"use strict"; + + +/** + * @see https://encoding.spec.whatwg.org/#concept-encoding-get + * @param {string|undefined} label + */ +function getEncoding (label) { + if (!label) { + return 'failure' + } + + // 1. Remove any leading and trailing ASCII whitespace from label. + // 2. If label is an ASCII case-insensitive match for any of the + // labels listed in the table below, then return the + // corresponding encoding; otherwise return failure. + switch (label.trim().toLowerCase()) { + case 'unicode-1-1-utf-8': + case 'unicode11utf8': + case 'unicode20utf8': + case 'utf-8': + case 'utf8': + case 'x-unicode20utf8': + return 'UTF-8' + case '866': + case 'cp866': + case 'csibm866': + case 'ibm866': + return 'IBM866' + case 'csisolatin2': + case 'iso-8859-2': + case 'iso-ir-101': + case 'iso8859-2': + case 'iso88592': + case 'iso_8859-2': + case 'iso_8859-2:1987': + case 'l2': + case 'latin2': + return 'ISO-8859-2' + case 'csisolatin3': + case 'iso-8859-3': + case 'iso-ir-109': + case 'iso8859-3': + case 'iso88593': + case 'iso_8859-3': + case 'iso_8859-3:1988': + case 'l3': + case 'latin3': + return 'ISO-8859-3' + case 'csisolatin4': + case 'iso-8859-4': + case 'iso-ir-110': + case 'iso8859-4': + case 'iso88594': + case 'iso_8859-4': + case 'iso_8859-4:1988': + case 'l4': + case 'latin4': + return 'ISO-8859-4' + case 'csisolatincyrillic': + case 'cyrillic': + case 'iso-8859-5': + case 'iso-ir-144': + case 'iso8859-5': + case 'iso88595': + case 'iso_8859-5': + case 'iso_8859-5:1988': + return 'ISO-8859-5' + case 'arabic': + case 'asmo-708': + case 'csiso88596e': + case 'csiso88596i': + case 'csisolatinarabic': + case 'ecma-114': + case 'iso-8859-6': + case 'iso-8859-6-e': + case 'iso-8859-6-i': + case 'iso-ir-127': + case 'iso8859-6': + case 'iso88596': + case 'iso_8859-6': + case 'iso_8859-6:1987': + return 'ISO-8859-6' + case 'csisolatingreek': + case 'ecma-118': + case 'elot_928': + case 'greek': + case 'greek8': + case 'iso-8859-7': + case 'iso-ir-126': + case 'iso8859-7': + case 'iso88597': + case 'iso_8859-7': + case 'iso_8859-7:1987': + case 'sun_eu_greek': + return 'ISO-8859-7' + case 'csiso88598e': + case 'csisolatinhebrew': + case 'hebrew': + case 'iso-8859-8': + case 'iso-8859-8-e': + case 'iso-ir-138': + case 'iso8859-8': + case 'iso88598': + case 'iso_8859-8': + case 'iso_8859-8:1988': + case 'visual': + return 'ISO-8859-8' + case 'csiso88598i': + case 'iso-8859-8-i': + case 'logical': + return 'ISO-8859-8-I' + case 'csisolatin6': + case 'iso-8859-10': + case 'iso-ir-157': + case 'iso8859-10': + case 'iso885910': + case 'l6': + case 'latin6': + return 'ISO-8859-10' + case 'iso-8859-13': + case 'iso8859-13': + case 'iso885913': + return 'ISO-8859-13' + case 'iso-8859-14': + case 'iso8859-14': + case 'iso885914': + return 'ISO-8859-14' + case 'csisolatin9': + case 'iso-8859-15': + case 'iso8859-15': + case 'iso885915': + case 'iso_8859-15': + case 'l9': + return 'ISO-8859-15' + case 'iso-8859-16': + return 'ISO-8859-16' + case 'cskoi8r': + case 'koi': + case 'koi8': + case 'koi8-r': + case 'koi8_r': + return 'KOI8-R' + case 'koi8-ru': + case 'koi8-u': + return 'KOI8-U' + case 'csmacintosh': + case 'mac': + case 'macintosh': + case 'x-mac-roman': + return 'macintosh' + case 'iso-8859-11': + case 'iso8859-11': + case 'iso885911': + case 'tis-620': + case 'windows-874': + return 'windows-874' + case 'cp1250': + case 'windows-1250': + case 'x-cp1250': + return 'windows-1250' + case 'cp1251': + case 'windows-1251': + case 'x-cp1251': + return 'windows-1251' + case 'ansi_x3.4-1968': + case 'ascii': + case 'cp1252': + case 'cp819': + case 'csisolatin1': + case 'ibm819': + case 'iso-8859-1': + case 'iso-ir-100': + case 'iso8859-1': + case 'iso88591': + case 'iso_8859-1': + case 'iso_8859-1:1987': + case 'l1': + case 'latin1': + case 'us-ascii': + case 'windows-1252': + case 'x-cp1252': + return 'windows-1252' + case 'cp1253': + case 'windows-1253': + case 'x-cp1253': + return 'windows-1253' + case 'cp1254': + case 'csisolatin5': + case 'iso-8859-9': + case 'iso-ir-148': + case 'iso8859-9': + case 'iso88599': + case 'iso_8859-9': + case 'iso_8859-9:1989': + case 'l5': + case 'latin5': + case 'windows-1254': + case 'x-cp1254': + return 'windows-1254' + case 'cp1255': + case 'windows-1255': + case 'x-cp1255': + return 'windows-1255' + case 'cp1256': + case 'windows-1256': + case 'x-cp1256': + return 'windows-1256' + case 'cp1257': + case 'windows-1257': + case 'x-cp1257': + return 'windows-1257' + case 'cp1258': + case 'windows-1258': + case 'x-cp1258': + return 'windows-1258' + case 'x-mac-cyrillic': + case 'x-mac-ukrainian': + return 'x-mac-cyrillic' + case 'chinese': + case 'csgb2312': + case 'csiso58gb231280': + case 'gb2312': + case 'gb_2312': + case 'gb_2312-80': + case 'gbk': + case 'iso-ir-58': + case 'x-gbk': + return 'GBK' + case 'gb18030': + return 'gb18030' + case 'big5': + case 'big5-hkscs': + case 'cn-big5': + case 'csbig5': + case 'x-x-big5': + return 'Big5' + case 'cseucpkdfmtjapanese': + case 'euc-jp': + case 'x-euc-jp': + return 'EUC-JP' + case 'csiso2022jp': + case 'iso-2022-jp': + return 'ISO-2022-JP' + case 'csshiftjis': + case 'ms932': + case 'ms_kanji': + case 'shift-jis': + case 'shift_jis': + case 'sjis': + case 'windows-31j': + case 'x-sjis': + return 'Shift_JIS' + case 'cseuckr': + case 'csksc56011987': + case 'euc-kr': + case 'iso-ir-149': + case 'korean': + case 'ks_c_5601-1987': + case 'ks_c_5601-1989': + case 'ksc5601': + case 'ksc_5601': + case 'windows-949': + return 'EUC-KR' + case 'csiso2022kr': + case 'hz-gb-2312': + case 'iso-2022-cn': + case 'iso-2022-cn-ext': + case 'iso-2022-kr': + case 'replacement': + return 'replacement' + case 'unicodefffe': + case 'utf-16be': + return 'UTF-16BE' + case 'csunicode': + case 'iso-10646-ucs-2': + case 'ucs-2': + case 'unicode': + case 'unicodefeff': + case 'utf-16': + case 'utf-16le': + return 'UTF-16LE' + case 'x-user-defined': + return 'x-user-defined' + default: return 'failure' + } +} - // 2. Let header be a Structured Header whose value is a token. - let header = null +module.exports = { + getEncoding +} - // 3. Set header’s value to r’s mode. - header = httpRequest.mode - // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list. - httpRequest.headersList.set('sec-fetch-mode', header) +/***/ }), - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header - // TODO +/***/ 1446: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header - // TODO -} +"use strict"; -// https://fetch.spec.whatwg.org/#append-a-request-origin-header -function appendRequestOriginHeader (request) { - // 1. Let serializedOrigin be the result of byte-serializing a request origin with request. - let serializedOrigin = request.origin - // 2. If request’s response tainting is "cors" or request’s mode is "websocket", then append (`Origin`, serializedOrigin) to request’s header list. - if (request.responseTainting === 'cors' || request.mode === 'websocket') { - if (serializedOrigin) { - request.headersList.append('origin', serializedOrigin) - } +const { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent +} = __nccwpck_require__(87530) +const { + kState, + kError, + kResult, + kEvents, + kAborted +} = __nccwpck_require__(29054) +const { webidl } = __nccwpck_require__(21744) +const { kEnumerableProperty } = __nccwpck_require__(83983) - // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then: - } else if (request.method !== 'GET' && request.method !== 'HEAD') { - // 1. Switch on request’s referrer policy: - switch (request.referrerPolicy) { - case 'no-referrer': - // Set serializedOrigin to `null`. - serializedOrigin = null - break - case 'no-referrer-when-downgrade': - case 'strict-origin': - case 'strict-origin-when-cross-origin': - // If request’s origin is a tuple origin, its scheme is "https", and request’s current URL’s scheme is not "https", then set serializedOrigin to `null`. - if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { - serializedOrigin = null - } - break - case 'same-origin': - // If request’s origin is not same origin with request’s current URL’s origin, then set serializedOrigin to `null`. - if (!sameOrigin(request, requestCurrentURL(request))) { - serializedOrigin = null - } - break - default: - // Do nothing. - } +class FileReader extends EventTarget { + constructor () { + super() - if (serializedOrigin) { - // 2. Append (`Origin`, serializedOrigin) to request’s header list. - request.headersList.append('origin', serializedOrigin) + this[kState] = 'empty' + this[kResult] = null + this[kError] = null + this[kEvents] = { + loadend: null, + error: null, + abort: null, + load: null, + progress: null, + loadstart: null } } -} -function coarsenedSharedCurrentTime (crossOriginIsolatedCapability) { - // TODO - return performance.now() -} + /** + * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer + * @param {import('buffer').Blob} blob + */ + readAsArrayBuffer (blob) { + webidl.brandCheck(this, FileReader) -// https://fetch.spec.whatwg.org/#create-an-opaque-timing-info -function createOpaqueTimingInfo (timingInfo) { - return { - startTime: timingInfo.startTime ?? 0, - redirectStartTime: 0, - redirectEndTime: 0, - postRedirectStartTime: timingInfo.startTime ?? 0, - finalServiceWorkerStartTime: 0, - finalNetworkResponseStartTime: 0, - finalNetworkRequestStartTime: 0, - endTime: 0, - encodedBodySize: 0, - decodedBodySize: 0, - finalConnectionTimingInfo: null - } -} + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsArrayBuffer' }) -// https://html.spec.whatwg.org/multipage/origin.html#policy-container -function makePolicyContainer () { - // Note: the fetch spec doesn't make use of embedder policy or CSP list - return { - referrerPolicy: 'strict-origin-when-cross-origin' - } -} + blob = webidl.converters.Blob(blob, { strict: false }) -// https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container -function clonePolicyContainer (policyContainer) { - return { - referrerPolicy: policyContainer.referrerPolicy + // The readAsArrayBuffer(blob) method, when invoked, + // must initiate a read operation for blob with ArrayBuffer. + readOperation(this, blob, 'ArrayBuffer') } -} -// https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer -function determineRequestsReferrer (request) { - // 1. Let policy be request's referrer policy. - const policy = request.referrerPolicy + /** + * @see https://w3c.github.io/FileAPI/#readAsBinaryString + * @param {import('buffer').Blob} blob + */ + readAsBinaryString (blob) { + webidl.brandCheck(this, FileReader) - // Note: policy cannot (shouldn't) be null or an empty string. - assert(policy) + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsBinaryString' }) - // 2. Let environment be request’s client. + blob = webidl.converters.Blob(blob, { strict: false }) - let referrerSource = null + // The readAsBinaryString(blob) method, when invoked, + // must initiate a read operation for blob with BinaryString. + readOperation(this, blob, 'BinaryString') + } - // 3. Switch on request’s referrer: - if (request.referrer === 'client') { - // Note: node isn't a browser and doesn't implement document/iframes, - // so we bypass this step and replace it with our own. + /** + * @see https://w3c.github.io/FileAPI/#readAsDataText + * @param {import('buffer').Blob} blob + * @param {string?} encoding + */ + readAsText (blob, encoding = undefined) { + webidl.brandCheck(this, FileReader) - const globalOrigin = getGlobalOrigin() + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsText' }) - if (!globalOrigin || globalOrigin.origin === 'null') { - return 'no-referrer' + blob = webidl.converters.Blob(blob, { strict: false }) + + if (encoding !== undefined) { + encoding = webidl.converters.DOMString(encoding) } - // note: we need to clone it as it's mutated - referrerSource = new URL(globalOrigin) - } else if (request.referrer instanceof URL) { - // Let referrerSource be request’s referrer. - referrerSource = request.referrer + // The readAsText(blob, encoding) method, when invoked, + // must initiate a read operation for blob with Text and encoding. + readOperation(this, blob, 'Text', encoding) } - // 4. Let request’s referrerURL be the result of stripping referrerSource for - // use as a referrer. - let referrerURL = stripURLForReferrer(referrerSource) + /** + * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL + * @param {import('buffer').Blob} blob + */ + readAsDataURL (blob) { + webidl.brandCheck(this, FileReader) - // 5. Let referrerOrigin be the result of stripping referrerSource for use as - // a referrer, with the origin-only flag set to true. - const referrerOrigin = stripURLForReferrer(referrerSource, true) + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsDataURL' }) - // 6. If the result of serializing referrerURL is a string whose length is - // greater than 4096, set referrerURL to referrerOrigin. - if (referrerURL.toString().length > 4096) { - referrerURL = referrerOrigin + blob = webidl.converters.Blob(blob, { strict: false }) + + // The readAsDataURL(blob) method, when invoked, must + // initiate a read operation for blob with DataURL. + readOperation(this, blob, 'DataURL') } - const areSameOrigin = sameOrigin(request, referrerURL) - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && - !isURLPotentiallyTrustworthy(request.url) + /** + * @see https://w3c.github.io/FileAPI/#dfn-abort + */ + abort () { + // 1. If this's state is "empty" or if this's state is + // "done" set this's result to null and terminate + // this algorithm. + if (this[kState] === 'empty' || this[kState] === 'done') { + this[kResult] = null + return + } - // 8. Execute the switch statements corresponding to the value of policy: - switch (policy) { - case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true) - case 'unsafe-url': return referrerURL - case 'same-origin': - return areSameOrigin ? referrerOrigin : 'no-referrer' - case 'origin-when-cross-origin': - return areSameOrigin ? referrerURL : referrerOrigin - case 'strict-origin-when-cross-origin': { - const currentURL = requestCurrentURL(request) + // 2. If this's state is "loading" set this's state to + // "done" and set this's result to null. + if (this[kState] === 'loading') { + this[kState] = 'done' + this[kResult] = null + } - // 1. If the origin of referrerURL and the origin of request’s current - // URL are the same, then return referrerURL. - if (sameOrigin(referrerURL, currentURL)) { - return referrerURL - } + // 3. If there are any tasks from this on the file reading + // task source in an affiliated task queue, then remove + // those tasks from that task queue. + this[kAborted] = true - // 2. If referrerURL is a potentially trustworthy URL and request’s - // current URL is not a potentially trustworthy URL, then return no - // referrer. - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return 'no-referrer' - } + // 4. Terminate the algorithm for the read method being processed. + // TODO - // 3. Return referrerOrigin. - return referrerOrigin - } - case 'strict-origin': // eslint-disable-line - /** - * 1. If referrerURL is a potentially trustworthy URL and - * request’s current URL is not a potentially trustworthy URL, - * then return no referrer. - * 2. Return referrerOrigin - */ - case 'no-referrer-when-downgrade': // eslint-disable-line - /** - * 1. If referrerURL is a potentially trustworthy URL and - * request’s current URL is not a potentially trustworthy URL, - * then return no referrer. - * 2. Return referrerOrigin - */ + // 5. Fire a progress event called abort at this. + fireAProgressEvent('abort', this) - default: // eslint-disable-line - return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin + // 6. If this's state is not "loading", fire a progress + // event called loadend at this. + if (this[kState] !== 'loading') { + fireAProgressEvent('loadend', this) + } } -} -/** - * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url - * @param {URL} url - * @param {boolean|undefined} originOnly - */ -function stripURLForReferrer (url, originOnly) { - // 1. Assert: url is a URL. - assert(url instanceof URL) + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate + */ + get readyState () { + webidl.brandCheck(this, FileReader) - // 2. If url’s scheme is a local scheme, then return no referrer. - if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') { - return 'no-referrer' + switch (this[kState]) { + case 'empty': return this.EMPTY + case 'loading': return this.LOADING + case 'done': return this.DONE + } } - // 3. Set url’s username to the empty string. - url.username = '' - - // 4. Set url’s password to the empty string. - url.password = '' - - // 5. Set url’s fragment to null. - url.hash = '' - - // 6. If the origin-only flag is true, then: - if (originOnly) { - // 1. Set url’s path to « the empty string ». - url.pathname = '' + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-result + */ + get result () { + webidl.brandCheck(this, FileReader) - // 2. Set url’s query to null. - url.search = '' + // The result attribute’s getter, when invoked, must return + // this's result. + return this[kResult] } - // 7. Return url. - return url -} - -function isURLPotentiallyTrustworthy (url) { - if (!(url instanceof URL)) { - return false - } + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-error + */ + get error () { + webidl.brandCheck(this, FileReader) - // If child of about, return true - if (url.href === 'about:blank' || url.href === 'about:srcdoc') { - return true + // The error attribute’s getter, when invoked, must return + // this's error. + return this[kError] } - // If scheme is data, return true - if (url.protocol === 'data:') return true - - // If file, return true - if (url.protocol === 'file:') return true - - return isOriginPotentiallyTrustworthy(url.origin) + get onloadend () { + webidl.brandCheck(this, FileReader) - function isOriginPotentiallyTrustworthy (origin) { - // If origin is explicitly null, return false - if (origin == null || origin === 'null') return false + return this[kEvents].loadend + } - const originAsURL = new URL(origin) + set onloadend (fn) { + webidl.brandCheck(this, FileReader) - // If secure, return true - if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') { - return true + if (this[kEvents].loadend) { + this.removeEventListener('loadend', this[kEvents].loadend) } - // If localhost or variants, return true - if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || - (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) || - (originAsURL.hostname.endsWith('.localhost'))) { - return true + if (typeof fn === 'function') { + this[kEvents].loadend = fn + this.addEventListener('loadend', fn) + } else { + this[kEvents].loadend = null } - - // If any other, return false - return false - } -} - -/** - * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist - * @param {Uint8Array} bytes - * @param {string} metadataList - */ -function bytesMatch (bytes, metadataList) { - // If node is not built with OpenSSL support, we cannot check - // a request's integrity, so allow it by default (the spec will - // allow requests if an invalid hash is given, as precedence). - /* istanbul ignore if: only if node is built with --without-ssl */ - if (crypto === undefined) { - return true } - // 1. Let parsedMetadata be the result of parsing metadataList. - const parsedMetadata = parseMetadata(metadataList) - - // 2. If parsedMetadata is no metadata, return true. - if (parsedMetadata === 'no metadata') { - return true - } + get onerror () { + webidl.brandCheck(this, FileReader) - // 3. If parsedMetadata is the empty set, return true. - if (parsedMetadata.length === 0) { - return true + return this[kEvents].error } - // 4. Let metadata be the result of getting the strongest - // metadata from parsedMetadata. - const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)) - // get the strongest algorithm - const strongest = list[0].algo - // get all entries that use the strongest algorithm; ignore weaker - const metadata = list.filter((item) => item.algo === strongest) - - // 5. For each item in metadata: - for (const item of metadata) { - // 1. Let algorithm be the alg component of item. - const algorithm = item.algo - - // 2. Let expectedValue be the val component of item. - let expectedValue = item.hash - - // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e - // "be liberal with padding". This is annoying, and it's not even in the spec. + set onerror (fn) { + webidl.brandCheck(this, FileReader) - if (expectedValue.endsWith('==')) { - expectedValue = expectedValue.slice(0, -2) + if (this[kEvents].error) { + this.removeEventListener('error', this[kEvents].error) } - // 3. Let actualValue be the result of applying algorithm to bytes. - let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64') - - if (actualValue.endsWith('==')) { - actualValue = actualValue.slice(0, -2) + if (typeof fn === 'function') { + this[kEvents].error = fn + this.addEventListener('error', fn) + } else { + this[kEvents].error = null } + } - // 4. If actualValue is a case-sensitive match for expectedValue, - // return true. - if (actualValue === expectedValue) { - return true - } + get onloadstart () { + webidl.brandCheck(this, FileReader) - let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest('base64url') + return this[kEvents].loadstart + } - if (actualBase64URL.endsWith('==')) { - actualBase64URL = actualBase64URL.slice(0, -2) + set onloadstart (fn) { + webidl.brandCheck(this, FileReader) + + if (this[kEvents].loadstart) { + this.removeEventListener('loadstart', this[kEvents].loadstart) } - if (actualBase64URL === expectedValue) { - return true + if (typeof fn === 'function') { + this[kEvents].loadstart = fn + this.addEventListener('loadstart', fn) + } else { + this[kEvents].loadstart = null } } - // 6. Return false. - return false -} - -// https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options -// https://www.w3.org/TR/CSP2/#source-list-syntax -// https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 -const parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\x21-\x7e]?)?/i - -/** - * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata - * @param {string} metadata - */ -function parseMetadata (metadata) { - // 1. Let result be the empty set. - /** @type {{ algo: string, hash: string }[]} */ - const result = [] - - // 2. Let empty be equal to true. - let empty = true - - const supportedHashes = crypto.getHashes() + get onprogress () { + webidl.brandCheck(this, FileReader) - // 3. For each token returned by splitting metadata on spaces: - for (const token of metadata.split(' ')) { - // 1. Set empty to false. - empty = false + return this[kEvents].progress + } - // 2. Parse token as a hash-with-options. - const parsedToken = parseHashWithOptions.exec(token) + set onprogress (fn) { + webidl.brandCheck(this, FileReader) - // 3. If token does not parse, continue to the next token. - if (parsedToken === null || parsedToken.groups === undefined) { - // Note: Chromium blocks the request at this point, but Firefox - // gives a warning that an invalid integrity was given. The - // correct behavior is to ignore these, and subsequently not - // check the integrity of the resource. - continue + if (this[kEvents].progress) { + this.removeEventListener('progress', this[kEvents].progress) } - // 4. Let algorithm be the hash-algo component of token. - const algorithm = parsedToken.groups.algo - - // 5. If algorithm is a hash function recognized by the user - // agent, add the parsed token to result. - if (supportedHashes.includes(algorithm.toLowerCase())) { - result.push(parsedToken.groups) + if (typeof fn === 'function') { + this[kEvents].progress = fn + this.addEventListener('progress', fn) + } else { + this[kEvents].progress = null } } - // 4. Return no metadata if empty is true, otherwise return result. - if (empty === true) { - return 'no metadata' - } + get onload () { + webidl.brandCheck(this, FileReader) - return result -} + return this[kEvents].load + } -// https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request -function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { - // TODO -} + set onload (fn) { + webidl.brandCheck(this, FileReader) -/** - * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin} - * @param {URL} A - * @param {URL} B - */ -function sameOrigin (A, B) { - // 1. If A and B are the same opaque origin, then return true. - if (A.origin === B.origin && A.origin === 'null') { - return true - } + if (this[kEvents].load) { + this.removeEventListener('load', this[kEvents].load) + } - // 2. If A and B are both tuple origins and their schemes, - // hosts, and port are identical, then return true. - if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { - return true + if (typeof fn === 'function') { + this[kEvents].load = fn + this.addEventListener('load', fn) + } else { + this[kEvents].load = null + } } - // 3. Return false. - return false -} - -function createDeferredPromise () { - let res - let rej - const promise = new Promise((resolve, reject) => { - res = resolve - rej = reject - }) + get onabort () { + webidl.brandCheck(this, FileReader) - return { promise, resolve: res, reject: rej } -} + return this[kEvents].abort + } -function isAborted (fetchParams) { - return fetchParams.controller.state === 'aborted' -} + set onabort (fn) { + webidl.brandCheck(this, FileReader) -function isCancelled (fetchParams) { - return fetchParams.controller.state === 'aborted' || - fetchParams.controller.state === 'terminated' -} + if (this[kEvents].abort) { + this.removeEventListener('abort', this[kEvents].abort) + } -// https://fetch.spec.whatwg.org/#concept-method-normalize -function normalizeMethod (method) { - return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method) - ? method.toUpperCase() - : method + if (typeof fn === 'function') { + this[kEvents].abort = fn + this.addEventListener('abort', fn) + } else { + this[kEvents].abort = null + } + } } -// https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string -function serializeJavascriptValueToJSONString (value) { - // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »). - const result = JSON.stringify(value) +// https://w3c.github.io/FileAPI/#dom-filereader-empty +FileReader.EMPTY = FileReader.prototype.EMPTY = 0 +// https://w3c.github.io/FileAPI/#dom-filereader-loading +FileReader.LOADING = FileReader.prototype.LOADING = 1 +// https://w3c.github.io/FileAPI/#dom-filereader-done +FileReader.DONE = FileReader.prototype.DONE = 2 - // 2. If result is undefined, then throw a TypeError. - if (result === undefined) { - throw new TypeError('Value is not JSON serializable') +Object.defineProperties(FileReader.prototype, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors, + readAsArrayBuffer: kEnumerableProperty, + readAsBinaryString: kEnumerableProperty, + readAsText: kEnumerableProperty, + readAsDataURL: kEnumerableProperty, + abort: kEnumerableProperty, + readyState: kEnumerableProperty, + result: kEnumerableProperty, + error: kEnumerableProperty, + onloadstart: kEnumerableProperty, + onprogress: kEnumerableProperty, + onload: kEnumerableProperty, + onabort: kEnumerableProperty, + onerror: kEnumerableProperty, + onloadend: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'FileReader', + writable: false, + enumerable: false, + configurable: true } +}) - // 3. Assert: result is a string. - assert(typeof result === 'string') +Object.defineProperties(FileReader, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors +}) - // 4. Return result. - return result +module.exports = { + FileReader } -// https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object -const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())) -/** - * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object - * @param {() => unknown[]} iterator - * @param {string} name name of the instance - * @param {'key'|'value'|'key+value'} kind - */ -function makeIterator (iterator, name, kind) { - const object = { - index: 0, - kind, - target: iterator - } +/***/ }), - const i = { - next () { - // 1. Let interface be the interface for which the iterator prototype object exists. +/***/ 55504: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 2. Let thisValue be the this value. +"use strict"; - // 3. Let object be ? ToObject(thisValue). - // 4. If object is a platform object, then perform a security - // check, passing: +const { webidl } = __nccwpck_require__(21744) - // 5. If object is not a default iterator object for interface, - // then throw a TypeError. - if (Object.getPrototypeOf(this) !== i) { - throw new TypeError( - `'next' called on an object that does not implement interface ${name} Iterator.` - ) - } +const kState = Symbol('ProgressEvent state') - // 6. Let index be object’s index. - // 7. Let kind be object’s kind. - // 8. Let values be object’s target's value pairs to iterate over. - const { index, kind, target } = object - const values = target() +/** + * @see https://xhr.spec.whatwg.org/#progressevent + */ +class ProgressEvent extends Event { + constructor (type, eventInitDict = {}) { + type = webidl.converters.DOMString(type) + eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}) - // 9. Let len be the length of values. - const len = values.length + super(type, eventInitDict) - // 10. If index is greater than or equal to len, then return - // CreateIterResultObject(undefined, true). - if (index >= len) { - return { value: undefined, done: true } - } + this[kState] = { + lengthComputable: eventInitDict.lengthComputable, + loaded: eventInitDict.loaded, + total: eventInitDict.total + } + } - // 11. Let pair be the entry in values at index index. - const pair = values[index] + get lengthComputable () { + webidl.brandCheck(this, ProgressEvent) - // 12. Set object’s index to index + 1. - object.index = index + 1 + return this[kState].lengthComputable + } - // 13. Return the iterator result for pair and kind. - return iteratorResult(pair, kind) - }, - // The class string of an iterator prototype object for a given interface is the - // result of concatenating the identifier of the interface and the string " Iterator". - [Symbol.toStringTag]: `${name} Iterator` + get loaded () { + webidl.brandCheck(this, ProgressEvent) + + return this[kState].loaded } - // The [[Prototype]] internal slot of an iterator prototype object must be %IteratorPrototype%. - Object.setPrototypeOf(i, esIteratorPrototype) - // esIteratorPrototype needs to be the prototype of i - // which is the prototype of an empty object. Yes, it's confusing. - return Object.setPrototypeOf({}, i) -} + get total () { + webidl.brandCheck(this, ProgressEvent) -// https://webidl.spec.whatwg.org/#iterator-result -function iteratorResult (pair, kind) { - let result + return this[kState].total + } +} - // 1. Let result be a value determined by the value of kind: - switch (kind) { - case 'key': { - // 1. Let idlKey be pair’s key. - // 2. Let key be the result of converting idlKey to an - // ECMAScript value. - // 3. result is key. - result = pair[0] - break - } - case 'value': { - // 1. Let idlValue be pair’s value. - // 2. Let value be the result of converting idlValue to - // an ECMAScript value. - // 3. result is value. - result = pair[1] - break - } - case 'key+value': { - // 1. Let idlKey be pair’s key. - // 2. Let idlValue be pair’s value. - // 3. Let key be the result of converting idlKey to an - // ECMAScript value. - // 4. Let value be the result of converting idlValue to - // an ECMAScript value. - // 5. Let array be ! ArrayCreate(2). - // 6. Call ! CreateDataProperty(array, "0", key). - // 7. Call ! CreateDataProperty(array, "1", value). - // 8. result is array. - result = pair - break - } +webidl.converters.ProgressEventInit = webidl.dictionaryConverter([ + { + key: 'lengthComputable', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'loaded', + converter: webidl.converters['unsigned long long'], + defaultValue: 0 + }, + { + key: 'total', + converter: webidl.converters['unsigned long long'], + defaultValue: 0 + }, + { + key: 'bubbles', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'cancelable', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'composed', + converter: webidl.converters.boolean, + defaultValue: false } +]) - // 2. Return CreateIterResultObject(result, false). - return { value: result, done: false } +module.exports = { + ProgressEvent } -/** - * @see https://fetch.spec.whatwg.org/#body-fully-read - */ -async function fullyReadBody (body, processBody, processBodyError) { - // 1. If taskDestination is null, then set taskDestination to - // the result of starting a new parallel queue. - // 2. Let successSteps given a byte sequence bytes be to queue a - // fetch task to run processBody given bytes, with taskDestination. - const successSteps = processBody +/***/ }), - // 3. Let errorSteps be to queue a fetch task to run processBodyError, - // with taskDestination. - const errorSteps = processBodyError +/***/ 29054: +/***/ ((module) => { - // 4. Let reader be the result of getting a reader for body’s stream. - // If that threw an exception, then run errorSteps with that - // exception and return. - let reader +"use strict"; - try { - reader = body.stream.getReader() - } catch (e) { - errorSteps(e) - return - } - // 5. Read all bytes from reader, given successSteps and errorSteps. - try { - const result = await readAllBytes(reader) - successSteps(result) - } catch (e) { - errorSteps(e) - } +module.exports = { + kState: Symbol('FileReader state'), + kResult: Symbol('FileReader result'), + kError: Symbol('FileReader error'), + kLastProgressEventFired: Symbol('FileReader last progress event fired timestamp'), + kEvents: Symbol('FileReader events'), + kAborted: Symbol('FileReader aborted') } -/** @type {ReadableStream} */ -let ReadableStream = globalThis.ReadableStream -function isReadableStreamLike (stream) { - if (!ReadableStream) { - ReadableStream = (__nccwpck_require__(35356).ReadableStream) - } +/***/ }), - return stream instanceof ReadableStream || ( - stream[Symbol.toStringTag] === 'ReadableStream' && - typeof stream.tee === 'function' - ) -} +/***/ 87530: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const MAXIMUM_ARGUMENT_LENGTH = 65535 +"use strict"; -/** - * @see https://infra.spec.whatwg.org/#isomorphic-decode - * @param {number[]|Uint8Array} input - */ -function isomorphicDecode (input) { - // 1. To isomorphic decode a byte sequence input, return a string whose code point - // length is equal to input’s length and whose code points have the same values - // as the values of input’s bytes, in the same order. - if (input.length < MAXIMUM_ARGUMENT_LENGTH) { - return String.fromCharCode(...input) - } +const { + kState, + kError, + kResult, + kAborted, + kLastProgressEventFired +} = __nccwpck_require__(29054) +const { ProgressEvent } = __nccwpck_require__(55504) +const { getEncoding } = __nccwpck_require__(84854) +const { DOMException } = __nccwpck_require__(41037) +const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(685) +const { types } = __nccwpck_require__(73837) +const { StringDecoder } = __nccwpck_require__(71576) +const { btoa } = __nccwpck_require__(14300) - return input.reduce((previous, current) => previous + String.fromCharCode(current), '') +/** @type {PropertyDescriptor} */ +const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false } /** - * @param {ReadableStreamController} controller + * @see https://w3c.github.io/FileAPI/#readOperation + * @param {import('./filereader').FileReader} fr + * @param {import('buffer').Blob} blob + * @param {string} type + * @param {string?} encodingName */ -function readableStreamClose (controller) { - try { - controller.close() - } catch (err) { - // TODO: add comment explaining why this error occurs. - if (!err.message.includes('Controller is already closed')) { - throw err - } +function readOperation (fr, blob, type, encodingName) { + // 1. If fr’s state is "loading", throw an InvalidStateError + // DOMException. + if (fr[kState] === 'loading') { + throw new DOMException('Invalid state', 'InvalidStateError') } -} -/** - * @see https://infra.spec.whatwg.org/#isomorphic-encode - * @param {string} input - */ -function isomorphicEncode (input) { - // 1. Assert: input contains no code points greater than U+00FF. - for (let i = 0; i < input.length; i++) { - assert(input.charCodeAt(i) <= 0xFF) - } + // 2. Set fr’s state to "loading". + fr[kState] = 'loading' - // 2. Return a byte sequence whose length is equal to input’s code - // point length and whose bytes have the same values as the - // values of input’s code points, in the same order - return input -} + // 3. Set fr’s result to null. + fr[kResult] = null -/** - * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes - * @see https://streams.spec.whatwg.org/#read-loop - * @param {ReadableStreamDefaultReader} reader - */ -async function readAllBytes (reader) { + // 4. Set fr’s error to null. + fr[kError] = null + + // 5. Let stream be the result of calling get stream on blob. + /** @type {import('stream/web').ReadableStream} */ + const stream = blob.stream() + + // 6. Let reader be the result of getting a reader from stream. + const reader = stream.getReader() + + // 7. Let bytes be an empty byte sequence. + /** @type {Uint8Array[]} */ const bytes = [] - let byteLength = 0 - while (true) { - const { done, value: chunk } = await reader.read() + // 8. Let chunkPromise be the result of reading a chunk from + // stream with reader. + let chunkPromise = reader.read() + + // 9. Let isFirstChunk be true. + let isFirstChunk = true + + // 10. In parallel, while true: + // Note: "In parallel" just means non-blocking + // Note 2: readOperation itself cannot be async as double + // reading the body would then reject the promise, instead + // of throwing an error. + ;(async () => { + while (!fr[kAborted]) { + // 1. Wait for chunkPromise to be fulfilled or rejected. + try { + const { done, value } = await chunkPromise + + // 2. If chunkPromise is fulfilled, and isFirstChunk is + // true, queue a task to fire a progress event called + // loadstart at fr. + if (isFirstChunk && !fr[kAborted]) { + queueMicrotask(() => { + fireAProgressEvent('loadstart', fr) + }) + } + + // 3. Set isFirstChunk to false. + isFirstChunk = false + + // 4. If chunkPromise is fulfilled with an object whose + // done property is false and whose value property is + // a Uint8Array object, run these steps: + if (!done && types.isUint8Array(value)) { + // 1. Let bs be the byte sequence represented by the + // Uint8Array object. + + // 2. Append bs to bytes. + bytes.push(value) + + // 3. If roughly 50ms have passed since these steps + // were last invoked, queue a task to fire a + // progress event called progress at fr. + if ( + ( + fr[kLastProgressEventFired] === undefined || + Date.now() - fr[kLastProgressEventFired] >= 50 + ) && + !fr[kAborted] + ) { + fr[kLastProgressEventFired] = Date.now() + queueMicrotask(() => { + fireAProgressEvent('progress', fr) + }) + } + + // 4. Set chunkPromise to the result of reading a + // chunk from stream with reader. + chunkPromise = reader.read() + } else if (done) { + // 5. Otherwise, if chunkPromise is fulfilled with an + // object whose done property is true, queue a task + // to run the following steps and abort this algorithm: + queueMicrotask(() => { + // 1. Set fr’s state to "done". + fr[kState] = 'done' + + // 2. Let result be the result of package data given + // bytes, type, blob’s type, and encodingName. + try { + const result = packageData(bytes, type, blob.type, encodingName) + + // 4. Else: + + if (fr[kAborted]) { + return + } + + // 1. Set fr’s result to result. + fr[kResult] = result + + // 2. Fire a progress event called load at the fr. + fireAProgressEvent('load', fr) + } catch (error) { + // 3. If package data threw an exception error: - if (done) { - // 1. Call successSteps with bytes. - return Buffer.concat(bytes, byteLength) - } + // 1. Set fr’s error to error. + fr[kError] = error - // 1. If chunk is not a Uint8Array object, call failureSteps - // with a TypeError and abort these steps. - if (!isUint8Array(chunk)) { - throw new TypeError('Received non-Uint8Array chunk') - } + // 2. Fire a progress event called error at fr. + fireAProgressEvent('error', fr) + } - // 2. Append the bytes represented by chunk to bytes. - bytes.push(chunk) - byteLength += chunk.length + // 5. If fr’s state is not "loading", fire a progress + // event called loadend at the fr. + if (fr[kState] !== 'loading') { + fireAProgressEvent('loadend', fr) + } + }) - // 3. Read-loop given reader, bytes, successSteps, and failureSteps. - } -} + break + } + } catch (error) { + if (fr[kAborted]) { + return + } -/** - * @see https://fetch.spec.whatwg.org/#is-local - * @param {URL} url - */ -function urlIsLocal (url) { - assert('protocol' in url) // ensure it's a url object + // 6. Otherwise, if chunkPromise is rejected with an + // error error, queue a task to run the following + // steps and abort this algorithm: + queueMicrotask(() => { + // 1. Set fr’s state to "done". + fr[kState] = 'done' - const protocol = url.protocol + // 2. Set fr’s error to error. + fr[kError] = error - return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:' -} + // 3. Fire a progress event called error at fr. + fireAProgressEvent('error', fr) -/** - * @param {string|URL} url - */ -function urlHasHttpsScheme (url) { - if (typeof url === 'string') { - return url.startsWith('https:') - } + // 4. If fr’s state is not "loading", fire a progress + // event called loadend at fr. + if (fr[kState] !== 'loading') { + fireAProgressEvent('loadend', fr) + } + }) - return url.protocol === 'https:' + break + } + } + })() } /** - * @see https://fetch.spec.whatwg.org/#http-scheme - * @param {URL} url + * @see https://w3c.github.io/FileAPI/#fire-a-progress-event + * @see https://dom.spec.whatwg.org/#concept-event-fire + * @param {string} e The name of the event + * @param {import('./filereader').FileReader} reader */ -function urlIsHttpHttpsScheme (url) { - assert('protocol' in url) // ensure it's a url object - - const protocol = url.protocol +function fireAProgressEvent (e, reader) { + // The progress event e does not bubble. e.bubbles must be false + // The progress event e is NOT cancelable. e.cancelable must be false + const event = new ProgressEvent(e, { + bubbles: false, + cancelable: false + }) - return protocol === 'http:' || protocol === 'https:' + reader.dispatchEvent(event) } /** - * Fetch supports node >= 16.8.0, but Object.hasOwn was added in v16.9.0. + * @see https://w3c.github.io/FileAPI/#blob-package-data + * @param {Uint8Array[]} bytes + * @param {string} type + * @param {string?} mimeType + * @param {string?} encodingName */ -const hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)) - -module.exports = { - isAborted, - isCancelled, - createDeferredPromise, - ReadableStreamFrom, - toUSVString, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - coarsenedSharedCurrentTime, - determineRequestsReferrer, - makePolicyContainer, - clonePolicyContainer, - appendFetchMetadata, - appendRequestOriginHeader, - TAOCheck, - corsCheck, - crossOriginResourcePolicyCheck, - createOpaqueTimingInfo, - setRequestReferrerPolicyOnRedirect, - isValidHTTPToken, - requestBadPort, - requestCurrentURL, - responseURL, - responseLocationURL, - isBlobLike, - isURLPotentiallyTrustworthy, - isValidReasonPhrase, - sameOrigin, - normalizeMethod, - serializeJavascriptValueToJSONString, - makeIterator, - isValidHeaderName, - isValidHeaderValue, - hasOwn, - isErrorLike, - fullyReadBody, - bytesMatch, - isReadableStreamLike, - readableStreamClose, - isomorphicEncode, - isomorphicDecode, - urlIsLocal, - urlHasHttpsScheme, - urlIsHttpHttpsScheme, - readAllBytes -} - - -/***/ }), +function packageData (bytes, type, mimeType, encodingName) { + // 1. A Blob has an associated package data algorithm, given + // bytes, a type, a optional mimeType, and a optional + // encodingName, which switches on type and runs the + // associated steps: -/***/ 21744: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + switch (type) { + case 'DataURL': { + // 1. Return bytes as a DataURL [RFC2397] subject to + // the considerations below: + // * Use mimeType as part of the Data URL if it is + // available in keeping with the Data URL + // specification [RFC2397]. + // * If mimeType is not available return a Data URL + // without a media-type. [RFC2397]. -"use strict"; + // https://datatracker.ietf.org/doc/html/rfc2397#section-3 + // dataurl := "data:" [ mediatype ] [ ";base64" ] "," data + // mediatype := [ type "/" subtype ] *( ";" parameter ) + // data := *urlchar + // parameter := attribute "=" value + let dataURL = 'data:' + const parsed = parseMIMEType(mimeType || 'application/octet-stream') -const { types } = __nccwpck_require__(73837) -const { hasOwn, toUSVString } = __nccwpck_require__(52538) + if (parsed !== 'failure') { + dataURL += serializeAMimeType(parsed) + } -/** @type {import('../../types/webidl').Webidl} */ -const webidl = {} -webidl.converters = {} -webidl.util = {} -webidl.errors = {} + dataURL += ';base64,' -webidl.errors.exception = function (message) { - return new TypeError(`${message.header}: ${message.message}`) -} + const decoder = new StringDecoder('latin1') -webidl.errors.conversionFailed = function (context) { - const plural = context.types.length === 1 ? '' : ' one of' - const message = - `${context.argument} could not be converted to` + - `${plural}: ${context.types.join(', ')}.` + for (const chunk of bytes) { + dataURL += btoa(decoder.write(chunk)) + } - return webidl.errors.exception({ - header: context.prefix, - message - }) -} + dataURL += btoa(decoder.end()) -webidl.errors.invalidArgument = function (context) { - return webidl.errors.exception({ - header: context.prefix, - message: `"${context.value}" is an invalid ${context.type}.` - }) -} + return dataURL + } + case 'Text': { + // 1. Let encoding be failure + let encoding = 'failure' -// https://webidl.spec.whatwg.org/#implements -webidl.brandCheck = function (V, I, opts = undefined) { - if (opts?.strict !== false && !(V instanceof I)) { - throw new TypeError('Illegal invocation') - } else { - return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag] - } -} + // 2. If the encodingName is present, set encoding to the + // result of getting an encoding from encodingName. + if (encodingName) { + encoding = getEncoding(encodingName) + } -webidl.argumentLengthCheck = function ({ length }, min, ctx) { - if (length < min) { - throw webidl.errors.exception({ - message: `${min} argument${min !== 1 ? 's' : ''} required, ` + - `but${length ? ' only' : ''} ${length} found.`, - ...ctx - }) - } -} + // 3. If encoding is failure, and mimeType is present: + if (encoding === 'failure' && mimeType) { + // 1. Let type be the result of parse a MIME type + // given mimeType. + const type = parseMIMEType(mimeType) -webidl.illegalConstructor = function () { - throw webidl.errors.exception({ - header: 'TypeError', - message: 'Illegal constructor' - }) -} + // 2. If type is not failure, set encoding to the result + // of getting an encoding from type’s parameters["charset"]. + if (type !== 'failure') { + encoding = getEncoding(type.parameters.get('charset')) + } + } -// https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values -webidl.util.Type = function (V) { - switch (typeof V) { - case 'undefined': return 'Undefined' - case 'boolean': return 'Boolean' - case 'string': return 'String' - case 'symbol': return 'Symbol' - case 'number': return 'Number' - case 'bigint': return 'BigInt' - case 'function': - case 'object': { - if (V === null) { - return 'Null' + // 4. If encoding is failure, then set encoding to UTF-8. + if (encoding === 'failure') { + encoding = 'UTF-8' } - return 'Object' + // 5. Decode bytes using fallback encoding encoding, and + // return the result. + return decode(bytes, encoding) } - } -} - -// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint -webidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) { - let upperBound - let lowerBound - - // 1. If bitLength is 64, then: - if (bitLength === 64) { - // 1. Let upperBound be 2^53 − 1. - upperBound = Math.pow(2, 53) - 1 + case 'ArrayBuffer': { + // Return a new ArrayBuffer whose contents are bytes. + const sequence = combineByteSequences(bytes) - // 2. If signedness is "unsigned", then let lowerBound be 0. - if (signedness === 'unsigned') { - lowerBound = 0 - } else { - // 3. Otherwise let lowerBound be −2^53 + 1. - lowerBound = Math.pow(-2, 53) + 1 + return sequence.buffer } - } else if (signedness === 'unsigned') { - // 2. Otherwise, if signedness is "unsigned", then: + case 'BinaryString': { + // Return bytes as a binary string, in which every byte + // is represented by a code unit of equal value [0..255]. + let binaryString = '' - // 1. Let lowerBound be 0. - lowerBound = 0 + const decoder = new StringDecoder('latin1') - // 2. Let upperBound be 2^bitLength − 1. - upperBound = Math.pow(2, bitLength) - 1 - } else { - // 3. Otherwise: + for (const chunk of bytes) { + binaryString += decoder.write(chunk) + } - // 1. Let lowerBound be -2^bitLength − 1. - lowerBound = Math.pow(-2, bitLength) - 1 + binaryString += decoder.end() - // 2. Let upperBound be 2^bitLength − 1 − 1. - upperBound = Math.pow(2, bitLength - 1) - 1 + return binaryString + } } +} - // 4. Let x be ? ToNumber(V). - let x = Number(V) - - // 5. If x is −0, then set x to +0. - if (x === 0) { - x = 0 - } +/** + * @see https://encoding.spec.whatwg.org/#decode + * @param {Uint8Array[]} ioQueue + * @param {string} encoding + */ +function decode (ioQueue, encoding) { + const bytes = combineByteSequences(ioQueue) - // 6. If the conversion is to an IDL type associated - // with the [EnforceRange] extended attribute, then: - if (opts.enforceRange === true) { - // 1. If x is NaN, +∞, or −∞, then throw a TypeError. - if ( - Number.isNaN(x) || - x === Number.POSITIVE_INFINITY || - x === Number.NEGATIVE_INFINITY - ) { - throw webidl.errors.exception({ - header: 'Integer conversion', - message: `Could not convert ${V} to an integer.` - }) - } + // 1. Let BOMEncoding be the result of BOM sniffing ioQueue. + const BOMEncoding = BOMSniffing(bytes) - // 2. Set x to IntegerPart(x). - x = webidl.util.IntegerPart(x) + let slice = 0 - // 3. If x < lowerBound or x > upperBound, then - // throw a TypeError. - if (x < lowerBound || x > upperBound) { - throw webidl.errors.exception({ - header: 'Integer conversion', - message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` - }) - } + // 2. If BOMEncoding is non-null: + if (BOMEncoding !== null) { + // 1. Set encoding to BOMEncoding. + encoding = BOMEncoding - // 4. Return x. - return x + // 2. Read three bytes from ioQueue, if BOMEncoding is + // UTF-8; otherwise read two bytes. + // (Do nothing with those bytes.) + slice = BOMEncoding === 'UTF-8' ? 3 : 2 } - // 7. If x is not NaN and the conversion is to an IDL - // type associated with the [Clamp] extended - // attribute, then: - if (!Number.isNaN(x) && opts.clamp === true) { - // 1. Set x to min(max(x, lowerBound), upperBound). - x = Math.min(Math.max(x, lowerBound), upperBound) - - // 2. Round x to the nearest integer, choosing the - // even integer if it lies halfway between two, - // and choosing +0 rather than −0. - if (Math.floor(x) % 2 === 0) { - x = Math.floor(x) - } else { - x = Math.ceil(x) - } - - // 3. Return x. - return x - } + // 3. Process a queue with an instance of encoding’s + // decoder, ioQueue, output, and "replacement". - // 8. If x is NaN, +0, +∞, or −∞, then return +0. - if ( - Number.isNaN(x) || - (x === 0 && Object.is(0, x)) || - x === Number.POSITIVE_INFINITY || - x === Number.NEGATIVE_INFINITY - ) { - return 0 - } + // 4. Return output. - // 9. Set x to IntegerPart(x). - x = webidl.util.IntegerPart(x) + const sliced = bytes.slice(slice) + return new TextDecoder(encoding).decode(sliced) +} - // 10. Set x to x modulo 2^bitLength. - x = x % Math.pow(2, bitLength) +/** + * @see https://encoding.spec.whatwg.org/#bom-sniff + * @param {Uint8Array} ioQueue + */ +function BOMSniffing (ioQueue) { + // 1. Let BOM be the result of peeking 3 bytes from ioQueue, + // converted to a byte sequence. + const [a, b, c] = ioQueue - // 11. If signedness is "signed" and x ≥ 2^bitLength − 1, - // then return x − 2^bitLength. - if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) { - return x - Math.pow(2, bitLength) + // 2. For each of the rows in the table below, starting with + // the first one and going down, if BOM starts with the + // bytes given in the first column, then return the + // encoding given in the cell in the second column of that + // row. Otherwise, return null. + if (a === 0xEF && b === 0xBB && c === 0xBF) { + return 'UTF-8' + } else if (a === 0xFE && b === 0xFF) { + return 'UTF-16BE' + } else if (a === 0xFF && b === 0xFE) { + return 'UTF-16LE' } - // 12. Otherwise, return x. - return x + return null } -// https://webidl.spec.whatwg.org/#abstract-opdef-integerpart -webidl.util.IntegerPart = function (n) { - // 1. Let r be floor(abs(n)). - const r = Math.floor(Math.abs(n)) +/** + * @param {Uint8Array[]} sequences + */ +function combineByteSequences (sequences) { + const size = sequences.reduce((a, b) => { + return a + b.byteLength + }, 0) - // 2. If n < 0, then return -1 × r. - if (n < 0) { - return -1 * r - } + let offset = 0 - // 3. Otherwise, return r. - return r + return sequences.reduce((a, b) => { + a.set(b, offset) + offset += b.byteLength + return a + }, new Uint8Array(size)) } -// https://webidl.spec.whatwg.org/#es-sequence -webidl.sequenceConverter = function (converter) { - return (V) => { - // 1. If Type(V) is not Object, throw a TypeError. - if (webidl.util.Type(V) !== 'Object') { - throw webidl.errors.exception({ - header: 'Sequence', - message: `Value of type ${webidl.util.Type(V)} is not an Object.` - }) - } +module.exports = { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent +} - // 2. Let method be ? GetMethod(V, @@iterator). - /** @type {Generator} */ - const method = V?.[Symbol.iterator]?.() - const seq = [] - // 3. If method is undefined, throw a TypeError. - if ( - method === undefined || - typeof method.next !== 'function' - ) { - throw webidl.errors.exception({ - header: 'Sequence', - message: 'Object is not an iterator.' - }) - } +/***/ }), - // https://webidl.spec.whatwg.org/#create-sequence-from-iterable - while (true) { - const { done, value } = method.next() +/***/ 21892: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (done) { - break - } +"use strict"; - seq.push(converter(value)) - } - return seq +// We include a version number for the Dispatcher API. In case of breaking changes, +// this version number must be increased to avoid conflicts. +const globalDispatcher = Symbol.for('undici.globalDispatcher.1') +const { InvalidArgumentError } = __nccwpck_require__(48045) +const Agent = __nccwpck_require__(7890) + +if (getGlobalDispatcher() === undefined) { + setGlobalDispatcher(new Agent()) +} + +function setGlobalDispatcher (agent) { + if (!agent || typeof agent.dispatch !== 'function') { + throw new InvalidArgumentError('Argument agent must implement Agent') } + Object.defineProperty(globalThis, globalDispatcher, { + value: agent, + writable: true, + enumerable: false, + configurable: false + }) } -// https://webidl.spec.whatwg.org/#es-to-record -webidl.recordConverter = function (keyConverter, valueConverter) { - return (O) => { - // 1. If Type(O) is not Object, throw a TypeError. - if (webidl.util.Type(O) !== 'Object') { - throw webidl.errors.exception({ - header: 'Record', - message: `Value of type ${webidl.util.Type(O)} is not an Object.` - }) - } +function getGlobalDispatcher () { + return globalThis[globalDispatcher] +} - // 2. Let result be a new empty instance of record. - const result = {} +module.exports = { + setGlobalDispatcher, + getGlobalDispatcher +} - if (!types.isProxy(O)) { - // Object.keys only returns enumerable properties - const keys = Object.keys(O) - for (const key of keys) { - // 1. Let typedKey be key converted to an IDL value of type K. - const typedKey = keyConverter(key) +/***/ }), - // 2. Let value be ? Get(O, key). - // 3. Let typedValue be value converted to an IDL value of type V. - const typedValue = valueConverter(O[key]) +/***/ 46930: +/***/ ((module) => { - // 4. Set result[typedKey] to typedValue. - result[typedKey] = typedValue - } +"use strict"; - // 5. Return result. - return result - } - // 3. Let keys be ? O.[[OwnPropertyKeys]](). - const keys = Reflect.ownKeys(O) +module.exports = class DecoratorHandler { + constructor (handler) { + this.handler = handler + } - // 4. For each key of keys. - for (const key of keys) { - // 1. Let desc be ? O.[[GetOwnProperty]](key). - const desc = Reflect.getOwnPropertyDescriptor(O, key) + onConnect (...args) { + return this.handler.onConnect(...args) + } - // 2. If desc is not undefined and desc.[[Enumerable]] is true: - if (desc?.enumerable) { - // 1. Let typedKey be key converted to an IDL value of type K. - const typedKey = keyConverter(key) + onError (...args) { + return this.handler.onError(...args) + } - // 2. Let value be ? Get(O, key). - // 3. Let typedValue be value converted to an IDL value of type V. - const typedValue = valueConverter(O[key]) + onUpgrade (...args) { + return this.handler.onUpgrade(...args) + } - // 4. Set result[typedKey] to typedValue. - result[typedKey] = typedValue - } - } + onHeaders (...args) { + return this.handler.onHeaders(...args) + } - // 5. Return result. - return result + onData (...args) { + return this.handler.onData(...args) } -} -webidl.interfaceConverter = function (i) { - return (V, opts = {}) => { - if (opts.strict !== false && !(V instanceof i)) { - throw webidl.errors.exception({ - header: i.name, - message: `Expected ${V} to be an instance of ${i.name}.` - }) - } + onComplete (...args) { + return this.handler.onComplete(...args) + } - return V + onBodySent (...args) { + return this.handler.onBodySent(...args) } } -webidl.dictionaryConverter = function (converters) { - return (dictionary) => { - const type = webidl.util.Type(dictionary) - const dict = {} - if (type === 'Null' || type === 'Undefined') { - return dict - } else if (type !== 'Object') { - throw webidl.errors.exception({ - header: 'Dictionary', - message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` - }) - } +/***/ }), - for (const options of converters) { - const { key, defaultValue, required, converter } = options +/***/ 72860: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (required === true) { - if (!hasOwn(dictionary, key)) { - throw webidl.errors.exception({ - header: 'Dictionary', - message: `Missing required key "${key}".` - }) - } - } +"use strict"; - let value = dictionary[key] - const hasDefault = hasOwn(options, 'defaultValue') - // Only use defaultValue if value is undefined and - // a defaultValue options was provided. - if (hasDefault && value !== null) { - value = value ?? defaultValue - } +const util = __nccwpck_require__(83983) +const { kBodyUsed } = __nccwpck_require__(72785) +const assert = __nccwpck_require__(39491) +const { InvalidArgumentError } = __nccwpck_require__(48045) +const EE = __nccwpck_require__(82361) - // A key can be optional and have no default value. - // When this happens, do not perform a conversion, - // and do not assign the key a value. - if (required || hasDefault || value !== undefined) { - value = converter(value) +const redirectableStatusCodes = [300, 301, 302, 303, 307, 308] - if ( - options.allowedValues && - !options.allowedValues.includes(value) - ) { - throw webidl.errors.exception({ - header: 'Dictionary', - message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.` - }) - } +const kBody = Symbol('body') - dict[key] = value - } - } +class BodyAsyncIterable { + constructor (body) { + this[kBody] = body + this[kBodyUsed] = false + } - return dict + async * [Symbol.asyncIterator] () { + assert(!this[kBodyUsed], 'disturbed') + this[kBodyUsed] = true + yield * this[kBody] } } -webidl.nullableConverter = function (converter) { - return (V) => { - if (V === null) { - return V +class RedirectHandler { + constructor (dispatch, maxRedirections, opts, handler) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') } - return converter(V) - } -} + util.validateHandler(handler, opts.method, opts.upgrade) -// https://webidl.spec.whatwg.org/#es-DOMString -webidl.converters.DOMString = function (V, opts = {}) { - // 1. If V is null and the conversion is to an IDL type - // associated with the [LegacyNullToEmptyString] - // extended attribute, then return the DOMString value - // that represents the empty string. - if (V === null && opts.legacyNullToEmptyString) { - return '' + this.dispatch = dispatch + this.location = null + this.abort = null + this.opts = { ...opts, maxRedirections: 0 } // opts must be a copy + this.maxRedirections = maxRedirections + this.handler = handler + this.history = [] + + if (util.isStream(this.opts.body)) { + // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp + // so that it can be dispatched again? + // TODO (fix): Do we need 100-expect support to provide a way to do this properly? + if (util.bodyLength(this.opts.body) === 0) { + this.opts.body + .on('data', function () { + assert(false) + }) + } + + if (typeof this.opts.body.readableDidRead !== 'boolean') { + this.opts.body[kBodyUsed] = false + EE.prototype.on.call(this.opts.body, 'data', function () { + this[kBodyUsed] = true + }) + } + } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') { + // TODO (fix): We can't access ReadableStream internal state + // to determine whether or not it has been disturbed. This is just + // a workaround. + this.opts.body = new BodyAsyncIterable(this.opts.body) + } else if ( + this.opts.body && + typeof this.opts.body !== 'string' && + !ArrayBuffer.isView(this.opts.body) && + util.isIterable(this.opts.body) + ) { + // TODO: Should we allow re-using iterable if !this.opts.idempotent + // or through some other flag? + this.opts.body = new BodyAsyncIterable(this.opts.body) + } } - // 2. Let x be ? ToString(V). - if (typeof V === 'symbol') { - throw new TypeError('Could not convert argument of type symbol to string.') + onConnect (abort) { + this.abort = abort + this.handler.onConnect(abort, { history: this.history }) } - // 3. Return the IDL DOMString value that represents the - // same sequence of code units as the one the - // ECMAScript String value x represents. - return String(V) -} + onUpgrade (statusCode, headers, socket) { + this.handler.onUpgrade(statusCode, headers, socket) + } -// https://webidl.spec.whatwg.org/#es-ByteString -webidl.converters.ByteString = function (V) { - // 1. Let x be ? ToString(V). - // Note: DOMString converter perform ? ToString(V) - const x = webidl.converters.DOMString(V) + onError (error) { + this.handler.onError(error) + } - // 2. If the value of any element of x is greater than - // 255, then throw a TypeError. - for (let index = 0; index < x.length; index++) { - const charCode = x.charCodeAt(index) + onHeaders (statusCode, headers, resume, statusText) { + this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) + ? null + : parseLocation(statusCode, headers) - if (charCode > 255) { - throw new TypeError( - 'Cannot convert argument to a ByteString because the character at ' + - `index ${index} has a value of ${charCode} which is greater than 255.` - ) + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)) } - } - // 3. Return an IDL ByteString value whose length is the - // length of x, and where the value of each element is - // the value of the corresponding element of x. - return x -} + if (!this.location) { + return this.handler.onHeaders(statusCode, headers, resume, statusText) + } -// https://webidl.spec.whatwg.org/#es-USVString -webidl.converters.USVString = toUSVString + const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))) + const path = search ? `${pathname}${search}` : pathname -// https://webidl.spec.whatwg.org/#es-boolean -webidl.converters.boolean = function (V) { - // 1. Let x be the result of computing ToBoolean(V). - const x = Boolean(V) + // Remove headers referring to the original URL. + // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers. + // https://tools.ietf.org/html/rfc7231#section-6.4 + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin) + this.opts.path = path + this.opts.origin = origin + this.opts.maxRedirections = 0 + this.opts.query = null - // 2. Return the IDL boolean value that is the one that represents - // the same truth value as the ECMAScript Boolean value x. - return x -} + // https://tools.ietf.org/html/rfc7231#section-6.4.4 + // In case of HTTP 303, always replace method to be either HEAD or GET + if (statusCode === 303 && this.opts.method !== 'HEAD') { + this.opts.method = 'GET' + this.opts.body = null + } + } -// https://webidl.spec.whatwg.org/#es-any -webidl.converters.any = function (V) { - return V -} + onData (chunk) { + if (this.location) { + /* + https://tools.ietf.org/html/rfc7231#section-6.4 -// https://webidl.spec.whatwg.org/#es-long-long -webidl.converters['long long'] = function (V) { - // 1. Let x be ? ConvertToInt(V, 64, "signed"). - const x = webidl.util.ConvertToInt(V, 64, 'signed') + TLDR: undici always ignores 3xx response bodies. - // 2. Return the IDL long long value that represents - // the same numeric value as x. - return x -} + Redirection is used to serve the requested resource from another URL, so it is assumes that + no body is generated (and thus can be ignored). Even though generating a body is not prohibited. -// https://webidl.spec.whatwg.org/#es-unsigned-long-long -webidl.converters['unsigned long long'] = function (V) { - // 1. Let x be ? ConvertToInt(V, 64, "unsigned"). - const x = webidl.util.ConvertToInt(V, 64, 'unsigned') + For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually + (which means it's optional and not mandated) contain just an hyperlink to the value of + the Location response header, so the body can be ignored safely. - // 2. Return the IDL unsigned long long value that - // represents the same numeric value as x. - return x -} + For status 300, which is "Multiple Choices", the spec mentions both generating a Location + response header AND a response body with the other possible location to follow. + Since the spec explicitily chooses not to specify a format for such body and leave it to + servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it. + */ + } else { + return this.handler.onData(chunk) + } + } -// https://webidl.spec.whatwg.org/#es-unsigned-long -webidl.converters['unsigned long'] = function (V) { - // 1. Let x be ? ConvertToInt(V, 32, "unsigned"). - const x = webidl.util.ConvertToInt(V, 32, 'unsigned') + onComplete (trailers) { + if (this.location) { + /* + https://tools.ietf.org/html/rfc7231#section-6.4 - // 2. Return the IDL unsigned long value that - // represents the same numeric value as x. - return x -} + TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections + and neither are useful if present. -// https://webidl.spec.whatwg.org/#es-unsigned-short -webidl.converters['unsigned short'] = function (V, opts) { - // 1. Let x be ? ConvertToInt(V, 16, "unsigned"). - const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts) + See comment on onData method above for more detailed informations. + */ - // 2. Return the IDL unsigned short value that represents - // the same numeric value as x. - return x -} + this.location = null + this.abort = null -// https://webidl.spec.whatwg.org/#idl-ArrayBuffer -webidl.converters.ArrayBuffer = function (V, opts = {}) { - // 1. If Type(V) is not Object, or V does not have an - // [[ArrayBufferData]] internal slot, then throw a - // TypeError. - // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances - // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances - if ( - webidl.util.Type(V) !== 'Object' || - !types.isAnyArrayBuffer(V) - ) { - throw webidl.errors.conversionFailed({ - prefix: `${V}`, - argument: `${V}`, - types: ['ArrayBuffer'] - }) + this.dispatch(this.opts, this) + } else { + this.handler.onComplete(trailers) + } } - // 2. If the conversion is not to an IDL type associated - // with the [AllowShared] extended attribute, and - // IsSharedArrayBuffer(V) is true, then throw a - // TypeError. - if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { - throw webidl.errors.exception({ - header: 'ArrayBuffer', - message: 'SharedArrayBuffer is not allowed.' - }) + onBodySent (chunk) { + if (this.handler.onBodySent) { + this.handler.onBodySent(chunk) + } } - - // 3. If the conversion is not to an IDL type associated - // with the [AllowResizable] extended attribute, and - // IsResizableArrayBuffer(V) is true, then throw a - // TypeError. - // Note: resizable ArrayBuffers are currently a proposal. - - // 4. Return the IDL ArrayBuffer value that is a - // reference to the same object as V. - return V } -webidl.converters.TypedArray = function (V, T, opts = {}) { - // 1. Let T be the IDL type V is being converted to. - - // 2. If Type(V) is not Object, or V does not have a - // [[TypedArrayName]] internal slot with a value - // equal to T’s name, then throw a TypeError. - if ( - webidl.util.Type(V) !== 'Object' || - !types.isTypedArray(V) || - V.constructor.name !== T.name - ) { - throw webidl.errors.conversionFailed({ - prefix: `${T.name}`, - argument: `${V}`, - types: [T.name] - }) +function parseLocation (statusCode, headers) { + if (redirectableStatusCodes.indexOf(statusCode) === -1) { + return null } - // 3. If the conversion is not to an IDL type associated - // with the [AllowShared] extended attribute, and - // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is - // true, then throw a TypeError. - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: 'ArrayBuffer', - message: 'SharedArrayBuffer is not allowed.' - }) + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].toString().toLowerCase() === 'location') { + return headers[i + 1] + } } - - // 4. If the conversion is not to an IDL type associated - // with the [AllowResizable] extended attribute, and - // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is - // true, then throw a TypeError. - // Note: resizable array buffers are currently a proposal - - // 5. Return the IDL value of type T that is a reference - // to the same object as V. - return V } -webidl.converters.DataView = function (V, opts = {}) { - // 1. If Type(V) is not Object, or V does not have a - // [[DataView]] internal slot, then throw a TypeError. - if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) { - throw webidl.errors.exception({ - header: 'DataView', - message: 'Object is not a DataView.' - }) - } +// https://tools.ietf.org/html/rfc7231#section-6.4.4 +function shouldRemoveHeader (header, removeContent, unknownOrigin) { + return ( + (header.length === 4 && header.toString().toLowerCase() === 'host') || + (removeContent && header.toString().toLowerCase().indexOf('content-') === 0) || + (unknownOrigin && header.length === 13 && header.toString().toLowerCase() === 'authorization') || + (unknownOrigin && header.length === 6 && header.toString().toLowerCase() === 'cookie') + ) +} - // 2. If the conversion is not to an IDL type associated - // with the [AllowShared] extended attribute, and - // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true, - // then throw a TypeError. - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: 'ArrayBuffer', - message: 'SharedArrayBuffer is not allowed.' - }) +// https://tools.ietf.org/html/rfc7231#section-6.4 +function cleanRequestHeaders (headers, removeContent, unknownOrigin) { + const ret = [] + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { + ret.push(headers[i], headers[i + 1]) + } + } + } else if (headers && typeof headers === 'object') { + for (const key of Object.keys(headers)) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, headers[key]) + } + } + } else { + assert(headers == null, 'headers must be an object or an array') } + return ret +} - // 3. If the conversion is not to an IDL type associated - // with the [AllowResizable] extended attribute, and - // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is - // true, then throw a TypeError. - // Note: resizable ArrayBuffers are currently a proposal +module.exports = RedirectHandler - // 4. Return the IDL DataView value that is a reference - // to the same object as V. - return V -} -// https://webidl.spec.whatwg.org/#BufferSource -webidl.converters.BufferSource = function (V, opts = {}) { - if (types.isAnyArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, opts) - } +/***/ }), - if (types.isTypedArray(V)) { - return webidl.converters.TypedArray(V, V.constructor) - } +/***/ 38861: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (types.isDataView(V)) { - return webidl.converters.DataView(V, opts) - } +"use strict"; - throw new TypeError(`Could not convert ${V} to a BufferSource.`) -} -webidl.converters['sequence'] = webidl.sequenceConverter( - webidl.converters.ByteString -) +const RedirectHandler = __nccwpck_require__(72860) -webidl.converters['sequence>'] = webidl.sequenceConverter( - webidl.converters['sequence'] -) +function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { + return (dispatch) => { + return function Intercept (opts, handler) { + const { maxRedirections = defaultMaxRedirections } = opts -webidl.converters['record'] = webidl.recordConverter( - webidl.converters.ByteString, - webidl.converters.ByteString -) + if (!maxRedirections) { + return dispatch(opts, handler) + } -module.exports = { - webidl + const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler) + opts = { ...opts, maxRedirections: 0 } // Stop sub dispatcher from also redirecting. + return dispatch(opts, redirectHandler) + } + } } +module.exports = createRedirectInterceptor + /***/ }), -/***/ 84854: -/***/ ((module) => { +/***/ 30953: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; - -/** - * @see https://encoding.spec.whatwg.org/#concept-encoding-get - * @param {string|undefined} label - */ -function getEncoding (label) { - if (!label) { - return 'failure' - } - - // 1. Remove any leading and trailing ASCII whitespace from label. - // 2. If label is an ASCII case-insensitive match for any of the - // labels listed in the table below, then return the - // corresponding encoding; otherwise return failure. - switch (label.trim().toLowerCase()) { - case 'unicode-1-1-utf-8': - case 'unicode11utf8': - case 'unicode20utf8': - case 'utf-8': - case 'utf8': - case 'x-unicode20utf8': - return 'UTF-8' - case '866': - case 'cp866': - case 'csibm866': - case 'ibm866': - return 'IBM866' - case 'csisolatin2': - case 'iso-8859-2': - case 'iso-ir-101': - case 'iso8859-2': - case 'iso88592': - case 'iso_8859-2': - case 'iso_8859-2:1987': - case 'l2': - case 'latin2': - return 'ISO-8859-2' - case 'csisolatin3': - case 'iso-8859-3': - case 'iso-ir-109': - case 'iso8859-3': - case 'iso88593': - case 'iso_8859-3': - case 'iso_8859-3:1988': - case 'l3': - case 'latin3': - return 'ISO-8859-3' - case 'csisolatin4': - case 'iso-8859-4': - case 'iso-ir-110': - case 'iso8859-4': - case 'iso88594': - case 'iso_8859-4': - case 'iso_8859-4:1988': - case 'l4': - case 'latin4': - return 'ISO-8859-4' - case 'csisolatincyrillic': - case 'cyrillic': - case 'iso-8859-5': - case 'iso-ir-144': - case 'iso8859-5': - case 'iso88595': - case 'iso_8859-5': - case 'iso_8859-5:1988': - return 'ISO-8859-5' - case 'arabic': - case 'asmo-708': - case 'csiso88596e': - case 'csiso88596i': - case 'csisolatinarabic': - case 'ecma-114': - case 'iso-8859-6': - case 'iso-8859-6-e': - case 'iso-8859-6-i': - case 'iso-ir-127': - case 'iso8859-6': - case 'iso88596': - case 'iso_8859-6': - case 'iso_8859-6:1987': - return 'ISO-8859-6' - case 'csisolatingreek': - case 'ecma-118': - case 'elot_928': - case 'greek': - case 'greek8': - case 'iso-8859-7': - case 'iso-ir-126': - case 'iso8859-7': - case 'iso88597': - case 'iso_8859-7': - case 'iso_8859-7:1987': - case 'sun_eu_greek': - return 'ISO-8859-7' - case 'csiso88598e': - case 'csisolatinhebrew': - case 'hebrew': - case 'iso-8859-8': - case 'iso-8859-8-e': - case 'iso-ir-138': - case 'iso8859-8': - case 'iso88598': - case 'iso_8859-8': - case 'iso_8859-8:1988': - case 'visual': - return 'ISO-8859-8' - case 'csiso88598i': - case 'iso-8859-8-i': - case 'logical': - return 'ISO-8859-8-I' - case 'csisolatin6': - case 'iso-8859-10': - case 'iso-ir-157': - case 'iso8859-10': - case 'iso885910': - case 'l6': - case 'latin6': - return 'ISO-8859-10' - case 'iso-8859-13': - case 'iso8859-13': - case 'iso885913': - return 'ISO-8859-13' - case 'iso-8859-14': - case 'iso8859-14': - case 'iso885914': - return 'ISO-8859-14' - case 'csisolatin9': - case 'iso-8859-15': - case 'iso8859-15': - case 'iso885915': - case 'iso_8859-15': - case 'l9': - return 'ISO-8859-15' - case 'iso-8859-16': - return 'ISO-8859-16' - case 'cskoi8r': - case 'koi': - case 'koi8': - case 'koi8-r': - case 'koi8_r': - return 'KOI8-R' - case 'koi8-ru': - case 'koi8-u': - return 'KOI8-U' - case 'csmacintosh': - case 'mac': - case 'macintosh': - case 'x-mac-roman': - return 'macintosh' - case 'iso-8859-11': - case 'iso8859-11': - case 'iso885911': - case 'tis-620': - case 'windows-874': - return 'windows-874' - case 'cp1250': - case 'windows-1250': - case 'x-cp1250': - return 'windows-1250' - case 'cp1251': - case 'windows-1251': - case 'x-cp1251': - return 'windows-1251' - case 'ansi_x3.4-1968': - case 'ascii': - case 'cp1252': - case 'cp819': - case 'csisolatin1': - case 'ibm819': - case 'iso-8859-1': - case 'iso-ir-100': - case 'iso8859-1': - case 'iso88591': - case 'iso_8859-1': - case 'iso_8859-1:1987': - case 'l1': - case 'latin1': - case 'us-ascii': - case 'windows-1252': - case 'x-cp1252': - return 'windows-1252' - case 'cp1253': - case 'windows-1253': - case 'x-cp1253': - return 'windows-1253' - case 'cp1254': - case 'csisolatin5': - case 'iso-8859-9': - case 'iso-ir-148': - case 'iso8859-9': - case 'iso88599': - case 'iso_8859-9': - case 'iso_8859-9:1989': - case 'l5': - case 'latin5': - case 'windows-1254': - case 'x-cp1254': - return 'windows-1254' - case 'cp1255': - case 'windows-1255': - case 'x-cp1255': - return 'windows-1255' - case 'cp1256': - case 'windows-1256': - case 'x-cp1256': - return 'windows-1256' - case 'cp1257': - case 'windows-1257': - case 'x-cp1257': - return 'windows-1257' - case 'cp1258': - case 'windows-1258': - case 'x-cp1258': - return 'windows-1258' - case 'x-mac-cyrillic': - case 'x-mac-ukrainian': - return 'x-mac-cyrillic' - case 'chinese': - case 'csgb2312': - case 'csiso58gb231280': - case 'gb2312': - case 'gb_2312': - case 'gb_2312-80': - case 'gbk': - case 'iso-ir-58': - case 'x-gbk': - return 'GBK' - case 'gb18030': - return 'gb18030' - case 'big5': - case 'big5-hkscs': - case 'cn-big5': - case 'csbig5': - case 'x-x-big5': - return 'Big5' - case 'cseucpkdfmtjapanese': - case 'euc-jp': - case 'x-euc-jp': - return 'EUC-JP' - case 'csiso2022jp': - case 'iso-2022-jp': - return 'ISO-2022-JP' - case 'csshiftjis': - case 'ms932': - case 'ms_kanji': - case 'shift-jis': - case 'shift_jis': - case 'sjis': - case 'windows-31j': - case 'x-sjis': - return 'Shift_JIS' - case 'cseuckr': - case 'csksc56011987': - case 'euc-kr': - case 'iso-ir-149': - case 'korean': - case 'ks_c_5601-1987': - case 'ks_c_5601-1989': - case 'ksc5601': - case 'ksc_5601': - case 'windows-949': - return 'EUC-KR' - case 'csiso2022kr': - case 'hz-gb-2312': - case 'iso-2022-cn': - case 'iso-2022-cn-ext': - case 'iso-2022-kr': - case 'replacement': - return 'replacement' - case 'unicodefffe': - case 'utf-16be': - return 'UTF-16BE' - case 'csunicode': - case 'iso-10646-ucs-2': - case 'ucs-2': - case 'unicode': - case 'unicodefeff': - case 'utf-16': - case 'utf-16le': - return 'UTF-16LE' - case 'x-user-defined': - return 'x-user-defined' - default: return 'failure' - } +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; +const utils_1 = __nccwpck_require__(41891); +// C headers +var ERROR; +(function (ERROR) { + ERROR[ERROR["OK"] = 0] = "OK"; + ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; + ERROR[ERROR["STRICT"] = 2] = "STRICT"; + ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; + ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; + ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; + ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; + ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; + ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; + ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; + ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; + ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; + ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; + ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; + ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; + ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; + ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; + ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; + ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; + ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; + ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; + ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; + ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; + ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; + ERROR[ERROR["USER"] = 24] = "USER"; +})(ERROR = exports.ERROR || (exports.ERROR = {})); +var TYPE; +(function (TYPE) { + TYPE[TYPE["BOTH"] = 0] = "BOTH"; + TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; + TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; +})(TYPE = exports.TYPE || (exports.TYPE = {})); +var FLAGS; +(function (FLAGS) { + FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; + FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; + FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; + FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; + FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; + FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; + FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; + FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; + // 1 << 8 is unused + FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; +})(FLAGS = exports.FLAGS || (exports.FLAGS = {})); +var LENIENT_FLAGS; +(function (LENIENT_FLAGS) { + LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; + LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; + LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; +})(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {})); +var METHODS; +(function (METHODS) { + METHODS[METHODS["DELETE"] = 0] = "DELETE"; + METHODS[METHODS["GET"] = 1] = "GET"; + METHODS[METHODS["HEAD"] = 2] = "HEAD"; + METHODS[METHODS["POST"] = 3] = "POST"; + METHODS[METHODS["PUT"] = 4] = "PUT"; + /* pathological */ + METHODS[METHODS["CONNECT"] = 5] = "CONNECT"; + METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS"; + METHODS[METHODS["TRACE"] = 7] = "TRACE"; + /* WebDAV */ + METHODS[METHODS["COPY"] = 8] = "COPY"; + METHODS[METHODS["LOCK"] = 9] = "LOCK"; + METHODS[METHODS["MKCOL"] = 10] = "MKCOL"; + METHODS[METHODS["MOVE"] = 11] = "MOVE"; + METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND"; + METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH"; + METHODS[METHODS["SEARCH"] = 14] = "SEARCH"; + METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK"; + METHODS[METHODS["BIND"] = 16] = "BIND"; + METHODS[METHODS["REBIND"] = 17] = "REBIND"; + METHODS[METHODS["UNBIND"] = 18] = "UNBIND"; + METHODS[METHODS["ACL"] = 19] = "ACL"; + /* subversion */ + METHODS[METHODS["REPORT"] = 20] = "REPORT"; + METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY"; + METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT"; + METHODS[METHODS["MERGE"] = 23] = "MERGE"; + /* upnp */ + METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH"; + METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY"; + METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE"; + METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + /* RFC-5789 */ + METHODS[METHODS["PATCH"] = 28] = "PATCH"; + METHODS[METHODS["PURGE"] = 29] = "PURGE"; + /* CalDAV */ + METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR"; + /* RFC-2068, section 19.6.1.2 */ + METHODS[METHODS["LINK"] = 31] = "LINK"; + METHODS[METHODS["UNLINK"] = 32] = "UNLINK"; + /* icecast */ + METHODS[METHODS["SOURCE"] = 33] = "SOURCE"; + /* RFC-7540, section 11.6 */ + METHODS[METHODS["PRI"] = 34] = "PRI"; + /* RFC-2326 RTSP */ + METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE"; + METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE"; + METHODS[METHODS["SETUP"] = 37] = "SETUP"; + METHODS[METHODS["PLAY"] = 38] = "PLAY"; + METHODS[METHODS["PAUSE"] = 39] = "PAUSE"; + METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN"; + METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER"; + METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER"; + METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT"; + METHODS[METHODS["RECORD"] = 44] = "RECORD"; + /* RAOP */ + METHODS[METHODS["FLUSH"] = 45] = "FLUSH"; +})(METHODS = exports.METHODS || (exports.METHODS = {})); +exports.METHODS_HTTP = [ + METHODS.DELETE, + METHODS.GET, + METHODS.HEAD, + METHODS.POST, + METHODS.PUT, + METHODS.CONNECT, + METHODS.OPTIONS, + METHODS.TRACE, + METHODS.COPY, + METHODS.LOCK, + METHODS.MKCOL, + METHODS.MOVE, + METHODS.PROPFIND, + METHODS.PROPPATCH, + METHODS.SEARCH, + METHODS.UNLOCK, + METHODS.BIND, + METHODS.REBIND, + METHODS.UNBIND, + METHODS.ACL, + METHODS.REPORT, + METHODS.MKACTIVITY, + METHODS.CHECKOUT, + METHODS.MERGE, + METHODS['M-SEARCH'], + METHODS.NOTIFY, + METHODS.SUBSCRIBE, + METHODS.UNSUBSCRIBE, + METHODS.PATCH, + METHODS.PURGE, + METHODS.MKCALENDAR, + METHODS.LINK, + METHODS.UNLINK, + METHODS.PRI, + // TODO(indutny): should we allow it with HTTP? + METHODS.SOURCE, +]; +exports.METHODS_ICE = [ + METHODS.SOURCE, +]; +exports.METHODS_RTSP = [ + METHODS.OPTIONS, + METHODS.DESCRIBE, + METHODS.ANNOUNCE, + METHODS.SETUP, + METHODS.PLAY, + METHODS.PAUSE, + METHODS.TEARDOWN, + METHODS.GET_PARAMETER, + METHODS.SET_PARAMETER, + METHODS.REDIRECT, + METHODS.RECORD, + METHODS.FLUSH, + // For AirPlay + METHODS.GET, + METHODS.POST, +]; +exports.METHOD_MAP = utils_1.enumToMap(METHODS); +exports.H_METHOD_MAP = {}; +Object.keys(exports.METHOD_MAP).forEach((key) => { + if (/^H/.test(key)) { + exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key]; + } +}); +var FINISH; +(function (FINISH) { + FINISH[FINISH["SAFE"] = 0] = "SAFE"; + FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; + FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; +})(FINISH = exports.FINISH || (exports.FINISH = {})); +exports.ALPHA = []; +for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { + // Upper case + exports.ALPHA.push(String.fromCharCode(i)); + // Lower case + exports.ALPHA.push(String.fromCharCode(i + 0x20)); } - -module.exports = { - getEncoding +exports.NUM_MAP = { + 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, + 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, +}; +exports.HEX_MAP = { + 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, + 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, + A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, + a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, +}; +exports.NUM = [ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', +]; +exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); +exports.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')']; +exports.USERINFO_CHARS = exports.ALPHANUM + .concat(exports.MARK) + .concat(['%', ';', ':', '&', '=', '+', '$', ',']); +// TODO(indutny): use RFC +exports.STRICT_URL_CHAR = [ + '!', '"', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + ':', ';', '<', '=', '>', + '@', '[', '\\', ']', '^', '_', + '`', + '{', '|', '}', '~', +].concat(exports.ALPHANUM); +exports.URL_CHAR = exports.STRICT_URL_CHAR + .concat(['\t', '\f']); +// All characters with 0x80 bit set to 1 +for (let i = 0x80; i <= 0xff; i++) { + exports.URL_CHAR.push(i); } - +exports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']); +/* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ +exports.STRICT_TOKEN = [ + '!', '#', '$', '%', '&', '\'', + '*', '+', '-', '.', + '^', '_', '`', + '|', '~', +].concat(exports.ALPHANUM); +exports.TOKEN = exports.STRICT_TOKEN.concat([' ']); +/* + * Verify that a char is a valid visible (printable) US-ASCII + * character or %x80-FF + */ +exports.HEADER_CHARS = ['\t']; +for (let i = 32; i <= 255; i++) { + if (i !== 127) { + exports.HEADER_CHARS.push(i); + } +} +// ',' = \x44 +exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44); +exports.MAJOR = exports.NUM_MAP; +exports.MINOR = exports.MAJOR; +var HEADER_STATE; +(function (HEADER_STATE) { + HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL"; + HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION"; + HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; + HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; + HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE"; + HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; + HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; + HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; + HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; +})(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {})); +exports.SPECIAL_HEADERS = { + 'connection': HEADER_STATE.CONNECTION, + 'content-length': HEADER_STATE.CONTENT_LENGTH, + 'proxy-connection': HEADER_STATE.CONNECTION, + 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, + 'upgrade': HEADER_STATE.UPGRADE, +}; +//# sourceMappingURL=constants.js.map /***/ }), -/***/ 1446: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - +/***/ 61145: +/***/ ((module) => { -const { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent -} = __nccwpck_require__(87530) -const { - kState, - kError, - kResult, - kEvents, - kAborted -} = __nccwpck_require__(29054) -const { webidl } = __nccwpck_require__(21744) -const { kEnumerableProperty } = __nccwpck_require__(83983) +module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCsLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC1kAIABBGGpCADcDACAAQgA3AwAgAEE4akIANwMAIABBMGpCADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwHLAcoBuAHJAbkByAG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAQDcAQtBACEQDMYBC0EOIRAMxQELQQ0hEAzEAQtBDyEQDMMBC0EQIRAMwgELQRMhEAzBAQtBFCEQDMABC0EVIRAMvwELQRYhEAy+AQtBFyEQDL0BC0EYIRAMvAELQRkhEAy7AQtBGiEQDLoBC0EbIRAMuQELQRwhEAy4AQtBCCEQDLcBC0EdIRAMtgELQSAhEAy1AQtBHyEQDLQBC0EHIRAMswELQSEhEAyyAQtBIiEQDLEBC0EeIRAMsAELQSMhEAyvAQtBEiEQDK4BC0ERIRAMrQELQSQhEAysAQtBJSEQDKsBC0EmIRAMqgELQSchEAypAQtBwwEhEAyoAQtBKSEQDKcBC0ErIRAMpgELQSwhEAylAQtBLSEQDKQBC0EuIRAMowELQS8hEAyiAQtBxAEhEAyhAQtBMCEQDKABC0E0IRAMnwELQQwhEAyeAQtBMSEQDJ0BC0EyIRAMnAELQTMhEAybAQtBOSEQDJoBC0E1IRAMmQELQcUBIRAMmAELQQshEAyXAQtBOiEQDJYBC0E2IRAMlQELQQohEAyUAQtBNyEQDJMBC0E4IRAMkgELQTwhEAyRAQtBOyEQDJABC0E9IRAMjwELQQkhEAyOAQtBKCEQDI0BC0E+IRAMjAELQT8hEAyLAQtBwAAhEAyKAQtBwQAhEAyJAQtBwgAhEAyIAQtBwwAhEAyHAQtBxAAhEAyGAQtBxQAhEAyFAQtBxgAhEAyEAQtBKiEQDIMBC0HHACEQDIIBC0HIACEQDIEBC0HJACEQDIABC0HKACEQDH8LQcsAIRAMfgtBzQAhEAx9C0HMACEQDHwLQc4AIRAMewtBzwAhEAx6C0HQACEQDHkLQdEAIRAMeAtB0gAhEAx3C0HTACEQDHYLQdQAIRAMdQtB1gAhEAx0C0HVACEQDHMLQQYhEAxyC0HXACEQDHELQQUhEAxwC0HYACEQDG8LQQQhEAxuC0HZACEQDG0LQdoAIRAMbAtB2wAhEAxrC0HcACEQDGoLQQMhEAxpC0HdACEQDGgLQd4AIRAMZwtB3wAhEAxmC0HhACEQDGULQeAAIRAMZAtB4gAhEAxjC0HjACEQDGILQQIhEAxhC0HkACEQDGALQeUAIRAMXwtB5gAhEAxeC0HnACEQDF0LQegAIRAMXAtB6QAhEAxbC0HqACEQDFoLQesAIRAMWQtB7AAhEAxYC0HtACEQDFcLQe4AIRAMVgtB7wAhEAxVC0HwACEQDFQLQfEAIRAMUwtB8gAhEAxSC0HzACEQDFELQfQAIRAMUAtB9QAhEAxPC0H2ACEQDE4LQfcAIRAMTQtB+AAhEAxMC0H5ACEQDEsLQfoAIRAMSgtB+wAhEAxJC0H8ACEQDEgLQf0AIRAMRwtB/gAhEAxGC0H/ACEQDEULQYABIRAMRAtBgQEhEAxDC0GCASEQDEILQYMBIRAMQQtBhAEhEAxAC0GFASEQDD8LQYYBIRAMPgtBhwEhEAw9C0GIASEQDDwLQYkBIRAMOwtBigEhEAw6C0GLASEQDDkLQYwBIRAMOAtBjQEhEAw3C0GOASEQDDYLQY8BIRAMNQtBkAEhEAw0C0GRASEQDDMLQZIBIRAMMgtBkwEhEAwxC0GUASEQDDALQZUBIRAMLwtBlgEhEAwuC0GXASEQDC0LQZgBIRAMLAtBmQEhEAwrC0GaASEQDCoLQZsBIRAMKQtBnAEhEAwoC0GdASEQDCcLQZ4BIRAMJgtBnwEhEAwlC0GgASEQDCQLQaEBIRAMIwtBogEhEAwiC0GjASEQDCELQaQBIRAMIAtBpQEhEAwfC0GmASEQDB4LQacBIRAMHQtBqAEhEAwcC0GpASEQDBsLQaoBIRAMGgtBqwEhEAwZC0GsASEQDBgLQa0BIRAMFwtBrgEhEAwWC0EBIRAMFQtBrwEhEAwUC0GwASEQDBMLQbEBIRAMEgtBswEhEAwRC0GyASEQDBALQbQBIRAMDwtBtQEhEAwOC0G2ASEQDA0LQbcBIRAMDAtBuAEhEAwLC0G5ASEQDAoLQboBIRAMCQtBuwEhEAwIC0HGASEQDAcLQbwBIRAMBgtBvQEhEAwFC0G+ASEQDAQLQb8BIRAMAwtBwAEhEAwCC0HCASEQDAELQcEBIRALA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQDscBAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxweHyAhIyUoP0BBREVGR0hJSktMTU9QUVJT3gNXWVtcXWBiZWZnaGlqa2xtb3BxcnN0dXZ3eHl6e3x9foABggGFAYYBhwGJAYsBjAGNAY4BjwGQAZEBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAZkCpAKwAv4C/gILIAEiBCACRw3zAUHdASEQDP8DCyABIhAgAkcN3QFBwwEhEAz+AwsgASIBIAJHDZABQfcAIRAM/QMLIAEiASACRw2GAUHvACEQDPwDCyABIgEgAkcNf0HqACEQDPsDCyABIgEgAkcNe0HoACEQDPoDCyABIgEgAkcNeEHmACEQDPkDCyABIgEgAkcNGkEYIRAM+AMLIAEiASACRw0UQRIhEAz3AwsgASIBIAJHDVlBxQAhEAz2AwsgASIBIAJHDUpBPyEQDPUDCyABIgEgAkcNSEE8IRAM9AMLIAEiASACRw1BQTEhEAzzAwsgAC0ALkEBRg3rAwyHAgsgACABIgEgAhDAgICAAEEBRw3mASAAQgA3AyAM5wELIAAgASIBIAIQtICAgAAiEA3nASABIQEM9QILAkAgASIBIAJHDQBBBiEQDPADCyAAIAFBAWoiASACELuAgIAAIhAN6AEgASEBDDELIABCADcDIEESIRAM1QMLIAEiECACRw0rQR0hEAztAwsCQCABIgEgAkYNACABQQFqIQFBECEQDNQDC0EHIRAM7AMLIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN5QFBCCEQDOsDCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEUIRAM0gMLQQkhEAzqAwsgASEBIAApAyBQDeQBIAEhAQzyAgsCQCABIgEgAkcNAEELIRAM6QMLIAAgAUEBaiIBIAIQtoCAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3mASABIQEMDQsgACABIgEgAhC6gICAACIQDecBIAEhAQzwAgsCQCABIgEgAkcNAEEPIRAM5QMLIAEtAAAiEEE7Rg0IIBBBDUcN6AEgAUEBaiEBDO8CCyAAIAEiASACELqAgIAAIhAN6AEgASEBDPICCwNAAkAgAS0AAEHwtYCAAGotAAAiEEEBRg0AIBBBAkcN6wEgACgCBCEQIABBADYCBCAAIBAgAUEBaiIBELmAgIAAIhAN6gEgASEBDPQCCyABQQFqIgEgAkcNAAtBEiEQDOIDCyAAIAEiASACELqAgIAAIhAN6QEgASEBDAoLIAEiASACRw0GQRshEAzgAwsCQCABIgEgAkcNAEEWIRAM4AMLIABBioCAgAA2AgggACABNgIEIAAgASACELiAgIAAIhAN6gEgASEBQSAhEAzGAwsCQCABIgEgAkYNAANAAkAgAS0AAEHwt4CAAGotAAAiEEECRg0AAkAgEEF/ag4E5QHsAQDrAewBCyABQQFqIQFBCCEQDMgDCyABQQFqIgEgAkcNAAtBFSEQDN8DC0EVIRAM3gMLA0ACQCABLQAAQfC5gIAAai0AACIQQQJGDQAgEEF/ag4E3gHsAeAB6wHsAQsgAUEBaiIBIAJHDQALQRghEAzdAwsCQCABIgEgAkYNACAAQYuAgIAANgIIIAAgATYCBCABIQFBByEQDMQDC0EZIRAM3AMLIAFBAWohAQwCCwJAIAEiFCACRw0AQRohEAzbAwsgFCEBAkAgFC0AAEFzag4U3QLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gIA7gILQQAhECAAQQA2AhwgAEGvi4CAADYCECAAQQI2AgwgACAUQQFqNgIUDNoDCwJAIAEtAAAiEEE7Rg0AIBBBDUcN6AEgAUEBaiEBDOUCCyABQQFqIQELQSIhEAy/AwsCQCABIhAgAkcNAEEcIRAM2AMLQgAhESAQIQEgEC0AAEFQag435wHmAQECAwQFBgcIAAAAAAAAAAkKCwwNDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAREhMUAAtBHiEQDL0DC0ICIREM5QELQgMhEQzkAQtCBCERDOMBC0IFIREM4gELQgYhEQzhAQtCByERDOABC0IIIREM3wELQgkhEQzeAQtCCiERDN0BC0ILIREM3AELQgwhEQzbAQtCDSERDNoBC0IOIREM2QELQg8hEQzYAQtCCiERDNcBC0ILIREM1gELQgwhEQzVAQtCDSERDNQBC0IOIREM0wELQg8hEQzSAQtCACERAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQLQAAQVBqDjflAeQBAAECAwQFBgfmAeYB5gHmAeYB5gHmAQgJCgsMDeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gEODxAREhPmAQtCAiERDOQBC0IDIREM4wELQgQhEQziAQtCBSERDOEBC0IGIREM4AELQgchEQzfAQtCCCERDN4BC0IJIREM3QELQgohEQzcAQtCCyERDNsBC0IMIREM2gELQg0hEQzZAQtCDiERDNgBC0IPIREM1wELQgohEQzWAQtCCyERDNUBC0IMIREM1AELQg0hEQzTAQtCDiERDNIBC0IPIREM0QELIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN0gFBHyEQDMADCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEkIRAMpwMLQSAhEAy/AwsgACABIhAgAhC+gICAAEF/ag4FtgEAxQIB0QHSAQtBESEQDKQDCyAAQQE6AC8gECEBDLsDCyABIgEgAkcN0gFBJCEQDLsDCyABIg0gAkcNHkHGACEQDLoDCyAAIAEiASACELKAgIAAIhAN1AEgASEBDLUBCyABIhAgAkcNJkHQACEQDLgDCwJAIAEiASACRw0AQSghEAy4AwsgAEEANgIEIABBjICAgAA2AgggACABIAEQsYCAgAAiEA3TASABIQEM2AELAkAgASIQIAJHDQBBKSEQDLcDCyAQLQAAIgFBIEYNFCABQQlHDdMBIBBBAWohAQwVCwJAIAEiASACRg0AIAFBAWohAQwXC0EqIRAMtQMLAkAgASIQIAJHDQBBKyEQDLUDCwJAIBAtAAAiAUEJRg0AIAFBIEcN1QELIAAtACxBCEYN0wEgECEBDJEDCwJAIAEiASACRw0AQSwhEAy0AwsgAS0AAEEKRw3VASABQQFqIQEMyQILIAEiDiACRw3VAUEvIRAMsgMLA0ACQCABLQAAIhBBIEYNAAJAIBBBdmoOBADcAdwBANoBCyABIQEM4AELIAFBAWoiASACRw0AC0ExIRAMsQMLQTIhECABIhQgAkYNsAMgAiAUayAAKAIAIgFqIRUgFCABa0EDaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfC7gIAAai0AAEcNAQJAIAFBA0cNAEEGIQEMlgMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLEDCyAAQQA2AgAgFCEBDNkBC0EzIRAgASIUIAJGDa8DIAIgFGsgACgCACIBaiEVIBQgAWtBCGohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUH0u4CAAGotAABHDQECQCABQQhHDQBBBSEBDJUDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAywAwsgAEEANgIAIBQhAQzYAQtBNCEQIAEiFCACRg2uAyACIBRrIAAoAgAiAWohFSAUIAFrQQVqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw0BAkAgAUEFRw0AQQchAQyUAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMrwMLIABBADYCACAUIQEM1wELAkAgASIBIAJGDQADQAJAIAEtAABBgL6AgABqLQAAIhBBAUYNACAQQQJGDQogASEBDN0BCyABQQFqIgEgAkcNAAtBMCEQDK4DC0EwIRAMrQMLAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AIBBBdmoOBNkB2gHaAdkB2gELIAFBAWoiASACRw0AC0E4IRAMrQMLQTghEAysAwsDQAJAIAEtAAAiEEEgRg0AIBBBCUcNAwsgAUEBaiIBIAJHDQALQTwhEAyrAwsDQAJAIAEtAAAiEEEgRg0AAkACQCAQQXZqDgTaAQEB2gEACyAQQSxGDdsBCyABIQEMBAsgAUEBaiIBIAJHDQALQT8hEAyqAwsgASEBDNsBC0HAACEQIAEiFCACRg2oAyACIBRrIAAoAgAiAWohFiAUIAFrQQZqIRcCQANAIBQtAABBIHIgAUGAwICAAGotAABHDQEgAUEGRg2OAyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAypAwsgAEEANgIAIBQhAQtBNiEQDI4DCwJAIAEiDyACRw0AQcEAIRAMpwMLIABBjICAgAA2AgggACAPNgIEIA8hASAALQAsQX9qDgTNAdUB1wHZAYcDCyABQQFqIQEMzAELAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgciAQIBBBv39qQf8BcUEaSRtB/wFxIhBBCUYNACAQQSBGDQACQAJAAkACQCAQQZ1/ag4TAAMDAwMDAwMBAwMDAwMDAwMDAgMLIAFBAWohAUExIRAMkQMLIAFBAWohAUEyIRAMkAMLIAFBAWohAUEzIRAMjwMLIAEhAQzQAQsgAUEBaiIBIAJHDQALQTUhEAylAwtBNSEQDKQDCwJAIAEiASACRg0AA0ACQCABLQAAQYC8gIAAai0AAEEBRg0AIAEhAQzTAQsgAUEBaiIBIAJHDQALQT0hEAykAwtBPSEQDKMDCyAAIAEiASACELCAgIAAIhAN1gEgASEBDAELIBBBAWohAQtBPCEQDIcDCwJAIAEiASACRw0AQcIAIRAMoAMLAkADQAJAIAEtAABBd2oOGAAC/gL+AoQD/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4CAP4CCyABQQFqIgEgAkcNAAtBwgAhEAygAwsgAUEBaiEBIAAtAC1BAXFFDb0BIAEhAQtBLCEQDIUDCyABIgEgAkcN0wFBxAAhEAydAwsDQAJAIAEtAABBkMCAgABqLQAAQQFGDQAgASEBDLcCCyABQQFqIgEgAkcNAAtBxQAhEAycAwsgDS0AACIQQSBGDbMBIBBBOkcNgQMgACgCBCEBIABBADYCBCAAIAEgDRCvgICAACIBDdABIA1BAWohAQyzAgtBxwAhECABIg0gAkYNmgMgAiANayAAKAIAIgFqIRYgDSABa0EFaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGQwoCAAGotAABHDYADIAFBBUYN9AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmgMLQcgAIRAgASINIAJGDZkDIAIgDWsgACgCACIBaiEWIA0gAWtBCWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBlsKAgABqLQAARw3/AgJAIAFBCUcNAEECIQEM9QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJkDCwJAIAEiDSACRw0AQckAIRAMmQMLAkACQCANLQAAIgFBIHIgASABQb9/akH/AXFBGkkbQf8BcUGSf2oOBwCAA4ADgAOAA4ADAYADCyANQQFqIQFBPiEQDIADCyANQQFqIQFBPyEQDP8CC0HKACEQIAEiDSACRg2XAyACIA1rIAAoAgAiAWohFiANIAFrQQFqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaDCgIAAai0AAEcN/QIgAUEBRg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyXAwtBywAhECABIg0gAkYNlgMgAiANayAAKAIAIgFqIRYgDSABa0EOaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGiwoCAAGotAABHDfwCIAFBDkYN8AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlgMLQcwAIRAgASINIAJGDZUDIAIgDWsgACgCACIBaiEWIA0gAWtBD2ohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBwMKAgABqLQAARw37AgJAIAFBD0cNAEEDIQEM8QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJUDC0HNACEQIAEiDSACRg2UAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQdDCgIAAai0AAEcN+gICQCABQQVHDQBBBCEBDPACCyABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyUAwsCQCABIg0gAkcNAEHOACEQDJQDCwJAAkACQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZ1/ag4TAP0C/QL9Av0C/QL9Av0C/QL9Av0C/QL9AgH9Av0C/QICA/0CCyANQQFqIQFBwQAhEAz9AgsgDUEBaiEBQcIAIRAM/AILIA1BAWohAUHDACEQDPsCCyANQQFqIQFBxAAhEAz6AgsCQCABIgEgAkYNACAAQY2AgIAANgIIIAAgATYCBCABIQFBxQAhEAz6AgtBzwAhEAySAwsgECEBAkACQCAQLQAAQXZqDgQBqAKoAgCoAgsgEEEBaiEBC0EnIRAM+AILAkAgASIBIAJHDQBB0QAhEAyRAwsCQCABLQAAQSBGDQAgASEBDI0BCyABQQFqIQEgAC0ALUEBcUUNxwEgASEBDIwBCyABIhcgAkcNyAFB0gAhEAyPAwtB0wAhECABIhQgAkYNjgMgAiAUayAAKAIAIgFqIRYgFCABa0EBaiEXA0AgFC0AACABQdbCgIAAai0AAEcNzAEgAUEBRg3HASABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAyOAwsCQCABIgEgAkcNAEHVACEQDI4DCyABLQAAQQpHDcwBIAFBAWohAQzHAQsCQCABIgEgAkcNAEHWACEQDI0DCwJAAkAgAS0AAEF2ag4EAM0BzQEBzQELIAFBAWohAQzHAQsgAUEBaiEBQcoAIRAM8wILIAAgASIBIAIQroCAgAAiEA3LASABIQFBzQAhEAzyAgsgAC0AKUEiRg2FAwymAgsCQCABIgEgAkcNAEHbACEQDIoDC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgAS0AAEFQag4K1AHTAQABAgMEBQYI1QELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMzAELQQkhEEEBIRRBACEXQQAhFgzLAQsCQCABIgEgAkcNAEHdACEQDIkDCyABLQAAQS5HDcwBIAFBAWohAQymAgsgASIBIAJHDcwBQd8AIRAMhwMLAkAgASIBIAJGDQAgAEGOgICAADYCCCAAIAE2AgQgASEBQdAAIRAM7gILQeAAIRAMhgMLQeEAIRAgASIBIAJGDYUDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHiwoCAAGotAABHDc0BIBRBA0YNzAEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhQMLQeIAIRAgASIBIAJGDYQDIAIgAWsgACgCACIUaiEWIAEgFGtBAmohFwNAIAEtAAAgFEHmwoCAAGotAABHDcwBIBRBAkYNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhAMLQeMAIRAgASIBIAJGDYMDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHpwoCAAGotAABHDcsBIBRBA0YNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMgwMLAkAgASIBIAJHDQBB5QAhEAyDAwsgACABQQFqIgEgAhCogICAACIQDc0BIAEhAUHWACEQDOkCCwJAIAEiASACRg0AA0ACQCABLQAAIhBBIEYNAAJAAkACQCAQQbh/ag4LAAHPAc8BzwHPAc8BzwHPAc8BAs8BCyABQQFqIQFB0gAhEAztAgsgAUEBaiEBQdMAIRAM7AILIAFBAWohAUHUACEQDOsCCyABQQFqIgEgAkcNAAtB5AAhEAyCAwtB5AAhEAyBAwsDQAJAIAEtAABB8MKAgABqLQAAIhBBAUYNACAQQX5qDgPPAdAB0QHSAQsgAUEBaiIBIAJHDQALQeYAIRAMgAMLAkAgASIBIAJGDQAgAUEBaiEBDAMLQecAIRAM/wILA0ACQCABLQAAQfDEgIAAai0AACIQQQFGDQACQCAQQX5qDgTSAdMB1AEA1QELIAEhAUHXACEQDOcCCyABQQFqIgEgAkcNAAtB6AAhEAz+AgsCQCABIgEgAkcNAEHpACEQDP4CCwJAIAEtAAAiEEF2ag4augHVAdUBvAHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHKAdUB1QEA0wELIAFBAWohAQtBBiEQDOMCCwNAAkAgAS0AAEHwxoCAAGotAABBAUYNACABIQEMngILIAFBAWoiASACRw0AC0HqACEQDPsCCwJAIAEiASACRg0AIAFBAWohAQwDC0HrACEQDPoCCwJAIAEiASACRw0AQewAIRAM+gILIAFBAWohAQwBCwJAIAEiASACRw0AQe0AIRAM+QILIAFBAWohAQtBBCEQDN4CCwJAIAEiFCACRw0AQe4AIRAM9wILIBQhAQJAAkACQCAULQAAQfDIgIAAai0AAEF/ag4H1AHVAdYBAJwCAQLXAQsgFEEBaiEBDAoLIBRBAWohAQzNAQtBACEQIABBADYCHCAAQZuSgIAANgIQIABBBzYCDCAAIBRBAWo2AhQM9gILAkADQAJAIAEtAABB8MiAgABqLQAAIhBBBEYNAAJAAkAgEEF/ag4H0gHTAdQB2QEABAHZAQsgASEBQdoAIRAM4AILIAFBAWohAUHcACEQDN8CCyABQQFqIgEgAkcNAAtB7wAhEAz2AgsgAUEBaiEBDMsBCwJAIAEiFCACRw0AQfAAIRAM9QILIBQtAABBL0cN1AEgFEEBaiEBDAYLAkAgASIUIAJHDQBB8QAhEAz0AgsCQCAULQAAIgFBL0cNACAUQQFqIQFB3QAhEAzbAgsgAUF2aiIEQRZLDdMBQQEgBHRBiYCAAnFFDdMBDMoCCwJAIAEiASACRg0AIAFBAWohAUHeACEQDNoCC0HyACEQDPICCwJAIAEiFCACRw0AQfQAIRAM8gILIBQhAQJAIBQtAABB8MyAgABqLQAAQX9qDgPJApQCANQBC0HhACEQDNgCCwJAIAEiFCACRg0AA0ACQCAULQAAQfDKgIAAai0AACIBQQNGDQACQCABQX9qDgLLAgDVAQsgFCEBQd8AIRAM2gILIBRBAWoiFCACRw0AC0HzACEQDPECC0HzACEQDPACCwJAIAEiASACRg0AIABBj4CAgAA2AgggACABNgIEIAEhAUHgACEQDNcCC0H1ACEQDO8CCwJAIAEiASACRw0AQfYAIRAM7wILIABBj4CAgAA2AgggACABNgIEIAEhAQtBAyEQDNQCCwNAIAEtAABBIEcNwwIgAUEBaiIBIAJHDQALQfcAIRAM7AILAkAgASIBIAJHDQBB+AAhEAzsAgsgAS0AAEEgRw3OASABQQFqIQEM7wELIAAgASIBIAIQrICAgAAiEA3OASABIQEMjgILAkAgASIEIAJHDQBB+gAhEAzqAgsgBC0AAEHMAEcN0QEgBEEBaiEBQRMhEAzPAQsCQCABIgQgAkcNAEH7ACEQDOkCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRADQCAELQAAIAFB8M6AgABqLQAARw3QASABQQVGDc4BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQfsAIRAM6AILAkAgASIEIAJHDQBB/AAhEAzoAgsCQAJAIAQtAABBvX9qDgwA0QHRAdEB0QHRAdEB0QHRAdEB0QEB0QELIARBAWohAUHmACEQDM8CCyAEQQFqIQFB5wAhEAzOAgsCQCABIgQgAkcNAEH9ACEQDOcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDc8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH9ACEQDOcCCyAAQQA2AgAgEEEBaiEBQRAhEAzMAQsCQCABIgQgAkcNAEH+ACEQDOYCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUH2zoCAAGotAABHDc4BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH+ACEQDOYCCyAAQQA2AgAgEEEBaiEBQRYhEAzLAQsCQCABIgQgAkcNAEH/ACEQDOUCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUH8zoCAAGotAABHDc0BIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH/ACEQDOUCCyAAQQA2AgAgEEEBaiEBQQUhEAzKAQsCQCABIgQgAkcNAEGAASEQDOQCCyAELQAAQdkARw3LASAEQQFqIQFBCCEQDMkBCwJAIAEiBCACRw0AQYEBIRAM4wILAkACQCAELQAAQbJ/ag4DAMwBAcwBCyAEQQFqIQFB6wAhEAzKAgsgBEEBaiEBQewAIRAMyQILAkAgASIEIAJHDQBBggEhEAziAgsCQAJAIAQtAABBuH9qDggAywHLAcsBywHLAcsBAcsBCyAEQQFqIQFB6gAhEAzJAgsgBEEBaiEBQe0AIRAMyAILAkAgASIEIAJHDQBBgwEhEAzhAgsgAiAEayAAKAIAIgFqIRAgBCABa0ECaiEUAkADQCAELQAAIAFBgM+AgABqLQAARw3JASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBA2AgBBgwEhEAzhAgtBACEQIABBADYCACAUQQFqIQEMxgELAkAgASIEIAJHDQBBhAEhEAzgAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBg8+AgABqLQAARw3IASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhAEhEAzgAgsgAEEANgIAIBBBAWohAUEjIRAMxQELAkAgASIEIAJHDQBBhQEhEAzfAgsCQAJAIAQtAABBtH9qDggAyAHIAcgByAHIAcgBAcgBCyAEQQFqIQFB7wAhEAzGAgsgBEEBaiEBQfAAIRAMxQILAkAgASIEIAJHDQBBhgEhEAzeAgsgBC0AAEHFAEcNxQEgBEEBaiEBDIMCCwJAIAEiBCACRw0AQYcBIRAM3QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQYjPgIAAai0AAEcNxQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYcBIRAM3QILIABBADYCACAQQQFqIQFBLSEQDMIBCwJAIAEiBCACRw0AQYgBIRAM3AILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNxAEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYgBIRAM3AILIABBADYCACAQQQFqIQFBKSEQDMEBCwJAIAEiASACRw0AQYkBIRAM2wILQQEhECABLQAAQd8ARw3AASABQQFqIQEMgQILAkAgASIEIAJHDQBBigEhEAzaAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQA0AgBC0AACABQYzPgIAAai0AAEcNwQEgAUEBRg2vAiABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGKASEQDNkCCwJAIAEiBCACRw0AQYsBIRAM2QILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQY7PgIAAai0AAEcNwQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYsBIRAM2QILIABBADYCACAQQQFqIQFBAiEQDL4BCwJAIAEiBCACRw0AQYwBIRAM2AILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNwAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYwBIRAM2AILIABBADYCACAQQQFqIQFBHyEQDL0BCwJAIAEiBCACRw0AQY0BIRAM1wILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNvwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY0BIRAM1wILIABBADYCACAQQQFqIQFBCSEQDLwBCwJAIAEiBCACRw0AQY4BIRAM1gILAkACQCAELQAAQbd/ag4HAL8BvwG/Ab8BvwEBvwELIARBAWohAUH4ACEQDL0CCyAEQQFqIQFB+QAhEAy8AgsCQCABIgQgAkcNAEGPASEQDNUCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGRz4CAAGotAABHDb0BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGPASEQDNUCCyAAQQA2AgAgEEEBaiEBQRghEAy6AQsCQCABIgQgAkcNAEGQASEQDNQCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUGXz4CAAGotAABHDbwBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGQASEQDNQCCyAAQQA2AgAgEEEBaiEBQRchEAy5AQsCQCABIgQgAkcNAEGRASEQDNMCCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUGaz4CAAGotAABHDbsBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGRASEQDNMCCyAAQQA2AgAgEEEBaiEBQRUhEAy4AQsCQCABIgQgAkcNAEGSASEQDNICCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGhz4CAAGotAABHDboBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGSASEQDNICCyAAQQA2AgAgEEEBaiEBQR4hEAy3AQsCQCABIgQgAkcNAEGTASEQDNECCyAELQAAQcwARw24ASAEQQFqIQFBCiEQDLYBCwJAIAQgAkcNAEGUASEQDNACCwJAAkAgBC0AAEG/f2oODwC5AbkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AQG5AQsgBEEBaiEBQf4AIRAMtwILIARBAWohAUH/ACEQDLYCCwJAIAQgAkcNAEGVASEQDM8CCwJAAkAgBC0AAEG/f2oOAwC4AQG4AQsgBEEBaiEBQf0AIRAMtgILIARBAWohBEGAASEQDLUCCwJAIAQgAkcNAEGWASEQDM4CCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUGnz4CAAGotAABHDbYBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGWASEQDM4CCyAAQQA2AgAgEEEBaiEBQQshEAyzAQsCQCAEIAJHDQBBlwEhEAzNAgsCQAJAAkACQCAELQAAQVNqDiMAuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AQG4AbgBuAG4AbgBArgBuAG4AQO4AQsgBEEBaiEBQfsAIRAMtgILIARBAWohAUH8ACEQDLUCCyAEQQFqIQRBgQEhEAy0AgsgBEEBaiEEQYIBIRAMswILAkAgBCACRw0AQZgBIRAMzAILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQanPgIAAai0AAEcNtAEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZgBIRAMzAILIABBADYCACAQQQFqIQFBGSEQDLEBCwJAIAQgAkcNAEGZASEQDMsCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGuz4CAAGotAABHDbMBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGZASEQDMsCCyAAQQA2AgAgEEEBaiEBQQYhEAywAQsCQCAEIAJHDQBBmgEhEAzKAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBtM+AgABqLQAARw2yASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmgEhEAzKAgsgAEEANgIAIBBBAWohAUEcIRAMrwELAkAgBCACRw0AQZsBIRAMyQILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbbPgIAAai0AAEcNsQEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZsBIRAMyQILIABBADYCACAQQQFqIQFBJyEQDK4BCwJAIAQgAkcNAEGcASEQDMgCCwJAAkAgBC0AAEGsf2oOAgABsQELIARBAWohBEGGASEQDK8CCyAEQQFqIQRBhwEhEAyuAgsCQCAEIAJHDQBBnQEhEAzHAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBuM+AgABqLQAARw2vASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBnQEhEAzHAgsgAEEANgIAIBBBAWohAUEmIRAMrAELAkAgBCACRw0AQZ4BIRAMxgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbrPgIAAai0AAEcNrgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ4BIRAMxgILIABBADYCACAQQQFqIQFBAyEQDKsBCwJAIAQgAkcNAEGfASEQDMUCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDa0BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGfASEQDMUCCyAAQQA2AgAgEEEBaiEBQQwhEAyqAQsCQCAEIAJHDQBBoAEhEAzEAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBvM+AgABqLQAARw2sASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBoAEhEAzEAgsgAEEANgIAIBBBAWohAUENIRAMqQELAkAgBCACRw0AQaEBIRAMwwILAkACQCAELQAAQbp/ag4LAKwBrAGsAawBrAGsAawBrAGsAQGsAQsgBEEBaiEEQYsBIRAMqgILIARBAWohBEGMASEQDKkCCwJAIAQgAkcNAEGiASEQDMICCyAELQAAQdAARw2pASAEQQFqIQQM6QELAkAgBCACRw0AQaMBIRAMwQILAkACQCAELQAAQbd/ag4HAaoBqgGqAaoBqgEAqgELIARBAWohBEGOASEQDKgCCyAEQQFqIQFBIiEQDKYBCwJAIAQgAkcNAEGkASEQDMACCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHAz4CAAGotAABHDagBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGkASEQDMACCyAAQQA2AgAgEEEBaiEBQR0hEAylAQsCQCAEIAJHDQBBpQEhEAy/AgsCQAJAIAQtAABBrn9qDgMAqAEBqAELIARBAWohBEGQASEQDKYCCyAEQQFqIQFBBCEQDKQBCwJAIAQgAkcNAEGmASEQDL4CCwJAAkACQAJAAkAgBC0AAEG/f2oOFQCqAaoBqgGqAaoBqgGqAaoBqgGqAQGqAaoBAqoBqgEDqgGqAQSqAQsgBEEBaiEEQYgBIRAMqAILIARBAWohBEGJASEQDKcCCyAEQQFqIQRBigEhEAymAgsgBEEBaiEEQY8BIRAMpQILIARBAWohBEGRASEQDKQCCwJAIAQgAkcNAEGnASEQDL0CCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDaUBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGnASEQDL0CCyAAQQA2AgAgEEEBaiEBQREhEAyiAQsCQCAEIAJHDQBBqAEhEAy8AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBws+AgABqLQAARw2kASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqAEhEAy8AgsgAEEANgIAIBBBAWohAUEsIRAMoQELAkAgBCACRw0AQakBIRAMuwILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQcXPgIAAai0AAEcNowEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQakBIRAMuwILIABBADYCACAQQQFqIQFBKyEQDKABCwJAIAQgAkcNAEGqASEQDLoCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHKz4CAAGotAABHDaIBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGqASEQDLoCCyAAQQA2AgAgEEEBaiEBQRQhEAyfAQsCQCAEIAJHDQBBqwEhEAy5AgsCQAJAAkACQCAELQAAQb5/ag4PAAECpAGkAaQBpAGkAaQBpAGkAaQBpAGkAQOkAQsgBEEBaiEEQZMBIRAMogILIARBAWohBEGUASEQDKECCyAEQQFqIQRBlQEhEAygAgsgBEEBaiEEQZYBIRAMnwILAkAgBCACRw0AQawBIRAMuAILIAQtAABBxQBHDZ8BIARBAWohBAzgAQsCQCAEIAJHDQBBrQEhEAy3AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBzc+AgABqLQAARw2fASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrQEhEAy3AgsgAEEANgIAIBBBAWohAUEOIRAMnAELAkAgBCACRw0AQa4BIRAMtgILIAQtAABB0ABHDZ0BIARBAWohAUElIRAMmwELAkAgBCACRw0AQa8BIRAMtQILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNnQEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQa8BIRAMtQILIABBADYCACAQQQFqIQFBKiEQDJoBCwJAIAQgAkcNAEGwASEQDLQCCwJAAkAgBC0AAEGrf2oOCwCdAZ0BnQGdAZ0BnQGdAZ0BnQEBnQELIARBAWohBEGaASEQDJsCCyAEQQFqIQRBmwEhEAyaAgsCQCAEIAJHDQBBsQEhEAyzAgsCQAJAIAQtAABBv39qDhQAnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBAZwBCyAEQQFqIQRBmQEhEAyaAgsgBEEBaiEEQZwBIRAMmQILAkAgBCACRw0AQbIBIRAMsgILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQdnPgIAAai0AAEcNmgEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbIBIRAMsgILIABBADYCACAQQQFqIQFBISEQDJcBCwJAIAQgAkcNAEGzASEQDLECCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUHdz4CAAGotAABHDZkBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGzASEQDLECCyAAQQA2AgAgEEEBaiEBQRohEAyWAQsCQCAEIAJHDQBBtAEhEAywAgsCQAJAAkAgBC0AAEG7f2oOEQCaAZoBmgGaAZoBmgGaAZoBmgEBmgGaAZoBmgGaAQKaAQsgBEEBaiEEQZ0BIRAMmAILIARBAWohBEGeASEQDJcCCyAEQQFqIQRBnwEhEAyWAgsCQCAEIAJHDQBBtQEhEAyvAgsgAiAEayAAKAIAIgFqIRQgBCABa0EFaiEQAkADQCAELQAAIAFB5M+AgABqLQAARw2XASABQQVGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtQEhEAyvAgsgAEEANgIAIBBBAWohAUEoIRAMlAELAkAgBCACRw0AQbYBIRAMrgILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQerPgIAAai0AAEcNlgEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbYBIRAMrgILIABBADYCACAQQQFqIQFBByEQDJMBCwJAIAQgAkcNAEG3ASEQDK0CCwJAAkAgBC0AAEG7f2oODgCWAZYBlgGWAZYBlgGWAZYBlgGWAZYBlgEBlgELIARBAWohBEGhASEQDJQCCyAEQQFqIQRBogEhEAyTAgsCQCAEIAJHDQBBuAEhEAysAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB7c+AgABqLQAARw2UASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuAEhEAysAgsgAEEANgIAIBBBAWohAUESIRAMkQELAkAgBCACRw0AQbkBIRAMqwILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNkwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbkBIRAMqwILIABBADYCACAQQQFqIQFBICEQDJABCwJAIAQgAkcNAEG6ASEQDKoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHyz4CAAGotAABHDZIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG6ASEQDKoCCyAAQQA2AgAgEEEBaiEBQQ8hEAyPAQsCQCAEIAJHDQBBuwEhEAypAgsCQAJAIAQtAABBt39qDgcAkgGSAZIBkgGSAQGSAQsgBEEBaiEEQaUBIRAMkAILIARBAWohBEGmASEQDI8CCwJAIAQgAkcNAEG8ASEQDKgCCyACIARrIAAoAgAiAWohFCAEIAFrQQdqIRACQANAIAQtAAAgAUH0z4CAAGotAABHDZABIAFBB0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG8ASEQDKgCCyAAQQA2AgAgEEEBaiEBQRshEAyNAQsCQCAEIAJHDQBBvQEhEAynAgsCQAJAAkAgBC0AAEG+f2oOEgCRAZEBkQGRAZEBkQGRAZEBkQEBkQGRAZEBkQGRAZEBApEBCyAEQQFqIQRBpAEhEAyPAgsgBEEBaiEEQacBIRAMjgILIARBAWohBEGoASEQDI0CCwJAIAQgAkcNAEG+ASEQDKYCCyAELQAAQc4ARw2NASAEQQFqIQQMzwELAkAgBCACRw0AQb8BIRAMpQILAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBC0AAEG/f2oOFQABAgOcAQQFBpwBnAGcAQcICQoLnAEMDQ4PnAELIARBAWohAUHoACEQDJoCCyAEQQFqIQFB6QAhEAyZAgsgBEEBaiEBQe4AIRAMmAILIARBAWohAUHyACEQDJcCCyAEQQFqIQFB8wAhEAyWAgsgBEEBaiEBQfYAIRAMlQILIARBAWohAUH3ACEQDJQCCyAEQQFqIQFB+gAhEAyTAgsgBEEBaiEEQYMBIRAMkgILIARBAWohBEGEASEQDJECCyAEQQFqIQRBhQEhEAyQAgsgBEEBaiEEQZIBIRAMjwILIARBAWohBEGYASEQDI4CCyAEQQFqIQRBoAEhEAyNAgsgBEEBaiEEQaMBIRAMjAILIARBAWohBEGqASEQDIsCCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEGrASEQDIsCC0HAASEQDKMCCyAAIAUgAhCqgICAACIBDYsBIAUhAQxcCwJAIAYgAkYNACAGQQFqIQUMjQELQcIBIRAMoQILA0ACQCAQLQAAQXZqDgSMAQAAjwEACyAQQQFqIhAgAkcNAAtBwwEhEAygAgsCQCAHIAJGDQAgAEGRgICAADYCCCAAIAc2AgQgByEBQQEhEAyHAgtBxAEhEAyfAgsCQCAHIAJHDQBBxQEhEAyfAgsCQAJAIActAABBdmoOBAHOAc4BAM4BCyAHQQFqIQYMjQELIAdBAWohBQyJAQsCQCAHIAJHDQBBxgEhEAyeAgsCQAJAIActAABBdmoOFwGPAY8BAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAQCPAQsgB0EBaiEHC0GwASEQDIQCCwJAIAggAkcNAEHIASEQDJ0CCyAILQAAQSBHDY0BIABBADsBMiAIQQFqIQFBswEhEAyDAgsgASEXAkADQCAXIgcgAkYNASAHLQAAQVBqQf8BcSIQQQpPDcwBAkAgAC8BMiIUQZkzSw0AIAAgFEEKbCIUOwEyIBBB//8DcyAUQf7/A3FJDQAgB0EBaiEXIAAgFCAQaiIQOwEyIBBB//8DcUHoB0kNAQsLQQAhECAAQQA2AhwgAEHBiYCAADYCECAAQQ02AgwgACAHQQFqNgIUDJwCC0HHASEQDJsCCyAAIAggAhCugICAACIQRQ3KASAQQRVHDYwBIABByAE2AhwgACAINgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAyaAgsCQCAJIAJHDQBBzAEhEAyaAgtBACEUQQEhF0EBIRZBACEQAkACQAJAAkACQAJAAkACQAJAIAktAABBUGoOCpYBlQEAAQIDBAUGCJcBC0ECIRAMBgtBAyEQDAULQQQhEAwEC0EFIRAMAwtBBiEQDAILQQchEAwBC0EIIRALQQAhF0EAIRZBACEUDI4BC0EJIRBBASEUQQAhF0EAIRYMjQELAkAgCiACRw0AQc4BIRAMmQILIAotAABBLkcNjgEgCkEBaiEJDMoBCyALIAJHDY4BQdABIRAMlwILAkAgCyACRg0AIABBjoCAgAA2AgggACALNgIEQbcBIRAM/gELQdEBIRAMlgILAkAgBCACRw0AQdIBIRAMlgILIAIgBGsgACgCACIQaiEUIAQgEGtBBGohCwNAIAQtAAAgEEH8z4CAAGotAABHDY4BIBBBBEYN6QEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB0gEhEAyVAgsgACAMIAIQrICAgAAiAQ2NASAMIQEMuAELAkAgBCACRw0AQdQBIRAMlAILIAIgBGsgACgCACIQaiEUIAQgEGtBAWohDANAIAQtAAAgEEGB0ICAAGotAABHDY8BIBBBAUYNjgEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB1AEhEAyTAgsCQCAEIAJHDQBB1gEhEAyTAgsgAiAEayAAKAIAIhBqIRQgBCAQa0ECaiELA0AgBC0AACAQQYPQgIAAai0AAEcNjgEgEEECRg2QASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHWASEQDJICCwJAIAQgAkcNAEHXASEQDJICCwJAAkAgBC0AAEG7f2oOEACPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAY8BCyAEQQFqIQRBuwEhEAz5AQsgBEEBaiEEQbwBIRAM+AELAkAgBCACRw0AQdgBIRAMkQILIAQtAABByABHDYwBIARBAWohBAzEAQsCQCAEIAJGDQAgAEGQgICAADYCCCAAIAQ2AgRBvgEhEAz3AQtB2QEhEAyPAgsCQCAEIAJHDQBB2gEhEAyPAgsgBC0AAEHIAEYNwwEgAEEBOgAoDLkBCyAAQQI6AC8gACAEIAIQpoCAgAAiEA2NAUHCASEQDPQBCyAALQAoQX9qDgK3AbkBuAELA0ACQCAELQAAQXZqDgQAjgGOAQCOAQsgBEEBaiIEIAJHDQALQd0BIRAMiwILIABBADoALyAALQAtQQRxRQ2EAgsgAEEAOgAvIABBAToANCABIQEMjAELIBBBFUYN2gEgAEEANgIcIAAgATYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMiAILAkAgACAQIAIQtICAgAAiBA0AIBAhAQyBAgsCQCAEQRVHDQAgAEEDNgIcIAAgEDYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMiAILIABBADYCHCAAIBA2AhQgAEGnjoCAADYCECAAQRI2AgxBACEQDIcCCyAQQRVGDdYBIABBADYCHCAAIAE2AhQgAEHajYCAADYCECAAQRQ2AgxBACEQDIYCCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNjQEgAEEHNgIcIAAgEDYCFCAAIBQ2AgxBACEQDIUCCyAAIAAvATBBgAFyOwEwIAEhAQtBKiEQDOoBCyAQQRVGDdEBIABBADYCHCAAIAE2AhQgAEGDjICAADYCECAAQRM2AgxBACEQDIICCyAQQRVGDc8BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDIECCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyNAQsgAEEMNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDIACCyAQQRVGDcwBIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDP8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyMAQsgAEENNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDP4BCyAQQRVGDckBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDP0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyLAQsgAEEONgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPwBCyAAQQA2AhwgACABNgIUIABBwJWAgAA2AhAgAEECNgIMQQAhEAz7AQsgEEEVRg3FASAAQQA2AhwgACABNgIUIABBxoyAgAA2AhAgAEEjNgIMQQAhEAz6AQsgAEEQNgIcIAAgATYCFCAAIBA2AgxBACEQDPkBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQzxAQsgAEERNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPgBCyAQQRVGDcEBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPcBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyIAQsgAEETNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPYBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQztAQsgAEEUNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPUBCyAQQRVGDb0BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDPQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyGAQsgAEEWNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPMBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQt4CAgAAiBA0AIAFBAWohAQzpAQsgAEEXNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPIBCyAAQQA2AhwgACABNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzxAQtCASERCyAQQQFqIQECQCAAKQMgIhJC//////////8PVg0AIAAgEkIEhiARhDcDICABIQEMhAELIABBADYCHCAAIAE2AhQgAEGtiYCAADYCECAAQQw2AgxBACEQDO8BCyAAQQA2AhwgACAQNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzuAQsgACgCBCEXIABBADYCBCAQIBGnaiIWIQEgACAXIBAgFiAUGyIQELWAgIAAIhRFDXMgAEEFNgIcIAAgEDYCFCAAIBQ2AgxBACEQDO0BCyAAQQA2AhwgACAQNgIUIABBqpyAgAA2AhAgAEEPNgIMQQAhEAzsAQsgACAQIAIQtICAgAAiAQ0BIBAhAQtBDiEQDNEBCwJAIAFBFUcNACAAQQI2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAzqAQsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAM6QELIAFBAWohEAJAIAAvATAiAUGAAXFFDQACQCAAIBAgAhC7gICAACIBDQAgECEBDHALIAFBFUcNugEgAEEFNgIcIAAgEDYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAM6QELAkAgAUGgBHFBoARHDQAgAC0ALUECcQ0AIABBADYCHCAAIBA2AhQgAEGWk4CAADYCECAAQQQ2AgxBACEQDOkBCyAAIBAgAhC9gICAABogECEBAkACQAJAAkACQCAAIBAgAhCzgICAAA4WAgEABAQEBAQEBAQEBAQEBAQEBAQEAwQLIABBAToALgsgACAALwEwQcAAcjsBMCAQIQELQSYhEAzRAQsgAEEjNgIcIAAgEDYCFCAAQaWWgIAANgIQIABBFTYCDEEAIRAM6QELIABBADYCHCAAIBA2AhQgAEHVi4CAADYCECAAQRE2AgxBACEQDOgBCyAALQAtQQFxRQ0BQcMBIRAMzgELAkAgDSACRg0AA0ACQCANLQAAQSBGDQAgDSEBDMQBCyANQQFqIg0gAkcNAAtBJSEQDOcBC0ElIRAM5gELIAAoAgQhBCAAQQA2AgQgACAEIA0Qr4CAgAAiBEUNrQEgAEEmNgIcIAAgBDYCDCAAIA1BAWo2AhRBACEQDOUBCyAQQRVGDasBIABBADYCHCAAIAE2AhQgAEH9jYCAADYCECAAQR02AgxBACEQDOQBCyAAQSc2AhwgACABNgIUIAAgEDYCDEEAIRAM4wELIBAhAUEBIRQCQAJAAkACQAJAAkACQCAALQAsQX5qDgcGBQUDAQIABQsgACAALwEwQQhyOwEwDAMLQQIhFAwBC0EEIRQLIABBAToALCAAIAAvATAgFHI7ATALIBAhAQtBKyEQDMoBCyAAQQA2AhwgACAQNgIUIABBq5KAgAA2AhAgAEELNgIMQQAhEAziAQsgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDEEAIRAM4QELIABBADoALCAQIQEMvQELIBAhAUEBIRQCQAJAAkACQAJAIAAtACxBe2oOBAMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0EpIRAMxQELIABBADYCHCAAIAE2AhQgAEHwlICAADYCECAAQQM2AgxBACEQDN0BCwJAIA4tAABBDUcNACAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA5BAWohAQx1CyAAQSw2AhwgACABNgIMIAAgDkEBajYCFEEAIRAM3QELIAAtAC1BAXFFDQFBxAEhEAzDAQsCQCAOIAJHDQBBLSEQDNwBCwJAAkADQAJAIA4tAABBdmoOBAIAAAMACyAOQQFqIg4gAkcNAAtBLSEQDN0BCyAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA4hAQx0CyAAQSw2AhwgACAONgIUIAAgATYCDEEAIRAM3AELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHMLIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzbAQsgACgCBCEEIABBADYCBCAAIAQgDhCxgICAACIEDaABIA4hAQzOAQsgEEEsRw0BIAFBAWohEEEBIQECQAJAAkACQAJAIAAtACxBe2oOBAMBAgQACyAQIQEMBAtBAiEBDAELQQQhAQsgAEEBOgAsIAAgAC8BMCABcjsBMCAQIQEMAQsgACAALwEwQQhyOwEwIBAhAQtBOSEQDL8BCyAAQQA6ACwgASEBC0E0IRAMvQELIAAgAC8BMEEgcjsBMCABIQEMAgsgACgCBCEEIABBADYCBAJAIAAgBCABELGAgIAAIgQNACABIQEMxwELIABBNzYCHCAAIAE2AhQgACAENgIMQQAhEAzUAQsgAEEIOgAsIAEhAQtBMCEQDLkBCwJAIAAtAChBAUYNACABIQEMBAsgAC0ALUEIcUUNkwEgASEBDAMLIAAtADBBIHENlAFBxQEhEAy3AQsCQCAPIAJGDQACQANAAkAgDy0AAEFQaiIBQf8BcUEKSQ0AIA8hAUE1IRAMugELIAApAyAiEUKZs+bMmbPmzBlWDQEgACARQgp+IhE3AyAgESABrUL/AYMiEkJ/hVYNASAAIBEgEnw3AyAgD0EBaiIPIAJHDQALQTkhEAzRAQsgACgCBCECIABBADYCBCAAIAIgD0EBaiIEELGAgIAAIgINlQEgBCEBDMMBC0E5IRAMzwELAkAgAC8BMCIBQQhxRQ0AIAAtAChBAUcNACAALQAtQQhxRQ2QAQsgACABQff7A3FBgARyOwEwIA8hAQtBNyEQDLQBCyAAIAAvATBBEHI7ATAMqwELIBBBFUYNiwEgAEEANgIcIAAgATYCFCAAQfCOgIAANgIQIABBHDYCDEEAIRAMywELIABBwwA2AhwgACABNgIMIAAgDUEBajYCFEEAIRAMygELAkAgAS0AAEE6Rw0AIAAoAgQhECAAQQA2AgQCQCAAIBAgARCvgICAACIQDQAgAUEBaiEBDGMLIABBwwA2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMygELIABBADYCHCAAIAE2AhQgAEGxkYCAADYCECAAQQo2AgxBACEQDMkBCyAAQQA2AhwgACABNgIUIABBoJmAgAA2AhAgAEEeNgIMQQAhEAzIAQsgAEEANgIACyAAQYASOwEqIAAgF0EBaiIBIAIQqICAgAAiEA0BIAEhAQtBxwAhEAysAQsgEEEVRw2DASAAQdEANgIcIAAgATYCFCAAQeOXgIAANgIQIABBFTYCDEEAIRAMxAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDF4LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMwwELIABBADYCHCAAIBQ2AhQgAEHBqICAADYCECAAQQc2AgwgAEEANgIAQQAhEAzCAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAzBAQtBACEQIABBADYCHCAAIAE2AhQgAEGAkYCAADYCECAAQQk2AgwMwAELIBBBFUYNfSAAQQA2AhwgACABNgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAy/AQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgAUEBaiEBAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBAJAIAAgECABEK2AgIAAIhANACABIQEMXAsgAEHYADYCHCAAIAE2AhQgACAQNgIMQQAhEAy+AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMrQELIABB2QA2AhwgACABNgIUIAAgBDYCDEEAIRAMvQELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKsBCyAAQdoANgIcIAAgATYCFCAAIAQ2AgxBACEQDLwBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQypAQsgAEHcADYCHCAAIAE2AhQgACAENgIMQQAhEAy7AQsCQCABLQAAQVBqIhBB/wFxQQpPDQAgACAQOgAqIAFBAWohAUHPACEQDKIBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQynAQsgAEHeADYCHCAAIAE2AhQgACAENgIMQQAhEAy6AQsgAEEANgIAIBdBAWohAQJAIAAtAClBI08NACABIQEMWQsgAEEANgIcIAAgATYCFCAAQdOJgIAANgIQIABBCDYCDEEAIRAMuQELIABBADYCAAtBACEQIABBADYCHCAAIAE2AhQgAEGQs4CAADYCECAAQQg2AgwMtwELIABBADYCACAXQQFqIQECQCAALQApQSFHDQAgASEBDFYLIABBADYCHCAAIAE2AhQgAEGbioCAADYCECAAQQg2AgxBACEQDLYBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKSIQQV1qQQtPDQAgASEBDFULAkAgEEEGSw0AQQEgEHRBygBxRQ0AIAEhAQxVC0EAIRAgAEEANgIcIAAgATYCFCAAQfeJgIAANgIQIABBCDYCDAy1AQsgEEEVRg1xIABBADYCHCAAIAE2AhQgAEG5jYCAADYCECAAQRo2AgxBACEQDLQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxUCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLMBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAUNgIUIAAgATYCDEEAIRAMogELIABBADYCHCAAIBQ2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKEBCyAAQQA2AhwgACABNgIUIABBw4+AgAA2AhAgAEEHNgIMQQAhEAygAQtBACEQIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgwMnwELIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgxBACEQDJ4BCyAAQQA2AhwgACAUNgIUIABB/pGAgAA2AhAgAEEHNgIMQQAhEAydAQsgAEEANgIcIAAgATYCFCAAQY6bgIAANgIQIABBBjYCDEEAIRAMnAELIBBBFUYNVyAAQQA2AhwgACABNgIUIABBzI6AgAA2AhAgAEEgNgIMQQAhEAybAQsgAEEANgIAIBBBAWohAUEkIRALIAAgEDoAKSAAKAIEIRAgAEEANgIEIAAgECABEKuAgIAAIhANVCABIQEMPgsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQfGbgIAANgIQIABBBjYCDAyXAQsgAUEVRg1QIABBADYCHCAAIAU2AhQgAEHwjICAADYCECAAQRs2AgxBACEQDJYBCyAAKAIEIQUgAEEANgIEIAAgBSAQEKmAgIAAIgUNASAQQQFqIQULQa0BIRAMewsgAEHBATYCHCAAIAU2AgwgACAQQQFqNgIUQQAhEAyTAQsgACgCBCEGIABBADYCBCAAIAYgEBCpgICAACIGDQEgEEEBaiEGC0GuASEQDHgLIABBwgE2AhwgACAGNgIMIAAgEEEBajYCFEEAIRAMkAELIABBADYCHCAAIAc2AhQgAEGXi4CAADYCECAAQQ02AgxBACEQDI8BCyAAQQA2AhwgACAINgIUIABB45CAgAA2AhAgAEEJNgIMQQAhEAyOAQsgAEEANgIcIAAgCDYCFCAAQZSNgIAANgIQIABBITYCDEEAIRAMjQELQQEhFkEAIRdBACEUQQEhEAsgACAQOgArIAlBAWohCAJAAkAgAC0ALUEQcQ0AAkACQAJAIAAtACoOAwEAAgQLIBZFDQMMAgsgFA0BDAILIBdFDQELIAAoAgQhECAAQQA2AgQgACAQIAgQrYCAgAAiEEUNPSAAQckBNgIcIAAgCDYCFCAAIBA2AgxBACEQDIwBCyAAKAIEIQQgAEEANgIEIAAgBCAIEK2AgIAAIgRFDXYgAEHKATYCHCAAIAg2AhQgACAENgIMQQAhEAyLAQsgACgCBCEEIABBADYCBCAAIAQgCRCtgICAACIERQ10IABBywE2AhwgACAJNgIUIAAgBDYCDEEAIRAMigELIAAoAgQhBCAAQQA2AgQgACAEIAoQrYCAgAAiBEUNciAAQc0BNgIcIAAgCjYCFCAAIAQ2AgxBACEQDIkBCwJAIAstAABBUGoiEEH/AXFBCk8NACAAIBA6ACogC0EBaiEKQbYBIRAMcAsgACgCBCEEIABBADYCBCAAIAQgCxCtgICAACIERQ1wIABBzwE2AhwgACALNgIUIAAgBDYCDEEAIRAMiAELIABBADYCHCAAIAQ2AhQgAEGQs4CAADYCECAAQQg2AgwgAEEANgIAQQAhEAyHAQsgAUEVRg0/IABBADYCHCAAIAw2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDIYBCyAAQYEEOwEoIAAoAgQhECAAQgA3AwAgACAQIAxBAWoiDBCrgICAACIQRQ04IABB0wE2AhwgACAMNgIUIAAgEDYCDEEAIRAMhQELIABBADYCAAtBACEQIABBADYCHCAAIAQ2AhQgAEHYm4CAADYCECAAQQg2AgwMgwELIAAoAgQhECAAQgA3AwAgACAQIAtBAWoiCxCrgICAACIQDQFBxgEhEAxpCyAAQQI6ACgMVQsgAEHVATYCHCAAIAs2AhQgACAQNgIMQQAhEAyAAQsgEEEVRg03IABBADYCHCAAIAQ2AhQgAEGkjICAADYCECAAQRA2AgxBACEQDH8LIAAtADRBAUcNNCAAIAQgAhC8gICAACIQRQ00IBBBFUcNNSAAQdwBNgIcIAAgBDYCFCAAQdWWgIAANgIQIABBFTYCDEEAIRAMfgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQMfQtBACEQDGMLQQIhEAxiC0ENIRAMYQtBDyEQDGALQSUhEAxfC0ETIRAMXgtBFSEQDF0LQRYhEAxcC0EXIRAMWwtBGCEQDFoLQRkhEAxZC0EaIRAMWAtBGyEQDFcLQRwhEAxWC0EdIRAMVQtBHyEQDFQLQSEhEAxTC0EjIRAMUgtBxgAhEAxRC0EuIRAMUAtBLyEQDE8LQTshEAxOC0E9IRAMTQtByAAhEAxMC0HJACEQDEsLQcsAIRAMSgtBzAAhEAxJC0HOACEQDEgLQdEAIRAMRwtB1QAhEAxGC0HYACEQDEULQdkAIRAMRAtB2wAhEAxDC0HkACEQDEILQeUAIRAMQQtB8QAhEAxAC0H0ACEQDD8LQY0BIRAMPgtBlwEhEAw9C0GpASEQDDwLQawBIRAMOwtBwAEhEAw6C0G5ASEQDDkLQa8BIRAMOAtBsQEhEAw3C0GyASEQDDYLQbQBIRAMNQtBtQEhEAw0C0G6ASEQDDMLQb0BIRAMMgtBvwEhEAwxC0HBASEQDDALIABBADYCHCAAIAQ2AhQgAEHpi4CAADYCECAAQR82AgxBACEQDEgLIABB2wE2AhwgACAENgIUIABB+paAgAA2AhAgAEEVNgIMQQAhEAxHCyAAQfgANgIcIAAgDDYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMRgsgAEHRADYCHCAAIAU2AhQgAEGwl4CAADYCECAAQRU2AgxBACEQDEULIABB+QA2AhwgACABNgIUIAAgEDYCDEEAIRAMRAsgAEH4ADYCHCAAIAE2AhQgAEHKmICAADYCECAAQRU2AgxBACEQDEMLIABB5AA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAxCCyAAQdcANgIcIAAgATYCFCAAQcmXgIAANgIQIABBFTYCDEEAIRAMQQsgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMQAsgAEHCADYCHCAAIAE2AhQgAEHjmICAADYCECAAQRU2AgxBACEQDD8LIABBADYCBCAAIA8gDxCxgICAACIERQ0BIABBOjYCHCAAIAQ2AgwgACAPQQFqNgIUQQAhEAw+CyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBEUNACAAQTs2AhwgACAENgIMIAAgAUEBajYCFEEAIRAMPgsgAUEBaiEBDC0LIA9BAWohAQwtCyAAQQA2AhwgACAPNgIUIABB5JKAgAA2AhAgAEEENgIMQQAhEAw7CyAAQTY2AhwgACAENgIUIAAgAjYCDEEAIRAMOgsgAEEuNgIcIAAgDjYCFCAAIAQ2AgxBACEQDDkLIABB0AA2AhwgACABNgIUIABBkZiAgAA2AhAgAEEVNgIMQQAhEAw4CyANQQFqIQEMLAsgAEEVNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMNgsgAEEbNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNQsgAEEPNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNAsgAEELNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMMwsgAEEaNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMgsgAEELNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMQsgAEEKNgIcIAAgATYCFCAAQeSWgIAANgIQIABBFTYCDEEAIRAMMAsgAEEeNgIcIAAgATYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAMLwsgAEEANgIcIAAgEDYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMLgsgAEEENgIcIAAgATYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMLQsgAEEANgIAIAtBAWohCwtBuAEhEAwSCyAAQQA2AgAgEEEBaiEBQfUAIRAMEQsgASEBAkAgAC0AKUEFRw0AQeMAIRAMEQtB4gAhEAwQC0EAIRAgAEEANgIcIABB5JGAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAwoCyAAQQA2AgAgF0EBaiEBQcAAIRAMDgtBASEBCyAAIAE6ACwgAEEANgIAIBdBAWohAQtBKCEQDAsLIAEhAQtBOCEQDAkLAkAgASIPIAJGDQADQAJAIA8tAABBgL6AgABqLQAAIgFBAUYNACABQQJHDQMgD0EBaiEBDAQLIA9BAWoiDyACRw0AC0E+IRAMIgtBPiEQDCELIABBADoALCAPIQEMAQtBCyEQDAYLQTohEAwFCyABQQFqIQFBLSEQDAQLIAAgAToALCAAQQA2AgAgFkEBaiEBQQwhEAwDCyAAQQA2AgAgF0EBaiEBQQohEAwCCyAAQQA2AgALIABBADoALCANIQFBCSEQDAALC0EAIRAgAEEANgIcIAAgCzYCFCAAQc2QgIAANgIQIABBCTYCDAwXC0EAIRAgAEEANgIcIAAgCjYCFCAAQemKgIAANgIQIABBCTYCDAwWC0EAIRAgAEEANgIcIAAgCTYCFCAAQbeQgIAANgIQIABBCTYCDAwVC0EAIRAgAEEANgIcIAAgCDYCFCAAQZyRgIAANgIQIABBCTYCDAwUC0EAIRAgAEEANgIcIAAgATYCFCAAQc2QgIAANgIQIABBCTYCDAwTC0EAIRAgAEEANgIcIAAgATYCFCAAQemKgIAANgIQIABBCTYCDAwSC0EAIRAgAEEANgIcIAAgATYCFCAAQbeQgIAANgIQIABBCTYCDAwRC0EAIRAgAEEANgIcIAAgATYCFCAAQZyRgIAANgIQIABBCTYCDAwQC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwPC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwOC0EAIRAgAEEANgIcIAAgATYCFCAAQcCSgIAANgIQIABBCzYCDAwNC0EAIRAgAEEANgIcIAAgATYCFCAAQZWJgIAANgIQIABBCzYCDAwMC0EAIRAgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDAwLC0EAIRAgAEEANgIcIAAgATYCFCAAQfuPgIAANgIQIABBCjYCDAwKC0EAIRAgAEEANgIcIAAgATYCFCAAQfGZgIAANgIQIABBAjYCDAwJC0EAIRAgAEEANgIcIAAgATYCFCAAQcSUgIAANgIQIABBAjYCDAwIC0EAIRAgAEEANgIcIAAgATYCFCAAQfKVgIAANgIQIABBAjYCDAwHCyAAQQI2AhwgACABNgIUIABBnJqAgAA2AhAgAEEWNgIMQQAhEAwGC0EBIRAMBQtB1AAhECABIgQgAkYNBCADQQhqIAAgBCACQdjCgIAAQQoQxYCAgAAgAygCDCEEIAMoAggOAwEEAgALEMqAgIAAAAsgAEEANgIcIABBtZqAgAA2AhAgAEEXNgIMIAAgBEEBajYCFEEAIRAMAgsgAEEANgIcIAAgBDYCFCAAQcqagIAANgIQIABBCTYCDEEAIRAMAQsCQCABIgQgAkcNAEEiIRAMAQsgAEGJgICAADYCCCAAIAQ2AgRBISEQCyADQRBqJICAgIAAIBALrwEBAn8gASgCACEGAkACQCACIANGDQAgBCAGaiEEIAYgA2ogAmshByACIAZBf3MgBWoiBmohBQNAAkAgAi0AACAELQAARg0AQQIhBAwDCwJAIAYNAEEAIQQgBSECDAMLIAZBf2ohBiAEQQFqIQQgAkEBaiICIANHDQALIAchBiADIQILIABBATYCACABIAY2AgAgACACNgIEDwsgAUEANgIAIAAgBDYCACAAIAI2AgQLCgAgABDHgICAAAvyNgELfyOAgICAAEEQayIBJICAgIAAAkBBACgCoNCAgAANAEEAEMuAgIAAQYDUhIAAayICQdkASQ0AQQAhAwJAQQAoAuDTgIAAIgQNAEEAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEIakFwcUHYqtWqBXMiBDYC4NOAgABBAEEANgL004CAAEEAQQA2AsTTgIAAC0EAIAI2AszTgIAAQQBBgNSEgAA2AsjTgIAAQQBBgNSEgAA2ApjQgIAAQQAgBDYCrNCAgABBAEF/NgKo0ICAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALQYDUhIAAQXhBgNSEgABrQQ9xQQBBgNSEgABBCGpBD3EbIgNqIgRBBGogAkFIaiIFIANrIgNBAXI2AgBBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAQYDUhIAAIAVqQTg2AgQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFLDQACQEEAKAKI0ICAACIGQRAgAEETakFwcSAAQQtJGyICQQN2IgR2IgNBA3FFDQACQAJAIANBAXEgBHJBAXMiBUEDdCIEQbDQgIAAaiIDIARBuNCAgABqKAIAIgQoAggiAkcNAEEAIAZBfiAFd3E2AojQgIAADAELIAMgAjYCCCACIAM2AgwLIARBCGohAyAEIAVBA3QiBUEDcjYCBCAEIAVqIgQgBCgCBEEBcjYCBAwMCyACQQAoApDQgIAAIgdNDQECQCADRQ0AAkACQCADIAR0QQIgBHQiA0EAIANrcnEiA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqIgRBA3QiA0Gw0ICAAGoiBSADQbjQgIAAaigCACIDKAIIIgBHDQBBACAGQX4gBHdxIgY2AojQgIAADAELIAUgADYCCCAAIAU2AgwLIAMgAkEDcjYCBCADIARBA3QiBGogBCACayIFNgIAIAMgAmoiACAFQQFyNgIEAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQQCQAJAIAZBASAHQQN2dCIIcQ0AQQAgBiAIcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCAENgIMIAIgBDYCCCAEIAI2AgwgBCAINgIICyADQQhqIQNBACAANgKc0ICAAEEAIAU2ApDQgIAADAwLQQAoAozQgIAAIglFDQEgCUEAIAlrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqQQJ0QbjSgIAAaigCACIAKAIEQXhxIAJrIQQgACEFAkADQAJAIAUoAhAiAw0AIAVBFGooAgAiA0UNAgsgAygCBEF4cSACayIFIAQgBSAESSIFGyEEIAMgACAFGyEAIAMhBQwACwsgACgCGCEKAkAgACgCDCIIIABGDQAgACgCCCIDQQAoApjQgIAASRogCCADNgIIIAMgCDYCDAwLCwJAIABBFGoiBSgCACIDDQAgACgCECIDRQ0DIABBEGohBQsDQCAFIQsgAyIIQRRqIgUoAgAiAw0AIAhBEGohBSAIKAIQIgMNAAsgC0EANgIADAoLQX8hAiAAQb9/Sw0AIABBE2oiA0FwcSECQQAoAozQgIAAIgdFDQBBACELAkAgAkGAAkkNAEEfIQsgAkH///8HSw0AIANBCHYiAyADQYD+P2pBEHZBCHEiA3QiBCAEQYDgH2pBEHZBBHEiBHQiBSAFQYCAD2pBEHZBAnEiBXRBD3YgAyAEciAFcmsiA0EBdCACIANBFWp2QQFxckEcaiELC0EAIAJrIQQCQAJAAkACQCALQQJ0QbjSgIAAaigCACIFDQBBACEDQQAhCAwBC0EAIQMgAkEAQRkgC0EBdmsgC0EfRht0IQBBACEIA0ACQCAFKAIEQXhxIAJrIgYgBE8NACAGIQQgBSEIIAYNAEEAIQQgBSEIIAUhAwwDCyADIAVBFGooAgAiBiAGIAUgAEEddkEEcWpBEGooAgAiBUYbIAMgBhshAyAAQQF0IQAgBQ0ACwsCQCADIAhyDQBBACEIQQIgC3QiA0EAIANrciAHcSIDRQ0DIANBACADa3FBf2oiAyADQQx2QRBxIgN2IgVBBXZBCHEiACADciAFIAB2IgNBAnZBBHEiBXIgAyAFdiIDQQF2QQJxIgVyIAMgBXYiA0EBdkEBcSIFciADIAV2akECdEG40oCAAGooAgAhAwsgA0UNAQsDQCADKAIEQXhxIAJrIgYgBEkhAAJAIAMoAhAiBQ0AIANBFGooAgAhBQsgBiAEIAAbIQQgAyAIIAAbIQggBSEDIAUNAAsLIAhFDQAgBEEAKAKQ0ICAACACa08NACAIKAIYIQsCQCAIKAIMIgAgCEYNACAIKAIIIgNBACgCmNCAgABJGiAAIAM2AgggAyAANgIMDAkLAkAgCEEUaiIFKAIAIgMNACAIKAIQIgNFDQMgCEEQaiEFCwNAIAUhBiADIgBBFGoiBSgCACIDDQAgAEEQaiEFIAAoAhAiAw0ACyAGQQA2AgAMCAsCQEEAKAKQ0ICAACIDIAJJDQBBACgCnNCAgAAhBAJAAkAgAyACayIFQRBJDQAgBCACaiIAIAVBAXI2AgRBACAFNgKQ0ICAAEEAIAA2ApzQgIAAIAQgA2ogBTYCACAEIAJBA3I2AgQMAQsgBCADQQNyNgIEIAQgA2oiAyADKAIEQQFyNgIEQQBBADYCnNCAgABBAEEANgKQ0ICAAAsgBEEIaiEDDAoLAkBBACgClNCAgAAiACACTQ0AQQAoAqDQgIAAIgMgAmoiBCAAIAJrIgVBAXI2AgRBACAFNgKU0ICAAEEAIAQ2AqDQgIAAIAMgAkEDcjYCBCADQQhqIQMMCgsCQAJAQQAoAuDTgIAARQ0AQQAoAujTgIAAIQQMAQtBAEJ/NwLs04CAAEEAQoCAhICAgMAANwLk04CAAEEAIAFBDGpBcHFB2KrVqgVzNgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgABBgIAEIQQLQQAhAwJAIAQgAkHHAGoiB2oiBkEAIARrIgtxIgggAksNAEEAQTA2AvjTgIAADAoLAkBBACgCwNOAgAAiA0UNAAJAQQAoArjTgIAAIgQgCGoiBSAETQ0AIAUgA00NAQtBACEDQQBBMDYC+NOAgAAMCgtBAC0AxNOAgABBBHENBAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQAJAIAMoAgAiBSAESw0AIAUgAygCBGogBEsNAwsgAygCCCIDDQALC0EAEMuAgIAAIgBBf0YNBSAIIQYCQEEAKALk04CAACIDQX9qIgQgAHFFDQAgCCAAayAEIABqQQAgA2txaiEGCyAGIAJNDQUgBkH+////B0sNBQJAQQAoAsDTgIAAIgNFDQBBACgCuNOAgAAiBCAGaiIFIARNDQYgBSADSw0GCyAGEMuAgIAAIgMgAEcNAQwHCyAGIABrIAtxIgZB/v///wdLDQQgBhDLgICAACIAIAMoAgAgAygCBGpGDQMgACEDCwJAIANBf0YNACACQcgAaiAGTQ0AAkAgByAGa0EAKALo04CAACIEakEAIARrcSIEQf7///8HTQ0AIAMhAAwHCwJAIAQQy4CAgABBf0YNACAEIAZqIQYgAyEADAcLQQAgBmsQy4CAgAAaDAQLIAMhACADQX9HDQUMAwtBACEIDAcLQQAhAAwFCyAAQX9HDQILQQBBACgCxNOAgABBBHI2AsTTgIAACyAIQf7///8HSw0BIAgQy4CAgAAhAEEAEMuAgIAAIQMgAEF/Rg0BIANBf0YNASAAIANPDQEgAyAAayIGIAJBOGpNDQELQQBBACgCuNOAgAAgBmoiAzYCuNOAgAACQCADQQAoArzTgIAATQ0AQQAgAzYCvNOAgAALAkACQAJAAkBBACgCoNCAgAAiBEUNAEHI04CAACEDA0AgACADKAIAIgUgAygCBCIIakYNAiADKAIIIgMNAAwDCwsCQAJAQQAoApjQgIAAIgNFDQAgACADTw0BC0EAIAA2ApjQgIAAC0EAIQNBACAGNgLM04CAAEEAIAA2AsjTgIAAQQBBfzYCqNCAgABBAEEAKALg04CAADYCrNCAgABBAEEANgLU04CAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgQgBkFIaiIFIANrIgNBAXI2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAIAAgBWpBODYCBAwCCyADLQAMQQhxDQAgBCAFSQ0AIAQgAE8NACAEQXggBGtBD3FBACAEQQhqQQ9xGyIFaiIAQQAoApTQgIAAIAZqIgsgBWsiBUEBcjYCBCADIAggBmo2AgRBAEEAKALw04CAADYCpNCAgABBACAFNgKU0ICAAEEAIAA2AqDQgIAAIAQgC2pBODYCBAwBCwJAIABBACgCmNCAgAAiCE8NAEEAIAA2ApjQgIAAIAAhCAsgACAGaiEFQcjTgIAAIQMCQAJAAkACQAJAAkACQANAIAMoAgAgBUYNASADKAIIIgMNAAwCCwsgAy0ADEEIcUUNAQtByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiIFIARLDQMLIAMoAgghAwwACwsgAyAANgIAIAMgAygCBCAGajYCBCAAQXggAGtBD3FBACAAQQhqQQ9xG2oiCyACQQNyNgIEIAVBeCAFa0EPcUEAIAVBCGpBD3EbaiIGIAsgAmoiAmshAwJAIAYgBEcNAEEAIAI2AqDQgIAAQQBBACgClNCAgAAgA2oiAzYClNCAgAAgAiADQQFyNgIEDAMLAkAgBkEAKAKc0ICAAEcNAEEAIAI2ApzQgIAAQQBBACgCkNCAgAAgA2oiAzYCkNCAgAAgAiADQQFyNgIEIAIgA2ogAzYCAAwDCwJAIAYoAgQiBEEDcUEBRw0AIARBeHEhBwJAAkAgBEH/AUsNACAGKAIIIgUgBEEDdiIIQQN0QbDQgIAAaiIARhoCQCAGKAIMIgQgBUcNAEEAQQAoAojQgIAAQX4gCHdxNgKI0ICAAAwCCyAEIABGGiAEIAU2AgggBSAENgIMDAELIAYoAhghCQJAAkAgBigCDCIAIAZGDQAgBigCCCIEIAhJGiAAIAQ2AgggBCAANgIMDAELAkAgBkEUaiIEKAIAIgUNACAGQRBqIgQoAgAiBQ0AQQAhAAwBCwNAIAQhCCAFIgBBFGoiBCgCACIFDQAgAEEQaiEEIAAoAhAiBQ0ACyAIQQA2AgALIAlFDQACQAJAIAYgBigCHCIFQQJ0QbjSgIAAaiIEKAIARw0AIAQgADYCACAADQFBAEEAKAKM0ICAAEF+IAV3cTYCjNCAgAAMAgsgCUEQQRQgCSgCECAGRhtqIAA2AgAgAEUNAQsgACAJNgIYAkAgBigCECIERQ0AIAAgBDYCECAEIAA2AhgLIAYoAhQiBEUNACAAQRRqIAQ2AgAgBCAANgIYCyAHIANqIQMgBiAHaiIGKAIEIQQLIAYgBEF+cTYCBCACIANqIAM2AgAgAiADQQFyNgIEAkAgA0H/AUsNACADQXhxQbDQgIAAaiEEAkACQEEAKAKI0ICAACIFQQEgA0EDdnQiA3ENAEEAIAUgA3I2AojQgIAAIAQhAwwBCyAEKAIIIQMLIAMgAjYCDCAEIAI2AgggAiAENgIMIAIgAzYCCAwDC0EfIQQCQCADQf///wdLDQAgA0EIdiIEIARBgP4/akEQdkEIcSIEdCIFIAVBgOAfakEQdkEEcSIFdCIAIABBgIAPakEQdkECcSIAdEEPdiAEIAVyIAByayIEQQF0IAMgBEEVanZBAXFyQRxqIQQLIAIgBDYCHCACQgA3AhAgBEECdEG40oCAAGohBQJAQQAoAozQgIAAIgBBASAEdCIIcQ0AIAUgAjYCAEEAIAAgCHI2AozQgIAAIAIgBTYCGCACIAI2AgggAiACNgIMDAMLIANBAEEZIARBAXZrIARBH0YbdCEEIAUoAgAhAANAIAAiBSgCBEF4cSADRg0CIARBHXYhACAEQQF0IQQgBSAAQQRxakEQaiIIKAIAIgANAAsgCCACNgIAIAIgBTYCGCACIAI2AgwgAiACNgIIDAILIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgsgBkFIaiIIIANrIgNBAXI2AgQgACAIakE4NgIEIAQgBUE3IAVrQQ9xQQAgBUFJakEPcRtqQUFqIgggCCAEQRBqSRsiCEEjNgIEQQBBACgC8NOAgAA2AqTQgIAAQQAgAzYClNCAgABBACALNgKg0ICAACAIQRBqQQApAtDTgIAANwIAIAhBACkCyNOAgAA3AghBACAIQQhqNgLQ04CAAEEAIAY2AszTgIAAQQAgADYCyNOAgABBAEEANgLU04CAACAIQSRqIQMDQCADQQc2AgAgA0EEaiIDIAVJDQALIAggBEYNAyAIIAgoAgRBfnE2AgQgCCAIIARrIgA2AgAgBCAAQQFyNgIEAkAgAEH/AUsNACAAQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgAEEDdnQiAHENAEEAIAUgAHI2AojQgIAAIAMhBQwBCyADKAIIIQULIAUgBDYCDCADIAQ2AgggBCADNgIMIAQgBTYCCAwEC0EfIQMCQCAAQf///wdLDQAgAEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCIIIAhBgIAPakEQdkECcSIIdEEPdiADIAVyIAhyayIDQQF0IAAgA0EVanZBAXFyQRxqIQMLIAQgAzYCHCAEQgA3AhAgA0ECdEG40oCAAGohBQJAQQAoAozQgIAAIghBASADdCIGcQ0AIAUgBDYCAEEAIAggBnI2AozQgIAAIAQgBTYCGCAEIAQ2AgggBCAENgIMDAQLIABBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhCANAIAgiBSgCBEF4cSAARg0DIANBHXYhCCADQQF0IQMgBSAIQQRxakEQaiIGKAIAIggNAAsgBiAENgIAIAQgBTYCGCAEIAQ2AgwgBCAENgIIDAMLIAUoAggiAyACNgIMIAUgAjYCCCACQQA2AhggAiAFNgIMIAIgAzYCCAsgC0EIaiEDDAULIAUoAggiAyAENgIMIAUgBDYCCCAEQQA2AhggBCAFNgIMIAQgAzYCCAtBACgClNCAgAAiAyACTQ0AQQAoAqDQgIAAIgQgAmoiBSADIAJrIgNBAXI2AgRBACADNgKU0ICAAEEAIAU2AqDQgIAAIAQgAkEDcjYCBCAEQQhqIQMMAwtBACEDQQBBMDYC+NOAgAAMAgsCQCALRQ0AAkACQCAIIAgoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAA2AgAgAA0BQQAgB0F+IAV3cSIHNgKM0ICAAAwCCyALQRBBFCALKAIQIAhGG2ogADYCACAARQ0BCyAAIAs2AhgCQCAIKAIQIgNFDQAgACADNgIQIAMgADYCGAsgCEEUaigCACIDRQ0AIABBFGogAzYCACADIAA2AhgLAkACQCAEQQ9LDQAgCCAEIAJqIgNBA3I2AgQgCCADaiIDIAMoAgRBAXI2AgQMAQsgCCACaiIAIARBAXI2AgQgCCACQQNyNgIEIAAgBGogBDYCAAJAIARB/wFLDQAgBEF4cUGw0ICAAGohAwJAAkBBACgCiNCAgAAiBUEBIARBA3Z0IgRxDQBBACAFIARyNgKI0ICAACADIQQMAQsgAygCCCEECyAEIAA2AgwgAyAANgIIIAAgAzYCDCAAIAQ2AggMAQtBHyEDAkAgBEH///8HSw0AIARBCHYiAyADQYD+P2pBEHZBCHEiA3QiBSAFQYDgH2pBEHZBBHEiBXQiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAFciACcmsiA0EBdCAEIANBFWp2QQFxckEcaiEDCyAAIAM2AhwgAEIANwIQIANBAnRBuNKAgABqIQUCQCAHQQEgA3QiAnENACAFIAA2AgBBACAHIAJyNgKM0ICAACAAIAU2AhggACAANgIIIAAgADYCDAwBCyAEQQBBGSADQQF2ayADQR9GG3QhAyAFKAIAIQICQANAIAIiBSgCBEF4cSAERg0BIANBHXYhAiADQQF0IQMgBSACQQRxakEQaiIGKAIAIgINAAsgBiAANgIAIAAgBTYCGCAAIAA2AgwgACAANgIIDAELIAUoAggiAyAANgIMIAUgADYCCCAAQQA2AhggACAFNgIMIAAgAzYCCAsgCEEIaiEDDAELAkAgCkUNAAJAAkAgACAAKAIcIgVBAnRBuNKAgABqIgMoAgBHDQAgAyAINgIAIAgNAUEAIAlBfiAFd3E2AozQgIAADAILIApBEEEUIAooAhAgAEYbaiAINgIAIAhFDQELIAggCjYCGAJAIAAoAhAiA0UNACAIIAM2AhAgAyAINgIYCyAAQRRqKAIAIgNFDQAgCEEUaiADNgIAIAMgCDYCGAsCQAJAIARBD0sNACAAIAQgAmoiA0EDcjYCBCAAIANqIgMgAygCBEEBcjYCBAwBCyAAIAJqIgUgBEEBcjYCBCAAIAJBA3I2AgQgBSAEaiAENgIAAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQMCQAJAQQEgB0EDdnQiCCAGcQ0AQQAgCCAGcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCADNgIMIAIgAzYCCCADIAI2AgwgAyAINgIIC0EAIAU2ApzQgIAAQQAgBDYCkNCAgAALIABBCGohAwsgAUEQaiSAgICAACADCwoAIAAQyYCAgAAL4g0BB38CQCAARQ0AIABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAIAJBAXENACACQQNxRQ0BIAEgASgCACICayIBQQAoApjQgIAAIgRJDQEgAiAAaiEAAkAgAUEAKAKc0ICAAEYNAAJAIAJB/wFLDQAgASgCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgASgCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAwsgAiAGRhogAiAENgIIIAQgAjYCDAwCCyABKAIYIQcCQAJAIAEoAgwiBiABRg0AIAEoAggiAiAESRogBiACNgIIIAIgBjYCDAwBCwJAIAFBFGoiAigCACIEDQAgAUEQaiICKAIAIgQNAEEAIQYMAQsDQCACIQUgBCIGQRRqIgIoAgAiBA0AIAZBEGohAiAGKAIQIgQNAAsgBUEANgIACyAHRQ0BAkACQCABIAEoAhwiBEECdEG40oCAAGoiAigCAEcNACACIAY2AgAgBg0BQQBBACgCjNCAgABBfiAEd3E2AozQgIAADAMLIAdBEEEUIAcoAhAgAUYbaiAGNgIAIAZFDQILIAYgBzYCGAJAIAEoAhAiAkUNACAGIAI2AhAgAiAGNgIYCyABKAIUIgJFDQEgBkEUaiACNgIAIAIgBjYCGAwBCyADKAIEIgJBA3FBA0cNACADIAJBfnE2AgRBACAANgKQ0ICAACABIABqIAA2AgAgASAAQQFyNgIEDwsgASADTw0AIAMoAgQiAkEBcUUNAAJAAkAgAkECcQ0AAkAgA0EAKAKg0ICAAEcNAEEAIAE2AqDQgIAAQQBBACgClNCAgAAgAGoiADYClNCAgAAgASAAQQFyNgIEIAFBACgCnNCAgABHDQNBAEEANgKQ0ICAAEEAQQA2ApzQgIAADwsCQCADQQAoApzQgIAARw0AQQAgATYCnNCAgABBAEEAKAKQ0ICAACAAaiIANgKQ0ICAACABIABBAXI2AgQgASAAaiAANgIADwsgAkF4cSAAaiEAAkACQCACQf8BSw0AIAMoAggiBCACQQN2IgVBA3RBsNCAgABqIgZGGgJAIAMoAgwiAiAERw0AQQBBACgCiNCAgABBfiAFd3E2AojQgIAADAILIAIgBkYaIAIgBDYCCCAEIAI2AgwMAQsgAygCGCEHAkACQCADKAIMIgYgA0YNACADKAIIIgJBACgCmNCAgABJGiAGIAI2AgggAiAGNgIMDAELAkAgA0EUaiICKAIAIgQNACADQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQACQAJAIAMgAygCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAgsgB0EQQRQgBygCECADRhtqIAY2AgAgBkUNAQsgBiAHNgIYAkAgAygCECICRQ0AIAYgAjYCECACIAY2AhgLIAMoAhQiAkUNACAGQRRqIAI2AgAgAiAGNgIYCyABIABqIAA2AgAgASAAQQFyNgIEIAFBACgCnNCAgABHDQFBACAANgKQ0ICAAA8LIAMgAkF+cTYCBCABIABqIAA2AgAgASAAQQFyNgIECwJAIABB/wFLDQAgAEF4cUGw0ICAAGohAgJAAkBBACgCiNCAgAAiBEEBIABBA3Z0IgBxDQBBACAEIAByNgKI0ICAACACIQAMAQsgAigCCCEACyAAIAE2AgwgAiABNgIIIAEgAjYCDCABIAA2AggPC0EfIQICQCAAQf///wdLDQAgAEEIdiICIAJBgP4/akEQdkEIcSICdCIEIARBgOAfakEQdkEEcSIEdCIGIAZBgIAPakEQdkECcSIGdEEPdiACIARyIAZyayICQQF0IAAgAkEVanZBAXFyQRxqIQILIAEgAjYCHCABQgA3AhAgAkECdEG40oCAAGohBAJAAkBBACgCjNCAgAAiBkEBIAJ0IgNxDQAgBCABNgIAQQAgBiADcjYCjNCAgAAgASAENgIYIAEgATYCCCABIAE2AgwMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgBCgCACEGAkADQCAGIgQoAgRBeHEgAEYNASACQR12IQYgAkEBdCECIAQgBkEEcWpBEGoiAygCACIGDQALIAMgATYCACABIAQ2AhggASABNgIMIAEgATYCCAwBCyAEKAIIIgAgATYCDCAEIAE2AgggAUEANgIYIAEgBDYCDCABIAA2AggLQQBBACgCqNCAgABBf2oiAUF/IAEbNgKo0ICAAAsLBAAAAAtOAAJAIAANAD8AQRB0DwsCQCAAQf//A3ENACAAQX9MDQACQCAAQRB2QAAiAEF/Rw0AQQBBMDYC+NOAgABBfw8LIABBEHQPCxDKgICAAAAL8gICA38BfgJAIAJFDQAgACABOgAAIAIgAGoiA0F/aiABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBfWogAToAACADQX5qIAE6AAAgAkEHSQ0AIAAgAToAAyADQXxqIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIFayICQSBJDQAgAa1CgYCAgBB+IQYgAyAFaiEBA0AgASAGNwMYIAEgBjcDECABIAY3AwggASAGNwMAIAFBIGohASACQWBqIgJBH0sNAAsLIAALC45IAQBBgAgLhkgBAAAAAgAAAAMAAAAAAAAAAAAAAAQAAAAFAAAAAAAAAAAAAAAGAAAABwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEludmFsaWQgY2hhciBpbiB1cmwgcXVlcnkAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9ib2R5AENvbnRlbnQtTGVuZ3RoIG92ZXJmbG93AENodW5rIHNpemUgb3ZlcmZsb3cAUmVzcG9uc2Ugb3ZlcmZsb3cASW52YWxpZCBtZXRob2QgZm9yIEhUVFAveC54IHJlcXVlc3QASW52YWxpZCBtZXRob2QgZm9yIFJUU1AveC54IHJlcXVlc3QARXhwZWN0ZWQgU09VUkNFIG1ldGhvZCBmb3IgSUNFL3gueCByZXF1ZXN0AEludmFsaWQgY2hhciBpbiB1cmwgZnJhZ21lbnQgc3RhcnQARXhwZWN0ZWQgZG90AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fc3RhdHVzAEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8=' -class FileReader extends EventTarget { - constructor () { - super() - this[kState] = 'empty' - this[kResult] = null - this[kError] = null - this[kEvents] = { - loadend: null, - error: null, - abort: null, - load: null, - progress: null, - loadstart: null - } - } +/***/ }), - /** - * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer - * @param {import('buffer').Blob} blob - */ - readAsArrayBuffer (blob) { - webidl.brandCheck(this, FileReader) +/***/ 95627: +/***/ ((module) => { - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsArrayBuffer' }) +module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCrLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC0kBAXsgAEEQav0MAAAAAAAAAAAAAAAAAAAAACIB/QsDACAAIAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AcsBygG4AckBuQHIAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBANwBC0EAIRAMxgELQQ4hEAzFAQtBDSEQDMQBC0EPIRAMwwELQRAhEAzCAQtBEyEQDMEBC0EUIRAMwAELQRUhEAy/AQtBFiEQDL4BC0EXIRAMvQELQRghEAy8AQtBGSEQDLsBC0EaIRAMugELQRshEAy5AQtBHCEQDLgBC0EIIRAMtwELQR0hEAy2AQtBICEQDLUBC0EfIRAMtAELQQchEAyzAQtBISEQDLIBC0EiIRAMsQELQR4hEAywAQtBIyEQDK8BC0ESIRAMrgELQREhEAytAQtBJCEQDKwBC0ElIRAMqwELQSYhEAyqAQtBJyEQDKkBC0HDASEQDKgBC0EpIRAMpwELQSshEAymAQtBLCEQDKUBC0EtIRAMpAELQS4hEAyjAQtBLyEQDKIBC0HEASEQDKEBC0EwIRAMoAELQTQhEAyfAQtBDCEQDJ4BC0ExIRAMnQELQTIhEAycAQtBMyEQDJsBC0E5IRAMmgELQTUhEAyZAQtBxQEhEAyYAQtBCyEQDJcBC0E6IRAMlgELQTYhEAyVAQtBCiEQDJQBC0E3IRAMkwELQTghEAySAQtBPCEQDJEBC0E7IRAMkAELQT0hEAyPAQtBCSEQDI4BC0EoIRAMjQELQT4hEAyMAQtBPyEQDIsBC0HAACEQDIoBC0HBACEQDIkBC0HCACEQDIgBC0HDACEQDIcBC0HEACEQDIYBC0HFACEQDIUBC0HGACEQDIQBC0EqIRAMgwELQccAIRAMggELQcgAIRAMgQELQckAIRAMgAELQcoAIRAMfwtBywAhEAx+C0HNACEQDH0LQcwAIRAMfAtBzgAhEAx7C0HPACEQDHoLQdAAIRAMeQtB0QAhEAx4C0HSACEQDHcLQdMAIRAMdgtB1AAhEAx1C0HWACEQDHQLQdUAIRAMcwtBBiEQDHILQdcAIRAMcQtBBSEQDHALQdgAIRAMbwtBBCEQDG4LQdkAIRAMbQtB2gAhEAxsC0HbACEQDGsLQdwAIRAMagtBAyEQDGkLQd0AIRAMaAtB3gAhEAxnC0HfACEQDGYLQeEAIRAMZQtB4AAhEAxkC0HiACEQDGMLQeMAIRAMYgtBAiEQDGELQeQAIRAMYAtB5QAhEAxfC0HmACEQDF4LQecAIRAMXQtB6AAhEAxcC0HpACEQDFsLQeoAIRAMWgtB6wAhEAxZC0HsACEQDFgLQe0AIRAMVwtB7gAhEAxWC0HvACEQDFULQfAAIRAMVAtB8QAhEAxTC0HyACEQDFILQfMAIRAMUQtB9AAhEAxQC0H1ACEQDE8LQfYAIRAMTgtB9wAhEAxNC0H4ACEQDEwLQfkAIRAMSwtB+gAhEAxKC0H7ACEQDEkLQfwAIRAMSAtB/QAhEAxHC0H+ACEQDEYLQf8AIRAMRQtBgAEhEAxEC0GBASEQDEMLQYIBIRAMQgtBgwEhEAxBC0GEASEQDEALQYUBIRAMPwtBhgEhEAw+C0GHASEQDD0LQYgBIRAMPAtBiQEhEAw7C0GKASEQDDoLQYsBIRAMOQtBjAEhEAw4C0GNASEQDDcLQY4BIRAMNgtBjwEhEAw1C0GQASEQDDQLQZEBIRAMMwtBkgEhEAwyC0GTASEQDDELQZQBIRAMMAtBlQEhEAwvC0GWASEQDC4LQZcBIRAMLQtBmAEhEAwsC0GZASEQDCsLQZoBIRAMKgtBmwEhEAwpC0GcASEQDCgLQZ0BIRAMJwtBngEhEAwmC0GfASEQDCULQaABIRAMJAtBoQEhEAwjC0GiASEQDCILQaMBIRAMIQtBpAEhEAwgC0GlASEQDB8LQaYBIRAMHgtBpwEhEAwdC0GoASEQDBwLQakBIRAMGwtBqgEhEAwaC0GrASEQDBkLQawBIRAMGAtBrQEhEAwXC0GuASEQDBYLQQEhEAwVC0GvASEQDBQLQbABIRAMEwtBsQEhEAwSC0GzASEQDBELQbIBIRAMEAtBtAEhEAwPC0G1ASEQDA4LQbYBIRAMDQtBtwEhEAwMC0G4ASEQDAsLQbkBIRAMCgtBugEhEAwJC0G7ASEQDAgLQcYBIRAMBwtBvAEhEAwGC0G9ASEQDAULQb4BIRAMBAtBvwEhEAwDC0HAASEQDAILQcIBIRAMAQtBwQEhEAsDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB4fICEjJSg/QEFERUZHSElKS0xNT1BRUlPeA1dZW1xdYGJlZmdoaWprbG1vcHFyc3R1dnd4eXp7fH1+gAGCAYUBhgGHAYkBiwGMAY0BjgGPAZABkQGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMBmQKkArAC/gL+AgsgASIEIAJHDfMBQd0BIRAM/wMLIAEiECACRw3dAUHDASEQDP4DCyABIgEgAkcNkAFB9wAhEAz9AwsgASIBIAJHDYYBQe8AIRAM/AMLIAEiASACRw1/QeoAIRAM+wMLIAEiASACRw17QegAIRAM+gMLIAEiASACRw14QeYAIRAM+QMLIAEiASACRw0aQRghEAz4AwsgASIBIAJHDRRBEiEQDPcDCyABIgEgAkcNWUHFACEQDPYDCyABIgEgAkcNSkE/IRAM9QMLIAEiASACRw1IQTwhEAz0AwsgASIBIAJHDUFBMSEQDPMDCyAALQAuQQFGDesDDIcCCyAAIAEiASACEMCAgIAAQQFHDeYBIABCADcDIAznAQsgACABIgEgAhC0gICAACIQDecBIAEhAQz1AgsCQCABIgEgAkcNAEEGIRAM8AMLIAAgAUEBaiIBIAIQu4CAgAAiEA3oASABIQEMMQsgAEIANwMgQRIhEAzVAwsgASIQIAJHDStBHSEQDO0DCwJAIAEiASACRg0AIAFBAWohAUEQIRAM1AMLQQchEAzsAwsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3lAUEIIRAM6wMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQRQhEAzSAwtBCSEQDOoDCyABIQEgACkDIFAN5AEgASEBDPICCwJAIAEiASACRw0AQQshEAzpAwsgACABQQFqIgEgAhC2gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeYBIAEhAQwNCyAAIAEiASACELqAgIAAIhAN5wEgASEBDPACCwJAIAEiASACRw0AQQ8hEAzlAwsgAS0AACIQQTtGDQggEEENRw3oASABQQFqIQEM7wILIAAgASIBIAIQuoCAgAAiEA3oASABIQEM8gILA0ACQCABLQAAQfC1gIAAai0AACIQQQFGDQAgEEECRw3rASAAKAIEIRAgAEEANgIEIAAgECABQQFqIgEQuYCAgAAiEA3qASABIQEM9AILIAFBAWoiASACRw0AC0ESIRAM4gMLIAAgASIBIAIQuoCAgAAiEA3pASABIQEMCgsgASIBIAJHDQZBGyEQDOADCwJAIAEiASACRw0AQRYhEAzgAwsgAEGKgICAADYCCCAAIAE2AgQgACABIAIQuICAgAAiEA3qASABIQFBICEQDMYDCwJAIAEiASACRg0AA0ACQCABLQAAQfC3gIAAai0AACIQQQJGDQACQCAQQX9qDgTlAewBAOsB7AELIAFBAWohAUEIIRAMyAMLIAFBAWoiASACRw0AC0EVIRAM3wMLQRUhEAzeAwsDQAJAIAEtAABB8LmAgABqLQAAIhBBAkYNACAQQX9qDgTeAewB4AHrAewBCyABQQFqIgEgAkcNAAtBGCEQDN0DCwJAIAEiASACRg0AIABBi4CAgAA2AgggACABNgIEIAEhAUEHIRAMxAMLQRkhEAzcAwsgAUEBaiEBDAILAkAgASIUIAJHDQBBGiEQDNsDCyAUIQECQCAULQAAQXNqDhTdAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAgDuAgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQM2gMLAkAgAS0AACIQQTtGDQAgEEENRw3oASABQQFqIQEM5QILIAFBAWohAQtBIiEQDL8DCwJAIAEiECACRw0AQRwhEAzYAwtCACERIBAhASAQLQAAQVBqDjfnAeYBAQIDBAUGBwgAAAAAAAAACQoLDA0OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBESExQAC0EeIRAMvQMLQgIhEQzlAQtCAyERDOQBC0IEIREM4wELQgUhEQziAQtCBiERDOEBC0IHIREM4AELQgghEQzfAQtCCSERDN4BC0IKIREM3QELQgshEQzcAQtCDCERDNsBC0INIREM2gELQg4hEQzZAQtCDyERDNgBC0IKIREM1wELQgshEQzWAQtCDCERDNUBC0INIREM1AELQg4hEQzTAQtCDyERDNIBC0IAIRECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAtAABBUGoON+UB5AEAAQIDBAUGB+YB5gHmAeYB5gHmAeYBCAkKCwwN5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAQ4PEBESE+YBC0ICIREM5AELQgMhEQzjAQtCBCERDOIBC0IFIREM4QELQgYhEQzgAQtCByERDN8BC0IIIREM3gELQgkhEQzdAQtCCiERDNwBC0ILIREM2wELQgwhEQzaAQtCDSERDNkBC0IOIREM2AELQg8hEQzXAQtCCiERDNYBC0ILIREM1QELQgwhEQzUAQtCDSERDNMBC0IOIREM0gELQg8hEQzRAQsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3SAUEfIRAMwAMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQSQhEAynAwtBICEQDL8DCyAAIAEiECACEL6AgIAAQX9qDgW2AQDFAgHRAdIBC0ERIRAMpAMLIABBAToALyAQIQEMuwMLIAEiASACRw3SAUEkIRAMuwMLIAEiDSACRw0eQcYAIRAMugMLIAAgASIBIAIQsoCAgAAiEA3UASABIQEMtQELIAEiECACRw0mQdAAIRAMuAMLAkAgASIBIAJHDQBBKCEQDLgDCyAAQQA2AgQgAEGMgICAADYCCCAAIAEgARCxgICAACIQDdMBIAEhAQzYAQsCQCABIhAgAkcNAEEpIRAMtwMLIBAtAAAiAUEgRg0UIAFBCUcN0wEgEEEBaiEBDBULAkAgASIBIAJGDQAgAUEBaiEBDBcLQSohEAy1AwsCQCABIhAgAkcNAEErIRAMtQMLAkAgEC0AACIBQQlGDQAgAUEgRw3VAQsgAC0ALEEIRg3TASAQIQEMkQMLAkAgASIBIAJHDQBBLCEQDLQDCyABLQAAQQpHDdUBIAFBAWohAQzJAgsgASIOIAJHDdUBQS8hEAyyAwsDQAJAIAEtAAAiEEEgRg0AAkAgEEF2ag4EANwB3AEA2gELIAEhAQzgAQsgAUEBaiIBIAJHDQALQTEhEAyxAwtBMiEQIAEiFCACRg2wAyACIBRrIAAoAgAiAWohFSAUIAFrQQNqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB8LuAgABqLQAARw0BAkAgAUEDRw0AQQYhAQyWAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMsQMLIABBADYCACAUIQEM2QELQTMhECABIhQgAkYNrwMgAiAUayAAKAIAIgFqIRUgFCABa0EIaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfS7gIAAai0AAEcNAQJAIAFBCEcNAEEFIQEMlQMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLADCyAAQQA2AgAgFCEBDNgBC0E0IRAgASIUIAJGDa4DIAIgFGsgACgCACIBaiEVIBQgAWtBBWohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUHQwoCAAGotAABHDQECQCABQQVHDQBBByEBDJQDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAyvAwsgAEEANgIAIBQhAQzXAQsCQCABIgEgAkYNAANAAkAgAS0AAEGAvoCAAGotAAAiEEEBRg0AIBBBAkYNCiABIQEM3QELIAFBAWoiASACRw0AC0EwIRAMrgMLQTAhEAytAwsCQCABIgEgAkYNAANAAkAgAS0AACIQQSBGDQAgEEF2ag4E2QHaAdoB2QHaAQsgAUEBaiIBIAJHDQALQTghEAytAwtBOCEQDKwDCwNAAkAgAS0AACIQQSBGDQAgEEEJRw0DCyABQQFqIgEgAkcNAAtBPCEQDKsDCwNAAkAgAS0AACIQQSBGDQACQAJAIBBBdmoOBNoBAQHaAQALIBBBLEYN2wELIAEhAQwECyABQQFqIgEgAkcNAAtBPyEQDKoDCyABIQEM2wELQcAAIRAgASIUIAJGDagDIAIgFGsgACgCACIBaiEWIBQgAWtBBmohFwJAA0AgFC0AAEEgciABQYDAgIAAai0AAEcNASABQQZGDY4DIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADKkDCyAAQQA2AgAgFCEBC0E2IRAMjgMLAkAgASIPIAJHDQBBwQAhEAynAwsgAEGMgICAADYCCCAAIA82AgQgDyEBIAAtACxBf2oOBM0B1QHXAdkBhwMLIAFBAWohAQzMAQsCQCABIgEgAkYNAANAAkAgAS0AACIQQSByIBAgEEG/f2pB/wFxQRpJG0H/AXEiEEEJRg0AIBBBIEYNAAJAAkACQAJAIBBBnX9qDhMAAwMDAwMDAwEDAwMDAwMDAwMCAwsgAUEBaiEBQTEhEAyRAwsgAUEBaiEBQTIhEAyQAwsgAUEBaiEBQTMhEAyPAwsgASEBDNABCyABQQFqIgEgAkcNAAtBNSEQDKUDC0E1IRAMpAMLAkAgASIBIAJGDQADQAJAIAEtAABBgLyAgABqLQAAQQFGDQAgASEBDNMBCyABQQFqIgEgAkcNAAtBPSEQDKQDC0E9IRAMowMLIAAgASIBIAIQsICAgAAiEA3WASABIQEMAQsgEEEBaiEBC0E8IRAMhwMLAkAgASIBIAJHDQBBwgAhEAygAwsCQANAAkAgAS0AAEF3ag4YAAL+Av4ChAP+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gIA/gILIAFBAWoiASACRw0AC0HCACEQDKADCyABQQFqIQEgAC0ALUEBcUUNvQEgASEBC0EsIRAMhQMLIAEiASACRw3TAUHEACEQDJ0DCwNAAkAgAS0AAEGQwICAAGotAABBAUYNACABIQEMtwILIAFBAWoiASACRw0AC0HFACEQDJwDCyANLQAAIhBBIEYNswEgEEE6Rw2BAyAAKAIEIQEgAEEANgIEIAAgASANEK+AgIAAIgEN0AEgDUEBaiEBDLMCC0HHACEQIAEiDSACRg2aAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQZDCgIAAai0AAEcNgAMgAUEFRg30AiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyaAwtByAAhECABIg0gAkYNmQMgAiANayAAKAIAIgFqIRYgDSABa0EJaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGWwoCAAGotAABHDf8CAkAgAUEJRw0AQQIhAQz1AgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmQMLAkAgASINIAJHDQBByQAhEAyZAwsCQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZJ/ag4HAIADgAOAA4ADgAMBgAMLIA1BAWohAUE+IRAMgAMLIA1BAWohAUE/IRAM/wILQcoAIRAgASINIAJGDZcDIAIgDWsgACgCACIBaiEWIA0gAWtBAWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBoMKAgABqLQAARw39AiABQQFGDfACIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJcDC0HLACEQIAEiDSACRg2WAyACIA1rIAAoAgAiAWohFiANIAFrQQ5qIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaLCgIAAai0AAEcN/AIgAUEORg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyWAwtBzAAhECABIg0gAkYNlQMgAiANayAAKAIAIgFqIRYgDSABa0EPaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUHAwoCAAGotAABHDfsCAkAgAUEPRw0AQQMhAQzxAgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlQMLQc0AIRAgASINIAJGDZQDIAIgDWsgACgCACIBaiEWIA0gAWtBBWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw36AgJAIAFBBUcNAEEEIQEM8AILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJQDCwJAIAEiDSACRw0AQc4AIRAMlAMLAkACQAJAAkAgDS0AACIBQSByIAEgAUG/f2pB/wFxQRpJG0H/AXFBnX9qDhMA/QL9Av0C/QL9Av0C/QL9Av0C/QL9Av0CAf0C/QL9AgID/QILIA1BAWohAUHBACEQDP0CCyANQQFqIQFBwgAhEAz8AgsgDUEBaiEBQcMAIRAM+wILIA1BAWohAUHEACEQDPoCCwJAIAEiASACRg0AIABBjYCAgAA2AgggACABNgIEIAEhAUHFACEQDPoCC0HPACEQDJIDCyAQIQECQAJAIBAtAABBdmoOBAGoAqgCAKgCCyAQQQFqIQELQSchEAz4AgsCQCABIgEgAkcNAEHRACEQDJEDCwJAIAEtAABBIEYNACABIQEMjQELIAFBAWohASAALQAtQQFxRQ3HASABIQEMjAELIAEiFyACRw3IAUHSACEQDI8DC0HTACEQIAEiFCACRg2OAyACIBRrIAAoAgAiAWohFiAUIAFrQQFqIRcDQCAULQAAIAFB1sKAgABqLQAARw3MASABQQFGDccBIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADI4DCwJAIAEiASACRw0AQdUAIRAMjgMLIAEtAABBCkcNzAEgAUEBaiEBDMcBCwJAIAEiASACRw0AQdYAIRAMjQMLAkACQCABLQAAQXZqDgQAzQHNAQHNAQsgAUEBaiEBDMcBCyABQQFqIQFBygAhEAzzAgsgACABIgEgAhCugICAACIQDcsBIAEhAUHNACEQDPICCyAALQApQSJGDYUDDKYCCwJAIAEiASACRw0AQdsAIRAMigMLQQAhFEEBIRdBASEWQQAhEAJAAkACQAJAAkACQAJAAkACQCABLQAAQVBqDgrUAdMBAAECAwQFBgjVAQtBAiEQDAYLQQMhEAwFC0EEIRAMBAtBBSEQDAMLQQYhEAwCC0EHIRAMAQtBCCEQC0EAIRdBACEWQQAhFAzMAQtBCSEQQQEhFEEAIRdBACEWDMsBCwJAIAEiASACRw0AQd0AIRAMiQMLIAEtAABBLkcNzAEgAUEBaiEBDKYCCyABIgEgAkcNzAFB3wAhEAyHAwsCQCABIgEgAkYNACAAQY6AgIAANgIIIAAgATYCBCABIQFB0AAhEAzuAgtB4AAhEAyGAwtB4QAhECABIgEgAkYNhQMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQeLCgIAAai0AAEcNzQEgFEEDRg3MASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyFAwtB4gAhECABIgEgAkYNhAMgAiABayAAKAIAIhRqIRYgASAUa0ECaiEXA0AgAS0AACAUQebCgIAAai0AAEcNzAEgFEECRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyEAwtB4wAhECABIgEgAkYNgwMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQenCgIAAai0AAEcNywEgFEEDRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyDAwsCQCABIgEgAkcNAEHlACEQDIMDCyAAIAFBAWoiASACEKiAgIAAIhANzQEgASEBQdYAIRAM6QILAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AAkACQAJAIBBBuH9qDgsAAc8BzwHPAc8BzwHPAc8BzwECzwELIAFBAWohAUHSACEQDO0CCyABQQFqIQFB0wAhEAzsAgsgAUEBaiEBQdQAIRAM6wILIAFBAWoiASACRw0AC0HkACEQDIIDC0HkACEQDIEDCwNAAkAgAS0AAEHwwoCAAGotAAAiEEEBRg0AIBBBfmoOA88B0AHRAdIBCyABQQFqIgEgAkcNAAtB5gAhEAyAAwsCQCABIgEgAkYNACABQQFqIQEMAwtB5wAhEAz/AgsDQAJAIAEtAABB8MSAgABqLQAAIhBBAUYNAAJAIBBBfmoOBNIB0wHUAQDVAQsgASEBQdcAIRAM5wILIAFBAWoiASACRw0AC0HoACEQDP4CCwJAIAEiASACRw0AQekAIRAM/gILAkAgAS0AACIQQXZqDhq6AdUB1QG8AdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAcoB1QHVAQDTAQsgAUEBaiEBC0EGIRAM4wILA0ACQCABLQAAQfDGgIAAai0AAEEBRg0AIAEhAQyeAgsgAUEBaiIBIAJHDQALQeoAIRAM+wILAkAgASIBIAJGDQAgAUEBaiEBDAMLQesAIRAM+gILAkAgASIBIAJHDQBB7AAhEAz6AgsgAUEBaiEBDAELAkAgASIBIAJHDQBB7QAhEAz5AgsgAUEBaiEBC0EEIRAM3gILAkAgASIUIAJHDQBB7gAhEAz3AgsgFCEBAkACQAJAIBQtAABB8MiAgABqLQAAQX9qDgfUAdUB1gEAnAIBAtcBCyAUQQFqIQEMCgsgFEEBaiEBDM0BC0EAIRAgAEEANgIcIABBm5KAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAz2AgsCQANAAkAgAS0AAEHwyICAAGotAAAiEEEERg0AAkACQCAQQX9qDgfSAdMB1AHZAQAEAdkBCyABIQFB2gAhEAzgAgsgAUEBaiEBQdwAIRAM3wILIAFBAWoiASACRw0AC0HvACEQDPYCCyABQQFqIQEMywELAkAgASIUIAJHDQBB8AAhEAz1AgsgFC0AAEEvRw3UASAUQQFqIQEMBgsCQCABIhQgAkcNAEHxACEQDPQCCwJAIBQtAAAiAUEvRw0AIBRBAWohAUHdACEQDNsCCyABQXZqIgRBFksN0wFBASAEdEGJgIACcUUN0wEMygILAkAgASIBIAJGDQAgAUEBaiEBQd4AIRAM2gILQfIAIRAM8gILAkAgASIUIAJHDQBB9AAhEAzyAgsgFCEBAkAgFC0AAEHwzICAAGotAABBf2oOA8kClAIA1AELQeEAIRAM2AILAkAgASIUIAJGDQADQAJAIBQtAABB8MqAgABqLQAAIgFBA0YNAAJAIAFBf2oOAssCANUBCyAUIQFB3wAhEAzaAgsgFEEBaiIUIAJHDQALQfMAIRAM8QILQfMAIRAM8AILAkAgASIBIAJGDQAgAEGPgICAADYCCCAAIAE2AgQgASEBQeAAIRAM1wILQfUAIRAM7wILAkAgASIBIAJHDQBB9gAhEAzvAgsgAEGPgICAADYCCCAAIAE2AgQgASEBC0EDIRAM1AILA0AgAS0AAEEgRw3DAiABQQFqIgEgAkcNAAtB9wAhEAzsAgsCQCABIgEgAkcNAEH4ACEQDOwCCyABLQAAQSBHDc4BIAFBAWohAQzvAQsgACABIgEgAhCsgICAACIQDc4BIAEhAQyOAgsCQCABIgQgAkcNAEH6ACEQDOoCCyAELQAAQcwARw3RASAEQQFqIQFBEyEQDM8BCwJAIAEiBCACRw0AQfsAIRAM6QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEANAIAQtAAAgAUHwzoCAAGotAABHDdABIAFBBUYNzgEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBB+wAhEAzoAgsCQCABIgQgAkcNAEH8ACEQDOgCCwJAAkAgBC0AAEG9f2oODADRAdEB0QHRAdEB0QHRAdEB0QHRAQHRAQsgBEEBaiEBQeYAIRAMzwILIARBAWohAUHnACEQDM4CCwJAIAEiBCACRw0AQf0AIRAM5wILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNzwEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf0AIRAM5wILIABBADYCACAQQQFqIQFBECEQDMwBCwJAIAEiBCACRw0AQf4AIRAM5gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQfbOgIAAai0AAEcNzgEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf4AIRAM5gILIABBADYCACAQQQFqIQFBFiEQDMsBCwJAIAEiBCACRw0AQf8AIRAM5QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQfzOgIAAai0AAEcNzQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf8AIRAM5QILIABBADYCACAQQQFqIQFBBSEQDMoBCwJAIAEiBCACRw0AQYABIRAM5AILIAQtAABB2QBHDcsBIARBAWohAUEIIRAMyQELAkAgASIEIAJHDQBBgQEhEAzjAgsCQAJAIAQtAABBsn9qDgMAzAEBzAELIARBAWohAUHrACEQDMoCCyAEQQFqIQFB7AAhEAzJAgsCQCABIgQgAkcNAEGCASEQDOICCwJAAkAgBC0AAEG4f2oOCADLAcsBywHLAcsBywEBywELIARBAWohAUHqACEQDMkCCyAEQQFqIQFB7QAhEAzIAgsCQCABIgQgAkcNAEGDASEQDOECCyACIARrIAAoAgAiAWohECAEIAFrQQJqIRQCQANAIAQtAAAgAUGAz4CAAGotAABHDckBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgEDYCAEGDASEQDOECC0EAIRAgAEEANgIAIBRBAWohAQzGAQsCQCABIgQgAkcNAEGEASEQDOACCyACIARrIAAoAgAiAWohFCAEIAFrQQRqIRACQANAIAQtAAAgAUGDz4CAAGotAABHDcgBIAFBBEYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGEASEQDOACCyAAQQA2AgAgEEEBaiEBQSMhEAzFAQsCQCABIgQgAkcNAEGFASEQDN8CCwJAAkAgBC0AAEG0f2oOCADIAcgByAHIAcgByAEByAELIARBAWohAUHvACEQDMYCCyAEQQFqIQFB8AAhEAzFAgsCQCABIgQgAkcNAEGGASEQDN4CCyAELQAAQcUARw3FASAEQQFqIQEMgwILAkAgASIEIAJHDQBBhwEhEAzdAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBiM+AgABqLQAARw3FASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhwEhEAzdAgsgAEEANgIAIBBBAWohAUEtIRAMwgELAkAgASIEIAJHDQBBiAEhEAzcAgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw3EASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiAEhEAzcAgsgAEEANgIAIBBBAWohAUEpIRAMwQELAkAgASIBIAJHDQBBiQEhEAzbAgtBASEQIAEtAABB3wBHDcABIAFBAWohAQyBAgsCQCABIgQgAkcNAEGKASEQDNoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRADQCAELQAAIAFBjM+AgABqLQAARw3BASABQQFGDa8CIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYoBIRAM2QILAkAgASIEIAJHDQBBiwEhEAzZAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBjs+AgABqLQAARw3BASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiwEhEAzZAgsgAEEANgIAIBBBAWohAUECIRAMvgELAkAgASIEIAJHDQBBjAEhEAzYAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw3AASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjAEhEAzYAgsgAEEANgIAIBBBAWohAUEfIRAMvQELAkAgASIEIAJHDQBBjQEhEAzXAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8s+AgABqLQAARw2/ASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjQEhEAzXAgsgAEEANgIAIBBBAWohAUEJIRAMvAELAkAgASIEIAJHDQBBjgEhEAzWAgsCQAJAIAQtAABBt39qDgcAvwG/Ab8BvwG/AQG/AQsgBEEBaiEBQfgAIRAMvQILIARBAWohAUH5ACEQDLwCCwJAIAEiBCACRw0AQY8BIRAM1QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQZHPgIAAai0AAEcNvQEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY8BIRAM1QILIABBADYCACAQQQFqIQFBGCEQDLoBCwJAIAEiBCACRw0AQZABIRAM1AILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQZfPgIAAai0AAEcNvAEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZABIRAM1AILIABBADYCACAQQQFqIQFBFyEQDLkBCwJAIAEiBCACRw0AQZEBIRAM0wILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQZrPgIAAai0AAEcNuwEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZEBIRAM0wILIABBADYCACAQQQFqIQFBFSEQDLgBCwJAIAEiBCACRw0AQZIBIRAM0gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQaHPgIAAai0AAEcNugEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZIBIRAM0gILIABBADYCACAQQQFqIQFBHiEQDLcBCwJAIAEiBCACRw0AQZMBIRAM0QILIAQtAABBzABHDbgBIARBAWohAUEKIRAMtgELAkAgBCACRw0AQZQBIRAM0AILAkACQCAELQAAQb9/ag4PALkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AbkBAbkBCyAEQQFqIQFB/gAhEAy3AgsgBEEBaiEBQf8AIRAMtgILAkAgBCACRw0AQZUBIRAMzwILAkACQCAELQAAQb9/ag4DALgBAbgBCyAEQQFqIQFB/QAhEAy2AgsgBEEBaiEEQYABIRAMtQILAkAgBCACRw0AQZYBIRAMzgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQafPgIAAai0AAEcNtgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZYBIRAMzgILIABBADYCACAQQQFqIQFBCyEQDLMBCwJAIAQgAkcNAEGXASEQDM0CCwJAAkACQAJAIAQtAABBU2oOIwC4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBAbgBuAG4AbgBuAECuAG4AbgBA7gBCyAEQQFqIQFB+wAhEAy2AgsgBEEBaiEBQfwAIRAMtQILIARBAWohBEGBASEQDLQCCyAEQQFqIQRBggEhEAyzAgsCQCAEIAJHDQBBmAEhEAzMAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBqc+AgABqLQAARw20ASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmAEhEAzMAgsgAEEANgIAIBBBAWohAUEZIRAMsQELAkAgBCACRw0AQZkBIRAMywILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQa7PgIAAai0AAEcNswEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZkBIRAMywILIABBADYCACAQQQFqIQFBBiEQDLABCwJAIAQgAkcNAEGaASEQDMoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG0z4CAAGotAABHDbIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGaASEQDMoCCyAAQQA2AgAgEEEBaiEBQRwhEAyvAQsCQCAEIAJHDQBBmwEhEAzJAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBts+AgABqLQAARw2xASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmwEhEAzJAgsgAEEANgIAIBBBAWohAUEnIRAMrgELAkAgBCACRw0AQZwBIRAMyAILAkACQCAELQAAQax/ag4CAAGxAQsgBEEBaiEEQYYBIRAMrwILIARBAWohBEGHASEQDK4CCwJAIAQgAkcNAEGdASEQDMcCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG4z4CAAGotAABHDa8BIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGdASEQDMcCCyAAQQA2AgAgEEEBaiEBQSYhEAysAQsCQCAEIAJHDQBBngEhEAzGAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBus+AgABqLQAARw2uASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBngEhEAzGAgsgAEEANgIAIBBBAWohAUEDIRAMqwELAkAgBCACRw0AQZ8BIRAMxQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNrQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ8BIRAMxQILIABBADYCACAQQQFqIQFBDCEQDKoBCwJAIAQgAkcNAEGgASEQDMQCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUG8z4CAAGotAABHDawBIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGgASEQDMQCCyAAQQA2AgAgEEEBaiEBQQ0hEAypAQsCQCAEIAJHDQBBoQEhEAzDAgsCQAJAIAQtAABBun9qDgsArAGsAawBrAGsAawBrAGsAawBAawBCyAEQQFqIQRBiwEhEAyqAgsgBEEBaiEEQYwBIRAMqQILAkAgBCACRw0AQaIBIRAMwgILIAQtAABB0ABHDakBIARBAWohBAzpAQsCQCAEIAJHDQBBowEhEAzBAgsCQAJAIAQtAABBt39qDgcBqgGqAaoBqgGqAQCqAQsgBEEBaiEEQY4BIRAMqAILIARBAWohAUEiIRAMpgELAkAgBCACRw0AQaQBIRAMwAILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQcDPgIAAai0AAEcNqAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaQBIRAMwAILIABBADYCACAQQQFqIQFBHSEQDKUBCwJAIAQgAkcNAEGlASEQDL8CCwJAAkAgBC0AAEGuf2oOAwCoAQGoAQsgBEEBaiEEQZABIRAMpgILIARBAWohAUEEIRAMpAELAkAgBCACRw0AQaYBIRAMvgILAkACQAJAAkACQCAELQAAQb9/ag4VAKoBqgGqAaoBqgGqAaoBqgGqAaoBAaoBqgECqgGqAQOqAaoBBKoBCyAEQQFqIQRBiAEhEAyoAgsgBEEBaiEEQYkBIRAMpwILIARBAWohBEGKASEQDKYCCyAEQQFqIQRBjwEhEAylAgsgBEEBaiEEQZEBIRAMpAILAkAgBCACRw0AQacBIRAMvQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNpQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQacBIRAMvQILIABBADYCACAQQQFqIQFBESEQDKIBCwJAIAQgAkcNAEGoASEQDLwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHCz4CAAGotAABHDaQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGoASEQDLwCCyAAQQA2AgAgEEEBaiEBQSwhEAyhAQsCQCAEIAJHDQBBqQEhEAy7AgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBxc+AgABqLQAARw2jASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqQEhEAy7AgsgAEEANgIAIBBBAWohAUErIRAMoAELAkAgBCACRw0AQaoBIRAMugILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQcrPgIAAai0AAEcNogEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaoBIRAMugILIABBADYCACAQQQFqIQFBFCEQDJ8BCwJAIAQgAkcNAEGrASEQDLkCCwJAAkACQAJAIAQtAABBvn9qDg8AAQKkAaQBpAGkAaQBpAGkAaQBpAGkAaQBA6QBCyAEQQFqIQRBkwEhEAyiAgsgBEEBaiEEQZQBIRAMoQILIARBAWohBEGVASEQDKACCyAEQQFqIQRBlgEhEAyfAgsCQCAEIAJHDQBBrAEhEAy4AgsgBC0AAEHFAEcNnwEgBEEBaiEEDOABCwJAIAQgAkcNAEGtASEQDLcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHNz4CAAGotAABHDZ8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGtASEQDLcCCyAAQQA2AgAgEEEBaiEBQQ4hEAycAQsCQCAEIAJHDQBBrgEhEAy2AgsgBC0AAEHQAEcNnQEgBEEBaiEBQSUhEAybAQsCQCAEIAJHDQBBrwEhEAy1AgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw2dASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrwEhEAy1AgsgAEEANgIAIBBBAWohAUEqIRAMmgELAkAgBCACRw0AQbABIRAMtAILAkACQCAELQAAQat/ag4LAJ0BnQGdAZ0BnQGdAZ0BnQGdAQGdAQsgBEEBaiEEQZoBIRAMmwILIARBAWohBEGbASEQDJoCCwJAIAQgAkcNAEGxASEQDLMCCwJAAkAgBC0AAEG/f2oOFACcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAEBnAELIARBAWohBEGZASEQDJoCCyAEQQFqIQRBnAEhEAyZAgsCQCAEIAJHDQBBsgEhEAyyAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFB2c+AgABqLQAARw2aASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBsgEhEAyyAgsgAEEANgIAIBBBAWohAUEhIRAMlwELAkAgBCACRw0AQbMBIRAMsQILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQd3PgIAAai0AAEcNmQEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbMBIRAMsQILIABBADYCACAQQQFqIQFBGiEQDJYBCwJAIAQgAkcNAEG0ASEQDLACCwJAAkACQCAELQAAQbt/ag4RAJoBmgGaAZoBmgGaAZoBmgGaAQGaAZoBmgGaAZoBApoBCyAEQQFqIQRBnQEhEAyYAgsgBEEBaiEEQZ4BIRAMlwILIARBAWohBEGfASEQDJYCCwJAIAQgAkcNAEG1ASEQDK8CCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUHkz4CAAGotAABHDZcBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG1ASEQDK8CCyAAQQA2AgAgEEEBaiEBQSghEAyUAQsCQCAEIAJHDQBBtgEhEAyuAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB6s+AgABqLQAARw2WASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtgEhEAyuAgsgAEEANgIAIBBBAWohAUEHIRAMkwELAkAgBCACRw0AQbcBIRAMrQILAkACQCAELQAAQbt/ag4OAJYBlgGWAZYBlgGWAZYBlgGWAZYBlgGWAQGWAQsgBEEBaiEEQaEBIRAMlAILIARBAWohBEGiASEQDJMCCwJAIAQgAkcNAEG4ASEQDKwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDZQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG4ASEQDKwCCyAAQQA2AgAgEEEBaiEBQRIhEAyRAQsCQCAEIAJHDQBBuQEhEAyrAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw2TASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuQEhEAyrAgsgAEEANgIAIBBBAWohAUEgIRAMkAELAkAgBCACRw0AQboBIRAMqgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNkgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQboBIRAMqgILIABBADYCACAQQQFqIQFBDyEQDI8BCwJAIAQgAkcNAEG7ASEQDKkCCwJAAkAgBC0AAEG3f2oOBwCSAZIBkgGSAZIBAZIBCyAEQQFqIQRBpQEhEAyQAgsgBEEBaiEEQaYBIRAMjwILAkAgBCACRw0AQbwBIRAMqAILIAIgBGsgACgCACIBaiEUIAQgAWtBB2ohEAJAA0AgBC0AACABQfTPgIAAai0AAEcNkAEgAUEHRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbwBIRAMqAILIABBADYCACAQQQFqIQFBGyEQDI0BCwJAIAQgAkcNAEG9ASEQDKcCCwJAAkACQCAELQAAQb5/ag4SAJEBkQGRAZEBkQGRAZEBkQGRAQGRAZEBkQGRAZEBkQECkQELIARBAWohBEGkASEQDI8CCyAEQQFqIQRBpwEhEAyOAgsgBEEBaiEEQagBIRAMjQILAkAgBCACRw0AQb4BIRAMpgILIAQtAABBzgBHDY0BIARBAWohBAzPAQsCQCAEIAJHDQBBvwEhEAylAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAELQAAQb9/ag4VAAECA5wBBAUGnAGcAZwBBwgJCgucAQwNDg+cAQsgBEEBaiEBQegAIRAMmgILIARBAWohAUHpACEQDJkCCyAEQQFqIQFB7gAhEAyYAgsgBEEBaiEBQfIAIRAMlwILIARBAWohAUHzACEQDJYCCyAEQQFqIQFB9gAhEAyVAgsgBEEBaiEBQfcAIRAMlAILIARBAWohAUH6ACEQDJMCCyAEQQFqIQRBgwEhEAySAgsgBEEBaiEEQYQBIRAMkQILIARBAWohBEGFASEQDJACCyAEQQFqIQRBkgEhEAyPAgsgBEEBaiEEQZgBIRAMjgILIARBAWohBEGgASEQDI0CCyAEQQFqIQRBowEhEAyMAgsgBEEBaiEEQaoBIRAMiwILAkAgBCACRg0AIABBkICAgAA2AgggACAENgIEQasBIRAMiwILQcABIRAMowILIAAgBSACEKqAgIAAIgENiwEgBSEBDFwLAkAgBiACRg0AIAZBAWohBQyNAQtBwgEhEAyhAgsDQAJAIBAtAABBdmoOBIwBAACPAQALIBBBAWoiECACRw0AC0HDASEQDKACCwJAIAcgAkYNACAAQZGAgIAANgIIIAAgBzYCBCAHIQFBASEQDIcCC0HEASEQDJ8CCwJAIAcgAkcNAEHFASEQDJ8CCwJAAkAgBy0AAEF2ag4EAc4BzgEAzgELIAdBAWohBgyNAQsgB0EBaiEFDIkBCwJAIAcgAkcNAEHGASEQDJ4CCwJAAkAgBy0AAEF2ag4XAY8BjwEBjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAI8BCyAHQQFqIQcLQbABIRAMhAILAkAgCCACRw0AQcgBIRAMnQILIAgtAABBIEcNjQEgAEEAOwEyIAhBAWohAUGzASEQDIMCCyABIRcCQANAIBciByACRg0BIActAABBUGpB/wFxIhBBCk8NzAECQCAALwEyIhRBmTNLDQAgACAUQQpsIhQ7ATIgEEH//wNzIBRB/v8DcUkNACAHQQFqIRcgACAUIBBqIhA7ATIgEEH//wNxQegHSQ0BCwtBACEQIABBADYCHCAAQcGJgIAANgIQIABBDTYCDCAAIAdBAWo2AhQMnAILQccBIRAMmwILIAAgCCACEK6AgIAAIhBFDcoBIBBBFUcNjAEgAEHIATYCHCAAIAg2AhQgAEHJl4CAADYCECAAQRU2AgxBACEQDJoCCwJAIAkgAkcNAEHMASEQDJoCC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgCS0AAEFQag4KlgGVAQABAgMEBQYIlwELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMjgELQQkhEEEBIRRBACEXQQAhFgyNAQsCQCAKIAJHDQBBzgEhEAyZAgsgCi0AAEEuRw2OASAKQQFqIQkMygELIAsgAkcNjgFB0AEhEAyXAgsCQCALIAJGDQAgAEGOgICAADYCCCAAIAs2AgRBtwEhEAz+AQtB0QEhEAyWAgsCQCAEIAJHDQBB0gEhEAyWAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EEaiELA0AgBC0AACAQQfzPgIAAai0AAEcNjgEgEEEERg3pASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHSASEQDJUCCyAAIAwgAhCsgICAACIBDY0BIAwhAQy4AQsCQCAEIAJHDQBB1AEhEAyUAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EBaiEMA0AgBC0AACAQQYHQgIAAai0AAEcNjwEgEEEBRg2OASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHUASEQDJMCCwJAIAQgAkcNAEHWASEQDJMCCyACIARrIAAoAgAiEGohFCAEIBBrQQJqIQsDQCAELQAAIBBBg9CAgABqLQAARw2OASAQQQJGDZABIBBBAWohECAEQQFqIgQgAkcNAAsgACAUNgIAQdYBIRAMkgILAkAgBCACRw0AQdcBIRAMkgILAkACQCAELQAAQbt/ag4QAI8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwEBjwELIARBAWohBEG7ASEQDPkBCyAEQQFqIQRBvAEhEAz4AQsCQCAEIAJHDQBB2AEhEAyRAgsgBC0AAEHIAEcNjAEgBEEBaiEEDMQBCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEG+ASEQDPcBC0HZASEQDI8CCwJAIAQgAkcNAEHaASEQDI8CCyAELQAAQcgARg3DASAAQQE6ACgMuQELIABBAjoALyAAIAQgAhCmgICAACIQDY0BQcIBIRAM9AELIAAtAChBf2oOArcBuQG4AQsDQAJAIAQtAABBdmoOBACOAY4BAI4BCyAEQQFqIgQgAkcNAAtB3QEhEAyLAgsgAEEAOgAvIAAtAC1BBHFFDYQCCyAAQQA6AC8gAEEBOgA0IAEhAQyMAQsgEEEVRg3aASAAQQA2AhwgACABNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAyIAgsCQCAAIBAgAhC0gICAACIEDQAgECEBDIECCwJAIARBFUcNACAAQQM2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAyIAgsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMhwILIBBBFUYN1gEgAEEANgIcIAAgATYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMhgILIAAoAgQhFyAAQQA2AgQgECARp2oiFiEBIAAgFyAQIBYgFBsiEBC1gICAACIURQ2NASAAQQc2AhwgACAQNgIUIAAgFDYCDEEAIRAMhQILIAAgAC8BMEGAAXI7ATAgASEBC0EqIRAM6gELIBBBFUYN0QEgAEEANgIcIAAgATYCFCAAQYOMgIAANgIQIABBEzYCDEEAIRAMggILIBBBFUYNzwEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAMgQILIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDI0BCyAAQQw2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMgAILIBBBFUYNzAEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM/wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIwBCyAAQQ02AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/gELIBBBFUYNyQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM/QELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIsBCyAAQQ42AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/AELIABBADYCHCAAIAE2AhQgAEHAlYCAADYCECAAQQI2AgxBACEQDPsBCyAQQRVGDcUBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPoBCyAAQRA2AhwgACABNgIUIAAgEDYCDEEAIRAM+QELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDPEBCyAAQRE2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM+AELIBBBFUYNwQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM9wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIgBCyAAQRM2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM9gELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDO0BCyAAQRQ2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM9QELIBBBFUYNvQEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM9AELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIYBCyAAQRY2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM8wELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC3gICAACIEDQAgAUEBaiEBDOkBCyAAQRc2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM8gELIABBADYCHCAAIAE2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDPEBC0IBIRELIBBBAWohAQJAIAApAyAiEkL//////////w9WDQAgACASQgSGIBGENwMgIAEhAQyEAQsgAEEANgIcIAAgATYCFCAAQa2JgIAANgIQIABBDDYCDEEAIRAM7wELIABBADYCHCAAIBA2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDO4BCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNcyAAQQU2AhwgACAQNgIUIAAgFDYCDEEAIRAM7QELIABBADYCHCAAIBA2AhQgAEGqnICAADYCECAAQQ82AgxBACEQDOwBCyAAIBAgAhC0gICAACIBDQEgECEBC0EOIRAM0QELAkAgAUEVRw0AIABBAjYCHCAAIBA2AhQgAEGwmICAADYCECAAQRU2AgxBACEQDOoBCyAAQQA2AhwgACAQNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAzpAQsgAUEBaiEQAkAgAC8BMCIBQYABcUUNAAJAIAAgECACELuAgIAAIgENACAQIQEMcAsgAUEVRw26ASAAQQU2AhwgACAQNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAzpAQsCQCABQaAEcUGgBEcNACAALQAtQQJxDQAgAEEANgIcIAAgEDYCFCAAQZaTgIAANgIQIABBBDYCDEEAIRAM6QELIAAgECACEL2AgIAAGiAQIQECQAJAAkACQAJAIAAgECACELOAgIAADhYCAQAEBAQEBAQEBAQEBAQEBAQEBAQDBAsgAEEBOgAuCyAAIAAvATBBwAByOwEwIBAhAQtBJiEQDNEBCyAAQSM2AhwgACAQNgIUIABBpZaAgAA2AhAgAEEVNgIMQQAhEAzpAQsgAEEANgIcIAAgEDYCFCAAQdWLgIAANgIQIABBETYCDEEAIRAM6AELIAAtAC1BAXFFDQFBwwEhEAzOAQsCQCANIAJGDQADQAJAIA0tAABBIEYNACANIQEMxAELIA1BAWoiDSACRw0AC0ElIRAM5wELQSUhEAzmAQsgACgCBCEEIABBADYCBCAAIAQgDRCvgICAACIERQ2tASAAQSY2AhwgACAENgIMIAAgDUEBajYCFEEAIRAM5QELIBBBFUYNqwEgAEEANgIcIAAgATYCFCAAQf2NgIAANgIQIABBHTYCDEEAIRAM5AELIABBJzYCHCAAIAE2AhQgACAQNgIMQQAhEAzjAQsgECEBQQEhFAJAAkACQAJAAkACQAJAIAAtACxBfmoOBwYFBQMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0ErIRAMygELIABBADYCHCAAIBA2AhQgAEGrkoCAADYCECAAQQs2AgxBACEQDOIBCyAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMQQAhEAzhAQsgAEEAOgAsIBAhAQy9AQsgECEBQQEhFAJAAkACQAJAAkAgAC0ALEF7ag4EAwECAAULIAAgAC8BMEEIcjsBMAwDC0ECIRQMAQtBBCEUCyAAQQE6ACwgACAALwEwIBRyOwEwCyAQIQELQSkhEAzFAQsgAEEANgIcIAAgATYCFCAAQfCUgIAANgIQIABBAzYCDEEAIRAM3QELAkAgDi0AAEENRw0AIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHULIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzdAQsgAC0ALUEBcUUNAUHEASEQDMMBCwJAIA4gAkcNAEEtIRAM3AELAkACQANAAkAgDi0AAEF2ag4EAgAAAwALIA5BAWoiDiACRw0AC0EtIRAM3QELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDiEBDHQLIABBLDYCHCAAIA42AhQgACABNgIMQQAhEAzcAQsgACgCBCEBIABBADYCBAJAIAAgASAOELGAgIAAIgENACAOQQFqIQEMcwsgAEEsNgIcIAAgATYCDCAAIA5BAWo2AhRBACEQDNsBCyAAKAIEIQQgAEEANgIEIAAgBCAOELGAgIAAIgQNoAEgDiEBDM4BCyAQQSxHDQEgAUEBaiEQQQEhAQJAAkACQAJAAkAgAC0ALEF7ag4EAwECBAALIBAhAQwEC0ECIQEMAQtBBCEBCyAAQQE6ACwgACAALwEwIAFyOwEwIBAhAQwBCyAAIAAvATBBCHI7ATAgECEBC0E5IRAMvwELIABBADoALCABIQELQTQhEAy9AQsgACAALwEwQSByOwEwIAEhAQwCCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBA0AIAEhAQzHAQsgAEE3NgIcIAAgATYCFCAAIAQ2AgxBACEQDNQBCyAAQQg6ACwgASEBC0EwIRAMuQELAkAgAC0AKEEBRg0AIAEhAQwECyAALQAtQQhxRQ2TASABIQEMAwsgAC0AMEEgcQ2UAUHFASEQDLcBCwJAIA8gAkYNAAJAA0ACQCAPLQAAQVBqIgFB/wFxQQpJDQAgDyEBQTUhEAy6AQsgACkDICIRQpmz5syZs+bMGVYNASAAIBFCCn4iETcDICARIAGtQv8BgyISQn+FVg0BIAAgESASfDcDICAPQQFqIg8gAkcNAAtBOSEQDNEBCyAAKAIEIQIgAEEANgIEIAAgAiAPQQFqIgQQsYCAgAAiAg2VASAEIQEMwwELQTkhEAzPAQsCQCAALwEwIgFBCHFFDQAgAC0AKEEBRw0AIAAtAC1BCHFFDZABCyAAIAFB9/sDcUGABHI7ATAgDyEBC0E3IRAMtAELIAAgAC8BMEEQcjsBMAyrAQsgEEEVRg2LASAAQQA2AhwgACABNgIUIABB8I6AgAA2AhAgAEEcNgIMQQAhEAzLAQsgAEHDADYCHCAAIAE2AgwgACANQQFqNgIUQQAhEAzKAQsCQCABLQAAQTpHDQAgACgCBCEQIABBADYCBAJAIAAgECABEK+AgIAAIhANACABQQFqIQEMYwsgAEHDADYCHCAAIBA2AgwgACABQQFqNgIUQQAhEAzKAQsgAEEANgIcIAAgATYCFCAAQbGRgIAANgIQIABBCjYCDEEAIRAMyQELIABBADYCHCAAIAE2AhQgAEGgmYCAADYCECAAQR42AgxBACEQDMgBCyAAQQA2AgALIABBgBI7ASogACAXQQFqIgEgAhCogICAACIQDQEgASEBC0HHACEQDKwBCyAQQRVHDYMBIABB0QA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAzEAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAzDAQsgAEEANgIcIAAgFDYCFCAAQcGogIAANgIQIABBBzYCDCAAQQA2AgBBACEQDMIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxdCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDMEBC0EAIRAgAEEANgIcIAAgATYCFCAAQYCRgIAANgIQIABBCTYCDAzAAQsgEEEVRg19IABBADYCHCAAIAE2AhQgAEGUjYCAADYCECAAQSE2AgxBACEQDL8BC0EBIRZBACEXQQAhFEEBIRALIAAgEDoAKyABQQFqIQECQAJAIAAtAC1BEHENAAJAAkACQCAALQAqDgMBAAIECyAWRQ0DDAILIBQNAQwCCyAXRQ0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQrYCAgAAiEA0AIAEhAQxcCyAAQdgANgIcIAAgATYCFCAAIBA2AgxBACEQDL4BCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQytAQsgAEHZADYCHCAAIAE2AhQgACAENgIMQQAhEAy9AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMqwELIABB2gA2AhwgACABNgIUIAAgBDYCDEEAIRAMvAELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKkBCyAAQdwANgIcIAAgATYCFCAAIAQ2AgxBACEQDLsBCwJAIAEtAABBUGoiEEH/AXFBCk8NACAAIBA6ACogAUEBaiEBQc8AIRAMogELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKcBCyAAQd4ANgIcIAAgATYCFCAAIAQ2AgxBACEQDLoBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKUEjTw0AIAEhAQxZCyAAQQA2AhwgACABNgIUIABB04mAgAA2AhAgAEEINgIMQQAhEAy5AQsgAEEANgIAC0EAIRAgAEEANgIcIAAgATYCFCAAQZCzgIAANgIQIABBCDYCDAy3AQsgAEEANgIAIBdBAWohAQJAIAAtAClBIUcNACABIQEMVgsgAEEANgIcIAAgATYCFCAAQZuKgIAANgIQIABBCDYCDEEAIRAMtgELIABBADYCACAXQQFqIQECQCAALQApIhBBXWpBC08NACABIQEMVQsCQCAQQQZLDQBBASAQdEHKAHFFDQAgASEBDFULQQAhECAAQQA2AhwgACABNgIUIABB94mAgAA2AhAgAEEINgIMDLUBCyAQQRVGDXEgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMtAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFQLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMswELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMsgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMsQELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFELIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMsAELIABBADYCHCAAIAE2AhQgAEHGioCAADYCECAAQQc2AgxBACEQDK8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDK4BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDK0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDKwBCyAAQQA2AhwgACABNgIUIABB3IiAgAA2AhAgAEEHNgIMQQAhEAyrAQsgEEE/Rw0BIAFBAWohAQtBBSEQDJABC0EAIRAgAEEANgIcIAAgATYCFCAAQf2SgIAANgIQIABBBzYCDAyoAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAynAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAymAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMRgsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAylAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHSADYCHCAAIBQ2AhQgACABNgIMQQAhEAykAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHTADYCHCAAIBQ2AhQgACABNgIMQQAhEAyjAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMQwsgAEHlADYCHCAAIBQ2AhQgACABNgIMQQAhEAyiAQsgAEEANgIcIAAgFDYCFCAAQcOPgIAANgIQIABBBzYCDEEAIRAMoQELIABBADYCHCAAIAE2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKABC0EAIRAgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDAyfAQsgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDEEAIRAMngELIABBADYCHCAAIBQ2AhQgAEH+kYCAADYCECAAQQc2AgxBACEQDJ0BCyAAQQA2AhwgACABNgIUIABBjpuAgAA2AhAgAEEGNgIMQQAhEAycAQsgEEEVRg1XIABBADYCHCAAIAE2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDJsBCyAAQQA2AgAgEEEBaiEBQSQhEAsgACAQOgApIAAoAgQhECAAQQA2AgQgACAQIAEQq4CAgAAiEA1UIAEhAQw+CyAAQQA2AgALQQAhECAAQQA2AhwgACAENgIUIABB8ZuAgAA2AhAgAEEGNgIMDJcBCyABQRVGDVAgAEEANgIcIAAgBTYCFCAAQfCMgIAANgIQIABBGzYCDEEAIRAMlgELIAAoAgQhBSAAQQA2AgQgACAFIBAQqYCAgAAiBQ0BIBBBAWohBQtBrQEhEAx7CyAAQcEBNgIcIAAgBTYCDCAAIBBBAWo2AhRBACEQDJMBCyAAKAIEIQYgAEEANgIEIAAgBiAQEKmAgIAAIgYNASAQQQFqIQYLQa4BIRAMeAsgAEHCATYCHCAAIAY2AgwgACAQQQFqNgIUQQAhEAyQAQsgAEEANgIcIAAgBzYCFCAAQZeLgIAANgIQIABBDTYCDEEAIRAMjwELIABBADYCHCAAIAg2AhQgAEHjkICAADYCECAAQQk2AgxBACEQDI4BCyAAQQA2AhwgACAINgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAyNAQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgCUEBaiEIAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBCAAIBAgCBCtgICAACIQRQ09IABByQE2AhwgACAINgIUIAAgEDYCDEEAIRAMjAELIAAoAgQhBCAAQQA2AgQgACAEIAgQrYCAgAAiBEUNdiAAQcoBNgIcIAAgCDYCFCAAIAQ2AgxBACEQDIsBCyAAKAIEIQQgAEEANgIEIAAgBCAJEK2AgIAAIgRFDXQgAEHLATYCHCAAIAk2AhQgACAENgIMQQAhEAyKAQsgACgCBCEEIABBADYCBCAAIAQgChCtgICAACIERQ1yIABBzQE2AhwgACAKNgIUIAAgBDYCDEEAIRAMiQELAkAgCy0AAEFQaiIQQf8BcUEKTw0AIAAgEDoAKiALQQFqIQpBtgEhEAxwCyAAKAIEIQQgAEEANgIEIAAgBCALEK2AgIAAIgRFDXAgAEHPATYCHCAAIAs2AhQgACAENgIMQQAhEAyIAQsgAEEANgIcIAAgBDYCFCAAQZCzgIAANgIQIABBCDYCDCAAQQA2AgBBACEQDIcBCyABQRVGDT8gAEEANgIcIAAgDDYCFCAAQcyOgIAANgIQIABBIDYCDEEAIRAMhgELIABBgQQ7ASggACgCBCEQIABCADcDACAAIBAgDEEBaiIMEKuAgIAAIhBFDTggAEHTATYCHCAAIAw2AhQgACAQNgIMQQAhEAyFAQsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQdibgIAANgIQIABBCDYCDAyDAQsgACgCBCEQIABCADcDACAAIBAgC0EBaiILEKuAgIAAIhANAUHGASEQDGkLIABBAjoAKAxVCyAAQdUBNgIcIAAgCzYCFCAAIBA2AgxBACEQDIABCyAQQRVGDTcgAEEANgIcIAAgBDYCFCAAQaSMgIAANgIQIABBEDYCDEEAIRAMfwsgAC0ANEEBRw00IAAgBCACELyAgIAAIhBFDTQgEEEVRw01IABB3AE2AhwgACAENgIUIABB1ZaAgAA2AhAgAEEVNgIMQQAhEAx+C0EAIRAgAEEANgIcIABBr4uAgAA2AhAgAEECNgIMIAAgFEEBajYCFAx9C0EAIRAMYwtBAiEQDGILQQ0hEAxhC0EPIRAMYAtBJSEQDF8LQRMhEAxeC0EVIRAMXQtBFiEQDFwLQRchEAxbC0EYIRAMWgtBGSEQDFkLQRohEAxYC0EbIRAMVwtBHCEQDFYLQR0hEAxVC0EfIRAMVAtBISEQDFMLQSMhEAxSC0HGACEQDFELQS4hEAxQC0EvIRAMTwtBOyEQDE4LQT0hEAxNC0HIACEQDEwLQckAIRAMSwtBywAhEAxKC0HMACEQDEkLQc4AIRAMSAtB0QAhEAxHC0HVACEQDEYLQdgAIRAMRQtB2QAhEAxEC0HbACEQDEMLQeQAIRAMQgtB5QAhEAxBC0HxACEQDEALQfQAIRAMPwtBjQEhEAw+C0GXASEQDD0LQakBIRAMPAtBrAEhEAw7C0HAASEQDDoLQbkBIRAMOQtBrwEhEAw4C0GxASEQDDcLQbIBIRAMNgtBtAEhEAw1C0G1ASEQDDQLQboBIRAMMwtBvQEhEAwyC0G/ASEQDDELQcEBIRAMMAsgAEEANgIcIAAgBDYCFCAAQemLgIAANgIQIABBHzYCDEEAIRAMSAsgAEHbATYCHCAAIAQ2AhQgAEH6loCAADYCECAAQRU2AgxBACEQDEcLIABB+AA2AhwgACAMNgIUIABBypiAgAA2AhAgAEEVNgIMQQAhEAxGCyAAQdEANgIcIAAgBTYCFCAAQbCXgIAANgIQIABBFTYCDEEAIRAMRQsgAEH5ADYCHCAAIAE2AhQgACAQNgIMQQAhEAxECyAAQfgANgIcIAAgATYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMQwsgAEHkADYCHCAAIAE2AhQgAEHjl4CAADYCECAAQRU2AgxBACEQDEILIABB1wA2AhwgACABNgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAxBCyAAQQA2AhwgACABNgIUIABBuY2AgAA2AhAgAEEaNgIMQQAhEAxACyAAQcIANgIcIAAgATYCFCAAQeOYgIAANgIQIABBFTYCDEEAIRAMPwsgAEEANgIEIAAgDyAPELGAgIAAIgRFDQEgAEE6NgIcIAAgBDYCDCAAIA9BAWo2AhRBACEQDD4LIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCxgICAACIERQ0AIABBOzYCHCAAIAQ2AgwgACABQQFqNgIUQQAhEAw+CyABQQFqIQEMLQsgD0EBaiEBDC0LIABBADYCHCAAIA82AhQgAEHkkoCAADYCECAAQQQ2AgxBACEQDDsLIABBNjYCHCAAIAQ2AhQgACACNgIMQQAhEAw6CyAAQS42AhwgACAONgIUIAAgBDYCDEEAIRAMOQsgAEHQADYCHCAAIAE2AhQgAEGRmICAADYCECAAQRU2AgxBACEQDDgLIA1BAWohAQwsCyAAQRU2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAw2CyAAQRs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw1CyAAQQ82AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw0CyAAQQs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAwzCyAAQRo2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwyCyAAQQs2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwxCyAAQQo2AhwgACABNgIUIABB5JaAgAA2AhAgAEEVNgIMQQAhEAwwCyAAQR42AhwgACABNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAwvCyAAQQA2AhwgACAQNgIUIABB2o2AgAA2AhAgAEEUNgIMQQAhEAwuCyAAQQQ2AhwgACABNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAwtCyAAQQA2AgAgC0EBaiELC0G4ASEQDBILIABBADYCACAQQQFqIQFB9QAhEAwRCyABIQECQCAALQApQQVHDQBB4wAhEAwRC0HiACEQDBALQQAhECAAQQA2AhwgAEHkkYCAADYCECAAQQc2AgwgACAUQQFqNgIUDCgLIABBADYCACAXQQFqIQFBwAAhEAwOC0EBIQELIAAgAToALCAAQQA2AgAgF0EBaiEBC0EoIRAMCwsgASEBC0E4IRAMCQsCQCABIg8gAkYNAANAAkAgDy0AAEGAvoCAAGotAAAiAUEBRg0AIAFBAkcNAyAPQQFqIQEMBAsgD0EBaiIPIAJHDQALQT4hEAwiC0E+IRAMIQsgAEEAOgAsIA8hAQwBC0ELIRAMBgtBOiEQDAULIAFBAWohAUEtIRAMBAsgACABOgAsIABBADYCACAWQQFqIQFBDCEQDAMLIABBADYCACAXQQFqIQFBCiEQDAILIABBADYCAAsgAEEAOgAsIA0hAUEJIRAMAAsLQQAhECAAQQA2AhwgACALNgIUIABBzZCAgAA2AhAgAEEJNgIMDBcLQQAhECAAQQA2AhwgACAKNgIUIABB6YqAgAA2AhAgAEEJNgIMDBYLQQAhECAAQQA2AhwgACAJNgIUIABBt5CAgAA2AhAgAEEJNgIMDBULQQAhECAAQQA2AhwgACAINgIUIABBnJGAgAA2AhAgAEEJNgIMDBQLQQAhECAAQQA2AhwgACABNgIUIABBzZCAgAA2AhAgAEEJNgIMDBMLQQAhECAAQQA2AhwgACABNgIUIABB6YqAgAA2AhAgAEEJNgIMDBILQQAhECAAQQA2AhwgACABNgIUIABBt5CAgAA2AhAgAEEJNgIMDBELQQAhECAAQQA2AhwgACABNgIUIABBnJGAgAA2AhAgAEEJNgIMDBALQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA8LQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA4LQQAhECAAQQA2AhwgACABNgIUIABBwJKAgAA2AhAgAEELNgIMDA0LQQAhECAAQQA2AhwgACABNgIUIABBlYmAgAA2AhAgAEELNgIMDAwLQQAhECAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMDAsLQQAhECAAQQA2AhwgACABNgIUIABB+4+AgAA2AhAgAEEKNgIMDAoLQQAhECAAQQA2AhwgACABNgIUIABB8ZmAgAA2AhAgAEECNgIMDAkLQQAhECAAQQA2AhwgACABNgIUIABBxJSAgAA2AhAgAEECNgIMDAgLQQAhECAAQQA2AhwgACABNgIUIABB8pWAgAA2AhAgAEECNgIMDAcLIABBAjYCHCAAIAE2AhQgAEGcmoCAADYCECAAQRY2AgxBACEQDAYLQQEhEAwFC0HUACEQIAEiBCACRg0EIANBCGogACAEIAJB2MKAgABBChDFgICAACADKAIMIQQgAygCCA4DAQQCAAsQyoCAgAAACyAAQQA2AhwgAEG1moCAADYCECAAQRc2AgwgACAEQQFqNgIUQQAhEAwCCyAAQQA2AhwgACAENgIUIABBypqAgAA2AhAgAEEJNgIMQQAhEAwBCwJAIAEiBCACRw0AQSIhEAwBCyAAQYmAgIAANgIIIAAgBDYCBEEhIRALIANBEGokgICAgAAgEAuvAQECfyABKAIAIQYCQAJAIAIgA0YNACAEIAZqIQQgBiADaiACayEHIAIgBkF/cyAFaiIGaiEFA0ACQCACLQAAIAQtAABGDQBBAiEEDAMLAkAgBg0AQQAhBCAFIQIMAwsgBkF/aiEGIARBAWohBCACQQFqIgIgA0cNAAsgByEGIAMhAgsgAEEBNgIAIAEgBjYCACAAIAI2AgQPCyABQQA2AgAgACAENgIAIAAgAjYCBAsKACAAEMeAgIAAC/I2AQt/I4CAgIAAQRBrIgEkgICAgAACQEEAKAKg0ICAAA0AQQAQy4CAgABBgNSEgABrIgJB2QBJDQBBACEDAkBBACgC4NOAgAAiBA0AQQBCfzcC7NOAgABBAEKAgISAgIDAADcC5NOAgABBACABQQhqQXBxQdiq1aoFcyIENgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgAALQQAgAjYCzNOAgABBAEGA1ISAADYCyNOAgABBAEGA1ISAADYCmNCAgABBACAENgKs0ICAAEEAQX82AqjQgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAtBgNSEgABBeEGA1ISAAGtBD3FBAEGA1ISAAEEIakEPcRsiA2oiBEEEaiACQUhqIgUgA2siA0EBcjYCAEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgABBgNSEgAAgBWpBODYCBAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEHsAUsNAAJAQQAoAojQgIAAIgZBECAAQRNqQXBxIABBC0kbIgJBA3YiBHYiA0EDcUUNAAJAAkAgA0EBcSAEckEBcyIFQQN0IgRBsNCAgABqIgMgBEG40ICAAGooAgAiBCgCCCICRw0AQQAgBkF+IAV3cTYCiNCAgAAMAQsgAyACNgIIIAIgAzYCDAsgBEEIaiEDIAQgBUEDdCIFQQNyNgIEIAQgBWoiBCAEKAIEQQFyNgIEDAwLIAJBACgCkNCAgAAiB00NAQJAIANFDQACQAJAIAMgBHRBAiAEdCIDQQAgA2tycSIDQQAgA2txQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmoiBEEDdCIDQbDQgIAAaiIFIANBuNCAgABqKAIAIgMoAggiAEcNAEEAIAZBfiAEd3EiBjYCiNCAgAAMAQsgBSAANgIIIAAgBTYCDAsgAyACQQNyNgIEIAMgBEEDdCIEaiAEIAJrIgU2AgAgAyACaiIAIAVBAXI2AgQCQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhBAJAAkAgBkEBIAdBA3Z0IghxDQBBACAGIAhyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAQ2AgwgAiAENgIIIAQgAjYCDCAEIAg2AggLIANBCGohA0EAIAA2ApzQgIAAQQAgBTYCkNCAgAAMDAtBACgCjNCAgAAiCUUNASAJQQAgCWtxQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmpBAnRBuNKAgABqKAIAIgAoAgRBeHEgAmshBCAAIQUCQANAAkAgBSgCECIDDQAgBUEUaigCACIDRQ0CCyADKAIEQXhxIAJrIgUgBCAFIARJIgUbIQQgAyAAIAUbIQAgAyEFDAALCyAAKAIYIQoCQCAAKAIMIgggAEYNACAAKAIIIgNBACgCmNCAgABJGiAIIAM2AgggAyAINgIMDAsLAkAgAEEUaiIFKAIAIgMNACAAKAIQIgNFDQMgAEEQaiEFCwNAIAUhCyADIghBFGoiBSgCACIDDQAgCEEQaiEFIAgoAhAiAw0ACyALQQA2AgAMCgtBfyECIABBv39LDQAgAEETaiIDQXBxIQJBACgCjNCAgAAiB0UNAEEAIQsCQCACQYACSQ0AQR8hCyACQf///wdLDQAgA0EIdiIDIANBgP4/akEQdkEIcSIDdCIEIARBgOAfakEQdkEEcSIEdCIFIAVBgIAPakEQdkECcSIFdEEPdiADIARyIAVyayIDQQF0IAIgA0EVanZBAXFyQRxqIQsLQQAgAmshBAJAAkACQAJAIAtBAnRBuNKAgABqKAIAIgUNAEEAIQNBACEIDAELQQAhAyACQQBBGSALQQF2ayALQR9GG3QhAEEAIQgDQAJAIAUoAgRBeHEgAmsiBiAETw0AIAYhBCAFIQggBg0AQQAhBCAFIQggBSEDDAMLIAMgBUEUaigCACIGIAYgBSAAQR12QQRxakEQaigCACIFRhsgAyAGGyEDIABBAXQhACAFDQALCwJAIAMgCHINAEEAIQhBAiALdCIDQQAgA2tyIAdxIgNFDQMgA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBUEFdkEIcSIAIANyIAUgAHYiA0ECdkEEcSIFciADIAV2IgNBAXZBAnEiBXIgAyAFdiIDQQF2QQFxIgVyIAMgBXZqQQJ0QbjSgIAAaigCACEDCyADRQ0BCwNAIAMoAgRBeHEgAmsiBiAESSEAAkAgAygCECIFDQAgA0EUaigCACEFCyAGIAQgABshBCADIAggABshCCAFIQMgBQ0ACwsgCEUNACAEQQAoApDQgIAAIAJrTw0AIAgoAhghCwJAIAgoAgwiACAIRg0AIAgoAggiA0EAKAKY0ICAAEkaIAAgAzYCCCADIAA2AgwMCQsCQCAIQRRqIgUoAgAiAw0AIAgoAhAiA0UNAyAIQRBqIQULA0AgBSEGIAMiAEEUaiIFKAIAIgMNACAAQRBqIQUgACgCECIDDQALIAZBADYCAAwICwJAQQAoApDQgIAAIgMgAkkNAEEAKAKc0ICAACEEAkACQCADIAJrIgVBEEkNACAEIAJqIgAgBUEBcjYCBEEAIAU2ApDQgIAAQQAgADYCnNCAgAAgBCADaiAFNgIAIAQgAkEDcjYCBAwBCyAEIANBA3I2AgQgBCADaiIDIAMoAgRBAXI2AgRBAEEANgKc0ICAAEEAQQA2ApDQgIAACyAEQQhqIQMMCgsCQEEAKAKU0ICAACIAIAJNDQBBACgCoNCAgAAiAyACaiIEIAAgAmsiBUEBcjYCBEEAIAU2ApTQgIAAQQAgBDYCoNCAgAAgAyACQQNyNgIEIANBCGohAwwKCwJAAkBBACgC4NOAgABFDQBBACgC6NOAgAAhBAwBC0EAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEMakFwcUHYqtWqBXM2AuDTgIAAQQBBADYC9NOAgABBAEEANgLE04CAAEGAgAQhBAtBACEDAkAgBCACQccAaiIHaiIGQQAgBGsiC3EiCCACSw0AQQBBMDYC+NOAgAAMCgsCQEEAKALA04CAACIDRQ0AAkBBACgCuNOAgAAiBCAIaiIFIARNDQAgBSADTQ0BC0EAIQNBAEEwNgL404CAAAwKC0EALQDE04CAAEEEcQ0EAkACQAJAQQAoAqDQgIAAIgRFDQBByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiAESw0DCyADKAIIIgMNAAsLQQAQy4CAgAAiAEF/Rg0FIAghBgJAQQAoAuTTgIAAIgNBf2oiBCAAcUUNACAIIABrIAQgAGpBACADa3FqIQYLIAYgAk0NBSAGQf7///8HSw0FAkBBACgCwNOAgAAiA0UNAEEAKAK404CAACIEIAZqIgUgBE0NBiAFIANLDQYLIAYQy4CAgAAiAyAARw0BDAcLIAYgAGsgC3EiBkH+////B0sNBCAGEMuAgIAAIgAgAygCACADKAIEakYNAyAAIQMLAkAgA0F/Rg0AIAJByABqIAZNDQACQCAHIAZrQQAoAujTgIAAIgRqQQAgBGtxIgRB/v///wdNDQAgAyEADAcLAkAgBBDLgICAAEF/Rg0AIAQgBmohBiADIQAMBwtBACAGaxDLgICAABoMBAsgAyEAIANBf0cNBQwDC0EAIQgMBwtBACEADAULIABBf0cNAgtBAEEAKALE04CAAEEEcjYCxNOAgAALIAhB/v///wdLDQEgCBDLgICAACEAQQAQy4CAgAAhAyAAQX9GDQEgA0F/Rg0BIAAgA08NASADIABrIgYgAkE4ak0NAQtBAEEAKAK404CAACAGaiIDNgK404CAAAJAIANBACgCvNOAgABNDQBBACADNgK804CAAAsCQAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQCAAIAMoAgAiBSADKAIEIghqRg0CIAMoAggiAw0ADAMLCwJAAkBBACgCmNCAgAAiA0UNACAAIANPDQELQQAgADYCmNCAgAALQQAhA0EAIAY2AszTgIAAQQAgADYCyNOAgABBAEF/NgKo0ICAAEEAQQAoAuDTgIAANgKs0ICAAEEAQQA2AtTTgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiBCAGQUhqIgUgA2siA0EBcjYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgAAgACAFakE4NgIEDAILIAMtAAxBCHENACAEIAVJDQAgBCAATw0AIARBeCAEa0EPcUEAIARBCGpBD3EbIgVqIgBBACgClNCAgAAgBmoiCyAFayIFQQFyNgIEIAMgCCAGajYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAU2ApTQgIAAQQAgADYCoNCAgAAgBCALakE4NgIEDAELAkAgAEEAKAKY0ICAACIITw0AQQAgADYCmNCAgAAgACEICyAAIAZqIQVByNOAgAAhAwJAAkACQAJAAkACQAJAA0AgAygCACAFRg0BIAMoAggiAw0ADAILCyADLQAMQQhxRQ0BC0HI04CAACEDA0ACQCADKAIAIgUgBEsNACAFIAMoAgRqIgUgBEsNAwsgAygCCCEDDAALCyADIAA2AgAgAyADKAIEIAZqNgIEIABBeCAAa0EPcUEAIABBCGpBD3EbaiILIAJBA3I2AgQgBUF4IAVrQQ9xQQAgBUEIakEPcRtqIgYgCyACaiICayEDAkAgBiAERw0AQQAgAjYCoNCAgABBAEEAKAKU0ICAACADaiIDNgKU0ICAACACIANBAXI2AgQMAwsCQCAGQQAoApzQgIAARw0AQQAgAjYCnNCAgABBAEEAKAKQ0ICAACADaiIDNgKQ0ICAACACIANBAXI2AgQgAiADaiADNgIADAMLAkAgBigCBCIEQQNxQQFHDQAgBEF4cSEHAkACQCAEQf8BSw0AIAYoAggiBSAEQQN2IghBA3RBsNCAgABqIgBGGgJAIAYoAgwiBCAFRw0AQQBBACgCiNCAgABBfiAId3E2AojQgIAADAILIAQgAEYaIAQgBTYCCCAFIAQ2AgwMAQsgBigCGCEJAkACQCAGKAIMIgAgBkYNACAGKAIIIgQgCEkaIAAgBDYCCCAEIAA2AgwMAQsCQCAGQRRqIgQoAgAiBQ0AIAZBEGoiBCgCACIFDQBBACEADAELA0AgBCEIIAUiAEEUaiIEKAIAIgUNACAAQRBqIQQgACgCECIFDQALIAhBADYCAAsgCUUNAAJAAkAgBiAGKAIcIgVBAnRBuNKAgABqIgQoAgBHDQAgBCAANgIAIAANAUEAQQAoAozQgIAAQX4gBXdxNgKM0ICAAAwCCyAJQRBBFCAJKAIQIAZGG2ogADYCACAARQ0BCyAAIAk2AhgCQCAGKAIQIgRFDQAgACAENgIQIAQgADYCGAsgBigCFCIERQ0AIABBFGogBDYCACAEIAA2AhgLIAcgA2ohAyAGIAdqIgYoAgQhBAsgBiAEQX5xNgIEIAIgA2ogAzYCACACIANBAXI2AgQCQCADQf8BSw0AIANBeHFBsNCAgABqIQQCQAJAQQAoAojQgIAAIgVBASADQQN2dCIDcQ0AQQAgBSADcjYCiNCAgAAgBCEDDAELIAQoAgghAwsgAyACNgIMIAQgAjYCCCACIAQ2AgwgAiADNgIIDAMLQR8hBAJAIANB////B0sNACADQQh2IgQgBEGA/j9qQRB2QQhxIgR0IgUgBUGA4B9qQRB2QQRxIgV0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAQgBXIgAHJrIgRBAXQgAyAEQRVqdkEBcXJBHGohBAsgAiAENgIcIAJCADcCECAEQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiAEEBIAR0IghxDQAgBSACNgIAQQAgACAIcjYCjNCAgAAgAiAFNgIYIAIgAjYCCCACIAI2AgwMAwsgA0EAQRkgBEEBdmsgBEEfRht0IQQgBSgCACEAA0AgACIFKAIEQXhxIANGDQIgBEEddiEAIARBAXQhBCAFIABBBHFqQRBqIggoAgAiAA0ACyAIIAI2AgAgAiAFNgIYIAIgAjYCDCACIAI2AggMAgsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiCyAGQUhqIgggA2siA0EBcjYCBCAAIAhqQTg2AgQgBCAFQTcgBWtBD3FBACAFQUlqQQ9xG2pBQWoiCCAIIARBEGpJGyIIQSM2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAs2AqDQgIAAIAhBEGpBACkC0NOAgAA3AgAgCEEAKQLI04CAADcCCEEAIAhBCGo2AtDTgIAAQQAgBjYCzNOAgABBACAANgLI04CAAEEAQQA2AtTTgIAAIAhBJGohAwNAIANBBzYCACADQQRqIgMgBUkNAAsgCCAERg0DIAggCCgCBEF+cTYCBCAIIAggBGsiADYCACAEIABBAXI2AgQCQCAAQf8BSw0AIABBeHFBsNCAgABqIQMCQAJAQQAoAojQgIAAIgVBASAAQQN2dCIAcQ0AQQAgBSAAcjYCiNCAgAAgAyEFDAELIAMoAgghBQsgBSAENgIMIAMgBDYCCCAEIAM2AgwgBCAFNgIIDAQLQR8hAwJAIABB////B0sNACAAQQh2IgMgA0GA/j9qQRB2QQhxIgN0IgUgBUGA4B9qQRB2QQRxIgV0IgggCEGAgA9qQRB2QQJxIgh0QQ92IAMgBXIgCHJrIgNBAXQgACADQRVqdkEBcXJBHGohAwsgBCADNgIcIARCADcCECADQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiCEEBIAN0IgZxDQAgBSAENgIAQQAgCCAGcjYCjNCAgAAgBCAFNgIYIAQgBDYCCCAEIAQ2AgwMBAsgAEEAQRkgA0EBdmsgA0EfRht0IQMgBSgCACEIA0AgCCIFKAIEQXhxIABGDQMgA0EddiEIIANBAXQhAyAFIAhBBHFqQRBqIgYoAgAiCA0ACyAGIAQ2AgAgBCAFNgIYIAQgBDYCDCAEIAQ2AggMAwsgBSgCCCIDIAI2AgwgBSACNgIIIAJBADYCGCACIAU2AgwgAiADNgIICyALQQhqIQMMBQsgBSgCCCIDIAQ2AgwgBSAENgIIIARBADYCGCAEIAU2AgwgBCADNgIIC0EAKAKU0ICAACIDIAJNDQBBACgCoNCAgAAiBCACaiIFIAMgAmsiA0EBcjYCBEEAIAM2ApTQgIAAQQAgBTYCoNCAgAAgBCACQQNyNgIEIARBCGohAwwDC0EAIQNBAEEwNgL404CAAAwCCwJAIAtFDQACQAJAIAggCCgCHCIFQQJ0QbjSgIAAaiIDKAIARw0AIAMgADYCACAADQFBACAHQX4gBXdxIgc2AozQgIAADAILIAtBEEEUIAsoAhAgCEYbaiAANgIAIABFDQELIAAgCzYCGAJAIAgoAhAiA0UNACAAIAM2AhAgAyAANgIYCyAIQRRqKAIAIgNFDQAgAEEUaiADNgIAIAMgADYCGAsCQAJAIARBD0sNACAIIAQgAmoiA0EDcjYCBCAIIANqIgMgAygCBEEBcjYCBAwBCyAIIAJqIgAgBEEBcjYCBCAIIAJBA3I2AgQgACAEaiAENgIAAkAgBEH/AUsNACAEQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgBEEDdnQiBHENAEEAIAUgBHI2AojQgIAAIAMhBAwBCyADKAIIIQQLIAQgADYCDCADIAA2AgggACADNgIMIAAgBDYCCAwBC0EfIQMCQCAEQf///wdLDQAgBEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCICIAJBgIAPakEQdkECcSICdEEPdiADIAVyIAJyayIDQQF0IAQgA0EVanZBAXFyQRxqIQMLIAAgAzYCHCAAQgA3AhAgA0ECdEG40oCAAGohBQJAIAdBASADdCICcQ0AIAUgADYCAEEAIAcgAnI2AozQgIAAIAAgBTYCGCAAIAA2AgggACAANgIMDAELIARBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhAgJAA0AgAiIFKAIEQXhxIARGDQEgA0EddiECIANBAXQhAyAFIAJBBHFqQRBqIgYoAgAiAg0ACyAGIAA2AgAgACAFNgIYIAAgADYCDCAAIAA2AggMAQsgBSgCCCIDIAA2AgwgBSAANgIIIABBADYCGCAAIAU2AgwgACADNgIICyAIQQhqIQMMAQsCQCAKRQ0AAkACQCAAIAAoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAg2AgAgCA0BQQAgCUF+IAV3cTYCjNCAgAAMAgsgCkEQQRQgCigCECAARhtqIAg2AgAgCEUNAQsgCCAKNgIYAkAgACgCECIDRQ0AIAggAzYCECADIAg2AhgLIABBFGooAgAiA0UNACAIQRRqIAM2AgAgAyAINgIYCwJAAkAgBEEPSw0AIAAgBCACaiIDQQNyNgIEIAAgA2oiAyADKAIEQQFyNgIEDAELIAAgAmoiBSAEQQFyNgIEIAAgAkEDcjYCBCAFIARqIAQ2AgACQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhAwJAAkBBASAHQQN2dCIIIAZxDQBBACAIIAZyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAM2AgwgAiADNgIIIAMgAjYCDCADIAg2AggLQQAgBTYCnNCAgABBACAENgKQ0ICAAAsgAEEIaiEDCyABQRBqJICAgIAAIAMLCgAgABDJgICAAAviDQEHfwJAIABFDQAgAEF4aiIBIABBfGooAgAiAkF4cSIAaiEDAkAgAkEBcQ0AIAJBA3FFDQEgASABKAIAIgJrIgFBACgCmNCAgAAiBEkNASACIABqIQACQCABQQAoApzQgIAARg0AAkAgAkH/AUsNACABKAIIIgQgAkEDdiIFQQN0QbDQgIAAaiIGRhoCQCABKAIMIgIgBEcNAEEAQQAoAojQgIAAQX4gBXdxNgKI0ICAAAwDCyACIAZGGiACIAQ2AgggBCACNgIMDAILIAEoAhghBwJAAkAgASgCDCIGIAFGDQAgASgCCCICIARJGiAGIAI2AgggAiAGNgIMDAELAkAgAUEUaiICKAIAIgQNACABQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQECQAJAIAEgASgCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAwsgB0EQQRQgBygCECABRhtqIAY2AgAgBkUNAgsgBiAHNgIYAkAgASgCECICRQ0AIAYgAjYCECACIAY2AhgLIAEoAhQiAkUNASAGQRRqIAI2AgAgAiAGNgIYDAELIAMoAgQiAkEDcUEDRw0AIAMgAkF+cTYCBEEAIAA2ApDQgIAAIAEgAGogADYCACABIABBAXI2AgQPCyABIANPDQAgAygCBCICQQFxRQ0AAkACQCACQQJxDQACQCADQQAoAqDQgIAARw0AQQAgATYCoNCAgABBAEEAKAKU0ICAACAAaiIANgKU0ICAACABIABBAXI2AgQgAUEAKAKc0ICAAEcNA0EAQQA2ApDQgIAAQQBBADYCnNCAgAAPCwJAIANBACgCnNCAgABHDQBBACABNgKc0ICAAEEAQQAoApDQgIAAIABqIgA2ApDQgIAAIAEgAEEBcjYCBCABIABqIAA2AgAPCyACQXhxIABqIQACQAJAIAJB/wFLDQAgAygCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgAygCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAgsgAiAGRhogAiAENgIIIAQgAjYCDAwBCyADKAIYIQcCQAJAIAMoAgwiBiADRg0AIAMoAggiAkEAKAKY0ICAAEkaIAYgAjYCCCACIAY2AgwMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEGDAELA0AgAiEFIAQiBkEUaiICKAIAIgQNACAGQRBqIQIgBigCECIEDQALIAVBADYCAAsgB0UNAAJAAkAgAyADKAIcIgRBAnRBuNKAgABqIgIoAgBHDQAgAiAGNgIAIAYNAUEAQQAoAozQgIAAQX4gBHdxNgKM0ICAAAwCCyAHQRBBFCAHKAIQIANGG2ogBjYCACAGRQ0BCyAGIAc2AhgCQCADKAIQIgJFDQAgBiACNgIQIAIgBjYCGAsgAygCFCICRQ0AIAZBFGogAjYCACACIAY2AhgLIAEgAGogADYCACABIABBAXI2AgQgAUEAKAKc0ICAAEcNAUEAIAA2ApDQgIAADwsgAyACQX5xNgIEIAEgAGogADYCACABIABBAXI2AgQLAkAgAEH/AUsNACAAQXhxQbDQgIAAaiECAkACQEEAKAKI0ICAACIEQQEgAEEDdnQiAHENAEEAIAQgAHI2AojQgIAAIAIhAAwBCyACKAIIIQALIAAgATYCDCACIAE2AgggASACNgIMIAEgADYCCA8LQR8hAgJAIABB////B0sNACAAQQh2IgIgAkGA/j9qQRB2QQhxIgJ0IgQgBEGA4B9qQRB2QQRxIgR0IgYgBkGAgA9qQRB2QQJxIgZ0QQ92IAIgBHIgBnJrIgJBAXQgACACQRVqdkEBcXJBHGohAgsgASACNgIcIAFCADcCECACQQJ0QbjSgIAAaiEEAkACQEEAKAKM0ICAACIGQQEgAnQiA3ENACAEIAE2AgBBACAGIANyNgKM0ICAACABIAQ2AhggASABNgIIIAEgATYCDAwBCyAAQQBBGSACQQF2ayACQR9GG3QhAiAEKAIAIQYCQANAIAYiBCgCBEF4cSAARg0BIAJBHXYhBiACQQF0IQIgBCAGQQRxakEQaiIDKAIAIgYNAAsgAyABNgIAIAEgBDYCGCABIAE2AgwgASABNgIIDAELIAQoAggiACABNgIMIAQgATYCCCABQQA2AhggASAENgIMIAEgADYCCAtBAEEAKAKo0ICAAEF/aiIBQX8gARs2AqjQgIAACwsEAAAAC04AAkAgAA0APwBBEHQPCwJAIABB//8DcQ0AIABBf0wNAAJAIABBEHZAACIAQX9HDQBBAEEwNgL404CAAEF/DwsgAEEQdA8LEMqAgIAAAAvyAgIDfwF+AkAgAkUNACAAIAE6AAAgAiAAaiIDQX9qIAE6AAAgAkEDSQ0AIAAgAToAAiAAIAE6AAEgA0F9aiABOgAAIANBfmogAToAACACQQdJDQAgACABOgADIANBfGogAToAACACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiATYCACADIAIgBGtBfHEiBGoiAkF8aiABNgIAIARBCUkNACADIAE2AgggAyABNgIEIAJBeGogATYCACACQXRqIAE2AgAgBEEZSQ0AIAMgATYCGCADIAE2AhQgAyABNgIQIAMgATYCDCACQXBqIAE2AgAgAkFsaiABNgIAIAJBaGogATYCACACQWRqIAE2AgAgBCADQQRxQRhyIgVrIgJBIEkNACABrUKBgICAEH4hBiADIAVqIQEDQCABIAY3AxggASAGNwMQIAEgBjcDCCABIAY3AwAgAUEgaiEBIAJBYGoiAkEfSw0ACwsgAAsLjkgBAEGACAuGSAEAAAACAAAAAwAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAYAAAAHAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==' - blob = webidl.converters.Blob(blob, { strict: false }) - // The readAsArrayBuffer(blob) method, when invoked, - // must initiate a read operation for blob with ArrayBuffer. - readOperation(this, blob, 'ArrayBuffer') - } +/***/ }), - /** - * @see https://w3c.github.io/FileAPI/#readAsBinaryString - * @param {import('buffer').Blob} blob - */ - readAsBinaryString (blob) { - webidl.brandCheck(this, FileReader) +/***/ 41891: +/***/ ((__unused_webpack_module, exports) => { - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsBinaryString' }) +"use strict"; - blob = webidl.converters.Blob(blob, { strict: false }) +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.enumToMap = void 0; +function enumToMap(obj) { + const res = {}; + Object.keys(obj).forEach((key) => { + const value = obj[key]; + if (typeof value === 'number') { + res[key] = value; + } + }); + return res; +} +exports.enumToMap = enumToMap; +//# sourceMappingURL=utils.js.map - // The readAsBinaryString(blob) method, when invoked, - // must initiate a read operation for blob with BinaryString. - readOperation(this, blob, 'BinaryString') - } +/***/ }), - /** - * @see https://w3c.github.io/FileAPI/#readAsDataText - * @param {import('buffer').Blob} blob - * @param {string?} encoding - */ - readAsText (blob, encoding = undefined) { - webidl.brandCheck(this, FileReader) +/***/ 66771: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsText' }) +"use strict"; - blob = webidl.converters.Blob(blob, { strict: false }) - if (encoding !== undefined) { - encoding = webidl.converters.DOMString(encoding) - } +const { kClients } = __nccwpck_require__(72785) +const Agent = __nccwpck_require__(7890) +const { + kAgent, + kMockAgentSet, + kMockAgentGet, + kDispatches, + kIsMockActive, + kNetConnect, + kGetNetConnect, + kOptions, + kFactory +} = __nccwpck_require__(24347) +const MockClient = __nccwpck_require__(58687) +const MockPool = __nccwpck_require__(26193) +const { matchValue, buildMockOptions } = __nccwpck_require__(79323) +const { InvalidArgumentError, UndiciError } = __nccwpck_require__(48045) +const Dispatcher = __nccwpck_require__(60412) +const Pluralizer = __nccwpck_require__(78891) +const PendingInterceptorsFormatter = __nccwpck_require__(86823) - // The readAsText(blob, encoding) method, when invoked, - // must initiate a read operation for blob with Text and encoding. - readOperation(this, blob, 'Text', encoding) +class FakeWeakRef { + constructor (value) { + this.value = value } - /** - * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL - * @param {import('buffer').Blob} blob - */ - readAsDataURL (blob) { - webidl.brandCheck(this, FileReader) - - webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsDataURL' }) - - blob = webidl.converters.Blob(blob, { strict: false }) - - // The readAsDataURL(blob) method, when invoked, must - // initiate a read operation for blob with DataURL. - readOperation(this, blob, 'DataURL') + deref () { + return this.value } +} - /** - * @see https://w3c.github.io/FileAPI/#dfn-abort - */ - abort () { - // 1. If this's state is "empty" or if this's state is - // "done" set this's result to null and terminate - // this algorithm. - if (this[kState] === 'empty' || this[kState] === 'done') { - this[kResult] = null - return - } - - // 2. If this's state is "loading" set this's state to - // "done" and set this's result to null. - if (this[kState] === 'loading') { - this[kState] = 'done' - this[kResult] = null - } - - // 3. If there are any tasks from this on the file reading - // task source in an affiliated task queue, then remove - // those tasks from that task queue. - this[kAborted] = true - - // 4. Terminate the algorithm for the read method being processed. - // TODO +class MockAgent extends Dispatcher { + constructor (opts) { + super(opts) - // 5. Fire a progress event called abort at this. - fireAProgressEvent('abort', this) + this[kNetConnect] = true + this[kIsMockActive] = true - // 6. If this's state is not "loading", fire a progress - // event called loadend at this. - if (this[kState] !== 'loading') { - fireAProgressEvent('loadend', this) + // Instantiate Agent and encapsulate + if ((opts && opts.agent && typeof opts.agent.dispatch !== 'function')) { + throw new InvalidArgumentError('Argument opts.agent must implement Agent') } - } - - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate - */ - get readyState () { - webidl.brandCheck(this, FileReader) + const agent = opts && opts.agent ? opts.agent : new Agent(opts) + this[kAgent] = agent - switch (this[kState]) { - case 'empty': return this.EMPTY - case 'loading': return this.LOADING - case 'done': return this.DONE - } + this[kClients] = agent[kClients] + this[kOptions] = buildMockOptions(opts) } - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-result - */ - get result () { - webidl.brandCheck(this, FileReader) + get (origin) { + let dispatcher = this[kMockAgentGet](origin) - // The result attribute’s getter, when invoked, must return - // this's result. - return this[kResult] + if (!dispatcher) { + dispatcher = this[kFactory](origin) + this[kMockAgentSet](origin, dispatcher) + } + return dispatcher } - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-error - */ - get error () { - webidl.brandCheck(this, FileReader) - - // The error attribute’s getter, when invoked, must return - // this's error. - return this[kError] + dispatch (opts, handler) { + // Call MockAgent.get to perform additional setup before dispatching as normal + this.get(opts.origin) + return this[kAgent].dispatch(opts, handler) } - get onloadend () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].loadend + async close () { + await this[kAgent].close() + this[kClients].clear() } - set onloadend (fn) { - webidl.brandCheck(this, FileReader) - - if (this[kEvents].loadend) { - this.removeEventListener('loadend', this[kEvents].loadend) - } - - if (typeof fn === 'function') { - this[kEvents].loadend = fn - this.addEventListener('loadend', fn) - } else { - this[kEvents].loadend = null - } + deactivate () { + this[kIsMockActive] = false } - get onerror () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].error + activate () { + this[kIsMockActive] = true } - set onerror (fn) { - webidl.brandCheck(this, FileReader) - - if (this[kEvents].error) { - this.removeEventListener('error', this[kEvents].error) - } - - if (typeof fn === 'function') { - this[kEvents].error = fn - this.addEventListener('error', fn) + enableNetConnect (matcher) { + if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) { + if (Array.isArray(this[kNetConnect])) { + this[kNetConnect].push(matcher) + } else { + this[kNetConnect] = [matcher] + } + } else if (typeof matcher === 'undefined') { + this[kNetConnect] = true } else { - this[kEvents].error = null + throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.') } } - get onloadstart () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].loadstart - } - - set onloadstart (fn) { - webidl.brandCheck(this, FileReader) - - if (this[kEvents].loadstart) { - this.removeEventListener('loadstart', this[kEvents].loadstart) - } - - if (typeof fn === 'function') { - this[kEvents].loadstart = fn - this.addEventListener('loadstart', fn) - } else { - this[kEvents].loadstart = null - } + disableNetConnect () { + this[kNetConnect] = false } - get onprogress () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].progress + // This is required to bypass issues caused by using global symbols - see: + // https://github.com/nodejs/undici/issues/1447 + get isMockActive () { + return this[kIsMockActive] } - set onprogress (fn) { - webidl.brandCheck(this, FileReader) - - if (this[kEvents].progress) { - this.removeEventListener('progress', this[kEvents].progress) - } - - if (typeof fn === 'function') { - this[kEvents].progress = fn - this.addEventListener('progress', fn) - } else { - this[kEvents].progress = null - } + [kMockAgentSet] (origin, dispatcher) { + this[kClients].set(origin, new FakeWeakRef(dispatcher)) } - get onload () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].load + [kFactory] (origin) { + const mockOptions = Object.assign({ agent: this }, this[kOptions]) + return this[kOptions] && this[kOptions].connections === 1 + ? new MockClient(origin, mockOptions) + : new MockPool(origin, mockOptions) } - set onload (fn) { - webidl.brandCheck(this, FileReader) + [kMockAgentGet] (origin) { + // First check if we can immediately find it + const ref = this[kClients].get(origin) + if (ref) { + return ref.deref() + } - if (this[kEvents].load) { - this.removeEventListener('load', this[kEvents].load) + // If the origin is not a string create a dummy parent pool and return to user + if (typeof origin !== 'string') { + const dispatcher = this[kFactory]('http://localhost:9999') + this[kMockAgentSet](origin, dispatcher) + return dispatcher } - if (typeof fn === 'function') { - this[kEvents].load = fn - this.addEventListener('load', fn) - } else { - this[kEvents].load = null + // If we match, create a pool and assign the same dispatches + for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { + const nonExplicitDispatcher = nonExplicitRef.deref() + if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) { + const dispatcher = this[kFactory](origin) + this[kMockAgentSet](origin, dispatcher) + dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches] + return dispatcher + } } } - get onabort () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].abort + [kGetNetConnect] () { + return this[kNetConnect] } - set onabort (fn) { - webidl.brandCheck(this, FileReader) - - if (this[kEvents].abort) { - this.removeEventListener('abort', this[kEvents].abort) - } + pendingInterceptors () { + const mockAgentClients = this[kClients] - if (typeof fn === 'function') { - this[kEvents].abort = fn - this.addEventListener('abort', fn) - } else { - this[kEvents].abort = null - } + return Array.from(mockAgentClients.entries()) + .flatMap(([origin, scope]) => scope.deref()[kDispatches].map(dispatch => ({ ...dispatch, origin }))) + .filter(({ pending }) => pending) } -} - -// https://w3c.github.io/FileAPI/#dom-filereader-empty -FileReader.EMPTY = FileReader.prototype.EMPTY = 0 -// https://w3c.github.io/FileAPI/#dom-filereader-loading -FileReader.LOADING = FileReader.prototype.LOADING = 1 -// https://w3c.github.io/FileAPI/#dom-filereader-done -FileReader.DONE = FileReader.prototype.DONE = 2 -Object.defineProperties(FileReader.prototype, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors, - readAsArrayBuffer: kEnumerableProperty, - readAsBinaryString: kEnumerableProperty, - readAsText: kEnumerableProperty, - readAsDataURL: kEnumerableProperty, - abort: kEnumerableProperty, - readyState: kEnumerableProperty, - result: kEnumerableProperty, - error: kEnumerableProperty, - onloadstart: kEnumerableProperty, - onprogress: kEnumerableProperty, - onload: kEnumerableProperty, - onabort: kEnumerableProperty, - onerror: kEnumerableProperty, - onloadend: kEnumerableProperty, - [Symbol.toStringTag]: { - value: 'FileReader', - writable: false, - enumerable: false, - configurable: true - } -}) + assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) { + const pending = this.pendingInterceptors() -Object.defineProperties(FileReader, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors -}) + if (pending.length === 0) { + return + } -module.exports = { - FileReader + const pluralizer = new Pluralizer('interceptor', 'interceptors').pluralize(pending.length) + + throw new UndiciError(` +${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: + +${pendingInterceptorsFormatter.format(pending)} +`.trim()) + } } +module.exports = MockAgent + /***/ }), -/***/ 55504: +/***/ 58687: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { webidl } = __nccwpck_require__(21744) - -const kState = Symbol('ProgressEvent state') +const { promisify } = __nccwpck_require__(73837) +const Client = __nccwpck_require__(33598) +const { buildMockDispatch } = __nccwpck_require__(79323) +const { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected +} = __nccwpck_require__(24347) +const { MockInterceptor } = __nccwpck_require__(90410) +const Symbols = __nccwpck_require__(72785) +const { InvalidArgumentError } = __nccwpck_require__(48045) /** - * @see https://xhr.spec.whatwg.org/#progressevent + * MockClient provides an API that extends the Client to influence the mockDispatches. */ -class ProgressEvent extends Event { - constructor (type, eventInitDict = {}) { - type = webidl.converters.DOMString(type) - eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}) - - super(type, eventInitDict) +class MockClient extends Client { + constructor (origin, opts) { + super(origin, opts) - this[kState] = { - lengthComputable: eventInitDict.lengthComputable, - loaded: eventInitDict.loaded, - total: eventInitDict.total + if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { + throw new InvalidArgumentError('Argument opts.agent must implement Agent') } - } - get lengthComputable () { - webidl.brandCheck(this, ProgressEvent) + this[kMockAgent] = opts.agent + this[kOrigin] = origin + this[kDispatches] = [] + this[kConnected] = 1 + this[kOriginalDispatch] = this.dispatch + this[kOriginalClose] = this.close.bind(this) - return this[kState].lengthComputable + this.dispatch = buildMockDispatch.call(this) + this.close = this[kClose] } - get loaded () { - webidl.brandCheck(this, ProgressEvent) - - return this[kState].loaded + get [Symbols.kConnected] () { + return this[kConnected] } - get total () { - webidl.brandCheck(this, ProgressEvent) - - return this[kState].total + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept (opts) { + return new MockInterceptor(opts, this[kDispatches]) } -} -webidl.converters.ProgressEventInit = webidl.dictionaryConverter([ - { - key: 'lengthComputable', - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: 'loaded', - converter: webidl.converters['unsigned long long'], - defaultValue: 0 - }, - { - key: 'total', - converter: webidl.converters['unsigned long long'], - defaultValue: 0 - }, - { - key: 'bubbles', - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: 'cancelable', - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: 'composed', - converter: webidl.converters.boolean, - defaultValue: false + async [kClose] () { + await promisify(this[kOriginalClose])() + this[kConnected] = 0 + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]) } -]) - -module.exports = { - ProgressEvent } +module.exports = MockClient + /***/ }), -/***/ 29054: -/***/ ((module) => { +/***/ 50888: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; +const { UndiciError } = __nccwpck_require__(48045) + +class MockNotMatchedError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, MockNotMatchedError) + this.name = 'MockNotMatchedError' + this.message = message || 'The request does not match any registered mock dispatches' + this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED' + } +} + module.exports = { - kState: Symbol('FileReader state'), - kResult: Symbol('FileReader result'), - kError: Symbol('FileReader error'), - kLastProgressEventFired: Symbol('FileReader last progress event fired timestamp'), - kEvents: Symbol('FileReader events'), - kAborted: Symbol('FileReader aborted') + MockNotMatchedError } /***/ }), -/***/ 87530: +/***/ 90410: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; +const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(79323) const { - kState, - kError, - kResult, - kAborted, - kLastProgressEventFired -} = __nccwpck_require__(29054) -const { ProgressEvent } = __nccwpck_require__(55504) -const { getEncoding } = __nccwpck_require__(84854) -const { DOMException } = __nccwpck_require__(41037) -const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(685) -const { types } = __nccwpck_require__(73837) -const { StringDecoder } = __nccwpck_require__(71576) -const { btoa } = __nccwpck_require__(14300) - -/** @type {PropertyDescriptor} */ -const staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false -} + kDispatches, + kDispatchKey, + kDefaultHeaders, + kDefaultTrailers, + kContentLength, + kMockDispatch +} = __nccwpck_require__(24347) +const { InvalidArgumentError } = __nccwpck_require__(48045) +const { buildURL } = __nccwpck_require__(83983) /** - * @see https://w3c.github.io/FileAPI/#readOperation - * @param {import('./filereader').FileReader} fr - * @param {import('buffer').Blob} blob - * @param {string} type - * @param {string?} encodingName + * Defines the scope API for an interceptor reply */ -function readOperation (fr, blob, type, encodingName) { - // 1. If fr’s state is "loading", throw an InvalidStateError - // DOMException. - if (fr[kState] === 'loading') { - throw new DOMException('Invalid state', 'InvalidStateError') +class MockScope { + constructor (mockDispatch) { + this[kMockDispatch] = mockDispatch } - // 2. Set fr’s state to "loading". - fr[kState] = 'loading' - - // 3. Set fr’s result to null. - fr[kResult] = null - - // 4. Set fr’s error to null. - fr[kError] = null - - // 5. Let stream be the result of calling get stream on blob. - /** @type {import('stream/web').ReadableStream} */ - const stream = blob.stream() - - // 6. Let reader be the result of getting a reader from stream. - const reader = stream.getReader() - - // 7. Let bytes be an empty byte sequence. - /** @type {Uint8Array[]} */ - const bytes = [] - - // 8. Let chunkPromise be the result of reading a chunk from - // stream with reader. - let chunkPromise = reader.read() - - // 9. Let isFirstChunk be true. - let isFirstChunk = true - - // 10. In parallel, while true: - // Note: "In parallel" just means non-blocking - // Note 2: readOperation itself cannot be async as double - // reading the body would then reject the promise, instead - // of throwing an error. - ;(async () => { - while (!fr[kAborted]) { - // 1. Wait for chunkPromise to be fulfilled or rejected. - try { - const { done, value } = await chunkPromise - - // 2. If chunkPromise is fulfilled, and isFirstChunk is - // true, queue a task to fire a progress event called - // loadstart at fr. - if (isFirstChunk && !fr[kAborted]) { - queueMicrotask(() => { - fireAProgressEvent('loadstart', fr) - }) - } - - // 3. Set isFirstChunk to false. - isFirstChunk = false - - // 4. If chunkPromise is fulfilled with an object whose - // done property is false and whose value property is - // a Uint8Array object, run these steps: - if (!done && types.isUint8Array(value)) { - // 1. Let bs be the byte sequence represented by the - // Uint8Array object. - - // 2. Append bs to bytes. - bytes.push(value) - - // 3. If roughly 50ms have passed since these steps - // were last invoked, queue a task to fire a - // progress event called progress at fr. - if ( - ( - fr[kLastProgressEventFired] === undefined || - Date.now() - fr[kLastProgressEventFired] >= 50 - ) && - !fr[kAborted] - ) { - fr[kLastProgressEventFired] = Date.now() - queueMicrotask(() => { - fireAProgressEvent('progress', fr) - }) - } - - // 4. Set chunkPromise to the result of reading a - // chunk from stream with reader. - chunkPromise = reader.read() - } else if (done) { - // 5. Otherwise, if chunkPromise is fulfilled with an - // object whose done property is true, queue a task - // to run the following steps and abort this algorithm: - queueMicrotask(() => { - // 1. Set fr’s state to "done". - fr[kState] = 'done' - - // 2. Let result be the result of package data given - // bytes, type, blob’s type, and encodingName. - try { - const result = packageData(bytes, type, blob.type, encodingName) - - // 4. Else: - - if (fr[kAborted]) { - return - } - - // 1. Set fr’s result to result. - fr[kResult] = result - - // 2. Fire a progress event called load at the fr. - fireAProgressEvent('load', fr) - } catch (error) { - // 3. If package data threw an exception error: - - // 1. Set fr’s error to error. - fr[kError] = error - - // 2. Fire a progress event called error at fr. - fireAProgressEvent('error', fr) - } - - // 5. If fr’s state is not "loading", fire a progress - // event called loadend at the fr. - if (fr[kState] !== 'loading') { - fireAProgressEvent('loadend', fr) - } - }) - - break - } - } catch (error) { - if (fr[kAborted]) { - return - } - - // 6. Otherwise, if chunkPromise is rejected with an - // error error, queue a task to run the following - // steps and abort this algorithm: - queueMicrotask(() => { - // 1. Set fr’s state to "done". - fr[kState] = 'done' - - // 2. Set fr’s error to error. - fr[kError] = error + /** + * Delay a reply by a set amount in ms. + */ + delay (waitInMs) { + if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) { + throw new InvalidArgumentError('waitInMs must be a valid integer > 0') + } - // 3. Fire a progress event called error at fr. - fireAProgressEvent('error', fr) + this[kMockDispatch].delay = waitInMs + return this + } - // 4. If fr’s state is not "loading", fire a progress - // event called loadend at fr. - if (fr[kState] !== 'loading') { - fireAProgressEvent('loadend', fr) - } - }) + /** + * For a defined reply, never mark as consumed. + */ + persist () { + this[kMockDispatch].persist = true + return this + } - break - } + /** + * Allow one to define a reply for a set amount of matching requests. + */ + times (repeatTimes) { + if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { + throw new InvalidArgumentError('repeatTimes must be a valid integer > 0') } - })() -} - -/** - * @see https://w3c.github.io/FileAPI/#fire-a-progress-event - * @see https://dom.spec.whatwg.org/#concept-event-fire - * @param {string} e The name of the event - * @param {import('./filereader').FileReader} reader - */ -function fireAProgressEvent (e, reader) { - // The progress event e does not bubble. e.bubbles must be false - // The progress event e is NOT cancelable. e.cancelable must be false - const event = new ProgressEvent(e, { - bubbles: false, - cancelable: false - }) - reader.dispatchEvent(event) + this[kMockDispatch].times = repeatTimes + return this + } } /** - * @see https://w3c.github.io/FileAPI/#blob-package-data - * @param {Uint8Array[]} bytes - * @param {string} type - * @param {string?} mimeType - * @param {string?} encodingName + * Defines an interceptor for a Mock */ -function packageData (bytes, type, mimeType, encodingName) { - // 1. A Blob has an associated package data algorithm, given - // bytes, a type, a optional mimeType, and a optional - // encodingName, which switches on type and runs the - // associated steps: - - switch (type) { - case 'DataURL': { - // 1. Return bytes as a DataURL [RFC2397] subject to - // the considerations below: - // * Use mimeType as part of the Data URL if it is - // available in keeping with the Data URL - // specification [RFC2397]. - // * If mimeType is not available return a Data URL - // without a media-type. [RFC2397]. - - // https://datatracker.ietf.org/doc/html/rfc2397#section-3 - // dataurl := "data:" [ mediatype ] [ ";base64" ] "," data - // mediatype := [ type "/" subtype ] *( ";" parameter ) - // data := *urlchar - // parameter := attribute "=" value - let dataURL = 'data:' - - const parsed = parseMIMEType(mimeType || 'application/octet-stream') - - if (parsed !== 'failure') { - dataURL += serializeAMimeType(parsed) - } - - dataURL += ';base64,' - - const decoder = new StringDecoder('latin1') - - for (const chunk of bytes) { - dataURL += btoa(decoder.write(chunk)) - } - - dataURL += btoa(decoder.end()) - - return dataURL +class MockInterceptor { + constructor (opts, mockDispatches) { + if (typeof opts !== 'object') { + throw new InvalidArgumentError('opts must be an object') } - case 'Text': { - // 1. Let encoding be failure - let encoding = 'failure' - - // 2. If the encodingName is present, set encoding to the - // result of getting an encoding from encodingName. - if (encodingName) { - encoding = getEncoding(encodingName) + if (typeof opts.path === 'undefined') { + throw new InvalidArgumentError('opts.path must be defined') + } + if (typeof opts.method === 'undefined') { + opts.method = 'GET' + } + // See https://github.com/nodejs/undici/issues/1245 + // As per RFC 3986, clients are not supposed to send URI + // fragments to servers when they retrieve a document, + if (typeof opts.path === 'string') { + if (opts.query) { + opts.path = buildURL(opts.path, opts.query) + } else { + // Matches https://github.com/nodejs/undici/blob/main/lib/fetch/index.js#L1811 + const parsedURL = new URL(opts.path, 'data://') + opts.path = parsedURL.pathname + parsedURL.search } + } + if (typeof opts.method === 'string') { + opts.method = opts.method.toUpperCase() + } - // 3. If encoding is failure, and mimeType is present: - if (encoding === 'failure' && mimeType) { - // 1. Let type be the result of parse a MIME type - // given mimeType. - const type = parseMIMEType(mimeType) + this[kDispatchKey] = buildKey(opts) + this[kDispatches] = mockDispatches + this[kDefaultHeaders] = {} + this[kDefaultTrailers] = {} + this[kContentLength] = false + } - // 2. If type is not failure, set encoding to the result - // of getting an encoding from type’s parameters["charset"]. - if (type !== 'failure') { - encoding = getEncoding(type.parameters.get('charset')) - } - } + createMockScopeDispatchData (statusCode, data, responseOptions = {}) { + const responseData = getResponseData(data) + const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {} + const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers } + const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers } - // 4. If encoding is failure, then set encoding to UTF-8. - if (encoding === 'failure') { - encoding = 'UTF-8' - } + return { statusCode, data, headers, trailers } + } - // 5. Decode bytes using fallback encoding encoding, and - // return the result. - return decode(bytes, encoding) + validateReplyParameters (statusCode, data, responseOptions) { + if (typeof statusCode === 'undefined') { + throw new InvalidArgumentError('statusCode must be defined') } - case 'ArrayBuffer': { - // Return a new ArrayBuffer whose contents are bytes. - const sequence = combineByteSequences(bytes) - - return sequence.buffer + if (typeof data === 'undefined') { + throw new InvalidArgumentError('data must be defined') } - case 'BinaryString': { - // Return bytes as a binary string, in which every byte - // is represented by a code unit of equal value [0..255]. - let binaryString = '' + if (typeof responseOptions !== 'object') { + throw new InvalidArgumentError('responseOptions must be an object') + } + } + + /** + * Mock an undici request with a defined reply. + */ + reply (replyData) { + // Values of reply aren't available right now as they + // can only be available when the reply callback is invoked. + if (typeof replyData === 'function') { + // We'll first wrap the provided callback in another function, + // this function will properly resolve the data from the callback + // when invoked. + const wrappedDefaultsCallback = (opts) => { + // Our reply options callback contains the parameter for statusCode, data and options. + const resolvedData = replyData(opts) - const decoder = new StringDecoder('latin1') + // Check if it is in the right format + if (typeof resolvedData !== 'object') { + throw new InvalidArgumentError('reply options callback must return an object') + } - for (const chunk of bytes) { - binaryString += decoder.write(chunk) + const { statusCode, data = '', responseOptions = {} } = resolvedData + this.validateReplyParameters(statusCode, data, responseOptions) + // Since the values can be obtained immediately we return them + // from this higher order function that will be resolved later. + return { + ...this.createMockScopeDispatchData(statusCode, data, responseOptions) + } } - binaryString += decoder.end() - - return binaryString + // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data. + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback) + return new MockScope(newMockDispatch) } - } -} - -/** - * @see https://encoding.spec.whatwg.org/#decode - * @param {Uint8Array[]} ioQueue - * @param {string} encoding - */ -function decode (ioQueue, encoding) { - const bytes = combineByteSequences(ioQueue) - - // 1. Let BOMEncoding be the result of BOM sniffing ioQueue. - const BOMEncoding = BOMSniffing(bytes) - - let slice = 0 - // 2. If BOMEncoding is non-null: - if (BOMEncoding !== null) { - // 1. Set encoding to BOMEncoding. - encoding = BOMEncoding + // We can have either one or three parameters, if we get here, + // we should have 1-3 parameters. So we spread the arguments of + // this function to obtain the parameters, since replyData will always + // just be the statusCode. + const [statusCode, data = '', responseOptions = {}] = [...arguments] + this.validateReplyParameters(statusCode, data, responseOptions) - // 2. Read three bytes from ioQueue, if BOMEncoding is - // UTF-8; otherwise read two bytes. - // (Do nothing with those bytes.) - slice = BOMEncoding === 'UTF-8' ? 3 : 2 + // Send in-already provided data like usual + const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions) + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData) + return new MockScope(newMockDispatch) } - // 3. Process a queue with an instance of encoding’s - // decoder, ioQueue, output, and "replacement". - - // 4. Return output. + /** + * Mock an undici request with a defined error. + */ + replyWithError (error) { + if (typeof error === 'undefined') { + throw new InvalidArgumentError('error must be defined') + } - const sliced = bytes.slice(slice) - return new TextDecoder(encoding).decode(sliced) -} + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }) + return new MockScope(newMockDispatch) + } -/** - * @see https://encoding.spec.whatwg.org/#bom-sniff - * @param {Uint8Array} ioQueue - */ -function BOMSniffing (ioQueue) { - // 1. Let BOM be the result of peeking 3 bytes from ioQueue, - // converted to a byte sequence. - const [a, b, c] = ioQueue + /** + * Set default reply headers on the interceptor for subsequent replies + */ + defaultReplyHeaders (headers) { + if (typeof headers === 'undefined') { + throw new InvalidArgumentError('headers must be defined') + } - // 2. For each of the rows in the table below, starting with - // the first one and going down, if BOM starts with the - // bytes given in the first column, then return the - // encoding given in the cell in the second column of that - // row. Otherwise, return null. - if (a === 0xEF && b === 0xBB && c === 0xBF) { - return 'UTF-8' - } else if (a === 0xFE && b === 0xFF) { - return 'UTF-16BE' - } else if (a === 0xFF && b === 0xFE) { - return 'UTF-16LE' + this[kDefaultHeaders] = headers + return this } - return null -} - -/** - * @param {Uint8Array[]} sequences - */ -function combineByteSequences (sequences) { - const size = sequences.reduce((a, b) => { - return a + b.byteLength - }, 0) + /** + * Set default reply trailers on the interceptor for subsequent replies + */ + defaultReplyTrailers (trailers) { + if (typeof trailers === 'undefined') { + throw new InvalidArgumentError('trailers must be defined') + } - let offset = 0 + this[kDefaultTrailers] = trailers + return this + } - return sequences.reduce((a, b) => { - a.set(b, offset) - offset += b.byteLength - return a - }, new Uint8Array(size)) + /** + * Set reply content length header for replies on the interceptor + */ + replyContentLength () { + this[kContentLength] = true + return this + } } -module.exports = { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent -} +module.exports.MockInterceptor = MockInterceptor +module.exports.MockScope = MockScope /***/ }), -/***/ 21892: +/***/ 26193: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -// We include a version number for the Dispatcher API. In case of breaking changes, -// this version number must be increased to avoid conflicts. -const globalDispatcher = Symbol.for('undici.globalDispatcher.1') +const { promisify } = __nccwpck_require__(73837) +const Pool = __nccwpck_require__(4634) +const { buildMockDispatch } = __nccwpck_require__(79323) +const { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected +} = __nccwpck_require__(24347) +const { MockInterceptor } = __nccwpck_require__(90410) +const Symbols = __nccwpck_require__(72785) const { InvalidArgumentError } = __nccwpck_require__(48045) -const Agent = __nccwpck_require__(7890) - -if (getGlobalDispatcher() === undefined) { - setGlobalDispatcher(new Agent()) -} - -function setGlobalDispatcher (agent) { - if (!agent || typeof agent.dispatch !== 'function') { - throw new InvalidArgumentError('Argument agent must implement Agent') - } - Object.defineProperty(globalThis, globalDispatcher, { - value: agent, - writable: true, - enumerable: false, - configurable: false - }) -} - -function getGlobalDispatcher () { - return globalThis[globalDispatcher] -} - -module.exports = { - setGlobalDispatcher, - getGlobalDispatcher -} - -/***/ }), - -/***/ 46930: -/***/ ((module) => { +/** + * MockPool provides an API that extends the Pool to influence the mockDispatches. + */ +class MockPool extends Pool { + constructor (origin, opts) { + super(origin, opts) -"use strict"; + if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { + throw new InvalidArgumentError('Argument opts.agent must implement Agent') + } + this[kMockAgent] = opts.agent + this[kOrigin] = origin + this[kDispatches] = [] + this[kConnected] = 1 + this[kOriginalDispatch] = this.dispatch + this[kOriginalClose] = this.close.bind(this) -module.exports = class DecoratorHandler { - constructor (handler) { - this.handler = handler + this.dispatch = buildMockDispatch.call(this) + this.close = this[kClose] } - onConnect (...args) { - return this.handler.onConnect(...args) + get [Symbols.kConnected] () { + return this[kConnected] } - onError (...args) { - return this.handler.onError(...args) + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept (opts) { + return new MockInterceptor(opts, this[kDispatches]) } - onUpgrade (...args) { - return this.handler.onUpgrade(...args) + async [kClose] () { + await promisify(this[kOriginalClose])() + this[kConnected] = 0 + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]) } +} - onHeaders (...args) { - return this.handler.onHeaders(...args) - } +module.exports = MockPool - onData (...args) { - return this.handler.onData(...args) - } - onComplete (...args) { - return this.handler.onComplete(...args) - } +/***/ }), - onBodySent (...args) { - return this.handler.onBodySent(...args) - } +/***/ 24347: +/***/ ((module) => { + +"use strict"; + + +module.exports = { + kAgent: Symbol('agent'), + kOptions: Symbol('options'), + kFactory: Symbol('factory'), + kDispatches: Symbol('dispatches'), + kDispatchKey: Symbol('dispatch key'), + kDefaultHeaders: Symbol('default headers'), + kDefaultTrailers: Symbol('default trailers'), + kContentLength: Symbol('content length'), + kMockAgent: Symbol('mock agent'), + kMockAgentSet: Symbol('mock agent set'), + kMockAgentGet: Symbol('mock agent get'), + kMockDispatch: Symbol('mock dispatch'), + kClose: Symbol('close'), + kOriginalClose: Symbol('original agent close'), + kOrigin: Symbol('origin'), + kIsMockActive: Symbol('is mock active'), + kNetConnect: Symbol('net connect'), + kGetNetConnect: Symbol('get net connect'), + kConnected: Symbol('connected') } /***/ }), -/***/ 72860: +/***/ 79323: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const util = __nccwpck_require__(83983) -const { kBodyUsed } = __nccwpck_require__(72785) -const assert = __nccwpck_require__(39491) -const { InvalidArgumentError } = __nccwpck_require__(48045) -const EE = __nccwpck_require__(82361) - -const redirectableStatusCodes = [300, 301, 302, 303, 307, 308] - -const kBody = Symbol('body') - -class BodyAsyncIterable { - constructor (body) { - this[kBody] = body - this[kBodyUsed] = false +const { MockNotMatchedError } = __nccwpck_require__(50888) +const { + kDispatches, + kMockAgent, + kOriginalDispatch, + kOrigin, + kGetNetConnect +} = __nccwpck_require__(24347) +const { buildURL, nop } = __nccwpck_require__(83983) +const { STATUS_CODES } = __nccwpck_require__(13685) +const { + types: { + isPromise } +} = __nccwpck_require__(73837) - async * [Symbol.asyncIterator] () { - assert(!this[kBodyUsed], 'disturbed') - this[kBodyUsed] = true - yield * this[kBody] +function matchValue (match, value) { + if (typeof match === 'string') { + return match === value + } + if (match instanceof RegExp) { + return match.test(value) + } + if (typeof match === 'function') { + return match(value) === true } + return false } -class RedirectHandler { - constructor (dispatch, maxRedirections, opts, handler) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError('maxRedirections must be a positive number') - } - - util.validateHandler(handler, opts.method, opts.upgrade) - - this.dispatch = dispatch - this.location = null - this.abort = null - this.opts = { ...opts, maxRedirections: 0 } // opts must be a copy - this.maxRedirections = maxRedirections - this.handler = handler - this.history = [] - - if (util.isStream(this.opts.body)) { - // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp - // so that it can be dispatched again? - // TODO (fix): Do we need 100-expect support to provide a way to do this properly? - if (util.bodyLength(this.opts.body) === 0) { - this.opts.body - .on('data', function () { - assert(false) - }) - } +function lowerCaseEntries (headers) { + return Object.fromEntries( + Object.entries(headers).map(([headerName, headerValue]) => { + return [headerName.toLocaleLowerCase(), headerValue] + }) + ) +} - if (typeof this.opts.body.readableDidRead !== 'boolean') { - this.opts.body[kBodyUsed] = false - EE.prototype.on.call(this.opts.body, 'data', function () { - this[kBodyUsed] = true - }) +/** + * @param {import('../../index').Headers|string[]|Record} headers + * @param {string} key + */ +function getHeaderByName (headers, key) { + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { + return headers[i + 1] } - } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') { - // TODO (fix): We can't access ReadableStream internal state - // to determine whether or not it has been disturbed. This is just - // a workaround. - this.opts.body = new BodyAsyncIterable(this.opts.body) - } else if ( - this.opts.body && - typeof this.opts.body !== 'string' && - !ArrayBuffer.isView(this.opts.body) && - util.isIterable(this.opts.body) - ) { - // TODO: Should we allow re-using iterable if !this.opts.idempotent - // or through some other flag? - this.opts.body = new BodyAsyncIterable(this.opts.body) } - } - - onConnect (abort) { - this.abort = abort - this.handler.onConnect(abort, { history: this.history }) - } - onUpgrade (statusCode, headers, socket) { - this.handler.onUpgrade(statusCode, headers, socket) + return undefined + } else if (typeof headers.get === 'function') { + return headers.get(key) + } else { + return lowerCaseEntries(headers)[key.toLocaleLowerCase()] } +} - onError (error) { - this.handler.onError(error) +/** @param {string[]} headers */ +function buildHeadersFromArray (headers) { // fetch HeadersList + const clone = headers.slice() + const entries = [] + for (let index = 0; index < clone.length; index += 2) { + entries.push([clone[index], clone[index + 1]]) } + return Object.fromEntries(entries) +} - onHeaders (statusCode, headers, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) - ? null - : parseLocation(statusCode, headers) - - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)) - } - - if (!this.location) { - return this.handler.onHeaders(statusCode, headers, resume, statusText) +function matchHeaders (mockDispatch, headers) { + if (typeof mockDispatch.headers === 'function') { + if (Array.isArray(headers)) { // fetch HeadersList + headers = buildHeadersFromArray(headers) } + return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {}) + } + if (typeof mockDispatch.headers === 'undefined') { + return true + } + if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') { + return false + } - const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))) - const path = search ? `${pathname}${search}` : pathname - - // Remove headers referring to the original URL. - // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers. - // https://tools.ietf.org/html/rfc7231#section-6.4 - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin) - this.opts.path = path - this.opts.origin = origin - this.opts.maxRedirections = 0 - this.opts.query = null + for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) { + const headerValue = getHeaderByName(headers, matchHeaderName) - // https://tools.ietf.org/html/rfc7231#section-6.4.4 - // In case of HTTP 303, always replace method to be either HEAD or GET - if (statusCode === 303 && this.opts.method !== 'HEAD') { - this.opts.method = 'GET' - this.opts.body = null + if (!matchValue(matchHeaderValue, headerValue)) { + return false } } + return true +} - onData (chunk) { - if (this.location) { - /* - https://tools.ietf.org/html/rfc7231#section-6.4 - - TLDR: undici always ignores 3xx response bodies. - - Redirection is used to serve the requested resource from another URL, so it is assumes that - no body is generated (and thus can be ignored). Even though generating a body is not prohibited. +function safeUrl (path) { + if (typeof path !== 'string') { + return path + } - For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually - (which means it's optional and not mandated) contain just an hyperlink to the value of - the Location response header, so the body can be ignored safely. + const pathSegments = path.split('?') - For status 300, which is "Multiple Choices", the spec mentions both generating a Location - response header AND a response body with the other possible location to follow. - Since the spec explicitily chooses not to specify a format for such body and leave it to - servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it. - */ - } else { - return this.handler.onData(chunk) - } + if (pathSegments.length !== 2) { + return path } - onComplete (trailers) { - if (this.location) { - /* - https://tools.ietf.org/html/rfc7231#section-6.4 + const qp = new URLSearchParams(pathSegments.pop()) + qp.sort() + return [...pathSegments, qp.toString()].join('?') +} - TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections - and neither are useful if present. +function matchKey (mockDispatch, { path, method, body, headers }) { + const pathMatch = matchValue(mockDispatch.path, path) + const methodMatch = matchValue(mockDispatch.method, method) + const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true + const headersMatch = matchHeaders(mockDispatch, headers) + return pathMatch && methodMatch && bodyMatch && headersMatch +} - See comment on onData method above for more detailed informations. - */ +function getResponseData (data) { + if (Buffer.isBuffer(data)) { + return data + } else if (typeof data === 'object') { + return JSON.stringify(data) + } else { + return data.toString() + } +} - this.location = null - this.abort = null +function getMockDispatch (mockDispatches, key) { + const basePath = key.query ? buildURL(key.path, key.query) : key.path + const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath - this.dispatch(this.opts, this) - } else { - this.handler.onComplete(trailers) - } + // Match path + let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)) + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`) } - onBodySent (chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk) - } + // Match method + matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)) + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`) } -} -function parseLocation (statusCode, headers) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null + // Match body + matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true) + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`) } - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].toString().toLowerCase() === 'location') { - return headers[i + 1] - } + // Match headers + matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers)) + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers}'`) } + + return matchedMockDispatches[0] } -// https://tools.ietf.org/html/rfc7231#section-6.4.4 -function shouldRemoveHeader (header, removeContent, unknownOrigin) { - return ( - (header.length === 4 && header.toString().toLowerCase() === 'host') || - (removeContent && header.toString().toLowerCase().indexOf('content-') === 0) || - (unknownOrigin && header.length === 13 && header.toString().toLowerCase() === 'authorization') || - (unknownOrigin && header.length === 6 && header.toString().toLowerCase() === 'cookie') - ) +function addMockDispatch (mockDispatches, key, data) { + const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false } + const replyData = typeof data === 'function' ? { callback: data } : { ...data } + const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } } + mockDispatches.push(newMockDispatch) + return newMockDispatch } -// https://tools.ietf.org/html/rfc7231#section-6.4 -function cleanRequestHeaders (headers, removeContent, unknownOrigin) { - const ret = [] - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { - ret.push(headers[i], headers[i + 1]) - } - } - } else if (headers && typeof headers === 'object') { - for (const key of Object.keys(headers)) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers[key]) - } +function deleteMockDispatch (mockDispatches, key) { + const index = mockDispatches.findIndex(dispatch => { + if (!dispatch.consumed) { + return false } - } else { - assert(headers == null, 'headers must be an object or an array') + return matchKey(dispatch, key) + }) + if (index !== -1) { + mockDispatches.splice(index, 1) } - return ret } -module.exports = RedirectHandler +function buildKey (opts) { + const { path, method, body, headers, query } = opts + return { + path, + method, + body, + headers, + query + } +} +function generateKeyValues (data) { + return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ + ...keyValuePairs, + Buffer.from(`${key}`), + Array.isArray(value) ? value.map(x => Buffer.from(`${x}`)) : Buffer.from(`${value}`) + ], []) +} -/***/ }), +/** + * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status + * @param {number} statusCode + */ +function getStatusText (statusCode) { + return STATUS_CODES[statusCode] || 'unknown' +} -/***/ 38861: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +async function getResponse (body) { + const buffers = [] + for await (const data of body) { + buffers.push(data) + } + return Buffer.concat(buffers).toString('utf8') +} -"use strict"; +/** + * Mock dispatch function used to simulate undici dispatches + */ +function mockDispatch (opts, handler) { + // Get mock dispatch from built key + const key = buildKey(opts) + const mockDispatch = getMockDispatch(this[kDispatches], key) + mockDispatch.timesInvoked++ -const RedirectHandler = __nccwpck_require__(72860) + // Here's where we resolve a callback if a callback is present for the dispatch data. + if (mockDispatch.data.callback) { + mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) } + } -function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return function Intercept (opts, handler) { - const { maxRedirections = defaultMaxRedirections } = opts + // Parse mockDispatch data + const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch + const { timesInvoked, times } = mockDispatch - if (!maxRedirections) { - return dispatch(opts, handler) - } + // If it's used up and not persistent, mark as consumed + mockDispatch.consumed = !persist && timesInvoked >= times + mockDispatch.pending = timesInvoked < times - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler) - opts = { ...opts, maxRedirections: 0 } // Stop sub dispatcher from also redirecting. - return dispatch(opts, redirectHandler) - } + // If specified, trigger dispatch error + if (error !== null) { + deleteMockDispatch(this[kDispatches], key) + handler.onError(error) + return true } -} -module.exports = createRedirectInterceptor + // Handle the request with a delay if necessary + if (typeof delay === 'number' && delay > 0) { + setTimeout(() => { + handleReply(this[kDispatches]) + }, delay) + } else { + handleReply(this[kDispatches]) + } + function handleReply (mockDispatches, _data = data) { + // fetch's HeadersList is a 1D string array + const optsHeaders = Array.isArray(opts.headers) + ? buildHeadersFromArray(opts.headers) + : opts.headers + const body = typeof _data === 'function' + ? _data({ ...opts, headers: optsHeaders }) + : _data -/***/ }), + // util.types.isPromise is likely needed for jest. + if (isPromise(body)) { + // If handleReply is asynchronous, throwing an error + // in the callback will reject the promise, rather than + // synchronously throw the error, which breaks some tests. + // Rather, we wait for the callback to resolve if it is a + // promise, and then re-run handleReply with the new body. + body.then((newData) => handleReply(mockDispatches, newData)) + return + } -/***/ 30953: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + const responseData = getResponseData(body) + const responseHeaders = generateKeyValues(headers) + const responseTrailers = generateKeyValues(trailers) -"use strict"; + handler.abort = nop + handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)) + handler.onData(Buffer.from(responseData)) + handler.onComplete(responseTrailers) + deleteMockDispatch(mockDispatches, key) + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; -const utils_1 = __nccwpck_require__(41891); -// C headers -var ERROR; -(function (ERROR) { - ERROR[ERROR["OK"] = 0] = "OK"; - ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; - ERROR[ERROR["STRICT"] = 2] = "STRICT"; - ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; - ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR[ERROR["USER"] = 24] = "USER"; -})(ERROR = exports.ERROR || (exports.ERROR = {})); -var TYPE; -(function (TYPE) { - TYPE[TYPE["BOTH"] = 0] = "BOTH"; - TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; - TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; -})(TYPE = exports.TYPE || (exports.TYPE = {})); -var FLAGS; -(function (FLAGS) { - FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; - FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; - FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; - // 1 << 8 is unused - FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; -})(FLAGS = exports.FLAGS || (exports.FLAGS = {})); -var LENIENT_FLAGS; -(function (LENIENT_FLAGS) { - LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; -})(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {})); -var METHODS; -(function (METHODS) { - METHODS[METHODS["DELETE"] = 0] = "DELETE"; - METHODS[METHODS["GET"] = 1] = "GET"; - METHODS[METHODS["HEAD"] = 2] = "HEAD"; - METHODS[METHODS["POST"] = 3] = "POST"; - METHODS[METHODS["PUT"] = 4] = "PUT"; - /* pathological */ - METHODS[METHODS["CONNECT"] = 5] = "CONNECT"; - METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS"; - METHODS[METHODS["TRACE"] = 7] = "TRACE"; - /* WebDAV */ - METHODS[METHODS["COPY"] = 8] = "COPY"; - METHODS[METHODS["LOCK"] = 9] = "LOCK"; - METHODS[METHODS["MKCOL"] = 10] = "MKCOL"; - METHODS[METHODS["MOVE"] = 11] = "MOVE"; - METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND"; - METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS[METHODS["SEARCH"] = 14] = "SEARCH"; - METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK"; - METHODS[METHODS["BIND"] = 16] = "BIND"; - METHODS[METHODS["REBIND"] = 17] = "REBIND"; - METHODS[METHODS["UNBIND"] = 18] = "UNBIND"; - METHODS[METHODS["ACL"] = 19] = "ACL"; - /* subversion */ - METHODS[METHODS["REPORT"] = 20] = "REPORT"; - METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS[METHODS["MERGE"] = 23] = "MERGE"; - /* upnp */ - METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY"; - METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; - /* RFC-5789 */ - METHODS[METHODS["PATCH"] = 28] = "PATCH"; - METHODS[METHODS["PURGE"] = 29] = "PURGE"; - /* CalDAV */ - METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR"; - /* RFC-2068, section 19.6.1.2 */ - METHODS[METHODS["LINK"] = 31] = "LINK"; - METHODS[METHODS["UNLINK"] = 32] = "UNLINK"; - /* icecast */ - METHODS[METHODS["SOURCE"] = 33] = "SOURCE"; - /* RFC-7540, section 11.6 */ - METHODS[METHODS["PRI"] = 34] = "PRI"; - /* RFC-2326 RTSP */ - METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS[METHODS["SETUP"] = 37] = "SETUP"; - METHODS[METHODS["PLAY"] = 38] = "PLAY"; - METHODS[METHODS["PAUSE"] = 39] = "PAUSE"; - METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT"; - METHODS[METHODS["RECORD"] = 44] = "RECORD"; - /* RAOP */ - METHODS[METHODS["FLUSH"] = 45] = "FLUSH"; -})(METHODS = exports.METHODS || (exports.METHODS = {})); -exports.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS['M-SEARCH'], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, - // TODO(indutny): should we allow it with HTTP? - METHODS.SOURCE, -]; -exports.METHODS_ICE = [ - METHODS.SOURCE, -]; -exports.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, - // For AirPlay - METHODS.GET, - METHODS.POST, -]; -exports.METHOD_MAP = utils_1.enumToMap(METHODS); -exports.H_METHOD_MAP = {}; -Object.keys(exports.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key]; - } -}); -var FINISH; -(function (FINISH) { - FINISH[FINISH["SAFE"] = 0] = "SAFE"; - FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; -})(FINISH = exports.FINISH || (exports.FINISH = {})); -exports.ALPHA = []; -for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { - // Upper case - exports.ALPHA.push(String.fromCharCode(i)); - // Lower case - exports.ALPHA.push(String.fromCharCode(i + 0x20)); -} -exports.NUM_MAP = { - 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, - 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, -}; -exports.HEX_MAP = { - 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, - 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, - A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, - a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, -}; -exports.NUM = [ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', -]; -exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); -exports.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')']; -exports.USERINFO_CHARS = exports.ALPHANUM - .concat(exports.MARK) - .concat(['%', ';', ':', '&', '=', '+', '$', ',']); -// TODO(indutny): use RFC -exports.STRICT_URL_CHAR = [ - '!', '"', '$', '%', '&', '\'', - '(', ')', '*', '+', ',', '-', '.', '/', - ':', ';', '<', '=', '>', - '@', '[', '\\', ']', '^', '_', - '`', - '{', '|', '}', '~', -].concat(exports.ALPHANUM); -exports.URL_CHAR = exports.STRICT_URL_CHAR - .concat(['\t', '\f']); -// All characters with 0x80 bit set to 1 -for (let i = 0x80; i <= 0xff; i++) { - exports.URL_CHAR.push(i); + function resume () {} + + return true } -exports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']); -/* Tokens as defined by rfc 2616. Also lowercases them. - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - */ -exports.STRICT_TOKEN = [ - '!', '#', '$', '%', '&', '\'', - '*', '+', '-', '.', - '^', '_', '`', - '|', '~', -].concat(exports.ALPHANUM); -exports.TOKEN = exports.STRICT_TOKEN.concat([' ']); -/* - * Verify that a char is a valid visible (printable) US-ASCII - * character or %x80-FF - */ -exports.HEADER_CHARS = ['\t']; -for (let i = 32; i <= 255; i++) { - if (i !== 127) { - exports.HEADER_CHARS.push(i); + +function buildMockDispatch () { + const agent = this[kMockAgent] + const origin = this[kOrigin] + const originalDispatch = this[kOriginalDispatch] + + return function dispatch (opts, handler) { + if (agent.isMockActive) { + try { + mockDispatch.call(this, opts, handler) + } catch (error) { + if (error instanceof MockNotMatchedError) { + const netConnect = agent[kGetNetConnect]() + if (netConnect === false) { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`) + } + if (checkNetConnect(netConnect, origin)) { + originalDispatch.call(this, opts, handler) + } else { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`) + } + } else { + throw error + } + } + } else { + originalDispatch.call(this, opts, handler) } + } } -// ',' = \x44 -exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44); -exports.MAJOR = exports.NUM_MAP; -exports.MINOR = exports.MAJOR; -var HEADER_STATE; -(function (HEADER_STATE) { - HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; -})(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {})); -exports.SPECIAL_HEADERS = { - 'connection': HEADER_STATE.CONNECTION, - 'content-length': HEADER_STATE.CONTENT_LENGTH, - 'proxy-connection': HEADER_STATE.CONNECTION, - 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, - 'upgrade': HEADER_STATE.UPGRADE, -}; -//# sourceMappingURL=constants.js.map -/***/ }), +function checkNetConnect (netConnect, origin) { + const url = new URL(origin) + if (netConnect === true) { + return true + } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { + return true + } + return false +} -/***/ 61145: -/***/ ((module) => { +function buildMockOptions (opts) { + if (opts) { + const { agent, ...mockOptions } = opts + return mockOptions + } +} -module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCsLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC1kAIABBGGpCADcDACAAQgA3AwAgAEE4akIANwMAIABBMGpCADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwHLAcoBuAHJAbkByAG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAQDcAQtBACEQDMYBC0EOIRAMxQELQQ0hEAzEAQtBDyEQDMMBC0EQIRAMwgELQRMhEAzBAQtBFCEQDMABC0EVIRAMvwELQRYhEAy+AQtBFyEQDL0BC0EYIRAMvAELQRkhEAy7AQtBGiEQDLoBC0EbIRAMuQELQRwhEAy4AQtBCCEQDLcBC0EdIRAMtgELQSAhEAy1AQtBHyEQDLQBC0EHIRAMswELQSEhEAyyAQtBIiEQDLEBC0EeIRAMsAELQSMhEAyvAQtBEiEQDK4BC0ERIRAMrQELQSQhEAysAQtBJSEQDKsBC0EmIRAMqgELQSchEAypAQtBwwEhEAyoAQtBKSEQDKcBC0ErIRAMpgELQSwhEAylAQtBLSEQDKQBC0EuIRAMowELQS8hEAyiAQtBxAEhEAyhAQtBMCEQDKABC0E0IRAMnwELQQwhEAyeAQtBMSEQDJ0BC0EyIRAMnAELQTMhEAybAQtBOSEQDJoBC0E1IRAMmQELQcUBIRAMmAELQQshEAyXAQtBOiEQDJYBC0E2IRAMlQELQQohEAyUAQtBNyEQDJMBC0E4IRAMkgELQTwhEAyRAQtBOyEQDJABC0E9IRAMjwELQQkhEAyOAQtBKCEQDI0BC0E+IRAMjAELQT8hEAyLAQtBwAAhEAyKAQtBwQAhEAyJAQtBwgAhEAyIAQtBwwAhEAyHAQtBxAAhEAyGAQtBxQAhEAyFAQtBxgAhEAyEAQtBKiEQDIMBC0HHACEQDIIBC0HIACEQDIEBC0HJACEQDIABC0HKACEQDH8LQcsAIRAMfgtBzQAhEAx9C0HMACEQDHwLQc4AIRAMewtBzwAhEAx6C0HQACEQDHkLQdEAIRAMeAtB0gAhEAx3C0HTACEQDHYLQdQAIRAMdQtB1gAhEAx0C0HVACEQDHMLQQYhEAxyC0HXACEQDHELQQUhEAxwC0HYACEQDG8LQQQhEAxuC0HZACEQDG0LQdoAIRAMbAtB2wAhEAxrC0HcACEQDGoLQQMhEAxpC0HdACEQDGgLQd4AIRAMZwtB3wAhEAxmC0HhACEQDGULQeAAIRAMZAtB4gAhEAxjC0HjACEQDGILQQIhEAxhC0HkACEQDGALQeUAIRAMXwtB5gAhEAxeC0HnACEQDF0LQegAIRAMXAtB6QAhEAxbC0HqACEQDFoLQesAIRAMWQtB7AAhEAxYC0HtACEQDFcLQe4AIRAMVgtB7wAhEAxVC0HwACEQDFQLQfEAIRAMUwtB8gAhEAxSC0HzACEQDFELQfQAIRAMUAtB9QAhEAxPC0H2ACEQDE4LQfcAIRAMTQtB+AAhEAxMC0H5ACEQDEsLQfoAIRAMSgtB+wAhEAxJC0H8ACEQDEgLQf0AIRAMRwtB/gAhEAxGC0H/ACEQDEULQYABIRAMRAtBgQEhEAxDC0GCASEQDEILQYMBIRAMQQtBhAEhEAxAC0GFASEQDD8LQYYBIRAMPgtBhwEhEAw9C0GIASEQDDwLQYkBIRAMOwtBigEhEAw6C0GLASEQDDkLQYwBIRAMOAtBjQEhEAw3C0GOASEQDDYLQY8BIRAMNQtBkAEhEAw0C0GRASEQDDMLQZIBIRAMMgtBkwEhEAwxC0GUASEQDDALQZUBIRAMLwtBlgEhEAwuC0GXASEQDC0LQZgBIRAMLAtBmQEhEAwrC0GaASEQDCoLQZsBIRAMKQtBnAEhEAwoC0GdASEQDCcLQZ4BIRAMJgtBnwEhEAwlC0GgASEQDCQLQaEBIRAMIwtBogEhEAwiC0GjASEQDCELQaQBIRAMIAtBpQEhEAwfC0GmASEQDB4LQacBIRAMHQtBqAEhEAwcC0GpASEQDBsLQaoBIRAMGgtBqwEhEAwZC0GsASEQDBgLQa0BIRAMFwtBrgEhEAwWC0EBIRAMFQtBrwEhEAwUC0GwASEQDBMLQbEBIRAMEgtBswEhEAwRC0GyASEQDBALQbQBIRAMDwtBtQEhEAwOC0G2ASEQDA0LQbcBIRAMDAtBuAEhEAwLC0G5ASEQDAoLQboBIRAMCQtBuwEhEAwIC0HGASEQDAcLQbwBIRAMBgtBvQEhEAwFC0G+ASEQDAQLQb8BIRAMAwtBwAEhEAwCC0HCASEQDAELQcEBIRALA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQDscBAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxweHyAhIyUoP0BBREVGR0hJSktMTU9QUVJT3gNXWVtcXWBiZWZnaGlqa2xtb3BxcnN0dXZ3eHl6e3x9foABggGFAYYBhwGJAYsBjAGNAY4BjwGQAZEBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAZkCpAKwAv4C/gILIAEiBCACRw3zAUHdASEQDP8DCyABIhAgAkcN3QFBwwEhEAz+AwsgASIBIAJHDZABQfcAIRAM/QMLIAEiASACRw2GAUHvACEQDPwDCyABIgEgAkcNf0HqACEQDPsDCyABIgEgAkcNe0HoACEQDPoDCyABIgEgAkcNeEHmACEQDPkDCyABIgEgAkcNGkEYIRAM+AMLIAEiASACRw0UQRIhEAz3AwsgASIBIAJHDVlBxQAhEAz2AwsgASIBIAJHDUpBPyEQDPUDCyABIgEgAkcNSEE8IRAM9AMLIAEiASACRw1BQTEhEAzzAwsgAC0ALkEBRg3rAwyHAgsgACABIgEgAhDAgICAAEEBRw3mASAAQgA3AyAM5wELIAAgASIBIAIQtICAgAAiEA3nASABIQEM9QILAkAgASIBIAJHDQBBBiEQDPADCyAAIAFBAWoiASACELuAgIAAIhAN6AEgASEBDDELIABCADcDIEESIRAM1QMLIAEiECACRw0rQR0hEAztAwsCQCABIgEgAkYNACABQQFqIQFBECEQDNQDC0EHIRAM7AMLIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN5QFBCCEQDOsDCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEUIRAM0gMLQQkhEAzqAwsgASEBIAApAyBQDeQBIAEhAQzyAgsCQCABIgEgAkcNAEELIRAM6QMLIAAgAUEBaiIBIAIQtoCAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3mASABIQEMDQsgACABIgEgAhC6gICAACIQDecBIAEhAQzwAgsCQCABIgEgAkcNAEEPIRAM5QMLIAEtAAAiEEE7Rg0IIBBBDUcN6AEgAUEBaiEBDO8CCyAAIAEiASACELqAgIAAIhAN6AEgASEBDPICCwNAAkAgAS0AAEHwtYCAAGotAAAiEEEBRg0AIBBBAkcN6wEgACgCBCEQIABBADYCBCAAIBAgAUEBaiIBELmAgIAAIhAN6gEgASEBDPQCCyABQQFqIgEgAkcNAAtBEiEQDOIDCyAAIAEiASACELqAgIAAIhAN6QEgASEBDAoLIAEiASACRw0GQRshEAzgAwsCQCABIgEgAkcNAEEWIRAM4AMLIABBioCAgAA2AgggACABNgIEIAAgASACELiAgIAAIhAN6gEgASEBQSAhEAzGAwsCQCABIgEgAkYNAANAAkAgAS0AAEHwt4CAAGotAAAiEEECRg0AAkAgEEF/ag4E5QHsAQDrAewBCyABQQFqIQFBCCEQDMgDCyABQQFqIgEgAkcNAAtBFSEQDN8DC0EVIRAM3gMLA0ACQCABLQAAQfC5gIAAai0AACIQQQJGDQAgEEF/ag4E3gHsAeAB6wHsAQsgAUEBaiIBIAJHDQALQRghEAzdAwsCQCABIgEgAkYNACAAQYuAgIAANgIIIAAgATYCBCABIQFBByEQDMQDC0EZIRAM3AMLIAFBAWohAQwCCwJAIAEiFCACRw0AQRohEAzbAwsgFCEBAkAgFC0AAEFzag4U3QLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gIA7gILQQAhECAAQQA2AhwgAEGvi4CAADYCECAAQQI2AgwgACAUQQFqNgIUDNoDCwJAIAEtAAAiEEE7Rg0AIBBBDUcN6AEgAUEBaiEBDOUCCyABQQFqIQELQSIhEAy/AwsCQCABIhAgAkcNAEEcIRAM2AMLQgAhESAQIQEgEC0AAEFQag435wHmAQECAwQFBgcIAAAAAAAAAAkKCwwNDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAREhMUAAtBHiEQDL0DC0ICIREM5QELQgMhEQzkAQtCBCERDOMBC0IFIREM4gELQgYhEQzhAQtCByERDOABC0IIIREM3wELQgkhEQzeAQtCCiERDN0BC0ILIREM3AELQgwhEQzbAQtCDSERDNoBC0IOIREM2QELQg8hEQzYAQtCCiERDNcBC0ILIREM1gELQgwhEQzVAQtCDSERDNQBC0IOIREM0wELQg8hEQzSAQtCACERAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQLQAAQVBqDjflAeQBAAECAwQFBgfmAeYB5gHmAeYB5gHmAQgJCgsMDeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gEODxAREhPmAQtCAiERDOQBC0IDIREM4wELQgQhEQziAQtCBSERDOEBC0IGIREM4AELQgchEQzfAQtCCCERDN4BC0IJIREM3QELQgohEQzcAQtCCyERDNsBC0IMIREM2gELQg0hEQzZAQtCDiERDNgBC0IPIREM1wELQgohEQzWAQtCCyERDNUBC0IMIREM1AELQg0hEQzTAQtCDiERDNIBC0IPIREM0QELIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN0gFBHyEQDMADCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEkIRAMpwMLQSAhEAy/AwsgACABIhAgAhC+gICAAEF/ag4FtgEAxQIB0QHSAQtBESEQDKQDCyAAQQE6AC8gECEBDLsDCyABIgEgAkcN0gFBJCEQDLsDCyABIg0gAkcNHkHGACEQDLoDCyAAIAEiASACELKAgIAAIhAN1AEgASEBDLUBCyABIhAgAkcNJkHQACEQDLgDCwJAIAEiASACRw0AQSghEAy4AwsgAEEANgIEIABBjICAgAA2AgggACABIAEQsYCAgAAiEA3TASABIQEM2AELAkAgASIQIAJHDQBBKSEQDLcDCyAQLQAAIgFBIEYNFCABQQlHDdMBIBBBAWohAQwVCwJAIAEiASACRg0AIAFBAWohAQwXC0EqIRAMtQMLAkAgASIQIAJHDQBBKyEQDLUDCwJAIBAtAAAiAUEJRg0AIAFBIEcN1QELIAAtACxBCEYN0wEgECEBDJEDCwJAIAEiASACRw0AQSwhEAy0AwsgAS0AAEEKRw3VASABQQFqIQEMyQILIAEiDiACRw3VAUEvIRAMsgMLA0ACQCABLQAAIhBBIEYNAAJAIBBBdmoOBADcAdwBANoBCyABIQEM4AELIAFBAWoiASACRw0AC0ExIRAMsQMLQTIhECABIhQgAkYNsAMgAiAUayAAKAIAIgFqIRUgFCABa0EDaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfC7gIAAai0AAEcNAQJAIAFBA0cNAEEGIQEMlgMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLEDCyAAQQA2AgAgFCEBDNkBC0EzIRAgASIUIAJGDa8DIAIgFGsgACgCACIBaiEVIBQgAWtBCGohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUH0u4CAAGotAABHDQECQCABQQhHDQBBBSEBDJUDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAywAwsgAEEANgIAIBQhAQzYAQtBNCEQIAEiFCACRg2uAyACIBRrIAAoAgAiAWohFSAUIAFrQQVqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw0BAkAgAUEFRw0AQQchAQyUAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMrwMLIABBADYCACAUIQEM1wELAkAgASIBIAJGDQADQAJAIAEtAABBgL6AgABqLQAAIhBBAUYNACAQQQJGDQogASEBDN0BCyABQQFqIgEgAkcNAAtBMCEQDK4DC0EwIRAMrQMLAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AIBBBdmoOBNkB2gHaAdkB2gELIAFBAWoiASACRw0AC0E4IRAMrQMLQTghEAysAwsDQAJAIAEtAAAiEEEgRg0AIBBBCUcNAwsgAUEBaiIBIAJHDQALQTwhEAyrAwsDQAJAIAEtAAAiEEEgRg0AAkACQCAQQXZqDgTaAQEB2gEACyAQQSxGDdsBCyABIQEMBAsgAUEBaiIBIAJHDQALQT8hEAyqAwsgASEBDNsBC0HAACEQIAEiFCACRg2oAyACIBRrIAAoAgAiAWohFiAUIAFrQQZqIRcCQANAIBQtAABBIHIgAUGAwICAAGotAABHDQEgAUEGRg2OAyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAypAwsgAEEANgIAIBQhAQtBNiEQDI4DCwJAIAEiDyACRw0AQcEAIRAMpwMLIABBjICAgAA2AgggACAPNgIEIA8hASAALQAsQX9qDgTNAdUB1wHZAYcDCyABQQFqIQEMzAELAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgciAQIBBBv39qQf8BcUEaSRtB/wFxIhBBCUYNACAQQSBGDQACQAJAAkACQCAQQZ1/ag4TAAMDAwMDAwMBAwMDAwMDAwMDAgMLIAFBAWohAUExIRAMkQMLIAFBAWohAUEyIRAMkAMLIAFBAWohAUEzIRAMjwMLIAEhAQzQAQsgAUEBaiIBIAJHDQALQTUhEAylAwtBNSEQDKQDCwJAIAEiASACRg0AA0ACQCABLQAAQYC8gIAAai0AAEEBRg0AIAEhAQzTAQsgAUEBaiIBIAJHDQALQT0hEAykAwtBPSEQDKMDCyAAIAEiASACELCAgIAAIhAN1gEgASEBDAELIBBBAWohAQtBPCEQDIcDCwJAIAEiASACRw0AQcIAIRAMoAMLAkADQAJAIAEtAABBd2oOGAAC/gL+AoQD/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4CAP4CCyABQQFqIgEgAkcNAAtBwgAhEAygAwsgAUEBaiEBIAAtAC1BAXFFDb0BIAEhAQtBLCEQDIUDCyABIgEgAkcN0wFBxAAhEAydAwsDQAJAIAEtAABBkMCAgABqLQAAQQFGDQAgASEBDLcCCyABQQFqIgEgAkcNAAtBxQAhEAycAwsgDS0AACIQQSBGDbMBIBBBOkcNgQMgACgCBCEBIABBADYCBCAAIAEgDRCvgICAACIBDdABIA1BAWohAQyzAgtBxwAhECABIg0gAkYNmgMgAiANayAAKAIAIgFqIRYgDSABa0EFaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGQwoCAAGotAABHDYADIAFBBUYN9AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmgMLQcgAIRAgASINIAJGDZkDIAIgDWsgACgCACIBaiEWIA0gAWtBCWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBlsKAgABqLQAARw3/AgJAIAFBCUcNAEECIQEM9QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJkDCwJAIAEiDSACRw0AQckAIRAMmQMLAkACQCANLQAAIgFBIHIgASABQb9/akH/AXFBGkkbQf8BcUGSf2oOBwCAA4ADgAOAA4ADAYADCyANQQFqIQFBPiEQDIADCyANQQFqIQFBPyEQDP8CC0HKACEQIAEiDSACRg2XAyACIA1rIAAoAgAiAWohFiANIAFrQQFqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaDCgIAAai0AAEcN/QIgAUEBRg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyXAwtBywAhECABIg0gAkYNlgMgAiANayAAKAIAIgFqIRYgDSABa0EOaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGiwoCAAGotAABHDfwCIAFBDkYN8AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlgMLQcwAIRAgASINIAJGDZUDIAIgDWsgACgCACIBaiEWIA0gAWtBD2ohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBwMKAgABqLQAARw37AgJAIAFBD0cNAEEDIQEM8QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJUDC0HNACEQIAEiDSACRg2UAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQdDCgIAAai0AAEcN+gICQCABQQVHDQBBBCEBDPACCyABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyUAwsCQCABIg0gAkcNAEHOACEQDJQDCwJAAkACQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZ1/ag4TAP0C/QL9Av0C/QL9Av0C/QL9Av0C/QL9AgH9Av0C/QICA/0CCyANQQFqIQFBwQAhEAz9AgsgDUEBaiEBQcIAIRAM/AILIA1BAWohAUHDACEQDPsCCyANQQFqIQFBxAAhEAz6AgsCQCABIgEgAkYNACAAQY2AgIAANgIIIAAgATYCBCABIQFBxQAhEAz6AgtBzwAhEAySAwsgECEBAkACQCAQLQAAQXZqDgQBqAKoAgCoAgsgEEEBaiEBC0EnIRAM+AILAkAgASIBIAJHDQBB0QAhEAyRAwsCQCABLQAAQSBGDQAgASEBDI0BCyABQQFqIQEgAC0ALUEBcUUNxwEgASEBDIwBCyABIhcgAkcNyAFB0gAhEAyPAwtB0wAhECABIhQgAkYNjgMgAiAUayAAKAIAIgFqIRYgFCABa0EBaiEXA0AgFC0AACABQdbCgIAAai0AAEcNzAEgAUEBRg3HASABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAyOAwsCQCABIgEgAkcNAEHVACEQDI4DCyABLQAAQQpHDcwBIAFBAWohAQzHAQsCQCABIgEgAkcNAEHWACEQDI0DCwJAAkAgAS0AAEF2ag4EAM0BzQEBzQELIAFBAWohAQzHAQsgAUEBaiEBQcoAIRAM8wILIAAgASIBIAIQroCAgAAiEA3LASABIQFBzQAhEAzyAgsgAC0AKUEiRg2FAwymAgsCQCABIgEgAkcNAEHbACEQDIoDC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgAS0AAEFQag4K1AHTAQABAgMEBQYI1QELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMzAELQQkhEEEBIRRBACEXQQAhFgzLAQsCQCABIgEgAkcNAEHdACEQDIkDCyABLQAAQS5HDcwBIAFBAWohAQymAgsgASIBIAJHDcwBQd8AIRAMhwMLAkAgASIBIAJGDQAgAEGOgICAADYCCCAAIAE2AgQgASEBQdAAIRAM7gILQeAAIRAMhgMLQeEAIRAgASIBIAJGDYUDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHiwoCAAGotAABHDc0BIBRBA0YNzAEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhQMLQeIAIRAgASIBIAJGDYQDIAIgAWsgACgCACIUaiEWIAEgFGtBAmohFwNAIAEtAAAgFEHmwoCAAGotAABHDcwBIBRBAkYNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhAMLQeMAIRAgASIBIAJGDYMDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHpwoCAAGotAABHDcsBIBRBA0YNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMgwMLAkAgASIBIAJHDQBB5QAhEAyDAwsgACABQQFqIgEgAhCogICAACIQDc0BIAEhAUHWACEQDOkCCwJAIAEiASACRg0AA0ACQCABLQAAIhBBIEYNAAJAAkACQCAQQbh/ag4LAAHPAc8BzwHPAc8BzwHPAc8BAs8BCyABQQFqIQFB0gAhEAztAgsgAUEBaiEBQdMAIRAM7AILIAFBAWohAUHUACEQDOsCCyABQQFqIgEgAkcNAAtB5AAhEAyCAwtB5AAhEAyBAwsDQAJAIAEtAABB8MKAgABqLQAAIhBBAUYNACAQQX5qDgPPAdAB0QHSAQsgAUEBaiIBIAJHDQALQeYAIRAMgAMLAkAgASIBIAJGDQAgAUEBaiEBDAMLQecAIRAM/wILA0ACQCABLQAAQfDEgIAAai0AACIQQQFGDQACQCAQQX5qDgTSAdMB1AEA1QELIAEhAUHXACEQDOcCCyABQQFqIgEgAkcNAAtB6AAhEAz+AgsCQCABIgEgAkcNAEHpACEQDP4CCwJAIAEtAAAiEEF2ag4augHVAdUBvAHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHKAdUB1QEA0wELIAFBAWohAQtBBiEQDOMCCwNAAkAgAS0AAEHwxoCAAGotAABBAUYNACABIQEMngILIAFBAWoiASACRw0AC0HqACEQDPsCCwJAIAEiASACRg0AIAFBAWohAQwDC0HrACEQDPoCCwJAIAEiASACRw0AQewAIRAM+gILIAFBAWohAQwBCwJAIAEiASACRw0AQe0AIRAM+QILIAFBAWohAQtBBCEQDN4CCwJAIAEiFCACRw0AQe4AIRAM9wILIBQhAQJAAkACQCAULQAAQfDIgIAAai0AAEF/ag4H1AHVAdYBAJwCAQLXAQsgFEEBaiEBDAoLIBRBAWohAQzNAQtBACEQIABBADYCHCAAQZuSgIAANgIQIABBBzYCDCAAIBRBAWo2AhQM9gILAkADQAJAIAEtAABB8MiAgABqLQAAIhBBBEYNAAJAAkAgEEF/ag4H0gHTAdQB2QEABAHZAQsgASEBQdoAIRAM4AILIAFBAWohAUHcACEQDN8CCyABQQFqIgEgAkcNAAtB7wAhEAz2AgsgAUEBaiEBDMsBCwJAIAEiFCACRw0AQfAAIRAM9QILIBQtAABBL0cN1AEgFEEBaiEBDAYLAkAgASIUIAJHDQBB8QAhEAz0AgsCQCAULQAAIgFBL0cNACAUQQFqIQFB3QAhEAzbAgsgAUF2aiIEQRZLDdMBQQEgBHRBiYCAAnFFDdMBDMoCCwJAIAEiASACRg0AIAFBAWohAUHeACEQDNoCC0HyACEQDPICCwJAIAEiFCACRw0AQfQAIRAM8gILIBQhAQJAIBQtAABB8MyAgABqLQAAQX9qDgPJApQCANQBC0HhACEQDNgCCwJAIAEiFCACRg0AA0ACQCAULQAAQfDKgIAAai0AACIBQQNGDQACQCABQX9qDgLLAgDVAQsgFCEBQd8AIRAM2gILIBRBAWoiFCACRw0AC0HzACEQDPECC0HzACEQDPACCwJAIAEiASACRg0AIABBj4CAgAA2AgggACABNgIEIAEhAUHgACEQDNcCC0H1ACEQDO8CCwJAIAEiASACRw0AQfYAIRAM7wILIABBj4CAgAA2AgggACABNgIEIAEhAQtBAyEQDNQCCwNAIAEtAABBIEcNwwIgAUEBaiIBIAJHDQALQfcAIRAM7AILAkAgASIBIAJHDQBB+AAhEAzsAgsgAS0AAEEgRw3OASABQQFqIQEM7wELIAAgASIBIAIQrICAgAAiEA3OASABIQEMjgILAkAgASIEIAJHDQBB+gAhEAzqAgsgBC0AAEHMAEcN0QEgBEEBaiEBQRMhEAzPAQsCQCABIgQgAkcNAEH7ACEQDOkCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRADQCAELQAAIAFB8M6AgABqLQAARw3QASABQQVGDc4BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQfsAIRAM6AILAkAgASIEIAJHDQBB/AAhEAzoAgsCQAJAIAQtAABBvX9qDgwA0QHRAdEB0QHRAdEB0QHRAdEB0QEB0QELIARBAWohAUHmACEQDM8CCyAEQQFqIQFB5wAhEAzOAgsCQCABIgQgAkcNAEH9ACEQDOcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDc8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH9ACEQDOcCCyAAQQA2AgAgEEEBaiEBQRAhEAzMAQsCQCABIgQgAkcNAEH+ACEQDOYCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUH2zoCAAGotAABHDc4BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH+ACEQDOYCCyAAQQA2AgAgEEEBaiEBQRYhEAzLAQsCQCABIgQgAkcNAEH/ACEQDOUCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUH8zoCAAGotAABHDc0BIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH/ACEQDOUCCyAAQQA2AgAgEEEBaiEBQQUhEAzKAQsCQCABIgQgAkcNAEGAASEQDOQCCyAELQAAQdkARw3LASAEQQFqIQFBCCEQDMkBCwJAIAEiBCACRw0AQYEBIRAM4wILAkACQCAELQAAQbJ/ag4DAMwBAcwBCyAEQQFqIQFB6wAhEAzKAgsgBEEBaiEBQewAIRAMyQILAkAgASIEIAJHDQBBggEhEAziAgsCQAJAIAQtAABBuH9qDggAywHLAcsBywHLAcsBAcsBCyAEQQFqIQFB6gAhEAzJAgsgBEEBaiEBQe0AIRAMyAILAkAgASIEIAJHDQBBgwEhEAzhAgsgAiAEayAAKAIAIgFqIRAgBCABa0ECaiEUAkADQCAELQAAIAFBgM+AgABqLQAARw3JASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBA2AgBBgwEhEAzhAgtBACEQIABBADYCACAUQQFqIQEMxgELAkAgASIEIAJHDQBBhAEhEAzgAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBg8+AgABqLQAARw3IASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhAEhEAzgAgsgAEEANgIAIBBBAWohAUEjIRAMxQELAkAgASIEIAJHDQBBhQEhEAzfAgsCQAJAIAQtAABBtH9qDggAyAHIAcgByAHIAcgBAcgBCyAEQQFqIQFB7wAhEAzGAgsgBEEBaiEBQfAAIRAMxQILAkAgASIEIAJHDQBBhgEhEAzeAgsgBC0AAEHFAEcNxQEgBEEBaiEBDIMCCwJAIAEiBCACRw0AQYcBIRAM3QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQYjPgIAAai0AAEcNxQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYcBIRAM3QILIABBADYCACAQQQFqIQFBLSEQDMIBCwJAIAEiBCACRw0AQYgBIRAM3AILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNxAEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYgBIRAM3AILIABBADYCACAQQQFqIQFBKSEQDMEBCwJAIAEiASACRw0AQYkBIRAM2wILQQEhECABLQAAQd8ARw3AASABQQFqIQEMgQILAkAgASIEIAJHDQBBigEhEAzaAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQA0AgBC0AACABQYzPgIAAai0AAEcNwQEgAUEBRg2vAiABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGKASEQDNkCCwJAIAEiBCACRw0AQYsBIRAM2QILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQY7PgIAAai0AAEcNwQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYsBIRAM2QILIABBADYCACAQQQFqIQFBAiEQDL4BCwJAIAEiBCACRw0AQYwBIRAM2AILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNwAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYwBIRAM2AILIABBADYCACAQQQFqIQFBHyEQDL0BCwJAIAEiBCACRw0AQY0BIRAM1wILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNvwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY0BIRAM1wILIABBADYCACAQQQFqIQFBCSEQDLwBCwJAIAEiBCACRw0AQY4BIRAM1gILAkACQCAELQAAQbd/ag4HAL8BvwG/Ab8BvwEBvwELIARBAWohAUH4ACEQDL0CCyAEQQFqIQFB+QAhEAy8AgsCQCABIgQgAkcNAEGPASEQDNUCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGRz4CAAGotAABHDb0BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGPASEQDNUCCyAAQQA2AgAgEEEBaiEBQRghEAy6AQsCQCABIgQgAkcNAEGQASEQDNQCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUGXz4CAAGotAABHDbwBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGQASEQDNQCCyAAQQA2AgAgEEEBaiEBQRchEAy5AQsCQCABIgQgAkcNAEGRASEQDNMCCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUGaz4CAAGotAABHDbsBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGRASEQDNMCCyAAQQA2AgAgEEEBaiEBQRUhEAy4AQsCQCABIgQgAkcNAEGSASEQDNICCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGhz4CAAGotAABHDboBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGSASEQDNICCyAAQQA2AgAgEEEBaiEBQR4hEAy3AQsCQCABIgQgAkcNAEGTASEQDNECCyAELQAAQcwARw24ASAEQQFqIQFBCiEQDLYBCwJAIAQgAkcNAEGUASEQDNACCwJAAkAgBC0AAEG/f2oODwC5AbkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AQG5AQsgBEEBaiEBQf4AIRAMtwILIARBAWohAUH/ACEQDLYCCwJAIAQgAkcNAEGVASEQDM8CCwJAAkAgBC0AAEG/f2oOAwC4AQG4AQsgBEEBaiEBQf0AIRAMtgILIARBAWohBEGAASEQDLUCCwJAIAQgAkcNAEGWASEQDM4CCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUGnz4CAAGotAABHDbYBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGWASEQDM4CCyAAQQA2AgAgEEEBaiEBQQshEAyzAQsCQCAEIAJHDQBBlwEhEAzNAgsCQAJAAkACQCAELQAAQVNqDiMAuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AQG4AbgBuAG4AbgBArgBuAG4AQO4AQsgBEEBaiEBQfsAIRAMtgILIARBAWohAUH8ACEQDLUCCyAEQQFqIQRBgQEhEAy0AgsgBEEBaiEEQYIBIRAMswILAkAgBCACRw0AQZgBIRAMzAILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQanPgIAAai0AAEcNtAEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZgBIRAMzAILIABBADYCACAQQQFqIQFBGSEQDLEBCwJAIAQgAkcNAEGZASEQDMsCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGuz4CAAGotAABHDbMBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGZASEQDMsCCyAAQQA2AgAgEEEBaiEBQQYhEAywAQsCQCAEIAJHDQBBmgEhEAzKAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBtM+AgABqLQAARw2yASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmgEhEAzKAgsgAEEANgIAIBBBAWohAUEcIRAMrwELAkAgBCACRw0AQZsBIRAMyQILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbbPgIAAai0AAEcNsQEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZsBIRAMyQILIABBADYCACAQQQFqIQFBJyEQDK4BCwJAIAQgAkcNAEGcASEQDMgCCwJAAkAgBC0AAEGsf2oOAgABsQELIARBAWohBEGGASEQDK8CCyAEQQFqIQRBhwEhEAyuAgsCQCAEIAJHDQBBnQEhEAzHAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBuM+AgABqLQAARw2vASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBnQEhEAzHAgsgAEEANgIAIBBBAWohAUEmIRAMrAELAkAgBCACRw0AQZ4BIRAMxgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbrPgIAAai0AAEcNrgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ4BIRAMxgILIABBADYCACAQQQFqIQFBAyEQDKsBCwJAIAQgAkcNAEGfASEQDMUCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDa0BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGfASEQDMUCCyAAQQA2AgAgEEEBaiEBQQwhEAyqAQsCQCAEIAJHDQBBoAEhEAzEAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBvM+AgABqLQAARw2sASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBoAEhEAzEAgsgAEEANgIAIBBBAWohAUENIRAMqQELAkAgBCACRw0AQaEBIRAMwwILAkACQCAELQAAQbp/ag4LAKwBrAGsAawBrAGsAawBrAGsAQGsAQsgBEEBaiEEQYsBIRAMqgILIARBAWohBEGMASEQDKkCCwJAIAQgAkcNAEGiASEQDMICCyAELQAAQdAARw2pASAEQQFqIQQM6QELAkAgBCACRw0AQaMBIRAMwQILAkACQCAELQAAQbd/ag4HAaoBqgGqAaoBqgEAqgELIARBAWohBEGOASEQDKgCCyAEQQFqIQFBIiEQDKYBCwJAIAQgAkcNAEGkASEQDMACCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHAz4CAAGotAABHDagBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGkASEQDMACCyAAQQA2AgAgEEEBaiEBQR0hEAylAQsCQCAEIAJHDQBBpQEhEAy/AgsCQAJAIAQtAABBrn9qDgMAqAEBqAELIARBAWohBEGQASEQDKYCCyAEQQFqIQFBBCEQDKQBCwJAIAQgAkcNAEGmASEQDL4CCwJAAkACQAJAAkAgBC0AAEG/f2oOFQCqAaoBqgGqAaoBqgGqAaoBqgGqAQGqAaoBAqoBqgEDqgGqAQSqAQsgBEEBaiEEQYgBIRAMqAILIARBAWohBEGJASEQDKcCCyAEQQFqIQRBigEhEAymAgsgBEEBaiEEQY8BIRAMpQILIARBAWohBEGRASEQDKQCCwJAIAQgAkcNAEGnASEQDL0CCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDaUBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGnASEQDL0CCyAAQQA2AgAgEEEBaiEBQREhEAyiAQsCQCAEIAJHDQBBqAEhEAy8AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBws+AgABqLQAARw2kASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqAEhEAy8AgsgAEEANgIAIBBBAWohAUEsIRAMoQELAkAgBCACRw0AQakBIRAMuwILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQcXPgIAAai0AAEcNowEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQakBIRAMuwILIABBADYCACAQQQFqIQFBKyEQDKABCwJAIAQgAkcNAEGqASEQDLoCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHKz4CAAGotAABHDaIBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGqASEQDLoCCyAAQQA2AgAgEEEBaiEBQRQhEAyfAQsCQCAEIAJHDQBBqwEhEAy5AgsCQAJAAkACQCAELQAAQb5/ag4PAAECpAGkAaQBpAGkAaQBpAGkAaQBpAGkAQOkAQsgBEEBaiEEQZMBIRAMogILIARBAWohBEGUASEQDKECCyAEQQFqIQRBlQEhEAygAgsgBEEBaiEEQZYBIRAMnwILAkAgBCACRw0AQawBIRAMuAILIAQtAABBxQBHDZ8BIARBAWohBAzgAQsCQCAEIAJHDQBBrQEhEAy3AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBzc+AgABqLQAARw2fASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrQEhEAy3AgsgAEEANgIAIBBBAWohAUEOIRAMnAELAkAgBCACRw0AQa4BIRAMtgILIAQtAABB0ABHDZ0BIARBAWohAUElIRAMmwELAkAgBCACRw0AQa8BIRAMtQILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNnQEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQa8BIRAMtQILIABBADYCACAQQQFqIQFBKiEQDJoBCwJAIAQgAkcNAEGwASEQDLQCCwJAAkAgBC0AAEGrf2oOCwCdAZ0BnQGdAZ0BnQGdAZ0BnQEBnQELIARBAWohBEGaASEQDJsCCyAEQQFqIQRBmwEhEAyaAgsCQCAEIAJHDQBBsQEhEAyzAgsCQAJAIAQtAABBv39qDhQAnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBAZwBCyAEQQFqIQRBmQEhEAyaAgsgBEEBaiEEQZwBIRAMmQILAkAgBCACRw0AQbIBIRAMsgILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQdnPgIAAai0AAEcNmgEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbIBIRAMsgILIABBADYCACAQQQFqIQFBISEQDJcBCwJAIAQgAkcNAEGzASEQDLECCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUHdz4CAAGotAABHDZkBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGzASEQDLECCyAAQQA2AgAgEEEBaiEBQRohEAyWAQsCQCAEIAJHDQBBtAEhEAywAgsCQAJAAkAgBC0AAEG7f2oOEQCaAZoBmgGaAZoBmgGaAZoBmgEBmgGaAZoBmgGaAQKaAQsgBEEBaiEEQZ0BIRAMmAILIARBAWohBEGeASEQDJcCCyAEQQFqIQRBnwEhEAyWAgsCQCAEIAJHDQBBtQEhEAyvAgsgAiAEayAAKAIAIgFqIRQgBCABa0EFaiEQAkADQCAELQAAIAFB5M+AgABqLQAARw2XASABQQVGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtQEhEAyvAgsgAEEANgIAIBBBAWohAUEoIRAMlAELAkAgBCACRw0AQbYBIRAMrgILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQerPgIAAai0AAEcNlgEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbYBIRAMrgILIABBADYCACAQQQFqIQFBByEQDJMBCwJAIAQgAkcNAEG3ASEQDK0CCwJAAkAgBC0AAEG7f2oODgCWAZYBlgGWAZYBlgGWAZYBlgGWAZYBlgEBlgELIARBAWohBEGhASEQDJQCCyAEQQFqIQRBogEhEAyTAgsCQCAEIAJHDQBBuAEhEAysAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB7c+AgABqLQAARw2UASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuAEhEAysAgsgAEEANgIAIBBBAWohAUESIRAMkQELAkAgBCACRw0AQbkBIRAMqwILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNkwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbkBIRAMqwILIABBADYCACAQQQFqIQFBICEQDJABCwJAIAQgAkcNAEG6ASEQDKoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHyz4CAAGotAABHDZIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG6ASEQDKoCCyAAQQA2AgAgEEEBaiEBQQ8hEAyPAQsCQCAEIAJHDQBBuwEhEAypAgsCQAJAIAQtAABBt39qDgcAkgGSAZIBkgGSAQGSAQsgBEEBaiEEQaUBIRAMkAILIARBAWohBEGmASEQDI8CCwJAIAQgAkcNAEG8ASEQDKgCCyACIARrIAAoAgAiAWohFCAEIAFrQQdqIRACQANAIAQtAAAgAUH0z4CAAGotAABHDZABIAFBB0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG8ASEQDKgCCyAAQQA2AgAgEEEBaiEBQRshEAyNAQsCQCAEIAJHDQBBvQEhEAynAgsCQAJAAkAgBC0AAEG+f2oOEgCRAZEBkQGRAZEBkQGRAZEBkQEBkQGRAZEBkQGRAZEBApEBCyAEQQFqIQRBpAEhEAyPAgsgBEEBaiEEQacBIRAMjgILIARBAWohBEGoASEQDI0CCwJAIAQgAkcNAEG+ASEQDKYCCyAELQAAQc4ARw2NASAEQQFqIQQMzwELAkAgBCACRw0AQb8BIRAMpQILAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBC0AAEG/f2oOFQABAgOcAQQFBpwBnAGcAQcICQoLnAEMDQ4PnAELIARBAWohAUHoACEQDJoCCyAEQQFqIQFB6QAhEAyZAgsgBEEBaiEBQe4AIRAMmAILIARBAWohAUHyACEQDJcCCyAEQQFqIQFB8wAhEAyWAgsgBEEBaiEBQfYAIRAMlQILIARBAWohAUH3ACEQDJQCCyAEQQFqIQFB+gAhEAyTAgsgBEEBaiEEQYMBIRAMkgILIARBAWohBEGEASEQDJECCyAEQQFqIQRBhQEhEAyQAgsgBEEBaiEEQZIBIRAMjwILIARBAWohBEGYASEQDI4CCyAEQQFqIQRBoAEhEAyNAgsgBEEBaiEEQaMBIRAMjAILIARBAWohBEGqASEQDIsCCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEGrASEQDIsCC0HAASEQDKMCCyAAIAUgAhCqgICAACIBDYsBIAUhAQxcCwJAIAYgAkYNACAGQQFqIQUMjQELQcIBIRAMoQILA0ACQCAQLQAAQXZqDgSMAQAAjwEACyAQQQFqIhAgAkcNAAtBwwEhEAygAgsCQCAHIAJGDQAgAEGRgICAADYCCCAAIAc2AgQgByEBQQEhEAyHAgtBxAEhEAyfAgsCQCAHIAJHDQBBxQEhEAyfAgsCQAJAIActAABBdmoOBAHOAc4BAM4BCyAHQQFqIQYMjQELIAdBAWohBQyJAQsCQCAHIAJHDQBBxgEhEAyeAgsCQAJAIActAABBdmoOFwGPAY8BAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAQCPAQsgB0EBaiEHC0GwASEQDIQCCwJAIAggAkcNAEHIASEQDJ0CCyAILQAAQSBHDY0BIABBADsBMiAIQQFqIQFBswEhEAyDAgsgASEXAkADQCAXIgcgAkYNASAHLQAAQVBqQf8BcSIQQQpPDcwBAkAgAC8BMiIUQZkzSw0AIAAgFEEKbCIUOwEyIBBB//8DcyAUQf7/A3FJDQAgB0EBaiEXIAAgFCAQaiIQOwEyIBBB//8DcUHoB0kNAQsLQQAhECAAQQA2AhwgAEHBiYCAADYCECAAQQ02AgwgACAHQQFqNgIUDJwCC0HHASEQDJsCCyAAIAggAhCugICAACIQRQ3KASAQQRVHDYwBIABByAE2AhwgACAINgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAyaAgsCQCAJIAJHDQBBzAEhEAyaAgtBACEUQQEhF0EBIRZBACEQAkACQAJAAkACQAJAAkACQAJAIAktAABBUGoOCpYBlQEAAQIDBAUGCJcBC0ECIRAMBgtBAyEQDAULQQQhEAwEC0EFIRAMAwtBBiEQDAILQQchEAwBC0EIIRALQQAhF0EAIRZBACEUDI4BC0EJIRBBASEUQQAhF0EAIRYMjQELAkAgCiACRw0AQc4BIRAMmQILIAotAABBLkcNjgEgCkEBaiEJDMoBCyALIAJHDY4BQdABIRAMlwILAkAgCyACRg0AIABBjoCAgAA2AgggACALNgIEQbcBIRAM/gELQdEBIRAMlgILAkAgBCACRw0AQdIBIRAMlgILIAIgBGsgACgCACIQaiEUIAQgEGtBBGohCwNAIAQtAAAgEEH8z4CAAGotAABHDY4BIBBBBEYN6QEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB0gEhEAyVAgsgACAMIAIQrICAgAAiAQ2NASAMIQEMuAELAkAgBCACRw0AQdQBIRAMlAILIAIgBGsgACgCACIQaiEUIAQgEGtBAWohDANAIAQtAAAgEEGB0ICAAGotAABHDY8BIBBBAUYNjgEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB1AEhEAyTAgsCQCAEIAJHDQBB1gEhEAyTAgsgAiAEayAAKAIAIhBqIRQgBCAQa0ECaiELA0AgBC0AACAQQYPQgIAAai0AAEcNjgEgEEECRg2QASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHWASEQDJICCwJAIAQgAkcNAEHXASEQDJICCwJAAkAgBC0AAEG7f2oOEACPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAY8BCyAEQQFqIQRBuwEhEAz5AQsgBEEBaiEEQbwBIRAM+AELAkAgBCACRw0AQdgBIRAMkQILIAQtAABByABHDYwBIARBAWohBAzEAQsCQCAEIAJGDQAgAEGQgICAADYCCCAAIAQ2AgRBvgEhEAz3AQtB2QEhEAyPAgsCQCAEIAJHDQBB2gEhEAyPAgsgBC0AAEHIAEYNwwEgAEEBOgAoDLkBCyAAQQI6AC8gACAEIAIQpoCAgAAiEA2NAUHCASEQDPQBCyAALQAoQX9qDgK3AbkBuAELA0ACQCAELQAAQXZqDgQAjgGOAQCOAQsgBEEBaiIEIAJHDQALQd0BIRAMiwILIABBADoALyAALQAtQQRxRQ2EAgsgAEEAOgAvIABBAToANCABIQEMjAELIBBBFUYN2gEgAEEANgIcIAAgATYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMiAILAkAgACAQIAIQtICAgAAiBA0AIBAhAQyBAgsCQCAEQRVHDQAgAEEDNgIcIAAgEDYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMiAILIABBADYCHCAAIBA2AhQgAEGnjoCAADYCECAAQRI2AgxBACEQDIcCCyAQQRVGDdYBIABBADYCHCAAIAE2AhQgAEHajYCAADYCECAAQRQ2AgxBACEQDIYCCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNjQEgAEEHNgIcIAAgEDYCFCAAIBQ2AgxBACEQDIUCCyAAIAAvATBBgAFyOwEwIAEhAQtBKiEQDOoBCyAQQRVGDdEBIABBADYCHCAAIAE2AhQgAEGDjICAADYCECAAQRM2AgxBACEQDIICCyAQQRVGDc8BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDIECCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyNAQsgAEEMNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDIACCyAQQRVGDcwBIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDP8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyMAQsgAEENNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDP4BCyAQQRVGDckBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDP0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyLAQsgAEEONgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPwBCyAAQQA2AhwgACABNgIUIABBwJWAgAA2AhAgAEECNgIMQQAhEAz7AQsgEEEVRg3FASAAQQA2AhwgACABNgIUIABBxoyAgAA2AhAgAEEjNgIMQQAhEAz6AQsgAEEQNgIcIAAgATYCFCAAIBA2AgxBACEQDPkBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQzxAQsgAEERNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPgBCyAQQRVGDcEBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPcBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyIAQsgAEETNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPYBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQztAQsgAEEUNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPUBCyAQQRVGDb0BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDPQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyGAQsgAEEWNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPMBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQt4CAgAAiBA0AIAFBAWohAQzpAQsgAEEXNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPIBCyAAQQA2AhwgACABNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzxAQtCASERCyAQQQFqIQECQCAAKQMgIhJC//////////8PVg0AIAAgEkIEhiARhDcDICABIQEMhAELIABBADYCHCAAIAE2AhQgAEGtiYCAADYCECAAQQw2AgxBACEQDO8BCyAAQQA2AhwgACAQNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzuAQsgACgCBCEXIABBADYCBCAQIBGnaiIWIQEgACAXIBAgFiAUGyIQELWAgIAAIhRFDXMgAEEFNgIcIAAgEDYCFCAAIBQ2AgxBACEQDO0BCyAAQQA2AhwgACAQNgIUIABBqpyAgAA2AhAgAEEPNgIMQQAhEAzsAQsgACAQIAIQtICAgAAiAQ0BIBAhAQtBDiEQDNEBCwJAIAFBFUcNACAAQQI2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAzqAQsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAM6QELIAFBAWohEAJAIAAvATAiAUGAAXFFDQACQCAAIBAgAhC7gICAACIBDQAgECEBDHALIAFBFUcNugEgAEEFNgIcIAAgEDYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAM6QELAkAgAUGgBHFBoARHDQAgAC0ALUECcQ0AIABBADYCHCAAIBA2AhQgAEGWk4CAADYCECAAQQQ2AgxBACEQDOkBCyAAIBAgAhC9gICAABogECEBAkACQAJAAkACQCAAIBAgAhCzgICAAA4WAgEABAQEBAQEBAQEBAQEBAQEBAQEAwQLIABBAToALgsgACAALwEwQcAAcjsBMCAQIQELQSYhEAzRAQsgAEEjNgIcIAAgEDYCFCAAQaWWgIAANgIQIABBFTYCDEEAIRAM6QELIABBADYCHCAAIBA2AhQgAEHVi4CAADYCECAAQRE2AgxBACEQDOgBCyAALQAtQQFxRQ0BQcMBIRAMzgELAkAgDSACRg0AA0ACQCANLQAAQSBGDQAgDSEBDMQBCyANQQFqIg0gAkcNAAtBJSEQDOcBC0ElIRAM5gELIAAoAgQhBCAAQQA2AgQgACAEIA0Qr4CAgAAiBEUNrQEgAEEmNgIcIAAgBDYCDCAAIA1BAWo2AhRBACEQDOUBCyAQQRVGDasBIABBADYCHCAAIAE2AhQgAEH9jYCAADYCECAAQR02AgxBACEQDOQBCyAAQSc2AhwgACABNgIUIAAgEDYCDEEAIRAM4wELIBAhAUEBIRQCQAJAAkACQAJAAkACQCAALQAsQX5qDgcGBQUDAQIABQsgACAALwEwQQhyOwEwDAMLQQIhFAwBC0EEIRQLIABBAToALCAAIAAvATAgFHI7ATALIBAhAQtBKyEQDMoBCyAAQQA2AhwgACAQNgIUIABBq5KAgAA2AhAgAEELNgIMQQAhEAziAQsgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDEEAIRAM4QELIABBADoALCAQIQEMvQELIBAhAUEBIRQCQAJAAkACQAJAIAAtACxBe2oOBAMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0EpIRAMxQELIABBADYCHCAAIAE2AhQgAEHwlICAADYCECAAQQM2AgxBACEQDN0BCwJAIA4tAABBDUcNACAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA5BAWohAQx1CyAAQSw2AhwgACABNgIMIAAgDkEBajYCFEEAIRAM3QELIAAtAC1BAXFFDQFBxAEhEAzDAQsCQCAOIAJHDQBBLSEQDNwBCwJAAkADQAJAIA4tAABBdmoOBAIAAAMACyAOQQFqIg4gAkcNAAtBLSEQDN0BCyAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA4hAQx0CyAAQSw2AhwgACAONgIUIAAgATYCDEEAIRAM3AELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHMLIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzbAQsgACgCBCEEIABBADYCBCAAIAQgDhCxgICAACIEDaABIA4hAQzOAQsgEEEsRw0BIAFBAWohEEEBIQECQAJAAkACQAJAIAAtACxBe2oOBAMBAgQACyAQIQEMBAtBAiEBDAELQQQhAQsgAEEBOgAsIAAgAC8BMCABcjsBMCAQIQEMAQsgACAALwEwQQhyOwEwIBAhAQtBOSEQDL8BCyAAQQA6ACwgASEBC0E0IRAMvQELIAAgAC8BMEEgcjsBMCABIQEMAgsgACgCBCEEIABBADYCBAJAIAAgBCABELGAgIAAIgQNACABIQEMxwELIABBNzYCHCAAIAE2AhQgACAENgIMQQAhEAzUAQsgAEEIOgAsIAEhAQtBMCEQDLkBCwJAIAAtAChBAUYNACABIQEMBAsgAC0ALUEIcUUNkwEgASEBDAMLIAAtADBBIHENlAFBxQEhEAy3AQsCQCAPIAJGDQACQANAAkAgDy0AAEFQaiIBQf8BcUEKSQ0AIA8hAUE1IRAMugELIAApAyAiEUKZs+bMmbPmzBlWDQEgACARQgp+IhE3AyAgESABrUL/AYMiEkJ/hVYNASAAIBEgEnw3AyAgD0EBaiIPIAJHDQALQTkhEAzRAQsgACgCBCECIABBADYCBCAAIAIgD0EBaiIEELGAgIAAIgINlQEgBCEBDMMBC0E5IRAMzwELAkAgAC8BMCIBQQhxRQ0AIAAtAChBAUcNACAALQAtQQhxRQ2QAQsgACABQff7A3FBgARyOwEwIA8hAQtBNyEQDLQBCyAAIAAvATBBEHI7ATAMqwELIBBBFUYNiwEgAEEANgIcIAAgATYCFCAAQfCOgIAANgIQIABBHDYCDEEAIRAMywELIABBwwA2AhwgACABNgIMIAAgDUEBajYCFEEAIRAMygELAkAgAS0AAEE6Rw0AIAAoAgQhECAAQQA2AgQCQCAAIBAgARCvgICAACIQDQAgAUEBaiEBDGMLIABBwwA2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMygELIABBADYCHCAAIAE2AhQgAEGxkYCAADYCECAAQQo2AgxBACEQDMkBCyAAQQA2AhwgACABNgIUIABBoJmAgAA2AhAgAEEeNgIMQQAhEAzIAQsgAEEANgIACyAAQYASOwEqIAAgF0EBaiIBIAIQqICAgAAiEA0BIAEhAQtBxwAhEAysAQsgEEEVRw2DASAAQdEANgIcIAAgATYCFCAAQeOXgIAANgIQIABBFTYCDEEAIRAMxAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDF4LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMwwELIABBADYCHCAAIBQ2AhQgAEHBqICAADYCECAAQQc2AgwgAEEANgIAQQAhEAzCAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAzBAQtBACEQIABBADYCHCAAIAE2AhQgAEGAkYCAADYCECAAQQk2AgwMwAELIBBBFUYNfSAAQQA2AhwgACABNgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAy/AQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgAUEBaiEBAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBAJAIAAgECABEK2AgIAAIhANACABIQEMXAsgAEHYADYCHCAAIAE2AhQgACAQNgIMQQAhEAy+AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMrQELIABB2QA2AhwgACABNgIUIAAgBDYCDEEAIRAMvQELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKsBCyAAQdoANgIcIAAgATYCFCAAIAQ2AgxBACEQDLwBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQypAQsgAEHcADYCHCAAIAE2AhQgACAENgIMQQAhEAy7AQsCQCABLQAAQVBqIhBB/wFxQQpPDQAgACAQOgAqIAFBAWohAUHPACEQDKIBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQynAQsgAEHeADYCHCAAIAE2AhQgACAENgIMQQAhEAy6AQsgAEEANgIAIBdBAWohAQJAIAAtAClBI08NACABIQEMWQsgAEEANgIcIAAgATYCFCAAQdOJgIAANgIQIABBCDYCDEEAIRAMuQELIABBADYCAAtBACEQIABBADYCHCAAIAE2AhQgAEGQs4CAADYCECAAQQg2AgwMtwELIABBADYCACAXQQFqIQECQCAALQApQSFHDQAgASEBDFYLIABBADYCHCAAIAE2AhQgAEGbioCAADYCECAAQQg2AgxBACEQDLYBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKSIQQV1qQQtPDQAgASEBDFULAkAgEEEGSw0AQQEgEHRBygBxRQ0AIAEhAQxVC0EAIRAgAEEANgIcIAAgATYCFCAAQfeJgIAANgIQIABBCDYCDAy1AQsgEEEVRg1xIABBADYCHCAAIAE2AhQgAEG5jYCAADYCECAAQRo2AgxBACEQDLQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxUCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLMBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAUNgIUIAAgATYCDEEAIRAMogELIABBADYCHCAAIBQ2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKEBCyAAQQA2AhwgACABNgIUIABBw4+AgAA2AhAgAEEHNgIMQQAhEAygAQtBACEQIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgwMnwELIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgxBACEQDJ4BCyAAQQA2AhwgACAUNgIUIABB/pGAgAA2AhAgAEEHNgIMQQAhEAydAQsgAEEANgIcIAAgATYCFCAAQY6bgIAANgIQIABBBjYCDEEAIRAMnAELIBBBFUYNVyAAQQA2AhwgACABNgIUIABBzI6AgAA2AhAgAEEgNgIMQQAhEAybAQsgAEEANgIAIBBBAWohAUEkIRALIAAgEDoAKSAAKAIEIRAgAEEANgIEIAAgECABEKuAgIAAIhANVCABIQEMPgsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQfGbgIAANgIQIABBBjYCDAyXAQsgAUEVRg1QIABBADYCHCAAIAU2AhQgAEHwjICAADYCECAAQRs2AgxBACEQDJYBCyAAKAIEIQUgAEEANgIEIAAgBSAQEKmAgIAAIgUNASAQQQFqIQULQa0BIRAMewsgAEHBATYCHCAAIAU2AgwgACAQQQFqNgIUQQAhEAyTAQsgACgCBCEGIABBADYCBCAAIAYgEBCpgICAACIGDQEgEEEBaiEGC0GuASEQDHgLIABBwgE2AhwgACAGNgIMIAAgEEEBajYCFEEAIRAMkAELIABBADYCHCAAIAc2AhQgAEGXi4CAADYCECAAQQ02AgxBACEQDI8BCyAAQQA2AhwgACAINgIUIABB45CAgAA2AhAgAEEJNgIMQQAhEAyOAQsgAEEANgIcIAAgCDYCFCAAQZSNgIAANgIQIABBITYCDEEAIRAMjQELQQEhFkEAIRdBACEUQQEhEAsgACAQOgArIAlBAWohCAJAAkAgAC0ALUEQcQ0AAkACQAJAIAAtACoOAwEAAgQLIBZFDQMMAgsgFA0BDAILIBdFDQELIAAoAgQhECAAQQA2AgQgACAQIAgQrYCAgAAiEEUNPSAAQckBNgIcIAAgCDYCFCAAIBA2AgxBACEQDIwBCyAAKAIEIQQgAEEANgIEIAAgBCAIEK2AgIAAIgRFDXYgAEHKATYCHCAAIAg2AhQgACAENgIMQQAhEAyLAQsgACgCBCEEIABBADYCBCAAIAQgCRCtgICAACIERQ10IABBywE2AhwgACAJNgIUIAAgBDYCDEEAIRAMigELIAAoAgQhBCAAQQA2AgQgACAEIAoQrYCAgAAiBEUNciAAQc0BNgIcIAAgCjYCFCAAIAQ2AgxBACEQDIkBCwJAIAstAABBUGoiEEH/AXFBCk8NACAAIBA6ACogC0EBaiEKQbYBIRAMcAsgACgCBCEEIABBADYCBCAAIAQgCxCtgICAACIERQ1wIABBzwE2AhwgACALNgIUIAAgBDYCDEEAIRAMiAELIABBADYCHCAAIAQ2AhQgAEGQs4CAADYCECAAQQg2AgwgAEEANgIAQQAhEAyHAQsgAUEVRg0/IABBADYCHCAAIAw2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDIYBCyAAQYEEOwEoIAAoAgQhECAAQgA3AwAgACAQIAxBAWoiDBCrgICAACIQRQ04IABB0wE2AhwgACAMNgIUIAAgEDYCDEEAIRAMhQELIABBADYCAAtBACEQIABBADYCHCAAIAQ2AhQgAEHYm4CAADYCECAAQQg2AgwMgwELIAAoAgQhECAAQgA3AwAgACAQIAtBAWoiCxCrgICAACIQDQFBxgEhEAxpCyAAQQI6ACgMVQsgAEHVATYCHCAAIAs2AhQgACAQNgIMQQAhEAyAAQsgEEEVRg03IABBADYCHCAAIAQ2AhQgAEGkjICAADYCECAAQRA2AgxBACEQDH8LIAAtADRBAUcNNCAAIAQgAhC8gICAACIQRQ00IBBBFUcNNSAAQdwBNgIcIAAgBDYCFCAAQdWWgIAANgIQIABBFTYCDEEAIRAMfgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQMfQtBACEQDGMLQQIhEAxiC0ENIRAMYQtBDyEQDGALQSUhEAxfC0ETIRAMXgtBFSEQDF0LQRYhEAxcC0EXIRAMWwtBGCEQDFoLQRkhEAxZC0EaIRAMWAtBGyEQDFcLQRwhEAxWC0EdIRAMVQtBHyEQDFQLQSEhEAxTC0EjIRAMUgtBxgAhEAxRC0EuIRAMUAtBLyEQDE8LQTshEAxOC0E9IRAMTQtByAAhEAxMC0HJACEQDEsLQcsAIRAMSgtBzAAhEAxJC0HOACEQDEgLQdEAIRAMRwtB1QAhEAxGC0HYACEQDEULQdkAIRAMRAtB2wAhEAxDC0HkACEQDEILQeUAIRAMQQtB8QAhEAxAC0H0ACEQDD8LQY0BIRAMPgtBlwEhEAw9C0GpASEQDDwLQawBIRAMOwtBwAEhEAw6C0G5ASEQDDkLQa8BIRAMOAtBsQEhEAw3C0GyASEQDDYLQbQBIRAMNQtBtQEhEAw0C0G6ASEQDDMLQb0BIRAMMgtBvwEhEAwxC0HBASEQDDALIABBADYCHCAAIAQ2AhQgAEHpi4CAADYCECAAQR82AgxBACEQDEgLIABB2wE2AhwgACAENgIUIABB+paAgAA2AhAgAEEVNgIMQQAhEAxHCyAAQfgANgIcIAAgDDYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMRgsgAEHRADYCHCAAIAU2AhQgAEGwl4CAADYCECAAQRU2AgxBACEQDEULIABB+QA2AhwgACABNgIUIAAgEDYCDEEAIRAMRAsgAEH4ADYCHCAAIAE2AhQgAEHKmICAADYCECAAQRU2AgxBACEQDEMLIABB5AA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAxCCyAAQdcANgIcIAAgATYCFCAAQcmXgIAANgIQIABBFTYCDEEAIRAMQQsgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMQAsgAEHCADYCHCAAIAE2AhQgAEHjmICAADYCECAAQRU2AgxBACEQDD8LIABBADYCBCAAIA8gDxCxgICAACIERQ0BIABBOjYCHCAAIAQ2AgwgACAPQQFqNgIUQQAhEAw+CyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBEUNACAAQTs2AhwgACAENgIMIAAgAUEBajYCFEEAIRAMPgsgAUEBaiEBDC0LIA9BAWohAQwtCyAAQQA2AhwgACAPNgIUIABB5JKAgAA2AhAgAEEENgIMQQAhEAw7CyAAQTY2AhwgACAENgIUIAAgAjYCDEEAIRAMOgsgAEEuNgIcIAAgDjYCFCAAIAQ2AgxBACEQDDkLIABB0AA2AhwgACABNgIUIABBkZiAgAA2AhAgAEEVNgIMQQAhEAw4CyANQQFqIQEMLAsgAEEVNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMNgsgAEEbNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNQsgAEEPNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNAsgAEELNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMMwsgAEEaNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMgsgAEELNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMQsgAEEKNgIcIAAgATYCFCAAQeSWgIAANgIQIABBFTYCDEEAIRAMMAsgAEEeNgIcIAAgATYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAMLwsgAEEANgIcIAAgEDYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMLgsgAEEENgIcIAAgATYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMLQsgAEEANgIAIAtBAWohCwtBuAEhEAwSCyAAQQA2AgAgEEEBaiEBQfUAIRAMEQsgASEBAkAgAC0AKUEFRw0AQeMAIRAMEQtB4gAhEAwQC0EAIRAgAEEANgIcIABB5JGAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAwoCyAAQQA2AgAgF0EBaiEBQcAAIRAMDgtBASEBCyAAIAE6ACwgAEEANgIAIBdBAWohAQtBKCEQDAsLIAEhAQtBOCEQDAkLAkAgASIPIAJGDQADQAJAIA8tAABBgL6AgABqLQAAIgFBAUYNACABQQJHDQMgD0EBaiEBDAQLIA9BAWoiDyACRw0AC0E+IRAMIgtBPiEQDCELIABBADoALCAPIQEMAQtBCyEQDAYLQTohEAwFCyABQQFqIQFBLSEQDAQLIAAgAToALCAAQQA2AgAgFkEBaiEBQQwhEAwDCyAAQQA2AgAgF0EBaiEBQQohEAwCCyAAQQA2AgALIABBADoALCANIQFBCSEQDAALC0EAIRAgAEEANgIcIAAgCzYCFCAAQc2QgIAANgIQIABBCTYCDAwXC0EAIRAgAEEANgIcIAAgCjYCFCAAQemKgIAANgIQIABBCTYCDAwWC0EAIRAgAEEANgIcIAAgCTYCFCAAQbeQgIAANgIQIABBCTYCDAwVC0EAIRAgAEEANgIcIAAgCDYCFCAAQZyRgIAANgIQIABBCTYCDAwUC0EAIRAgAEEANgIcIAAgATYCFCAAQc2QgIAANgIQIABBCTYCDAwTC0EAIRAgAEEANgIcIAAgATYCFCAAQemKgIAANgIQIABBCTYCDAwSC0EAIRAgAEEANgIcIAAgATYCFCAAQbeQgIAANgIQIABBCTYCDAwRC0EAIRAgAEEANgIcIAAgATYCFCAAQZyRgIAANgIQIABBCTYCDAwQC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwPC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwOC0EAIRAgAEEANgIcIAAgATYCFCAAQcCSgIAANgIQIABBCzYCDAwNC0EAIRAgAEEANgIcIAAgATYCFCAAQZWJgIAANgIQIABBCzYCDAwMC0EAIRAgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDAwLC0EAIRAgAEEANgIcIAAgATYCFCAAQfuPgIAANgIQIABBCjYCDAwKC0EAIRAgAEEANgIcIAAgATYCFCAAQfGZgIAANgIQIABBAjYCDAwJC0EAIRAgAEEANgIcIAAgATYCFCAAQcSUgIAANgIQIABBAjYCDAwIC0EAIRAgAEEANgIcIAAgATYCFCAAQfKVgIAANgIQIABBAjYCDAwHCyAAQQI2AhwgACABNgIUIABBnJqAgAA2AhAgAEEWNgIMQQAhEAwGC0EBIRAMBQtB1AAhECABIgQgAkYNBCADQQhqIAAgBCACQdjCgIAAQQoQxYCAgAAgAygCDCEEIAMoAggOAwEEAgALEMqAgIAAAAsgAEEANgIcIABBtZqAgAA2AhAgAEEXNgIMIAAgBEEBajYCFEEAIRAMAgsgAEEANgIcIAAgBDYCFCAAQcqagIAANgIQIABBCTYCDEEAIRAMAQsCQCABIgQgAkcNAEEiIRAMAQsgAEGJgICAADYCCCAAIAQ2AgRBISEQCyADQRBqJICAgIAAIBALrwEBAn8gASgCACEGAkACQCACIANGDQAgBCAGaiEEIAYgA2ogAmshByACIAZBf3MgBWoiBmohBQNAAkAgAi0AACAELQAARg0AQQIhBAwDCwJAIAYNAEEAIQQgBSECDAMLIAZBf2ohBiAEQQFqIQQgAkEBaiICIANHDQALIAchBiADIQILIABBATYCACABIAY2AgAgACACNgIEDwsgAUEANgIAIAAgBDYCACAAIAI2AgQLCgAgABDHgICAAAvyNgELfyOAgICAAEEQayIBJICAgIAAAkBBACgCoNCAgAANAEEAEMuAgIAAQYDUhIAAayICQdkASQ0AQQAhAwJAQQAoAuDTgIAAIgQNAEEAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEIakFwcUHYqtWqBXMiBDYC4NOAgABBAEEANgL004CAAEEAQQA2AsTTgIAAC0EAIAI2AszTgIAAQQBBgNSEgAA2AsjTgIAAQQBBgNSEgAA2ApjQgIAAQQAgBDYCrNCAgABBAEF/NgKo0ICAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALQYDUhIAAQXhBgNSEgABrQQ9xQQBBgNSEgABBCGpBD3EbIgNqIgRBBGogAkFIaiIFIANrIgNBAXI2AgBBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAQYDUhIAAIAVqQTg2AgQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFLDQACQEEAKAKI0ICAACIGQRAgAEETakFwcSAAQQtJGyICQQN2IgR2IgNBA3FFDQACQAJAIANBAXEgBHJBAXMiBUEDdCIEQbDQgIAAaiIDIARBuNCAgABqKAIAIgQoAggiAkcNAEEAIAZBfiAFd3E2AojQgIAADAELIAMgAjYCCCACIAM2AgwLIARBCGohAyAEIAVBA3QiBUEDcjYCBCAEIAVqIgQgBCgCBEEBcjYCBAwMCyACQQAoApDQgIAAIgdNDQECQCADRQ0AAkACQCADIAR0QQIgBHQiA0EAIANrcnEiA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqIgRBA3QiA0Gw0ICAAGoiBSADQbjQgIAAaigCACIDKAIIIgBHDQBBACAGQX4gBHdxIgY2AojQgIAADAELIAUgADYCCCAAIAU2AgwLIAMgAkEDcjYCBCADIARBA3QiBGogBCACayIFNgIAIAMgAmoiACAFQQFyNgIEAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQQCQAJAIAZBASAHQQN2dCIIcQ0AQQAgBiAIcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCAENgIMIAIgBDYCCCAEIAI2AgwgBCAINgIICyADQQhqIQNBACAANgKc0ICAAEEAIAU2ApDQgIAADAwLQQAoAozQgIAAIglFDQEgCUEAIAlrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqQQJ0QbjSgIAAaigCACIAKAIEQXhxIAJrIQQgACEFAkADQAJAIAUoAhAiAw0AIAVBFGooAgAiA0UNAgsgAygCBEF4cSACayIFIAQgBSAESSIFGyEEIAMgACAFGyEAIAMhBQwACwsgACgCGCEKAkAgACgCDCIIIABGDQAgACgCCCIDQQAoApjQgIAASRogCCADNgIIIAMgCDYCDAwLCwJAIABBFGoiBSgCACIDDQAgACgCECIDRQ0DIABBEGohBQsDQCAFIQsgAyIIQRRqIgUoAgAiAw0AIAhBEGohBSAIKAIQIgMNAAsgC0EANgIADAoLQX8hAiAAQb9/Sw0AIABBE2oiA0FwcSECQQAoAozQgIAAIgdFDQBBACELAkAgAkGAAkkNAEEfIQsgAkH///8HSw0AIANBCHYiAyADQYD+P2pBEHZBCHEiA3QiBCAEQYDgH2pBEHZBBHEiBHQiBSAFQYCAD2pBEHZBAnEiBXRBD3YgAyAEciAFcmsiA0EBdCACIANBFWp2QQFxckEcaiELC0EAIAJrIQQCQAJAAkACQCALQQJ0QbjSgIAAaigCACIFDQBBACEDQQAhCAwBC0EAIQMgAkEAQRkgC0EBdmsgC0EfRht0IQBBACEIA0ACQCAFKAIEQXhxIAJrIgYgBE8NACAGIQQgBSEIIAYNAEEAIQQgBSEIIAUhAwwDCyADIAVBFGooAgAiBiAGIAUgAEEddkEEcWpBEGooAgAiBUYbIAMgBhshAyAAQQF0IQAgBQ0ACwsCQCADIAhyDQBBACEIQQIgC3QiA0EAIANrciAHcSIDRQ0DIANBACADa3FBf2oiAyADQQx2QRBxIgN2IgVBBXZBCHEiACADciAFIAB2IgNBAnZBBHEiBXIgAyAFdiIDQQF2QQJxIgVyIAMgBXYiA0EBdkEBcSIFciADIAV2akECdEG40oCAAGooAgAhAwsgA0UNAQsDQCADKAIEQXhxIAJrIgYgBEkhAAJAIAMoAhAiBQ0AIANBFGooAgAhBQsgBiAEIAAbIQQgAyAIIAAbIQggBSEDIAUNAAsLIAhFDQAgBEEAKAKQ0ICAACACa08NACAIKAIYIQsCQCAIKAIMIgAgCEYNACAIKAIIIgNBACgCmNCAgABJGiAAIAM2AgggAyAANgIMDAkLAkAgCEEUaiIFKAIAIgMNACAIKAIQIgNFDQMgCEEQaiEFCwNAIAUhBiADIgBBFGoiBSgCACIDDQAgAEEQaiEFIAAoAhAiAw0ACyAGQQA2AgAMCAsCQEEAKAKQ0ICAACIDIAJJDQBBACgCnNCAgAAhBAJAAkAgAyACayIFQRBJDQAgBCACaiIAIAVBAXI2AgRBACAFNgKQ0ICAAEEAIAA2ApzQgIAAIAQgA2ogBTYCACAEIAJBA3I2AgQMAQsgBCADQQNyNgIEIAQgA2oiAyADKAIEQQFyNgIEQQBBADYCnNCAgABBAEEANgKQ0ICAAAsgBEEIaiEDDAoLAkBBACgClNCAgAAiACACTQ0AQQAoAqDQgIAAIgMgAmoiBCAAIAJrIgVBAXI2AgRBACAFNgKU0ICAAEEAIAQ2AqDQgIAAIAMgAkEDcjYCBCADQQhqIQMMCgsCQAJAQQAoAuDTgIAARQ0AQQAoAujTgIAAIQQMAQtBAEJ/NwLs04CAAEEAQoCAhICAgMAANwLk04CAAEEAIAFBDGpBcHFB2KrVqgVzNgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgABBgIAEIQQLQQAhAwJAIAQgAkHHAGoiB2oiBkEAIARrIgtxIgggAksNAEEAQTA2AvjTgIAADAoLAkBBACgCwNOAgAAiA0UNAAJAQQAoArjTgIAAIgQgCGoiBSAETQ0AIAUgA00NAQtBACEDQQBBMDYC+NOAgAAMCgtBAC0AxNOAgABBBHENBAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQAJAIAMoAgAiBSAESw0AIAUgAygCBGogBEsNAwsgAygCCCIDDQALC0EAEMuAgIAAIgBBf0YNBSAIIQYCQEEAKALk04CAACIDQX9qIgQgAHFFDQAgCCAAayAEIABqQQAgA2txaiEGCyAGIAJNDQUgBkH+////B0sNBQJAQQAoAsDTgIAAIgNFDQBBACgCuNOAgAAiBCAGaiIFIARNDQYgBSADSw0GCyAGEMuAgIAAIgMgAEcNAQwHCyAGIABrIAtxIgZB/v///wdLDQQgBhDLgICAACIAIAMoAgAgAygCBGpGDQMgACEDCwJAIANBf0YNACACQcgAaiAGTQ0AAkAgByAGa0EAKALo04CAACIEakEAIARrcSIEQf7///8HTQ0AIAMhAAwHCwJAIAQQy4CAgABBf0YNACAEIAZqIQYgAyEADAcLQQAgBmsQy4CAgAAaDAQLIAMhACADQX9HDQUMAwtBACEIDAcLQQAhAAwFCyAAQX9HDQILQQBBACgCxNOAgABBBHI2AsTTgIAACyAIQf7///8HSw0BIAgQy4CAgAAhAEEAEMuAgIAAIQMgAEF/Rg0BIANBf0YNASAAIANPDQEgAyAAayIGIAJBOGpNDQELQQBBACgCuNOAgAAgBmoiAzYCuNOAgAACQCADQQAoArzTgIAATQ0AQQAgAzYCvNOAgAALAkACQAJAAkBBACgCoNCAgAAiBEUNAEHI04CAACEDA0AgACADKAIAIgUgAygCBCIIakYNAiADKAIIIgMNAAwDCwsCQAJAQQAoApjQgIAAIgNFDQAgACADTw0BC0EAIAA2ApjQgIAAC0EAIQNBACAGNgLM04CAAEEAIAA2AsjTgIAAQQBBfzYCqNCAgABBAEEAKALg04CAADYCrNCAgABBAEEANgLU04CAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgQgBkFIaiIFIANrIgNBAXI2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAIAAgBWpBODYCBAwCCyADLQAMQQhxDQAgBCAFSQ0AIAQgAE8NACAEQXggBGtBD3FBACAEQQhqQQ9xGyIFaiIAQQAoApTQgIAAIAZqIgsgBWsiBUEBcjYCBCADIAggBmo2AgRBAEEAKALw04CAADYCpNCAgABBACAFNgKU0ICAAEEAIAA2AqDQgIAAIAQgC2pBODYCBAwBCwJAIABBACgCmNCAgAAiCE8NAEEAIAA2ApjQgIAAIAAhCAsgACAGaiEFQcjTgIAAIQMCQAJAAkACQAJAAkACQANAIAMoAgAgBUYNASADKAIIIgMNAAwCCwsgAy0ADEEIcUUNAQtByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiIFIARLDQMLIAMoAgghAwwACwsgAyAANgIAIAMgAygCBCAGajYCBCAAQXggAGtBD3FBACAAQQhqQQ9xG2oiCyACQQNyNgIEIAVBeCAFa0EPcUEAIAVBCGpBD3EbaiIGIAsgAmoiAmshAwJAIAYgBEcNAEEAIAI2AqDQgIAAQQBBACgClNCAgAAgA2oiAzYClNCAgAAgAiADQQFyNgIEDAMLAkAgBkEAKAKc0ICAAEcNAEEAIAI2ApzQgIAAQQBBACgCkNCAgAAgA2oiAzYCkNCAgAAgAiADQQFyNgIEIAIgA2ogAzYCAAwDCwJAIAYoAgQiBEEDcUEBRw0AIARBeHEhBwJAAkAgBEH/AUsNACAGKAIIIgUgBEEDdiIIQQN0QbDQgIAAaiIARhoCQCAGKAIMIgQgBUcNAEEAQQAoAojQgIAAQX4gCHdxNgKI0ICAAAwCCyAEIABGGiAEIAU2AgggBSAENgIMDAELIAYoAhghCQJAAkAgBigCDCIAIAZGDQAgBigCCCIEIAhJGiAAIAQ2AgggBCAANgIMDAELAkAgBkEUaiIEKAIAIgUNACAGQRBqIgQoAgAiBQ0AQQAhAAwBCwNAIAQhCCAFIgBBFGoiBCgCACIFDQAgAEEQaiEEIAAoAhAiBQ0ACyAIQQA2AgALIAlFDQACQAJAIAYgBigCHCIFQQJ0QbjSgIAAaiIEKAIARw0AIAQgADYCACAADQFBAEEAKAKM0ICAAEF+IAV3cTYCjNCAgAAMAgsgCUEQQRQgCSgCECAGRhtqIAA2AgAgAEUNAQsgACAJNgIYAkAgBigCECIERQ0AIAAgBDYCECAEIAA2AhgLIAYoAhQiBEUNACAAQRRqIAQ2AgAgBCAANgIYCyAHIANqIQMgBiAHaiIGKAIEIQQLIAYgBEF+cTYCBCACIANqIAM2AgAgAiADQQFyNgIEAkAgA0H/AUsNACADQXhxQbDQgIAAaiEEAkACQEEAKAKI0ICAACIFQQEgA0EDdnQiA3ENAEEAIAUgA3I2AojQgIAAIAQhAwwBCyAEKAIIIQMLIAMgAjYCDCAEIAI2AgggAiAENgIMIAIgAzYCCAwDC0EfIQQCQCADQf///wdLDQAgA0EIdiIEIARBgP4/akEQdkEIcSIEdCIFIAVBgOAfakEQdkEEcSIFdCIAIABBgIAPakEQdkECcSIAdEEPdiAEIAVyIAByayIEQQF0IAMgBEEVanZBAXFyQRxqIQQLIAIgBDYCHCACQgA3AhAgBEECdEG40oCAAGohBQJAQQAoAozQgIAAIgBBASAEdCIIcQ0AIAUgAjYCAEEAIAAgCHI2AozQgIAAIAIgBTYCGCACIAI2AgggAiACNgIMDAMLIANBAEEZIARBAXZrIARBH0YbdCEEIAUoAgAhAANAIAAiBSgCBEF4cSADRg0CIARBHXYhACAEQQF0IQQgBSAAQQRxakEQaiIIKAIAIgANAAsgCCACNgIAIAIgBTYCGCACIAI2AgwgAiACNgIIDAILIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgsgBkFIaiIIIANrIgNBAXI2AgQgACAIakE4NgIEIAQgBUE3IAVrQQ9xQQAgBUFJakEPcRtqQUFqIgggCCAEQRBqSRsiCEEjNgIEQQBBACgC8NOAgAA2AqTQgIAAQQAgAzYClNCAgABBACALNgKg0ICAACAIQRBqQQApAtDTgIAANwIAIAhBACkCyNOAgAA3AghBACAIQQhqNgLQ04CAAEEAIAY2AszTgIAAQQAgADYCyNOAgABBAEEANgLU04CAACAIQSRqIQMDQCADQQc2AgAgA0EEaiIDIAVJDQALIAggBEYNAyAIIAgoAgRBfnE2AgQgCCAIIARrIgA2AgAgBCAAQQFyNgIEAkAgAEH/AUsNACAAQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgAEEDdnQiAHENAEEAIAUgAHI2AojQgIAAIAMhBQwBCyADKAIIIQULIAUgBDYCDCADIAQ2AgggBCADNgIMIAQgBTYCCAwEC0EfIQMCQCAAQf///wdLDQAgAEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCIIIAhBgIAPakEQdkECcSIIdEEPdiADIAVyIAhyayIDQQF0IAAgA0EVanZBAXFyQRxqIQMLIAQgAzYCHCAEQgA3AhAgA0ECdEG40oCAAGohBQJAQQAoAozQgIAAIghBASADdCIGcQ0AIAUgBDYCAEEAIAggBnI2AozQgIAAIAQgBTYCGCAEIAQ2AgggBCAENgIMDAQLIABBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhCANAIAgiBSgCBEF4cSAARg0DIANBHXYhCCADQQF0IQMgBSAIQQRxakEQaiIGKAIAIggNAAsgBiAENgIAIAQgBTYCGCAEIAQ2AgwgBCAENgIIDAMLIAUoAggiAyACNgIMIAUgAjYCCCACQQA2AhggAiAFNgIMIAIgAzYCCAsgC0EIaiEDDAULIAUoAggiAyAENgIMIAUgBDYCCCAEQQA2AhggBCAFNgIMIAQgAzYCCAtBACgClNCAgAAiAyACTQ0AQQAoAqDQgIAAIgQgAmoiBSADIAJrIgNBAXI2AgRBACADNgKU0ICAAEEAIAU2AqDQgIAAIAQgAkEDcjYCBCAEQQhqIQMMAwtBACEDQQBBMDYC+NOAgAAMAgsCQCALRQ0AAkACQCAIIAgoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAA2AgAgAA0BQQAgB0F+IAV3cSIHNgKM0ICAAAwCCyALQRBBFCALKAIQIAhGG2ogADYCACAARQ0BCyAAIAs2AhgCQCAIKAIQIgNFDQAgACADNgIQIAMgADYCGAsgCEEUaigCACIDRQ0AIABBFGogAzYCACADIAA2AhgLAkACQCAEQQ9LDQAgCCAEIAJqIgNBA3I2AgQgCCADaiIDIAMoAgRBAXI2AgQMAQsgCCACaiIAIARBAXI2AgQgCCACQQNyNgIEIAAgBGogBDYCAAJAIARB/wFLDQAgBEF4cUGw0ICAAGohAwJAAkBBACgCiNCAgAAiBUEBIARBA3Z0IgRxDQBBACAFIARyNgKI0ICAACADIQQMAQsgAygCCCEECyAEIAA2AgwgAyAANgIIIAAgAzYCDCAAIAQ2AggMAQtBHyEDAkAgBEH///8HSw0AIARBCHYiAyADQYD+P2pBEHZBCHEiA3QiBSAFQYDgH2pBEHZBBHEiBXQiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAFciACcmsiA0EBdCAEIANBFWp2QQFxckEcaiEDCyAAIAM2AhwgAEIANwIQIANBAnRBuNKAgABqIQUCQCAHQQEgA3QiAnENACAFIAA2AgBBACAHIAJyNgKM0ICAACAAIAU2AhggACAANgIIIAAgADYCDAwBCyAEQQBBGSADQQF2ayADQR9GG3QhAyAFKAIAIQICQANAIAIiBSgCBEF4cSAERg0BIANBHXYhAiADQQF0IQMgBSACQQRxakEQaiIGKAIAIgINAAsgBiAANgIAIAAgBTYCGCAAIAA2AgwgACAANgIIDAELIAUoAggiAyAANgIMIAUgADYCCCAAQQA2AhggACAFNgIMIAAgAzYCCAsgCEEIaiEDDAELAkAgCkUNAAJAAkAgACAAKAIcIgVBAnRBuNKAgABqIgMoAgBHDQAgAyAINgIAIAgNAUEAIAlBfiAFd3E2AozQgIAADAILIApBEEEUIAooAhAgAEYbaiAINgIAIAhFDQELIAggCjYCGAJAIAAoAhAiA0UNACAIIAM2AhAgAyAINgIYCyAAQRRqKAIAIgNFDQAgCEEUaiADNgIAIAMgCDYCGAsCQAJAIARBD0sNACAAIAQgAmoiA0EDcjYCBCAAIANqIgMgAygCBEEBcjYCBAwBCyAAIAJqIgUgBEEBcjYCBCAAIAJBA3I2AgQgBSAEaiAENgIAAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQMCQAJAQQEgB0EDdnQiCCAGcQ0AQQAgCCAGcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCADNgIMIAIgAzYCCCADIAI2AgwgAyAINgIIC0EAIAU2ApzQgIAAQQAgBDYCkNCAgAALIABBCGohAwsgAUEQaiSAgICAACADCwoAIAAQyYCAgAAL4g0BB38CQCAARQ0AIABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAIAJBAXENACACQQNxRQ0BIAEgASgCACICayIBQQAoApjQgIAAIgRJDQEgAiAAaiEAAkAgAUEAKAKc0ICAAEYNAAJAIAJB/wFLDQAgASgCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgASgCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAwsgAiAGRhogAiAENgIIIAQgAjYCDAwCCyABKAIYIQcCQAJAIAEoAgwiBiABRg0AIAEoAggiAiAESRogBiACNgIIIAIgBjYCDAwBCwJAIAFBFGoiAigCACIEDQAgAUEQaiICKAIAIgQNAEEAIQYMAQsDQCACIQUgBCIGQRRqIgIoAgAiBA0AIAZBEGohAiAGKAIQIgQNAAsgBUEANgIACyAHRQ0BAkACQCABIAEoAhwiBEECdEG40oCAAGoiAigCAEcNACACIAY2AgAgBg0BQQBBACgCjNCAgABBfiAEd3E2AozQgIAADAMLIAdBEEEUIAcoAhAgAUYbaiAGNgIAIAZFDQILIAYgBzYCGAJAIAEoAhAiAkUNACAGIAI2AhAgAiAGNgIYCyABKAIUIgJFDQEgBkEUaiACNgIAIAIgBjYCGAwBCyADKAIEIgJBA3FBA0cNACADIAJBfnE2AgRBACAANgKQ0ICAACABIABqIAA2AgAgASAAQQFyNgIEDwsgASADTw0AIAMoAgQiAkEBcUUNAAJAAkAgAkECcQ0AAkAgA0EAKAKg0ICAAEcNAEEAIAE2AqDQgIAAQQBBACgClNCAgAAgAGoiADYClNCAgAAgASAAQQFyNgIEIAFBACgCnNCAgABHDQNBAEEANgKQ0ICAAEEAQQA2ApzQgIAADwsCQCADQQAoApzQgIAARw0AQQAgATYCnNCAgABBAEEAKAKQ0ICAACAAaiIANgKQ0ICAACABIABBAXI2AgQgASAAaiAANgIADwsgAkF4cSAAaiEAAkACQCACQf8BSw0AIAMoAggiBCACQQN2IgVBA3RBsNCAgABqIgZGGgJAIAMoAgwiAiAERw0AQQBBACgCiNCAgABBfiAFd3E2AojQgIAADAILIAIgBkYaIAIgBDYCCCAEIAI2AgwMAQsgAygCGCEHAkACQCADKAIMIgYgA0YNACADKAIIIgJBACgCmNCAgABJGiAGIAI2AgggAiAGNgIMDAELAkAgA0EUaiICKAIAIgQNACADQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQACQAJAIAMgAygCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAgsgB0EQQRQgBygCECADRhtqIAY2AgAgBkUNAQsgBiAHNgIYAkAgAygCECICRQ0AIAYgAjYCECACIAY2AhgLIAMoAhQiAkUNACAGQRRqIAI2AgAgAiAGNgIYCyABIABqIAA2AgAgASAAQQFyNgIEIAFBACgCnNCAgABHDQFBACAANgKQ0ICAAA8LIAMgAkF+cTYCBCABIABqIAA2AgAgASAAQQFyNgIECwJAIABB/wFLDQAgAEF4cUGw0ICAAGohAgJAAkBBACgCiNCAgAAiBEEBIABBA3Z0IgBxDQBBACAEIAByNgKI0ICAACACIQAMAQsgAigCCCEACyAAIAE2AgwgAiABNgIIIAEgAjYCDCABIAA2AggPC0EfIQICQCAAQf///wdLDQAgAEEIdiICIAJBgP4/akEQdkEIcSICdCIEIARBgOAfakEQdkEEcSIEdCIGIAZBgIAPakEQdkECcSIGdEEPdiACIARyIAZyayICQQF0IAAgAkEVanZBAXFyQRxqIQILIAEgAjYCHCABQgA3AhAgAkECdEG40oCAAGohBAJAAkBBACgCjNCAgAAiBkEBIAJ0IgNxDQAgBCABNgIAQQAgBiADcjYCjNCAgAAgASAENgIYIAEgATYCCCABIAE2AgwMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgBCgCACEGAkADQCAGIgQoAgRBeHEgAEYNASACQR12IQYgAkEBdCECIAQgBkEEcWpBEGoiAygCACIGDQALIAMgATYCACABIAQ2AhggASABNgIMIAEgATYCCAwBCyAEKAIIIgAgATYCDCAEIAE2AgggAUEANgIYIAEgBDYCDCABIAA2AggLQQBBACgCqNCAgABBf2oiAUF/IAEbNgKo0ICAAAsLBAAAAAtOAAJAIAANAD8AQRB0DwsCQCAAQf//A3ENACAAQX9MDQACQCAAQRB2QAAiAEF/Rw0AQQBBMDYC+NOAgABBfw8LIABBEHQPCxDKgICAAAAL8gICA38BfgJAIAJFDQAgACABOgAAIAIgAGoiA0F/aiABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBfWogAToAACADQX5qIAE6AAAgAkEHSQ0AIAAgAToAAyADQXxqIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIFayICQSBJDQAgAa1CgYCAgBB+IQYgAyAFaiEBA0AgASAGNwMYIAEgBjcDECABIAY3AwggASAGNwMAIAFBIGohASACQWBqIgJBH0sNAAsLIAALC45IAQBBgAgLhkgBAAAAAgAAAAMAAAAAAAAAAAAAAAQAAAAFAAAAAAAAAAAAAAAGAAAABwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEludmFsaWQgY2hhciBpbiB1cmwgcXVlcnkAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9ib2R5AENvbnRlbnQtTGVuZ3RoIG92ZXJmbG93AENodW5rIHNpemUgb3ZlcmZsb3cAUmVzcG9uc2Ugb3ZlcmZsb3cASW52YWxpZCBtZXRob2QgZm9yIEhUVFAveC54IHJlcXVlc3QASW52YWxpZCBtZXRob2QgZm9yIFJUU1AveC54IHJlcXVlc3QARXhwZWN0ZWQgU09VUkNFIG1ldGhvZCBmb3IgSUNFL3gueCByZXF1ZXN0AEludmFsaWQgY2hhciBpbiB1cmwgZnJhZ21lbnQgc3RhcnQARXhwZWN0ZWQgZG90AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fc3RhdHVzAEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8=' +module.exports = { + getResponseData, + getMockDispatch, + addMockDispatch, + deleteMockDispatch, + buildKey, + generateKeyValues, + matchValue, + getResponse, + getStatusText, + mockDispatch, + buildMockDispatch, + checkNetConnect, + buildMockOptions, + getHeaderByName +} /***/ }), -/***/ 95627: -/***/ ((module) => { +/***/ 86823: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCrLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC0kBAXsgAEEQav0MAAAAAAAAAAAAAAAAAAAAACIB/QsDACAAIAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AcsBygG4AckBuQHIAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBANwBC0EAIRAMxgELQQ4hEAzFAQtBDSEQDMQBC0EPIRAMwwELQRAhEAzCAQtBEyEQDMEBC0EUIRAMwAELQRUhEAy/AQtBFiEQDL4BC0EXIRAMvQELQRghEAy8AQtBGSEQDLsBC0EaIRAMugELQRshEAy5AQtBHCEQDLgBC0EIIRAMtwELQR0hEAy2AQtBICEQDLUBC0EfIRAMtAELQQchEAyzAQtBISEQDLIBC0EiIRAMsQELQR4hEAywAQtBIyEQDK8BC0ESIRAMrgELQREhEAytAQtBJCEQDKwBC0ElIRAMqwELQSYhEAyqAQtBJyEQDKkBC0HDASEQDKgBC0EpIRAMpwELQSshEAymAQtBLCEQDKUBC0EtIRAMpAELQS4hEAyjAQtBLyEQDKIBC0HEASEQDKEBC0EwIRAMoAELQTQhEAyfAQtBDCEQDJ4BC0ExIRAMnQELQTIhEAycAQtBMyEQDJsBC0E5IRAMmgELQTUhEAyZAQtBxQEhEAyYAQtBCyEQDJcBC0E6IRAMlgELQTYhEAyVAQtBCiEQDJQBC0E3IRAMkwELQTghEAySAQtBPCEQDJEBC0E7IRAMkAELQT0hEAyPAQtBCSEQDI4BC0EoIRAMjQELQT4hEAyMAQtBPyEQDIsBC0HAACEQDIoBC0HBACEQDIkBC0HCACEQDIgBC0HDACEQDIcBC0HEACEQDIYBC0HFACEQDIUBC0HGACEQDIQBC0EqIRAMgwELQccAIRAMggELQcgAIRAMgQELQckAIRAMgAELQcoAIRAMfwtBywAhEAx+C0HNACEQDH0LQcwAIRAMfAtBzgAhEAx7C0HPACEQDHoLQdAAIRAMeQtB0QAhEAx4C0HSACEQDHcLQdMAIRAMdgtB1AAhEAx1C0HWACEQDHQLQdUAIRAMcwtBBiEQDHILQdcAIRAMcQtBBSEQDHALQdgAIRAMbwtBBCEQDG4LQdkAIRAMbQtB2gAhEAxsC0HbACEQDGsLQdwAIRAMagtBAyEQDGkLQd0AIRAMaAtB3gAhEAxnC0HfACEQDGYLQeEAIRAMZQtB4AAhEAxkC0HiACEQDGMLQeMAIRAMYgtBAiEQDGELQeQAIRAMYAtB5QAhEAxfC0HmACEQDF4LQecAIRAMXQtB6AAhEAxcC0HpACEQDFsLQeoAIRAMWgtB6wAhEAxZC0HsACEQDFgLQe0AIRAMVwtB7gAhEAxWC0HvACEQDFULQfAAIRAMVAtB8QAhEAxTC0HyACEQDFILQfMAIRAMUQtB9AAhEAxQC0H1ACEQDE8LQfYAIRAMTgtB9wAhEAxNC0H4ACEQDEwLQfkAIRAMSwtB+gAhEAxKC0H7ACEQDEkLQfwAIRAMSAtB/QAhEAxHC0H+ACEQDEYLQf8AIRAMRQtBgAEhEAxEC0GBASEQDEMLQYIBIRAMQgtBgwEhEAxBC0GEASEQDEALQYUBIRAMPwtBhgEhEAw+C0GHASEQDD0LQYgBIRAMPAtBiQEhEAw7C0GKASEQDDoLQYsBIRAMOQtBjAEhEAw4C0GNASEQDDcLQY4BIRAMNgtBjwEhEAw1C0GQASEQDDQLQZEBIRAMMwtBkgEhEAwyC0GTASEQDDELQZQBIRAMMAtBlQEhEAwvC0GWASEQDC4LQZcBIRAMLQtBmAEhEAwsC0GZASEQDCsLQZoBIRAMKgtBmwEhEAwpC0GcASEQDCgLQZ0BIRAMJwtBngEhEAwmC0GfASEQDCULQaABIRAMJAtBoQEhEAwjC0GiASEQDCILQaMBIRAMIQtBpAEhEAwgC0GlASEQDB8LQaYBIRAMHgtBpwEhEAwdC0GoASEQDBwLQakBIRAMGwtBqgEhEAwaC0GrASEQDBkLQawBIRAMGAtBrQEhEAwXC0GuASEQDBYLQQEhEAwVC0GvASEQDBQLQbABIRAMEwtBsQEhEAwSC0GzASEQDBELQbIBIRAMEAtBtAEhEAwPC0G1ASEQDA4LQbYBIRAMDQtBtwEhEAwMC0G4ASEQDAsLQbkBIRAMCgtBugEhEAwJC0G7ASEQDAgLQcYBIRAMBwtBvAEhEAwGC0G9ASEQDAULQb4BIRAMBAtBvwEhEAwDC0HAASEQDAILQcIBIRAMAQtBwQEhEAsDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB4fICEjJSg/QEFERUZHSElKS0xNT1BRUlPeA1dZW1xdYGJlZmdoaWprbG1vcHFyc3R1dnd4eXp7fH1+gAGCAYUBhgGHAYkBiwGMAY0BjgGPAZABkQGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMBmQKkArAC/gL+AgsgASIEIAJHDfMBQd0BIRAM/wMLIAEiECACRw3dAUHDASEQDP4DCyABIgEgAkcNkAFB9wAhEAz9AwsgASIBIAJHDYYBQe8AIRAM/AMLIAEiASACRw1/QeoAIRAM+wMLIAEiASACRw17QegAIRAM+gMLIAEiASACRw14QeYAIRAM+QMLIAEiASACRw0aQRghEAz4AwsgASIBIAJHDRRBEiEQDPcDCyABIgEgAkcNWUHFACEQDPYDCyABIgEgAkcNSkE/IRAM9QMLIAEiASACRw1IQTwhEAz0AwsgASIBIAJHDUFBMSEQDPMDCyAALQAuQQFGDesDDIcCCyAAIAEiASACEMCAgIAAQQFHDeYBIABCADcDIAznAQsgACABIgEgAhC0gICAACIQDecBIAEhAQz1AgsCQCABIgEgAkcNAEEGIRAM8AMLIAAgAUEBaiIBIAIQu4CAgAAiEA3oASABIQEMMQsgAEIANwMgQRIhEAzVAwsgASIQIAJHDStBHSEQDO0DCwJAIAEiASACRg0AIAFBAWohAUEQIRAM1AMLQQchEAzsAwsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3lAUEIIRAM6wMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQRQhEAzSAwtBCSEQDOoDCyABIQEgACkDIFAN5AEgASEBDPICCwJAIAEiASACRw0AQQshEAzpAwsgACABQQFqIgEgAhC2gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeYBIAEhAQwNCyAAIAEiASACELqAgIAAIhAN5wEgASEBDPACCwJAIAEiASACRw0AQQ8hEAzlAwsgAS0AACIQQTtGDQggEEENRw3oASABQQFqIQEM7wILIAAgASIBIAIQuoCAgAAiEA3oASABIQEM8gILA0ACQCABLQAAQfC1gIAAai0AACIQQQFGDQAgEEECRw3rASAAKAIEIRAgAEEANgIEIAAgECABQQFqIgEQuYCAgAAiEA3qASABIQEM9AILIAFBAWoiASACRw0AC0ESIRAM4gMLIAAgASIBIAIQuoCAgAAiEA3pASABIQEMCgsgASIBIAJHDQZBGyEQDOADCwJAIAEiASACRw0AQRYhEAzgAwsgAEGKgICAADYCCCAAIAE2AgQgACABIAIQuICAgAAiEA3qASABIQFBICEQDMYDCwJAIAEiASACRg0AA0ACQCABLQAAQfC3gIAAai0AACIQQQJGDQACQCAQQX9qDgTlAewBAOsB7AELIAFBAWohAUEIIRAMyAMLIAFBAWoiASACRw0AC0EVIRAM3wMLQRUhEAzeAwsDQAJAIAEtAABB8LmAgABqLQAAIhBBAkYNACAQQX9qDgTeAewB4AHrAewBCyABQQFqIgEgAkcNAAtBGCEQDN0DCwJAIAEiASACRg0AIABBi4CAgAA2AgggACABNgIEIAEhAUEHIRAMxAMLQRkhEAzcAwsgAUEBaiEBDAILAkAgASIUIAJHDQBBGiEQDNsDCyAUIQECQCAULQAAQXNqDhTdAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAgDuAgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQM2gMLAkAgAS0AACIQQTtGDQAgEEENRw3oASABQQFqIQEM5QILIAFBAWohAQtBIiEQDL8DCwJAIAEiECACRw0AQRwhEAzYAwtCACERIBAhASAQLQAAQVBqDjfnAeYBAQIDBAUGBwgAAAAAAAAACQoLDA0OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBESExQAC0EeIRAMvQMLQgIhEQzlAQtCAyERDOQBC0IEIREM4wELQgUhEQziAQtCBiERDOEBC0IHIREM4AELQgghEQzfAQtCCSERDN4BC0IKIREM3QELQgshEQzcAQtCDCERDNsBC0INIREM2gELQg4hEQzZAQtCDyERDNgBC0IKIREM1wELQgshEQzWAQtCDCERDNUBC0INIREM1AELQg4hEQzTAQtCDyERDNIBC0IAIRECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAtAABBUGoON+UB5AEAAQIDBAUGB+YB5gHmAeYB5gHmAeYBCAkKCwwN5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAQ4PEBESE+YBC0ICIREM5AELQgMhEQzjAQtCBCERDOIBC0IFIREM4QELQgYhEQzgAQtCByERDN8BC0IIIREM3gELQgkhEQzdAQtCCiERDNwBC0ILIREM2wELQgwhEQzaAQtCDSERDNkBC0IOIREM2AELQg8hEQzXAQtCCiERDNYBC0ILIREM1QELQgwhEQzUAQtCDSERDNMBC0IOIREM0gELQg8hEQzRAQsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3SAUEfIRAMwAMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQSQhEAynAwtBICEQDL8DCyAAIAEiECACEL6AgIAAQX9qDgW2AQDFAgHRAdIBC0ERIRAMpAMLIABBAToALyAQIQEMuwMLIAEiASACRw3SAUEkIRAMuwMLIAEiDSACRw0eQcYAIRAMugMLIAAgASIBIAIQsoCAgAAiEA3UASABIQEMtQELIAEiECACRw0mQdAAIRAMuAMLAkAgASIBIAJHDQBBKCEQDLgDCyAAQQA2AgQgAEGMgICAADYCCCAAIAEgARCxgICAACIQDdMBIAEhAQzYAQsCQCABIhAgAkcNAEEpIRAMtwMLIBAtAAAiAUEgRg0UIAFBCUcN0wEgEEEBaiEBDBULAkAgASIBIAJGDQAgAUEBaiEBDBcLQSohEAy1AwsCQCABIhAgAkcNAEErIRAMtQMLAkAgEC0AACIBQQlGDQAgAUEgRw3VAQsgAC0ALEEIRg3TASAQIQEMkQMLAkAgASIBIAJHDQBBLCEQDLQDCyABLQAAQQpHDdUBIAFBAWohAQzJAgsgASIOIAJHDdUBQS8hEAyyAwsDQAJAIAEtAAAiEEEgRg0AAkAgEEF2ag4EANwB3AEA2gELIAEhAQzgAQsgAUEBaiIBIAJHDQALQTEhEAyxAwtBMiEQIAEiFCACRg2wAyACIBRrIAAoAgAiAWohFSAUIAFrQQNqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB8LuAgABqLQAARw0BAkAgAUEDRw0AQQYhAQyWAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMsQMLIABBADYCACAUIQEM2QELQTMhECABIhQgAkYNrwMgAiAUayAAKAIAIgFqIRUgFCABa0EIaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfS7gIAAai0AAEcNAQJAIAFBCEcNAEEFIQEMlQMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLADCyAAQQA2AgAgFCEBDNgBC0E0IRAgASIUIAJGDa4DIAIgFGsgACgCACIBaiEVIBQgAWtBBWohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUHQwoCAAGotAABHDQECQCABQQVHDQBBByEBDJQDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAyvAwsgAEEANgIAIBQhAQzXAQsCQCABIgEgAkYNAANAAkAgAS0AAEGAvoCAAGotAAAiEEEBRg0AIBBBAkYNCiABIQEM3QELIAFBAWoiASACRw0AC0EwIRAMrgMLQTAhEAytAwsCQCABIgEgAkYNAANAAkAgAS0AACIQQSBGDQAgEEF2ag4E2QHaAdoB2QHaAQsgAUEBaiIBIAJHDQALQTghEAytAwtBOCEQDKwDCwNAAkAgAS0AACIQQSBGDQAgEEEJRw0DCyABQQFqIgEgAkcNAAtBPCEQDKsDCwNAAkAgAS0AACIQQSBGDQACQAJAIBBBdmoOBNoBAQHaAQALIBBBLEYN2wELIAEhAQwECyABQQFqIgEgAkcNAAtBPyEQDKoDCyABIQEM2wELQcAAIRAgASIUIAJGDagDIAIgFGsgACgCACIBaiEWIBQgAWtBBmohFwJAA0AgFC0AAEEgciABQYDAgIAAai0AAEcNASABQQZGDY4DIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADKkDCyAAQQA2AgAgFCEBC0E2IRAMjgMLAkAgASIPIAJHDQBBwQAhEAynAwsgAEGMgICAADYCCCAAIA82AgQgDyEBIAAtACxBf2oOBM0B1QHXAdkBhwMLIAFBAWohAQzMAQsCQCABIgEgAkYNAANAAkAgAS0AACIQQSByIBAgEEG/f2pB/wFxQRpJG0H/AXEiEEEJRg0AIBBBIEYNAAJAAkACQAJAIBBBnX9qDhMAAwMDAwMDAwEDAwMDAwMDAwMCAwsgAUEBaiEBQTEhEAyRAwsgAUEBaiEBQTIhEAyQAwsgAUEBaiEBQTMhEAyPAwsgASEBDNABCyABQQFqIgEgAkcNAAtBNSEQDKUDC0E1IRAMpAMLAkAgASIBIAJGDQADQAJAIAEtAABBgLyAgABqLQAAQQFGDQAgASEBDNMBCyABQQFqIgEgAkcNAAtBPSEQDKQDC0E9IRAMowMLIAAgASIBIAIQsICAgAAiEA3WASABIQEMAQsgEEEBaiEBC0E8IRAMhwMLAkAgASIBIAJHDQBBwgAhEAygAwsCQANAAkAgAS0AAEF3ag4YAAL+Av4ChAP+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gIA/gILIAFBAWoiASACRw0AC0HCACEQDKADCyABQQFqIQEgAC0ALUEBcUUNvQEgASEBC0EsIRAMhQMLIAEiASACRw3TAUHEACEQDJ0DCwNAAkAgAS0AAEGQwICAAGotAABBAUYNACABIQEMtwILIAFBAWoiASACRw0AC0HFACEQDJwDCyANLQAAIhBBIEYNswEgEEE6Rw2BAyAAKAIEIQEgAEEANgIEIAAgASANEK+AgIAAIgEN0AEgDUEBaiEBDLMCC0HHACEQIAEiDSACRg2aAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQZDCgIAAai0AAEcNgAMgAUEFRg30AiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyaAwtByAAhECABIg0gAkYNmQMgAiANayAAKAIAIgFqIRYgDSABa0EJaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGWwoCAAGotAABHDf8CAkAgAUEJRw0AQQIhAQz1AgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmQMLAkAgASINIAJHDQBByQAhEAyZAwsCQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZJ/ag4HAIADgAOAA4ADgAMBgAMLIA1BAWohAUE+IRAMgAMLIA1BAWohAUE/IRAM/wILQcoAIRAgASINIAJGDZcDIAIgDWsgACgCACIBaiEWIA0gAWtBAWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBoMKAgABqLQAARw39AiABQQFGDfACIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJcDC0HLACEQIAEiDSACRg2WAyACIA1rIAAoAgAiAWohFiANIAFrQQ5qIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaLCgIAAai0AAEcN/AIgAUEORg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyWAwtBzAAhECABIg0gAkYNlQMgAiANayAAKAIAIgFqIRYgDSABa0EPaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUHAwoCAAGotAABHDfsCAkAgAUEPRw0AQQMhAQzxAgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlQMLQc0AIRAgASINIAJGDZQDIAIgDWsgACgCACIBaiEWIA0gAWtBBWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw36AgJAIAFBBUcNAEEEIQEM8AILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJQDCwJAIAEiDSACRw0AQc4AIRAMlAMLAkACQAJAAkAgDS0AACIBQSByIAEgAUG/f2pB/wFxQRpJG0H/AXFBnX9qDhMA/QL9Av0C/QL9Av0C/QL9Av0C/QL9Av0CAf0C/QL9AgID/QILIA1BAWohAUHBACEQDP0CCyANQQFqIQFBwgAhEAz8AgsgDUEBaiEBQcMAIRAM+wILIA1BAWohAUHEACEQDPoCCwJAIAEiASACRg0AIABBjYCAgAA2AgggACABNgIEIAEhAUHFACEQDPoCC0HPACEQDJIDCyAQIQECQAJAIBAtAABBdmoOBAGoAqgCAKgCCyAQQQFqIQELQSchEAz4AgsCQCABIgEgAkcNAEHRACEQDJEDCwJAIAEtAABBIEYNACABIQEMjQELIAFBAWohASAALQAtQQFxRQ3HASABIQEMjAELIAEiFyACRw3IAUHSACEQDI8DC0HTACEQIAEiFCACRg2OAyACIBRrIAAoAgAiAWohFiAUIAFrQQFqIRcDQCAULQAAIAFB1sKAgABqLQAARw3MASABQQFGDccBIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADI4DCwJAIAEiASACRw0AQdUAIRAMjgMLIAEtAABBCkcNzAEgAUEBaiEBDMcBCwJAIAEiASACRw0AQdYAIRAMjQMLAkACQCABLQAAQXZqDgQAzQHNAQHNAQsgAUEBaiEBDMcBCyABQQFqIQFBygAhEAzzAgsgACABIgEgAhCugICAACIQDcsBIAEhAUHNACEQDPICCyAALQApQSJGDYUDDKYCCwJAIAEiASACRw0AQdsAIRAMigMLQQAhFEEBIRdBASEWQQAhEAJAAkACQAJAAkACQAJAAkACQCABLQAAQVBqDgrUAdMBAAECAwQFBgjVAQtBAiEQDAYLQQMhEAwFC0EEIRAMBAtBBSEQDAMLQQYhEAwCC0EHIRAMAQtBCCEQC0EAIRdBACEWQQAhFAzMAQtBCSEQQQEhFEEAIRdBACEWDMsBCwJAIAEiASACRw0AQd0AIRAMiQMLIAEtAABBLkcNzAEgAUEBaiEBDKYCCyABIgEgAkcNzAFB3wAhEAyHAwsCQCABIgEgAkYNACAAQY6AgIAANgIIIAAgATYCBCABIQFB0AAhEAzuAgtB4AAhEAyGAwtB4QAhECABIgEgAkYNhQMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQeLCgIAAai0AAEcNzQEgFEEDRg3MASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyFAwtB4gAhECABIgEgAkYNhAMgAiABayAAKAIAIhRqIRYgASAUa0ECaiEXA0AgAS0AACAUQebCgIAAai0AAEcNzAEgFEECRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyEAwtB4wAhECABIgEgAkYNgwMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQenCgIAAai0AAEcNywEgFEEDRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyDAwsCQCABIgEgAkcNAEHlACEQDIMDCyAAIAFBAWoiASACEKiAgIAAIhANzQEgASEBQdYAIRAM6QILAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AAkACQAJAIBBBuH9qDgsAAc8BzwHPAc8BzwHPAc8BzwECzwELIAFBAWohAUHSACEQDO0CCyABQQFqIQFB0wAhEAzsAgsgAUEBaiEBQdQAIRAM6wILIAFBAWoiASACRw0AC0HkACEQDIIDC0HkACEQDIEDCwNAAkAgAS0AAEHwwoCAAGotAAAiEEEBRg0AIBBBfmoOA88B0AHRAdIBCyABQQFqIgEgAkcNAAtB5gAhEAyAAwsCQCABIgEgAkYNACABQQFqIQEMAwtB5wAhEAz/AgsDQAJAIAEtAABB8MSAgABqLQAAIhBBAUYNAAJAIBBBfmoOBNIB0wHUAQDVAQsgASEBQdcAIRAM5wILIAFBAWoiASACRw0AC0HoACEQDP4CCwJAIAEiASACRw0AQekAIRAM/gILAkAgAS0AACIQQXZqDhq6AdUB1QG8AdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAcoB1QHVAQDTAQsgAUEBaiEBC0EGIRAM4wILA0ACQCABLQAAQfDGgIAAai0AAEEBRg0AIAEhAQyeAgsgAUEBaiIBIAJHDQALQeoAIRAM+wILAkAgASIBIAJGDQAgAUEBaiEBDAMLQesAIRAM+gILAkAgASIBIAJHDQBB7AAhEAz6AgsgAUEBaiEBDAELAkAgASIBIAJHDQBB7QAhEAz5AgsgAUEBaiEBC0EEIRAM3gILAkAgASIUIAJHDQBB7gAhEAz3AgsgFCEBAkACQAJAIBQtAABB8MiAgABqLQAAQX9qDgfUAdUB1gEAnAIBAtcBCyAUQQFqIQEMCgsgFEEBaiEBDM0BC0EAIRAgAEEANgIcIABBm5KAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAz2AgsCQANAAkAgAS0AAEHwyICAAGotAAAiEEEERg0AAkACQCAQQX9qDgfSAdMB1AHZAQAEAdkBCyABIQFB2gAhEAzgAgsgAUEBaiEBQdwAIRAM3wILIAFBAWoiASACRw0AC0HvACEQDPYCCyABQQFqIQEMywELAkAgASIUIAJHDQBB8AAhEAz1AgsgFC0AAEEvRw3UASAUQQFqIQEMBgsCQCABIhQgAkcNAEHxACEQDPQCCwJAIBQtAAAiAUEvRw0AIBRBAWohAUHdACEQDNsCCyABQXZqIgRBFksN0wFBASAEdEGJgIACcUUN0wEMygILAkAgASIBIAJGDQAgAUEBaiEBQd4AIRAM2gILQfIAIRAM8gILAkAgASIUIAJHDQBB9AAhEAzyAgsgFCEBAkAgFC0AAEHwzICAAGotAABBf2oOA8kClAIA1AELQeEAIRAM2AILAkAgASIUIAJGDQADQAJAIBQtAABB8MqAgABqLQAAIgFBA0YNAAJAIAFBf2oOAssCANUBCyAUIQFB3wAhEAzaAgsgFEEBaiIUIAJHDQALQfMAIRAM8QILQfMAIRAM8AILAkAgASIBIAJGDQAgAEGPgICAADYCCCAAIAE2AgQgASEBQeAAIRAM1wILQfUAIRAM7wILAkAgASIBIAJHDQBB9gAhEAzvAgsgAEGPgICAADYCCCAAIAE2AgQgASEBC0EDIRAM1AILA0AgAS0AAEEgRw3DAiABQQFqIgEgAkcNAAtB9wAhEAzsAgsCQCABIgEgAkcNAEH4ACEQDOwCCyABLQAAQSBHDc4BIAFBAWohAQzvAQsgACABIgEgAhCsgICAACIQDc4BIAEhAQyOAgsCQCABIgQgAkcNAEH6ACEQDOoCCyAELQAAQcwARw3RASAEQQFqIQFBEyEQDM8BCwJAIAEiBCACRw0AQfsAIRAM6QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEANAIAQtAAAgAUHwzoCAAGotAABHDdABIAFBBUYNzgEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBB+wAhEAzoAgsCQCABIgQgAkcNAEH8ACEQDOgCCwJAAkAgBC0AAEG9f2oODADRAdEB0QHRAdEB0QHRAdEB0QHRAQHRAQsgBEEBaiEBQeYAIRAMzwILIARBAWohAUHnACEQDM4CCwJAIAEiBCACRw0AQf0AIRAM5wILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNzwEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf0AIRAM5wILIABBADYCACAQQQFqIQFBECEQDMwBCwJAIAEiBCACRw0AQf4AIRAM5gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQfbOgIAAai0AAEcNzgEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf4AIRAM5gILIABBADYCACAQQQFqIQFBFiEQDMsBCwJAIAEiBCACRw0AQf8AIRAM5QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQfzOgIAAai0AAEcNzQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf8AIRAM5QILIABBADYCACAQQQFqIQFBBSEQDMoBCwJAIAEiBCACRw0AQYABIRAM5AILIAQtAABB2QBHDcsBIARBAWohAUEIIRAMyQELAkAgASIEIAJHDQBBgQEhEAzjAgsCQAJAIAQtAABBsn9qDgMAzAEBzAELIARBAWohAUHrACEQDMoCCyAEQQFqIQFB7AAhEAzJAgsCQCABIgQgAkcNAEGCASEQDOICCwJAAkAgBC0AAEG4f2oOCADLAcsBywHLAcsBywEBywELIARBAWohAUHqACEQDMkCCyAEQQFqIQFB7QAhEAzIAgsCQCABIgQgAkcNAEGDASEQDOECCyACIARrIAAoAgAiAWohECAEIAFrQQJqIRQCQANAIAQtAAAgAUGAz4CAAGotAABHDckBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgEDYCAEGDASEQDOECC0EAIRAgAEEANgIAIBRBAWohAQzGAQsCQCABIgQgAkcNAEGEASEQDOACCyACIARrIAAoAgAiAWohFCAEIAFrQQRqIRACQANAIAQtAAAgAUGDz4CAAGotAABHDcgBIAFBBEYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGEASEQDOACCyAAQQA2AgAgEEEBaiEBQSMhEAzFAQsCQCABIgQgAkcNAEGFASEQDN8CCwJAAkAgBC0AAEG0f2oOCADIAcgByAHIAcgByAEByAELIARBAWohAUHvACEQDMYCCyAEQQFqIQFB8AAhEAzFAgsCQCABIgQgAkcNAEGGASEQDN4CCyAELQAAQcUARw3FASAEQQFqIQEMgwILAkAgASIEIAJHDQBBhwEhEAzdAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBiM+AgABqLQAARw3FASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhwEhEAzdAgsgAEEANgIAIBBBAWohAUEtIRAMwgELAkAgASIEIAJHDQBBiAEhEAzcAgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw3EASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiAEhEAzcAgsgAEEANgIAIBBBAWohAUEpIRAMwQELAkAgASIBIAJHDQBBiQEhEAzbAgtBASEQIAEtAABB3wBHDcABIAFBAWohAQyBAgsCQCABIgQgAkcNAEGKASEQDNoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRADQCAELQAAIAFBjM+AgABqLQAARw3BASABQQFGDa8CIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYoBIRAM2QILAkAgASIEIAJHDQBBiwEhEAzZAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBjs+AgABqLQAARw3BASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiwEhEAzZAgsgAEEANgIAIBBBAWohAUECIRAMvgELAkAgASIEIAJHDQBBjAEhEAzYAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw3AASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjAEhEAzYAgsgAEEANgIAIBBBAWohAUEfIRAMvQELAkAgASIEIAJHDQBBjQEhEAzXAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8s+AgABqLQAARw2/ASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjQEhEAzXAgsgAEEANgIAIBBBAWohAUEJIRAMvAELAkAgASIEIAJHDQBBjgEhEAzWAgsCQAJAIAQtAABBt39qDgcAvwG/Ab8BvwG/AQG/AQsgBEEBaiEBQfgAIRAMvQILIARBAWohAUH5ACEQDLwCCwJAIAEiBCACRw0AQY8BIRAM1QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQZHPgIAAai0AAEcNvQEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY8BIRAM1QILIABBADYCACAQQQFqIQFBGCEQDLoBCwJAIAEiBCACRw0AQZABIRAM1AILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQZfPgIAAai0AAEcNvAEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZABIRAM1AILIABBADYCACAQQQFqIQFBFyEQDLkBCwJAIAEiBCACRw0AQZEBIRAM0wILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQZrPgIAAai0AAEcNuwEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZEBIRAM0wILIABBADYCACAQQQFqIQFBFSEQDLgBCwJAIAEiBCACRw0AQZIBIRAM0gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQaHPgIAAai0AAEcNugEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZIBIRAM0gILIABBADYCACAQQQFqIQFBHiEQDLcBCwJAIAEiBCACRw0AQZMBIRAM0QILIAQtAABBzABHDbgBIARBAWohAUEKIRAMtgELAkAgBCACRw0AQZQBIRAM0AILAkACQCAELQAAQb9/ag4PALkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AbkBAbkBCyAEQQFqIQFB/gAhEAy3AgsgBEEBaiEBQf8AIRAMtgILAkAgBCACRw0AQZUBIRAMzwILAkACQCAELQAAQb9/ag4DALgBAbgBCyAEQQFqIQFB/QAhEAy2AgsgBEEBaiEEQYABIRAMtQILAkAgBCACRw0AQZYBIRAMzgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQafPgIAAai0AAEcNtgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZYBIRAMzgILIABBADYCACAQQQFqIQFBCyEQDLMBCwJAIAQgAkcNAEGXASEQDM0CCwJAAkACQAJAIAQtAABBU2oOIwC4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBAbgBuAG4AbgBuAECuAG4AbgBA7gBCyAEQQFqIQFB+wAhEAy2AgsgBEEBaiEBQfwAIRAMtQILIARBAWohBEGBASEQDLQCCyAEQQFqIQRBggEhEAyzAgsCQCAEIAJHDQBBmAEhEAzMAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBqc+AgABqLQAARw20ASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmAEhEAzMAgsgAEEANgIAIBBBAWohAUEZIRAMsQELAkAgBCACRw0AQZkBIRAMywILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQa7PgIAAai0AAEcNswEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZkBIRAMywILIABBADYCACAQQQFqIQFBBiEQDLABCwJAIAQgAkcNAEGaASEQDMoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG0z4CAAGotAABHDbIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGaASEQDMoCCyAAQQA2AgAgEEEBaiEBQRwhEAyvAQsCQCAEIAJHDQBBmwEhEAzJAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBts+AgABqLQAARw2xASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmwEhEAzJAgsgAEEANgIAIBBBAWohAUEnIRAMrgELAkAgBCACRw0AQZwBIRAMyAILAkACQCAELQAAQax/ag4CAAGxAQsgBEEBaiEEQYYBIRAMrwILIARBAWohBEGHASEQDK4CCwJAIAQgAkcNAEGdASEQDMcCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG4z4CAAGotAABHDa8BIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGdASEQDMcCCyAAQQA2AgAgEEEBaiEBQSYhEAysAQsCQCAEIAJHDQBBngEhEAzGAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBus+AgABqLQAARw2uASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBngEhEAzGAgsgAEEANgIAIBBBAWohAUEDIRAMqwELAkAgBCACRw0AQZ8BIRAMxQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNrQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ8BIRAMxQILIABBADYCACAQQQFqIQFBDCEQDKoBCwJAIAQgAkcNAEGgASEQDMQCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUG8z4CAAGotAABHDawBIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGgASEQDMQCCyAAQQA2AgAgEEEBaiEBQQ0hEAypAQsCQCAEIAJHDQBBoQEhEAzDAgsCQAJAIAQtAABBun9qDgsArAGsAawBrAGsAawBrAGsAawBAawBCyAEQQFqIQRBiwEhEAyqAgsgBEEBaiEEQYwBIRAMqQILAkAgBCACRw0AQaIBIRAMwgILIAQtAABB0ABHDakBIARBAWohBAzpAQsCQCAEIAJHDQBBowEhEAzBAgsCQAJAIAQtAABBt39qDgcBqgGqAaoBqgGqAQCqAQsgBEEBaiEEQY4BIRAMqAILIARBAWohAUEiIRAMpgELAkAgBCACRw0AQaQBIRAMwAILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQcDPgIAAai0AAEcNqAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaQBIRAMwAILIABBADYCACAQQQFqIQFBHSEQDKUBCwJAIAQgAkcNAEGlASEQDL8CCwJAAkAgBC0AAEGuf2oOAwCoAQGoAQsgBEEBaiEEQZABIRAMpgILIARBAWohAUEEIRAMpAELAkAgBCACRw0AQaYBIRAMvgILAkACQAJAAkACQCAELQAAQb9/ag4VAKoBqgGqAaoBqgGqAaoBqgGqAaoBAaoBqgECqgGqAQOqAaoBBKoBCyAEQQFqIQRBiAEhEAyoAgsgBEEBaiEEQYkBIRAMpwILIARBAWohBEGKASEQDKYCCyAEQQFqIQRBjwEhEAylAgsgBEEBaiEEQZEBIRAMpAILAkAgBCACRw0AQacBIRAMvQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNpQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQacBIRAMvQILIABBADYCACAQQQFqIQFBESEQDKIBCwJAIAQgAkcNAEGoASEQDLwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHCz4CAAGotAABHDaQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGoASEQDLwCCyAAQQA2AgAgEEEBaiEBQSwhEAyhAQsCQCAEIAJHDQBBqQEhEAy7AgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBxc+AgABqLQAARw2jASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqQEhEAy7AgsgAEEANgIAIBBBAWohAUErIRAMoAELAkAgBCACRw0AQaoBIRAMugILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQcrPgIAAai0AAEcNogEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaoBIRAMugILIABBADYCACAQQQFqIQFBFCEQDJ8BCwJAIAQgAkcNAEGrASEQDLkCCwJAAkACQAJAIAQtAABBvn9qDg8AAQKkAaQBpAGkAaQBpAGkAaQBpAGkAaQBA6QBCyAEQQFqIQRBkwEhEAyiAgsgBEEBaiEEQZQBIRAMoQILIARBAWohBEGVASEQDKACCyAEQQFqIQRBlgEhEAyfAgsCQCAEIAJHDQBBrAEhEAy4AgsgBC0AAEHFAEcNnwEgBEEBaiEEDOABCwJAIAQgAkcNAEGtASEQDLcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHNz4CAAGotAABHDZ8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGtASEQDLcCCyAAQQA2AgAgEEEBaiEBQQ4hEAycAQsCQCAEIAJHDQBBrgEhEAy2AgsgBC0AAEHQAEcNnQEgBEEBaiEBQSUhEAybAQsCQCAEIAJHDQBBrwEhEAy1AgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw2dASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrwEhEAy1AgsgAEEANgIAIBBBAWohAUEqIRAMmgELAkAgBCACRw0AQbABIRAMtAILAkACQCAELQAAQat/ag4LAJ0BnQGdAZ0BnQGdAZ0BnQGdAQGdAQsgBEEBaiEEQZoBIRAMmwILIARBAWohBEGbASEQDJoCCwJAIAQgAkcNAEGxASEQDLMCCwJAAkAgBC0AAEG/f2oOFACcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAEBnAELIARBAWohBEGZASEQDJoCCyAEQQFqIQRBnAEhEAyZAgsCQCAEIAJHDQBBsgEhEAyyAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFB2c+AgABqLQAARw2aASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBsgEhEAyyAgsgAEEANgIAIBBBAWohAUEhIRAMlwELAkAgBCACRw0AQbMBIRAMsQILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQd3PgIAAai0AAEcNmQEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbMBIRAMsQILIABBADYCACAQQQFqIQFBGiEQDJYBCwJAIAQgAkcNAEG0ASEQDLACCwJAAkACQCAELQAAQbt/ag4RAJoBmgGaAZoBmgGaAZoBmgGaAQGaAZoBmgGaAZoBApoBCyAEQQFqIQRBnQEhEAyYAgsgBEEBaiEEQZ4BIRAMlwILIARBAWohBEGfASEQDJYCCwJAIAQgAkcNAEG1ASEQDK8CCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUHkz4CAAGotAABHDZcBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG1ASEQDK8CCyAAQQA2AgAgEEEBaiEBQSghEAyUAQsCQCAEIAJHDQBBtgEhEAyuAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB6s+AgABqLQAARw2WASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtgEhEAyuAgsgAEEANgIAIBBBAWohAUEHIRAMkwELAkAgBCACRw0AQbcBIRAMrQILAkACQCAELQAAQbt/ag4OAJYBlgGWAZYBlgGWAZYBlgGWAZYBlgGWAQGWAQsgBEEBaiEEQaEBIRAMlAILIARBAWohBEGiASEQDJMCCwJAIAQgAkcNAEG4ASEQDKwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDZQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG4ASEQDKwCCyAAQQA2AgAgEEEBaiEBQRIhEAyRAQsCQCAEIAJHDQBBuQEhEAyrAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw2TASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuQEhEAyrAgsgAEEANgIAIBBBAWohAUEgIRAMkAELAkAgBCACRw0AQboBIRAMqgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNkgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQboBIRAMqgILIABBADYCACAQQQFqIQFBDyEQDI8BCwJAIAQgAkcNAEG7ASEQDKkCCwJAAkAgBC0AAEG3f2oOBwCSAZIBkgGSAZIBAZIBCyAEQQFqIQRBpQEhEAyQAgsgBEEBaiEEQaYBIRAMjwILAkAgBCACRw0AQbwBIRAMqAILIAIgBGsgACgCACIBaiEUIAQgAWtBB2ohEAJAA0AgBC0AACABQfTPgIAAai0AAEcNkAEgAUEHRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbwBIRAMqAILIABBADYCACAQQQFqIQFBGyEQDI0BCwJAIAQgAkcNAEG9ASEQDKcCCwJAAkACQCAELQAAQb5/ag4SAJEBkQGRAZEBkQGRAZEBkQGRAQGRAZEBkQGRAZEBkQECkQELIARBAWohBEGkASEQDI8CCyAEQQFqIQRBpwEhEAyOAgsgBEEBaiEEQagBIRAMjQILAkAgBCACRw0AQb4BIRAMpgILIAQtAABBzgBHDY0BIARBAWohBAzPAQsCQCAEIAJHDQBBvwEhEAylAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAELQAAQb9/ag4VAAECA5wBBAUGnAGcAZwBBwgJCgucAQwNDg+cAQsgBEEBaiEBQegAIRAMmgILIARBAWohAUHpACEQDJkCCyAEQQFqIQFB7gAhEAyYAgsgBEEBaiEBQfIAIRAMlwILIARBAWohAUHzACEQDJYCCyAEQQFqIQFB9gAhEAyVAgsgBEEBaiEBQfcAIRAMlAILIARBAWohAUH6ACEQDJMCCyAEQQFqIQRBgwEhEAySAgsgBEEBaiEEQYQBIRAMkQILIARBAWohBEGFASEQDJACCyAEQQFqIQRBkgEhEAyPAgsgBEEBaiEEQZgBIRAMjgILIARBAWohBEGgASEQDI0CCyAEQQFqIQRBowEhEAyMAgsgBEEBaiEEQaoBIRAMiwILAkAgBCACRg0AIABBkICAgAA2AgggACAENgIEQasBIRAMiwILQcABIRAMowILIAAgBSACEKqAgIAAIgENiwEgBSEBDFwLAkAgBiACRg0AIAZBAWohBQyNAQtBwgEhEAyhAgsDQAJAIBAtAABBdmoOBIwBAACPAQALIBBBAWoiECACRw0AC0HDASEQDKACCwJAIAcgAkYNACAAQZGAgIAANgIIIAAgBzYCBCAHIQFBASEQDIcCC0HEASEQDJ8CCwJAIAcgAkcNAEHFASEQDJ8CCwJAAkAgBy0AAEF2ag4EAc4BzgEAzgELIAdBAWohBgyNAQsgB0EBaiEFDIkBCwJAIAcgAkcNAEHGASEQDJ4CCwJAAkAgBy0AAEF2ag4XAY8BjwEBjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAI8BCyAHQQFqIQcLQbABIRAMhAILAkAgCCACRw0AQcgBIRAMnQILIAgtAABBIEcNjQEgAEEAOwEyIAhBAWohAUGzASEQDIMCCyABIRcCQANAIBciByACRg0BIActAABBUGpB/wFxIhBBCk8NzAECQCAALwEyIhRBmTNLDQAgACAUQQpsIhQ7ATIgEEH//wNzIBRB/v8DcUkNACAHQQFqIRcgACAUIBBqIhA7ATIgEEH//wNxQegHSQ0BCwtBACEQIABBADYCHCAAQcGJgIAANgIQIABBDTYCDCAAIAdBAWo2AhQMnAILQccBIRAMmwILIAAgCCACEK6AgIAAIhBFDcoBIBBBFUcNjAEgAEHIATYCHCAAIAg2AhQgAEHJl4CAADYCECAAQRU2AgxBACEQDJoCCwJAIAkgAkcNAEHMASEQDJoCC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgCS0AAEFQag4KlgGVAQABAgMEBQYIlwELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMjgELQQkhEEEBIRRBACEXQQAhFgyNAQsCQCAKIAJHDQBBzgEhEAyZAgsgCi0AAEEuRw2OASAKQQFqIQkMygELIAsgAkcNjgFB0AEhEAyXAgsCQCALIAJGDQAgAEGOgICAADYCCCAAIAs2AgRBtwEhEAz+AQtB0QEhEAyWAgsCQCAEIAJHDQBB0gEhEAyWAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EEaiELA0AgBC0AACAQQfzPgIAAai0AAEcNjgEgEEEERg3pASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHSASEQDJUCCyAAIAwgAhCsgICAACIBDY0BIAwhAQy4AQsCQCAEIAJHDQBB1AEhEAyUAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EBaiEMA0AgBC0AACAQQYHQgIAAai0AAEcNjwEgEEEBRg2OASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHUASEQDJMCCwJAIAQgAkcNAEHWASEQDJMCCyACIARrIAAoAgAiEGohFCAEIBBrQQJqIQsDQCAELQAAIBBBg9CAgABqLQAARw2OASAQQQJGDZABIBBBAWohECAEQQFqIgQgAkcNAAsgACAUNgIAQdYBIRAMkgILAkAgBCACRw0AQdcBIRAMkgILAkACQCAELQAAQbt/ag4QAI8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwEBjwELIARBAWohBEG7ASEQDPkBCyAEQQFqIQRBvAEhEAz4AQsCQCAEIAJHDQBB2AEhEAyRAgsgBC0AAEHIAEcNjAEgBEEBaiEEDMQBCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEG+ASEQDPcBC0HZASEQDI8CCwJAIAQgAkcNAEHaASEQDI8CCyAELQAAQcgARg3DASAAQQE6ACgMuQELIABBAjoALyAAIAQgAhCmgICAACIQDY0BQcIBIRAM9AELIAAtAChBf2oOArcBuQG4AQsDQAJAIAQtAABBdmoOBACOAY4BAI4BCyAEQQFqIgQgAkcNAAtB3QEhEAyLAgsgAEEAOgAvIAAtAC1BBHFFDYQCCyAAQQA6AC8gAEEBOgA0IAEhAQyMAQsgEEEVRg3aASAAQQA2AhwgACABNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAyIAgsCQCAAIBAgAhC0gICAACIEDQAgECEBDIECCwJAIARBFUcNACAAQQM2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAyIAgsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMhwILIBBBFUYN1gEgAEEANgIcIAAgATYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMhgILIAAoAgQhFyAAQQA2AgQgECARp2oiFiEBIAAgFyAQIBYgFBsiEBC1gICAACIURQ2NASAAQQc2AhwgACAQNgIUIAAgFDYCDEEAIRAMhQILIAAgAC8BMEGAAXI7ATAgASEBC0EqIRAM6gELIBBBFUYN0QEgAEEANgIcIAAgATYCFCAAQYOMgIAANgIQIABBEzYCDEEAIRAMggILIBBBFUYNzwEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAMgQILIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDI0BCyAAQQw2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMgAILIBBBFUYNzAEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM/wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIwBCyAAQQ02AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/gELIBBBFUYNyQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM/QELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIsBCyAAQQ42AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/AELIABBADYCHCAAIAE2AhQgAEHAlYCAADYCECAAQQI2AgxBACEQDPsBCyAQQRVGDcUBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPoBCyAAQRA2AhwgACABNgIUIAAgEDYCDEEAIRAM+QELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDPEBCyAAQRE2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM+AELIBBBFUYNwQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM9wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIgBCyAAQRM2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM9gELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDO0BCyAAQRQ2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM9QELIBBBFUYNvQEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM9AELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIYBCyAAQRY2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM8wELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC3gICAACIEDQAgAUEBaiEBDOkBCyAAQRc2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM8gELIABBADYCHCAAIAE2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDPEBC0IBIRELIBBBAWohAQJAIAApAyAiEkL//////////w9WDQAgACASQgSGIBGENwMgIAEhAQyEAQsgAEEANgIcIAAgATYCFCAAQa2JgIAANgIQIABBDDYCDEEAIRAM7wELIABBADYCHCAAIBA2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDO4BCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNcyAAQQU2AhwgACAQNgIUIAAgFDYCDEEAIRAM7QELIABBADYCHCAAIBA2AhQgAEGqnICAADYCECAAQQ82AgxBACEQDOwBCyAAIBAgAhC0gICAACIBDQEgECEBC0EOIRAM0QELAkAgAUEVRw0AIABBAjYCHCAAIBA2AhQgAEGwmICAADYCECAAQRU2AgxBACEQDOoBCyAAQQA2AhwgACAQNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAzpAQsgAUEBaiEQAkAgAC8BMCIBQYABcUUNAAJAIAAgECACELuAgIAAIgENACAQIQEMcAsgAUEVRw26ASAAQQU2AhwgACAQNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAzpAQsCQCABQaAEcUGgBEcNACAALQAtQQJxDQAgAEEANgIcIAAgEDYCFCAAQZaTgIAANgIQIABBBDYCDEEAIRAM6QELIAAgECACEL2AgIAAGiAQIQECQAJAAkACQAJAIAAgECACELOAgIAADhYCAQAEBAQEBAQEBAQEBAQEBAQEBAQDBAsgAEEBOgAuCyAAIAAvATBBwAByOwEwIBAhAQtBJiEQDNEBCyAAQSM2AhwgACAQNgIUIABBpZaAgAA2AhAgAEEVNgIMQQAhEAzpAQsgAEEANgIcIAAgEDYCFCAAQdWLgIAANgIQIABBETYCDEEAIRAM6AELIAAtAC1BAXFFDQFBwwEhEAzOAQsCQCANIAJGDQADQAJAIA0tAABBIEYNACANIQEMxAELIA1BAWoiDSACRw0AC0ElIRAM5wELQSUhEAzmAQsgACgCBCEEIABBADYCBCAAIAQgDRCvgICAACIERQ2tASAAQSY2AhwgACAENgIMIAAgDUEBajYCFEEAIRAM5QELIBBBFUYNqwEgAEEANgIcIAAgATYCFCAAQf2NgIAANgIQIABBHTYCDEEAIRAM5AELIABBJzYCHCAAIAE2AhQgACAQNgIMQQAhEAzjAQsgECEBQQEhFAJAAkACQAJAAkACQAJAIAAtACxBfmoOBwYFBQMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0ErIRAMygELIABBADYCHCAAIBA2AhQgAEGrkoCAADYCECAAQQs2AgxBACEQDOIBCyAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMQQAhEAzhAQsgAEEAOgAsIBAhAQy9AQsgECEBQQEhFAJAAkACQAJAAkAgAC0ALEF7ag4EAwECAAULIAAgAC8BMEEIcjsBMAwDC0ECIRQMAQtBBCEUCyAAQQE6ACwgACAALwEwIBRyOwEwCyAQIQELQSkhEAzFAQsgAEEANgIcIAAgATYCFCAAQfCUgIAANgIQIABBAzYCDEEAIRAM3QELAkAgDi0AAEENRw0AIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHULIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzdAQsgAC0ALUEBcUUNAUHEASEQDMMBCwJAIA4gAkcNAEEtIRAM3AELAkACQANAAkAgDi0AAEF2ag4EAgAAAwALIA5BAWoiDiACRw0AC0EtIRAM3QELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDiEBDHQLIABBLDYCHCAAIA42AhQgACABNgIMQQAhEAzcAQsgACgCBCEBIABBADYCBAJAIAAgASAOELGAgIAAIgENACAOQQFqIQEMcwsgAEEsNgIcIAAgATYCDCAAIA5BAWo2AhRBACEQDNsBCyAAKAIEIQQgAEEANgIEIAAgBCAOELGAgIAAIgQNoAEgDiEBDM4BCyAQQSxHDQEgAUEBaiEQQQEhAQJAAkACQAJAAkAgAC0ALEF7ag4EAwECBAALIBAhAQwEC0ECIQEMAQtBBCEBCyAAQQE6ACwgACAALwEwIAFyOwEwIBAhAQwBCyAAIAAvATBBCHI7ATAgECEBC0E5IRAMvwELIABBADoALCABIQELQTQhEAy9AQsgACAALwEwQSByOwEwIAEhAQwCCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBA0AIAEhAQzHAQsgAEE3NgIcIAAgATYCFCAAIAQ2AgxBACEQDNQBCyAAQQg6ACwgASEBC0EwIRAMuQELAkAgAC0AKEEBRg0AIAEhAQwECyAALQAtQQhxRQ2TASABIQEMAwsgAC0AMEEgcQ2UAUHFASEQDLcBCwJAIA8gAkYNAAJAA0ACQCAPLQAAQVBqIgFB/wFxQQpJDQAgDyEBQTUhEAy6AQsgACkDICIRQpmz5syZs+bMGVYNASAAIBFCCn4iETcDICARIAGtQv8BgyISQn+FVg0BIAAgESASfDcDICAPQQFqIg8gAkcNAAtBOSEQDNEBCyAAKAIEIQIgAEEANgIEIAAgAiAPQQFqIgQQsYCAgAAiAg2VASAEIQEMwwELQTkhEAzPAQsCQCAALwEwIgFBCHFFDQAgAC0AKEEBRw0AIAAtAC1BCHFFDZABCyAAIAFB9/sDcUGABHI7ATAgDyEBC0E3IRAMtAELIAAgAC8BMEEQcjsBMAyrAQsgEEEVRg2LASAAQQA2AhwgACABNgIUIABB8I6AgAA2AhAgAEEcNgIMQQAhEAzLAQsgAEHDADYCHCAAIAE2AgwgACANQQFqNgIUQQAhEAzKAQsCQCABLQAAQTpHDQAgACgCBCEQIABBADYCBAJAIAAgECABEK+AgIAAIhANACABQQFqIQEMYwsgAEHDADYCHCAAIBA2AgwgACABQQFqNgIUQQAhEAzKAQsgAEEANgIcIAAgATYCFCAAQbGRgIAANgIQIABBCjYCDEEAIRAMyQELIABBADYCHCAAIAE2AhQgAEGgmYCAADYCECAAQR42AgxBACEQDMgBCyAAQQA2AgALIABBgBI7ASogACAXQQFqIgEgAhCogICAACIQDQEgASEBC0HHACEQDKwBCyAQQRVHDYMBIABB0QA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAzEAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAzDAQsgAEEANgIcIAAgFDYCFCAAQcGogIAANgIQIABBBzYCDCAAQQA2AgBBACEQDMIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxdCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDMEBC0EAIRAgAEEANgIcIAAgATYCFCAAQYCRgIAANgIQIABBCTYCDAzAAQsgEEEVRg19IABBADYCHCAAIAE2AhQgAEGUjYCAADYCECAAQSE2AgxBACEQDL8BC0EBIRZBACEXQQAhFEEBIRALIAAgEDoAKyABQQFqIQECQAJAIAAtAC1BEHENAAJAAkACQCAALQAqDgMBAAIECyAWRQ0DDAILIBQNAQwCCyAXRQ0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQrYCAgAAiEA0AIAEhAQxcCyAAQdgANgIcIAAgATYCFCAAIBA2AgxBACEQDL4BCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQytAQsgAEHZADYCHCAAIAE2AhQgACAENgIMQQAhEAy9AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMqwELIABB2gA2AhwgACABNgIUIAAgBDYCDEEAIRAMvAELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKkBCyAAQdwANgIcIAAgATYCFCAAIAQ2AgxBACEQDLsBCwJAIAEtAABBUGoiEEH/AXFBCk8NACAAIBA6ACogAUEBaiEBQc8AIRAMogELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKcBCyAAQd4ANgIcIAAgATYCFCAAIAQ2AgxBACEQDLoBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKUEjTw0AIAEhAQxZCyAAQQA2AhwgACABNgIUIABB04mAgAA2AhAgAEEINgIMQQAhEAy5AQsgAEEANgIAC0EAIRAgAEEANgIcIAAgATYCFCAAQZCzgIAANgIQIABBCDYCDAy3AQsgAEEANgIAIBdBAWohAQJAIAAtAClBIUcNACABIQEMVgsgAEEANgIcIAAgATYCFCAAQZuKgIAANgIQIABBCDYCDEEAIRAMtgELIABBADYCACAXQQFqIQECQCAALQApIhBBXWpBC08NACABIQEMVQsCQCAQQQZLDQBBASAQdEHKAHFFDQAgASEBDFULQQAhECAAQQA2AhwgACABNgIUIABB94mAgAA2AhAgAEEINgIMDLUBCyAQQRVGDXEgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMtAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFQLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMswELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMsgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMsQELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFELIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMsAELIABBADYCHCAAIAE2AhQgAEHGioCAADYCECAAQQc2AgxBACEQDK8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDK4BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDK0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDKwBCyAAQQA2AhwgACABNgIUIABB3IiAgAA2AhAgAEEHNgIMQQAhEAyrAQsgEEE/Rw0BIAFBAWohAQtBBSEQDJABC0EAIRAgAEEANgIcIAAgATYCFCAAQf2SgIAANgIQIABBBzYCDAyoAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAynAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAymAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMRgsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAylAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHSADYCHCAAIBQ2AhQgACABNgIMQQAhEAykAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHTADYCHCAAIBQ2AhQgACABNgIMQQAhEAyjAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMQwsgAEHlADYCHCAAIBQ2AhQgACABNgIMQQAhEAyiAQsgAEEANgIcIAAgFDYCFCAAQcOPgIAANgIQIABBBzYCDEEAIRAMoQELIABBADYCHCAAIAE2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKABC0EAIRAgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDAyfAQsgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDEEAIRAMngELIABBADYCHCAAIBQ2AhQgAEH+kYCAADYCECAAQQc2AgxBACEQDJ0BCyAAQQA2AhwgACABNgIUIABBjpuAgAA2AhAgAEEGNgIMQQAhEAycAQsgEEEVRg1XIABBADYCHCAAIAE2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDJsBCyAAQQA2AgAgEEEBaiEBQSQhEAsgACAQOgApIAAoAgQhECAAQQA2AgQgACAQIAEQq4CAgAAiEA1UIAEhAQw+CyAAQQA2AgALQQAhECAAQQA2AhwgACAENgIUIABB8ZuAgAA2AhAgAEEGNgIMDJcBCyABQRVGDVAgAEEANgIcIAAgBTYCFCAAQfCMgIAANgIQIABBGzYCDEEAIRAMlgELIAAoAgQhBSAAQQA2AgQgACAFIBAQqYCAgAAiBQ0BIBBBAWohBQtBrQEhEAx7CyAAQcEBNgIcIAAgBTYCDCAAIBBBAWo2AhRBACEQDJMBCyAAKAIEIQYgAEEANgIEIAAgBiAQEKmAgIAAIgYNASAQQQFqIQYLQa4BIRAMeAsgAEHCATYCHCAAIAY2AgwgACAQQQFqNgIUQQAhEAyQAQsgAEEANgIcIAAgBzYCFCAAQZeLgIAANgIQIABBDTYCDEEAIRAMjwELIABBADYCHCAAIAg2AhQgAEHjkICAADYCECAAQQk2AgxBACEQDI4BCyAAQQA2AhwgACAINgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAyNAQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgCUEBaiEIAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBCAAIBAgCBCtgICAACIQRQ09IABByQE2AhwgACAINgIUIAAgEDYCDEEAIRAMjAELIAAoAgQhBCAAQQA2AgQgACAEIAgQrYCAgAAiBEUNdiAAQcoBNgIcIAAgCDYCFCAAIAQ2AgxBACEQDIsBCyAAKAIEIQQgAEEANgIEIAAgBCAJEK2AgIAAIgRFDXQgAEHLATYCHCAAIAk2AhQgACAENgIMQQAhEAyKAQsgACgCBCEEIABBADYCBCAAIAQgChCtgICAACIERQ1yIABBzQE2AhwgACAKNgIUIAAgBDYCDEEAIRAMiQELAkAgCy0AAEFQaiIQQf8BcUEKTw0AIAAgEDoAKiALQQFqIQpBtgEhEAxwCyAAKAIEIQQgAEEANgIEIAAgBCALEK2AgIAAIgRFDXAgAEHPATYCHCAAIAs2AhQgACAENgIMQQAhEAyIAQsgAEEANgIcIAAgBDYCFCAAQZCzgIAANgIQIABBCDYCDCAAQQA2AgBBACEQDIcBCyABQRVGDT8gAEEANgIcIAAgDDYCFCAAQcyOgIAANgIQIABBIDYCDEEAIRAMhgELIABBgQQ7ASggACgCBCEQIABCADcDACAAIBAgDEEBaiIMEKuAgIAAIhBFDTggAEHTATYCHCAAIAw2AhQgACAQNgIMQQAhEAyFAQsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQdibgIAANgIQIABBCDYCDAyDAQsgACgCBCEQIABCADcDACAAIBAgC0EBaiILEKuAgIAAIhANAUHGASEQDGkLIABBAjoAKAxVCyAAQdUBNgIcIAAgCzYCFCAAIBA2AgxBACEQDIABCyAQQRVGDTcgAEEANgIcIAAgBDYCFCAAQaSMgIAANgIQIABBEDYCDEEAIRAMfwsgAC0ANEEBRw00IAAgBCACELyAgIAAIhBFDTQgEEEVRw01IABB3AE2AhwgACAENgIUIABB1ZaAgAA2AhAgAEEVNgIMQQAhEAx+C0EAIRAgAEEANgIcIABBr4uAgAA2AhAgAEECNgIMIAAgFEEBajYCFAx9C0EAIRAMYwtBAiEQDGILQQ0hEAxhC0EPIRAMYAtBJSEQDF8LQRMhEAxeC0EVIRAMXQtBFiEQDFwLQRchEAxbC0EYIRAMWgtBGSEQDFkLQRohEAxYC0EbIRAMVwtBHCEQDFYLQR0hEAxVC0EfIRAMVAtBISEQDFMLQSMhEAxSC0HGACEQDFELQS4hEAxQC0EvIRAMTwtBOyEQDE4LQT0hEAxNC0HIACEQDEwLQckAIRAMSwtBywAhEAxKC0HMACEQDEkLQc4AIRAMSAtB0QAhEAxHC0HVACEQDEYLQdgAIRAMRQtB2QAhEAxEC0HbACEQDEMLQeQAIRAMQgtB5QAhEAxBC0HxACEQDEALQfQAIRAMPwtBjQEhEAw+C0GXASEQDD0LQakBIRAMPAtBrAEhEAw7C0HAASEQDDoLQbkBIRAMOQtBrwEhEAw4C0GxASEQDDcLQbIBIRAMNgtBtAEhEAw1C0G1ASEQDDQLQboBIRAMMwtBvQEhEAwyC0G/ASEQDDELQcEBIRAMMAsgAEEANgIcIAAgBDYCFCAAQemLgIAANgIQIABBHzYCDEEAIRAMSAsgAEHbATYCHCAAIAQ2AhQgAEH6loCAADYCECAAQRU2AgxBACEQDEcLIABB+AA2AhwgACAMNgIUIABBypiAgAA2AhAgAEEVNgIMQQAhEAxGCyAAQdEANgIcIAAgBTYCFCAAQbCXgIAANgIQIABBFTYCDEEAIRAMRQsgAEH5ADYCHCAAIAE2AhQgACAQNgIMQQAhEAxECyAAQfgANgIcIAAgATYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMQwsgAEHkADYCHCAAIAE2AhQgAEHjl4CAADYCECAAQRU2AgxBACEQDEILIABB1wA2AhwgACABNgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAxBCyAAQQA2AhwgACABNgIUIABBuY2AgAA2AhAgAEEaNgIMQQAhEAxACyAAQcIANgIcIAAgATYCFCAAQeOYgIAANgIQIABBFTYCDEEAIRAMPwsgAEEANgIEIAAgDyAPELGAgIAAIgRFDQEgAEE6NgIcIAAgBDYCDCAAIA9BAWo2AhRBACEQDD4LIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCxgICAACIERQ0AIABBOzYCHCAAIAQ2AgwgACABQQFqNgIUQQAhEAw+CyABQQFqIQEMLQsgD0EBaiEBDC0LIABBADYCHCAAIA82AhQgAEHkkoCAADYCECAAQQQ2AgxBACEQDDsLIABBNjYCHCAAIAQ2AhQgACACNgIMQQAhEAw6CyAAQS42AhwgACAONgIUIAAgBDYCDEEAIRAMOQsgAEHQADYCHCAAIAE2AhQgAEGRmICAADYCECAAQRU2AgxBACEQDDgLIA1BAWohAQwsCyAAQRU2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAw2CyAAQRs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw1CyAAQQ82AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw0CyAAQQs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAwzCyAAQRo2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwyCyAAQQs2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwxCyAAQQo2AhwgACABNgIUIABB5JaAgAA2AhAgAEEVNgIMQQAhEAwwCyAAQR42AhwgACABNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAwvCyAAQQA2AhwgACAQNgIUIABB2o2AgAA2AhAgAEEUNgIMQQAhEAwuCyAAQQQ2AhwgACABNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAwtCyAAQQA2AgAgC0EBaiELC0G4ASEQDBILIABBADYCACAQQQFqIQFB9QAhEAwRCyABIQECQCAALQApQQVHDQBB4wAhEAwRC0HiACEQDBALQQAhECAAQQA2AhwgAEHkkYCAADYCECAAQQc2AgwgACAUQQFqNgIUDCgLIABBADYCACAXQQFqIQFBwAAhEAwOC0EBIQELIAAgAToALCAAQQA2AgAgF0EBaiEBC0EoIRAMCwsgASEBC0E4IRAMCQsCQCABIg8gAkYNAANAAkAgDy0AAEGAvoCAAGotAAAiAUEBRg0AIAFBAkcNAyAPQQFqIQEMBAsgD0EBaiIPIAJHDQALQT4hEAwiC0E+IRAMIQsgAEEAOgAsIA8hAQwBC0ELIRAMBgtBOiEQDAULIAFBAWohAUEtIRAMBAsgACABOgAsIABBADYCACAWQQFqIQFBDCEQDAMLIABBADYCACAXQQFqIQFBCiEQDAILIABBADYCAAsgAEEAOgAsIA0hAUEJIRAMAAsLQQAhECAAQQA2AhwgACALNgIUIABBzZCAgAA2AhAgAEEJNgIMDBcLQQAhECAAQQA2AhwgACAKNgIUIABB6YqAgAA2AhAgAEEJNgIMDBYLQQAhECAAQQA2AhwgACAJNgIUIABBt5CAgAA2AhAgAEEJNgIMDBULQQAhECAAQQA2AhwgACAINgIUIABBnJGAgAA2AhAgAEEJNgIMDBQLQQAhECAAQQA2AhwgACABNgIUIABBzZCAgAA2AhAgAEEJNgIMDBMLQQAhECAAQQA2AhwgACABNgIUIABB6YqAgAA2AhAgAEEJNgIMDBILQQAhECAAQQA2AhwgACABNgIUIABBt5CAgAA2AhAgAEEJNgIMDBELQQAhECAAQQA2AhwgACABNgIUIABBnJGAgAA2AhAgAEEJNgIMDBALQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA8LQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA4LQQAhECAAQQA2AhwgACABNgIUIABBwJKAgAA2AhAgAEELNgIMDA0LQQAhECAAQQA2AhwgACABNgIUIABBlYmAgAA2AhAgAEELNgIMDAwLQQAhECAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMDAsLQQAhECAAQQA2AhwgACABNgIUIABB+4+AgAA2AhAgAEEKNgIMDAoLQQAhECAAQQA2AhwgACABNgIUIABB8ZmAgAA2AhAgAEECNgIMDAkLQQAhECAAQQA2AhwgACABNgIUIABBxJSAgAA2AhAgAEECNgIMDAgLQQAhECAAQQA2AhwgACABNgIUIABB8pWAgAA2AhAgAEECNgIMDAcLIABBAjYCHCAAIAE2AhQgAEGcmoCAADYCECAAQRY2AgxBACEQDAYLQQEhEAwFC0HUACEQIAEiBCACRg0EIANBCGogACAEIAJB2MKAgABBChDFgICAACADKAIMIQQgAygCCA4DAQQCAAsQyoCAgAAACyAAQQA2AhwgAEG1moCAADYCECAAQRc2AgwgACAEQQFqNgIUQQAhEAwCCyAAQQA2AhwgACAENgIUIABBypqAgAA2AhAgAEEJNgIMQQAhEAwBCwJAIAEiBCACRw0AQSIhEAwBCyAAQYmAgIAANgIIIAAgBDYCBEEhIRALIANBEGokgICAgAAgEAuvAQECfyABKAIAIQYCQAJAIAIgA0YNACAEIAZqIQQgBiADaiACayEHIAIgBkF/cyAFaiIGaiEFA0ACQCACLQAAIAQtAABGDQBBAiEEDAMLAkAgBg0AQQAhBCAFIQIMAwsgBkF/aiEGIARBAWohBCACQQFqIgIgA0cNAAsgByEGIAMhAgsgAEEBNgIAIAEgBjYCACAAIAI2AgQPCyABQQA2AgAgACAENgIAIAAgAjYCBAsKACAAEMeAgIAAC/I2AQt/I4CAgIAAQRBrIgEkgICAgAACQEEAKAKg0ICAAA0AQQAQy4CAgABBgNSEgABrIgJB2QBJDQBBACEDAkBBACgC4NOAgAAiBA0AQQBCfzcC7NOAgABBAEKAgISAgIDAADcC5NOAgABBACABQQhqQXBxQdiq1aoFcyIENgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgAALQQAgAjYCzNOAgABBAEGA1ISAADYCyNOAgABBAEGA1ISAADYCmNCAgABBACAENgKs0ICAAEEAQX82AqjQgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAtBgNSEgABBeEGA1ISAAGtBD3FBAEGA1ISAAEEIakEPcRsiA2oiBEEEaiACQUhqIgUgA2siA0EBcjYCAEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgABBgNSEgAAgBWpBODYCBAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEHsAUsNAAJAQQAoAojQgIAAIgZBECAAQRNqQXBxIABBC0kbIgJBA3YiBHYiA0EDcUUNAAJAAkAgA0EBcSAEckEBcyIFQQN0IgRBsNCAgABqIgMgBEG40ICAAGooAgAiBCgCCCICRw0AQQAgBkF+IAV3cTYCiNCAgAAMAQsgAyACNgIIIAIgAzYCDAsgBEEIaiEDIAQgBUEDdCIFQQNyNgIEIAQgBWoiBCAEKAIEQQFyNgIEDAwLIAJBACgCkNCAgAAiB00NAQJAIANFDQACQAJAIAMgBHRBAiAEdCIDQQAgA2tycSIDQQAgA2txQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmoiBEEDdCIDQbDQgIAAaiIFIANBuNCAgABqKAIAIgMoAggiAEcNAEEAIAZBfiAEd3EiBjYCiNCAgAAMAQsgBSAANgIIIAAgBTYCDAsgAyACQQNyNgIEIAMgBEEDdCIEaiAEIAJrIgU2AgAgAyACaiIAIAVBAXI2AgQCQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhBAJAAkAgBkEBIAdBA3Z0IghxDQBBACAGIAhyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAQ2AgwgAiAENgIIIAQgAjYCDCAEIAg2AggLIANBCGohA0EAIAA2ApzQgIAAQQAgBTYCkNCAgAAMDAtBACgCjNCAgAAiCUUNASAJQQAgCWtxQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmpBAnRBuNKAgABqKAIAIgAoAgRBeHEgAmshBCAAIQUCQANAAkAgBSgCECIDDQAgBUEUaigCACIDRQ0CCyADKAIEQXhxIAJrIgUgBCAFIARJIgUbIQQgAyAAIAUbIQAgAyEFDAALCyAAKAIYIQoCQCAAKAIMIgggAEYNACAAKAIIIgNBACgCmNCAgABJGiAIIAM2AgggAyAINgIMDAsLAkAgAEEUaiIFKAIAIgMNACAAKAIQIgNFDQMgAEEQaiEFCwNAIAUhCyADIghBFGoiBSgCACIDDQAgCEEQaiEFIAgoAhAiAw0ACyALQQA2AgAMCgtBfyECIABBv39LDQAgAEETaiIDQXBxIQJBACgCjNCAgAAiB0UNAEEAIQsCQCACQYACSQ0AQR8hCyACQf///wdLDQAgA0EIdiIDIANBgP4/akEQdkEIcSIDdCIEIARBgOAfakEQdkEEcSIEdCIFIAVBgIAPakEQdkECcSIFdEEPdiADIARyIAVyayIDQQF0IAIgA0EVanZBAXFyQRxqIQsLQQAgAmshBAJAAkACQAJAIAtBAnRBuNKAgABqKAIAIgUNAEEAIQNBACEIDAELQQAhAyACQQBBGSALQQF2ayALQR9GG3QhAEEAIQgDQAJAIAUoAgRBeHEgAmsiBiAETw0AIAYhBCAFIQggBg0AQQAhBCAFIQggBSEDDAMLIAMgBUEUaigCACIGIAYgBSAAQR12QQRxakEQaigCACIFRhsgAyAGGyEDIABBAXQhACAFDQALCwJAIAMgCHINAEEAIQhBAiALdCIDQQAgA2tyIAdxIgNFDQMgA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBUEFdkEIcSIAIANyIAUgAHYiA0ECdkEEcSIFciADIAV2IgNBAXZBAnEiBXIgAyAFdiIDQQF2QQFxIgVyIAMgBXZqQQJ0QbjSgIAAaigCACEDCyADRQ0BCwNAIAMoAgRBeHEgAmsiBiAESSEAAkAgAygCECIFDQAgA0EUaigCACEFCyAGIAQgABshBCADIAggABshCCAFIQMgBQ0ACwsgCEUNACAEQQAoApDQgIAAIAJrTw0AIAgoAhghCwJAIAgoAgwiACAIRg0AIAgoAggiA0EAKAKY0ICAAEkaIAAgAzYCCCADIAA2AgwMCQsCQCAIQRRqIgUoAgAiAw0AIAgoAhAiA0UNAyAIQRBqIQULA0AgBSEGIAMiAEEUaiIFKAIAIgMNACAAQRBqIQUgACgCECIDDQALIAZBADYCAAwICwJAQQAoApDQgIAAIgMgAkkNAEEAKAKc0ICAACEEAkACQCADIAJrIgVBEEkNACAEIAJqIgAgBUEBcjYCBEEAIAU2ApDQgIAAQQAgADYCnNCAgAAgBCADaiAFNgIAIAQgAkEDcjYCBAwBCyAEIANBA3I2AgQgBCADaiIDIAMoAgRBAXI2AgRBAEEANgKc0ICAAEEAQQA2ApDQgIAACyAEQQhqIQMMCgsCQEEAKAKU0ICAACIAIAJNDQBBACgCoNCAgAAiAyACaiIEIAAgAmsiBUEBcjYCBEEAIAU2ApTQgIAAQQAgBDYCoNCAgAAgAyACQQNyNgIEIANBCGohAwwKCwJAAkBBACgC4NOAgABFDQBBACgC6NOAgAAhBAwBC0EAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEMakFwcUHYqtWqBXM2AuDTgIAAQQBBADYC9NOAgABBAEEANgLE04CAAEGAgAQhBAtBACEDAkAgBCACQccAaiIHaiIGQQAgBGsiC3EiCCACSw0AQQBBMDYC+NOAgAAMCgsCQEEAKALA04CAACIDRQ0AAkBBACgCuNOAgAAiBCAIaiIFIARNDQAgBSADTQ0BC0EAIQNBAEEwNgL404CAAAwKC0EALQDE04CAAEEEcQ0EAkACQAJAQQAoAqDQgIAAIgRFDQBByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiAESw0DCyADKAIIIgMNAAsLQQAQy4CAgAAiAEF/Rg0FIAghBgJAQQAoAuTTgIAAIgNBf2oiBCAAcUUNACAIIABrIAQgAGpBACADa3FqIQYLIAYgAk0NBSAGQf7///8HSw0FAkBBACgCwNOAgAAiA0UNAEEAKAK404CAACIEIAZqIgUgBE0NBiAFIANLDQYLIAYQy4CAgAAiAyAARw0BDAcLIAYgAGsgC3EiBkH+////B0sNBCAGEMuAgIAAIgAgAygCACADKAIEakYNAyAAIQMLAkAgA0F/Rg0AIAJByABqIAZNDQACQCAHIAZrQQAoAujTgIAAIgRqQQAgBGtxIgRB/v///wdNDQAgAyEADAcLAkAgBBDLgICAAEF/Rg0AIAQgBmohBiADIQAMBwtBACAGaxDLgICAABoMBAsgAyEAIANBf0cNBQwDC0EAIQgMBwtBACEADAULIABBf0cNAgtBAEEAKALE04CAAEEEcjYCxNOAgAALIAhB/v///wdLDQEgCBDLgICAACEAQQAQy4CAgAAhAyAAQX9GDQEgA0F/Rg0BIAAgA08NASADIABrIgYgAkE4ak0NAQtBAEEAKAK404CAACAGaiIDNgK404CAAAJAIANBACgCvNOAgABNDQBBACADNgK804CAAAsCQAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQCAAIAMoAgAiBSADKAIEIghqRg0CIAMoAggiAw0ADAMLCwJAAkBBACgCmNCAgAAiA0UNACAAIANPDQELQQAgADYCmNCAgAALQQAhA0EAIAY2AszTgIAAQQAgADYCyNOAgABBAEF/NgKo0ICAAEEAQQAoAuDTgIAANgKs0ICAAEEAQQA2AtTTgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiBCAGQUhqIgUgA2siA0EBcjYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgAAgACAFakE4NgIEDAILIAMtAAxBCHENACAEIAVJDQAgBCAATw0AIARBeCAEa0EPcUEAIARBCGpBD3EbIgVqIgBBACgClNCAgAAgBmoiCyAFayIFQQFyNgIEIAMgCCAGajYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAU2ApTQgIAAQQAgADYCoNCAgAAgBCALakE4NgIEDAELAkAgAEEAKAKY0ICAACIITw0AQQAgADYCmNCAgAAgACEICyAAIAZqIQVByNOAgAAhAwJAAkACQAJAAkACQAJAA0AgAygCACAFRg0BIAMoAggiAw0ADAILCyADLQAMQQhxRQ0BC0HI04CAACEDA0ACQCADKAIAIgUgBEsNACAFIAMoAgRqIgUgBEsNAwsgAygCCCEDDAALCyADIAA2AgAgAyADKAIEIAZqNgIEIABBeCAAa0EPcUEAIABBCGpBD3EbaiILIAJBA3I2AgQgBUF4IAVrQQ9xQQAgBUEIakEPcRtqIgYgCyACaiICayEDAkAgBiAERw0AQQAgAjYCoNCAgABBAEEAKAKU0ICAACADaiIDNgKU0ICAACACIANBAXI2AgQMAwsCQCAGQQAoApzQgIAARw0AQQAgAjYCnNCAgABBAEEAKAKQ0ICAACADaiIDNgKQ0ICAACACIANBAXI2AgQgAiADaiADNgIADAMLAkAgBigCBCIEQQNxQQFHDQAgBEF4cSEHAkACQCAEQf8BSw0AIAYoAggiBSAEQQN2IghBA3RBsNCAgABqIgBGGgJAIAYoAgwiBCAFRw0AQQBBACgCiNCAgABBfiAId3E2AojQgIAADAILIAQgAEYaIAQgBTYCCCAFIAQ2AgwMAQsgBigCGCEJAkACQCAGKAIMIgAgBkYNACAGKAIIIgQgCEkaIAAgBDYCCCAEIAA2AgwMAQsCQCAGQRRqIgQoAgAiBQ0AIAZBEGoiBCgCACIFDQBBACEADAELA0AgBCEIIAUiAEEUaiIEKAIAIgUNACAAQRBqIQQgACgCECIFDQALIAhBADYCAAsgCUUNAAJAAkAgBiAGKAIcIgVBAnRBuNKAgABqIgQoAgBHDQAgBCAANgIAIAANAUEAQQAoAozQgIAAQX4gBXdxNgKM0ICAAAwCCyAJQRBBFCAJKAIQIAZGG2ogADYCACAARQ0BCyAAIAk2AhgCQCAGKAIQIgRFDQAgACAENgIQIAQgADYCGAsgBigCFCIERQ0AIABBFGogBDYCACAEIAA2AhgLIAcgA2ohAyAGIAdqIgYoAgQhBAsgBiAEQX5xNgIEIAIgA2ogAzYCACACIANBAXI2AgQCQCADQf8BSw0AIANBeHFBsNCAgABqIQQCQAJAQQAoAojQgIAAIgVBASADQQN2dCIDcQ0AQQAgBSADcjYCiNCAgAAgBCEDDAELIAQoAgghAwsgAyACNgIMIAQgAjYCCCACIAQ2AgwgAiADNgIIDAMLQR8hBAJAIANB////B0sNACADQQh2IgQgBEGA/j9qQRB2QQhxIgR0IgUgBUGA4B9qQRB2QQRxIgV0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAQgBXIgAHJrIgRBAXQgAyAEQRVqdkEBcXJBHGohBAsgAiAENgIcIAJCADcCECAEQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiAEEBIAR0IghxDQAgBSACNgIAQQAgACAIcjYCjNCAgAAgAiAFNgIYIAIgAjYCCCACIAI2AgwMAwsgA0EAQRkgBEEBdmsgBEEfRht0IQQgBSgCACEAA0AgACIFKAIEQXhxIANGDQIgBEEddiEAIARBAXQhBCAFIABBBHFqQRBqIggoAgAiAA0ACyAIIAI2AgAgAiAFNgIYIAIgAjYCDCACIAI2AggMAgsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiCyAGQUhqIgggA2siA0EBcjYCBCAAIAhqQTg2AgQgBCAFQTcgBWtBD3FBACAFQUlqQQ9xG2pBQWoiCCAIIARBEGpJGyIIQSM2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAs2AqDQgIAAIAhBEGpBACkC0NOAgAA3AgAgCEEAKQLI04CAADcCCEEAIAhBCGo2AtDTgIAAQQAgBjYCzNOAgABBACAANgLI04CAAEEAQQA2AtTTgIAAIAhBJGohAwNAIANBBzYCACADQQRqIgMgBUkNAAsgCCAERg0DIAggCCgCBEF+cTYCBCAIIAggBGsiADYCACAEIABBAXI2AgQCQCAAQf8BSw0AIABBeHFBsNCAgABqIQMCQAJAQQAoAojQgIAAIgVBASAAQQN2dCIAcQ0AQQAgBSAAcjYCiNCAgAAgAyEFDAELIAMoAgghBQsgBSAENgIMIAMgBDYCCCAEIAM2AgwgBCAFNgIIDAQLQR8hAwJAIABB////B0sNACAAQQh2IgMgA0GA/j9qQRB2QQhxIgN0IgUgBUGA4B9qQRB2QQRxIgV0IgggCEGAgA9qQRB2QQJxIgh0QQ92IAMgBXIgCHJrIgNBAXQgACADQRVqdkEBcXJBHGohAwsgBCADNgIcIARCADcCECADQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiCEEBIAN0IgZxDQAgBSAENgIAQQAgCCAGcjYCjNCAgAAgBCAFNgIYIAQgBDYCCCAEIAQ2AgwMBAsgAEEAQRkgA0EBdmsgA0EfRht0IQMgBSgCACEIA0AgCCIFKAIEQXhxIABGDQMgA0EddiEIIANBAXQhAyAFIAhBBHFqQRBqIgYoAgAiCA0ACyAGIAQ2AgAgBCAFNgIYIAQgBDYCDCAEIAQ2AggMAwsgBSgCCCIDIAI2AgwgBSACNgIIIAJBADYCGCACIAU2AgwgAiADNgIICyALQQhqIQMMBQsgBSgCCCIDIAQ2AgwgBSAENgIIIARBADYCGCAEIAU2AgwgBCADNgIIC0EAKAKU0ICAACIDIAJNDQBBACgCoNCAgAAiBCACaiIFIAMgAmsiA0EBcjYCBEEAIAM2ApTQgIAAQQAgBTYCoNCAgAAgBCACQQNyNgIEIARBCGohAwwDC0EAIQNBAEEwNgL404CAAAwCCwJAIAtFDQACQAJAIAggCCgCHCIFQQJ0QbjSgIAAaiIDKAIARw0AIAMgADYCACAADQFBACAHQX4gBXdxIgc2AozQgIAADAILIAtBEEEUIAsoAhAgCEYbaiAANgIAIABFDQELIAAgCzYCGAJAIAgoAhAiA0UNACAAIAM2AhAgAyAANgIYCyAIQRRqKAIAIgNFDQAgAEEUaiADNgIAIAMgADYCGAsCQAJAIARBD0sNACAIIAQgAmoiA0EDcjYCBCAIIANqIgMgAygCBEEBcjYCBAwBCyAIIAJqIgAgBEEBcjYCBCAIIAJBA3I2AgQgACAEaiAENgIAAkAgBEH/AUsNACAEQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgBEEDdnQiBHENAEEAIAUgBHI2AojQgIAAIAMhBAwBCyADKAIIIQQLIAQgADYCDCADIAA2AgggACADNgIMIAAgBDYCCAwBC0EfIQMCQCAEQf///wdLDQAgBEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCICIAJBgIAPakEQdkECcSICdEEPdiADIAVyIAJyayIDQQF0IAQgA0EVanZBAXFyQRxqIQMLIAAgAzYCHCAAQgA3AhAgA0ECdEG40oCAAGohBQJAIAdBASADdCICcQ0AIAUgADYCAEEAIAcgAnI2AozQgIAAIAAgBTYCGCAAIAA2AgggACAANgIMDAELIARBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhAgJAA0AgAiIFKAIEQXhxIARGDQEgA0EddiECIANBAXQhAyAFIAJBBHFqQRBqIgYoAgAiAg0ACyAGIAA2AgAgACAFNgIYIAAgADYCDCAAIAA2AggMAQsgBSgCCCIDIAA2AgwgBSAANgIIIABBADYCGCAAIAU2AgwgACADNgIICyAIQQhqIQMMAQsCQCAKRQ0AAkACQCAAIAAoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAg2AgAgCA0BQQAgCUF+IAV3cTYCjNCAgAAMAgsgCkEQQRQgCigCECAARhtqIAg2AgAgCEUNAQsgCCAKNgIYAkAgACgCECIDRQ0AIAggAzYCECADIAg2AhgLIABBFGooAgAiA0UNACAIQRRqIAM2AgAgAyAINgIYCwJAAkAgBEEPSw0AIAAgBCACaiIDQQNyNgIEIAAgA2oiAyADKAIEQQFyNgIEDAELIAAgAmoiBSAEQQFyNgIEIAAgAkEDcjYCBCAFIARqIAQ2AgACQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhAwJAAkBBASAHQQN2dCIIIAZxDQBBACAIIAZyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAM2AgwgAiADNgIIIAMgAjYCDCADIAg2AggLQQAgBTYCnNCAgABBACAENgKQ0ICAAAsgAEEIaiEDCyABQRBqJICAgIAAIAMLCgAgABDJgICAAAviDQEHfwJAIABFDQAgAEF4aiIBIABBfGooAgAiAkF4cSIAaiEDAkAgAkEBcQ0AIAJBA3FFDQEgASABKAIAIgJrIgFBACgCmNCAgAAiBEkNASACIABqIQACQCABQQAoApzQgIAARg0AAkAgAkH/AUsNACABKAIIIgQgAkEDdiIFQQN0QbDQgIAAaiIGRhoCQCABKAIMIgIgBEcNAEEAQQAoAojQgIAAQX4gBXdxNgKI0ICAAAwDCyACIAZGGiACIAQ2AgggBCACNgIMDAILIAEoAhghBwJAAkAgASgCDCIGIAFGDQAgASgCCCICIARJGiAGIAI2AgggAiAGNgIMDAELAkAgAUEUaiICKAIAIgQNACABQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQECQAJAIAEgASgCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAwsgB0EQQRQgBygCECABRhtqIAY2AgAgBkUNAgsgBiAHNgIYAkAgASgCECICRQ0AIAYgAjYCECACIAY2AhgLIAEoAhQiAkUNASAGQRRqIAI2AgAgAiAGNgIYDAELIAMoAgQiAkEDcUEDRw0AIAMgAkF+cTYCBEEAIAA2ApDQgIAAIAEgAGogADYCACABIABBAXI2AgQPCyABIANPDQAgAygCBCICQQFxRQ0AAkACQCACQQJxDQACQCADQQAoAqDQgIAARw0AQQAgATYCoNCAgABBAEEAKAKU0ICAACAAaiIANgKU0ICAACABIABBAXI2AgQgAUEAKAKc0ICAAEcNA0EAQQA2ApDQgIAAQQBBADYCnNCAgAAPCwJAIANBACgCnNCAgABHDQBBACABNgKc0ICAAEEAQQAoApDQgIAAIABqIgA2ApDQgIAAIAEgAEEBcjYCBCABIABqIAA2AgAPCyACQXhxIABqIQACQAJAIAJB/wFLDQAgAygCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgAygCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAgsgAiAGRhogAiAENgIIIAQgAjYCDAwBCyADKAIYIQcCQAJAIAMoAgwiBiADRg0AIAMoAggiAkEAKAKY0ICAAEkaIAYgAjYCCCACIAY2AgwMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEGDAELA0AgAiEFIAQiBkEUaiICKAIAIgQNACAGQRBqIQIgBigCECIEDQALIAVBADYCAAsgB0UNAAJAAkAgAyADKAIcIgRBAnRBuNKAgABqIgIoAgBHDQAgAiAGNgIAIAYNAUEAQQAoAozQgIAAQX4gBHdxNgKM0ICAAAwCCyAHQRBBFCAHKAIQIANGG2ogBjYCACAGRQ0BCyAGIAc2AhgCQCADKAIQIgJFDQAgBiACNgIQIAIgBjYCGAsgAygCFCICRQ0AIAZBFGogAjYCACACIAY2AhgLIAEgAGogADYCACABIABBAXI2AgQgAUEAKAKc0ICAAEcNAUEAIAA2ApDQgIAADwsgAyACQX5xNgIEIAEgAGogADYCACABIABBAXI2AgQLAkAgAEH/AUsNACAAQXhxQbDQgIAAaiECAkACQEEAKAKI0ICAACIEQQEgAEEDdnQiAHENAEEAIAQgAHI2AojQgIAAIAIhAAwBCyACKAIIIQALIAAgATYCDCACIAE2AgggASACNgIMIAEgADYCCA8LQR8hAgJAIABB////B0sNACAAQQh2IgIgAkGA/j9qQRB2QQhxIgJ0IgQgBEGA4B9qQRB2QQRxIgR0IgYgBkGAgA9qQRB2QQJxIgZ0QQ92IAIgBHIgBnJrIgJBAXQgACACQRVqdkEBcXJBHGohAgsgASACNgIcIAFCADcCECACQQJ0QbjSgIAAaiEEAkACQEEAKAKM0ICAACIGQQEgAnQiA3ENACAEIAE2AgBBACAGIANyNgKM0ICAACABIAQ2AhggASABNgIIIAEgATYCDAwBCyAAQQBBGSACQQF2ayACQR9GG3QhAiAEKAIAIQYCQANAIAYiBCgCBEF4cSAARg0BIAJBHXYhBiACQQF0IQIgBCAGQQRxakEQaiIDKAIAIgYNAAsgAyABNgIAIAEgBDYCGCABIAE2AgwgASABNgIIDAELIAQoAggiACABNgIMIAQgATYCCCABQQA2AhggASAENgIMIAEgADYCCAtBAEEAKAKo0ICAAEF/aiIBQX8gARs2AqjQgIAACwsEAAAAC04AAkAgAA0APwBBEHQPCwJAIABB//8DcQ0AIABBf0wNAAJAIABBEHZAACIAQX9HDQBBAEEwNgL404CAAEF/DwsgAEEQdA8LEMqAgIAAAAvyAgIDfwF+AkAgAkUNACAAIAE6AAAgAiAAaiIDQX9qIAE6AAAgAkEDSQ0AIAAgAToAAiAAIAE6AAEgA0F9aiABOgAAIANBfmogAToAACACQQdJDQAgACABOgADIANBfGogAToAACACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiATYCACADIAIgBGtBfHEiBGoiAkF8aiABNgIAIARBCUkNACADIAE2AgggAyABNgIEIAJBeGogATYCACACQXRqIAE2AgAgBEEZSQ0AIAMgATYCGCADIAE2AhQgAyABNgIQIAMgATYCDCACQXBqIAE2AgAgAkFsaiABNgIAIAJBaGogATYCACACQWRqIAE2AgAgBCADQQRxQRhyIgVrIgJBIEkNACABrUKBgICAEH4hBiADIAVqIQEDQCABIAY3AxggASAGNwMQIAEgBjcDCCABIAY3AwAgAUEgaiEBIAJBYGoiAkEfSw0ACwsgAAsLjkgBAEGACAuGSAEAAAACAAAAAwAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAYAAAAHAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==' +"use strict"; -/***/ }), +const { Transform } = __nccwpck_require__(12781) +const { Console } = __nccwpck_require__(96206) -/***/ 41891: -/***/ ((__unused_webpack_module, exports) => { +/** + * Gets the output of `console.table(…)` as a string. + */ +module.exports = class PendingInterceptorsFormatter { + constructor ({ disableColors } = {}) { + this.transform = new Transform({ + transform (chunk, _enc, cb) { + cb(null, chunk) + } + }) -"use strict"; + this.logger = new Console({ + stdout: this.transform, + inspectOptions: { + colors: !disableColors && !process.env.CI + } + }) + } -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.enumToMap = void 0; -function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === 'number') { - res[key] = value; - } - }); - return res; + format (pendingInterceptors) { + const withPrettyHeaders = pendingInterceptors.map( + ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ + Method: method, + Origin: origin, + Path: path, + 'Status code': statusCode, + Persistent: persist ? '✅' : '❌', + Invocations: timesInvoked, + Remaining: persist ? Infinity : times - timesInvoked + })) + + this.logger.table(withPrettyHeaders) + return this.transform.read().toString() + } } -exports.enumToMap = enumToMap; -//# sourceMappingURL=utils.js.map + /***/ }), -/***/ 66771: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ 78891: +/***/ ((module) => { "use strict"; -const { kClients } = __nccwpck_require__(72785) -const Agent = __nccwpck_require__(7890) -const { - kAgent, - kMockAgentSet, - kMockAgentGet, - kDispatches, - kIsMockActive, - kNetConnect, - kGetNetConnect, - kOptions, - kFactory -} = __nccwpck_require__(24347) -const MockClient = __nccwpck_require__(58687) -const MockPool = __nccwpck_require__(26193) -const { matchValue, buildMockOptions } = __nccwpck_require__(79323) -const { InvalidArgumentError, UndiciError } = __nccwpck_require__(48045) -const Dispatcher = __nccwpck_require__(60412) -const Pluralizer = __nccwpck_require__(78891) -const PendingInterceptorsFormatter = __nccwpck_require__(86823) +const singulars = { + pronoun: 'it', + is: 'is', + was: 'was', + this: 'this' +} -class FakeWeakRef { - constructor (value) { - this.value = value +const plurals = { + pronoun: 'they', + is: 'are', + was: 'were', + this: 'these' +} + +module.exports = class Pluralizer { + constructor (singular, plural) { + this.singular = singular + this.plural = plural } - deref () { - return this.value + pluralize (count) { + const one = count === 1 + const keys = one ? singulars : plurals + const noun = one ? this.singular : this.plural + return { ...keys, count, noun } } } -class MockAgent extends Dispatcher { - constructor (opts) { - super(opts) - this[kNetConnect] = true - this[kIsMockActive] = true +/***/ }), - // Instantiate Agent and encapsulate - if ((opts && opts.agent && typeof opts.agent.dispatch !== 'function')) { - throw new InvalidArgumentError('Argument opts.agent must implement Agent') - } - const agent = opts && opts.agent ? opts.agent : new Agent(opts) - this[kAgent] = agent +/***/ 68266: +/***/ ((module) => { - this[kClients] = agent[kClients] - this[kOptions] = buildMockOptions(opts) - } +"use strict"; +/* eslint-disable */ - get (origin) { - let dispatcher = this[kMockAgentGet](origin) - if (!dispatcher) { - dispatcher = this[kFactory](origin) - this[kMockAgentSet](origin, dispatcher) - } - return dispatcher - } - dispatch (opts, handler) { - // Call MockAgent.get to perform additional setup before dispatching as normal - this.get(opts.origin) - return this[kAgent].dispatch(opts, handler) +// Extracted from node/lib/internal/fixed_queue.js + +// Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. +const kSize = 2048; +const kMask = kSize - 1; + +// The FixedQueue is implemented as a singly-linked list of fixed-size +// circular buffers. It looks something like this: +// +// head tail +// | | +// v v +// +-----------+ <-----\ +-----------+ <------\ +-----------+ +// | [null] | \----- | next | \------- | next | +// +-----------+ +-----------+ +-----------+ +// | item | <-- bottom | item | <-- bottom | [empty] | +// | item | | item | | [empty] | +// | item | | item | | [empty] | +// | item | | item | | [empty] | +// | item | | item | bottom --> | item | +// | item | | item | | item | +// | ... | | ... | | ... | +// | item | | item | | item | +// | item | | item | | item | +// | [empty] | <-- top | item | | item | +// | [empty] | | item | | item | +// | [empty] | | [empty] | <-- top top --> | [empty] | +// +-----------+ +-----------+ +-----------+ +// +// Or, if there is only one circular buffer, it looks something +// like either of these: +// +// head tail head tail +// | | | | +// v v v v +// +-----------+ +-----------+ +// | [null] | | [null] | +// +-----------+ +-----------+ +// | [empty] | | item | +// | [empty] | | item | +// | item | <-- bottom top --> | [empty] | +// | item | | [empty] | +// | [empty] | <-- top bottom --> | item | +// | [empty] | | item | +// +-----------+ +-----------+ +// +// Adding a value means moving `top` forward by one, removing means +// moving `bottom` forward by one. After reaching the end, the queue +// wraps around. +// +// When `top === bottom` the current queue is empty and when +// `top + 1 === bottom` it's full. This wastes a single space of storage +// but allows much quicker checks. + +class FixedCircularBuffer { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; } - async close () { - await this[kAgent].close() - this[kClients].clear() + isEmpty() { + return this.top === this.bottom; } - deactivate () { - this[kIsMockActive] = false + isFull() { + return ((this.top + 1) & kMask) === this.bottom; } - activate () { - this[kIsMockActive] = true + push(data) { + this.list[this.top] = data; + this.top = (this.top + 1) & kMask; } - enableNetConnect (matcher) { - if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) { - if (Array.isArray(this[kNetConnect])) { - this[kNetConnect].push(matcher) - } else { - this[kNetConnect] = [matcher] - } - } else if (typeof matcher === 'undefined') { - this[kNetConnect] = true - } else { - throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.') - } + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === undefined) + return null; + this.list[this.bottom] = undefined; + this.bottom = (this.bottom + 1) & kMask; + return nextItem; } +} - disableNetConnect () { - this[kNetConnect] = false +module.exports = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); } - // This is required to bypass issues caused by using global symbols - see: - // https://github.com/nodejs/undici/issues/1447 - get isMockActive () { - return this[kIsMockActive] + isEmpty() { + return this.head.isEmpty(); } - [kMockAgentSet] (origin, dispatcher) { - this[kClients].set(origin, new FakeWeakRef(dispatcher)) + push(data) { + if (this.head.isFull()) { + // Head is full: Creates a new queue, sets the old queue's `.next` to it, + // and sets it as the new main queue. + this.head = this.head.next = new FixedCircularBuffer(); + } + this.head.push(data); } - [kFactory] (origin) { - const mockOptions = Object.assign({ agent: this }, this[kOptions]) - return this[kOptions] && this[kOptions].connections === 1 - ? new MockClient(origin, mockOptions) - : new MockPool(origin, mockOptions) + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + // If there is another queue, it forms the new tail. + this.tail = tail.next; + } + return next; } +}; - [kMockAgentGet] (origin) { - // First check if we can immediately find it - const ref = this[kClients].get(origin) - if (ref) { - return ref.deref() + +/***/ }), + +/***/ 73198: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +const DispatcherBase = __nccwpck_require__(74839) +const FixedQueue = __nccwpck_require__(68266) +const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(72785) +const PoolStats = __nccwpck_require__(39689) + +const kClients = Symbol('clients') +const kNeedDrain = Symbol('needDrain') +const kQueue = Symbol('queue') +const kClosedResolve = Symbol('closed resolve') +const kOnDrain = Symbol('onDrain') +const kOnConnect = Symbol('onConnect') +const kOnDisconnect = Symbol('onDisconnect') +const kOnConnectionError = Symbol('onConnectionError') +const kGetDispatcher = Symbol('get dispatcher') +const kAddClient = Symbol('add client') +const kRemoveClient = Symbol('remove client') +const kStats = Symbol('stats') + +class PoolBase extends DispatcherBase { + constructor () { + super() + + this[kQueue] = new FixedQueue() + this[kClients] = [] + this[kQueued] = 0 + + const pool = this + + this[kOnDrain] = function onDrain (origin, targets) { + const queue = pool[kQueue] + + let needDrain = false + + while (!needDrain) { + const item = queue.shift() + if (!item) { + break + } + pool[kQueued]-- + needDrain = !this.dispatch(item.opts, item.handler) + } + + this[kNeedDrain] = needDrain + + if (!this[kNeedDrain] && pool[kNeedDrain]) { + pool[kNeedDrain] = false + pool.emit('drain', origin, [pool, ...targets]) + } + + if (pool[kClosedResolve] && queue.isEmpty()) { + Promise + .all(pool[kClients].map(c => c.close())) + .then(pool[kClosedResolve]) + } } - // If the origin is not a string create a dummy parent pool and return to user - if (typeof origin !== 'string') { - const dispatcher = this[kFactory]('http://localhost:9999') - this[kMockAgentSet](origin, dispatcher) - return dispatcher + this[kOnConnect] = (origin, targets) => { + pool.emit('connect', origin, [pool, ...targets]) } - // If we match, create a pool and assign the same dispatches - for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { - const nonExplicitDispatcher = nonExplicitRef.deref() - if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) { - const dispatcher = this[kFactory](origin) - this[kMockAgentSet](origin, dispatcher) - dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches] - return dispatcher - } + this[kOnDisconnect] = (origin, targets, err) => { + pool.emit('disconnect', origin, [pool, ...targets], err) } - } - [kGetNetConnect] () { - return this[kNetConnect] + this[kOnConnectionError] = (origin, targets, err) => { + pool.emit('connectionError', origin, [pool, ...targets], err) + } + + this[kStats] = new PoolStats(this) } - pendingInterceptors () { - const mockAgentClients = this[kClients] + get [kBusy] () { + return this[kNeedDrain] + } - return Array.from(mockAgentClients.entries()) - .flatMap(([origin, scope]) => scope.deref()[kDispatches].map(dispatch => ({ ...dispatch, origin }))) - .filter(({ pending }) => pending) + get [kConnected] () { + return this[kClients].filter(client => client[kConnected]).length } - assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) { - const pending = this.pendingInterceptors() + get [kFree] () { + return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length + } - if (pending.length === 0) { - return + get [kPending] () { + let ret = this[kQueued] + for (const { [kPending]: pending } of this[kClients]) { + ret += pending } + return ret + } - const pluralizer = new Pluralizer('interceptor', 'interceptors').pluralize(pending.length) + get [kRunning] () { + let ret = 0 + for (const { [kRunning]: running } of this[kClients]) { + ret += running + } + return ret + } - throw new UndiciError(` -${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: + get [kSize] () { + let ret = this[kQueued] + for (const { [kSize]: size } of this[kClients]) { + ret += size + } + return ret + } -${pendingInterceptorsFormatter.format(pending)} -`.trim()) + get stats () { + return this[kStats] } -} -module.exports = MockAgent + async [kClose] () { + if (this[kQueue].isEmpty()) { + return Promise.all(this[kClients].map(c => c.close())) + } else { + return new Promise((resolve) => { + this[kClosedResolve] = resolve + }) + } + } + async [kDestroy] (err) { + while (true) { + const item = this[kQueue].shift() + if (!item) { + break + } + item.handler.onError(err) + } -/***/ }), + return Promise.all(this[kClients].map(c => c.destroy(err))) + } -/***/ 58687: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + [kDispatch] (opts, handler) { + const dispatcher = this[kGetDispatcher]() -"use strict"; + if (!dispatcher) { + this[kNeedDrain] = true + this[kQueue].push({ opts, handler }) + this[kQueued]++ + } else if (!dispatcher.dispatch(opts, handler)) { + dispatcher[kNeedDrain] = true + this[kNeedDrain] = !this[kGetDispatcher]() + } + return !this[kNeedDrain] + } -const { promisify } = __nccwpck_require__(73837) -const Client = __nccwpck_require__(33598) -const { buildMockDispatch } = __nccwpck_require__(79323) -const { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected -} = __nccwpck_require__(24347) -const { MockInterceptor } = __nccwpck_require__(90410) -const Symbols = __nccwpck_require__(72785) -const { InvalidArgumentError } = __nccwpck_require__(48045) + [kAddClient] (client) { + client + .on('drain', this[kOnDrain]) + .on('connect', this[kOnConnect]) + .on('disconnect', this[kOnDisconnect]) + .on('connectionError', this[kOnConnectionError]) -/** - * MockClient provides an API that extends the Client to influence the mockDispatches. - */ -class MockClient extends Client { - constructor (origin, opts) { - super(origin, opts) + this[kClients].push(client) - if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { - throw new InvalidArgumentError('Argument opts.agent must implement Agent') + if (this[kNeedDrain]) { + process.nextTick(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client[kUrl], [this, client]) + } + }) } - this[kMockAgent] = opts.agent - this[kOrigin] = origin - this[kDispatches] = [] - this[kConnected] = 1 - this[kOriginalDispatch] = this.dispatch - this[kOriginalClose] = this.close.bind(this) - - this.dispatch = buildMockDispatch.call(this) - this.close = this[kClose] - } - - get [Symbols.kConnected] () { - return this[kConnected] + return this } - /** - * Sets up the base interceptor for mocking replies from undici. - */ - intercept (opts) { - return new MockInterceptor(opts, this[kDispatches]) - } + [kRemoveClient] (client) { + client.close(() => { + const idx = this[kClients].indexOf(client) + if (idx !== -1) { + this[kClients].splice(idx, 1) + } + }) - async [kClose] () { - await promisify(this[kOriginalClose])() - this[kConnected] = 0 - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]) + this[kNeedDrain] = this[kClients].some(dispatcher => ( + !dispatcher[kNeedDrain] && + dispatcher.closed !== true && + dispatcher.destroyed !== true + )) } } -module.exports = MockClient +module.exports = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher +} /***/ }), -/***/ 50888: +/***/ 39689: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -"use strict"; +const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(72785) +const kPool = Symbol('pool') +class PoolStats { + constructor (pool) { + this[kPool] = pool + } -const { UndiciError } = __nccwpck_require__(48045) + get connected () { + return this[kPool][kConnected] + } -class MockNotMatchedError extends UndiciError { - constructor (message) { - super(message) - Error.captureStackTrace(this, MockNotMatchedError) - this.name = 'MockNotMatchedError' - this.message = message || 'The request does not match any registered mock dispatches' - this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED' + get free () { + return this[kPool][kFree] } -} -module.exports = { - MockNotMatchedError + get pending () { + return this[kPool][kPending] + } + + get queued () { + return this[kPool][kQueued] + } + + get running () { + return this[kPool][kRunning] + } + + get size () { + return this[kPool][kSize] + } } +module.exports = PoolStats + /***/ }), -/***/ 90410: +/***/ 4634: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(79323) const { - kDispatches, - kDispatchKey, - kDefaultHeaders, - kDefaultTrailers, - kContentLength, - kMockDispatch -} = __nccwpck_require__(24347) -const { InvalidArgumentError } = __nccwpck_require__(48045) -const { buildURL } = __nccwpck_require__(83983) - -/** - * Defines the scope API for an interceptor reply - */ -class MockScope { - constructor (mockDispatch) { - this[kMockDispatch] = mockDispatch - } + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher +} = __nccwpck_require__(73198) +const Client = __nccwpck_require__(33598) +const { + InvalidArgumentError +} = __nccwpck_require__(48045) +const util = __nccwpck_require__(83983) +const { kUrl, kInterceptors } = __nccwpck_require__(72785) +const buildConnector = __nccwpck_require__(82067) - /** - * Delay a reply by a set amount in ms. - */ - delay (waitInMs) { - if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) { - throw new InvalidArgumentError('waitInMs must be a valid integer > 0') - } +const kOptions = Symbol('options') +const kConnections = Symbol('connections') +const kFactory = Symbol('factory') - this[kMockDispatch].delay = waitInMs - return this - } +function defaultFactory (origin, opts) { + return new Client(origin, opts) +} - /** - * For a defined reply, never mark as consumed. - */ - persist () { - this[kMockDispatch].persist = true - return this - } +class Pool extends PoolBase { + constructor (origin, { + connections, + factory = defaultFactory, + connect, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + ...options + } = {}) { + super() - /** - * Allow one to define a reply for a set amount of matching requests. - */ - times (repeatTimes) { - if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { - throw new InvalidArgumentError('repeatTimes must be a valid integer > 0') + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError('invalid connections') } - this[kMockDispatch].times = repeatTimes - return this - } -} - -/** - * Defines an interceptor for a Mock - */ -class MockInterceptor { - constructor (opts, mockDispatches) { - if (typeof opts !== 'object') { - throw new InvalidArgumentError('opts must be an object') - } - if (typeof opts.path === 'undefined') { - throw new InvalidArgumentError('opts.path must be defined') - } - if (typeof opts.method === 'undefined') { - opts.method = 'GET' + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') } - // See https://github.com/nodejs/undici/issues/1245 - // As per RFC 3986, clients are not supposed to send URI - // fragments to servers when they retrieve a document, - if (typeof opts.path === 'string') { - if (opts.query) { - opts.path = buildURL(opts.path, opts.query) - } else { - // Matches https://github.com/nodejs/undici/blob/main/lib/fetch/index.js#L1811 - const parsedURL = new URL(opts.path, 'data://') - opts.path = parsedURL.pathname + parsedURL.search - } + + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') } - if (typeof opts.method === 'string') { - opts.method = opts.method.toUpperCase() + + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect + }) } - this[kDispatchKey] = buildKey(opts) - this[kDispatches] = mockDispatches - this[kDefaultHeaders] = {} - this[kDefaultTrailers] = {} - this[kContentLength] = false + this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool) + ? options.interceptors.Pool + : [] + this[kConnections] = connections || null + this[kUrl] = util.parseOrigin(origin) + this[kOptions] = { ...util.deepClone(options), connect, allowH2 } + this[kOptions].interceptors = options.interceptors + ? { ...options.interceptors } + : undefined + this[kFactory] = factory } - createMockScopeDispatchData (statusCode, data, responseOptions = {}) { - const responseData = getResponseData(data) - const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {} - const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers } - const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers } - - return { statusCode, data, headers, trailers } - } + [kGetDispatcher] () { + let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain]) - validateReplyParameters (statusCode, data, responseOptions) { - if (typeof statusCode === 'undefined') { - throw new InvalidArgumentError('statusCode must be defined') - } - if (typeof data === 'undefined') { - throw new InvalidArgumentError('data must be defined') + if (dispatcher) { + return dispatcher } - if (typeof responseOptions !== 'object') { - throw new InvalidArgumentError('responseOptions must be an object') + + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + dispatcher = this[kFactory](this[kUrl], this[kOptions]) + this[kAddClient](dispatcher) } + + return dispatcher } +} - /** - * Mock an undici request with a defined reply. - */ - reply (replyData) { - // Values of reply aren't available right now as they - // can only be available when the reply callback is invoked. - if (typeof replyData === 'function') { - // We'll first wrap the provided callback in another function, - // this function will properly resolve the data from the callback - // when invoked. - const wrappedDefaultsCallback = (opts) => { - // Our reply options callback contains the parameter for statusCode, data and options. - const resolvedData = replyData(opts) +module.exports = Pool - // Check if it is in the right format - if (typeof resolvedData !== 'object') { - throw new InvalidArgumentError('reply options callback must return an object') - } - const { statusCode, data = '', responseOptions = {} } = resolvedData - this.validateReplyParameters(statusCode, data, responseOptions) - // Since the values can be obtained immediately we return them - // from this higher order function that will be resolved later. - return { - ...this.createMockScopeDispatchData(statusCode, data, responseOptions) - } - } +/***/ }), - // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data. - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback) - return new MockScope(newMockDispatch) - } +/***/ 97858: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // We can have either one or three parameters, if we get here, - // we should have 1-3 parameters. So we spread the arguments of - // this function to obtain the parameters, since replyData will always - // just be the statusCode. - const [statusCode, data = '', responseOptions = {}] = [...arguments] - this.validateReplyParameters(statusCode, data, responseOptions) +"use strict"; - // Send in-already provided data like usual - const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions) - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData) - return new MockScope(newMockDispatch) - } - /** - * Mock an undici request with a defined error. - */ - replyWithError (error) { - if (typeof error === 'undefined') { - throw new InvalidArgumentError('error must be defined') - } +const { kProxy, kClose, kDestroy, kInterceptors } = __nccwpck_require__(72785) +const { URL } = __nccwpck_require__(57310) +const Agent = __nccwpck_require__(7890) +const Pool = __nccwpck_require__(4634) +const DispatcherBase = __nccwpck_require__(74839) +const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(48045) +const buildConnector = __nccwpck_require__(82067) - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }) - return new MockScope(newMockDispatch) - } +const kAgent = Symbol('proxy agent') +const kClient = Symbol('proxy client') +const kProxyHeaders = Symbol('proxy headers') +const kRequestTls = Symbol('request tls settings') +const kProxyTls = Symbol('proxy tls settings') +const kConnectEndpoint = Symbol('connect endpoint function') - /** - * Set default reply headers on the interceptor for subsequent replies - */ - defaultReplyHeaders (headers) { - if (typeof headers === 'undefined') { - throw new InvalidArgumentError('headers must be defined') - } +function defaultProtocolPort (protocol) { + return protocol === 'https:' ? 443 : 80 +} - this[kDefaultHeaders] = headers - return this +function buildProxyOptions (opts) { + if (typeof opts === 'string') { + opts = { uri: opts } } - /** - * Set default reply trailers on the interceptor for subsequent replies - */ - defaultReplyTrailers (trailers) { - if (typeof trailers === 'undefined') { - throw new InvalidArgumentError('trailers must be defined') - } - - this[kDefaultTrailers] = trailers - return this + if (!opts || !opts.uri) { + throw new InvalidArgumentError('Proxy opts.uri is mandatory') } - /** - * Set reply content length header for replies on the interceptor - */ - replyContentLength () { - this[kContentLength] = true - return this + return { + uri: opts.uri, + protocol: opts.protocol || 'https' } } -module.exports.MockInterceptor = MockInterceptor -module.exports.MockScope = MockScope - +function defaultFactory (origin, opts) { + return new Pool(origin, opts) +} -/***/ }), +class ProxyAgent extends DispatcherBase { + constructor (opts) { + super(opts) + this[kProxy] = buildProxyOptions(opts) + this[kAgent] = new Agent(opts) + this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) + ? opts.interceptors.ProxyAgent + : [] -/***/ 26193: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + if (typeof opts === 'string') { + opts = { uri: opts } + } -"use strict"; + if (!opts || !opts.uri) { + throw new InvalidArgumentError('Proxy opts.uri is mandatory') + } + const { clientFactory = defaultFactory } = opts -const { promisify } = __nccwpck_require__(73837) -const Pool = __nccwpck_require__(4634) -const { buildMockDispatch } = __nccwpck_require__(79323) -const { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected -} = __nccwpck_require__(24347) -const { MockInterceptor } = __nccwpck_require__(90410) -const Symbols = __nccwpck_require__(72785) -const { InvalidArgumentError } = __nccwpck_require__(48045) + if (typeof clientFactory !== 'function') { + throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.') + } -/** - * MockPool provides an API that extends the Pool to influence the mockDispatches. - */ -class MockPool extends Pool { - constructor (origin, opts) { - super(origin, opts) + this[kRequestTls] = opts.requestTls + this[kProxyTls] = opts.proxyTls + this[kProxyHeaders] = opts.headers || {} - if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { - throw new InvalidArgumentError('Argument opts.agent must implement Agent') + if (opts.auth && opts.token) { + throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') + } else if (opts.auth) { + /* @deprecated in favour of opts.token */ + this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}` + } else if (opts.token) { + this[kProxyHeaders]['proxy-authorization'] = opts.token } - this[kMockAgent] = opts.agent - this[kOrigin] = origin - this[kDispatches] = [] - this[kConnected] = 1 - this[kOriginalDispatch] = this.dispatch - this[kOriginalClose] = this.close.bind(this) + const resolvedUrl = new URL(opts.uri) + const { origin, port, host } = resolvedUrl - this.dispatch = buildMockDispatch.call(this) - this.close = this[kClose] + const connect = buildConnector({ ...opts.proxyTls }) + this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }) + this[kClient] = clientFactory(resolvedUrl, { connect }) + this[kAgent] = new Agent({ + ...opts, + connect: async (opts, callback) => { + let requestedHost = opts.host + if (!opts.port) { + requestedHost += `:${defaultProtocolPort(opts.protocol)}` + } + try { + const { socket, statusCode } = await this[kClient].connect({ + origin, + port, + path: requestedHost, + signal: opts.signal, + headers: { + ...this[kProxyHeaders], + host + } + }) + if (statusCode !== 200) { + socket.on('error', () => {}).destroy() + callback(new RequestAbortedError('Proxy response !== 200 when HTTP Tunneling')) + } + if (opts.protocol !== 'https:') { + callback(null, socket) + return + } + let servername + if (this[kRequestTls]) { + servername = this[kRequestTls].servername + } else { + servername = opts.servername + } + this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback) + } catch (err) { + callback(err) + } + } + }) } - get [Symbols.kConnected] () { - return this[kConnected] + dispatch (opts, handler) { + const { host } = new URL(opts.origin) + const headers = buildHeaders(opts.headers) + throwIfProxyAuthIsSent(headers) + return this[kAgent].dispatch( + { + ...opts, + headers: { + ...headers, + host + } + }, + handler + ) } - /** - * Sets up the base interceptor for mocking replies from undici. - */ - intercept (opts) { - return new MockInterceptor(opts, this[kDispatches]) + async [kClose] () { + await this[kAgent].close() + await this[kClient].close() } - async [kClose] () { - await promisify(this[kOriginalClose])() - this[kConnected] = 0 - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]) + async [kDestroy] () { + await this[kAgent].destroy() + await this[kClient].destroy() + } +} + +/** + * @param {string[] | Record} headers + * @returns {Record} + */ +function buildHeaders (headers) { + // When using undici.fetch, the headers list is stored + // as an array. + if (Array.isArray(headers)) { + /** @type {Record} */ + const headersPair = {} + + for (let i = 0; i < headers.length; i += 2) { + headersPair[headers[i]] = headers[i + 1] + } + + return headersPair + } + + return headers +} + +/** + * @param {Record} headers + * + * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers + * Nevertheless, it was changed and to avoid a security vulnerability by end users + * this check was created. + * It should be removed in the next major version for performance reasons + */ +function throwIfProxyAuthIsSent (headers) { + const existProxyAuth = headers && Object.keys(headers) + .find((key) => key.toLowerCase() === 'proxy-authorization') + if (existProxyAuth) { + throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor') } } -module.exports = MockPool +module.exports = ProxyAgent /***/ }), -/***/ 24347: +/***/ 29459: /***/ ((module) => { "use strict"; -module.exports = { - kAgent: Symbol('agent'), - kOptions: Symbol('options'), - kFactory: Symbol('factory'), - kDispatches: Symbol('dispatches'), - kDispatchKey: Symbol('dispatch key'), - kDefaultHeaders: Symbol('default headers'), - kDefaultTrailers: Symbol('default trailers'), - kContentLength: Symbol('content length'), - kMockAgent: Symbol('mock agent'), - kMockAgentSet: Symbol('mock agent set'), - kMockAgentGet: Symbol('mock agent get'), - kMockDispatch: Symbol('mock dispatch'), - kClose: Symbol('close'), - kOriginalClose: Symbol('original agent close'), - kOrigin: Symbol('origin'), - kIsMockActive: Symbol('is mock active'), - kNetConnect: Symbol('net connect'), - kGetNetConnect: Symbol('get net connect'), - kConnected: Symbol('connected') -} - - -/***/ }), - -/***/ 79323: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; +let fastNow = Date.now() +let fastNowTimeout +const fastTimers = [] -const { MockNotMatchedError } = __nccwpck_require__(50888) -const { - kDispatches, - kMockAgent, - kOriginalDispatch, - kOrigin, - kGetNetConnect -} = __nccwpck_require__(24347) -const { buildURL, nop } = __nccwpck_require__(83983) -const { STATUS_CODES } = __nccwpck_require__(13685) -const { - types: { - isPromise - } -} = __nccwpck_require__(73837) +function onTimeout () { + fastNow = Date.now() -function matchValue (match, value) { - if (typeof match === 'string') { - return match === value - } - if (match instanceof RegExp) { - return match.test(value) - } - if (typeof match === 'function') { - return match(value) === true - } - return false -} + let len = fastTimers.length + let idx = 0 + while (idx < len) { + const timer = fastTimers[idx] -function lowerCaseEntries (headers) { - return Object.fromEntries( - Object.entries(headers).map(([headerName, headerValue]) => { - return [headerName.toLocaleLowerCase(), headerValue] - }) - ) -} + if (timer.state === 0) { + timer.state = fastNow + timer.delay + } else if (timer.state > 0 && fastNow >= timer.state) { + timer.state = -1 + timer.callback(timer.opaque) + } -/** - * @param {import('../../index').Headers|string[]|Record} headers - * @param {string} key - */ -function getHeaderByName (headers, key) { - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { - return headers[i + 1] + if (timer.state === -1) { + timer.state = -2 + if (idx !== len - 1) { + fastTimers[idx] = fastTimers.pop() + } else { + fastTimers.pop() } + len -= 1 + } else { + idx += 1 } - - return undefined - } else if (typeof headers.get === 'function') { - return headers.get(key) - } else { - return lowerCaseEntries(headers)[key.toLocaleLowerCase()] } -} -/** @param {string[]} headers */ -function buildHeadersFromArray (headers) { // fetch HeadersList - const clone = headers.slice() - const entries = [] - for (let index = 0; index < clone.length; index += 2) { - entries.push([clone[index], clone[index + 1]]) + if (fastTimers.length > 0) { + refreshTimeout() } - return Object.fromEntries(entries) } -function matchHeaders (mockDispatch, headers) { - if (typeof mockDispatch.headers === 'function') { - if (Array.isArray(headers)) { // fetch HeadersList - headers = buildHeadersFromArray(headers) +function refreshTimeout () { + if (fastNowTimeout && fastNowTimeout.refresh) { + fastNowTimeout.refresh() + } else { + clearTimeout(fastNowTimeout) + fastNowTimeout = setTimeout(onTimeout, 1e3) + if (fastNowTimeout.unref) { + fastNowTimeout.unref() } - return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {}) - } - if (typeof mockDispatch.headers === 'undefined') { - return true - } - if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') { - return false } +} - for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) { - const headerValue = getHeaderByName(headers, matchHeaderName) +class Timeout { + constructor (callback, delay, opaque) { + this.callback = callback + this.delay = delay + this.opaque = opaque - if (!matchValue(matchHeaderValue, headerValue)) { - return false - } - } - return true -} + // -2 not in timer list + // -1 in timer list but inactive + // 0 in timer list waiting for time + // > 0 in timer list waiting for time to expire + this.state = -2 -function safeUrl (path) { - if (typeof path !== 'string') { - return path + this.refresh() } - const pathSegments = path.split('?') + refresh () { + if (this.state === -2) { + fastTimers.push(this) + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout() + } + } - if (pathSegments.length !== 2) { - return path + this.state = 0 } - const qp = new URLSearchParams(pathSegments.pop()) - qp.sort() - return [...pathSegments, qp.toString()].join('?') -} - -function matchKey (mockDispatch, { path, method, body, headers }) { - const pathMatch = matchValue(mockDispatch.path, path) - const methodMatch = matchValue(mockDispatch.method, method) - const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true - const headersMatch = matchHeaders(mockDispatch, headers) - return pathMatch && methodMatch && bodyMatch && headersMatch + clear () { + this.state = -1 + } } -function getResponseData (data) { - if (Buffer.isBuffer(data)) { - return data - } else if (typeof data === 'object') { - return JSON.stringify(data) - } else { - return data.toString() +module.exports = { + setTimeout (callback, delay, opaque) { + return delay < 1e3 + ? setTimeout(callback, delay, opaque) + : new Timeout(callback, delay, opaque) + }, + clearTimeout (timeout) { + if (timeout instanceof Timeout) { + timeout.clear() + } else { + clearTimeout(timeout) + } } } -function getMockDispatch (mockDispatches, key) { - const basePath = key.query ? buildURL(key.path, key.query) : key.path - const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath - - // Match path - let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)) - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`) - } - // Match method - matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)) - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`) - } +/***/ }), - // Match body - matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true) - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`) - } +/***/ 35354: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // Match headers - matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers)) - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers}'`) - } +"use strict"; - return matchedMockDispatches[0] -} -function addMockDispatch (mockDispatches, key, data) { - const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false } - const replyData = typeof data === 'function' ? { callback: data } : { ...data } - const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } } - mockDispatches.push(newMockDispatch) - return newMockDispatch -} +const diagnosticsChannel = __nccwpck_require__(67643) +const { uid, states } = __nccwpck_require__(19188) +const { + kReadyState, + kSentClose, + kByteParser, + kReceivedClose +} = __nccwpck_require__(37578) +const { fireEvent, failWebsocketConnection } = __nccwpck_require__(25515) +const { CloseEvent } = __nccwpck_require__(52611) +const { makeRequest } = __nccwpck_require__(48359) +const { fetching } = __nccwpck_require__(74881) +const { Headers } = __nccwpck_require__(10554) +const { getGlobalDispatcher } = __nccwpck_require__(21892) +const { kHeadersList } = __nccwpck_require__(72785) -function deleteMockDispatch (mockDispatches, key) { - const index = mockDispatches.findIndex(dispatch => { - if (!dispatch.consumed) { - return false - } - return matchKey(dispatch, key) - }) - if (index !== -1) { - mockDispatches.splice(index, 1) - } -} +const channels = {} +channels.open = diagnosticsChannel.channel('undici:websocket:open') +channels.close = diagnosticsChannel.channel('undici:websocket:close') +channels.socketError = diagnosticsChannel.channel('undici:websocket:socket_error') -function buildKey (opts) { - const { path, method, body, headers, query } = opts - return { - path, - method, - body, - headers, - query - } -} +/** @type {import('crypto')} */ +let crypto +try { + crypto = __nccwpck_require__(6113) +} catch { -function generateKeyValues (data) { - return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ - ...keyValuePairs, - Buffer.from(`${key}`), - Array.isArray(value) ? value.map(x => Buffer.from(`${x}`)) : Buffer.from(`${value}`) - ], []) } /** - * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status - * @param {number} statusCode + * @see https://websockets.spec.whatwg.org/#concept-websocket-establish + * @param {URL} url + * @param {string|string[]} protocols + * @param {import('./websocket').WebSocket} ws + * @param {(response: any) => void} onEstablish + * @param {Partial} options */ -function getStatusText (statusCode) { - return STATUS_CODES[statusCode] || 'unknown' -} +function establishWebSocketConnection (url, protocols, ws, onEstablish, options) { + // 1. Let requestURL be a copy of url, with its scheme set to "http", if url’s + // scheme is "ws", and to "https" otherwise. + const requestURL = url -async function getResponse (body) { - const buffers = [] - for await (const data of body) { - buffers.push(data) - } - return Buffer.concat(buffers).toString('utf8') -} + requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:' -/** - * Mock dispatch function used to simulate undici dispatches - */ -function mockDispatch (opts, handler) { - // Get mock dispatch from built key - const key = buildKey(opts) - const mockDispatch = getMockDispatch(this[kDispatches], key) + // 2. Let request be a new request, whose URL is requestURL, client is client, + // service-workers mode is "none", referrer is "no-referrer", mode is + // "websocket", credentials mode is "include", cache mode is "no-store" , + // and redirect mode is "error". + const request = makeRequest({ + urlList: [requestURL], + serviceWorkers: 'none', + referrer: 'no-referrer', + mode: 'websocket', + credentials: 'include', + cache: 'no-store', + redirect: 'error' + }) - mockDispatch.timesInvoked++ + // Note: undici extension, allow setting custom headers. + if (options.headers) { + const headersList = new Headers(options.headers)[kHeadersList] - // Here's where we resolve a callback if a callback is present for the dispatch data. - if (mockDispatch.data.callback) { - mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) } + request.headersList = headersList } - // Parse mockDispatch data - const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch - const { timesInvoked, times } = mockDispatch + // 3. Append (`Upgrade`, `websocket`) to request’s header list. + // 4. Append (`Connection`, `Upgrade`) to request’s header list. + // Note: both of these are handled by undici currently. + // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397 - // If it's used up and not persistent, mark as consumed - mockDispatch.consumed = !persist && timesInvoked >= times - mockDispatch.pending = timesInvoked < times + // 5. Let keyValue be a nonce consisting of a randomly selected + // 16-byte value that has been forgiving-base64-encoded and + // isomorphic encoded. + const keyValue = crypto.randomBytes(16).toString('base64') - // If specified, trigger dispatch error - if (error !== null) { - deleteMockDispatch(this[kDispatches], key) - handler.onError(error) - return true - } + // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s + // header list. + request.headersList.append('sec-websocket-key', keyValue) - // Handle the request with a delay if necessary - if (typeof delay === 'number' && delay > 0) { - setTimeout(() => { - handleReply(this[kDispatches]) - }, delay) - } else { - handleReply(this[kDispatches]) + // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s + // header list. + request.headersList.append('sec-websocket-version', '13') + + // 8. For each protocol in protocols, combine + // (`Sec-WebSocket-Protocol`, protocol) in request’s header + // list. + for (const protocol of protocols) { + request.headersList.append('sec-websocket-protocol', protocol) } - function handleReply (mockDispatches, _data = data) { - // fetch's HeadersList is a 1D string array - const optsHeaders = Array.isArray(opts.headers) - ? buildHeadersFromArray(opts.headers) - : opts.headers - const body = typeof _data === 'function' - ? _data({ ...opts, headers: optsHeaders }) - : _data + // 9. Let permessageDeflate be a user-agent defined + // "permessage-deflate" extension header value. + // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673 + // TODO: enable once permessage-deflate is supported + const permessageDeflate = '' // 'permessage-deflate; 15' - // util.types.isPromise is likely needed for jest. - if (isPromise(body)) { - // If handleReply is asynchronous, throwing an error - // in the callback will reject the promise, rather than - // synchronously throw the error, which breaks some tests. - // Rather, we wait for the callback to resolve if it is a - // promise, and then re-run handleReply with the new body. - body.then((newData) => handleReply(mockDispatches, newData)) - return - } + // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to + // request’s header list. + // request.headersList.append('sec-websocket-extensions', permessageDeflate) - const responseData = getResponseData(body) - const responseHeaders = generateKeyValues(headers) - const responseTrailers = generateKeyValues(trailers) + // 11. Fetch request with useParallelQueue set to true, and + // processResponse given response being these steps: + const controller = fetching({ + request, + useParallelQueue: true, + dispatcher: options.dispatcher ?? getGlobalDispatcher(), + processResponse (response) { + // 1. If response is a network error or its status is not 101, + // fail the WebSocket connection. + if (response.type === 'error' || response.status !== 101) { + failWebsocketConnection(ws, 'Received network error or non-101 status code.') + return + } - handler.abort = nop - handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)) - handler.onData(Buffer.from(responseData)) - handler.onComplete(responseTrailers) - deleteMockDispatch(mockDispatches, key) - } + // 2. If protocols is not the empty list and extracting header + // list values given `Sec-WebSocket-Protocol` and response’s + // header list results in null, failure, or the empty byte + // sequence, then fail the WebSocket connection. + if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) { + failWebsocketConnection(ws, 'Server did not respond with sent protocols.') + return + } - function resume () {} + // 3. Follow the requirements stated step 2 to step 6, inclusive, + // of the last set of steps in section 4.1 of The WebSocket + // Protocol to validate response. This either results in fail + // the WebSocket connection or the WebSocket connection is + // established. - return true -} + // 2. If the response lacks an |Upgrade| header field or the |Upgrade| + // header field contains a value that is not an ASCII case- + // insensitive match for the value "websocket", the client MUST + // _Fail the WebSocket Connection_. + if (response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') { + failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".') + return + } -function buildMockDispatch () { - const agent = this[kMockAgent] - const origin = this[kOrigin] - const originalDispatch = this[kOriginalDispatch] + // 3. If the response lacks a |Connection| header field or the + // |Connection| header field doesn't contain a token that is an + // ASCII case-insensitive match for the value "Upgrade", the client + // MUST _Fail the WebSocket Connection_. + if (response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') { + failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".') + return + } - return function dispatch (opts, handler) { - if (agent.isMockActive) { - try { - mockDispatch.call(this, opts, handler) - } catch (error) { - if (error instanceof MockNotMatchedError) { - const netConnect = agent[kGetNetConnect]() - if (netConnect === false) { - throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`) - } - if (checkNetConnect(netConnect, origin)) { - originalDispatch.call(this, opts, handler) - } else { - throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`) - } - } else { - throw error - } + // 4. If the response lacks a |Sec-WebSocket-Accept| header field or + // the |Sec-WebSocket-Accept| contains a value other than the + // base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket- + // Key| (as a string, not base64-decoded) with the string "258EAFA5- + // E914-47DA-95CA-C5AB0DC85B11" but ignoring any leading and + // trailing whitespace, the client MUST _Fail the WebSocket + // Connection_. + const secWSAccept = response.headersList.get('Sec-WebSocket-Accept') + const digest = crypto.createHash('sha1').update(keyValue + uid).digest('base64') + if (secWSAccept !== digest) { + failWebsocketConnection(ws, 'Incorrect hash received in Sec-WebSocket-Accept header.') + return + } + + // 5. If the response includes a |Sec-WebSocket-Extensions| header + // field and this header field indicates the use of an extension + // that was not present in the client's handshake (the server has + // indicated an extension not requested by the client), the client + // MUST _Fail the WebSocket Connection_. (The parsing of this + // header field to determine which extensions are requested is + // discussed in Section 9.1.) + const secExtension = response.headersList.get('Sec-WebSocket-Extensions') + + if (secExtension !== null && secExtension !== permessageDeflate) { + failWebsocketConnection(ws, 'Received different permessage-deflate than the one set.') + return + } + + // 6. If the response includes a |Sec-WebSocket-Protocol| header field + // and this header field indicates the use of a subprotocol that was + // not present in the client's handshake (the server has indicated a + // subprotocol not requested by the client), the client MUST _Fail + // the WebSocket Connection_. + const secProtocol = response.headersList.get('Sec-WebSocket-Protocol') + + if (secProtocol !== null && secProtocol !== request.headersList.get('Sec-WebSocket-Protocol')) { + failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.') + return } - } else { - originalDispatch.call(this, opts, handler) + + response.socket.on('data', onSocketData) + response.socket.on('close', onSocketClose) + response.socket.on('error', onSocketError) + + if (channels.open.hasSubscribers) { + channels.open.publish({ + address: response.socket.address(), + protocol: secProtocol, + extensions: secExtension + }) + } + + onEstablish(response) } - } -} + }) -function checkNetConnect (netConnect, origin) { - const url = new URL(origin) - if (netConnect === true) { - return true - } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { - return true - } - return false + return controller } -function buildMockOptions (opts) { - if (opts) { - const { agent, ...mockOptions } = opts - return mockOptions +/** + * @param {Buffer} chunk + */ +function onSocketData (chunk) { + if (!this.ws[kByteParser].write(chunk)) { + this.pause() } } -module.exports = { - getResponseData, - getMockDispatch, - addMockDispatch, - deleteMockDispatch, - buildKey, - generateKeyValues, - matchValue, - getResponse, - getStatusText, - mockDispatch, - buildMockDispatch, - checkNetConnect, - buildMockOptions, - getHeaderByName -} +/** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4 + */ +function onSocketClose () { + const { ws } = this + // If the TCP connection was closed after the + // WebSocket closing handshake was completed, the WebSocket connection + // is said to have been closed _cleanly_. + const wasClean = ws[kSentClose] && ws[kReceivedClose] -/***/ }), + let code = 1005 + let reason = '' -/***/ 86823: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + const result = ws[kByteParser].closingInfo -"use strict"; + if (result) { + code = result.code ?? 1005 + reason = result.reason + } else if (!ws[kSentClose]) { + // If _The WebSocket + // Connection is Closed_ and no Close control frame was received by the + // endpoint (such as could occur if the underlying transport connection + // is lost), _The WebSocket Connection Close Code_ is considered to be + // 1006. + code = 1006 + } + // 1. Change the ready state to CLOSED (3). + ws[kReadyState] = states.CLOSED -const { Transform } = __nccwpck_require__(12781) -const { Console } = __nccwpck_require__(96206) + // 2. If the user agent was required to fail the WebSocket + // connection, or if the WebSocket connection was closed + // after being flagged as full, fire an event named error + // at the WebSocket object. + // TODO -/** - * Gets the output of `console.table(…)` as a string. - */ -module.exports = class PendingInterceptorsFormatter { - constructor ({ disableColors } = {}) { - this.transform = new Transform({ - transform (chunk, _enc, cb) { - cb(null, chunk) - } - }) + // 3. Fire an event named close at the WebSocket object, + // using CloseEvent, with the wasClean attribute + // initialized to true if the connection closed cleanly + // and false otherwise, the code attribute initialized to + // the WebSocket connection close code, and the reason + // attribute initialized to the result of applying UTF-8 + // decode without BOM to the WebSocket connection close + // reason. + fireEvent('close', ws, CloseEvent, { + wasClean, code, reason + }) - this.logger = new Console({ - stdout: this.transform, - inspectOptions: { - colors: !disableColors && !process.env.CI - } + if (channels.close.hasSubscribers) { + channels.close.publish({ + websocket: ws, + code, + reason }) } +} - format (pendingInterceptors) { - const withPrettyHeaders = pendingInterceptors.map( - ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ - Method: method, - Origin: origin, - Path: path, - 'Status code': statusCode, - Persistent: persist ? '✅' : '❌', - Invocations: timesInvoked, - Remaining: persist ? Infinity : times - timesInvoked - })) +function onSocketError (error) { + const { ws } = this - this.logger.table(withPrettyHeaders) - return this.transform.read().toString() + ws[kReadyState] = states.CLOSING + + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(error) } + + this.destroy() +} + +module.exports = { + establishWebSocketConnection } /***/ }), -/***/ 78891: +/***/ 19188: /***/ ((module) => { "use strict"; -const singulars = { - pronoun: 'it', - is: 'is', - was: 'was', - this: 'this' +// This is a Globally Unique Identifier unique used +// to validate that the endpoint accepts websocket +// connections. +// See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3 +const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' + +/** @type {PropertyDescriptor} */ +const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false } -const plurals = { - pronoun: 'they', - is: 'are', - was: 'were', - this: 'these' +const states = { + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3 } -module.exports = class Pluralizer { - constructor (singular, plural) { - this.singular = singular - this.plural = plural - } +const opcodes = { + CONTINUATION: 0x0, + TEXT: 0x1, + BINARY: 0x2, + CLOSE: 0x8, + PING: 0x9, + PONG: 0xA +} - pluralize (count) { - const one = count === 1 - const keys = one ? singulars : plurals - const noun = one ? this.singular : this.plural - return { ...keys, count, noun } - } +const maxUnsigned16Bit = 2 ** 16 - 1 // 65535 + +const parserStates = { + INFO: 0, + PAYLOADLENGTH_16: 2, + PAYLOADLENGTH_64: 3, + READ_DATA: 4 +} + +const emptyBuffer = Buffer.allocUnsafe(0) + +module.exports = { + uid, + staticPropertyDescriptors, + states, + opcodes, + maxUnsigned16Bit, + parserStates, + emptyBuffer } /***/ }), -/***/ 68266: -/***/ ((module) => { +/***/ 52611: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -/* eslint-disable */ - -// Extracted from node/lib/internal/fixed_queue.js +const { webidl } = __nccwpck_require__(21744) +const { kEnumerableProperty } = __nccwpck_require__(83983) +const { MessagePort } = __nccwpck_require__(71267) -// Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. -const kSize = 2048; -const kMask = kSize - 1; +/** + * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent + */ +class MessageEvent extends Event { + #eventInit -// The FixedQueue is implemented as a singly-linked list of fixed-size -// circular buffers. It looks something like this: -// -// head tail -// | | -// v v -// +-----------+ <-----\ +-----------+ <------\ +-----------+ -// | [null] | \----- | next | \------- | next | -// +-----------+ +-----------+ +-----------+ -// | item | <-- bottom | item | <-- bottom | [empty] | -// | item | | item | | [empty] | -// | item | | item | | [empty] | -// | item | | item | | [empty] | -// | item | | item | bottom --> | item | -// | item | | item | | item | -// | ... | | ... | | ... | -// | item | | item | | item | -// | item | | item | | item | -// | [empty] | <-- top | item | | item | -// | [empty] | | item | | item | -// | [empty] | | [empty] | <-- top top --> | [empty] | -// +-----------+ +-----------+ +-----------+ -// -// Or, if there is only one circular buffer, it looks something -// like either of these: -// -// head tail head tail -// | | | | -// v v v v -// +-----------+ +-----------+ -// | [null] | | [null] | -// +-----------+ +-----------+ -// | [empty] | | item | -// | [empty] | | item | -// | item | <-- bottom top --> | [empty] | -// | item | | [empty] | -// | [empty] | <-- top bottom --> | item | -// | [empty] | | item | -// +-----------+ +-----------+ -// -// Adding a value means moving `top` forward by one, removing means -// moving `bottom` forward by one. After reaching the end, the queue -// wraps around. -// -// When `top === bottom` the current queue is empty and when -// `top + 1 === bottom` it's full. This wastes a single space of storage -// but allows much quicker checks. + constructor (type, eventInitDict = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' }) -class FixedCircularBuffer { - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; - } + type = webidl.converters.DOMString(type) + eventInitDict = webidl.converters.MessageEventInit(eventInitDict) - isEmpty() { - return this.top === this.bottom; - } + super(type, eventInitDict) - isFull() { - return ((this.top + 1) & kMask) === this.bottom; + this.#eventInit = eventInitDict } - push(data) { - this.list[this.top] = data; - this.top = (this.top + 1) & kMask; - } + get data () { + webidl.brandCheck(this, MessageEvent) - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === undefined) - return null; - this.list[this.bottom] = undefined; - this.bottom = (this.bottom + 1) & kMask; - return nextItem; + return this.#eventInit.data } -} -module.exports = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer(); - } + get origin () { + webidl.brandCheck(this, MessageEvent) - isEmpty() { - return this.head.isEmpty(); + return this.#eventInit.origin } - push(data) { - if (this.head.isFull()) { - // Head is full: Creates a new queue, sets the old queue's `.next` to it, - // and sets it as the new main queue. - this.head = this.head.next = new FixedCircularBuffer(); - } - this.head.push(data); - } + get lastEventId () { + webidl.brandCheck(this, MessageEvent) - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - // If there is another queue, it forms the new tail. - this.tail = tail.next; - } - return next; + return this.#eventInit.lastEventId } -}; - - -/***/ }), - -/***/ 73198: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -const DispatcherBase = __nccwpck_require__(74839) -const FixedQueue = __nccwpck_require__(68266) -const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(72785) -const PoolStats = __nccwpck_require__(39689) - -const kClients = Symbol('clients') -const kNeedDrain = Symbol('needDrain') -const kQueue = Symbol('queue') -const kClosedResolve = Symbol('closed resolve') -const kOnDrain = Symbol('onDrain') -const kOnConnect = Symbol('onConnect') -const kOnDisconnect = Symbol('onDisconnect') -const kOnConnectionError = Symbol('onConnectionError') -const kGetDispatcher = Symbol('get dispatcher') -const kAddClient = Symbol('add client') -const kRemoveClient = Symbol('remove client') -const kStats = Symbol('stats') - -class PoolBase extends DispatcherBase { - constructor () { - super() - - this[kQueue] = new FixedQueue() - this[kClients] = [] - this[kQueued] = 0 - const pool = this - - this[kOnDrain] = function onDrain (origin, targets) { - const queue = pool[kQueue] - - let needDrain = false - - while (!needDrain) { - const item = queue.shift() - if (!item) { - break - } - pool[kQueued]-- - needDrain = !this.dispatch(item.opts, item.handler) - } + get source () { + webidl.brandCheck(this, MessageEvent) - this[kNeedDrain] = needDrain + return this.#eventInit.source + } - if (!this[kNeedDrain] && pool[kNeedDrain]) { - pool[kNeedDrain] = false - pool.emit('drain', origin, [pool, ...targets]) - } + get ports () { + webidl.brandCheck(this, MessageEvent) - if (pool[kClosedResolve] && queue.isEmpty()) { - Promise - .all(pool[kClients].map(c => c.close())) - .then(pool[kClosedResolve]) - } + if (!Object.isFrozen(this.#eventInit.ports)) { + Object.freeze(this.#eventInit.ports) } - this[kOnConnect] = (origin, targets) => { - pool.emit('connect', origin, [pool, ...targets]) - } + return this.#eventInit.ports + } - this[kOnDisconnect] = (origin, targets, err) => { - pool.emit('disconnect', origin, [pool, ...targets], err) - } + initMessageEvent ( + type, + bubbles = false, + cancelable = false, + data = null, + origin = '', + lastEventId = '', + source = null, + ports = [] + ) { + webidl.brandCheck(this, MessageEvent) - this[kOnConnectionError] = (origin, targets, err) => { - pool.emit('connectionError', origin, [pool, ...targets], err) - } + webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent.initMessageEvent' }) - this[kStats] = new PoolStats(this) + return new MessageEvent(type, { + bubbles, cancelable, data, origin, lastEventId, source, ports + }) } +} - get [kBusy] () { - return this[kNeedDrain] - } +/** + * @see https://websockets.spec.whatwg.org/#the-closeevent-interface + */ +class CloseEvent extends Event { + #eventInit - get [kConnected] () { - return this[kClients].filter(client => client[kConnected]).length - } + constructor (type, eventInitDict = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' }) - get [kFree] () { - return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length - } + type = webidl.converters.DOMString(type) + eventInitDict = webidl.converters.CloseEventInit(eventInitDict) - get [kPending] () { - let ret = this[kQueued] - for (const { [kPending]: pending } of this[kClients]) { - ret += pending - } - return ret - } + super(type, eventInitDict) - get [kRunning] () { - let ret = 0 - for (const { [kRunning]: running } of this[kClients]) { - ret += running - } - return ret + this.#eventInit = eventInitDict } - get [kSize] () { - let ret = this[kQueued] - for (const { [kSize]: size } of this[kClients]) { - ret += size - } - return ret - } + get wasClean () { + webidl.brandCheck(this, CloseEvent) - get stats () { - return this[kStats] + return this.#eventInit.wasClean } - async [kClose] () { - if (this[kQueue].isEmpty()) { - return Promise.all(this[kClients].map(c => c.close())) - } else { - return new Promise((resolve) => { - this[kClosedResolve] = resolve - }) - } + get code () { + webidl.brandCheck(this, CloseEvent) + + return this.#eventInit.code } - async [kDestroy] (err) { - while (true) { - const item = this[kQueue].shift() - if (!item) { - break - } - item.handler.onError(err) - } + get reason () { + webidl.brandCheck(this, CloseEvent) - return Promise.all(this[kClients].map(c => c.destroy(err))) + return this.#eventInit.reason } +} - [kDispatch] (opts, handler) { - const dispatcher = this[kGetDispatcher]() +// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface +class ErrorEvent extends Event { + #eventInit - if (!dispatcher) { - this[kNeedDrain] = true - this[kQueue].push({ opts, handler }) - this[kQueued]++ - } else if (!dispatcher.dispatch(opts, handler)) { - dispatcher[kNeedDrain] = true - this[kNeedDrain] = !this[kGetDispatcher]() - } + constructor (type, eventInitDict) { + webidl.argumentLengthCheck(arguments, 1, { header: 'ErrorEvent constructor' }) - return !this[kNeedDrain] - } + super(type, eventInitDict) - [kAddClient] (client) { - client - .on('drain', this[kOnDrain]) - .on('connect', this[kOnConnect]) - .on('disconnect', this[kOnDisconnect]) - .on('connectionError', this[kOnConnectionError]) + type = webidl.converters.DOMString(type) + eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}) - this[kClients].push(client) + this.#eventInit = eventInitDict + } - if (this[kNeedDrain]) { - process.nextTick(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client[kUrl], [this, client]) - } - }) - } + get message () { + webidl.brandCheck(this, ErrorEvent) - return this + return this.#eventInit.message } - [kRemoveClient] (client) { - client.close(() => { - const idx = this[kClients].indexOf(client) - if (idx !== -1) { - this[kClients].splice(idx, 1) - } - }) + get filename () { + webidl.brandCheck(this, ErrorEvent) - this[kNeedDrain] = this[kClients].some(dispatcher => ( - !dispatcher[kNeedDrain] && - dispatcher.closed !== true && - dispatcher.destroyed !== true - )) + return this.#eventInit.filename } -} -module.exports = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher -} + get lineno () { + webidl.brandCheck(this, ErrorEvent) + return this.#eventInit.lineno + } -/***/ }), + get colno () { + webidl.brandCheck(this, ErrorEvent) -/***/ 39689: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + return this.#eventInit.colno + } -const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(72785) -const kPool = Symbol('pool') + get error () { + webidl.brandCheck(this, ErrorEvent) -class PoolStats { - constructor (pool) { - this[kPool] = pool + return this.#eventInit.error } +} - get connected () { - return this[kPool][kConnected] - } +Object.defineProperties(MessageEvent.prototype, { + [Symbol.toStringTag]: { + value: 'MessageEvent', + configurable: true + }, + data: kEnumerableProperty, + origin: kEnumerableProperty, + lastEventId: kEnumerableProperty, + source: kEnumerableProperty, + ports: kEnumerableProperty, + initMessageEvent: kEnumerableProperty +}) - get free () { - return this[kPool][kFree] - } +Object.defineProperties(CloseEvent.prototype, { + [Symbol.toStringTag]: { + value: 'CloseEvent', + configurable: true + }, + reason: kEnumerableProperty, + code: kEnumerableProperty, + wasClean: kEnumerableProperty +}) - get pending () { - return this[kPool][kPending] +Object.defineProperties(ErrorEvent.prototype, { + [Symbol.toStringTag]: { + value: 'ErrorEvent', + configurable: true + }, + message: kEnumerableProperty, + filename: kEnumerableProperty, + lineno: kEnumerableProperty, + colno: kEnumerableProperty, + error: kEnumerableProperty +}) + +webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort) + +webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.MessagePort +) + +const eventInit = [ + { + key: 'bubbles', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'cancelable', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'composed', + converter: webidl.converters.boolean, + defaultValue: false } +] - get queued () { - return this[kPool][kQueued] +webidl.converters.MessageEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: 'data', + converter: webidl.converters.any, + defaultValue: null + }, + { + key: 'origin', + converter: webidl.converters.USVString, + defaultValue: '' + }, + { + key: 'lastEventId', + converter: webidl.converters.DOMString, + defaultValue: '' + }, + { + key: 'source', + // Node doesn't implement WindowProxy or ServiceWorker, so the only + // valid value for source is a MessagePort. + converter: webidl.nullableConverter(webidl.converters.MessagePort), + defaultValue: null + }, + { + key: 'ports', + converter: webidl.converters['sequence'], + get defaultValue () { + return [] + } } +]) - get running () { - return this[kPool][kRunning] +webidl.converters.CloseEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: 'wasClean', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'code', + converter: webidl.converters['unsigned short'], + defaultValue: 0 + }, + { + key: 'reason', + converter: webidl.converters.USVString, + defaultValue: '' } +]) - get size () { - return this[kPool][kSize] +webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: 'message', + converter: webidl.converters.DOMString, + defaultValue: '' + }, + { + key: 'filename', + converter: webidl.converters.USVString, + defaultValue: '' + }, + { + key: 'lineno', + converter: webidl.converters['unsigned long'], + defaultValue: 0 + }, + { + key: 'colno', + converter: webidl.converters['unsigned long'], + defaultValue: 0 + }, + { + key: 'error', + converter: webidl.converters.any } -} +]) -module.exports = PoolStats +module.exports = { + MessageEvent, + CloseEvent, + ErrorEvent +} /***/ }), -/***/ 4634: +/***/ 25444: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kGetDispatcher -} = __nccwpck_require__(73198) -const Client = __nccwpck_require__(33598) -const { - InvalidArgumentError -} = __nccwpck_require__(48045) -const util = __nccwpck_require__(83983) -const { kUrl, kInterceptors } = __nccwpck_require__(72785) -const buildConnector = __nccwpck_require__(82067) +const { maxUnsigned16Bit } = __nccwpck_require__(19188) -const kOptions = Symbol('options') -const kConnections = Symbol('connections') -const kFactory = Symbol('factory') +/** @type {import('crypto')} */ +let crypto +try { + crypto = __nccwpck_require__(6113) +} catch { -function defaultFactory (origin, opts) { - return new Client(origin, opts) } -class Pool extends PoolBase { - constructor (origin, { - connections, - factory = defaultFactory, - connect, - connectTimeout, - tls, - maxCachedSessions, - socketPath, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - allowH2, - ...options - } = {}) { - super() +class WebsocketFrameSend { + /** + * @param {Buffer|undefined} data + */ + constructor (data) { + this.frameData = data + this.maskKey = crypto.randomBytes(4) + } - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { - throw new InvalidArgumentError('invalid connections') - } + createFrame (opcode) { + const bodyLength = this.frameData?.byteLength ?? 0 - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } + /** @type {number} */ + let payloadLength = bodyLength // 0-125 + let offset = 6 - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') + if (bodyLength > maxUnsigned16Bit) { + offset += 8 // payload length is next 8 bytes + payloadLength = 127 + } else if (bodyLength > 125) { + offset += 2 // payload length is next 2 bytes + payloadLength = 126 } - if (typeof connect !== 'function') { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout == null ? 10e3 : connectTimeout, - ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), - ...connect - }) - } + const buffer = Buffer.allocUnsafe(bodyLength + offset) - this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool) - ? options.interceptors.Pool - : [] - this[kConnections] = connections || null - this[kUrl] = util.parseOrigin(origin) - this[kOptions] = { ...util.deepClone(options), connect, allowH2 } - this[kOptions].interceptors = options.interceptors - ? { ...options.interceptors } - : undefined - this[kFactory] = factory - } + // Clear first 2 bytes, everything else is overwritten + buffer[0] = buffer[1] = 0 + buffer[0] |= 0x80 // FIN + buffer[0] = (buffer[0] & 0xF0) + opcode // opcode - [kGetDispatcher] () { - let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain]) + /*! ws. MIT License. Einar Otto Stangvik */ + buffer[offset - 4] = this.maskKey[0] + buffer[offset - 3] = this.maskKey[1] + buffer[offset - 2] = this.maskKey[2] + buffer[offset - 1] = this.maskKey[3] - if (dispatcher) { - return dispatcher + buffer[1] = payloadLength + + if (payloadLength === 126) { + buffer.writeUInt16BE(bodyLength, 2) + } else if (payloadLength === 127) { + // Clear extended payload length + buffer[2] = buffer[3] = 0 + buffer.writeUIntBE(bodyLength, 4, 6) } - if (!this[kConnections] || this[kClients].length < this[kConnections]) { - dispatcher = this[kFactory](this[kUrl], this[kOptions]) - this[kAddClient](dispatcher) + buffer[1] |= 0x80 // MASK + + // mask body + for (let i = 0; i < bodyLength; i++) { + buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4] } - return dispatcher + return buffer } } -module.exports = Pool +module.exports = { + WebsocketFrameSend +} /***/ }), -/***/ 97858: +/***/ 11688: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -const { kProxy, kClose, kDestroy, kInterceptors } = __nccwpck_require__(72785) -const { URL } = __nccwpck_require__(57310) -const Agent = __nccwpck_require__(7890) -const Pool = __nccwpck_require__(4634) -const DispatcherBase = __nccwpck_require__(74839) -const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(48045) -const buildConnector = __nccwpck_require__(82067) +const { Writable } = __nccwpck_require__(12781) +const diagnosticsChannel = __nccwpck_require__(67643) +const { parserStates, opcodes, states, emptyBuffer } = __nccwpck_require__(19188) +const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(37578) +const { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = __nccwpck_require__(25515) +const { WebsocketFrameSend } = __nccwpck_require__(25444) -const kAgent = Symbol('proxy agent') -const kClient = Symbol('proxy client') -const kProxyHeaders = Symbol('proxy headers') -const kRequestTls = Symbol('request tls settings') -const kProxyTls = Symbol('proxy tls settings') -const kConnectEndpoint = Symbol('connect endpoint function') +// This code was influenced by ws released under the MIT license. +// Copyright (c) 2011 Einar Otto Stangvik +// Copyright (c) 2013 Arnout Kazemier and contributors +// Copyright (c) 2016 Luigi Pinca and contributors -function defaultProtocolPort (protocol) { - return protocol === 'https:' ? 443 : 80 -} +const channels = {} +channels.ping = diagnosticsChannel.channel('undici:websocket:ping') +channels.pong = diagnosticsChannel.channel('undici:websocket:pong') -function buildProxyOptions (opts) { - if (typeof opts === 'string') { - opts = { uri: opts } - } +class ByteParser extends Writable { + #buffers = [] + #byteOffset = 0 - if (!opts || !opts.uri) { - throw new InvalidArgumentError('Proxy opts.uri is mandatory') + #state = parserStates.INFO + + #info = {} + #fragments = [] + + constructor (ws) { + super() + + this.ws = ws } - return { - uri: opts.uri, - protocol: opts.protocol || 'https' + /** + * @param {Buffer} chunk + * @param {() => void} callback + */ + _write (chunk, _, callback) { + this.#buffers.push(chunk) + this.#byteOffset += chunk.length + + this.run(callback) } -} -function defaultFactory (origin, opts) { - return new Pool(origin, opts) -} + /** + * Runs whenever a new chunk is received. + * Callback is called whenever there are no more chunks buffering, + * or not enough bytes are buffered to parse. + */ + run (callback) { + while (true) { + if (this.#state === parserStates.INFO) { + // If there aren't enough bytes to parse the payload length, etc. + if (this.#byteOffset < 2) { + return callback() + } -class ProxyAgent extends DispatcherBase { - constructor (opts) { - super(opts) - this[kProxy] = buildProxyOptions(opts) - this[kAgent] = new Agent(opts) - this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) - ? opts.interceptors.ProxyAgent - : [] + const buffer = this.consume(2) - if (typeof opts === 'string') { - opts = { uri: opts } - } + this.#info.fin = (buffer[0] & 0x80) !== 0 + this.#info.opcode = buffer[0] & 0x0F + + // If we receive a fragmented message, we use the type of the first + // frame to parse the full message as binary/text, when it's terminated + this.#info.originalOpcode ??= this.#info.opcode + + this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION + + if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { + // Only text and binary frames can be fragmented + failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.') + return + } + + const payloadLength = buffer[1] & 0x7F + + if (payloadLength <= 125) { + this.#info.payloadLength = payloadLength + this.#state = parserStates.READ_DATA + } else if (payloadLength === 126) { + this.#state = parserStates.PAYLOADLENGTH_16 + } else if (payloadLength === 127) { + this.#state = parserStates.PAYLOADLENGTH_64 + } + + if (this.#info.fragmented && payloadLength > 125) { + // A fragmented frame can't be fragmented itself + failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.') + return + } else if ( + (this.#info.opcode === opcodes.PING || + this.#info.opcode === opcodes.PONG || + this.#info.opcode === opcodes.CLOSE) && + payloadLength > 125 + ) { + // Control frames can have a payload length of 125 bytes MAX + failWebsocketConnection(this.ws, 'Payload length for control frame exceeded 125 bytes.') + return + } else if (this.#info.opcode === opcodes.CLOSE) { + if (payloadLength === 1) { + failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.') + return + } + + const body = this.consume(payloadLength) + + this.#info.closeInfo = this.parseCloseBody(false, body) + + if (!this.ws[kSentClose]) { + // If an endpoint receives a Close frame and did not previously send a + // Close frame, the endpoint MUST send a Close frame in response. (When + // sending a Close frame in response, the endpoint typically echos the + // status code it received.) + const body = Buffer.allocUnsafe(2) + body.writeUInt16BE(this.#info.closeInfo.code, 0) + const closeFrame = new WebsocketFrameSend(body) + + this.ws[kResponse].socket.write( + closeFrame.createFrame(opcodes.CLOSE), + (err) => { + if (!err) { + this.ws[kSentClose] = true + } + } + ) + } - if (!opts || !opts.uri) { - throw new InvalidArgumentError('Proxy opts.uri is mandatory') - } + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + this.ws[kReadyState] = states.CLOSING + this.ws[kReceivedClose] = true - const { clientFactory = defaultFactory } = opts + this.end() - if (typeof clientFactory !== 'function') { - throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.') - } + return + } else if (this.#info.opcode === opcodes.PING) { + // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in + // response, unless it already received a Close frame. + // A Pong frame sent in response to a Ping frame must have identical + // "Application data" - this[kRequestTls] = opts.requestTls - this[kProxyTls] = opts.proxyTls - this[kProxyHeaders] = opts.headers || {} + const body = this.consume(payloadLength) - if (opts.auth && opts.token) { - throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') - } else if (opts.auth) { - /* @deprecated in favour of opts.token */ - this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}` - } else if (opts.token) { - this[kProxyHeaders]['proxy-authorization'] = opts.token - } + if (!this.ws[kReceivedClose]) { + const frame = new WebsocketFrameSend(body) - const resolvedUrl = new URL(opts.uri) - const { origin, port, host } = resolvedUrl + this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)) - const connect = buildConnector({ ...opts.proxyTls }) - this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }) - this[kClient] = clientFactory(resolvedUrl, { connect }) - this[kAgent] = new Agent({ - ...opts, - connect: async (opts, callback) => { - let requestedHost = opts.host - if (!opts.port) { - requestedHost += `:${defaultProtocolPort(opts.protocol)}` - } - try { - const { socket, statusCode } = await this[kClient].connect({ - origin, - port, - path: requestedHost, - signal: opts.signal, - headers: { - ...this[kProxyHeaders], - host + if (channels.ping.hasSubscribers) { + channels.ping.publish({ + payload: body + }) } - }) - if (statusCode !== 200) { - socket.on('error', () => {}).destroy() - callback(new RequestAbortedError('Proxy response !== 200 when HTTP Tunneling')) } - if (opts.protocol !== 'https:') { - callback(null, socket) + + this.#state = parserStates.INFO + + if (this.#byteOffset > 0) { + continue + } else { + callback() return } - let servername - if (this[kRequestTls]) { - servername = this[kRequestTls].servername + } else if (this.#info.opcode === opcodes.PONG) { + // A Pong frame MAY be sent unsolicited. This serves as a + // unidirectional heartbeat. A response to an unsolicited Pong frame is + // not expected. + + const body = this.consume(payloadLength) + + if (channels.pong.hasSubscribers) { + channels.pong.publish({ + payload: body + }) + } + + if (this.#byteOffset > 0) { + continue } else { - servername = opts.servername + callback() + return } - this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback) - } catch (err) { - callback(err) } - } - }) - } - - dispatch (opts, handler) { - const { host } = new URL(opts.origin) - const headers = buildHeaders(opts.headers) - throwIfProxyAuthIsSent(headers) - return this[kAgent].dispatch( - { - ...opts, - headers: { - ...headers, - host + } else if (this.#state === parserStates.PAYLOADLENGTH_16) { + if (this.#byteOffset < 2) { + return callback() } - }, - handler - ) - } - - async [kClose] () { - await this[kAgent].close() - await this[kClient].close() - } - - async [kDestroy] () { - await this[kAgent].destroy() - await this[kClient].destroy() - } -} - -/** - * @param {string[] | Record} headers - * @returns {Record} - */ -function buildHeaders (headers) { - // When using undici.fetch, the headers list is stored - // as an array. - if (Array.isArray(headers)) { - /** @type {Record} */ - const headersPair = {} - - for (let i = 0; i < headers.length; i += 2) { - headersPair[headers[i]] = headers[i + 1] - } - - return headersPair - } - - return headers -} -/** - * @param {Record} headers - * - * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers - * Nevertheless, it was changed and to avoid a security vulnerability by end users - * this check was created. - * It should be removed in the next major version for performance reasons - */ -function throwIfProxyAuthIsSent (headers) { - const existProxyAuth = headers && Object.keys(headers) - .find((key) => key.toLowerCase() === 'proxy-authorization') - if (existProxyAuth) { - throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor') - } -} + const buffer = this.consume(2) -module.exports = ProxyAgent + this.#info.payloadLength = buffer.readUInt16BE(0) + this.#state = parserStates.READ_DATA + } else if (this.#state === parserStates.PAYLOADLENGTH_64) { + if (this.#byteOffset < 8) { + return callback() + } + const buffer = this.consume(8) + const upper = buffer.readUInt32BE(0) -/***/ }), + // 2^31 is the maxinimum bytes an arraybuffer can contain + // on 32-bit systems. Although, on 64-bit systems, this is + // 2^53-1 bytes. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length + // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275 + // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e + if (upper > 2 ** 31 - 1) { + failWebsocketConnection(this.ws, 'Received payload length > 2^31 bytes.') + return + } -/***/ 29459: -/***/ ((module) => { + const lower = buffer.readUInt32BE(4) -"use strict"; + this.#info.payloadLength = (upper << 8) + lower + this.#state = parserStates.READ_DATA + } else if (this.#state === parserStates.READ_DATA) { + if (this.#byteOffset < this.#info.payloadLength) { + // If there is still more data in this chunk that needs to be read + return callback() + } else if (this.#byteOffset >= this.#info.payloadLength) { + // If the server sent multiple frames in a single chunk + const body = this.consume(this.#info.payloadLength) -let fastNow = Date.now() -let fastNowTimeout + this.#fragments.push(body) -const fastTimers = [] + // If the frame is unfragmented, or a fragmented frame was terminated, + // a message was received + if (!this.#info.fragmented || (this.#info.fin && this.#info.opcode === opcodes.CONTINUATION)) { + const fullMessage = Buffer.concat(this.#fragments) -function onTimeout () { - fastNow = Date.now() + websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage) - let len = fastTimers.length - let idx = 0 - while (idx < len) { - const timer = fastTimers[idx] + this.#info = {} + this.#fragments.length = 0 + } - if (timer.state === 0) { - timer.state = fastNow + timer.delay - } else if (timer.state > 0 && fastNow >= timer.state) { - timer.state = -1 - timer.callback(timer.opaque) - } + this.#state = parserStates.INFO + } + } - if (timer.state === -1) { - timer.state = -2 - if (idx !== len - 1) { - fastTimers[idx] = fastTimers.pop() + if (this.#byteOffset > 0) { + continue } else { - fastTimers.pop() + callback() + break } - len -= 1 - } else { - idx += 1 } } - if (fastTimers.length > 0) { - refreshTimeout() - } -} - -function refreshTimeout () { - if (fastNowTimeout && fastNowTimeout.refresh) { - fastNowTimeout.refresh() - } else { - clearTimeout(fastNowTimeout) - fastNowTimeout = setTimeout(onTimeout, 1e3) - if (fastNowTimeout.unref) { - fastNowTimeout.unref() + /** + * Take n bytes from the buffered Buffers + * @param {number} n + * @returns {Buffer|null} + */ + consume (n) { + if (n > this.#byteOffset) { + return null + } else if (n === 0) { + return emptyBuffer } - } -} -class Timeout { - constructor (callback, delay, opaque) { - this.callback = callback - this.delay = delay - this.opaque = opaque + if (this.#buffers[0].length === n) { + this.#byteOffset -= this.#buffers[0].length + return this.#buffers.shift() + } - // -2 not in timer list - // -1 in timer list but inactive - // 0 in timer list waiting for time - // > 0 in timer list waiting for time to expire - this.state = -2 + const buffer = Buffer.allocUnsafe(n) + let offset = 0 - this.refresh() - } + while (offset !== n) { + const next = this.#buffers[0] + const { length } = next - refresh () { - if (this.state === -2) { - fastTimers.push(this) - if (!fastNowTimeout || fastTimers.length === 1) { - refreshTimeout() + if (length + offset === n) { + buffer.set(this.#buffers.shift(), offset) + break + } else if (length + offset > n) { + buffer.set(next.subarray(0, n - offset), offset) + this.#buffers[0] = next.subarray(n - offset) + break + } else { + buffer.set(this.#buffers.shift(), offset) + offset += next.length } } - this.state = 0 - } - - clear () { - this.state = -1 - } -} + this.#byteOffset -= n -module.exports = { - setTimeout (callback, delay, opaque) { - return delay < 1e3 - ? setTimeout(callback, delay, opaque) - : new Timeout(callback, delay, opaque) - }, - clearTimeout (timeout) { - if (timeout instanceof Timeout) { - timeout.clear() - } else { - clearTimeout(timeout) - } + return buffer } -} - - -/***/ }), - -/***/ 35354: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -const diagnosticsChannel = __nccwpck_require__(67643) -const { uid, states } = __nccwpck_require__(19188) -const { - kReadyState, - kSentClose, - kByteParser, - kReceivedClose -} = __nccwpck_require__(37578) -const { fireEvent, failWebsocketConnection } = __nccwpck_require__(25515) -const { CloseEvent } = __nccwpck_require__(52611) -const { makeRequest } = __nccwpck_require__(48359) -const { fetching } = __nccwpck_require__(74881) -const { Headers } = __nccwpck_require__(10554) -const { getGlobalDispatcher } = __nccwpck_require__(21892) -const { kHeadersList } = __nccwpck_require__(72785) + parseCloseBody (onlyCode, data) { + // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5 + /** @type {number|undefined} */ + let code -const channels = {} -channels.open = diagnosticsChannel.channel('undici:websocket:open') -channels.close = diagnosticsChannel.channel('undici:websocket:close') -channels.socketError = diagnosticsChannel.channel('undici:websocket:socket_error') + if (data.length >= 2) { + // _The WebSocket Connection Close Code_ is + // defined as the status code (Section 7.4) contained in the first Close + // control frame received by the application + code = data.readUInt16BE(0) + } -/** @type {import('crypto')} */ -let crypto -try { - crypto = __nccwpck_require__(6113) -} catch { + if (onlyCode) { + if (!isValidStatusCode(code)) { + return null + } -} + return { code } + } -/** - * @see https://websockets.spec.whatwg.org/#concept-websocket-establish - * @param {URL} url - * @param {string|string[]} protocols - * @param {import('./websocket').WebSocket} ws - * @param {(response: any) => void} onEstablish - * @param {Partial} options - */ -function establishWebSocketConnection (url, protocols, ws, onEstablish, options) { - // 1. Let requestURL be a copy of url, with its scheme set to "http", if url’s - // scheme is "ws", and to "https" otherwise. - const requestURL = url + // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6 + /** @type {Buffer} */ + let reason = data.subarray(2) - requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:' + // Remove BOM + if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) { + reason = reason.subarray(3) + } - // 2. Let request be a new request, whose URL is requestURL, client is client, - // service-workers mode is "none", referrer is "no-referrer", mode is - // "websocket", credentials mode is "include", cache mode is "no-store" , - // and redirect mode is "error". - const request = makeRequest({ - urlList: [requestURL], - serviceWorkers: 'none', - referrer: 'no-referrer', - mode: 'websocket', - credentials: 'include', - cache: 'no-store', - redirect: 'error' - }) + if (code !== undefined && !isValidStatusCode(code)) { + return null + } - // Note: undici extension, allow setting custom headers. - if (options.headers) { - const headersList = new Headers(options.headers)[kHeadersList] + try { + // TODO: optimize this + reason = new TextDecoder('utf-8', { fatal: true }).decode(reason) + } catch { + return null + } - request.headersList = headersList + return { code, reason } } - // 3. Append (`Upgrade`, `websocket`) to request’s header list. - // 4. Append (`Connection`, `Upgrade`) to request’s header list. - // Note: both of these are handled by undici currently. - // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397 - - // 5. Let keyValue be a nonce consisting of a randomly selected - // 16-byte value that has been forgiving-base64-encoded and - // isomorphic encoded. - const keyValue = crypto.randomBytes(16).toString('base64') - - // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s - // header list. - request.headersList.append('sec-websocket-key', keyValue) - - // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s - // header list. - request.headersList.append('sec-websocket-version', '13') - - // 8. For each protocol in protocols, combine - // (`Sec-WebSocket-Protocol`, protocol) in request’s header - // list. - for (const protocol of protocols) { - request.headersList.append('sec-websocket-protocol', protocol) + get closingInfo () { + return this.#info.closeInfo } +} - // 9. Let permessageDeflate be a user-agent defined - // "permessage-deflate" extension header value. - // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673 - // TODO: enable once permessage-deflate is supported - const permessageDeflate = '' // 'permessage-deflate; 15' +module.exports = { + ByteParser +} - // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to - // request’s header list. - // request.headersList.append('sec-websocket-extensions', permessageDeflate) - // 11. Fetch request with useParallelQueue set to true, and - // processResponse given response being these steps: - const controller = fetching({ - request, - useParallelQueue: true, - dispatcher: options.dispatcher ?? getGlobalDispatcher(), - processResponse (response) { - // 1. If response is a network error or its status is not 101, - // fail the WebSocket connection. - if (response.type === 'error' || response.status !== 101) { - failWebsocketConnection(ws, 'Received network error or non-101 status code.') - return - } +/***/ }), - // 2. If protocols is not the empty list and extracting header - // list values given `Sec-WebSocket-Protocol` and response’s - // header list results in null, failure, or the empty byte - // sequence, then fail the WebSocket connection. - if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) { - failWebsocketConnection(ws, 'Server did not respond with sent protocols.') - return - } +/***/ 37578: +/***/ ((module) => { - // 3. Follow the requirements stated step 2 to step 6, inclusive, - // of the last set of steps in section 4.1 of The WebSocket - // Protocol to validate response. This either results in fail - // the WebSocket connection or the WebSocket connection is - // established. +"use strict"; - // 2. If the response lacks an |Upgrade| header field or the |Upgrade| - // header field contains a value that is not an ASCII case- - // insensitive match for the value "websocket", the client MUST - // _Fail the WebSocket Connection_. - if (response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') { - failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".') - return - } - // 3. If the response lacks a |Connection| header field or the - // |Connection| header field doesn't contain a token that is an - // ASCII case-insensitive match for the value "Upgrade", the client - // MUST _Fail the WebSocket Connection_. - if (response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') { - failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".') - return - } +module.exports = { + kWebSocketURL: Symbol('url'), + kReadyState: Symbol('ready state'), + kController: Symbol('controller'), + kResponse: Symbol('response'), + kBinaryType: Symbol('binary type'), + kSentClose: Symbol('sent close'), + kReceivedClose: Symbol('received close'), + kByteParser: Symbol('byte parser') +} - // 4. If the response lacks a |Sec-WebSocket-Accept| header field or - // the |Sec-WebSocket-Accept| contains a value other than the - // base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket- - // Key| (as a string, not base64-decoded) with the string "258EAFA5- - // E914-47DA-95CA-C5AB0DC85B11" but ignoring any leading and - // trailing whitespace, the client MUST _Fail the WebSocket - // Connection_. - const secWSAccept = response.headersList.get('Sec-WebSocket-Accept') - const digest = crypto.createHash('sha1').update(keyValue + uid).digest('base64') - if (secWSAccept !== digest) { - failWebsocketConnection(ws, 'Incorrect hash received in Sec-WebSocket-Accept header.') - return - } - // 5. If the response includes a |Sec-WebSocket-Extensions| header - // field and this header field indicates the use of an extension - // that was not present in the client's handshake (the server has - // indicated an extension not requested by the client), the client - // MUST _Fail the WebSocket Connection_. (The parsing of this - // header field to determine which extensions are requested is - // discussed in Section 9.1.) - const secExtension = response.headersList.get('Sec-WebSocket-Extensions') +/***/ }), - if (secExtension !== null && secExtension !== permessageDeflate) { - failWebsocketConnection(ws, 'Received different permessage-deflate than the one set.') - return - } +/***/ 25515: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 6. If the response includes a |Sec-WebSocket-Protocol| header field - // and this header field indicates the use of a subprotocol that was - // not present in the client's handshake (the server has indicated a - // subprotocol not requested by the client), the client MUST _Fail - // the WebSocket Connection_. - const secProtocol = response.headersList.get('Sec-WebSocket-Protocol') +"use strict"; - if (secProtocol !== null && secProtocol !== request.headersList.get('Sec-WebSocket-Protocol')) { - failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.') - return - } - response.socket.on('data', onSocketData) - response.socket.on('close', onSocketClose) - response.socket.on('error', onSocketError) +const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(37578) +const { states, opcodes } = __nccwpck_require__(19188) +const { MessageEvent, ErrorEvent } = __nccwpck_require__(52611) - if (channels.open.hasSubscribers) { - channels.open.publish({ - address: response.socket.address(), - protocol: secProtocol, - extensions: secExtension - }) - } +/* globals Blob */ - onEstablish(response) - } - }) +/** + * @param {import('./websocket').WebSocket} ws + */ +function isEstablished (ws) { + // If the server's response is validated as provided for above, it is + // said that _The WebSocket Connection is Established_ and that the + // WebSocket Connection is in the OPEN state. + return ws[kReadyState] === states.OPEN +} - return controller +/** + * @param {import('./websocket').WebSocket} ws + */ +function isClosing (ws) { + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + return ws[kReadyState] === states.CLOSING } /** - * @param {Buffer} chunk + * @param {import('./websocket').WebSocket} ws */ -function onSocketData (chunk) { - if (!this.ws[kByteParser].write(chunk)) { - this.pause() - } +function isClosed (ws) { + return ws[kReadyState] === states.CLOSED } /** - * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol - * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4 + * @see https://dom.spec.whatwg.org/#concept-event-fire + * @param {string} e + * @param {EventTarget} target + * @param {EventInit | undefined} eventInitDict */ -function onSocketClose () { - const { ws } = this +function fireEvent (e, target, eventConstructor = Event, eventInitDict) { + // 1. If eventConstructor is not given, then let eventConstructor be Event. - // If the TCP connection was closed after the - // WebSocket closing handshake was completed, the WebSocket connection - // is said to have been closed _cleanly_. - const wasClean = ws[kSentClose] && ws[kReceivedClose] + // 2. Let event be the result of creating an event given eventConstructor, + // in the relevant realm of target. + // 3. Initialize event’s type attribute to e. + const event = new eventConstructor(e, eventInitDict) // eslint-disable-line new-cap - let code = 1005 - let reason = '' + // 4. Initialize any other IDL attributes of event as described in the + // invocation of this algorithm. - const result = ws[kByteParser].closingInfo + // 5. Return the result of dispatching event at target, with legacy target + // override flag set if set. + target.dispatchEvent(event) +} - if (result) { - code = result.code ?? 1005 - reason = result.reason - } else if (!ws[kSentClose]) { - // If _The WebSocket - // Connection is Closed_ and no Close control frame was received by the - // endpoint (such as could occur if the underlying transport connection - // is lost), _The WebSocket Connection Close Code_ is considered to be - // 1006. - code = 1006 +/** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + * @param {import('./websocket').WebSocket} ws + * @param {number} type Opcode + * @param {Buffer} data application data + */ +function websocketMessageReceived (ws, type, data) { + // 1. If ready state is not OPEN (1), then return. + if (ws[kReadyState] !== states.OPEN) { + return } - // 1. Change the ready state to CLOSED (3). - ws[kReadyState] = states.CLOSED + // 2. Let dataForEvent be determined by switching on type and binary type: + let dataForEvent - // 2. If the user agent was required to fail the WebSocket - // connection, or if the WebSocket connection was closed - // after being flagged as full, fire an event named error - // at the WebSocket object. - // TODO + if (type === opcodes.TEXT) { + // -> type indicates that the data is Text + // a new DOMString containing data + try { + dataForEvent = new TextDecoder('utf-8', { fatal: true }).decode(data) + } catch { + failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.') + return + } + } else if (type === opcodes.BINARY) { + if (ws[kBinaryType] === 'blob') { + // -> type indicates that the data is Binary and binary type is "blob" + // a new Blob object, created in the relevant Realm of the WebSocket + // object, that represents data as its raw data + dataForEvent = new Blob([data]) + } else { + // -> type indicates that the data is Binary and binary type is "arraybuffer" + // a new ArrayBuffer object, created in the relevant Realm of the + // WebSocket object, whose contents are data + dataForEvent = new Uint8Array(data).buffer + } + } - // 3. Fire an event named close at the WebSocket object, - // using CloseEvent, with the wasClean attribute - // initialized to true if the connection closed cleanly - // and false otherwise, the code attribute initialized to - // the WebSocket connection close code, and the reason - // attribute initialized to the result of applying UTF-8 - // decode without BOM to the WebSocket connection close - // reason. - fireEvent('close', ws, CloseEvent, { - wasClean, code, reason + // 3. Fire an event named message at the WebSocket object, using MessageEvent, + // with the origin attribute initialized to the serialization of the WebSocket + // object’s url's origin, and the data attribute initialized to dataForEvent. + fireEvent('message', ws, MessageEvent, { + origin: ws[kWebSocketURL].origin, + data: dataForEvent }) - - if (channels.close.hasSubscribers) { - channels.close.publish({ - websocket: ws, - code, - reason - }) - } } -function onSocketError (error) { - const { ws } = this +/** + * @see https://datatracker.ietf.org/doc/html/rfc6455 + * @see https://datatracker.ietf.org/doc/html/rfc2616 + * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407 + * @param {string} protocol + */ +function isValidSubprotocol (protocol) { + // If present, this value indicates one + // or more comma-separated subprotocol the client wishes to speak, + // ordered by preference. The elements that comprise this value + // MUST be non-empty strings with characters in the range U+0021 to + // U+007E not including separator characters as defined in + // [RFC2616] and MUST all be unique strings. + if (protocol.length === 0) { + return false + } - ws[kReadyState] = states.CLOSING + for (const char of protocol) { + const code = char.charCodeAt(0) - if (channels.socketError.hasSubscribers) { - channels.socketError.publish(error) + if ( + code < 0x21 || + code > 0x7E || + char === '(' || + char === ')' || + char === '<' || + char === '>' || + char === '@' || + char === ',' || + char === ';' || + char === ':' || + char === '\\' || + char === '"' || + char === '/' || + char === '[' || + char === ']' || + char === '?' || + char === '=' || + char === '{' || + char === '}' || + code === 32 || // SP + code === 9 // HT + ) { + return false + } } - this.destroy() -} - -module.exports = { - establishWebSocketConnection + return true } +/** + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4 + * @param {number} code + */ +function isValidStatusCode (code) { + if (code >= 1000 && code < 1015) { + return ( + code !== 1004 && // reserved + code !== 1005 && // "MUST NOT be set as a status code" + code !== 1006 // "MUST NOT be set as a status code" + ) + } -/***/ }), - -/***/ 19188: -/***/ ((module) => { - -"use strict"; - - -// This is a Globally Unique Identifier unique used -// to validate that the endpoint accepts websocket -// connections. -// See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3 -const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' - -/** @type {PropertyDescriptor} */ -const staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false + return code >= 3000 && code <= 4999 } -const states = { - CONNECTING: 0, - OPEN: 1, - CLOSING: 2, - CLOSED: 3 -} +/** + * @param {import('./websocket').WebSocket} ws + * @param {string|undefined} reason + */ +function failWebsocketConnection (ws, reason) { + const { [kController]: controller, [kResponse]: response } = ws -const opcodes = { - CONTINUATION: 0x0, - TEXT: 0x1, - BINARY: 0x2, - CLOSE: 0x8, - PING: 0x9, - PONG: 0xA -} + controller.abort() -const maxUnsigned16Bit = 2 ** 16 - 1 // 65535 + if (response?.socket && !response.socket.destroyed) { + response.socket.destroy() + } -const parserStates = { - INFO: 0, - PAYLOADLENGTH_16: 2, - PAYLOADLENGTH_64: 3, - READ_DATA: 4 + if (reason) { + fireEvent('error', ws, ErrorEvent, { + error: new Error(reason) + }) + } } -const emptyBuffer = Buffer.allocUnsafe(0) - module.exports = { - uid, - staticPropertyDescriptors, - states, - opcodes, - maxUnsigned16Bit, - parserStates, - emptyBuffer + isEstablished, + isClosing, + isClosed, + fireEvent, + isValidSubprotocol, + isValidStatusCode, + failWebsocketConnection, + websocketMessageReceived } /***/ }), -/***/ 52611: +/***/ 54284: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; const { webidl } = __nccwpck_require__(21744) -const { kEnumerableProperty } = __nccwpck_require__(83983) -const { MessagePort } = __nccwpck_require__(71267) +const { DOMException } = __nccwpck_require__(41037) +const { URLSerializer } = __nccwpck_require__(685) +const { getGlobalOrigin } = __nccwpck_require__(71246) +const { staticPropertyDescriptors, states, opcodes, emptyBuffer } = __nccwpck_require__(19188) +const { + kWebSocketURL, + kReadyState, + kController, + kBinaryType, + kResponse, + kSentClose, + kByteParser +} = __nccwpck_require__(37578) +const { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = __nccwpck_require__(25515) +const { establishWebSocketConnection } = __nccwpck_require__(35354) +const { WebsocketFrameSend } = __nccwpck_require__(25444) +const { ByteParser } = __nccwpck_require__(11688) +const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(83983) +const { getGlobalDispatcher } = __nccwpck_require__(21892) +const { types } = __nccwpck_require__(73837) -/** - * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent - */ -class MessageEvent extends Event { - #eventInit +let experimentalWarned = false - constructor (type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' }) +// https://websockets.spec.whatwg.org/#interface-definition +class WebSocket extends EventTarget { + #events = { + open: null, + error: null, + close: null, + message: null + } - type = webidl.converters.DOMString(type) - eventInitDict = webidl.converters.MessageEventInit(eventInitDict) + #bufferedAmount = 0 + #protocol = '' + #extensions = '' - super(type, eventInitDict) + /** + * @param {string} url + * @param {string|string[]} protocols + */ + constructor (url, protocols = []) { + super() - this.#eventInit = eventInitDict - } + webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket constructor' }) - get data () { - webidl.brandCheck(this, MessageEvent) + if (!experimentalWarned) { + experimentalWarned = true + process.emitWarning('WebSockets are experimental, expect them to change at any time.', { + code: 'UNDICI-WS' + }) + } - return this.#eventInit.data - } + const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols) - get origin () { - webidl.brandCheck(this, MessageEvent) + url = webidl.converters.USVString(url) + protocols = options.protocols - return this.#eventInit.origin - } + // 1. Let baseURL be this's relevant settings object's API base URL. + const baseURL = getGlobalOrigin() - get lastEventId () { - webidl.brandCheck(this, MessageEvent) + // 1. Let urlRecord be the result of applying the URL parser to url with baseURL. + let urlRecord - return this.#eventInit.lastEventId - } + try { + urlRecord = new URL(url, baseURL) + } catch (e) { + // 3. If urlRecord is failure, then throw a "SyntaxError" DOMException. + throw new DOMException(e, 'SyntaxError') + } - get source () { - webidl.brandCheck(this, MessageEvent) + // 4. If urlRecord’s scheme is "http", then set urlRecord’s scheme to "ws". + if (urlRecord.protocol === 'http:') { + urlRecord.protocol = 'ws:' + } else if (urlRecord.protocol === 'https:') { + // 5. Otherwise, if urlRecord’s scheme is "https", set urlRecord’s scheme to "wss". + urlRecord.protocol = 'wss:' + } - return this.#eventInit.source - } + // 6. If urlRecord’s scheme is not "ws" or "wss", then throw a "SyntaxError" DOMException. + if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') { + throw new DOMException( + `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, + 'SyntaxError' + ) + } - get ports () { - webidl.brandCheck(this, MessageEvent) + // 7. If urlRecord’s fragment is non-null, then throw a "SyntaxError" + // DOMException. + if (urlRecord.hash || urlRecord.href.endsWith('#')) { + throw new DOMException('Got fragment', 'SyntaxError') + } - if (!Object.isFrozen(this.#eventInit.ports)) { - Object.freeze(this.#eventInit.ports) + // 8. If protocols is a string, set protocols to a sequence consisting + // of just that string. + if (typeof protocols === 'string') { + protocols = [protocols] } - return this.#eventInit.ports - } + // 9. If any of the values in protocols occur more than once or otherwise + // fail to match the requirements for elements that comprise the value + // of `Sec-WebSocket-Protocol` fields as defined by The WebSocket + // protocol, then throw a "SyntaxError" DOMException. + if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) { + throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError') + } - initMessageEvent ( - type, - bubbles = false, - cancelable = false, - data = null, - origin = '', - lastEventId = '', - source = null, - ports = [] - ) { - webidl.brandCheck(this, MessageEvent) + if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) { + throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError') + } - webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent.initMessageEvent' }) + // 10. Set this's url to urlRecord. + this[kWebSocketURL] = new URL(urlRecord.href) - return new MessageEvent(type, { - bubbles, cancelable, data, origin, lastEventId, source, ports - }) - } -} + // 11. Let client be this's relevant settings object. -/** - * @see https://websockets.spec.whatwg.org/#the-closeevent-interface - */ -class CloseEvent extends Event { - #eventInit + // 12. Run this step in parallel: - constructor (type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' }) + // 1. Establish a WebSocket connection given urlRecord, protocols, + // and client. + this[kController] = establishWebSocketConnection( + urlRecord, + protocols, + this, + (response) => this.#onConnectionEstablished(response), + options + ) - type = webidl.converters.DOMString(type) - eventInitDict = webidl.converters.CloseEventInit(eventInitDict) + // Each WebSocket object has an associated ready state, which is a + // number representing the state of the connection. Initially it must + // be CONNECTING (0). + this[kReadyState] = WebSocket.CONNECTING + + // The extensions attribute must initially return the empty string. + + // The protocol attribute must initially return the empty string. + + // Each WebSocket object has an associated binary type, which is a + // BinaryType. Initially it must be "blob". + this[kBinaryType] = 'blob' + } + + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-close + * @param {number|undefined} code + * @param {string|undefined} reason + */ + close (code = undefined, reason = undefined) { + webidl.brandCheck(this, WebSocket) - super(type, eventInitDict) + if (code !== undefined) { + code = webidl.converters['unsigned short'](code, { clamp: true }) + } - this.#eventInit = eventInitDict - } + if (reason !== undefined) { + reason = webidl.converters.USVString(reason) + } - get wasClean () { - webidl.brandCheck(this, CloseEvent) + // 1. If code is present, but is neither an integer equal to 1000 nor an + // integer in the range 3000 to 4999, inclusive, throw an + // "InvalidAccessError" DOMException. + if (code !== undefined) { + if (code !== 1000 && (code < 3000 || code > 4999)) { + throw new DOMException('invalid code', 'InvalidAccessError') + } + } - return this.#eventInit.wasClean - } + let reasonByteLength = 0 - get code () { - webidl.brandCheck(this, CloseEvent) + // 2. If reason is present, then run these substeps: + if (reason !== undefined) { + // 1. Let reasonBytes be the result of encoding reason. + // 2. If reasonBytes is longer than 123 bytes, then throw a + // "SyntaxError" DOMException. + reasonByteLength = Buffer.byteLength(reason) - return this.#eventInit.code - } + if (reasonByteLength > 123) { + throw new DOMException( + `Reason must be less than 123 bytes; received ${reasonByteLength}`, + 'SyntaxError' + ) + } + } - get reason () { - webidl.brandCheck(this, CloseEvent) + // 3. Run the first matching steps from the following list: + if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) { + // If this's ready state is CLOSING (2) or CLOSED (3) + // Do nothing. + } else if (!isEstablished(this)) { + // If the WebSocket connection is not yet established + // Fail the WebSocket connection and set this's ready state + // to CLOSING (2). + failWebsocketConnection(this, 'Connection was closed before it was established.') + this[kReadyState] = WebSocket.CLOSING + } else if (!isClosing(this)) { + // If the WebSocket closing handshake has not yet been started + // Start the WebSocket closing handshake and set this's ready + // state to CLOSING (2). + // - If neither code nor reason is present, the WebSocket Close + // message must not have a body. + // - If code is present, then the status code to use in the + // WebSocket Close message must be the integer given by code. + // - If reason is also present, then reasonBytes must be + // provided in the Close message after the status code. - return this.#eventInit.reason - } -} + const frame = new WebsocketFrameSend() -// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface -class ErrorEvent extends Event { - #eventInit + // If neither code nor reason is present, the WebSocket Close + // message must not have a body. - constructor (type, eventInitDict) { - webidl.argumentLengthCheck(arguments, 1, { header: 'ErrorEvent constructor' }) + // If code is present, then the status code to use in the + // WebSocket Close message must be the integer given by code. + if (code !== undefined && reason === undefined) { + frame.frameData = Buffer.allocUnsafe(2) + frame.frameData.writeUInt16BE(code, 0) + } else if (code !== undefined && reason !== undefined) { + // If reason is also present, then reasonBytes must be + // provided in the Close message after the status code. + frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength) + frame.frameData.writeUInt16BE(code, 0) + // the body MAY contain UTF-8-encoded data with value /reason/ + frame.frameData.write(reason, 2, 'utf-8') + } else { + frame.frameData = emptyBuffer + } - super(type, eventInitDict) + /** @type {import('stream').Duplex} */ + const socket = this[kResponse].socket - type = webidl.converters.DOMString(type) - eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}) + socket.write(frame.createFrame(opcodes.CLOSE), (err) => { + if (!err) { + this[kSentClose] = true + } + }) - this.#eventInit = eventInitDict + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + this[kReadyState] = states.CLOSING + } else { + // Otherwise + // Set this's ready state to CLOSING (2). + this[kReadyState] = WebSocket.CLOSING + } } - get message () { - webidl.brandCheck(this, ErrorEvent) + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-send + * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data + */ + send (data) { + webidl.brandCheck(this, WebSocket) - return this.#eventInit.message - } + webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket.send' }) - get filename () { - webidl.brandCheck(this, ErrorEvent) + data = webidl.converters.WebSocketSendData(data) - return this.#eventInit.filename - } + // 1. If this's ready state is CONNECTING, then throw an + // "InvalidStateError" DOMException. + if (this[kReadyState] === WebSocket.CONNECTING) { + throw new DOMException('Sent before connected.', 'InvalidStateError') + } - get lineno () { - webidl.brandCheck(this, ErrorEvent) + // 2. Run the appropriate set of steps from the following list: + // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1 + // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2 - return this.#eventInit.lineno - } + if (!isEstablished(this) || isClosing(this)) { + return + } - get colno () { - webidl.brandCheck(this, ErrorEvent) + /** @type {import('stream').Duplex} */ + const socket = this[kResponse].socket - return this.#eventInit.colno - } + // If data is a string + if (typeof data === 'string') { + // If the WebSocket connection is established and the WebSocket + // closing handshake has not yet started, then the user agent + // must send a WebSocket Message comprised of the data argument + // using a text frame opcode; if the data cannot be sent, e.g. + // because it would need to be buffered but the buffer is full, + // the user agent must flag the WebSocket as full and then close + // the WebSocket connection. Any invocation of this method with a + // string argument that does not throw an exception must increase + // the bufferedAmount attribute by the number of bytes needed to + // express the argument as UTF-8. - get error () { - webidl.brandCheck(this, ErrorEvent) + const value = Buffer.from(data) + const frame = new WebsocketFrameSend(value) + const buffer = frame.createFrame(opcodes.TEXT) - return this.#eventInit.error - } -} + this.#bufferedAmount += value.byteLength + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength + }) + } else if (types.isArrayBuffer(data)) { + // If the WebSocket connection is established, and the WebSocket + // closing handshake has not yet started, then the user agent must + // send a WebSocket Message comprised of data using a binary frame + // opcode; if the data cannot be sent, e.g. because it would need + // to be buffered but the buffer is full, the user agent must flag + // the WebSocket as full and then close the WebSocket connection. + // The data to be sent is the data stored in the buffer described + // by the ArrayBuffer object. Any invocation of this method with an + // ArrayBuffer argument that does not throw an exception must + // increase the bufferedAmount attribute by the length of the + // ArrayBuffer in bytes. -Object.defineProperties(MessageEvent.prototype, { - [Symbol.toStringTag]: { - value: 'MessageEvent', - configurable: true - }, - data: kEnumerableProperty, - origin: kEnumerableProperty, - lastEventId: kEnumerableProperty, - source: kEnumerableProperty, - ports: kEnumerableProperty, - initMessageEvent: kEnumerableProperty -}) + const value = Buffer.from(data) + const frame = new WebsocketFrameSend(value) + const buffer = frame.createFrame(opcodes.BINARY) -Object.defineProperties(CloseEvent.prototype, { - [Symbol.toStringTag]: { - value: 'CloseEvent', - configurable: true - }, - reason: kEnumerableProperty, - code: kEnumerableProperty, - wasClean: kEnumerableProperty -}) + this.#bufferedAmount += value.byteLength + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength + }) + } else if (ArrayBuffer.isView(data)) { + // If the WebSocket connection is established, and the WebSocket + // closing handshake has not yet started, then the user agent must + // send a WebSocket Message comprised of data using a binary frame + // opcode; if the data cannot be sent, e.g. because it would need to + // be buffered but the buffer is full, the user agent must flag the + // WebSocket as full and then close the WebSocket connection. The + // data to be sent is the data stored in the section of the buffer + // described by the ArrayBuffer object that data references. Any + // invocation of this method with this kind of argument that does + // not throw an exception must increase the bufferedAmount attribute + // by the length of data’s buffer in bytes. -Object.defineProperties(ErrorEvent.prototype, { - [Symbol.toStringTag]: { - value: 'ErrorEvent', - configurable: true - }, - message: kEnumerableProperty, - filename: kEnumerableProperty, - lineno: kEnumerableProperty, - colno: kEnumerableProperty, - error: kEnumerableProperty -}) + const ab = Buffer.from(data, data.byteOffset, data.byteLength) -webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort) + const frame = new WebsocketFrameSend(ab) + const buffer = frame.createFrame(opcodes.BINARY) -webidl.converters['sequence'] = webidl.sequenceConverter( - webidl.converters.MessagePort -) + this.#bufferedAmount += ab.byteLength + socket.write(buffer, () => { + this.#bufferedAmount -= ab.byteLength + }) + } else if (isBlobLike(data)) { + // If the WebSocket connection is established, and the WebSocket + // closing handshake has not yet started, then the user agent must + // send a WebSocket Message comprised of data using a binary frame + // opcode; if the data cannot be sent, e.g. because it would need to + // be buffered but the buffer is full, the user agent must flag the + // WebSocket as full and then close the WebSocket connection. The data + // to be sent is the raw data represented by the Blob object. Any + // invocation of this method with a Blob argument that does not throw + // an exception must increase the bufferedAmount attribute by the size + // of the Blob object’s raw data, in bytes. -const eventInit = [ - { - key: 'bubbles', - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: 'cancelable', - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: 'composed', - converter: webidl.converters.boolean, - defaultValue: false - } -] + const frame = new WebsocketFrameSend() -webidl.converters.MessageEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: 'data', - converter: webidl.converters.any, - defaultValue: null - }, - { - key: 'origin', - converter: webidl.converters.USVString, - defaultValue: '' - }, - { - key: 'lastEventId', - converter: webidl.converters.DOMString, - defaultValue: '' - }, - { - key: 'source', - // Node doesn't implement WindowProxy or ServiceWorker, so the only - // valid value for source is a MessagePort. - converter: webidl.nullableConverter(webidl.converters.MessagePort), - defaultValue: null - }, - { - key: 'ports', - converter: webidl.converters['sequence'], - get defaultValue () { - return [] + data.arrayBuffer().then((ab) => { + const value = Buffer.from(ab) + frame.frameData = value + const buffer = frame.createFrame(opcodes.BINARY) + + this.#bufferedAmount += value.byteLength + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength + }) + }) } } -]) -webidl.converters.CloseEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: 'wasClean', - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: 'code', - converter: webidl.converters['unsigned short'], - defaultValue: 0 - }, - { - key: 'reason', - converter: webidl.converters.USVString, - defaultValue: '' - } -]) + get readyState () { + webidl.brandCheck(this, WebSocket) -webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: 'message', - converter: webidl.converters.DOMString, - defaultValue: '' - }, - { - key: 'filename', - converter: webidl.converters.USVString, - defaultValue: '' - }, - { - key: 'lineno', - converter: webidl.converters['unsigned long'], - defaultValue: 0 - }, - { - key: 'colno', - converter: webidl.converters['unsigned long'], - defaultValue: 0 - }, - { - key: 'error', - converter: webidl.converters.any + // The readyState getter steps are to return this's ready state. + return this[kReadyState] } -]) -module.exports = { - MessageEvent, - CloseEvent, - ErrorEvent -} + get bufferedAmount () { + webidl.brandCheck(this, WebSocket) + return this.#bufferedAmount + } -/***/ }), + get url () { + webidl.brandCheck(this, WebSocket) -/***/ 25444: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + // The url getter steps are to return this's url, serialized. + return URLSerializer(this[kWebSocketURL]) + } -"use strict"; + get extensions () { + webidl.brandCheck(this, WebSocket) + return this.#extensions + } -const { maxUnsigned16Bit } = __nccwpck_require__(19188) + get protocol () { + webidl.brandCheck(this, WebSocket) -/** @type {import('crypto')} */ -let crypto -try { - crypto = __nccwpck_require__(6113) -} catch { + return this.#protocol + } -} + get onopen () { + webidl.brandCheck(this, WebSocket) -class WebsocketFrameSend { - /** - * @param {Buffer|undefined} data - */ - constructor (data) { - this.frameData = data - this.maskKey = crypto.randomBytes(4) + return this.#events.open } - createFrame (opcode) { - const bodyLength = this.frameData?.byteLength ?? 0 - - /** @type {number} */ - let payloadLength = bodyLength // 0-125 - let offset = 6 + set onopen (fn) { + webidl.brandCheck(this, WebSocket) - if (bodyLength > maxUnsigned16Bit) { - offset += 8 // payload length is next 8 bytes - payloadLength = 127 - } else if (bodyLength > 125) { - offset += 2 // payload length is next 2 bytes - payloadLength = 126 + if (this.#events.open) { + this.removeEventListener('open', this.#events.open) } - const buffer = Buffer.allocUnsafe(bodyLength + offset) + if (typeof fn === 'function') { + this.#events.open = fn + this.addEventListener('open', fn) + } else { + this.#events.open = null + } + } - // Clear first 2 bytes, everything else is overwritten - buffer[0] = buffer[1] = 0 - buffer[0] |= 0x80 // FIN - buffer[0] = (buffer[0] & 0xF0) + opcode // opcode + get onerror () { + webidl.brandCheck(this, WebSocket) - /*! ws. MIT License. Einar Otto Stangvik */ - buffer[offset - 4] = this.maskKey[0] - buffer[offset - 3] = this.maskKey[1] - buffer[offset - 2] = this.maskKey[2] - buffer[offset - 1] = this.maskKey[3] + return this.#events.error + } - buffer[1] = payloadLength + set onerror (fn) { + webidl.brandCheck(this, WebSocket) - if (payloadLength === 126) { - buffer.writeUInt16BE(bodyLength, 2) - } else if (payloadLength === 127) { - // Clear extended payload length - buffer[2] = buffer[3] = 0 - buffer.writeUIntBE(bodyLength, 4, 6) + if (this.#events.error) { + this.removeEventListener('error', this.#events.error) } - buffer[1] |= 0x80 // MASK - - // mask body - for (let i = 0; i < bodyLength; i++) { - buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4] + if (typeof fn === 'function') { + this.#events.error = fn + this.addEventListener('error', fn) + } else { + this.#events.error = null } - - return buffer } -} - -module.exports = { - WebsocketFrameSend -} - -/***/ }), - -/***/ 11688: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + get onclose () { + webidl.brandCheck(this, WebSocket) -"use strict"; + return this.#events.close + } + set onclose (fn) { + webidl.brandCheck(this, WebSocket) -const { Writable } = __nccwpck_require__(12781) -const diagnosticsChannel = __nccwpck_require__(67643) -const { parserStates, opcodes, states, emptyBuffer } = __nccwpck_require__(19188) -const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(37578) -const { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = __nccwpck_require__(25515) -const { WebsocketFrameSend } = __nccwpck_require__(25444) + if (this.#events.close) { + this.removeEventListener('close', this.#events.close) + } -// This code was influenced by ws released under the MIT license. -// Copyright (c) 2011 Einar Otto Stangvik -// Copyright (c) 2013 Arnout Kazemier and contributors -// Copyright (c) 2016 Luigi Pinca and contributors + if (typeof fn === 'function') { + this.#events.close = fn + this.addEventListener('close', fn) + } else { + this.#events.close = null + } + } -const channels = {} -channels.ping = diagnosticsChannel.channel('undici:websocket:ping') -channels.pong = diagnosticsChannel.channel('undici:websocket:pong') + get onmessage () { + webidl.brandCheck(this, WebSocket) -class ByteParser extends Writable { - #buffers = [] - #byteOffset = 0 + return this.#events.message + } - #state = parserStates.INFO + set onmessage (fn) { + webidl.brandCheck(this, WebSocket) - #info = {} - #fragments = [] + if (this.#events.message) { + this.removeEventListener('message', this.#events.message) + } - constructor (ws) { - super() + if (typeof fn === 'function') { + this.#events.message = fn + this.addEventListener('message', fn) + } else { + this.#events.message = null + } + } - this.ws = ws + get binaryType () { + webidl.brandCheck(this, WebSocket) + + return this[kBinaryType] } - /** - * @param {Buffer} chunk - * @param {() => void} callback - */ - _write (chunk, _, callback) { - this.#buffers.push(chunk) - this.#byteOffset += chunk.length + set binaryType (type) { + webidl.brandCheck(this, WebSocket) - this.run(callback) + if (type !== 'blob' && type !== 'arraybuffer') { + this[kBinaryType] = 'blob' + } else { + this[kBinaryType] = type + } } /** - * Runs whenever a new chunk is received. - * Callback is called whenever there are no more chunks buffering, - * or not enough bytes are buffered to parse. + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol */ - run (callback) { - while (true) { - if (this.#state === parserStates.INFO) { - // If there aren't enough bytes to parse the payload length, etc. - if (this.#byteOffset < 2) { - return callback() - } + #onConnectionEstablished (response) { + // processResponse is called when the "response’s header list has been received and initialized." + // once this happens, the connection is open + this[kResponse] = response - const buffer = this.consume(2) + const parser = new ByteParser(this) + parser.on('drain', function onParserDrain () { + this.ws[kResponse].socket.resume() + }) - this.#info.fin = (buffer[0] & 0x80) !== 0 - this.#info.opcode = buffer[0] & 0x0F + response.socket.ws = this + this[kByteParser] = parser - // If we receive a fragmented message, we use the type of the first - // frame to parse the full message as binary/text, when it's terminated - this.#info.originalOpcode ??= this.#info.opcode + // 1. Change the ready state to OPEN (1). + this[kReadyState] = states.OPEN - this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION + // 2. Change the extensions attribute’s value to the extensions in use, if + // it is not the null value. + // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1 + const extensions = response.headersList.get('sec-websocket-extensions') - if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { - // Only text and binary frames can be fragmented - failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.') - return - } + if (extensions !== null) { + this.#extensions = extensions + } - const payloadLength = buffer[1] & 0x7F + // 3. Change the protocol attribute’s value to the subprotocol in use, if + // it is not the null value. + // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9 + const protocol = response.headersList.get('sec-websocket-protocol') - if (payloadLength <= 125) { - this.#info.payloadLength = payloadLength - this.#state = parserStates.READ_DATA - } else if (payloadLength === 126) { - this.#state = parserStates.PAYLOADLENGTH_16 - } else if (payloadLength === 127) { - this.#state = parserStates.PAYLOADLENGTH_64 - } + if (protocol !== null) { + this.#protocol = protocol + } - if (this.#info.fragmented && payloadLength > 125) { - // A fragmented frame can't be fragmented itself - failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.') - return - } else if ( - (this.#info.opcode === opcodes.PING || - this.#info.opcode === opcodes.PONG || - this.#info.opcode === opcodes.CLOSE) && - payloadLength > 125 - ) { - // Control frames can have a payload length of 125 bytes MAX - failWebsocketConnection(this.ws, 'Payload length for control frame exceeded 125 bytes.') - return - } else if (this.#info.opcode === opcodes.CLOSE) { - if (payloadLength === 1) { - failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.') - return - } + // 4. Fire an event named open at the WebSocket object. + fireEvent('open', this) + } +} - const body = this.consume(payloadLength) +// https://websockets.spec.whatwg.org/#dom-websocket-connecting +WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING +// https://websockets.spec.whatwg.org/#dom-websocket-open +WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN +// https://websockets.spec.whatwg.org/#dom-websocket-closing +WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING +// https://websockets.spec.whatwg.org/#dom-websocket-closed +WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED - this.#info.closeInfo = this.parseCloseBody(false, body) +Object.defineProperties(WebSocket.prototype, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors, + url: kEnumerableProperty, + readyState: kEnumerableProperty, + bufferedAmount: kEnumerableProperty, + onopen: kEnumerableProperty, + onerror: kEnumerableProperty, + onclose: kEnumerableProperty, + close: kEnumerableProperty, + onmessage: kEnumerableProperty, + binaryType: kEnumerableProperty, + send: kEnumerableProperty, + extensions: kEnumerableProperty, + protocol: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'WebSocket', + writable: false, + enumerable: false, + configurable: true + } +}) - if (!this.ws[kSentClose]) { - // If an endpoint receives a Close frame and did not previously send a - // Close frame, the endpoint MUST send a Close frame in response. (When - // sending a Close frame in response, the endpoint typically echos the - // status code it received.) - const body = Buffer.allocUnsafe(2) - body.writeUInt16BE(this.#info.closeInfo.code, 0) - const closeFrame = new WebsocketFrameSend(body) +Object.defineProperties(WebSocket, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors +}) - this.ws[kResponse].socket.write( - closeFrame.createFrame(opcodes.CLOSE), - (err) => { - if (!err) { - this.ws[kSentClose] = true - } - } - ) - } +webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.DOMString +) - // Upon either sending or receiving a Close control frame, it is said - // that _The WebSocket Closing Handshake is Started_ and that the - // WebSocket connection is in the CLOSING state. - this.ws[kReadyState] = states.CLOSING - this.ws[kReceivedClose] = true +webidl.converters['DOMString or sequence'] = function (V) { + if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) { + return webidl.converters['sequence'](V) + } - this.end() + return webidl.converters.DOMString(V) +} - return - } else if (this.#info.opcode === opcodes.PING) { - // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in - // response, unless it already received a Close frame. - // A Pong frame sent in response to a Ping frame must have identical - // "Application data" +// This implements the propsal made in https://github.com/whatwg/websockets/issues/42 +webidl.converters.WebSocketInit = webidl.dictionaryConverter([ + { + key: 'protocols', + converter: webidl.converters['DOMString or sequence'], + get defaultValue () { + return [] + } + }, + { + key: 'dispatcher', + converter: (V) => V, + get defaultValue () { + return getGlobalDispatcher() + } + }, + { + key: 'headers', + converter: webidl.nullableConverter(webidl.converters.HeadersInit) + } +]) - const body = this.consume(payloadLength) +webidl.converters['DOMString or sequence or WebSocketInit'] = function (V) { + if (webidl.util.Type(V) === 'Object' && !(Symbol.iterator in V)) { + return webidl.converters.WebSocketInit(V) + } - if (!this.ws[kReceivedClose]) { - const frame = new WebsocketFrameSend(body) + return { protocols: webidl.converters['DOMString or sequence'](V) } +} - this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)) +webidl.converters.WebSocketSendData = function (V) { + if (webidl.util.Type(V) === 'Object') { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }) + } - if (channels.ping.hasSubscribers) { - channels.ping.publish({ - payload: body - }) - } - } + if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { + return webidl.converters.BufferSource(V) + } + } - this.#state = parserStates.INFO + return webidl.converters.USVString(V) +} - if (this.#byteOffset > 0) { - continue - } else { - callback() - return - } - } else if (this.#info.opcode === opcodes.PONG) { - // A Pong frame MAY be sent unsolicited. This serves as a - // unidirectional heartbeat. A response to an unsolicited Pong frame is - // not expected. +module.exports = { + WebSocket +} - const body = this.consume(payloadLength) - if (channels.pong.hasSubscribers) { - channels.pong.publish({ - payload: body - }) - } +/***/ }), - if (this.#byteOffset > 0) { - continue - } else { - callback() - return - } - } - } else if (this.#state === parserStates.PAYLOADLENGTH_16) { - if (this.#byteOffset < 2) { - return callback() - } +/***/ 45030: +/***/ ((__unused_webpack_module, exports) => { - const buffer = this.consume(2) +"use strict"; - this.#info.payloadLength = buffer.readUInt16BE(0) - this.#state = parserStates.READ_DATA - } else if (this.#state === parserStates.PAYLOADLENGTH_64) { - if (this.#byteOffset < 8) { - return callback() - } - const buffer = this.consume(8) - const upper = buffer.readUInt32BE(0) +Object.defineProperty(exports, "__esModule", ({ value: true })); - // 2^31 is the maxinimum bytes an arraybuffer can contain - // on 32-bit systems. Although, on 64-bit systems, this is - // 2^53-1 bytes. - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length - // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275 - // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e - if (upper > 2 ** 31 - 1) { - failWebsocketConnection(this.ws, 'Received payload length > 2^31 bytes.') - return - } +function getUserAgent() { + if (typeof navigator === "object" && "userAgent" in navigator) { + return navigator.userAgent; + } - const lower = buffer.readUInt32BE(4) + if (typeof process === "object" && process.version !== undefined) { + return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; + } - this.#info.payloadLength = (upper << 8) + lower - this.#state = parserStates.READ_DATA - } else if (this.#state === parserStates.READ_DATA) { - if (this.#byteOffset < this.#info.payloadLength) { - // If there is still more data in this chunk that needs to be read - return callback() - } else if (this.#byteOffset >= this.#info.payloadLength) { - // If the server sent multiple frames in a single chunk + return ""; +} - const body = this.consume(this.#info.payloadLength) +exports.getUserAgent = getUserAgent; +//# sourceMappingURL=index.js.map - this.#fragments.push(body) - // If the frame is unfragmented, or a fragmented frame was terminated, - // a message was received - if (!this.#info.fragmented || (this.#info.fin && this.#info.opcode === opcodes.CONTINUATION)) { - const fullMessage = Buffer.concat(this.#fragments) +/***/ }), - websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage) +/***/ 9046: +/***/ ((__unused_webpack_module, exports) => { - this.#info = {} - this.#fragments.length = 0 - } +"use strict"; - this.#state = parserStates.INFO - } - } - if (this.#byteOffset > 0) { - continue - } else { - callback() - break - } +exports.fromCallback = function (fn) { + return Object.defineProperty(function (...args) { + if (typeof args[args.length - 1] === 'function') fn.apply(this, args) + else { + return new Promise((resolve, reject) => { + args.push((err, res) => (err != null) ? reject(err) : resolve(res)) + fn.apply(this, args) + }) } - } + }, 'name', { value: fn.name }) +} - /** - * Take n bytes from the buffered Buffers - * @param {number} n - * @returns {Buffer|null} - */ - consume (n) { - if (n > this.#byteOffset) { - return null - } else if (n === 0) { - return emptyBuffer +exports.fromPromise = function (fn) { + return Object.defineProperty(function (...args) { + const cb = args[args.length - 1] + if (typeof cb !== 'function') return fn.apply(this, args) + else { + args.pop() + fn.apply(this, args).then(r => cb(null, r), cb) } + }, 'name', { value: fn.name }) +} - if (this.#buffers[0].length === n) { - this.#byteOffset -= this.#buffers[0].length - return this.#buffers.shift() - } - const buffer = Buffer.allocUnsafe(n) - let offset = 0 +/***/ }), - while (offset !== n) { - const next = this.#buffers[0] - const { length } = next +/***/ 75840: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - if (length + offset === n) { - buffer.set(this.#buffers.shift(), offset) - break - } else if (length + offset > n) { - buffer.set(next.subarray(0, n - offset), offset) - this.#buffers[0] = next.subarray(n - offset) - break - } else { - buffer.set(this.#buffers.shift(), offset) - offset += next.length - } - } +"use strict"; - this.#byteOffset -= n - return buffer +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "v1", ({ + enumerable: true, + get: function () { + return _v.default; + } +})); +Object.defineProperty(exports, "v3", ({ + enumerable: true, + get: function () { + return _v2.default; + } +})); +Object.defineProperty(exports, "v4", ({ + enumerable: true, + get: function () { + return _v3.default; + } +})); +Object.defineProperty(exports, "v5", ({ + enumerable: true, + get: function () { + return _v4.default; + } +})); +Object.defineProperty(exports, "NIL", ({ + enumerable: true, + get: function () { + return _nil.default; + } +})); +Object.defineProperty(exports, "version", ({ + enumerable: true, + get: function () { + return _version.default; + } +})); +Object.defineProperty(exports, "validate", ({ + enumerable: true, + get: function () { + return _validate.default; + } +})); +Object.defineProperty(exports, "stringify", ({ + enumerable: true, + get: function () { + return _stringify.default; + } +})); +Object.defineProperty(exports, "parse", ({ + enumerable: true, + get: function () { + return _parse.default; } +})); - parseCloseBody (onlyCode, data) { - // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5 - /** @type {number|undefined} */ - let code +var _v = _interopRequireDefault(__nccwpck_require__(78628)); - if (data.length >= 2) { - // _The WebSocket Connection Close Code_ is - // defined as the status code (Section 7.4) contained in the first Close - // control frame received by the application - code = data.readUInt16BE(0) - } +var _v2 = _interopRequireDefault(__nccwpck_require__(86409)); - if (onlyCode) { - if (!isValidStatusCode(code)) { - return null - } +var _v3 = _interopRequireDefault(__nccwpck_require__(85122)); - return { code } - } +var _v4 = _interopRequireDefault(__nccwpck_require__(79120)); - // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6 - /** @type {Buffer} */ - let reason = data.subarray(2) +var _nil = _interopRequireDefault(__nccwpck_require__(25332)); - // Remove BOM - if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) { - reason = reason.subarray(3) - } +var _version = _interopRequireDefault(__nccwpck_require__(81595)); - if (code !== undefined && !isValidStatusCode(code)) { - return null - } +var _validate = _interopRequireDefault(__nccwpck_require__(66900)); - try { - // TODO: optimize this - reason = new TextDecoder('utf-8', { fatal: true }).decode(reason) - } catch { - return null - } +var _stringify = _interopRequireDefault(__nccwpck_require__(18950)); - return { code, reason } - } +var _parse = _interopRequireDefault(__nccwpck_require__(62746)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), + +/***/ 4569: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - get closingInfo () { - return this.#info.closeInfo +function md5(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); } -} -module.exports = { - ByteParser + return _crypto.default.createHash('md5').update(bytes).digest(); } +var _default = md5; +exports["default"] = _default; /***/ }), -/***/ 37578: -/***/ ((module) => { +/***/ 25332: +/***/ ((__unused_webpack_module, exports) => { "use strict"; -module.exports = { - kWebSocketURL: Symbol('url'), - kReadyState: Symbol('ready state'), - kController: Symbol('controller'), - kResponse: Symbol('response'), - kBinaryType: Symbol('binary type'), - kSentClose: Symbol('sent close'), - kReceivedClose: Symbol('received close'), - kByteParser: Symbol('byte parser') -} - +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _default = '00000000-0000-0000-0000-000000000000'; +exports["default"] = _default; /***/ }), -/***/ 25515: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ 62746: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; -const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(37578) -const { states, opcodes } = __nccwpck_require__(19188) -const { MessageEvent, ErrorEvent } = __nccwpck_require__(52611) - -/* globals Blob */ - -/** - * @param {import('./websocket').WebSocket} ws - */ -function isEstablished (ws) { - // If the server's response is validated as provided for above, it is - // said that _The WebSocket Connection is Established_ and that the - // WebSocket Connection is in the OPEN state. - return ws[kReadyState] === states.OPEN -} - -/** - * @param {import('./websocket').WebSocket} ws - */ -function isClosing (ws) { - // Upon either sending or receiving a Close control frame, it is said - // that _The WebSocket Closing Handshake is Started_ and that the - // WebSocket connection is in the CLOSING state. - return ws[kReadyState] === states.CLOSING -} +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; -/** - * @param {import('./websocket').WebSocket} ws - */ -function isClosed (ws) { - return ws[kReadyState] === states.CLOSED -} +var _validate = _interopRequireDefault(__nccwpck_require__(66900)); -/** - * @see https://dom.spec.whatwg.org/#concept-event-fire - * @param {string} e - * @param {EventTarget} target - * @param {EventInit | undefined} eventInitDict - */ -function fireEvent (e, target, eventConstructor = Event, eventInitDict) { - // 1. If eventConstructor is not given, then let eventConstructor be Event. +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // 2. Let event be the result of creating an event given eventConstructor, - // in the relevant realm of target. - // 3. Initialize event’s type attribute to e. - const event = new eventConstructor(e, eventInitDict) // eslint-disable-line new-cap +function parse(uuid) { + if (!(0, _validate.default)(uuid)) { + throw TypeError('Invalid UUID'); + } - // 4. Initialize any other IDL attributes of event as described in the - // invocation of this algorithm. + let v; + const arr = new Uint8Array(16); // Parse ########-....-....-....-............ - // 5. Return the result of dispatching event at target, with legacy target - // override flag set if set. - target.dispatchEvent(event) -} + arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; + arr[1] = v >>> 16 & 0xff; + arr[2] = v >>> 8 & 0xff; + arr[3] = v & 0xff; // Parse ........-####-....-....-............ -/** - * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol - * @param {import('./websocket').WebSocket} ws - * @param {number} type Opcode - * @param {Buffer} data application data - */ -function websocketMessageReceived (ws, type, data) { - // 1. If ready state is not OPEN (1), then return. - if (ws[kReadyState] !== states.OPEN) { - return - } + arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; + arr[5] = v & 0xff; // Parse ........-....-####-....-............ - // 2. Let dataForEvent be determined by switching on type and binary type: - let dataForEvent + arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; + arr[7] = v & 0xff; // Parse ........-....-....-####-............ - if (type === opcodes.TEXT) { - // -> type indicates that the data is Text - // a new DOMString containing data - try { - dataForEvent = new TextDecoder('utf-8', { fatal: true }).decode(data) - } catch { - failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.') - return - } - } else if (type === opcodes.BINARY) { - if (ws[kBinaryType] === 'blob') { - // -> type indicates that the data is Binary and binary type is "blob" - // a new Blob object, created in the relevant Realm of the WebSocket - // object, that represents data as its raw data - dataForEvent = new Blob([data]) - } else { - // -> type indicates that the data is Binary and binary type is "arraybuffer" - // a new ArrayBuffer object, created in the relevant Realm of the - // WebSocket object, whose contents are data - dataForEvent = new Uint8Array(data).buffer - } - } + arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; + arr[9] = v & 0xff; // Parse ........-....-....-....-############ + // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) - // 3. Fire an event named message at the WebSocket object, using MessageEvent, - // with the origin attribute initialized to the serialization of the WebSocket - // object’s url's origin, and the data attribute initialized to dataForEvent. - fireEvent('message', ws, MessageEvent, { - origin: ws[kWebSocketURL].origin, - data: dataForEvent - }) + arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; + arr[11] = v / 0x100000000 & 0xff; + arr[12] = v >>> 24 & 0xff; + arr[13] = v >>> 16 & 0xff; + arr[14] = v >>> 8 & 0xff; + arr[15] = v & 0xff; + return arr; } -/** - * @see https://datatracker.ietf.org/doc/html/rfc6455 - * @see https://datatracker.ietf.org/doc/html/rfc2616 - * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407 - * @param {string} protocol - */ -function isValidSubprotocol (protocol) { - // If present, this value indicates one - // or more comma-separated subprotocol the client wishes to speak, - // ordered by preference. The elements that comprise this value - // MUST be non-empty strings with characters in the range U+0021 to - // U+007E not including separator characters as defined in - // [RFC2616] and MUST all be unique strings. - if (protocol.length === 0) { - return false - } - - for (const char of protocol) { - const code = char.charCodeAt(0) - - if ( - code < 0x21 || - code > 0x7E || - char === '(' || - char === ')' || - char === '<' || - char === '>' || - char === '@' || - char === ',' || - char === ';' || - char === ':' || - char === '\\' || - char === '"' || - char === '/' || - char === '[' || - char === ']' || - char === '?' || - char === '=' || - char === '{' || - char === '}' || - code === 32 || // SP - code === 9 // HT - ) { - return false - } - } +var _default = parse; +exports["default"] = _default; - return true -} +/***/ }), -/** - * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4 - * @param {number} code - */ -function isValidStatusCode (code) { - if (code >= 1000 && code < 1015) { - return ( - code !== 1004 && // reserved - code !== 1005 && // "MUST NOT be set as a status code" - code !== 1006 // "MUST NOT be set as a status code" - ) - } +/***/ 40814: +/***/ ((__unused_webpack_module, exports) => { - return code >= 3000 && code <= 4999 -} +"use strict"; -/** - * @param {import('./websocket').WebSocket} ws - * @param {string|undefined} reason - */ -function failWebsocketConnection (ws, reason) { - const { [kController]: controller, [kResponse]: response } = ws - controller.abort() +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; +exports["default"] = _default; - if (response?.socket && !response.socket.destroyed) { - response.socket.destroy() - } +/***/ }), - if (reason) { - fireEvent('error', ws, ErrorEvent, { - error: new Error(reason) - }) - } -} +/***/ 50807: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { -module.exports = { - isEstablished, - isClosing, - isClosed, - fireEvent, - isValidSubprotocol, - isValidStatusCode, - failWebsocketConnection, - websocketMessageReceived -} +"use strict"; -/***/ }), +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = rng; -/***/ 54284: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); -"use strict"; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate -const { webidl } = __nccwpck_require__(21744) -const { DOMException } = __nccwpck_require__(41037) -const { URLSerializer } = __nccwpck_require__(685) -const { getGlobalOrigin } = __nccwpck_require__(71246) -const { staticPropertyDescriptors, states, opcodes, emptyBuffer } = __nccwpck_require__(19188) -const { - kWebSocketURL, - kReadyState, - kController, - kBinaryType, - kResponse, - kSentClose, - kByteParser -} = __nccwpck_require__(37578) -const { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = __nccwpck_require__(25515) -const { establishWebSocketConnection } = __nccwpck_require__(35354) -const { WebsocketFrameSend } = __nccwpck_require__(25444) -const { ByteParser } = __nccwpck_require__(11688) -const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(83983) -const { getGlobalDispatcher } = __nccwpck_require__(21892) -const { types } = __nccwpck_require__(73837) +let poolPtr = rnds8Pool.length; -let experimentalWarned = false +function rng() { + if (poolPtr > rnds8Pool.length - 16) { + _crypto.default.randomFillSync(rnds8Pool); -// https://websockets.spec.whatwg.org/#interface-definition -class WebSocket extends EventTarget { - #events = { - open: null, - error: null, - close: null, - message: null + poolPtr = 0; } - #bufferedAmount = 0 - #protocol = '' - #extensions = '' - - /** - * @param {string} url - * @param {string|string[]} protocols - */ - constructor (url, protocols = []) { - super() + return rnds8Pool.slice(poolPtr, poolPtr += 16); +} - webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket constructor' }) +/***/ }), - if (!experimentalWarned) { - experimentalWarned = true - process.emitWarning('WebSockets are experimental, expect them to change at any time.', { - code: 'UNDICI-WS' - }) - } +/***/ 85274: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols) +"use strict"; - url = webidl.converters.USVString(url) - protocols = options.protocols - // 1. Let baseURL be this's relevant settings object's API base URL. - const baseURL = getGlobalOrigin() +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - // 1. Let urlRecord be the result of applying the URL parser to url with baseURL. - let urlRecord +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); - try { - urlRecord = new URL(url, baseURL) - } catch (e) { - // 3. If urlRecord is failure, then throw a "SyntaxError" DOMException. - throw new DOMException(e, 'SyntaxError') - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // 4. If urlRecord’s scheme is "http", then set urlRecord’s scheme to "ws". - if (urlRecord.protocol === 'http:') { - urlRecord.protocol = 'ws:' - } else if (urlRecord.protocol === 'https:') { - // 5. Otherwise, if urlRecord’s scheme is "https", set urlRecord’s scheme to "wss". - urlRecord.protocol = 'wss:' - } +function sha1(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } - // 6. If urlRecord’s scheme is not "ws" or "wss", then throw a "SyntaxError" DOMException. - if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') { - throw new DOMException( - `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, - 'SyntaxError' - ) - } + return _crypto.default.createHash('sha1').update(bytes).digest(); +} - // 7. If urlRecord’s fragment is non-null, then throw a "SyntaxError" - // DOMException. - if (urlRecord.hash || urlRecord.href.endsWith('#')) { - throw new DOMException('Got fragment', 'SyntaxError') - } +var _default = sha1; +exports["default"] = _default; - // 8. If protocols is a string, set protocols to a sequence consisting - // of just that string. - if (typeof protocols === 'string') { - protocols = [protocols] - } +/***/ }), - // 9. If any of the values in protocols occur more than once or otherwise - // fail to match the requirements for elements that comprise the value - // of `Sec-WebSocket-Protocol` fields as defined by The WebSocket - // protocol, then throw a "SyntaxError" DOMException. - if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) { - throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError') - } +/***/ 18950: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) { - throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError') - } +"use strict"; - // 10. Set this's url to urlRecord. - this[kWebSocketURL] = new URL(urlRecord.href) - // 11. Let client be this's relevant settings object. +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - // 12. Run this step in parallel: +var _validate = _interopRequireDefault(__nccwpck_require__(66900)); - // 1. Establish a WebSocket connection given urlRecord, protocols, - // and client. - this[kController] = establishWebSocketConnection( - urlRecord, - protocols, - this, - (response) => this.#onConnectionEstablished(response), - options - ) +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // Each WebSocket object has an associated ready state, which is a - // number representing the state of the connection. Initially it must - // be CONNECTING (0). - this[kReadyState] = WebSocket.CONNECTING +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ +const byteToHex = []; - // The extensions attribute must initially return the empty string. +for (let i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} - // The protocol attribute must initially return the empty string. +function stringify(arr, offset = 0) { + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one + // of the following: + // - One or more input array values don't map to a hex octet (leading to + // "undefined" in the uuid) + // - Invalid input values for the RFC `version` or `variant` fields - // Each WebSocket object has an associated binary type, which is a - // BinaryType. Initially it must be "blob". - this[kBinaryType] = 'blob' + if (!(0, _validate.default)(uuid)) { + throw TypeError('Stringified UUID is invalid'); } - /** - * @see https://websockets.spec.whatwg.org/#dom-websocket-close - * @param {number|undefined} code - * @param {string|undefined} reason - */ - close (code = undefined, reason = undefined) { - webidl.brandCheck(this, WebSocket) + return uuid; +} - if (code !== undefined) { - code = webidl.converters['unsigned short'](code, { clamp: true }) - } +var _default = stringify; +exports["default"] = _default; - if (reason !== undefined) { - reason = webidl.converters.USVString(reason) - } +/***/ }), - // 1. If code is present, but is neither an integer equal to 1000 nor an - // integer in the range 3000 to 4999, inclusive, throw an - // "InvalidAccessError" DOMException. - if (code !== undefined) { - if (code !== 1000 && (code < 3000 || code > 4999)) { - throw new DOMException('invalid code', 'InvalidAccessError') - } - } +/***/ 78628: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - let reasonByteLength = 0 +"use strict"; - // 2. If reason is present, then run these substeps: - if (reason !== undefined) { - // 1. Let reasonBytes be the result of encoding reason. - // 2. If reasonBytes is longer than 123 bytes, then throw a - // "SyntaxError" DOMException. - reasonByteLength = Buffer.byteLength(reason) - if (reasonByteLength > 123) { - throw new DOMException( - `Reason must be less than 123 bytes; received ${reasonByteLength}`, - 'SyntaxError' - ) - } - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - // 3. Run the first matching steps from the following list: - if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) { - // If this's ready state is CLOSING (2) or CLOSED (3) - // Do nothing. - } else if (!isEstablished(this)) { - // If the WebSocket connection is not yet established - // Fail the WebSocket connection and set this's ready state - // to CLOSING (2). - failWebsocketConnection(this, 'Connection was closed before it was established.') - this[kReadyState] = WebSocket.CLOSING - } else if (!isClosing(this)) { - // If the WebSocket closing handshake has not yet been started - // Start the WebSocket closing handshake and set this's ready - // state to CLOSING (2). - // - If neither code nor reason is present, the WebSocket Close - // message must not have a body. - // - If code is present, then the status code to use in the - // WebSocket Close message must be the integer given by code. - // - If reason is also present, then reasonBytes must be - // provided in the Close message after the status code. +var _rng = _interopRequireDefault(__nccwpck_require__(50807)); - const frame = new WebsocketFrameSend() +var _stringify = _interopRequireDefault(__nccwpck_require__(18950)); - // If neither code nor reason is present, the WebSocket Close - // message must not have a body. +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // If code is present, then the status code to use in the - // WebSocket Close message must be the integer given by code. - if (code !== undefined && reason === undefined) { - frame.frameData = Buffer.allocUnsafe(2) - frame.frameData.writeUInt16BE(code, 0) - } else if (code !== undefined && reason !== undefined) { - // If reason is also present, then reasonBytes must be - // provided in the Close message after the status code. - frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength) - frame.frameData.writeUInt16BE(code, 0) - // the body MAY contain UTF-8-encoded data with value /reason/ - frame.frameData.write(reason, 2, 'utf-8') - } else { - frame.frameData = emptyBuffer - } +// **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html +let _nodeId; - /** @type {import('stream').Duplex} */ - const socket = this[kResponse].socket +let _clockseq; // Previous uuid creation time - socket.write(frame.createFrame(opcodes.CLOSE), (err) => { - if (!err) { - this[kSentClose] = true - } - }) - // Upon either sending or receiving a Close control frame, it is said - // that _The WebSocket Closing Handshake is Started_ and that the - // WebSocket connection is in the CLOSING state. - this[kReadyState] = states.CLOSING - } else { - // Otherwise - // Set this's ready state to CLOSING (2). - this[kReadyState] = WebSocket.CLOSING - } - } +let _lastMSecs = 0; +let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details - /** - * @see https://websockets.spec.whatwg.org/#dom-websocket-send - * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data - */ - send (data) { - webidl.brandCheck(this, WebSocket) +function v1(options, buf, offset) { + let i = buf && offset || 0; + const b = buf || new Array(16); + options = options || {}; + let node = options.node || _nodeId; + let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 - webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket.send' }) + if (node == null || clockseq == null) { + const seedBytes = options.random || (options.rng || _rng.default)(); - data = webidl.converters.WebSocketSendData(data) + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; + } - // 1. If this's ready state is CONNECTING, then throw an - // "InvalidStateError" DOMException. - if (this[kReadyState] === WebSocket.CONNECTING) { - throw new DOMException('Sent before connected.', 'InvalidStateError') + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; } + } // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. - // 2. Run the appropriate set of steps from the following list: - // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1 - // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2 - if (!isEstablished(this) || isClosing(this)) { - return - } + let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock - /** @type {import('stream').Duplex} */ - const socket = this[kResponse].socket + let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) - // If data is a string - if (typeof data === 'string') { - // If the WebSocket connection is established and the WebSocket - // closing handshake has not yet started, then the user agent - // must send a WebSocket Message comprised of the data argument - // using a text frame opcode; if the data cannot be sent, e.g. - // because it would need to be buffered but the buffer is full, - // the user agent must flag the WebSocket as full and then close - // the WebSocket connection. Any invocation of this method with a - // string argument that does not throw an exception must increase - // the bufferedAmount attribute by the number of bytes needed to - // express the argument as UTF-8. + const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression - const value = Buffer.from(data) - const frame = new WebsocketFrameSend(value) - const buffer = frame.createFrame(opcodes.TEXT) + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval - this.#bufferedAmount += value.byteLength - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength - }) - } else if (types.isArrayBuffer(data)) { - // If the WebSocket connection is established, and the WebSocket - // closing handshake has not yet started, then the user agent must - // send a WebSocket Message comprised of data using a binary frame - // opcode; if the data cannot be sent, e.g. because it would need - // to be buffered but the buffer is full, the user agent must flag - // the WebSocket as full and then close the WebSocket connection. - // The data to be sent is the data stored in the buffer described - // by the ArrayBuffer object. Any invocation of this method with an - // ArrayBuffer argument that does not throw an exception must - // increase the bufferedAmount attribute by the length of the - // ArrayBuffer in bytes. - const value = Buffer.from(data) - const frame = new WebsocketFrameSend(value) - const buffer = frame.createFrame(opcodes.BINARY) + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } // Per 4.2.1.2 Throw error if too many uuids are requested - this.#bufferedAmount += value.byteLength - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength - }) - } else if (ArrayBuffer.isView(data)) { - // If the WebSocket connection is established, and the WebSocket - // closing handshake has not yet started, then the user agent must - // send a WebSocket Message comprised of data using a binary frame - // opcode; if the data cannot be sent, e.g. because it would need to - // be buffered but the buffer is full, the user agent must flag the - // WebSocket as full and then close the WebSocket connection. The - // data to be sent is the data stored in the section of the buffer - // described by the ArrayBuffer object that data references. Any - // invocation of this method with this kind of argument that does - // not throw an exception must increase the bufferedAmount attribute - // by the length of data’s buffer in bytes. - const ab = Buffer.from(data, data.byteOffset, data.byteLength) + if (nsecs >= 10000) { + throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); + } - const frame = new WebsocketFrameSend(ab) - const buffer = frame.createFrame(opcodes.BINARY) + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch - this.#bufferedAmount += ab.byteLength - socket.write(buffer, () => { - this.#bufferedAmount -= ab.byteLength - }) - } else if (isBlobLike(data)) { - // If the WebSocket connection is established, and the WebSocket - // closing handshake has not yet started, then the user agent must - // send a WebSocket Message comprised of data using a binary frame - // opcode; if the data cannot be sent, e.g. because it would need to - // be buffered but the buffer is full, the user agent must flag the - // WebSocket as full and then close the WebSocket connection. The data - // to be sent is the raw data represented by the Blob object. Any - // invocation of this method with a Blob argument that does not throw - // an exception must increase the bufferedAmount attribute by the size - // of the Blob object’s raw data, in bytes. + msecs += 12219292800000; // `time_low` - const frame = new WebsocketFrameSend() + const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; // `time_mid` - data.arrayBuffer().then((ab) => { - const value = Buffer.from(ab) - frame.frameData = value - const buffer = frame.createFrame(opcodes.BINARY) + const tmh = msecs / 0x100000000 * 10000 & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; // `time_high_and_version` - this.#bufferedAmount += value.byteLength - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength - }) - }) - } - } + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version - get readyState () { - webidl.brandCheck(this, WebSocket) + b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) - // The readyState getter steps are to return this's ready state. - return this[kReadyState] - } + b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` - get bufferedAmount () { - webidl.brandCheck(this, WebSocket) + b[i++] = clockseq & 0xff; // `node` - return this.#bufferedAmount + for (let n = 0; n < 6; ++n) { + b[i + n] = node[n]; } - get url () { - webidl.brandCheck(this, WebSocket) + return buf || (0, _stringify.default)(b); +} - // The url getter steps are to return this's url, serialized. - return URLSerializer(this[kWebSocketURL]) - } +var _default = v1; +exports["default"] = _default; - get extensions () { - webidl.brandCheck(this, WebSocket) +/***/ }), - return this.#extensions - } +/***/ 86409: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - get protocol () { - webidl.brandCheck(this, WebSocket) +"use strict"; - return this.#protocol - } - get onopen () { - webidl.brandCheck(this, WebSocket) +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - return this.#events.open - } +var _v = _interopRequireDefault(__nccwpck_require__(65998)); - set onopen (fn) { - webidl.brandCheck(this, WebSocket) +var _md = _interopRequireDefault(__nccwpck_require__(4569)); - if (this.#events.open) { - this.removeEventListener('open', this.#events.open) - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - if (typeof fn === 'function') { - this.#events.open = fn - this.addEventListener('open', fn) - } else { - this.#events.open = null - } - } +const v3 = (0, _v.default)('v3', 0x30, _md.default); +var _default = v3; +exports["default"] = _default; - get onerror () { - webidl.brandCheck(this, WebSocket) +/***/ }), - return this.#events.error - } +/***/ 65998: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - set onerror (fn) { - webidl.brandCheck(this, WebSocket) +"use strict"; - if (this.#events.error) { - this.removeEventListener('error', this.#events.error) - } - if (typeof fn === 'function') { - this.#events.error = fn - this.addEventListener('error', fn) - } else { - this.#events.error = null - } - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = _default; +exports.URL = exports.DNS = void 0; - get onclose () { - webidl.brandCheck(this, WebSocket) +var _stringify = _interopRequireDefault(__nccwpck_require__(18950)); - return this.#events.close +var _parse = _interopRequireDefault(__nccwpck_require__(62746)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape + + const bytes = []; + + for (let i = 0; i < str.length; ++i) { + bytes.push(str.charCodeAt(i)); } - set onclose (fn) { - webidl.brandCheck(this, WebSocket) + return bytes; +} - if (this.#events.close) { - this.removeEventListener('close', this.#events.close) +const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +exports.DNS = DNS; +const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +exports.URL = URL; + +function _default(name, version, hashfunc) { + function generateUUID(value, namespace, buf, offset) { + if (typeof value === 'string') { + value = stringToBytes(value); } - if (typeof fn === 'function') { - this.#events.close = fn - this.addEventListener('close', fn) - } else { - this.#events.close = null + if (typeof namespace === 'string') { + namespace = (0, _parse.default)(namespace); } - } - get onmessage () { - webidl.brandCheck(this, WebSocket) + if (namespace.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } // Compute hash of namespace and value, Per 4.3 + // Future: Use spread syntax when supported on all platforms, e.g. `bytes = + // hashfunc([...namespace, ... value])` - return this.#events.message - } - set onmessage (fn) { - webidl.brandCheck(this, WebSocket) + let bytes = new Uint8Array(16 + value.length); + bytes.set(namespace); + bytes.set(value, namespace.length); + bytes = hashfunc(bytes); + bytes[6] = bytes[6] & 0x0f | version; + bytes[8] = bytes[8] & 0x3f | 0x80; - if (this.#events.message) { - this.removeEventListener('message', this.#events.message) - } + if (buf) { + offset = offset || 0; - if (typeof fn === 'function') { - this.#events.message = fn - this.addEventListener('message', fn) - } else { - this.#events.message = null + for (let i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + + return buf; } - } - get binaryType () { - webidl.brandCheck(this, WebSocket) + return (0, _stringify.default)(bytes); + } // Function#name is not settable on some platforms (#270) - return this[kBinaryType] - } - set binaryType (type) { - webidl.brandCheck(this, WebSocket) + try { + generateUUID.name = name; // eslint-disable-next-line no-empty + } catch (err) {} // For CommonJS default export support - if (type !== 'blob' && type !== 'arraybuffer') { - this[kBinaryType] = 'blob' - } else { - this[kBinaryType] = type - } - } - /** - * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol - */ - #onConnectionEstablished (response) { - // processResponse is called when the "response’s header list has been received and initialized." - // once this happens, the connection is open - this[kResponse] = response + generateUUID.DNS = DNS; + generateUUID.URL = URL; + return generateUUID; +} - const parser = new ByteParser(this) - parser.on('drain', function onParserDrain () { - this.ws[kResponse].socket.resume() - }) +/***/ }), - response.socket.ws = this - this[kByteParser] = parser +/***/ 85122: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - // 1. Change the ready state to OPEN (1). - this[kReadyState] = states.OPEN +"use strict"; - // 2. Change the extensions attribute’s value to the extensions in use, if - // it is not the null value. - // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1 - const extensions = response.headersList.get('sec-websocket-extensions') - if (extensions !== null) { - this.#extensions = extensions - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - // 3. Change the protocol attribute’s value to the subprotocol in use, if - // it is not the null value. - // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9 - const protocol = response.headersList.get('sec-websocket-protocol') +var _rng = _interopRequireDefault(__nccwpck_require__(50807)); - if (protocol !== null) { - this.#protocol = protocol +var _stringify = _interopRequireDefault(__nccwpck_require__(18950)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function v4(options, buf, offset) { + options = options || {}; + + const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + + + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + + if (buf) { + offset = offset || 0; + + for (let i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; } - // 4. Fire an event named open at the WebSocket object. - fireEvent('open', this) + return buf; } + + return (0, _stringify.default)(rnds); } -// https://websockets.spec.whatwg.org/#dom-websocket-connecting -WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING -// https://websockets.spec.whatwg.org/#dom-websocket-open -WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN -// https://websockets.spec.whatwg.org/#dom-websocket-closing -WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING -// https://websockets.spec.whatwg.org/#dom-websocket-closed -WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED +var _default = v4; +exports["default"] = _default; -Object.defineProperties(WebSocket.prototype, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors, - url: kEnumerableProperty, - readyState: kEnumerableProperty, - bufferedAmount: kEnumerableProperty, - onopen: kEnumerableProperty, - onerror: kEnumerableProperty, - onclose: kEnumerableProperty, - close: kEnumerableProperty, - onmessage: kEnumerableProperty, - binaryType: kEnumerableProperty, - send: kEnumerableProperty, - extensions: kEnumerableProperty, - protocol: kEnumerableProperty, - [Symbol.toStringTag]: { - value: 'WebSocket', - writable: false, - enumerable: false, - configurable: true - } -}) +/***/ }), -Object.defineProperties(WebSocket, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors -}) +/***/ 79120: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { -webidl.converters['sequence'] = webidl.sequenceConverter( - webidl.converters.DOMString -) +"use strict"; -webidl.converters['DOMString or sequence'] = function (V) { - if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) { - return webidl.converters['sequence'](V) - } - return webidl.converters.DOMString(V) -} +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; -// This implements the propsal made in https://github.com/whatwg/websockets/issues/42 -webidl.converters.WebSocketInit = webidl.dictionaryConverter([ - { - key: 'protocols', - converter: webidl.converters['DOMString or sequence'], - get defaultValue () { - return [] - } - }, - { - key: 'dispatcher', - converter: (V) => V, - get defaultValue () { - return getGlobalDispatcher() - } - }, - { - key: 'headers', - converter: webidl.nullableConverter(webidl.converters.HeadersInit) - } -]) +var _v = _interopRequireDefault(__nccwpck_require__(65998)); + +var _sha = _interopRequireDefault(__nccwpck_require__(85274)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -webidl.converters['DOMString or sequence or WebSocketInit'] = function (V) { - if (webidl.util.Type(V) === 'Object' && !(Symbol.iterator in V)) { - return webidl.converters.WebSocketInit(V) - } +const v5 = (0, _v.default)('v5', 0x50, _sha.default); +var _default = v5; +exports["default"] = _default; - return { protocols: webidl.converters['DOMString or sequence'](V) } -} +/***/ }), -webidl.converters.WebSocketSendData = function (V) { - if (webidl.util.Type(V) === 'Object') { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }) - } +/***/ 66900: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { - return webidl.converters.BufferSource(V) - } - } +"use strict"; - return webidl.converters.USVString(V) -} -module.exports = { - WebSocket +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _regex = _interopRequireDefault(__nccwpck_require__(40814)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function validate(uuid) { + return typeof uuid === 'string' && _regex.default.test(uuid); } +var _default = validate; +exports["default"] = _default; /***/ }), -/***/ 45030: -/***/ ((__unused_webpack_module, exports) => { +/***/ 81595: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; -Object.defineProperty(exports, "__esModule", ({ value: true })); +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; -function getUserAgent() { - if (typeof navigator === "object" && "userAgent" in navigator) { - return navigator.userAgent; - } +var _validate = _interopRequireDefault(__nccwpck_require__(66900)); - if (typeof process === "object" && "version" in process) { - return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function version(uuid) { + if (!(0, _validate.default)(uuid)) { + throw TypeError('Invalid UUID'); } - return ""; + return parseInt(uuid.substr(14, 1), 16); } -exports.getUserAgent = getUserAgent; -//# sourceMappingURL=index.js.map - +var _default = version; +exports["default"] = _default; /***/ }), -/***/ 9046: -/***/ ((__unused_webpack_module, exports) => { +/***/ 62940: +/***/ ((module) => { -"use strict"; +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') -exports.fromCallback = function (fn) { - return Object.defineProperty(function (...args) { - if (typeof args[args.length - 1] === 'function') fn.apply(this, args) - else { - return new Promise((resolve, reject) => { - fn.call( - this, - ...args, - (err, res) => (err != null) ? reject(err) : resolve(res) - ) + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] }) } - }, 'name', { value: fn.name }) -} - -exports.fromPromise = function (fn) { - return Object.defineProperty(function (...args) { - const cb = args[args.length - 1] - if (typeof cb !== 'function') return fn.apply(this, args) - else fn.apply(this, args.slice(0, -1)).then(r => cb(null, r), cb) - }, 'name', { value: fn.name }) + return ret + } } /***/ }), -/***/ 75840: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 39491: +/***/ ((module) => { "use strict"; +module.exports = require("assert"); +/***/ }), -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "v1", ({ - enumerable: true, - get: function () { - return _v.default; - } -})); -Object.defineProperty(exports, "v3", ({ - enumerable: true, - get: function () { - return _v2.default; - } -})); -Object.defineProperty(exports, "v4", ({ - enumerable: true, - get: function () { - return _v3.default; - } -})); -Object.defineProperty(exports, "v5", ({ - enumerable: true, - get: function () { - return _v4.default; - } -})); -Object.defineProperty(exports, "NIL", ({ - enumerable: true, - get: function () { - return _nil.default; - } -})); -Object.defineProperty(exports, "version", ({ - enumerable: true, - get: function () { - return _version.default; - } -})); -Object.defineProperty(exports, "validate", ({ - enumerable: true, - get: function () { - return _validate.default; - } -})); -Object.defineProperty(exports, "stringify", ({ - enumerable: true, - get: function () { - return _stringify.default; - } -})); -Object.defineProperty(exports, "parse", ({ - enumerable: true, - get: function () { - return _parse.default; - } -})); +/***/ 50852: +/***/ ((module) => { -var _v = _interopRequireDefault(__nccwpck_require__(78628)); +"use strict"; +module.exports = require("async_hooks"); -var _v2 = _interopRequireDefault(__nccwpck_require__(86409)); +/***/ }), -var _v3 = _interopRequireDefault(__nccwpck_require__(85122)); +/***/ 14300: +/***/ ((module) => { -var _v4 = _interopRequireDefault(__nccwpck_require__(79120)); +"use strict"; +module.exports = require("buffer"); -var _nil = _interopRequireDefault(__nccwpck_require__(25332)); +/***/ }), -var _version = _interopRequireDefault(__nccwpck_require__(81595)); +/***/ 32081: +/***/ ((module) => { -var _validate = _interopRequireDefault(__nccwpck_require__(66900)); +"use strict"; +module.exports = require("child_process"); -var _stringify = _interopRequireDefault(__nccwpck_require__(18950)); +/***/ }), -var _parse = _interopRequireDefault(__nccwpck_require__(62746)); +/***/ 96206: +/***/ ((module) => { -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +"use strict"; +module.exports = require("console"); /***/ }), -/***/ 4569: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 22057: +/***/ ((module) => { "use strict"; +module.exports = require("constants"); +/***/ }), -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); +/***/ 6113: +/***/ ((module) => { -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +"use strict"; +module.exports = require("crypto"); -function md5(bytes) { - if (Array.isArray(bytes)) { - bytes = Buffer.from(bytes); - } else if (typeof bytes === 'string') { - bytes = Buffer.from(bytes, 'utf8'); - } +/***/ }), - return _crypto.default.createHash('md5').update(bytes).digest(); -} +/***/ 67643: +/***/ ((module) => { -var _default = md5; -exports["default"] = _default; +"use strict"; +module.exports = require("diagnostics_channel"); /***/ }), -/***/ 25332: -/***/ ((__unused_webpack_module, exports) => { +/***/ 82361: +/***/ ((module) => { "use strict"; +module.exports = require("events"); +/***/ }), -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; -var _default = '00000000-0000-0000-0000-000000000000'; -exports["default"] = _default; +/***/ 57147: +/***/ ((module) => { + +"use strict"; +module.exports = require("fs"); /***/ }), -/***/ 62746: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 73292: +/***/ ((module) => { "use strict"; +module.exports = require("fs/promises"); +/***/ }), -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; +/***/ 13685: +/***/ ((module) => { -var _validate = _interopRequireDefault(__nccwpck_require__(66900)); +"use strict"; +module.exports = require("http"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/***/ }), -function parse(uuid) { - if (!(0, _validate.default)(uuid)) { - throw TypeError('Invalid UUID'); - } +/***/ 85158: +/***/ ((module) => { - let v; - const arr = new Uint8Array(16); // Parse ########-....-....-....-............ +"use strict"; +module.exports = require("http2"); - arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; - arr[1] = v >>> 16 & 0xff; - arr[2] = v >>> 8 & 0xff; - arr[3] = v & 0xff; // Parse ........-####-....-....-............ +/***/ }), - arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; - arr[5] = v & 0xff; // Parse ........-....-####-....-............ +/***/ 95687: +/***/ ((module) => { - arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; - arr[7] = v & 0xff; // Parse ........-....-....-####-............ +"use strict"; +module.exports = require("https"); - arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; - arr[9] = v & 0xff; // Parse ........-....-....-....-############ - // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) +/***/ }), - arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; - arr[11] = v / 0x100000000 & 0xff; - arr[12] = v >>> 24 & 0xff; - arr[13] = v >>> 16 & 0xff; - arr[14] = v >>> 8 & 0xff; - arr[15] = v & 0xff; - return arr; -} +/***/ 41808: +/***/ ((module) => { -var _default = parse; -exports["default"] = _default; +"use strict"; +module.exports = require("net"); /***/ }), -/***/ 40814: -/***/ ((__unused_webpack_module, exports) => { +/***/ 15673: +/***/ ((module) => { "use strict"; +module.exports = require("node:events"); +/***/ }), -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; -var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; -exports["default"] = _default; +/***/ 87561: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:fs"); /***/ }), -/***/ 50807: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 49411: +/***/ ((module) => { "use strict"; +module.exports = require("node:path"); +/***/ }), -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = rng; +/***/ 84492: +/***/ ((module) => { -var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); +"use strict"; +module.exports = require("node:stream"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/***/ }), -const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate +/***/ 47261: +/***/ ((module) => { -let poolPtr = rnds8Pool.length; +"use strict"; +module.exports = require("node:util"); -function rng() { - if (poolPtr > rnds8Pool.length - 16) { - _crypto.default.randomFillSync(rnds8Pool); +/***/ }), - poolPtr = 0; - } +/***/ 65628: +/***/ ((module) => { - return rnds8Pool.slice(poolPtr, poolPtr += 16); -} +"use strict"; +module.exports = require("node:zlib"); /***/ }), -/***/ 85274: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 22037: +/***/ ((module) => { "use strict"; +module.exports = require("os"); +/***/ }), -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; +/***/ 71017: +/***/ ((module) => { -var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); +"use strict"; +module.exports = require("path"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/***/ }), -function sha1(bytes) { - if (Array.isArray(bytes)) { - bytes = Buffer.from(bytes); - } else if (typeof bytes === 'string') { - bytes = Buffer.from(bytes, 'utf8'); - } +/***/ 4074: +/***/ ((module) => { - return _crypto.default.createHash('sha1').update(bytes).digest(); -} +"use strict"; +module.exports = require("perf_hooks"); -var _default = sha1; -exports["default"] = _default; +/***/ }), + +/***/ 77282: +/***/ ((module) => { + +"use strict"; +module.exports = require("process"); /***/ }), -/***/ 18950: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 63477: +/***/ ((module) => { "use strict"; +module.exports = require("querystring"); +/***/ }), -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; +/***/ 12781: +/***/ ((module) => { -var _validate = _interopRequireDefault(__nccwpck_require__(66900)); +"use strict"; +module.exports = require("stream"); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/***/ }), -/** - * Convert array of 16 byte values to UUID string format of the form: - * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - */ -const byteToHex = []; +/***/ 35356: +/***/ ((module) => { -for (let i = 0; i < 256; ++i) { - byteToHex.push((i + 0x100).toString(16).substr(1)); -} +"use strict"; +module.exports = require("stream/web"); -function stringify(arr, offset = 0) { - // Note: Be careful editing this code! It's been tuned for performance - // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 - const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one - // of the following: - // - One or more input array values don't map to a hex octet (leading to - // "undefined" in the uuid) - // - Invalid input values for the RFC `version` or `variant` fields +/***/ }), - if (!(0, _validate.default)(uuid)) { - throw TypeError('Stringified UUID is invalid'); - } +/***/ 71576: +/***/ ((module) => { - return uuid; -} +"use strict"; +module.exports = require("string_decoder"); -var _default = stringify; -exports["default"] = _default; +/***/ }), + +/***/ 24404: +/***/ ((module) => { + +"use strict"; +module.exports = require("tls"); /***/ }), -/***/ 78628: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 76224: +/***/ ((module) => { "use strict"; +module.exports = require("tty"); +/***/ }), -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; +/***/ 57310: +/***/ ((module) => { -var _rng = _interopRequireDefault(__nccwpck_require__(50807)); +"use strict"; +module.exports = require("url"); -var _stringify = _interopRequireDefault(__nccwpck_require__(18950)); +/***/ }), -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/***/ 73837: +/***/ ((module) => { -// **`v1()` - Generate time-based UUID** -// -// Inspired by https://github.com/LiosK/UUID.js -// and http://docs.python.org/library/uuid.html -let _nodeId; +"use strict"; +module.exports = require("util"); -let _clockseq; // Previous uuid creation time +/***/ }), +/***/ 29830: +/***/ ((module) => { -let _lastMSecs = 0; -let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details +"use strict"; +module.exports = require("util/types"); -function v1(options, buf, offset) { - let i = buf && offset || 0; - const b = buf || new Array(16); - options = options || {}; - let node = options.node || _nodeId; - let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not - // specified. We do this lazily to minimize issues related to insufficient - // system entropy. See #189 +/***/ }), - if (node == null || clockseq == null) { - const seedBytes = options.random || (options.rng || _rng.default)(); +/***/ 71267: +/***/ ((module) => { - if (node == null) { - // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) - node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; - } +"use strict"; +module.exports = require("worker_threads"); + +/***/ }), + +/***/ 59796: +/***/ ((module) => { - if (clockseq == null) { - // Per 4.2.2, randomize (14 bit) clockseq - clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; - } - } // UUID timestamps are 100 nano-second units since the Gregorian epoch, - // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so - // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' - // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. +"use strict"; +module.exports = require("zlib"); +/***/ }), - let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock - // cycle to simulate higher resolution clock +/***/ 92960: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) +"use strict"; - const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression - if (dt < 0 && options.clockseq === undefined) { - clockseq = clockseq + 1 & 0x3fff; - } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new - // time interval +const WritableStream = (__nccwpck_require__(84492).Writable) +const inherits = (__nccwpck_require__(47261).inherits) +const StreamSearch = __nccwpck_require__(51142) - if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { - nsecs = 0; - } // Per 4.2.1.2 Throw error if too many uuids are requested +const PartStream = __nccwpck_require__(81620) +const HeaderParser = __nccwpck_require__(92032) +const DASH = 45 +const B_ONEDASH = Buffer.from('-') +const B_CRLF = Buffer.from('\r\n') +const EMPTY_FN = function () {} - if (nsecs >= 10000) { - throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); - } +function Dicer (cfg) { + if (!(this instanceof Dicer)) { return new Dicer(cfg) } + WritableStream.call(this, cfg) - _lastMSecs = msecs; - _lastNSecs = nsecs; - _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') } - msecs += 12219292800000; // `time_low` + if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined } - const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; - b[i++] = tl >>> 24 & 0xff; - b[i++] = tl >>> 16 & 0xff; - b[i++] = tl >>> 8 & 0xff; - b[i++] = tl & 0xff; // `time_mid` + this._headerFirst = cfg.headerFirst - const tmh = msecs / 0x100000000 * 10000 & 0xfffffff; - b[i++] = tmh >>> 8 & 0xff; - b[i++] = tmh & 0xff; // `time_high_and_version` + this._dashes = 0 + this._parts = 0 + this._finished = false + this._realFinish = false + this._isPreamble = true + this._justMatched = false + this._firstWrite = true + this._inHeader = true + this._part = undefined + this._cb = undefined + this._ignoreData = false + this._partOpts = { highWaterMark: cfg.partHwm } + this._pause = false - b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + const self = this + this._hparser = new HeaderParser(cfg) + this._hparser.on('header', function (header) { + self._inHeader = false + self._part.emit('header', header) + }) +} +inherits(Dicer, WritableStream) - b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) +Dicer.prototype.emit = function (ev) { + if (ev === 'finish' && !this._realFinish) { + if (!this._finished) { + const self = this + process.nextTick(function () { + self.emit('error', new Error('Unexpected end of multipart data')) + if (self._part && !self._ignoreData) { + const type = (self._isPreamble ? 'Preamble' : 'Part') + self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data')) + self._part.push(null) + process.nextTick(function () { + self._realFinish = true + self.emit('finish') + self._realFinish = false + }) + return + } + self._realFinish = true + self.emit('finish') + self._realFinish = false + }) + } + } else { WritableStream.prototype.emit.apply(this, arguments) } +} - b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` +Dicer.prototype._write = function (data, encoding, cb) { + // ignore unexpected data (e.g. extra trailer data after finished) + if (!this._hparser && !this._bparser) { return cb() } - b[i++] = clockseq & 0xff; // `node` + if (this._headerFirst && this._isPreamble) { + if (!this._part) { + this._part = new PartStream(this._partOpts) + if (this._events.preamble) { this.emit('preamble', this._part) } else { this._ignore() } + } + const r = this._hparser.push(data) + if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() } + } - for (let n = 0; n < 6; ++n) { - b[i + n] = node[n]; + // allows for "easier" testing + if (this._firstWrite) { + this._bparser.push(B_CRLF) + this._firstWrite = false } - return buf || (0, _stringify.default)(b); -} + this._bparser.push(data) -var _default = v1; -exports["default"] = _default; + if (this._pause) { this._cb = cb } else { cb() } +} -/***/ }), +Dicer.prototype.reset = function () { + this._part = undefined + this._bparser = undefined + this._hparser = undefined +} -/***/ 86409: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +Dicer.prototype.setBoundary = function (boundary) { + const self = this + this._bparser = new StreamSearch('\r\n--' + boundary) + this._bparser.on('info', function (isMatch, data, start, end) { + self._oninfo(isMatch, data, start, end) + }) +} -"use strict"; +Dicer.prototype._ignore = function () { + if (this._part && !this._ignoreData) { + this._ignoreData = true + this._part.on('error', EMPTY_FN) + // we must perform some kind of read on the stream even though we are + // ignoring the data, otherwise node's Readable stream will not emit 'end' + // after pushing null to the stream + this._part.resume() + } +} +Dicer.prototype._oninfo = function (isMatch, data, start, end) { + let buf; const self = this; let i = 0; let r; let shouldWriteMore = true -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; + if (!this._part && this._justMatched && data) { + while (this._dashes < 2 && (start + i) < end) { + if (data[start + i] === DASH) { + ++i + ++this._dashes + } else { + if (this._dashes) { buf = B_ONEDASH } + this._dashes = 0 + break + } + } + if (this._dashes === 2) { + if ((start + i) < end && this._events.trailer) { this.emit('trailer', data.slice(start + i, end)) } + this.reset() + this._finished = true + // no more parts will be added + if (self._parts === 0) { + self._realFinish = true + self.emit('finish') + self._realFinish = false + } + } + if (this._dashes) { return } + } + if (this._justMatched) { this._justMatched = false } + if (!this._part) { + this._part = new PartStream(this._partOpts) + this._part._read = function (n) { + self._unpause() + } + if (this._isPreamble && this._events.preamble) { this.emit('preamble', this._part) } else if (this._isPreamble !== true && this._events.part) { this.emit('part', this._part) } else { this._ignore() } + if (!this._isPreamble) { this._inHeader = true } + } + if (data && start < end && !this._ignoreData) { + if (this._isPreamble || !this._inHeader) { + if (buf) { shouldWriteMore = this._part.push(buf) } + shouldWriteMore = this._part.push(data.slice(start, end)) + if (!shouldWriteMore) { this._pause = true } + } else if (!this._isPreamble && this._inHeader) { + if (buf) { this._hparser.push(buf) } + r = this._hparser.push(data.slice(start, end)) + if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) } + } + } + if (isMatch) { + this._hparser.reset() + if (this._isPreamble) { this._isPreamble = false } else { + if (start !== end) { + ++this._parts + this._part.on('end', function () { + if (--self._parts === 0) { + if (self._finished) { + self._realFinish = true + self.emit('finish') + self._realFinish = false + } else { + self._unpause() + } + } + }) + } + } + this._part.push(null) + this._part = undefined + this._ignoreData = false + this._justMatched = true + this._dashes = 0 + } +} -var _v = _interopRequireDefault(__nccwpck_require__(65998)); +Dicer.prototype._unpause = function () { + if (!this._pause) { return } -var _md = _interopRequireDefault(__nccwpck_require__(4569)); + this._pause = false + if (this._cb) { + const cb = this._cb + this._cb = undefined + cb() + } +} -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +module.exports = Dicer -const v3 = (0, _v.default)('v3', 0x30, _md.default); -var _default = v3; -exports["default"] = _default; /***/ }), -/***/ 65998: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 92032: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = _default; -exports.URL = exports.DNS = void 0; +const EventEmitter = (__nccwpck_require__(15673).EventEmitter) +const inherits = (__nccwpck_require__(47261).inherits) +const getLimit = __nccwpck_require__(21467) -var _stringify = _interopRequireDefault(__nccwpck_require__(18950)); +const StreamSearch = __nccwpck_require__(51142) -var _parse = _interopRequireDefault(__nccwpck_require__(62746)); +const B_DCRLF = Buffer.from('\r\n\r\n') +const RE_CRLF = /\r\n/g +const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/ // eslint-disable-line no-control-regex -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function HeaderParser (cfg) { + EventEmitter.call(this) -function stringToBytes(str) { - str = unescape(encodeURIComponent(str)); // UTF8 escape + cfg = cfg || {} + const self = this + this.nread = 0 + this.maxed = false + this.npairs = 0 + this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000) + this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024) + this.buffer = '' + this.header = {} + this.finished = false + this.ss = new StreamSearch(B_DCRLF) + this.ss.on('info', function (isMatch, data, start, end) { + if (data && !self.maxed) { + if (self.nread + end - start >= self.maxHeaderSize) { + end = self.maxHeaderSize - self.nread + start + self.nread = self.maxHeaderSize + self.maxed = true + } else { self.nread += (end - start) } - const bytes = []; + self.buffer += data.toString('binary', start, end) + } + if (isMatch) { self._finish() } + }) +} +inherits(HeaderParser, EventEmitter) - for (let i = 0; i < str.length; ++i) { - bytes.push(str.charCodeAt(i)); - } +HeaderParser.prototype.push = function (data) { + const r = this.ss.push(data) + if (this.finished) { return r } +} - return bytes; +HeaderParser.prototype.reset = function () { + this.finished = false + this.buffer = '' + this.header = {} + this.ss.reset() } -const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; -exports.DNS = DNS; -const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; -exports.URL = URL; +HeaderParser.prototype._finish = function () { + if (this.buffer) { this._parseHeader() } + this.ss.matches = this.ss.maxMatches + const header = this.header + this.header = {} + this.buffer = '' + this.finished = true + this.nread = this.npairs = 0 + this.maxed = false + this.emit('header', header) +} -function _default(name, version, hashfunc) { - function generateUUID(value, namespace, buf, offset) { - if (typeof value === 'string') { - value = stringToBytes(value); +HeaderParser.prototype._parseHeader = function () { + if (this.npairs === this.maxHeaderPairs) { return } + + const lines = this.buffer.split(RE_CRLF) + const len = lines.length + let m, h + + for (var i = 0; i < len; ++i) { // eslint-disable-line no-var + if (lines[i].length === 0) { continue } + if (lines[i][0] === '\t' || lines[i][0] === ' ') { + // folded header content + // RFC2822 says to just remove the CRLF and not the whitespace following + // it, so we follow the RFC and include the leading whitespace ... + if (h) { + this.header[h][this.header[h].length - 1] += lines[i] + continue + } } - if (typeof namespace === 'string') { - namespace = (0, _parse.default)(namespace); + const posColon = lines[i].indexOf(':') + if ( + posColon === -1 || + posColon === 0 + ) { + return } + m = RE_HDR.exec(lines[i]) + h = m[1].toLowerCase() + this.header[h] = this.header[h] || [] + this.header[h].push((m[2] || '')) + if (++this.npairs === this.maxHeaderPairs) { break } + } +} - if (namespace.length !== 16) { - throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); - } // Compute hash of namespace and value, Per 4.3 - // Future: Use spread syntax when supported on all platforms, e.g. `bytes = - // hashfunc([...namespace, ... value])` +module.exports = HeaderParser - let bytes = new Uint8Array(16 + value.length); - bytes.set(namespace); - bytes.set(value, namespace.length); - bytes = hashfunc(bytes); - bytes[6] = bytes[6] & 0x0f | version; - bytes[8] = bytes[8] & 0x3f | 0x80; +/***/ }), - if (buf) { - offset = offset || 0; +/***/ 81620: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - for (let i = 0; i < 16; ++i) { - buf[offset + i] = bytes[i]; - } +"use strict"; - return buf; - } - return (0, _stringify.default)(bytes); - } // Function#name is not settable on some platforms (#270) +const inherits = (__nccwpck_require__(47261).inherits) +const ReadableStream = (__nccwpck_require__(84492).Readable) +function PartStream (opts) { + ReadableStream.call(this, opts) +} +inherits(PartStream, ReadableStream) - try { - generateUUID.name = name; // eslint-disable-next-line no-empty - } catch (err) {} // For CommonJS default export support +PartStream.prototype._read = function (n) {} +module.exports = PartStream - generateUUID.DNS = DNS; - generateUUID.URL = URL; - return generateUUID; -} /***/ }), -/***/ 85122: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 51142: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _rng = _interopRequireDefault(__nccwpck_require__(50807)); +/** + * Copyright Brian White. All rights reserved. + * + * @see https://github.com/mscdex/streamsearch + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation + * by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool + */ +const EventEmitter = (__nccwpck_require__(15673).EventEmitter) +const inherits = (__nccwpck_require__(47261).inherits) -var _stringify = _interopRequireDefault(__nccwpck_require__(18950)); +function SBMH (needle) { + if (typeof needle === 'string') { + needle = Buffer.from(needle) + } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + if (!Buffer.isBuffer(needle)) { + throw new TypeError('The needle has to be a String or a Buffer.') + } -function v4(options, buf, offset) { - options = options || {}; + const needleLength = needle.length - const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + if (needleLength === 0) { + throw new Error('The needle cannot be an empty String/Buffer.') + } + if (needleLength > 256) { + throw new Error('The needle cannot have a length bigger than 256.') + } - rnds[6] = rnds[6] & 0x0f | 0x40; - rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + this.maxMatches = Infinity + this.matches = 0 - if (buf) { - offset = offset || 0; + this._occ = new Array(256) + .fill(needleLength) // Initialize occurrence table. + this._lookbehind_size = 0 + this._needle = needle + this._bufpos = 0 - for (let i = 0; i < 16; ++i) { - buf[offset + i] = rnds[i]; - } + this._lookbehind = Buffer.alloc(needleLength) - return buf; + // Populate occurrence table with analysis of the needle, + // ignoring last letter. + for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var + this._occ[needle[i]] = needleLength - 1 - i } +} +inherits(SBMH, EventEmitter) - return (0, _stringify.default)(rnds); +SBMH.prototype.reset = function () { + this._lookbehind_size = 0 + this.matches = 0 + this._bufpos = 0 } -var _default = v4; -exports["default"] = _default; +SBMH.prototype.push = function (chunk, pos) { + if (!Buffer.isBuffer(chunk)) { + chunk = Buffer.from(chunk, 'binary') + } + const chlen = chunk.length + this._bufpos = pos || 0 + let r + while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) } + return r +} -/***/ }), +SBMH.prototype._sbmh_feed = function (data) { + const len = data.length + const needle = this._needle + const needleLength = needle.length + const lastNeedleChar = needle[needleLength - 1] + + // Positive: points to a position in `data` + // pos == 3 points to data[3] + // Negative: points to a position in the lookbehind buffer + // pos == -2 points to lookbehind[lookbehind_size - 2] + let pos = -this._lookbehind_size + let ch + + if (pos < 0) { + // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool + // search with character lookup code that considers both the + // lookbehind buffer and the current round's haystack data. + // + // Loop until + // there is a match. + // or until + // we've moved past the position that requires the + // lookbehind buffer. In this case we switch to the + // optimized loop. + // or until + // the character to look at lies outside the haystack. + while (pos < 0 && pos <= len - needleLength) { + ch = this._sbmh_lookup_char(data, pos + needleLength - 1) -/***/ 79120: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + if ( + ch === lastNeedleChar && + this._sbmh_memcmp(data, pos, needleLength - 1) + ) { + this._lookbehind_size = 0 + ++this.matches + this.emit('info', true) -"use strict"; + return (this._bufpos = pos + needleLength) + } + pos += this._occ[ch] + } + // No match. -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; + if (pos < 0) { + // There's too few data for Boyer-Moore-Horspool to run, + // so let's use a different algorithm to skip as much as + // we can. + // Forward pos until + // the trailing part of lookbehind + data + // looks like the beginning of the needle + // or until + // pos == 0 + while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos } + } -var _v = _interopRequireDefault(__nccwpck_require__(65998)); + if (pos >= 0) { + // Discard lookbehind buffer. + this.emit('info', false, this._lookbehind, 0, this._lookbehind_size) + this._lookbehind_size = 0 + } else { + // Cut off part of the lookbehind buffer that has + // been processed and append the entire haystack + // into it. + const bytesToCutOff = this._lookbehind_size + pos + if (bytesToCutOff > 0) { + // The cut off data is guaranteed not to contain the needle. + this.emit('info', false, this._lookbehind, 0, bytesToCutOff) + } -var _sha = _interopRequireDefault(__nccwpck_require__(85274)); + this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff, + this._lookbehind_size - bytesToCutOff) + this._lookbehind_size -= bytesToCutOff -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + data.copy(this._lookbehind, this._lookbehind_size) + this._lookbehind_size += len -const v5 = (0, _v.default)('v5', 0x50, _sha.default); -var _default = v5; -exports["default"] = _default; + this._bufpos = len + return len + } + } -/***/ }), + pos += (pos >= 0) * this._bufpos -/***/ 66900: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + // Lookbehind buffer is now empty. We only need to check if the + // needle is in the haystack. + if (data.indexOf(needle, pos) !== -1) { + pos = data.indexOf(needle, pos) + ++this.matches + if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) } -"use strict"; + return (this._bufpos = pos + needleLength) + } else { + pos = len - needleLength + } + // There was no match. If there's trailing haystack data that we cannot + // match yet using the Boyer-Moore-Horspool algorithm (because the trailing + // data is less than the needle size) then match using a modified + // algorithm that starts matching from the beginning instead of the end. + // Whatever trailing data is left after running this algorithm is added to + // the lookbehind buffer. + while ( + pos < len && + ( + data[pos] !== needle[0] || + ( + (Buffer.compare( + data.subarray(pos, pos + len - pos), + needle.subarray(0, len - pos) + ) !== 0) + ) + ) + ) { + ++pos + } + if (pos < len) { + data.copy(this._lookbehind, 0, pos, pos + (len - pos)) + this._lookbehind_size = len - pos + } -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; + // Everything until pos is guaranteed not to contain needle data. + if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) } -var _regex = _interopRequireDefault(__nccwpck_require__(40814)); + this._bufpos = len + return len +} -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +SBMH.prototype._sbmh_lookup_char = function (data, pos) { + return (pos < 0) + ? this._lookbehind[this._lookbehind_size + pos] + : data[pos] +} -function validate(uuid) { - return typeof uuid === 'string' && _regex.default.test(uuid); +SBMH.prototype._sbmh_memcmp = function (data, pos, len) { + for (var i = 0; i < len; ++i) { // eslint-disable-line no-var + if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false } + } + return true } -var _default = validate; -exports["default"] = _default; +module.exports = SBMH + /***/ }), -/***/ 81595: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 50727: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; +const WritableStream = (__nccwpck_require__(84492).Writable) +const { inherits } = __nccwpck_require__(47261) +const Dicer = __nccwpck_require__(92960) -var _validate = _interopRequireDefault(__nccwpck_require__(66900)); +const MultipartParser = __nccwpck_require__(32183) +const UrlencodedParser = __nccwpck_require__(78306) +const parseParams = __nccwpck_require__(31854) -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function Busboy (opts) { + if (!(this instanceof Busboy)) { return new Busboy(opts) } -function version(uuid) { - if (!(0, _validate.default)(uuid)) { - throw TypeError('Invalid UUID'); + if (typeof opts !== 'object') { + throw new TypeError('Busboy expected an options-Object.') + } + if (typeof opts.headers !== 'object') { + throw new TypeError('Busboy expected an options-Object with headers-attribute.') + } + if (typeof opts.headers['content-type'] !== 'string') { + throw new TypeError('Missing Content-Type-header.') } - return parseInt(uuid.substr(14, 1), 16); -} - -var _default = version; -exports["default"] = _default; - -/***/ }), - -/***/ 62940: -/***/ ((module) => { - -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') + const { + headers, + ...streamOptions + } = opts - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) + this.opts = { + autoDestroy: false, + ...streamOptions + } + WritableStream.call(this, this.opts) - return wrapper + this._done = false + this._parser = this.getParserByHeaders(headers) + this._finished = false +} +inherits(Busboy, WritableStream) - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) +Busboy.prototype.emit = function (ev) { + if (ev === 'finish') { + if (!this._done) { + this._parser?.end() + return + } else if (this._finished) { + return } - return ret + this._finished = true } + WritableStream.prototype.emit.apply(this, arguments) } +Busboy.prototype.getParserByHeaders = function (headers) { + const parsed = parseParams(headers['content-type']) -/***/ }), + const cfg = { + defCharset: this.opts.defCharset, + fileHwm: this.opts.fileHwm, + headers, + highWaterMark: this.opts.highWaterMark, + isPartAFile: this.opts.isPartAFile, + limits: this.opts.limits, + parsedConType: parsed, + preservePath: this.opts.preservePath + } -/***/ 39491: -/***/ ((module) => { + if (MultipartParser.detect.test(parsed[0])) { + return new MultipartParser(this, cfg) + } + if (UrlencodedParser.detect.test(parsed[0])) { + return new UrlencodedParser(this, cfg) + } + throw new Error('Unsupported Content-Type.') +} -"use strict"; -module.exports = require("assert"); +Busboy.prototype._write = function (chunk, encoding, cb) { + this._parser.write(chunk, cb) +} -/***/ }), +module.exports = Busboy +module.exports["default"] = Busboy +module.exports.Busboy = Busboy -/***/ 50852: -/***/ ((module) => { +module.exports.Dicer = Dicer -"use strict"; -module.exports = require("async_hooks"); /***/ }), -/***/ 14300: -/***/ ((module) => { +/***/ 32183: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -module.exports = require("buffer"); -/***/ }), -/***/ 32081: -/***/ ((module) => { +// TODO: +// * support 1 nested multipart level +// (see second multipart example here: +// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data) +// * support limits.fieldNameSize +// -- this will require modifications to utils.parseParams -"use strict"; -module.exports = require("child_process"); +const { Readable } = __nccwpck_require__(84492) +const { inherits } = __nccwpck_require__(47261) -/***/ }), +const Dicer = __nccwpck_require__(92960) -/***/ 96206: -/***/ ((module) => { +const parseParams = __nccwpck_require__(31854) +const decodeText = __nccwpck_require__(84619) +const basename = __nccwpck_require__(48647) +const getLimit = __nccwpck_require__(21467) -"use strict"; -module.exports = require("console"); +const RE_BOUNDARY = /^boundary$/i +const RE_FIELD = /^form-data$/i +const RE_CHARSET = /^charset$/i +const RE_FILENAME = /^filename$/i +const RE_NAME = /^name$/i -/***/ }), +Multipart.detect = /^multipart\/form-data/i +function Multipart (boy, cfg) { + let i + let len + const self = this + let boundary + const limits = cfg.limits + const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined)) + const parsedConType = cfg.parsedConType || [] + const defCharset = cfg.defCharset || 'utf8' + const preservePath = cfg.preservePath + const fileOpts = { highWaterMark: cfg.fileHwm } -/***/ 22057: -/***/ ((module) => { + for (i = 0, len = parsedConType.length; i < len; ++i) { + if (Array.isArray(parsedConType[i]) && + RE_BOUNDARY.test(parsedConType[i][0])) { + boundary = parsedConType[i][1] + break + } + } -"use strict"; -module.exports = require("constants"); + function checkFinished () { + if (nends === 0 && finished && !boy._done) { + finished = false + self.end() + } + } -/***/ }), + if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') } -/***/ 6113: -/***/ ((module) => { + const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024) + const fileSizeLimit = getLimit(limits, 'fileSize', Infinity) + const filesLimit = getLimit(limits, 'files', Infinity) + const fieldsLimit = getLimit(limits, 'fields', Infinity) + const partsLimit = getLimit(limits, 'parts', Infinity) + const headerPairsLimit = getLimit(limits, 'headerPairs', 2000) + const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024) -"use strict"; -module.exports = require("crypto"); + let nfiles = 0 + let nfields = 0 + let nends = 0 + let curFile + let curField + let finished = false -/***/ }), + this._needDrain = false + this._pause = false + this._cb = undefined + this._nparts = 0 + this._boy = boy -/***/ 67643: -/***/ ((module) => { + const parserCfg = { + boundary, + maxHeaderPairs: headerPairsLimit, + maxHeaderSize: headerSizeLimit, + partHwm: fileOpts.highWaterMark, + highWaterMark: cfg.highWaterMark + } -"use strict"; -module.exports = require("diagnostics_channel"); + this.parser = new Dicer(parserCfg) + this.parser.on('drain', function () { + self._needDrain = false + if (self._cb && !self._pause) { + const cb = self._cb + self._cb = undefined + cb() + } + }).on('part', function onPart (part) { + if (++self._nparts > partsLimit) { + self.parser.removeListener('part', onPart) + self.parser.on('part', skipPart) + boy.hitPartsLimit = true + boy.emit('partsLimit') + return skipPart(part) + } -/***/ }), + // hack because streams2 _always_ doesn't emit 'end' until nextTick, so let + // us emit 'end' early since we know the part has ended if we are already + // seeing the next part + if (curField) { + const field = curField + field.emit('end') + field.removeAllListeners('end') + } -/***/ 82361: -/***/ ((module) => { + part.on('header', function (header) { + let contype + let fieldname + let parsed + let charset + let encoding + let filename + let nsize = 0 -"use strict"; -module.exports = require("events"); + if (header['content-type']) { + parsed = parseParams(header['content-type'][0]) + if (parsed[0]) { + contype = parsed[0].toLowerCase() + for (i = 0, len = parsed.length; i < len; ++i) { + if (RE_CHARSET.test(parsed[i][0])) { + charset = parsed[i][1].toLowerCase() + break + } + } + } + } -/***/ }), + if (contype === undefined) { contype = 'text/plain' } + if (charset === undefined) { charset = defCharset } -/***/ 57147: -/***/ ((module) => { + if (header['content-disposition']) { + parsed = parseParams(header['content-disposition'][0]) + if (!RE_FIELD.test(parsed[0])) { return skipPart(part) } + for (i = 0, len = parsed.length; i < len; ++i) { + if (RE_NAME.test(parsed[i][0])) { + fieldname = parsed[i][1] + } else if (RE_FILENAME.test(parsed[i][0])) { + filename = parsed[i][1] + if (!preservePath) { filename = basename(filename) } + } + } + } else { return skipPart(part) } -"use strict"; -module.exports = require("fs"); + if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' } -/***/ }), + let onData, + onEnd -/***/ 73292: -/***/ ((module) => { + if (isPartAFile(fieldname, contype, filename)) { + // file/binary field + if (nfiles === filesLimit) { + if (!boy.hitFilesLimit) { + boy.hitFilesLimit = true + boy.emit('filesLimit') + } + return skipPart(part) + } -"use strict"; -module.exports = require("fs/promises"); + ++nfiles -/***/ }), + if (!boy._events.file) { + self.parser._ignore() + return + } -/***/ 13685: -/***/ ((module) => { + ++nends + const file = new FileStream(fileOpts) + curFile = file + file.on('end', function () { + --nends + self._pause = false + checkFinished() + if (self._cb && !self._needDrain) { + const cb = self._cb + self._cb = undefined + cb() + } + }) + file._read = function (n) { + if (!self._pause) { return } + self._pause = false + if (self._cb && !self._needDrain) { + const cb = self._cb + self._cb = undefined + cb() + } + } + boy.emit('file', fieldname, file, filename, encoding, contype) -"use strict"; -module.exports = require("http"); + onData = function (data) { + if ((nsize += data.length) > fileSizeLimit) { + const extralen = fileSizeLimit - nsize + data.length + if (extralen > 0) { file.push(data.slice(0, extralen)) } + file.truncated = true + file.bytesRead = fileSizeLimit + part.removeAllListeners('data') + file.emit('limit') + return + } else if (!file.push(data)) { self._pause = true } -/***/ }), + file.bytesRead = nsize + } -/***/ 85158: -/***/ ((module) => { + onEnd = function () { + curFile = undefined + file.push(null) + } + } else { + // non-file field + if (nfields === fieldsLimit) { + if (!boy.hitFieldsLimit) { + boy.hitFieldsLimit = true + boy.emit('fieldsLimit') + } + return skipPart(part) + } -"use strict"; -module.exports = require("http2"); + ++nfields + ++nends + let buffer = '' + let truncated = false + curField = part -/***/ }), + onData = function (data) { + if ((nsize += data.length) > fieldSizeLimit) { + const extralen = (fieldSizeLimit - (nsize - data.length)) + buffer += data.toString('binary', 0, extralen) + truncated = true + part.removeAllListeners('data') + } else { buffer += data.toString('binary') } + } -/***/ 95687: -/***/ ((module) => { + onEnd = function () { + curField = undefined + if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) } + boy.emit('field', fieldname, buffer, false, truncated, encoding, contype) + --nends + checkFinished() + } + } -"use strict"; -module.exports = require("https"); + /* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become + broken. Streams2/streams3 is a huge black box of confusion, but + somehow overriding the sync state seems to fix things again (and still + seems to work for previous node versions). + */ + part._readableState.sync = false -/***/ }), + part.on('data', onData) + part.on('end', onEnd) + }).on('error', function (err) { + if (curFile) { curFile.emit('error', err) } + }) + }).on('error', function (err) { + boy.emit('error', err) + }).on('finish', function () { + finished = true + checkFinished() + }) +} -/***/ 41808: -/***/ ((module) => { +Multipart.prototype.write = function (chunk, cb) { + const r = this.parser.write(chunk) + if (r && !this._pause) { + cb() + } else { + this._needDrain = !r + this._cb = cb + } +} -"use strict"; -module.exports = require("net"); +Multipart.prototype.end = function () { + const self = this -/***/ }), + if (self.parser.writable) { + self.parser.end() + } else if (!self._boy._done) { + process.nextTick(function () { + self._boy._done = true + self._boy.emit('finish') + }) + } +} -/***/ 15673: -/***/ ((module) => { +function skipPart (part) { + part.resume() +} -"use strict"; -module.exports = require("node:events"); +function FileStream (opts) { + Readable.call(this, opts) -/***/ }), + this.bytesRead = 0 -/***/ 84492: -/***/ ((module) => { + this.truncated = false +} -"use strict"; -module.exports = require("node:stream"); +inherits(FileStream, Readable) -/***/ }), +FileStream.prototype._read = function (n) {} -/***/ 47261: -/***/ ((module) => { +module.exports = Multipart -"use strict"; -module.exports = require("node:util"); /***/ }), -/***/ 22037: -/***/ ((module) => { +/***/ 78306: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -module.exports = require("os"); -/***/ }), -/***/ 71017: -/***/ ((module) => { +const Decoder = __nccwpck_require__(27100) +const decodeText = __nccwpck_require__(84619) +const getLimit = __nccwpck_require__(21467) -"use strict"; -module.exports = require("path"); +const RE_CHARSET = /^charset$/i -/***/ }), +UrlEncoded.detect = /^application\/x-www-form-urlencoded/i +function UrlEncoded (boy, cfg) { + const limits = cfg.limits + const parsedConType = cfg.parsedConType + this.boy = boy -/***/ 4074: -/***/ ((module) => { + this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024) + this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100) + this.fieldsLimit = getLimit(limits, 'fields', Infinity) -"use strict"; -module.exports = require("perf_hooks"); + let charset + for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var + if (Array.isArray(parsedConType[i]) && + RE_CHARSET.test(parsedConType[i][0])) { + charset = parsedConType[i][1].toLowerCase() + break + } + } -/***/ }), + if (charset === undefined) { charset = cfg.defCharset || 'utf8' } -/***/ 77282: -/***/ ((module) => { + this.decoder = new Decoder() + this.charset = charset + this._fields = 0 + this._state = 'key' + this._checkingBytes = true + this._bytesKey = 0 + this._bytesVal = 0 + this._key = '' + this._val = '' + this._keyTrunc = false + this._valTrunc = false + this._hitLimit = false +} -"use strict"; -module.exports = require("process"); +UrlEncoded.prototype.write = function (data, cb) { + if (this._fields === this.fieldsLimit) { + if (!this.boy.hitFieldsLimit) { + this.boy.hitFieldsLimit = true + this.boy.emit('fieldsLimit') + } + return cb() + } -/***/ }), + let idxeq; let idxamp; let i; let p = 0; const len = data.length -/***/ 63477: -/***/ ((module) => { + while (p < len) { + if (this._state === 'key') { + idxeq = idxamp = undefined + for (i = p; i < len; ++i) { + if (!this._checkingBytes) { ++p } + if (data[i] === 0x3D/* = */) { + idxeq = i + break + } else if (data[i] === 0x26/* & */) { + idxamp = i + break + } + if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { + this._hitLimit = true + break + } else if (this._checkingBytes) { ++this._bytesKey } + } -"use strict"; -module.exports = require("querystring"); + if (idxeq !== undefined) { + // key with assignment + if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) } + this._state = 'val' -/***/ }), + this._hitLimit = false + this._checkingBytes = true + this._val = '' + this._bytesVal = 0 + this._valTrunc = false + this.decoder.reset() -/***/ 12781: -/***/ ((module) => { + p = idxeq + 1 + } else if (idxamp !== undefined) { + // key with no assignment + ++this._fields + let key; const keyTrunc = this._keyTrunc + if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key } -"use strict"; -module.exports = require("stream"); + this._hitLimit = false + this._checkingBytes = true + this._key = '' + this._bytesKey = 0 + this._keyTrunc = false + this.decoder.reset() -/***/ }), + if (key.length) { + this.boy.emit('field', decodeText(key, 'binary', this.charset), + '', + keyTrunc, + false) + } -/***/ 35356: -/***/ ((module) => { + p = idxamp + 1 + if (this._fields === this.fieldsLimit) { return cb() } + } else if (this._hitLimit) { + // we may not have hit the actual limit if there are encoded bytes... + if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) } + p = i + if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { + // yep, we actually did hit the limit + this._checkingBytes = false + this._keyTrunc = true + } + } else { + if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) } + p = len + } + } else { + idxamp = undefined + for (i = p; i < len; ++i) { + if (!this._checkingBytes) { ++p } + if (data[i] === 0x26/* & */) { + idxamp = i + break + } + if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { + this._hitLimit = true + break + } else if (this._checkingBytes) { ++this._bytesVal } + } -"use strict"; -module.exports = require("stream/web"); + if (idxamp !== undefined) { + ++this._fields + if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) } + this.boy.emit('field', decodeText(this._key, 'binary', this.charset), + decodeText(this._val, 'binary', this.charset), + this._keyTrunc, + this._valTrunc) + this._state = 'key' -/***/ }), + this._hitLimit = false + this._checkingBytes = true + this._key = '' + this._bytesKey = 0 + this._keyTrunc = false + this.decoder.reset() -/***/ 71576: -/***/ ((module) => { + p = idxamp + 1 + if (this._fields === this.fieldsLimit) { return cb() } + } else if (this._hitLimit) { + // we may not have hit the actual limit if there are encoded bytes... + if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) } + p = i + if ((this._val === '' && this.fieldSizeLimit === 0) || + (this._bytesVal = this._val.length) === this.fieldSizeLimit) { + // yep, we actually did hit the limit + this._checkingBytes = false + this._valTrunc = true + } + } else { + if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) } + p = len + } + } + } + cb() +} -"use strict"; -module.exports = require("string_decoder"); +UrlEncoded.prototype.end = function () { + if (this.boy._done) { return } -/***/ }), + if (this._state === 'key' && this._key.length > 0) { + this.boy.emit('field', decodeText(this._key, 'binary', this.charset), + '', + this._keyTrunc, + false) + } else if (this._state === 'val') { + this.boy.emit('field', decodeText(this._key, 'binary', this.charset), + decodeText(this._val, 'binary', this.charset), + this._keyTrunc, + this._valTrunc) + } + this.boy._done = true + this.boy.emit('finish') +} -/***/ 24404: -/***/ ((module) => { +module.exports = UrlEncoded -"use strict"; -module.exports = require("tls"); /***/ }), -/***/ 76224: +/***/ 27100: /***/ ((module) => { "use strict"; -module.exports = require("tty"); -/***/ }), -/***/ 57310: -/***/ ((module) => { +const RE_PLUS = /\+/g -"use strict"; -module.exports = require("url"); +const HEX = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +] -/***/ }), +function Decoder () { + this.buffer = undefined +} +Decoder.prototype.write = function (str) { + // Replace '+' with ' ' before decoding + str = str.replace(RE_PLUS, ' ') + let res = '' + let i = 0; let p = 0; const len = str.length + for (; i < len; ++i) { + if (this.buffer !== undefined) { + if (!HEX[str.charCodeAt(i)]) { + res += '%' + this.buffer + this.buffer = undefined + --i // retry character + } else { + this.buffer += str[i] + ++p + if (this.buffer.length === 2) { + res += String.fromCharCode(parseInt(this.buffer, 16)) + this.buffer = undefined + } + } + } else if (str[i] === '%') { + if (i > p) { + res += str.substring(p, i) + p = i + } + this.buffer = '' + ++p + } + } + if (p < len && this.buffer === undefined) { res += str.substring(p) } + return res +} +Decoder.prototype.reset = function () { + this.buffer = undefined +} -/***/ 73837: -/***/ ((module) => { +module.exports = Decoder -"use strict"; -module.exports = require("util"); /***/ }), -/***/ 29830: +/***/ 48647: /***/ ((module) => { "use strict"; -module.exports = require("util/types"); -/***/ }), -/***/ 71267: -/***/ ((module) => { +module.exports = function basename (path) { + if (typeof path !== 'string') { return '' } + for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var + switch (path.charCodeAt(i)) { + case 0x2F: // '/' + case 0x5C: // '\' + path = path.slice(i + 1) + return (path === '..' || path === '.' ? '' : path) + } + } + return (path === '..' || path === '.' ? '' : path) +} -"use strict"; -module.exports = require("worker_threads"); /***/ }), -/***/ 59796: -/***/ ((module) => { +/***/ 84619: +/***/ (function(module) { "use strict"; -module.exports = require("zlib"); -/***/ }), -/***/ 3102: -/***/ ((module) => { +// Node has always utf-8 +const utf8Decoder = new TextDecoder('utf-8') +const textDecoders = new Map([ + ['utf-8', utf8Decoder], + ['utf8', utf8Decoder] +]) -"use strict"; -module.exports = JSON.parse('{"options":{"classFile":"vpn","class":"VpnConnectionBase","interface":"IVpnConnection"},"metrics":{"namespace":"AWS/VPN","dimensions":{"VpnId":"this.vpnId"},"metrics":[{"name":"TunnelState","documentation":"The state of the tunnel. 0 indicates DOWN and 1 indicates UP."},{"name":"TunnelDataIn","documentation":"The bytes received through the VPN tunnel.","type":"count"},{"name":"TunnelDataOut","documentation":"The bytes sent through the VPN tunnel.","type":"count"}]}}'); +function getDecoder (charset) { + let lc + while (true) { + switch (charset) { + case 'utf-8': + case 'utf8': + return decoders.utf8 + case 'latin1': + case 'ascii': // TODO: Make these a separate, strict decoder? + case 'us-ascii': + case 'iso-8859-1': + case 'iso8859-1': + case 'iso88591': + case 'iso_8859-1': + case 'windows-1252': + case 'iso_8859-1:1987': + case 'cp1252': + case 'x-cp1252': + return decoders.latin1 + case 'utf16le': + case 'utf-16le': + case 'ucs2': + case 'ucs-2': + return decoders.utf16le + case 'base64': + return decoders.base64 + default: + if (lc === undefined) { + lc = true + charset = charset.toLowerCase() + continue + } + return decoders.other.bind(charset) + } + } +} -/***/ }), +const decoders = { + utf8: (data, sourceEncoding) => { + if (data.length === 0) { + return '' + } + if (typeof data === 'string') { + data = Buffer.from(data, sourceEncoding) + } + return data.utf8Slice(0, data.length) + }, -/***/ 15278: -/***/ ((module) => { + latin1: (data, sourceEncoding) => { + if (data.length === 0) { + return '' + } + if (typeof data === 'string') { + return data + } + return data.latin1Slice(0, data.length) + }, -"use strict"; -module.exports = JSON.parse('{"metrics":{"namespace":"AWS/Lambda","dimensions":{"FunctionName":"this.functionName"},"metrics":[{"name":"Throttles","documentation":"How often this Lambda is throttled","type":"count"},{"name":"Invocations","documentation":"How often this Lambda is invoked","type":"count"},{"name":"Errors","documentation":"How many invocations of this Lambda fail","type":"count"},{"name":"Duration","documentation":"How long execution of this Lambda takes"}]}}'); + utf16le: (data, sourceEncoding) => { + if (data.length === 0) { + return '' + } + if (typeof data === 'string') { + data = Buffer.from(data, sourceEncoding) + } + return data.ucs2Slice(0, data.length) + }, -/***/ }), + base64: (data, sourceEncoding) => { + if (data.length === 0) { + return '' + } + if (typeof data === 'string') { + data = Buffer.from(data, sourceEncoding) + } + return data.base64Slice(0, data.length) + }, -/***/ 46602: -/***/ ((module) => { + other: (data, sourceEncoding) => { + if (data.length === 0) { + return '' + } + if (typeof data === 'string') { + data = Buffer.from(data, sourceEncoding) + } -"use strict"; -module.exports = JSON.parse('{"options":{"classFile":"cluster","class":"DatabaseClusterBase","interfaceFile":"cluster-ref","interface":"IDatabaseCluster"},"metrics":{"namespace":"AWS/RDS","dimensions":{"DBClusterIdentifier":"this.clusterIdentifier"},"metrics":[{"name":"CPUUtilization","documentation":"The percentage of CPU utilization."},{"name":"DatabaseConnections","documentation":"The number of database connections in use."},{"name":"Deadlocks","documentation":"The average number of deadlocks in the database per second."},{"name":"EngineUptime","documentation":"The amount of time that the instance has been running, in seconds."},{"name":"FreeableMemory","documentation":"The amount of available random access memory, in bytes."},{"name":"FreeLocalStorage","documentation":"The amount of local storage available, in bytes."},{"name":"NetworkReceiveThroughput","documentation":"The amount of network throughput received from clients by each instance, in bytes per second."},{"name":"NetworkThroughput","documentation":"The amount of network throughput both received from and transmitted to clients by each instance, in bytes per second."},{"name":"NetworkTransmitThroughput","documentation":"The amount of network throughput sent to clients by each instance, in bytes per second."},{"name":"SnapshotStorageUsed","documentation":"The total amount of backup storage in bytes consumed by all Aurora snapshots outside its backup retention window."},{"name":"TotalBackupStorageBilled","documentation":"The total amount of backup storage in bytes for which you are billed."},{"name":"VolumeBytesUsed","documentation":"The amount of storage used by your Aurora DB instance, in bytes."},{"name":"VolumeReadIOPs","documentation":"The number of billed read I/O operations from a cluster volume, reported at 5-minute intervals."},{"name":"VolumeWriteIOPs","documentation":"The number of write disk I/O operations to the cluster volume, reported at 5-minute intervals."}]}}'); + if (textDecoders.has(this.toString())) { + try { + return textDecoders.get(this).decode(data) + } catch (e) { } + } + return typeof data === 'string' + ? data + : data.toString() + } +} -/***/ }), +function decodeText (text, sourceEncoding, destEncoding) { + if (text) { + return getDecoder(destEncoding)(text, sourceEncoding) + } + return text +} -/***/ 48781: -/***/ ((module) => { +module.exports = decodeText -"use strict"; -module.exports = JSON.parse('{"options":{"classFile":"instance","class":"DatabaseInstanceBase","interface":"IDatabaseInstance"},"metrics":{"namespace":"AWS/RDS","dimensions":{"DBInstanceIdentifier":"this.instanceIdentifier"},"metrics":[{"name":"CPUUtilization","documentation":"The percentage of CPU utilization."},{"name":"DatabaseConnections","documentation":"The number of database connections in use."},{"name":"FreeStorageSpace","documentation":"The amount of available storage space."},{"name":"FreeableMemory","documentation":"The amount of available random access memory."},{"name":"WriteIOPS","documentation":"The average number of disk read I/O operations per second."},{"name":"ReadIOPS","documentation":"The average number of disk write I/O operations per second."}]}}'); /***/ }), -/***/ 49064: +/***/ 21467: /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"metrics":{"namespace":"AWS/SNS","dimensions":{"TopicName":"this.topicName"},"metrics":[{"name":"PublishSize","documentation":"Metric for the size of messages published through this topic"},{"name":"NumberOfMessagesPublished","documentation":"The number of messages published to your Amazon SNS topics.","type":"count"},{"name":"NumberOfNotificationsDelivered","documentation":"The number of messages successfully delivered from your Amazon SNS topics to subscribing endpoints.","type":"count"},{"name":"NumberOfNotificationsFailed","documentation":"The number of messages that Amazon SNS failed to deliver.","type":"count"},{"name":"NumberOfNotificationsFilteredOut","documentation":"The number of messages that were rejected by subscription filter policies.","type":"count"},{"name":"NumberOfNotificationsFilteredOut-NoMessageAttributes","documentation":"The number of messages that were rejected by subscription filter policies because the messages have no attributes.","type":"count"},{"name":"NumberOfNotificationsFilteredOut-InvalidAttributes","documentation":"The number of messages that were rejected by subscription filter policies because the messages\' attributes are invalid","type":"count"},{"name":"SMSMonthToDateSpentUSD","documentation":"The charges you have accrued since the start of the current calendar month for sending SMS messages.","type":"gauge"},{"name":"SMSSuccessRate","documentation":"The rate of successful SMS message deliveries.","type":"count"}]}}'); - -/***/ }), -/***/ 27873: -/***/ ((module) => { -"use strict"; -module.exports = JSON.parse('{"metrics":{"namespace":"AWS/SQS","dimensions":{"QueueName":"this.queueName"},"metrics":[{"name":"ApproximateAgeOfOldestMessage","documentation":"The approximate age of the oldest non-deleted message in the queue.","type":"gauge"},{"name":"ApproximateNumberOfMessagesDelayed","documentation":"The number of messages in the queue that are delayed and not available for reading immediately.","type":"gauge"},{"name":"ApproximateNumberOfMessagesNotVisible","documentation":"The number of messages that are in flight.","type":"gauge"},{"name":"ApproximateNumberOfMessagesVisible","documentation":"The number of messages available for retrieval from the queue.","type":"gauge"},{"name":"NumberOfEmptyReceives","documentation":"The number of ReceiveMessage API calls that did not return a message.","type":"count"},{"name":"NumberOfMessagesDeleted","documentation":"The number of messages deleted from the queue.","type":"count"},{"name":"NumberOfMessagesReceived","documentation":"The number of messages returned by calls to the ReceiveMessage action.","type":"count"},{"name":"NumberOfMessagesSent","documentation":"The number of messages added to a queue.","type":"count"},{"name":"SentMessageSize","documentation":"The size of messages added to a queue."}]}}'); +module.exports = function getLimit (limits, name, defaultLimit) { + if ( + !limits || + limits[name] === undefined || + limits[name] === null + ) { return defaultLimit } -/***/ }), + if ( + typeof limits[name] !== 'number' || + isNaN(limits[name]) + ) { throw new TypeError('Limit ' + name + ' is not a valid number') } -/***/ 33522: -/***/ ((module) => { + return limits[name] +} -"use strict"; -module.exports = JSON.parse('[{"id":"AWS::A4B","dashboard":"A4B","crossServiceDashboard":"A4B:CrossService","resourceTypes":[{"type":"AWS::A4B::Organization","keyMetric":"AWS::A4B::Organization:OfflineSharedDevices","dashboard":"A4B"}],"controls":{"AWS::A4B.organizations":{"type":"resource","resourceType":"AWS::A4B::Organization","labelField":"Organization","valueField":"Organization"}},"metricTemplates":[{"resourceType":"AWS::A4B::Organization","namespace":"AWS/A4B","dimensions":[{"dimensionName":"Organization","labelName":"Organization"}],"metrics":[{"id":"AWS::A4B::Organization:OfflineSharedDevices","name":"OfflineSharedDevices","defaultStat":"Sum"},{"id":"AWS::A4B::Organization:OnlineSharedDevices","name":"OnlineSharedDevices","defaultStat":"Sum"}]}],"dashboards":[{"id":"A4B:CrossService","name":"Alexa For Business","dependencies":[{"namespace":"AWS/A4B"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::A4B::Organization:OfflineSharedDevices"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::A4B::Organization:OnlineSharedDevices"}]}]}]},{"id":"A4B","name":"Alexa For Business","dependencies":[{"namespace":"AWS/A4B"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::A4B.organizations"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::A4B::Organization:OfflineSharedDevices"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::A4B::Organization:OnlineSharedDevices"}]}]}]}]},{"id":"AWS::AmazonMQ","dashboard":"AmazonMQ","crossServiceDashboard":"AmazonMQ:CrossService","resourceTypes":[{"type":"AWS::AmazonMQ::Broker","keyMetric":"AWS::AmazonMQ::Broker:CpuUtilization","dashboard":"AmazonMQ","arnRegex":".*:broker:(.*):.*"}],"controls":{"AWS::AmazonMQ.brokers":{"type":"resource","resourceType":"AWS::AmazonMQ::Broker","labelField":"Broker","valueField":"Broker"}},"metricTemplates":[{"resourceType":"AWS::AmazonMQ::Broker","namespace":"AWS/AmazonMQ","dimensions":[{"dimensionName":"Broker","labelName":"Broker"}],"metrics":[{"id":"AWS::AmazonMQ::Broker:AckRate","name":"AckRate","defaultStat":"Average"},{"id":"AWS::AmazonMQ::Broker:ChannelCount","name":"ChannelCount","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:ConfirmRate","name":"ConfirmRate","defaultStat":"Average"},{"id":"AWS::AmazonMQ::Broker:ConnectionCount","name":"ConnectionCount","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:ConsumerCount","name":"ConsumerCount","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:CpuCreditBalanceHeapUsage","name":"CpuCreditBalanceHeapUsage","defaultStat":"Maximum"},{"id":"AWS::AmazonMQ::Broker:CpuUtilization","name":"CpuUtilization","defaultStat":"Average"},{"id":"AWS::AmazonMQ::Broker:CurrentConnectionsCount","name":"CurrentConnectionsCount","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:ExchangeCount","name":"ExchangeCount","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:MessageCount","name":"MessageCount","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:MessageReadyCount","name":"MessageReadyCount","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:MessageUnacknowledgedCount","name":"MessageUnacknowledgedCount","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:NetworkIn","name":"NetworkIn","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:NetworkOut","name":"NetworkOut","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:PublishRate","name":"PublishRate","defaultStat":"Average"},{"id":"AWS::AmazonMQ::Broker:QueueCount","name":"QueueCount","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:TotalConsumerCount","name":"TotalConsumerCount","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:TotalMessageCount","name":"TotalMessageCount","defaultStat":"Sum"},{"id":"AWS::AmazonMQ::Broker:TotalProducerCount","name":"TotalProducerCount","defaultStat":"Sum"}]}],"dashboards":[{"id":"AmazonMQ:CrossService","name":"Amazon MQ","dependencies":[{"namespace":"AWS/AmazonMQ"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AmazonMQ::Broker:CpuUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AmazonMQ::Broker:CurrentConnectionsCount"}]}]}]},{"id":"AmazonMQ","name":"Amazon MQ","dependencies":[{"namespace":"AWS/AmazonMQ"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::AmazonMQ.brokers"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AmazonMQ::Broker:CpuUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AmazonMQ::Broker:CurrentConnectionsCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AmazonMQ::Broker:CpuCreditBalanceHeapUsage"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AmazonMQ::Broker:NetworkIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AmazonMQ::Broker:NetworkOut"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AmazonMQ::Broker:TotalConsumerCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AmazonMQ::Broker:TotalMessageCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AmazonMQ::Broker:TotalProducerCount"}]}]}]}]},{"id":"AWS::ApiGateway","dashboard":"ApiGateway","crossServiceDashboard":"ApiGateway:CrossService","resourceTypes":[{"type":"AWS::ApiGateway::RestApi","keyMetric":"AWS::ApiGateway::RestApi:Count","arnRegex":".*/restapis/([^/]*)","identifyingLabels":["ApiId"],"describe":"api-gateway-describe-apis","resourceDecorator":"api-gateway-resource-decorator","metricTransformer":"api-gateway-metric-transformer","consoleLink":"/apigateway/home?region={region}#/apis/{ApiId}/resources"},{"type":"AWS::ApiGateway::Stage","keyMetric":"AWS::ApiGateway::Stage:Count","identifyingLabels":["ApiId","Stage"],"resourceDecorator":"api-gateway-resource-decorator","metricTransformer":"api-gateway-metric-transformer","alarmPatterns":[{"namespace":"AWS/ApiGateway","dimensions":[{"dimensionName":"ApiName","labelName":"ApiName"},{"dimensionName":"Stage","labelName":"Stage"}]},{"namespace":"AWS/ApiGateway","dimensions":[{"dimensionName":"ApiName","labelName":"ApiName"},{"dimensionName":"Stage","dimensionValue":""}]}],"nodeNameRegex":"(.*)/(.*)","arnRegex":".*/restapis/(.*)/stages/(.*)","dashboard":"ApiGateway","isResourceNode":true}],"controls":{"AWS::ApiGateway.stages":{"type":"resource","resourceType":"AWS::ApiGateway::Stage","labelField":"ApiName","valueField":"ApiName"}},"metricTemplates":[{"resourceType":"AWS::ApiGateway::Stage","namespace":"AWS/ApiGateway","dimensions":[{"dimensionName":"ApiName","labelName":"ApiName"},{"dimensionName":"Stage","labelName":"Stage"}],"metrics":[{"id":"AWS::ApiGateway::Stage:4XXError","name":"4XXError","defaultStat":"Sum"},{"id":"AWS::ApiGateway::Stage:5XXError","name":"5XXError","defaultStat":"Sum"},{"id":"AWS::ApiGateway::Stage:CacheHitCount","name":"CacheHitCount","defaultStat":"Sum"},{"id":"AWS::ApiGateway::Stage:CacheMissCount","name":"CacheMissCount","defaultStat":"Sum"},{"id":"AWS::ApiGateway::Stage:Count","name":"Count","defaultStat":"Sum"},{"id":"AWS::ApiGateway::Stage:IntegrationLatency","name":"IntegrationLatency","defaultStat":"Average"},{"id":"AWS::ApiGateway::Stage:Latency","name":"Latency","defaultStat":"Average"}]},{"resourceType":"AWS::ApiGateway::RestApi","namespace":"AWS/ApiGateway","dimensions":[{"dimensionName":"ApiName","labelName":"ApiName"}],"metrics":[{"id":"AWS::ApiGateway::RestApi:4XXError","name":"4XXError","defaultStat":"Sum"},{"id":"AWS::ApiGateway::RestApi:5XXError","name":"5XXError","defaultStat":"Sum"},{"id":"AWS::ApiGateway::RestApi:CacheHitCount","name":"CacheHitCount","defaultStat":"Sum"},{"id":"AWS::ApiGateway::RestApi:CacheMissCount","name":"CacheMissCount","defaultStat":"Sum"},{"id":"AWS::ApiGateway::RestApi:Count","name":"Count","defaultStat":"Sum"},{"id":"AWS::ApiGateway::RestApi:IntegrationLatency","name":"IntegrationLatency","defaultStat":"Average"},{"id":"AWS::ApiGateway::RestApi:Latency","name":"Latency","defaultStat":"Average"}]},{"resourceType":"AWS::ApiGateway::Stage","id":"AWS::ApiGateway::ApiName:Method:Resource:Stage","namespace":"AWS/ApiGateway","dimensions":[{"dimensionName":"ApiName","labelName":"ApiName"},{"dimensionName":"Method","labelName":"Method"},{"dimensionName":"Resource","labelName":"Resource"},{"dimensionName":"Stage","labelName":"Stage"}],"metrics":[{"id":"AWS::ApiGateway::ApiName:Method:Resource:Stage:4XXError","name":"4XXError","defaultStat":"Sum"},{"id":"AWS::ApiGateway::ApiName:Method:Resource:Stage:5XXError","name":"5XXError","defaultStat":"Sum"},{"id":"AWS::ApiGateway::ApiName:Method:Resource:Stage:CacheHitCount","name":"CacheHitCount","defaultStat":"Sum"},{"id":"AWS::ApiGateway::ApiName:Method:Resource:Stage:CacheMissCount","name":"CacheMissCount","defaultStat":"Sum"},{"id":"AWS::ApiGateway::ApiName:Method:Resource:Stage:Count","name":"Count","defaultStat":"Sum"},{"id":"AWS::ApiGateway::ApiName:Method:Resource:Stage:IntegrationLatency","name":"IntegrationLatency","defaultStat":"Average"},{"id":"AWS::ApiGateway::ApiName:Method:Resource:Stage:Latency","name":"Latency","defaultStat":"Average"}]}],"dashboards":[{"id":"ApiGateway:CrossService","name":"API Gateway","dependencies":[{"namespace":"AWS/ApiGateway"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ApiGateway::RestApi:5XXError"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ApiGateway::RestApi:Latency"}]}]}]},{"id":"ApiGateway","name":"API Gateway","dependencies":[{"namespace":"AWS/ApiGateway"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::ApiGateway.stages"],"tables":[{"resourceType":"AWS::ApiGateway::RestApi","columns":["ApiName","EndpointTypes","CreatedDate"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ApiGateway::RestApi:Count"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ApiGateway::RestApi:5XXError"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ApiGateway::RestApi:4XXError"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ApiGateway::RestApi:Latency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ApiGateway::RestApi:IntegrationLatency"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ApiGateway::RestApi:CacheHitCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ApiGateway::RestApi:CacheMissCount"}]}]}]}]},{"id":"AWS::ApplicationELB","dashboard":"ApplicationELB","crossServiceDashboard":"ApplicationELB:CrossService","resourceTypes":[{"type":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB","entityType":"AWS::ElasticLoadBalancingV2::LoadBalancer","keyMetric":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ConsumedLCUs","dashboard":"ApplicationELB","arnRegex":".*:loadbalancer/(app/.*)"}],"controls":{"AWS::ApplicationELB.loadBalancers":{"type":"resource","resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB","labelField":"LoadBalancer","valueField":"LoadBalancer"}},"metricTemplates":[{"resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB","namespace":"AWS/ApplicationELB","dimensions":[{"dimensionName":"LoadBalancer","labelName":"LoadBalancer"}],"metrics":[{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ActiveConnectionCount","name":"ActiveConnectionCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ClientTLSNegotiationErrorCount","name":"ClientTLSNegotiationErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ConsumedLCUs","name":"ConsumedLCUs","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:DesyncMitigationMode_NonCompliant_Request_Count","name":"DesyncMitigationMode_NonCompliant_Request_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ELBAuthError","name":"ELBAuthError","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ELBAuthFailure","name":"ELBAuthFailure","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ELBAuthLatency","name":"ELBAuthLatency","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ELBAuthRefreshTokenSuccess","name":"ELBAuthRefreshTokenSuccess","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ELBAuthSuccess","name":"ELBAuthSuccess","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ELBAuthUserClaimsSizeExceeded","name":"ELBAuthUserClaimsSizeExceeded","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:GrpcRequestCount","name":"GrpcRequestCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTP_Fixed_Response_Count","name":"HTTP_Fixed_Response_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTP_Redirect_Count","name":"HTTP_Redirect_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTP_Redirect_Url_Limit_Exceeded_Count","name":"HTTP_Redirect_Url_Limit_Exceeded_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_ELB_3XX_Count","name":"HTTPCode_ELB_3XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_ELB_4XX_Count","name":"HTTPCode_ELB_4XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_ELB_5XX_Count","name":"HTTPCode_ELB_5XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_ELB_500_Count","name":"HTTPCode_ELB_500_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_ELB_502_Count","name":"HTTPCode_ELB_502_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_ELB_503_Count","name":"HTTPCode_ELB_503_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_ELB_504_Count","name":"HTTPCode_ELB_504_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_Target_2XX_Count","name":"HTTPCode_Target_2XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_Target_3XX_Count","name":"HTTPCode_Target_3XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_Target_4XX_Count","name":"HTTPCode_Target_4XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_Target_5XX_Count","name":"HTTPCode_Target_5XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:IPv6ProcessedBytes","name":"IPv6ProcessedBytes","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:IPv6RequestCount","name":"IPv6RequestCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:NewConnectionCount","name":"NewConnectionCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:NonStickyRequestCount","name":"NonStickyRequestCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ProcessedBytes","name":"ProcessedBytes","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:RejectedConnectionCount","name":"RejectedConnectionCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:RequestCount","name":"RequestCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:RuleEvaluations","name":"RuleEvaluations","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:TargetConnectionErrorCount","name":"TargetConnectionErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:TargetResponseTime","name":"TargetResponseTime","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:TargetTLSNegotiationErrorCount","name":"TargetTLSNegotiationErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LambdaTargetProcessedBytes","name":"LambdaTargetProcessedBytes","defaultStat":"Sum"}]},{"resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB","namespace":"AWS/ApplicationELB","id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:TargetGroup","dimensions":[{"dimensionName":"TargetGroup","labelName":"TargetGroup"}],"metrics":[{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:TargetGroup:RequestCountPerTarget","name":"RequestCountPerTarget","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:TargetGroup:LambdaInternalError","name":"LambdaInternalError","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:TargetGroup:LambdaUserError","name":"LambdaUserError","defaultStat":"Sum"}]},{"resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB","namespace":"AWS/ApplicationELB","id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer","dimensions":[{"dimensionName":"AvailabilityZone","labelName":"AvailabilityZone"},{"dimensionName":"LoadBalancer","labelName":"LoadBalancer"}],"metrics":[{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:ClientTLSNegotiationErrorCount","name":"ClientTLSNegotiationErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:DesyncMitigationMode_NonCompliant_Request_Count","name":"DesyncMitigationMode_NonCompliant_Request_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:DroppedInvalidHeaderRequestCount","name":"DroppedInvalidHeaderRequestCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:ELBAuthError","name":"ELBAuthError","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:ELBAuthFailure","name":"ELBAuthFailure","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:ELBAuthLatency","name":"ELBAuthLatency","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:ELBAuthRefreshTokenSuccess","name":"ELBAuthRefreshTokenSuccess","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:ELBAuthSuccess","name":"ELBAuthSuccess","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:ELBAuthUserClaimsSizeExceeded","name":"ELBAuthUserClaimsSizeExceeded","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:ForwardedInvalidHeaderRequestCount","name":"ForwardedInvalidHeaderRequestCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:HTTP_Fixed_Response_Count","name":"HTTP_Fixed_Response_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:HTTP_Redirect_Count","name":"HTTP_Redirect_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:HTTP_Redirect_Url_Limit_Exceeded_Count","name":"HTTP_Redirect_Url_Limit_Exceeded_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:HTTPCode_ELB_3XX_Count","name":"HTTPCode_ELB_3XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:HTTPCode_ELB_4XX_Count","name":"HTTPCode_ELB_4XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:HTTPCode_ELB_5XX_Count","name":"HTTPCode_ELB_5XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:HTTPCode_Target_2XX_Count","name":"HTTPCode_Target_2XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:HTTPCode_Target_3XX_Count","name":"HTTPCode_Target_3XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:HTTPCode_Target_4XX_Count","name":"HTTPCode_Target_4XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:HTTPCode_Target_5XX_Count","name":"HTTPCode_Target_5XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:NonStickyRequestCount","name":"NonStickyRequestCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:RejectedConnectionCount","name":"RejectedConnectionCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetConnectionErrorCount","name":"TargetConnectionErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetResponseTime","name":"TargetResponseTime","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetTLSNegotiationErrorCount","name":"TargetTLSNegotiationErrorCount","defaultStat":"Sum"}]},{"resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB","namespace":"AWS/ApplicationELB","id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup","dimensions":[{"dimensionName":"LoadBalancer","labelName":"LoadBalancer"},{"dimensionName":"TargetGroup","labelName":"TargetGroup"}],"metrics":[{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:HealthyHostCount","name":"HealthyHostCount","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:HTTPCode_Target_2XX_Count","name":"HTTPCode_Target_2XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:HTTPCode_Target_3XX_Count","name":"HTTPCode_Target_3XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:HTTPCode_Target_4XX_Count","name":"HTTPCode_Target_4XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:HTTPCode_Target_5XX_Count","name":"HTTPCode_Target_5XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:LambdaInternalError","name":"LambdaInternalError","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:LambdaUserError","name":"LambdaUserError","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:RequestCount","name":"RequestCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:RequestCountPerTarget","name":"RequestCountPerTarget","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:TargetConnectionErrorCount","name":"TargetConnectionErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:TargetResponseTime","name":"TargetResponseTime","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:TargetTLSNegotiationErrorCount","name":"TargetTLSNegotiationErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:LoadBalancer:TargetGroup:UnHealthyHostCount","name":"UnHealthyHostCount","defaultStat":"Average"}]},{"resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB","namespace":"AWS/ApplicationELB","id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetGroup","dimensions":[{"dimensionName":"AvailabilityZone","labelName":"AvailabilityZone"},{"dimensionName":"LoadBalancer","labelName":"LoadBalancer"},{"dimensionName":"TargetGroup","labelName":"TargetGroup"}],"metrics":[{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetGroup:HealthyHostCount","name":"HealthyHostCount","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetGroup:HTTPCode_Target_2XX_Count","name":"HTTPCode_Target_2XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetGroup:HTTPCode_Target_3XX_Count","name":"HTTPCode_Target_3XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetGroup:HTTPCode_Target_4XX_Count","name":"HTTPCode_Target_4XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetGroup:HTTPCode_Target_5XX_Count","name":"HTTPCode_Target_5XX_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetGroup:TargetConnectionErrorCount","name":"TargetConnectionErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetGroup:TargetResponseTime","name":"TargetResponseTime","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetGroup:TargetTLSNegotiationErrorCount","name":"TargetTLSNegotiationErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:AvailabilityZone:LoadBalancer:TargetGroup:UnHealthyHostCount","name":"UnHealthyHostCount","defaultStat":"Average"}]}],"dashboards":[{"id":"ApplicationELB:CrossService","name":"Application ELB","dependencies":[{"namespace":"AWS/ApplicationELB"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:RequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_ELB_5XX_Count"}]}]}]},{"id":"ApplicationELB:LoadBalancer","name":"Application ELB LoadBalancer","dependencies":[{"namespace":"AWS/ApplicationELB"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::ApplicationELB.loadBalancers"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:RequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_ELB_5XX_Count"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ActiveConnectionCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ClientTLSNegotiationErrorCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ConsumedLCUs"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTP_Fixed_Response_Count"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTP_Redirect_Count"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTP_Redirect_Url_Limit_Exceeded_Count"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_ELB_3XX_Count"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:HTTPCode_ELB_4XX_Count"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:IPv6ProcessedBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:IPv6RequestCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:NewConnectionCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ProcessedBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:RejectedConnectionCount"}]}]},{"widgets":[{"type":"chart","width":8,"metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:RuleEvaluations"}]}]}]},{"id":"ApplicationELB","name":"Application ELB","dependencies":[{"namespace":"AWS/ApplicationELB"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::ApplicationELB.loadBalancers"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"RequestCount: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"RequestCount\\"\', \'Sum\', {Period})","resourceType":false}]},{"type":"chart","properties":{"title":"HTTPCode_ELB_5XX_Count: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"HTTPCode_ELB_5XX_Count\\"\', \'Sum\', {Period})","resourceType":false}]},{"type":"chart","properties":{"title":"ActiveConnectionCount: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"ActiveConnectionCount\\"\', \'Sum\', {Period})","resourceType":false}]}]},{"widgets":[{"type":"chart","properties":{"title":"ClientTLSNegotiationErrorCount: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"ClientTLSNegotiationErrorCount\\"\', \'Sum\', {Period})","resourceType":false}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/ApplicationELB:ConsumedLCUs"}]},{"type":"chart","properties":{"title":"HTTP_Fixed_Response_Count: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"HTTP_Fixed_Response_Count\\"\', \'Sum\', {Period})","resourceType":false}]}]},{"widgets":[{"type":"chart","properties":{"title":"HTTP_Redirect_Count: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"HTTP_Redirect_Count\\"\', \'Sum\', {Period})","resourceType":false}]},{"type":"chart","properties":{"title":"HTTP_Redirect_Url_Limit_Exceeded_Count: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"HTTP_Redirect_Url_Limit_Exceeded_Count\\"\', \'Sum\', {Period})","resourceType":false}]},{"type":"chart","properties":{"title":"HTTPCode_ELB_3XX_Count: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"HTTPCode_ELB_3XX_Count\\"\', \'Sum\', {Period})","resourceType":false}]}]},{"widgets":[{"type":"chart","properties":{"title":"HTTPCode_ELB_4XX_Count: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"HTTPCode_ELB_4XX_Count\\"\', \'Sum\', {Period})","resourceType":false}]},{"type":"chart","properties":{"title":"IPv6ProcessedBytes: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"IPv6ProcessedBytes\\"\', \'Sum\', {Period})","resourceType":false}]},{"type":"chart","properties":{"title":"IPv6RequestCount: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"IPv6RequestCount\\"\', \'Sum\', {Period})","resourceType":false}]}]},{"widgets":[{"type":"chart","properties":{"title":"NewConnectionCount: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"NewConnectionCount\\"\', \'Sum\', {Period})","resourceType":false}]},{"type":"chart","properties":{"title":"ProcessedBytes: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"ProcessedBytes\\"\', \'Sum\', {Period})","resourceType":false}]},{"type":"chart","properties":{"title":"RejectedConnectionCount: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"RejectedConnectionCount\\"\', \'Sum\', {Period})","resourceType":false}]}]},{"widgets":[{"type":"chart","width":8,"properties":{"title":"RuleEvaluations: Sum"},"metrics":[{"metricExpression":"SEARCH(\'{AWS/ApplicationELB,LoadBalancer} MetricName=\\"RuleEvaluations\\"\', \'Sum\', {Period})","resourceType":false}]}]}]}]},{"id":"AWS::AppStream","dashboard":"AppStream","crossServiceDashboard":"AppStream:CrossService","resourceTypes":[{"type":"AWS::AppStream::Fleet","keyMetric":"AWS::AppStream::Fleet:CapacityUtilization","dashboard":"AppStream","arnRegex":".*:fleet/(.*)"}],"controls":{"AWS::AppStream.fleets":{"type":"resource","resourceType":"AWS::AppStream::Fleet","labelField":"Fleet","valueField":"Fleet"}},"metricTemplates":[{"resourceType":"AWS::AppStream::Fleet","namespace":"AWS/AppStream","dimensions":[{"dimensionName":"Fleet","labelName":"Fleet"}],"metrics":[{"id":"AWS::AppStream::Fleet:CapacityUtilization","name":"CapacityUtilization","defaultStat":"Average"},{"id":"AWS::AppStream::Fleet:InsufficientCapacityError","name":"InsufficientCapacityError","defaultStat":"Sum"},{"id":"AWS::AppStream::Fleet:ActualCapacity","name":"ActualCapacity","defaultStat":"Average"},{"id":"AWS::AppStream::Fleet:AvailableCapacity","name":"AvailableCapacity","defaultStat":"Average"},{"id":"AWS::AppStream::Fleet:DesiredCapacity","name":"DesiredCapacity","defaultStat":"Average"},{"id":"AWS::AppStream::Fleet:InUseCapacity","name":"InUseCapacity","defaultStat":"Average"},{"id":"AWS::AppStream::Fleet:PendingCapacity","name":"PendingCapacity","defaultStat":"Average"},{"id":"AWS::AppStream::Fleet:RunningCapacity","name":"RunningCapacity","defaultStat":"Average"}]}],"dashboards":[{"id":"AppStream:CrossService","name":"AppStream","dependencies":[{"namespace":"AWS/AppStream"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AppStream::Fleet:CapacityUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AppStream::Fleet:InsufficientCapacityError"}]}]}]},{"id":"AppStream","name":"AppStream","dependencies":[{"namespace":"AWS/AppStream"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::AppStream.fleets"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AppStream::Fleet:CapacityUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AppStream::Fleet:InsufficientCapacityError"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AppStream::Fleet:ActualCapacity"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AppStream::Fleet:AvailableCapacity"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AppStream::Fleet:DesiredCapacity"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AppStream::Fleet:InUseCapacity"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AppStream::Fleet:PendingCapacity"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AppStream::Fleet:RunningCapacity"}]}]}]}]},{"id":"AWS::AppSync","dashboard":"AppSync","crossServiceDashboard":"AppSync:CrossService","resourceTypes":[{"type":"AWS::AppSync::GraphQLApi","arnRegex":".*/(?.*)","keyMetric":"AWS::AppSync::GraphQLApi:4XXError","dashboard":"AppSync"}],"controls":{"AWS::AppSync.graphQLAPIs":{"type":"resource","resourceType":"AWS::AppSync::GraphQLApi","labelField":"GraphQLAPIId","valueField":"GraphQLAPIId"}},"metricTemplates":[{"resourceType":"AWS::AppSync::GraphQLApi","namespace":"AWS/AppSync","dimensions":[{"dimensionName":"GraphQLAPIId","labelName":"GraphQLAPIId"}],"metrics":[{"id":"AWS::AppSync::GraphQLApi:4XXError","name":"4XXError","defaultStat":"Sum"},{"id":"AWS::AppSync::GraphQLApi:5XXError","name":"5XXError","defaultStat":"Sum"},{"id":"AWS::AppSync::GraphQLApi:Latency","name":"Latency","defaultStat":"Average"}]}],"dashboards":[{"id":"AppSync:CrossService","name":"AppSync","dependencies":[{"namespace":"AWS/AppSync"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AppSync::GraphQLApi:4XXError"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AppSync::GraphQLApi:5XXError"}]}]}]},{"id":"AppSync","name":"AppSync","dependencies":[{"namespace":"AWS/AppSync"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::AppSync.graphQLAPIs"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AppSync::GraphQLApi:4XXError"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AppSync::GraphQLApi:5XXError"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AppSync::GraphQLApi:Latency"}]}]}]}]},{"id":"AWS::AutoScaling","dashboard":"AutoScaling","crossServiceDashboard":"AutoScaling:CrossService","resourceTypes":[{"type":"AWS::AutoScaling::AutoScalingGroup","consoleLink":"/ec2/autoscaling/home?region=us-east-1#AutoScalingGroups:id={AutoScalingGroupName};view=details","keyMetric":"AWS::AutoScaling::AutoScalingGroup:GroupTotalInstances","dashboard":"AutoScaling","describe":"autoscaling-describe-groups","arnRegex":".*:autoScalingGroup:(.*)"}],"controls":{"AWS::AutoScaling.autoScalingGroups":{"type":"resource","resourceType":"AWS::AutoScaling::AutoScalingGroup","labelField":"AutoScalingGroupName","valueField":"AutoScalingGroupName"}},"metricTemplates":[{"resourceType":"AWS::AutoScaling::AutoScalingGroup","namespace":"AWS/AutoScaling","dimensions":[{"dimensionName":"AutoScalingGroupName","labelName":"AutoScalingGroupName"}],"metrics":[{"id":"AWS::AutoScaling::AutoScalingGroup:GroupTotalInstances","name":"GroupTotalInstances","defaultStat":"Average"},{"id":"AWS::AutoScaling::AutoScalingGroup:GroupDesiredCapacity","name":"GroupDesiredCapacity","defaultStat":"Average"},{"id":"AWS::AutoScaling::AutoScalingGroup:GroupMaxSize","name":"GroupMaxSize","defaultStat":"Average"},{"id":"AWS::AutoScaling::AutoScalingGroup:GroupMinSize","name":"GroupMinSize","defaultStat":"Average"},{"id":"AWS::AutoScaling::AutoScalingGroup:GroupTerminatingInstances","name":"GroupTerminatingInstances","defaultStat":"Average"},{"id":"AWS::AutoScaling::AutoScalingGroup:GroupPendingInstances","name":"GroupPendingInstances","defaultStat":"Average"},{"id":"AWS::AutoScaling::AutoScalingGroup:GroupInServiceInstances","name":"GroupInServiceInstances","defaultStat":"Average"},{"id":"AWS::AutoScaling::AutoScalingGroup:GroupStandbyInstances","name":"GroupStandbyInstances","defaultStat":"Average"}]}],"dashboards":[{"id":"AutoScaling:CrossService","name":"AutoScaling","dependencies":[{"namespace":"AWS/AutoScaling"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupDesiredCapacity"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupInServiceInstances"}]}]}]},{"id":"AutoScaling:ResourceHealth","name":"AutoScaling","dependencies":[{"namespace":"AWS/AutoScaling"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupInServiceInstances"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupDesiredCapacity"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupPendingInstances"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupStandbyInstances"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupTerminatingInstances"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupMinSize"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupMaxSize"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupTotalInstances"}]}]}]},{"id":"AutoScaling","name":"AutoScaling","dependencies":[{"namespace":"AWS/AutoScaling"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::AutoScaling.autoScalingGroups"],"tables":[{"resourceType":"AWS::AutoScaling::AutoScalingGroup","columns":["AutoScalingGroupName","LaunchConfigurationName","Instances","DesiredCapacity","MinSize","MaxSize","AvailabilityZones","DefaultCooldown","HealthCheckGracePeriod"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupInServiceInstances"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupDesiredCapacity"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupPendingInstances"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupStandbyInstances"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupTerminatingInstances"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupMinSize"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupMaxSize"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::AutoScaling::AutoScalingGroup:GroupTotalInstances"}]}]}]}]},{"id":"AWS::Billing","dashboard":"Billing","resourceTypes":[{"type":"CW::Billing::Service","keyMetric":"CW::Billing::Service:EstimatedCharges","dashboard":"Billing"}],"metricTemplates":[{"resourceType":"CW::Billing::Service","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"USD"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing::Service:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:Service:AUD","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"AUD"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing:Service:AUD:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:Service:CHF","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"CHF"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing:Service:CHF:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:Service:DKK","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"DKK"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing:Service:DKK:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:Service:EUR","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"EUR"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing:Service:EUR:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:Service:GBP","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"GBP"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing:Service:GBP:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:Service:HKD","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"HKD"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing:Service:HKD:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:Service:JPY","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"JPY"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing:Service:JPY:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:Service:NOK","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"NOK"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing:Service:NOK:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:Service:NZD","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"NZD"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing:Service:NZD:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:Service:SEK","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"SEK"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing:Service:SEK:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:Service:ZAR","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"ZAR"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::Billing:Service:ZAR:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:USD","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"USD"}],"metrics":[{"id":"CW::Billing:USD:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:AUD","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"AUD"}],"metrics":[{"id":"CW::Billing:AUD:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:CHF","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"CHF"}],"metrics":[{"id":"CW::Billing:CHF:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:DKK","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"DKK"}],"metrics":[{"id":"CW::Billing:DKK:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:EUR","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"EUR"}],"metrics":[{"id":"CW::Billing:EUR:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:GBP","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"GBP"}],"metrics":[{"id":"CW::Billing:GBP:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:HKD","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"HKD"}],"metrics":[{"id":"CW::Billing:HKD:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:JPY","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"JPY"}],"metrics":[{"id":"CW::Billing:JPY:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:NOK","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"NOK"}],"metrics":[{"id":"CW::Billing:NOK:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:NZD","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"NZD"}],"metrics":[{"id":"CW::Billing:NZD:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:SEK","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"SEK"}],"metrics":[{"id":"CW::Billing:SEK:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]},{"resourceType":"CW::Billing::Service","id":"CW::Billing:ZAR","namespace":"AWS/Billing","defaultPeriod":21600,"dimensions":[{"dimensionName":"Currency","dimensionValue":"ZAR"}],"metrics":[{"id":"CW::Billing:ZAR:EstimatedCharges","name":"EstimatedCharges","defaultStat":"Maximum","defaultPeriod":21600}]}],"dashboards":[{"id":"Billing","name":"Billing","dependencies":[{"namespace":"AWS/Billing"}],"rows":[{"widgets":[{"type":"chart","width":24,"metrics":[],"properties":{"yAxis":{"left":{"showUnits":false,"label":"USD"}},"metrics":[["AWS/Billing","EstimatedCharges","Currency","USD",{"stat":"Maximum","period":21600}]]}}]},{"widgets":[{"type":"multi-chart","width":6,"properties":{"yAxis":{"left":{"showUnits":false,"label":"USD"}}},"source":"CW::Billing::Service:EstimatedCharges"}]}]}]},{"id":"AWS::Budgeting","dashboard":"Budgeting","crossServiceDashboard":"Budgeting:CrossService","resourceTypes":[{"type":"AWS::Budgeting::Budget","keyMetric":"AWS::Budgeting::Budget:CostBudgetPercentageUsed","dashboard":"Budgeting"}],"controls":{"AWS::Budgeting.budgets":{"type":"resource","resourceType":"AWS::Budgeting::Budget","labelField":"BudgetId","valueField":"BudgetId"}},"metricTemplates":[{"resourceType":"AWS::Budgeting::Budget","namespace":"AWS/Budgeting","dimensions":[{"dimensionName":"BudgetId","labelName":"BudgetId"},{"dimensionName":"Type","labelName":"Type"}],"metrics":[{"id":"AWS::Budgeting::Budget:CostBudgetPercentageUsed","name":"CostBudgetPercentageUsed","defaultStat":"Average"}]}],"dashboards":[{"id":"Budgeting:CrossService","name":"Budgeting","dependencies":[{"namespace":"AWS/Budgeting"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Budgeting::Budget:CostBudgetPercentageUsed"}]}]}]},{"id":"Budgeting","name":"Budgeting","dependencies":[{"namespace":"AWS/Budgeting"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Budgeting.budgets"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Budgeting::Budget:CostBudgetPercentageUsed"}]}]}]}]},{"id":"AWS::EC2::CapacityReservation","dashboard":"EC2CapacityReservations","crossServiceDashboard":"EC2CapacityReservations:CrossService","resourceTypes":[{"type":"AWS::EC2::CapacityReservation","keyMetric":"AWS::EC2::CapacityReservation:InstanceUtilization","dashboard":"EC2CapacityReservations","arnRegex":".*:capacity-reservation/(.*)"}],"metricTemplates":[{"resourceType":"AWS::EC2::CapacityReservation","namespace":"AWS/EC2CapacityReservations","dimensions":[{"dimensionName":"CapacityReservationId","labelName":"CapacityReservationId"}],"metrics":[{"id":"AWS::EC2::CapacityReservation:InstanceUtilization","name":"InstanceUtilization","defaultStat":"Average"},{"id":"AWS::EC2::CapacityReservation:UsedInstanceCount","name":"UsedInstanceCount","defaultStat":"Average"},{"id":"AWS::EC2::CapacityReservation:AvailableInstanceCount","name":"AvailableInstanceCount","defaultStat":"Average"},{"id":"AWS::EC2::CapacityReservation:TotalInstanceCount","name":"TotalInstanceCount","defaultStat":"Average"}]}],"dashboards":[{"id":"EC2CapacityReservations:CrossService","name":"EC2 Capacity Reservations","dependencies":[{"namespace":"AWS/EC2CapacityReservations"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::CapacityReservation:InstanceUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::CapacityReservation:UsedInstanceCount"}]}]}]},{"id":"EC2CapacityReservations","name":"EC2 Capacity Reservations","dependencies":[{"namespace":"AWS/EC2CapacityReservations"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::CapacityReservation:InstanceUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::CapacityReservation:UsedInstanceCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::CapacityReservation:AvailableInstanceCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::CapacityReservation:TotalInstanceCount"}]}]}]}]},{"id":"AWS::CloudFront","dashboard":"CloudFront","crossServiceDashboard":"CloudFront:CrossService","resourceTypes":[{"type":"AWS::CloudFront::Distribution","keyMetric":"AWS::CloudFront::Distribution:Requests","dashboard":"CloudFront","arnRegex":".*:distribution/(.*)"}],"controls":{"AWS::CloudFront.distributions":{"type":"resource","resourceType":"AWS::CloudFront::Distribution","labelField":"DistributionId","valueField":"DistributionId"}},"metricTemplates":[{"resourceType":"AWS::CloudFront::Distribution","namespace":"AWS/CloudFront","dimensions":[{"dimensionName":"DistributionId","labelName":"DistributionId"},{"dimensionName":"Region","dimensionValue":"Global"}],"metrics":[{"id":"AWS::CloudFront::Distribution:Requests","name":"Requests","defaultStat":"Sum"},{"id":"AWS::CloudFront::Distribution:TotalErrorRate","name":"TotalErrorRate","defaultStat":"Average"},{"id":"AWS::CloudFront::Distribution:BytesDownloaded","name":"BytesDownloaded","defaultStat":"Sum"},{"id":"AWS::CloudFront::Distribution:BytesUploaded","name":"BytesUploaded","defaultStat":"Sum"},{"id":"AWS::CloudFront::Distribution:4xxErrorRate","name":"4xxErrorRate","defaultStat":"Average"},{"id":"AWS::CloudFront::Distribution:5xxErrorRate","name":"5xxErrorRate","defaultStat":"Average"}]}],"dashboards":[{"id":"CloudFront:CrossService","name":"CloudFront","dependencies":[{"namespace":"AWS/CloudFront"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudFront::Distribution:Requests"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudFront::Distribution:TotalErrorRate"}]}]}]},{"id":"CloudFront","name":"CloudFront","dependencies":[{"namespace":"AWS/CloudFront"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::CloudFront.distributions"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudFront::Distribution:Requests"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudFront::Distribution:TotalErrorRate"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudFront::Distribution:BytesDownloaded"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudFront::Distribution:BytesUploaded"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudFront::Distribution:4xxErrorRate"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudFront::Distribution:5xxErrorRate"}]}]}]}]},{"id":"AWS::CloudHSM","dashboard":"CloudHSM","crossServiceDashboard":"CloudHSM:CrossService","resourceTypes":[{"type":"AWS::CloudHSM::Cluster","keyMetric":"AWS::CloudHSM::Cluster:CpuActivePercent","dashboard":"CloudHSM"}],"controls":{"AWS::CloudHSM.clusters":{"type":"resource","resourceType":"AWS::CloudHSM::Cluster","labelField":"ClusterId","valueField":"ClusterId"}},"metricTemplates":[{"resourceType":"AWS::CloudHSM::Cluster","namespace":"AWS/CloudHSM","dimensions":[{"dimensionName":"ClusterId","labelName":"ClusterId"},{"dimensionName":"HsmId","labelName":"HsmId"}],"metrics":[{"id":"AWS::CloudHSM::Cluster:CpuActivePercent","name":"CpuActivePercent","defaultStat":"Average"},{"id":"AWS::CloudHSM::Cluster:HsmKeysSessionOccupied","name":"HsmKeysSessionOccupied","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:HsmKeysTokenOccupied","name":"HsmKeysTokenOccupied","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:HsmMemoryPrivateFree","name":"HsmMemoryPrivateFree","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:HsmMemoryPublicFree","name":"HsmMemoryPublicFree","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:HsmSessionCount","name":"HsmSessionCount","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:HsmTemperature","name":"HsmTemperature","defaultStat":"Average"},{"id":"AWS::CloudHSM::Cluster:HsmUnhealthy","name":"HsmUnhealthy","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:HsmUsersAvailable","name":"HsmUsersAvailable","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:HsmUsersMax","name":"HsmUsersMax","defaultStat":"Maximum"},{"id":"AWS::CloudHSM::Cluster:InterfaceEth2DroppedInput","name":"InterfaceEth2DroppedInput","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:InterfaceEth2DroppedOutput","name":"InterfaceEth2DroppedOutput","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:InterfaceEth2ErrorsOutput","name":"InterfaceEth2ErrorsOutput","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:InterfaceEth2OctetsInput","name":"InterfaceEth2OctetsInput","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:InterfaceEth2OctetsOutput","name":"InterfaceEth2OctetsOutput","defaultStat":"Sum"},{"id":"AWS::CloudHSM::Cluster:InterfaceEth2PacketsInput","name":"InterfaceEth2PacketsInput","defaultStat":"Sum"}]}],"dashboards":[{"id":"CloudHSM:CrossService","name":"CloudHSM","dependencies":[{"namespace":"AWS/CloudHSM"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:CpuActivePercent"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:HsmKeysSessionOccupied"}]}]}]},{"id":"CloudHSM","name":"CloudHSM","dependencies":[{"namespace":"AWS/CloudHSM"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::CloudHSM.clusters"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:CpuActivePercent"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:HsmKeysSessionOccupied"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:HsmKeysTokenOccupied"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:HsmMemoryPrivateFree"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:HsmMemoryPublicFree"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:HsmSessionCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:HsmTemperature"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:HsmUnhealthy"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:HsmUsersAvailable"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:HsmUsersMax"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:InterfaceEth2DroppedInput"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:InterfaceEth2DroppedOutput"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:InterfaceEth2ErrorsOutput"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:InterfaceEth2OctetsInput"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:InterfaceEth2OctetsOutput"}]}]},{"widgets":[{"type":"chart","width":8,"metrics":[{"metricTemplate":"AWS::CloudHSM::Cluster:InterfaceEth2PacketsInput"}]}]}]}]},{"id":"AWS::CloudSearch","dashboard":"CloudSearch","crossServiceDashboard":"CloudSearch:CrossService","resourceTypes":[{"type":"AWS::CloudSearch::Client","keyMetric":"AWS::CloudSearch::Client:SuccessfulRequests","dashboard":"CloudSearch"}],"controls":{"AWS::CloudSearch.clients":{"type":"resource","resourceType":"AWS::CloudSearch::Client","labelField":"ClientId","valueField":"ClientId"}},"metricTemplates":[{"resourceType":"AWS::CloudSearch::Client","namespace":"AWS/CloudSearch","dimensions":[{"dimensionName":"ClientId","labelName":"ClientId"},{"dimensionName":"DomainName","labelName":"DomainName"}],"metrics":[{"id":"AWS::CloudSearch::Client:SuccessfulRequests","name":"SuccessfulRequests","defaultStat":"Sum"},{"id":"AWS::CloudSearch::Client:IndexUtilization","name":"IndexUtilization","defaultStat":"Average"},{"id":"AWS::CloudSearch::Client:SearchableDocuments","name":"SearchableDocuments","defaultStat":"Maximum"},{"id":"AWS::CloudSearch::Client:Partitions","name":"Partitions","defaultStat":"Maximum"}]}],"dashboards":[{"id":"CloudSearch:CrossService","name":"CloudSearch","dependencies":[{"namespace":"AWS/CloudSearch"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudSearch::Client:SuccessfulRequests"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudSearch::Client:IndexUtilization"}]}]}]},{"id":"CloudSearch","name":"CloudSearch","dependencies":[{"namespace":"AWS/CloudSearch"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::CloudSearch.clients"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudSearch::Client:SuccessfulRequests"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudSearch::Client:IndexUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudSearch::Client:SearchableDocuments"}]}]},{"widgets":[{"type":"chart","width":8,"metrics":[{"metricTemplate":"AWS::CloudSearch::Client:Partitions"}]}]}]}]},{"id":"AWS::CodeBuild","dashboard":"CodeBuild","crossServiceDashboard":"CodeBuild:CrossService","resourceTypes":[{"type":"AWS::CodeBuild::Project","keyMetric":"AWS::CodeBuild::Project:SucceededBuilds","dashboard":"CodeBuild","arnRegex":".*:project/(.*)"}],"controls":{"AWS::CodeBuild.projects":{"type":"resource","resourceType":"AWS::CodeBuild::Project","labelField":"ProjectName","valueField":"ProjectName"}},"metricTemplates":[{"resourceType":"AWS::CodeBuild::Project","namespace":"AWS/CodeBuild","dimensions":[{"dimensionName":"ProjectName","labelName":"ProjectName"}],"metrics":[{"id":"AWS::CodeBuild::Project:SucceededBuilds","name":"SucceededBuilds","defaultStat":"Sum"},{"id":"AWS::CodeBuild::Project:FailedBuilds","name":"FailedBuilds","defaultStat":"Sum"},{"id":"AWS::CodeBuild::Project:Builds","name":"Builds","defaultStat":"Sum"},{"id":"AWS::CodeBuild::Project:Duration","name":"Duration","defaultStat":"Average"}]}],"dashboards":[{"id":"CodeBuild:CrossService","name":"CodeBuild","dependencies":[{"namespace":"AWS/CodeBuild"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CodeBuild::Project:SucceededBuilds"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CodeBuild::Project:FailedBuilds"}]}]}]},{"id":"CodeBuild","name":"CodeBuild","dependencies":[{"namespace":"AWS/CodeBuild"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::CodeBuild.projects"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CodeBuild::Project:SucceededBuilds"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CodeBuild::Project:FailedBuilds"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CodeBuild::Project:Builds"}]}]},{"widgets":[{"type":"chart","width":8,"metrics":[{"metricTemplate":"AWS::CodeBuild::Project:Duration"}]}]}]}]},{"id":"AWS::Cognito","dashboard":"Cognito","crossServiceDashboard":"Cognito:CrossService","resourceTypes":[{"type":"AWS::Cognito::UserPool","keyMetric":"AWS::Cognito::UserPool:Risk","dashboard":"Cognito","arnRegex":".*:userpool/(.*)"}],"controls":{"AWS::Cognito.userPools":{"type":"resource","resourceType":"AWS::Cognito::UserPool","labelField":"UserPoolId","valueField":"UserPoolId"}},"metricTemplates":[{"resourceType":"AWS::Cognito::UserPool","namespace":"AWS/Cognito","dimensions":[{"dimensionName":"Operation","labelName":"Operation"},{"dimensionName":"UserPoolId","labelName":"UserPoolId"}],"metrics":[{"id":"AWS::Cognito::UserPool:NoRisk","name":"NoRisk","defaultStat":"Sum"},{"id":"AWS::Cognito::UserPool:Risk","name":"Risk","defaultStat":"Sum"}]}],"dashboards":[{"id":"Cognito:CrossService","name":"Cognito","dependencies":[{"namespace":"AWS/Cognito"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Cognito::UserPool:NoRisk"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Cognito::UserPool:Risk"}]}]}]},{"id":"Cognito","name":"Cognito","dependencies":[{"namespace":"AWS/Cognito"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Cognito::UserPool:NoRisk"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Cognito::UserPool:Risk"}]}]}]}]},{"id":"CrossService","dashboard":"CrossService","resourceTypes":[],"controls":{},"metricTemplates":[],"dashboards":[{"id":"CrossService","name":"CrossService","dependencies":[],"controls":["Shared::Group.ResourceGroup"],"rows":[]}]},{"id":"AWS::Datasync","dashboard":"DataSync","crossServiceDashboard":"DataSync:CrossService","resourceTypes":[{"type":"AWS::Datasync::Agent","keyMetric":"AWS::Datasync::Agent:FilesTransferred","dashboard":"DataSync","arnRegex":".*:agent/(.*)"},{"type":"AWS::Datasync::Task","keyMetric":"AWS::Datasync::Task:FilesTransferred","dashboard":"DataSync","arnRegex":".*:task/(.*)"}],"metricTemplates":[{"resourceType":"AWS::Datasync::Agent","namespace":"AWS/DataSync","dimensions":[{"dimensionName":"AgentId","labelName":"AgentId"}],"metrics":[{"id":"AWS::Datasync::Agent:FilesTransferred","name":"FilesTransferred","defaultStat":"Sum"},{"id":"AWS::Datasync::Agent:BytesTransferred","name":"BytesTransferred","defaultStat":"Sum"},{"id":"AWS::Datasync::Agent:BytesPreparedDestination","name":"BytesPreparedDestination","defaultStat":"Sum"},{"id":"AWS::Datasync::Agent:BytesPreparedSource","name":"BytesPreparedSource","defaultStat":"Sum"},{"id":"AWS::Datasync::Agent:BytesVerifiedDestination","name":"BytesVerifiedDestination","defaultStat":"Sum"},{"id":"AWS::Datasync::Agent:BytesVerifiedSource","name":"BytesVerifiedSource","defaultStat":"Sum"},{"id":"AWS::Datasync::Agent:BytesWritten","name":"BytesWritten","defaultStat":"Sum"},{"id":"AWS::Datasync::Agent:FilesPreparedDestination","name":"FilesPreparedDestination","defaultStat":"Sum"},{"id":"AWS::Datasync::Agent:FilesPreparedSource","name":"FilesPreparedSource","defaultStat":"Sum"},{"id":"AWS::Datasync::Agent:FilesVerifiedDestination","name":"FilesVerifiedDestination","defaultStat":"Sum"},{"id":"AWS::Datasync::Agent:FilesVerifiedSource","name":"FilesVerifiedSource","defaultStat":"Sum"}]},{"resourceType":"AWS::Datasync::Task","namespace":"AWS/DataSync","dimensions":[{"dimensionName":"TaskId","labelName":"TaskId"}],"metrics":[{"id":"AWS::Datasync::Task:FilesTransferred","name":"FilesTransferred","defaultStat":"Sum"},{"id":"AWS::Datasync::Task:BytesTransferred","name":"BytesTransferred","defaultStat":"Sum"},{"id":"AWS::Datasync::Task:BytesPreparedDestination","name":"BytesPreparedDestination","defaultStat":"Sum"},{"id":"AWS::Datasync::Task:BytesPreparedSource","name":"BytesPreparedSource","defaultStat":"Sum"},{"id":"AWS::Datasync::Task:BytesVerifiedDestination","name":"BytesVerifiedDestination","defaultStat":"Sum"},{"id":"AWS::Datasync::Task:BytesVerifiedSource","name":"BytesVerifiedSource","defaultStat":"Sum"},{"id":"AWS::Datasync::Task:BytesWritten","name":"BytesWritten","defaultStat":"Sum"},{"id":"AWS::Datasync::Task:FilesPreparedDestination","name":"FilesPreparedDestination","defaultStat":"Sum"},{"id":"AWS::Datasync::Task:FilesPreparedSource","name":"FilesPreparedSource","defaultStat":"Sum"},{"id":"AWS::Datasync::Task:FilesVerifiedDestination","name":"FilesVerifiedDestination","defaultStat":"Sum"},{"id":"AWS::Datasync::Task:FilesVerifiedSource","name":"FilesVerifiedSource","defaultStat":"Sum"}]}],"dashboards":[{"id":"DataSync:CrossService","name":"DataSync","dependencies":[{"namespace":"AWS/DataSync"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:FilesTransferred"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:BytesTransferred"}]}]}]},{"id":"DataSync","name":"DataSync","dependencies":[{"namespace":"AWS/DataSync"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:FilesTransferred"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:BytesTransferred"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:BytesPreparedDestination"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:BytesPreparedSource"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:BytesVerifiedDestination"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:BytesVerifiedSource"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:BytesWritten"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:FilesPreparedDestination"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:FilesPreparedSource"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:FilesVerifiedDestination"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Agent:FilesVerifiedSource"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Task:FilesTransferred"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Task:BytesTransferred"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Task:BytesPreparedDestination"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Task:BytesPreparedSource"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Task:BytesVerifiedDestination"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Task:BytesVerifiedSource"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Task:BytesWritten"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Task:FilesPreparedDestination"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Task:FilesPreparedSource"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Task:FilesVerifiedDestination"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Datasync::Task:FilesVerifiedSource"}]}]}]}]},{"id":"AWS::DAX::Cluster","dashboard":"DAX","crossServiceDashboard":"DAX:CrossService","resourceTypes":[{"type":"AWS::DAX::Cluster","keyMetric":"AWS::DAX::Cluster:CPUUtilization","dashboard":"DAX","arnRegex":".*:cache/(.*)"}],"metricTemplates":[{"resourceType":"AWS::DAX::Cluster","namespace":"AWS/DAX","dimensions":[],"metrics":[{"id":"AWS::DAX::Cluster:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::DAX::Cluster:FailedRequestCount","name":"FailedRequestCount","defaultStat":"Sum"},{"id":"AWS::DAX::Cluster:BatchGetItemRequestCount","name":"BatchGetItemRequestCount","defaultStat":"Sum"},{"id":"AWS::DAX::Cluster:ErrorRequestCount","name":"ErrorRequestCount","defaultStat":"Sum"},{"id":"AWS::DAX::Cluster:EstimatedDbSize","name":"EstimatedDbSize","defaultStat":"Average"},{"id":"AWS::DAX::Cluster:EvictedSize","name":"EvictedSize","defaultStat":"Average"},{"id":"AWS::DAX::Cluster:FaultRequestCount","name":"FaultRequestCount","defaultStat":"Sum"},{"id":"AWS::DAX::Cluster:GetItemRequestCount","name":"GetItemRequestCount","defaultStat":"Sum"},{"id":"AWS::DAX::Cluster:ItemCacheHits","name":"ItemCacheHits","defaultStat":"Sum"},{"id":"AWS::DAX::Cluster:ItemCacheMisses","name":"ItemCacheMisses","defaultStat":"Sum"},{"id":"AWS::DAX::Cluster:QueryCacheHits","name":"QueryCacheHits","defaultStat":"Sum"},{"id":"AWS::DAX::Cluster:QueryRequestCount","name":"QueryRequestCount","defaultStat":"Sum"},{"id":"AWS::DAX::Cluster:ScanCacheHits","name":"ScanCacheHits","defaultStat":"Sum"},{"id":"AWS::DAX::Cluster:TotalRequestCount","name":"TotalRequestCount","defaultStat":"Sum"}]}],"dashboards":[{"id":"DAX:CrossService","name":"DynamoDB Accelerator (DAX)","dependencies":[{"namespace":"AWS/DAX"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:ItemCacheHits"}]}]}]},{"id":"DAX","name":"DynamoDB Accelerator (DAX)","dependencies":[{"namespace":"AWS/DAX"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:FailedRequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:BatchGetItemRequestCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:ErrorRequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:EstimatedDbSize"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:EvictedSize"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:FaultRequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:GetItemRequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:ItemCacheHits"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:ItemCacheMisses"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:QueryCacheHits"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:QueryRequestCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:ScanCacheHits"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DAX::Cluster:TotalRequestCount"}]}]}]}]},{"id":"AWS::DDoSProtection","dashboard":"DDoSProtection","crossServiceDashboard":"DDoSProtection:CrossService","resourceTypes":[{"type":"AWS::DDoSProtection::AttackVector","keyMetric":"AWS::DDoSProtection::AttackVector:DDoSAttackRequestsPerSecond","dashboard":"DDoSProtection"}],"controls":{"AWS::DDoSProtection.attackVectors":{"type":"resource","resourceType":"AWS::DDoSProtection::AttackVector","labelField":"AttackVector","valueField":"AttackVector"}},"metricTemplates":[{"resourceType":"AWS::DDoSProtection::AttackVector","namespace":"AWS/DDoSProtection","dimensions":[{"dimensionName":"AttackVector","labelName":"AttackVector"},{"dimensionName":"ResourceArn","labelName":"ResourceArn"}],"metrics":[{"id":"AWS::DDoSProtection::AttackVector:DDoSAttackRequestsPerSecond","name":"DDoSAttackRequestsPerSecond","defaultStat":"Average"},{"id":"AWS::DDoSProtection::AttackVector:DDoSAttackBitsPerSecond","name":"DDoSAttackBitsPerSecond","defaultStat":"Average"},{"id":"AWS::DDoSProtection::AttackVector:DDoSAttackPacketsPerSecond","name":"DDoSAttackPacketsPerSecond","defaultStat":"Average"}]}],"dashboards":[{"id":"DDoSProtection:CrossService","name":"DDoS Protection","dependencies":[{"namespace":"AWS/DDoSProtection"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DDoSProtection::AttackVector:DDoSAttackRequestsPerSecond"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DDoSProtection::AttackVector:DDoSAttackBitsPerSecond"}]}]}]},{"id":"DDoSProtection","name":"DDoS Protection","dependencies":[{"namespace":"AWS/DDoSProtection"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::DDoSProtection.attackVectors"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DDoSProtection::AttackVector:DDoSAttackRequestsPerSecond"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DDoSProtection::AttackVector:DDoSAttackBitsPerSecond"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DDoSProtection::AttackVector:DDoSAttackPacketsPerSecond"}]}]}]}]},{"id":"AWS::DMS::ReplicationInstance","dashboard":"DMS","crossServiceDashboard":"DMS:CrossService","resourceTypes":[{"type":"AWS::DMS::ReplicationInstance","keyMetric":"AWS::DMS::ReplicationInstance:CDCLatencyTarget","dashboard":"DMS","arnRegex":".*:rep:(.*)"}],"metricTemplates":[{"resourceType":"AWS::DMS::ReplicationInstance","namespace":"AWS/DMS","dimensions":[{"dimensionName":"ReplicationInstanceIdentifier","labelName":"ReplicationInstanceIdentifier"}],"metrics":[{"id":"AWS::DMS::ReplicationInstance:CDCLatencyTarget","name":"CDCLatencyTarget","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:CDCLatencySource","name":"CDCLatencySource","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:AvailableMemory","name":"AvailableMemory","defaultStat":"Average"},{"id":"AWS::DMS::ReplicationInstance:CDCChangesDiskTarget","name":"CDCChangesDiskTarget","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:CDCChangesMemorySource","name":"CDCChangesMemorySource","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:CDCChangesMemoryTarget","name":"CDCChangesMemoryTarget","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:CDCIncomingChanges","name":"CDCIncomingChanges","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:CDCThroughputBandwidthSource","name":"CDCThroughputBandwidthSource","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:CDCThroughputBandwidthTarget","name":"CDCThroughputBandwidthTarget","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:CDCThroughputRowsSource","name":"CDCThroughputRowsSource","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:CDCThroughputRowsTarget","name":"CDCThroughputRowsTarget","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:CPUAllocated","name":"CPUAllocated","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::DMS::ReplicationInstance:FreeMemory","name":"FreeMemory","defaultStat":"Average"},{"id":"AWS::DMS::ReplicationInstance:FullLoadThroughputBandwidthSource","name":"FullLoadThroughputBandwidthSource","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:FullLoadThroughputBandwidthTarget","name":"FullLoadThroughputBandwidthTarget","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:FullLoadThroughputRowsSource","name":"FullLoadThroughputRowsSource","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:FullLoadThroughputRowsTarget","name":"FullLoadThroughputRowsTarget","defaultStat":"Sum"},{"id":"AWS::DMS::ReplicationInstance:MemoryAllocated","name":"MemoryAllocated","defaultStat":"Average"},{"id":"AWS::DMS::ReplicationInstance:MemoryUsage","name":"MemoryUsage","defaultStat":"Average"},{"id":"AWS::DMS::ReplicationInstance:SwapUsage","name":"SwapUsage","defaultStat":"Average"}]}],"dashboards":[{"id":"DMS:CrossService","name":"Database Migration Service","dependencies":[{"namespace":"AWS/DMS"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCLatencyTarget"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCLatencySource"}]}]}]},{"id":"DMS","name":"Database Migration Service","dependencies":[{"namespace":"AWS/DMS"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCLatencyTarget"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCLatencySource"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:AvailableMemory"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCChangesDiskTarget"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCChangesMemorySource"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCChangesMemoryTarget"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCIncomingChanges"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCThroughputBandwidthSource"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCThroughputBandwidthTarget"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCThroughputRowsSource"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CDCThroughputRowsTarget"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CPUAllocated"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:FreeMemory"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:FullLoadThroughputBandwidthSource"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:FullLoadThroughputBandwidthTarget"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:FullLoadThroughputRowsSource"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:FullLoadThroughputRowsTarget"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:MemoryAllocated"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:MemoryUsage"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DMS::ReplicationInstance:SwapUsage"}]}]}]}]},{"id":"AWS::DocDB","dashboard":"DocDB","crossServiceDashboard":"DocDB:CrossService","resourceTypes":[{"type":"AWS::DocDB::DBInstance","keyMetric":"AWS::DocDB::DBInstance:CPUUtilization","dashboard":"DocDB"}],"controls":{"AWS::DocDB.dBInstances":{"type":"resource","resourceType":"AWS::DocDB::DBInstance","labelField":"DBInstanceIdentifier","valueField":"DBInstanceIdentifier"}},"metricTemplates":[{"resourceType":"AWS::DocDB::DBInstance","namespace":"AWS/DocDB","dimensions":[{"dimensionName":"DBInstanceIdentifier","labelName":"DBInstanceIdentifier"}],"metrics":[{"id":"AWS::DocDB::DBInstance:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::DocDB::DBInstance:DatabaseConnections","name":"DatabaseConnections","defaultStat":"Average"},{"id":"AWS::DocDB::DBInstance:EngineUptime","name":"EngineUptime","defaultStat":"Average"},{"id":"AWS::DocDB::DBInstance:ReadThroughput","name":"ReadThroughput","defaultStat":"Sum"},{"id":"AWS::DocDB::DBInstance:WriteThroughput","name":"WriteThroughput","defaultStat":"Sum"}]}],"dashboards":[{"id":"DocDB:CrossService","name":"DocumentDB","dependencies":[{"namespace":"AWS/DocDB"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DocDB::DBInstance:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DocDB::DBInstance:DatabaseConnections"}]}]}]},{"id":"DocDB","name":"DocumentDB","dependencies":[{"namespace":"AWS/DocDB"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::DocDB.dBInstances"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DocDB::DBInstance:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DocDB::DBInstance:DatabaseConnections"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DocDB::DBInstance:EngineUptime"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DocDB::DBInstance:ReadThroughput"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DocDB::DBInstance:WriteThroughput"}]}]}]}]},{"id":"AWS::DX","dashboard":"DX","crossServiceDashboard":"DX:CrossService","resourceTypes":[{"type":"AWS::DX::Connection","keyMetric":"AWS::DX::Connection:ConnectionBpsIngress","dashboard":"DX"}],"controls":{"AWS::DX.connections":{"type":"resource","resourceType":"AWS::DX::Connection","labelField":"ConnectionId","valueField":"ConnectionId"}},"metricTemplates":[{"resourceType":"AWS::DX::Connection","namespace":"AWS/DX","dimensions":[{"dimensionName":"ConnectionId","labelName":"ConnectionId"}],"metrics":[{"id":"AWS::DX::Connection:ConnectionBpsIngress","name":"ConnectionBpsIngress","defaultStat":"Average"},{"id":"AWS::DX::Connection:ConnectionCRCErrorCount","name":"ConnectionCRCErrorCount","defaultStat":"Sum"},{"id":"AWS::DX::Connection:ConnectionState","name":"ConnectionState","defaultStat":"Average"},{"id":"AWS::DX::Connection:ConnectionBpsEgress","name":"ConnectionBpsEgress","defaultStat":"Average"},{"id":"AWS::DX::Connection:ConnectionPpsEgress","name":"ConnectionPpsEgress","defaultStat":"Average"},{"id":"AWS::DX::Connection:ConnectionPpsIngress","name":"ConnectionPpsIngress","defaultStat":"Average"},{"id":"AWS::DX::Connection:ConnectionLightLevelTx","name":"ConnectionLightLevelTx","defaultStat":"Average"},{"id":"AWS::DX::Connection:ConnectionLightLevelRx","name":"ConnectionLightLevelRx","defaultStat":"Average"}]}],"dashboards":[{"id":"DX:CrossService","name":"Direct Connect","dependencies":[{"namespace":"AWS/DX"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DX::Connection:ConnectionBpsIngress"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DX::Connection:ConnectionCRCErrorCount"}]}]}]},{"id":"DX","name":"Direct Connect","dependencies":[{"namespace":"AWS/DX"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::DX.connections"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DX::Connection:ConnectionBpsIngress"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DX::Connection:ConnectionCRCErrorCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DX::Connection:ConnectionState"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DX::Connection:ConnectionBpsEgress"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DX::Connection:ConnectionPpsEgress"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DX::Connection:ConnectionPpsIngress"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DX::Connection:ConnectionLightLevelTx"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DX::Connection:ConnectionLightLevelRx"}]}]}]}]},{"id":"AWS::DynamoDB","dashboard":"DynamoDB","crossServiceDashboard":"DynamoDB:CrossService","resourceTypes":[{"type":"AWS::DynamoDB::Table","arnRegex":".*:table/(.*)","keyMetric":"AWS::DynamoDB::Table:ProvisionedReadCapacityUnits","dashboard":"DynamoDB","describe":"dynamo-db-describe-tables","consoleLink":"/dynamodb/home?region={region}#tables:selected={TableName}","isResourceNode":true}],"controls":{"AWS::DynamoDB.tables":{"type":"resource","resourceType":"AWS::DynamoDB::Table","labelField":"TableName","valueField":"TableName"}},"metricTemplates":[{"resourceType":"AWS::DynamoDB::Table","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"}],"metrics":[{"id":"AWS::DynamoDB::Table:ConditionalCheckFailedRequests","name":"ConditionalCheckFailedRequests","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:ConsumedReadCapacityUnits","name":"ConsumedReadCapacityUnits","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:ConsumedWriteCapacityUnits","name":"ConsumedWriteCapacityUnits","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:ProvisionedReadCapacityUnits","name":"ProvisionedReadCapacityUnits","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:ProvisionedWriteCapacityUnits","name":"ProvisionedWriteCapacityUnits","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:ReadThrottleEvents","name":"ReadThrottleEvents","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:TimeToLiveDeletedItemCount","name":"TimeToLiveDeletedItemCount","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:TransactionConflict","name":"TransactionConflict","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:WriteThrottleEvents","name":"WriteThrottleEvents","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:GetItem","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"GetItem"}],"metrics":[{"id":"AWS::DynamoDB::Table:GetItem:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:GetItem:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:GetItem:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:PutItem","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"PutItem"}],"metrics":[{"id":"AWS::DynamoDB::Table:PutItem:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:PutItem:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:PutItem:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:GetRecords","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"GetRecords"}],"metrics":[{"id":"AWS::DynamoDB::Table:GetRecords:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:GetRecords:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:GetRecords:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Scan","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"Scan"}],"metrics":[{"id":"AWS::DynamoDB::Table:Scan:ReturnedItemCount","name":"ReturnedItemCount","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Scan:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Scan:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Scan:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Operation:BatchExecuteStatement","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"BatchExecuteStatement"}],"metrics":[{"id":"AWS::DynamoDB::Table:Operation:BatchExecuteStatement:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:BatchExecuteStatement:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:BatchExecuteStatement:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Operation:BatchGetItem","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"BatchGetItem"}],"metrics":[{"id":"AWS::DynamoDB::Table:Operation:BatchGetItem:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:BatchGetItem:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:BatchGetItem:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Operation:BatchWriteItem","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"BatchWriteItem"}],"metrics":[{"id":"AWS::DynamoDB::Table:Operation:BatchWriteItem:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:BatchWriteItem:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:BatchWriteItem:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Operation:DeleteItem","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"DeleteItem"}],"metrics":[{"id":"AWS::DynamoDB::Table:Operation:DeleteItem:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:DeleteItem:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:DeleteItem:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Operation:ExecuteStatement","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"ExecuteStatement"}],"metrics":[{"id":"AWS::DynamoDB::Table:Operation:ExecuteStatement:ReturnedItemCount","name":"ReturnedItemCount","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:ExecuteStatement:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:ExecuteStatement:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:ExecuteStatement:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Operation:ExecuteTransaction","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"ExecuteTransaction"}],"metrics":[{"id":"AWS::DynamoDB::Table:Operation:ExecuteTransaction:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:ExecuteTransaction:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:ExecuteTransaction:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:ExecuteTransaction:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Operation:Query","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"Query"}],"metrics":[{"id":"AWS::DynamoDB::Table:Operation:Query:ReturnedItemCount","name":"ReturnedItemCount","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:Query:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:Query:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:Query:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Operation:TransactGetItems","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"TransactGetItems"}],"metrics":[{"id":"AWS::DynamoDB::Table:Operation:TransactGetItems:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:TransactGetItems:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:TransactGetItems:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Operation:TransactWriteItems","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"TransactWriteItems"}],"metrics":[{"id":"AWS::DynamoDB::Table:Operation:TransactWriteItems:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:TransactWriteItems:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:TransactWriteItems:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Operation:UpdateItem","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"Operation","dimensionValue":"UpdateItem"}],"metrics":[{"id":"AWS::DynamoDB::Table:Operation:UpdateItem:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:UpdateItem:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:UpdateItem:ThrottledRequests","name":"ThrottledRequests","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:Operation:GlobalSecondaryIndexName","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"GlobalSecondaryIndexName","dimensionValue":"GlobalSecondaryIndexName"}],"metrics":[{"id":"AWS::DynamoDB::Table:Operation:GlobalSecondaryIndexName:ConsumedReadCapacityUnits","name":"ConsumedReadCapacityUnits","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:GlobalSecondaryIndexName:ConsumedWriteCapacityUnits","name":"ConsumedWriteCapacityUnits","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:GlobalSecondaryIndexName:OnlineIndexConsumedWriteCapacity","name":"OnlineIndexConsumedWriteCapacity","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:GlobalSecondaryIndexName:OnlineIndexPercentageProgress","name":"OnlineIndexPercentageProgress","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:GlobalSecondaryIndexName:OnlineIndexThrottleEvents","name":"OnlineIndexThrottleEvents","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:GlobalSecondaryIndexName:ProvisionedReadCapacityUnits","name":"ProvisionedReadCapacityUnits","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:GlobalSecondaryIndexName:ProvisionedWriteCapacityUnits","name":"ProvisionedWriteCapacityUnits","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:Operation:GlobalSecondaryIndexName:ReadThrottleEvents","name":"ReadThrottleEvents","defaultStat":"Sum"},{"id":"AWS::DynamoDB::Table:Operation:GlobalSecondaryIndexName:WriteThrottleEvents","name":"WriteThrottleEvents","defaultStat":"Sum"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:DelegatedOperation","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"DelegatedOperation","labelName":"DelegatedOperation"}],"metrics":[{"id":"AWS::DynamoDB::Table:DelegatedOperation:AgeOfOldestUnreplicatedRecord","name":"AgeOfOldestUnreplicatedRecord","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:DelegatedOperation:ConsumedChangeDataCaptureUnits","name":"ConsumedChangeDataCaptureUnits","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:DelegatedOperation:ThrottledPutRecordCount","name":"ThrottledPutRecordCount","defaultStat":"Average"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:ReceivingRegion","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"ReceivingRegion","labelName":"ReceivingRegion"}],"metrics":[{"id":"AWS::DynamoDB::Table:ReceivingRegion:PendingReplicationCount","name":"PendingReplicationCount","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:ReceivingRegion:ReplicationLatency","name":"ReplicationLatency","defaultStat":"Average"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::Table:StreamLabel:Operation","namespace":"AWS/DynamoDB","dimensions":[{"dimensionName":"TableName","labelName":"TableName"},{"dimensionName":"StreamLabel","labelName":"StreamLabel"},{"dimensionName":"Operation","labelName":"GetRecords"}],"metrics":[{"id":"AWS::DynamoDB::Table:StreamLabel:Operation:ReturnedBytes","name":"ReturnedBytes","defaultStat":"Average"},{"id":"AWS::DynamoDB::Table:StreamLabel:Operation:ReturnedRecordsCount","name":"ReturnedRecordsCount","defaultStat":"Average"}]},{"resourceType":"AWS::DynamoDB::Table","id":"AWS::DynamoDB::AcrossAccount","namespace":"AWS/DynamoDB","dimensions":[],"metrics":[{"id":"AWS::DynamoDB::AcrossAccount:AccountMaxReads","name":"AccountMaxReads","defaultStat":"Maximum"},{"id":"AWS::DynamoDB::AcrossAccount:AccountMaxTableLevelReads","name":"AccountMaxTableLevelReads","defaultStat":"Maximum"},{"id":"AWS::DynamoDB::AcrossAccount:AccountMaxTableLevelWrites","name":"AccountMaxTableLevelWrites","defaultStat":"Maximum"},{"id":"AWS::DynamoDB::AcrossAccount:AccountMaxWrites","name":"AccountMaxWrites","defaultStat":"Maximum"},{"id":"AWS::DynamoDB::AcrossAccount:AccountProvisionedReadCapacityUtilization","name":"AccountProvisionedReadCapacityUtilization","defaultStat":"Average"},{"id":"AWS::DynamoDB::AcrossAccount:AccountProvisionedWriteCapacityUtilization","name":"AccountProvisionedWriteCapacityUtilization","defaultStat":"Average"},{"id":"AWS::DynamoDB::AcrossAccount:MaxProvisionedTableReadCapacityUtilization","name":"MaxProvisionedTableReadCapacityUtilization","defaultStat":"Average"},{"id":"AWS::DynamoDB::AcrossAccount:MaxProvisionedTableWriteCapacityUtilization","name":"MaxProvisionedTableWriteCapacityUtilization","defaultStat":"Average"},{"id":"AWS::DynamoDB::AcrossAccount:UserErrors","name":"UserErrors","defaultStat":"Sum"}]}],"dashboards":[{"id":"DynamoDB:CrossService","name":"DynamoDB","dependencies":[{"namespace":"AWS/DynamoDB"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::AcrossAccount:UserErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::Table:ReadThrottleEvents"}]}]}]},{"id":"DynamoDB","name":"DynamoDB","dependencies":[{"namespace":"AWS/DynamoDB"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::DynamoDB.tables"],"tables":[{"resourceType":"AWS::DynamoDB::Table","columns":["TableName","TableStatus","TableSizeBytes","ItemCount","ReadCapacityUnits","WriteCapacityUnits"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::Table:GetItem:SuccessfulRequestLatency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::Table:PutItem:SuccessfulRequestLatency"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::Table:GetItem:ThrottledRequests"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::AcrossAccount:UserErrors"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::Table:ConsumedReadCapacityUnits"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::Table:ProvisionedReadCapacityUnits"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::Table:ConsumedWriteCapacityUnits"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::Table:ProvisionedWriteCapacityUnits"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::Table:StreamLabel:Operation:ReturnedBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DynamoDB::Table:Scan:ReturnedItemCount"}]}]}]}]},{"id":"AWS::EBS","dashboard":"EBS","crossServiceDashboard":"EBS:CrossService","resourceTypes":[{"type":"AWS::EC2::Volume","keyMetric":"AWS::EC2::Volume:VolumeReadBytes","dashboard":"EBS","arnRegex":".*:volume/(.*)","consoleLink":"/ec2/v2/home?region={region}#Volumes:volumeId={VolumeId}","describe":"ebs-describe-volumes"}],"controls":{"AWS::EBS.volumes":{"type":"resource","resourceType":"AWS::EC2::Volume","labelField":"VolumeId","valueField":"VolumeId"}},"metricTemplates":[{"resourceType":"AWS::EC2::Volume","namespace":"AWS/EBS","dimensions":[{"dimensionName":"VolumeId","labelName":"VolumeId"}],"metrics":[{"id":"AWS::EC2::Volume:VolumeReadBytes","name":"VolumeReadBytes","defaultStat":"Sum"},{"id":"AWS::EC2::Volume:VolumeWriteBytes","name":"VolumeWriteBytes","defaultStat":"Sum"},{"id":"AWS::EC2::Volume:VolumeReadOps","name":"VolumeReadOps","defaultStat":"Sum"},{"id":"AWS::EC2::Volume:VolumeTotalReadTime","name":"VolumeTotalReadTime","defaultStat":"Average"},{"id":"AWS::EC2::Volume:VolumeWriteOps","name":"VolumeWriteOps","defaultStat":"Sum"},{"id":"AWS::EC2::Volume:VolumeTotalWriteTime","name":"VolumeTotalWriteTime","defaultStat":"Average"},{"id":"AWS::EC2::Volume:VolumeIdleTime","name":"VolumeIdleTime","defaultStat":"Average"},{"id":"AWS::EC2::Volume:VolumeQueueLength","name":"VolumeQueueLength","defaultStat":"Average"},{"id":"AWS::EC2::Volume:BurstBalance","name":"BurstBalance","defaultStat":"Average"}]}],"dashboards":[{"id":"EBS:CrossService","name":"Elastic Block Store (EBS)","dependencies":[{"namespace":"AWS/EBS"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeReadBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeWriteBytes"}]}]}]},{"id":"EBS:ResourceHealth","name":"Elastic Block Store (EBS)","dependencies":[{"namespace":"AWS/EBS"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeReadBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeReadOps"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeTotalReadTime"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeWriteBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeWriteOps"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeTotalWriteTime"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeIdleTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeQueueLength"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:BurstBalance"}]}]}]},{"id":"EBS","name":"Elastic Block Store (EBS)","dependencies":[{"namespace":"AWS/EBS"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::EBS.volumes"],"tables":[{"resourceType":"AWS::EC2::Volume","columns":["VolumeId","Name","Size","VolumeType","SnapshotId","CreateTime","AvailabilityZone","State","Attachments","Encrypted"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeReadBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeReadOps"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeTotalReadTime"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeWriteBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeWriteOps"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeTotalWriteTime"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeIdleTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:VolumeQueueLength"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Volume:BurstBalance"}]}]}]}]},{"id":"AWS::EC2","dashboard":"EC2","crossServiceDashboard":"EC2:CrossService","resourceTypes":[{"type":"AWS::EC2::Instance","keyMetric":"AWS::EC2::Instance:CPUUtilization","list":"ec2-describe-instances","dashboard":"EC2:Instance","arnRegex":".*:instance/(.*)","consoleLink":"/ec2/home?region={region}#Instances:search={InstanceId};sort=instanceId","describe":"ec2-describe-instances"}],"controls":{"AWS::EC2.instances":{"type":"resource","resourceType":"AWS::EC2::Instance","labelField":"InstanceId","valueField":"InstanceId"}},"metricTemplates":[{"resourceType":"AWS::EC2::Instance","namespace":"AWS/EC2","dimensions":[{"dimensionName":"InstanceId","labelName":"InstanceId"}],"metrics":[{"id":"AWS::EC2::Instance:CPUCreditUsage","name":"CPUCreditUsage","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CPUCreditBalance","name":"CPUCreditBalance","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CPUSurplusCreditBalance","name":"CPUSurplusCreditBalance","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CPUSurplusCreditsCharged","name":"CPUSurplusCreditsCharged","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::EC2::Instance:DiskReadBytes","name":"DiskReadBytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:DiskReadOps","name":"DiskReadOps","defaultStat":"Average"},{"id":"AWS::EC2::Instance:DiskWriteBytes","name":"DiskWriteBytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:DiskWriteOps","name":"DiskWriteOps","defaultStat":"Average"},{"id":"AWS::EC2::Instance:MetadataNoToken","name":"MetadataNoToken","defaultStat":"Sum"},{"id":"AWS::EC2::Instance:NetworkIn","name":"NetworkIn","defaultStat":"Average"},{"id":"AWS::EC2::Instance:NetworkOut","name":"NetworkOut","defaultStat":"Average"},{"id":"AWS::EC2::Instance:NetworkPacketsIn","name":"NetworkPacketsIn","defaultStat":"Average"},{"id":"AWS::EC2::Instance:NetworkPacketsOut","name":"NetworkPacketsOut","defaultStat":"Average"},{"id":"AWS::EC2::Instance:StatusCheckFailed","name":"StatusCheckFailed","defaultStat":"Sum"},{"id":"AWS::EC2::Instance:StatusCheckFailed_Instance","name":"StatusCheckFailed_Instance","defaultStat":"Sum"},{"id":"AWS::EC2::Instance:StatusCheckFailed_System","name":"StatusCheckFailed_System","defaultStat":"Sum"}]},{"resourceType":"AWS::EC2::Instance","id":"AWS::EC2::Instance:AcrossAllInstances","namespace":"AWS/EC2","dimensions":[],"metrics":[{"id":"AWS::EC2::Instance:AcrossAllInstances:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AcrossAllInstances:DiskReadBytes","name":"DiskReadBytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AcrossAllInstances:DiskReadOps","name":"DiskReadOps","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AcrossAllInstances:DiskWriteBytes","name":"DiskWriteBytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AcrossAllInstances:DiskWriteOps","name":"DiskWriteOps","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AcrossAllInstances:MetadataNoToken","name":"MetadataNoToken","defaultStat":"Sum"},{"id":"AWS::EC2::Instance:AcrossAllInstances:NetworkIn","name":"NetworkIn","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AcrossAllInstances:NetworkOut","name":"NetworkOut","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AcrossAllInstances:NetworkPacketsIn","name":"NetworkPacketsIn","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AcrossAllInstances:NetworkPacketsOut","name":"NetworkPacketsOut","defaultStat":"Average"}]},{"resourceType":"AWS::EC2::Instance","id":"AWS::EC2::Instance:AutoScalingGroupName","namespace":"AWS/EC2","dimensions":[{"dimensionName":"AutoScalingGroupName","labelName":"AutoScalingGroupName"}],"metrics":[{"id":"AWS::EC2::Instance:AutoScalingGroupName:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AutoScalingGroupName:DiskReadBytes","name":"DiskReadBytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AutoScalingGroupName:DiskReadOps","name":"DiskReadOps","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AutoScalingGroupName:DiskWriteBytes","name":"DiskWriteBytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AutoScalingGroupName:DiskWriteOps","name":"DiskWriteOps","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AutoScalingGroupName:NetworkIn","name":"NetworkIn","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AutoScalingGroupName:NetworkOut","name":"NetworkOut","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AutoScalingGroupName:NetworkPacketsIn","name":"NetworkPacketsIn","defaultStat":"Average"},{"id":"AWS::EC2::Instance:AutoScalingGroupName:NetworkPacketsOut","name":"NetworkPacketsOut","defaultStat":"Average"}]},{"resourceType":"AWS::EC2::Instance","id":"AWS::EC2::Instance:ImageId","namespace":"AWS/EC2","dimensions":[{"dimensionName":"ImageId","labelName":"ImageId"}],"metrics":[{"id":"AWS::EC2::Instance:ImageId:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::EC2::Instance:ImageId:DiskReadBytes","name":"DiskReadBytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:ImageId:DiskReadOps","name":"DiskReadOps","defaultStat":"Average"},{"id":"AWS::EC2::Instance:ImageId:DiskWriteBytes","name":"DiskWriteBytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:ImageId:DiskWriteOps","name":"DiskWriteOps","defaultStat":"Average"},{"id":"AWS::EC2::Instance:ImageId:NetworkIn","name":"NetworkIn","defaultStat":"Average"},{"id":"AWS::EC2::Instance:ImageId:NetworkOut","name":"NetworkOut","defaultStat":"Average"}]},{"resourceType":"AWS::EC2::Instance","id":"AWS::EC2::Instance:InstanceType","namespace":"AWS/EC2","dimensions":[{"dimensionName":"InstanceType","labelName":"InstanceType"}],"metrics":[{"id":"AWS::EC2::Instance:InstanceType:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::EC2::Instance:InstanceType:DiskReadBytes","name":"DiskReadBytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:InstanceType:DiskReadOps","name":"DiskReadOps","defaultStat":"Average"},{"id":"AWS::EC2::Instance:InstanceType:DiskWriteBytes","name":"DiskWriteBytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:InstanceType:DiskWriteOps","name":"DiskWriteOps","defaultStat":"Average"},{"id":"AWS::EC2::Instance:InstanceType:NetworkIn","name":"NetworkIn","defaultStat":"Average"},{"id":"AWS::EC2::Instance:InstanceType:NetworkOut","name":"NetworkOut","defaultStat":"Average"}]},{"resourceType":"AWS::EC2::Instance","id":"AWS::EC2::Instance:CWAgent","namespace":"CWAgent","dimensions":[{"dimensionName":"InstanceId","labelName":"InstanceId"}],"metrics":[{"id":"AWS::EC2::Instance:CWAgent:cpu_usage_idle","name":"cpu_usage_idle","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:cpu_usage_iowait","name":"cpu_usage_iowait","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:cpu_usage_steal","name":"cpu_usage_steal","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:cpu_usage_system","name":"cpu_usage_system","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:cpu_usage_user","name":"cpu_usage_user","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:disk_inodes_free","name":"disk_inodes_free","defaultStat":"Sum"},{"id":"AWS::EC2::Instance:CWAgent:disk_inodes_total","name":"disk_inodes_total","defaultStat":"Sum"},{"id":"AWS::EC2::Instance:CWAgent:disk_inodes_used","name":"disk_inodes_used","defaultStat":"Sum"},{"id":"AWS::EC2::Instance:CWAgent:disk_used_percent","name":"disk_used_percent","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:diskio_io_time","name":"diskio_io_time","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:diskio_read_bytes","name":"diskio_read_bytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:diskio_reads","name":"diskio_reads","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:diskio_write_bytes","name":"diskio_write_bytes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:diskio_writes","name":"diskio_writes","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:mem_cached","name":"mem_cached","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:mem_total","name":"mem_total","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:mem_used","name":"mem_used","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:mem_used_percent","name":"mem_used_percent","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:netstat_tcp_established","name":"netstat_tcp_established","defaultStat":"Sum"},{"id":"AWS::EC2::Instance:CWAgent:netstat_tcp_time_wait","name":"netstat_tcp_time_wait","defaultStat":"Sum"},{"id":"AWS::EC2::Instance:CWAgent:swap_used_percent","name":"swap_used_percent","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:TCPv4 Connections Established","name":"TCPv4 Connections Established","defaultStat":"Sum"},{"id":"AWS::EC2::Instance:CWAgent:TCPv6 Connections Established","name":"TCPv6 Connections Established","defaultStat":"Sum"},{"id":"AWS::EC2::Instance:CWAgent:Memory % Committed Bytes In Use","name":"Memory % Committed Bytes In Use","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:Processor % Idle Time","name":"Processor % Idle Time","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:Processor % Interrupt Time","name":"Processor % Interrupt Time","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:Processor % User Time","name":"Processor % User Time","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:LogicalDisk % Free Space","name":"LogicalDisk % Free Space","defaultStat":"Average"},{"id":"AWS::EC2::Instance:CWAgent:Paging File % Usage","name":"Paging File % Usage","defaultStat":"Average"}]}],"dashboards":[{"id":"EC2:CrossService","name":"EC2","dependencies":[{"namespace":"AWS/EC2"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:StatusCheckFailed"}]}]}]},{"id":"EC2:Instance","name":"EC2 Instance","dependencies":[{"namespace":"AWS/EC2"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::EC2.instances"],"rows":[{"widgets":[{"type":"chart","width":4,"properties":{"view":"singleValue"},"metrics":[{"metricTemplate":"AWS::EC2::Instance:CPUUtilization"}]},{"type":"chart","width":10,"metrics":[{"metricTemplate":"AWS::EC2::Instance:CPUUtilization"}]},{"type":"chart","width":10,"metrics":[{"metricTemplate":"AWS::EC2::Instance:StatusCheckFailed"},{"metricOptions":{"yAxis":"right"},"metricTemplate":"AWS::EC2::Instance:StatusCheckFailed_Instance"},{"metricOptions":{"yAxis":"right"},"metricTemplate":"AWS::EC2::Instance:StatusCheckFailed_System"}]}]}]},{"id":"EC2:ResourceHealth","name":"EC2 Instance","dependencies":[{"namespace":"AWS/EC2"}],"rows":[{"widgets":[{"type":"chart","properties":{"yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricTemplate":"AWS::EC2::Instance:CPUUtilization"}]},{"type":"chart","properties":{"title":"Memory Utilization: Average","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricExpression":"AVG(SEARCH(\'InstanceId=\\"{InstanceId}\\" AND (MetricName=\\"mem_used_percent\\" OR \\"Memory % Committed Bytes In Use\\")\', \'Average\', 300))","resourceType":"AWS::EC2::Instance","metricOptions":{"id":"expr1","label":"MemoryUtilization"}}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:DiskReadBytes"},{"metricTemplate":"AWS::EC2::Instance:DiskWriteBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:NetworkIn"},{"metricTemplate":"AWS::EC2::Instance:NetworkOut"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:StatusCheckFailed"}]}]}]},{"id":"EC2","name":"EC2","dependencies":[{"namespace":"AWS/EC2"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::EC2.instances"],"tables":[{"resourceType":"AWS::EC2::Instance","columns":["InstanceId","Name","InstanceType","Monitoring","State","AvailabilityZone"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:DiskReadBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:DiskReadOps"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:DiskWriteBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:DiskWriteOps"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:NetworkIn"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:NetworkOut"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:NetworkPacketsIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:NetworkPacketsOut"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:StatusCheckFailed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:StatusCheckFailed_Instance"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::Instance:StatusCheckFailed_System"}]}]}]}]},{"id":"AWS::EC2Spot","dashboard":"EC2Spot","crossServiceDashboard":"EC2Spot:CrossService","resourceTypes":[{"type":"AWS::EC2Spot::FleetRequest","keyMetric":"AWS::EC2Spot::FleetRequest:PendingCapacity","dashboard":"EC2Spot"}],"controls":{"AWS::EC2Spot.fleetRequests":{"type":"resource","resourceType":"AWS::EC2Spot::FleetRequest","labelField":"FleetRequestId","valueField":"FleetRequestId"}},"metricTemplates":[{"resourceType":"AWS::EC2Spot::FleetRequest","namespace":"AWS/EC2Spot","dimensions":[{"dimensionName":"FleetRequestId","labelName":"FleetRequestId"}],"metrics":[{"id":"AWS::EC2Spot::FleetRequest:PendingCapacity","name":"PendingCapacity","defaultStat":"Average"},{"id":"AWS::EC2Spot::FleetRequest:MaxPercentCapacityAllocation","name":"MaxPercentCapacityAllocation","defaultStat":"Average"},{"id":"AWS::EC2Spot::FleetRequest:AvailableInstancePoolsCount","name":"AvailableInstancePoolsCount","defaultStat":"Average"},{"id":"AWS::EC2Spot::FleetRequest:BidsSubmittedForCapacity","name":"BidsSubmittedForCapacity","defaultStat":"Average"},{"id":"AWS::EC2Spot::FleetRequest:EligibleInstancePoolCount","name":"EligibleInstancePoolCount","defaultStat":"Average"},{"id":"AWS::EC2Spot::FleetRequest:FulfilledCapacity","name":"FulfilledCapacity","defaultStat":"Average"},{"id":"AWS::EC2Spot::FleetRequest:PercentCapacityAllocation","name":"PercentCapacityAllocation","defaultStat":"Average"},{"id":"AWS::EC2Spot::FleetRequest:TargetCapacity","name":"TargetCapacity","defaultStat":"Average"},{"id":"AWS::EC2Spot::FleetRequest:TerminatingCapacity","name":"TerminatingCapacity","defaultStat":"Average"}]}],"dashboards":[{"id":"EC2Spot:CrossService","name":"EC2 Spot","dependencies":[{"namespace":"AWS/EC2Spot"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2Spot::FleetRequest:PendingCapacity"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2Spot::FleetRequest:MaxPercentCapacityAllocation"}]}]}]},{"id":"EC2Spot","name":"EC2 Spot","dependencies":[{"namespace":"AWS/EC2Spot"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::EC2Spot.fleetRequests"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2Spot::FleetRequest:PendingCapacity"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2Spot::FleetRequest:MaxPercentCapacityAllocation"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2Spot::FleetRequest:AvailableInstancePoolsCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2Spot::FleetRequest:BidsSubmittedForCapacity"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2Spot::FleetRequest:EligibleInstancePoolCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2Spot::FleetRequest:FulfilledCapacity"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2Spot::FleetRequest:PercentCapacityAllocation"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2Spot::FleetRequest:TargetCapacity"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2Spot::FleetRequest:TerminatingCapacity"}]}]}]}]},{"id":"AWS::ECS","dashboard":"ECS","resourceTypes":[{"type":"AWS::ECS::Cluster","keyMetric":"AWS::ECS::Cluster:CPUUtilization","dashboard":"ECS","arnRegex":".*:cluster/(.*)","describe":"ecs-describe-clusters","consoleLink":"/ecs/home?region={region}#/clusters/{ClusterName}/services"},{"type":"AWS::ECS::Service","keyMetric":"AWS::ECS::Service:CPUUtilization","arnRegex":".*:service/(.*)","dashboard":"ECS"}],"controls":{"AWS::ECS.clusters":{"type":"resource","resourceType":"AWS::ECS::Cluster","labelField":"ClusterName","valueField":"ClusterName"}},"metricTemplates":[{"resourceType":"AWS::ECS::Service","namespace":"AWS/ECS","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"AWS::ECS::Service:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::ECS::Service:MemoryUtilization","name":"MemoryUtilization","defaultStat":"Average"}]},{"resourceType":"AWS::ECS::Cluster","namespace":"AWS/ECS","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"}],"metrics":[{"id":"AWS::ECS::Cluster:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::ECS::Cluster:MemoryUtilization","name":"MemoryUtilization","defaultStat":"Average"},{"id":"AWS::ECS::Cluster:CPUReservation","name":"CPUReservation","defaultStat":"Average"},{"id":"AWS::ECS::Cluster:MemoryReservation","name":"MemoryReservation","defaultStat":"Average"},{"id":"AWS::ECS::Cluster:GPUReservation","name":"GPUReservation","defaultStat":"Average"}]}],"dashboards":[{"id":"ECS","name":"Elastic Container Service","dependencies":[{"namespace":"AWS/ECS"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::ECS.clusters"],"tables":[{"resourceType":"AWS::ECS::Cluster","columns":["ClusterName","Status","RegisteredInstancesCount","RunningTasksCount","PendingTasksCount","ActiveServicesCount"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ECS::Service:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ECS::Service:MemoryUtilization"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ECS::Cluster:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ECS::Cluster:MemoryUtilization"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ECS::Cluster:CPUReservation"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ECS::Cluster:MemoryReservation"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ECS::Cluster:GPUReservation"}]}]}]}]},{"id":"CW::ECS","dashboard":"ECS:Cluster","resourceTypes":[{"type":"CW::ECS::Cluster","keyMetric":"CW::ECS::Cluster:MemoryUtilized","dashboard":"ECS:Cluster","drawerDashboard":"ECS:Cluster:Drawer","alarmPatterns":[{"namespace":"AWS/ECS","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"ServiceName","labelName":""}]},{"namespace":"ECS/ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"ServiceName","labelName":""},{"dimensionName":"TaskDefinitionFamily","labelName":""}]}]},{"type":"CW::ECS::ServiceName","keyMetric":"CW::ECS::ServiceName:MemoryUtilized","dashboard":"ECS:Service","drawerDashboard":"ECS:Service:Drawer","foreignKeys":[{"resourceType":"CW::ECS::Cluster","fields":["ClusterName"]}],"alarmPatterns":[{"namespace":"AWS/ECS","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"ServiceName","labelName":"ServiceName"}]},{"namespace":"ECS/ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"ServiceName","labelName":"ServiceName"}]}]},{"type":"CW::ECS::Task","keyMetric":"CW::ECS::Task:MemoryUtilized","dashboard":"ECS:Task","drawerDashboard":"ECS:Task:Drawer","foreignKeys":[{"resourceType":"CW::ECS::Cluster","fields":["ClusterName"]}],"alarmPatterns":[{"namespace":"ECS/ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"TaskDefinitionFamily","labelName":"TaskDefinitionFamily"}]}]},{"type":"CW::ECS::Instance","keyMetric":"CW::ECS::Instance:instance_memory_utilization","dashboard":"ECS:Instance","foreignKeys":[{"resourceType":"CW::ECS::Cluster","fields":["ClusterName"]}]}],"controls":{"CW::ECS.cluster":{"type":"resource","resourceType":"CW::ECS::Cluster","labelField":"ClusterName","valueField":"ClusterName"}},"metricTemplates":[{"resourceType":"CW::ECS::Cluster","namespace":"ECS/ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"}],"metrics":[{"id":"CW::ECS::Cluster:CpuReserved","name":"CpuReserved","defaultStat":"Sum"},{"id":"CW::ECS::Cluster:CpuUtilized","name":"CpuUtilized","defaultStat":"Sum"},{"id":"CW::ECS::Cluster:MemoryReserved","name":"MemoryReserved","defaultStat":"Sum"},{"id":"CW::ECS::Cluster:MemoryUtilized","name":"MemoryUtilized","defaultStat":"Sum"},{"id":"CW::ECS::Cluster:NetworkRxBytes","name":"NetworkRxBytes","defaultStat":"Average"},{"id":"CW::ECS::Cluster:NetworkTxBytes","name":"NetworkTxBytes","defaultStat":"Average"},{"id":"CW::ECS::Cluster:ContainerInstanceCount","name":"ContainerInstanceCount","defaultStat":"Average"},{"id":"CW::ECS::Cluster:TaskCount","name":"TaskCount","defaultStat":"Average"},{"id":"CW::ECS::Cluster:ServiceCount","name":"ServiceCount","defaultStat":"Average"}]},{"resourceType":"CW::ECS::Instance","namespace":"ECS/ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"InstanceId","labelName":"InstanceId"},{"dimensionName":"ContainerInstanceId","labelName":"ContainerInstanceId"}],"metrics":[{"id":"CW::ECS::Instance:instance_cpu_utilization","name":"instance_cpu_utilization","defaultStat":"Average"},{"id":"CW::ECS::Instance:instance_memory_utilization","name":"instance_memory_utilization","defaultStat":"Average"},{"id":"CW::ECS::Instance:instance_network_total_bytes","name":"instance_network_total_bytes","defaultStat":"Average"},{"id":"CW::ECS::Instance:instance_number_of_running_tasks","name":"instance_number_of_running_tasks","defaultStat":"Average"},{"id":"CW::ECS::Instance:instance_cpu_reserved_capacity","name":"instance_cpu_reserved_capacity","defaultStat":"Average"},{"id":"CW::ECS::Instance:instance_memory_reserved_capacity","name":"instance_memory_reserved_capacity","defaultStat":"Average"}]},{"resourceType":"CW::ECS::ServiceName","namespace":"ECS/ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"ServiceName","labelName":"ServiceName"}],"metrics":[{"id":"CW::ECS::ServiceName:-","name":"-","defaultStat":"Average"},{"id":"CW::ECS::ServiceName:CpuReserved","name":"CpuReserved","defaultStat":"Sum"},{"id":"CW::ECS::ServiceName:CpuUtilized","name":"CpuUtilized","defaultStat":"Sum"},{"id":"CW::ECS::ServiceName:MemoryReserved","name":"MemoryReserved","defaultStat":"Sum"},{"id":"CW::ECS::ServiceName:MemoryUtilized","name":"MemoryUtilized","defaultStat":"Sum"},{"id":"CW::ECS::ServiceName:NetworkTxBytes","name":"NetworkTxBytes","defaultStat":"Average"},{"id":"CW::ECS::ServiceName:NetworkRxBytes","name":"NetworkRxBytes","defaultStat":"Average"},{"id":"CW::ECS::ServiceName:DesiredTaskCount","name":"DesiredTaskCount","defaultStat":"Average"},{"id":"CW::ECS::ServiceName:RunningTaskCount","name":"RunningTaskCount","defaultStat":"Average"},{"id":"CW::ECS::ServiceName:PendingTaskCount","name":"PendingTaskCount","defaultStat":"Average"},{"id":"CW::ECS::ServiceName:TaskSetCount","name":"TaskSetCount","defaultStat":"Average"},{"id":"CW::ECS::ServiceName:DeploymentCount","name":"DeploymentCount","defaultStat":"Average"}]},{"resourceType":"CW::ECS::Task","namespace":"ECS/ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"TaskDefinitionFamily","labelName":"TaskDefinitionFamily"}],"metrics":[{"id":"CW::ECS::Task:CpuReserved","name":"CpuReserved","defaultStat":"Sum"},{"id":"CW::ECS::Task:CpuUtilized","name":"CpuUtilized","defaultStat":"Sum"},{"id":"CW::ECS::Task:MemoryReserved","name":"MemoryReserved","defaultStat":"Sum"},{"id":"CW::ECS::Task:MemoryUtilized","name":"MemoryUtilized","defaultStat":"Sum"},{"id":"CW::ECS::Task:NetworkTxBytes","name":"NetworkTxBytes","defaultStat":"Average"},{"id":"CW::ECS::Task:NetworkRxBytes","name":"NetworkRxBytes","defaultStat":"Average"},{"id":"CW::ECS::Task:StorageReadBytes","name":"StorageReadBytes","defaultStat":"Average"},{"id":"CW::ECS::Task:StorageWriteBytes","name":"StorageWriteBytes","defaultStat":"Average"}]}],"dashboards":[{"id":"ECS:Cluster:Drawer","rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"CPU (avg)"},"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::Cluster"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::Cluster:CpuReserved"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::Cluster:CpuUtilized"}]},{"type":"chart","properties":{"title":"MemoryUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"Memory (avg)"},"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::Cluster"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::Cluster:MemoryReserved"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::Cluster:MemoryUtilized"}]},{"type":"chart","properties":{"title":"Network","yAxis":{"left":{"showUnits":false,"label":"Bytes/Second"},"right":{"showUnits":false,"label":"Bytes/Second"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"RX (avg)","yAxis":"left"},"metricExpression":"RATE(mm0)","resourceType":"CW::ECS::Cluster"},{"metricOptions":{"id":"expr2","label":"TX (avg)","yAxis":"right"},"metricExpression":"RATE(mm1)","resourceType":"CW::ECS::Cluster"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::Cluster:NetworkRxBytes"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::Cluster:NetworkTxBytes"}]}]}]},{"id":"ECS:Cluster","name":"ECS Cluster","dependencies":[{"namespace":"ECS/ContainerInsights"}],"controls":["CW::ECS.cluster"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::Cluster"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::Cluster:CpuReserved"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::Cluster:CpuUtilized"}]},{"type":"chart","properties":{"title":"MemoryUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::Cluster"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::Cluster:MemoryReserved"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::Cluster:MemoryUtilized"}]},{"type":"chart","properties":{"title":"Network","yAxis":{"left":{"showUnits":false,"label":"Bytes/Second"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"metricExpression":"RATE(mm0) + RATE(mm1)","resourceType":"CW::ECS::Cluster"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::Cluster:NetworkRxBytes"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::Cluster:NetworkTxBytes"}]}]},{"widgets":[{"type":"chart","properties":{"title":"ContainerInstanceCount"},"metrics":[{"metricTemplate":"CW::ECS::Cluster:ContainerInstanceCount"}]},{"type":"chart","properties":{"title":"TaskCount"},"metrics":[{"metricTemplate":"CW::ECS::Cluster:TaskCount"}]},{"type":"chart","properties":{"title":"ServiceCount"},"metrics":[{"metricTemplate":"CW::ECS::Cluster:ServiceCount"}]}]}]},{"id":"ECS:Instance","name":"ECS Instance","dependencies":[{"namespace":"ECS/ContainerInsights"}],"controls":["CW::ECS.cluster"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization"},"metrics":[{"metricTemplate":"CW::ECS::Instance:instance_cpu_utilization"}]},{"type":"chart","properties":{"title":"MemoryUtilization"},"metrics":[{"metricTemplate":"CW::ECS::Instance:instance_memory_utilization"}]},{"type":"chart","properties":{"title":"Network"},"metrics":[{"metricTemplate":"CW::ECS::Instance:instance_network_total_bytes"}]}]},{"widgets":[{"type":"chart","properties":{"title":"DiskUtilization"},"metrics":[{"metricTemplate":"CW::ECS::Instance:instance_cpu_utilization"}]},{"type":"chart","properties":{"title":"ECS:Instance.NumberOfTasks"},"metrics":[{"metricTemplate":"CW::ECS::Instance:instance_number_of_running_tasks"}]},{"type":"chart","properties":{"title":"ECS:Instance.CPUReservedCapacity"},"metrics":[{"metricTemplate":"CW::ECS::Instance:instance_cpu_reserved_capacity"}]},{"type":"chart","properties":{"title":"ECS:Instance.MemoryReservedCapacity"},"metrics":[{"metricTemplate":"CW::ECS::Instance:instance_memory_reserved_capacity"}]}]}]},{"id":"ECS:Service:Drawer","rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::ServiceName","metricOptions":{"id":"expr1","label":"{ServiceName}"}},{"metricTemplate":"CW::ECS::ServiceName:CpuReserved","metricOptions":{"id":"mm0","visible":false}},{"metricTemplate":"CW::ECS::ServiceName:CpuUtilized","metricOptions":{"id":"mm1","visible":false}}]},{"type":"chart","properties":{"title":"MemoryUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{ServiceName}"},"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::ServiceName"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::ServiceName:MemoryReserved"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::ServiceName:MemoryUtilized"}]},{"type":"chart","properties":{"title":"Network","yAxis":{"left":{"showUnits":false,"label":"Bytes/Second"},"right":{"showUnits":false,"label":"Bytes/Second"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"TX (avg)","yAxis":"right"},"metricExpression":"RATE(mm0)","resourceType":"CW::ECS::ServiceName"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::ServiceName:NetworkTxBytes"},{"metricOptions":{"id":"expr2","label":"RX (avg)","yAxis":"left"},"metricExpression":"RATE(mm1)","resourceType":"CW::ECS::ServiceName"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::ServiceName:NetworkRxBytes"}]}]}]},{"id":"ECS:Service","name":"ECS Service","dependencies":[{"namespace":"ECS/ContainerInsights"}],"controls":["CW::ECS.cluster"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{ServiceName}"},"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::ServiceName"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::ServiceName:CpuReserved"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::ServiceName:CpuUtilized"}]},{"type":"chart","properties":{"title":"MemoryUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{ServiceName}"},"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::ServiceName"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::ServiceName:MemoryReserved"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::ServiceName:MemoryUtilized"}]},{"type":"chart","properties":{"title":"NetworkTX","yAxis":{"left":{"showUnits":false,"label":"Bytes/Second"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{ServiceName}"},"metricExpression":"RATE(mm0)","resourceType":"CW::ECS::ServiceName"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::ServiceName:NetworkTxBytes"}]}]},{"widgets":[{"type":"chart","properties":{"title":"NetworkRX","yAxis":{"left":{"showUnits":false,"label":"Bytes/Second"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{ServiceName}"},"metricExpression":"RATE(mm0)","resourceType":"CW::ECS::ServiceName"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::ServiceName:NetworkRxBytes"}]},{"type":"chart","properties":{"title":"ECS:Services.DesiredTaskCount"},"metrics":[{"metricTemplate":"CW::ECS::ServiceName:DesiredTaskCount"}]},{"type":"chart","properties":{"title":"ECS:Services.RunningTaskCount"},"metrics":[{"metricTemplate":"CW::ECS::ServiceName:RunningTaskCount"}]}]},{"widgets":[{"type":"chart","properties":{"title":"ECS:Services.PendingTaskCount"},"metrics":[{"metricTemplate":"CW::ECS::ServiceName:PendingTaskCount"}]},{"type":"chart","properties":{"title":"ECS:Services.TaskSetCount"},"metrics":[{"metricTemplate":"CW::ECS::ServiceName:TaskSetCount"}]},{"type":"chart","properties":{"title":"ECS:Services.DeploymentCount"},"metrics":[{"metricTemplate":"CW::ECS::ServiceName:DeploymentCount"}]}]}]},{"id":"ECS:Task:Drawer","rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"CPU (avg)"},"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::Task"},{"metricTemplate":"CW::ECS::Task:CpuReserved","metricOptions":{"id":"mm0","visible":false}},{"metricTemplate":"CW::ECS::Task:CpuUtilized","metricOptions":{"id":"mm1","visible":false}}]},{"type":"chart","properties":{"title":"MemoryUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::Task","metricOptions":{"id":"expr1","label":"Memory (avg)"}},{"metricTemplate":"CW::ECS::Task:MemoryReserved","metricOptions":{"id":"mm0","visible":false}},{"metricTemplate":"CW::ECS::Task:MemoryUtilized","metricOptions":{"id":"mm1","visible":false}}]},{"type":"chart","properties":{"title":"Network","yAxis":{"left":{"showUnits":false,"label":"Bytes/Second"},"right":{"showUnits":false,"label":"Bytes/Second"}}},"metrics":[{"metricExpression":"RATE(mm0)","resourceType":"CW::ECS::Task","metricOptions":{"id":"expr1","label":"TX (avg)","yAxis":"right"}},{"metricTemplate":"CW::ECS::Task:NetworkTxBytes","metricOptions":{"id":"mm0","visible":false}},{"metricExpression":"RATE(mm1)","resourceType":"CW::ECS::Task","metricOptions":{"id":"expr2","label":"RX (avg)","yAxis":"left"}},{"metricTemplate":"CW::ECS::Task:NetworkRxBytes","metricOptions":{"id":"mm1","visible":false}}]}]}]},{"id":"ECS:Task","name":"ECS Task","dependencies":[{"namespace":"ECS/ContainerInsights"}],"controls":["CW::ECS.cluster"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{TaskDefinitionFamily}"},"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::Task"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::Task:CpuReserved"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::Task:CpuUtilized"}]},{"type":"chart","properties":{"title":"MemoryUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{TaskDefinitionFamily}"},"metricExpression":"mm1 * 100 / mm0","resourceType":"CW::ECS::Task"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::Task:MemoryReserved"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"CW::ECS::Task:MemoryUtilized"}]},{"type":"chart","properties":{"title":"NetworkTX","yAxis":{"left":{"showUnits":false,"label":"Bytes/Second"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{TaskDefinitionFamily}"},"metricExpression":"RATE(mm0)","resourceType":"CW::ECS::Task"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::Task:NetworkTxBytes"}]}]},{"widgets":[{"type":"chart","properties":{"title":"NetworkRX","yAxis":{"left":{"showUnits":false,"label":"Bytes/Second"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{TaskDefinitionFamily}"},"metricExpression":"RATE(mm0)","resourceType":"CW::ECS::Task"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"CW::ECS::Task:NetworkRxBytes"}]},{"type":"chart","properties":{"title":"ECS:Task.StorageReadBytes"},"metrics":[{"metricTemplate":"CW::ECS::Task:StorageReadBytes"}]},{"type":"chart","properties":{"title":"ECS:Task.StorageWriteBytes"},"metrics":[{"metricTemplate":"CW::ECS::Task:StorageWriteBytes"}]}]}]}]},{"id":"AWS::EFS","dashboard":"EFS","crossServiceDashboard":"EFS:CrossService","resourceTypes":[{"type":"AWS::EFS::FileSystem","consoleLink":"/efs/home?region={region}#/file-systems/{FileSystemId}","keyMetric":"AWS::EFS::FileSystem:PermittedThroughput","dashboard":"EFS","arnRegex":".*:file-system/(.*)","describe":"efs-describe-file-systems"}],"controls":{"AWS::EFS.filesystems":{"type":"resource","resourceType":"AWS::EFS::FileSystem","labelField":"FileSystemId","valueField":"FileSystemId"}},"metricTemplates":[{"resourceType":"AWS::EFS::FileSystem","namespace":"AWS/EFS","dimensions":[{"dimensionName":"FileSystemId","labelName":"FileSystemId"}],"metrics":[{"id":"AWS::EFS::FileSystem:BurstCreditBalance","name":"BurstCreditBalance","defaultStat":"Average"},{"id":"AWS::EFS::FileSystem:ClientConnections","name":"ClientConnections","defaultStat":"Sum"},{"id":"AWS::EFS::FileSystem:DataReadIOBytes","name":"DataReadIOBytes","defaultStat":"Average"},{"id":"AWS::EFS::FileSystem:DataWriteIOBytes","name":"DataWriteIOBytes","defaultStat":"Average"},{"id":"AWS::EFS::FileSystem:MetaDataIOBytes","name":"MetaDataIOBytes","defaultStat":"Average"},{"id":"AWS::EFS::FileSystem:MeteredIOBytes","name":"MeteredIOBytes","defaultStat":"Average"},{"id":"AWS::EFS::FileSystem:PercentIOLimit","name":"PercentIOLimit","defaultStat":"Average"},{"id":"AWS::EFS::FileSystem:PermittedThroughput","name":"PermittedThroughput","defaultStat":"Average"},{"id":"AWS::EFS::FileSystem:TotalIOBytes","name":"TotalIOBytes","defaultStat":"Sum"}]},{"resourceType":"AWS::EFS::FileSystem","id":"AWS::EFS::FileSystem:StorageClass:Total","namespace":"AWS/EFS","dimensions":[{"dimensionName":"FileSystemId","labelName":"FileSystemId"},{"dimensionName":"StorageClass","dimensionValue":"Total"}],"metrics":[{"id":"AWS::EFS::FileSystem:StorageClass:Total:StorageBytes","name":"StorageBytes","defaultStat":"Average"}]}],"dashboards":[{"id":"EFS:CrossService","name":"Elastic File System (EFS)","dependencies":[{"namespace":"AWS/EFS"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EFS::FileSystem:TotalIOBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EFS::FileSystem:PercentIOLimit"}]}]}]},{"id":"EFS","name":"Elastic File System (EFS)","dependencies":[{"namespace":"AWS/EFS"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::EFS.filesystems"],"tables":[{"resourceType":"AWS::EFS::FileSystem","columns":["FileSystemId","Name","SizeInBytes","NumberOfMountTargets","LifeCycleState","PerformanceMode","Encrypted","CreationTime"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EFS::FileSystem:ClientConnections"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EFS::FileSystem:DataReadIOBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EFS::FileSystem:DataWriteIOBytes"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EFS::FileSystem:BurstCreditBalance"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EFS::FileSystem:PercentIOLimit"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EFS::FileSystem:PermittedThroughput"}]}]}]}]},{"id":"CW::EKS","dashboard":"EKS:Cluster","resourceTypes":[{"type":"AWS::EKS::Cluster","keyMetric":"AWS::EKS::Cluster:pod_cpu_utilization","dashboard":"EKS:Cluster","arnRegex":".*:cluster/(.*)","drawerDashboard":"EKS:Cluster:Drawer","alarmPatterns":[{"namespace":"ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"Namespace","labelName":""},{"dimensionName":"Service","labelName":""},{"dimensionName":"PodName","labelName":""},{"dimensionName":"NodeName","labelName":""}]}]},{"type":"CW::EKS::Node","keyMetric":"CW::EKS::Node:node_cpu_utilization","dashboard":"EKS:Node","foreignKeys":[{"resourceType":"AWS::EKS::Cluster","fields":["ClusterName"]}]},{"type":"CW::EKS::Namespace","keyMetric":"CW::EKS::Namespace:pod_cpu_utilization","dashboard":"EKS:Namespace","drawerDashboard":"EKS:Namespace:Drawer","foreignKeys":[{"resourceType":"AWS::EKS::Cluster","fields":["ClusterName"]}],"alarmPatterns":[{"namespace":"ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"Namespace","labelName":"Namespace"},{"dimensionName":"Service","labelName":""},{"dimensionName":"PodName","labelName":""},{"dimensionName":"NodeName","labelName":""}]}]},{"type":"CW::EKS::Service","keyMetric":"CW::EKS::Service:pod_cpu_utilization","dashboard":"EKS:Service","drawerDashboard":"EKS:Service:Drawer","foreignKeys":[{"resourceType":"AWS::EKS::Cluster","fields":["ClusterName"]},{"resourceType":"CW::EKS::Namespace","fields":["Namespace"]}],"alarmPatterns":[{"namespace":"ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"Namespace","labelName":"Namespace"},{"dimensionName":"Service","labelName":"Service"}]},{"namespace":"ContainerInsights/Prometheus","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"Namespace","labelName":"Namespace"},{"dimensionName":"Service","labelName":"Service"}]}]},{"type":"CW::EKS::Pod","keyMetric":"CW::EKS::Pod:pod_cpu_utilization","dashboard":"EKS:Pod","drawerDashboard":"EKS:Pod:Drawer","foreignKeys":[{"resourceType":"AWS::EKS::Cluster","fields":["ClusterName"]},{"resourceType":"CW::EKS::Namespace","fields":["Namespace"]}],"alarmPatterns":[{"namespace":"ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"},{"dimensionName":"Namespace","labelName":"Namespace"},{"dimensionName":"PodName","labelName":"PodName"}]}]},{"type":"CW::EKS::Nginx","keyMetric":"CW::EKS::Nginx:nginx_ingress_controller_requests","dashboard":"EKS:Nginx"},{"type":"CW::EKS::AppMesh","keyMetric":"CW::EKS::AppMesh:envoy_server_memory_allocated","dashboard":"EKS:AppMesh"},{"type":"CW::EKS::JavaJMX","keyMetric":"CW::EKS::JavaJMX:java_lang_operatingsystem_totalphysicalmemorysize","dashboard":"EKS:JavaJMX"}],"controls":{"CW::EKS.service":{"type":"resource","resourceType":"CW::EKS::Service","labelField":"Service","valueField":"Service","resourceDashboard":"EKS:Service","serviceDashboard":"EKS:Service"},"CW::EKS.pod":{"type":"resource","resourceType":"CW::EKS::Pod","labelField":"PodName","valueField":"PodName","resourceDashboard":"EKS:Pod","serviceDashboard":"EKS:Pod"},"CW::EKS.namespace":{"type":"resource","resourceType":"CW::EKS::Namespace","labelField":"Namespace","valueField":"Namespace","resourceDashboard":"EKS:Namespace","serviceDashboard":"EKS:Namespace"},"CW::EKS.cluster":{"type":"resource","resourceType":"AWS::EKS::Cluster","labelField":"ClusterName","valueField":"ClusterName"},"CW::EKS.node":{"type":"resource","resourceType":"CW::EKS::Node","labelField":"NodeName","valueField":"NodeName"}},"metricTemplates":[{"resourceType":"AWS::EKS::Cluster","namespace":"ContainerInsights","dimensions":[{"dimensionName":"ClusterName","labelName":"ClusterName"}],"metrics":[{"id":"AWS::EKS::Cluster:node_cpu_limit","name":"node_cpu_limit","defaultStat":"Sum"},{"id":"AWS::EKS::Cluster:node_cpu_usage_total","name":"node_cpu_usage_total","defaultStat":"Sum"},{"id":"AWS::EKS::Cluster:node_memory_limit","name":"node_memory_limit","defaultStat":"Sum"},{"id":"AWS::EKS::Cluster:node_memory_working_set","name":"node_memory_working_set","defaultStat":"Sum"},{"id":"AWS::EKS::Cluster:pod_network_rx_bytes","name":"pod_network_rx_bytes","defaultStat":"Average"},{"id":"AWS::EKS::Cluster:pod_network_tx_bytes","name":"pod_network_tx_bytes","defaultStat":"Average"},{"id":"AWS::EKS::Cluster:node_network_total_bytes","name":"node_network_total_bytes","defaultStat":"Average"},{"id":"AWS::EKS::Cluster:cluster_failed_node_count","name":"cluster_failed_node_count","defaultStat":"Average"},{"id":"AWS::EKS::Cluster:node_filesystem_utilization","name":"node_filesystem_utilization","defaultStat":"p90"},{"id":"AWS::EKS::Cluster:cluster_node_count","name":"cluster_node_count","defaultStat":"Average"},{"id":"AWS::EKS::Cluster:pod_cpu_utilization","name":"pod_cpu_utilization","defaultStat":"Average"}]},{"resourceType":"CW::EKS::Namespace","namespace":"ContainerInsights","dimensions":[{"dimensionName":"Namespace","labelName":"Namespace"},{"dimensionName":"ClusterName","labelName":"ClusterName"}],"metrics":[{"id":"CW::EKS::Namespace:pod_cpu_utilization","name":"pod_cpu_utilization","defaultStat":"Average"},{"id":"CW::EKS::Namespace:pod_memory_utilization","name":"pod_memory_utilization","defaultStat":"Average"},{"id":"CW::EKS::Namespace:pod_network_tx_bytes","name":"pod_network_tx_bytes","defaultStat":"Average"},{"id":"CW::EKS::Namespace:pod_network_rx_bytes","name":"pod_network_rx_bytes","defaultStat":"Average"},{"id":"CW::EKS::Namespace:pod_cpu_utilization_over_pod_limit","name":"pod_cpu_utilization_over_pod_limit","defaultStat":"Average"},{"id":"CW::EKS::Namespace:pod_memory_utilization_over_pod_limit","name":"pod_memory_utilization_over_pod_limit","defaultStat":"Average"},{"id":"CW::EKS::Namespace:namespace_number_of_running_pods","name":"namespace_number_of_running_pods","defaultStat":"Average"}]},{"resourceType":"CW::EKS::Service","namespace":"ContainerInsights","dimensions":[{"dimensionName":"Service","labelName":"Service"},{"dimensionName":"Namespace","labelName":"Namespace"},{"dimensionName":"ClusterName","labelName":"ClusterName"}],"metrics":[{"id":"CW::EKS::Service:nginx_ingress_controller_requests","name":"nginx_ingress_controller_requests","defaultStat":"Sum"},{"id":"CW::EKS::Service:nginx_ingress_controller_nginx_process_connections","name":"nginx_ingress_controller_nginx_process_connections","defaultStat":"Average"},{"id":"CW::EKS::Service:nginx_ingress_controller_nginx_process_cpu_seconds_total","name":"nginx_ingress_controller_nginx_process_cpu_seconds_total","defaultStat":"Average"},{"id":"CW::EKS::Service:nginx_ingress_controller_nginx_process_resident_memory_bytes","name":"nginx_ingress_controller_nginx_process_resident_memory_bytes","defaultStat":"Average"},{"id":"CW::EKS::Service:pod_cpu_utilization","name":"pod_cpu_utilization","defaultStat":"Average"},{"id":"CW::EKS::Service:pod_memory_utilization","name":"pod_memory_utilization","defaultStat":"Average"},{"id":"CW::EKS::Service:pod_network_tx_bytes","name":"pod_network_tx_bytes","defaultStat":"Average"},{"id":"CW::EKS::Service:pod_network_rx_bytes","name":"pod_network_rx_bytes","defaultStat":"Average"},{"id":"CW::EKS::Service:pod_cpu_utilization_over_pod_limit","name":"pod_cpu_utilization_over_pod_limit","defaultStat":"Average"},{"id":"CW::EKS::Service:pod_memory_utilization_over_pod_limit","name":"pod_memory_utilization_over_pod_limit","defaultStat":"Average"},{"id":"CW::EKS::Service:service_number_of_running_pods","name":"service_number_of_running_pods","defaultStat":"Average"}]},{"resourceType":"CW::EKS::Node","namespace":"ContainerInsights","dimensions":[{"dimensionName":"InstanceId","labelName":"InstanceId"},{"dimensionName":"NodeName","labelName":"NodeName"},{"dimensionName":"ClusterName","labelName":"ClusterName"}],"metrics":[{"id":"CW::EKS::Node:node_cpu_utilization","name":"node_cpu_utilization","defaultStat":"Average"},{"id":"CW::EKS::Node:node_cpu_reserved_capacity","name":"node_cpu_reserved_capacity","defaultStat":"Average"},{"id":"CW::EKS::Node:node_memory_utilization","name":"node_memory_utilization","defaultStat":"Average"},{"id":"CW::EKS::Node:node_memory_reserved_capacity","name":"node_memory_reserved_capacity","defaultStat":"Average"},{"id":"CW::EKS::Node:node_filesystem_utilization","name":"node_filesystem_utilization","defaultStat":"Average"},{"id":"CW::EKS::Node:node_network_total_bytes","name":"node_network_total_bytes","defaultStat":"Average"},{"id":"CW::EKS::Node:node_number_of_running_pods","name":"node_number_of_running_pods","defaultStat":"Average"},{"id":"CW::EKS::Node:node_number_of_running_containers","name":"node_number_of_running_containers","defaultStat":"Average"}]},{"resourceType":"CW::EKS::Pod","namespace":"ContainerInsights","dimensions":[{"dimensionName":"PodName","labelName":"PodName"},{"dimensionName":"Namespace","labelName":"Namespace"},{"dimensionName":"ClusterName","labelName":"ClusterName"}],"metrics":[{"id":"CW::EKS::Pod:pod_cpu_utilization","name":"pod_cpu_utilization","defaultStat":"Average"},{"id":"CW::EKS::Pod:pod_memory_utilization","name":"pod_memory_utilization","defaultStat":"Average"},{"id":"CW::EKS::Pod:pod_network_tx_bytes","name":"pod_network_tx_bytes","defaultStat":"Average"},{"id":"CW::EKS::Pod:pod_network_rx_bytes","name":"pod_network_rx_bytes","defaultStat":"Average"},{"id":"CW::EKS::Pod:pod_cpu_utilization_over_pod_limit","name":"pod_cpu_utilization_over_pod_limit","defaultStat":"Average"},{"id":"CW::EKS::Pod:pod_memory_utilization_over_pod_limit","name":"pod_memory_utilization_over_pod_limit","defaultStat":"Average"},{"id":"CW::EKS::Pod:pod_cpu_reserved_capacity","name":"pod_cpu_reserved_capacity","defaultStat":"Average"},{"id":"CW::EKS::Pod:pod_memory_reserved_capacity","name":"pod_memory_reserved_capacity","defaultStat":"Average"}]},{"resourceType":"CW::EKS::Nginx","namespace":"ContainerInsights/Prometheus","dimensions":[{"dimensionName":"Service","labelName":"Service"},{"dimensionName":"Namespace","labelName":"Namespace"},{"dimensionName":"ClusterName","labelName":"ClusterName"}],"metrics":[{"id":"CW::EKS::Nginx:nginx_ingress_controller_requests","name":"nginx_ingress_controller_requests","defaultStat":"Sum"}]},{"resourceType":"CW::EKS::AppMesh","namespace":"ContainerInsights/Prometheus","dimensions":[{"dimensionName":"Namespace","labelName":"Namespace"},{"dimensionName":"ClusterName","labelName":"ClusterName"}],"metrics":[{"id":"CW::EKS::AppMesh:envoy_server_memory_allocated","name":"envoy_server_memory_allocated","defaultStat":"Sum"}]},{"resourceType":"CW::EKS::JavaJMX","namespace":"ContainerInsights/Prometheus","dimensions":[{"dimensionName":"Namespace","labelName":"Namespace"},{"dimensionName":"ClusterName","labelName":"ClusterName"}],"metrics":[{"id":"CW::EKS::JavaJMX:java_lang_operatingsystem_totalphysicalmemorysize","name":"java_lang_operatingsystem_totalphysicalmemorysize","defaultStat":"Average"}]}],"dashboards":[{"id":"EKS:AppMesh","name":"EKS AppMesh Report","dependencies":[{"namespace":"ContainerInsights"},{"namespace":"ContainerInsights/Prometheus"}],"controls":["CW::EKS.cluster"],"rows":[{"widgets":[{"type":"chart","width":4,"properties":{"title":"EKS:AppMesh.MeshedPods","view":"singleValue"},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName, Namespace} envoy_server_live ClusterName=\\"{ClusterName}\\"\', \'Sum\', 60))"}]},{"type":"chart","width":4,"properties":{"title":"EKS:AppMesh.RPS","view":"singleValue"},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_http_downstream_rq_total\', \'Sum\', 60))/60"}]},{"type":"chart","width":4,"properties":{"title":"EKS:AppMesh.FailuresPerSecond","view":"singleValue"},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"resourceType":false,"metricExpression":"(SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx$ {ClusterName} (envoy_http_conn_manager_prefix=\\"ingress\\" OR envoy_http_conn_manager_prefix=\\"egress\\") envoy_response_code_class=\\"4\\"\', \'Sum\', 60)) + SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx$ {ClusterName} (envoy_http_conn_manager_prefix=\\"ingress\\" OR envoy_http_conn_manager_prefix=\\"egress\\") envoy_response_code_class=\\"5\\"\', \'Sum\', 60)))/60"}]},{"type":"chart","width":6,"properties":{"title":"EKS:AppMesh.EnvoyHeap","view":"singleValue"},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_server_memory_heap_size\', \'Sum\', 60))"}]},{"type":"chart","width":6,"properties":{"title":"EKS:AppMesh.MemoryUsage","view":"singleValue"},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_server_memory_allocated\', \'Sum\', 60))"}]}]},{"widgets":[{"type":"chart","width":4,"properties":{"title":"EKS:AppMesh.AverageUptime","view":"singleValue"},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"resourceType":false,"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_server_uptime\', \'Average\', 60)/3600))"}]},{"type":"chart","width":4,"properties":{"title":"EKS:AppMesh.InboundTraffic","view":"singleValue"},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"resourceType":false,"metricExpression":" SUM(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_cx_rx_bytes_total\', \'Sum\', 60)))/60"}]},{"type":"chart","width":4,"properties":{"title":"EKS:AppMesh.OutboundTraffic","view":"singleValue"},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"resourceType":false,"metricExpression":"SUM(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_cx_tx_bytes_total\', \'Sum\', 60)))/60"}]},{"type":"chart","width":6,"properties":{"title":"EKS:AppMesh.UnhealthyPods","view":"singleValue"},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"resourceType":false,"metricExpression":"SUM(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_membership_total\', \'Sum\', 60))) - SUM(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_membership_healthy\', \'Sum\', 60)))"}]},{"type":"chart","width":6,"properties":{"title":"EKS:AppMesh.ConnectionTimeouts","view":"singleValue"},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"resourceType":false,"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} envoy_cluster_upstream_cx_connect_timeout ClusterName=\\"{ClusterName}\\"\', \'Average\', 60)))"}]}]},{"widgets":[{"type":"chart","properties":{"title":"EKS:AppMesh.InboundOutboundTraffic"},"metrics":[{"metricOptions":{"id":"expr1","label":"InBound (TX) {ClusterName}"},"resourceType":false,"metricExpression":"SUM(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_cx_rx_bytes_total\', \'Sum\', 60)))/60"},{"metricOptions":{"id":"expr2","label":"OutBound (RX) {ClusterName}"},"resourceType":false,"metricExpression":"SUM(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_cx_tx_bytes_total\', \'Sum\', 60)))/60"}]}]},{"widgets":[{"type":"chart","properties":{"title":"EKS:AppMesh.IngressHttpRequestsPerSecond"},"metrics":[{"metricOptions":{"id":"expr1","label":"[avg: ${AVG}] HTTP 1XX {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx ClusterName=\\"{ClusterName}\\" envoy_http_conn_manager_prefix=\\"ingress\\" envoy_response_code_class=\\"1\\"\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr2","label":"[avg: ${AVG}] HTTP 2XX {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx ClusterName=\\"{ClusterName}\\" envoy_http_conn_manager_prefix=\\"ingress\\" envoy_response_code_class=\\"2\\"\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr3","label":"[avg: ${AVG}] HTTP 3XX {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx ClusterName=\\"{ClusterName}\\" envoy_http_conn_manager_prefix=\\"ingress\\" envoy_response_code_class=\\"3\\"\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr4","label":"[avg: ${AVG}] HTTP 4XX {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx ClusterName=\\"{ClusterName}\\" envoy_http_conn_manager_prefix=\\"ingress\\" envoy_response_code_class=\\"4\\"\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr5","label":"[avg: ${AVG}] HTTP 5XX {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx ClusterName=\\"{ClusterName}\\" envoy_http_conn_manager_prefix=\\"ingress\\" envoy_response_code_class=\\"5\\"\', \'Sum\', 60))/60"}]},{"type":"chart","properties":{"title":"EKS:AppMesh.EgressHttpRequestsPerSecond"},"metrics":[{"metricOptions":{"id":"expr1","label":"[avg: ${AVG}] HTTP 1XX {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx ClusterName=\\"{ClusterName}\\" envoy_http_conn_manager_prefix=\\"egress\\" envoy_response_code_class=\\"1\\"\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr2","label":"[avg: ${AVG}] HTTP 2XX {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx ClusterName=\\"{ClusterName}\\" envoy_http_conn_manager_prefix=\\"egress\\" envoy_response_code_class=\\"2\\"\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr3","label":"[avg: ${AVG}] HTTP 3XX {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx ClusterName=\\"{ClusterName}\\" envoy_http_conn_manager_prefix=\\"egress\\" envoy_response_code_class=\\"3\\"\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr4","label":"[avg: ${AVG}] HTTP 4XX {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx ClusterName=\\"{ClusterName}\\" envoy_http_conn_manager_prefix=\\"egress\\" envoy_response_code_class=\\"4\\"\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr5","label":"[avg: ${AVG}] HTTP 5XX {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace,envoy_http_conn_manager_prefix,envoy_response_code_class} envoy_http_downstream_rq_xx ClusterName=\\"{ClusterName}\\" envoy_http_conn_manager_prefix=\\"egress\\" envoy_response_code_class=\\"5\\"\', \'Sum\', 60))/60"}]}]},{"widgets":[{"type":"chart","properties":{"title":"EKS:AppMesh.UpstreamRequestErrorsPerSecond"},"metrics":[{"metricOptions":{"id":"expr1","label":"[min: ${MIN}, max: ${MAX}, avg: ${AVG}, last: ${LAST}] pending failure ejection {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_rq_pending_failure_eject\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr2","label":"[min: ${MIN}, max: ${MAX}, avg: ${AVG}, last: ${LAST}] pending overflow {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_rq_pending_overflow\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr3","label":"[min: ${MIN}, max: ${MAX}, avg: ${AVG}, last: ${LAST}] connect timeout {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_cx_connect_timeout\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr4","label":"[min: ${MIN}, max: ${MAX}, avg: ${AVG}, last: ${LAST}] request timeout {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_rq_timeout\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr5","label":"[min: ${MIN}, max: ${MAX}, avg: ${AVG}, last: ${LAST}] per try request timeout {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_rq_per_try_timeout\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr6","label":"[min: ${MIN}, max: ${MAX}, avg: ${AVG}, last: ${LAST}] request reset {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_rq_rx_reset\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr7","label":"[min: ${MIN}, max: ${MAX}, avg: ${AVG}, last: ${LAST}] destroy initialized from originating service {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_cx_destroy_local_with_active_rq\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr8","label":"[min: ${MIN}, max: ${MAX}, avg: ${AVG}, last: ${LAST}] destroy initialized from remote service {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_http_downstream_cx_destroy_remote_active_rq\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr9","label":"[min: ${MIN}, max: ${MAX}, avg: ${AVG}, last: ${LAST}] request failed maintenance mode {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_rq_maintenance_mode\', \'Sum\', 60))/60"}]},{"type":"chart","properties":{"title":"EKS:AppMesh.UpstreamFlowControl"},"metrics":[{"metricOptions":{"id":"expr1","label":" [avg: ${AVG}] paused reading from destination service {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_flow_control_paused_reading_total\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr2","label":" [avg: ${AVG}] resumed reading from destination service {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_flow_control_resumed_reading_total\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr3","label":" [avg: ${AVG}] paused reading from originating service {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_flow_control_backed_up_total\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr4","label":" [avg: ${AVG}] resumed reading from originating service {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" envoy_cluster_upstream_flow_control_drained_total\', \'Sum\', 60))/60"}]}]},{"widgets":[{"type":"chart","properties":{"title":"EKS:AppMesh.UpstreamRequestRetry"},"metrics":[{"metricOptions":{"id":"expr1","label":" [avg: ${AVG}] request retry {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} {ClusterName} envoy_cluster_upstream_flow_control_resumed_reading_total\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr2","label":" [avg: ${AVG}] request retry success {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} {ClusterName} envoy_cluster_upstream_rq_retry_success\', \'Sum\', 60))/60"},{"metricOptions":{"id":"expr3","label":" [avg: ${AVG}] request retry overflow {ClusterName}"},"resourceType":false,"metricExpression":"SUM(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} {ClusterName} envoy_cluster_upstream_rq_retry_overflow\', \'Sum\', 60))/60"}]}]}]},{"id":"EKS:Cluster:Drawer","rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"CPU (avg)"},"metricExpression":"mm1 * 100 / mm0","resourceType":"AWS::EKS::Cluster"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"AWS::EKS::Cluster:node_cpu_limit"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"AWS::EKS::Cluster:node_cpu_usage_total"}]},{"type":"chart","properties":{"title":"MemoryUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"Memory (avg)"},"metricExpression":"mm1 * 100 / mm0","resourceType":"AWS::EKS::Cluster"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"AWS::EKS::Cluster:node_memory_limit"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"AWS::EKS::Cluster:node_memory_working_set"}]},{"type":"chart","properties":{"title":"Network"},"metrics":[{"metricOptions":{"yAxis":"left","label":"RX (avg)"},"metricTemplate":"AWS::EKS::Cluster:pod_network_rx_bytes"},{"metricOptions":{"yAxis":"right","label":"TX (avg)"},"metricTemplate":"AWS::EKS::Cluster:pod_network_tx_bytes"}]}]}]},{"id":"EKS:Cluster","name":"EKS Cluster","dependencies":[{"namespace":"ContainerInsights"}],"controls":["CW::EKS.cluster"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"metricExpression":"mm1 * 100 / mm0","resourceType":"AWS::EKS::Cluster"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"AWS::EKS::Cluster:node_cpu_limit"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"AWS::EKS::Cluster:node_cpu_usage_total"}]},{"type":"chart","properties":{"title":"MemoryUtilization","yAxis":{"left":{"min":0,"showUnits":false,"label":"Percent"}}},"metrics":[{"metricOptions":{"id":"expr1","label":"{ClusterName}"},"metricExpression":"mm1 * 100 / mm0","resourceType":"AWS::EKS::Cluster"},{"metricOptions":{"id":"mm0","visible":false},"metricTemplate":"AWS::EKS::Cluster:node_memory_limit"},{"metricOptions":{"id":"mm1","visible":false},"metricTemplate":"AWS::EKS::Cluster:node_memory_working_set"}]},{"type":"chart","properties":{"title":"Network"},"metrics":[{"metricTemplate":"AWS::EKS::Cluster:node_network_total_bytes"}]}]},{"widgets":[{"type":"chart","properties":{"title":"EKS:Clusters.ClusterFailures"},"metrics":[{"metricTemplate":"AWS::EKS::Cluster:cluster_failed_node_count"}]},{"type":"chart","properties":{"title":"DiskUtilization"},"metrics":[{"metricTemplate":"AWS::EKS::Cluster:node_filesystem_utilization"}]},{"type":"chart","properties":{"title":"EKS:Clusters.NumberOfNodes"},"metrics":[{"metricTemplate":"AWS::EKS::Cluster:cluster_node_count"}]}]}]},{"id":"EKS:JavaJMX","name":"EKS JavaJMX Report","dependencies":[{"namespace":"ContainerInsights"},{"namespace":"ContainerInsights/Prometheus"}],"controls":["CW::EKS.cluster"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"EKS:JavaJMX.TotalRAM","view":"singleValue"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" java_lang_operatingsystem_totalphysicalmemorysize\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"{ClusterName}"}}]},{"type":"chart","properties":{"title":"EKS:JavaJMX.SWAP","view":"singleValue"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" java_lang_operatingsystem_totalswapspacesize\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"{ClusterName}"}}]},{"type":"chart","properties":{"title":"EKS:JavaJMX.CPUSystemLoad","view":"singleValue"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" java_lang_operatingsystem_systemcpuload\', \'Average\', 60)) * 100)","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"{ClusterName}"}}]},{"type":"chart","properties":{"title":"EKS:JavaJMX.CPUCores","view":"singleValue"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" jvm_classes_loaded\', \'Average\', 60)) * 100)","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"{ClusterName}"}}]}]},{"widgets":[{"type":"chart","properties":{"title":"EKS:JavaJMX.CPUUsage"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" java_lang_operatingsystem_systemcpuload\', \'Average\', 60)) * 100)","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"System cpu load {ClusterName}"}},{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" java_lang_operatingsystem_processcpuload\', \'Average\', 60)) * 100)","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr2","label":"Process cpu load {ClusterName}"}}]},{"type":"chart","properties":{"title":"EKS:JavaJMX.Memory"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace, area} ClusterName=\\"{ClusterName}\\" jvm_memory_bytes_used\', \'Average\', 60))/AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} java_lang_operatingsystem_totalphysicalmemorysize\', \'Average\', 60))) * 100)","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"{ClusterName}"}}]}]},{"widgets":[{"type":"chart","properties":{"title":"EKS:JavaJMX.MemoryPoolUsed"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace, pool} ClusterName=\\"{ClusterName}\\" jvm_memory_pool_bytes_used\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"{ClusterName}"}}]},{"type":"chart","properties":{"title":"EKS:JavaJMX.ThreadsUsed"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" jvm_threads_daemon\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr2","label":"Daemon {ClusterName}"}},{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" jvm_threads_current\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"Current {ClusterName}"}}]}]},{"widgets":[{"type":"chart","properties":{"title":"EKS:JavaJMX.OpenFileDescriptors"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" java_lang_operatingsystem_openfiledescriptorcount\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"{ClusterName}"}}]},{"type":"chart","properties":{"title":"EKS:JavaJMX.ClassLoading"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" jvm_classes_loaded\', \'Average\', 60)) * 100)","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"{ClusterName}"}}]}]},{"widgets":[{"type":"chart","properties":{"title":"EKS:JavaJMX.CatalinaManagerSessions"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" catalina_manager_activesessions\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"Active sessions {ClusterName}"}},{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" catalina_manager_rejectedsessions\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr2","label":"Rejected sessions {ClusterName}"}}]},{"type":"chart","properties":{"title":"EKS:JavaJMX.CatalinaRequestProcessorBytes"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" catalina_globalrequestprocessor_bytesreceived\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"Bytes received {ClusterName}"}},{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" catalina_globalrequestprocessor_bytessent\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr2","label":"Bytes sent {ClusterName}"}}]}]},{"widgets":[{"type":"chart","properties":{"title":"EKS:JavaJMX.CatalinaRequestProcessorRequests"},"metrics":[{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" catalina_globalrequestprocessor_requestcount\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"Request count{ClusterName}"}},{"metricExpression":"AVG(REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" catalina_globalrequestprocessor_errorcount\', \'Average\', 60)))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr2","label":"Error count {ClusterName}"}}]},{"type":"chart","properties":{"title":"EKS:JavaJMX.CatalinaRequestProcessorTime","yAxis":{"left":{"showUnits":false,"label":"ms"}}},"metrics":[{"metricExpression":"REMOVE_EMPTY(SEARCH(\'{ContainerInsights/Prometheus,ClusterName,Namespace} ClusterName=\\"{ClusterName}\\" catalina_globalrequestprocessor_processingtime\', \'Average\', 60))","resourceType":"AWS::EKS::Cluster","metricOptions":{"id":"expr1","label":"{ClusterName}"}}]}]}]},{"id":"EKS:Namespace:Drawer","rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization"},"metrics":[{"metricOptions":{"label":"CPU (avg)"},"metricTemplate":"CW::EKS::Namespace:pod_cpu_utilization"}]},{"type":"chart","properties":{"title":"MemoryUtilization"},"metrics":[{"metricOptions":{"label":"Memory (avg)"},"metricTemplate":"CW::EKS::Namespace:pod_memory_utilization"}]},{"type":"chart","properties":{"title":"Network"},"metrics":[{"metricOptions":{"yAxis":"right","label":"TX (avg)"},"metricTemplate":"CW::EKS::Namespace:pod_network_tx_bytes"},{"metricOptions":{"yAxis":"left","label":"RX (avg)"},"metricTemplate":"CW::EKS::Namespace:pod_network_rx_bytes"}]}]}]},{"id":"EKS:Namespace","name":"EKS Namespace","dependencies":[{"namespace":"ContainerInsights"}],"controls":["CW::EKS.namespace","CW::EKS.cluster"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization"},"metrics":[{"metricTemplate":"CW::EKS::Namespace:pod_cpu_utilization"}]},{"type":"chart","properties":{"title":"MemoryUtilization"},"metrics":[{"metricTemplate":"CW::EKS::Namespace:pod_memory_utilization"}]},{"type":"chart","properties":{"title":"Network"},"metrics":[{"metricTemplate":"CW::EKS::Namespace:pod_network_tx_bytes"},{"metricTemplate":"CW::EKS::Namespace:pod_network_rx_bytes"}]}]},{"widgets":[{"type":"chart","properties":{"title":"CPUUtilizationOverLimit"},"metrics":[{"metricTemplate":"CW::EKS::Namespace:pod_cpu_utilization_over_pod_limit"}]},{"type":"chart","properties":{"title":"MemoryUtilizationOverLimit"},"metrics":[{"metricTemplate":"CW::EKS::Namespace:pod_memory_utilization_over_pod_limit"}]},{"type":"chart","properties":{"title":"NumberOfPods"},"metrics":[{"metricTemplate":"CW::EKS::Namespace:namespace_number_of_running_pods"}]}]}]},{"id":"EKS:Nginx","name":"EKS Nginx Report","dependencies":[{"namespace":"ContainerInsights"},{"namespace":"ContainerInsights/Prometheus"}],"controls":["CW::EKS.cluster","CW::EKS.namespace","CW::EKS.service"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"EKS:Nginx.RequestVolume","yAxis":{"left":{"label":"Count"}}},"metrics":[{"metricTemplate":"CW::EKS::Service:nginx_ingress_controller_requests"}]},{"type":"chart","properties":{"title":"EKS:Nginx.ControllerConnections","yAxis":{"left":{"showUnits":false,"label":"Count"}}},"metrics":[{"metricTemplate":"CW::EKS::Service:nginx_ingress_controller_nginx_process_connections"}]},{"type":"chart","properties":{"title":"EKS:Nginx.SuccessRate","yAxis":{"left":{"showUnits":false,"label":"Count"}}},"metrics":[{"metricTemplate":"CW::EKS::Service:nginx_ingress_controller_requests"}]}]},{"widgets":[{"type":"chart","properties":{"title":"EKS:Nginx.IngressRequestVolume","yAxis":{"left":{"showUnits":false,"label":"Count"}}},"metrics":[{"metricTemplate":"CW::EKS::Service:nginx_ingress_controller_nginx_process_cpu_seconds_total"}]},{"type":"chart","properties":{"title":"EKS:Nginx.AverageMemoryUsage","yAxis":{"left":{"showUnits":false,"label":"MiB"}}},"metrics":[{"metricTemplate":"CW::EKS::Service:nginx_ingress_controller_nginx_process_resident_memory_bytes"}]},{"type":"chart","properties":{"title":"EKS:Nginx.AverageCPUUsage","yAxis":{"left":{"showUnits":false,"label":"%"}}},"metrics":[{"metricTemplate":"CW::EKS::Service:nginx_ingress_controller_nginx_process_cpu_seconds_total"}]}]}]},{"id":"EKS:Node","name":"EKS Node","dependencies":[{"namespace":"ContainerInsights"}],"controls":["CW::EKS.cluster"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization"},"metrics":[{"metricTemplate":"CW::EKS::Node:node_cpu_utilization"}]},{"type":"chart","properties":{"title":"CPUReservedCapacity"},"metrics":[{"metricTemplate":"CW::EKS::Node:node_cpu_reserved_capacity"}]},{"type":"chart","properties":{"title":"MemoryUtilization"},"metrics":[{"metricTemplate":"CW::EKS::Node:node_memory_utilization"}]},{"type":"chart","properties":{"title":"MemoryReservedCapacity"},"metrics":[{"metricTemplate":"CW::EKS::Node:node_memory_reserved_capacity"}]}]},{"widgets":[{"type":"chart","properties":{"title":"DiskUtilization"},"metrics":[{"metricTemplate":"CW::EKS::Node:node_filesystem_utilization"}]},{"type":"chart","properties":{"title":"Network"},"metrics":[{"metricTemplate":"CW::EKS::Node:node_network_total_bytes"}]},{"type":"chart","properties":{"title":"NumberOfPods"},"metrics":[{"metricTemplate":"CW::EKS::Node:node_number_of_running_pods"}]},{"type":"chart","properties":{"title":"EKS:Nodes.NumberOfContainers"},"metrics":[{"metricTemplate":"CW::EKS::Node:node_number_of_running_containers"}]}]}]},{"id":"EKS:Pod:Drawer","rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization"},"metrics":[{"metricOptions":{"label":"CPU (avg)"},"metricTemplate":"CW::EKS::Pod:pod_cpu_utilization"}]},{"type":"chart","properties":{"title":"MemoryUtilization"},"metrics":[{"metricOptions":{"label":"Memory (avg)"},"metricTemplate":"CW::EKS::Pod:pod_memory_utilization"}]},{"type":"chart","properties":{"title":"Network"},"metrics":[{"metricOptions":{"label":"TX (avg)","yAxis":"right"},"metricTemplate":"CW::EKS::Pod:pod_network_tx_bytes"},{"metricOptions":{"label":"RX (avg)","yAxis":"left"},"metricTemplate":"CW::EKS::Pod:pod_network_rx_bytes"}]}]}]},{"id":"EKS:Pod","name":"EKS Pod","dependencies":[{"namespace":"ContainerInsights"}],"controls":["CW::EKS.cluster","CW::EKS.namespace","CW::EKS.pod"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization"},"metrics":[{"metricTemplate":"CW::EKS::Pod:pod_cpu_utilization"}]},{"type":"chart","properties":{"title":"MemoryUtilization"},"metrics":[{"metricTemplate":"CW::EKS::Pod:pod_memory_utilization"}]},{"type":"chart","properties":{"title":"Network"},"metrics":[{"metricTemplate":"CW::EKS::Pod:pod_network_tx_bytes"},{"metricTemplate":"CW::EKS::Pod:pod_network_rx_bytes"}]}]},{"widgets":[{"type":"chart","properties":{"title":"CPUUtilizationOverLimit"},"metrics":[{"metricTemplate":"CW::EKS::Pod:pod_cpu_utilization_over_pod_limit"}]},{"type":"chart","properties":{"title":"MemoryUtilizationOverLimit"},"metrics":[{"metricTemplate":"CW::EKS::Pod:pod_memory_utilization_over_pod_limit"}]},{"type":"chart","properties":{"title":"CPUReservedCapacity"},"metrics":[{"metricTemplate":"CW::EKS::Pod:pod_cpu_reserved_capacity"}]},{"type":"chart","properties":{"title":"Network"},"metrics":[{"metricTemplate":"CW::EKS::Pod:pod_memory_reserved_capacity"}]}]}]},{"id":"EKS:Service:Drawer","rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization"},"metrics":[{"metricOptions":{"label":"CPU (avg)"},"metricTemplate":"CW::EKS::Service:pod_cpu_utilization"}]},{"type":"chart","properties":{"title":"MemoryUtilization"},"metrics":[{"metricOptions":{"label":"Memory (avg)"},"metricTemplate":"CW::EKS::Service:pod_memory_utilization"}]},{"type":"chart","properties":{"title":"Network"},"metrics":[{"metricOptions":{"label":"TX (avg)","yAxis":"right"},"metricTemplate":"CW::EKS::Service:pod_network_tx_bytes"},{"metricOptions":{"label":"RX (avg)","yAxis":"left"},"metricTemplate":"CW::EKS::Service:pod_network_rx_bytes"}]}]}]},{"id":"EKS:Service","name":"EKS Service","dependencies":[{"namespace":"ContainerInsights"}],"controls":["CW::EKS.cluster","CW::EKS.namespace","CW::EKS.service"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"CPUUtilization"},"metrics":[{"metricTemplate":"CW::EKS::Service:pod_cpu_utilization"}]},{"type":"chart","properties":{"title":"MemoryUtilization"},"metrics":[{"metricTemplate":"CW::EKS::Service:pod_memory_utilization"}]},{"type":"chart","properties":{"title":"Network"},"metrics":[{"metricTemplate":"CW::EKS::Service:pod_network_tx_bytes"},{"metricTemplate":"CW::EKS::Service:pod_network_rx_bytes"}]}]},{"widgets":[{"type":"chart","properties":{"title":"CPUUtilizationOverLimit"},"metrics":[{"metricTemplate":"CW::EKS::Service:pod_cpu_utilization_over_pod_limit"}]},{"type":"chart","properties":{"title":"MemoryUtilizationOverLimit"},"metrics":[{"metricTemplate":"CW::EKS::Service:pod_memory_utilization_over_pod_limit"}]},{"type":"chart","properties":{"title":"NumberOfPods"},"metrics":[{"metricTemplate":"CW::EKS::Service:service_number_of_running_pods"}]}]}]}]},{"id":"AWS::ElastiCache","dashboard":"ElastiCache","crossServiceDashboard":"ElastiCache:CrossService","resourceTypes":[{"type":"AWS::ElastiCache::CacheCluster","consoleLink":"/elasticache/home?region={region}#memcached-nodes:id={CacheClusterId};nodes","keyMetric":"AWS::ElastiCache::CacheCluster:CPUUtilization","dashboard":"ElastiCache","arnRegex":".*:cluster:(.*)","describe":"elasticache-describe-cluster"}],"controls":{"AWS::ElastiCache.cacheClusters":{"type":"resource","resourceType":"AWS::ElastiCache::CacheCluster","labelField":"CacheClusterId","valueField":"CacheClusterId"}},"metricTemplates":[{"resourceType":"AWS::ElastiCache::CacheCluster","namespace":"AWS/ElastiCache","dimensions":[{"dimensionName":"CacheClusterId","labelName":"CacheClusterId"}],"metrics":[{"id":"AWS::ElastiCache::CacheCluster:ActiveDefragHits","name":"ActiveDefragHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:AuthenticationFailures","name":"AuthenticationFailures","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:BytesReadIntoMemcached","name":"BytesReadIntoMemcached","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:BytesUsedForCache","name":"BytesUsedForCache","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:BytesUsedForCacheItems","name":"BytesUsedForCacheItems","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:BytesUsedForHash","name":"BytesUsedForHash","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:BytesWrittenOutFromMemcached","name":"BytesWrittenOutFromMemcached","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheHitRate","name":"CacheHitRate","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheHits","name":"CacheHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheMisses","name":"CacheMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CasBadval","name":"CasBadval","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CasHits","name":"CasHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CasMisses","name":"CasMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CmdConfigGet","name":"CmdConfigGet","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CmdConfigSet","name":"CmdConfigSet","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CmdFlush","name":"CmdFlush","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CmdGets","name":"CmdGets","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CmdSet","name":"CmdSet","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CmdTouch","name":"CmdTouch","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CommandAuthorizationFailures","name":"CommandAuthorizationFailures","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CPUCreditBalance","name":"CPUCreditBalance","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CPUCreditUsage","name":"CPUCreditUsage","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CurrConfig","name":"CurrConfig","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CurrConnections","name":"CurrConnections","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CurrItems","name":"CurrItems","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:DatabaseMemoryUsagePercentage","name":"DatabaseMemoryUsagePercentage","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:DB0AverageTTL","name":"DB0AverageTTL","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:DecrHits","name":"DecrHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:DecrMisses","name":"DecrMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:DeleteHits","name":"DeleteHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:DeleteMisses","name":"DeleteMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:EngineCPUUtilization","name":"EngineCPUUtilization","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:EvalBasedCmds","name":"EvalBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:EvalBasedCmdsLatency","name":"EvalBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:EvictedUnfetched","name":"EvictedUnfetched","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:Evictions","name":"Evictions","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:ExpiredUnfetched","name":"ExpiredUnfetched","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:FreeableMemory","name":"FreeableMemory","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:GeoSpatialBasedCmds","name":"GeoSpatialBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:GeoSpatialBasedCmdsLatency","name":"GeoSpatialBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:GetHits","name":"GetHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:GetMisses","name":"GetMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:GetTypeCmds","name":"GetTypeCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:GetTypeCmdsLatency","name":"GetTypeCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:GlobalDatastoreReplicationLag","name":"GlobalDatastoreReplicationLag","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:HashBasedCmds","name":"HashBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:HashBasedCmdsLatency","name":"HashBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:HyperLogLogBasedCmds","name":"HyperLogLogBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:HyperLogLogBasedCmdsLatency","name":"HyperLogLogBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:IncrHits","name":"IncrHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:IncrMisses","name":"IncrMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:IsMaster","name":"IsMaster","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:KeyAuthorizationFailures","name":"KeyAuthorizationFailures","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:KeyBasedCmds","name":"KeyBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:KeyBasedCmdsLatency","name":"KeyBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:KeysTracked","name":"KeysTracked","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:ListBasedCmds","name":"ListBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:ListBasedCmdsLatency","name":"ListBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:MasterLinkHealthStatus","name":"MasterLinkHealthStatus","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:MemoryFragmentationRatio","name":"MemoryFragmentationRatio","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:NetworkBytesIn","name":"NetworkBytesIn","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:NetworkBytesOut","name":"NetworkBytesOut","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:NetworkPacketsIn","name":"NetworkPacketsIn","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:NetworkPacketsOut","name":"NetworkPacketsOut","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:NewConnections","name":"NewConnections","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:NewItems","name":"NewItems","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:PubSubBasedCmds","name":"PubSubBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:PubSubBasedCmdsLatency","name":"PubSubBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:Reclaimed","name":"Reclaimed","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:ReplicationBytes","name":"ReplicationBytes","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:ReplicationLag","name":"ReplicationLag","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:SaveInProgress","name":"SaveInProgress","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:SetBasedCmds","name":"SetBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:SetBasedCmdsLatency","name":"SetBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:SetTypeCmds","name":"SetTypeCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:SetTypeCmdsLatency","name":"SetTypeCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:SlabsMoved","name":"SlabsMoved","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:SortedSetBasedCmds","name":"SortedSetBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:SortedSetBasedCmdsLatency","name":"SortedSetBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:StreamBasedCmds","name":"StreamBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:StreamBasedCmdsLatency","name":"StreamBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:StringBasedCmds","name":"StringBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:StringBasedCmdsLatency","name":"StringBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:SwapUsage","name":"SwapUsage","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:TouchHits","name":"TouchHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:TouchMisses","name":"TouchMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:UnusedMemory","name":"UnusedMemory","defaultStat":"Average"}]},{"resourceType":"AWS::ElastiCache::CacheCluster","id":"AWS::ElastiCache::CacheCluster:CacheNodeId","namespace":"AWS/ElastiCache","dimensions":[{"dimensionName":"CacheClusterId","labelName":"CacheClusterId"},{"dimensionName":"CacheNodeId","labelName":"CacheNodeId"}],"metrics":[{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:ActiveDefragHits","name":"ActiveDefragHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:AuthenticationFailures","name":"AuthenticationFailures","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:BytesReadIntoMemcached","name":"BytesReadIntoMemcached","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:BytesUsedForCache","name":"BytesUsedForCache","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:BytesUsedForCacheItems","name":"BytesUsedForCacheItems","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:BytesUsedForHash","name":"BytesUsedForHash","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:BytesWrittenOutFromMemcached","name":"BytesWrittenOutFromMemcached","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CacheHitRate","name":"CacheHitRate","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CacheHits","name":"CacheHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CacheMisses","name":"CacheMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CasBadval","name":"CasBadval","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CasHits","name":"CasHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CasMisses","name":"CasMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CmdConfigGet","name":"CmdConfigGet","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CmdConfigSet","name":"CmdConfigSet","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CmdFlush","name":"CmdFlush","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CmdGets","name":"CmdGets","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CmdSet","name":"CmdSet","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CmdTouch","name":"CmdTouch","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CommandAuthorizationFailures","name":"CommandAuthorizationFailures","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CPUCreditBalance","name":"CPUCreditBalance","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CPUCreditUsage","name":"CPUCreditUsage","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CurrConfig","name":"CurrConfig","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CurrConnections","name":"CurrConnections","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:CurrItems","name":"CurrItems","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:DatabaseMemoryUsagePercentage","name":"DatabaseMemoryUsagePercentage","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:DB0AverageTTL","name":"DB0AverageTTL","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:DecrHits","name":"DecrHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:DecrMisses","name":"DecrMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:DeleteHits","name":"DeleteHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:DeleteMisses","name":"DeleteMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:EngineCPUUtilization","name":"EngineCPUUtilization","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:EvalBasedCmds","name":"EvalBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:EvalBasedCmdsLatency","name":"EvalBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:EvictedUnfetched","name":"EvictedUnfetched","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:Evictions","name":"Evictions","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:ExpiredUnfetched","name":"ExpiredUnfetched","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:FreeableMemory","name":"FreeableMemory","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:GeoSpatialBasedCmds","name":"GeoSpatialBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:GeoSpatialBasedCmdsLatency","name":"GeoSpatialBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:GetHits","name":"GetHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:GetMisses","name":"GetMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:GetTypeCmds","name":"GetTypeCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:GetTypeCmdsLatency","name":"GetTypeCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:GlobalDatastoreReplicationLag","name":"GlobalDatastoreReplicationLag","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:HashBasedCmds","name":"HashBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:HashBasedCmdsLatency","name":"HashBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:HyperLogLogBasedCmds","name":"HyperLogLogBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:HyperLogLogBasedCmdsLatency","name":"HyperLogLogBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:IncrHits","name":"IncrHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:IncrMisses","name":"IncrMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:IsMaster","name":"IsMaster","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:KeyAuthorizationFailures","name":"KeyAuthorizationFailures","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:KeyBasedCmds","name":"KeyBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:KeyBasedCmdsLatency","name":"KeyBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:KeysTracked","name":"KeysTracked","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:ListBasedCmds","name":"ListBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:ListBasedCmdsLatency","name":"ListBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:MasterLinkHealthStatus","name":"MasterLinkHealthStatus","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:MemoryFragmentationRatio","name":"MemoryFragmentationRatio","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:NetworkBytesIn","name":"NetworkBytesIn","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:NetworkBytesOut","name":"NetworkBytesOut","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:NetworkPacketsIn","name":"NetworkPacketsIn","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:NetworkPacketsOut","name":"NetworkPacketsOut","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:NewConnections","name":"NewConnections","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:NewItems","name":"NewItems","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:PubSubBasedCmds","name":"PubSubBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:PubSubBasedCmdsLatency","name":"PubSubBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:Reclaimed","name":"Reclaimed","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:ReplicationBytes","name":"ReplicationBytes","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:ReplicationLag","name":"ReplicationLag","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:SaveInProgress","name":"SaveInProgress","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:SetBasedCmds","name":"SetBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:SetBasedCmdsLatency","name":"SetBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:SetTypeCmds","name":"SetTypeCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:SetTypeCmdsLatency","name":"SetTypeCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:SlabsMoved","name":"SlabsMoved","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:SortedSetBasedCmds","name":"SortedSetBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:SortedSetBasedCmdsLatency","name":"SortedSetBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:StreamBasedCmds","name":"StreamBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:StreamBasedCmdsLatency","name":"StreamBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:StringBasedCmds","name":"StringBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:StringBasedCmdsLatency","name":"StringBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:SwapUsage","name":"SwapUsage","defaultStat":"Average"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:TouchHits","name":"TouchHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:TouchMisses","name":"TouchMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::CacheCluster:CacheNodeId:UnusedMemory","name":"UnusedMemory","defaultStat":"Average"}]},{"resourceType":"AWS::ElastiCache::CacheCluster","id":"AWS::ElastiCache::AcrossClusters","namespace":"AWS/ElastiCache","dimensions":[],"metrics":[{"id":"AWS::ElastiCache::AcrossClusters:ActiveDefragHits","name":"ActiveDefragHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:AuthenticationFailures","name":"AuthenticationFailures","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:BytesReadIntoMemcached","name":"BytesReadIntoMemcached","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:BytesUsedForCache","name":"BytesUsedForCache","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:BytesUsedForCacheItems","name":"BytesUsedForCacheItems","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:BytesUsedForHash","name":"BytesUsedForHash","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:BytesWrittenOutFromMemcached","name":"BytesWrittenOutFromMemcached","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:CacheHitRate","name":"CacheHitRate","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:CacheHits","name":"CacheHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CacheMisses","name":"CacheMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CasBadval","name":"CasBadval","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CasHits","name":"CasHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CasMisses","name":"CasMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CmdConfigGet","name":"CmdConfigGet","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CmdConfigSet","name":"CmdConfigSet","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CmdFlush","name":"CmdFlush","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CmdGets","name":"CmdGets","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CmdSet","name":"CmdSet","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CmdTouch","name":"CmdTouch","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CommandAuthorizationFailures","name":"CommandAuthorizationFailures","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CPUCreditBalance","name":"CPUCreditBalance","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:CPUCreditUsage","name":"CPUCreditUsage","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:CurrConfig","name":"CurrConfig","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CurrConnections","name":"CurrConnections","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:CurrItems","name":"CurrItems","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:DatabaseMemoryUsagePercentage","name":"DatabaseMemoryUsagePercentage","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:DB0AverageTTL","name":"DB0AverageTTL","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:DecrHits","name":"DecrHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:DecrMisses","name":"DecrMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:DeleteHits","name":"DeleteHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:DeleteMisses","name":"DeleteMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:EngineCPUUtilization","name":"EngineCPUUtilization","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:EvalBasedCmds","name":"EvalBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:EvalBasedCmdsLatency","name":"EvalBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:EvictedUnfetched","name":"EvictedUnfetched","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:Evictions","name":"Evictions","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:ExpiredUnfetched","name":"ExpiredUnfetched","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:FreeableMemory","name":"FreeableMemory","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:GeoSpatialBasedCmds","name":"GeoSpatialBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:GeoSpatialBasedCmdsLatency","name":"GeoSpatialBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:GetHits","name":"GetHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:GetMisses","name":"GetMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:GetTypeCmds","name":"GetTypeCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:GetTypeCmdsLatency","name":"GetTypeCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:GlobalDatastoreReplicationLag","name":"GlobalDatastoreReplicationLag","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:HashBasedCmds","name":"HashBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:HashBasedCmdsLatency","name":"HashBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:HyperLogLogBasedCmds","name":"HyperLogLogBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:HyperLogLogBasedCmdsLatency","name":"HyperLogLogBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:IncrHits","name":"IncrHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:IncrMisses","name":"IncrMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:IsMaster","name":"IsMaster","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:KeyAuthorizationFailures","name":"KeyAuthorizationFailures","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:KeyBasedCmds","name":"KeyBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:KeyBasedCmdsLatency","name":"KeyBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:KeysTracked","name":"KeysTracked","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:ListBasedCmds","name":"ListBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:ListBasedCmdsLatency","name":"ListBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:MasterLinkHealthStatus","name":"MasterLinkHealthStatus","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:MemoryFragmentationRatio","name":"MemoryFragmentationRatio","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:NetworkBytesIn","name":"NetworkBytesIn","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:NetworkBytesOut","name":"NetworkBytesOut","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:NetworkPacketsIn","name":"NetworkPacketsIn","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:NetworkPacketsOut","name":"NetworkPacketsOut","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:NewConnections","name":"NewConnections","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:NewItems","name":"NewItems","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:PubSubBasedCmds","name":"PubSubBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:PubSubBasedCmdsLatency","name":"PubSubBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:Reclaimed","name":"Reclaimed","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:ReplicationBytes","name":"ReplicationBytes","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:ReplicationLag","name":"ReplicationLag","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:SaveInProgress","name":"SaveInProgress","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:SetBasedCmds","name":"SetBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:SetBasedCmdsLatency","name":"SetBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:SetTypeCmds","name":"SetTypeCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:SetTypeCmdsLatency","name":"SetTypeCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:SlabsMoved","name":"SlabsMoved","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:SortedSetBasedCmds","name":"SortedSetBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:SortedSetBasedCmdsLatency","name":"SortedSetBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:StreamBasedCmds","name":"StreamBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:StreamBasedCmdsLatency","name":"StreamBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:StringBasedCmds","name":"StringBasedCmds","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:StringBasedCmdsLatency","name":"StringBasedCmdsLatency","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:SwapUsage","name":"SwapUsage","defaultStat":"Average"},{"id":"AWS::ElastiCache::AcrossClusters:TouchHits","name":"TouchHits","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:TouchMisses","name":"TouchMisses","defaultStat":"Sum"},{"id":"AWS::ElastiCache::AcrossClusters:UnusedMemory","name":"UnusedMemory","defaultStat":"Average"}]}],"dashboards":[{"id":"ElastiCache:CrossService","name":"ElastiCache","dependencies":[{"namespace":"AWS/ElastiCache"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:Evictions"}]}]}]},{"id":"ElastiCache","name":"ElastiCache","dependencies":[{"namespace":"AWS/ElastiCache"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::ElastiCache.cacheClusters"],"tables":[{"resourceType":"AWS::ElastiCache::CacheCluster","columns":["CacheClusterId","NumCacheNodes","CacheNodeType","PreferredAvailabilityZone","ConfigurationEndpoint","CacheClusterStatus"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:FreeableMemory"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:SwapUsage"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:NetworkBytesIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:NetworkBytesOut"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:CurrConnections"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:Evictions"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:Reclaimed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:CacheHits"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:CacheMisses"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:ReplicationBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:ReplicationLag"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:BytesUsedForCache"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:CurrItems"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:CasHits"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElastiCache::CacheCluster:CasMisses"}]}]}]}]},{"id":"AWS::ElasticBeanstalk","dashboard":"ElasticBeanstalk","crossServiceDashboard":"ElasticBeanstalk:CrossService","resourceTypes":[{"type":"AWS::ElasticBeanstalk::Environment","keyMetric":"AWS::ElasticBeanstalk::Environment:EnvironmentHealth","dashboard":"ElasticBeanstalk","arnRegex":".*:environment/.*/(.*)","consoleLink":"/elasticbeanstalk/home?region={region}#/environment/dashboard?environmentId={EnvironmentId}","describe":"elasticbeanstalk-describe-environments"}],"controls":{"AWS::ElasticBeanstalk.environments":{"type":"resource","resourceType":"AWS::ElasticBeanstalk::Environment","labelField":"EnvironmentName","valueField":"EnvironmentName"}},"metricTemplates":[{"resourceType":"AWS::ElasticBeanstalk::Environment","namespace":"AWS/ElasticBeanstalk","dimensions":[{"dimensionName":"EnvironmentName","labelName":"EnvironmentName"}],"metrics":[{"id":"AWS::ElasticBeanstalk::Environment:EnvironmentHealth","name":"EnvironmentHealth","defaultStat":"Average"},{"id":"AWS::ElasticBeanstalk::Environment:ApplicationRequests5xx","name":"ApplicationRequests5xx","defaultStat":"Average"},{"id":"AWS::ElasticBeanstalk::Environment:ApplicationRequests2xx","name":"ApplicationRequests2xx","defaultStat":"Average"},{"id":"AWS::ElasticBeanstalk::Environment:ApplicationRequests3xx","name":"ApplicationRequests3xx","defaultStat":"Average"},{"id":"AWS::ElasticBeanstalk::Environment:ApplicationRequests4xx","name":"ApplicationRequests4xx","defaultStat":"Average"}]}],"dashboards":[{"id":"ElasticBeanstalk:CrossService","name":"Elastic Beanstalk","dependencies":[{"namespace":"AWS/ElasticBeanstalk"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticBeanstalk::Environment:EnvironmentHealth"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticBeanstalk::Environment:ApplicationRequests5xx"}]}]}]},{"id":"ElasticBeanstalk","name":"Elastic Beanstalk","dependencies":[{"namespace":"AWS/ElasticBeanstalk"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::ElasticBeanstalk.environments"],"tables":[{"resourceType":"AWS::ElasticBeanstalk::Environment","columns":["EnvironmentName","Health","Status","HealthStatus"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticBeanstalk::Environment:EnvironmentHealth"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticBeanstalk::Environment:ApplicationRequests2xx"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticBeanstalk::Environment:ApplicationRequests3xx"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticBeanstalk::Environment:ApplicationRequests4xx"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticBeanstalk::Environment:ApplicationRequests5xx"}]}]}]}]},{"id":"AWS::ElasticInference","dashboard":"ElasticInference","crossServiceDashboard":"ElasticInference:CrossService","resourceTypes":[{"type":"AWS::ElasticInference::ElasticInferenceAccelerator","keyMetric":"AWS::ElasticInference::ElasticInferenceAccelerator:AcceleratorHealthCheckFailed","dashboard":"ElasticInference"}],"controls":{"AWS::ElasticInference.elasticInferenceAccelerators":{"type":"resource","resourceType":"AWS::ElasticInference::ElasticInferenceAccelerator","labelField":"ElasticInferenceAcceleratorId","valueField":"ElasticInferenceAcceleratorId"}},"metricTemplates":[{"resourceType":"AWS::ElasticInference::ElasticInferenceAccelerator","namespace":"AWS/ElasticInference","dimensions":[{"dimensionName":"ElasticInferenceAcceleratorId","labelName":"ElasticInferenceAcceleratorId"},{"dimensionName":"InstanceId","labelName":"InstanceId"}],"metrics":[{"id":"AWS::ElasticInference::ElasticInferenceAccelerator:AcceleratorHealthCheckFailed","name":"AcceleratorHealthCheckFailed","defaultStat":"Average"},{"id":"AWS::ElasticInference::ElasticInferenceAccelerator:ConnectivityCheckFailed","name":"ConnectivityCheckFailed","defaultStat":"Average"},{"id":"AWS::ElasticInference::ElasticInferenceAccelerator:AcceleratorMemoryUsage","name":"AcceleratorMemoryUsage","defaultStat":"Maximum"}]}],"dashboards":[{"id":"ElasticInference:CrossService","name":"Elastic Inference","dependencies":[{"namespace":"AWS/ElasticInference"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticInference::ElasticInferenceAccelerator:AcceleratorHealthCheckFailed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticInference::ElasticInferenceAccelerator:ConnectivityCheckFailed"}]}]}]},{"id":"ElasticInference","name":"Elastic Inference","dependencies":[{"namespace":"AWS/ElasticInference"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::ElasticInference.elasticInferenceAccelerators"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticInference::ElasticInferenceAccelerator:AcceleratorHealthCheckFailed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticInference::ElasticInferenceAccelerator:ConnectivityCheckFailed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticInference::ElasticInferenceAccelerator:AcceleratorMemoryUsage"}]}]}]}]},{"id":"AWS::EMR","dashboard":"ElasticMapReduce","crossServiceDashboard":"ElasticMapReduce:CrossService","resourceTypes":[{"type":"AWS::EMR::Cluster","keyMetric":"AWS::EMR::Cluster:IsIdle","dashboard":"ElasticMapReduce","arnRegex":".*:cluster/(.*)"}],"controls":{"AWS::EMR.clusters":{"type":"resource","resourceType":"AWS::EMR::Cluster","labelField":"JobFlowId","valueField":"JobFlowId"}},"metricTemplates":[{"resourceType":"AWS::EMR::Cluster","namespace":"AWS/ElasticMapReduce","dimensions":[{"dimensionName":"JobFlowId","labelName":"JobFlowId"}],"metrics":[{"id":"AWS::EMR::Cluster:AppsCompleted","name":"AppsCompleted","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:AppsFailed","name":"AppsFailed","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:AppsKilled","name":"AppsKilled","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:AppsPending","name":"AppsPending","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:AppsRunning","name":"AppsRunning","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:AppsSubmitted","name":"AppsSubmitted","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:BackupFailed","name":"BackupFailed","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:CapacityRemainingGB","name":"CapacityRemainingGB","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:ContainerAllocated","name":"ContainerAllocated","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:ContainerPending","name":"ContainerPending","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:ContainerPendingRatio","name":"ContainerPendingRatio","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:ContainerReserved","name":"ContainerReserved","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:CoreNodesPending","name":"CoreNodesPending","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:CoreNodesRunning","name":"CoreNodesRunning","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:CorruptBlocks","name":"CorruptBlocks","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:DfsPendingReplicationBlocks","name":"DfsPendingReplicationBlocks","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:HbaseBackupFailed","name":"HbaseBackupFailed","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:HDFSBytesRead","name":"HDFSBytesRead","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:HDFSBytesWritten","name":"HDFSBytesWritten","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:HDFSUtilization","name":"HDFSUtilization","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:IsIdle","name":"IsIdle","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:JobsFailed","name":"JobsFailed","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:JobsRunning","name":"JobsRunning","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:LiveDataNodes","name":"LiveDataNodes","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:LiveTaskTrackers","name":"LiveTaskTrackers","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:MapSlotsOpen","name":"MapSlotsOpen","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:MapTasksRemaining","name":"MapTasksRemaining","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:MapTasksRunning","name":"MapTasksRunning","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:MemoryAllocatedMB","name":"MemoryAllocatedMB","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:MemoryReservedMB","name":"MemoryReservedMB","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:MemoryTotalMB","name":"MemoryTotalMB","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:MissingBlocks","name":"MissingBlocks","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:MostRecentBackupDuration","name":"MostRecentBackupDuration","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:MRActiveNodes","name":"MRActiveNodes","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:MRDecommissionedNodes","name":"MRDecommissionedNodes","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:MRLostNodes","name":"MRLostNodes","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:MRRebootedNodes","name":"MRRebootedNodes","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:MRTotalNodes","name":"MRTotalNodes","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:MRUnhealthyNodes","name":"MRUnhealthyNodes","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:MultiMasterInstanceGroupNodesRequested","name":"MultiMasterInstanceGroupNodesRequested","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:MultiMasterInstanceGroupNodesRunning","name":"MultiMasterInstanceGroupNodesRunning","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:MultiMasterInstanceGroupNodesRunningPercentage","name":"MultiMasterInstanceGroupNodesRunningPercentage","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:PendingDeletionBlocks","name":"PendingDeletionBlocks","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:ReduceSlotsOpen","name":"ReduceSlotsOpen","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:ReduceTasksRemaining","name":"ReduceTasksRemaining","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:ReduceTasksRunning","name":"ReduceTasksRunning","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:RemainingMapTasksPerSlot","name":"RemainingMapTasksPerSlot","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:S3BytesRead","name":"S3BytesRead","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:S3BytesWritten","name":"S3BytesWritten","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:TaskNodesPending","name":"TaskNodesPending","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:TaskNodesRunning","name":"TaskNodesRunning","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:TimeSinceLastSuccessfulBackup","name":"TimeSinceLastSuccessfulBackup","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:TotalLoad","name":"TotalLoad","defaultStat":"Average"},{"id":"AWS::EMR::Cluster:UnderReplicatedBlocks","name":"UnderReplicatedBlocks","defaultStat":"Sum"},{"id":"AWS::EMR::Cluster:YARNMemoryAvailablePercentage","name":"YARNMemoryAvailablePercentage","defaultStat":"Average"}]}],"dashboards":[{"id":"ElasticMapReduce:CrossService","name":"EMR","dependencies":[{"namespace":"AWS/ElasticMapReduce"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:JobsRunning"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:JobsFailed"}]}]}]},{"id":"ElasticMapReduce","name":"EMR","dependencies":[{"namespace":"AWS/ElasticMapReduce"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::EMR.clusters"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:JobsRunning"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:JobsFailed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:IsIdle"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:MapTasksRunning"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:MapTasksRemaining"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:MapSlotsOpen"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:RemainingMapTasksPerSlot"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:ReduceTasksRunning"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:ReduceTasksRemaining"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:ReduceSlotsOpen"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:CoreNodesRunning"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:CoreNodesPending"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:LiveDataNodes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:TaskNodesRunning"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:TaskNodesPending"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:LiveTaskTrackers"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:S3BytesWritten"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:S3BytesRead"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:HDFSUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:HDFSBytesRead"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:HDFSBytesWritten"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:MissingBlocks"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:TotalLoad"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:BackupFailed"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:MostRecentBackupDuration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EMR::Cluster:TimeSinceLastSuccessfulBackup"}]}]}]}]},{"id":"AWS::DRS","dashboard":"ElasticRecoveryService","crossServiceDashboard":"ElasticRecoveryService:CrossService","resourceTypes":[{"type":"AWS::DRS::SourceServer","keyMetric":"AWS::DRS::SourceServer:LagDuration","dashboard":"ElasticRecoveryService"}],"controls":{"AWS::DRS.SourceServer":{"type":"resource","resourceType":"AWS::DRS::SourceServer","labelField":"SourceServerID","valueField":"SourceServerID"}},"metricTemplates":[{"resourceType":"AWS::DRS::SourceServer","namespace":"AWS/DRS","dimensions":[{"dimensionName":"SourceServerID","labelName":"SourceServerID"}],"metrics":[{"id":"AWS::DRS::SourceServer:LagDuration","name":"LagDuration","defaultStat":"Average"},{"id":"AWS::DRS::SourceServer:Backlog","name":"Backlog","defaultStat":"Average"},{"id":"AWS::DRS::SourceServer:DurationSinceLastSuccessfullRecoveryLaunch","name":"DurationSinceLastSuccessfullRecoveryLaunch","defaultStat":"Maximum"},{"id":"AWS::DRS::SourceServer:ElapsedReplicationDuration","name":"ElapsedReplicationDuration","defaultStat":"Maximum"}]},{"resourceType":"AWS::DRS::SourceServer","id":"AWS::DRS::SourceServer:AcrossAllServers","namespace":"AWS/DRS","dimensions":[],"metrics":[{"id":"AWS::DRS::SourceServer:AcrossAllServers:ActiveSourceServerCount","name":"ActiveSourceServerCount","defaultStat":"Average"},{"id":"AWS::DRS::SourceServer:AcrossAllServers:TotalSourceServerCount","name":"TotalSourceServerCount","defaultStat":"Average"}]}],"dashboards":[{"id":"ElasticRecoveryService:CrossService","name":"Elastic Recovery Services","dependencies":[{"namespace":"AWS/DRS"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DRS::SourceServer:LagDuration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DRS::SourceServer:AcrossAllServers:ActiveSourceServerCount"}]}]}]},{"id":"ElasticRecoveryService","name":"Elastic Recovery Service","dependencies":[{"namespace":"AWS/DRS"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::DRS.SourceServer"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DRS::SourceServer:LagDuration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DRS::SourceServer:Backlog"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DRS::SourceServer:DurationSinceLastSuccessfullRecoveryLaunch"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::DRS::SourceServer:ElapsedReplicationDuration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DRS::SourceServer:AcrossAllServers:ActiveSourceServerCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::DRS::SourceServer:AcrossAllServers:TotalSourceServerCount"}]}]}]}]},{"id":"AWS::ElasticTranscoder","dashboard":"ElasticTranscoder","crossServiceDashboard":"ElasticTranscoder:CrossService","resourceTypes":[{"type":"AWS::ElasticTranscoder::Operation","keyMetric":"AWS::ElasticTranscoder::Operation:Errors","dashboard":"ElasticTranscoder"}],"controls":{"AWS::ElasticTranscoder.operations":{"type":"resource","resourceType":"AWS::ElasticTranscoder::Operation","labelField":"Operation","valueField":"Operation"}},"metricTemplates":[{"resourceType":"AWS::ElasticTranscoder::Operation","namespace":"AWS/ElasticTranscoder","dimensions":[{"dimensionName":"Operation","labelName":"Operation"}],"metrics":[{"id":"AWS::ElasticTranscoder::Operation:Errors","name":"Errors","defaultStat":"Sum"},{"id":"AWS::ElasticTranscoder::Operation:Throttles","name":"Throttles","defaultStat":"Sum"},{"id":"AWS::ElasticTranscoder::Operation:BilledHDOutput","name":"BilledHDOutput","defaultStat":"Sum"},{"id":"AWS::ElasticTranscoder::Operation:BilledSDOutput","name":"BilledSDOutput","defaultStat":"Sum"},{"id":"AWS::ElasticTranscoder::Operation:BilledAudioOutput","name":"BilledAudioOutput","defaultStat":"Sum"},{"id":"AWS::ElasticTranscoder::Operation:JobsCompleted","name":"JobsCompleted","defaultStat":"Sum"},{"id":"AWS::ElasticTranscoder::Operation:JobsErrored","name":"JobsErrored","defaultStat":"Sum"},{"id":"AWS::ElasticTranscoder::Operation:OutputsPerJob","name":"OutputsPerJob","defaultStat":"Sum"},{"id":"AWS::ElasticTranscoder::Operation:StandbyTime","name":"StandbyTime","defaultStat":"Average"}]}],"dashboards":[{"id":"ElasticTranscoder:CrossService","name":"Elastic Transcoder","dependencies":[{"namespace":"AWS/ElasticTranscoder"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticTranscoder::Operation:Errors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticTranscoder::Operation:Throttles"}]}]}]},{"id":"ElasticTranscoder","name":"Elastic Transcoder","dependencies":[{"namespace":"AWS/ElasticTranscoder"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::ElasticTranscoder.operations"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticTranscoder::Operation:Errors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticTranscoder::Operation:Throttles"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticTranscoder::Operation:BilledHDOutput"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticTranscoder::Operation:BilledSDOutput"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticTranscoder::Operation:BilledAudioOutput"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticTranscoder::Operation:JobsCompleted"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticTranscoder::Operation:JobsErrored"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticTranscoder::Operation:OutputsPerJob"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticTranscoder::Operation:StandbyTime"}]}]}]}]},{"id":"AWS::ELB","dashboard":"ELB","crossServiceDashboard":"ELB:CrossService","resourceTypes":[{"type":"AWS::ElasticLoadBalancing::LoadBalancer","keyMetric":"AWS::ElasticLoadBalancing::LoadBalancer:RequestCount","dashboard":"ELB","arnRegex":".*:loadbalancer\\\\/(?!.*net|app|gwy)(.*)"}],"controls":{"AWS::ELB.loadBalancers":{"type":"resource","resourceType":"AWS::ElasticLoadBalancing::LoadBalancer","labelField":"LoadBalancerName","valueField":"LoadBalancerName"}},"metricTemplates":[{"resourceType":"AWS::ElasticLoadBalancing::LoadBalancer","namespace":"AWS/ELB","dimensions":[{"dimensionName":"LoadBalancerName","labelName":"LoadBalancerName"}],"metrics":[{"id":"AWS::ElasticLoadBalancing::LoadBalancer:BackendConnectionErrors","name":"BackendConnectionErrors","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:DesyncMitigationMode_NonCompliant_Request_Count","name":"DesyncMitigationMode_NonCompliant_Request_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_2XX","name":"HTTPCode_Backend_2XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_3XX","name":"HTTPCode_Backend_3XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_4XX","name":"HTTPCode_Backend_4XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_5XX","name":"HTTPCode_Backend_5XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_ELB_4XX","name":"HTTPCode_ELB_4XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_ELB_5XX","name":"HTTPCode_ELB_5XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:HealthyHostCount","name":"HealthyHostCount","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:Latency","name":"Latency","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:RequestCount","name":"RequestCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:SpilloverCount","name":"SpilloverCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:SurgeQueueLength","name":"SurgeQueueLength","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:UnHealthyHostCount","name":"UnHealthyHostCount","defaultStat":"Average"}]},{"resourceType":"AWS::ElasticLoadBalancing::LoadBalancer","id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone","namespace":"AWS/ELB","dimensions":[{"dimensionName":"AvailabilityZone","labelName":"AvailabilityZone"},{"dimensionName":"LoadBalancerName","labelName":"LoadBalancerName"}],"metrics":[{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:BackendConnectionErrors","name":"BackendConnectionErrors","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:DesyncMitigationMode_NonCompliant_Request_Count","name":"DesyncMitigationMode_NonCompliant_Request_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:HTTPCode_Backend_2XX","name":"HTTPCode_Backend_2XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:HTTPCode_Backend_3XX","name":"HTTPCode_Backend_3XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:HTTPCode_Backend_4XX","name":"HTTPCode_Backend_4XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:HTTPCode_Backend_5XX","name":"HTTPCode_Backend_5XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:HTTPCode_ELB_4XX","name":"HTTPCode_ELB_4XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:HTTPCode_ELB_5XX","name":"HTTPCode_ELB_5XX","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:HealthyHostCount","name":"HealthyHostCount","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:Latency","name":"Latency","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:RequestCount","name":"RequestCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:SpilloverCount","name":"SpilloverCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:SurgeQueueLength","name":"SurgeQueueLength","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancing::LoadBalancer:AvailabilityZone:UnHealthyHostCount","name":"UnHealthyHostCount","defaultStat":"Average"}]}],"dashboards":[{"id":"ELB:CrossService","name":"Elastic Load Balancing","dependencies":[{"namespace":"AWS/ELB"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:Latency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:BackendConnectionErrors"}]}]}]},{"id":"ELB:ResourceHealth","name":"Elastic Load Balancing","dependencies":[{"namespace":"AWS/ELB"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:RequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:Latency"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:BackendConnectionErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:SpilloverCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:SurgeQueueLength"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:HealthyHostCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:UnHealthyHostCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_2XX"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_3XX"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_4XX"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_5XX"}]}]}]},{"id":"ELB","name":"Elastic Load Balancing","dependencies":[{"namespace":"AWS/ELB"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::ELB.loadBalancers"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:RequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:Latency"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:BackendConnectionErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:SpilloverCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:SurgeQueueLength"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:HealthyHostCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:UnHealthyHostCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_2XX"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_3XX"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_4XX"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancing::LoadBalancer:HTTPCode_Backend_5XX"}]}]}]}]},{"id":"AWS::ElasticLoadBalancingV2::TargetGroup","resourceTypes":[{"type":"AWS::ElasticLoadBalancingV2::TargetGroup","keyMetric":"AWS::ElasticLoadBalancingV2::TargetGroup:RequestCountPerTarget","dashboard":"ApplicationELB","arnRegex":".*:(targetgroup/.*)"}],"metricTemplates":[{"resourceType":"AWS::ElasticLoadBalancingV2::TargetGroup","namespace":"AWS/ApplicationELB","dimensions":[{"dimensionName":"TargetGroup","labelName":"TargetGroup"}],"metrics":[{"id":"AWS::ElasticLoadBalancingV2::TargetGroup:LambdaInternalError","name":"LambdaInternalError","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::TargetGroup:LambdaUserError","name":"LambdaUserError","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::TargetGroup:RequestCountPerTarget","name":"RequestCountPerTarget","defaultStat":"Sum"}]}],"dashboards":[]},{"id":"AWS::ES","dashboard":"ES","crossServiceDashboard":"ES:CrossService","resourceTypes":[{"type":"AWS::ES::Client","keyMetric":"AWS::ES::Client:CPUUtilization","dashboard":"ES"}],"controls":{"AWS::ES.clients":{"type":"resource","resourceType":"AWS::ES::Client","labelField":"ClientId","valueField":"ClientId"}},"metricTemplates":[{"resourceType":"AWS::ES::Client","namespace":"AWS/ES","dimensions":[{"dimensionName":"ClientId","labelName":"ClientId"},{"dimensionName":"DomainName","labelName":"DomainName"}],"metrics":[{"id":"AWS::ES::Client:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::ES::Client:ElasticsearchRequests","name":"ElasticsearchRequests","defaultStat":"Sum"},{"id":"AWS::ES::Client:SearchableDocuments","name":"SearchableDocuments","defaultStat":"Average"},{"id":"AWS::ES::Client:ClusterStatus.green","name":"ClusterStatus.green","defaultStat":"Average"},{"id":"AWS::ES::Client:ClusterStatus.yellow","name":"ClusterStatus.yellow","defaultStat":"Average"},{"id":"AWS::ES::Client:ClusterStatus.red","name":"ClusterStatus.red","defaultStat":"Average"},{"id":"AWS::ES::Client:Nodes","name":"Nodes","defaultStat":"Average"},{"id":"AWS::ES::Client:DeletedDocuments","name":"DeletedDocuments","defaultStat":"Sum"},{"id":"AWS::ES::Client:FreeStorageSpace","name":"FreeStorageSpace","defaultStat":"Average"},{"id":"AWS::ES::Client:ClusterUsedSpace","name":"ClusterUsedSpace","defaultStat":"Average"},{"id":"AWS::ES::Client:ClusterIndexWritesBlocked","name":"ClusterIndexWritesBlocked","defaultStat":"Maximum"},{"id":"AWS::ES::Client:JVMMemoryPressure","name":"JVMMemoryPressure","defaultStat":"Maximum"},{"id":"AWS::ES::Client:AutomatedSnapshotFailure","name":"AutomatedSnapshotFailure","defaultStat":"Maximum"},{"id":"AWS::ES::Client:CPUCreditBalance","name":"CPUCreditBalance","defaultStat":"Minimum"},{"id":"AWS::ES::Client:KibanaHealthyNodes","name":"KibanaHealthyNodes","defaultStat":"Minimum"},{"id":"AWS::ES::Client:KMSKeyError","name":"KMSKeyError","defaultStat":"Maximum"},{"id":"AWS::ES::Client:KMSKeyInaccessible","name":"KMSKeyInaccessible","defaultStat":"Maximum"},{"id":"AWS::ES::Client:InvalidHostHeaderRequests","name":"InvalidHostHeaderRequests","defaultStat":"Sum"}]}],"dashboards":[{"id":"ES:CrossService","name":"Elasticsearch Service","dependencies":[{"namespace":"AWS/ES"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:ElasticsearchRequests"}]}]}]},{"id":"ES","name":"Elasticsearch Service","dependencies":[{"namespace":"AWS/ES"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::ES.clients"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:ElasticsearchRequests"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:SearchableDocuments"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:ClusterStatus.green"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:ClusterStatus.yellow"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:ClusterStatus.red"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:Nodes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:DeletedDocuments"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:FreeStorageSpace"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:ClusterUsedSpace"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:ClusterIndexWritesBlocked"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:JVMMemoryPressure"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:AutomatedSnapshotFailure"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:CPUCreditBalance"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:KibanaHealthyNodes"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:KMSKeyError"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:KMSKeyInaccessible"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ES::Client:InvalidHostHeaderRequests"}]}]}]}]},{"id":"AWS::Events","dashboard":"Events","crossServiceDashboard":"Events:CrossService","resourceTypes":[{"type":"AWS::Events::Rule","keyMetric":"AWS::Events::Rule:Invocations","dashboard":"Events","arnRegex":".*:rule/(.*)"}],"controls":{"AWS::Events.rules":{"type":"resource","resourceType":"AWS::Events::Rule","labelField":"RuleName","valueField":"RuleName"}},"metricTemplates":[{"resourceType":"AWS::Events::Rule","namespace":"AWS/Events","dimensions":[{"dimensionName":"RuleName","labelName":"RuleName"}],"metrics":[{"id":"AWS::Events::Rule:Invocations","name":"Invocations","defaultStat":"Sum"},{"id":"AWS::Events::Rule:FailedInvocations","name":"FailedInvocations","defaultStat":"Sum"},{"id":"AWS::Events::Rule:DeadLetterInvocations","name":"DeadLetterInvocations","defaultStat":"Sum"},{"id":"AWS::Events::Rule:TriggeredRules","name":"TriggeredRules","defaultStat":"Sum"},{"id":"AWS::Events::Rule:MatchedEvents","name":"MatchedEvents","defaultStat":"Sum"},{"id":"AWS::Events::Rule:ThrottledRules","name":"ThrottledRules","defaultStat":"Sum"}]}],"dashboards":[{"id":"Events:CrossService","name":"CloudWatch Events","dependencies":[{"namespace":"AWS/Events"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Events::Rule:Invocations"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Events::Rule:FailedInvocations"}]}]}]},{"id":"Events","name":"CloudWatch Events","dependencies":[{"namespace":"AWS/Events"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Events.rules"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Events::Rule:Invocations"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Events::Rule:FailedInvocations"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Events::Rule:DeadLetterInvocations"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Events::Rule:TriggeredRules"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Events::Rule:MatchedEvents"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Events::Rule:ThrottledRules"}]}]}]}]},{"id":"AWS::FileSync","dashboard":"FileSync","crossServiceDashboard":"FileSync:CrossService","resourceTypes":[{"type":"AWS::FileSync::Host","keyMetric":"AWS::FileSync::Host:FilesTransferred","dashboard":"FileSync"}],"controls":{"AWS::FileSync.hosts":{"type":"resource","resourceType":"AWS::FileSync::Host","labelField":"HostId","valueField":"HostId"}},"metricTemplates":[{"resourceType":"AWS::FileSync::Host","namespace":"AWS/FileSync","dimensions":[{"dimensionName":"HostId","labelName":"HostId"},{"dimensionName":"HostName","labelName":"HostName"}],"metrics":[{"id":"AWS::FileSync::Host:FilesTransferred","name":"FilesTransferred","defaultStat":"Sum"}]}],"dashboards":[{"id":"FileSync:CrossService","name":"EFS File Sync","dependencies":[{"namespace":"AWS/FileSync"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::FileSync::Host:FilesTransferred"}]}]}]},{"id":"FileSync","name":"EFS File Sync","dependencies":[{"namespace":"AWS/FileSync"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::FileSync.hosts"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::FileSync::Host:FilesTransferred"}]}]}]}]},{"id":"AWS::KinesisFirehose","dashboard":"Firehose","crossServiceDashboard":"Firehose:CrossService","resourceTypes":[{"type":"AWS::KinesisFirehose::DeliveryStream","keyMetric":"AWS::KinesisFirehose::DeliveryStream:IncomingBytes","dashboard":"Firehose","arnRegex":".*:deliverystream/(.*)"}],"controls":{"AWS::KinesisFirehose.deliveryStreams":{"type":"resource","resourceType":"AWS::KinesisFirehose::DeliveryStream","labelField":"DeliveryStreamName","valueField":"DeliveryStreamName"}},"metricTemplates":[{"resourceType":"AWS::KinesisFirehose::DeliveryStream","namespace":"AWS/Firehose","dimensions":[{"dimensionName":"DeliveryStreamName","labelName":"DeliveryStreamName"}],"metrics":[{"id":"AWS::KinesisFirehose::DeliveryStream:IncomingBytes","name":"IncomingBytes","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:IncomingRecords","name":"IncomingRecords","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:BackupToS3.Bytes","name":"BackupToS3.Bytes","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:BackupToS3.DataFreshness","name":"BackupToS3.DataFreshness","defaultStat":"Average"},{"id":"AWS::KinesisFirehose::DeliveryStream:BackupToS3.Records","name":"BackupToS3.Records","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:BackupToS3.Success","name":"BackupToS3.Success","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DataReadFromKinesisStream.Bytes","name":"DataReadFromKinesisStream.Bytes","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DataReadFromKinesisStream.Records","name":"DataReadFromKinesisStream.Records","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToElasticsearch.Bytes","name":"DeliveryToElasticsearch.Bytes","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToElasticsearch.Records","name":"DeliveryToElasticsearch.Records","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToElasticsearch.Success","name":"DeliveryToElasticsearch.Success","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToRedshift.Bytes","name":"DeliveryToRedshift.Bytes","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToRedshift.Records","name":"DeliveryToRedshift.Records","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToRedshift.Success","name":"DeliveryToRedshift.Success","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToS3.Bytes","name":"DeliveryToS3.Bytes","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToS3.DataFreshness","name":"DeliveryToS3.DataFreshness","defaultStat":"Average"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToS3.Records","name":"DeliveryToS3.Records","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToS3.Success","name":"DeliveryToS3.Success","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToSplunk.Bytes","name":"DeliveryToSplunk.Bytes","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToSplunk.DataAckLatency","name":"DeliveryToSplunk.DataAckLatency","defaultStat":"Average"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToSplunk.DataFreshness","name":"DeliveryToSplunk.DataFreshness","defaultStat":"Average"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToSplunk.Records","name":"DeliveryToSplunk.Records","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:DeliveryToSplunk.Success","name":"DeliveryToSplunk.Success","defaultStat":"Sum"},{"id":"AWS::KinesisFirehose::DeliveryStream:KinesisMillisBehindLatest","name":"KinesisMillisBehindLatest","defaultStat":"Average"}]}],"dashboards":[{"id":"Firehose:CrossService","name":"Kinesis Firehose","dependencies":[{"namespace":"AWS/Firehose"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:IncomingBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:IncomingRecords"}]}]}]},{"id":"Firehose","name":"Kinesis Firehose","dependencies":[{"namespace":"AWS/Firehose"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::KinesisFirehose.deliveryStreams"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:IncomingBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:IncomingRecords"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:BackupToS3.Bytes"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:BackupToS3.DataFreshness"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:BackupToS3.Records"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:BackupToS3.Success"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DataReadFromKinesisStream.Bytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DataReadFromKinesisStream.Records"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToElasticsearch.Bytes"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToElasticsearch.Records"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToElasticsearch.Success"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToRedshift.Bytes"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToRedshift.Records"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToRedshift.Success"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToS3.Bytes"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToS3.DataFreshness"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToS3.Records"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToS3.Success"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToSplunk.Bytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToSplunk.DataAckLatency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToSplunk.DataFreshness"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToSplunk.Records"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:DeliveryToSplunk.Success"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisFirehose::DeliveryStream:KinesisMillisBehindLatest"}]}]}]}]},{"id":"AWS::FSx","dashboard":"FSx","crossServiceDashboard":"FSx:CrossService","resourceTypes":[{"type":"AWS::FSx::FileSystem","keyMetric":"AWS::FSx::FileSystem:DataReadBytes","dashboard":"FSx","arnRegex":".*:file-system/(.*)"}],"controls":{"AWS::FSx.fileSystems":{"type":"resource","resourceType":"AWS::FSx::FileSystem","labelField":"FileSystemId","valueField":"FileSystemId"}},"metricTemplates":[{"resourceType":"AWS::FSx::FileSystem","namespace":"AWS/FSx","dimensions":[{"dimensionName":"FileSystemId","labelName":"FileSystemId"}],"metrics":[{"id":"AWS::FSx::FileSystem:DataReadBytes","name":"DataReadBytes","defaultStat":"Sum"},{"id":"AWS::FSx::FileSystem:DataWriteBytes","name":"DataWriteBytes","defaultStat":"Sum"},{"id":"AWS::FSx::FileSystem:FreeStorageCapacity","name":"FreeStorageCapacity","defaultStat":"Average"},{"id":"AWS::FSx::FileSystem:FreeDataStorageCapacity","name":"FreeDataStorageCapacity","defaultStat":"Sum"},{"id":"AWS::FSx::FileSystem:DataReadOperations","name":"DataReadOperations","defaultStat":"Sum"},{"id":"AWS::FSx::FileSystem:DataWriteOperations","name":"DataWriteOperations","defaultStat":"Sum"},{"id":"AWS::FSx::FileSystem:MetadataOperations","name":"MetadataOperations","defaultStat":"Sum"}]}],"dashboards":[{"id":"FSx:CrossService","name":"FSx","dependencies":[{"namespace":"AWS/FSx"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::FSx::FileSystem:DataReadBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::FSx::FileSystem:DataWriteBytes"}]}]}]},{"id":"FSx","name":"FSx","dependencies":[{"namespace":"AWS/FSx"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::FSx.fileSystems"],"rows":[{"widgets":[{"type":"chart","properties":{"title":"Read Throughput (bytes/sec)"},"metrics":[{"metricOptions":{"id":"expr2"},"metricExpression":"METRICS()/expr1","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"id":"expr1","visible":false},"metricExpression":"PERIOD(FIRST(METRICS()))","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"visible":false},"metricTemplate":"AWS::FSx::FileSystem:DataReadBytes"}]},{"type":"chart","properties":{"title":"Write Throughput (bytes/sec)"},"metrics":[{"metricOptions":{"id":"expr2"},"metricExpression":"METRICS()/expr1","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"id":"expr1","visible":false},"metricExpression":"PERIOD(FIRST(METRICS()))","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"visible":false},"metricTemplate":"AWS::FSx::FileSystem:DataWriteBytes"}]}]},{"widgets":[{"type":"chart","properties":{"title":"Free Storage Capacity (FSx Windows): Sum"},"metrics":[{"metricTemplate":"AWS::FSx::FileSystem:FreeStorageCapacity"}]},{"type":"chart","properties":{"title":"Free Data Storage Capacity (FSx Lustre): Sum"},"metrics":[{"metricOptions":{"id":"expr2"},"metricExpression":"METRICS()/expr1*60","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"id":"expr1","visible":false},"metricExpression":"PERIOD(FIRST(METRICS()))","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"visible":false},"metricTemplate":"AWS::FSx::FileSystem:FreeDataStorageCapacity"}]}]},{"widgets":[{"type":"chart","properties":{"title":"Read IOPS (operations/sec)"},"metrics":[{"metricOptions":{"id":"expr2"},"metricExpression":"METRICS()/expr1","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"id":"expr1","visible":false},"metricExpression":"PERIOD(FIRST(METRICS()))","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"visible":false},"metricTemplate":"AWS::FSx::FileSystem:DataReadOperations"}]},{"type":"chart","properties":{"title":"Write IOPS (operations/sec)"},"metrics":[{"metricOptions":{"id":"expr2"},"metricExpression":"METRICS()/expr1","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"id":"expr1","visible":false},"metricExpression":"PERIOD(FIRST(METRICS()))","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"visible":false},"metricTemplate":"AWS::FSx::FileSystem:DataWriteOperations"}]},{"type":"chart","properties":{"title":"Metadata IOPS (operations/sec)"},"metrics":[{"metricOptions":{"id":"expr2"},"metricExpression":"METRICS()/expr1","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"id":"expr1","visible":false},"metricExpression":"PERIOD(FIRST(METRICS()))","resourceType":"AWS::FSx::FileSystem"},{"metricOptions":{"visible":false},"metricTemplate":"AWS::FSx::FileSystem:MetadataOperations"}]}]}]}]},{"id":"AWS::GameLift","dashboard":"GameLift","crossServiceDashboard":"GameLift:CrossService","resourceTypes":[{"type":"AWS::GameLift::Fleet","keyMetric":"AWS::GameLift::Fleet:ActiveInstances","dashboard":"GameLift","arnRegex":".*:fleet/(.*)"}],"controls":{"AWS::GameLift.fleets":{"type":"resource","resourceType":"AWS::GameLift::Fleet","labelField":"FleetId","valueField":"FleetId"}},"metricTemplates":[{"resourceType":"AWS::GameLift::Fleet","namespace":"AWS/GameLift","dimensions":[{"dimensionName":"FleetId","labelName":"FleetId"}],"metrics":[{"id":"AWS::GameLift::Fleet:ActiveInstances","name":"ActiveInstances","defaultStat":"Average"},{"id":"AWS::GameLift::Fleet:PercentIdleInstances","name":"PercentIdleInstances","defaultStat":"Average"},{"id":"AWS::GameLift::Fleet:DesiredInstances","name":"DesiredInstances","defaultStat":"Average"},{"id":"AWS::GameLift::Fleet:IdleInstances","name":"IdleInstances","defaultStat":"Average"},{"id":"AWS::GameLift::Fleet:MaxInstances","name":"MaxInstances","defaultStat":"Average"},{"id":"AWS::GameLift::Fleet:MinInstances","name":"MinInstances","defaultStat":"Average"},{"id":"AWS::GameLift::Fleet:InstanceInterruptions","name":"InstanceInterruptions","defaultStat":"Sum"}]}],"dashboards":[{"id":"GameLift:CrossService","name":"GameLift","dependencies":[{"namespace":"AWS/GameLift"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::GameLift::Fleet:ActiveInstances"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::GameLift::Fleet:PercentIdleInstances"}]}]}]},{"id":"GameLift","name":"GameLift","dependencies":[{"namespace":"AWS/GameLift"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::GameLift.fleets"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::GameLift::Fleet:ActiveInstances"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::GameLift::Fleet:PercentIdleInstances"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::GameLift::Fleet:DesiredInstances"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::GameLift::Fleet:IdleInstances"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::GameLift::Fleet:MaxInstances"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::GameLift::Fleet:MinInstances"}]}]},{"widgets":[{"type":"chart","width":8,"metrics":[{"metricTemplate":"AWS::GameLift::Fleet:InstanceInterruptions"}]}]}]}]},{"id":"AWS::GatewayELB","dashboard":"GatewayELB","crossServiceDashboard":"GatewayELB:CrossService","resourceTypes":[{"type":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB","entityType":"AWS::ElasticLoadBalancingV2::LoadBalancer","keyMetric":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:ConsumedLCUs","dashboard":"GatewayELB","arnRegex":".*:loadbalancer/(gwy/.*)"}],"controls":{"AWS::GatewayELB.LoadBalancers":{"type":"resource","resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB","labelField":"LoadBalancer","valueField":"LoadBalancer"}},"metricTemplates":[{"resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB","namespace":"AWS/GatewayELB","dimensions":[{"dimensionName":"LoadBalancer","labelName":"LoadBalancer"}],"metrics":[{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:HealthyHostCount","name":"HealthyHostCount","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:UnHealthyHostCount","name":"UnHealthyHostCount","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:ActiveFlowCount","name":"ActiveFlowCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:ConsumedLCUs","name":"ConsumedLCUs","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:NewFlowCount","name":"NewFlowCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:ProcessedBytes","name":"ProcessedBytes","defaultStat":"Sum"}]}],"dashboards":[{"id":"GatewayELB:CrossService","name":"Gateway ELB","dependencies":[{"namespace":"AWS/GatewayELB"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:HealthyHostCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:UnHealthyHostCount"}]}]}]},{"id":"GatewayELB","name":"Gateway ELB","dependencies":[{"namespace":"AWS/GatewayELB"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::GatewayELB.LoadBalancers"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:HealthyHostCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:UnHealthyHostCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:ActiveFlowCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:ConsumedLCUs"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:NewFlowCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/GatewayELB:ProcessedBytes"}]}]}]}]},{"id":"AWS::GlobalAccelerator::Accelerator","dashboard":"GlobalAccelerator","crossServiceDashboard":"GlobalAccelerator:CrossService","resourceTypes":[{"type":"AWS::GlobalAccelerator::Accelerator","keyMetric":"AWS::GlobalAccelerator::Accelerator:NewFlowCount","dashboard":"GlobalAccelerator","arnRegex":".*:accelerator/(.*)"}],"metricTemplates":[{"resourceType":"AWS::GlobalAccelerator::Accelerator","namespace":"AWS/GlobalAccelerator","dimensions":[{"dimensionName":"Accelerator","labelName":"Accelerator"}],"metrics":[{"id":"AWS::GlobalAccelerator::Accelerator:NewFlowCount","name":"NewFlowCount","defaultStat":"Sum"},{"id":"AWS::GlobalAccelerator::Accelerator:ProcessedBytesIn","name":"ProcessedBytesIn","defaultStat":"Sum"},{"id":"AWS::GlobalAccelerator::Accelerator:ProcessedBytesOut","name":"ProcessedBytesOut","defaultStat":"Sum"}]}],"dashboards":[{"id":"GlobalAccelerator:CrossService","name":"Global Accelerator","dependencies":[{"namespace":"AWS/GlobalAccelerator"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::GlobalAccelerator::Accelerator:NewFlowCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::GlobalAccelerator::Accelerator:ProcessedBytesIn"}]}]}]},{"id":"GlobalAccelerator","name":"Global Accelerator","dependencies":[{"namespace":"AWS/GlobalAccelerator"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::GlobalAccelerator::Accelerator:NewFlowCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::GlobalAccelerator::Accelerator:ProcessedBytesIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::GlobalAccelerator::Accelerator:ProcessedBytesOut"}]}]}]}]},{"id":"AWS::Inspector","dashboard":"Inspector","crossServiceDashboard":"Inspector:CrossService","resourceTypes":[{"type":"AWS::Inspector::AssessmentTemplateName","keyMetric":"AWS::Inspector::AssessmentTemplateName:TotalAssessmentRuns","dashboard":"Inspector"}],"controls":{"AWS::Inspector.assessmentTemplateNames":{"type":"resource","resourceType":"AWS::Inspector::AssessmentTemplateName","labelField":"AssessmentTemplateName","valueField":"AssessmentTemplateName"}},"metricTemplates":[{"resourceType":"AWS::Inspector::AssessmentTemplateName","namespace":"AWS/Inspector","dimensions":[{"dimensionName":"AssessmentTemplateArn","labelName":"AssessmentTemplateArn"},{"dimensionName":"AssessmentTemplateName","labelName":"AssessmentTemplateName"}],"metrics":[{"id":"AWS::Inspector::AssessmentTemplateName:TotalHealthyAgents","name":"TotalHealthyAgents","defaultStat":"Average"},{"id":"AWS::Inspector::AssessmentTemplateName:TotalAssessmentRuns","name":"TotalAssessmentRuns","defaultStat":"Average"},{"id":"AWS::Inspector::AssessmentTemplateName:TotalMatchingAgents","name":"TotalMatchingAgents","defaultStat":"Average"},{"id":"AWS::Inspector::AssessmentTemplateName:TotalFindings","name":"TotalFindings","defaultStat":"Average"}]}],"dashboards":[{"id":"Inspector:CrossService","name":"Inspector","dependencies":[{"namespace":"AWS/Inspector"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Inspector::AssessmentTemplateName:TotalHealthyAgents"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Inspector::AssessmentTemplateName:TotalAssessmentRuns"}]}]}]},{"id":"Inspector","name":"Inspector","dependencies":[{"namespace":"AWS/Inspector"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Inspector.assessmentTemplateNames"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Inspector::AssessmentTemplateName:TotalHealthyAgents"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Inspector::AssessmentTemplateName:TotalAssessmentRuns"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Inspector::AssessmentTemplateName:TotalMatchingAgents"}]}]},{"widgets":[{"type":"chart","width":8,"metrics":[{"metricTemplate":"AWS::Inspector::AssessmentTemplateName:TotalFindings"}]}]}]}]},{"id":"AWS::IoT::TopicRule","dashboard":"IoT","crossServiceDashboard":"IoT:CrossService","resourceTypes":[{"type":"AWS::IoT::TopicRule","keyMetric":"AWS::IoT::TopicRule:TopicMatch","dashboard":"IoT","arnRegex":".*:rule/(.*)"}],"metricTemplates":[{"resourceType":"AWS::IoT::TopicRule","namespace":"AWS/IoT","dimensions":[{"dimensionName":"RuleName","labelName":"RuleName"}],"metrics":[{"id":"AWS::IoT::TopicRule:TopicMatch","name":"TopicMatch","defaultStat":"Sum"},{"id":"AWS::IoT::TopicRule:ParseError","name":"ParseError","defaultStat":"Sum"},{"id":"AWS::IoT::TopicRule:RuleMessageThrottled","name":"RuleMessageThrottled","defaultStat":"Sum"},{"id":"AWS::IoT::TopicRule:RuleNotFound","name":"RuleNotFound","defaultStat":"Sum"}]}],"dashboards":[{"id":"IoT:CrossService","name":"IoT","dependencies":[{"namespace":"AWS/IoT"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::IoT::TopicRule:TopicMatch"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::IoT::TopicRule:ParseError"}]}]}]},{"id":"IoT","name":"IoT","dependencies":[{"namespace":"AWS/IoT"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::IoT::TopicRule:TopicMatch"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::IoT::TopicRule:ParseError"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::IoT::TopicRule:RuleMessageThrottled"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::IoT::TopicRule:RuleNotFound"}]}]}]}]},{"id":"AWS::IoT1Click::Device","dashboard":"IoT1Click","crossServiceDashboard":"IoT1Click:CrossService","resourceTypes":[{"type":"AWS::IoT1Click::Device","keyMetric":"AWS::IoT1Click::Device:TotalEvents","dashboard":"IoT1Click","arnRegex":".*:devices/(.*)"}],"metricTemplates":[{"resourceType":"AWS::IoT1Click::Device","namespace":"AWS/IoT1Click","dimensions":[{"dimensionName":"DeviceType","labelName":"DeviceType"}],"metrics":[{"id":"AWS::IoT1Click::Device:TotalEvents","name":"TotalEvents","defaultStat":"Sum"},{"id":"AWS::IoT1Click::Device:RemainingLife","name":"RemainingLife","defaultStat":"Average"},{"id":"AWS::IoT1Click::Device:CallbackInvocationErrors","name":"CallbackInvocationErrors","defaultStat":"Sum"}]}],"dashboards":[{"id":"IoT1Click:CrossService","name":"IoT 1-Click","dependencies":[{"namespace":"AWS/IoT1Click"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::IoT1Click::Device:TotalEvents"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::IoT1Click::Device:RemainingLife"}]}]}]},{"id":"IoT1Click","name":"IoT 1-Click","dependencies":[{"namespace":"AWS/IoT1Click"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::IoT1Click::Device:TotalEvents"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::IoT1Click::Device:RemainingLife"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::IoT1Click::Device:CallbackInvocationErrors"}]}]}]}]},{"id":"AWS::IoTAnalytics","dashboard":"IoTAnalytics","crossServiceDashboard":"IoTAnalytics:CrossService","resourceTypes":[{"type":"AWS::IoTAnalytics::Channel","keyMetric":"AWS::IoTAnalytics::Channel:IncomingMessages","dashboard":"IoTAnalytics","arnRegex":".*:channel/(.*)"},{"type":"AWS::IoTAnalytics::Dataset","keyMetric":"AWS::IoTAnalytics::Dataset:ActionExecution","dashboard":"IoTAnalytics","arnRegex":".*:dataset/(.*)"},{"type":"AWS::IoTAnalytics::Datastore","keyMetric":"AWS::IoTAnalytics::Datastore:ActionExecution","dashboard":"IoTAnalytics","arnRegex":".*:datastore/(.*)"},{"type":"AWS::IoTAnalytics::Pipeline","keyMetric":"AWS::IoTAnalytics::Pipeline:ActionExecution","dashboard":"IoTAnalytics","arnRegex":".*:pipeline/(.*)"}],"controls":{"AWS::IoTAnalytics.channels":{"type":"resource","resourceType":"AWS::IoTAnalytics::Channel","labelField":"ChannelName","valueField":"ChannelName"}},"metricTemplates":[{"resourceType":"AWS::IoTAnalytics::Channel","namespace":"AWS/IoTAnalytics","dimensions":[{"dimensionName":"ChannelName","labelName":"ChannelName"}],"metrics":[{"id":"AWS::IoTAnalytics::Channel:IncomingMessages","name":"IncomingMessages","defaultStat":"Sum"}]},{"resourceType":"AWS::IoTAnalytics::Dataset","namespace":"AWS/IoTAnalytics","dimensions":[{"dimensionName":"DatasetName","labelName":"DatasetName"}],"metrics":[{"id":"AWS::IoTAnalytics::Dataset:ActionExecution","name":"ActionExecution","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Dataset:IncomingMessages","name":"IncomingMessages","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Dataset:ActionExecutionThrottled","name":"ActionExecutionThrottled","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Dataset:ActivityExecutionError","name":"ActivityExecutionError","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Dataset:PipelineConcurrentExecutionCount","name":"PipelineConcurrentExecutionCount","defaultStat":"Sum"}]},{"resourceType":"AWS::IoTAnalytics::Datastore","namespace":"AWS/IoTAnalytics","dimensions":[{"dimensionName":"DatastoreName","labelName":"DatastoreName"}],"metrics":[{"id":"AWS::IoTAnalytics::Datastore:ActionExecution","name":"ActionExecution","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Datastore:IncomingMessages","name":"IncomingMessages","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Datastore:ActionExecutionThrottled","name":"ActionExecutionThrottled","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Datastore:ActivityExecutionError","name":"ActivityExecutionError","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Datastore:PipelineConcurrentExecutionCount","name":"PipelineConcurrentExecutionCount","defaultStat":"Sum"}]},{"resourceType":"AWS::IoTAnalytics::Pipeline","namespace":"AWS/IoTAnalytics","dimensions":[{"dimensionName":"PipelineActivityName","labelName":"PipelineActivityName"}],"metrics":[{"id":"AWS::IoTAnalytics::Pipeline:ActionExecution","name":"ActionExecution","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Pipeline:IncomingMessages","name":"IncomingMessages","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Pipeline:ActionExecutionThrottled","name":"ActionExecutionThrottled","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Pipeline:ActivityExecutionError","name":"ActivityExecutionError","defaultStat":"Sum"},{"id":"AWS::IoTAnalytics::Pipeline:PipelineConcurrentExecutionCount","name":"PipelineConcurrentExecutionCount","defaultStat":"Sum"}]}],"dashboards":[{"id":"IoTAnalytics:CrossService","name":"IoT Analytics","dependencies":[{"namespace":"AWS/IoTAnalytics"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::IoTAnalytics::Channel:IncomingMessages"}]}]}]},{"id":"IoTAnalytics","name":"IoT Analytics","dependencies":[{"namespace":"AWS/IoTAnalytics"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::IoTAnalytics.channels"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::IoTAnalytics::Channel:IncomingMessages"}]}]}]}]},{"id":"AWS::Kafka::Cluster","dashboard":"Kafka","crossServiceDashboard":"Kafka:CrossService","resourceTypes":[{"type":"AWS::Kafka::Cluster","keyMetric":"AWS::Kafka::Cluster:ActiveControllerCount","arnRegex":".*:cluster/(.*)/.*"},{"type":"CW::Kafka::Cluster","keyMetric":"CW::Kafka::Cluster:CpuUser","dashboard":"Kafka","arnRegex":".*:cluster/(.*)/.*"}],"metricTemplates":[{"resourceType":"AWS::Kafka::Cluster","namespace":"AWS/Kafka","dimensions":[{"dimensionName":"Cluster Name","labelName":"Cluster Name"}],"metrics":[{"id":"AWS::Kafka::Cluster:ActiveControllerCount","name":"ActiveControllerCount","defaultStat":"Average"},{"id":"AWS::Kafka::Cluster:GlobalPartitionCount","name":"GlobalPartitionCount","defaultStat":"Average"},{"id":"AWS::Kafka::Cluster:GlobalTopicCount","name":"GlobalTopicCount","defaultStat":"Average"},{"id":"AWS::Kafka::Cluster:KafkaDataLogsDiskUsed","name":"KafkaDataLogsDiskUsed","defaultStat":"Average"},{"id":"AWS::Kafka::Cluster:OfflinePartitionsCount","name":"OfflinePartitionsCount","defaultStat":"Average"},{"id":"AWS::Kafka::Cluster:ZooKeeperRequestLatencyMsMean","name":"ZooKeeperRequestLatencyMsMean","defaultStat":"Average"},{"id":"AWS::Kafka::Cluster:ZooKeeperSessionState","name":"ZooKeeperSessionState","defaultStat":"Average"}]},{"resourceType":"CW::Kafka::Cluster","namespace":"AWS/Kafka","dimensions":[{"dimensionName":"Cluster Name","labelName":"Cluster Name"},{"dimensionName":"Broker ID","labelName":"Broker ID"}],"metrics":[{"id":"CW::Kafka::Cluster:CpuIdle","name":"CpuIdle","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:CpuSystem","name":"CpuSystem","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:CpuUser","name":"CpuUser","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:KafkaAppLogsDiskUsed","name":"KafkaAppLogsDiskUsed","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:KafkaDataLogsDiskUsed","name":"KafkaDataLogsDiskUsed","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:MemoryBuffered","name":"MemoryBuffered","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:MemoryCached","name":"MemoryCached","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:MemoryFree","name":"MemoryFree","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:MemoryUsed","name":"MemoryUsed","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:NetworkRxDropped","name":"NetworkRxDropped","defaultStat":"Sum"},{"id":"CW::Kafka::Cluster:NetworkRxErrors","name":"NetworkRxErrors","defaultStat":"Sum"},{"id":"CW::Kafka::Cluster:NetworkRxPackets","name":"NetworkRxPackets","defaultStat":"Sum"},{"id":"CW::Kafka::Cluster:NetworkTxDropped","name":"NetworkTxDropped","defaultStat":"Sum"},{"id":"CW::Kafka::Cluster:NetworkTxErrors","name":"NetworkTxErrors","defaultStat":"Sum"},{"id":"CW::Kafka::Cluster:NetworkTxPackets","name":"NetworkTxPackets","defaultStat":"Sum"},{"id":"CW::Kafka::Cluster:RootDiskUsed","name":"RootDiskUsed","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:SwapFree","name":"SwapFree","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:SwapUsed","name":"SwapUsed","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:ZooKeeperRequestLatencyMsMean","name":"ZooKeeperRequestLatencyMsMean","defaultStat":"Average"},{"id":"CW::Kafka::Cluster:ZooKeeperSessionState","name":"ZooKeeperSessionState","defaultStat":"Average"}]}],"dashboards":[{"id":"Kafka:CrossService","name":"MSK (Kafka)","dependencies":[{"namespace":"AWS/Kafka"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Kafka::Cluster:ActiveControllerCount"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:CpuIdle"}]}]}]},{"id":"Kafka","name":"MSK (Kafka)","dependencies":[{"namespace":"AWS/Kafka"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Kafka::Cluster:ActiveControllerCount"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:CpuIdle"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:CpuSystem"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:CpuUser"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kafka::Cluster:GlobalPartitionCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kafka::Cluster:GlobalTopicCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:KafkaAppLogsDiskUsed"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:KafkaDataLogsDiskUsed"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:MemoryBuffered"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:MemoryCached"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:MemoryFree"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:MemoryUsed"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:NetworkRxDropped"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:NetworkRxErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:NetworkRxPackets"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:NetworkTxDropped"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:NetworkTxErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:NetworkTxPackets"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Kafka::Cluster:OfflinePartitionsCount"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:RootDiskUsed"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:SwapFree"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::Kafka::Cluster:SwapUsed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kafka::Cluster:ZooKeeperRequestLatencyMsMean"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kafka::Cluster:ZooKeeperSessionState"}]}]}]}]},{"id":"AWS::Kinesis","dashboard":"Kinesis","crossServiceDashboard":"Kinesis:CrossService","resourceTypes":[{"type":"AWS::Kinesis::Stream","keyMetric":"AWS::Kinesis::Stream:GetRecords.Records","dashboard":"Kinesis","arnRegex":".*:stream/(.*)"}],"controls":{"AWS::Kinesis.streams":{"type":"resource","resourceType":"AWS::Kinesis::Stream","labelField":"StreamName","valueField":"StreamName"}},"metricTemplates":[{"resourceType":"AWS::Kinesis::Stream","namespace":"AWS/Kinesis","dimensions":[{"dimensionName":"StreamName","labelName":"StreamName"}],"metrics":[{"id":"AWS::Kinesis::Stream:ReadProvisionedThroughputExceeded","name":"ReadProvisionedThroughputExceeded","defaultStat":"Sum"},{"id":"AWS::Kinesis::Stream:WriteProvisionedThroughputExceeded","name":"WriteProvisionedThroughputExceeded","defaultStat":"Sum"},{"id":"AWS::Kinesis::Stream:GetRecords.IteratorAgeMilliseconds","name":"GetRecords.IteratorAgeMilliseconds","defaultStat":"Maximum"},{"id":"AWS::Kinesis::Stream:PutRecord.Success","name":"PutRecord.Success","defaultStat":"Sum"},{"id":"AWS::Kinesis::Stream:PutRecords.Success","name":"PutRecords.Success","defaultStat":"Sum"},{"id":"AWS::Kinesis::Stream:PutRecords.Bytes","name":"PutRecords.Bytes","defaultStat":"Sum"},{"id":"AWS::Kinesis::Stream:GetRecords.Success","name":"GetRecords.Success","defaultStat":"Sum"},{"id":"AWS::Kinesis::Stream:GetRecords.Bytes","name":"GetRecords.Bytes","defaultStat":"Sum"},{"id":"AWS::Kinesis::Stream:GetRecords.Records","name":"GetRecords.Records","defaultStat":"Sum"},{"id":"AWS::Kinesis::Stream:GetRecords.Latency","name":"GetRecords.Latency","defaultStat":"Maximum"},{"id":"AWS::Kinesis::Stream:IncomingBytes","name":"IncomingBytes","defaultStat":"Sum"},{"id":"AWS::Kinesis::Stream:IncomingRecords","name":"IncomingRecords","defaultStat":"Sum"}]}],"dashboards":[{"id":"Kinesis:CrossService","name":"Kinesis Data Stream","dependencies":[{"namespace":"AWS/Kinesis"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:ReadProvisionedThroughputExceeded"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:WriteProvisionedThroughputExceeded"}]}]}]},{"id":"Kinesis","name":"Kinesis Data Stream","dependencies":[{"namespace":"AWS/Kinesis"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Kinesis.streams"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:GetRecords.IteratorAgeMilliseconds"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:ReadProvisionedThroughputExceeded"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:WriteProvisionedThroughputExceeded"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:PutRecord.Success"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:PutRecords.Success"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:GetRecords.Success"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:GetRecords.Bytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:GetRecords.Records"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:GetRecords.Latency"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:IncomingBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Kinesis::Stream:IncomingRecords"}]}]}]}]},{"id":"AWS::KinesisAnalytics","dashboard":"KinesisAnalytics","crossServiceDashboard":"KinesisAnalytics:CrossService","resourceTypes":[{"type":"AWS::KinesisAnalytics::Application","keyMetric":"AWS::KinesisAnalytics::Application:KPUs","arnRegex":".*:application/(.*)"},{"type":"CW::KinesisAnalytics::Application","keyMetric":"CW::KinesisAnalytics::Application:Bytes","dashboard":"KinesisAnalytics","arnRegex":".*:application/(.*)"}],"controls":{"AWS::KinesisAnalytics.applications":{"type":"resource","resourceType":"CW::KinesisAnalytics::Application","labelField":"Application","valueField":"Application"}},"metricTemplates":[{"resourceType":"AWS::KinesisAnalytics::Application","namespace":"AWS/KinesisAnalytics","dimensions":[{"dimensionName":"Application","labelName":"Application"}],"metrics":[{"id":"AWS::KinesisAnalytics::Application:KPUs","name":"KPUs","defaultStat":"Average"},{"id":"AWS::KinesisAnalytics::Application:MillisBehindLatest","name":"MillisBehindLatest","defaultStat":"Average"}]},{"resourceType":"CW::KinesisAnalytics::Application","namespace":"AWS/KinesisAnalytics","dimensions":[{"dimensionName":"Application","labelName":"Application"},{"dimensionName":"Flow","labelName":"Flow"},{"dimensionName":"Id","labelName":"Id"}],"metrics":[{"id":"CW::KinesisAnalytics::Application:Bytes","name":"Bytes","defaultStat":"Average"},{"id":"CW::KinesisAnalytics::Application:KPUs","name":"KPUs","defaultStat":"Average"},{"id":"CW::KinesisAnalytics::Application:MillisBehindLatest","name":"MillisBehindLatest","defaultStat":"Average"},{"id":"CW::KinesisAnalytics::Application:Records","name":"Records","defaultStat":"Average"},{"id":"CW::KinesisAnalytics::Application:Success","name":"Success","defaultStat":"Average"},{"id":"CW::KinesisAnalytics::Application:InputProcessing.Duration","name":"InputProcessing.Duration","defaultStat":"Average"},{"id":"CW::KinesisAnalytics::Application:InputProcessing.OkRecords","name":"InputProcessing.OkRecords","defaultStat":"Sum"},{"id":"CW::KinesisAnalytics::Application:InputProcessing.OkBytes","name":"InputProcessing.OkBytes","defaultStat":"Sum"},{"id":"CW::KinesisAnalytics::Application:InputProcessing.DroppedRecords","name":"InputProcessing.DroppedRecords","defaultStat":"Sum"},{"id":"CW::KinesisAnalytics::Application:InputProcessing.ProcessingFailedRecords","name":"InputProcessing.ProcessingFailedRecords","defaultStat":"Sum"},{"id":"CW::KinesisAnalytics::Application:InputProcessing.Success","name":"InputProcessing.Success","defaultStat":"Sum"},{"id":"CW::KinesisAnalytics::Application:LambdaDelivery.OkRecords","name":"LambdaDelivery.OkRecords","defaultStat":"Sum"},{"id":"CW::KinesisAnalytics::Application:LambdaDelivery.DeliveryFailedRecords","name":"LambdaDelivery.DeliveryFailedRecords","defaultStat":"Sum"},{"id":"CW::KinesisAnalytics::Application:LambdaDelivery.Duration","name":"LambdaDelivery.Duration","defaultStat":"Average"}]}],"dashboards":[{"id":"KinesisAnalytics:CrossService","name":"Kinesis Analytics","dependencies":[{"namespace":"AWS/KinesisAnalytics"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:Bytes"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:KPUs"}]}]}]},{"id":"KinesisAnalytics","name":"Kinesis Analytics","dependencies":[{"namespace":"AWS/KinesisAnalytics"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::KinesisAnalytics.applications"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:Bytes"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:KPUs"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:MillisBehindLatest"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:Records"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:Success"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:InputProcessing.Duration"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:InputProcessing.OkRecords"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:InputProcessing.OkBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:InputProcessing.DroppedRecords"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:InputProcessing.ProcessingFailedRecords"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:InputProcessing.Success"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:LambdaDelivery.OkRecords"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:LambdaDelivery.DeliveryFailedRecords"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::KinesisAnalytics::Application:LambdaDelivery.Duration"}]}]}]}]},{"id":"AWS::KinesisVideo","dashboard":"KinesisVideo","crossServiceDashboard":"KinesisVideo:CrossService","resourceTypes":[{"type":"AWS::KinesisVideo::Stream","keyMetric":"AWS::KinesisVideo::Stream:GetMedia.Success","dashboard":"KinesisVideo","arnRegex":".*:stream/(.*)/.*"}],"controls":{"AWS::KinesisVideo.streams":{"type":"resource","resourceType":"AWS::KinesisVideo::Stream","labelField":"StreamName","valueField":"StreamName"}},"metricTemplates":[{"resourceType":"AWS::KinesisVideo::Stream","namespace":"AWS/KinesisVideo","dimensions":[{"dimensionName":"StreamName","labelName":"StreamName"}],"metrics":[{"id":"AWS::KinesisVideo::Stream:GetMedia.Success","name":"GetMedia.Success","defaultStat":"Sum"},{"id":"AWS::KinesisVideo::Stream:PutMedia.Success","name":"PutMedia.Success","defaultStat":"Sum"},{"id":"AWS::KinesisVideo::Stream:GetMedia.MillisBehindNow","name":"GetMedia.MillisBehindNow","defaultStat":"Sum"},{"id":"AWS::KinesisVideo::Stream:ListFragments.Latency","name":"ListFragments.Latency","defaultStat":"Sum"},{"id":"AWS::KinesisVideo::Stream:PutMedia.FragmentIngestionLatency","name":"PutMedia.FragmentIngestionLatency","defaultStat":"Sum"},{"id":"AWS::KinesisVideo::Stream:PutMedia.FragmentPersistLatency","name":"PutMedia.FragmentPersistLatency","defaultStat":"Sum"},{"id":"AWS::KinesisVideo::Stream:PutMedia.IncomingBytes","name":"PutMedia.IncomingBytes","defaultStat":"Sum"},{"id":"AWS::KinesisVideo::Stream:PutMedia.IncomingFrames","name":"PutMedia.IncomingFrames","defaultStat":"Sum"}]}],"dashboards":[{"id":"KinesisVideo:CrossService","name":"Kinesis Video","dependencies":[{"namespace":"AWS/KinesisVideo"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisVideo::Stream:GetMedia.Success"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisVideo::Stream:PutMedia.Success"}]}]}]},{"id":"KinesisVideo","name":"Kinesis Video","dependencies":[{"namespace":"AWS/KinesisVideo"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::KinesisVideo.streams"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisVideo::Stream:GetMedia.Success"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisVideo::Stream:PutMedia.Success"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisVideo::Stream:GetMedia.MillisBehindNow"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisVideo::Stream:ListFragments.Latency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisVideo::Stream:PutMedia.FragmentIngestionLatency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisVideo::Stream:PutMedia.FragmentPersistLatency"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisVideo::Stream:PutMedia.IncomingBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::KinesisVideo::Stream:PutMedia.IncomingFrames"}]}]}]}]},{"id":"AWS::KMS","dashboard":"KMS","crossServiceDashboard":"KMS:CrossService","resourceTypes":[{"type":"AWS::KMS::Key","keyMetric":"AWS::KMS::Key:SecondsUntilKeyMaterialExpiration","dashboard":"KMS","arnRegex":".*:key/(.*)"}],"controls":{"AWS::KMS.keys":{"type":"resource","resourceType":"AWS::KMS::Key","labelField":"KeyId","valueField":"KeyId"}},"metricTemplates":[{"resourceType":"AWS::KMS::Key","namespace":"AWS/KMS","dimensions":[{"dimensionName":"KeyId","labelName":"KeyId"}],"metrics":[{"id":"AWS::KMS::Key:SecondsUntilKeyMaterialExpiration","name":"SecondsUntilKeyMaterialExpiration","defaultStat":"Average"}]}],"dashboards":[{"id":"KMS:CrossService","name":"Key Management Service","dependencies":[{"namespace":"AWS/KMS"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KMS::Key:SecondsUntilKeyMaterialExpiration"}]}]}]},{"id":"KMS","name":"Key Management Service","dependencies":[{"namespace":"AWS/KMS"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::KMS.keys"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::KMS::Key:SecondsUntilKeyMaterialExpiration"}]}]}]}]},{"id":"AWS::Lambda","dashboard":"Lambda","crossServiceDashboard":"Lambda:CrossService","resourceTypes":[{"type":"AWS::Lambda::Function","consoleLink":"/lambda/home?region={region}#/functions/{FunctionName}","keyMetric":"AWS::Lambda::Function:Duration","describe":"lambda-describe-functions","dashboard":"Lambda","isResourceNode":true,"arnRegex":".*:function:(.*)"}],"controls":{"AWS::Lambda.functions":{"type":"resource","resourceType":"AWS::Lambda::Function","labelField":"FunctionName","valueField":"FunctionName"}},"metricTemplates":[{"resourceType":"AWS::Lambda::Function","namespace":"AWS/Lambda","dimensions":[{"dimensionName":"FunctionName","labelName":"FunctionName"}],"metrics":[{"id":"AWS::Lambda::Function:ConcurrentExecutions","name":"ConcurrentExecutions","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:DeadLetterErrors","name":"DeadLetterErrors","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:DestinationDeliveryFailures","name":"DestinationDeliveryFailures","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:Duration","name":"Duration","defaultStat":"Average"},{"id":"AWS::Lambda::Function:Errors","name":"Errors","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:Invocations","name":"Invocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:IteratorAge","name":"IteratorAge","defaultStat":"Average"},{"id":"AWS::Lambda::Function:PostRuntimeExtensionsDuration","name":"PostRuntimeExtensionsDuration","defaultStat":"Average"},{"id":"AWS::Lambda::Function:ProvisionedConcurrencyInvocations","name":"ProvisionedConcurrencyInvocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:ProvisionedConcurrencySpilloverInvocations","name":"ProvisionedConcurrencySpilloverInvocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:ProvisionedConcurrencyUtilization","name":"ProvisionedConcurrencyUtilization","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:ProvisionedConcurrentExecutions","name":"ProvisionedConcurrentExecutions","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:Throttles","name":"Throttles","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:UnreservedConcurrentExecutions","name":"UnreservedConcurrentExecutions","defaultStat":"Maximum"}]},{"resourceType":"AWS::Lambda::Function","id":"AWS::Lambda::Function:FunctionName:Resource","namespace":"AWS/Lambda","dimensions":[{"dimensionName":"FunctionName","labelName":"FunctionName"},{"dimensionName":"Resource","labelName":"Resource"}],"metrics":[{"id":"AWS::Lambda::Function:FunctionName:Resource:ConcurrentExecutions","name":"ConcurrentExecutions","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:DeadLetterErrors","name":"DeadLetterErrors","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:DestinationDeliveryFailures","name":"DestinationDeliveryFailures","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:Duration","name":"Duration","defaultStat":"Average"},{"id":"AWS::Lambda::Function:FunctionName:Resource:Errors","name":"Errors","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:Invocations","name":"Invocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:IteratorAge","name":"IteratorAge","defaultStat":"Average"},{"id":"AWS::Lambda::Function:FunctionName:Resource:PostRuntimeExtensionsDuration","name":"PostRuntimeExtensionsDuration","defaultStat":"Average"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ProvisionedConcurrencyInvocations","name":"ProvisionedConcurrencyInvocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ProvisionedConcurrencySpilloverInvocations","name":"ProvisionedConcurrencySpilloverInvocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ProvisionedConcurrencyUtilization","name":"ProvisionedConcurrencyUtilization","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ProvisionedConcurrentExecutions","name":"ProvisionedConcurrentExecutions","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:Throttles","name":"Throttles","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:UnreservedConcurrentExecutions","name":"UnreservedConcurrentExecutions","defaultStat":"Maximum"}]},{"resourceType":"AWS::Lambda::Function","id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion","namespace":"AWS/Lambda","dimensions":[{"dimensionName":"ExecutedVersion","labelName":"ExecutedVersion"},{"dimensionName":"FunctionName","labelName":"FunctionName"},{"dimensionName":"Resource","labelName":"Resource"}],"metrics":[{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:ConcurrentExecutions","name":"ConcurrentExecutions","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:DeadLetterErrors","name":"DeadLetterErrors","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:DestinationDeliveryFailures","name":"DestinationDeliveryFailures","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:Duration","name":"Duration","defaultStat":"Average"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:Errors","name":"Errors","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:Invocations","name":"Invocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:IteratorAge","name":"IteratorAge","defaultStat":"Average"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:PostRuntimeExtensionsDuration","name":"PostRuntimeExtensionsDuration","defaultStat":"Average"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:ProvisionedConcurrencyInvocations","name":"ProvisionedConcurrencyInvocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:ProvisionedConcurrencySpilloverInvocations","name":"ProvisionedConcurrencySpilloverInvocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:ProvisionedConcurrencyUtilization","name":"ProvisionedConcurrencyUtilization","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:ProvisionedConcurrentExecutions","name":"ProvisionedConcurrentExecutions","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:Throttles","name":"Throttles","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:FunctionName:Resource:ExecutedVersion:UnreservedConcurrentExecutions","name":"UnreservedConcurrentExecutions","defaultStat":"Maximum"}]},{"resourceType":"AWS::Lambda::Function","id":"AWS::Lambda::Function:AcrossAllFunctions","namespace":"AWS/Lambda","dimensions":[],"metrics":[{"id":"AWS::Lambda::Function:AcrossAllFunctions:ConcurrentExecutions","name":"ConcurrentExecutions","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:DeadLetterErrors","name":"DeadLetterErrors","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:DestinationDeliveryFailures","name":"DestinationDeliveryFailures","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:Duration","name":"Duration","defaultStat":"Average"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:Errors","name":"Errors","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:Invocations","name":"Invocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:IteratorAge","name":"IteratorAge","defaultStat":"Average"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:PostRuntimeExtensionsDuration","name":"PostRuntimeExtensionsDuration","defaultStat":"Average"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:ProvisionedConcurrencyInvocations","name":"ProvisionedConcurrencyInvocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:ProvisionedConcurrencySpilloverInvocations","name":"ProvisionedConcurrencySpilloverInvocations","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:ProvisionedConcurrencyUtilization","name":"ProvisionedConcurrencyUtilization","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:ProvisionedConcurrentExecutions","name":"ProvisionedConcurrentExecutions","defaultStat":"Maximum"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:Throttles","name":"Throttles","defaultStat":"Sum"},{"id":"AWS::Lambda::Function:AcrossAllFunctions:UnreservedConcurrentExecutions","name":"UnreservedConcurrentExecutions","defaultStat":"Maximum"}]}],"dashboards":[{"id":"Lambda:CrossService","name":"Lambda","dependencies":[{"namespace":"AWS/Lambda"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Lambda::Function:Duration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Lambda::Function:Errors"}]}]}]},{"id":"Lambda","name":"Lambda","dependencies":[{"namespace":"AWS/Lambda"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Lambda.functions"],"tables":[{"resourceType":"AWS::Lambda::Function","columns":["FunctionName","Description","Runtime","CodeSize","MemorySize","LastModified"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Lambda::Function:Invocations"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Lambda::Function:Duration"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Lambda::Function:Errors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Lambda::Function:Throttles"}]}]}]}]},{"id":"AWS::Lex","dashboard":"Lex","crossServiceDashboard":"Lex:CrossService","resourceTypes":[{"type":"AWS::Lex::BotAlias","keyMetric":"AWS::Lex::BotAlias:RuntimeRequestCount","dashboard":"Lex"}],"controls":{"AWS::Lex.botAliass":{"type":"resource","resourceType":"AWS::Lex::BotAlias","labelField":"BotAlias","valueField":"BotAlias"}},"metricTemplates":[{"resourceType":"AWS::Lex::BotAlias","namespace":"AWS/Lex","dimensions":[{"dimensionName":"BotAlias","labelName":"BotAlias"},{"dimensionName":"BotName","labelName":"BotName"},{"dimensionName":"Operation","labelName":"Operation"}],"metrics":[{"id":"AWS::Lex::BotAlias:RuntimeRequestCount","name":"RuntimeRequestCount","defaultStat":"Sum"},{"id":"AWS::Lex::BotAlias:RuntimeSuccessfulRequestLatency","name":"RuntimeSuccessfulRequestLatency","defaultStat":"Average"},{"id":"AWS::Lex::BotAlias:RuntimeInvalidLambdaResponses","name":"RuntimeInvalidLambdaResponses","defaultStat":"Sum"},{"id":"AWS::Lex::BotAlias:RuntimeLambdaErrors","name":"RuntimeLambdaErrors","defaultStat":"Sum"},{"id":"AWS::Lex::BotAlias:MissedUtteranceCount","name":"MissedUtteranceCount","defaultStat":"Sum"},{"id":"AWS::Lex::BotAlias:RuntimePollyErrors","name":"RuntimePollyErrors","defaultStat":"Sum"},{"id":"AWS::Lex::BotAlias:RuntimeSystemErrors","name":"RuntimeSystemErrors","defaultStat":"Sum"},{"id":"AWS::Lex::BotAlias:RuntimeThrottledEvents","name":"RuntimeThrottledEvents","defaultStat":"Sum"},{"id":"AWS::Lex::BotAlias:RuntimeUserErrors","name":"RuntimeUserErrors","defaultStat":"Sum"}]}],"dashboards":[{"id":"Lex:CrossService","name":"Lex","dependencies":[{"namespace":"AWS/Lex"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Lex::BotAlias:RuntimeRequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Lex::BotAlias:RuntimeSuccessfulRequestLatency"}]}]}]},{"id":"Lex","name":"Lex","dependencies":[{"namespace":"AWS/Lex"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Lex.botAliass"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Lex::BotAlias:RuntimeRequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Lex::BotAlias:RuntimeSuccessfulRequestLatency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Lex::BotAlias:RuntimeInvalidLambdaResponses"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Lex::BotAlias:RuntimeLambdaErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Lex::BotAlias:MissedUtteranceCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Lex::BotAlias:RuntimePollyErrors"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Lex::BotAlias:RuntimeSystemErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Lex::BotAlias:RuntimeThrottledEvents"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Lex::BotAlias:RuntimeUserErrors"}]}]}]}]},{"id":"AWS::Logs","dashboard":"Logs","crossServiceDashboard":"Logs:CrossService","resourceTypes":[{"type":"AWS::Logs::LogGroup","keyMetric":"AWS::Logs::LogGroup:IncomingLogEvents","dashboard":"Logs","arnRegex":".*:log-group:(.*)"}],"controls":{"AWS::Logs.logGroups":{"type":"resource","resourceType":"AWS::Logs::LogGroup","labelField":"LogGroupName","valueField":"LogGroupName"}},"metricTemplates":[{"resourceType":"AWS::Logs::LogGroup","namespace":"AWS/Logs","dimensions":[{"dimensionName":"LogGroupName","labelName":"LogGroupName"}],"metrics":[{"id":"AWS::Logs::LogGroup:IncomingLogEvents","name":"IncomingLogEvents","defaultStat":"Sum"},{"id":"AWS::Logs::LogGroup:IncomingBytes","name":"IncomingBytes","defaultStat":"Sum"}]}],"dashboards":[{"id":"Logs:CrossService","name":"CloudWatch Logs","dependencies":[{"namespace":"AWS/Logs"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Logs::LogGroup:IncomingLogEvents"}]},{"type":"chart","properties":{"title":"DeliveryErrors Sum","legend":{"position":"right"}},"metrics":[{"metricExpression":"SEARCH(\'{AWS/Logs,LogGroupName,DestinationType,FilterName} MetricName=\\"DeliveryErrors\\"\', \'Sum\', 60)","resourceType":false}]}]}]},{"id":"Logs","name":"CloudWatch Logs","dependencies":[{"namespace":"AWS/Logs"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Logs.logGroups"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Logs::LogGroup:IncomingLogEvents"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Logs::LogGroup:IncomingBytes"}]}]}]}]},{"id":"AWS::Logs:Subscriptions","dashboard":"LogsSubscriptions","resourceTypes":[{"type":"AWS::Logs::Subscription","keyMetric":"AWS::Logs::Subscription:ForwardedLogEvents","dashboard":"LogsSubscriptions"}],"metricTemplates":[{"resourceType":"AWS::Logs::Subscription","namespace":"AWS/Logs","dimensions":[{"dimensionName":"LogGroupName","labelName":"LogGroupName"},{"dimensionName":"DestinationType","labelName":"DestinationType"},{"dimensionName":"FilterName","labelName":"FilterName"}],"metrics":[{"id":"AWS::Logs::Subscription:DeliveryErrors","name":"DeliveryErrors","defaultStat":"Sum"},{"id":"AWS::Logs::Subscription:DeliveryThrottling","name":"DeliveryThrottling","defaultStat":"Sum"},{"id":"AWS::Logs::Subscription:ForwardedBytes","name":"ForwardedBytes","defaultStat":"Sum"},{"id":"AWS::Logs::Subscription:ForwardedLogEvents","name":"ForwardedLogEvents","defaultStat":"Sum"},{"id":"AWS::Logs::Subscription:ThrottleCount","name":"ThrottleCount","defaultStat":"Sum"}]}],"dashboards":[{"id":"LogsSubscriptions","name":"CloudWatch Logs Subscriptions","dependencies":[{"namespace":"AWS/Logs"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Logs::Subscription:ForwardedBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Logs::Subscription:ForwardedLogEvents"}]}]},{"widgets":[{"type":"chart","properties":{"title":"DeliveryErrors Sum","legend":{"position":"right"}},"metrics":[{"metricExpression":"SEARCH(\'{AWS/Logs,LogGroupName,DestinationType,FilterName} MetricName=\\"DeliveryErrors\\"\', \'Sum\', 60)","resourceType":false}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Logs::Subscription:DeliveryThrottling"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Logs::Subscription:ThrottleCount"}]}]}]}]},{"id":"AWS::MediaConvert::Queue","dashboard":"MediaConvert","crossServiceDashboard":"MediaConvert:CrossService","resourceTypes":[{"type":"AWS::MediaConvert::Queue","keyMetric":"AWS::MediaConvert::Queue:TranscodingTime","dashboard":"MediaConvert","arnRegex":".*:queues/(.*)"}],"metricTemplates":[{"resourceType":"AWS::MediaConvert::Queue","namespace":"AWS/MediaConvert","dimensions":[{"dimensionName":"Queue","labelName":"Queue"}],"metrics":[{"id":"AWS::MediaConvert::Queue:TranscodingTime","name":"TranscodingTime","defaultStat":"Average"},{"id":"AWS::MediaConvert::Queue:JobsCompletedCount","name":"JobsCompletedCount","defaultStat":"Sum"},{"id":"AWS::MediaConvert::Queue:8KOutputDuration","name":"8KOutputDuration","defaultStat":"Average"},{"id":"AWS::MediaConvert::Queue:AudioOutputDuration","name":"AudioOutputDuration","defaultStat":"Average"},{"id":"AWS::MediaConvert::Queue:HDOutputDuration","name":"HDOutputDuration","defaultStat":"Average"},{"id":"AWS::MediaConvert::Queue:JobsErroredCount","name":"JobsErroredCount","defaultStat":"Sum"},{"id":"AWS::MediaConvert::Queue:SDOutputDuration","name":"SDOutputDuration","defaultStat":"Average"},{"id":"AWS::MediaConvert::Queue:StandbyTime","name":"StandbyTime","defaultStat":"Sum"},{"id":"AWS::MediaConvert::Queue:UHDOutputDuration","name":"UHDOutputDuration","defaultStat":"Average"}]}],"dashboards":[{"id":"MediaConvert:CrossService","name":"MediaConvert","dependencies":[{"namespace":"AWS/MediaConvert"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaConvert::Queue:TranscodingTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaConvert::Queue:JobsCompletedCount"}]}]}]},{"id":"MediaConvert","name":"MediaConvert","dependencies":[{"namespace":"AWS/MediaConvert"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaConvert::Queue:TranscodingTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaConvert::Queue:JobsCompletedCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaConvert::Queue:8KOutputDuration"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaConvert::Queue:AudioOutputDuration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaConvert::Queue:HDOutputDuration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaConvert::Queue:JobsErroredCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaConvert::Queue:SDOutputDuration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaConvert::Queue:StandbyTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaConvert::Queue:UHDOutputDuration"}]}]}]}]},{"id":"AWS::MediaLive","dashboard":"MediaLive","crossServiceDashboard":"MediaLive:CrossService","resourceTypes":[{"type":"AWS::MediaLive::Channel","keyMetric":"AWS::MediaLive::Channel:ActiveAlerts","dashboard":"MediaLive","arnRegex":".*:medialive:channel:(.*)"},{"type":"AWS::MediaLive::Channel:ActiveInputFailoverLabel","keyMetric":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:InputVideoFrameRate","dashboard":"MediaLive"},{"type":"AWS::MediaLive::Channel:OutputGroupName","keyMetric":"AWS::MediaLive::Channel:OutputGroupName:ActiveOutputs","dashboard":"MediaLive"},{"type":"AWS::MediaLive::Channel:AudioDescriptionName","keyMetric":"AWS::MediaLive::Channel:AudioDescriptionName:AudioLevel","dashboard":"MediaLive"}],"controls":{"AWS::MediaLive.channel":{"type":"resource","resourceType":"AWS::MediaLive::Channel","labelField":"ChannelId","valueField":"ChannelId"}},"metricTemplates":[{"resourceType":"AWS::MediaLive::Channel","namespace":"AWS/MediaLive","dimensions":[{"dimensionName":"ChannelId","labelName":"ChannelId"},{"dimensionName":"Pipeline","labelName":"Pipeline"}],"metrics":[{"id":"AWS::MediaLive::Channel:ActiveAlerts","name":"ActiveAlerts","defaultStat":"Maximum"},{"id":"AWS::MediaLive::Channel:InputVideoFrameRate","name":"InputVideoFrameRate","defaultStat":"Average"},{"id":"AWS::MediaLive::Channel:FillMsec","name":"FillMsec","defaultStat":"Average"},{"id":"AWS::MediaLive::Channel:InputLossSeconds","name":"InputLossSeconds","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:RtpPacketsReceived","name":"RtpPacketsReceived","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:RtpPacketsRecoveredViaFec","name":"RtpPacketsRecoveredViaFec","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:RtpPacketsLost","name":"RtpPacketsLost","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:FecRowPacketsReceived","name":"FecRowPacketsReceived","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:FecColumnPacketsReceived","name":"FecColumnPacketsReceived","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:PrimaryInputActive","name":"PrimaryInputActive","defaultStat":"Minimum"},{"id":"AWS::MediaLive::Channel:NetworkIn","name":"NetworkIn","defaultStat":"Average"},{"id":"AWS::MediaLive::Channel:NetworkOut","name":"NetworkOut","defaultStat":"Average"},{"id":"AWS::MediaLive::Channel:PipelinesLocked","name":"PipelinesLocked","defaultStat":"Minimum"},{"id":"AWS::MediaLive::Channel:InputTimecodesPresent","name":"InputTimecodesPresent","defaultStat":"Minimum"}]},{"resourceType":"AWS::MediaLive::Channel:ActiveInputFailoverLabel","namespace":"AWS/MediaLive","dimensions":[{"dimensionName":"ActiveInputFailoverLabel","labelName":"ActiveInputFailoverLabel"},{"dimensionName":"ChannelId","labelName":"ChannelId"},{"dimensionName":"Pipeline","labelName":"Pipeline"}],"metrics":[{"id":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:InputVideoFrameRate","name":"InputVideoFrameRate","defaultStat":"Average"},{"id":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:InputLossSeconds","name":"InputLossSeconds","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:RtpPacketsReceived","name":"RtpPacketsReceived","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:RtpPacketsRecoveredViaFec","name":"RtpPacketsRecoveredViaFec","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:RtpPacketsLost","name":"RtpPacketsLost","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:FecRowPacketsReceived","name":"FecRowPacketsReceived","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:FecColumnPacketsReceived","name":"FecColumnPacketsReceived","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:InputTimecodesPresent","name":"InputTimecodesPresent","defaultStat":"Minimum"}]},{"resourceType":"AWS::MediaLive::Channel:OutputGroupName","namespace":"AWS/MediaLive","dimensions":[{"dimensionName":"OutputGroupName","labelName":"OutputGroupName"},{"dimensionName":"ChannelId","labelName":"ChannelId"},{"dimensionName":"Pipeline","labelName":"Pipeline"}],"metrics":[{"id":"AWS::MediaLive::Channel:OutputGroupName:ActiveOutputs","name":"ActiveOutputs","defaultStat":"Maximum"},{"id":"AWS::MediaLive::Channel:OutputGroupName:Output4xxErrors","name":"Output4xxErrors","defaultStat":"Sum"},{"id":"AWS::MediaLive::Channel:OutputGroupName:Output5xxErrors","name":"Output5xxErrors","defaultStat":"Sum"}]},{"resourceType":"AWS::MediaLive::Channel:AudioDescriptionName","namespace":"AWS/MediaLive","dimensions":[{"dimensionName":"AudioDescriptionName","labelName":"AudioDescriptionName"},{"dimensionName":"ChannelId","labelName":"ChannelId"},{"dimensionName":"Pipeline","labelName":"Pipeline"}],"metrics":[{"id":"AWS::MediaLive::Channel:AudioDescriptionName:AudioLevel","name":"AudioLevel","defaultStat":"Maximum"},{"id":"AWS::MediaLive::Channel:AudioDescriptionName:OutputAudioLevelDbfs","name":"OutputAudioLevelDbfs","defaultStat":"Maximum"},{"id":"AWS::MediaLive::Channel:AudioDescriptionName:OutputAudioLevelLkfs","name":"OutputAudioLevelLkfs","defaultStat":"Maximum"}]}],"dashboards":[{"id":"MediaLive:CrossService","name":"MediaLive","dependencies":[{"namespace":"AWS/MediaLive"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:ActiveAlerts"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:InputVideoFrameRate"}]}]}]},{"id":"MediaLive","name":"MediaLive","dependencies":[{"namespace":"AWS/MediaLive"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::MediaLive.channel"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:ActiveAlerts"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:InputVideoFrameRate"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:InputVideoFrameRate"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:FillMsec"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:InputLossSeconds"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:InputLossSeconds"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:RtpPacketsReceived"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:RtpPacketsReceived"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:RtpPacketsRecoveredViaFec"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:RtpPacketsRecoveredViaFec"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:RtpPacketsLost"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:RtpPacketsLost"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:FecRowPacketsReceived"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:FecRowPacketsReceived"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:FecColumnPacketsReceived"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:FecColumnPacketsReceived"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:OutputGroupName:ActiveOutputs"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:OutputGroupName:Output4xxErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:OutputGroupName:Output5xxErrors"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:PrimaryInputActive"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:NetworkIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:NetworkOut"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:AudioDescriptionName:OutputAudioLevelDbfs"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:AudioDescriptionName:OutputAudioLevelLkfs"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:PipelinesLocked"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:InputTimecodesPresent"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaLive::Channel:ActiveInputFailoverLabel:InputTimecodesPresent"}]}]}]}]},{"id":"AWS::MediaPackage","dashboard":"MediaPackage","crossServiceDashboard":"MediaPackage:CrossService","resourceTypes":[{"type":"AWS::MediaPackage::Channel","keyMetric":"AWS::MediaPackage::Channel:EgressRequestCount","arnRegex":".*:channels/(.*)"},{"type":"CW::MediaPackage::Channel","keyMetric":"CW::MediaPackage::Channel:EgressRequestCount","dashboard":"MediaPackage","arnRegex":".*:channels/(.*)"}],"controls":{"AWS::MediaPackage.channels":{"type":"resource","resourceType":"CW::MediaPackage::Channel","labelField":"Channel","valueField":"Channel"}},"metricTemplates":[{"resourceType":"AWS::MediaPackage::Channel","namespace":"AWS/MediaPackage","dimensions":[{"dimensionName":"Channel","labelName":"Channel"}],"metrics":[{"id":"AWS::MediaPackage::Channel:EgressRequestCount","name":"EgressRequestCount","defaultStat":"Sum"},{"id":"AWS::MediaPackage::Channel:EgressResponseTime","name":"EgressResponseTime","defaultStat":"Average"},{"id":"AWS::MediaPackage::Channel:EgressBytes","name":"EgressBytes","defaultStat":"Sum"}]},{"resourceType":"CW::MediaPackage::Channel","namespace":"AWS/MediaPackage","dimensions":[{"dimensionName":"Channel","labelName":"Channel"},{"dimensionName":"OriginEndpoint","labelName":"OriginEndpoint"}],"metrics":[{"id":"CW::MediaPackage::Channel:EgressRequestCount","name":"EgressRequestCount","defaultStat":"Sum"},{"id":"CW::MediaPackage::Channel:EgressResponseTime","name":"EgressResponseTime","defaultStat":"Average"},{"id":"CW::MediaPackage::Channel:EgressBytes","name":"EgressBytes","defaultStat":"Sum"}]}],"dashboards":[{"id":"MediaPackage:CrossService","name":"MediaPackage","dependencies":[{"namespace":"AWS/MediaPackage"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::MediaPackage::Channel:EgressRequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::MediaPackage::Channel:EgressResponseTime"}]}]}]},{"id":"MediaPackage","name":"MediaPackage","dependencies":[{"namespace":"AWS/MediaPackage"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::MediaPackage.channels"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::MediaPackage::Channel:EgressRequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::MediaPackage::Channel:EgressResponseTime"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::MediaPackage::Channel:EgressBytes"}]}]}]}]},{"id":"AWS::MediaStore::Container","dashboard":"MediaStore","crossServiceDashboard":"MediaStore:CrossService","resourceTypes":[{"type":"AWS::MediaStore::Container","keyMetric":"AWS::MediaStore::Container:RequestCount","dashboard":"MediaStore","arnRegex":".*:container/(.*)"}],"metricTemplates":[{"resourceType":"AWS::MediaStore::Container","namespace":"AWS/MediaStore","dimensions":[{"dimensionName":"ContainerName","labelName":"ContainerName"}],"metrics":[{"id":"AWS::MediaStore::Container:RequestCount","name":"RequestCount","defaultStat":"Sum"},{"id":"AWS::MediaStore::Container:TurnaroundTime","name":"TurnaroundTime","defaultStat":"Average"},{"id":"AWS::MediaStore::Container:4xxErrorCount","name":"4xxErrorCount","defaultStat":"Sum"},{"id":"AWS::MediaStore::Container:5xxErrorCount","name":"5xxErrorCount","defaultStat":"Sum"},{"id":"AWS::MediaStore::Container:BytesDownloaded","name":"BytesDownloaded","defaultStat":"Sum"},{"id":"AWS::MediaStore::Container:BytesUploaded","name":"BytesUploaded","defaultStat":"Sum"},{"id":"AWS::MediaStore::Container:TotalTime","name":"TotalTime","defaultStat":"Average"}]}],"dashboards":[{"id":"MediaStore:CrossService","name":"MediaStore","dependencies":[{"namespace":"AWS/MediaStore"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaStore::Container:RequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaStore::Container:TurnaroundTime"}]}]}]},{"id":"MediaStore","name":"MediaStore","dependencies":[{"namespace":"AWS/MediaStore"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaStore::Container:RequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaStore::Container:TurnaroundTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaStore::Container:4xxErrorCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaStore::Container:5xxErrorCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaStore::Container:BytesDownloaded"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaStore::Container:BytesUploaded"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaStore::Container:TotalTime"}]}]}]}]},{"id":"AWS::MediaTailor","dashboard":"MediaTailor","crossServiceDashboard":"MediaTailor:CrossService","resourceTypes":[{"type":"AWS::MediaTailor::Configuration","keyMetric":"AWS::MediaTailor::Configuration:AdDecisionServer.Ads","dashboard":"MediaTailor"}],"controls":{"AWS::MediaTailor.configurations":{"type":"resource","resourceType":"AWS::MediaTailor::Configuration","labelField":"ConfigurationName","valueField":"ConfigurationName"}},"metricTemplates":[{"resourceType":"AWS::MediaTailor::Configuration","namespace":"AWS/MediaTailor","dimensions":[{"dimensionName":"ConfigurationName","labelName":"ConfigurationName"}],"metrics":[{"id":"AWS::MediaTailor::Configuration:AdDecisionServer.Ads","name":"AdDecisionServer.Ads","defaultStat":"Sum"},{"id":"AWS::MediaTailor::Configuration:AdDecisionServer.Duration","name":"AdDecisionServer.Duration","defaultStat":"Average"},{"id":"AWS::MediaTailor::Configuration:AdDecisionServer.Errors","name":"AdDecisionServer.Errors","defaultStat":"Sum"},{"id":"AWS::MediaTailor::Configuration:AdDecisionServer.FillRate","name":"AdDecisionServer.FillRate","defaultStat":"Sum"},{"id":"AWS::MediaTailor::Configuration:AdDecisionServer.Latency","name":"AdDecisionServer.Latency","defaultStat":"Average"},{"id":"AWS::MediaTailor::Configuration:AdNotReady","name":"AdNotReady","defaultStat":"Sum"},{"id":"AWS::MediaTailor::Configuration:Avail.Duration","name":"Avail.Duration","defaultStat":"Sum"},{"id":"AWS::MediaTailor::Configuration:Avail.FillRate","name":"Avail.FillRate","defaultStat":"Sum"},{"id":"AWS::MediaTailor::Configuration:Avail.FilledDuration","name":"Avail.FilledDuration","defaultStat":"Average"},{"id":"AWS::MediaTailor::Configuration:GetManifest.Errors","name":"GetManifest.Errors","defaultStat":"Sum"},{"id":"AWS::MediaTailor::Configuration:GetManifest.Latency","name":"GetManifest.Latency","defaultStat":"Average"},{"id":"AWS::MediaTailor::Configuration:Origin.Errors","name":"Origin.Errors","defaultStat":"Sum"},{"id":"AWS::MediaTailor::Configuration:Origin.Latency","name":"Origin.Latency","defaultStat":"Average"}]}],"dashboards":[{"id":"MediaTailor:CrossService","name":"MediaTailor","dependencies":[{"namespace":"AWS/MediaTailor"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:AdDecisionServer.Ads"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:AdDecisionServer.Duration"}]}]}]},{"id":"MediaTailor","name":"MediaTailor","dependencies":[{"namespace":"AWS/MediaTailor"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::MediaTailor.configurations"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:AdDecisionServer.Ads"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:AdDecisionServer.Duration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:AdDecisionServer.Errors"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:AdDecisionServer.FillRate"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:AdDecisionServer.Latency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:AdNotReady"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:Avail.Duration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:Avail.FillRate"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:Avail.FilledDuration"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:GetManifest.Errors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:GetManifest.Latency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:Origin.Errors"}]}]},{"widgets":[{"type":"chart","width":8,"metrics":[{"metricTemplate":"AWS::MediaTailor::Configuration:Origin.Latency"}]}]}]}]},{"id":"AWS::MetricStreams","dashboard":"MetricStreams","crossServiceDashboard":"MetricStreams:CrossService","resourceTypes":[{"type":"AWS::CloudWatch::MetricStream","keyMetric":"AWS::CloudWatch::MetricStream:MetricUpdate","arnRegex":".*:metric-stream/(.*)","dashboard":"MetricStreams"}],"controls":{"AWS::MetricStreams.streams":{"type":"resource","resourceType":"AWS::CloudWatch::MetricStream","labelField":"MetricStreamName","valueField":"MetricStreamName"}},"metricTemplates":[{"resourceType":"AWS::CloudWatch::MetricStream","namespace":"AWS/CloudWatch/MetricStreams","dimensions":[{"dimensionName":"MetricStreamName","labelName":"MetricStreamName"}],"metrics":[{"id":"AWS::CloudWatch::MetricStream:MetricUpdate","name":"MetricUpdate","defaultStat":"Sum"},{"id":"AWS::CloudWatch::MetricStream:PublishErrorRate","name":"PublishErrorRate","defaultStat":"Average"}]}],"dashboards":[{"id":"MetricStreams:CrossService","name":"Metric Streams","dependencies":[{"namespace":"AWS/CloudWatch/MetricStreams"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudWatch::MetricStream:MetricUpdate"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudWatch::MetricStream:PublishErrorRate"}]}]}]},{"id":"MetricStreams","name":"Metric Streams","dependencies":[{"namespace":"AWS/CloudWatch/MetricStreams"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::MetricStreams.streams"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudWatch::MetricStream:MetricUpdate"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::CloudWatch::MetricStream:PublishErrorRate"}]}]}]}]},{"id":"AWS::MGN","dashboard":"MGN","crossServiceDashboard":"MGN:CrossService","resourceTypes":[{"type":"AWS::MGN::SourceServer","keyMetric":"AWS::MGN::SourceServer:LagDuration","dashboard":"MGN","arnRegex":".*:source-server/(.*)"},{"type":"AWS::MGN::SourceServer:AcrossAllServers","keyMetric":"AWS::MGN::SourceServer:AcrossAllServers:ActiveSourceServerCount","dashboard":"MGN"}],"metricTemplates":[{"resourceType":"AWS::MGN::SourceServer","namespace":"AWS/MGN","dimensions":[{"dimensionName":"SourceServerID","labelName":"SourceServerID"}],"metrics":[{"id":"AWS::MGN::SourceServer:LagDuration","name":"LagDuration","defaultStat":"Average"},{"id":"AWS::MGN::SourceServer:Backlog","name":"Backlog","defaultStat":"Average"},{"id":"AWS::MGN::SourceServer:DurationSinceLastTest","name":"DurationSinceLastTest","defaultStat":"Maximum"},{"id":"AWS::MGN::SourceServer:ElapsedReplicationDuration","name":"ElapsedReplicationDuration","defaultStat":"Maximum"}]},{"resourceType":"AWS::MGN::SourceServer:AcrossAllServers","namespace":"AWS/MGN","dimensions":[],"metrics":[{"id":"AWS::MGN::SourceServer:AcrossAllServers:ActiveSourceServerCount","name":"ActiveSourceServerCount","defaultStat":"Average"},{"id":"AWS::MGN::SourceServer:AcrossAllServers:TotalSourceServerCount","name":"TotalSourceServerCount","defaultStat":"Average"}]}],"dashboards":[{"id":"MGN:CrossService","name":"Application Migration Service","dependencies":[{"namespace":"AWS/MGN"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MGN::SourceServer:LagDuration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MGN::SourceServer:AcrossAllServers:ActiveSourceServerCount"}]}]}]},{"id":"MGN","name":"Application Migration Service","dependencies":[{"namespace":"AWS/MGN"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MGN::SourceServer:LagDuration"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MGN::SourceServer:Backlog"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MGN::SourceServer:DurationSinceLastTest"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MGN::SourceServer:ElapsedReplicationDuration"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::MGN::SourceServer:AcrossAllServers:ActiveSourceServerCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::MGN::SourceServer:AcrossAllServers:TotalSourceServerCount"}]}]}]}]},{"id":"AWS::EC2::NATGateway","dashboard":"NATGateway","crossServiceDashboard":"NATGateway:CrossService","resourceTypes":[{"type":"AWS::EC2::NatGateway","keyMetric":"AWS::EC2::NatGateway:ActiveConnectionCount","dashboard":"NATGateway","arnRegex":".*:natgateway/(.*)"}],"controls":{"AWS::EC2::NATGateway.natGateways":{"type":"resource","resourceType":"AWS::EC2::NatGateway","labelField":"NatGatewayId","valueField":"NatGatewayId"}},"metricTemplates":[{"resourceType":"AWS::EC2::NatGateway","namespace":"AWS/NATGateway","dimensions":[{"dimensionName":"NatGatewayId","labelName":"NatGatewayId"}],"metrics":[{"id":"AWS::EC2::NatGateway:ActiveConnectionCount","name":"ActiveConnectionCount","defaultStat":"Maximum"},{"id":"AWS::EC2::NatGateway:PacketsDropCount","name":"PacketsDropCount","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:BytesInFromDestination","name":"BytesInFromDestination","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:BytesInFromSource","name":"BytesInFromSource","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:BytesOutToDestination","name":"BytesOutToDestination","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:BytesOutToSource","name":"BytesOutToSource","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:ConnectionAttemptCount","name":"ConnectionAttemptCount","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:ConnectionEstablishedCount","name":"ConnectionEstablishedCount","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:ErrorPortAllocation","name":"ErrorPortAllocation","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:IdleTimeoutCount","name":"IdleTimeoutCount","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:PacketsInFromDestination","name":"PacketsInFromDestination","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:PacketsInFromSource","name":"PacketsInFromSource","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:PacketsOutToDestination","name":"PacketsOutToDestination","defaultStat":"Sum"},{"id":"AWS::EC2::NatGateway:PacketsOutToSource","name":"PacketsOutToSource","defaultStat":"Sum"}]}],"dashboards":[{"id":"NATGateway:CrossService","name":"VPC NAT Gateways","dependencies":[{"namespace":"AWS/NATGateway"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:ActiveConnectionCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:PacketsDropCount"}]}]}]},{"id":"NATGateway","name":"VPC NAT Gateways","dependencies":[{"namespace":"AWS/NATGateway"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::EC2::NATGateway.natGateways"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:ActiveConnectionCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:PacketsDropCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:BytesInFromDestination"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:BytesInFromSource"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:BytesOutToDestination"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:BytesOutToSource"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:ConnectionAttemptCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:ConnectionEstablishedCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:ErrorPortAllocation"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:IdleTimeoutCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:PacketsInFromDestination"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:PacketsInFromSource"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:PacketsOutToDestination"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::NatGateway:PacketsOutToSource"}]}]}]}]},{"id":"AWS::Neptune","dashboard":"Neptune","crossServiceDashboard":"Neptune:CrossService","resourceTypes":[{"type":"AWS::Neptune::DBCluster","keyMetric":"AWS::Neptune::DBCluster:CPUUtilization","dashboard":"Neptune"}],"controls":{"AWS::Neptune.dBClusters":{"type":"resource","resourceType":"AWS::Neptune::DBCluster","labelField":"DBClusterIdentifier","valueField":"DBClusterIdentifier"}},"metricTemplates":[{"resourceType":"AWS::Neptune::DBCluster","namespace":"AWS/Neptune","dimensions":[{"dimensionName":"DBClusterIdentifier","labelName":"DBClusterIdentifier"}],"metrics":[{"id":"AWS::Neptune::DBCluster:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::Neptune::DBCluster:FreeLocalStorage","name":"FreeLocalStorage","defaultStat":"Minimum"},{"id":"AWS::Neptune::DBCluster:FreeableMemory","name":"FreeableMemory","defaultStat":"Minimum"},{"id":"AWS::Neptune::DBCluster:GremlinErrors","name":"GremlinErrors","defaultStat":"Sum"},{"id":"AWS::Neptune::DBCluster:GremlinRequests","name":"GremlinRequests","defaultStat":"Sum"},{"id":"AWS::Neptune::DBCluster:GremlinRequestsPerSec","name":"GremlinRequestsPerSec","defaultStat":"Average"},{"id":"AWS::Neptune::DBCluster:Http413","name":"Http413","defaultStat":"Sum"},{"id":"AWS::Neptune::DBCluster:Http500","name":"Http500","defaultStat":"Sum"},{"id":"AWS::Neptune::DBCluster:LoaderRequests","name":"LoaderRequests","defaultStat":"Sum"},{"id":"AWS::Neptune::DBCluster:NetworkReceiveThroughput","name":"NetworkReceiveThroughput","defaultStat":"Sum"},{"id":"AWS::Neptune::DBCluster:SparqlErrors","name":"SparqlErrors","defaultStat":"Sum"},{"id":"AWS::Neptune::DBCluster:SparqlRequestsPerSec","name":"SparqlRequestsPerSec","defaultStat":"Sum"},{"id":"AWS::Neptune::DBCluster:VolumeBytesUsed","name":"VolumeBytesUsed","defaultStat":"Sum"},{"id":"AWS::Neptune::DBCluster:VolumeReadIOPs","name":"VolumeReadIOPs","defaultStat":"Sum"},{"id":"AWS::Neptune::DBCluster:VolumeWriteIOPs","name":"VolumeWriteIOPs","defaultStat":"Sum"}]}],"dashboards":[{"id":"Neptune:CrossService","name":"Neptune","dependencies":[{"namespace":"AWS/Neptune"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:FreeLocalStorage"}]}]}]},{"id":"Neptune","name":"Neptune","dependencies":[{"namespace":"AWS/Neptune"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Neptune.dBClusters"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:FreeLocalStorage"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:FreeableMemory"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:GremlinErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:GremlinRequests"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:GremlinRequestsPerSec"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:Http413"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:Http500"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:LoaderRequests"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:NetworkReceiveThroughput"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:SparqlErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:SparqlRequestsPerSec"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:VolumeBytesUsed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:VolumeReadIOPs"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Neptune::DBCluster:VolumeWriteIOPs"}]}]}]}]},{"id":"AWS::NetworkELB","dashboard":"NetworkELB","crossServiceDashboard":"NetworkELB:CrossService","resourceTypes":[{"type":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB","entityType":"AWS::ElasticLoadBalancingV2::LoadBalancer","keyMetric":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ConsumedLCUs","dashboard":"NetworkELB","arnRegex":".*:loadbalancer/(net/.*)"},{"type":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:LoadBalancer:TargetGroup","entityType":"AWS::ElasticLoadBalancingV2::LoadBalancer","keyMetric":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:LoadBalancer:TargetGroup:HealthyHostCount","dashboard":"NetworkELB","arnRegex":".*:loadbalancer/(net/.*)"}],"controls":{"AWS::NetworkELB.loadBalancers":{"type":"resource","resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB","labelField":"LoadBalancer","valueField":"LoadBalancer"}},"metricTemplates":[{"resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB","namespace":"AWS/NetworkELB","dimensions":[{"dimensionName":"LoadBalancer","labelName":"LoadBalancer"}],"metrics":[{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ActiveFlowCount","name":"ActiveFlowCount","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ActiveFlowCount_TCP","name":"ActiveFlowCount_TCP","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ActiveFlowCount_TLS","name":"ActiveFlowCount_TLS","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ActiveFlowCount_UDP","name":"ActiveFlowCount_UDP","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ClientTLSNegotiationErrorCount","name":"ClientTLSNegotiationErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ConsumedLCUs","name":"ConsumedLCUs","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ConsumedLCUs_TCP","name":"ConsumedLCUs_TCP","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ConsumedLCUs_TLS","name":"ConsumedLCUs_TLS","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ConsumedLCUs_UDP","name":"ConsumedLCUs_UDP","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:NewFlowCount","name":"NewFlowCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:NewFlowCount_TCP","name":"NewFlowCount_TCP","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:NewFlowCount_TLS","name":"NewFlowCount_TLS","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:NewFlowCount_UDP","name":"NewFlowCount_UDP","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ProcessedBytes","name":"ProcessedBytes","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ProcessedBytes_TCP","name":"ProcessedBytes_TCP","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ProcessedBytes_TLS","name":"ProcessedBytes_TLS","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ProcessedBytes_UDP","name":"ProcessedBytes_UDP","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:TargetTLSNegotiationErrorCount","name":"TargetTLSNegotiationErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:TCP_Client_Reset_Count","name":"TCP_Client_Reset_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:TCP_ELB_Reset_Count","name":"TCP_ELB_Reset_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:TCP_Target_Reset_Count","name":"TCP_Target_Reset_Count","defaultStat":"Sum"}]},{"resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB","id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer","namespace":"AWS/NetworkELB","dimensions":[{"dimensionName":"AvailabilityZone","labelName":"AvailabilityZone"},{"dimensionName":"LoadBalancer","labelName":"LoadBalancer"}],"metrics":[{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:ActiveFlowCount","name":"ActiveFlowCount","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:ActiveFlowCount_TCP","name":"ActiveFlowCount_TCP","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:ActiveFlowCount_TLS","name":"ActiveFlowCount_TLS","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:ActiveFlowCount_UDP","name":"ActiveFlowCount_UDP","defaultStat":"Average"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:ClientTLSNegotiationErrorCount","name":"ClientTLSNegotiationErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:NewFlowCount","name":"NewFlowCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:NewFlowCount_TCP","name":"NewFlowCount_TCP","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:NewFlowCount_TLS","name":"NewFlowCount_TLS","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:NewFlowCount_UDP","name":"NewFlowCount_UDP","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:ProcessedBytes","name":"ProcessedBytes","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:ProcessedBytes_TCP","name":"ProcessedBytes_TCP","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:ProcessedBytes_TLS","name":"ProcessedBytes_TLS","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:ProcessedBytes_UDP","name":"ProcessedBytes_UDP","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:TargetTLSNegotiationErrorCount","name":"TargetTLSNegotiationErrorCount","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:TCP_Client_Reset_Count","name":"TCP_Client_Reset_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:TCP_ELB_Reset_Count","name":"TCP_ELB_Reset_Count","defaultStat":"Sum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:TCP_Target_Reset_Count","name":"TCP_Target_Reset_Count","defaultStat":"Sum"}]},{"resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:LoadBalancer:TargetGroup","namespace":"AWS/NetworkELB","dimensions":[{"dimensionName":"LoadBalancer","labelName":"LoadBalancer"},{"dimensionName":"TargetGroup","labelName":"TargetGroup"}],"metrics":[{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:LoadBalancer:TargetGroup:HealthyHostCount","name":"HealthyHostCount","defaultStat":"Minimum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:LoadBalancer:TargetGroup:UnHealthyHostCount","name":"UnHealthyHostCount","defaultStat":"Maximum"}]},{"resourceType":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB","id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:TargetGroup","namespace":"AWS/NetworkELB","dimensions":[{"dimensionName":"AvailabilityZone","labelName":"AvailabilityZone"},{"dimensionName":"LoadBalancer","labelName":"LoadBalancer"},{"dimensionName":"TargetGroup","labelName":"TargetGroup"}],"metrics":[{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:TargetGroup:HealthyHostCount","name":"HealthyHostCount","defaultStat":"Minimum"},{"id":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:AvailabilityZone:LoadBalancer:TargetGroup:UnHealthyHostCount","name":"UnHealthyHostCount","defaultStat":"Maximum"}]}],"dashboards":[{"id":"NetworkELB:CrossService","name":"Network ELB","dependencies":[{"namespace":"AWS/NetworkELB"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:LoadBalancer:TargetGroup:HealthyHostCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:LoadBalancer:TargetGroup:UnHealthyHostCount"}]}]}]},{"id":"NetworkELB","name":"Network ELB","dependencies":[{"namespace":"AWS/NetworkELB"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::NetworkELB.loadBalancers"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:LoadBalancer:TargetGroup:HealthyHostCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:LoadBalancer:TargetGroup:UnHealthyHostCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ActiveFlowCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ConsumedLCUs"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:NewFlowCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:ProcessedBytes"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:TCP_Client_Reset_Count"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:TCP_ELB_Reset_Count"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::ElasticLoadBalancingV2::LoadBalancer/NetworkELB:TCP_Target_Reset_Count"}]}]}]}]},{"id":"AWS::OpsWorks::Instance","dashboard":"OpsWorks:Instance","crossServiceDashboard":"OpsWorks:CrossService","resourceTypes":[{"type":"AWS::OpsWorks::Instance","keyMetric":"AWS::OpsWorks::Instance:procs","dashboard":"OpsWorks:Instance","arnRegex":".*:instance/(.*)"},{"type":"AWS::OpsWorks::Layer","keyMetric":"AWS::OpsWorks::Layer:cpu_user","dashboard":"OpsWorks:Layer","arnRegex":".*:layer/(.*)"},{"type":"AWS::OpsWorks::Stack","keyMetric":"AWS::OpsWorks::Stack:cpu_user","dashboard":"OpsWorks:Stack","arnRegex":".*:stack/(.*)/"}],"metricTemplates":[{"resourceType":"AWS::OpsWorks::Instance","namespace":"AWS/OpsWorks","dimensions":[{"dimensionName":"InstanceId","labelName":"InstanceId"}],"metrics":[{"id":"AWS::OpsWorks::Instance:procs","name":"procs","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:memory_used","name":"memory_used","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:cpu_idle","name":"cpu_idle","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:cpu_nice","name":"cpu_nice","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:cpu_steal","name":"cpu_steal","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:cpu_system","name":"cpu_system","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:cpu_user","name":"cpu_user","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:cpu_waitio","name":"cpu_waitio","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:load_1","name":"load_1","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:load_15","name":"load_15","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:load_5","name":"load_5","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:memory_buffers","name":"memory_buffers","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:memory_cached","name":"memory_cached","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:memory_free","name":"memory_free","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:memory_swap","name":"memory_swap","defaultStat":"Average"},{"id":"AWS::OpsWorks::Instance:memory_total","name":"memory_total","defaultStat":"Average"}]},{"id":"AWS::OpsWorks::Instance::Maximum","resourceType":"AWS::OpsWorks::Instance","namespace":"AWS/OpsWorks","dimensions":[{"dimensionName":"InstanceId","labelName":"InstanceId"}],"metrics":[{"id":"AWS::OpsWorks::Instance::Maximum:memory_used","name":"memory_used","defaultStat":"Maximum"},{"id":"AWS::OpsWorks::Instance::Maximum:load_1","name":"load_1","defaultStat":"Maximum"}]},{"resourceType":"AWS::OpsWorks::Layer","namespace":"AWS/OpsWorks","dimensions":[{"dimensionName":"LayerId","labelName":"LayerId"}],"metrics":[{"id":"AWS::OpsWorks::Layer:cpu_user","name":"cpu_user","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:load_1","name":"load_1","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:cpu_idle","name":"cpu_idle","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:cpu_nice","name":"cpu_nice","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:cpu_steal","name":"cpu_steal","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:cpu_system","name":"cpu_system","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:cpu_waitio","name":"cpu_waitio","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:load_15","name":"load_15","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:load_5","name":"load_5","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:memory_buffers","name":"memory_buffers","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:memory_cached","name":"memory_cached","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:memory_free","name":"memory_free","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:memory_swap","name":"memory_swap","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:memory_total","name":"memory_total","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:memory_used","name":"memory_used","defaultStat":"Average"},{"id":"AWS::OpsWorks::Layer:procs","name":"procs","defaultStat":"Average"}]},{"id":"AWS::OpsWorks::Layer::Maximum","resourceType":"AWS::OpsWorks::Layer","namespace":"AWS/OpsWorks","dimensions":[{"dimensionName":"LayerId","labelName":"LayerId"}],"metrics":[{"id":"AWS::OpsWorks::Layer::Maximum:memory_used","name":"memory_used","defaultStat":"Maximum"},{"id":"AWS::OpsWorks::Layer::Maximum:load_1","name":"load_1","defaultStat":"Maximum"}]},{"resourceType":"AWS::OpsWorks::Stack","namespace":"AWS/OpsWorks","dimensions":[{"dimensionName":"StackId","labelName":"StackId"}],"metrics":[{"id":"AWS::OpsWorks::Stack:cpu_user","name":"cpu_user","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:load_1","name":"load_1","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:cpu_idle","name":"cpu_idle","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:cpu_nice","name":"cpu_nice","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:cpu_steal","name":"cpu_steal","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:cpu_system","name":"cpu_system","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:cpu_waitio","name":"cpu_waitio","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:load_15","name":"load_15","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:load_5","name":"load_5","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:memory_buffers","name":"memory_buffers","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:memory_cached","name":"memory_cached","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:memory_free","name":"memory_free","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:memory_swap","name":"memory_swap","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:memory_total","name":"memory_total","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:memory_used","name":"memory_used","defaultStat":"Average"},{"id":"AWS::OpsWorks::Stack:procs","name":"procs","defaultStat":"Average"}]},{"id":"AWS::OpsWorks::Stack::Maximum","resourceType":"AWS::OpsWorks::Stack","namespace":"AWS/OpsWorks","dimensions":[{"dimensionName":"StackId","labelName":"StackId"}],"metrics":[{"id":"AWS::OpsWorks::Stack::Maximum:memory_used","name":"memory_used","defaultStat":"Maximum"},{"id":"AWS::OpsWorks::Stack::Maximum:load_1","name":"load_1","defaultStat":"Maximum"}]}],"dashboards":[{"id":"OpsWorks:CrossService","name":"OpsWorks","dependencies":[{"namespace":"AWS/OpsWorks"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:memory_used"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance::Maximum:load_1"}]}]}]},{"id":"OpsWorks:Instance","name":"OpsWorks Instances","dependencies":[{"namespace":"AWS/OpsWorks"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance::Maximum:memory_used"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:load_1"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_idle"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_nice"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_steal"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_system"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_user"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_waitio"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:load_5"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:load_15"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:memory_buffers"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:memory_cached"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:memory_free"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:memory_swap"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:memory_total"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:procs"}]}]}]},{"id":"OpsWorks:Layer","name":"OpsWorks Layers","dependencies":[{"namespace":"AWS/OpsWorks"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer::Maximum:memory_used"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:load_1"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_idle"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_nice"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_steal"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_system"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_user"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_waitio"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:load_5"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:load_15"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:memory_buffers"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:memory_cached"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:memory_free"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:memory_swap"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:memory_total"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:procs"}]}]}]},{"id":"OpsWorks:Stack","name":"OpsWorks Stacks","dependencies":[{"namespace":"AWS/OpsWorks"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack::Maximum:memory_used"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:load_1"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_idle"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_nice"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_steal"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_system"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_user"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_waitio"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:load_5"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:load_15"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:memory_buffers"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:memory_cached"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:memory_free"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:memory_swap"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:memory_total"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:procs"}]}]}]},{"id":"OpsWorks","name":"OpsWorks","dependencies":[{"namespace":"AWS/OpsWorks"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance::Maximum:memory_used"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:load_1"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_idle"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_nice"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_steal"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_system"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_user"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:cpu_waitio"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:load_5"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:load_15"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:memory_buffers"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:memory_cached"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:memory_free"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:memory_swap"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:memory_total"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Instance:procs"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer::Maximum:memory_used"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:load_1"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_idle"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_nice"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_steal"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_system"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_user"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:cpu_waitio"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:load_5"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:load_15"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:memory_buffers"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:memory_cached"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:memory_free"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:memory_swap"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:memory_total"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Layer:procs"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack::Maximum:memory_used"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:load_1"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_idle"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_nice"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_steal"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_system"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_user"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:cpu_waitio"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:load_5"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:load_15"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:memory_buffers"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:memory_cached"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:memory_free"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:memory_swap"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:memory_total"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::OpsWorks::Stack:procs"}]}]}]}]},{"id":"Overview","dashboard":"Overview","resourceTypes":[],"controls":{},"metricTemplates":[],"dashboards":[{"id":"Overview","name":"Overview","controls":["Shared::Group.ResourceGroup"],"rows":[]}]},{"id":"AWS::Polly","dashboard":"Polly","crossServiceDashboard":"Polly:CrossService","resourceTypes":[{"type":"AWS::Polly::Operation","keyMetric":"AWS::Polly::Operation:RequestCharacters","dashboard":"Polly"}],"controls":{"AWS::Polly.operations":{"type":"resource","resourceType":"AWS::Polly::Operation","labelField":"Operation","valueField":"Operation"}},"metricTemplates":[{"resourceType":"AWS::Polly::Operation","namespace":"AWS/Polly","dimensions":[{"dimensionName":"Operation","labelName":"Operation"}],"metrics":[{"id":"AWS::Polly::Operation:RequestCharacters","name":"RequestCharacters","defaultStat":"Average"},{"id":"AWS::Polly::Operation:5XXCount","name":"5XXCount","defaultStat":"Sum"},{"id":"AWS::Polly::Operation:ResponseLatency","name":"ResponseLatency","defaultStat":"Average"},{"id":"AWS::Polly::Operation:2XXCount","name":"2XXCount","defaultStat":"Sum"},{"id":"AWS::Polly::Operation:4XXCount","name":"4XXCount","defaultStat":"Sum"}]}],"dashboards":[{"id":"Polly:CrossService","name":"Polly","dependencies":[{"namespace":"AWS/Polly"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Polly::Operation:RequestCharacters"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Polly::Operation:5XXCount"}]}]}]},{"id":"Polly","name":"Polly","dependencies":[{"namespace":"AWS/Polly"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Polly.operations"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Polly::Operation:RequestCharacters"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Polly::Operation:5XXCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Polly::Operation:ResponseLatency"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Polly::Operation:2XXCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Polly::Operation:4XXCount"}]}]}]}]},{"id":"AWS::QLDB::Ledger","dashboard":"QLDB","crossServiceDashboard":"QLDB:CrossService","resourceTypes":[{"type":"AWS::QLDB::Ledger","keyMetric":"AWS::QLDB::Ledger:CommandLatency","dashboard":"QLDB","arnRegex":".*:ledger/(.*)"}],"metricTemplates":[{"resourceType":"AWS::QLDB::Ledger","namespace":"AWS/QLDB","dimensions":[{"dimensionName":"LedgerName","labelName":"LedgerName"}],"metrics":[{"id":"AWS::QLDB::Ledger:CommandLatency","name":"CommandLatency","defaultStat":"Average"},{"id":"AWS::QLDB::Ledger:JournalStorage","name":"JournalStorage","defaultStat":"Sum"},{"id":"AWS::QLDB::Ledger:IndexedStorage","name":"IndexedStorage","defaultStat":"Sum"},{"id":"AWS::QLDB::Ledger:IsImpaired","name":"IsImpaired","defaultStat":"Sum"},{"id":"AWS::QLDB::Ledger:OccConflictExceptions","name":"OccConflictExceptions","defaultStat":"Sum"},{"id":"AWS::QLDB::Ledger:ReadIOs","name":"ReadIOs","defaultStat":"Sum"},{"id":"AWS::QLDB::Ledger:Session4xxExceptions","name":"Session4xxExceptions","defaultStat":"Sum"},{"id":"AWS::QLDB::Ledger:Session5xxExceptions","name":"Session5xxExceptions","defaultStat":"Sum"},{"id":"AWS::QLDB::Ledger:SessionRateExceededExceptions","name":"SessionRateExceededExceptions","defaultStat":"Sum"},{"id":"AWS::QLDB::Ledger:WriteIOs","name":"WriteIOs","defaultStat":"Sum"}]}],"dashboards":[{"id":"QLDB:CrossService","name":"QLDB","dependencies":[{"namespace":"AWS/QLDB"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:CommandLatency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:JournalStorage"}]}]}]},{"id":"QLDB","name":"QLDB","dependencies":[{"namespace":"AWS/QLDB"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:CommandLatency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:JournalStorage"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:IndexedStorage"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:IsImpaired"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:OccConflictExceptions"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:ReadIOs"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:Session4xxExceptions"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:Session5xxExceptions"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:SessionRateExceededExceptions"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::QLDB::Ledger:WriteIOs"}]}]}]}]},{"id":"AWS::RDS","dashboard":"RDS","crossServiceDashboard":"RDS:CrossService","resourceTypes":[{"type":"AWS::RDS::DBInstance","keyMetric":"AWS::RDS::DBInstance:CPUUtilization","dashboard":"RDS","arnRegex":".*:db:(.*)","describe":"rds-describe-instances","consoleLink":"/rds/home?region={region}#dbinstance:id={DBInstanceIdentifier}"}],"controls":{"AWS::RDS.dbinstances":{"type":"resource","resourceType":"AWS::RDS::DBInstance","labelField":"DBInstanceIdentifier","valueField":"DBInstanceIdentifier"}},"metricTemplates":[{"resourceType":"AWS::RDS::DBInstance","namespace":"AWS/RDS","dimensions":[{"dimensionName":"DBInstanceIdentifier","labelName":"DBInstanceIdentifier"}],"metrics":[{"id":"AWS::RDS::DBInstance:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::RDS::DBInstance:ReadLatency","name":"ReadLatency","defaultStat":"Average"},{"id":"AWS::RDS::DBInstance:DatabaseConnections","name":"DatabaseConnections","defaultStat":"Sum"},{"id":"AWS::RDS::DBInstance:FreeStorageSpace","name":"FreeStorageSpace","defaultStat":"Average"},{"id":"AWS::RDS::DBInstance:FreeableMemory","name":"FreeableMemory","defaultStat":"Average"},{"id":"AWS::RDS::DBInstance:ReadThroughput","name":"ReadThroughput","defaultStat":"Average"},{"id":"AWS::RDS::DBInstance:ReadIOPS","name":"ReadIOPS","defaultStat":"Average"},{"id":"AWS::RDS::DBInstance:WriteLatency","name":"WriteLatency","defaultStat":"Average"},{"id":"AWS::RDS::DBInstance:WriteThroughput","name":"WriteThroughput","defaultStat":"Average"},{"id":"AWS::RDS::DBInstance:WriteIOPS","name":"WriteIOPS","defaultStat":"Average"}]}],"dashboards":[{"id":"RDS:CrossService","name":"RDS","dependencies":[{"namespace":"AWS/RDS"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBInstance:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBInstance:ReadLatency"}]}]}]},{"id":"RDS","name":"RDS","dependencies":[{"namespace":"AWS/RDS"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::RDS.dbinstances"],"tables":[{"resourceType":"AWS::RDS::DBInstance","columns":["DBInstanceIdentifier","Engine","DBInstanceStatus","DBInstanceClass","MultiAZ","StorageEncrypted","StorageType"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBInstance:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBInstance:DatabaseConnections"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBInstance:FreeStorageSpace"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBInstance:FreeableMemory"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBInstance:ReadLatency"}]},{"type":"chart","metrics":[{"metricOptions":{"yAxis":"right"},"metricTemplate":"AWS::RDS::DBInstance:ReadThroughput"}]},{"type":"chart","metrics":[{"metricOptions":{"yAxis":"right"},"metricTemplate":"AWS::RDS::DBInstance:ReadIOPS"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBInstance:WriteLatency"}]},{"type":"chart","metrics":[{"metricOptions":{"yAxis":"right"},"metricTemplate":"AWS::RDS::DBInstance:WriteThroughput"}]},{"type":"chart","metrics":[{"metricOptions":{"yAxis":"right"},"metricTemplate":"AWS::RDS::DBInstance:WriteIOPS"}]}]}]}]},{"id":"AWS::RDSCluster","dashboard":"RDSCluster","crossServiceDashboard":"RDSCluster:CrossService","resourceTypes":[{"type":"AWS::RDS::DBCluster","keyMetric":"AWS::RDS::DBCluster:CPUUtilization","dashboard":"RDS","arnRegex":".*:DBClusters(.*)","describe":"rds-describe-clusters","consoleLink":"/rds/home?region={region}#database:id={DBClusterIdentifier};is-cluster=true"}],"controls":{"AWS::RDSCluster.dbclusters":{"type":"resource","resourceType":"AWS::RDS::DBCluster","labelField":"DBClusterIdentifier","valueField":"DBClusterIdentifier"}},"metricTemplates":[{"resourceType":"AWS::RDS::DBCluster","namespace":"AWS/RDS","dimensions":[{"dimensionName":"DBClusterIdentifier","labelName":"DBClusterIdentifier"}],"metrics":[{"id":"AWS::RDS::DBCluster:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::RDS::DBCluster:DatabaseConnections","name":"DatabaseConnections","defaultStat":"Sum"},{"id":"AWS::RDS::DBCluster:FreeStorageSpace","name":"FreeStorageSpace","defaultStat":"Average"},{"id":"AWS::RDS::DBCluster:FreeableMemory","name":"FreeableMemory","defaultStat":"Average"},{"id":"AWS::RDS::DBCluster:ReadLatency","name":"ReadLatency","defaultStat":"Average"},{"id":"AWS::RDS::DBCluster:ReadThroughput","name":"ReadThroughput","defaultStat":"Average"},{"id":"AWS::RDS::DBCluster:ReadIOPS","name":"ReadIOPS","defaultStat":"Average"},{"id":"AWS::RDS::DBCluster:WriteLatency","name":"WriteLatency","defaultStat":"Average"},{"id":"AWS::RDS::DBCluster:WriteThroughput","name":"WriteThroughput","defaultStat":"Average"},{"id":"AWS::RDS::DBCluster:WriteIOPS","name":"WriteIOPS","defaultStat":"Average"}]}],"dashboards":[{"id":"RDSCluster:CrossService","name":"RDS Cluster","dependencies":[{"namespace":"AWS/RDS"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBCluster:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBCluster:ReadLatency"}]}]}]},{"id":"RDSCluster","name":"RDS Cluster","dependencies":[{"namespace":"AWS/RDS"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::RDSCluster.dbclusters"],"tables":[{"resourceType":"AWS::RDS::DBCluster","columns":["DBClusterIdentifier","Engine","Status","MultiAZ","StorageEncrypted"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBCluster:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBCluster:DatabaseConnections"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBCluster:FreeStorageSpace"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBCluster:FreeableMemory"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBCluster:ReadLatency"}]},{"type":"chart","metrics":[{"metricOptions":{"yAxis":"right"},"metricTemplate":"AWS::RDS::DBCluster:ReadThroughput"}]},{"type":"chart","metrics":[{"metricOptions":{"yAxis":"right"},"metricTemplate":"AWS::RDS::DBCluster:ReadIOPS"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RDS::DBCluster:WriteLatency"}]},{"type":"chart","metrics":[{"metricOptions":{"yAxis":"right"},"metricTemplate":"AWS::RDS::DBCluster:WriteThroughput"}]},{"type":"chart","metrics":[{"metricOptions":{"yAxis":"right"},"metricTemplate":"AWS::RDS::DBCluster:WriteIOPS"}]}]}]}]},{"id":"RecentAlarms","dashboard":"RecentAlarms","resourceTypes":[],"metricTemplates":[],"dashboards":[{"id":"RecentAlarms","name":"Recent Alarms","dependencies":[],"rows":[]}]},{"id":"AWS::Redshift","dashboard":"Redshift","crossServiceDashboard":"Redshift:CrossService","resourceTypes":[{"type":"AWS::Redshift::Cluster","keyMetric":"AWS::Redshift::Cluster:CPUUtilization","dashboard":"Redshift","arnRegex":".*:cluster:(.*)"}],"controls":{"AWS::Redshift.clusters":{"type":"resource","resourceType":"AWS::Redshift::Cluster","labelField":"ClusterIdentifier","valueField":"ClusterIdentifier"}},"metricTemplates":[{"resourceType":"AWS::Redshift::Cluster","namespace":"AWS/Redshift","dimensions":[{"dimensionName":"ClusterIdentifier","labelName":"ClusterIdentifier"}],"metrics":[{"id":"AWS::Redshift::Cluster:CommitQueueLength","name":"CommitQueueLength","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:ConcurrencyScalingActiveClusters","name":"ConcurrencyScalingActiveClusters","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:ConcurrencyScalingSeconds","name":"ConcurrencyScalingSeconds","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:DatabaseConnections","name":"DatabaseConnections","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:HealthStatus","name":"HealthStatus","defaultStat":"Sum"},{"id":"AWS::Redshift::Cluster:MaintenanceMode","name":"MaintenanceMode","defaultStat":"Sum"},{"id":"AWS::Redshift::Cluster:MaxConfiguredConcurrencyScalingClusters","name":"MaxConfiguredConcurrencyScalingClusters","defaultStat":"Sum"},{"id":"AWS::Redshift::Cluster:NetworkReceiveThroughput","name":"NetworkReceiveThroughput","defaultStat":"Sum"},{"id":"AWS::Redshift::Cluster:NetworkTransmitThroughput","name":"NetworkTransmitThroughput","defaultStat":"Sum"},{"id":"AWS::Redshift::Cluster:NumExceededSchemaQuotas","name":"NumExceededSchemaQuotas","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:PercentageDiskSpaceUsed","name":"PercentageDiskSpaceUsed","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:PercentageQuotaUsed","name":"PercentageQuotaUsed","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:QueriesCompletedPerSecond","name":"QueriesCompletedPerSecond","defaultStat":"Sum"},{"id":"AWS::Redshift::Cluster:QueryDuration","name":"QueryDuration","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:QueryRuntimeBreakdown","name":"QueryRuntimeBreakdown","defaultStat":"Sum"},{"id":"AWS::Redshift::Cluster:ReadIOPS","name":"ReadIOPS","defaultStat":"Sum"},{"id":"AWS::Redshift::Cluster:ReadLatency","name":"ReadLatency","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:ReadThroughput","name":"ReadThroughput","defaultStat":"Sum"},{"id":"AWS::Redshift::Cluster:StorageUsed","name":"StorageUsed","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:TotalTableCount","name":"TotalTableCount","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:WLMQueriesCompletedPerSecond","name":"WLMQueriesCompletedPerSecond","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:WLMQueryDuration","name":"WLMQueryDuration","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:WLMQueueLength","name":"WLMQueueLength","defaultStat":"Sum"},{"id":"AWS::Redshift::Cluster:WriteIOPS","name":"WriteIOPS","defaultStat":"Sum"},{"id":"AWS::Redshift::Cluster:WriteLatency","name":"WriteLatency","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:WriteThroughput","name":"WriteThroughput","defaultStat":"Sum"}]},{"resourceType":"AWS::Redshift::Cluster","id":"AWS::Redshift::Cluster:NodeID","namespace":"AWS/Redshift","dimensions":[{"dimensionName":"ClusterIdentifier","labelName":"ClusterIdentifier"},{"dimensionName":"NodeID","labelName":"NodeID"}],"metrics":[{"id":"AWS::Redshift::Cluster:NodeID:CPUUtilization","name":"CPUUtilization","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:NodeID:NetworkReceiveThroughput","name":"NetworkReceiveThroughput","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:NodeID:NetworkTransmitThroughput","name":"NetworkTransmitThroughput","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:NodeID:ReadIOPS","name":"ReadIOPS","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:NodeID:ReadLatency","name":"ReadLatency","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:NodeID:ReadThroughput","name":"ReadThroughput","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:NodeID:WriteIOPS","name":"WriteIOPS","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:NodeID:WriteLatency","name":"WriteLatency","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:NodeID:WriteThroughput","name":"WriteThroughput","defaultStat":"Average"}]},{"resourceType":"AWS::Redshift::Cluster","id":"AWS::Redshift::Cluster:wlmid","namespace":"AWS/Redshift","dimensions":[{"dimensionName":"ClusterIdentifier","labelName":"ClusterIdentifier"},{"dimensionName":"wlmid","labelName":"wlmid"}],"metrics":[{"id":"AWS::Redshift::Cluster:wlmid:QueriesCompletedPerSecond","name":"QueriesCompletedPerSecond","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:wlmid:WLMQueriesCompletedPerSecond","name":"WLMQueriesCompletedPerSecond","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:wlmid:WLMQueryDuration","name":"WLMQueryDuration","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:wlmid:WLMQueueWaitTime","name":"WLMQueueWaitTime","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:wlmid:WLMRunningQueries","name":"WLMRunningQueries","defaultStat":"Average"}]},{"resourceType":"AWS::Redshift::Cluster","id":"AWS::Redshift::Cluster:QueueName","namespace":"AWS/Redshift","dimensions":[{"dimensionName":"ClusterIdentifier","labelName":"ClusterIdentifier"},{"dimensionName":"QueueName","labelName":"QueueName"}],"metrics":[{"id":"AWS::Redshift::Cluster:QueueName:WLMQueriesCompletedPerSecond","name":"WLMQueriesCompletedPerSecond","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:QueueName:WLMQueryDuration","name":"WLMQueryDuration","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:QueueName:WLMQueueLength","name":"WLMQueueLength","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:QueueName:WLMQueueWaitTime","name":"WLMQueueWaitTime","defaultStat":"Average"},{"id":"AWS::Redshift::Cluster:QueueName:WLMRunningQueries","name":"WLMRunningQueries","defaultStat":"Average"}]}],"dashboards":[{"id":"Redshift:CrossService","name":"Redshift","dependencies":[{"namespace":"AWS/Redshift"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:PercentageDiskSpaceUsed"}]}]}]},{"id":"Redshift","name":"Redshift","dependencies":[{"namespace":"AWS/Redshift"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Redshift.clusters"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:CPUUtilization"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:PercentageDiskSpaceUsed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:DatabaseConnections"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:HealthStatus"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:MaintenanceMode"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:NetworkReceiveThroughput"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:NetworkTransmitThroughput"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:QueriesCompletedPerSecond"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:QueryDuration"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:QueryRuntimeBreakdown"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:ReadIOPS"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:ReadLatency"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:ReadThroughput"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:WLMQueriesCompletedPerSecond"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:WLMQueryDuration"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:WLMQueueLength"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:WriteIOPS"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Redshift::Cluster:WriteLatency"}]}]},{"widgets":[{"type":"chart","width":8,"metrics":[{"metricTemplate":"AWS::Redshift::Cluster:WriteThroughput"}]}]}]}]},{"id":"AWS::Rekognition","dashboard":"Rekognition","crossServiceDashboard":"Rekognition:CrossService","resourceTypes":[{"type":"AWS::Rekognition::Operation","keyMetric":"AWS::Rekognition::Operation:SuccessfulRequestCount","dashboard":"Rekognition"}],"controls":{"AWS::Rekognition.operations":{"type":"resource","resourceType":"AWS::Rekognition::Operation","labelField":"Operation","valueField":"Operation"}},"metricTemplates":[{"resourceType":"AWS::Rekognition::Operation","namespace":"AWS/Rekognition","dimensions":[{"dimensionName":"Operation","labelName":"Operation"}],"metrics":[{"id":"AWS::Rekognition::Operation:SuccessfulRequestCount","name":"SuccessfulRequestCount","defaultStat":"Sum"},{"id":"AWS::Rekognition::Operation:ServerErrorCount","name":"ServerErrorCount","defaultStat":"Sum"},{"id":"AWS::Rekognition::Operation:DetectedFaceCount","name":"DetectedFaceCount","defaultStat":"Sum"},{"id":"AWS::Rekognition::Operation:DetectedLabelCount","name":"DetectedLabelCount","defaultStat":"Sum"},{"id":"AWS::Rekognition::Operation:ResponseTime","name":"ResponseTime","defaultStat":"Average"},{"id":"AWS::Rekognition::Operation:UserErrorCount","name":"UserErrorCount","defaultStat":"Sum"}]}],"dashboards":[{"id":"Rekognition:CrossService","name":"Rekognition","dependencies":[{"namespace":"AWS/Rekognition"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Rekognition::Operation:SuccessfulRequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Rekognition::Operation:ServerErrorCount"}]}]}]},{"id":"Rekognition","name":"Rekognition","dependencies":[{"namespace":"AWS/Rekognition"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Rekognition.operations"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Rekognition::Operation:SuccessfulRequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Rekognition::Operation:ServerErrorCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Rekognition::Operation:DetectedFaceCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Rekognition::Operation:DetectedLabelCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Rekognition::Operation:ResponseTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Rekognition::Operation:UserErrorCount"}]}]}]}]},{"id":"AWS::RoboMaker","dashboard":"RoboMaker","crossServiceDashboard":"RoboMaker:CrossService","resourceTypes":[{"type":"AWS::RoboMaker::SimulationJob","keyMetric":"AWS::RoboMaker::SimulationJob:vCPU","dashboard":"RoboMaker","arnRegex":".*simulation-job/(.*)"}],"controls":{"AWS::RoboMaker.simulationJobs":{"type":"resource","resourceType":"AWS::RoboMaker::SimulationJob","labelField":"SimulationJobId","valueField":"SimulationJobId"}},"metricTemplates":[{"resourceType":"AWS::RoboMaker::SimulationJob","namespace":"AWS/RoboMaker","dimensions":[{"dimensionName":"SimulationJobId","labelName":"SimulationJobId"}],"metrics":[{"id":"AWS::RoboMaker::SimulationJob:vCPU","name":"vCPU","defaultStat":"Average"},{"id":"AWS::RoboMaker::SimulationJob:Memory","name":"Memory","defaultStat":"Maximum"},{"id":"AWS::RoboMaker::SimulationJob:RealTimeRatio","name":"RealTimeRatio","defaultStat":"Average"},{"id":"AWS::RoboMaker::SimulationJob:SimulationUnit","name":"SimulationUnit","defaultStat":"Sum"}]}],"dashboards":[{"id":"RoboMaker:CrossService","name":"RoboMaker","dependencies":[{"namespace":"AWS/RoboMaker"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RoboMaker::SimulationJob:vCPU"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::RoboMaker::SimulationJob:Memory"}]}]}]},{"id":"RoboMaker","name":"RoboMaker","dependencies":[{"namespace":"AWS/RoboMaker"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::RoboMaker.simulationJobs"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RoboMaker::SimulationJob:vCPU"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::RoboMaker::SimulationJob:Memory"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::RoboMaker::SimulationJob:RealTimeRatio"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::RoboMaker::SimulationJob:SimulationUnit"}]}]}]}]},{"id":"AWS::Route53","dashboard":"Route53","crossServiceDashboard":"Route53:CrossService","resourceTypes":[{"type":"AWS::Route53::HealthCheck","keyMetric":"AWS::Route53::HealthCheck:HealthCheckPercentageHealthy","dashboard":"Route53","arnRegex":".*:healthcheck/(.*)","describe":"route53-describe-health-checks","consoleLink":"/route53/healthchecks/home#/details/{HealthCheckId}"}],"controls":{"AWS::Route53.healthchecks":{"type":"resource","resourceType":"AWS::Route53::HealthCheck","labelField":"HealthCheckId","valueField":"HealthCheckId"}},"metricTemplates":[{"resourceType":"AWS::Route53::HealthCheck","namespace":"AWS/Route53","dimensions":[{"dimensionName":"HealthCheckId","labelName":"HealthCheckId"}],"metrics":[{"id":"AWS::Route53::HealthCheck:HealthCheckPercentageHealthy","name":"HealthCheckPercentageHealthy","defaultStat":"Average"},{"id":"AWS::Route53::HealthCheck:ConnectionTime","name":"ConnectionTime","defaultStat":"Average"},{"id":"AWS::Route53::HealthCheck:HealthCheckStatus","name":"HealthCheckStatus","defaultStat":"Minimum"},{"id":"AWS::Route53::HealthCheck:SSLHandshakeTime","name":"SSLHandshakeTime","defaultStat":"Average"},{"id":"AWS::Route53::HealthCheck:ChildHealthCheckHealthyCount","name":"ChildHealthCheckHealthyCount","defaultStat":"Average"},{"id":"AWS::Route53::HealthCheck:TimeToFirstByte","name":"TimeToFirstByte","defaultStat":"Average"}]}],"dashboards":[{"id":"Route53:CrossService","name":"Route 53","dependencies":[{"namespace":"AWS/Route53"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53::HealthCheck:HealthCheckPercentageHealthy"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53::HealthCheck:ConnectionTime"}]}]}]},{"id":"Route53","name":"Route 53","dependencies":[{"namespace":"AWS/Route53"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Route53.healthchecks"],"tables":[{"resourceType":"AWS::Route53::HealthCheck","columns":["HealthCheckId","Description"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53::HealthCheck:HealthCheckPercentageHealthy"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53::HealthCheck:ConnectionTime"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53::HealthCheck:HealthCheckStatus"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53::HealthCheck:SSLHandshakeTime"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53::HealthCheck:ChildHealthCheckHealthyCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53::HealthCheck:TimeToFirstByte"}]}]}]}]},{"id":"AWS::Route53Resolver::ResolverEndpoint","dashboard":"Route53Resolver","crossServiceDashboard":"Route53Resolver:CrossService","resourceTypes":[{"type":"AWS::Route53Resolver::ResolverEndpoint","keyMetric":"AWS::Route53Resolver::ResolverEndpoint:InboundQueryVolume","dashboard":"Route53Resolver","arnRegex":".*:resolver-endpoint/(.*)"}],"metricTemplates":[{"resourceType":"AWS::Route53Resolver::ResolverEndpoint","namespace":"AWS/Route53Resolver","dimensions":[{"dimensionName":"EndpointId","labelName":"EndpointId"}],"metrics":[{"id":"AWS::Route53Resolver::ResolverEndpoint:InboundQueryVolume","name":"InboundQueryVolume","defaultStat":"Sum"},{"id":"AWS::Route53Resolver::ResolverEndpoint:OutboundQueryVolume","name":"OutboundQueryVolume","defaultStat":"Sum"},{"id":"AWS::Route53Resolver::ResolverEndpoint:OutboundQueryAggregateVolume","name":"OutboundQueryAggregateVolume","defaultStat":"Sum"}]}],"dashboards":[{"id":"Route53Resolver:CrossService","name":"Route 53 Resolver","dependencies":[{"namespace":"AWS/Route53Resolver"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53Resolver::ResolverEndpoint:InboundQueryVolume"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53Resolver::ResolverEndpoint:OutboundQueryVolume"}]}]}]},{"id":"Route53Resolver","name":"Route 53 Resolver","dependencies":[{"namespace":"AWS/Route53Resolver"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53Resolver::ResolverEndpoint:InboundQueryVolume"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53Resolver::ResolverEndpoint:OutboundQueryVolume"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Route53Resolver::ResolverEndpoint:OutboundQueryAggregateVolume"}]}]}]}]},{"id":"AWS::S3","dashboard":"S3","crossServiceDashboard":"S3:CrossService","resourceTypes":[{"type":"AWS::S3::Bucket","keyMetric":"AWS::S3::Bucket:BucketSizeBytes","dashboard":"S3","arnRegex":"s3:::(.*)","list":"s3-describe-buckets","describe":"s3-describe-buckets","consoleLink":"/s3/buckets/{BucketName}/?region={region}&tab=objects"},{"type":"CW::S3::BucketFilter","keyMetric":"CW::S3::BucketFilter:AllRequests"}],"controls":{"AWS::S3.buckets":{"type":"resource","resourceType":"AWS::S3::Bucket","labelField":"BucketName","valueField":"BucketName"}},"metricTemplates":[{"resourceType":"AWS::S3::Bucket","namespace":"AWS/S3","defaultPeriod":86400,"dimensions":[{"dimensionName":"BucketName","labelName":"BucketName"},{"dimensionName":"StorageType","dimensionValue":"StandardStorage"}],"metrics":[{"id":"AWS::S3::Bucket:BucketSizeBytes","name":"BucketSizeBytes","defaultStat":"Average","defaultPeriod":86400}]},{"resourceType":"AWS::S3::Bucket","id":"AWS::S3::Bucket:AllStorageTypes","namespace":"AWS/S3","defaultPeriod":86400,"dimensions":[{"dimensionName":"BucketName","labelName":"BucketName"},{"dimensionName":"StorageType","dimensionValue":"AllStorageTypes"}],"metrics":[{"id":"AWS::S3::Bucket:AllStorageTypes:NumberOfObjects","name":"NumberOfObjects","defaultStat":"Average","defaultPeriod":86400}]},{"resourceType":"CW::S3::BucketFilter","namespace":"AWS/S3","dimensions":[{"dimensionName":"BucketName","labelName":"BucketName"},{"dimensionName":"FilterId","labelName":"FilterId"}],"metrics":[{"id":"CW::S3::BucketFilter:AllRequests","name":"AllRequests","defaultStat":"Sum"},{"id":"CW::S3::BucketFilter:GetRequests","name":"GetRequests","defaultStat":"Sum"},{"id":"CW::S3::BucketFilter:PutRequests","name":"PutRequests","defaultStat":"Sum"},{"id":"CW::S3::BucketFilter:DeleteRequests","name":"DeleteRequests","defaultStat":"Sum"},{"id":"CW::S3::BucketFilter:HeadRequests","name":"HeadRequests","defaultStat":"Sum"},{"id":"CW::S3::BucketFilter:PostRequests","name":"PostRequests","defaultStat":"Sum"},{"id":"CW::S3::BucketFilter:ListRequests","name":"ListRequests","defaultStat":"Sum"},{"id":"CW::S3::BucketFilter:BytesDownloaded","name":"BytesDownloaded","defaultStat":"Sum"},{"id":"CW::S3::BucketFilter:BytesUploaded","name":"BytesUploaded","defaultStat":"Sum"},{"id":"CW::S3::BucketFilter:4xxErrors","name":"4xxErrors","defaultStat":"Sum"},{"id":"CW::S3::BucketFilter:5xxErrors","name":"5xxErrors","defaultStat":"Sum"},{"id":"CW::S3::BucketFilter:FirstByteLatency","name":"FirstByteLatency","defaultStat":"Average"},{"id":"CW::S3::BucketFilter:TotalRequestLatency","name":"TotalRequestLatency","defaultStat":"Average"}]}],"dashboards":[{"id":"S3:CrossService","name":"S3","dependencies":[{"namespace":"AWS/S3"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::S3::Bucket:BucketSizeBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::S3::Bucket:AllStorageTypes:NumberOfObjects"}]}]}]},{"id":"S3","name":"S3","dependencies":[{"namespace":"AWS/S3"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::S3.buckets"],"tables":[{"resourceType":"AWS::S3::Bucket","columns":["BucketName","CreationDate"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::S3::Bucket:BucketSizeBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::S3::Bucket:AllStorageTypes:NumberOfObjects"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:AllRequests"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:GetRequests"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:PutRequests"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:DeleteRequests"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:HeadRequests"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:PostRequests"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:ListRequests"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:BytesDownloaded"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:BytesUploaded"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:4xxErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:5xxErrors"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:FirstByteLatency"}]},{"type":"chart","metrics":[{"metricTemplate":"CW::S3::BucketFilter:TotalRequestLatency"}]}]}]}]},{"id":"AWS::SageMaker","dashboard":"SageMaker","crossServiceDashboard":"SageMaker:CrossService","resourceTypes":[{"type":"AWS::SageMaker::Endpoint","keyMetric":"AWS::SageMaker::Endpoint:Invocations","dashboard":"SageMaker","arnRegex":".*:endpoint/(.*)"}],"controls":{"AWS::SageMaker.endpoints":{"type":"resource","resourceType":"AWS::SageMaker::Endpoint","labelField":"EndpointName","valueField":"EndpointName"}},"metricTemplates":[{"resourceType":"AWS::SageMaker::Endpoint","namespace":"AWS/SageMaker","dimensions":[{"dimensionName":"EndpointName","labelName":"EndpointName"},{"dimensionName":"VariantName","labelName":"VariantName"}],"metrics":[{"id":"AWS::SageMaker::Endpoint:Invocations","name":"Invocations","defaultStat":"Sum"},{"id":"AWS::SageMaker::Endpoint:Invocation5XXErrors","name":"Invocation5XXErrors","defaultStat":"Sum"},{"id":"AWS::SageMaker::Endpoint:Invocation4XXErrors","name":"Invocation4XXErrors","defaultStat":"Sum"},{"id":"AWS::SageMaker::Endpoint:InvocationsPerInstance","name":"InvocationsPerInstance","defaultStat":"Sum"},{"id":"AWS::SageMaker::Endpoint:ModelLatency","name":"ModelLatency","defaultStat":"Sum"},{"id":"AWS::SageMaker::Endpoint:OverheadLatency","name":"OverheadLatency","defaultStat":"Sum"}]}],"dashboards":[{"id":"SageMaker:CrossService","name":"SageMaker","dependencies":[{"namespace":"AWS/SageMaker"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SageMaker::Endpoint:Invocations"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SageMaker::Endpoint:Invocation5XXErrors"}]}]}]},{"id":"SageMaker","name":"SageMaker","dependencies":[{"namespace":"AWS/SageMaker"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::SageMaker.endpoints"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SageMaker::Endpoint:Invocations"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SageMaker::Endpoint:Invocation5XXErrors"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SageMaker::Endpoint:Invocation4XXErrors"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SageMaker::Endpoint:InvocationsPerInstance"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SageMaker::Endpoint:ModelLatency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SageMaker::Endpoint:OverheadLatency"}]}]}]}]},{"id":"AWS::SDKMetrics","dashboard":"SDKMetrics","crossServiceDashboard":"SDKMetrics:CrossService","resourceTypes":[{"type":"AWS::SDKMetrics::DestinationRegion","keyMetric":"AWS::SDKMetrics::DestinationRegion:CallCount","dashboard":"SDKMetrics"}],"controls":{"AWS::SDKMetrics.destinationRegions":{"type":"resource","resourceType":"AWS::SDKMetrics::DestinationRegion","labelField":"DestinationRegion","valueField":"DestinationRegion"}},"metricTemplates":[{"resourceType":"AWS::SDKMetrics::DestinationRegion","namespace":"AWS/SDKMetrics","dimensions":[{"dimensionName":"DestinationRegion","labelName":"DestinationRegion"},{"dimensionName":"Service","labelName":"Service"}],"metrics":[{"id":"AWS::SDKMetrics::DestinationRegion:CallCount","name":"CallCount","defaultStat":"Sum"},{"id":"AWS::SDKMetrics::DestinationRegion:ServerErrorCount","name":"ServerErrorCount","defaultStat":"Sum"},{"id":"AWS::SDKMetrics::DestinationRegion:ThrottleCount","name":"ThrottleCount","defaultStat":"Sum"},{"id":"AWS::SDKMetrics::DestinationRegion:Latency","name":"Latency","defaultStat":"p50"},{"id":"AWS::SDKMetrics::DestinationRegion:RetryCount","name":"RetryCount","defaultStat":"Sum"},{"id":"AWS::SDKMetrics::DestinationRegion:ClientErrorCount","name":"ClientErrorCount","defaultStat":"Sum"},{"id":"AWS::SDKMetrics::DestinationRegion:ConnectionErrorCount","name":"ConnectionErrorCount","defaultStat":"Sum"}]},{"id":"AWS::SDKMetrics::DestinationRegion::p90","resourceType":"AWS::SDKMetrics::DestinationRegion","namespace":"AWS/SDKMetrics","dimensions":[{"dimensionName":"DestinationRegion","labelName":"DestinationRegion"},{"dimensionName":"Service","labelName":"Service"}],"metrics":[{"id":"AWS::SDKMetrics::DestinationRegion::p90:Latency","name":"Latency","defaultStat":"p90"}]}],"dashboards":[{"id":"SDKMetrics:CrossService","name":"SDK Metrics","dependencies":[{"namespace":"AWS/SDKMetrics"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SDKMetrics::DestinationRegion:CallCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SDKMetrics::DestinationRegion:ServerErrorCount"}]}]}]},{"id":"SDKMetrics","name":"SDK Metrics","dependencies":[{"namespace":"AWS/SDKMetrics"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::SDKMetrics.destinationRegions"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SDKMetrics::DestinationRegion:CallCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SDKMetrics::DestinationRegion:ServerErrorCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SDKMetrics::DestinationRegion:ThrottleCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SDKMetrics::DestinationRegion:Latency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SDKMetrics::DestinationRegion::p90:Latency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SDKMetrics::DestinationRegion:RetryCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SDKMetrics::DestinationRegion:ClientErrorCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SDKMetrics::DestinationRegion:ConnectionErrorCount"}]}]}]}]},{"id":"AWS::ServiceCatalog::CloudFormationProduct","dashboard":"ServiceCatalog","crossServiceDashboard":"ServiceCatalog:CrossService","resourceTypes":[{"type":"AWS::ServiceCatalog::CloudFormationProduct","keyMetric":"AWS::ServiceCatalog::CloudFormationProduct:ProvisionedProductLaunch","dashboard":"ServiceCatalog","arnRegex":".*:product/(.*)"}],"metricTemplates":[{"resourceType":"AWS::ServiceCatalog::CloudFormationProduct","namespace":"AWS/ServiceCatalog","dimensions":[{"dimensionName":"ProductId","labelName":"ProductId"}],"metrics":[{"id":"AWS::ServiceCatalog::CloudFormationProduct:ProvisionedProductLaunch","name":"ProvisionedProductLaunch","defaultStat":"Sum"}]}],"dashboards":[{"id":"ServiceCatalog:CrossService","name":"Service Catalog","dependencies":[{"namespace":"AWS/ServiceCatalog"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ServiceCatalog::CloudFormationProduct:ProvisionedProductLaunch"}]}]}]},{"id":"ServiceCatalog","name":"Service Catalog","dependencies":[{"namespace":"AWS/ServiceCatalog"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::ServiceCatalog::CloudFormationProduct:ProvisionedProductLaunch"}]}]}]}]},{"id":"AWS::SES","dashboard":"SES","crossServiceDashboard":"SES:CrossService","resourceTypes":[{"type":"AWS::SES::ReceiptRule","keyMetric":"AWS::SES::ReceiptRule:Send","dashboard":"SES"},{"type":"AWS::SES::ConfigurationSet","keyMetric":"AWS::SES::ConfigurationSet:Send","dashboard":"SES","arnRegex":".*:configuration-set/(.*)"}],"controls":{"AWS::SES.ReceiptRules":{"type":"resource","resourceType":"AWS::SES::ReceiptRule","labelField":"RuleName","valueField":"RuleName"}},"metricTemplates":[{"resourceType":"AWS::SES::ReceiptRule","namespace":"AWS/SES","dimensions":[{"dimensionName":"RuleName","labelName":"RuleName"}],"metrics":[{"id":"AWS::SES::ReceiptRule:Bounce","name":"Bounce","defaultStat":"Sum"},{"id":"AWS::SES::ReceiptRule:Click","name":"Click","defaultStat":"Sum"},{"id":"AWS::SES::ReceiptRule:Complaint","name":"Complaint","defaultStat":"Sum"},{"id":"AWS::SES::ReceiptRule:Delivery","name":"Delivery","defaultStat":"Sum"},{"id":"AWS::SES::ReceiptRule:Open","name":"Open","defaultStat":"Sum"},{"id":"AWS::SES::ReceiptRule:Reject","name":"Reject","defaultStat":"Sum"},{"id":"AWS::SES::ReceiptRule:RenderingFailure","name":"RenderingFailure","defaultStat":"Sum"},{"id":"AWS::SES::ReceiptRule:Reputation.BounceRate","name":"Reputation.BounceRate","defaultStat":"Average"},{"id":"AWS::SES::ReceiptRule:Reputation.ComplaintRate","name":"Reputation.ComplaintRate","defaultStat":"Average"},{"id":"AWS::SES::ReceiptRule:Send","name":"Send","defaultStat":"Sum"}]},{"resourceType":"AWS::SES::ConfigurationSet","namespace":"AWS/SES","dimensions":[{"dimensionName":"ses:configuration-set","labelName":"ses:configuration-set"}],"metrics":[{"id":"AWS::SES::ConfigurationSet:Bounce","name":"Bounce","defaultStat":"Sum"},{"id":"AWS::SES::ConfigurationSet:Click","name":"Click","defaultStat":"Sum"},{"id":"AWS::SES::ConfigurationSet:Complaint","name":"Complaint","defaultStat":"Sum"},{"id":"AWS::SES::ConfigurationSet:Delivery","name":"Delivery","defaultStat":"Sum"},{"id":"AWS::SES::ConfigurationSet:Open","name":"Open","defaultStat":"Sum"},{"id":"AWS::SES::ConfigurationSet:Reject","name":"Reject","defaultStat":"Sum"},{"id":"AWS::SES::ConfigurationSet:RenderingFailure","name":"RenderingFailure","defaultStat":"Sum"},{"id":"AWS::SES::ConfigurationSet:Reputation.BounceRate","name":"Reputation.BounceRate","defaultStat":"Sum"},{"id":"AWS::SES::ConfigurationSet:Reputation.ComplaintRate","name":"Reputation.ComplaintRate","defaultStat":"Sum"},{"id":"AWS::SES::ConfigurationSet:Send","name":"Send","defaultStat":"Sum"}]}],"dashboards":[{"id":"SES:CrossService","name":"Simple Email Service","dependencies":[{"namespace":"AWS/SES"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:Send"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:Reject"}]}]}]},{"id":"SES","name":"Simple Email Service","dependencies":[{"namespace":"AWS/SES"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::SES.ReceiptRules"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:Send"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:Reject"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:Bounce"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:Complaint"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:Delivery"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:Open"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:Click"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:RenderingFailure"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:Reputation.BounceRate"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SES::ReceiptRule:Reputation.ComplaintRate"}]}]}]}]},{"id":"AWS::SNS","dashboard":"SNS","crossServiceDashboard":"SNS:CrossService","resourceTypes":[{"type":"AWS::SNS::Topic","keyMetric":"AWS::SNS::Topic:NumberOfMessagesPublished","dashboard":"SNS","isResourceNode":true,"arnRegex":".*:(.*)"}],"controls":{"AWS::SNS.topics":{"type":"resource","resourceType":"AWS::SNS::Topic","labelField":"TopicName","valueField":"TopicName"}},"metricTemplates":[{"resourceType":"AWS::SNS::Topic","namespace":"AWS/SNS","dimensions":[{"dimensionName":"TopicName","labelName":"TopicName"}],"metrics":[{"id":"AWS::SNS::Topic:NumberOfNotificationsDelivered","name":"NumberOfNotificationsDelivered","defaultStat":"Sum"},{"id":"AWS::SNS::Topic:NumberOfNotificationsFailed","name":"NumberOfNotificationsFailed","defaultStat":"Sum"},{"id":"AWS::SNS::Topic:NumberOfMessagesPublished","name":"NumberOfMessagesPublished","defaultStat":"Sum"},{"id":"AWS::SNS::Topic:PublishSize","name":"PublishSize","defaultStat":"Average"},{"id":"AWS::SNS::Topic:SMSSuccessRate","name":"SMSSuccessRate","defaultStat":"Sum"}]}],"dashboards":[{"id":"SNS:CrossService","name":"Simple Notification Service","dependencies":[{"namespace":"AWS/SNS"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SNS::Topic:NumberOfNotificationsDelivered"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SNS::Topic:NumberOfNotificationsFailed"}]}]}]},{"id":"SNS","name":"Simple Notification Service","dependencies":[{"namespace":"AWS/SNS"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::SNS.topics"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SNS::Topic:NumberOfNotificationsDelivered"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SNS::Topic:NumberOfNotificationsFailed"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SNS::Topic:NumberOfMessagesPublished"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SNS::Topic:PublishSize"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SNS::Topic:SMSSuccessRate"}]}]}]}]},{"id":"AWS::SQS","dashboard":"SQS","crossServiceDashboard":"SQS:CrossService","resourceTypes":[{"type":"AWS::SQS::Queue","keyMetric":"AWS::SQS::Queue:NumberOfMessagesSent","dashboard":"SQS","isResourceNode":true,"arnRegex":".*:(.*)","describe":"sqs-describe-queues","consoleLink":"/sqs/v2/home?region={region}#/queues/{QueueUrl}"}],"controls":{"AWS::SQS.queues":{"type":"resource","resourceType":"AWS::SQS::Queue","labelField":"QueueName","valueField":"QueueName"}},"metricTemplates":[{"resourceType":"AWS::SQS::Queue","namespace":"AWS/SQS","dimensions":[{"dimensionName":"QueueName","labelName":"QueueName"}],"metrics":[{"id":"AWS::SQS::Queue:NumberOfMessagesSent","name":"NumberOfMessagesSent","defaultStat":"Average"},{"id":"AWS::SQS::Queue:ApproximateNumberOfMessagesDelayed","name":"ApproximateNumberOfMessagesDelayed","defaultStat":"Average"},{"id":"AWS::SQS::Queue:NumberOfMessagesReceived","name":"NumberOfMessagesReceived","defaultStat":"Average"},{"id":"AWS::SQS::Queue:NumberOfMessagesDeleted","name":"NumberOfMessagesDeleted","defaultStat":"Average"},{"id":"AWS::SQS::Queue:ApproximateNumberOfMessagesNotVisible","name":"ApproximateNumberOfMessagesNotVisible","defaultStat":"Average"},{"id":"AWS::SQS::Queue:ApproximateNumberOfMessagesVisible","name":"ApproximateNumberOfMessagesVisible","defaultStat":"Average"},{"id":"AWS::SQS::Queue:ApproximateAgeOfOldestMessage","name":"ApproximateAgeOfOldestMessage","defaultStat":"Average"},{"id":"AWS::SQS::Queue:NumberOfEmptyReceives","name":"NumberOfEmptyReceives","defaultStat":"Average"},{"id":"AWS::SQS::Queue:SentMessageSize","name":"SentMessageSize","defaultStat":"Average"}]}],"dashboards":[{"id":"SQS:CrossService","name":"Simple Queue Service","dependencies":[{"namespace":"AWS/SQS"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SQS::Queue:NumberOfMessagesSent"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SQS::Queue:ApproximateNumberOfMessagesDelayed"}]}]}]},{"id":"SQS","name":"Simple Queue Service","dependencies":[{"namespace":"AWS/SQS"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::SQS.queues"],"tables":[{"resourceType":"AWS::SQS::Queue","columns":["QueueName","ApproximateNumberOfMessages","ApproximateNumberOfMessagesDelayed","ApproximateNumberOfMessagesNotVisible","DelaySeconds","CreatedTimestamp"]}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SQS::Queue:NumberOfMessagesSent"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SQS::Queue:NumberOfMessagesReceived"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SQS::Queue:NumberOfMessagesDeleted"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SQS::Queue:ApproximateNumberOfMessagesDelayed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SQS::Queue:ApproximateNumberOfMessagesNotVisible"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SQS::Queue:ApproximateNumberOfMessagesVisible"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SQS::Queue:ApproximateAgeOfOldestMessage"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SQS::Queue:NumberOfEmptyReceives"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SQS::Queue:SentMessageSize"}]}]}]}]},{"id":"AWS::SSM-RunCommand","dashboard":"SSM-RunCommand","crossServiceDashboard":"SSM-RunCommand:CrossService","resourceTypes":[{"type":"AWS::SSM-RunCommand::Command","keyMetric":"AWS::SSM-RunCommand::Command:CommandsSucceeded","dashboard":"SSM-RunCommand"}],"metricTemplates":[{"resourceType":"AWS::SSM-RunCommand::Command","namespace":"AWS/SSM-RunCommand","dimensions":[],"metrics":[{"id":"AWS::SSM-RunCommand::Command:CommandsDeliveryTimedOut","name":"CommandsDeliveryTimedOut","defaultStat":"Sum"},{"id":"AWS::SSM-RunCommand::Command:CommandsFailed","name":"CommandsFailed","defaultStat":"Sum"},{"id":"AWS::SSM-RunCommand::Command:CommandsSucceeded","name":"CommandsSucceeded","defaultStat":"Sum"}]}],"dashboards":[{"id":"SSM-RunCommand:CrossService","name":"Systems Manager Run Command","dependencies":[{"namespace":"AWS/SSM-RunCommand"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SSM-RunCommand::Command:CommandsFailed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SSM-RunCommand::Command:CommandsSucceeded"}]}]}]},{"id":"SSM-RunCommand","name":"Systems Manager Run Command","dependencies":[{"namespace":"AWS/SSM-RunCommand"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SSM-RunCommand::Command:CommandsDeliveryTimedOut"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SSM-RunCommand::Command:CommandsFailed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SSM-RunCommand::Command:CommandsSucceeded"}]}]}]}]},{"id":"AWS::StepFunctions","dashboard":"States","crossServiceDashboard":"States:CrossService","resourceTypes":[{"type":"AWS::StepFunctions::StateMachine","keyMetric":"AWS::StepFunctions::StateMachine:ExecutionTime","dashboard":"States","arnRegex":"(.*)"},{"type":"AWS::StepFunctions::Activity","keyMetric":"AWS::StepFunctions::Activity:ActivityTime","dashboard":"States","arnRegex":"(.*)"}],"controls":{"AWS::StepFunctions.stateMachineArns":{"type":"resource","resourceType":"AWS::StepFunctions::StateMachine","labelField":"StateMachine","valueField":"StateMachine"}},"metricTemplates":[{"resourceType":"AWS::StepFunctions::StateMachine","namespace":"AWS/States","dimensions":[{"dimensionName":"StateMachineArn","labelName":"StateMachineArn"}],"metrics":[{"id":"AWS::StepFunctions::StateMachine:ExecutionTime","name":"ExecutionTime","defaultStat":"Average"},{"id":"AWS::StepFunctions::StateMachine:ExecutionsFailed","name":"ExecutionsFailed","defaultStat":"Sum"},{"id":"AWS::StepFunctions::StateMachine:ExecutionsSucceeded","name":"ExecutionsSucceeded","defaultStat":"Sum"},{"id":"AWS::StepFunctions::StateMachine:ExecutionsThrottled","name":"ExecutionsThrottled","defaultStat":"Sum"},{"id":"AWS::StepFunctions::StateMachine:ExecutionsAborted","name":"ExecutionsAborted","defaultStat":"Sum"},{"id":"AWS::StepFunctions::StateMachine:ExecutionsTimedOut","name":"ExecutionsTimedOut","defaultStat":"Sum"}]},{"resourceType":"AWS::StepFunctions::Activity","namespace":"AWS/States","dimensions":[{"dimensionName":"ActivityArn","labelName":"ActivityArn"}],"metrics":[{"id":"AWS::StepFunctions::Activity:ActivityTime","name":"ActivityTime","defaultStat":"Average"},{"id":"AWS::StepFunctions::Activity:ActivitiesSucceeded","name":"ActivitiesSucceeded","defaultStat":"Sum"},{"id":"AWS::StepFunctions::Activity:ActivitiesFailed","name":"ActivitiesFailed","defaultStat":"Sum"},{"id":"AWS::StepFunctions::Activity:ActivitiesHeartbeatTimedOut","name":"ActivitiesHeartbeatTimedOut","defaultStat":"Sum"},{"id":"AWS::StepFunctions::Activity:ActivitiesScheduled","name":"ActivitiesScheduled","defaultStat":"Sum"},{"id":"AWS::StepFunctions::Activity:ActivitiesStarted","name":"ActivitiesStarted","defaultStat":"Sum"},{"id":"AWS::StepFunctions::Activity:ActivitiesTimedOut","name":"ActivitiesTimedOut","defaultStat":"Sum"},{"id":"AWS::StepFunctions::Activity:ActivityRunTime","name":"ActivityRunTime","defaultStat":"Average"},{"id":"AWS::StepFunctions::Activity:ActivityScheduleTime","name":"ActivityScheduleTime","defaultStat":"Average"}]}],"dashboards":[{"id":"States:CrossService","name":"Step Functions","dependencies":[{"namespace":"AWS/States"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::StepFunctions::StateMachine:ExecutionTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StepFunctions::StateMachine:ExecutionsFailed"}]}]}]},{"id":"States","name":"Step Functions","dependencies":[{"namespace":"AWS/States"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::StepFunctions.stateMachineArns"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::StepFunctions::StateMachine:ExecutionTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StepFunctions::StateMachine:ExecutionsSucceeded"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StepFunctions::StateMachine:ExecutionsFailed"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::StepFunctions::StateMachine:ExecutionsThrottled"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StepFunctions::StateMachine:ExecutionsAborted"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StepFunctions::StateMachine:ExecutionsTimedOut"}]}]}]}]},{"id":"AWS::StorageGateway","dashboard":"StorageGateway","crossServiceDashboard":"StorageGateway:CrossService","resourceTypes":[{"type":"AWS::StorageGateway::Gateway","keyMetric":"AWS::StorageGateway::Gateway:CacheHitPercent","dashboard":"StorageGateway","arnRegex":".*:gateway/(.*)"}],"controls":{"AWS::StorageGateway.gateways":{"type":"resource","resourceType":"AWS::StorageGateway::Gateway","labelField":"GatewayId","valueField":"GatewayId"}},"metricTemplates":[{"resourceType":"AWS::StorageGateway::Gateway","namespace":"AWS/StorageGateway","dimensions":[{"dimensionName":"GatewayId","labelName":"GatewayId"}],"metrics":[{"id":"AWS::StorageGateway::Gateway:CacheFree","name":"CacheFree","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:CacheHitPercent","name":"CacheHitPercent","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:CachePercentDirty","name":"CachePercentDirty","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:CachePercentUsed","name":"CachePercentUsed","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:CacheUsed","name":"CacheUsed","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:CloudBytesDownloaded","name":"CloudBytesDownloaded","defaultStat":"Sum"},{"id":"AWS::StorageGateway::Gateway:CloudBytesUploaded","name":"CloudBytesUploaded","defaultStat":"Sum"},{"id":"AWS::StorageGateway::Gateway:CloudDownloadLatency","name":"CloudDownloadLatency","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:QueuedWrites","name":"QueuedWrites","defaultStat":"Sum"},{"id":"AWS::StorageGateway::Gateway:ReadBytes","name":"ReadBytes","defaultStat":"Sum"},{"id":"AWS::StorageGateway::Gateway:ReadTime","name":"ReadTime","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:TimeSinceLastRecoveryPoint","name":"TimeSinceLastRecoveryPoint","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:TotalCacheSize","name":"TotalCacheSize","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:UploadBufferFree","name":"UploadBufferFree","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:UploadBufferPercentUsed","name":"UploadBufferPercentUsed","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:UploadBufferUsed","name":"UploadBufferUsed","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:WorkingStorageFree","name":"WorkingStorageFree","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:WorkingStoragePercentUsed","name":"WorkingStoragePercentUsed","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:WorkingStorageUsed","name":"WorkingStorageUsed","defaultStat":"Average"},{"id":"AWS::StorageGateway::Gateway:WriteBytes","name":"WriteBytes","defaultStat":"Sum"},{"id":"AWS::StorageGateway::Gateway:WriteTime","name":"WriteTime","defaultStat":"Average"}]}],"dashboards":[{"id":"StorageGateway:CrossService","name":"Storage Gateway","dependencies":[{"namespace":"AWS/StorageGateway"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:CacheHitPercent"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:CachePercentUsed"}]}]}]},{"id":"StorageGateway","name":"Storage Gateway","dependencies":[{"namespace":"AWS/StorageGateway"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::StorageGateway.gateways"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:CacheHitPercent"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:CachePercentUsed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:CachePercentDirty"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:CloudBytesDownloaded"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:CloudDownloadLatency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:CloudBytesUploaded"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:UploadBufferFree"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:CacheFree"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:UploadBufferPercentUsed"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:UploadBufferUsed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:CacheUsed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:QueuedWrites"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:ReadBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:ReadTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:TotalCacheSize"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:WriteBytes"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:WriteTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:TimeSinceLastRecoveryPoint"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:WorkingStorageFree"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:WorkingStoragePercentUsed"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::StorageGateway::Gateway:WorkingStorageUsed"}]}]}]}]},{"id":"AWS::SWF","dashboard":"SWF","crossServiceDashboard":"SWF:CrossService","resourceTypes":[{"type":"AWS::SWF::API","keyMetric":"AWS::SWF::API:ConsumedCapacity","dashboard":"SWF"}],"controls":{"AWS::SWF.apis":{"type":"resource","resourceType":"AWS::SWF::API","labelField":"APIName","valueField":"APIName"}},"metricTemplates":[{"resourceType":"AWS::SWF::API","namespace":"AWS/SWF","dimensions":[{"dimensionName":"APIName","labelName":"APIName"}],"metrics":[{"id":"AWS::SWF::API:ConsumedCapacity","name":"ConsumedCapacity","defaultStat":"Average"},{"id":"AWS::SWF::API:ThrottledEvents","name":"ThrottledEvents","defaultStat":"Sum"},{"id":"AWS::SWF::API:ProvisionedBucketSize","name":"ProvisionedBucketSize","defaultStat":"Average"},{"id":"AWS::SWF::API:ProvisionedRefillRate","name":"ProvisionedRefillRate","defaultStat":"Average"}]}],"dashboards":[{"id":"SWF:CrossService","name":"SWF","dependencies":[{"namespace":"AWS/SWF"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SWF::API:ConsumedCapacity"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SWF::API:ThrottledEvents"}]}]}]},{"id":"SWF","name":"SWF","dependencies":[{"namespace":"AWS/SWF"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::SWF.apis"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SWF::API:ConsumedCapacity"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SWF::API:ThrottledEvents"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::SWF::API:ProvisionedBucketSize"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::SWF::API:ProvisionedRefillRate"}]}]}]}]},{"id":"AWS::Synthetics::Canary","dashboard":"CloudWatchSynthetics","crossServiceDashboard":"CloudWatchSynthetics:CrossService","resourceTypes":[{"type":"AWS::Synthetics::Canary","keyMetric":"AWS::Synthetics::Canary:Duration","dashboard":"CloudWatchSynthetics","arnRegex":".*:canary:(.*)","describe":"synthetics-describe-canaries-last-run","consoleLink":"/cloudwatch/home?region={region}#synthetics:canary/detail/{CanaryName}"}],"metricTemplates":[{"resourceType":"AWS::Synthetics::Canary","namespace":"CloudWatchSynthetics","dimensions":[{"dimensionName":"CanaryName","labelName":"CanaryName"}],"metrics":[{"id":"AWS::Synthetics::Canary:2xx","name":"2xx","defaultStat":"Sum"},{"id":"AWS::Synthetics::Canary:4xx","name":"4xx","defaultStat":"Sum"},{"id":"AWS::Synthetics::Canary:5xx","name":"5xx","defaultStat":"Sum"},{"id":"AWS::Synthetics::Canary:Duration","name":"Duration","defaultStat":"Maximum"},{"id":"AWS::Synthetics::Canary:Failed","name":"Failed","defaultStat":"Sum"},{"id":"AWS::Synthetics::Canary:Failed requests","name":"Failed requests","defaultStat":"Sum"},{"id":"AWS::Synthetics::Canary:SuccessPercent","name":"SuccessPercent","defaultStat":"Average"}]}],"dashboards":[{"id":"CloudWatchSynthetics:CrossService","name":"Synthetics","dependencies":[{"namespace":"CloudWatchSynthetics"}],"rows":[{"widgets":[{"type":"chart","metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","Duration"]],"title":"Duration:Aggregate"}},{"type":"chart","metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","SuccessPercent"]],"yAxis":{"left":{"max":100,"min":0}},"title":"SuccessPercent:Aggregate"}}]}]},{"id":"CloudWatchSynthetics","name":"Synthetics","dependencies":[{"namespace":"CloudWatchSynthetics"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"tables":[{"resourceType":"AWS::Synthetics::Canary","columns":["CanaryName","LastRun"]}],"rows":[{"widgets":[{"type":"text","height":1,"properties":{"markdown":"\\n# Aggregate metrics\\n"}}]},{"widgets":[{"type":"chart","metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","SuccessPercent",{"label":"Canary count"}]],"view":"singleValue","title":"Canaries","stat":"SampleCount"}},{"type":"chart","metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","Duration",{"label":"Average duration"}]],"view":"singleValue","title":"Duration"}},{"type":"chart","metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","SuccessPercent",{"label":"Success percentage"}]],"view":"singleValue","title":"SuccessPercent"}},{"type":"chart","metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","Failed",{"label":"Failed count","stat":"Sum"}]],"view":"singleValue","title":"Failed"}},{"type":"chart","metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","4xx",{"label":"Errors count"}]],"view":"singleValue","title":"Errors (4xx)","stat":"Sum"}},{"type":"chart","metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","5xx",{"label":"Fault count"}]],"view":"singleValue","title":"Faults (5xx)","stat":"Sum"}}]},{"widgets":[{"type":"chart","width":4,"metrics":[],"properties":{"metrics":[[{"expression":"m2 - m1","label":"Passed","id":"e1"}],["CloudWatchSynthetics","SuccessPercent",{"id":"m2","label":"SuccessPercent","visible":false}],[".","Failed",{"id":"m1","label":"Failed","color":"#d62728","stat":"Sum"}]],"view":"pie","title":"Status","stat":"SampleCount"}},{"type":"chart","width":20,"metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","SuccessPercent",{"label":"Passed (%)"}],["CloudWatchSynthetics","Failed",{"color":"#d62728","stat":"SampleCount","yAxis":"right","label":"Failed (count)"}]],"title":"Canary run","yAxis":{"left":{"max":100,"min":0}}}}]},{"widgets":[{"type":"chart","metrics":[],"properties":{"title":"Duration","metrics":[["CloudWatchSynthetics","Duration",{"label":"p50","stat":"p50"}],["...",{"label":"p90"}],["...",{"stat":"p95","label":"p95"}]],"stat":"p90"}}]},{"widgets":[{"type":"chart","metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","Duration",{"id":"m1"}],[{"expression":"ANOMALY_DETECTION_BAND(m1,2)","label":"Duration (expected)","color":"#95A5A6","id":"e1"}]],"title":"Canary duration"}},{"type":"chart","metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","SuccessPercent"]],"yAxis":{"left":{"max":100,"min":0}}}},{"type":"chart","metrics":[],"properties":{"metrics":[["CloudWatchSynthetics","Failed"]],"title":"Failed canary runs","stat":"Sum"}}]},{"widgets":[{"type":"text","height":1,"properties":{"markdown":"\\n# Resource metrics\\n"}}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Synthetics::Canary:Duration"}]},{"type":"chart","properties":{"yAxis":{"left":{"max":100,"min":0}}},"metrics":[{"metricTemplate":"AWS::Synthetics::Canary:SuccessPercent"}]}]}]}]},{"id":"AWS::Tardigrade","dashboard":"Tardigrade","crossServiceDashboard":"Tardigrade:CrossService","resourceTypes":[{"type":"AWS::Tardigrade::LoadBalancer","keyMetric":"AWS::Tardigrade::LoadBalancer:ProcessedBytes","dashboard":"Tardigrade"}],"controls":{"AWS::Tardigrade.loadBalancers":{"type":"resource","resourceType":"AWS::Tardigrade::LoadBalancer","labelField":"LoadBalancer","valueField":"LoadBalancer"}},"metricTemplates":[{"resourceType":"AWS::Tardigrade::LoadBalancer","namespace":"AWS/Tardigrade","dimensions":[{"dimensionName":"LoadBalancer","labelName":"LoadBalancer"}],"metrics":[{"id":"AWS::Tardigrade::LoadBalancer:ProcessedBytes","name":"ProcessedBytes","defaultStat":"Sum"}]}],"dashboards":[{"id":"Tardigrade:CrossService","name":"Tardigrade","dependencies":[{"namespace":"AWS/Tardigrade"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Tardigrade::LoadBalancer:ProcessedBytes"}]}]}]},{"id":"Tardigrade","name":"Tardigrade","dependencies":[{"namespace":"AWS/Tardigrade"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Tardigrade.loadBalancers"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Tardigrade::LoadBalancer:ProcessedBytes"}]}]}]}]},{"id":"AWS::Timestream","dashboard":"Timestream","crossServiceDashboard":"Timestream:CrossService","resourceTypes":[{"type":"AWS::Timestream::Account","keyMetric":"AWS::Timestream::Account::QueryLatency:SuccessfulRequestLatency","dashboard":"Timestream"},{"type":"AWS::Timestream::Table","keyMetric":"AWS::Timestream::Table::WriteLatency:SuccessfulRequestLatency","dashboard":"Timestream"}],"metricTemplates":[{"id":"AWS::Timestream::CrossService::QueryAccount","resourceType":"AWS::Timestream::Account","namespace":"AWS/Timestream","dimensions":[{"dimensionName":"Operation","dimensionValue":"Query"}],"metrics":[{"id":"AWS::Timestream::CrossService::QueryAccount:UserErrors","name":"UserErrors","defaultStat":"Sum"},{"id":"AWS::Timestream::CrossService::QueryAccount:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::Timestream::CrossService::QueryAccount:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"SampleCount"}]},{"id":"AWS::Timestream::CrossService::WriteTable","resourceType":"AWS::Timestream::Table","namespace":"AWS/Timestream","dimensions":[{"dimensionName":"Operation","dimensionValue":"WriteRecords"},{"dimensionName":"DatabaseName","labelName":"DatabaseName"},{"dimensionName":"TableName","labelName":"TableName"}],"metrics":[{"id":"AWS::Timestream::CrossService::WriteTable:UserErrors","name":"UserErrors","defaultStat":"Sum"},{"id":"AWS::Timestream::CrossService::WriteTable:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::Timestream::CrossService::WriteTable:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"SampleCount"}]},{"id":"AWS::Timestream::Account::QueryLatency","resourceType":"AWS::Timestream::Account","namespace":"AWS/Timestream","dimensions":[{"dimensionName":"Operation","dimensionValue":"Query"}],"metrics":[{"id":"AWS::Timestream::Account::QueryLatency:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"p95"}]},{"id":"AWS::Timestream::Account::QueryCount","resourceType":"AWS::Timestream::Account","namespace":"AWS/Timestream","dimensions":[{"dimensionName":"Operation","dimensionValue":"Query"}],"metrics":[{"id":"AWS::Timestream::Account::QueryCount:UserErrors","name":"UserErrors","defaultStat":"Sum"},{"id":"AWS::Timestream::Account::QueryCount:SystemErrors","name":"SystemErrors","defaultStat":"Sum"},{"id":"AWS::Timestream::Account::QueryCount:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"SampleCount"}]},{"id":"AWS::Timestream::Table::WriteLatency","resourceType":"AWS::Timestream::Table","namespace":"AWS/Timestream","dimensions":[{"dimensionName":"Operation","dimensionValue":"WriteRecords"},{"dimensionName":"DatabaseName","labelName":"DatabaseName"},{"dimensionName":"TableName","labelName":"TableName"}],"metrics":[{"id":"AWS::Timestream::Table::WriteLatency:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"p95"}]},{"id":"AWS::Timestream::Table::WriteCount","resourceType":"AWS::Timestream::Table","namespace":"AWS/Timestream","dimensions":[{"dimensionName":"Operation","dimensionValue":"WriteRecords"},{"dimensionName":"DatabaseName","labelName":"DatabaseName"},{"dimensionName":"TableName","labelName":"TableName"}],"metrics":[{"id":"AWS::Timestream::Table::WriteCount:SuccessfulRequestLatency","name":"SuccessfulRequestLatency","defaultStat":"SampleCount"},{"id":"AWS::Timestream::Table::WriteCount:UserErrors","name":"UserErrors","defaultStat":"Sum"},{"id":"AWS::Timestream::Table::WriteCount:SystemErrors","name":"SystemErrors","defaultStat":"Sum"}]}],"dashboards":[{"id":"Timestream:CrossService","name":"Timestream","dependencies":[{"namespace":"AWS/Timestream"}],"rows":[{"widgets":[{"type":"chart","properties":{"title":"Total Queries"},"metrics":[{"metricExpression":"SUM(METRICS())","resourceType":"AWS::Timestream::Account","metricOptions":{"label":"Count"}},{"metricTemplate":"AWS::Timestream::CrossService::QueryAccount:SuccessfulRequestLatency","metricOptions":{"visible":false}},{"metricTemplate":"AWS::Timestream::CrossService::QueryAccount:UserErrors","metricOptions":{"visible":false}},{"metricTemplate":"AWS::Timestream::CrossService::QueryAccount:SystemErrors","metricOptions":{"visible":false}}]},{"type":"chart","properties":{"title":"Total Ingest"},"metrics":[{"metricExpression":"SUM(METRICS())","resourceType":"AWS::Timestream::Table","metricOptions":{"label":"Count"}},{"metricTemplate":"AWS::Timestream::CrossService::WriteTable:SuccessfulRequestLatency","metricOptions":{"visible":false}},{"metricTemplate":"AWS::Timestream::CrossService::WriteTable:UserErrors","metricOptions":{"visible":false}},{"metricTemplate":"AWS::Timestream::CrossService::WriteTable:SystemErrors","metricOptions":{"visible":false}}]}]}]},{"id":"Timestream","name":"Timestream","dependencies":[{"namespace":"AWS/Timestream"}],"rows":[{"widgets":[{"type":"chart","properties":{"title":"Query Latency"},"metrics":[{"metricTemplate":"AWS::Timestream::Account::QueryLatency:SuccessfulRequestLatency"}]},{"type":"chart","properties":{"title":"WriteRecords Latency"},"metrics":[{"metricExpression":"AVG(METRICS())","resourceType":"AWS::Timestream::Table","metricOptions":{"label":"SuccessfulRequestLatency"}},{"metricTemplate":"AWS::Timestream::Table::WriteLatency:SuccessfulRequestLatency","metricOptions":{"visible":false}}]}]},{"widgets":[{"type":"chart","properties":{"title":"Query Count"},"metrics":[{"metricTemplate":"AWS::Timestream::Account::QueryCount:SuccessfulRequestLatency","metricOptions":{"label":"Count"}}]},{"type":"chart","properties":{"title":"WriteRecords Count"},"metrics":[{"metricExpression":"SUM(METRICS())","resourceType":"AWS::Timestream::Table","metricOptions":{"label":"Count"}},{"metricTemplate":"AWS::Timestream::Table::WriteCount:SuccessfulRequestLatency","metricOptions":{"visible":false}}]}]},{"widgets":[{"type":"chart","properties":{"title":"Query Errors"},"metrics":[{"metricExpression":"SUM(METRICS())","resourceType":"AWS::Timestream::Account","metricOptions":{"label":"Errors"}},{"metricTemplate":"AWS::Timestream::Account::QueryCount:UserErrors","metricOptions":{"visible":false}},{"metricTemplate":"AWS::Timestream::Account::QueryCount:SystemErrors","metricOptions":{"visible":false}}]},{"type":"chart","properties":{"title":"WriteRecords Errors"},"metrics":[{"metricExpression":"SUM(METRICS())","resourceType":"AWS::Timestream::Table","metricOptions":{"label":"Errors"}},{"metricTemplate":"AWS::Timestream::Table::WriteCount:UserErrors","metricOptions":{"visible":false}},{"metricTemplate":"AWS::Timestream::Table::WriteCount:SystemErrors","metricOptions":{"visible":false}}]},{"type":"chart","properties":{"title":"Other Operations Errors"},"metrics":[{"metricExpression":"SUM(SEARCH(\'{AWS/Timestream,Operation} MetricName=\\"UserErrors\\" AND (Operation=\\"ListDatabases\\" OR Operation=\\"ListTables\\" OR Operation=\\"DescribeDatabase\\" OR Operation=\\"DescribeTable\\" OR Operation=\\"CreateDatabase\\" OR Operation=\\"CreateTable\\" OR Operation=\\"DeleteDatabase\\" OR Operation=\\"DeleteTable\\" OR Operation=\\"UpdateTable\\" )\', \'Sum\', 300))","resourceType":false,"metricOptions":{"label":"Errors"}}]}]}]}]},{"id":"AWS::Tiros","dashboard":"Tiros","crossServiceDashboard":"Tiros:CrossService","resourceTypes":[{"type":"AWS::Tiros::ApiCall","keyMetric":"AWS::Tiros::ApiCall:ErrorCount","dashboard":"Tiros"}],"controls":{"AWS::Tiros.apiCalls":{"type":"resource","resourceType":"AWS::Tiros::ApiCall","labelField":"ApiCall","valueField":"ApiCall"}},"metricTemplates":[{"resourceType":"AWS::Tiros::ApiCall","namespace":"AWS/Tiros","dimensions":[{"dimensionName":"ApiCall","labelName":"ApiCall"},{"dimensionName":"ServerType","labelName":"ServerType"}],"metrics":[{"id":"AWS::Tiros::ApiCall:ErrorCount","name":"ErrorCount","defaultStat":"Sum"},{"id":"AWS::Tiros::ApiCall:RequestCount","name":"RequestCount","defaultStat":"Sum"},{"id":"AWS::Tiros::ApiCall:ResponseCount","name":"ResponseCount","defaultStat":"Sum"}]}],"dashboards":[{"id":"Tiros:CrossService","name":"Tiros","dependencies":[{"namespace":"AWS/Tiros"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Tiros::ApiCall:ErrorCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Tiros::ApiCall:RequestCount"}]}]}]},{"id":"Tiros","name":"Tiros","dependencies":[{"namespace":"AWS/Tiros"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Tiros.apiCalls"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Tiros::ApiCall:ErrorCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Tiros::ApiCall:RequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Tiros::ApiCall:ResponseCount"}]}]}]}]},{"id":"AWS::Transfer::Server","dashboard":"Transfer","crossServiceDashboard":"Transfer:CrossService","resourceTypes":[{"type":"AWS::Transfer::Server","keyMetric":"AWS::Transfer::Server:BytesIn","dashboard":"Transfer","arnRegex":".*:server/(.*)"}],"metricTemplates":[{"resourceType":"AWS::Transfer::Server","namespace":"AWS/Transfer","dimensions":[{"dimensionName":"ServerId","labelName":"ServerId"}],"metrics":[{"id":"AWS::Transfer::Server:BytesIn","name":"BytesIn","defaultStat":"Sum"},{"id":"AWS::Transfer::Server:BytesOut","name":"BytesOut","defaultStat":"Sum"}]}],"dashboards":[{"id":"Transfer:CrossService","name":"Transfer","dependencies":[{"namespace":"AWS/Transfer"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Transfer::Server:BytesIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Transfer::Server:BytesOut"}]}]}]},{"id":"Transfer","name":"Transfer","dependencies":[{"namespace":"AWS/Transfer"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Transfer::Server:BytesIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Transfer::Server:BytesOut"}]}]}]}]},{"id":"AWS::EC2::TransitGateway","dashboard":"TransitGateway","crossServiceDashboard":"TransitGateway:CrossService","resourceTypes":[{"type":"AWS::EC2::TransitGateway","keyMetric":"AWS::EC2::TransitGateway:BytesIn","dashboard":"TransitGateway","arnRegex":".*:transit-gateway/(.*)"}],"metricTemplates":[{"resourceType":"AWS::EC2::TransitGateway","namespace":"AWS/TransitGateway","dimensions":[{"dimensionName":"TransitGateway","labelName":"TransitGateway"}],"metrics":[{"id":"AWS::EC2::TransitGateway:BytesIn","name":"BytesIn","defaultStat":"Sum"},{"id":"AWS::EC2::TransitGateway:BytesOut","name":"BytesOut","defaultStat":"Sum"},{"id":"AWS::EC2::TransitGateway:PacketDropCountBlackhole","name":"PacketDropCountBlackhole","defaultStat":"Sum"},{"id":"AWS::EC2::TransitGateway:PacketDropCountNoRoute","name":"PacketDropCountNoRoute","defaultStat":"Sum"},{"id":"AWS::EC2::TransitGateway:PacketsIn","name":"PacketsIn","defaultStat":"Sum"},{"id":"AWS::EC2::TransitGateway:PacketsOut","name":"PacketsOut","defaultStat":"Sum"}]}],"dashboards":[{"id":"TransitGateway:CrossService","name":"VPC Transit Gateway","dependencies":[{"namespace":"AWS/TransitGateway"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::TransitGateway:BytesIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::TransitGateway:BytesOut"}]}]}]},{"id":"TransitGateway","name":"VPC Transit Gateway","dependencies":[{"namespace":"AWS/TransitGateway"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::TransitGateway:BytesIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::TransitGateway:BytesOut"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::TransitGateway:PacketDropCountBlackhole"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::TransitGateway:PacketDropCountNoRoute"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::TransitGateway:PacketsIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::TransitGateway:PacketsOut"}]}]}]}]},{"id":"AWS::Translate","dashboard":"Translate","crossServiceDashboard":"Translate:CrossService","resourceTypes":[{"type":"AWS::Translate::LanguagePair","keyMetric":"AWS::Translate::LanguagePair:CharacterCount","dashboard":"Translate"}],"controls":{"AWS::Translate.languagePairs":{"type":"resource","resourceType":"AWS::Translate::LanguagePair","labelField":"LanguagePair","valueField":"LanguagePair"}},"metricTemplates":[{"resourceType":"AWS::Translate::LanguagePair","namespace":"AWS/Translate","dimensions":[{"dimensionName":"LanguagePair","labelName":"LanguagePair"},{"dimensionName":"Operation","labelName":"Operation"}],"metrics":[{"id":"AWS::Translate::LanguagePair:CharacterCount","name":"CharacterCount","defaultStat":"Sum"},{"id":"AWS::Translate::LanguagePair:ResponseTime","name":"ResponseTime","defaultStat":"Average"},{"id":"AWS::Translate::LanguagePair:ServerErrorCount","name":"ServerErrorCount","defaultStat":"Sum"},{"id":"AWS::Translate::LanguagePair:SuccessfulRequestCount","name":"SuccessfulRequestCount","defaultStat":"Sum"},{"id":"AWS::Translate::LanguagePair:ThrottledCount","name":"ThrottledCount","defaultStat":"Sum"},{"id":"AWS::Translate::LanguagePair:UserErrorCount","name":"UserErrorCount","defaultStat":"Sum"}]}],"dashboards":[{"id":"Translate:CrossService","name":"Translate","dependencies":[{"namespace":"AWS/Translate"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Translate::LanguagePair:CharacterCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Translate::LanguagePair:ResponseTime"}]}]}]},{"id":"Translate","name":"Translate","dependencies":[{"namespace":"AWS/Translate"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::Translate.languagePairs"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Translate::LanguagePair:CharacterCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Translate::LanguagePair:ResponseTime"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Translate::LanguagePair:ServerErrorCount"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::Translate::LanguagePair:SuccessfulRequestCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Translate::LanguagePair:ThrottledCount"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::Translate::LanguagePair:UserErrorCount"}]}]}]}]},{"id":"AWS::TrustedAdvisor","dashboard":"TrustedAdvisor","crossServiceDashboard":"TrustedAdvisor:CrossService","resourceTypes":[{"type":"AWS::TrustedAdvisor::Check","keyMetric":"AWS::TrustedAdvisor::Check:RedResources","dashboard":"TrustedAdvisor"}],"controls":{"AWS::TrustedAdvisor.checks":{"type":"resource","resourceType":"AWS::TrustedAdvisor::Check","labelField":"CheckName","valueField":"CheckName"}},"metricTemplates":[{"resourceType":"AWS::TrustedAdvisor::Check","namespace":"AWS/TrustedAdvisor","dimensions":[{"dimensionName":"CheckName","labelName":"CheckName"}],"metrics":[{"id":"AWS::TrustedAdvisor::Check:RedResources","name":"RedResources","defaultStat":"Average"},{"id":"AWS::TrustedAdvisor::Check:YellowResources","name":"YellowResources","defaultStat":"Average"}]}],"dashboards":[{"id":"TrustedAdvisor:CrossService","name":"Trusted Advisor","dependencies":[{"namespace":"AWS/TrustedAdvisor"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::TrustedAdvisor::Check:RedResources"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::TrustedAdvisor::Check:YellowResources"}]}]}]},{"id":"TrustedAdvisor","name":"Trusted Advisor","dependencies":[{"namespace":"AWS/TrustedAdvisor"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::TrustedAdvisor.checks"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::TrustedAdvisor::Check:RedResources"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::TrustedAdvisor::Check:YellowResources"}]}]}]}]},{"id":"AWS::Usage","dashboard":"Usage","resourceTypes":[{"type":"AWS::Usage::API","keyMetric":"AWS::Usage::API:CallCount","dashboard":"Usage"}],"metricTemplates":[{"resourceType":"AWS::Usage::API","namespace":"AWS/Usage","dimensions":[{"dimensionName":"Service","labelName":"Service"},{"dimensionName":"Resource","labelName":"Resource"},{"dimensionName":"Type","labelName":"Type"},{"dimensionName":"Class","labelName":"Class"}],"metrics":[{"id":"AWS::Usage::API:CallCount","name":"CallCount","defaultStat":"Sum"}]}],"dashboards":[{"id":"Usage:CrossService","name":"Usage","dependencies":[{"namespace":"AWS/Usage"}],"rows":[{"widgets":[{"type":"chart","metrics":[],"properties":{"title":"PutMetricData","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","PutMetricData","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"GetMetricData","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","GetMetricData","Type","API","Class","None",{"stat":"Sum","period":300}]]}}]}]},{"id":"Usage","name":"Usage","dependencies":[{"namespace":"AWS/Usage"}],"rows":[{"widgets":[{"type":"chart","metrics":[],"properties":{"title":"PutMetricData","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","PutMetricData","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"GetMetricData","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","GetMetricData","Type","API","Class","None",{"stat":"Sum","period":300}]]}}]},{"widgets":[{"type":"chart","metrics":[],"properties":{"title":"GetMetricStatistics","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","GetMetricStatistics","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"ListMetrics","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","ListMetrics","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"GetMetricWidgetImage","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","GetMetricWidgetImage","Type","API","Class","None",{"stat":"Sum","period":300}]]}}]},{"widgets":[{"type":"chart","metrics":[],"properties":{"title":"PutDashboard","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","PutDashboard","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"GetDashboard","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","GetDashboard","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"ListDashboards","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","ListDashboards","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"DeleteDashboards","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","DeleteDashboards","Type","API","Class","None",{"stat":"Sum","period":300}]]}}]},{"widgets":[{"type":"chart","metrics":[],"properties":{"title":"DisableAlarmActions","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","DisableAlarmActions","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"EnableAlarmActions","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","EnableAlarmActions","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"DescribeAlarms","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","DescribeAlarms","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"DescribeAlarmsForMetric","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","DescribeAlarmsForMetric","Type","API","Class","None",{"stat":"Sum","period":300}]]}}]},{"widgets":[{"type":"chart","metrics":[],"properties":{"title":"DeleteAlarms","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","DeleteAlarms","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"DescribeAlarmHistory","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","DescribeAlarmHistory","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"PutMetricAlarm","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","PutMetricAlarm","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"SetAlarmState","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","SetAlarmState","Type","API","Class","None",{"stat":"Sum","period":300}]]}}]},{"widgets":[{"type":"chart","metrics":[],"properties":{"title":"TagResource","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","TagResource","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"UntagResource","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","UntagResource","Type","API","Class","None",{"stat":"Sum","period":300}]]}},{"type":"chart","metrics":[],"properties":{"title":"ListTagsForResource","metrics":[["AWS/Usage","CallCount","Service","CloudWatch","Resource","ListTagsForResource","Type","API","Class","None",{"stat":"Sum","period":300}]]}}]}]}]},{"id":"AWS::EC2::VPNConnection","dashboard":"VPN","crossServiceDashboard":"VPN:CrossService","resourceTypes":[{"type":"AWS::EC2::VPNConnection","keyMetric":"AWS::EC2::VPNConnection:TunnelDataIn","dashboard":"VPN","arnRegex":".*:vpn-connection/(.*)"}],"controls":{"AWS::EC2::VPNConnection.resources":{"type":"resource","resourceType":"AWS::EC2::VPNConnection","labelField":"VpnId","valueField":"VpnId"}},"metricTemplates":[{"resourceType":"AWS::EC2::VPNConnection","namespace":"AWS/VPN","dimensions":[{"dimensionName":"VpnId","labelName":"VpnId"}],"metrics":[{"id":"AWS::EC2::VPNConnection:TunnelDataIn","name":"TunnelDataIn","defaultStat":"Sum"},{"id":"AWS::EC2::VPNConnection:TunnelState","name":"TunnelState","defaultStat":"Average"},{"id":"AWS::EC2::VPNConnection:TunnelDataOut","name":"TunnelDataOut","defaultStat":"Sum"}]}],"dashboards":[{"id":"VPN:CrossService","name":"VPC VPN","dependencies":[{"namespace":"AWS/VPN"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::VPNConnection:TunnelDataIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::VPNConnection:TunnelState"}]}]}]},{"id":"VPN","name":"VPC VPN","dependencies":[{"namespace":"AWS/VPN"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::EC2::VPNConnection.resources"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::VPNConnection:TunnelDataIn"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::VPNConnection:TunnelState"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::EC2::VPNConnection:TunnelDataOut"}]}]}]}]},{"id":"AWS::WorkMail","dashboard":"WorkMail","crossServiceDashboard":"WorkMail:CrossService","resourceTypes":[{"type":"AWS::WorkMail::Organization","keyMetric":"AWS::WorkMail::Organization:OrganizationEmailReceived","dashboard":"WorkMail","arnRegex":".*:organization/(.*)"}],"controls":{"AWS::WorkMail.organizations":{"type":"resource","resourceType":"AWS::WorkMail::Organization","labelField":"OrganizationId","valueField":"OrganizationId"}},"metricTemplates":[{"resourceType":"AWS::WorkMail::Organization","namespace":"AWS/WorkMail","dimensions":[{"dimensionName":"OrganizationId","labelName":"OrganizationId"}],"metrics":[{"id":"AWS::WorkMail::Organization:OrganizationEmailReceived","name":"OrganizationEmailReceived","defaultStat":"Sum"},{"id":"AWS::WorkMail::Organization:OutgoingEmailSent","name":"OutgoingEmailSent","defaultStat":"Sum"},{"id":"AWS::WorkMail::Organization:MailboxEmailDelivered","name":"MailboxEmailDelivered","defaultStat":"Sum"},{"id":"AWS::WorkMail::Organization:OutgoingEmailBounced","name":"OutgoingEmailBounced","defaultStat":"Sum"},{"id":"AWS::WorkMail::Organization:IncomingEmailBounced","name":"IncomingEmailBounced","defaultStat":"Sum"}]}],"dashboards":[{"id":"WorkMail:CrossService","name":"WorkMail","dependencies":[{"namespace":"AWS/WorkMail"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkMail::Organization:OrganizationEmailReceived"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkMail::Organization:OutgoingEmailSent"}]}]}]},{"id":"WorkMail","name":"WorkMail","dependencies":[{"namespace":"AWS/WorkMail"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::WorkMail.organizations"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkMail::Organization:OrganizationEmailReceived"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkMail::Organization:MailboxEmailDelivered"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkMail::Organization:OutgoingEmailBounced"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkMail::Organization:IncomingEmailBounced"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkMail::Organization:OutgoingEmailSent"}]}]}]}]},{"id":"AWS::WorkSpaces","dashboard":"WorkSpaces","crossServiceDashboard":"WorkSpaces:CrossService","resourceTypes":[{"type":"AWS::WorkSpaces::Workspace","keyMetric":"AWS::WorkSpaces::Workspace:Available","dashboard":"WorkSpaces","arnRegex":".*:workspace/(.*)"}],"controls":{"AWS::WorkSpaces.workspaces":{"type":"resource","resourceType":"AWS::WorkSpaces::Workspace","labelField":"WorkspaceId","valueField":"WorkspaceId"}},"metricTemplates":[{"resourceType":"AWS::WorkSpaces::Workspace","namespace":"AWS/WorkSpaces","dimensions":[{"dimensionName":"WorkspaceId","labelName":"WorkspaceId"}],"metrics":[{"id":"AWS::WorkSpaces::Workspace:Available","name":"Available","defaultStat":"Average"},{"id":"AWS::WorkSpaces::Workspace:Unhealthy","name":"Unhealthy","defaultStat":"Average"},{"id":"AWS::WorkSpaces::Workspace:SessionLaunchTime","name":"SessionLaunchTime","defaultStat":"Average"},{"id":"AWS::WorkSpaces::Workspace:ConnectionSuccess","name":"ConnectionSuccess","defaultStat":"Sum"},{"id":"AWS::WorkSpaces::Workspace:ConnectionFailure","name":"ConnectionFailure","defaultStat":"Sum"},{"id":"AWS::WorkSpaces::Workspace:ConnectionAttempt","name":"ConnectionAttempt","defaultStat":"Sum"},{"id":"AWS::WorkSpaces::Workspace:InSessionLatency","name":"InSessionLatency","defaultStat":"Average"},{"id":"AWS::WorkSpaces::Workspace:SessionDisconnect","name":"SessionDisconnect","defaultStat":"Sum"},{"id":"AWS::WorkSpaces::Workspace:UserConnected","name":"UserConnected","defaultStat":"Sum"},{"id":"AWS::WorkSpaces::Workspace:Stopped","name":"Stopped","defaultStat":"Sum"},{"id":"AWS::WorkSpaces::Workspace:Maintenance","name":"Maintenance","defaultStat":"Sum"}]}],"dashboards":[{"id":"WorkSpaces:CrossService","name":"WorkSpaces","dependencies":[{"namespace":"AWS/WorkSpaces"}],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:Available"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:Unhealthy"}]}]}]},{"id":"WorkSpaces","name":"WorkSpaces","dependencies":[{"namespace":"AWS/WorkSpaces"}],"controls":["Shared::View.AlarmState","Shared::Group.ResourceGroup","AWS::WorkSpaces.workspaces"],"rows":[{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:Available"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:Unhealthy"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:SessionLaunchTime"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:ConnectionSuccess"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:ConnectionFailure"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:ConnectionAttempt"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:InSessionLatency"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:SessionDisconnect"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:UserConnected"}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:Stopped"}]},{"type":"chart","metrics":[{"metricTemplate":"AWS::WorkSpaces::Workspace:Maintenance"}]}]}]}]},{"id":"AWS::XRay","resourceTypes":[{"type":"CW::XRay::Node","keyMetric":"CW::XRay::Node:TracedRequestCount","dashboard":"XRay:Node","drawerDashboard":"XRay:Drawer","alarmPatterns":[{"namespace":"AWS/X-Ray","dimensions":[{"dimensionName":"ServiceName","labelName":"ServiceName"},{"dimensionName":"ServiceType","labelName":"ServiceType"},{"dimensionName":"GroupName","labelName":"GroupName"}]},{"namespace":"AWS/X-Ray","dimensions":[{"dimensionName":"ServiceName","labelName":"ServiceName"},{"dimensionName":"ServiceType","labelName":"ServiceType"},{"dimensionName":"GroupName","labelName":""}]}]}],"metricTemplates":[{"resourceType":"CW::XRay::Node","namespace":"AWS/X-Ray","dimensions":[{"dimensionName":"GroupName","labelName":"GroupName"},{"dimensionName":"ServiceName","labelName":"ServiceName"},{"dimensionName":"ServiceType","labelName":"ServiceType"}],"metrics":[{"id":"CW::XRay::Node:ResponseTime","name":"ResponseTime","defaultStat":"p50"},{"id":"CW::XRay::Node:TracedRequestCount","name":"TracedRequestCount","defaultStat":"Sum"},{"id":"CW::XRay::Node:FaultRate","name":"FaultRate","defaultStat":"Average"},{"id":"CW::XRay::Node:OkRate","name":"OkRate","defaultStat":"Average"},{"id":"CW::XRay::Node:ThrottleRate","name":"ThrottleRate","defaultStat":"Average"},{"id":"CW::XRay::Node:ErrorRate","name":"ErrorRate","defaultStat":"Average"}]}],"dashboards":[{"id":"XRay:Drawer","name":"XRay Node","dependencies":[{"namespace":"AWS/X-Ray"}],"rows":[{"widgets":[{"type":"chart","properties":{"title":"Latency"},"metrics":[{"metricTemplate":"CW::XRay::Node:ResponseTime","metricOptions":{"stat":"p50","color":"#1f77b4"}},{"metricTemplate":"CW::XRay::Node:ResponseTime","metricOptions":{"stat":"p90","color":"#e377c2"}}]},{"type":"chart","metrics":[{"metricTemplate":"CW::XRay::Node:TracedRequestCount","metricOptions":{"stat":"Sum","id":"m1","visible":false}},{"metricExpression":"FILL(m1, 0)","resourceType":"CW::XRay::Node","metricOptions":{"id":"e1","label":"TracedRequestCount","color":"#8c564b"}}]},{"type":"chart","metrics":[{"metricTemplate":"CW::XRay::Node:FaultRate","metricOptions":{"stat":"Average","id":"m1","visible":false}},{"metricExpression":"100 * FILL(m1, 0)","resourceType":"CW::XRay::Node","metricOptions":{"id":"e1","label":"FaultRate","color":"#d62728"}}]}]}]},{"id":"XRay:Node","name":"XRay Node","dependencies":[{"namespace":"AWS/X-Ray"}],"rows":[{"widgets":[{"type":"chart","properties":{"title":"Latency"},"metrics":[{"metricTemplate":"CW::XRay::Node:ResponseTime","metricOptions":{"stat":"p50","color":"#1f77b4"}},{"metricTemplate":"CW::XRay::Node:ResponseTime","metricOptions":{"stat":"p90","color":"#e377c2"}}]},{"type":"chart","metrics":[{"metricTemplate":"CW::XRay::Node:TracedRequestCount","metricOptions":{"stat":"Sum","id":"m1","visible":false}},{"metricExpression":"FILL(m1, 0)","resourceType":"CW::XRay::Node","metricOptions":{"id":"e1","label":"TracedRequestCount","color":"#8c564b"}}]},{"type":"chart","metrics":[{"metricTemplate":"CW::XRay::Node:FaultRate","metricOptions":{"stat":"Average","id":"m1","visible":false}},{"metricExpression":"100 * FILL(m1, 0)","resourceType":"CW::XRay::Node","metricOptions":{"id":"e1","label":"FaultRate","color":"#d62728"}}]}]},{"widgets":[{"type":"chart","metrics":[{"metricTemplate":"CW::XRay::Node:OkRate","metricOptions":{"stat":"Average","id":"m1","visible":false}},{"metricExpression":"100 * FILL(m1, 0)","resourceType":"CW::XRay::Node","metricOptions":{"id":"e1","label":"OkRate","color":"#2ca02c"}}]},{"type":"chart","metrics":[{"metricTemplate":"CW::XRay::Node:ErrorRate","metricOptions":{"stat":"Average","id":"m1","visible":false}},{"metricExpression":"100 * FILL(m1, 0)","resourceType":"CW::XRay::Node","metricOptions":{"id":"e1","label":"ErrorRate","color":"#ff7f0e"}}]},{"type":"chart","metrics":[{"metricTemplate":"CW::XRay::Node:ThrottleRate","metricOptions":{"stat":"Average","id":"m1","visible":false}},{"metricExpression":"100 * FILL(m1, 0)","resourceType":"CW::XRay::Node","metricOptions":{"id":"e1","label":"ThrottleRate","color":"#9467bd"}}]}]}]}]}]'); /***/ }), -/***/ 46510: -/***/ ((module) => { +/***/ 31854: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -module.exports = JSON.parse('{"Types":{"AWS::ACMPCA::Certificate":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the issued certificate.","Certificate":"The issued Base64 PEM-encoded certificate.","Ref":"This reference should not be used in CloudFormation templates. Instead, use `AWS::ACMPCA::Certificate.Arn` to identify a certificate, and use `AWS::ACMPCA::Certificate.CertificateAuthorityArn` to identify a certificate authority."},"description":"The `AWS::ACMPCA::Certificate` resource is used to issue a certificate using your private certificate authority. For more information, see the [IssueCertificate](https://docs.aws.amazon.com/privateca/latest/APIReference/API_IssueCertificate.html) action.","properties":{"ApiPassthrough":"Specifies X.509 certificate information to be included in the issued certificate. An `APIPassthrough` or `APICSRPassthrough` template variant must be selected, or else this parameter is ignored.","CertificateAuthorityArn":"The Amazon Resource Name (ARN) for the private CA issues the certificate.","CertificateSigningRequest":"The certificate signing request (CSR) for the certificate.","SigningAlgorithm":"The name of the algorithm that will be used to sign the certificate to be issued.\\n\\nThis parameter should not be confused with the `SigningAlgorithm` parameter used to sign a CSR in the `CreateCertificateAuthority` action.\\n\\n> The specified signing algorithm family (RSA or ECDSA) must match the algorithm family of the CA\'s secret key.","TemplateArn":"Specifies a custom configuration template to use when issuing a certificate. If this parameter is not provided, AWS Private CA defaults to the `EndEntityCertificate/V1` template. For more information about AWS Private CA templates, see [Using Templates](https://docs.aws.amazon.com/privateca/latest/userguide/UsingTemplates.html) .","Validity":"The period of time during which the certificate will be valid.","ValidityNotBefore":"Information describing the start of the validity period of the certificate. This parameter sets the “Not Before\\" date for the certificate.\\n\\nBy default, when issuing a certificate, AWS Private CA sets the \\"Not Before\\" date to the issuance time minus 60 minutes. This compensates for clock inconsistencies across computer systems. The `ValidityNotBefore` parameter can be used to customize the “Not Before” value.\\n\\nUnlike the `Validity` parameter, the `ValidityNotBefore` parameter is optional.\\n\\nThe `ValidityNotBefore` value is expressed as an explicit date and time, using the `Validity` type value `ABSOLUTE` ."}},"AWS::ACMPCA::Certificate.ApiPassthrough":{"attributes":{},"description":"Contains X.509 certificate information to be placed in an issued certificate. An `APIPassthrough` or `APICSRPassthrough` template variant must be selected, or else this parameter is ignored.\\n\\nIf conflicting or duplicate certificate information is supplied from other sources, AWS Private CA applies [order of operation rules](https://docs.aws.amazon.com/privateca/latest/userguide/UsingTemplates.html#template-order-of-operations) to determine what information is used.","properties":{"Extensions":"Specifies X.509 extension information for a certificate.","Subject":"Contains information about the certificate subject. The Subject field in the certificate identifies the entity that owns or controls the public key in the certificate. The entity can be a user, computer, device, or service. The Subject must contain an X.500 distinguished name (DN). A DN is a sequence of relative distinguished names (RDNs). The RDNs are separated by commas in the certificate."}},"AWS::ACMPCA::Certificate.CustomAttribute":{"attributes":{},"description":"Defines the X.500 relative distinguished name (RDN).","properties":{"ObjectIdentifier":"Specifies the object identifier (OID) of the attribute type of the relative distinguished name (RDN).","Value":"Specifies the attribute value of relative distinguished name (RDN)."}},"AWS::ACMPCA::Certificate.CustomExtension":{"attributes":{},"description":"Specifies the X.509 extension information for a certificate.\\n\\nExtensions present in `CustomExtensions` follow the `ApiPassthrough` [template rules](https://docs.aws.amazon.com/privateca/latest/userguide/UsingTemplates.html#template-order-of-operations) .","properties":{"Critical":"Specifies the critical flag of the X.509 extension.","ObjectIdentifier":"Specifies the object identifier (OID) of the X.509 extension. For more information, see the [Global OID reference database.](https://docs.aws.amazon.com/https://oidref.com/2.5.29)","Value":"Specifies the base64-encoded value of the X.509 extension."}},"AWS::ACMPCA::Certificate.EdiPartyName":{"attributes":{},"description":"Describes an Electronic Data Interchange (EDI) entity as described in as defined in [Subject Alternative Name](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc5280) in RFC 5280.","properties":{"NameAssigner":"Specifies the name assigner.","PartyName":"Specifies the party name."}},"AWS::ACMPCA::Certificate.ExtendedKeyUsage":{"attributes":{},"description":"Specifies additional purposes for which the certified public key may be used other than basic purposes indicated in the `KeyUsage` extension.","properties":{"ExtendedKeyUsageObjectIdentifier":"Specifies a custom `ExtendedKeyUsage` with an object identifier (OID).","ExtendedKeyUsageType":"Specifies a standard `ExtendedKeyUsage` as defined as in [RFC 5280](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.12) ."}},"AWS::ACMPCA::Certificate.Extensions":{"attributes":{},"description":"Contains X.509 extension information for a certificate.","properties":{"CertificatePolicies":"Contains a sequence of one or more policy information terms, each of which consists of an object identifier (OID) and optional qualifiers. For more information, see NIST\'s definition of [Object Identifier (OID)](https://docs.aws.amazon.com/https://csrc.nist.gov/glossary/term/Object_Identifier) .\\n\\nIn an end-entity certificate, these terms indicate the policy under which the certificate was issued and the purposes for which it may be used. In a CA certificate, these terms limit the set of policies for certification paths that include this certificate.","CustomExtensions":"Contains a sequence of one or more X.509 extensions, each of which consists of an object identifier (OID), a base64-encoded value, and the critical flag. For more information, see the [Global OID reference database.](https://docs.aws.amazon.com/https://oidref.com/2.5.29)","ExtendedKeyUsage":"Specifies additional purposes for which the certified public key may be used other than basic purposes indicated in the `KeyUsage` extension.","KeyUsage":"Defines one or more purposes for which the key contained in the certificate can be used. Default value for each option is false.","SubjectAlternativeNames":"The subject alternative name extension allows identities to be bound to the subject of the certificate. These identities may be included in addition to or in place of the identity in the subject field of the certificate."}},"AWS::ACMPCA::Certificate.GeneralName":{"attributes":{},"description":"Describes an ASN.1 X.400 `GeneralName` as defined in [RFC 5280](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc5280) . Only one of the following naming options should be provided. Providing more than one option results in an `InvalidArgsException` error.","properties":{"DirectoryName":"Contains information about the certificate subject. The certificate can be one issued by your private certificate authority (CA) or it can be your private CA certificate. The Subject field in the certificate identifies the entity that owns or controls the public key in the certificate. The entity can be a user, computer, device, or service. The Subject must contain an X.500 distinguished name (DN). A DN is a sequence of relative distinguished names (RDNs). The RDNs are separated by commas in the certificate. The DN must be unique for each entity, but your private CA can issue more than one certificate with the same DN to the same entity.","DnsName":"Represents `GeneralName` as a DNS name.","EdiPartyName":"Represents `GeneralName` as an `EdiPartyName` object.","IpAddress":"Represents `GeneralName` as an IPv4 or IPv6 address.","OtherName":"Represents `GeneralName` using an `OtherName` object.","RegisteredId":"Represents `GeneralName` as an object identifier (OID).","Rfc822Name":"Represents `GeneralName` as an [RFC 822](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc822) email address.","UniformResourceIdentifier":"Represents `GeneralName` as a URI."}},"AWS::ACMPCA::Certificate.KeyUsage":{"attributes":{},"description":"Defines one or more purposes for which the key contained in the certificate can be used. Default value for each option is false.","properties":{"CRLSign":"Key can be used to sign CRLs.","DataEncipherment":"Key can be used to decipher data.","DecipherOnly":"Key can be used only to decipher data.","DigitalSignature":"Key can be used for digital signing.","EncipherOnly":"Key can be used only to encipher data.","KeyAgreement":"Key can be used in a key-agreement protocol.","KeyCertSign":"Key can be used to sign certificates.","KeyEncipherment":"Key can be used to encipher data.","NonRepudiation":"Key can be used for non-repudiation."}},"AWS::ACMPCA::Certificate.OtherName":{"attributes":{},"description":"Defines a custom ASN.1 X.400 `GeneralName` using an object identifier (OID) and value. The OID must satisfy the regular expression shown below. For more information, see NIST\'s definition of [Object Identifier (OID)](https://docs.aws.amazon.com/https://csrc.nist.gov/glossary/term/Object_Identifier) .","properties":{"TypeId":"Specifies an OID.","Value":"Specifies an OID value."}},"AWS::ACMPCA::Certificate.PolicyInformation":{"attributes":{},"description":"Defines the X.509 `CertificatePolicies` extension.","properties":{"CertPolicyId":"Specifies the object identifier (OID) of the certificate policy under which the certificate was issued. For more information, see NIST\'s definition of [Object Identifier (OID)](https://docs.aws.amazon.com/https://csrc.nist.gov/glossary/term/Object_Identifier) .","PolicyQualifiers":"Modifies the given `CertPolicyId` with a qualifier. AWS Private CA supports the certification practice statement (CPS) qualifier."}},"AWS::ACMPCA::Certificate.PolicyQualifierInfo":{"attributes":{},"description":"Modifies the `CertPolicyId` of a `PolicyInformation` object with a qualifier. AWS Private CA supports the certification practice statement (CPS) qualifier.","properties":{"PolicyQualifierId":"Identifies the qualifier modifying a `CertPolicyId` .","Qualifier":"Defines the qualifier type. AWS Private CA supports the use of a URI for a CPS qualifier in this field."}},"AWS::ACMPCA::Certificate.Qualifier":{"attributes":{},"description":"Defines a `PolicyInformation` qualifier. AWS Private CA supports the [certification practice statement (CPS) qualifier](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.4) defined in RFC 5280.","properties":{"CpsUri":"Contains a pointer to a certification practice statement (CPS) published by the CA."}},"AWS::ACMPCA::Certificate.Subject":{"attributes":{},"description":"Contains information about the certificate subject. The `Subject` field in the certificate identifies the entity that owns or controls the public key in the certificate. The entity can be a user, computer, device, or service. The `Subject` must contain an X.500 distinguished name (DN). A DN is a sequence of relative distinguished names (RDNs). The RDNs are separated by commas in the certificate.","properties":{"CommonName":"For CA and end-entity certificates in a private PKI, the common name (CN) can be any string within the length limit.\\n\\nNote: In publicly trusted certificates, the common name must be a fully qualified domain name (FQDN) associated with the certificate subject.","Country":"Two-digit code that specifies the country in which the certificate subject located.","CustomAttributes":"Contains a sequence of one or more X.500 relative distinguished names (RDNs), each of which consists of an object identifier (OID) and a value. For more information, see NIST’s definition of [Object Identifier (OID)](https://docs.aws.amazon.com/https://csrc.nist.gov/glossary/term/Object_Identifier) .\\n\\n> Custom attributes cannot be used in combination with standard attributes.","DistinguishedNameQualifier":"Disambiguating information for the certificate subject.","GenerationQualifier":"Typically a qualifier appended to the name of an individual. Examples include Jr. for junior, Sr. for senior, and III for third.","GivenName":"First name.","Initials":"Concatenation that typically contains the first letter of the *GivenName* , the first letter of the middle name if one exists, and the first letter of the *Surname* .","Locality":"The locality (such as a city or town) in which the certificate subject is located.","Organization":"Legal name of the organization with which the certificate subject is affiliated.","OrganizationalUnit":"A subdivision or unit of the organization (such as sales or finance) with which the certificate subject is affiliated.","Pseudonym":"Typically a shortened version of a longer *GivenName* . For example, Jonathan is often shortened to John. Elizabeth is often shortened to Beth, Liz, or Eliza.","SerialNumber":"The certificate serial number.","State":"State in which the subject of the certificate is located.","Surname":"Family name. In the US and the UK, for example, the surname of an individual is ordered last. In Asian cultures the surname is typically ordered first.","Title":"A title such as Mr. or Ms., which is pre-pended to the name to refer formally to the certificate subject."}},"AWS::ACMPCA::Certificate.Validity":{"attributes":{},"description":"Length of time for which the certificate issued by your private certificate authority (CA), or by the private CA itself, is valid in days, months, or years. You can issue a certificate by calling the `IssueCertificate` operation.","properties":{"Type":"Specifies whether the `Value` parameter represents days, months, or years.","Value":"A long integer interpreted according to the value of `Type` , below."}},"AWS::ACMPCA::CertificateAuthority":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the private CA that issued the certificate.","CertificateSigningRequest":"The Base64 PEM-encoded certificate signing request (CSR) for your certificate authority certificate.","Ref":"The Amazon Resource Name (ARN) of the certificate authority."},"description":"Use the `AWS::ACMPCA::CertificateAuthority` resource to create a private CA. Once the CA exists, you can use the `AWS::ACMPCA::Certificate` resource to issue a new CA certificate. Alternatively, you can issue a CA certificate using an on-premises CA, and then use the `AWS::ACMPCA::CertificateAuthorityActivation` resource to import the new CA certificate and activate the CA.\\n\\n> Before removing a `AWS::ACMPCA::CertificateAuthority` resource from the CloudFormation stack, disable the affected CA. Otherwise, the action will fail. You can disable the CA by removing its associated `AWS::ACMPCA::CertificateAuthorityActivation` resource from CloudFormation.","properties":{"CsrExtensions":"Specifies information to be added to the extension section of the certificate signing request (CSR).","KeyAlgorithm":"Type of the public key algorithm and size, in bits, of the key pair that your CA creates when it issues a certificate. When you create a subordinate CA, you must use a key algorithm supported by the parent CA.","KeyStorageSecurityStandard":"Specifies a cryptographic key management compliance standard used for handling CA keys.\\n\\nDefault: FIPS_140_2_LEVEL_3_OR_HIGHER\\n\\n> Some AWS Regions do not support the default. When creating a CA in these Regions, you must provide `FIPS_140_2_LEVEL_2_OR_HIGHER` as the argument for `KeyStorageSecurityStandard` . Failure to do this results in an `InvalidArgsException` with the message, \\"A certificate authority cannot be created in this region with the specified security standard.\\"\\n> \\n> For information about security standard support in various Regions, see [Storage and security compliance of AWS Private CA private keys](https://docs.aws.amazon.com/privateca/latest/userguide/data-protection.html#private-keys) .","RevocationConfiguration":"Certificate revocation information used by the [CreateCertificateAuthority](https://docs.aws.amazon.com/privateca/latest/APIReference/API_CreateCertificateAuthority.html) and [UpdateCertificateAuthority](https://docs.aws.amazon.com/privateca/latest/APIReference/API_UpdateCertificateAuthority.html) actions. Your private certificate authority (CA) can configure Online Certificate Status Protocol (OCSP) support and/or maintain a certificate revocation list (CRL). OCSP returns validation information about certificates as requested by clients, and a CRL contains an updated list of certificates revoked by your CA. For more information, see [RevokeCertificate](https://docs.aws.amazon.com/privateca/latest/APIReference/API_RevokeCertificate.html) in the *AWS Private CA API Reference* and [Setting up a certificate revocation method](https://docs.aws.amazon.com/privateca/latest/userguide/revocation-setup.html) in the *AWS Private CA User Guide* .\\n\\n> The following requirements apply to revocation configurations.\\n> \\n> - A configuration disabling CRLs or OCSP must contain only the `Enabled=False` parameter, and will fail if other parameters such as `CustomCname` or `ExpirationInDays` are included.\\n> - In a CRL configuration, the `S3BucketName` parameter must conform to the [Amazon S3 bucket naming rules](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) .\\n> - A configuration containing a custom Canonical Name (CNAME) parameter for CRLs or OCSP must conform to [RFC2396](https://docs.aws.amazon.com/https://www.ietf.org/rfc/rfc2396.txt) restrictions on the use of special characters in a CNAME.\\n> - In a CRL or OCSP configuration, the value of a CNAME parameter must not include a protocol prefix such as \\"http://\\" or \\"https://\\".","SigningAlgorithm":"Name of the algorithm your private CA uses to sign certificate requests.\\n\\nThis parameter should not be confused with the `SigningAlgorithm` parameter used to sign certificates when they are issued.","Subject":"Structure that contains X.500 distinguished name information for your private CA.","Tags":"Key-value pairs that will be attached to the new private CA. You can associate up to 50 tags with a private CA. For information using tags with IAM to manage permissions, see [Controlling Access Using IAM Tags](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_iam-tags.html) .","Type":"Type of your private CA.","UsageMode":"Specifies whether the CA issues general-purpose certificates that typically require a revocation mechanism, or short-lived certificates that may optionally omit revocation because they expire quickly. Short-lived certificate validity is limited to seven days.\\n\\nThe default value is GENERAL_PURPOSE."}},"AWS::ACMPCA::CertificateAuthority.AccessDescription":{"attributes":{},"description":"Provides access information used by the `authorityInfoAccess` and `subjectInfoAccess` extensions described in [RFC 5280](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc5280) .","properties":{"AccessLocation":"The location of `AccessDescription` information.","AccessMethod":"The type and format of `AccessDescription` information."}},"AWS::ACMPCA::CertificateAuthority.AccessMethod":{"attributes":{},"description":"Describes the type and format of extension access. Only one of `CustomObjectIdentifier` or `AccessMethodType` may be provided. Providing both results in `InvalidArgsException` .","properties":{"AccessMethodType":"Specifies the `AccessMethod` .","CustomObjectIdentifier":"An object identifier (OID) specifying the `AccessMethod` . The OID must satisfy the regular expression shown below. For more information, see NIST\'s definition of [Object Identifier (OID)](https://docs.aws.amazon.com/https://csrc.nist.gov/glossary/term/Object_Identifier) ."}},"AWS::ACMPCA::CertificateAuthority.CrlConfiguration":{"attributes":{},"description":"Contains configuration information for a certificate revocation list (CRL). Your private certificate authority (CA) creates base CRLs. Delta CRLs are not supported. You can enable CRLs for your new or an existing private CA by setting the *Enabled* parameter to `true` . Your private CA writes CRLs to an S3 bucket that you specify in the *S3BucketName* parameter. You can hide the name of your bucket by specifying a value for the *CustomCname* parameter. Your private CA copies the CNAME or the S3 bucket name to the *CRL Distribution Points* extension of each certificate it issues. Your S3 bucket policy must give write permission to AWS Private CA.\\n\\nAWS Private CA assets that are stored in Amazon S3 can be protected with encryption. For more information, see [Encrypting Your CRLs](https://docs.aws.amazon.com/privateca/latest/userguide/PcaCreateCa.html#crl-encryption) .\\n\\nYour private CA uses the value in the *ExpirationInDays* parameter to calculate the *nextUpdate* field in the CRL. The CRL is refreshed prior to a certificate\'s expiration date or when a certificate is revoked. When a certificate is revoked, it appears in the CRL until the certificate expires, and then in one additional CRL after expiration, and it always appears in the audit report.\\n\\nA CRL is typically updated approximately 30 minutes after a certificate is revoked. If for any reason a CRL update fails, AWS Private CA makes further attempts every 15 minutes.\\n\\nCRLs contain the following fields:\\n\\n- *Version* : The current version number defined in RFC 5280 is V2. The integer value is 0x1.\\n- *Signature Algorithm* : The name of the algorithm used to sign the CRL.\\n- *Issuer* : The X.500 distinguished name of your private CA that issued the CRL.\\n- *Last Update* : The issue date and time of this CRL.\\n- *Next Update* : The day and time by which the next CRL will be issued.\\n- *Revoked Certificates* : List of revoked certificates. Each list item contains the following information.\\n\\n- *Serial Number* : The serial number, in hexadecimal format, of the revoked certificate.\\n- *Revocation Date* : Date and time the certificate was revoked.\\n- *CRL Entry Extensions* : Optional extensions for the CRL entry.\\n\\n- *X509v3 CRL Reason Code* : Reason the certificate was revoked.\\n- *CRL Extensions* : Optional extensions for the CRL.\\n\\n- *X509v3 Authority Key Identifier* : Identifies the public key associated with the private key used to sign the certificate.\\n- *X509v3 CRL Number:* : Decimal sequence number for the CRL.\\n- *Signature Algorithm* : Algorithm used by your private CA to sign the CRL.\\n- *Signature Value* : Signature computed over the CRL.\\n\\nCertificate revocation lists created by AWS Private CA are DER-encoded. You can use the following OpenSSL command to list a CRL.\\n\\n`openssl crl -inform DER -text -in *crl_path* -noout`\\n\\nFor more information, see [Planning a certificate revocation list (CRL)](https://docs.aws.amazon.com/privateca/latest/userguide/crl-planning.html) in the *AWS Private Certificate Authority User Guide*","properties":{"CustomCname":"Name inserted into the certificate *CRL Distribution Points* extension that enables the use of an alias for the CRL distribution point. Use this value if you don\'t want the name of your S3 bucket to be public.\\n\\n> The content of a Canonical Name (CNAME) record must conform to [RFC2396](https://docs.aws.amazon.com/https://www.ietf.org/rfc/rfc2396.txt) restrictions on the use of special characters in URIs. Additionally, the value of the CNAME must not include a protocol prefix such as \\"http://\\" or \\"https://\\".","Enabled":"Boolean value that specifies whether certificate revocation lists (CRLs) are enabled. You can use this value to enable certificate revocation for a new CA when you call the `CreateCertificateAuthority` operation or for an existing CA when you call the `UpdateCertificateAuthority` operation.","ExpirationInDays":"Validity period of the CRL in days.","S3BucketName":"Name of the S3 bucket that contains the CRL. If you do not provide a value for the *CustomCname* argument, the name of your S3 bucket is placed into the *CRL Distribution Points* extension of the issued certificate. You can change the name of your bucket by calling the [UpdateCertificateAuthority](https://docs.aws.amazon.com/privateca/latest/APIReference/API_UpdateCertificateAuthority.html) operation. You must specify a [bucket policy](https://docs.aws.amazon.com/privateca/latest/userguide/PcaCreateCa.html#s3-policies) that allows AWS Private CA to write the CRL to your bucket.\\n\\n> The `S3BucketName` parameter must conform to the [S3 bucket naming rules](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) .","S3ObjectAcl":"Determines whether the CRL will be publicly readable or privately held in the CRL Amazon S3 bucket. If you choose PUBLIC_READ, the CRL will be accessible over the public internet. If you choose BUCKET_OWNER_FULL_CONTROL, only the owner of the CRL S3 bucket can access the CRL, and your PKI clients may need an alternative method of access.\\n\\nIf no value is specified, the default is PUBLIC_READ.\\n\\n*Note:* This default can cause CA creation to fail in some circumstances. If you have have enabled the Block Public Access (BPA) feature in your S3 account, then you must specify the value of this parameter as `BUCKET_OWNER_FULL_CONTROL` , and not doing so results in an error. If you have disabled BPA in S3, then you can specify either `BUCKET_OWNER_FULL_CONTROL` or `PUBLIC_READ` as the value.\\n\\nFor more information, see [Blocking public access to the S3 bucket](https://docs.aws.amazon.com/privateca/latest/userguide/PcaCreateCa.html#s3-bpa) ."}},"AWS::ACMPCA::CertificateAuthority.CsrExtensions":{"attributes":{},"description":"Describes the certificate extensions to be added to the certificate signing request (CSR).","properties":{"KeyUsage":"Indicates the purpose of the certificate and of the key contained in the certificate.","SubjectInformationAccess":"For CA certificates, provides a path to additional information pertaining to the CA, such as revocation and policy. For more information, see [Subject Information Access](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.2.2) in RFC 5280."}},"AWS::ACMPCA::CertificateAuthority.CustomAttribute":{"attributes":{},"description":"Defines the X.500 relative distinguished name (RDN).","properties":{"ObjectIdentifier":"Specifies the object identifier (OID) of the attribute type of the relative distinguished name (RDN).","Value":"Specifies the attribute value of relative distinguished name (RDN)."}},"AWS::ACMPCA::CertificateAuthority.EdiPartyName":{"attributes":{},"description":"Describes an Electronic Data Interchange (EDI) entity as described in as defined in [Subject Alternative Name](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc5280) in RFC 5280.","properties":{"NameAssigner":"Specifies the name assigner.","PartyName":"Specifies the party name."}},"AWS::ACMPCA::CertificateAuthority.GeneralName":{"attributes":{},"description":"Describes an ASN.1 X.400 `GeneralName` as defined in [RFC 5280](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc5280) . Only one of the following naming options should be provided. Providing more than one option results in an `InvalidArgsException` error.","properties":{"DirectoryName":"Contains information about the certificate subject. The certificate can be one issued by your private certificate authority (CA) or it can be your private CA certificate. The Subject field in the certificate identifies the entity that owns or controls the public key in the certificate. The entity can be a user, computer, device, or service. The Subject must contain an X.500 distinguished name (DN). A DN is a sequence of relative distinguished names (RDNs). The RDNs are separated by commas in the certificate. The DN must be unique for each entity, but your private CA can issue more than one certificate with the same DN to the same entity.","DnsName":"Represents `GeneralName` as a DNS name.","EdiPartyName":"Represents `GeneralName` as an `EdiPartyName` object.","IpAddress":"Represents `GeneralName` as an IPv4 or IPv6 address.","OtherName":"Represents `GeneralName` using an `OtherName` object.","RegisteredId":"Represents `GeneralName` as an object identifier (OID).","Rfc822Name":"Represents `GeneralName` as an [RFC 822](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc822) email address.","UniformResourceIdentifier":"Represents `GeneralName` as a URI."}},"AWS::ACMPCA::CertificateAuthority.KeyUsage":{"attributes":{},"description":"Defines one or more purposes for which the key contained in the certificate can be used. Default value for each option is false.","properties":{"CRLSign":"Key can be used to sign CRLs.","DataEncipherment":"Key can be used to decipher data.","DecipherOnly":"Key can be used only to decipher data.","DigitalSignature":"Key can be used for digital signing.","EncipherOnly":"Key can be used only to encipher data.","KeyAgreement":"Key can be used in a key-agreement protocol.","KeyCertSign":"Key can be used to sign certificates.","KeyEncipherment":"Key can be used to encipher data.","NonRepudiation":"Key can be used for non-repudiation."}},"AWS::ACMPCA::CertificateAuthority.OcspConfiguration":{"attributes":{},"description":"Contains information to enable and configure Online Certificate Status Protocol (OCSP) for validating certificate revocation status.","properties":{"Enabled":"Flag enabling use of the Online Certificate Status Protocol (OCSP) for validating certificate revocation status.","OcspCustomCname":"By default, AWS Private CA injects an Amazon domain into certificates being validated by the Online Certificate Status Protocol (OCSP). A customer can alternatively use this object to define a CNAME specifying a customized OCSP domain.\\n\\n> The content of a Canonical Name (CNAME) record must conform to [RFC2396](https://docs.aws.amazon.com/https://www.ietf.org/rfc/rfc2396.txt) restrictions on the use of special characters in URIs. Additionally, the value of the CNAME must not include a protocol prefix such as \\"http://\\" or \\"https://\\"."}},"AWS::ACMPCA::CertificateAuthority.OtherName":{"attributes":{},"description":"Defines a custom ASN.1 X.400 `GeneralName` using an object identifier (OID) and value. The OID must satisfy the regular expression shown below. For more information, see NIST\'s definition of [Object Identifier (OID)](https://docs.aws.amazon.com/https://csrc.nist.gov/glossary/term/Object_Identifier) .","properties":{"TypeId":"Specifies an OID.","Value":"Specifies an OID value."}},"AWS::ACMPCA::CertificateAuthority.RevocationConfiguration":{"attributes":{},"description":"Certificate revocation information used by the [CreateCertificateAuthority](https://docs.aws.amazon.com/privateca/latest/APIReference/API_CreateCertificateAuthority.html) and [UpdateCertificateAuthority](https://docs.aws.amazon.com/privateca/latest/APIReference/API_UpdateCertificateAuthority.html) actions. Your private certificate authority (CA) can configure Online Certificate Status Protocol (OCSP) support and/or maintain a certificate revocation list (CRL). OCSP returns validation information about certificates as requested by clients, and a CRL contains an updated list of certificates revoked by your CA. For more information, see [RevokeCertificate](https://docs.aws.amazon.com/privateca/latest/APIReference/API_RevokeCertificate.html) in the *AWS Private CA API Reference* and [Setting up a certificate revocation method](https://docs.aws.amazon.com/privateca/latest/userguide/revocation-setup.html) in the *AWS Private CA User Guide* .\\n\\n> The following requirements apply to revocation configurations.\\n> \\n> - A configuration disabling CRLs or OCSP must contain only the `Enabled=False` parameter, and will fail if other parameters such as `CustomCname` or `ExpirationInDays` are included.\\n> - In a CRL configuration, the `S3BucketName` parameter must conform to the [Amazon S3 bucket naming rules](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) .\\n> - A configuration containing a custom Canonical Name (CNAME) parameter for CRLs or OCSP must conform to [RFC2396](https://docs.aws.amazon.com/https://www.ietf.org/rfc/rfc2396.txt) restrictions on the use of special characters in a CNAME.\\n> - In a CRL or OCSP configuration, the value of a CNAME parameter must not include a protocol prefix such as \\"http://\\" or \\"https://\\".","properties":{"CrlConfiguration":"Configuration of the certificate revocation list (CRL), if any, maintained by your private CA.","OcspConfiguration":"Configuration of Online Certificate Status Protocol (OCSP) support, if any, maintained by your private CA."}},"AWS::ACMPCA::CertificateAuthority.Subject":{"attributes":{},"description":"ASN1 subject for the certificate authority.","properties":{"CommonName":"Fully qualified domain name (FQDN) associated with the certificate subject.","Country":"Two-digit code that specifies the country in which the certificate subject located.","CustomAttributes":"Contains a sequence of one or more X.500 relative distinguished names (RDNs), each of which consists of an object identifier (OID) and a value. For more information, see NIST’s definition of [Object Identifier (OID)](https://docs.aws.amazon.com/https://csrc.nist.gov/glossary/term/Object_Identifier) .\\n\\n> Custom attributes cannot be used in combination with standard attributes.","DistinguishedNameQualifier":"Disambiguating information for the certificate subject.","GenerationQualifier":"Typically a qualifier appended to the name of an individual. Examples include Jr. for junior, Sr. for senior, and III for third.","GivenName":"First name.","Initials":"Concatenation that typically contains the first letter of the GivenName, the first letter of the middle name if one exists, and the first letter of the SurName.","Locality":"The locality (such as a city or town) in which the certificate subject is located.","Organization":"Legal name of the organization with which the certificate subject is affiliated.","OrganizationalUnit":"A subdivision or unit of the organization (such as sales or finance) with which the certificate subject is affiliated.","Pseudonym":"Typically a shortened version of a longer GivenName. For example, Jonathan is often shortened to John. Elizabeth is often shortened to Beth, Liz, or Eliza.","SerialNumber":"The certificate serial number.","State":"State in which the subject of the certificate is located.","Surname":"Family name.","Title":"A personal title such as Mr."}},"AWS::ACMPCA::CertificateAuthorityActivation":{"attributes":{"CompleteCertificateChain":"The complete Base64 PEM-encoded certificate chain, including the certificate authority certificate.","Ref":"The Amazon Resource Name (ARN) of the certificate authority."},"description":"The `AWS::ACMPCA::CertificateAuthorityActivation` resource creates and installs a CA certificate on a CA. If no status is specified, the `AWS::ACMPCA::CertificateAuthorityActivation` resource status defaults to ACTIVE. Once the CA has a CA certificate installed, you can use the resource to toggle the CA status field between `ACTIVE` and `DISABLED` .","properties":{"Certificate":"The Base64 PEM-encoded certificate authority certificate.","CertificateAuthorityArn":"The Amazon Resource Name (ARN) of your private CA.","CertificateChain":"The Base64 PEM-encoded certificate chain that chains up to the root CA certificate that you used to sign your private CA certificate.","Status":"Status of your private CA."}},"AWS::ACMPCA::Permission":{"attributes":{},"description":"Grants permissions to the AWS Certificate Manager ( ACM ) service principal ( `acm.amazonaws.com` ) to perform [IssueCertificate](https://docs.aws.amazon.com/privateca/latest/APIReference/API_IssueCertificate.html) , [GetCertificate](https://docs.aws.amazon.com/privateca/latest/APIReference/API_GetCertificate.html) , and [ListPermissions](https://docs.aws.amazon.com/privateca/latest/APIReference/API_ListPermissions.html) actions on a CA. These actions are needed for the ACM principal to renew private PKI certificates requested through ACM and residing in the same AWS account as the CA.\\n\\n**About permissions** - If the private CA and the certificates it issues reside in the same account, you can use `AWS::ACMPCA::Permission` to grant permissions for ACM to carry out automatic certificate renewals.\\n- For automatic certificate renewal to succeed, the ACM service principal needs permissions to create, retrieve, and list permissions.\\n- If the private CA and the ACM certificates reside in different accounts, then permissions cannot be used to enable automatic renewals. Instead, the ACM certificate owner must set up a resource-based policy to enable cross-account issuance and renewals. For more information, see [Using a Resource Based Policy with AWS Private CA](https://docs.aws.amazon.com/privateca/latest/userguide/pca-rbp.html) .\\n\\n> To update an `AWS::ACMPCA::Permission` resource, you must first delete the existing permission resource from the CloudFormation stack and then create a new permission resource with updated properties.","properties":{"Actions":"The private CA actions that can be performed by the designated AWS service. Supported actions are `IssueCertificate` , `GetCertificate` , and `ListPermissions` .","CertificateAuthorityArn":"The Amazon Resource Number (ARN) of the private CA from which the permission was issued.","Principal":"The AWS service or entity that holds the permission. At this time, the only valid principal is `acm.amazonaws.com` .","SourceAccount":"The ID of the account that assigned the permission."}},"AWS::APS::RuleGroupsNamespace":{"attributes":{"Arn":"The ARN of the rules group namespace. For example, `arn:aws:aps:us-west-2:123456789012:rulegroupsnamespace/ws-EXAMPLE-3687-4ac9-853c-EXAMPLEe8f/amp=rules`","Ref":"`Ref` returns the ARN of the rules group namespace. For example, `arn:aws:aps:us-west-2:123456789012:rulegroupsnamespace/ws-EXAMPLE-3687-4ac9-853c-EXAMPLEe8f/amp-rules` ."},"description":"The `AWS::APS::RuleGroupsNamespace` resource creates or updates a rule groups namespace within a Amazon Managed Service for Prometheus workspace. For more information, see [Recording rules and alerting rules](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-Ruler.html) .","properties":{"Data":"The rules definition file for this namespace.","Name":"The name of the rule groups namespace. This property is required.","Tags":"A list of key and value pairs for the workspace resources.","Workspace":"The ARN of the workspace that contains this rule groups namespace."}},"AWS::APS::Workspace":{"attributes":{"Arn":"The ARN of the workspace. For example: `arn:aws:aps:us-west-2:123456789012:workspace/ws-EXAMPLE-3687-4ac9-853c-EXAMPLEe8f` .","PrometheusEndpoint":"The Prometheus endpoint attribute of the workspace. This is the endpoint prefix without the remote_write or query API appended. For example: `https://aps-workspaces.us-west-2.amazonaws.com/workspaces/ws-EXAMPLE-3687-4ac9-853c-EXAMPLEe8f/` .","Ref":"`Ref` returns the ARN of the workspace. For example, `arn:aws:aps:us-west-2:123456789012:workspace/ws-EXAMPLE-3687-4ac9-853c-EXAMPLEe8f` .","WorkspaceId":"The workspace ID. For example: `ws-EXAMPLE-3687-4ac9-853c-EXAMPLEe8f` ."},"description":"The `AWS::APS::Workspace` type specifies an Amazon Managed Service for Prometheus ( Amazon Managed Service for Prometheus ) workspace. A *workspace* is a logical and isolated Prometheus server dedicated to Prometheus resources such as metrics. You can have one or more workspaces in each Region in your account.","properties":{"AlertManagerDefinition":"The alert manager definition for the workspace, as a string. For more information, see [Alert manager and templating](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-alert-manager.html) .","Alias":"An alias that you assign to this workspace to help you identify it. It does not need to be unique.\\n\\nThe alias can be as many as 100 characters and can include any type of characters. Amazon Managed Service for Prometheus automatically strips any blank spaces from the beginning and end of the alias that you specify.","LoggingConfiguration":"The LoggingConfiguration attribute is used to set the logging configuration for the workspace.","Tags":"A list of tag keys and values to associate with the workspace."}},"AWS::APS::Workspace.LoggingConfiguration":{"attributes":{},"description":"The LoggingConfiguration attribute sets the logging configuration for the workspace.","properties":{"LogGroupArn":"The Amazon Resource Name (ARN) of the CloudWatch log group the logs are emitted to."}},"AWS::AccessAnalyzer::Analyzer":{"attributes":{"Ref":"`Ref` returns the ARN of the analyzer created."},"description":"The `AWS::AccessAnalyzer::Analyzer` resource specifies a new analyzer. The analyzer is an object that represents the IAM Access Analyzer feature. An analyzer is required for Access Analyzer to become operational.","properties":{"AnalyzerName":"The name of the analyzer.","ArchiveRules":"Specifies the archive rules to add for the analyzer.","Tags":"The tags to apply to the analyzer.","Type":"The type represents the zone of trust for the analyzer.\\n\\n*Allowed Values* : ACCOUNT | ORGANIZATION"}},"AWS::AccessAnalyzer::Analyzer.ArchiveRule":{"attributes":{},"description":"The criteria for an archive rule.","properties":{"Filter":"The criteria for the rule.","RuleName":"The name of the archive rule."}},"AWS::AccessAnalyzer::Analyzer.Filter":{"attributes":{},"description":"The criteria that defines the rule.\\n\\nTo learn about filter keys that you can use to create an archive rule, see [filter keys](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-reference-filter-keys.html) in the *User Guide* .","properties":{"Contains":"A \\"contains\\" condition to match for the rule.","Eq":"An \\"equals\\" condition to match for the rule.","Exists":"An \\"exists\\" condition to match for the rule.","Neq":"A \\"not equal\\" condition to match for the rule.","Property":"The property used to define the criteria in the filter for the rule."}},"AWS::AmazonMQ::Broker":{"attributes":{"AmqpEndpoints":"The AMQP endpoints of each broker instance as a list of strings.\\n\\n`amqp+ssl://b-4aada85d-a80c-4be0-9d30-e344a01b921e-1.mq.eu-central-amazonaws.com:5671`","Arn":"The Amazon Resource Name (ARN) of the Amazon MQ broker.\\n\\n`arn:aws:mq:us-east-2:123456789012:broker:MyBroker:b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9`","ConfigurationId":"The unique ID that Amazon MQ generates for the configuration.\\n\\n`c-1234a5b6-78cd-901e-2fgh-3i45j6k178l9`","ConfigurationRevision":"The revision number of the configuration.\\n\\n`1`","IpAddresses":"The IP addresses of each broker instance as a list of strings. Does not apply to RabbitMQ brokers.\\n\\n`[\'198.51.100.2\', \'203.0.113.9\']`","MqttEndpoints":"The MQTT endpoints of each broker instance as a list of strings.\\n\\n`mqtt+ssl://b-4aada85d-a80c-4be0-9d30-e344a01b921e-1.mq.eu-central-amazonaws.com:8883`","OpenWireEndpoints":"The OpenWire endpoints of each broker instance as a list of strings.\\n\\n`ssl://b-4aada85d-a80c-4be0-9d30-e344a01b921e-1.mq.eu-central-amazonaws.com:61617`","Ref":"`Ref` returns the Amazon MQ broker ID. For example:\\n\\n`b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9`","StompEndpoints":"The STOMP endpoints of each broker instance as a list of strings.\\n\\n`stomp+ssl://b-4aada85d-a80c-4be0-9d30-e344a01b921e-1.mq.eu-central-amazonaws.com:61614`","WssEndpoints":"The WSS endpoints of each broker instance as a list of strings.\\n\\n`wss://b-4aada85d-a80c-4be0-9d30-e344a01b921e-1.mq.eu-central-amazonaws.com:61619`"},"description":"A *broker* is a message broker environment running on Amazon MQ . It is the basic building block of Amazon MQ .\\n\\nThe `AWS::AmazonMQ::Broker` resource lets you create Amazon MQ for ActiveMQ and Amazon MQ for RabbitMQ brokers, add configuration changes or modify users for a speified ActiveMQ broker, return information about the specified broker, and delete the broker. For more information, see [How Amazon MQ works](https://docs.aws.amazon.com//amazon-mq/latest/developer-guide/amazon-mq-how-it-works.html) in the *Amazon MQ Developer Guide* .\\n\\n- `ec2:CreateNetworkInterface`\\n\\nThis permission is required to allow Amazon MQ to create an elastic network interface (ENI) on behalf of your account.\\n- `ec2:CreateNetworkInterfacePermission`\\n\\nThis permission is required to attach the ENI to the broker instance.\\n- `ec2:DeleteNetworkInterface`\\n- `ec2:DeleteNetworkInterfacePermission`\\n- `ec2:DetachNetworkInterface`\\n- `ec2:DescribeInternetGateways`\\n- `ec2:DescribeNetworkInterfaces`\\n- `ec2:DescribeNetworkInterfacePermissions`\\n- `ec2:DescribeRouteTables`\\n- `ec2:DescribeSecurityGroups`\\n- `ec2:DescribeSubnets`\\n- `ec2:DescribeVpcs`","properties":{"AuthenticationStrategy":"Optional. The authentication strategy used to secure the broker. The default is `SIMPLE` .","AutoMinorVersionUpgrade":"Enables automatic upgrades to new minor versions for brokers, as new broker engine versions are released and supported by Amazon MQ. Automatic upgrades occur during the scheduled maintenance window of the broker or after a manual broker reboot.","BrokerName":"The name of the broker. This value must be unique in your AWS account , 1-50 characters long, must contain only letters, numbers, dashes, and underscores, and must not contain white spaces, brackets, wildcard characters, or special characters.\\n\\n> Do not add personally identifiable information (PII) or other confidential or sensitive information in broker names. Broker names are accessible to other AWS services, including C CloudWatch Logs . Broker names are not intended to be used for private or sensitive data.","Configuration":"A list of information about the configuration. Does not apply to RabbitMQ brokers.","DeploymentMode":"The deployment mode of the broker. Available values:\\n\\n- `SINGLE_INSTANCE`\\n- `ACTIVE_STANDBY_MULTI_AZ`\\n- `CLUSTER_MULTI_AZ`","EncryptionOptions":"Encryption options for the broker. Does not apply to RabbitMQ brokers.","EngineType":"The type of broker engine. Currently, Amazon MQ supports `ACTIVEMQ` and `RABBITMQ` .","EngineVersion":"The version of the broker engine. For a list of supported engine versions, see [Engine](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/broker-engine.html) in the *Amazon MQ Developer Guide* .","HostInstanceType":"The broker\'s instance type.","LdapServerMetadata":"Optional. The metadata of the LDAP server used to authenticate and authorize connections to the broker. Does not apply to RabbitMQ brokers.","Logs":"Enables Amazon CloudWatch logging for brokers.","MaintenanceWindowStartTime":"The scheduled time period relative to UTC during which Amazon MQ begins to apply pending updates or patches to the broker.","PubliclyAccessible":"Enables connections from applications outside of the VPC that hosts the broker\'s subnets.","SecurityGroups":"The list of rules (1 minimum, 125 maximum) that authorize connections to brokers.","StorageType":"The broker\'s storage type.","SubnetIds":"The list of groups that define which subnets and IP ranges the broker can use from different Availability Zones. If you specify more than one subnet, the subnets must be in different Availability Zones. Amazon MQ will not be able to create VPC endpoints for your broker with multiple subnets in the same Availability Zone. A SINGLE_INSTANCE deployment requires one subnet (for example, the default subnet). An ACTIVE_STANDBY_MULTI_AZ deployment (ACTIVEMQ) requires two subnets. A CLUSTER_MULTI_AZ deployment (RABBITMQ) has no subnet requirements when deployed with public accessibility, deployment without public accessibility requires at least one subnet.\\n\\n> If you specify subnets in a shared VPC for a RabbitMQ broker, the associated VPC to which the specified subnets belong must be owned by your AWS account . Amazon MQ will not be able to create VPC enpoints in VPCs that are not owned by your AWS account .","Tags":"An array of key-value pairs. For more information, see [Using Cost Allocation Tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html) in the *Billing and Cost Management User Guide* .","Users":"The list of broker users (persons or applications) who can access queues and topics. For Amazon MQ for RabbitMQ brokers, one and only one administrative user is accepted and created when a broker is first provisioned. All subsequent RabbitMQ users are created by via the RabbitMQ web console or by using the RabbitMQ management API."}},"AWS::AmazonMQ::Broker.ConfigurationId":{"attributes":{},"description":"A list of information about the configuration.\\n\\n> Does not apply to RabbitMQ brokers.","properties":{"Id":"The unique ID that Amazon MQ generates for the configuration.","Revision":"The revision number of the configuration."}},"AWS::AmazonMQ::Broker.EncryptionOptions":{"attributes":{},"description":"Encryption options for the broker.\\n\\n> Does not apply to RabbitMQ brokers.","properties":{"KmsKeyId":"The customer master key (CMK) to use for the A AWS KMS (KMS). This key is used to encrypt your data at rest. If not provided, Amazon MQ will use a default CMK to encrypt your data.","UseAwsOwnedKey":"Enables the use of an AWS owned CMK using AWS KMS (KMS). Set to `true` by default, if no value is provided, for example, for RabbitMQ brokers."}},"AWS::AmazonMQ::Broker.LdapServerMetadata":{"attributes":{},"description":"Optional. The metadata of the LDAP server used to authenticate and authorize connections to the broker.\\n\\n> Does not apply to RabbitMQ brokers.","properties":{"Hosts":"Specifies the location of the LDAP server such as AWS Directory Service for Microsoft Active Directory . Optional failover server.","RoleBase":"The distinguished name of the node in the directory information tree (DIT) to search for roles or groups. For example, `ou=group` , `ou=corp` , `dc=corp` , `dc=example` , `dc=com` .","RoleName":"The group name attribute in a role entry whose value is the name of that role. For example, you can specify `cn` for a group entry\'s common name. If authentication succeeds, then the user is assigned the the value of the `cn` attribute for each role entry that they are a member of.","RoleSearchMatching":"The LDAP search filter used to find roles within the roleBase. The distinguished name of the user matched by userSearchMatching is substituted into the `{0}` placeholder in the search filter. The client\'s username is substituted into the `{1}` placeholder. For example, if you set this option to `(member=uid={1})` for the user janedoe, the search filter becomes `(member=uid=janedoe)` after string substitution. It matches all role entries that have a member attribute equal to `uid=janedoe` under the subtree selected by the `RoleBases` .","RoleSearchSubtree":"The directory search scope for the role. If set to true, scope is to search the entire subtree.","ServiceAccountPassword":"Service account password. A service account is an account in your LDAP server that has access to initiate a connection. For example, `cn=admin` , `dc=corp` , `dc=example` , `dc=com` .","ServiceAccountUsername":"Service account username. A service account is an account in your LDAP server that has access to initiate a connection. For example, `cn=admin` , `ou=corp` , `dc=corp` , `dc=example` , `dc=com` .","UserBase":"Select a particular subtree of the directory information tree (DIT) to search for user entries. The subtree is specified by a DN, which specifies the base node of the subtree. For example, by setting this option to `ou=Users` , `ou=corp` , `dc=corp` , `dc=example` , `dc=com` , the search for user entries is restricted to the subtree beneath `ou=Users` , `ou=corp` , `dc=corp` , `dc=example` , `dc=com` .","UserRoleName":"The name of the LDAP attribute in the user\'s directory entry for the user\'s group membership. In some cases, user roles may be identified by the value of an attribute in the user\'s directory entry. The `UserRoleName` option allows you to provide the name of this attribute.","UserSearchMatching":"The LDAP search filter used to find users within the `userBase` . The client\'s username is substituted into the `{0}` placeholder in the search filter. For example, if this option is set to `(uid={0})` and the received username is `janedoe` , the search filter becomes `(uid=janedoe)` after string substitution. It will result in matching an entry like `uid=janedoe` , `ou=Users` , `ou=corp` , `dc=corp` , `dc=example` , `dc=com` .","UserSearchSubtree":"The directory search scope for the user. If set to true, scope is to search the entire subtree."}},"AWS::AmazonMQ::Broker.LogList":{"attributes":{},"description":"The list of information about logs to be enabled for the specified broker.","properties":{"Audit":"Enables audit logging. Every user management action made using JMX or the ActiveMQ Web Console is logged. Does not apply to RabbitMQ brokers.","General":"Enables general logging."}},"AWS::AmazonMQ::Broker.MaintenanceWindow":{"attributes":{},"description":"The parameters that determine the `WeeklyStartTime` to apply pending updates or patches to the broker.","properties":{"DayOfWeek":"The day of the week.","TimeOfDay":"The time, in 24-hour format.","TimeZone":"The time zone, UTC by default, in either the Country/City format, or the UTC offset format."}},"AWS::AmazonMQ::Broker.TagsEntry":{"attributes":{},"description":"A key-value pair to associate with the broker.","properties":{"Key":"The key in a key-value pair.","Value":"The value in a key-value pair."}},"AWS::AmazonMQ::Broker.User":{"attributes":{},"description":"The list of broker users (persons or applications) who can access queues and topics. For Amazon MQ for RabbitMQ brokers, one and only one administrative user is accepted and created when a broker is first provisioned. All subsequent broker users are created via the RabbitMQ web console or by using the RabbitMQ management API.","properties":{"ConsoleAccess":"Enables access to the ActiveMQ web console for the ActiveMQ user. Does not apply to RabbitMQ brokers.","Groups":"The list of groups (20 maximum) to which the ActiveMQ user belongs. This value can contain only alphanumeric characters, dashes, periods, underscores, and tildes (- . _ ~). This value must be 2-100 characters long. Does not apply to RabbitMQ brokers.","Password":"The password of the user. This value must be at least 12 characters long, must contain at least 4 unique characters, and must not contain commas, colons, or equal signs (,:=).","Username":"The username of the broker user. For Amazon MQ for ActiveMQ brokers, this value can contain only alphanumeric characters, dashes, periods, underscores, and tildes (- . _ ~). For Amazon MQ for RabbitMQ brokers, this value can contain only alphanumeric characters, dashes, periods, underscores (- . _). This value must not contain a tilde (~) character. Amazon MQ prohibts using guest as a valid usename. This value must be 2-100 characters long.\\n\\n> Do not add personally identifiable information (PII) or other confidential or sensitive information in broker usernames. Broker usernames are accessible to other AWS services, including CloudWatch Logs . Broker usernames are not intended to be used for private or sensitive data."}},"AWS::AmazonMQ::Configuration":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the Amazon MQ configuration.\\n\\n`arn:aws:mq:us-east-2:123456789012:configuration:MyConfigurationDevelopment:c-1234a5b6-78cd-901e-2fgh-3i45j6k178l9`","Id":"The ID of the Amazon MQ configuration.\\n\\n`c-1234a5b6-78cd-901e-2fgh-3i45j6k178l9`","Ref":"`Ref` returns the Amazon MQ configuration ID. For example:\\n\\n`c-1234a5b6-78cd-901e-2fgh-3i45j6k178l9`","Revision":"The revision number of the configuration.\\n\\n`1`"},"description":"Creates a new configuration for the specified configuration name. Amazon MQ uses the default configuration (the engine type and version).\\n\\n> Does not apply to RabbitMQ brokers.","properties":{"AuthenticationStrategy":"Optional. The authentication strategy associated with the configuration. The default is `SIMPLE` .","Data":"The base64-encoded XML configuration.","Description":"The description of the configuration.","EngineType":"The type of broker engine. Note: Currently, Amazon MQ only supports ACTIVEMQ for creating and editing broker configurations.","EngineVersion":"The version of the broker engine. For a list of supported engine versions, see [](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/broker-engine.html)","Name":"The name of the configuration. This value can contain only alphanumeric characters, dashes, periods, underscores, and tildes (- . _ ~). This value must be 1-150 characters long.","Tags":"Create tags when creating the configuration."}},"AWS::AmazonMQ::Configuration.TagsEntry":{"attributes":{},"description":"A key-value pair to associate with the configuration.","properties":{"Key":"The key in a key-value pair.","Value":"The value in a key-value pair."}},"AWS::AmazonMQ::ConfigurationAssociation":{"attributes":{"Ref":"`Ref` returns the Amazon MQ configurationassociation ID. For example:\\n\\n`c-1234a5b6-78cd-901e-2fgh-3i45j6k178l9`"},"description":"Use the AWS CloudFormation `AWS::AmazonMQ::ConfigurationAssociation` resource to associate a configuration with a broker, or return information about the specified ConfigurationAssociation. Only use one per broker, and don\'t use a configuration on the broker resource if you have associated a configuration with that broker.\\n\\n> Does not apply to RabbitMQ brokers.","properties":{"Broker":"The broker to associate with a configuration.","Configuration":"The configuration to associate with a broker."}},"AWS::AmazonMQ::ConfigurationAssociation.ConfigurationId":{"attributes":{},"description":"The `ConfigurationId` property type specifies a configuration Id and the revision of a configuration.","properties":{"Id":"The unique ID that Amazon MQ generates for the configuration.","Revision":"The revision number of the configuration."}},"AWS::Amplify::App":{"attributes":{"AppId":"Unique Id for the Amplify App.","AppName":"Name for the Amplify App.","Arn":"ARN for the Amplify App.","DefaultDomain":"Default domain for the Amplify App."},"description":"The AWS::Amplify::App resource specifies Apps in Amplify Hosting. An App is a collection of branches.","properties":{"AccessToken":"The personal access token for a GitHub repository for an Amplify app. The personal access token is used to authorize access to a GitHub repository using the Amplify GitHub App. The token is not stored.\\n\\nUse `AccessToken` for GitHub repositories only. To authorize access to a repository provider such as Bitbucket or CodeCommit, use `OauthToken` .\\n\\nYou must specify either `AccessToken` or `OauthToken` when you create a new app.\\n\\nExisting Amplify apps deployed from a GitHub repository using OAuth continue to work with CI/CD. However, we strongly recommend that you migrate these apps to use the GitHub App. For more information, see [Migrating an existing OAuth app to the Amplify GitHub App](https://docs.aws.amazon.com/amplify/latest/userguide/setting-up-GitHub-access.html#migrating-to-github-app-auth) in the *Amplify User Guide* .\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 255.","AutoBranchCreationConfig":"Sets the configuration for your automatic branch creation.","BasicAuthConfig":"The credentials for basic authorization for an Amplify app. You must base64-encode the authorization credentials and provide them in the format `user:password` .","BuildSpec":"The build specification (build spec) for an Amplify app.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 25000.\\n\\n*Pattern:* (?s).+","CustomHeaders":"The custom HTTP headers for an Amplify app.\\n\\n*Length Constraints:* Minimum length of 0. Maximum length of 25000.\\n\\n*Pattern:* (?s).*","CustomRules":"The custom rewrite and redirect rules for an Amplify app.","Description":"The description for an Amplify app.\\n\\n*Length Constraints:* Maximum length of 1000.\\n\\n*Pattern:* (?s).*","EnableBranchAutoDeletion":"Automatically disconnect a branch in Amplify Hosting when you delete a branch from your Git repository.","EnvironmentVariables":"The environment variables map for an Amplify app.\\n\\nFor a list of the environment variables that are accessible to Amplify by default, see [Amplify Environment variables](https://docs.aws.amazon.com/amplify/latest/userguide/amplify-console-environment-variables.html) in the *Amplify Hosting User Guide* .","IAMServiceRole":"The AWS Identity and Access Management (IAM) service role for the Amazon Resource Name (ARN) of the Amplify app.\\n\\n*Length Constraints:* Minimum length of 0. Maximum length of 1000.\\n\\n*Pattern:* (?s).*","Name":"The name for an Amplify app.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 255.\\n\\n*Pattern:* (?s).+","OauthToken":"The OAuth token for a third-party source control system for an Amplify app. The OAuth token is used to create a webhook and a read-only deploy key using SSH cloning. The OAuth token is not stored.\\n\\nUse `OauthToken` for repository providers other than GitHub, such as Bitbucket or CodeCommit. To authorize access to GitHub as your repository provider, use `AccessToken` .\\n\\nYou must specify either `OauthToken` or `AccessToken` when you create a new app.\\n\\nExisting Amplify apps deployed from a GitHub repository using OAuth continue to work with CI/CD. However, we strongly recommend that you migrate these apps to use the GitHub App. For more information, see [Migrating an existing OAuth app to the Amplify GitHub App](https://docs.aws.amazon.com/amplify/latest/userguide/setting-up-GitHub-access.html#migrating-to-github-app-auth) in the *Amplify User Guide* .\\n\\n*Length Constraints:* Maximum length of 1000.\\n\\n*Pattern:* (?s).*","Platform":"The platform for the Amplify app. For a static app, set the platform type to `WEB` . For a dynamic server-side rendered (SSR) app, set the platform type to `WEB_COMPUTE` . For an app requiring Amplify Hosting\'s original SSR support only, set the platform type to `WEB_DYNAMIC` .","Repository":"The repository for an Amplify app.\\n\\n*Pattern:* (?s).*","Tags":"The tag for an Amplify app."}},"AWS::Amplify::App.AutoBranchCreationConfig":{"attributes":{},"description":"Use the AutoBranchCreationConfig property type to automatically create branches that match a certain pattern.","properties":{"AutoBranchCreationPatterns":"Automated branch creation glob patterns for the Amplify app.","BasicAuthConfig":"Sets password protection for your auto created branch.","BuildSpec":"The build specification (build spec) for the autocreated branch.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 25000.","EnableAutoBranchCreation":"Enables automated branch creation for the Amplify app.","EnableAutoBuild":"Enables auto building for the auto created branch.","EnablePerformanceMode":"Enables performance mode for the branch.\\n\\nPerformance mode optimizes for faster hosting performance by keeping content cached at the edge for a longer interval. When performance mode is enabled, hosting configuration or code changes can take up to 10 minutes to roll out.","EnablePullRequestPreview":"Sets whether pull request previews are enabled for each branch that Amplify Hosting automatically creates for your app. Amplify creates previews by deploying your app to a unique URL whenever a pull request is opened for the branch. Development and QA teams can use this preview to test the pull request before it\'s merged into a production or integration branch.\\n\\nTo provide backend support for your preview, Amplify Hosting automatically provisions a temporary backend environment that it deletes when the pull request is closed. If you want to specify a dedicated backend environment for your previews, use the `PullRequestEnvironmentName` property.\\n\\nFor more information, see [Web Previews](https://docs.aws.amazon.com/amplify/latest/userguide/pr-previews.html) in the *AWS Amplify Hosting User Guide* .","EnvironmentVariables":"Environment variables for the auto created branch.","Framework":"The framework for the autocreated branch.","PullRequestEnvironmentName":"If pull request previews are enabled, you can use this property to specify a dedicated backend environment for your previews. For example, you could specify an environment named `prod` , `test` , or `dev` that you initialized with the Amplify CLI.\\n\\nTo enable pull request previews, set the `EnablePullRequestPreview` property to `true` .\\n\\nIf you don\'t specify an environment, Amplify Hosting provides backend support for each preview by automatically provisioning a temporary backend environment. Amplify deletes this environment when the pull request is closed.\\n\\nFor more information about creating backend environments, see [Feature Branch Deployments and Team Workflows](https://docs.aws.amazon.com/amplify/latest/userguide/multi-environments.html) in the *AWS Amplify Hosting User Guide* .\\n\\n*Length Constraints:* Maximum length of 20.\\n\\n*Pattern:* (?s).*","Stage":"Stage for the auto created branch."}},"AWS::Amplify::App.BasicAuthConfig":{"attributes":{},"description":"Use the BasicAuthConfig property type to set password protection at an app level to all your branches.","properties":{"EnableBasicAuth":"Enables basic authorization for the Amplify app\'s branches.","Password":"The password for basic authorization.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 255.","Username":"The user name for basic authorization.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 255."}},"AWS::Amplify::App.CustomRule":{"attributes":{},"description":"The CustomRule property type allows you to specify redirects, rewrites, and reverse proxies. Redirects enable a web app to reroute navigation from one URL to another.","properties":{"Condition":"The condition for a URL rewrite or redirect rule, such as a country code.\\n\\n*Length Constraints:* Minimum length of 0. Maximum length of 2048.\\n\\n*Pattern:* (?s).*","Source":"The source pattern for a URL rewrite or redirect rule.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 2048.\\n\\n*Pattern:* (?s).+","Status":"The status code for a URL rewrite or redirect rule.\\n\\n- **200** - Represents a 200 rewrite rule.\\n- **301** - Represents a 301 (moved pemanently) redirect rule. This and all future requests should be directed to the target URL.\\n- **302** - Represents a 302 temporary redirect rule.\\n- **404** - Represents a 404 redirect rule.\\n- **404-200** - Represents a 404 rewrite rule.\\n\\n*Length Constraints:* Minimum length of 3. Maximum length of 7.\\n\\n*Pattern:* .{3,7}","Target":"The target pattern for a URL rewrite or redirect rule.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 2048.\\n\\n*Pattern:* (?s).+"}},"AWS::Amplify::App.EnvironmentVariable":{"attributes":{},"description":"Environment variables are key-value pairs that are available at build time. Set environment variables for all branches in your app.","properties":{"Name":"The environment variable name.\\n\\n*Length Constraints:* Maximum length of 255.\\n\\n*Pattern:* (?s).*","Value":"The environment variable value.\\n\\n*Length Constraints:* Maximum length of 5500.\\n\\n*Pattern:* (?s).*"}},"AWS::Amplify::Branch":{"attributes":{"Arn":"ARN for a branch, part of an Amplify App.","BranchName":"Name for a branch, part of an Amplify App."},"description":"The AWS::Amplify::Branch resource specifies a new branch within an app.","properties":{"AppId":"The unique ID for an Amplify app.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 20.\\n\\n*Pattern:* d[a-z0-9]+","BasicAuthConfig":"The basic authorization credentials for a branch of an Amplify app. You must base64-encode the authorization credentials and provide them in the format `user:password` .","BranchName":"The name for the branch.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 255.\\n\\n*Pattern:* (?s).+","BuildSpec":"The build specification (build spec) for the branch.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 25000.\\n\\n*Pattern:* (?s).+","Description":"The description for the branch that is part of an Amplify app.\\n\\n*Length Constraints:* Maximum length of 1000.\\n\\n*Pattern:* (?s).*","EnableAutoBuild":"Enables auto building for the branch.","EnablePerformanceMode":"Enables performance mode for the branch.\\n\\nPerformance mode optimizes for faster hosting performance by keeping content cached at the edge for a longer interval. When performance mode is enabled, hosting configuration or code changes can take up to 10 minutes to roll out.","EnablePullRequestPreview":"Specifies whether Amplify Hosting creates a preview for each pull request that is made for this branch. If this property is enabled, Amplify deploys your app to a unique preview URL after each pull request is opened. Development and QA teams can use this preview to test the pull request before it\'s merged into a production or integration branch.\\n\\nTo provide backend support for your preview, Amplify automatically provisions a temporary backend environment that it deletes when the pull request is closed. If you want to specify a dedicated backend environment for your previews, use the `PullRequestEnvironmentName` property.\\n\\nFor more information, see [Web Previews](https://docs.aws.amazon.com/amplify/latest/userguide/pr-previews.html) in the *AWS Amplify Hosting User Guide* .","EnvironmentVariables":"The environment variables for the branch.","Framework":"The framework for the branch.","PullRequestEnvironmentName":"If pull request previews are enabled for this branch, you can use this property to specify a dedicated backend environment for your previews. For example, you could specify an environment named `prod` , `test` , or `dev` that you initialized with the Amplify CLI and mapped to this branch.\\n\\nTo enable pull request previews, set the `EnablePullRequestPreview` property to `true` .\\n\\nIf you don\'t specify an environment, Amplify Hosting provides backend support for each preview by automatically provisioning a temporary backend environment. Amplify Hosting deletes this environment when the pull request is closed.\\n\\nFor more information about creating backend environments, see [Feature Branch Deployments and Team Workflows](https://docs.aws.amazon.com/amplify/latest/userguide/multi-environments.html) in the *AWS Amplify Hosting User Guide* .\\n\\n*Length Constraints:* Maximum length of 20.\\n\\n*Pattern:* (?s).*","Stage":"Describes the current stage for the branch.\\n\\n*Valid Values:* PRODUCTION | BETA | DEVELOPMENT | EXPERIMENTAL | PULL_REQUEST","Tags":"The tag for the branch."}},"AWS::Amplify::Branch.BasicAuthConfig":{"attributes":{},"description":"Use the BasicAuthConfig property type to set password protection for a specific branch.","properties":{"EnableBasicAuth":"Enables basic authorization for the branch.","Password":"The password for basic authorization.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 255.","Username":"The user name for basic authorization.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 255."}},"AWS::Amplify::Branch.EnvironmentVariable":{"attributes":{},"description":"The EnvironmentVariable property type sets environment variables for a specific branch. Environment variables are key-value pairs that are available at build time.","properties":{"Name":"The environment variable name.\\n\\n*Length Constraints:* Maximum length of 255.\\n\\n*Pattern:* (?s).*","Value":"The environment variable value.\\n\\n*Length Constraints:* Maximum length of 5500.\\n\\n*Pattern:* (?s).*"}},"AWS::Amplify::Domain":{"attributes":{"Arn":"ARN for the Domain Association.","AutoSubDomainCreationPatterns":"Branch patterns for the automatically created subdomain.","AutoSubDomainIAMRole":"The IAM service role for the subdomain.","CertificateRecord":"DNS Record for certificate verification.","DomainName":"Name of the domain.","DomainStatus":"Status for the Domain Association.","EnableAutoSubDomain":"Specifies whether the automated creation of subdomains for branches is enabled.","StatusReason":"Reason for the current status of the domain."},"description":"The AWS::Amplify::Domain resource allows you to connect a custom domain to your app.","properties":{"AppId":"The unique ID for an Amplify app.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 20.\\n\\n*Pattern:* d[a-z0-9]+","AutoSubDomainCreationPatterns":"Sets the branch patterns for automatic subdomain creation.","AutoSubDomainIAMRole":"The required AWS Identity and Access Management (IAM) service role for the Amazon Resource Name (ARN) for automatically creating subdomains.\\n\\n*Length Constraints:* Maximum length of 1000.\\n\\n*Pattern:* ^$|^arn:aws:iam::\\\\d{12}:role.+","DomainName":"The domain name for the domain association.\\n\\n*Length Constraints:* Maximum length of 255.\\n\\n*Pattern:* ^(((?!-)[A-Za-z0-9-]{0,62}[A-Za-z0-9])\\\\.)+((?!-)[A-Za-z0-9-]{1,62}[A-Za-z0-9])(\\\\.)?$","EnableAutoSubDomain":"Enables the automated creation of subdomains for branches.","SubDomainSettings":"The setting for the subdomain."}},"AWS::Amplify::Domain.SubDomainSetting":{"attributes":{},"description":"The SubDomainSetting property type enables you to connect a subdomain (for example, example.exampledomain.com) to a specific branch.","properties":{"BranchName":"The branch name setting for the subdomain.\\n\\n*Length Constraints:* Minimum length of 1. Maximum length of 255.\\n\\n*Pattern:* (?s).+","Prefix":"The prefix setting for the subdomain.\\n\\n*Length Constraints:* Maximum length of 255.\\n\\n*Pattern:* (?s).*"}},"AWS::AmplifyUIBuilder::Component":{"attributes":{"Id":"The unique ID of the component."},"description":"The AWS::AmplifyUIBuilder::Component resource specifies a component within an Amplify app. A component is a user interface (UI) element that you can customize. Use `ComponentChild` to configure an instance of a `Component` . A `ComponentChild` instance inherits the configuration of the main `Component` .","properties":{"AppId":"The unique ID of the Amplify app associated with the component.","BindingProperties":"The information to connect a component\'s properties to data at runtime. You can\'t specify `tags` as a valid property for `bindingProperties` .","Children":"A list of the component\'s `ComponentChild` instances.","CollectionProperties":"The data binding configuration for the component\'s properties. Use this for a collection component. You can\'t specify `tags` as a valid property for `collectionProperties` .","ComponentType":"The type of the component. This can be an Amplify custom UI component or another custom component.","EnvironmentName":"The name of the backend environment that is a part of the Amplify app.","Events":"Describes the events that can be raised on the component. Use for the workflow feature in Amplify Studio that allows you to bind events and actions to components.","Name":"The name of the component.","Overrides":"Describes the component\'s properties that can be overriden in a customized instance of the component. You can\'t specify `tags` as a valid property for `overrides` .","Properties":"Describes the component\'s properties. You can\'t specify `tags` as a valid property for `properties` .","SchemaVersion":"The schema version of the component when it was imported.","SourceId":"The unique ID of the component in its original source system, such as Figma.","Tags":"One or more key-value pairs to use when tagging the component.","Variants":"A list of the component\'s variants. A variant is a unique style configuration of a main component."}},"AWS::AmplifyUIBuilder::Component.ActionParameters":{"attributes":{},"description":"Represents the event action configuration for an element of a `Component` or `ComponentChild` . Use for the workflow feature in Amplify Studio that allows you to bind events and actions to components. `ActionParameters` defines the action that is performed when an event occurs on the component.","properties":{"Anchor":"The HTML anchor link to the location to open. Specify this value for a navigation action.","Fields":"A dictionary of key-value pairs mapping Amplify Studio properties to fields in a data model. Use when the action performs an operation on an Amplify DataStore model.","Global":"Specifies whether the user should be signed out globally. Specify this value for an auth sign out action.","Id":"The unique ID of the component that the `ActionParameters` apply to.","Model":"The name of the data model. Use when the action performs an operation on an Amplify DataStore model.","State":"A key-value pair that specifies the state property name and its initial value.","Target":"The element within the same component to modify when the action occurs.","Type":"The type of navigation action. Valid values are `url` and `anchor` . This value is required for a navigation action.","Url":"The URL to the location to open. Specify this value for a navigation action."}},"AWS::AmplifyUIBuilder::Component.ComponentBindingPropertiesValue":{"attributes":{},"description":"The `ComponentBindingPropertiesValue` property specifies the data binding configuration for a component at runtime. You can use `ComponentBindingPropertiesValue` to add exposed properties to a component to allow different values to be entered when a component is reused in different places in an app.","properties":{"BindingProperties":"Describes the properties to customize with data at runtime.","DefaultValue":"The default value of the property.","Type":"The property type."}},"AWS::AmplifyUIBuilder::Component.ComponentBindingPropertiesValueProperties":{"attributes":{},"description":"The `ComponentBindingPropertiesValueProperties` property specifies the data binding configuration for a specific property using data stored in AWS . For AWS connected properties, you can bind a property to data stored in an Amazon S3 bucket, an Amplify DataStore model or an authenticated user attribute.","properties":{"Bucket":"An Amazon S3 bucket.","DefaultValue":"The default value to assign to the property.","Field":"The field to bind the data to.","Key":"The storage key for an Amazon S3 bucket.","Model":"An Amplify DataStore model.","Predicates":"A list of predicates for binding a component\'s properties to data.","UserAttribute":"An authenticated user attribute."}},"AWS::AmplifyUIBuilder::Component.ComponentChild":{"attributes":{},"description":"The `ComponentChild` property specifies a nested UI configuration within a parent `Component` .","properties":{"Children":"The list of `ComponentChild` instances for this component.","ComponentType":"The type of the child component.","Events":"Describes the events that can be raised on the child component. Use for the workflow feature in Amplify Studio that allows you to bind events and actions to components.","Name":"The name of the child component.","Properties":"Describes the properties of the child component. You can\'t specify `tags` as a valid property for `properties` ."}},"AWS::AmplifyUIBuilder::Component.ComponentConditionProperty":{"attributes":{},"description":"The `ComponentConditionProperty` property specifies a conditional expression for setting a component property. Use `ComponentConditionProperty` to set a property to different values conditionally, based on the value of another property.","properties":{"Else":"The value to assign to the property if the condition is not met.","Field":"The name of a field. Specify this when the property is a data model.","Operand":"The value of the property to evaluate.","OperandType":"The type of the property to evaluate.","Operator":"The operator to use to perform the evaluation, such as `eq` to represent equals.","Property":"The name of the conditional property.","Then":"The value to assign to the property if the condition is met."}},"AWS::AmplifyUIBuilder::Component.ComponentDataConfiguration":{"attributes":{},"description":"The `ComponentDataConfiguration` property specifies the configuration for binding a component\'s properties to data.","properties":{"Identifiers":"A list of IDs to use to bind data to a component. Use this property to bind specifically chosen data, rather than data retrieved from a query.","Model":"The name of the data model to use to bind data to a component.","Predicate":"Represents the conditional logic to use when binding data to a component. Use this property to retrieve only a subset of the data in a collection.","Sort":"Describes how to sort the component\'s properties."}},"AWS::AmplifyUIBuilder::Component.ComponentEvent":{"attributes":{},"description":"The `ComponentEvent` property specifies the configuration of an event. You can bind an event and a corresponding action to a `Component` or a `ComponentChild` . A button click is an example of an event.","properties":{"Action":"The action to perform when a specific event is raised.","Parameters":"Describes information about the action."}},"AWS::AmplifyUIBuilder::Component.ComponentProperty":{"attributes":{},"description":"The `ComponentProperty` property specifies the configuration for all of a component\'s properties. Use `ComponentProperty` to specify the values to render or bind by default.","properties":{"BindingProperties":"The information to bind the component property to data at runtime.","Bindings":"The information to bind the component property to form data.","CollectionBindingProperties":"The information to bind the component property to data at runtime. Use this for collection components.","ComponentName":"The name of the component that is affected by an event.","Concat":"A list of component properties to concatenate to create the value to assign to this component property.","Condition":"The conditional expression to use to assign a value to the component property.","Configured":"Specifies whether the user configured the property in Amplify Studio after importing it.","DefaultValue":"The default value to assign to the component property.","Event":"An event that occurs in your app. Use this for workflow data binding.","ImportedValue":"The default value assigned to the property when the component is imported into an app.","Model":"The data model to use to assign a value to the component property.","Property":"The name of the component\'s property that is affected by an event.","Type":"The component type.","UserAttribute":"An authenticated user attribute to use to assign a value to the component property.","Value":"The value to assign to the component property."}},"AWS::AmplifyUIBuilder::Component.ComponentPropertyBindingProperties":{"attributes":{},"description":"The `ComponentPropertyBindingProperties` property specifies a component property to associate with a binding property. This enables exposed properties on the top level component to propagate data to the component\'s property values.","properties":{"Field":"The data field to bind the property to.","Property":"The component property to bind to the data field."}},"AWS::AmplifyUIBuilder::Component.ComponentVariant":{"attributes":{},"description":"The `ComponentVariant` property specifies the style configuration of a unique variation of a main component.","properties":{"Overrides":"The properties of the component variant that can be overriden when customizing an instance of the component. You can\'t specify `tags` as a valid property for `overrides` .","VariantValues":"The combination of variants that comprise this variant."}},"AWS::AmplifyUIBuilder::Component.FormBindingElement":{"attributes":{},"description":"Describes how to bind a component property to form data.","properties":{"Element":"The name of the component to retrieve a value from.","Property":"The property to retrieve a value from."}},"AWS::AmplifyUIBuilder::Component.MutationActionSetStateParameter":{"attributes":{},"description":"Represents the state configuration when an action modifies a property of another element within the same component.","properties":{"ComponentName":"The name of the component that is being modified.","Property":"The name of the component property to apply the state configuration to.","Set":"The state configuration to assign to the property."}},"AWS::AmplifyUIBuilder::Component.Predicate":{"attributes":{},"description":"The `Predicate` property specifies information for generating Amplify DataStore queries. Use `Predicate` to retrieve a subset of the data in a collection.","properties":{"And":"A list of predicates to combine logically.","Field":"The field to query.","Operand":"The value to use when performing the evaluation.","Operator":"The operator to use to perform the evaluation.","Or":"A list of predicates to combine logically."}},"AWS::AmplifyUIBuilder::Component.SortProperty":{"attributes":{},"description":"The `SortProperty` property specifies how to sort the data that you bind to a component.","properties":{"Direction":"The direction of the sort, either ascending or descending.","Field":"The field to perform the sort on."}},"AWS::AmplifyUIBuilder::Form":{"attributes":{"Id":"The ID for the form."},"description":"The AWS::AmplifyUIBuilder::Form resource specifies all of the information that is required to create a form.","properties":{"AppId":"The unique ID of the Amplify app associated with the form.","Cta":"The `FormCTA` object that stores the call to action configuration for the form.","DataType":"The type of data source to use to create the form.","EnvironmentName":"The name of the backend environment that is a part of the Amplify app.","Fields":"The configuration information for the form\'s fields.","FormActionType":"Specifies whether to perform a create or update action on the form.","LabelDecorator":"Specifies an icon or decoration to display on the form.","Name":"The name of the form.","SchemaVersion":"The schema version of the form.","SectionalElements":"The configuration information for the visual helper elements for the form. These elements are not associated with any data.","Style":"The configuration for the form\'s style.","Tags":"One or more key-value pairs to use when tagging the form data."}},"AWS::AmplifyUIBuilder::Form.FieldConfig":{"attributes":{},"description":"The `FieldConfig` property specifies the configuration information for a field in a table.","properties":{"Excluded":"Specifies whether to hide a field.","InputType":"Describes the configuration for the default input value to display for a field.","Label":"The label for the field.","Position":"Specifies the field position.","Validations":"The validations to perform on the value in the field."}},"AWS::AmplifyUIBuilder::Form.FieldInputConfig":{"attributes":{},"description":"The `FieldInputConfig` property specifies the configuration for the default input values to display for a field.","properties":{"DefaultChecked":"Specifies whether a field has a default value.","DefaultCountryCode":"The default country code for a phone number.","DefaultValue":"The default value for the field.","DescriptiveText":"The text to display to describe the field.","FileUploaderConfig":"The configuration for the file uploader field.","IsArray":"Specifies whether to render the field as an array. This property is ignored if the `dataSourceType` for the form is a Data Store.","MaxValue":"The maximum value to display for the field.","MinValue":"The minimum value to display for the field.","Name":"The name of the field.","Placeholder":"The text to display as a placeholder for the field.","ReadOnly":"Specifies a read only field.","Required":"Specifies a field that requires input.","Step":"The stepping increment for a numeric value in a field.","Type":"The input type for the field.","Value":"The value for the field.","ValueMappings":"The information to use to customize the input fields with data at runtime."}},"AWS::AmplifyUIBuilder::Form.FieldPosition":{"attributes":{},"description":"The `FieldPosition` property specifies the field position.","properties":{"Below":"The field position is below the field specified by the string.","Fixed":"The field position is fixed and doesn\'t change in relation to other fields.","RightOf":"The field position is to the right of the field specified by the string."}},"AWS::AmplifyUIBuilder::Form.FieldValidationConfiguration":{"attributes":{},"description":"The `FieldValidationConfiguration` property specifies the validation configuration for a field.","properties":{"NumValues":"The validation to perform on a number value.","StrValues":"The validation to perform on a string value.","Type":"The validation to perform on an object type. ``","ValidationMessage":"The validation message to display."}},"AWS::AmplifyUIBuilder::Form.FileUploaderFieldConfig":{"attributes":{},"description":"Describes the configuration for the file uploader field.","properties":{"AcceptedFileTypes":"The file types that are allowed to be uploaded by the file uploader. Provide this information in an array of strings specifying the valid file extensions.","AccessLevel":"The access level to assign to the uploaded files in the Amazon S3 bucket where they are stored. The valid values for this property are `private` , `protected` , or `public` . For detailed information about the permissions associated with each access level, see [File access levels](https://docs.aws.amazon.com/https://docs.amplify.aws/lib/storage/configureaccess/q/platform/js/) in the *Amplify documentation* .","IsResumable":"Allows the file upload operation to be paused and resumed. The default value is `false` .\\n\\nWhen `isResumable` is set to `true` , the file uploader uses a multipart upload to break the files into chunks before upload. The progress of the upload isn\'t continuous, because the file uploader uploads a chunk at a time.","MaxFileCount":"Specifies the maximum number of files that can be selected to upload. The default value is an unlimited number of files.","MaxSize":"The maximum file size in bytes that the file uploader will accept. The default value is an unlimited file size.","ShowThumbnails":"Specifies whether to display or hide the image preview after selecting a file for upload. The default value is `true` to display the image preview."}},"AWS::AmplifyUIBuilder::Form.FormButton":{"attributes":{},"description":"The `FormButton` property specifies the configuration for a button UI element that is a part of a form.","properties":{"Children":"Describes the button\'s properties.","Excluded":"Specifies whether the button is visible on the form.","Position":"The position of the button."}},"AWS::AmplifyUIBuilder::Form.FormCTA":{"attributes":{},"description":"The `FormCTA` property specifies the call to action button configuration for the form.","properties":{"Cancel":"Displays a cancel button.","Clear":"Displays a clear button.","Position":"The position of the button.","Submit":"Displays a submit button."}},"AWS::AmplifyUIBuilder::Form.FormDataTypeConfig":{"attributes":{},"description":"The `FormDataTypeConfig` property specifies the data type configuration for the data source associated with a form.","properties":{"DataSourceType":"The data source type, either an Amplify DataStore model or a custom data type.","DataTypeName":"The unique name of the data type you are using as the data source for the form."}},"AWS::AmplifyUIBuilder::Form.FormInputValueProperty":{"attributes":{},"description":"The `FormInputValueProperty` property specifies the configuration for an input field on a form. Use `FormInputValueProperty` to specify the values to render or bind by default.","properties":{"Value":"The value to assign to the input field."}},"AWS::AmplifyUIBuilder::Form.FormStyle":{"attributes":{},"description":"The `FormStyle` property specifies the configuration for the form\'s style.","properties":{"HorizontalGap":"The spacing for the horizontal gap.","OuterPadding":"The size of the outer padding for the form.","VerticalGap":"The spacing for the vertical gap."}},"AWS::AmplifyUIBuilder::Form.FormStyleConfig":{"attributes":{},"description":"The `FormStyleConfig` property specifies the configuration settings for the form\'s style properties.","properties":{"TokenReference":"A reference to a design token to use to bind the form\'s style properties to an existing theme.","Value":"The value of the style setting."}},"AWS::AmplifyUIBuilder::Form.SectionalElement":{"attributes":{},"description":"The `SectionalElement` property specifies the configuration information for a visual helper element for a form. A sectional element can be a header, a text block, or a divider. These elements are static and not associated with any data.","properties":{"Excluded":"Excludes a sectional element that was generated by default for a specified data model.","Level":"Specifies the size of the font for a `Heading` sectional element. Valid values are `1 | 2 | 3 | 4 | 5 | 6` .","Orientation":"Specifies the orientation for a `Divider` sectional element. Valid values are `horizontal` or `vertical` .","Position":"Specifies the position of the text in a field for a `Text` sectional element.","Text":"The text for a `Text` sectional element.","Type":"The type of sectional element. Valid values are `Heading` , `Text` , and `Divider` ."}},"AWS::AmplifyUIBuilder::Form.ValueMapping":{"attributes":{},"description":"The `ValueMapping` property specifies the association between a complex object and a display value. Use `ValueMapping` to store how to represent complex objects when they are displayed.","properties":{"DisplayValue":"The value to display for the complex object.","Value":"The complex object."}},"AWS::AmplifyUIBuilder::Form.ValueMappings":{"attributes":{},"description":"The `ValueMappings` property specifies the data binding configuration for a value map.","properties":{"Values":"The value and display value pairs."}},"AWS::AmplifyUIBuilder::Theme":{"attributes":{"Id":"The ID for the theme."},"description":"The AWS::AmplifyUIBuilder::Theme resource specifies a theme within an Amplify app. A theme is a collection of style settings that apply globally to the components associated with the app.","properties":{"AppId":"The unique ID for the Amplify app associated with the theme.","EnvironmentName":"The name of the backend environment that is a part of the Amplify app.","Name":"The name of the theme.","Overrides":"Describes the properties that can be overriden to customize a theme.","Tags":"One or more key-value pairs to use when tagging the theme.","Values":"A list of key-value pairs that defines the properties of the theme."}},"AWS::AmplifyUIBuilder::Theme.ThemeValue":{"attributes":{},"description":"The `ThemeValue` property specifies the configuration of a theme\'s properties.","properties":{"Children":"A list of key-value pairs that define the theme\'s properties.","Value":"The value of a theme property."}},"AWS::AmplifyUIBuilder::Theme.ThemeValues":{"attributes":{},"description":"The `ThemeValues` property specifies key-value pair that defines a property of a theme.","properties":{"Key":"The name of the property.","Value":"The value of the property."}},"AWS::ApiGateway::Account":{"attributes":{"Id":"The ID for the account. For example: `abc123` .","Ref":"`Ref` returns the ID of the resource, such as `mysta-accou-01234b567890example` ."},"description":"The `AWS::ApiGateway::Account` resource specifies the IAM role that Amazon API Gateway uses to write API logs to Amazon CloudWatch Logs. To avoid overwriting other roles, you should only have one `AWS::ApiGateway::Account` resource per region per account.","properties":{"CloudWatchRoleArn":"The ARN of an Amazon CloudWatch role for the current Account."}},"AWS::ApiGateway::ApiKey":{"attributes":{"APIKeyId":"The ID for the API key. For example: `abc123` .","Ref":"`Ref` returns the API key ID, such as `m2m1k7sybf` ."},"description":"The `AWS::ApiGateway::ApiKey` resource creates a unique key that you can distribute to clients who are executing API Gateway `Method` resources that require an API key. To specify which API key clients must use, map the API key with the `RestApi` and `Stage` resources that include the methods that require a key.","properties":{"CustomerId":"An AWS Marketplace customer identifier, when integrating with the AWS SaaS Marketplace.","Description":"The description of the ApiKey.","Enabled":"Specifies whether the ApiKey can be used by callers.","GenerateDistinctId":"Specifies whether ( `true` ) or not ( `false` ) the key identifier is distinct from the created API key value. This parameter is deprecated and should not be used.","Name":"A name for the API key. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the API key name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","StageKeys":"DEPRECATED FOR USAGE PLANS - Specifies stages associated with the API key.","Tags":"The key-value map of strings. The valid character set is [a-zA-Z+-=._:/]. The tag key can be up to 128 characters and must not start with `aws:` . The tag value can be up to 256 characters.","Value":"Specifies a value of the API key."}},"AWS::ApiGateway::ApiKey.StageKey":{"attributes":{},"description":"`StageKey` is a property of the [AWS::ApiGateway::ApiKey](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-apikey.html) resource that specifies the stage to associate with the API key. This association allows only clients with the key to make requests to methods in that stage.","properties":{"RestApiId":"The string identifier of the associated RestApi.","StageName":"The stage name associated with the stage key."}},"AWS::ApiGateway::Authorizer":{"attributes":{"AuthorizerId":"The ID for the authorizer. For example: `abc123` .","Ref":"`Ref` returns the authorizer\'s ID, such as `abcde1` ."},"description":"The `AWS::ApiGateway::Authorizer` resource creates an authorization layer that API Gateway activates for methods that have authorization enabled. API Gateway activates the authorizer when a client calls those methods.","properties":{"AuthType":"Optional customer-defined field, used in OpenAPI imports and exports without functional impact.","AuthorizerCredentials":"Specifies the required credentials as an IAM role for API Gateway to invoke the authorizer. To specify an IAM role for API Gateway to assume, use the role\'s Amazon Resource Name (ARN). To use resource-based permissions on the Lambda function, specify null.","AuthorizerResultTtlInSeconds":"The TTL in seconds of cached authorizer results. If it equals 0, authorization caching is disabled. If it is greater than 0, API Gateway will cache authorizer responses. If this field is not set, the default value is 300. The maximum value is 3600, or 1 hour.","AuthorizerUri":"Specifies the authorizer\'s Uniform Resource Identifier (URI). For `TOKEN` or `REQUEST` authorizers, this must be a well-formed Lambda function URI, for example, `arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:{account_id}:function:{lambda_function_name}/invocations` . In general, the URI has this form `arn:aws:apigateway:{region}:lambda:path/{service_api}` , where `{region}` is the same as the region hosting the Lambda function, `path` indicates that the remaining substring in the URI should be treated as the path to the resource, including the initial `/` . For Lambda functions, this is usually of the form `/2015-03-31/functions/[FunctionARN]/invocations` .","IdentitySource":"The identity source for which authorization is requested. For a `TOKEN` or `COGNITO_USER_POOLS` authorizer, this is required and specifies the request header mapping expression for the custom header holding the authorization token submitted by the client. For example, if the token header name is `Auth` , the header mapping expression is `method.request.header.Auth` . For the `REQUEST` authorizer, this is required when authorization caching is enabled. The value is a comma-separated string of one or more mapping expressions of the specified request parameters. For example, if an `Auth` header, a `Name` query string parameter are defined as identity sources, this value is `method.request.header.Auth, method.request.querystring.Name` . These parameters will be used to derive the authorization caching key and to perform runtime validation of the `REQUEST` authorizer by verifying all of the identity-related request parameters are present, not null and non-empty. Only when this is true does the authorizer invoke the authorizer Lambda function, otherwise, it returns a 401 Unauthorized response without calling the Lambda function. The valid value is a string of comma-separated mapping expressions of the specified request parameters. When the authorization caching is not enabled, this property is optional.","IdentityValidationExpression":"A validation expression for the incoming identity token. For `TOKEN` authorizers, this value is a regular expression. For `COGNITO_USER_POOLS` authorizers, API Gateway will match the `aud` field of the incoming token from the client against the specified regular expression. It will invoke the authorizer\'s Lambda function when there is a match. Otherwise, it will return a 401 Unauthorized response without calling the Lambda function. The validation expression does not apply to the `REQUEST` authorizer.","Name":"The name of the authorizer.","ProviderARNs":"A list of the Amazon Cognito user pool ARNs for the `COGNITO_USER_POOLS` authorizer. Each element is of this format: `arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}` . For a `TOKEN` or `REQUEST` authorizer, this is not defined.","RestApiId":"The string identifier of the associated RestApi.","Type":"The authorizer type. Valid values are `TOKEN` for a Lambda function using a single authorization token submitted in a custom header, `REQUEST` for a Lambda function using incoming request parameters, and `COGNITO_USER_POOLS` for using an Amazon Cognito user pool."}},"AWS::ApiGateway::BasePathMapping":{"attributes":{},"description":"The `AWS::ApiGateway::BasePathMapping` resource creates a base path that clients who call your API must use in the invocation URL.","properties":{"BasePath":"The base path name that callers of the API must provide as part of the URL after the domain name.","DomainName":"The domain name of the BasePathMapping resource to be described.","Id":"","RestApiId":"The string identifier of the associated RestApi.","Stage":"The name of the associated stage."}},"AWS::ApiGateway::ClientCertificate":{"attributes":{"ClientCertificateId":"The ID for the client certificate. For example: `abc123` .","Ref":"`Ref` returns the client certificate name, such as `abc123` ."},"description":"The `AWS::ApiGateway::ClientCertificate` resource creates a client certificate that API Gateway uses to configure client-side SSL authentication for sending requests to the integration endpoint.","properties":{"Description":"The description of the client certificate.","Tags":"The collection of tags. Each tag element is associated with a given resource."}},"AWS::ApiGateway::Deployment":{"attributes":{"DeploymentId":"The ID for the deployment. For example: `abc123` .","Ref":"`Ref` returns the deployment ID, such as `123abc` ."},"description":"The `AWS::ApiGateway::Deployment` resource deploys an API Gateway `RestApi` resource to a stage so that clients can call the API over the internet. The stage acts as an environment.","properties":{"DeploymentCanarySettings":"The input configuration for a canary deployment.","Description":"The description for the Deployment resource to create.","RestApiId":"The string identifier of the associated RestApi.","StageDescription":"The description of the Stage resource for the Deployment resource to create. To specify a stage description, you must also provide a stage name.","StageName":"The name of the Stage resource for the Deployment resource to create."}},"AWS::ApiGateway::Deployment.AccessLogSetting":{"attributes":{},"description":"The `AccessLogSetting` property type specifies settings for logging access in this stage.\\n\\n`AccessLogSetting` is a property of the [StageDescription](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html) property type.","properties":{"DestinationArn":"The Amazon Resource Name (ARN) of the CloudWatch Logs log group or Kinesis Data Firehose delivery stream to receive access logs. If you specify a Kinesis Data Firehose delivery stream, the stream name must begin with `amazon-apigateway-` .","Format":"A single line format of the access logs of data, as specified by selected $context variables. The format must include at least `$context.requestId` ."}},"AWS::ApiGateway::Deployment.CanarySetting":{"attributes":{},"description":"The `CanarySetting` property type specifies settings for the canary deployment in this stage.\\n\\n`CanarySetting` is a property of the [StageDescription](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html) property type.","properties":{"PercentTraffic":"The percent (0-100) of traffic diverted to a canary deployment.","StageVariableOverrides":"Stage variables overridden for a canary release deployment, including new stage variables introduced in the canary. These stage variables are represented as a string-to-string map between stage variable names and their values.","UseStageCache":"A Boolean flag to indicate whether the canary deployment uses the stage cache or not."}},"AWS::ApiGateway::Deployment.DeploymentCanarySettings":{"attributes":{},"description":"The `DeploymentCanarySettings` property type specifies settings for the canary deployment.","properties":{"PercentTraffic":"The percentage (0.0-100.0) of traffic routed to the canary deployment.","StageVariableOverrides":"A stage variable overrides used for the canary release deployment. They can override existing stage variables or add new stage variables for the canary release deployment. These stage variables are represented as a string-to-string map between stage variable names and their values.","UseStageCache":"A Boolean flag to indicate whether the canary release deployment uses the stage cache or not."}},"AWS::ApiGateway::Deployment.MethodSetting":{"attributes":{},"description":"The `MethodSetting` property type configures settings for all methods in a stage.\\n\\nThe `MethodSettings` property of the [Amazon API Gateway Deployment StageDescription](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html) property type contains a list of `MethodSetting` property types.","properties":{"CacheDataEncrypted":"Specifies whether the cached responses are encrypted.","CacheTtlInSeconds":"Specifies the time to live (TTL), in seconds, for cached responses. The higher the TTL, the longer the response will be cached.","CachingEnabled":"Specifies whether responses should be cached and returned for requests. A cache cluster must be enabled on the stage for responses to be cached.","DataTraceEnabled":"Specifies whether data trace logging is enabled for this method, which affects the log entries pushed to Amazon CloudWatch Logs.","HttpMethod":"The HTTP method.","LoggingLevel":"Specifies the logging level for this method, which affects the log entries pushed to Amazon CloudWatch Logs. Valid values are `OFF` , `ERROR` , and `INFO` . Choose `ERROR` to write only error-level entries to CloudWatch Logs, or choose `INFO` to include all `ERROR` events as well as extra informational events.","MetricsEnabled":"Specifies whether Amazon CloudWatch metrics are enabled for this method.","ResourcePath":"The resource path for this method. Forward slashes ( `/` ) are encoded as `~1` and the initial slash must include a forward slash. For example, the path value `/resource/subresource` must be encoded as `/~1resource~1subresource` . To specify the root path, use only a slash ( `/` ).","ThrottlingBurstLimit":"Specifies the throttling burst limit.","ThrottlingRateLimit":"Specifies the throttling rate limit."}},"AWS::ApiGateway::Deployment.StageDescription":{"attributes":{},"description":"`StageDescription` is a property of the [AWS::ApiGateway::Deployment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-deployment.html) resource that configures a deployment stage.","properties":{"AccessLogSetting":"Specifies settings for logging access in this stage.","CacheClusterEnabled":"Specifies whether a cache cluster is enabled for the stage.","CacheClusterSize":"The size of the stage\'s cache cluster. For more information, see [cacheClusterSize](https://docs.aws.amazon.com/apigateway/latest/api/API_CreateStage.html#apigw-CreateStage-request-cacheClusterSize) in the *API Gateway API Reference* .","CacheDataEncrypted":"Indicates whether the cached responses are encrypted.","CacheTtlInSeconds":"The time-to-live (TTL) period, in seconds, that specifies how long API Gateway caches responses.","CachingEnabled":"Indicates whether responses are cached and returned for requests. You must enable a cache cluster on the stage to cache responses. For more information, see [Enable API Gateway Caching in a Stage to Enhance API Performance](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-caching.html) in the *API Gateway Developer Guide* .","CanarySetting":"Specifies settings for the canary deployment in this stage.","ClientCertificateId":"The identifier of the client certificate that API Gateway uses to call your integration endpoints in the stage.","DataTraceEnabled":"Indicates whether data trace logging is enabled for methods in the stage. API Gateway pushes these logs to Amazon CloudWatch Logs.","Description":"A description of the purpose of the stage.","DocumentationVersion":"The version identifier of the API documentation snapshot.","LoggingLevel":"The logging level for this method. For valid values, see the `loggingLevel` property of the [MethodSetting](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodSetting.html) resource in the *Amazon API Gateway API Reference* .","MethodSettings":"Configures settings for all of the stage\'s methods.","MetricsEnabled":"Indicates whether Amazon CloudWatch metrics are enabled for methods in the stage.","Tags":"An array of arbitrary tags (key-value pairs) to associate with the stage.","ThrottlingBurstLimit":"The target request burst rate limit. This allows more requests through for a period of time than the target rate limit. For more information, see [Manage API Request Throttling](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-throttling.html) in the *API Gateway Developer Guide* .","ThrottlingRateLimit":"The target request steady-state rate limit. For more information, see [Manage API Request Throttling](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-throttling.html) in the *API Gateway Developer Guide* .","TracingEnabled":"Specifies whether active tracing with X-ray is enabled for this stage.\\n\\nFor more information, see [Trace API Gateway API Execution with AWS X-Ray](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-xray.html) in the *API Gateway Developer Guide* .","Variables":"A map that defines the stage variables. Variable names must consist of alphanumeric characters, and the values must match the following regular expression: `[A-Za-z0-9-._~:/?#&=,]+` ."}},"AWS::ApiGateway::DocumentationPart":{"attributes":{"DocumentationPartId":"The ID for the documentation part.","Ref":"`Ref` returns the ID of the documentation part, such as `abc123` ."},"description":"The `AWS::ApiGateway::DocumentationPart` resource creates a documentation part for an API. For more information, see [Representation of API Documentation in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-documenting-api-content-representation.html) in the *API Gateway Developer Guide* .","properties":{"Location":"The location of the targeted API entity of the to-be-created documentation part.","Properties":"The new documentation content map of the targeted API entity. Enclosed key-value pairs are API-specific, but only OpenAPI-compliant key-value pairs can be exported and, hence, published.","RestApiId":"The string identifier of the associated RestApi."}},"AWS::ApiGateway::DocumentationPart.Location":{"attributes":{},"description":"The `Location` property specifies the location of the Amazon API Gateway API entity that the documentation applies to. `Location` is a property of the [AWS::ApiGateway::DocumentationPart](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-documentationpart.html) resource.\\n\\n> For more information about each property, including constraints and valid values, see [DocumentationPart](https://docs.aws.amazon.com/apigateway/latest/api/API_DocumentationPartLocation.html) in the *Amazon API Gateway REST API Reference* .","properties":{"Method":"The HTTP verb of a method. It is a valid field for the API entity types of `METHOD` , `PATH_PARAMETER` , `QUERY_PARAMETER` , `REQUEST_HEADER` , `REQUEST_BODY` , `RESPONSE` , `RESPONSE_HEADER` , and `RESPONSE_BODY` . The default value is `*` for any method. When an applicable child entity inherits the content of an entity of the same type with more general specifications of the other `location` attributes, the child entity\'s `method` attribute must match that of the parent entity exactly.","Name":"The name of the targeted API entity. It is a valid and required field for the API entity types of `AUTHORIZER` , `MODEL` , `PATH_PARAMETER` , `QUERY_PARAMETER` , `REQUEST_HEADER` , `REQUEST_BODY` and `RESPONSE_HEADER` . It is an invalid field for any other entity type.","Path":"The URL path of the target. It is a valid field for the API entity types of `RESOURCE` , `METHOD` , `PATH_PARAMETER` , `QUERY_PARAMETER` , `REQUEST_HEADER` , `REQUEST_BODY` , `RESPONSE` , `RESPONSE_HEADER` , and `RESPONSE_BODY` . The default value is `/` for the root resource. When an applicable child entity inherits the content of another entity of the same type with more general specifications of the other `location` attributes, the child entity\'s `path` attribute must match that of the parent entity as a prefix.","StatusCode":"The HTTP status code of a response. It is a valid field for the API entity types of `RESPONSE` , `RESPONSE_HEADER` , and `RESPONSE_BODY` . The default value is `*` for any status code. When an applicable child entity inherits the content of an entity of the same type with more general specifications of the other `location` attributes, the child entity\'s `statusCode` attribute must match that of the parent entity exactly.","Type":"The type of API entity to which the documentation content applies. Valid values are `API` , `AUTHORIZER` , `MODEL` , `RESOURCE` , `METHOD` , `PATH_PARAMETER` , `QUERY_PARAMETER` , `REQUEST_HEADER` , `REQUEST_BODY` , `RESPONSE` , `RESPONSE_HEADER` , and `RESPONSE_BODY` . Content inheritance does not apply to any entity of the `API` , `AUTHORIZER` , `METHOD` , `MODEL` , `REQUEST_BODY` , or `RESOURCE` type."}},"AWS::ApiGateway::DocumentationVersion":{"attributes":{},"description":"The `AWS::ApiGateway::DocumentationVersion` resource creates a snapshot of the documentation for an API. For more information, see [Representation of API Documentation in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-documenting-api-content-representation.html) in the *API Gateway Developer Guide* .","properties":{"Description":"A description about the new documentation snapshot.","DocumentationVersion":"The version identifier of the to-be-updated documentation version.","RestApiId":"The string identifier of the associated RestApi."}},"AWS::ApiGateway::DomainName":{"attributes":{"DistributionDomainName":"The Amazon CloudFront distribution domain name that\'s mapped to the custom domain name. This is only applicable for endpoints whose type is `EDGE` .\\n\\nExample: `d111111abcdef8.cloudfront.net`","DistributionHostedZoneId":"The region-agnostic Amazon Route 53 Hosted Zone ID of the edge-optimized endpoint. The only valid value is `Z2FDTNDATAQYW2` for all regions.","Ref":"`Ref` returns the domain name.","RegionalDomainName":"The domain name associated with the regional endpoint for this custom domain name. You set up this association by adding a DNS record that points the custom domain name to this regional domain name.","RegionalHostedZoneId":"The region-specific Amazon Route 53 Hosted Zone ID of the regional endpoint."},"description":"The `AWS::ApiGateway::DomainName` resource specifies a custom domain name for your API in API Gateway.\\n\\nYou can use a custom domain name to provide a URL that\'s more intuitive and easier to recall. For more information about using custom domain names, see [Set up Custom Domain Name for an API in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html) in the *API Gateway Developer Guide* .","properties":{"CertificateArn":"The reference to an AWS -managed certificate that will be used by edge-optimized endpoint for this domain name. AWS Certificate Manager is the only supported source.","DomainName":"The custom domain name as an API host name, for example, `my-api.example.com` .","EndpointConfiguration":"The endpoint configuration of this DomainName showing the endpoint types of the domain name.","MutualTlsAuthentication":"The mutual TLS authentication configuration for a custom domain name. If specified, API Gateway performs two-way authentication between the client and the server. Clients must present a trusted certificate to access your API.","OwnershipVerificationCertificateArn":"The ARN of the public certificate issued by ACM to validate ownership of your custom domain. Only required when configuring mutual TLS and using an ACM imported or private CA certificate ARN as the RegionalCertificateArn.","RegionalCertificateArn":"The reference to an AWS -managed certificate that will be used for validating the regional domain name. AWS Certificate Manager is the only supported source.","SecurityPolicy":"The Transport Layer Security (TLS) version + cipher suite for this DomainName. The valid values are `TLS_1_0` and `TLS_1_2` .","Tags":"The collection of tags. Each tag element is associated with a given resource."}},"AWS::ApiGateway::DomainName.EndpointConfiguration":{"attributes":{},"description":"The `EndpointConfiguration` property type specifies the endpoint types of an Amazon API Gateway domain name.\\n\\n`EndpointConfiguration` is a property of the [AWS::ApiGateway::DomainName](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html) resource.","properties":{"Types":"A list of endpoint types of an API (RestApi) or its custom domain name (DomainName). For an edge-optimized API and its custom domain name, the endpoint type is `\\"EDGE\\"` . For a regional API and its custom domain name, the endpoint type is `REGIONAL` . For a private API, the endpoint type is `PRIVATE` ."}},"AWS::ApiGateway::DomainName.MutualTlsAuthentication":{"attributes":{},"description":"The mutual TLS authentication configuration for a custom domain name. If specified, API Gateway performs two-way authentication between the client and the server. Clients must present a trusted certificate to access your API.","properties":{"TruststoreUri":"An Amazon S3 URL that specifies the truststore for mutual TLS authentication, for example `s3://bucket-name/key-name` . The truststore can contain certificates from public or private certificate authorities. To update the truststore, upload a new version to S3, and then update your custom domain name to use the new version. To update the truststore, you must have permissions to access the S3 object.","TruststoreVersion":"The version of the S3 object that contains your truststore. To specify a version, you must have versioning enabled for the S3 bucket."}},"AWS::ApiGateway::GatewayResponse":{"attributes":{},"description":"The `AWS::ApiGateway::GatewayResponse` resource creates a gateway response for your API. For more information, see [API Gateway Responses](https://docs.aws.amazon.com/apigateway/latest/developerguide/customize-gateway-responses.html#api-gateway-gatewayResponse-definition) in the *API Gateway Developer Guide* .","properties":{"ResponseParameters":"Response parameters (paths, query strings and headers) of the GatewayResponse as a string-to-string map of key-value pairs.","ResponseTemplates":"Response templates of the GatewayResponse as a string-to-string map of key-value pairs.","ResponseType":"The response type of the associated GatewayResponse.","RestApiId":"The string identifier of the associated RestApi.","StatusCode":"The HTTP status code for this GatewayResponse."}},"AWS::ApiGateway::Method":{"attributes":{"Ref":"`Ref` returns the method ID, such as `mysta-metho-01234b567890example` ."},"description":"The `AWS::ApiGateway::Method` resource creates API Gateway methods that define the parameters and body that clients must send in their requests.","properties":{"ApiKeyRequired":"A boolean flag specifying whether a valid ApiKey is required to invoke this method.","AuthorizationScopes":"A list of authorization scopes configured on the method. The scopes are used with a `COGNITO_USER_POOLS` authorizer to authorize the method invocation. The authorization works by matching the method scopes against the scopes parsed from the access token in the incoming request. The method invocation is authorized if any method scopes matches a claimed scope in the access token. Otherwise, the invocation is not authorized. When the method scope is configured, the client must provide an access token instead of an identity token for authorization purposes.","AuthorizationType":"The method\'s authorization type. This parameter is required. For valid values, see [Method](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html) in the *API Gateway API Reference* .\\n\\n> If you specify the `AuthorizerId` property, specify `CUSTOM` or `COGNITO_USER_POOLS` for this property.","AuthorizerId":"The identifier of an authorizer to use on this method. The method\'s authorization type must be `CUSTOM` or `COGNITO_USER_POOLS` .","HttpMethod":"The method\'s HTTP verb.","Integration":"Represents an `HTTP` , `HTTP_PROXY` , `AWS` , `AWS_PROXY` , or Mock integration.","MethodResponses":"Gets a method response associated with a given HTTP status code.","OperationName":"A human-friendly operation identifier for the method. For example, you can assign the `operationName` of `ListPets` for the `GET /pets` method in the `PetStore` example.","RequestModels":"A key-value map specifying data schemas, represented by Model resources, (as the mapped value) of the request payloads of given content types (as the mapping key).","RequestParameters":"A key-value map defining required or optional method request parameters that can be accepted by API Gateway. A key is a method request parameter name matching the pattern of `method.request.{location}.{name}` , where `location` is `querystring` , `path` , or `header` and `name` is a valid and unique parameter name. The value associated with the key is a Boolean flag indicating whether the parameter is required ( `true` ) or optional ( `false` ). The method request parameter names defined here are available in Integration to be mapped to integration request parameters or templates.","RequestValidatorId":"The identifier of a RequestValidator for request validation.","ResourceId":"The Resource identifier for the MethodResponse resource.","RestApiId":"The string identifier of the associated RestApi."}},"AWS::ApiGateway::Method.Integration":{"attributes":{},"description":"`Integration` is a property of the [AWS::ApiGateway::Method](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html) resource that specifies information about the target backend that a method calls.","properties":{"CacheKeyParameters":"A list of request parameters whose values API Gateway caches. To be valid values for `cacheKeyParameters` , these parameters must also be specified for Method `requestParameters` .","CacheNamespace":"Specifies a group of related cached parameters. By default, API Gateway uses the resource ID as the `cacheNamespace` . You can specify the same `cacheNamespace` across resources to return the same cached data for requests to different resources.","ConnectionId":"The ID of the VpcLink used for the integration when `connectionType=VPC_LINK` and undefined, otherwise.","ConnectionType":"The type of the network connection to the integration endpoint. The valid value is `INTERNET` for connections through the public routable internet or `VPC_LINK` for private connections between API Gateway and a network load balancer in a VPC. The default value is `INTERNET` .","ContentHandling":"Specifies how to handle request payload content type conversions. Supported values are `CONVERT_TO_BINARY` and `CONVERT_TO_TEXT` , with the following behaviors:\\n\\nIf this property is not defined, the request payload will be passed through from the method request to integration request without modification, provided that the `passthroughBehavior` is configured to support payload pass-through.","Credentials":"Specifies the credentials required for the integration, if any. For AWS integrations, three options are available. To specify an IAM Role for API Gateway to assume, use the role\'s Amazon Resource Name (ARN). To require that the caller\'s identity be passed through from the request, specify the string `arn:aws:iam::\\\\*:user/\\\\*` . To use resource-based permissions on supported AWS services, specify null.","IntegrationHttpMethod":"Specifies the integration\'s HTTP method type. For the Type property, if you specify `MOCK` , this property is optional. For Lambda integrations, you must set the integration method to `POST` . For all other types, you must specify this property.","IntegrationResponses":"Specifies the integration\'s responses.","PassthroughBehavior":"Specifies how the method request body of an unmapped content type will be passed through the integration request to the back end without transformation. A content type is unmapped if no mapping template is defined in the integration or the content type does not match any of the mapped content types, as specified in `requestTemplates` . The valid value is one of the following: `WHEN_NO_MATCH` : passes the method request body through the integration request to the back end without transformation when the method request content type does not match any content type associated with the mapping templates defined in the integration request. `WHEN_NO_TEMPLATES` : passes the method request body through the integration request to the back end without transformation when no mapping template is defined in the integration request. If a template is defined when this option is selected, the method request of an unmapped content-type will be rejected with an HTTP 415 Unsupported Media Type response. `NEVER` : rejects the method request with an HTTP 415 Unsupported Media Type response when either the method request content type does not match any content type associated with the mapping templates defined in the integration request or no mapping template is defined in the integration request.","RequestParameters":"A key-value map specifying request parameters that are passed from the method request to the back end. The key is an integration request parameter name and the associated value is a method request parameter value or static value that must be enclosed within single quotes and pre-encoded as required by the back end. The method request parameter value must match the pattern of `method.request.{location}.{name}` , where `location` is `querystring` , `path` , or `header` and `name` must be a valid and unique method request parameter name.","RequestTemplates":"Represents a map of Velocity templates that are applied on the request payload based on the value of the Content-Type header sent by the client. The content type value is the key in this map, and the template (as a String) is the value.","TimeoutInMillis":"Custom timeout between 50 and 29,000 milliseconds. The default value is 29,000 milliseconds or 29 seconds.","Type":"Specifies an API method integration type. The valid value is one of the following:\\n\\nFor the HTTP and HTTP proxy integrations, each integration can specify a protocol ( `http/https` ), port and path. Standard 80 and 443 ports are supported as well as custom ports above 1024. An HTTP or HTTP proxy integration with a `connectionType` of `VPC_LINK` is referred to as a private integration and uses a VpcLink to connect API Gateway to a network load balancer of a VPC.","Uri":"Specifies Uniform Resource Identifier (URI) of the integration endpoint.\\n\\nFor `HTTP` or `HTTP_PROXY` integrations, the URI must be a fully formed, encoded HTTP(S) URL according to the RFC-3986 specification for standard integrations. If `connectionType` is `VPC_LINK` specify the Network Load Balancer DNS name. For `AWS` or `AWS_PROXY` integrations, the URI is of the form `arn:aws:apigateway:{region}:{subdomain.service|service}:path|action/{service_api}` . Here, {Region} is the API Gateway region (e.g., us-east-1); {service} is the name of the integrated AWS service (e.g., s3); and {subdomain} is a designated subdomain supported by certain AWS service for fast host-name lookup. action can be used for an AWS service action-based API, using an Action={name}&{p1}={v1}&p2={v2}... query string. The ensuing {service_api} refers to a supported action {name} plus any required input parameters. Alternatively, path can be used for an AWS service path-based API. The ensuing service_api refers to the path to an AWS service resource, including the region of the integrated AWS service, if applicable. For example, for integration with the S3 API of GetObject, the uri can be either `arn:aws:apigateway:us-west-2:s3:action/GetObject&Bucket={bucket}&Key={key}` or `arn:aws:apigateway:us-west-2:s3:path/{bucket}/{key}`"}},"AWS::ApiGateway::Method.IntegrationResponse":{"attributes":{},"description":"`IntegrationResponse` is a property of the [Amazon API Gateway Method Integration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html) property type that specifies the response that API Gateway sends after a method\'s backend finishes processing a request.","properties":{"ContentHandling":"Specifies how to handle response payload content type conversions. Supported values are `CONVERT_TO_BINARY` and `CONVERT_TO_TEXT` , with the following behaviors:\\n\\nIf this property is not defined, the response payload will be passed through from the integration response to the method response without modification.","ResponseParameters":"A key-value map specifying response parameters that are passed to the method response from the back end. The key is a method response header parameter name and the mapped value is an integration response header value, a static value enclosed within a pair of single quotes, or a JSON expression from the integration response body. The mapping key must match the pattern of `method.response.header.{name}` , where `name` is a valid and unique header name. The mapped non-static value must match the pattern of `integration.response.header.{name}` or `integration.response.body.{JSON-expression}` , where `name` is a valid and unique response header name and `JSON-expression` is a valid JSON expression without the `$` prefix.","ResponseTemplates":"Specifies the templates used to transform the integration response body. Response templates are represented as a key/value map, with a content-type as the key and a template as the value.","SelectionPattern":"Specifies the regular expression (regex) pattern used to choose an integration response based on the response from the back end. For example, if the success response returns nothing and the error response returns some string, you could use the `.+` regex to match error response. However, make sure that the error response does not contain any newline ( `\\\\n` ) character in such cases. If the back end is an AWS Lambda function, the AWS Lambda function error header is matched. For all other HTTP and AWS back ends, the HTTP status code is matched.","StatusCode":"Specifies the status code that is used to map the integration response to an existing MethodResponse."}},"AWS::ApiGateway::Method.MethodResponse":{"attributes":{},"description":"Represents a method response of a given HTTP status code returned to the client. The method response is passed from the back end through the associated integration response that can be transformed using a mapping template.","properties":{"ResponseModels":"Specifies the Model resources used for the response\'s content-type. Response models are represented as a key/value map, with a content-type as the key and a Model name as the value.","ResponseParameters":"A key-value map specifying required or optional response parameters that API Gateway can send back to the caller. A key defines a method response header and the value specifies whether the associated method response header is required or not. The expression of the key must match the pattern `method.response.header.{name}` , where `name` is a valid and unique header name. API Gateway passes certain integration response data to the method response headers specified here according to the mapping you prescribe in the API\'s IntegrationResponse. The integration response data that can be mapped include an integration response header expressed in `integration.response.header.{name}` , a static value enclosed within a pair of single quotes (e.g., `\'application/json\'` ), or a JSON expression from the back-end response payload in the form of `integration.response.body.{JSON-expression}` , where `JSON-expression` is a valid JSON expression without the `$` prefix.)","StatusCode":"The method response\'s status code."}},"AWS::ApiGateway::Model":{"attributes":{"Ref":"`Ref` returns the model name, such as `myModel` ."},"description":"The `AWS::ApiGateway::Model` resource defines the structure of a request or response payload for an API method.","properties":{"ContentType":"The content-type for the model.","Description":"The description of the model.","Name":"A name for the model. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the model name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","RestApiId":"The string identifier of the associated RestApi.","Schema":"The schema for the model. For `application/json` models, this should be JSON schema draft 4 model. Do not include \\"\\\\*/\\" characters in the description of any properties because such \\"\\\\*/\\" characters may be interpreted as the closing marker for comments in some languages, such as Java or JavaScript, causing the installation of your API\'s SDK generated by API Gateway to fail."}},"AWS::ApiGateway::RequestValidator":{"attributes":{"Ref":"`Ref` returns the ID of the request validator, such as `abc123` .","RequestValidatorId":"The ID for the request validator. For example: `abc123` ."},"description":"The `AWS::ApiGateway::RequestValidator` resource sets up basic validation rules for incoming requests to your API. For more information, see [Enable Basic Request Validation for an API in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html) in the *API Gateway Developer Guide* .","properties":{"Name":"The name of this RequestValidator","RestApiId":"The string identifier of the associated RestApi.","ValidateRequestBody":"A Boolean flag to indicate whether to validate a request body according to the configured Model schema.","ValidateRequestParameters":"A Boolean flag to indicate whether to validate request parameters ( `true` ) or not ( `false` )."}},"AWS::ApiGateway::Resource":{"attributes":{"Ref":"`Ref` returns the resource ID, such as `abc123` .","ResourceId":"The ID for the resource. For example: `abc123` ."},"description":"The `AWS::ApiGateway::Resource` resource creates a resource in an API.","properties":{"ParentId":"The parent resource\'s identifier.","PathPart":"The last path segment for this resource.","RestApiId":"The string identifier of the associated RestApi."}},"AWS::ApiGateway::RestApi":{"attributes":{"Ref":"`Ref` returns the `RestApi` ID, such as `a1bcdef2gh` .","RestApiId":"The string identifier of the associated RestApi.","RootResourceId":"The root resource ID for a `RestApi` resource, such as `a0bc123d4e` ."},"description":"The `AWS::ApiGateway::RestApi` resource creates a REST API. For more information, see [restapi:create](https://docs.aws.amazon.com/apigateway/latest/api/API_CreateRestApi.html) in the *Amazon API Gateway REST API Reference* .\\n\\n> On January 1, 2016, the Swagger Specification was donated to the [OpenAPI initiative](https://docs.aws.amazon.com/https://www.openapis.org/) , becoming the foundation of the OpenAPI Specification.","properties":{"ApiKeySourceType":"The source of the API key for metering requests according to a usage plan. Valid values are: `HEADER` to read the API key from the `X-API-Key` header of a request. `AUTHORIZER` to read the API key from the `UsageIdentifierKey` from a custom authorizer.","BinaryMediaTypes":"The list of binary media types supported by the RestApi. By default, the RestApi supports only UTF-8-encoded text payloads.","Body":"An OpenAPI specification that defines a set of RESTful APIs in JSON format. For YAML templates, you can also provide the specification in YAML format.","BodyS3Location":"The Amazon Simple Storage Service (Amazon S3) location that points to an OpenAPI file, which defines a set of RESTful APIs in JSON or YAML format.","CloneFrom":"The ID of the RestApi that you want to clone from.","Description":"The description of the RestApi.","DisableExecuteApiEndpoint":"Specifies whether clients can invoke your API by using the default `execute-api` endpoint. By default, clients can invoke your API with the default `https://{api_id}.execute-api.{region}.amazonaws.com` endpoint. To require that clients use a custom domain name to invoke your API, disable the default endpoint","EndpointConfiguration":"A list of the endpoint types of the API. Use this property when creating an API. When importing an existing API, specify the endpoint configuration types using the `Parameters` property.","FailOnWarnings":"A query parameter to indicate whether to rollback the API update ( `true` ) or not ( `false` ) when a warning is encountered. The default value is `false` .","MinimumCompressionSize":"A nullable integer that is used to enable compression (with non-negative between 0 and 10485760 (10M) bytes, inclusive) or disable compression (with a null value) on an API. When compression is enabled, compression or decompression is not applied on the payload if the payload size is smaller than this value. Setting it to zero allows compression for any payload size.","Mode":"This property applies only when you use OpenAPI to define your REST API. The `Mode` determines how API Gateway handles resource updates.\\n\\nValid values are `overwrite` or `merge` .\\n\\nFor `overwrite` , the new API definition replaces the existing one. The existing API identifier remains unchanged.\\n\\nFor `merge` , the new API definition is merged with the existing API.\\n\\nIf you don\'t specify this property, a default value is chosen. For REST APIs created before March 29, 2021, the default is `overwrite` . For REST APIs created after March 29, 2021, the new API definition takes precedence, but any container types such as endpoint configurations and binary media types are merged with the existing API.\\n\\nUse the default mode to define top-level `RestApi` properties in addition to using OpenAPI. Generally, it\'s preferred to use API Gateway\'s OpenAPI extensions to model these properties.","Name":"The name of the RestApi. A name is required if the REST API is not based on an OpenAPI specification.","Parameters":"Custom header parameters as part of the request. For example, to exclude DocumentationParts from an imported API, set `ignore=documentation` as a `parameters` value, as in the AWS CLI command of `aws apigateway import-rest-api --parameters ignore=documentation --body \'file:///path/to/imported-api-body.json\'` .","Policy":"A policy document that contains the permissions for the `RestApi` resource. To set the ARN for the policy, use the `!Join` intrinsic function with `\\"\\"` as delimiter and values of `\\"execute-api:/\\"` and `\\"*\\"` .","Tags":"The key-value map of strings. The valid character set is [a-zA-Z+-=._:/]. The tag key can be up to 128 characters and must not start with `aws:` . The tag value can be up to 256 characters."}},"AWS::ApiGateway::RestApi.EndpointConfiguration":{"attributes":{},"description":"The `EndpointConfiguration` property type specifies the endpoint types of a REST API.\\n\\n`EndpointConfiguration` is a property of the [AWS::ApiGateway::RestApi](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html) resource.","properties":{"Types":"A list of endpoint types of an API (RestApi) or its custom domain name (DomainName). For an edge-optimized API and its custom domain name, the endpoint type is `\\"EDGE\\"` . For a regional API and its custom domain name, the endpoint type is `REGIONAL` . For a private API, the endpoint type is `PRIVATE` .","VpcEndpointIds":"A list of VpcEndpointIds of an API (RestApi) against which to create Route53 ALIASes. It is only supported for `PRIVATE` endpoint type."}},"AWS::ApiGateway::RestApi.S3Location":{"attributes":{},"description":"`S3Location` is a property of the [AWS::ApiGateway::RestApi](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html) resource that specifies the Amazon S3 location of a OpenAPI (formerly Swagger) file that defines a set of RESTful APIs in JSON or YAML.\\n\\n> On January 1, 2016, the Swagger Specification was donated to the [OpenAPI initiative](https://docs.aws.amazon.com/https://www.openapis.org/) , becoming the foundation of the OpenAPI Specification.","properties":{"Bucket":"The name of the S3 bucket where the OpenAPI file is stored.","ETag":"The Amazon S3 ETag (a file checksum) of the OpenAPI file. If you don\'t specify a value, API Gateway skips ETag validation of your OpenAPI file.","Key":"The file name of the OpenAPI file (Amazon S3 object name).","Version":"For versioning-enabled buckets, a specific version of the OpenAPI file."}},"AWS::ApiGateway::Stage":{"attributes":{"Ref":"`Ref` returns the name of the stage, such as `MyTestStage` ."},"description":"The `AWS::ApiGateway::Stage` resource creates a stage for a deployment.","properties":{"AccessLogSetting":"Access log settings, including the access log format and access log destination ARN.","CacheClusterEnabled":"Specifies whether a cache cluster is enabled for the stage.","CacheClusterSize":"The stage\'s cache capacity in GB. For more information about choosing a cache size, see [Enabling API caching to enhance responsiveness](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-caching.html) .","CanarySetting":"Settings for the canary deployment in this stage.","ClientCertificateId":"The identifier of a client certificate for an API stage.","DeploymentId":"The identifier of the Deployment that the stage points to.","Description":"The stage\'s description.","DocumentationVersion":"The version of the associated API documentation.","MethodSettings":"A map that defines the method settings for a Stage resource. Keys (designated as `/{method_setting_key` below) are method paths defined as `{resource_path}/{http_method}` for an individual method override, or `/\\\\*/\\\\*` for overriding all methods in the stage.","RestApiId":"The string identifier of the associated RestApi.","StageName":"The name of the stage is the first path segment in the Uniform Resource Identifier (URI) of a call to API Gateway. Stage names can only contain alphanumeric characters, hyphens, and underscores. Maximum length is 128 characters.","Tags":"The collection of tags. Each tag element is associated with a given resource.","TracingEnabled":"Specifies whether active tracing with X-ray is enabled for the Stage.","Variables":"A map (string-to-string map) that defines the stage variables, where the variable name is the key and the variable value is the value. Variable names are limited to alphanumeric characters. Values must match the following regular expression: `[A-Za-z0-9-._~:/?#&=,]+` ."}},"AWS::ApiGateway::Stage.AccessLogSetting":{"attributes":{},"description":"The `AccessLogSetting` property type specifies settings for logging access in this stage.\\n\\n`AccessLogSetting` is a property of the [AWS::ApiGateway::Stage](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html) resource.","properties":{"DestinationArn":"The Amazon Resource Name (ARN) of the CloudWatch Logs log group or Kinesis Data Firehose delivery stream to receive access logs. If you specify a Kinesis Data Firehose delivery stream, the stream name must begin with `amazon-apigateway-` . This parameter is required to enable access logging.","Format":"A single line format of the access logs of data, as specified by selected [$context variables](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#context-variable-reference) . The format must include at least `$context.requestId` . This parameter is required to enable access logging."}},"AWS::ApiGateway::Stage.CanarySetting":{"attributes":{},"description":"Configuration settings of a canary deployment.","properties":{"DeploymentId":"The ID of the canary deployment.","PercentTraffic":"The percent (0-100) of traffic diverted to a canary deployment.","StageVariableOverrides":"Stage variables overridden for a canary release deployment, including new stage variables introduced in the canary. These stage variables are represented as a string-to-string map between stage variable names and their values.","UseStageCache":"A Boolean flag to indicate whether the canary deployment uses the stage cache or not."}},"AWS::ApiGateway::Stage.MethodSetting":{"attributes":{},"description":"The `MethodSetting` property type configures settings for all methods in a stage.\\n\\nThe `MethodSettings` property of the `AWS::ApiGateway::Stage` resource contains a list of `MethodSetting` property types.","properties":{"CacheDataEncrypted":"Specifies whether the cached responses are encrypted.","CacheTtlInSeconds":"Specifies the time to live (TTL), in seconds, for cached responses. The higher the TTL, the longer the response will be cached.","CachingEnabled":"Specifies whether responses should be cached and returned for requests. A cache cluster must be enabled on the stage for responses to be cached.","DataTraceEnabled":"Specifies whether data trace logging is enabled for this method, which affects the log entries pushed to Amazon CloudWatch Logs.","HttpMethod":"The HTTP method. To apply settings to multiple resources and methods, specify an asterisk ( `*` ) for the `HttpMethod` and `/*` for the `ResourcePath` . This parameter is required when you specify a `MethodSetting` .","LoggingLevel":"Specifies the logging level for this method, which affects the log entries pushed to Amazon CloudWatch Logs. Valid values are `OFF` , `ERROR` , and `INFO` . Choose `ERROR` to write only error-level entries to CloudWatch Logs, or choose `INFO` to include all `ERROR` events as well as extra informational events.","MetricsEnabled":"Specifies whether Amazon CloudWatch metrics are enabled for this method.","ResourcePath":"The resource path for this method. Forward slashes ( `/` ) are encoded as `~1` and the initial slash must include a forward slash. For example, the path value `/resource/subresource` must be encoded as `/~1resource~1subresource` . To specify the root path, use only a slash ( `/` ). To apply settings to multiple resources and methods, specify an asterisk ( `*` ) for the `HttpMethod` and `/*` for the `ResourcePath` . This parameter is required when you specify a `MethodSetting` .","ThrottlingBurstLimit":"Specifies the throttling burst limit.","ThrottlingRateLimit":"Specifies the throttling rate limit."}},"AWS::ApiGateway::UsagePlan":{"attributes":{"Id":"The ID for the usage plan. For example: `abc123` .","Ref":"`Ref` returns the usage plan ID, such as `abc123` ."},"description":"The `AWS::ApiGateway::UsagePlan` resource creates a usage plan for deployed APIs. A usage plan sets a target for the throttling and quota limits on individual client API keys. For more information, see [Creating and Using API Usage Plans in Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-api-usage-plans.html) in the *API Gateway Developer Guide* .\\n\\nIn some cases clients can exceed the targets that you set. Don’t rely on usage plans to control costs. Consider using [AWS Budgets](https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-managing-costs.html) to monitor costs and [AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) to manage API requests.","properties":{"ApiStages":"The associated API stages of a usage plan.","Description":"The description of a usage plan.","Quota":"The target maximum number of permitted requests per a given unit time interval.","Tags":"The collection of tags. Each tag element is associated with a given resource.","Throttle":"A map containing method level throttling information for API stage in a usage plan.","UsagePlanName":"The name of a usage plan."}},"AWS::ApiGateway::UsagePlan.ApiStage":{"attributes":{},"description":"API stage name of the associated API stage in a usage plan.","properties":{"ApiId":"API Id of the associated API stage in a usage plan.","Stage":"API stage name of the associated API stage in a usage plan.","Throttle":"Map containing method level throttling information for API stage in a usage plan."}},"AWS::ApiGateway::UsagePlan.QuotaSettings":{"attributes":{},"description":"`QuotaSettings` is a property of the [AWS::ApiGateway::UsagePlan](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplan.html) resource that specifies a target for the maximum number of requests users can make to your REST APIs.\\n\\nIn some cases clients can exceed the targets that you set. Don’t rely on usage plans to control costs. Consider using [AWS Budgets](https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-managing-costs.html) to monitor costs and [AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) to manage API requests.","properties":{"Limit":"The target maximum number of requests that can be made in a given time period.","Offset":"The number of requests subtracted from the given limit in the initial time period.","Period":"The time period in which the limit applies. Valid values are \\"DAY\\", \\"WEEK\\" or \\"MONTH\\"."}},"AWS::ApiGateway::UsagePlan.ThrottleSettings":{"attributes":{},"description":"`ThrottleSettings` is a property of the [AWS::ApiGateway::UsagePlan](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplan.html) resource that specifies the overall request rate (average requests per second) and burst capacity when users call your REST APIs.","properties":{"BurstLimit":"The API target request burst rate limit. This allows more requests through for a period of time than the target rate limit.","RateLimit":"The API target request rate limit."}},"AWS::ApiGateway::UsagePlanKey":{"attributes":{"Id":"The ID for the usage plan key. For example: `abc123` .","Ref":"`Ref` returns the ID of the key and ID of the usage plan combined with a \\":\\", such as `123abcdef:abc123` ."},"description":"The `AWS::ApiGateway::UsagePlanKey` resource associates an API key with a usage plan. This association determines which users the usage plan is applied to.","properties":{"KeyId":"The Id of the UsagePlanKey resource.","KeyType":"The type of a UsagePlanKey resource for a plan customer.","UsagePlanId":"The Id of the UsagePlan resource representing the usage plan containing the UsagePlanKey resource representing a plan customer."}},"AWS::ApiGateway::VpcLink":{"attributes":{"Ref":"`Ref` returns the ID of the `VpcLink` .","VpcLinkId":""},"description":"The `AWS::ApiGateway::VpcLink` resource creates an API Gateway VPC link for a REST API to access resources in an Amazon Virtual Private Cloud (VPC). For more information, see [vpclink:create](https://docs.aws.amazon.com/apigateway/latest/api/API_CreateVpcLink.html) in the `Amazon API Gateway REST API Reference` .","properties":{"Description":"The description of the VPC link.","Name":"The name used to label and identify the VPC link.","Tags":"An array of arbitrary tags (key-value pairs) to associate with the VPC link.","TargetArns":"The ARN of the network load balancer of the VPC targeted by the VPC link. The network load balancer must be owned by the same AWS account of the API owner."}},"AWS::ApiGatewayV2::Api":{"attributes":{"ApiEndpoint":"The default endpoint for an API. For example: `https://abcdef.execute-api.us-west-2.amazonaws.com` .","ApiId":"The API identifier.","Ref":"`Ref` returns the API ID, such as `a1bcdef2gh` ."},"description":"The `AWS::ApiGatewayV2::Api` resource creates an API. WebSocket APIs and HTTP APIs are supported. For more information about WebSocket APIs, see [About WebSocket APIs in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-overview.html) in the *API Gateway Developer Guide* . For more information about HTTP APIs, see [HTTP APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html) in the *API Gateway Developer Guide.*","properties":{"ApiKeySelectionExpression":"An API key selection expression. Supported only for WebSocket APIs. See [API Key Selection Expressions](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-selection-expressions.html#apigateway-websocket-api-apikey-selection-expressions) .","BasePath":"Specifies how to interpret the base path of the API during import. Valid values are `ignore` , `prepend` , and `split` . The default value is `ignore` . To learn more, see [Set the OpenAPI basePath Property](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-import-api-basePath.html) . Supported only for HTTP APIs.","Body":"The OpenAPI definition. Supported only for HTTP APIs. To import an HTTP API, you must specify a `Body` or `BodyS3Location` . If you specify a `Body` or `BodyS3Location` , don\'t specify CloudFormation resources such as `AWS::ApiGatewayV2::Authorizer` or `AWS::ApiGatewayV2::Route` . API Gateway doesn\'t support the combination of OpenAPI and CloudFormation resources.","BodyS3Location":"The S3 location of an OpenAPI definition. Supported only for HTTP APIs. To import an HTTP API, you must specify a `Body` or `BodyS3Location` . If you specify a `Body` or `BodyS3Location` , don\'t specify CloudFormation resources such as `AWS::ApiGatewayV2::Authorizer` or `AWS::ApiGatewayV2::Route` . API Gateway doesn\'t support the combination of OpenAPI and CloudFormation resources.","CorsConfiguration":"A CORS configuration. Supported only for HTTP APIs. See [Configuring CORS](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-cors.html) for more information.","CredentialsArn":"This property is part of quick create. It specifies the credentials required for the integration, if any. For a Lambda integration, three options are available. To specify an IAM Role for API Gateway to assume, use the role\'s Amazon Resource Name (ARN). To require that the caller\'s identity be passed through from the request, specify `arn:aws:iam::*:user/*` . To use resource-based permissions on supported AWS services, specify `null` . Currently, this property is not used for HTTP integrations. Supported only for HTTP APIs.","Description":"The description of the API.","DisableExecuteApiEndpoint":"Specifies whether clients can invoke your API by using the default `execute-api` endpoint. By default, clients can invoke your API with the default https://{api_id}.execute-api.{region}.amazonaws.com endpoint. To require that clients use a custom domain name to invoke your API, disable the default endpoint.","DisableSchemaValidation":"Avoid validating models when creating a deployment. Supported only for WebSocket APIs.","FailOnWarnings":"Specifies whether to rollback the API creation when a warning is encountered. By default, API creation continues if a warning is encountered.","Name":"The name of the API. Required unless you specify an OpenAPI definition for `Body` or `S3BodyLocation` .","ProtocolType":"The API protocol. Valid values are `WEBSOCKET` or `HTTP` . Required unless you specify an OpenAPI definition for `Body` or `S3BodyLocation` .","RouteKey":"This property is part of quick create. If you don\'t specify a `routeKey` , a default route of `$default` is created. The `$default` route acts as a catch-all for any request made to your API, for a particular stage. The `$default` route key can\'t be modified. You can add routes after creating the API, and you can update the route keys of additional routes. Supported only for HTTP APIs.","RouteSelectionExpression":"The route selection expression for the API. For HTTP APIs, the `routeSelectionExpression` must be `${request.method} ${request.path}` . If not provided, this will be the default for HTTP APIs. This property is required for WebSocket APIs.","Tags":"The collection of tags. Each tag element is associated with a given resource.","Target":"This property is part of quick create. Quick create produces an API with an integration, a default catch-all route, and a default stage which is configured to automatically deploy changes. For HTTP integrations, specify a fully qualified URL. For Lambda integrations, specify a function ARN. The type of the integration will be HTTP_PROXY or AWS_PROXY, respectively. Supported only for HTTP APIs.","Version":"A version identifier for the API."}},"AWS::ApiGatewayV2::Api.BodyS3Location":{"attributes":{},"description":"The `BodyS3Location` property specifies an S3 location from which to import an OpenAPI definition. Supported only for HTTP APIs.","properties":{"Bucket":"The S3 bucket that contains the OpenAPI definition to import. Required if you specify a `BodyS3Location` for an API.","Etag":"The Etag of the S3 object.","Key":"The key of the S3 object. Required if you specify a `BodyS3Location` for an API.","Version":"The version of the S3 object."}},"AWS::ApiGatewayV2::Api.Cors":{"attributes":{},"description":"The `Cors` property specifies a CORS configuration for an API. Supported only for HTTP APIs. See [Configuring CORS](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-cors.html) for more information.","properties":{"AllowCredentials":"Specifies whether credentials are included in the CORS request. Supported only for HTTP APIs.","AllowHeaders":"Represents a collection of allowed headers. Supported only for HTTP APIs.","AllowMethods":"Represents a collection of allowed HTTP methods. Supported only for HTTP APIs.","AllowOrigins":"Represents a collection of allowed origins. Supported only for HTTP APIs.","ExposeHeaders":"Represents a collection of exposed headers. Supported only for HTTP APIs.","MaxAge":"The number of seconds that the browser should cache preflight request results. Supported only for HTTP APIs."}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides":{"attributes":{},"description":"The `AWS::ApiGatewayV2::ApiGatewayManagedOverrides` resource overrides the default properties of API Gateway-managed resources that are implicitly configured for you when you use quick create. When you create an API by using quick create, an `AWS::ApiGatewayV2::Route` , `AWS::ApiGatewayV2::Integration` , and `AWS::ApiGatewayV2::Stage` are created for you and associated with your `AWS::ApiGatewayV2::Api` . The `AWS::ApiGatewayV2::ApiGatewayManagedOverrides` resource enables you to set, or override the properties of these implicit resources. Supported only for HTTP APIs.","properties":{"ApiId":"The ID of the API for which to override the configuration of API Gateway-managed resources.","Integration":"Overrides the integration configuration for an API Gateway-managed integration.","Route":"Overrides the route configuration for an API Gateway-managed route.","Stage":"Overrides the stage configuration for an API Gateway-managed stage."}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides.AccessLogSettings":{"attributes":{},"description":"The `AccessLogSettings` property overrides the access log settings for an API Gateway-managed stage.","properties":{"DestinationArn":"The ARN of the CloudWatch Logs log group to receive access logs.","Format":"A single line format of the access logs of data, as specified by selected $context variables. The format must include at least $context.requestId."}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides.IntegrationOverrides":{"attributes":{},"description":"The `IntegrationOverrides` property overrides the integration settings for an API Gateway-managed integration. If you remove this property, API Gateway restores the default values.","properties":{"Description":"The description of the integration.","IntegrationMethod":"Specifies the integration\'s HTTP method type.","PayloadFormatVersion":"Specifies the format of the payload sent to an integration. Required for HTTP APIs. For HTTP APIs, supported values for Lambda proxy integrations are `1.0` and `2.0` . For all other integrations, `1.0` is the only supported value. To learn more, see [Working with AWS Lambda proxy integrations for HTTP APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) .","TimeoutInMillis":"Custom timeout between 50 and 29,000 milliseconds for WebSocket APIs and between 50 and 30,000 milliseconds for HTTP APIs. The default timeout is 29 seconds for WebSocket APIs and 30 seconds for HTTP APIs."}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides.RouteOverrides":{"attributes":{},"description":"The `RouteOverrides` property overrides the route configuration for an API Gateway-managed route. If you remove this property, API Gateway restores the default values.","properties":{"AuthorizationScopes":"The authorization scopes supported by this route.","AuthorizationType":"The authorization type for the route. To learn more, see [AuthorizationType](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-authorizationtype) .","AuthorizerId":"The identifier of the `Authorizer` resource to be associated with this route. The authorizer identifier is generated by API Gateway when you created the authorizer.","OperationName":"The operation name for the route.","Target":"For HTTP integrations, specify a fully qualified URL. For Lambda integrations, specify a function ARN. The type of the integration will be HTTP_PROXY or AWS_PROXY, respectively."}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides.RouteSettings":{"attributes":{},"description":"The `RouteSettings` property overrides the route settings for an API Gateway-managed route.","properties":{"DataTraceEnabled":"Specifies whether ( `true` ) or not ( `false` ) data trace logging is enabled for this route. This property affects the log entries pushed to Amazon CloudWatch Logs. Supported only for WebSocket APIs.","DetailedMetricsEnabled":"Specifies whether detailed metrics are enabled.","LoggingLevel":"Specifies the logging level for this route: `INFO` , `ERROR` , or `OFF` . This property affects the log entries pushed to Amazon CloudWatch Logs. Supported only for WebSocket APIs.","ThrottlingBurstLimit":"Specifies the throttling burst limit.","ThrottlingRateLimit":"Specifies the throttling rate limit."}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides.StageOverrides":{"attributes":{},"description":"The `StageOverrides` property overrides the stage configuration for an API Gateway-managed stage. If you remove this property, API Gateway restores the default values.","properties":{"AccessLogSettings":"Settings for logging access in a stage.","AutoDeploy":"Specifies whether updates to an API automatically trigger a new deployment. The default value is `true` .","DefaultRouteSettings":"The default route settings for the stage.","Description":"The description for the API stage.","RouteSettings":"Route settings for the stage.","StageVariables":"A map that defines the stage variables for a `Stage` . Variable names can have alphanumeric and underscore characters, and the values must match [A-Za-z0-9-._~:/?#&=,]+."}},"AWS::ApiGatewayV2::ApiMapping":{"attributes":{"ApiMappingId":"The API mapping resource ID.","Ref":"`Ref` returns the API mapping resource ID."},"description":"The `AWS::ApiGatewayV2::ApiMapping` resource contains an API mapping. An API mapping relates a path of your custom domain name to a stage of your API. A custom domain name can have multiple API mappings, but the paths can\'t overlap. A custom domain can map only to APIs of the same protocol type. For more information, see [CreateApiMapping](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/domainnames-domainname-apimappings.html#CreateApiMapping) in the *Amazon API Gateway V2 API Reference* .","properties":{"ApiId":"The identifier of the API.","ApiMappingKey":"The API mapping key.","DomainName":"The domain name.","Stage":"The API stage."}},"AWS::ApiGatewayV2::Authorizer":{"attributes":{"AuthorizerId":"The authorizer ID.","Ref":"`Ref` returns the authorizer\'s ID, such as `abcde1` ."},"description":"The `AWS::ApiGatewayV2::Authorizer` resource creates an authorizer for a WebSocket API or an HTTP API. To learn more, see [Controlling and managing access to a WebSocket API in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-control-access.html) and [Controlling and managing access to an HTTP API in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-access-control.html) in the *API Gateway Developer Guide* .","properties":{"ApiId":"The API identifier.","AuthorizerCredentialsArn":"Specifies the required credentials as an IAM role for API Gateway to invoke the authorizer. To specify an IAM role for API Gateway to assume, use the role\'s Amazon Resource Name (ARN). To use resource-based permissions on the Lambda function, specify null. Supported only for `REQUEST` authorizers.","AuthorizerPayloadFormatVersion":"Specifies the format of the payload sent to an HTTP API Lambda authorizer. Required for HTTP API Lambda authorizers. Supported values are `1.0` and `2.0` . To learn more, see [Working with AWS Lambda authorizers for HTTP APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-lambda-authorizer.html) .","AuthorizerResultTtlInSeconds":"The time to live (TTL) for cached authorizer results, in seconds. If it equals 0, authorization caching is disabled. If it is greater than 0, API Gateway caches authorizer responses. The maximum value is 3600, or 1 hour. Supported only for HTTP API Lambda authorizers.","AuthorizerType":"The authorizer type. Specify `REQUEST` for a Lambda function using incoming request parameters. Specify `JWT` to use JSON Web Tokens (supported only for HTTP APIs).","AuthorizerUri":"The authorizer\'s Uniform Resource Identifier (URI). For `REQUEST` authorizers, this must be a well-formed Lambda function URI, for example, `arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2: *{account_id}* :function: *{lambda_function_name}* /invocations` . In general, the URI has this form: `arn:aws:apigateway: *{region}* :lambda:path/ *{service_api}*` , where *{region}* is the same as the region hosting the Lambda function, path indicates that the remaining substring in the URI should be treated as the path to the resource, including the initial `/` . For Lambda functions, this is usually of the form `/2015-03-31/functions/[FunctionARN]/invocations` .","EnableSimpleResponses":"Specifies whether a Lambda authorizer returns a response in a simple format. By default, a Lambda authorizer must return an IAM policy. If enabled, the Lambda authorizer can return a boolean value instead of an IAM policy. Supported only for HTTP APIs. To learn more, see [Working with AWS Lambda authorizers for HTTP APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-lambda-authorizer.html) .","IdentitySource":"The identity source for which authorization is requested.\\n\\nFor a `REQUEST` authorizer, this is optional. The value is a set of one or more mapping expressions of the specified request parameters. The identity source can be headers, query string parameters, stage variables, and context parameters. For example, if an Auth header and a Name query string parameter are defined as identity sources, this value is route.request.header.Auth, route.request.querystring.Name for WebSocket APIs. For HTTP APIs, use selection expressions prefixed with `$` , for example, `$request.header.Auth` , `$request.querystring.Name` . These parameters are used to perform runtime validation for Lambda-based authorizers by verifying all of the identity-related request parameters are present in the request, not null, and non-empty. Only when this is true does the authorizer invoke the authorizer Lambda function. Otherwise, it returns a 401 Unauthorized response without calling the Lambda function. For HTTP APIs, identity sources are also used as the cache key when caching is enabled. To learn more, see [Working with AWS Lambda authorizers for HTTP APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-lambda-authorizer.html) .\\n\\nFor `JWT` , a single entry that specifies where to extract the JSON Web Token (JWT) from inbound requests. Currently only header-based and query parameter-based selections are supported, for example `$request.header.Authorization` .","IdentityValidationExpression":"This parameter is not used.","JwtConfiguration":"The `JWTConfiguration` property specifies the configuration of a JWT authorizer. Required for the `JWT` authorizer type. Supported only for HTTP APIs.","Name":"The name of the authorizer."}},"AWS::ApiGatewayV2::Authorizer.JWTConfiguration":{"attributes":{},"description":"The `JWTConfiguration` property specifies the configuration of a JWT authorizer. Required for the `JWT` authorizer type. Supported only for HTTP APIs.","properties":{"Audience":"A list of the intended recipients of the JWT. A valid JWT must provide an `aud` that matches at least one entry in this list. See [RFC 7519](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc7519#section-4.1.3) . Required for the `JWT` authorizer type. Supported only for HTTP APIs.","Issuer":"The base domain of the identity provider that issues JSON Web Tokens. For example, an Amazon Cognito user pool has the following format: `https://cognito-idp. {region} .amazonaws.com/ {userPoolId}` . Required for the `JWT` authorizer type. Supported only for HTTP APIs."}},"AWS::ApiGatewayV2::Deployment":{"attributes":{"DeploymentId":"The deployment ID.","Ref":"`Ref` returns the deployment ID, such as `123abc` ."},"description":"The `AWS::ApiGatewayV2::Deployment` resource creates a deployment for an API.","properties":{"ApiId":"The API identifier.","Description":"The description for the deployment resource.","StageName":"The name of an existing stage to associate with the deployment."}},"AWS::ApiGatewayV2::DomainName":{"attributes":{"Ref":"`Ref` returns the domain name, such as `example.mydomain.com` .","RegionalDomainName":"The domain name associated with the regional endpoint for this custom domain name. You set up this association by adding a DNS record that points the custom domain name to this regional domain name.","RegionalHostedZoneId":"The region-specific Amazon Route 53 Hosted Zone ID of the regional endpoint."},"description":"The `AWS::ApiGatewayV2::DomainName` resource specifies a custom domain name for your API in Amazon API Gateway (API Gateway).\\n\\nYou can use a custom domain name to provide a URL that\'s more intuitive and easier to recall. For more information about using custom domain names, see [Set up Custom Domain Name for an API in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html) in the *API Gateway Developer Guide* .","properties":{"DomainName":"The custom domain name for your API in Amazon API Gateway. Uppercase letters are not supported.","DomainNameConfigurations":"The domain name configurations.","MutualTlsAuthentication":"The mutual TLS authentication configuration for a custom domain name.","Tags":"The collection of tags associated with a domain name."}},"AWS::ApiGatewayV2::DomainName.DomainNameConfiguration":{"attributes":{},"description":"The `DomainNameConfiguration` property type specifies the configuration for a an API\'s domain name.\\n\\n`DomainNameConfiguration` is a property of the [AWS::ApiGatewayV2::DomainName](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-domainname.html) resource.","properties":{"CertificateArn":"An AWS -managed certificate that will be used by the edge-optimized endpoint for this domain name. AWS Certificate Manager is the only supported source.","CertificateName":"The user-friendly name of the certificate that will be used by the edge-optimized endpoint for this domain name.","EndpointType":"The endpoint type.","OwnershipVerificationCertificateArn":"The Amazon resource name (ARN) for the public certificate issued by AWS Certificate Manager . This ARN is used to validate custom domain ownership. It\'s required only if you configure mutual TLS and use either an ACM-imported or a private CA certificate ARN as the regionalCertificateArn.","SecurityPolicy":"The Transport Layer Security (TLS) version of the security policy for this domain name. The valid values are `TLS_1_0` and `TLS_1_2` ."}},"AWS::ApiGatewayV2::DomainName.MutualTlsAuthentication":{"attributes":{},"description":"If specified, API Gateway performs two-way authentication between the client and the server. Clients must present a trusted certificate to access your API.","properties":{"TruststoreUri":"An Amazon S3 URL that specifies the truststore for mutual TLS authentication, for example, `s3:// bucket-name / key-name` . The truststore can contain certificates from public or private certificate authorities. To update the truststore, upload a new version to S3, and then update your custom domain name to use the new version. To update the truststore, you must have permissions to access the S3 object.","TruststoreVersion":"The version of the S3 object that contains your truststore. To specify a version, you must have versioning enabled for the S3 bucket."}},"AWS::ApiGatewayV2::Integration":{"attributes":{"Ref":"`Ref` returns the Integration resource ID, such as `abcd123` ."},"description":"The `AWS::ApiGatewayV2::Integration` resource creates an integration for an API.","properties":{"ApiId":"The API identifier.","ConnectionId":"The ID of the VPC link for a private integration. Supported only for HTTP APIs.","ConnectionType":"The type of the network connection to the integration endpoint. Specify `INTERNET` for connections through the public routable internet or `VPC_LINK` for private connections between API Gateway and resources in a VPC. The default value is `INTERNET` .","ContentHandlingStrategy":"Supported only for WebSocket APIs. Specifies how to handle response payload content type conversions. Supported values are `CONVERT_TO_BINARY` and `CONVERT_TO_TEXT` , with the following behaviors:\\n\\n`CONVERT_TO_BINARY` : Converts a response payload from a Base64-encoded string to the corresponding binary blob.\\n\\n`CONVERT_TO_TEXT` : Converts a response payload from a binary blob to a Base64-encoded string.\\n\\nIf this property is not defined, the response payload will be passed through from the integration response to the route response or method response without modification.","CredentialsArn":"Specifies the credentials required for the integration, if any. For AWS integrations, three options are available. To specify an IAM Role for API Gateway to assume, use the role\'s Amazon Resource Name (ARN). To require that the caller\'s identity be passed through from the request, specify the string `arn:aws:iam::*:user/*` . To use resource-based permissions on supported AWS services, don\'t specify this parameter.","Description":"The description of the integration.","IntegrationMethod":"Specifies the integration\'s HTTP method type.","IntegrationSubtype":"Supported only for HTTP API `AWS_PROXY` integrations. Specifies the AWS service action to invoke. To learn more, see [Integration subtype reference](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-aws-services-reference.html) .","IntegrationType":"The integration type of an integration. One of the following:\\n\\n`AWS` : for integrating the route or method request with an AWS service action, including the Lambda function-invoking action. With the Lambda function-invoking action, this is referred to as the Lambda custom integration. With any other AWS service action, this is known as AWS integration. Supported only for WebSocket APIs.\\n\\n`AWS_PROXY` : for integrating the route or method request with a Lambda function or other AWS service action. This integration is also referred to as a Lambda proxy integration.\\n\\n`HTTP` : for integrating the route or method request with an HTTP endpoint. This integration is also referred to as the HTTP custom integration. Supported only for WebSocket APIs.\\n\\n`HTTP_PROXY` : for integrating the route or method request with an HTTP endpoint, with the client request passed through as-is. This is also referred to as HTTP proxy integration. For HTTP API private integrations, use an `HTTP_PROXY` integration.\\n\\n`MOCK` : for integrating the route or method request with API Gateway as a \\"loopback\\" endpoint without invoking any backend. Supported only for WebSocket APIs.","IntegrationUri":"For a Lambda integration, specify the URI of a Lambda function.\\n\\nFor an HTTP integration, specify a fully-qualified URL.\\n\\nFor an HTTP API private integration, specify the ARN of an Application Load Balancer listener, Network Load Balancer listener, or AWS Cloud Map service. If you specify the ARN of an AWS Cloud Map service, API Gateway uses `DiscoverInstances` to identify resources. You can use query parameters to target specific resources. To learn more, see [DiscoverInstances](https://docs.aws.amazon.com/cloud-map/latest/api/API_DiscoverInstances.html) . For private integrations, all resources must be owned by the same AWS account .","PassthroughBehavior":"Specifies the pass-through behavior for incoming requests based on the `Content-Type` header in the request, and the available mapping templates specified as the `requestTemplates` property on the `Integration` resource. There are three valid values: `WHEN_NO_MATCH` , `WHEN_NO_TEMPLATES` , and `NEVER` . Supported only for WebSocket APIs.\\n\\n`WHEN_NO_MATCH` passes the request body for unmapped content types through to the integration backend without transformation.\\n\\n`NEVER` rejects unmapped content types with an `HTTP 415 Unsupported Media Type` response.\\n\\n`WHEN_NO_TEMPLATES` allows pass-through when the integration has no content types mapped to templates. However, if there is at least one content type defined, unmapped content types will be rejected with the same `HTTP 415 Unsupported Media Type` response.","PayloadFormatVersion":"Specifies the format of the payload sent to an integration. Required for HTTP APIs. For HTTP APIs, supported values for Lambda proxy integrations are `1.0` and `2.0` . For all other integrations, `1.0` is the only supported value. To learn more, see [Working with AWS Lambda proxy integrations for HTTP APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html) .","RequestParameters":"For WebSocket APIs, a key-value map specifying request parameters that are passed from the method request to the backend. The key is an integration request parameter name and the associated value is a method request parameter value or static value that must be enclosed within single quotes and pre-encoded as required by the backend. The method request parameter value must match the pattern of `method.request. {location} . {name}` , where `{location}` is `querystring` , `path` , or `header` ; and `{name}` must be a valid and unique method request parameter name.\\n\\nFor HTTP API integrations with a specified `integrationSubtype` , request parameters are a key-value map specifying parameters that are passed to `AWS_PROXY` integrations. You can provide static values, or map request data, stage variables, or context variables that are evaluated at runtime. To learn more, see [Working with AWS service integrations for HTTP APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-aws-services.html) .\\n\\nFor HTTP API integrations without a specified `integrationSubtype` request parameters are a key-value map specifying how to transform HTTP requests before sending them to the backend. The key should follow the pattern :. where action can be `append` , `overwrite` or `remove` . For values, you can provide static values, or map request data, stage variables, or context variables that are evaluated at runtime. To learn more, see [Transforming API requests and responses](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-parameter-mapping.html) .","RequestTemplates":"Represents a map of Velocity templates that are applied on the request payload based on the value of the Content-Type header sent by the client. The content type value is the key in this map, and the template (as a String) is the value. Supported only for WebSocket APIs.","ResponseParameters":"Supported only for HTTP APIs. You use response parameters to transform the HTTP response from a backend integration before returning the response to clients. Specify a key-value map from a selection key to response parameters. The selection key must be a valid HTTP status code within the range of 200-599. The value is of type [`ResponseParameterList`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-integration-responseparameterlist.html) . To learn more, see [Transforming API requests and responses](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-parameter-mapping.html) .","TemplateSelectionExpression":"The template selection expression for the integration. Supported only for WebSocket APIs.","TimeoutInMillis":"Custom timeout between 50 and 29,000 milliseconds for WebSocket APIs and between 50 and 30,000 milliseconds for HTTP APIs. The default timeout is 29 seconds for WebSocket APIs and 30 seconds for HTTP APIs.","TlsConfig":"The TLS configuration for a private integration. If you specify a TLS configuration, private integration traffic uses the HTTPS protocol. Supported only for HTTP APIs."}},"AWS::ApiGatewayV2::Integration.ResponseParameter":{"attributes":{},"description":"Supported only for HTTP APIs. You use response parameters to transform the HTTP response from a backend integration before returning the response to clients. Specify a key-value map from a selection key to response parameters. The selection key must be a valid HTTP status code within the range of 200-599. Response parameters are a key-value map. The key must match the pattern `:
.` or `overwrite.statuscode` . The action can be `append` , `overwrite` or `remove` . The value can be a static value, or map to response data, stage variables, or context variables that are evaluated at runtime. To learn more, see [Transforming API requests and responses](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-parameter-mapping.html) .","properties":{"Destination":"Specifies the location of the response to modify, and how to modify it. To learn more, see [Transforming API requests and responses](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-parameter-mapping.html) .","Source":"Specifies the data to update the parameter with. To learn more, see [Transforming API requests and responses](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-parameter-mapping.html) ."}},"AWS::ApiGatewayV2::Integration.ResponseParameterList":{"attributes":{},"description":"Specifies a list of response parameters for an HTTP API.","properties":{"ResponseParameters":"Supported only for HTTP APIs. You use response parameters to transform the HTTP response from a backend integration before returning the response to clients. Specify a key-value map from a selection key to response parameters. The selection key must be a valid HTTP status code within the range of 200-599. Response parameters are a key-value map. The key must match the pattern `:
.` or `overwrite.statuscode` . The action can be `append` , `overwrite` or `remove` . The value can be a static value, or map to response data, stage variables, or context variables that are evaluated at runtime. To learn more, see [Transforming API requests and responses](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-parameter-mapping.html) ."}},"AWS::ApiGatewayV2::Integration.TlsConfig":{"attributes":{},"description":"The `TlsConfig` property specifies the TLS configuration for a private integration. If you specify a TLS configuration, private integration traffic uses the HTTPS protocol. Supported only for HTTP APIs.","properties":{"ServerNameToVerify":"If you specify a server name, API Gateway uses it to verify the hostname on the integration\'s certificate. The server name is also included in the TLS handshake to support Server Name Indication (SNI) or virtual hosting."}},"AWS::ApiGatewayV2::IntegrationResponse":{"attributes":{"IntegrationResponseId":"The integration response ID.","Ref":"`Ref` returns the integration response resource ID, such as `abcd123` ."},"description":"The `AWS::ApiGatewayV2::IntegrationResponse` resource updates an integration response for an WebSocket API. For more information, see [Set up WebSocket API Integration Responses in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-integration-responses.html) in the *API Gateway Developer Guide* .","properties":{"ApiId":"The API identifier.","ContentHandlingStrategy":"Supported only for WebSocket APIs. Specifies how to handle response payload content type conversions. Supported values are `CONVERT_TO_BINARY` and `CONVERT_TO_TEXT` , with the following behaviors:\\n\\n`CONVERT_TO_BINARY` : Converts a response payload from a Base64-encoded string to the corresponding binary blob.\\n\\n`CONVERT_TO_TEXT` : Converts a response payload from a binary blob to a Base64-encoded string.\\n\\nIf this property is not defined, the response payload will be passed through from the integration response to the route response or method response without modification.","IntegrationId":"The integration ID.","IntegrationResponseKey":"The integration response key.","ResponseParameters":"A key-value map specifying response parameters that are passed to the method response from the backend. The key is a method response header parameter name and the mapped value is an integration response header value, a static value enclosed within a pair of single quotes, or a JSON expression from the integration response body. The mapping key must match the pattern of `method.response.header. *{name}*` , where name is a valid and unique header name. The mapped non-static value must match the pattern of `integration.response.header. *{name}*` or `integration.response.body. *{JSON-expression}*` , where `*{name}*` is a valid and unique response header name and `*{JSON-expression}*` is a valid JSON expression without the `$` prefix.","ResponseTemplates":"The collection of response templates for the integration response as a string-to-string map of key-value pairs. Response templates are represented as a key/value map, with a content-type as the key and a template as the value.","TemplateSelectionExpression":"The template selection expression for the integration response. Supported only for WebSocket APIs."}},"AWS::ApiGatewayV2::Model":{"attributes":{"ModelId":"The model ID.","Ref":"`Ref` returns the model ID, such as `abc123` ."},"description":"The `AWS::ApiGatewayV2::Model` resource updates data model for a WebSocket API. For more information, see [Model Selection Expressions](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-selection-expressions.html#apigateway-websocket-api-model-selection-expressions) in the *API Gateway Developer Guide* .","properties":{"ApiId":"The API identifier.","ContentType":"The content-type for the model, for example, \\"application/json\\".","Description":"The description of the model.","Name":"The name of the model.","Schema":"The schema for the model. For application/json models, this should be JSON schema draft 4 model."}},"AWS::ApiGatewayV2::Route":{"attributes":{"Ref":"`Ref` returns the Route resource ID, such as `abcd123` .","RouteId":"The route ID."},"description":"The `AWS::ApiGatewayV2::Route` resource creates a route for an API.","properties":{"ApiId":"The API identifier.","ApiKeyRequired":"Specifies whether an API key is required for the route. Supported only for WebSocket APIs.","AuthorizationScopes":"The authorization scopes supported by this route.","AuthorizationType":"The authorization type for the route. For WebSocket APIs, valid values are `NONE` for open access, `AWS_IAM` for using AWS IAM permissions, and `CUSTOM` for using a Lambda authorizer. For HTTP APIs, valid values are `NONE` for open access, `JWT` for using JSON Web Tokens, `AWS_IAM` for using AWS IAM permissions, and `CUSTOM` for using a Lambda authorizer.","AuthorizerId":"The identifier of the `Authorizer` resource to be associated with this route. The authorizer identifier is generated by API Gateway when you created the authorizer.","ModelSelectionExpression":"The model selection expression for the route. Supported only for WebSocket APIs.","OperationName":"The operation name for the route.","RequestModels":"The request models for the route. Supported only for WebSocket APIs.","RequestParameters":"The request parameters for the route. Supported only for WebSocket APIs.","RouteKey":"The route key for the route. For HTTP APIs, the route key can be either `$default` , or a combination of an HTTP method and resource path, for example, `GET /pets` .","RouteResponseSelectionExpression":"The route response selection expression for the route. Supported only for WebSocket APIs.","Target":"The target for the route."}},"AWS::ApiGatewayV2::RouteResponse":{"attributes":{"Ref":"`Ref` returns the Route Response resource ID, such as `abc123` .","RouteResponseId":"The route response ID."},"description":"The `AWS::ApiGatewayV2::RouteResponse` resource creates a route response for a WebSocket API. For more information, see [Set up Route Responses for a WebSocket API in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-route-response.html) in the *API Gateway Developer Guide* .","properties":{"ApiId":"The API identifier.","ModelSelectionExpression":"The model selection expression for the route response. Supported only for WebSocket APIs.","ResponseModels":"The response models for the route response.","ResponseParameters":"The route response parameters.","RouteId":"The route ID.","RouteResponseKey":"The route response key."}},"AWS::ApiGatewayV2::RouteResponse.ParameterConstraints":{"attributes":{},"description":"Specifies whether the parameter is required.","properties":{"Required":"Specifies whether the parameter is required."}},"AWS::ApiGatewayV2::Stage":{"attributes":{"Ref":"`Ref` returns the stage name, such as `MyTestStage` ."},"description":"The `AWS::ApiGatewayV2::Stage` resource specifies a stage for an API. Each stage is a named reference to a deployment of the API and is made available for client applications to call. To learn more, see [Working with stages for HTTP APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-stages.html) and [Deploy a WebSocket API in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-set-up-websocket-deployment.html) .","properties":{"AccessLogSettings":"Settings for logging access in this stage.","AccessPolicyId":"This parameter is not currently supported.","ApiId":"The API identifier.","AutoDeploy":"Specifies whether updates to an API automatically trigger a new deployment. The default value is `false` .","ClientCertificateId":"The identifier of a client certificate for a `Stage` . Supported only for WebSocket APIs.","DefaultRouteSettings":"The default route settings for the stage.","DeploymentId":"The deployment identifier for the API stage. Can\'t be updated if `autoDeploy` is enabled.","Description":"The description for the API stage.","RouteSettings":"Route settings for the stage.","StageName":"The stage name. Stage names can contain only alphanumeric characters, hyphens, and underscores, or be `$default` . Maximum length is 128 characters.","StageVariables":"A map that defines the stage variables for a `Stage` . Variable names can have alphanumeric and underscore characters, and the values must match [A-Za-z0-9-._~:/?#&=,]+.","Tags":"The collection of tags. Each tag element is associated with a given resource."}},"AWS::ApiGatewayV2::Stage.AccessLogSettings":{"attributes":{},"description":"Settings for logging access in a stage.","properties":{"DestinationArn":"The ARN of the CloudWatch Logs log group to receive access logs. This parameter is required to enable access logging.","Format":"A single line format of the access logs of data, as specified by selected $context variables. The format must include at least $context.requestId. This parameter is required to enable access logging."}},"AWS::ApiGatewayV2::Stage.RouteSettings":{"attributes":{},"description":"Represents a collection of route settings.","properties":{"DataTraceEnabled":"Specifies whether ( `true` ) or not ( `false` ) data trace logging is enabled for this route. This property affects the log entries pushed to Amazon CloudWatch Logs. Supported only for WebSocket APIs.","DetailedMetricsEnabled":"Specifies whether detailed metrics are enabled.","LoggingLevel":"Specifies the logging level for this route: `INFO` , `ERROR` , or `OFF` . This property affects the log entries pushed to Amazon CloudWatch Logs. Supported only for WebSocket APIs.","ThrottlingBurstLimit":"Specifies the throttling burst limit.","ThrottlingRateLimit":"Specifies the throttling rate limit."}},"AWS::ApiGatewayV2::VpcLink":{"attributes":{"Ref":"`Ref` returns the VPC link\'s ID, such as `abcde1` .","VpcLinkId":"The VPC link ID."},"description":"The `AWS::ApiGatewayV2::VpcLink` resource creates a VPC link. Supported only for HTTP APIs. The VPC link status must transition from `PENDING` to `AVAILABLE` to successfully create a VPC link, which can take up to 10 minutes. To learn more, see [Working with VPC Links for HTTP APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-vpc-links.html) in the *API Gateway Developer Guide* .","properties":{"Name":"The name of the VPC link.","SecurityGroupIds":"A list of security group IDs for the VPC link.","SubnetIds":"A list of subnet IDs to include in the VPC link.","Tags":"The collection of tags. Each tag element is associated with a given resource."}},"AWS::AppConfig::Application":{"attributes":{"Ref":"`Ref` returns the application ID."},"description":"The `AWS::AppConfig::Application` resource creates an application. In AWS AppConfig , an application is simply an organizational construct like a folder. This organizational construct has a relationship with some unit of executable code. For example, you could create an application called MyMobileApp to organize and manage configuration data for a mobile application installed by your users.\\n\\nAWS AppConfig requires that you create resources and deploy a configuration in the following order:\\n\\n- Create an application\\n- Create an environment\\n- Create a configuration profile\\n- Create a deployment strategy\\n- Deploy the configuration\\n\\nFor more information, see [AWS AppConfig](https://docs.aws.amazon.com/appconfig/latest/userguide/what-is-appconfig.html) in the *AWS AppConfig User Guide* .","properties":{"Description":"A description of the application.","Name":"A name for the application.","Tags":"Metadata to assign to the application. Tags help organize and categorize your AWS AppConfig resources. Each tag consists of a key and an optional value, both of which you define."}},"AWS::AppConfig::Application.Tags":{"attributes":{},"description":"Metadata to assign to the application. Tags help organize and categorize your AWS AppConfig resources. Each tag consists of a key and an optional value, both of which you define.","properties":{"Key":"The key-value string map. The valid character set is `[a-zA-Z+-=._:/]` . The tag key can be up to 128 characters and must not start with `aws:` .","Value":"The tag value can be up to 256 characters."}},"AWS::AppConfig::ConfigurationProfile":{"attributes":{"Ref":"`Ref` returns the configuration profile ID."},"description":"The `AWS::AppConfig::ConfigurationProfile` resource creates a configuration profile that enables AWS AppConfig to access the configuration source. Valid configuration sources include AWS Systems Manager (SSM) documents, SSM Parameter Store parameters, and Amazon S3 . A configuration profile includes the following information.\\n\\n- The Uri location of the configuration data.\\n- The AWS Identity and Access Management ( IAM ) role that provides access to the configuration data.\\n- A validator for the configuration data. Available validators include either a JSON Schema or the Amazon Resource Name (ARN) of an AWS Lambda function.\\n\\nAWS AppConfig requires that you create resources and deploy a configuration in the following order:\\n\\n- Create an application\\n- Create an environment\\n- Create a configuration profile\\n- Create a deployment strategy\\n- Deploy the configuration\\n\\nFor more information, see [AWS AppConfig](https://docs.aws.amazon.com/appconfig/latest/userguide/what-is-appconfig.html) in the *AWS AppConfig User Guide* .","properties":{"ApplicationId":"The application ID.","Description":"A description of the configuration profile.","LocationUri":"A URI to locate the configuration. You can specify the following:\\n\\n- For the AWS AppConfig hosted configuration store and for feature flags, specify `hosted` .\\n- For an AWS Systems Manager Parameter Store parameter, specify either the parameter name in the format `ssm-parameter://` or the ARN.\\n- For an AWS CodePipeline pipeline, specify the URI in the following format: `codepipeline` ://.\\n- For an AWS Secrets Manager secret, specify the URI in the following format: `secretsmanager` ://.\\n- For an Amazon S3 object, specify the URI in the following format: `s3:///` . Here is an example: `s3://my-bucket/my-app/us-east-1/my-config.json`\\n- For an SSM document, specify either the document name in the format `ssm-document://` or the Amazon Resource Name (ARN).","Name":"A name for the configuration profile.","RetrievalRoleArn":"The ARN of an IAM role with permission to access the configuration at the specified `LocationUri` .\\n\\n> A retrieval role ARN is not required for configurations stored in the AWS AppConfig hosted configuration store. It is required for all other sources that store your configuration.","Tags":"Metadata to assign to the configuration profile. Tags help organize and categorize your AWS AppConfig resources. Each tag consists of a key and an optional value, both of which you define.","Type":"The type of configurations contained in the profile. AWS AppConfig supports `feature flags` and `freeform` configurations. We recommend you create feature flag configurations to enable or disable new features and freeform configurations to distribute configurations to an application. When calling this API, enter one of the following values for `Type` :\\n\\n`AWS.AppConfig.FeatureFlags`\\n\\n`AWS.Freeform`","Validators":"A list of methods for validating the configuration."}},"AWS::AppConfig::ConfigurationProfile.Tags":{"attributes":{},"description":"Metadata to assign to the configuration profile. Tags help organize and categorize your AWS AppConfig resources. Each tag consists of a key and an optional value, both of which you define.","properties":{"Key":"The key-value string map. The valid character set is `[a-zA-Z+-=._:/]` . The tag key can be up to 128 characters and must not start with `aws:` .","Value":"The tag value can be up to 256 characters."}},"AWS::AppConfig::ConfigurationProfile.Validators":{"attributes":{},"description":"A validator provides a syntactic or semantic check to ensure the configuration that you want to deploy functions as intended. To validate your application configuration data, you provide a schema or an AWS Lambda function that runs against the configuration. The configuration deployment or update can only proceed when the configuration data is valid.","properties":{"Content":"Either the JSON Schema content or the Amazon Resource Name (ARN) of an Lambda function.","Type":"AWS AppConfig supports validators of type `JSON_SCHEMA` and `LAMBDA`"}},"AWS::AppConfig::Deployment":{"attributes":{"Ref":""},"description":"The `AWS::AppConfig::Deployment` resource starts a deployment. Starting a deployment in AWS AppConfig calls the `StartDeployment` API action. This call includes the IDs of the AWS AppConfig application, the environment, the configuration profile, and (optionally) the configuration data version to deploy. The call also includes the ID of the deployment strategy to use, which determines how the configuration data is deployed.\\n\\nAWS AppConfig monitors the distribution to all hosts and reports status. If a distribution fails, then AWS AppConfig rolls back the configuration.\\n\\nAWS AppConfig requires that you create resources and deploy a configuration in the following order:\\n\\n- Create an application\\n- Create an environment\\n- Create a configuration profile\\n- Create a deployment strategy\\n- Deploy the configuration\\n\\nFor more information, see [AWS AppConfig](https://docs.aws.amazon.com/appconfig/latest/userguide/what-is-appconfig.html) in the *AWS AppConfig User Guide* .","properties":{"ApplicationId":"The application ID.","ConfigurationProfileId":"The configuration profile ID.","ConfigurationVersion":"The configuration version to deploy. If deploying an AWS AppConfig hosted configuration version, you can specify either the version number or version label. For all other configurations, you must specify the version number.","DeploymentStrategyId":"The deployment strategy ID.","Description":"A description of the deployment.","EnvironmentId":"The environment ID.","KmsKeyIdentifier":"The AWS KMS key identifier (key ID, key alias, or key ARN). AWS AppConfig uses this ID to encrypt the configuration data using a customer managed key.","Tags":"Metadata to assign to the deployment. Tags help organize and categorize your AWS AppConfig resources. Each tag consists of a key and an optional value, both of which you define."}},"AWS::AppConfig::Deployment.Tags":{"attributes":{},"description":"Metadata to assign to the deployment strategy. Tags help organize and categorize your AWS AppConfig resources. Each tag consists of a key and an optional value, both of which you define.","properties":{"Key":"The key-value string map. The valid character set is `[a-zA-Z+-=._:/]` . The tag key can be up to 128 characters and must not start with `aws:` .","Value":"The tag value can be up to 256 characters."}},"AWS::AppConfig::DeploymentStrategy":{"attributes":{"Ref":"`Ref` returns the deployment strategy ID."},"description":"The `AWS::AppConfig::DeploymentStrategy` resource creates an AWS AppConfig deployment strategy. A deployment strategy defines important criteria for rolling out your configuration to the designated targets. A deployment strategy includes: the overall duration required, a percentage of targets to receive the deployment during each interval, an algorithm that defines how percentage grows, and bake time.\\n\\nAWS AppConfig requires that you create resources and deploy a configuration in the following order:\\n\\n- Create an application\\n- Create an environment\\n- Create a configuration profile\\n- Create a deployment strategy\\n- Deploy the configuration\\n\\nFor more information, see [AWS AppConfig](https://docs.aws.amazon.com/appconfig/latest/userguide/what-is-appconfig.html) in the *AWS AppConfig User Guide* .","properties":{"DeploymentDurationInMinutes":"Total amount of time for a deployment to last.","Description":"A description of the deployment strategy.","FinalBakeTimeInMinutes":"Specifies the amount of time AWS AppConfig monitors for Amazon CloudWatch alarms after the configuration has been deployed to 100% of its targets, before considering the deployment to be complete. If an alarm is triggered during this time, AWS AppConfig rolls back the deployment. You must configure permissions for AWS AppConfig to roll back based on CloudWatch alarms. For more information, see [Configuring permissions for rollback based on Amazon CloudWatch alarms](https://docs.aws.amazon.com/appconfig/latest/userguide/getting-started-with-appconfig-cloudwatch-alarms-permissions.html) in the *AWS AppConfig User Guide* .","GrowthFactor":"The percentage of targets to receive a deployed configuration during each interval.","GrowthType":"The algorithm used to define how percentage grows over time. AWS AppConfig supports the following growth types:\\n\\n*Linear* : For this type, AWS AppConfig processes the deployment by dividing the total number of targets by the value specified for `Step percentage` . For example, a linear deployment that uses a `Step percentage` of 10 deploys the configuration to 10 percent of the hosts. After those deployments are complete, the system deploys the configuration to the next 10 percent. This continues until 100% of the targets have successfully received the configuration.\\n\\n*Exponential* : For this type, AWS AppConfig processes the deployment exponentially using the following formula: `G*(2^N)` . In this formula, `G` is the growth factor specified by the user and `N` is the number of steps until the configuration is deployed to all targets. For example, if you specify a growth factor of 2, then the system rolls out the configuration as follows:\\n\\n`2*(2^0)`\\n\\n`2*(2^1)`\\n\\n`2*(2^2)`\\n\\nExpressed numerically, the deployment rolls out as follows: 2% of the targets, 4% of the targets, 8% of the targets, and continues until the configuration has been deployed to all targets.","Name":"A name for the deployment strategy.","ReplicateTo":"Save the deployment strategy to a Systems Manager (SSM) document.","Tags":"Assigns metadata to an AWS AppConfig resource. Tags help organize and categorize your AWS AppConfig resources. Each tag consists of a key and an optional value, both of which you define. You can specify a maximum of 50 tags for a resource."}},"AWS::AppConfig::DeploymentStrategy.Tags":{"attributes":{},"description":"Metadata to assign to the deployment strategy. Tags help organize and categorize your AWS AppConfig resources. Each tag consists of a key and an optional value, both of which you define.","properties":{"Key":"The key-value string map. The valid character set is `[a-zA-Z+-=._:/]` . The tag key can be up to 128 characters and must not start with `aws:` .","Value":"The tag value can be up to 256 characters."}},"AWS::AppConfig::Environment":{"attributes":{"Ref":"`Ref` returns the environment ID."},"description":"The `AWS::AppConfig::Environment` resource creates an environment, which is a logical deployment group of AWS AppConfig targets, such as applications in a `Beta` or `Production` environment. You define one or more environments for each AWS AppConfig application. You can also define environments for application subcomponents such as the `Web` , `Mobile` and `Back-end` components for your application. You can configure Amazon CloudWatch alarms for each environment. The system monitors alarms during a configuration deployment. If an alarm is triggered, the system rolls back the configuration.\\n\\nAWS AppConfig requires that you create resources and deploy a configuration in the following order:\\n\\n- Create an application\\n- Create an environment\\n- Create a configuration profile\\n- Create a deployment strategy\\n- Deploy the configuration\\n\\nFor more information, see [AWS AppConfig](https://docs.aws.amazon.com/appconfig/latest/userguide/what-is-appconfig.html) in the *AWS AppConfig User Guide* .","properties":{"ApplicationId":"The application ID.","Description":"A description of the environment.","Monitors":"Amazon CloudWatch alarms to monitor during the deployment process.","Name":"A name for the environment.","Tags":"Metadata to assign to the environment. Tags help organize and categorize your AWS AppConfig resources. Each tag consists of a key and an optional value, both of which you define."}},"AWS::AppConfig::Environment.Monitors":{"attributes":{},"description":"Amazon CloudWatch alarms to monitor during the deployment process.","properties":{"AlarmArn":"Amazon Resource Name (ARN) of the Amazon CloudWatch alarm.","AlarmRoleArn":"ARN of an AWS Identity and Access Management (IAM) role for AWS AppConfig to monitor `AlarmArn` ."}},"AWS::AppConfig::Environment.Tags":{"attributes":{},"description":"Metadata to assign to the environment. Tags help organize and categorize your AWS AppConfig resources. Each tag consists of a key and an optional value, both of which you define.","properties":{"Key":"The key-value string map. The valid character set is `[a-zA-Z+-=._:/]` . The tag key can be up to 128 characters and must not start with `aws:` .","Value":"The tag value can be up to 256 characters."}},"AWS::AppConfig::Extension":{"attributes":{"Arn":"The system-generated Amazon Resource Name (ARN) for the extension.","Id":"The system-generated ID of the extension.","Ref":"`Ref` returns information about the extension.","VersionNumber":"The extension version number."},"description":"Creates an AWS AppConfig extension. An extension augments your ability to inject logic or behavior at different points during the AWS AppConfig workflow of creating or deploying a configuration.\\n\\nYou can create your own extensions or use the AWS authored extensions provided by AWS AppConfig . For an AWS AppConfig extension that uses AWS Lambda , you must create a Lambda function to perform any computation and processing defined in the extension. If you plan to create custom versions of the AWS authored notification extensions, you only need to specify an Amazon Resource Name (ARN) in the `Uri` field for the new extension version.\\n\\n- For a custom EventBridge notification extension, enter the ARN of the EventBridge default events in the `Uri` field.\\n- For a custom Amazon SNS notification extension, enter the ARN of an Amazon SNS topic in the `Uri` field.\\n- For a custom Amazon SQS notification extension, enter the ARN of an Amazon SQS message queue in the `Uri` field.\\n\\nFor more information about extensions, see [Working with AWS AppConfig extensions](https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions.html) in the *AWS AppConfig User Guide* .","properties":{"Actions":"The actions defined in the extension.","Description":"Information about the extension.","LatestVersionNumber":"You can omit this field when you create an extension. When you create a new version, specify the most recent current version number. For example, you create version 3, enter 2 for this field.","Name":"A name for the extension. Each extension name in your account must be unique. Extension versions use the same name.","Parameters":"The parameters accepted by the extension. You specify parameter values when you associate the extension to an AWS AppConfig resource by using the `CreateExtensionAssociation` API action. For AWS Lambda extension actions, these parameters are included in the Lambda request object.","Tags":"Adds one or more tags for the specified extension. Tags are metadata that help you categorize resources in different ways, for example, by purpose, owner, or environment. Each tag consists of a key and an optional value, both of which you define."}},"AWS::AppConfig::Extension.Parameter":{"attributes":{},"description":"A value such as an Amazon Resource Name (ARN) or an Amazon Simple Notification Service topic entered in an extension when invoked. Parameter values are specified in an extension association. For more information about extensions, see [Working with AWS AppConfig extensions](https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions.html) in the *AWS AppConfig User Guide* .","properties":{"Description":"Information about the parameter.","Required":"A parameter value must be specified in the extension association."}},"AWS::AppConfig::ExtensionAssociation":{"attributes":{"Arn":"The ARN of the extension defined in the association.","ExtensionArn":"The ARN of the extension defined in the association.","Id":"The system-generated ID for the association.","Ref":"`Ref` returns information about the extension association.","ResourceArn":"The ARNs of applications, configuration profiles, or environments defined in the association."},"description":"When you create an extension or configure an AWS authored extension, you associate the extension with an AWS AppConfig application, environment, or configuration profile. For example, you can choose to run the `AWS AppConfig deployment events to Amazon SNS` AWS authored extension and receive notifications on an Amazon SNS topic anytime a configuration deployment is started for a specific application. Defining which extension to associate with an AWS AppConfig resource is called an *extension association* . An extension association is a specified relationship between an extension and an AWS AppConfig resource, such as an application or a configuration profile. For more information about extensions and associations, see [Working with AWS AppConfig extensions](https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions.html) in the *AWS AppConfig User Guide* .","properties":{"ExtensionIdentifier":"The name, the ID, or the Amazon Resource Name (ARN) of the extension.","ExtensionVersionNumber":"The version number of the extension. If not specified, AWS AppConfig uses the maximum version of the extension.","Parameters":"The parameter names and values defined in the extensions. Extension parameters marked `Required` must be entered for this field.","ResourceIdentifier":"The ARN of an application, configuration profile, or environment.","Tags":"Adds one or more tags for the specified extension association. Tags are metadata that help you categorize resources in different ways, for example, by purpose, owner, or environment. Each tag consists of a key and an optional value, both of which you define."}},"AWS::AppConfig::HostedConfigurationVersion":{"attributes":{"Ref":"`Ref` returns the version number."},"description":"Create a new configuration in the AWS AppConfig hosted configuration store. Configurations must be 1 MB or smaller. The AWS AppConfig hosted configuration store provides the following benefits over other configuration store options.\\n\\n- You don\'t need to set up and configure other services such as Amazon Simple Storage Service ( Amazon S3 ) or Parameter Store.\\n- You don\'t need to configure AWS Identity and Access Management ( IAM ) permissions to use the configuration store.\\n- You can store configurations in any content type.\\n- There is no cost to use the store.\\n- You can create a configuration and add it to the store when you create a configuration profile.","properties":{"ApplicationId":"The application ID.","ConfigurationProfileId":"The configuration profile ID.","Content":"The content of the configuration or the configuration data.","ContentType":"A standard MIME type describing the format of the configuration content. For more information, see [Content-Type](https://docs.aws.amazon.com/https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17) .","Description":"A description of the configuration.","LatestVersionNumber":"An optional locking token used to prevent race conditions from overwriting configuration updates when creating a new version. To ensure your data is not overwritten when creating multiple hosted configuration versions in rapid succession, specify the version number of the latest hosted configuration version.","VersionLabel":"A user-defined label for an AWS AppConfig hosted configuration version."}},"AWS::AppFlow::Connector":{"attributes":{"ConnectorArn":"","Ref":""},"description":"Creates a new connector profile associated with your AWS account . There is a soft quota of 100 connector profiles per AWS account . If you need more connector profiles than this quota allows, you can submit a request to the Amazon AppFlow team through the Amazon AppFlow support channel. In each connector profile that you create, you can provide the credentials and properties for only one connector.","properties":{"ConnectorLabel":"The label used for registering the connector.","ConnectorProvisioningConfig":"The configuration required for registering the connector.","ConnectorProvisioningType":"The provisioning type used to register the connector.","Description":"A description about the connector runtime setting."}},"AWS::AppFlow::Connector.ConnectorProvisioningConfig":{"attributes":{},"description":"Contains information about the configuration of the connector being registered.","properties":{"Lambda":"Contains information about the configuration of the lambda which is being registered as the connector."}},"AWS::AppFlow::Connector.LambdaConnectorProvisioningConfig":{"attributes":{},"description":"Contains information about the configuration of the lambda which is being registered as the connector.","properties":{"LambdaArn":"Lambda ARN of the connector being registered."}},"AWS::AppFlow::ConnectorProfile":{"attributes":{"ConnectorProfileArn":"The Amazon Resource Name (ARN) of the connector profile.","CredentialsArn":"The Amazon Resource Name (ARN) of the connector profile credentials.","Ref":"`Ref` returns the connector profile name. For example:\\n\\n`{ \\"Ref\\": \\"myConnectorProfile\\" }`"},"description":"The `AWS::AppFlow::ConnectorProfile` resource is an Amazon AppFlow resource type that specifies the configuration profile for an instance of a connector. This includes the provided name, credentials ARN, connection-mode, and so on. The fields that are common to all types of connector profiles are explicitly specified under the `Properties` field. The rest of the connector-specific properties are specified under `Properties/ConnectorProfileConfig` .\\n\\n> If you want to use AWS CloudFormation to create a connector profile for connectors that implement OAuth (such as Salesforce, Slack, Zendesk, and Google Analytics), you must fetch the access and refresh tokens. You can do this by implementing your own UI for OAuth, or by retrieving the tokens from elsewhere. Alternatively, you can use the Amazon AppFlow console to create the connector profile, and then use that connector profile in the flow creation CloudFormation template.","properties":{"ConnectionMode":"Indicates the connection mode and if it is public or private.","ConnectorLabel":"The label for the connector profile being created.","ConnectorProfileConfig":"Defines the connector-specific configuration and credentials.","ConnectorProfileName":"The name of the connector profile. The name is unique for each `ConnectorProfile` in the AWS account .","ConnectorType":"The type of connector, such as Salesforce, Amplitude, and so on.","KMSArn":"The ARN (Amazon Resource Name) of the Key Management Service (KMS) key you provide for encryption. This is required if you do not want to use the Amazon AppFlow-managed KMS key. If you don\'t provide anything here, Amazon AppFlow uses the Amazon AppFlow-managed KMS key."}},"AWS::AppFlow::ConnectorProfile.AmplitudeConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific credentials required when using Amplitude.","properties":{"ApiKey":"A unique alphanumeric identifier used to authenticate a user, developer, or calling program to your API.","SecretKey":"The Secret Access Key portion of the credentials."}},"AWS::AppFlow::ConnectorProfile.ApiKeyCredentials":{"attributes":{},"description":"The API key credentials required for API key authentication.","properties":{"ApiKey":"The API key required for API key authentication.","ApiSecretKey":"The API secret key required for API key authentication."}},"AWS::AppFlow::ConnectorProfile.BasicAuthCredentials":{"attributes":{},"description":"The basic auth credentials required for basic authentication.","properties":{"Password":"The password to use to connect to a resource.","Username":"The username to use to connect to a resource."}},"AWS::AppFlow::ConnectorProfile.ConnectorOAuthRequest":{"attributes":{},"description":"Used by select connectors for which the OAuth workflow is supported, such as Salesforce, Google Analytics, Marketo, Zendesk, and Slack.","properties":{"AuthCode":"The code provided by the connector when it has been authenticated via the connected app.","RedirectUri":"The URL to which the authentication server redirects the browser after authorization has been granted."}},"AWS::AppFlow::ConnectorProfile.ConnectorProfileConfig":{"attributes":{},"description":"Defines the connector-specific configuration and credentials for the connector profile.","properties":{"ConnectorProfileCredentials":"The connector-specific credentials required by each connector.","ConnectorProfileProperties":"The connector-specific properties of the profile configuration."}},"AWS::AppFlow::ConnectorProfile.ConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific credentials required by a connector.","properties":{"Amplitude":"The connector-specific credentials required when using Amplitude.","CustomConnector":"The connector-specific profile credentials that are required when using the custom connector.","Datadog":"The connector-specific credentials required when using Datadog.","Dynatrace":"The connector-specific credentials required when using Dynatrace.","GoogleAnalytics":"The connector-specific credentials required when using Google Analytics.","InforNexus":"The connector-specific credentials required when using Infor Nexus.","Marketo":"The connector-specific credentials required when using Marketo.","Pardot":"","Redshift":"The connector-specific credentials required when using Amazon Redshift.","SAPOData":"The connector-specific profile credentials required when using SAPOData.","Salesforce":"The connector-specific credentials required when using Salesforce.","ServiceNow":"The connector-specific credentials required when using ServiceNow.","Singular":"The connector-specific credentials required when using Singular.","Slack":"The connector-specific credentials required when using Slack.","Snowflake":"The connector-specific credentials required when using Snowflake.","Trendmicro":"The connector-specific credentials required when using Trend Micro.","Veeva":"The connector-specific credentials required when using Veeva.","Zendesk":"The connector-specific credentials required when using Zendesk."}},"AWS::AppFlow::ConnectorProfile.ConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required by each connector.","properties":{"CustomConnector":"The properties required by the custom connector.","Datadog":"The connector-specific properties required by Datadog.","Dynatrace":"The connector-specific properties required by Dynatrace.","InforNexus":"The connector-specific properties required by Infor Nexus.","Marketo":"The connector-specific properties required by Marketo.","Pardot":"","Redshift":"The connector-specific properties required by Amazon Redshift.","SAPOData":"The connector-specific profile properties required when using SAPOData.","Salesforce":"The connector-specific properties required by Salesforce.","ServiceNow":"The connector-specific properties required by serviceNow.","Slack":"The connector-specific properties required by Slack.","Snowflake":"The connector-specific properties required by Snowflake.","Veeva":"The connector-specific properties required by Veeva.","Zendesk":"The connector-specific properties required by Zendesk."}},"AWS::AppFlow::ConnectorProfile.CustomAuthCredentials":{"attributes":{},"description":"The custom credentials required for custom authentication.","properties":{"CredentialsMap":"A map that holds custom authentication credentials.","CustomAuthenticationType":"The custom authentication type that the connector uses."}},"AWS::AppFlow::ConnectorProfile.CustomConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials that are required when using the custom connector.","properties":{"ApiKey":"The API keys required for the authentication of the user.","AuthenticationType":"The authentication type that the custom connector uses for authenticating while creating a connector profile.","Basic":"The basic credentials that are required for the authentication of the user.","Custom":"If the connector uses the custom authentication mechanism, this holds the required credentials.","Oauth2":"The OAuth 2.0 credentials required for the authentication of the user."}},"AWS::AppFlow::ConnectorProfile.CustomConnectorProfileProperties":{"attributes":{},"description":"The profile properties required by the custom connector.","properties":{"OAuth2Properties":"The OAuth 2.0 properties required for OAuth 2.0 authentication.","ProfileProperties":"A map of properties that are required to create a profile for the custom connector."}},"AWS::AppFlow::ConnectorProfile.DatadogConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific credentials required by Datadog.","properties":{"ApiKey":"A unique alphanumeric identifier used to authenticate a user, developer, or calling program to your API.","ApplicationKey":"Application keys, in conjunction with your API key, give you full access to Datadog’s programmatic API. Application keys are associated with the user account that created them. The application key is used to log all requests made to the API."}},"AWS::AppFlow::ConnectorProfile.DatadogConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required by Datadog.","properties":{"InstanceUrl":"The location of the Datadog resource."}},"AWS::AppFlow::ConnectorProfile.DynatraceConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required by Dynatrace.","properties":{"ApiToken":"The API tokens used by Dynatrace API to authenticate various API calls."}},"AWS::AppFlow::ConnectorProfile.DynatraceConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required by Dynatrace.","properties":{"InstanceUrl":"The location of the Dynatrace resource."}},"AWS::AppFlow::ConnectorProfile.GoogleAnalyticsConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required by Google Analytics.","properties":{"AccessToken":"The credentials used to access protected Google Analytics resources.","ClientId":"The identifier for the desired client.","ClientSecret":"The client secret used by the OAuth client to authenticate to the authorization server.","ConnectorOAuthRequest":"Used by select connectors for which the OAuth workflow is supported, such as Salesforce, Google Analytics, Marketo, Zendesk, and Slack.","RefreshToken":"The credentials used to acquire new access tokens. This is required only for OAuth2 access tokens, and is not required for OAuth1 access tokens."}},"AWS::AppFlow::ConnectorProfile.InforNexusConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required by Infor Nexus.","properties":{"AccessKeyId":"The Access Key portion of the credentials.","Datakey":"The encryption keys used to encrypt data.","SecretAccessKey":"The secret key used to sign requests.","UserId":"The identifier for the user."}},"AWS::AppFlow::ConnectorProfile.InforNexusConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required by Infor Nexus.","properties":{"InstanceUrl":"The location of the Infor Nexus resource."}},"AWS::AppFlow::ConnectorProfile.MarketoConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required by Marketo.","properties":{"AccessToken":"The credentials used to access protected Marketo resources.","ClientId":"The identifier for the desired client.","ClientSecret":"The client secret used by the OAuth client to authenticate to the authorization server.","ConnectorOAuthRequest":"Used by select connectors for which the OAuth workflow is supported, such as Salesforce, Google Analytics, Marketo, Zendesk, and Slack."}},"AWS::AppFlow::ConnectorProfile.MarketoConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required when using Marketo.","properties":{"InstanceUrl":"The location of the Marketo resource."}},"AWS::AppFlow::ConnectorProfile.OAuth2Credentials":{"attributes":{},"description":"The OAuth 2.0 credentials required for OAuth 2.0 authentication.","properties":{"AccessToken":"The access token used to access the connector on your behalf.","ClientId":"The identifier for the desired client.","ClientSecret":"The client secret used by the OAuth client to authenticate to the authorization server.","OAuthRequest":"","RefreshToken":"The refresh token used to refresh an expired access token."}},"AWS::AppFlow::ConnectorProfile.OAuth2Properties":{"attributes":{},"description":"The OAuth 2.0 properties required for OAuth 2.0 authentication.","properties":{"OAuth2GrantType":"The OAuth 2.0 grant type used by connector for OAuth 2.0 authentication.","TokenUrl":"The token URL required for OAuth 2.0 authentication.","TokenUrlCustomProperties":"Associates your token URL with a map of properties that you define. Use this parameter to provide any additional details that the connector requires to authenticate your request."}},"AWS::AppFlow::ConnectorProfile.OAuthCredentials":{"attributes":{},"description":"The OAuth credentials required for OAuth type authentication.","properties":{"AccessToken":"The access token used to access protected SAPOData resources.","ClientId":"The identifier for the desired client.","ClientSecret":"The client secret used by the OAuth client to authenticate to the authorization server.","ConnectorOAuthRequest":"","RefreshToken":"The refresh token used to refresh expired access token."}},"AWS::AppFlow::ConnectorProfile.OAuthProperties":{"attributes":{},"description":"The OAuth properties required for OAuth type authentication.","properties":{"AuthCodeUrl":"The authorization code url required to redirect to SAP Login Page to fetch authorization code for OAuth type authentication.","OAuthScopes":"The OAuth scopes required for OAuth type authentication.","TokenUrl":"The token url required to fetch access/refresh tokens using authorization code and also to refresh expired access token using refresh token."}},"AWS::AppFlow::ConnectorProfile.PardotConnectorProfileCredentials":{"attributes":{},"description":"","properties":{"AccessToken":"","ClientCredentialsArn":"","ConnectorOAuthRequest":"","RefreshToken":""}},"AWS::AppFlow::ConnectorProfile.PardotConnectorProfileProperties":{"attributes":{},"description":"","properties":{"BusinessUnitId":"","InstanceUrl":"","IsSandboxEnvironment":""}},"AWS::AppFlow::ConnectorProfile.RedshiftConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required when using Amazon Redshift.","properties":{"Password":"The password that corresponds to the user name.","Username":"The name of the user."}},"AWS::AppFlow::ConnectorProfile.RedshiftConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties when using Amazon Redshift.","properties":{"BucketName":"A name for the associated Amazon S3 bucket.","BucketPrefix":"The object key for the destination bucket in which Amazon AppFlow places the files.","ClusterIdentifier":"","DataApiRoleArn":"","DatabaseName":"","DatabaseUrl":"The JDBC URL of the Amazon Redshift cluster.","IsRedshiftServerless":"","RoleArn":"The Amazon Resource Name (ARN) of IAM role that grants Amazon Redshift read-only access to Amazon S3. For more information, and for the polices that you attach to this role, see [Allow Amazon Redshift to access your Amazon AppFlow data in Amazon S3](https://docs.aws.amazon.com/appflow/latest/userguide/security_iam_service-role-policies.html#redshift-access-s3) .","WorkgroupName":""}},"AWS::AppFlow::ConnectorProfile.SAPODataConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required when using SAPOData.","properties":{"BasicAuthCredentials":"The SAPOData basic authentication credentials.","OAuthCredentials":"The SAPOData OAuth type authentication credentials."}},"AWS::AppFlow::ConnectorProfile.SAPODataConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required when using SAPOData.","properties":{"ApplicationHostUrl":"The location of the SAPOData resource.","ApplicationServicePath":"The application path to catalog service.","ClientNumber":"The client number for the client creating the connection.","DisableSSO":"","LogonLanguage":"The logon language of SAPOData instance.","OAuthProperties":"The SAPOData OAuth properties required for OAuth type authentication.","PortNumber":"The port number of the SAPOData instance.","PrivateLinkServiceName":"The SAPOData Private Link service name to be used for private data transfers."}},"AWS::AppFlow::ConnectorProfile.SalesforceConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required when using Salesforce.","properties":{"AccessToken":"The credentials used to access protected Salesforce resources.","ClientCredentialsArn":"The secret manager ARN, which contains the client ID and client secret of the connected app.","ConnectorOAuthRequest":"Used by select connectors for which the OAuth workflow is supported, such as Salesforce, Google Analytics, Marketo, Zendesk, and Slack.","JwtToken":"","OAuth2GrantType":"","RefreshToken":"The credentials used to acquire new access tokens."}},"AWS::AppFlow::ConnectorProfile.SalesforceConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required when using Salesforce.","properties":{"InstanceUrl":"The location of the Salesforce resource.","isSandboxEnvironment":"Indicates whether the connector profile applies to a sandbox or production environment.","usePrivateLinkForMetadataAndAuthorization":""}},"AWS::AppFlow::ConnectorProfile.ServiceNowConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required when using ServiceNow.","properties":{"Password":"The password that corresponds to the user name.","Username":"The name of the user."}},"AWS::AppFlow::ConnectorProfile.ServiceNowConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required when using ServiceNow.","properties":{"InstanceUrl":"The location of the ServiceNow resource."}},"AWS::AppFlow::ConnectorProfile.SingularConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required when using Singular.","properties":{"ApiKey":"A unique alphanumeric identifier used to authenticate a user, developer, or calling program to your API."}},"AWS::AppFlow::ConnectorProfile.SlackConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required when using Slack.","properties":{"AccessToken":"The credentials used to access protected Slack resources.","ClientId":"The identifier for the client.","ClientSecret":"The client secret used by the OAuth client to authenticate to the authorization server.","ConnectorOAuthRequest":"Used by select connectors for which the OAuth workflow is supported, such as Salesforce, Google Analytics, Marketo, Zendesk, and Slack."}},"AWS::AppFlow::ConnectorProfile.SlackConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required when using Slack.","properties":{"InstanceUrl":"The location of the Slack resource."}},"AWS::AppFlow::ConnectorProfile.SnowflakeConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required when using Snowflake.","properties":{"Password":"The password that corresponds to the user name.","Username":"The name of the user."}},"AWS::AppFlow::ConnectorProfile.SnowflakeConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required when using Snowflake.","properties":{"AccountName":"The name of the account.","BucketName":"The name of the Amazon S3 bucket associated with Snowflake.","BucketPrefix":"The bucket path that refers to the Amazon S3 bucket associated with Snowflake.","PrivateLinkServiceName":"The Snowflake Private Link service name to be used for private data transfers.","Region":"The AWS Region of the Snowflake account.","Stage":"The name of the Amazon S3 stage that was created while setting up an Amazon S3 stage in the Snowflake account. This is written in the following format: < Database>< Schema>.","Warehouse":"The name of the Snowflake warehouse."}},"AWS::AppFlow::ConnectorProfile.TrendmicroConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required when using Trend Micro.","properties":{"ApiSecretKey":"The Secret Access Key portion of the credentials."}},"AWS::AppFlow::ConnectorProfile.VeevaConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required when using Veeva.","properties":{"Password":"The password that corresponds to the user name.","Username":"The name of the user."}},"AWS::AppFlow::ConnectorProfile.VeevaConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required when using Veeva.","properties":{"InstanceUrl":"The location of the Veeva resource."}},"AWS::AppFlow::ConnectorProfile.ZendeskConnectorProfileCredentials":{"attributes":{},"description":"The connector-specific profile credentials required when using Zendesk.","properties":{"AccessToken":"The credentials used to access protected Zendesk resources.","ClientId":"The identifier for the desired client.","ClientSecret":"The client secret used by the OAuth client to authenticate to the authorization server.","ConnectorOAuthRequest":"Used by select connectors for which the OAuth workflow is supported, such as Salesforce, Google Analytics, Marketo, Zendesk, and Slack."}},"AWS::AppFlow::ConnectorProfile.ZendeskConnectorProfileProperties":{"attributes":{},"description":"The connector-specific profile properties required when using Zendesk.","properties":{"InstanceUrl":"The location of the Zendesk resource."}},"AWS::AppFlow::Flow":{"attributes":{"FlowArn":"The flow\'s Amazon Resource Name (ARN).","Ref":"`Ref` returns the flow name. For example:\\n\\n`{ \\"Ref\\": \\"myFlowName\\" }`"},"description":"The `AWS::AppFlow::Flow` resource is an Amazon AppFlow resource type that specifies a new flow.\\n\\n> If you want to use AWS CloudFormation to create a connector profile for connectors that implement OAuth (such as Salesforce, Slack, Zendesk, and Google Analytics), you must fetch the access and refresh tokens. You can do this by implementing your own UI for OAuth, or by retrieving the tokens from elsewhere. Alternatively, you can use the Amazon AppFlow console to create the connector profile, and then use that connector profile in the flow creation CloudFormation template.","properties":{"Description":"A user-entered description of the flow.","DestinationFlowConfigList":"The configuration that controls how Amazon AppFlow places data in the destination connector.","FlowName":"The specified name of the flow. Spaces are not allowed. Use underscores (_) or hyphens (-) only.","FlowStatus":"Sets the status of the flow. You can specify one of the following values:\\n\\n- **Active** - The flow runs based on the trigger settings that you defined. Active scheduled flows run as scheduled, and active event-triggered flows run when the specified change event occurs. However, active on-demand flows run only when you manually start them by using Amazon AppFlow.\\n- **Suspended** - You can use this option to deactivate an active flow. Scheduled and event-triggered flows will cease to run until you reactive them. This value only affects scheduled and event-triggered flows. It has no effect for on-demand flows.\\n\\nIf you omit the FlowStatus parameter, Amazon AppFlow creates the flow with a default status. The default status for on-demand flows is Active. The default status for scheduled and event-triggered flows is Draft, which means they’re not yet active.","KMSArn":"The ARN (Amazon Resource Name) of the Key Management Service (KMS) key you provide for encryption. This is required if you do not want to use the Amazon AppFlow-managed KMS key. If you don\'t provide anything here, Amazon AppFlow uses the Amazon AppFlow-managed KMS key.","MetadataCatalogConfig":"","SourceFlowConfig":"Contains information about the configuration of the source connector used in the flow.","Tags":"The tags used to organize, track, or control access for your flow.","Tasks":"A list of tasks that Amazon AppFlow performs while transferring the data in the flow run.","TriggerConfig":"The trigger settings that determine how and when Amazon AppFlow runs the specified flow."}},"AWS::AppFlow::Flow.AggregationConfig":{"attributes":{},"description":"The aggregation settings that you can use to customize the output format of your flow data.","properties":{"AggregationType":"Specifies whether Amazon AppFlow aggregates the flow records into a single file, or leave them unaggregated.","TargetFileSize":""}},"AWS::AppFlow::Flow.AmplitudeSourceProperties":{"attributes":{},"description":"The properties that are applied when Amplitude is being used as a source.","properties":{"Object":"The object specified in the Amplitude flow source."}},"AWS::AppFlow::Flow.ConnectorOperator":{"attributes":{},"description":"The operation to be performed on the provided source fields.","properties":{"Amplitude":"The operation to be performed on the provided Amplitude source fields.","CustomConnector":"Operators supported by the custom connector.","Datadog":"The operation to be performed on the provided Datadog source fields.","Dynatrace":"The operation to be performed on the provided Dynatrace source fields.","GoogleAnalytics":"The operation to be performed on the provided Google Analytics source fields.","InforNexus":"The operation to be performed on the provided Infor Nexus source fields.","Marketo":"The operation to be performed on the provided Marketo source fields.","Pardot":"","S3":"The operation to be performed on the provided Amazon S3 source fields.","SAPOData":"The operation to be performed on the provided SAPOData source fields.","Salesforce":"The operation to be performed on the provided Salesforce source fields.","ServiceNow":"The operation to be performed on the provided ServiceNow source fields.","Singular":"The operation to be performed on the provided Singular source fields.","Slack":"The operation to be performed on the provided Slack source fields.","Trendmicro":"The operation to be performed on the provided Trend Micro source fields.","Veeva":"The operation to be performed on the provided Veeva source fields.","Zendesk":"The operation to be performed on the provided Zendesk source fields."}},"AWS::AppFlow::Flow.CustomConnectorDestinationProperties":{"attributes":{},"description":"The properties that are applied when the custom connector is being used as a destination.","properties":{"CustomProperties":"The custom properties that are specific to the connector when it\'s used as a destination in the flow.","EntityName":"The entity specified in the custom connector as a destination in the flow.","ErrorHandlingConfig":"The settings that determine how Amazon AppFlow handles an error when placing data in the custom connector as destination.","IdFieldNames":"The name of the field that Amazon AppFlow uses as an ID when performing a write operation such as update, delete, or upsert.","WriteOperationType":"Specifies the type of write operation to be performed in the custom connector when it\'s used as destination."}},"AWS::AppFlow::Flow.CustomConnectorSourceProperties":{"attributes":{},"description":"The properties that are applied when the custom connector is being used as a source.","properties":{"CustomProperties":"Custom properties that are required to use the custom connector as a source.","DataTransferApi":"","EntityName":"The entity specified in the custom connector as a source in the flow."}},"AWS::AppFlow::Flow.DataTransferApi":{"attributes":{},"description":"","properties":{"Name":"","Type":""}},"AWS::AppFlow::Flow.DatadogSourceProperties":{"attributes":{},"description":"The properties that are applied when Datadog is being used as a source.","properties":{"Object":"The object specified in the Datadog flow source."}},"AWS::AppFlow::Flow.DestinationConnectorProperties":{"attributes":{},"description":"This stores the information that is required to query a particular connector.","properties":{"CustomConnector":"The properties that are required to query the custom Connector.","EventBridge":"The properties required to query Amazon EventBridge.","LookoutMetrics":"The properties required to query Amazon Lookout for Metrics.","Marketo":"The properties required to query Marketo.","Redshift":"The properties required to query Amazon Redshift.","S3":"The properties required to query Amazon S3.","SAPOData":"The properties required to query SAPOData.","Salesforce":"The properties required to query Salesforce.","Snowflake":"The properties required to query Snowflake.","Upsolver":"The properties required to query Upsolver.","Zendesk":"The properties required to query Zendesk."}},"AWS::AppFlow::Flow.DestinationFlowConfig":{"attributes":{},"description":"Contains information about the configuration of destination connectors present in the flow.","properties":{"ApiVersion":"The API version that the destination connector uses.","ConnectorProfileName":"The name of the connector profile. This name must be unique for each connector profile in the AWS account .","ConnectorType":"The type of destination connector, such as Sales force, Amazon S3, and so on.\\n\\n*Allowed Values* : `EventBridge | Redshift | S3 | Salesforce | Snowflake`","DestinationConnectorProperties":"This stores the information that is required to query a particular connector."}},"AWS::AppFlow::Flow.DynatraceSourceProperties":{"attributes":{},"description":"The properties that are applied when Dynatrace is being used as a source.","properties":{"Object":"The object specified in the Dynatrace flow source."}},"AWS::AppFlow::Flow.ErrorHandlingConfig":{"attributes":{},"description":"The settings that determine how Amazon AppFlow handles an error when placing data in the destination. For example, this setting would determine if the flow should fail after one insertion error, or continue and attempt to insert every record regardless of the initial failure. `ErrorHandlingConfig` is a part of the destination connector details.","properties":{"BucketName":"Specifies the name of the Amazon S3 bucket.","BucketPrefix":"Specifies the Amazon S3 bucket prefix.","FailOnFirstError":"Specifies if the flow should fail after the first instance of a failure when attempting to place data in the destination."}},"AWS::AppFlow::Flow.EventBridgeDestinationProperties":{"attributes":{},"description":"The properties that are applied when Amazon EventBridge is being used as a destination.","properties":{"ErrorHandlingConfig":"The object specified in the Amplitude flow source.","Object":"The object specified in the Amazon EventBridge flow destination."}},"AWS::AppFlow::Flow.GlueDataCatalog":{"attributes":{},"description":"","properties":{"DatabaseName":"","RoleArn":"","TablePrefix":""}},"AWS::AppFlow::Flow.GoogleAnalyticsSourceProperties":{"attributes":{},"description":"The properties that are applied when Google Analytics is being used as a source.","properties":{"Object":"The object specified in the Google Analytics flow source."}},"AWS::AppFlow::Flow.IncrementalPullConfig":{"attributes":{},"description":"Specifies the configuration used when importing incremental records from the source.","properties":{"DatetimeTypeFieldName":"A field that specifies the date time or timestamp field as the criteria to use when importing incremental records from the source."}},"AWS::AppFlow::Flow.InforNexusSourceProperties":{"attributes":{},"description":"The properties that are applied when Infor Nexus is being used as a source.","properties":{"Object":"The object specified in the Infor Nexus flow source."}},"AWS::AppFlow::Flow.LookoutMetricsDestinationProperties":{"attributes":{},"description":"The properties that are applied when Amazon Lookout for Metrics is used as a destination.","properties":{"Object":"The object specified in the Amazon Lookout for Metrics flow destination."}},"AWS::AppFlow::Flow.MarketoDestinationProperties":{"attributes":{},"description":"The properties that Amazon AppFlow applies when you use Marketo as a flow destination.","properties":{"ErrorHandlingConfig":"The settings that determine how Amazon AppFlow handles an error when placing data in the destination. For example, this setting would determine if the flow should fail after one insertion error, or continue and attempt to insert every record regardless of the initial failure. `ErrorHandlingConfig` is a part of the destination connector details.","Object":"The object specified in the Marketo flow destination."}},"AWS::AppFlow::Flow.MarketoSourceProperties":{"attributes":{},"description":"The properties that are applied when Marketo is being used as a source.","properties":{"Object":"The object specified in the Marketo flow source."}},"AWS::AppFlow::Flow.MetadataCatalogConfig":{"attributes":{},"description":"","properties":{"GlueDataCatalog":""}},"AWS::AppFlow::Flow.PardotSourceProperties":{"attributes":{},"description":"","properties":{"Object":""}},"AWS::AppFlow::Flow.PrefixConfig":{"attributes":{},"description":"Specifies elements that Amazon AppFlow includes in the file and folder names in the flow destination.","properties":{"PathPrefixHierarchy":"","PrefixFormat":"Determines the level of granularity for the date and time that\'s included in the prefix.","PrefixType":"Determines the format of the prefix, and whether it applies to the file name, file path, or both."}},"AWS::AppFlow::Flow.RedshiftDestinationProperties":{"attributes":{},"description":"The properties that are applied when Amazon Redshift is being used as a destination.","properties":{"BucketPrefix":"The object key for the bucket in which Amazon AppFlow places the destination files.","ErrorHandlingConfig":"The settings that determine how Amazon AppFlow handles an error when placing data in the Amazon Redshift destination. For example, this setting would determine if the flow should fail after one insertion error, or continue and attempt to insert every record regardless of the initial failure. `ErrorHandlingConfig` is a part of the destination connector details.","IntermediateBucketName":"The intermediate bucket that Amazon AppFlow uses when moving data into Amazon Redshift.","Object":"The object specified in the Amazon Redshift flow destination."}},"AWS::AppFlow::Flow.S3DestinationProperties":{"attributes":{},"description":"The properties that are applied when Amazon S3 is used as a destination.","properties":{"BucketName":"The Amazon S3 bucket name in which Amazon AppFlow places the transferred data.","BucketPrefix":"The object key for the destination bucket in which Amazon AppFlow places the files.","S3OutputFormatConfig":"The configuration that determines how Amazon AppFlow should format the flow output data when Amazon S3 is used as the destination."}},"AWS::AppFlow::Flow.S3InputFormatConfig":{"attributes":{},"description":"When you use Amazon S3 as the source, the configuration format that you provide the flow input data.","properties":{"S3InputFileType":"The file type that Amazon AppFlow gets from your Amazon S3 bucket."}},"AWS::AppFlow::Flow.S3OutputFormatConfig":{"attributes":{},"description":"The configuration that determines how Amazon AppFlow should format the flow output data when Amazon S3 is used as the destination.","properties":{"AggregationConfig":"The aggregation settings that you can use to customize the output format of your flow data.","FileType":"Indicates the file type that Amazon AppFlow places in the Amazon S3 bucket.","PrefixConfig":"Determines the prefix that Amazon AppFlow applies to the folder name in the Amazon S3 bucket. You can name folders according to the flow frequency and date.","PreserveSourceDataTyping":""}},"AWS::AppFlow::Flow.S3SourceProperties":{"attributes":{},"description":"The properties that are applied when Amazon S3 is being used as the flow source.","properties":{"BucketName":"The Amazon S3 bucket name where the source files are stored.","BucketPrefix":"The object key for the Amazon S3 bucket in which the source files are stored.","S3InputFormatConfig":"When you use Amazon S3 as the source, the configuration format that you provide the flow input data."}},"AWS::AppFlow::Flow.SAPODataDestinationProperties":{"attributes":{},"description":"The properties that are applied when using SAPOData as a flow destination","properties":{"ErrorHandlingConfig":"The settings that determine how Amazon AppFlow handles an error when placing data in the destination. For example, this setting would determine if the flow should fail after one insertion error, or continue and attempt to insert every record regardless of the initial failure. `ErrorHandlingConfig` is a part of the destination connector details.","IdFieldNames":"A list of field names that can be used as an ID field when performing a write operation.","ObjectPath":"The object path specified in the SAPOData flow destination.","SuccessResponseHandlingConfig":"Determines how Amazon AppFlow handles the success response that it gets from the connector after placing data.\\n\\nFor example, this setting would determine where to write the response from a destination connector upon a successful insert operation.","WriteOperationType":"The possible write operations in the destination connector. When this value is not provided, this defaults to the `INSERT` operation."}},"AWS::AppFlow::Flow.SAPODataSourceProperties":{"attributes":{},"description":"The properties that are applied when using SAPOData as a flow source.","properties":{"ObjectPath":"The object path specified in the SAPOData flow source."}},"AWS::AppFlow::Flow.SalesforceDestinationProperties":{"attributes":{},"description":"The properties that are applied when Salesforce is being used as a destination.","properties":{"DataTransferApi":"Specifies which Salesforce API is used by Amazon AppFlow when your flow transfers data to Salesforce.\\n\\n- **AUTOMATIC** - The default. Amazon AppFlow selects which API to use based on the number of records that your flow transfers to Salesforce. If your flow transfers fewer than 1,000 records, Amazon AppFlow uses Salesforce REST API. If your flow transfers 1,000 records or more, Amazon AppFlow uses Salesforce Bulk API 2.0.\\n\\nEach of these Salesforce APIs structures data differently. If Amazon AppFlow selects the API automatically, be aware that, for recurring flows, the data output might vary from one flow run to the next. For example, if a flow runs daily, it might use REST API on one day to transfer 900 records, and it might use Bulk API 2.0 on the next day to transfer 1,100 records. For each of these flow runs, the respective Salesforce API formats the data differently. Some of the differences include how dates are formatted and null values are represented. Also, Bulk API 2.0 doesn\'t transfer Salesforce compound fields.\\n\\nBy choosing this option, you optimize flow performance for both small and large data transfers, but the tradeoff is inconsistent formatting in the output.\\n- **BULKV2** - Amazon AppFlow uses only Salesforce Bulk API 2.0. This API runs asynchronous data transfers, and it\'s optimal for large sets of data. By choosing this option, you ensure that your flow writes consistent output, but you optimize performance only for large data transfers.\\n\\nNote that Bulk API 2.0 does not transfer Salesforce compound fields.\\n- **REST_SYNC** - Amazon AppFlow uses only Salesforce REST API. By choosing this option, you ensure that your flow writes consistent output, but you decrease performance for large data transfers that are better suited for Bulk API 2.0. In some cases, if your flow attempts to transfer a vary large set of data, it might fail with a timed out error.","ErrorHandlingConfig":"The settings that determine how Amazon AppFlow handles an error when placing data in the Salesforce destination. For example, this setting would determine if the flow should fail after one insertion error, or continue and attempt to insert every record regardless of the initial failure. `ErrorHandlingConfig` is a part of the destination connector details.","IdFieldNames":"The name of the field that Amazon AppFlow uses as an ID when performing a write operation such as update or delete.","Object":"The object specified in the Salesforce flow destination.","WriteOperationType":"This specifies the type of write operation to be performed in Salesforce. When the value is `UPSERT` , then `idFieldNames` is required."}},"AWS::AppFlow::Flow.SalesforceSourceProperties":{"attributes":{},"description":"The properties that are applied when Salesforce is being used as a source.","properties":{"DataTransferApi":"Specifies which Salesforce API is used by Amazon AppFlow when your flow transfers data from Salesforce.\\n\\n- **AUTOMATIC** - The default. Amazon AppFlow selects which API to use based on the number of records that your flow transfers from Salesforce. If your flow transfers fewer than 1,000,000 records, Amazon AppFlow uses Salesforce REST API. If your flow transfers 1,000,000 records or more, Amazon AppFlow uses Salesforce Bulk API 2.0.\\n\\nEach of these Salesforce APIs structures data differently. If Amazon AppFlow selects the API automatically, be aware that, for recurring flows, the data output might vary from one flow run to the next. For example, if a flow runs daily, it might use REST API on one day to transfer 900,000 records, and it might use Bulk API 2.0 on the next day to transfer 1,100,000 records. For each of these flow runs, the respective Salesforce API formats the data differently. Some of the differences include how dates are formatted and null values are represented. Also, Bulk API 2.0 doesn\'t transfer Salesforce compound fields.\\n\\nBy choosing this option, you optimize flow performance for both small and large data transfers, but the tradeoff is inconsistent formatting in the output.\\n- **BULKV2** - Amazon AppFlow uses only Salesforce Bulk API 2.0. This API runs asynchronous data transfers, and it\'s optimal for large sets of data. By choosing this option, you ensure that your flow writes consistent output, but you optimize performance only for large data transfers.\\n\\nNote that Bulk API 2.0 does not transfer Salesforce compound fields.\\n- **REST_SYNC** - Amazon AppFlow uses only Salesforce REST API. By choosing this option, you ensure that your flow writes consistent output, but you decrease performance for large data transfers that are better suited for Bulk API 2.0. In some cases, if your flow attempts to transfer a vary large set of data, it might fail wituh a timed out error.","EnableDynamicFieldUpdate":"The flag that enables dynamic fetching of new (recently added) fields in the Salesforce objects while running a flow.","IncludeDeletedRecords":"Indicates whether Amazon AppFlow includes deleted files in the flow run.","Object":"The object specified in the Salesforce flow source."}},"AWS::AppFlow::Flow.ScheduledTriggerProperties":{"attributes":{},"description":"Specifies the configuration details of a schedule-triggered flow as defined by the user. Currently, these settings only apply to the `Scheduled` trigger type.","properties":{"DataPullMode":"Specifies whether a scheduled flow has an incremental data transfer or a complete data transfer for each flow run.","FirstExecutionFrom":"Specifies the date range for the records to import from the connector in the first flow run.","FlowErrorDeactivationThreshold":"","ScheduleEndTime":"The time at which the scheduled flow ends. The time is formatted as a timestamp that follows the ISO 8601 standard, such as `2022-04-27T13:00:00-07:00` .","ScheduleExpression":"The scheduling expression that determines the rate at which the schedule will run, for example `rate(5minutes)` .","ScheduleOffset":"Specifies the optional offset that is added to the time interval for a schedule-triggered flow.","ScheduleStartTime":"The time at which the scheduled flow starts. The time is formatted as a timestamp that follows the ISO 8601 standard, such as `2022-04-26T13:00:00-07:00` .","TimeZone":"Specifies the time zone used when referring to the dates and times of a scheduled flow, such as `America/New_York` . This time zone is only a descriptive label. It doesn\'t affect how Amazon AppFlow interprets the timestamps that you specify to schedule the flow.\\n\\nIf you want to schedule a flow by using times in a particular time zone, indicate the time zone as a UTC offset in your timestamps. For example, the UTC offsets for the `America/New_York` timezone are `-04:00` EDT and `-05:00 EST` ."}},"AWS::AppFlow::Flow.ServiceNowSourceProperties":{"attributes":{},"description":"The properties that are applied when ServiceNow is being used as a source.","properties":{"Object":"The object specified in the ServiceNow flow source."}},"AWS::AppFlow::Flow.SingularSourceProperties":{"attributes":{},"description":"The properties that are applied when Singular is being used as a source.","properties":{"Object":"The object specified in the Singular flow source."}},"AWS::AppFlow::Flow.SlackSourceProperties":{"attributes":{},"description":"The properties that are applied when Slack is being used as a source.","properties":{"Object":"The object specified in the Slack flow source."}},"AWS::AppFlow::Flow.SnowflakeDestinationProperties":{"attributes":{},"description":"The properties that are applied when Snowflake is being used as a destination.","properties":{"BucketPrefix":"The object key for the destination bucket in which Amazon AppFlow places the files.","ErrorHandlingConfig":"The settings that determine how Amazon AppFlow handles an error when placing data in the Snowflake destination. For example, this setting would determine if the flow should fail after one insertion error, or continue and attempt to insert every record regardless of the initial failure. `ErrorHandlingConfig` is a part of the destination connector details.","IntermediateBucketName":"The intermediate bucket that Amazon AppFlow uses when moving data into Snowflake.","Object":"The object specified in the Snowflake flow destination."}},"AWS::AppFlow::Flow.SourceConnectorProperties":{"attributes":{},"description":"Specifies the information that is required to query a particular connector.","properties":{"Amplitude":"Specifies the information that is required for querying Amplitude.","CustomConnector":"The properties that are applied when the custom connector is being used as a source.","Datadog":"Specifies the information that is required for querying Datadog.","Dynatrace":"Specifies the information that is required for querying Dynatrace.","GoogleAnalytics":"Specifies the information that is required for querying Google Analytics.","InforNexus":"Specifies the information that is required for querying Infor Nexus.","Marketo":"Specifies the information that is required for querying Marketo.","Pardot":"","S3":"Specifies the information that is required for querying Amazon S3.","SAPOData":"The properties that are applied when using SAPOData as a flow source.","Salesforce":"Specifies the information that is required for querying Salesforce.","ServiceNow":"Specifies the information that is required for querying ServiceNow.","Singular":"Specifies the information that is required for querying Singular.","Slack":"Specifies the information that is required for querying Slack.","Trendmicro":"Specifies the information that is required for querying Trend Micro.","Veeva":"Specifies the information that is required for querying Veeva.","Zendesk":"Specifies the information that is required for querying Zendesk."}},"AWS::AppFlow::Flow.SourceFlowConfig":{"attributes":{},"description":"Contains information about the configuration of the source connector used in the flow.","properties":{"ApiVersion":"The API version of the connector when it\'s used as a source in the flow.","ConnectorProfileName":"The name of the connector profile. This name must be unique for each connector profile in the AWS account .","ConnectorType":"The type of connector, such as Salesforce, Amplitude, and so on.","IncrementalPullConfig":"Defines the configuration for a scheduled incremental data pull. If a valid configuration is provided, the fields specified in the configuration are used when querying for the incremental data pull.","SourceConnectorProperties":"Specifies the information that is required to query a particular source connector."}},"AWS::AppFlow::Flow.SuccessResponseHandlingConfig":{"attributes":{},"description":"Determines how Amazon AppFlow handles the success response that it gets from the connector after placing data.\\n\\nFor example, this setting would determine where to write the response from the destination connector upon a successful insert operation.","properties":{"BucketName":"The name of the Amazon S3 bucket.","BucketPrefix":"The Amazon S3 bucket prefix."}},"AWS::AppFlow::Flow.Task":{"attributes":{},"description":"A class for modeling different type of tasks. Task implementation varies based on the `TaskType` .","properties":{"ConnectorOperator":"The operation to be performed on the provided source fields.","DestinationField":"A field in a destination connector, or a field value against which Amazon AppFlow validates a source field.","SourceFields":"The source fields to which a particular task is applied.","TaskProperties":"A map used to store task-related information. The execution service looks for particular information based on the `TaskType` .","TaskType":"Specifies the particular task implementation that Amazon AppFlow performs.\\n\\n*Allowed values* : `Arithmetic` | `Filter` | `Map` | `Map_all` | `Mask` | `Merge` | `Truncate` | `Validate`"}},"AWS::AppFlow::Flow.TaskPropertiesObject":{"attributes":{},"description":"A map used to store task-related information. The execution service looks for particular information based on the `TaskType` .","properties":{"Key":"The task property key.\\n\\n*Allowed Values* : `VALUE | VALUES | DATA_TYPE | UPPER_BOUND | LOWER_BOUND | SOURCE_DATA_TYPE | DESTINATION_DATA_TYPE | VALIDATION_ACTION | MASK_VALUE | MASK_LENGTH | TRUNCATE_LENGTH | MATH_OPERATION_FIELDS_ORDER | CONCAT_FORMAT | SUBFIELD_CATEGORY_MAP` | `EXCLUDE_SOURCE_FIELDS_LIST`","Value":"The task property value."}},"AWS::AppFlow::Flow.TrendmicroSourceProperties":{"attributes":{},"description":"The properties that are applied when using Trend Micro as a flow source.","properties":{"Object":"The object specified in the Trend Micro flow source."}},"AWS::AppFlow::Flow.TriggerConfig":{"attributes":{},"description":"The trigger settings that determine how and when Amazon AppFlow runs the specified flow.","properties":{"TriggerProperties":"Specifies the configuration details of a schedule-triggered flow as defined by the user. Currently, these settings only apply to the `Scheduled` trigger type.","TriggerType":"Specifies the type of flow trigger. This can be `OnDemand` , `Scheduled` , or `Event` ."}},"AWS::AppFlow::Flow.UpsolverDestinationProperties":{"attributes":{},"description":"The properties that are applied when Upsolver is used as a destination.","properties":{"BucketName":"The Upsolver Amazon S3 bucket name in which Amazon AppFlow places the transferred data.","BucketPrefix":"The object key for the destination Upsolver Amazon S3 bucket in which Amazon AppFlow places the files.","S3OutputFormatConfig":"The configuration that determines how data is formatted when Upsolver is used as the flow destination."}},"AWS::AppFlow::Flow.UpsolverS3OutputFormatConfig":{"attributes":{},"description":"The configuration that determines how Amazon AppFlow formats the flow output data when Upsolver is used as the destination.","properties":{"AggregationConfig":"The aggregation settings that you can use to customize the output format of your flow data.","FileType":"Indicates the file type that Amazon AppFlow places in the Upsolver Amazon S3 bucket.","PrefixConfig":"Specifies elements that Amazon AppFlow includes in the file and folder names in the flow destination."}},"AWS::AppFlow::Flow.VeevaSourceProperties":{"attributes":{},"description":"The properties that are applied when using Veeva as a flow source.","properties":{"DocumentType":"The document type specified in the Veeva document extract flow.","IncludeAllVersions":"Boolean value to include All Versions of files in Veeva document extract flow.","IncludeRenditions":"Boolean value to include file renditions in Veeva document extract flow.","IncludeSourceFiles":"Boolean value to include source files in Veeva document extract flow.","Object":"The object specified in the Veeva flow source."}},"AWS::AppFlow::Flow.ZendeskDestinationProperties":{"attributes":{},"description":"The properties that are applied when Zendesk is used as a destination.","properties":{"ErrorHandlingConfig":"The settings that determine how Amazon AppFlow handles an error when placing data in the destination. For example, this setting would determine if the flow should fail after one insertion error, or continue and attempt to insert every record regardless of the initial failure. `ErrorHandlingConfig` is a part of the destination connector details.","IdFieldNames":"A list of field names that can be used as an ID field when performing a write operation.","Object":"The object specified in the Zendesk flow destination.","WriteOperationType":"The possible write operations in the destination connector. When this value is not provided, this defaults to the `INSERT` operation."}},"AWS::AppFlow::Flow.ZendeskSourceProperties":{"attributes":{},"description":"The properties that are applied when using Zendesk as a flow source.","properties":{"Object":"The object specified in the Zendesk flow source."}},"AWS::AppIntegrations::DataIntegration":{"attributes":{"DataIntegrationArn":"The Amazon Resource Name (ARN) for the DataIntegration.","Id":"A unique identifier.","Ref":"`Ref` returns the DataIntegration name. For example:\\n\\n`{ \\"Ref\\": \\"myDataIntegrationName\\" }`"},"description":"Creates and persists a DataIntegration resource.","properties":{"Description":"A description of the DataIntegration.","FileConfiguration":"","KmsKey":"The KMS key for the DataIntegration.","Name":"The name of the DataIntegration.","ObjectConfiguration":"","ScheduleConfig":"The name of the data and how often it should be pulled from the source.","SourceURI":"The URI of the data source.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::AppIntegrations::DataIntegration.FileConfiguration":{"attributes":{},"description":"","properties":{"Filters":"","Folders":""}},"AWS::AppIntegrations::DataIntegration.ScheduleConfig":{"attributes":{},"description":"The name of the data and how often it should be pulled from the source.","properties":{"FirstExecutionFrom":"The start date for objects to import in the first flow run as an Unix/epoch timestamp in milliseconds or in ISO-8601 format.","Object":"The name of the object to pull from the data source.","ScheduleExpression":"How often the data should be pulled from data source."}},"AWS::AppIntegrations::EventIntegration":{"attributes":{"EventIntegrationArn":"The Amazon Resource Name (ARN) of the event integration.","Ref":"`Ref` returns the EventIntegration name. For example:\\n\\n`{ \\"Ref\\": \\"myEventIntegrationName\\" }`"},"description":"Creates an event integration. You provide a name, description, and a reference to an Amazon EventBridge bus in your account and a partner event source that will push events to that bus. No objects are created in your account, only metadata that is persisted on the EventIntegration control plane.","properties":{"Description":"The event integration description.","EventBridgeBus":"The Amazon EventBridge bus for the event integration.","EventFilter":"The event integration filter.","Name":"The name of the event integration.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::AppIntegrations::EventIntegration.EventFilter":{"attributes":{},"description":"The event integration filter.","properties":{"Source":"The source of the events."}},"AWS::AppMesh::GatewayRoute":{"attributes":{"Arn":"The full Amazon Resource Name (ARN) for the gateway route.","GatewayRouteName":"The name of the gateway route.","MeshName":"The name of the service mesh that the gateway route resides in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then it\'s the ID of the account that shared the mesh with your account. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Ref":"`Ref` returns the resource ARN. For example:\\n\\n`{ \\"Ref\\": \\"myGatewayRoute\\" }`\\n\\nWhen you pass the logical ID of an `AWS::AppMesh::GatewayRoute` resource to the intrinsic Ref function, the function returns the gateway route ARN, such as `arn:aws:appmesh: *us-east-1* : *555555555555* :gatewayRoute/ *myGatewayRoute*` .","ResourceOwner":"The IAM account ID of the resource owner. If the account ID is not your own, then it\'s the ID of the mesh owner or of another account that the mesh is shared with. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Uid":"The unique identifier for the gateway route.","VirtualGatewayName":"The name of the virtual gateway that the gateway route is associated with."},"description":"Creates a gateway route.\\n\\nA gateway route is attached to a virtual gateway and routes traffic to an existing virtual service. If a route matches a request, it can distribute traffic to a target virtual service.\\n\\nFor more information about gateway routes, see [Gateway routes](https://docs.aws.amazon.com/app-mesh/latest/userguide/gateway-routes.html) .","properties":{"GatewayRouteName":"The name of the gateway route.","MeshName":"The name of the service mesh that the resource resides in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then it\'s the ID of the account that shared the mesh with your account. For more information about mesh sharing, see [Working with shared meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Spec":"The specifications of the gateway route.","Tags":"Optional metadata that you can apply to the gateway route to assist with categorization and organization. Each tag consists of a key and an optional value, both of which you define. Tag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters.","VirtualGatewayName":"The virtual gateway that the gateway route is associated with."}},"AWS::AppMesh::GatewayRoute.GatewayRouteHostnameMatch":{"attributes":{},"description":"An object representing the gateway route host name to match.","properties":{"Exact":"The exact host name to match on.","Suffix":"The specified ending characters of the host name to match on."}},"AWS::AppMesh::GatewayRoute.GatewayRouteHostnameRewrite":{"attributes":{},"description":"An object representing the gateway route host name to rewrite.","properties":{"DefaultTargetHostname":"The default target host name to write to."}},"AWS::AppMesh::GatewayRoute.GatewayRouteMetadataMatch":{"attributes":{},"description":"An object representing the method header to be matched.","properties":{"Exact":"The exact method header to be matched on.","Prefix":"The specified beginning characters of the method header to be matched on.","Range":"An object that represents the range of values to match on.","Regex":"The regex used to match the method header.","Suffix":"The specified ending characters of the method header to match on."}},"AWS::AppMesh::GatewayRoute.GatewayRouteRangeMatch":{"attributes":{},"description":"An object that represents the range of values to match on. The first character of the range is included in the range, though the last character is not. For example, if the range specified were 1-100, only values 1-99 would be matched.","properties":{"End":"The end of the range.","Start":"The start of the range."}},"AWS::AppMesh::GatewayRoute.GatewayRouteSpec":{"attributes":{},"description":"An object that represents a gateway route specification. Specify one gateway route type.","properties":{"GrpcRoute":"An object that represents the specification of a gRPC gateway route.","Http2Route":"An object that represents the specification of an HTTP/2 gateway route.","HttpRoute":"An object that represents the specification of an HTTP gateway route.","Priority":"The ordering of the gateway routes spec."}},"AWS::AppMesh::GatewayRoute.GatewayRouteTarget":{"attributes":{},"description":"An object that represents a gateway route target.","properties":{"Port":"The port number of the gateway route target.","VirtualService":"An object that represents a virtual service gateway route target."}},"AWS::AppMesh::GatewayRoute.GatewayRouteVirtualService":{"attributes":{},"description":"An object that represents the virtual service that traffic is routed to.","properties":{"VirtualServiceName":"The name of the virtual service that traffic is routed to."}},"AWS::AppMesh::GatewayRoute.GrpcGatewayRoute":{"attributes":{},"description":"An object that represents a gRPC gateway route.","properties":{"Action":"An object that represents the action to take if a match is determined.","Match":"An object that represents the criteria for determining a request match."}},"AWS::AppMesh::GatewayRoute.GrpcGatewayRouteAction":{"attributes":{},"description":"An object that represents the action to take if a match is determined.","properties":{"Rewrite":"The gateway route action to rewrite.","Target":"An object that represents the target that traffic is routed to when a request matches the gateway route."}},"AWS::AppMesh::GatewayRoute.GrpcGatewayRouteMatch":{"attributes":{},"description":"An object that represents the criteria for determining a request match.","properties":{"Hostname":"The gateway route host name to be matched on.","Metadata":"The gateway route metadata to be matched on.","Port":"The gateway route port to be matched on.","ServiceName":"The fully qualified domain name for the service to match from the request."}},"AWS::AppMesh::GatewayRoute.GrpcGatewayRouteMetadata":{"attributes":{},"description":"An object representing the metadata of the gateway route.","properties":{"Invert":"Specify `True` to match anything except the match criteria. The default value is `False` .","Match":"The criteria for determining a metadata match.","Name":"A name for the gateway route metadata."}},"AWS::AppMesh::GatewayRoute.GrpcGatewayRouteRewrite":{"attributes":{},"description":"An object that represents the gateway route to rewrite.","properties":{"Hostname":"The host name of the gateway route to rewrite."}},"AWS::AppMesh::GatewayRoute.HttpGatewayRoute":{"attributes":{},"description":"An object that represents an HTTP gateway route.","properties":{"Action":"An object that represents the action to take if a match is determined.","Match":"An object that represents the criteria for determining a request match."}},"AWS::AppMesh::GatewayRoute.HttpGatewayRouteAction":{"attributes":{},"description":"An object that represents the action to take if a match is determined.","properties":{"Rewrite":"The gateway route action to rewrite.","Target":"An object that represents the target that traffic is routed to when a request matches the gateway route."}},"AWS::AppMesh::GatewayRoute.HttpGatewayRouteHeader":{"attributes":{},"description":"An object that represents the HTTP header in the gateway route.","properties":{"Invert":"Specify `True` to match anything except the match criteria. The default value is `False` .","Match":"An object that represents the method and value to match with the header value sent in a request. Specify one match method.","Name":"A name for the HTTP header in the gateway route that will be matched on."}},"AWS::AppMesh::GatewayRoute.HttpGatewayRouteHeaderMatch":{"attributes":{},"description":"An object that represents the method and value to match with the header value sent in a request. Specify one match method.","properties":{"Exact":"The value sent by the client must match the specified value exactly.","Prefix":"The value sent by the client must begin with the specified characters.","Range":"An object that represents the range of values to match on.","Regex":"The value sent by the client must include the specified characters.","Suffix":"The value sent by the client must end with the specified characters."}},"AWS::AppMesh::GatewayRoute.HttpGatewayRouteMatch":{"attributes":{},"description":"An object that represents the criteria for determining a request match.","properties":{"Headers":"The client request headers to match on.","Hostname":"The host name to match on.","Method":"The method to match on.","Path":"The path to match on.","Port":"The port number to match on.","Prefix":"Specifies the path to match requests with. This parameter must always start with `/` , which by itself matches all requests to the virtual service name. You can also match for path-based routing of requests. For example, if your virtual service name is `my-service.local` and you want the route to match requests to `my-service.local/metrics` , your prefix should be `/metrics` .","QueryParameters":"The query parameter to match on."}},"AWS::AppMesh::GatewayRoute.HttpGatewayRoutePathRewrite":{"attributes":{},"description":"An object that represents the path to rewrite.","properties":{"Exact":"The exact path to rewrite."}},"AWS::AppMesh::GatewayRoute.HttpGatewayRoutePrefixRewrite":{"attributes":{},"description":"An object representing the beginning characters of the route to rewrite.","properties":{"DefaultPrefix":"The default prefix used to replace the incoming route prefix when rewritten.","Value":"The value used to replace the incoming route prefix when rewritten."}},"AWS::AppMesh::GatewayRoute.HttpGatewayRouteRewrite":{"attributes":{},"description":"An object representing the gateway route to rewrite.","properties":{"Hostname":"The host name to rewrite.","Path":"The path to rewrite.","Prefix":"The specified beginning characters to rewrite."}},"AWS::AppMesh::GatewayRoute.HttpPathMatch":{"attributes":{},"description":"An object representing the path to match in the request.","properties":{"Exact":"The exact path to match on.","Regex":"The regex used to match the path."}},"AWS::AppMesh::GatewayRoute.HttpQueryParameterMatch":{"attributes":{},"description":"An object representing the query parameter to match.","properties":{"Exact":"The exact query parameter to match on."}},"AWS::AppMesh::GatewayRoute.QueryParameter":{"attributes":{},"description":"An object that represents the query parameter in the request.","properties":{"Match":"The query parameter to match on.","Name":"A name for the query parameter that will be matched on."}},"AWS::AppMesh::Mesh":{"attributes":{"Arn":"The full Amazon Resource Name (ARN) for the mesh.","MeshName":"The name of the service mesh.","MeshOwner":"The IAM account ID of the service mesh owner. If the account ID is not your own, then it\'s the ID of the account that shared the mesh with your account. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Ref":"`Ref` returns the resource ARN. For example:\\n\\n`{ \\"Ref\\": \\"myMesh\\" }`\\n\\nWhen you pass the logical ID of an `AWS::AppMesh::Mesh` resource to the intrinsic Ref function, the function returns the mesh ARN, such as `arn:aws:appmesh: *us-east-1* : *555555555555* :mesh/ *myMesh*` .","ResourceOwner":"The IAM account ID of the resource owner. If the account ID is not your own, then it\'s the ID of the mesh owner or of another account that the mesh is shared with. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Uid":"The unique identifier for the mesh."},"description":"Creates a service mesh.\\n\\nA service mesh is a logical boundary for network traffic between services that are represented by resources within the mesh. After you create your service mesh, you can create virtual services, virtual nodes, virtual routers, and routes to distribute traffic between the applications in your mesh.\\n\\nFor more information about service meshes, see [Service meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/meshes.html) .","properties":{"MeshName":"The name to use for the service mesh.","Spec":"The service mesh specification to apply.","Tags":"Optional metadata that you can apply to the service mesh to assist with categorization and organization. Each tag consists of a key and an optional value, both of which you define. Tag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters."}},"AWS::AppMesh::Mesh.EgressFilter":{"attributes":{},"description":"An object that represents the egress filter rules for a service mesh.","properties":{"Type":"The egress filter type. By default, the type is `DROP_ALL` , which allows egress only from virtual nodes to other defined resources in the service mesh (and any traffic to `*.amazonaws.com` for AWS API calls). You can set the egress filter type to `ALLOW_ALL` to allow egress to any endpoint inside or outside of the service mesh.\\n\\n> If you specify any backends on a virtual node when using `ALLOW_ALL` , you must specifiy all egress for that virtual node as backends. Otherwise, `ALLOW_ALL` will no longer work for that virtual node."}},"AWS::AppMesh::Mesh.MeshServiceDiscovery":{"attributes":{},"description":"An object that represents the service discovery information for a service mesh.","properties":{"IpPreference":"The IP version to use to control traffic within the mesh."}},"AWS::AppMesh::Mesh.MeshSpec":{"attributes":{},"description":"An object that represents the specification of a service mesh.","properties":{"EgressFilter":"The egress filter rules for the service mesh.","ServiceDiscovery":""}},"AWS::AppMesh::Route":{"attributes":{"Arn":"The full Amazon Resource Name (ARN) for the route.","MeshName":"The name of the service mesh that the route resides in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then it\'s the ID of the account that shared the mesh with your account. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Ref":"`Ref` returns the resource ARN. For example:\\n\\n`{ \\"Ref\\": \\"myRoute\\" }`\\n\\nWhen you pass the logical ID of an `AWS::AppMesh::Route` resource to the intrinsic Ref function, the function returns the route ARN, such as `arn:aws:appmesh: *us-east-1* : *555555555555* :route/ *myRoute*` .","ResourceOwner":"The AWS IAM account ID of the resource owner. If the account ID is not your own, then it\'s the ID of the mesh owner or of another account that the mesh is shared with. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","RouteName":"The name of the route.","Uid":"The unique identifier for the route.","VirtualRouterName":"The name of the virtual router that the route is associated with."},"description":"Creates a route that is associated with a virtual router.\\n\\nYou can route several different protocols and define a retry policy for a route. Traffic can be routed to one or more virtual nodes.\\n\\nFor more information about routes, see [Routes](https://docs.aws.amazon.com/app-mesh/latest/userguide/routes.html) .","properties":{"MeshName":"The name of the service mesh to create the route in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then the account that you specify must share the mesh with your account before you can create the resource in the service mesh. For more information about mesh sharing, see [Working with shared meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","RouteName":"The name to use for the route.","Spec":"The route specification to apply.","Tags":"Optional metadata that you can apply to the route to assist with categorization and organization. Each tag consists of a key and an optional value, both of which you define. Tag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters.","VirtualRouterName":"The name of the virtual router in which to create the route. If the virtual router is in a shared mesh, then you must be the owner of the virtual router resource."}},"AWS::AppMesh::Route.Duration":{"attributes":{},"description":"An object that represents a duration of time.","properties":{"Unit":"A unit of time.","Value":"A number of time units."}},"AWS::AppMesh::Route.GrpcRetryPolicy":{"attributes":{},"description":"An object that represents a retry policy. Specify at least one value for at least one of the types of `RetryEvents` , a value for `maxRetries` , and a value for `perRetryTimeout` . Both `server-error` and `gateway-error` under `httpRetryEvents` include the Envoy `reset` policy. For more information on the `reset` policy, see the [Envoy documentation](https://docs.aws.amazon.com/https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/router_filter#x-envoy-retry-on) .","properties":{"GrpcRetryEvents":"Specify at least one of the valid values.","HttpRetryEvents":"Specify at least one of the following values.\\n\\n- *server-error* – HTTP status codes 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, and 511\\n- *gateway-error* – HTTP status codes 502, 503, and 504\\n- *client-error* – HTTP status code 409\\n- *stream-error* – Retry on refused stream","MaxRetries":"The maximum number of retry attempts.","PerRetryTimeout":"The timeout for each retry attempt.","TcpRetryEvents":"Specify a valid value. The event occurs before any processing of a request has started and is encountered when the upstream is temporarily or permanently unavailable."}},"AWS::AppMesh::Route.GrpcRoute":{"attributes":{},"description":"An object that represents a gRPC route type.","properties":{"Action":"An object that represents the action to take if a match is determined.","Match":"An object that represents the criteria for determining a request match.","RetryPolicy":"An object that represents a retry policy.","Timeout":"An object that represents types of timeouts."}},"AWS::AppMesh::Route.GrpcRouteAction":{"attributes":{},"description":"An object that represents the action to take if a match is determined.","properties":{"WeightedTargets":"An object that represents the targets that traffic is routed to when a request matches the route."}},"AWS::AppMesh::Route.GrpcRouteMatch":{"attributes":{},"description":"An object that represents the criteria for determining a request match.","properties":{"Metadata":"An object that represents the data to match from the request.","MethodName":"The method name to match from the request. If you specify a name, you must also specify a `serviceName` .","Port":"The port number to match on.","ServiceName":"The fully qualified domain name for the service to match from the request."}},"AWS::AppMesh::Route.GrpcRouteMetadata":{"attributes":{},"description":"An object that represents the match metadata for the route.","properties":{"Invert":"Specify `True` to match anything except the match criteria. The default value is `False` .","Match":"An object that represents the data to match from the request.","Name":"The name of the route."}},"AWS::AppMesh::Route.GrpcRouteMetadataMatchMethod":{"attributes":{},"description":"An object that represents the match method. Specify one of the match values.","properties":{"Exact":"The value sent by the client must match the specified value exactly.","Prefix":"The value sent by the client must begin with the specified characters.","Range":"An object that represents the range of values to match on.","Regex":"The value sent by the client must include the specified characters.","Suffix":"The value sent by the client must end with the specified characters."}},"AWS::AppMesh::Route.GrpcTimeout":{"attributes":{},"description":"An object that represents types of timeouts.","properties":{"Idle":"An object that represents an idle timeout. An idle timeout bounds the amount of time that a connection may be idle. The default value is none.","PerRequest":"An object that represents a per request timeout. The default value is 15 seconds. If you set a higher timeout, then make sure that the higher value is set for each App Mesh resource in a conversation. For example, if a virtual node backend uses a virtual router provider to route to another virtual node, then the timeout should be greater than 15 seconds for the source and destination virtual node and the route."}},"AWS::AppMesh::Route.HeaderMatchMethod":{"attributes":{},"description":"An object that represents the method and value to match with the header value sent in a request. Specify one match method.","properties":{"Exact":"The value sent by the client must match the specified value exactly.","Prefix":"The value sent by the client must begin with the specified characters.","Range":"An object that represents the range of values to match on.","Regex":"The value sent by the client must include the specified characters.","Suffix":"The value sent by the client must end with the specified characters."}},"AWS::AppMesh::Route.HttpPathMatch":{"attributes":{},"description":"An object representing the path to match in the request.","properties":{"Exact":"The exact path to match on.","Regex":"The regex used to match the path."}},"AWS::AppMesh::Route.HttpQueryParameterMatch":{"attributes":{},"description":"An object representing the query parameter to match.","properties":{"Exact":"The exact query parameter to match on."}},"AWS::AppMesh::Route.HttpRetryPolicy":{"attributes":{},"description":"An object that represents a retry policy. Specify at least one value for at least one of the types of `RetryEvents` , a value for `maxRetries` , and a value for `perRetryTimeout` . Both `server-error` and `gateway-error` under `httpRetryEvents` include the Envoy `reset` policy. For more information on the `reset` policy, see the [Envoy documentation](https://docs.aws.amazon.com/https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/router_filter#x-envoy-retry-on) .","properties":{"HttpRetryEvents":"Specify at least one of the following values.\\n\\n- *server-error* – HTTP status codes 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, and 511\\n- *gateway-error* – HTTP status codes 502, 503, and 504\\n- *client-error* – HTTP status code 409\\n- *stream-error* – Retry on refused stream","MaxRetries":"The maximum number of retry attempts.","PerRetryTimeout":"The timeout for each retry attempt.","TcpRetryEvents":"Specify a valid value. The event occurs before any processing of a request has started and is encountered when the upstream is temporarily or permanently unavailable."}},"AWS::AppMesh::Route.HttpRoute":{"attributes":{},"description":"An object that represents an HTTP or HTTP/2 route type.","properties":{"Action":"An object that represents the action to take if a match is determined.","Match":"An object that represents the criteria for determining a request match.","RetryPolicy":"An object that represents a retry policy.","Timeout":"An object that represents types of timeouts."}},"AWS::AppMesh::Route.HttpRouteAction":{"attributes":{},"description":"An object that represents the action to take if a match is determined.","properties":{"WeightedTargets":"An object that represents the targets that traffic is routed to when a request matches the route."}},"AWS::AppMesh::Route.HttpRouteHeader":{"attributes":{},"description":"An object that represents the HTTP header in the request.","properties":{"Invert":"Specify `True` to match anything except the match criteria. The default value is `False` .","Match":"The `HeaderMatchMethod` object.","Name":"A name for the HTTP header in the client request that will be matched on."}},"AWS::AppMesh::Route.HttpRouteMatch":{"attributes":{},"description":"An object that represents the requirements for a route to match HTTP requests for a virtual router.","properties":{"Headers":"The client request headers to match on.","Method":"The client request method to match on. Specify only one.","Path":"The client request path to match on.","Port":"The port number to match on.","Prefix":"Specifies the path to match requests with. This parameter must always start with `/` , which by itself matches all requests to the virtual service name. You can also match for path-based routing of requests. For example, if your virtual service name is `my-service.local` and you want the route to match requests to `my-service.local/metrics` , your prefix should be `/metrics` .","QueryParameters":"The client request query parameters to match on.","Scheme":"The client request scheme to match on. Specify only one. Applicable only for HTTP2 routes."}},"AWS::AppMesh::Route.HttpTimeout":{"attributes":{},"description":"An object that represents types of timeouts.","properties":{"Idle":"An object that represents an idle timeout. An idle timeout bounds the amount of time that a connection may be idle. The default value is none.","PerRequest":"An object that represents a per request timeout. The default value is 15 seconds. If you set a higher timeout, then make sure that the higher value is set for each App Mesh resource in a conversation. For example, if a virtual node backend uses a virtual router provider to route to another virtual node, then the timeout should be greater than 15 seconds for the source and destination virtual node and the route."}},"AWS::AppMesh::Route.MatchRange":{"attributes":{},"description":"An object that represents the range of values to match on. The first character of the range is included in the range, though the last character is not. For example, if the range specified were 1-100, only values 1-99 would be matched.","properties":{"End":"The end of the range.","Start":"The start of the range."}},"AWS::AppMesh::Route.QueryParameter":{"attributes":{},"description":"An object that represents the query parameter in the request.","properties":{"Match":"The query parameter to match on.","Name":"A name for the query parameter that will be matched on."}},"AWS::AppMesh::Route.RouteSpec":{"attributes":{},"description":"An object that represents a route specification. Specify one route type.","properties":{"GrpcRoute":"An object that represents the specification of a gRPC route.","Http2Route":"An object that represents the specification of an HTTP/2 route.","HttpRoute":"An object that represents the specification of an HTTP route.","Priority":"The priority for the route. Routes are matched based on the specified value, where 0 is the highest priority.","TcpRoute":"An object that represents the specification of a TCP route."}},"AWS::AppMesh::Route.TcpRoute":{"attributes":{},"description":"An object that represents a TCP route type.","properties":{"Action":"The action to take if a match is determined.","Match":"An object that represents the criteria for determining a request match.","Timeout":"An object that represents types of timeouts."}},"AWS::AppMesh::Route.TcpRouteAction":{"attributes":{},"description":"An object that represents the action to take if a match is determined.","properties":{"WeightedTargets":"An object that represents the targets that traffic is routed to when a request matches the route."}},"AWS::AppMesh::Route.TcpRouteMatch":{"attributes":{},"description":"An object representing the TCP route to match.","properties":{"Port":"The port number to match on."}},"AWS::AppMesh::Route.TcpTimeout":{"attributes":{},"description":"An object that represents types of timeouts.","properties":{"Idle":"An object that represents an idle timeout. An idle timeout bounds the amount of time that a connection may be idle. The default value is none."}},"AWS::AppMesh::Route.WeightedTarget":{"attributes":{},"description":"An object that represents a target and its relative weight. Traffic is distributed across targets according to their relative weight. For example, a weighted target with a relative weight of 50 receives five times as much traffic as one with a relative weight of 10. The total weight for all targets combined must be less than or equal to 100.","properties":{"Port":"The targeted port of the weighted object.","VirtualNode":"The virtual node to associate with the weighted target.","Weight":"The relative weight of the weighted target."}},"AWS::AppMesh::VirtualGateway":{"attributes":{"Arn":"The full Amazon Resource Name (ARN) for the virtual gateway.","MeshName":"The name of the service mesh that the virtual gateway resides in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then it\'s the ID of the account that shared the mesh with your account. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Ref":"`Ref` returns the resource ARN. For example:\\n\\n`{ \\"Ref\\": \\"myVirtualGateway\\" }`\\n\\nWhen you pass the logical ID of an `AWS::AppMesh::VirtualGateway` resource to the intrinsic Ref function, the function returns the gateway route ARN, such as `arn:aws:appmesh: *us-east-1* : *555555555555* :virtualGateway/ *myVirtualGateway*` .","ResourceOwner":"The AWS IAM account ID of the resource owner. If the account ID is not your own, then it\'s the ID of the mesh owner or of another account that the mesh is shared with. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Uid":"The unique identifier for the virtual gateway.","VirtualGatewayName":"The name of the virtual gateway."},"description":"Creates a virtual gateway.\\n\\nA virtual gateway allows resources outside your mesh to communicate to resources that are inside your mesh. The virtual gateway represents an Envoy proxy running in an Amazon ECS task, in a Kubernetes service, or on an Amazon EC2 instance. Unlike a virtual node, which represents an Envoy running with an application, a virtual gateway represents Envoy deployed by itself.\\n\\nFor more information about virtual gateways, see [Virtual gateways](https://docs.aws.amazon.com/app-mesh/latest/userguide/virtual_gateways.html) .","properties":{"MeshName":"The name of the service mesh that the virtual gateway resides in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then it\'s the ID of the account that shared the mesh with your account. For more information about mesh sharing, see [Working with shared meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Spec":"The specifications of the virtual gateway.","Tags":"Optional metadata that you can apply to the virtual gateway to assist with categorization and organization. Each tag consists of a key and an optional value, both of which you define. Tag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters.","VirtualGatewayName":"The name of the virtual gateway."}},"AWS::AppMesh::VirtualGateway.JsonFormatRef":{"attributes":{},"description":"An object that represents the key value pairs for the JSON.","properties":{"Key":"The specified key for the JSON.","Value":"The specified value for the JSON."}},"AWS::AppMesh::VirtualGateway.LoggingFormat":{"attributes":{},"description":"An object that represents the format for the logs.","properties":{"Json":"The logging format for JSON.","Text":"The logging format for text."}},"AWS::AppMesh::VirtualGateway.SubjectAlternativeNameMatchers":{"attributes":{},"description":"An object that represents the methods by which a subject alternative name on a peer Transport Layer Security (TLS) certificate can be matched.","properties":{"Exact":"The values sent must match the specified values exactly."}},"AWS::AppMesh::VirtualGateway.SubjectAlternativeNames":{"attributes":{},"description":"An object that represents the subject alternative names secured by the certificate.","properties":{"Match":"An object that represents the criteria for determining a SANs match."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayAccessLog":{"attributes":{},"description":"The access log configuration for a virtual gateway.","properties":{"File":"The file object to send virtual gateway access logs to."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayBackendDefaults":{"attributes":{},"description":"An object that represents the default properties for a backend.","properties":{"ClientPolicy":"A reference to an object that represents a client policy."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayClientPolicy":{"attributes":{},"description":"An object that represents a client policy.","properties":{"TLS":"A reference to an object that represents a Transport Layer Security (TLS) client policy."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayClientPolicyTls":{"attributes":{},"description":"An object that represents a Transport Layer Security (TLS) client policy.","properties":{"Certificate":"A reference to an object that represents a virtual gateway\'s client\'s Transport Layer Security (TLS) certificate.","Enforce":"Whether the policy is enforced. The default is `True` , if a value isn\'t specified.","Ports":"One or more ports that the policy is enforced for.","Validation":"A reference to an object that represents a Transport Layer Security (TLS) validation context."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayClientTlsCertificate":{"attributes":{},"description":"An object that represents the virtual gateway\'s client\'s Transport Layer Security (TLS) certificate.","properties":{"File":"An object that represents a local file certificate. The certificate must meet specific requirements and you must have proxy authorization enabled. For more information, see [Transport Layer Security (TLS)](https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html) .","SDS":"A reference to an object that represents a virtual gateway\'s client\'s Secret Discovery Service certificate."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayConnectionPool":{"attributes":{},"description":"An object that represents the type of virtual gateway connection pool.\\n\\nOnly one protocol is used at a time and should be the same protocol as the one chosen under port mapping.\\n\\nIf not present the default value for `maxPendingRequests` is `2147483647` .","properties":{"GRPC":"An object that represents a type of connection pool.","HTTP":"An object that represents a type of connection pool.","HTTP2":"An object that represents a type of connection pool."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayFileAccessLog":{"attributes":{},"description":"An object that represents an access log file.","properties":{"Format":"The specified format for the virtual gateway access logs. It can be either `json_format` or `text_format` .","Path":"The file path to write access logs to. You can use `/dev/stdout` to send access logs to standard out and configure your Envoy container to use a log driver, such as `awslogs` , to export the access logs to a log storage service such as Amazon CloudWatch Logs. You can also specify a path in the Envoy container\'s file system to write the files to disk."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayGrpcConnectionPool":{"attributes":{},"description":"An object that represents a type of connection pool.","properties":{"MaxRequests":"Maximum number of inflight requests Envoy can concurrently support across hosts in upstream cluster."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayHealthCheckPolicy":{"attributes":{},"description":"An object that represents the health check policy for a virtual gateway\'s listener.","properties":{"HealthyThreshold":"The number of consecutive successful health checks that must occur before declaring the listener healthy.","IntervalMillis":"The time period in milliseconds between each health check execution.","Path":"The destination path for the health check request. This value is only used if the specified protocol is HTTP or HTTP/2. For any other protocol, this value is ignored.","Port":"The destination port for the health check request. This port must match the port defined in the `PortMapping` for the listener.","Protocol":"The protocol for the health check request. If you specify `grpc` , then your service must conform to the [GRPC Health Checking Protocol](https://docs.aws.amazon.com/https://github.com/grpc/grpc/blob/master/doc/health-checking.md) .","TimeoutMillis":"The amount of time to wait when receiving a response from the health check, in milliseconds.","UnhealthyThreshold":"The number of consecutive failed health checks that must occur before declaring a virtual gateway unhealthy."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayHttp2ConnectionPool":{"attributes":{},"description":"An object that represents a type of connection pool.","properties":{"MaxRequests":"Maximum number of inflight requests Envoy can concurrently support across hosts in upstream cluster."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayHttpConnectionPool":{"attributes":{},"description":"An object that represents a type of connection pool.","properties":{"MaxConnections":"Maximum number of outbound TCP connections Envoy can establish concurrently with all hosts in upstream cluster.","MaxPendingRequests":"Number of overflowing requests after `max_connections` Envoy will queue to upstream cluster."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListener":{"attributes":{},"description":"An object that represents a listener for a virtual gateway.","properties":{"ConnectionPool":"The connection pool information for the listener.","HealthCheck":"The health check information for the listener.","PortMapping":"The port mapping information for the listener.","TLS":"A reference to an object that represents the Transport Layer Security (TLS) properties for the listener."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTls":{"attributes":{},"description":"An object that represents the Transport Layer Security (TLS) properties for a listener.","properties":{"Certificate":"An object that represents a Transport Layer Security (TLS) certificate.","Mode":"Specify one of the following modes.\\n\\n- ** STRICT – Listener only accepts connections with TLS enabled.\\n- ** PERMISSIVE – Listener accepts connections with or without TLS enabled.\\n- ** DISABLED – Listener only accepts connections without TLS.","Validation":"A reference to an object that represents a virtual gateway\'s listener\'s Transport Layer Security (TLS) validation context."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsAcmCertificate":{"attributes":{},"description":"An object that represents an AWS Certificate Manager certificate.","properties":{"CertificateArn":"The Amazon Resource Name (ARN) for the certificate. The certificate must meet specific requirements and you must have proxy authorization enabled. For more information, see [Transport Layer Security (TLS)](https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites) ."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsCertificate":{"attributes":{},"description":"An object that represents a listener\'s Transport Layer Security (TLS) certificate.","properties":{"ACM":"A reference to an object that represents an AWS Certificate Manager certificate.","File":"A reference to an object that represents a local file certificate.","SDS":"A reference to an object that represents a virtual gateway\'s listener\'s Secret Discovery Service certificate."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsFileCertificate":{"attributes":{},"description":"An object that represents a local file certificate. The certificate must meet specific requirements and you must have proxy authorization enabled. For more information, see [Transport Layer Security (TLS)](https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites) .","properties":{"CertificateChain":"The certificate chain for the certificate.","PrivateKey":"The private key for a certificate stored on the file system of the mesh endpoint that the proxy is running on."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsSdsCertificate":{"attributes":{},"description":"An object that represents the virtual gateway\'s listener\'s Secret Discovery Service certificate.The proxy must be configured with a local SDS provider via a Unix Domain Socket. See App Mesh [TLS documentation](https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html) for more info.","properties":{"SecretName":"A reference to an object that represents the name of the secret secret requested from the Secret Discovery Service provider representing Transport Layer Security (TLS) materials like a certificate or certificate chain."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsValidationContext":{"attributes":{},"description":"An object that represents a virtual gateway\'s listener\'s Transport Layer Security (TLS) validation context.","properties":{"SubjectAlternativeNames":"A reference to an object that represents the SANs for a virtual gateway listener\'s Transport Layer Security (TLS) validation context.","Trust":"A reference to where to retrieve the trust chain when validating a peer’s Transport Layer Security (TLS) certificate."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsValidationContextTrust":{"attributes":{},"description":"An object that represents a virtual gateway\'s listener\'s Transport Layer Security (TLS) validation context trust.","properties":{"File":"An object that represents a Transport Layer Security (TLS) validation context trust for a local file.","SDS":"A reference to an object that represents a virtual gateway\'s listener\'s Transport Layer Security (TLS) Secret Discovery Service validation context trust."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayLogging":{"attributes":{},"description":"An object that represents logging information.","properties":{"AccessLog":"The access log configuration."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayPortMapping":{"attributes":{},"description":"An object that represents a port mapping.","properties":{"Port":"The port used for the port mapping. Specify one protocol.","Protocol":"The protocol used for the port mapping."}},"AWS::AppMesh::VirtualGateway.VirtualGatewaySpec":{"attributes":{},"description":"An object that represents the specification of a service mesh resource.","properties":{"BackendDefaults":"A reference to an object that represents the defaults for backends.","Listeners":"The listeners that the mesh endpoint is expected to receive inbound traffic from. You can specify one listener.","Logging":"An object that represents logging information."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContext":{"attributes":{},"description":"An object that represents a Transport Layer Security (TLS) validation context.","properties":{"SubjectAlternativeNames":"A reference to an object that represents the SANs for a virtual gateway\'s listener\'s Transport Layer Security (TLS) validation context.","Trust":"A reference to where to retrieve the trust chain when validating a peer’s Transport Layer Security (TLS) certificate."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextAcmTrust":{"attributes":{},"description":"An object that represents a Transport Layer Security (TLS) validation context trust for an AWS Certificate Manager certificate.","properties":{"CertificateAuthorityArns":"One or more ACM Amazon Resource Name (ARN)s."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextFileTrust":{"attributes":{},"description":"An object that represents a Transport Layer Security (TLS) validation context trust for a local file.","properties":{"CertificateChain":"The certificate trust chain for a certificate stored on the file system of the virtual node that the proxy is running on."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextSdsTrust":{"attributes":{},"description":"An object that represents a virtual gateway\'s listener\'s Transport Layer Security (TLS) Secret Discovery Service validation context trust. The proxy must be configured with a local SDS provider via a Unix Domain Socket. See App Mesh [TLS documentation](https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html) for more info.","properties":{"SecretName":"A reference to an object that represents the name of the secret for a virtual gateway\'s Transport Layer Security (TLS) Secret Discovery Service validation context trust."}},"AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextTrust":{"attributes":{},"description":"An object that represents a Transport Layer Security (TLS) validation context trust.","properties":{"ACM":"A reference to an object that represents a Transport Layer Security (TLS) validation context trust for an AWS Certificate Manager certificate.","File":"An object that represents a Transport Layer Security (TLS) validation context trust for a local file.","SDS":"A reference to an object that represents a virtual gateway\'s Transport Layer Security (TLS) Secret Discovery Service validation context trust."}},"AWS::AppMesh::VirtualNode":{"attributes":{"Arn":"The full Amazon Resource Name (ARN) for the virtual node.","MeshName":"The name of the service mesh that the virtual node resides in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then it\'s the ID of the account that shared the mesh with your account. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Ref":"`Ref` returns the resource ARN. For example:\\n\\n`{ \\"Ref\\": \\"myVirtualNode\\" }`\\n\\nWhen you pass the logical ID of an `AWS::AppMesh::VirtualNode` resource to the intrinsic Ref function, the function returns the virtual node ARN, such as `arn:aws:appmesh: *us-east-1* : *555555555555* :virtualNode/ *myVirtualNode*` .","ResourceOwner":"The AWS IAM account ID of the resource owner. If the account ID is not your own, then it\'s the ID of the mesh owner or of another account that the mesh is shared with. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Uid":"The unique identifier for the virtual node.","VirtualNodeName":"The name of the virtual node."},"description":"Creates a virtual node within a service mesh.\\n\\nA virtual node acts as a logical pointer to a particular task group, such as an Amazon ECS service or a Kubernetes deployment. When you create a virtual node, you can specify the service discovery information for your task group, and whether the proxy running in a task group will communicate with other proxies using Transport Layer Security (TLS).\\n\\nYou define a `listener` for any inbound traffic that your virtual node expects. Any virtual service that your virtual node expects to communicate to is specified as a `backend` .\\n\\nThe response metadata for your new virtual node contains the `arn` that is associated with the virtual node. Set this value to the full ARN; for example, `arn:aws:appmesh:us-west-2:123456789012:myMesh/default/virtualNode/myApp` ) as the `APPMESH_RESOURCE_ARN` environment variable for your task group\'s Envoy proxy container in your task definition or pod spec. This is then mapped to the `node.id` and `node.cluster` Envoy parameters.\\n\\n> By default, App Mesh uses the name of the resource you specified in `APPMESH_RESOURCE_ARN` when Envoy is referring to itself in metrics and traces. You can override this behavior by setting the `APPMESH_RESOURCE_CLUSTER` environment variable with your own name. \\n\\nFor more information about virtual nodes, see [Virtual nodes](https://docs.aws.amazon.com/app-mesh/latest/userguide/virtual_nodes.html) . You must be using `1.15.0` or later of the Envoy image when setting these variables. For more information about App Mesh Envoy variables, see [Envoy image](https://docs.aws.amazon.com/app-mesh/latest/userguide/envoy.html) in the AWS App Mesh User Guide.","properties":{"MeshName":"The name of the service mesh to create the virtual node in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then the account that you specify must share the mesh with your account before you can create the resource in the service mesh. For more information about mesh sharing, see [Working with shared meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Spec":"The virtual node specification to apply.","Tags":"Optional metadata that you can apply to the virtual node to assist with categorization and organization. Each tag consists of a key and an optional value, both of which you define. Tag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters.","VirtualNodeName":"The name to use for the virtual node."}},"AWS::AppMesh::VirtualNode.AccessLog":{"attributes":{},"description":"An object that represents the access logging information for a virtual node.","properties":{"File":"The file object to send virtual node access logs to."}},"AWS::AppMesh::VirtualNode.AwsCloudMapInstanceAttribute":{"attributes":{},"description":"An object that represents the AWS Cloud Map attribute information for your virtual node.\\n\\n> AWS Cloud Map is not available in the eu-south-1 Region.","properties":{"Key":"The name of an AWS Cloud Map service instance attribute key. Any AWS Cloud Map service instance that contains the specified key and value is returned.","Value":"The value of an AWS Cloud Map service instance attribute key. Any AWS Cloud Map service instance that contains the specified key and value is returned."}},"AWS::AppMesh::VirtualNode.AwsCloudMapServiceDiscovery":{"attributes":{},"description":"An object that represents the AWS Cloud Map service discovery information for your virtual node.\\n\\n> AWS Cloud Map is not available in the eu-south-1 Region.","properties":{"Attributes":"A string map that contains attributes with values that you can use to filter instances by any custom attribute that you specified when you registered the instance. Only instances that match all of the specified key/value pairs will be returned.","IpPreference":"The preferred IP version that this virtual node uses. Setting the IP preference on the virtual node only overrides the IP preference set for the mesh on this specific node.","NamespaceName":"The HTTP name of the AWS Cloud Map namespace to use.","ServiceName":"The name of the AWS Cloud Map service to use."}},"AWS::AppMesh::VirtualNode.Backend":{"attributes":{},"description":"An object that represents the backends that a virtual node is expected to send outbound traffic to.","properties":{"VirtualService":"Specifies a virtual service to use as a backend."}},"AWS::AppMesh::VirtualNode.BackendDefaults":{"attributes":{},"description":"An object that represents the default properties for a backend.","properties":{"ClientPolicy":"A reference to an object that represents a client policy."}},"AWS::AppMesh::VirtualNode.ClientPolicy":{"attributes":{},"description":"An object that represents a client policy.","properties":{"TLS":"A reference to an object that represents a Transport Layer Security (TLS) client policy."}},"AWS::AppMesh::VirtualNode.ClientPolicyTls":{"attributes":{},"description":"A reference to an object that represents a Transport Layer Security (TLS) client policy.","properties":{"Certificate":"A reference to an object that represents a client\'s TLS certificate.","Enforce":"Whether the policy is enforced. The default is `True` , if a value isn\'t specified.","Ports":"One or more ports that the policy is enforced for.","Validation":"A reference to an object that represents a TLS validation context."}},"AWS::AppMesh::VirtualNode.ClientTlsCertificate":{"attributes":{},"description":"An object that represents the client\'s certificate.","properties":{"File":"An object that represents a local file certificate. The certificate must meet specific requirements and you must have proxy authorization enabled. For more information, see [Transport Layer Security (TLS)](https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html) .","SDS":"A reference to an object that represents a client\'s TLS Secret Discovery Service certificate."}},"AWS::AppMesh::VirtualNode.DnsServiceDiscovery":{"attributes":{},"description":"An object that represents the DNS service discovery information for your virtual node.","properties":{"Hostname":"Specifies the DNS service discovery hostname for the virtual node.","IpPreference":"The preferred IP version that this virtual node uses. Setting the IP preference on the virtual node only overrides the IP preference set for the mesh on this specific node.","ResponseType":"Specifies the DNS response type for the virtual node."}},"AWS::AppMesh::VirtualNode.Duration":{"attributes":{},"description":"An object that represents a duration of time.","properties":{"Unit":"A unit of time.","Value":"A number of time units."}},"AWS::AppMesh::VirtualNode.FileAccessLog":{"attributes":{},"description":"An object that represents an access log file.","properties":{"Format":"The specified format for the logs. The format is either `json_format` or `text_format` .","Path":"The file path to write access logs to. You can use `/dev/stdout` to send access logs to standard out and configure your Envoy container to use a log driver, such as `awslogs` , to export the access logs to a log storage service such as Amazon CloudWatch Logs. You can also specify a path in the Envoy container\'s file system to write the files to disk.\\n\\n> The Envoy process must have write permissions to the path that you specify here. Otherwise, Envoy fails to bootstrap properly."}},"AWS::AppMesh::VirtualNode.GrpcTimeout":{"attributes":{},"description":"An object that represents types of timeouts.","properties":{"Idle":"An object that represents an idle timeout. An idle timeout bounds the amount of time that a connection may be idle. The default value is none.","PerRequest":"An object that represents a per request timeout. The default value is 15 seconds. If you set a higher timeout, then make sure that the higher value is set for each App Mesh resource in a conversation. For example, if a virtual node backend uses a virtual router provider to route to another virtual node, then the timeout should be greater than 15 seconds for the source and destination virtual node and the route."}},"AWS::AppMesh::VirtualNode.HealthCheck":{"attributes":{},"description":"An object that represents the health check policy for a virtual node\'s listener.","properties":{"HealthyThreshold":"The number of consecutive successful health checks that must occur before declaring listener healthy.","IntervalMillis":"The time period in milliseconds between each health check execution.","Path":"The destination path for the health check request. This value is only used if the specified protocol is HTTP or HTTP/2. For any other protocol, this value is ignored.","Port":"The destination port for the health check request. This port must match the port defined in the `PortMapping` for the listener.","Protocol":"The protocol for the health check request. If you specify `grpc` , then your service must conform to the [GRPC Health Checking Protocol](https://docs.aws.amazon.com/https://github.com/grpc/grpc/blob/master/doc/health-checking.md) .","TimeoutMillis":"The amount of time to wait when receiving a response from the health check, in milliseconds.","UnhealthyThreshold":"The number of consecutive failed health checks that must occur before declaring a virtual node unhealthy."}},"AWS::AppMesh::VirtualNode.HttpTimeout":{"attributes":{},"description":"An object that represents types of timeouts.","properties":{"Idle":"An object that represents an idle timeout. An idle timeout bounds the amount of time that a connection may be idle. The default value is none.","PerRequest":"An object that represents a per request timeout. The default value is 15 seconds. If you set a higher timeout, then make sure that the higher value is set for each App Mesh resource in a conversation. For example, if a virtual node backend uses a virtual router provider to route to another virtual node, then the timeout should be greater than 15 seconds for the source and destination virtual node and the route."}},"AWS::AppMesh::VirtualNode.JsonFormatRef":{"attributes":{},"description":"An object that represents the key value pairs for the JSON.","properties":{"Key":"The specified key for the JSON.","Value":"The specified value for the JSON."}},"AWS::AppMesh::VirtualNode.Listener":{"attributes":{},"description":"An object that represents a listener for a virtual node.","properties":{"ConnectionPool":"The connection pool information for the listener.","HealthCheck":"The health check information for the listener.","OutlierDetection":"The outlier detection information for the listener.","PortMapping":"The port mapping information for the listener.","TLS":"A reference to an object that represents the Transport Layer Security (TLS) properties for a listener.","Timeout":"An object that represents timeouts for different protocols."}},"AWS::AppMesh::VirtualNode.ListenerTimeout":{"attributes":{},"description":"An object that represents timeouts for different protocols.","properties":{"GRPC":"An object that represents types of timeouts.","HTTP":"An object that represents types of timeouts.","HTTP2":"An object that represents types of timeouts.","TCP":"An object that represents types of timeouts."}},"AWS::AppMesh::VirtualNode.ListenerTls":{"attributes":{},"description":"An object that represents the Transport Layer Security (TLS) properties for a listener.","properties":{"Certificate":"A reference to an object that represents a listener\'s Transport Layer Security (TLS) certificate.","Mode":"Specify one of the following modes.\\n\\n- ** STRICT – Listener only accepts connections with TLS enabled.\\n- ** PERMISSIVE – Listener accepts connections with or without TLS enabled.\\n- ** DISABLED – Listener only accepts connections without TLS.","Validation":"A reference to an object that represents a listener\'s Transport Layer Security (TLS) validation context."}},"AWS::AppMesh::VirtualNode.ListenerTlsAcmCertificate":{"attributes":{},"description":"An object that represents an AWS Certificate Manager certificate.","properties":{"CertificateArn":"The Amazon Resource Name (ARN) for the certificate. The certificate must meet specific requirements and you must have proxy authorization enabled. For more information, see [Transport Layer Security (TLS)](https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites) ."}},"AWS::AppMesh::VirtualNode.ListenerTlsCertificate":{"attributes":{},"description":"An object that represents a listener\'s Transport Layer Security (TLS) certificate.","properties":{"ACM":"A reference to an object that represents an AWS Certificate Manager certificate.","File":"A reference to an object that represents a local file certificate.","SDS":"A reference to an object that represents a listener\'s Secret Discovery Service certificate."}},"AWS::AppMesh::VirtualNode.ListenerTlsFileCertificate":{"attributes":{},"description":"An object that represents a local file certificate. The certificate must meet specific requirements and you must have proxy authorization enabled. For more information, see [Transport Layer Security (TLS)](https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites) .","properties":{"CertificateChain":"The certificate chain for the certificate.","PrivateKey":"The private key for a certificate stored on the file system of the virtual node that the proxy is running on."}},"AWS::AppMesh::VirtualNode.ListenerTlsSdsCertificate":{"attributes":{},"description":"An object that represents the listener\'s Secret Discovery Service certificate. The proxy must be configured with a local SDS provider via a Unix Domain Socket. See App Mesh [TLS documentation](https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html) for more info.","properties":{"SecretName":"A reference to an object that represents the name of the secret requested from the Secret Discovery Service provider representing Transport Layer Security (TLS) materials like a certificate or certificate chain."}},"AWS::AppMesh::VirtualNode.ListenerTlsValidationContext":{"attributes":{},"description":"An object that represents a listener\'s Transport Layer Security (TLS) validation context.","properties":{"SubjectAlternativeNames":"A reference to an object that represents the SANs for a listener\'s Transport Layer Security (TLS) validation context.","Trust":"A reference to where to retrieve the trust chain when validating a peer’s Transport Layer Security (TLS) certificate."}},"AWS::AppMesh::VirtualNode.ListenerTlsValidationContextTrust":{"attributes":{},"description":"An object that represents a listener\'s Transport Layer Security (TLS) validation context trust.","properties":{"File":"An object that represents a Transport Layer Security (TLS) validation context trust for a local file.","SDS":"A reference to an object that represents a listener\'s Transport Layer Security (TLS) Secret Discovery Service validation context trust."}},"AWS::AppMesh::VirtualNode.Logging":{"attributes":{},"description":"An object that represents the logging information for a virtual node.","properties":{"AccessLog":"The access log configuration for a virtual node."}},"AWS::AppMesh::VirtualNode.LoggingFormat":{"attributes":{},"description":"An object that represents the format for the logs.","properties":{"Json":"The logging format for JSON.","Text":"The logging format for text."}},"AWS::AppMesh::VirtualNode.OutlierDetection":{"attributes":{},"description":"An object that represents the outlier detection for a virtual node\'s listener.","properties":{"BaseEjectionDuration":"The base amount of time for which a host is ejected.","Interval":"The time interval between ejection sweep analysis.","MaxEjectionPercent":"Maximum percentage of hosts in load balancing pool for upstream service that can be ejected. Will eject at least one host regardless of the value.","MaxServerErrors":"Number of consecutive `5xx` errors required for ejection."}},"AWS::AppMesh::VirtualNode.PortMapping":{"attributes":{},"description":"An object representing a virtual node or virtual router listener port mapping.","properties":{"Port":"The port used for the port mapping.","Protocol":"The protocol used for the port mapping. Specify `http` , `http2` , `grpc` , or `tcp` ."}},"AWS::AppMesh::VirtualNode.ServiceDiscovery":{"attributes":{},"description":"An object that represents the service discovery information for a virtual node.","properties":{"AWSCloudMap":"Specifies any AWS Cloud Map information for the virtual node.","DNS":"Specifies the DNS information for the virtual node."}},"AWS::AppMesh::VirtualNode.SubjectAlternativeNameMatchers":{"attributes":{},"description":"An object that represents the methods by which a subject alternative name on a peer Transport Layer Security (TLS) certificate can be matched.","properties":{"Exact":"The values sent must match the specified values exactly."}},"AWS::AppMesh::VirtualNode.SubjectAlternativeNames":{"attributes":{},"description":"An object that represents the subject alternative names secured by the certificate.","properties":{"Match":"An object that represents the criteria for determining a SANs match."}},"AWS::AppMesh::VirtualNode.TcpTimeout":{"attributes":{},"description":"An object that represents types of timeouts.","properties":{"Idle":"An object that represents an idle timeout. An idle timeout bounds the amount of time that a connection may be idle. The default value is none."}},"AWS::AppMesh::VirtualNode.TlsValidationContext":{"attributes":{},"description":"An object that represents how the proxy will validate its peer during Transport Layer Security (TLS) negotiation.","properties":{"SubjectAlternativeNames":"A reference to an object that represents the SANs for a Transport Layer Security (TLS) validation context. If you don\'t specify SANs on the *terminating* mesh endpoint, the Envoy proxy for that node doesn\'t verify the SAN on a peer client certificate. If you don\'t specify SANs on the *originating* mesh endpoint, the SAN on the certificate provided by the terminating endpoint must match the mesh endpoint service discovery configuration. Since SPIRE vended certificates have a SPIFFE ID as a name, you must set the SAN since the name doesn\'t match the service discovery name.","Trust":"A reference to where to retrieve the trust chain when validating a peer’s Transport Layer Security (TLS) certificate."}},"AWS::AppMesh::VirtualNode.TlsValidationContextAcmTrust":{"attributes":{},"description":"An object that represents a Transport Layer Security (TLS) validation context trust for an AWS Certificate Manager certificate.","properties":{"CertificateAuthorityArns":"One or more ACM Amazon Resource Name (ARN)s."}},"AWS::AppMesh::VirtualNode.TlsValidationContextFileTrust":{"attributes":{},"description":"An object that represents a Transport Layer Security (TLS) validation context trust for a local file.","properties":{"CertificateChain":"The certificate trust chain for a certificate stored on the file system of the virtual node that the proxy is running on."}},"AWS::AppMesh::VirtualNode.TlsValidationContextSdsTrust":{"attributes":{},"description":"An object that represents a Transport Layer Security (TLS) Secret Discovery Service validation context trust. The proxy must be configured with a local SDS provider via a Unix Domain Socket. See App Mesh [TLS documentation](https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html) for more info.","properties":{"SecretName":"A reference to an object that represents the name of the secret for a Transport Layer Security (TLS) Secret Discovery Service validation context trust."}},"AWS::AppMesh::VirtualNode.TlsValidationContextTrust":{"attributes":{},"description":"An object that represents a Transport Layer Security (TLS) validation context trust.","properties":{"ACM":"A reference to an object that represents a Transport Layer Security (TLS) validation context trust for an AWS Certificate Manager certificate.","File":"An object that represents a Transport Layer Security (TLS) validation context trust for a local file.","SDS":"A reference to an object that represents a Transport Layer Security (TLS) Secret Discovery Service validation context trust."}},"AWS::AppMesh::VirtualNode.VirtualNodeConnectionPool":{"attributes":{},"description":"An object that represents the type of virtual node connection pool.\\n\\nOnly one protocol is used at a time and should be the same protocol as the one chosen under port mapping.\\n\\nIf not present the default value for `maxPendingRequests` is `2147483647` .","properties":{"GRPC":"An object that represents a type of connection pool.","HTTP":"An object that represents a type of connection pool.","HTTP2":"An object that represents a type of connection pool.","TCP":"An object that represents a type of connection pool."}},"AWS::AppMesh::VirtualNode.VirtualNodeGrpcConnectionPool":{"attributes":{},"description":"An object that represents a type of connection pool.","properties":{"MaxRequests":"Maximum number of inflight requests Envoy can concurrently support across hosts in upstream cluster."}},"AWS::AppMesh::VirtualNode.VirtualNodeHttp2ConnectionPool":{"attributes":{},"description":"An object that represents a type of connection pool.","properties":{"MaxRequests":"Maximum number of inflight requests Envoy can concurrently support across hosts in upstream cluster."}},"AWS::AppMesh::VirtualNode.VirtualNodeHttpConnectionPool":{"attributes":{},"description":"An object that represents a type of connection pool.","properties":{"MaxConnections":"Maximum number of outbound TCP connections Envoy can establish concurrently with all hosts in upstream cluster.","MaxPendingRequests":"Number of overflowing requests after `max_connections` Envoy will queue to upstream cluster."}},"AWS::AppMesh::VirtualNode.VirtualNodeSpec":{"attributes":{},"description":"An object that represents the specification of a virtual node.","properties":{"BackendDefaults":"A reference to an object that represents the defaults for backends.","Backends":"The backends that the virtual node is expected to send outbound traffic to.\\n\\n> App Mesh doesn\'t validate the existence of those virtual services specified in backends. This is to prevent a cyclic dependency between virtual nodes and virtual services creation. Make sure the virtual service name is correct. The virtual service can be created afterwards if it doesn\'t already exist.","Listeners":"The listener that the virtual node is expected to receive inbound traffic from. You can specify one listener.","Logging":"The inbound and outbound access logging information for the virtual node.","ServiceDiscovery":"The service discovery information for the virtual node. If your virtual node does not expect ingress traffic, you can omit this parameter. If you specify a `listener` , then you must specify service discovery information."}},"AWS::AppMesh::VirtualNode.VirtualNodeTcpConnectionPool":{"attributes":{},"description":"An object that represents a type of connection pool.","properties":{"MaxConnections":"Maximum number of outbound TCP connections Envoy can establish concurrently with all hosts in upstream cluster."}},"AWS::AppMesh::VirtualNode.VirtualServiceBackend":{"attributes":{},"description":"An object that represents a virtual service backend for a virtual node.","properties":{"ClientPolicy":"A reference to an object that represents the client policy for a backend.","VirtualServiceName":"The name of the virtual service that is acting as a virtual node backend.\\n\\n> App Mesh doesn\'t validate the existence of those virtual services specified in backends. This is to prevent a cyclic dependency between virtual nodes and virtual services creation. Make sure the virtual service name is correct. The virtual service can be created afterwards if it doesn\'t already exist."}},"AWS::AppMesh::VirtualRouter":{"attributes":{"Arn":"The full Amazon Resource Name (ARN) for the virtual router.","MeshName":"The name of the service mesh that the virtual router resides in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then it\'s the ID of the account that shared the mesh with your account. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Ref":"`Ref` returns the resource ARN. For example:\\n\\n`{ \\"Ref\\": \\"myVirtualRouter\\" }`\\n\\nWhen you pass the logical ID of an `AWS::AppMesh::VirtualRouter` resource to the intrinsic Ref function, the function returns the virtual router ARN, such as `arn:aws:appmesh: *us-east-1* : *555555555555* :virtualRouter/ *myVirtualRouter*` .","ResourceOwner":"The AWS IAM account ID of the resource owner. If the account ID is not your own, then it\'s the ID of the mesh owner or of another account that the mesh is shared with. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Uid":"The unique identifier for the virtual router.","VirtualRouterName":"The name of the virtual router."},"description":"Creates a virtual router within a service mesh.\\n\\nSpecify a `listener` for any inbound traffic that your virtual router receives. Create a virtual router for each protocol and port that you need to route. Virtual routers handle traffic for one or more virtual services within your mesh. After you create your virtual router, create and associate routes for your virtual router that direct incoming requests to different virtual nodes.\\n\\nFor more information about virtual routers, see [Virtual routers](https://docs.aws.amazon.com/app-mesh/latest/userguide/virtual_routers.html) .","properties":{"MeshName":"The name of the service mesh to create the virtual router in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then the account that you specify must share the mesh with your account before you can create the resource in the service mesh. For more information about mesh sharing, see [Working with shared meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Spec":"The virtual router specification to apply.","Tags":"Optional metadata that you can apply to the virtual router to assist with categorization and organization. Each tag consists of a key and an optional value, both of which you define. Tag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters.","VirtualRouterName":"The name to use for the virtual router."}},"AWS::AppMesh::VirtualRouter.PortMapping":{"attributes":{},"description":"An object representing a virtual router listener port mapping.","properties":{"Port":"The port used for the port mapping.","Protocol":"The protocol used for the port mapping. Specify one protocol."}},"AWS::AppMesh::VirtualRouter.VirtualRouterListener":{"attributes":{},"description":"An object that represents a virtual router listener.","properties":{"PortMapping":"The port mapping information for the listener."}},"AWS::AppMesh::VirtualRouter.VirtualRouterSpec":{"attributes":{},"description":"An object that represents the specification of a virtual router.","properties":{"Listeners":"The listeners that the virtual router is expected to receive inbound traffic from."}},"AWS::AppMesh::VirtualService":{"attributes":{"Arn":"The full Amazon Resource Name (ARN) for the virtual service.","MeshName":"The name of the service mesh that the virtual service resides in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then it\'s the ID of the account that shared the mesh with your account. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Ref":"`Ref` returns the resource ARN. For example:\\n\\n`{ \\"Ref\\": \\"myVirtualService\\" }`\\n\\nWhen you pass the logical ID of an `AWS::AppMesh::VirtualService` resource to the intrinsic Ref function, the function returns the virtual service ARN, such as `arn:aws:appmesh: *us-east-1* : *555555555555* :virtualService/ *myVirtualService*` .","ResourceOwner":"The AWS IAM account ID of the resource owner. If the account ID is not your own, then it\'s the ID of the mesh owner or of another account that the mesh is shared with. For more information about mesh sharing, see [Working with Shared Meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Uid":"The unique identifier for the virtual service.","VirtualServiceName":"The name of the virtual service."},"description":"Creates a virtual service within a service mesh.\\n\\nA virtual service is an abstraction of a real service that is provided by a virtual node directly or indirectly by means of a virtual router. Dependent services call your virtual service by its `virtualServiceName` , and those requests are routed to the virtual node or virtual router that is specified as the provider for the virtual service.\\n\\nFor more information about virtual services, see [Virtual services](https://docs.aws.amazon.com/app-mesh/latest/userguide/virtual_services.html) .","properties":{"MeshName":"The name of the service mesh to create the virtual service in.","MeshOwner":"The AWS IAM account ID of the service mesh owner. If the account ID is not your own, then the account that you specify must share the mesh with your account before you can create the resource in the service mesh. For more information about mesh sharing, see [Working with shared meshes](https://docs.aws.amazon.com/app-mesh/latest/userguide/sharing.html) .","Spec":"The virtual service specification to apply.","Tags":"Optional metadata that you can apply to the virtual service to assist with categorization and organization. Each tag consists of a key and an optional value, both of which you define. Tag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters.","VirtualServiceName":"The name to use for the virtual service."}},"AWS::AppMesh::VirtualService.VirtualNodeServiceProvider":{"attributes":{},"description":"An object that represents a virtual node service provider.","properties":{"VirtualNodeName":"The name of the virtual node that is acting as a service provider."}},"AWS::AppMesh::VirtualService.VirtualRouterServiceProvider":{"attributes":{},"description":"An object that represents a virtual node service provider.","properties":{"VirtualRouterName":"The name of the virtual router that is acting as a service provider."}},"AWS::AppMesh::VirtualService.VirtualServiceProvider":{"attributes":{},"description":"An object that represents the provider for a virtual service.","properties":{"VirtualNode":"The virtual node associated with a virtual service.","VirtualRouter":"The virtual router associated with a virtual service."}},"AWS::AppMesh::VirtualService.VirtualServiceSpec":{"attributes":{},"description":"An object that represents the specification of a virtual service.","properties":{"Provider":"The App Mesh object that is acting as the provider for a virtual service. You can specify a single virtual node or virtual router."}},"AWS::AppRunner::AutoScalingConfiguration":{"attributes":{"AutoScalingConfigurationArn":"The Amazon Resource Name (ARN) of this auto scaling configuration.","AutoScalingConfigurationRevision":"The revision of this auto scaling configuration. It\'s unique among all the active configurations that share the same `AutoScalingConfigurationName` .","Latest":"It\'s set to true for the configuration with the highest `Revision` among all configurations that share the same `AutoScalingConfigurationName` . It\'s set to false otherwise. App Runner temporarily doubles the number of provisioned instances during deployments, to maintain the same capacity for both old and new code.","Ref":""},"description":"Specify an AWS App Runner Automatic Scaling configuration by using the `AWS::AppRunner::AutoScalingConfiguration` resource in an AWS CloudFormation template. \\n\\nThe `AWS::AppRunner::AutoScalingConfiguration` resource is an AWS App Runner resource type that specifies an App Runner automatic scaling configuration.\\n\\nApp Runner requires this resource to set non-default auto scaling settings for instances used to process the web requests. You can share an auto scaling configuration across multiple services.\\n\\nCreate multiple revisions of a configuration by calling this action multiple times using the same `AutoScalingConfigurationName` . The call returns incremental `AutoScalingConfigurationRevision` values. When you create a service and configure an auto scaling configuration resource, the service uses the latest active revision of the auto scaling configuration by default. You can optionally configure the service to use a specific revision.\\n\\nConfigure a higher `MinSize` to increase the spread of your App Runner service over more Availability Zones in the AWS Region . The tradeoff is a higher minimal cost.\\n\\nConfigure a lower `MaxSize` to control your cost. The tradeoff is lower responsiveness during peak demand.","properties":{"AutoScalingConfigurationName":"The customer-provided auto scaling configuration name. It can be used in multiple revisions of a configuration.","MaxConcurrency":"The maximum number of concurrent requests that an instance processes. If the number of concurrent requests exceeds this limit, App Runner scales the service up.","MaxSize":"The maximum number of instances that a service scales up to. At most `MaxSize` instances actively serve traffic for your service.","MinSize":"The minimum number of instances that App Runner provisions for a service. The service always has at least `MinSize` provisioned instances. Some of them actively serve traffic. The rest of them (provisioned and inactive instances) are a cost-effective compute capacity reserve and are ready to be quickly activated. You pay for memory usage of all the provisioned instances. You pay for CPU usage of only the active subset.\\n\\nApp Runner temporarily doubles the number of provisioned instances during deployments, to maintain the same capacity for both old and new code.","Tags":"A list of metadata items that you can associate with your auto scaling configuration resource. A tag is a key-value pair."}},"AWS::AppRunner::ObservabilityConfiguration":{"attributes":{"Latest":"It\'s set to `true` for the configuration with the highest `Revision` among all configurations that share the same `ObservabilityConfigurationName` . It\'s set to `false` otherwise.","ObservabilityConfigurationArn":"The Amazon Resource Name (ARN) of this observability configuration.","ObservabilityConfigurationRevision":"The revision of this observability configuration. It\'s unique among all the active configurations ( `\\"Status\\": \\"ACTIVE\\"` ) that share the same `ObservabilityConfigurationName` .","Ref":""},"description":"Specify an AWS App Runner observability configuration by using the `AWS::AppRunner::ObservabilityConfiguration` resource in an AWS CloudFormation template. \\n\\nThe `AWS::AppRunner::ObservabilityConfiguration` resource is an AWS App Runner resource type that specifies an App Runner observability configuration.\\n\\nApp Runner requires this resource when you specify App Runner services and you want to enable non-default observability features. You can share an observability configuration across multiple services.\\n\\nCreate multiple revisions of a configuration by specifying this resource multiple times using the same `ObservabilityConfigurationName` . App Runner creates multiple resources with incremental `ObservabilityConfigurationRevision` values. When you specify a service and configure an observability configuration resource, the service uses the latest active revision of the observability configuration by default. You can optionally configure the service to use a specific revision.\\n\\nThe observability configuration resource is designed to configure multiple features (currently one feature, tracing). This resource takes optional parameters that describe the configuration of these features (currently one parameter, `TraceConfiguration` ). If you don\'t specify a feature parameter, App Runner doesn\'t enable the feature.","properties":{"ObservabilityConfigurationName":"A name for the observability configuration. When you use it for the first time in an AWS Region , App Runner creates revision number `1` of this name. When you use the same name in subsequent calls, App Runner creates incremental revisions of the configuration.\\n\\n> The name `DefaultConfiguration` is reserved. You can\'t use it to create a new observability configuration, and you can\'t create a revision of it.\\n> \\n> When you want to use your own observability configuration for your App Runner service, *create a configuration with a different name* , and then provide it when you create or update your service. \\n\\nIf you don\'t specify a name, AWS CloudFormation generates a name for your observability configuration.","Tags":"A list of metadata items that you can associate with your observability configuration resource. A tag is a key-value pair.","TraceConfiguration":"The configuration of the tracing feature within this observability configuration. If you don\'t specify it, App Runner doesn\'t enable tracing."}},"AWS::AppRunner::ObservabilityConfiguration.TraceConfiguration":{"attributes":{},"description":"Describes the configuration of the tracing feature within an AWS App Runner observability configuration.","properties":{"Vendor":"The implementation provider chosen for tracing App Runner services."}},"AWS::AppRunner::Service":{"attributes":{"Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the ARN of the App Runner service.","ServiceArn":"The Amazon Resource Name (ARN) of this service.","ServiceId":"An ID that App Runner generated for this service. It\'s unique within the AWS Region .","ServiceUrl":"A subdomain URL that App Runner generated for this service. You can use this URL to access your service web application.","Status":"The current state of the App Runner service. These particular values mean the following.\\n\\n- `CREATE_FAILED` – The service failed to create. To troubleshoot this failure, read the failure events and logs, change any parameters that need to be fixed, and retry the call to create the service.\\n\\nThe failed service isn\'t usable, and still counts towards your service quota. When you\'re done analyzing the failure, delete the service.\\n- `DELETE_FAILED` – The service failed to delete and can\'t be successfully recovered. Retry the service deletion call to ensure that all related resources are removed."},"description":"Specify an AWS App Runner service by using the `AWS::AppRunner::Service` resource in an AWS CloudFormation template. \\n\\nThe `AWS::AppRunner::Service` resource is an AWS App Runner resource type that specifies an App Runner service.","properties":{"AutoScalingConfigurationArn":"The Amazon Resource Name (ARN) of an App Runner automatic scaling configuration resource that you want to associate with your service. If not provided, App Runner associates the latest revision of a default auto scaling configuration.\\n\\nSpecify an ARN with a name and a revision number to associate that revision. For example: `arn:aws:apprunner:us-east-1:123456789012:autoscalingconfiguration/high-availability/3`\\n\\nSpecify just the name to associate the latest revision. For example: `arn:aws:apprunner:us-east-1:123456789012:autoscalingconfiguration/high-availability`","EncryptionConfiguration":"An optional custom encryption key that App Runner uses to encrypt the copy of your source repository that it maintains and your service logs. By default, App Runner uses an AWS managed key .","HealthCheckConfiguration":"The settings for the health check that AWS App Runner performs to monitor the health of the App Runner service.","InstanceConfiguration":"The runtime configuration of instances (scaling units) of your service.","NetworkConfiguration":"Configuration settings related to network traffic of the web application that the App Runner service runs.","ObservabilityConfiguration":"The observability configuration of your service.","ServiceName":"A name for the App Runner service. It must be unique across all the running App Runner services in your AWS account in the AWS Region .\\n\\nIf you don\'t specify a name, AWS CloudFormation generates a name for your service.","SourceConfiguration":"The source to deploy to the App Runner service. It can be a code or an image repository.","Tags":"An optional list of metadata items that you can associate with the App Runner service resource. A tag is a key-value pair."}},"AWS::AppRunner::Service.AuthenticationConfiguration":{"attributes":{},"description":"Describes resources needed to authenticate access to some source repositories. The specific resource depends on the repository provider.","properties":{"AccessRoleArn":"The Amazon Resource Name (ARN) of the IAM role that grants the App Runner service access to a source repository. It\'s required for ECR image repositories (but not for ECR Public repositories).","ConnectionArn":"The Amazon Resource Name (ARN) of the App Runner connection that enables the App Runner service to connect to a source repository. It\'s required for GitHub code repositories."}},"AWS::AppRunner::Service.CodeConfiguration":{"attributes":{},"description":"Describes the configuration that AWS App Runner uses to build and run an App Runner service from a source code repository.","properties":{"CodeConfigurationValues":"The basic configuration for building and running the App Runner service. Use it to quickly launch an App Runner service without providing a `apprunner.yaml` file in the source code repository (or ignoring the file if it exists).","ConfigurationSource":"The source of the App Runner configuration. Values are interpreted as follows:\\n\\n- `REPOSITORY` – App Runner reads configuration values from the `apprunner.yaml` file in the source code repository and ignores `CodeConfigurationValues` .\\n- `API` – App Runner uses configuration values provided in `CodeConfigurationValues` and ignores the `apprunner.yaml` file in the source code repository."}},"AWS::AppRunner::Service.CodeConfigurationValues":{"attributes":{},"description":"Describes the basic configuration needed for building and running an AWS App Runner service. This type doesn\'t support the full set of possible configuration options. Fur full configuration capabilities, use a `apprunner.yaml` file in the source code repository.","properties":{"BuildCommand":"The command App Runner runs to build your application.","Port":"The port that your application listens to in the container.\\n\\nDefault: `8080`","Runtime":"A runtime environment type for building and running an App Runner service. It represents a programming language runtime.","RuntimeEnvironmentSecrets":"An array of key-value pairs representing the secrets and parameters that get referenced to your service as an environment variable. The supported values are either the full Amazon Resource Name (ARN) of the AWS Secrets Manager secret or the full ARN of the parameter in the AWS Systems Manager Parameter Store.\\n\\n> - If the AWS Systems Manager Parameter Store parameter exists in the same AWS Region as the service that you\'re launching, you can use either the full ARN or name of the secret. If the parameter exists in a different Region, then the full ARN must be specified.\\n> - Currently, cross account referencing of AWS Systems Manager Parameter Store parameter is not supported.","RuntimeEnvironmentVariables":"The environment variables that are available to your running AWS App Runner service. An array of key-value pairs.","StartCommand":"The command App Runner runs to start your application."}},"AWS::AppRunner::Service.CodeRepository":{"attributes":{},"description":"Describes a source code repository.","properties":{"CodeConfiguration":"Configuration for building and running the service from a source code repository.\\n\\n> `CodeConfiguration` is required only for `CreateService` request.","RepositoryUrl":"The location of the repository that contains the source code.","SourceCodeVersion":"The version that should be used within the source code repository."}},"AWS::AppRunner::Service.EgressConfiguration":{"attributes":{},"description":"Describes configuration settings related to outbound network traffic of an AWS App Runner service.","properties":{"EgressType":"The type of egress configuration.\\n\\nSet to `DEFAULT` for access to resources hosted on public networks.\\n\\nSet to `VPC` to associate your service to a custom VPC specified by `VpcConnectorArn` .","VpcConnectorArn":"The Amazon Resource Name (ARN) of the App Runner VPC connector that you want to associate with your App Runner service. Only valid when `EgressType = VPC` ."}},"AWS::AppRunner::Service.EncryptionConfiguration":{"attributes":{},"description":"Describes a custom encryption key that AWS App Runner uses to encrypt copies of the source repository and service logs.","properties":{"KmsKey":"The ARN of the KMS key that\'s used for encryption."}},"AWS::AppRunner::Service.HealthCheckConfiguration":{"attributes":{},"description":"Describes the settings for the health check that AWS App Runner performs to monitor the health of a service.","properties":{"HealthyThreshold":"The number of consecutive checks that must succeed before App Runner decides that the service is healthy.\\n\\nDefault: `1`","Interval":"The time interval, in seconds, between health checks.\\n\\nDefault: `5`","Path":"The URL that health check requests are sent to.\\n\\n`Path` is only applicable when you set `Protocol` to `HTTP` .\\n\\nDefault: `\\"/\\"`","Protocol":"The IP protocol that App Runner uses to perform health checks for your service.\\n\\nIf you set `Protocol` to `HTTP` , App Runner sends health check requests to the HTTP path specified by `Path` .\\n\\nDefault: `TCP`","Timeout":"The time, in seconds, to wait for a health check response before deciding it failed.\\n\\nDefault: `2`","UnhealthyThreshold":"The number of consecutive checks that must fail before App Runner decides that the service is unhealthy.\\n\\nDefault: `5`"}},"AWS::AppRunner::Service.ImageConfiguration":{"attributes":{},"description":"Describes the configuration that AWS App Runner uses to run an App Runner service using an image pulled from a source image repository.","properties":{"Port":"The port that your application listens to in the container.\\n\\nDefault: `8080`","RuntimeEnvironmentSecrets":"An array of key-value pairs representing the secrets and parameters that get referenced to your service as an environment variable. The supported values are either the full Amazon Resource Name (ARN) of the AWS Secrets Manager secret or the full ARN of the parameter in the AWS Systems Manager Parameter Store.\\n\\n> - If the AWS Systems Manager Parameter Store parameter exists in the same AWS Region as the service that you\'re launching, you can use either the full ARN or name of the secret. If the parameter exists in a different Region, then the full ARN must be specified.\\n> - Currently, cross account referencing of AWS Systems Manager Parameter Store parameter is not supported.","RuntimeEnvironmentVariables":"Environment variables that are available to your running App Runner service. An array of key-value pairs.","StartCommand":"An optional command that App Runner runs to start the application in the source image. If specified, this command overrides the Docker image’s default start command."}},"AWS::AppRunner::Service.ImageRepository":{"attributes":{},"description":"Describes a source image repository.","properties":{"ImageConfiguration":"Configuration for running the identified image.","ImageIdentifier":"The identifier of an image.\\n\\nFor an image in Amazon Elastic Container Registry (Amazon ECR), this is an image name. For the image name format, see [Pulling an image](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-pull-ecr-image.html) in the *Amazon ECR User Guide* .","ImageRepositoryType":"The type of the image repository. This reflects the repository provider and whether the repository is private or public."}},"AWS::AppRunner::Service.IngressConfiguration":{"attributes":{},"description":"Network configuration settings for inbound network traffic.","properties":{"IsPubliclyAccessible":"Specifies whether your App Runner service is publicly accessible. To make the service publicly accessible set it to `True` . To make the service privately accessible, from only within an Amazon VPC set it to `False` ."}},"AWS::AppRunner::Service.InstanceConfiguration":{"attributes":{},"description":"Describes the runtime configuration of an AWS App Runner service instance (scaling unit).","properties":{"Cpu":"The number of CPU units reserved for each instance of your App Runner service.\\n\\nDefault: `1 vCPU`","InstanceRoleArn":"The Amazon Resource Name (ARN) of an IAM role that provides permissions to your App Runner service. These are permissions that your code needs when it calls any AWS APIs.","Memory":"The amount of memory, in MB or GB, reserved for each instance of your App Runner service.\\n\\nDefault: `2 GB`"}},"AWS::AppRunner::Service.KeyValuePair":{"attributes":{},"description":"Describes a key-value pair, which is a string-to-string mapping.","properties":{"Name":"The key name string to map to a value.","Value":"The value string to which the key name is mapped."}},"AWS::AppRunner::Service.NetworkConfiguration":{"attributes":{},"description":"Describes configuration settings related to network traffic of an AWS App Runner service. Consists of embedded objects for each configurable network feature.","properties":{"EgressConfiguration":"Network configuration settings for outbound message traffic.","IngressConfiguration":"Network configuration settings for inbound message traffic."}},"AWS::AppRunner::Service.ServiceObservabilityConfiguration":{"attributes":{},"description":"Describes the observability configuration of an AWS App Runner service. These are additional observability features, like tracing, that you choose to enable. They\'re configured in a separate resource that you associate with your service.","properties":{"ObservabilityConfigurationArn":"The Amazon Resource Name (ARN) of the observability configuration that is associated with the service. Specified only when `ObservabilityEnabled` is `true` .\\n\\nSpecify an ARN with a name and a revision number to associate that revision. For example: `arn:aws:apprunner:us-east-1:123456789012:observabilityconfiguration/xray-tracing/3`\\n\\nSpecify just the name to associate the latest revision. For example: `arn:aws:apprunner:us-east-1:123456789012:observabilityconfiguration/xray-tracing`","ObservabilityEnabled":"When `true` , an observability configuration resource is associated with the service, and an `ObservabilityConfigurationArn` is specified."}},"AWS::AppRunner::Service.SourceCodeVersion":{"attributes":{},"description":"Identifies a version of code that AWS App Runner refers to within a source code repository.","properties":{"Type":"The type of version identifier.\\n\\nFor a git-based repository, branches represent versions.","Value":"A source code version.\\n\\nFor a git-based repository, a branch name maps to a specific version. App Runner uses the most recent commit to the branch."}},"AWS::AppRunner::Service.SourceConfiguration":{"attributes":{},"description":"Describes the source deployed to an AWS App Runner service. It can be a code or an image repository.","properties":{"AuthenticationConfiguration":"Describes the resources that are needed to authenticate access to some source repositories.","AutoDeploymentsEnabled":"If `true` , continuous integration from the source repository is enabled for the App Runner service. Each repository change (including any source code commit or new image version) starts a deployment.\\n\\nDefault: App Runner sets to `false` for a source image that uses an ECR Public repository or an ECR repository that\'s in an AWS account other than the one that the service is in. App Runner sets to `true` in all other cases (which currently include a source code repository or a source image using a same-account ECR repository).","CodeRepository":"The description of a source code repository.\\n\\nYou must provide either this member or `ImageRepository` (but not both).","ImageRepository":"The description of a source image repository.\\n\\nYou must provide either this member or `CodeRepository` (but not both)."}},"AWS::AppRunner::VpcConnector":{"attributes":{"Ref":"","VpcConnectorArn":"The Amazon Resource Name (ARN) of this VPC connector.","VpcConnectorRevision":"The revision of this VPC connector. It\'s unique among all the active connectors ( `\\"Status\\": \\"ACTIVE\\"` ) that share the same `Name` .\\n\\n> At this time, App Runner supports only one revision per name."},"description":"Specify an AWS App Runner VPC connector by using the `AWS::AppRunner::VpcConnector` resource in an AWS CloudFormation template. \\n\\nThe `AWS::AppRunner::VpcConnector` resource is an AWS App Runner resource type that specifies an App Runner VPC connector.\\n\\nApp Runner requires this resource when you want to associate your App Runner service to a custom Amazon Virtual Private Cloud ( Amazon VPC ).","properties":{"SecurityGroups":"A list of IDs of security groups that App Runner should use for access to AWS resources under the specified subnets. If not specified, App Runner uses the default security group of the Amazon VPC. The default security group allows all outbound traffic.","Subnets":"A list of IDs of subnets that App Runner should use when it associates your service with a custom Amazon VPC. Specify IDs of subnets of a single Amazon VPC. App Runner determines the Amazon VPC from the subnets you specify.\\n\\n> App Runner currently only provides support for IPv4.","Tags":"A list of metadata items that you can associate with your VPC connector resource. A tag is a key-value pair.","VpcConnectorName":"A name for the VPC connector.\\n\\nIf you don\'t specify a name, AWS CloudFormation generates a name for your VPC connector."}},"AWS::AppRunner::VpcIngressConnection":{"attributes":{"DomainName":"The domain name associated with the VPC Ingress Connection resource.","Ref":"","Status":"The current status of the VPC Ingress Connection. The VPC Ingress Connection displays one of the following statuses: `AVAILABLE` , `PENDING_CREATION` , `PENDING_DELETION` , `FAILED_CREATION` , `FAILED_DELETION` , `PENDNG_UPDATE` , `FAILED_UPDATE` , and `DELETED` .","VpcIngressConnectionArn":"The Amazon Resource Name (ARN) of the VPC Ingress Connection."},"description":"Specify an AWS App Runner VPC Ingress Connection by using the `AWS::AppRunner::VpcIngressConnection` resource in an AWS CloudFormation template. \\n\\nThe `AWS::AppRunner::VpcIngressConnection` resource is an AWS App Runner resource type that specifies an App Runner VPC Ingress Connection.\\n\\nApp Runner requires this resource when you want to associate your App Runner service to an Amazon VPC endpoint.","properties":{"IngressVpcConfiguration":"Specifications for the customer’s Amazon VPC and the related AWS PrivateLink VPC endpoint that are used to create the VPC Ingress Connection resource.","ServiceArn":"The Amazon Resource Name (ARN) for this App Runner service that is used to create the VPC Ingress Connection resource.","Tags":"An optional list of metadata items that you can associate with the VPC Ingress Connection resource. A tag is a key-value pair.","VpcIngressConnectionName":"The customer-provided VPC Ingress Connection name."}},"AWS::AppRunner::VpcIngressConnection.IngressVpcConfiguration":{"attributes":{},"description":"Specifications for the customer’s VPC and related PrivateLink VPC endpoint that are used to associate with the VPC Ingress Connection resource.","properties":{"VpcEndpointId":"The ID of the VPC endpoint that your App Runner service connects to.","VpcId":"The ID of the VPC that is used for the VPC endpoint."}},"AWS::AppStream::AppBlock":{"attributes":{"Arn":"The ARN of the app block.","CreatedTime":"The time when the app block was created.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the `Arn` of the app block, such as `arn:aws:appstream:us-west-2:123456789123:app-block/abcdefg` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"This resource creates an app block. App blocks store details about the virtual hard disk that contains the files for the application in an S3 bucket. It also stores the setup script with details about how to mount the virtual hard disk. App blocks are only supported for Elastic fleets.","properties":{"Description":"The description of the app block.","DisplayName":"The display name of the app block.","Name":"The name of the app block.\\n\\n*Pattern* : `^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,100}$`","PackagingType":"The packaging type of the app block.","PostSetupScriptDetails":"The post setup script details of the app block.\\n\\nThis only applies to app blocks with PackagingType `APPSTREAM2` .","SetupScriptDetails":"The setup script details of the app block.","SourceS3Location":"The source S3 location of the app block.","Tags":"The tags of the app block."}},"AWS::AppStream::AppBlock.S3Location":{"attributes":{},"description":"The S3 location of the app block.","properties":{"S3Bucket":"The S3 bucket of the app block.","S3Key":"The S3 key of the S3 object of the virtual hard disk.\\n\\nThis is required when it\'s used by `SetupScriptDetails` and `PostSetupScriptDetails` ."}},"AWS::AppStream::AppBlock.ScriptDetails":{"attributes":{},"description":"The details of the script.","properties":{"ExecutableParameters":"The parameters used in the run path for the script.","ExecutablePath":"The run path for the script.","ScriptS3Location":"The S3 object location of the script.","TimeoutInSeconds":"The run timeout, in seconds, for the script."}},"AWS::AppStream::AppBlockBuilder":{"attributes":{"Arn":"","CreatedTime":"","Ref":""},"description":"Creates an app block builder.","properties":{"AccessEndpoints":"","AppBlockArns":"","Description":"The description of the app block builder.","DisplayName":"The display name of the app block builder.","EnableDefaultInternetAccess":"Indicates whether default internet access is enabled for the app block builder.","IamRoleArn":"The ARN of the IAM role that is applied to the app block builder.","InstanceType":"The instance type of the app block builder.","Name":"The name of the app block builder.","Platform":"The platform of the app block builder.\\n\\n`WINDOWS_SERVER_2019` is the only valid value.","Tags":"","VpcConfig":"The VPC configuration for the app block builder."}},"AWS::AppStream::AppBlockBuilder.AccessEndpoint":{"attributes":{},"description":"Describes an interface VPC endpoint (interface endpoint) that lets you create a private connection between the virtual private cloud (VPC) that you specify and AppStream 2.0. When you specify an interface endpoint for a stack, users of the stack can connect to AppStream 2.0 only through that endpoint. When you specify an interface endpoint for an image builder, administrators can connect to the image builder only through that endpoint.","properties":{"EndpointType":"The type of interface endpoint.","VpceId":"The identifier (ID) of the VPC in which the interface endpoint is used."}},"AWS::AppStream::AppBlockBuilder.VpcConfig":{"attributes":{},"description":"Describes VPC configuration information for fleets and image builders.","properties":{"SecurityGroupIds":"The identifiers of the security groups for the fleet or image builder.","SubnetIds":"The identifiers of the subnets to which a network interface is attached from the fleet instance or image builder instance. Fleet instances use one or more subnets. Image builder instances use one subnet."}},"AWS::AppStream::Application":{"attributes":{"Arn":"The ARN of the application.","CreatedTime":"The time when the application was created.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the `Arn` of the application, such as `arn:aws:appstream:us-west-2:123456789123:application/abcdefg` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"This resource creates an application. Applications store the details about how to launch applications on streaming instances. This is only supported for Elastic fleets.","properties":{"AppBlockArn":"The app block ARN with which the application should be associated.","AttributesToDelete":"A list of attributes to delete from an application.","Description":"The description of the application.","DisplayName":"The display name of the application. This name is visible to users in the application catalog.","IconS3Location":"The icon S3 location of the application.","InstanceFamilies":"The instance families the application supports.\\n\\n*Allowed Values* : `GENERAL_PURPOSE` | `GRAPHICS_G4`","LaunchParameters":"The launch parameters of the application.","LaunchPath":"The launch path of the application.","Name":"The name of the application. This name is visible to users when a name is not specified in the DisplayName property.\\n\\n*Pattern* : `^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,100}$`","Platforms":"The platforms the application supports.\\n\\n*Allowed Values* : `WINDOWS_SERVER_2019` | `AMAZON_LINUX2`","Tags":"The tags of the application.","WorkingDirectory":"The working directory of the application."}},"AWS::AppStream::Application.S3Location":{"attributes":{},"description":"The S3 location of the application icon.","properties":{"S3Bucket":"The S3 bucket of the S3 object.","S3Key":"The S3 key of the S3 object."}},"AWS::AppStream::ApplicationEntitlementAssociation":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the combination of the `StackName` , `EntitlementName` , and `ApplicationIdentifier` , such as `abcdefStack|abcdefEntitlement|abcdefApplication` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Associates an application to an entitlement.","properties":{"ApplicationIdentifier":"The identifier of the application.","EntitlementName":"The name of the entitlement.","StackName":"The name of the stack."}},"AWS::AppStream::ApplicationFleetAssociation":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns a combination of the `FleetName` and `ApplicationArn` , such as `aabcdefgFleet|arn:aws:appstream:us-west-2:123456789123:application/abcdefg` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"This resource associates the specified application with the specified fleet. This is only supported for Elastic fleets.","properties":{"ApplicationArn":"The ARN of the application.","FleetName":"The name of the fleet."}},"AWS::AppStream::DirectoryConfig":{"attributes":{},"description":"The `AWS::AppStream::DirectoryConfig` resource specifies the configuration information required to join Amazon AppStream 2.0 fleets and image builders to Microsoft Active Directory domains.","properties":{"CertificateBasedAuthProperties":"The certificate-based authentication properties used to authenticate SAML 2.0 Identity Provider (IdP) user identities to Active Directory domain-joined streaming instances.","DirectoryName":"The fully qualified name of the directory (for example, corp.example.com).","OrganizationalUnitDistinguishedNames":"The distinguished names of the organizational units for computer accounts.","ServiceAccountCredentials":"The credentials for the service account used by the streaming instance to connect to the directory. Do not use this parameter directly. Use `ServiceAccountCredentials` as an input parameter with `noEcho` as shown in the [Parameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html) . For best practices information, see [Do Not Embed Credentials in Your Templates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html#creds) ."}},"AWS::AppStream::DirectoryConfig.CertificateBasedAuthProperties":{"attributes":{},"description":"The certificate-based authentication properties used to authenticate SAML 2.0 Identity Provider (IdP) user identities to Active Directory domain-joined streaming instances.","properties":{"CertificateAuthorityArn":"The ARN of the AWS Certificate Manager Private CA resource.","Status":"The status of the certificate-based authentication properties. Fallback is turned on by default when certificate-based authentication is *Enabled* . Fallback allows users to log in using their AD domain password if certificate-based authentication is unsuccessful, or to unlock a desktop lock screen. *Enabled_no_directory_login_fallback* enables certificate-based authentication, but does not allow users to log in using their AD domain password. Users will be disconnected to re-authenticate using certificates."}},"AWS::AppStream::DirectoryConfig.ServiceAccountCredentials":{"attributes":{},"description":"The credentials for the service account used by the streaming instance to connect to the directory.","properties":{"AccountName":"The user name of the account. This account must have the following privileges: create computer objects, join computers to the domain, and change/reset the password on descendant computer objects for the organizational units specified.","AccountPassword":"The password for the account."}},"AWS::AppStream::Entitlement":{"attributes":{"CreatedTime":"The time when the entitlement was created.","LastModifiedTime":"The time when the entitlement was last modified.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the combination of the `StackName` and `Name` , such as `abcdefStack|abcdefEntitlement` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates an entitlement to control access, based on user attributes, to specific applications within a stack. Entitlements apply to SAML 2.0 federated user identities. Amazon AppStream 2.0 user pool and streaming URL users are entitled to all applications in a stack. Entitlements don\'t apply to the desktop stream view application or to applications managed by a dynamic app provider using the Dynamic Application Framework.","properties":{"AppVisibility":"Specifies whether to entitle all apps or only selected apps.","Attributes":"The attributes of the entitlement.","Description":"The description of the entitlement.","Name":"The name of the entitlement.","StackName":"The name of the stack."}},"AWS::AppStream::Entitlement.Attribute":{"attributes":{},"description":"An attribute that belongs to an entitlement. Application entitlements work by matching a supported SAML 2.0 attribute name to a value when a user identity federates to an AppStream 2.0 SAML application.","properties":{"Name":"A supported AWS IAM SAML PrincipalTag attribute that is matched to a value when a user identity federates to an AppStream 2.0 SAML application.\\n\\nThe following are supported values:\\n\\n- roles\\n- department\\n- organization\\n- groups\\n- title\\n- costCenter\\n- userType","Value":"A value that is matched to a supported SAML attribute name when a user identity federates to an AppStream 2.0 SAML application."}},"AWS::AppStream::Fleet":{"attributes":{},"description":"The `AWS::AppStream::Fleet` resource creates a fleet for Amazon AppStream 2.0. A fleet consists of streaming instances that run a specified image when using Always-On or On-Demand.","properties":{"ComputeCapacity":"The desired capacity for the fleet. This is not allowed for Elastic fleets.","Description":"The description to display.","DisconnectTimeoutInSeconds":"The amount of time that a streaming session remains active after users disconnect. If users try to reconnect to the streaming session after a disconnection or network interruption within this time interval, they are connected to their previous session. Otherwise, they are connected to a new session with a new streaming instance.\\n\\nSpecify a value between 60 and 360000.","DisplayName":"The fleet name to display.","DomainJoinInfo":"The name of the directory and organizational unit (OU) to use to join the fleet to a Microsoft Active Directory domain. This is not allowed for Elastic fleets.","EnableDefaultInternetAccess":"Enables or disables default internet access for the fleet.","FleetType":"The fleet type.\\n\\n- **ALWAYS_ON** - Provides users with instant-on access to their apps. You are charged for all running instances in your fleet, even if no users are streaming apps.\\n- **ON_DEMAND** - Provide users with access to applications after they connect, which takes one to two minutes. You are charged for instance streaming when users are connected and a small hourly fee for instances that are not streaming apps.\\n- **ELASTIC** - The pool of streaming instances is managed by Amazon AppStream 2.0. When a user selects their application or desktop to launch, they will start streaming after the app block has been downloaded and mounted to a streaming instance.\\n\\n*Allowed Values* : `ALWAYS_ON` | `ELASTIC` | `ON_DEMAND`","IamRoleArn":"The ARN of the IAM role that is applied to the fleet. To assume a role, the fleet instance calls the AWS Security Token Service `AssumeRole` API operation and passes the ARN of the role to use. The operation creates a new session with temporary credentials. AppStream 2.0 retrieves the temporary credentials and creates the *appstream_machine_role* credential profile on the instance.\\n\\nFor more information, see [Using an IAM Role to Grant Permissions to Applications and Scripts Running on AppStream 2.0 Streaming Instances](https://docs.aws.amazon.com/appstream2/latest/developerguide/using-iam-roles-to-grant-permissions-to-applications-scripts-streaming-instances.html) in the *Amazon AppStream 2.0 Administration Guide* .","IdleDisconnectTimeoutInSeconds":"The amount of time that users can be idle (inactive) before they are disconnected from their streaming session and the `DisconnectTimeoutInSeconds` time interval begins. Users are notified before they are disconnected due to inactivity. If they try to reconnect to the streaming session before the time interval specified in `DisconnectTimeoutInSeconds` elapses, they are connected to their previous session. Users are considered idle when they stop providing keyboard or mouse input during their streaming session. File uploads and downloads, audio in, audio out, and pixels changing do not qualify as user activity. If users continue to be idle after the time interval in `IdleDisconnectTimeoutInSeconds` elapses, they are disconnected.\\n\\nTo prevent users from being disconnected due to inactivity, specify a value of 0. Otherwise, specify a value between 60 and 3600.\\n\\nIf you enable this feature, we recommend that you specify a value that corresponds exactly to a whole number of minutes (for example, 60, 120, and 180). If you don\'t do this, the value is rounded to the nearest minute. For example, if you specify a value of 70, users are disconnected after 1 minute of inactivity. If you specify a value that is at the midpoint between two different minutes, the value is rounded up. For example, if you specify a value of 90, users are disconnected after 2 minutes of inactivity.","ImageArn":"The ARN of the public, private, or shared image to use.","ImageName":"The name of the image used to create the fleet.","InstanceType":"The instance type to use when launching fleet instances. The following instance types are available for non-Elastic fleets:\\n\\n- stream.standard.small\\n- stream.standard.medium\\n- stream.standard.large\\n- stream.compute.large\\n- stream.compute.xlarge\\n- stream.compute.2xlarge\\n- stream.compute.4xlarge\\n- stream.compute.8xlarge\\n- stream.memory.large\\n- stream.memory.xlarge\\n- stream.memory.2xlarge\\n- stream.memory.4xlarge\\n- stream.memory.8xlarge\\n- stream.memory.z1d.large\\n- stream.memory.z1d.xlarge\\n- stream.memory.z1d.2xlarge\\n- stream.memory.z1d.3xlarge\\n- stream.memory.z1d.6xlarge\\n- stream.memory.z1d.12xlarge\\n- stream.graphics-design.large\\n- stream.graphics-design.xlarge\\n- stream.graphics-design.2xlarge\\n- stream.graphics-design.4xlarge\\n- stream.graphics-desktop.2xlarge\\n- stream.graphics.g4dn.xlarge\\n- stream.graphics.g4dn.2xlarge\\n- stream.graphics.g4dn.4xlarge\\n- stream.graphics.g4dn.8xlarge\\n- stream.graphics.g4dn.12xlarge\\n- stream.graphics.g4dn.16xlarge\\n- stream.graphics-pro.4xlarge\\n- stream.graphics-pro.8xlarge\\n- stream.graphics-pro.16xlarge\\n\\nThe following instance types are available for Elastic fleets:\\n\\n- stream.standard.small\\n- stream.standard.medium","MaxConcurrentSessions":"The maximum number of concurrent sessions that can be run on an Elastic fleet. This setting is required for Elastic fleets, but is not used for other fleet types.","MaxUserDurationInSeconds":"The maximum amount of time that a streaming session can remain active, in seconds. If users are still connected to a streaming instance five minutes before this limit is reached, they are prompted to save any open documents before being disconnected. After this time elapses, the instance is terminated and replaced by a new instance.\\n\\nSpecify a value between 600 and 360000.","Name":"A unique name for the fleet.","Platform":"The platform of the fleet. Platform is a required setting for Elastic fleets, and is not used for other fleet types.\\n\\n*Allowed Values* : `WINDOWS_SERVER_2019` | `AMAZON_LINUX2`","SessionScriptS3Location":"The S3 location of the session scripts configuration zip file. This only applies to Elastic fleets.","StreamView":"The AppStream 2.0 view that is displayed to your users when they stream from the fleet. When `APP` is specified, only the windows of applications opened by users display. When `DESKTOP` is specified, the standard desktop that is provided by the operating system displays.\\n\\nThe default value is `APP` .","Tags":"An array of key-value pairs.","UsbDeviceFilterStrings":"The USB device filter strings that specify which USB devices a user can redirect to the fleet streaming session, when using the Windows native client. This is allowed but not required for Elastic fleets.","VpcConfig":"The VPC configuration for the fleet. This is required for Elastic fleets, but not required for other fleet types."}},"AWS::AppStream::Fleet.ComputeCapacity":{"attributes":{},"description":"The desired capacity for a fleet.","properties":{"DesiredInstances":"The desired number of streaming instances."}},"AWS::AppStream::Fleet.DomainJoinInfo":{"attributes":{},"description":"The name of the directory and organizational unit (OU) to use to join a fleet to a Microsoft Active Directory domain.","properties":{"DirectoryName":"The fully qualified name of the directory (for example, corp.example.com).","OrganizationalUnitDistinguishedName":"The distinguished name of the organizational unit for computer accounts."}},"AWS::AppStream::Fleet.S3Location":{"attributes":{},"description":"Describes the S3 location.","properties":{"S3Bucket":"The S3 bucket of the S3 object.","S3Key":"The S3 key of the S3 object."}},"AWS::AppStream::Fleet.VpcConfig":{"attributes":{},"description":"The VPC configuration information for the fleet.","properties":{"SecurityGroupIds":"The identifiers of the security groups for the fleet.","SubnetIds":"The identifiers of the subnets to which a network interface is attached from the fleet instance. Fleet instances can use one or two subnets."}},"AWS::AppStream::ImageBuilder":{"attributes":{"Ref":"","StreamingUrl":"The URL to start an image builder streaming session, returned as a string."},"description":"The `AWS::AppStream::ImageBuilder` resource creates an image builder for Amazon AppStream 2.0. An image builder is a virtual machine that is used to create an image.\\n\\nThe initial state of the image builder is `PENDING` . When it is ready, the state is `RUNNING` .","properties":{"AccessEndpoints":"The list of virtual private cloud (VPC) interface endpoint objects. Administrators can connect to the image builder only through the specified endpoints.","AppstreamAgentVersion":"The version of the AppStream 2.0 agent to use for this image builder. To use the latest version of the AppStream 2.0 agent, specify [LATEST].","Description":"The description to display.","DisplayName":"The image builder name to display.","DomainJoinInfo":"The name of the directory and organizational unit (OU) to use to join the image builder to a Microsoft Active Directory domain.","EnableDefaultInternetAccess":"Enables or disables default internet access for the image builder.","IamRoleArn":"The ARN of the IAM role that is applied to the image builder. To assume a role, the image builder calls the AWS Security Token Service `AssumeRole` API operation and passes the ARN of the role to use. The operation creates a new session with temporary credentials. AppStream 2.0 retrieves the temporary credentials and creates the *appstream_machine_role* credential profile on the instance.\\n\\nFor more information, see [Using an IAM Role to Grant Permissions to Applications and Scripts Running on AppStream 2.0 Streaming Instances](https://docs.aws.amazon.com/appstream2/latest/developerguide/using-iam-roles-to-grant-permissions-to-applications-scripts-streaming-instances.html) in the *Amazon AppStream 2.0 Administration Guide* .","ImageArn":"The ARN of the public, private, or shared image to use.","ImageName":"The name of the image used to create the image builder.","InstanceType":"The instance type to use when launching the image builder. The following instance types are available:\\n\\n- stream.standard.small\\n- stream.standard.medium\\n- stream.standard.large\\n- stream.compute.large\\n- stream.compute.xlarge\\n- stream.compute.2xlarge\\n- stream.compute.4xlarge\\n- stream.compute.8xlarge\\n- stream.memory.large\\n- stream.memory.xlarge\\n- stream.memory.2xlarge\\n- stream.memory.4xlarge\\n- stream.memory.8xlarge\\n- stream.memory.z1d.large\\n- stream.memory.z1d.xlarge\\n- stream.memory.z1d.2xlarge\\n- stream.memory.z1d.3xlarge\\n- stream.memory.z1d.6xlarge\\n- stream.memory.z1d.12xlarge\\n- stream.graphics-design.large\\n- stream.graphics-design.xlarge\\n- stream.graphics-design.2xlarge\\n- stream.graphics-design.4xlarge\\n- stream.graphics-desktop.2xlarge\\n- stream.graphics.g4dn.xlarge\\n- stream.graphics.g4dn.2xlarge\\n- stream.graphics.g4dn.4xlarge\\n- stream.graphics.g4dn.8xlarge\\n- stream.graphics.g4dn.12xlarge\\n- stream.graphics.g4dn.16xlarge\\n- stream.graphics-pro.4xlarge\\n- stream.graphics-pro.8xlarge\\n- stream.graphics-pro.16xlarge","Name":"A unique name for the image builder.","Tags":"An array of key-value pairs.","VpcConfig":"The VPC configuration for the image builder. You can specify only one subnet."}},"AWS::AppStream::ImageBuilder.AccessEndpoint":{"attributes":{},"description":"Describes an interface VPC endpoint (interface endpoint) that lets you create a private connection between the virtual private cloud (VPC) that you specify and AppStream 2.0. When you specify an interface endpoint for a stack, users of the stack can connect to AppStream 2.0 only through that endpoint. When you specify an interface endpoint for an image builder, administrators can connect to the image builder only through that endpoint.","properties":{"EndpointType":"The type of interface endpoint.","VpceId":"The identifier (ID) of the VPC in which the interface endpoint is used."}},"AWS::AppStream::ImageBuilder.DomainJoinInfo":{"attributes":{},"description":"The name of the directory and organizational unit (OU) to use to join the image builder to a Microsoft Active Directory domain.","properties":{"DirectoryName":"The fully qualified name of the directory (for example, corp.example.com).","OrganizationalUnitDistinguishedName":"The distinguished name of the organizational unit for computer accounts."}},"AWS::AppStream::ImageBuilder.VpcConfig":{"attributes":{},"description":"The VPC configuration for the image builder.","properties":{"SecurityGroupIds":"The identifiers of the security groups for the image builder.","SubnetIds":"The identifier of the subnet to which a network interface is attached from the image builder instance. An image builder instance can use one subnet."}},"AWS::AppStream::Stack":{"attributes":{},"description":"The `AWS::AppStream::Stack` resource creates a stack to start streaming applications to Amazon AppStream 2.0 users. A stack consists of an associated fleet, user access policies, and storage configurations.","properties":{"AccessEndpoints":"The list of virtual private cloud (VPC) interface endpoint objects. Users of the stack can connect to AppStream 2.0 only through the specified endpoints.","ApplicationSettings":"The persistent application settings for users of the stack. When these settings are enabled, changes that users make to applications and Windows settings are automatically saved after each session and applied to the next session.","AttributesToDelete":"The stack attributes to delete.","DeleteStorageConnectors":"*This parameter has been deprecated.*\\n\\nDeletes the storage connectors currently enabled for the stack.","Description":"The description to display.","DisplayName":"The stack name to display.","EmbedHostDomains":"The domains where AppStream 2.0 streaming sessions can be embedded in an iframe. You must approve the domains that you want to host embedded AppStream 2.0 streaming sessions.","FeedbackURL":"The URL that users are redirected to after they click the Send Feedback link. If no URL is specified, no Send Feedback link is displayed.","Name":"The name of the stack.","RedirectURL":"The URL that users are redirected to after their streaming session ends.","StorageConnectors":"The storage connectors to enable.","StreamingExperienceSettings":"The streaming protocol that you want your stack to prefer. This can be UDP or TCP. Currently, UDP is only supported in the Windows native client.","Tags":"An array of key-value pairs.","UserSettings":"The actions that are enabled or disabled for users during their streaming sessions. By default, these actions are enabled."}},"AWS::AppStream::Stack.AccessEndpoint":{"attributes":{},"description":"Describes an interface VPC endpoint (interface endpoint) that lets you create a private connection between the virtual private cloud (VPC) that you specify and AppStream 2.0. When you specify an interface endpoint for a stack, users of the stack can connect to AppStream 2.0 only through that endpoint. When you specify an interface endpoint for an image builder, administrators can connect to the image builder only through that endpoint.","properties":{"EndpointType":"The type of interface endpoint.","VpceId":"The identifier (ID) of the VPC in which the interface endpoint is used."}},"AWS::AppStream::Stack.ApplicationSettings":{"attributes":{},"description":"The persistent application settings for users of a stack.","properties":{"Enabled":"Enables or disables persistent application settings for users during their streaming sessions.","SettingsGroup":"The path prefix for the S3 bucket where users’ persistent application settings are stored. You can allow the same persistent application settings to be used across multiple stacks by specifying the same settings group for each stack."}},"AWS::AppStream::Stack.StorageConnector":{"attributes":{},"description":"A connector that enables persistent storage for users.","properties":{"ConnectorType":"The type of storage connector.","Domains":"The names of the domains for the account.","ResourceIdentifier":"The ARN of the storage connector."}},"AWS::AppStream::Stack.StreamingExperienceSettings":{"attributes":{},"description":"The streaming protocol that you want your stack to prefer. This can be UDP or TCP. Currently, UDP is only supported in the Windows native client.","properties":{"PreferredProtocol":"The preferred protocol that you want to use while streaming your application."}},"AWS::AppStream::Stack.UserSetting":{"attributes":{},"description":"Specifies an action and whether the action is enabled or disabled for users during their streaming sessions.","properties":{"Action":"The action that is enabled or disabled.","Permission":"Indicates whether the action is enabled or disabled."}},"AWS::AppStream::StackFleetAssociation":{"attributes":{},"description":"The `AWS::AppStream::StackFleetAssociation` resource associates the specified fleet with the specified stack for Amazon AppStream 2.0.","properties":{"FleetName":"The name of the fleet.\\n\\nTo associate a fleet with a stack, you must specify a dependency on the fleet resource. For more information, see [DependsOn Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) .","StackName":"The name of the stack.\\n\\nTo associate a fleet with a stack, you must specify a dependency on the stack resource. For more information, see [DependsOn Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) ."}},"AWS::AppStream::StackUserAssociation":{"attributes":{},"description":"The `AWS::AppStream::StackUserAssociation` resource associates the specified users with the specified stacks for Amazon AppStream 2.0. Users in an AppStream 2.0 user pool cannot be assigned to stacks with fleets that are joined to an Active Directory domain.","properties":{"AuthenticationType":"The authentication type for the user who is associated with the stack. You must specify USERPOOL.","SendEmailNotification":"Specifies whether a welcome email is sent to a user after the user is created in the user pool.","StackName":"The name of the stack that is associated with the user.","UserName":"The email address of the user who is associated with the stack.\\n\\n> Users\' email addresses are case-sensitive."}},"AWS::AppStream::User":{"attributes":{},"description":"The `AWS::AppStream::User` resource creates a new user in the AppStream 2.0 user pool.","properties":{"AuthenticationType":"The authentication type for the user. You must specify USERPOOL.","FirstName":"The first name, or given name, of the user.","LastName":"The last name, or surname, of the user.","MessageAction":"The action to take for the welcome email that is sent to a user after the user is created in the user pool. If you specify SUPPRESS, no email is sent. If you specify RESEND, do not specify the first name or last name of the user. If the value is null, the email is sent.\\n\\n> The temporary password in the welcome email is valid for only 7 days. If users don’t set their passwords within 7 days, you must send them a new welcome email.","UserName":"The email address of the user.\\n\\nUsers\' email addresses are case-sensitive. During login, if they specify an email address that doesn\'t use the same capitalization as the email address specified when their user pool account was created, a \\"user does not exist\\" error message displays."}},"AWS::AppSync::ApiCache":{"attributes":{},"description":"The `AWS::AppSync::ApiCache` resource represents the input of a `CreateApiCache` operation.","properties":{"ApiCachingBehavior":"Caching behavior.\\n\\n- *FULL_REQUEST_CACHING* : All requests are fully cached.\\n- *PER_RESOLVER_CACHING* : Individual resolvers that you specify are cached.","ApiId":"The GraphQL API ID.","AtRestEncryptionEnabled":"At-rest encryption flag for cache. You cannot update this setting after creation.","TransitEncryptionEnabled":"Transit encryption flag when connecting to cache. You cannot update this setting after creation.","Ttl":"TTL in seconds for cache entries.\\n\\nValid values are 1–3,600 seconds.","Type":"The cache instance type. Valid values are\\n\\n- `SMALL`\\n- `MEDIUM`\\n- `LARGE`\\n- `XLARGE`\\n- `LARGE_2X`\\n- `LARGE_4X`\\n- `LARGE_8X` (not available in all regions)\\n- `LARGE_12X`\\n\\nHistorically, instance types were identified by an EC2-style value. As of July 2020, this is deprecated, and the generic identifiers above should be used.\\n\\nThe following legacy instance types are available, but their use is discouraged:\\n\\n- *T2_SMALL* : A t2.small instance type.\\n- *T2_MEDIUM* : A t2.medium instance type.\\n- *R4_LARGE* : A r4.large instance type.\\n- *R4_XLARGE* : A r4.xlarge instance type.\\n- *R4_2XLARGE* : A r4.2xlarge instance type.\\n- *R4_4XLARGE* : A r4.4xlarge instance type.\\n- *R4_8XLARGE* : A r4.8xlarge instance type."}},"AWS::AppSync::ApiKey":{"attributes":{"ApiKey":"The API key.","Arn":"The Amazon Resource Name (ARN) of the API key, such as `arn:aws:appsync:us-east-1:123456789012:apis/graphqlapiid/apikey/apikeya1bzhi` .","Ref":"When you pass the logical ID of an `AWS::AppSync::ApiKey` resource to the intrinsic `Ref` function, the function returns the ARN of the API key, such as `arn:aws:appsync:us-east-1:123456789012:apis/graphqlapiid/apikey/apikeya1bzhi` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref) ."},"description":"The `AWS::AppSync::ApiKey` resource creates a unique key that you can distribute to clients who are executing GraphQL operations with AWS AppSync that require an API key.","properties":{"ApiId":"Unique AWS AppSync GraphQL API ID for this API key.","ApiKeyId":"The API key ID.","Description":"Unique description of your API key.","Expires":"The time after which the API key expires. The date is represented as seconds since the epoch, rounded down to the nearest hour."}},"AWS::AppSync::DataSource":{"attributes":{"DataSourceArn":"The Amazon Resource Name (ARN) of the API key, such as `arn:aws:appsync:us-east-1:123456789012:apis/graphqlapiid/datasources/datasourcename` .","Name":"Friendly name for you to identify your AWS AppSync data source after creation.","Ref":"When you pass the logical ID of an `AWS::AppSync::DataSource` resource to the intrinsic `Ref` function, the function returns the ARN of the Data Source, such as `arn:aws:appsync:us-east-1:123456789012:apis/graphqlapiid/datasources/datasourcename` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref) ."},"description":"The `AWS::AppSync::DataSource` resource creates data sources for resolvers in AWS AppSync to connect to, such as Amazon DynamoDB , AWS Lambda , and Amazon OpenSearch Service . Resolvers use these data sources to fetch data when clients make GraphQL calls.","properties":{"ApiId":"Unique AWS AppSync GraphQL API identifier where this data source will be created.","Description":"The description of the data source.","DynamoDBConfig":"AWS Region and TableName for an Amazon DynamoDB table in your account.","ElasticsearchConfig":"AWS Region and Endpoints for an Amazon OpenSearch Service domain in your account.\\n\\nAs of September 2021, Amazon Elasticsearch Service is Amazon OpenSearch Service . This property is deprecated. For new data sources, use *OpenSearchServiceConfig* to specify an OpenSearch Service data source.","EventBridgeConfig":"An EventBridge configuration that contains a valid ARN of an event bus.","HttpConfig":"Endpoints for an HTTP data source.","LambdaConfig":"An ARN of a Lambda function in valid ARN format. This can be the ARN of a Lambda function that exists in the current account or in another account.","Name":"Friendly name for you to identify your AppSync data source after creation.","OpenSearchServiceConfig":"AWS Region and Endpoints for an Amazon OpenSearch Service domain in your account.","RelationalDatabaseConfig":"Relational Database configuration of the relational database data source.","ServiceRoleArn":"The AWS Identity and Access Management service role ARN for the data source. The system assumes this role when accessing the data source.\\n\\nRequired if `Type` is specified as `AWS_LAMBDA` , `AMAZON_DYNAMODB` , `AMAZON_ELASTICSEARCH` , `AMAZON_EVENTBRIDGE` , or `AMAZON_OPENSEARCH_SERVICE` .","Type":"The type of the data source.\\n\\n- *AWS_LAMBDA* : The data source is an AWS Lambda function.\\n- *AMAZON_DYNAMODB* : The data source is an Amazon DynamoDB table.\\n- *AMAZON_ELASTICSEARCH* : The data source is an Amazon OpenSearch Service domain.\\n- *AMAZON_EVENTBRIDGE* : The data source is an Amazon EventBridge event bus.\\n- *AMAZON_OPENSEARCH_SERVICE* : The data source is an Amazon OpenSearch Service domain.\\n- *NONE* : There is no data source. This type is used when you wish to invoke a GraphQL operation without connecting to a data source, such as performing data transformation with resolvers or triggering a subscription to be invoked from a mutation.\\n- *HTTP* : The data source is an HTTP endpoint.\\n- *RELATIONAL_DATABASE* : The data source is a relational database."}},"AWS::AppSync::DataSource.AuthorizationConfig":{"attributes":{},"description":"The `AuthorizationConfig` property type specifies the authorization type and configuration for an AWS AppSync http data source.\\n\\n`AuthorizationConfig` is a property of the [AWS AppSync DataSource HttpConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-httpconfig.html) property type.","properties":{"AuthorizationType":"The authorization type that the HTTP endpoint requires.\\n\\n- *AWS_IAM* : The authorization type is Signature Version 4 (SigV4).","AwsIamConfig":"The AWS Identity and Access Management settings."}},"AWS::AppSync::DataSource.AwsIamConfig":{"attributes":{},"description":"Use the `AwsIamConfig` property type to specify `AwsIamConfig` for a AWS AppSync authorizaton.\\n\\n`AwsIamConfig` is a property of the [AWS AppSync DataSource AuthorizationConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-httpconfig-authorizationconfig.html) resource.","properties":{"SigningRegion":"The signing Region for AWS Identity and Access Management authorization.","SigningServiceName":"The signing service name for AWS Identity and Access Management authorization."}},"AWS::AppSync::DataSource.DeltaSyncConfig":{"attributes":{},"description":"Describes a Delta Sync configuration.","properties":{"BaseTableTTL":"The number of minutes that an Item is stored in the data source.","DeltaSyncTableName":"The Delta Sync table name.","DeltaSyncTableTTL":"The number of minutes that a Delta Sync log entry is stored in the Delta Sync table."}},"AWS::AppSync::DataSource.DynamoDBConfig":{"attributes":{},"description":"The `DynamoDBConfig` property type specifies the `AwsRegion` and `TableName` for an Amazon DynamoDB table in your account for an AWS AppSync data source.\\n\\n`DynamoDBConfig` is a property of the [AWS::AppSync::DataSource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html) property type.","properties":{"AwsRegion":"The AWS Region.","DeltaSyncConfig":"The `DeltaSyncConfig` for a versioned datasource.","TableName":"The table name.","UseCallerCredentials":"Set to `TRUE` to use AWS Identity and Access Management with this data source.","Versioned":"Set to TRUE to use Conflict Detection and Resolution with this data source."}},"AWS::AppSync::DataSource.ElasticsearchConfig":{"attributes":{},"description":"The `ElasticsearchConfig` property type specifies the `AwsRegion` and `Endpoints` for an Amazon OpenSearch Service domain in your account for an AWS AppSync data source.\\n\\nElasticsearchConfig is a property of the [AWS::AppSync::DataSource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html) property type.\\n\\nAs of September 2021, Amazon Elasticsearch Service is Amazon OpenSearch Service . This property is deprecated. For new data sources, use *OpenSearchServiceConfig* to specify an OpenSearch Service data source.","properties":{"AwsRegion":"The AWS Region.","Endpoint":"The endpoint."}},"AWS::AppSync::DataSource.EventBridgeConfig":{"attributes":{},"description":"The data source. This can be an API destination, resource, or AWS service.","properties":{"EventBusArn":"The event bus pipeline\'s ARN. For more information about event buses, see [EventBridge event buses](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-bus.html) ."}},"AWS::AppSync::DataSource.HttpConfig":{"attributes":{},"description":"Use the `HttpConfig` property type to specify `HttpConfig` for an AWS AppSync data source.\\n\\n`HttpConfig` is a property of the [AWS::AppSync::DataSource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html) resource.","properties":{"AuthorizationConfig":"The authorization configuration.","Endpoint":"The endpoint."}},"AWS::AppSync::DataSource.LambdaConfig":{"attributes":{},"description":"The `LambdaConfig` property type specifies the Lambda function ARN for an AWS AppSync data source.\\n\\n`LambdaConfig` is a property of the [AWS::AppSync::DataSource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html) property type.","properties":{"LambdaFunctionArn":"The ARN for the Lambda function."}},"AWS::AppSync::DataSource.OpenSearchServiceConfig":{"attributes":{},"description":"The `OpenSearchServiceConfig` property type specifies the `AwsRegion` and `Endpoints` for an Amazon OpenSearch Service domain in your account for an AWS AppSync data source.\\n\\n`OpenSearchServiceConfig` is a property of the [AWS::AppSync::DataSource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html) property type.","properties":{"AwsRegion":"The AWS Region.","Endpoint":"The endpoint."}},"AWS::AppSync::DataSource.RdsHttpEndpointConfig":{"attributes":{},"description":"Use the `RdsHttpEndpointConfig` property type to specify the `RdsHttpEndpoint` for an AWS AppSync relational database.\\n\\n`RdsHttpEndpointConfig` is a property of the [AWS AppSync DataSource RelationalDatabaseConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-relationaldatabaseconfig.html) resource.","properties":{"AwsRegion":"AWS Region for RDS HTTP endpoint.","AwsSecretStoreArn":"The ARN for database credentials stored in AWS Secrets Manager .","DatabaseName":"Logical database name.","DbClusterIdentifier":"Amazon RDS cluster Amazon Resource Name (ARN).","Schema":"Logical schema name."}},"AWS::AppSync::DataSource.RelationalDatabaseConfig":{"attributes":{},"description":"Use the `RelationalDatabaseConfig` property type to specify `RelationalDatabaseConfig` for an AWS AppSync data source.\\n\\n`RelationalDatabaseConfig` is a property of the [AWS::AppSync::DataSource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html) property type.","properties":{"RdsHttpEndpointConfig":"Information about the Amazon RDS resource.","RelationalDatabaseSourceType":"The type of relational data source."}},"AWS::AppSync::DomainName":{"attributes":{"AppSyncDomainName":"The domain name provided by AWS AppSync .","DomainName":"The domain name.","HostedZoneId":"The ID of your Amazon Route 53 hosted zone.","Ref":"When you pass the logical ID of an `AWS::AppSync::DomainName` resource to the intrinsic `Ref` function, the function returns the domain name.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref) ."},"description":"The `AWS::AppSync::DomainName` resource creates a `DomainNameConfig` object to configure a custom domain.","properties":{"CertificateArn":"The Amazon Resource Name (ARN) of the certificate. This will be an AWS Certificate Manager certificate.","Description":"The decription for your domain name.","DomainName":"The domain name."}},"AWS::AppSync::DomainNameApiAssociation":{"attributes":{},"description":"The `AWS::AppSync::DomainNameApiAssociation` resource represents the mapping of your custom domain name to the assigned API URL.","properties":{"ApiId":"The API ID.","DomainName":"The domain name."}},"AWS::AppSync::FunctionConfiguration":{"attributes":{"DataSourceName":"The name of data source this function will attach.","FunctionArn":"ARN of the function, such as `arn:aws:appsync:us-east-1:123456789012:apis/graphqlapiid/functions/functionId` .","FunctionId":"The unique ID of this function.","Name":"The name of the function.","Ref":"When you pass the logical ID of an `AWS::AppSync::FunctionConfiguration` resource to the intrinsic `Ref` function, the function returns the ARN of the FunctionConfiguration, such as `arn:aws:appsync:us-east-1:123456789012:apis/graphqlapiid/functions/functionid` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref) ."},"description":"The `AWS::AppSync::FunctionConfiguration` resource defines the functions in GraphQL APIs to perform certain operations. You can use pipeline resolvers to attach functions. For more information, see [Pipeline Resolvers](https://docs.aws.amazon.com/appsync/latest/devguide/pipeline-resolvers.html) in the *AWS AppSync Developer Guide* .\\n\\n> When you submit an update, AWS CloudFormation updates resources based on differences between what you submit and the stack\'s current template. To cause this resource to be updated you must change a property value for this resource in the AWS CloudFormation template. Changing the Amazon S3 file content without changing a property value will not result in an update operation.\\n> \\n> See [Update Behaviors of Stack Resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html) in the *AWS CloudFormation User Guide* .","properties":{"ApiId":"The AWS AppSync GraphQL API that you want to attach using this function.","Code":"The `resolver` code that contains the request and response functions. When code is used, the `runtime` is required. The runtime value must be `APPSYNC_JS` .","CodeS3Location":"The Amazon S3 endpoint.","DataSourceName":"The name of data source this function will attach.","Description":"The `Function` description.","FunctionVersion":"The version of the request mapping template. Currently, only the 2018-05-29 version of the template is supported.","MaxBatchSize":"The maximum number of resolver request inputs that will be sent to a single AWS Lambda function in a `BatchInvoke` operation.","Name":"The name of the function.","RequestMappingTemplate":"The `Function` request mapping template. Functions support only the 2018-05-29 version of the request mapping template.","RequestMappingTemplateS3Location":"Describes a Sync configuration for a resolver.\\n\\nContains information on which Conflict Detection, as well as Resolution strategy, should be performed when the resolver is invoked.","ResponseMappingTemplate":"The `Function` response mapping template.","ResponseMappingTemplateS3Location":"The location of a response mapping template in an Amazon S3 bucket. Use this if you want to provision with a template file in Amazon S3 rather than embedding it in your CloudFormation template.","Runtime":"Describes a runtime used by an AWS AppSync pipeline resolver or AWS AppSync function. Specifies the name and version of the runtime to use. Note that if a runtime is specified, code must also be specified.","SyncConfig":"Describes a Sync configuration for a resolver.\\n\\nSpecifies which Conflict Detection strategy and Resolution strategy to use when the resolver is invoked."}},"AWS::AppSync::FunctionConfiguration.AppSyncRuntime":{"attributes":{},"description":"Describes a runtime used by an AWS AppSync pipeline resolver or AWS AppSync function. Specifies the name and version of the runtime to use. Note that if a runtime is specified, code must also be specified.","properties":{"Name":"The `name` of the runtime to use. Currently, the only allowed value is `APPSYNC_JS` .","RuntimeVersion":"The `version` of the runtime to use. Currently, the only allowed version is `1.0.0` ."}},"AWS::AppSync::FunctionConfiguration.LambdaConflictHandlerConfig":{"attributes":{},"description":"The `LambdaConflictHandlerConfig` object when configuring `LAMBDA` as the Conflict Handler.","properties":{"LambdaConflictHandlerArn":"The Amazon Resource Name (ARN) for the Lambda function to use as the Conflict Handler."}},"AWS::AppSync::FunctionConfiguration.SyncConfig":{"attributes":{},"description":"Describes a Sync configuration for a resolver.\\n\\nSpecifies which Conflict Detection strategy and Resolution strategy to use when the resolver is invoked.","properties":{"ConflictDetection":"The Conflict Detection strategy to use.\\n\\n- *VERSION* : Detect conflicts based on object versions for this resolver.\\n- *NONE* : Do not detect conflicts when invoking this resolver.","ConflictHandler":"The Conflict Resolution strategy to perform in the event of a conflict.\\n\\n- *OPTIMISTIC_CONCURRENCY* : Resolve conflicts by rejecting mutations when versions don\'t match the latest version at the server.\\n- *AUTOMERGE* : Resolve conflicts with the Automerge conflict resolution strategy.\\n- *LAMBDA* : Resolve conflicts with an AWS Lambda function supplied in the `LambdaConflictHandlerConfig` .","LambdaConflictHandlerConfig":"The `LambdaConflictHandlerConfig` when configuring `LAMBDA` as the Conflict Handler."}},"AWS::AppSync::GraphQLApi":{"attributes":{"ApiId":"Unique AWS AppSync GraphQL API identifier.","Arn":"The Amazon Resource Name (ARN) of the API key, such as `arn:aws:appsync:us-east-1:123456789012:apis/graphqlapiid` .","GraphQLDns":"The fully qualified domain name (FQDN) of the endpoint URL of your GraphQL API.","GraphQLUrl":"The Endpoint URL of your GraphQL API.","RealtimeDns":"The fully qualified domain name (FQDN) of the real-time endpoint URL of your GraphQL API.","RealtimeUrl":"The GraphQL API real-time endpoint URL. For more information, see [Discovering the real-time endpoint from the GraphQL endpoint](https://docs.aws.amazon.com/appsync/latest/devguide/real-time-websocket-client.html#handshake-details-to-establish-the-websocket-connection) .","Ref":"When you pass the logical ID of an `AWS::AppSync::GraphQLApi` resource to the intrinsic `Ref` function, the function returns the ARN of the GraphQL API, such as `arn:aws:appsync:us-east-1:123456789012:apis/graphqlapiid` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref) ."},"description":"The `AWS::AppSync::GraphQLApi` resource creates a new AWS AppSync GraphQL API. This is the top-level construct for your application. For more information, see [Quick Start](https://docs.aws.amazon.com/appsync/latest/devguide/quickstart.html) in the *AWS AppSync Developer Guide* .","properties":{"AdditionalAuthenticationProviders":"A list of additional authentication providers for the `GraphqlApi` API.","ApiType":"The value that indicates whether the GraphQL API is a standard API ( `GRAPHQL` ) or merged API ( `MERGED` ).\\n\\n*WARNING* : If the `ApiType` has not been defined, *explicitly* setting it to `GRAPHQL` in a template/stack update will result in an API replacement and new DNS values.\\n\\nThe following values are valid:\\n\\n`GRAPHQL | MERGED`","AuthenticationType":"Security configuration for your GraphQL API. For allowed values (such as `API_KEY` , `AWS_IAM` , `AMAZON_COGNITO_USER_POOLS` , `OPENID_CONNECT` , or `AWS_LAMBDA` ), see [Security](https://docs.aws.amazon.com/appsync/latest/devguide/security.html) in the *AWS AppSync Developer Guide* .","LambdaAuthorizerConfig":"A `LambdaAuthorizerConfig` holds configuration on how to authorize AWS AppSync API access when using the `AWS_LAMBDA` authorizer mode. Be aware that an AWS AppSync API may have only one Lambda authorizer configured at a time.","LogConfig":"The Amazon CloudWatch Logs configuration.","MergedApiExecutionRoleArn":"The AWS Identity and Access Management service role ARN for a merged API. The AppSync service assumes this role on behalf of the Merged API to validate access to source APIs at runtime and to prompt the `AUTO_MERGE` to update the merged API endpoint with the source API changes automatically.","Name":"The API name.","OpenIDConnectConfig":"The OpenID Connect configuration.","OwnerContact":"The owner contact information for an API resource.\\n\\nThis field accepts any string input with a length of 0 - 256 characters.","Tags":"An arbitrary set of tags (key-value pairs) for this GraphQL API.","UserPoolConfig":"Optional authorization configuration for using Amazon Cognito user pools with your GraphQL endpoint.","Visibility":"Sets the scope of the GraphQL API to public ( `GLOBAL` ) or private ( `PRIVATE` ). By default, the scope is set to `Global` if no value is provided.\\n\\n*WARNING* : If `Visibility` has not been defined, *explicitly* setting it to `GLOBAL` in a template/stack update will result in an API replacement and new DNS values.","XrayEnabled":"A flag indicating whether to use AWS X-Ray tracing for this `GraphqlApi` ."}},"AWS::AppSync::GraphQLApi.AdditionalAuthenticationProvider":{"attributes":{},"description":"Describes an additional authentication provider.","properties":{"AuthenticationType":"The authentication type for API key, AWS Identity and Access Management , OIDC, Amazon Cognito user pools , or AWS Lambda .\\n\\nValid Values: `API_KEY` | `AWS_IAM` | `OPENID_CONNECT` | `AMAZON_COGNITO_USER_POOLS` | `AWS_LAMBDA`","LambdaAuthorizerConfig":"Configuration for AWS Lambda function authorization.","OpenIDConnectConfig":"The OIDC configuration.","UserPoolConfig":"The Amazon Cognito user pool configuration."}},"AWS::AppSync::GraphQLApi.CognitoUserPoolConfig":{"attributes":{},"description":"Describes an Amazon Cognito user pool configuration.","properties":{"AppIdClientRegex":"A regular expression for validating the incoming Amazon Cognito user pool app client ID. If this value isn\'t set, no filtering is applied.","AwsRegion":"The AWS Region in which the user pool was created.","UserPoolId":"The user pool ID."}},"AWS::AppSync::GraphQLApi.LambdaAuthorizerConfig":{"attributes":{},"description":"Configuration for AWS Lambda function authorization.","properties":{"AuthorizerResultTtlInSeconds":"The number of seconds a response should be cached for. The default is 0 seconds, which disables caching. If you don\'t specify a value for `authorizerResultTtlInSeconds` , the default value is used. The maximum value is one hour (3600 seconds). The Lambda function can override this by returning a `ttlOverride` key in its response.","AuthorizerUri":"The ARN of the Lambda function to be called for authorization. This may be a standard Lambda ARN, a version ARN ( `.../v3` ) or alias ARN.\\n\\n*Note* : This Lambda function must have the following resource-based policy assigned to it. When configuring Lambda authorizers in the console, this is done for you. To do so with the AWS CLI , run the following:\\n\\n`aws lambda add-permission --function-name \\"arn:aws:lambda:us-east-2:111122223333:function:my-function\\" --statement-id \\"appsync\\" --principal appsync.amazonaws.com --action lambda:InvokeFunction`","IdentityValidationExpression":"A regular expression for validation of tokens before the Lambda function is called."}},"AWS::AppSync::GraphQLApi.LogConfig":{"attributes":{},"description":"The `LogConfig` property type specifies the logging configuration when writing GraphQL operations and tracing to Amazon CloudWatch for an AWS AppSync GraphQL API.\\n\\n`LogConfig` is a property of the [AWS::AppSync::GraphQLApi](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html) property type.","properties":{"CloudWatchLogsRoleArn":"The service role that AWS AppSync will assume to publish to Amazon CloudWatch Logs in your account.","ExcludeVerboseContent":"Set to TRUE to exclude sections that contain information such as headers, context, and evaluated mapping templates, regardless of logging level.","FieldLogLevel":"The field logging level. Values can be NONE, ERROR, or ALL.\\n\\n- *NONE* : No field-level logs are captured.\\n- *ERROR* : Logs the following information only for the fields that are in error:\\n\\n- The error section in the server response.\\n- Field-level errors.\\n- The generated request/response functions that got resolved for error fields.\\n- *ALL* : The following information is logged for all fields in the query:\\n\\n- Field-level tracing information.\\n- The generated request/response functions that got resolved for each field."}},"AWS::AppSync::GraphQLApi.OpenIDConnectConfig":{"attributes":{},"description":"The `OpenIDConnectConfig` property type specifies the optional authorization configuration for using an OpenID Connect compliant service with your GraphQL endpoint for an AWS AppSync GraphQL API.\\n\\n`OpenIDConnectConfig` is a property of the [AWS::AppSync::GraphQLApi](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html) property type.","properties":{"AuthTTL":"The number of milliseconds that a token is valid after being authenticated.","ClientId":"The client identifier of the Relying party at the OpenID identity provider. This identifier is typically obtained when the Relying party is registered with the OpenID identity provider. You can specify a regular expression so that AWS AppSync can validate against multiple client identifiers at a time.","IatTTL":"The number of milliseconds that a token is valid after it\'s issued to a user.","Issuer":"The issuer for the OIDC configuration. The issuer returned by discovery must exactly match the value of `iss` in the ID token."}},"AWS::AppSync::GraphQLApi.UserPoolConfig":{"attributes":{},"description":"The `UserPoolConfig` property type specifies the optional authorization configuration for using Amazon Cognito user pools with your GraphQL endpoint for an AWS AppSync GraphQL API.","properties":{"AppIdClientRegex":"A regular expression for validating the incoming Amazon Cognito user pool app client ID. If this value isn\'t set, no filtering is applied.","AwsRegion":"The AWS Region in which the user pool was created.","DefaultAction":"The action that you want your GraphQL API to take when a request that uses Amazon Cognito user pool authentication doesn\'t match the Amazon Cognito user pool configuration.\\n\\nWhen specifying Amazon Cognito user pools as the default authentication, you must set the value for `DefaultAction` to `ALLOW` if specifying `AdditionalAuthenticationProviders` .","UserPoolId":"The user pool ID."}},"AWS::AppSync::GraphQLSchema":{"attributes":{"Ref":"When you pass the logical ID of an `AWS::AppSync::GraphQLSchema` resource to the intrinsic `Ref` function, the function returns the GraphQL API ID with the literal String GraphQLSchema attached to it."},"description":"The `AWS::AppSync::GraphQLSchema` resource is used for your AWS AppSync GraphQL schema that controls the data model for your API. Schema files are text written in Schema Definition Language (SDL) format. For more information about schema authoring, see [Designing a GraphQL API](https://docs.aws.amazon.com/appsync/latest/devguide/designing-a-graphql-api.html) in the *AWS AppSync Developer Guide* .\\n\\n> When you submit an update, AWS CloudFormation updates resources based on differences between what you submit and the stack\'s current template. To cause this resource to be updated you must change a property value for this resource in the CloudFormation template. Changing the Amazon S3 file content without changing a property value will not result in an update operation.\\n> \\n> See [Update Behaviors of Stack Resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html) in the *AWS CloudFormation User Guide* .","properties":{"ApiId":"The AWS AppSync GraphQL API identifier to which you want to apply this schema.","Definition":"The text representation of a GraphQL schema in SDL format.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref) .","DefinitionS3Location":"The location of a GraphQL schema file in an Amazon S3 bucket. Use this if you want to provision with the schema living in Amazon S3 rather than embedding it in your CloudFormation template."}},"AWS::AppSync::Resolver":{"attributes":{"FieldName":"The GraphQL field on a type that invokes the resolver.","Ref":"When you pass the logical ID of an `AWS::AppSync::Resolver` resource to the intrinsic `Ref` function, the function returns the ARN of the Resolver, such as `arn:aws:appsync:us-east-1:123456789012:apis/graphqlapiid/types/typename/resolvers/resolvername` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref) .","ResolverArn":"ARN of the resolver, such as `arn:aws:appsync:us-east-1:123456789012:apis/graphqlapiid/types/typename/resolvers/resolvername` .","TypeName":"The GraphQL type that invokes this resolver."},"description":"The `AWS::AppSync::Resolver` resource defines the logical GraphQL resolver that you attach to fields in a schema. Request and response templates for resolvers are written in Apache Velocity Template Language (VTL) format. For more information about resolvers, see [Resolver Mapping Template Reference](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference.html) .\\n\\n> When you submit an update, AWS CloudFormation updates resources based on differences between what you submit and the stack\'s current template. To cause this resource to be updated you must change a property value for this resource in the CloudFormation template. Changing the Amazon S3 file content without changing a property value will not result in an update operation.\\n> \\n> See [Update Behaviors of Stack Resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html) in the *AWS CloudFormation User Guide* .","properties":{"ApiId":"The AWS AppSync GraphQL API to which you want to attach this resolver.","CachingConfig":"The caching configuration for the resolver.","Code":"The `resolver` code that contains the request and response functions. When code is used, the `runtime` is required. The runtime value must be `APPSYNC_JS` .","CodeS3Location":"The Amazon S3 endpoint.","DataSourceName":"The resolver data source name.","FieldName":"The GraphQL field on a type that invokes the resolver.","Kind":"The resolver type.\\n\\n- *UNIT* : A UNIT resolver type. A UNIT resolver is the default resolver type. You can use a UNIT resolver to run a GraphQL query against a single data source.\\n- *PIPELINE* : A PIPELINE resolver type. You can use a PIPELINE resolver to invoke a series of `Function` objects in a serial manner. You can use a pipeline resolver to run a GraphQL query against multiple data sources.","MaxBatchSize":"The maximum number of resolver request inputs that will be sent to a single AWS Lambda function in a `BatchInvoke` operation.","PipelineConfig":"Functions linked with the pipeline resolver.","RequestMappingTemplate":"The request mapping template.\\n\\nRequest mapping templates are optional when using a Lambda data source. For all other data sources, a request mapping template is required.","RequestMappingTemplateS3Location":"The location of a request mapping template in an Amazon S3 bucket. Use this if you want to provision with a template file in Amazon S3 rather than embedding it in your CloudFormation template.","ResponseMappingTemplate":"The response mapping template.","ResponseMappingTemplateS3Location":"The location of a response mapping template in an Amazon S3 bucket. Use this if you want to provision with a template file in Amazon S3 rather than embedding it in your CloudFormation template.","Runtime":"Describes a runtime used by an AWS AppSync pipeline resolver or AWS AppSync function. Specifies the name and version of the runtime to use. Note that if a runtime is specified, code must also be specified.","SyncConfig":"The `SyncConfig` for a resolver attached to a versioned data source.","TypeName":"The GraphQL type that invokes this resolver."}},"AWS::AppSync::Resolver.AppSyncRuntime":{"attributes":{},"description":"Describes a runtime used by an AWS AppSync pipeline resolver or AWS AppSync function. Specifies the name and version of the runtime to use. Note that if a runtime is specified, code must also be specified.","properties":{"Name":"The `name` of the runtime to use. Currently, the only allowed value is `APPSYNC_JS` .","RuntimeVersion":"The `version` of the runtime to use. Currently, the only allowed version is `1.0.0` ."}},"AWS::AppSync::Resolver.CachingConfig":{"attributes":{},"description":"The caching configuration for a resolver that has caching activated.","properties":{"CachingKeys":"The caching keys for a resolver that has caching activated.\\n\\nValid values are entries from the `$context.arguments` , `$context.source` , and `$context.identity` maps.","Ttl":"The TTL in seconds for a resolver that has caching activated.\\n\\nValid values are 1–3,600 seconds."}},"AWS::AppSync::Resolver.LambdaConflictHandlerConfig":{"attributes":{},"description":"The `LambdaConflictHandlerConfig` when configuring LAMBDA as the Conflict Handler.","properties":{"LambdaConflictHandlerArn":"The Amazon Resource Name (ARN) for the Lambda function to use as the Conflict Handler."}},"AWS::AppSync::Resolver.PipelineConfig":{"attributes":{},"description":"Use the `PipelineConfig` property type to specify `PipelineConfig` for an AWS AppSync resolver.\\n\\n`PipelineConfig` is a property of the [AWS::AppSync::Resolver](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html) resource.","properties":{"Functions":"A list of `Function` objects."}},"AWS::AppSync::Resolver.SyncConfig":{"attributes":{},"description":"Describes a Sync configuration for a resolver.\\n\\nSpecifies which Conflict Detection strategy and Resolution strategy to use when the resolver is invoked.","properties":{"ConflictDetection":"The Conflict Detection strategy to use.\\n\\n- *VERSION* : Detect conflicts based on object versions for this resolver.\\n- *NONE* : Do not detect conflicts when invoking this resolver.","ConflictHandler":"The Conflict Resolution strategy to perform in the event of a conflict.\\n\\n- *OPTIMISTIC_CONCURRENCY* : Resolve conflicts by rejecting mutations when versions don\'t match the latest version at the server.\\n- *AUTOMERGE* : Resolve conflicts with the Automerge conflict resolution strategy.\\n- *LAMBDA* : Resolve conflicts with an AWS Lambda function supplied in the `LambdaConflictHandlerConfig` .","LambdaConflictHandlerConfig":"The `LambdaConflictHandlerConfig` when configuring `LAMBDA` as the Conflict Handler."}},"AWS::AppSync::SourceApiAssociation":{"attributes":{"AssociationArn":"The Amazon Resource Name (ARN) of the source API association.","AssociationId":"The ID generated by the AppSync service for the source API association.","LastSuccessfulMergeDate":"The datetime value of the last successful merge of the source API association. The result will be in UTC format and your local time zone.","MergedApiArn":"The Amazon Resource Name (ARN) of the merged API.","MergedApiId":"The ID of the merged API.","Ref":"When you pass the logical ID of an `AWS::AppSync::SourceApiAssociation` resource to the intrinsic `Ref` function, the function returns the ARN of the source API association.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref) .","SourceApiArn":"The source API\'s Amazon Resource Name (ARN) value.","SourceApiAssociationStatus":"The state of the source API association.\\n\\nThe following values are valid:\\n\\n`MERGE_SCHEDULED | MERGE_FAILED | MERGE_SUCCESS | MERGE_IN_PROGRESS | AUTO_MERGE_SCHEDULE_FAILED | DELETION_SCHEDULED | DELETION_IN_PROGRESS | DELETION_FAILED`","SourceApiAssociationStatusDetail":"The message describing the state of the source API association.","SourceApiId":"The ID of the source API."},"description":"Describes the configuration of a source API. A source API is a GraphQL API that is linked to a merged API. There can be multiple source APIs attached to each merged API. When linked to a merged API, the source API\'s schema, data sources, and resolvers will be combined with other linked source API data to form a new, singular API. Source APIs can originate from your account or from other accounts via Resource Access Manager.","properties":{"Description":"The description field of the association configuration.","MergedApiIdentifier":"The identifier of the AppSync Merged API. This is generated by the AppSync service. In most cases, Merged APIs (especially in your account) only require the API ID value or ARN of the merged API. However, Merged APIs from other accounts (cross-account use cases) strictly require the full resource ARN of the merged API.","SourceApiAssociationConfig":"The `SourceApiAssociationConfig` object data.","SourceApiIdentifier":"The identifier of the AppSync Source API. This is generated by the AppSync service. In most cases, source APIs (especially in your account) only require the API ID value or ARN of the source API. However, source APIs from other accounts (cross-account use cases) strictly require the full resource ARN of the source API."}},"AWS::AppSync::SourceApiAssociation.SourceApiAssociationConfig":{"attributes":{},"description":"Describes properties used to specify configurations related to a source API. This is a property of the `AWS:AppSync:SourceApiAssociation` type.","properties":{"MergeType":"The property that indicates which merging option is enabled in the source API association.\\n\\nValid merge types are `MANUAL_MERGE` (default) and `AUTO_MERGE` . Manual merges are the default behavior and require the user to trigger any changes from the source APIs to the merged API manually. Auto merges subscribe the merged API to the changes performed on the source APIs so that any change in the source APIs are also made to the merged API. Auto merges use `MergedApiExecutionRoleArn` to perform merge operations.\\n\\nThe following values are valid:\\n\\n`MANUAL_MERGE | AUTO_MERGE`"}},"AWS::ApplicationAutoScaling::ScalableTarget":{"attributes":{"Id":"","Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the CloudFormation-generated ID of the resource. For example: `service/ecsStack-MyECSCluster-AB12CDE3F4GH/ecsStack-MyECSService-AB12CDE3F4GH|ecs:service:DesiredCount|ecs` .\\n\\nCloudFormation uses the following format to generate the ID: `service/ *resource_ID* | *scalable_dimension* | *service_namespace*` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::ApplicationAutoScaling::ScalableTarget` resource specifies a resource that Application Auto Scaling can scale, such as an AWS::DynamoDB::Table or AWS::ECS::Service resource.\\n\\nFor more information, see [Getting started](https://docs.aws.amazon.com/autoscaling/application/userguide/getting-started.html) in the *Application Auto Scaling User Guide* .\\n\\n> If the resource that you want Application Auto Scaling to scale is not yet created in your account, add a dependency on the resource when registering it as a scalable target using the [DependsOn](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) attribute.","properties":{"MaxCapacity":"The maximum value that you plan to scale out to. When a scaling policy is in effect, Application Auto Scaling can scale out (expand) as needed to the maximum capacity limit in response to changing demand.","MinCapacity":"The minimum value that you plan to scale in to. When a scaling policy is in effect, Application Auto Scaling can scale in (contract) as needed to the minimum capacity limit in response to changing demand.","ResourceId":"The identifier of the resource associated with the scalable target. This string consists of the resource type and unique identifier.\\n\\n- ECS service - The resource type is `service` and the unique identifier is the cluster name and service name. Example: `service/default/sample-webapp` .\\n- Spot Fleet - The resource type is `spot-fleet-request` and the unique identifier is the Spot Fleet request ID. Example: `spot-fleet-request/sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE` .\\n- EMR cluster - The resource type is `instancegroup` and the unique identifier is the cluster ID and instance group ID. Example: `instancegroup/j-2EEZNYKUA1NTV/ig-1791Y4E1L8YI0` .\\n- AppStream 2.0 fleet - The resource type is `fleet` and the unique identifier is the fleet name. Example: `fleet/sample-fleet` .\\n- DynamoDB table - The resource type is `table` and the unique identifier is the table name. Example: `table/my-table` .\\n- DynamoDB global secondary index - The resource type is `index` and the unique identifier is the index name. Example: `table/my-table/index/my-table-index` .\\n- Aurora DB cluster - The resource type is `cluster` and the unique identifier is the cluster name. Example: `cluster:my-db-cluster` .\\n- SageMaker endpoint variant - The resource type is `variant` and the unique identifier is the resource ID. Example: `endpoint/my-end-point/variant/KMeansClustering` .\\n- Custom resources are not supported with a resource type. This parameter must specify the `OutputValue` from the CloudFormation template stack used to access the resources. The unique identifier is defined by the service provider. More information is available in our [GitHub repository](https://docs.aws.amazon.com/https://github.com/aws/aws-auto-scaling-custom-resource) .\\n- Amazon Comprehend document classification endpoint - The resource type and unique identifier are specified using the endpoint ARN. Example: `arn:aws:comprehend:us-west-2:123456789012:document-classifier-endpoint/EXAMPLE` .\\n- Amazon Comprehend entity recognizer endpoint - The resource type and unique identifier are specified using the endpoint ARN. Example: `arn:aws:comprehend:us-west-2:123456789012:entity-recognizer-endpoint/EXAMPLE` .\\n- Lambda provisioned concurrency - The resource type is `function` and the unique identifier is the function name with a function version or alias name suffix that is not `$LATEST` . Example: `function:my-function:prod` or `function:my-function:1` .\\n- Amazon Keyspaces table - The resource type is `table` and the unique identifier is the table name. Example: `keyspace/mykeyspace/table/mytable` .\\n- Amazon MSK cluster - The resource type and unique identifier are specified using the cluster ARN. Example: `arn:aws:kafka:us-east-1:123456789012:cluster/demo-cluster-1/6357e0b2-0e6a-4b86-a0b4-70df934c2e31-5` .\\n- Amazon ElastiCache replication group - The resource type is `replication-group` and the unique identifier is the replication group name. Example: `replication-group/mycluster` .\\n- Neptune cluster - The resource type is `cluster` and the unique identifier is the cluster name. Example: `cluster:mycluster` .\\n- SageMaker Serverless endpoint - The resource type is `variant` and the unique identifier is the resource ID. Example: `endpoint/my-end-point/variant/KMeansClustering` .","RoleARN":"Specify the Amazon Resource Name (ARN) of an Identity and Access Management (IAM) role that allows Application Auto Scaling to modify the scalable target on your behalf. This can be either an IAM service role that Application Auto Scaling can assume to make calls to other AWS resources on your behalf, or a service-linked role for the specified service. For more information, see [How Application Auto Scaling works with IAM](https://docs.aws.amazon.com/autoscaling/application/userguide/security_iam_service-with-iam.html) in the *Application Auto Scaling User Guide* .\\n\\nTo automatically create a service-linked role (recommended), specify the full ARN of the service-linked role in your stack template. To find the exact ARN of the service-linked role for your AWS or custom resource, see the [Service-linked roles](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html) topic in the *Application Auto Scaling User Guide* . Look for the ARN in the table at the bottom of the page.","ScalableDimension":"The scalable dimension associated with the scalable target. This string consists of the service namespace, resource type, and scaling property.\\n\\n- `ecs:service:DesiredCount` - The desired task count of an ECS service.\\n- `elasticmapreduce:instancegroup:InstanceCount` - The instance count of an EMR Instance Group.\\n- `ec2:spot-fleet-request:TargetCapacity` - The target capacity of a Spot Fleet.\\n- `appstream:fleet:DesiredCapacity` - The desired capacity of an AppStream 2.0 fleet.\\n- `dynamodb:table:ReadCapacityUnits` - The provisioned read capacity for a DynamoDB table.\\n- `dynamodb:table:WriteCapacityUnits` - The provisioned write capacity for a DynamoDB table.\\n- `dynamodb:index:ReadCapacityUnits` - The provisioned read capacity for a DynamoDB global secondary index.\\n- `dynamodb:index:WriteCapacityUnits` - The provisioned write capacity for a DynamoDB global secondary index.\\n- `rds:cluster:ReadReplicaCount` - The count of Aurora Replicas in an Aurora DB cluster. Available for Aurora MySQL-compatible edition and Aurora PostgreSQL-compatible edition.\\n- `sagemaker:variant:DesiredInstanceCount` - The number of EC2 instances for a SageMaker model endpoint variant.\\n- `custom-resource:ResourceType:Property` - The scalable dimension for a custom resource provided by your own application or service.\\n- `comprehend:document-classifier-endpoint:DesiredInferenceUnits` - The number of inference units for an Amazon Comprehend document classification endpoint.\\n- `comprehend:entity-recognizer-endpoint:DesiredInferenceUnits` - The number of inference units for an Amazon Comprehend entity recognizer endpoint.\\n- `lambda:function:ProvisionedConcurrency` - The provisioned concurrency for a Lambda function.\\n- `cassandra:table:ReadCapacityUnits` - The provisioned read capacity for an Amazon Keyspaces table.\\n- `cassandra:table:WriteCapacityUnits` - The provisioned write capacity for an Amazon Keyspaces table.\\n- `kafka:broker-storage:VolumeSize` - The provisioned volume size (in GiB) for brokers in an Amazon MSK cluster.\\n- `elasticache:replication-group:NodeGroups` - The number of node groups for an Amazon ElastiCache replication group.\\n- `elasticache:replication-group:Replicas` - The number of replicas per node group for an Amazon ElastiCache replication group.\\n- `neptune:cluster:ReadReplicaCount` - The count of read replicas in an Amazon Neptune DB cluster.\\n- `sagemaker:variant:DesiredProvisionedConcurrency` - The provisioned concurrency for a SageMaker Serverless endpoint.","ScheduledActions":"The scheduled actions for the scalable target. Duplicates aren\'t allowed.","ServiceNamespace":"The namespace of the AWS service that provides the resource, or a `custom-resource` .","SuspendedState":"An embedded object that contains attributes and attribute values that are used to suspend and resume automatic scaling. Setting the value of an attribute to `true` suspends the specified scaling activities. Setting it to `false` (default) resumes the specified scaling activities.\\n\\n*Suspension Outcomes*\\n\\n- For `DynamicScalingInSuspended` , while a suspension is in effect, all scale-in activities that are triggered by a scaling policy are suspended.\\n- For `DynamicScalingOutSuspended` , while a suspension is in effect, all scale-out activities that are triggered by a scaling policy are suspended.\\n- For `ScheduledScalingSuspended` , while a suspension is in effect, all scaling activities that involve scheduled actions are suspended."}},"AWS::ApplicationAutoScaling::ScalableTarget.ScalableTargetAction":{"attributes":{},"description":"`ScalableTargetAction` specifies the minimum and maximum capacity for the `ScalableTargetAction` property of the [AWS::ApplicationAutoScaling::ScalableTarget ScheduledAction](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scheduledaction.html) property type.","properties":{"MaxCapacity":"The maximum capacity.","MinCapacity":"The minimum capacity."}},"AWS::ApplicationAutoScaling::ScalableTarget.ScheduledAction":{"attributes":{},"description":"`ScheduledAction` is a property of the [AWS::ApplicationAutoScaling::ScalableTarget](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html) resource that specifies a scheduled action for a scalable target.\\n\\nFor more information, see [Scheduled scaling](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-scheduled-scaling.html) in the *Application Auto Scaling User Guide* .","properties":{"EndTime":"The date and time that the action is scheduled to end, in UTC.","ScalableTargetAction":"The new minimum and maximum capacity. You can set both values or just one. At the scheduled time, if the current capacity is below the minimum capacity, Application Auto Scaling scales out to the minimum capacity. If the current capacity is above the maximum capacity, Application Auto Scaling scales in to the maximum capacity.","Schedule":"The schedule for this action. The following formats are supported:\\n\\n- At expressions - \\" `at( *yyyy* - *mm* - *dd* T *hh* : *mm* : *ss* )` \\"\\n- Rate expressions - \\" `rate( *value* *unit* )` \\"\\n- Cron expressions - \\" `cron( *fields* )` \\"\\n\\nAt expressions are useful for one-time schedules. Cron expressions are useful for scheduled actions that run periodically at a specified date and time, and rate expressions are useful for scheduled actions that run at a regular interval.\\n\\nAt and cron expressions use Universal Coordinated Time (UTC) by default.\\n\\nThe cron format consists of six fields separated by white spaces: [Minutes] [Hours] [Day_of_Month] [Month] [Day_of_Week] [Year].\\n\\nFor rate expressions, *value* is a positive integer and *unit* is `minute` | `minutes` | `hour` | `hours` | `day` | `days` .","ScheduledActionName":"The name of the scheduled action. This name must be unique among all other scheduled actions on the specified scalable target.","StartTime":"The date and time that the action is scheduled to begin, in UTC.","Timezone":"The time zone used when referring to the date and time of a scheduled action, when the scheduled action uses an at or cron expression."}},"AWS::ApplicationAutoScaling::ScalableTarget.SuspendedState":{"attributes":{},"description":"`SuspendedState` is a property of the [AWS::ApplicationAutoScaling::ScalableTarget](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html) resource that specifies whether the scaling activities for a scalable target are in a suspended state.\\n\\nFor more information, see [Suspending and resuming scaling](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-suspend-resume-scaling.html) in the *Application Auto Scaling User Guide* .","properties":{"DynamicScalingInSuspended":"Whether scale in by a target tracking scaling policy or a step scaling policy is suspended. Set the value to `true` if you don\'t want Application Auto Scaling to remove capacity when a scaling policy is triggered. The default is `false` .","DynamicScalingOutSuspended":"Whether scale out by a target tracking scaling policy or a step scaling policy is suspended. Set the value to `true` if you don\'t want Application Auto Scaling to add capacity when a scaling policy is triggered. The default is `false` .","ScheduledScalingSuspended":"Whether scheduled scaling is suspended. Set the value to `true` if you don\'t want Application Auto Scaling to add or remove capacity by initiating scheduled actions. The default is `false` ."}},"AWS::ApplicationAutoScaling::ScalingPolicy":{"attributes":{"Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the Application Auto Scaling scaling policy Amazon Resource Name (ARN). For example: `arn:aws:autoscaling:us-east-2:123456789012:scalingPolicy:12ab3c4d-56789-0ef1-2345-6ghi7jk8lm90:resource/ecs/service/ecsStack-MyECSCluster-AB12CDE3F4GH/ecsStack-MyECSService-AB12CDE3F4GH:policyName/MyStepPolicy` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::ApplicationAutoScaling::ScalingPolicy` resource defines a scaling policy that Application Auto Scaling uses to adjust the capacity of a scalable target.\\n\\nFor more information, see [Target tracking scaling policies](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-target-tracking.html) and [Step scaling policies](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-step-scaling-policies.html) in the *Application Auto Scaling User Guide* .","properties":{"PolicyName":"The name of the scaling policy.\\n\\nUpdates to the name of a target tracking scaling policy are not supported, unless you also update the metric used for scaling. To change only a target tracking scaling policy\'s name, first delete the policy by removing the existing `AWS::ApplicationAutoScaling::ScalingPolicy` resource from the template and updating the stack. Then, recreate the resource with the same settings and a different name.","PolicyType":"The scaling policy type.\\n\\nThe following policy types are supported:\\n\\n`TargetTrackingScaling` —Not supported for Amazon EMR\\n\\n`StepScaling` —Not supported for DynamoDB, Amazon Comprehend, Lambda, Amazon Keyspaces, Amazon MSK, Amazon ElastiCache, or Neptune.","ResourceId":"The identifier of the resource associated with the scaling policy. This string consists of the resource type and unique identifier.\\n\\n- ECS service - The resource type is `service` and the unique identifier is the cluster name and service name. Example: `service/default/sample-webapp` .\\n- Spot Fleet - The resource type is `spot-fleet-request` and the unique identifier is the Spot Fleet request ID. Example: `spot-fleet-request/sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE` .\\n- EMR cluster - The resource type is `instancegroup` and the unique identifier is the cluster ID and instance group ID. Example: `instancegroup/j-2EEZNYKUA1NTV/ig-1791Y4E1L8YI0` .\\n- AppStream 2.0 fleet - The resource type is `fleet` and the unique identifier is the fleet name. Example: `fleet/sample-fleet` .\\n- DynamoDB table - The resource type is `table` and the unique identifier is the table name. Example: `table/my-table` .\\n- DynamoDB global secondary index - The resource type is `index` and the unique identifier is the index name. Example: `table/my-table/index/my-table-index` .\\n- Aurora DB cluster - The resource type is `cluster` and the unique identifier is the cluster name. Example: `cluster:my-db-cluster` .\\n- SageMaker endpoint variant - The resource type is `variant` and the unique identifier is the resource ID. Example: `endpoint/my-end-point/variant/KMeansClustering` .\\n- Custom resources are not supported with a resource type. This parameter must specify the `OutputValue` from the CloudFormation template stack used to access the resources. The unique identifier is defined by the service provider. More information is available in our [GitHub repository](https://docs.aws.amazon.com/https://github.com/aws/aws-auto-scaling-custom-resource) .\\n- Amazon Comprehend document classification endpoint - The resource type and unique identifier are specified using the endpoint ARN. Example: `arn:aws:comprehend:us-west-2:123456789012:document-classifier-endpoint/EXAMPLE` .\\n- Amazon Comprehend entity recognizer endpoint - The resource type and unique identifier are specified using the endpoint ARN. Example: `arn:aws:comprehend:us-west-2:123456789012:entity-recognizer-endpoint/EXAMPLE` .\\n- Lambda provisioned concurrency - The resource type is `function` and the unique identifier is the function name with a function version or alias name suffix that is not `$LATEST` . Example: `function:my-function:prod` or `function:my-function:1` .\\n- Amazon Keyspaces table - The resource type is `table` and the unique identifier is the table name. Example: `keyspace/mykeyspace/table/mytable` .\\n- Amazon MSK cluster - The resource type and unique identifier are specified using the cluster ARN. Example: `arn:aws:kafka:us-east-1:123456789012:cluster/demo-cluster-1/6357e0b2-0e6a-4b86-a0b4-70df934c2e31-5` .\\n- Amazon ElastiCache replication group - The resource type is `replication-group` and the unique identifier is the replication group name. Example: `replication-group/mycluster` .\\n- Neptune cluster - The resource type is `cluster` and the unique identifier is the cluster name. Example: `cluster:mycluster` .\\n- SageMaker Serverless endpoint - The resource type is `variant` and the unique identifier is the resource ID. Example: `endpoint/my-end-point/variant/KMeansClustering` .","ScalableDimension":"The scalable dimension. This string consists of the service namespace, resource type, and scaling property.\\n\\n- `ecs:service:DesiredCount` - The desired task count of an ECS service.\\n- `elasticmapreduce:instancegroup:InstanceCount` - The instance count of an EMR Instance Group.\\n- `ec2:spot-fleet-request:TargetCapacity` - The target capacity of a Spot Fleet.\\n- `appstream:fleet:DesiredCapacity` - The desired capacity of an AppStream 2.0 fleet.\\n- `dynamodb:table:ReadCapacityUnits` - The provisioned read capacity for a DynamoDB table.\\n- `dynamodb:table:WriteCapacityUnits` - The provisioned write capacity for a DynamoDB table.\\n- `dynamodb:index:ReadCapacityUnits` - The provisioned read capacity for a DynamoDB global secondary index.\\n- `dynamodb:index:WriteCapacityUnits` - The provisioned write capacity for a DynamoDB global secondary index.\\n- `rds:cluster:ReadReplicaCount` - The count of Aurora Replicas in an Aurora DB cluster. Available for Aurora MySQL-compatible edition and Aurora PostgreSQL-compatible edition.\\n- `sagemaker:variant:DesiredInstanceCount` - The number of EC2 instances for a SageMaker model endpoint variant.\\n- `custom-resource:ResourceType:Property` - The scalable dimension for a custom resource provided by your own application or service.\\n- `comprehend:document-classifier-endpoint:DesiredInferenceUnits` - The number of inference units for an Amazon Comprehend document classification endpoint.\\n- `comprehend:entity-recognizer-endpoint:DesiredInferenceUnits` - The number of inference units for an Amazon Comprehend entity recognizer endpoint.\\n- `lambda:function:ProvisionedConcurrency` - The provisioned concurrency for a Lambda function.\\n- `cassandra:table:ReadCapacityUnits` - The provisioned read capacity for an Amazon Keyspaces table.\\n- `cassandra:table:WriteCapacityUnits` - The provisioned write capacity for an Amazon Keyspaces table.\\n- `kafka:broker-storage:VolumeSize` - The provisioned volume size (in GiB) for brokers in an Amazon MSK cluster.\\n- `elasticache:replication-group:NodeGroups` - The number of node groups for an Amazon ElastiCache replication group.\\n- `elasticache:replication-group:Replicas` - The number of replicas per node group for an Amazon ElastiCache replication group.\\n- `neptune:cluster:ReadReplicaCount` - The count of read replicas in an Amazon Neptune DB cluster.\\n- `sagemaker:variant:DesiredProvisionedConcurrency` - The provisioned concurrency for a SageMaker Serverless endpoint.","ScalingTargetId":"The CloudFormation-generated ID of an Application Auto Scaling scalable target. For more information about the ID, see the Return Value section of the `AWS::ApplicationAutoScaling::ScalableTarget` resource.\\n\\n> You must specify either the `ScalingTargetId` property, or the `ResourceId` , `ScalableDimension` , and `ServiceNamespace` properties, but not both.","ServiceNamespace":"The namespace of the AWS service that provides the resource, or a `custom-resource` .","StepScalingPolicyConfiguration":"A step scaling policy.","TargetTrackingScalingPolicyConfiguration":"A target tracking scaling policy."}},"AWS::ApplicationAutoScaling::ScalingPolicy.CustomizedMetricSpecification":{"attributes":{},"description":"Contains customized metric specification information for a target tracking scaling policy for Application Auto Scaling.\\n\\nFor information about the available metrics for a service, see [AWS services that publish CloudWatch metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html) in the *Amazon CloudWatch User Guide* .\\n\\nTo create your customized metric specification:\\n\\n- Add values for each required parameter from CloudWatch. You can use an existing metric, or a new metric that you create. To use your own metric, you must first publish the metric to CloudWatch. For more information, see [Publish custom metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html) in the *Amazon CloudWatch User Guide* .\\n- Choose a metric that changes proportionally with capacity. The value of the metric should increase or decrease in inverse proportion to the number of capacity units. That is, the value of the metric should decrease when capacity increases, and increase when capacity decreases.\\n\\nFor an example of how creating new metrics can be useful, see [Scaling based on Amazon SQS](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-using-sqs-queue.html) in the *Amazon EC2 Auto Scaling User Guide* . This topic mentions Auto Scaling groups, but the same scenario for Amazon SQS can apply to the target tracking scaling policies that you create for a Spot Fleet by using Application Auto Scaling.\\n\\nFor more information about the CloudWatch terminology below, see [Amazon CloudWatch concepts](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html) .\\n\\n`CustomizedMetricSpecification` is a property of the [AWS::ApplicationAutoScaling::ScalingPolicy TargetTrackingScalingPolicyConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration.html) property type.","properties":{"Dimensions":"The dimensions of the metric.\\n\\nConditional: If you published your metric with dimensions, you must specify the same dimensions in your scaling policy.","MetricName":"The name of the metric. To get the exact metric name, namespace, and dimensions, inspect the [Metric](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_Metric.html) object that\'s returned by a call to [ListMetrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_ListMetrics.html) .","Namespace":"The namespace of the metric.","Statistic":"The statistic of the metric.","Unit":"The unit of the metric. For a complete list of the units that CloudWatch supports, see the [MetricDatum](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html) data type in the *Amazon CloudWatch API Reference* ."}},"AWS::ApplicationAutoScaling::ScalingPolicy.MetricDimension":{"attributes":{},"description":"`MetricDimension` specifies a name/value pair that is part of the identity of a CloudWatch metric for the `Dimensions` property of the [AWS::ApplicationAutoScaling::ScalingPolicy CustomizedMetricSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-customizedmetricspecification.html) property type. Duplicate dimensions are not allowed.","properties":{"Name":"The name of the dimension.","Value":"The value of the dimension."}},"AWS::ApplicationAutoScaling::ScalingPolicy.PredefinedMetricSpecification":{"attributes":{},"description":"Contains predefined metric specification information for a target tracking scaling policy for Application Auto Scaling.\\n\\n`PredefinedMetricSpecification` is a property of the [AWS::ApplicationAutoScaling::ScalingPolicy TargetTrackingScalingPolicyConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration.html) property type.","properties":{"PredefinedMetricType":"The metric type. The `ALBRequestCountPerTarget` metric type applies only to Spot fleet requests and ECS services.","ResourceLabel":"Identifies the resource associated with the metric type. You can\'t specify a resource label unless the metric type is `ALBRequestCountPerTarget` and there is a target group attached to the Spot Fleet or ECS service.\\n\\nYou create the resource label by appending the final portion of the load balancer ARN and the final portion of the target group ARN into a single value, separated by a forward slash (/). The format of the resource label is:\\n\\n`app/my-alb/778d41231b141a0f/targetgroup/my-alb-target-group/943f017f100becff` .\\n\\nWhere:\\n\\n- app// is the final portion of the load balancer ARN\\n- targetgroup// is the final portion of the target group ARN.\\n\\nTo find the ARN for an Application Load Balancer, use the [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html) API operation. To find the ARN for the target group, use the [DescribeTargetGroups](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeTargetGroups.html) API operation."}},"AWS::ApplicationAutoScaling::ScalingPolicy.StepAdjustment":{"attributes":{},"description":"`StepAdjustment` specifies a step adjustment for the `StepAdjustments` property of the [AWS::ApplicationAutoScaling::ScalingPolicy StepScalingPolicyConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration.html) property type.\\n\\nFor the following examples, suppose that you have an alarm with a breach threshold of 50:\\n\\n- To trigger a step adjustment when the metric is greater than or equal to 50 and less than 60, specify a lower bound of 0 and an upper bound of 10.\\n- To trigger a step adjustment when the metric is greater than 40 and less than or equal to 50, specify a lower bound of -10 and an upper bound of 0.\\n\\nFor more information, see [Step adjustments](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-step-scaling-policies.html#as-scaling-steps) in the *Application Auto Scaling User Guide* .\\n\\nYou can find a sample template snippet in the [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html#aws-resource-applicationautoscaling-scalingpolicy--examples) section of the `AWS::ApplicationAutoScaling::ScalingPolicy` documentation.","properties":{"MetricIntervalLowerBound":"The lower bound for the difference between the alarm threshold and the CloudWatch metric. If the metric value is above the breach threshold, the lower bound is inclusive (the metric must be greater than or equal to the threshold plus the lower bound). Otherwise, it is exclusive (the metric must be greater than the threshold plus the lower bound). A null value indicates negative infinity.\\n\\nYou must specify at least one upper or lower bound.","MetricIntervalUpperBound":"The upper bound for the difference between the alarm threshold and the CloudWatch metric. If the metric value is above the breach threshold, the upper bound is exclusive (the metric must be less than the threshold plus the upper bound). Otherwise, it is inclusive (the metric must be less than or equal to the threshold plus the upper bound). A null value indicates positive infinity.\\n\\nYou must specify at least one upper or lower bound.","ScalingAdjustment":"The amount by which to scale. The adjustment is based on the value that you specified in the `AdjustmentType` property (either an absolute number or a percentage). A positive value adds to the current capacity and a negative number subtracts from the current capacity."}},"AWS::ApplicationAutoScaling::ScalingPolicy.StepScalingPolicyConfiguration":{"attributes":{},"description":"`StepScalingPolicyConfiguration` is a property of the [AWS::ApplicationAutoScaling::ScalingPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html) resource that specifies a step scaling policy configuration for Application Auto Scaling.\\n\\nFor more information, see [Step scaling policies](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-step-scaling-policies.html) in the *Application Auto Scaling User Guide* .","properties":{"AdjustmentType":"Specifies whether the `ScalingAdjustment` value in the `StepAdjustment` property is an absolute number or a percentage of the current capacity.","Cooldown":"The amount of time, in seconds, to wait for a previous scaling activity to take effect. If not specified, the default value is 300. For more information, see [Cooldown period](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-step-scaling-policies.html#step-scaling-cooldown) in the *Application Auto Scaling User Guide* .","MetricAggregationType":"The aggregation type for the CloudWatch metrics. Valid values are `Minimum` , `Maximum` , and `Average` . If the aggregation type is null, the value is treated as `Average` .","MinAdjustmentMagnitude":"The minimum value to scale by when the adjustment type is `PercentChangeInCapacity` . For example, suppose that you create a step scaling policy to scale out an Amazon ECS service by 25 percent and you specify a `MinAdjustmentMagnitude` of 2. If the service has 4 tasks and the scaling policy is performed, 25 percent of 4 is 1. However, because you specified a `MinAdjustmentMagnitude` of 2, Application Auto Scaling scales out the service by 2 tasks.","StepAdjustments":"A set of adjustments that enable you to scale based on the size of the alarm breach.\\n\\nAt least one step adjustment is required if you are adding a new step scaling policy configuration."}},"AWS::ApplicationAutoScaling::ScalingPolicy.TargetTrackingScalingPolicyConfiguration":{"attributes":{},"description":"`TargetTrackingScalingPolicyConfiguration` is a property of the [AWS::ApplicationAutoScaling::ScalingPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html) resource that specifies a target tracking scaling policy configuration for Application Auto Scaling. Use a target tracking scaling policy to adjust the capacity of the specified scalable target in response to actual workloads, so that resource utilization remains at or near the target utilization value.\\n\\nFor more information, see [Target tracking scaling policies](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-target-tracking.html) in the *Application Auto Scaling User Guide* .","properties":{"CustomizedMetricSpecification":"A customized metric. You can specify either a predefined metric or a customized metric.","DisableScaleIn":"Indicates whether scale in by the target tracking scaling policy is disabled. If the value is `true` , scale in is disabled and the target tracking scaling policy won\'t remove capacity from the scalable target. Otherwise, scale in is enabled and the target tracking scaling policy can remove capacity from the scalable target. The default value is `false` .","PredefinedMetricSpecification":"A predefined metric. You can specify either a predefined metric or a customized metric.","ScaleInCooldown":"The amount of time, in seconds, after a scale-in activity completes before another scale-in activity can start. For more information and for default values, see [Define cooldown periods](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-target-tracking.html#target-tracking-cooldown) in the *Application Auto Scaling User Guide* .","ScaleOutCooldown":"The amount of time, in seconds, to wait for a previous scale-out activity to take effect. For more information and for default values, see [Define cooldown periods](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-target-tracking.html#target-tracking-cooldown) in the *Application Auto Scaling User Guide* .","TargetValue":"The target value for the metric. Although this property accepts numbers of type Double, it won\'t accept values that are either too small or too large. Values must be in the range of -2^360 to 2^360. The value must be a valid number based on the choice of metric. For example, if the metric is CPU utilization, then the target value is a percent value that represents how much of the CPU can be used before scaling out."}},"AWS::ApplicationInsights::Application":{"attributes":{"ApplicationARN":"Returns the Amazon Resource Name (ARN) of the application, such as `arn:aws:applicationinsights:us-east-1:123456789012:application/resource-group/my_resource_group` .","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the application, such as `arn:aws:applicationinsights:us-east-1:123456789012:application/resource-group/my_resource_group` ."},"description":"The `AWS::ApplicationInsights::Application` resource adds an application that is created from a resource group.","properties":{"AutoConfigurationEnabled":"If set to `true` , the application components will be configured with the monitoring configuration recommended by Application Insights.","CWEMonitorEnabled":"Indicates whether Application Insights can listen to CloudWatch events for the application resources, such as `instance terminated` , `failed deployment` , and others.","ComponentMonitoringSettings":"The monitoring settings of the components.","CustomComponents":"Describes a custom component by grouping similar standalone instances to monitor.","GroupingType":"Application Insights can create applications based on a resource group or on an account. To create an account-based application using all of the resources in the account, set this parameter to `ACCOUNT_BASED` .","LogPatternSets":"The log pattern sets.","OpsCenterEnabled":"Indicates whether Application Insights will create OpsItems for any problem that is detected by Application Insights for an application.","OpsItemSNSTopicArn":"The SNS topic provided to Application Insights that is associated with the created OpsItems to receive SNS notifications for opsItem updates.","ResourceGroupName":"The name of the resource group used for the application.","Tags":"An array of `Tags` ."}},"AWS::ApplicationInsights::Application.Alarm":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application Alarm` property type defines a CloudWatch alarm to be monitored for the component.","properties":{"AlarmName":"The name of the CloudWatch alarm to be monitored for the component.","Severity":"Indicates the degree of outage when the alarm goes off."}},"AWS::ApplicationInsights::Application.AlarmMetric":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application AlarmMetric` property type defines a metric to monitor for the component.","properties":{"AlarmMetricName":"The name of the metric to be monitored for the component. For metrics supported by Application Insights, see [Logs and metrics supported by Amazon CloudWatch Application Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/appinsights-logs-and-metrics.html) ."}},"AWS::ApplicationInsights::Application.ComponentConfiguration":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application ComponentConfiguration` property type defines the configuration settings of the component.","properties":{"ConfigurationDetails":"The configuration settings.","SubComponentTypeConfigurations":"Sub-component configurations of the component."}},"AWS::ApplicationInsights::Application.ComponentMonitoringSetting":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application ComponentMonitoringSetting` property type defines the monitoring setting of the component.","properties":{"ComponentARN":"The ARN of the component.","ComponentConfigurationMode":"Component monitoring can be configured in one of the following three modes:\\n\\n- `DEFAULT` : The component will be configured with the recommended default monitoring settings of the selected `Tier` .\\n- `CUSTOM` : The component will be configured with the customized monitoring settings that are specified in `CustomComponentConfiguration` . If used, `CustomComponentConfiguration` must be provided.\\n- `DEFAULT_WITH_OVERWRITE` : The component will be configured with the recommended default monitoring settings of the selected `Tier` , and merged with customized overwrite settings that are specified in `DefaultOverwriteComponentConfiguration` . If used, `DefaultOverwriteComponentConfiguration` must be provided.","ComponentName":"The name of the component.","CustomComponentConfiguration":"Customized monitoring settings. Required if CUSTOM mode is configured in `ComponentConfigurationMode` .","DefaultOverwriteComponentConfiguration":"Customized overwrite monitoring settings. Required if CUSTOM mode is configured in `ComponentConfigurationMode` .","Tier":"The tier of the application component. Supported tiers include `DOT_NET_CORE` , `DOT_NET_WORKER` , `DOT_NET_WEB` , `SQL_SERVER` , `SQL_SERVER_ALWAYSON_AVAILABILITY_GROUP` , `SQL_SERVER_FAILOVER_CLUSTER_INSTANCE` , `MYSQL` , `POSTGRESQL` , `JAVA_JMX` , `ORACLE` , `SAP_HANA_MULTI_NODE` , `SAP_HANA_SINGLE_NODE` , `SAP_HANA_HIGH_AVAILABILITY` , `SHAREPOINT` . `ACTIVE_DIRECTORY` , and `DEFAULT` ."}},"AWS::ApplicationInsights::Application.ConfigurationDetails":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application ConfigurationDetails` property type specifies the configuration settings.","properties":{"AlarmMetrics":"A list of metrics to monitor for the component. All component types can use `AlarmMetrics` .","Alarms":"A list of alarms to monitor for the component. All component types can use `Alarm` .","HAClusterPrometheusExporter":"The HA cluster Prometheus Exporter settings.","HANAPrometheusExporter":"The HANA DB Prometheus Exporter settings.","JMXPrometheusExporter":"A list of Java metrics to monitor for the component.","Logs":"A list of logs to monitor for the component. Only Amazon EC2 instances can use `Logs` .","WindowsEvents":"A list of Windows Events to monitor for the component. Only Amazon EC2 instances running on Windows can use `WindowsEvents` ."}},"AWS::ApplicationInsights::Application.CustomComponent":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application CustomComponent` property type describes a custom component by grouping similar standalone instances to monitor.","properties":{"ComponentName":"The name of the component.","ResourceList":"The list of resource ARNs that belong to the component."}},"AWS::ApplicationInsights::Application.HAClusterPrometheusExporter":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application HAClusterPrometheusExporter` property type defines the HA cluster Prometheus Exporter settings. For more information, see the [component configuration](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/component-config-sections.html#component-configuration-prometheus) in the CloudWatch Application Insights documentation.","properties":{"PrometheusPort":"The target port to which Prometheus sends metrics. If not specified, the default port 9668 is used."}},"AWS::ApplicationInsights::Application.HANAPrometheusExporter":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application HANAPrometheusExporter` property type defines the HANA DB Prometheus Exporter settings. For more information, see the [component configuration](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/component-config-sections.html#component-configuration-prometheus) in the CloudWatch Application Insights documentation.","properties":{"AgreeToInstallHANADBClient":"Designates whether you agree to install the HANA DB client.","HANAPort":"The HANA database port by which the exporter will query HANA metrics.","HANASID":"The three-character SAP system ID (SID) of the SAP HANA system.","HANASecretName":"The AWS Secrets Manager secret that stores HANA monitoring user credentials. The HANA Prometheus exporter uses these credentials to connect to the database and query HANA metrics.","PrometheusPort":"The target port to which Prometheus sends metrics. If not specified, the default port 9668 is used."}},"AWS::ApplicationInsights::Application.JMXPrometheusExporter":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application JMXPrometheusExporter` property type defines the JMXPrometheus Exporter configuration. For more information, see the [component configuration](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/component-config-sections.html#component-configuration-prometheus) in the CloudWatch Application Insights documentation.","properties":{"HostPort":"The host and port to connect to through remote JMX. Only one of `jmxURL` and `hostPort` can be specified.","JMXURL":"The complete JMX URL to connect to.","PrometheusPort":"The target port to send Prometheus metrics to. If not specified, the default port `9404` is used."}},"AWS::ApplicationInsights::Application.Log":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application Log` property type specifies a log to monitor for the component.","properties":{"Encoding":"The type of encoding of the logs to be monitored. The specified encoding should be included in the list of CloudWatch agent supported encodings. If not provided, CloudWatch Application Insights uses the default encoding type for the log type:\\n\\n- `APPLICATION/DEFAULT` : utf-8 encoding\\n- `SQL_SERVER` : utf-16 encoding\\n- `IIS` : ascii encoding","LogGroupName":"The CloudWatch log group name to be associated with the monitored log.","LogPath":"The path of the logs to be monitored. The log path must be an absolute Windows or Linux system file path. For more information, see [CloudWatch Agent Configuration File: Logs Section](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html#CloudWatch-Agent-Configuration-File-Logssection) .","LogType":"The log type decides the log patterns against which Application Insights analyzes the log. The log type is selected from the following: `SQL_SERVER` , `MYSQL` , `MYSQL_SLOW_QUERY` , `POSTGRESQL` , `ORACLE_ALERT` , `ORACLE_LISTENER` , `IIS` , `APPLICATION` , `WINDOWS_EVENTS` , `WINDOWS_EVENTS_ACTIVE_DIRECTORY` , `WINDOWS_EVENTS_DNS` , `WINDOWS_EVENTS_IIS` , `WINDOWS_EVENTS_SHAREPOINT` , `SQL_SERVER_ALWAYSON_AVAILABILITY_GROUP` , `SQL_SERVER_FAILOVER_CLUSTER_INSTANCE` , `STEP_FUNCTION` , `API_GATEWAY_ACCESS` , `API_GATEWAY_EXECUTION` , `SAP_HANA_LOGS` , `SAP_HANA_TRACE` , `SAP_HANA_HIGH_AVAILABILITY` , and `DEFAULT` .","PatternSet":"The log pattern set."}},"AWS::ApplicationInsights::Application.LogPattern":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application LogPattern` property type specifies an object that defines the log patterns that belong to a `LogPatternSet` .","properties":{"Pattern":"A regular expression that defines the log pattern. A log pattern can contain up to 50 characters, and it cannot be empty.","PatternName":"The name of the log pattern. A log pattern name can contain up to 50 characters, and it cannot be empty. The characters can be Unicode letters, digits, or one of the following symbols: period, dash, underscore.","Rank":"The rank of the log pattern."}},"AWS::ApplicationInsights::Application.LogPatternSet":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application LogPatternSet` property type specifies the log pattern set.","properties":{"LogPatterns":"A list of objects that define the log patterns that belong to `LogPatternSet` .","PatternSetName":"The name of the log pattern. A log pattern name can contain up to 30 characters, and it cannot be empty. The characters can be Unicode letters, digits, or one of the following symbols: period, dash, underscore."}},"AWS::ApplicationInsights::Application.SubComponentConfigurationDetails":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application SubComponentConfigurationDetails` property type specifies the configuration settings of the sub-components.","properties":{"AlarmMetrics":"A list of metrics to monitor for the component. All component types can use `AlarmMetrics` .","Logs":"A list of logs to monitor for the component. Only Amazon EC2 instances can use `Logs` .","WindowsEvents":"A list of Windows Events to monitor for the component. Only Amazon EC2 instances running on Windows can use `WindowsEvents` ."}},"AWS::ApplicationInsights::Application.SubComponentTypeConfiguration":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application SubComponentTypeConfiguration` property type specifies the sub-component configurations for a component.","properties":{"SubComponentConfigurationDetails":"The configuration settings of the sub-components.","SubComponentType":"The sub-component type."}},"AWS::ApplicationInsights::Application.WindowsEvent":{"attributes":{},"description":"The `AWS::ApplicationInsights::Application WindowsEvent` property type specifies a Windows Event to monitor for the component.","properties":{"EventLevels":"The levels of event to log. You must specify each level to log. Possible values include `INFORMATION` , `WARNING` , `ERROR` , `CRITICAL` , and `VERBOSE` . This field is required for each type of Windows Event to log.","EventName":"The type of Windows Events to log, equivalent to the Windows Event log channel name. For example, System, Security, CustomEventName, and so on. This field is required for each type of Windows event to log.","LogGroupName":"The CloudWatch log group name to be associated with the monitored log.","PatternSet":"The log pattern set."}},"AWS::Athena::CapacityReservation":{"attributes":{"AllocatedDpus":"The number of data processing units currently allocated.","Arn":"The ARN of the capacity reservation.","CreationTime":"The time in UTC epoch millis when the capacity reservation was created.","LastSuccessfulAllocationTime":"The time of the most recent capacity allocation that succeeded.","Ref":"`Ref` returns the ARN of the capacity reservation.","Status":"The status of the capacity reservation."},"description":"Specifies a capacity reservation with the provided name and number of requested data processing units.","properties":{"CapacityAssignmentConfiguration":"Assigns Athena workgroups (and hence their queries) to capacity reservations. A capacity reservation can have only one capacity assignment configuration, but the capacity assignment configuration can be made up of multiple individual assignments. Each assignment specifies how Athena queries can consume capacity from the capacity reservation that their workgroup is mapped to.","Name":"The name of the capacity reservation.","Tags":"An array of key-value pairs to apply to the capacity reservation.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","TargetDpus":"The number of data processing units requested."}},"AWS::Athena::CapacityReservation.CapacityAssignment":{"attributes":{},"description":"A mapping between one or more workgroups and a capacity reservation.","properties":{"WorkgroupNames":"The list of workgroup names for the capacity assignment."}},"AWS::Athena::CapacityReservation.CapacityAssignmentConfiguration":{"attributes":{},"description":"Assigns Athena workgroups (and hence their queries) to capacity reservations. A capacity reservation can have only one capacity assignment configuration, but the capacity assignment configuration can be made up of multiple individual assignments. Each assignment specifies how Athena queries can consume capacity from the capacity reservation that their workgroup is mapped to.","properties":{"CapacityAssignments":"The list of assignments that make up the capacity assignment configuration."}},"AWS::Athena::DataCatalog":{"attributes":{"Ref":"`Ref` returns the name of the data catalog."},"description":"The AWS::Athena::DataCatalog resource specifies an Amazon Athena data catalog, which contains a name, description, type, parameters, and tags. For more information, see [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) in the *Amazon Athena API Reference* .","properties":{"Description":"A description of the data catalog.","Name":"The name of the data catalog. The catalog name must be unique for the AWS account and can use a maximum of 128 alphanumeric, underscore, at sign, or hyphen characters.","Parameters":"Specifies the Lambda function or functions to use for the data catalog. The mapping used depends on the catalog type.\\n\\n- The `HIVE` data catalog type uses the following syntax. The `metadata-function` parameter is required. `The sdk-version` parameter is optional and defaults to the currently supported version.\\n\\n`metadata-function= *lambda_arn* , sdk-version= *version_number*`\\n- The `LAMBDA` data catalog type uses one of the following sets of required parameters, but not both.\\n\\n- When one Lambda function processes metadata and another Lambda function reads data, the following syntax is used. Both parameters are required.\\n\\n`metadata-function= *lambda_arn* , record-function= *lambda_arn*`\\n- A composite Lambda function that processes both metadata and data uses the following syntax.\\n\\n`function= *lambda_arn*`\\n- The `GLUE` type takes a catalog ID parameter and is required. The `*catalog_id*` is the account ID of the AWS account to which the Glue catalog belongs.\\n\\n`catalog-id= *catalog_id*`\\n\\n- The `GLUE` data catalog type also applies to the default `AwsDataCatalog` that already exists in your account, of which you can have only one and cannot modify.\\n- Queries that specify a GLUE data catalog other than the default `AwsDataCatalog` must be run on Athena engine version 2.\\n- In Regions where Athena engine version 2 is not available, creating new GLUE data catalogs results in an `INVALID_INPUT` error.","Tags":"The tags (key-value pairs) to associate with this resource.","Type":"The type of data catalog: `LAMBDA` for a federated catalog, `GLUE` for AWS Glue Catalog, or `HIVE` for an external hive metastore."}},"AWS::Athena::NamedQuery":{"attributes":{"NamedQueryId":"The unique ID of the query.","Ref":"`Ref` returns the resource name."},"description":"The `AWS::Athena::NamedQuery` resource specifies an Amazon Athena saved query, where `QueryString` contains the SQL query statements that make up the query.","properties":{"Database":"The database to which the query belongs.","Description":"The query description.","Name":"The query name.","QueryString":"The SQL statements that make up the query.","WorkGroup":"The name of the workgroup that contains the named query."}},"AWS::Athena::PreparedStatement":{"attributes":{"Ref":"`Ref` returns the name of the prepared statement."},"description":"Specifies a prepared statement for use with SQL queries in Athena.","properties":{"Description":"The description of the prepared statement.","QueryStatement":"The query string for the prepared statement.","StatementName":"The name of the prepared statement.","WorkGroup":"The workgroup to which the prepared statement belongs."}},"AWS::Athena::WorkGroup":{"attributes":{"CreationTime":"The date and time the workgroup was created, as a UNIX timestamp in seconds. For example: `1582761016` .","Ref":"`Ref` returns the name of the WorkGroup. For example:\\n\\n`{ \\"Ref\\": \\"myWorkGroup\\" }`","WorkGroupConfiguration.EngineVersion.EffectiveEngineVersion":""},"description":"The AWS::Athena::WorkGroup resource specifies an Amazon Athena workgroup, which contains a name, description, creation time, state, and other configuration, listed under `WorkGroupConfiguration` . Each workgroup enables you to isolate queries for you or your group from other queries in the same account. For more information, see [CreateWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateWorkGroup.html) in the *Amazon Athena API Reference* .","properties":{"Description":"The workgroup description.","Name":"The workgroup name.","RecursiveDeleteOption":"The option to delete a workgroup and its contents even if the workgroup contains any named queries. The default is false.","State":"The state of the workgroup: ENABLED or DISABLED.","Tags":"The tags (key-value pairs) to associate with this resource.","WorkGroupConfiguration":"The configuration of the workgroup, which includes the location in Amazon S3 where query results are stored, the encryption option, if any, used for query results, whether Amazon CloudWatch Metrics are enabled for the workgroup, and the limit for the amount of bytes scanned (cutoff) per query, if it is specified. The `EnforceWorkGroupConfiguration` option determines whether workgroup settings override client-side query settings."}},"AWS::Athena::WorkGroup.AclConfiguration":{"attributes":{},"description":"Indicates that an Amazon S3 canned ACL should be set to control ownership of stored query results. When Athena stores query results in Amazon S3, the canned ACL is set with the `x-amz-acl` request header. For more information about S3 Object Ownership, see [Object Ownership settings](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html#object-ownership-overview) in the *Amazon S3 User Guide* .","properties":{"S3AclOption":"The Amazon S3 canned ACL that Athena should specify when storing query results. Currently the only supported canned ACL is `BUCKET_OWNER_FULL_CONTROL` . If a query runs in a workgroup and the workgroup overrides client-side settings, then the Amazon S3 canned ACL specified in the workgroup\'s settings is used for all queries that run in the workgroup. For more information about Amazon S3 canned ACLs, see [Canned ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl) in the *Amazon S3 User Guide* ."}},"AWS::Athena::WorkGroup.CustomerContentEncryptionConfiguration":{"attributes":{},"description":"Specifies the KMS key that is used to encrypt the user\'s data stores in Athena. This setting does not apply to Athena SQL workgroups.","properties":{"KmsKey":"The KMS key that is used to encrypt the user\'s data stores in Athena."}},"AWS::Athena::WorkGroup.EncryptionConfiguration":{"attributes":{},"description":"If query results are encrypted in Amazon S3, indicates the encryption option used (for example, `SSE_KMS` or `CSE_KMS` ) and key information.","properties":{"EncryptionOption":"Indicates whether Amazon S3 server-side encryption with Amazon S3-managed keys ( `SSE_S3` ), server-side encryption with KMS-managed keys ( `SSE_KMS` ), or client-side encryption with KMS-managed keys ( `CSE_KMS` ) is used.\\n\\nIf a query runs in a workgroup and the workgroup overrides client-side settings, then the workgroup\'s setting for encryption is used. It specifies whether query results must be encrypted, for all queries that run in this workgroup.","KmsKey":"For `SSE_KMS` and `CSE_KMS` , this is the KMS key ARN or ID."}},"AWS::Athena::WorkGroup.EngineVersion":{"attributes":{},"description":"The Athena engine version for running queries, or the PySpark engine version for running sessions.","properties":{"EffectiveEngineVersion":"Read only. The engine version on which the query runs. If the user requests a valid engine version other than Auto, the effective engine version is the same as the engine version that the user requested. If the user requests Auto, the effective engine version is chosen by Athena. When a request to update the engine version is made by a `CreateWorkGroup` or `UpdateWorkGroup` operation, the `EffectiveEngineVersion` field is ignored.","SelectedEngineVersion":"The engine version requested by the user. Possible values are determined by the output of `ListEngineVersions` , including AUTO. The default is AUTO."}},"AWS::Athena::WorkGroup.ResultConfiguration":{"attributes":{},"description":"The location in Amazon S3 where query and calculation results are stored and the encryption option, if any, used for query and calculation results. These are known as \\"client-side settings\\". If workgroup settings override client-side settings, then the query uses the workgroup settings.","properties":{"AclConfiguration":"Indicates that an Amazon S3 canned ACL should be set to control ownership of stored query results. Currently the only supported canned ACL is `BUCKET_OWNER_FULL_CONTROL` . This is a client-side setting. If workgroup settings override client-side settings, then the query uses the ACL configuration that is specified for the workgroup, and also uses the location for storing query results specified in the workgroup. See `EnforceWorkGroupConfiguration` .","EncryptionConfiguration":"If query results are encrypted in Amazon S3, indicates the encryption option used (for example, `SSE_KMS` or `CSE_KMS` ) and key information. This is a client-side setting. If workgroup settings override client-side settings, then the query uses the encryption configuration that is specified for the workgroup, and also uses the location for storing query results specified in the workgroup. See `EnforceWorkGroupConfiguration` and [Workgroup Settings Override Client-Side Settings](https://docs.aws.amazon.com/athena/latest/ug/workgroups-settings-override.html) .","ExpectedBucketOwner":"The account ID that you expect to be the owner of the Amazon S3 bucket specified by `ResultConfiguration:OutputLocation` . If set, Athena uses the value for `ExpectedBucketOwner` when it makes Amazon S3 calls to your specified output location. If the `ExpectedBucketOwner` account ID does not match the actual owner of the Amazon S3 bucket, the call fails with a permissions error.\\n\\nThis is a client-side setting. If workgroup settings override client-side settings, then the query uses the `ExpectedBucketOwner` setting that is specified for the workgroup, and also uses the location for storing query results specified in the workgroup. See `EnforceWorkGroupConfiguration` .","OutputLocation":"The location in Amazon S3 where your query results are stored, such as `s3://path/to/query/bucket/` . To run a query, you must specify the query results location using either a client-side setting for individual queries or a location specified by the workgroup. If workgroup settings override client-side settings, then the query uses the location specified for the workgroup. If no query location is set, Athena issues an error. For more information, see [Working with Query Results, Output Files, and Query History](https://docs.aws.amazon.com/athena/latest/ug/querying.html) and `EnforceWorkGroupConfiguration` ."}},"AWS::Athena::WorkGroup.WorkGroupConfiguration":{"attributes":{},"description":"The configuration of the workgroup, which includes the location in Amazon S3 where query results are stored, the encryption option, if any, used for query results, whether Amazon CloudWatch Metrics are enabled for the workgroup, and the limit for the amount of bytes scanned (cutoff) per query, if it is specified. The `EnforceWorkGroupConfiguration` option determines whether workgroup settings override client-side query settings.","properties":{"AdditionalConfiguration":"Specifies a user defined JSON string that is passed to the session engine.","BytesScannedCutoffPerQuery":"The upper limit (cutoff) for the amount of bytes a single query in a workgroup is allowed to scan. No default is defined.\\n\\n> This property currently supports integer types. Support for long values is planned.","CustomerContentEncryptionConfiguration":"Specifies the KMS key that is used to encrypt the user\'s data stores in Athena. This setting does not apply to Athena SQL workgroups.","EnforceWorkGroupConfiguration":"If set to \\"true\\", the settings for the workgroup override client-side settings. If set to \\"false\\", client-side settings are used. For more information, see [Workgroup Settings Override Client-Side Settings](https://docs.aws.amazon.com/athena/latest/ug/workgroups-settings-override.html) .","EngineVersion":"The engine version that all queries running on the workgroup use.","ExecutionRole":"Role used to access user resources in an Athena for Apache Spark session. This property applies only to Spark-enabled workgroups in Athena.","PublishCloudWatchMetricsEnabled":"Indicates that the Amazon CloudWatch metrics are enabled for the workgroup.","RequesterPaysEnabled":"If set to `true` , allows members assigned to a workgroup to reference Amazon S3 Requester Pays buckets in queries. If set to `false` , workgroup members cannot query data from Requester Pays buckets, and queries that retrieve data from Requester Pays buckets cause an error. The default is `false` . For more information about Requester Pays buckets, see [Requester Pays Buckets](https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html) in the *Amazon Simple Storage Service Developer Guide* .","ResultConfiguration":"Specifies the location in Amazon S3 where query results are stored and the encryption option, if any, used for query results. For more information, see [Working with Query Results, Output Files, and Query History](https://docs.aws.amazon.com/athena/latest/ug/querying.html) ."}},"AWS::AuditManager::Assessment":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the assessment. For example, `arn:aws:auditmanager:us-east-1:123456789012:assessment/111A1A1A-22B2-33C3-DDD4-55E5E5E555E5` .","AssessmentId":"The unique identifier for the assessment. For example, `111A1A1A-22B2-33C3-DDD4-55E5E5E555E5` .","CreationTime":"The time when the assessment was created. For example, `1607582033.373` .","Ref":"`Ref` returns the assessment ID. For example:\\n\\n`{ \\"Ref\\": \\"111A1A1A-22B2-33C3-DDD4-55E5E5E555E5\\" }`"},"description":"The `AWS::AuditManager::Assessment` resource is an Audit Manager resource type that defines the scope of audit evidence collected by Audit Manager . An Audit Manager assessment is an implementation of an Audit Manager framework.","properties":{"AssessmentReportsDestination":"The destination that evidence reports are stored in for the assessment.","AwsAccount":"The AWS account that\'s associated with the assessment.","Delegations":"The delegations that are associated with the assessment.","Description":"The description of the assessment.","FrameworkId":"The unique identifier for the framework.","Name":"The name of the assessment.","Roles":"The roles that are associated with the assessment.","Scope":"The wrapper of AWS accounts and services that are in scope for the assessment.","Status":"The overall status of the assessment.\\n\\nWhen you create a new assessment, the initial `Status` value is always `ACTIVE` . When you create an assessment, even if you specify the value as `INACTIVE` , the value overrides to `ACTIVE` .\\n\\nAfter you create an assessment, you can change the value of the `Status` property at any time. For example, when you want to stop collecting evidence for your assessment, you can change the assessment status to `INACTIVE` .","Tags":"The tags that are associated with the assessment."}},"AWS::AuditManager::Assessment.AWSAccount":{"attributes":{},"description":"The `AWSAccount` property type specifies the wrapper of the AWS account details, such as account ID, email address, and so on.","properties":{"EmailAddress":"The email address that\'s associated with the AWS account .","Id":"The identifier for the AWS account .","Name":"The name of the AWS account ."}},"AWS::AuditManager::Assessment.AWSService":{"attributes":{},"description":"The `AWSService` property type specifies an AWS service such as Amazon S3 , AWS CloudTrail , and so on.","properties":{"ServiceName":"The name of the AWS service ."}},"AWS::AuditManager::Assessment.AssessmentReportsDestination":{"attributes":{},"description":"The `AssessmentReportsDestination` property type specifies the location in which AWS Audit Manager saves assessment reports for the given assessment.","properties":{"Destination":"The destination bucket where Audit Manager stores assessment reports.","DestinationType":"The destination type, such as Amazon S3."}},"AWS::AuditManager::Assessment.Delegation":{"attributes":{},"description":"The `Delegation` property type specifies the assignment of a control set to a delegate for review.","properties":{"AssessmentId":"The identifier for the assessment that\'s associated with the delegation.","AssessmentName":"The name of the assessment that\'s associated with the delegation.","Comment":"The comment that\'s related to the delegation.","ControlSetId":"The identifier for the control set that\'s associated with the delegation.","CreatedBy":"The user or role that created the delegation.\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `100`\\n\\n*Pattern* : `^[a-zA-Z0-9-_()\\\\\\\\[\\\\\\\\]\\\\\\\\s]+$`","CreationTime":"Specifies when the delegation was created.","Id":"The unique identifier for the delegation.","LastUpdated":"Specifies when the delegation was last updated.","RoleArn":"The Amazon Resource Name (ARN) of the IAM role.","RoleType":"The type of customer persona.\\n\\n> In `CreateAssessment` , `roleType` can only be `PROCESS_OWNER` .\\n> \\n> In `UpdateSettings` , `roleType` can only be `PROCESS_OWNER` .\\n> \\n> In `BatchCreateDelegationByAssessment` , `roleType` can only be `RESOURCE_OWNER` .","Status":"The status of the delegation."}},"AWS::AuditManager::Assessment.Role":{"attributes":{},"description":"The `Role` property type specifies the wrapper that contains AWS Audit Manager role information, such as the role type and IAM Amazon Resource Name (ARN).","properties":{"RoleArn":"The Amazon Resource Name (ARN) of the IAM role.","RoleType":"The type of customer persona.\\n\\n> In `CreateAssessment` , `roleType` can only be `PROCESS_OWNER` .\\n> \\n> In `UpdateSettings` , `roleType` can only be `PROCESS_OWNER` .\\n> \\n> In `BatchCreateDelegationByAssessment` , `roleType` can only be `RESOURCE_OWNER` ."}},"AWS::AuditManager::Assessment.Scope":{"attributes":{},"description":"The `Scope` property type specifies the wrapper that contains the AWS accounts and services that are in scope for the assessment.","properties":{"AwsAccounts":"The AWS accounts that are included in the scope of the assessment.","AwsServices":"The AWS services that are included in the scope of the assessment."}},"AWS::AutoScaling::AutoScalingGroup":{"attributes":{"Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource name. For example: `mystack-myasgroup-NT5EUXTNTXXD` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::AutoScaling::AutoScalingGroup` resource defines an Amazon EC2 Auto Scaling group, which is a collection of Amazon EC2 instances that are treated as a logical grouping for the purposes of automatic scaling and management.\\n\\nFor more information about Amazon EC2 Auto Scaling, see the [Amazon EC2 Auto Scaling User Guide](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) .\\n\\n> Amazon EC2 Auto Scaling configures instances launched as part of an Auto Scaling group using either a [launch template](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) or a launch configuration. We strongly recommend that you do not use launch configurations. They do not provide full functionality for Amazon EC2 Auto Scaling or Amazon EC2. For more information, see [Launch configurations](https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-configurations.html) and [Migrate AWS CloudFormation stacks from launch configurations to launch templates](https://docs.aws.amazon.com/autoscaling/ec2/userguide/migrate-launch-configurations-with-cloudformation.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"AutoScalingGroupName":"The name of the Auto Scaling group. This name must be unique per Region per account.\\n\\nThe name can contain any ASCII character 33 to 126 including most punctuation characters, digits, and upper and lowercased letters.\\n\\n> You cannot use a colon (:) in the name.","AvailabilityZones":"A list of Availability Zones where instances in the Auto Scaling group can be created. Used for launching into the default VPC subnet in each Availability Zone when not using the `VPCZoneIdentifier` property, or for attaching a network interface when an existing network interface ID is specified in a launch template.","CapacityRebalance":"Indicates whether Capacity Rebalancing is enabled. Otherwise, Capacity Rebalancing is disabled. When you turn on Capacity Rebalancing, Amazon EC2 Auto Scaling attempts to launch a Spot Instance whenever Amazon EC2 notifies that a Spot Instance is at an elevated risk of interruption. After launching a new instance, it then terminates an old instance. For more information, see [Use Capacity Rebalancing to handle Amazon EC2 Spot Interruptions](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-capacity-rebalancing.html) in the in the *Amazon EC2 Auto Scaling User Guide* .","Context":"Reserved.","Cooldown":"*Only needed if you use simple scaling policies.*\\n\\nThe amount of time, in seconds, between one scaling activity ending and another one starting due to simple scaling policies. For more information, see [Scaling cooldowns for Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/Cooldown.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nDefault: `300` seconds","DefaultInstanceWarmup":"The amount of time, in seconds, until a new instance is considered to have finished initializing and resource consumption to become stable after it enters the `InService` state.\\n\\nDuring an instance refresh, Amazon EC2 Auto Scaling waits for the warm-up period after it replaces an instance before it moves on to replacing the next instance. Amazon EC2 Auto Scaling also waits for the warm-up period before aggregating the metrics for new instances with existing instances in the Amazon CloudWatch metrics that are used for scaling, resulting in more reliable usage data. For more information, see [Set the default instance warmup for an Auto Scaling group](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-default-instance-warmup.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\n> To manage various warm-up settings at the group level, we recommend that you set the default instance warmup, *even if it is set to 0 seconds* . To remove a value that you previously set, include the property but specify `-1` for the value. However, we strongly recommend keeping the default instance warmup enabled by specifying a value of `0` or other nominal value. \\n\\nDefault: None","DesiredCapacity":"The desired capacity is the initial capacity of the Auto Scaling group at the time of its creation and the capacity it attempts to maintain. It can scale beyond this capacity if you configure automatic scaling.\\n\\nThe number must be greater than or equal to the minimum size of the group and less than or equal to the maximum size of the group. If you do not specify a desired capacity when creating the stack, the default is the minimum size of the group.\\n\\nCloudFormation marks the Auto Scaling group as successful (by setting its status to CREATE_COMPLETE) when the desired capacity is reached. However, if a maximum Spot price is set in the launch template or launch configuration that you specified, then desired capacity is not used as a criteria for success. Whether your request is fulfilled depends on Spot Instance capacity and your maximum price.","DesiredCapacityType":"The unit of measurement for the value specified for desired capacity. Amazon EC2 Auto Scaling supports `DesiredCapacityType` for attribute-based instance type selection only. For more information, see [Creating an Auto Scaling group using attribute-based instance type selection](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-asg-instance-type-requirements.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nBy default, Amazon EC2 Auto Scaling specifies `units` , which translates into number of instances.\\n\\nValid values: `units` | `vcpu` | `memory-mib`","HealthCheckGracePeriod":"The amount of time, in seconds, that Amazon EC2 Auto Scaling waits before checking the health status of an EC2 instance that has come into service and marking it unhealthy due to a failed health check. This is useful if your instances do not immediately pass their health checks after they enter the `InService` state. For more information, see [Set the health check grace period for an Auto Scaling group](https://docs.aws.amazon.com/autoscaling/ec2/userguide/health-check-grace-period.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nDefault: `0` seconds","HealthCheckType":"A comma-separated value string of one or more health check types.\\n\\nThe valid values are `EC2` , `ELB` , and `VPC_LATTICE` . `EC2` is the default health check and cannot be disabled. For more information, see [Health checks for Auto Scaling instances](https://docs.aws.amazon.com/autoscaling/ec2/userguide/healthcheck.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nOnly specify `EC2` if you must clear a value that was previously set.","InstanceId":"The ID of the instance used to base the launch configuration on. For more information, see [Create an Auto Scaling group using an EC2 instance](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-asg-from-instance.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nIf you specify `LaunchTemplate` , `MixedInstancesPolicy` , or `LaunchConfigurationName` , don\'t specify `InstanceId` .","LaunchConfigurationName":"The name of the launch configuration to use to launch instances.\\n\\nRequired only if you don\'t specify `LaunchTemplate` , `MixedInstancesPolicy` , or `InstanceId` .","LaunchTemplate":"Information used to specify the launch template and version to use to launch instances. You can alternatively associate a launch template to the Auto Scaling group by specifying a `MixedInstancesPolicy` . For more information about creating launch templates, see [Create a launch template for an Auto Scaling group](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nIf you omit this property, you must specify `MixedInstancesPolicy` , `LaunchConfigurationName` , or `InstanceId` .","LifecycleHookSpecificationList":"One or more lifecycle hooks to add to the Auto Scaling group before instances are launched.","LoadBalancerNames":"A list of Classic Load Balancers associated with this Auto Scaling group. For Application Load Balancers, Network Load Balancers, and Gateway Load Balancers, specify the `TargetGroupARNs` property instead.","MaxInstanceLifetime":"The maximum amount of time, in seconds, that an instance can be in service. The default is null. If specified, the value must be either 0 or a number equal to or greater than 86,400 seconds (1 day). For more information, see [Replacing Auto Scaling instances based on maximum instance lifetime](https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-max-instance-lifetime.html) in the *Amazon EC2 Auto Scaling User Guide* .","MaxSize":"The maximum size of the group.\\n\\n> With a mixed instances policy that uses instance weighting, Amazon EC2 Auto Scaling may need to go above `MaxSize` to meet your capacity requirements. In this event, Amazon EC2 Auto Scaling will never go above `MaxSize` by more than your largest instance weight (weights that define how many units each instance contributes to the desired capacity of the group).","MetricsCollection":"Enables the monitoring of group metrics of an Auto Scaling group. By default, these metrics are disabled.","MinSize":"The minimum size of the group.","MixedInstancesPolicy":"An embedded object that specifies a mixed instances policy.\\n\\nThe policy includes properties that not only define the distribution of On-Demand Instances and Spot Instances, the maximum price to pay for Spot Instances (optional), and how the Auto Scaling group allocates instance types to fulfill On-Demand and Spot capacities, but also the properties that specify the instance configuration information—the launch template and instance types. The policy can also include a weight for each instance type and different launch templates for individual instance types.\\n\\nFor more information, see [Auto Scaling groups with multiple instance types and purchase options](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-mixed-instances-groups.html) in the *Amazon EC2 Auto Scaling User Guide* .","NewInstancesProtectedFromScaleIn":"Indicates whether newly launched instances are protected from termination by Amazon EC2 Auto Scaling when scaling in. For more information about preventing instances from terminating on scale in, see [Using instance scale-in protection](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-protection.html) in the *Amazon EC2 Auto Scaling User Guide* .","NotificationConfigurations":"Configures an Auto Scaling group to send notifications when specified events take place.","PlacementGroup":"The name of the placement group into which to launch your instances. For more information, see [Placement groups](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\n> A *cluster* placement group is a logical grouping of instances within a single Availability Zone. You cannot specify multiple Availability Zones and a cluster placement group.","ServiceLinkedRoleARN":"The Amazon Resource Name (ARN) of the service-linked role that the Auto Scaling group uses to call other AWS service on your behalf. By default, Amazon EC2 Auto Scaling uses a service-linked role named `AWSServiceRoleForAutoScaling` , which it creates if it does not exist. For more information, see [Service-linked roles](https://docs.aws.amazon.com/autoscaling/ec2/userguide/autoscaling-service-linked-role.html) in the *Amazon EC2 Auto Scaling User Guide* .","Tags":"One or more tags. You can tag your Auto Scaling group and propagate the tags to the Amazon EC2 instances it launches. Tags are not propagated to Amazon EBS volumes. To add tags to Amazon EBS volumes, specify the tags in a launch template but use caution. If the launch template specifies an instance tag with a key that is also specified for the Auto Scaling group, Amazon EC2 Auto Scaling overrides the value of that instance tag with the value specified by the Auto Scaling group. For more information, see [Tag Auto Scaling groups and instances](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-tagging.html) in the *Amazon EC2 Auto Scaling User Guide* .","TargetGroupARNs":"The Amazon Resource Names (ARN) of the Elastic Load Balancing target groups to associate with the Auto Scaling group. Instances are registered as targets with the target groups. The target groups receive incoming traffic and route requests to one or more registered targets. For more information, see [Use Elastic Load Balancing to distribute traffic across the instances in your Auto Scaling group](https://docs.aws.amazon.com/autoscaling/ec2/userguide/autoscaling-load-balancer.html) in the *Amazon EC2 Auto Scaling User Guide* .","TerminationPolicies":"A policy or a list of policies that are used to select the instance to terminate. These policies are executed in the order that you list them. For more information, see [Work with Amazon EC2 Auto Scaling termination policies](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-termination-policies.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nValid values: `Default` | `AllocationStrategy` | `ClosestToNextInstanceHour` | `NewestInstance` | `OldestInstance` | `OldestLaunchConfiguration` | `OldestLaunchTemplate` | `arn:aws:lambda:region:account-id:function:my-function:my-alias`","VPCZoneIdentifier":"A list of subnet IDs for a virtual private cloud (VPC) where instances in the Auto Scaling group can be created.\\n\\nIf this resource specifies public subnets and is also in a VPC that is defined in the same stack template, you must use the [DependsOn attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) to declare a dependency on the [VPC-gateway attachment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html) .\\n\\n> When you update `VPCZoneIdentifier` , this retains the same Auto Scaling group and replaces old instances with new ones, according to the specified subnets. You can optionally specify how CloudFormation handles these updates by using an [UpdatePolicy attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html) . \\n\\nRequired to launch instances into a nondefault VPC. If you specify `VPCZoneIdentifier` with `AvailabilityZones` , the subnets that you specify for this property must reside in those Availability Zones."}},"AWS::AutoScaling::AutoScalingGroup.AcceleratorCountRequest":{"attributes":{},"description":"`AcceleratorCountRequest` is a property of the `InstanceRequirements` property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplateOverrides](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplateoverrides.html) property type that describes the minimum and maximum number of accelerators for an instance type.","properties":{"Max":"The maximum value.","Min":"The minimum value."}},"AWS::AutoScaling::AutoScalingGroup.AcceleratorTotalMemoryMiBRequest":{"attributes":{},"description":"`AcceleratorTotalMemoryMiBRequest` is a property of the `InstanceRequirements` property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplateOverrides](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplateoverrides.html) property type that describes the minimum and maximum total memory size for the accelerators for an instance type, in MiB.","properties":{"Max":"The memory maximum in MiB.","Min":"The memory minimum in MiB."}},"AWS::AutoScaling::AutoScalingGroup.BaselineEbsBandwidthMbpsRequest":{"attributes":{},"description":"`BaselineEbsBandwidthMbpsRequest` is a property of the `InstanceRequirements` property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplateOverrides](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplateoverrides.html) property type that describes the minimum and maximum baseline bandwidth performance for an instance type, in Mbps.","properties":{"Max":"The maximum value in Mbps.","Min":"The minimum value in Mbps."}},"AWS::AutoScaling::AutoScalingGroup.InstanceRequirements":{"attributes":{},"description":"The attributes for the instance types for a mixed instances policy. Amazon EC2 Auto Scaling uses your specified requirements to identify instance types. Then, it uses your On-Demand and Spot allocation strategies to launch instances from these instance types.\\n\\nWhen you specify multiple attributes, you get instance types that satisfy all of the specified attributes. If you specify multiple values for an attribute, you get instance types that satisfy any of the specified values.\\n\\nTo limit the list of instance types from which Amazon EC2 Auto Scaling can identify matching instance types, you can use one of the following parameters, but not both in the same request:\\n\\n- `AllowedInstanceTypes` - The instance types to include in the list. All other instance types are ignored, even if they match your specified attributes.\\n- `ExcludedInstanceTypes` - The instance types to exclude from the list, even if they match your specified attributes.\\n\\n> You must specify `VCpuCount` and `MemoryMiB` . All other attributes are optional. Any unspecified optional attribute is set to its default. \\n\\nFor an example template, see [Auto scaling template snippets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-autoscaling.html) .\\n\\nFor more information, see [Creating an Auto Scaling group using attribute-based instance type selection](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-asg-instance-type-requirements.html) in the *Amazon EC2 Auto Scaling User Guide* . For help determining which instance types match your attributes before you apply them to your Auto Scaling group, see [Preview instance types with specified attributes](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html#ec2fleet-get-instance-types-from-instance-requirements) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\n`InstanceRequirements` is a property of the `LaunchTemplateOverrides` property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplate.html) property type.","properties":{"AcceleratorCount":"The minimum and maximum number of accelerators (GPUs, FPGAs, or AWS Inferentia chips) for an instance type.\\n\\nTo exclude accelerator-enabled instance types, set `Max` to `0` .\\n\\nDefault: No minimum or maximum limits","AcceleratorManufacturers":"Indicates whether instance types must have accelerators by specific manufacturers.\\n\\n- For instance types with NVIDIA devices, specify `nvidia` .\\n- For instance types with AMD devices, specify `amd` .\\n- For instance types with AWS devices, specify `amazon-web-services` .\\n- For instance types with Xilinx devices, specify `xilinx` .\\n\\nDefault: Any manufacturer","AcceleratorNames":"Lists the accelerators that must be on an instance type.\\n\\n- For instance types with NVIDIA A100 GPUs, specify `a100` .\\n- For instance types with NVIDIA V100 GPUs, specify `v100` .\\n- For instance types with NVIDIA K80 GPUs, specify `k80` .\\n- For instance types with NVIDIA T4 GPUs, specify `t4` .\\n- For instance types with NVIDIA M60 GPUs, specify `m60` .\\n- For instance types with AMD Radeon Pro V520 GPUs, specify `radeon-pro-v520` .\\n- For instance types with Xilinx VU9P FPGAs, specify `vu9p` .\\n\\nDefault: Any accelerator","AcceleratorTotalMemoryMiB":"The minimum and maximum total memory size for the accelerators on an instance type, in MiB.\\n\\nDefault: No minimum or maximum limits","AcceleratorTypes":"Lists the accelerator types that must be on an instance type.\\n\\n- For instance types with GPU accelerators, specify `gpu` .\\n- For instance types with FPGA accelerators, specify `fpga` .\\n- For instance types with inference accelerators, specify `inference` .\\n\\nDefault: Any accelerator type","AllowedInstanceTypes":"The instance types to apply your specified attributes against. All other instance types are ignored, even if they match your specified attributes.\\n\\nYou can use strings with one or more wild cards, represented by an asterisk ( `*` ), to allow an instance type, size, or generation. The following are examples: `m5.8xlarge` , `c5*.*` , `m5a.*` , `r*` , `*3*` .\\n\\nFor example, if you specify `c5*` , Amazon EC2 Auto Scaling will allow the entire C5 instance family, which includes all C5a and C5n instance types. If you specify `m5a.*` , Amazon EC2 Auto Scaling will allow all the M5a instance types, but not the M5n instance types.\\n\\n> If you specify `AllowedInstanceTypes` , you can\'t specify `ExcludedInstanceTypes` . \\n\\nDefault: All instance types","BareMetal":"Indicates whether bare metal instance types are included, excluded, or required.\\n\\nDefault: `excluded`","BaselineEbsBandwidthMbps":"The minimum and maximum baseline bandwidth performance for an instance type, in Mbps. For more information, see [Amazon EBS–optimized instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\nDefault: No minimum or maximum limits","BurstablePerformance":"Indicates whether burstable performance instance types are included, excluded, or required. For more information, see [Burstable performance instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\nDefault: `excluded`","CpuManufacturers":"Lists which specific CPU manufacturers to include.\\n\\n- For instance types with Intel CPUs, specify `intel` .\\n- For instance types with AMD CPUs, specify `amd` .\\n- For instance types with AWS CPUs, specify `amazon-web-services` .\\n\\n> Don\'t confuse the CPU hardware manufacturer with the CPU hardware architecture. Instances will be launched with a compatible CPU architecture based on the Amazon Machine Image (AMI) that you specify in your launch template. \\n\\nDefault: Any manufacturer","ExcludedInstanceTypes":"The instance types to exclude. You can use strings with one or more wild cards, represented by an asterisk ( `*` ), to exclude an instance family, type, size, or generation. The following are examples: `m5.8xlarge` , `c5*.*` , `m5a.*` , `r*` , `*3*` .\\n\\nFor example, if you specify `c5*` , you are excluding the entire C5 instance family, which includes all C5a and C5n instance types. If you specify `m5a.*` , Amazon EC2 Auto Scaling will exclude all the M5a instance types, but not the M5n instance types.\\n\\n> If you specify `ExcludedInstanceTypes` , you can\'t specify `AllowedInstanceTypes` . \\n\\nDefault: No excluded instance types","InstanceGenerations":"Indicates whether current or previous generation instance types are included.\\n\\n- For current generation instance types, specify `current` . The current generation includes EC2 instance types currently recommended for use. This typically includes the latest two to three generations in each instance family. For more information, see [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n- For previous generation instance types, specify `previous` .\\n\\nDefault: Any current or previous generation","LocalStorage":"Indicates whether instance types with instance store volumes are included, excluded, or required. For more information, see [Amazon EC2 instance store](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\nDefault: `included`","LocalStorageTypes":"Indicates the type of local storage that is required.\\n\\n- For instance types with hard disk drive (HDD) storage, specify `hdd` .\\n- For instance types with solid state drive (SSD) storage, specify `ssd` .\\n\\nDefault: Any local storage type","MemoryGiBPerVCpu":"The minimum and maximum amount of memory per vCPU for an instance type, in GiB.\\n\\nDefault: No minimum or maximum limits","MemoryMiB":"The minimum and maximum instance memory size for an instance type, in MiB.","NetworkBandwidthGbps":"The minimum and maximum amount of network bandwidth, in gigabits per second (Gbps).\\n\\nDefault: No minimum or maximum limits","NetworkInterfaceCount":"The minimum and maximum number of network interfaces for an instance type.\\n\\nDefault: No minimum or maximum limits","OnDemandMaxPricePercentageOverLowestPrice":"The price protection threshold for On-Demand Instances. This is the maximum you’ll pay for an On-Demand Instance, expressed as a percentage higher than the least expensive current generation M, C, or R instance type with your specified attributes. When Amazon EC2 Auto Scaling selects instance types with your attributes, we will exclude instance types whose price is higher than your threshold. The parameter accepts an integer, which Amazon EC2 Auto Scaling interprets as a percentage. To turn off price protection, specify a high value, such as `999999` .\\n\\nIf you set `DesiredCapacityType` to `vcpu` or `memory-mib` , the price protection threshold is applied based on the per vCPU or per memory price instead of the per instance price.\\n\\nDefault: `20`","RequireHibernateSupport":"Indicates whether instance types must provide On-Demand Instance hibernation support.\\n\\nDefault: `false`","SpotMaxPricePercentageOverLowestPrice":"The price protection threshold for Spot Instances. This is the maximum you’ll pay for a Spot Instance, expressed as a percentage higher than the least expensive current generation M, C, or R instance type with your specified attributes. When Amazon EC2 Auto Scaling selects instance types with your attributes, we will exclude instance types whose price is higher than your threshold. The parameter accepts an integer, which Amazon EC2 Auto Scaling interprets as a percentage. To turn off price protection, specify a high value, such as `999999` .\\n\\nIf you set `DesiredCapacityType` to `vcpu` or `memory-mib` , the price protection threshold is applied based on the per vCPU or per memory price instead of the per instance price.\\n\\nDefault: `100`","TotalLocalStorageGB":"The minimum and maximum total local storage size for an instance type, in GB.\\n\\nDefault: No minimum or maximum limits","VCpuCount":"The minimum and maximum number of vCPUs for an instance type."}},"AWS::AutoScaling::AutoScalingGroup.InstancesDistribution":{"attributes":{},"description":"Use this structure to specify the distribution of On-Demand Instances and Spot Instances and the allocation strategies used to fulfill On-Demand and Spot capacities for a mixed instances policy.\\n\\nFor more information, see [Auto Scaling groups with multiple instance types and purchase options](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-mixed-instances-groups.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\n`InstancesDistribution` is a property of the [AWS::AutoScaling::AutoScalingGroup MixedInstancesPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-mixedinstancespolicy.html) property type.","properties":{"OnDemandAllocationStrategy":"The allocation strategy to apply to your On-Demand Instances when they are launched. Possible instance types are determined by the launch template overrides that you specify.\\n\\nThe following lists the valid values:\\n\\n- **lowest-price** - Uses price to determine which instance types are the highest priority, launching the lowest priced instance types within an Availability Zone first. This is the default value for Auto Scaling groups that specify `InstanceRequirements` .\\n- **prioritized** - You set the order of instance types for the launch template overrides from highest to lowest priority (from first to last in the list). Amazon EC2 Auto Scaling launches your highest priority instance types first. If all your On-Demand capacity cannot be fulfilled using your highest priority instance type, then Amazon EC2 Auto Scaling launches the remaining capacity using the second priority instance type, and so on. This is the default value for Auto Scaling groups that don\'t specify `InstanceRequirements` and cannot be used for groups that do.","OnDemandBaseCapacity":"The minimum amount of the Auto Scaling group\'s capacity that must be fulfilled by On-Demand Instances. This base portion is launched first as your group scales.\\n\\nThis number has the same unit of measurement as the group\'s desired capacity. If you change the default unit of measurement (number of instances) by specifying weighted capacity values in your launch template overrides list, or by changing the default desired capacity type setting of the group, you must specify this number using the same unit of measurement.\\n\\nDefault: 0\\n\\n> An update to this setting means a gradual replacement of instances to adjust the current On-Demand Instance levels. When replacing instances, Amazon EC2 Auto Scaling launches new instances before terminating the previous ones.","OnDemandPercentageAboveBaseCapacity":"Controls the percentages of On-Demand Instances and Spot Instances for your additional capacity beyond `OnDemandBaseCapacity` . Expressed as a number (for example, 20 specifies 20% On-Demand Instances, 80% Spot Instances). If set to 100, only On-Demand Instances are used.\\n\\nDefault: 100\\n\\n> An update to this setting means a gradual replacement of instances to adjust the current On-Demand and Spot Instance levels for your additional capacity higher than the base capacity. When replacing instances, Amazon EC2 Auto Scaling launches new instances before terminating the previous ones.","SpotAllocationStrategy":"The allocation strategy to apply to your Spot Instances when they are launched. Possible instance types are determined by the launch template overrides that you specify.\\n\\nThe following lists the valid values:\\n\\n- **capacity-optimized** - Requests Spot Instances using pools that are optimally chosen based on the available Spot capacity. This strategy has the lowest risk of interruption. To give certain instance types a higher chance of launching first, use `capacity-optimized-prioritized` .\\n- **capacity-optimized-prioritized** - You set the order of instance types for the launch template overrides from highest to lowest priority (from first to last in the list). Amazon EC2 Auto Scaling honors the instance type priorities on a best effort basis but optimizes for capacity first. Note that if the On-Demand allocation strategy is set to `prioritized` , the same priority is applied when fulfilling On-Demand capacity. This is not a valid value for Auto Scaling groups that specify `InstanceRequirements` .\\n- **lowest-price** - Requests Spot Instances using the lowest priced pools within an Availability Zone, across the number of Spot pools that you specify for the `SpotInstancePools` property. To ensure that your desired capacity is met, you might receive Spot Instances from several pools. This is the default value, but it might lead to high interruption rates because this strategy only considers instance price and not available capacity.\\n- **price-capacity-optimized (recommended)** - The price and capacity optimized allocation strategy looks at both price and capacity to select the Spot Instance pools that are the least likely to be interrupted and have the lowest possible price.","SpotInstancePools":"The number of Spot Instance pools across which to allocate your Spot Instances. The Spot pools are determined from the different instance types in the overrides. Valid only when the `SpotAllocationStrategy` is `lowest-price` . Value must be in the range of 1–20.\\n\\nDefault: 2","SpotMaxPrice":"The maximum price per unit hour that you are willing to pay for a Spot Instance. If your maximum price is lower than the Spot price for the instance types that you selected, your Spot Instances are not launched. We do not recommend specifying a maximum price because it can lead to increased interruptions. When Spot Instances launch, you pay the current Spot price. To remove a maximum price that you previously set, include the property but specify an empty string (\\"\\") for the value.\\n\\n> If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify one. \\n\\nValid Range: Minimum value of 0.001"}},"AWS::AutoScaling::AutoScalingGroup.LaunchTemplate":{"attributes":{},"description":"Use this structure to specify the launch templates and instance types (overrides) for a mixed instances policy.\\n\\n`LaunchTemplate` is a property of the [AWS::AutoScaling::AutoScalingGroup MixedInstancesPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-mixedinstancespolicy.html) property type.","properties":{"LaunchTemplateSpecification":"The launch template.","Overrides":"Any properties that you specify override the same properties in the launch template."}},"AWS::AutoScaling::AutoScalingGroup.LaunchTemplateOverrides":{"attributes":{},"description":"Use this structure to let Amazon EC2 Auto Scaling do the following when the Auto Scaling group has a mixed instances policy:\\n\\n- Override the instance type that is specified in the launch template.\\n- Use multiple instance types.\\n\\nSpecify the instance types that you want, or define your instance requirements instead and let Amazon EC2 Auto Scaling provision the available instance types that meet your requirements. This can provide Amazon EC2 Auto Scaling with a larger selection of instance types to choose from when fulfilling Spot and On-Demand capacities. You can view which instance types are matched before you apply the instance requirements to your Auto Scaling group.\\n\\nAfter you define your instance requirements, you don\'t have to keep updating these settings to get new EC2 instance types automatically. Amazon EC2 Auto Scaling uses the instance requirements of the Auto Scaling group to determine whether a new EC2 instance type can be used.\\n\\n`LaunchTemplateOverrides` is a property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplate.html) property type.","properties":{"InstanceRequirements":"The instance requirements. Amazon EC2 Auto Scaling uses your specified requirements to identify instance types. Then, it uses your On-Demand and Spot allocation strategies to launch instances from these instance types.\\n\\nYou can specify up to four separate sets of instance requirements per Auto Scaling group. This is useful for provisioning instances from different Amazon Machine Images (AMIs) in the same Auto Scaling group. To do this, create the AMIs and create a new launch template for each AMI. Then, create a compatible set of instance requirements for each launch template.\\n\\n> If you specify `InstanceRequirements` , you can\'t specify `InstanceType` .","InstanceType":"The instance type, such as `m3.xlarge` . You must specify an instance type that is supported in your requested Region and Availability Zones. For more information, see [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) in the *Amazon Elastic Compute Cloud User Guide* .\\n\\nYou can specify up to 40 instance types per Auto Scaling group.","LaunchTemplateSpecification":"Provides a launch template for the specified instance type or set of instance requirements. For example, some instance types might require a launch template with a different AMI. If not provided, Amazon EC2 Auto Scaling uses the launch template that\'s specified in the `LaunchTemplate` definition. For more information, see [Specifying a different launch template for an instance type](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-mixed-instances-groups-launch-template-overrides.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nYou can specify up to 20 launch templates per Auto Scaling group. The launch templates specified in the overrides and in the `LaunchTemplate` definition count towards this limit.","WeightedCapacity":"If you provide a list of instance types to use, you can specify the number of capacity units provided by each instance type in terms of virtual CPUs, memory, storage, throughput, or other relative performance characteristic. When a Spot or On-Demand Instance is launched, the capacity units count toward the desired capacity. Amazon EC2 Auto Scaling launches instances until the desired capacity is totally fulfilled, even if this results in an overage. For example, if there are two units remaining to fulfill capacity, and Amazon EC2 Auto Scaling can only launch an instance with a `WeightedCapacity` of five units, the instance is launched, and the desired capacity is exceeded by three units. For more information, see [Configure instance weighting for Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-mixed-instances-groups-instance-weighting.html) in the *Amazon EC2 Auto Scaling User Guide* . Value must be in the range of 1-999.\\n\\nIf you specify a value for `WeightedCapacity` for one instance type, you must specify a value for `WeightedCapacity` for all of them.\\n\\n> Every Auto Scaling group has three size parameters ( `DesiredCapacity` , `MaxSize` , and `MinSize` ). Usually, you set these sizes based on a specific number of instances. However, if you configure a mixed instances policy that defines weights for the instance types, you must specify these sizes with the same units that you use for weighting instances."}},"AWS::AutoScaling::AutoScalingGroup.LaunchTemplateSpecification":{"attributes":{},"description":"Specifies a launch template to use when provisioning EC2 instances for an Auto Scaling group.\\n\\nYou must specify the following:\\n\\n- The ID or the name of the launch template, but not both.\\n- The version of the launch template.\\n\\n`LaunchTemplateSpecification` is property of the [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html) resource. It is also a property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplate.html) and [AWS::AutoScaling::AutoScalingGroup LaunchTemplateOverrides](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplateoverrides.html) property types.\\n\\nFor information about creating a launch template, see [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) and [Create a launch template for an Auto Scaling group](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nFor examples of launch templates, see [Auto scaling template snippets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-autoscaling.html) and the [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples) section in the `AWS::EC2::LaunchTemplate` resource.","properties":{"LaunchTemplateId":"The ID of the launch template.\\n\\nYou must specify the `LaunchTemplateID` or the `LaunchTemplateName` , but not both.","LaunchTemplateName":"The name of the launch template.\\n\\nYou must specify the `LaunchTemplateName` or the `LaunchTemplateID` , but not both.","Version":"The version number of the launch template.\\n\\nSpecifying `$Latest` or `$Default` for the template version number is not supported. However, you can specify `LatestVersionNumber` or `DefaultVersionNumber` using the `Fn::GetAtt` intrinsic function. For more information, see [Fn::GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html) .\\n\\n> For an example of using the `Fn::GetAtt` function, see the [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#aws-properties-as-group--examples) section of the `AWS::AutoScaling::AutoScalingGroup` resource."}},"AWS::AutoScaling::AutoScalingGroup.LifecycleHookSpecification":{"attributes":{},"description":"`LifecycleHookSpecification` specifies a lifecycle hook for the `LifecycleHookSpecificationList` property of the [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html) resource. A lifecycle hook specifies actions to perform when Amazon EC2 Auto Scaling launches or terminates instances.\\n\\nFor more information, see [Amazon EC2 Auto Scaling lifecycle hooks](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html) in the *Amazon EC2 Auto Scaling User Guide* . You can find a sample template snippet in the [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-as-lifecyclehook.html#aws-resource-as-lifecyclehook--examples) section of the `AWS::AutoScaling::LifecycleHook` resource.","properties":{"DefaultResult":"The action the Auto Scaling group takes when the lifecycle hook timeout elapses or if an unexpected failure occurs. The default value is `ABANDON` .\\n\\nValid values: `CONTINUE` | `ABANDON`","HeartbeatTimeout":"The maximum time, in seconds, that can elapse before the lifecycle hook times out. The range is from `30` to `7200` seconds. The default value is `3600` seconds (1 hour).","LifecycleHookName":"The name of the lifecycle hook.","LifecycleTransition":"The lifecycle transition. For Auto Scaling groups, there are two major lifecycle transitions.\\n\\n- To create a lifecycle hook for scale-out events, specify `autoscaling:EC2_INSTANCE_LAUNCHING` .\\n- To create a lifecycle hook for scale-in events, specify `autoscaling:EC2_INSTANCE_TERMINATING` .","NotificationMetadata":"Additional information that you want to include any time Amazon EC2 Auto Scaling sends a message to the notification target.","NotificationTargetARN":"The Amazon Resource Name (ARN) of the notification target that Amazon EC2 Auto Scaling sends notifications to when an instance is in a wait state for the lifecycle hook. You can specify an Amazon SNS topic or an Amazon SQS queue.","RoleARN":"The ARN of the IAM role that allows the Auto Scaling group to publish to the specified notification target. For information about creating this role, see [Configure a notification target for a lifecycle hook](https://docs.aws.amazon.com/autoscaling/ec2/userguide/prepare-for-lifecycle-notifications.html#lifecycle-hook-notification-target) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nValid only if the notification target is an Amazon SNS topic or an Amazon SQS queue."}},"AWS::AutoScaling::AutoScalingGroup.MemoryGiBPerVCpuRequest":{"attributes":{},"description":"`MemoryGiBPerVCpuRequest` is a property of the `InstanceRequirements` property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplateOverrides](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplateoverrides.html) property type that describes the minimum and maximum amount of memory per vCPU for an instance type, in GiB.","properties":{"Max":"The memory maximum in GiB.","Min":"The memory minimum in GiB."}},"AWS::AutoScaling::AutoScalingGroup.MemoryMiBRequest":{"attributes":{},"description":"`MemoryMiBRequest` is a property of the `InstanceRequirements` property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplateOverrides](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplateoverrides.html) property type that describes the minimum and maximum instance memory size for an instance type, in MiB.","properties":{"Max":"The memory maximum in MiB.","Min":"The memory minimum in MiB."}},"AWS::AutoScaling::AutoScalingGroup.MetricsCollection":{"attributes":{},"description":"`MetricsCollection` is a property of the [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html) resource that describes the group metrics that an Amazon EC2 Auto Scaling group sends to Amazon CloudWatch. These metrics describe the group rather than any of its instances.\\n\\nFor more information, see [Monitor CloudWatch metrics for your Auto Scaling groups and instances](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-instance-monitoring.html) in the *Amazon EC2 Auto Scaling User Guide* . You can find a sample template snippet in the [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#aws-properties-as-group--examples) section of the `AWS::AutoScaling::AutoScalingGroup` resource.","properties":{"Granularity":"The frequency at which Amazon EC2 Auto Scaling sends aggregated data to CloudWatch. The only valid value is `1Minute` .","Metrics":"Identifies the metrics to enable.\\n\\nYou can specify one or more of the following metrics:\\n\\n- `GroupMinSize`\\n- `GroupMaxSize`\\n- `GroupDesiredCapacity`\\n- `GroupInServiceInstances`\\n- `GroupPendingInstances`\\n- `GroupStandbyInstances`\\n- `GroupTerminatingInstances`\\n- `GroupTotalInstances`\\n- `GroupInServiceCapacity`\\n- `GroupPendingCapacity`\\n- `GroupStandbyCapacity`\\n- `GroupTerminatingCapacity`\\n- `GroupTotalCapacity`\\n- `WarmPoolDesiredCapacity`\\n- `WarmPoolWarmedCapacity`\\n- `WarmPoolPendingCapacity`\\n- `WarmPoolTerminatingCapacity`\\n- `WarmPoolTotalCapacity`\\n- `GroupAndWarmPoolDesiredCapacity`\\n- `GroupAndWarmPoolTotalCapacity`\\n\\nIf you specify `Granularity` and don\'t specify any metrics, all metrics are enabled.\\n\\nFor more information, see [Auto Scaling group metrics](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-cloudwatch-monitoring.html#as-group-metrics) in the *Amazon EC2 Auto Scaling User Guide* ."}},"AWS::AutoScaling::AutoScalingGroup.MixedInstancesPolicy":{"attributes":{},"description":"Use this structure to launch multiple instance types and On-Demand Instances and Spot Instances within a single Auto Scaling group.\\n\\nA mixed instances policy contains information that Amazon EC2 Auto Scaling can use to launch instances and help optimize your costs. For more information, see [Auto Scaling groups with multiple instance types and purchase options](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-mixed-instances-groups.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nYou can create a mixed instances policy for new and existing Auto Scaling groups. You must use a launch template to configure the policy. You cannot use a launch configuration.\\n\\nThere are key differences between Spot Instances and On-Demand Instances:\\n\\n- The price for Spot Instances varies based on demand\\n- Amazon EC2 can terminate an individual Spot Instance as the availability of, or price for, Spot Instances changes\\n\\nWhen a Spot Instance is terminated, Amazon EC2 Auto Scaling group attempts to launch a replacement instance to maintain the desired capacity for the group.\\n\\n`MixedInstancesPolicy` is a property of the [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html) resource.","properties":{"InstancesDistribution":"The instances distribution.","LaunchTemplate":"One or more launch templates and the instance types (overrides) that are used to launch EC2 instances to fulfill On-Demand and Spot capacities."}},"AWS::AutoScaling::AutoScalingGroup.NetworkBandwidthGbpsRequest":{"attributes":{},"description":"`NetworkBandwidthGbpsRequest` is a property of the `InstanceRequirements` property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplateOverrides](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplateoverrides.html) property type that describes the minimum and maximum network bandwidth for an instance type, in Gbps.\\n\\n> Setting the minimum bandwidth does not guarantee that your instance will achieve the minimum bandwidth. Amazon EC2 will identify instance types that support the specified minimum bandwidth, but the actual bandwidth of your instance might go below the specified minimum at times. For more information, see [Available instance bandwidth](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html#available-instance-bandwidth) in the *Amazon EC2 User Guide for Linux Instances* .","properties":{"Max":"The maximum amount of network bandwidth, in gigabits per second (Gbps).","Min":"The minimum amount of network bandwidth, in gigabits per second (Gbps)."}},"AWS::AutoScaling::AutoScalingGroup.NetworkInterfaceCountRequest":{"attributes":{},"description":"`NetworkInterfaceCountRequest` is a property of the `InstanceRequirements` property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplateOverrides](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplateoverrides.html) property type that describes the minimum and maximum number of network interfaces for an instance type.","properties":{"Max":"The maximum number of network interfaces.","Min":"The minimum number of network interfaces."}},"AWS::AutoScaling::AutoScalingGroup.NotificationConfiguration":{"attributes":{},"description":"A structure that specifies an Amazon SNS notification configuration for the `NotificationConfigurations` property of the [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html) resource.\\n\\nFor an example template snippet, see [Auto scaling template snippets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-autoscaling.html) .\\n\\nFor more information, see [Get Amazon SNS notifications when your Auto Scaling group scales](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ASGettingNotifications.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"NotificationTypes":"A list of event types that send a notification. Event types can include any of the following types.\\n\\n*Allowed values* :\\n\\n- `autoscaling:EC2_INSTANCE_LAUNCH`\\n- `autoscaling:EC2_INSTANCE_LAUNCH_ERROR`\\n- `autoscaling:EC2_INSTANCE_TERMINATE`\\n- `autoscaling:EC2_INSTANCE_TERMINATE_ERROR`\\n- `autoscaling:TEST_NOTIFICATION`","TopicARN":"The Amazon Resource Name (ARN) of the Amazon SNS topic."}},"AWS::AutoScaling::AutoScalingGroup.TagProperty":{"attributes":{},"description":"A structure that specifies a tag for the `Tags` property of [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html) resource.\\n\\nFor more information, see [Tag Auto Scaling groups and instances](https://docs.aws.amazon.com/autoscaling/ec2/userguide/autoscaling-tagging.html) in the *Amazon EC2 Auto Scaling User Guide* . You can find a sample template snippet in the [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#aws-properties-as-group--examples) section of the `AWS::AutoScaling::AutoScalingGroup` resource.\\n\\nCloudFormation adds the following tags to all Auto Scaling groups and associated instances:\\n\\n- aws:cloudformation:stack-name\\n- aws:cloudformation:stack-id\\n- aws:cloudformation:logical-id","properties":{"Key":"The tag key.","PropagateAtLaunch":"Set to `true` if you want CloudFormation to copy the tag to EC2 instances that are launched as part of the Auto Scaling group. Set to `false` if you want the tag attached only to the Auto Scaling group and not copied to any instances launched as part of the Auto Scaling group.","Value":"The tag value."}},"AWS::AutoScaling::AutoScalingGroup.TotalLocalStorageGBRequest":{"attributes":{},"description":"`TotalLocalStorageGBRequest` is a property of the `InstanceRequirements` property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplateOverrides](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplateoverrides.html) property type that describes the minimum and maximum total local storage size for an instance type, in GB.","properties":{"Max":"The storage maximum in GB.","Min":"The storage minimum in GB."}},"AWS::AutoScaling::AutoScalingGroup.VCpuCountRequest":{"attributes":{},"description":"`VCpuCountRequest` is a property of the `InstanceRequirements` property of the [AWS::AutoScaling::AutoScalingGroup LaunchTemplateOverrides](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplateoverrides.html) property type that describes the minimum and maximum number of vCPUs for an instance type.","properties":{"Max":"The maximum number of vCPUs.","Min":"The minimum number of vCPUs."}},"AWS::AutoScaling::LaunchConfiguration":{"attributes":{"Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource name. For example: `mystack-mylaunchconfig-1DDYF1E3B3I` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::AutoScaling::LaunchConfiguration` resource specifies the launch configuration that can be used by an Auto Scaling group to configure Amazon EC2 instances.\\n\\nWhen you update the launch configuration for an Auto Scaling group, CloudFormation deletes that resource and creates a new launch configuration with the updated properties and a new name. Existing instances are not affected. To update existing instances when you update the `AWS::AutoScaling::LaunchConfiguration` resource, you can specify an [UpdatePolicy attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html) for the group. You can find sample update policies for rolling updates in [Auto scaling template snippets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-autoscaling.html) .\\n\\n> Amazon EC2 Auto Scaling configures instances launched as part of an Auto Scaling group using either a [launch template](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) or a launch configuration. We strongly recommend that you do not use launch configurations. They do not provide full functionality for Amazon EC2 Auto Scaling or Amazon EC2. For more information, see [Launch configurations](https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-configurations.html) and [Migrate AWS CloudFormation stacks from launch configurations to launch templates](https://docs.aws.amazon.com/autoscaling/ec2/userguide/migrate-launch-configurations-with-cloudformation.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"AssociatePublicIpAddress":"Specifies whether to assign a public IPv4 address to the group\'s instances. If the instance is launched into a default subnet, the default is to assign a public IPv4 address, unless you disabled the option to assign a public IPv4 address on the subnet. If the instance is launched into a nondefault subnet, the default is not to assign a public IPv4 address, unless you enabled the option to assign a public IPv4 address on the subnet.\\n\\nIf you specify `true` , each instance in the Auto Scaling group receives a unique public IPv4 address. For more information, see [Launching Auto Scaling instances in a VPC](https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-in-vpc.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nIf you specify this property, you must specify at least one subnet for `VPCZoneIdentifier` when you create your group.","BlockDeviceMappings":"The block device mapping entries that define the block devices to attach to the instances at launch. By default, the block devices specified in the block device mapping for the AMI are used. For more information, see [Block device mappings](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html) in the *Amazon EC2 User Guide for Linux Instances* .","ClassicLinkVPCId":"Available for backward compatibility.","ClassicLinkVPCSecurityGroups":"Available for backward compatibility.","EbsOptimized":"Specifies whether the launch configuration is optimized for EBS I/O ( `true` ) or not ( `false` ). The optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal I/O performance. This optimization is not available with all instance types. Additional fees are incurred when you enable EBS optimization for an instance type that is not EBS-optimized by default. For more information, see [Amazon EBS-optimized instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSOptimized.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\nThe default value is `false` .","IamInstanceProfile":"The name or the Amazon Resource Name (ARN) of the instance profile associated with the IAM role for the instance. The instance profile contains the IAM role. For more information, see [IAM role for applications that run on Amazon EC2 instances](https://docs.aws.amazon.com/autoscaling/ec2/userguide/us-iam-role.html) in the *Amazon EC2 Auto Scaling User Guide* .","ImageId":"The ID of the Amazon Machine Image (AMI) that was assigned during registration. For more information, see [Finding a Linux AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/finding-an-ami.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\nIf you specify `InstanceId` , an `ImageId` is not required.","InstanceId":"The ID of the Amazon EC2 instance to use to create the launch configuration. When you use an instance to create a launch configuration, all properties are derived from the instance with the exception of `BlockDeviceMapping` and `AssociatePublicIpAddress` . You can override any properties from the instance by specifying them in the launch configuration.","InstanceMonitoring":"Controls whether instances in this group are launched with detailed ( `true` ) or basic ( `false` ) monitoring.\\n\\nThe default value is `true` (enabled).\\n\\n> When detailed monitoring is enabled, Amazon CloudWatch generates metrics every minute and your account is charged a fee. When you disable detailed monitoring, CloudWatch generates metrics every 5 minutes. For more information, see [Configure Monitoring for Auto Scaling Instances](https://docs.aws.amazon.com/autoscaling/latest/userguide/enable-as-instance-metrics.html) in the *Amazon EC2 Auto Scaling User Guide* .","InstanceType":"Specifies the instance type of the EC2 instance. For information about available instance types, see [Available instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#AvailableInstanceTypes) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\nIf you specify `InstanceId` , an `InstanceType` is not required.","KernelId":"The ID of the kernel associated with the AMI.\\n\\n> We recommend that you use PV-GRUB instead of kernels and RAM disks. For more information, see [User provided kernels](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedKernels.html) in the *Amazon EC2 User Guide for Linux Instances* .","KeyName":"The name of the key pair. For more information, see [Amazon EC2 key pairs and Linux instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html) in the *Amazon EC2 User Guide for Linux Instances* .","LaunchConfigurationName":"The name of the launch configuration. This name must be unique per Region per account.","MetadataOptions":"The metadata options for the instances. For more information, see [Configuring the Instance Metadata Options](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-config.html#launch-configurations-imds) in the *Amazon EC2 Auto Scaling User Guide* .","PlacementTenancy":"The tenancy of the instance, either `default` or `dedicated` . An instance with `dedicated` tenancy runs on isolated, single-tenant hardware and can only be launched into a VPC. To launch dedicated instances into a shared tenancy VPC (a VPC with the instance placement tenancy attribute set to `default` ), you must set the value of this property to `dedicated` . For more information, see [Configuring instance tenancy with Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-dedicated-instances.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nIf you specify `PlacementTenancy` , you must specify at least one subnet for `VPCZoneIdentifier` when you create your group.\\n\\nValid values: `default` | `dedicated`","RamDiskId":"The ID of the RAM disk to select.\\n\\n> We recommend that you use PV-GRUB instead of kernels and RAM disks. For more information, see [User provided kernels](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedKernels.html) in the *Amazon EC2 User Guide for Linux Instances* .","SecurityGroups":"A list that contains the security groups to assign to the instances in the Auto Scaling group. The list can contain both the IDs of existing security groups and references to [SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html) resources created in the template.\\n\\nFor more information, see [Control traffic to resources using security groups](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html) in the *Amazon Virtual Private Cloud User Guide* .","SpotPrice":"The maximum hourly price to be paid for any Spot Instance launched to fulfill the request. Spot Instances are launched when the price you specify exceeds the current Spot price. For more information, see [Request Spot Instances for fault-tolerant and flexible applications](https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-template-spot-instances.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nValid Range: Minimum value of 0.001\\n\\n> When you change your maximum price by creating a new launch configuration, running instances will continue to run as long as the maximum price for those running instances is higher than the current Spot price.","UserData":"The Base64-encoded user data to make available to the launched EC2 instances. For more information, see [Instance metadata and user data](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) in the *Amazon EC2 User Guide for Linux Instances* ."}},"AWS::AutoScaling::LaunchConfiguration.BlockDevice":{"attributes":{},"description":"`BlockDevice` is a property of the `EBS` property of the [AWS::AutoScaling::LaunchConfiguration BlockDeviceMapping](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-mapping.html) property type that describes an Amazon EBS volume.","properties":{"DeleteOnTermination":"Indicates whether the volume is deleted on instance termination. For Amazon EC2 Auto Scaling, the default value is `true` .","Encrypted":"Specifies whether the volume should be encrypted. Encrypted EBS volumes can only be attached to instances that support Amazon EBS encryption. For more information, see [Supported instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#EBSEncryption_supported_instances) . If your AMI uses encrypted volumes, you can also only launch it on supported instance types.\\n\\n> If you are creating a volume from a snapshot, you cannot create an unencrypted volume from an encrypted snapshot. Also, you cannot specify a KMS key ID when using a launch configuration.\\n> \\n> If you enable encryption by default, the EBS volumes that you create are always encrypted, either using the AWS managed KMS key or a customer-managed KMS key, regardless of whether the snapshot was encrypted.\\n> \\n> For more information, see [Use AWS KMS keys to encrypt Amazon EBS volumes](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-data-protection.html#encryption) in the *Amazon EC2 Auto Scaling User Guide* .","Iops":"The number of input/output (I/O) operations per second (IOPS) to provision for the volume. For `gp3` and `io1` volumes, this represents the number of IOPS that are provisioned for the volume. For `gp2` volumes, this represents the baseline performance of the volume and the rate at which the volume accumulates I/O credits for bursting.\\n\\nThe following are the supported values for each volume type:\\n\\n- `gp3` : 3,000-16,000 IOPS\\n- `io1` : 100-64,000 IOPS\\n\\nFor `io1` volumes, we guarantee 64,000 IOPS only for [Instances built on the Nitro System](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances) . Other instance families guarantee performance up to 32,000 IOPS.\\n\\n`Iops` is supported when the volume type is `gp3` or `io1` and required only when the volume type is `io1` . (Not used with `standard` , `gp2` , `st1` , or `sc1` volumes.)","SnapshotId":"The snapshot ID of the volume to use.\\n\\nYou must specify either a `VolumeSize` or a `SnapshotId` .","Throughput":"The throughput (MiBps) to provision for a `gp3` volume.","VolumeSize":"The volume size, in GiBs. The following are the supported volumes sizes for each volume type:\\n\\n- `gp2` and `gp3` : 1-16,384\\n- `io1` : 4-16,384\\n- `st1` and `sc1` : 125-16,384\\n- `standard` : 1-1,024\\n\\nYou must specify either a `SnapshotId` or a `VolumeSize` . If you specify both `SnapshotId` and `VolumeSize` , the volume size must be equal or greater than the size of the snapshot.","VolumeType":"The volume type. For more information, see [Amazon EBS volume types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\nValid values: `standard` | `io1` | `gp2` | `st1` | `sc1` | `gp3`"}},"AWS::AutoScaling::LaunchConfiguration.BlockDeviceMapping":{"attributes":{},"description":"`BlockDeviceMapping` specifies a block device mapping for the `BlockDeviceMappings` property of the [AWS::AutoScaling::LaunchConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html) resource.\\n\\nEach instance that is launched has an associated root device volume, either an Amazon EBS volume or an instance store volume. You can use block device mappings to specify additional EBS volumes or instance store volumes to attach to an instance when it is launched.\\n\\nFor more information, see [Example block device mapping](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html#block-device-mapping-ex) in the *Amazon EC2 User Guide for Linux Instances* .","properties":{"DeviceName":"The device name assigned to the volume (for example, `/dev/sdh` or `xvdh` ). For more information, see [Device naming on Linux instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/device_naming.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\n> To define a block device mapping, set the device name and exactly one of the following properties: `Ebs` , `NoDevice` , or `VirtualName` .","Ebs":"Information to attach an EBS volume to an instance at launch.","NoDevice":"Setting this value to `true` prevents a volume that is included in the block device mapping of the AMI from being mapped to the specified device name at launch.\\n\\nIf `NoDevice` is `true` for the root device, instances might fail the EC2 health check. In that case, Amazon EC2 Auto Scaling launches replacement instances.","VirtualName":"The name of the instance store volume (virtual device) to attach to an instance at launch. The name must be in the form ephemeral *X* where *X* is a number starting from zero (0), for example, `ephemeral0` ."}},"AWS::AutoScaling::LaunchConfiguration.MetadataOptions":{"attributes":{},"description":"`MetadataOptions` is a property of [AWS::AutoScaling::LaunchConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html) that describes metadata options for the instances.\\n\\nFor more information, see [Configure the instance metadata options](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-config.html#launch-configurations-imds) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"HttpEndpoint":"This parameter enables or disables the HTTP metadata endpoint on your instances. If the parameter is not specified, the default state is `enabled` .\\n\\n> If you specify a value of `disabled` , you will not be able to access your instance metadata.","HttpPutResponseHopLimit":"The desired HTTP PUT response hop limit for instance metadata requests. The larger the number, the further instance metadata requests can travel.\\n\\nDefault: 1","HttpTokens":"The state of token usage for your instance metadata requests. If the parameter is not specified in the request, the default state is `optional` .\\n\\nIf the state is `optional` , you can choose to retrieve instance metadata with or without a signed token header on your request. If you retrieve the IAM role credentials without a token, the version 1.0 role credentials are returned. If you retrieve the IAM role credentials using a valid signed token, the version 2.0 role credentials are returned.\\n\\nIf the state is `required` , you must send a signed token header with any instance metadata retrieval requests. In this state, retrieving the IAM role credentials always returns the version 2.0 credentials; the version 1.0 credentials are not available."}},"AWS::AutoScaling::LifecycleHook":{"attributes":{"Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource name. For example: `mylifecyclehook` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::AutoScaling::LifecycleHook` resource specifies lifecycle hooks for an Auto Scaling group. These hooks let you create solutions that are aware of events in the Auto Scaling instance lifecycle, and then perform a custom action on instances when the corresponding lifecycle event occurs. A lifecycle hook provides a specified amount of time (one hour by default) to wait for the action to complete before the instance transitions to the next state.\\n\\nUse lifecycle hooks to prepare new instances for use or to delay them from being registered behind a load balancer before their configuration has been applied completely. You can also use lifecycle hooks to prepare running instances to be terminated by, for example, downloading logs or other data.\\n\\nFor more information, see [Amazon EC2 Auto Scaling lifecycle hooks](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"AutoScalingGroupName":"The name of the Auto Scaling group.","DefaultResult":"The action the Auto Scaling group takes when the lifecycle hook timeout elapses or if an unexpected failure occurs. The default value is `ABANDON` .\\n\\nValid values: `CONTINUE` | `ABANDON`","HeartbeatTimeout":"The maximum time, in seconds, that can elapse before the lifecycle hook times out. The range is from `30` to `7200` seconds. The default value is `3600` seconds (1 hour).","LifecycleHookName":"The name of the lifecycle hook.","LifecycleTransition":"The lifecycle transition. For Auto Scaling groups, there are two major lifecycle transitions.\\n\\n- To create a lifecycle hook for scale-out events, specify `autoscaling:EC2_INSTANCE_LAUNCHING` .\\n- To create a lifecycle hook for scale-in events, specify `autoscaling:EC2_INSTANCE_TERMINATING` .","NotificationMetadata":"Additional information that you want to include any time Amazon EC2 Auto Scaling sends a message to the notification target.","NotificationTargetARN":"The Amazon Resource Name (ARN) of the notification target that Amazon EC2 Auto Scaling sends notifications to when an instance is in a wait state for the lifecycle hook. You can specify an Amazon SNS topic or an Amazon SQS queue.","RoleARN":"The ARN of the IAM role that allows the Auto Scaling group to publish to the specified notification target. For information about creating this role, see [Configure a notification target for a lifecycle hook](https://docs.aws.amazon.com/autoscaling/ec2/userguide/prepare-for-lifecycle-notifications.html#lifecycle-hook-notification-target) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nValid only if the notification target is an Amazon SNS topic or an Amazon SQS queue."}},"AWS::AutoScaling::ScalingPolicy":{"attributes":{"Arn":"","PolicyName":"Returns the name of a scaling policy.","Ref":"When you specify an `AWS::AutoScaling::ScalingPolicy` type as an argument to the `Ref` function, CloudFormation returns the policy Amazon Resource Name (ARN). For example: `arn:aws:autoscaling:us-east-2:123456789012:scalingPolicy:ab12c4d5-a1b2-a1b2-a1b2-ab12c4d56789:autoScalingGroupName/myStack-AutoScalingGroup-AB12C4D5E6:policyName/myStack-myScalingPolicy-AB12C4D5E6` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::AutoScaling::ScalingPolicy` resource specifies an Amazon EC2 Auto Scaling scaling policy so that the Auto Scaling group can scale the number of instances available for your application.\\n\\nFor more information about using scaling policies to scale your Auto Scaling group automatically, see [Dynamic scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-scale-based-on-demand.html) and [Predictive scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-predictive-scaling.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"AdjustmentType":"Specifies how the scaling adjustment is interpreted (for example, an absolute number or a percentage). The valid values are `ChangeInCapacity` , `ExactCapacity` , and `PercentChangeInCapacity` .\\n\\nRequired if the policy type is `StepScaling` or `SimpleScaling` . For more information, see [Scaling adjustment types](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-scaling-simple-step.html#as-scaling-adjustment) in the *Amazon EC2 Auto Scaling User Guide* .","AutoScalingGroupName":"The name of the Auto Scaling group.","Cooldown":"A cooldown period, in seconds, that applies to a specific simple scaling policy. When a cooldown period is specified here, it overrides the default cooldown.\\n\\nValid only if the policy type is `SimpleScaling` . For more information, see [Scaling cooldowns for Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/Cooldown.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nDefault: None","EstimatedInstanceWarmup":"*Not needed if the default instance warmup is defined for the group.*\\n\\nThe estimated time, in seconds, until a newly launched instance can contribute to the CloudWatch metrics. This warm-up period applies to instances launched due to a specific target tracking or step scaling policy. When a warm-up period is specified here, it overrides the default instance warmup.\\n\\nValid only if the policy type is `TargetTrackingScaling` or `StepScaling` .\\n\\n> The default is to use the value for the default instance warmup defined for the group. If default instance warmup is null, then `EstimatedInstanceWarmup` falls back to the value of default cooldown.","MetricAggregationType":"The aggregation type for the CloudWatch metrics. The valid values are `Minimum` , `Maximum` , and `Average` . If the aggregation type is null, the value is treated as `Average` .\\n\\nValid only if the policy type is `StepScaling` .","MinAdjustmentMagnitude":"The minimum value to scale by when the adjustment type is `PercentChangeInCapacity` . For example, suppose that you create a step scaling policy to scale out an Auto Scaling group by 25 percent and you specify a `MinAdjustmentMagnitude` of 2. If the group has 4 instances and the scaling policy is performed, 25 percent of 4 is 1. However, because you specified a `MinAdjustmentMagnitude` of 2, Amazon EC2 Auto Scaling scales out the group by 2 instances.\\n\\nValid only if the policy type is `StepScaling` or `SimpleScaling` . For more information, see [Scaling adjustment types](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-scaling-simple-step.html#as-scaling-adjustment) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\n> Some Auto Scaling groups use instance weights. In this case, set the `MinAdjustmentMagnitude` to a value that is at least as large as your largest instance weight.","PolicyType":"One of the following policy types:\\n\\n- `TargetTrackingScaling`\\n- `StepScaling`\\n- `SimpleScaling` (default)\\n- `PredictiveScaling`","PredictiveScalingConfiguration":"A predictive scaling policy. Provides support for predefined and custom metrics.\\n\\nPredefined metrics include CPU utilization, network in/out, and the Application Load Balancer request count.\\n\\nRequired if the policy type is `PredictiveScaling` .","ScalingAdjustment":"The amount by which to scale, based on the specified adjustment type. A positive value adds to the current capacity while a negative number removes from the current capacity. For exact capacity, you must specify a non-negative value.\\n\\nRequired if the policy type is `SimpleScaling` . (Not used with any other policy type.)","StepAdjustments":"A set of adjustments that enable you to scale based on the size of the alarm breach.\\n\\nRequired if the policy type is `StepScaling` . (Not used with any other policy type.)","TargetTrackingConfiguration":"A target tracking scaling policy. Provides support for predefined or custom metrics.\\n\\nThe following predefined metrics are available:\\n\\n- `ASGAverageCPUUtilization`\\n- `ASGAverageNetworkIn`\\n- `ASGAverageNetworkOut`\\n- `ALBRequestCountPerTarget`\\n\\nIf you specify `ALBRequestCountPerTarget` for the metric, you must specify the `ResourceLabel` property with the `PredefinedMetricSpecification` .\\n\\nRequired if the policy type is `TargetTrackingScaling` ."}},"AWS::AutoScaling::ScalingPolicy.CustomizedMetricSpecification":{"attributes":{},"description":"Contains customized metric specification information for a target tracking scaling policy for Amazon EC2 Auto Scaling.\\n\\nTo create your customized metric specification:\\n\\n- Add values for each required property from CloudWatch. You can use an existing metric, or a new metric that you create. To use your own metric, you must first publish the metric to CloudWatch. For more information, see [Publish Custom Metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html) in the *Amazon CloudWatch User Guide* .\\n- Choose a metric that changes proportionally with capacity. The value of the metric should increase or decrease in inverse proportion to the number of capacity units. That is, the value of the metric should decrease when capacity increases.\\n\\nFor more information about CloudWatch, see [Amazon CloudWatch Concepts](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html) .\\n\\n`CustomizedMetricSpecification` is a property of the [AWS::AutoScaling::ScalingPolicy TargetTrackingConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-targettrackingconfiguration.html) property type.","properties":{"Dimensions":"The dimensions of the metric.\\n\\nConditional: If you published your metric with dimensions, you must specify the same dimensions in your scaling policy.","MetricName":"The name of the metric. To get the exact metric name, namespace, and dimensions, inspect the [Metric](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_Metric.html) object that is returned by a call to [ListMetrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_ListMetrics.html) .","Namespace":"The namespace of the metric.","Statistic":"The statistic of the metric.","Unit":"The unit of the metric. For a complete list of the units that CloudWatch supports, see the [MetricDatum](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html) data type in the *Amazon CloudWatch API Reference* ."}},"AWS::AutoScaling::ScalingPolicy.Metric":{"attributes":{},"description":"Represents a specific metric.\\n\\n`Metric` is a property of the [AWS::AutoScaling::ScalingPolicy MetricStat](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricstat.html) property type.","properties":{"Dimensions":"The dimensions for the metric. For the list of available dimensions, see the AWS documentation available from the table in [AWS services that publish CloudWatch metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html) in the *Amazon CloudWatch User Guide* .\\n\\nConditional: If you published your metric with dimensions, you must specify the same dimensions in your scaling policy.","MetricName":"The name of the metric.","Namespace":"The namespace of the metric. For more information, see the table in [AWS services that publish CloudWatch metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html) in the *Amazon CloudWatch User Guide* ."}},"AWS::AutoScaling::ScalingPolicy.MetricDataQuery":{"attributes":{},"description":"The metric data to return. Also defines whether this call is returning data for one metric only, or whether it is performing a math expression on the values of returned metric statistics to create a new time series. A time series is a series of data points, each of which is associated with a timestamp.\\n\\n`MetricDataQuery` is a property of the following property types:\\n\\n- [AWS::AutoScaling::ScalingPolicy PredictiveScalingCustomizedScalingMetric](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedscalingmetric.html)\\n- [AWS::AutoScaling::ScalingPolicy PredictiveScalingCustomizedLoadMetric](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedloadmetric.html)\\n- [AWS::AutoScaling::ScalingPolicy PredictiveScalingCustomizedCapacityMetric](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedcapacitymetric.html)\\n\\nPredictive scaling uses the time series data received from CloudWatch to understand how to schedule capacity based on your historical workload patterns.\\n\\nYou can call for a single metric or perform math expressions on multiple metrics. Any expressions used in a metric specification must eventually return a single time series.\\n\\nFor more information and examples, see [Advanced predictive scaling policy configurations using custom metrics](https://docs.aws.amazon.com/autoscaling/ec2/userguide/predictive-scaling-customized-metric-specification.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"Expression":"The math expression to perform on the returned data, if this object is performing a math expression. This expression can use the `Id` of the other metrics to refer to those metrics, and can also use the `Id` of other expressions to use the result of those expressions.\\n\\nConditional: Within each `MetricDataQuery` object, you must specify either `Expression` or `MetricStat` , but not both.","Id":"A short name that identifies the object\'s results in the response. This name must be unique among all `MetricDataQuery` objects specified for a single scaling policy. If you are performing math expressions on this set of data, this name represents that data and can serve as a variable in the mathematical expression. The valid characters are letters, numbers, and underscores. The first character must be a lowercase letter.","Label":"A human-readable label for this metric or expression. This is especially useful if this is a math expression, so that you know what the value represents.","MetricStat":"Information about the metric data to return.\\n\\nConditional: Within each `MetricDataQuery` object, you must specify either `Expression` or `MetricStat` , but not both.","ReturnData":"Indicates whether to return the timestamps and raw data values of this metric.\\n\\nIf you use any math expressions, specify `true` for this value for only the final math expression that the metric specification is based on. You must specify `false` for `ReturnData` for all the other metrics and expressions used in the metric specification.\\n\\nIf you are only retrieving metrics and not performing any math expressions, do not specify anything for `ReturnData` . This sets it to its default ( `true` )."}},"AWS::AutoScaling::ScalingPolicy.MetricDimension":{"attributes":{},"description":"`MetricDimension` specifies a name/value pair that is part of the identity of a CloudWatch metric for the `Dimensions` property of the [AWS::AutoScaling::ScalingPolicy CustomizedMetricSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html) property type. Duplicate dimensions are not allowed.","properties":{"Name":"The name of the dimension.","Value":"The value of the dimension."}},"AWS::AutoScaling::ScalingPolicy.MetricStat":{"attributes":{},"description":"`MetricStat` is a property of the [AWS::AutoScaling::ScalingPolicy MetricDataQuery](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html) property type.\\n\\nThis structure defines the CloudWatch metric to return, along with the statistic, period, and unit.\\n\\nFor more information about the CloudWatch terminology below, see [Amazon CloudWatch concepts](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html) in the *Amazon CloudWatch User Guide* .","properties":{"Metric":"The CloudWatch metric to return, including the metric name, namespace, and dimensions. To get the exact metric name, namespace, and dimensions, inspect the [Metric](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_Metric.html) object that is returned by a call to [ListMetrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_ListMetrics.html) .","Stat":"The statistic to return. It can include any CloudWatch statistic or extended statistic. For a list of valid values, see the table in [Statistics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Statistic) in the *Amazon CloudWatch User Guide* .\\n\\nThe most commonly used metrics for predictive scaling are `Average` and `Sum` .","Unit":"The unit to use for the returned data points. For a complete list of the units that CloudWatch supports, see the [MetricDatum](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html) data type in the *Amazon CloudWatch API Reference* ."}},"AWS::AutoScaling::ScalingPolicy.PredefinedMetricSpecification":{"attributes":{},"description":"Contains predefined metric specification information for a target tracking scaling policy for Amazon EC2 Auto Scaling.\\n\\n`PredefinedMetricSpecification` is a property of the [AWS::AutoScaling::ScalingPolicy TargetTrackingConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-targettrackingconfiguration.html) property type.","properties":{"PredefinedMetricType":"The metric type. The following predefined metrics are available:\\n\\n- `ASGAverageCPUUtilization` - Average CPU utilization of the Auto Scaling group.\\n- `ASGAverageNetworkIn` - Average number of bytes received on all network interfaces by the Auto Scaling group.\\n- `ASGAverageNetworkOut` - Average number of bytes sent out on all network interfaces by the Auto Scaling group.\\n- `ALBRequestCountPerTarget` - Average Application Load Balancer request count per target for your Auto Scaling group.","ResourceLabel":"A label that uniquely identifies a specific Application Load Balancer target group from which to determine the average request count served by your Auto Scaling group. You can\'t specify a resource label unless the target group is attached to the Auto Scaling group.\\n\\nYou create the resource label by appending the final portion of the load balancer ARN and the final portion of the target group ARN into a single value, separated by a forward slash (/). The format of the resource label is:\\n\\n`app/my-alb/778d41231b141a0f/targetgroup/my-alb-target-group/943f017f100becff` .\\n\\nWhere:\\n\\n- app// is the final portion of the load balancer ARN\\n- targetgroup// is the final portion of the target group ARN.\\n\\nTo find the ARN for an Application Load Balancer, use the [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html) API operation. To find the ARN for the target group, use the [DescribeTargetGroups](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeTargetGroups.html) API operation."}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingConfiguration":{"attributes":{},"description":"`PredictiveScalingConfiguration` is a property of the [AWS::AutoScaling::ScalingPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-policy.html) resource that specifies a predictive scaling policy for Amazon EC2 Auto Scaling.\\n\\nFor more information, see [Predictive scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-predictive-scaling.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"MaxCapacityBreachBehavior":"Defines the behavior that should be applied if the forecast capacity approaches or exceeds the maximum capacity of the Auto Scaling group. Defaults to `HonorMaxCapacity` if not specified.\\n\\nThe following are possible values:\\n\\n- `HonorMaxCapacity` - Amazon EC2 Auto Scaling cannot scale out capacity higher than the maximum capacity. The maximum capacity is enforced as a hard limit.\\n- `IncreaseMaxCapacity` - Amazon EC2 Auto Scaling can scale out capacity higher than the maximum capacity when the forecast capacity is close to or exceeds the maximum capacity. The upper limit is determined by the forecasted capacity and the value for `MaxCapacityBuffer` .","MaxCapacityBuffer":"The size of the capacity buffer to use when the forecast capacity is close to or exceeds the maximum capacity. The value is specified as a percentage relative to the forecast capacity. For example, if the buffer is 10, this means a 10 percent buffer, such that if the forecast capacity is 50, and the maximum capacity is 40, then the effective maximum capacity is 55.\\n\\nIf set to 0, Amazon EC2 Auto Scaling may scale capacity higher than the maximum capacity to equal but not exceed forecast capacity.\\n\\nRequired if the `MaxCapacityBreachBehavior` property is set to `IncreaseMaxCapacity` , and cannot be used otherwise.","MetricSpecifications":"This structure includes the metrics and target utilization to use for predictive scaling.\\n\\nThis is an array, but we currently only support a single metric specification. That is, you can specify a target value and a single metric pair, or a target value and one scaling metric and one load metric.","Mode":"The predictive scaling mode. Defaults to `ForecastOnly` if not specified.","SchedulingBufferTime":"The amount of time, in seconds, by which the instance launch time can be advanced. For example, the forecast says to add capacity at 10:00 AM, and you choose to pre-launch instances by 5 minutes. In that case, the instances will be launched at 9:55 AM. The intention is to give resources time to be provisioned. It can take a few minutes to launch an EC2 instance. The actual amount of time required depends on several factors, such as the size of the instance and whether there are startup scripts to complete.\\n\\nThe value must be less than the forecast interval duration of 3600 seconds (60 minutes). Defaults to 300 seconds if not specified."}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingCustomizedCapacityMetric":{"attributes":{},"description":"Contains capacity metric information for the `CustomizedCapacityMetricSpecification` property of the [AWS::AutoScaling::ScalingPolicy PredictiveScalingMetricSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html) property type.","properties":{"MetricDataQueries":"One or more metric data queries to provide the data points for a capacity metric. Use multiple metric data queries only if you are performing a math expression on returned data."}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingCustomizedLoadMetric":{"attributes":{},"description":"Contains load metric information for the `CustomizedLoadMetricSpecification` property of the [AWS::AutoScaling::ScalingPolicy PredictiveScalingMetricSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html) property type.","properties":{"MetricDataQueries":"One or more metric data queries to provide the data points for a load metric. Use multiple metric data queries only if you are performing a math expression on returned data."}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingCustomizedScalingMetric":{"attributes":{},"description":"Contains scaling metric information for the `CustomizedScalingMetricSpecification` property of the [AWS::AutoScaling::ScalingPolicy PredictiveScalingMetricSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html) property type.","properties":{"MetricDataQueries":"One or more metric data queries to provide the data points for a scaling metric. Use multiple metric data queries only if you are performing a math expression on returned data."}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingMetricSpecification":{"attributes":{},"description":"A structure that specifies a metric specification for the `MetricSpecifications` property of the [AWS::AutoScaling::ScalingPolicy PredictiveScalingConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html) property type.\\n\\nYou must specify either a metric pair, or a load metric and a scaling metric individually. Specifying a metric pair instead of individual metrics provides a simpler way to configure metrics for a scaling policy. You choose the metric pair, and the policy automatically knows the correct sum and average statistics to use for the load metric and the scaling metric.\\n\\nExample\\n\\n- You create a predictive scaling policy and specify `ALBRequestCount` as the value for the metric pair and `1000.0` as the target value. For this type of metric, you must provide the metric dimension for the corresponding target group, so you also provide a resource label for the Application Load Balancer target group that is attached to your Auto Scaling group.\\n- The number of requests the target group receives per minute provides the load metric, and the request count averaged between the members of the target group provides the scaling metric. In CloudWatch, this refers to the `RequestCount` and `RequestCountPerTarget` metrics, respectively.\\n- For optimal use of predictive scaling, you adhere to the best practice of using a dynamic scaling policy to automatically scale between the minimum capacity and maximum capacity in response to real-time changes in resource utilization.\\n- Amazon EC2 Auto Scaling consumes data points for the load metric over the last 14 days and creates an hourly load forecast for predictive scaling. (A minimum of 24 hours of data is required.)\\n- After creating the load forecast, Amazon EC2 Auto Scaling determines when to reduce or increase the capacity of your Auto Scaling group in each hour of the forecast period so that the average number of requests received by each instance is as close to 1000 requests per minute as possible at all times.\\n\\nFor information about using custom metrics with predictive scaling, see [Advanced predictive scaling policy configurations using custom metrics](https://docs.aws.amazon.com/autoscaling/ec2/userguide/predictive-scaling-customized-metric-specification.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"CustomizedCapacityMetricSpecification":"The customized capacity metric specification.","CustomizedLoadMetricSpecification":"The customized load metric specification.","CustomizedScalingMetricSpecification":"The customized scaling metric specification.","PredefinedLoadMetricSpecification":"The predefined load metric specification.","PredefinedMetricPairSpecification":"The predefined metric pair specification from which Amazon EC2 Auto Scaling determines the appropriate scaling metric and load metric to use.","PredefinedScalingMetricSpecification":"The predefined scaling metric specification.","TargetValue":"Specifies the target utilization.\\n\\n> Some metrics are based on a count instead of a percentage, such as the request count for an Application Load Balancer or the number of messages in an SQS queue. If the scaling policy specifies one of these metrics, specify the target utilization as the optimal average request or message count per instance during any one-minute interval."}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingPredefinedLoadMetric":{"attributes":{},"description":"Contains load metric information for the `PredefinedLoadMetricSpecification` property of the [AWS::AutoScaling::ScalingPolicy PredictiveScalingMetricSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html) property type.\\n\\n> Does not apply to policies that use a *metric pair* for the metric specification.","properties":{"PredefinedMetricType":"The metric type.","ResourceLabel":"A label that uniquely identifies a specific Application Load Balancer target group from which to determine the request count served by your Auto Scaling group. You can\'t specify a resource label unless the target group is attached to the Auto Scaling group.\\n\\nYou create the resource label by appending the final portion of the load balancer ARN and the final portion of the target group ARN into a single value, separated by a forward slash (/). The format of the resource label is:\\n\\n`app/my-alb/778d41231b141a0f/targetgroup/my-alb-target-group/943f017f100becff` .\\n\\nWhere:\\n\\n- app// is the final portion of the load balancer ARN\\n- targetgroup// is the final portion of the target group ARN.\\n\\nTo find the ARN for an Application Load Balancer, use the [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html) API operation. To find the ARN for the target group, use the [DescribeTargetGroups](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeTargetGroups.html) API operation."}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingPredefinedMetricPair":{"attributes":{},"description":"Contains metric pair information for the `PredefinedMetricPairSpecification` property of the [AWS::AutoScaling::ScalingPolicy PredictiveScalingMetricSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html) property type.\\n\\nFor more information, see [Predictive scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-predictive-scaling.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"PredefinedMetricType":"Indicates which metrics to use. There are two different types of metrics for each metric type: one is a load metric and one is a scaling metric. For example, if the metric type is `ASGCPUUtilization` , the Auto Scaling group\'s total CPU metric is used as the load metric, and the average CPU metric is used for the scaling metric.","ResourceLabel":"A label that uniquely identifies a specific Application Load Balancer target group from which to determine the total and average request count served by your Auto Scaling group. You can\'t specify a resource label unless the target group is attached to the Auto Scaling group.\\n\\nYou create the resource label by appending the final portion of the load balancer ARN and the final portion of the target group ARN into a single value, separated by a forward slash (/). The format of the resource label is:\\n\\n`app/my-alb/778d41231b141a0f/targetgroup/my-alb-target-group/943f017f100becff` .\\n\\nWhere:\\n\\n- app// is the final portion of the load balancer ARN\\n- targetgroup// is the final portion of the target group ARN.\\n\\nTo find the ARN for an Application Load Balancer, use the [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html) API operation. To find the ARN for the target group, use the [DescribeTargetGroups](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeTargetGroups.html) API operation."}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingPredefinedScalingMetric":{"attributes":{},"description":"Contains scaling metric information for the `PredefinedScalingMetricSpecification` property of the [AWS::AutoScaling::ScalingPolicy PredictiveScalingMetricSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html) property type.\\n\\n> Does not apply to policies that use a *metric pair* for the metric specification.","properties":{"PredefinedMetricType":"The metric type.","ResourceLabel":"A label that uniquely identifies a specific Application Load Balancer target group from which to determine the average request count served by your Auto Scaling group. You can\'t specify a resource label unless the target group is attached to the Auto Scaling group.\\n\\nYou create the resource label by appending the final portion of the load balancer ARN and the final portion of the target group ARN into a single value, separated by a forward slash (/). The format of the resource label is:\\n\\n`app/my-alb/778d41231b141a0f/targetgroup/my-alb-target-group/943f017f100becff` .\\n\\nWhere:\\n\\n- app// is the final portion of the load balancer ARN\\n- targetgroup// is the final portion of the target group ARN.\\n\\nTo find the ARN for an Application Load Balancer, use the [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html) API operation. To find the ARN for the target group, use the [DescribeTargetGroups](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeTargetGroups.html) API operation."}},"AWS::AutoScaling::ScalingPolicy.StepAdjustment":{"attributes":{},"description":"`StepAdjustment` specifies a step adjustment for the `StepAdjustments` property of the [AWS::AutoScaling::ScalingPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-policy.html) resource.\\n\\nFor the following examples, suppose that you have an alarm with a breach threshold of 50:\\n\\n- To trigger a step adjustment when the metric is greater than or equal to 50 and less than 60, specify a lower bound of 0 and an upper bound of 10.\\n- To trigger a step adjustment when the metric is greater than 40 and less than or equal to 50, specify a lower bound of -10 and an upper bound of 0.\\n\\nThere are a few rules for the step adjustments for your step policy:\\n\\n- The ranges of your step adjustments can\'t overlap or have a gap.\\n- At most one step adjustment can have a null lower bound. If one step adjustment has a negative lower bound, then there must be a step adjustment with a null lower bound.\\n- At most one step adjustment can have a null upper bound. If one step adjustment has a positive upper bound, then there must be a step adjustment with a null upper bound.\\n- The upper and lower bound can\'t be null in the same step adjustment.\\n\\nFor more information, see [Step adjustments](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-scaling-simple-step.html#as-scaling-steps) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\nYou can find a sample template snippet in the [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-policy.html#aws-properties-as-policy--examples) section of the `AWS::AutoScaling::ScalingPolicy` resource.","properties":{"MetricIntervalLowerBound":"The lower bound for the difference between the alarm threshold and the CloudWatch metric. If the metric value is above the breach threshold, the lower bound is inclusive (the metric must be greater than or equal to the threshold plus the lower bound). Otherwise, it is exclusive (the metric must be greater than the threshold plus the lower bound). A null value indicates negative infinity.","MetricIntervalUpperBound":"The upper bound for the difference between the alarm threshold and the CloudWatch metric. If the metric value is above the breach threshold, the upper bound is exclusive (the metric must be less than the threshold plus the upper bound). Otherwise, it is inclusive (the metric must be less than or equal to the threshold plus the upper bound). A null value indicates positive infinity.\\n\\nThe upper bound must be greater than the lower bound.","ScalingAdjustment":"The amount by which to scale, based on the specified adjustment type. A positive value adds to the current capacity while a negative number removes from the current capacity. For exact capacity, you must specify a non-negative value."}},"AWS::AutoScaling::ScalingPolicy.TargetTrackingConfiguration":{"attributes":{},"description":"`TargetTrackingConfiguration` is a property of the [AWS::AutoScaling::ScalingPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-policy.html) resource that specifies a target tracking scaling policy configuration for Amazon EC2 Auto Scaling.\\n\\nFor more information about scaling policies, see [Dynamic scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-scale-based-on-demand.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"CustomizedMetricSpecification":"A customized metric. You must specify either a predefined metric or a customized metric.","DisableScaleIn":"Indicates whether scaling in by the target tracking scaling policy is disabled. If scaling in is disabled, the target tracking scaling policy doesn\'t remove instances from the Auto Scaling group. Otherwise, the target tracking scaling policy can remove instances from the Auto Scaling group. The default is `false` .","PredefinedMetricSpecification":"A predefined metric. You must specify either a predefined metric or a customized metric.","TargetValue":"The target value for the metric.\\n\\n> Some metrics are based on a count instead of a percentage, such as the request count for an Application Load Balancer or the number of messages in an SQS queue. If the scaling policy specifies one of these metrics, specify the target utilization as the optimal average request or message count per instance during any one-minute interval."}},"AWS::AutoScaling::ScheduledAction":{"attributes":{"Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource name. For example: `mystack-myscheduledaction-NT5EUXTNTXXD` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) .","ScheduledActionName":"Returns the name of a scheduled action."},"description":"The `AWS::AutoScaling::ScheduledAction` resource specifies an Amazon EC2 Auto Scaling scheduled action so that the Auto Scaling group can change the number of instances available for your application in response to predictable load changes.\\n\\nWhen you update a stack with an Auto Scaling group and scheduled action, CloudFormation always sets the min size, max size, and desired capacity properties of your group to the values that are defined in the `AWS::AutoScaling::AutoScalingGroup` section of your template. However, you might not want CloudFormation to do that when you have a scheduled action in effect. You can use an [UpdatePolicy attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html) to prevent CloudFormation from changing the min size, max size, or desired capacity property values during a stack update unless you modified the individual values in your template. If you have rolling updates enabled, before you can update the Auto Scaling group, you must suspend scheduled actions by specifying an [UpdatePolicy attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html) for the Auto Scaling group. You can find a sample update policy for rolling updates in [Auto scaling template snippets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-autoscaling.html) .\\n\\nFor more information, see [Scheduled scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/schedule_time.html) and [Suspending and resuming scaling processes](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-suspend-resume-processes.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"AutoScalingGroupName":"The name of the Auto Scaling group.","DesiredCapacity":"The desired capacity is the initial capacity of the Auto Scaling group after the scheduled action runs and the capacity it attempts to maintain. It can scale beyond this capacity if you add more scaling conditions.\\n\\n> You must specify at least one of the following properties: `MaxSize` , `MinSize` , or `DesiredCapacity` .","EndTime":"The date and time for the recurring schedule to end, in UTC. For example, `\\"2021-06-01T00:00:00Z\\"` .","MaxSize":"The maximum size of the Auto Scaling group.","MinSize":"The minimum size of the Auto Scaling group.","Recurrence":"The recurring schedule for this action. This format consists of five fields separated by white spaces: [Minute] [Hour] [Day_of_Month] [Month_of_Year] [Day_of_Week]. The value must be in quotes (for example, `\\"30 0 1 1,6,12 *\\"` ). For more information about this format, see [Crontab](https://docs.aws.amazon.com/http://crontab.org) .\\n\\nWhen `StartTime` and `EndTime` are specified with `Recurrence` , they form the boundaries of when the recurring action starts and stops.\\n\\nCron expressions use Universal Coordinated Time (UTC) by default.","StartTime":"The date and time for this action to start, in YYYY-MM-DDThh:mm:ssZ format in UTC/GMT only and in quotes (for example, `\\"2021-06-01T00:00:00Z\\"` ).\\n\\nIf you specify `Recurrence` and `StartTime` , Amazon EC2 Auto Scaling performs the action at this time, and then performs the action based on the specified recurrence.","TimeZone":"Specifies the time zone for a cron expression. If a time zone is not provided, UTC is used by default.\\n\\nValid values are the canonical names of the IANA time zones, derived from the IANA Time Zone Database (such as `Etc/GMT+9` or `Pacific/Tahiti` ). For more information, see [https://en.wikipedia.org/wiki/List_of_tz_database_time_zones](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) ."}},"AWS::AutoScaling::WarmPool":{"attributes":{},"description":"The `AWS::AutoScaling::WarmPool` resource creates a pool of pre-initialized EC2 instances that sits alongside the Auto Scaling group. Whenever your application needs to scale out, the Auto Scaling group can draw on the warm pool to meet its new desired capacity.\\n\\nWhen you create a warm pool, you can define a minimum size. When your Auto Scaling group scales out and the size of the warm pool shrinks, Amazon EC2 Auto Scaling launches new instances into the warm pool to maintain its minimum size.\\n\\nFor more information, see [Warm pools for Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-warm-pools.html) in the *Amazon EC2 Auto Scaling User Guide* .\\n\\n> CloudFormation supports the `UpdatePolicy` attribute for Auto Scaling groups. During an update, if `UpdatePolicy` is set to `AutoScalingRollingUpdate` , CloudFormation replaces `InService` instances only. Instances in the warm pool are not replaced. The difference in which instances are replaced can potentially result in different instance configurations after the stack update completes. If `UpdatePolicy` is set to `AutoScalingReplacingUpdate` , you do not encounter this issue because CloudFormation replaces both the Auto Scaling group and the warm pool.","properties":{"AutoScalingGroupName":"The name of the Auto Scaling group.","InstanceReusePolicy":"Indicates whether instances in the Auto Scaling group can be returned to the warm pool on scale in. The default is to terminate instances in the Auto Scaling group when the group scales in.","MaxGroupPreparedCapacity":"Specifies the maximum number of instances that are allowed to be in the warm pool or in any state except `Terminated` for the Auto Scaling group. This is an optional property. Specify it only if you do not want the warm pool size to be determined by the difference between the group\'s maximum capacity and its desired capacity.\\n\\n> If a value for `MaxGroupPreparedCapacity` is not specified, Amazon EC2 Auto Scaling launches and maintains the difference between the group\'s maximum capacity and its desired capacity. If you specify a value for `MaxGroupPreparedCapacity` , Amazon EC2 Auto Scaling uses the difference between the `MaxGroupPreparedCapacity` and the desired capacity instead.\\n> \\n> The size of the warm pool is dynamic. Only when `MaxGroupPreparedCapacity` and `MinSize` are set to the same value does the warm pool have an absolute size. \\n\\nIf the desired capacity of the Auto Scaling group is higher than the `MaxGroupPreparedCapacity` , the capacity of the warm pool is 0, unless you specify a value for `MinSize` . To remove a value that you previously set, include the property but specify -1 for the value.","MinSize":"Specifies the minimum number of instances to maintain in the warm pool. This helps you to ensure that there is always a certain number of warmed instances available to handle traffic spikes. Defaults to 0 if not specified.","PoolState":"Sets the instance state to transition to after the lifecycle actions are complete. Default is `Stopped` ."}},"AWS::AutoScaling::WarmPool.InstanceReusePolicy":{"attributes":{},"description":"A structure that specifies an instance reuse policy for the `InstanceReusePolicy` property of the [AWS::AutoScaling::WarmPool](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-warmpool.html) resource.\\n\\nFor more information, see [Warm pools for Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-warm-pools.html) in the *Amazon EC2 Auto Scaling User Guide* .","properties":{"ReuseOnScaleIn":"Specifies whether instances in the Auto Scaling group can be returned to the warm pool on scale in."}},"AWS::AutoScalingPlans::ScalingPlan":{"attributes":{"Ref":"When you pass the logical ID of an `AWS::AutoScalingPlans::ScalingPlan` resource to the intrinsic `Ref` function, the function returns the Amazon Resource Name (ARN) of the scaling plan. The format of the ARN is as follows:\\n\\n`arn:aws:autoscaling: *region* : *123456789012:* scalingPlan:scalingPlanName/ *plan-name* :scalingPlanVersion/ *plan-version*`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::AutoScalingPlans::ScalingPlan` resource defines an AWS Auto Scaling scaling plan. A scaling plan is used to scale application resources to size them appropriately to ensure that enough resource is available in the application at peak times and to reduce allocated resource during periods of low utilization. The following resources can be added to a scaling plan:\\n\\n- Amazon EC2 Auto Scaling groups\\n- Amazon EC2 Spot Fleet requests\\n- Amazon ECS services\\n- Amazon DynamoDB tables and global secondary indexes\\n- Amazon Aurora Replicas\\n\\nFor more information, see the [AWS Auto Scaling User Guide](https://docs.aws.amazon.com/autoscaling/plans/userguide/what-is-aws-auto-scaling.html) .","properties":{"ApplicationSource":"A CloudFormation stack or a set of tags. You can create one scaling plan per application source. The `ApplicationSource` property must be present to ensure interoperability with the AWS Auto Scaling console.","ScalingInstructions":"The scaling instructions."}},"AWS::AutoScalingPlans::ScalingPlan.ApplicationSource":{"attributes":{},"description":"`ApplicationSource` is a property of [ScalingPlan](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscalingplans-scalingplan.html) that specifies the application source to use with AWS Auto Scaling ( Auto Scaling Plans ). You can create one scaling plan per application source.","properties":{"CloudFormationStackARN":"The Amazon Resource Name (ARN) of a CloudFormation stack.\\n\\nYou must specify either a `CloudFormationStackARN` or `TagFilters` .","TagFilters":"A set of tag filters (keys and values). Each tag filter specified must contain a key with values as optional. Each scaling plan can include up to 50 keys, and each key can include up to 20 values.\\n\\nTags are part of the syntax that you use to specify the resources you want returned when configuring a scaling plan from the AWS Auto Scaling console. You do not need to specify valid tag filter values when you create a scaling plan with CloudFormation. The `Key` and `Values` properties can accept any value as long as the combination of values is unique across scaling plans. However, if you also want to use the AWS Auto Scaling console to edit the scaling plan, then you must specify valid values.\\n\\nYou must specify either a `CloudFormationStackARN` or `TagFilters` ."}},"AWS::AutoScalingPlans::ScalingPlan.CustomizedLoadMetricSpecification":{"attributes":{},"description":"`CustomizedLoadMetricSpecification` is a subproperty of [ScalingInstruction](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html) that specifies a customized load metric for predictive scaling to use with AWS Auto Scaling ( Auto Scaling Plans ).\\n\\nFor predictive scaling to work with a customized load metric specification, AWS Auto Scaling needs access to the `Sum` and `Average` statistics that CloudWatch computes from metric data.\\n\\nWhen you choose a load metric, make sure that the required `Sum` and `Average` statistics for your metric are available in CloudWatch and that they provide relevant data for predictive scaling. The `Sum` statistic must represent the total load on the resource, and the `Average` statistic must represent the average load per capacity unit of the resource. For example, there is a metric that counts the number of requests processed by your Auto Scaling group. If the `Sum` statistic represents the total request count processed by the group, then the `Average` statistic for the specified metric must represent the average request count processed by each instance of the group.\\n\\nIf you publish your own metrics, you can aggregate the data points at a given interval and then publish the aggregated data points to CloudWatch. Before AWS Auto Scaling generates the forecast, it sums up all the metric data points that occurred within each hour to match the granularity period that is used in the forecast (60 minutes).\\n\\nFor information about terminology, available metrics, or how to publish new metrics, see [Amazon CloudWatch Concepts](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html) in the *Amazon CloudWatch User Guide* .\\n\\nAfter creating your scaling plan, you can use the AWS Auto Scaling console to visualize forecasts for the specified metric. For more information, see [View Scaling Information for a Resource](https://docs.aws.amazon.com/autoscaling/plans/userguide/gs-create-scaling-plan.html#gs-view-resource) in the *AWS Auto Scaling User Guide* .","properties":{"Dimensions":"The dimensions of the metric.\\n\\nConditional: If you published your metric with dimensions, you must specify the same dimensions in your customized load metric specification.","MetricName":"The name of the metric.","Namespace":"The namespace of the metric.","Statistic":"The statistic of the metric.\\n\\n*Allowed Values* : `Sum`","Unit":"The unit of the metric."}},"AWS::AutoScalingPlans::ScalingPlan.CustomizedScalingMetricSpecification":{"attributes":{},"description":"`CustomizedScalingMetricSpecification` is a subproperty of [TargetTrackingConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-targettrackingconfiguration.html) that specifies a customized scaling metric for a target tracking configuration to use with AWS Auto Scaling ( Auto Scaling Plans ).\\n\\nTo create your customized scaling metric specification:\\n\\n- Add values for each required property from CloudWatch. You can use an existing metric, or a new metric that you create. To use your own metric, you must first publish the metric to CloudWatch. For more information, see [Publish Custom Metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html) in the *Amazon CloudWatch User Guide* .\\n- Choose a metric that changes proportionally with capacity. The value of the metric should increase or decrease in inverse proportion to the number of capacity units. That is, the value of the metric should decrease when capacity increases.\\n\\nFor information about terminology, available metrics, or how to publish new metrics, see [Amazon CloudWatch Concepts](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html) in the *Amazon CloudWatch User Guide* .","properties":{"Dimensions":"The dimensions of the metric.\\n\\nConditional: If you published your metric with dimensions, you must specify the same dimensions in your scaling policy.","MetricName":"The name of the metric. To get the exact metric name, namespace, and dimensions, inspect the [Metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_Metric.html) object that is returned by a call to [ListMetrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_ListMetrics.html) .","Namespace":"The namespace of the metric.","Statistic":"The statistic of the metric.","Unit":"The unit of the metric. For a complete list of the units that CloudWatch supports, see the [MetricDatum](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html) data type in the *Amazon CloudWatch API Reference* ."}},"AWS::AutoScalingPlans::ScalingPlan.MetricDimension":{"attributes":{},"description":"`MetricDimension` is a subproperty of [CustomizedScalingMetricSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedscalingmetricspecification.html) that specifies a dimension for a customized metric to use with AWS Auto Scaling ( Auto Scaling Plans ). Dimensions are arbitrary name/value pairs that can be associated with a CloudWatch metric. Duplicate dimensions are not allowed.","properties":{"Name":"The name of the dimension.","Value":"The value of the dimension."}},"AWS::AutoScalingPlans::ScalingPlan.PredefinedLoadMetricSpecification":{"attributes":{},"description":"`PredefinedLoadMetricSpecification` is a subproperty of [ScalingInstruction](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html) that specifies a predefined load metric for predictive scaling to use with AWS Auto Scaling ( Auto Scaling Plans ).\\n\\nAfter creating your scaling plan, you can use the AWS Auto Scaling console to visualize forecasts for the specified metric. For more information, see [View Scaling Information for a Resource](https://docs.aws.amazon.com/autoscaling/plans/userguide/gs-create-scaling-plan.html#gs-view-resource) in the *AWS Auto Scaling User Guide* .","properties":{"PredefinedLoadMetricType":"The metric type.","ResourceLabel":"Identifies the resource associated with the metric type. You can\'t specify a resource label unless the metric type is `ALBTargetGroupRequestCount` and there is a target group for an Application Load Balancer attached to the Auto Scaling group.\\n\\nYou create the resource label by appending the final portion of the load balancer ARN and the final portion of the target group ARN into a single value, separated by a forward slash (/). The format is app///targetgroup//, where:\\n\\n- app// is the final portion of the load balancer ARN\\n- targetgroup// is the final portion of the target group ARN.\\n\\nThis is an example: app/EC2Co-EcsEl-1TKLTMITMM0EO/f37c06a68c1748aa/targetgroup/EC2Co-Defau-LDNM7Q3ZH1ZN/6d4ea56ca2d6a18d.\\n\\nTo find the ARN for an Application Load Balancer, use the [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html) API operation. To find the ARN for the target group, use the [DescribeTargetGroups](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeTargetGroups.html) API operation."}},"AWS::AutoScalingPlans::ScalingPlan.PredefinedScalingMetricSpecification":{"attributes":{},"description":"`PredefinedScalingMetricSpecification` is a subproperty of [TargetTrackingConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-targettrackingconfiguration.html) that specifies a customized scaling metric for a target tracking configuration to use with AWS Auto Scaling ( Auto Scaling Plans ).","properties":{"PredefinedScalingMetricType":"The metric type. The `ALBRequestCountPerTarget` metric type applies only to Auto Scaling groups, Spot Fleet requests, and ECS services.","ResourceLabel":"Identifies the resource associated with the metric type. You can\'t specify a resource label unless the metric type is `ALBRequestCountPerTarget` and there is a target group for an Application Load Balancer attached to the Auto Scaling group, Spot Fleet request, or ECS service.\\n\\nYou create the resource label by appending the final portion of the load balancer ARN and the final portion of the target group ARN into a single value, separated by a forward slash (/). The format is app///targetgroup//, where:\\n\\n- app// is the final portion of the load balancer ARN\\n- targetgroup// is the final portion of the target group ARN.\\n\\nThis is an example: app/EC2Co-EcsEl-1TKLTMITMM0EO/f37c06a68c1748aa/targetgroup/EC2Co-Defau-LDNM7Q3ZH1ZN/6d4ea56ca2d6a18d.\\n\\nTo find the ARN for an Application Load Balancer, use the [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html) API operation. To find the ARN for the target group, use the [DescribeTargetGroups](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeTargetGroups.html) API operation."}},"AWS::AutoScalingPlans::ScalingPlan.ScalingInstruction":{"attributes":{},"description":"`ScalingInstruction` is a property of [ScalingPlan](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscalingplans-scalingplan.html) that specifies the scaling instruction for a scalable resource in a scaling plan. Each scaling instruction applies to one resource.\\n\\nAWS Auto Scaling creates target tracking scaling policies based on the scaling instructions. Target tracking scaling policies adjust the capacity of your scalable resource as required to maintain resource utilization at the target value that you specified.\\n\\nAWS Auto Scaling also configures predictive scaling for your Amazon EC2 Auto Scaling groups using a subset of properties, including the load metric, the scaling metric, the target value for the scaling metric, the predictive scaling mode (forecast and scale or forecast only), and the desired behavior when the forecast capacity exceeds the maximum capacity of the resource. With predictive scaling, AWS Auto Scaling generates forecasts with traffic predictions for the two days ahead and schedules scaling actions that proactively add and remove resource capacity to match the forecast.\\n\\n> We recommend waiting a minimum of 24 hours after creating an Auto Scaling group to configure predictive scaling. At minimum, there must be 24 hours of historical data to generate a forecast. For more information, see [Best Practices for AWS Auto Scaling](https://docs.aws.amazon.com/autoscaling/plans/userguide/gs-best-practices.html) in the *AWS Auto Scaling User Guide* .","properties":{"CustomizedLoadMetricSpecification":"The customized load metric to use for predictive scaling. This property or a *PredefinedLoadMetricSpecification* is required when configuring predictive scaling, and cannot be used otherwise.","DisableDynamicScaling":"Controls whether dynamic scaling by AWS Auto Scaling is disabled. When dynamic scaling is enabled, AWS Auto Scaling creates target tracking scaling policies based on the specified target tracking configurations.\\n\\nThe default is enabled ( `false` ).","MaxCapacity":"The maximum capacity of the resource. The exception to this upper limit is if you specify a non-default setting for *PredictiveScalingMaxCapacityBehavior* .","MinCapacity":"The minimum capacity of the resource.","PredefinedLoadMetricSpecification":"The predefined load metric to use for predictive scaling. This property or a *CustomizedLoadMetricSpecification* is required when configuring predictive scaling, and cannot be used otherwise.","PredictiveScalingMaxCapacityBehavior":"Defines the behavior that should be applied if the forecast capacity approaches or exceeds the maximum capacity specified for the resource. The default value is `SetForecastCapacityToMaxCapacity` .\\n\\nThe following are possible values:\\n\\n- `SetForecastCapacityToMaxCapacity` - AWS Auto Scaling cannot scale resource capacity higher than the maximum capacity. The maximum capacity is enforced as a hard limit.\\n- `SetMaxCapacityToForecastCapacity` - AWS Auto Scaling can scale resource capacity higher than the maximum capacity to equal but not exceed forecast capacity.\\n- `SetMaxCapacityAboveForecastCapacity` - AWS Auto Scaling can scale resource capacity higher than the maximum capacity by a specified buffer value. The intention is to give the target tracking scaling policy extra capacity if unexpected traffic occurs.\\n\\nValid only when configuring predictive scaling.","PredictiveScalingMaxCapacityBuffer":"The size of the capacity buffer to use when the forecast capacity is close to or exceeds the maximum capacity. The value is specified as a percentage relative to the forecast capacity. For example, if the buffer is 10, this means a 10 percent buffer. With a 10 percent buffer, if the forecast capacity is 50, and the maximum capacity is 40, then the effective maximum capacity is 55.\\n\\nValid only when configuring predictive scaling. Required if *PredictiveScalingMaxCapacityBehavior* is set to `SetMaxCapacityAboveForecastCapacity` , and cannot be used otherwise.\\n\\nThe range is 1-100.","PredictiveScalingMode":"The predictive scaling mode. The default value is `ForecastAndScale` . Otherwise, AWS Auto Scaling forecasts capacity but does not apply any scheduled scaling actions based on the capacity forecast.","ResourceId":"The ID of the resource. This string consists of the resource type and unique identifier.\\n\\n- Auto Scaling group - The resource type is `autoScalingGroup` and the unique identifier is the name of the Auto Scaling group. Example: `autoScalingGroup/my-asg` .\\n- ECS service - The resource type is `service` and the unique identifier is the cluster name and service name. Example: `service/default/sample-webapp` .\\n- Spot Fleet request - The resource type is `spot-fleet-request` and the unique identifier is the Spot Fleet request ID. Example: `spot-fleet-request/sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE` .\\n- DynamoDB table - The resource type is `table` and the unique identifier is the resource ID. Example: `table/my-table` .\\n- DynamoDB global secondary index - The resource type is `index` and the unique identifier is the resource ID. Example: `table/my-table/index/my-table-index` .\\n- Aurora DB cluster - The resource type is `cluster` and the unique identifier is the cluster name. Example: `cluster:my-db-cluster` .","ScalableDimension":"The scalable dimension associated with the resource.\\n\\n- `autoscaling:autoScalingGroup:DesiredCapacity` - The desired capacity of an Auto Scaling group.\\n- `ecs:service:DesiredCount` - The desired task count of an ECS service.\\n- `ec2:spot-fleet-request:TargetCapacity` - The target capacity of a Spot Fleet request.\\n- `dynamodb:table:ReadCapacityUnits` - The provisioned read capacity for a DynamoDB table.\\n- `dynamodb:table:WriteCapacityUnits` - The provisioned write capacity for a DynamoDB table.\\n- `dynamodb:index:ReadCapacityUnits` - The provisioned read capacity for a DynamoDB global secondary index.\\n- `dynamodb:index:WriteCapacityUnits` - The provisioned write capacity for a DynamoDB global secondary index.\\n- `rds:cluster:ReadReplicaCount` - The count of Aurora Replicas in an Aurora DB cluster. Available for Aurora MySQL-compatible edition and Aurora PostgreSQL-compatible edition.","ScalingPolicyUpdateBehavior":"Controls whether your scaling policies that are external to AWS Auto Scaling are deleted and new target tracking scaling policies created. The default value is `KeepExternalPolicies` .\\n\\nValid only when configuring dynamic scaling.","ScheduledActionBufferTime":"The amount of time, in seconds, to buffer the run time of scheduled scaling actions when scaling out. For example, if the forecast says to add capacity at 10:00 AM, and the buffer time is 5 minutes, then the run time of the corresponding scheduled scaling action will be 9:55 AM. The intention is to give resources time to be provisioned. For example, it can take a few minutes to launch an EC2 instance. The actual amount of time required depends on several factors, such as the size of the instance and whether there are startup scripts to complete.\\n\\nThe value must be less than the forecast interval duration of 3600 seconds (60 minutes). The default is 300 seconds.\\n\\nValid only when configuring predictive scaling.","ServiceNamespace":"The namespace of the AWS service.","TargetTrackingConfigurations":"The target tracking configurations (up to 10). Each of these structures must specify a unique scaling metric and a target value for the metric."}},"AWS::AutoScalingPlans::ScalingPlan.TagFilter":{"attributes":{},"description":"`TagFilter` is a subproperty of [ApplicationSource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-applicationsource.html) that specifies a tag for an application source to use with AWS Auto Scaling ( Auto Scaling Plans ).","properties":{"Key":"The tag key.","Values":"The tag values (0 to 20)."}},"AWS::AutoScalingPlans::ScalingPlan.TargetTrackingConfiguration":{"attributes":{},"description":"`TargetTrackingConfiguration` is a subproperty of [ScalingInstruction](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html) that specifies a target tracking configuration to use with AWS Auto Scaling ( Auto Scaling Plans ).","properties":{"CustomizedScalingMetricSpecification":"A customized metric. You can specify either a predefined metric or a customized metric.","DisableScaleIn":"Indicates whether scale in by the target tracking scaling policy is disabled. If the value is `true` , scale in is disabled and the target tracking scaling policy doesn\'t remove capacity from the scalable resource. Otherwise, scale in is enabled and the target tracking scaling policy can remove capacity from the scalable resource.\\n\\nThe default value is `false` .","EstimatedInstanceWarmup":"The estimated time, in seconds, until a newly launched instance can contribute to the CloudWatch metrics. This value is used only if the resource is an Auto Scaling group.","PredefinedScalingMetricSpecification":"A predefined metric. You can specify either a predefined metric or a customized metric.","ScaleInCooldown":"The amount of time, in seconds, after a scale-in activity completes before another scale in activity can start. This value is not used if the scalable resource is an Auto Scaling group.","ScaleOutCooldown":"The amount of time, in seconds, after a scale-out activity completes before another scale-out activity can start. This value is not used if the scalable resource is an Auto Scaling group.","TargetValue":"The target value for the metric. Although this property accepts numbers of type Double, it won\'t accept values that are either too small or too large. Values must be in the range of -2^360 to 2^360."}},"AWS::Backup::BackupPlan":{"attributes":{"BackupPlanArn":"An Amazon Resource Name (ARN) that uniquely identifies a backup plan; for example, `arn:aws:backup:us-east-1:123456789012:plan:8F81F553-3A74-4A3F-B93D-B3360DC80C50` .","BackupPlanId":"Uniquely identifies a backup plan.","Ref":"`Ref` returns `BackupPlanId` .","VersionId":"Unique, randomly generated, Unicode, UTF-8 encoded strings that are at most 1,024 bytes long. Version Ids cannot be edited."},"description":"Contains an optional backup plan display name and an array of `BackupRule` objects, each of which specifies a backup rule. Each rule in a backup plan is a separate scheduled task and can back up a different selection of AWS resources.\\n\\nFor a sample AWS CloudFormation template, see the [AWS Backup Developer Guide](https://docs.aws.amazon.com/aws-backup/latest/devguide/assigning-resources.html#assigning-resources-cfn) .","properties":{"BackupPlan":"Uniquely identifies the backup plan to be associated with the selection of resources.","BackupPlanTags":"To help organize your resources, you can assign your own metadata to the resources that you create. Each tag is a key-value pair. The specified tags are assigned to all backups created with this plan."}},"AWS::Backup::BackupPlan.AdvancedBackupSettingResourceType":{"attributes":{},"description":"Specifies an object containing resource type and backup options. This is only supported for Windows VSS backups.","properties":{"BackupOptions":"The backup option for the resource. Each option is a key-value pair. This option is only available for Windows VSS backup jobs.\\n\\nValid values:\\n\\nSet to `\\"WindowsVSS\\":\\"enabled\\"` to enable the `WindowsVSS` backup option and create a Windows VSS backup.\\n\\nSet to `\\"WindowsVSS\\":\\"disabled\\"` to create a regular backup. The `WindowsVSS` option is not enabled by default.\\n\\nIf you specify an invalid option, you get an `InvalidParameterValueException` exception.\\n\\nFor more information about Windows VSS backups, see [Creating a VSS-Enabled Windows Backup](https://docs.aws.amazon.com/aws-backup/latest/devguide/windows-backups.html) .","ResourceType":"The name of a resource type. The only supported resource type is EC2."}},"AWS::Backup::BackupPlan.BackupPlanResourceType":{"attributes":{},"description":"Specifies an object containing properties used to create a backup plan.","properties":{"AdvancedBackupSettings":"A list of backup options for each resource type.","BackupPlanName":"The display name of a backup plan.","BackupPlanRule":"An array of `BackupRule` objects, each of which specifies a scheduled task that is used to back up a selection of resources."}},"AWS::Backup::BackupPlan.BackupRuleResourceType":{"attributes":{},"description":"Specifies an object containing properties used to schedule a task to back up a selection of resources.","properties":{"CompletionWindowMinutes":"A value in minutes after a backup job is successfully started before it must be completed or it is canceled by AWS Backup .","CopyActions":"An array of CopyAction objects, which contains the details of the copy operation.","EnableContinuousBackup":"Enables continuous backup and point-in-time restores (PITR).","Lifecycle":"The lifecycle defines when a protected resource is transitioned to cold storage and when it expires. AWS Backup transitions and expires backups automatically according to the lifecycle that you define.","RecoveryPointTags":"To help organize your resources, you can assign your own metadata to the resources that you create. Each tag is a key-value pair.","RuleName":"A display name for a backup rule.","ScheduleExpression":"A CRON expression specifying when AWS Backup initiates a backup job.","StartWindowMinutes":"An optional value that specifies a period of time in minutes after a backup is scheduled before a job is canceled if it doesn\'t start successfully.\\n\\nIf this value is included, it must be at least 60 minutes to avoid errors.","TargetBackupVault":"The name of a logical container where backups are stored. Backup vaults are identified by names that are unique to the account used to create them and the AWS Region where they are created. They consist of letters, numbers, and hyphens."}},"AWS::Backup::BackupPlan.CopyActionResourceType":{"attributes":{},"description":"Copies backups created by a backup rule to another vault.","properties":{"DestinationBackupVaultArn":"An Amazon Resource Name (ARN) that uniquely identifies the destination backup vault for the copied backup. For example, `arn:aws:backup:us-east-1:123456789012:vault:aBackupVault.`","Lifecycle":"Defines when a protected resource is transitioned to cold storage and when it expires. AWS Backup transitions and expires backups automatically according to the lifecycle that you define. If you do not specify a lifecycle, AWS Backup applies the lifecycle policy of the source backup to the destination backup.\\n\\nBackups transitioned to cold storage must be stored in cold storage for a minimum of 90 days."}},"AWS::Backup::BackupPlan.LifecycleResourceType":{"attributes":{},"description":"Specifies an object containing an array of `Transition` objects that determine how long in days before a recovery point transitions to cold storage or is deleted.","properties":{"DeleteAfterDays":"Specifies the number of days after creation that a recovery point is deleted. Must be greater than `MoveToColdStorageAfterDays` .","MoveToColdStorageAfterDays":"Specifies the number of days after creation that a recovery point is moved to cold storage."}},"AWS::Backup::BackupSelection":{"attributes":{"BackupPlanId":"Uniquely identifies a backup plan.","Id":"Uniquely identifies the backup selection.","Ref":"`Ref` returns `BackupSelectionId` .","SelectionId":"Uniquely identifies a request to assign a set of resources to a backup plan."},"description":"Specifies a set of resources to assign to a backup plan.\\n\\nFor a sample AWS CloudFormation template, see the [AWS Backup Developer Guide](https://docs.aws.amazon.com/aws-backup/latest/devguide/assigning-resources.html#assigning-resources-cfn) .","properties":{"BackupPlanId":"Uniquely identifies a backup plan.","BackupSelection":"Specifies the body of a request to assign a set of resources to a backup plan.\\n\\nIt includes an array of resources, an optional array of patterns to exclude resources, an optional role to provide access to the AWS service the resource belongs to, and an optional array of tags used to identify a set of resources."}},"AWS::Backup::BackupSelection.BackupSelectionResourceType":{"attributes":{},"description":"Specifies an object containing properties used to assign a set of resources to a backup plan.","properties":{"Conditions":"A list of conditions that you define to assign resources to your backup plans using tags. For example, `\\"StringEquals\\": { \\"ConditionKey\\": \\"aws:ResourceTag/CreatedByCryo\\", \\"ConditionValue\\": \\"true\\" },` . Condition operators are case sensitive.\\n\\n`Conditions` differs from `ListOfTags` as follows:\\n\\n- When you specify more than one condition, you only assign the resources that match ALL conditions (using AND logic).\\n- `Conditions` supports `StringEquals` , `StringLike` , `StringNotEquals` , and `StringNotLike` . `ListOfTags` only supports `StringEquals` .","IamRoleArn":"The ARN of the IAM role that AWS Backup uses to authenticate when backing up the target resource; for example, `arn:aws:iam::123456789012:role/S3Access` .","ListOfTags":"A list of conditions that you define to assign resources to your backup plans using tags. For example, `\\"StringEquals\\": { \\"ConditionKey\\": \\"aws:ResourceTag/CreatedByCryo\\", \\"ConditionValue\\": \\"true\\" },` . Condition operators are case sensitive.\\n\\n`ListOfTags` differs from `Conditions` as follows:\\n\\n- When you specify more than one condition, you assign all resources that match AT LEAST ONE condition (using OR logic).\\n- `ListOfTags` only supports `StringEquals` . `Conditions` supports `StringEquals` , `StringLike` , `StringNotEquals` , and `StringNotLike` .","NotResources":"A list of Amazon Resource Names (ARNs) to exclude from a backup plan. The maximum number of ARNs is 500 without wildcards, or 30 ARNs with wildcards.\\n\\nIf you need to exclude many resources from a backup plan, consider a different resource selection strategy, such as assigning only one or a few resource types or refining your resource selection using tags.","Resources":"An array of strings that contain Amazon Resource Names (ARNs) of resources to assign to a backup plan.","SelectionName":"The display name of a resource selection document."}},"AWS::Backup::BackupSelection.ConditionParameter":{"attributes":{},"description":"Includes information about tags you define to assign tagged resources to a backup plan.","properties":{"ConditionKey":"The key in a key-value pair. For example, in the tag `Department: Accounting` , `Department` is the key.","ConditionValue":"The value in a key-value pair. For example, in the tag `Department: Accounting` , `Accounting` is the value."}},"AWS::Backup::BackupSelection.ConditionResourceType":{"attributes":{},"description":"Specifies an object that contains an array of triplets made up of a condition type (such as `STRINGEQUALS` ), a key, and a value. Conditions are used to filter resources in a selection that is assigned to a backup plan.","properties":{"ConditionKey":"The key in a key-value pair. For example, in `\\"Department\\": \\"accounting\\"` , `\\"Department\\"` is the key.","ConditionType":"An operation, such as `STRINGEQUALS` , that is applied to a key-value pair used to filter resources in a selection.","ConditionValue":"The value in a key-value pair. For example, in `\\"Department\\": \\"accounting\\"` , `\\"accounting\\"` is the value."}},"AWS::Backup::BackupSelection.Conditions":{"attributes":{},"description":"Contains information about which resources to include or exclude from a backup plan using their tags. Conditions are case sensitive.","properties":{"StringEquals":"Filters the values of your tagged resources for only those resources that you tagged with the same value. Also called \\"exact matching.\\"","StringLike":"Filters the values of your tagged resources for matching tag values with the use of a wildcard character (*) anywhere in the string. For example, \\"prod*\\" or \\"*rod*\\" matches the tag value \\"production\\".","StringNotEquals":"Filters the values of your tagged resources for only those resources that you tagged that do not have the same value. Also called \\"negated matching.\\"","StringNotLike":"Filters the values of your tagged resources for non-matching tag values with the use of a wildcard character (*) anywhere in the string."}},"AWS::Backup::BackupVault":{"attributes":{"BackupVaultArn":"An Amazon Resource Name (ARN) that uniquely identifies a backup vault; for example, `arn:aws:backup:us-east-1:123456789012:backup-vault:aBackupVault` .","BackupVaultName":"The name of a logical container where backups are stored. Backup vaults are identified by names that are unique to the account used to create them and the Region where they are created. They consist of lowercase and uppercase letters, numbers, and hyphens.","Ref":"`Ref` returns `BackupVaultName` ."},"description":"Creates a logical container where backups are stored. A `CreateBackupVault` request includes a name, optionally one or more resource tags, an encryption key, and a request ID.\\n\\nDo not include sensitive data, such as passport numbers, in the name of a backup vault.\\n\\nFor a sample AWS CloudFormation template, see the [AWS Backup Developer Guide](https://docs.aws.amazon.com/aws-backup/latest/devguide/assigning-resources.html#assigning-resources-cfn) .","properties":{"AccessPolicy":"A resource-based policy that is used to manage access permissions on the target backup vault.","BackupVaultName":"The name of a logical container where backups are stored. Backup vaults are identified by names that are unique to the account used to create them and the AWS Region where they are created. They consist of lowercase letters, numbers, and hyphens.","BackupVaultTags":"Metadata that you can assign to help organize the resources that you create. Each tag is a key-value pair.","EncryptionKeyArn":"A server-side encryption key you can specify to encrypt your backups from services that support full AWS Backup management; for example, `arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab` . If you specify a key, you must specify its ARN, not its alias. If you do not specify a key, AWS Backup creates a KMS key for you by default.\\n\\nTo learn which AWS Backup services support full AWS Backup management and how AWS Backup handles encryption for backups from services that do not yet support full AWS Backup , see [Encryption for backups in AWS Backup](https://docs.aws.amazon.com/aws-backup/latest/devguide/encryption.html)","LockConfiguration":"Configuration for [AWS Backup Vault Lock](https://docs.aws.amazon.com/aws-backup/latest/devguide/vault-lock.html) .","Notifications":"The SNS event notifications for the specified backup vault."}},"AWS::Backup::BackupVault.LockConfigurationType":{"attributes":{},"description":"The `LockConfigurationType` property type specifies configuration for [AWS Backup Vault Lock](https://docs.aws.amazon.com/aws-backup/latest/devguide/vault-lock.html) .","properties":{"ChangeableForDays":"The AWS Backup Vault Lock configuration that specifies the number of days before the lock date. For example, setting `ChangeableForDays` to 30 on Jan. 1, 2022 at 8pm UTC will set the lock date to Jan. 31, 2022 at 8pm UTC.\\n\\nAWS Backup enforces a 72-hour cooling-off period before Vault Lock takes effect and becomes immutable. Therefore, you must set `ChangeableForDays` to 3 or greater.\\n\\nBefore the lock date, you can delete Vault Lock from the vault using `DeleteBackupVaultLockConfiguration` or change the Vault Lock configuration using `PutBackupVaultLockConfiguration` . On and after the lock date, the Vault Lock becomes immutable and cannot be changed or deleted.\\n\\nIf this parameter is not specified, you can delete Vault Lock from the vault using `DeleteBackupVaultLockConfiguration` or change the Vault Lock configuration using `PutBackupVaultLockConfiguration` at any time.","MaxRetentionDays":"The AWS Backup Vault Lock configuration that specifies the maximum retention period that the vault retains its recovery points. This setting can be useful if, for example, your organization\'s policies require you to destroy certain data after retaining it for four years (1460 days).\\n\\nIf this parameter is not included, Vault Lock does not enforce a maximum retention period on the recovery points in the vault. If this parameter is included without a value, Vault Lock will not enforce a maximum retention period.\\n\\nIf this parameter is specified, any backup or copy job to the vault must have a lifecycle policy with a retention period equal to or shorter than the maximum retention period. If the job\'s retention period is longer than that maximum retention period, then the vault fails the backup or copy job, and you should either modify your lifecycle settings or use a different vault. Recovery points already saved in the vault prior to Vault Lock are not affected.","MinRetentionDays":"The AWS Backup Vault Lock configuration that specifies the minimum retention period that the vault retains its recovery points. This setting can be useful if, for example, your organization\'s policies require you to retain certain data for at least seven years (2555 days).\\n\\nIf this parameter is not specified, Vault Lock will not enforce a minimum retention period.\\n\\nIf this parameter is specified, any backup or copy job to the vault must have a lifecycle policy with a retention period equal to or longer than the minimum retention period. If the job\'s retention period is shorter than that minimum retention period, then the vault fails that backup or copy job, and you should either modify your lifecycle settings or use a different vault. Recovery points already saved in the vault prior to Vault Lock are not affected."}},"AWS::Backup::BackupVault.NotificationObjectType":{"attributes":{},"description":"Specifies an object containing SNS event notification properties for the target backup vault.","properties":{"BackupVaultEvents":"An array of events that indicate the status of jobs to back up resources to the backup vault. For valid events, see [BackupVaultEvents](https://docs.aws.amazon.com/aws-backup/latest/devguide/API_PutBackupVaultNotifications.html#API_PutBackupVaultNotifications_RequestSyntax) in the *AWS Backup API Guide* .","SNSTopicArn":"An ARN that uniquely identifies an Amazon Simple Notification Service (Amazon SNS) topic; for example, `arn:aws:sns:us-west-2:111122223333:MyTopic` ."}},"AWS::Backup::Framework":{"attributes":{"CreationTime":"The UTC time when you created your framework.","DeploymentStatus":"Depolyment status refers to whether your framework has completed deployment. This status is usually `Completed` , but might also be `Create in progress` or another status. For a list of statuses, see [Framework compliance status](https://docs.aws.amazon.com/aws-backup/latest/devguide/viewing-frameworks.html) in the *Developer Guide* .","FrameworkArn":"The Amazon Resource Name (ARN) of your framework.","FrameworkStatus":"Framework status refers to whether you have turned on resource tracking for all of your resources. This status is `Active` when you turn on all resources the framework evaluates. For other statuses and steps to correct them, see [Framework compliance status](https://docs.aws.amazon.com/aws-backup/latest/devguide/viewing-frameworks.html) in the *Developer Guide* .","Ref":""},"description":"Creates a framework with one or more controls. A framework is a collection of controls that you can use to evaluate your backup practices. By using pre-built customizable controls to define your policies, you can evaluate whether your backup practices comply with your policies and which resources are not yet in compliance.\\n\\nFor a sample AWS CloudFormation template, see the [AWS Backup Developer Guide](https://docs.aws.amazon.com/aws-backup/latest/devguide/bam-cfn-integration.html#bam-cfn-frameworks-template) .","properties":{"FrameworkControls":"Contains detailed information about all of the controls of a framework. Each framework must contain at least one control.","FrameworkDescription":"An optional description of the framework with a maximum 1,024 characters.","FrameworkName":"The unique name of a framework. This name is between 1 and 256 characters, starting with a letter, and consisting of letters (a-z, A-Z), numbers (0-9), and underscores (_).","FrameworkTags":"A list of tags with which to tag your framework."}},"AWS::Backup::Framework.ControlInputParameter":{"attributes":{},"description":"A list of parameters for a control. A control can have zero, one, or more than one parameter. An example of a control with two parameters is: \\"backup plan frequency is at least `daily` and the retention period is at least `1 year` \\". The first parameter is `daily` . The second parameter is `1 year` .","properties":{"ParameterName":"The name of a parameter, for example, `BackupPlanFrequency` .","ParameterValue":"The value of parameter, for example, `hourly` ."}},"AWS::Backup::Framework.ControlScope":{"attributes":{},"description":"A framework consists of one or more controls. Each control has its own control scope. The control scope can include one or more resource types, a combination of a tag key and value, or a combination of one resource type and one resource ID. If no scope is specified, evaluations for the rule are triggered when any resource in your recording group changes in configuration.\\n\\n> To set a control scope that includes all of a particular resource, leave the `ControlScope` empty or do not pass it when calling `CreateFramework` .","properties":{"ComplianceResourceIds":"The ID of the only AWS resource that you want your control scope to contain.","ComplianceResourceTypes":"Describes whether the control scope includes one or more types of resources, such as `EFS` or `RDS` .","Tags":"The tag key-value pair applied to those AWS resources that you want to trigger an evaluation for a rule. A maximum of one key-value pair can be provided. The tag value is optional, but it cannot be an empty string. The structure to assign a tag is: `[{\\"Key\\":\\"string\\",\\"Value\\":\\"string\\"}]` ."}},"AWS::Backup::Framework.FrameworkControl":{"attributes":{},"description":"Contains detailed information about all of the controls of a framework. Each framework must contain at least one control.","properties":{"ControlInputParameters":"A list of `ParameterName` and `ParameterValue` pairs.","ControlName":"The name of a control. This name is between 1 and 256 characters.","ControlScope":"The scope of a control. The control scope defines what the control will evaluate. Three examples of control scopes are: a specific backup plan, all backup plans with a specific tag, or all backup plans. For more information, see [`ControlScope` .](https://docs.aws.amazon.com/aws-backup/latest/devguide/API_ControlScope.html)"}},"AWS::Backup::ReportPlan":{"attributes":{"Ref":"","ReportPlanArn":"The Amazon Resource Name (ARN) of your report plan."},"description":"Creates a report plan. A report plan is a document that contains information about the contents of the report and where AWS Backup will deliver it.\\n\\nIf you call `CreateReportPlan` with a plan that already exists, you receive an `AlreadyExistsException` exception.\\n\\nFor a sample AWS CloudFormation template, see the [AWS Backup Developer Guide](https://docs.aws.amazon.com/aws-backup/latest/devguide/assigning-resources.html#assigning-resources-cfn) .","properties":{"ReportDeliveryChannel":"Contains information about where and how to deliver your reports, specifically your Amazon S3 bucket name, S3 key prefix, and the formats of your reports.","ReportPlanDescription":"An optional description of the report plan with a maximum 1,024 characters.","ReportPlanName":"The unique name of the report plan. This name is between 1 and 256 characters starting with a letter, and consisting of letters (a-z, A-Z), numbers (0-9), and underscores (_).","ReportPlanTags":"A list of tags to tag your report plan.","ReportSetting":"Identifies the report template for the report. Reports are built using a report template. The report templates are:\\n\\n`RESOURCE_COMPLIANCE_REPORT | CONTROL_COMPLIANCE_REPORT | BACKUP_JOB_REPORT | COPY_JOB_REPORT | RESTORE_JOB_REPORT`\\n\\nIf the report template is `RESOURCE_COMPLIANCE_REPORT` or `CONTROL_COMPLIANCE_REPORT` , this API resource also describes the report coverage by AWS Regions and frameworks."}},"AWS::Backup::ReportPlan.ReportDeliveryChannel":{"attributes":{},"description":"Contains information from your report plan about where to deliver your reports, specifically your Amazon S3 bucket name, S3 key prefix, and the formats of your reports.","properties":{"Formats":"A list of the format of your reports: `CSV` , `JSON` , or both. If not specified, the default format is `CSV` .","S3BucketName":"The unique name of the S3 bucket that receives your reports.","S3KeyPrefix":"The prefix for where AWS Backup Audit Manager delivers your reports to Amazon S3. The prefix is this part of the following path: s3://your-bucket-name/ `prefix` /Backup/us-west-2/year/month/day/report-name. If not specified, there is no prefix."}},"AWS::Backup::ReportPlan.ReportSetting":{"attributes":{},"description":"Contains detailed information about a report setting.","properties":{"Accounts":"These are the accounts to be included in the report.","FrameworkArns":"The Amazon Resource Names (ARNs) of the frameworks a report covers.","OrganizationUnits":"These are the Organizational Units to be included in the report.","Regions":"These are the Regions to be included in the report.","ReportTemplate":"Identifies the report template for the report. Reports are built using a report template. The report templates are:\\n\\n`RESOURCE_COMPLIANCE_REPORT | CONTROL_COMPLIANCE_REPORT | BACKUP_JOB_REPORT | COPY_JOB_REPORT | RESTORE_JOB_REPORT`"}},"AWS::BackupGateway::Hypervisor":{"attributes":{"HypervisorArn":"Returns `HypervisorArn` , an Amazon Resource Name (ARN) that uniquely identifies a Hypervisor. For example: `arn:aws:backup-gateway:us-east-1:123456789012:hypervisor/hype-1234D67D`","Ref":"`Ref` returns `HypervisorArn` ."},"description":"Represents the hypervisor\'s permissions to which the gateway will connect.\\n\\nA hypervisor is hardware, software, or firmware that creates and manages virtual machines, and allocates resources to them.","properties":{"Host":"The server host of the hypervisor. This can be either an IP address or a fully-qualified domain name (FQDN).","KmsKeyArn":"The Amazon Resource Name (ARN) of the AWS Key Management Service used to encrypt the hypervisor.","LogGroupArn":"The Amazon Resource Name (ARN) of the group of gateways within the requested log.","Name":"The name of the hypervisor.","Password":"The password for the hypervisor.","Tags":"The tags of the hypervisor configuration to import.","Username":"The username for the hypervisor."}},"AWS::Batch::ComputeEnvironment":{"attributes":{"ComputeEnvironmentArn":"Returns the compute environment ARN, such as `batch: *us-east-1* : *111122223333* :compute-environment/ *ComputeEnvironmentName*` .","Ref":"`Ref` returns the compute environment ARN, such as `batch: *us-east-1* : *555555555555* :compute-environment/ *M4OnDemand*` ."},"description":"The `AWS::Batch::ComputeEnvironment` resource defines your AWS Batch compute environment. You can define `MANAGED` or `UNMANAGED` compute environments. `MANAGED` compute environments can use Amazon EC2 or AWS Fargate resources. `UNMANAGED` compute environments can only use EC2 resources. For more information, see [Compute Environments](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html) in the ** .\\n\\nIn a managed compute environment, AWS Batch manages the capacity and instance types of the compute resources within the environment. This is based on the compute resource specification that you define or the [launch template](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) that you specify when you create the compute environment. You can choose either to use EC2 On-Demand Instances and EC2 Spot Instances, or to use Fargate and Fargate Spot capacity in your managed compute environment. You can optionally set a maximum price so that Spot Instances only launch when the Spot Instance price is below a specified percentage of the On-Demand price.\\n\\n> Multi-node parallel jobs are not supported on Spot Instances. \\n\\nIn an unmanaged compute environment, you can manage your own EC2 compute resources and have a lot of flexibility with how you configure your compute resources. For example, you can use custom AMI. However, you need to verify that your AMI meets the Amazon ECS container instance AMI specification. For more information, see [container instance AMIs](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/container_instance_AMIs.html) in the *Amazon Elastic Container Service Developer Guide* . After you have created your unmanaged compute environment, you can use the [DescribeComputeEnvironments](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeComputeEnvironments.html) operation to find the Amazon ECS cluster that is associated with it. Then, manually launch your container instances into that Amazon ECS cluster. For more information, see [Launching an Amazon ECS container instance](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\n> To create a compute environment that uses EKS resources, the caller must have permissions to call `eks:DescribeCluster` . > AWS Batch doesn\'t upgrade the AMIs in a compute environment after it\'s created except under specific conditions. For example, it doesn\'t automatically update the AMIs when a newer version of the Amazon ECS optimized AMI is available. Therefore, you\'re responsible for the management of the guest operating system (including updates and security patches) and any additional application software or utilities that you install on the compute resources. There are two ways to use a new AMI for your AWS Batch jobs. The original method is to complete these steps:\\n> \\n> - Create a new compute environment with the new AMI.\\n> - Add the compute environment to an existing job queue.\\n> - Remove the earlier compute environment from your job queue.\\n> - Delete the earlier compute environment.\\n> \\n> In April 2022, AWS Batch added enhanced support for updating compute environments. For example, the `UpdateComputeEnvironent` API lets you use the `ReplaceComputeEnvironment` property to dynamically update compute environment parameters such as the launch template or instance type without replacement. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .\\n> \\n> To use the enhanced updating of compute environments to update AMIs, follow these rules:\\n> \\n> - Either do not set the [ServiceRole](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-servicerole) property or set it to the *AWSServiceRoleForBatch* service-linked role.\\n> - Set the [AllocationStrategy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-allocationstrategy) property to `BEST_FIT_PROGRESSIVE` or `SPOT_CAPACITY_OPTIMIZED` .\\n> - Set the [ReplaceComputeEnvironment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-replacecomputeenvironment) property to `false` .\\n> \\n> > Set the `ReplaceComputeEnvironment` property to `false` if the compute environment uses the `BEST_FIT` allocation strategy. > If the `ReplaceComputeEnvironment` property is set to `false` , you might receive an error message when you update the CFN template for a compute environment. This issue occurs if the updated `desiredvcpus` value is less than the current `desiredvcpus` value. As a workaround, delete the `desiredvcpus` value from the updated template or use the `minvcpus` property to manage the number of vCPUs. For information, see [Error message when you update the `DesiredvCpus` setting](https://docs.aws.amazon.com/batch/latest/userguide/troubleshooting.html#error-desired-vcpus-update) .\\n> - Set the [UpdateToLatestImageVersion](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-updatetolatestimageversion) property to `true` . This property is used when you update a compute environment. The [UpdateToLatestImageVersion](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-updatetolatestimageversion) property is ignored when you create a compute environment.\\n> - Either do not specify an image ID in [ImageId](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-imageid) or [ImageIdOverride](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-ec2configurationobject.html#cfn-batch-computeenvironment-ec2configurationobject-imageidoverride) properties, or in the launch template identified by the [Launch Template](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-launchtemplate) property. In that case AWS Batch will select the latest Amazon ECS optimized AMI supported by AWS Batch at the time the infrastructure update is initiated. Alternatively you can specify the AMI ID in the `ImageId` or `ImageIdOverride` properties, or the launch template identified by the `LaunchTemplate` properties. Changing any of these properties will trigger an infrastructure update.\\n> \\n> If these rules are followed, any update that triggers an infrastructure update will cause the AMI ID to be re-selected. If the [Version](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-launchtemplatespecification.html#cfn-batch-computeenvironment-launchtemplatespecification-version) property of the [LaunchTemplateSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-launchtemplatespecification.html) is set to `$Latest` or `$Default` , the latest or default version of the launch template will be evaluated up at the time of the infrastructure update, even if the `LaunchTemplateSpecification` was not updated.","properties":{"ComputeEnvironmentName":"The name for your compute environment. It can be up to 128 characters long. It can contain uppercase and lowercase letters, numbers, hyphens (-), and underscores (_).","ComputeResources":"The ComputeResources property type specifies details of the compute resources managed by the compute environment. This parameter is required for managed compute environments. For more information, see [Compute Environments](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html) in the ** .","EksConfiguration":"The details for the Amazon EKS cluster that supports the compute environment.","ReplaceComputeEnvironment":"Specifies whether the compute environment is replaced if an update is made that requires replacing the instances in the compute environment. The default value is `true` . To enable more properties to be updated, set this property to `false` . When changing the value of this property to `false` , do not change any other properties at the same time. If other properties are changed at the same time, and the change needs to be rolled back but it can\'t, it\'s possible for the stack to go into the `UPDATE_ROLLBACK_FAILED` state. You can\'t update a stack that is in the `UPDATE_ROLLBACK_FAILED` state. However, if you can continue to roll it back, you can return the stack to its original settings and then try to update it again. For more information, see [Continue rolling back an update](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-continueupdaterollback.html) in the *AWS CloudFormation User Guide* .\\n\\nThe properties that can\'t be changed without replacing the compute environment are in the [`ComputeResources`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html) property type: [`AllocationStrategy`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-allocationstrategy) , [`BidPercentage`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-bidpercentage) , [`Ec2Configuration`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-ec2configuration) , [`Ec2KeyPair`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-ec2keypair) , [`Ec2KeyPair`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-ec2keypair) , [`ImageId`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-imageid) , [`InstanceRole`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-instancerole) , [`InstanceTypes`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-instancetypes) , [`LaunchTemplate`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-launchtemplate) , [`MaxvCpus`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-maxvcpus) , [`MinvCpus`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-minvcpus) , [`PlacementGroup`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-placementgroup) , [`SecurityGroupIds`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-securitygroupids) , [`Subnets`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-subnets) , [Tags](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-tags) , [`Type`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-type) , and [`UpdateToLatestImageVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-updatetolatestimageversion) .","ServiceRole":"The full Amazon Resource Name (ARN) of the IAM role that allows AWS Batch to make calls to other AWS services on your behalf. For more information, see [AWS Batch service IAM role](https://docs.aws.amazon.com/batch/latest/userguide/service_IAM_role.html) in the *AWS Batch User Guide* .\\n\\n> If your account already created the AWS Batch service-linked role, that role is used by default for your compute environment unless you specify a different role here. If the AWS Batch service-linked role doesn\'t exist in your account, and no role is specified here, the service attempts to create the AWS Batch service-linked role in your account. \\n\\nIf your specified role has a path other than `/` , then you must specify either the full role ARN (recommended) or prefix the role name with the path. For example, if a role with the name `bar` has a path of `/foo/` , specify `/foo/bar` as the role name. For more information, see [Friendly names and paths](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names) in the *IAM User Guide* .\\n\\n> Depending on how you created your AWS Batch service role, its ARN might contain the `service-role` path prefix. When you only specify the name of the service role, AWS Batch assumes that your ARN doesn\'t use the `service-role` path prefix. Because of this, we recommend that you specify the full ARN of your service role when you create compute environments.","State":"The state of the compute environment. If the state is `ENABLED` , then the compute environment accepts jobs from a queue and can scale out automatically based on queues.\\n\\nIf the state is `ENABLED` , then the AWS Batch scheduler can attempt to place jobs from an associated job queue on the compute resources within the environment. If the compute environment is managed, then it can scale its instances out or in automatically, based on the job queue demand.\\n\\nIf the state is `DISABLED` , then the AWS Batch scheduler doesn\'t attempt to place jobs within the environment. Jobs in a `STARTING` or `RUNNING` state continue to progress normally. Managed compute environments in the `DISABLED` state don\'t scale out.\\n\\n> Compute environments in a `DISABLED` state may continue to incur billing charges. To prevent additional charges, turn off and then delete the compute environment. For more information, see [State](https://docs.aws.amazon.com/batch/latest/userguide/compute_environment_parameters.html#compute_environment_state) in the *AWS Batch User Guide* . \\n\\nWhen an instance is idle, the instance scales down to the `minvCpus` value. However, the instance size doesn\'t change. For example, consider a `c5.8xlarge` instance with a `minvCpus` value of `4` and a `desiredvCpus` value of `36` . This instance doesn\'t scale down to a `c5.large` instance.","Tags":"The tags applied to the compute environment.","Type":"The type of the compute environment: `MANAGED` or `UNMANAGED` . For more information, see [Compute Environments](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html) in the *AWS Batch User Guide* .","UnmanagedvCpus":"The maximum number of vCPUs for an unmanaged compute environment. This parameter is only used for fair share scheduling to reserve vCPU capacity for new share identifiers. If this parameter isn\'t provided for a fair share job queue, no vCPU capacity is reserved.\\n\\n> This parameter is only supported when the `type` parameter is set to `UNMANAGED` .","UpdatePolicy":"Specifies the infrastructure update policy for the compute environment. For more information about infrastructure updates, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* ."}},"AWS::Batch::ComputeEnvironment.ComputeResources":{"attributes":{},"description":"Details about the compute resources managed by the compute environment. This parameter is required for managed compute environments. For more information, see [Compute Environments](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html) in the *AWS Batch User Guide* .","properties":{"AllocationStrategy":"The allocation strategy to use for the compute resource if not enough instances of the best fitting instance type can be allocated. This might be because of availability of the instance type in the Region or [Amazon EC2 service limits](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html) . For more information, see [Allocation strategies](https://docs.aws.amazon.com/batch/latest/userguide/allocation-strategies.html) in the *AWS Batch User Guide* .\\n\\nWhen updating a compute environment, changing the allocation strategy requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* . `BEST_FIT` is not supported when updating a compute environment.\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources, and shouldn\'t be specified. \\n\\n- **BEST_FIT (default)** - AWS Batch selects an instance type that best fits the needs of the jobs with a preference for the lowest-cost instance type. If additional instances of the selected instance type aren\'t available, AWS Batch waits for the additional instances to be available. If there aren\'t enough instances available, or if the user is reaching [Amazon EC2 service limits](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html) then additional jobs aren\'t run until the currently running jobs have completed. This allocation strategy keeps costs lower but can limit scaling. If you are using Spot Fleets with `BEST_FIT` then the Spot Fleet IAM role must be specified.\\n- **BEST_FIT_PROGRESSIVE** - AWS Batch will select additional instance types that are large enough to meet the requirements of the jobs in the queue, with a preference for instance types with a lower cost per unit vCPU. If additional instances of the previously selected instance types aren\'t available, AWS Batch will select new instance types.\\n- **SPOT_CAPACITY_OPTIMIZED** - AWS Batch will select one or more instance types that are large enough to meet the requirements of the jobs in the queue, with a preference for instance types that are less likely to be interrupted. This allocation strategy is only available for Spot Instance compute resources.\\n\\nWith both `BEST_FIT_PROGRESSIVE` and `SPOT_CAPACITY_OPTIMIZED` allocation strategies using On-Demand or Spot Instances, and the `BEST_FIT` strategy using Spot Instances, AWS Batch might need to go above `maxvCpus` to meet your capacity requirements. In this event, AWS Batch never exceeds `maxvCpus` by more than a single instance.","BidPercentage":"The maximum percentage that a Spot Instance price can be when compared with the On-Demand price for that instance type before instances are launched. For example, if your maximum percentage is 20%, the Spot price must be less than 20% of the current On-Demand price for that Amazon EC2 instance. You always pay the lowest (market) price and never more than your maximum percentage. For most use cases, we recommend leaving this field empty.\\n\\nWhen updating a compute environment, changing the bid percentage requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t specify it.","DesiredvCpus":"The desired number of vCPUS in the compute environment. AWS Batch modifies this value between the minimum and maximum values based on job queue demand.\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t specify it. > AWS Batch doesn\'t support changing the desired number of vCPUs of an existing compute environment. Don\'t specify this parameter for compute environments using Amazon EKS clusters. > When you update the `desiredvCpus` setting, the value must be between the `minvCpus` and `maxvCpus` values.\\n> \\n> Additionally, the updated `desiredvCpus` value must be greater than or equal to the current `desiredvCpus` value. For more information, see [Troubleshooting AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/troubleshooting.html#error-desired-vcpus-update) in the *AWS Batch User Guide* .","Ec2Configuration":"Provides information used to select Amazon Machine Images (AMIs) for EC2 instances in the compute environment. If `Ec2Configuration` isn\'t specified, the default is `ECS_AL2` .\\n\\nWhen updating a compute environment, changing this setting requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* . To remove the EC2 configuration and any custom AMI ID specified in `imageIdOverride` , set this value to an empty string.\\n\\nOne or two values can be provided.\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t specify it.","Ec2KeyPair":"The Amazon EC2 key pair that\'s used for instances launched in the compute environment. You can use this key pair to log in to your instances with SSH. To remove the Amazon EC2 key pair, set this value to an empty string.\\n\\nWhen updating a compute environment, changing the EC2 key pair requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t specify it.","ImageId":"The Amazon Machine Image (AMI) ID used for instances launched in the compute environment. This parameter is overridden by the `imageIdOverride` member of the `Ec2Configuration` structure. To remove the custom AMI ID and use the default AMI ID, set this value to an empty string.\\n\\nWhen updating a compute environment, changing the AMI ID requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t specify it. > The AMI that you choose for a compute environment must match the architecture of the instance types that you intend to use for that compute environment. For example, if your compute environment uses A1 instance types, the compute resource AMI that you choose must support ARM instances. Amazon ECS vends both x86 and ARM versions of the Amazon ECS-optimized Amazon Linux 2 AMI. For more information, see [Amazon ECS-optimized Amazon Linux 2 AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html#ecs-optimized-ami-linux-variants.html) in the *Amazon Elastic Container Service Developer Guide* .","InstanceRole":"The Amazon ECS instance profile applied to Amazon EC2 instances in a compute environment. You can specify the short name or full Amazon Resource Name (ARN) of an instance profile. For example, `*ecsInstanceRole*` or `arn:aws:iam:: ** :instance-profile/ *ecsInstanceRole*` . For more information, see [Amazon ECS instance role](https://docs.aws.amazon.com/batch/latest/userguide/instance_IAM_role.html) in the *AWS Batch User Guide* .\\n\\nWhen updating a compute environment, changing this setting requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t specify it.","InstanceTypes":"The instances types that can be launched. You can specify instance families to launch any instance type within those families (for example, `c5` or `p3` ), or you can specify specific sizes within a family (such as `c5.8xlarge` ). You can also choose `optimal` to select instance types (from the C4, M4, and R4 instance families) that match the demand of your job queues.\\n\\nWhen updating a compute environment, changing this setting requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t specify it. > When you create a compute environment, the instance types that you select for the compute environment must share the same architecture. For example, you can\'t mix x86 and ARM instances in the same compute environment. > Currently, `optimal` uses instance types from the C4, M4, and R4 instance families. In Regions that don\'t have instance types from those instance families, instance types from the C5, M5, and R5 instance families are used.","LaunchTemplate":"The launch template to use for your compute resources. Any other compute resource parameters that you specify in a [CreateComputeEnvironment](https://docs.aws.amazon.com/batch/latest/APIReference/API_CreateComputeEnvironment.html) API operation override the same parameters in the launch template. You must specify either the launch template ID or launch template name in the request, but not both. For more information, see [Launch Template Support](https://docs.aws.amazon.com/batch/latest/userguide/launch-templates.html) in the ** . Removing the launch template from a compute environment will not remove the AMI specified in the launch template. In order to update the AMI specified in a launch template, the `updateToLatestImageVersion` parameter must be set to `true` .\\n\\nWhen updating a compute environment, changing the launch template requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the ** .\\n\\n> This parameter isn\'t applicable to jobs running on Fargate resources, and shouldn\'t be specified.","MaxvCpus":"The maximum number of Amazon EC2 vCPUs that an environment can reach.\\n\\n> With both `BEST_FIT_PROGRESSIVE` and `SPOT_CAPACITY_OPTIMIZED` allocation strategies using On-Demand or Spot Instances, and the `BEST_FIT` strategy using Spot Instances, AWS Batch might need to exceed `maxvCpus` to meet your capacity requirements. In this event, AWS Batch never exceeds `maxvCpus` by more than a single instance. That is, no more than a single instance from among those specified in your compute environment.","MinvCpus":"The minimum number of vCPUs that an environment should maintain (even if the compute environment is `DISABLED` ).\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t specify it.","PlacementGroup":"The Amazon EC2 placement group to associate with your compute resources. If you intend to submit multi-node parallel jobs to your compute environment, you should consider creating a cluster placement group and associate it with your compute resources. This keeps your multi-node parallel job on a logical grouping of instances within a single Availability Zone with high network flow potential. For more information, see [Placement groups](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\nWhen updating a compute environment, changing the placement group requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t specify it.","SecurityGroupIds":"The Amazon EC2 security groups that are associated with instances launched in the compute environment. This parameter is required for Fargate compute resources, where it can contain up to 5 security groups. For Fargate compute resources, providing an empty list is handled as if this parameter wasn\'t specified and no change is made. For EC2 compute resources, providing an empty list removes the security groups from the compute resource.\\n\\nWhen updating a compute environment, changing the EC2 security groups requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .","SpotIamFleetRole":"The Amazon Resource Name (ARN) of the Amazon EC2 Spot Fleet IAM role applied to a `SPOT` compute environment. This role is required if the allocation strategy set to `BEST_FIT` or if the allocation strategy isn\'t specified. For more information, see [Amazon EC2 spot fleet role](https://docs.aws.amazon.com/batch/latest/userguide/spot_fleet_IAM_role.html) in the *AWS Batch User Guide* .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t specify it. > To tag your Spot Instances on creation, the Spot Fleet IAM role specified here must use the newer *AmazonEC2SpotFleetTaggingRole* managed policy. The previously recommended *AmazonEC2SpotFleetRole* managed policy doesn\'t have the required permissions to tag Spot Instances. For more information, see [Spot instances not tagged on creation](https://docs.aws.amazon.com/batch/latest/userguide/troubleshooting.html#spot-instance-no-tag) in the *AWS Batch User Guide* .","Subnets":"The VPC subnets where the compute resources are launched. Fargate compute resources can contain up to 16 subnets. For Fargate compute resources, providing an empty list will be handled as if this parameter wasn\'t specified and no change is made. For EC2 compute resources, providing an empty list removes the VPC subnets from the compute resource. For more information, see [VPCs and subnets](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html) in the *Amazon VPC User Guide* .\\n\\nWhen updating a compute environment, changing the VPC subnets requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .\\n\\n> AWS Batch on Amazon EC2 and AWS Batch on Amazon EKS support Local Zones. For more information, see [Local Zones](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-local-zones) in the *Amazon EC2 User Guide for Linux Instances* , [Amazon EKS and AWS Local Zones](https://docs.aws.amazon.com/eks/latest/userguide/local-zones.html) in the *Amazon EKS User Guide* and [Amazon ECS clusters in Local Zones, Wavelength Zones, and AWS Outposts](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-regions-zones.html#clusters-local-zones) in the *Amazon ECS Developer Guide* .\\n> \\n> AWS Batch on Fargate doesn\'t currently support Local Zones.","Tags":"Key-value pair tags to be applied to EC2 resources that are launched in the compute environment. For AWS Batch , these take the form of `\\"String1\\": \\"String2\\"` , where `String1` is the tag key and `String2` is the tag value-for example, `{ \\"Name\\": \\"Batch Instance - C4OnDemand\\" }` . This is helpful for recognizing your Batch instances in the Amazon EC2 console. These tags aren\'t seen when using the AWS Batch `ListTagsForResource` API operation.\\n\\nWhen updating a compute environment, changing this setting requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t specify it.","Type":"The type of compute environment: `EC2` , `SPOT` , `FARGATE` , or `FARGATE_SPOT` . For more information, see [Compute environments](https://docs.aws.amazon.com/batch/latest/userguide/compute_environments.html) in the *AWS Batch User Guide* .\\n\\nIf you choose `SPOT` , you must also specify an Amazon EC2 Spot Fleet role with the `spotIamFleetRole` parameter. For more information, see [Amazon EC2 spot fleet role](https://docs.aws.amazon.com/batch/latest/userguide/spot_fleet_IAM_role.html) in the *AWS Batch User Guide* .\\n\\nWhen updating compute environment, changing the type of a compute environment requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .\\n\\nWhen updating the type of a compute environment, changing between `EC2` and `SPOT` or between `FARGATE` and `FARGATE_SPOT` will initiate an infrastructure update, but if you switch between `EC2` and `FARGATE` , AWS CloudFormation will create a new compute environment.","UpdateToLatestImageVersion":"Specifies whether the AMI ID is updated to the latest one that\'s supported by AWS Batch when the compute environment has an infrastructure update. The default value is `false` .\\n\\n> An AMI ID can either be specified in the `imageId` or `imageIdOverride` parameters or be determined by the launch template that\'s specified in the `launchTemplate` parameter. If an AMI ID is specified any of these ways, this parameter is ignored. For more information about to update AMI IDs during an infrastructure update, see [Updating the AMI ID](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html#updating-compute-environments-ami) in the *AWS Batch User Guide* . \\n\\nWhen updating a compute environment, changing this setting requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* ."}},"AWS::Batch::ComputeEnvironment.Ec2ConfigurationObject":{"attributes":{},"description":"Provides information used to select Amazon Machine Images (AMIs) for instances in the compute environment. If `Ec2Configuration` isn\'t specified, the default is `ECS_AL2` ( [Amazon Linux 2](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html#al2ami) ).\\n\\n> This object isn\'t applicable to jobs that are running on Fargate resources.","properties":{"ImageIdOverride":"The AMI ID used for instances launched in the compute environment that match the image type. This setting overrides the `imageId` set in the `computeResource` object.\\n\\n> The AMI that you choose for a compute environment must match the architecture of the instance types that you intend to use for that compute environment. For example, if your compute environment uses A1 instance types, the compute resource AMI that you choose must support ARM instances. Amazon ECS vends both x86 and ARM versions of the Amazon ECS-optimized Amazon Linux 2 AMI. For more information, see [Amazon ECS-optimized Amazon Linux 2 AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html#ecs-optimized-ami-linux-variants.html) in the *Amazon Elastic Container Service Developer Guide* .","ImageKubernetesVersion":"The Kubernetes version for the compute environment. If you don\'t specify a value, the latest version that AWS Batch supports is used.","ImageType":"The image type to match with the instance type to select an AMI. The supported values are different for `ECS` and `EKS` resources.\\n\\n- **ECS** - If the `imageIdOverride` parameter isn\'t specified, then a recent [Amazon ECS-optimized Amazon Linux 2 AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html#al2ami) ( `ECS_AL2` ) is used. If a new image type is specified in an update, but neither an `imageId` nor a `imageIdOverride` parameter is specified, then the latest Amazon ECS optimized AMI for that image type that\'s supported by AWS Batch is used.\\n\\n- **ECS_AL2** - [Amazon Linux 2](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html#al2ami) : Default for all non-GPU instance families.\\n- **ECS_AL2_NVIDIA** - [Amazon Linux 2 (GPU)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html#gpuami) : Default for all GPU instance families (for example `P4` and `G4` ) and can be used for all non AWS Graviton-based instance types.\\n- **ECS_AL1** - [Amazon Linux](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html#alami) . Amazon Linux has reached the end-of-life of standard support. For more information, see [Amazon Linux AMI](https://docs.aws.amazon.com/amazon-linux-ami/) .\\n- **EKS** - If the `imageIdOverride` parameter isn\'t specified, then a recent [Amazon EKS-optimized Amazon Linux AMI](https://docs.aws.amazon.com/eks/latest/userguide/eks-optimized-ami.html) ( `EKS_AL2` ) is used. If a new image type is specified in an update, but neither an `imageId` nor a `imageIdOverride` parameter is specified, then the latest Amazon EKS optimized AMI for that image type that AWS Batch supports is used.\\n\\n- **EKS_AL2** - [Amazon Linux 2](https://docs.aws.amazon.com/eks/latest/userguide/eks-optimized-ami.html) : Default for all non-GPU instance families.\\n- **EKS_AL2_NVIDIA** - [Amazon Linux 2 (accelerated)](https://docs.aws.amazon.com/eks/latest/userguide/eks-optimized-ami.html) : Default for all GPU instance families (for example, `P4` and `G4` ) and can be used for all non AWS Graviton-based instance types."}},"AWS::Batch::ComputeEnvironment.EksConfiguration":{"attributes":{},"description":"Configuration for the Amazon EKS cluster that supports the AWS Batch compute environment. The cluster must exist before the compute environment can be created.","properties":{"EksClusterArn":"The Amazon Resource Name (ARN) of the Amazon EKS cluster. An example is `arn: *aws* :eks: *us-east-1* : *123456789012* :cluster/ *ClusterForBatch*` .","KubernetesNamespace":"The namespace of the Amazon EKS cluster. AWS Batch manages pods in this namespace. The value can\'t left empty or null. It must be fewer than 64 characters long, can\'t be set to `default` , can\'t start with \\" `kube-` ,\\" and must match this regular expression: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$` . For more information, see [Namespaces](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) in the Kubernetes documentation."}},"AWS::Batch::ComputeEnvironment.LaunchTemplateSpecification":{"attributes":{},"description":"An object that represents a launch template that\'s associated with a compute resource. You must specify either the launch template ID or launch template name in the request, but not both.\\n\\nIf security groups are specified using both the `securityGroupIds` parameter of `CreateComputeEnvironment` and the launch template, the values in the `securityGroupIds` parameter of `CreateComputeEnvironment` will be used.\\n\\n> This object isn\'t applicable to jobs that are running on Fargate resources.","properties":{"LaunchTemplateId":"The ID of the launch template.","LaunchTemplateName":"The name of the launch template.","Version":"The version number of the launch template, `$Latest` , or `$Default` .\\n\\nIf the value is `$Latest` , the latest version of the launch template is used. If the value is `$Default` , the default version of the launch template is used.\\n\\n> If the AMI ID that\'s used in a compute environment is from the launch template, the AMI isn\'t changed when the compute environment is updated. It\'s only changed if the `updateToLatestImageVersion` parameter for the compute environment is set to `true` . During an infrastructure update, if either `$Latest` or `$Default` is specified, AWS Batch re-evaluates the launch template version, and it might use a different version of the launch template. This is the case even if the launch template isn\'t specified in the update. When updating a compute environment, changing the launch template requires an infrastructure update of the compute environment. For more information, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* . \\n\\nDefault: `$Default` ."}},"AWS::Batch::ComputeEnvironment.UpdatePolicy":{"attributes":{},"description":"Specifies the infrastructure update policy for the compute environment. For more information about infrastructure updates, see [Updating compute environments](https://docs.aws.amazon.com/batch/latest/userguide/updating-compute-environments.html) in the *AWS Batch User Guide* .","properties":{"JobExecutionTimeoutMinutes":"Specifies the job timeout (in minutes) when the compute environment infrastructure is updated. The default value is 30.","TerminateJobsOnUpdate":"Specifies whether jobs are automatically terminated when the computer environment infrastructure is updated. The default value is `false` ."}},"AWS::Batch::JobDefinition":{"attributes":{"Ref":"`Ref` returns the job definition ARN, such as `batch: *us-east-1* : *111122223333* :job-definition/ *test-gpu* : *2*` ."},"description":"The `AWS::Batch::JobDefinition` resource specifies the parameters for an AWS Batch job definition. For more information, see [Job Definitions](https://docs.aws.amazon.com/batch/latest/userguide/job_definitions.html) in the ** .","properties":{"ContainerProperties":"An object with various properties specific to Amazon ECS based jobs. Valid values are `containerProperties` , `eksProperties` , and `nodeProperties` . Only one can be specified.","EksProperties":"An object with various properties that are specific to Amazon EKS based jobs. Valid values are `containerProperties` , `eksProperties` , and `nodeProperties` . Only one can be specified.","JobDefinitionName":"The name of the job definition.","NodeProperties":"An object with various properties that are specific to multi-node parallel jobs. Valid values are `containerProperties` , `eksProperties` , and `nodeProperties` . Only one can be specified.\\n\\n> If the job runs on Fargate resources, don\'t specify `nodeProperties` . Use `containerProperties` instead.","Parameters":"Default parameters or parameter substitution placeholders that are set in the job definition. Parameters are specified as a key-value pair mapping. Parameters in a `SubmitJob` request override any corresponding parameter defaults from the job definition. For more information about specifying parameters, see [Job definition parameters](https://docs.aws.amazon.com/batch/latest/userguide/job_definition_parameters.html) in the *AWS Batch User Guide* .","PlatformCapabilities":"The platform capabilities required by the job definition. If no value is specified, it defaults to `EC2` . Jobs run on Fargate resources specify `FARGATE` .","PropagateTags":"Specifies whether to propagate the tags from the job or job definition to the corresponding Amazon ECS task. If no value is specified, the tags aren\'t propagated. Tags can only be propagated to the tasks when the tasks are created. For tags with the same name, job tags are given priority over job definitions tags. If the total number of combined tags from the job and job definition is over 50, the job is moved to the `FAILED` state.","RetryStrategy":"The retry strategy to use for failed jobs that are submitted with this job definition.","SchedulingPriority":"The scheduling priority of the job definition. This only affects jobs in job queues with a fair share policy. Jobs with a higher scheduling priority are scheduled before jobs with a lower scheduling priority.","Tags":"The tags that are applied to the job definition.","Timeout":"The timeout time for jobs that are submitted with this job definition. After the amount of time you specify passes, AWS Batch terminates your jobs if they aren\'t finished.","Type":"The type of job definition. For more information about multi-node parallel jobs, see [Creating a multi-node parallel job definition](https://docs.aws.amazon.com/batch/latest/userguide/multi-node-job-def.html) in the *AWS Batch User Guide* .\\n\\n> If the job is run on Fargate resources, then `multinode` isn\'t supported."}},"AWS::Batch::JobDefinition.AuthorizationConfig":{"attributes":{},"description":"The authorization configuration details for the Amazon EFS file system.","properties":{"AccessPointId":"The Amazon EFS access point ID to use. If an access point is specified, the root directory value specified in the `EFSVolumeConfiguration` must either be omitted or set to `/` which enforces the path set on the EFS access point. If an access point is used, transit encryption must be enabled in the `EFSVolumeConfiguration` . For more information, see [Working with Amazon EFS access points](https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html) in the *Amazon Elastic File System User Guide* .","Iam":"Whether or not to use the AWS Batch job IAM role defined in a job definition when mounting the Amazon EFS file system. If enabled, transit encryption must be enabled in the `EFSVolumeConfiguration` . If this parameter is omitted, the default value of `DISABLED` is used. For more information, see [Using Amazon EFS access points](https://docs.aws.amazon.com/batch/latest/userguide/efs-volumes.html#efs-volume-accesspoints) in the *AWS Batch User Guide* . EFS IAM authorization requires that `TransitEncryption` be `ENABLED` and that a `JobRoleArn` is specified."}},"AWS::Batch::JobDefinition.ContainerProperties":{"attributes":{},"description":"Container properties are used for Amazon ECS based job definitions. These properties to describe the container that\'s launched as part of a job.","properties":{"Command":"The command that\'s passed to the container. This parameter maps to `Cmd` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `COMMAND` parameter to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . For more information, see [https://docs.docker.com/engine/reference/builder/#cmd](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/builder/#cmd) .","Environment":"The environment variables to pass to a container. This parameter maps to `Env` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--env` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .\\n\\n> We don\'t recommend using plaintext environment variables for sensitive information, such as credential data. > Environment variables cannot start with \\" `AWS_BATCH` \\". This naming convention is reserved for variables that AWS Batch sets.","EphemeralStorage":"The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on AWS Fargate .","ExecutionRoleArn":"The Amazon Resource Name (ARN) of the execution role that AWS Batch can assume. For jobs that run on Fargate resources, you must provide an execution role. For more information, see [AWS Batch execution IAM role](https://docs.aws.amazon.com/batch/latest/userguide/execution-IAM-role.html) in the *AWS Batch User Guide* .","FargatePlatformConfiguration":"The platform configuration for jobs that are running on Fargate resources. Jobs that are running on EC2 resources must not specify this parameter.","Image":"The image used to start a container. This string is passed directly to the Docker daemon. Images in the Docker Hub registry are available by default. Other repositories are specified with `*repository-url* / *image* : *tag*` . It can be 255 characters long. It can contain uppercase and lowercase letters, numbers, hyphens (-), underscores (_), colons (:), periods (.), forward slashes (/), and number signs (#). This parameter maps to `Image` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `IMAGE` parameter of [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .\\n\\n> Docker image architecture must match the processor architecture of the compute resources that they\'re scheduled on. For example, ARM-based Docker images can only run on ARM-based compute resources. \\n\\n- Images in Amazon ECR Public repositories use the full `registry/repository[:tag]` or `registry/repository[@digest]` naming conventions. For example, `public.ecr.aws/ *registry_alias* / *my-web-app* : *latest*` .\\n- Images in Amazon ECR repositories use the full registry and repository URI (for example, `123456789012.dkr.ecr..amazonaws.com/` ).\\n- Images in official repositories on Docker Hub use a single name (for example, `ubuntu` or `mongo` ).\\n- Images in other repositories on Docker Hub are qualified with an organization name (for example, `amazon/amazon-ecs-agent` ).\\n- Images in other online repositories are qualified further by a domain name (for example, `quay.io/assemblyline/ubuntu` ).","InstanceType":"The instance type to use for a multi-node parallel job. All node groups in a multi-node parallel job must use the same instance type.\\n\\n> This parameter isn\'t applicable to single-node container jobs or jobs that run on Fargate resources, and shouldn\'t be provided.","JobRoleArn":"The Amazon Resource Name (ARN) of the IAM role that the container can assume for AWS permissions. For more information, see [IAM roles for tasks](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) in the *Amazon Elastic Container Service Developer Guide* .","LinuxParameters":"Linux-specific modifications that are applied to the container, such as details for device mappings.","LogConfiguration":"The log configuration specification for the container.\\n\\nThis parameter maps to `LogConfig` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--log-driver` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . By default, containers use the same logging driver that the Docker daemon uses. However the container might use a different logging driver than the Docker daemon by specifying a log driver with this parameter in the container definition. To use a different logging driver for a container, the log system must be configured properly on the container instance (or on a different log server for remote logging options). For more information on the options for different supported log drivers, see [Configure logging drivers](https://docs.aws.amazon.com/https://docs.docker.com/engine/admin/logging/overview/) in the Docker documentation.\\n\\n> AWS Batch currently supports a subset of the logging drivers available to the Docker daemon (shown in the `LogConfiguration` data type). \\n\\nThis parameter requires version 1.18 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: `sudo docker version | grep \\"Server API version\\"`\\n\\n> The Amazon ECS container agent running on a container instance must register the logging drivers available on that instance with the `ECS_AVAILABLE_LOGGING_DRIVERS` environment variable before containers placed on that instance can use these log configuration options. For more information, see [Amazon ECS container agent configuration](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html) in the *Amazon Elastic Container Service Developer Guide* .","Memory":"This parameter is deprecated, use `resourceRequirements` to specify the memory requirements for the job definition. It\'s not supported for jobs running on Fargate resources. For jobs that run on EC2 resources, it specifies the memory hard limit (in MiB) for a container. If your container attempts to exceed the specified number, it\'s terminated. You must specify at least 4 MiB of memory for a job using this parameter. The memory hard limit can be specified in several places. It must be specified for each node at least once.","MountPoints":"The mount points for data volumes in your container. This parameter maps to `Volumes` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--volume` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .","NetworkConfiguration":"The network configuration for jobs that are running on Fargate resources. Jobs that are running on EC2 resources must not specify this parameter.","Privileged":"When this parameter is true, the container is given elevated permissions on the host container instance (similar to the `root` user). This parameter maps to `Privileged` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--privileged` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . The default value is false.\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources and shouldn\'t be provided, or specified as false.","ReadonlyRootFilesystem":"When this parameter is true, the container is given read-only access to its root file system. This parameter maps to `ReadonlyRootfs` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--read-only` option to `docker run` .","ResourceRequirements":"The type and amount of resources to assign to a container. The supported resources include `GPU` , `MEMORY` , and `VCPU` .","Secrets":"The secrets for the container. For more information, see [Specifying sensitive data](https://docs.aws.amazon.com/batch/latest/userguide/specifying-sensitive-data.html) in the *AWS Batch User Guide* .","Ulimits":"A list of `ulimits` to set in the container. This parameter maps to `Ulimits` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--ulimit` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources and shouldn\'t be provided.","User":"The user name to use inside the container. This parameter maps to `User` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--user` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .","Vcpus":"This parameter is deprecated, use `resourceRequirements` to specify the vCPU requirements for the job definition. It\'s not supported for jobs running on Fargate resources. For jobs running on EC2 resources, it specifies the number of vCPUs reserved for the job.\\n\\nEach vCPU is equivalent to 1,024 CPU shares. This parameter maps to `CpuShares` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--cpu-shares` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . The number of vCPUs must be specified but can be specified in several places. You must specify it at least once for each node.","Volumes":"A list of data volumes used in a job."}},"AWS::Batch::JobDefinition.Device":{"attributes":{},"description":"An object that represents a container instance host device.\\n\\n> This object isn\'t applicable to jobs that are running on Fargate resources and shouldn\'t be provided.","properties":{"ContainerPath":"The path inside the container that\'s used to expose the host device. By default, the `hostPath` value is used.","HostPath":"The path for the device on the host container instance.","Permissions":"The explicit permissions to provide to the container for the device. By default, the container has permissions for `read` , `write` , and `mknod` for the device."}},"AWS::Batch::JobDefinition.EfsVolumeConfiguration":{"attributes":{},"description":"This is used when you\'re using an Amazon Elastic File System file system for job storage. For more information, see [Amazon EFS Volumes](https://docs.aws.amazon.com/batch/latest/userguide/efs-volumes.html) in the *AWS Batch User Guide* .","properties":{"AuthorizationConfig":"The authorization configuration details for the Amazon EFS file system.","FileSystemId":"The Amazon EFS file system ID to use.","RootDirectory":"The directory within the Amazon EFS file system to mount as the root directory inside the host. If this parameter is omitted, the root of the Amazon EFS volume is used instead. Specifying `/` has the same effect as omitting this parameter. The maximum length is 4,096 characters.\\n\\n> If an EFS access point is specified in the `authorizationConfig` , the root directory parameter must either be omitted or set to `/` , which enforces the path set on the Amazon EFS access point.","TransitEncryption":"Determines whether to enable encryption for Amazon EFS data in transit between the Amazon ECS host and the Amazon EFS server. Transit encryption must be enabled if Amazon EFS IAM authorization is used. If this parameter is omitted, the default value of `DISABLED` is used. For more information, see [Encrypting data in transit](https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html) in the *Amazon Elastic File System User Guide* .","TransitEncryptionPort":"The port to use when sending encrypted data between the Amazon ECS host and the Amazon EFS server. If you don\'t specify a transit encryption port, it uses the port selection strategy that the Amazon EFS mount helper uses. The value must be between 0 and 65,535. For more information, see [EFS mount helper](https://docs.aws.amazon.com/efs/latest/ug/efs-mount-helper.html) in the *Amazon Elastic File System User Guide* ."}},"AWS::Batch::JobDefinition.EksContainer":{"attributes":{},"description":"EKS container properties are used in job definitions for Amazon EKS based job definitions to describe the properties for a container node in the pod that\'s launched as part of a job. This can\'t be specified for Amazon ECS based job definitions.","properties":{"Args":"An array of arguments to the entrypoint. If this isn\'t specified, the `CMD` of the container image is used. This corresponds to the `args` member in the [Entrypoint](https://docs.aws.amazon.com/https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#entrypoint) portion of the [Pod](https://docs.aws.amazon.com/https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/) in Kubernetes. Environment variable references are expanded using the container\'s environment.\\n\\nIf the referenced environment variable doesn\'t exist, the reference in the command isn\'t changed. For example, if the reference is to \\" `$(NAME1)` \\" and the `NAME1` environment variable doesn\'t exist, the command string will remain \\" `$(NAME1)` .\\" `$$` is replaced with `$` , and the resulting string isn\'t expanded. For example, `$$(VAR_NAME)` is passed as `$(VAR_NAME)` whether or not the `VAR_NAME` environment variable exists. For more information, see [CMD](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/builder/#cmd) in the *Dockerfile reference* and [Define a command and arguments for a pod](https://docs.aws.amazon.com/https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/) in the *Kubernetes documentation* .","Command":"The entrypoint for the container. This isn\'t run within a shell. If this isn\'t specified, the `ENTRYPOINT` of the container image is used. Environment variable references are expanded using the container\'s environment.\\n\\nIf the referenced environment variable doesn\'t exist, the reference in the command isn\'t changed. For example, if the reference is to \\" `$(NAME1)` \\" and the `NAME1` environment variable doesn\'t exist, the command string will remain \\" `$(NAME1)` .\\" `$$` is replaced with `$` and the resulting string isn\'t expanded. For example, `$$(VAR_NAME)` will be passed as `$(VAR_NAME)` whether or not the `VAR_NAME` environment variable exists. The entrypoint can\'t be updated. For more information, see [ENTRYPOINT](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/builder/#entrypoint) in the *Dockerfile reference* and [Define a command and arguments for a container](https://docs.aws.amazon.com/https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/) and [Entrypoint](https://docs.aws.amazon.com/https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#entrypoint) in the *Kubernetes documentation* .","Env":"The environment variables to pass to a container.\\n\\n> Environment variables cannot start with \\" `AWS_BATCH` \\". This naming convention is reserved for variables that AWS Batch sets.","Image":"The Docker image used to start the container.","ImagePullPolicy":"The image pull policy for the container. Supported values are `Always` , `IfNotPresent` , and `Never` . This parameter defaults to `IfNotPresent` . However, if the `:latest` tag is specified, it defaults to `Always` . For more information, see [Updating images](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/containers/images/#updating-images) in the *Kubernetes documentation* .","Name":"The name of the container. If the name isn\'t specified, the default name \\" `Default` \\" is used. Each container in a pod must have a unique name.","Resources":"The type and amount of resources to assign to a container. The supported resources include `memory` , `cpu` , and `nvidia.com/gpu` . For more information, see [Resource management for pods and containers](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/) in the *Kubernetes documentation* .","SecurityContext":"","VolumeMounts":"The volume mounts for the container. AWS Batch supports `emptyDir` , `hostPath` , and `secret` volume types. For more information about volumes and volume mounts in Kubernetes, see [Volumes](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/storage/volumes/) in the *Kubernetes documentation* ."}},"AWS::Batch::JobDefinition.EksContainerEnvironmentVariable":{"attributes":{},"description":"An environment variable.","properties":{"Name":"The name of the environment variable.","Value":"The value of the environment variable."}},"AWS::Batch::JobDefinition.EksContainerResourceRequirements":{"attributes":{},"description":"The type and amount of resources to assign to a container. The supported resources include `memory` , `cpu` , and `nvidia.com/gpu` . For more information, see [Resource management for pods and containers](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/) in the *Kubernetes documentation* .","properties":{"Limits":"The type and quantity of the resources to reserve for the container. The values vary based on the `name` that\'s specified. Resources can be requested using either the `limits` or the `requests` objects.\\n\\n- **memory** - The memory hard limit (in MiB) for the container, using whole integers, with a \\"Mi\\" suffix. If your container attempts to exceed the memory specified, the container is terminated. You must specify at least 4 MiB of memory for a job. `memory` can be specified in `limits` , `requests` , or both. If `memory` is specified in both places, then the value that\'s specified in `limits` must be equal to the value that\'s specified in `requests` .\\n\\n> To maximize your resource utilization, provide your jobs with as much memory as possible for the specific instance type that you are using. To learn how, see [Memory management](https://docs.aws.amazon.com/batch/latest/userguide/memory-management.html) in the *AWS Batch User Guide* .\\n- **cpu** - The number of CPUs that\'s reserved for the container. Values must be an even multiple of `0.25` . `cpu` can be specified in `limits` , `requests` , or both. If `cpu` is specified in both places, then the value that\'s specified in `limits` must be at least as large as the value that\'s specified in `requests` .\\n- **nvidia.com/gpu** - The number of GPUs that\'s reserved for the container. Values must be a whole integer. `memory` can be specified in `limits` , `requests` , or both. If `memory` is specified in both places, then the value that\'s specified in `limits` must be equal to the value that\'s specified in `requests` .","Requests":"The type and quantity of the resources to request for the container. The values vary based on the `name` that\'s specified. Resources can be requested by using either the `limits` or the `requests` objects.\\n\\n- **memory** - The memory hard limit (in MiB) for the container, using whole integers, with a \\"Mi\\" suffix. If your container attempts to exceed the memory specified, the container is terminated. You must specify at least 4 MiB of memory for a job. `memory` can be specified in `limits` , `requests` , or both. If `memory` is specified in both, then the value that\'s specified in `limits` must be equal to the value that\'s specified in `requests` .\\n\\n> If you\'re trying to maximize your resource utilization by providing your jobs as much memory as possible for a particular instance type, see [Memory management](https://docs.aws.amazon.com/batch/latest/userguide/memory-management.html) in the *AWS Batch User Guide* .\\n- **cpu** - The number of CPUs that are reserved for the container. Values must be an even multiple of `0.25` . `cpu` can be specified in `limits` , `requests` , or both. If `cpu` is specified in both, then the value that\'s specified in `limits` must be at least as large as the value that\'s specified in `requests` .\\n- **nvidia.com/gpu** - The number of GPUs that are reserved for the container. Values must be a whole integer. `nvidia.com/gpu` can be specified in `limits` , `requests` , or both. If `nvidia.com/gpu` is specified in both, then the value that\'s specified in `limits` must be equal to the value that\'s specified in `requests` ."}},"AWS::Batch::JobDefinition.EksContainerSecurityContext":{"attributes":{},"description":"The security context for a job. For more information, see [Configure a security context for a pod or container](https://docs.aws.amazon.com/https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) in the *Kubernetes documentation* .","properties":{"Privileged":"When this parameter is `true` , the container is given elevated permissions on the host container instance. The level of permissions are similar to the `root` user permissions. The default value is `false` . This parameter maps to `privileged` policy in the [Privileged pod security policies](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/security/pod-security-policy/#privileged) in the *Kubernetes documentation* .","ReadOnlyRootFilesystem":"When this parameter is `true` , the container is given read-only access to its root file system. The default value is `false` . This parameter maps to `ReadOnlyRootFilesystem` policy in the [Volumes and file systems pod security policies](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/security/pod-security-policy/#volumes-and-file-systems) in the *Kubernetes documentation* .","RunAsGroup":"When this parameter is specified, the container is run as the specified group ID ( `gid` ). If this parameter isn\'t specified, the default is the group that\'s specified in the image metadata. This parameter maps to `RunAsGroup` and `MustRunAs` policy in the [Users and groups pod security policies](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/security/pod-security-policy/#users-and-groups) in the *Kubernetes documentation* .","RunAsNonRoot":"When this parameter is specified, the container is run as a user with a `uid` other than 0. If this parameter isn\'t specified, so such rule is enforced. This parameter maps to `RunAsUser` and `MustRunAsNonRoot` policy in the [Users and groups pod security policies](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/security/pod-security-policy/#users-and-groups) in the *Kubernetes documentation* .","RunAsUser":"When this parameter is specified, the container is run as the specified user ID ( `uid` ). If this parameter isn\'t specified, the default is the user that\'s specified in the image metadata. This parameter maps to `RunAsUser` and `MustRanAs` policy in the [Users and groups pod security policies](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/security/pod-security-policy/#users-and-groups) in the *Kubernetes documentation* ."}},"AWS::Batch::JobDefinition.EksContainerVolumeMount":{"attributes":{},"description":"The volume mounts for a container for an Amazon EKS job. For more information about volumes and volume mounts in Kubernetes, see [Volumes](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/storage/volumes/) in the *Kubernetes documentation* .","properties":{"MountPath":"The path on the container where the volume is mounted.","Name":"The name the volume mount. This must match the name of one of the volumes in the pod.","ReadOnly":"If this value is `true` , the container has read-only access to the volume. Otherwise, the container can write to the volume. The default value is `false` ."}},"AWS::Batch::JobDefinition.EksEmptyDir":{"attributes":{},"description":"Specifies the configuration of a Kubernetes `emptyDir` volume. An `emptyDir` volume is first created when a pod is assigned to a node. It exists as long as that pod is running on that node. The `emptyDir` volume is initially empty. All containers in the pod can read and write the files in the `emptyDir` volume. However, the `emptyDir` volume can be mounted at the same or different paths in each container. When a pod is removed from a node for any reason, the data in the `emptyDir` is deleted permanently. For more information, see [emptyDir](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) in the *Kubernetes documentation* .","properties":{"Medium":"The medium to store the volume. The default value is an empty string, which uses the storage of the node.\\n\\n- **\\"\\"** - *(Default)* Use the disk storage of the node.\\n- **\\"Memory\\"** - Use the `tmpfs` volume that\'s backed by the RAM of the node. Contents of the volume are lost when the node reboots, and any storage on the volume counts against the container\'s memory limit.","SizeLimit":"The maximum size of the volume. By default, there\'s no maximum size defined."}},"AWS::Batch::JobDefinition.EksHostPath":{"attributes":{},"description":"Specifies the configuration of a Kubernetes `hostPath` volume. A `hostPath` volume mounts an existing file or directory from the host node\'s filesystem into your pod. For more information, see [hostPath](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/storage/volumes/#hostpath) in the *Kubernetes documentation* .","properties":{"Path":"The path of the file or directory on the host to mount into containers on the pod."}},"AWS::Batch::JobDefinition.EksProperties":{"attributes":{},"description":"An object that contains the properties for the Kubernetes resources of a job.","properties":{"PodProperties":"The properties for the Kubernetes pod resources of a job."}},"AWS::Batch::JobDefinition.EksSecret":{"attributes":{},"description":"Specifies the configuration of a Kubernetes `secret` volume. For more information, see [secret](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/storage/volumes/#secret) in the *Kubernetes documentation* .","properties":{"Optional":"Specifies whether the secret or the secret\'s keys must be defined.","SecretName":"The name of the secret. The name must be allowed as a DNS subdomain name. For more information, see [DNS subdomain names](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names) in the *Kubernetes documentation* ."}},"AWS::Batch::JobDefinition.EksVolume":{"attributes":{},"description":"Specifies an Amazon EKS volume for a job definition.","properties":{"EmptyDir":"Specifies the configuration of a Kubernetes `emptyDir` volume. For more information, see [emptyDir](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/storage/volumes/#emptydir) in the *Kubernetes documentation* .","HostPath":"Specifies the configuration of a Kubernetes `hostPath` volume. For more information, see [hostPath](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/storage/volumes/#hostpath) in the *Kubernetes documentation* .","Name":"The name of the volume. The name must be allowed as a DNS subdomain name. For more information, see [DNS subdomain names](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names) in the *Kubernetes documentation* .","Secret":"Specifies the configuration of a Kubernetes `secret` volume. For more information, see [secret](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/storage/volumes/#secret) in the *Kubernetes documentation* ."}},"AWS::Batch::JobDefinition.Environment":{"attributes":{},"description":"The Environment property type specifies environment variables to use in a job definition.","properties":{"Name":"The name of the environment variable.","Value":"The value of the environment variable."}},"AWS::Batch::JobDefinition.EphemeralStorage":{"attributes":{},"description":"The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on AWS Fargate .","properties":{"SizeInGiB":"The total amount, in GiB, of ephemeral storage to set for the task. The minimum supported value is `21` GiB and the maximum supported value is `200` GiB."}},"AWS::Batch::JobDefinition.EvaluateOnExit":{"attributes":{},"description":"Specifies an array of up to 5 conditions to be met, and an action to take ( `RETRY` or `EXIT` ) if all conditions are met. If none of the `EvaluateOnExit` conditions in a `RetryStrategy` match, then the job is retried.","properties":{"Action":"Specifies the action to take if all of the specified conditions ( `onStatusReason` , `onReason` , and `onExitCode` ) are met. The values aren\'t case sensitive.","OnExitCode":"Contains a glob pattern to match against the decimal representation of the `ExitCode` returned for a job. The pattern can be up to 512 characters long. It can contain only numbers, and can end with an asterisk (*) so that only the start of the string needs to be an exact match.\\n\\nThe string can contain up to 512 characters.","OnReason":"Contains a glob pattern to match against the `Reason` returned for a job. The pattern can contain up to 512 characters. It can contain letters, numbers, periods (.), colons (:), and white space (including spaces and tabs). It can optionally end with an asterisk (*) so that only the start of the string needs to be an exact match.","OnStatusReason":"Contains a glob pattern to match against the `StatusReason` returned for a job. The pattern can contain up to 512 characters. It can contain letters, numbers, periods (.), colons (:), and white spaces (including spaces or tabs). It can optionally end with an asterisk (*) so that only the start of the string needs to be an exact match."}},"AWS::Batch::JobDefinition.FargatePlatformConfiguration":{"attributes":{},"description":"The platform configuration for jobs that are running on Fargate resources. Jobs that run on EC2 resources must not specify this parameter.","properties":{"PlatformVersion":"The AWS Fargate platform version where the jobs are running. A platform version is specified only for jobs that are running on Fargate resources. If one isn\'t specified, the `LATEST` platform version is used by default. This uses a recent, approved version of the AWS Fargate platform for compute resources. For more information, see [AWS Fargate platform versions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html) in the *Amazon Elastic Container Service Developer Guide* ."}},"AWS::Batch::JobDefinition.LinuxParameters":{"attributes":{},"description":"Linux-specific modifications that are applied to the container, such as details for device mappings.","properties":{"Devices":"Any of the host devices to expose to the container. This parameter maps to `Devices` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--device` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t provide it for these jobs.","InitProcessEnabled":"If true, run an `init` process inside the container that forwards signals and reaps processes. This parameter maps to the `--init` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . This parameter requires version 1.25 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: `sudo docker version | grep \\"Server API version\\"`","MaxSwap":"The total amount of swap memory (in MiB) a container can use. This parameter is translated to the `--memory-swap` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) where the value is the sum of the container memory plus the `maxSwap` value. For more information, see [`--memory-swap` details](https://docs.aws.amazon.com/https://docs.docker.com/config/containers/resource_constraints/#--memory-swap-details) in the Docker documentation.\\n\\nIf a `maxSwap` value of `0` is specified, the container doesn\'t use swap. Accepted values are `0` or any positive integer. If the `maxSwap` parameter is omitted, the container doesn\'t use the swap configuration for the container instance that it\'s running on. A `maxSwap` value must be set for the `swappiness` parameter to be used.\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t provide it for these jobs.","SharedMemorySize":"The value for the size (in MiB) of the `/dev/shm` volume. This parameter maps to the `--shm-size` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t provide it for these jobs.","Swappiness":"You can use this parameter to tune a container\'s memory swappiness behavior. A `swappiness` value of `0` causes swapping to not occur unless absolutely necessary. A `swappiness` value of `100` causes pages to be swapped aggressively. Valid values are whole numbers between `0` and `100` . If the `swappiness` parameter isn\'t specified, a default value of `60` is used. If a value isn\'t specified for `maxSwap` , then this parameter is ignored. If `maxSwap` is set to 0, the container doesn\'t use swap. This parameter maps to the `--memory-swappiness` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .\\n\\nConsider the following when you use a per-container swap configuration.\\n\\n- Swap space must be enabled and allocated on the container instance for the containers to use.\\n\\n> By default, the Amazon ECS optimized AMIs don\'t have swap enabled. You must enable swap on the instance to use this feature. For more information, see [Instance store swap volumes](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-store-swap-volumes.html) in the *Amazon EC2 User Guide for Linux Instances* or [How do I allocate memory to work as swap space in an Amazon EC2 instance by using a swap file?](https://docs.aws.amazon.com/premiumsupport/knowledge-center/ec2-memory-swap-file/)\\n- The swap space parameters are only supported for job definitions using EC2 resources.\\n- If the `maxSwap` and `swappiness` parameters are omitted from a job definition, each container has a default `swappiness` value of 60. Moreover, the total swap usage is limited to two times the memory reservation of the container.\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t provide it for these jobs.","Tmpfs":"The container path, mount options, and size (in MiB) of the `tmpfs` mount. This parameter maps to the `--tmpfs` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources. Don\'t provide this parameter for this resource type."}},"AWS::Batch::JobDefinition.LogConfiguration":{"attributes":{},"description":"Log configuration options to send to a custom log driver for the container.","properties":{"LogDriver":"The log driver to use for the container. The valid values that are listed for this parameter are log drivers that the Amazon ECS container agent can communicate with by default.\\n\\nThe supported log drivers are `awslogs` , `fluentd` , `gelf` , `json-file` , `journald` , `logentries` , `syslog` , and `splunk` .\\n\\n> Jobs that are running on Fargate resources are restricted to the `awslogs` and `splunk` log drivers. \\n\\n- **awslogs** - Specifies the Amazon CloudWatch Logs logging driver. For more information, see [Using the awslogs log driver](https://docs.aws.amazon.com/batch/latest/userguide/using_awslogs.html) in the *AWS Batch User Guide* and [Amazon CloudWatch Logs logging driver](https://docs.aws.amazon.com/https://docs.docker.com/config/containers/logging/awslogs/) in the Docker documentation.\\n- **fluentd** - Specifies the Fluentd logging driver. For more information including usage and options, see [Fluentd logging driver](https://docs.aws.amazon.com/https://docs.docker.com/config/containers/logging/fluentd/) in the *Docker documentation* .\\n- **gelf** - Specifies the Graylog Extended Format (GELF) logging driver. For more information including usage and options, see [Graylog Extended Format logging driver](https://docs.aws.amazon.com/https://docs.docker.com/config/containers/logging/gelf/) in the *Docker documentation* .\\n- **journald** - Specifies the journald logging driver. For more information including usage and options, see [Journald logging driver](https://docs.aws.amazon.com/https://docs.docker.com/config/containers/logging/journald/) in the *Docker documentation* .\\n- **json-file** - Specifies the JSON file logging driver. For more information including usage and options, see [JSON File logging driver](https://docs.aws.amazon.com/https://docs.docker.com/config/containers/logging/json-file/) in the *Docker documentation* .\\n- **splunk** - Specifies the Splunk logging driver. For more information including usage and options, see [Splunk logging driver](https://docs.aws.amazon.com/https://docs.docker.com/config/containers/logging/splunk/) in the *Docker documentation* .\\n- **syslog** - Specifies the syslog logging driver. For more information including usage and options, see [Syslog logging driver](https://docs.aws.amazon.com/https://docs.docker.com/config/containers/logging/syslog/) in the *Docker documentation* .\\n\\n> If you have a custom driver that\'s not listed earlier that you want to work with the Amazon ECS container agent, you can fork the Amazon ECS container agent project that\'s [available on GitHub](https://docs.aws.amazon.com/https://github.com/aws/amazon-ecs-agent) and customize it to work with that driver. We encourage you to submit pull requests for changes that you want to have included. However, Amazon Web Services doesn\'t currently support running modified copies of this software. \\n\\nThis parameter requires version 1.18 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: `sudo docker version | grep \\"Server API version\\"`","Options":"The configuration options to send to the log driver. This parameter requires version 1.19 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: `sudo docker version | grep \\"Server API version\\"`","SecretOptions":"The secrets to pass to the log configuration. For more information, see [Specifying sensitive data](https://docs.aws.amazon.com/batch/latest/userguide/specifying-sensitive-data.html) in the *AWS Batch User Guide* ."}},"AWS::Batch::JobDefinition.Metadata":{"attributes":{},"description":"","properties":{"Labels":""}},"AWS::Batch::JobDefinition.MountPoints":{"attributes":{},"description":"Details for a Docker volume mount point that\'s used in a job\'s container properties. This parameter maps to `Volumes` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/api/docker_remote_api_v1.19/#create-a-container) section of the *Docker Remote API* and the `--volume` option to docker run.","properties":{"ContainerPath":"The path on the container where the host volume is mounted.","ReadOnly":"If this value is `true` , the container has read-only access to the volume. Otherwise, the container can write to the volume. The default value is `false` .","SourceVolume":"The name of the volume to mount."}},"AWS::Batch::JobDefinition.NetworkConfiguration":{"attributes":{},"description":"The network configuration for jobs that are running on Fargate resources. Jobs that are running on EC2 resources must not specify this parameter.","properties":{"AssignPublicIp":"Indicates whether the job has a public IP address. For a job that\'s running on Fargate resources in a private subnet to send outbound traffic to the internet (for example, to pull container images), the private subnet requires a NAT gateway be attached to route requests to the internet. For more information, see [Amazon ECS task networking](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html) in the *Amazon Elastic Container Service Developer Guide* . The default value is \\" `DISABLED` \\"."}},"AWS::Batch::JobDefinition.NodeProperties":{"attributes":{},"description":"An object that represents the node properties of a multi-node parallel job.\\n\\n> Node properties can\'t be specified for Amazon EKS based job definitions.","properties":{"MainNode":"Specifies the node index for the main node of a multi-node parallel job. This node index value must be fewer than the number of nodes.","NodeRangeProperties":"A list of node ranges and their properties that are associated with a multi-node parallel job.","NumNodes":"The number of nodes that are associated with a multi-node parallel job."}},"AWS::Batch::JobDefinition.NodeRangeProperty":{"attributes":{},"description":"An object that represents the properties of the node range for a multi-node parallel job.","properties":{"Container":"The container details for the node range.","TargetNodes":"The range of nodes, using node index values. A range of `0:3` indicates nodes with index values of `0` through `3` . If the starting range value is omitted ( `:n` ), then `0` is used to start the range. If the ending range value is omitted ( `n:` ), then the highest possible node index is used to end the range. Your accumulative node ranges must account for all nodes ( `0:n` ). You can nest node ranges (for example, `0:10` and `4:5` ). In this case, the `4:5` range properties override the `0:10` properties."}},"AWS::Batch::JobDefinition.PodProperties":{"attributes":{},"description":"The properties for the pod.","properties":{"Containers":"The properties of the container that\'s used on the Amazon EKS pod.","DnsPolicy":"The DNS policy for the pod. The default value is `ClusterFirst` . If the `hostNetwork` parameter is not specified, the default is `ClusterFirstWithHostNet` . `ClusterFirst` indicates that any DNS query that does not match the configured cluster domain suffix is forwarded to the upstream nameserver inherited from the node. If no value was specified for `dnsPolicy` in the [RegisterJobDefinition](https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html) API operation, then no value will be returned for `dnsPolicy` by either of [DescribeJobDefinitions](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeJobDefinitions.html) or [DescribeJobs](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeJobs.html) API operations. The pod spec setting will contain either `ClusterFirst` or `ClusterFirstWithHostNet` , depending on the value of the `hostNetwork` parameter. For more information, see [Pod\'s DNS policy](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy) in the *Kubernetes documentation* .\\n\\nValid values: `Default` | `ClusterFirst` | `ClusterFirstWithHostNet`","HostNetwork":"Indicates if the pod uses the hosts\' network IP address. The default value is `true` . Setting this to `false` enables the Kubernetes pod networking model. Most AWS Batch workloads are egress-only and don\'t require the overhead of IP allocation for each pod for incoming connections. For more information, see [Host namespaces](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/security/pod-security-policy/#host-namespaces) and [Pod networking](https://docs.aws.amazon.com/https://kubernetes.io/docs/concepts/workloads/pods/#pod-networking) in the *Kubernetes documentation* .","Metadata":"","ServiceAccountName":"The name of the service account that\'s used to run the pod. For more information, see [Kubernetes service accounts](https://docs.aws.amazon.com/eks/latest/userguide/service-accounts.html) and [Configure a Kubernetes service account to assume an IAM role](https://docs.aws.amazon.com/eks/latest/userguide/associate-service-account-role.html) in the *Amazon EKS User Guide* and [Configure service accounts for pods](https://docs.aws.amazon.com/https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/) in the *Kubernetes documentation* .","Volumes":"Specifies the volumes for a job definition that uses Amazon EKS resources."}},"AWS::Batch::JobDefinition.ResourceRequirement":{"attributes":{},"description":"The type and amount of a resource to assign to a container. The supported resources include `GPU` , `MEMORY` , and `VCPU` .","properties":{"Type":"The type of resource to assign to a container. The supported resources include `GPU` , `MEMORY` , and `VCPU` .","Value":"The quantity of the specified resource to reserve for the container. The values vary based on the `type` specified.\\n\\n- **type=\\"GPU\\"** - The number of physical GPUs to reserve for the container. Make sure that the number of GPUs reserved for all containers in a job doesn\'t exceed the number of available GPUs on the compute resource that the job is launched on.\\n\\n> GPUs aren\'t available for jobs that are running on Fargate resources.\\n- **type=\\"MEMORY\\"** - The memory hard limit (in MiB) present to the container. This parameter is supported for jobs that are running on EC2 resources. If your container attempts to exceed the memory specified, the container is terminated. This parameter maps to `Memory` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--memory` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . You must specify at least 4 MiB of memory for a job. This is required but can be specified in several places for multi-node parallel (MNP) jobs. It must be specified for each node at least once. This parameter maps to `Memory` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--memory` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .\\n\\n> If you\'re trying to maximize your resource utilization by providing your jobs as much memory as possible for a particular instance type, see [Memory management](https://docs.aws.amazon.com/batch/latest/userguide/memory-management.html) in the *AWS Batch User Guide* . \\n\\nFor jobs that are running on Fargate resources, then `value` is the hard limit (in MiB), and must match one of the supported values and the `VCPU` values must be one of the values supported for that memory value.\\n\\n- **value = 512** - `VCPU` = 0.25\\n- **value = 1024** - `VCPU` = 0.25 or 0.5\\n- **value = 2048** - `VCPU` = 0.25, 0.5, or 1\\n- **value = 3072** - `VCPU` = 0.5, or 1\\n- **value = 4096** - `VCPU` = 0.5, 1, or 2\\n- **value = 5120, 6144, or 7168** - `VCPU` = 1 or 2\\n- **value = 8192** - `VCPU` = 1, 2, or 4\\n- **value = 9216, 10240, 11264, 12288, 13312, 14336, or 15360** - `VCPU` = 2 or 4\\n- **value = 16384** - `VCPU` = 2, 4, or 8\\n- **value = 17408, 18432, 19456, 21504, 22528, 23552, 25600, 26624, 27648, 29696, or 30720** - `VCPU` = 4\\n- **value = 20480, 24576, or 28672** - `VCPU` = 4 or 8\\n- **value = 36864, 45056, 53248, or 61440** - `VCPU` = 8\\n- **value = 32768, 40960, 49152, or 57344** - `VCPU` = 8 or 16\\n- **value = 65536, 73728, 81920, 90112, 98304, 106496, 114688, or 122880** - `VCPU` = 16\\n- **type=\\"VCPU\\"** - The number of vCPUs reserved for the container. This parameter maps to `CpuShares` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--cpu-shares` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . Each vCPU is equivalent to 1,024 CPU shares. For EC2 resources, you must specify at least one vCPU. This is required but can be specified in several places; it must be specified for each node at least once.\\n\\nThe default for the Fargate On-Demand vCPU resource count quota is 6 vCPUs. For more information about Fargate quotas, see [AWS Fargate quotas](https://docs.aws.amazon.com/general/latest/gr/ecs-service.html#service-quotas-fargate) in the *AWS General Reference* .\\n\\nFor jobs that are running on Fargate resources, then `value` must match one of the supported values and the `MEMORY` values must be one of the values supported for that `VCPU` value. The supported values are 0.25, 0.5, 1, 2, 4, 8, and 16\\n\\n- **value = 0.25** - `MEMORY` = 512, 1024, or 2048\\n- **value = 0.5** - `MEMORY` = 1024, 2048, 3072, or 4096\\n- **value = 1** - `MEMORY` = 2048, 3072, 4096, 5120, 6144, 7168, or 8192\\n- **value = 2** - `MEMORY` = 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336, 15360, or 16384\\n- **value = 4** - `MEMORY` = 8192, 9216, 10240, 11264, 12288, 13312, 14336, 15360, 16384, 17408, 18432, 19456, 20480, 21504, 22528, 23552, 24576, 25600, 26624, 27648, 28672, 29696, or 30720\\n- **value = 8** - `MEMORY` = 16384, 20480, 24576, 28672, 32768, 36864, 40960, 45056, 49152, 53248, 57344, or 61440\\n- **value = 16** - `MEMORY` = 32768, 40960, 49152, 57344, 65536, 73728, 81920, 90112, 98304, 106496, 114688, or 122880"}},"AWS::Batch::JobDefinition.RetryStrategy":{"attributes":{},"description":"The retry strategy that\'s associated with a job. For more information, see [Automated job retries](https://docs.aws.amazon.com/batch/latest/userguide/job_retries.html) in the *AWS Batch User Guide* .","properties":{"Attempts":"The number of times to move a job to the `RUNNABLE` status. You can specify between 1 and 10 attempts. If the value of `attempts` is greater than one, the job is retried on failure the same number of attempts as the value.","EvaluateOnExit":"Array of up to 5 objects that specify the conditions where jobs are retried or failed. If this parameter is specified, then the `attempts` parameter must also be specified. If none of the listed conditions match, then the job is retried."}},"AWS::Batch::JobDefinition.Secret":{"attributes":{},"description":"An object that represents the secret to expose to your container. Secrets can be exposed to a container in the following ways:\\n\\n- To inject sensitive data into your containers as environment variables, use the `secrets` container definition parameter.\\n- To reference sensitive information in the log configuration of a container, use the `secretOptions` container definition parameter.\\n\\nFor more information, see [Specifying sensitive data](https://docs.aws.amazon.com/batch/latest/userguide/specifying-sensitive-data.html) in the *AWS Batch User Guide* .","properties":{"Name":"The name of the secret.","ValueFrom":"The secret to expose to the container. The supported values are either the full Amazon Resource Name (ARN) of the AWS Secrets Manager secret or the full ARN of the parameter in the AWS Systems Manager Parameter Store.\\n\\n> If the AWS Systems Manager Parameter Store parameter exists in the same Region as the job you\'re launching, then you can use either the full Amazon Resource Name (ARN) or name of the parameter. If the parameter exists in a different Region, then the full ARN must be specified."}},"AWS::Batch::JobDefinition.Timeout":{"attributes":{},"description":"An object that represents a job timeout configuration.","properties":{"AttemptDurationSeconds":"The job timeout time (in seconds) that\'s measured from the job attempt\'s `startedAt` timestamp. After this time passes, AWS Batch terminates your jobs if they aren\'t finished. The minimum value for the timeout is 60 seconds.\\n\\nFor array jobs, the timeout applies to the child jobs, not to the parent array job.\\n\\nFor multi-node parallel (MNP) jobs, the timeout applies to the whole job, not to the individual nodes."}},"AWS::Batch::JobDefinition.Tmpfs":{"attributes":{},"description":"The container path, mount options, and size of the `tmpfs` mount.\\n\\n> This object isn\'t applicable to jobs that are running on Fargate resources.","properties":{"ContainerPath":"The absolute file path in the container where the `tmpfs` volume is mounted.","MountOptions":"The list of `tmpfs` volume mount options.\\n\\nValid values: \\" `defaults` \\" | \\" `ro` \\" | \\" `rw` \\" | \\" `suid` \\" | \\" `nosuid` \\" | \\" `dev` \\" | \\" `nodev` \\" | \\" `exec` \\" | \\" `noexec` \\" | \\" `sync` \\" | \\" `async` \\" | \\" `dirsync` \\" | \\" `remount` \\" | \\" `mand` \\" | \\" `nomand` \\" | \\" `atime` \\" | \\" `noatime` \\" | \\" `diratime` \\" | \\" `nodiratime` \\" | \\" `bind` \\" | \\" `rbind\\" | \\"unbindable\\" | \\"runbindable\\" | \\"private\\" | \\"rprivate\\" | \\"shared\\" | \\"rshared\\" | \\"slave\\" | \\"rslave\\" | \\"relatime` \\" | \\" `norelatime` \\" | \\" `strictatime` \\" | \\" `nostrictatime` \\" | \\" `mode` \\" | \\" `uid` \\" | \\" `gid` \\" | \\" `nr_inodes` \\" | \\" `nr_blocks` \\" | \\" `mpol` \\"","Size":"The size (in MiB) of the `tmpfs` volume."}},"AWS::Batch::JobDefinition.Ulimit":{"attributes":{},"description":"The `ulimit` settings to pass to the container.\\n\\n> This object isn\'t applicable to jobs that are running on Fargate resources.","properties":{"HardLimit":"The hard limit for the `ulimit` type.","Name":"The `type` of the `ulimit` .","SoftLimit":"The soft limit for the `ulimit` type."}},"AWS::Batch::JobDefinition.Volumes":{"attributes":{},"description":"A list of volumes that are associated with the job.","properties":{"EfsVolumeConfiguration":"This is used when you\'re using an Amazon Elastic File System file system for job storage. For more information, see [Amazon EFS Volumes](https://docs.aws.amazon.com/batch/latest/userguide/efs-volumes.html) in the *AWS Batch User Guide* .","Host":"The contents of the `host` parameter determine whether your data volume persists on the host container instance and where it\'s stored. If the host parameter is empty, then the Docker daemon assigns a host path for your data volume. However, the data isn\'t guaranteed to persist after the containers that are associated with it stop running.\\n\\n> This parameter isn\'t applicable to jobs that are running on Fargate resources and shouldn\'t be provided.","Name":"The name of the volume. It can be up to 255 characters long. It can contain uppercase and lowercase letters, numbers, hyphens (-), and underscores (_). This name is referenced in the `sourceVolume` parameter of container definition `mountPoints` ."}},"AWS::Batch::JobDefinition.VolumesHost":{"attributes":{},"description":"Determine whether your data volume persists on the host container instance and where it\'s stored. If this parameter is empty, then the Docker daemon assigns a host path for your data volume. However, the data isn\'t guaranteed to persist after the containers that are associated with it stop running.","properties":{"SourcePath":"The path on the host container instance that\'s presented to the container. If this parameter is empty, then the Docker daemon has assigned a host path for you. If this parameter contains a file location, then the data volume persists at the specified location on the host container instance until you delete it manually. If the source path location doesn\'t exist on the host container instance, the Docker daemon creates it. If the location does exist, the contents of the source path folder are exported.\\n\\n> This parameter isn\'t applicable to jobs that run on Fargate resources. Don\'t provide this for these jobs."}},"AWS::Batch::JobQueue":{"attributes":{"JobQueueArn":"Returns the job queue ARN, such as `batch: *us-east-1* : *111122223333* :job-queue/ *JobQueueName*` .","Ref":"`Ref` returns the job queue ARN, such as `batch: *us-east-1* : *111122223333* :job-queue/ *HighPriority*` ."},"description":"The `AWS::Batch::JobQueue` resource specifies the parameters for an AWS Batch job queue definition. For more information, see [Job Queues](https://docs.aws.amazon.com/batch/latest/userguide/job_queues.html) in the ** .","properties":{"ComputeEnvironmentOrder":"The set of compute environments mapped to a job queue and their order relative to each other. The job scheduler uses this parameter to determine which compute environment runs a specific job. Compute environments must be in the `VALID` state before you can associate them with a job queue. You can associate up to three compute environments with a job queue. All of the compute environments must be either EC2 ( `EC2` or `SPOT` ) or Fargate ( `FARGATE` or `FARGATE_SPOT` ); EC2 and Fargate compute environments can\'t be mixed.\\n\\n> All compute environments that are associated with a job queue must share the same architecture. AWS Batch doesn\'t support mixing compute environment architecture types in a single job queue.","JobQueueName":"The name of the job queue. It can be up to 128 letters long. It can contain uppercase and lowercase letters, numbers, hyphens (-), and underscores (_).","Priority":"The priority of the job queue. Job queues with a higher priority (or a higher integer value for the `priority` parameter) are evaluated first when associated with the same compute environment. Priority is determined in descending order. For example, a job queue with a priority value of `10` is given scheduling preference over a job queue with a priority value of `1` . All of the compute environments must be either EC2 ( `EC2` or `SPOT` ) or Fargate ( `FARGATE` or `FARGATE_SPOT` ); EC2 and Fargate compute environments can\'t be mixed.","SchedulingPolicyArn":"The Amazon Resource Name (ARN) of the scheduling policy. The format is `aws: *Partition* :batch: *Region* : *Account* :scheduling-policy/ *Name*` . For example, `aws:aws:batch:us-west-2:123456789012:scheduling-policy/MySchedulingPolicy` .","State":"The state of the job queue. If the job queue state is `ENABLED` , it is able to accept jobs. If the job queue state is `DISABLED` , new jobs can\'t be added to the queue, but jobs already in the queue can finish.","Tags":"The tags that are applied to the job queue. For more information, see [Tagging your AWS Batch resources](https://docs.aws.amazon.com/batch/latest/userguide/using-tags.html) in *AWS Batch User Guide* ."}},"AWS::Batch::JobQueue.ComputeEnvironmentOrder":{"attributes":{},"description":"The order that compute environments are tried in for job placement within a queue. Compute environments are tried in ascending order. For example, if two compute environments are associated with a job queue, the compute environment with a lower order integer value is tried for job placement first. Compute environments must be in the `VALID` state before you can associate them with a job queue. All of the compute environments must be either EC2 ( `EC2` or `SPOT` ) or Fargate ( `FARGATE` or `FARGATE_SPOT` ); EC2 and Fargate compute environments can\'t be mixed.\\n\\n> All compute environments that are associated with a job queue must share the same architecture. AWS Batch doesn\'t support mixing compute environment architecture types in a single job queue.","properties":{"ComputeEnvironment":"The Amazon Resource Name (ARN) of the compute environment.","Order":"The order of the compute environment. Compute environments are tried in ascending order. For example, if two compute environments are associated with a job queue, the compute environment with a lower `order` integer value is tried for job placement first."}},"AWS::Batch::SchedulingPolicy":{"attributes":{"Arn":"Returns the scheduling policy ARN, such as `batch: *us-east-1* : *111122223333* :scheduling-policy/ *HighPriority*` .","Ref":"`Ref` returns the scheduling policy ARN, such as `batch: *us-east-1* : *111122223333* :scheduling-policy/ *HighPriority*` ."},"description":"The `AWS::Batch::SchedulingPolicy` resource specifies the parameters for an AWS Batch scheduling policy. For more information, see [Scheduling Policies](https://docs.aws.amazon.com/batch/latest/userguide/scheduling_policies.html) in the ** .","properties":{"FairsharePolicy":"The fair share policy of the scheduling policy.","Name":"The name of the scheduling policy. It can be up to 128 letters long. It can contain uppercase and lowercase letters, numbers, hyphens (-), and underscores (_).","Tags":"The tags that you apply to the scheduling policy to help you categorize and organize your resources. Each tag consists of a key and an optional value. For more information, see [Tagging AWS Resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) in *AWS General Reference* .\\n\\nThese tags can be updated or removed using the [TagResource](https://docs.aws.amazon.com/batch/latest/APIReference/API_TagResource.html) and [UntagResource](https://docs.aws.amazon.com/batch/latest/APIReference/API_UntagResource.html) API operations."}},"AWS::Batch::SchedulingPolicy.FairsharePolicy":{"attributes":{},"description":"The fair share policy for a scheduling policy.","properties":{"ComputeReservation":"A value used to reserve some of the available maximum vCPU for fair share identifiers that aren\'t already used.\\n\\nThe reserved ratio is `( *computeReservation* /100)^ *ActiveFairShares*` where `*ActiveFairShares*` is the number of active fair share identifiers.\\n\\nFor example, a `computeReservation` value of 50 indicates that AWS Batch reserves 50% of the maximum available vCPU if there\'s only one fair share identifier. It reserves 25% if there are two fair share identifiers. It reserves 12.5% if there are three fair share identifiers. A `computeReservation` value of 25 indicates that AWS Batch should reserve 25% of the maximum available vCPU if there\'s only one fair share identifier, 6.25% if there are two fair share identifiers, and 1.56% if there are three fair share identifiers.\\n\\nThe minimum value is 0 and the maximum value is 99.","ShareDecaySeconds":"The amount of time (in seconds) to use to calculate a fair share percentage for each fair share identifier in use. A value of zero (0) indicates that only current usage is measured. The decay allows for more recently run jobs to have more weight than jobs that ran earlier. The maximum supported value is 604800 (1 week).","ShareDistribution":"An array of `SharedIdentifier` objects that contain the weights for the fair share identifiers for the fair share policy. Fair share identifiers that aren\'t included have a default weight of `1.0` ."}},"AWS::Batch::SchedulingPolicy.ShareAttributes":{"attributes":{},"description":"Specifies the weights for the fair share identifiers for the fair share policy. Fair share identifiers that aren\'t included have a default weight of `1.0` .","properties":{"ShareIdentifier":"A fair share identifier or fair share identifier prefix. If the string ends with an asterisk (*), this entry specifies the weight factor to use for fair share identifiers that start with that prefix. The list of fair share identifiers in a fair share policy can\'t overlap. For example, you can\'t have one that specifies a `shareIdentifier` of `UserA*` and another that specifies a `shareIdentifier` of `UserA-1` .\\n\\nThere can be no more than 500 fair share identifiers active in a job queue.\\n\\nThe string is limited to 255 alphanumeric characters, and can be followed by an asterisk (*).","WeightFactor":"The weight factor for the fair share identifier. The default value is 1.0. A lower value has a higher priority for compute resources. For example, jobs that use a share identifier with a weight factor of 0.125 (1/8) get 8 times the compute resources of jobs that use a share identifier with a weight factor of 1.\\n\\nThe smallest supported value is 0.0001, and the largest supported value is 999.9999."}},"AWS::BillingConductor::BillingGroup":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the created billing group.","CreationTime":"The time the billing group was created.","LastModifiedTime":"The most recent time the billing group was modified.","Ref":"","Size":"The number of accounts in the particular billing group.","Status":"The billing group status. Only one of the valid values can be used.","StatusReason":"The reason why the billing group is in its current status."},"description":"Creates a billing group that resembles a consolidated billing family that AWS charges, based off of the predefined pricing plan computation.","properties":{"AccountGrouping":"The set of accounts that will be under the billing group. The set of accounts resemble the linked accounts in a consolidated family.","ComputationPreference":"The preferences and settings that will be used to compute the AWS charges for a billing group.","Description":"The description of the billing group.","Name":"The billing group\'s name.","PrimaryAccountId":"The account ID that serves as the main account in a billing group.","Tags":""}},"AWS::BillingConductor::BillingGroup.AccountGrouping":{"attributes":{},"description":"The set of accounts that will be under the billing group. The set of accounts resemble the linked accounts in a consolidated family.","properties":{"LinkedAccountIds":"The account IDs that make up the billing group. Account IDs must be a part of the consolidated billing family, and not associated with another billing group."}},"AWS::BillingConductor::BillingGroup.ComputationPreference":{"attributes":{},"description":"The preferences and settings that will be used to compute the AWS charges for a billing group.","properties":{"PricingPlanArn":"The Amazon Resource Name (ARN) of the pricing plan used to compute the AWS charges for a billing group."}},"AWS::BillingConductor::CustomLineItem":{"attributes":{"Arn":"The Amazon Resource Name (ARN) that references the billing group where the custom line item applies to.","AssociationSize":"The number of resources that are associated to the custom line item.","CreationTime":"The time created.","CurrencyCode":"The custom line item\'s charge value currency. Only one of the valid values can be used.","LastModifiedTime":"The most recent time the custom line item was modified.","ProductCode":"The product code associated with the custom line item.","Ref":""},"description":"Creates a custom line item that can be used to create a one-time or recurring, fixed or percentage-based charge that you can apply to a single billing group. You can apply custom line items to the current or previous billing period. You can create either a fee or a discount custom line item.","properties":{"BillingGroupArn":"The Amazon Resource Name (ARN) that references the billing group where the custom line item applies to.","BillingPeriodRange":"A time range for which the custom line item is effective.","CustomLineItemChargeDetails":"The charge details of a custom line item. It should contain only one of `Flat` or `Percentage` .","Description":"The custom line item\'s description. This is shown on the Bills page in association with the charge value.","Name":"The custom line item\'s name.","Tags":"A map that contains tag keys and tag values that are attached to a custom line item."}},"AWS::BillingConductor::CustomLineItem.BillingPeriodRange":{"attributes":{},"description":"The billing period range in which the custom line item request will be applied.","properties":{"ExclusiveEndBillingPeriod":"The exclusive end billing period that defines a billing period range where a custom line is applied.","InclusiveStartBillingPeriod":"The inclusive start billing period that defines a billing period range where a custom line is applied."}},"AWS::BillingConductor::CustomLineItem.CustomLineItemChargeDetails":{"attributes":{},"description":"The charge details of a custom line item. It should contain only one of `Flat` or `Percentage` .","properties":{"Flat":"A `CustomLineItemFlatChargeDetails` that describes the charge details of a flat custom line item.","Percentage":"A `CustomLineItemPercentageChargeDetails` that describes the charge details of a percentage custom line item.","Type":"The type of the custom line item that indicates whether the charge is a fee or credit."}},"AWS::BillingConductor::CustomLineItem.CustomLineItemFlatChargeDetails":{"attributes":{},"description":"The charge details of a custom line item. It should contain only one of `Flat` or `Percentage` .","properties":{"ChargeValue":"The custom line item\'s fixed charge value in USD."}},"AWS::BillingConductor::CustomLineItem.CustomLineItemPercentageChargeDetails":{"attributes":{},"description":"A representation of the charge details associated with a percentage custom line item.","properties":{"ChildAssociatedResources":"A list of resource ARNs to associate to the percentage custom line item.","PercentageValue":"The custom line item\'s percentage value. This will be multiplied against the combined value of its associated resources to determine its charge value."}},"AWS::BillingConductor::PricingPlan":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the created pricing plan.","CreationTime":"The time the pricing plan was created.","LastModifiedTime":"The most recent time the pricing plan was modified.","Ref":"","Size":"The pricing rules count currently associated with this pricing plan list element."},"description":"Creates a pricing plan that is used for computing AWS charges for billing groups.","properties":{"Description":"The pricing plan description.","Name":"The name of a pricing plan.","PricingRuleArns":"The `PricingRuleArns` that are associated with the Pricing Plan.","Tags":"A map that contains tag keys and tag values that are attached to a pricing plan."}},"AWS::BillingConductor::PricingRule":{"attributes":{"Arn":"The Amazon Resource Name (ARN) used to uniquely identify a pricing rule.","AssociatedPricingPlanCount":"The pricing plans count that this pricing rule is associated with.","CreationTime":"The time the pricing rule was created.","LastModifiedTime":"The most recent time the pricing rule was modified.","Ref":""},"description":"Creates a pricing rule which can be associated with a pricing plan, or a set of pricing plans.","properties":{"BillingEntity":"The seller of services provided by AWS , their affiliates, or third-party providers selling services via AWS Marketplace .","Description":"The pricing rule description.","ModifierPercentage":"A percentage modifier applied on the public pricing rates.","Name":"The name of a pricing rule.","Operation":"Operation is the specific AWS action covered by this line item. This describes the specific usage of the line item.\\n\\nIf the `Scope` attribute is set to `SKU` , this attribute indicates which operation the `PricingRule` is modifying. For example, a value of `RunInstances:0202` indicates the operation of running an Amazon EC2 instance.","Scope":"The scope of pricing rule that indicates if it\'s globally applicable or service-specific.","Service":"If the `Scope` attribute is `SERVICE` , this attribute indicates which service the `PricingRule` is applicable for.","Tags":"A map that contains tag keys and tag values that are attached to a pricing rule.","Tiering":"The set of tiering configurations for the pricing rule.","Type":"The type of pricing rule.","UsageType":"Usage Type is the unit that each service uses to measure the usage of a specific type of resource."}},"AWS::BillingConductor::PricingRule.FreeTier":{"attributes":{},"description":"The possible AWS Free Tier configurations.","properties":{"Activated":"Activate or deactivate AWS Free Tier."}},"AWS::BillingConductor::PricingRule.Tiering":{"attributes":{},"description":"","properties":{"FreeTier":""}},"AWS::Budgets::Budget":{"attributes":{"Ref":"`Ref` returns the name of the budget that is created by the template."},"description":"The `AWS::Budgets::Budget` resource allows customers to take pre-defined actions that will trigger once a budget threshold has been exceeded. creates, replaces, or deletes budgets for Billing and Cost Management. For more information, see [Managing Your Costs with Budgets](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/budgets-managing-costs.html) in the *AWS Billing and Cost Management User Guide* .","properties":{"Budget":"The budget object that you want to create.","NotificationsWithSubscribers":"A notification that you want to associate with a budget. A budget can have up to five notifications, and each notification can have one SNS subscriber and up to 10 email subscribers. If you include notifications and subscribers in your `CreateBudget` call, AWS creates the notifications and subscribers for you."}},"AWS::Budgets::Budget.AutoAdjustData":{"attributes":{},"description":"Determine the budget amount for an auto-adjusting budget.","properties":{"AutoAdjustType":"The string that defines whether your budget auto-adjusts based on historical or forecasted data.","HistoricalOptions":"The parameters that define or describe the historical data that your auto-adjusting budget is based on."}},"AWS::Budgets::Budget.BudgetData":{"attributes":{},"description":"Represents the output of the `CreateBudget` operation. The content consists of the detailed metadata and data file information, and the current status of the `budget` object.\\n\\nThis is the Amazon Resource Name (ARN) pattern for a budget:\\n\\n`arn:aws:budgets::AccountId:budget/budgetName`","properties":{"AutoAdjustData":"Determine the budget amount for an auto-adjusting budget.","BudgetLimit":"The total amount of cost, usage, RI utilization, RI coverage, Savings Plans utilization, or Savings Plans coverage that you want to track with your budget.\\n\\n`BudgetLimit` is required for cost or usage budgets, but optional for RI or Savings Plans utilization or coverage budgets. RI and Savings Plans utilization or coverage budgets default to `100` . This is the only valid value for RI or Savings Plans utilization or coverage budgets. You can\'t use `BudgetLimit` with `PlannedBudgetLimits` for `CreateBudget` and `UpdateBudget` actions.","BudgetName":"The name of a budget. The value must be unique within an account. `BudgetName` can\'t include `:` and `\\\\` characters. If you don\'t include value for `BudgetName` in the template, Billing and Cost Management assigns your budget a randomly generated name.","BudgetType":"Specifies whether this budget tracks costs, usage, RI utilization, RI coverage, Savings Plans utilization, or Savings Plans coverage.","CostFilters":"The cost filters, such as `Region` , `Service` , `member account` , `Tag` , or `Cost Category` , that are applied to a budget.\\n\\nAWS Budgets supports the following services as a `Service` filter for RI budgets:\\n\\n- Amazon EC2\\n- Amazon Redshift\\n- Amazon Relational Database Service\\n- Amazon ElastiCache\\n- Amazon OpenSearch Service","CostTypes":"The types of costs that are included in this `COST` budget.\\n\\n`USAGE` , `RI_UTILIZATION` , `RI_COVERAGE` , `SAVINGS_PLANS_UTILIZATION` , and `SAVINGS_PLANS_COVERAGE` budgets do not have `CostTypes` .","PlannedBudgetLimits":"A map containing multiple `BudgetLimit` , including current or future limits.\\n\\n`PlannedBudgetLimits` is available for cost or usage budget and supports both monthly and quarterly `TimeUnit` .\\n\\nFor monthly budgets, provide 12 months of `PlannedBudgetLimits` values. This must start from the current month and include the next 11 months. The `key` is the start of the month, `UTC` in epoch seconds.\\n\\nFor quarterly budgets, provide four quarters of `PlannedBudgetLimits` value entries in standard calendar quarter increments. This must start from the current quarter and include the next three quarters. The `key` is the start of the quarter, `UTC` in epoch seconds.\\n\\nIf the planned budget expires before 12 months for monthly or four quarters for quarterly, provide the `PlannedBudgetLimits` values only for the remaining periods.\\n\\nIf the budget begins at a date in the future, provide `PlannedBudgetLimits` values from the start date of the budget.\\n\\nAfter all of the `BudgetLimit` values in `PlannedBudgetLimits` are used, the budget continues to use the last limit as the `BudgetLimit` . At that point, the planned budget provides the same experience as a fixed budget.\\n\\n`DescribeBudget` and `DescribeBudgets` response along with `PlannedBudgetLimits` also contain `BudgetLimit` representing the current month or quarter limit present in `PlannedBudgetLimits` . This only applies to budgets that are created with `PlannedBudgetLimits` . Budgets that are created without `PlannedBudgetLimits` only contain `BudgetLimit` . They don\'t contain `PlannedBudgetLimits` .","TimePeriod":"The period of time that is covered by a budget. The period has a start date and an end date. The start date must come before the end date. There are no restrictions on the end date.\\n\\nThe start date for a budget. If you created your budget and didn\'t specify a start date, the start date defaults to the start of the chosen time period (MONTHLY, QUARTERLY, or ANNUALLY). For example, if you create your budget on January 24, 2019, choose `MONTHLY` , and don\'t set a start date, the start date defaults to `01/01/19 00:00 UTC` . The defaults are the same for the AWS Billing and Cost Management console and the API.\\n\\nYou can change your start date with the `UpdateBudget` operation.\\n\\nAfter the end date, AWS deletes the budget and all associated notifications and subscribers.","TimeUnit":"The length of time until a budget resets the actual and forecasted spend. `DAILY` is available only for `RI_UTILIZATION` and `RI_COVERAGE` budgets."}},"AWS::Budgets::Budget.CostTypes":{"attributes":{},"description":"The types of cost that are included in a `COST` budget, such as tax and subscriptions.\\n\\n`USAGE` , `RI_UTILIZATION` , `RI_COVERAGE` , `SAVINGS_PLANS_UTILIZATION` , and `SAVINGS_PLANS_COVERAGE` budgets don\'t have `CostTypes` .","properties":{"IncludeCredit":"Specifies whether a budget includes credits.\\n\\nThe default value is `true` .","IncludeDiscount":"Specifies whether a budget includes discounts.\\n\\nThe default value is `true` .","IncludeOtherSubscription":"Specifies whether a budget includes non-RI subscription costs.\\n\\nThe default value is `true` .","IncludeRecurring":"Specifies whether a budget includes recurring fees such as monthly RI fees.\\n\\nThe default value is `true` .","IncludeRefund":"Specifies whether a budget includes refunds.\\n\\nThe default value is `true` .","IncludeSubscription":"Specifies whether a budget includes subscriptions.\\n\\nThe default value is `true` .","IncludeSupport":"Specifies whether a budget includes support subscription fees.\\n\\nThe default value is `true` .","IncludeTax":"Specifies whether a budget includes taxes.\\n\\nThe default value is `true` .","IncludeUpfront":"Specifies whether a budget includes upfront RI costs.\\n\\nThe default value is `true` .","UseAmortized":"Specifies whether a budget uses the amortized rate.\\n\\nThe default value is `false` .","UseBlended":"Specifies whether a budget uses a blended rate.\\n\\nThe default value is `false` ."}},"AWS::Budgets::Budget.HistoricalOptions":{"attributes":{},"description":"The parameters that define or describe the historical data that your auto-adjusting budget is based on.","properties":{"BudgetAdjustmentPeriod":"The number of budget periods included in the moving-average calculation that determines your auto-adjusted budget amount. The maximum value depends on the `TimeUnit` granularity of the budget:\\n\\n- For the `DAILY` granularity, the maximum value is `60` .\\n- For the `MONTHLY` granularity, the maximum value is `12` .\\n- For the `QUARTERLY` granularity, the maximum value is `4` .\\n- For the `ANNUALLY` granularity, the maximum value is `1` ."}},"AWS::Budgets::Budget.Notification":{"attributes":{},"description":"A notification that\'s associated with a budget. A budget can have up to ten notifications.\\n\\nEach notification must have at least one subscriber. A notification can have one SNS subscriber and up to 10 email subscribers, for a total of 11 subscribers.\\n\\nFor example, if you have a budget for 200 dollars and you want to be notified when you go over 160 dollars, create a notification with the following parameters:\\n\\n- A notificationType of `ACTUAL`\\n- A `thresholdType` of `PERCENTAGE`\\n- A `comparisonOperator` of `GREATER_THAN`\\n- A notification `threshold` of `80`","properties":{"ComparisonOperator":"The comparison that\'s used for this notification.","NotificationType":"Specifies whether the notification is for how much you have spent ( `ACTUAL` ) or for how much that you\'re forecasted to spend ( `FORECASTED` ).","Threshold":"The threshold that\'s associated with a notification. Thresholds are always a percentage, and many customers find value being alerted between 50% - 200% of the budgeted amount. The maximum limit for your threshold is 1,000,000% above the budgeted amount.","ThresholdType":"The type of threshold for a notification. For `ABSOLUTE_VALUE` thresholds, AWS notifies you when you go over or are forecasted to go over your total cost threshold. For `PERCENTAGE` thresholds, AWS notifies you when you go over or are forecasted to go over a certain percentage of your forecasted spend. For example, if you have a budget for 200 dollars and you have a `PERCENTAGE` threshold of 80%, AWS notifies you when you go over 160 dollars."}},"AWS::Budgets::Budget.NotificationWithSubscribers":{"attributes":{},"description":"A notification with subscribers. A notification can have one SNS subscriber and up to 10 email subscribers, for a total of 11 subscribers.","properties":{"Notification":"The notification that\'s associated with a budget.","Subscribers":"A list of subscribers who are subscribed to this notification."}},"AWS::Budgets::Budget.Spend":{"attributes":{},"description":"The amount of cost or usage that\'s measured for a budget.\\n\\nFor example, a `Spend` for `3 GB` of S3 usage has the following parameters:\\n\\n- An `Amount` of `3`\\n- A `unit` of `GB`","properties":{"Amount":"The cost or usage amount that\'s associated with a budget forecast, actual spend, or budget threshold.","Unit":"The unit of measurement that\'s used for the budget forecast, actual spend, or budget threshold, such as USD or GBP."}},"AWS::Budgets::Budget.Subscriber":{"attributes":{},"description":"The `Subscriber` property type specifies who to notify for a Billing and Cost Management budget notification. The subscriber consists of a subscription type, and either an Amazon SNS topic or an email address.\\n\\nFor example, an email subscriber would have the following parameters:\\n\\n- A `subscriptionType` of `EMAIL`\\n- An `address` of `example@example.com`","properties":{"Address":"The address that AWS sends budget notifications to, either an SNS topic or an email.\\n\\nWhen you create a subscriber, the value of `Address` can\'t contain line breaks.","SubscriptionType":"The type of notification that AWS sends to a subscriber."}},"AWS::Budgets::Budget.TimePeriod":{"attributes":{},"description":"The period of time that is covered by a budget. The period has a start date and an end date. The start date must come before the end date. There are no restrictions on the end date.","properties":{"End":"The end date for a budget. If you didn\'t specify an end date, AWS set your end date to `06/15/87 00:00 UTC` . The defaults are the same for the AWS Billing and Cost Management console and the API.\\n\\nAfter the end date, AWS deletes the budget and all the associated notifications and subscribers. You can change your end date with the `UpdateBudget` operation.","Start":"The start date for a budget. If you created your budget and didn\'t specify a start date, the start date defaults to the start of the chosen time period (MONTHLY, QUARTERLY, or ANNUALLY). For example, if you create your budget on January 24, 2019, choose `MONTHLY` , and don\'t set a start date, the start date defaults to `01/01/19 00:00 UTC` . The defaults are the same for the AWS Billing and Cost Management console and the API.\\n\\nYou can change your start date with the `UpdateBudget` operation.\\n\\nValid values depend on the value of `BudgetType` :\\n\\n- If `BudgetType` is `COST` or `USAGE` : Valid values are `MONTHLY` , `QUARTERLY` , and `ANNUALLY` .\\n- If `BudgetType` is `RI_UTILIZATION` or `RI_COVERAGE` : Valid values are `DAILY` , `MONTHLY` , `QUARTERLY` , and `ANNUALLY` ."}},"AWS::Budgets::BudgetsAction":{"attributes":{"ActionId":"A system-generated universally unique identifier (UUID) for the action."},"description":"The `AWS::Budgets::BudgetsAction` resource enables you to take predefined actions that are initiated when a budget threshold has been exceeded. For more information, see [Managing Your Costs with Budgets](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/budgets-managing-costs.html) in the *AWS Billing and Cost Management User Guide* .","properties":{"ActionThreshold":"The trigger threshold of the action.","ActionType":"The type of action. This defines the type of tasks that can be carried out by this action. This field also determines the format for definition.","ApprovalModel":"This specifies if the action needs manual or automatic approval.","BudgetName":"A string that represents the budget name. \\":\\" and \\"\\\\\\" characters aren\'t allowed.","Definition":"Specifies all of the type-specific parameters.","ExecutionRoleArn":"The role passed for action execution and reversion. Roles and actions must be in the same account.","NotificationType":"The type of a notification.","Subscribers":"A list of subscribers."}},"AWS::Budgets::BudgetsAction.ActionThreshold":{"attributes":{},"description":"The trigger threshold of the action.","properties":{"Type":"The type of threshold for a notification.","Value":"The threshold of a notification."}},"AWS::Budgets::BudgetsAction.Definition":{"attributes":{},"description":"The definition is where you specify all of the type-specific parameters.","properties":{"IamActionDefinition":"The AWS Identity and Access Management ( IAM ) action definition details.","ScpActionDefinition":"The service control policies (SCP) action definition details.","SsmActionDefinition":"The Amazon EC2 Systems Manager ( SSM ) action definition details."}},"AWS::Budgets::BudgetsAction.IamActionDefinition":{"attributes":{},"description":"The AWS Identity and Access Management ( IAM ) action definition details.","properties":{"Groups":"A list of groups to be attached. There must be at least one group.","PolicyArn":"The Amazon Resource Name (ARN) of the policy to be attached.","Roles":"A list of roles to be attached. There must be at least one role.","Users":"A list of users to be attached. There must be at least one user."}},"AWS::Budgets::BudgetsAction.ScpActionDefinition":{"attributes":{},"description":"The service control policies (SCP) action definition details.","properties":{"PolicyId":"The policy ID attached.","TargetIds":"A list of target IDs."}},"AWS::Budgets::BudgetsAction.SsmActionDefinition":{"attributes":{},"description":"The Amazon EC2 Systems Manager ( SSM ) action definition details.","properties":{"InstanceIds":"The EC2 and RDS instance IDs.","Region":"The Region to run the ( SSM ) document.","Subtype":"The action subType."}},"AWS::Budgets::BudgetsAction.Subscriber":{"attributes":{},"description":"The subscriber to a budget notification. The subscriber consists of a subscription type and either an Amazon SNS topic or an email address.\\n\\nFor example, an email subscriber has the following parameters:\\n\\n- A `subscriptionType` of `EMAIL`\\n- An `address` of `example@example.com`","properties":{"Address":"The address that AWS sends budget notifications to, either an SNS topic or an email.\\n\\nWhen you create a subscriber, the value of `Address` can\'t contain line breaks.","Type":"The type of notification that AWS sends to a subscriber."}},"AWS::CE::AnomalyMonitor":{"attributes":{"CreationDate":"The date when the monitor was created.","DimensionalValueCount":"The value for evaluated dimensions.","LastEvaluatedDate":"The date when the monitor last evaluated for anomalies.","LastUpdatedDate":"The date when the monitor was last updated.","MonitorArn":"The Amazon Resource Name (ARN) value for the monitor.","Ref":"`Ref` returns `MonitorArn` . For example:\\n\\n`{ \\"Ref\\": \\"myAnomalySubscriptionLogicalName\\" }`"},"description":"The `AWS::CE::AnomalyMonitor` resource is a Cost Explorer resource type that continuously inspects your account\'s cost data for anomalies, based on `MonitorType` and `MonitorSpecification` . The content consists of detailed metadata and the current status of the monitor object.","properties":{"MonitorDimension":"The dimensions to evaluate.","MonitorName":"The name of the monitor.","MonitorSpecification":"The array of `MonitorSpecification` in JSON array format. For instance, you can use `MonitorSpecification` to specify a tag, Cost Category, or linked account for your custom anomaly monitor. For further information, see the [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalymonitor.html#aws-resource-ce-anomalymonitor--examples) section of this page.","MonitorType":"The possible type values.","ResourceTags":""}},"AWS::CE::AnomalyMonitor.ResourceTag":{"attributes":{},"description":"The tag structure that contains a tag key and value.\\n\\n> Tagging is supported only for the following Cost Explorer resource types: [`AnomalyMonitor`](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_AnomalyMonitor.html) , [`AnomalySubscription`](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_AnomalySubscription.html) , [`CostCategory`](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_CostCategory.html) .","properties":{"Key":"The key that\'s associated with the tag.","Value":"The value that\'s associated with the tag."}},"AWS::CE::AnomalySubscription":{"attributes":{"AccountId":"Your unique account identifier.","Ref":"`Ref` returns `SubscriptionArn` . For example:\\n\\n`{ \\"Ref\\": \\"myAnomalyMonitorLogicalName\\" }`","SubscriptionArn":"The `AnomalySubscription` Amazon Resource Name (ARN)."},"description":"The `AWS::CE::AnomalySubscription` resource (also referred to as an alert subscription) is a Cost Explorer resource type that sends notifications about specific anomalies that meet an alerting criteria defined by you.\\n\\nYou can specify the frequency of the alerts and the subscribers to notify.\\n\\nAnomaly subscriptions can be associated with one or more [`AWS::CE::AnomalyMonitor`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalymonitor.html) resources, and they only send notifications about anomalies detected by those associated monitors. You can also configure a threshold to further control which anomalies are included in the notifications.\\n\\nAnomalies that don’t exceed the chosen threshold and therefore don’t trigger notifications from an anomaly subscription will still be available on the console and from the [`GetAnomalies`](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_GetAnomalies.html) API.","properties":{"Frequency":"The frequency that anomaly notifications are sent. Notifications are sent either over email (for DAILY and WEEKLY frequencies) or SNS (for IMMEDIATE frequency). For more information, see [Creating an Amazon SNS topic for anomaly notifications](https://docs.aws.amazon.com/cost-management/latest/userguide/ad-SNS.html) .","MonitorArnList":"A list of cost anomaly monitors.","ResourceTags":"","Subscribers":"A list of subscribers to notify.","SubscriptionName":"The name for the subscription.","Threshold":"(deprecated)\\n\\nAn absolute dollar value that must be exceeded by the anomaly\'s total impact (see [Impact](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_Impact.html) for more details) for an anomaly notification to be generated.\\n\\nThis field has been deprecated. To specify a threshold, use ThresholdExpression. Continued use of Threshold will be treated as shorthand syntax for a ThresholdExpression.\\n\\nOne of Threshold or ThresholdExpression is required for `AWS::CE::AnomalySubscription` . You cannot specify both.","ThresholdExpression":"An [Expression](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_Expression.html) object in JSON string format used to specify the anomalies that you want to generate alerts for. This supports dimensions and nested expressions. The supported dimensions are `ANOMALY_TOTAL_IMPACT_ABSOLUTE` and `ANOMALY_TOTAL_IMPACT_PERCENTAGE` , corresponding to an anomaly’s TotalImpact and TotalImpactPercentage, respectively (see [Impact](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_Impact.html) for more details). The supported nested expression types are `AND` and `OR` . The match option `GREATER_THAN_OR_EQUAL` is required. Values must be numbers between 0 and 10,000,000,000 in string format.\\n\\nOne of Threshold or ThresholdExpression is required for `AWS::CE::AnomalySubscription` . You cannot specify both.\\n\\nFor further information, see the [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalysubscription.html#aws-resource-ce-anomalysubscription--examples) section of this page."}},"AWS::CE::AnomalySubscription.ResourceTag":{"attributes":{},"description":"The tag structure that contains a tag key and value.\\n\\n> Tagging is supported only for the following Cost Explorer resource types: [`AnomalyMonitor`](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_AnomalyMonitor.html) , [`AnomalySubscription`](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_AnomalySubscription.html) , [`CostCategory`](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_CostCategory.html) .","properties":{"Key":"The key that\'s associated with the tag.","Value":"The value that\'s associated with the tag."}},"AWS::CE::AnomalySubscription.Subscriber":{"attributes":{},"description":"The recipient of `AnomalySubscription` notifications.","properties":{"Address":"The email address or SNS Topic Amazon Resource Name (ARN), depending on the `Type` .","Status":"Indicates if the subscriber accepts the notifications.","Type":"The notification delivery channel."}},"AWS::CE::CostCategory":{"attributes":{"Arn":"The unique identifier for your Cost Category.","EffectiveStart":"The Cost Category\'s effective start date.","Ref":"`Ref` returns the Arn of the Cost Category that is created by the template."},"description":"The `AWS::CE::CostCategory` resource creates groupings of cost that you can use across products in the AWS Billing and Cost Management console, such as Cost Explorer and AWS Budgets. For more information, see [Managing Your Costs with Cost Categories](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/manage-cost-categories.html) in the *AWS Billing and Cost Management User Guide* .","properties":{"DefaultValue":"The default value for the cost category.","Name":"The unique name of the Cost Category.","RuleVersion":"The rule schema version in this particular Cost Category.","Rules":"The array of CostCategoryRule in JSON array format.\\n\\n> Rules are processed in order. If there are multiple rules that match the line item, then the first rule to match is used to determine that Cost Category value.","SplitChargeRules":"The split charge rules that are used to allocate your charges between your Cost Category values."}},"AWS::CUR::ReportDefinition":{"attributes":{"Ref":"`Ref` returns\\n\\n`{ \\"Ref\\": \\"ReportName\\" }`\\n\\nThe name of the report that you want to create. The name must be unique, is case sensitive, and can\'t include spaces."},"description":"The definition of AWS Cost and Usage Report. You can specify the report name, time unit, report format, compression format, S3 bucket, additional artifacts, and schema elements in the definition.","properties":{"AdditionalArtifacts":"A list of manifests that you want AWS to create for this report.","AdditionalSchemaElements":"A list of strings that indicate additional content that AWS includes in the report, such as individual resource IDs.","BillingViewArn":"The Amazon Resource Name (ARN) of the billing view. You can get this value by using the billing view service public APIs.","Compression":"The compression format that Amazon Web Services uses for the report.","Format":"The format that Amazon Web Services saves the report in.","RefreshClosedReports":"Whether you want AWS to update your reports after they have been finalized if AWS detects charges related to previous months. These charges can include refunds, credits, or support fees.","ReportName":"The name of the report that you want to create. The name must be unique, is case sensitive, and can\'t include spaces.","ReportVersioning":"Whether you want AWS to overwrite the previous version of each report or to deliver the report in addition to the previous versions.","S3Bucket":"The S3 bucket where Amazon Web Services delivers the report.","S3Prefix":"The prefix that Amazon Web Services adds to the report name when Amazon Web Services delivers the report. Your prefix can\'t include spaces.","S3Region":"The Region of the S3 bucket that Amazon Web Services delivers the report into.","TimeUnit":"The granularity of the line items in the report."}},"AWS::Cassandra::Keyspace":{"attributes":{"Ref":"`Ref` returns the name of the keyspace. For example:\\n\\n`{ \\"Ref\\": \\"MyNewKeyspace\\" }`"},"description":"You can use the `AWS::Cassandra::Keyspace` resource to create a new keyspace in Amazon Keyspaces (for Apache Cassandra). For more information, see [Create a keyspace and a table](https://docs.aws.amazon.com/keyspaces/latest/devguide/getting-started.ddl.html) in the *Amazon Keyspaces Developer Guide* .","properties":{"KeyspaceName":"The name of the keyspace to be created. The keyspace name is case sensitive. If you don\'t specify a name, AWS CloudFormation generates a unique ID and uses that ID for the keyspace name. For more information, see [Name type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n*Length constraints:* Minimum length of 3. Maximum length of 255.\\n\\n*Pattern:* `^[a-zA-Z0-9][a-zA-Z0-9_]{1,47}$`","ReplicationSpecification":"Specifies the `ReplicationStrategy` of a keyspace. The options are:\\n\\n- `SINGLE_REGION` for a single Region keyspace (optional) or\\n- `MULTI_REGION` for a multi-Region keyspace\\n\\nIf no `ReplicationStrategy` is provided, the default is `SINGLE_REGION` . If you choose `MULTI_REGION` , you must also provide a `RegionList` with the AWS Regions that the keyspace is replicated in.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::Cassandra::Keyspace.ReplicationSpecification":{"attributes":{},"description":"You can use `ReplicationSpecification` to configure the `ReplicationStrategy` of a keyspace in Amazon Keyspaces.\\n\\nThe `ReplicationSpecification` property is `CreateOnly` and cannot be changed after the keyspace has been created. This property applies automatically to all tables in the keyspace.\\n\\nFor more information, see [Multi-Region Replication](https://docs.aws.amazon.com/keyspaces/latest/devguide/multiRegion-replication.html) in the *Amazon Keyspaces Developer Guide* .","properties":{"RegionList":"Specifies the AWS Regions that the keyspace is replicated in. You must specify at least two and up to six Regions, including the Region that the keyspace is being created in.","ReplicationStrategy":"The options are:\\n\\n- `SINGLE_REGION` (optional)\\n- `MULTI_REGION`\\n\\nIf no value is specified, the default is `SINGLE_REGION` . If `MULTI_REGION` is specified, `RegionList` is required."}},"AWS::Cassandra::Table":{"attributes":{"Ref":"`Ref` returns the name of the table and the keyspace where the table exists (delimited by \'|\'). For example:\\n\\n`{ \\"Ref\\": \\"myKeyspace|myTable\\" }`"},"description":"You can use the `AWS::Cassandra::Table` resource to create a new table in Amazon Keyspaces (for Apache Cassandra). For more information, see [Create a keyspace and a table](https://docs.aws.amazon.com/keyspaces/latest/devguide/getting-started.ddl.html) in the *Amazon Keyspaces Developer Guide* .","properties":{"BillingMode":"The billing mode for the table, which determines how you\'ll be charged for reads and writes:\\n\\n- *On-demand mode* (default) - You pay based on the actual reads and writes your application performs.\\n- *Provisioned mode* - Lets you specify the number of reads and writes per second that you need for your application.\\n\\nIf you don\'t specify a value for this property, then the table will use on-demand mode.","ClientSideTimestampsEnabled":"Enables client-side timestamps for the table. By default, the setting is disabled. You can enable client-side timestamps with the following option:\\n\\n- `status: \\"enabled\\"`\\n\\nAfter client-side timestamps are enabled for a table, you can\'t disable this setting.","ClusteringKeyColumns":"One or more columns that determine how the table data is sorted.","DefaultTimeToLive":"The default Time To Live (TTL) value for all rows in a table in seconds. The maximum configurable value is 630,720,000 seconds, which is the equivalent of 20 years. By default, the TTL value for a table is 0, which means data does not expire.\\n\\nFor more information, see [Setting the default TTL value for a table](https://docs.aws.amazon.com/keyspaces/latest/devguide/TTL-how-it-works.html#ttl-howitworks_default_ttl) in the *Amazon Keyspaces Developer Guide* .","EncryptionSpecification":"The encryption at rest options for the table.\\n\\n- *AWS owned key* (default) - The key is owned by Amazon Keyspaces.\\n- *Customer managed key* - The key is stored in your account and is created, owned, and managed by you.\\n\\n> If you choose encryption with a customer managed key, you must specify a valid customer managed KMS key with permissions granted to Amazon Keyspaces.\\n\\nFor more information, see [Encryption at rest in Amazon Keyspaces](https://docs.aws.amazon.com/keyspaces/latest/devguide/EncryptionAtRest.html) in the *Amazon Keyspaces Developer Guide* .","KeyspaceName":"The name of the keyspace to create the table in. The keyspace must already exist.","PartitionKeyColumns":"One or more columns that uniquely identify every row in the table. Every table must have a partition key.","PointInTimeRecoveryEnabled":"Specifies if point-in-time recovery is enabled or disabled for the table. The options are `PointInTimeRecoveryEnabled=true` and `PointInTimeRecoveryEnabled=false` . If not specified, the default is `PointInTimeRecoveryEnabled=false` .","RegularColumns":"One or more columns that are not part of the primary key - that is, columns that are *not* defined as partition key columns or clustering key columns.\\n\\nYou can add regular columns to existing tables by adding them to the template.","TableName":"The name of the table to be created. The table name is case sensitive. If you don\'t specify a name, AWS CloudFormation generates a unique ID and uses that ID for the table name. For more information, see [Name type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you can\'t perform updates that require replacing this resource. You can perform updates that require no interruption or some interruption. If you must replace the resource, specify a new name. \\n\\n*Length constraints:* Minimum length of 3. Maximum length of 255.\\n\\n*Pattern:* `^[a-zA-Z0-9][a-zA-Z0-9_]{1,47}$`","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::Cassandra::Table.BillingMode":{"attributes":{},"description":"Determines the billing mode for the table - on-demand or provisioned.","properties":{"Mode":"The billing mode for the table:\\n\\n- On-demand mode - `ON_DEMAND`\\n- Provisioned mode - `PROVISIONED`\\n\\n> If you choose `PROVISIONED` mode, then you also need to specify provisioned throughput (read and write capacity) for the table.\\n\\nValid values: `ON_DEMAND` | `PROVISIONED`","ProvisionedThroughput":"The provisioned read capacity and write capacity for the table. For more information, see [Provisioned throughput capacity mode](https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html#ReadWriteCapacityMode.Provisioned) in the *Amazon Keyspaces Developer Guide* ."}},"AWS::Cassandra::Table.ClusteringKeyColumn":{"attributes":{},"description":"Defines an individual column within the clustering key.","properties":{"Column":"The name and data type of this clustering key column.","OrderBy":"The order in which this column\'s data is stored:\\n\\n- `ASC` (default) - The column\'s data is stored in ascending order.\\n- `DESC` - The column\'s data is stored in descending order."}},"AWS::Cassandra::Table.Column":{"attributes":{},"description":"The name and data type of an individual column in a table.","properties":{"ColumnName":"The name of the column. For more information, see [Identifiers](https://docs.aws.amazon.com/keyspaces/latest/devguide/cql.elements.html#cql.elements.identifier) in the *Amazon Keyspaces Developer Guide* .","ColumnType":"The data type of the column. For more information, see [Data types](https://docs.aws.amazon.com/keyspaces/latest/devguide/cql.elements.html#cql.data-types) in the *Amazon Keyspaces Developer Guide* ."}},"AWS::Cassandra::Table.EncryptionSpecification":{"attributes":{},"description":"Specifies the encryption at rest option selected for the table.","properties":{"EncryptionType":"The encryption at rest options for the table.\\n\\n- *AWS owned key* (default) - `AWS_OWNED_KMS_KEY`\\n- *Customer managed key* - `CUSTOMER_MANAGED_KMS_KEY`\\n\\n> If you choose `CUSTOMER_MANAGED_KMS_KEY` , a `kms_key_identifier` in the format of a key ARN is required.\\n\\nValid values: `CUSTOMER_MANAGED_KMS_KEY` | `AWS_OWNED_KMS_KEY` .","KmsKeyIdentifier":"Requires a `kms_key_identifier` in the format of a key ARN."}},"AWS::Cassandra::Table.ProvisionedThroughput":{"attributes":{},"description":"The provisioned throughput for the table, which consists of `ReadCapacityUnits` and `WriteCapacityUnits` .","properties":{"ReadCapacityUnits":"The amount of read capacity that\'s provisioned for the table. For more information, see [Read/write capacity mode](https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html) in the *Amazon Keyspaces Developer Guide* .","WriteCapacityUnits":"The amount of write capacity that\'s provisioned for the table. For more information, see [Read/write capacity mode](https://docs.aws.amazon.com/keyspaces/latest/devguide/ReadWriteCapacityMode.html) in the *Amazon Keyspaces Developer Guide* ."}},"AWS::CertificateManager::Account":{"attributes":{"AccountId":"ID of the AWS account that owns the certificate.","Ref":"`Ref` returns the ID of the AWS account that owns the certificate."},"description":"The `AWS::CertificateManager::Account` resource defines the expiry event configuration that determines the number of days prior to expiry when ACM starts generating EventBridge events.","properties":{"ExpiryEventsConfiguration":"Object containing expiration events options associated with an AWS account . For more information, see [ExpiryEventsConfiguration](https://docs.aws.amazon.com/acm/latest/APIReference/API_ExpiryEventsConfiguration.html) in the API reference."}},"AWS::CertificateManager::Account.ExpiryEventsConfiguration":{"attributes":{},"description":"Object containing expiration events options associated with an AWS account . For more information, see [ExpiryEventsConfiguration](https://docs.aws.amazon.com/acm/latest/APIReference/API_ExpiryEventsConfiguration.html) in the API reference.","properties":{"DaysBeforeExpiry":"This option specifies the number of days prior to certificate expiration when ACM starts generating `EventBridge` events. ACM sends one event per day per certificate until the certificate expires. By default, accounts receive events starting 45 days before certificate expiration."}},"AWS::CertificateManager::Certificate":{"attributes":{"Ref":"`Ref` returns the certificate\'s Amazon Resource Name (ARN)."},"description":"The `AWS::CertificateManager::Certificate` resource requests an AWS Certificate Manager ( ACM ) certificate that you can use to enable secure connections. For example, you can deploy an ACM certificate to an Elastic Load Balancer to enable HTTPS support. For more information, see [RequestCertificate](https://docs.aws.amazon.com/acm/latest/APIReference/API_RequestCertificate.html) in the AWS Certificate Manager API Reference.\\n\\n> When you use the `AWS::CertificateManager::Certificate` resource in a CloudFormation stack, domain validation is handled automatically if all three of the following are true: The certificate domain is hosted in Amazon Route 53, the domain resides in your AWS account , and you are using DNS validation.\\n> \\n> However, if the certificate uses email validation, or if the domain is not hosted in Route 53, then the stack will remain in the `CREATE_IN_PROGRESS` state. Further stack operations are delayed until you validate the certificate request, either by acting upon the instructions in the validation email, or by adding a CNAME record to your DNS configuration. For more information, see [Option 1: DNS Validation](https://docs.aws.amazon.com/acm/latest/userguide/dns-validation.html) and [Option 2: Email Validation](https://docs.aws.amazon.com/acm/latest/userguide/email-validation.html) .","properties":{"CertificateAuthorityArn":"The Amazon Resource Name (ARN) of the private certificate authority (CA) that will be used to issue the certificate. If you do not provide an ARN and you are trying to request a private certificate, ACM will attempt to issue a public certificate. For more information about private CAs, see the [AWS Private Certificate Authority](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html) user guide. The ARN must have the following form:\\n\\n`arn:aws:acm-pca:region:account:certificate-authority/12345678-1234-1234-1234-123456789012`","CertificateTransparencyLoggingPreference":"You can opt out of certificate transparency logging by specifying the `DISABLED` option. Opt in by specifying `ENABLED` .\\n\\nIf you do not specify a certificate transparency logging preference on a new CloudFormation template, or if you remove the logging preference from an existing template, this is the same as explicitly enabling the preference.\\n\\nChanging the certificate transparency logging preference will update the existing resource by calling `UpdateCertificateOptions` on the certificate. This action will not create a new resource.","DomainName":"The fully qualified domain name (FQDN), such as www.example.com, with which you want to secure an ACM certificate. Use an asterisk (*) to create a wildcard certificate that protects several sites in the same domain. For example, `*.example.com` protects `www.example.com` , `site.example.com` , and `images.example.com.`","DomainValidationOptions":"Domain information that domain name registrars use to verify your identity.\\n\\n> In order for a AWS::CertificateManager::Certificate to be provisioned and validated in CloudFormation automatically, the `DomainName` property needs to be identical to one of the `DomainName` property supplied in DomainValidationOptions, if the ValidationMethod is **DNS**. Failing to keep them like-for-like will result in failure to create the domain validation records in Route53.","SubjectAlternativeNames":"Additional FQDNs to be included in the Subject Alternative Name extension of the ACM certificate. For example, you can add www.example.net to a certificate for which the `DomainName` field is www.example.com if users can reach your site by using either name.","Tags":"Key-value pairs that can identify the certificate.","ValidationMethod":"The method you want to use to validate that you own or control the domain associated with a public certificate. You can [validate with DNS](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-validate-dns.html) or [validate with email](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-validate-email.html) . We recommend that you use DNS validation.\\n\\nIf not specified, this property defaults to email validation."}},"AWS::CertificateManager::Certificate.DomainValidationOption":{"attributes":{},"description":"`DomainValidationOption` is a property of the [AWS::CertificateManager::Certificate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-certificate.html) resource that specifies the AWS Certificate Manager ( ACM ) certificate domain to validate. Depending on the chosen validation method, ACM checks the domain\'s DNS record for a validation CNAME, or it attempts to send a validation email message to the domain owner.","properties":{"DomainName":"A fully qualified domain name (FQDN) in the certificate request.","HostedZoneId":"The `HostedZoneId` option, which is available if you are using Route 53 as your domain registrar, causes ACM to add your CNAME to the domain record. Your list of `DomainValidationOptions` must contain one and only one of the domain-validation options, and the `HostedZoneId` can be used only when `DNS` is specified as your validation method.\\n\\nUse the Route 53 `ListHostedZones` API to discover IDs for available hosted zones.\\n\\nThis option is required for publicly trusted certificates.\\n\\n> The `ListHostedZones` API returns IDs in the format \\"/hostedzone/Z111111QQQQQQQ\\", but CloudFormation requires the IDs to be in the format \\"Z111111QQQQQQQ\\". \\n\\nWhen you change your `DomainValidationOptions` , a new resource is created.","ValidationDomain":"The domain name to which you want ACM to send validation emails. This domain name is the suffix of the email addresses that you want ACM to use. This must be the same as the `DomainName` value or a superdomain of the `DomainName` value. For example, if you request a certificate for `testing.example.com` , you can specify `example.com` as this value. In that case, ACM sends domain validation emails to the following five addresses:\\n\\n- admin@example.com\\n- administrator@example.com\\n- hostmaster@example.com\\n- postmaster@example.com\\n- webmaster@example.com"}},"AWS::Chatbot::MicrosoftTeamsChannelConfiguration":{"attributes":{"Arn":"","Ref":"When you pass the logical ID of this resource to the intrinsic Ref function, Ref returns the ARN of the configuration created."},"description":"The `AWS::Chatbot::MicrosoftTeamsChannelConfiguration` resource configures a Microsoft Teams channel to allow users to use AWS Chatbot with AWS CloudFormation templates.\\n\\nThis resource requires some setup to be done in the AWS Chatbot console. To provide the required Microsoft Teams team and tenant IDs, you must perform the initial authorization flow with Microsoft Teams in the AWS Chatbot console, then copy and paste the IDs from the console. For more details, see steps 1-4 in [Setting Up AWS Chatbot with Microsoft Teams](https://docs.aws.amazon.com/chatbot/latest/adminguide/teams-setup.html#teams-client-setup) in the *AWS Chatbot Administrator Guide* .","properties":{"ConfigurationName":"The name of the configuration.","GuardrailPolicies":"The list of IAM policy ARNs that are applied as channel guardrails. The AWS managed \'AdministratorAccess\' policy is applied as a default if this is not set.","IamRoleArn":"The ARN of the IAM role that defines the permissions for AWS Chatbot .\\n\\nThis is a user-defined role that AWS Chatbot will assume. This is not the service-linked role. For more information, see [IAM Policies for AWS Chatbot](https://docs.aws.amazon.com/chatbot/latest/adminguide/chatbot-iam-policies.html) .","LoggingLevel":"Specifies the logging level for this configuration. This property affects the log entries pushed to Amazon CloudWatch Logs.\\n\\nLogging levels include `ERROR` , `INFO` , or `NONE` .","SnsTopicArns":"The ARNs of the SNS topics that deliver notifications to AWS Chatbot .","TeamId":"The ID of the Microsoft Team authorized with AWS Chatbot .\\n\\nTo get the team ID, you must perform the initial authorization flow with Microsoft Teams in the AWS Chatbot console. Then you can copy and paste the team ID from the console. For more details, see steps 1-4 in [Get started with Microsoft Teams](https://docs.aws.amazon.com/chatbot/latest/adminguide/teams-setup.html#teams-client-setup) in the *AWS Chatbot Administrator Guide* .","TeamsChannelId":"The ID of the Microsoft Teams channel.\\n\\nTo get the channel ID, open Microsoft Teams, right click on the channel name in the left pane, then choose Copy. An example of the channel ID syntax is: `19%3ab6ef35dc342d56ba5654e6fc6d25a071%40thread.tacv2` .","TeamsTenantId":"The ID of the Microsoft Teams tenant.\\n\\nTo get the tenant ID, you must perform the initial authorization flow with Microsoft Teams in the AWS Chatbot console. Then you can copy and paste the tenant ID from the console. For more details, see steps 1-4 in [Get started with Microsoft Teams](https://docs.aws.amazon.com/chatbot/latest/adminguide/teams-setup.html#teams-client-setup) in the *AWS Chatbot Administrator Guide* .","UserRoleRequired":"Enables use of a user role requirement in your chat configuration."}},"AWS::Chatbot::SlackChannelConfiguration":{"attributes":{"Arn":"","Ref":"When you pass the logical ID of this resource to the intrinsic Ref function, Ref returns the ARN of the configuration created."},"description":"The `AWS::Chatbot::SlackChannelConfiguration` resource configures a Slack channel to allow users to use AWS Chatbot with AWS CloudFormation templates.\\n\\nThis resource requires some setup to be done in the AWS Chatbot console. To provide the required Slack workspace ID, you must perform the initial authorization flow with Slack in the AWS Chatbot console, then copy and paste the workspace ID from the console. For more details, see steps 1-4 in [Setting Up AWS Chatbot with Slack](https://docs.aws.amazon.com/chatbot/latest/adminguide/setting-up.html#Setup_intro) in the *AWS Chatbot User Guide* .","properties":{"ConfigurationName":"The name of the configuration.","GuardrailPolicies":"The list of IAM policy ARNs that are applied as channel guardrails. The AWS managed \'AdministratorAccess\' policy is applied as a default if this is not set.","IamRoleArn":"The ARN of the IAM role that defines the permissions for AWS Chatbot .\\n\\nThis is a user-defined role that AWS Chatbot will assume. This is not the service-linked role. For more information, see [IAM Policies for AWS Chatbot](https://docs.aws.amazon.com/chatbot/latest/adminguide/chatbot-iam-policies.html) .","LoggingLevel":"Specifies the logging level for this configuration. This property affects the log entries pushed to Amazon CloudWatch Logs.\\n\\nLogging levels include `ERROR` , `INFO` , or `NONE` .","SlackChannelId":"The ID of the Slack channel.\\n\\nTo get the ID, open Slack, right click on the channel name in the left pane, then choose Copy Link. The channel ID is the 9-character string at the end of the URL. For example, `ABCBBLZZZ` .","SlackWorkspaceId":"The ID of the Slack workspace authorized with AWS Chatbot .\\n\\nTo get the workspace ID, you must perform the initial authorization flow with Slack in the AWS Chatbot console. Then you can copy and paste the workspace ID from the console. For more details, see steps 1-4 in [Setting Up AWS Chatbot with Slack](https://docs.aws.amazon.com/chatbot/latest/adminguide/setting-up.html#Setup_intro) in the *AWS Chatbot User Guide* .","SnsTopicArns":"The ARNs of the SNS topics that deliver notifications to AWS Chatbot .","UserRoleRequired":"Enables use of a user role requirement in your chat configuration."}},"AWS::CleanRooms::Collaboration":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the specified collaboration.\\n\\nExample: `arn:aws:cleanrooms:us-east-1:111122223333:collaboration/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111`","CollaborationIdentifier":"Returns the unique identifier of the specified collaboration.\\n\\nExample: `a1b2c3d4-5678-90ab-cdef-EXAMPLE11111`","Ref":"`Ref` returns the `CollaborationIdentifier` , such as `a1b2c3d4-5678-90ab-cdef-EXAMPLE11111` . For example:\\n\\n`{ \\"Ref\\": \\"MyCollaboration\\" }`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates a new collaboration.","properties":{"CreatorDisplayName":"A display name of the collaboration creator.","CreatorMemberAbilities":"The abilities granted to the collaboration creator.","DataEncryptionMetadata":"The settings for client-side encryption for cryptographic computing.","Description":"A description of the collaboration provided by the collaboration owner.","Members":"A list of initial members, not including the creator. This list is immutable.","Name":"A human-readable identifier provided by the collaboration owner. Display names are not unique.","QueryLogStatus":"An indicator as to whether query logging has been enabled or disabled for the collaboration.","Tags":"An optional label that you can assign to a resource when you create it. Each tag consists of a key and an optional value, both of which you define. When you use tagging, you can also use tag-based access control in IAM policies to control access to this resource."}},"AWS::CleanRooms::Collaboration.DataEncryptionMetadata":{"attributes":{},"description":"The settings for client-side encryption for cryptographic computing.","properties":{"AllowCleartext":"Indicates whether encrypted tables can contain cleartext data (true) or are to cryptographically process every column (false).","AllowDuplicates":"Indicates whether Fingerprint columns can contain duplicate entries (true) or are to contain only non-repeated values (false).","AllowJoinsOnColumnsWithDifferentNames":"Indicates whether Fingerprint columns can be joined on any other Fingerprint column with a different name (true) or can only be joined on Fingerprint columns of the same name (false).","PreserveNulls":"Indicates whether NULL values are to be copied as NULL to encrypted tables (true) or cryptographically processed (false)."}},"AWS::CleanRooms::Collaboration.MemberSpecification":{"attributes":{},"description":"Basic metadata used to construct a new member.","properties":{"AccountId":"The identifier used to reference members of the collaboration. Currently only supports AWS account ID.","DisplayName":"The member\'s display name.","MemberAbilities":"The abilities granted to the collaboration member.\\n\\n*Allowed Values* : `CAN_QUERY` | `CAN_RECEIVE_RESULTS`"}},"AWS::CleanRooms::ConfiguredTable":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the specified configured table.\\n\\nExample: `arn:aws:cleanrooms:us-east-1:111122223333:configuredtable/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111`","ConfiguredTableIdentifier":"Returns the unique identifier of the specified configured table.\\n\\nExample: `a1b2c3d4-5678-90ab-cdef-EXAMPLE33333`","Ref":"`Ref` returns the resource name. For example:\\n\\n`{\\"Ref\\": \\"MyConfiguredTable\\"}`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates a new configured table resource.","properties":{"AllowedColumns":"The columns within the underlying AWS Glue table that can be utilized within collaborations.","AnalysisMethod":"The analysis method for the configured table. The only valid value is currently `DIRECT_QUERY`.","AnalysisRules":"The entire created analysis rule.","Description":"A description for the configured table.","Name":"A name for the configured table.","TableReference":"The AWS Glue table that this configured table represents.","Tags":"An optional label that you can assign to a resource when you create it. Each tag consists of a key and an optional value, both of which you define. When you use tagging, you can also use tag-based access control in IAM policies to control access to this resource."}},"AWS::CleanRooms::ConfiguredTable.AggregateColumn":{"attributes":{},"description":"Column in configured table that can be used in aggregate function in query.","properties":{"ColumnNames":"Column names in configured table of aggregate columns.","Function":"Aggregation function that can be applied to aggregate column in query."}},"AWS::CleanRooms::ConfiguredTable.AggregationConstraint":{"attributes":{},"description":"Constraint on query output removing output rows that do not meet a minimum number of distinct values of a specified column.","properties":{"ColumnName":"Column in aggregation constraint for which there must be a minimum number of distinct values in an output row for it to be in the query output.","Minimum":"The minimum number of distinct values that an output row must be an aggregation of. Minimum threshold of distinct values for a specified column that must exist in an output row for it to be in the query output.","Type":"The type of aggregation the constraint allows. The only valid value is currently `COUNT_DISTINCT`."}},"AWS::CleanRooms::ConfiguredTable.AnalysisRule":{"attributes":{},"description":"A specification about how data from the configured table can be used in a query.","properties":{"Policy":"A policy that describes the associated data usage limitations.","Type":"The type of analysis rule. Valid values are `AGGREGATION` and `LIST`."}},"AWS::CleanRooms::ConfiguredTable.AnalysisRuleAggregation":{"attributes":{},"description":"Enables query structure and specified queries that produce aggregate statistics.","properties":{"AggregateColumns":"The columns that query runners are allowed to use in aggregation queries.","AllowedJoinOperators":"Which logical operators (if any) are to be used in an INNER JOIN match condition. Default is `AND` .","DimensionColumns":"The columns that query runners are allowed to select, group by, or filter by.","JoinColumns":"Columns in configured table that can be used in join statements and/or as aggregate columns. They can never be outputted directly.","JoinRequired":"Control that requires member who runs query to do a join with their configured table and/or other configured table in query.","OutputConstraints":"Columns that must meet a specific threshold value (after an aggregation function is applied to it) for each output row to be returned.","ScalarFunctions":"Set of scalar functions that are allowed to be used on dimension columns and the output of aggregation of metrics."}},"AWS::CleanRooms::ConfiguredTable.AnalysisRuleList":{"attributes":{},"description":"A type of analysis rule that enables row-level analysis.","properties":{"AllowedJoinOperators":"Which logical operators (if any) are to be used in an INNER JOIN match condition. Default is `AND` .","JoinColumns":"Columns that can be used to join a configured table with the table of the member who can query and other members\' configured tables.","ListColumns":"Columns that can be listed in the output."}},"AWS::CleanRooms::ConfiguredTable.ConfiguredTableAnalysisRulePolicy":{"attributes":{},"description":"Controls on the query specifications that can be run on a configured table.","properties":{"V1":"Controls on the query specifications that can be run on a configured table."}},"AWS::CleanRooms::ConfiguredTable.ConfiguredTableAnalysisRulePolicyV1":{"attributes":{},"description":"Controls on the query specifications that can be run on a configured table.","properties":{"Aggregation":"Analysis rule type that enables only aggregation queries on a configured table.","List":"Analysis rule type that enables only list queries on a configured table."}},"AWS::CleanRooms::ConfiguredTable.GlueTableReference":{"attributes":{},"description":"A reference to a table within an AWS Glue data catalog.","properties":{"DatabaseName":"The name of the database the AWS Glue table belongs to.","TableName":"The name of the AWS Glue table."}},"AWS::CleanRooms::ConfiguredTable.TableReference":{"attributes":{},"description":"A pointer to the dataset that underlies this table. Currently, this can only be an AWS Glue table.","properties":{"Glue":"If present, a reference to the AWS Glue table referred to by this table reference."}},"AWS::CleanRooms::ConfiguredTableAssociation":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the specified configured table association.\\n\\nExample: `arn:aws:cleanrooms:us-east-1:111122223333:configuredtable/a1b2c3d4-5678-90ab-cdef-EXAMPLE33333`","ConfiguredTableAssociationIdentifier":"Returns the unique identifier of the specified configured table association.\\n\\nExample: `a1b2c3d4-5678-90ab-cdef-EXAMPLE33333`","Ref":"`Ref` returns the `ConfiguredTableAssociation` and the ID of the Membership. For example: `c1baf760-935e-4b2d-b36e-af8daaeb6e48|81a97460-2c40-46ce-a2fd-4ccda7398b2c`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates a configured table association. A configured table association links a configured table with a collaboration.","properties":{"ConfiguredTableIdentifier":"A unique identifier for the configured table to be associated to. Currently accepts a configured table ID.","Description":"A description of the configured table association.","MembershipIdentifier":"The unique ID for the membership this configured table association belongs to.","Name":"The name of the configured table association, in lowercase. The table is identified by this name when running protected queries against the underlying data.","RoleArn":"The service will assume this role to access catalog metadata and query the table.","Tags":"An optional label that you can assign to a resource when you create it. Each tag consists of a key and an optional value, both of which you define. When you use tagging, you can also use tag-based access control in IAM policies to control access to this resource."}},"AWS::CleanRooms::Membership":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the specified membership.\\n\\nExample: `arn:aws:cleanrooms:us-east-1:111122223333:membership/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111`","CollaborationArn":"Returns the Amazon Resource Name (ARN) of the specified collaboration.\\n\\nExample: `arn:aws:cleanrooms:us-east-1:111122223333:collaboration/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111`","CollaborationCreatorAccountId":"Returns the unique identifier of the specified collaboration creator account.\\n\\nExample: `a1b2c3d4-5678-90ab-cdef-EXAMPLE11111`","MembershipIdentifier":"Returns the unique identifier of the specified membership.\\n\\nExample: `a1b2c3d4-5678-90ab-cdef-EXAMPLE22222`","Ref":"`Ref` returns the `MembershipId` , such as `a1b2c3d4-5678-90ab-cdef-EXAMPLE11111` . For example:\\n\\n`{ \\"Ref\\": \\"MyMembership\\" }`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates a membership for a specific collaboration identifier and joins the collaboration.","properties":{"CollaborationIdentifier":"The unique ID for the associated collaboration.","QueryLogStatus":"An indicator as to whether query logging has been enabled or disabled for the collaboration.","Tags":"An optional label that you can assign to a resource when you create it. Each tag consists of a key and an optional value, both of which you define. When you use tagging, you can also use tag-based access control in IAM policies to control access to this resource."}},"AWS::Cloud9::EnvironmentEC2":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the development environment, such as `arn:aws:cloud9:us-east-2:123456789012:environment:2bc3642873c342e485f7e0c561234567` .","Name":"The name of the environment.","Ref":"`Ref` returns the ID of the development environment, such as `2bc3642873c342e485f7e0c561234567` ."},"description":"The `AWS::Cloud9::EnvironmentEC2` resource creates an Amazon EC2 development environment in AWS Cloud9 . For more information, see [Creating an Environment](https://docs.aws.amazon.com/cloud9/latest/user-guide/create-environment.html) in the *AWS Cloud9 User Guide* .","properties":{"AutomaticStopTimeMinutes":"The number of minutes until the running instance is shut down after the environment was last used.","ConnectionType":"The connection type used for connecting to an Amazon EC2 environment. Valid values are `CONNECT_SSH` (default) and `CONNECT_SSM` (connected through AWS Systems Manager ).","Description":"The description of the environment to create.","ImageId":"The identifier for the Amazon Machine Image (AMI) that\'s used to create the EC2 instance. To choose an AMI for the instance, you must specify a valid AMI alias or a valid AWS Systems Manager path.\\n\\nThe default AMI is used if the parameter isn\'t explicitly assigned a value in the request.\\n\\n*AMI aliases*\\n\\n- *Amazon Linux (default): `amazonlinux-1-x86_64`*\\n- Amazon Linux 2: `amazonlinux-2-x86_64`\\n- Ubuntu 18.04: `ubuntu-18.04-x86_64`\\n\\n*SSM paths*\\n\\n- *Amazon Linux (default): `resolve:ssm:/aws/service/cloud9/amis/amazonlinux-1-x86_64`*\\n- Amazon Linux 2: `resolve:ssm:/aws/service/cloud9/amis/amazonlinux-2-x86_64`\\n- Ubuntu 18.04: `resolve:ssm:/aws/service/cloud9/amis/ubuntu-18.04-x86_64`","InstanceType":"The type of instance to connect to the environment (for example, `t2.micro` ).","Name":"The name of the environment.","OwnerArn":"The Amazon Resource Name (ARN) of the environment owner. This ARN can be the ARN of any AWS Identity and Access Management principal. If this value is not specified, the ARN defaults to this environment\'s creator.","Repositories":"Any AWS CodeCommit source code repositories to be cloned into the development environment.","SubnetId":"The ID of the subnet in Amazon Virtual Private Cloud (Amazon VPC) that AWS Cloud9 will use to communicate with the Amazon Elastic Compute Cloud (Amazon EC2) instance.","Tags":"An array of key-value pairs that will be associated with the new AWS Cloud9 development environment."}},"AWS::Cloud9::EnvironmentEC2.Repository":{"attributes":{},"description":"The `Repository` property type specifies an AWS CodeCommit source code repository to be cloned into an AWS Cloud9 development environment.","properties":{"PathComponent":"The path within the development environment\'s default file system location to clone the AWS CodeCommit repository into. For example, `/REPOSITORY_NAME` would clone the repository into the `/home/USER_NAME/environment/REPOSITORY_NAME` directory in the environment.","RepositoryUrl":"The clone URL of the AWS CodeCommit repository to be cloned. For example, for an AWS CodeCommit repository this might be `https://git-codecommit.us-east-2.amazonaws.com/v1/repos/REPOSITORY_NAME` ."}},"AWS::CloudFormation::CustomResource":{"attributes":{},"description":"In a CloudFormation template, you use the `AWS::CloudFormation::CustomResource` or `Custom:: *String*` resource type to specify custom resources.\\n\\nCustom resources provide a way for you to write custom provisioning logic in CloudFormation template and have CloudFormation run it during a stack operation, such as when you create, update or delete a stack. For more information, see [Custom resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html) .\\n\\n> If you use the [VPC endpoints](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html) feature, custom resources in the VPC must have access to CloudFormation -specific Amazon Simple Storage Service ( Amazon S3 ) buckets. Custom resources must send responses to a presigned Amazon S3 URL. If they can\'t send responses to Amazon S3 , CloudFormation won\'t receive a response and the stack operation fails. For more information, see [Setting up VPC endpoints for AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-vpce-bucketnames.html) .","properties":{"ServiceToken":"> Only one property is defined by AWS for a custom resource: `ServiceToken` . All other properties are defined by the service provider. \\n\\nThe service token that was given to the template developer by the service provider to access the service, such as an Amazon SNS topic ARN or Lambda function ARN. The service token must be from the same Region in which you are creating the stack.\\n\\nUpdates aren\'t supported."}},"AWS::CloudFormation::HookDefaultVersion":{"attributes":{"Arn":"The Amazon Resource Number (ARN) of the activated extension, in this account and Region.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the resource version. For example:\\n\\n`arn:aws:cloudformation:us-west-2:012345678901:type/hook/Sample-CloudFormation-Hook/00000001`"},"description":"The `HookDefaultVersion` resource specifies the default version of the hook. The default version of the hook is used in CloudFormation operations for this AWS account and AWS Region .","properties":{"TypeName":"The name of the hook.\\n\\nYou must specify either `TypeVersionArn` , or `TypeName` and `VersionId` .","TypeVersionArn":"The version ID of the type configuration.\\n\\nYou must specify either `TypeVersionArn` , or `TypeName` and `VersionId` .","VersionId":"The version ID of the type specified.\\n\\nYou must specify either `TypeVersionArn` , or `TypeName` and `VersionId` ."}},"AWS::CloudFormation::HookTypeConfig":{"attributes":{"ConfigurationArn":"The Amazon Resource Number (ARN) of the activated hook type configuration, in this account and Region.","Ref":"`Ref` returns the ARN of the resource version. For example:\\n\\n`arn:aws:cloudformation:us-west-2:123456789012:type-configuration/hook/My-Sample-Hook/default`"},"description":"The `HookTypeConfig` resource specifies the configuration of a hook.","properties":{"Configuration":"Specifies the activated hook type configuration, in this AWS account and AWS Region .\\n\\nYou must specify either `TypeName` and `Configuration` or `TypeARN` and `Configuration` .","ConfigurationAlias":"Specifies the activated hook type configuration, in this AWS account and AWS Region .\\n\\nDefaults to `default` alias. Hook types currently support default configuration alias.","TypeArn":"The Amazon Resource Number (ARN) for the hook to set `Configuration` for.\\n\\nYou must specify either `TypeName` and `Configuration` or `TypeARN` and `Configuration` .","TypeName":"The unique name for your hook. Specifies a three-part namespace for your hook, with a recommended pattern of `Organization::Service::Hook` .\\n\\nYou must specify either `TypeName` and `Configuration` or `TypeARN` and `Configuration` ."}},"AWS::CloudFormation::HookVersion":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the hook.","IsDefaultVersion":"Whether the specified hook version is set as the default version.","Ref":"`Ref` returns the ARN of the resource version. For example:\\n\\n`arn:aws:cloudformation:us-west-2:012345678901:type/hook/Sample-CloudFormation-Hook/00000001`","TypeArn":"The Amazon Resource Number (ARN) assigned to this version of the hook.","VersionId":"The ID of this version of the hook.","Visibility":"The scope at which the resource is visible and usable in CloudFormation operations.\\n\\nValid values include:\\n\\n- `PRIVATE` : The resource is only visible and usable within the account in which it\'s registered. CloudFormation marks any resources you register as `PRIVATE` .\\n- `PUBLIC` : The resource is publicly visible and usable within any Amazon account."},"description":"The `HookVersion` resource publishes new or first hook version to the AWS CloudFormation registry.","properties":{"ExecutionRoleArn":"The Amazon Resource Name (ARN) of the task execution role that grants the hook permission.","LoggingConfig":"Contains logging configuration information for an extension.","SchemaHandlerPackage":"A URL to the Amazon S3 bucket containing the hook project package that contains the necessary files for the hook you want to register.\\n\\nFor information on generating a schema handler package for the resource you want to register, see [submit](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-type-cli-submit.html) in the *CloudFormation CLI User Guide for Extension Development* .\\n\\n> The user registering the resource must be able to access the package in the S3 bucket. That\'s, the user must have [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) permissions for the schema handler package. For more information, see [Actions, Resources, and Condition Keys for Amazon S3](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazons3.html) in the *AWS Identity and Access Management User Guide* .","TypeName":"The unique name for your hook. Specifies a three-part namespace for your hook, with a recommended pattern of `Organization::Service::Hook` .\\n\\n> The following organization namespaces are reserved and can\'t be used in your hook type names:\\n> \\n> - `Alexa`\\n> - `AMZN`\\n> - `Amazon`\\n> - `ASK`\\n> - `AWS`\\n> - `Custom`\\n> - `Dev`"}},"AWS::CloudFormation::HookVersion.LoggingConfig":{"attributes":{},"description":"The `LoggingConfig` property type specifies logging configuration information for an extension.","properties":{"LogGroupName":"The Amazon CloudWatch Logs group to which CloudFormation sends error logging information when invoking the extension\'s handlers.","LogRoleArn":"The Amazon Resource Name (ARN) of the role that CloudFormation should assume when sending log entries to CloudWatch Logs."}},"AWS::CloudFormation::Macro":{"attributes":{"Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myMacro\\" }`\\n\\nFor the macro `myMacro` , `Ref` returns the name of the macro."},"description":"The `AWS::CloudFormation::Macro` resource is a CloudFormation resource type that creates a CloudFormation macro to perform custom processing on CloudFormation templates. For more information, see [Using AWS CloudFormation macros to perform custom processing on templates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html) .","properties":{"Description":"A description of the macro.","FunctionName":"The Amazon Resource Name (ARN) of the underlying AWS Lambda function that you want AWS CloudFormation to invoke when the macro is run.","LogGroupName":"The CloudWatch Logs group to which AWS CloudFormation sends error logging information when invoking the macro\'s underlying AWS Lambda function.","LogRoleARN":"The ARN of the role AWS CloudFormation should assume when sending log entries to CloudWatch Logs .","Name":"The name of the macro. The name of the macro must be unique across all macros in the account."}},"AWS::CloudFormation::ModuleDefaultVersion":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the module version."},"description":"Specifies the default version of a module. The default version of the module will be used in CloudFormation operations for this account and Region.\\n\\nTo register a module version, use the `[AWS::CloudFormation::ModuleVersion](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-moduleversion.html)` resource.\\n\\nFor more information using modules, see [Using modules to encapsulate and reuse resource configurations](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/modules.html) and [Registering extensions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry.html#registry-register) in the *AWS CloudFormation User Guide* . For information on developing modules, see [Developing modules](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/modules.html) in the *AWS CloudFormation CLI User Guide* .","properties":{"Arn":"The Amazon Resource Name (ARN) of the module version to set as the default version.\\n\\nConditional: You must specify either `Arn` , or `ModuleName` and `VersionId` .","ModuleName":"The name of the module.\\n\\nConditional: You must specify either `Arn` , or `ModuleName` and `VersionId` .","VersionId":"The ID for the specific version of the module.\\n\\nConditional: You must specify either `Arn` , or `ModuleName` and `VersionId` ."}},"AWS::CloudFormation::ModuleVersion":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the module.","Description":"The description of the module.","DocumentationUrl":"The URL of a page providing detailed documentation for this module.","IsDefaultVersion":"Whether the specified module version is set as the default version.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the module version.","Schema":"The schema that defines the module.","TimeCreated":"When the specified module version was registered.","VersionId":"The ID of this version of the module.","Visibility":"The scope at which the module is visible and usable in CloudFormation operations.\\n\\nValid values include:\\n\\n- `PRIVATE` : The module is only visible and usable within the account in which it\'s registered.\\n- `PUBLIC` : The module is publicly visible and usable within any Amazon account."},"description":"Registers the specified version of the module with the CloudFormation service. Registering a module makes it available for use in CloudFormation templates in your AWS account and Region.\\n\\nTo specify a module version as the default version, use the `[AWS::CloudFormation::ModuleDefaultVersion](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-moduledefaultversion.html)` resource.\\n\\nFor more information using modules, see [Using modules to encapsulate and reuse resource configurations](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/modules.html) and [Registering extensions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry.html#registry-register) in the *CloudFormation User Guide* . For information on developing modules, see [Developing modules](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/modules.html) in the *CloudFormation CLI User Guide* .","properties":{"ModuleName":"The name of the module being registered.","ModulePackage":"A URL to the S3 bucket containing the package that contains the template fragment and schema files for the module version to register.\\n\\n> The user registering the module version must be able to access the module package in the S3 bucket. That\'s, the user needs to have [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) permissions for the package. For more information, see [Actions, Resources, and Condition Keys for Amazon S3](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazons3.html) in the *AWS Identity and Access Management User Guide* ."}},"AWS::CloudFormation::PublicTypeVersion":{"attributes":{"PublicTypeArn":"The Amazon Resource Number (ARN) assigned to the public extension upon publication.","PublisherId":"The publisher ID of the extension publisher.","Ref":"`Ref` returns the Amazon Resource Number (ARN) assigned to the public extension upon publication. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:cloudformation:us-east-1::type/resource/2a33349e7e606a8ad2e30e3c84521f93123456/My-Extension/2.1.3\\" }`","TypeVersionArn":"The Amazon Resource Number (ARN) assigned to this version of the extension."},"description":"Tests and publishes a registered extension as a public, third-party extension.\\n\\nCloudFormation first tests the extension to make sure it meets all necessary requirements for being published in the CloudFormation registry. If it does, CloudFormation then publishes it to the registry as a public third-party extension in this Region. Public extensions are available for use by all CloudFormation users.\\n\\n- For resource types, testing includes passing all contracts tests defined for the type.\\n- For modules, testing includes determining if the module\'s model meets all necessary requirements.\\n\\nFor more information, see [Testing your public extension prior to publishing](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension.html#publish-extension-testing) in the *CloudFormation CLI User Guide* .\\n\\nIf you don\'t specify a version, CloudFormation uses the default version of the extension in your account and Region for testing.\\n\\nTo perform testing, CloudFormation assumes the execution role specified when the type was registered.\\n\\nAn extension must have a test status of `PASSED` before it can be published. For more information, see [Publishing extensions to make them available for public use](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-type-publish.html) in the *CloudFormation CLI User Guide* .","properties":{"Arn":"The Amazon Resource Number (ARN) of the extension.\\n\\nConditional: You must specify `Arn` , or `TypeName` and `Type` .","LogDeliveryBucket":"The S3 bucket to which CloudFormation delivers the contract test execution logs.\\n\\nCloudFormation delivers the logs by the time contract testing has completed and the extension has been assigned a test type status of `PASSED` or `FAILED` .\\n\\nThe user initiating the stack operation must be able to access items in the specified S3 bucket. Specifically, the user needs the following permissions:\\n\\n- GetObject\\n- PutObject\\n\\nFor more information, see [Actions, Resources, and Condition Keys for Amazon S3](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html) in the *AWS Identity and Access Management User Guide* .","PublicVersionNumber":"The version number to assign to this version of the extension.\\n\\nUse the following format, and adhere to semantic versioning when assigning a version number to your extension:\\n\\n`MAJOR.MINOR.PATCH`\\n\\nFor more information, see [Semantic Versioning 2.0.0](https://docs.aws.amazon.com/https://semver.org/) .\\n\\nIf you don\'t specify a version number, CloudFormation increments the version number by one minor version release.\\n\\nYou cannot specify a version number the first time you publish a type. AWS CloudFormation automatically sets the first version number to be `1.0.0` .","Type":"The type of the extension to test.\\n\\nConditional: You must specify `Arn` , or `TypeName` and `Type` .","TypeName":"The name of the extension to test.\\n\\nConditional: You must specify `Arn` , or `TypeName` and `Type` ."}},"AWS::CloudFormation::Publisher":{"attributes":{"IdentityProvider":"The type of account used as the identity provider when registering this publisher with CloudFormation .\\n\\nValues include: `AWS_Marketplace` | `Bitbucket` | `GitHub` .","PublisherId":"The ID of the extension publisher. This publisher ID applies to your account in all AWS Regions .","PublisherProfile":"The URL to the publisher\'s profile with the identity provider.","PublisherStatus":"Whether the publisher is verified.","Ref":"`Ref` returns the publisher ID. For example:\\n\\n`{ \\"Ref\\": \\"2a33349e7e606a8ad2e30e3c84521f012345678\\" }`"},"description":"Registers your account as a publisher of public extensions in the CloudFormation registry. Public extensions are available for use by all CloudFormation users.\\n\\nFor information on requirements for registering as a public extension publisher, see [Registering your account to publish CloudFormation extensions](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension.html#publish-extension-prereqs) in the *CloudFormation CLI User Guide* .","properties":{"AcceptTermsAndConditions":"Whether you accept the [Terms and Conditions](https://docs.aws.amazon.com/https://cloudformation-registry-documents.s3.amazonaws.com/Terms_and_Conditions_for_AWS_CloudFormation_Registry_Publishers.pdf) for publishing extensions in the CloudFormation registry. You must accept the terms and conditions in order to register to publish public extensions to the CloudFormation registry.\\n\\nThe default is `false` .","ConnectionArn":"If you are using a Bitbucket or GitHub account for identity verification, the Amazon Resource Name (ARN) for your connection to that account.\\n\\nFor more information, see [Registering your account to publish CloudFormation extensions](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/publish-extension.html#publish-extension-prereqs) in the *CloudFormation CLI User Guide* ."}},"AWS::CloudFormation::ResourceDefaultVersion":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the resource.","Ref":"`Ref` returns the ARN of the resource type. For example:\\n\\n`arn:aws:cloudformation:us-west-2:012345678910:type/resource/Sample-CloudFormation-Resource`"},"description":"Specifies the default version of a resource. The default version of a resource will be used in CloudFormation operations.","properties":{"TypeName":"The name of the resource.\\n\\nConditional: You must specify either `TypeVersionArn` , or `TypeName` and `VersionId` .","TypeVersionArn":"The Amazon Resource Name (ARN) of the resource version.\\n\\nConditional: You must specify either `TypeVersionArn` , or `TypeName` and `VersionId` .","VersionId":"The ID of a specific version of the resource. The version ID is the value at the end of the Amazon Resource Name (ARN) assigned to the resource version when it\'s registered.\\n\\nConditional: You must specify either `TypeVersionArn` , or `TypeName` and `VersionId` ."}},"AWS::CloudFormation::ResourceVersion":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the resource version.","IsDefaultVersion":"Whether the resource version is set as the default version.","ProvisioningType":"The provisioning behavior of the resource type. CloudFormation determines the provisioning type during registration, based on the types of handlers in the schema handler package submitted.\\n\\nValid values include:\\n\\n- `FULLY_MUTABLE` : The resource type includes an update handler to process updates to the type during stack update operations.\\n- `IMMUTABLE` : The resource type doesn\'t include an update handler, so the type can\'t be updated and must instead be replaced during stack update operations.\\n- `NON_PROVISIONABLE` : The resource type doesn\'t include all the following handlers, and therefore can\'t actually be provisioned.\\n\\n- create\\n- read\\n- delete","Ref":"`Ref` returns the ARN of the resource version. For example:\\n\\n`arn:aws:cloudformation:us-west-2:012345678901:type/resource/Sample-CloudFormation-Resource/00000001`","TypeArn":"The Amazon Resource Name (ARN) of the resource.","VersionId":"The ID of a specific version of the resource. The version ID is the value at the end of the Amazon Resource Name (ARN) assigned to the resource version when it is registered.","Visibility":"The scope at which the resource is visible and usable in CloudFormation operations.\\n\\nValid values include:\\n\\n- `PRIVATE` : The resource is only visible and usable within the account in which it\'s registered. CloudFormation marks any resources you register as `PRIVATE` .\\n- `PUBLIC` : The resource is publicly visible and usable within any Amazon account."},"description":"Registers a resource version with the CloudFormation service. Registering a resource version makes it available for use in CloudFormation templates in your AWS account , and includes:\\n\\n- Validating the resource schema.\\n- Determining which handlers, if any, have been specified for the resource.\\n- Making the resource available for use in your account.\\n\\nFor more information on how to develop resources and ready them for registration, see [Creating Resource Providers](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-types.html) in the *CloudFormation CLI User Guide* .\\n\\nYou can have a maximum of 50 resource versions registered at a time. This maximum is per account and per Region.","properties":{"ExecutionRoleArn":"The Amazon Resource Name (ARN) of the IAM role for CloudFormation to assume when invoking the resource. If your resource calls AWS APIs in any of its handlers, you must create an *[IAM execution role](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)* that includes the necessary permissions to call those AWS APIs, and provision that execution role in your account. When CloudFormation needs to invoke the resource type handler, CloudFormation assumes this execution role to create a temporary session token, which it then passes to the resource type handler, thereby supplying your resource type with the appropriate credentials.","LoggingConfig":"Logging configuration information for a resource.","SchemaHandlerPackage":"A URL to the S3 bucket containing the resource project package that contains the necessary files for the resource you want to register.\\n\\nFor information on generating a schema handler package for the resource you want to register, see [submit](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-type-cli-submit.html) in the *CloudFormation CLI User Guide* .\\n\\n> The user registering the resource must be able to access the package in the S3 bucket. That is, the user needs to have [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) permissions for the schema handler package. For more information, see [Actions, Resources, and Condition Keys for Amazon S3](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazons3.html) in the *AWS Identity and Access Management User Guide* .","TypeName":"The name of the resource being registered.\\n\\nWe recommend that resource names adhere to the following pattern: *company_or_organization* :: *service* :: *type* .\\n\\n> The following organization namespaces are reserved and can\'t be used in your resource names:\\n> \\n> - `Alexa`\\n> - `AMZN`\\n> - `Amazon`\\n> - `AWS`\\n> - `Custom`\\n> - `Dev`"}},"AWS::CloudFormation::ResourceVersion.LoggingConfig":{"attributes":{},"description":"Logging configuration information for a resource.","properties":{"LogGroupName":"The Amazon CloudWatch logs group to which CloudFormation sends error logging information when invoking the type\'s handlers.","LogRoleArn":"The ARN of the role that CloudFormation should assume when sending log entries to CloudWatch logs."}},"AWS::CloudFormation::Stack":{"attributes":{"Ref":"`Ref` returns the stack ID. For example:\\n\\n`arn:aws:cloudformation:us-east-2:123456789012:stack/mystack-mynestedstack-sggfrhxhum7w/f449b250-b969-11e0-a185-5081d0136786`"},"description":"The `AWS::CloudFormation::Stack` resource nests a stack as a resource in a top-level template.\\n\\nYou can add output values from a nested stack within the containing template. You use the [GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html) function with the nested stack\'s logical name and the name of the output value in the nested stack in the format `Outputs. *NestedStackOutputName*` .\\n\\n> We strongly recommend that updates to nested stacks are run from the parent stack. \\n\\nWhen you apply template changes to update a top-level stack, CloudFormation updates the top-level stack and initiates an update to its nested stacks. CloudFormation updates the resources of modified nested stacks, but doesn\'t update the resources of unmodified nested stacks. For more information, see [CloudFormation stack updates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks.html) .\\n\\n> You must acknowledge IAM capabilities for nested stacks that contain IAM resources. Also, verify that you have cancel update stack permissions, which is required if an update rolls back. For more information about IAM and CloudFormation , see [Controlling access with AWS Identity and Access Management](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html) .","properties":{"NotificationARNs":"The Amazon Simple Notification Service (Amazon SNS) topic ARNs to publish stack related events. You can find your Amazon SNS topic ARNs using the Amazon SNS console or your Command Line Interface (CLI).","Parameters":"The set value pairs that represent the parameters passed to CloudFormation when this nested stack is created. Each parameter has a name corresponding to a parameter defined in the embedded template and a value representing the value that you want to set for the parameter.\\n\\n> If you use the `Ref` function to pass a parameter value to a nested stack, comma-delimited list parameters must be of type `String` . In other words, you can\'t pass values that are of type `CommaDelimitedList` to nested stacks. \\n\\nConditional. Required if the nested stack requires input parameters.\\n\\nWhether an update causes interruptions depends on the resources that are being updated. An update never causes a nested stack to be replaced.","Tags":"Key-value pairs to associate with this stack. AWS CloudFormation also propagates these tags to the resources created in the stack. A maximum number of 50 tags can be specified.","TemplateURL":"Location of file containing the template body. The URL must point to a template (max size: 460,800 bytes) that\'s located in an Amazon S3 bucket. For more information, see [Template anatomy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html) .\\n\\nWhether an update causes interruptions depends on the resources that are being updated. An update never causes a nested stack to be replaced.","TimeoutInMinutes":"The length of time, in minutes, that CloudFormation waits for the nested stack to reach the `CREATE_COMPLETE` state. The default is no timeout. When CloudFormation detects that the nested stack has reached the `CREATE_COMPLETE` state, it marks the nested stack resource as `CREATE_COMPLETE` in the parent stack and resumes creating the parent stack. If the timeout period expires before the nested stack reaches `CREATE_COMPLETE` , CloudFormation marks the nested stack as failed and rolls back both the nested stack and parent stack.\\n\\nUpdates aren\'t supported."}},"AWS::CloudFormation::StackSet":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the StackSetId.","StackSetId":"The ID of the stack that you\'re creating."},"description":"The `AWS::CloudFormation::StackSet` enables you to provision stacks into AWS accounts and across Regions by using a single CloudFormation template. In the stack set, you specify the template to use, in addition to any parameters and capabilities that the template requires.","properties":{"AdministrationRoleARN":"The Amazon Resource Number (ARN) of the IAM role to use to create this stack set. Specify an IAM role only if you are using customized administrator roles to control which users or groups can manage specific stack sets within the same administrator account.\\n\\nUse customized administrator roles to control which users or groups can manage specific stack sets within the same administrator account. For more information, see [Prerequisites: Granting Permissions for Stack Set Operations](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs.html) in the *AWS CloudFormation User Guide* .\\n\\n*Minimum* : `20`\\n\\n*Maximum* : `2048`","AutoDeployment":"[ `Service-managed` permissions] Describes whether StackSets automatically deploys to AWS Organizations accounts that are added to a target organization or organizational unit (OU).","CallAs":"[Service-managed permissions] Specifies whether you are acting as an account administrator in the organization\'s management account or as a delegated administrator in a member account.\\n\\nBy default, `SELF` is specified. Use `SELF` for stack sets with self-managed permissions.\\n\\n- To create a stack set with service-managed permissions while signed in to the management account, specify `SELF` .\\n- To create a stack set with service-managed permissions while signed in to a delegated administrator account, specify `DELEGATED_ADMIN` .\\n\\nYour AWS account must be registered as a delegated admin in the management account. For more information, see [Register a delegated administrator](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-orgs-delegated-admin.html) in the *AWS CloudFormation User Guide* .\\n\\nStack sets with service-managed permissions are created in the management account, including stack sets that are created by delegated administrators.\\n\\n*Valid Values* : `SELF` | `DELEGATED_ADMIN`","Capabilities":"The capabilities that are allowed in the stack set. Some stack set templates might include resources that can affect permissions in your AWS account —for example, by creating new AWS Identity and Access Management ( IAM ) users. For more information, see [Acknowledging IAM Resources in AWS CloudFormation Templates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#capabilities) .","Description":"A description of the stack set.\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `1024`","ExecutionRoleName":"The name of the IAM execution role to use to create the stack set. If you don\'t specify an execution role, AWS CloudFormation uses the `AWSCloudFormationStackSetExecutionRole` role for the stack set operation.\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `64`\\n\\n*Pattern* : `[a-zA-Z_0-9+=,.@-]+`","ManagedExecution":"Describes whether StackSets performs non-conflicting operations concurrently and queues conflicting operations.\\n\\nWhen active, StackSets performs non-conflicting operations concurrently and queues conflicting operations. After conflicting operations finish, StackSets starts queued operations in request order.\\n\\n> If there are already running or queued operations, StackSets queues all incoming operations even if they are non-conflicting.\\n> \\n> You can\'t modify your stack set\'s execution configuration while there are running or queued operations for that stack set. \\n\\nWhen inactive (default), StackSets performs one operation at a time in request order.","OperationPreferences":"The user-specified preferences for how AWS CloudFormation performs a stack set operation.","Parameters":"The input parameters for the stack set template.","PermissionModel":"Describes how the IAM roles required for stack set operations are created.\\n\\n- With `SELF_MANAGED` permissions, you must create the administrator and execution roles required to deploy to target accounts. For more information, see [Grant Self-Managed Stack Set Permissions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html) .\\n- With `SERVICE_MANAGED` permissions, StackSets automatically creates the IAM roles required to deploy to accounts managed by AWS Organizations .","StackInstancesGroup":"A group of stack instances with parameters in some specific accounts and Regions.","StackSetName":"The name to associate with the stack set. The name must be unique in the Region where you create your stack set.\\n\\n*Maximum* : `128`\\n\\n*Pattern* : `^[a-zA-Z][a-zA-Z0-9-]{0,127}$`\\n\\n> The `StackSetName` property is required.","Tags":"The key-value pairs to associate with this stack set and the stacks created from it. AWS CloudFormation also propagates these tags to supported resources that are created in the stacks. A maximum number of 50 tags can be specified.","TemplateBody":"The structure that contains the template body, with a minimum length of 1 byte and a maximum length of 51,200 bytes.\\n\\nYou must include either `TemplateURL` or `TemplateBody` in a StackSet, but you can\'t use both. Dynamic references in the `TemplateBody` may not work correctly in all cases. It\'s recommended to pass templates containing dynamic references through `TemplateUrl` instead.\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `51200`","TemplateURL":"Location of file containing the template body. The URL must point to a template (max size: 460,800 bytes) that\'s located in an Amazon S3 bucket.\\n\\nYou must include either `TemplateURL` or `TemplateBody` in a StackSet, but you can\'t use both.\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `1024`"}},"AWS::CloudFormation::StackSet.AutoDeployment":{"attributes":{},"description":"[ `Service-managed` permissions] Describes whether StackSets automatically deploys to AWS Organizations accounts that are added to a target organizational unit (OU).","properties":{"Enabled":"If set to `true` , StackSets automatically deploys additional stack instances to AWS Organizations accounts that are added to a target organization or organizational unit (OU) in the specified Regions. If an account is removed from a target organization or OU, StackSets deletes stack instances from the account in the specified Regions.","RetainStacksOnAccountRemoval":"If set to `true` , stack resources are retained when an account is removed from a target organization or OU. If set to `false` , stack resources are deleted. Specify only if `Enabled` is set to `True` ."}},"AWS::CloudFormation::StackSet.DeploymentTargets":{"attributes":{},"description":"The AWS OrganizationalUnitIds or Accounts for which to create stack instances in the specified Regions.","properties":{"AccountFilterType":"Limit deployment targets to individual accounts or include additional accounts with provided OUs.\\n\\nThe following is a list of possible values for the `AccountFilterType` operation.\\n\\n- `INTERSECTION` : StackSets deploys to the accounts specified in `Accounts` parameter.\\n- `DIFFERENCE` : StackSets excludes the accounts specified in `Accounts` parameter. This enables user to avoid certain accounts within an OU such as suspended accounts.\\n- `UNION` : StackSets includes additional accounts deployment targets.\\n\\nThis is the default value if `AccountFilterType` is not provided. This enables user to update an entire OU and individual accounts from a different OU in one request, which used to be two separate requests.\\n- `NONE` : Deploys to all the accounts in specified organizational units (OU).","Accounts":"The names of one or more AWS accounts for which you want to deploy stack set updates.\\n\\n*Pattern* : `^[0-9]{12}$`","OrganizationalUnitIds":"The organization root ID or organizational unit (OU) IDs to which StackSets deploys.\\n\\n*Pattern* : `^(ou-[a-z0-9]{4,32}-[a-z0-9]{8,32}|r-[a-z0-9]{4,32})$`"}},"AWS::CloudFormation::StackSet.ManagedExecution":{"attributes":{},"description":"Describes whether StackSets performs non-conflicting operations concurrently and queues conflicting operations.","properties":{"Active":"When `true` , StackSets performs non-conflicting operations concurrently and queues conflicting operations. After conflicting operations finish, StackSets starts queued operations in request order.\\n\\n> If there are already running or queued operations, StackSets queues all incoming operations even if they are non-conflicting.\\n> \\n> You can\'t modify your stack set\'s execution configuration while there are running or queued operations for that stack set. \\n\\nWhen `false` (default), StackSets performs one operation at a time in request order."}},"AWS::CloudFormation::StackSet.OperationPreferences":{"attributes":{},"description":"The user-specified preferences for how AWS CloudFormation performs a stack set operation. For more information on maximum concurrent accounts and failure tolerance, see [Stack set operation options](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html#stackset-ops-options) .","properties":{"FailureToleranceCount":"The number of accounts, per Region, for which this operation can fail before AWS CloudFormation stops the operation in that Region. If the operation is stopped in a Region, AWS CloudFormation doesn\'t attempt the operation in any subsequent Regions.\\n\\nConditional: You must specify either `FailureToleranceCount` or `FailureTolerancePercentage` (but not both).","FailureTolerancePercentage":"The percentage of accounts, per Region, for which this stack operation can fail before AWS CloudFormation stops the operation in that Region. If the operation is stopped in a Region, AWS CloudFormation doesn\'t attempt the operation in any subsequent Regions.\\n\\nWhen calculating the number of accounts based on the specified percentage, AWS CloudFormation rounds *down* to the next whole number.\\n\\nConditional: You must specify either `FailureToleranceCount` or `FailureTolerancePercentage` , but not both.","MaxConcurrentCount":"The maximum number of accounts in which to perform this operation at one time. This is dependent on the value of `FailureToleranceCount` . `MaxConcurrentCount` is at most one more than the `FailureToleranceCount` .\\n\\nNote that this setting lets you specify the *maximum* for operations. For large deployments, under certain circumstances the actual number of accounts acted upon concurrently may be lower due to service throttling.\\n\\nConditional: You must specify either `MaxConcurrentCount` or `MaxConcurrentPercentage` , but not both.","MaxConcurrentPercentage":"The maximum percentage of accounts in which to perform this operation at one time.\\n\\nWhen calculating the number of accounts based on the specified percentage, AWS CloudFormation rounds down to the next whole number. This is true except in cases where rounding down would result is zero. In this case, CloudFormation sets the number as one instead.\\n\\nNote that this setting lets you specify the *maximum* for operations. For large deployments, under certain circumstances the actual number of accounts acted upon concurrently may be lower due to service throttling.\\n\\nConditional: You must specify either `MaxConcurrentCount` or `MaxConcurrentPercentage` , but not both.","RegionConcurrencyType":"The concurrency type of deploying StackSets operations in Regions, could be in parallel or one Region at a time.","RegionOrder":"The order of the Regions where you want to perform the stack operation."}},"AWS::CloudFormation::StackSet.Parameter":{"attributes":{},"description":"The Parameter data type.","properties":{"ParameterKey":"The key associated with the parameter. If you don\'t specify a key and value for a particular parameter, AWS CloudFormation uses the default value that\'s specified in your template.","ParameterValue":"The input value associated with the parameter."}},"AWS::CloudFormation::StackSet.StackInstances":{"attributes":{},"description":"Stack instances in some specific accounts and Regions.","properties":{"DeploymentTargets":"The AWS `OrganizationalUnitIds` or `Accounts` for which to create stack instances in the specified Regions.","ParameterOverrides":"A list of stack set parameters whose values you want to override in the selected stack instances.","Regions":"The names of one or more Regions where you want to create stack instances using the specified AWS accounts ."}},"AWS::CloudFormation::TypeActivation":{"attributes":{"Arn":"The Amazon Resource Number (ARN) of the activated extension, in this account and Region.","Ref":"`Ref` returns the Amazon Resource Number (ARN) of the activated extension, in this account and Region.\\n\\n`{ \\"Ref\\": \\"arn:aws:cloudformation:us-east-1:123456789013:type/resource/My-Example\\" }`"},"description":"Activates a public third-party extension, making it available for use in stack templates. For more information, see [Using public extensions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry-public.html) in the *AWS CloudFormation User Guide* .\\n\\nOnce you have activated a public third-party extension in your account and Region, use [SetTypeConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_SetTypeConfiguration.html) to specify configuration properties for the extension. For more information, see [Configuring extensions at the account level](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry-register.html#registry-set-configuration) in the *CloudFormation User Guide* .","properties":{"AutoUpdate":"Whether to automatically update the extension in this account and Region when a new *minor* version is published by the extension publisher. Major versions released by the publisher must be manually updated.\\n\\nThe default is `true` .","ExecutionRoleArn":"The name of the IAM execution role to use to activate the extension.","LoggingConfig":"Specifies logging configuration information for an extension.","MajorVersion":"The major version of this extension you want to activate, if multiple major versions are available. The default is the latest major version. CloudFormation uses the latest available *minor* version of the major version selected.\\n\\nYou can specify `MajorVersion` or `VersionBump` , but not both.","PublicTypeArn":"The Amazon Resource Number (ARN) of the public extension.\\n\\nConditional: You must specify `PublicTypeArn` , or `TypeName` , `Type` , and `PublisherId` .","PublisherId":"The ID of the extension publisher.\\n\\nConditional: You must specify `PublicTypeArn` , or `TypeName` , `Type` , and `PublisherId` .","Type":"The extension type.\\n\\nConditional: You must specify `PublicTypeArn` , or `TypeName` , `Type` , and `PublisherId` .","TypeName":"The name of the extension.\\n\\nConditional: You must specify `PublicTypeArn` , or `TypeName` , `Type` , and `PublisherId` .","TypeNameAlias":"An alias to assign to the public extension, in this account and Region. If you specify an alias for the extension, CloudFormation treats the alias as the extension type name within this account and Region. You must use the alias to refer to the extension in your templates, API calls, and CloudFormation console.\\n\\nAn extension alias must be unique within a given account and Region. You can activate the same public resource multiple times in the same account and Region, using different type name aliases.","VersionBump":"Manually updates a previously-activated type to a new major or minor version, if available. You can also use this parameter to update the value of `AutoUpdate` .\\n\\n- `MAJOR` : CloudFormation updates the extension to the newest major version, if one is available.\\n- `MINOR` : CloudFormation updates the extension to the newest minor version, if one is available."}},"AWS::CloudFormation::TypeActivation.LoggingConfig":{"attributes":{},"description":"Contains logging configuration information for an extension.","properties":{"LogGroupName":"The Amazon CloudWatch Logs group to which CloudFormation sends error logging information when invoking the extension\'s handlers.","LogRoleArn":"The Amazon Resource Name (ARN) of the role that CloudFormation should assume when sending log entries to CloudWatch Logs."}},"AWS::CloudFormation::WaitCondition":{"attributes":{"Data":"A JSON object that contains the `UniqueId` and `Data` values from the wait condition signal(s) for the specified wait condition. For more information about wait condition signals, see [Wait condition signal JSON format](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-waitcondition.html#using-cfn-waitcondition-signaljson) .\\n\\nExample return value for a wait condition with 2 signals:\\n\\n`{ \\"Signal1\\" : \\"Step 1 complete.\\" , \\"Signal2\\" : \\"Step 2 complete.\\" }`","Ref":"`Ref` returns the resource name."},"description":"> For Amazon EC2 and Auto Scaling resources, we recommend that you use a `CreationPolicy` attribute instead of wait conditions. Add a CreationPolicy attribute to those resources, and use the cfn-signal helper script to signal when an instance creation process has completed successfully. \\n\\nYou can use a wait condition for situations like the following:\\n\\n- To coordinate stack resource creation with configuration actions that are external to the stack creation.\\n- To track the status of a configuration process.\\n\\nFor these situations, we recommend that you associate a [CreationPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-creationpolicy.html) attribute with the wait condition so that you don\'t have to use a wait condition handle. For more information and an example, see [Creating wait conditions in a template](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-waitcondition.html) . If you use a CreationPolicy with a wait condition, don\'t specify any of the wait condition\'s properties.\\n\\n> If you use the [VPC endpoints](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html) feature, resources in the VPC that respond to wait conditions must have access to CloudFormation , specific Amazon Simple Storage Service ( Amazon S3 ) buckets. Resources must send wait condition responses to a presigned Amazon S3 URL. If they can\'t send responses to Amazon S3 , CloudFormation won\'t receive a response and the stack operation fails. For more information, see [Setting up VPC endpoints for AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-vpce-bucketnames.html) .","properties":{"Count":"The number of success signals that CloudFormation must receive before it continues the stack creation process. When the wait condition receives the requisite number of success signals, CloudFormation resumes the creation of the stack. If the wait condition doesn\'t receive the specified number of success signals before the Timeout period expires, CloudFormation assumes that the wait condition has failed and rolls the stack back.\\n\\nUpdates aren\'t supported.","Handle":"A reference to the wait condition handle used to signal this wait condition. Use the `Ref` intrinsic function to specify an [`AWS::CloudFormation::WaitConditionHandle`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waitconditionhandle.html) resource.\\n\\nAnytime you add a `WaitCondition` resource during a stack update, you must associate the wait condition with a new WaitConditionHandle resource. Don\'t reuse an old wait condition handle that has already been defined in the template. If you reuse a wait condition handle, the wait condition might evaluate old signals from a previous create or update stack command.\\n\\nUpdates aren\'t supported.","Timeout":"The length of time (in seconds) to wait for the number of signals that the `Count` property specifies. `Timeout` is a minimum-bound property, meaning the timeout occurs no sooner than the time you specify, but can occur shortly thereafter. The maximum time that can be specified for this property is 12 hours (43200 seconds).\\n\\nUpdates aren\'t supported."}},"AWS::CloudFormation::WaitConditionHandle":{"attributes":{},"description":"> For Amazon EC2 and Auto Scaling resources, we recommend that you use a `CreationPolicy` attribute instead of wait conditions. Add a `CreationPolicy` attribute to those resources, and use the cfn-signal helper script to signal when an instance creation process has completed successfully.\\n> \\n> For more information, see [Deploying applications on Amazon EC2 with AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/deploying.applications.html) . \\n\\nThe `AWS::CloudFormation::WaitConditionHandle` type has no properties. When you reference the `WaitConditionHandle` resource by using the `Ref` function, AWS CloudFormation returns a presigned URL. You pass this URL to applications or scripts that are running on your Amazon EC2 instances to send signals to that URL. An associated `AWS::CloudFormation::WaitCondition` resource checks the URL for the required number of success signals or for a failure signal.\\n\\n> Anytime you add a `WaitCondition` resource during a stack update or update a resource with a wait condition, you must associate the wait condition with a new `WaitConditionHandle` resource. Don\'t reuse an old wait condition handle that has already been defined in the template. If you reuse a wait condition handle, the wait condition might evaluate old signals from a previous create or update stack command. > Updates aren\'t supported for this resource.","properties":{}},"AWS::CloudFront::CachePolicy":{"attributes":{"Id":"The unique identifier for the cache policy. For example: `2766f7b2-75c5-41c6-8f06-bf4303a2f2f5` .","LastModifiedTime":"The date and time when the cache policy was last modified.","Ref":"`Ref` returns the cache policy ID. For example: `2766f7b2-75c5-41c6-8f06-bf4303a2f2f5` ."},"description":"A cache policy.\\n\\nWhen it\'s attached to a cache behavior, the cache policy determines the following:\\n\\n- The values that CloudFront includes in the cache key. These values can include HTTP headers, cookies, and URL query strings. CloudFront uses the cache key to find an object in its cache that it can return to the viewer.\\n- The default, minimum, and maximum time to live (TTL) values that you want objects to stay in the CloudFront cache.\\n\\nThe headers, cookies, and query strings that are included in the cache key are also included in requests that CloudFront sends to the origin. CloudFront sends a request when it can\'t find a valid object in its cache that matches the request\'s cache key. If you want to send values to the origin but *not* include them in the cache key, use `OriginRequestPolicy` .","properties":{"CachePolicyConfig":"The cache policy configuration."}},"AWS::CloudFront::CachePolicy.CachePolicyConfig":{"attributes":{},"description":"A cache policy configuration.\\n\\nThis configuration determines the following:\\n\\n- The values that CloudFront includes in the cache key. These values can include HTTP headers, cookies, and URL query strings. CloudFront uses the cache key to find an object in its cache that it can return to the viewer.\\n- The default, minimum, and maximum time to live (TTL) values that you want objects to stay in the CloudFront cache.\\n\\nThe headers, cookies, and query strings that are included in the cache key are also included in requests that CloudFront sends to the origin. CloudFront sends a request when it can\'t find a valid object in its cache that matches the request\'s cache key. If you want to send values to the origin but *not* include them in the cache key, use `OriginRequestPolicy` .","properties":{"Comment":"A comment to describe the cache policy. The comment cannot be longer than 128 characters.","DefaultTTL":"The default amount of time, in seconds, that you want objects to stay in the CloudFront cache before CloudFront sends another request to the origin to see if the object has been updated. CloudFront uses this value as the object\'s time to live (TTL) only when the origin does *not* send `Cache-Control` or `Expires` headers with the object. For more information, see [Managing How Long Content Stays in an Edge Cache (Expiration)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) in the *Amazon CloudFront Developer Guide* .\\n\\nThe default value for this field is 86400 seconds (one day). If the value of `MinTTL` is more than 86400 seconds, then the default value for this field is the same as the value of `MinTTL` .","MaxTTL":"The maximum amount of time, in seconds, that objects stay in the CloudFront cache before CloudFront sends another request to the origin to see if the object has been updated. CloudFront uses this value only when the origin sends `Cache-Control` or `Expires` headers with the object. For more information, see [Managing How Long Content Stays in an Edge Cache (Expiration)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) in the *Amazon CloudFront Developer Guide* .\\n\\nThe default value for this field is 31536000 seconds (one year). If the value of `MinTTL` or `DefaultTTL` is more than 31536000 seconds, then the default value for this field is the same as the value of `DefaultTTL` .","MinTTL":"The minimum amount of time, in seconds, that you want objects to stay in the CloudFront cache before CloudFront sends another request to the origin to see if the object has been updated. For more information, see [Managing How Long Content Stays in an Edge Cache (Expiration)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) in the *Amazon CloudFront Developer Guide* .","Name":"A unique name to identify the cache policy.","ParametersInCacheKeyAndForwardedToOrigin":"The HTTP headers, cookies, and URL query strings to include in the cache key. The values included in the cache key are also included in requests that CloudFront sends to the origin."}},"AWS::CloudFront::CachePolicy.CookiesConfig":{"attributes":{},"description":"An object that determines whether any cookies in viewer requests (and if so, which cookies) are included in the cache key and in requests that CloudFront sends to the origin.","properties":{"CookieBehavior":"Determines whether any cookies in viewer requests are included in the cache key and in requests that CloudFront sends to the origin. Valid values are:\\n\\n- `none` – No cookies in viewer requests are included in the cache key or in requests that CloudFront sends to the origin. Even when this field is set to `none` , any cookies that are listed in an `OriginRequestPolicy` *are* included in origin requests.\\n- `whitelist` – Only the cookies in viewer requests that are listed in the `CookieNames` type are included in the cache key and in requests that CloudFront sends to the origin.\\n- `allExcept` – All cookies in viewer requests are included in the cache key and in requests that CloudFront sends to the origin, **except** for those that are listed in the `CookieNames` type, which are not included.\\n- `all` – All cookies in viewer requests are included in the cache key and in requests that CloudFront sends to the origin.","Cookies":"Contains a list of cookie names."}},"AWS::CloudFront::CachePolicy.HeadersConfig":{"attributes":{},"description":"An object that determines whether any HTTP headers (and if so, which headers) are included in the cache key and in requests that CloudFront sends to the origin.","properties":{"HeaderBehavior":"Determines whether any HTTP headers are included in the cache key and in requests that CloudFront sends to the origin. Valid values are:\\n\\n- `none` – No HTTP headers are included in the cache key or in requests that CloudFront sends to the origin. Even when this field is set to `none` , any headers that are listed in an `OriginRequestPolicy` *are* included in origin requests.\\n- `whitelist` – Only the HTTP headers that are listed in the `Headers` type are included in the cache key and in requests that CloudFront sends to the origin.","Headers":"Contains a list of HTTP header names."}},"AWS::CloudFront::CachePolicy.ParametersInCacheKeyAndForwardedToOrigin":{"attributes":{},"description":"This object determines the values that CloudFront includes in the cache key. These values can include HTTP headers, cookies, and URL query strings. CloudFront uses the cache key to find an object in its cache that it can return to the viewer.\\n\\nThe headers, cookies, and query strings that are included in the cache key are also included in requests that CloudFront sends to the origin. CloudFront sends a request when it can\'t find an object in its cache that matches the request\'s cache key. If you want to send values to the origin but *not* include them in the cache key, use `OriginRequestPolicy` .","properties":{"CookiesConfig":"An object that determines whether any cookies in viewer requests (and if so, which cookies) are included in the cache key and in requests that CloudFront sends to the origin.","EnableAcceptEncodingBrotli":"A flag that can affect whether the `Accept-Encoding` HTTP header is included in the cache key and included in requests that CloudFront sends to the origin.\\n\\nThis field is related to the `EnableAcceptEncodingGzip` field. If one or both of these fields is `true` *and* the viewer request includes the `Accept-Encoding` header, then CloudFront does the following:\\n\\n- Normalizes the value of the viewer\'s `Accept-Encoding` header\\n- Includes the normalized header in the cache key\\n- Includes the normalized header in the request to the origin, if a request is necessary\\n\\nFor more information, see [Compression support](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-policy-compressed-objects) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you set this value to `true` , and this cache behavior also has an origin request policy attached, do not include the `Accept-Encoding` header in the origin request policy. CloudFront always includes the `Accept-Encoding` header in origin requests when the value of this field is `true` , so including this header in an origin request policy has no effect.\\n\\nIf both of these fields are `false` , then CloudFront treats the `Accept-Encoding` header the same as any other HTTP header in the viewer request. By default, it\'s not included in the cache key and it\'s not included in origin requests. In this case, you can manually add `Accept-Encoding` to the headers whitelist like any other HTTP header.","EnableAcceptEncodingGzip":"A flag that can affect whether the `Accept-Encoding` HTTP header is included in the cache key and included in requests that CloudFront sends to the origin.\\n\\nThis field is related to the `EnableAcceptEncodingBrotli` field. If one or both of these fields is `true` *and* the viewer request includes the `Accept-Encoding` header, then CloudFront does the following:\\n\\n- Normalizes the value of the viewer\'s `Accept-Encoding` header\\n- Includes the normalized header in the cache key\\n- Includes the normalized header in the request to the origin, if a request is necessary\\n\\nFor more information, see [Compression support](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-policy-compressed-objects) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you set this value to `true` , and this cache behavior also has an origin request policy attached, do not include the `Accept-Encoding` header in the origin request policy. CloudFront always includes the `Accept-Encoding` header in origin requests when the value of this field is `true` , so including this header in an origin request policy has no effect.\\n\\nIf both of these fields are `false` , then CloudFront treats the `Accept-Encoding` header the same as any other HTTP header in the viewer request. By default, it\'s not included in the cache key and it\'s not included in origin requests. In this case, you can manually add `Accept-Encoding` to the headers whitelist like any other HTTP header.","HeadersConfig":"An object that determines whether any HTTP headers (and if so, which headers) are included in the cache key and in requests that CloudFront sends to the origin.","QueryStringsConfig":"An object that determines whether any URL query strings in viewer requests (and if so, which query strings) are included in the cache key and in requests that CloudFront sends to the origin."}},"AWS::CloudFront::CachePolicy.QueryStringsConfig":{"attributes":{},"description":"An object that determines whether any URL query strings in viewer requests (and if so, which query strings) are included in the cache key and in requests that CloudFront sends to the origin.","properties":{"QueryStringBehavior":"Determines whether any URL query strings in viewer requests are included in the cache key and in requests that CloudFront sends to the origin. Valid values are:\\n\\n- `none` – No query strings in viewer requests are included in the cache key or in requests that CloudFront sends to the origin. Even when this field is set to `none` , any query strings that are listed in an `OriginRequestPolicy` *are* included in origin requests.\\n- `whitelist` – Only the query strings in viewer requests that are listed in the `QueryStringNames` type are included in the cache key and in requests that CloudFront sends to the origin.\\n- `allExcept` – All query strings in viewer requests are included in the cache key and in requests that CloudFront sends to the origin, **except** those that are listed in the `QueryStringNames` type, which are not included.\\n- `all` – All query strings in viewer requests are included in the cache key and in requests that CloudFront sends to the origin.","QueryStrings":"Contains a list of query string names."}},"AWS::CloudFront::CloudFrontOriginAccessIdentity":{"attributes":{"Id":"The ID for the origin access identity, for example, `E74FTE3AJFJ256A` .","Ref":"`Ref` returns the origin access identity, such as `E15MNIMTCFKK4C` .","S3CanonicalUserId":"The Amazon S3 canonical user ID for the origin access identity, used when giving the origin access identity read permission to an object in Amazon S3. For example: `b970b42360b81c8ddbd79d2f5df0069ba9033c8a79655752abe380cd6d63ba8bcf23384d568fcf89fc49700b5e11a0fd` ."},"description":"The request to create a new origin access identity (OAI). An origin access identity is a special CloudFront user that you can associate with Amazon S3 origins, so that you can secure all or just some of your Amazon S3 content. For more information, see [Restricting Access to Amazon S3 Content by Using an Origin Access Identity](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) in the *Amazon CloudFront Developer Guide* .","properties":{"CloudFrontOriginAccessIdentityConfig":"The current configuration information for the identity."}},"AWS::CloudFront::CloudFrontOriginAccessIdentity.CloudFrontOriginAccessIdentityConfig":{"attributes":{},"description":"Origin access identity configuration. Send a `GET` request to the `/ *CloudFront API version* /CloudFront/identity ID/config` resource.","properties":{"Comment":"A comment to describe the origin access identity. The comment cannot be longer than 128 characters."}},"AWS::CloudFront::ContinuousDeploymentPolicy":{"attributes":{"Id":"The identifier of the cotinuous deployment policy.","LastModifiedTime":"The date and time when the continuous deployment policy was last modified.","Ref":"`Ref` returns the unique identifier for the continuous deployment policy."},"description":"Creates a continuous deployment policy that routes a subset of production traffic from a primary distribution to a staging distribution.\\n\\nAfter you create and update a staging distribution, you can use a continuous deployment policy to incrementally move traffic to the staging distribution. This enables you to test changes to a distribution\'s configuration before moving all of your production traffic to the new configuration.\\n\\nFor more information, see [Using CloudFront continuous deployment to safely test CDN configuration changes](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/continuous-deployment.html) in the *Amazon CloudFront Developer Guide* .","properties":{"ContinuousDeploymentPolicyConfig":"Contains the configuration for a continuous deployment policy."}},"AWS::CloudFront::ContinuousDeploymentPolicy.ContinuousDeploymentPolicyConfig":{"attributes":{},"description":"Contains the configuration for a continuous deployment policy.","properties":{"Enabled":"A Boolean that indicates whether this continuous deployment policy is enabled (in effect). When this value is `true` , this policy is enabled and in effect. When this value is `false` , this policy is not enabled and has no effect.","StagingDistributionDnsNames":"The CloudFront domain name of the staging distribution. For example: `d111111abcdef8.cloudfront.net` .","TrafficConfig":"Contains the parameters for routing production traffic from your primary to staging distributions."}},"AWS::CloudFront::ContinuousDeploymentPolicy.SessionStickinessConfig":{"attributes":{},"description":"Session stickiness provides the ability to define multiple requests from a single viewer as a single session. This prevents the potentially inconsistent experience of sending some of a given user\'s requests to your staging distribution, while others are sent to your primary distribution. Define the session duration using TTL values.","properties":{"IdleTTL":"The amount of time after which you want sessions to cease if no requests are received. Allowed values are 300–3600 seconds (5–60 minutes).","MaximumTTL":"The maximum amount of time to consider requests from the viewer as being part of the same session. Allowed values are 300–3600 seconds (5–60 minutes)."}},"AWS::CloudFront::ContinuousDeploymentPolicy.SingleHeaderConfig":{"attributes":{},"description":"Determines which HTTP requests are sent to the staging distribution.","properties":{"Header":"The request header name that you want CloudFront to send to your staging distribution. The header must contain the prefix `aws-cf-cd-` .","Value":"The request header value."}},"AWS::CloudFront::ContinuousDeploymentPolicy.SingleWeightConfig":{"attributes":{},"description":"This configuration determines the percentage of HTTP requests that are sent to the staging distribution.","properties":{"SessionStickinessConfig":"Session stickiness provides the ability to define multiple requests from a single viewer as a single session. This prevents the potentially inconsistent experience of sending some of a given user\'s requests to your staging distribution, while others are sent to your primary distribution. Define the session duration using TTL values.","Weight":"The percentage of traffic to send to a staging distribution, expressed as a decimal number between 0 and .15."}},"AWS::CloudFront::ContinuousDeploymentPolicy.TrafficConfig":{"attributes":{},"description":"The traffic configuration of your continuous deployment.","properties":{"SingleHeaderConfig":"Determines which HTTP requests are sent to the staging distribution.","SingleWeightConfig":"Contains the percentage of traffic to send to the staging distribution.","Type":"The type of traffic configuration."}},"AWS::CloudFront::Distribution":{"attributes":{"DomainName":"The domain name of the resource, such as `d111111abcdef8.cloudfront.net` .","Id":"The identifier for the distribution, for example `EDFDVBD632BHDS5` .","Ref":"`Ref` returns the CloudFront distribution ID. For example: `E27LVI50CSW06W` ."},"description":"A distribution tells CloudFront where you want content to be delivered from, and the details about how to track and manage content delivery.","properties":{"DistributionConfig":"The distribution\'s configuration.","Tags":"A complex type that contains zero or more `Tag` elements."}},"AWS::CloudFront::Distribution.CacheBehavior":{"attributes":{},"description":"A complex type that describes how CloudFront processes requests.\\n\\nYou must create at least as many cache behaviors (including the default cache behavior) as you have origins if you want CloudFront to serve objects from all of the origins. Each cache behavior specifies the one origin from which you want CloudFront to get objects. If you have two origins and only the default cache behavior, the default cache behavior will cause CloudFront to get objects from one of the origins, but the other origin is never used.\\n\\nFor the current quota (formerly known as limit) on the number of cache behaviors that you can add to a distribution, see [Quotas](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you don\'t want to specify any cache behaviors, include only an empty `CacheBehaviors` element. Don\'t include an empty `CacheBehavior` element because this is invalid.\\n\\nTo delete all cache behaviors in an existing distribution, update the distribution configuration and include only an empty `CacheBehaviors` element.\\n\\nTo add, change, or remove one or more cache behaviors, update the distribution configuration and specify all of the cache behaviors that you want to include in the updated distribution.\\n\\nFor more information about cache behaviors, see [Cache Behavior Settings](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesCacheBehavior) in the *Amazon CloudFront Developer Guide* .","properties":{"AllowedMethods":"A complex type that controls which HTTP methods CloudFront processes and forwards to your Amazon S3 bucket or your custom origin. There are three choices:\\n\\n- CloudFront forwards only `GET` and `HEAD` requests.\\n- CloudFront forwards only `GET` , `HEAD` , and `OPTIONS` requests.\\n- CloudFront forwards `GET, HEAD, OPTIONS, PUT, PATCH, POST` , and `DELETE` requests.\\n\\nIf you pick the third choice, you may need to restrict access to your Amazon S3 bucket or to your custom origin so users can\'t perform operations that you don\'t want them to. For example, you might not want users to have permissions to delete objects from your origin.","CachePolicyId":"The unique identifier of the cache policy that is attached to this cache behavior. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) or [Using the managed cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nA `CacheBehavior` must include either a `CachePolicyId` or `ForwardedValues` . We recommend that you use a `CachePolicyId` .","CachedMethods":"A complex type that controls whether CloudFront caches the response to requests using the specified HTTP methods. There are two choices:\\n\\n- CloudFront caches responses to `GET` and `HEAD` requests.\\n- CloudFront caches responses to `GET` , `HEAD` , and `OPTIONS` requests.\\n\\nIf you pick the second choice for your Amazon S3 Origin, you may need to forward Access-Control-Request-Method, Access-Control-Request-Headers, and Origin headers for the responses to be cached correctly.","Compress":"Whether you want CloudFront to automatically compress certain files for this cache behavior. If so, specify true; if not, specify false. For more information, see [Serving Compressed Files](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html) in the *Amazon CloudFront Developer Guide* .","DefaultTTL":"This field is deprecated. We recommend that you use the `DefaultTTL` field in a cache policy instead of this field. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) or [Using the managed cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nThe default amount of time that you want objects to stay in CloudFront caches before CloudFront forwards another request to your origin to determine whether the object has been updated. The value that you specify applies only when your origin does not add HTTP headers such as `Cache-Control max-age` , `Cache-Control s-maxage` , and `Expires` to objects. For more information, see [Managing How Long Content Stays in an Edge Cache (Expiration)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) in the *Amazon CloudFront Developer Guide* .","FieldLevelEncryptionId":"The value of `ID` for the field-level encryption configuration that you want CloudFront to use for encrypting specific fields of data for this cache behavior.","ForwardedValues":"This field is deprecated. We recommend that you use a cache policy or an origin request policy instead of this field. For more information, see [Working with policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/working-with-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to include values in the cache key, use a cache policy. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) or [Using the managed cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to send values to the origin but not include them in the cache key, use an origin request policy. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) or [Using the managed origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nA `CacheBehavior` must include either a `CachePolicyId` or `ForwardedValues` . We recommend that you use a `CachePolicyId` .\\n\\nA complex type that specifies how CloudFront handles query strings, cookies, and HTTP headers.","FunctionAssociations":"A list of CloudFront functions that are associated with this cache behavior. CloudFront functions must be published to the `LIVE` stage to associate them with a cache behavior.","LambdaFunctionAssociations":"A complex type that contains zero or more Lambda@Edge function associations for a cache behavior.","MaxTTL":"This field is deprecated. We recommend that you use the `MaxTTL` field in a cache policy instead of this field. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) or [Using the managed cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nThe maximum amount of time that you want objects to stay in CloudFront caches before CloudFront forwards another request to your origin to determine whether the object has been updated. The value that you specify applies only when your origin adds HTTP headers such as `Cache-Control max-age` , `Cache-Control s-maxage` , and `Expires` to objects. For more information, see [Managing How Long Content Stays in an Edge Cache (Expiration)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) in the *Amazon CloudFront Developer Guide* .","MinTTL":"This field is deprecated. We recommend that you use the `MinTTL` field in a cache policy instead of this field. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) or [Using the managed cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nThe minimum amount of time that you want objects to stay in CloudFront caches before CloudFront forwards another request to your origin to determine whether the object has been updated. For more information, see [Managing How Long Content Stays in an Edge Cache (Expiration)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) in the *Amazon CloudFront Developer Guide* .\\n\\nYou must specify `0` for `MinTTL` if you configure CloudFront to forward all headers to your origin (under `Headers` , if you specify `1` for `Quantity` and `*` for `Name` ).","OriginRequestPolicyId":"The unique identifier of the origin request policy that is attached to this cache behavior. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) or [Using the managed origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) in the *Amazon CloudFront Developer Guide* .","PathPattern":"The pattern (for example, `images/*.jpg` ) that specifies which requests to apply the behavior to. When CloudFront receives a viewer request, the requested path is compared with path patterns in the order in which cache behaviors are listed in the distribution.\\n\\n> You can optionally include a slash ( `/` ) at the beginning of the path pattern. For example, `/images/*.jpg` . CloudFront behavior is the same with or without the leading `/` . \\n\\nThe path pattern for the default cache behavior is `*` and cannot be changed. If the request for an object does not match the path pattern for any cache behaviors, CloudFront applies the behavior in the default cache behavior.\\n\\nFor more information, see [Path Pattern](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesPathPattern) in the *Amazon CloudFront Developer Guide* .","RealtimeLogConfigArn":"The Amazon Resource Name (ARN) of the real-time log configuration that is attached to this cache behavior. For more information, see [Real-time logs](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/real-time-logs.html) in the *Amazon CloudFront Developer Guide* .","ResponseHeadersPolicyId":"The identifier for a response headers policy.","SmoothStreaming":"Indicates whether you want to distribute media files in the Microsoft Smooth Streaming format using the origin that is associated with this cache behavior. If so, specify `true` ; if not, specify `false` . If you specify `true` for `SmoothStreaming` , you can still distribute other content using this cache behavior if the content matches the value of `PathPattern` .","TargetOriginId":"The value of `ID` for the origin that you want CloudFront to route requests to when they match this cache behavior.","TrustedKeyGroups":"A list of key groups that CloudFront can use to validate signed URLs or signed cookies.\\n\\nWhen a cache behavior contains trusted key groups, CloudFront requires signed URLs or signed cookies for all requests that match the cache behavior. The URLs or cookies must be signed with a private key whose corresponding public key is in the key group. The signed URL or cookie contains information about which public key CloudFront should use to verify the signature. For more information, see [Serving private content](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) in the *Amazon CloudFront Developer Guide* .","TrustedSigners":"> We recommend using `TrustedKeyGroups` instead of `TrustedSigners` . \\n\\nA list of AWS account IDs whose public keys CloudFront can use to validate signed URLs or signed cookies.\\n\\nWhen a cache behavior contains trusted signers, CloudFront requires signed URLs or signed cookies for all requests that match the cache behavior. The URLs or cookies must be signed with the private key of a CloudFront key pair in the trusted signer\'s AWS account . The signed URL or cookie contains information about which public key CloudFront should use to verify the signature. For more information, see [Serving private content](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) in the *Amazon CloudFront Developer Guide* .","ViewerProtocolPolicy":"The protocol that viewers can use to access the files in the origin specified by `TargetOriginId` when a request matches the path pattern in `PathPattern` . You can specify the following options:\\n\\n- `allow-all` : Viewers can use HTTP or HTTPS.\\n- `redirect-to-https` : If a viewer submits an HTTP request, CloudFront returns an HTTP status code of 301 (Moved Permanently) to the viewer along with the HTTPS URL. The viewer then resubmits the request using the new URL.\\n- `https-only` : If a viewer sends an HTTP request, CloudFront returns an HTTP status code of 403 (Forbidden).\\n\\nFor more information about requiring the HTTPS protocol, see [Requiring HTTPS Between Viewers and CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-https-viewers-to-cloudfront.html) in the *Amazon CloudFront Developer Guide* .\\n\\n> The only way to guarantee that viewers retrieve an object that was fetched from the origin using HTTPS is never to use any other protocol to fetch the object. If you have recently changed from HTTP to HTTPS, we recommend that you clear your objects\' cache because cached objects are protocol agnostic. That means that an edge location will return an object from the cache regardless of whether the current request protocol matches the protocol used previously. For more information, see [Managing Cache Expiration](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) in the *Amazon CloudFront Developer Guide* ."}},"AWS::CloudFront::Distribution.Cookies":{"attributes":{},"description":"This field is deprecated. We recommend that you use a cache policy or an origin request policy instead of this field.\\n\\nIf you want to include cookies in the cache key, use a cache policy. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to send cookies to the origin but not include them in the cache key, use an origin request policy. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nA complex type that specifies whether you want CloudFront to forward cookies to the origin and, if so, which ones. For more information about forwarding cookies to the origin, see [How CloudFront Forwards, Caches, and Logs Cookies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Cookies.html) in the *Amazon CloudFront Developer Guide* .","properties":{"Forward":"This field is deprecated. We recommend that you use a cache policy or an origin request policy instead of this field.\\n\\nIf you want to include cookies in the cache key, use a cache policy. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to send cookies to the origin but not include them in the cache key, use origin request policy. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nSpecifies which cookies to forward to the origin for this cache behavior: all, none, or the list of cookies specified in the `WhitelistedNames` complex type.\\n\\nAmazon S3 doesn\'t process cookies. When the cache behavior is forwarding requests to an Amazon S3 origin, specify none for the `Forward` element.","WhitelistedNames":"This field is deprecated. We recommend that you use a cache policy or an origin request policy instead of this field.\\n\\nIf you want to include cookies in the cache key, use a cache policy. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to send cookies to the origin but not include them in the cache key, use an origin request policy. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nRequired if you specify `whitelist` for the value of `Forward` . A complex type that specifies how many different cookies you want CloudFront to forward to the origin for this cache behavior and, if you want to forward selected cookies, the names of those cookies.\\n\\nIf you specify `all` or `none` for the value of `Forward` , omit `WhitelistedNames` . If you change the value of `Forward` from `whitelist` to `all` or `none` and you don\'t delete the `WhitelistedNames` element and its child elements, CloudFront deletes them automatically.\\n\\nFor the current limit on the number of cookie names that you can whitelist for each cache behavior, see [CloudFront Limits](https://docs.aws.amazon.com/general/latest/gr/xrefaws_service_limits.html#limits_cloudfront) in the *AWS General Reference* ."}},"AWS::CloudFront::Distribution.CustomErrorResponse":{"attributes":{},"description":"A complex type that controls:\\n\\n- Whether CloudFront replaces HTTP status codes in the 4xx and 5xx range with custom error messages before returning the response to the viewer.\\n- How long CloudFront caches HTTP status codes in the 4xx and 5xx range.\\n\\nFor more information about custom error pages, see [Customizing Error Responses](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html) in the *Amazon CloudFront Developer Guide* .","properties":{"ErrorCachingMinTTL":"The minimum amount of time, in seconds, that you want CloudFront to cache the HTTP status code specified in `ErrorCode` . When this time period has elapsed, CloudFront queries your origin to see whether the problem that caused the error has been resolved and the requested object is now available.\\n\\nFor more information, see [Customizing Error Responses](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html) in the *Amazon CloudFront Developer Guide* .","ErrorCode":"The HTTP status code for which you want to specify a custom error page and/or a caching duration.","ResponseCode":"The HTTP status code that you want CloudFront to return to the viewer along with the custom error page. There are a variety of reasons that you might want CloudFront to return a status code different from the status code that your origin returned to CloudFront, for example:\\n\\n- Some Internet devices (some firewalls and corporate proxies, for example) intercept HTTP 4xx and 5xx and prevent the response from being returned to the viewer. If you substitute `200` , the response typically won\'t be intercepted.\\n- If you don\'t care about distinguishing among different client errors or server errors, you can specify `400` or `500` as the `ResponseCode` for all 4xx or 5xx errors.\\n- You might want to return a `200` status code (OK) and static website so your customers don\'t know that your website is down.\\n\\nIf you specify a value for `ResponseCode` , you must also specify a value for `ResponsePagePath` .","ResponsePagePath":"The path to the custom error page that you want CloudFront to return to a viewer when your origin returns the HTTP status code specified by `ErrorCode` , for example, `/4xx-errors/403-forbidden.html` . If you want to store your objects and your custom error pages in different locations, your distribution must include a cache behavior for which the following is true:\\n\\n- The value of `PathPattern` matches the path to your custom error messages. For example, suppose you saved custom error pages for 4xx errors in an Amazon S3 bucket in a directory named `/4xx-errors` . Your distribution must include a cache behavior for which the path pattern routes requests for your custom error pages to that location, for example, `/4xx-errors/*` .\\n- The value of `TargetOriginId` specifies the value of the `ID` element for the origin that contains your custom error pages.\\n\\nIf you specify a value for `ResponsePagePath` , you must also specify a value for `ResponseCode` .\\n\\nWe recommend that you store custom error pages in an Amazon S3 bucket. If you store custom error pages on an HTTP server and the server starts to return 5xx errors, CloudFront can\'t get the files that you want to return to viewers because the origin server is unavailable."}},"AWS::CloudFront::Distribution.CustomOriginConfig":{"attributes":{},"description":"A custom origin. A custom origin is any origin that is *not* an Amazon S3 bucket, with one exception. An Amazon S3 bucket that is [configured with static website hosting](https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html) *is* a custom origin.","properties":{"HTTPPort":"The HTTP port that CloudFront uses to connect to the origin. Specify the HTTP port that the origin listens on.","HTTPSPort":"The HTTPS port that CloudFront uses to connect to the origin. Specify the HTTPS port that the origin listens on.","OriginKeepaliveTimeout":"Specifies how long, in seconds, CloudFront persists its connection to the origin. The minimum timeout is 1 second, the maximum is 60 seconds, and the default (if you don\'t specify otherwise) is 5 seconds.\\n\\nFor more information, see [Origin Keep-alive Timeout](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesOriginKeepaliveTimeout) in the *Amazon CloudFront Developer Guide* .","OriginProtocolPolicy":"Specifies the protocol (HTTP or HTTPS) that CloudFront uses to connect to the origin. Valid values are:\\n\\n- `http-only` – CloudFront always uses HTTP to connect to the origin.\\n- `match-viewer` – CloudFront connects to the origin using the same protocol that the viewer used to connect to CloudFront.\\n- `https-only` – CloudFront always uses HTTPS to connect to the origin.","OriginReadTimeout":"Specifies how long, in seconds, CloudFront waits for a response from the origin. This is also known as the *origin response timeout* . The minimum timeout is 1 second, the maximum is 60 seconds, and the default (if you don\'t specify otherwise) is 30 seconds.\\n\\nFor more information, see [Origin Response Timeout](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesOriginResponseTimeout) in the *Amazon CloudFront Developer Guide* .","OriginSSLProtocols":"Specifies the minimum SSL/TLS protocol that CloudFront uses when connecting to your origin over HTTPS. Valid values include `SSLv3` , `TLSv1` , `TLSv1.1` , and `TLSv1.2` .\\n\\nFor more information, see [Minimum Origin SSL Protocol](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesOriginSSLProtocols) in the *Amazon CloudFront Developer Guide* ."}},"AWS::CloudFront::Distribution.DefaultCacheBehavior":{"attributes":{},"description":"A complex type that describes the default cache behavior if you don\'t specify a `CacheBehavior` element or if request URLs don\'t match any of the values of `PathPattern` in `CacheBehavior` elements. You must create exactly one default cache behavior.","properties":{"AllowedMethods":"A complex type that controls which HTTP methods CloudFront processes and forwards to your Amazon S3 bucket or your custom origin. There are three choices:\\n\\n- CloudFront forwards only `GET` and `HEAD` requests.\\n- CloudFront forwards only `GET` , `HEAD` , and `OPTIONS` requests.\\n- CloudFront forwards `GET, HEAD, OPTIONS, PUT, PATCH, POST` , and `DELETE` requests.\\n\\nIf you pick the third choice, you may need to restrict access to your Amazon S3 bucket or to your custom origin so users can\'t perform operations that you don\'t want them to. For example, you might not want users to have permissions to delete objects from your origin.","CachePolicyId":"The unique identifier of the cache policy that is attached to the default cache behavior. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) or [Using the managed cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nA `DefaultCacheBehavior` must include either a `CachePolicyId` or `ForwardedValues` . We recommend that you use a `CachePolicyId` .","CachedMethods":"A complex type that controls whether CloudFront caches the response to requests using the specified HTTP methods. There are two choices:\\n\\n- CloudFront caches responses to `GET` and `HEAD` requests.\\n- CloudFront caches responses to `GET` , `HEAD` , and `OPTIONS` requests.\\n\\nIf you pick the second choice for your Amazon S3 Origin, you may need to forward Access-Control-Request-Method, Access-Control-Request-Headers, and Origin headers for the responses to be cached correctly.","Compress":"Whether you want CloudFront to automatically compress certain files for this cache behavior. If so, specify `true` ; if not, specify `false` . For more information, see [Serving Compressed Files](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html) in the *Amazon CloudFront Developer Guide* .","DefaultTTL":"This field is deprecated. We recommend that you use the `DefaultTTL` field in a cache policy instead of this field. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) or [Using the managed cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nThe default amount of time that you want objects to stay in CloudFront caches before CloudFront forwards another request to your origin to determine whether the object has been updated. The value that you specify applies only when your origin does not add HTTP headers such as `Cache-Control max-age` , `Cache-Control s-maxage` , and `Expires` to objects. For more information, see [Managing How Long Content Stays in an Edge Cache (Expiration)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) in the *Amazon CloudFront Developer Guide* .","FieldLevelEncryptionId":"The value of `ID` for the field-level encryption configuration that you want CloudFront to use for encrypting specific fields of data for the default cache behavior.","ForwardedValues":"This field is deprecated. We recommend that you use a cache policy or an origin request policy instead of this field. For more information, see [Working with policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/working-with-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to include values in the cache key, use a cache policy. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) or [Using the managed cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to send values to the origin but not include them in the cache key, use an origin request policy. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) or [Using the managed origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nA `DefaultCacheBehavior` must include either a `CachePolicyId` or `ForwardedValues` . We recommend that you use a `CachePolicyId` .\\n\\nA complex type that specifies how CloudFront handles query strings, cookies, and HTTP headers.","FunctionAssociations":"A list of CloudFront functions that are associated with this cache behavior. CloudFront functions must be published to the `LIVE` stage to associate them with a cache behavior.","LambdaFunctionAssociations":"A complex type that contains zero or more Lambda@Edge function associations for a cache behavior.","MaxTTL":"This field is deprecated. We recommend that you use the `MaxTTL` field in a cache policy instead of this field. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) or [Using the managed cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nThe maximum amount of time that you want objects to stay in CloudFront caches before CloudFront forwards another request to your origin to determine whether the object has been updated. The value that you specify applies only when your origin adds HTTP headers such as `Cache-Control max-age` , `Cache-Control s-maxage` , and `Expires` to objects. For more information, see [Managing How Long Content Stays in an Edge Cache (Expiration)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) in the *Amazon CloudFront Developer Guide* .","MinTTL":"This field is deprecated. We recommend that you use the `MinTTL` field in a cache policy instead of this field. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) or [Using the managed cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html) in the *Amazon CloudFront Developer Guide* .\\n\\nThe minimum amount of time that you want objects to stay in CloudFront caches before CloudFront forwards another request to your origin to determine whether the object has been updated. For more information, see [Managing How Long Content Stays in an Edge Cache (Expiration)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) in the *Amazon CloudFront Developer Guide* .\\n\\nYou must specify `0` for `MinTTL` if you configure CloudFront to forward all headers to your origin (under `Headers` , if you specify `1` for `Quantity` and `*` for `Name` ).","OriginRequestPolicyId":"The unique identifier of the origin request policy that is attached to the default cache behavior. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) or [Using the managed origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) in the *Amazon CloudFront Developer Guide* .","RealtimeLogConfigArn":"The Amazon Resource Name (ARN) of the real-time log configuration that is attached to this cache behavior. For more information, see [Real-time logs](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/real-time-logs.html) in the *Amazon CloudFront Developer Guide* .","ResponseHeadersPolicyId":"The identifier for a response headers policy.","SmoothStreaming":"Indicates whether you want to distribute media files in the Microsoft Smooth Streaming format using the origin that is associated with this cache behavior. If so, specify `true` ; if not, specify `false` . If you specify `true` for `SmoothStreaming` , you can still distribute other content using this cache behavior if the content matches the value of `PathPattern` .","TargetOriginId":"The value of `ID` for the origin that you want CloudFront to route requests to when they use the default cache behavior.","TrustedKeyGroups":"A list of key groups that CloudFront can use to validate signed URLs or signed cookies.\\n\\nWhen a cache behavior contains trusted key groups, CloudFront requires signed URLs or signed cookies for all requests that match the cache behavior. The URLs or cookies must be signed with a private key whose corresponding public key is in the key group. The signed URL or cookie contains information about which public key CloudFront should use to verify the signature. For more information, see [Serving private content](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) in the *Amazon CloudFront Developer Guide* .","TrustedSigners":"> We recommend using `TrustedKeyGroups` instead of `TrustedSigners` . \\n\\nA list of AWS account IDs whose public keys CloudFront can use to validate signed URLs or signed cookies.\\n\\nWhen a cache behavior contains trusted signers, CloudFront requires signed URLs or signed cookies for all requests that match the cache behavior. The URLs or cookies must be signed with the private key of a CloudFront key pair in a trusted signer\'s AWS account . The signed URL or cookie contains information about which public key CloudFront should use to verify the signature. For more information, see [Serving private content](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) in the *Amazon CloudFront Developer Guide* .","ViewerProtocolPolicy":"The protocol that viewers can use to access the files in the origin specified by `TargetOriginId` when a request matches the path pattern in `PathPattern` . You can specify the following options:\\n\\n- `allow-all` : Viewers can use HTTP or HTTPS.\\n- `redirect-to-https` : If a viewer submits an HTTP request, CloudFront returns an HTTP status code of 301 (Moved Permanently) to the viewer along with the HTTPS URL. The viewer then resubmits the request using the new URL.\\n- `https-only` : If a viewer sends an HTTP request, CloudFront returns an HTTP status code of 403 (Forbidden).\\n\\nFor more information about requiring the HTTPS protocol, see [Requiring HTTPS Between Viewers and CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-https-viewers-to-cloudfront.html) in the *Amazon CloudFront Developer Guide* .\\n\\n> The only way to guarantee that viewers retrieve an object that was fetched from the origin using HTTPS is never to use any other protocol to fetch the object. If you have recently changed from HTTP to HTTPS, we recommend that you clear your objects\' cache because cached objects are protocol agnostic. That means that an edge location will return an object from the cache regardless of whether the current request protocol matches the protocol used previously. For more information, see [Managing Cache Expiration](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) in the *Amazon CloudFront Developer Guide* ."}},"AWS::CloudFront::Distribution.DistributionConfig":{"attributes":{},"description":"A distribution configuration.","properties":{"Aliases":"A complex type that contains information about CNAMEs (alternate domain names), if any, for this distribution.","CNAMEs":"","CacheBehaviors":"A complex type that contains zero or more `CacheBehavior` elements.","Comment":"A comment to describe the distribution. The comment cannot be longer than 128 characters.","ContinuousDeploymentPolicyId":"The identifier of a continuous deployment policy. For more information, see `CreateContinuousDeploymentPolicy` .","CustomErrorResponses":"A complex type that controls the following:\\n\\n- Whether CloudFront replaces HTTP status codes in the 4xx and 5xx range with custom error messages before returning the response to the viewer.\\n- How long CloudFront caches HTTP status codes in the 4xx and 5xx range.\\n\\nFor more information about custom error pages, see [Customizing Error Responses](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html) in the *Amazon CloudFront Developer Guide* .","CustomOrigin":"","DefaultCacheBehavior":"A complex type that describes the default cache behavior if you don\'t specify a `CacheBehavior` element or if files don\'t match any of the values of `PathPattern` in `CacheBehavior` elements. You must create exactly one default cache behavior.","DefaultRootObject":"The object that you want CloudFront to request from your origin (for example, `index.html` ) when a viewer requests the root URL for your distribution ( `https://www.example.com` ) instead of an object in your distribution ( `https://www.example.com/product-description.html` ). Specifying a default root object avoids exposing the contents of your distribution.\\n\\nSpecify only the object name, for example, `index.html` . Don\'t add a `/` before the object name.\\n\\nIf you don\'t want to specify a default root object when you create a distribution, include an empty `DefaultRootObject` element.\\n\\nTo delete the default root object from an existing distribution, update the distribution configuration and include an empty `DefaultRootObject` element.\\n\\nTo replace the default root object, update the distribution configuration and specify the new object.\\n\\nFor more information about the default root object, see [Creating a Default Root Object](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html) in the *Amazon CloudFront Developer Guide* .","Enabled":"From this field, you can enable or disable the selected distribution.","HttpVersion":"(Optional) Specify the maximum HTTP version(s) that you want viewers to use to communicate with CloudFront . The default value for new distributions is `http1.1` .\\n\\nFor viewers and CloudFront to use HTTP/2, viewers must support TLSv1.2 or later, and must support Server Name Indication (SNI).\\n\\nFor viewers and CloudFront to use HTTP/3, viewers must support TLSv1.3 and Server Name Indication (SNI). CloudFront supports HTTP/3 connection migration to allow the viewer to switch networks without losing connection. For more information about connection migration, see [Connection Migration](https://docs.aws.amazon.com/https://www.rfc-editor.org/rfc/rfc9000.html#name-connection-migration) at RFC 9000. For more information about supported TLSv1.3 ciphers, see [Supported protocols and ciphers between viewers and CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/secure-connections-supported-viewer-protocols-ciphers.html) .","IPV6Enabled":"If you want CloudFront to respond to IPv6 DNS requests with an IPv6 address for your distribution, specify `true` . If you specify `false` , CloudFront responds to IPv6 DNS requests with the DNS response code `NOERROR` and with no IP addresses. This allows viewers to submit a second request, for an IPv4 address for your distribution.\\n\\nIn general, you should enable IPv6 if you have users on IPv6 networks who want to access your content. However, if you\'re using signed URLs or signed cookies to restrict access to your content, and if you\'re using a custom policy that includes the `IpAddress` parameter to restrict the IP addresses that can access your content, don\'t enable IPv6. If you want to restrict access to some content by IP address and not restrict access to other content (or restrict access but not by IP address), you can create two distributions. For more information, see [Creating a Signed URL Using a Custom Policy](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you\'re using an Amazon Route 53 AWS Integration alias resource record set to route traffic to your CloudFront distribution, you need to create a second alias resource record set when both of the following are true:\\n\\n- You enable IPv6 for the distribution\\n- You\'re using alternate domain names in the URLs for your objects\\n\\nFor more information, see [Routing Traffic to an Amazon CloudFront Web Distribution by Using Your Domain Name](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-cloudfront-distribution.html) in the *Amazon Route 53 AWS Integration Developer Guide* .\\n\\nIf you created a CNAME resource record set, either with Amazon Route 53 AWS Integration or with another DNS service, you don\'t need to make any changes. A CNAME record will route traffic to your distribution regardless of the IP address format of the viewer request.","Logging":"A complex type that controls whether access logs are written for the distribution.\\n\\nFor more information about logging, see [Access Logs](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html) in the *Amazon CloudFront Developer Guide* .","OriginGroups":"A complex type that contains information about origin groups for this distribution.","Origins":"A complex type that contains information about origins for this distribution.","PriceClass":"The price class that corresponds with the maximum price that you want to pay for CloudFront service. If you specify `PriceClass_All` , CloudFront responds to requests for your objects from all CloudFront edge locations.\\n\\nIf you specify a price class other than `PriceClass_All` , CloudFront serves your objects from the CloudFront edge location that has the lowest latency among the edge locations in your price class. Viewers who are in or near regions that are excluded from your specified price class may encounter slower performance.\\n\\nFor more information about price classes, see [Choosing the Price Class for a CloudFront Distribution](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PriceClass.html) in the *Amazon CloudFront Developer Guide* . For information about CloudFront pricing, including how price classes (such as Price Class 100) map to CloudFront regions, see [Amazon CloudFront Pricing](https://docs.aws.amazon.com/cloudfront/pricing/) .","Restrictions":"A complex type that identifies ways in which you want to restrict distribution of your content.","S3Origin":"","Staging":"A Boolean that indicates whether this is a staging distribution. When this value is `true` , this is a staging distribution. When this value is `false` , this is not a staging distribution.","ViewerCertificate":"A complex type that determines the distribution\'s SSL/TLS configuration for communicating with viewers.","WebACLId":"A unique identifier that specifies the AWS WAF web ACL, if any, to associate with this distribution. To specify a web ACL created using the latest version of AWS WAF , use the ACL ARN, for example `arn:aws:wafv2:us-east-1:123456789012:global/webacl/ExampleWebACL/473e64fd-f30b-4765-81a0-62ad96dd167a` . To specify a web ACL created using AWS WAF Classic, use the ACL ID, for example `473e64fd-f30b-4765-81a0-62ad96dd167a` .\\n\\nAWS WAF is a web application firewall that lets you monitor the HTTP and HTTPS requests that are forwarded to CloudFront, and lets you control access to your content. Based on conditions that you specify, such as the IP addresses that requests originate from or the values of query strings, CloudFront responds to requests either with the requested content or with an HTTP 403 status code (Forbidden). You can also configure CloudFront to return a custom error page when a request is blocked. For more information about AWS WAF , see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/what-is-aws-waf.html) ."}},"AWS::CloudFront::Distribution.ForwardedValues":{"attributes":{},"description":"This field is deprecated. We recommend that you use a cache policy or an origin request policy instead of this field.\\n\\nIf you want to include values in the cache key, use a cache policy. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to send values to the origin but not include them in the cache key, use an origin request policy. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nA complex type that specifies how CloudFront handles query strings, cookies, and HTTP headers.","properties":{"Cookies":"This field is deprecated. We recommend that you use a cache policy or an origin request policy instead of this field.\\n\\nIf you want to include cookies in the cache key, use a cache policy. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to send cookies to the origin but not include them in the cache key, use an origin request policy. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nA complex type that specifies whether you want CloudFront to forward cookies to the origin and, if so, which ones. For more information about forwarding cookies to the origin, see [How CloudFront Forwards, Caches, and Logs Cookies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Cookies.html) in the *Amazon CloudFront Developer Guide* .","Headers":"This field is deprecated. We recommend that you use a cache policy or an origin request policy instead of this field.\\n\\nIf you want to include headers in the cache key, use a cache policy. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to send headers to the origin but not include them in the cache key, use an origin request policy. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nA complex type that specifies the `Headers` , if any, that you want CloudFront to forward to the origin for this cache behavior (whitelisted headers). For the headers that you specify, CloudFront also caches separate versions of a specified object that is based on the header values in viewer requests.\\n\\nFor more information, see [Caching Content Based on Request Headers](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html) in the *Amazon CloudFront Developer Guide* .","QueryString":"This field is deprecated. We recommend that you use a cache policy or an origin request policy instead of this field.\\n\\nIf you want to include query strings in the cache key, use a cache policy. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to send query strings to the origin but not include them in the cache key, use an origin request policy. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nIndicates whether you want CloudFront to forward query strings to the origin that is associated with this cache behavior and cache based on the query string parameters. CloudFront behavior depends on the value of `QueryString` and on the values that you specify for `QueryStringCacheKeys` , if any:\\n\\nIf you specify true for `QueryString` and you don\'t specify any values for `QueryStringCacheKeys` , CloudFront forwards all query string parameters to the origin and caches based on all query string parameters. Depending on how many query string parameters and values you have, this can adversely affect performance because CloudFront must forward more requests to the origin.\\n\\nIf you specify true for `QueryString` and you specify one or more values for `QueryStringCacheKeys` , CloudFront forwards all query string parameters to the origin, but it only caches based on the query string parameters that you specify.\\n\\nIf you specify false for `QueryString` , CloudFront doesn\'t forward any query string parameters to the origin, and doesn\'t cache based on query string parameters.\\n\\nFor more information, see [Configuring CloudFront to Cache Based on Query String Parameters](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/QueryStringParameters.html) in the *Amazon CloudFront Developer Guide* .","QueryStringCacheKeys":"This field is deprecated. We recommend that you use a cache policy or an origin request policy instead of this field.\\n\\nIf you want to include query strings in the cache key, use a cache policy. For more information, see [Creating cache policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html#cache-key-create-cache-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nIf you want to send query strings to the origin but not include them in the cache key, use an origin request policy. For more information, see [Creating origin request policies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.html#origin-request-create-origin-request-policy) in the *Amazon CloudFront Developer Guide* .\\n\\nA complex type that contains information about the query string parameters that you want CloudFront to use for caching for this cache behavior."}},"AWS::CloudFront::Distribution.FunctionAssociation":{"attributes":{},"description":"A CloudFront function that is associated with a cache behavior in a CloudFront distribution.","properties":{"EventType":"The event type of the function, either `viewer-request` or `viewer-response` . You cannot use origin-facing event types ( `origin-request` and `origin-response` ) with a CloudFront function.","FunctionARN":"The Amazon Resource Name (ARN) of the function."}},"AWS::CloudFront::Distribution.GeoRestriction":{"attributes":{},"description":"A complex type that controls the countries in which your content is distributed. CloudFront determines the location of your users using `MaxMind` GeoIP databases. To disable geo restriction, remove the [Restrictions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-restrictions) property from your stack template.","properties":{"Locations":"A complex type that contains a `Location` element for each country in which you want CloudFront either to distribute your content ( `whitelist` ) or not distribute your content ( `blacklist` ).\\n\\nThe `Location` element is a two-letter, uppercase country code for a country that you want to include in your `blacklist` or `whitelist` . Include one `Location` element for each country.\\n\\nCloudFront and `MaxMind` both use `ISO 3166` country codes. For the current list of countries and the corresponding codes, see `ISO 3166-1-alpha-2` code on the *International Organization for Standardization* website. You can also refer to the country list on the CloudFront console, which includes both country names and codes.","RestrictionType":"The method that you want to use to restrict distribution of your content by country:\\n\\n- `none` : No geo restriction is enabled, meaning access to content is not restricted by client geo location.\\n- `blacklist` : The `Location` elements specify the countries in which you don\'t want CloudFront to distribute your content.\\n- `whitelist` : The `Location` elements specify the countries in which you want CloudFront to distribute your content."}},"AWS::CloudFront::Distribution.LambdaFunctionAssociation":{"attributes":{},"description":"A complex type that contains a Lambda@Edge function association.","properties":{"EventType":"Specifies the event type that triggers a Lambda@Edge function invocation. You can specify the following values:\\n\\n- `viewer-request` : The function executes when CloudFront receives a request from a viewer and before it checks to see whether the requested object is in the edge cache.\\n- `origin-request` : The function executes only when CloudFront sends a request to your origin. When the requested object is in the edge cache, the function doesn\'t execute.\\n- `origin-response` : The function executes after CloudFront receives a response from the origin and before it caches the object in the response. When the requested object is in the edge cache, the function doesn\'t execute.\\n- `viewer-response` : The function executes before CloudFront returns the requested object to the viewer. The function executes regardless of whether the object was already in the edge cache.\\n\\nIf the origin returns an HTTP status code other than HTTP 200 (OK), the function doesn\'t execute.","IncludeBody":"A flag that allows a Lambda@Edge function to have read access to the body content. For more information, see [Accessing the Request Body by Choosing the Include Body Option](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-include-body-access.html) in the Amazon CloudFront Developer Guide.","LambdaFunctionARN":"The ARN of the Lambda@Edge function. You must specify the ARN of a function version; you can\'t specify an alias or $LATEST."}},"AWS::CloudFront::Distribution.LegacyCustomOrigin":{"attributes":{},"description":"","properties":{"DNSName":"","HTTPPort":"","HTTPSPort":"","OriginProtocolPolicy":"","OriginSSLProtocols":""}},"AWS::CloudFront::Distribution.LegacyS3Origin":{"attributes":{},"description":"","properties":{"DNSName":"","OriginAccessIdentity":""}},"AWS::CloudFront::Distribution.Logging":{"attributes":{},"description":"A complex type that controls whether access logs are written for the distribution.","properties":{"Bucket":"The Amazon S3 bucket to store the access logs in, for example, `myawslogbucket.s3.amazonaws.com` .","IncludeCookies":"Specifies whether you want CloudFront to include cookies in access logs, specify `true` for `IncludeCookies` . If you choose to include cookies in logs, CloudFront logs all cookies regardless of how you configure the cache behaviors for this distribution. If you don\'t want to include cookies when you create a distribution or if you want to disable include cookies for an existing distribution, specify `false` for `IncludeCookies` .","Prefix":"An optional string that you want CloudFront to prefix to the access log `filenames` for this distribution, for example, `myprefix/` . If you want to enable logging, but you don\'t want to specify a prefix, you still must include an empty `Prefix` element in the `Logging` element."}},"AWS::CloudFront::Distribution.Origin":{"attributes":{},"description":"An origin.\\n\\nAn origin is the location where content is stored, and from which CloudFront gets content to serve to viewers. To specify an origin:\\n\\n- Use `S3OriginConfig` to specify an Amazon S3 bucket that is not configured with static website hosting.\\n- Use `CustomOriginConfig` to specify all other kinds of origins, including:\\n\\n- An Amazon S3 bucket that is configured with static website hosting\\n- An Elastic Load Balancing load balancer\\n- An AWS Elemental MediaPackage endpoint\\n- An AWS Elemental MediaStore container\\n- Any other HTTP server, running on an Amazon EC2 instance or any other kind of host\\n\\nFor the current maximum number of origins that you can specify per distribution, see [General Quotas on Web Distributions](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html#limits-web-distributions) in the *Amazon CloudFront Developer Guide* (quotas were formerly referred to as limits).","properties":{"ConnectionAttempts":"The number of times that CloudFront attempts to connect to the origin. The minimum number is 1, the maximum is 3, and the default (if you don\'t specify otherwise) is 3.\\n\\nFor a custom origin (including an Amazon S3 bucket that\'s configured with static website hosting), this value also specifies the number of times that CloudFront attempts to get a response from the origin, in the case of an [Origin Response Timeout](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesOriginResponseTimeout) .\\n\\nFor more information, see [Origin Connection Attempts](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#origin-connection-attempts) in the *Amazon CloudFront Developer Guide* .","ConnectionTimeout":"The number of seconds that CloudFront waits when trying to establish a connection to the origin. The minimum timeout is 1 second, the maximum is 10 seconds, and the default (if you don\'t specify otherwise) is 10 seconds.\\n\\nFor more information, see [Origin Connection Timeout](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#origin-connection-timeout) in the *Amazon CloudFront Developer Guide* .","CustomOriginConfig":"Use this type to specify an origin that is not an Amazon S3 bucket, with one exception. If the Amazon S3 bucket is configured with static website hosting, use this type. If the Amazon S3 bucket is not configured with static website hosting, use the `S3OriginConfig` type instead.","DomainName":"The domain name for the origin.\\n\\nFor more information, see [Origin Domain Name](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesDomainName) in the *Amazon CloudFront Developer Guide* .","Id":"A unique identifier for the origin. This value must be unique within the distribution.\\n\\nUse this value to specify the `TargetOriginId` in a `CacheBehavior` or `DefaultCacheBehavior` .","OriginAccessControlId":"The unique identifier of an origin access control for this origin.\\n\\nFor more information, see [Restricting access to an Amazon S3 origin](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) in the *Amazon CloudFront Developer Guide* .","OriginCustomHeaders":"A list of HTTP header names and values that CloudFront adds to the requests that it sends to the origin.\\n\\nFor more information, see [Adding Custom Headers to Origin Requests](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/add-origin-custom-headers.html) in the *Amazon CloudFront Developer Guide* .","OriginPath":"An optional path that CloudFront appends to the origin domain name when CloudFront requests content from the origin.\\n\\nFor more information, see [Origin Path](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesOriginPath) in the *Amazon CloudFront Developer Guide* .","OriginShield":"CloudFront Origin Shield. Using Origin Shield can help reduce the load on your origin.\\n\\nFor more information, see [Using Origin Shield](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/origin-shield.html) in the *Amazon CloudFront Developer Guide* .","S3OriginConfig":"Use this type to specify an origin that is an Amazon S3 bucket that is not configured with static website hosting. To specify any other type of origin, including an Amazon S3 bucket that is configured with static website hosting, use the `CustomOriginConfig` type instead."}},"AWS::CloudFront::Distribution.OriginCustomHeader":{"attributes":{},"description":"A complex type that contains `HeaderName` and `HeaderValue` elements, if any, for this distribution.","properties":{"HeaderName":"The name of a header that you want CloudFront to send to your origin. For more information, see [Adding Custom Headers to Origin Requests](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html) in the *Amazon CloudFront Developer Guide* .","HeaderValue":"The value for the header that you specified in the `HeaderName` field."}},"AWS::CloudFront::Distribution.OriginGroup":{"attributes":{},"description":"An origin group includes two origins (a primary origin and a second origin to failover to) and a failover criteria that you specify. You create an origin group to support origin failover in CloudFront. When you create or update a distribution, you can specifiy the origin group instead of a single origin, and CloudFront will failover from the primary origin to the second origin under the failover conditions that you\'ve chosen.","properties":{"FailoverCriteria":"A complex type that contains information about the failover criteria for an origin group.","Id":"The origin group\'s ID.","Members":"A complex type that contains information about the origins in an origin group."}},"AWS::CloudFront::Distribution.OriginGroupFailoverCriteria":{"attributes":{},"description":"A complex data type that includes information about the failover criteria for an origin group, including the status codes for which CloudFront will failover from the primary origin to the second origin.","properties":{"StatusCodes":"The status codes that, when returned from the primary origin, will trigger CloudFront to failover to the second origin."}},"AWS::CloudFront::Distribution.OriginGroupMember":{"attributes":{},"description":"An origin in an origin group.","properties":{"OriginId":"The ID for an origin in an origin group."}},"AWS::CloudFront::Distribution.OriginGroupMembers":{"attributes":{},"description":"A complex data type for the origins included in an origin group.","properties":{"Items":"Items (origins) in an origin group.","Quantity":"The number of origins in an origin group."}},"AWS::CloudFront::Distribution.OriginGroups":{"attributes":{},"description":"A complex data type for the origin groups specified for a distribution.","properties":{"Items":"The items (origin groups) in a distribution.","Quantity":"The number of origin groups."}},"AWS::CloudFront::Distribution.OriginShield":{"attributes":{},"description":"CloudFront Origin Shield.\\n\\nUsing Origin Shield can help reduce the load on your origin. For more information, see [Using Origin Shield](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/origin-shield.html) in the *Amazon CloudFront Developer Guide* .","properties":{"Enabled":"A flag that specifies whether Origin Shield is enabled.\\n\\nWhen it\'s enabled, CloudFront routes all requests through Origin Shield, which can help protect your origin. When it\'s disabled, CloudFront might send requests directly to your origin from multiple edge locations or regional edge caches.","OriginShieldRegion":"The AWS Region for Origin Shield.\\n\\nSpecify the AWS Region that has the lowest latency to your origin. To specify a region, use the region code, not the region name. For example, specify the US East (Ohio) region as `us-east-2` .\\n\\nWhen you enable CloudFront Origin Shield, you must specify the AWS Region for Origin Shield. For the list of AWS Regions that you can specify, and for help choosing the best Region for your origin, see [Choosing the AWS Region for Origin Shield](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/origin-shield.html#choose-origin-shield-region) in the *Amazon CloudFront Developer Guide* ."}},"AWS::CloudFront::Distribution.Restrictions":{"attributes":{},"description":"A complex type that identifies ways in which you want to restrict distribution of your content.","properties":{"GeoRestriction":"A complex type that controls the countries in which your content is distributed. CloudFront determines the location of your users using `MaxMind` GeoIP databases. To disable geo restriction, remove the [Restrictions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-restrictions) property from your stack template."}},"AWS::CloudFront::Distribution.S3OriginConfig":{"attributes":{},"description":"A complex type that contains information about the Amazon S3 origin. If the origin is a custom origin or an S3 bucket that is configured as a website endpoint, use the `CustomOriginConfig` element instead.","properties":{"OriginAccessIdentity":"The CloudFront origin access identity to associate with the origin. Use an origin access identity to configure the origin so that viewers can *only* access objects in an Amazon S3 bucket through CloudFront. The format of the value is:\\n\\norigin-access-identity/cloudfront/ *ID-of-origin-access-identity*\\n\\nwhere `*ID-of-origin-access-identity*` is the value that CloudFront returned in the `ID` element when you created the origin access identity.\\n\\nIf you want viewers to be able to access objects using either the CloudFront URL or the Amazon S3 URL, specify an empty `OriginAccessIdentity` element.\\n\\nTo delete the origin access identity from an existing distribution, update the distribution configuration and include an empty `OriginAccessIdentity` element.\\n\\nTo replace the origin access identity, update the distribution configuration and specify the new origin access identity.\\n\\nFor more information about the origin access identity, see [Serving Private Content through CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) in the *Amazon CloudFront Developer Guide* ."}},"AWS::CloudFront::Distribution.StatusCodes":{"attributes":{},"description":"A complex data type for the status codes that you specify that, when returned by a primary origin, trigger CloudFront to failover to a second origin.","properties":{"Items":"The items (status codes) for an origin group.","Quantity":"The number of status codes."}},"AWS::CloudFront::Distribution.ViewerCertificate":{"attributes":{},"description":"A complex type that determines the distribution\'s SSL/TLS configuration for communicating with viewers.\\n\\nIf the distribution doesn\'t use `Aliases` (also known as alternate domain names or CNAMEs)—that is, if the distribution uses the CloudFront domain name such as `d111111abcdef8.cloudfront.net` —set `CloudFrontDefaultCertificate` to `true` and leave all other fields empty.\\n\\nIf the distribution uses `Aliases` (alternate domain names or CNAMEs), use the fields in this type to specify the following settings:\\n\\n- Which viewers the distribution accepts HTTPS connections from: only viewers that support [server name indication (SNI)](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Server_Name_Indication) (recommended), or all viewers including those that don\'t support SNI.\\n\\n- To accept HTTPS connections from only viewers that support SNI, set `SSLSupportMethod` to `sni-only` . This is recommended. Most browsers and clients support SNI. (In CloudFormation, the field name is `SslSupportMethod` . Note the different capitalization.)\\n- To accept HTTPS connections from all viewers, including those that don\'t support SNI, set `SSLSupportMethod` to `vip` . This is not recommended, and results in additional monthly charges from CloudFront. (In CloudFormation, the field name is `SslSupportMethod` . Note the different capitalization.)\\n- The minimum SSL/TLS protocol version that the distribution can use to communicate with viewers. To specify a minimum version, choose a value for `MinimumProtocolVersion` . For more information, see [Security Policy](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValues-security-policy) in the *Amazon CloudFront Developer Guide* .\\n- The location of the SSL/TLS certificate, [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) (recommended) or [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html) . You specify the location by setting a value in one of the following fields (not both):\\n\\n- `ACMCertificateArn` (In CloudFormation, this field name is `AcmCertificateArn` . Note the different capitalization.)\\n- `IAMCertificateId` (In CloudFormation, this field name is `IamCertificateId` . Note the different capitalization.)\\n\\nAll distributions support HTTPS connections from viewers. To require viewers to use HTTPS only, or to redirect them from HTTP to HTTPS, use `ViewerProtocolPolicy` in the `CacheBehavior` or `DefaultCacheBehavior` . To specify how CloudFront should use SSL/TLS to communicate with your custom origin, use `CustomOriginConfig` .\\n\\nFor more information, see [Using HTTPS with CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-https.html) and [Using Alternate Domain Names and HTTPS](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-https-alternate-domain-names.html) in the *Amazon CloudFront Developer Guide* .","properties":{"AcmCertificateArn":"> In CloudFormation, this field name is `AcmCertificateArn` . Note the different capitalization. \\n\\nIf the distribution uses `Aliases` (alternate domain names or CNAMEs) and the SSL/TLS certificate is stored in [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) , provide the Amazon Resource Name (ARN) of the ACM certificate. CloudFront only supports ACM certificates in the US East (N. Virginia) Region ( `us-east-1` ).\\n\\nIf you specify an ACM certificate ARN, you must also specify values for `MinimumProtocolVersion` and `SSLSupportMethod` . (In CloudFormation, the field name is `SslSupportMethod` . Note the different capitalization.)","CloudFrontDefaultCertificate":"If the distribution uses the CloudFront domain name such as `d111111abcdef8.cloudfront.net` , set this field to `true` .\\n\\nIf the distribution uses `Aliases` (alternate domain names or CNAMEs), set this field to `false` and specify values for the following fields:\\n\\n- `ACMCertificateArn` or `IAMCertificateId` (specify a value for one, not both)\\n\\nIn CloudFormation, these field names are `AcmCertificateArn` and `IamCertificateId` . Note the different capitalization.\\n- `MinimumProtocolVersion`\\n- `SSLSupportMethod` (In CloudFormation, this field name is `SslSupportMethod` . Note the different capitalization.)","IamCertificateId":"> In CloudFormation, this field name is `IamCertificateId` . Note the different capitalization. \\n\\nIf the distribution uses `Aliases` (alternate domain names or CNAMEs) and the SSL/TLS certificate is stored in [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html) , provide the ID of the IAM certificate.\\n\\nIf you specify an IAM certificate ID, you must also specify values for `MinimumProtocolVersion` and `SSLSupportMethod` . (In CloudFormation, the field name is `SslSupportMethod` . Note the different capitalization.)","MinimumProtocolVersion":"If the distribution uses `Aliases` (alternate domain names or CNAMEs), specify the security policy that you want CloudFront to use for HTTPS connections with viewers. The security policy determines two settings:\\n\\n- The minimum SSL/TLS protocol that CloudFront can use to communicate with viewers.\\n- The ciphers that CloudFront can use to encrypt the content that it returns to viewers.\\n\\nFor more information, see [Security Policy](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValues-security-policy) and [Supported Protocols and Ciphers Between Viewers and CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/secure-connections-supported-viewer-protocols-ciphers.html#secure-connections-supported-ciphers) in the *Amazon CloudFront Developer Guide* .\\n\\n> On the CloudFront console, this setting is called *Security Policy* . \\n\\nWhen you\'re using SNI only (you set `SSLSupportMethod` to `sni-only` ), you must specify `TLSv1` or higher. (In CloudFormation, the field name is `SslSupportMethod` . Note the different capitalization.)\\n\\nIf the distribution uses the CloudFront domain name such as `d111111abcdef8.cloudfront.net` (you set `CloudFrontDefaultCertificate` to `true` ), CloudFront automatically sets the security policy to `TLSv1` regardless of the value that you set here.","SslSupportMethod":"> In CloudFormation, this field name is `SslSupportMethod` . Note the different capitalization. \\n\\nIf the distribution uses `Aliases` (alternate domain names or CNAMEs), specify which viewers the distribution accepts HTTPS connections from.\\n\\n- `sni-only` – The distribution accepts HTTPS connections from only viewers that support [server name indication (SNI)](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Server_Name_Indication) . This is recommended. Most browsers and clients support SNI.\\n- `vip` – The distribution accepts HTTPS connections from all viewers including those that don\'t support SNI. This is not recommended, and results in additional monthly charges from CloudFront.\\n- `static-ip` - Do not specify this value unless your distribution has been enabled for this feature by the CloudFront team. If you have a use case that requires static IP addresses for a distribution, contact CloudFront through the [AWS Support Center](https://docs.aws.amazon.com/support/home) .\\n\\nIf the distribution uses the CloudFront domain name such as `d111111abcdef8.cloudfront.net` , don\'t set a value for this field."}},"AWS::CloudFront::Function":{"attributes":{"FunctionARN":"The ARN of the function. For example:\\n\\n`arn:aws:cloudfront::123456789012:function/ExampleFunction` .\\n\\nTo get the function ARN, use the following syntax:\\n\\n`!GetAtt *Function_Logical_ID* .FunctionMetadata.FunctionARN`","FunctionMetadata.FunctionARN":"The Amazon Resource Name (ARN) of the function. The ARN uniquely identifies the function."},"description":"Creates a CloudFront function.\\n\\nTo create a function, you provide the function code and some configuration information about the function. The response contains an Amazon Resource Name (ARN) that uniquely identifies the function, and the function’s stage.\\n\\nBy default, when you create a function, it’s in the `DEVELOPMENT` stage. In this stage, you can [test the function](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/test-function.html) in the CloudFront console (or with `TestFunction` in the CloudFront API).\\n\\nWhen you’re ready to use your function with a CloudFront distribution, publish the function to the `LIVE` stage. You can do this in the CloudFront console, with `PublishFunction` in the CloudFront API, or by updating the `AWS::CloudFront::Function` resource with the `AutoPublish` property set to `true` . When the function is published to the `LIVE` stage, you can attach it to a distribution’s cache behavior, using the function’s ARN.\\n\\nTo automatically publish the function to the `LIVE` stage when it’s created, set the `AutoPublish` property to `true` .","properties":{"AutoPublish":"A flag that determines whether to automatically publish the function to the `LIVE` stage when it’s created. To automatically publish to the `LIVE` stage, set this property to `true` .","FunctionCode":"The function code. For more information about writing a CloudFront function, see [Writing function code for CloudFront Functions](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/writing-function-code.html) in the *Amazon CloudFront Developer Guide* .","FunctionConfig":"Contains configuration information about a CloudFront function.","FunctionMetadata":"Contains metadata about a CloudFront function.","Name":"A name to identify the function."}},"AWS::CloudFront::Function.FunctionConfig":{"attributes":{},"description":"Contains configuration information about a CloudFront function.","properties":{"Comment":"A comment to describe the function.","Runtime":"The function\'s runtime environment. The only valid value is `cloudfront-js-1.0` ."}},"AWS::CloudFront::Function.FunctionMetadata":{"attributes":{},"description":"Contains metadata about a CloudFront function.","properties":{"FunctionARN":"The Amazon Resource Name (ARN) of the function. The ARN uniquely identifies the function."}},"AWS::CloudFront::KeyGroup":{"attributes":{"Id":"The identifier for the key group.","LastModifiedTime":"The date and time when the key group was last modified.","Ref":"`Ref` returns the ID of the key group. For example: `e9fcd3cf-f3f4-4b61-bd85-9ba9e091b309` ."},"description":"A key group.\\n\\nA key group contains a list of public keys that you can use with [CloudFront signed URLs and signed cookies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) .","properties":{"KeyGroupConfig":"The key group configuration."}},"AWS::CloudFront::KeyGroup.KeyGroupConfig":{"attributes":{},"description":"A key group configuration.\\n\\nA key group contains a list of public keys that you can use with [CloudFront signed URLs and signed cookies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) .","properties":{"Comment":"A comment to describe the key group. The comment cannot be longer than 128 characters.","Items":"A list of the identifiers of the public keys in the key group.","Name":"A name to identify the key group."}},"AWS::CloudFront::MonitoringSubscription":{"attributes":{"Ref":"`Ref` returns the unique identifier for the monitoring subscription, which is the same as the distribution ID of the distribution that the subscription is for."},"description":"A monitoring subscription. This structure contains information about whether additional CloudWatch metrics are enabled for a given CloudFront distribution.","properties":{"DistributionId":"The ID of the distribution that you are enabling metrics for.","MonitoringSubscription":"A subscription configuration for additional CloudWatch metrics."}},"AWS::CloudFront::MonitoringSubscription.MonitoringSubscription":{"attributes":{},"description":"A monitoring subscription. This structure contains information about whether additional CloudWatch metrics are enabled for a given CloudFront distribution.","properties":{"RealtimeMetricsSubscriptionConfig":"A subscription configuration for additional CloudWatch metrics."}},"AWS::CloudFront::MonitoringSubscription.RealtimeMetricsSubscriptionConfig":{"attributes":{},"description":"A subscription configuration for additional CloudWatch metrics.","properties":{"RealtimeMetricsSubscriptionStatus":"A flag that indicates whether additional CloudWatch metrics are enabled for a given CloudFront distribution."}},"AWS::CloudFront::OriginAccessControl":{"attributes":{"Id":"The unique identifier of the origin access control.","Ref":""},"description":"Creates a new origin access control in CloudFront. After you create an origin access control, you can add it to an origin in a CloudFront distribution so that CloudFront sends authenticated (signed) requests to the origin.\\n\\nThis makes it possible to block public access to the origin, allowing viewers (users) to access the origin\'s content only through CloudFront.\\n\\nFor more information about using a CloudFront origin access control, see [Restricting access to an AWS origin](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-origin.html) in the *Amazon CloudFront Developer Guide* .","properties":{"OriginAccessControlConfig":"The origin access control."}},"AWS::CloudFront::OriginAccessControl.OriginAccessControlConfig":{"attributes":{},"description":"Creates a new origin access control in CloudFront. After you create an origin access control, you can add it to an origin in a CloudFront distribution so that CloudFront sends authenticated (signed) requests to the origin.\\n\\nThis makes it possible to block public access to the origin, allowing viewers (users) to access the origin\'s content only through CloudFront.\\n\\nFor more information about using a CloudFront origin access control, see [Restricting access to an AWS origin](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-origin.html) in the *Amazon CloudFront Developer Guide* .","properties":{"Description":"A description of the origin access control.","Name":"A name to identify the origin access control.","OriginAccessControlOriginType":"The type of origin that this origin access control is for.","SigningBehavior":"Specifies which requests CloudFront signs (adds authentication information to). Specify `always` for the most common use case. For more information, see [origin access control advanced settings](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#oac-advanced-settings) in the *Amazon CloudFront Developer Guide* .\\n\\nThis field can have one of the following values:\\n\\n- `always` – CloudFront signs all origin requests, overwriting the `Authorization` header from the viewer request if one exists.\\n- `never` – CloudFront doesn\'t sign any origin requests. This value turns off origin access control for all origins in all distributions that use this origin access control.\\n- `no-override` – If the viewer request doesn\'t contain the `Authorization` header, then CloudFront signs the origin request. If the viewer request contains the `Authorization` header, then CloudFront doesn\'t sign the origin request and instead passes along the `Authorization` header from the viewer request. *WARNING: To pass along the `Authorization` header from the viewer request, you *must* add the `Authorization` header to a [cache policy](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-the-cache-key.html) for all cache behaviors that use origins associated with this origin access control.*","SigningProtocol":"The signing protocol of the origin access control, which determines how CloudFront signs (authenticates) requests. The only valid value is `sigv4` ."}},"AWS::CloudFront::OriginRequestPolicy":{"attributes":{"Id":"The unique identifier for the origin request policy. For example: `befd7079-9bbc-4ebf-8ade-498a3694176c` .","LastModifiedTime":"The date and time when the origin request policy was last modified.","Ref":"`Ref` returns the origin request policy ID. For example: `befd7079-9bbc-4ebf-8ade-498a3694176c` ."},"description":"An origin request policy.\\n\\nWhen it\'s attached to a cache behavior, the origin request policy determines the values that CloudFront includes in requests that it sends to the origin. Each request that CloudFront sends to the origin includes the following:\\n\\n- The request body and the URL path (without the domain name) from the viewer request.\\n- The headers that CloudFront automatically includes in every origin request, including `Host` , `User-Agent` , and `X-Amz-Cf-Id` .\\n- All HTTP headers, cookies, and URL query strings that are specified in the cache policy or the origin request policy. These can include items from the viewer request and, in the case of headers, additional ones that are added by CloudFront.\\n\\nCloudFront sends a request when it can\'t find an object in its cache that matches the request. If you want to send values to the origin and also include them in the cache key, use `CachePolicy` .","properties":{"OriginRequestPolicyConfig":"The origin request policy configuration."}},"AWS::CloudFront::OriginRequestPolicy.CookiesConfig":{"attributes":{},"description":"An object that determines whether any cookies in viewer requests (and if so, which cookies) are included in requests that CloudFront sends to the origin.","properties":{"CookieBehavior":"Determines whether cookies in viewer requests are included in requests that CloudFront sends to the origin. Valid values are:\\n\\n- `none` – No cookies in viewer requests are included in requests that CloudFront sends to the origin. Even when this field is set to `none` , any cookies that are listed in a `CachePolicy` *are* included in origin requests.\\n- `whitelist` – Only the cookies in viewer requests that are listed in the `CookieNames` type are included in requests that CloudFront sends to the origin.\\n- `all` – All cookies in viewer requests are included in requests that CloudFront sends to the origin.\\n- `allExcept` – All cookies in viewer requests are included in requests that CloudFront sends to the origin, **except** for those listed in the `CookieNames` type, which are not included.","Cookies":"Contains a list of cookie names."}},"AWS::CloudFront::OriginRequestPolicy.HeadersConfig":{"attributes":{},"description":"An object that determines whether any HTTP headers (and if so, which headers) are included in requests that CloudFront sends to the origin.","properties":{"HeaderBehavior":"Determines whether any HTTP headers are included in requests that CloudFront sends to the origin. Valid values are:\\n\\n- `none` – No HTTP headers in viewer requests are included in requests that CloudFront sends to the origin. Even when this field is set to `none` , any headers that are listed in a `CachePolicy` *are* included in origin requests.\\n- `whitelist` – Only the HTTP headers that are listed in the `Headers` type are included in requests that CloudFront sends to the origin.\\n- `allViewer` – All HTTP headers in viewer requests are included in requests that CloudFront sends to the origin.\\n- `allViewerAndWhitelistCloudFront` – All HTTP headers in viewer requests and the additional CloudFront headers that are listed in the `Headers` type are included in requests that CloudFront sends to the origin. The additional headers are added by CloudFront.\\n- `allExcept` – All HTTP headers in viewer requests are included in requests that CloudFront sends to the origin, **except** for those listed in the `Headers` type, which are not included.","Headers":"Contains a list of HTTP header names."}},"AWS::CloudFront::OriginRequestPolicy.OriginRequestPolicyConfig":{"attributes":{},"description":"An origin request policy configuration.\\n\\nThis configuration determines the values that CloudFront includes in requests that it sends to the origin. Each request that CloudFront sends to the origin includes the following:\\n\\n- The request body and the URL path (without the domain name) from the viewer request.\\n- The headers that CloudFront automatically includes in every origin request, including `Host` , `User-Agent` , and `X-Amz-Cf-Id` .\\n- All HTTP headers, cookies, and URL query strings that are specified in the cache policy or the origin request policy. These can include items from the viewer request and, in the case of headers, additional ones that are added by CloudFront.\\n\\nCloudFront sends a request when it can\'t find an object in its cache that matches the request. If you want to send values to the origin and also include them in the cache key, use `CachePolicy` .","properties":{"Comment":"A comment to describe the origin request policy. The comment cannot be longer than 128 characters.","CookiesConfig":"The cookies from viewer requests to include in origin requests.","HeadersConfig":"The HTTP headers to include in origin requests. These can include headers from viewer requests and additional headers added by CloudFront.","Name":"A unique name to identify the origin request policy.","QueryStringsConfig":"The URL query strings from viewer requests to include in origin requests."}},"AWS::CloudFront::OriginRequestPolicy.QueryStringsConfig":{"attributes":{},"description":"An object that determines whether any URL query strings in viewer requests (and if so, which query strings) are included in requests that CloudFront sends to the origin.","properties":{"QueryStringBehavior":"Determines whether any URL query strings in viewer requests are included in requests that CloudFront sends to the origin. Valid values are:\\n\\n- `none` – No query strings in viewer requests are included in requests that CloudFront sends to the origin. Even when this field is set to `none` , any query strings that are listed in a `CachePolicy` *are* included in origin requests.\\n- `whitelist` – Only the query strings in viewer requests that are listed in the `QueryStringNames` type are included in requests that CloudFront sends to the origin.\\n- `all` – All query strings in viewer requests are included in requests that CloudFront sends to the origin.\\n- `allExcept` – All query strings in viewer requests are included in requests that CloudFront sends to the origin, **except** for those listed in the `QueryStringNames` type, which are not included.","QueryStrings":"Contains a list of query string names."}},"AWS::CloudFront::PublicKey":{"attributes":{"CreatedTime":"The date and time when the public key was uploaded.","Id":"The identifier of the public key.","Ref":"`Ref` returns the ID of the public key. For example: `K36X4X2EO997HM` ."},"description":"A public key that you can use with [signed URLs and signed cookies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) , or with [field-level encryption](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html) .","properties":{"PublicKeyConfig":"Configuration information about a public key that you can use with [signed URLs and signed cookies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) , or with [field-level encryption](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html) ."}},"AWS::CloudFront::PublicKey.PublicKeyConfig":{"attributes":{},"description":"Configuration information about a public key that you can use with [signed URLs and signed cookies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) , or with [field-level encryption](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html) .","properties":{"CallerReference":"A string included in the request to help make sure that the request can\'t be replayed.","Comment":"A comment to describe the public key. The comment cannot be longer than 128 characters.","EncodedKey":"The public key that you can use with [signed URLs and signed cookies](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) , or with [field-level encryption](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html) .","Name":"A name to help identify the public key."}},"AWS::CloudFront::RealtimeLogConfig":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the real-time log configuration. For example: `arn:aws:cloudfront::111122223333:realtime-log-config/ExampleNameForRealtimeLogConfig` .","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the real-time log configuration. For example: `arn:aws:cloudfront::111122223333:realtime-log-config/ExampleNameForRealtimeLogConfig` ."},"description":"A real-time log configuration.","properties":{"EndPoints":"Contains information about the Amazon Kinesis data stream where you are sending real-time log data for this real-time log configuration.","Fields":"A list of fields that are included in each real-time log record. In an API response, the fields are provided in the same order in which they are sent to the Amazon Kinesis data stream.\\n\\nFor more information about fields, see [Real-time log configuration fields](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/real-time-logs.html#understand-real-time-log-config-fields) in the *Amazon CloudFront Developer Guide* .","Name":"The unique name of this real-time log configuration.","SamplingRate":"The sampling rate for this real-time log configuration. The sampling rate determines the percentage of viewer requests that are represented in the real-time log data. The sampling rate is an integer between 1 and 100, inclusive."}},"AWS::CloudFront::RealtimeLogConfig.EndPoint":{"attributes":{},"description":"Contains information about the Amazon Kinesis data stream where you are sending real-time log data in a real-time log configuration.","properties":{"KinesisStreamConfig":"Contains information about the Amazon Kinesis data stream where you are sending real-time log data.","StreamType":"The type of data stream where you are sending real-time log data. The only valid value is `Kinesis` ."}},"AWS::CloudFront::RealtimeLogConfig.KinesisStreamConfig":{"attributes":{},"description":"Contains information about the Amazon Kinesis data stream where you are sending real-time log data.","properties":{"RoleArn":"The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role that CloudFront can use to send real-time log data to your Kinesis data stream.\\n\\nFor more information the IAM role, see [Real-time log configuration IAM role](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/real-time-logs.html#understand-real-time-log-config-iam-role) in the *Amazon CloudFront Developer Guide* .","StreamArn":"The Amazon Resource Name (ARN) of the Kinesis data stream where you are sending real-time log data."}},"AWS::CloudFront::ResponseHeadersPolicy":{"attributes":{"Id":"The unique identifier for the response headers policy. For example: `57f99797-3b20-4e1b-a728-27972a74082a` .","LastModifiedTime":"The date and time when the response headers policy was last modified.","Ref":"`Ref` returns the response headers policy ID. For example: `57f99797-3b20-4e1b-a728-27972a74082a` ."},"description":"A response headers policy.\\n\\nA response headers policy contains information about a set of HTTP response headers.\\n\\nAfter you create a response headers policy, you can use its ID to attach it to one or more cache behaviors in a CloudFront distribution. When it\'s attached to a cache behavior, the response headers policy affects the HTTP headers that CloudFront includes in HTTP responses to requests that match the cache behavior. CloudFront adds or removes response headers according to the configuration of the response headers policy.\\n\\nFor more information, see [Adding or removing HTTP headers in CloudFront responses](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/modifying-response-headers.html) in the *Amazon CloudFront Developer Guide* .","properties":{"ResponseHeadersPolicyConfig":"A response headers policy configuration."}},"AWS::CloudFront::ResponseHeadersPolicy.AccessControlAllowHeaders":{"attributes":{},"description":"A list of HTTP header names that CloudFront includes as values for the `Access-Control-Allow-Headers` HTTP response header.\\n\\nFor more information about the `Access-Control-Allow-Headers` HTTP response header, see [Access-Control-Allow-Headers](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers) in the MDN Web Docs.","properties":{"Items":"The list of HTTP header names. You can specify `*` to allow all headers."}},"AWS::CloudFront::ResponseHeadersPolicy.AccessControlAllowMethods":{"attributes":{},"description":"A list of HTTP methods that CloudFront includes as values for the `Access-Control-Allow-Methods` HTTP response header.\\n\\nFor more information about the `Access-Control-Allow-Methods` HTTP response header, see [Access-Control-Allow-Methods](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods) in the MDN Web Docs.","properties":{"Items":"The list of HTTP methods. Valid values are:\\n\\n- `GET`\\n- `DELETE`\\n- `HEAD`\\n- `OPTIONS`\\n- `PATCH`\\n- `POST`\\n- `PUT`\\n- `ALL`\\n\\n`ALL` is a special value that includes all of the listed HTTP methods."}},"AWS::CloudFront::ResponseHeadersPolicy.AccessControlAllowOrigins":{"attributes":{},"description":"A list of origins (domain names) that CloudFront can use as the value for the `Access-Control-Allow-Origin` HTTP response header.\\n\\nFor more information about the `Access-Control-Allow-Origin` HTTP response header, see [Access-Control-Allow-Origin](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin) in the MDN Web Docs.","properties":{"Items":"The list of origins (domain names). You can specify `*` to allow all origins."}},"AWS::CloudFront::ResponseHeadersPolicy.AccessControlExposeHeaders":{"attributes":{},"description":"A list of HTTP headers that CloudFront includes as values for the `Access-Control-Expose-Headers` HTTP response header.\\n\\nFor more information about the `Access-Control-Expose-Headers` HTTP response header, see [Access-Control-Expose-Headers](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers) in the MDN Web Docs.","properties":{"Items":"The list of HTTP headers. You can specify `*` to expose all headers."}},"AWS::CloudFront::ResponseHeadersPolicy.ContentSecurityPolicy":{"attributes":{},"description":"The policy directives and their values that CloudFront includes as values for the `Content-Security-Policy` HTTP response header.\\n\\nFor more information about the `Content-Security-Policy` HTTP response header, see [Content-Security-Policy](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy) in the MDN Web Docs.","properties":{"ContentSecurityPolicy":"The policy directives and their values that CloudFront includes as values for the `Content-Security-Policy` HTTP response header.","Override":"A Boolean that determines whether CloudFront overrides the `Content-Security-Policy` HTTP response header received from the origin with the one specified in this response headers policy."}},"AWS::CloudFront::ResponseHeadersPolicy.ContentTypeOptions":{"attributes":{},"description":"Determines whether CloudFront includes the `X-Content-Type-Options` HTTP response header with its value set to `nosniff` .\\n\\nFor more information about the `X-Content-Type-Options` HTTP response header, see [X-Content-Type-Options](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options) in the MDN Web Docs.","properties":{"Override":"A Boolean that determines whether CloudFront overrides the `X-Content-Type-Options` HTTP response header received from the origin with the one specified in this response headers policy."}},"AWS::CloudFront::ResponseHeadersPolicy.CorsConfig":{"attributes":{},"description":"A configuration for a set of HTTP response headers that are used for cross-origin resource sharing (CORS). CloudFront adds these headers to HTTP responses that it sends for CORS requests that match a cache behavior associated with this response headers policy.\\n\\nFor more information about CORS, see [Cross-Origin Resource Sharing (CORS)](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) in the MDN Web Docs.","properties":{"AccessControlAllowCredentials":"A Boolean that CloudFront uses as the value for the `Access-Control-Allow-Credentials` HTTP response header.\\n\\nFor more information about the `Access-Control-Allow-Credentials` HTTP response header, see [Access-Control-Allow-Credentials](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials) in the MDN Web Docs.","AccessControlAllowHeaders":"A list of HTTP header names that CloudFront includes as values for the `Access-Control-Allow-Headers` HTTP response header.\\n\\nFor more information about the `Access-Control-Allow-Headers` HTTP response header, see [Access-Control-Allow-Headers](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers) in the MDN Web Docs.","AccessControlAllowMethods":"A list of HTTP methods that CloudFront includes as values for the `Access-Control-Allow-Methods` HTTP response header.\\n\\nFor more information about the `Access-Control-Allow-Methods` HTTP response header, see [Access-Control-Allow-Methods](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods) in the MDN Web Docs.","AccessControlAllowOrigins":"A list of origins (domain names) that CloudFront can use as the value for the `Access-Control-Allow-Origin` HTTP response header.\\n\\nFor more information about the `Access-Control-Allow-Origin` HTTP response header, see [Access-Control-Allow-Origin](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin) in the MDN Web Docs.","AccessControlExposeHeaders":"A list of HTTP headers that CloudFront includes as values for the `Access-Control-Expose-Headers` HTTP response header.\\n\\nFor more information about the `Access-Control-Expose-Headers` HTTP response header, see [Access-Control-Expose-Headers](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers) in the MDN Web Docs.","AccessControlMaxAgeSec":"A number that CloudFront uses as the value for the `Access-Control-Max-Age` HTTP response header.\\n\\nFor more information about the `Access-Control-Max-Age` HTTP response header, see [Access-Control-Max-Age](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age) in the MDN Web Docs.","OriginOverride":"A Boolean that determines whether CloudFront overrides HTTP response headers received from the origin with the ones specified in this response headers policy."}},"AWS::CloudFront::ResponseHeadersPolicy.CustomHeader":{"attributes":{},"description":"An HTTP response header name and its value. CloudFront includes this header in HTTP responses that it sends for requests that match a cache behavior that\'s associated with this response headers policy.","properties":{"Header":"The HTTP response header name.","Override":"A Boolean that determines whether CloudFront overrides a response header with the same name received from the origin with the header specified here.","Value":"The value for the HTTP response header."}},"AWS::CloudFront::ResponseHeadersPolicy.CustomHeadersConfig":{"attributes":{},"description":"A list of HTTP response header names and their values. CloudFront includes these headers in HTTP responses that it sends for requests that match a cache behavior that\'s associated with this response headers policy.","properties":{"Items":"The list of HTTP response headers and their values."}},"AWS::CloudFront::ResponseHeadersPolicy.FrameOptions":{"attributes":{},"description":"Determines whether CloudFront includes the `X-Frame-Options` HTTP response header and the header\'s value.\\n\\nFor more information about the `X-Frame-Options` HTTP response header, see [X-Frame-Options](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) in the MDN Web Docs.","properties":{"FrameOption":"The value of the `X-Frame-Options` HTTP response header. Valid values are `DENY` and `SAMEORIGIN` .\\n\\nFor more information about these values, see [X-Frame-Options](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) in the MDN Web Docs.","Override":"A Boolean that determines whether CloudFront overrides the `X-Frame-Options` HTTP response header received from the origin with the one specified in this response headers policy."}},"AWS::CloudFront::ResponseHeadersPolicy.ReferrerPolicy":{"attributes":{},"description":"Determines whether CloudFront includes the `Referrer-Policy` HTTP response header and the header\'s value.\\n\\nFor more information about the `Referrer-Policy` HTTP response header, see [Referrer-Policy](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy) in the MDN Web Docs.","properties":{"Override":"A Boolean that determines whether CloudFront overrides the `Referrer-Policy` HTTP response header received from the origin with the one specified in this response headers policy.","ReferrerPolicy":"The value of the `Referrer-Policy` HTTP response header. Valid values are:\\n\\n- `no-referrer`\\n- `no-referrer-when-downgrade`\\n- `origin`\\n- `origin-when-cross-origin`\\n- `same-origin`\\n- `strict-origin`\\n- `strict-origin-when-cross-origin`\\n- `unsafe-url`\\n\\nFor more information about these values, see [Referrer-Policy](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy) in the MDN Web Docs."}},"AWS::CloudFront::ResponseHeadersPolicy.RemoveHeader":{"attributes":{},"description":"The name of an HTTP header that CloudFront removes from HTTP responses to requests that match the cache behavior that this response headers policy is attached to.","properties":{"Header":"The HTTP header name."}},"AWS::CloudFront::ResponseHeadersPolicy.RemoveHeadersConfig":{"attributes":{},"description":"A list of HTTP header names that CloudFront removes from HTTP responses to requests that match the cache behavior that this response headers policy is attached to.","properties":{"Items":"The list of HTTP header names."}},"AWS::CloudFront::ResponseHeadersPolicy.ResponseHeadersPolicyConfig":{"attributes":{},"description":"A response headers policy configuration.\\n\\nA response headers policy configuration contains metadata about the response headers policy, and configurations for sets of HTTP response headers.","properties":{"Comment":"A comment to describe the response headers policy.\\n\\nThe comment cannot be longer than 128 characters.","CorsConfig":"A configuration for a set of HTTP response headers that are used for cross-origin resource sharing (CORS).","CustomHeadersConfig":"A configuration for a set of custom HTTP response headers.","Name":"A name to identify the response headers policy.\\n\\nThe name must be unique for response headers policies in this AWS account .","RemoveHeadersConfig":"A configuration for a set of HTTP headers to remove from the HTTP response.","SecurityHeadersConfig":"A configuration for a set of security-related HTTP response headers.","ServerTimingHeadersConfig":"A configuration for enabling the `Server-Timing` header in HTTP responses sent from CloudFront."}},"AWS::CloudFront::ResponseHeadersPolicy.SecurityHeadersConfig":{"attributes":{},"description":"A configuration for a set of security-related HTTP response headers. CloudFront adds these headers to HTTP responses that it sends for requests that match a cache behavior associated with this response headers policy.","properties":{"ContentSecurityPolicy":"The policy directives and their values that CloudFront includes as values for the `Content-Security-Policy` HTTP response header.\\n\\nFor more information about the `Content-Security-Policy` HTTP response header, see [Content-Security-Policy](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy) in the MDN Web Docs.","ContentTypeOptions":"Determines whether CloudFront includes the `X-Content-Type-Options` HTTP response header with its value set to `nosniff` .\\n\\nFor more information about the `X-Content-Type-Options` HTTP response header, see [X-Content-Type-Options](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options) in the MDN Web Docs.","FrameOptions":"Determines whether CloudFront includes the `X-Frame-Options` HTTP response header and the header\'s value.\\n\\nFor more information about the `X-Frame-Options` HTTP response header, see [X-Frame-Options](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) in the MDN Web Docs.","ReferrerPolicy":"Determines whether CloudFront includes the `Referrer-Policy` HTTP response header and the header\'s value.\\n\\nFor more information about the `Referrer-Policy` HTTP response header, see [Referrer-Policy](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy) in the MDN Web Docs.","StrictTransportSecurity":"Determines whether CloudFront includes the `Strict-Transport-Security` HTTP response header and the header\'s value.\\n\\nFor more information about the `Strict-Transport-Security` HTTP response header, see [Strict-Transport-Security](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security) in the MDN Web Docs.","XSSProtection":"Determines whether CloudFront includes the `X-XSS-Protection` HTTP response header and the header\'s value.\\n\\nFor more information about the `X-XSS-Protection` HTTP response header, see [X-XSS-Protection](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection) in the MDN Web Docs."}},"AWS::CloudFront::ResponseHeadersPolicy.ServerTimingHeadersConfig":{"attributes":{},"description":"A configuration for enabling the `Server-Timing` header in HTTP responses sent from CloudFront.","properties":{"Enabled":"A Boolean that determines whether CloudFront adds the `Server-Timing` header to HTTP responses that it sends in response to requests that match a cache behavior that\'s associated with this response headers policy.","SamplingRate":"A number 0–100 (inclusive) that specifies the percentage of responses that you want CloudFront to add the `Server-Timing` header to. When you set the sampling rate to 100, CloudFront adds the `Server-Timing` header to the HTTP response for every request that matches the cache behavior that this response headers policy is attached to. When you set it to 50, CloudFront adds the header to 50% of the responses for requests that match the cache behavior. You can set the sampling rate to any number 0–100 with up to four decimal places."}},"AWS::CloudFront::ResponseHeadersPolicy.StrictTransportSecurity":{"attributes":{},"description":"Determines whether CloudFront includes the `Strict-Transport-Security` HTTP response header and the header\'s value.\\n\\nFor more information about the `Strict-Transport-Security` HTTP response header, see [Strict-Transport-Security](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security) in the MDN Web Docs.","properties":{"AccessControlMaxAgeSec":"A number that CloudFront uses as the value for the `max-age` directive in the `Strict-Transport-Security` HTTP response header.","IncludeSubdomains":"A Boolean that determines whether CloudFront includes the `includeSubDomains` directive in the `Strict-Transport-Security` HTTP response header.","Override":"A Boolean that determines whether CloudFront overrides the `Strict-Transport-Security` HTTP response header received from the origin with the one specified in this response headers policy.","Preload":"A Boolean that determines whether CloudFront includes the `preload` directive in the `Strict-Transport-Security` HTTP response header."}},"AWS::CloudFront::ResponseHeadersPolicy.XSSProtection":{"attributes":{},"description":"Determines whether CloudFront includes the `X-XSS-Protection` HTTP response header and the header\'s value.\\n\\nFor more information about the `X-XSS-Protection` HTTP response header, see [X-XSS-Protection](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection) in the MDN Web Docs.","properties":{"ModeBlock":"A Boolean that determines whether CloudFront includes the `mode=block` directive in the `X-XSS-Protection` header.\\n\\nFor more information about this directive, see [X-XSS-Protection](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection) in the MDN Web Docs.","Override":"A Boolean that determines whether CloudFront overrides the `X-XSS-Protection` HTTP response header received from the origin with the one specified in this response headers policy.","Protection":"A Boolean that determines the value of the `X-XSS-Protection` HTTP response header. When this setting is `true` , the value of the `X-XSS-Protection` header is `1` . When this setting is `false` , the value of the `X-XSS-Protection` header is `0` .\\n\\nFor more information about these settings, see [X-XSS-Protection](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection) in the MDN Web Docs.","ReportUri":"A reporting URI, which CloudFront uses as the value of the `report` directive in the `X-XSS-Protection` header.\\n\\nYou cannot specify a `ReportUri` when `ModeBlock` is `true` .\\n\\nFor more information about using a reporting URL, see [X-XSS-Protection](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection) in the MDN Web Docs."}},"AWS::CloudFront::StreamingDistribution":{"attributes":{"DomainName":"The domain name of the resource, such as `d111111abcdef8.cloudfront.net` .","Ref":"`Ref` returns the streaming distribution ID, such as `E1E7FEN9T35R9W` ."},"description":"This resource is deprecated. Amazon CloudFront is deprecating real-time messaging protocol (RTMP) distributions on December 31, 2020. For more information, [read the announcement](https://docs.aws.amazon.com/ann.jspa?annID=7356) on the Amazon CloudFront discussion forum.","properties":{"StreamingDistributionConfig":"The current configuration information for the RTMP distribution.","Tags":"A complex type that contains zero or more `Tag` elements."}},"AWS::CloudFront::StreamingDistribution.Logging":{"attributes":{},"description":"A complex type that controls whether access logs are written for the streaming distribution.","properties":{"Bucket":"The Amazon S3 bucket to store the access logs in, for example, `myawslogbucket.s3.amazonaws.com` .","Enabled":"Specifies whether you want CloudFront to save access logs to an Amazon S3 bucket. If you don\'t want to enable logging when you create a streaming distribution or if you want to disable logging for an existing streaming distribution, specify `false` for `Enabled` , and specify `empty Bucket` and `Prefix` elements. If you specify `false` for `Enabled` but you specify values for `Bucket` and `Prefix` , the values are automatically deleted.","Prefix":"An optional string that you want CloudFront to prefix to the access log filenames for this streaming distribution, for example, `myprefix/` . If you want to enable logging, but you don\'t want to specify a prefix, you still must include an empty `Prefix` element in the `Logging` element."}},"AWS::CloudFront::StreamingDistribution.S3Origin":{"attributes":{},"description":"A complex type that contains information about the Amazon S3 bucket from which you want CloudFront to get your media files for distribution.","properties":{"DomainName":"The DNS name of the Amazon S3 origin.","OriginAccessIdentity":"The CloudFront origin access identity to associate with the distribution. Use an origin access identity to configure the distribution so that end users can only access objects in an Amazon S3 bucket through CloudFront.\\n\\nIf you want end users to be able to access objects using either the CloudFront URL or the Amazon S3 URL, specify an empty `OriginAccessIdentity` element.\\n\\nTo delete the origin access identity from an existing distribution, update the distribution configuration and include an empty `OriginAccessIdentity` element.\\n\\nTo replace the origin access identity, update the distribution configuration and specify the new origin access identity.\\n\\nFor more information, see [Using an Origin Access Identity to Restrict Access to Your Amazon S3 Content](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) in the *Amazon CloudFront Developer Guide* ."}},"AWS::CloudFront::StreamingDistribution.StreamingDistributionConfig":{"attributes":{},"description":"The RTMP distribution\'s configuration information.","properties":{"Aliases":"A complex type that contains information about CNAMEs (alternate domain names), if any, for this streaming distribution.","Comment":"Any comments you want to include about the streaming distribution.","Enabled":"Whether the streaming distribution is enabled to accept user requests for content.","Logging":"A complex type that controls whether access logs are written for the streaming distribution.","PriceClass":"A complex type that contains information about price class for this streaming distribution.","S3Origin":"A complex type that contains information about the Amazon S3 bucket from which you want CloudFront to get your media files for distribution.","TrustedSigners":"A complex type that specifies any AWS accounts that you want to permit to create signed URLs for private content. If you want the distribution to use signed URLs, include this element; if you want the distribution to use public URLs, remove this element. For more information, see [Serving Private Content through CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html) in the *Amazon CloudFront Developer Guide* ."}},"AWS::CloudFront::StreamingDistribution.TrustedSigners":{"attributes":{},"description":"A list of AWS accounts whose public keys CloudFront can use to verify the signatures of signed URLs and signed cookies.","properties":{"AwsAccountNumbers":"An AWS account number that contains active CloudFront key pairs that CloudFront can use to verify the signatures of signed URLs and signed cookies. If the AWS account that owns the key pairs is the same account that owns the CloudFront distribution, the value of this field is `self` .","Enabled":"This field is `true` if any of the AWS accounts in the list are configured as trusted signers. If not, this field is `false` ."}},"AWS::CloudTrail::Channel":{"attributes":{"ChannelArn":"`Ref` returns the ARN of the CloudTrail channel, such as `arn:aws:cloudtrail:us-east-2:123456789012:channel/01234567890` .","Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, `Ref` returns the resource name."},"description":"Contains information about a returned CloudTrail channel.","properties":{"Destinations":"One or more event data stores to which events arriving through a channel will be logged.","Name":"The name of the channel.","Source":"The name of the partner or external event source. You cannot change this name after you create the channel. A maximum of one channel is allowed per source.\\n\\nA source can be either `Custom` for all valid non- AWS events, or the name of a partner event source. For information about the source names for available partners, see [Additional information about integration partners](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-event-data-store-integration.html#cloudtrail-lake-partner-information) in the CloudTrail User Guide.","Tags":"A list of tags."}},"AWS::CloudTrail::Channel.Destination":{"attributes":{},"description":"Contains information about the destination receiving events.","properties":{"Location":"For channels used for a CloudTrail Lake integration, the location is the ARN of an event data store that receives events from a channel. For service-linked channels, the location is the name of the AWS service.","Type":"The type of destination for events arriving from a channel. For channels used for a CloudTrail Lake integration, the value is `EventDataStore` . For service-linked channels, the value is `AWS_SERVICE` ."}},"AWS::CloudTrail::EventDataStore":{"attributes":{"CreatedTimestamp":"`Ref` returns the time stamp of the creation of the event data store, such as `1248496624` .","EventDataStoreArn":"`Ref` returns the ARN of the CloudTrail event data store, such as `arn:aws:cloudtrail:us-east-1:12345678910:eventdatastore/EXAMPLE-f852-4e8f-8bd1-bcf6cEXAMPLE` .","Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, `Ref` returns the resource name.","Status":"`Ref` returns the status of the event data store, such as `ENABLED` .","UpdatedTimestamp":"`Ref` returns the time stamp that updates were made to an event data store, such as `1598296624` ."},"description":"Creates a new event data store.","properties":{"AdvancedEventSelectors":"The advanced event selectors to use to select the events for the data store. You can configure up to five advanced event selectors for each event data store.\\n\\nFor more information about how to use advanced event selectors to log CloudTrail events, see [Log events by using advanced event selectors](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html#creating-data-event-selectors-advanced) in the CloudTrail User Guide.\\n\\nFor more information about how to use advanced event selectors to include AWS Config configuration items in your event data store, see [Create an event data store for AWS Config configuration items](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-lake-cli.html#lake-cli-create-eds-config) in the CloudTrail User Guide.\\n\\nFor more information about how to use advanced event selectors to include non- AWS events in your event data store, see [Create an integration to log events from outside AWS](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/query-lake-cli.html#lake-cli-create-integration) in the CloudTrail User Guide.","IngestionEnabled":"Specifies whether the event data store should start ingesting live events. The default is true.","KmsKeyId":"Specifies the AWS KMS key ID to use to encrypt the events delivered by CloudTrail. The value can be an alias name prefixed by `alias/` , a fully specified ARN to an alias, a fully specified ARN to a key, or a globally unique identifier.\\n\\n> Disabling or deleting the KMS key, or removing CloudTrail permissions on the key, prevents CloudTrail from logging events to the event data store, and prevents users from querying the data in the event data store that was encrypted with the key. After you associate an event data store with a KMS key, the KMS key cannot be removed or changed. Before you disable or delete a KMS key that you are using with an event data store, delete or back up your event data store. \\n\\nCloudTrail also supports AWS KMS multi-Region keys. For more information about multi-Region keys, see [Using multi-Region keys](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) in the *AWS Key Management Service Developer Guide* .\\n\\nExamples:\\n\\n- `alias/MyAliasName`\\n- `arn:aws:kms:us-east-2:123456789012:alias/MyAliasName`\\n- `arn:aws:kms:us-east-2:123456789012:key/12345678-1234-1234-1234-123456789012`\\n- `12345678-1234-1234-1234-123456789012`","MultiRegionEnabled":"Specifies whether the event data store includes events from all Regions, or only from the Region in which the event data store is created.","Name":"The name of the event data store.","OrganizationEnabled":"Specifies whether an event data store collects events logged for an organization in AWS Organizations .","RetentionPeriod":"The retention period of the event data store, in days. You can set a retention period of up to 2557 days, the equivalent of seven years.","Tags":"A list of tags.","TerminationProtectionEnabled":"Specifies whether termination protection is enabled for the event data store. If termination protection is enabled, you cannot delete the event data store until termination protection is disabled."}},"AWS::CloudTrail::EventDataStore.AdvancedEventSelector":{"attributes":{},"description":"Advanced event selectors let you create fine-grained selectors for the following AWS CloudTrail event record fields. They help you control costs by logging only those events that are important to you. For more information about advanced event selectors, see [Logging data events](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html) in the *AWS CloudTrail User Guide* .\\n\\n- `readOnly`\\n- `eventSource`\\n- `eventName`\\n- `eventCategory`\\n- `resources.type`\\n- `resources.ARN`\\n\\nYou cannot apply both event selectors and advanced event selectors to a trail.","properties":{"FieldSelectors":"Contains all selector statements in an advanced event selector.","Name":"An optional, descriptive name for an advanced event selector, such as \\"Log data events for only two S3 buckets\\"."}},"AWS::CloudTrail::EventDataStore.AdvancedFieldSelector":{"attributes":{},"description":"A single selector statement in an advanced event selector.","properties":{"EndsWith":"An operator that includes events that match the last few characters of the event record field specified as the value of `Field` .","Equals":"An operator that includes events that match the exact value of the event record field specified as the value of `Field` . This is the only valid operator that you can use with the `readOnly` , `eventCategory` , and `resources.type` fields.","Field":"A field in a CloudTrail event record on which to filter events to be logged. For event data stores for AWS Config configuration items, Audit Manager evidence, or non- AWS events, the field is used only for selecting events as filtering is not supported.\\n\\nFor CloudTrail event records, supported fields include `readOnly` , `eventCategory` , `eventSource` (for management events), `eventName` , `resources.type` , and `resources.ARN` .\\n\\nFor event data stores for AWS Config configuration items, Audit Manager evidence, or non- AWS events, the only supported field is `eventCategory` .\\n\\n- *`readOnly`* - Optional. Can be set to `Equals` a value of `true` or `false` . If you do not add this field, CloudTrail logs both `read` and `write` events. A value of `true` logs only `read` events. A value of `false` logs only `write` events.\\n- *`eventSource`* - For filtering management events only. This can be set only to `NotEquals` `kms.amazonaws.com` .\\n- *`eventName`* - Can use any operator. You can use it to filter in or filter out any data event logged to CloudTrail, such as `PutBucket` or `GetSnapshotBlock` . You can have multiple values for this field, separated by commas.\\n- *`eventCategory`* - This is required and must be set to `Equals` .\\n\\n- For CloudTrail event records, the value must be `Management` or `Data` .\\n- For AWS Config configuration items, the value must be `ConfigurationItem` .\\n- For Audit Manager evidence, the value must be `Evidence` .\\n- For non- AWS events, the value must be `ActivityAuditLog` .\\n- *`resources.type`* - This field is required for CloudTrail data events. `resources.type` can only use the `Equals` operator, and the value can be one of the following:\\n\\n- `AWS::DynamoDB::Table`\\n- `AWS::Lambda::Function`\\n- `AWS::S3::Object`\\n- `AWS::CloudTrail::Channel`\\n- `AWS::CodeWhisperer::Profile`\\n- `AWS::Cognito::IdentityPool`\\n- `AWS::DynamoDB::Stream`\\n- `AWS::EC2::Snapshot`\\n- `AWS::EMRWAL::Workspace`\\n- `AWS::FinSpace::Environment`\\n- `AWS::Glue::Table`\\n- `AWS::GuardDuty::Detector`\\n- `AWS::KendraRanking::ExecutionPlan`\\n- `AWS::ManagedBlockchain::Network`\\n- `AWS::ManagedBlockchain::Node`\\n- `AWS::SageMaker::ExperimentTrialComponent`\\n- `AWS::SageMaker::FeatureGroup`\\n- `AWS::S3::AccessPoint`\\n- `AWS::S3ObjectLambda::AccessPoint`\\n- `AWS::S3Outposts::Object`\\n- `AWS::SSMMessages::ControlChannel`\\n- `AWS::VerifiedPermissions::PolicyStore`\\n\\nYou can have only one `resources.type` field per selector. To log data events on more than one resource type, add another selector.\\n- *`resources.ARN`* - You can use any operator with `resources.ARN` , but if you use `Equals` or `NotEquals` , the value must exactly match the ARN of a valid resource of the type you\'ve specified in the template as the value of resources.type. For example, if resources.type equals `AWS::S3::Object` , the ARN must be in one of the following formats. To log all data events for all objects in a specific S3 bucket, use the `StartsWith` operator, and include only the bucket ARN as the matching value.\\n\\nThe trailing slash is intentional; do not exclude it. Replace the text between less than and greater than symbols (<>) with resource-specific information.\\n\\n- `arn::s3:::/`\\n- `arn::s3::://`\\n\\nWhen resources.type equals `AWS::DynamoDB::Table` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::dynamodb:::table/`\\n\\nWhen resources.type equals `AWS::Lambda::Function` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::lambda:::function:`\\n\\nWhen resources.type equals `AWS::CloudTrail::Channel` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::cloudtrail:::channel/`\\n\\nWhen resources.type equals `AWS::CodeWhisperer::Profile` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::codewhisperer:::profile/`\\n\\nWhen resources.type equals `AWS::Cognito::IdentityPool` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::cognito-identity:::identitypool/`\\n\\nWhen `resources.type` equals `AWS::DynamoDB::Stream` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::dynamodb:::table//stream/`\\n\\nWhen `resources.type` equals `AWS::EC2::Snapshot` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::ec2:::snapshot/`\\n\\nWhen `resources.type` equals `AWS::EMRWAL::Workspace` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::emrwal:::workspace/`\\n\\nWhen `resources.type` equals `AWS::FinSpace::Environment` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::finspace:::environment/`\\n\\nWhen `resources.type` equals `AWS::Glue::Table` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::glue:::table//`\\n\\nWhen `resources.type` equals `AWS::GuardDuty::Detector` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::guardduty:::detector/`\\n\\nWhen `resources.type` equals `AWS::KendraRanking::ExecutionPlan` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::kendra-ranking:::rescore-execution-plan/`\\n\\nWhen `resources.type` equals `AWS::ManagedBlockchain::Network` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::managedblockchain:::networks/`\\n\\nWhen `resources.type` equals `AWS::ManagedBlockchain::Node` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::managedblockchain:::nodes/`\\n\\nWhen `resources.type` equals `AWS::SageMaker::ExperimentTrialComponent` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::sagemaker:::experiment-trial-component/`\\n\\nWhen `resources.type` equals `AWS::SageMaker::FeatureGroup` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::sagemaker:::feature-group/`\\n\\nWhen `resources.type` equals `AWS::S3::AccessPoint` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in one of the following formats. To log events on all objects in an S3 access point, we recommend that you use only the access point ARN, don’t include the object path, and use the `StartsWith` or `NotStartsWith` operators.\\n\\n- `arn::s3:::accesspoint/`\\n- `arn::s3:::accesspoint//object/`\\n\\nWhen `resources.type` equals `AWS::S3ObjectLambda::AccessPoint` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::s3-object-lambda:::accesspoint/`\\n\\nWhen `resources.type` equals `AWS::S3Outposts::Object` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::s3-outposts:::`\\n\\nWhen `resources.type` equals `AWS::SSMMessages::ControlChannel` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::ssmmessages:::control-channel/`\\n\\nWhen resources.type equals `AWS::VerifiedPermissions::PolicyStore` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::verifiedpermissions:::policy-store/`","NotEndsWith":"An operator that excludes events that match the last few characters of the event record field specified as the value of `Field` .","NotEquals":"An operator that excludes events that match the exact value of the event record field specified as the value of `Field` .","NotStartsWith":"An operator that excludes events that match the first few characters of the event record field specified as the value of `Field` .","StartsWith":"An operator that includes events that match the first few characters of the event record field specified as the value of `Field` ."}},"AWS::CloudTrail::ResourcePolicy":{"attributes":{"Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, `Ref` returns the resource. The resource is a combination of the resource-based policy document and the channel ARN."},"description":"Attaches a resource-based permission policy to a CloudTrail channel that is used for an integration with an event source outside of AWS . For more information about resource-based policies, see [CloudTrail resource-based policy examples](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/security_iam_resource-based-policy-examples.html) in the *CloudTrail User Guide* .","properties":{"ResourceArn":"The Amazon Resource Name (ARN) of the CloudTrail channel attached to the resource-based policy. The following is the format of a resource ARN: `arn:aws:cloudtrail:us-east-2:123456789012:channel/MyChannel` .","ResourcePolicy":"A JSON-formatted string for an AWS resource-based policy.\\n\\nThe following are requirements for the resource policy:\\n\\n- Contains only one action: cloudtrail-data:PutAuditEvents\\n- Contains at least one statement. The policy can have a maximum of 20 statements.\\n- Each statement contains at least one principal. A statement can have a maximum of 50 principals."}},"AWS::CloudTrail::Trail":{"attributes":{"Arn":"`Ref` returns the ARN of the CloudTrail trail, such as `arn:aws:cloudtrail:us-east-2:123456789012:trail/myCloudTrail` .","Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, `Ref` returns the resource name.","SnsTopicArn":"`Ref` returns the ARN of the Amazon SNS topic that\'s associated with the CloudTrail trail, such as `arn:aws:sns:us-east-2:123456789012:mySNSTopic` ."},"description":"Creates a trail that specifies the settings for delivery of log data to an Amazon S3 bucket.","properties":{"AdvancedEventSelectors":"Specifies the settings for advanced event selectors. You can add advanced event selectors, and conditions for your advanced event selectors, up to a maximum of 500 values for all conditions and selectors on a trail. You can use either `AdvancedEventSelectors` or `EventSelectors` , but not both. If you apply `AdvancedEventSelectors` to a trail, any existing `EventSelectors` are overwritten. For more information about advanced event selectors, see [Logging data events](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html) in the *AWS CloudTrail User Guide* .","CloudWatchLogsLogGroupArn":"Specifies a log group name using an Amazon Resource Name (ARN), a unique identifier that represents the log group to which CloudTrail logs are delivered. You must use a log group that exists in your account.\\n\\nNot required unless you specify `CloudWatchLogsRoleArn` .","CloudWatchLogsRoleArn":"Specifies the role for the CloudWatch Logs endpoint to assume to write to a user\'s log group. You must use a role that exists in your account.","EnableLogFileValidation":"Specifies whether log file validation is enabled. The default is false.\\n\\n> When you disable log file integrity validation, the chain of digest files is broken after one hour. CloudTrail does not create digest files for log files that were delivered during a period in which log file integrity validation was disabled. For example, if you enable log file integrity validation at noon on January 1, disable it at noon on January 2, and re-enable it at noon on January 10, digest files will not be created for the log files delivered from noon on January 2 to noon on January 10. The same applies whenever you stop CloudTrail logging or delete a trail.","EventSelectors":"Use event selectors to further specify the management and data event settings for your trail. By default, trails created without specific event selectors will be configured to log all read and write management events, and no data events. When an event occurs in your account, CloudTrail evaluates the event selector for all trails. For each trail, if the event matches any event selector, the trail processes and logs the event. If the event doesn\'t match any event selector, the trail doesn\'t log the event.\\n\\nYou can configure up to five event selectors for a trail.\\n\\nFor more information about how to configure event selectors, see [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#aws-resource-cloudtrail-trail--examples) and [Configuring event selectors](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-additional-cli-commands.html#configuring-event-selector-examples) in the *AWS CloudTrail User Guide* .","IncludeGlobalServiceEvents":"Specifies whether the trail is publishing events from global services such as IAM to the log files.","InsightSelectors":"A JSON string that contains the insight types you want to log on a trail. `ApiCallRateInsight` and `ApiErrorRateInsight` are valid Insight types.\\n\\nThe `ApiCallRateInsight` Insights type analyzes write-only management API calls that are aggregated per minute against a baseline API call volume.\\n\\nThe `ApiErrorRateInsight` Insights type analyzes management API calls that result in error codes. The error is shown if the API call is unsuccessful.","IsLogging":"Whether the CloudTrail trail is currently logging AWS API calls.","IsMultiRegionTrail":"Specifies whether the trail applies only to the current Region or to all Regions. The default is false. If the trail exists only in the current Region and this value is set to true, shadow trails (replications of the trail) will be created in the other Regions. If the trail exists in all Regions and this value is set to false, the trail will remain in the Region where it was created, and its shadow trails in other Regions will be deleted. As a best practice, consider using trails that log events in all Regions.","IsOrganizationTrail":"Specifies whether the trail is applied to all accounts in an organization in AWS Organizations , or only for the current AWS account . The default is false, and cannot be true unless the call is made on behalf of an AWS account that is the management account or delegated administrator account for an organization in AWS Organizations . If the trail is not an organization trail and this is set to `true` , the trail will be created in all AWS accounts that belong to the organization. If the trail is an organization trail and this is set to `false` , the trail will remain in the current AWS account but be deleted from all member accounts in the organization.","KMSKeyId":"Specifies the AWS KMS key ID to use to encrypt the logs delivered by CloudTrail. The value can be an alias name prefixed by \\"alias/\\", a fully specified ARN to an alias, a fully specified ARN to a key, or a globally unique identifier.\\n\\nCloudTrail also supports AWS KMS multi-Region keys. For more information about multi-Region keys, see [Using multi-Region keys](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) in the *AWS Key Management Service Developer Guide* .\\n\\nExamples:\\n\\n- alias/MyAliasName\\n- arn:aws:kms:us-east-2:123456789012:alias/MyAliasName\\n- arn:aws:kms:us-east-2:123456789012:key/12345678-1234-1234-1234-123456789012\\n- 12345678-1234-1234-1234-123456789012","S3BucketName":"Specifies the name of the Amazon S3 bucket designated for publishing log files. See [Amazon S3 Bucket Naming Requirements](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/create_trail_naming_policy.html) .","S3KeyPrefix":"Specifies the Amazon S3 key prefix that comes after the name of the bucket you have designated for log file delivery. For more information, see [Finding Your CloudTrail Log Files](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-find-log-files.html) . The maximum length is 200 characters.","SnsTopicName":"Specifies the name of the Amazon SNS topic defined for notification of log file delivery. The maximum length is 256 characters.","Tags":"A custom set of tags (key-value pairs) for this trail.","TrailName":"Specifies the name of the trail. The name must meet the following requirements:\\n\\n- Contain only ASCII letters (a-z, A-Z), numbers (0-9), periods (.), underscores (_), or dashes (-)\\n- Start with a letter or number, and end with a letter or number\\n- Be between 3 and 128 characters\\n- Have no adjacent periods, underscores or dashes. Names like `my-_namespace` and `my--namespace` are not valid.\\n- Not be in IP address format (for example, 192.168.5.4)"}},"AWS::CloudTrail::Trail.AdvancedEventSelector":{"attributes":{},"description":"Advanced event selectors let you create fine-grained selectors for the following AWS CloudTrail event record fields. They help you control costs by logging only those events that are important to you. For more information about advanced event selectors, see [Logging data events](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html) in the *AWS CloudTrail User Guide* .\\n\\n- `readOnly`\\n- `eventSource`\\n- `eventName`\\n- `eventCategory`\\n- `resources.type`\\n- `resources.ARN`\\n\\nYou cannot apply both event selectors and advanced event selectors to a trail.","properties":{"FieldSelectors":"Contains all selector statements in an advanced event selector.","Name":"An optional, descriptive name for an advanced event selector, such as \\"Log data events for only two S3 buckets\\"."}},"AWS::CloudTrail::Trail.AdvancedFieldSelector":{"attributes":{},"description":"A single selector statement in an advanced event selector.","properties":{"EndsWith":"An operator that includes events that match the last few characters of the event record field specified as the value of `Field` .","Equals":"An operator that includes events that match the exact value of the event record field specified as the value of `Field` . This is the only valid operator that you can use with the `readOnly` , `eventCategory` , and `resources.type` fields.","Field":"A field in a CloudTrail event record on which to filter events to be logged. For event data stores for AWS Config configuration items, Audit Manager evidence, or non- AWS events, the field is used only for selecting events as filtering is not supported.\\n\\nFor CloudTrail event records, supported fields include `readOnly` , `eventCategory` , `eventSource` (for management events), `eventName` , `resources.type` , and `resources.ARN` .\\n\\nFor event data stores for AWS Config configuration items, Audit Manager evidence, or non- AWS events, the only supported field is `eventCategory` .\\n\\n- *`readOnly`* - Optional. Can be set to `Equals` a value of `true` or `false` . If you do not add this field, CloudTrail logs both `read` and `write` events. A value of `true` logs only `read` events. A value of `false` logs only `write` events.\\n- *`eventSource`* - For filtering management events only. This can be set only to `NotEquals` `kms.amazonaws.com` .\\n- *`eventName`* - Can use any operator. You can use it to filter in or filter out any data event logged to CloudTrail, such as `PutBucket` or `GetSnapshotBlock` . You can have multiple values for this field, separated by commas.\\n- *`eventCategory`* - This is required and must be set to `Equals` .\\n\\n- For CloudTrail event records, the value must be `Management` or `Data` .\\n- For AWS Config configuration items, the value must be `ConfigurationItem` .\\n- For Audit Manager evidence, the value must be `Evidence` .\\n- For non- AWS events, the value must be `ActivityAuditLog` .\\n- *`resources.type`* - This field is required for CloudTrail data events. `resources.type` can only use the `Equals` operator, and the value can be one of the following:\\n\\n- `AWS::DynamoDB::Table`\\n- `AWS::Lambda::Function`\\n- `AWS::S3::Object`\\n- `AWS::CloudTrail::Channel`\\n- `AWS::CodeWhisperer::Profile`\\n- `AWS::Cognito::IdentityPool`\\n- `AWS::DynamoDB::Stream`\\n- `AWS::EC2::Snapshot`\\n- `AWS::EMRWAL::Workspace`\\n- `AWS::FinSpace::Environment`\\n- `AWS::Glue::Table`\\n- `AWS::GuardDuty::Detector`\\n- `AWS::KendraRanking::ExecutionPlan`\\n- `AWS::ManagedBlockchain::Network`\\n- `AWS::ManagedBlockchain::Node`\\n- `AWS::SageMaker::ExperimentTrialComponent`\\n- `AWS::SageMaker::FeatureGroup`\\n- `AWS::S3::AccessPoint`\\n- `AWS::S3ObjectLambda::AccessPoint`\\n- `AWS::S3Outposts::Object`\\n- `AWS::SSMMessages::ControlChannel`\\n- `AWS::VerifiedPermissions::PolicyStore`\\n\\nYou can have only one `resources.type` field per selector. To log data events on more than one resource type, add another selector.\\n- *`resources.ARN`* - You can use any operator with `resources.ARN` , but if you use `Equals` or `NotEquals` , the value must exactly match the ARN of a valid resource of the type you\'ve specified in the template as the value of resources.type. For example, if resources.type equals `AWS::S3::Object` , the ARN must be in one of the following formats. To log all data events for all objects in a specific S3 bucket, use the `StartsWith` operator, and include only the bucket ARN as the matching value.\\n\\nThe trailing slash is intentional; do not exclude it. Replace the text between less than and greater than symbols (<>) with resource-specific information.\\n\\n- `arn::s3:::/`\\n- `arn::s3::://`\\n\\nWhen resources.type equals `AWS::DynamoDB::Table` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::dynamodb:::table/`\\n\\nWhen resources.type equals `AWS::Lambda::Function` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::lambda:::function:`\\n\\nWhen resources.type equals `AWS::CloudTrail::Channel` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::cloudtrail:::channel/`\\n\\nWhen resources.type equals `AWS::CodeWhisperer::Profile` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::codewhisperer:::profile/`\\n\\nWhen resources.type equals `AWS::Cognito::IdentityPool` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::cognito-identity:::identitypool/`\\n\\nWhen `resources.type` equals `AWS::DynamoDB::Stream` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::dynamodb:::table//stream/`\\n\\nWhen `resources.type` equals `AWS::EC2::Snapshot` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::ec2:::snapshot/`\\n\\nWhen `resources.type` equals `AWS::EMRWAL::Workspace` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::emrwal:::workspace/`\\n\\nWhen `resources.type` equals `AWS::FinSpace::Environment` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::finspace:::environment/`\\n\\nWhen `resources.type` equals `AWS::Glue::Table` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::glue:::table//`\\n\\nWhen `resources.type` equals `AWS::GuardDuty::Detector` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::guardduty:::detector/`\\n\\nWhen `resources.type` equals `AWS::KendraRanking::ExecutionPlan` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::kendra-ranking:::rescore-execution-plan/`\\n\\nWhen `resources.type` equals `AWS::ManagedBlockchain::Network` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::managedblockchain:::networks/`\\n\\nWhen `resources.type` equals `AWS::ManagedBlockchain::Node` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::managedblockchain:::nodes/`\\n\\nWhen `resources.type` equals `AWS::SageMaker::ExperimentTrialComponent` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::sagemaker:::experiment-trial-component/`\\n\\nWhen `resources.type` equals `AWS::SageMaker::FeatureGroup` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::sagemaker:::feature-group/`\\n\\nWhen `resources.type` equals `AWS::S3::AccessPoint` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in one of the following formats. To log events on all objects in an S3 access point, we recommend that you use only the access point ARN, don’t include the object path, and use the `StartsWith` or `NotStartsWith` operators.\\n\\n- `arn::s3:::accesspoint/`\\n- `arn::s3:::accesspoint//object/`\\n\\nWhen `resources.type` equals `AWS::S3ObjectLambda::AccessPoint` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::s3-object-lambda:::accesspoint/`\\n\\nWhen `resources.type` equals `AWS::S3Outposts::Object` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::s3-outposts:::`\\n\\nWhen `resources.type` equals `AWS::SSMMessages::ControlChannel` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::ssmmessages:::control-channel/`\\n\\nWhen resources.type equals `AWS::VerifiedPermissions::PolicyStore` , and the operator is set to `Equals` or `NotEquals` , the ARN must be in the following format:\\n\\n- `arn::verifiedpermissions:::policy-store/`","NotEndsWith":"An operator that excludes events that match the last few characters of the event record field specified as the value of `Field` .","NotEquals":"An operator that excludes events that match the exact value of the event record field specified as the value of `Field` .","NotStartsWith":"An operator that excludes events that match the first few characters of the event record field specified as the value of `Field` .","StartsWith":"An operator that includes events that match the first few characters of the event record field specified as the value of `Field` ."}},"AWS::CloudTrail::Trail.DataResource":{"attributes":{},"description":"The Amazon S3 buckets, AWS Lambda functions, or Amazon DynamoDB tables that you specify in event selectors in your AWS CloudFormation template for your trail to log data events. Data events provide information about the resource operations performed on or within a resource itself. These are also known as data plane operations. You can specify up to 250 data resources for a trail. Currently, advanced event selectors for data events are not supported in AWS CloudFormation templates.\\n\\n> The total number of allowed data resources is 250. This number can be distributed between 1 and 5 event selectors, but the total cannot exceed 250 across all selectors. \\n\\nThe following example demonstrates how logging works when you configure logging of all data events for an S3 bucket named `bucket-1` . In this example, the CloudTrail user specified an empty prefix, and the option to log both `Read` and `Write` data events.\\n\\n- A user uploads an image file to `bucket-1` .\\n- The `PutObject` API operation is an Amazon S3 object-level API. It is recorded as a data event in CloudTrail. Because the CloudTrail user specified an S3 bucket with an empty prefix, events that occur on any object in that bucket are logged. The trail processes and logs the event.\\n- A user uploads an object to an Amazon S3 bucket named `arn:aws:s3:::bucket-2` .\\n- The `PutObject` API operation occurred for an object in an S3 bucket that the CloudTrail user didn\'t specify for the trail. The trail doesn’t log the event.\\n\\nThe following example demonstrates how logging works when you configure logging of AWS Lambda data events for a Lambda function named *MyLambdaFunction* , but not for all Lambda functions.\\n\\n- A user runs a script that includes a call to the *MyLambdaFunction* function and the *MyOtherLambdaFunction* function.\\n- The `Invoke` API operation on *MyLambdaFunction* is an Lambda API. It is recorded as a data event in CloudTrail. Because the CloudTrail user specified logging data events for *MyLambdaFunction* , any invocations of that function are logged. The trail processes and logs the event.\\n- The `Invoke` API operation on *MyOtherLambdaFunction* is an Lambda API. Because the CloudTrail user did not specify logging data events for all Lambda functions, the `Invoke` operation for *MyOtherLambdaFunction* does not match the function specified for the trail. The trail doesn’t log the event.","properties":{"Type":"The resource type in which you want to log data events. You can specify the following *basic* event selector resource types:\\n\\n- `AWS::S3::Object`\\n- `AWS::Lambda::Function`\\n- `AWS::DynamoDB::Table`","Values":"An array of Amazon Resource Name (ARN) strings or partial ARN strings for the specified objects.\\n\\n- To log data events for all objects in all S3 buckets in your AWS account , specify the prefix as `arn:aws:s3` .\\n\\n> This also enables logging of data event activity performed by any user or role in your AWS account , even if that activity is performed on a bucket that belongs to another AWS account .\\n- To log data events for all objects in an S3 bucket, specify the bucket and an empty object prefix such as `arn:aws:s3:::bucket-1/` . The trail logs data events for all objects in this S3 bucket.\\n- To log data events for specific objects, specify the S3 bucket and object prefix such as `arn:aws:s3:::bucket-1/example-images` . The trail logs data events for objects in this S3 bucket that match the prefix.\\n- To log data events for all Lambda functions in your AWS account , specify the prefix as `arn:aws:lambda` .\\n\\n> This also enables logging of `Invoke` activity performed by any user or role in your AWS account , even if that activity is performed on a function that belongs to another AWS account .\\n- To log data events for a specific Lambda function, specify the function ARN.\\n\\n> Lambda function ARNs are exact. For example, if you specify a function ARN *arn:aws:lambda:us-west-2:111111111111:function:helloworld* , data events will only be logged for *arn:aws:lambda:us-west-2:111111111111:function:helloworld* . They will not be logged for *arn:aws:lambda:us-west-2:111111111111:function:helloworld2* .\\n- To log data events for all DynamoDB tables in your AWS account , specify the prefix as `arn:aws:dynamodb` ."}},"AWS::CloudTrail::Trail.EventSelector":{"attributes":{},"description":"Use event selectors to further specify the management and data event settings for your trail. By default, trails created without specific event selectors will be configured to log all read and write management events, and no data events. When an event occurs in your account, CloudTrail evaluates the event selector for all trails. For each trail, if the event matches any event selector, the trail processes and logs the event. If the event doesn\'t match any event selector, the trail doesn\'t log the event.\\n\\nYou can configure up to five event selectors for a trail.\\n\\nYou cannot apply both event selectors and advanced event selectors to a trail.","properties":{"DataResources":"In AWS CloudFormation , CloudTrail supports data event logging for Amazon S3 objects, Amazon DynamoDB tables, and AWS Lambda functions. Currently, advanced event selectors for data events are not supported in AWS CloudFormation templates. You can specify up to 250 resources for an individual event selector, but the total number of data resources cannot exceed 250 across all event selectors in a trail. This limit does not apply if you configure resource logging for all data events.\\n\\nFor more information, see [Logging data events](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html) and [Limits in AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/WhatIsCloudTrail-Limits.html) in the *AWS CloudTrail User Guide* .","ExcludeManagementEventSources":"An optional list of service event sources from which you do not want management events to be logged on your trail. In this release, the list can be empty (disables the filter), or it can filter out AWS Key Management Service or Amazon RDS Data API events by containing `kms.amazonaws.com` or `rdsdata.amazonaws.com` . By default, `ExcludeManagementEventSources` is empty, and AWS KMS and Amazon RDS Data API events are logged to your trail. You can exclude management event sources only in Regions that support the event source.","IncludeManagementEvents":"Specify if you want your event selector to include management events for your trail.\\n\\nFor more information, see [Management Events](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-management-events-with-cloudtrail.html) in the *AWS CloudTrail User Guide* .\\n\\nBy default, the value is `true` .\\n\\nThe first copy of management events is free. You are charged for additional copies of management events that you are logging on any subsequent trail in the same Region. For more information about CloudTrail pricing, see [AWS CloudTrail Pricing](https://docs.aws.amazon.com/cloudtrail/pricing/) .","ReadWriteType":"Specify if you want your trail to log read-only events, write-only events, or all. For example, the EC2 `GetConsoleOutput` is a read-only API operation and `RunInstances` is a write-only API operation.\\n\\nBy default, the value is `All` ."}},"AWS::CloudTrail::Trail.InsightSelector":{"attributes":{},"description":"A JSON string that contains a list of Insights types that are logged on a trail.","properties":{"InsightType":"The type of Insights events to log on a trail. `ApiCallRateInsight` and `ApiErrorRateInsight` are valid Insight types.\\n\\nThe `ApiCallRateInsight` Insights type analyzes write-only management API calls that are aggregated per minute against a baseline API call volume.\\n\\nThe `ApiErrorRateInsight` Insights type analyzes management API calls that result in error codes. The error is shown if the API call is unsuccessful."}},"AWS::CloudWatch::Alarm":{"attributes":{"Arn":"The ARN of the CloudWatch alarm, such as `arn:aws:cloudwatch:us-west-2:123456789012:alarm:myCloudWatchAlarm-CPUAlarm-UXMMZK36R55Z` .","Ref":"`Ref` returns the alarm name, such as `TestAlarm` ."},"description":"The `AWS::CloudWatch::Alarm` type specifies an alarm and associates it with the specified metric or metric math expression.\\n\\nWhen this operation creates an alarm, the alarm state is immediately set to `INSUFFICIENT_DATA` . The alarm is then evaluated and its state is set appropriately. Any actions associated with the new state are then executed.\\n\\nWhen you update an existing alarm, its state is left unchanged, but the update completely overwrites the previous configuration of the alarm.","properties":{"ActionsEnabled":"Indicates whether actions should be executed during any changes to the alarm state. The default is TRUE.","AlarmActions":"The list of actions to execute when this alarm transitions into an ALARM state from any other state. Specify each action as an Amazon Resource Name (ARN). For more information about creating alarms and the actions that you can specify, see [PutMetricAlarm](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutMetricAlarm.html) in the *Amazon CloudWatch API Reference* .","AlarmDescription":"The description of the alarm.","AlarmName":"The name of the alarm. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the alarm name.\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","ComparisonOperator":"The arithmetic operation to use when comparing the specified statistic and threshold. The specified statistic value is used as the first operand.\\n\\nYou can specify the following values: `GreaterThanThreshold` , `GreaterThanOrEqualToThreshold` , `LessThanThreshold` , or `LessThanOrEqualToThreshold` .","DatapointsToAlarm":"The number of datapoints that must be breaching to trigger the alarm. This is used only if you are setting an \\"M out of N\\" alarm. In that case, this value is the M, and the value that you set for `EvaluationPeriods` is the N value. For more information, see [Evaluating an Alarm](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html#alarm-evaluation) in the *Amazon CloudWatch User Guide* .\\n\\nIf you omit this parameter, CloudWatch uses the same value here that you set for `EvaluationPeriods` , and the alarm goes to alarm state if that many consecutive periods are breaching.","Dimensions":"The dimensions for the metric associated with the alarm. For an alarm based on a math expression, you can\'t specify `Dimensions` . Instead, you use `Metrics` .","EvaluateLowSampleCountPercentile":"Used only for alarms based on percentiles. If `ignore` , the alarm state does not change during periods with too few data points to be statistically significant. If `evaluate` or this parameter is not used, the alarm is always evaluated and possibly changes state no matter how many data points are available.","EvaluationPeriods":"The number of periods over which data is compared to the specified threshold. If you are setting an alarm that requires that a number of consecutive data points be breaching to trigger the alarm, this value specifies that number. If you are setting an \\"M out of N\\" alarm, this value is the N, and `DatapointsToAlarm` is the M.\\n\\nFor more information, see [Evaluating an Alarm](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html#alarm-evaluation) in the *Amazon CloudWatch User Guide* .","ExtendedStatistic":"The percentile statistic for the metric associated with the alarm. Specify a value between p0.0 and p100.\\n\\nFor an alarm based on a metric, you must specify either `Statistic` or `ExtendedStatistic` but not both.\\n\\nFor an alarm based on a math expression, you can\'t specify `ExtendedStatistic` . Instead, you use `Metrics` .","InsufficientDataActions":"The actions to execute when this alarm transitions to the `INSUFFICIENT_DATA` state from any other state. Each action is specified as an Amazon Resource Name (ARN).","MetricName":"The name of the metric associated with the alarm. This is required for an alarm based on a metric. For an alarm based on a math expression, you use `Metrics` instead and you can\'t specify `MetricName` .","Metrics":"An array that enables you to create an alarm based on the result of a metric math expression. Each item in the array either retrieves a metric or performs a math expression.\\n\\nIf you specify the `Metrics` parameter, you cannot specify `MetricName` , `Dimensions` , `Period` , `Namespace` , `Statistic` , `ExtendedStatistic` , or `Unit` .","Namespace":"The namespace of the metric associated with the alarm. This is required for an alarm based on a metric. For an alarm based on a math expression, you can\'t specify `Namespace` and you use `Metrics` instead.\\n\\nFor a list of namespaces for metrics from AWS services, see [AWS Services That Publish CloudWatch Metrics.](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html)","OKActions":"The actions to execute when this alarm transitions to the `OK` state from any other state. Each action is specified as an Amazon Resource Name (ARN).","Period":"The period, in seconds, over which the statistic is applied. This is required for an alarm based on a metric. Valid values are 10, 30, 60, and any multiple of 60.\\n\\nFor an alarm based on a math expression, you can\'t specify `Period` , and instead you use the `Metrics` parameter.\\n\\n*Minimum:* 10","Statistic":"The statistic for the metric associated with the alarm, other than percentile. For percentile statistics, use `ExtendedStatistic` .\\n\\nFor an alarm based on a metric, you must specify either `Statistic` or `ExtendedStatistic` but not both.\\n\\nFor an alarm based on a math expression, you can\'t specify `Statistic` . Instead, you use `Metrics` .","Threshold":"The value to compare with the specified statistic.","ThresholdMetricId":"In an alarm based on an anomaly detection model, this is the ID of the `ANOMALY_DETECTION_BAND` function used as the threshold for the alarm.","TreatMissingData":"Sets how this alarm is to handle missing data points. Valid values are `breaching` , `notBreaching` , `ignore` , and `missing` . For more information, see [Configuring How CloudWatch Alarms Treat Missing Data](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html#alarms-and-missing-data) in the *Amazon CloudWatch User Guide* .\\n\\nIf you omit this parameter, the default behavior of `missing` is used.","Unit":"The unit of the metric associated with the alarm. Specify this only if you are creating an alarm based on a single metric. Do not specify this if you are specifying a `Metrics` array.\\n\\nYou can specify the following values: Seconds, Microseconds, Milliseconds, Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes, Bits, Kilobits, Megabits, Gigabits, Terabits, Percent, Count, Bytes/Second, Kilobytes/Second, Megabytes/Second, Gigabytes/Second, Terabytes/Second, Bits/Second, Kilobits/Second, Megabits/Second, Gigabits/Second, Terabits/Second, Count/Second, or None."}},"AWS::CloudWatch::Alarm.Dimension":{"attributes":{},"description":"Dimension is an embedded property of the `AWS::CloudWatch::Alarm` type. Dimensions are name/value pairs that can be associated with a CloudWatch metric. You can specify a maximum of 10 dimensions for a given metric.","properties":{"Name":"The name of the dimension, from 1–255 characters in length. This dimension name must have been included when the metric was published.","Value":"The value for the dimension, from 1–255 characters in length."}},"AWS::CloudWatch::Alarm.Metric":{"attributes":{},"description":"The `Metric` property type represents a specific metric. `Metric` is a property of the [MetricStat](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html) property type.","properties":{"Dimensions":"The metric dimensions that you want to be used for the metric that the alarm will watch.","MetricName":"The name of the metric that you want the alarm to watch. This is a required field.","Namespace":"The namespace of the metric that the alarm will watch."}},"AWS::CloudWatch::Alarm.MetricDataQuery":{"attributes":{},"description":"The `MetricDataQuery` property type specifies the metric data to return, and whether this call is just retrieving a batch set of data for one metric, or is performing a math expression on metric data.\\n\\nAny expression used must return a single time series. For more information, see [Metric Math Syntax and Functions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html#metric-math-syntax) in the *Amazon CloudWatch User Guide* .","properties":{"AccountId":"The ID of the account where the metrics are located, if this is a cross-account alarm.","Expression":"The math expression to be performed on the returned data, if this object is performing a math expression. This expression can use the `Id` of the other metrics to refer to those metrics, and can also use the `Id` of other expressions to use the result of those expressions. For more information about metric math expressions, see [Metric Math Syntax and Functions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html#metric-math-syntax) in the *Amazon CloudWatch User Guide* .\\n\\nWithin each MetricDataQuery object, you must specify either `Expression` or `MetricStat` but not both.","Id":"A short name used to tie this object to the results in the response. This name must be unique within a single call to `GetMetricData` . If you are performing math expressions on this set of data, this name represents that data and can serve as a variable in the mathematical expression. The valid characters are letters, numbers, and underscore. The first character must be a lowercase letter.","Label":"A human-readable label for this metric or expression. This is especially useful if this is an expression, so that you know what the value represents. If the metric or expression is shown in a CloudWatch dashboard widget, the label is shown. If `Label` is omitted, CloudWatch generates a default.","MetricStat":"The metric to be returned, along with statistics, period, and units. Use this parameter only if this object is retrieving a metric and not performing a math expression on returned data.\\n\\nWithin one MetricDataQuery object, you must specify either `Expression` or `MetricStat` but not both.","Period":"The granularity, in seconds, of the returned data points. For metrics with regular resolution, a period can be as short as one minute (60 seconds) and must be a multiple of 60. For high-resolution metrics that are collected at intervals of less than one minute, the period can be 1, 5, 10, 30, 60, or any multiple of 60. High-resolution metrics are those metrics stored by a `PutMetricData` operation that includes a `StorageResolution of 1 second` .","ReturnData":"This option indicates whether to return the timestamps and raw data values of this metric.\\n\\nWhen you create an alarm based on a metric math expression, specify `True` for this value for only the one math expression that the alarm is based on. You must specify `False` for `ReturnData` for all the other metrics and expressions used in the alarm.\\n\\nThis field is required."}},"AWS::CloudWatch::Alarm.MetricStat":{"attributes":{},"description":"This structure defines the metric to be returned, along with the statistics, period, and units.\\n\\n`MetricStat` is a property of the [MetricDataQuery](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html) property type.","properties":{"Metric":"The metric to return, including the metric name, namespace, and dimensions.","Period":"The granularity, in seconds, of the returned data points. For metrics with regular resolution, a period can be as short as one minute (60 seconds) and must be a multiple of 60. For high-resolution metrics that are collected at intervals of less than one minute, the period can be 1, 5, 10, 30, 60, or any multiple of 60. High-resolution metrics are those metrics stored by a `PutMetricData` call that includes a `StorageResolution` of 1 second.\\n\\nIf the `StartTime` parameter specifies a time stamp that is greater than 3 hours ago, you must specify the period as follows or no data points in that time range is returned:\\n\\n- Start time between 3 hours and 15 days ago - Use a multiple of 60 seconds (1 minute).\\n- Start time between 15 and 63 days ago - Use a multiple of 300 seconds (5 minutes).\\n- Start time greater than 63 days ago - Use a multiple of 3600 seconds (1 hour).","Stat":"The statistic to return. It can include any CloudWatch statistic or extended statistic. For a list of valid values, see the table in [Statistics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Statistic) in the *Amazon CloudWatch User Guide* .","Unit":"The unit to use for the returned data points.\\n\\nValid values are: Seconds, Microseconds, Milliseconds, Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes, Bits, Kilobits, Megabits, Gigabits, Terabits, Percent, Count, Bytes/Second, Kilobytes/Second, Megabytes/Second, Gigabytes/Second, Terabytes/Second, Bits/Second, Kilobits/Second, Megabits/Second, Gigabits/Second, Terabits/Second, Count/Second, or None."}},"AWS::CloudWatch::AnomalyDetector":{"attributes":{},"description":"The `AWS::CloudWatch::AnomalyDetector` type specifies an anomaly detection band for a certain metric and statistic. The band represents the expected \\"normal\\" range for the metric values. Anomaly detection bands can be used for visualization of a metric\'s expected values, and for alarms.","properties":{"Configuration":"Specifies details about how the anomaly detection model is to be trained, including time ranges to exclude when training and updating the model. The configuration can also include the time zone to use for the metric.","Dimensions":"The dimensions of the metric associated with the anomaly detection band.","MetricMathAnomalyDetector":"The CloudWatch metric math expression for this anomaly detector.","MetricName":"The name of the metric associated with the anomaly detection band.","Namespace":"The namespace of the metric associated with the anomaly detection band.","SingleMetricAnomalyDetector":"The CloudWatch metric and statistic for this anomaly detector.","Stat":"The statistic of the metric associated with the anomaly detection band."}},"AWS::CloudWatch::AnomalyDetector.Configuration":{"attributes":{},"description":"Specifies details about how the anomaly detection model is to be trained, including time ranges to exclude when training and updating the model. The configuration can also include the time zone to use for the metric.","properties":{"ExcludedTimeRanges":"Specifies an array of time ranges to exclude from use when the anomaly detection model is trained and updated. Use this to make sure that events that could cause unusual values for the metric, such as deployments, aren\'t used when CloudWatch creates or updates the model.","MetricTimeZone":"The time zone to use for the metric. This is useful to enable the model to automatically account for daylight savings time changes if the metric is sensitive to such time changes.\\n\\nTo specify a time zone, use the name of the time zone as specified in the standard tz database. For more information, see [tz database](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Tz_database) ."}},"AWS::CloudWatch::AnomalyDetector.Dimension":{"attributes":{},"description":"A dimension is a name/value pair that is part of the identity of a metric. Because dimensions are part of the unique identifier for a metric, whenever you add a unique name/value pair to one of your metrics, you are creating a new variation of that metric. For example, many Amazon EC2 metrics publish `InstanceId` as a dimension name, and the actual instance ID as the value for that dimension.\\n\\nYou can assign up to 30 dimensions to a metric.","properties":{"Name":"The name of the dimension.","Value":"The value of the dimension. Dimension values must contain only ASCII characters and must include at least one non-whitespace character. ASCII control characters are not supported as part of dimension values."}},"AWS::CloudWatch::AnomalyDetector.Metric":{"attributes":{},"description":"Represents a specific metric.","properties":{"Dimensions":"The dimensions for the metric.","MetricName":"The name of the metric. This is a required field.","Namespace":"The namespace of the metric."}},"AWS::CloudWatch::AnomalyDetector.MetricDataQueries":{"attributes":{},"description":"An array of metric data query structures that enables you to create an anomaly detector based on the result of a metric math expression. Each item in `MetricDataQueries` gets a metric or performs a math expression. One item in `MetricDataQueries` is the expression that provides the time series that the anomaly detector uses as input. Designate the expression by setting `ReturnData` to `true` for this object in the array. For all other expressions and metrics, set `ReturnData` to `false` . The designated expression must return a single time series.","properties":{}},"AWS::CloudWatch::AnomalyDetector.MetricDataQuery":{"attributes":{},"description":"This structure is used in both `GetMetricData` and `PutMetricAlarm` . The supported use of this structure is different for those two operations.\\n\\nWhen used in `GetMetricData` , it indicates the metric data to return, and whether this call is just retrieving a batch set of data for one metric, or is performing a Metrics Insights query or a math expression. A single `GetMetricData` call can include up to 500 `MetricDataQuery` structures.\\n\\nWhen used in `PutMetricAlarm` , it enables you to create an alarm based on a metric math expression. Each `MetricDataQuery` in the array specifies either a metric to retrieve, or a math expression to be performed on retrieved metrics. A single `PutMetricAlarm` call can include up to 20 `MetricDataQuery` structures in the array. The 20 structures can include as many as 10 structures that contain a `MetricStat` parameter to retrieve a metric, and as many as 10 structures that contain the `Expression` parameter to perform a math expression. Of those `Expression` structures, one must have `true` as the value for `ReturnData` . The result of this expression is the value the alarm watches.\\n\\nAny expression used in a `PutMetricAlarm` operation must return a single time series. For more information, see [Metric Math Syntax and Functions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html#metric-math-syntax) in the *Amazon CloudWatch User Guide* .\\n\\nSome of the parameters of this structure also have different uses whether you are using this structure in a `GetMetricData` operation or a `PutMetricAlarm` operation. These differences are explained in the following parameter list.","properties":{"AccountId":"The ID of the account where the metrics are located.\\n\\nIf you are performing a `GetMetricData` operation in a monitoring account, use this to specify which account to retrieve this metric from.\\n\\nIf you are performing a `PutMetricAlarm` operation, use this to specify which account contains the metric that the alarm is watching.","Expression":"This field can contain either a Metrics Insights query, or a metric math expression to be performed on the returned data. For more information about Metrics Insights queries, see [Metrics Insights query components and syntax](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-metrics-insights-querylanguage) in the *Amazon CloudWatch User Guide* .\\n\\nA math expression can use the `Id` of the other metrics or queries to refer to those metrics, and can also use the `Id` of other expressions to use the result of those expressions. For more information about metric math expressions, see [Metric Math Syntax and Functions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html#metric-math-syntax) in the *Amazon CloudWatch User Guide* .\\n\\nWithin each MetricDataQuery object, you must specify either `Expression` or `MetricStat` but not both.","Id":"A short name used to tie this object to the results in the response. This name must be unique within a single call to `GetMetricData` . If you are performing math expressions on this set of data, this name represents that data and can serve as a variable in the mathematical expression. The valid characters are letters, numbers, and underscore. The first character must be a lowercase letter.","Label":"A human-readable label for this metric or expression. This is especially useful if this is an expression, so that you know what the value represents. If the metric or expression is shown in a CloudWatch dashboard widget, the label is shown. If Label is omitted, CloudWatch generates a default.\\n\\nYou can put dynamic expressions into a label, so that it is more descriptive. For more information, see [Using Dynamic Labels](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/graph-dynamic-labels.html) .","MetricStat":"The metric to be returned, along with statistics, period, and units. Use this parameter only if this object is retrieving a metric and not performing a math expression on returned data.\\n\\nWithin one MetricDataQuery object, you must specify either `Expression` or `MetricStat` but not both.","Period":"The granularity, in seconds, of the returned data points. For metrics with regular resolution, a period can be as short as one minute (60 seconds) and must be a multiple of 60. For high-resolution metrics that are collected at intervals of less than one minute, the period can be 1, 5, 10, 30, 60, or any multiple of 60. High-resolution metrics are those metrics stored by a `PutMetricData` operation that includes a `StorageResolution of 1 second` .","ReturnData":"When used in `GetMetricData` , this option indicates whether to return the timestamps and raw data values of this metric. If you are performing this call just to do math expressions and do not also need the raw data returned, you can specify `false` . If you omit this, the default of `true` is used.\\n\\nWhen used in `PutMetricAlarm` , specify `true` for the one expression result to use as the alarm. For all other metrics and expressions in the same `PutMetricAlarm` operation, specify `ReturnData` as False."}},"AWS::CloudWatch::AnomalyDetector.MetricMathAnomalyDetector":{"attributes":{},"description":"Indicates the CloudWatch math expression that provides the time series the anomaly detector uses as input. The designated math expression must return a single time series.","properties":{"MetricDataQueries":"An array of metric data query structures that enables you to create an anomaly detector based on the result of a metric math expression. Each item in `MetricDataQueries` gets a metric or performs a math expression. One item in `MetricDataQueries` is the expression that provides the time series that the anomaly detector uses as input. Designate the expression by setting `ReturnData` to `true` for this object in the array. For all other expressions and metrics, set `ReturnData` to `false` . The designated expression must return a single time series."}},"AWS::CloudWatch::AnomalyDetector.MetricStat":{"attributes":{},"description":"This structure defines the metric to be returned, along with the statistics, period, and units.","properties":{"Metric":"The metric to return, including the metric name, namespace, and dimensions.","Period":"The granularity, in seconds, of the returned data points. For metrics with regular resolution, a period can be as short as one minute (60 seconds) and must be a multiple of 60. For high-resolution metrics that are collected at intervals of less than one minute, the period can be 1, 5, 10, 30, 60, or any multiple of 60. High-resolution metrics are those metrics stored by a `PutMetricData` call that includes a `StorageResolution` of 1 second.\\n\\nIf the `StartTime` parameter specifies a time stamp that is greater than 3 hours ago, you must specify the period as follows or no data points in that time range is returned:\\n\\n- Start time between 3 hours and 15 days ago - Use a multiple of 60 seconds (1 minute).\\n- Start time between 15 and 63 days ago - Use a multiple of 300 seconds (5 minutes).\\n- Start time greater than 63 days ago - Use a multiple of 3600 seconds (1 hour).","Stat":"The statistic to return. It can include any CloudWatch statistic or extended statistic.","Unit":"When you are using a `Put` operation, this defines what unit you want to use when storing the metric.\\n\\nIn a `Get` operation, if you omit `Unit` then all data that was collected with any unit is returned, along with the corresponding units that were specified when the data was reported to CloudWatch. If you specify a unit, the operation returns only data that was collected with that unit specified. If you specify a unit that does not match the data collected, the results of the operation are null. CloudWatch does not perform unit conversions."}},"AWS::CloudWatch::AnomalyDetector.Range":{"attributes":{},"description":"Each `Range` specifies one range of days or times to exclude from use for training or updating an anomaly detection model.","properties":{"EndTime":"The end time of the range to exclude. The format is `yyyy-MM-dd\'T\'HH:mm:ss` . For example, `2019-07-01T23:59:59` .","StartTime":"The start time of the range to exclude. The format is `yyyy-MM-dd\'T\'HH:mm:ss` . For example, `2019-07-01T23:59:59` ."}},"AWS::CloudWatch::AnomalyDetector.SingleMetricAnomalyDetector":{"attributes":{},"description":"Designates the CloudWatch metric and statistic that provides the time series the anomaly detector uses as input.","properties":{"Dimensions":"The metric dimensions to create the anomaly detection model for.","MetricName":"The name of the metric to create the anomaly detection model for.","Namespace":"The namespace of the metric to create the anomaly detection model for.","Stat":"The statistic to use for the metric and anomaly detection model."}},"AWS::CloudWatch::CompositeAlarm":{"attributes":{"Arn":"The ARN of the composite alarm, such as `arn:aws:cloudwatch:us-west-2:123456789012:alarm/CompositeAlarmName` .","Ref":"`Ref` returns the alarm name, such as `MyCompositeAlarm` ."},"description":"The `AWS::CloudWatch::CompositeAlarm` type creates or updates a composite alarm. When you create a composite alarm, you specify a rule expression for the alarm that takes into account the alarm states of other alarms that you have created. The composite alarm goes into ALARM state only if all conditions of the rule are met.\\n\\nThe alarms specified in a composite alarm\'s rule expression can include metric alarms and other composite alarms.\\n\\nUsing composite alarms can reduce alarm noise. You can create multiple metric alarms, and also create a composite alarm and set up alerts only for the composite alarm. For example, you could create a composite alarm that goes into ALARM state only when more than one of the underlying metric alarms are in ALARM state.\\n\\nCurrently, the only alarm actions that can be taken by composite alarms are notifying SNS topics.\\n\\nWhen this operation creates an alarm, the alarm state is immediately set to INSUFFICIENT_DATA. The alarm is then evaluated and its state is set appropriately. Any actions associated with the new state are then executed. For a composite alarm, this initial time after creation is the only time that the alarm can be in INSUFFICIENT_DATA state.\\n\\nWhen you update an existing alarm, its state is left unchanged, but the update completely overwrites the previous configuration of the alarm.","properties":{"ActionsEnabled":"Indicates whether actions should be executed during any changes to the alarm state of the composite alarm. The default is TRUE.","ActionsSuppressor":"Actions will be suppressed if the suppressor alarm is in the `ALARM` state. `ActionsSuppressor` can be an AlarmName or an Amazon Resource Name (ARN) from an existing alarm.","ActionsSuppressorExtensionPeriod":"The maximum time in seconds that the composite alarm waits after suppressor alarm goes out of the `ALARM` state. After this time, the composite alarm performs its actions.\\n\\n> `ExtensionPeriod` is required only when `ActionsSuppressor` is specified.","ActionsSuppressorWaitPeriod":"The maximum time in seconds that the composite alarm waits for the suppressor alarm to go into the `ALARM` state. After this time, the composite alarm performs its actions.\\n\\n> `WaitPeriod` is required only when `ActionsSuppressor` is specified.","AlarmActions":"The actions to execute when this alarm transitions to the ALARM state from any other state. Each action is specified as an Amazon Resource Name (ARN). For more information about creating alarms and the actions that you can specify, see [PutCompositeAlarm](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutCompositeAlarm.html) in the *Amazon CloudWatch API Reference* .","AlarmDescription":"The description for the composite alarm.","AlarmName":"The name for the composite alarm. This name must be unique within your AWS account.","AlarmRule":"An expression that specifies which other alarms are to be evaluated to determine this composite alarm\'s state. For each alarm that you reference, you designate a function that specifies whether that alarm needs to be in ALARM state, OK state, or INSUFFICIENT_DATA state. You can use operators (AND, OR and NOT) to combine multiple functions in a single expression. You can use parenthesis to logically group the functions in your expression.\\n\\nYou can use either alarm names or ARNs to reference the other alarms that are to be evaluated.\\n\\nFunctions can include the following:\\n\\n- ALARM(\\"alarm-name or alarm-ARN\\") is TRUE if the named alarm is in ALARM state.\\n- OK(\\"alarm-name or alarm-ARN\\") is TRUE if the named alarm is in OK state.\\n- INSUFFICIENT_DATA(\\"alarm-name or alarm-ARN\\") is TRUE if the named alarm is in INSUFFICIENT_DATA state.\\n- TRUE always evaluates to TRUE.\\n- FALSE always evaluates to FALSE.\\n\\nTRUE and FALSE are useful for testing a complex AlarmRule structure, and for testing your alarm actions.\\n\\nFor more information about `AlarmRule` syntax, see [PutCompositeAlarm](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutCompositeAlarm.html) in the *Amazon CloudWatch API Reference* .","InsufficientDataActions":"The actions to execute when this alarm transitions to the INSUFFICIENT_DATA state from any other state. Each action is specified as an Amazon Resource Name (ARN). For more information about creating alarms and the actions that you can specify, see [PutCompositeAlarm](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutCompositeAlarm.html) in the *Amazon CloudWatch API Reference* .","OKActions":"The actions to execute when this alarm transitions to the OK state from any other state. Each action is specified as an Amazon Resource Name (ARN). For more information about creating alarms and the actions that you can specify, see [PutCompositeAlarm](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutCompositeAlarm.html) in the *Amazon CloudWatch API Reference* ."}},"AWS::CloudWatch::Dashboard":{"attributes":{"Ref":"`Ref` returns the value of `DashboardName` ."},"description":"The `AWS::CloudWatch::Dashboard` resource specifies an Amazon CloudWatch dashboard. A dashboard is a customizable home page in the CloudWatch console that you can use to monitor your AWS resources in a single view.\\n\\nAll dashboards in your account are global, not region-specific.","properties":{"DashboardBody":"The detailed information about the dashboard in JSON format, including the widgets to include and their location on the dashboard. This parameter is required.\\n\\nFor more information about the syntax, see [Dashboard Body Structure and Syntax](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/CloudWatch-Dashboard-Body-Structure.html) .","DashboardName":"The name of the dashboard. The name must be between 1 and 255 characters. If you do not specify a name, one will be generated automatically."}},"AWS::CloudWatch::InsightRule":{"attributes":{"Arn":"The ARN of the Contributor Insights rule, such as `arn:aws:cloudwatch:us-west-2:123456789012:insight-rule/MyInsightRuleName` .","Ref":"`Ref` returns the ARN of the rule.","RuleName":"The name of the Contributor Insights rule."},"description":"Creates or updates a Contributor Insights rule. Rules evaluate log events in a CloudWatch Logs log group, enabling you to find contributor data for the log events in that log group. For more information, see [Using Contributor Insights to Analyze High-Cardinality Data](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContributorInsights.html) in the *Amazon CloudWatch User Guide* .","properties":{"RuleBody":"The definition of the rule, as a JSON object. For details about the syntax, see [Contributor Insights Rule Syntax](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContributorInsights-RuleSyntax.html) in the *Amazon CloudWatch User Guide* .","RuleName":"The name of the rule.","RuleState":"The current state of the rule. Valid values are `ENABLED` and `DISABLED` .","Tags":"A list of key-value pairs to associate with the Contributor Insights rule. You can associate as many as 50 tags with a rule.\\n\\nTags can help you organize and categorize your resources. For more information, see [Tagging Your Amazon CloudWatch Resources](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Tagging.html) .\\n\\nTo be able to associate tags with a rule, you must have the `cloudwatch:TagResource` permission in addition to the `cloudwatch:PutInsightRule` permission."}},"AWS::CloudWatch::InsightRule.Tags":{"attributes":{},"description":"A list of key-value pairs to associate with the Contributor Insights rule. You can associate as many as 50 tags with a rule.\\n\\nTags can help you organize and categorize your resources. For more information, see [Tagging Your Amazon CloudWatch Resources](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Tagging.html) .\\n\\nTo be able to associate tags with a rule, you must have the `cloudwatch:TagResource` permission in addition to the `cloudwatch:PutInsightRule` permission.","properties":{}},"AWS::CloudWatch::MetricStream":{"attributes":{"Arn":"The ARN of the metric stream.","CreationDate":"The date that the metric stream was originally created.","LastUpdateDate":"The date that the metric stream was most recently updated.","Ref":"`Ref` returns the name of the metric stream.","State":"The state of the metric stream, either `running` or `stopped` ."},"description":"Creates or updates a metric stream. Metrics streams can automatically stream CloudWatch metrics to AWS destinations including Amazon S3 and to many third-party solutions. For more information, see [Metric streams](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Metric-Streams.html) .\\n\\nTo create a metric stream, you must be logged on to an account that has the `iam:PassRole` permission and either the *CloudWatchFullAccess* policy or the `cloudwatch:PutMetricStream` permission.\\n\\nWhen you create or update a metric stream, you choose one of the following:\\n\\n- Stream metrics from all metric namespaces in the account.\\n- Stream metrics from all metric namespaces in the account, except for the namespaces that you list in `ExcludeFilters` .\\n- Stream metrics from only the metric namespaces that you list in `IncludeFilters` .\\n\\nWhen you create a metric stream, the stream is created in the `running` state. If you update an existing metric stream, the state does not change.\\n\\nIf you create a metric stream in an account that has been set up as a monitoring account in CloudWatch cross-account observability, you can choose whether to include metrics from linked source accounts in the metric stream.","properties":{"ExcludeFilters":"If you specify this parameter, the stream sends metrics from all metric namespaces except for the namespaces that you specify here. You cannot specify both `IncludeFilters` and `ExcludeFilters` in the same metric stream.\\n\\nWhen you modify the `IncludeFilters` or `ExcludeFilters` of an existing metric stream in any way, the metric stream is effectively restarted, so after such a change you will get only the datapoints that have a timestamp after the time of the update.","FirehoseArn":"The ARN of the Amazon Kinesis Firehose delivery stream to use for this metric stream. This Amazon Kinesis Firehose delivery stream must already exist and must be in the same account as the metric stream.","IncludeFilters":"If you specify this parameter, the stream sends only the metrics from the metric namespaces that you specify here. You cannot specify both `IncludeFilters` and `ExcludeFilters` in the same metric stream.\\n\\nWhen you modify the `IncludeFilters` or `ExcludeFilters` of an existing metric stream in any way, the metric stream is effectively restarted, so after such a change you will get only the datapoints that have a timestamp after the time of the update.","IncludeLinkedAccountsMetrics":"If you are creating a metric stream in a monitoring account, specify `true` to include metrics from source accounts that are linked to this monitoring account, in the metric stream. The default is `false` .\\n\\nFor more information about linking accounts, see [CloudWatch cross-account observability](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html)","Name":"If you are creating a new metric stream, this is the name for the new stream. The name must be different than the names of other metric streams in this account and Region.\\n\\nIf you are updating a metric stream, specify the name of that stream here.","OutputFormat":"The output format for the stream. Valid values are `json` and `opentelemetry0.7` For more information about metric stream output formats, see [Metric streams output formats](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-formats.html) .\\n\\nThis parameter is required.","RoleArn":"The ARN of an IAM role that this metric stream will use to access Amazon Kinesis Firehose resources. This IAM role must already exist and must be in the same account as the metric stream. This IAM role must include the `firehose:PutRecord` and `firehose:PutRecordBatch` permissions.","StatisticsConfigurations":"By default, a metric stream always sends the MAX, MIN, SUM, and SAMPLECOUNT statistics for each metric that is streamed. You can use this parameter to have the metric stream also send additional statistics in the stream. This array can have up to 100 members.\\n\\nFor each entry in this array, you specify one or more metrics and the list of additional statistics to stream for those metrics. The additional statistics that you can stream depend on the stream\'s `OutputFormat` . If the `OutputFormat` is `json` , you can stream any additional statistic that is supported by CloudWatch , listed in [CloudWatch statistics definitions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Statistics-definitions.html.html) . If the `OutputFormat` is `opentelemetry0` .7, you can stream percentile statistics *(p??)* .","Tags":"An array of key-value pairs to apply to the metric stream.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::CloudWatch::MetricStream.MetricStreamFilter":{"attributes":{},"description":"This structure contains a metric namespace and optionally, a list of metric names, to either include in a metric \' stream or exclude from a metric stream.\\n\\nA metric stream\'s filters can include up to 1000 total names. This limit applies to the sum of namespace names and metric names in the filters. For example, this could include 10 metric namespace filters with 99 metrics each, or 20 namespace filters with 49 metrics specified in each filter.","properties":{"MetricNames":"The names of the metrics to either include or exclude from the metric stream.\\n\\nIf you omit this parameter, all metrics in the namespace are included or excluded, depending on whether this filter is specified as an exclude filter or an include filter.\\n\\nEach metric name can contain only ASCII printable characters (ASCII range 32 through 126). Each metric name must contain at least one non-whitespace character.","Namespace":"The name of the metric namespace in the filter.\\n\\nThe namespace can contain only ASCII printable characters (ASCII range 32 through 126). It must contain at least one non-whitespace character."}},"AWS::CloudWatch::MetricStream.MetricStreamStatisticsConfiguration":{"attributes":{},"description":"This structure specifies a list of additional statistics to stream, and the metrics to stream those additional statistics for.\\n\\nAll metrics that match the combination of metric name and namespace will be streamed with the additional statistics, no matter their dimensions.","properties":{"AdditionalStatistics":"The additional statistics to stream for the metrics listed in `IncludeMetrics` .","IncludeMetrics":"An array that defines the metrics that are to have additional statistics streamed."}},"AWS::CloudWatch::MetricStream.MetricStreamStatisticsMetric":{"attributes":{},"description":"A structure that specifies the metric name and namespace for one metric that is going to have additional statistics included in the stream.","properties":{"MetricName":"The name of the metric.","Namespace":"The namespace of the metric."}},"AWS::CodeArtifact::Domain":{"attributes":{"Arn":"When you pass the logical ID of this resource, the function returns the Amazon Resource Name (ARN) of the domain.","EncryptionKey":"When you pass the logical ID of this resource, the function returns the key used to encrypt the domain.","Name":"When you pass the logical ID of this resource, the function returns the name of the domain.","Owner":"When you pass the logical ID of this resource, the function returns the 12-digit account number of the AWS account that owns the domain.","Ref":"`Ref` returns the resource arn."},"description":"The `AWS::CodeArtifact::Domain` resource creates an AWS CodeArtifact domain. CodeArtifact *domains* make it easier to manage multiple repositories across an organization. You can use a domain to apply permissions across many repositories owned by different AWS accounts. For more information about domains, see the [Domain concepts information](https://docs.aws.amazon.com/codeartifact/latest/ug/codeartifact-concepts.html#welcome-concepts-domain) in the *CodeArtifact User Guide* . For more information about the `CreateDomain` API, see [CreateDomain](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_CreateDomain.html) in the *CodeArtifact API Reference* .","properties":{"DomainName":"A string that specifies the name of the requested domain.","EncryptionKey":"The key used to encrypt the domain.","PermissionsPolicyDocument":"The document that defines the resource policy that is set on a domain.","Tags":"A list of tags to be applied to the domain."}},"AWS::CodeArtifact::Repository":{"attributes":{"Arn":"When you pass the logical ID of this resource, the function returns the Amazon Resource Name (ARN) of the repository.","DomainName":"When you pass the logical ID of this resource, the function returns the domain name that contains the repository.","DomainOwner":"When you pass the logical ID of this resource, the function returns the 12-digit account number of the AWS account that owns the domain that contains the repository.","Name":"When you pass the logical ID of this resource, the function returns the name of the repository.","Ref":"`Ref` returns the resource arn."},"description":"The `AWS::CodeArtifact::Repository` resource creates an AWS CodeArtifact repository. CodeArtifact *repositories* contain a set of package versions. For more information about repositories, see the [Repository concepts information](https://docs.aws.amazon.com/codeartifact/latest/ug/codeartifact-concepts.html#welcome-concepts-repository) in the *CodeArtifact User Guide* . For more information about the `CreateRepository` API, see [CreateRepository](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_CreateRepository.html) in the *CodeArtifact API Reference* .","properties":{"Description":"A text description of the repository.","DomainName":"The name of the domain that contains the repository.","DomainOwner":"The 12-digit account number of the AWS account that owns the domain that contains the repository. It does not include dashes or spaces.","ExternalConnections":"An array of external connections associated with the repository.","PermissionsPolicyDocument":"The document that defines the resource policy that is set on a repository.","RepositoryName":"The name of an upstream repository.","Tags":"A list of tags to be applied to the repository.","Upstreams":"A list of upstream repositories to associate with the repository. The order of the upstream repositories in the list determines their priority order when AWS CodeArtifact looks for a requested package version. For more information, see [Working with upstream repositories](https://docs.aws.amazon.com/codeartifact/latest/ug/repos-upstream.html) ."}},"AWS::CodeBuild::Project":{"attributes":{"Arn":"The ARN of the AWS CodeBuild project, such as `arn:aws:codebuild:us-west-2:123456789012:project/myProjectName` .","Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the name of the AWS CodeBuild project, such as `myProjectName` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::CodeBuild::Project` resource configures how AWS CodeBuild builds your source code. For example, it tells CodeBuild where to get the source code and which build environment to use.\\n\\n> To unset or remove a project value via CFN, explicitly provide the attribute with value as empty input.","properties":{"Artifacts":"`Artifacts` is a property of the [AWS::CodeBuild::Project](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html) resource that specifies output settings for artifacts generated by an AWS CodeBuild build.","BadgeEnabled":"Indicates whether AWS CodeBuild generates a publicly accessible URL for your project\'s build badge. For more information, see [Build Badges Sample](https://docs.aws.amazon.com/codebuild/latest/userguide/sample-build-badges.html) in the *AWS CodeBuild User Guide* .\\n\\n> Including build badges with your project is currently not supported if the source type is CodePipeline. If you specify `CODEPIPELINE` for the `Source` property, do not specify the `BadgeEnabled` property.","BuildBatchConfig":"A `ProjectBuildBatchConfig` object that defines the batch build options for the project.","Cache":"Settings that AWS CodeBuild uses to store and reuse build dependencies.","ConcurrentBuildLimit":"The maximum number of concurrent builds that are allowed for this project.\\n\\nNew builds are only started if the current number of builds is less than or equal to this limit. If the current build count meets this limit, new builds are throttled and are not run.","Description":"A description that makes the build project easy to identify.","EncryptionKey":"The AWS Key Management Service customer master key (CMK) to be used for encrypting the build output artifacts.\\n\\n> You can use a cross-account KMS key to encrypt the build output artifacts if your service role has permission to that key. \\n\\nYou can specify either the Amazon Resource Name (ARN) of the CMK or, if available, the CMK\'s alias (using the format `alias/` ). If you don\'t specify a value, CodeBuild uses the managed CMK for Amazon Simple Storage Service (Amazon S3).","Environment":"The build environment settings for the project, such as the environment type or the environment variables to use for the build environment.","FileSystemLocations":"An array of `ProjectFileSystemLocation` objects for a CodeBuild build project. A `ProjectFileSystemLocation` object specifies the `identifier` , `location` , `mountOptions` , `mountPoint` , and `type` of a file system created using Amazon Elastic File System.","LogsConfig":"Information about logs for the build project. A project can create logs in CloudWatch Logs, an S3 bucket, or both.","Name":"The name of the build project. The name must be unique across all of the projects in your AWS account .","QueuedTimeoutInMinutes":"The number of minutes a build is allowed to be queued before it times out.","ResourceAccessRole":"The ARN of the IAM role that enables CodeBuild to access the CloudWatch Logs and Amazon S3 artifacts for the project\'s builds.","SecondaryArtifacts":"A list of `Artifacts` objects. Each artifacts object specifies output settings that the project generates during a build.","SecondarySourceVersions":"An array of `ProjectSourceVersion` objects. If `secondarySourceVersions` is specified at the build level, then they take over these `secondarySourceVersions` (at the project level).","SecondarySources":"An array of `ProjectSource` objects.","ServiceRole":"The ARN of the IAM role that enables AWS CodeBuild to interact with dependent AWS services on behalf of the AWS account.","Source":"The source code settings for the project, such as the source code\'s repository type and location.","SourceVersion":"A version of the build input to be built for this project. If not specified, the latest version is used. If specified, it must be one of:\\n\\n- For CodeCommit: the commit ID, branch, or Git tag to use.\\n- For GitHub: the commit ID, pull request ID, branch name, or tag name that corresponds to the version of the source code you want to build. If a pull request ID is specified, it must use the format `pr/pull-request-ID` (for example `pr/25` ). If a branch name is specified, the branch\'s HEAD commit ID is used. If not specified, the default branch\'s HEAD commit ID is used.\\n- For Bitbucket: the commit ID, branch name, or tag name that corresponds to the version of the source code you want to build. If a branch name is specified, the branch\'s HEAD commit ID is used. If not specified, the default branch\'s HEAD commit ID is used.\\n- For Amazon S3: the version ID of the object that represents the build input ZIP file to use.\\n\\nIf `sourceVersion` is specified at the build level, then that version takes precedence over this `sourceVersion` (at the project level).\\n\\nFor more information, see [Source Version Sample with CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/sample-source-version.html) in the *AWS CodeBuild User Guide* .","Tags":"An arbitrary set of tags (key-value pairs) for the AWS CodeBuild project.\\n\\nThese tags are available for use by AWS services that support AWS CodeBuild build project tags.","TimeoutInMinutes":"How long, in minutes, from 5 to 480 (8 hours), for AWS CodeBuild to wait before timing out any related build that did not get marked as completed. The default is 60 minutes.","Triggers":"For an existing AWS CodeBuild build project that has its source code stored in a GitHub repository, enables AWS CodeBuild to begin automatically rebuilding the source code every time a code change is pushed to the repository.","Visibility":"Specifies the visibility of the project\'s builds. Possible values are:\\n\\n- **PUBLIC_READ** - The project builds are visible to the public.\\n- **PRIVATE** - The project builds are not visible to the public.","VpcConfig":"`VpcConfig` specifies settings that enable AWS CodeBuild to access resources in an Amazon VPC. For more information, see [Use AWS CodeBuild with Amazon Virtual Private Cloud](https://docs.aws.amazon.com/codebuild/latest/userguide/vpc-support.html) in the *AWS CodeBuild User Guide* ."}},"AWS::CodeBuild::Project.Artifacts":{"attributes":{},"description":"`Artifacts` is a property of the [AWS::CodeBuild::Project](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html) resource that specifies output settings for artifacts generated by an AWS CodeBuild build.","properties":{"ArtifactIdentifier":"An identifier for this artifact definition.","EncryptionDisabled":"Set to true if you do not want your output artifacts encrypted. This option is valid only if your artifacts type is Amazon Simple Storage Service (Amazon S3). If this is set with another artifacts type, an `invalidInputException` is thrown.","Location":"Information about the build output artifact location:\\n\\n- If `type` is set to `CODEPIPELINE` , AWS CodePipeline ignores this value if specified. This is because CodePipeline manages its build output locations instead of CodeBuild .\\n- If `type` is set to `NO_ARTIFACTS` , this value is ignored if specified, because no build output is produced.\\n- If `type` is set to `S3` , this is the name of the output bucket.\\n\\nIf you specify `CODEPIPELINE` or `NO_ARTIFACTS` for the `Type` property, don\'t specify this property. For all of the other types, you must specify this property.","Name":"Along with `path` and `namespaceType` , the pattern that AWS CodeBuild uses to name and store the output artifact:\\n\\n- If `type` is set to `CODEPIPELINE` , AWS CodePipeline ignores this value if specified. This is because CodePipeline manages its build output names instead of AWS CodeBuild .\\n- If `type` is set to `NO_ARTIFACTS` , this value is ignored if specified, because no build output is produced.\\n- If `type` is set to `S3` , this is the name of the output artifact object. If you set the name to be a forward slash (\\"/\\"), the artifact is stored in the root of the output bucket.\\n\\nFor example:\\n\\n- If `path` is set to `MyArtifacts` , `namespaceType` is set to `BUILD_ID` , and `name` is set to `MyArtifact.zip` , then the output artifact is stored in `MyArtifacts/ *build-ID* /MyArtifact.zip` .\\n- If `path` is empty, `namespaceType` is set to `NONE` , and `name` is set to \\" `/` \\", the output artifact is stored in the root of the output bucket.\\n- If `path` is set to `MyArtifacts` , `namespaceType` is set to `BUILD_ID` , and `name` is set to \\" `/` \\", the output artifact is stored in `MyArtifacts/ *build-ID*` .\\n\\nIf you specify `CODEPIPELINE` or `NO_ARTIFACTS` for the `Type` property, don\'t specify this property. For all of the other types, you must specify this property.","NamespaceType":"Along with `path` and `name` , the pattern that AWS CodeBuild uses to determine the name and location to store the output artifact:\\n\\n- If `type` is set to `CODEPIPELINE` , CodePipeline ignores this value if specified. This is because CodePipeline manages its build output names instead of AWS CodeBuild .\\n- If `type` is set to `NO_ARTIFACTS` , this value is ignored if specified, because no build output is produced.\\n- If `type` is set to `S3` , valid values include:\\n\\n- `BUILD_ID` : Include the build ID in the location of the build output artifact.\\n- `NONE` : Do not include the build ID. This is the default if `namespaceType` is not specified.\\n\\nFor example, if `path` is set to `MyArtifacts` , `namespaceType` is set to `BUILD_ID` , and `name` is set to `MyArtifact.zip` , the output artifact is stored in `MyArtifacts//MyArtifact.zip` .","OverrideArtifactName":"If set to true a name specified in the buildspec file overrides the artifact name. The name specified in a buildspec file is calculated at build time and uses the Shell command language. For example, you can append a date and time to your artifact name so that it is always unique.","Packaging":"The type of build output artifact to create:\\n\\n- If `type` is set to `CODEPIPELINE` , CodePipeline ignores this value if specified. This is because CodePipeline manages its build output artifacts instead of AWS CodeBuild .\\n- If `type` is set to `NO_ARTIFACTS` , this value is ignored if specified, because no build output is produced.\\n- If `type` is set to `S3` , valid values include:\\n\\n- `NONE` : AWS CodeBuild creates in the output bucket a folder that contains the build output. This is the default if `packaging` is not specified.\\n- `ZIP` : AWS CodeBuild creates in the output bucket a ZIP file that contains the build output.","Path":"Along with `namespaceType` and `name` , the pattern that AWS CodeBuild uses to name and store the output artifact:\\n\\n- If `type` is set to `CODEPIPELINE` , CodePipeline ignores this value if specified. This is because CodePipeline manages its build output names instead of AWS CodeBuild .\\n- If `type` is set to `NO_ARTIFACTS` , this value is ignored if specified, because no build output is produced.\\n- If `type` is set to `S3` , this is the path to the output artifact. If `path` is not specified, `path` is not used.\\n\\nFor example, if `path` is set to `MyArtifacts` , `namespaceType` is set to `NONE` , and `name` is set to `MyArtifact.zip` , the output artifact is stored in the output bucket at `MyArtifacts/MyArtifact.zip` .","Type":"The type of build output artifact. Valid values include:\\n\\n- `CODEPIPELINE` : The build project has build output generated through CodePipeline.\\n\\n> The `CODEPIPELINE` type is not supported for `secondaryArtifacts` .\\n- `NO_ARTIFACTS` : The build project does not produce any build output.\\n- `S3` : The build project stores build output in Amazon S3."}},"AWS::CodeBuild::Project.BatchRestrictions":{"attributes":{},"description":"Specifies restrictions for the batch build.","properties":{"ComputeTypesAllowed":"An array of strings that specify the compute types that are allowed for the batch build. See [Build environment compute types](https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-compute-types.html) in the *AWS CodeBuild User Guide* for these values.","MaximumBuildsAllowed":"Specifies the maximum number of builds allowed."}},"AWS::CodeBuild::Project.BuildStatusConfig":{"attributes":{},"description":"Contains information that defines how the AWS CodeBuild build project reports the build status to the source provider.","properties":{"Context":"Specifies the context of the build status CodeBuild sends to the source provider. The usage of this parameter depends on the source provider.\\n\\n- **Bitbucket** - This parameter is used for the `name` parameter in the Bitbucket commit status. For more information, see [build](https://docs.aws.amazon.com/https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/commit/%7Bnode%7D/statuses/build) in the Bitbucket API documentation.\\n- **GitHub/GitHub Enterprise Server** - This parameter is used for the `context` parameter in the GitHub commit status. For more information, see [Create a commit status](https://docs.aws.amazon.com/https://developer.github.com/v3/repos/statuses/#create-a-commit-status) in the GitHub developer guide.","TargetUrl":"Specifies the target url of the build status CodeBuild sends to the source provider. The usage of this parameter depends on the source provider.\\n\\n- **Bitbucket** - This parameter is used for the `url` parameter in the Bitbucket commit status. For more information, see [build](https://docs.aws.amazon.com/https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/commit/%7Bnode%7D/statuses/build) in the Bitbucket API documentation.\\n- **GitHub/GitHub Enterprise Server** - This parameter is used for the `target_url` parameter in the GitHub commit status. For more information, see [Create a commit status](https://docs.aws.amazon.com/https://developer.github.com/v3/repos/statuses/#create-a-commit-status) in the GitHub developer guide."}},"AWS::CodeBuild::Project.CloudWatchLogsConfig":{"attributes":{},"description":"`CloudWatchLogs` is a property of the [AWS CodeBuild Project LogsConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-logsconfig.html) property type that specifies settings for CloudWatch logs generated by an AWS CodeBuild build.","properties":{"GroupName":"The group name of the logs in CloudWatch Logs. For more information, see [Working with Log Groups and Log Streams](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html) .","Status":"The current status of the logs in CloudWatch Logs for a build project. Valid values are:\\n\\n- `ENABLED` : CloudWatch Logs are enabled for this build project.\\n- `DISABLED` : CloudWatch Logs are not enabled for this build project.","StreamName":"The prefix of the stream name of the CloudWatch Logs. For more information, see [Working with Log Groups and Log Streams](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html) ."}},"AWS::CodeBuild::Project.Environment":{"attributes":{},"description":"`Environment` is a property of the [AWS::CodeBuild::Project](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html) resource that specifies the environment for an AWS CodeBuild project.","properties":{"Certificate":"The ARN of the Amazon S3 bucket, path prefix, and object key that contains the PEM-encoded certificate for the build project. For more information, see [certificate](https://docs.aws.amazon.com/codebuild/latest/userguide/create-project-cli.html#cli.environment.certificate) in the *AWS CodeBuild User Guide* .","ComputeType":"The type of compute environment. This determines the number of CPU cores and memory the build environment uses. Available values include:\\n\\n- `BUILD_GENERAL1_SMALL` : Use up to 3 GB memory and 2 vCPUs for builds.\\n- `BUILD_GENERAL1_MEDIUM` : Use up to 7 GB memory and 4 vCPUs for builds.\\n- `BUILD_GENERAL1_LARGE` : Use up to 15 GB memory and 8 vCPUs for builds.\\n\\nFor more information, see [Build Environment Compute Types](https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-compute-types.html) in the *AWS CodeBuild User Guide.*","EnvironmentVariables":"A set of environment variables to make available to builds for this build project.","Image":"The image tag or image digest that identifies the Docker image to use for this build project. Use the following formats:\\n\\n- For an image tag: `/:` . For example, in the Docker repository that CodeBuild uses to manage its Docker images, this would be `aws/codebuild/standard:4.0` .\\n- For an image digest: `/@` . For example, to specify an image with the digest \\"sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf,\\" use `/@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf` .\\n\\nFor more information, see [Docker images provided by CodeBuild](https://docs.aws.amazon.com//codebuild/latest/userguide/build-env-ref-available.html) in the *AWS CodeBuild user guide* .","ImagePullCredentialsType":"The type of credentials AWS CodeBuild uses to pull images in your build. There are two valid values:\\n\\n- `CODEBUILD` specifies that AWS CodeBuild uses its own credentials. This requires that you modify your ECR repository policy to trust AWS CodeBuild service principal.\\n- `SERVICE_ROLE` specifies that AWS CodeBuild uses your build project\'s service role.\\n\\nWhen you use a cross-account or private registry image, you must use SERVICE_ROLE credentials. When you use an AWS CodeBuild curated image, you must use CODEBUILD credentials.","PrivilegedMode":"Enables running the Docker daemon inside a Docker container. Set to true only if the build project is used to build Docker images. Otherwise, a build that attempts to interact with the Docker daemon fails. The default setting is `false` .\\n\\nYou can initialize the Docker daemon during the install phase of your build by adding one of the following sets of commands to the install phase of your buildspec file:\\n\\nIf the operating system\'s base image is Ubuntu Linux:\\n\\n`- nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2375 --storage-driver=overlay&`\\n\\n`- timeout 15 sh -c \\"until docker info; do echo .; sleep 1; done\\"`\\n\\nIf the operating system\'s base image is Alpine Linux and the previous command does not work, add the `-t` argument to `timeout` :\\n\\n`- nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2375 --storage-driver=overlay&`\\n\\n`- timeout -t 15 sh -c \\"until docker info; do echo .; sleep 1; done\\"`","RegistryCredential":"`RegistryCredential` is a property of the [AWS::CodeBuild::Project Environment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-environment) property that specifies information about credentials that provide access to a private Docker registry. When this is set:\\n\\n- `imagePullCredentialsType` must be set to `SERVICE_ROLE` .\\n- images cannot be curated or an Amazon ECR image.","Type":"The type of build environment to use for related builds.\\n\\n- The environment type `ARM_CONTAINER` is available only in regions US East (N. Virginia), US East (Ohio), US West (Oregon), EU (Ireland), Asia Pacific (Mumbai), Asia Pacific (Tokyo), Asia Pacific (Sydney), and EU (Frankfurt).\\n- The environment type `LINUX_CONTAINER` with compute type `build.general1.2xlarge` is available only in regions US East (N. Virginia), US East (Ohio), US West (Oregon), Canada (Central), EU (Ireland), EU (London), EU (Frankfurt), Asia Pacific (Tokyo), Asia Pacific (Seoul), Asia Pacific (Singapore), Asia Pacific (Sydney), China (Beijing), and China (Ningxia).\\n- The environment type `LINUX_GPU_CONTAINER` is available only in regions US East (N. Virginia), US East (Ohio), US West (Oregon), Canada (Central), EU (Ireland), EU (London), EU (Frankfurt), Asia Pacific (Tokyo), Asia Pacific (Seoul), Asia Pacific (Singapore), Asia Pacific (Sydney) , China (Beijing), and China (Ningxia).\\n\\n- The environment types `WINDOWS_CONTAINER` and `WINDOWS_SERVER_2019_CONTAINER` are available only in regions US East (N. Virginia), US East (Ohio), US West (Oregon), and EU (Ireland).\\n\\nFor more information, see [Build environment compute types](https://docs.aws.amazon.com//codebuild/latest/userguide/build-env-ref-compute-types.html) in the *AWS CodeBuild user guide* ."}},"AWS::CodeBuild::Project.EnvironmentVariable":{"attributes":{},"description":"`EnvironmentVariable` is a property of the [AWS CodeBuild Project Environment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environment.html) property type that specifies the name and value of an environment variable for an AWS CodeBuild project environment. When you use the environment to run a build, these variables are available for your builds to use. `EnvironmentVariable` contains a list of `EnvironmentVariable` property types.","properties":{"Name":"The name or key of the environment variable.","Type":"The type of environment variable. Valid values include:\\n\\n- `PARAMETER_STORE` : An environment variable stored in Systems Manager Parameter Store. For environment variables of this type, specify the name of the parameter as the `value` of the EnvironmentVariable. The parameter value will be substituted for the name at runtime. You can also define Parameter Store environment variables in the buildspec. To learn how to do so, see [env/parameter-store](https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html#build-spec.env.parameter-store) in the *AWS CodeBuild User Guide* .\\n- `PLAINTEXT` : An environment variable in plain text format. This is the default value.\\n- `SECRETS_MANAGER` : An environment variable stored in AWS Secrets Manager . For environment variables of this type, specify the name of the secret as the `value` of the EnvironmentVariable. The secret value will be substituted for the name at runtime. You can also define AWS Secrets Manager environment variables in the buildspec. To learn how to do so, see [env/secrets-manager](https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html#build-spec.env.secrets-manager) in the *AWS CodeBuild User Guide* .","Value":"The value of the environment variable.\\n\\n> We strongly discourage the use of `PLAINTEXT` environment variables to store sensitive values, especially AWS secret key IDs and secret access keys. `PLAINTEXT` environment variables can be displayed in plain text using the AWS CodeBuild console and the AWS CLI . For sensitive values, we recommend you use an environment variable of type `PARAMETER_STORE` or `SECRETS_MANAGER` ."}},"AWS::CodeBuild::Project.FilterGroup":{"attributes":{},"description":"A list of `WebhookFilter` objects used to determine which webhook events are triggered. At least one `WebhookFilter` in the list must specify `EVENT` as its type. The `FilterGroups` property of the [AWS CodeBuild Project ProjectTriggers](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projecttriggers.html) property type is a list of `FilterGroup` objects.\\n\\n> The Webhook feature isn\'t available in AWS CloudFormation for GitHub Enterprise projects. Use the AWS CLI or AWS CodeBuild console to create the webhook. \\n\\n*Required:* No\\n\\n*Type:* A list of [WebhookFilter](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-webhookfilter.html) objects\\n\\n*Update requires:* No interruption","properties":{}},"AWS::CodeBuild::Project.GitSubmodulesConfig":{"attributes":{},"description":"`GitSubmodulesConfig` is a property of the [AWS CodeBuild Project Source](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html) property type that specifies information about the Git submodules configuration for the build project.","properties":{"FetchSubmodules":"Set to true to fetch Git submodules for your AWS CodeBuild build project."}},"AWS::CodeBuild::Project.LogsConfig":{"attributes":{},"description":"`LogsConfig` is a property of the [AWS CodeBuild Project](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html) resource that specifies information about logs for a build project. These can be logs in Amazon CloudWatch Logs, built in a specified S3 bucket, or both.","properties":{"CloudWatchLogs":"Information about CloudWatch Logs for a build project. CloudWatch Logs are enabled by default.","S3Logs":"Information about logs built to an S3 bucket for a build project. S3 logs are not enabled by default."}},"AWS::CodeBuild::Project.ProjectBuildBatchConfig":{"attributes":{},"description":"Contains configuration information about a batch build project.","properties":{"BatchReportMode":"Specifies how build status reports are sent to the source provider for the batch build. This property is only used when the source provider for your project is Bitbucket, GitHub, or GitHub Enterprise, and your project is configured to report build statuses to the source provider.\\n\\n- **REPORT_AGGREGATED_BATCH** - (Default) Aggregate all of the build statuses into a single status report.\\n- **REPORT_INDIVIDUAL_BUILDS** - Send a separate status report for each individual build.","CombineArtifacts":"Specifies if the build artifacts for the batch build should be combined into a single artifact location.","Restrictions":"A `BatchRestrictions` object that specifies the restrictions for the batch build.","ServiceRole":"Specifies the service role ARN for the batch build project.","TimeoutInMins":"Specifies the maximum amount of time, in minutes, that the batch build must be completed in."}},"AWS::CodeBuild::Project.ProjectCache":{"attributes":{},"description":"`ProjectCache` is a property of the [AWS CodeBuild Project](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html) resource that specifies information about the cache for the build project. If `ProjectCache` is not specified, then both of its properties default to `NO_CACHE` .","properties":{"Location":"Information about the cache location:\\n\\n- `NO_CACHE` or `LOCAL` : This value is ignored.\\n- `S3` : This is the S3 bucket name/prefix.","Modes":"An array of strings that specify the local cache modes. You can use one or more local cache modes at the same time. This is only used for `LOCAL` cache types.\\n\\nPossible values are:\\n\\n- **LOCAL_SOURCE_CACHE** - Caches Git metadata for primary and secondary sources. After the cache is created, subsequent builds pull only the change between commits. This mode is a good choice for projects with a clean working directory and a source that is a large Git repository. If you choose this option and your project does not use a Git repository (GitHub, GitHub Enterprise, or Bitbucket), the option is ignored.\\n- **LOCAL_DOCKER_LAYER_CACHE** - Caches existing Docker layers. This mode is a good choice for projects that build or pull large Docker images. It can prevent the performance issues caused by pulling large Docker images down from the network.\\n\\n> - You can use a Docker layer cache in the Linux environment only.\\n> - The `privileged` flag must be set so that your project has the required Docker permissions.\\n> - You should consider the security implications before you use a Docker layer cache.\\n- **LOCAL_CUSTOM_CACHE** - Caches directories you specify in the buildspec file. This mode is a good choice if your build scenario is not suited to one of the other three local cache modes. If you use a custom cache:\\n\\n- Only directories can be specified for caching. You cannot specify individual files.\\n- Symlinks are used to reference cached directories.\\n- Cached directories are linked to your build before it downloads its project sources. Cached items are overridden if a source item has the same name. Directories are specified using cache paths in the buildspec file.","Type":"The type of cache used by the build project. Valid values include:\\n\\n- `NO_CACHE` : The build project does not use any cache.\\n- `S3` : The build project reads and writes from and to S3.\\n- `LOCAL` : The build project stores a cache locally on a build host that is only available to that build host."}},"AWS::CodeBuild::Project.ProjectFileSystemLocation":{"attributes":{},"description":"Information about a file system created by Amazon Elastic File System (EFS). For more information, see [What Is Amazon Elastic File System?](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html)","properties":{"Identifier":"The name used to access a file system created by Amazon EFS. CodeBuild creates an environment variable by appending the `identifier` in all capital letters to `CODEBUILD_` . For example, if you specify `my_efs` for `identifier` , a new environment variable is create named `CODEBUILD_MY_EFS` .\\n\\nThe `identifier` is used to mount your file system.","Location":"A string that specifies the location of the file system created by Amazon EFS. Its format is `efs-dns-name:/directory-path` . You can find the DNS name of file system when you view it in the Amazon EFS console. The directory path is a path to a directory in the file system that CodeBuild mounts. For example, if the DNS name of a file system is `fs-abcd1234.efs.us-west-2.amazonaws.com` , and its mount directory is `my-efs-mount-directory` , then the `location` is `fs-abcd1234.efs.us-west-2.amazonaws.com:/my-efs-mount-directory` .\\n\\nThe directory path in the format `efs-dns-name:/directory-path` is optional. If you do not specify a directory path, the location is only the DNS name and CodeBuild mounts the entire file system.","MountOptions":"The mount options for a file system created by Amazon EFS. The default mount options used by CodeBuild are `nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2` . For more information, see [Recommended NFS Mount Options](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs-nfs-mount-settings.html) .","MountPoint":"The location in the container where you mount the file system.","Type":"The type of the file system. The one supported type is `EFS` ."}},"AWS::CodeBuild::Project.ProjectSourceVersion":{"attributes":{},"description":"A source identifier and its corresponding version.","properties":{"SourceIdentifier":"An identifier for a source in the build project. The identifier can only contain alphanumeric characters and underscores, and must be less than 128 characters in length.","SourceVersion":"The source version for the corresponding source identifier. If specified, must be one of:\\n\\n- For CodeCommit: the commit ID, branch, or Git tag to use.\\n- For GitHub: the commit ID, pull request ID, branch name, or tag name that corresponds to the version of the source code you want to build. If a pull request ID is specified, it must use the format `pr/pull-request-ID` (for example, `pr/25` ). If a branch name is specified, the branch\'s HEAD commit ID is used. If not specified, the default branch\'s HEAD commit ID is used.\\n- For Bitbucket: the commit ID, branch name, or tag name that corresponds to the version of the source code you want to build. If a branch name is specified, the branch\'s HEAD commit ID is used. If not specified, the default branch\'s HEAD commit ID is used.\\n- For Amazon S3: the version ID of the object that represents the build input ZIP file to use.\\n\\nFor more information, see [Source Version Sample with CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/sample-source-version.html) in the *AWS CodeBuild User Guide* ."}},"AWS::CodeBuild::Project.ProjectTriggers":{"attributes":{},"description":"`ProjectTriggers` is a property of the [AWS CodeBuild Project](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html) resource that specifies webhooks that trigger an AWS CodeBuild build.\\n\\n> The Webhook feature isn\'t available in AWS CloudFormation for GitHub Enterprise projects. Use the AWS CLI or AWS CodeBuild console to create the webhook.","properties":{"BuildType":"Specifies the type of build this webhook will trigger. Allowed values are:\\n\\n- **BUILD** - A single build\\n- **BUILD_BATCH** - A batch build","FilterGroups":"A list of lists of `WebhookFilter` objects used to determine which webhook events are triggered. At least one `WebhookFilter` in the array must specify `EVENT` as its type.","Webhook":"Specifies whether or not to begin automatically rebuilding the source code every time a code change is pushed to the repository."}},"AWS::CodeBuild::Project.RegistryCredential":{"attributes":{},"description":"`RegistryCredential` is a property of the [AWS CodeBuild Project Environment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environment.html) property type that specifies information about credentials that provide access to a private Docker registry. When this is set:\\n\\n- `imagePullCredentialsType` must be set to `SERVICE_ROLE` .\\n- images cannot be curated or an Amazon ECR image.\\n\\nFor more information, see [Private Registry with AWS Secrets Manager Sample for AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/sample-private-registry.html) .","properties":{"Credential":"The Amazon Resource Name (ARN) or name of credentials created using AWS Secrets Manager .\\n\\n> The `credential` can use the name of the credentials only if they exist in your current AWS Region .","CredentialProvider":"The service that created the credentials to access a private Docker registry. The valid value, SECRETS_MANAGER, is for AWS Secrets Manager ."}},"AWS::CodeBuild::Project.S3LogsConfig":{"attributes":{},"description":"`S3Logs` is a property of the [AWS CodeBuild Project LogsConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-logsconfig.html) property type that specifies settings for logs generated by an AWS CodeBuild build in an S3 bucket.","properties":{"EncryptionDisabled":"Set to true if you do not want your S3 build log output encrypted. By default S3 build logs are encrypted.","Location":"The ARN of an S3 bucket and the path prefix for S3 logs. If your Amazon S3 bucket name is `my-bucket` , and your path prefix is `build-log` , then acceptable formats are `my-bucket/build-log` or `arn:aws:s3:::my-bucket/build-log` .","Status":"The current status of the S3 build logs. Valid values are:\\n\\n- `ENABLED` : S3 build logs are enabled for this build project.\\n- `DISABLED` : S3 build logs are not enabled for this build project."}},"AWS::CodeBuild::Project.Source":{"attributes":{},"description":"`Source` is a property of the [AWS::CodeBuild::Project](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html) resource that specifies the source code settings for the project, such as the source code\'s repository type and location.","properties":{"Auth":"Information about the authorization settings for AWS CodeBuild to access the source code to be built.\\n\\nThis information is for the AWS CodeBuild console\'s use only. Your code should not get or set `Auth` directly.","BuildSpec":"The build specification for the project. If this value is not provided, then the source code must contain a buildspec file named `buildspec.yml` at the root level. If this value is provided, it can be either a single string containing the entire build specification, or the path to an alternate buildspec file relative to the value of the built-in environment variable `CODEBUILD_SRC_DIR` . The alternate buildspec file can have a name other than `buildspec.yml` , for example `myspec.yml` or `build_spec_qa.yml` or similar. For more information, see the [Build Spec Reference](https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html#build-spec-ref-example) in the *AWS CodeBuild User Guide* .","BuildStatusConfig":"Contains information that defines how the build project reports the build status to the source provider. This option is only used when the source provider is `GITHUB` , `GITHUB_ENTERPRISE` , or `BITBUCKET` .","GitCloneDepth":"The depth of history to download. Minimum value is 0. If this value is 0, greater than 25, or not provided, then the full history is downloaded with each build project. If your source type is Amazon S3, this value is not supported.","GitSubmodulesConfig":"Information about the Git submodules configuration for the build project.","InsecureSsl":"This is used with GitHub Enterprise only. Set to true to ignore SSL warnings while connecting to your GitHub Enterprise project repository. The default value is `false` . `InsecureSsl` should be used for testing purposes only. It should not be used in a production environment.","Location":"Information about the location of the source code to be built. Valid values include:\\n\\n- For source code settings that are specified in the source action of a pipeline in CodePipeline, `location` should not be specified. If it is specified, CodePipeline ignores it. This is because CodePipeline uses the settings in a pipeline\'s source action instead of this value.\\n- For source code in an CodeCommit repository, the HTTPS clone URL to the repository that contains the source code and the buildspec file (for example, `https://git-codecommit..amazonaws.com/v1/repos/` ).\\n- For source code in an Amazon S3 input bucket, one of the following.\\n\\n- The path to the ZIP file that contains the source code (for example, `//.zip` ).\\n- The path to the folder that contains the source code (for example, `///` ).\\n- For source code in a GitHub repository, the HTTPS clone URL to the repository that contains the source and the buildspec file. You must connect your AWS account to your GitHub account. Use the AWS CodeBuild console to start creating a build project. When you use the console to connect (or reconnect) with GitHub, on the GitHub *Authorize application* page, for *Organization access* , choose *Request access* next to each repository you want to allow AWS CodeBuild to have access to, and then choose *Authorize application* . (After you have connected to your GitHub account, you do not need to finish creating the build project. You can leave the AWS CodeBuild console.) To instruct AWS CodeBuild to use this connection, in the `source` object, set the `auth` object\'s `type` value to `OAUTH` .\\n- For source code in a Bitbucket repository, the HTTPS clone URL to the repository that contains the source and the buildspec file. You must connect your AWS account to your Bitbucket account. Use the AWS CodeBuild console to start creating a build project. When you use the console to connect (or reconnect) with Bitbucket, on the Bitbucket *Confirm access to your account* page, choose *Grant access* . (After you have connected to your Bitbucket account, you do not need to finish creating the build project. You can leave the AWS CodeBuild console.) To instruct AWS CodeBuild to use this connection, in the `source` object, set the `auth` object\'s `type` value to `OAUTH` .\\n\\nIf you specify `CODEPIPELINE` for the `Type` property, don\'t specify this property. For all of the other types, you must specify `Location` .","ReportBuildStatus":"Set to true to report the status of a build\'s start and finish to your source provider. This option is valid only when your source provider is GitHub, GitHub Enterprise, or Bitbucket. If this is set and you use a different source provider, an `invalidInputException` is thrown.","SourceIdentifier":"An identifier for this project source. The identifier can only contain alphanumeric characters and underscores, and must be less than 128 characters in length.","Type":"The type of repository that contains the source code to be built. Valid values include:\\n\\n- `BITBUCKET` : The source code is in a Bitbucket repository.\\n- `CODECOMMIT` : The source code is in an CodeCommit repository.\\n- `CODEPIPELINE` : The source code settings are specified in the source action of a pipeline in CodePipeline.\\n- `GITHUB` : The source code is in a GitHub or GitHub Enterprise Cloud repository.\\n- `GITHUB_ENTERPRISE` : The source code is in a GitHub Enterprise Server repository.\\n- `NO_SOURCE` : The project does not have input source code.\\n- `S3` : The source code is in an Amazon S3 bucket."}},"AWS::CodeBuild::Project.SourceAuth":{"attributes":{},"description":"`SourceAuth` is a property of the [AWS CodeBuild Project Source](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html) property type that specifies authorization settings for AWS CodeBuild to access the source code to be built.\\n\\n`SourceAuth` is for use by the CodeBuild console only. Do not get or set it directly.","properties":{"Resource":"The resource value that applies to the specified authorization type.\\n\\n> This data type is used by the AWS CodeBuild console only.","Type":"The authorization type to use. The only valid value is `OAUTH` , which represents the OAuth authorization type.\\n\\n> This data type is used by the AWS CodeBuild console only."}},"AWS::CodeBuild::Project.VpcConfig":{"attributes":{},"description":"`VpcConfig` is a property of the [AWS::CodeBuild::Project](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html) resource that enable AWS CodeBuild to access resources in an Amazon VPC. For more information, see [Use AWS CodeBuild with Amazon Virtual Private Cloud](https://docs.aws.amazon.com/codebuild/latest/userguide/vpc-support.html) in the *AWS CodeBuild User Guide* .","properties":{"SecurityGroupIds":"A list of one or more security groups IDs in your Amazon VPC. The maximum count is 5.","Subnets":"A list of one or more subnet IDs in your Amazon VPC. The maximum count is 16.","VpcId":"The ID of the Amazon VPC."}},"AWS::CodeBuild::Project.WebhookFilter":{"attributes":{},"description":"`WebhookFilter` is a structure of the `FilterGroups` property on the [AWS CodeBuild Project ProjectTriggers](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projecttriggers.html) property type that specifies which webhooks trigger an AWS CodeBuild build.\\n\\n> The Webhook feature isn\'t available in AWS CloudFormation for GitHub Enterprise projects. Use the AWS CLI or AWS CodeBuild console to create the webhook.","properties":{"ExcludeMatchedPattern":"Used to indicate that the `pattern` determines which webhook events do not trigger a build. If true, then a webhook event that does not match the `pattern` triggers a build. If false, then a webhook event that matches the `pattern` triggers a build.","Pattern":"For a `WebHookFilter` that uses `EVENT` type, a comma-separated string that specifies one or more events. For example, the webhook filter `PUSH, PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED` allows all push, pull request created, and pull request updated events to trigger a build.\\n\\nFor a `WebHookFilter` that uses any of the other filter types, a regular expression pattern. For example, a `WebHookFilter` that uses `HEAD_REF` for its `type` and the pattern `^refs/heads/` triggers a build when the head reference is a branch with a reference name `refs/heads/branch-name` .","Type":"The type of webhook filter. There are six webhook filter types: `EVENT` , `ACTOR_ACCOUNT_ID` , `HEAD_REF` , `BASE_REF` , `FILE_PATH` , and `COMMIT_MESSAGE` .\\n\\n- **EVENT** - A webhook event triggers a build when the provided `pattern` matches one of five event types: `PUSH` , `PULL_REQUEST_CREATED` , `PULL_REQUEST_UPDATED` , `PULL_REQUEST_REOPENED` , and `PULL_REQUEST_MERGED` . The `EVENT` patterns are specified as a comma-separated string. For example, `PUSH, PULL_REQUEST_CREATED, PULL_REQUEST_UPDATED` filters all push, pull request created, and pull request updated events.\\n\\n> The `PULL_REQUEST_REOPENED` works with GitHub and GitHub Enterprise only.\\n- **ACTOR_ACCOUNT_ID** - A webhook event triggers a build when a GitHub, GitHub Enterprise, or Bitbucket account ID matches the regular expression `pattern` .\\n- **HEAD_REF** - A webhook event triggers a build when the head reference matches the regular expression `pattern` . For example, `refs/heads/branch-name` and `refs/tags/tag-name` .\\n\\nWorks with GitHub and GitHub Enterprise push, GitHub and GitHub Enterprise pull request, Bitbucket push, and Bitbucket pull request events.\\n- **BASE_REF** - A webhook event triggers a build when the base reference matches the regular expression `pattern` . For example, `refs/heads/branch-name` .\\n\\n> Works with pull request events only.\\n- **FILE_PATH** - A webhook triggers a build when the path of a changed file matches the regular expression `pattern` .\\n\\n> Works with GitHub and Bitbucket events push and pull requests events. Also works with GitHub Enterprise push events, but does not work with GitHub Enterprise pull request events.\\n- **COMMIT_MESSAGE** - A webhook triggers a build when the head commit message matches the regular expression `pattern` .\\n\\n> Works with GitHub and Bitbucket events push and pull requests events. Also works with GitHub Enterprise push events, but does not work with GitHub Enterprise pull request events."}},"AWS::CodeBuild::ReportGroup":{"attributes":{"Arn":"The ARN of the AWS CodeBuild report group, such as `arn:aws:codebuild:region:123456789012:report-group/myReportGroupName` .","Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the ARN of the AWS CodeBuild report group, such as `arn:aws:codebuild:region:123456789012:report-group/myReportGroupName` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Represents a report group. A report group contains a collection of reports.","properties":{"DeleteReports":"When deleting a report group, specifies if reports within the report group should be deleted.\\n\\n- **true** - Deletes any reports that belong to the report group before deleting the report group.\\n- **false** - You must delete any reports in the report group. This is the default value. If you delete a report group that contains one or more reports, an exception is thrown.","ExportConfig":"Information about the destination where the raw data of this `ReportGroup` is exported.","Name":"The name of the `ReportGroup` .","Tags":"A list of tag key and value pairs associated with this report group.\\n\\nThese tags are available for use by AWS services that support AWS CodeBuild report group tags.","Type":"The type of the `ReportGroup` . This can be one of the following values:\\n\\n- **CODE_COVERAGE** - The report group contains code coverage reports.\\n- **TEST** - The report group contains test reports."}},"AWS::CodeBuild::ReportGroup.ReportExportConfig":{"attributes":{},"description":"Information about the location where the run of a report is exported.","properties":{"ExportConfigType":"The export configuration type. Valid values are:\\n\\n- `S3` : The report results are exported to an S3 bucket.\\n- `NO_EXPORT` : The report results are not exported.","S3Destination":"A `S3ReportExportConfig` object that contains information about the S3 bucket where the run of a report is exported."}},"AWS::CodeBuild::ReportGroup.S3ReportExportConfig":{"attributes":{},"description":"Information about the S3 bucket where the raw data of a report are exported.","properties":{"Bucket":"The name of the S3 bucket where the raw data of a report are exported.","BucketOwner":"The AWS account identifier of the owner of the Amazon S3 bucket. This allows report data to be exported to an Amazon S3 bucket that is owned by an account other than the account running the build.","EncryptionDisabled":"A boolean value that specifies if the results of a report are encrypted.","EncryptionKey":"The encryption key for the report\'s encrypted raw data.","Packaging":"The type of build output artifact to create. Valid values include:\\n\\n- `NONE` : CodeBuild creates the raw data in the output bucket. This is the default if packaging is not specified.\\n- `ZIP` : CodeBuild creates a ZIP file with the raw data in the output bucket.","Path":"The path to the exported report\'s raw data results."}},"AWS::CodeBuild::SourceCredential":{"attributes":{},"description":"Information about the credentials for a GitHub, GitHub Enterprise, or Bitbucket repository. We strongly recommend that you use AWS Secrets Manager to store your credentials. If you use Secrets Manager , you must have secrets in your secrets manager. For more information, see [Using Dynamic References to Specify Template Values](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) .\\n\\n> For security purposes, do not use plain text in your AWS CloudFormation template to store your credentials.","properties":{"AuthType":"The type of authentication used by the credentials. Valid options are OAUTH, BASIC_AUTH, or PERSONAL_ACCESS_TOKEN.","ServerType":"The type of source provider. The valid options are GITHUB, GITHUB_ENTERPRISE, or BITBUCKET.","Token":"For GitHub or GitHub Enterprise, this is the personal access token. For Bitbucket, this is the app password.","Username":"The Bitbucket username when the `authType` is BASIC_AUTH. This parameter is not valid for other types of source providers or connections."}},"AWS::CodeCommit::Repository":{"attributes":{"Arn":"When you pass the logical ID of this resource, the function returns the Amazon Resource Name (ARN) of the repository.","CloneUrlHttp":"When you pass the logical ID of this resource, the function returns the URL to use for cloning the repository over HTTPS.","CloneUrlSsh":"When you pass the logical ID of this resource, the function returns the URL to use for cloning the repository over SSH.","Name":"When you pass the logical ID of this resource, the function returns the repository\'s name.","Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, `Ref` returns the repository ID."},"description":"Creates a new, empty repository.","properties":{"Code":"Information about code to be committed to a repository after it is created in an AWS CloudFormation stack. Information about code is only used in resource creation. Updates to a stack will not reflect changes made to code properties after initial resource creation.\\n\\n> You can only use this property to add code when creating a repository with a AWS CloudFormation template at creation time. This property cannot be used for updating code to an existing repository.","RepositoryDescription":"A comment or description about the new repository.\\n\\n> The description field for a repository accepts all HTML characters and all valid Unicode characters. Applications that do not HTML-encode the description and display it in a webpage can expose users to potentially malicious code. Make sure that you HTML-encode the description field in any application that uses this API to display the repository description on a webpage.","RepositoryName":"The name of the new repository to be created.\\n\\n> The repository name must be unique across the calling AWS account . Repository names are limited to 100 alphanumeric, dash, and underscore characters, and cannot include certain characters. For more information about the limits on repository names, see [Quotas](https://docs.aws.amazon.com/codecommit/latest/userguide/limits.html) in the *AWS CodeCommit User Guide* . The suffix .git is prohibited.","Tags":"One or more tag key-value pairs to use when tagging this repository.","Triggers":"The JSON block of configuration information for each trigger."}},"AWS::CodeCommit::Repository.Code":{"attributes":{},"description":"Information about code to be committed.","properties":{"BranchName":"Optional. Specifies a branch name to be used as the default branch when importing code into a repository on initial creation. If this property is not set, the name *main* will be used for the default branch for the repository. Changes to this property are ignored after initial resource creation. We recommend using this parameter to set the name to *main* to align with the default behavior of CodeCommit unless another name is needed.","S3":"Information about the Amazon S3 bucket that contains a ZIP file of code to be committed to the repository. Changes to this property are ignored after initial resource creation."}},"AWS::CodeCommit::Repository.RepositoryTrigger":{"attributes":{},"description":"Information about a trigger for a repository.\\n\\n> If you want to receive notifications about repository events, consider using notifications instead of triggers. For more information, see [Configuring notifications for repository events](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-repository-email.html) .","properties":{"Branches":"The branches to be included in the trigger configuration. If you specify an empty array, the trigger applies to all branches.\\n\\n> Although no content is required in the array, you must include the array itself.","CustomData":"Any custom data associated with the trigger to be included in the information sent to the target of the trigger.","DestinationArn":"The ARN of the resource that is the target for a trigger (for example, the ARN of a topic in Amazon SNS).","Events":"The repository events that cause the trigger to run actions in another service, such as sending a notification through Amazon SNS.\\n\\n> The valid value \\"all\\" cannot be used with any other values.","Name":"The name of the trigger."}},"AWS::CodeCommit::Repository.S3":{"attributes":{},"description":"Information about the Amazon S3 bucket that contains the code that will be committed to the new repository. Changes to this property are ignored after initial resource creation.","properties":{"Bucket":"The name of the Amazon S3 bucket that contains the ZIP file with the content that will be committed to the new repository. This can be specified using the name of the bucket in the AWS account . Changes to this property are ignored after initial resource creation.","Key":"The key to use for accessing the Amazon S3 bucket. Changes to this property are ignored after initial resource creation. For more information, see [Creating object key names](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html) and [Uploading objects](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html) in the Amazon S3 User Guide.","ObjectVersion":"The object version of the ZIP file, if versioning is enabled for the Amazon S3 bucket. Changes to this property are ignored after initial resource creation."}},"AWS::CodeDeploy::Application":{"attributes":{"Ref":"When you pass the logical ID of an `AWS::CodeDeploy::Application` resource to the intrinsic `Ref` function, the function returns the application name, such as `myapplication-a123d0d1` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::CodeDeploy::Application` resource creates an AWS CodeDeploy application. In CodeDeploy , an application is a name that functions as a container to ensure that the correct combination of revision, deployment configuration, and deployment group are referenced during a deployment. You can use the `AWS::CodeDeploy::DeploymentGroup` resource to associate the application with a CodeDeploy deployment group. For more information, see [CodeDeploy Deployments](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-steps.html) in the *AWS CodeDeploy User Guide* .","properties":{"ApplicationName":"A name for the application. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the application name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> Updates to `ApplicationName` are not supported.","ComputePlatform":"The compute platform that CodeDeploy deploys the application to.","Tags":"The metadata that you apply to CodeDeploy applications to help you organize and categorize them. Each tag consists of a key and an optional value, both of which you define."}},"AWS::CodeDeploy::DeploymentConfig":{"attributes":{"Ref":"When you pass the logical ID of an `AWS::CodeDeploy::DeploymentConfig` resource to the intrinsic `Ref` function, the function returns the deployment configuration name, such as `mydeploymentconfig-a123d0d1` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::CodeDeploy::DeploymentConfig` resource creates a set of deployment rules, deployment success conditions, and deployment failure conditions that AWS CodeDeploy uses during a deployment. The deployment configuration specifies, through the use of a `MinimumHealthyHosts` value, the number or percentage of instances that must remain available at any time during a deployment.","properties":{"ComputePlatform":"The destination platform type for the deployment ( `Lambda` , `Server` , or `ECS` ).","DeploymentConfigName":"A name for the deployment configuration. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the deployment configuration name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","MinimumHealthyHosts":"The minimum number of healthy instances that should be available at any time during the deployment. There are two parameters expected in the input: type and value.\\n\\nThe type parameter takes either of the following values:\\n\\n- HOST_COUNT: The value parameter represents the minimum number of healthy instances as an absolute value.\\n- FLEET_PERCENT: The value parameter represents the minimum number of healthy instances as a percentage of the total number of instances in the deployment. If you specify FLEET_PERCENT, at the start of the deployment, AWS CodeDeploy converts the percentage to the equivalent number of instance and rounds up fractional instances.\\n\\nThe value parameter takes an integer.\\n\\nFor example, to set a minimum of 95% healthy instance, specify a type of FLEET_PERCENT and a value of 95.\\n\\nFor more information about instance health, see [CodeDeploy Instance Health](https://docs.aws.amazon.com/codedeploy/latest/userguide/instances-health.html) in the AWS CodeDeploy User Guide.","TrafficRoutingConfig":"The configuration that specifies how the deployment traffic is routed."}},"AWS::CodeDeploy::DeploymentConfig.MinimumHealthyHosts":{"attributes":{},"description":"`MinimumHealthyHosts` is a property of the [DeploymentConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentconfig.html) resource that defines how many instances must remain healthy during an AWS CodeDeploy deployment.","properties":{"Type":"The minimum healthy instance type:\\n\\n- HOST_COUNT: The minimum number of healthy instance as an absolute value.\\n- FLEET_PERCENT: The minimum number of healthy instance as a percentage of the total number of instance in the deployment.\\n\\nIn an example of nine instance, if a HOST_COUNT of six is specified, deploy to up to three instances at a time. The deployment is successful if six or more instances are deployed to successfully. Otherwise, the deployment fails. If a FLEET_PERCENT of 40 is specified, deploy to up to five instance at a time. The deployment is successful if four or more instance are deployed to successfully. Otherwise, the deployment fails.\\n\\n> In a call to `GetDeploymentConfig` , CodeDeployDefault.OneAtATime returns a minimum healthy instance type of MOST_CONCURRENCY and a value of 1. This means a deployment to only one instance at a time. (You cannot set the type to MOST_CONCURRENCY, only to HOST_COUNT or FLEET_PERCENT.) In addition, with CodeDeployDefault.OneAtATime, AWS CodeDeploy attempts to ensure that all instances but one are kept in a healthy state during the deployment. Although this allows one instance at a time to be taken offline for a new deployment, it also means that if the deployment to the last instance fails, the overall deployment is still successful. \\n\\nFor more information, see [AWS CodeDeploy Instance Health](https://docs.aws.amazon.com//codedeploy/latest/userguide/instances-health.html) in the *AWS CodeDeploy User Guide* .","Value":"The minimum healthy instance value."}},"AWS::CodeDeploy::DeploymentConfig.TimeBasedCanary":{"attributes":{},"description":"A configuration that shifts traffic from one version of a Lambda function or Amazon ECS task set to another in two increments. The original and target Lambda function versions or ECS task sets are specified in the deployment\'s AppSpec file.","properties":{"CanaryInterval":"The number of minutes between the first and second traffic shifts of a `TimeBasedCanary` deployment.","CanaryPercentage":"The percentage of traffic to shift in the first increment of a `TimeBasedCanary` deployment."}},"AWS::CodeDeploy::DeploymentConfig.TimeBasedLinear":{"attributes":{},"description":"A configuration that shifts traffic from one version of a Lambda function or ECS task set to another in equal increments, with an equal number of minutes between each increment. The original and target Lambda function versions or ECS task sets are specified in the deployment\'s AppSpec file.","properties":{"LinearInterval":"The number of minutes between each incremental traffic shift of a `TimeBasedLinear` deployment.","LinearPercentage":"The percentage of traffic that is shifted at the start of each increment of a `TimeBasedLinear` deployment."}},"AWS::CodeDeploy::DeploymentConfig.TrafficRoutingConfig":{"attributes":{},"description":"The configuration that specifies how traffic is shifted from one version of a Lambda function to another version during an AWS Lambda deployment, or from one Amazon ECS task set to another during an Amazon ECS deployment.","properties":{"TimeBasedCanary":"A configuration that shifts traffic from one version of a Lambda function or ECS task set to another in two increments. The original and target Lambda function versions or ECS task sets are specified in the deployment\'s AppSpec file.","TimeBasedLinear":"A configuration that shifts traffic from one version of a Lambda function or Amazon ECS task set to another in equal increments, with an equal number of minutes between each increment. The original and target Lambda function versions or Amazon ECS task sets are specified in the deployment\'s AppSpec file.","Type":"The type of traffic shifting ( `TimeBasedCanary` or `TimeBasedLinear` ) used by a deployment configuration."}},"AWS::CodeDeploy::DeploymentGroup":{"attributes":{"Ref":"When you pass the logical ID of an `AWS::CodeDeploy::DeploymentGroup` resource to the intrinsic `Ref` function, the function returns the deployment group name, such as `mydeploymentgroup-a123d0d1` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::CodeDeploy::DeploymentGroup` resource creates an AWS CodeDeploy deployment group that specifies which instances your application revisions are deployed to, along with other deployment options. For more information, see [CreateDeploymentGroup](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_CreateDeploymentGroup.html) in the *CodeDeploy API Reference* .\\n\\n> Amazon ECS blue/green deployments through CodeDeploy do not use the `AWS::CodeDeploy::DeploymentGroup` resource. To perform Amazon ECS blue/green deployments, use the `AWS::CodeDeploy::BlueGreen` hook. See [Perform Amazon ECS blue/green deployments through CodeDeploy using AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/blue-green.html) for more information.","properties":{"AlarmConfiguration":"Information about the Amazon CloudWatch alarms that are associated with the deployment group.","ApplicationName":"The name of an existing CodeDeploy application to associate this deployment group with.","AutoRollbackConfiguration":"Information about the automatic rollback configuration that is associated with the deployment group. If you specify this property, don\'t specify the `Deployment` property.","AutoScalingGroups":"A list of associated Auto Scaling groups that CodeDeploy automatically deploys revisions to when new instances are created. Duplicates are not allowed.","BlueGreenDeploymentConfiguration":"Information about blue/green deployment options for a deployment group.","Deployment":"The application revision to deploy to this deployment group. If you specify this property, your target application revision is deployed as soon as the provisioning process is complete. If you specify this property, don\'t specify the `AutoRollbackConfiguration` property.","DeploymentConfigName":"A deployment configuration name or a predefined configuration name. With predefined configurations, you can deploy application revisions to one instance at a time ( `CodeDeployDefault.OneAtATime` ), half of the instances at a time ( `CodeDeployDefault.HalfAtATime` ), or all the instances at once ( `CodeDeployDefault.AllAtOnce` ). For more information and valid values, see [Working with Deployment Configurations](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html) in the *AWS CodeDeploy User Guide* .","DeploymentGroupName":"A name for the deployment group. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the deployment group name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","DeploymentStyle":"Attributes that determine the type of deployment to run and whether to route deployment traffic behind a load balancer.\\n\\nIf you specify this property with a blue/green deployment type, don\'t specify the `AutoScalingGroups` , `LoadBalancerInfo` , or `Deployment` properties.\\n\\n> For blue/green deployments, AWS CloudFormation supports deployments on Lambda compute platforms only. You can perform Amazon ECS blue/green deployments using `AWS::CodeDeploy::BlueGreen` hook. See [Perform Amazon ECS blue/green deployments through CodeDeploy using AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/blue-green.html) for more information.","ECSServices":"The target Amazon ECS services in the deployment group. This applies only to deployment groups that use the Amazon ECS compute platform. A target Amazon ECS service is specified as an Amazon ECS cluster and service name pair using the format `:` .","Ec2TagFilters":"The Amazon EC2 tags that are already applied to Amazon EC2 instances that you want to include in the deployment group. CodeDeploy includes all Amazon EC2 instances identified by any of the tags you specify in this deployment group. Duplicates are not allowed.\\n\\nYou can specify `EC2TagFilters` or `Ec2TagSet` , but not both.","Ec2TagSet":"Information about groups of tags applied to Amazon EC2 instances. The deployment group includes only Amazon EC2 instances identified by all the tag groups. Cannot be used in the same call as `ec2TagFilter` .","LoadBalancerInfo":"Information about the load balancer to use in a deployment. For more information, see [Integrating CodeDeploy with Elastic Load Balancing](https://docs.aws.amazon.com/codedeploy/latest/userguide/integrations-aws-elastic-load-balancing.html) in the *AWS CodeDeploy User Guide* .","OnPremisesInstanceTagFilters":"The on-premises instance tags already applied to on-premises instances that you want to include in the deployment group. CodeDeploy includes all on-premises instances identified by any of the tags you specify in this deployment group. To register on-premises instances with CodeDeploy , see [Working with On-Premises Instances for CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/instances-on-premises.html) in the *AWS CodeDeploy User Guide* . Duplicates are not allowed.\\n\\nYou can specify `OnPremisesInstanceTagFilters` or `OnPremisesInstanceTagSet` , but not both.","OnPremisesTagSet":"Information about groups of tags applied to on-premises instances. The deployment group includes only on-premises instances identified by all the tag groups.\\n\\nYou can specify `OnPremisesInstanceTagFilters` or `OnPremisesInstanceTagSet` , but not both.","OutdatedInstancesStrategy":"","ServiceRoleArn":"A service role Amazon Resource Name (ARN) that grants CodeDeploy permission to make calls to AWS services on your behalf. For more information, see [Create a Service Role for AWS CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-create-service-role.html) in the *AWS CodeDeploy User Guide* .\\n\\n> In some cases, you might need to add a dependency on the service role\'s policy. For more information, see IAM role policy in [DependsOn Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) .","Tags":"","TriggerConfigurations":"Information about triggers associated with the deployment group. Duplicates are not allowed"}},"AWS::CodeDeploy::DeploymentGroup.Alarm":{"attributes":{},"description":"The `Alarm` property type specifies a CloudWatch alarm to use for an AWS CodeDeploy deployment group. The `Alarm` property of the [CodeDeploy DeploymentGroup AlarmConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-alarmconfiguration.html) property contains a list of `Alarm` property types.","properties":{"Name":"The name of the alarm. Maximum length is 255 characters. Each alarm name can be used only once in a list of alarms."}},"AWS::CodeDeploy::DeploymentGroup.AlarmConfiguration":{"attributes":{},"description":"The `AlarmConfiguration` property type configures CloudWatch alarms for an AWS CodeDeploy deployment group. `AlarmConfiguration` is a property of the [DeploymentGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html) resource.","properties":{"Alarms":"A list of alarms configured for the deployment or deployment group. A maximum of 10 alarms can be added.","Enabled":"Indicates whether the alarm configuration is enabled.","IgnorePollAlarmFailure":"Indicates whether a deployment should continue if information about the current state of alarms cannot be retrieved from Amazon CloudWatch . The default value is `false` .\\n\\n- `true` : The deployment proceeds even if alarm status information can\'t be retrieved from CloudWatch .\\n- `false` : The deployment stops if alarm status information can\'t be retrieved from CloudWatch ."}},"AWS::CodeDeploy::DeploymentGroup.AutoRollbackConfiguration":{"attributes":{},"description":"The `AutoRollbackConfiguration` property type configures automatic rollback for an AWS CodeDeploy deployment group when a deployment is not completed successfully. For more information, see [Automatic Rollbacks](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployments-rollback-and-redeploy.html#deployments-rollback-and-redeploy-automatic-rollbacks) in the *AWS CodeDeploy User Guide* .\\n\\n`AutoRollbackConfiguration` is a property of the [DeploymentGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html) resource.","properties":{"Enabled":"Indicates whether a defined automatic rollback configuration is currently enabled.","Events":"The event type or types that trigger a rollback. Valid values are `DEPLOYMENT_FAILURE` , `DEPLOYMENT_STOP_ON_ALARM` , or `DEPLOYMENT_STOP_ON_REQUEST` ."}},"AWS::CodeDeploy::DeploymentGroup.BlueGreenDeploymentConfiguration":{"attributes":{},"description":"Information about blue/green deployment options for a deployment group.","properties":{"DeploymentReadyOption":"Information about the action to take when newly provisioned instances are ready to receive traffic in a blue/green deployment.","GreenFleetProvisioningOption":"Information about how instances are provisioned for a replacement environment in a blue/green deployment.","TerminateBlueInstancesOnDeploymentSuccess":"Information about whether to terminate instances in the original fleet during a blue/green deployment."}},"AWS::CodeDeploy::DeploymentGroup.BlueInstanceTerminationOption":{"attributes":{},"description":"Information about whether instances in the original environment are terminated when a blue/green deployment is successful. `BlueInstanceTerminationOption` does not apply to Lambda deployments.","properties":{"Action":"The action to take on instances in the original environment after a successful blue/green deployment.\\n\\n- `TERMINATE` : Instances are terminated after a specified wait time.\\n- `KEEP_ALIVE` : Instances are left running after they are deregistered from the load balancer and removed from the deployment group.","TerminationWaitTimeInMinutes":"For an Amazon EC2 deployment, the number of minutes to wait after a successful blue/green deployment before terminating instances from the original environment.\\n\\nFor an Amazon ECS deployment, the number of minutes before deleting the original (blue) task set. During an Amazon ECS deployment, CodeDeploy shifts traffic from the original (blue) task set to a replacement (green) task set.\\n\\nThe maximum setting is 2880 minutes (2 days)."}},"AWS::CodeDeploy::DeploymentGroup.Deployment":{"attributes":{},"description":"`Deployment` is a property of the [DeploymentGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html) resource that specifies an AWS CodeDeploy application revision to be deployed to instances in the deployment group. If you specify an application revision, your target revision is deployed as soon as the provisioning process is complete.","properties":{"Description":"A comment about the deployment.","IgnoreApplicationStopFailures":"If true, then if an `ApplicationStop` , `BeforeBlockTraffic` , or `AfterBlockTraffic` deployment lifecycle event to an instance fails, then the deployment continues to the next deployment lifecycle event. For example, if `ApplicationStop` fails, the deployment continues with DownloadBundle. If `BeforeBlockTraffic` fails, the deployment continues with `BlockTraffic` . If `AfterBlockTraffic` fails, the deployment continues with `ApplicationStop` .\\n\\nIf false or not specified, then if a lifecycle event fails during a deployment to an instance, that deployment fails. If deployment to that instance is part of an overall deployment and the number of healthy hosts is not less than the minimum number of healthy hosts, then a deployment to the next instance is attempted.\\n\\nDuring a deployment, the AWS CodeDeploy agent runs the scripts specified for `ApplicationStop` , `BeforeBlockTraffic` , and `AfterBlockTraffic` in the AppSpec file from the previous successful deployment. (All other scripts are run from the AppSpec file in the current deployment.) If one of these scripts contains an error and does not run successfully, the deployment can fail.\\n\\nIf the cause of the failure is a script from the last successful deployment that will never run successfully, create a new deployment and use `ignoreApplicationStopFailures` to specify that the `ApplicationStop` , `BeforeBlockTraffic` , and `AfterBlockTraffic` failures should be ignored.","Revision":"Information about the location of stored application artifacts and the service from which to retrieve them."}},"AWS::CodeDeploy::DeploymentGroup.DeploymentReadyOption":{"attributes":{},"description":"Information about how traffic is rerouted to instances in a replacement environment in a blue/green deployment.","properties":{"ActionOnTimeout":"Information about when to reroute traffic from an original environment to a replacement environment in a blue/green deployment.\\n\\n- CONTINUE_DEPLOYMENT: Register new instances with the load balancer immediately after the new application revision is installed on the instances in the replacement environment.\\n- STOP_DEPLOYMENT: Do not register new instances with a load balancer unless traffic rerouting is started using [ContinueDeployment](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_ContinueDeployment.html) . If traffic rerouting is not started before the end of the specified wait period, the deployment status is changed to Stopped.","WaitTimeInMinutes":"The number of minutes to wait before the status of a blue/green deployment is changed to Stopped if rerouting is not started manually. Applies only to the `STOP_DEPLOYMENT` option for `actionOnTimeout` ."}},"AWS::CodeDeploy::DeploymentGroup.DeploymentStyle":{"attributes":{},"description":"Information about the type of deployment, either in-place or blue/green, you want to run and whether to route deployment traffic behind a load balancer.","properties":{"DeploymentOption":"Indicates whether to route deployment traffic behind a load balancer.\\n\\n> An Amazon EC2 Application Load Balancer or Network Load Balancer is required for an Amazon ECS deployment.","DeploymentType":"Indicates whether to run an in-place or blue/green deployment."}},"AWS::CodeDeploy::DeploymentGroup.EC2TagFilter":{"attributes":{},"description":"Information about an Amazon EC2 tag filter.\\n\\nFor more information about using tags and tag groups to help manage your Amazon EC2 instances and on-premises instances, see [Tagging Instances for Deployment Groups in AWS CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/instances-tagging.html) in the *AWS CodeDeploy User Guide* .","properties":{"Key":"The tag filter key.","Type":"The tag filter type:\\n\\n- `KEY_ONLY` : Key only.\\n- `VALUE_ONLY` : Value only.\\n- `KEY_AND_VALUE` : Key and value.","Value":"The tag filter value."}},"AWS::CodeDeploy::DeploymentGroup.EC2TagSet":{"attributes":{},"description":"The `EC2TagSet` property type specifies information about groups of tags applied to Amazon EC2 instances. The deployment group includes only Amazon EC2 instances identified by all the tag groups. `EC2TagSet` cannot be used in the same template as `EC2TagFilter` .\\n\\nFor information about using tags and tag groups to help manage your Amazon EC2 instances and on-premises instances, see [Tagging Instances for Deployment Groups in AWS CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/instances-tagging.html) .","properties":{"Ec2TagSetList":"The Amazon EC2 tags that are already applied to Amazon EC2 instances that you want to include in the deployment group. CodeDeploy includes all Amazon EC2 instances identified by any of the tags you specify in this deployment group.\\n\\nDuplicates are not allowed."}},"AWS::CodeDeploy::DeploymentGroup.EC2TagSetListObject":{"attributes":{},"description":"The `EC2TagSet` property type specifies information about groups of tags applied to Amazon EC2 instances. The deployment group includes only Amazon EC2 instances identified by all the tag groups. Cannot be used in the same template as EC2TagFilters.\\n\\nFor more information about using tags and tag groups to help manage your Amazon EC2 instances and on-premises instances, see [Tagging Instances for Deployment Groups in AWS CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/instances-tagging.html) in the *AWS CodeDeploy User Guide* .\\n\\n`EC2TagSet` is a property of the [DeploymentGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html) resource type.","properties":{"Ec2TagGroup":"A list that contains other lists of Amazon EC2 instance tag groups. For an instance to be included in the deployment group, it must be identified by all of the tag groups in the list."}},"AWS::CodeDeploy::DeploymentGroup.ECSService":{"attributes":{},"description":"Contains the service and cluster names used to identify an Amazon ECS deployment\'s target.","properties":{"ClusterName":"The name of the cluster that the Amazon ECS service is associated with.","ServiceName":"The name of the target Amazon ECS service."}},"AWS::CodeDeploy::DeploymentGroup.ELBInfo":{"attributes":{},"description":"The `ELBInfo` property type specifies information about the Elastic Load Balancing load balancer used for an CodeDeploy deployment group.\\n\\nIf you specify the `ELBInfo` property, the `DeploymentStyle.DeploymentOption` property must be set to `WITH_TRAFFIC_CONTROL` for AWS CodeDeploy to route your traffic using the specified load balancers.\\n\\n`ELBInfo` is a property of the [AWS CodeDeploy DeploymentGroup LoadBalancerInfo](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-loadbalancerinfo.html) property type.","properties":{"Name":"For blue/green deployments, the name of the load balancer that is used to route traffic from original instances to replacement instances in a blue/green deployment. For in-place deployments, the name of the load balancer that instances are deregistered from so they are not serving traffic during a deployment, and then re-registered with after the deployment is complete.\\n\\n> AWS CloudFormation supports blue/green deployments on AWS Lambda compute platforms only."}},"AWS::CodeDeploy::DeploymentGroup.GitHubLocation":{"attributes":{},"description":"`GitHubLocation` is a property of the [CodeDeploy DeploymentGroup Revision](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision.html) property that specifies the location of an application revision that is stored in GitHub.","properties":{"CommitId":"The SHA1 commit ID of the GitHub commit that represents the bundled artifacts for the application revision.","Repository":"The GitHub account and repository pair that stores a reference to the commit that represents the bundled artifacts for the application revision.\\n\\nSpecify the value as `account/repository` ."}},"AWS::CodeDeploy::DeploymentGroup.GreenFleetProvisioningOption":{"attributes":{},"description":"Information about the instances that belong to the replacement environment in a blue/green deployment.","properties":{"Action":"The method used to add instances to a replacement environment.\\n\\n- `DISCOVER_EXISTING` : Use instances that already exist or will be created manually.\\n- `COPY_AUTO_SCALING_GROUP` : Use settings from a specified Auto Scaling group to define and create instances in a new Auto Scaling group."}},"AWS::CodeDeploy::DeploymentGroup.LoadBalancerInfo":{"attributes":{},"description":"The `LoadBalancerInfo` property type specifies information about the load balancer or target group used for an AWS CodeDeploy deployment group. For more information, see [Integrating CodeDeploy with Elastic Load Balancing](https://docs.aws.amazon.com/codedeploy/latest/userguide/integrations-aws-elastic-load-balancing.html) in the *AWS CodeDeploy User Guide* .\\n\\nFor AWS CloudFormation to use the properties specified in `LoadBalancerInfo` , the `DeploymentStyle.DeploymentOption` property must be set to `WITH_TRAFFIC_CONTROL` . If `DeploymentStyle.DeploymentOption` is not set to `WITH_TRAFFIC_CONTROL` , AWS CloudFormation ignores any settings specified in `LoadBalancerInfo` .\\n\\n> AWS CloudFormation supports blue/green deployments on the AWS Lambda compute platform only. \\n\\n`LoadBalancerInfo` is a property of the [DeploymentGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html) resource.","properties":{"ElbInfoList":"An array that contains information about the load balancer to use for load balancing in a deployment. In Elastic Load Balancing, load balancers are used with Classic Load Balancers.\\n\\n> Adding more than one load balancer to the array is not supported.","TargetGroupInfoList":"An array that contains information about the target group to use for load balancing in a deployment. In Elastic Load Balancing , target groups are used with Application Load Balancers .\\n\\n> Adding more than one target group to the array is not supported.","TargetGroupPairInfoList":""}},"AWS::CodeDeploy::DeploymentGroup.OnPremisesTagSet":{"attributes":{},"description":"The `OnPremisesTagSet` property type specifies a list containing other lists of on-premises instance tag groups. In order for an instance to be included in the deployment group, it must be identified by all the tag groups in the list.\\n\\nFor more information about using tags and tag groups to help manage your Amazon EC2 instances and on-premises instances, see [Tagging Instances for Deployment Groups in AWS CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/instances-tagging.html) in the *AWS CodeDeploy User Guide* .\\n\\n`OnPremisesTagSet` is a property of the [DeploymentGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html) resource.","properties":{"OnPremisesTagSetList":"A list that contains other lists of on-premises instance tag groups. For an instance to be included in the deployment group, it must be identified by all of the tag groups in the list.\\n\\nDuplicates are not allowed."}},"AWS::CodeDeploy::DeploymentGroup.OnPremisesTagSetListObject":{"attributes":{},"description":"The `OnPremisesTagSetListObject` property type specifies lists of on-premises instance tag groups. In order for an instance to be included in the deployment group, it must be identified by all the tag groups in the list.\\n\\n`OnPremisesTagSetListObject` is a property of the [CodeDeploy DeploymentGroup OnPremisesTagSet](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-onpremisestagset.html) property type.","properties":{"OnPremisesTagGroup":"Information about groups of on-premises instance tags."}},"AWS::CodeDeploy::DeploymentGroup.RevisionLocation":{"attributes":{},"description":"`RevisionLocation` is a property that defines the location of the CodeDeploy application revision to deploy.","properties":{"GitHubLocation":"Information about the location of application artifacts stored in GitHub.","RevisionType":"The type of application revision:\\n\\n- S3: An application revision stored in Amazon S3.\\n- GitHub: An application revision stored in GitHub (EC2/On-premises deployments only).\\n- String: A YAML-formatted or JSON-formatted string ( AWS Lambda deployments only).\\n- AppSpecContent: An `AppSpecContent` object that contains the contents of an AppSpec file for an AWS Lambda or Amazon ECS deployment. The content is formatted as JSON or YAML stored as a RawString.","S3Location":"Information about the location of a revision stored in Amazon S3."}},"AWS::CodeDeploy::DeploymentGroup.S3Location":{"attributes":{},"description":"`S3Location` is a property of the [CodeDeploy DeploymentGroup Revision](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision.html) property that specifies the location of an application revision that is stored in Amazon Simple Storage Service ( Amazon S3 ).","properties":{"Bucket":"The name of the Amazon S3 bucket where the application revision is stored.","BundleType":"The file type of the application revision. Must be one of the following:\\n\\n- JSON\\n- tar: A tar archive file.\\n- tgz: A compressed tar archive file.\\n- YAML\\n- zip: A zip archive file.","ETag":"The ETag of the Amazon S3 object that represents the bundled artifacts for the application revision.\\n\\nIf the ETag is not specified as an input parameter, ETag validation of the object is skipped.","Key":"The name of the Amazon S3 object that represents the bundled artifacts for the application revision.","Version":"A specific version of the Amazon S3 object that represents the bundled artifacts for the application revision.\\n\\nIf the version is not specified, the system uses the most recent version by default."}},"AWS::CodeDeploy::DeploymentGroup.TagFilter":{"attributes":{},"description":"`TagFilter` is a property type of the [AWS::CodeDeploy::DeploymentGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html) resource that specifies which on-premises instances to associate with the deployment group. To register on-premise instances with AWS CodeDeploy , see [Configure Existing On-Premises Instances by Using AWS CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/instances-on-premises.html) in the *AWS CodeDeploy User Guide* .\\n\\nFor more information about using tags and tag groups to help manage your Amazon EC2 instances and on-premises instances, see [Tagging Instances for Deployment Groups in AWS CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/instances-tagging.html) in the *AWS CodeDeploy User Guide* .","properties":{"Key":"The on-premises instance tag filter key.","Type":"The on-premises instance tag filter type:\\n\\n- KEY_ONLY: Key only.\\n- VALUE_ONLY: Value only.\\n- KEY_AND_VALUE: Key and value.","Value":"The on-premises instance tag filter value."}},"AWS::CodeDeploy::DeploymentGroup.TargetGroupInfo":{"attributes":{},"description":"The `TargetGroupInfo` property type specifies information about a target group in Elastic Load Balancing to use in a deployment. Instances are registered as targets in a target group, and traffic is routed to the target group. For more information, see [TargetGroupInfo](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_TargetGroupInfo.html) in the *AWS CodeDeploy API Reference*\\n\\nIf you specify the `TargetGroupInfo` property, the `DeploymentStyle.DeploymentOption` property must be set to `WITH_TRAFFIC_CONTROL` for CodeDeploy to route your traffic using the specified target groups.\\n\\n`TargetGroupInfo` is a property of the [LoadBalancerInfo](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-loadbalancerinfo.html) property type.","properties":{"Name":"For blue/green deployments, the name of the target group that instances in the original environment are deregistered from, and instances in the replacement environment registered with. For in-place deployments, the name of the target group that instances are deregistered from, so they are not serving traffic during a deployment, and then re-registered with after the deployment completes. No duplicates allowed.\\n\\n> AWS CloudFormation supports blue/green deployments on AWS Lambda compute platforms only. \\n\\nThis value cannot exceed 32 characters, so you should use the `Name` property of the target group, or the `TargetGroupName` attribute with the `Fn::GetAtt` intrinsic function, as shown in the following example. Don\'t use the group\'s Amazon Resource Name (ARN) or `TargetGroupFullName` attribute."}},"AWS::CodeDeploy::DeploymentGroup.TargetGroupPairInfo":{"attributes":{},"description":"","properties":{"ProdTrafficRoute":"","TargetGroups":"","TestTrafficRoute":""}},"AWS::CodeDeploy::DeploymentGroup.TrafficRoute":{"attributes":{},"description":"","properties":{"ListenerArns":""}},"AWS::CodeDeploy::DeploymentGroup.TriggerConfig":{"attributes":{},"description":"Information about notification triggers for the deployment group.","properties":{"TriggerEvents":"The event type or types that trigger notifications.","TriggerName":"The name of the notification trigger.","TriggerTargetArn":"The Amazon Resource Name (ARN) of the Amazon Simple Notification Service topic through which notifications about deployment or instance events are sent."}},"AWS::CodeGuruProfiler::ProfilingGroup":{"attributes":{"Arn":"The full Amazon Resource Name (ARN) for that profiling group.","Ref":"`Ref` returns the name of the profiling group."},"description":"Creates a profiling group.","properties":{"AgentPermissions":"The agent permissions attached to this profiling group. This action group grants `ConfigureAgent` and `PostAgentProfile` permissions to perform actions required by the profiling agent. The Json consists of key `Principals` .\\n\\n*Principals* : A list of string ARNs for the roles and users you want to grant access to the profiling group. Wildcards are not supported in the ARNs. You are allowed to provide up to 50 ARNs. An empty list is not permitted. This is a required key.\\n\\nFor more information, see [Resource-based policies in CodeGuru Profiler](https://docs.aws.amazon.com/codeguru/latest/profiler-ug/resource-based-policies.html) in the *Amazon CodeGuru Profiler user guide* , [ConfigureAgent](https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ConfigureAgent.html) , and [PostAgentProfile](https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_PostAgentProfile.html) .","AnomalyDetectionNotificationConfiguration":"Adds anomaly notifications for a profiling group.","ComputePlatform":"The compute platform of the profiling group. Use `AWSLambda` if your application runs on AWS Lambda. Use `Default` if your application runs on a compute platform that is not AWS Lambda , such an Amazon EC2 instance, an on-premises server, or a different platform. If not specified, `Default` is used. This property is immutable.","ProfilingGroupName":"The name of the profiling group.","Tags":"A list of tags to add to the created profiling group."}},"AWS::CodeGuruProfiler::ProfilingGroup.AgentPermissions":{"attributes":{},"description":"","properties":{"Principals":""}},"AWS::CodeGuruProfiler::ProfilingGroup.Channel":{"attributes":{},"description":"Notification medium for users to get alerted for events that occur in application profile. We support SNS topic as a notification channel.","properties":{"channelId":"The channel ID.","channelUri":"The channel URI."}},"AWS::CodeGuruReviewer::RepositoryAssociation":{"attributes":{"AssociationArn":"The Amazon Resource Name (ARN) of the [`RepositoryAssociation`](https://docs.aws.amazon.com/codeguru/latest/reviewer-api/API_RepositoryAssociation.html) object. You can retrieve this ARN by calling `ListRepositories` .","Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the Amazon Resource Name (ARN) of the AWS CodeGuru Reviewer [`RepositoryAssociation`](https://docs.aws.amazon.com/codeguru/latest/reviewer-api/API_RepositoryAssociation.html) , such as `arn:aws:codeguru-reviewer:region:123456789012:association/universally-unique-identifier` .\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"This resource configures how Amazon CodeGuru Reviewer retrieves the source code to be reviewed. You can use an AWS CloudFormation template to create an association with the following repository types:\\n\\n- AWS CodeCommit - For more information, see [Create an AWS CodeCommit repository association](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/create-codecommit-association.html) in the *Amazon CodeGuru Reviewer User Guide* .\\n- Bitbucket - For more information, see [Create a Bitbucket repository association](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/create-bitbucket-association.html) in the *Amazon CodeGuru Reviewer User Guide* .\\n- GitHub Enterprise Server - For more information, see [Create a GitHub Enterprise Server repository association](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/create-github-enterprise-association.html) in the *Amazon CodeGuru Reviewer User Guide* .\\n- S3Bucket - For more information, see [Create code reviews with GitHub Actions](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/working-with-cicd.html) in the *Amazon CodeGuru Reviewer User Guide* .\\n\\n> You cannot use a CloudFormation template to create an association with a GitHub repository.","properties":{"BucketName":"The name of the bucket. This is required for your S3Bucket repository. The name must start with the prefix `codeguru-reviewer-*` .","ConnectionArn":"The Amazon Resource Name (ARN) of an AWS CodeStar Connections connection. Its format is `arn:aws:codestar-connections:region-id:aws-account_id:connection/connection-id` . For more information, see [Connection](https://docs.aws.amazon.com/codestar-connections/latest/APIReference/API_Connection.html) in the *AWS CodeStar Connections API Reference* .\\n\\n`ConnectionArn` must be specified for Bitbucket and GitHub Enterprise Server repositories. It has no effect if it is specified for an AWS CodeCommit repository.","Name":"The name of the repository.","Owner":"The owner of the repository. For a GitHub Enterprise Server or Bitbucket repository, this is the username for the account that owns the repository.\\n\\n`Owner` must be specified for Bitbucket and GitHub Enterprise Server repositories. It has no effect if it is specified for an AWS CodeCommit repository.","Tags":"An array of key-value pairs used to tag an associated repository. A tag is a custom attribute label with two parts:\\n\\n- A *tag key* (for example, `CostCenter` , `Environment` , `Project` , or `Secret` ). Tag keys are case sensitive.\\n- An optional field known as a *tag value* (for example, `111122223333` , `Production` , or a team name). Omitting the tag value is the same as using an empty string. Like tag keys, tag values are case sensitive.","Type":"The type of repository that contains the source code to be reviewed. The valid values are:\\n\\n- `CodeCommit`\\n- `Bitbucket`\\n- `GitHubEnterpriseServer`\\n- `S3Bucket`"}},"AWS::CodePipeline::CustomActionType":{"attributes":{"Id":"","Ref":"`Ref` returns the custom action name, such as custo-MyCus-A1BCDEFGHIJ2."},"description":"The `AWS::CodePipeline::CustomActionType` resource creates a custom action for activities that aren\'t included in the CodePipeline default actions, such as running an internally developed build process or a test suite. You can use these custom actions in the stage of a pipeline. For more information, see [Create and Add a Custom Action in AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/how-to-create-custom-action.html) in the *AWS CodePipeline User Guide* .","properties":{"Category":"The category of the custom action, such as a build action or a test action.","ConfigurationProperties":"The configuration properties for the custom action.\\n\\n> You can refer to a name in the configuration properties of the custom action within the URL templates by following the format of {Config:name}, as long as the configuration property is both required and not secret. For more information, see [Create a Custom Action for a Pipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/how-to-create-custom-action.html) .","InputArtifactDetails":"The details of the input artifact for the action, such as its commit ID.","OutputArtifactDetails":"The details of the output artifact of the action, such as its commit ID.","Provider":"The provider of the service used in the custom action, such as CodeDeploy.","Settings":"URLs that provide users information about this custom action.","Tags":"The tags for the custom action.","Version":"The version identifier of the custom action."}},"AWS::CodePipeline::CustomActionType.ArtifactDetails":{"attributes":{},"description":"Returns information about the details of an artifact.","properties":{"MaximumCount":"The maximum number of artifacts allowed for the action type.","MinimumCount":"The minimum number of artifacts allowed for the action type."}},"AWS::CodePipeline::CustomActionType.ConfigurationProperties":{"attributes":{},"description":"The configuration properties for the custom action.\\n\\n> You can refer to a name in the configuration properties of the custom action within the URL templates by following the format of {Config:name}, as long as the configuration property is both required and not secret. For more information, see [Create a Custom Action for a Pipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/how-to-create-custom-action.html) .","properties":{"Description":"The description of the action configuration property that is displayed to users.","Key":"Whether the configuration property is a key.","Name":"The name of the action configuration property.","Queryable":"Indicates that the property is used with `PollForJobs` . When creating a custom action, an action can have up to one queryable property. If it has one, that property must be both required and not secret.\\n\\nIf you create a pipeline with a custom action type, and that custom action contains a queryable property, the value for that configuration property is subject to other restrictions. The value must be less than or equal to twenty (20) characters. The value can contain only alphanumeric characters, underscores, and hyphens.","Required":"Whether the configuration property is a required value.","Secret":"Whether the configuration property is secret. Secrets are hidden from all calls except for `GetJobDetails` , `GetThirdPartyJobDetails` , `PollForJobs` , and `PollForThirdPartyJobs` .\\n\\nWhen updating a pipeline, passing * * * * * without changing any other values of the action preserves the previous value of the secret.","Type":"The type of the configuration property."}},"AWS::CodePipeline::CustomActionType.Settings":{"attributes":{},"description":"`Settings` is a property of the `AWS::CodePipeline::CustomActionType` resource that provides URLs that users can access to view information about the CodePipeline custom action.","properties":{"EntityUrlTemplate":"The URL returned to the CodePipeline console that provides a deep link to the resources of the external system, such as the configuration page for a CodeDeploy deployment group. This link is provided as part of the action display in the pipeline.","ExecutionUrlTemplate":"The URL returned to the CodePipeline console that contains a link to the top-level landing page for the external system, such as the console page for CodeDeploy. This link is shown on the pipeline view page in the CodePipeline console and provides a link to the execution entity of the external action.","RevisionUrlTemplate":"The URL returned to the CodePipeline console that contains a link to the page where customers can update or change the configuration of the external action.","ThirdPartyConfigurationUrl":"The URL of a sign-up page where users can sign up for an external service and perform initial configuration of the action provided by that service."}},"AWS::CodePipeline::Pipeline":{"attributes":{"Ref":"`Ref` returns the pipeline name, such as mysta-MyPipeline-A1BCDEFGHIJ2.","Version":"The version of the pipeline.\\n\\n> A new pipeline is always assigned a version number of 1. This number increments when a pipeline is updated."},"description":"The `AWS::CodePipeline::Pipeline` resource creates a CodePipeline pipeline that describes how software changes go through a release process. For more information, see [What Is CodePipeline?](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) in the *AWS CodePipeline User Guide* .","properties":{"ArtifactStore":"The S3 bucket where artifacts for the pipeline are stored.\\n\\n> You must include either `artifactStore` or `artifactStores` in your pipeline, but you cannot use both. If you create a cross-region action in your pipeline, you must use `artifactStores` .","ArtifactStores":"A mapping of `artifactStore` objects and their corresponding AWS Regions. There must be an artifact store for the pipeline Region and for each cross-region action in the pipeline.\\n\\n> You must include either `artifactStore` or `artifactStores` in your pipeline, but you cannot use both. If you create a cross-region action in your pipeline, you must use `artifactStores` .","DisableInboundStageTransitions":"Represents the input of a `DisableStageTransition` action.","Name":"The name of the pipeline.","RestartExecutionOnUpdate":"Indicates whether to rerun the CodePipeline pipeline after you update it.","RoleArn":"The Amazon Resource Name (ARN) for CodePipeline to use to either perform actions with no `actionRoleArn` , or to use to assume roles for actions with an `actionRoleArn` .","Stages":"Represents information about a stage and its definition.","Tags":"Specifies the tags applied to the pipeline."}},"AWS::CodePipeline::Pipeline.ActionDeclaration":{"attributes":{},"description":"Represents information about an action declaration.","properties":{"ActionTypeId":"Specifies the action type and the provider of the action.","Configuration":"The action\'s configuration. These are key-value pairs that specify input values for an action. For more information, see [Action Structure Requirements in CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html#action-requirements) . For the list of configuration properties for the AWS CloudFormation action type in CodePipeline, see [Configuration Properties Reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline-action-reference.html) in the *AWS CloudFormation User Guide* . For template snippets with examples, see [Using Parameter Override Functions with CodePipeline Pipelines](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline-parameter-override-functions.html) in the *AWS CloudFormation User Guide* .\\n\\nThe values can be represented in either JSON or YAML format. For example, the JSON configuration item format is as follows:\\n\\n*JSON:*\\n\\n`\\"Configuration\\" : { Key : Value },`","InputArtifacts":"The name or ID of the artifact consumed by the action, such as a test or build artifact. While the field is not a required parameter, most actions have an action configuration that requires a specified quantity of input artifacts. To refer to the action configuration specification by action provider, see the [Action structure reference](https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference.html) in the *AWS CodePipeline User Guide* .\\n\\n> For a CodeBuild action with multiple input artifacts, one of your input sources must be designated the PrimarySource. For more information, see the [CodeBuild action reference page](https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-CodeBuild.html) in the *AWS CodePipeline User Guide* .","Name":"The action declaration\'s name.","Namespace":"The variable namespace associated with the action. All variables produced as output by this action fall under this namespace.","OutputArtifacts":"The name or ID of the result of the action declaration, such as a test or build artifact. While the field is not a required parameter, most actions have an action configuration that requires a specified quantity of output artifacts. To refer to the action configuration specification by action provider, see the [Action structure reference](https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference.html) in the *AWS CodePipeline User Guide* .","Region":"The action declaration\'s AWS Region, such as us-east-1.","RoleArn":"The ARN of the IAM service role that performs the declared action. This is assumed through the roleArn for the pipeline.","RunOrder":"The order in which actions are run."}},"AWS::CodePipeline::Pipeline.ActionTypeId":{"attributes":{},"description":"Represents information about an action type.","properties":{"Category":"A category defines what kind of action can be taken in the stage, and constrains the provider type for the action. Valid categories are limited to one of the values below.\\n\\n- `Source`\\n- `Build`\\n- `Test`\\n- `Deploy`\\n- `Invoke`\\n- `Approval`","Owner":"The creator of the action being called. There are three valid values for the `Owner` field in the action category section within your pipeline structure: `AWS` , `ThirdParty` , and `Custom` . For more information, see [Valid Action Types and Providers in CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html#actions-valid-providers) .","Provider":"The provider of the service being called by the action. Valid providers are determined by the action category. For example, an action in the Deploy category type might have a provider of CodeDeploy, which would be specified as `CodeDeploy` . For more information, see [Valid Action Types and Providers in CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html#actions-valid-providers) .","Version":"A string that describes the action version."}},"AWS::CodePipeline::Pipeline.ArtifactStore":{"attributes":{},"description":"The S3 bucket where artifacts for the pipeline are stored.\\n\\n> You must include either `artifactStore` or `artifactStores` in your pipeline, but you cannot use both. If you create a cross-region action in your pipeline, you must use `artifactStores` .","properties":{"EncryptionKey":"The encryption key used to encrypt the data in the artifact store, such as an AWS Key Management Service ( AWS KMS) key. If this is undefined, the default key for Amazon S3 is used. To see an example artifact store encryption key field, see the example structure here: [AWS::CodePipeline::Pipeline](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html) .","Location":"The S3 bucket used for storing the artifacts for a pipeline. You can specify the name of an S3 bucket but not a folder in the bucket. A folder to contain the pipeline artifacts is created for you based on the name of the pipeline. You can use any S3 bucket in the same AWS Region as the pipeline to store your pipeline artifacts.","Type":"The type of the artifact store, such as S3."}},"AWS::CodePipeline::Pipeline.ArtifactStoreMap":{"attributes":{},"description":"A mapping of `artifactStore` objects and their corresponding AWS Regions. There must be an artifact store for the pipeline Region and for each cross-region action in the pipeline.\\n\\n> You must include either `artifactStore` or `artifactStores` in your pipeline, but you cannot use both. If you create a cross-region action in your pipeline, you must use `artifactStores` .","properties":{"ArtifactStore":"Represents information about the S3 bucket where artifacts are stored for the pipeline.\\n\\n> You must include either `artifactStore` or `artifactStores` in your pipeline, but you cannot use both. If you create a cross-region action in your pipeline, you must use `artifactStores` .","Region":"The action declaration\'s AWS Region, such as us-east-1."}},"AWS::CodePipeline::Pipeline.BlockerDeclaration":{"attributes":{},"description":"Reserved for future use.","properties":{"Name":"Reserved for future use.","Type":"Reserved for future use."}},"AWS::CodePipeline::Pipeline.EncryptionKey":{"attributes":{},"description":"Represents information about the key used to encrypt data in the artifact store, such as an AWS Key Management Service ( AWS KMS) key.\\n\\n`EncryptionKey` is a property of the [ArtifactStore](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore.html) property type.","properties":{"Id":"The ID used to identify the key. For an AWS KMS key, you can use the key ID, the key ARN, or the alias ARN.\\n\\n> Aliases are recognized only in the account that created the AWS KMS key. For cross-account actions, you can only use the key ID or key ARN to identify the key. Cross-account actions involve using the role from the other account (AccountB), so specifying the key ID will use the key from the other account (AccountB).","Type":"The type of encryption key, such as an AWS KMS key. When creating or updating a pipeline, the value must be set to \'KMS\'."}},"AWS::CodePipeline::Pipeline.InputArtifact":{"attributes":{},"description":"Represents information about an artifact to be worked on, such as a test or build artifact.","properties":{"Name":"The name of the artifact to be worked on (for example, \\"My App\\").\\n\\nArtifacts are the files that are worked on by actions in the pipeline. See the action configuration for each action for details about artifact parameters. For example, the S3 source action input artifact is a file name (or file path), and the files are generally provided as a ZIP file. Example artifact name: SampleApp_Windows.zip\\n\\nThe input artifact of an action must exactly match the output artifact declared in a preceding action, but the input artifact does not have to be the next action in strict sequence from the action that provided the output artifact. Actions in parallel can declare different output artifacts, which are in turn consumed by different following actions."}},"AWS::CodePipeline::Pipeline.OutputArtifact":{"attributes":{},"description":"Represents information about the output of an action.","properties":{"Name":"The name of the output of an artifact, such as \\"My App\\".\\n\\nThe output artifact name must exactly match the input artifact declared for a downstream action. However, the downstream action\'s input artifact does not have to be the next action in strict sequence from the action that provided the output artifact. Actions in parallel can declare different output artifacts, which are in turn consumed by different following actions.\\n\\nOutput artifact names must be unique within a pipeline."}},"AWS::CodePipeline::Pipeline.StageDeclaration":{"attributes":{},"description":"Represents information about a stage and its definition.","properties":{"Actions":"The actions included in a stage.","Blockers":"Reserved for future use.","Name":"The name of the stage."}},"AWS::CodePipeline::Pipeline.StageTransition":{"attributes":{},"description":"The name of the pipeline in which you want to disable the flow of artifacts from one stage to another.","properties":{"Reason":"The reason given to the user that a stage is disabled, such as waiting for manual approval or manual tests. This message is displayed in the pipeline console UI.","StageName":"The name of the stage where you want to disable the inbound or outbound transition of artifacts."}},"AWS::CodePipeline::Webhook":{"attributes":{"Ref":"`Ref` returns the webhook name, such as MyFirstPipeline-SourceAction1-Webhook-utb9LrOl24Kk.","Url":"The webhook URL generated by AWS CodePipeline , such as `https://eu-central-1.webhooks.aws/trigger123456` ."},"description":"The `AWS::CodePipeline::Webhook` resource creates and registers your webhook. After the webhook is created and registered, it triggers your pipeline to start every time an external event occurs. For more information, see [Migrate polling pipelines to use event-based change detection](https://docs.aws.amazon.com/codepipeline/latest/userguide/update-change-detection.html) in the *AWS CodePipeline User Guide* .\\n\\nWe strongly recommend that you use AWS Secrets Manager to store your credentials. If you use Secrets Manager, you must have already configured and stored your secret parameters in Secrets Manager. For more information, see [Using Dynamic References to Specify Template Values](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) .\\n\\n> When passing secret parameters, do not enter the value directly into the template. The value is rendered as plaintext and is therefore readable. For security reasons, do not use plaintext in your AWS CloudFormation template to store your credentials.","properties":{"Authentication":"Supported options are GITHUB_HMAC, IP, and UNAUTHENTICATED.\\n\\n- For information about the authentication scheme implemented by GITHUB_HMAC, see [Securing your webhooks](https://docs.aws.amazon.com/https://developer.github.com/webhooks/securing/) on the GitHub Developer website.\\n- IP rejects webhooks trigger requests unless they originate from an IP address in the IP range whitelisted in the authentication configuration.\\n- UNAUTHENTICATED accepts all webhook trigger requests regardless of origin.","AuthenticationConfiguration":"Properties that configure the authentication applied to incoming webhook trigger requests. The required properties depend on the authentication type. For GITHUB_HMAC, only the `SecretToken` property must be set. For IP, only the `AllowedIPRange` property must be set to a valid CIDR range. For UNAUTHENTICATED, no properties can be set.","Filters":"A list of rules applied to the body/payload sent in the POST request to a webhook URL. All defined rules must pass for the request to be accepted and the pipeline started.","Name":"The name of the webhook.","RegisterWithThirdParty":"Configures a connection between the webhook that was created and the external tool with events to be detected.","TargetAction":"The name of the action in a pipeline you want to connect to the webhook. The action must be from the source (first) stage of the pipeline.","TargetPipeline":"The name of the pipeline you want to connect to the webhook.","TargetPipelineVersion":"The version number of the pipeline to be connected to the trigger request.\\n\\nRequired: Yes\\n\\nType: Integer\\n\\nUpdate requires: [No interruption](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)"}},"AWS::CodePipeline::Webhook.WebhookAuthConfiguration":{"attributes":{},"description":"The authentication applied to incoming webhook trigger requests.","properties":{"AllowedIPRange":"The property used to configure acceptance of webhooks in an IP address range. For IP, only the `AllowedIPRange` property must be set. This property must be set to a valid CIDR range.","SecretToken":"The property used to configure GitHub authentication. For GITHUB_HMAC, only the `SecretToken` property must be set."}},"AWS::CodePipeline::Webhook.WebhookFilterRule":{"attributes":{},"description":"The event criteria that specify when a webhook notification is sent to your URL.","properties":{"JsonPath":"A JsonPath expression that is applied to the body/payload of the webhook. The value selected by the JsonPath expression must match the value specified in the `MatchEquals` field. Otherwise, the request is ignored. For more information, see [Java JsonPath implementation](https://docs.aws.amazon.com/https://github.com/json-path/JsonPath) in GitHub.","MatchEquals":"The value selected by the `JsonPath` expression must match what is supplied in the `MatchEquals` field. Otherwise, the request is ignored. Properties from the target action configuration can be included as placeholders in this value by surrounding the action configuration key with curly brackets. For example, if the value supplied here is \\"refs/heads/{Branch}\\" and the target action has an action configuration property called \\"Branch\\" with a value of \\"main\\", the `MatchEquals` value is evaluated as \\"refs/heads/main\\". For a list of action configuration properties for built-in action types, see [Pipeline Structure Reference Action Requirements](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html#action-requirements) ."}},"AWS::CodeStar::GitHubRepository":{"attributes":{"Ref":"`Ref` returns a string combination of the repository owner and the repository name, such as `my-github-account/my-github-repo` ."},"description":"The `AWS::CodeStar::GitHubRepository` resource creates a GitHub repository where users can store source code for use with AWS workflows. You must provide a location for the source code ZIP file in the AWS CloudFormation template, so the code can be uploaded to the created repository. You must have created a personal access token in GitHub to provide in the AWS CloudFormation template. AWS uses this token to connect to GitHub on your behalf. For more information about using a GitHub source repository with AWS CodeStar projects, see [AWS CodeStar Project Files and Resources](https://docs.aws.amazon.com/codestar/latest/userguide/templates.html#templates-whatis) .","properties":{"Code":"Information about code to be committed to a repository after it is created in an AWS CloudFormation stack.","ConnectionArn":"","EnableIssues":"Indicates whether to enable issues for the GitHub repository. You can use GitHub issues to track information and bugs for your repository.","IsPrivate":"Indicates whether the GitHub repository is a private repository. If so, you choose who can see and commit to this repository.","RepositoryAccessToken":"The GitHub user\'s personal access token for the GitHub repository.","RepositoryDescription":"A comment or description about the new repository. This description is displayed in GitHub after the repository is created.","RepositoryName":"The name of the repository you want to create in GitHub with AWS CloudFormation stack creation.","RepositoryOwner":"The GitHub user name for the owner of the GitHub repository to be created. If this repository should be owned by a GitHub organization, provide its name."}},"AWS::CodeStar::GitHubRepository.Code":{"attributes":{},"description":"The `Code` property type specifies information about code to be committed.\\n\\n`Code` is a property of the `AWS::CodeStar::GitHubRepository` resource.","properties":{"S3":"Information about the Amazon S3 bucket that contains a ZIP file of code to be committed to the repository."}},"AWS::CodeStar::GitHubRepository.S3":{"attributes":{},"description":"The `S3` property type specifies information about the Amazon S3 bucket that contains the code to be committed to the new repository.\\n\\n`S3` is a property of the `AWS::CodeStar::GitHubRepository` resource.","properties":{"Bucket":"The name of the Amazon S3 bucket that contains the ZIP file with the content to be committed to the new repository.","Key":"The S3 object key or file name for the ZIP file.","ObjectVersion":"The object version of the ZIP file, if versioning is enabled for the Amazon S3 bucket."}},"AWS::CodeStarConnections::Connection":{"attributes":{"ConnectionArn":"The Amazon Resource Name (ARN) of the connection. The ARN is used as the connection reference when the connection is shared between AWS services. For example: `arn:aws:codestar-connections:us-west-2:123456789012:connection/39e4c34d-e13a-4e94-a886-ea67651bf042` .","ConnectionStatus":"The current status of the connection. For example: `PENDING` , `AVAILABLE` , or `ERROR` .","OwnerAccountId":"The AWS account ID of the owner of the connection. For Bitbucket, this is the account ID of the owner of the Bitbucket repository. For example: `123456789012` .","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the connection. The ARN is used as the connection reference when the connection is shared between AWS services. For example:\\n\\n`arn:aws:codestar-connections:us-west-2:123456789012:connection/39e4c34d-e13a-4e94-a886-ea67651bf042`"},"description":"The AWS::CodeStarConnections::Connection resource can be used to connect external source providers with services like AWS CodePipeline .\\n\\n*Note:* A connection created through AWS CloudFormation is in `PENDING` status by default. You can make its status `AVAILABLE` by updating the connection in the console.","properties":{"ConnectionName":"The name of the connection. Connection names must be unique in an AWS user account.","HostArn":"The Amazon Resource Name (ARN) of the host associated with the connection.","ProviderType":"The name of the external provider where your third-party code repository is configured.","Tags":"Specifies the tags applied to the resource."}},"AWS::CodeStarNotifications::NotificationRule":{"attributes":{"Arn":"","Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, `Ref` returns the notification rule ARN."},"description":"Creates a notification rule for a resource. The rule specifies the events you want notifications about and the targets (such as AWS Chatbot topics or AWS Chatbot clients configured for Slack) where you want to receive them.","properties":{"CreatedBy":"","DetailType":"The level of detail to include in the notifications for this resource. `BASIC` will include only the contents of the event as it would appear in Amazon CloudWatch. `FULL` will include any supplemental information provided by AWS CodeStar Notifications and/or the service for the resource for which the notification is created.","EventTypeId":"","EventTypeIds":"A list of event types associated with this notification rule. For a complete list of event types and IDs, see [Notification concepts](https://docs.aws.amazon.com/dtconsole/latest/userguide/concepts.html#concepts-api) in the *Developer Tools Console User Guide* .","Name":"The name for the notification rule. Notification rule names must be unique in your AWS account .","Resource":"The Amazon Resource Name (ARN) of the resource to associate with the notification rule. Supported resources include pipelines in AWS CodePipeline , repositories in AWS CodeCommit , and build projects in AWS CodeBuild .","Status":"The status of the notification rule. The default value is `ENABLED` . If the status is set to `DISABLED` , notifications aren\'t sent for the notification rule.","Tags":"A list of tags to apply to this notification rule. Key names cannot start with \\" `aws` \\".","TargetAddress":"","Targets":"A list of Amazon Resource Names (ARNs) of Amazon Simple Notification Service topics and AWS Chatbot clients to associate with the notification rule."}},"AWS::CodeStarNotifications::NotificationRule.Target":{"attributes":{},"description":"Information about the AWS Chatbot topics or AWS Chatbot clients associated with a notification rule.","properties":{"TargetAddress":"The Amazon Resource Name (ARN) of the AWS Chatbot topic or AWS Chatbot client.","TargetType":"The target type. Can be an Amazon Simple Notification Service topic or AWS Chatbot client.\\n\\n- Amazon Simple Notification Service topics are specified as `SNS` .\\n- AWS Chatbot clients are specified as `AWSChatbotSlack` ."}},"AWS::Cognito::IdentityPool":{"attributes":{"Name":"The name of the Amazon Cognito identity pool, returned as a string.","Ref":"`Ref` returns the `IdentityPoolId` , such as `us-east-2:0d01f4d7-1305-4408-b437-12345EXAMPLE` ."},"description":"The `AWS::Cognito::IdentityPool` resource creates an Amazon Cognito identity pool.\\n\\nTo avoid deleting the resource accidentally from AWS CloudFormation , use [DeletionPolicy Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) and the [UpdateReplacePolicy Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html) to retain the resource on deletion or replacement.","properties":{"AllowClassicFlow":"Enables the Basic (Classic) authentication flow.","AllowUnauthenticatedIdentities":"Specifies whether the identity pool supports unauthenticated logins.","CognitoEvents":"The events to configure.","CognitoIdentityProviders":"The Amazon Cognito user pools and their client IDs.","CognitoStreams":"Configuration options for configuring Amazon Cognito streams.","DeveloperProviderName":"The \\"domain\\" Amazon Cognito uses when referencing your users. This name acts as a placeholder that allows your backend and the Amazon Cognito service to communicate about the developer provider. For the `DeveloperProviderName` , you can use letters and periods (.), underscores (_), and dashes (-).\\n\\n*Minimum length* : 1\\n\\n*Maximum length* : 100","IdentityPoolName":"The name of your Amazon Cognito identity pool.\\n\\n*Minimum length* : 1\\n\\n*Maximum length* : 128\\n\\n*Pattern* : `[\\\\w\\\\s+=,.@-]+`","OpenIdConnectProviderARNs":"The Amazon Resource Names (ARNs) of the OpenID connect providers.","PushSync":"The configuration options to be applied to the identity pool.","SamlProviderARNs":"The Amazon Resource Names (ARNs) of the Security Assertion Markup Language (SAML) providers.","SupportedLoginProviders":"Key-value pairs that map provider names to provider app IDs."}},"AWS::Cognito::IdentityPool.CognitoIdentityProvider":{"attributes":{},"description":"`CognitoIdentityProvider` is a property of the [AWS::Cognito::IdentityPool](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html) resource that represents an Amazon Cognito user pool and its client ID.","properties":{"ClientId":"The client ID for the Amazon Cognito user pool.","ProviderName":"The provider name for an Amazon Cognito user pool. For example: `cognito-idp.us-east-2.amazonaws.com/us-east-2_123456789` .","ServerSideTokenCheck":"TRUE if server-side token validation is enabled for the identity provider’s token.\\n\\nAfter you set the `ServerSideTokenCheck` to TRUE for an identity pool, that identity pool checks with the integrated user pools to make sure the user has not been globally signed out or deleted before the identity pool provides an OIDC token or AWS credentials for the user.\\n\\nIf the user is signed out or deleted, the identity pool returns a 400 Not Authorized error."}},"AWS::Cognito::IdentityPool.CognitoStreams":{"attributes":{},"description":"`CognitoStreams` is a property of the [AWS::Cognito::IdentityPool](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html) resource that defines configuration options for Amazon Cognito streams.","properties":{"RoleArn":"The Amazon Resource Name (ARN) of the role Amazon Cognito can assume to publish to the stream. This role must grant access to Amazon Cognito (cognito-sync) to invoke `PutRecord` on your Amazon Cognito stream.","StreamName":"The name of the Amazon Cognito stream to receive updates. This stream must be in the developer\'s account and in the same Region as the identity pool.","StreamingStatus":"Status of the Amazon Cognito streams. Valid values are: `ENABLED` or `DISABLED` ."}},"AWS::Cognito::IdentityPool.PushSync":{"attributes":{},"description":"`PushSync` is a property of the [AWS::Cognito::IdentityPool](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html) resource that defines the configuration options to be applied to an Amazon Cognito identity pool.","properties":{"ApplicationArns":"The ARNs of the Amazon SNS platform applications that could be used by clients.","RoleArn":"An IAM role configured to allow Amazon Cognito to call Amazon SNS on behalf of the developer."}},"AWS::Cognito::IdentityPoolPrincipalTag":{"attributes":{"Ref":"`Ref` returns the principal tag primary ID, like `us-east-1:1cf667a2-49a6-454b-9e45-23199EXAMPLE|graph.facebook.com` ."},"description":"A list of the identity pool principal tag assignments for attributes for access control.","properties":{"IdentityPoolId":"The identity pool that you want to associate with this principal tag map.","IdentityProviderName":"The identity pool identity provider (IdP) that you want to associate with this principal tag map.","PrincipalTags":"A JSON-formatted list of user claims and the principal tags that you want to associate with them. When Amazon Cognito requests credentials, it sets the value of the principal tag to the value of the user\'s claim.","UseDefaults":"Use a default set of mappings between claims and tags for this provider, instead of a custom map."}},"AWS::Cognito::IdentityPoolRoleAttachment":{"attributes":{"Ref":"`Ref` returns a generated ID, such as `IdentityPoolRoleAttachment-EXAMPLEwnOR3n` ."},"description":"The `AWS::Cognito::IdentityPoolRoleAttachment` resource manages the role configuration for an Amazon Cognito identity pool.","properties":{"IdentityPoolId":"An identity pool ID in the format `REGION:GUID` .","RoleMappings":"How users for a specific identity provider are mapped to roles. This is a string to the `RoleMapping` object map. The string identifies the identity provider. For example: `graph.facebook.com` or `cognito-idp.us-east-1.amazonaws.com/us-east-1_abcdefghi:app_client_id` .\\n\\nIf the `IdentityProvider` field isn\'t provided in this object, the string is used as the identity provider name.\\n\\nFor more information, see the [RoleMapping property](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-rolemapping.html) .","Roles":"The map of the roles associated with this pool. For a given role, the key is either \\"authenticated\\" or \\"unauthenticated\\". The value is the role ARN."}},"AWS::Cognito::IdentityPoolRoleAttachment.MappingRule":{"attributes":{},"description":"Defines how to map a claim to a role ARN.","properties":{"Claim":"The claim name that must be present in the token. For example: \\"isAdmin\\" or \\"paid\\".","MatchType":"The match condition that specifies how closely the claim value in the IdP token must match `Value` .\\n\\nValid values are: `Equals` , `Contains` , `StartsWith` , and `NotEqual` .","RoleARN":"The Amazon Resource Name (ARN) of the role.","Value":"A brief string that the claim must match. For example, \\"paid\\" or \\"yes\\"."}},"AWS::Cognito::IdentityPoolRoleAttachment.RoleMapping":{"attributes":{},"description":"`RoleMapping` is a property of the [AWS::Cognito::IdentityPoolRoleAttachment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolroleattachment.html) resource that defines the role-mapping attributes of an Amazon Cognito identity pool.","properties":{"AmbiguousRoleResolution":"Specifies the action to be taken if either no rules match the claim value for the Rules type, or there is no `cognito:preferred_role` claim and there are multiple `cognito:roles` matches for the Token type. If you specify Token or Rules as the Type, AmbiguousRoleResolution is required.\\n\\nValid values are `AuthenticatedRole` or `Deny` .","IdentityProvider":"Identifier for the identity provider for which the role is mapped. For example: `graph.facebook.com` or `cognito-idp.us-east-1.amazonaws.com/us-east-1_abcdefghi:app_client_id (http://cognito-idp.us-east-1.amazonaws.com/us-east-1_abcdefghi:app_client_id)` . This is the identity provider that is used by the user for authentication.\\n\\nIf the identity provider property isn\'t provided, the key of the entry in the `RoleMappings` map is used as the identity provider.","RulesConfiguration":"The rules to be used for mapping users to roles. If you specify \\"Rules\\" as the role-mapping type, RulesConfiguration is required.","Type":"The role-mapping type. `Token` uses `cognito:roles` and `cognito:preferred_role` claims from the Amazon Cognito identity provider token to map groups to roles. `Rules` attempts to match claims from the token to map to a role.\\n\\nValid values are `Token` or `Rules` ."}},"AWS::Cognito::IdentityPoolRoleAttachment.RulesConfigurationType":{"attributes":{},"description":"`RulesConfigurationType` is a subproperty of the [RoleMapping](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-rolemapping.html) property that defines the rules to be used for mapping users to roles.","properties":{"Rules":"The rules. You can specify up to 25 rules per identity provider."}},"AWS::Cognito::UserPool":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the user pool, such as `arn:aws:cognito-idp:us-east-1:123412341234:userpool/us-east-1_123412341` .","ProviderName":"The provider name of the Amazon Cognito user pool, specified as a `String` .","ProviderURL":"The URL of the provider of the Amazon Cognito user pool, specified as a `String` .","Ref":"`Ref` returns a generated ID, such as `us-east-2_zgaEXAMPLE` ."},"description":"The `AWS::Cognito::UserPool` resource creates an Amazon Cognito user pool. For more information on working with Amazon Cognito user pools, see [Amazon Cognito User Pools](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html) and [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) .\\n\\n> If you don\'t specify a value for a parameter, Amazon Cognito sets it to a default value.","properties":{"AccountRecoverySetting":"Use this setting to define which verified available method a user can use to recover their password when they call `ForgotPassword` . It allows you to define a preferred method when a user has more than one method available. With this setting, SMS does not qualify for a valid password recovery mechanism if the user also has SMS MFA enabled. In the absence of this setting, Cognito uses the legacy behavior to determine the recovery method where SMS is preferred over email.","AdminCreateUserConfig":"The configuration for creating a new user profile.","AliasAttributes":"Attributes supported as an alias for this user pool. Possible values: *phone_number* , *email* , or *preferred_username* .\\n\\n> This user pool property cannot be updated.","AutoVerifiedAttributes":"The attributes to be auto-verified. Possible values: *email* , *phone_number* .","DeletionProtection":"When active, `DeletionProtection` prevents accidental deletion of your user pool. Before you can delete a user pool that you have protected against deletion, you must deactivate this feature.\\n\\nWhen you try to delete a protected user pool in a `DeleteUserPool` API request, Amazon Cognito returns an `InvalidParameterException` error. To delete a protected user pool, send a new `DeleteUserPool` request after you deactivate deletion protection in an `UpdateUserPool` API request.","DeviceConfiguration":"The device-remembering configuration for a user pool. A null value indicates that you have deactivated device remembering in your user pool.\\n\\n> When you provide a value for any `DeviceConfiguration` field, you activate the Amazon Cognito device-remembering feature.","EmailConfiguration":"The email configuration of your user pool. The email configuration type sets your preferred sending method, AWS Region, and sender for messages from your user pool.","EmailVerificationMessage":"This parameter is no longer used. See [VerificationMessageTemplateType](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerificationMessageTemplateType.html) .","EmailVerificationSubject":"This parameter is no longer used. See [VerificationMessageTemplateType](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerificationMessageTemplateType.html) .","EnabledMfas":"Enables MFA on a specified user pool. To disable all MFAs after it has been enabled, set MfaConfiguration to “OFF” and remove EnabledMfas. MFAs can only be all disabled if MfaConfiguration is OFF. Once SMS_MFA is enabled, SMS_MFA can only be disabled by setting MfaConfiguration to “OFF”. Can be one of the following values:\\n\\n- `SMS_MFA` - Enables SMS MFA for the user pool. SMS_MFA can only be enabled if SMS configuration is provided.\\n- `SOFTWARE_TOKEN_MFA` - Enables software token MFA for the user pool.\\n\\nAllowed values: `SMS_MFA` | `SOFTWARE_TOKEN_MFA`","LambdaConfig":"The Lambda trigger configuration information for the new user pool.\\n\\n> In a push model, event sources (such as Amazon S3 and custom applications) need permission to invoke a function. So you must make an extra call to add permission for these event sources to invoke your Lambda function.\\n> \\n> For more information on using the Lambda API to add permission, see [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html) .\\n> \\n> For adding permission using the AWS CLI , see [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) .","MfaConfiguration":"The multi-factor authentication (MFA) configuration. Valid values include:\\n\\n- `OFF` MFA won\'t be used for any users.\\n- `ON` MFA is required for all users to sign in.\\n- `OPTIONAL` MFA will be required only for individual users who have an MFA factor activated.","Policies":"The policy associated with a user pool.","Schema":"The schema attributes for the new user pool. These attributes can be standard or custom attributes.\\n\\n> During a user pool update, you can add new schema attributes but you cannot modify or delete an existing schema attribute.","SmsAuthenticationMessage":"A string representing the SMS authentication message.","SmsConfiguration":"The SMS configuration with the settings that your Amazon Cognito user pool must use to send an SMS message from your AWS account through Amazon Simple Notification Service. To send SMS messages with Amazon SNS in the AWS Region that you want, the Amazon Cognito user pool uses an AWS Identity and Access Management (IAM) role in your AWS account .","SmsVerificationMessage":"This parameter is no longer used. See [VerificationMessageTemplateType](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerificationMessageTemplateType.html) .","UserAttributeUpdateSettings":"The settings for updates to user attributes. These settings include the property `AttributesRequireVerificationBeforeUpdate` ,\\na user-pool setting that tells Amazon Cognito how to handle changes to the value of your users\' email address and phone number attributes. For\\nmore information, see [Verifying updates to email addresses and phone numbers](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-email-phone-verification.html#user-pool-settings-verifications-verify-attribute-updates) .","UserPoolAddOns":"Enables advanced security risk detection. Set the key `AdvancedSecurityMode` to the value \\"AUDIT\\".","UserPoolName":"A string used to name the user pool.","UserPoolTags":"The tag keys and values to assign to the user pool. A tag is a label that you can use to categorize and manage user pools in different ways, such as by purpose, owner, environment, or other criteria.","UsernameAttributes":"Determines whether email addresses or phone numbers can be specified as user names when a user signs up. Possible values: `phone_number` or `email` .\\n\\nThis user pool property cannot be updated.","UsernameConfiguration":"You can choose to set case sensitivity on the username input for the selected sign-in option. For example, when this is set to `False` , users will be able to sign in using either \\"username\\" or \\"Username\\". This configuration is immutable once it has been set.","VerificationMessageTemplate":"The template for the verification message that the user sees when the app requests permission to access the user\'s information."}},"AWS::Cognito::UserPool.AccountRecoverySetting":{"attributes":{},"description":"Use this setting to define which verified available method a user can use to recover their password when they call `ForgotPassword` . It allows you to define a preferred method when a user has more than one method available. With this setting, SMS does not qualify for a valid password recovery mechanism if the user also has SMS MFA enabled. In the absence of this setting, Cognito uses the legacy behavior to determine the recovery method where SMS is preferred over email.","properties":{"RecoveryMechanisms":"The list of `RecoveryOptionTypes` ."}},"AWS::Cognito::UserPool.AdminCreateUserConfig":{"attributes":{},"description":"The configuration for `AdminCreateUser` requests.","properties":{"AllowAdminCreateUserOnly":"Set to `True` if only the administrator is allowed to create user profiles. Set to `False` if users can sign themselves up via an app.","InviteMessageTemplate":"The message template to be used for the welcome message to new users.\\n\\nSee also [Customizing User Invitation Messages](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-settings-message-customizations.html#cognito-user-pool-settings-user-invitation-message-customization) .","UnusedAccountValidityDays":"The user account expiration limit, in days, after which a new account that hasn\'t signed in is no longer usable. To reset the account after that time limit, you must call `AdminCreateUser` again, specifying `\\"RESEND\\"` for the `MessageAction` parameter. The default value for this parameter is 7.\\n\\n> If you set a value for `TemporaryPasswordValidityDays` in `PasswordPolicy` , that value will be used, and `UnusedAccountValidityDays` will be no longer be an available parameter for that user pool."}},"AWS::Cognito::UserPool.CustomEmailSender":{"attributes":{},"description":"A custom email sender AWS Lambda trigger.","properties":{"LambdaArn":"The Amazon Resource Name (ARN) of the AWS Lambda function that Amazon Cognito triggers to send email notifications to users.","LambdaVersion":"The Lambda version represents the signature of the \\"request\\" attribute in the \\"event\\" information that Amazon Cognito passes to your custom email sender AWS Lambda function. The only supported value is `V1_0` ."}},"AWS::Cognito::UserPool.CustomSMSSender":{"attributes":{},"description":"A custom SMS sender AWS Lambda trigger.","properties":{"LambdaArn":"The Amazon Resource Name (ARN) of the AWS Lambda function that Amazon Cognito triggers to send SMS notifications to users.","LambdaVersion":"The Lambda version represents the signature of the \\"request\\" attribute in the \\"event\\" information Amazon Cognito passes to your custom SMS sender Lambda function. The only supported value is `V1_0` ."}},"AWS::Cognito::UserPool.DeviceConfiguration":{"attributes":{},"description":"The device-remembering configuration for a user pool. A [DescribeUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPool.html) request returns a null value for this object when the user pool isn\'t configured to remember devices. When device remembering is active, you can remember a user\'s device with a [ConfirmDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmDevice.html) API request. Additionally. when the property `DeviceOnlyRememberedOnUserPrompt` is `true` , you must follow `ConfirmDevice` with an [UpdateDeviceStatus](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateDeviceStatus.html) API request that sets the user\'s device to `remembered` or `not_remembered` .\\n\\nTo sign in with a remembered device, include `DEVICE_KEY` in the authentication parameters in your user\'s [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) request. If your app doesn\'t include a `DEVICE_KEY` parameter, the [response](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#API_InitiateAuth_ResponseSyntax) from Amazon Cognito includes newly-generated `DEVICE_KEY` and `DEVICE_GROUP_KEY` values under `NewDeviceMetadata` . Store these values to use in future device-authentication requests.\\n\\n> When you provide a value for any property of `DeviceConfiguration` , you activate the device remembering for the user pool.","properties":{"ChallengeRequiredOnNewDevice":"When true, a remembered device can sign in with device authentication instead of SMS and time-based one-time password (TOTP) factors for multi-factor authentication (MFA).\\n\\n> Whether or not `ChallengeRequiredOnNewDevice` is true, users who sign in with devices that have not been confirmed or remembered must still provide a second factor in a user pool that requires MFA.","DeviceOnlyRememberedOnUserPrompt":"When true, Amazon Cognito doesn\'t automatically remember a user\'s device when your app sends a [ConfirmDevice](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmDevice.html) API request. In your app, create a prompt for your user to choose whether they want to remember their device. Return the user\'s choice in an [UpdateDeviceStatus](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateDeviceStatus.html) API request.\\n\\nWhen `DeviceOnlyRememberedOnUserPrompt` is `false` , Amazon Cognito immediately remembers devices that you register in a `ConfirmDevice` API request."}},"AWS::Cognito::UserPool.EmailConfiguration":{"attributes":{},"description":"The email configuration of your user pool. The email configuration type sets your preferred sending method, AWS Region, and sender for messages from your user pool.","properties":{"ConfigurationSet":"The set of configuration rules that can be applied to emails sent using Amazon SES. A configuration set is applied to an email by including a reference to the configuration set in the headers of the email. Once applied, all of the rules in that configuration set are applied to the email. Configuration sets can be used to apply the following types of rules to emails:\\n\\n- Event publishing – Amazon SES can track the number of send, delivery, open, click, bounce, and complaint events for each email sent. Use event publishing to send information about these events to other AWS services such as SNS and CloudWatch.\\n- IP pool management – When leasing dedicated IP addresses with Amazon SES, you can create groups of IP addresses, called dedicated IP pools. You can then associate the dedicated IP pools with configuration sets.","EmailSendingAccount":"Specifies whether Amazon Cognito uses its built-in functionality to send your users email messages, or uses your Amazon Simple Email Service email configuration. Specify one of the following values:\\n\\n- **COGNITO_DEFAULT** - When Amazon Cognito emails your users, it uses its built-in email functionality. When you use the default option, Amazon Cognito allows only a limited number of emails each day for your user pool. For typical production environments, the default email limit is less than the required delivery volume. To achieve a higher delivery volume, specify DEVELOPER to use your Amazon SES email configuration.\\n\\nTo look up the email delivery limit for the default option, see [Limits](https://docs.aws.amazon.com/cognito/latest/developerguide/limits.html) in the *Amazon Cognito Developer Guide* .\\n\\nThe default FROM address is `no-reply@verificationemail.com` . To customize the FROM address, provide the Amazon Resource Name (ARN) of an Amazon SES verified email address for the `SourceArn` parameter.\\n- **DEVELOPER** - When Amazon Cognito emails your users, it uses your Amazon SES configuration. Amazon Cognito calls Amazon SES on your behalf to send email from your verified email address. When you use this option, the email delivery limits are the same limits that apply to your Amazon SES verified email address in your AWS account .\\n\\nIf you use this option, provide the ARN of an Amazon SES verified email address for the `SourceArn` parameter.\\n\\nBefore Amazon Cognito can email your users, it requires additional permissions to call Amazon SES on your behalf. When you update your user pool with this option, Amazon Cognito creates a *service-linked role* , which is a type of role in your AWS account . This role contains the permissions that allow you to access Amazon SES and send email messages from your email address. For more information about the service-linked role that Amazon Cognito creates, see [Using Service-Linked Roles for Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/using-service-linked-roles.html) in the *Amazon Cognito Developer Guide* .","From":"Identifies either the sender\'s email address or the sender\'s name with their email address. For example, `testuser@example.com` or `Test User ` . This address appears before the body of the email.","ReplyToEmailAddress":"The destination to which the receiver of the email should reply.","SourceArn":"The ARN of a verified email address in Amazon SES. Amazon Cognito uses this email address in one of the following ways, depending on the value that you specify for the `EmailSendingAccount` parameter:\\n\\n- If you specify `COGNITO_DEFAULT` , Amazon Cognito uses this address as the custom FROM address when it emails your users using its built-in email account.\\n- If you specify `DEVELOPER` , Amazon Cognito emails your users with this address by calling Amazon SES on your behalf.\\n\\nThe Region value of the `SourceArn` parameter must indicate a supported AWS Region of your user pool. Typically, the Region in the `SourceArn` and the user pool Region are the same. For more information, see [Amazon SES email configuration regions](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-email.html#user-pool-email-developer-region-mapping) in the [Amazon Cognito Developer Guide](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html) ."}},"AWS::Cognito::UserPool.InviteMessageTemplate":{"attributes":{},"description":"The message template to be used for the welcome message to new users.\\n\\nSee also [Customizing User Invitation Messages](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-settings-message-customizations.html#cognito-user-pool-settings-user-invitation-message-customization) .","properties":{"EmailMessage":"The message template for email messages. EmailMessage is allowed only if [EmailSendingAccount](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_EmailConfigurationType.html#CognitoUserPools-Type-EmailConfigurationType-EmailSendingAccount) is DEVELOPER.","EmailSubject":"The subject line for email messages. EmailSubject is allowed only if [EmailSendingAccount](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_EmailConfigurationType.html#CognitoUserPools-Type-EmailConfigurationType-EmailSendingAccount) is DEVELOPER.","SMSMessage":"The message template for SMS messages."}},"AWS::Cognito::UserPool.LambdaConfig":{"attributes":{},"description":"Specifies the configuration for AWS Lambda triggers.","properties":{"CreateAuthChallenge":"Creates an authentication challenge.","CustomEmailSender":"A custom email sender AWS Lambda trigger.","CustomMessage":"A custom Message AWS Lambda trigger.","CustomSMSSender":"A custom SMS sender AWS Lambda trigger.","DefineAuthChallenge":"Defines the authentication challenge.","KMSKeyID":"The Amazon Resource Name of a AWS Key Management Service ( AWS KMS ) key. Amazon Cognito uses the key to encrypt codes and temporary passwords sent to `CustomEmailSender` and `CustomSMSSender` .","PostAuthentication":"A post-authentication AWS Lambda trigger.","PostConfirmation":"A post-confirmation AWS Lambda trigger.","PreAuthentication":"A pre-authentication AWS Lambda trigger.","PreSignUp":"A pre-registration AWS Lambda trigger.","PreTokenGeneration":"A Lambda trigger that is invoked before token generation.","UserMigration":"The user migration Lambda config type.","VerifyAuthChallengeResponse":"Verifies the authentication challenge response."}},"AWS::Cognito::UserPool.NumberAttributeConstraints":{"attributes":{},"description":"The minimum and maximum values of an attribute that is of the number data type.","properties":{"MaxValue":"The maximum value of an attribute that is of the number data type.","MinValue":"The minimum value of an attribute that is of the number data type."}},"AWS::Cognito::UserPool.PasswordPolicy":{"attributes":{},"description":"The password policy type.","properties":{"MinimumLength":"The minimum length of the password in the policy that you have set. This value can\'t be less than 6.","RequireLowercase":"In the password policy that you have set, refers to whether you have required users to use at least one lowercase letter in their password.","RequireNumbers":"In the password policy that you have set, refers to whether you have required users to use at least one number in their password.","RequireSymbols":"In the password policy that you have set, refers to whether you have required users to use at least one symbol in their password.","RequireUppercase":"In the password policy that you have set, refers to whether you have required users to use at least one uppercase letter in their password.","TemporaryPasswordValidityDays":"The number of days a temporary password is valid in the password policy. If the user doesn\'t sign in during this time, an administrator must reset their password.\\n\\n> When you set `TemporaryPasswordValidityDays` for a user pool, you can no longer set a value for the legacy `UnusedAccountValidityDays` parameter in that user pool."}},"AWS::Cognito::UserPool.Policies":{"attributes":{},"description":"The policy associated with a user pool.","properties":{"PasswordPolicy":"The password policy."}},"AWS::Cognito::UserPool.RecoveryOption":{"attributes":{},"description":"A map containing a priority as a key, and recovery method name as a value.","properties":{"Name":"Specifies the recovery method for a user.","Priority":"A positive integer specifying priority of a method with 1 being the highest priority."}},"AWS::Cognito::UserPool.SchemaAttribute":{"attributes":{},"description":"Contains information about the schema attribute.","properties":{"AttributeDataType":"The attribute data type.","DeveloperOnlyAttribute":"> We recommend that you use [WriteAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserPoolClientType.html#CognitoUserPools-Type-UserPoolClientType-WriteAttributes) in the user pool client to control how attributes can be mutated for new use cases instead of using `DeveloperOnlyAttribute` . \\n\\nSpecifies whether the attribute type is developer only. This attribute can only be modified by an administrator. Users will not be able to modify this attribute using their access token.","Mutable":"Specifies whether the value of the attribute can be changed.\\n\\nFor any user pool attribute that is mapped to an IdP attribute, you must set this parameter to `true` . Amazon Cognito updates mapped attributes when users sign in to your application through an IdP. If an attribute is immutable, Amazon Cognito throws an error when it attempts to update the attribute. For more information, see [Specifying Identity Provider Attribute Mappings for Your User Pool](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-specifying-attribute-mapping.html) .","Name":"A schema attribute of the name type.","NumberAttributeConstraints":"Specifies the constraints for an attribute of the number type.","Required":"Specifies whether a user pool attribute is required. If the attribute is required and the user doesn\'t provide a value, registration or sign-in will fail.","StringAttributeConstraints":"Specifies the constraints for an attribute of the string type."}},"AWS::Cognito::UserPool.SmsConfiguration":{"attributes":{},"description":"The SMS configuration type that includes the settings the Cognito User Pool needs to call for the Amazon SNS service to send an SMS message from your AWS account . The Cognito User Pool makes the request to the Amazon SNS Service by using an IAM role that you provide for your AWS account .","properties":{"ExternalId":"The external ID is a value. We recommend you use `ExternalId` to add security to your IAM role, which is used to call Amazon SNS to send SMS messages for your user pool. If you provide an `ExternalId` , the Cognito User Pool uses it when attempting to assume your IAM role. You can also set your roles trust policy to require the `ExternalID` . If you use the Cognito Management Console to create a role for SMS MFA, Cognito creates a role with the required permissions and a trust policy that uses `ExternalId` .","SnsCallerArn":"The Amazon Resource Name (ARN) of the Amazon SNS caller. This is the ARN of the IAM role in your AWS account that Amazon Cognito will use to send SMS messages. SMS messages are subject to a [spending limit](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-email-phone-verification.html) .","SnsRegion":"The AWS Region to use with Amazon SNS integration. You can choose the same Region as your user pool, or a supported *Legacy Amazon SNS alternate Region* .\\n\\nAmazon Cognito resources in the Asia Pacific (Seoul) AWS Region must use your Amazon SNS configuration in the Asia Pacific (Tokyo) Region. For more information, see [SMS message settings for Amazon Cognito user pools](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-sms-settings.html) ."}},"AWS::Cognito::UserPool.StringAttributeConstraints":{"attributes":{},"description":"The `StringAttributeConstraints` property type defines the string attribute constraints of an Amazon Cognito user pool. `StringAttributeConstraints` is a subproperty of the [SchemaAttribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-schemaattribute.html) property type.","properties":{"MaxLength":"The maximum length.","MinLength":"The minimum length."}},"AWS::Cognito::UserPool.UserAttributeUpdateSettings":{"attributes":{},"description":"The settings for updates to user attributes. These settings include the property `AttributesRequireVerificationBeforeUpdate` ,\\na user-pool setting that tells Amazon Cognito how to handle changes to the value of your users\' email address and phone number attributes. For\\nmore information, see [Verifying updates to email addresses and phone numbers](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-email-phone-verification.html#user-pool-settings-verifications-verify-attribute-updates) .","properties":{"AttributesRequireVerificationBeforeUpdate":"Requires that your user verifies their email address, phone number, or both before Amazon Cognito updates the value of that attribute. When you update a user attribute that has this option activated, Amazon Cognito sends a verification message to the new phone number or email address. Amazon Cognito doesn’t change the value of the attribute until your user responds to the verification message and confirms the new value.\\n\\nYou can verify an updated email address or phone number with a [VerifyUserAttribute](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttribute.html) API request. You can also call the [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) API and set `email_verified` or `phone_number_verified` to true.\\n\\nWhen `AttributesRequireVerificationBeforeUpdate` is false, your user pool doesn\'t require that your users verify attribute changes before Amazon Cognito updates them. In a user pool where `AttributesRequireVerificationBeforeUpdate` is false, API operations that change attribute values can immediately update a user’s `email` or `phone_number` attribute."}},"AWS::Cognito::UserPool.UserPoolAddOns":{"attributes":{},"description":"The user pool add-ons type.","properties":{"AdvancedSecurityMode":"The advanced security mode."}},"AWS::Cognito::UserPool.UsernameConfiguration":{"attributes":{},"description":"The `UsernameConfiguration` property type specifies case sensitivity on the username input for the selected sign-in option.","properties":{"CaseSensitive":"Specifies whether user name case sensitivity will be applied for all users in the user pool through Amazon Cognito APIs. For most use cases, set case sensitivity to `False` (case insensitive) as a best practice. When usernames and email addresses are case insensitive, users can sign in as the same user when they enter a different capitalization of their user name.\\n\\nValid values include:\\n\\n- **True** - Enables case sensitivity for all username input. When this option is set to `True` , users must sign in using the exact capitalization of their given username, such as “UserName”. This is the default value.\\n- **False** - Enables case insensitivity for all username input. For example, when this option is set to `False` , users can sign in using `username` , `USERNAME` , or `UserName` . This option also enables both `preferred_username` and `email` alias to be case insensitive, in addition to the `username` attribute."}},"AWS::Cognito::UserPool.VerificationMessageTemplate":{"attributes":{},"description":"The template for verification messages.","properties":{"DefaultEmailOption":"The default email option.","EmailMessage":"The template for email messages that Amazon Cognito sends to your users. You can set an `EmailMessage` template only if the value of [EmailSendingAccount](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_EmailConfigurationType.html#CognitoUserPools-Type-EmailConfigurationType-EmailSendingAccount) is `DEVELOPER` . When your [EmailSendingAccount](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_EmailConfigurationType.html#CognitoUserPools-Type-EmailConfigurationType-EmailSendingAccount) is `DEVELOPER` , your user pool sends email messages with your own Amazon SES configuration.","EmailMessageByLink":"The email message template for sending a confirmation link to the user. You can set an `EmailMessageByLink` template only if the value of [EmailSendingAccount](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_EmailConfigurationType.html#CognitoUserPools-Type-EmailConfigurationType-EmailSendingAccount) is `DEVELOPER` . When your [EmailSendingAccount](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_EmailConfigurationType.html#CognitoUserPools-Type-EmailConfigurationType-EmailSendingAccount) is `DEVELOPER` , your user pool sends email messages with your own Amazon SES configuration.","EmailSubject":"The subject line for the email message template. You can set an `EmailSubject` template only if the value of [EmailSendingAccount](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_EmailConfigurationType.html#CognitoUserPools-Type-EmailConfigurationType-EmailSendingAccount) is `DEVELOPER` . When your [EmailSendingAccount](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_EmailConfigurationType.html#CognitoUserPools-Type-EmailConfigurationType-EmailSendingAccount) is `DEVELOPER` , your user pool sends email messages with your own Amazon SES configuration.","EmailSubjectByLink":"The subject line for the email message template for sending a confirmation link to the user. You can set an `EmailSubjectByLink` template only if the value of [EmailSendingAccount](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_EmailConfigurationType.html#CognitoUserPools-Type-EmailConfigurationType-EmailSendingAccount) is `DEVELOPER` . When your [EmailSendingAccount](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_EmailConfigurationType.html#CognitoUserPools-Type-EmailConfigurationType-EmailSendingAccount) is `DEVELOPER` , your user pool sends email messages with your own Amazon SES configuration.","SmsMessage":"The template for SMS messages that Amazon Cognito sends to your users."}},"AWS::Cognito::UserPoolClient":{"attributes":{"Ref":"`Ref` returns the Amazon Cognito user pool client ID, such as `1h57kf5cpq17m0eml12EXAMPLE` ."},"description":"The `AWS::Cognito::UserPoolClient` resource specifies an Amazon Cognito user pool client.\\n\\n> If you don\'t specify a value for a parameter, Amazon Cognito sets it to a default value.","properties":{"AccessTokenValidity":"The access token time limit. After this limit expires, your user can\'t use their access token. To specify the time unit for `AccessTokenValidity` as `seconds` , `minutes` , `hours` , or `days` , set a `TokenValidityUnits` value in your API request.\\n\\nFor example, when you set `AccessTokenValidity` to `10` and `TokenValidityUnits` to `hours` , your user can authorize access with their access token for 10 hours.\\n\\nThe default time unit for `AccessTokenValidity` in an API request is hours.","AllowedOAuthFlows":"The allowed OAuth flows.\\n\\n- **code** - Use a code grant flow, which provides an authorization code as the response. This code can be exchanged for access tokens with the `/oauth2/token` endpoint.\\n- **implicit** - Issue the access token (and, optionally, ID token, based on scopes) directly to your user.\\n- **client_credentials** - Issue the access token from the `/oauth2/token` endpoint directly to a non-person user using a combination of the client ID and client secret.","AllowedOAuthFlowsUserPoolClient":"Set to true if the client is allowed to follow the OAuth protocol when interacting with Amazon Cognito user pools.","AllowedOAuthScopes":"The allowed OAuth scopes. Possible values provided by OAuth are `phone` , `email` , `openid` , and `profile` . Possible values provided by AWS are `aws.cognito.signin.user.admin` . Custom scopes created in Resource Servers are also supported.","AnalyticsConfiguration":"The user pool analytics configuration for collecting metrics and sending them to your Amazon Pinpoint campaign.\\n\\n> In AWS Regions where Amazon Pinpoint isn\'t available, user pools only support sending events to Amazon Pinpoint projects in AWS Region us-east-1. In Regions where Amazon Pinpoint is available, user pools support sending events to Amazon Pinpoint projects within that same Region.","AuthSessionValidity":"Amazon Cognito creates a session token for each API request in an authentication flow. `AuthSessionValidity` is the duration, in minutes, of that session token. Your user pool native user must respond to each authentication challenge before the session expires.","CallbackURLs":"A list of allowed redirect (callback) URLs for the IdPs.\\n\\nA redirect URI must:\\n\\n- Be an absolute URI.\\n- Be registered with the authorization server.\\n- Not include a fragment component.\\n\\nSee [OAuth 2.0 - Redirection Endpoint](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc6749#section-3.1.2) .\\n\\nAmazon Cognito requires HTTPS over HTTP except for http://localhost for testing purposes only.\\n\\nApp callback URLs such as myapp://example are also supported.","ClientName":"The client name for the user pool client you would like to create.","DefaultRedirectURI":"The default redirect URI. Must be in the `CallbackURLs` list.\\n\\nA redirect URI must:\\n\\n- Be an absolute URI.\\n- Be registered with the authorization server.\\n- Not include a fragment component.\\n\\nSee [OAuth 2.0 - Redirection Endpoint](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc6749#section-3.1.2) .\\n\\nAmazon Cognito requires HTTPS over HTTP except for http://localhost for testing purposes only.\\n\\nApp callback URLs such as myapp://example are also supported.","EnablePropagateAdditionalUserContextData":"Activates the propagation of additional user context data. For more information about propagation of user context data, see [Adding advanced security to a user pool](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-settings-advanced-security.html) . If you don’t include this parameter, you can\'t send device fingerprint information, including source IP address, to Amazon Cognito advanced security. You can only activate `EnablePropagateAdditionalUserContextData` in an app client that has a client secret.","EnableTokenRevocation":"Activates or deactivates token revocation. For more information about revoking tokens, see [RevokeToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RevokeToken.html) .\\n\\nIf you don\'t include this parameter, token revocation is automatically activated for the new user pool client.","ExplicitAuthFlows":"The authentication flows that you want your user pool client to support. For each app client in your user pool, you can sign in your users with any combination of one or more flows, including with a user name and Secure Remote Password (SRP), a user name and password, or a custom authentication process that you define with Lambda functions.\\n\\n> If you don\'t specify a value for `ExplicitAuthFlows` , your user client supports `ALLOW_REFRESH_TOKEN_AUTH` , `ALLOW_USER_SRP_AUTH` , and `ALLOW_CUSTOM_AUTH` . \\n\\nValid values include:\\n\\n- `ALLOW_ADMIN_USER_PASSWORD_AUTH` : Enable admin based user password authentication flow `ADMIN_USER_PASSWORD_AUTH` . This setting replaces the `ADMIN_NO_SRP_AUTH` setting. With this authentication flow, your app passes a user name and password to Amazon Cognito in the request, instead of using the Secure Remote Password (SRP) protocol to securely transmit the password.\\n- `ALLOW_CUSTOM_AUTH` : Enable Lambda trigger based authentication.\\n- `ALLOW_USER_PASSWORD_AUTH` : Enable user password-based authentication. In this flow, Amazon Cognito receives the password in the request instead of using the SRP protocol to verify passwords.\\n- `ALLOW_USER_SRP_AUTH` : Enable SRP-based authentication.\\n- `ALLOW_REFRESH_TOKEN_AUTH` : Enable authflow to refresh tokens.\\n\\nIn some environments, you will see the values `ADMIN_NO_SRP_AUTH` , `CUSTOM_AUTH_FLOW_ONLY` , or `USER_PASSWORD_AUTH` . You can\'t assign these legacy `ExplicitAuthFlows` values to user pool clients at the same time as values that begin with `ALLOW_` ,\\nlike `ALLOW_USER_SRP_AUTH` .","GenerateSecret":"Boolean to specify whether you want to generate a secret for the user pool client being created.","IdTokenValidity":"The ID token time limit. After this limit expires, your user can\'t use their ID token. To specify the time unit for `IdTokenValidity` as `seconds` , `minutes` , `hours` , or `days` , set a `TokenValidityUnits` value in your API request.\\n\\nFor example, when you set `IdTokenValidity` as `10` and `TokenValidityUnits` as `hours` , your user can authenticate their session with their ID token for 10 hours.\\n\\nThe default time unit for `IdTokenValidity` in an API request is hours.","LogoutURLs":"A list of allowed logout URLs for the IdPs.","PreventUserExistenceErrors":"Use this setting to choose which errors and responses are returned by Cognito APIs during authentication, account confirmation, and password recovery when the user does not exist in the user pool. When set to `ENABLED` and the user does not exist, authentication returns an error indicating either the username or password was incorrect, and account confirmation and password recovery return a response indicating a code was sent to a simulated destination. When set to `LEGACY` , those APIs will return a `UserNotFoundException` exception if the user does not exist in the user pool.","ReadAttributes":"The read attributes.","RefreshTokenValidity":"The refresh token time limit. After this limit expires, your user can\'t use their refresh token. To specify the time unit for `RefreshTokenValidity` as `seconds` , `minutes` , `hours` , or `days` , set a `TokenValidityUnits` value in your API request.\\n\\nFor example, when you set `RefreshTokenValidity` as `10` and `TokenValidityUnits` as `days` , your user can refresh their session and retrieve new access and ID tokens for 10 days.\\n\\nThe default time unit for `RefreshTokenValidity` in an API request is days. You can\'t set `RefreshTokenValidity` to 0. If you do, Amazon Cognito overrides the value with the default value of 30 days.","SupportedIdentityProviders":"A list of provider names for the identity providers (IdPs) that are supported on this client. The following are supported: `COGNITO` , `Facebook` , `Google` , `SignInWithApple` , and `LoginWithAmazon` . You can also specify the names that you configured for the SAML and OIDC IdPs in your user pool, for example `MySAMLIdP` or `MyOIDCIdP` .","TokenValidityUnits":"The units in which the validity times are represented. The default unit for RefreshToken is days, and default for ID and access tokens are hours.","UserPoolId":"The user pool ID for the user pool where you want to create a user pool client.","WriteAttributes":"The user pool attributes that the app client can write to.\\n\\nIf your app client allows users to sign in through an IdP, this array must include all attributes that you have mapped to IdP attributes. Amazon Cognito updates mapped attributes when users sign in to your application through an IdP. If your app client does not have write access to a mapped attribute, Amazon Cognito throws an error when it tries to update the attribute. For more information, see [Specifying IdP Attribute Mappings for Your user pool](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-specifying-attribute-mapping.html) ."}},"AWS::Cognito::UserPoolClient.AnalyticsConfiguration":{"attributes":{},"description":"The Amazon Pinpoint analytics configuration necessary to collect metrics for a user pool.\\n\\n> In Regions where Amazon Pinpoint isn\'t available, user pools only support sending events to Amazon Pinpoint projects in us-east-1. In Regions where Amazon Pinpoint is available, user pools support sending events to Amazon Pinpoint projects within that same Region.","properties":{"ApplicationArn":"The Amazon Resource Name (ARN) of an Amazon Pinpoint project. You can use the Amazon Pinpoint project for integration with the chosen user pool client. Amazon Cognito publishes events to the Amazon Pinpoint project that the app ARN declares.","ApplicationId":"The application ID for an Amazon Pinpoint application.","ExternalId":"The external ID.","RoleArn":"The ARN of an AWS Identity and Access Management role that authorizes Amazon Cognito to publish events to Amazon Pinpoint analytics.","UserDataShared":"If `UserDataShared` is `true` , Amazon Cognito includes user data in the events that it publishes to Amazon Pinpoint analytics."}},"AWS::Cognito::UserPoolClient.TokenValidityUnits":{"attributes":{},"description":"The time units you use when you set the duration of ID, access, and refresh tokens. The default unit for RefreshToken is days, and the default for ID and access tokens is hours.","properties":{"AccessToken":"A time unit of `seconds` , `minutes` , `hours` , or `days` for the value that you set in the `AccessTokenValidity` parameter. The default `AccessTokenValidity` time unit is hours. `AccessTokenValidity` duration can range from five minutes to one day.","IdToken":"A time unit of `seconds` , `minutes` , `hours` , or `days` for the value that you set in the `IdTokenValidity` parameter. The default `IdTokenValidity` time unit is hours. `IdTokenValidity` duration can range from five minutes to one day.","RefreshToken":"A time unit of `seconds` , `minutes` , `hours` , or `days` for the value that you set in the `RefreshTokenValidity` parameter. The default `RefreshTokenValidity` time unit is days. `RefreshTokenValidity` duration can range from 60 minutes to 10 years."}},"AWS::Cognito::UserPoolDomain":{"attributes":{"CloudFrontDistribution":"The Amazon CloudFront endpoint that you use as the target of the alias that you set up with your Domain Name Service (DNS) provider.","Ref":"`Ref` returns physicalResourceId, which is “Domain\\". For example:\\n\\n`{ \\"Ref\\": \\"your-test-domain\\" }`\\n\\nFor the Amazon Cognito user pool domain `your-test-domain` , Ref returns the name of the user pool domain."},"description":"The AWS::Cognito::UserPoolDomain resource creates a new domain for a user pool.","properties":{"CustomDomainConfig":"The configuration for a custom domain that hosts the sign-up and sign-in pages for your application. Use this object to specify an SSL certificate that is managed by ACM.","Domain":"The domain name for the domain that hosts the sign-up and sign-in pages for your application. For example: `auth.example.com` . If you\'re using a prefix domain, this field denotes the first part of the domain before `.auth.[region].amazoncognito.com` .\\n\\nThis string can include only lowercase letters, numbers, and hyphens. Don\'t use a hyphen for the first or last character. Use periods to separate subdomain names.","UserPoolId":"The user pool ID for the user pool where you want to associate a user pool domain."}},"AWS::Cognito::UserPoolDomain.CustomDomainConfigType":{"attributes":{},"description":"The configuration for a custom domain that hosts the sign-up and sign-in webpages for your application.","properties":{"CertificateArn":"The Amazon Resource Name (ARN) of an AWS Certificate Manager SSL certificate. You use this certificate for the subdomain of your custom domain."}},"AWS::Cognito::UserPoolGroup":{"attributes":{"Ref":"`Ref` returns the name of the user pool group. For example: `Admins` ."},"description":"Specifies a new group in the identified user pool.\\n\\nCalling this action requires developer credentials.\\n\\n> If you don\'t specify a value for a parameter, Amazon Cognito sets it to a default value.","properties":{"Description":"A string containing the description of the group.","GroupName":"The name of the group. Must be unique.","Precedence":"A non-negative integer value that specifies the precedence of this group relative to the other groups that a user can belong to in the user pool. Zero is the highest precedence value. Groups with lower `Precedence` values take precedence over groups with higher or null `Precedence` values. If a user belongs to two or more groups, it is the group with the lowest precedence value whose role ARN is given in the user\'s tokens for the `cognito:roles` and `cognito:preferred_role` claims.\\n\\nTwo groups can have the same `Precedence` value. If this happens, neither group takes precedence over the other. If two groups with the same `Precedence` have the same role ARN, that role is used in the `cognito:preferred_role` claim in tokens for users in each group. If the two groups have different role ARNs, the `cognito:preferred_role` claim isn\'t set in users\' tokens.\\n\\nThe default `Precedence` value is null. The maximum `Precedence` value is `2^31-1` .","RoleArn":"The role Amazon Resource Name (ARN) for the group.","UserPoolId":"The user pool ID for the user pool."}},"AWS::Cognito::UserPoolIdentityProvider":{"attributes":{"Ref":"`Ref` returns physicalResourceId, which is “ProviderName\\". For example:\\n\\n`{ \\"Ref\\": \\"testProvider\\" }`\\n\\nFor the Amazon Cognito identity provider `testProvider` , Ref returns the name of the identity provider."},"description":"The `AWS::Cognito::UserPoolIdentityProvider` resource creates an identity provider for a user pool.","properties":{"AttributeMapping":"A mapping of IdP attributes to standard and custom user pool attributes.","IdpIdentifiers":"A list of IdP identifiers.","ProviderDetails":"The IdP details. The following list describes the provider detail keys for each IdP type.\\n\\n- For Google and Login with Amazon:\\n\\n- client_id\\n- client_secret\\n- authorize_scopes\\n- For Facebook:\\n\\n- client_id\\n- client_secret\\n- authorize_scopes\\n- api_version\\n- For Sign in with Apple:\\n\\n- client_id\\n- team_id\\n- key_id\\n- private_key\\n- authorize_scopes\\n- For OpenID Connect (OIDC) providers:\\n\\n- client_id\\n- client_secret\\n- attributes_request_method\\n- oidc_issuer\\n- authorize_scopes\\n- The following keys are only present if Amazon Cognito didn\'t discover them at the `oidc_issuer` URL.\\n\\n- authorize_url\\n- token_url\\n- attributes_url\\n- jwks_uri\\n- Amazon Cognito sets the value of the following keys automatically. They are read-only.\\n\\n- attributes_url_add_attributes\\n- For SAML providers:\\n\\n- MetadataFile or MetadataURL\\n- IDPSignout *optional*","ProviderName":"The IdP name.","ProviderType":"The IdP type.","UserPoolId":"The user pool ID."}},"AWS::Cognito::UserPoolResourceServer":{"attributes":{"Ref":"`Ref` returns physicalResourceId, which is the resource server identifier “Identifier\\". For example:\\n\\n`{ \\"Ref\\": \\"yourResourceServerIdentifier\\" }`\\n\\nFor the Amazon Cognito resource server `yourResourceServerIdentifier` , Ref returns the name of the resource server."},"description":"The `AWS::Cognito::UserPoolResourceServer` resource creates a new OAuth2.0 resource server and defines custom scopes in it.\\n\\n> If you don\'t specify a value for a parameter, Amazon Cognito sets it to a default value.","properties":{"Identifier":"A unique resource server identifier for the resource server. This could be an HTTPS endpoint where the resource server is located. For example: `https://my-weather-api.example.com` .","Name":"A friendly name for the resource server.","Scopes":"A list of scopes. Each scope is a map with keys `ScopeName` and `ScopeDescription` .","UserPoolId":"The user pool ID for the user pool."}},"AWS::Cognito::UserPoolResourceServer.ResourceServerScopeType":{"attributes":{},"description":"A resource server scope.","properties":{"ScopeDescription":"A description of the scope.","ScopeName":"The name of the scope."}},"AWS::Cognito::UserPoolRiskConfigurationAttachment":{"attributes":{"Ref":"`Ref` returns the physicalResourceId, which is “UserPoolRiskConfigurationAttachment-UserPoolId-ClientId\\". For example:\\n\\n`{ \\"Ref\\": “UserPoolRiskConfigurationAttachment-us-east-1_FAKEPOOLID-2asc123fakeclientidajjulj6bh” }`\\n\\nFor the Amazon Cognito risk configuration attachment `UserPoolRiskConfigurationAttachment-us-east-1_FAKEPOOLID-2asc123fakeclientidajjulj6bh` , Ref returns the name of the risk configuration attachment."},"description":"The `AWS::Cognito::UserPoolRiskConfigurationAttachment` resource sets the risk configuration that is used for Amazon Cognito advanced security features.\\n\\nYou can specify risk configuration for a single client (with a specific `clientId` ) or for all clients (by setting the `clientId` to `ALL` ). If you specify `ALL` , the default configuration is used for every client that has had no risk configuration set previously. If you specify risk configuration for a particular client, it no longer falls back to the `ALL` configuration.","properties":{"AccountTakeoverRiskConfiguration":"The account takeover risk configuration object, including the `NotifyConfiguration` object and `Actions` to take if there is an account takeover.","ClientId":"The app client ID. You can specify the risk configuration for a single client (with a specific ClientId) or for all clients (by setting the ClientId to `ALL` ).","CompromisedCredentialsRiskConfiguration":"The compromised credentials risk configuration object, including the `EventFilter` and the `EventAction` .","RiskExceptionConfiguration":"The configuration to override the risk decision.","UserPoolId":"The user pool ID."}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.AccountTakeoverActionType":{"attributes":{},"description":"Account takeover action type.","properties":{"EventAction":"The action to take in response to the account takeover action. Valid values are as follows:\\n\\n- `BLOCK` Choosing this action will block the request.\\n- `MFA_IF_CONFIGURED` Present an MFA challenge if user has configured it, else allow the request.\\n- `MFA_REQUIRED` Present an MFA challenge if user has configured it, else block the request.\\n- `NO_ACTION` Allow the user to sign in.","Notify":"Flag specifying whether to send a notification."}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.AccountTakeoverActionsType":{"attributes":{},"description":"Account takeover actions type.","properties":{"HighAction":"Action to take for a high risk.","LowAction":"Action to take for a low risk.","MediumAction":"Action to take for a medium risk."}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.AccountTakeoverRiskConfigurationType":{"attributes":{},"description":"Configuration for mitigation actions and notification for different levels of risk detected for a potential account takeover.","properties":{"Actions":"Account takeover risk configuration actions.","NotifyConfiguration":"The notify configuration used to construct email notifications."}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.CompromisedCredentialsActionsType":{"attributes":{},"description":"The compromised credentials actions type.","properties":{"EventAction":"The event action."}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.CompromisedCredentialsRiskConfigurationType":{"attributes":{},"description":"The compromised credentials risk configuration type.","properties":{"Actions":"The compromised credentials risk configuration actions.","EventFilter":"Perform the action for these events. The default is to perform all events if no event filter is specified."}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.NotifyConfigurationType":{"attributes":{},"description":"The notify configuration type.","properties":{"BlockEmail":"Email template used when a detected risk event is blocked.","From":"The email address that is sending the email. The address must be either individually verified with Amazon Simple Email Service, or from a domain that has been verified with Amazon SES.","MfaEmail":"The multi-factor authentication (MFA) email template used when MFA is challenged as part of a detected risk.","NoActionEmail":"The email template used when a detected risk event is allowed.","ReplyTo":"The destination to which the receiver of an email should reply to.","SourceArn":"The Amazon Resource Name (ARN) of the identity that is associated with the sending authorization policy. This identity permits Amazon Cognito to send for the email address specified in the `From` parameter."}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.NotifyEmailType":{"attributes":{},"description":"The notify email type.","properties":{"HtmlBody":"The email HTML body.","Subject":"The email subject.","TextBody":"The email text body."}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.RiskExceptionConfigurationType":{"attributes":{},"description":"The type of the configuration to override the risk decision.","properties":{"BlockedIPRangeList":"Overrides the risk decision to always block the pre-authentication requests. The IP range is in CIDR notation, a compact representation of an IP address and its routing prefix.","SkippedIPRangeList":"Risk detection isn\'t performed on the IP addresses in this range list. The IP range is in CIDR notation."}},"AWS::Cognito::UserPoolUICustomizationAttachment":{"attributes":{"Ref":"`Ref` returns the physicalResourceId, which is “UserPoolUICustomizationAttachment-UserPoolId-ClientId\\". For example:\\n\\n`{ \\"Ref\\": \\"UserPoolUICustomizationAttachment-us-east-1_FAKEPOOLID-2asc123fakeclientidajjulj6bh\\" }`\\n\\nFor the Amazon Cognito user pool domain `UserPoolUICustomizationAttachment-us-east-1_FAKEPOOLID-2asc123fakeclientidajjulj6bh` , Ref returns the name of the UI customization attachment."},"description":"The `AWS::Cognito::UserPoolUICustomizationAttachment` resource sets the UI customization information for a user pool\'s built-in app UI.\\n\\nYou can specify app UI customization settings for a single client (with a specific `clientId` ) or for all clients (by setting the `clientId` to `ALL` ). If you specify `ALL` , the default configuration is used for every client that has had no UI customization set previously. If you specify UI customization settings for a particular client, it no longer falls back to the `ALL` configuration.\\n\\n> Before you create this resource, your user pool must have a domain associated with it. You can create an `AWS::Cognito::UserPoolDomain` resource first in this user pool. \\n\\nSetting a logo image isn\'t supported from AWS CloudFormation . Use the Amazon Cognito [SetUICustomization](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SetUICustomization.html#API_SetUICustomization_RequestSyntax) API operation to set the image.","properties":{"CSS":"The CSS values in the UI customization.","ClientId":"The client ID for the client app. You can specify the UI customization settings for a single client (with a specific clientId) or for all clients (by setting the clientId to `ALL` ).","UserPoolId":"The user pool ID for the user pool."}},"AWS::Cognito::UserPoolUser":{"attributes":{"Ref":"`Ref` returns the name of the user. For example: `admin` ."},"description":"The `AWS::Cognito::UserPoolUser` resource creates an Amazon Cognito user pool user.","properties":{"ClientMetadata":"A map of custom key-value pairs that you can provide as input for the custom workflow that is invoked by the *pre sign-up* trigger.\\n\\nYou create custom workflows by assigning AWS Lambda functions to user pool triggers. When you create a `UserPoolUser` resource and include the `ClientMetadata` property, Amazon Cognito invokes the function that is assigned to the *pre sign-up* trigger. When Amazon Cognito invokes this function, it passes a JSON payload, which the function receives as input. This payload contains a `clientMetadata` attribute, which provides the data that you assigned to the ClientMetadata property. In your function code in AWS Lambda , you can process the `clientMetadata` value to enhance your workflow for your specific needs.\\n\\nFor more information, see [Customizing User Pool Workflows with Lambda Triggers](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html) in the *Amazon Cognito Developer Guide* .\\n\\n> Take the following limitations into consideration when you use the ClientMetadata parameter:\\n> \\n> - Amazon Cognito does not store the ClientMetadata value. This data is available only to AWS Lambda triggers that are assigned to a user pool to support custom workflows. If your user pool configuration does not include triggers, the ClientMetadata parameter serves no purpose.\\n> - Amazon Cognito does not validate the ClientMetadata value.\\n> - Amazon Cognito does not encrypt the the ClientMetadata value, so don\'t use it to provide sensitive information.","DesiredDeliveryMediums":"Specify `\\"EMAIL\\"` if email will be used to send the welcome message. Specify `\\"SMS\\"` if the phone number will be used. The default value is `\\"SMS\\"` . You can specify more than one value.","ForceAliasCreation":"This parameter is used only if the `phone_number_verified` or `email_verified` attribute is set to `True` . Otherwise, it is ignored.\\n\\nIf this parameter is set to `True` and the phone number or email address specified in the UserAttributes parameter already exists as an alias with a different user, the API call will migrate the alias from the previous user to the newly created user. The previous user will no longer be able to log in using that alias.\\n\\nIf this parameter is set to `False` , the API throws an `AliasExistsException` error if the alias already exists. The default value is `False` .","MessageAction":"Set to `RESEND` to resend the invitation message to a user that already exists and reset the expiration limit on the user\'s account. Set to `SUPPRESS` to suppress sending the message. You can specify only one value.","UserAttributes":"The user attributes and attribute values to be set for the user to be created. These are name-value pairs You can create a user without specifying any attributes other than `Username` . However, any attributes that you specify as required (in [](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) or in the *Attributes* tab of the console) must be supplied either by you (in your call to `AdminCreateUser` ) or by the user (when they sign up in response to your welcome message).\\n\\nFor custom attributes, you must prepend the `custom:` prefix to the attribute name.\\n\\nTo send a message inviting the user to sign up, you must specify the user\'s email address or phone number. This can be done in your call to AdminCreateUser or in the *Users* tab of the Amazon Cognito console for managing your user pools.\\n\\nIn your call to `AdminCreateUser` , you can set the `email_verified` attribute to `True` , and you can set the `phone_number_verified` attribute to `True` . (You can also do this by calling [](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) .)\\n\\n- *email* : The email address of the user to whom the message that contains the code and user name will be sent. Required if the `email_verified` attribute is set to `True` , or if `\\"EMAIL\\"` is specified in the `DesiredDeliveryMediums` parameter.\\n- *phone_number* : The phone number of the user to whom the message that contains the code and user name will be sent. Required if the `phone_number_verified` attribute is set to `True` , or if `\\"SMS\\"` is specified in the `DesiredDeliveryMediums` parameter.","UserPoolId":"The user pool ID for the user pool where the user will be created.","Username":"The username for the user. Must be unique within the user pool. Must be a UTF-8 string between 1 and 128 characters. After the user is created, the username can\'t be changed.","ValidationData":"The user\'s validation data. This is an array of name-value pairs that contain user attributes and attribute values that you can use for custom validation, such as restricting the types of user accounts that can be registered. For example, you might choose to allow or disallow user sign-up based on the user\'s domain.\\n\\nTo configure custom validation, you must create a Pre Sign-up AWS Lambda trigger for the user pool as described in the Amazon Cognito Developer Guide. The Lambda trigger receives the validation data and uses it in the validation process.\\n\\nThe user\'s validation data isn\'t persisted."}},"AWS::Cognito::UserPoolUser.AttributeType":{"attributes":{},"description":"Specifies whether the attribute is standard or custom.","properties":{"Name":"The name of the attribute.","Value":"The value of the attribute."}},"AWS::Cognito::UserPoolUserToGroupAttachment":{"attributes":{"Ref":"`Ref` returns a generated ID, such as `UserToGroupAttachment-YejJvzrEXAMPLE` ."},"description":"Adds the specified user to the specified group.\\n\\nCalling this action requires developer credentials.","properties":{"GroupName":"The group name.","UserPoolId":"The user pool ID for the user pool.","Username":"The username for the user."}},"AWS::Comprehend::DocumentClassifier":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the document classifier.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the document classifier."},"description":"This resource creates and trains a document classifier to categorize documents. You provide a set of training documents that are labeled with the categories that you want to identify. After the classifier is trained you can use it to categorize a set of labeled documents into the categories. For more information, see [Document Classification](https://docs.aws.amazon.com/comprehend/latest/dg/how-document-classification.html) in the Comprehend Developer Guide.","properties":{"DataAccessRoleArn":"The Amazon Resource Name (ARN) of the IAM role that grants Amazon Comprehend read access to your input data.","DocumentClassifierName":"The name of the document classifier.","InputDataConfig":"Specifies the format and location of the input data for the job.","LanguageCode":"The language of the input documents. You can specify any of the languages supported by Amazon Comprehend. All documents must be in the same language.","Mode":"Indicates the mode in which the classifier will be trained. The classifier can be trained in multi-class mode, which identifies one and only one class for each document, or multi-label mode, which identifies one or more labels for each document. In multi-label mode, multiple labels for an individual document are separated by a delimiter. The default delimiter between labels is a pipe (|).","ModelKmsKeyId":"ID for the AWS KMS key that Amazon Comprehend uses to encrypt trained custom models. The ModelKmsKeyId can be either of the following formats:\\n\\n- KMS Key ID: `\\"1234abcd-12ab-34cd-56ef-1234567890ab\\"`\\n- Amazon Resource Name (ARN) of a KMS Key: `\\"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\\"`","ModelPolicy":"The resource-based policy to attach to your custom document classifier model. You can use this policy to allow another AWS account to import your custom model.\\n\\nProvide your policy as a JSON body that you enter as a UTF-8 encoded string without line breaks. To provide valid JSON, enclose the attribute names and values in double quotes. If the JSON body is also enclosed in double quotes, then you must escape the double quotes that are inside the policy:\\n\\n`\\"{\\\\\\"attribute\\\\\\": \\\\\\"value\\\\\\", \\\\\\"attribute\\\\\\": [\\\\\\"value\\\\\\"]}\\"`\\n\\nTo avoid escaping quotes, you can use single quotes to enclose the policy and double quotes to enclose the JSON names and values:\\n\\n`\'{\\"attribute\\": \\"value\\", \\"attribute\\": [\\"value\\"]}\'`","OutputDataConfig":"Provides output results configuration parameters for custom classifier jobs.","Tags":"Tags to associate with the document classifier. A tag is a key-value pair that adds as a metadata to a resource used by Amazon Comprehend. For example, a tag with \\"Sales\\" as the key might be added to a resource to indicate its use by the sales department.","VersionName":"The version name given to the newly created classifier. Version names can have a maximum of 256 characters. Alphanumeric characters, hyphens (-) and underscores (_) are allowed. The version name must be unique among all models with the same classifier name in the AWS account / AWS Region .","VolumeKmsKeyId":"ID for the AWS Key Management Service (KMS) key that Amazon Comprehend uses to encrypt data on the storage volume attached to the ML compute instance(s) that process the analysis job. The VolumeKmsKeyId can be either of the following formats:\\n\\n- KMS Key ID: `\\"1234abcd-12ab-34cd-56ef-1234567890ab\\"`\\n- Amazon Resource Name (ARN) of a KMS Key: `\\"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\\"`","VpcConfig":"Configuration parameters for a private Virtual Private Cloud (VPC) containing the resources you are using for your custom classifier. For more information, see [Amazon VPC](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) ."}},"AWS::Comprehend::DocumentClassifier.AugmentedManifestsListItem":{"attributes":{},"description":"An augmented manifest file that provides training data for your custom model. An augmented manifest file is a labeled dataset that is produced by Amazon SageMaker Ground Truth.","properties":{"AttributeNames":"The JSON attribute that contains the annotations for your training documents. The number of attribute names that you specify depends on whether your augmented manifest file is the output of a single labeling job or a chained labeling job.\\n\\nIf your file is the output of a single labeling job, specify the LabelAttributeName key that was used when the job was created in Ground Truth.\\n\\nIf your file is the output of a chained labeling job, specify the LabelAttributeName key for one or more jobs in the chain. Each LabelAttributeName key provides the annotations from an individual job.","S3Uri":"The Amazon S3 location of the augmented manifest file.","Split":"The purpose of the data you\'ve provided in the augmented manifest. You can either train or test this data. If you don\'t specify, the default is train.\\n\\nTRAIN - all of the documents in the manifest will be used for training. If no test documents are provided, Amazon Comprehend will automatically reserve a portion of the training documents for testing.\\n\\nTEST - all of the documents in the manifest will be used for testing."}},"AWS::Comprehend::DocumentClassifier.DocumentClassifierDocuments":{"attributes":{},"description":"The location of the training documents. This parameter is required in a request to create a semi-structured document classification model.","properties":{"S3Uri":"The S3 URI location of the training documents specified in the S3Uri CSV file.","TestS3Uri":"The S3 URI location of the test documents included in the TestS3Uri CSV file. This field is not required if you do not specify a test CSV file."}},"AWS::Comprehend::DocumentClassifier.DocumentClassifierInputDataConfig":{"attributes":{},"description":"The input properties for training a document classifier.\\n\\nFor more information on how the input file is formatted, see [Preparing training data](https://docs.aws.amazon.com/comprehend/latest/dg/prep-classifier-data.html) in the Comprehend Developer Guide.","properties":{"AugmentedManifests":"A list of augmented manifest files that provide training data for your custom model. An augmented manifest file is a labeled dataset that is produced by Amazon SageMaker Ground Truth.\\n\\nThis parameter is required if you set `DataFormat` to `AUGMENTED_MANIFEST` .","DataFormat":"The format of your training data:\\n\\n- `COMPREHEND_CSV` : A two-column CSV file, where labels are provided in the first column, and documents are provided in the second. If you use this value, you must provide the `S3Uri` parameter in your request.\\n- `AUGMENTED_MANIFEST` : A labeled dataset that is produced by Amazon SageMaker Ground Truth. This file is in JSON lines format. Each line is a complete JSON object that contains a training document and its associated labels.\\n\\nIf you use this value, you must provide the `AugmentedManifests` parameter in your request.\\n\\nIf you don\'t specify a value, Amazon Comprehend uses `COMPREHEND_CSV` as the default.","DocumentReaderConfig":"","DocumentType":"The type of input documents for training the model. Provide plain-text documents to create a plain-text model, and provide semi-structured documents to create a native document model.","Documents":"The S3 location of the training documents. This parameter is required in a request to create a native document model.","LabelDelimiter":"Indicates the delimiter used to separate each label for training a multi-label classifier. The default delimiter between labels is a pipe (|). You can use a different character as a delimiter (if it\'s an allowed character) by specifying it under Delimiter for labels. If the training documents use a delimiter other than the default or the delimiter you specify, the labels on that line will be combined to make a single unique label, such as LABELLABELLABEL.","S3Uri":"The Amazon S3 URI for the input data. The S3 bucket must be in the same Region as the API endpoint that you are calling. The URI can point to a single input file or it can provide the prefix for a collection of input files.\\n\\nFor example, if you use the URI `S3://bucketName/prefix` , if the prefix is a single file, Amazon Comprehend uses that file as input. If more than one file begins with the prefix, Amazon Comprehend uses all of them as input.\\n\\nThis parameter is required if you set `DataFormat` to `COMPREHEND_CSV` .","TestS3Uri":"This specifies the Amazon S3 location that contains the test annotations for the document classifier. The URI must be in the same AWS Region as the API endpoint that you are calling."}},"AWS::Comprehend::DocumentClassifier.DocumentClassifierOutputDataConfig":{"attributes":{},"description":"Provide the location for output data from a custom classifier job. This field is mandatory if you are training a native document model.","properties":{"KmsKeyId":"ID for the AWS Key Management Service (KMS) key that Amazon Comprehend uses to encrypt the output results from an analysis job. The KmsKeyId can be one of the following formats:\\n\\n- KMS Key ID: `\\"1234abcd-12ab-34cd-56ef-1234567890ab\\"`\\n- Amazon Resource Name (ARN) of a KMS Key: `\\"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\\"`\\n- KMS Key Alias: `\\"alias/ExampleAlias\\"`\\n- ARN of a KMS Key Alias: `\\"arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias\\"`","S3Uri":"When you use the `OutputDataConfig` object while creating a custom classifier, you specify the Amazon S3 location where you want to write the confusion matrix and other output files. The URI must be in the same Region as the API endpoint that you are calling. The location is used as the prefix for the actual location of this output file.\\n\\nWhen the custom classifier job is finished, the service creates the output file in a directory specific to the job. The `S3Uri` field contains the location of the output file, called `output.tar.gz` . It is a compressed archive that contains the confusion matrix."}},"AWS::Comprehend::DocumentClassifier.DocumentReaderConfig":{"attributes":{},"description":"Provides configuration parameters to override the default actions for extracting text from PDF documents and image files.\\n\\nBy default, Amazon Comprehend performs the following actions to extract text from files, based on the input file type:\\n\\n- *Word files* - Amazon Comprehend parser extracts the text.\\n- *Digital PDF files* - Amazon Comprehend parser extracts the text.\\n- *Image files and scanned PDF files* - Amazon Comprehend uses the Amazon Textract `DetectDocumentText` API to extract the text.\\n\\n`DocumentReaderConfig` does not apply to plain text files or Word files.\\n\\nFor image files and PDF documents, you can override these default actions using the fields listed below. For more information, see [Setting text extraction options](https://docs.aws.amazon.com/comprehend/latest/dg/idp-set-textract-options.html) in the Comprehend Developer Guide.","properties":{"DocumentReadAction":"This field defines the Amazon Textract API operation that Amazon Comprehend uses to extract text from PDF files and image files. Enter one of the following values:\\n\\n- `TEXTRACT_DETECT_DOCUMENT_TEXT` - The Amazon Comprehend service uses the `DetectDocumentText` API operation.\\n- `TEXTRACT_ANALYZE_DOCUMENT` - The Amazon Comprehend service uses the `AnalyzeDocument` API operation.","DocumentReadMode":"Determines the text extraction actions for PDF files. Enter one of the following values:\\n\\n- `SERVICE_DEFAULT` - use the Amazon Comprehend service defaults for PDF files.\\n- `FORCE_DOCUMENT_READ_ACTION` - Amazon Comprehend uses the Textract API specified by DocumentReadAction for all PDF files, including digital PDF files.","FeatureTypes":"Specifies the type of Amazon Textract features to apply. If you chose `TEXTRACT_ANALYZE_DOCUMENT` as the read action, you must specify one or both of the following values:\\n\\n- `TABLES` - Returns information about any tables that are detected in the input document.\\n- `FORMS` - Returns information and the data from any forms that are detected in the input document."}},"AWS::Comprehend::DocumentClassifier.VpcConfig":{"attributes":{},"description":"Configuration parameters for an optional private Virtual Private Cloud (VPC) containing the resources you are using for the job. For more information, see [Amazon VPC](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) .","properties":{"SecurityGroupIds":"The ID number for a security group on an instance of your private VPC. Security groups on your VPC function serve as a virtual firewall to control inbound and outbound traffic and provides security for the resources that you’ll be accessing on the VPC. This ID number is preceded by \\"sg-\\", for instance: \\"sg-03b388029b0a285ea\\". For more information, see [Security Groups for your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) .","Subnets":"The ID for each subnet being used in your private VPC. This subnet is a subset of the a range of IPv4 addresses used by the VPC and is specific to a given availability zone in the VPC’s Region. This ID number is preceded by \\"subnet-\\", for instance: \\"subnet-04ccf456919e69055\\". For more information, see [VPCs and Subnets](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html) ."}},"AWS::Comprehend::Flywheel":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the flywheel.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the flywheel."},"description":"A flywheel is an AWS resource that orchestrates the ongoing training of a model for custom classification or custom entity recognition. You can create a flywheel to start with an existing trained model, or Comprehend can create and train a new model.\\n\\nWhen you create the flywheel, Comprehend creates a data lake in your account. The data lake holds the training data and test data for all versions of the model.\\n\\nTo use a flywheel with an existing trained model, you specify the active model version. Comprehend copies the model\'s training data and test data into the flywheel\'s data lake.\\n\\nTo use the flywheel with a new model, you need to provide a dataset for training data (and optional test data) when you create the flywheel.\\n\\nFor more information about flywheels, see [Flywheel overview](https://docs.aws.amazon.com/comprehend/latest/dg/flywheels-about.html) in the *Amazon Comprehend Developer Guide* .","properties":{"ActiveModelArn":"The Amazon Resource Number (ARN) of the active model version.","DataAccessRoleArn":"The Amazon Resource Name (ARN) of the IAM role that grants Amazon Comprehend permission to access the flywheel data.","DataLakeS3Uri":"Amazon S3 URI of the data lake location.","DataSecurityConfig":"Data security configuration.","FlywheelName":"Name for the flywheel.","ModelType":"Model type of the flywheel\'s model.","Tags":"Tags associated with the endpoint being created. A tag is a key-value pair that adds metadata to the endpoint. For example, a tag with \\"Sales\\" as the key might be added to an endpoint to indicate its use by the sales department.","TaskConfig":"Configuration about the model associated with a flywheel."}},"AWS::Comprehend::Flywheel.DataSecurityConfig":{"attributes":{},"description":"Data security configuration.","properties":{"DataLakeKmsKeyId":"ID for the AWS KMS key that Amazon Comprehend uses to encrypt the data in the data lake.","ModelKmsKeyId":"ID for the AWS KMS key that Amazon Comprehend uses to encrypt trained custom models. The ModelKmsKeyId can be either of the following formats:\\n\\n- KMS Key ID: `\\"1234abcd-12ab-34cd-56ef-1234567890ab\\"`\\n- Amazon Resource Name (ARN) of a KMS Key: `\\"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\\"`","VolumeKmsKeyId":"ID for the AWS KMS key that Amazon Comprehend uses to encrypt the volume.","VpcConfig":"Configuration parameters for an optional private Virtual Private Cloud (VPC) containing the resources you are using for the job. For more information, see [Amazon VPC](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) ."}},"AWS::Comprehend::Flywheel.DocumentClassificationConfig":{"attributes":{},"description":"Configuration required for a document classification model.","properties":{"Labels":"One or more labels to associate with the custom classifier.","Mode":"Classification mode indicates whether the documents are `MULTI_CLASS` or `MULTI_LABEL` ."}},"AWS::Comprehend::Flywheel.EntityRecognitionConfig":{"attributes":{},"description":"Configuration required for an entity recognition model.","properties":{"EntityTypes":"Up to 25 entity types that the model is trained to recognize."}},"AWS::Comprehend::Flywheel.EntityTypesListItem":{"attributes":{},"description":"An entity type within a labeled training dataset that Amazon Comprehend uses to train a custom entity recognizer.","properties":{"Type":"An entity type within a labeled training dataset that Amazon Comprehend uses to train a custom entity recognizer.\\n\\nEntity types must not contain the following invalid characters: \\\\n (line break), \\\\\\\\n (escaped line break, \\\\r (carriage return), \\\\\\\\r (escaped carriage return), \\\\t (tab), \\\\\\\\t (escaped tab), space, and , (comma)."}},"AWS::Comprehend::Flywheel.TaskConfig":{"attributes":{},"description":"Configuration about the model associated with a flywheel.","properties":{"DocumentClassificationConfig":"Configuration required for a document classification model.","EntityRecognitionConfig":"Configuration required for an entity recognition model.","LanguageCode":"Language code for the language that the model supports."}},"AWS::Comprehend::Flywheel.VpcConfig":{"attributes":{},"description":"Configuration parameters for an optional private Virtual Private Cloud (VPC) containing the resources you are using for the job. For more information, see [Amazon VPC](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) .","properties":{"SecurityGroupIds":"The ID number for a security group on an instance of your private VPC. Security groups on your VPC function serve as a virtual firewall to control inbound and outbound traffic and provides security for the resources that you’ll be accessing on the VPC. This ID number is preceded by \\"sg-\\", for instance: \\"sg-03b388029b0a285ea\\". For more information, see [Security Groups for your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) .","Subnets":"The ID for each subnet being used in your private VPC. This subnet is a subset of the a range of IPv4 addresses used by the VPC and is specific to a given availability zone in the VPC’s Region. This ID number is preceded by \\"subnet-\\", for instance: \\"subnet-04ccf456919e69055\\". For more information, see [VPCs and Subnets](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html) ."}},"AWS::Config::AggregationAuthorization":{"attributes":{"AggregationAuthorizationArn":"The Amazon Resource Name (ARN) of the aggregation object.","Ref":"`Ref` returns the ARN of the AggregationAuthorization, such as `arn:aws:config:us-east-1:123456789012:aggregation-authorization/987654321012/us-west-2` ."},"description":"An object that represents the authorizations granted to aggregator accounts and regions.","properties":{"AuthorizedAccountId":"The 12-digit account ID of the account authorized to aggregate data.","AuthorizedAwsRegion":"The region authorized to collect aggregated data.","Tags":"An array of tag object."}},"AWS::Config::ConfigRule":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the AWS Config rule, such as `arn:aws:config:us-east-1:123456789012:config-rule/config-rule-a1bzhi` .","Compliance.Type":"The compliance status of an AWS Config rule, such as `COMPLIANT` or `NON_COMPLIANT` .","ConfigRuleId":"The ID of the AWS Config rule, such as `config-rule-a1bzhi` .","Ref":"`Ref` returns the rule name, such as `mystack-MyConfigRule-12ABCFPXHV4OV` ."},"description":"> You must first create and start the AWS Config configuration recorder in order to create AWS Config managed rules with AWS CloudFormation . For more information, see [Managing the Configuration Recorder](https://docs.aws.amazon.com/config/latest/developerguide/stop-start-recorder.html) . \\n\\nAdds or updates an AWS Config rule to evaluate if your AWS resources comply with your desired configurations. For information on how many AWS Config rules you can have per account, see [*Service Limits*](https://docs.aws.amazon.com/config/latest/developerguide/configlimits.html) in the *AWS Config Developer Guide* .\\n\\nThere are two types of rules: *AWS Config Managed Rules* and *AWS Config Custom Rules* . You can use the `ConfigRule` resource to create both AWS Config Managed Rules and AWS Config Custom Rules.\\n\\nAWS Config Managed Rules are predefined, customizable rules created by AWS Config . For a list of managed rules, see [List of AWS Config Managed Rules](https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html) . If you are adding an AWS Config managed rule, you must specify the rule\'s identifier for the `SourceIdentifier` key.\\n\\nAWS Config Custom Rules are rules that you create from scratch. There are two ways to create AWS Config custom rules: with Lambda functions ( [AWS Lambda Developer Guide](https://docs.aws.amazon.com/config/latest/developerguide/gettingstarted-concepts.html#gettingstarted-concepts-function) ) and with Guard ( [Guard GitHub Repository](https://docs.aws.amazon.com/https://github.com/aws-cloudformation/cloudformation-guard) ), a policy-as-code language. AWS Config custom rules created with AWS Lambda are called *AWS Config Custom Lambda Rules* and AWS Config custom rules created with Guard are called *AWS Config Custom Policy Rules* .\\n\\nIf you are adding a new AWS Config Custom Lambda rule, you first need to create an AWS Lambda function that the rule invokes to evaluate your resources. When you use the `ConfigRule` resource to add a Custom Lambda rule to AWS Config , you must specify the Amazon Resource Name (ARN) that AWS Lambda assigns to the function. You specify the ARN in the `SourceIdentifier` key. This key is part of the `Source` object, which is part of the `ConfigRule` object.\\n\\nFor any new AWS Config rule that you add, specify the `ConfigRuleName` in the `ConfigRule` object. Do not specify the `ConfigRuleArn` or the `ConfigRuleId` . These values are generated by AWS Config for new rules.\\n\\nIf you are updating a rule that you added previously, you can specify the rule by `ConfigRuleName` , `ConfigRuleId` , or `ConfigRuleArn` in the `ConfigRule` data type that you use in this request.\\n\\nFor more information about developing and using AWS Config rules, see [Evaluating Resources with AWS Config Rules](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html) in the *AWS Config Developer Guide* .","properties":{"ConfigRuleName":"A name for the AWS Config rule. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the rule name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .","Description":"The description that you provide for the AWS Config rule.","InputParameters":"A string, in JSON format, that is passed to the AWS Config rule Lambda function.","MaximumExecutionFrequency":"The maximum frequency with which AWS Config runs evaluations for a rule. You can specify a value for `MaximumExecutionFrequency` when:\\n\\n- You are using an AWS managed rule that is triggered at a periodic frequency.\\n- Your custom rule is triggered when AWS Config delivers the configuration snapshot. For more information, see [ConfigSnapshotDeliveryProperties](https://docs.aws.amazon.com/config/latest/APIReference/API_ConfigSnapshotDeliveryProperties.html) .\\n\\n> By default, rules with a periodic trigger are evaluated every 24 hours. To change the frequency, specify a valid value for the `MaximumExecutionFrequency` parameter.","Scope":"Defines which resources can trigger an evaluation for the rule. The scope can include one or more resource types, a combination of one resource type and one resource ID, or a combination of a tag key and value. Specify a scope to constrain the resources that can trigger an evaluation for the rule. If you do not specify a scope, evaluations are triggered when any resource in the recording group changes.\\n\\n> The scope can be empty.","Source":"Provides the rule owner ( `AWS` for managed rules, `CUSTOM_POLICY` for Custom Policy rules, and `CUSTOM_LAMBDA` for Custom Lambda rules), the rule identifier, and the notifications that cause the function to evaluate your AWS resources."}},"AWS::Config::ConfigRule.CustomPolicyDetails":{"attributes":{},"description":"Provides the runtime system, policy definition, and whether debug logging enabled. You can specify the following CustomPolicyDetails parameter values only for AWS Config Custom Policy rules.","properties":{"EnableDebugLogDelivery":"The boolean expression for enabling debug logging for your AWS Config Custom Policy rule. The default value is `false` .","PolicyRuntime":"The runtime system for your AWS Config Custom Policy rule. Guard is a policy-as-code language that allows you to write policies that are enforced by AWS Config Custom Policy rules. For more information about Guard, see the [Guard GitHub Repository](https://docs.aws.amazon.com/https://github.com/aws-cloudformation/cloudformation-guard) .","PolicyText":"The policy definition containing the logic for your AWS Config Custom Policy rule."}},"AWS::Config::ConfigRule.Scope":{"attributes":{},"description":"Defines which resources trigger an evaluation for an AWS Config rule. The scope can include one or more resource types, a combination of a tag key and value, or a combination of one resource type and one resource ID. Specify a scope to constrain which resources trigger an evaluation for a rule. Otherwise, evaluations for the rule are triggered when any resource in your recording group changes in configuration.","properties":{"ComplianceResourceId":"The ID of the only AWS resource that you want to trigger an evaluation for the rule. If you specify a resource ID, you must specify one resource type for `ComplianceResourceTypes` .","ComplianceResourceTypes":"The resource types of only those AWS resources that you want to trigger an evaluation for the rule. You can only specify one type if you also specify a resource ID for `ComplianceResourceId` .","TagKey":"The tag key that is applied to only those AWS resources that you want to trigger an evaluation for the rule.","TagValue":"The tag value applied to only those AWS resources that you want to trigger an evaluation for the rule. If you specify a value for `TagValue` , you must also specify a value for `TagKey` ."}},"AWS::Config::ConfigRule.Source":{"attributes":{},"description":"Provides the CustomPolicyDetails, the rule owner ( `AWS` for managed rules, `CUSTOM_POLICY` for Custom Policy rules, and `CUSTOM_LAMBDA` for Custom Lambda rules), the rule identifier, and the events that cause the evaluation of your AWS resources.","properties":{"CustomPolicyDetails":"Provides the runtime system, policy definition, and whether debug logging is enabled. Required when owner is set to `CUSTOM_POLICY` .","Owner":"Indicates whether AWS or the customer owns and manages the AWS Config rule.\\n\\nAWS Config Managed Rules are predefined rules owned by AWS . For more information, see [AWS Config Managed Rules](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_use-managed-rules.html) in the *AWS Config developer guide* .\\n\\nAWS Config Custom Rules are rules that you can develop either with Guard ( `CUSTOM_POLICY` ) or AWS Lambda ( `CUSTOM_LAMBDA` ). For more information, see [AWS Config Custom Rules](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_develop-rules.html) in the *AWS Config developer guide* .","SourceDetails":"Provides the source and the message types that cause AWS Config to evaluate your AWS resources against a rule. It also provides the frequency with which you want AWS Config to run evaluations for the rule if the trigger type is periodic.\\n\\nIf the owner is set to `CUSTOM_POLICY` , the only acceptable values for the AWS Config rule trigger message type are `ConfigurationItemChangeNotification` and `OversizedConfigurationItemChangeNotification` .","SourceIdentifier":"For AWS Config Managed rules, a predefined identifier from a list. For example, `IAM_PASSWORD_POLICY` is a managed rule. To reference a managed rule, see [List of AWS Config Managed Rules](https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html) .\\n\\nFor AWS Config Custom Lambda rules, the identifier is the Amazon Resource Name (ARN) of the rule\'s AWS Lambda function, such as `arn:aws:lambda:us-east-2:123456789012:function:custom_rule_name` .\\n\\nFor AWS Config Custom Policy rules, this field will be ignored."}},"AWS::Config::ConfigRule.SourceDetail":{"attributes":{},"description":"Provides the source and the message types that trigger AWS Config to evaluate your AWS resources against a rule. It also provides the frequency with which you want AWS Config to run evaluations for the rule if the trigger type is periodic. You can specify the parameter values for `SourceDetail` only for custom rules.","properties":{"EventSource":"The source of the event, such as an AWS service, that triggers AWS Config to evaluate your AWS resources.","MaximumExecutionFrequency":"The frequency at which you want AWS Config to run evaluations for a custom rule with a periodic trigger. If you specify a value for `MaximumExecutionFrequency` , then `MessageType` must use the `ScheduledNotification` value.\\n\\n> By default, rules with a periodic trigger are evaluated every 24 hours. To change the frequency, specify a valid value for the `MaximumExecutionFrequency` parameter.\\n> \\n> Based on the valid value you choose, AWS Config runs evaluations once for each valid value. For example, if you choose `Three_Hours` , AWS Config runs evaluations once every three hours. In this case, `Three_Hours` is the frequency of this rule.","MessageType":"The type of notification that triggers AWS Config to run an evaluation for a rule. You can specify the following notification types:\\n\\n- `ConfigurationItemChangeNotification` - Triggers an evaluation when AWS Config delivers a configuration item as a result of a resource change.\\n- `OversizedConfigurationItemChangeNotification` - Triggers an evaluation when AWS Config delivers an oversized configuration item. AWS Config may generate this notification type when a resource changes and the notification exceeds the maximum size allowed by Amazon SNS.\\n- `ScheduledNotification` - Triggers a periodic evaluation at the frequency specified for `MaximumExecutionFrequency` .\\n- `ConfigurationSnapshotDeliveryCompleted` - Triggers a periodic evaluation when AWS Config delivers a configuration snapshot.\\n\\nIf you want your custom rule to be triggered by configuration changes, specify two SourceDetail objects, one for `ConfigurationItemChangeNotification` and one for `OversizedConfigurationItemChangeNotification` ."}},"AWS::Config::ConfigurationAggregator":{"attributes":{"ConfigurationAggregatorArn":"The Amazon Resource Name (ARN) of the aggregator.","Ref":"`Ref` returns the ConfigurationAggregatorName, such as `myConfigurationAggregator` ."},"description":"The details about the configuration aggregator, including information about source accounts, regions, and metadata of the aggregator.","properties":{"AccountAggregationSources":"Provides a list of source accounts and regions to be aggregated.","ConfigurationAggregatorName":"The name of the aggregator.","OrganizationAggregationSource":"Provides an organization and list of regions to be aggregated.","Tags":"An array of tag object."}},"AWS::Config::ConfigurationAggregator.AccountAggregationSource":{"attributes":{},"description":"A collection of accounts and regions.","properties":{"AccountIds":"The 12-digit account ID of the account being aggregated.","AllAwsRegions":"If true, aggregate existing AWS Config regions and future regions.","AwsRegions":"The source regions being aggregated."}},"AWS::Config::ConfigurationAggregator.OrganizationAggregationSource":{"attributes":{},"description":"This object contains regions to set up the aggregator and an IAM role to retrieve organization details.","properties":{"AllAwsRegions":"If true, aggregate existing AWS Config regions and future regions.","AwsRegions":"The source regions being aggregated.","RoleArn":"ARN of the IAM role used to retrieve AWS Organizations details associated with the aggregator account."}},"AWS::Config::ConfigurationRecorder":{"attributes":{"Ref":"`Ref` returns the configuration recorder name, such as default."},"description":"The AWS::Config::ConfigurationRecorder resource describes the AWS resource types for which AWS Config records configuration changes. The configuration recorder stores the configurations of the supported resources in your account as configuration items.\\n\\n> To enable AWS Config , you must create a configuration recorder and a delivery channel. AWS Config uses the delivery channel to deliver the configuration changes to your Amazon S3 bucket or Amazon SNS topic. For more information, see [AWS::Config::DeliveryChannel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-deliverychannel.html) . \\n\\nAWS CloudFormation starts the recorder as soon as the delivery channel is available.\\n\\nTo stop the recorder and delete it, delete the configuration recorder from your stack. To stop the recorder without deleting it, call the [StopConfigurationRecorder](https://docs.aws.amazon.com/config/latest/APIReference/API_StopConfigurationRecorder.html) action of the AWS Config API directly.\\n\\nFor more information, see [Configuration Recorder](https://docs.aws.amazon.com/config/latest/developerguide/config-concepts.html#config-recorder) in the AWS Config Developer Guide.","properties":{"Name":"A name for the configuration recorder. If you don\'t specify a name, AWS CloudFormation CloudFormation generates a unique physical ID and uses that ID for the configuration recorder name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> After you create a configuration recorder, you cannot rename it. If you don\'t want a name that AWS CloudFormation generates, specify a value for this property. \\n\\nUpdates are not supported.","RecordingGroup":"Indicates whether to record configurations for all supported resources or for a list of resource types. The resource types that you list must be supported by AWS Config .","RoleARN":"The Amazon Resource Name (ARN) of the IAM (IAM) role that is used to make read or write requests to the delivery channel that you specify and to get configuration details for supported AWS resources. For more information, see [Permissions for the IAM Role Assigned](https://docs.aws.amazon.com/config/latest/developerguide/iamrole-permissions.html) to AWS Config in the AWS Config Developer Guide."}},"AWS::Config::ConfigurationRecorder.RecordingGroup":{"attributes":{},"description":"Specifies which resource types AWS Config records for configuration changes. In the recording group, you specify whether you want to record all supported resource types or to include or exclude specific types of resources.\\n\\nBy default, AWS Config records configuration changes for all supported types of *Regional resources* that AWS Config discovers in the AWS Region in which it is running. Regional resources are tied to a Region and can be used only in that Region. Examples of Regional resources are Amazon EC2 instances and Amazon EBS volumes.\\n\\nYou can also have AWS Config record supported types of *globally recorded resources* . Globally recorded resource types are not tied to a specific Region and can be used in all Regions. The globally recorded resource types that AWS Config supports are IAM users, groups, roles, and customer managed policies. These resource types are recorded in all enabled AWS Config regions where AWS Config was available before February 2022 (which excludes Asia Pacific (Hyderabad), Asia Pacific (Melbourne), Europe (Spain), Europe (Zurich), Israel (Tel Aviv), and Middle East (UAE)). AWS Config also supports some global resources types for Amazon Elastic Container Registry Public, AWS Global Accelerator , and Amazon Route 53; however, these resource types are not globally recorded in all enabled AWS Config regions.\\n\\n> Global resource types onboarded to AWS Config recording after February 2022 will be recorded only in the service\'s home Region for the commercial partition and AWS GovCloud (US-West) for the AWS GovCloud (US) partition. You can view the Configuration Items for these new global resource types only in their home Region and AWS GovCloud (US-West). \\n\\nIf you don\'t want AWS Config to record all resources, you can specify which types of resources AWS Config records with the `resourceTypes` parameter.\\n\\nFor a list of supported resource types, see [Supported Resource Types](https://docs.aws.amazon.com/config/latest/developerguide/resource-config-reference.html#supported-resources) in the *AWS Config developer guide* .\\n\\nFor more information and a table of the Home Regions for Global Resource Types Onboarded after February 2022, see [Selecting Which Resources AWS Config Records](https://docs.aws.amazon.com/config/latest/developerguide/select-resources.html) in the *AWS Config developer guide* .","properties":{"AllSupported":"Specifies whether AWS Config records configuration changes for all supported regional resource types.\\n\\nIf you set this field to `true` , when AWS Config adds support for a new type of regional resource, AWS Config starts recording resources of that type automatically.\\n\\nIf you set this field to `true` , you cannot enumerate specific resource types to record in the `resourceTypes` field of [RecordingGroup](https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html) , or to exclude in the `resourceTypes` field of [ExclusionByResourceTypes](https://docs.aws.amazon.com/config/latest/APIReference/API_ExclusionByResourceTypes.html) .","IncludeGlobalResourceTypes":"Specifies whether AWS Config includes all supported types of global resources (for example, IAM resources) with the resources that it records.\\n\\nBefore you can set this option to `true` , you must set the `AllSupported` option to `true` .\\n\\nIf you set this option to `true` , when AWS Config adds support for a new type of global resource, it starts recording resources of that type automatically.\\n\\nThe configuration details for any global resource are the same in all regions. To prevent duplicate configuration items, you should consider customizing AWS Config in only one region to record global resources.","ResourceTypes":"A comma-separated list that specifies the types of AWS resources for which AWS Config records configuration changes (for example, `AWS::EC2::Instance` or `AWS::CloudTrail::Trail` ).\\n\\nTo record all configuration changes, you must set the `AllSupported` option to `false` .\\n\\nIf you set the `AllSupported` option to false and populate the `ResourceTypes` option with values, when AWS Config adds support for a new type of resource, it will not record resources of that type unless you manually add that type to your recording group.\\n\\nFor a list of valid `resourceTypes` values, see the *resourceType Value* column in [Supported AWS Resource Types](https://docs.aws.amazon.com/config/latest/developerguide/resource-config-reference.html#supported-resources) ."}},"AWS::Config::ConformancePack":{"attributes":{"Ref":"`Ref` returns the name of the conformance pack."},"description":"A conformance pack is a collection of AWS Config rules and remediation actions that can be easily deployed in an account and a region. ConformancePack creates a service linked role in your account. The service linked role is created only when the role does not exist in your account.","properties":{"ConformancePackInputParameters":"A list of ConformancePackInputParameter objects.","ConformancePackName":"Name of the conformance pack you want to create.","DeliveryS3Bucket":"The name of the Amazon S3 bucket where AWS Config stores conformance pack templates.","DeliveryS3KeyPrefix":"The prefix for the Amazon S3 bucket.","TemplateBody":"A string containing full conformance pack template body. Structure containing the template body with a minimum length of 1 byte and a maximum length of 51,200 bytes.\\n\\n> You can only use a YAML template with two resource types: config rule ( `AWS::Config::ConfigRule` ) and a remediation action ( `AWS::Config::RemediationConfiguration` ).","TemplateS3Uri":"Location of file containing the template body (s3://bucketname/prefix). The uri must point to the conformance pack template (max size: 300 KB) that is located in an Amazon S3 bucket.\\n\\n> You must have access to read Amazon S3 bucket.","TemplateSSMDocumentDetails":""}},"AWS::Config::ConformancePack.ConformancePackInputParameter":{"attributes":{},"description":"Input parameters in the form of key-value pairs for the conformance pack, both of which you define. Keys can have a maximum character length of 255 characters, and values can have a maximum length of 4096 characters.","properties":{"ParameterName":"One part of a key-value pair.","ParameterValue":"Another part of the key-value pair."}},"AWS::Config::ConformancePack.TemplateSSMDocumentDetails":{"attributes":{},"description":"This API allows you to create a conformance pack template with an AWS Systems Manager document (SSM document). To deploy a conformance pack using an SSM document, first create an SSM document with conformance pack content, and then provide the `DocumentName` in the [PutConformancePack API](https://docs.aws.amazon.com/config/latest/APIReference/API_PutConformancePack.html) . You can also provide the `DocumentVersion` .\\n\\nThe `TemplateSSMDocumentDetails` object contains the name of the SSM document and the version of the SSM document.","properties":{"DocumentName":"The name or Amazon Resource Name (ARN) of the SSM document to use to create a conformance pack. If you use the document name, AWS Config checks only your account and AWS Region for the SSM document. If you want to use an SSM document from another Region or account, you must provide the ARN.","DocumentVersion":"The version of the SSM document to use to create a conformance pack. By default, AWS Config uses the latest version.\\n\\n> This field is optional."}},"AWS::Config::DeliveryChannel":{"attributes":{"Ref":"`Ref` returns the delivery channel name, such as default."},"description":"Specifies a delivery channel object to deliver configuration information to an Amazon S3 bucket and Amazon SNS topic.\\n\\nBefore you can create a delivery channel, you must create a configuration recorder. You can use this action to change the Amazon S3 bucket or an Amazon SNS topic of the existing delivery channel. To change the Amazon S3 bucket or an Amazon SNS topic, call this action and specify the changed values for the S3 bucket and the SNS topic. If you specify a different value for either the S3 bucket or the SNS topic, this action will keep the existing value for the parameter that is not changed.\\n\\n> In the China (Beijing) Region, when you call this action, the Amazon S3 bucket must also be in the China (Beijing) Region. In all the other regions, AWS Config supports cross-region and cross-account delivery channels. \\n\\nYou can have only one delivery channel per region per AWS account, and the delivery channel is required to use AWS Config .\\n\\n> AWS Config does not support the delivery channel to an Amazon S3 bucket bucket where object lock is enabled. For more information, see [How S3 Object Lock works](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-overview.html) . \\n\\nWhen you create the delivery channel, you can specify; how often AWS Config delivers configuration snapshots to your Amazon S3 bucket (for example, 24 hours), the S3 bucket to which AWS Config sends configuration snapshots and configuration history files, and the Amazon SNS topic to which AWS Config sends notifications about configuration changes, such as updated resources, AWS Config rule evaluations, and when AWS Config delivers the configuration snapshot to your S3 bucket. For more information, see [Deliver Configuration Items](https://docs.aws.amazon.com/config/latest/developerguide/how-does-config-work.html#delivery-channel) in the AWS Config Developer Guide.\\n\\n> To enable AWS Config , you must create a configuration recorder and a delivery channel. If you want to create the resources separately, you must create a configuration recorder before you can create a delivery channel. AWS Config uses the configuration recorder to capture configuration changes to your resources. For more information, see [AWS::Config::ConfigurationRecorder](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configurationrecorder.html) . \\n\\nFor more information, see [Managing the Delivery Channel](https://docs.aws.amazon.com/config/latest/developerguide/manage-delivery-channel.html) in the AWS Config Developer Guide.","properties":{"ConfigSnapshotDeliveryProperties":"The options for how often AWS Config delivers configuration snapshots to the Amazon S3 bucket.","Name":"A name for the delivery channel. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the delivery channel name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\nUpdates are not supported. To change the name, you must run two separate updates. In the first update, delete this resource, and then recreate it with a new name in the second update.","S3BucketName":"The name of the Amazon S3 bucket to which AWS Config delivers configuration snapshots and configuration history files.\\n\\nIf you specify a bucket that belongs to another AWS account , that bucket must have policies that grant access permissions to AWS Config . For more information, see [Permissions for the Amazon S3 Bucket](https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-policy.html) in the *AWS Config Developer Guide* .","S3KeyPrefix":"The prefix for the specified Amazon S3 bucket.","S3KmsKeyArn":"The Amazon Resource Name (ARN) of the AWS Key Management Service ( AWS KMS ) AWS KMS key (KMS key) used to encrypt objects delivered by AWS Config . Must belong to the same Region as the destination S3 bucket.","SnsTopicARN":"The Amazon Resource Name (ARN) of the Amazon SNS topic to which AWS Config sends notifications about configuration changes.\\n\\nIf you choose a topic from another account, the topic must have policies that grant access permissions to AWS Config . For more information, see [Permissions for the Amazon SNS Topic](https://docs.aws.amazon.com/config/latest/developerguide/sns-topic-policy.html) in the *AWS Config Developer Guide* ."}},"AWS::Config::DeliveryChannel.ConfigSnapshotDeliveryProperties":{"attributes":{},"description":"Provides options for how often AWS Config delivers configuration snapshots to the Amazon S3 bucket in your delivery channel.\\n\\n> If you want to create a rule that triggers evaluations for your resources when AWS Config delivers the configuration snapshot, see the following: \\n\\nThe frequency for a rule that triggers evaluations for your resources when AWS Config delivers the configuration snapshot is set by one of two values, depending on which is less frequent:\\n\\n- The value for the `deliveryFrequency` parameter within the delivery channel configuration, which sets how often AWS Config delivers configuration snapshots. This value also sets how often AWS Config invokes evaluations for AWS Config rules.\\n- The value for the `MaximumExecutionFrequency` parameter, which sets the maximum frequency with which AWS Config invokes evaluations for the rule. For more information, see [ConfigRule](https://docs.aws.amazon.com/config/latest/APIReference/API_ConfigRule.html) .\\n\\nIf the `deliveryFrequency` value is less frequent than the `MaximumExecutionFrequency` value for a rule, AWS Config invokes the rule only as often as the `deliveryFrequency` value.\\n\\n- For example, you want your rule to run evaluations when AWS Config delivers the configuration snapshot.\\n- You specify the `MaximumExecutionFrequency` value for `Six_Hours` .\\n- You then specify the delivery channel `deliveryFrequency` value for `TwentyFour_Hours` .\\n- Because the value for `deliveryFrequency` is less frequent than `MaximumExecutionFrequency` , AWS Config invokes evaluations for the rule every 24 hours.\\n\\nYou should set the `MaximumExecutionFrequency` value to be at least as frequent as the `deliveryFrequency` value. You can view the `deliveryFrequency` value by using the `DescribeDeliveryChannnels` action.\\n\\nTo update the `deliveryFrequency` with which AWS Config delivers your configuration snapshots, use the `PutDeliveryChannel` action.","properties":{"DeliveryFrequency":"The frequency with which AWS Config delivers configuration snapshots."}},"AWS::Config::OrganizationConfigRule":{"attributes":{"Ref":"`Ref` returns the OrganizationConfigRuleName."},"description":"Adds or updates an AWS Config rule for your entire organization to evaluate if your AWS resources comply with your desired configurations. For information on how many organization AWS Config rules you can have per account, see [*Service Limits*](https://docs.aws.amazon.com/config/latest/developerguide/configlimits.html) in the *AWS Config Developer Guide* .\\n\\nOnly a management account and a delegated administrator can create or update an organization AWS Config rule. When calling the `OrganizationConfigRule` resource with a delegated administrator, you must ensure AWS Organizations `ListDelegatedAdministrator` permissions are added. An organization can have up to 3 delegated administrators.\\n\\nThe `OrganizationConfigRule` resource enables organization service access through the `EnableAWSServiceAccess` action and creates a service-linked role `AWSServiceRoleForConfigMultiAccountSetup` in the management or delegated administrator account of your organization. The service-linked role is created only when the role does not exist in the caller account. AWS Config verifies the existence of role with `GetRole` action.\\n\\nTo use the `OrganizationConfigRule` resource with delegated administrator, register a delegated administrator by calling AWS Organization `register-delegated-administrator` for `config-multiaccountsetup.amazonaws.com` .\\n\\nThere are two types of rules: *AWS Config Managed Rules* and *AWS Config Custom Rules* . You can use `PutOrganizationConfigRule` to create both AWS Config Managed Rules and AWS Config Custom Rules.\\n\\nAWS Config Managed Rules are predefined, customizable rules created by AWS Config . For a list of managed rules, see [List of AWS Config Managed Rules](https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html) . If you are adding an AWS Config managed rule, you must specify the rule\'s identifier for the `RuleIdentifier` key.\\n\\nAWS Config Custom Rules are rules that you create from scratch. There are two ways to create AWS Config custom rules: with Lambda functions ( [AWS Lambda Developer Guide](https://docs.aws.amazon.com/config/latest/developerguide/gettingstarted-concepts.html#gettingstarted-concepts-function) ) and with Guard ( [Guard GitHub Repository](https://docs.aws.amazon.com/https://github.com/aws-cloudformation/cloudformation-guard) ), a policy-as-code language. AWS Config custom rules created with AWS Lambda are called *AWS Config Custom Lambda Rules* and AWS Config custom rules created with Guard are called *AWS Config Custom Policy Rules* .\\n\\nIf you are adding a new AWS Config Custom Lambda rule, you first need to create an AWS Lambda function in the management account or a delegated administrator that the rule invokes to evaluate your resources. You also need to create an IAM role in the managed account that can be assumed by the Lambda function. When you use `PutOrganizationConfigRule` to add a Custom Lambda rule to AWS Config , you must specify the Amazon Resource Name (ARN) that AWS Lambda assigns to the function.","properties":{"ExcludedAccounts":"A comma-separated list of accounts excluded from organization AWS Config rule.","OrganizationConfigRuleName":"The name that you assign to organization AWS Config rule.","OrganizationCustomPolicyRuleMetadata":"","OrganizationCustomRuleMetadata":"An `OrganizationCustomRuleMetadata` object.","OrganizationManagedRuleMetadata":"An `OrganizationManagedRuleMetadata` object."}},"AWS::Config::OrganizationConfigRule.OrganizationCustomPolicyRuleMetadata":{"attributes":{},"description":"","properties":{"DebugLogDeliveryAccounts":"","Description":"","InputParameters":"","MaximumExecutionFrequency":"","OrganizationConfigRuleTriggerTypes":"","PolicyText":"","ResourceIdScope":"","ResourceTypesScope":"","Runtime":"","TagKeyScope":"","TagValueScope":""}},"AWS::Config::OrganizationConfigRule.OrganizationCustomRuleMetadata":{"attributes":{},"description":"organization custom rule metadata such as resource type, resource ID of AWS resource, Lambda function ARN, and organization trigger types that trigger AWS Config to evaluate your AWS resources against a rule. It also provides the frequency with which you want AWS Config to run evaluations for the rule if the trigger type is periodic.","properties":{"Description":"The description that you provide for your organization AWS Config rule.","InputParameters":"A string, in JSON format, that is passed to your organization AWS Config rule Lambda function.","LambdaFunctionArn":"The lambda function ARN.","MaximumExecutionFrequency":"The maximum frequency with which AWS Config runs evaluations for a rule. Your custom rule is triggered when AWS Config delivers the configuration snapshot. For more information, see `ConfigSnapshotDeliveryProperties` .\\n\\n> By default, rules with a periodic trigger are evaluated every 24 hours. To change the frequency, specify a valid value for the `MaximumExecutionFrequency` parameter.","OrganizationConfigRuleTriggerTypes":"The type of notification that triggers AWS Config to run an evaluation for a rule. You can specify the following notification types:\\n\\n- `ConfigurationItemChangeNotification` - Triggers an evaluation when AWS Config delivers a configuration item as a result of a resource change.\\n- `OversizedConfigurationItemChangeNotification` - Triggers an evaluation when AWS Config delivers an oversized configuration item. AWS Config may generate this notification type when a resource changes and the notification exceeds the maximum size allowed by Amazon SNS.\\n- `ScheduledNotification` - Triggers a periodic evaluation at the frequency specified for `MaximumExecutionFrequency` .","ResourceIdScope":"The ID of the AWS resource that was evaluated.","ResourceTypesScope":"The type of the AWS resource that was evaluated.","TagKeyScope":"One part of a key-value pair that make up a tag. A key is a general label that acts like a category for more specific tag values.","TagValueScope":"The optional part of a key-value pair that make up a tag. A value acts as a descriptor within a tag category (key)."}},"AWS::Config::OrganizationConfigRule.OrganizationManagedRuleMetadata":{"attributes":{},"description":"organization managed rule metadata such as resource type and ID of AWS resource along with the rule identifier. It also provides the frequency with which you want AWS Config to run evaluations for the rule if the trigger type is periodic.","properties":{"Description":"The description that you provide for your organization AWS Config rule.","InputParameters":"A string, in JSON format, that is passed to your organization AWS Config rule Lambda function.","MaximumExecutionFrequency":"The maximum frequency with which AWS Config runs evaluations for a rule. This is for an AWS Config managed rule that is triggered at a periodic frequency.\\n\\n> By default, rules with a periodic trigger are evaluated every 24 hours. To change the frequency, specify a valid value for the `MaximumExecutionFrequency` parameter.","ResourceIdScope":"The ID of the AWS resource that was evaluated.","ResourceTypesScope":"The type of the AWS resource that was evaluated.","RuleIdentifier":"For organization config managed rules, a predefined identifier from a list. For example, `IAM_PASSWORD_POLICY` is a managed rule. To reference a managed rule, see [Using AWS Config managed rules](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_use-managed-rules.html) .","TagKeyScope":"One part of a key-value pair that make up a tag. A key is a general label that acts like a category for more specific tag values.","TagValueScope":"The optional part of a key-value pair that make up a tag. A value acts as a descriptor within a tag category (key)."}},"AWS::Config::OrganizationConformancePack":{"attributes":{"Ref":"`Ref` returns the name of organization conformance pack."},"description":"OrganizationConformancePack deploys conformance packs across member accounts in an AWS Organizations . OrganizationConformancePack enables organization service access for `config-multiaccountsetup.amazonaws.com` through the `EnableAWSServiceAccess` action and creates a service linked role in the master account of your organization. The service linked role is created only when the role does not exist in the master account.","properties":{"ConformancePackInputParameters":"A list of `ConformancePackInputParameter` objects.","DeliveryS3Bucket":"The name of the Amazon S3 bucket where AWS Config stores conformance pack templates.\\n\\n> This field is optional.","DeliveryS3KeyPrefix":"Any folder structure you want to add to an Amazon S3 bucket.\\n\\n> This field is optional.","ExcludedAccounts":"A comma-separated list of accounts excluded from organization conformance pack.","OrganizationConformancePackName":"The name you assign to an organization conformance pack.","TemplateBody":"A string containing full conformance pack template body. Structure containing the template body with a minimum length of 1 byte and a maximum length of 51,200 bytes.","TemplateS3Uri":"Location of file containing the template body. The uri must point to the conformance pack template (max size: 300 KB)."}},"AWS::Config::OrganizationConformancePack.ConformancePackInputParameter":{"attributes":{},"description":"Input parameters in the form of key-value pairs for the conformance pack, both of which you define. Keys can have a maximum character length of 255 characters, and values can have a maximum length of 4096 characters.","properties":{"ParameterName":"One part of a key-value pair.","ParameterValue":"One part of a key-value pair."}},"AWS::Config::RemediationConfiguration":{"attributes":{"Ref":"`Ref` returns the remediation action with the associated SSM document."},"description":"An object that represents the details about the remediation configuration that includes the remediation action, parameters, and data to execute the action.","properties":{"Automatic":"The remediation is triggered automatically.","ConfigRuleName":"The name of the AWS Config rule.","ExecutionControls":"An ExecutionControls object.","MaximumAutomaticAttempts":"The maximum number of failed attempts for auto-remediation. If you do not select a number, the default is 5.\\n\\nFor example, if you specify MaximumAutomaticAttempts as 5 with RetryAttemptSeconds as 50 seconds, AWS Config will put a RemediationException on your behalf for the failing resource after the 5th failed attempt within 50 seconds.","Parameters":"An object of the RemediationParameterValue. For more information, see [RemediationParameterValue](https://docs.aws.amazon.com/config/latest/APIReference/API_RemediationParameterValue.html) .\\n\\n> The type is a map of strings to RemediationParameterValue.","ResourceType":"The type of a resource.","RetryAttemptSeconds":"Maximum time in seconds that AWS Config runs auto-remediation. If you do not select a number, the default is 60 seconds.\\n\\nFor example, if you specify RetryAttemptSeconds as 50 seconds and MaximumAutomaticAttempts as 5, AWS Config will run auto-remediations 5 times within 50 seconds before throwing an exception.","TargetId":"Target ID is the name of the SSM document.","TargetType":"The type of the target. Target executes remediation. For example, SSM document.","TargetVersion":"Version of the target. For example, version of the SSM document.\\n\\n> If you make backward incompatible changes to the SSM document, you must call PutRemediationConfiguration API again to ensure the remediations can run."}},"AWS::Config::RemediationConfiguration.ExecutionControls":{"attributes":{},"description":"An ExecutionControls object.","properties":{"SsmControls":"A SsmControls object."}},"AWS::Config::RemediationConfiguration.RemediationParameterValue":{"attributes":{},"description":"The value is either a dynamic (resource) value or a static value. You must select either a dynamic value or a static value.","properties":{"ResourceValue":"The value is dynamic and changes at run-time.","StaticValue":"The value is static and does not change at run-time."}},"AWS::Config::RemediationConfiguration.ResourceValue":{"attributes":{},"description":"The dynamic value of the resource.","properties":{"Value":"The value is a resource ID."}},"AWS::Config::RemediationConfiguration.SsmControls":{"attributes":{},"description":"AWS Systems Manager (SSM) specific remediation controls.","properties":{"ConcurrentExecutionRatePercentage":"The maximum percentage of remediation actions allowed to run in parallel on the non-compliant resources for that specific rule. You can specify a percentage, such as 10%. The default value is 10.","ErrorPercentage":"The percentage of errors that are allowed before SSM stops running automations on non-compliant resources for that specific rule. You can specify a percentage of errors, for example 10%. If you do not specifiy a percentage, the default is 50%. For example, if you set the ErrorPercentage to 40% for 10 non-compliant resources, then SSM stops running the automations when the fifth error is received."}},"AWS::Config::RemediationConfiguration.StaticValue":{"attributes":{},"description":"The static value of the resource.","properties":{"Values":"A list of values. For example, the ARN of the assumed role."}},"AWS::Config::StoredQuery":{"attributes":{"QueryArn":"Amazon Resource Name (ARN) of the query. For example, arn:partition:service:region:account-id:resource-type/resource-name/resource-id.","QueryId":"The ID of the query.","Ref":""},"description":"Provides the details of a stored query.","properties":{"QueryDescription":"A unique description for the query.","QueryExpression":"The expression of the query. For example, `SELECT resourceId, resourceType, supplementaryConfiguration.BucketVersioningConfiguration.status WHERE resourceType = \'AWS::S3::Bucket\' AND supplementaryConfiguration.BucketVersioningConfiguration.status = \'Off\'.`","QueryName":"The name of the query.","Tags":"An array of key-value pairs to apply to this resource."}},"AWS::Connect::ApprovedOrigin":{"attributes":{"Ref":""},"description":"The approved origin for the instance.","properties":{"InstanceId":"The Amazon Resource Name (ARN) of the instance.\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `100`","Origin":"Domain name to be added to the allow-list of the instance.\\n\\n*Maximum* : `267`"}},"AWS::Connect::ContactFlow":{"attributes":{"ContactFlowArn":"`Ref` returns the Amazon Resource Name (ARN) of the flow. For example:\\n\\n`{ \\"Ref\\": \\"myFlowArn\\" }`","Ref":"`Ref` returns the flow name. For example:\\n\\n`{ \\"Ref\\": \\"myFlowName\\" }`"},"description":"Specifies a flow for an Amazon Connect instance.","properties":{"Content":"The content of the flow.\\n\\nFor more information, see [Amazon Connect Flow language](https://docs.aws.amazon.com/connect/latest/adminguide/flow-language.html) in the *Amazon Connect Administrator Guide* .","Description":"The description of the flow.","InstanceArn":"The Amazon Resource Name (ARN) of the Amazon Connect instance.","Name":"The name of the flow.","State":"The state of the flow.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","Type":"The type of the flow. For descriptions of the available types, see [Choose a flow type](https://docs.aws.amazon.com/connect/latest/adminguide/create-contact-flow.html#contact-flow-types) in the *Amazon Connect Administrator Guide* ."}},"AWS::Connect::ContactFlowModule":{"attributes":{"ContactFlowModuleArn":"`Ref` returns the Amazon Resource Name (ARN) of the flow module. For example:\\n\\n`{ \\"Ref\\": \\"myFlowModuleArn\\" }`","Ref":"`Ref` returns the name of the flow module. For example:\\n\\n`{ \\"Ref\\": \\"myFlowModuleName\\" }`","Status":""},"description":"Specifies a flow module for an Amazon Connect instance.","properties":{"Content":"The content of the flow module.","Description":"The description of the flow module.","InstanceArn":"The Amazon Resource Name (ARN) of the Amazon Connect instance.","Name":"The name of the flow module.","State":"The state of the flow module.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::Connect::EvaluationForm":{"attributes":{"EvaluationFormArn":"The Amazon Resource Name (ARN) of the evaluation form.","Ref":"`Ref` returns the evaluation form name. For example:\\n\\n`{ \\"Ref\\": \\"myEvaluationFormName\\" }`"},"description":"Creates an evaluation form for the specified Amazon Connect instance.","properties":{"Description":"The description of the evaluation form.\\n\\n*Length Constraints* : Minimum length of 0. Maximum length of 1024.","InstanceArn":"The identifier of the Amazon Connect instance.","Items":"Items that are part of the evaluation form. The total number of sections and questions must not exceed 100 each. Questions must be contained in a section.\\n\\n*Minimum size* : 1\\n\\n*Maximum size* : 100","ScoringStrategy":"A scoring strategy of the evaluation form.","Status":"The status of the evaluation form.\\n\\n*Allowed values* : `DRAFT` | `ACTIVE`","Tags":"The tags used to organize, track, or control access for this resource. For example, { \\"tags\\": {\\"key1\\":\\"value1\\", \\"key2\\":\\"value2\\"} }.","Title":"A title of the evaluation form."}},"AWS::Connect::EvaluationForm.EvaluationFormBaseItem":{"attributes":{},"description":"An item at the root level. All items must be sections.","properties":{"Section":"A subsection or inner section of an item."}},"AWS::Connect::EvaluationForm.EvaluationFormItem":{"attributes":{},"description":"Items that are part of the evaluation form. The total number of sections and questions must not exceed 100 each. Questions must be contained in a section.","properties":{"Question":"The information of the question.","Section":"The information of the section."}},"AWS::Connect::EvaluationForm.EvaluationFormNumericQuestionAutomation":{"attributes":{},"description":"Information about the automation configuration in numeric questions.","properties":{"PropertyValue":"The property value of the automation."}},"AWS::Connect::EvaluationForm.EvaluationFormNumericQuestionOption":{"attributes":{},"description":"Information about the option range used for scoring in numeric questions.","properties":{"AutomaticFail":"The flag to mark the option as automatic fail. If an automatic fail answer is provided, the overall evaluation gets a score of 0.","MaxValue":"The maximum answer value of the range option.","MinValue":"The minimum answer value of the range option.","Score":"The score assigned to answer values within the range option.\\n\\n*Minimum* : 0\\n\\n*Maximum* : 10"}},"AWS::Connect::EvaluationForm.EvaluationFormNumericQuestionProperties":{"attributes":{},"description":"Information about properties for a numeric question in an evaluation form.","properties":{"Automation":"The automation properties of the numeric question.","MaxValue":"The maximum answer value.","MinValue":"The minimum answer value.","Options":"The scoring options of the numeric question."}},"AWS::Connect::EvaluationForm.EvaluationFormQuestion":{"attributes":{},"description":"Information about a question from an evaluation form.","properties":{"Instructions":"The instructions of the section.\\n\\n*Length Constraints* : Minimum length of 0. Maximum length of 1024.","NotApplicableEnabled":"The flag to enable not applicable answers to the question.","QuestionType":"The type of the question.\\n\\n*Allowed values* : `NUMERIC` | `SINGLESELECT` | `TEXT`","QuestionTypeProperties":"The properties of the type of question. Text questions do not have to define question type properties.","RefId":"The identifier of the question. An identifier must be unique within the evaluation form.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 40.","Title":"The title of the question.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 350.","Weight":"The scoring weight of the section.\\n\\n*Minimum* : 0\\n\\n*Maximum* : 100"}},"AWS::Connect::EvaluationForm.EvaluationFormQuestionTypeProperties":{"attributes":{},"description":"Information about properties for a question in an evaluation form. The question type properties must be either for a numeric question or a single select question.","properties":{"Numeric":"The properties of the numeric question.","SingleSelect":"The properties of the numeric question."}},"AWS::Connect::EvaluationForm.EvaluationFormSection":{"attributes":{},"description":"Information about a section from an evaluation form. A section can contain sections and/or questions. Evaluation forms can only contain sections and subsections (two level nesting).","properties":{"Instructions":"The instructions of the section.","Items":"The items of the section.\\n\\n*Minimum* : 1","RefId":"The identifier of the section. An identifier must be unique within the evaluation form.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 40.","Title":"The title of the section.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 128.","Weight":"The scoring weight of the section.\\n\\n*Minimum* : 0\\n\\n*Maximum* : 100"}},"AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionAutomation":{"attributes":{},"description":"Information about the automation configuration in single select questions. Automation options are evaluated in order, and the first matched option is applied. If no automation option matches, and there is a default option, then the default option is applied.","properties":{"DefaultOptionRefId":"The identifier of the default answer option, when none of the automation options match the criteria.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 40.","Options":"The automation options of the single select question.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 20"}},"AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionAutomationOption":{"attributes":{},"description":"The automation options of the single select question.","properties":{"RuleCategory":"The automation option based on a rule category for the single select question."}},"AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionOption":{"attributes":{},"description":"Information about the automation configuration in single select questions.","properties":{"AutomaticFail":"The flag to mark the option as automatic fail. If an automatic fail answer is provided, the overall evaluation gets a score of 0.","RefId":"The identifier of the answer option. An identifier must be unique within the question.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 40.","Score":"The score assigned to the answer option.\\n\\n*Minimum* : 0\\n\\n*Maximum* : 10","Text":"The title of the answer option.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 128."}},"AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionProperties":{"attributes":{},"description":"Information about the options in single select questions.","properties":{"Automation":"The display mode of the single select question.","DisplayAs":"The display mode of the single select question.\\n\\n*Allowed values* : `DROPDOWN` | `RADIO`","Options":"The answer options of the single select question.\\n\\n*Minimum* : 2\\n\\n*Maximum* : 256"}},"AWS::Connect::EvaluationForm.NumericQuestionPropertyValueAutomation":{"attributes":{},"description":"Information about the property value used in automation of a numeric questions.","properties":{"Label":"The property label of the automation.\\n\\n*Allowed values* : `OVERALL_CUSTOMER_SENTIMENT_SCORE` , `OVERALL_AGENT_SENTIMENT_SCORE` | `NON_TALK_TIME` | `NON_TALK_TIME_PERCENTAGE` | `NUMBER_OF_INTERRUPTIONS` | `CONTACT_DURATION` | `AGENT_INTERACTION_DURATION` | `CUSTOMER_HOLD_TIME`"}},"AWS::Connect::EvaluationForm.ScoringStrategy":{"attributes":{},"description":"A scoring strategy of the evaluation form.","properties":{"Mode":"The scoring mode of the evaluation form.\\n\\n*Allowed values* : `QUESTION_ONLY` | `SECTION_ONLY`","Status":"The scoring status of the evaluation form.\\n\\n*Allowed values* : `ENABLED` | `DISABLED`"}},"AWS::Connect::EvaluationForm.SingleSelectQuestionRuleCategoryAutomation":{"attributes":{},"description":"Information about the automation option based on a rule category for a single select question.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 50.","properties":{"Category":"The category name, as defined in Rules.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 50","Condition":"The condition to apply for the automation option. If the condition is PRESENT, then the option is applied when the contact data includes the category. Similarly, if the condition is NOT_PRESENT, then the option is applied when the contact data does not include the category.\\n\\n*Allowed values* : `PRESENT` | `NOT_PRESENT`\\n\\n*Maximum* : 50","OptionRefId":"The identifier of the answer option. An identifier must be unique within the question.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 40."}},"AWS::Connect::HoursOfOperation":{"attributes":{"HoursOfOperationArn":"The Amazon Resource Name (ARN) of the hours of operation.","Ref":"`Ref` returns the hours of operation. For example:\\n\\n`{ \\"Ref\\": \\"myHoursOfOperation\\" }`"},"description":"Specifies hours of operation.","properties":{"Config":"Configuration information for the hours of operation.","Description":"The description for the hours of operation.","InstanceArn":"The Amazon Resource Name (ARN) of the instance.","Name":"The name for the hours of operation.","Tags":"The tags used to organize, track, or control access for this resource. For example, { \\"tags\\": {\\"key1\\":\\"value1\\", \\"key2\\":\\"value2\\"} }.","TimeZone":"The time zone for the hours of operation."}},"AWS::Connect::HoursOfOperation.HoursOfOperationConfig":{"attributes":{},"description":"Contains information about the hours of operation.","properties":{"Day":"The day that the hours of operation applies to.","EndTime":"The end time that your contact center closes.","StartTime":"The start time that your contact center opens."}},"AWS::Connect::HoursOfOperation.HoursOfOperationTimeSlice":{"attributes":{},"description":"The start time or end time for an hours of operation.","properties":{"Hours":"The hours.","Minutes":"The minutes."}},"AWS::Connect::Instance":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the instance.","CreatedTime":"When the instance was created.","Id":"The identifier of the Amazon Connect instance. You can find the instanceId in the ARN of the instance.","InstanceStatus":"The state of the instance.","Ref":"`Ref` returns the ID of the Amazon Connect instance.","ServiceRole":"The service role of the instance."},"description":"*This is a preview release for Amazon Connect . It is subject to change.*\\n\\nInitiates an Amazon Connect instance with all the supported channels enabled. It does not attach any storage, such as Amazon Simple Storage Service (Amazon S3) or Amazon Kinesis.\\n\\nAmazon Connect enforces a limit on the total number of instances that you can create or delete in 30 days. If you exceed this limit, you will get an error message indicating there has been an excessive number of attempts at creating or deleting instances. You must wait 30 days before you can restart creating and deleting instances in your account.","properties":{"Attributes":"A toggle for an individual feature at the instance level.","DirectoryId":"The identifier for the directory.","IdentityManagementType":"The identity management type.","InstanceAlias":"The alias of instance. `InstanceAlias` is only required when `IdentityManagementType` is `CONNECT_MANAGED` or `SAML` . `InstanceAlias` is not required when `IdentityManagementType` is `EXISTING_DIRECTORY` ."}},"AWS::Connect::Instance.Attributes":{"attributes":{},"description":"*This is a preview release for Amazon Connect . It is subject to change.*","properties":{"AutoResolveBestVoices":"","ContactLens":"","ContactflowLogs":"","EarlyMedia":"","InboundCalls":"","OutboundCalls":"","UseCustomTTSVoices":""}},"AWS::Connect::InstanceStorageConfig":{"attributes":{"AssociationId":"The existing association identifier that uniquely identifies the resource type and storage config for the given instance ID.","Ref":""},"description":"The storage configuration for the instance.","properties":{"InstanceArn":"The Amazon Resource Name (ARN) of the instance.","KinesisFirehoseConfig":"The configuration of the Kinesis Firehose delivery stream.","KinesisStreamConfig":"The configuration of the Kinesis data stream.","KinesisVideoStreamConfig":"The configuration of the Kinesis video stream.","ResourceType":"A valid resource type. Following are the valid resource types: `CHAT_TRANSCRIPTS` | `CALL_RECORDINGS` | `SCHEDULED_REPORTS` | `MEDIA_STREAMS` | `CONTACT_TRACE_RECORDS` | `AGENT_EVENTS`","S3Config":"The S3 bucket configuration.","StorageType":"A valid storage type."}},"AWS::Connect::InstanceStorageConfig.EncryptionConfig":{"attributes":{},"description":"The encryption configuration.","properties":{"EncryptionType":"The type of encryption.","KeyId":"The full ARN of the encryption key.\\n\\n> Be sure to provide the full ARN of the encryption key, not just the ID.\\n> \\n> Amazon Connect supports only KMS keys with the default key spec of [`SYMMETRIC_DEFAULT`](https://docs.aws.amazon.com/kms/latest/developerguide/asymmetric-key-specs.html#key-spec-symmetric-default) ."}},"AWS::Connect::InstanceStorageConfig.KinesisFirehoseConfig":{"attributes":{},"description":"Configuration information of a Kinesis Data Firehose delivery stream.","properties":{"FirehoseArn":"The Amazon Resource Name (ARN) of the delivery stream."}},"AWS::Connect::InstanceStorageConfig.KinesisStreamConfig":{"attributes":{},"description":"Configuration information of a Kinesis data stream.","properties":{"StreamArn":"The Amazon Resource Name (ARN) of the data stream."}},"AWS::Connect::InstanceStorageConfig.KinesisVideoStreamConfig":{"attributes":{},"description":"Configuration information of a Kinesis video stream.","properties":{"EncryptionConfig":"The encryption configuration.","Prefix":"The prefix of the video stream.","RetentionPeriodHours":"The number of hours data is retained in the stream. Kinesis Video Streams retains the data in a data store that is associated with the stream.\\n\\nThe default value is 0, indicating that the stream does not persist data."}},"AWS::Connect::InstanceStorageConfig.S3Config":{"attributes":{},"description":"Information about the Amazon Simple Storage Service (Amazon S3) storage type.","properties":{"BucketName":"The S3 bucket name.","BucketPrefix":"The S3 bucket prefix.","EncryptionConfig":"The Amazon S3 encryption configuration."}},"AWS::Connect::IntegrationAssociation":{"attributes":{"IntegrationAssociationId":"Identifier of the association with an Amazon Connect instance.","Ref":""},"description":"Specifies the association of an AWS resource such as Lex bot (both v1 and v2) and Lambda function with an Amazon Connect instance.","properties":{"InstanceId":"The Amazon Resource Name (ARN) of the instance.\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `100`","IntegrationArn":"ARN of the integration being associated with the instance.\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `140`","IntegrationType":"Specifies the integration type to be associated with the instance.\\n\\n*Allowed Values* : `LEX_BOT` | `LAMBDA_FUNCTION`"}},"AWS::Connect::PhoneNumber":{"attributes":{"Address":"The phone number, in E.164 format.","PhoneNumberArn":"The Amazon Resource Name (ARN) of the phone number.","Ref":"`Ref` returns the phone number. For example:\\n\\n`{ \\"Ref\\": \\"myPhoneNumber\\" }`"},"description":"Claims a phone number to the specified Amazon Connect instance or traffic distribution group.","properties":{"CountryCode":"The ISO country code.","Description":"The description of the phone number.","Prefix":"The prefix of the phone number. If provided, it must contain `+` as part of the country code.\\n\\n*Pattern* : `^\\\\\\\\+[0-9]{1,15}`","Tags":"The tags used to organize, track, or control access for this resource. For example, { \\"tags\\": {\\"key1\\":\\"value1\\", \\"key2\\":\\"value2\\"} }.","TargetArn":"The Amazon Resource Name (ARN) of Amazon Connect instances or traffic distribution group that phone numbers are claimed to.","Type":"The type of phone number."}},"AWS::Connect::Prompt":{"attributes":{"PromptArn":"The Amazon Resource Name (ARN) of the prompt.","Ref":"`Ref` returns the quick rule name. For example:\\n\\n`{ \\"Ref\\": \\"myPromptName\\" }`"},"description":"Creates a prompt for the specified Amazon Connect instance.","properties":{"Description":"The description of the prompt.","InstanceArn":"The identifier of the Amazon Connect instance.","Name":"The name of the prompt.","S3Uri":"The URI for the S3 bucket where the prompt is stored. This property is required when you create a prompt.","Tags":"The tags used to organize, track, or control access for this resource. For example, { \\"tags\\": {\\"key1\\":\\"value1\\", \\"key2\\":\\"value2\\"} }."}},"AWS::Connect::QuickConnect":{"attributes":{"QuickConnectArn":"The Amazon Resource Name (ARN) of the quick connect.","Ref":"`Ref` returns the quick connect name. For example:\\n\\n`{ \\"Ref\\": \\"myQuickConnectName\\" }`"},"description":"Specifies a quick connect for an Amazon Connect instance.","properties":{"Description":"The description of the quick connect.","InstanceArn":"The Amazon Resource Name (ARN) of the instance.","Name":"The name of the quick connect.","QuickConnectConfig":"Contains information about the quick connect.","Tags":"The tags used to organize, track, or control access for this resource. For example, { \\"tags\\": {\\"key1\\":\\"value1\\", \\"key2\\":\\"value2\\"} }."}},"AWS::Connect::QuickConnect.PhoneNumberQuickConnectConfig":{"attributes":{},"description":"Contains information about a phone number for a quick connect.","properties":{"PhoneNumber":"The phone number in E.164 format."}},"AWS::Connect::QuickConnect.QueueQuickConnectConfig":{"attributes":{},"description":"Contains information about a queue for a quick connect. The flow must be of type Transfer to Queue.","properties":{"ContactFlowArn":"The Amazon Resource Name (ARN) of the flow.","QueueArn":"The Amazon Resource Name (ARN) of the queue."}},"AWS::Connect::QuickConnect.QuickConnectConfig":{"attributes":{},"description":"Contains configuration settings for a quick connect.","properties":{"PhoneConfig":"The phone configuration. This is required only if QuickConnectType is PHONE_NUMBER.","QueueConfig":"The queue configuration. This is required only if QuickConnectType is QUEUE.","QuickConnectType":"The type of quick connect. In the Amazon Connect console, when you create a quick connect, you are prompted to assign one of the following types: Agent (USER), External (PHONE_NUMBER), or Queue (QUEUE).","UserConfig":"The user configuration. This is required only if QuickConnectType is USER."}},"AWS::Connect::QuickConnect.UserQuickConnectConfig":{"attributes":{},"description":"Contains information about the quick connect configuration settings for a user. The contact flow must be of type Transfer to Agent.","properties":{"ContactFlowArn":"The Amazon Resource Name (ARN) of the flow.","UserArn":"The Amazon Resource Name (ARN) of the user."}},"AWS::Connect::Rule":{"attributes":{"Ref":"`Ref` returns the quick rule name. For example:\\n\\n`{ \\"Ref\\": \\"myRuleName\\" }`","RuleArn":"The Amazon Resource Name (ARN) of the rule."},"description":"Creates a rule for the specified Amazon Connect instance.","properties":{"Actions":"A list of actions to be run when the rule is triggered.","Function":"The conditions of the rule.","InstanceArn":"The Amazon Resource Name (ARN) of the instance.","Name":"The name of the rule.","PublishStatus":"The publish status of the rule.\\n\\n*Allowed values* : `DRAFT` | `PUBLISHED`","Tags":"The tags used to organize, track, or control access for this resource. For example, { \\"tags\\": {\\"key1\\":\\"value1\\", \\"key2\\":\\"value2\\"} }.","TriggerEventSource":"The event source to trigger the rule."}},"AWS::Connect::Rule.Actions":{"attributes":{},"description":"A list of actions to be run when the rule is triggered.","properties":{"AssignContactCategoryActions":"Information about the contact category action. The syntax can be empty, for example, `{}` .","EventBridgeActions":"Information about the EventBridge action.","SendNotificationActions":"Information about the send notification action.","TaskActions":"Information about the task action. This field is required if `TriggerEventSource` is one of the following values: `OnZendeskTicketCreate` | `OnZendeskTicketStatusUpdate` | `OnSalesforceCaseCreate`"}},"AWS::Connect::Rule.EventBridgeAction":{"attributes":{},"description":"The EventBridge action definition.","properties":{"Name":"The name."}},"AWS::Connect::Rule.NotificationRecipientType":{"attributes":{},"description":"The type of notification recipient.","properties":{"UserArns":"The Amazon Resource Name (ARN) of the user account.","UserTags":"The tags used to organize, track, or control access for this resource. For example, { \\"tags\\": {\\"key1\\":\\"value1\\", \\"key2\\":\\"value2\\"} }. Amazon Connect users with the specified tags will be notified."}},"AWS::Connect::Rule.Reference":{"attributes":{},"description":"Information about the reference when the `referenceType` is `URL` . Otherwise, null. (Supports variable injection in the `Value` field.)","properties":{"Type":"The type of the reference. `DATE` must be of type Epoch timestamp.\\n\\n*Allowed values* : `URL` | `ATTACHMENT` | `NUMBER` | `STRING` | `DATE` | `EMAIL`","Value":"A valid value for the reference. For example, for a URL reference, a formatted URL that is displayed to an agent in the Contact Control Panel (CCP)."}},"AWS::Connect::Rule.RuleTriggerEventSource":{"attributes":{},"description":"The name of the event source.","properties":{"EventSourceName":"The name of the event source.\\n\\n*Allowed values* : `OnPostCallAnalysisAvailable` | `OnRealTimeCallAnalysisAvailable` | `OnPostChatAnalysisAvailable` | `OnZendeskTicketCreate` | `OnZendeskTicketStatusUpdate` | `OnSalesforceCaseCreate`","IntegrationAssociationArn":"The Amazon Resource Name (ARN) of the integration association. `IntegrationAssociationArn` is required if `TriggerEventSource` is one of the following values: `OnZendeskTicketCreate` | `OnZendeskTicketStatusUpdate` | `OnSalesforceCaseCreate`"}},"AWS::Connect::Rule.SendNotificationAction":{"attributes":{},"description":"Information about the send notification action.","properties":{"Content":"Notification content. Supports variable injection. For more information, see [JSONPath reference](https://docs.aws.amazon.com/connect/latest/adminguide/contact-lens-variable-injection.html) in the *Amazon Connect Administrators Guide* .","ContentType":"Content type format.\\n\\n*Allowed value* : `PLAIN_TEXT`","DeliveryMethod":"Notification delivery method.\\n\\n*Allowed value* : `EMAIL`","Recipient":"Notification recipient.","Subject":"The subject of the email if the delivery method is `EMAIL` . Supports variable injection. For more information, see [JSONPath reference](https://docs.aws.amazon.com/connect/latest/adminguide/contact-lens-variable-injection.html) in the *Amazon Connect Administrators Guide* ."}},"AWS::Connect::Rule.TaskAction":{"attributes":{},"description":"Information about the task action. This field is required if `TriggerEventSource` is one of the following values: `OnZendeskTicketCreate` | `OnZendeskTicketStatusUpdate` | `OnSalesforceCaseCreate`","properties":{"ContactFlowArn":"The Amazon Resource Name (ARN) of the flow.","Description":"The description. Supports variable injection. For more information, see [JSONPath reference](https://docs.aws.amazon.com/connect/latest/adminguide/contact-lens-variable-injection.html) in the *Amazon Connect Administrators Guide* .","Name":"The name. Supports variable injection. For more information, see [JSONPath reference](https://docs.aws.amazon.com/connect/latest/adminguide/contact-lens-variable-injection.html) in the *Amazon Connect Administrators Guide* .","References":"Information about the reference when the `referenceType` is `URL` . Otherwise, null. `URL` is the only accepted type. (Supports variable injection in the `Value` field.)"}},"AWS::Connect::SecurityKey":{"attributes":{"AssociationId":"An `AssociationId` is automatically generated when a storage config is associated with an instance.","Ref":""},"description":"The security key for the instance.\\n\\n> Only two security keys are allowed per Amazon Connect instance.","properties":{"InstanceId":"The Amazon Resource Name (ARN) of the instance.\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `100`","Key":"A valid security key in PEM format. For example:\\n\\n`\\"-----BEGIN PUBLIC KEY-----\\\\ [a lot of characters] ----END PUBLIC KEY-----\\"`\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `1024`"}},"AWS::Connect::TaskTemplate":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the task template.","Ref":"`Ref` returns the task template. For example:\\n\\n`{ \\"Ref\\": \\"myTaskTemplate\\" }`"},"description":"Specifies a task template for a Amazon Connect instance.","properties":{"ClientToken":"A unique, case-sensitive identifier that you provide to ensure the idempotency of the request.","Constraints":"Constraints that are applicable to the fields listed.\\n\\nThe values can be represented in either JSON or YAML format. For an example of the JSON configuration, see *Examples* at the bottom of this page.","ContactFlowArn":"The Amazon Resource Name (ARN) of the flow that runs by default when a task is created by referencing this template. `ContactFlowArn` is not required when there is a field with `fieldType` = `QUICK_CONNECT` .","Defaults":"The default values for fields when a task is created by referencing this template.","Description":"The description of the task template.","Fields":"Fields that are part of the template. A template requires at least one field that has type `Name` .","InstanceArn":"The Amazon Resource Name (ARN) of the Amazon Connect instance.","Name":"The name of the task template.","Status":"The status of the task template.","Tags":"The tags used to organize, track, or control access for this resource."}},"AWS::Connect::TaskTemplate.Constraints":{"attributes":{},"description":"Describes constraints that apply to the template fields.","properties":{"InvisibleFields":"Lists the fields that are invisible to agents.","ReadOnlyFields":"Lists the fields that are read-only to agents, and cannot be edited.","RequiredFields":"Lists the fields that are required to be filled by agents."}},"AWS::Connect::TaskTemplate.DefaultFieldValue":{"attributes":{},"description":"Describes a default field and its corresponding value.","properties":{"DefaultValue":"Default value for the field.","Id":"Identifier of a field."}},"AWS::Connect::TaskTemplate.Field":{"attributes":{},"description":"Describes a single task template field.","properties":{"Description":"The description of the field.","Id":"The unique identifier for the field.","SingleSelectOptions":"A list of options for a single select field.","Type":"Indicates the type of field. Following are the valid field types: `NAME` `DESCRIPTION` | `SCHEDULED_TIME` | `QUICK_CONNECT` | `URL` | `NUMBER` | `TEXT` | `TEXT_AREA` | `DATE_TIME` | `BOOLEAN` | `SINGLE_SELECT` | `EMAIL`"}},"AWS::Connect::TaskTemplate.FieldIdentifier":{"attributes":{},"description":"The identifier of the task template field.","properties":{"Name":"The name of the task template field."}},"AWS::Connect::TaskTemplate.InvisibleFieldInfo":{"attributes":{},"description":"A field that is invisible to an agent.","properties":{"Id":"Identifier of the invisible field."}},"AWS::Connect::TaskTemplate.ReadOnlyFieldInfo":{"attributes":{},"description":"Indicates a field that is read-only to an agent.","properties":{"Id":"Identifier of the read-only field."}},"AWS::Connect::TaskTemplate.RequiredFieldInfo":{"attributes":{},"description":"Information about a required field.","properties":{"Id":"The unique identifier for the field."}},"AWS::Connect::User":{"attributes":{"Ref":"`Ref` returns the user. For example:\\n\\n`{ \\"Ref\\": \\"myUser\\" }`","UserArn":"The Amazon Resource Name (ARN) of the user."},"description":"Specifies a user account for an Amazon Connect instance.\\n\\nFor information about how to create user accounts using the Amazon Connect console, see [Add Users](https://docs.aws.amazon.com/connect/latest/adminguide/user-management.html) in the *Amazon Connect Administrator Guide* .","properties":{"DirectoryUserId":"The identifier of the user account in the directory used for identity management.","HierarchyGroupArn":"The Amazon Resource Name (ARN) of the user\'s hierarchy group.","IdentityInfo":"Information about the user identity.","InstanceArn":"The Amazon Resource Name (ARN) of the instance.","Password":"The user\'s password.","PhoneConfig":"Information about the phone configuration for the user.","RoutingProfileArn":"The Amazon Resource Name (ARN) of the user\'s routing profile.","SecurityProfileArns":"The Amazon Resource Name (ARN) of the user\'s security profile.","Tags":"The tags.","Username":"The user name assigned to the user account."}},"AWS::Connect::User.UserIdentityInfo":{"attributes":{},"description":"Contains information about the identity of a user.","properties":{"Email":"The email address. If you are using SAML for identity management and include this parameter, an error is returned.","FirstName":"The first name. This is required if you are using Amazon Connect or SAML for identity management.","LastName":"The last name. This is required if you are using Amazon Connect or SAML for identity management.","Mobile":"The user\'s mobile number.","SecondaryEmail":"The user\'s secondary email address. If you provide a secondary email, the user receives email notifications -- other than password reset notifications -- to this email address instead of to their primary email address.\\n\\n*Pattern* : `(?=^.{0,265}$)[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,63}`"}},"AWS::Connect::User.UserPhoneConfig":{"attributes":{},"description":"Contains information about the phone configuration settings for a user.","properties":{"AfterContactWorkTimeLimit":"The After Call Work (ACW) timeout setting, in seconds.\\n\\n> When returned by a `SearchUsers` call, `AfterContactWorkTimeLimit` is returned in milliseconds.","AutoAccept":"The Auto accept setting.","DeskPhoneNumber":"The phone number for the user\'s desk phone.","PhoneType":"The phone type."}},"AWS::Connect::UserHierarchyGroup":{"attributes":{"Ref":"`Ref` returns the user hierarchy group. For example:\\n\\n`{ \\"Ref\\": \\"myUserHierarchyGroup\\" }`","UserHierarchyGroupArn":"The Amazon Resource Name (ARN) of the user hierarchy group."},"description":"Specifies a new user hierarchy group.","properties":{"InstanceArn":"The Amazon Resource Name (ARN) of the user hierarchy group.","Name":"The name of the user hierarchy group.","ParentGroupArn":"The Amazon Resource Name (ARN) of the parent group."}},"AWS::ConnectCampaigns::Campaign":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the high-volume outbound campaign.","Ref":"`Ref` returns the campaign name. For example:\\n\\n`{ \\"Ref\\": \\"myCampaignName\\" }`"},"description":"Contains information about an outbound campaign.","properties":{"ConnectInstanceArn":"The Amazon Resource Name (ARN) of the Amazon Connect instance.","DialerConfig":"Contains information about the dialer configuration.","Name":"The name of the campaign.","OutboundCallConfig":"Contains information about the outbound call configuration.","Tags":"The tags used to organize, track, or control access for this resource. For example, { \\"tags\\": {\\"key1\\":\\"value1\\", \\"key2\\":\\"value2\\"} }."}},"AWS::ConnectCampaigns::Campaign.AnswerMachineDetectionConfig":{"attributes":{},"description":"","properties":{"EnableAnswerMachineDetection":""}},"AWS::ConnectCampaigns::Campaign.DialerConfig":{"attributes":{},"description":"Contains dialer configuration for an outbound campaign.","properties":{"PredictiveDialerConfig":"The configuration of the predictive dialer.","ProgressiveDialerConfig":"The configuration of the progressive dialer."}},"AWS::ConnectCampaigns::Campaign.OutboundCallConfig":{"attributes":{},"description":"Contains outbound call configuration for an outbound campaign.","properties":{"AnswerMachineDetectionConfig":"","ConnectContactFlowArn":"The Amazon Resource Name (ARN) of the flow.","ConnectQueueArn":"The Amazon Resource Name (ARN) of the queue.","ConnectSourcePhoneNumber":"The phone number associated with the outbound call. This is the caller ID that is displayed to customers when an agent calls them."}},"AWS::ConnectCampaigns::Campaign.PredictiveDialerConfig":{"attributes":{},"description":"Contains predictive dialer configuration for an outbound campaign.","properties":{"BandwidthAllocation":"Bandwidth allocation for the predictive dialer."}},"AWS::ConnectCampaigns::Campaign.ProgressiveDialerConfig":{"attributes":{},"description":"Contains progressive dialer configuration for an outbound campaign.","properties":{"BandwidthAllocation":"Bandwidth allocation for the progressive dialer."}},"AWS::ControlTower::EnabledControl":{"attributes":{"Ref":"`Ref` returns the physical ID of the resource. The format is of the form `target | control` . For example:\\n\\n`arn:aws:organizations::123456789012:ou/o-myorg/ou-my-ouid | arn:aws:controltower:us-west-2::control/AWS-GR_AUTOSCALING_LAUNCH_CONFIG_PUBLIC_IP_DISABLED`"},"description":"The resource represents an enabled control. It specifies an asynchronous operation that creates AWS resources on the specified organizational unit and the accounts it contains. The resources created will vary according to the control that you specify.","properties":{"ControlIdentifier":"The ARN of the control. Only *Strongly recommended* and *Elective* controls are permitted, with the exception of the *Region deny* guardrail.","TargetIdentifier":"The ARN of the organizational unit."}},"AWS::CustomerProfiles::CalculatedAttributeDefinition":{"attributes":{"CreatedAt":"The timestamp of when the calculated attribute definition was created.","LastUpdatedAt":"The timestamp of when the calculated attribute definition was most recently edited.","Ref":""},"description":"A calculated attribute definition for Customer Profiles","properties":{"AttributeDetails":"Mathematical expression and a list of attribute items specified in that expression.","CalculatedAttributeName":"The name of an attribute defined in a profile object type.","Conditions":"The conditions including range, object count, and threshold for the calculated attribute.","Description":"The description of the calculated attribute.","DisplayName":"The display name of the calculated attribute.","DomainName":"The unique name of the domain.","Statistic":"The aggregation operation to perform for the calculated attribute.","Tags":"An array of key-value pairs to apply to this resource."}},"AWS::CustomerProfiles::CalculatedAttributeDefinition.AttributeDetails":{"attributes":{},"description":"Mathematical expression and a list of attribute items specified in that expression.","properties":{"Attributes":"Mathematical expression and a list of attribute items specified in that expression.","Expression":"Mathematical expression that is performed on attribute items provided in the attribute list. Each element in the expression should follow the structure of \\\\\\"{ObjectTypeName.AttributeName}\\\\\\"."}},"AWS::CustomerProfiles::CalculatedAttributeDefinition.AttributeItem":{"attributes":{},"description":"The details of a single attribute item specified in the mathematical expression.","properties":{"Name":"The unique name of the calculated attribute."}},"AWS::CustomerProfiles::CalculatedAttributeDefinition.Conditions":{"attributes":{},"description":"The conditions including range, object count, and threshold for the calculated attribute.","properties":{"ObjectCount":"The number of profile objects used for the calculated attribute.","Range":"The relative time period over which data is included in the aggregation.","Threshold":"The threshold for the calculated attribute."}},"AWS::CustomerProfiles::CalculatedAttributeDefinition.Range":{"attributes":{},"description":"The relative time period over which data is included in the aggregation.","properties":{"Unit":"The unit of time.","Value":"The amount of time of the specified unit."}},"AWS::CustomerProfiles::CalculatedAttributeDefinition.Threshold":{"attributes":{},"description":"The threshold for the calculated attribute.","properties":{"Operator":"The operator of the threshold.","Value":"The value of the threshold."}},"AWS::CustomerProfiles::Domain":{"attributes":{"CreatedAt":"The timestamp of when the domain was created.","LastUpdatedAt":"The timestamp of when the domain was most recently edited.","Ref":"`Ref` returns the DomainName of the domain."},"description":"Specifies an Amazon Connect Customer Profiles Domain.","properties":{"DeadLetterQueueUrl":"The URL of the SQS dead letter queue, which is used for reporting errors associated with ingesting data from third party applications. You must set up a policy on the DeadLetterQueue for the SendMessage operation to enable Amazon Connect Customer Profiles to send messages to the DeadLetterQueue.","DefaultEncryptionKey":"The default encryption key, which is an AWS managed key, is used when no specific type of encryption key is specified. It is used to encrypt all data before it is placed in permanent or semi-permanent storage.","DefaultExpirationDays":"The default number of days until the data within the domain expires.","DomainName":"The unique name of the domain.","Tags":"The tags used to organize, track, or control access for this resource."}},"AWS::CustomerProfiles::EventStream":{"attributes":{"CreatedAt":"The timestamp of when the export was created.","DestinationDetails":"Details regarding the Kinesis stream.","DestinationDetails.Status":"The status of enabling the Kinesis stream as a destination for export.","DestinationDetails.Uri":"The StreamARN of the destination to deliver profile events to. For example, arn:aws:kinesis:region:account-id:stream/stream-name.","EventStreamArn":"A unique identifier for the event stream.","Ref":"","State":"The operational state of destination stream for export."},"description":"An Event Stream resource of Amazon Connect Customer Profiles.","properties":{"DomainName":"The unique name of the domain.","EventStreamName":"The name of the event stream.","Tags":"The tags used to organize, track, or control access for this resource.","Uri":"The StreamARN of the destination to deliver profile events to. For example, arn:aws:kinesis:region:account-id:stream/stream-name."}},"AWS::CustomerProfiles::EventStream.DestinationDetails":{"attributes":{},"description":"Details regarding the Kinesis stream.","properties":{"Status":"The status of enabling the Kinesis stream as a destination for export.","Uri":"The StreamARN of the destination to deliver profile events to. For example, arn:aws:kinesis:region:account-id:stream/stream-name."}},"AWS::CustomerProfiles::Integration":{"attributes":{"CreatedAt":"The timestamp of when the integration was created.","LastUpdatedAt":"The timestamp of when the integration was most recently edited.","Ref":"`Ref` returns the DomainName and the Uri of the integration."},"description":"Specifies an Amazon Connect Customer Profiles Integration.","properties":{"DomainName":"The unique name of the domain.","FlowDefinition":"The configuration that controls how Customer Profiles retrieves data from the source.","ObjectTypeName":"The name of the profile object type mapping to use.","ObjectTypeNames":"The object type mapping.","Tags":"The tags used to organize, track, or control access for this resource.","Uri":"The URI of the S3 bucket or any other type of data source."}},"AWS::CustomerProfiles::Integration.ConnectorOperator":{"attributes":{},"description":"The operation to be performed on the provided source fields.","properties":{"Marketo":"The operation to be performed on the provided Marketo source fields.","S3":"The operation to be performed on the provided Amazon S3 source fields.","Salesforce":"The operation to be performed on the provided Salesforce source fields.","ServiceNow":"The operation to be performed on the provided ServiceNow source fields.","Zendesk":"The operation to be performed on the provided Zendesk source fields."}},"AWS::CustomerProfiles::Integration.FlowDefinition":{"attributes":{},"description":"The configurations that control how Customer Profiles retrieves data from the source, Amazon AppFlow. Customer Profiles uses this information to create an AppFlow flow on behalf of customers.","properties":{"Description":"A description of the flow you want to create.","FlowName":"The specified name of the flow. Use underscores (_) or hyphens (-) only. Spaces are not allowed.","KmsArn":"The Amazon Resource Name (ARN) of the AWS Key Management Service (KMS) key you provide for encryption.","SourceFlowConfig":"The configuration that controls how Customer Profiles retrieves data from the source.","Tasks":"A list of tasks that Customer Profiles performs while transferring the data in the flow run.","TriggerConfig":"The trigger settings that determine how and when the flow runs."}},"AWS::CustomerProfiles::Integration.IncrementalPullConfig":{"attributes":{},"description":"Specifies the configuration used when importing incremental records from the source.","properties":{"DatetimeTypeFieldName":"A field that specifies the date time or timestamp field as the criteria to use when importing incremental records from the source."}},"AWS::CustomerProfiles::Integration.MarketoSourceProperties":{"attributes":{},"description":"The properties that are applied when Marketo is being used as a source.","properties":{"Object":"The object specified in the Marketo flow source."}},"AWS::CustomerProfiles::Integration.ObjectTypeMapping":{"attributes":{},"description":"A map in which each key is an event type from an external application such as Segment or Shopify, and each value is an `ObjectTypeName` (template) used to ingest the event.","properties":{"Key":"The key.","Value":"The value."}},"AWS::CustomerProfiles::Integration.S3SourceProperties":{"attributes":{},"description":"The properties that are applied when Amazon S3 is being used as the flow source.","properties":{"BucketName":"The Amazon S3 bucket name where the source files are stored.","BucketPrefix":"The object key for the Amazon S3 bucket in which the source files are stored."}},"AWS::CustomerProfiles::Integration.SalesforceSourceProperties":{"attributes":{},"description":"The properties that are applied when Salesforce is being used as a source.","properties":{"EnableDynamicFieldUpdate":"The flag that enables dynamic fetching of new (recently added) fields in the Salesforce objects while running a flow.","IncludeDeletedRecords":"Indicates whether Amazon AppFlow includes deleted files in the flow run.","Object":"The object specified in the Salesforce flow source."}},"AWS::CustomerProfiles::Integration.ScheduledTriggerProperties":{"attributes":{},"description":"Specifies the configuration details of a scheduled-trigger flow that you define. Currently, these settings only apply to the scheduled-trigger type.","properties":{"DataPullMode":"Specifies whether a scheduled flow has an incremental data transfer or a complete data transfer for each flow run.","FirstExecutionFrom":"Specifies the date range for the records to import from the connector in the first flow run.","ScheduleEndTime":"Specifies the scheduled end time for a scheduled-trigger flow.","ScheduleExpression":"The scheduling expression that determines the rate at which the schedule will run, for example rate (5 minutes).","ScheduleOffset":"Specifies the optional offset that is added to the time interval for a schedule-triggered flow.","ScheduleStartTime":"Specifies the scheduled start time for a scheduled-trigger flow.","Timezone":"Specifies the time zone used when referring to the date and time of a scheduled-triggered flow, such as America/New_York."}},"AWS::CustomerProfiles::Integration.ServiceNowSourceProperties":{"attributes":{},"description":"The properties that are applied when ServiceNow is being used as a source.","properties":{"Object":"The object specified in the ServiceNow flow source."}},"AWS::CustomerProfiles::Integration.SourceConnectorProperties":{"attributes":{},"description":"Specifies the information that is required to query a particular Amazon AppFlow connector. Customer Profiles supports Salesforce, Zendesk, Marketo, ServiceNow and Amazon S3.","properties":{"Marketo":"The properties that are applied when Marketo is being used as a source.","S3":"The properties that are applied when Amazon S3 is being used as the flow source.","Salesforce":"The properties that are applied when Salesforce is being used as a source.","ServiceNow":"The properties that are applied when ServiceNow is being used as a source.","Zendesk":"The properties that are applied when using Zendesk as a flow source."}},"AWS::CustomerProfiles::Integration.SourceFlowConfig":{"attributes":{},"description":"The configuration that controls how Customer Profiles retrieves data from the source.","properties":{"ConnectorProfileName":"The name of the Amazon AppFlow connector profile. This name must be unique for each connector profile in the AWS account .","ConnectorType":"The type of connector, such as Salesforce, Marketo, and so on.","IncrementalPullConfig":"Defines the configuration for a scheduled incremental data pull. If a valid configuration is provided, the fields specified in the configuration are used when querying for the incremental data pull.","SourceConnectorProperties":"Specifies the information that is required to query a particular source connector."}},"AWS::CustomerProfiles::Integration.Task":{"attributes":{},"description":"The `Task` property type specifies the class for modeling different type of tasks. Task implementation varies based on the TaskType.","properties":{"ConnectorOperator":"The operation to be performed on the provided source fields.","DestinationField":"A field in a destination connector, or a field value against which Amazon AppFlow validates a source field.","SourceFields":"The source fields to which a particular task is applied.","TaskProperties":"A map used to store task-related information. The service looks for particular information based on the TaskType.","TaskType":"Specifies the particular task implementation that Amazon AppFlow performs."}},"AWS::CustomerProfiles::Integration.TaskPropertiesMap":{"attributes":{},"description":"A map used to store task-related information. The execution service looks for particular information based on the `TaskType` .","properties":{"OperatorPropertyKey":"The task property key.","Property":"The task property value."}},"AWS::CustomerProfiles::Integration.TriggerConfig":{"attributes":{},"description":"The trigger settings that determine how and when Amazon AppFlow runs the specified flow.","properties":{"TriggerProperties":"Specifies the configuration details of a schedule-triggered flow that you define. Currently, these settings only apply to the Scheduled trigger type.","TriggerType":"Specifies the type of flow trigger. It can be OnDemand, Scheduled, or Event."}},"AWS::CustomerProfiles::Integration.TriggerProperties":{"attributes":{},"description":"Specifies the configuration details that control the trigger for a flow. Currently, these settings only apply to the Scheduled trigger type.","properties":{"Scheduled":"Specifies the configuration details of a schedule-triggered flow that you define."}},"AWS::CustomerProfiles::Integration.ZendeskSourceProperties":{"attributes":{},"description":"The properties that are applied when using Zendesk as a flow source.","properties":{"Object":"The object specified in the Zendesk flow source."}},"AWS::CustomerProfiles::ObjectType":{"attributes":{"CreatedAt":"The timestamp of when the object type was created.","LastUpdatedAt":"The timestamp of when the object type was most recently edited.","Ref":"`Ref` returns the DomainName and the ObjectTypeName of the object type."},"description":"Specifies an Amazon Connect Customer Profiles Object Type Mapping.","properties":{"AllowProfileCreation":"Indicates whether a profile should be created when data is received if one doesn’t exist for an object of this type. The default is `FALSE` . If the AllowProfileCreation flag is set to `FALSE` , then the service tries to fetch a standard profile and associate this object with the profile. If it is set to `TRUE` , and if no match is found, then the service creates a new standard profile.","Description":"The description of the profile object type mapping.","DomainName":"The unique name of the domain.","EncryptionKey":"The customer-provided key to encrypt the profile object that will be created in this profile object type mapping. If not specified the system will use the encryption key of the domain.","ExpirationDays":"The number of days until the data of this type expires.","Fields":"A list of field definitions for the object type mapping.","Keys":"A list of keys that can be used to map data to the profile or search for the profile.","ObjectTypeName":"The name of the profile object type.","Tags":"The tags used to organize, track, or control access for this resource.","TemplateId":"A unique identifier for the template mapping. This can be used instead of specifying the Keys and Fields properties directly."}},"AWS::CustomerProfiles::ObjectType.FieldMap":{"attributes":{},"description":"A map of the name and ObjectType field.","properties":{"Name":"Name of the field.","ObjectTypeField":"Represents a field in a ProfileObjectType."}},"AWS::CustomerProfiles::ObjectType.KeyMap":{"attributes":{},"description":"A unique key map that can be used to map data to the profile.","properties":{"Name":"Name of the key.","ObjectTypeKeyList":"A list of ObjectTypeKey."}},"AWS::CustomerProfiles::ObjectType.ObjectTypeField":{"attributes":{},"description":"Represents a field in a ProfileObjectType.","properties":{"ContentType":"The content type of the field. Used for determining equality when searching.","Source":"A field of a ProfileObject. For example: _source.FirstName, where “_source” is a ProfileObjectType of a Zendesk user and “FirstName” is a field in that ObjectType.","Target":"The location of the data in the standard ProfileObject model. For example: _profile.Address.PostalCode."}},"AWS::CustomerProfiles::ObjectType.ObjectTypeKey":{"attributes":{},"description":"An object that defines the Key element of a ProfileObject. A Key is a special element that can be used to search for a customer profile.","properties":{"FieldNames":"The reference for the key name of the fields map.","StandardIdentifiers":"The types of keys that a ProfileObject can have. Each ProfileObject can have only 1 UNIQUE key but multiple PROFILE keys. PROFILE means that this key can be used to tie an object to a PROFILE. UNIQUE means that it can be used to uniquely identify an object. If a key a is marked as SECONDARY, it will be used to search for profiles after all other PROFILE keys have been searched. A LOOKUP_ONLY key is only used to match a profile but is not persisted to be used for searching of the profile. A NEW_ONLY key is only used if the profile does not already exist before the object is ingested, otherwise it is only used for matching objects to profiles."}},"AWS::DAX::Cluster":{"attributes":{"Arn":"Returns the ARN of the DAX cluster. For example:\\n\\n`{ \\"Fn::GetAtt\\": [\\" MyDAXCluster \\", \\"Arn\\"] }` \\n\\nReturns a value similar to the following:\\n\\n`arn:aws:dax:us-east-1:111122223333:cache/MyDAXCluster`","ClusterDiscoveryEndpoint":"Returns the endpoint of the DAX cluster. For example:\\n\\n`{ \\"Fn::GetAtt\\": [\\" MyDAXCluster \\", \\"ClusterDiscoveryEndpoint\\"] }` \\n\\nReturns a value similar to the following:\\n\\n`mydaxcluster.0h3d6x.clustercfg.dax.use1.cache.amazonaws.com:8111`","ClusterDiscoveryEndpointURL":"Returns the endpoint URL of the DAX cluster.","Ref":"`Ref` returns the name of the created DAX cluster. For example:\\n\\n`{ \\"Ref\\": \\" MyResource \\" }`\\n\\nReturns a value similar to the following:\\n\\n`MyDAXCluster`"},"description":"Creates a DAX cluster. All nodes in the cluster run the same DAX caching software.","properties":{"AvailabilityZones":"The Availability Zones (AZs) in which the cluster nodes will reside after the cluster has been created or updated. If provided, the length of this list must equal the `ReplicationFactor` parameter. If you omit this parameter, DAX will spread the nodes across Availability Zones for the highest availability.","ClusterEndpointEncryptionType":"The encryption type of the cluster\'s endpoint. Available values are:\\n\\n- `NONE` - The cluster\'s endpoint will be unencrypted.\\n- `TLS` - The cluster\'s endpoint will be encrypted with Transport Layer Security, and will provide an x509 certificate for authentication.\\n\\nThe default value is `NONE` .","ClusterName":"The name of the DAX cluster.","Description":"The description of the cluster.","IAMRoleARN":"A valid Amazon Resource Name (ARN) that identifies an IAM role. At runtime, DAX will assume this role and use the role\'s permissions to access DynamoDB on your behalf.","NodeType":"The node type for the nodes in the cluster. (All nodes in a DAX cluster are of the same type.)","NotificationTopicARN":"The Amazon Resource Name (ARN) of the Amazon SNS topic to which notifications will be sent.\\n\\n> The Amazon SNS topic owner must be same as the DAX cluster owner.","ParameterGroupName":"The parameter group to be associated with the DAX cluster.","PreferredMaintenanceWindow":"A range of time when maintenance of DAX cluster software will be performed. For example: `sun:01:00-sun:09:00` . Cluster maintenance normally takes less than 30 minutes, and is performed automatically within the maintenance window.","ReplicationFactor":"The number of nodes in the DAX cluster. A replication factor of 1 will create a single-node cluster, without any read replicas. For additional fault tolerance, you can create a multiple node cluster with one or more read replicas. To do this, set `ReplicationFactor` to a number between 3 (one primary and two read replicas) and 10 (one primary and nine read replicas). `If the AvailabilityZones` parameter is provided, its length must equal the `ReplicationFactor` .\\n\\n> AWS recommends that you have at least two read replicas per cluster.","SSESpecification":"Represents the settings used to enable server-side encryption on the cluster.","SecurityGroupIds":"A list of security group IDs to be assigned to each node in the DAX cluster. (Each of the security group ID is system-generated.)\\n\\nIf this parameter is not specified, DAX assigns the default VPC security group to each node.","SubnetGroupName":"The name of the subnet group to be used for the replication group.\\n\\n> DAX clusters can only run in an Amazon VPC environment. All of the subnets that you specify in a subnet group must exist in the same VPC.","Tags":"A set of tags to associate with the DAX cluster."}},"AWS::DAX::Cluster.SSESpecification":{"attributes":{},"description":"Represents the settings used to enable server-side encryption.","properties":{"SSEEnabled":"Indicates whether server-side encryption is enabled (true) or disabled (false) on the cluster."}},"AWS::DAX::ParameterGroup":{"attributes":{"Ref":"`Ref` returns the name of the created parameter group. For example:\\n\\n`{ \\"Ref\\": \\" MyDAXParameterGroup \\" }` \\n\\nReturns a value similar to the following:\\n\\n`my-dax-parameter-group`"},"description":"A named set of parameters that are applied to all of the nodes in a DAX cluster.","properties":{"Description":"A description of the parameter group.","ParameterGroupName":"The name of the parameter group.","ParameterNameValues":"An array of name-value pairs for the parameters in the group. Each element in the array represents a single parameter.\\n\\n> `record-ttl-millis` and `query-ttl-millis` are the only supported parameter names. For more details, see [Configuring TTL Settings](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DAX.cluster-management.html#DAX.cluster-management.custom-settings.ttl) ."}},"AWS::DAX::SubnetGroup":{"attributes":{"Ref":"`Ref` returns the name of the created subnet group. For example\\n\\n`{ \\"Ref\\": \\" MyDAXSubnetGroup \\" }` \\n\\nReturns a value similar to the following:\\n\\n`my-dax-subnet-group`"},"description":"Creates a new subnet group.","properties":{"Description":"The description of the subnet group.","SubnetGroupName":"The name of the subnet group.","SubnetIds":"A list of VPC subnet IDs for the subnet group."}},"AWS::DLM::LifecyclePolicy":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the lifecycle policy.","Ref":"`Ref` returns the ID of the lifecycle policy."},"description":"Specifies a lifecycle policy, which is used to automate operations on Amazon EBS resources.\\n\\nThe properties are required when you add a lifecycle policy and optional when you update a lifecycle policy.","properties":{"Description":"A description of the lifecycle policy. The characters ^[0-9A-Za-z _-]+$ are supported.","ExecutionRoleArn":"The Amazon Resource Name (ARN) of the IAM role used to run the operations specified by the lifecycle policy.","PolicyDetails":"The configuration details of the lifecycle policy.","State":"The activation state of the lifecycle policy.","Tags":"The tags to apply to the lifecycle policy during creation."}},"AWS::DLM::LifecyclePolicy.Action":{"attributes":{},"description":"*[Event-based policies only]* Specifies an action for an event-based policy.","properties":{"CrossRegionCopy":"The rule for copying shared snapshots across Regions.","Name":"A descriptive name for the action."}},"AWS::DLM::LifecyclePolicy.ArchiveRetainRule":{"attributes":{},"description":"","properties":{"RetentionArchiveTier":""}},"AWS::DLM::LifecyclePolicy.ArchiveRule":{"attributes":{},"description":"","properties":{"RetainRule":""}},"AWS::DLM::LifecyclePolicy.CreateRule":{"attributes":{},"description":"*[Snapshot and AMI policies only]* Specifies when the policy should create snapshots or AMIs.\\n\\n> - You must specify either *CronExpression* , or *Interval* , *IntervalUnit* , and *Times* .\\n> - If you need to specify an `ArchiveRule` for the schedule, then you must specify a creation frequency of at least 28 days.","properties":{"CronExpression":"The schedule, as a Cron expression. The schedule interval must be between 1 hour and 1 year. For more information, see [Cron expressions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions) in the *Amazon CloudWatch User Guide* .","Interval":"The interval between snapshots. The supported values are 1, 2, 3, 4, 6, 8, 12, and 24.","IntervalUnit":"The interval unit.","Location":"*[Snapshot policies only]* Specifies the destination for snapshots created by the policy. To create snapshots in the same Region as the source resource, specify `CLOUD` . To create snapshots on the same Outpost as the source resource, specify `OUTPOST_LOCAL` . If you omit this parameter, `CLOUD` is used by default.\\n\\nIf the policy targets resources in an AWS Region , then you must create snapshots in the same Region as the source resource. If the policy targets resources on an Outpost, then you can create snapshots on the same Outpost as the source resource, or in the Region of that Outpost.","Times":"The time, in UTC, to start the operation. The supported format is hh:mm.\\n\\nThe operation occurs within a one-hour window following the specified time. If you do not specify a time, Amazon Data Lifecycle Manager selects a time within the next 24 hours."}},"AWS::DLM::LifecyclePolicy.CrossRegionCopyAction":{"attributes":{},"description":"*[Event-based policies only]* Specifies a cross-Region copy action for event-based policies.\\n\\n> To specify a cross-Region copy rule for snapshot and AMI policies, use `CrossRegionCopyRule` .","properties":{"EncryptionConfiguration":"The encryption settings for the copied snapshot.","RetainRule":"Specifies a retention rule for cross-Region snapshot copies created by snapshot or event-based policies, or cross-Region AMI copies created by AMI policies. After the retention period expires, the cross-Region copy is deleted.","Target":"The target Region."}},"AWS::DLM::LifecyclePolicy.CrossRegionCopyDeprecateRule":{"attributes":{},"description":"","properties":{"Interval":"","IntervalUnit":""}},"AWS::DLM::LifecyclePolicy.CrossRegionCopyRetainRule":{"attributes":{},"description":"Specifies a retention rule for cross-Region snapshot copies created by snapshot or event-based policies, or cross-Region AMI copies created by AMI policies. After the retention period expires, the cross-Region copy is deleted.","properties":{"Interval":"The amount of time to retain a cross-Region snapshot or AMI copy. The maximum is 100 years. This is equivalent to 1200 months, 5200 weeks, or 36500 days.","IntervalUnit":"The unit of time for time-based retention. For example, to retain a cross-Region copy for 3 months, specify `Interval=3` and `IntervalUnit=MONTHS` ."}},"AWS::DLM::LifecyclePolicy.CrossRegionCopyRule":{"attributes":{},"description":"*[Snapshot and AMI policies only]* Specifies a cross-Region copy rule for snapshot and AMI policies.\\n\\n> To specify a cross-Region copy action for event-based polices, use `CrossRegionCopyAction` .","properties":{"CmkArn":"The Amazon Resource Name (ARN) of the AWS KMS key to use for EBS encryption. If this parameter is not specified, the default KMS key for the account is used.","CopyTags":"Indicates whether to copy all user-defined tags from the source snapshot or AMI to the cross-Region copy.","DeprecateRule":"","Encrypted":"To encrypt a copy of an unencrypted snapshot if encryption by default is not enabled, enable encryption using this parameter. Copies of encrypted snapshots are encrypted, even if this parameter is false or if encryption by default is not enabled.","RetainRule":"The retention rule that indicates how long the cross-Region snapshot or AMI copies are to be retained in the destination Region.","Target":"The target Region or the Amazon Resource Name (ARN) of the target Outpost for the snapshot copies.\\n\\nUse this parameter instead of *TargetRegion* . Do not specify both.","TargetRegion":"> Avoid using this parameter when creating new policies. Instead, use *Target* to specify a target Region or a target Outpost for snapshot copies.\\n> \\n> For policies created before the *Target* parameter was introduced, this parameter indicates the target Region for snapshot copies."}},"AWS::DLM::LifecyclePolicy.DeprecateRule":{"attributes":{},"description":"","properties":{"Count":"","Interval":"","IntervalUnit":""}},"AWS::DLM::LifecyclePolicy.EncryptionConfiguration":{"attributes":{},"description":"*[Event-based policies only]* Specifies the encryption settings for cross-Region snapshot copies created by event-based policies.","properties":{"CmkArn":"The Amazon Resource Name (ARN) of the AWS KMS key to use for EBS encryption. If this parameter is not specified, the default KMS key for the account is used.","Encrypted":"To encrypt a copy of an unencrypted snapshot when encryption by default is not enabled, enable encryption using this parameter. Copies of encrypted snapshots are encrypted, even if this parameter is false or when encryption by default is not enabled."}},"AWS::DLM::LifecyclePolicy.EventParameters":{"attributes":{},"description":"*[Event-based policies only]* Specifies an event that activates an event-based policy.","properties":{"DescriptionRegex":"The snapshot description that can trigger the policy. The description pattern is specified using a regular expression. The policy runs only if a snapshot with a description that matches the specified pattern is shared with your account.\\n\\nFor example, specifying `^.*Created for policy: policy-1234567890abcdef0.*$` configures the policy to run only if snapshots created by policy `policy-1234567890abcdef0` are shared with your account.","EventType":"The type of event. Currently, only snapshot sharing events are supported.","SnapshotOwner":"The IDs of the AWS accounts that can trigger policy by sharing snapshots with your account. The policy only runs if one of the specified AWS accounts shares a snapshot with your account."}},"AWS::DLM::LifecyclePolicy.EventSource":{"attributes":{},"description":"*[Event-based policies only]* Specifies an event that activates an event-based policy.","properties":{"Parameters":"Information about the event.","Type":"The source of the event. Currently only managed CloudWatch Events rules are supported."}},"AWS::DLM::LifecyclePolicy.FastRestoreRule":{"attributes":{},"description":"*[Snapshot policies only]* Specifies a rule for enabling fast snapshot restore for snapshots created by snapshot policies. You can enable fast snapshot restore based on either a count or a time interval.","properties":{"AvailabilityZones":"The Availability Zones in which to enable fast snapshot restore.","Count":"The number of snapshots to be enabled with fast snapshot restore.","Interval":"The amount of time to enable fast snapshot restore. The maximum is 100 years. This is equivalent to 1200 months, 5200 weeks, or 36500 days.","IntervalUnit":"The unit of time for enabling fast snapshot restore."}},"AWS::DLM::LifecyclePolicy.Parameters":{"attributes":{},"description":"*[Snapshot and AMI policies only]* Specifies optional parameters for snapshot and AMI policies. The set of valid parameters depends on the combination of policy type and target resource type.\\n\\nIf you choose to exclude boot volumes and you specify tags that consequently exclude all of the additional data volumes attached to an instance, then Amazon Data Lifecycle Manager will not create any snapshots for the affected instance, and it will emit a `SnapshotsCreateFailed` Amazon CloudWatch metric. For more information, see [Monitor your policies using Amazon CloudWatch](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitor-dlm-cw-metrics.html) .","properties":{"ExcludeBootVolume":"*[Snapshot policies that target instances only]* Indicates whether to exclude the root volume from multi-volume snapshot sets. The default is `false` . If you specify `true` , then the root volumes attached to targeted instances will be excluded from the multi-volume snapshot sets created by the policy.","ExcludeDataVolumeTags":"","NoReboot":"*[AMI policies only]* Indicates whether targeted instances are rebooted when the lifecycle policy runs. `true` indicates that targeted instances are not rebooted when the policy runs. `false` indicates that target instances are rebooted when the policy runs. The default is `true` (instances are not rebooted)."}},"AWS::DLM::LifecyclePolicy.PolicyDetails":{"attributes":{},"description":"*[All policy types]* Specifies the configuration of a lifecycle policy.","properties":{"Actions":"*[Event-based policies only]* The actions to be performed when the event-based policy is activated. You can specify only one action per policy.","EventSource":"*[Event-based policies only]* The event that activates the event-based policy.","Parameters":"*[Snapshot and AMI policies only]* A set of optional parameters for snapshot and AMI lifecycle policies.\\n\\n> If you are modifying a policy that was created or previously modified using the Amazon Data Lifecycle Manager console, then you must include this parameter and specify either the default values or the new values that you require. You can\'t omit this parameter or set its values to null.","PolicyType":"*[All policy types]* The valid target resource types and actions a policy can manage. Specify `EBS_SNAPSHOT_MANAGEMENT` to create a lifecycle policy that manages the lifecycle of Amazon EBS snapshots. Specify `IMAGE_MANAGEMENT` to create a lifecycle policy that manages the lifecycle of EBS-backed AMIs. Specify `EVENT_BASED_POLICY` to create an event-based policy that performs specific actions when a defined event occurs in your AWS account .\\n\\nThe default is `EBS_SNAPSHOT_MANAGEMENT` .","ResourceLocations":"*[Snapshot and AMI policies only]* The location of the resources to backup. If the source resources are located in an AWS Region , specify `CLOUD` . If the source resources are located on an Outpost in your account, specify `OUTPOST` .\\n\\nIf you specify `OUTPOST` , Amazon Data Lifecycle Manager backs up all resources of the specified type with matching target tags across all of the Outposts in your account.","ResourceTypes":"*[Snapshot policies only]* The target resource type for snapshot and AMI lifecycle policies. Use `VOLUME` to create snapshots of individual volumes or use `INSTANCE` to create multi-volume snapshots from the volumes for an instance.","Schedules":"*[Snapshot and AMI policies only]* The schedules of policy-defined actions for snapshot and AMI lifecycle policies. A policy can have up to four schedules—one mandatory schedule and up to three optional schedules.","TargetTags":"*[Snapshot and AMI policies only]* The single tag that identifies targeted resources for this policy."}},"AWS::DLM::LifecyclePolicy.RetainRule":{"attributes":{},"description":"*[Snapshot and AMI policies only]* Specifies a retention rule for snapshots created by snapshot policies, or for AMIs created by AMI policies.\\n\\n> For snapshot policies that have an `ArchiveRule` , this retention rule applies to standard tier retention. When the retention threshold is met, snapshots are moved from the standard to the archive tier.\\n> \\n> For snapshot policies that do not have an *ArchiveRule* , snapshots are permanently deleted when this retention threshold is met. \\n\\nYou can retain snapshots based on either a count or a time interval.\\n\\n- *Count-based retention*\\n\\nYou must specify *Count* . If you specify an `ArchiveRule` for the schedule, then you can specify a retention count of `0` to archive snapshots immediately after creation. If you specify a `FastRestoreRule` , `ShareRule` , or a `CrossRegionCopyRule` , then you must specify a retention count of `1` or more.\\n- *Age-based retention*\\n\\nYou must specify *Interval* and *IntervalUnit* . If you specify an `ArchiveRule` for the schedule, then you can specify a retention interval of `0` days to archive snapshots immediately after creation. If you specify a `FastRestoreRule` , `ShareRule` , or a `CrossRegionCopyRule` , then you must specify a retention interval of `1` day or more.","properties":{"Count":"The number of snapshots to retain for each volume, up to a maximum of 1000. For example if you want to retain a maximum of three snapshots, specify `3` . When the fourth snapshot is created, the oldest retained snapshot is deleted, or it is moved to the archive tier if you have specified an `ArchiveRule` .","Interval":"The amount of time to retain each snapshot. The maximum is 100 years. This is equivalent to 1200 months, 5200 weeks, or 36500 days.","IntervalUnit":"The unit of time for time-based retention. For example, to retain snapshots for 3 months, specify `Interval=3` and `IntervalUnit=MONTHS` . Once the snapshot has been retained for 3 months, it is deleted, or it is moved to the archive tier if you have specified an `ArchiveRule` ."}},"AWS::DLM::LifecyclePolicy.RetentionArchiveTier":{"attributes":{},"description":"","properties":{"Count":"","Interval":"","IntervalUnit":""}},"AWS::DLM::LifecyclePolicy.Schedule":{"attributes":{},"description":"*[Snapshot and AMI policies only]* Specifies a schedule for a snapshot or AMI lifecycle policy.","properties":{"ArchiveRule":"","CopyTags":"Copy all user-defined tags on a source volume to snapshots of the volume created by this policy.","CreateRule":"The creation rule.","CrossRegionCopyRules":"Specifies a rule for copying snapshots or AMIs across regions.\\n\\n> You can\'t specify cross-Region copy rules for policies that create snapshots on an Outpost. If the policy creates snapshots in a Region, then snapshots can be copied to up to three Regions or Outposts.","DeprecateRule":"","FastRestoreRule":"*[Snapshot policies only]* The rule for enabling fast snapshot restore.","Name":"The name of the schedule.","RetainRule":"The retention rule for snapshots or AMIs created by the policy.","ShareRules":"*[Snapshot policies only]* The rule for sharing snapshots with other AWS accounts .","TagsToAdd":"The tags to apply to policy-created resources. These user-defined tags are in addition to the AWS -added lifecycle tags.","VariableTags":"*[AMI policies and snapshot policies that target instances only]* A collection of key/value pairs with values determined dynamically when the policy is executed. Keys may be any valid Amazon EC2 tag key. Values must be in one of the two following formats: `$(instance-id)` or `$(timestamp)` . Variable tags are only valid for EBS Snapshot Management – Instance policies."}},"AWS::DLM::LifecyclePolicy.ShareRule":{"attributes":{},"description":"*[Snapshot policies only]* Specifies a rule for sharing snapshots across AWS accounts .","properties":{"TargetAccounts":"The IDs of the AWS accounts with which to share the snapshots.","UnshareInterval":"The period after which snapshots that are shared with other AWS accounts are automatically unshared.","UnshareIntervalUnit":"The unit of time for the automatic unsharing interval."}},"AWS::DMS::Certificate":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the certificate."},"description":"The `AWS::DMS::Certificate` resource creates an Secure Sockets Layer (SSL) certificate that encrypts connections between AWS DMS endpoints and the replication instance.","properties":{"CertificateIdentifier":"A customer-assigned name for the certificate. Identifiers must begin with a letter and must contain only ASCII letters, digits, and hyphens. They can\'t end with a hyphen or contain two consecutive hyphens.","CertificatePem":"The contents of a `.pem` file, which contains an X.509 certificate.","CertificateWallet":"The location of an imported Oracle Wallet certificate for use with SSL. An example is: `filebase64(\\"${path.root}/rds-ca-2019-root.sso\\")`"}},"AWS::DMS::Endpoint":{"attributes":{"ExternalId":"A value that can be used for cross-account validation.","Ref":"`Ref` returns the ARN of the endpoint."},"description":"The `AWS::DMS::Endpoint` resource specifies an AWS DMS endpoint.\\n\\nCurrently, AWS CloudFormation supports all AWS DMS endpoint types.","properties":{"CertificateArn":"The Amazon Resource Name (ARN) for the certificate.","DatabaseName":"The name of the endpoint database. For a MySQL source or target endpoint, don\'t specify `DatabaseName` . To migrate to a specific database, use this setting and `targetDbType` .","DocDbSettings":"Settings in JSON format for the source and target DocumentDB endpoint. For more information about other available settings, see [Using extra connections attributes with Amazon DocumentDB as a source](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.DocumentDB.html#CHAP_Source.DocumentDB.ECAs) and [Using Amazon DocumentDB as a target for AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.DocumentDB.html) in the *AWS Database Migration Service User Guide* .","DynamoDbSettings":"Settings in JSON format for the target Amazon DynamoDB endpoint. For information about other available settings, see [Using object mapping to migrate data to DynamoDB](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.DynamoDB.html#CHAP_Target.DynamoDB.ObjectMapping) in the *AWS Database Migration Service User Guide* .","ElasticsearchSettings":"Settings in JSON format for the target OpenSearch endpoint. For more information about the available settings, see [Extra connection attributes when using OpenSearch as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Elasticsearch.html#CHAP_Target.Elasticsearch.Configuration) in the *AWS Database Migration Service User Guide* .","EndpointIdentifier":"The database endpoint identifier. Identifiers must begin with a letter and must contain only ASCII letters, digits, and hyphens. They can\'t end with a hyphen, or contain two consecutive hyphens.","EndpointType":"The type of endpoint. Valid values are `source` and `target` .","EngineName":"The type of engine for the endpoint, depending on the `EndpointType` value.\\n\\n*Valid values* : `mysql` | `oracle` | `postgres` | `mariadb` | `aurora` | `aurora-postgresql` | `opensearch` | `redshift` | `s3` | `db2` | `azuredb` | `sybase` | `dynamodb` | `mongodb` | `kinesis` | `kafka` | `elasticsearch` | `docdb` | `sqlserver` | `neptune`","ExtraConnectionAttributes":"Additional attributes associated with the connection. Each attribute is specified as a name-value pair associated by an equal sign (=). Multiple attributes are separated by a semicolon (;) with no additional white space. For information on the attributes available for connecting your source or target endpoint, see [Working with AWS DMS Endpoints](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Endpoints.html) in the *AWS Database Migration Service User Guide* .","GcpMySQLSettings":"Settings in JSON format for the source GCP MySQL endpoint. These settings are much the same as the settings for any MySQL-compatible endpoint. For more information, see [Extra connection attributes when using MySQL as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MySQL.html#CHAP_Source.MySQL.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","IbmDb2Settings":"Settings in JSON format for the source IBM Db2 LUW endpoint. For information about other available settings, see [Extra connection attributes when using Db2 LUW as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.DB2.html#CHAP_Source.DB2.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","KafkaSettings":"Settings in JSON format for the target Apache Kafka endpoint. For more information about other available settings, see [Using object mapping to migrate data to a Kafka topic](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Kafka.html#CHAP_Target.Kafka.ObjectMapping) in the *AWS Database Migration Service User Guide* .","KinesisSettings":"Settings in JSON format for the target endpoint for Amazon Kinesis Data Streams. For more information about other available settings, see [Using object mapping to migrate data to a Kinesis data stream](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Kinesis.html#CHAP_Target.Kinesis.ObjectMapping) in the *AWS Database Migration Service User Guide* .","KmsKeyId":"An AWS KMS key identifier that is used to encrypt the connection parameters for the endpoint.\\n\\nIf you don\'t specify a value for the `KmsKeyId` parameter, AWS DMS uses your default encryption key.\\n\\nAWS KMS creates the default encryption key for your AWS account . Your AWS account has a different default encryption key for each AWS Region .","MicrosoftSqlServerSettings":"Settings in JSON format for the source and target Microsoft SQL Server endpoint. For information about other available settings, see [Extra connection attributes when using SQL Server as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.SQLServer.html#CHAP_Source.SQLServer.ConnectionAttrib) and [Extra connection attributes when using SQL Server as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.SQLServer.html#CHAP_Target.SQLServer.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","MongoDbSettings":"Settings in JSON format for the source MongoDB endpoint. For more information about the available settings, see [Using MongoDB as a target for AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MongoDB.html#CHAP_Source.MongoDB.Configuration) in the *AWS Database Migration Service User Guide* .","MySqlSettings":"Settings in JSON format for the source and target MySQL endpoint. For information about other available settings, see [Extra connection attributes when using MySQL as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MySQL.html#CHAP_Source.MySQL.ConnectionAttrib) and [Extra connection attributes when using a MySQL-compatible database as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.MySQL.html#CHAP_Target.MySQL.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","NeptuneSettings":"Settings in JSON format for the target Amazon Neptune endpoint. For more information about the available settings, see [Specifying endpoint settings for Amazon Neptune as a target](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Neptune.html#CHAP_Target.Neptune.EndpointSettings) in the *AWS Database Migration Service User Guide* .","OracleSettings":"Settings in JSON format for the source and target Oracle endpoint. For information about other available settings, see [Extra connection attributes when using Oracle as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html#CHAP_Source.Oracle.ConnectionAttrib) and [Extra connection attributes when using Oracle as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Oracle.html#CHAP_Target.Oracle.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","Password":"The password to be used to log in to the endpoint database.","Port":"The port used by the endpoint database.","PostgreSqlSettings":"Settings in JSON format for the source and target PostgreSQL endpoint.\\n\\nFor information about other available settings, see [Extra connection attributes when using PostgreSQL as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.ConnectionAttrib) and [Extra connection attributes when using PostgreSQL as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html#CHAP_Target.PostgreSQL.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","RedisSettings":"Settings in JSON format for the target Redis endpoint. For information about other available settings, see [Specifying endpoint settings for Redis as a target](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Redis.html#CHAP_Target.Redis.EndpointSettings) in the *AWS Database Migration Service User Guide* .","RedshiftSettings":"Settings in JSON format for the Amazon Redshift endpoint.\\n\\nFor more information about other available settings, see [Extra connection attributes when using Amazon Redshift as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Redshift.html#CHAP_Target.Redshift.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","ResourceIdentifier":"A display name for the resource identifier at the end of the `EndpointArn` response parameter that is returned in the created `Endpoint` object. The value for this parameter can have up to 31 characters. It can contain only ASCII letters, digits, and hyphen (\'-\'). Also, it can\'t end with a hyphen or contain two consecutive hyphens, and can only begin with a letter, such as `Example-App-ARN1` .\\n\\nFor example, this value might result in the `EndpointArn` value `arn:aws:dms:eu-west-1:012345678901:rep:Example-App-ARN1` . If you don\'t specify a `ResourceIdentifier` value, AWS DMS generates a default identifier value for the end of `EndpointArn` .","S3Settings":"Settings in JSON format for the source and target Amazon S3 endpoint. For more information about other available settings, see [Extra connection attributes when using Amazon S3 as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.S3.html#CHAP_Source.S3.Configuring) and [Extra connection attributes when using Amazon S3 as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.S3.html#CHAP_Target.S3.Configuring) in the *AWS Database Migration Service User Guide* .","ServerName":"The name of the server where the endpoint database resides.","SslMode":"The Secure Sockets Layer (SSL) mode to use for the SSL connection. The default is `none` .\\n\\n> When `engine_name` is set to S3, the only allowed value is `none` .","SybaseSettings":"Settings in JSON format for the source and target SAP ASE endpoint. For information about other available settings, see [Extra connection attributes when using SAP ASE as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.SAP.html#CHAP_Source.SAP.ConnectionAttrib) and [Extra connection attributes when using SAP ASE as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.SAP.html#CHAP_Target.SAP.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","Tags":"One or more tags to be assigned to the endpoint.","Username":"The user name to be used to log in to the endpoint database."}},"AWS::DMS::Endpoint.DocDbSettings":{"attributes":{},"description":"Provides information that defines a DocumentDB endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For more information about other available settings, see [Using extra connections attributes with Amazon DocumentDB as a source](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.DocumentDB.html#CHAP_Source.DocumentDB.ECAs) and [Using Amazon DocumentDB as a target for AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.DocumentDB.html) in the *AWS Database Migration Service User Guide* .","properties":{"DocsToInvestigate":"Indicates the number of documents to preview to determine the document organization. Use this setting when `NestingLevel` is set to `\\"one\\"` .\\n\\nMust be a positive value greater than `0` . Default value is `1000` .","ExtractDocId":"Specifies the document ID. Use this setting when `NestingLevel` is set to `\\"none\\"` .\\n\\nDefault value is `\\"false\\"` .","NestingLevel":"Specifies either document or table mode.\\n\\nDefault value is `\\"none\\"` . Specify `\\"none\\"` to use document mode. Specify `\\"one\\"` to use table mode.","SecretsManagerAccessRoleArn":"The full Amazon Resource Name (ARN) of the IAM role that specifies AWS DMS as the trusted entity and grants the required permissions to access the value in `SecretsManagerSecret` . The role must allow the `iam:PassRole` action. `SecretsManagerSecret` has the value of the AWS Secrets Manager secret that allows access to the DocumentDB endpoint.\\n\\n> You can specify one of two sets of values for these permissions. You can specify the values for this setting and `SecretsManagerSecretId` . Or you can specify clear-text values for `UserName` , `Password` , `ServerName` , and `Port` . You can\'t specify both.\\n> \\n> For more information on creating this `SecretsManagerSecret` , the corresponding `SecretsManagerAccessRoleArn` , and the `SecretsManagerSecretId` that is required to access it, see [Using secrets to access AWS Database Migration Service resources](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.html#security-iam-secretsmanager) in the *AWS Database Migration Service User Guide* .","SecretsManagerSecretId":"The full ARN, partial ARN, or display name of the `SecretsManagerSecret` that contains the DocumentDB endpoint connection details."}},"AWS::DMS::Endpoint.DynamoDbSettings":{"attributes":{},"description":"Provides information, including the Amazon Resource Name (ARN) of the IAM role used to define an Amazon DynamoDB target endpoint. This information also includes the output format of records applied to the endpoint and details of transaction and control table data information. For information about other available settings, see [Using object mapping to migrate data to DynamoDB](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.DynamoDB.html#CHAP_Target.DynamoDB.ObjectMapping) in the *AWS Database Migration Service User Guide* .","properties":{"ServiceAccessRoleArn":"The Amazon Resource Name (ARN) used by the service to access the IAM role. The role must allow the `iam:PassRole` action."}},"AWS::DMS::Endpoint.ElasticsearchSettings":{"attributes":{},"description":"Provides information that defines an OpenSearch endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For more information about the available settings, see [Extra connection attributes when using OpenSearch as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Elasticsearch.html#CHAP_Target.Elasticsearch.Configuration) in the *AWS Database Migration Service User Guide* .","properties":{"EndpointUri":"The endpoint for the OpenSearch cluster. AWS DMS uses HTTPS if a transport protocol (either HTTP or HTTPS) isn\'t specified.","ErrorRetryDuration":"The maximum number of seconds for which DMS retries failed API requests to the OpenSearch cluster.","FullLoadErrorPercentage":"The maximum percentage of records that can fail to be written before a full load operation stops.\\n\\nTo avoid early failure, this counter is only effective after 1,000 records are transferred. OpenSearch also has the concept of error monitoring during the last 10 minutes of an Observation Window. If transfer of all records fail in the last 10 minutes, the full load operation stops.","ServiceAccessRoleArn":"The Amazon Resource Name (ARN) used by the service to access the IAM role. The role must allow the `iam:PassRole` action."}},"AWS::DMS::Endpoint.GcpMySQLSettings":{"attributes":{},"description":"Provides information that defines a GCP MySQL endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. These settings are much the same as the settings for any MySQL-compatible endpoint. For more information, see [Extra connection attributes when using MySQL as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MySQL.html#CHAP_Source.MySQL.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","properties":{"AfterConnectScript":"Specifies a script to run immediately after AWS DMS connects to the endpoint. The migration task continues running regardless if the SQL statement succeeds or fails.\\n\\nFor this parameter, provide the code of the script itself, not the name of a file containing the script.","CleanSourceMetadataOnMismatch":"Adjusts the behavior of AWS DMS when migrating from an SQL Server source database that is hosted as part of an Always On availability group cluster. If you need AWS DMS to poll all the nodes in the Always On cluster for transaction backups, set this attribute to `false` .","DatabaseName":"Database name for the endpoint. For a MySQL source or target endpoint, don\'t explicitly specify the database using the `DatabaseName` request parameter on either the `CreateEndpoint` or `ModifyEndpoint` API call. Specifying `DatabaseName` when you create or modify a MySQL endpoint replicates all the task tables to this single database. For MySQL endpoints, you specify the database only when you specify the schema in the table-mapping rules of the AWS DMS task.","EventsPollInterval":"Specifies how often to check the binary log for new changes/events when the database is idle. The default is five seconds.\\n\\nExample: `eventsPollInterval=5;`\\n\\nIn the example, AWS DMS checks for changes in the binary logs every five seconds.","MaxFileSize":"Specifies the maximum size (in KB) of any .csv file used to transfer data to a MySQL-compatible database.\\n\\nExample: `maxFileSize=512`","ParallelLoadThreads":"Improves performance when loading data into the MySQL-compatible target database. Specifies how many threads to use to load the data into the MySQL-compatible target database. Setting a large number of threads can have an adverse effect on database performance, because a separate connection is required for each thread. The default is one.\\n\\nExample: `parallelLoadThreads=1`","Password":"Endpoint connection password.","Port":"The port used by the endpoint database.","SecretsManagerAccessRoleArn":"The full Amazon Resource Name (ARN) of the IAM role that specifies AWS DMS as the trusted entity and grants the required permissions to access the value in `SecretsManagerSecret.` The role must allow the `iam:PassRole` action. `SecretsManagerSecret` has the value of the AWS Secrets Manager secret that allows access to the MySQL endpoint.\\n\\n> You can specify one of two sets of values for these permissions. You can specify the values for this setting and `SecretsManagerSecretId` . Or you can specify clear-text values for `UserName` , `Password` , `ServerName` , and `Port` . You can\'t specify both.\\n> \\n> For more information on creating this `SecretsManagerSecret` , the corresponding `SecretsManagerAccessRoleArn` , and the `SecretsManagerSecretId` required to access it, see [Using secrets to access AWS Database Migration Service resources](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.html#security-iam-secretsmanager) in the *AWS Database Migration Service User Guide* .","SecretsManagerSecretId":"The full ARN, partial ARN, or display name of the `SecretsManagerSecret` that contains the MySQL endpoint connection details.","ServerName":"Endpoint TCP port.","ServerTimezone":"Specifies the time zone for the source MySQL database. Don\'t enclose time zones in single quotation marks.\\n\\nExample: `serverTimezone=US/Pacific;`","Username":"Endpoint connection user name."}},"AWS::DMS::Endpoint.IbmDb2Settings":{"attributes":{},"description":"Provides information that defines an IBMDB2 endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For more information about other available settings, see [Extra connection attributes when using Db2 LUW as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.DB2.html#CHAP_Source.DB2.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","properties":{"CurrentLsn":"For ongoing replication (CDC), use CurrentLSN to specify a log sequence number (LSN) where you want the replication to start.","MaxKBytesPerRead":"Maximum number of bytes per read, as a NUMBER value. The default is 64 KB.","SecretsManagerAccessRoleArn":"The full Amazon Resource Name (ARN) of the IAM role that specifies AWS DMS as the trusted entity and grants the required permissions to access the value in `SecretsManagerSecret` . The role must allow the `iam:PassRole` action. `SecretsManagerSecret` has the value ofthe AWS Secrets Manager secret that allows access to the Db2 LUW endpoint.\\n\\n> You can specify one of two sets of values for these permissions. You can specify the values for this setting and `SecretsManagerSecretId` . Or you can specify clear-text values for `UserName` , `Password` , `ServerName` , and `Port` . You can\'t specify both.\\n> \\n> For more information on creating this `SecretsManagerSecret` , the corresponding `SecretsManagerAccessRoleArn` , and the `SecretsManagerSecretId` that is required to access it, see [Using secrets to access AWS Database Migration Service resources](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.html#security-iam-secretsmanager) in the *AWS Database Migration Service User Guide* .","SecretsManagerSecretId":"The full ARN, partial ARN, or display name of the `SecretsManagerSecret` that contains the IBMDB2 endpoint connection details.","SetDataCaptureChanges":"Enables ongoing replication (CDC) as a BOOLEAN value. The default is true."}},"AWS::DMS::Endpoint.KafkaSettings":{"attributes":{},"description":"Provides information that describes an Apache Kafka endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For more information about other available settings, see [Using object mapping to migrate data to a Kafka topic](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Kafka.html#CHAP_Target.Kafka.ObjectMapping) in the *AWS Database Migration Service User Guide* .","properties":{"Broker":"A comma-separated list of one or more broker locations in your Kafka cluster that host your Kafka instance. Specify each broker location in the form `*broker-hostname-or-ip* : *port*` . For example, `\\"ec2-12-345-678-901.compute-1.amazonaws.com:2345\\"` . For more information and examples of specifying a list of broker locations, see [Using Apache Kafka as a target for AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Kafka.html) in the *AWS Database Migration Service User Guide* .","IncludeControlDetails":"Shows detailed control information for table definition, column definition, and table and column changes in the Kafka message output. The default is `false` .","IncludeNullAndEmpty":"Include NULL and empty columns for records migrated to the endpoint. The default is `false` .","IncludePartitionValue":"Shows the partition value within the Kafka message output unless the partition type is `schema-table-type` . The default is `false` .","IncludeTableAlterOperations":"Includes any data definition language (DDL) operations that change the table in the control data, such as `rename-table` , `drop-table` , `add-column` , `drop-column` , and `rename-column` . The default is `false` .","IncludeTransactionDetails":"Provides detailed transaction information from the source database. This information includes a commit timestamp, a log position, and values for `transaction_id` , previous `transaction_id` , and `transaction_record_id` (the record offset within a transaction). The default is `false` .","MessageFormat":"The output format for the records created on the endpoint. The message format is `JSON` (default) or `JSON_UNFORMATTED` (a single line with no tab).","MessageMaxBytes":"The maximum size in bytes for records created on the endpoint The default is 1,000,000.","NoHexPrefix":"Set this optional parameter to `true` to avoid adding a \'0x\' prefix to raw data in hexadecimal format. For example, by default, AWS DMS adds a \'0x\' prefix to the LOB column type in hexadecimal format moving from an Oracle source to a Kafka target. Use the `NoHexPrefix` endpoint setting to enable migration of RAW data type columns without adding the \'0x\' prefix.","PartitionIncludeSchemaTable":"Prefixes schema and table names to partition values, when the partition type is `primary-key-type` . Doing this increases data distribution among Kafka partitions. For example, suppose that a SysBench schema has thousands of tables and each table has only limited range for a primary key. In this case, the same primary key is sent from thousands of tables to the same partition, which causes throttling. The default is `false` .","SaslPassword":"The secure password that you created when you first set up your Amazon MSK cluster to validate a client identity and make an encrypted connection between server and client using SASL-SSL authentication.","SaslUserName":"The secure user name you created when you first set up your Amazon MSK cluster to validate a client identity and make an encrypted connection between server and client using SASL-SSL authentication.","SecurityProtocol":"Set secure connection to a Kafka target endpoint using Transport Layer Security (TLS). Options include `ssl-encryption` , `ssl-authentication` , and `sasl-ssl` . `sasl-ssl` requires `SaslUsername` and `SaslPassword` .","SslCaCertificateArn":"The Amazon Resource Name (ARN) for the private certificate authority (CA) cert that AWS DMS uses to securely connect to your Kafka target endpoint.","SslClientCertificateArn":"The Amazon Resource Name (ARN) of the client certificate used to securely connect to a Kafka target endpoint.","SslClientKeyArn":"The Amazon Resource Name (ARN) for the client private key used to securely connect to a Kafka target endpoint.","SslClientKeyPassword":"The password for the client private key used to securely connect to a Kafka target endpoint.","Topic":"The topic to which you migrate the data. If you don\'t specify a topic, AWS DMS specifies `\\"kafka-default-topic\\"` as the migration topic."}},"AWS::DMS::Endpoint.KinesisSettings":{"attributes":{},"description":"Provides information that describes an Amazon Kinesis Data Stream endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For more information about other available settings, see [Using object mapping to migrate data to a Kinesis data stream](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Kinesis.html#CHAP_Target.Kinesis.ObjectMapping) in the *AWS Database Migration Service User Guide* .","properties":{"IncludeControlDetails":"Shows detailed control information for table definition, column definition, and table and column changes in the Kinesis message output. The default is `false` .","IncludeNullAndEmpty":"Include NULL and empty columns for records migrated to the endpoint. The default is `false` .","IncludePartitionValue":"Shows the partition value within the Kinesis message output, unless the partition type is `schema-table-type` . The default is `false` .","IncludeTableAlterOperations":"Includes any data definition language (DDL) operations that change the table in the control data, such as `rename-table` , `drop-table` , `add-column` , `drop-column` , and `rename-column` . The default is `false` .","IncludeTransactionDetails":"Provides detailed transaction information from the source database. This information includes a commit timestamp, a log position, and values for `transaction_id` , previous `transaction_id` , and `transaction_record_id` (the record offset within a transaction). The default is `false` .","MessageFormat":"The output format for the records created on the endpoint. The message format is `JSON` (default) or `JSON_UNFORMATTED` (a single line with no tab).","NoHexPrefix":"Set this optional parameter to `true` to avoid adding a \'0x\' prefix to raw data in hexadecimal format. For example, by default, AWS DMS adds a \'0x\' prefix to the LOB column type in hexadecimal format moving from an Oracle source to an Amazon Kinesis target. Use the `NoHexPrefix` endpoint setting to enable migration of RAW data type columns without adding the \'0x\' prefix.","PartitionIncludeSchemaTable":"Prefixes schema and table names to partition values, when the partition type is `primary-key-type` . Doing this increases data distribution among Kinesis shards. For example, suppose that a SysBench schema has thousands of tables and each table has only limited range for a primary key. In this case, the same primary key is sent from thousands of tables to the same shard, which causes throttling. The default is `false` .","ServiceAccessRoleArn":"The Amazon Resource Name (ARN) for the IAM role that AWS DMS uses to write to the Kinesis data stream. The role must allow the `iam:PassRole` action.","StreamArn":"The Amazon Resource Name (ARN) for the Amazon Kinesis Data Streams endpoint."}},"AWS::DMS::Endpoint.MicrosoftSqlServerSettings":{"attributes":{},"description":"Provides information that defines a Microsoft SQL Server endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For information about other available settings, see [Extra connection attributes when using SQL Server as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.SQLServer.html#CHAP_Source.SQLServer.ConnectionAttrib) and [Extra connection attributes when using SQL Server as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.SQLServer.html#CHAP_Target.SQLServer.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","properties":{"BcpPacketSize":"The maximum size of the packets (in bytes) used to transfer data using BCP.","ControlTablesFileGroup":"Specifies a file group for the AWS DMS internal tables. When the replication task starts, all the internal AWS DMS control tables (awsdms_ apply_exception, awsdms_apply, awsdms_changes) are created for the specified file group.","QuerySingleAlwaysOnNode":"Cleans and recreates table metadata information on the replication instance when a mismatch occurs. An example is a situation where running an alter DDL statement on a table might result in different information about the table cached in the replication instance.","ReadBackupOnly":"When this attribute is set to `Y` , AWS DMS only reads changes from transaction log backups and doesn\'t read from the active transaction log file during ongoing replication. Setting this parameter to `Y` enables you to control active transaction log file growth during full load and ongoing replication tasks. However, it can add some source latency to ongoing replication.","SafeguardPolicy":"Use this attribute to minimize the need to access the backup log and enable AWS DMS to prevent truncation using one of the following two methods.\\n\\n*Start transactions in the database:* This is the default method. When this method is used, AWS DMS prevents TLOG truncation by mimicking a transaction in the database. As long as such a transaction is open, changes that appear after the transaction started aren\'t truncated. If you need Microsoft Replication to be enabled in your database, then you must choose this method.\\n\\n*Exclusively use sp_repldone within a single task* : When this method is used, AWS DMS reads the changes and then uses sp_repldone to mark the TLOG transactions as ready for truncation. Although this method doesn\'t involve any transactional activities, it can only be used when Microsoft Replication isn\'t running. Also, when using this method, only one AWS DMS task can access the database at any given time. Therefore, if you need to run parallel AWS DMS tasks against the same database, use the default method.","SecretsManagerAccessRoleArn":"The full Amazon Resource Name (ARN) of the IAM role that specifies AWS DMS as the trusted entity and grants the required permissions to access the value in `SecretsManagerSecret` . The role must allow the `iam:PassRole` action. `SecretsManagerSecret` has the value of the AWS Secrets Manager secret that allows access to the SQL Server endpoint.\\n\\n> You can specify one of two sets of values for these permissions. You can specify the values for this setting and `SecretsManagerSecretId` . Or you can specify clear-text values for `UserName` , `Password` , `ServerName` , and `Port` . You can\'t specify both.\\n> \\n> For more information on creating this `SecretsManagerSecret` , the corresponding `SecretsManagerAccessRoleArn` , and the `SecretsManagerSecretId` that is required to access it, see [Using secrets to access AWS Database Migration Service resources](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.html#security-iam-secretsmanager) in the *AWS Database Migration Service User Guide* .","SecretsManagerSecretId":"The full ARN, partial ARN, or display name of the `SecretsManagerSecret` that contains the MicrosoftSQLServer endpoint connection details.","UseBcpFullLoad":"Use this to attribute to transfer data for full-load operations using BCP. When the target table contains an identity column that does not exist in the source table, you must disable the use BCP for loading table option.","UseThirdPartyBackupDevice":"When this attribute is set to `Y` , DMS processes third-party transaction log backups if they are created in native format."}},"AWS::DMS::Endpoint.MongoDbSettings":{"attributes":{},"description":"Provides information that defines a MongoDB endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For more information about other available settings, see [Endpoint configuration settings when using MongoDB as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MongoDB.html#CHAP_Source.MongoDB.Configuration) in the *AWS Database Migration Service User Guide* .","properties":{"AuthMechanism":"The authentication mechanism you use to access the MongoDB source endpoint.\\n\\nFor the default value, in MongoDB version 2.x, `\\"default\\"` is `\\"mongodb_cr\\"` . For MongoDB version 3.x or later, `\\"default\\"` is `\\"scram_sha_1\\"` . This setting isn\'t used when `AuthType` is set to `\\"no\\"` .","AuthSource":"The MongoDB database name. This setting isn\'t used when `AuthType` is set to `\\"no\\"` .\\n\\nThe default is `\\"admin\\"` .","AuthType":"The authentication type you use to access the MongoDB source endpoint.\\n\\nWhen set to `\\"no\\"` , user name and password parameters are not used and can be empty.","DatabaseName":"The database name on the MongoDB source endpoint.","DocsToInvestigate":"Indicates the number of documents to preview to determine the document organization. Use this setting when `NestingLevel` is set to `\\"one\\"` .\\n\\nMust be a positive value greater than `0` . Default value is `1000` .","ExtractDocId":"Specifies the document ID. Use this setting when `NestingLevel` is set to `\\"none\\"` .\\n\\nDefault value is `\\"false\\"` .","NestingLevel":"Specifies either document or table mode.\\n\\nDefault value is `\\"none\\"` . Specify `\\"none\\"` to use document mode. Specify `\\"one\\"` to use table mode.","Password":"The password for the user account you use to access the MongoDB source endpoint.","Port":"The port value for the MongoDB source endpoint.","SecretsManagerAccessRoleArn":"The full Amazon Resource Name (ARN) of the IAM role that specifies AWS DMS as the trusted entity and grants the required permissions to access the value in `SecretsManagerSecret` . The role must allow the `iam:PassRole` action. `SecretsManagerSecret` has the value of the AWS Secrets Manager secret that allows access to the MongoDB endpoint.\\n\\n> You can specify one of two sets of values for these permissions. You can specify the values for this setting and `SecretsManagerSecretId` . Or you can specify clear-text values for `UserName` , `Password` , `ServerName` , and `Port` . You can\'t specify both.\\n> \\n> For more information on creating this `SecretsManagerSecret` , the corresponding `SecretsManagerAccessRoleArn` , and the `SecretsManagerSecretId` that is required to access it, see [Using secrets to access AWS Database Migration Service resources](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.html#security-iam-secretsmanager) in the *AWS Database Migration Service User Guide* .","SecretsManagerSecretId":"The full ARN, partial ARN, or display name of the `SecretsManagerSecret` that contains the MongoDB endpoint connection details.","ServerName":"The name of the server on the MongoDB source endpoint.","Username":"The user name you use to access the MongoDB source endpoint."}},"AWS::DMS::Endpoint.MySqlSettings":{"attributes":{},"description":"Provides information that defines a MySQL endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For information about other available settings, see [Extra connection attributes when using MySQL as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MySQL.html#CHAP_Source.MySQL.ConnectionAttrib) and [Extra connection attributes when using a MySQL-compatible database as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.MySQL.html#CHAP_Target.MySQL.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","properties":{"AfterConnectScript":"Specifies a script to run immediately after AWS DMS connects to the endpoint. The migration task continues running regardless if the SQL statement succeeds or fails.\\n\\nFor this parameter, provide the code of the script itself, not the name of a file containing the script.","CleanSourceMetadataOnMismatch":"Cleans and recreates table metadata information on the replication instance when a mismatch occurs. For example, in a situation where running an alter DDL on the table could result in different information about the table cached in the replication instance.","EventsPollInterval":"Specifies how often to check the binary log for new changes/events when the database is idle. The default is five seconds.\\n\\nExample: `eventsPollInterval=5;`\\n\\nIn the example, AWS DMS checks for changes in the binary logs every five seconds.","MaxFileSize":"Specifies the maximum size (in KB) of any .csv file used to transfer data to a MySQL-compatible database.\\n\\nExample: `maxFileSize=512`","ParallelLoadThreads":"Improves performance when loading data into the MySQL-compatible target database. Specifies how many threads to use to load the data into the MySQL-compatible target database. Setting a large number of threads can have an adverse effect on database performance, because a separate connection is required for each thread. The default is one.\\n\\nExample: `parallelLoadThreads=1`","SecretsManagerAccessRoleArn":"The full Amazon Resource Name (ARN) of the IAM role that specifies AWS DMS as the trusted entity and grants the required permissions to access the value in `SecretsManagerSecret` . The role must allow the `iam:PassRole` action. `SecretsManagerSecret` has the value of the AWS Secrets Manager secret that allows access to the MySQL endpoint.\\n\\n> You can specify one of two sets of values for these permissions. You can specify the values for this setting and `SecretsManagerSecretId` . Or you can specify clear-text values for `UserName` , `Password` , `ServerName` , and `Port` . You can\'t specify both.\\n> \\n> For more information on creating this `SecretsManagerSecret` , the corresponding `SecretsManagerAccessRoleArn` , and the `SecretsManagerSecretId` that is required to access it, see [Using secrets to access AWS Database Migration Service resources](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.html#security-iam-secretsmanager) in the *AWS Database Migration Service User Guide* .","SecretsManagerSecretId":"The full ARN, partial ARN, or display name of the `SecretsManagerSecret` that contains the MySQL endpoint connection details.","ServerTimezone":"Specifies the time zone for the source MySQL database.\\n\\nExample: `serverTimezone=US/Pacific;`\\n\\nNote: Do not enclose time zones in single quotes.","TargetDbType":"Specifies where to migrate source tables on the target, either to a single database or multiple databases. If you specify `SPECIFIC_DATABASE` , specify the database name using the `DatabaseName` parameter of the `Endpoint` object.\\n\\nExample: `targetDbType=MULTIPLE_DATABASES`"}},"AWS::DMS::Endpoint.NeptuneSettings":{"attributes":{},"description":"Provides information that defines an Amazon Neptune endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For more information about the available settings, see [Specifying endpoint settings for Amazon Neptune as a target](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Neptune.html#CHAP_Target.Neptune.EndpointSettings) in the *AWS Database Migration Service User Guide* .","properties":{"ErrorRetryDuration":"The number of milliseconds for AWS DMS to wait to retry a bulk-load of migrated graph data to the Neptune target database before raising an error. The default is 250.","IamAuthEnabled":"If you want IAM authorization enabled for this endpoint, set this parameter to `true` . Then attach the appropriate IAM policy document to your service role specified by `ServiceAccessRoleArn` . The default is `false` .","MaxFileSize":"The maximum size in kilobytes of migrated graph data stored in a .csv file before AWS DMS bulk-loads the data to the Neptune target database. The default is 1,048,576 KB. If the bulk load is successful, AWS DMS clears the bucket, ready to store the next batch of migrated graph data.","MaxRetryCount":"The number of times for AWS DMS to retry a bulk load of migrated graph data to the Neptune target database before raising an error. The default is 5.","S3BucketFolder":"A folder path where you want AWS DMS to store migrated graph data in the S3 bucket specified by `S3BucketName`","S3BucketName":"The name of the Amazon S3 bucket where AWS DMS can temporarily store migrated graph data in .csv files before bulk-loading it to the Neptune target database. AWS DMS maps the SQL source data to graph data before storing it in these .csv files.","ServiceAccessRoleArn":"The Amazon Resource Name (ARN) of the service role that you created for the Neptune target endpoint. The role must allow the `iam:PassRole` action.\\n\\nFor more information, see [Creating an IAM Service Role for Accessing Amazon Neptune as a Target](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Neptune.html#CHAP_Target.Neptune.ServiceRole) in the *AWS Database Migration Service User Guide* ."}},"AWS::DMS::Endpoint.OracleSettings":{"attributes":{},"description":"Provides information that defines an Oracle endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For information about other available settings, see [Extra connection attributes when using Oracle as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html#CHAP_Source.Oracle.ConnectionAttrib) and [Extra connection attributes when using Oracle as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Oracle.html#CHAP_Target.Oracle.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","properties":{"AccessAlternateDirectly":"Set this attribute to `false` in order to use the Binary Reader to capture change data for an Amazon RDS for Oracle as the source. This tells the DMS instance to not access redo logs through any specified path prefix replacement using direct file access.","AddSupplementalLogging":"Set this attribute to set up table-level supplemental logging for the Oracle database. This attribute enables PRIMARY KEY supplemental logging on all tables selected for a migration task.\\n\\nIf you use this option, you still need to enable database-level supplemental logging.","AdditionalArchivedLogDestId":"Set this attribute with `ArchivedLogDestId` in a primary/ standby setup. This attribute is useful in the case of a switchover. In this case, AWS DMS needs to know which destination to get archive redo logs from to read changes. This need arises because the previous primary instance is now a standby instance after switchover.\\n\\nAlthough AWS DMS supports the use of the Oracle `RESETLOGS` option to open the database, never use `RESETLOGS` unless necessary. For additional information about `RESETLOGS` , see [RMAN Data Repair Concepts](https://docs.aws.amazon.com/https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/rman-data-repair-concepts.html#GUID-1805CCF7-4AF2-482D-B65A-998192F89C2B) in the *Oracle Database Backup and Recovery User\'s Guide* .","AllowSelectNestedTables":"Set this attribute to `true` to enable replication of Oracle tables containing columns that are nested tables or defined types.","ArchivedLogDestId":"Specifies the ID of the destination for the archived redo logs. This value should be the same as a number in the dest_id column of the v$archived_log view. If you work with an additional redo log destination, use the `AdditionalArchivedLogDestId` option to specify the additional destination ID. Doing this improves performance by ensuring that the correct logs are accessed from the outset.","ArchivedLogsOnly":"When this field is set to `Y` , AWS DMS only accesses the archived redo logs. If the archived redo logs are stored on Automatic Storage Management (ASM) only, the AWS DMS user account needs to be granted ASM privileges.","AsmPassword":"For an Oracle source endpoint, your Oracle Automatic Storage Management (ASM) password. You can set this value from the `*asm_user_password*` value. You set this value as part of the comma-separated value that you set to the `Password` request parameter when you create the endpoint to access transaction logs using Binary Reader. For more information, see [Configuration for change data capture (CDC) on an Oracle source database](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html#dms/latest/userguide/CHAP_Source.Oracle.html#CHAP_Source.Oracle.CDC.Configuration) .","AsmServer":"For an Oracle source endpoint, your ASM server address. You can set this value from the `asm_server` value. You set `asm_server` as part of the extra connection attribute string to access an Oracle server with Binary Reader that uses ASM. For more information, see [Configuration for change data capture (CDC) on an Oracle source database](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html#dms/latest/userguide/CHAP_Source.Oracle.html#CHAP_Source.Oracle.CDC.Configuration) .","AsmUser":"For an Oracle source endpoint, your ASM user name. You can set this value from the `asm_user` value. You set `asm_user` as part of the extra connection attribute string to access an Oracle server with Binary Reader that uses ASM. For more information, see [Configuration for change data capture (CDC) on an Oracle source database](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html#dms/latest/userguide/CHAP_Source.Oracle.html#CHAP_Source.Oracle.CDC.Configuration) .","CharLengthSemantics":"Specifies whether the length of a character column is in bytes or in characters. To indicate that the character column length is in characters, set this attribute to `CHAR` . Otherwise, the character column length is in bytes.\\n\\nExample: `charLengthSemantics=CHAR;`","DirectPathNoLog":"When set to `true` , this attribute helps to increase the commit rate on the Oracle target database by writing directly to tables and not writing a trail to database logs.","DirectPathParallelLoad":"When set to `true` , this attribute specifies a parallel load when `useDirectPathFullLoad` is set to `Y` . This attribute also only applies when you use the AWS DMS parallel load feature. Note that the target table cannot have any constraints or indexes.","EnableHomogenousTablespace":"Set this attribute to enable homogenous tablespace replication and create existing tables or indexes under the same tablespace on the target.","ExtraArchivedLogDestIds":"Specifies the IDs of one more destinations for one or more archived redo logs. These IDs are the values of the `dest_id` column in the `v$archived_log` view. Use this setting with the `archivedLogDestId` extra connection attribute in a primary-to-single setup or a primary-to-multiple-standby setup.\\n\\nThis setting is useful in a switchover when you use an Oracle Data Guard database as a source. In this case, AWS DMS needs information about what destination to get archive redo logs from to read changes. AWS DMS needs this because after the switchover the previous primary is a standby instance. For example, in a primary-to-single standby setup you might apply the following settings.\\n\\n`archivedLogDestId=1; ExtraArchivedLogDestIds=[2]`\\n\\nIn a primary-to-multiple-standby setup, you might apply the following settings.\\n\\n`archivedLogDestId=1; ExtraArchivedLogDestIds=[2,3,4]`\\n\\nAlthough AWS DMS supports the use of the Oracle `RESETLOGS` option to open the database, never use `RESETLOGS` unless it\'s necessary. For more information about `RESETLOGS` , see [RMAN Data Repair Concepts](https://docs.aws.amazon.com/https://docs.oracle.com/en/database/oracle/oracle-database/19/bradv/rman-data-repair-concepts.html#GUID-1805CCF7-4AF2-482D-B65A-998192F89C2B) in the *Oracle Database Backup and Recovery User\'s Guide* .","FailTasksOnLobTruncation":"When set to `true` , this attribute causes a task to fail if the actual size of an LOB column is greater than the specified `LobMaxSize` .\\n\\nIf a task is set to limited LOB mode and this option is set to `true` , the task fails instead of truncating the LOB data.","NumberDatatypeScale":"Specifies the number scale. You can select a scale up to 38, or you can select FLOAT. By default, the NUMBER data type is converted to precision 38, scale 10.\\n\\nExample: `numberDataTypeScale=12`","OraclePathPrefix":"Set this string attribute to the required value in order to use the Binary Reader to capture change data for an Amazon RDS for Oracle as the source. This value specifies the default Oracle root used to access the redo logs.","ParallelAsmReadThreads":"Set this attribute to change the number of threads that DMS configures to perform a change data capture (CDC) load using Oracle Automatic Storage Management (ASM). You can specify an integer value between 2 (the default) and 8 (the maximum). Use this attribute together with the `readAheadBlocks` attribute.","ReadAheadBlocks":"Set this attribute to change the number of read-ahead blocks that DMS configures to perform a change data capture (CDC) load using Oracle Automatic Storage Management (ASM). You can specify an integer value between 1000 (the default) and 200,000 (the maximum).","ReadTableSpaceName":"When set to `true` , this attribute supports tablespace replication.","ReplacePathPrefix":"Set this attribute to true in order to use the Binary Reader to capture change data for an Amazon RDS for Oracle as the source. This setting tells DMS instance to replace the default Oracle root with the specified `usePathPrefix` setting to access the redo logs.","RetryInterval":"Specifies the number of seconds that the system waits before resending a query.\\n\\nExample: `retryInterval=6;`","SecretsManagerAccessRoleArn":"The full Amazon Resource Name (ARN) of the IAM role that specifies AWS DMS as the trusted entity and grants the required permissions to access the value in `SecretsManagerSecret` . The role must allow the `iam:PassRole` action. `SecretsManagerSecret` has the value of the AWS Secrets Manager secret that allows access to the Oracle endpoint.\\n\\n> You can specify one of two sets of values for these permissions. You can specify the values for this setting and `SecretsManagerSecretId` . Or you can specify clear-text values for `UserName` , `Password` , `ServerName` , and `Port` . You can\'t specify both.\\n> \\n> For more information on creating this `SecretsManagerSecret` , the corresponding `SecretsManagerAccessRoleArn` , and the `SecretsManagerSecretId` that is required to access it, see [Using secrets to access AWS Database Migration Service resources](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.html#security-iam-secretsmanager) in the *AWS Database Migration Service User Guide* .","SecretsManagerOracleAsmAccessRoleArn":"Required only if your Oracle endpoint uses Advanced Storage Manager (ASM). The full ARN of the IAM role that specifies AWS DMS as the trusted entity and grants the required permissions to access the `SecretsManagerOracleAsmSecret` . This `SecretsManagerOracleAsmSecret` has the secret value that allows access to the Oracle ASM of the endpoint.\\n\\n> You can specify one of two sets of values for these permissions. You can specify the values for this setting and `SecretsManagerOracleAsmSecretId` . Or you can specify clear-text values for `AsmUserName` , `AsmPassword` , and `AsmServerName` . You can\'t specify both.\\n> \\n> For more information on creating this `SecretsManagerOracleAsmSecret` , the corresponding `SecretsManagerOracleAsmAccessRoleArn` , and the `SecretsManagerOracleAsmSecretId` that is required to access it, see [Using secrets to access AWS Database Migration Service resources](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.html#security-iam-secretsmanager) in the *AWS Database Migration Service User Guide* .","SecretsManagerOracleAsmSecretId":"Required only if your Oracle endpoint uses Advanced Storage Manager (ASM). The full ARN, partial ARN, or display name of the `SecretsManagerOracleAsmSecret` that contains the Oracle ASM connection details for the Oracle endpoint.","SecretsManagerSecretId":"The full ARN, partial ARN, or display name of the `SecretsManagerSecret` that contains the Oracle endpoint connection details.","SecurityDbEncryption":"For an Oracle source endpoint, the transparent data encryption (TDE) password required by AWM DMS to access Oracle redo logs encrypted by TDE using Binary Reader. It is also the `*TDE_Password*` part of the comma-separated value you set to the `Password` request parameter when you create the endpoint. The `SecurityDbEncryptian` setting is related to this `SecurityDbEncryptionName` setting. For more information, see [Supported encryption methods for using Oracle as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html#CHAP_Source.Oracle.Encryption) in the *AWS Database Migration Service User Guide* .","SecurityDbEncryptionName":"For an Oracle source endpoint, the name of a key used for the transparent data encryption (TDE) of the columns and tablespaces in an Oracle source database that is encrypted using TDE. The key value is the value of the `SecurityDbEncryption` setting. For more information on setting the key name value of `SecurityDbEncryptionName` , see the information and example for setting the `securityDbEncryptionName` extra connection attribute in [Supported encryption methods for using Oracle as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html#CHAP_Source.Oracle.Encryption) in the *AWS Database Migration Service User Guide* .","SpatialDataOptionToGeoJsonFunctionName":"Use this attribute to convert `SDO_GEOMETRY` to `GEOJSON` format. By default, DMS calls the `SDO2GEOJSON` custom function if present and accessible. Or you can create your own custom function that mimics the operation of `SDOGEOJSON` and set `SpatialDataOptionToGeoJsonFunctionName` to call it instead.","StandbyDelayTime":"Use this attribute to specify a time in minutes for the delay in standby sync. If the source is an Oracle Active Data Guard standby database, use this attribute to specify the time lag between primary and standby databases.\\n\\nIn AWS DMS , you can create an Oracle CDC task that uses an Active Data Guard standby instance as a source for replicating ongoing changes. Doing this eliminates the need to connect to an active database that might be in production.","UseAlternateFolderForOnline":"Set this attribute to `true` in order to use the Binary Reader to capture change data for an Amazon RDS for Oracle as the source. This tells the DMS instance to use any specified prefix replacement to access all online redo logs.","UseBFile":"Set this attribute to Y to capture change data using the Binary Reader utility. Set `UseLogminerReader` to N to set this attribute to Y. To use Binary Reader with Amazon RDS for Oracle as the source, you set additional attributes. For more information about using this setting with Oracle Automatic Storage Management (ASM), see [Using Oracle LogMiner or AWS DMS Binary Reader for CDC](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html#CHAP_Source.Oracle.CDC) .","UseDirectPathFullLoad":"Set this attribute to Y to have AWS DMS use a direct path full load. Specify this value to use the direct path protocol in the Oracle Call Interface (OCI). By using this OCI protocol, you can bulk-load Oracle target tables during a full load.","UseLogminerReader":"Set this attribute to Y to capture change data using the Oracle LogMiner utility (the default). Set this attribute to N if you want to access the redo logs as a binary file. When you set `UseLogminerReader` to N, also set `UseBfile` to Y. For more information on this setting and using Oracle ASM, see [Using Oracle LogMiner or AWS DMS Binary Reader for CDC](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html#CHAP_Source.Oracle.CDC) in the *AWS DMS User Guide* .","UsePathPrefix":"Set this string attribute to the required value in order to use the Binary Reader to capture change data for an Amazon RDS for Oracle as the source. This value specifies the path prefix used to replace the default Oracle root to access the redo logs."}},"AWS::DMS::Endpoint.PostgreSqlSettings":{"attributes":{},"description":"Provides information that defines a PostgreSQL endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For information about other available settings, see [Extra connection attributes when using PostgreSQL as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.ConnectionAttrib) and [Extra connection attributes when using PostgreSQL as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html#CHAP_Target.PostgreSQL.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","properties":{"AfterConnectScript":"For use with change data capture (CDC) only, this attribute has AWS DMS bypass foreign keys and user triggers to reduce the time it takes to bulk load data.\\n\\nExample: `afterConnectScript=SET session_replication_role=\'replica\'`","CaptureDdls":"To capture DDL events, AWS DMS creates various artifacts in the PostgreSQL database when the task starts. You can later remove these artifacts.\\n\\nIf this value is set to `N` , you don\'t have to create tables or triggers on the source database.","DdlArtifactsSchema":"The schema in which the operational DDL database artifacts are created.\\n\\nExample: `ddlArtifactsSchema=xyzddlschema;`","ExecuteTimeout":"Sets the client statement timeout for the PostgreSQL instance, in seconds. The default value is 60 seconds.\\n\\nExample: `executeTimeout=100;`","FailTasksOnLobTruncation":"When set to `true` , this value causes a task to fail if the actual size of a LOB column is greater than the specified `LobMaxSize` .\\n\\nIf task is set to Limited LOB mode and this option is set to true, the task fails instead of truncating the LOB data.","HeartbeatEnable":"The write-ahead log (WAL) heartbeat feature mimics a dummy transaction. By doing this, it prevents idle logical replication slots from holding onto old WAL logs, which can result in storage full situations on the source. This heartbeat keeps `restart_lsn` moving and prevents storage full scenarios.","HeartbeatFrequency":"Sets the WAL heartbeat frequency (in minutes).","HeartbeatSchema":"Sets the schema in which the heartbeat artifacts are created.","MapBooleanAsBoolean":"","MaxFileSize":"Specifies the maximum size (in KB) of any .csv file used to transfer data to PostgreSQL.\\n\\nExample: `maxFileSize=512`","PluginName":"Specifies the plugin to use to create a replication slot.","SecretsManagerAccessRoleArn":"The full Amazon Resource Name (ARN) of the IAM role that specifies AWS DMS as the trusted entity and grants the required permissions to access the value in `SecretsManagerSecret` . The role must allow the `iam:PassRole` action. `SecretsManagerSecret` has the value of the AWS Secrets Manager secret that allows access to the PostgreSQL endpoint.\\n\\n> You can specify one of two sets of values for these permissions. You can specify the values for this setting and `SecretsManagerSecretId` . Or you can specify clear-text values for `UserName` , `Password` , `ServerName` , and `Port` . You can\'t specify both.\\n> \\n> For more information on creating this `SecretsManagerSecret` , the corresponding `SecretsManagerAccessRoleArn` , and the `SecretsManagerSecretId` that is required to access it, see [Using secrets to access AWS Database Migration Service resources](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.html#security-iam-secretsmanager) in the *AWS Database Migration Service User Guide* .","SecretsManagerSecretId":"The full ARN, partial ARN, or display name of the `SecretsManagerSecret` that contains the PostgreSQL endpoint connection details.","SlotName":"Sets the name of a previously created logical replication slot for a change data capture (CDC) load of the PostgreSQL source instance.\\n\\nWhen used with the `CdcStartPosition` request parameter for the AWS DMS API , this attribute also makes it possible to use native CDC start points. DMS verifies that the specified logical replication slot exists before starting the CDC load task. It also verifies that the task was created with a valid setting of `CdcStartPosition` . If the specified slot doesn\'t exist or the task doesn\'t have a valid `CdcStartPosition` setting, DMS raises an error.\\n\\nFor more information about setting the `CdcStartPosition` request parameter, see [Determining a CDC native start point](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Task.CDC.html#CHAP_Task.CDC.StartPoint.Native) in the *AWS Database Migration Service User Guide* . For more information about using `CdcStartPosition` , see [CreateReplicationTask](https://docs.aws.amazon.com/dms/latest/APIReference/API_CreateReplicationTask.html) , [StartReplicationTask](https://docs.aws.amazon.com/dms/latest/APIReference/API_StartReplicationTask.html) , and [ModifyReplicationTask](https://docs.aws.amazon.com/dms/latest/APIReference/API_ModifyReplicationTask.html) ."}},"AWS::DMS::Endpoint.RedisSettings":{"attributes":{},"description":"Provides information that defines a Redis target endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For information about other available settings, see [Specifying endpoint settings for Redis as a target](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Redis.html#CHAP_Target.Redis.EndpointSettings) in the *AWS Database Migration Service User Guide* .","properties":{"AuthPassword":"The password provided with the `auth-role` and `auth-token` options of the `AuthType` setting for a Redis target endpoint.","AuthType":"The type of authentication to perform when connecting to a Redis target. Options include `none` , `auth-token` , and `auth-role` . The `auth-token` option requires an `AuthPassword` value to be provided. The `auth-role` option requires `AuthUserName` and `AuthPassword` values to be provided.","AuthUserName":"The user name provided with the `auth-role` option of the `AuthType` setting for a Redis target endpoint.","Port":"Transmission Control Protocol (TCP) port for the endpoint.","ServerName":"Fully qualified domain name of the endpoint.","SslCaCertificateArn":"The Amazon Resource Name (ARN) for the certificate authority (CA) that DMS uses to connect to your Redis target endpoint.","SslSecurityProtocol":"The connection to a Redis target endpoint using Transport Layer Security (TLS). Valid values include `plaintext` and `ssl-encryption` . The default is `ssl-encryption` . The `ssl-encryption` option makes an encrypted connection. Optionally, you can identify an Amazon Resource Name (ARN) for an SSL certificate authority (CA) using the `SslCaCertificateArn` setting. If an ARN isn\'t given for a CA, DMS uses the Amazon root CA.\\n\\nThe `plaintext` option doesn\'t provide Transport Layer Security (TLS) encryption for traffic between endpoint and database."}},"AWS::DMS::Endpoint.RedshiftSettings":{"attributes":{},"description":"Provides information that defines an Amazon Redshift endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For more information about other available settings, see [Extra connection attributes when using Amazon Redshift as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Redshift.html#CHAP_Target.Redshift.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","properties":{"AcceptAnyDate":"A value that indicates to allow any date format, including invalid formats such as 00/00/00 00:00:00, to be loaded without generating an error. You can choose `true` or `false` (the default).\\n\\nThis parameter applies only to TIMESTAMP and DATE columns. Always use ACCEPTANYDATE with the DATEFORMAT parameter. If the date format for the data doesn\'t match the DATEFORMAT specification, Amazon Redshift inserts a NULL value into that field.","AfterConnectScript":"Code to run after connecting. This parameter should contain the code itself, not the name of a file containing the code.","BucketFolder":"An S3 folder where the comma-separated-value (.csv) files are stored before being uploaded to the target Redshift cluster.\\n\\nFor full load mode, AWS DMS converts source records into .csv files and loads them to the *BucketFolder/TableID* path. AWS DMS uses the Redshift `COPY` command to upload the .csv files to the target table. The files are deleted once the `COPY` operation has finished. For more information, see [COPY](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html) in the *Amazon Redshift Database Developer Guide* .\\n\\nFor change-data-capture (CDC) mode, AWS DMS creates a *NetChanges* table, and loads the .csv files to this *BucketFolder/NetChangesTableID* path.","BucketName":"The name of the intermediate S3 bucket used to store .csv files before uploading data to Redshift.","CaseSensitiveNames":"If Amazon Redshift is configured to support case sensitive schema names, set `CaseSensitiveNames` to `true` . The default is `false` .","CompUpdate":"If you set `CompUpdate` to `true` Amazon Redshift applies automatic compression if the table is empty. This applies even if the table columns already have encodings other than `RAW` . If you set `CompUpdate` to `false` , automatic compression is disabled and existing column encodings aren\'t changed. The default is `true` .","ConnectionTimeout":"A value that sets the amount of time to wait (in milliseconds) before timing out, beginning from when you initially establish a connection.","DateFormat":"The date format that you are using. Valid values are `auto` (case-sensitive), your date format string enclosed in quotes, or NULL. If this parameter is left unset (NULL), it defaults to a format of \'YYYY-MM-DD\'. Using `auto` recognizes most strings, even some that aren\'t supported when you use a date format string.\\n\\nIf your date and time values use formats different from each other, set this to `auto` .","EmptyAsNull":"A value that specifies whether AWS DMS should migrate empty CHAR and VARCHAR fields as NULL. A value of `true` sets empty CHAR and VARCHAR fields to null. The default is `false` .","EncryptionMode":"The type of server-side encryption that you want to use for your data. This encryption type is part of the endpoint settings or the extra connections attributes for Amazon S3. You can choose either `SSE_S3` (the default) or `SSE_KMS` .\\n\\n> For the `ModifyEndpoint` operation, you can change the existing value of the `EncryptionMode` parameter from `SSE_KMS` to `SSE_S3` . But you can’t change the existing value from `SSE_S3` to `SSE_KMS` . \\n\\nTo use `SSE_S3` , create an AWS Identity and Access Management (IAM) role with a policy that allows `\\"arn:aws:s3:::*\\"` to use the following actions: `\\"s3:PutObject\\", \\"s3:ListBucket\\"`","ExplicitIds":"This setting is only valid for a full-load migration task. Set `ExplicitIds` to `true` to have tables with `IDENTITY` columns override their auto-generated values with explicit values loaded from the source data files used to populate the tables. The default is `false` .","FileTransferUploadStreams":"The number of threads used to upload a single file. This parameter accepts a value from 1 through 64. It defaults to 10.\\n\\nThe number of parallel streams used to upload a single .csv file to an S3 bucket using S3 Multipart Upload. For more information, see [Multipart upload overview](https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html) .\\n\\n`FileTransferUploadStreams` accepts a value from 1 through 64. It defaults to 10.","LoadTimeout":"The amount of time to wait (in milliseconds) before timing out of operations performed by AWS DMS on a Redshift cluster, such as Redshift COPY, INSERT, DELETE, and UPDATE.","MapBooleanAsBoolean":"","MaxFileSize":"The maximum size (in KB) of any .csv file used to load data on an S3 bucket and transfer data to Amazon Redshift. It defaults to 1048576KB (1 GB).","RemoveQuotes":"A value that specifies to remove surrounding quotation marks from strings in the incoming data. All characters within the quotation marks, including delimiters, are retained. Choose `true` to remove quotation marks. The default is `false` .","ReplaceChars":"A value that specifies to replaces the invalid characters specified in `ReplaceInvalidChars` , substituting the specified characters instead. The default is `\\"?\\"` .","ReplaceInvalidChars":"A list of characters that you want to replace. Use with `ReplaceChars` .","SecretsManagerAccessRoleArn":"The full Amazon Resource Name (ARN) of the IAM role that specifies AWS DMS as the trusted entity and grants the required permissions to access the value in `SecretsManagerSecret` . The role must allow the `iam:PassRole` action. `SecretsManagerSecret` has the value of the AWS Secrets Manager secret that allows access to the Amazon Redshift endpoint.\\n\\n> You can specify one of two sets of values for these permissions. You can specify the values for this setting and `SecretsManagerSecretId` . Or you can specify clear-text values for `UserName` , `Password` , `ServerName` , and `Port` . You can\'t specify both.\\n> \\n> For more information on creating this `SecretsManagerSecret` , the corresponding `SecretsManagerAccessRoleArn` , and the `SecretsManagerSecretId` that is required to access it, see [Using secrets to access AWS Database Migration Service resources](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.html#security-iam-secretsmanager) in the *AWS Database Migration Service User Guide* .","SecretsManagerSecretId":"The full ARN, partial ARN, or display name of the `SecretsManagerSecret` that contains the Amazon Redshift endpoint connection details.","ServerSideEncryptionKmsKeyId":"The AWS KMS key ID. If you are using `SSE_KMS` for the `EncryptionMode` , provide this key ID. The key that you use needs an attached policy that enables IAM user permissions and allows use of the key.","ServiceAccessRoleArn":"The Amazon Resource Name (ARN) of the IAM role that has access to the Amazon Redshift service. The role must allow the `iam:PassRole` action.","TimeFormat":"The time format that you want to use. Valid values are `auto` (case-sensitive), `\'timeformat_string\'` , `\'epochsecs\'` , or `\'epochmillisecs\'` . It defaults to 10. Using `auto` recognizes most strings, even some that aren\'t supported when you use a time format string.\\n\\nIf your date and time values use formats different from each other, set this parameter to `auto` .","TrimBlanks":"A value that specifies to remove the trailing white space characters from a VARCHAR string. This parameter applies only to columns with a VARCHAR data type. Choose `true` to remove unneeded white space. The default is `false` .","TruncateColumns":"A value that specifies to truncate data in columns to the appropriate number of characters, so that the data fits in the column. This parameter applies only to columns with a VARCHAR or CHAR data type, and rows with a size of 4 MB or less. Choose `true` to truncate data. The default is `false` .","WriteBufferSize":"The size (in KB) of the in-memory file write buffer used when generating .csv files on the local disk at the DMS replication instance. The default value is 1000 (buffer size is 1000KB)."}},"AWS::DMS::Endpoint.S3Settings":{"attributes":{},"description":"Provides information that defines an Amazon S3 endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For more information about the available settings, see [Extra connection attributes when using Amazon S3 as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.S3.html#CHAP_Source.S3.Configuring) and [Extra connection attributes when using Amazon S3 as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.S3.html#CHAP_Target.S3.Configuring) in the *AWS Database Migration Service User Guide* .","properties":{"AddColumnName":"An optional parameter that, when set to `true` or `y` , you can use to add column name information to the .csv output file.\\n\\nThe default value is `false` . Valid values are `true` , `false` , `y` , and `n` .","BucketFolder":"An optional parameter to set a folder name in the S3 bucket. If provided, tables are created in the path `*bucketFolder* / *schema_name* / *table_name* /` . If this parameter isn\'t specified, the path used is `*schema_name* / *table_name* /` .","BucketName":"The name of the S3 bucket.","CannedAclForObjects":"A value that enables AWS DMS to specify a predefined (canned) access control list (ACL) for objects created in an Amazon S3 bucket as .csv or .parquet files. For more information about Amazon S3 canned ACLs, see [Canned ACL](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl) in the *Amazon S3 Developer Guide* .\\n\\nThe default value is NONE. Valid values include NONE, PRIVATE, PUBLIC_READ, PUBLIC_READ_WRITE, AUTHENTICATED_READ, AWS_EXEC_READ, BUCKET_OWNER_READ, and BUCKET_OWNER_FULL_CONTROL.","CdcInsertsAndUpdates":"A value that enables a change data capture (CDC) load to write INSERT and UPDATE operations to .csv or .parquet (columnar storage) output files. The default setting is `false` , but when `CdcInsertsAndUpdates` is set to `true` or `y` , only INSERTs and UPDATEs from the source database are migrated to the .csv or .parquet file.\\n\\nFor .csv file format only, how these INSERTs and UPDATEs are recorded depends on the value of the `IncludeOpForFullLoad` parameter. If `IncludeOpForFullLoad` is set to `true` , the first field of every CDC record is set to either `I` or `U` to indicate INSERT and UPDATE operations at the source. But if `IncludeOpForFullLoad` is set to `false` , CDC records are written without an indication of INSERT or UPDATE operations at the source. For more information about how these settings work together, see [Indicating Source DB Operations in Migrated S3 Data](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.S3.html#CHAP_Target.S3.Configuring.InsertOps) in the *AWS Database Migration Service User Guide* .\\n\\n> AWS DMS supports the use of the `CdcInsertsAndUpdates` parameter in versions 3.3.1 and later.\\n> \\n> `CdcInsertsOnly` and `CdcInsertsAndUpdates` can\'t both be set to `true` for the same endpoint. Set either `CdcInsertsOnly` or `CdcInsertsAndUpdates` to `true` for the same endpoint, but not both.","CdcInsertsOnly":"A value that enables a change data capture (CDC) load to write only INSERT operations to .csv or columnar storage (.parquet) output files. By default (the `false` setting), the first field in a .csv or .parquet record contains the letter I (INSERT), U (UPDATE), or D (DELETE). These values indicate whether the row was inserted, updated, or deleted at the source database for a CDC load to the target.\\n\\nIf `CdcInsertsOnly` is set to `true` or `y` , only INSERTs from the source database are migrated to the .csv or .parquet file. For .csv format only, how these INSERTs are recorded depends on the value of `IncludeOpForFullLoad` . If `IncludeOpForFullLoad` is set to `true` , the first field of every CDC record is set to I to indicate the INSERT operation at the source. If `IncludeOpForFullLoad` is set to `false` , every CDC record is written without a first field to indicate the INSERT operation at the source. For more information about how these settings work together, see [Indicating Source DB Operations in Migrated S3 Data](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.S3.html#CHAP_Target.S3.Configuring.InsertOps) in the *AWS Database Migration Service User Guide* .\\n\\n> AWS DMS supports the interaction described preceding between the `CdcInsertsOnly` and `IncludeOpForFullLoad` parameters in versions 3.1.4 and later.\\n> \\n> `CdcInsertsOnly` and `CdcInsertsAndUpdates` can\'t both be set to `true` for the same endpoint. Set either `CdcInsertsOnly` or `CdcInsertsAndUpdates` to `true` for the same endpoint, but not both.","CdcMaxBatchInterval":"Maximum length of the interval, defined in seconds, after which to output a file to Amazon S3.\\n\\nWhen `CdcMaxBatchInterval` and `CdcMinFileSize` are both specified, the file write is triggered by whichever parameter condition is met first within an AWS DMS CloudFormation template.\\n\\nThe default value is 60 seconds.","CdcMinFileSize":"Minimum file size, defined in kilobytes, to reach for a file output to Amazon S3.\\n\\nWhen `CdcMinFileSize` and `CdcMaxBatchInterval` are both specified, the file write is triggered by whichever parameter condition is met first within an AWS DMS CloudFormation template.\\n\\nThe default value is 32 MB.","CdcPath":"Specifies the folder path of CDC files. For an S3 source, this setting is required if a task captures change data; otherwise, it\'s optional. If `CdcPath` is set, AWS DMS reads CDC files from this path and replicates the data changes to the target endpoint. For an S3 target if you set [`PreserveTransactions`](https://docs.aws.amazon.com/dms/latest/APIReference/API_S3Settings.html#DMS-Type-S3Settings-PreserveTransactions) to `true` , AWS DMS verifies that you have set this parameter to a folder path on your S3 target where AWS DMS can save the transaction order for the CDC load. AWS DMS creates this CDC folder path in either your S3 target working directory or the S3 target location specified by [`BucketFolder`](https://docs.aws.amazon.com/dms/latest/APIReference/API_S3Settings.html#DMS-Type-S3Settings-BucketFolder) and [`BucketName`](https://docs.aws.amazon.com/dms/latest/APIReference/API_S3Settings.html#DMS-Type-S3Settings-BucketName) .\\n\\nFor example, if you specify `CdcPath` as `MyChangedData` , and you specify `BucketName` as `MyTargetBucket` but do not specify `BucketFolder` , AWS DMS creates the CDC folder path following: `MyTargetBucket/MyChangedData` .\\n\\nIf you specify the same `CdcPath` , and you specify `BucketName` as `MyTargetBucket` and `BucketFolder` as `MyTargetData` , AWS DMS creates the CDC folder path following: `MyTargetBucket/MyTargetData/MyChangedData` .\\n\\nFor more information on CDC including transaction order on an S3 target, see [Capturing data changes (CDC) including transaction order on the S3 target](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.S3.html#CHAP_Target.S3.EndpointSettings.CdcPath) .\\n\\n> This setting is supported in AWS DMS versions 3.4.2 and later.","CompressionType":"An optional parameter. When set to GZIP it enables the service to compress the target files. To allow the service to write the target files uncompressed, either set this parameter to NONE (the default) or don\'t specify the parameter at all. This parameter applies to both .csv and .parquet file formats.","CsvDelimiter":"The delimiter used to separate columns in the .csv file for both source and target. The default is a comma.","CsvNoSupValue":"This setting only applies if your Amazon S3 output files during a change data capture (CDC) load are written in .csv format. If [`UseCsvNoSupValue`](https://docs.aws.amazon.com/dms/latest/APIReference/API_S3Settings.html#DMS-Type-S3Settings-UseCsvNoSupValue) is set to true, specify a string value that you want AWS DMS to use for all columns not included in the supplemental log. If you do not specify a string value, AWS DMS uses the null value for these columns regardless of the `UseCsvNoSupValue` setting.\\n\\n> This setting is supported in AWS DMS versions 3.4.1 and later.","CsvNullValue":"An optional parameter that specifies how AWS DMS treats null values. While handling the null value, you can use this parameter to pass a user-defined string as null when writing to the target. For example, when target columns are not nullable, you can use this option to differentiate between the empty string value and the null value. So, if you set this parameter value to the empty string (\\"\\" or \'\'), AWS DMS treats the empty string as the null value instead of `NULL` .\\n\\nThe default value is `NULL` . Valid values include any valid string.","CsvRowDelimiter":"The delimiter used to separate rows in the .csv file for both source and target.\\n\\nThe default is a carriage return ( `\\\\n` ).","DataFormat":"The format of the data that you want to use for output. You can choose one of the following:\\n\\n- `csv` : This is a row-based file format with comma-separated values (.csv).\\n- `parquet` : Apache Parquet (.parquet) is a columnar storage file format that features efficient compression and provides faster query response.","DataPageSize":"The size of one data page in bytes. This parameter defaults to 1024 * 1024 bytes (1 MiB). This number is used for .parquet file format only.","DatePartitionDelimiter":"Specifies a date separating delimiter to use during folder partitioning. The default value is `SLASH` . Use this parameter when `DatePartitionedEnabled` is set to `true` .","DatePartitionEnabled":"When set to `true` , this parameter partitions S3 bucket folders based on transaction commit dates. The default value is `false` . For more information about date-based folder partitioning, see [Using date-based folder partitioning](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.S3.html#CHAP_Target.S3.DatePartitioning) .","DatePartitionSequence":"Identifies the sequence of the date format to use during folder partitioning. The default value is `YYYYMMDD` . Use this parameter when `DatePartitionedEnabled` is set to `true` .","DatePartitionTimezone":"When creating an S3 target endpoint, set `DatePartitionTimezone` to convert the current UTC time into a specified time zone. The conversion occurs when a date partition folder is created and a change data capture (CDC) file name is generated. The time zone format is Area/Location. Use this parameter when `DatePartitionedEnabled` is set to `true` , as shown in the following example.\\n\\n`s3-settings=\'{\\"DatePartitionEnabled\\": true, \\"DatePartitionSequence\\": \\"YYYYMMDDHH\\", \\"DatePartitionDelimiter\\": \\"SLASH\\", \\"DatePartitionTimezone\\":\\" *Asia/Seoul* \\", \\"BucketName\\": \\"dms-nattarat-test\\"}\'`","DictPageSizeLimit":"The maximum size of an encoded dictionary page of a column. If the dictionary page exceeds this, this column is stored using an encoding type of `PLAIN` . This parameter defaults to 1024 * 1024 bytes (1 MiB), the maximum size of a dictionary page before it reverts to `PLAIN` encoding. This size is used for .parquet file format only.","EnableStatistics":"A value that enables statistics for Parquet pages and row groups. Choose `true` to enable statistics, `false` to disable. Statistics include `NULL` , `DISTINCT` , `MAX` , and `MIN` values. This parameter defaults to `true` . This value is used for .parquet file format only.","EncodingType":"The type of encoding that you\'re using:\\n\\n- `RLE_DICTIONARY` uses a combination of bit-packing and run-length encoding to store repeated values more efficiently. This is the default.\\n- `PLAIN` doesn\'t use encoding at all. Values are stored as they are.\\n- `PLAIN_DICTIONARY` builds a dictionary of the values encountered in a given column. The dictionary is stored in a dictionary page for each column chunk.","EncryptionMode":"The type of server-side encryption that you want to use for your data. This encryption type is part of the endpoint settings or the extra connections attributes for Amazon S3. You can choose either `SSE_S3` (the default) or `SSE_KMS` .\\n\\n> For the `ModifyEndpoint` operation, you can change the existing value of the `EncryptionMode` parameter from `SSE_KMS` to `SSE_S3` . But you can’t change the existing value from `SSE_S3` to `SSE_KMS` . \\n\\nTo use `SSE_S3` , you need an IAM role with permission to allow `\\"arn:aws:s3:::dms-*\\"` to use the following actions:\\n\\n- `s3:CreateBucket`\\n- `s3:ListBucket`\\n- `s3:DeleteBucket`\\n- `s3:GetBucketLocation`\\n- `s3:GetObject`\\n- `s3:PutObject`\\n- `s3:DeleteObject`\\n- `s3:GetObjectVersion`\\n- `s3:GetBucketPolicy`\\n- `s3:PutBucketPolicy`\\n- `s3:DeleteBucketPolicy`","ExternalTableDefinition":"The external table definition.\\n\\nConditional: If `S3` is used as a source then `ExternalTableDefinition` is required.","IgnoreHeaderRows":"When this value is set to 1, AWS DMS ignores the first row header in a .csv file. A value of 1 turns on the feature; a value of 0 turns off the feature.\\n\\nThe default is 0.","IncludeOpForFullLoad":"A value that enables a full load to write INSERT operations to the comma-separated value (.csv) output files only to indicate how the rows were added to the source database.\\n\\n> AWS DMS supports the `IncludeOpForFullLoad` parameter in versions 3.1.4 and later. \\n\\nFor full load, records can only be inserted. By default (the `false` setting), no information is recorded in these output files for a full load to indicate that the rows were inserted at the source database. If `IncludeOpForFullLoad` is set to `true` or `y` , the INSERT is recorded as an I annotation in the first field of the .csv file. This allows the format of your target records from a full load to be consistent with the target records from a CDC load.\\n\\n> This setting works together with the `CdcInsertsOnly` and the `CdcInsertsAndUpdates` parameters for output to .csv files only. For more information about how these settings work together, see [Indicating Source DB Operations in Migrated S3 Data](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.S3.html#CHAP_Target.S3.Configuring.InsertOps) in the *AWS Database Migration Service User Guide* .","MaxFileSize":"A value that specifies the maximum size (in KB) of any .csv file to be created while migrating to an S3 target during full load.\\n\\nThe default value is 1,048,576 KB (1 GB). Valid values include 1 to 1,048,576.","ParquetTimestampInMillisecond":"A value that specifies the precision of any `TIMESTAMP` column values that are written to an Amazon S3 object file in .parquet format.\\n\\n> AWS DMS supports the `ParquetTimestampInMillisecond` parameter in versions 3.1.4 and later. \\n\\nWhen `ParquetTimestampInMillisecond` is set to `true` or `y` , AWS DMS writes all `TIMESTAMP` columns in a .parquet formatted file with millisecond precision. Otherwise, DMS writes them with microsecond precision.\\n\\nCurrently, Amazon Athena and AWS Glue can handle only millisecond precision for `TIMESTAMP` values. Set this parameter to `true` for S3 endpoint object files that are .parquet formatted only if you plan to query or process the data with Athena or AWS Glue .\\n\\n> AWS DMS writes any `TIMESTAMP` column values written to an S3 file in .csv format with microsecond precision.\\n> \\n> Setting `ParquetTimestampInMillisecond` has no effect on the string format of the timestamp column value that is inserted by setting the `TimestampColumnName` parameter.","ParquetVersion":"The version of the Apache Parquet format that you want to use: `parquet_1_0` (the default) or `parquet_2_0` .","PreserveTransactions":"If this setting is set to `true` , AWS DMS saves the transaction order for a change data capture (CDC) load on the Amazon S3 target specified by [`CdcPath`](https://docs.aws.amazon.com/dms/latest/APIReference/API_S3Settings.html#DMS-Type-S3Settings-CdcPath) . For more information, see [Capturing data changes (CDC) including transaction order on the S3 target](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.S3.html#CHAP_Target.S3.EndpointSettings.CdcPath) .\\n\\n> This setting is supported in AWS DMS versions 3.4.2 and later.","Rfc4180":"For an S3 source, when this value is set to `true` or `y` , each leading double quotation mark has to be followed by an ending double quotation mark. This formatting complies with RFC 4180. When this value is set to `false` or `n` , string literals are copied to the target as is. In this case, a delimiter (row or column) signals the end of the field. Thus, you can\'t use a delimiter as part of the string, because it signals the end of the value.\\n\\nFor an S3 target, an optional parameter used to set behavior to comply with RFC 4180 for data migrated to Amazon S3 using .csv file format only. When this value is set to `true` or `y` using Amazon S3 as a target, if the data has quotation marks or newline characters in it, AWS DMS encloses the entire column with an additional pair of double quotation marks (\\"). Every quotation mark within the data is repeated twice.\\n\\nThe default value is `true` . Valid values include `true` , `false` , `y` , and `n` .","RowGroupLength":"The number of rows in a row group. A smaller row group size provides faster reads. But as the number of row groups grows, the slower writes become. This parameter defaults to 10,000 rows. This number is used for .parquet file format only.\\n\\nIf you choose a value larger than the maximum, `RowGroupLength` is set to the max row group length in bytes (64 * 1024 * 1024).","ServerSideEncryptionKmsKeyId":"If you are using `SSE_KMS` for the `EncryptionMode` , provide the AWS KMS key ID. The key that you use needs an attached policy that enables IAM user permissions and allows use of the key.\\n\\nHere is a CLI example: `aws dms create-endpoint --endpoint-identifier *value* --endpoint-type target --engine-name s3 --s3-settings ServiceAccessRoleArn= *value* ,BucketFolder= *value* ,BucketName= *value* ,EncryptionMode=SSE_KMS,ServerSideEncryptionKmsKeyId= *value*`","ServiceAccessRoleArn":"A required parameter that specifies the Amazon Resource Name (ARN) used by the service to access the IAM role. The role must allow the `iam:PassRole` action. It enables AWS DMS to read and write objects from an S3 bucket.","TimestampColumnName":"A value that when nonblank causes AWS DMS to add a column with timestamp information to the endpoint data for an Amazon S3 target.\\n\\n> AWS DMS supports the `TimestampColumnName` parameter in versions 3.1.4 and later. \\n\\nAWS DMS includes an additional `STRING` column in the .csv or .parquet object files of your migrated data when you set `TimestampColumnName` to a nonblank value.\\n\\nFor a full load, each row of this timestamp column contains a timestamp for when the data was transferred from the source to the target by DMS.\\n\\nFor a change data capture (CDC) load, each row of the timestamp column contains the timestamp for the commit of that row in the source database.\\n\\nThe string format for this timestamp column value is `yyyy-MM-dd HH:mm:ss.SSSSSS` . By default, the precision of this value is in microseconds. For a CDC load, the rounding of the precision depends on the commit timestamp supported by DMS for the source database.\\n\\nWhen the `AddColumnName` parameter is set to `true` , DMS also includes a name for the timestamp column that you set with `TimestampColumnName` .","UseCsvNoSupValue":"This setting applies if the S3 output files during a change data capture (CDC) load are written in .csv format. If this setting is set to `true` for columns not included in the supplemental log, AWS DMS uses the value specified by [`CsvNoSupValue`](https://docs.aws.amazon.com/dms/latest/APIReference/API_S3Settings.html#DMS-Type-S3Settings-CsvNoSupValue) . If this setting isn\'t set or is set to `false` , AWS DMS uses the null value for these columns.\\n\\n> This setting is supported in AWS DMS versions 3.4.1 and later.","UseTaskStartTimeForFullLoadTimestamp":"When set to true, this parameter uses the task start time as the timestamp column value instead of the time data is written to target. For full load, when `useTaskStartTimeForFullLoadTimestamp` is set to `true` , each row of the timestamp column contains the task start time. For CDC loads, each row of the timestamp column contains the transaction commit time.\\n\\nWhen `useTaskStartTimeForFullLoadTimestamp` is set to `false` , the full load timestamp in the timestamp column increments with the time data arrives at the target."}},"AWS::DMS::Endpoint.SybaseSettings":{"attributes":{},"description":"Provides information that defines a SAP ASE endpoint. This information includes the output format of records applied to the endpoint and details of transaction and control table data information. For information about other available settings, see [Extra connection attributes when using SAP ASE as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.SAP.html#CHAP_Source.SAP.ConnectionAttrib) and [Extra connection attributes when using SAP ASE as a target for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.SAP.html#CHAP_Target.SAP.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","properties":{"SecretsManagerAccessRoleArn":"The full Amazon Resource Name (ARN) of the IAM role that specifies AWS DMS as the trusted entity and grants the required permissions to access the value in `SecretsManagerSecret` . The role must allow the `iam:PassRole` action. `SecretsManagerSecret` has the value of the AWS Secrets Manager secret that allows access to the SAP ASE endpoint.\\n\\n> You can specify one of two sets of values for these permissions. You can specify the values for this setting and `SecretsManagerSecretId` . Or you can specify clear-text values for `UserName` , `Password` , `ServerName` , and `Port` . You can\'t specify both.\\n> \\n> For more information on creating this `SecretsManagerSecret` , the corresponding `SecretsManagerAccessRoleArn` , and the `SecretsManagerSecretId` that is required to access it, see [Using secrets to access AWS Database Migration Service resources](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.html#security-iam-secretsmanager) in the *AWS Database Migration Service User Guide* .","SecretsManagerSecretId":"The full ARN, partial ARN, or display name of the `SecretsManagerSecret` that contains the SAP SAE endpoint connection details."}},"AWS::DMS::EventSubscription":{"attributes":{"Ref":"`Ref` returns the resource name, for example:\\n\\n`{ \\"Ref\\": \\"myEventSubscription\\" }`"},"description":"Use the `AWS::DMS::EventSubscription` resource to get notifications for AWS Database Migration Service events through the Amazon Simple Notification Service . For more information, see [Working with events and notifications in AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Events.html) in the *AWS Database Migration Service User Guide* .","properties":{"Enabled":"Indicates whether to activate the subscription. If you don\'t specify this property, AWS CloudFormation activates the subscription.","EventCategories":"A list of event categories for a source type that you want to subscribe to. If you don\'t specify this property, you are notified about all event categories. For more information, see [Working with Events and Notifications](https://docs.aws.amazon.com//dms/latest/userguide/CHAP_Events.html) in the *AWS DMS User Guide* .","SnsTopicArn":"The Amazon Resource Name (ARN) of the Amazon SNS topic created for event notification. The ARN is created by Amazon SNS when you create a topic and subscribe to it.","SourceIds":"A list of identifiers for which AWS DMS provides notification events.\\n\\nIf you don\'t specify a value, notifications are provided for all sources.\\n\\nIf you specify multiple values, they must be of the same type. For example, if you specify a database instance ID, then all of the other values must be database instance IDs.","SourceType":"The type of AWS DMS resource that generates the events. For example, if you want to be notified of events generated by a replication instance, you set this parameter to `replication-instance` . If this value isn\'t specified, all events are returned.\\n\\n*Valid values* : `replication-instance` | `replication-task`","SubscriptionName":"The name of the AWS DMS event notification subscription. This name must be less than 255 characters.","Tags":"One or more tags to be assigned to the event subscription."}},"AWS::DMS::ReplicationInstance":{"attributes":{"Ref":"`Ref` returns the replication instance ARN.","ReplicationInstancePrivateIpAddresses":"One or more private IP addresses for the replication instance.","ReplicationInstancePublicIpAddresses":"One or more public IP addresses for the replication instance."},"description":"The `AWS::DMS::ReplicationInstance` resource creates an AWS DMS replication instance. To create a ReplicationInstance, you need permissions to create instances. You\'ll need similar permissions to terminate instances when you delete stacks with instances.","properties":{"AllocatedStorage":"The amount of storage (in gigabytes) to be initially allocated for the replication instance.","AllowMajorVersionUpgrade":"Indicates that major version upgrades are allowed. Changing this parameter does not result in an outage, and the change is asynchronously applied as soon as possible.\\n\\nThis parameter must be set to `true` when specifying a value for the `EngineVersion` parameter that is a different major version than the replication instance\'s current version.","AutoMinorVersionUpgrade":"A value that indicates whether minor engine upgrades are applied automatically to the replication instance during the maintenance window. This parameter defaults to `true` .\\n\\nDefault: `true`","AvailabilityZone":"The Availability Zone that the replication instance will be created in.\\n\\nThe default value is a random, system-chosen Availability Zone in the endpoint\'s AWS Region , for example `us-east-1d` .","EngineVersion":"The engine version number of the replication instance.\\n\\nIf an engine version number is not specified when a replication instance is created, the default is the latest engine version available.","KmsKeyId":"An AWS KMS key identifier that is used to encrypt the data on the replication instance.\\n\\nIf you don\'t specify a value for the `KmsKeyId` parameter, AWS DMS uses your default encryption key.\\n\\nAWS KMS creates the default encryption key for your AWS account . Your AWS account has a different default encryption key for each AWS Region .","MultiAZ":"Specifies whether the replication instance is a Multi-AZ deployment. You can\'t set the `AvailabilityZone` parameter if the Multi-AZ parameter is set to `true` .","PreferredMaintenanceWindow":"The weekly time range during which system maintenance can occur, in UTC.\\n\\n*Format* : `ddd:hh24:mi-ddd:hh24:mi`\\n\\n*Default* : A 30-minute window selected at random from an 8-hour block of time per AWS Region , occurring on a random day of the week.\\n\\n*Valid days* ( `ddd` ): `Mon` | `Tue` | `Wed` | `Thu` | `Fri` | `Sat` | `Sun`\\n\\n*Constraints* : Minimum 30-minute window.","PubliclyAccessible":"Specifies the accessibility options for the replication instance. A value of `true` represents an instance with a public IP address. A value of `false` represents an instance with a private IP address. The default value is `true` .","ReplicationInstanceClass":"The compute and memory capacity of the replication instance as defined for the specified replication instance class. For example, to specify the instance class dms.c4.large, set this parameter to `\\"dms.c4.large\\"` . For more information on the settings and capacities for the available replication instance classes, see [Selecting the right AWS DMS replication instance for your migration](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_ReplicationInstance.html#CHAP_ReplicationInstance.InDepth) in the *AWS Database Migration Service User Guide* .","ReplicationInstanceIdentifier":"The replication instance identifier. This parameter is stored as a lowercase string.\\n\\nConstraints:\\n\\n- Must contain 1-63 alphanumeric characters or hyphens.\\n- First character must be a letter.\\n- Can\'t end with a hyphen or contain two consecutive hyphens.\\n\\nExample: `myrepinstance`","ReplicationSubnetGroupIdentifier":"A subnet group to associate with the replication instance.","ResourceIdentifier":"A display name for the resource identifier at the end of the `EndpointArn` response parameter that is returned in the created `Endpoint` object. The value for this parameter can have up to 31 characters. It can contain only ASCII letters, digits, and hyphen (\'-\'). Also, it can\'t end with a hyphen or contain two consecutive hyphens, and can only begin with a letter, such as `Example-App-ARN1` . For example, this value might result in the `EndpointArn` value `arn:aws:dms:eu-west-1:012345678901:rep:Example-App-ARN1` . If you don\'t specify a `ResourceIdentifier` value, AWS DMS generates a default identifier value for the end of `EndpointArn` .","Tags":"One or more tags to be assigned to the replication instance.","VpcSecurityGroupIds":"Specifies the virtual private cloud (VPC) security group to be used with the replication instance. The VPC security group must work with the VPC containing the replication instance."}},"AWS::DMS::ReplicationSubnetGroup":{"attributes":{"Ref":"`Ref` returns the name of the replication subnet group, such as `mystack-myrepsubnetgroup-0a12bc456789de0fg` ."},"description":"The `AWS::DMS::ReplicationSubnetGroup` resource creates an AWS DMS replication subnet group. Subnet groups must contain at least two subnets in two different Availability Zones in the same AWS Region .\\n\\n> Resource creation fails if the `dms-vpc-role` AWS Identity and Access Management ( IAM ) role doesn\'t already exist. For more information, see [Creating the IAM Roles to Use With the AWS CLI and AWS DMS API](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Security.APIRole.html) in the *AWS Database Migration Service User Guide* .","properties":{"ReplicationSubnetGroupDescription":"The description for the subnet group.","ReplicationSubnetGroupIdentifier":"The identifier for the replication subnet group. If you don\'t specify a name, AWS CloudFormation generates a unique ID and uses that ID for the identifier.","SubnetIds":"One or more subnet IDs to be assigned to the subnet group.","Tags":"One or more tags to be assigned to the subnet group."}},"AWS::DMS::ReplicationTask":{"attributes":{"Ref":"`Ref` returns the replication task ARN."},"description":"The `AWS::DMS::ReplicationTask` resource creates an AWS DMS replication task.","properties":{"CdcStartPosition":"Indicates when you want a change data capture (CDC) operation to start. Use either `CdcStartPosition` or `CdcStartTime` to specify when you want a CDC operation to start. Specifying both values results in an error.\\n\\nThe value can be in date, checkpoint, log sequence number (LSN), or system change number (SCN) format.\\n\\nHere is a date example: `--cdc-start-position \\"2018-03-08T12:12:12\\"`\\n\\nHere is a checkpoint example: `--cdc-start-position \\"checkpoint:V1#27#mysql-bin-changelog.157832:1975:-1:2002:677883278264080:mysql-bin-changelog.157832:1876#0#0#*#0#93\\"`\\n\\nHere is an LSN example: `--cdc-start-position “mysql-bin-changelog.000024:373”`\\n\\n> When you use this task setting with a source PostgreSQL database, a logical replication slot should already be created and associated with the source endpoint. You can verify this by setting the `slotName` extra connection attribute to the name of this logical replication slot. For more information, see [Extra Connection Attributes When Using PostgreSQL as a Source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.ConnectionAttrib) in the *AWS Database Migration Service User Guide* .","CdcStartTime":"Indicates the start time for a change data capture (CDC) operation.","CdcStopPosition":"Indicates when you want a change data capture (CDC) operation to stop. The value can be either server time or commit time.\\n\\nHere is a server time example: `--cdc-stop-position \\"server_time:2018-02-09T12:12:12\\"`\\n\\nHere is a commit time example: `--cdc-stop-position \\"commit_time: 2018-02-09T12:12:12\\"`","MigrationType":"The migration type. Valid values: `full-load` | `cdc` | `full-load-and-cdc`","ReplicationInstanceArn":"The Amazon Resource Name (ARN) of a replication instance.","ReplicationTaskIdentifier":"An identifier for the replication task.\\n\\nConstraints:\\n\\n- Must contain 1-255 alphanumeric characters or hyphens.\\n- First character must be a letter.\\n- Cannot end with a hyphen or contain two consecutive hyphens.","ReplicationTaskSettings":"Overall settings for the task, in JSON format. For more information, see [Specifying Task Settings for AWS Database Migration Service Tasks](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.html) in the *AWS Database Migration Service User Guide* .","ResourceIdentifier":"A display name for the resource identifier at the end of the `EndpointArn` response parameter that is returned in the created `Endpoint` object. The value for this parameter can have up to 31 characters. It can contain only ASCII letters, digits, and hyphen (\'-\'). Also, it can\'t end with a hyphen or contain two consecutive hyphens, and can only begin with a letter, such as `Example-App-ARN1` .\\n\\nFor example, this value might result in the `EndpointArn` value `arn:aws:dms:eu-west-1:012345678901:rep:Example-App-ARN1` . If you don\'t specify a `ResourceIdentifier` value, AWS DMS generates a default identifier value for the end of `EndpointArn` .","SourceEndpointArn":"An Amazon Resource Name (ARN) that uniquely identifies the source endpoint.","TableMappings":"The table mappings for the task, in JSON format. For more information, see [Using Table Mapping to Specify Task Settings](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.html) in the *AWS Database Migration Service User Guide* .","Tags":"One or more tags to be assigned to the replication task.","TargetEndpointArn":"An Amazon Resource Name (ARN) that uniquely identifies the target endpoint.","TaskData":""}},"AWS::DataBrew::Dataset":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myDataset\\" }`\\n\\nFor an AWS Glue DataBrew dataset named `myDataset` , `Ref` returns the name of the dataset."},"description":"Specifies a new DataBrew dataset.","properties":{"Format":"The file format of a dataset that is created from an Amazon S3 file or folder.","FormatOptions":"A set of options that define how DataBrew interprets the data in the dataset.","Input":"Information on how DataBrew can find the dataset, in either the AWS Glue Data Catalog or Amazon S3 .","Name":"The unique name of the dataset.","PathOptions":"A set of options that defines how DataBrew interprets an Amazon S3 path of the dataset.","Tags":"Metadata tags that have been applied to the dataset."}},"AWS::DataBrew::Dataset.CsvOptions":{"attributes":{},"description":"Represents a set of options that define how DataBrew will read a comma-separated value (CSV) file when creating a dataset from that file.","properties":{"Delimiter":"A single character that specifies the delimiter being used in the CSV file.","HeaderRow":"A variable that specifies whether the first row in the file is parsed as the header. If this value is false, column names are auto-generated."}},"AWS::DataBrew::Dataset.DataCatalogInputDefinition":{"attributes":{},"description":"Represents how metadata stored in the AWS Glue Data Catalog is defined in a DataBrew dataset.","properties":{"CatalogId":"The unique identifier of the AWS account that holds the Data Catalog that stores the data.","DatabaseName":"The name of a database in the Data Catalog.","TableName":"The name of a database table in the Data Catalog. This table corresponds to a DataBrew dataset.","TempDirectory":"An Amazon location that AWS Glue Data Catalog can use as a temporary directory."}},"AWS::DataBrew::Dataset.DatabaseInputDefinition":{"attributes":{},"description":"Connection information for dataset input files stored in a database.","properties":{"DatabaseTableName":"The table within the target database.","GlueConnectionName":"The AWS Glue Connection that stores the connection information for the target database.","QueryString":"Custom SQL to run against the provided AWS Glue connection. This SQL will be used as the input for DataBrew projects and jobs.","TempDirectory":"An Amazon location that AWS Glue Data Catalog can use as a temporary directory."}},"AWS::DataBrew::Dataset.DatasetParameter":{"attributes":{},"description":"Represents a dataset paramater that defines type and conditions for a parameter in the Amazon S3 path of the dataset.","properties":{"CreateColumn":"Optional boolean value that defines whether the captured value of this parameter should be loaded as an additional column in the dataset.","DatetimeOptions":"Additional parameter options such as a format and a timezone. Required for datetime parameters.","Filter":"The optional filter expression structure to apply additional matching criteria to the parameter.","Name":"The name of the parameter that is used in the dataset\'s Amazon S3 path.","Type":"The type of the dataset parameter, can be one of a \'String\', \'Number\' or \'Datetime\'."}},"AWS::DataBrew::Dataset.DatetimeOptions":{"attributes":{},"description":"Represents additional options for correct interpretation of datetime parameters used in the Amazon S3 path of a dataset.","properties":{"Format":"Required option, that defines the datetime format used for a date parameter in the Amazon S3 path. Should use only supported datetime specifiers and separation characters, all litera a-z or A-Z character should be escaped with single quotes. E.g. \\"MM.dd.yyyy-\'at\'-HH:mm\\".","LocaleCode":"Optional value for a non-US locale code, needed for correct interpretation of some date formats.","TimezoneOffset":"Optional value for a timezone offset of the datetime parameter value in the Amazon S3 path. Shouldn\'t be used if Format for this parameter includes timezone fields. If no offset specified, UTC is assumed."}},"AWS::DataBrew::Dataset.ExcelOptions":{"attributes":{},"description":"Represents a set of options that define how DataBrew will interpret a Microsoft Excel file when creating a dataset from that file.","properties":{"HeaderRow":"A variable that specifies whether the first row in the file is parsed as the header. If this value is false, column names are auto-generated.","SheetIndexes":"One or more sheet numbers in the Excel file that will be included in the dataset.","SheetNames":"One or more named sheets in the Excel file that will be included in the dataset."}},"AWS::DataBrew::Dataset.FilesLimit":{"attributes":{},"description":"Represents a limit imposed on number of Amazon S3 files that should be selected for a dataset from a connected Amazon S3 path.","properties":{"MaxFiles":"The number of Amazon S3 files to select.","Order":"A criteria to use for Amazon S3 files sorting before their selection. By default uses DESCENDING order, i.e. most recent files are selected first. Anotherpossible value is ASCENDING.","OrderedBy":"A criteria to use for Amazon S3 files sorting before their selection. By default uses LAST_MODIFIED_DATE as a sorting criteria. Currently it\'s the only allowed value."}},"AWS::DataBrew::Dataset.FilterExpression":{"attributes":{},"description":"Represents a structure for defining parameter conditions.","properties":{"Expression":"The expression which includes condition names followed by substitution variables, possibly grouped and combined with other conditions. For example, \\"(starts_with :prefix1 or starts_with :prefix2) and (ends_with :suffix1 or ends_with :suffix2)\\". Substitution variables should start with \':\' symbol.","ValuesMap":"The map of substitution variable names to their values used in this filter expression."}},"AWS::DataBrew::Dataset.FilterValue":{"attributes":{},"description":"Represents a single entry in the `ValuesMap` of a `FilterExpression` . A `FilterValue` associates the name of a substitution variable in an expression to its value.","properties":{"Value":"The value to be associated with the substitution variable.","ValueReference":"The substitution variable reference."}},"AWS::DataBrew::Dataset.FormatOptions":{"attributes":{},"description":"Represents a set of options that define the structure of either comma-separated value (CSV), Excel, or JSON input.","properties":{"Csv":"Options that define how CSV input is to be interpreted by DataBrew.","Excel":"Options that define how Excel input is to be interpreted by DataBrew.","Json":"Options that define how JSON input is to be interpreted by DataBrew."}},"AWS::DataBrew::Dataset.Input":{"attributes":{},"description":"Represents information on how DataBrew can find data, in either the AWS Glue Data Catalog or Amazon S3.","properties":{"DataCatalogInputDefinition":"The AWS Glue Data Catalog parameters for the data.","DatabaseInputDefinition":"Connection information for dataset input files stored in a database.","Metadata":"Contains additional resource information needed for specific datasets.","S3InputDefinition":"The Amazon S3 location where the data is stored."}},"AWS::DataBrew::Dataset.JsonOptions":{"attributes":{},"description":"Represents the JSON-specific options that define how input is to be interpreted by AWS Glue DataBrew .","properties":{"MultiLine":"A value that specifies whether JSON input contains embedded new line characters."}},"AWS::DataBrew::Dataset.Metadata":{"attributes":{},"description":"Contains additional resource information needed for specific datasets.","properties":{"SourceArn":"The Amazon Resource Name (ARN) associated with the dataset. Currently, DataBrew only supports ARNs from Amazon AppFlow."}},"AWS::DataBrew::Dataset.PathOptions":{"attributes":{},"description":"Represents a set of options that define how DataBrew selects files for a given Amazon S3 path in a dataset.","properties":{"FilesLimit":"If provided, this structure imposes a limit on a number of files that should be selected.","LastModifiedDateCondition":"If provided, this structure defines a date range for matching Amazon S3 objects based on their LastModifiedDate attribute in Amazon S3 .","Parameters":"A structure that maps names of parameters used in the Amazon S3 path of a dataset to their definitions."}},"AWS::DataBrew::Dataset.PathParameter":{"attributes":{},"description":"Represents a single entry in the path parameters of a dataset. Each `PathParameter` consists of a name and a parameter definition.","properties":{"DatasetParameter":"The path parameter definition.","PathParameterName":"The name of the path parameter."}},"AWS::DataBrew::Dataset.S3Location":{"attributes":{},"description":"Represents an Amazon S3 location (bucket name, bucket owner, and object key) where DataBrew can read input data, or write output from a job.","properties":{"Bucket":"The Amazon S3 bucket name.","Key":"The unique name of the object in the bucket."}},"AWS::DataBrew::Job":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myJob\\" }`\\n\\nFor an AWS Glue DataBrew job named `myJob` , `Ref` returns the name of the job."},"description":"Specifies a new DataBrew job.","properties":{"DataCatalogOutputs":"One or more artifacts that represent the AWS Glue Data Catalog output from running the job.","DatabaseOutputs":"Represents a list of JDBC database output objects which defines the output destination for a DataBrew recipe job to write into.","DatasetName":"A dataset that the job is to process.","EncryptionKeyArn":"The Amazon Resource Name (ARN) of an encryption key that is used to protect the job output. For more information, see [Encrypting data written by DataBrew jobs](https://docs.aws.amazon.com/databrew/latest/dg/encryption-security-configuration.html)","EncryptionMode":"The encryption mode for the job, which can be one of the following:\\n\\n- `SSE-KMS` - Server-side encryption with keys managed by AWS KMS .\\n- `SSE-S3` - Server-side encryption with keys managed by Amazon S3.","JobSample":"A sample configuration for profile jobs only, which determines the number of rows on which the profile job is run. If a `JobSample` value isn\'t provided, the default value is used. The default value is CUSTOM_ROWS for the mode parameter and 20,000 for the size parameter.","LogSubscription":"The current status of Amazon CloudWatch logging for the job.","MaxCapacity":"The maximum number of nodes that can be consumed when the job processes data.","MaxRetries":"The maximum number of times to retry the job after a job run fails.","Name":"The unique name of the job.","OutputLocation":"","Outputs":"One or more artifacts that represent output from running the job.","ProfileConfiguration":"Configuration for profile jobs. Configuration can be used to select columns, do evaluations, and override default parameters of evaluations. When configuration is undefined, the profile job will apply default settings to all supported columns.","ProjectName":"The name of the project that the job is associated with.","Recipe":"A series of data transformation steps that the job runs.","RoleArn":"The Amazon Resource Name (ARN) of the role to be assumed for this job.","Tags":"Metadata tags that have been applied to the job.","Timeout":"The job\'s timeout in minutes. A job that attempts to run longer than this timeout period ends with a status of `TIMEOUT` .","Type":"The job type of the job, which must be one of the following:\\n\\n- `PROFILE` - A job to analyze a dataset, to determine its size, data types, data distribution, and more.\\n- `RECIPE` - A job to apply one or more transformations to a dataset.","ValidationConfigurations":"List of validation configurations that are applied to the profile job."}},"AWS::DataBrew::Job.AllowedStatistics":{"attributes":{},"description":"Configuration of statistics that are allowed to be run on columns that contain detected entities. When undefined, no statistics will be computed on columns that contain detected entities.","properties":{"Statistics":"One or more column statistics to allow for columns that contain detected entities."}},"AWS::DataBrew::Job.ColumnSelector":{"attributes":{},"description":"Selector of a column from a dataset for profile job configuration. One selector includes either a column name or a regular expression.","properties":{"Name":"The name of a column from a dataset.","Regex":"A regular expression for selecting a column from a dataset."}},"AWS::DataBrew::Job.ColumnStatisticsConfiguration":{"attributes":{},"description":"Configuration for column evaluations for a profile job. ColumnStatisticsConfiguration can be used to select evaluations and override parameters of evaluations for particular columns.","properties":{"Selectors":"List of column selectors. Selectors can be used to select columns from the dataset. When selectors are undefined, configuration will be applied to all supported columns.","Statistics":"Configuration for evaluations. Statistics can be used to select evaluations and override parameters of evaluations."}},"AWS::DataBrew::Job.CsvOutputOptions":{"attributes":{},"description":"Represents a set of options that define how DataBrew will write a comma-separated value (CSV) file.","properties":{"Delimiter":"A single character that specifies the delimiter used to create CSV job output."}},"AWS::DataBrew::Job.DataCatalogOutput":{"attributes":{},"description":"Represents options that specify how and where in the AWS Glue Data Catalog DataBrew writes the output generated by recipe jobs.","properties":{"CatalogId":"The unique identifier of the AWS account that holds the Data Catalog that stores the data.","DatabaseName":"The name of a database in the Data Catalog.","DatabaseOptions":"Represents options that specify how and where DataBrew writes the database output generated by recipe jobs.","Overwrite":"A value that, if true, means that any data in the location specified for output is overwritten with new output. Not supported with DatabaseOptions.","S3Options":"Represents options that specify how and where DataBrew writes the Amazon S3 output generated by recipe jobs.","TableName":"The name of a table in the Data Catalog."}},"AWS::DataBrew::Job.DatabaseOutput":{"attributes":{},"description":"Represents a JDBC database output object which defines the output destination for a DataBrew recipe job to write into.","properties":{"DatabaseOptions":"Represents options that specify how and where DataBrew writes the database output generated by recipe jobs.","DatabaseOutputMode":"The output mode to write into the database. Currently supported option: NEW_TABLE.","GlueConnectionName":"The AWS Glue connection that stores the connection information for the target database."}},"AWS::DataBrew::Job.DatabaseTableOutputOptions":{"attributes":{},"description":"Represents options that specify how and where DataBrew writes the database output generated by recipe jobs.","properties":{"TableName":"A prefix for the name of a table DataBrew will create in the database.","TempDirectory":"Represents an Amazon S3 location (bucket name and object key) where DataBrew can store intermediate results."}},"AWS::DataBrew::Job.EntityDetectorConfiguration":{"attributes":{},"description":"Configuration of entity detection for a profile job. When undefined, entity detection is disabled.","properties":{"AllowedStatistics":"Configuration of statistics that are allowed to be run on columns that contain detected entities. When undefined, no statistics will be computed on columns that contain detected entities.","EntityTypes":"Entity types to detect. Can be any of the following:\\n\\n- USA_SSN\\n- EMAIL\\n- USA_ITIN\\n- USA_PASSPORT_NUMBER\\n- PHONE_NUMBER\\n- USA_DRIVING_LICENSE\\n- BANK_ACCOUNT\\n- CREDIT_CARD\\n- IP_ADDRESS\\n- MAC_ADDRESS\\n- USA_DEA_NUMBER\\n- USA_HCPCS_CODE\\n- USA_NATIONAL_PROVIDER_IDENTIFIER\\n- USA_NATIONAL_DRUG_CODE\\n- USA_HEALTH_INSURANCE_CLAIM_NUMBER\\n- USA_MEDICARE_BENEFICIARY_IDENTIFIER\\n- USA_CPT_CODE\\n- PERSON_NAME\\n- DATE\\n\\nThe Entity type group USA_ALL is also supported, and includes all of the above entity types except PERSON_NAME and DATE."}},"AWS::DataBrew::Job.JobSample":{"attributes":{},"description":"A sample configuration for profile jobs only, which determines the number of rows on which the profile job is run. If a `JobSample` value isn\'t provided, the default is used. The default value is CUSTOM_ROWS for the mode parameter and 20,000 for the size parameter.","properties":{"Mode":"A value that determines whether the profile job is run on the entire dataset or a specified number of rows. This value must be one of the following:\\n\\n- FULL_DATASET - The profile job is run on the entire dataset.\\n- CUSTOM_ROWS - The profile job is run on the number of rows specified in the `Size` parameter.","Size":"The `Size` parameter is only required when the mode is CUSTOM_ROWS. The profile job is run on the specified number of rows. The maximum value for size is Long.MAX_VALUE.\\n\\nLong.MAX_VALUE = 9223372036854775807"}},"AWS::DataBrew::Job.Output":{"attributes":{},"description":"Represents options that specify how and where in Amazon S3 DataBrew writes the output generated by recipe jobs or profile jobs.","properties":{"CompressionFormat":"The compression algorithm used to compress the output text of the job.","Format":"The data format of the output of the job.","FormatOptions":"Represents options that define how DataBrew formats job output files.","Location":"The location in Amazon S3 where the job writes its output.","MaxOutputFiles":"The maximum number of files to be generated by the job and written to the output folder.","Overwrite":"A value that, if true, means that any data in the location specified for output is overwritten with new output.","PartitionColumns":"The names of one or more partition columns for the output of the job."}},"AWS::DataBrew::Job.OutputFormatOptions":{"attributes":{},"description":"Represents a set of options that define the structure of comma-separated (CSV) job output.","properties":{"Csv":"Represents a set of options that define the structure of comma-separated value (CSV) job output."}},"AWS::DataBrew::Job.OutputLocation":{"attributes":{},"description":"The location in Amazon S3 or AWS Glue Data Catalog where the job writes its output.","properties":{"Bucket":"The Amazon S3 bucket name.","BucketOwner":"","Key":"The unique name of the object in the bucket."}},"AWS::DataBrew::Job.ProfileConfiguration":{"attributes":{},"description":"Configuration for profile jobs. Configuration can be used to select columns, do evaluations, and override default parameters of evaluations. When configuration is undefined, the profile job will apply default settings to all supported columns.","properties":{"ColumnStatisticsConfigurations":"List of configurations for column evaluations. ColumnStatisticsConfigurations are used to select evaluations and override parameters of evaluations for particular columns. When ColumnStatisticsConfigurations is undefined, the profile job will profile all supported columns and run all supported evaluations.","DatasetStatisticsConfiguration":"Configuration for inter-column evaluations. Configuration can be used to select evaluations and override parameters of evaluations. When configuration is undefined, the profile job will run all supported inter-column evaluations.","EntityDetectorConfiguration":"Configuration of entity detection for a profile job. When undefined, entity detection is disabled.","ProfileColumns":"List of column selectors. ProfileColumns can be used to select columns from the dataset. When ProfileColumns is undefined, the profile job will profile all supported columns."}},"AWS::DataBrew::Job.Recipe":{"attributes":{},"description":"Represents one or more actions to be performed on a DataBrew dataset.","properties":{"Name":"The unique name for the recipe.","Version":"The identifier for the version for the recipe."}},"AWS::DataBrew::Job.S3Location":{"attributes":{},"description":"Represents an Amazon S3 location (bucket name, bucket owner, and object key) where DataBrew can read input data, or write output from a job.","properties":{"Bucket":"The Amazon S3 bucket name.","BucketOwner":"The AWS account ID of the bucket owner.","Key":"The unique name of the object in the bucket."}},"AWS::DataBrew::Job.S3TableOutputOptions":{"attributes":{},"description":"Represents options that specify how and where DataBrew writes the Amazon S3 output generated by recipe jobs.","properties":{"Location":"Represents an Amazon S3 location (bucket name and object key) where DataBrew can write output from a job."}},"AWS::DataBrew::Job.StatisticOverride":{"attributes":{},"description":"Override of a particular evaluation for a profile job.","properties":{"Parameters":"A map that includes overrides of an evaluation’s parameters.","Statistic":"The name of an evaluation"}},"AWS::DataBrew::Job.StatisticsConfiguration":{"attributes":{},"description":"Configuration of evaluations for a profile job. This configuration can be used to select evaluations and override the parameters of selected evaluations.","properties":{"IncludedStatistics":"List of included evaluations. When the list is undefined, all supported evaluations will be included.","Overrides":"List of overrides for evaluations."}},"AWS::DataBrew::Job.ValidationConfiguration":{"attributes":{},"description":"Configuration for data quality validation. Used to select the Rulesets and Validation Mode to be used in the profile job. When ValidationConfiguration is null, the profile job will run without data quality validation.","properties":{"RulesetArn":"The Amazon Resource Name (ARN) for the ruleset to be validated in the profile job. The TargetArn of the selected ruleset should be the same as the Amazon Resource Name (ARN) of the dataset that is associated with the profile job.","ValidationMode":"Mode of data quality validation. Default mode is “CHECK_ALL” which verifies all rules defined in the selected ruleset."}},"AWS::DataBrew::Project":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myProject\\" }`\\n\\nFor an AWS Glue DataBrew project named `myProject` , `Ref` returns the name of the project."},"description":"Specifies a new AWS Glue DataBrew project.","properties":{"DatasetName":"The dataset that the project is to act upon.","Name":"The unique name of a project.","RecipeName":"The name of a recipe that will be developed during a project session.","RoleArn":"The Amazon Resource Name (ARN) of the role that will be assumed for this project.","Sample":"The sample size and sampling type to apply to the data. If this parameter isn\'t specified, then the sample consists of the first 500 rows from the dataset.","Tags":"Metadata tags that have been applied to the project."}},"AWS::DataBrew::Project.Sample":{"attributes":{},"description":"Represents the sample size and sampling type for DataBrew to use for interactive data analysis.","properties":{"Size":"The number of rows in the sample.","Type":"The way in which DataBrew obtains rows from a dataset."}},"AWS::DataBrew::Recipe":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myRecipe\\" }`\\n\\nFor an AWS Glue DataBrew recipe named `myRecipe` , `Ref` returns the name of the recipe."},"description":"Specifies a new AWS Glue DataBrew transformation recipe.","properties":{"Description":"The description of the recipe.","Name":"The unique name for the recipe.","Steps":"A list of steps that are defined by the recipe.","Tags":"Metadata tags that have been applied to the recipe."}},"AWS::DataBrew::Recipe.Action":{"attributes":{},"description":"Represents a transformation and associated parameters that are used to apply a change to an AWS Glue DataBrew dataset.","properties":{"Operation":"The name of a valid DataBrew transformation to be performed on the data.","Parameters":"Contextual parameters for the transformation."}},"AWS::DataBrew::Recipe.ConditionExpression":{"attributes":{},"description":"Represents an individual condition that evaluates to true or false.\\n\\nConditions are used with recipe actions. The action is only performed for column values where the condition evaluates to true.\\n\\nIf a recipe requires more than one condition, then the recipe must specify multiple `ConditionExpression` elements. Each condition is applied to the rows in a dataset first, before the recipe action is performed.","properties":{"Condition":"A specific condition to apply to a recipe action. For more information, see [Recipe structure](https://docs.aws.amazon.com/databrew/latest/dg/recipe-structure.html) in the *AWS Glue DataBrew Developer Guide* .","TargetColumn":"A column to apply this condition to.","Value":"A value that the condition must evaluate to for the condition to succeed."}},"AWS::DataBrew::Recipe.DataCatalogInputDefinition":{"attributes":{},"description":"Represents how metadata stored in the AWS Glue Data Catalog is defined in a DataBrew dataset.","properties":{"CatalogId":"The unique identifier of the AWS account that holds the Data Catalog that stores the data.","DatabaseName":"The name of a database in the Data Catalog.","TableName":"The name of a database table in the Data Catalog. This table corresponds to a DataBrew dataset.","TempDirectory":"Represents an Amazon location where DataBrew can store intermediate results."}},"AWS::DataBrew::Recipe.Input":{"attributes":{},"description":"","properties":{"DataCatalogInputDefinition":"","S3InputDefinition":""}},"AWS::DataBrew::Recipe.RecipeParameters":{"attributes":{},"description":"Parameters that are used as inputs for various recipe actions. The parameters are specific to the context in which they\'re used.","properties":{"AggregateFunction":"The name of an aggregation function to apply.","Base":"The number of digits used in a counting system.","CaseStatement":"A case statement associated with a recipe.","CategoryMap":"A category map used for one-hot encoding.","CharsToRemove":"Characters to remove from a step that applies one-hot encoding or tokenization.","CollapseConsecutiveWhitespace":"Remove any non-word non-punctuation character.","ColumnDataType":"The data type of the column.","ColumnRange":"A range of columns to which a step is applied.","Count":"The number of times a string needs to be repeated.","CustomCharacters":"One or more characters that can be substituted or removed, depending on the context.","CustomStopWords":"A list of words to ignore in a step that applies word tokenization.","CustomValue":"A list of custom values to use in a step that requires that you provide a value to finish the operation.","DatasetsColumns":"A list of the dataset columns included in a project.","DateAddValue":"A value that specifies how many units of time to add or subtract for a date math operation.","DateTimeFormat":"A date format to apply to a date.","DateTimeParameters":"A set of parameters associated with a datetime.","DeleteOtherRows":"Determines whether unmapped rows in a categorical mapping should be deleted","Delimiter":"The delimiter to use when parsing separated values in a text file.","EndPattern":"The end pattern to locate.","EndPosition":"The end position to locate.","EndValue":"The end value to locate.","ExpandContractions":"A list of word contractions and what they expand to. For eample: *can\'t* ; *cannot* ; *can not* .","Exponent":"The exponent to apply in an exponential operation.","FalseString":"A value that represents `FALSE` .","GroupByAggFunctionOptions":"Specifies options to apply to the `GROUP BY` used in an aggregation.","GroupByColumns":"The columns to use in the `GROUP BY` clause.","HiddenColumns":"A list of columns to hide.","IgnoreCase":"Indicates that lower and upper case letters are treated equally.","IncludeInSplit":"Indicates if this column is participating in a split transform.","Input":"The input location to load the dataset from - Amazon S3 or AWS Glue Data Catalog .","Interval":"The number of characters to split by.","IsText":"Indicates if the content is text.","JoinKeys":"The keys or columns involved in a join.","JoinType":"The type of join to use, for example, `INNER JOIN` , `OUTER JOIN` , and so on.","LeftColumns":"The columns on the left side of the join.","Limit":"The number of times to perform `split` or `replaceBy` in a string","LowerBound":"The lower boundary for a value.","MapType":"The type of mappings to apply to construct a new dynamic frame.","ModeType":"Determines the manner in which mode value is calculated, in case there is more than one mode value. Valid values: `NONE` | `AVERAGE` | `MINIMUM` | `MAXIMUM`","MultiLine":"Specifies whether JSON input contains embedded new line characters.","NumRows":"The number of rows to consider in a window.","NumRowsAfter":"The number of rows to consider after the current row in a window","NumRowsBefore":"The number of rows to consider before the current row in a window","OrderByColumn":"A column to sort the results by.","OrderByColumns":"The columns to sort the results by.","Other":"The value to assign to unmapped cells, in categorical mapping","Pattern":"The pattern to locate.","PatternOption1":"The starting pattern to split between.","PatternOption2":"The ending pattern to split between.","PatternOptions":"For splitting by multiple delimiters: A JSON-encoded string that lists the patterns in the format. For example: `[{\\\\\\"pattern\\\\\\":\\\\\\"1\\\\\\",\\\\\\"includeInSplit\\\\\\":true}]`","Period":"The size of the rolling window.","Position":"The character index within a string","RemoveAllPunctuation":"If `true` , removes all of the following characters: `.` `.!` `.,` `.?`","RemoveAllQuotes":"If `true` , removes all single quotes and double quotes.","RemoveAllWhitespace":"If `true` , removes all whitespaces from the value.","RemoveCustomCharacters":"If `true` , removes all chraracters specified by `CustomCharacters` .","RemoveCustomValue":"If `true` , removes all chraracters specified by `CustomValue` .","RemoveLeadingAndTrailingPunctuation":"If `true` , removes the following characters if they occur at the start or end of the value: `.` `!` `,` `?`","RemoveLeadingAndTrailingQuotes":"If `true` , removes single quotes and double quotes from the beginning and end of the value.","RemoveLeadingAndTrailingWhitespace":"If `true` , removes all whitespaces from the beginning and end of the value.","RemoveLetters":"If `true` , removes all uppercase and lowercase alphabetic characters (A through Z; a through z).","RemoveNumbers":"If `true` , removes all numeric characters (0 through 9).","RemoveSourceColumn":"If `true` , the source column will be removed after un-nesting that column. (Used with nested column types, such as Map, Struct, or Array.)","RemoveSpecialCharacters":"If `true` , removes all of the following characters: `! \\" # $ % & \' ( ) * + , - . / : ; < = > ? @ [ \\\\ ] ^ _ ` { | } ~`","RightColumns":"The columns on the right side of a join.","SampleSize":"The number of rows in the sample.","SampleType":"The sampling type to apply to the dataset. Valid values: `FIRST_N` | `LAST_N` | `RANDOM`","SecondInput":"A object value to indicate the second dataset used in a join.","SecondaryInputs":"A list of secondary inputs in a UNION transform","SheetIndexes":"One or more sheet numbers in the Excel file, which will be included in a dataset.","SheetNames":"Oone or more named sheets in the Excel file, which will be included in a dataset.","SourceColumn":"A source column needed for an operation, step, or transform.","SourceColumn1":"A source column needed for an operation, step, or transform.","SourceColumn2":"A source column needed for an operation, step, or transform.","SourceColumns":"A list of source columns needed for an operation, step, or transform.","StartColumnIndex":"The index number of the first column used by an operation, step, or transform.","StartPattern":"The starting pattern to locate.","StartPosition":"The starting position to locate.","StartValue":"The starting value to locate.","StemmingMode":"Indicates this operation uses stems and lemmas (base words) for word tokenization.","StepCount":"The total number of transforms in this recipe.","StepIndex":"The index ID of a step.","StopWordsMode":"Indicates this operation uses stop words as part of word tokenization.","Strategy":"The resolution strategy to apply in resolving ambiguities.","TargetColumn":"The column targeted by this operation.","TargetColumnNames":"The names to give columns altered by this operation.","TargetDateFormat":"The date format to convert to.","TargetIndex":"The index number of an object that is targeted by this operation.","TimeZone":"The current timezone that you want to use for dates.","TokenizerPattern":"A regex expression to use when splitting text into terms, also called words or tokens.","TrueString":"A value to use to represent `TRUE` .","UdfLang":"The language that\'s used in the user-defined function.","Units":"Specifies a unit of time. For example: `MINUTES` ; `SECONDS` ; `HOURS` ; etc.","UnpivotColumn":"Cast columns as rows, so that each value is a different row in a single column.","UpperBound":"The upper boundary for a value.","UseNewDataFrame":"Create a new container to hold a dataset.","Value":"A static value that can be used in a comparison, a substitution, or in another context-specific way. A `Value` can be a number, string, or other datatype, depending on the recipe action in which it\'s used.","Value1":"A value that\'s used by this operation.","Value2":"A value that\'s used by this operation.","ValueColumn":"The column that is provided as a value that\'s used by this operation.","ViewFrame":"The subset of rows currently available for viewing."}},"AWS::DataBrew::Recipe.RecipeStep":{"attributes":{},"description":"Represents a single step from a DataBrew recipe to be performed.","properties":{"Action":"The particular action to be performed in the recipe step.","ConditionExpressions":"One or more conditions that must be met for the recipe step to succeed.\\n\\n> All of the conditions in the array must be met. In other words, all of the conditions must be combined using a logical AND operation."}},"AWS::DataBrew::Recipe.S3Location":{"attributes":{},"description":"Represents an Amazon S3 location (bucket name, bucket owner, and object key) where DataBrew can read input data, or write output from a job.","properties":{"Bucket":"The Amazon S3 bucket name.","Key":"The unique name of the object in the bucket."}},"AWS::DataBrew::Recipe.SecondaryInput":{"attributes":{},"description":"Represents secondary inputs in a UNION transform.","properties":{"DataCatalogInputDefinition":"The AWS Glue Data Catalog parameters for the data.","S3InputDefinition":"The Amazon S3 location where the data is stored."}},"AWS::DataBrew::Ruleset":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, Ref returns the resource name. For example, `{ \\"Ref\\": \\"myRuleset\\" }` .\\n\\nFor an AWS Glue DataBrew ruleset named `myRuleset` , `Ref` returns the name of the ruleset."},"description":"Specifies a new ruleset that can be used in a profile job to validate the data quality of a dataset.","properties":{"Description":"The description of the ruleset.","Name":"The name of the ruleset.","Rules":"Contains metadata about the ruleset.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","TargetArn":"The Amazon Resource Name (ARN) of a resource (dataset) that the ruleset is associated with."}},"AWS::DataBrew::Ruleset.ColumnSelector":{"attributes":{},"description":"Selector of a column from a dataset for profile job configuration. One selector includes either a column name or a regular expression.","properties":{"Name":"The name of a column from a dataset.","Regex":"A regular expression for selecting a column from a dataset."}},"AWS::DataBrew::Ruleset.Rule":{"attributes":{},"description":"Represents a single data quality requirement that should be validated in the scope of this dataset.","properties":{"CheckExpression":"The expression which includes column references, condition names followed by variable references, possibly grouped and combined with other conditions. For example, `(:col1 starts_with :prefix1 or :col1 starts_with :prefix2) and (:col1 ends_with :suffix1 or :col1 ends_with :suffix2)` . Column and value references are substitution variables that should start with the \':\' symbol. Depending on the context, substitution variables\' values can be either an actual value or a column name. These values are defined in the SubstitutionMap. If a CheckExpression starts with a column reference, then ColumnSelectors in the rule should be null. If ColumnSelectors has been defined, then there should be no columnn reference in the left side of a condition, for example, `is_between :val1 and :val2` .","ColumnSelectors":"List of column selectors. Selectors can be used to select columns using a name or regular expression from the dataset. Rule will be applied to selected columns.","Disabled":"A value that specifies whether the rule is disabled. Once a rule is disabled, a profile job will not validate it during a job run. Default value is false.","Name":"The name of the rule.","SubstitutionMap":"The map of substitution variable names to their values used in a check expression. Variable names should start with a \':\' (colon). Variable values can either be actual values or column names. To differentiate between the two, column names should be enclosed in backticks, for example, `\\":col1\\": \\"`Column A`\\".`","Threshold":"The threshold used with a non-aggregate check expression. Non-aggregate check expressions will be applied to each row in a specific column, and the threshold will be used to determine whether the validation succeeds."}},"AWS::DataBrew::Ruleset.SubstitutionValue":{"attributes":{},"description":"A key-value pair to associate an expression\'s substitution variable names with their values.","properties":{"Value":"Value or column name.","ValueReference":"Variable name."}},"AWS::DataBrew::Ruleset.Threshold":{"attributes":{},"description":"The threshold used with a non-aggregate check expression. The non-aggregate check expression will be applied to each row in a specific column. Then the threshold will be used to determine whether the validation succeeds.","properties":{"Type":"The type of a threshold. Used for comparison of an actual count of rows that satisfy the rule to the threshold value.","Unit":"Unit of threshold value. Can be either a COUNT or PERCENTAGE of the full sample size used for validation.","Value":"The value of a threshold."}},"AWS::DataBrew::Schedule":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"mySchedule\\" }`\\n\\nFor an AWS Glue DataBrew schedule named `mySchedule` , `Ref` returns the name of the schedule."},"description":"Specifies a new schedule for one or more AWS Glue DataBrew jobs. Jobs can be run at a specific date and time, or at regular intervals.","properties":{"CronExpression":"The dates and times when the job is to run. For more information, see [Working with cron expressions for recipe jobs](https://docs.aws.amazon.com/databrew/latest/dg/jobs.recipe.html#jobs.cron) in the *AWS Glue DataBrew Developer Guide* .","JobNames":"A list of jobs to be run, according to the schedule.","Name":"The name of the schedule.","Tags":"Metadata tags that have been applied to the schedule."}},"AWS::DataPipeline::Pipeline":{"attributes":{"PipelineId":"","Ref":"`Ref` returns the pipeline ID."},"description":"The AWS::DataPipeline::Pipeline resource specifies a data pipeline that you can use to automate the movement and transformation of data. In each pipeline, you define pipeline objects, such as activities, schedules, data nodes, and resources. For information about pipeline objects and components that you can use, see [Pipeline Object Reference](https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-pipeline-objects.html) in the *AWS Data Pipeline Developer Guide* .\\n\\nThe `AWS::DataPipeline::Pipeline` resource adds tasks, schedules, and preconditions to the specified pipeline. You can use `PutPipelineDefinition` to populate a new pipeline.\\n\\n`PutPipelineDefinition` also validates the configuration as it adds it to the pipeline. Changes to the pipeline are saved unless one of the following validation errors exist in the pipeline.\\n\\n- An object is missing a name or identifier field.\\n- A string or reference field is empty.\\n- The number of objects in the pipeline exceeds the allowed maximum number of objects.\\n- The pipeline is in a FINISHED state.\\n\\nPipeline object definitions are passed to the [PutPipelineDefinition](https://docs.aws.amazon.com/datapipeline/latest/APIReference/API_PutPipelineDefinition.html) action and returned by the [GetPipelineDefinition](https://docs.aws.amazon.com/datapipeline/latest/APIReference/API_GetPipelineDefinition.html) action.","properties":{"Activate":"Indicates whether to validate and start the pipeline or stop an active pipeline. By default, the value is set to `true` .","Description":"A description of the pipeline.","Name":"The name of the pipeline.","ParameterObjects":"The parameter objects used with the pipeline.","ParameterValues":"The parameter values used with the pipeline.","PipelineObjects":"The objects that define the pipeline. These objects overwrite the existing pipeline definition. Not all objects, fields, and values can be updated. For information about restrictions, see [Editing Your Pipeline](https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-manage-pipeline-modify-console.html) in the *AWS Data Pipeline Developer Guide* .","PipelineTags":"A list of arbitrary tags (key-value pairs) to associate with the pipeline, which you can use to control permissions. For more information, see [Controlling Access to Pipelines and Resources](https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-control-access.html) in the *AWS Data Pipeline Developer Guide* ."}},"AWS::DataPipeline::Pipeline.Field":{"attributes":{},"description":"A key-value pair that describes a property of a `PipelineObject` . The value is specified as either a string value ( `StringValue` ) or a reference to another object ( `RefValue` ) but not as both. To view fields for a data pipeline object, see [Pipeline Object Reference](https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-pipeline-objects.html) in the *AWS Data Pipeline Developer Guide* .","properties":{"Key":"Specifies the name of a field for a particular object. To view valid values for a particular field, see [Pipeline Object Reference](https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-pipeline-objects.html) in the *AWS Data Pipeline Developer Guide* .","RefValue":"A field value that you specify as an identifier of another object in the same pipeline definition.\\n\\n> You can specify the field value as either a string value ( `StringValue` ) or a reference to another object ( `RefValue` ), but not both. \\n\\nRequired if the key that you are using requires it.","StringValue":"A field value that you specify as a string. To view valid values for a particular field, see [Pipeline Object Reference](https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-pipeline-objects.html) in the *AWS Data Pipeline Developer Guide* .\\n\\n> You can specify the field value as either a string value ( `StringValue` ) or a reference to another object ( `RefValue` ), but not both. \\n\\nRequired if the key that you are using requires it."}},"AWS::DataPipeline::Pipeline.ParameterAttribute":{"attributes":{},"description":"`Attribute` is a property of `ParameterObject` that defines the attributes of a parameter object as key-value pairs.","properties":{"Key":"The field identifier.","StringValue":"The field value, expressed as a String."}},"AWS::DataPipeline::Pipeline.ParameterObject":{"attributes":{},"description":"Contains information about a parameter object.","properties":{"Attributes":"The attributes of the parameter object.","Id":"The ID of the parameter object."}},"AWS::DataPipeline::Pipeline.ParameterValue":{"attributes":{},"description":"A value or list of parameter values.","properties":{"Id":"The ID of the parameter value.","StringValue":"The field value, expressed as a String."}},"AWS::DataPipeline::Pipeline.PipelineObject":{"attributes":{},"description":"PipelineObject is property of the AWS::DataPipeline::Pipeline resource that contains information about a pipeline object. This can be a logical, physical, or physical attempt pipeline object. The complete set of components of a pipeline defines the pipeline.","properties":{"Fields":"Key-value pairs that define the properties of the object.","Id":"The ID of the object.","Name":"The name of the object."}},"AWS::DataPipeline::Pipeline.PipelineTag":{"attributes":{},"description":"A list of arbitrary tags (key-value pairs) to associate with the pipeline, which you can use to control permissions. For more information, see [Controlling Access to Pipelines and Resources](https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-control-access.html) in the *AWS Data Pipeline Developer Guide* .","properties":{"Key":"The key name of a tag.","Value":"The value to associate with the key name."}},"AWS::DataSync::Agent":{"attributes":{"AgentArn":"The Amazon Resource Name (ARN) of the agent. Use the `ListAgents` operation to return a list of agents for your account and AWS Region .","EndpointType":"The type of endpoint that your agent is connected to. If the endpoint is a VPC endpoint, the agent is not accessible over the public internet.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the agent Amazon Resource Name (ARN). For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:agent/agent-0b0addbeef44baca3`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::DataSync::Agent` resource activates an AWS DataSync agent that you\'ve deployed for storage discovery or data transfers. The activation process associates the agent with your AWS account .\\n\\nFor more information, see the following topics in the *AWS DataSync User Guide* :\\n\\n- [DataSync agent requirements](https://docs.aws.amazon.com/datasync/latest/userguide/agent-requirements.html)\\n- [DataSync network requirements](https://docs.aws.amazon.com/datasync/latest/userguide/datasync-network.html)\\n- [Create a DataSync agent](https://docs.aws.amazon.com/datasync/latest/userguide/configure-agent.html)","properties":{"ActivationKey":"Specifies your DataSync agent\'s activation key. If you don\'t have an activation key, see [Activate your agent](https://docs.aws.amazon.com/datasync/latest/userguide/activate-agent.html) .","AgentName":"Specifies a name for your agent. You can see this name in the DataSync console.","SecurityGroupArns":"The Amazon Resource Names (ARNs) of the security groups used to protect your data transfer task subnets. See [SecurityGroupArns](https://docs.aws.amazon.com/datasync/latest/userguide/API_Ec2Config.html#DataSync-Type-Ec2Config-SecurityGroupArns) .\\n\\n*Pattern* : `^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\\\-0-9]*:[0-9]{12}:security-group/.*$`","SubnetArns":"Specifies the ARN of the subnet where you want to run your DataSync task when using a VPC endpoint. This is the subnet where DataSync creates and manages the [network interfaces](https://docs.aws.amazon.com/datasync/latest/userguide/datasync-network.html#required-network-interfaces) for your transfer. You can only specify one ARN.","Tags":"Specifies labels that help you categorize, filter, and search for your AWS resources. We recommend creating at least one tag for your agent.","VpcEndpointId":"The ID of the virtual private cloud (VPC) endpoint that the agent has access to. This is the client-side VPC endpoint, powered by AWS PrivateLink . If you don\'t have an AWS PrivateLink VPC endpoint, see [AWS PrivateLink and VPC endpoints](https://docs.aws.amazon.com//vpc/latest/userguide/endpoint-services-overview.html) in the *Amazon VPC User Guide* .\\n\\nFor more information about activating your agent in a private network based on a VPC, see [Using AWS DataSync in a Virtual Private Cloud](https://docs.aws.amazon.com/datasync/latest/userguide/datasync-in-vpc.html) in the *AWS DataSync User Guide.*\\n\\nA VPC endpoint ID looks like this: `vpce-01234d5aff67890e1` ."}},"AWS::DataSync::LocationEFS":{"attributes":{"LocationArn":"The Amazon Resource Name (ARN) of the Amazon EFS file system.","LocationUri":"The URI of the Amazon EFS file system.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the location resource ARN. For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:location/loc-07db7abfc326c50s3`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::DataSync::LocationEFS` resource creates an endpoint for an Amazon EFS file system. AWS DataSync can access this endpoint as a source or destination location.","properties":{"AccessPointArn":"Specifies the Amazon Resource Name (ARN) of the access point that DataSync uses to access the Amazon EFS file system.","Ec2Config":"Specifies the subnet and security groups DataSync uses to access your Amazon EFS file system.","EfsFilesystemArn":"Specifies the ARN for the Amazon EFS file system.","FileSystemAccessRoleArn":"Specifies an AWS Identity and Access Management (IAM) role that DataSync assumes when mounting the Amazon EFS file system.","InTransitEncryption":"Specifies whether you want DataSync to use Transport Layer Security (TLS) 1.2 encryption when it copies data to or from the Amazon EFS file system.\\n\\nIf you specify an access point using `AccessPointArn` or an IAM role using `FileSystemAccessRoleArn` , you must set this parameter to `TLS1_2` .","Subdirectory":"Specifies a mount path for your Amazon EFS file system. This is where DataSync reads or writes data (depending on if this is a source or destination location). By default, DataSync uses the root directory, but you can also include subdirectories.\\n\\n> You must specify a value with forward slashes (for example, `/path/to/folder` ).","Tags":"Specifies the key-value pair that represents a tag that you want to add to the resource. The value can be an empty string. This value helps you manage, filter, and search for your resources. We recommend that you create a name tag for your location."}},"AWS::DataSync::LocationEFS.Ec2Config":{"attributes":{},"description":"The subnet and security groups that AWS DataSync uses to access your Amazon EFS file system.","properties":{"SecurityGroupArns":"Specifies the Amazon Resource Names (ARNs) of the security groups associated with an Amazon EFS file system\'s mount target.","SubnetArn":"Specifies the ARN of a subnet where DataSync creates the [network interfaces](https://docs.aws.amazon.com/datasync/latest/userguide/datasync-network.html#required-network-interfaces) for managing traffic during your transfer.\\n\\nThe subnet must be located:\\n\\n- In the same virtual private cloud (VPC) as the Amazon EFS file system.\\n- In the same Availability Zone as at least one mount target for the Amazon EFS file system.\\n\\n> You don\'t need to specify a subnet that includes a file system mount target."}},"AWS::DataSync::LocationFSxLustre":{"attributes":{"LocationArn":"The ARN of the specified FSx for Lustre file system location.","LocationUri":"The URI of the specified FSx for Lustre file system location.","Ref":"`Ref` returns the location resource ARN. For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:location/loc-07db7abfc326c50s3`"},"description":"The `AWS::DataSync::LocationFSxLustre` resource specifies an endpoint for an Amazon FSx for Lustre file system.","properties":{"FsxFilesystemArn":"The Amazon Resource Name (ARN) for the FSx for Lustre file system.","SecurityGroupArns":"The ARNs of the security groups that are used to configure the FSx for Lustre file system.\\n\\n*Pattern* : `^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\\\-0-9]*:[0-9]{12}:security-group/.*$`\\n\\n*Length constraints* : Maximum length of 128.","Subdirectory":"A subdirectory in the location\'s path. This subdirectory in the FSx for Lustre file system is used to read data from the FSx for Lustre source location or write data to the FSx for Lustre destination.","Tags":"The key-value pair that represents a tag that you want to add to the resource. The value can be an empty string. This value helps you manage, filter, and search for your resources. We recommend that you create a name tag for your location."}},"AWS::DataSync::LocationFSxONTAP":{"attributes":{"FsxFilesystemArn":"The ARN of the FSx for ONTAP file system in the specified location.","LocationArn":"The ARN of the specified location.","LocationUri":"The URI of the specified location.","Ref":"`Ref` returns the location resource ARN. For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:location/loc-07db7abfc326c50s3`"},"description":"The `AWS::DataSync::LocationFSxONTAP` resource creates an endpoint for an Amazon FSx for NetApp ONTAP file system. AWS DataSync can access this endpoint as a source or destination location.","properties":{"Protocol":"Specifies the data transfer protocol that DataSync uses to access your Amazon FSx file system.","SecurityGroupArns":"Specifies the Amazon Resource Names (ARNs) of the security groups that DataSync can use to access your FSx for ONTAP file system. You must configure the security groups to allow outbound traffic on the following ports (depending on the protocol that you\'re using):\\n\\n- *Network File System (NFS)* : TCP ports 111, 635, and 2049\\n- *Server Message Block (SMB)* : TCP port 445\\n\\nYour file system\'s security groups must also allow inbound traffic on the same port.","StorageVirtualMachineArn":"Specifies the ARN of the storage virtual machine (SVM) in your file system where you want to copy data to or from.","Subdirectory":"Specifies a path to the file share in the SVM where you\'ll copy your data.\\n\\nYou can specify a junction path (also known as a mount point), qtree path (for NFS file shares), or share name (for SMB file shares). For example, your mount path might be `/vol1` , `/vol1/tree1` , or `/share1` .\\n\\n> Don\'t specify a junction path in the SVM\'s root volume. For more information, see [Managing FSx for ONTAP storage virtual machines](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/managing-svms.html) in the *Amazon FSx for NetApp ONTAP User Guide* .","Tags":"Specifies labels that help you categorize, filter, and search for your AWS resources. We recommend creating at least a name tag for your location."}},"AWS::DataSync::LocationFSxONTAP.NFS":{"attributes":{},"description":"Specifies the Network File System (NFS) protocol configuration that AWS DataSync uses to access a storage virtual machine (SVM) on your Amazon FSx for NetApp ONTAP file system. For more information, see [Accessing FSx for ONTAP file systems](https://docs.aws.amazon.com/datasync/latest/userguide/create-ontap-location.html#create-ontap-location-access) .","properties":{"MountOptions":"Specifies how DataSync can access a location using the NFS protocol."}},"AWS::DataSync::LocationFSxONTAP.NfsMountOptions":{"attributes":{},"description":"Specifies how DataSync can access a location using the NFS protocol.","properties":{"Version":"Specifies the NFS version that you want DataSync to use when mounting your NFS share. If the server refuses to use the version specified, the task fails.\\n\\nYou can specify the following options:\\n\\n- `AUTOMATIC` (default): DataSync chooses NFS version 4.1.\\n- `NFS3` : Stateless protocol version that allows for asynchronous writes on the server.\\n- `NFSv4_0` : Stateful, firewall-friendly protocol version that supports delegations and pseudo file systems.\\n- `NFSv4_1` : Stateful protocol version that supports sessions, directory delegations, and parallel data processing. NFS version 4.1 also includes all features available in version 4.0.\\n\\n> DataSync currently only supports NFS version 3 with Amazon FSx for NetApp ONTAP locations."}},"AWS::DataSync::LocationFSxONTAP.Protocol":{"attributes":{},"description":"Specifies the data transfer protocol that AWS DataSync uses to access your Amazon FSx file system.","properties":{"NFS":"Specifies the Network File System (NFS) protocol configuration that DataSync uses to access your FSx for ONTAP file system\'s storage virtual machine (SVM).","SMB":"Specifies the Server Message Block (SMB) protocol configuration that DataSync uses to access your FSx for ONTAP file system\'s SVM."}},"AWS::DataSync::LocationFSxONTAP.SMB":{"attributes":{},"description":"Specifies the Server Message Block (SMB) protocol configuration that AWS DataSync uses to access a storage virtual machine (SVM) on your Amazon FSx for NetApp ONTAP file system. For more information, see [Accessing FSx for ONTAP file systems](https://docs.aws.amazon.com/datasync/latest/userguide/create-ontap-location.html#create-ontap-location-access) .","properties":{"Domain":"Specifies the fully qualified domain name (FQDN) of the Microsoft Active Directory that your storage virtual machine (SVM) belongs to.","MountOptions":"Specifies how DataSync can access a location using the SMB protocol.","Password":"Specifies the password of a user who has permission to access your SVM.","User":"Specifies a user name that can mount the location and access the files, folders, and metadata that you need in the SVM.\\n\\nIf you provide a user in your Active Directory, note the following:\\n\\n- If you\'re using AWS Directory Service for Microsoft Active Directory , the user must be a member of the AWS Delegated FSx Administrators group.\\n- If you\'re using a self-managed Active Directory, the user must be a member of either the Domain Admins group or a custom group that you specified for file system administration when you created your file system.\\n\\nMake sure that the user has the permissions it needs to copy the data you want:\\n\\n- `SE_TCB_NAME` : Required to set object ownership and file metadata. With this privilege, you also can copy NTFS discretionary access lists (DACLs).\\n- `SE_SECURITY_NAME` : May be needed to copy NTFS system access control lists (SACLs). This operation specifically requires the Windows privilege, which is granted to members of the Domain Admins group. If you configure your task to copy SACLs, make sure that the user has the required privileges. For information about copying SACLs, see [Ownership and permissions-related options](https://docs.aws.amazon.com/datasync/latest/userguide/create-task.html#configure-ownership-and-permissions) ."}},"AWS::DataSync::LocationFSxONTAP.SmbMountOptions":{"attributes":{},"description":"Specifies the version of the Server Message Block (SMB) protocol that AWS DataSync uses to access an SMB file server.","properties":{"Version":"By default, DataSync automatically chooses an SMB protocol version based on negotiation with your SMB file server. You also can configure DataSync to use a specific SMB version, but we recommend doing this only if DataSync has trouble negotiating with the SMB file server automatically.\\n\\nThese are the following options for configuring the SMB version:\\n\\n- `AUTOMATIC` (default): DataSync and the SMB file server negotiate the highest version of SMB that they mutually support between 2.1 and 3.1.1.\\n\\nThis is the recommended option. If you instead choose a specific version that your file server doesn\'t support, you may get an `Operation Not Supported` error.\\n- `SMB3` : Restricts the protocol negotiation to only SMB version 3.0.2.\\n- `SMB2` : Restricts the protocol negotiation to only SMB version 2.1.\\n- `SMB2_0` : Restricts the protocol negotiation to only SMB version 2.0.\\n- `SMB1` : Restricts the protocol negotiation to only SMB version 1.0.\\n\\n> The `SMB1` option isn\'t available when [creating an Amazon FSx for NetApp ONTAP location](https://docs.aws.amazon.com/datasync/latest/userguide/API_CreateLocationFsxOntap.html) ."}},"AWS::DataSync::LocationFSxOpenZFS":{"attributes":{"LocationArn":"The ARN of the specified FSx for OpenZFS file system location.","LocationUri":"The URI of the specified FSx for OpenZFS file system location.","Ref":"`Ref` returns the location resource ARN. For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:location/loc-07db7abfc326c50s3`"},"description":"The `AWS::DataSync::LocationFSxOpenZFS` resource specifies an endpoint for an Amazon FSx for OpenZFS file system.","properties":{"FsxFilesystemArn":"The Amazon Resource Name (ARN) of the FSx for OpenZFS file system.","Protocol":"The type of protocol that AWS DataSync uses to access your file system.","SecurityGroupArns":"The ARNs of the security groups that are used to configure the FSx for OpenZFS file system.\\n\\n*Pattern* : `^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\\\-0-9]*:[0-9]{12}:security-group/.*$`\\n\\n*Length constraints* : Maximum length of 128.","Subdirectory":"A subdirectory in the location\'s path that must begin with `/fsx` . DataSync uses this subdirectory to read or write data (depending on whether the file system is a source or destination location).","Tags":"The key-value pair that represents a tag that you want to add to the resource. The value can be an empty string. This value helps you manage, filter, and search for your resources. We recommend that you create a name tag for your location."}},"AWS::DataSync::LocationFSxOpenZFS.MountOptions":{"attributes":{},"description":"Represents the mount options that are available for DataSync to access a Network File System (NFS) location.","properties":{"Version":"The specific NFS version that you want DataSync to use to mount your NFS share. If the server refuses to use the version specified, the sync will fail. If you don\'t specify a version, DataSync defaults to `AUTOMATIC` . That is, DataSync automatically selects a version based on negotiation with the NFS server.\\n\\nYou can specify the following NFS versions:\\n\\n- *[NFSv3](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc1813)* : Stateless protocol version that allows for asynchronous writes on the server.\\n- *[NFSv4.0](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc3530)* : Stateful, firewall-friendly protocol version that supports delegations and pseudo file systems.\\n- *[NFSv4.1](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc5661)* : Stateful protocol version that supports sessions, directory delegations, and parallel data processing. Version 4.1 also includes all features available in version 4.0."}},"AWS::DataSync::LocationFSxOpenZFS.NFS":{"attributes":{},"description":"Represents the Network File System (NFS) protocol that AWS DataSync uses to access your Amazon FSx for OpenZFS file system.","properties":{"MountOptions":"Represents the mount options that are available for DataSync to access an NFS location."}},"AWS::DataSync::LocationFSxOpenZFS.Protocol":{"attributes":{},"description":"Represents the protocol that AWS DataSync uses to access your Amazon FSx for OpenZFS file system.","properties":{"NFS":"Represents the Network File System (NFS) protocol that DataSync uses to access your FSx for OpenZFS file system."}},"AWS::DataSync::LocationFSxWindows":{"attributes":{"LocationArn":"The ARN of the specified FSx for Windows Server file system location.","LocationUri":"The URI of the specified FSx for Windows Server file system location.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the location resource ARN. For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:location/loc-07db7abfc326c50s3`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::DataSync::LocationFSxWindows` resource specifies an endpoint for an Amazon FSx for Windows Server file system.","properties":{"Domain":"Specifies the name of the Windows domain that the FSx for Windows File Server belongs to.","FsxFilesystemArn":"Specifies the Amazon Resource Name (ARN) for the FSx for Windows File Server file system.","Password":"Specifies the password of the user who has the permissions to access files and folders in the file system.","SecurityGroupArns":"The Amazon Resource Names (ARNs) of the security groups that are used to configure the FSx for Windows File Server file system.\\n\\n*Pattern* : `^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):ec2:[a-z\\\\-0-9]*:[0-9]{12}:security-group/.*$`\\n\\n*Length constraints* : Maximum length of 128.","Subdirectory":"Specifies a mount path for your file system using forward slashes. This is where DataSync reads or writes data (depending on if this is a source or destination location).","Tags":"Specifies labels that help you categorize, filter, and search for your AWS resources. We recommend creating at least a name tag for your location.","User":"The user who has the permissions to access files and folders in the FSx for Windows File Server file system.\\n\\nFor information about choosing a user name that ensures sufficient permissions to files, folders, and metadata, see [user](https://docs.aws.amazon.com/datasync/latest/userguide/create-fsx-location.html#FSxWuser) ."}},"AWS::DataSync::LocationHDFS":{"attributes":{"LocationArn":"The Amazon Resource Name (ARN) of the HDFS cluster location to describe.","LocationUri":"The URI of the HDFS cluster location.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the location resource ARN. For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:location/loc-07db7abfc326c50s3`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::DataSync::LocationHDFS` resource specifies an endpoint for a Hadoop Distributed File System (HDFS).","properties":{"AgentArns":"The Amazon Resource Names (ARNs) of the agents that are used to connect to the HDFS cluster.","AuthenticationType":"","BlockSize":"The size of data blocks to write into the HDFS cluster. The block size must be a multiple of 512 bytes. The default block size is 128 mebibytes (MiB).","KerberosKeytab":"The Kerberos key table (keytab) that contains mappings between the defined Kerberos principal and the encrypted keys. Provide the base64-encoded file text. If `KERBEROS` is specified for `AuthType` , this value is required.","KerberosKrb5Conf":"The `krb5.conf` file that contains the Kerberos configuration information. You can load the `krb5.conf` by providing a string of the file\'s contents or an Amazon S3 presigned URL of the file. If `KERBEROS` is specified for `AuthType` , this value is required.","KerberosPrincipal":"The Kerberos principal with access to the files and folders on the HDFS cluster.\\n\\n> If `KERBEROS` is specified for `AuthenticationType` , this parameter is required.","KmsKeyProviderUri":"The URI of the HDFS cluster\'s Key Management Server (KMS).","NameNodes":"The NameNode that manages the HDFS namespace. The NameNode performs operations such as opening, closing, and renaming files and directories. The NameNode contains the information to map blocks of data to the DataNodes. You can use only one NameNode.","QopConfiguration":"The Quality of Protection (QOP) configuration specifies the Remote Procedure Call (RPC) and data transfer protection settings configured on the Hadoop Distributed File System (HDFS) cluster. If `QopConfiguration` isn\'t specified, `RpcProtection` and `DataTransferProtection` default to `PRIVACY` . If you set `RpcProtection` or `DataTransferProtection` , the other parameter assumes the same value.","ReplicationFactor":"The number of DataNodes to replicate the data to when writing to the HDFS cluster. By default, data is replicated to three DataNodes.","SimpleUser":"The user name used to identify the client on the host operating system.\\n\\n> If `SIMPLE` is specified for `AuthenticationType` , this parameter is required.","Subdirectory":"A subdirectory in the HDFS cluster. This subdirectory is used to read data from or write data to the HDFS cluster. If the subdirectory isn\'t specified, it will default to `/` .","Tags":"The key-value pair that represents the tag that you want to add to the location. The value can be an empty string. We recommend using tags to name your resources."}},"AWS::DataSync::LocationHDFS.NameNode":{"attributes":{},"description":"The NameNode of the Hadoop Distributed File System (HDFS). The NameNode manages the file system\'s namespace and performs operations such as opening, closing, and renaming files and directories. The NameNode also contains the information to map blocks of data to the DataNodes.","properties":{"Hostname":"The hostname of the NameNode in the HDFS cluster. This value is the IP address or Domain Name Service (DNS) name of the NameNode. An agent that\'s installed on-premises uses this hostname to communicate with the NameNode in the network.","Port":"The port that the NameNode uses to listen to client requests."}},"AWS::DataSync::LocationHDFS.QopConfiguration":{"attributes":{},"description":"The Quality of Protection (QOP) configuration specifies the Remote Procedure Call (RPC) and data transfer privacy settings configured on the Hadoop Distributed File System (HDFS) cluster.","properties":{"DataTransferProtection":"The data transfer protection setting configured on the HDFS cluster. This setting corresponds to your `dfs.data.transfer.protection` setting in the `hdfs-site.xml` file on your Hadoop cluster.","RpcProtection":"The Remote Procedure Call (RPC) protection setting configured on the HDFS cluster. This setting corresponds to your `hadoop.rpc.protection` setting in your `core-site.xml` file on your Hadoop cluster."}},"AWS::DataSync::LocationNFS":{"attributes":{"LocationArn":"The Amazon Resource Name (ARN) of the specified source NFS file system location.","LocationUri":"The URI of the specified source NFS location.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the location resource ARN. For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:location/loc-07db7abfc326c50s3`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::DataSync::LocationNFS` resource specifies a file system on a Network File System (NFS) server that can be read from or written to.","properties":{"MountOptions":"Specifies the mount options that DataSync can use to mount your NFS share.","OnPremConfig":"Specifies the Amazon Resource Names (ARNs) of agents that DataSync uses to connect to your NFS file server.\\n\\nIf you are copying data to or from your AWS Snowcone device, see [NFS Server on AWS Snowcone](https://docs.aws.amazon.com/datasync/latest/userguide/create-nfs-location.html#nfs-on-snowcone) for more information.","ServerHostname":"Specifies the IP address or domain name of your NFS file server. An agent that is installed on-premises uses this hostname to mount the NFS server in a network.\\n\\nIf you are copying data to or from your AWS Snowcone device, see [NFS Server on AWS Snowcone](https://docs.aws.amazon.com/datasync/latest/userguide/create-nfs-location.html#nfs-on-snowcone) for more information.\\n\\n> You must specify be an IP version 4 address or Domain Name System (DNS)-compliant name.","Subdirectory":"Specifies the subdirectory in the NFS file server that DataSync transfers to or from. The NFS path should be a path that\'s exported by the NFS server, or a subdirectory of that path. The path should be such that it can be mounted by other NFS clients in your network.\\n\\nTo see all the paths exported by your NFS server, run \\" `showmount -e nfs-server-name` \\" from an NFS client that has access to your server. You can specify any directory that appears in the results, and any subdirectory of that directory. Ensure that the NFS export is accessible without Kerberos authentication.\\n\\nTo transfer all the data in the folder you specified, DataSync needs to have permissions to read all the data. To ensure this, either configure the NFS export with `no_root_squash,` or ensure that the permissions for all of the files that you want DataSync allow read access for all users. Doing either enables the agent to read the files. For the agent to access directories, you must additionally enable all execute access.\\n\\nIf you are copying data to or from your AWS Snowcone device, see [NFS Server on AWS Snowcone](https://docs.aws.amazon.com/datasync/latest/userguide/create-nfs-location.html#nfs-on-snowcone) for more information.","Tags":"Specifies labels that help you categorize, filter, and search for your AWS resources. We recommend creating at least a name tag for your location."}},"AWS::DataSync::LocationNFS.MountOptions":{"attributes":{},"description":"Specifies the mount options that DataSync can use to mount your NFS share.","properties":{"Version":"Specifies the NFS version that you want DataSync to use when mounting your NFS share. If the server refuses to use the version specified, the task fails.\\n\\nYou can specify the following options:\\n\\n- `AUTOMATIC` (default): DataSync chooses NFS version 4.1.\\n- `NFS3` : Stateless protocol version that allows for asynchronous writes on the server.\\n- `NFSv4_0` : Stateful, firewall-friendly protocol version that supports delegations and pseudo file systems.\\n- `NFSv4_1` : Stateful protocol version that supports sessions, directory delegations, and parallel data processing. NFS version 4.1 also includes all features available in version 4.0.\\n\\n> DataSync currently only supports NFS version 3 with Amazon FSx for NetApp ONTAP locations."}},"AWS::DataSync::LocationNFS.OnPremConfig":{"attributes":{},"description":"A list of Amazon Resource Names (ARNs) of agents to use for a Network File System (NFS) location.","properties":{"AgentArns":"ARNs of the agents to use for an NFS location."}},"AWS::DataSync::LocationObjectStorage":{"attributes":{"LocationArn":"The Amazon Resource Name (ARN) of the specified object storage location.","LocationUri":"The URI of the specified object storage location.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the location resource Amazon Resource Name (ARN). For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:location/loc-07db7abfc326c50s3`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::DataSync::LocationObjectStorage` resource specifies an endpoint for a self-managed object storage bucket. For more information about self-managed object storage locations, see [Creating a Location for Object Storage](https://docs.aws.amazon.com/datasync/latest/userguide/create-object-location.html) .","properties":{"AccessKey":"Specifies the access key (for example, a user name) if credentials are required to authenticate with the object storage server.","AgentArns":"Specifies the Amazon Resource Names (ARNs) of the DataSync agents that can securely connect with your location.","BucketName":"Specifies the name of the object storage bucket involved in the transfer.","SecretKey":"Specifies the secret key (for example, a password) if credentials are required to authenticate with the object storage server.","ServerCertificate":"Specifies a file with the certificates that are used to sign the object storage server\'s certificate (for example, `file:///home/user/.ssh/storage_sys_certificate.pem` ). The file you specify must include the following:\\n\\n- The certificate of the signing certificate authority (CA)\\n- Any intermediate certificates\\n- base64 encoding\\n- A `.pem` extension\\n\\nThe file can be up to 32768 bytes (before base64 encoding).\\n\\nTo use this parameter, configure `ServerProtocol` to `HTTPS` .","ServerHostname":"Specifies the domain name or IP address of the object storage server. A DataSync agent uses this hostname to mount the object storage server in a network.","ServerPort":"Specifies the port that your object storage server accepts inbound network traffic on (for example, port 443).","ServerProtocol":"Specifies the protocol that your object storage server uses to communicate.","Subdirectory":"Specifies the object prefix for your object storage server. If this is a source location, DataSync only copies objects with this prefix. If this is a destination location, DataSync writes all objects with this prefix.","Tags":"Specifies the key-value pair that represents a tag that you want to add to the resource. Tags can help you manage, filter, and search for your resources. We recommend creating a name tag for your location."}},"AWS::DataSync::LocationS3":{"attributes":{"LocationArn":"The Amazon Resource Name (ARN) of the specified Amazon S3 location.","LocationUri":"The URI of the specified Amazon S3 location.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the location resource Amazon Resource Name (ARN). For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:location/loc-07db7abfc326c50s3`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::DataSync::LocationS3` resource specifies an endpoint for an Amazon S3 bucket.\\n\\nFor more information, see [Create an Amazon S3 location](https://docs.aws.amazon.com/datasync/latest/userguide/create-locations-cli.html#create-location-s3-cli) in the *AWS DataSync User Guide* .","properties":{"S3BucketArn":"The ARN of the Amazon S3 bucket.","S3Config":"The Amazon Resource Name (ARN) of the AWS Identity and Access Management (IAM) role that is used to access an Amazon S3 bucket.\\n\\nFor detailed information about using such a role, see [Creating a Location for Amazon S3](https://docs.aws.amazon.com/datasync/latest/userguide/working-with-locations.html#create-s3-location) in the *AWS DataSync User Guide* .","S3StorageClass":"The Amazon S3 storage class that you want to store your files in when this location is used as a task destination. For buckets in AWS Regions , the storage class defaults to S3 Standard.\\n\\nFor more information about S3 storage classes, see [Amazon S3 Storage Classes](https://docs.aws.amazon.com/s3/storage-classes/) . Some storage classes have behaviors that can affect your S3 storage costs. For detailed information, see [Considerations When Working with Amazon S3 Storage Classes in DataSync](https://docs.aws.amazon.com/datasync/latest/userguide/create-s3-location.html#using-storage-classes) .","Subdirectory":"A subdirectory in the Amazon S3 bucket. This subdirectory in Amazon S3 is used to read data from the S3 source location or write data to the S3 destination.","Tags":"The key-value pair that represents the tag that you want to add to the location. The value can be an empty string. We recommend using tags to name your resources."}},"AWS::DataSync::LocationS3.S3Config":{"attributes":{},"description":"The Amazon Resource Name (ARN) of the AWS Identity and Access Management (IAM) role used to access an Amazon S3 bucket.\\n\\nFor detailed information about using such a role, see [Creating a Location for Amazon S3](https://docs.aws.amazon.com/datasync/latest/userguide/working-with-locations.html#create-s3-location) in the *AWS DataSync User Guide* .","properties":{"BucketAccessRoleArn":"The ARN of the IAM role for accessing the S3 bucket."}},"AWS::DataSync::LocationSMB":{"attributes":{"LocationArn":"The Amazon Resource Name (ARN) of the specified SMB file system.","LocationUri":"The URI of the specified SMB location.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the location resource Amazon Resource Name (ARN). For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:location/loc-07db7abfc326c50s3`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::DataSync::LocationSMB` resource specifies a Server Message Block (SMB) location.","properties":{"AgentArns":"The Amazon Resource Names (ARNs) of agents to use for a Server Message Block (SMB) location.","Domain":"Specifies the Windows domain name that your SMB file server belongs to.\\n\\nFor more information, see [required permissions](https://docs.aws.amazon.com/datasync/latest/userguide/create-smb-location.html#configuring-smb-permissions) for SMB locations.","MountOptions":"Specifies the version of the SMB protocol that DataSync uses to access your SMB file server.","Password":"The password of the user who can mount the share and has the permissions to access files and folders in the SMB share.","ServerHostname":"Specifies the Domain Name Service (DNS) name or IP address of the SMB file server that your DataSync agent will mount.\\n\\n> You can\'t specify an IP version 6 (IPv6) address.","Subdirectory":"The subdirectory in the SMB file system that is used to read data from the SMB source location or write data to the SMB destination. The SMB path should be a path that\'s exported by the SMB server, or a subdirectory of that path. The path should be such that it can be mounted by other SMB clients in your network.\\n\\n> `Subdirectory` must be specified with forward slashes. For example, `/path/to/folder` . \\n\\nTo transfer all the data in the folder you specified, DataSync must have permissions to mount the SMB share, as well as to access all the data in that share. To ensure this, either make sure that the user name and password specified belongs to the user who can mount the share, and who has the appropriate permissions for all of the files and directories that you want DataSync to access, or use credentials of a member of the Backup Operators group to mount the share. Doing either one enables the agent to access the data. For the agent to access directories, you must additionally enable all execute access.","Tags":"Specifies labels that help you categorize, filter, and search for your AWS resources. We recommend creating at least a name tag for your location.","User":"The user who can mount the share and has the permissions to access files and folders in the SMB share.\\n\\nFor information about choosing a user name that ensures sufficient permissions to files, folders, and metadata, see [user](https://docs.aws.amazon.com/datasync/latest/userguide/create-smb-location.html#SMBuser) ."}},"AWS::DataSync::LocationSMB.MountOptions":{"attributes":{},"description":"Specifies the version of the SMB protocol that DataSync uses to access your SMB file server.","properties":{"Version":"By default, DataSync automatically chooses an SMB protocol version based on negotiation with your SMB file server. You also can configure DataSync to use a specific SMB version, but we recommend doing this only if DataSync has trouble negotiating with the SMB file server automatically.\\n\\nThese are the following options for configuring the SMB version:\\n\\n- `AUTOMATIC` (default): DataSync and the SMB file server negotiate the highest version of SMB that they mutually support between 2.1 and 3.1.1.\\n\\nThis is the recommended option. If you instead choose a specific version that your file server doesn\'t support, you may get an `Operation Not Supported` error.\\n- `SMB3` : Restricts the protocol negotiation to only SMB version 3.0.2.\\n- `SMB2` : Restricts the protocol negotiation to only SMB version 2.1.\\n- `SMB2_0` : Restricts the protocol negotiation to only SMB version 2.0.\\n- `SMB1` : Restricts the protocol negotiation to only SMB version 1.0.\\n\\n> The `SMB1` option isn\'t available when [creating an Amazon FSx for NetApp ONTAP location](https://docs.aws.amazon.com/datasync/latest/userguide/API_CreateLocationFsxOntap.html) ."}},"AWS::DataSync::StorageSystem":{"attributes":{"ConnectivityStatus":"Indicates whether your DataSync agent can connect to your on-premises storage system.","Ref":"`Ref` returns the ARN of the on-premises storage system that you created. For example:\\n\\n`arn:aws:datasync:us-east-1:111222333444:system/storage-system-abcdef01234567890`","SecretsManagerArn":"The ARN of the secret that stores your on-premises storage system\'s credentials. DataSync Discovery stores these credentials in [AWS Secrets Manager](https://docs.aws.amazon.com/datasync/latest/userguide/discovery-configure-storage.html#discovery-add-storage) .","StorageSystemArn":"The ARN of the on-premises storage system that you\'re using with DataSync Discovery."},"description":"The `AWS::DataSync::StorageSystem` resource creates an AWS resource for an on-premises storage system that you want DataSync Discovery to collect information about. For more information, see [discovering your storage with DataSync Discovery.](https://docs.aws.amazon.com/datasync/latest/userguide/understanding-your-storage.html)","properties":{"AgentArns":"Specifies the Amazon Resource Name (ARN) of the DataSync agent that connects to and reads from your on-premises storage system\'s management interface. You can only specify one ARN.","CloudWatchLogGroupArn":"Specifies the ARN of the Amazon CloudWatch log group for monitoring and logging discovery job events.","Name":"Specifies a familiar name for your on-premises storage system.","ServerConfiguration":"Specifies the server name and network port required to connect with the management interface of your on-premises storage system.","ServerCredentials":"Specifies the user name and password for accessing your on-premises storage system\'s management interface.","SystemType":"Specifies the type of on-premises storage system that you want DataSync Discovery to collect information about.\\n\\n> DataSync Discovery currently supports NetApp Fabric-Attached Storage (FAS) and All Flash FAS (AFF) systems running ONTAP 9.7 or later.","Tags":"Specifies labels that help you categorize, filter, and search for your AWS resources. We recommend creating at least a name tag for your on-premises storage system."}},"AWS::DataSync::StorageSystem.ServerConfiguration":{"attributes":{},"description":"The network settings that DataSync Discovery uses to connect with your on-premises storage system\'s management interface.","properties":{"ServerHostname":"The domain name or IP address of your storage system\'s management interface.","ServerPort":"The network port for accessing the storage system\'s management interface."}},"AWS::DataSync::StorageSystem.ServerCredentials":{"attributes":{},"description":"The credentials that provide DataSync Discovery read access to your on-premises storage system\'s management interface.\\n\\nDataSync Discovery stores these credentials in [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) . For more information, see [Accessing your on-premises storage system](https://docs.aws.amazon.com/datasync/latest/userguide/discovery-configure-storage.html) .","properties":{"Password":"Specifies the password for your storage system\'s management interface.","Username":"Specifies the user name for your storage system\'s management interface."}},"AWS::DataSync::Task":{"attributes":{"DestinationNetworkInterfaceArns":"The ARNs of the destination elastic network interfaces (ENIs) that were created for your subnet.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the location resource ARN. For example:\\n\\n`arn:aws:datasync:us-east-2:111222333444:task/task-07db7abfc326c50s3`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) .","SourceNetworkInterfaceArns":"The ARNs of the source ENIs that were created for your subnet.","Status":"The status of the task that was described.","TaskArn":"The ARN of the task."},"description":"The `AWS::DataSync::Task` resource specifies a task. A task is a set of two locations (source and destination) and a set of `Options` that you use to control the behavior of a task. If you don\'t specify `Options` when you create a task, AWS DataSync populates them with service defaults.","properties":{"CloudWatchLogGroupArn":"The Amazon Resource Name (ARN) of the Amazon CloudWatch log group that is used to monitor and log events in the task.\\n\\nFor more information about how to use CloudWatch Logs with DataSync, see [Monitoring Your Task](https://docs.aws.amazon.com/datasync/latest/userguide/monitor-datasync.html#cloudwatchlogs) in the *AWS DataSync User Guide.*\\n\\nFor more information about these groups, see [Working with Log Groups and Log Streams](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html) in the *Amazon CloudWatch Logs User Guide* .","DestinationLocationArn":"The Amazon Resource Name (ARN) of an AWS storage resource\'s location.","Excludes":"Specifies a list of filter rules that exclude specific data during your transfer. For more information and examples, see [Filtering data transferred by DataSync](https://docs.aws.amazon.com/datasync/latest/userguide/filtering.html) .","Includes":"Specifies a list of filter rules that include specific data during your transfer. For more information and examples, see [Filtering data transferred by DataSync](https://docs.aws.amazon.com/datasync/latest/userguide/filtering.html) .","Name":"The name of a task. This value is a text reference that is used to identify the task in the console.","Options":"Specifies the configuration options for a task. Some options include preserving file or object metadata and verifying data integrity.\\n\\nYou can also override these options before starting an individual run of a task (also known as a *task execution* ). For more information, see [StartTaskExecution](https://docs.aws.amazon.com/datasync/latest/userguide/API_StartTaskExecution.html) .","Schedule":"Specifies a schedule used to periodically transfer files from a source to a destination location. The schedule should be specified in UTC time. For more information, see [Scheduling your task](https://docs.aws.amazon.com/datasync/latest/userguide/task-scheduling.html) .","SourceLocationArn":"The Amazon Resource Name (ARN) of the source location for the task.","Tags":"Specifies the tags that you want to apply to the Amazon Resource Name (ARN) representing the task.\\n\\n*Tags* are key-value pairs that help you manage, filter, and search for your DataSync resources."}},"AWS::DataSync::Task.FilterRule":{"attributes":{},"description":"Specifies which files, folders, and objects to include or exclude when transferring files from source to destination.","properties":{"FilterType":"The type of filter rule to apply. AWS DataSync only supports the SIMPLE_PATTERN rule type.","Value":"A single filter string that consists of the patterns to include or exclude. The patterns are delimited by \\"|\\" (that is, a pipe), for example: `/folder1|/folder2`"}},"AWS::DataSync::Task.Options":{"attributes":{},"description":"Represents the options that are available to control the behavior of a [StartTaskExecution](https://docs.aws.amazon.com/datasync/latest/userguide/API_StartTaskExecution.html) operation. This behavior includes preserving metadata, such as user ID (UID), group ID (GID), and file permissions; overwriting files in the destination; data integrity verification; and so on.\\n\\nA task has a set of default options associated with it. If you don\'t specify an option in [StartTaskExecution](https://docs.aws.amazon.com/datasync/latest/userguide/API_StartTaskExecution.html) , the default value is used. You can override the default options on each task execution by specifying an overriding `Options` value to [StartTaskExecution](https://docs.aws.amazon.com/datasync/latest/userguide/API_StartTaskExecution.html) .","properties":{"Atime":"A file metadata value that shows the last time that a file was accessed (that is, when the file was read or written to). If you set `Atime` to `BEST_EFFORT` , AWS DataSync attempts to preserve the original `Atime` attribute on all source files (that is, the version before the PREPARING phase). However, `Atime` \'s behavior is not fully standard across platforms, so AWS DataSync can only do this on a best-effort basis.\\n\\nDefault value: `BEST_EFFORT`\\n\\n`BEST_EFFORT` : Attempt to preserve the per-file `Atime` value (recommended).\\n\\n`NONE` : Ignore `Atime` .\\n\\n> If `Atime` is set to `BEST_EFFORT` , `Mtime` must be set to `PRESERVE` .\\n> \\n> If `Atime` is set to `NONE` , `Mtime` must also be `NONE` .","BytesPerSecond":"A value that limits the bandwidth used by AWS DataSync . For example, if you want AWS DataSync to use a maximum of 1 MB, set this value to `1048576` (=1024*1024).","Gid":"The group ID (GID) of the file\'s owners.\\n\\nDefault value: `INT_VALUE`\\n\\n`INT_VALUE` : Preserve the integer value of the user ID (UID) and group ID (GID) (recommended).\\n\\n`NAME` : Currently not supported.\\n\\n`NONE` : Ignore the UID and GID.","LogLevel":"Specifies the type of logs that DataSync publishes to a Amazon CloudWatch Logs log group. To specify the log group, see [CloudWatchLogGroupArn](https://docs.aws.amazon.com/datasync/latest/userguide/API_CreateTask.html#DataSync-CreateTask-request-CloudWatchLogGroupArn) .\\n\\nIf you set `LogLevel` to `OFF` , no logs are published. `BASIC` publishes logs on errors for individual files transferred. `TRANSFER` publishes logs for every file or object that is transferred and integrity checked.","Mtime":"A value that indicates the last time that a file was modified (that is, a file was written to) before the PREPARING phase. This option is required for cases when you need to run the same task more than one time.\\n\\nDefault value: `PRESERVE`\\n\\n`PRESERVE` : Preserve original `Mtime` (recommended)\\n\\n`NONE` : Ignore `Mtime` .\\n\\n> If `Mtime` is set to `PRESERVE` , `Atime` must be set to `BEST_EFFORT` .\\n> \\n> If `Mtime` is set to `NONE` , `Atime` must also be set to `NONE` .","ObjectTags":"Specifies whether object tags are preserved when transferring between object storage systems. If you want your DataSync task to ignore object tags, specify the `NONE` value.\\n\\nDefault Value: `PRESERVE`","OverwriteMode":"Specifies whether data at the destination location should be overwritten or preserved. If set to `NEVER` , a destination file for example will not be replaced by a source file (even if the destination file differs from the source file). If you modify files in the destination and you sync the files, you can use this value to protect against overwriting those changes.\\n\\nSome storage classes have specific behaviors that can affect your Amazon S3 storage cost. For detailed information, see [Considerations when working with Amazon S3 storage classes in DataSync](https://docs.aws.amazon.com/datasync/latest/userguide/create-s3-location.html#using-storage-classes) .","PosixPermissions":"A value that determines which users or groups can access a file for a specific purpose, such as reading, writing, or execution of the file. This option should be set only for Network File System (NFS), Amazon EFS, and Amazon S3 locations. For more information about what metadata is copied by DataSync, see [Metadata Copied by DataSync](https://docs.aws.amazon.com/datasync/latest/userguide/special-files.html#metadata-copied) .\\n\\nDefault value: `PRESERVE`\\n\\n`PRESERVE` : Preserve POSIX-style permissions (recommended).\\n\\n`NONE` : Ignore permissions.\\n\\n> AWS DataSync can preserve extant permissions of a source location.","PreserveDeletedFiles":"A value that specifies whether files in the destination that don\'t exist in the source file system are preserved. This option can affect your storage costs. If your task deletes objects, you might incur minimum storage duration charges for certain storage classes. For detailed information, see [Considerations when working with Amazon S3 storage classes in DataSync](https://docs.aws.amazon.com/datasync/latest/userguide/create-s3-location.html#using-storage-classes) in the *AWS DataSync User Guide* .\\n\\nDefault value: `PRESERVE`\\n\\n`PRESERVE` : Ignore destination files that aren\'t present in the source (recommended).\\n\\n`REMOVE` : Delete destination files that aren\'t present in the source.","PreserveDevices":"A value that determines whether AWS DataSync should preserve the metadata of block and character devices in the source file system, and re-create the files with that device name and metadata on the destination. DataSync does not copy the contents of such devices, only the name and metadata.\\n\\n> AWS DataSync can\'t sync the actual contents of such devices, because they are nonterminal and don\'t return an end-of-file (EOF) marker. \\n\\nDefault value: `NONE`\\n\\n`NONE` : Ignore special devices (recommended).\\n\\n`PRESERVE` : Preserve character and block device metadata. This option isn\'t currently supported for Amazon EFS.","SecurityDescriptorCopyFlags":"A value that determines which components of the SMB security descriptor are copied from source to destination objects.\\n\\nThis value is only used for transfers between SMB and Amazon FSx for Windows File Server locations, or between two Amazon FSx for Windows File Server locations. For more information about how DataSync handles metadata, see [How DataSync Handles Metadata and Special Files](https://docs.aws.amazon.com/datasync/latest/userguide/special-files.html) .\\n\\nDefault value: `OWNER_DACL`\\n\\n`OWNER_DACL` : For each copied object, DataSync copies the following metadata:\\n\\n- Object owner.\\n- NTFS discretionary access control lists (DACLs), which determine whether to grant access to an object.\\n\\nWhen you use option, DataSync does NOT copy the NTFS system access control lists (SACLs), which are used by administrators to log attempts to access a secured object.\\n\\n`OWNER_DACL_SACL` : For each copied object, DataSync copies the following metadata:\\n\\n- Object owner.\\n- NTFS discretionary access control lists (DACLs), which determine whether to grant access to an object.\\n- NTFS system access control lists (SACLs), which are used by administrators to log attempts to access a secured object.\\n\\nCopying SACLs requires granting additional permissions to the Windows user that DataSync uses to access your SMB location. For information about choosing a user that ensures sufficient permissions to files, folders, and metadata, see [user](https://docs.aws.amazon.com/datasync/latest/userguide/create-smb-location.html#SMBuser) .\\n\\n`NONE` : None of the SMB security descriptor components are copied. Destination objects are owned by the user that was provided for accessing the destination location. DACLs and SACLs are set based on the destination server’s configuration.","TaskQueueing":"Specifies whether your transfer tasks should be put into a queue during certain scenarios when [running multiple tasks](https://docs.aws.amazon.com/datasync/latest/userguide/run-task.html#running-multiple-tasks) . This is `ENABLED` by default.","TransferMode":"A value that determines whether DataSync transfers only the data and metadata that differ between the source and the destination location, or whether DataSync transfers all the content from the source, without comparing it to the destination location.\\n\\n`CHANGED` : DataSync copies only data or metadata that is new or different from the source location to the destination location.\\n\\n`ALL` : DataSync copies all source location content to the destination, without comparing it to existing content on the destination.","Uid":"The user ID (UID) of the file\'s owner.\\n\\nDefault value: `INT_VALUE`\\n\\n`INT_VALUE` : Preserve the integer value of the UID and group ID (GID) (recommended).\\n\\n`NAME` : Currently not supported\\n\\n`NONE` : Ignore the UID and GID.","VerifyMode":"A value that determines whether a data integrity verification is performed at the end of a task execution after all data and metadata have been transferred. For more information, see [Configure task settings](https://docs.aws.amazon.com/datasync/latest/userguide/create-task.html) .\\n\\nDefault value: `POINT_IN_TIME_CONSISTENT`\\n\\n`ONLY_FILES_TRANSFERRED` (recommended): Perform verification only on files that were transferred.\\n\\n`POINT_IN_TIME_CONSISTENT` : Scan the entire source and entire destination at the end of the transfer to verify that the source and destination are fully synchronized. This option isn\'t supported when transferring to S3 Glacier or S3 Glacier Deep Archive storage classes.\\n\\n`NONE` : No additional verification is done at the end of the transfer, but all data transmissions are integrity-checked with checksum verification during the transfer."}},"AWS::DataSync::Task.TaskSchedule":{"attributes":{},"description":"Specifies the schedule you want your task to use for repeated executions. For more information, see [Schedule Expressions for Rules](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html) .","properties":{"ScheduleExpression":"A cron expression that specifies when AWS DataSync initiates a scheduled transfer from a source to a destination location."}},"AWS::Detective::Graph":{"attributes":{"Arn":"The ARN of the new behavior graph.","Ref":"`Ref` returns the ARN of the new behavior graph."},"description":"The `AWS::Detective::Graph` resource is an Amazon Detective resource type that creates a Detective behavior graph. The requesting account becomes the administrator account for the behavior graph.","properties":{"AutoEnableMembers":"Indicates whether to automatically enable new organization accounts as member accounts in the organization behavior graph.\\n\\nBy default, this property is set to `false` . If you want to change the value of this property, you must be the Detective administrator for the organization. For more information on setting a Detective administrator account, see [AWS::Detective::OrganizationAdmin](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-organizationadmin.html)","Tags":"The tag values to assign to the new behavior graph."}},"AWS::Detective::MemberInvitation":{"attributes":{"Ref":"`Ref` returns the ARN of the behavior graph and the member account identifier, separated by a pipe character (\'|\')."},"description":"The `AWS::Detective::MemberInvitation` resource is an Amazon Detective resource type that creates an invitation to join a Detective behavior graph. The administrator account can choose whether to send an email notification of the invitation to the root user email address of the AWS account.","properties":{"DisableEmailNotification":"Whether to send an invitation email to the member account. If set to true, the member account does not receive an invitation email.","GraphArn":"The ARN of the behavior graph to invite the account to contribute data to.","MemberEmailAddress":"The root user email address of the invited account. If the email address provided is not the root user email address for the provided account, the invitation creation fails.","MemberId":"The AWS account identifier of the invited account","Message":"Customized text to include in the invitation email message."}},"AWS::Detective::OrganizationAdmin":{"attributes":{"GraphArn":"The ARN of the behavior graph to invite the account to contribute data to.","Ref":"`Ref` returns the ARN of the behavior graph and the member account identifier, separated by a pipe character (\'|\')."},"description":"The `AWS::Detective::OrganizationAdmin` resource is an Amazon Detective resource type that designates the Detective administrator account for the organization in the current region. If the account does not have Detective enabled, then this resource enables Detective for that account and creates a new behavior graph.","properties":{"AccountId":"The AWS account identifier of the account to designate as the Detective administrator account for the organization."}},"AWS::DevOpsGuru::LogAnomalyDetectionIntegration":{"attributes":{"AccountId":"The account ID associated with the integration of DevOps Guru with CloudWatch log groups for log anomaly detection.","Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns Amazon Resource Name (ARN) of the `LogAnomalyDetectionIntegration` . For more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Information about the integration of DevOps Guru with CloudWatch log groups for log anomaly detection.","properties":{}},"AWS::DevOpsGuru::NotificationChannel":{"attributes":{"Id":"The ID of the notification channel.","Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns Amazon Resource Name (ARN) of the `NotificationChannel` . For more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Adds a notification channel to DevOps Guru. A notification channel is used to notify you about important DevOps Guru events, such as when an insight is generated.\\n\\nIf you use an Amazon SNS topic in another account, you must attach a policy to it that grants DevOps Guru permission to send it notifications. DevOps Guru adds the required policy on your behalf to send notifications using Amazon SNS in your account. DevOps Guru only supports standard SNS topics. For more information, see [Permissions for Amazon SNS topics](https://docs.aws.amazon.com/devops-guru/latest/userguide/sns-required-permissions.html) .\\n\\nIf you use an Amazon SNS topic that is encrypted by an AWS Key Management Service customer-managed key (CMK), then you must add permissions to the CMK. For more information, see [Permissions for AWS KMS–encrypted Amazon SNS topics](https://docs.aws.amazon.com/devops-guru/latest/userguide/sns-kms-permissions.html) .","properties":{"Config":"A `NotificationChannelConfig` object that contains information about configured notification channels."}},"AWS::DevOpsGuru::NotificationChannel.NotificationChannelConfig":{"attributes":{},"description":"Information about notification channels you have configured with DevOps Guru. The one supported notification channel is Amazon Simple Notification Service (Amazon SNS).","properties":{"Filters":"The filter configurations for the Amazon SNS notification topic you use with DevOps Guru. If you do not provide filter configurations, the default configurations are to receive notifications for all message types of `High` or `Medium` severity.","Sns":"Information about a notification channel configured in DevOps Guru to send notifications when insights are created.\\n\\nIf you use an Amazon SNS topic in another account, you must attach a policy to it that grants DevOps Guru permission to send it notifications. DevOps Guru adds the required policy on your behalf to send notifications using Amazon SNS in your account. DevOps Guru only supports standard SNS topics. For more information, see [Permissions for Amazon SNS topics](https://docs.aws.amazon.com/devops-guru/latest/userguide/sns-required-permissions.html) .\\n\\nIf you use an Amazon SNS topic that is encrypted by an AWS Key Management Service customer-managed key (CMK), then you must add permissions to the CMK. For more information, see [Permissions for AWS KMS–encrypted Amazon SNS topics](https://docs.aws.amazon.com/devops-guru/latest/userguide/sns-kms-permissions.html) ."}},"AWS::DevOpsGuru::NotificationChannel.NotificationFilterConfig":{"attributes":{},"description":"The filter configurations for the Amazon SNS notification topic you use with DevOps Guru. You can choose to specify which events or message types to receive notifications for. You can also choose to specify which severity levels to receive notifications for.","properties":{"MessageTypes":"The events that you want to receive notifications for. For example, you can choose to receive notifications only when the severity level is upgraded or a new insight is created.","Severities":"The severity levels that you want to receive notifications for. For example, you can choose to receive notifications only for insights with `HIGH` and `MEDIUM` severity levels. For more information, see [Understanding insight severities](https://docs.aws.amazon.com/devops-guru/latest/userguide/working-with-insights.html#understanding-insights-severities) ."}},"AWS::DevOpsGuru::NotificationChannel.SnsChannelConfig":{"attributes":{},"description":"Contains the Amazon Resource Name (ARN) of an Amazon Simple Notification Service topic.\\n\\nIf you use an Amazon SNS topic in another account, you must attach a policy to it that grants DevOps Guru permission to send it notifications. DevOps Guru adds the required policy on your behalf to send notifications using Amazon SNS in your account. DevOps Guru only supports standard SNS topics. For more information, see [Permissions for Amazon SNS topics](https://docs.aws.amazon.com/devops-guru/latest/userguide/sns-required-permissions.html) .\\n\\nIf you use an Amazon SNS topic that is encrypted by an AWS Key Management Service customer-managed key (CMK), then you must add permissions to the CMK. For more information, see [Permissions for AWS KMS–encrypted Amazon SNS topics](https://docs.aws.amazon.com/devops-guru/latest/userguide/sns-kms-permissions.html) .","properties":{"TopicArn":"The Amazon Resource Name (ARN) of an Amazon Simple Notification Service topic."}},"AWS::DevOpsGuru::ResourceCollection":{"attributes":{"Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns Amazon Resource Name (ARN) of the `ResourceCollection` . For more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) .","ResourceCollectionType":"The type of AWS resource collections to return. The one valid value is `CLOUD_FORMATION` for AWS CloudFormation stacks."},"description":"A collection of AWS resources supported by DevOps Guru. The one type of AWS resource collection supported is AWS CloudFormation stacks. DevOps Guru can be configured to analyze only the AWS resources that are defined in the stacks.","properties":{"ResourceCollectionFilter":"Information about a filter used to specify which AWS resources are analyzed for anomalous behavior by DevOps Guru."}},"AWS::DevOpsGuru::ResourceCollection.CloudFormationCollectionFilter":{"attributes":{},"description":"Information about AWS CloudFormation stacks. You can use up to 500 stacks to specify which AWS resources in your account to analyze. For more information, see [Stacks](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacks.html) in the *AWS CloudFormation User Guide* .","properties":{"StackNames":"An array of CloudFormation stack names."}},"AWS::DevOpsGuru::ResourceCollection.ResourceCollectionFilter":{"attributes":{},"description":"Information about a filter used to specify which AWS resources are analyzed for anomalous behavior by DevOps Guru.","properties":{"CloudFormation":"Information about AWS CloudFormation stacks. You can use up to 500 stacks to specify which AWS resources in your account to analyze. For more information, see [Stacks](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacks.html) in the *AWS CloudFormation User Guide* .","Tags":"The AWS tags used to filter the resources in the resource collection.\\n\\nTags help you identify and organize your AWS resources. Many AWS services support tagging, so you can assign the same tag to resources from different services to indicate that the resources are related. For example, you can assign the same tag to an Amazon DynamoDB table resource that you assign to an AWS Lambda function. For more information about using tags, see the [Tagging best practices](https://docs.aws.amazon.com/whitepapers/latest/tagging-best-practices/tagging-best-practices.html) whitepaper.\\n\\nEach AWS tag has two parts.\\n\\n- A tag *key* (for example, `CostCenter` , `Environment` , `Project` , or `Secret` ). Tag *keys* are case-sensitive.\\n- A field known as a tag *value* (for example, `111122223333` , `Production` , or a team name). Omitting the tag *value* is the same as using an empty string. Like tag *keys* , tag *values* are case-sensitive. The tag value is a required property when AppBoundaryKey is specified.\\n\\nTogether these are known as *key* - *value* pairs.\\n\\n> The string used for a *key* in a tag that you use to define your resource coverage must begin with the prefix `Devops-guru-` . The tag *key* might be `DevOps-Guru-deployment-application` or `devops-guru-rds-application` . When you create a *key* , the case of characters in the *key* can be whatever you choose. After you create a *key* , it is case-sensitive. For example, DevOps Guru works with a *key* named `devops-guru-rds` and a *key* named `DevOps-Guru-RDS` , and these act as two different *keys* . Possible *key* / *value* pairs in your application might be `Devops-Guru-production-application/RDS` or `Devops-Guru-production-application/containers` ."}},"AWS::DevOpsGuru::ResourceCollection.TagCollection":{"attributes":{},"description":"A collection of AWS tags.\\n\\nTags help you identify and organize your AWS resources. Many AWS services support tagging, so you can assign the same tag to resources from different services to indicate that the resources are related. For example, you can assign the same tag to an Amazon DynamoDB table resource that you assign to an AWS Lambda function. For more information about using tags, see the [Tagging best practices](https://docs.aws.amazon.com/whitepapers/latest/tagging-best-practices/tagging-best-practices.html) whitepaper.\\n\\nEach AWS tag has two parts.\\n\\n- A tag *key* (for example, `CostCenter` , `Environment` , `Project` , or `Secret` ). Tag *keys* are case-sensitive.\\n- A field known as a tag *value* (for example, `111122223333` , `Production` , or a team name). Omitting the tag *value* is the same as using an empty string. Like tag *keys* , tag *values* are case-sensitive. The tag value is a required property when *AppBoundaryKey* is specified.\\n\\nTogether these are known as *key* - *value* pairs.\\n\\n> The string used for a *key* in a tag that you use to define your resource coverage must begin with the prefix `Devops-guru-` . The tag *key* might be `DevOps-Guru-deployment-application` or `devops-guru-rds-application` . When you create a *key* , the case of characters in the *key* can be whatever you choose. After you create a *key* , it is case-sensitive. For example, DevOps Guru works with a *key* named `devops-guru-rds` and a *key* named `DevOps-Guru-RDS` , and these act as two different *keys* . Possible *key* / *value* pairs in your application might be `Devops-Guru-production-application/RDS` or `Devops-Guru-production-application/containers` .","properties":{"AppBoundaryKey":"An AWS tag *key* that is used to identify the AWS resources that DevOps Guru analyzes. All AWS resources in your account and Region tagged with this *key* make up your DevOps Guru application and analysis boundary.\\n\\n> The string used for a *key* in a tag that you use to define your resource coverage must begin with the prefix `Devops-guru-` . The tag *key* might be `DevOps-Guru-deployment-application` or `devops-guru-rds-application` . When you create a *key* , the case of characters in the *key* can be whatever you choose. After you create a *key* , it is case-sensitive. For example, DevOps Guru works with a *key* named `devops-guru-rds` and a *key* named `DevOps-Guru-RDS` , and these act as two different *keys* . Possible *key* / *value* pairs in your application might be `Devops-Guru-production-application/RDS` or `Devops-Guru-production-application/containers` .","TagValues":"The values in an AWS tag collection.\\n\\nThe tag\'s *value* is a field used to associate a string with the tag *key* (for example, `111122223333` , `Production` , or a team name). The *key* and *value* are the tag\'s *key* pair. Omitting the tag *value* is the same as using an empty string. Like tag *keys* , tag *values* are case-sensitive. You can specify a maximum of 256 characters for a tag value. The tag value is a required property when *AppBoundaryKey* is specified."}},"AWS::DeviceFarm::DevicePool":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the device pool. See [Amazon resource names](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *General Reference guide* .","Ref":"Not supported for this resource."},"description":"Represents a request to the create device pool operation.","properties":{"Description":"The device pool\'s description.","MaxDevices":"The number of devices that Device Farm can add to your device pool. Device Farm adds devices that are available and meet the criteria that you assign for the `rules` parameter. Depending on how many devices meet these constraints, your device pool might contain fewer devices than the value for this parameter.\\n\\nBy specifying the maximum number of devices, you can control the costs that you incur by running tests.","Name":"The device pool\'s name.","ProjectArn":"The ARN of the project for the device pool.","Rules":"The device pool\'s rules.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *guide* ."}},"AWS::DeviceFarm::DevicePool.Rule":{"attributes":{},"description":"Represents a condition for a device pool.","properties":{"Attribute":"The rule\'s stringified attribute. For example, specify the value as `\\"\\\\\\"abc\\\\\\"\\"` .\\n\\nThe supported operators for each attribute are provided in the following list.\\n\\n- **APPIUM_VERSION** - The Appium version for the test.\\n\\nSupported operators: `CONTAINS`\\n- **ARN** - The Amazon Resource Name (ARN) of the device (for example, `arn:aws:devicefarm:us-west-2::device:12345Example` .\\n\\nSupported operators: `EQUALS` , `IN` , `NOT_IN`\\n- **AVAILABILITY** - The current availability of the device. Valid values are AVAILABLE, HIGHLY_AVAILABLE, BUSY, or TEMPORARY_NOT_AVAILABLE.\\n\\nSupported operators: `EQUALS`\\n- **FLEET_TYPE** - The fleet type. Valid values are PUBLIC or PRIVATE.\\n\\nSupported operators: `EQUALS`\\n- **FORM_FACTOR** - The device form factor. Valid values are PHONE or TABLET.\\n\\nSupported operators: `EQUALS` , `IN` , `NOT_IN`\\n- **INSTANCE_ARN** - The Amazon Resource Name (ARN) of the device instance.\\n\\nSupported operators: `IN` , `NOT_IN`\\n- **INSTANCE_LABELS** - The label of the device instance.\\n\\nSupported operators: `CONTAINS`\\n- **MANUFACTURER** - The device manufacturer (for example, Apple).\\n\\nSupported operators: `EQUALS` , `IN` , `NOT_IN`\\n- **MODEL** - The device model, such as Apple iPad Air 2 or Google Pixel.\\n\\nSupported operators: `CONTAINS` , `EQUALS` , `IN` , `NOT_IN`\\n- **OS_VERSION** - The operating system version (for example, 10.3.2).\\n\\nSupported operators: `EQUALS` , `GREATER_THAN` , `GREATER_THAN_OR_EQUALS` , `IN` , `LESS_THAN` , `LESS_THAN_OR_EQUALS` , `NOT_IN`\\n- **PLATFORM** - The device platform. Valid values are ANDROID or IOS.\\n\\nSupported operators: `EQUALS` , `IN` , `NOT_IN`\\n- **REMOTE_ACCESS_ENABLED** - Whether the device is enabled for remote access. Valid values are TRUE or FALSE.\\n\\nSupported operators: `EQUALS`\\n- **REMOTE_DEBUG_ENABLED** - Whether the device is enabled for remote debugging. Valid values are TRUE or FALSE.\\n\\nSupported operators: `EQUALS`\\n\\nBecause remote debugging is [no longer supported](https://docs.aws.amazon.com/devicefarm/latest/developerguide/history.html) , this filter is ignored.","Operator":"Specifies how Device Farm compares the rule\'s attribute to the value. For the operators that are supported by each attribute, see the attribute descriptions.","Value":"The rule\'s value."}},"AWS::DeviceFarm::InstanceProfile":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the instance profile. See [Amazon resource names](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *General Reference guide* .","Ref":"Not supported for this resource."},"description":"Creates a profile that can be applied to one or more private fleet device instances.","properties":{"Description":"The description of the instance profile.","ExcludeAppPackagesFromCleanup":"An array of strings containing the list of app packages that should not be cleaned up from the device after a test run completes.\\n\\nThe list of packages is considered only if you set `packageCleanup` to `true` .","Name":"The name of the instance profile.","PackageCleanup":"When set to `true` , Device Farm removes app packages after a test run. The default value is `false` for private devices.","RebootAfterUse":"When set to `true` , Device Farm reboots the instance after a test run. The default value is `true` .","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *guide* ."}},"AWS::DeviceFarm::NetworkProfile":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the network profile. See [Amazon resource names](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *General Reference guide* .","Ref":"Not supported for this resource."},"description":"Creates a network profile.","properties":{"Description":"The description of the network profile.","DownlinkBandwidthBits":"The data throughput rate in bits per second, as an integer from 0 to 104857600.","DownlinkDelayMs":"Delay time for all packets to destination in milliseconds as an integer from 0 to 2000.","DownlinkJitterMs":"Time variation in the delay of received packets in milliseconds as an integer from 0 to 2000.","DownlinkLossPercent":"Proportion of received packets that fail to arrive from 0 to 100 percent.","Name":"The name of the network profile.","ProjectArn":"The Amazon Resource Name (ARN) of the specified project.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *guide* .","UplinkBandwidthBits":"The data throughput rate in bits per second, as an integer from 0 to 104857600.","UplinkDelayMs":"Delay time for all packets to destination in milliseconds as an integer from 0 to 2000.","UplinkJitterMs":"Time variation in the delay of received packets in milliseconds as an integer from 0 to 2000.","UplinkLossPercent":"Proportion of transmitted packets that fail to arrive from 0 to 100 percent."}},"AWS::DeviceFarm::Project":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the project. See [Amazon resource names](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *General Reference guide* .","Ref":"Not supported for this resource."},"description":"Creates a project.","properties":{"DefaultJobTimeoutMinutes":"Sets the execution timeout value (in minutes) for a project. All test runs in this project use the specified execution timeout value unless overridden when scheduling a run.","Name":"The project\'s name.","Tags":"The tags to add to the resource. A tag is an array of key-value pairs. Tag keys can have a maximum character length of 128 characters. Tag values can have a maximum length of 256 characters.","VpcConfig":"The VPC security groups and subnets that are attached to a project."}},"AWS::DeviceFarm::Project.VpcConfig":{"attributes":{},"description":"The VPC security groups and subnets that are attached to a project.","properties":{"SecurityGroupIds":"A list of VPC security group IDs.\\n\\nA security group allows inbound traffic from network interfaces (and their associated instances) that are assigned to the same security group. See [Security groups](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) in the *Amazon Virtual Private Cloud user guide* .","SubnetIds":"A subnet is a range of IP addresses in your VPC. You can launch Amazon resources, such as EC2 instances, into a specific subnet. When you create a subnet, you specify the IPv4 CIDR block for the subnet, which is a subset of the VPC CIDR block. See [VPCs and subnets](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html) in the *Amazon Virtual Private Cloud user guide* .","VpcId":"A list of VPC IDs.\\n\\nEach VPC is given a unique ID upon creation."}},"AWS::DeviceFarm::TestGridProject":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `TestGrid` project. See [Amazon resource names](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *General Reference guide* .","Ref":"Not supported for this resource."},"description":"A Selenium testing project. Projects are used to collect and collate sessions.","properties":{"Description":"A human-readable description for the project.","Name":"A human-readable name for the project.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *guide* .","VpcConfig":"The VPC security groups and subnets that are attached to a project."}},"AWS::DeviceFarm::TestGridProject.VpcConfig":{"attributes":{},"description":"The VPC security groups and subnets attached to the `TestGrid` project.","properties":{"SecurityGroupIds":"A list of VPC security group IDs.\\n\\nA security group allows inbound traffic from network interfaces (and their associated instances) that are assigned to the same security group. See [Security groups](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) in the *Amazon Virtual Private Cloud user guide* .","SubnetIds":"A list of VPC subnet IDs.\\n\\nA subnet is a range of IP addresses in your VPC. You can launch Amazon resources, such as EC2 instances, into a specific subnet. When you create a subnet, you specify the IPv4 CIDR block for the subnet, which is a subset of the VPC CIDR block. See [VPCs and subnets](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html) in the *Amazon Virtual Private Cloud user guide* .","VpcId":"A list of VPC IDs.\\n\\nEach VPC is given a unique ID upon creation."}},"AWS::DeviceFarm::VPCEConfiguration":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the VPC endpoint. See [Amazon resource names](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *General Reference guide* .","Ref":"Not supported for this resource."},"description":"Creates a configuration record in Device Farm for your Amazon Virtual Private Cloud (VPC) endpoint service.","properties":{"ServiceDnsName":"The DNS name that Device Farm will use to map to the private service you want to access.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *guide* .","VpceConfigurationDescription":"An optional description that provides details about your VPC endpoint configuration.","VpceConfigurationName":"The friendly name you give to your VPC endpoint configuration to manage your configurations more easily.","VpceServiceName":"The name of the VPC endpoint service that you want to access from Device Farm.\\n\\nThe name follows the format `com.amazonaws.vpce.us-west-2.vpce-svc-id` ."}},"AWS::DirectoryService::MicrosoftAD":{"attributes":{"Alias":"The alias for a directory. For example: `d-12373a053a` or `alias4-mydirectory-12345abcgmzsk` (if you have the `CreateAlias` property set to true).","DnsIpAddresses":"The IP addresses of the DNS servers for the directory, such as `[ \\"192.0.2.1\\", \\"192.0.2.2\\" ]` .","Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource ID.\\n\\nIn the following sample, the `Ref` function returns the ID of the `myDirectory` directory, such as `d-12345ab592` .\\n\\n`{ \\"Ref\\": \\"myDirectory\\" }`"},"description":"The `AWS::DirectoryService::MicrosoftAD` resource specifies a Microsoft Active Directory in AWS so that your directory users and groups can access the AWS Management Console and AWS applications using their existing credentials. For more information, see [AWS Managed Microsoft AD](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html) in the *AWS Directory Service Admin Guide* .","properties":{"CreateAlias":"Specifies an alias for a directory and assigns the alias to the directory. The alias is used to construct the access URL for the directory, such as `http://.awsapps.com` . By default, AWS CloudFormation does not create an alias.\\n\\n> After an alias has been created, it cannot be deleted or reused, so this operation should only be used when absolutely necessary.","Edition":"AWS Managed Microsoft AD is available in two editions: `Standard` and `Enterprise` . `Enterprise` is the default.","EnableSso":"Whether to enable single sign-on for a Microsoft Active Directory in AWS . Single sign-on allows users in your directory to access certain AWS services from a computer joined to the directory without having to enter their credentials separately. If you don\'t specify a value, AWS CloudFormation disables single sign-on by default.","Name":"The fully qualified domain name for the AWS Managed Microsoft AD directory, such as `corp.example.com` . This name will resolve inside your VPC only. It does not need to be publicly resolvable.","Password":"The password for the default administrative user named `Admin` .\\n\\nIf you need to change the password for the administrator account, see the [ResetUserPassword](https://docs.aws.amazon.com/directoryservice/latest/devguide/API_ResetUserPassword.html) API call in the *AWS Directory Service API Reference* .","ShortName":"The NetBIOS name for your domain, such as `CORP` . If you don\'t specify a NetBIOS name, it will default to the first part of your directory DNS. For example, `CORP` for the directory DNS `corp.example.com` .","VpcSettings":"Specifies the VPC settings of the Microsoft AD directory server in AWS ."}},"AWS::DirectoryService::MicrosoftAD.VpcSettings":{"attributes":{},"description":"Contains VPC information for the [CreateDirectory](https://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateDirectory.html) or [CreateMicrosoftAD](https://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateMicrosoftAD.html) operation.","properties":{"SubnetIds":"The identifiers of the subnets for the directory servers. The two subnets must be in different Availability Zones. AWS Directory Service specifies a directory server and a DNS server in each of these subnets.","VpcId":"The identifier of the VPC in which to create the directory."}},"AWS::DirectoryService::SimpleAD":{"attributes":{"Alias":"The alias for a directory. For example: `d-12373a053a` or `alias4-mydirectory-12345abcgmzsk` (if you have the `CreateAlias` property set to true).","DirectoryId":"","DnsIpAddresses":"The IP addresses of the DNS servers for the directory, such as `[ \\"172.31.3.154\\", \\"172.31.63.203\\" ]` .","Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource ID.\\n\\nIn the following sample, the `Ref` function returns the ID of the `myDirectory` directory, such as `d-1a2b3c4d5e` .\\n\\n`{ \\"Ref\\": \\"myDirectory\\" }`"},"description":"The `AWS::DirectoryService::SimpleAD` resource specifies an AWS Directory Service Simple Active Directory ( Simple AD ) in AWS so that your directory users and groups can access the AWS Management Console and AWS applications using their existing credentials. Simple AD is a Microsoft Active Directory–compatible directory. For more information, see [Simple Active Directory](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_simple_ad.html) in the *AWS Directory Service Admin Guide* .","properties":{"CreateAlias":"If set to `true` , specifies an alias for a directory and assigns the alias to the directory. The alias is used to construct the access URL for the directory, such as `http://.awsapps.com` . By default, this property is set to `false` .\\n\\n> After an alias has been created, it cannot be deleted or reused, so this operation should only be used when absolutely necessary.","Description":"A description for the directory.","EnableSso":"Whether to enable single sign-on for a directory. If you don\'t specify a value, AWS CloudFormation disables single sign-on by default.","Name":"The fully qualified name for the directory, such as `corp.example.com` .","Password":"The password for the directory administrator. The directory creation process creates a directory administrator account with the user name `Administrator` and this password.\\n\\nIf you need to change the password for the administrator account, see the [ResetUserPassword](https://docs.aws.amazon.com/directoryservice/latest/devguide/API_ResetUserPassword.html) API call in the *AWS Directory Service API Reference* .","ShortName":"The NetBIOS name of the directory, such as `CORP` .","Size":"The size of the directory. For valid values, see [CreateDirectory](https://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateDirectory.html) in the *AWS Directory Service API Reference* .","VpcSettings":"A [DirectoryVpcSettings](https://docs.aws.amazon.com/directoryservice/latest/devguide/API_DirectoryVpcSettings.html) object that contains additional information for the operation."}},"AWS::DirectoryService::SimpleAD.VpcSettings":{"attributes":{},"description":"Contains VPC information for the [CreateDirectory](https://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateDirectory.html) or [CreateMicrosoftAD](https://docs.aws.amazon.com/directoryservice/latest/devguide/API_CreateMicrosoftAD.html) operation.","properties":{"SubnetIds":"The identifiers of the subnets for the directory servers. The two subnets must be in different Availability Zones. AWS Directory Service specifies a directory server and a DNS server in each of these subnets.","VpcId":"The identifier of the VPC in which to create the directory."}},"AWS::DocDB::DBCluster":{"attributes":{"ClusterResourceId":"The resource id for the cluster; for example: `cluster-ABCD1234EFGH5678IJKL90MNOP` . The cluster ID uniquely identifies the cluster and is used in things like IAM authentication policies.","Endpoint":"The connection endpoint for the cluster, such as `sample-cluster.cluster-cozrlsfrcjoc.us-east-1.docdb.amazonaws.com` .","Port":"The port number on which the cluster accepts connections. For example: `27017` .","ReadEndpoint":"The reader endpoint for the cluster. For example: `sample-cluster.cluster-ro-cozrlsfrcjoc.us-east-1.docdb.amazonaws.com` .","Ref":"`Ref` returns the DBClusterIdentifier, such as `mycluster` ."},"description":"The `AWS::DocDB::DBCluster` Amazon DocumentDB (with MongoDB compatibility) resource describes a DBCluster. Amazon DocumentDB is a fully managed, MongoDB-compatible document database engine. For more information, see [DBCluster](https://docs.aws.amazon.com/documentdb/latest/developerguide/API_DBCluster.html) in the *Amazon DocumentDB Developer Guide* .","properties":{"AvailabilityZones":"A list of Amazon EC2 Availability Zones that instances in the cluster can be created in.","BackupRetentionPeriod":"The number of days for which automated backups are retained. You must specify a minimum value of 1.\\n\\nDefault: 1\\n\\nConstraints:\\n\\n- Must be a value from 1 to 35.","CopyTagsToSnapshot":"","DBClusterIdentifier":"The cluster identifier. This parameter is stored as a lowercase string.\\n\\nConstraints:\\n\\n- Must contain from 1 to 63 letters, numbers, or hyphens.\\n- The first character must be a letter.\\n- Cannot end with a hyphen or contain two consecutive hyphens.\\n\\nExample: `my-cluster`","DBClusterParameterGroupName":"The name of the cluster parameter group to associate with this cluster.","DBSubnetGroupName":"A subnet group to associate with this cluster.\\n\\nConstraints: Must match the name of an existing `DBSubnetGroup` . Must not be default.\\n\\nExample: `mySubnetgroup`","DeletionProtection":"Protects clusters from being accidentally deleted. If enabled, the cluster cannot be deleted unless it is modified and `DeletionProtection` is disabled.","EnableCloudwatchLogsExports":"The list of log types that need to be enabled for exporting to Amazon CloudWatch Logs. You can enable audit logs or profiler logs. For more information, see [Auditing Amazon DocumentDB Events](https://docs.aws.amazon.com/documentdb/latest/developerguide/event-auditing.html) and [Profiling Amazon DocumentDB Operations](https://docs.aws.amazon.com/documentdb/latest/developerguide/profiling.html) .","EngineVersion":"The version number of the database engine to use. The `--engine-version` will default to the latest major engine version. For production workloads, we recommend explicitly declaring this parameter with the intended major engine version.","KmsKeyId":"The AWS KMS key identifier for an encrypted cluster.\\n\\nThe AWS KMS key identifier is the Amazon Resource Name (ARN) for the AWS KMS encryption key. If you are creating a cluster using the same AWS account that owns the AWS KMS encryption key that is used to encrypt the new cluster, you can use the AWS KMS key alias instead of the ARN for the AWS KMS encryption key.\\n\\nIf an encryption key is not specified in `KmsKeyId` :\\n\\n- If the `StorageEncrypted` parameter is `true` , Amazon DocumentDB uses your default encryption key.\\n\\nAWS KMS creates the default encryption key for your AWS account . Your AWS account has a different default encryption key for each AWS Regions .","MasterUserPassword":"The password for the master database user. This password can contain any printable ASCII character except forward slash (/), double quote (\\"), or the \\"at\\" symbol (@).\\n\\nConstraints: Must contain from 8 to 100 characters.","MasterUsername":"The name of the master user for the cluster.\\n\\nConstraints:\\n\\n- Must be from 1 to 63 letters or numbers.\\n- The first character must be a letter.\\n- Cannot be a reserved word for the chosen database engine.","Port":"Specifies the port that the database engine is listening on.","PreferredBackupWindow":"The daily time range during which automated backups are created if automated backups are enabled using the `BackupRetentionPeriod` parameter.\\n\\nThe default is a 30-minute window selected at random from an 8-hour block of time for each AWS Region .\\n\\nConstraints:\\n\\n- Must be in the format `hh24:mi-hh24:mi` .\\n- Must be in Universal Coordinated Time (UTC).\\n- Must not conflict with the preferred maintenance window.\\n- Must be at least 30 minutes.","PreferredMaintenanceWindow":"The weekly time range during which system maintenance can occur, in Universal Coordinated Time (UTC).\\n\\nFormat: `ddd:hh24:mi-ddd:hh24:mi`\\n\\nThe default is a 30-minute window selected at random from an 8-hour block of time for each AWS Region , occurring on a random day of the week.\\n\\nValid days: Mon, Tue, Wed, Thu, Fri, Sat, Sun\\n\\nConstraints: Minimum 30-minute window.","RestoreToTime":"","RestoreType":"","SnapshotIdentifier":"The identifier for the snapshot or cluster snapshot to restore from.\\n\\nYou can use either the name or the Amazon Resource Name (ARN) to specify a cluster snapshot. However, you can use only the ARN to specify a snapshot.\\n\\nConstraints:\\n\\n- Must match the identifier of an existing snapshot.","SourceDBClusterIdentifier":"","StorageEncrypted":"Specifies whether the cluster is encrypted.","Tags":"The tags to be assigned to the cluster.","UseLatestRestorableTime":"","VpcSecurityGroupIds":"A list of EC2 VPC security groups to associate with this cluster."}},"AWS::DocDB::DBClusterParameterGroup":{"attributes":{"Ref":"`Ref` returns the DBClusterParameterGroup\'s name, such as `sample-db-cluster-param-group` ."},"description":"The `AWS::DocDB::DBClusterParameterGroup` Amazon DocumentDB (with MongoDB compatibility) resource describes a DBClusterParameterGroup. For more information, see [DBClusterParameterGroup](https://docs.aws.amazon.com/documentdb/latest/developerguide/API_DBClusterParameterGroup.html) in the *Amazon DocumentDB Developer Guide* .\\n\\nParameters in a cluster parameter group apply to all of the instances in a cluster.\\n\\nA cluster parameter group is initially created with the default parameters for the database engine used by instances in the cluster. To provide custom values for any of the parameters, you must modify the group after you create it. After you create a DB cluster parameter group, you must associate it with your cluster. For the new cluster parameter group and associated settings to take effect, you must then reboot the DB instances in the cluster without failover.\\n\\n> After you create a cluster parameter group, you should wait at least 5 minutes before creating your first cluster that uses that cluster parameter group as the default parameter group. This allows Amazon DocumentDB to fully complete the create action before the cluster parameter group is used as the default for a new cluster. This step is especially important for parameters that are critical when creating the default database for a cluster, such as the character set for the default database defined by the `character_set_database` parameter.","properties":{"Description":"The description for the cluster parameter group.","Family":"The cluster parameter group family name.","Name":"The name of the DB cluster parameter group.\\n\\nConstraints:\\n\\n- Must not match the name of an existing `DBClusterParameterGroup` .\\n\\n> This value is stored as a lowercase string.","Parameters":"Provides a list of parameters for the cluster parameter group.","Tags":"The tags to be assigned to the cluster parameter group."}},"AWS::DocDB::DBInstance":{"attributes":{"Endpoint":"The connection endpoint for the instance. For example: `sample-cluster.cluster-abcdefghijkl.us-east-1.docdb.amazonaws.com` .","Port":"The port number on which the database accepts connections, such as `27017` .","Ref":"`Ref` returns the DBInstance\'s name, such as `sample-cluster-instance` ."},"description":"The `AWS::DocDB::DBInstance` Amazon DocumentDB (with MongoDB compatibility) resource describes a DBInstance. For more information, see [DBInstance](https://docs.aws.amazon.com/documentdb/latest/developerguide/API_DBInstance.html) in the *Amazon DocumentDB Developer Guide* .","properties":{"AutoMinorVersionUpgrade":"This parameter does not apply to Amazon DocumentDB. Amazon DocumentDB does not perform minor version upgrades regardless of the value set.\\n\\nDefault: `false`","AvailabilityZone":"The Amazon EC2 Availability Zone that the instance is created in.\\n\\nDefault: A random, system-chosen Availability Zone in the endpoint\'s AWS Region .\\n\\nExample: `us-east-1d`","DBClusterIdentifier":"The identifier of the cluster that the instance will belong to.","DBInstanceClass":"The compute and memory capacity of the instance; for example, `db.m4.large` . If you change the class of an instance there can be some interruption in the cluster\'s service.","DBInstanceIdentifier":"The instance identifier. This parameter is stored as a lowercase string.\\n\\nConstraints:\\n\\n- Must contain from 1 to 63 letters, numbers, or hyphens.\\n- The first character must be a letter.\\n- Cannot end with a hyphen or contain two consecutive hyphens.\\n\\nExample: `mydbinstance`","EnablePerformanceInsights":"","PreferredMaintenanceWindow":"The time range each week during which system maintenance can occur, in Universal Coordinated Time (UTC).\\n\\nFormat: `ddd:hh24:mi-ddd:hh24:mi`\\n\\nThe default is a 30-minute window selected at random from an 8-hour block of time for each AWS Region , occurring on a random day of the week.\\n\\nValid days: Mon, Tue, Wed, Thu, Fri, Sat, Sun\\n\\nConstraints: Minimum 30-minute window.","Tags":"The tags to be assigned to the instance. You can assign up to 10 tags to an instance."}},"AWS::DocDB::DBSubnetGroup":{"attributes":{"Ref":"`Ref` returns the DBSubnetGroup\'s name, such as `default` ."},"description":"The `AWS::DocDB::DBSubnetGroup` Amazon DocumentDB (with MongoDB compatibility) resource describes a DBSubnetGroup. subnet groups must contain at least one subnet in at least two Availability Zones in the AWS Region . For more information, see [DBSubnetGroup](https://docs.aws.amazon.com/documentdb/latest/developerguide/API_DBSubnetGroup.html) in the *Amazon DocumentDB Developer Guide* .","properties":{"DBSubnetGroupDescription":"The description for the subnet group.","DBSubnetGroupName":"The name for the subnet group. This value is stored as a lowercase string.\\n\\nConstraints: Must contain no more than 255 letters, numbers, periods, underscores, spaces, or hyphens. Must not be default.\\n\\nExample: `mySubnetgroup`","SubnetIds":"The Amazon EC2 subnet IDs for the subnet group.","Tags":"The tags to be assigned to the subnet group."}},"AWS::DocDBElastic::Cluster":{"attributes":{"ClusterArn":"","ClusterEndpoint":"","Ref":""},"description":"Creates a new Amazon DocumentDB elastic cluster and returns its cluster structure.","properties":{"AdminUserName":"The name of the Amazon DocumentDB elastic clusters administrator.\\n\\n*Constraints* :\\n\\n- Must be from 1 to 63 letters or numbers.\\n- The first character must be a letter.\\n- Cannot be a reserved word.","AdminUserPassword":"The password for the Elastic DocumentDB cluster administrator and can contain any printable ASCII characters.\\n\\n*Constraints* :\\n\\n- Must contain from 8 to 100 characters.\\n- Cannot contain a forward slash (/), double quote (\\"), or the \\"at\\" symbol (@).\\n- A valid `AdminUserName` entry is also required.","AuthType":"The authentication type used to determine where to fetch the password used for accessing the elastic cluster. Valid types are `PLAIN_TEXT` or `SECRET_ARN` .","ClusterName":"The name of the new elastic cluster. This parameter is stored as a lowercase string.\\n\\n*Constraints* :\\n\\n- Must contain from 1 to 63 letters, numbers, or hyphens.\\n- The first character must be a letter.\\n- Cannot end with a hyphen or contain two consecutive hyphens.\\n\\n*Example* : `my-cluster`","KmsKeyId":"The KMS key identifier to use to encrypt the new elastic cluster.\\n\\nThe KMS key identifier is the Amazon Resource Name (ARN) for the KMS encryption key. If you are creating a cluster using the same Amazon account that owns this KMS encryption key, you can use the KMS key alias instead of the ARN as the KMS encryption key.\\n\\nIf an encryption key is not specified, Amazon DocumentDB uses the default encryption key that KMS creates for your account. Your account has a different default encryption key for each Amazon Region.","PreferredMaintenanceWindow":"The weekly time range during which system maintenance can occur, in Universal Coordinated Time (UTC).\\n\\n*Format* : `ddd:hh24:mi-ddd:hh24:mi`\\n\\n*Default* : a 30-minute window selected at random from an 8-hour block of time for each AWS Region , occurring on a random day of the week.\\n\\n*Valid days* : Mon, Tue, Wed, Thu, Fri, Sat, Sun\\n\\n*Constraints* : Minimum 30-minute window.","ShardCapacity":"The number of vCPUs assigned to each elastic cluster shard. Maximum is 64. Allowed values are 2, 4, 8, 16, 32, 64.","ShardCount":"The number of shards assigned to the elastic cluster. Maximum is 32.","SubnetIds":"The Amazon EC2 subnet IDs for the new elastic cluster.","Tags":"The tags to be assigned to the new elastic cluster.","VpcSecurityGroupIds":"A list of EC2 VPC security groups to associate with the new elastic cluster."}},"AWS::DynamoDB::GlobalTable":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the DynamoDB table, such as `arn:aws:dynamodb:us-east-2:123456789012:table/myDynamoDBTable` . The ARN returned is that of the replica in the region the stack is deployed to.","Ref":"`Ref` returns the table name.","StreamArn":"The ARN of the DynamoDB stream, such as `arn:aws:dynamodb:us-east-1:123456789012:table/testddbstack-myDynamoDBTable-012A1SL7SMP5Q/stream/2015-11-30T20:10:00.000` . The `StreamArn` returned is that of the replica in the region the stack is deployed to.\\n\\n> You must specify the `StreamSpecification` property to use this attribute.","TableId":"Unique identifier for the table, such as `a123b456-01ab-23cd-123a-111222aaabbb` . The `TableId` returned is that of the replica in the region the stack is deployed to."},"description":"The `AWS::DynamoDB::GlobalTable` resource enables you to create and manage a Version 2019.11.21 global table. This resource cannot be used to create or manage a Version 2017.11.29 global table. For more information, see [Global tables](https://docs.aws.amazon.com//amazondynamodb/latest/developerguide/GlobalTables.html) .\\n\\n> You cannot convert a resource of type `AWS::DynamoDB::Table` into a resource of type `AWS::DynamoDB::GlobalTable` by changing its type in your template. *Doing so might result in the deletion of your DynamoDB table.*\\n> \\n> You can instead use the GlobalTable resource to create a new table in a single Region. This will be billed the same as a single Region table. If you later update the stack to add other Regions then Global Tables pricing will apply. \\n\\nYou should be aware of the following behaviors when working with DynamoDB global tables.\\n\\n- The IAM Principal executing the stack operation must have the permissions listed below in all regions where you plan to have a global table replica. The IAM Principal\'s permissions should not have restrictions based on IP source address. Some global tables operations (for example, adding a replica) are asynchronous, and require that the IAM Principal is valid until they complete. You should not delete the Principal (user or IAM role) until CloudFormation has finished updating your stack.\\n\\n- `dynamodb:CreateTable`\\n- `dynamodb:UpdateTable`\\n- `dynamodb:DeleteTable`\\n- `dynamodb:DescribeContinuousBackups`\\n- `dynamodb:DescribeContributorInsights`\\n- `dynamodb:DescribeTable`\\n- `dynamodb:DescribeTableReplicaAutoScaling`\\n- `dynamodb:DescribeTimeToLive`\\n- `dynamodb:ListTables`\\n- `dynamodb:UpdateTimeToLive`\\n- `dynamodb:UpdateContributorInsights`\\n- `dynamodb:UpdateContinuousBackups`\\n- `dynamodb:ListTagsOfResource`\\n- `dynamodb:TableClass`\\n- `dynamodb:TagResource`\\n- `dynamodb:UntagResource`\\n- `dynamodb:BatchWriteItem`\\n- `dynamodb:CreateTableReplica`\\n- `dynamodb:DeleteItem`\\n- `dynamodb:DeleteTableReplica`\\n- `dynamodb:DisableKinesisStreamingDestination`\\n- `dynamodb:EnableKinesisStreamingDestination`\\n- `dynamodb:GetItem`\\n- `dynamodb:PutItem`\\n- `dynamodb:Query`\\n- `dynamodb:Scan`\\n- `dynamodb:UpdateItem`\\n- `dynamodb:DescribeTableReplicaAutoScaling`\\n- `dynamodb:UpdateTableReplicaAutoScaling`\\n- `iam:CreateServiceLinkedRole`\\n- `kms:CreateGrant`\\n- `kms:DescribeKey`\\n- `application-autoscaling:DeleteScalingPolicy`\\n- `application-autoscaling:DeleteScheduledAction`\\n- `application-autoscaling:DeregisterScalableTarget`\\n- `application-autoscaling:DescribeScalingPolicies`\\n- `application-autoscaling:DescribeScalableTargets`\\n- `application-autoscaling:PutScalingPolicy`\\n- `application-autoscaling:PutScheduledAction`\\n- `application-autoscaling:RegisterScalableTarget`\\n- When using provisioned billing mode, CloudFormation will create an auto scaling policy on each of your replicas to control their write capacities. You must configure this policy using the `WriteProvisionedThroughputSettings` property. CloudFormation will ensure that all replicas have the same write capacity auto scaling property. You cannot directly specify a value for write capacity for a global table.\\n- If your table uses provisioned capacity, you must configure auto scaling directly in the `AWS::DynamoDB::GlobalTable` resource. You should not configure additional auto scaling policies on any of the table replicas or global secondary indexes, either via API or via `AWS::ApplicationAutoScaling::ScalableTarget` or `AWS::ApplicationAutoScaling::ScalingPolicy` . Doing so might result in unexpected behavior and is unsupported.\\n- In AWS CloudFormation , each global table is controlled by a single stack, in a single region, regardless of the number of replicas. When you deploy your template, CloudFormation will create/update all replicas as part of a single stack operation. You should not deploy the same `AWS::DynamoDB::GlobalTable` resource in multiple regions. Doing so will result in errors, and is unsupported. If you deploy your application template in multiple regions, you can use conditions to only create the resource in a single region. Alternatively, you can choose to define your `AWS::DynamoDB::GlobalTable` resources in a stack separate from your application stack, and make sure it is only deployed to a single region.","properties":{"AttributeDefinitions":"A list of attributes that describe the key schema for the global table and indexes.","BillingMode":"Specifies how you are charged for read and write throughput and how you manage capacity. Valid values are:\\n\\n- `PAY_PER_REQUEST`\\n- `PROVISIONED`\\n\\nAll replicas in your global table will have the same billing mode. If you use `PROVISIONED` billing mode, you must provide an auto scaling configuration via the `WriteProvisionedThroughputSettings` property. The default value of this property is `PROVISIONED` .","GlobalSecondaryIndexes":"Global secondary indexes to be created on the global table. You can create up to 20 global secondary indexes. Each replica in your global table will have the same global secondary index settings. You can only create or delete one global secondary index in a single stack operation.\\n\\nSince the backfilling of an index could take a long time, CloudFormation does not wait for the index to become active. If a stack operation rolls back, CloudFormation might not delete an index that has been added. In that case, you will need to delete the index manually.","KeySchema":"Specifies the attributes that make up the primary key for the table. The attributes in the `KeySchema` property must also be defined in the `AttributeDefinitions` property.","LocalSecondaryIndexes":"Local secondary indexes to be created on the table. You can create up to five local secondary indexes. Each index is scoped to a given hash key value. The size of each hash key can be up to 10 gigabytes. Each replica in your global table will have the same local secondary index settings.","Replicas":"Specifies the list of replicas for your global table. The list must contain at least one element, the region where the stack defining the global table is deployed. For example, if you define your table in a stack deployed to us-east-1, you must have an entry in `Replicas` with the region us-east-1. You cannot remove the replica in the stack region.\\n\\n> Adding a replica might take a few minutes for an empty table, or up to several hours for large tables. If you want to add or remove a replica, we recommend submitting an `UpdateStack` operation containing only that change.\\n> \\n> If you add or delete a replica during an update, we recommend that you don\'t update any other resources. If your stack fails to update and is rolled back while adding a new replica, you might need to manually delete the replica. \\n\\nYou can create a new global table with as many replicas as needed. You can add or remove replicas after table creation, but you can only add or remove a single replica in each update.","SSESpecification":"Specifies the settings to enable server-side encryption. These settings will be applied to all replicas. If you plan to use customer-managed KMS keys, you must provide a key for each replica using the `ReplicaSpecification.ReplicaSSESpecification` property.","StreamSpecification":"Specifies the streams settings on your global table. You must provide a value for this property if your global table contains more than one replica. You can only change the streams settings if your global table has only one replica.","TableName":"A name for the global table. If you don\'t specify a name, AWS CloudFormation generates a unique ID and uses that ID as the table name. For more information, see [Name type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","TimeToLiveSpecification":"Specifies the time to live (TTL) settings for the table. This setting will be applied to all replicas.","WriteProvisionedThroughputSettings":"Specifies an auto scaling policy for write capacity. This policy will be applied to all replicas. This setting must be specified if `BillingMode` is set to `PROVISIONED` ."}},"AWS::DynamoDB::GlobalTable.AttributeDefinition":{"attributes":{},"description":"Represents an attribute for describing the key schema for the table and indexes.","properties":{"AttributeName":"A name for the attribute.","AttributeType":"The data type for the attribute, where:\\n\\n- `S` - the attribute is of type String\\n- `N` - the attribute is of type Number\\n- `B` - the attribute is of type Binary"}},"AWS::DynamoDB::GlobalTable.CapacityAutoScalingSettings":{"attributes":{},"description":"Configures a scalable target and an autoscaling policy for a table or global secondary index\'s read or write capacity.","properties":{"MaxCapacity":"The maximum provisioned capacity units for the global table.","MinCapacity":"The minimum provisioned capacity units for the global table.","SeedCapacity":"When switching billing mode from `PAY_PER_REQUEST` to `PROVISIONED` , DynamoDB requires you to specify read and write capacity unit values for the table and for each global secondary index. These values will be applied to all replicas. The table will use these provisioned values until CloudFormation creates the autoscaling policies you configured in your template. CloudFormation cannot determine what capacity the table and its global secondary indexes will require in this time period, since they are application-dependent.\\n\\nIf you want to switch a table\'s billing mode from `PAY_PER_REQUEST` to `PROVISIONED` , you must specify a value for this property for each autoscaled resource. If you specify different values for the same resource in different regions, CloudFormation will use the highest value found in either the `SeedCapacity` or `ReadCapacityUnits` properties. For example, if your global secondary index `myGSI` has a `SeedCapacity` of 10 in us-east-1 and a fixed `ReadCapacityUnits` of 20 in eu-west-1, CloudFormation will initially set the read capacity for `myGSI` to 20. Note that if you disable `ScaleIn` for `myGSI` in us-east-1, its read capacity units might not be set back to 10.\\n\\nYou must also specify a value for `SeedCapacity` when you plan to switch a table\'s billing mode from `PROVISIONED` to `PAY_PER_REQUEST` , because CloudFormation might need to roll back the operation (reverting the billing mode to `PROVISIONED` ) and this cannot succeed without specifying a value for `SeedCapacity` .","TargetTrackingScalingPolicyConfiguration":"Defines a target tracking scaling policy."}},"AWS::DynamoDB::GlobalTable.ContributorInsightsSpecification":{"attributes":{},"description":"Configures contributor insights settings for a replica or one of its indexes.","properties":{"Enabled":"Indicates whether CloudWatch Contributor Insights are to be enabled (true) or disabled (false)."}},"AWS::DynamoDB::GlobalTable.GlobalSecondaryIndex":{"attributes":{},"description":"Allows you to specify a global secondary index for the global table. The index will be defined on all replicas.","properties":{"IndexName":"The name of the global secondary index. The name must be unique among all other indexes on this table.","KeySchema":"The complete key schema for a global secondary index, which consists of one or more pairs of attribute names and key types:\\n\\n- `HASH` - partition key\\n- `RANGE` - sort key\\n\\n> The partition key of an item is also known as its *hash attribute* . The term \\"hash attribute\\" derives from DynamoDB\'s usage of an internal hash function to evenly distribute data items across partitions, based on their partition key values.\\n> \\n> The sort key of an item is also known as its *range attribute* . The term \\"range attribute\\" derives from the way DynamoDB stores items with the same partition key physically close together, in sorted order by the sort key value.","Projection":"Represents attributes that are copied (projected) from the table into the global secondary index. These are in addition to the primary key attributes and index key attributes, which are automatically projected.","WriteProvisionedThroughputSettings":"Defines write capacity settings for the global secondary index. You must specify a value for this property if the table\'s `BillingMode` is `PROVISIONED` . All replicas will have the same write capacity settings for this global secondary index."}},"AWS::DynamoDB::GlobalTable.KeySchema":{"attributes":{},"description":"Represents *a single element* of a key schema. A key schema specifies the attributes that make up the primary key of a table, or the key attributes of an index.\\n\\nA `KeySchemaElement` represents exactly one attribute of the primary key. For example, a simple primary key would be represented by one `KeySchemaElement` (for the partition key). A composite primary key would require one `KeySchemaElement` for the partition key, and another `KeySchemaElement` for the sort key.\\n\\nA `KeySchemaElement` must be a scalar, top-level attribute (not a nested attribute). The data type must be one of String, Number, or Binary. The attribute cannot be nested within a List or a Map.","properties":{"AttributeName":"The name of a key attribute.","KeyType":"The role that this key attribute will assume:\\n\\n- `HASH` - partition key\\n- `RANGE` - sort key\\n\\n> The partition key of an item is also known as its *hash attribute* . The term \\"hash attribute\\" derives from DynamoDB\'s usage of an internal hash function to evenly distribute data items across partitions, based on their partition key values.\\n> \\n> The sort key of an item is also known as its *range attribute* . The term \\"range attribute\\" derives from the way DynamoDB stores items with the same partition key physically close together, in sorted order by the sort key value."}},"AWS::DynamoDB::GlobalTable.KinesisStreamSpecification":{"attributes":{},"description":"The Kinesis Data Streams configuration for the specified global table replica.","properties":{"StreamArn":"The ARN for a specific Kinesis data stream."}},"AWS::DynamoDB::GlobalTable.LocalSecondaryIndex":{"attributes":{},"description":"Represents the properties of a local secondary index. A local secondary index can only be created when its parent table is created.","properties":{"IndexName":"The name of the local secondary index. The name must be unique among all other indexes on this table.","KeySchema":"The complete key schema for the local secondary index, consisting of one or more pairs of attribute names and key types:\\n\\n- `HASH` - partition key\\n- `RANGE` - sort key\\n\\n> The partition key of an item is also known as its *hash attribute* . The term \\"hash attribute\\" derives from DynamoDB\'s usage of an internal hash function to evenly distribute data items across partitions, based on their partition key values.\\n> \\n> The sort key of an item is also known as its *range attribute* . The term \\"range attribute\\" derives from the way DynamoDB stores items with the same partition key physically close together, in sorted order by the sort key value.","Projection":"Represents attributes that are copied (projected) from the table into the local secondary index. These are in addition to the primary key attributes and index key attributes, which are automatically projected."}},"AWS::DynamoDB::GlobalTable.PointInTimeRecoverySpecification":{"attributes":{},"description":"Represents the settings used to enable point in time recovery.","properties":{"PointInTimeRecoveryEnabled":"Indicates whether point in time recovery is enabled (true) or disabled (false) on the table."}},"AWS::DynamoDB::GlobalTable.Projection":{"attributes":{},"description":"Represents attributes that are copied (projected) from the table into an index. These are in addition to the primary key attributes and index key attributes, which are automatically projected.","properties":{"NonKeyAttributes":"Represents the non-key attribute names which will be projected into the index.\\n\\nFor local secondary indexes, the total count of `NonKeyAttributes` summed across all of the local secondary indexes, must not exceed 100. If you project the same attribute into two different indexes, this counts as two distinct attributes when determining the total.","ProjectionType":"The set of attributes that are projected into the index:\\n\\n- `KEYS_ONLY` - Only the index and primary keys are projected into the index.\\n- `INCLUDE` - In addition to the attributes described in `KEYS_ONLY` , the secondary index will include other non-key attributes that you specify.\\n- `ALL` - All of the table attributes are projected into the index."}},"AWS::DynamoDB::GlobalTable.ReadProvisionedThroughputSettings":{"attributes":{},"description":"Allows you to specify the read capacity settings for a replica table or a replica global secondary index when the `BillingMode` is set to `PROVISIONED` . You must specify a value for either `ReadCapacityUnits` or `ReadCapacityAutoScalingSettings` , but not both. You can switch between fixed capacity and auto scaling.","properties":{"ReadCapacityAutoScalingSettings":"Specifies auto scaling settings for the replica table or global secondary index.","ReadCapacityUnits":"Specifies a fixed read capacity for the replica table or global secondary index."}},"AWS::DynamoDB::GlobalTable.ReplicaGlobalSecondaryIndexSpecification":{"attributes":{},"description":"Represents the properties of a global secondary index that can be set on a per-replica basis.","properties":{"ContributorInsightsSpecification":"Updates the status for contributor insights for a specific table or index. CloudWatch Contributor Insights for DynamoDB graphs display the partition key and (if applicable) sort key of frequently accessed items and frequently throttled items in plaintext. If you require the use of AWS Key Management Service (KMS) to encrypt this table’s partition key and sort key data with an AWS managed key or customer managed key, you should not enable CloudWatch Contributor Insights for DynamoDB for this table.","IndexName":"The name of the global secondary index. The name must be unique among all other indexes on this table.","ReadProvisionedThroughputSettings":"Allows you to specify the read capacity settings for a replica global secondary index when the `BillingMode` is set to `PROVISIONED` ."}},"AWS::DynamoDB::GlobalTable.ReplicaSSESpecification":{"attributes":{},"description":"Allows you to specify a KMS key identifier to be used for server-side encryption. The key can be specified via ARN, key ID, or alias. The key must be created in the same region as the replica.","properties":{"KMSMasterKeyId":"The AWS KMS key that should be used for the AWS KMS encryption. To specify a key, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. Note that you should only provide this parameter if the key is different from the default DynamoDB key `alias/aws/dynamodb` ."}},"AWS::DynamoDB::GlobalTable.ReplicaSpecification":{"attributes":{},"description":"Defines settings specific to a single replica of a global table.","properties":{"ContributorInsightsSpecification":"The settings used to enable or disable CloudWatch Contributor Insights for the specified replica. When not specified, defaults to contributor insights disabled for the replica.","DeletionProtectionEnabled":"Determines if a replica is protected from deletion. When enabled, the table cannot be deleted by any user or process. This setting is disabled by default. For more information, see [Using deletion protection](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.Basics.html#WorkingWithTables.Basics.DeletionProtection) in the *Amazon DynamoDB Developer Guide* .","GlobalSecondaryIndexes":"Defines additional settings for the global secondary indexes of this replica.","KinesisStreamSpecification":"Defines the Kinesis Data Streams configuration for the specified replica.","PointInTimeRecoverySpecification":"The settings used to enable point in time recovery. When not specified, defaults to point in time recovery disabled for the replica.","ReadProvisionedThroughputSettings":"Defines read capacity settings for the replica table.","Region":"The region in which this replica exists.","SSESpecification":"Allows you to specify a customer-managed key for the replica. When using customer-managed keys for server-side encryption, this property must have a value in all replicas.","TableClass":"The table class of the specified table. Valid values are `STANDARD` and `STANDARD_INFREQUENT_ACCESS` .","Tags":"An array of key-value pairs to apply to this replica.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::DynamoDB::GlobalTable.SSESpecification":{"attributes":{},"description":"Represents the settings used to enable server-side encryption.","properties":{"SSEEnabled":"Indicates whether server-side encryption is performed using an AWS managed key or an AWS owned key. If enabled (true), server-side encryption type is set to KMS and an AWS managed key is used ( AWS KMS charges apply). If disabled (false) or not specified,server-side encryption is set to an AWS owned key. If you choose to use KMS encryption, you can also use customer managed KMS keys by specifying them in the `ReplicaSpecification.SSESpecification` object. You cannot mix AWS managed and customer managed KMS keys.","SSEType":"Server-side encryption type. The only supported value is:\\n\\n- `KMS` - Server-side encryption that uses AWS Key Management Service . The key is stored in your account and is managed by AWS KMS ( AWS KMS charges apply)."}},"AWS::DynamoDB::GlobalTable.StreamSpecification":{"attributes":{},"description":"Represents the DynamoDB Streams configuration for a table in DynamoDB.\\n\\nYou can only modify this value if your `AWS::DynamoDB::GlobalTable` contains only one entry in `Replicas` . You must specify a value for this property if your `AWS::DynamoDB::GlobalTable` contains more than one replica.","properties":{"StreamViewType":"When an item in the table is modified, `StreamViewType` determines what information is written to the stream for this table. Valid values for `StreamViewType` are:\\n\\n- `KEYS_ONLY` - Only the key attributes of the modified item are written to the stream.\\n- `NEW_IMAGE` - The entire item, as it appears after it was modified, is written to the stream.\\n- `OLD_IMAGE` - The entire item, as it appeared before it was modified, is written to the stream.\\n- `NEW_AND_OLD_IMAGES` - Both the new and the old item images of the item are written to the stream."}},"AWS::DynamoDB::GlobalTable.TargetTrackingScalingPolicyConfiguration":{"attributes":{},"description":"Defines a target tracking scaling policy.","properties":{"DisableScaleIn":"Indicates whether scale in by the target tracking scaling policy is disabled. The default value is `false` .","ScaleInCooldown":"The amount of time, in seconds, after a scale-in activity completes before another scale-in activity can start.","ScaleOutCooldown":"The amount of time, in seconds, after a scale-out activity completes before another scale-out activity can start.","TargetValue":"Defines a target value for the scaling policy."}},"AWS::DynamoDB::GlobalTable.TimeToLiveSpecification":{"attributes":{},"description":"Represents the settings used to enable or disable Time to Live (TTL) for the specified table. All replicas will have the same time to live configuration.","properties":{"AttributeName":"The name of the attribute used to store the expiration time for items in the table.\\n\\nCurrently, you cannot directly change the attribute name used to evaluate time to live. In order to do so, you must first disable time to live, and then re-enable it with the new attribute name. It can take up to one hour for changes to time to live to take effect. If you attempt to modify time to live within that time window, your stack operation might be delayed.","Enabled":"Indicates whether TTL is to be enabled (true) or disabled (false) on the table."}},"AWS::DynamoDB::GlobalTable.WriteProvisionedThroughputSettings":{"attributes":{},"description":"Specifies an auto scaling policy for write capacity. This policy will be applied to all replicas. This setting must be specified if `BillingMode` is set to `PROVISIONED` .","properties":{"WriteCapacityAutoScalingSettings":"Specifies auto scaling settings for the replica table or global secondary index."}},"AWS::DynamoDB::Table":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the DynamoDB table, such as `arn:aws:dynamodb:us-east-2:123456789012:table/myDynamoDBTable` .","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"MyResource\\" }`\\n\\nFor the resource with the logical ID `myDynamoDBTable` , `Ref` will return the DynamoDB table name.","StreamArn":"The ARN of the DynamoDB stream, such as `arn:aws:dynamodb:us-east-1:123456789012:table/testddbstack-myDynamoDBTable-012A1SL7SMP5Q/stream/2015-11-30T20:10:00.000` .\\n\\n> You must specify the `StreamSpecification` property to use this attribute."},"description":"The `AWS::DynamoDB::Table` resource creates a DynamoDB table. For more information, see [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) in the *Amazon DynamoDB API Reference* .\\n\\nYou should be aware of the following behaviors when working with DynamoDB tables:\\n\\n- AWS CloudFormation typically creates DynamoDB tables in parallel. However, if your template includes multiple DynamoDB tables with indexes, you must declare dependencies so that the tables are created sequentially. Amazon DynamoDB limits the number of tables with secondary indexes that are in the creating state. If you create multiple tables with indexes at the same time, DynamoDB returns an error and the stack operation fails. For an example, see [DynamoDB Table with a DependsOn Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#aws-resource-dynamodb-table--examples--DynamoDB_Table_with_a_DependsOn_Attribute) .\\n\\n> Our guidance is to use the latest schema documented here for your AWS CloudFormation templates. This schema supports the provisioning of all table settings below. When using this schema in your AWS CloudFormation templates, please ensure that your Identity and Access Management ( IAM ) policies are updated with appropriate permissions to allow for the authorization of these setting changes.","properties":{"AttributeDefinitions":"A list of attributes that describe the key schema for the table and indexes.\\n\\nThis property is required to create a DynamoDB table.\\n\\nUpdate requires: [Some interruptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-some-interrupt) . Replacement if you edit an existing AttributeDefinition.","BillingMode":"Specify how you are charged for read and write throughput and how you manage capacity.\\n\\nValid values include:\\n\\n- `PROVISIONED` - We recommend using `PROVISIONED` for predictable workloads. `PROVISIONED` sets the billing mode to [Provisioned Mode](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.ProvisionedThroughput.Manual) .\\n- `PAY_PER_REQUEST` - We recommend using `PAY_PER_REQUEST` for unpredictable workloads. `PAY_PER_REQUEST` sets the billing mode to [On-Demand Mode](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.OnDemand) .\\n\\nIf not specified, the default is `PROVISIONED` .","ContributorInsightsSpecification":"The settings used to enable or disable CloudWatch Contributor Insights for the specified table.","DeletionProtectionEnabled":"Determines if a table is protected from deletion. When enabled, the table cannot be deleted by any user or process. This setting is disabled by default. For more information, see [Using deletion protection](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.Basics.html#WorkingWithTables.Basics.DeletionProtection) in the *Amazon DynamoDB Developer Guide* .","GlobalSecondaryIndexes":"Global secondary indexes to be created on the table. You can create up to 20 global secondary indexes.\\n\\n> If you update a table to include a new global secondary index, AWS CloudFormation initiates the index creation and then proceeds with the stack update. AWS CloudFormation doesn\'t wait for the index to complete creation because the backfilling phase can take a long time, depending on the size of the table. You can\'t use the index or update the table until the index\'s status is `ACTIVE` . You can track its status by using the DynamoDB [DescribeTable](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/describe-table.html) command.\\n> \\n> If you add or delete an index during an update, we recommend that you don\'t update any other resources. If your stack fails to update and is rolled back while adding a new index, you must manually delete the index.\\n> \\n> Updates are not supported. The following are exceptions:\\n> \\n> - If you update either the contributor insights specification or the provisioned throughput values of global secondary indexes, you can update the table without interruption.\\n> - You can delete or add one global secondary index without interruption. If you do both in the same update (for example, by changing the index\'s logical ID), the update fails.","ImportSourceSpecification":"Specifies the properties of data being imported from the S3 bucket source to the table.\\n\\n> If you specify the `ImportSourceSpecification` property, and also specify either the `StreamSpecification` , the `TableClass` property, or the `DeletionProtectionEnabled` property, the IAM entity creating/updating stack must have `UpdateTable` permission.","KeySchema":"Specifies the attributes that make up the primary key for the table. The attributes in the `KeySchema` property must also be defined in the `AttributeDefinitions` property.","KinesisStreamSpecification":"The Kinesis Data Streams configuration for the specified table.","LocalSecondaryIndexes":"Local secondary indexes to be created on the table. You can create up to 5 local secondary indexes. Each index is scoped to a given hash key value. The size of each hash key can be up to 10 gigabytes.","PointInTimeRecoverySpecification":"The settings used to enable point in time recovery.","ProvisionedThroughput":"Throughput for the specified table, which consists of values for `ReadCapacityUnits` and `WriteCapacityUnits` . For more information about the contents of a provisioned throughput structure, see [Amazon DynamoDB Table ProvisionedThroughput](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ProvisionedThroughput.html) .\\n\\nIf you set `BillingMode` as `PROVISIONED` , you must specify this property. If you set `BillingMode` as `PAY_PER_REQUEST` , you cannot specify this property.","SSESpecification":"Specifies the settings to enable server-side encryption.","StreamSpecification":"The settings for the DynamoDB table stream, which capture changes to items stored in the table.","TableClass":"The table class of the new table. Valid values are `STANDARD` and `STANDARD_INFREQUENT_ACCESS` .","TableName":"A name for the table. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the table name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","TimeToLiveSpecification":"Specifies the Time to Live (TTL) settings for the table.\\n\\n> For detailed information about the limits in DynamoDB, see [Limits in Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html) in the Amazon DynamoDB Developer Guide."}},"AWS::DynamoDB::Table.AttributeDefinition":{"attributes":{},"description":"Represents an attribute for describing the key schema for the table and indexes.","properties":{"AttributeName":"A name for the attribute.","AttributeType":"The data type for the attribute, where:\\n\\n- `S` - the attribute is of type String\\n- `N` - the attribute is of type Number\\n- `B` - the attribute is of type Binary"}},"AWS::DynamoDB::Table.ContributorInsightsSpecification":{"attributes":{},"description":"The settings used to enable or disable CloudWatch Contributor Insights.","properties":{"Enabled":"Indicates whether CloudWatch Contributor Insights are to be enabled (true) or disabled (false)."}},"AWS::DynamoDB::Table.Csv":{"attributes":{},"description":"The options for imported source files in CSV format. The values are Delimiter and HeaderList.","properties":{"Delimiter":"The delimiter used for separating items in the CSV file being imported.","HeaderList":"List of the headers used to specify a common header for all source CSV files being imported. If this field is specified then the first line of each CSV file is treated as data instead of the header. If this field is not specified the the first line of each CSV file is treated as the header."}},"AWS::DynamoDB::Table.GlobalSecondaryIndex":{"attributes":{},"description":"Represents the properties of a global secondary index.","properties":{"ContributorInsightsSpecification":"The settings used to enable or disable CloudWatch Contributor Insights for the specified global secondary index.","IndexName":"The name of the global secondary index. The name must be unique among all other indexes on this table.","KeySchema":"The complete key schema for a global secondary index, which consists of one or more pairs of attribute names and key types:\\n\\n- `HASH` - partition key\\n- `RANGE` - sort key\\n\\n> The partition key of an item is also known as its *hash attribute* . The term \\"hash attribute\\" derives from DynamoDB\'s usage of an internal hash function to evenly distribute data items across partitions, based on their partition key values.\\n> \\n> The sort key of an item is also known as its *range attribute* . The term \\"range attribute\\" derives from the way DynamoDB stores items with the same partition key physically close together, in sorted order by the sort key value.","Projection":"Represents attributes that are copied (projected) from the table into the global secondary index. These are in addition to the primary key attributes and index key attributes, which are automatically projected.","ProvisionedThroughput":"Represents the provisioned throughput settings for the specified global secondary index.\\n\\nFor current minimum and maximum provisioned throughput values, see [Service, Account, and Table Quotas](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html) in the *Amazon DynamoDB Developer Guide* ."}},"AWS::DynamoDB::Table.ImportSourceSpecification":{"attributes":{},"description":"Specifies the properties of data being imported from the S3 bucket source to the table.","properties":{"InputCompressionType":"Type of compression to be used on the input coming from the imported table.","InputFormat":"The format of the source data. Valid values for `ImportFormat` are `CSV` , `DYNAMODB_JSON` or `ION` .","InputFormatOptions":"Additional properties that specify how the input is formatted,","S3BucketSource":"The S3 bucket that provides the source for the import."}},"AWS::DynamoDB::Table.InputFormatOptions":{"attributes":{},"description":"The format options for the data that was imported into the target table. There is one value, CsvOption.","properties":{"Csv":"The options for imported source files in CSV format. The values are Delimiter and HeaderList."}},"AWS::DynamoDB::Table.KeySchema":{"attributes":{},"description":"Represents *a single element* of a key schema. A key schema specifies the attributes that make up the primary key of a table, or the key attributes of an index.\\n\\nA `KeySchemaElement` represents exactly one attribute of the primary key. For example, a simple primary key would be represented by one `KeySchemaElement` (for the partition key). A composite primary key would require one `KeySchemaElement` for the partition key, and another `KeySchemaElement` for the sort key.\\n\\nA `KeySchemaElement` must be a scalar, top-level attribute (not a nested attribute). The data type must be one of String, Number, or Binary. The attribute cannot be nested within a List or a Map.","properties":{"AttributeName":"The name of a key attribute.","KeyType":"The role that this key attribute will assume:\\n\\n- `HASH` - partition key\\n- `RANGE` - sort key\\n\\n> The partition key of an item is also known as its *hash attribute* . The term \\"hash attribute\\" derives from DynamoDB\'s usage of an internal hash function to evenly distribute data items across partitions, based on their partition key values.\\n> \\n> The sort key of an item is also known as its *range attribute* . The term \\"range attribute\\" derives from the way DynamoDB stores items with the same partition key physically close together, in sorted order by the sort key value."}},"AWS::DynamoDB::Table.KinesisStreamSpecification":{"attributes":{},"description":"The Kinesis Data Streams configuration for the specified table.","properties":{"StreamArn":"The ARN for a specific Kinesis data stream.\\n\\nLength Constraints: Minimum length of 37. Maximum length of 1024."}},"AWS::DynamoDB::Table.LocalSecondaryIndex":{"attributes":{},"description":"Represents the properties of a local secondary index. A local secondary index can only be created when its parent table is created.","properties":{"IndexName":"The name of the local secondary index. The name must be unique among all other indexes on this table.","KeySchema":"The complete key schema for the local secondary index, consisting of one or more pairs of attribute names and key types:\\n\\n- `HASH` - partition key\\n- `RANGE` - sort key\\n\\n> The partition key of an item is also known as its *hash attribute* . The term \\"hash attribute\\" derives from DynamoDB\'s usage of an internal hash function to evenly distribute data items across partitions, based on their partition key values.\\n> \\n> The sort key of an item is also known as its *range attribute* . The term \\"range attribute\\" derives from the way DynamoDB stores items with the same partition key physically close together, in sorted order by the sort key value.","Projection":"Represents attributes that are copied (projected) from the table into the local secondary index. These are in addition to the primary key attributes and index key attributes, which are automatically projected."}},"AWS::DynamoDB::Table.PointInTimeRecoverySpecification":{"attributes":{},"description":"The settings used to enable point in time recovery.","properties":{"PointInTimeRecoveryEnabled":"Indicates whether point in time recovery is enabled (true) or disabled (false) on the table."}},"AWS::DynamoDB::Table.Projection":{"attributes":{},"description":"Represents attributes that are copied (projected) from the table into an index. These are in addition to the primary key attributes and index key attributes, which are automatically projected.","properties":{"NonKeyAttributes":"Represents the non-key attribute names which will be projected into the index.\\n\\nFor local secondary indexes, the total count of `NonKeyAttributes` summed across all of the local secondary indexes, must not exceed 100. If you project the same attribute into two different indexes, this counts as two distinct attributes when determining the total.","ProjectionType":"The set of attributes that are projected into the index:\\n\\n- `KEYS_ONLY` - Only the index and primary keys are projected into the index.\\n- `INCLUDE` - In addition to the attributes described in `KEYS_ONLY` , the secondary index will include other non-key attributes that you specify.\\n- `ALL` - All of the table attributes are projected into the index."}},"AWS::DynamoDB::Table.ProvisionedThroughput":{"attributes":{},"description":"Throughput for the specified table, which consists of values for `ReadCapacityUnits` and `WriteCapacityUnits` . For more information about the contents of a provisioned throughput structure, see [Amazon DynamoDB Table ProvisionedThroughput](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ProvisionedThroughput.html) .","properties":{"ReadCapacityUnits":"The maximum number of strongly consistent reads consumed per second before DynamoDB returns a `ThrottlingException` . For more information, see [Specifying Read and Write Requirements](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughput.html) in the *Amazon DynamoDB Developer Guide* .\\n\\nIf read/write capacity mode is `PAY_PER_REQUEST` the value is set to 0.","WriteCapacityUnits":"The maximum number of writes consumed per second before DynamoDB returns a `ThrottlingException` . For more information, see [Specifying Read and Write Requirements](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughput.html) in the *Amazon DynamoDB Developer Guide* .\\n\\nIf read/write capacity mode is `PAY_PER_REQUEST` the value is set to 0."}},"AWS::DynamoDB::Table.S3BucketSource":{"attributes":{},"description":"The S3 bucket that is being imported from.","properties":{"S3Bucket":"The S3 bucket that is being imported from.","S3BucketOwner":"The account number of the S3 bucket that is being imported from. If the bucket is owned by the requester this is optional.","S3KeyPrefix":"The key prefix shared by all S3 Objects that are being imported."}},"AWS::DynamoDB::Table.SSESpecification":{"attributes":{},"description":"Represents the settings used to enable server-side encryption.","properties":{"KMSMasterKeyId":"The AWS KMS key that should be used for the AWS KMS encryption. To specify a key, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. Note that you should only provide this parameter if the key is different from the default DynamoDB key `alias/aws/dynamodb` .","SSEEnabled":"Indicates whether server-side encryption is done using an AWS managed key or an AWS owned key. If enabled (true), server-side encryption type is set to `KMS` and an AWS managed key is used ( AWS KMS charges apply). If disabled (false) or not specified, server-side encryption is set to AWS owned key.","SSEType":"Server-side encryption type. The only supported value is:\\n\\n- `KMS` - Server-side encryption that uses AWS Key Management Service . The key is stored in your account and is managed by AWS KMS ( AWS KMS charges apply)."}},"AWS::DynamoDB::Table.StreamSpecification":{"attributes":{},"description":"Represents the DynamoDB Streams configuration for a table in DynamoDB.","properties":{"StreamViewType":"When an item in the table is modified, `StreamViewType` determines what information is written to the stream for this table. Valid values for `StreamViewType` are:\\n\\n- `KEYS_ONLY` - Only the key attributes of the modified item are written to the stream.\\n- `NEW_IMAGE` - The entire item, as it appears after it was modified, is written to the stream.\\n- `OLD_IMAGE` - The entire item, as it appeared before it was modified, is written to the stream.\\n- `NEW_AND_OLD_IMAGES` - Both the new and the old item images of the item are written to the stream."}},"AWS::DynamoDB::Table.TimeToLiveSpecification":{"attributes":{},"description":"Represents the settings used to enable or disable Time to Live (TTL) for the specified table.","properties":{"AttributeName":"The name of the TTL attribute used to store the expiration time for items in the table.\\n\\n> - The `AttributeName` property is required when enabling the TTL, or when TTL is already enabled.\\n> - To update this property, you must first disable TTL and then enable TTL with the new attribute name.","Enabled":"Indicates whether TTL is to be enabled (true) or disabled (false) on the table."}},"AWS::EC2::CapacityReservation":{"attributes":{"AvailabilityZone":"Returns the Availability Zone in which the capacity is reserved. For example: `us-east-1a` .","AvailableInstanceCount":"Returns the remaining capacity, which indicates the number of instances that can be launched in the Capacity Reservation. For example: `9` .","Id":"The ID of the Capacity Reservation.","InstanceType":"Returns the type of instance for which the capacity is reserved. For example: `m4.large` .","Ref":"`Ref` returns the resource ID, such as `cr-1234ab5cd6789e0f1` .","Tenancy":"Returns the tenancy of the Capacity Reservation. For example: `dedicated` .","TotalInstanceCount":"Returns the total number of instances for which the Capacity Reservation reserves capacity. For example: `15` ."},"description":"Creates a new Capacity Reservation with the specified attributes. For more information, see [Capacity Reservations](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html) in the *Amazon EC2 User Guide* .","properties":{"AvailabilityZone":"The Availability Zone in which to create the Capacity Reservation.","EbsOptimized":"Indicates whether the Capacity Reservation supports EBS-optimized instances. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal I/O performance. This optimization isn\'t available with all instance types. Additional usage charges apply when using an EBS- optimized instance.","EndDate":"The date and time at which the Capacity Reservation expires. When a Capacity Reservation expires, the reserved capacity is released and you can no longer launch instances into it. The Capacity Reservation\'s state changes to `expired` when it reaches its end date and time.\\n\\nYou must provide an `EndDate` value if `EndDateType` is `limited` . Omit `EndDate` if `EndDateType` is `unlimited` .\\n\\nIf the `EndDateType` is `limited` , the Capacity Reservation is cancelled within an hour from the specified time. For example, if you specify 5/31/2019, 13:30:55, the Capacity Reservation is guaranteed to end between 13:30:55 and 14:30:55 on 5/31/2019.","EndDateType":"Indicates the way in which the Capacity Reservation ends. A Capacity Reservation can have one of the following end types:\\n\\n- `unlimited` - The Capacity Reservation remains active until you explicitly cancel it. Do not provide an `EndDate` if the `EndDateType` is `unlimited` .\\n- `limited` - The Capacity Reservation expires automatically at a specified date and time. You must provide an `EndDate` value if the `EndDateType` value is `limited` .","EphemeralStorage":"*Deprecated.*","InstanceCount":"The number of instances for which to reserve capacity.\\n\\nValid range: 1 - 1000","InstanceMatchCriteria":"Indicates the type of instance launches that the Capacity Reservation accepts. The options include:\\n\\n- `open` - The Capacity Reservation automatically matches all instances that have matching attributes (instance type, platform, and Availability Zone). Instances that have matching attributes run in the Capacity Reservation automatically without specifying any additional parameters.\\n- `targeted` - The Capacity Reservation only accepts instances that have matching attributes (instance type, platform, and Availability Zone), and explicitly target the Capacity Reservation. This ensures that only permitted instances can use the reserved capacity.\\n\\nDefault: `open`","InstancePlatform":"The type of operating system for which to reserve capacity.","InstanceType":"The instance type for which to reserve capacity. For more information, see [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) in the *Amazon EC2 User Guide* .","OutPostArn":"The Amazon Resource Name (ARN) of the Outpost on which to create the Capacity Reservation.","PlacementGroupArn":"The Amazon Resource Name (ARN) of the cluster placement group in which to create the Capacity Reservation. For more information, see [Capacity Reservations for cluster placement groups](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cr-cpg.html) in the *Amazon EC2 User Guide* .","TagSpecifications":"The tags to apply to the Capacity Reservation during launch.","Tenancy":"Indicates the tenancy of the Capacity Reservation. A Capacity Reservation can have one of the following tenancy settings:\\n\\n- `default` - The Capacity Reservation is created on hardware that is shared with other AWS accounts .\\n- `dedicated` - The Capacity Reservation is created on single-tenant hardware that is dedicated to a single AWS account ."}},"AWS::EC2::CapacityReservation.TagSpecification":{"attributes":{},"description":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","properties":{"ResourceType":"The type of resource to tag. Specify `capacity-reservation` .","Tags":"The tags to apply to the resource."}},"AWS::EC2::CapacityReservationFleet":{"attributes":{"CapacityReservationFleetId":"The ID of the Capacity Reservation Fleet.","Ref":"`Ref` returns the resource ID, such as `crf-abcdef01234567890` ."},"description":"Creates a new Capacity Reservation Fleet with the specified attributes. For more information, see [Capacity Reservation Fleets](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cr-fleets.html) in the *Amazon EC2 User Guide* .","properties":{"AllocationStrategy":"The strategy used by the Capacity Reservation Fleet to determine which of the specified instance types to use. Currently, only the `prioritized` allocation strategy is supported. For more information, see [Allocation strategy](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#allocation-strategy) in the Amazon EC2 User Guide.\\n\\nValid values: `prioritized`","EndDate":"The date and time at which the Capacity Reservation Fleet expires. When the Capacity Reservation Fleet expires, its state changes to `expired` and all of the Capacity Reservations in the Fleet expire.\\n\\nThe Capacity Reservation Fleet expires within an hour after the specified time. For example, if you specify `5/31/2019` , `13:30:55` , the Capacity Reservation Fleet is guaranteed to expire between `13:30:55` and `14:30:55` on `5/31/2019` .","InstanceMatchCriteria":"Indicates the type of instance launches that the Capacity Reservation Fleet accepts. All Capacity Reservations in the Fleet inherit this instance matching criteria.\\n\\nCurrently, Capacity Reservation Fleets support `open` instance matching criteria only. This means that instances that have matching attributes (instance type, platform, and Availability Zone) run in the Capacity Reservations automatically. Instances do not need to explicitly target a Capacity Reservation Fleet to use its reserved capacity.","InstanceTypeSpecifications":"Information about the instance types for which to reserve the capacity.","NoRemoveEndDate":"Used to add an end date to a Capacity Reservation Fleet that has no end date and time. To add an end date to a Capacity Reservation Fleet, specify `true` for this paramater and specify the end date and time (in UTC time format) for the *EndDate* parameter.","RemoveEndDate":"Used to remove an end date from a Capacity Reservation Fleet that is configured to end automatically at a specific date and time. To remove the end date from a Capacity Reservation Fleet, specify `true` for this paramater and omit the *EndDate* parameter.","TagSpecifications":"The tags to assign to the Capacity Reservation Fleet. The tags are automatically assigned to the Capacity Reservations in the Fleet.","Tenancy":"Indicates the tenancy of the Capacity Reservation Fleet. All Capacity Reservations in the Fleet inherit this tenancy. The Capacity Reservation Fleet can have one of the following tenancy settings:\\n\\n- `default` - The Capacity Reservation Fleet is created on hardware that is shared with other AWS accounts .\\n- `dedicated` - The Capacity Reservations are created on single-tenant hardware that is dedicated to a single AWS account .","TotalTargetCapacity":"The total number of capacity units to be reserved by the Capacity Reservation Fleet. This value, together with the instance type weights that you assign to each instance type used by the Fleet determine the number of instances for which the Fleet reserves capacity. Both values are based on units that make sense for your workload. For more information, see [Total target capacity](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#target-capacity) in the Amazon EC2 User Guide."}},"AWS::EC2::CapacityReservationFleet.InstanceTypeSpecification":{"attributes":{},"description":"Specifies information about an instance type to use in a Capacity Reservation Fleet.\\n\\n`InstanceTypeSpecification` is a property of the [AWS::EC2::CapacityReservationFleet](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html) resource.","properties":{"AvailabilityZone":"The Availability Zone in which the Capacity Reservation Fleet reserves the capacity. A Capacity Reservation Fleet can\'t span Availability Zones. All instance type specifications that you specify for the Fleet must use the same Availability Zone.","AvailabilityZoneId":"The ID of the Availability Zone in which the Capacity Reservation Fleet reserves the capacity. A Capacity Reservation Fleet can\'t span Availability Zones. All instance type specifications that you specify for the Fleet must use the same Availability Zone.","EbsOptimized":"Indicates whether the Capacity Reservation Fleet supports EBS-optimized instances types. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal I/O performance. This optimization isn\'t available with all instance types. Additional usage charges apply when using EBS-optimized instance types.","InstancePlatform":"The type of operating system for which the Capacity Reservation Fleet reserves capacity.","InstanceType":"The instance type for which the Capacity Reservation Fleet reserves capacity.","Priority":"The priority to assign to the instance type. This value is used to determine which of the instance types specified for the Fleet should be prioritized for use. A lower value indicates a high priority. For more information, see [Instance type priority](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#instance-priority) in the Amazon EC2 User Guide.","Weight":"The number of capacity units provided by the specified instance type. This value, together with the total target capacity that you specify for the Fleet determine the number of instances for which the Fleet reserves capacity. Both values are based on units that make sense for your workload. For more information, see [Total target capacity](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#target-capacity) in the Amazon EC2 User Guide.\\n\\nValid Range: Minimum value of `0.001` . Maximum value of `99.999` ."}},"AWS::EC2::CapacityReservationFleet.TagSpecification":{"attributes":{},"description":"The tags to apply to a resource when the resource is being created. When you specify a tag, you must specify the resource type to tag, otherwise the request will fail.\\n\\n> The `Valid Values` lists all the resource types that can be tagged. However, the action you\'re using might not support tagging all of these resource types. If you try to tag a resource type that is unsupported for the action you\'re using, you\'ll get an error.","properties":{"ResourceType":"The type of resource to tag on creation. Specify `capacity-reservation-fleet` .\\n\\nTo tag a resource after it has been created, see [CreateTags](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html) .","Tags":"The tags to apply to the resource."}},"AWS::EC2::CarrierGateway":{"attributes":{"CarrierGatewayId":"The ID of the carrier gateway.","OwnerId":"The AWS account ID of the owner of the carrier gateway.","Ref":"`Ref` returns the carrier gateway ID. For example: `cagw-05a8da9a199afb1c7` .","State":"The state of the carrier gateway."},"description":"Creates a carrier gateway. For more information about carrier gateways, see [Carrier gateways](https://docs.aws.amazon.com/wavelength/latest/developerguide/how-wavelengths-work.html#wavelength-carrier-gateway) in the *AWS Wavelength Developer Guide* .","properties":{"Tags":"The tags assigned to the carrier gateway.","VpcId":"The ID of the VPC associated with the carrier gateway."}},"AWS::EC2::ClientVpnAuthorizationRule":{"attributes":{},"description":"Specifies an ingress authorization rule to add to a Client VPN endpoint. Ingress authorization rules act as firewall rules that grant access to networks. You must configure ingress authorization rules to enable clients to access resources in AWS or on-premises networks.","properties":{"AccessGroupId":"The ID of the group to grant access to, for example, the Active Directory group or identity provider (IdP) group. Required if `AuthorizeAllGroups` is `false` or not specified.","AuthorizeAllGroups":"Indicates whether to grant access to all clients. Specify `true` to grant all clients who successfully establish a VPN connection access to the network. Must be set to `true` if `AccessGroupId` is not specified.","ClientVpnEndpointId":"The ID of the Client VPN endpoint.","Description":"A brief description of the authorization rule.","TargetNetworkCidr":"The IPv4 address range, in CIDR notation, of the network for which access is being authorized."}},"AWS::EC2::ClientVpnEndpoint":{"attributes":{"Ref":"`Ref` returns the Client VPN endpoint ID. For example: `cvpn-endpoint-1234567890abcdef0` ."},"description":"Specifies a Client VPN endpoint. A Client VPN endpoint is the resource you create and configure to enable and manage client VPN sessions. It is the destination endpoint at which all client VPN sessions are terminated.","properties":{"AuthenticationOptions":"Information about the authentication method to be used to authenticate clients.","ClientCidrBlock":"The IPv4 address range, in CIDR notation, from which to assign client IP addresses. The address range cannot overlap with the local CIDR of the VPC in which the associated subnet is located, or the routes that you add manually. The address range cannot be changed after the Client VPN endpoint has been created. Client CIDR range must have a size of at least /22 and must not be greater than /12.","ClientConnectOptions":"The options for managing connection authorization for new client connections.","ClientLoginBannerOptions":"Options for enabling a customizable text banner that will be displayed on AWS provided clients when a VPN session is established.","ConnectionLogOptions":"Information about the client connection logging options.\\n\\nIf you enable client connection logging, data about client connections is sent to a Cloudwatch Logs log stream. The following information is logged:\\n\\n- Client connection requests\\n- Client connection results (successful and unsuccessful)\\n- Reasons for unsuccessful client connection requests\\n- Client connection termination time","Description":"A brief description of the Client VPN endpoint.","DnsServers":"Information about the DNS servers to be used for DNS resolution. A Client VPN endpoint can have up to two DNS servers. If no DNS server is specified, the DNS address configured on the device is used for the DNS server.","SecurityGroupIds":"The IDs of one or more security groups to apply to the target network. You must also specify the ID of the VPC that contains the security groups.","SelfServicePortal":"Specify whether to enable the self-service portal for the Client VPN endpoint.\\n\\nDefault Value: `enabled`","ServerCertificateArn":"The ARN of the server certificate. For more information, see the [AWS Certificate Manager User Guide](https://docs.aws.amazon.com/acm/latest/userguide/) .","SessionTimeoutHours":"The maximum VPN session duration time in hours.\\n\\nValid values: `8 | 10 | 12 | 24`\\n\\nDefault value: `24`","SplitTunnel":"Indicates whether split-tunnel is enabled on the AWS Client VPN endpoint.\\n\\nBy default, split-tunnel on a VPN endpoint is disabled.\\n\\nFor information about split-tunnel VPN endpoints, see [Split-tunnel AWS Client VPN endpoint](https://docs.aws.amazon.com/vpn/latest/clientvpn-admin/split-tunnel-vpn.html) in the *AWS Client VPN Administrator Guide* .","TagSpecifications":"The tags to apply to the Client VPN endpoint during creation.","TransportProtocol":"The transport protocol to be used by the VPN session.\\n\\nDefault value: `udp`","VpcId":"The ID of the VPC to associate with the Client VPN endpoint. If no security group IDs are specified in the request, the default security group for the VPC is applied.","VpnPort":"The port number to assign to the Client VPN endpoint for TCP and UDP traffic.\\n\\nValid Values: `443` | `1194`\\n\\nDefault Value: `443`"}},"AWS::EC2::ClientVpnEndpoint.CertificateAuthenticationRequest":{"attributes":{},"description":"Information about the client certificate to be used for authentication.","properties":{"ClientRootCertificateChainArn":"The ARN of the client certificate. The certificate must be signed by a certificate authority (CA) and it must be provisioned in AWS Certificate Manager (ACM)."}},"AWS::EC2::ClientVpnEndpoint.ClientAuthenticationRequest":{"attributes":{},"description":"Describes the authentication method to be used by a Client VPN endpoint. For more information, see [Authentication](https://docs.aws.amazon.com/vpn/latest/clientvpn-admin/authentication-authrization.html#client-authentication) in the *AWS Client VPN Administrator Guide* .","properties":{"ActiveDirectory":"Information about the Active Directory to be used, if applicable. You must provide this information if *Type* is `directory-service-authentication` .","FederatedAuthentication":"Information about the IAM SAML identity provider, if applicable.","MutualAuthentication":"Information about the authentication certificates to be used, if applicable. You must provide this information if *Type* is `certificate-authentication` .","Type":"The type of client authentication to be used."}},"AWS::EC2::ClientVpnEndpoint.ClientConnectOptions":{"attributes":{},"description":"Indicates whether client connect options are enabled. The default is `false` (not enabled).","properties":{"Enabled":"Indicates whether client connect options are enabled. The default is `false` (not enabled).","LambdaFunctionArn":"The Amazon Resource Name (ARN) of the AWS Lambda function used for connection authorization."}},"AWS::EC2::ClientVpnEndpoint.ClientLoginBannerOptions":{"attributes":{},"description":"Options for enabling a customizable text banner that will be displayed on AWS provided clients when a VPN session is established.","properties":{"BannerText":"Customizable text that will be displayed in a banner on AWS provided clients when a VPN session is established. UTF-8 encoded characters only. Maximum of 1400 characters.","Enabled":"Enable or disable a customizable text banner that will be displayed on AWS provided clients when a VPN session is established.\\n\\nValid values: `true | false`\\n\\nDefault value: `false`"}},"AWS::EC2::ClientVpnEndpoint.ConnectionLogOptions":{"attributes":{},"description":"Describes the client connection logging options for the Client VPN endpoint.","properties":{"CloudwatchLogGroup":"The name of the CloudWatch Logs log group. Required if connection logging is enabled.","CloudwatchLogStream":"The name of the CloudWatch Logs log stream to which the connection data is published.","Enabled":"Indicates whether connection logging is enabled."}},"AWS::EC2::ClientVpnEndpoint.DirectoryServiceAuthenticationRequest":{"attributes":{},"description":"Describes the Active Directory to be used for client authentication.","properties":{"DirectoryId":"The ID of the Active Directory to be used for authentication."}},"AWS::EC2::ClientVpnEndpoint.FederatedAuthenticationRequest":{"attributes":{},"description":"The IAM SAML identity provider used for federated authentication.","properties":{"SAMLProviderArn":"The Amazon Resource Name (ARN) of the IAM SAML identity provider.","SelfServiceSAMLProviderArn":"The Amazon Resource Name (ARN) of the IAM SAML identity provider for the self-service portal."}},"AWS::EC2::ClientVpnEndpoint.TagSpecification":{"attributes":{},"description":"The tags to apply to a resource when the resource is being created. When you specify a tag, you must specify the resource type to tag, otherwise the request will fail.\\n\\n> The `Valid Values` lists all the resource types that can be tagged. However, the action you\'re using might not support tagging all of these resource types. If you try to tag a resource type that is unsupported for the action you\'re using, you\'ll get an error.","properties":{"ResourceType":"The type of resource to tag.","Tags":"The tags to apply to the resource."}},"AWS::EC2::ClientVpnRoute":{"attributes":{},"description":"Specifies a network route to add to a Client VPN endpoint. Each Client VPN endpoint has a route table that describes the available destination network routes. Each route in the route table specifies the path for traffic to specific resources or networks.\\n\\nA target network association must be created before you can specify a route. If you\'re setting up all the components of a Client VPN endpoint at the same time, you must use the [DependsOn Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) to declare a dependency on the `AWS::EC2::ClientVpnTargetNetworkAssociation` resource.","properties":{"ClientVpnEndpointId":"The ID of the Client VPN endpoint to which to add the route.","Description":"A brief description of the route.","DestinationCidrBlock":"The IPv4 address range, in CIDR notation, of the route destination. For example:\\n\\n- To add a route for Internet access, enter `0.0.0.0/0`\\n- To add a route for a peered VPC, enter the peered VPC\'s IPv4 CIDR range\\n- To add a route for an on-premises network, enter the AWS Site-to-Site VPN connection\'s IPv4 CIDR range\\n- To add a route for the local network, enter the client CIDR range","TargetVpcSubnetId":"The ID of the subnet through which you want to route traffic. The specified subnet must be an existing target network of the Client VPN endpoint.\\n\\nAlternatively, if you\'re adding a route for the local network, specify `local` ."}},"AWS::EC2::ClientVpnTargetNetworkAssociation":{"attributes":{"Ref":"`Ref` returns the association ID. For example: `cvpn-assoc-1234567890abcdef0` ."},"description":"Specifies a target network to associate with a Client VPN endpoint. A target network is a subnet in a VPC. You can associate multiple subnets from the same VPC with a Client VPN endpoint. You can associate only one subnet in each Availability Zone. We recommend that you associate at least two subnets to provide Availability Zone redundancy.","properties":{"ClientVpnEndpointId":"The ID of the Client VPN endpoint.","SubnetId":"The ID of the subnet to associate with the Client VPN endpoint."}},"AWS::EC2::CustomerGateway":{"attributes":{"CustomerGatewayId":"The ID of the customer gateway.","Ref":"`Ref` returns the ID of the customer gateway."},"description":"Specifies a customer gateway.","properties":{"BgpAsn":"For devices that support BGP, the customer gateway\'s BGP ASN.\\n\\nDefault: 65000","DeviceName":"The name of customer gateway device.","IpAddress":"IPv4 address for the customer gateway device\'s outside interface. The address must be static.","Tags":"One or more tags for the customer gateway.","Type":"The type of VPN connection that this customer gateway supports ( `ipsec.1` )."}},"AWS::EC2::DHCPOptions":{"attributes":{"DhcpOptionsId":"The ID of the DHCP options set.","Ref":"`Ref` returns the resource name."},"description":"Specifies a set of DHCP options for your VPC.\\n\\nYou must specify at least one of the following properties: `DomainNameServers` , `NetbiosNameServers` , `NtpServers` . If you specify `NetbiosNameServers` , you must specify `NetbiosNodeType` .","properties":{"DomainName":"This value is used to complete unqualified DNS hostnames. If you\'re using AmazonProvidedDNS in `us-east-1` , specify `ec2.internal` . If you\'re using AmazonProvidedDNS in another Region, specify *region* . `compute.internal` (for example, `ap-northeast-1.compute.internal` ). Otherwise, specify a domain name (for example, *MyCompany.com* ).","DomainNameServers":"The IPv4 addresses of up to four domain name servers, or `AmazonProvidedDNS` . The default is `AmazonProvidedDNS` . To have your instance receive a custom DNS hostname as specified in `DomainName` , you must set this property to a custom DNS server.","NetbiosNameServers":"The IPv4 addresses of up to four NetBIOS name servers.","NetbiosNodeType":"The NetBIOS node type (1, 2, 4, or 8). We recommend that you specify 2 (broadcast and multicast are not currently supported).","NtpServers":"The IPv4 addresses of up to four Network Time Protocol (NTP) servers.","Tags":"Any tags assigned to the DHCP options set."}},"AWS::EC2::EC2Fleet":{"attributes":{"FleetId":"The ID of the EC2 Fleet.","Ref":"`Ref` returns the fleet ID, such as `fleet-1fe24079-d272-4023-8e7c-70e10784cb0e` ."},"description":"Specifies the configuration information to launch a fleet--or group--of instances. An EC2 Fleet can launch multiple instance types across multiple Availability Zones, using the On-Demand Instance, Reserved Instance, and Spot Instance purchasing models together. Using EC2 Fleet, you can define separate On-Demand and Spot capacity targets, specify the instance types that work best for your applications, and specify how Amazon EC2 should distribute your fleet capacity within each purchasing model. For more information, see [Launching an EC2 Fleet](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet.html) in the *Amazon EC2 User Guide for Linux Instances* .","properties":{"Context":"Reserved.","ExcessCapacityTerminationPolicy":"Indicates whether running instances should be terminated if the total target capacity of the EC2 Fleet is decreased below the current size of the EC2 Fleet.\\n\\nSupported only for fleets of type `maintain` .","LaunchTemplateConfigs":"The configuration for the EC2 Fleet.","OnDemandOptions":"Describes the configuration of On-Demand Instances in an EC2 Fleet.","ReplaceUnhealthyInstances":"Indicates whether EC2 Fleet should replace unhealthy Spot Instances. Supported only for fleets of type `maintain` . For more information, see [EC2 Fleet health checks](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/manage-ec2-fleet.html#ec2-fleet-health-checks) in the *Amazon EC2 User Guide* .","SpotOptions":"Describes the configuration of Spot Instances in an EC2 Fleet.","TagSpecifications":"The key-value pair for tagging the EC2 Fleet request on creation. For more information, see [Tagging your resources](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#tag-resources) .\\n\\nIf the fleet type is `instant` , specify a resource type of `fleet` to tag the fleet or `instance` to tag the instances at launch.\\n\\nIf the fleet type is `maintain` or `request` , specify a resource type of `fleet` to tag the fleet. You cannot specify a resource type of `instance` . To tag instances at launch, specify the tags in a [launch template](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html#create-launch-template) .","TargetCapacitySpecification":"The number of units to request.","TerminateInstancesWithExpiration":"Indicates whether running instances should be terminated when the EC2 Fleet expires.","Type":"The fleet type. The default value is `maintain` .\\n\\n- `maintain` - The EC2 Fleet places an asynchronous request for your desired capacity, and continues to maintain your desired Spot capacity by replenishing interrupted Spot Instances.\\n- `request` - The EC2 Fleet places an asynchronous one-time request for your desired capacity, but does submit Spot requests in alternative capacity pools if Spot capacity is unavailable, and does not maintain Spot capacity if Spot Instances are interrupted.\\n- `instant` - The EC2 Fleet places a synchronous one-time request for your desired capacity, and returns errors for any instances that could not be launched.\\n\\nFor more information, see [EC2 Fleet request types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-request-type.html) in the *Amazon EC2 User Guide* .","ValidFrom":"The start date and time of the request, in UTC format (for example, *YYYY* - *MM* - *DD* T *HH* : *MM* : *SS* Z). The default is to start fulfilling the request immediately.","ValidUntil":"The end date and time of the request, in UTC format (for example, *YYYY* - *MM* - *DD* T *HH* : *MM* : *SS* Z). At this point, no new EC2 Fleet requests are placed or able to fulfill the request. If no value is specified, the request remains until you cancel it."}},"AWS::EC2::EC2Fleet.AcceleratorCountRequest":{"attributes":{},"description":"The minimum and maximum number of accelerators (GPUs, FPGAs, or AWS Inferentia chips) on an instance. To exclude accelerator-enabled instance types, set `Max` to `0` .","properties":{"Max":"The maximum number of accelerators. To specify no maximum limit, omit this parameter. To exclude accelerator-enabled instance types, set `Max` to `0` .","Min":"The minimum number of accelerators. To specify no minimum limit, omit this parameter."}},"AWS::EC2::EC2Fleet.AcceleratorTotalMemoryMiBRequest":{"attributes":{},"description":"The minimum and maximum amount of total accelerator memory, in MiB.","properties":{"Max":"The maximum amount of accelerator memory, in MiB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of accelerator memory, in MiB. To specify no minimum limit, omit this parameter."}},"AWS::EC2::EC2Fleet.BaselineEbsBandwidthMbpsRequest":{"attributes":{},"description":"The minimum and maximum baseline bandwidth to Amazon EBS, in Mbps. For more information, see [Amazon EBS–optimized instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html) in the *Amazon EC2 User Guide* .","properties":{"Max":"The maximum baseline bandwidth, in Mbps. To specify no maximum limit, omit this parameter.","Min":"The minimum baseline bandwidth, in Mbps. To specify no minimum limit, omit this parameter."}},"AWS::EC2::EC2Fleet.CapacityRebalance":{"attributes":{},"description":"The Spot Instance replacement strategy to use when Amazon EC2 emits a rebalance notification signal that your Spot Instance is at an elevated risk of being interrupted. For more information, see [Capacity rebalancing](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-capacity-rebalance.html) in the *Amazon EC2 User Guide* .","properties":{"ReplacementStrategy":"The replacement strategy to use. Only available for fleets of type `maintain` .\\n\\n`launch` - EC2 Fleet launches a replacement Spot Instance when a rebalance notification is emitted for an existing Spot Instance in the fleet. EC2 Fleet does not terminate the instances that receive a rebalance notification. You can terminate the old instances, or you can leave them running. You are charged for all instances while they are running.\\n\\n`launch-before-terminate` - EC2 Fleet launches a replacement Spot Instance when a rebalance notification is emitted for an existing Spot Instance in the fleet, and then, after a delay that you specify (in `TerminationDelay` ), terminates the instances that received a rebalance notification.","TerminationDelay":"The amount of time (in seconds) that Amazon EC2 waits before terminating the old Spot Instance after launching a new replacement Spot Instance.\\n\\nRequired when `ReplacementStrategy` is set to `launch-before-terminate` .\\n\\nNot valid when `ReplacementStrategy` is set to `launch` .\\n\\nValid values: Minimum value of `120` seconds. Maximum value of `7200` seconds."}},"AWS::EC2::EC2Fleet.CapacityReservationOptionsRequest":{"attributes":{},"description":"Describes the strategy for using unused Capacity Reservations for fulfilling On-Demand capacity.\\n\\n> This strategy can only be used if the EC2 Fleet is of type `instant` . \\n\\nFor more information about Capacity Reservations, see [On-Demand Capacity Reservations](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html) in the *Amazon EC2 User Guide* . For examples of using Capacity Reservations in an EC2 Fleet, see [EC2 Fleet example configurations](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-examples.html) in the *Amazon EC2 User Guide* .","properties":{"UsageStrategy":"Indicates whether to use unused Capacity Reservations for fulfilling On-Demand capacity.\\n\\nIf you specify `use-capacity-reservations-first` , the fleet uses unused Capacity Reservations to fulfill On-Demand capacity up to the target On-Demand capacity. If multiple instance pools have unused Capacity Reservations, the On-Demand allocation strategy ( `lowest-price` or `prioritized` ) is applied. If the number of unused Capacity Reservations is less than the On-Demand target capacity, the remaining On-Demand target capacity is launched according to the On-Demand allocation strategy ( `lowest-price` or `prioritized` ).\\n\\nIf you do not specify a value, the fleet fulfils the On-Demand capacity according to the chosen On-Demand allocation strategy."}},"AWS::EC2::EC2Fleet.FleetLaunchTemplateConfigRequest":{"attributes":{},"description":"Specifies a launch template and overrides for an EC2 Fleet.\\n\\n`FleetLaunchTemplateConfigRequest` is a property of the [AWS::EC2::EC2Fleet](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html) resource.","properties":{"LaunchTemplateSpecification":"The launch template to use. You must specify either the launch template ID or launch template name in the request.","Overrides":"Any parameters that you specify override the same parameters in the launch template.\\n\\nFor fleets of type `request` and `maintain` , a maximum of 300 items is allowed across all launch templates."}},"AWS::EC2::EC2Fleet.FleetLaunchTemplateOverridesRequest":{"attributes":{},"description":"Specifies overrides for a launch template for an EC2 Fleet.\\n\\n`FleetLaunchTemplateOverridesRequest` is a property of the [FleetLaunchTemplateConfigRequest](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateconfigrequest.html) property type.","properties":{"AvailabilityZone":"The Availability Zone in which to launch the instances.","InstanceRequirements":"The attributes for the instance types. When you specify instance attributes, Amazon EC2 will identify instance types with those attributes.\\n\\n> If you specify `InstanceRequirements` , you can\'t specify `InstanceType` .","InstanceType":"The instance type.\\n\\n`mac1.metal` is not supported as a launch template override.\\n\\n> If you specify `InstanceType` , you can\'t specify `InstanceRequirements` .","MaxPrice":"The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not recommend using this parameter because it can lead to increased interruptions. If you do not specify this parameter, you will pay the current Spot price.\\n\\n> If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify this parameter.","Placement":"The location where the instance launched, if applicable.","Priority":"The priority for the launch template override. The highest priority is launched first.\\n\\nIf the On-Demand `AllocationStrategy` is set to `prioritized` , EC2 Fleet uses priority to determine which launch template override to use first in fulfilling On-Demand capacity.\\n\\nIf the Spot `AllocationStrategy` is set to `capacity-optimized-prioritized` , EC2 Fleet uses priority on a best-effort basis to determine which launch template override to use in fulfilling Spot capacity, but optimizes for capacity first.\\n\\nValid values are whole numbers starting at `0` . The lower the number, the higher the priority. If no number is set, the launch template override has the lowest priority. You can set the same priority for different launch template overrides.","SubnetId":"The IDs of the subnets in which to launch the instances. Separate multiple subnet IDs using commas (for example, `subnet-1234abcdeexample1, subnet-0987cdef6example2` ). A request of type `instant` can have only one subnet ID.","WeightedCapacity":"The number of units provided by the specified instance type."}},"AWS::EC2::EC2Fleet.FleetLaunchTemplateSpecificationRequest":{"attributes":{},"description":"Specifies the launch template to be used by the EC2 Fleet for configuring Amazon EC2 instances.\\n\\nYou must specify the following:\\n\\n- The ID or the name of the launch template, but not both.\\n- The version of the launch template.\\n\\n`FleetLaunchTemplateSpecificationRequest` is a property of the [FleetLaunchTemplateConfigRequest](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateconfigrequest.html) property type.\\n\\nFor information about creating a launch template, see [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) and [Create a launch template](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html#create-launch-template) in the *Amazon EC2 User Guide* .\\n\\nFor examples of launch templates, see [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples) .","properties":{"LaunchTemplateId":"The ID of the launch template.\\n\\nYou must specify the `LaunchTemplateId` or the `LaunchTemplateName` , but not both.","LaunchTemplateName":"The name of the launch template.\\n\\nYou must specify the `LaunchTemplateName` or the `LaunchTemplateId` , but not both.","Version":"The launch template version number, `$Latest` , or `$Default` . You must specify a value, otherwise the request fails.\\n\\nIf the value is `$Latest` , Amazon EC2 uses the latest version of the launch template.\\n\\nIf the value is `$Default` , Amazon EC2 uses the default version of the launch template."}},"AWS::EC2::EC2Fleet.InstanceRequirementsRequest":{"attributes":{},"description":"The attributes for the instance types. When you specify instance attributes, Amazon EC2 will identify instance types with these attributes.\\n\\nYou must specify `VCpuCount` and `MemoryMiB` . All other attributes are optional. Any unspecified optional attribute is set to its default.\\n\\nWhen you specify multiple attributes, you get instance types that satisfy all of the specified attributes. If you specify multiple values for an attribute, you get instance types that satisfy any of the specified values.\\n\\nTo limit the list of instance types from which Amazon EC2 can identify matching instance types, you can use one of the following parameters, but not both in the same request:\\n\\n- `AllowedInstanceTypes` - The instance types to include in the list. All other instance types are ignored, even if they match your specified attributes.\\n- `ExcludedInstanceTypes` - The instance types to exclude from the list, even if they match your specified attributes.\\n\\n> If you specify `InstanceRequirements` , you can\'t specify `InstanceType` .\\n> \\n> Attribute-based instance type selection is only supported when using Auto Scaling groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in the [launch instance wizard](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html) , or with the [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API or [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) AWS CloudFormation resource, you can\'t specify `InstanceRequirements` . \\n\\nFor more information, see [Attribute-based instance type selection for EC2 Fleet](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html) , [Attribute-based instance type selection for Spot Fleet](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-attribute-based-instance-type-selection.html) , and [Spot placement score](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-placement-score.html) in the *Amazon EC2 User Guide* .","properties":{"AcceleratorCount":"The minimum and maximum number of accelerators (GPUs, FPGAs, or AWS Inferentia chips) on an instance.\\n\\nTo exclude accelerator-enabled instance types, set `Max` to `0` .\\n\\nDefault: No minimum or maximum limits","AcceleratorManufacturers":"Indicates whether instance types must have accelerators by specific manufacturers.\\n\\n- For instance types with NVIDIA devices, specify `nvidia` .\\n- For instance types with AMD devices, specify `amd` .\\n- For instance types with AWS devices, specify `amazon-web-services` .\\n- For instance types with Xilinx devices, specify `xilinx` .\\n\\nDefault: Any manufacturer","AcceleratorNames":"The accelerators that must be on the instance type.\\n\\n- For instance types with NVIDIA A100 GPUs, specify `a100` .\\n- For instance types with NVIDIA V100 GPUs, specify `v100` .\\n- For instance types with NVIDIA K80 GPUs, specify `k80` .\\n- For instance types with NVIDIA T4 GPUs, specify `t4` .\\n- For instance types with NVIDIA M60 GPUs, specify `m60` .\\n- For instance types with AMD Radeon Pro V520 GPUs, specify `radeon-pro-v520` .\\n- For instance types with Xilinx VU9P FPGAs, specify `vu9p` .\\n- For instance types with AWS Inferentia chips, specify `inferentia` .\\n- For instance types with NVIDIA GRID K520 GPUs, specify `k520` .\\n\\nDefault: Any accelerator","AcceleratorTotalMemoryMiB":"The minimum and maximum amount of total accelerator memory, in MiB.\\n\\nDefault: No minimum or maximum limits","AcceleratorTypes":"The accelerator types that must be on the instance type.\\n\\n- To include instance types with GPU hardware, specify `gpu` .\\n- To include instance types with FPGA hardware, specify `fpga` .\\n- To include instance types with inference hardware, specify `inference` .\\n\\nDefault: Any accelerator type","AllowedInstanceTypes":"The instance types to apply your specified attributes against. All other instance types are ignored, even if they match your specified attributes.\\n\\nYou can use strings with one or more wild cards, represented by an asterisk ( `*` ), to allow an instance type, size, or generation. The following are examples: `m5.8xlarge` , `c5*.*` , `m5a.*` , `r*` , `*3*` .\\n\\nFor example, if you specify `c5*` ,Amazon EC2 will allow the entire C5 instance family, which includes all C5a and C5n instance types. If you specify `m5a.*` , Amazon EC2 will allow all the M5a instance types, but not the M5n instance types.\\n\\n> If you specify `AllowedInstanceTypes` , you can\'t specify `ExcludedInstanceTypes` . \\n\\nDefault: All instance types","BareMetal":"Indicates whether bare metal instance types must be included, excluded, or required.\\n\\n- To include bare metal instance types, specify `included` .\\n- To require only bare metal instance types, specify `required` .\\n- To exclude bare metal instance types, specify `excluded` .\\n\\nDefault: `excluded`","BaselineEbsBandwidthMbps":"The minimum and maximum baseline bandwidth to Amazon EBS, in Mbps. For more information, see [Amazon EBS–optimized instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html) in the *Amazon EC2 User Guide* .\\n\\nDefault: No minimum or maximum limits","BurstablePerformance":"Indicates whether burstable performance T instance types are included, excluded, or required. For more information, see [Burstable performance instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html) .\\n\\n- To include burstable performance instance types, specify `included` .\\n- To require only burstable performance instance types, specify `required` .\\n- To exclude burstable performance instance types, specify `excluded` .\\n\\nDefault: `excluded`","CpuManufacturers":"The CPU manufacturers to include.\\n\\n- For instance types with Intel CPUs, specify `intel` .\\n- For instance types with AMD CPUs, specify `amd` .\\n- For instance types with AWS CPUs, specify `amazon-web-services` .\\n\\n> Don\'t confuse the CPU manufacturer with the CPU architecture. Instances will be launched with a compatible CPU architecture based on the Amazon Machine Image (AMI) that you specify in your launch template. \\n\\nDefault: Any manufacturer","ExcludedInstanceTypes":"The instance types to exclude.\\n\\nYou can use strings with one or more wild cards, represented by an asterisk ( `*` ), to exclude an instance family, type, size, or generation. The following are examples: `m5.8xlarge` , `c5*.*` , `m5a.*` , `r*` , `*3*` .\\n\\nFor example, if you specify `c5*` ,Amazon EC2 will exclude the entire C5 instance family, which includes all C5a and C5n instance types. If you specify `m5a.*` , Amazon EC2 will exclude all the M5a instance types, but not the M5n instance types.\\n\\n> If you specify `ExcludedInstanceTypes` , you can\'t specify `AllowedInstanceTypes` . \\n\\nDefault: No excluded instance types","InstanceGenerations":"Indicates whether current or previous generation instance types are included. The current generation instance types are recommended for use. Current generation instance types are typically the latest two to three generations in each instance family. For more information, see [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) in the *Amazon EC2 User Guide* .\\n\\nFor current generation instance types, specify `current` .\\n\\nFor previous generation instance types, specify `previous` .\\n\\nDefault: Current and previous generation instance types","LocalStorage":"Indicates whether instance types with instance store volumes are included, excluded, or required. For more information, [Amazon EC2 instance store](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html) in the *Amazon EC2 User Guide* .\\n\\n- To include instance types with instance store volumes, specify `included` .\\n- To require only instance types with instance store volumes, specify `required` .\\n- To exclude instance types with instance store volumes, specify `excluded` .\\n\\nDefault: `included`","LocalStorageTypes":"The type of local storage that is required.\\n\\n- For instance types with hard disk drive (HDD) storage, specify `hdd` .\\n- For instance types with solid state drive (SSD) storage, specify `ssd` .\\n\\nDefault: `hdd` and `ssd`","MemoryGiBPerVCpu":"The minimum and maximum amount of memory per vCPU, in GiB.\\n\\nDefault: No minimum or maximum limits","MemoryMiB":"The minimum and maximum amount of memory, in MiB.","NetworkBandwidthGbps":"The minimum and maximum amount of baseline network bandwidth, in gigabits per second (Gbps). For more information, see [Amazon EC2 instance network bandwidth](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html) in the *Amazon EC2 User Guide* .\\n\\nDefault: No minimum or maximum limits","NetworkInterfaceCount":"The minimum and maximum number of network interfaces.\\n\\nDefault: No minimum or maximum limits","OnDemandMaxPricePercentageOverLowestPrice":"The price protection threshold for On-Demand Instances. This is the maximum you’ll pay for an On-Demand Instance, expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance types priced above your threshold.\\n\\nThe parameter accepts an integer, which Amazon EC2 interprets as a percentage.\\n\\nTo turn off price protection, specify a high value, such as `999999` .\\n\\nThis parameter is not supported for [GetSpotPlacementScores](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html) and [GetInstanceTypesFromInstanceRequirements](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html) .\\n\\n> If you set `TargetCapacityUnitType` to `vcpu` or `memory-mib` , the price protection threshold is applied based on the per-vCPU or per-memory price instead of the per-instance price. \\n\\nDefault: `20`","RequireHibernateSupport":"Indicates whether instance types must support hibernation for On-Demand Instances.\\n\\nThis parameter is not supported for [GetSpotPlacementScores](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html) .\\n\\nDefault: `false`","SpotMaxPricePercentageOverLowestPrice":"The price protection threshold for Spot Instance. This is the maximum you’ll pay for an Spot Instance, expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance types priced above your threshold.\\n\\nThe parameter accepts an integer, which Amazon EC2 interprets as a percentage.\\n\\nTo turn off price protection, specify a high value, such as `999999` .\\n\\nThis parameter is not supported for [GetSpotPlacementScores](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html) and [GetInstanceTypesFromInstanceRequirements](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html) .\\n\\n> If you set `TargetCapacityUnitType` to `vcpu` or `memory-mib` , the price protection threshold is applied based on the per-vCPU or per-memory price instead of the per-instance price. \\n\\nDefault: `100`","TotalLocalStorageGB":"The minimum and maximum amount of total local storage, in GB.\\n\\nDefault: No minimum or maximum limits","VCpuCount":"The minimum and maximum number of vCPUs."}},"AWS::EC2::EC2Fleet.MaintenanceStrategies":{"attributes":{},"description":"The strategies for managing your Spot Instances that are at an elevated risk of being interrupted.","properties":{"CapacityRebalance":"The strategy to use when Amazon EC2 emits a signal that your Spot Instance is at an elevated risk of being interrupted."}},"AWS::EC2::EC2Fleet.MemoryGiBPerVCpuRequest":{"attributes":{},"description":"The minimum and maximum amount of memory per vCPU, in GiB.","properties":{"Max":"The maximum amount of memory per vCPU, in GiB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of memory per vCPU, in GiB. To specify no minimum limit, omit this parameter."}},"AWS::EC2::EC2Fleet.MemoryMiBRequest":{"attributes":{},"description":"The minimum and maximum amount of memory, in MiB.","properties":{"Max":"The maximum amount of memory, in MiB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of memory, in MiB. To specify no minimum limit, specify `0` ."}},"AWS::EC2::EC2Fleet.NetworkBandwidthGbpsRequest":{"attributes":{},"description":"The minimum and maximum amount of network bandwidth, in gigabits per second (Gbps).\\n\\n> Setting the minimum bandwidth does not guarantee that your instance will achieve the minimum bandwidth. Amazon EC2 will identify instance types that support the specified minimum bandwidth, but the actual bandwidth of your instance might go below the specified minimum at times. For more information, see [Available instance bandwidth](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html#available-instance-bandwidth) in the *Amazon EC2 User Guide* .","properties":{"Max":"The maximum amount of network bandwidth, in Gbps. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of network bandwidth, in Gbps. To specify no minimum limit, omit this parameter."}},"AWS::EC2::EC2Fleet.NetworkInterfaceCountRequest":{"attributes":{},"description":"The minimum and maximum number of network interfaces.","properties":{"Max":"The maximum number of network interfaces. To specify no maximum limit, omit this parameter.","Min":"The minimum number of network interfaces. To specify no minimum limit, omit this parameter."}},"AWS::EC2::EC2Fleet.OnDemandOptionsRequest":{"attributes":{},"description":"Specifies the allocation strategy of On-Demand Instances in an EC2 Fleet.\\n\\n`OnDemandOptionsRequest` is a property of the [AWS::EC2::EC2Fleet](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html) resource.","properties":{"AllocationStrategy":"The strategy that determines the order of the launch template overrides to use in fulfilling On-Demand capacity.\\n\\n`lowest-price` - EC2 Fleet uses price to determine the order, launching the lowest price first.\\n\\n`prioritized` - EC2 Fleet uses the priority that you assigned to each launch template override, launching the highest priority first.\\n\\nDefault: `lowest-price`","CapacityReservationOptions":"The strategy for using unused Capacity Reservations for fulfilling On-Demand capacity.\\n\\nSupported only for fleets of type `instant` .","MaxTotalPrice":"The maximum amount per hour for On-Demand Instances that you\'re willing to pay.","MinTargetCapacity":"The minimum target capacity for On-Demand Instances in the fleet. If the minimum target capacity is not reached, the fleet launches no instances.\\n\\nSupported only for fleets of type `instant` .\\n\\nAt least one of the following must be specified: `SingleAvailabilityZone` | `SingleInstanceType`","SingleAvailabilityZone":"Indicates that the fleet launches all On-Demand Instances into a single Availability Zone.\\n\\nSupported only for fleets of type `instant` .","SingleInstanceType":"Indicates that the fleet uses a single instance type to launch all On-Demand Instances in the fleet.\\n\\nSupported only for fleets of type `instant` ."}},"AWS::EC2::EC2Fleet.Placement":{"attributes":{},"description":"Describes the placement of an instance.","properties":{"Affinity":"The affinity setting for the instance on the Dedicated Host.\\n\\nThis parameter is not supported for [CreateFleet](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet) or [ImportInstance](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportInstance.html) .","AvailabilityZone":"The Availability Zone of the instance.\\n\\nIf not specified, an Availability Zone will be automatically chosen for you based on the load balancing criteria for the Region.\\n\\nThis parameter is not supported for [CreateFleet](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet) .","GroupName":"The name of the placement group that the instance is in. If you specify `GroupName` , you can\'t specify `GroupId` .","HostId":"The ID of the Dedicated Host on which the instance resides.\\n\\nThis parameter is not supported for [CreateFleet](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet) or [ImportInstance](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportInstance.html) .","HostResourceGroupArn":"The ARN of the host resource group in which to launch the instances.\\n\\nIf you specify this parameter, either omit the *Tenancy* parameter or set it to `host` .\\n\\nThis parameter is not supported for [CreateFleet](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet) .","PartitionNumber":"The number of the partition that the instance is in. Valid only if the placement group strategy is set to `partition` .\\n\\nThis parameter is not supported for [CreateFleet](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet) .","SpreadDomain":"Reserved for future use.","Tenancy":"The tenancy of the instance. An instance with a tenancy of `dedicated` runs on single-tenant hardware.\\n\\nThis parameter is not supported for [CreateFleet](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet) . The `host` tenancy is not supported for [ImportInstance](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportInstance.html) or for T3 instances that are configured for the `unlimited` CPU credit option."}},"AWS::EC2::EC2Fleet.SpotOptionsRequest":{"attributes":{},"description":"Specifies the configuration of Spot Instances for an EC2 Fleet.\\n\\n`SpotOptionsRequest` is a property of the [AWS::EC2::EC2Fleet](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html) resource.","properties":{"AllocationStrategy":"Indicates how to allocate the target Spot Instance capacity across the Spot Instance pools specified by the EC2 Fleet.\\n\\nIf the allocation strategy is `lowestPrice` , EC2 Fleet launches instances from the Spot Instance pools with the lowest price. This is the default allocation strategy.\\n\\nIf the allocation strategy is `diversified` , EC2 Fleet launches instances from all the Spot Instance pools that you specify.\\n\\nIf the allocation strategy is `capacityOptimized` , EC2 Fleet launches instances from Spot Instance pools that are optimally chosen based on the available Spot Instance capacity.\\n\\n*Allowed Values* : `lowestPrice` | `diversified` | `capacityOptimized` | `capacityOptimizedPrioritized`","InstanceInterruptionBehavior":"The behavior when a Spot Instance is interrupted.\\n\\nDefault: `terminate`","InstancePoolsToUseCount":"The number of Spot pools across which to allocate your target Spot capacity. Supported only when Spot `AllocationStrategy` is set to `lowest-price` . EC2 Fleet selects the cheapest Spot pools and evenly allocates your target Spot capacity across the number of Spot pools that you specify.\\n\\nNote that EC2 Fleet attempts to draw Spot Instances from the number of pools that you specify on a best effort basis. If a pool runs out of Spot capacity before fulfilling your target capacity, EC2 Fleet will continue to fulfill your request by drawing from the next cheapest pool. To ensure that your target capacity is met, you might receive Spot Instances from more than the number of pools that you specified. Similarly, if most of the pools have no Spot capacity, you might receive your full target capacity from fewer than the number of pools that you specified.","MaintenanceStrategies":"The strategies for managing your Spot Instances that are at an elevated risk of being interrupted.","MaxTotalPrice":"The maximum amount per hour for Spot Instances that you\'re willing to pay. We do not recommend using this parameter because it can lead to increased interruptions. If you do not specify this parameter, you will pay the current Spot price.\\n\\n> If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.","MinTargetCapacity":"The minimum target capacity for Spot Instances in the fleet. If the minimum target capacity is not reached, the fleet launches no instances.\\n\\nSupported only for fleets of type `instant` .\\n\\nAt least one of the following must be specified: `SingleAvailabilityZone` | `SingleInstanceType`","SingleAvailabilityZone":"Indicates that the fleet launches all Spot Instances into a single Availability Zone.\\n\\nSupported only for fleets of type `instant` .","SingleInstanceType":"Indicates that the fleet uses a single instance type to launch all Spot Instances in the fleet.\\n\\nSupported only for fleets of type `instant` ."}},"AWS::EC2::EC2Fleet.TagSpecification":{"attributes":{},"description":"Specifies the tags to apply to a resource when the resource is being created for an EC2 Fleet.\\n\\n`TagSpecification` is a property of the [AWS::EC2::EC2Fleet](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html) resource.","properties":{"ResourceType":"The type of resource to tag. `ResourceType` must be `fleet` .","Tags":"The tags to apply to the resource."}},"AWS::EC2::EC2Fleet.TargetCapacitySpecificationRequest":{"attributes":{},"description":"Specifies the number of units to request for an EC2 Fleet. You can choose to set the target capacity in terms of instances or a performance characteristic that is important to your application workload, such as vCPUs, memory, or I/O. If the request type is `maintain` , you can specify a target capacity of `0` and add capacity later.\\n\\n`TargetCapacitySpecificationRequest` is a property of the [AWS::EC2::EC2Fleet](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html) resource.","properties":{"DefaultTargetCapacityType":"The default `TotalTargetCapacity` , which is either `Spot` or `On-Demand` .","OnDemandTargetCapacity":"The number of On-Demand units to request.","SpotTargetCapacity":"The number of Spot units to request.","TargetCapacityUnitType":"The unit for the target capacity. `TargetCapacityUnitType` can only be specified when `InstanceRequirements` is specified.\\n\\nDefault: `units` (translates to number of instances)","TotalTargetCapacity":"The number of units to request, filled using `DefaultTargetCapacityType` ."}},"AWS::EC2::EC2Fleet.TotalLocalStorageGBRequest":{"attributes":{},"description":"The minimum and maximum amount of total local storage, in GB.","properties":{"Max":"The maximum amount of total local storage, in GB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of total local storage, in GB. To specify no minimum limit, omit this parameter."}},"AWS::EC2::EC2Fleet.VCpuCountRangeRequest":{"attributes":{},"description":"The minimum and maximum number of vCPUs.","properties":{"Max":"The maximum number of vCPUs. To specify no maximum limit, omit this parameter.","Min":"The minimum number of vCPUs. To specify no minimum limit, specify `0` ."}},"AWS::EC2::EIP":{"attributes":{"AllocationId":"The ID that AWS assigns to represent the allocation of the address for use with Amazon VPC. This is returned only for VPC elastic IP addresses. For example, `eipalloc-5723d13e` .","PublicIp":"The Elastic IP address.","Ref":"`Ref` returns the Elastic IP address."},"description":"Specifies an Elastic IP (EIP) address and can, optionally, associate it with an Amazon EC2 instance.\\n\\nYou can allocate an Elastic IP address from an address pool owned by AWS or from an address pool created from a public IPv4 address range that you have brought to AWS for use with your AWS resources using bring your own IP addresses (BYOIP). For more information, see [Bring Your Own IP Addresses (BYOIP)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html) in the *Amazon EC2 User Guide* .\\n\\nFor more information, see [Elastic IP Addresses](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html) in the *Amazon EC2 User Guide* .","properties":{"Domain":"The network ( `vpc` ).\\n\\nIf you define an Elastic IP address and associate it with a VPC that is defined in the same template, you must declare a dependency on the VPC-gateway attachment by using the [DependsOn Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) on this resource.","InstanceId":"The ID of the instance.\\n\\n> Updates to the `InstanceId` property may require *some interruptions* . Updates on an EIP reassociates the address on its associated resource.","NetworkBorderGroup":"A unique set of Availability Zones, Local Zones, or Wavelength Zones from which AWS advertises IP addresses. Use this parameter to limit the IP address to this location. IP addresses cannot move between network border groups.\\n\\nUse [DescribeAvailabilityZones](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAvailabilityZones.html) to view the network border groups.\\n\\nYou cannot use a network border group with EC2 Classic. If you attempt this operation on EC2 Classic, you receive an `InvalidParameterCombination` error.","PublicIpv4Pool":"The ID of an address pool that you own. Use this parameter to let Amazon EC2 select an address from the address pool.\\n\\n> Updates to the `PublicIpv4Pool` property may require *some interruptions* . Updates on an EIP reassociates the address on its associated resource.","Tags":"Any tags assigned to the Elastic IP address.\\n\\n> Updates to the `Tags` property may require *some interruptions* . Updates on an EIP reassociates the address on its associated resource.","TransferAddress":"The Elastic IP address you are accepting for transfer. You can only accept one transferred address. For more information on Elastic IP address transfers, see [Transfer Elastic IP addresses](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-eips.html#transfer-EIPs-intro) in the *Amazon Virtual Private Cloud User Guide* ."}},"AWS::EC2::EIPAssociation":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"Associates an Elastic IP address with an instance or a network interface. Before you can use an Elastic IP address, you must allocate it to your account. For more information about working with Elastic IP addresses, see [Elastic IP address concepts and rules](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-eips.html#vpc-eip-overview) .\\n\\nYou must specify `AllocationId` and either `InstanceId` , `NetworkInterfaceId` , or `PrivateIpAddress` .","properties":{"AllocationId":"The allocation ID. This is required.","EIP":"Deprecated.","InstanceId":"The ID of the instance. The instance must have exactly one attached network interface. You can specify either the instance ID or the network interface ID, but not both.","NetworkInterfaceId":"The ID of the network interface. If the instance has more than one network interface, you must specify a network interface ID.\\n\\nYou can specify either the instance ID or the network interface ID, but not both.","PrivateIpAddress":"The primary or secondary private IP address to associate with the Elastic IP address. If no private IP address is specified, the Elastic IP address is associated with the primary private IP address."}},"AWS::EC2::EgressOnlyInternetGateway":{"attributes":{"Id":"The ID of the egress-only internet gateway.","Ref":"`Ref` returns the ID of the egress-only internet gateway (the physical resource ID)."},"description":"[IPv6 only] Specifies an egress-only internet gateway for your VPC. An egress-only internet gateway is used to enable outbound communication over IPv6 from instances in your VPC to the internet, and prevents hosts outside of your VPC from initiating an IPv6 connection with your instance.","properties":{"VpcId":"The ID of the VPC for which to create the egress-only internet gateway."}},"AWS::EC2::EnclaveCertificateIamRoleAssociation":{"attributes":{"CertificateS3BucketName":"The name of the Amazon S3 bucket to which the certificate was uploaded.","CertificateS3ObjectKey":"The Amazon S3 object key where the certificate, certificate chain, and encrypted private key bundle are stored. The object key is formatted as follows: `role_arn` / `certificate_arn` .","EncryptionKmsKeyId":"The ID of the AWS KMS key used to encrypt the private key of the certificate.","Ref":"`Ref` returns the IAM role and ACM certificate association."},"description":"Associates an AWS Identity and Access Management (IAM) role with an AWS Certificate Manager (ACM) certificate. This enables the certificate to be used by the ACM for Nitro Enclaves application inside an enclave. For more information, see [AWS Certificate Manager for Nitro Enclaves](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-refapp.html) in the *AWS Nitro Enclaves User Guide* .\\n\\nWhen the IAM role is associated with the ACM certificate, the certificate, certificate chain, and encrypted private key are placed in an Amazon S3 location that only the associated IAM role can access. The private key of the certificate is encrypted with an AWS managed key that has an attached attestation-based key policy.\\n\\nTo enable the IAM role to access the Amazon S3 object, you must grant it permission to call `s3:GetObject` on the Amazon S3 bucket returned by the command. To enable the IAM role to access the KMS key, you must grant it permission to call `kms:Decrypt` on the KMS key returned by the command. For more information, see [Grant the role permission to access the certificate and encryption key](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-refapp.html#add-policy) in the *AWS Nitro Enclaves User Guide* .","properties":{"CertificateArn":"The ARN of the ACM certificate with which to associate the IAM role.","RoleArn":"The ARN of the IAM role to associate with the ACM certificate. You can associate up to 16 IAM roles with an ACM certificate."}},"AWS::EC2::FlowLog":{"attributes":{"Id":"The ID of the flow log. For example, `fl-123456abc123abc1` .","Ref":"`Ref` returns the flow log ID, such as `fl-123456abc123abc1` ."},"description":"Specifies a VPC flow log that captures IP traffic for a specified network interface, subnet, or VPC. To view the log data, use Amazon CloudWatch Logs (CloudWatch Logs) to help troubleshoot connection issues. For example, you can use a flow log to investigate why certain traffic isn\'t reaching an instance, which can help you diagnose overly restrictive security group rules. For more information, see [VPC Flow Logs](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html) in the *Amazon VPC User Guide* .","properties":{"DeliverLogsPermissionArn":"The ARN of the IAM role that allows Amazon EC2 to publish flow logs to a CloudWatch Logs log group in your account.\\n\\nThis parameter is required if the destination type is `cloud-watch-logs` and unsupported otherwise.","DestinationOptions":"The destination options. The following options are supported:\\n\\n- `FileFormat` - The format for the flow log ( `plain-text` | `parquet` ). The default is `plain-text` .\\n- `HiveCompatiblePartitions` - Indicates whether to use Hive-compatible prefixes for flow logs stored in Amazon S3 ( `true` | `false` ). The default is `false` .\\n- `PerHourPartition` - Indicates whether to partition the flow log per hour ( `true` | `false` ). The default is `false` .","LogDestination":"The destination for the flow log data. The meaning of this parameter depends on the destination type.\\n\\n- If the destination type is `cloud-watch-logs` , specify the ARN of a CloudWatch Logs log group. For example:\\n\\narn:aws:logs: *region* : *account_id* :log-group: *my_group*\\n\\nAlternatively, use the `LogGroupName` parameter.\\n- If the destination type is `s3` , specify the ARN of an S3 bucket. For example:\\n\\narn:aws:s3::: *my_bucket* / *my_subfolder* /\\n\\nThe subfolder is optional. Note that you can\'t use `AWSLogs` as a subfolder name.\\n- If the destination type is `kinesis-data-firehose` , specify the ARN of a Kinesis Data Firehose delivery stream. For example:\\n\\narn:aws:firehose: *region* : *account_id* :deliverystream: *my_stream*","LogDestinationType":"The type of destination for the flow log data.\\n\\nDefault: `cloud-watch-logs`","LogFormat":"The fields to include in the flow log record, in the order in which they should appear. If you omit this parameter, the flow log is created using the default format. If you specify this parameter, you must include at least one field. For more information about the available fields, see [Flow log records](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-log-records) in the *Amazon VPC User Guide* or [Transit Gateway Flow Log records](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-flow-logs.html#flow-log-records) in the *AWS Transit Gateway Guide* .\\n\\nSpecify the fields using the `${field-id}` format, separated by spaces.","LogGroupName":"The name of a new or existing CloudWatch Logs log group where Amazon EC2 publishes your flow logs.\\n\\nThis parameter is valid only if the destination type is `cloud-watch-logs` .","MaxAggregationInterval":"The maximum interval of time during which a flow of packets is captured and aggregated into a flow log record. The possible values are 60 seconds (1 minute) or 600 seconds (10 minutes). This parameter must be 60 seconds for transit gateway resource types.\\n\\nWhen a network interface is attached to a [Nitro-based instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances) , the aggregation interval is always 60 seconds or less, regardless of the value that you specify.\\n\\nDefault: 600","ResourceId":"The ID of the resource to monitor. For example, if the resource type is `VPC` , specify the ID of the VPC.","ResourceType":"The type of resource to monitor.","Tags":"The tags to apply to the flow logs.","TrafficType":"The type of traffic to monitor (accepted traffic, rejected traffic, or all traffic). This parameter is not supported for transit gateway resource types. It is required for the other resource types."}},"AWS::EC2::FlowLog.DestinationOptions":{"attributes":{},"description":"Describes the destination options for a flow log.","properties":{"FileFormat":"The format for the flow log. The default is `plain-text` .","HiveCompatiblePartitions":"Indicates whether to use Hive-compatible prefixes for flow logs stored in Amazon S3. The default is `false` .","PerHourPartition":"Indicates whether to partition the flow log per hour. This reduces the cost and response time for queries. The default is `false` ."}},"AWS::EC2::GatewayRouteTableAssociation":{"attributes":{"AssociationId":"The ID of the route table association.","Ref":"`Ref` returns the ID of the gateway."},"description":"Associates a virtual private gateway or internet gateway with a route table. The gateway and route table must be in the same VPC. This association causes the incoming traffic to the gateway to be routed according to the routes in the route table.","properties":{"GatewayId":"The ID of the gateway.","RouteTableId":"The ID of the route table."}},"AWS::EC2::Host":{"attributes":{"HostId":"The ID of the host.","Ref":"`Ref` returns the host ID, such as `h-0ab123c45d67ef89` ."},"description":"Allocates a fully dedicated physical server for launching EC2 instances. Because the host is fully dedicated for your use, it can help you address compliance requirements and reduce costs by allowing you to use your existing server-bound software licenses. For more information, see [Dedicated Hosts](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-overview.html) in the *Amazon EC2 User Guide for Linux Instances* .","properties":{"AutoPlacement":"Indicates whether the host accepts any untargeted instance launches that match its instance type configuration, or if it only accepts Host tenancy instance launches that specify its unique host ID. For more information, see [Understanding auto-placement and affinity](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/how-dedicated-hosts-work.html#dedicated-hosts-understanding) in the *Amazon EC2 User Guide* .\\n\\nDefault: `on`","AvailabilityZone":"The Availability Zone in which to allocate the Dedicated Host.","HostMaintenance":"Indicates whether host maintenance is enabled or disabled for the Dedicated Host.","HostRecovery":"Indicates whether to enable or disable host recovery for the Dedicated Host. Host recovery is disabled by default. For more information, see [Host recovery](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-recovery.html) in the *Amazon EC2 User Guide* .\\n\\nDefault: `off`","InstanceFamily":"The instance family supported by the Dedicated Host. For example, `m5` .","InstanceType":"Specifies the instance type to be supported by the Dedicated Hosts. If you specify an instance type, the Dedicated Hosts support instances of the specified instance type only.","OutpostArn":"The Amazon Resource Name (ARN) of the AWS Outpost on which the Dedicated Host is allocated."}},"AWS::EC2::IPAM":{"attributes":{"Arn":"The ARN of the IPAM.","IpamId":"The ID of the IPAM.","PrivateDefaultScopeId":"The ID of the default private scope.","PublicDefaultScopeId":"The ID of the default public scope.","Ref":"`Ref` returns the IPAM ID.","ResourceDiscoveryAssociationCount":"The number of resource discovery associations.","ScopeCount":"The number of scopes."},"description":"IPAM is a VPC feature that you can use to automate your IP address management workflows including assigning, tracking, troubleshooting, and auditing IP addresses across AWS Regions and accounts throughout your AWS Organization. For more information, see [What is IPAM?](https://docs.aws.amazon.com//vpc/latest/ipam/what-is-it-ipam.html) in the *Amazon VPC IPAM User Guide* .\\n\\nThere are AWS Identity and Access Management (IAM) permissions required to fully manage an IPAM in CloudFormation. For more information, see [Example policy](https://docs.aws.amazon.com//vpc/latest/ipam/iam-ipam-policy-examples.html) in the *Amazon VPC IPAM User Guide* .","properties":{"DefaultResourceDiscoveryAssociationId":"The IPAM\'s default resource discovery association ID.","DefaultResourceDiscoveryId":"The IPAM\'s default resource discovery ID.","Description":"The description for the IPAM.","OperatingRegions":"The operating Regions for an IPAM. Operating Regions are AWS Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the AWS Regions you select as operating Regions.\\n\\nFor more information about operating Regions, see [Create an IPAM](https://docs.aws.amazon.com//vpc/latest/ipam/create-ipam.html) in the *Amazon VPC IPAM User Guide* .","Tags":"The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value. For example, to find all resources that have a tag with the key `Owner` and the value `TeamA` , specify `tag:Owner` for the filter name and `TeamA` for the filter value."}},"AWS::EC2::IPAM.IpamOperatingRegion":{"attributes":{},"description":"The operating Regions for an IPAM. Operating Regions are AWS Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the AWS Regions you select as operating Regions.\\n\\nFor more information about operating Regions, see [Create an IPAM](https://docs.aws.amazon.com//vpc/latest/ipam/create-ipam.html) in the *Amazon VPC IPAM User Guide* .","properties":{"RegionName":"The name of the operating Region."}},"AWS::EC2::IPAMAllocation":{"attributes":{"IpamPoolAllocationId":"The ID of an allocation.","Ref":"`Ref` returns the pool ID, allocation ID, and CIDR."},"description":"In IPAM, an allocation is a CIDR assignment from an IPAM pool to another IPAM pool or to a resource.","properties":{"Cidr":"The CIDR you would like to allocate from the IPAM pool. Note the following:\\n\\n- If there is no DefaultNetmaskLength allocation rule set on the pool, you must specify either the NetmaskLength or the CIDR.\\n- If the DefaultNetmaskLength allocation rule is set on the pool, you can specify either the NetmaskLength or the CIDR and the DefaultNetmaskLength allocation rule will be ignored.\\n\\nPossible values: Any available IPv4 or IPv6 CIDR.","Description":"A description for the allocation.","IpamPoolId":"The ID of the IPAM pool from which you would like to allocate a CIDR.","NetmaskLength":"The netmask length of the CIDR you would like to allocate from the IPAM pool. Note the following:\\n\\n- If there is no DefaultNetmaskLength allocation rule set on the pool, you must specify either the NetmaskLength or the CIDR.\\n- If the DefaultNetmaskLength allocation rule is set on the pool, you can specify either the NetmaskLength or the CIDR and the DefaultNetmaskLength allocation rule will be ignored.\\n\\nPossible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128."}},"AWS::EC2::IPAMPool":{"attributes":{"Arn":"The ARN of the IPAM pool.","IpamArn":"The ARN of the IPAM.","IpamPoolId":"The ID of the IPAM pool.","IpamScopeArn":"The ARN of the scope of the IPAM pool.","IpamScopeType":"The scope of the IPAM.","PoolDepth":"The depth of pools in your IPAM pool. The pool depth quota is 10.","Ref":"`Ref` returns the IPAM pool ID.","State":"The state of the IPAM pool.","StateMessage":"A message related to the failed creation of an IPAM pool."},"description":"In IPAM, a pool is a collection of contiguous IP addresses CIDRs. Pools enable you to organize your IP addresses according to your routing and security needs. For example, if you have separate routing and security needs for development and production applications, you can create a pool for each.","properties":{"AddressFamily":"The address family of the pool.","AllocationDefaultNetmaskLength":"The default netmask length for allocations added to this pool. If, for example, the CIDR assigned to this pool is 10.0.0.0/8 and you enter 16 here, new allocations will default to 10.0.0.0/16.","AllocationMaxNetmaskLength":"The maximum netmask length possible for CIDR allocations in this IPAM pool to be compliant. The maximum netmask length must be greater than the minimum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.","AllocationMinNetmaskLength":"The minimum netmask length required for CIDR allocations in this IPAM pool to be compliant. The minimum netmask length must be less than the maximum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.","AllocationResourceTags":"Tags that are required for resources that use CIDRs from this IPAM pool. Resources that do not have these tags will not be allowed to allocate space from the pool. If the resources have their tags changed after they have allocated space or if the allocation tagging requirements are changed on the pool, the resource may be marked as noncompliant.","AutoImport":"If selected, IPAM will continuously look for resources within the CIDR range of this pool and automatically import them as allocations into your IPAM. The CIDRs that will be allocated for these resources must not already be allocated to other resources in order for the import to succeed. IPAM will import a CIDR regardless of its compliance with the pool\'s allocation rules, so a resource might be imported and subsequently marked as noncompliant. If IPAM discovers multiple CIDRs that overlap, IPAM will import the largest CIDR only. If IPAM discovers multiple CIDRs with matching CIDRs, IPAM will randomly import one of them only.\\n\\nA locale must be set on the pool for this feature to work.","AwsService":"Limits which service in AWS that the pool can be used in. \\"ec2\\", for example, allows users to use space for Elastic IP addresses and VPCs.","Description":"The description of the IPAM pool.","IpamScopeId":"The ID of the scope in which you would like to create the IPAM pool.","Locale":"The locale of the IPAM pool. In IPAM, the locale is the AWS Region where you want to make an IPAM pool available for allocations. Only resources in the same Region as the locale of the pool can get IP address allocations from the pool. You can only allocate a CIDR for a VPC, for example, from an IPAM pool that shares a locale with the VPC’s Region. Note that once you choose a Locale for a pool, you cannot modify it. If you choose an AWS Region for locale that has not been configured as an operating Region for the IPAM, you\'ll get an error.","ProvisionedCidrs":"Information about the CIDRs provisioned to an IPAM pool.","PublicIpSource":"The IP address source for pools in the public scope. Only used for provisioning IP address CIDRs to pools in the public scope. Default is `BYOIP` . For more information, see [Create IPv6 pools](https://docs.aws.amazon.com//vpc/latest/ipam/intro-create-ipv6-pools.html) in the *Amazon VPC IPAM User Guide* . By default, you can add only one Amazon-provided IPv6 CIDR block to a top-level IPv6 pool. For information on increasing the default limit, see [Quotas for your IPAM](https://docs.aws.amazon.com//vpc/latest/ipam/quotas-ipam.html) in the *Amazon VPC IPAM User Guide* .","PubliclyAdvertisable":"Determines if a pool is publicly advertisable. This option is not available for pools with AddressFamily set to `ipv4` .","SourceIpamPoolId":"The ID of the source IPAM pool. You can use this option to create an IPAM pool within an existing source pool.","Tags":"The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value. For example, to find all resources that have a tag with the key `Owner` and the value `TeamA` , specify `tag:Owner` for the filter name and `TeamA` for the filter value."}},"AWS::EC2::IPAMPool.ProvisionedCidr":{"attributes":{},"description":"The CIDR provisioned to the IPAM pool. A CIDR is a representation of an IP address and its associated network mask (or netmask) and refers to a range of IP addresses. An IPv4 CIDR example is `10.24.34.0/23` . An IPv6 CIDR example is `2001:DB8::/32` .\\n\\n> This resource type does not allow you to provision a CIDR using the netmask length. To provision a CIDR using netmask length, use [AWS::EC2::IPAMPoolCidr](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampoolcidr.html) .","properties":{"Cidr":"The CIDR provisioned to the IPAM pool. A CIDR is a representation of an IP address and its associated network mask (or netmask) and refers to a range of IP addresses. An IPv4 CIDR example is `10.24.34.0/23` . An IPv6 CIDR example is `2001:DB8::/32` ."}},"AWS::EC2::IPAMPoolCidr":{"attributes":{"IpamPoolCidrId":"The IPAM pool CIDR ID.","Ref":"`Ref` returns the IPAM pool ID and IPAM pool CIDR ID in the following format: `ipam-pool-01123456|ipam-pool-cidr-0123456` .","State":"The state of the CIDR."},"description":"A CIDR provisioned to an IPAM pool.","properties":{"Cidr":"The CIDR provisioned to the IPAM pool. A CIDR is a representation of an IP address and its associated network mask (or netmask) and refers to a range of IP addresses. An IPv4 CIDR example is `10.24.34.0/23` . An IPv6 CIDR example is `2001:DB8::/32` .","IpamPoolId":"The ID of the IPAM pool.","NetmaskLength":"The netmask length of the CIDR you\'d like to provision to a pool. Can be used for provisioning Amazon-provided IPv6 CIDRs to top-level pools and for provisioning CIDRs to pools with source pools. Cannot be used to provision BYOIP CIDRs to top-level pools. \\"NetmaskLength\\" or \\"Cidr\\" is required."}},"AWS::EC2::IPAMResourceDiscovery":{"attributes":{"IpamResourceDiscoveryArn":"The resource discovery ARN.","IpamResourceDiscoveryId":"The resource discovery ID.","IpamResourceDiscoveryRegion":"The resource discovery Region.","IsDefault":"Defines if the resource discovery is the default. The default resource discovery is the resource discovery automatically created when you create an IPAM.","OwnerId":"The owner ID.","Ref":"`Ref` returns the resource discovery ID. For example: `ipam-res-disco-111122223333` .","State":"The resource discovery\'s state.\\n\\n- `create-in-progress` - Resource discovery is being created.\\n- `create-complete` - Resource discovery creation is complete.\\n- `create-failed` - Resource discovery creation has failed.\\n- `modify-in-progress` - Resource discovery is being modified.\\n- `modify-complete` - Resource discovery modification is complete.\\n- `modify-failed` - Resource discovery modification has failed.\\n- `delete-in-progress` - Resource discovery is being deleted.\\n- `delete-complete` - Resource discovery deletion is complete.\\n- `delete-failed` - Resource discovery deletion has failed.\\n- `isolate-in-progress` - AWS account that created the resource discovery has been removed and the resource discovery is being isolated.\\n- `isolate-complete` - Resource discovery isolation is complete.\\n- `restore-in-progress` - AWS account that created the resource discovery and was isolated has been restored."},"description":"A resource discovery is an IPAM component that enables IPAM to manage and monitor resources that belong to the owning account.","properties":{"Description":"The resource discovery description.","OperatingRegions":"The operating Regions for the resource discovery. Operating Regions are AWS Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the AWS Regions you select as operating Regions.","Tags":"A tag is a label that you assign to an AWS resource. Each tag consists of a key and an optional value. You can use tags to search and filter your resources or track your AWS costs."}},"AWS::EC2::IPAMResourceDiscovery.IpamOperatingRegion":{"attributes":{},"description":"The operating Regions for an IPAM. Operating Regions are AWS Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the AWS Regions you select as operating Regions.\\n\\nFor more information about operating Regions, see [Create an IPAM](https://docs.aws.amazon.com//vpc/latest/ipam/create-ipam.html) in the *Amazon VPC IPAM User Guide* .","properties":{"RegionName":"The name of the operating Region."}},"AWS::EC2::IPAMResourceDiscoveryAssociation":{"attributes":{"IpamArn":"The IPAM ARN.","IpamRegion":"The IPAM home Region.","IpamResourceDiscoveryAssociationArn":"The resource discovery association ARN.","IpamResourceDiscoveryAssociationId":"The resource discovery association ID.","IsDefault":"Defines if the resource discovery is the default. When you create an IPAM, a default resource discovery is created for your IPAM and it\'s associated with your IPAM.","OwnerId":"The owner ID.","Ref":"`Ref` returns the resource discovery ID. For example: `ipam-res-disco-111122223333` .","ResourceDiscoveryStatus":"The resource discovery status.\\n\\n- `active` - Connection or permissions required to read the results of the resource discovery are intact.\\n- `not-found` - Connection or permissions required to read the results of the resource discovery are broken. This may happen if the owner of the resource discovery stopped sharing it or deleted the resource discovery. Verify the resource discovery still exists and the AWS RAM resource share is still intact.","State":"The lifecycle state of the association when you associate or disassociate a resource discovery.\\n\\n- `associate-in-progress` - Resource discovery is being associated.\\n- `associate-complete` - Resource discovery association is complete.\\n- `associate-failed` - Resource discovery association has failed.\\n- `disassociate-in-progress` - Resource discovery is being disassociated.\\n- `disassociate-complete` - Resource discovery disassociation is complete.\\n- `disassociate-failed` - Resource discovery disassociation has failed.\\n- `isolate-in-progress` - AWS account that created the resource discovery association has been removed and the resource discovery associatation is being isolated.\\n- `isolate-complete` - Resource discovery isolation is complete..\\n- `restore-in-progress` - Resource discovery is being restored."},"description":"An IPAM resource discovery association. An associated resource discovery is a resource discovery that has been associated with an IPAM. IPAM aggregates the resource CIDRs discovered by the associated resource discovery.","properties":{"IpamId":"The IPAM ID.","IpamResourceDiscoveryId":"The resource discovery ID.","Tags":"A tag is a label that you assign to an AWS resource. Each tag consists of a key and an optional value. You can use tags to search and filter your resources or track your AWS costs."}},"AWS::EC2::IPAMScope":{"attributes":{"Arn":"The ARN of the scope.","IpamArn":"The ARN of an IPAM.","IpamScopeId":"The ID of an IPAM scope.","IpamScopeType":"The type of the scope.","IsDefault":"Defines if the scope is the default scope or not.","PoolCount":"The number of pools in a scope.","Ref":"`Ref` returns the IPAM scope ID."},"description":"In IPAM, a scope is the highest-level container within IPAM. An IPAM contains two default scopes. Each scope represents the IP space for a single network. The private scope is intended for all private IP address space. The public scope is intended for all public IP address space. Scopes enable you to reuse IP addresses across multiple unconnected networks without causing IP address overlap or conflict.\\n\\nFor more information, see [How IPAM works](https://docs.aws.amazon.com//vpc/latest/ipam/how-it-works-ipam.html) in the *Amazon VPC IPAM User Guide* .","properties":{"Description":"The description of the scope.","IpamId":"The ID of the IPAM for which you\'re creating this scope.","Tags":"The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value. For example, to find all resources that have a tag with the key `Owner` and the value `TeamA` , specify `tag:Owner` for the filter name and `TeamA` for the filter value."}},"AWS::EC2::Instance":{"attributes":{"AvailabilityZone":"The Availability Zone where the specified instance is launched. For example: `us-east-1b` .\\n\\nYou can retrieve a list of all Availability Zones for a Region by using the [Fn::GetAZs](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getavailabilityzones.html) intrinsic function.","PrivateDnsName":"The private DNS name of the specified instance. For example: `ip-10-24-34-0.ec2.internal` .","PrivateIp":"The private IP address of the specified instance. For example: `10.24.34.0` .","PublicDnsName":"The public DNS name of the specified instance. For example: `ec2-107-20-50-45.compute-1.amazonaws.com` .","PublicIp":"The public IP address of the specified instance. For example: `192.0.2.0` .","Ref":"`Ref` returns the instance ID. For example: `i-1234567890abcdef0` ."},"description":"Specifies an EC2 instance.\\n\\nIf an Elastic IP address is attached to your instance, AWS CloudFormation reattaches the Elastic IP address after it updates the instance. For more information about updating stacks, see [AWS CloudFormation Stacks Updates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks.html) .","properties":{"AdditionalInfo":"This property is reserved for internal use. If you use it, the stack fails with this error: `Bad property set: [Testing this property] (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterCombination; Request ID: 0XXXXXX-49c7-4b40-8bcc-76885dcXXXXX)` .","Affinity":"Indicates whether the instance is associated with a dedicated host. If you want the instance to always restart on the same host on which it was launched, specify `host` . If you want the instance to restart on any available host, but try to launch onto the last host it ran on (on a best-effort basis), specify `default` .","AvailabilityZone":"The Availability Zone of the instance.\\n\\nIf not specified, an Availability Zone will be automatically chosen for you based on the load balancing criteria for the Region.\\n\\nThis parameter is not supported by [DescribeImageAttribute](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImageAttribute.html) .","BlockDeviceMappings":"The block device mapping entries that defines the block devices to attach to the instance at launch.\\n\\nBy default, the block devices specified in the block device mapping for the AMI are used. You can override the AMI block device mapping using the instance block device mapping. For the root volume, you can override only the volume size, volume type, volume encryption settings, and the `DeleteOnTermination` setting.\\n\\n> After the instance is running, you can modify only the `DeleteOnTermination` parameter for the attached volumes without interrupting the instance. Modifying any other parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","CpuOptions":"The CPU options for the instance. For more information, see [Optimize CPU options](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html) in the *Amazon Elastic Compute Cloud User Guide* .","CreditSpecification":"The credit option for CPU usage of the burstable performance instance. Valid values are `standard` and `unlimited` . To change this attribute after launch, use [ModifyInstanceCreditSpecification](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceCreditSpecification.html) . For more information, see [Burstable performance instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html) in the *Amazon EC2 User Guide* .\\n\\nDefault: `standard` (T2 instances) or `unlimited` (T3/T3a/T4g instances)\\n\\nFor T3 instances with `host` tenancy, only `standard` is supported.","DisableApiTermination":"If you set this parameter to `true` , you can\'t terminate the instance using the Amazon EC2 console, CLI, or API; otherwise, you can. To change this attribute after launch, use [ModifyInstanceAttribute](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceAttribute.html) . Alternatively, if you set `InstanceInitiatedShutdownBehavior` to `terminate` , you can terminate the instance by running the shutdown command from the instance.\\n\\nDefault: `false`","EbsOptimized":"Indicates whether the instance is optimized for Amazon EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal Amazon EBS I/O performance. This optimization isn\'t available with all instance types. Additional usage charges apply when using an EBS-optimized instance.\\n\\nDefault: `false`","ElasticGpuSpecifications":"An elastic GPU to associate with the instance. An Elastic GPU is a GPU resource that you can attach to your Windows instance to accelerate the graphics performance of your applications. For more information, see [Amazon EC2 Elastic GPUs](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/elastic-graphics.html) in the *Amazon EC2 User Guide* .","ElasticInferenceAccelerators":"An elastic inference accelerator to associate with the instance. Elastic inference accelerators are a resource you can attach to your Amazon EC2 instances to accelerate your Deep Learning (DL) inference workloads.\\n\\nYou cannot specify accelerators from different generations in the same request.\\n\\n> Starting April 15, 2023, AWS will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.","EnclaveOptions":"Indicates whether the instance is enabled for AWS Nitro Enclaves.","HibernationOptions":"Indicates whether an instance is enabled for hibernation. This parameter is valid only if the instance meets the [hibernation prerequisites](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hibernating-prerequisites.html) . For more information, see [Hibernate your instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html) in the *Amazon EC2 User Guide* .\\n\\nYou can\'t enable hibernation and AWS Nitro Enclaves on the same instance.","HostId":"If you specify host for the `Affinity` property, the ID of a dedicated host that the instance is associated with. If you don\'t specify an ID, Amazon EC2 launches the instance onto any available, compatible dedicated host in your account. This type of launch is called an untargeted launch. Note that for untargeted launches, you must have a compatible, dedicated host available to successfully launch instances.","HostResourceGroupArn":"The ARN of the host resource group in which to launch the instances. If you specify a host resource group ARN, omit the *Tenancy* parameter or set it to `host` .","IamInstanceProfile":"The name of an IAM instance profile. To create a new IAM instance profile, use the [AWS::IAM::InstanceProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html) resource.","ImageId":"The ID of the AMI. An AMI ID is required to launch an instance and must be specified here or in a launch template.","InstanceInitiatedShutdownBehavior":"Indicates whether an instance stops or terminates when you initiate shutdown from the instance (using the operating system command for system shutdown).\\n\\nDefault: `stop`","InstanceType":"The instance type. For more information, see [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) in the *Amazon EC2 User Guide* .\\n\\nWhen you change your EBS-backed instance type, instance restart or replacement behavior depends on the instance type compatibility between the old and new types. An instance with an instance store volume as the root volume is always replaced. For more information, see [Change the instance type](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-resize.html) in the *Amazon EC2 User Guide* .","Ipv6AddressCount":"The number of IPv6 addresses to associate with the primary network interface. Amazon EC2 chooses the IPv6 addresses from the range of your subnet. You cannot specify this option and the option to assign specific IPv6 addresses in the same request. You can specify this option if you\'ve specified a minimum number of instances to launch.\\n\\nYou cannot specify this option and the network interfaces option in the same request.","Ipv6Addresses":"The IPv6 addresses from the range of the subnet to associate with the primary network interface. You cannot specify this option and the option to assign a number of IPv6 addresses in the same request. You cannot specify this option if you\'ve specified a minimum number of instances to launch.\\n\\nYou cannot specify this option and the network interfaces option in the same request.","KernelId":"The ID of the kernel.\\n\\n> We recommend that you use PV-GRUB instead of kernels and RAM disks. For more information, see [PV-GRUB](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedkernels.html) in the *Amazon EC2 User Guide* .","KeyName":"The name of the key pair. You can create a key pair using [CreateKeyPair](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateKeyPair.html) or [ImportKeyPair](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportKeyPair.html) .\\n\\n> If you do not specify a key pair, you can\'t connect to the instance unless you choose an AMI that is configured to allow users another way to log in.","LaunchTemplate":"The launch template to use to launch the instances. Any parameters that you specify in the AWS CloudFormation template override the same parameters in the launch template. You can specify either the name or ID of a launch template, but not both.","LicenseSpecifications":"The license configurations.","Monitoring":"Specifies whether detailed monitoring is enabled for the instance. Specify `true` to enable detailed monitoring. Otherwise, basic monitoring is enabled. For more information about detailed monitoring, see [Enable or turn off detailed monitoring for your instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch-new.html) in the *Amazon EC2 User Guide* .","NetworkInterfaces":"The network interfaces to associate with the instance.\\n\\n> If you use this property to point to a network interface, you must terminate the original interface before attaching a new one to allow the update of the instance to succeed.\\n> \\n> If this resource has a public IP address and is also in a VPC that is defined in the same template, you must use the [DependsOn Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) to declare a dependency on the VPC-gateway attachment.","PlacementGroupName":"The name of an existing placement group that you want to launch the instance into (cluster | partition | spread).","PrivateDnsNameOptions":"The options for the instance hostname.","PrivateIpAddress":"The primary IPv4 address. You must specify a value from the IPv4 address range of the subnet.\\n\\nOnly one private IP address can be designated as primary. You can\'t specify this option if you\'ve specified the option to designate a private IP address as the primary IP address in a network interface specification. You cannot specify this option if you\'re launching more than one instance in the request.\\n\\nYou cannot specify this option and the network interfaces option in the same request.\\n\\nIf you make an update to an instance that requires replacement, you must assign a new private IP address. During a replacement, AWS CloudFormation creates a new instance but doesn\'t delete the old instance until the stack has successfully updated. If the stack update fails, AWS CloudFormation uses the old instance to roll back the stack to the previous working state. The old and new instances cannot have the same private IP address.","PropagateTagsToVolumeOnCreation":"Indicates whether to assign the tags from the instance to all of the volumes attached to the instance at launch. If you specify `true` and you assign tags to the instance, those tags are automatically assigned to all of the volumes that you attach to the instance at launch. If you specify `false` , those tags are not assigned to the attached volumes.","RamdiskId":"The ID of the RAM disk to select. Some kernels require additional drivers at launch. Check the kernel requirements for information about whether you need to specify a RAM disk. To find kernel requirements, go to the AWS Resource Center and search for the kernel ID.\\n\\n> We recommend that you use PV-GRUB instead of kernels and RAM disks. For more information, see [PV-GRUB](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedkernels.html) in the *Amazon EC2 User Guide* .","SecurityGroupIds":"The IDs of the security groups. You can specify the IDs of existing security groups and references to resources created by the stack template.\\n\\nIf you specify a network interface, you must specify any security groups as part of the network interface.","SecurityGroups":"[Default VPC] The names of the security groups. For a nondefault VPC, you must use security group IDs instead.\\n\\nYou cannot specify this option and the network interfaces option in the same request. The list can contain both the name of existing Amazon EC2 security groups or references to AWS::EC2::SecurityGroup resources created in the template.\\n\\nDefault: Amazon EC2 uses the default security group.","SourceDestCheck":"Enable or disable source/destination checks, which ensure that the instance is either the source or the destination of any traffic that it receives. If the value is `true` , source/destination checks are enabled; otherwise, they are disabled. The default value is `true` . You must disable source/destination checks if the instance runs services such as network address translation, routing, or firewalls.","SsmAssociations":"The SSM [document](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html) and parameter values in AWS Systems Manager to associate with this instance. To use this property, you must specify an IAM instance profile role for the instance. For more information, see [Create an IAM instance profile for Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-configuring-access-role.html) in the *AWS Systems Manager User Guide* .\\n\\n> You can currently associate only one document with an instance.","SubnetId":"The ID of the subnet to launch the instance into.\\n\\nIf you specify a network interface, you must specify any subnets as part of the network interface.","Tags":"The tags to add to the instance. These tags are not applied to the EBS volumes, such as the root volume, unless [PropagateTagsToVolumeOnCreation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-propagatetagstovolumeoncreation) is `true` .","Tenancy":"The tenancy of the instance. An instance with a tenancy of `dedicated` runs on single-tenant hardware.","UserData":"The user data script to make available to the instance. User data is limited to 16 KB. You must provide base64-encoded text. For more information, see [Fn::Base64](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-base64.html) .\\n\\nUser data runs only at instance launch. For more information, see [Run commands on your Linux instance at launch](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) and [Run commands on your Windows instance at launch](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-windows-user-data.html) .","Volumes":"The volumes to attach to the instance."}},"AWS::EC2::Instance.AssociationParameter":{"attributes":{},"description":"Specifies input parameter values for an SSM document in AWS Systems Manager .\\n\\n`AssociationParameter` is a property of the [Amazon EC2 Instance SsmAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations.html) property.","properties":{"Key":"The name of an input parameter that is in the associated SSM document.","Value":"The value of an input parameter."}},"AWS::EC2::Instance.BlockDeviceMapping":{"attributes":{},"description":"Specifies a block device mapping for an instance. You must specify exactly one of the following properties: `VirtualName` , `Ebs` , or `NoDevice` .\\n\\n`BlockDeviceMapping` is a property of the [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource.\\n\\n> After the instance is running, you can modify only the `DeleteOnTermination` parameter for the attached volumes without interrupting the instance. Modifying any other parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","properties":{"DeviceName":"The device name (for example, `/dev/sdh` or `xvdh` ).\\n\\n> After the instance is running, this parameter is used to specify the device name of the block device mapping to update.","Ebs":"Parameters used to automatically set up EBS volumes when the instance is launched.\\n\\n> After the instance is running, you can modify only the `DeleteOnTermination` parameter for the attached volumes without interrupting the instance. Modifying any other parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt) .","NoDevice":"To omit the device from the block device mapping, specify an empty string.\\n\\n> After the instance is running, modifying this parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","VirtualName":"The virtual device name ( `ephemeral` N). The name must be in the form `ephemeral` *X* where *X* is a number starting from zero (0). For example, an instance type with 2 available instance store volumes can specify mappings for `ephemeral0` and `ephemeral1` . The number of available instance store volumes depends on the instance type. After you connect to the instance, you must mount the volume.\\n\\nNVMe instance store volumes are automatically enumerated and assigned a device name. Including them in your block device mapping has no effect.\\n\\n*Constraints* : For M3 instances, you must specify instance store volumes in the block device mapping for the instance. When you launch an M3 instance, we ignore any instance store volumes specified in the block device mapping for the AMI.\\n\\n> After the instance is running, modifying this parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) ."}},"AWS::EC2::Instance.CpuOptions":{"attributes":{},"description":"Specifies the CPU options for the instance. When you specify CPU options, you must specify both the number of CPU cores and threads per core.\\n\\nModifying the CPU options for an instance results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .\\n\\nFor more information, see [Optimize CPU options](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html) in the *Amazon Elastic Compute Cloud User Guide* .","properties":{"CoreCount":"The number of CPU cores for the instance.","ThreadsPerCore":"The number of threads per CPU core."}},"AWS::EC2::Instance.CreditSpecification":{"attributes":{},"description":"Specifies the credit option for CPU usage of a T instance.\\n\\n`CreditSpecification` is a property of the [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource.\\n\\nFor more information, see [Burstable performance instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html) in the *Amazon EC2 User Guide* .","properties":{"CPUCredits":"The credit option for CPU usage of the instance.\\n\\nValid values: `standard` | `unlimited`\\n\\nT3 instances with `host` tenancy do not support the `unlimited` CPU credit option."}},"AWS::EC2::Instance.Ebs":{"attributes":{},"description":"Specifies a block device for an EBS volume.\\n\\n`Ebs` is a property of the [Amazon EC2 BlockDeviceMapping](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html) property.\\n\\n> After the instance is running, you can modify only the `DeleteOnTermination` parameters for the attached volumes without interrupting the instance. Modifying any other parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","properties":{"DeleteOnTermination":"Indicates whether the EBS volume is deleted on instance termination. For more information, see [Preserving Amazon EBS volumes on instance termination](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#preserving-volumes-on-termination) in the *Amazon EC2 User Guide* .","Encrypted":"Indicates whether the volume should be encrypted. The effect of setting the encryption state to `true` depends on the volume origin (new or from a snapshot), starting encryption state, ownership, and whether encryption by default is enabled. For more information, see [Encryption by default](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#encryption-by-default) in the *Amazon Elastic Compute Cloud User Guide* .\\n\\nEncrypted Amazon EBS volumes must be attached to instances that support Amazon EBS encryption. For more information, see [Supported instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#EBSEncryption_supported_instances) .\\n\\n> After the instance is running, modifying this parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","Iops":"The number of I/O operations per second (IOPS). For `gp3` , `io1` , and `io2` volumes, this represents the number of IOPS that are provisioned for the volume. For `gp2` volumes, this represents the baseline performance of the volume and the rate at which the volume accumulates I/O credits for bursting.\\n\\nThe following are the supported values for each volume type:\\n\\n- `gp3` : 3,000-16,000 IOPS\\n- `io1` : 100-64,000 IOPS\\n- `io2` : 100-64,000 IOPS\\n\\nFor `io1` and `io2` volumes, we guarantee 64,000 IOPS only for [Instances built on the Nitro System](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances) . Other instance families guarantee performance up to 32,000 IOPS.\\n\\nThis parameter is required for `io1` and `io2` volumes. The default for `gp3` volumes is 3,000 IOPS. This parameter is not supported for `gp2` , `st1` , `sc1` , or `standard` volumes.\\n\\n> After the instance is running, modifying this parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","KmsKeyId":"The identifier of the AWS KMS key to use for Amazon EBS encryption. If `KmsKeyId` is specified, the encrypted state must be `true` . If the encrypted state is `true` but you do not specify `KmsKeyId` , your KMS key for EBS is used.\\n\\nYou can specify the KMS key using any of the following:\\n\\n- Key ID. For example, 1234abcd-12ab-34cd-56ef-1234567890ab.\\n- Key alias. For example, alias/ExampleAlias.\\n- Key ARN. For example, arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab.\\n- Alias ARN. For example, arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias.\\n\\n> After the instance is running, modifying this parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","SnapshotId":"The ID of the snapshot.\\n\\nIf you specify both `SnapshotId` and `VolumeSize` , `VolumeSize` must be equal or greater than the size of the snapshot.\\n\\n> After the instance is running, modifying this parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","VolumeSize":"The size of the volume, in GiBs. You must specify either a snapshot ID or a volume size. If you specify a snapshot, the default is the snapshot size. You can specify a volume size that is equal to or larger than the snapshot size.\\n\\nThe following are the supported volumes sizes for each volume type:\\n\\n- `gp2` and `gp3` :1-16,384\\n- `io1` and `io2` : 4-16,384\\n- `st1` and `sc1` : 125-16,384\\n- `standard` : 1-1,024\\n\\n> After the instance is running, modifying this parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","VolumeType":"The volume type. For more information, see [Amazon EBS volume types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html) in the *Amazon EC2 User Guide* . If the volume type is `io1` or `io2` , you must specify the IOPS that the volume supports.\\n\\n> After the instance is running, modifying this parameter results in instance [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) ."}},"AWS::EC2::Instance.ElasticGpuSpecification":{"attributes":{},"description":"Specifies the type of Elastic GPU. An Elastic GPU is a GPU resource that you can attach to your Amazon EC2 instance to accelerate the graphics performance of your applications. For more information, see [Amazon EC2 Elastic GPUs](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/elastic-graphics.html) in the *Amazon EC2 User Guide for Windows Instances* .\\n\\n`ElasticGpuSpecification` is a property of the [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource.","properties":{"Type":"The type of Elastic Graphics accelerator. For more information about the values to specify for `Type` , see [Elastic Graphics Basics](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/elastic-graphics.html#elastic-graphics-basics) , specifically the Elastic Graphics accelerator column, in the *Amazon Elastic Compute Cloud User Guide for Windows Instances* ."}},"AWS::EC2::Instance.ElasticInferenceAccelerator":{"attributes":{},"description":"Specifies the Elastic Inference Accelerator for the instance.\\n\\n`ElasticInferenceAccelerator` is a property of the [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource.","properties":{"Count":"The number of elastic inference accelerators to attach to the instance.","Type":"The type of elastic inference accelerator. The possible values are `eia1.medium` , `eia1.large` , `eia1.xlarge` , `eia2.medium` , `eia2.large` , and `eia2.xlarge` ."}},"AWS::EC2::Instance.EnclaveOptions":{"attributes":{},"description":"Indicates whether the instance is enabled for AWS Nitro Enclaves.","properties":{"Enabled":"If this parameter is set to `true` , the instance is enabled for AWS Nitro Enclaves; otherwise, it is not enabled for AWS Nitro Enclaves."}},"AWS::EC2::Instance.HibernationOptions":{"attributes":{},"description":"Specifies the hibernation options for the instance.\\n\\n`HibernationOptions` is a property of the [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource.","properties":{"Configured":"Set to `true` to enable your instance for hibernation.\\n\\nDefault: `false`"}},"AWS::EC2::Instance.InstanceIpv6Address":{"attributes":{},"description":"Specifies the IPv6 address for the instance.\\n\\n`InstanceIpv6Address` is a property of the [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource.","properties":{"Ipv6Address":"The IPv6 address."}},"AWS::EC2::Instance.LaunchTemplateSpecification":{"attributes":{},"description":"Specifies a launch template to use when launching an Amazon EC2 instance.\\n\\nYou must specify the following:\\n\\n- The ID or the name of the launch template, but not both.\\n- The version of the launch template.\\n\\n`LaunchTemplateSpecification` is a property of the [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource.\\n\\nFor information about creating a launch template, see [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) and [Create a launch template](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html#create-launch-template) in the *Amazon EC2 User Guide* .\\n\\nFor examples of launch templates, see [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples) .","properties":{"LaunchTemplateId":"The ID of the launch template.\\n\\nYou must specify the `LaunchTemplateId` or the `LaunchTemplateName` , but not both.","LaunchTemplateName":"The name of the launch template.\\n\\nYou must specify the `LaunchTemplateName` or the `LaunchTemplateId` , but not both.","Version":"The version number of the launch template.\\n\\nSpecifying `$Latest` or `$Default` for the template version number is not supported. However, you can specify `LatestVersionNumber` or `DefaultVersionNumber` using the `Fn::GetAtt` intrinsic function. For more information, see [Fn::GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate-return-values-fn--getatt) ."}},"AWS::EC2::Instance.LicenseSpecification":{"attributes":{},"description":"Specifies the license configuration to use.\\n\\n`LicenseSpecification` is a property of the [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource.","properties":{"LicenseConfigurationArn":"The Amazon Resource Name (ARN) of the license configuration."}},"AWS::EC2::Instance.NetworkInterface":{"attributes":{},"description":"Specifies a network interface that is to be attached to an instance.\\n\\nYou can create a network interface when launching an instance. For an example, see the [AWS::EC2::Instance examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#aws-properties-ec2-instance--examples--Automatically_assign_a_public_IP_address) .\\n\\nAlternatively, you can attach an existing network interface when launching an instance. For an example, see the [AWS::EC2:NetworkInterface examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#aws-resource-ec2-networkinterface--examples) .","properties":{"AssociateCarrierIpAddress":"Indicates whether to assign a carrier IP address to the network interface.\\n\\nYou can only assign a carrier IP address to a network interface that is in a subnet in a Wavelength Zone. For more information about carrier IP addresses, see [Carrier IP address](https://docs.aws.amazon.com/wavelength/latest/developerguide/how-wavelengths-work.html#provider-owned-ip) in the *AWS Wavelength Developer Guide* .","AssociatePublicIpAddress":"Indicates whether to assign a public IPv4 address to an instance. Applies only if creating a network interface when launching an instance. The network interface must be the primary network interface. If launching into a default subnet, the default value is `true` .","DeleteOnTermination":"Indicates whether the network interface is deleted when the instance is terminated. Applies only if creating a network interface when launching an instance.","Description":"The description of the network interface. Applies only if creating a network interface when launching an instance.","DeviceIndex":"The position of the network interface in the attachment order. A primary network interface has a device index of 0.\\n\\nIf you create a network interface when launching an instance, you must specify the device index.","GroupSet":"The IDs of the security groups for the network interface. Applies only if creating a network interface when launching an instance.","Ipv6AddressCount":"A number of IPv6 addresses to assign to the network interface. Amazon EC2 chooses the IPv6 addresses from the range of the subnet. You cannot specify this option and the option to assign specific IPv6 addresses in the same request. You can specify this option if you\'ve specified a minimum number of instances to launch.","Ipv6Addresses":"The IPv6 addresses to assign to the network interface. You cannot specify this option and the option to assign a number of IPv6 addresses in the same request. You cannot specify this option if you\'ve specified a minimum number of instances to launch.","NetworkInterfaceId":"The ID of the network interface, when attaching an existing network interface.","PrivateIpAddress":"The private IPv4 address of the network interface. Applies only if creating a network interface when launching an instance.","PrivateIpAddresses":"One or more private IPv4 addresses to assign to the network interface. Only one private IPv4 address can be designated as primary.","SecondaryPrivateIpAddressCount":"The number of secondary private IPv4 addresses. You can\'t specify this option and specify more than one private IP address using the private IP addresses option.","SubnetId":"The ID of the subnet associated with the network interface. Applies only if creating a network interface when launching an instance."}},"AWS::EC2::Instance.NoDevice":{"attributes":{},"description":"Suppresses the specified device included in the block device mapping of the AMI. To suppress a device, specify an empty string.\\n\\n`NoDevice` is a property of the [Amazon EC2 BlockDeviceMapping](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html) property.","properties":{}},"AWS::EC2::Instance.PrivateDnsNameOptions":{"attributes":{},"description":"The type of hostnames to assign to instances in the subnet at launch. For IPv4 only subnets, an instance DNS name must be based on the instance IPv4 address. For IPv6 only subnets, an instance DNS name must be based on the instance ID. For dual-stack subnets, you can specify whether DNS names use the instance IPv4 address or the instance ID. For more information, see [Amazon EC2 instance hostname types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html) in the *Amazon Elastic Compute Cloud User Guide* .","properties":{"EnableResourceNameDnsAAAARecord":"Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA records. For more information, see [Amazon EC2 instance hostname types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html) in the *Amazon Elastic Compute Cloud User Guide* .","EnableResourceNameDnsARecord":"Indicates whether to respond to DNS queries for instance hostnames with DNS A records. For more information, see [Amazon EC2 instance hostname types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html) in the *Amazon Elastic Compute Cloud User Guide* .","HostnameType":"The type of hostnames to assign to instances in the subnet at launch. For IPv4 only subnets, an instance DNS name must be based on the instance IPv4 address. For IPv6 only subnets, an instance DNS name must be based on the instance ID. For dual-stack subnets, you can specify whether DNS names use the instance IPv4 address or the instance ID. For more information, see [Amazon EC2 instance hostname types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html) in the *Amazon Elastic Compute Cloud User Guide* ."}},"AWS::EC2::Instance.PrivateIpAddressSpecification":{"attributes":{},"description":"Specifies a secondary private IPv4 address for a network interface.","properties":{"Primary":"Indicates whether the private IPv4 address is the primary private IPv4 address. Only one IPv4 address can be designated as primary.","PrivateIpAddress":"The private IPv4 address."}},"AWS::EC2::Instance.SsmAssociation":{"attributes":{},"description":"Specifies the SSM document and parameter values in AWS Systems Manager to associate with an instance.\\n\\n`SsmAssociations` is a property of the [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource.","properties":{"AssociationParameters":"The input parameter values to use with the associated SSM document.","DocumentName":"The name of an SSM document to associate with the instance."}},"AWS::EC2::Instance.Volume":{"attributes":{},"description":"Specifies a volume to attach to an instance.\\n\\n`Volume` is an embedded property of the [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource.","properties":{"Device":"The device name (for example, `/dev/sdh` or `xvdh` ).","VolumeId":"The ID of the EBS volume. The volume and instance must be within the same Availability Zone."}},"AWS::EC2::InternetGateway":{"attributes":{"InternetGatewayId":"The ID of the internet gateway.","Ref":"`Ref` returns the resource name."},"description":"Allocates an internet gateway for use with a VPC. After creating the Internet gateway, you then attach it to a VPC.","properties":{"Tags":"Any tags to assign to the internet gateway."}},"AWS::EC2::KeyPair":{"attributes":{"KeyFingerprint":"If you created the key pair using Amazon EC2:\\n\\n- For RSA key pairs, the key fingerprint is the SHA-1 digest of the DER encoded private key.\\n- For ED25519 key pairs, the key fingerprint is the base64-encoded SHA-256 digest, which is the default for OpenSSH, starting with [OpenSSH 6.8](https://docs.aws.amazon.com/http://www.openssh.com/txt/release-6.8) .\\n\\nIf you imported the key pair to Amazon EC2:\\n\\n- For RSA key pairs, the key fingerprint is the MD5 public key fingerprint as specified in section 4 of RFC 4716.\\n- For ED25519 key pairs, the key fingerprint is the base64-encoded SHA-256 digest, which is the default for OpenSSH, starting with [OpenSSH 6.8](https://docs.aws.amazon.com/http://www.openssh.com/txt/release-6.8) .","KeyPairId":"The ID of the key pair.","Ref":"`Ref` returns the name of the key pair."},"description":"Specifies a key pair for use with an Amazon Elastic Compute Cloud instance as follows:\\n\\n- To import an existing key pair, include the `PublicKeyMaterial` property.\\n- To create a new key pair, omit the `PublicKeyMaterial` property.\\n\\nWhen you import an existing key pair, you specify the public key material for the key. We assume that you have the private key material for the key. AWS CloudFormation does not create or return the private key material when you import a key pair.\\n\\nWhen you create a new key pair, the private key is saved to AWS Systems Manager Parameter Store, using a parameter with the following name: `/ec2/keypair/{key_pair_id}` . For more information about retrieving private key, and the required permissions, see [Create a key pair using AWS CloudFormation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-key-pairs.html#create-key-pair-cloudformation) in the *Amazon EC2 User Guide* .\\n\\nWhen AWS CloudFormation deletes a key pair that was created or imported by a stack, it also deletes the parameter that was used to store the private key material in Parameter Store.","properties":{"KeyFormat":"The format of the key pair.\\n\\nDefault: `pem`","KeyName":"A unique name for the key pair.\\n\\nConstraints: Up to 255 ASCII characters","KeyType":"The type of key pair. Note that ED25519 keys are not supported for Windows instances.\\n\\nIf the `PublicKeyMaterial` property is specified, the `KeyType` property is ignored, and the key type is inferred from the `PublicKeyMaterial` value.\\n\\nDefault: `rsa`","PublicKeyMaterial":"The public key material. The `PublicKeyMaterial` property is used to import a key pair. If this property is not specified, then a new key pair will be created.","Tags":"The tags to apply to the key pair."}},"AWS::EC2::LaunchTemplate":{"attributes":{"DefaultVersionNumber":"The default version of the launch template, such as 2.\\n\\nThe default version of a launch template cannot be specified in AWS CloudFormation . The default version can be set in the Amazon EC2 console or by using the `modify-launch-template` AWS CLI command.","LatestVersionNumber":"The latest version of the launch template, such as `5` .","LaunchTemplateId":"The ID of the launch template.","Ref":"`Ref` returns the ID of the launch template, for example, `lt-01238c059e3466abc` ."},"description":"Specifies the properties for creating a launch template.\\n\\nThe minimum required properties for specifying a launch template are as follows:\\n\\n- You must specify at least one property for the launch template data.\\n- You do not need to specify a name for the launch template. If you do not specify a name, AWS CloudFormation creates the name for you.\\n\\nA launch template can contain some or all of the configuration information to launch an instance. When you launch an instance using a launch template, instance properties that are not specified in the launch template use default values, except the `ImageId` property, which has no default value. If you do not specify an AMI ID for the launch template `ImageId` property, you must specify an AMI ID for the instance `ImageId` property.\\n\\nFor more information, see [Launch an instance from a launch template](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) in the *Amazon EC2 User Guide* .","properties":{"LaunchTemplateData":"The information for the launch template.","LaunchTemplateName":"A name for the launch template.","TagSpecifications":"The tags to apply to the launch template on creation. To tag the launch template, the resource type must be `launch-template` .\\n\\n> To specify the tags for the resources that are created when an instance is launched, you must use the `TagSpecifications` parameter in the [launch template data](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestLaunchTemplateData.html) structure.","VersionDescription":"A description for the first version of the launch template."}},"AWS::EC2::LaunchTemplate.AcceleratorCount":{"attributes":{},"description":"The minimum and maximum number of accelerators (GPUs, FPGAs, or AWS Inferentia chips) on an instance.","properties":{"Max":"The maximum number of accelerators. To specify no maximum limit, omit this parameter. To exclude accelerator-enabled instance types, set `Max` to `0` .","Min":"The minimum number of accelerators. To specify no minimum limit, omit this parameter."}},"AWS::EC2::LaunchTemplate.AcceleratorTotalMemoryMiB":{"attributes":{},"description":"The minimum and maximum amount of total accelerator memory, in MiB.","properties":{"Max":"The maximum amount of accelerator memory, in MiB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of accelerator memory, in MiB. To specify no minimum limit, omit this parameter."}},"AWS::EC2::LaunchTemplate.BaselineEbsBandwidthMbps":{"attributes":{},"description":"The minimum and maximum baseline bandwidth to Amazon EBS, in Mbps. For more information, see [Amazon EBS–optimized instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html) in the *Amazon EC2 User Guide* .","properties":{"Max":"The maximum baseline bandwidth, in Mbps. To specify no maximum limit, omit this parameter.","Min":"The minimum baseline bandwidth, in Mbps. To specify no minimum limit, omit this parameter."}},"AWS::EC2::LaunchTemplate.BlockDeviceMapping":{"attributes":{},"description":"Information about a block device mapping for an Amazon EC2 launch template.\\n\\n`BlockDeviceMapping` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"DeviceName":"The device name (for example, /dev/sdh or xvdh).","Ebs":"Parameters used to automatically set up EBS volumes when the instance is launched.","NoDevice":"To omit the device from the block device mapping, specify an empty string.","VirtualName":"The virtual device name (ephemeralN). Instance store volumes are numbered starting from 0. An instance type with 2 available instance store volumes can specify mappings for ephemeral0 and ephemeral1. The number of available instance store volumes depends on the instance type. After you connect to the instance, you must mount the volume."}},"AWS::EC2::LaunchTemplate.CapacityReservationSpecification":{"attributes":{},"description":"Specifies an instance\'s Capacity Reservation targeting option. You can specify only one option at a time.\\n\\n`CapacityReservationSpecification` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"CapacityReservationPreference":"Indicates the instance\'s Capacity Reservation preferences. Possible preferences include:\\n\\n- `open` - The instance can run in any `open` Capacity Reservation that has matching attributes (instance type, platform, Availability Zone).\\n- `none` - The instance avoids running in a Capacity Reservation even if one is available. The instance runs in On-Demand capacity.","CapacityReservationTarget":"Information about the target Capacity Reservation or Capacity Reservation group."}},"AWS::EC2::LaunchTemplate.CapacityReservationTarget":{"attributes":{},"description":"Specifies a target Capacity Reservation.\\n\\n`CapacityReservationTarget` is a property of the [Amazon EC2 LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) property type.","properties":{"CapacityReservationId":"The ID of the Capacity Reservation in which to run the instance.","CapacityReservationResourceGroupArn":"The ARN of the Capacity Reservation resource group in which to run the instance."}},"AWS::EC2::LaunchTemplate.CpuOptions":{"attributes":{},"description":"Specifies the CPU options for an instance. For more information, see [Optimize CPU options](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html) in the *Amazon Elastic Compute Cloud User Guide* .\\n\\n`CpuOptions` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"AmdSevSnp":"Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported with M6a, R6a, and C6a instance types only. For more information, see [AMD SEV-SNP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sev-snp.html) .","CoreCount":"The number of CPU cores for the instance.","ThreadsPerCore":"The number of threads per CPU core. To disable multithreading for the instance, specify a value of `1` . Otherwise, specify the default value of `2` ."}},"AWS::EC2::LaunchTemplate.CreditSpecification":{"attributes":{},"description":"Specifies the credit option for CPU usage of a T2, T3, or T3a instance.\\n\\n`CreditSpecification` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"CpuCredits":"The credit option for CPU usage of a T instance.\\n\\nValid values: `standard` | `unlimited`"}},"AWS::EC2::LaunchTemplate.Ebs":{"attributes":{},"description":"Parameters for a block device for an EBS volume in an Amazon EC2 launch template.\\n\\n`Ebs` is a property of [AWS::EC2::LaunchTemplate BlockDeviceMapping](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html) .","properties":{"DeleteOnTermination":"Indicates whether the EBS volume is deleted on instance termination.","Encrypted":"Indicates whether the EBS volume is encrypted. Encrypted volumes can only be attached to instances that support Amazon EBS encryption. If you are creating a volume from a snapshot, you can\'t specify an encryption value.","Iops":"The number of I/O operations per second (IOPS). For `gp3` , `io1` , and `io2` volumes, this represents the number of IOPS that are provisioned for the volume. For `gp2` volumes, this represents the baseline performance of the volume and the rate at which the volume accumulates I/O credits for bursting.\\n\\nThe following are the supported values for each volume type:\\n\\n- `gp3` : 3,000-16,000 IOPS\\n- `io1` : 100-64,000 IOPS\\n- `io2` : 100-64,000 IOPS\\n\\nFor `io1` and `io2` volumes, we guarantee 64,000 IOPS only for [Instances built on the Nitro System](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances) . Other instance families guarantee performance up to 32,000 IOPS.\\n\\nThis parameter is supported for `io1` , `io2` , and `gp3` volumes only. This parameter is not supported for `gp2` , `st1` , `sc1` , or `standard` volumes.","KmsKeyId":"The ARN of the symmetric AWS Key Management Service ( AWS KMS ) CMK used for encryption.","SnapshotId":"The ID of the snapshot.","Throughput":"The throughput to provision for a `gp3` volume, with a maximum of 1,000 MiB/s.\\n\\nValid Range: Minimum value of 125. Maximum value of 1000.","VolumeSize":"The size of the volume, in GiBs. You must specify either a snapshot ID or a volume size. The following are the supported volumes sizes for each volume type:\\n\\n- `gp2` and `gp3` : 1-16,384\\n- `io1` and `io2` : 4-16,384\\n- `st1` and `sc1` : 125-16,384\\n- `standard` : 1-1,024","VolumeType":"The volume type. For more information, see [Amazon EBS volume types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html) in the *Amazon Elastic Compute Cloud User Guide* ."}},"AWS::EC2::LaunchTemplate.ElasticGpuSpecification":{"attributes":{},"description":"Specifies a specification for an Elastic GPU for an Amazon EC2 launch template.\\n\\n`ElasticGpuSpecification` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"Type":"The type of Elastic Graphics accelerator. For more information about the values to specify for `Type` , see [Elastic Graphics Basics](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/elastic-graphics.html#elastic-graphics-basics) , specifically the Elastic Graphics accelerator column, in the *Amazon Elastic Compute Cloud User Guide for Windows Instances* ."}},"AWS::EC2::LaunchTemplate.EnclaveOptions":{"attributes":{},"description":"Indicates whether the instance is enabled for AWS Nitro Enclaves.","properties":{"Enabled":"If this parameter is set to `true` , the instance is enabled for AWS Nitro Enclaves; otherwise, it is not enabled for AWS Nitro Enclaves."}},"AWS::EC2::LaunchTemplate.HibernationOptions":{"attributes":{},"description":"Specifies whether your instance is configured for hibernation. This parameter is valid only if the instance meets the [hibernation prerequisites](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html#hibernating-prerequisites) . For more information, see [Hibernate Your Instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html) in the *Amazon EC2 User Guide* .\\n\\n`HibernationOptions` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"Configured":"If you set this parameter to `true` , the instance is enabled for hibernation.\\n\\nDefault: `false`"}},"AWS::EC2::LaunchTemplate.IamInstanceProfile":{"attributes":{},"description":"Specifies an IAM instance profile, which is a container for an IAM role for your instance. You can use an IAM role to distribute your AWS credentials to your instances.\\n\\nIf you are creating the launch template for use with an Amazon EC2 Auto Scaling group, you can specify either the name or the ARN of the instance profile, but not both.\\n\\n`IamInstanceProfile` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"Arn":"The Amazon Resource Name (ARN) of the instance profile.","Name":"The name of the instance profile."}},"AWS::EC2::LaunchTemplate.InstanceMarketOptions":{"attributes":{},"description":"Specifies the market (purchasing) option for an instance.\\n\\n`InstanceMarketOptions` is a property of the [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"MarketType":"The market type.","SpotOptions":"The options for Spot Instances."}},"AWS::EC2::LaunchTemplate.InstanceRequirements":{"attributes":{},"description":"The attributes for the instance types. When you specify instance attributes, Amazon EC2 will identify instance types with these attributes.\\n\\nYou must specify `VCpuCount` and `MemoryMiB` . All other attributes are optional. Any unspecified optional attribute is set to its default.\\n\\nWhen you specify multiple attributes, you get instance types that satisfy all of the specified attributes. If you specify multiple values for an attribute, you get instance types that satisfy any of the specified values.\\n\\nTo limit the list of instance types from which Amazon EC2 can identify matching instance types, you can use one of the following parameters, but not both in the same request:\\n\\n- `AllowedInstanceTypes` - The instance types to include in the list. All other instance types are ignored, even if they match your specified attributes.\\n- `ExcludedInstanceTypes` - The instance types to exclude from the list, even if they match your specified attributes.\\n\\n> If you specify `InstanceRequirements` , you can\'t specify `InstanceType` .\\n> \\n> Attribute-based instance type selection is only supported when using Auto Scaling groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in the [launch instance wizard](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html) , or with the [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API or [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) AWS CloudFormation resource, you can\'t specify `InstanceRequirements` . \\n\\nFor more information, see [Attribute-based instance type selection for EC2 Fleet](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html) , [Attribute-based instance type selection for Spot Fleet](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-attribute-based-instance-type-selection.html) , and [Spot placement score](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-placement-score.html) in the *Amazon EC2 User Guide* .","properties":{"AcceleratorCount":"The minimum and maximum number of accelerators (GPUs, FPGAs, or AWS Inferentia chips) on an instance.\\n\\nTo exclude accelerator-enabled instance types, set `Max` to `0` .\\n\\nDefault: No minimum or maximum limits","AcceleratorManufacturers":"Indicates whether instance types must have accelerators by specific manufacturers.\\n\\n- For instance types with NVIDIA devices, specify `nvidia` .\\n- For instance types with AMD devices, specify `amd` .\\n- For instance types with AWS devices, specify `amazon-web-services` .\\n- For instance types with Xilinx devices, specify `xilinx` .\\n\\nDefault: Any manufacturer","AcceleratorNames":"The accelerators that must be on the instance type.\\n\\n- For instance types with NVIDIA A100 GPUs, specify `a100` .\\n- For instance types with NVIDIA V100 GPUs, specify `v100` .\\n- For instance types with NVIDIA K80 GPUs, specify `k80` .\\n- For instance types with NVIDIA T4 GPUs, specify `t4` .\\n- For instance types with NVIDIA M60 GPUs, specify `m60` .\\n- For instance types with AMD Radeon Pro V520 GPUs, specify `radeon-pro-v520` .\\n- For instance types with Xilinx VU9P FPGAs, specify `vu9p` .\\n- For instance types with AWS Inferentia chips, specify `inferentia` .\\n- For instance types with NVIDIA GRID K520 GPUs, specify `k520` .\\n\\nDefault: Any accelerator","AcceleratorTotalMemoryMiB":"The minimum and maximum amount of total accelerator memory, in MiB.\\n\\nDefault: No minimum or maximum limits","AcceleratorTypes":"The accelerator types that must be on the instance type.\\n\\n- For instance types with GPU accelerators, specify `gpu` .\\n- For instance types with FPGA accelerators, specify `fpga` .\\n- For instance types with inference accelerators, specify `inference` .\\n\\nDefault: Any accelerator type","AllowedInstanceTypes":"The instance types to apply your specified attributes against. All other instance types are ignored, even if they match your specified attributes.\\n\\nYou can use strings with one or more wild cards, represented by an asterisk ( `*` ), to allow an instance type, size, or generation. The following are examples: `m5.8xlarge` , `c5*.*` , `m5a.*` , `r*` , `*3*` .\\n\\nFor example, if you specify `c5*` ,Amazon EC2 will allow the entire C5 instance family, which includes all C5a and C5n instance types. If you specify `m5a.*` , Amazon EC2 will allow all the M5a instance types, but not the M5n instance types.\\n\\n> If you specify `AllowedInstanceTypes` , you can\'t specify `ExcludedInstanceTypes` . \\n\\nDefault: All instance types","BareMetal":"Indicates whether bare metal instance types must be included, excluded, or required.\\n\\n- To include bare metal instance types, specify `included` .\\n- To require only bare metal instance types, specify `required` .\\n- To exclude bare metal instance types, specify `excluded` .\\n\\nDefault: `excluded`","BaselineEbsBandwidthMbps":"The minimum and maximum baseline bandwidth to Amazon EBS, in Mbps. For more information, see [Amazon EBS–optimized instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html) in the *Amazon EC2 User Guide* .\\n\\nDefault: No minimum or maximum limits","BurstablePerformance":"Indicates whether burstable performance T instance types are included, excluded, or required. For more information, see [Burstable performance instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html) .\\n\\n- To include burstable performance instance types, specify `included` .\\n- To require only burstable performance instance types, specify `required` .\\n- To exclude burstable performance instance types, specify `excluded` .\\n\\nDefault: `excluded`","CpuManufacturers":"The CPU manufacturers to include.\\n\\n- For instance types with Intel CPUs, specify `intel` .\\n- For instance types with AMD CPUs, specify `amd` .\\n- For instance types with AWS CPUs, specify `amazon-web-services` .\\n\\n> Don\'t confuse the CPU manufacturer with the CPU architecture. Instances will be launched with a compatible CPU architecture based on the Amazon Machine Image (AMI) that you specify in your launch template. \\n\\nDefault: Any manufacturer","ExcludedInstanceTypes":"The instance types to exclude.\\n\\nYou can use strings with one or more wild cards, represented by an asterisk ( `*` ), to exclude an instance type, size, or generation. The following are examples: `m5.8xlarge` , `c5*.*` , `m5a.*` , `r*` , `*3*` .\\n\\nFor example, if you specify `c5*` ,Amazon EC2 will exclude the entire C5 instance family, which includes all C5a and C5n instance types. If you specify `m5a.*` , Amazon EC2 will exclude all the M5a instance types, but not the M5n instance types.\\n\\n> If you specify `ExcludedInstanceTypes` , you can\'t specify `AllowedInstanceTypes` . \\n\\nDefault: No excluded instance types","InstanceGenerations":"Indicates whether current or previous generation instance types are included. The current generation instance types are recommended for use. Current generation instance types are typically the latest two to three generations in each instance family. For more information, see [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) in the *Amazon EC2 User Guide* .\\n\\nFor current generation instance types, specify `current` .\\n\\nFor previous generation instance types, specify `previous` .\\n\\nDefault: Current and previous generation instance types","LocalStorage":"Indicates whether instance types with instance store volumes are included, excluded, or required. For more information, [Amazon EC2 instance store](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html) in the *Amazon EC2 User Guide* .\\n\\n- To include instance types with instance store volumes, specify `included` .\\n- To require only instance types with instance store volumes, specify `required` .\\n- To exclude instance types with instance store volumes, specify `excluded` .\\n\\nDefault: `included`","LocalStorageTypes":"The type of local storage that is required.\\n\\n- For instance types with hard disk drive (HDD) storage, specify `hdd` .\\n- For instance types with solid state drive (SSD) storage, specify `ssd` .\\n\\nDefault: `hdd` and `ssd`","MemoryGiBPerVCpu":"The minimum and maximum amount of memory per vCPU, in GiB.\\n\\nDefault: No minimum or maximum limits","MemoryMiB":"The minimum and maximum amount of memory, in MiB.","NetworkBandwidthGbps":"The minimum and maximum amount of network bandwidth, in gigabits per second (Gbps).\\n\\nDefault: No minimum or maximum limits","NetworkInterfaceCount":"The minimum and maximum number of network interfaces.\\n\\nDefault: No minimum or maximum limits","OnDemandMaxPricePercentageOverLowestPrice":"The price protection threshold for On-Demand Instances. This is the maximum you’ll pay for an On-Demand Instance, expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance types priced above your threshold.\\n\\nThe parameter accepts an integer, which Amazon EC2 interprets as a percentage.\\n\\nTo turn off price protection, specify a high value, such as `999999` .\\n\\nThis parameter is not supported for [GetSpotPlacementScores](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html) and [GetInstanceTypesFromInstanceRequirements](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html) .\\n\\n> If you set `TargetCapacityUnitType` to `vcpu` or `memory-mib` , the price protection threshold is applied based on the per-vCPU or per-memory price instead of the per-instance price. \\n\\nDefault: `20`","RequireHibernateSupport":"Indicates whether instance types must support hibernation for On-Demand Instances.\\n\\nThis parameter is not supported for [GetSpotPlacementScores](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html) .\\n\\nDefault: `false`","SpotMaxPricePercentageOverLowestPrice":"The price protection threshold for Spot Instances. This is the maximum you’ll pay for a Spot Instance, expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance types priced above your threshold.\\n\\nThe parameter accepts an integer, which Amazon EC2 interprets as a percentage.\\n\\nTo turn off price protection, specify a high value, such as `999999` .\\n\\nThis parameter is not supported for [GetSpotPlacementScores](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html) and [GetInstanceTypesFromInstanceRequirements](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html) .\\n\\n> If you set `TargetCapacityUnitType` to `vcpu` or `memory-mib` , the price protection threshold is applied based on the per-vCPU or per-memory price instead of the per-instance price. \\n\\nDefault: `100`","TotalLocalStorageGB":"The minimum and maximum amount of total local storage, in GB.\\n\\nDefault: No minimum or maximum limits","VCpuCount":"The minimum and maximum number of vCPUs."}},"AWS::EC2::LaunchTemplate.Ipv4PrefixSpecification":{"attributes":{},"description":"Specifies an IPv4 prefix for a network interface.\\n\\n`Ipv4PrefixSpecification` is a property of [AWS::EC2::LaunchTemplate NetworkInterface](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html) .","properties":{"Ipv4Prefix":"The IPv4 prefix. For information, see [Assigning prefixes to Amazon EC2 network interfaces](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-prefix-eni.html) in the *Amazon Elastic Compute Cloud User Guide* ."}},"AWS::EC2::LaunchTemplate.Ipv6Add":{"attributes":{},"description":"Specifies an IPv6 address in an Amazon EC2 launch template.\\n\\n`Ipv6Add` is a property of [AWS::EC2::LaunchTemplate NetworkInterface](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html) .","properties":{"Ipv6Address":"One or more specific IPv6 addresses from the IPv6 CIDR block range of your subnet. You can\'t use this option if you\'re specifying a number of IPv6 addresses."}},"AWS::EC2::LaunchTemplate.Ipv6PrefixSpecification":{"attributes":{},"description":"Specifies an IPv6 prefix for a network interface.\\n\\n`Ipv6PrefixSpecification` is a property of [AWS::EC2::LaunchTemplate NetworkInterface](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html) .","properties":{"Ipv6Prefix":"The IPv6 prefix."}},"AWS::EC2::LaunchTemplate.LaunchTemplateData":{"attributes":{},"description":"The information to include in the launch template.\\n\\n> You must specify at least one parameter for the launch template data.","properties":{"BlockDeviceMappings":"The block device mapping.","CapacityReservationSpecification":"The Capacity Reservation targeting option. If you do not specify this parameter, the instance\'s Capacity Reservation preference defaults to `open` , which enables it to run in any open Capacity Reservation that has matching attributes (instance type, platform, Availability Zone).","CpuOptions":"The CPU options for the instance. For more information, see [Optimizing CPU Options](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html) in the *Amazon Elastic Compute Cloud User Guide* .","CreditSpecification":"The credit option for CPU usage of the instance. Valid only for T instances.","DisableApiStop":"Indicates whether to enable the instance for stop protection. For more information, see [Stop protection](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html#Using_StopProtection) in the *Amazon Elastic Compute Cloud User Guide* .","DisableApiTermination":"If you set this parameter to `true` , you can\'t terminate the instance using the Amazon EC2 console, CLI, or API; otherwise, you can. To change this attribute after launch, use [ModifyInstanceAttribute](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceAttribute.html) . Alternatively, if you set `InstanceInitiatedShutdownBehavior` to `terminate` , you can terminate the instance by running the shutdown command from the instance.","EbsOptimized":"Indicates whether the instance is optimized for Amazon EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal Amazon EBS I/O performance. This optimization isn\'t available with all instance types. Additional usage charges apply when using an EBS-optimized instance.","ElasticGpuSpecifications":"An elastic GPU to associate with the instance.","ElasticInferenceAccelerators":"The elastic inference accelerator for the instance.","EnclaveOptions":"Indicates whether the instance is enabled for AWS Nitro Enclaves. For more information, see [What is AWS Nitro Enclaves?](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html) in the *AWS Nitro Enclaves User Guide* .\\n\\nYou can\'t enable AWS Nitro Enclaves and hibernation on the same instance.","HibernationOptions":"Indicates whether an instance is enabled for hibernation. This parameter is valid only if the instance meets the [hibernation prerequisites](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hibernating-prerequisites.html) . For more information, see [Hibernate your instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html) in the *Amazon Elastic Compute Cloud User Guide* .","IamInstanceProfile":"The name or Amazon Resource Name (ARN) of an IAM instance profile.","ImageId":"The ID of the AMI. Alternatively, you can specify a Systems Manager parameter, which will resolve to an AMI ID on launch.\\n\\nValid formats:\\n\\n- `ami-17characters00000`\\n- `resolve:ssm:parameter-name`\\n- `resolve:ssm:parameter-name:version-number`\\n- `resolve:ssm:parameter-name:label`\\n\\nFor more information, see [Use a Systems Manager parameter to find an AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/finding-an-ami.html#using-systems-manager-parameter-to-find-AMI) in the *Amazon Elastic Compute Cloud User Guide* .","InstanceInitiatedShutdownBehavior":"Indicates whether an instance stops or terminates when you initiate shutdown from the instance (using the operating system command for system shutdown).\\n\\nDefault: `stop`","InstanceMarketOptions":"The market (purchasing) option for the instances.","InstanceRequirements":"The attributes for the instance types. When you specify instance attributes, Amazon EC2 will identify instance types with these attributes.\\n\\nYou must specify `VCpuCount` and `MemoryMiB` . All other attributes are optional. Any unspecified optional attribute is set to its default.\\n\\nWhen you specify multiple attributes, you get instance types that satisfy all of the specified attributes. If you specify multiple values for an attribute, you get instance types that satisfy any of the specified values.\\n\\nTo limit the list of instance types from which Amazon EC2 can identify matching instance types, you can use one of the following parameters, but not both in the same request:\\n\\n- `AllowedInstanceTypes` - The instance types to include in the list. All other instance types are ignored, even if they match your specified attributes.\\n- `ExcludedInstanceTypes` - The instance types to exclude from the list, even if they match your specified attributes.\\n\\n> If you specify `InstanceRequirements` , you can\'t specify `InstanceType` .\\n> \\n> Attribute-based instance type selection is only supported when using Auto Scaling groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in the [launch instance wizard](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html) , or with the [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API or [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) AWS CloudFormation resource, you can\'t specify `InstanceRequirements` . \\n\\nFor more information, see [Attribute-based instance type selection for EC2 Fleet](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html) , [Attribute-based instance type selection for Spot Fleet](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-attribute-based-instance-type-selection.html) , and [Spot placement score](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-placement-score.html) in the *Amazon EC2 User Guide* .","InstanceType":"The instance type. For more information, see [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) in the *Amazon Elastic Compute Cloud User Guide* .\\n\\nIf you specify `InstanceType` , you can\'t specify `InstanceRequirements` .","KernelId":"The ID of the kernel.\\n\\nWe recommend that you use PV-GRUB instead of kernels and RAM disks. For more information, see [User Provided Kernels](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedkernels.html) in the *Amazon EC2 User Guide* .","KeyName":"The name of the key pair. You can create a key pair using [CreateKeyPair](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateKeyPair.html) or [ImportKeyPair](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportKeyPair.html) .\\n\\n> If you do not specify a key pair, you can\'t connect to the instance unless you choose an AMI that is configured to allow users another way to log in.","LicenseSpecifications":"The license configurations.","MaintenanceOptions":"The maintenance options of your instance.","MetadataOptions":"The metadata options for the instance. For more information, see [Instance metadata and user data](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) in the *Amazon Elastic Compute Cloud User Guide* .","Monitoring":"The monitoring for the instance.","NetworkInterfaces":"One or more network interfaces. If you specify a network interface, you must specify any security groups and subnets as part of the network interface.","Placement":"The placement for the instance.","PrivateDnsNameOptions":"The hostname type for EC2 instances launched into this subnet and how DNS A and AAAA record queries should be handled. For more information, see [Amazon EC2 instance hostname types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html) in the *Amazon Elastic Compute Cloud User Guide* .","RamDiskId":"The ID of the RAM disk.\\n\\n> We recommend that you use PV-GRUB instead of kernels and RAM disks. For more information, see [User provided kernels](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedkernels.html) in the *Amazon Elastic Compute Cloud User Guide* .","SecurityGroupIds":"The IDs of the security groups. You can specify the IDs of existing security groups and references to resources created by the stack template.","SecurityGroups":"One or more security group names. For a nondefault VPC, you must use security group IDs instead. You cannot specify both a security group ID and security name in the same request.","TagSpecifications":"The tags to apply to the resources that are created during instance launch.\\n\\nYou can specify tags for the following resources only:\\n\\n- Instances\\n- Volumes\\n- Elastic graphics\\n- Spot Instance requests\\n- Network interfaces\\n\\nTo tag a resource after it has been created, see [CreateTags](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html) .\\n\\n> To tag the launch template itself, you must use the [TagSpecification](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateLaunchTemplate.html) parameter.","UserData":"The user data to make available to the instance. You must provide base64-encoded text. User data is limited to 16 KB. For more information, see [Run commands on your Linux instance at launch](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) (Linux) or [Work with instance user data](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/instancedata-add-user-data.html) (Windows) in the *Amazon Elastic Compute Cloud User Guide* .\\n\\nIf you are creating the launch template for use with AWS Batch , the user data must be provided in the [MIME multi-part archive format](https://docs.aws.amazon.com/https://cloudinit.readthedocs.io/en/latest/topics/format.html#mime-multi-part-archive) . For more information, see [Amazon EC2 user data in launch templates](https://docs.aws.amazon.com/batch/latest/userguide/launch-templates.html) in the *AWS Batch User Guide* ."}},"AWS::EC2::LaunchTemplate.LaunchTemplateElasticInferenceAccelerator":{"attributes":{},"description":"Specifies an elastic inference accelerator.\\n\\n`LaunchTemplateElasticInferenceAccelerator` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"Count":"The number of elastic inference accelerators to attach to the instance.\\n\\nDefault: 1","Type":"The type of elastic inference accelerator. The possible values are eia1.medium, eia1.large, and eia1.xlarge."}},"AWS::EC2::LaunchTemplate.LaunchTemplateTagSpecification":{"attributes":{},"description":"Specifies the tags to apply to the launch template during creation.\\n\\n`LaunchTemplateTagSpecification` is a property of [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) .","properties":{"ResourceType":"The type of resource. To tag the launch template, `ResourceType` must be `launch-template` .","Tags":"The tags for the resource."}},"AWS::EC2::LaunchTemplate.LicenseSpecification":{"attributes":{},"description":"Specifies a license configuration for an instance.\\n\\n`LicenseSpecification` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"LicenseConfigurationArn":"The Amazon Resource Name (ARN) of the license configuration."}},"AWS::EC2::LaunchTemplate.MaintenanceOptions":{"attributes":{},"description":"The maintenance options of your instance.","properties":{"AutoRecovery":"Disables the automatic recovery behavior of your instance or sets it to default."}},"AWS::EC2::LaunchTemplate.MemoryGiBPerVCpu":{"attributes":{},"description":"The minimum and maximum amount of memory per vCPU, in GiB.","properties":{"Max":"The maximum amount of memory per vCPU, in GiB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of memory per vCPU, in GiB. To specify no minimum limit, omit this parameter."}},"AWS::EC2::LaunchTemplate.MemoryMiB":{"attributes":{},"description":"The minimum and maximum amount of memory, in MiB.","properties":{"Max":"The maximum amount of memory, in MiB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of memory, in MiB. To specify no minimum limit, specify `0` ."}},"AWS::EC2::LaunchTemplate.MetadataOptions":{"attributes":{},"description":"The metadata options for the instance. For more information, see [Instance metadata and user data](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) in the *Amazon EC2 User Guide* .\\n\\n`MetadataOptions` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"HttpEndpoint":"Enables or disables the HTTP metadata endpoint on your instances. If the parameter is not specified, the default state is `enabled` .\\n\\n> If you specify a value of `disabled` , you will not be able to access your instance metadata.","HttpProtocolIpv6":"Enables or disables the IPv6 endpoint for the instance metadata service.\\n\\nDefault: `disabled`","HttpPutResponseHopLimit":"The desired HTTP PUT response hop limit for instance metadata requests. The larger the number, the further instance metadata requests can travel.\\n\\nDefault: `1`\\n\\nPossible values: Integers from 1 to 64","HttpTokens":"IMDSv2 uses token-backed sessions. Set the use of HTTP tokens to `optional` (in other words, set the use of IMDSv2 to `optional` ) or `required` (in other words, set the use of IMDSv2 to `required` ).\\n\\n- `optional` - When IMDSv2 is optional, you can choose to retrieve instance metadata with or without a session token in your request. If you retrieve the IAM role credentials without a token, the IMDSv1 role credentials are returned. If you retrieve the IAM role credentials using a valid session token, the IMDSv2 role credentials are returned.\\n- `required` - When IMDSv2 is required, you must send a session token with any instance metadata retrieval requests. In this state, retrieving the IAM role credentials always returns IMDSv2 credentials; IMDSv1 credentials are not available.\\n\\nDefault: `optional`","InstanceMetadataTags":"Set to `enabled` to allow access to instance tags from the instance metadata. Set to `disabled` to turn off access to instance tags from the instance metadata. For more information, see [Work with instance tags using the instance metadata](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#work-with-tags-in-IMDS) .\\n\\nDefault: `disabled`"}},"AWS::EC2::LaunchTemplate.Monitoring":{"attributes":{},"description":"Specifies whether detailed monitoring is enabled for an instance. For more information about detailed monitoring, see [Enable or turn off detailed monitoring for your instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch-new.html) in the *Amazon EC2 User Guide* .\\n\\n`Monitoring` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"Enabled":"Specify `true` to enable detailed monitoring. Otherwise, basic monitoring is enabled."}},"AWS::EC2::LaunchTemplate.NetworkBandwidthGbps":{"attributes":{},"description":"The minimum and maximum amount of network bandwidth, in gigabits per second (Gbps).\\n\\n> Setting the minimum bandwidth does not guarantee that your instance will achieve the minimum bandwidth. Amazon EC2 will identify instance types that support the specified minimum bandwidth, but the actual bandwidth of your instance might go below the specified minimum at times. For more information, see [Available instance bandwidth](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html#available-instance-bandwidth) in the *Amazon EC2 User Guide* .","properties":{"Max":"The maximum amount of network bandwidth, in Gbps. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of network bandwidth, in Gbps. If this parameter is not specified, there is no minimum limit."}},"AWS::EC2::LaunchTemplate.NetworkInterface":{"attributes":{},"description":"Specifies the parameters for a network interface.\\n\\n`NetworkInterface` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"AssociateCarrierIpAddress":"Indicates whether to associate a Carrier IP address with eth0 for a new network interface.\\n\\nUse this option when you launch an instance in a Wavelength Zone and want to associate a Carrier IP address with the network interface. For more information about Carrier IP addresses, see [Carrier IP addresses](https://docs.aws.amazon.com/wavelength/latest/developerguide/how-wavelengths-work.html#provider-owned-ip) in the *AWS Wavelength Developer Guide* .","AssociatePublicIpAddress":"Associates a public IPv4 address with eth0 for a new network interface.","DeleteOnTermination":"Indicates whether the network interface is deleted when the instance is terminated.","Description":"A description for the network interface.","DeviceIndex":"The device index for the network interface attachment.","Groups":"The IDs of one or more security groups.","InterfaceType":"The type of network interface. To create an Elastic Fabric Adapter (EFA), specify `efa` . For more information, see [Elastic Fabric Adapter](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html) in the *Amazon Elastic Compute Cloud User Guide* .\\n\\nIf you are not creating an EFA, specify `interface` or omit this parameter.\\n\\nValid values: `interface` | `efa`","Ipv4PrefixCount":"The number of IPv4 prefixes to be automatically assigned to the network interface. You cannot use this option if you use the `Ipv4Prefix` option.","Ipv4Prefixes":"One or more IPv4 prefixes to be assigned to the network interface. You cannot use this option if you use the `Ipv4PrefixCount` option.","Ipv6AddressCount":"The number of IPv6 addresses to assign to a network interface. Amazon EC2 automatically selects the IPv6 addresses from the subnet range. You can\'t use this option if specifying specific IPv6 addresses.","Ipv6Addresses":"One or more specific IPv6 addresses from the IPv6 CIDR block range of your subnet. You can\'t use this option if you\'re specifying a number of IPv6 addresses.","Ipv6PrefixCount":"The number of IPv6 prefixes to be automatically assigned to the network interface. You cannot use this option if you use the `Ipv6Prefix` option.","Ipv6Prefixes":"One or more IPv6 prefixes to be assigned to the network interface. You cannot use this option if you use the `Ipv6PrefixCount` option.","NetworkCardIndex":"The index of the network card. Some instance types support multiple network cards. The primary network interface must be assigned to network card index 0. The default is network card index 0.","NetworkInterfaceId":"The ID of the network interface.","PrivateIpAddress":"The primary private IPv4 address of the network interface.","PrivateIpAddresses":"One or more private IPv4 addresses.","SecondaryPrivateIpAddressCount":"The number of secondary private IPv4 addresses to assign to a network interface.","SubnetId":"The ID of the subnet for the network interface."}},"AWS::EC2::LaunchTemplate.NetworkInterfaceCount":{"attributes":{},"description":"The minimum and maximum number of network interfaces.","properties":{"Max":"The maximum number of network interfaces. To specify no maximum limit, omit this parameter.","Min":"The minimum number of network interfaces. To specify no minimum limit, omit this parameter."}},"AWS::EC2::LaunchTemplate.Placement":{"attributes":{},"description":"Specifies the placement of an instance.\\n\\n`Placement` is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"Affinity":"The affinity setting for an instance on a Dedicated Host.","AvailabilityZone":"The Availability Zone for the instance.","GroupId":"The Group Id of a placement group. You must specify the Placement Group *Group Id* to launch an instance in a shared placement group.","GroupName":"The name of the placement group for the instance.","HostId":"The ID of the Dedicated Host for the instance.","HostResourceGroupArn":"The ARN of the host resource group in which to launch the instances. If you specify a host resource group ARN, omit the *Tenancy* parameter or set it to `host` .","PartitionNumber":"The number of the partition the instance should launch in. Valid only if the placement group strategy is set to `partition` .","SpreadDomain":"Reserved for future use.","Tenancy":"The tenancy of the instance. An instance with a tenancy of dedicated runs on single-tenant hardware."}},"AWS::EC2::LaunchTemplate.PrivateDnsNameOptions":{"attributes":{},"description":"The hostname type for EC2 instances launched into this subnet and how DNS A and AAAA record queries should be handled. For more information, see [Amazon EC2 instance hostname types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html) in the *Amazon Elastic Compute Cloud User Guide* .","properties":{"EnableResourceNameDnsAAAARecord":"Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA records.","EnableResourceNameDnsARecord":"Indicates whether to respond to DNS queries for instance hostnames with DNS A records.","HostnameType":"The type of hostname for EC2 instances. For IPv4 only subnets, an instance DNS name must be based on the instance IPv4 address. For IPv6 only subnets, an instance DNS name must be based on the instance ID. For dual-stack subnets, you can specify whether DNS names use the instance IPv4 address or the instance ID. For more information, see [Amazon EC2 instance hostname types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html) in the *Amazon Elastic Compute Cloud User Guide* ."}},"AWS::EC2::LaunchTemplate.PrivateIpAdd":{"attributes":{},"description":"Specifies a secondary private IPv4 address for a network interface.\\n\\n`PrivateIpAdd` is a property of [AWS::EC2::LaunchTemplate NetworkInterface](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html) .","properties":{"Primary":"Indicates whether the private IPv4 address is the primary private IPv4 address. Only one IPv4 address can be designated as primary.","PrivateIpAddress":"The private IPv4 address."}},"AWS::EC2::LaunchTemplate.SpotOptions":{"attributes":{},"description":"Specifies options for Spot Instances.\\n\\n`SpotOptions` is a property of [AWS::EC2::LaunchTemplate InstanceMarketOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions.html) .","properties":{"BlockDurationMinutes":"Deprecated.","InstanceInterruptionBehavior":"The behavior when a Spot Instance is interrupted. The default is `terminate` .","MaxPrice":"The maximum hourly price you\'re willing to pay for the Spot Instances. We do not recommend using this parameter because it can lead to increased interruptions. If you do not specify this parameter, you will pay the current Spot price.\\n\\n> If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.","SpotInstanceType":"The Spot Instance request type.\\n\\nIf you are using Spot Instances with an Auto Scaling group, use `one-time` requests, as the Amazon EC2 Auto Scaling service handles requesting new Spot Instances whenever the group is below its desired capacity.","ValidUntil":"The end date of the request, in UTC format ( *YYYY-MM-DD* T *HH:MM:SS* Z). Supported only for persistent requests.\\n\\n- For a persistent request, the request remains active until the `ValidUntil` date and time is reached. Otherwise, the request remains active until you cancel it.\\n- For a one-time request, `ValidUntil` is not supported. The request remains active until all instances launch or you cancel the request.\\n\\nDefault: 7 days from the current date"}},"AWS::EC2::LaunchTemplate.TagSpecification":{"attributes":{},"description":"Specifies the tags to apply to a resource when the resource is created for the launch template.\\n\\n`TagSpecification` is a property type of [`TagSpecifications`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-tagspecifications) . [`TagSpecifications`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-tagspecifications) is a property of [AWS::EC2::LaunchTemplate LaunchTemplateData](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) .","properties":{"ResourceType":"The type of resource to tag.\\n\\nThe `Valid Values` are all the resource types that can be tagged. However, when creating a launch template, you can specify tags for the following resource types only: `instance` | `volume` | `elastic-gpu` | `network-interface` | `spot-instances-request`\\n\\nTo tag a resource after it has been created, see [CreateTags](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html) .","Tags":"The tags to apply to the resource."}},"AWS::EC2::LaunchTemplate.TotalLocalStorageGB":{"attributes":{},"description":"The minimum and maximum amount of total local storage, in GB.","properties":{"Max":"The maximum amount of total local storage, in GB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of total local storage, in GB. To specify no minimum limit, omit this parameter."}},"AWS::EC2::LaunchTemplate.VCpuCount":{"attributes":{},"description":"The minimum and maximum number of vCPUs.","properties":{"Max":"The maximum number of vCPUs. To specify no maximum limit, omit this parameter.","Min":"The minimum number of vCPUs. To specify no minimum limit, specify `0` ."}},"AWS::EC2::LocalGatewayRoute":{"attributes":{"Ref":"`Ref` returns the ID of the local gateway route table and its destination address range. For example:\\n\\n`{ \\"Ref\\": \\"lgw-rtb-12346789abcdef|10.0.0.0/24\\" }`","State":"The state of the local gateway route table.","Type":"The type of local gateway route."},"description":"Creates a static route for the specified local gateway route table. You must specify one of the following targets:\\n\\n- `LocalGatewayVirtualInterfaceGroupId`\\n- `NetworkInterfaceId`","properties":{"DestinationCidrBlock":"The CIDR block used for destination matches.","LocalGatewayRouteTableId":"The ID of the local gateway route table.","LocalGatewayVirtualInterfaceGroupId":"The ID of the virtual interface group.","NetworkInterfaceId":"The ID of the network interface."}},"AWS::EC2::LocalGatewayRouteTable":{"attributes":{"LocalGatewayRouteTableArn":"The Amazon Resource Name (ARN) of the local gateway route table.","LocalGatewayRouteTableId":"The ID of the local gateway route table.","OutpostArn":"The Amazon Resource Name (ARN) of the Outpost.","OwnerId":"The ID of the AWS account that owns the local gateway route table.","Ref":"`Ref` returns the ID of the local gateway route table. For example:\\n\\n`{ \\"Ref\\": \\"lgw-rtb-059615ef7deEXAMPLE\\" }`","State":"The state of the local gateway route table."},"description":"Describes a local gateway route table.","properties":{"LocalGatewayId":"The ID of the local gateway.","Mode":"The mode of the local gateway route table.","Tags":"The tags assigned to the local gateway route table."}},"AWS::EC2::LocalGatewayRouteTableVPCAssociation":{"attributes":{"LocalGatewayId":"The ID of the local gateway.","LocalGatewayRouteTableVpcAssociationId":"The ID of the association.","Ref":"`Ref` returns the ID of the local gateway route table VPC association. For example:\\n\\n`{ \\"Ref\\": \\"lgw-vpc-assoc-0ee765bcc8EXAMPLE\\" }`","State":"The state of the association."},"description":"Associates the specified VPC with the specified local gateway route table.","properties":{"LocalGatewayRouteTableId":"The ID of the local gateway route table.","Tags":"The tags assigned to the association.","VpcId":"The ID of the VPC."}},"AWS::EC2::LocalGatewayRouteTableVirtualInterfaceGroupAssociation":{"attributes":{"LocalGatewayId":"The ID of the local gateway.","LocalGatewayRouteTableArn":"The Amazon Resource Name (ARN) of the local gateway route table for the virtual interface group.","LocalGatewayRouteTableVirtualInterfaceGroupAssociationId":"The ID of the association.","OwnerId":"The ID of the AWS account that owns the local gateway virtual interface group association.","Ref":"`Ref` returns the ID of the local gateway route table virtual interface group association. For example:\\n\\n`{ \\"Ref\\": \\"lgw-vif-grp-assoc-07145b276bEXAMPLE\\" }`","State":"The state of the association."},"description":"Describes an association between a local gateway route table and a virtual interface group.","properties":{"LocalGatewayRouteTableId":"The ID of the local gateway route table.","LocalGatewayVirtualInterfaceGroupId":"The ID of the virtual interface group.","Tags":"The tags assigned to the association."}},"AWS::EC2::NatGateway":{"attributes":{"NatGatewayId":"The ID of the NAT gateway.","Ref":"`Ref` returns the resource name. For example, `nat-0a12bc456789de0fg` ."},"description":"Specifies a network address translation (NAT) gateway in the specified subnet. You can create either a public NAT gateway or a private NAT gateway. The default is a public NAT gateway. If you create a public NAT gateway, you must specify an elastic IP address.\\n\\nWith a NAT gateway, instances in a private subnet can connect to the internet, other AWS services, or an on-premises network using the IP address of the NAT gateway.\\n\\nIf you add a default route ( `AWS::EC2::Route` resource) that points to a NAT gateway, specify the NAT gateway ID for the route\'s `NatGatewayId` property.\\n\\nFor more information, see [NAT Gateways](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) in the *Amazon VPC User Guide* .","properties":{"AllocationId":"[Public NAT gateway only] The allocation ID of the Elastic IP address that\'s associated with the NAT gateway. This property is required for a public NAT gateway and cannot be specified with a private NAT gateway.","ConnectivityType":"Indicates whether the NAT gateway supports public or private connectivity. The default is public connectivity.","MaxDrainDurationSeconds":"The maximum amount of time to wait (in seconds) before forcibly releasing the IP addresses if connections are still in progress. Default value is 350 seconds.","PrivateIpAddress":"The private IPv4 address to assign to the NAT gateway. If you don\'t provide an address, a private IPv4 address will be automatically assigned.","SecondaryAllocationIds":"Secondary EIP allocation IDs. For more information, see [Create a NAT gateway](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-creating) in the *Amazon VPC User Guide* .","SecondaryPrivateIpAddressCount":"[Private NAT gateway only] The number of secondary private IPv4 addresses you want to assign to the NAT gateway. For more information about secondary addresses, see [Create a NAT gateway](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-creating) in the *Amazon Virtual Private Cloud User Guide* .\\n\\n> `SecondaryPrivateIpAddressCount` and `SecondaryPrivateIpAddresses` cannot be set at the same time.","SecondaryPrivateIpAddresses":"Secondary private IPv4 addresses. For more information about secondary addresses, see [Create a NAT gateway](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-creating) in the *Amazon Virtual Private Cloud User Guide* .\\n\\n> `SecondaryPrivateIpAddressCount` and `SecondaryPrivateIpAddresses` cannot be set at the same time.","SubnetId":"The ID of the subnet in which the NAT gateway is located.","Tags":"The tags for the NAT gateway."}},"AWS::EC2::NetworkAcl":{"attributes":{"Id":"The ID of the network ACL.","Ref":"`Ref` returns the resource name."},"description":"Specifies a network ACL for your VPC.","properties":{"Tags":"The tags for the network ACL.","VpcId":"The ID of the VPC for the network ACL."}},"AWS::EC2::NetworkAclEntry":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"Specifies an entry, known as a rule, in a network ACL with a rule number you specify. Each network ACL has a set of numbered ingress rules and a separate set of numbered egress rules.\\n\\nFor information about the protocol value, see [Protocol Numbers](https://docs.aws.amazon.com/https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) on the Internet Assigned Numbers Authority (IANA) website.","properties":{"CidrBlock":"The IPv4 CIDR range to allow or deny, in CIDR notation (for example, 172.16.0.0/24). Requirement is conditional: You must specify the `CidrBlock` or `Ipv6CidrBlock` property.","Egress":"Whether this rule applies to egress traffic from the subnet ( `true` ) or ingress traffic to the subnet ( `false` ). By default, AWS CloudFormation specifies `false` .","Icmp":"The Internet Control Message Protocol (ICMP) code and type. Requirement is conditional: Required if specifying 1 (ICMP) for the protocol parameter.","Ipv6CidrBlock":"The IPv6 network range to allow or deny, in CIDR notation. Requirement is conditional: You must specify the `CidrBlock` or `Ipv6CidrBlock` property.","NetworkAclId":"The ID of the ACL for the entry.","PortRange":"The range of port numbers for the UDP/TCP protocol. Conditional required if specifying 6 (TCP) or 17 (UDP) for the protocol parameter.","Protocol":"The IP protocol that the rule applies to. You must specify -1 or a protocol number. You can specify -1 for all protocols.\\n\\n> If you specify -1, all ports are opened and the `PortRange` property is ignored.","RuleAction":"Whether to allow or deny traffic that matches the rule; valid values are \\"allow\\" or \\"deny\\".","RuleNumber":"Rule number to assign to the entry, such as 100. ACL entries are processed in ascending order by rule number. Entries can\'t use the same rule number unless one is an egress rule and the other is an ingress rule."}},"AWS::EC2::NetworkAclEntry.Icmp":{"attributes":{},"description":"Describes the ICMP type and code.","properties":{"Code":"The Internet Control Message Protocol (ICMP) code. You can use -1 to specify all ICMP codes for the given ICMP type. Requirement is conditional: Required if you specify 1 (ICMP) for the protocol parameter.","Type":"The Internet Control Message Protocol (ICMP) type. You can use -1 to specify all ICMP types. Conditional requirement: Required if you specify 1 (ICMP) for the `CreateNetworkAclEntry` protocol parameter."}},"AWS::EC2::NetworkAclEntry.PortRange":{"attributes":{},"description":"Describes a range of ports.","properties":{"From":"The first port in the range. Required if you specify 6 (TCP) or 17 (UDP) for the protocol parameter.","To":"The last port in the range. Required if you specify 6 (TCP) or 17 (UDP) for the protocol parameter."}},"AWS::EC2::NetworkInsightsAccessScope":{"attributes":{"CreatedDate":"The creation date.","NetworkInsightsAccessScopeArn":"The ARN of the Network Access Scope.","NetworkInsightsAccessScopeId":"The ID of the Network Access Scope.","Ref":"`Ref` returns the ID of the network insights scope.","UpdatedDate":"The last updated date."},"description":"Describes a Network Access Scope. A Network Access Scope defines outbound (egress) and inbound (ingress) traffic patterns, including sources, destinations, paths, and traffic types.\\n\\nNetwork Access Analyzer identifies unintended network access to your resources on AWS . When you start an analysis on a Network Access Scope, Network Access Analyzer produces findings. For more information, see the [Network Access Analyzer User Guide](https://docs.aws.amazon.com/vpc/latest/network-access-analyzer/) .","properties":{"ExcludePaths":"The paths to exclude.","MatchPaths":"The paths to match.","Tags":"The tags."}},"AWS::EC2::NetworkInsightsAccessScope.AccessScopePathRequest":{"attributes":{},"description":"Describes a path.","properties":{"Destination":"The destination.","Source":"The source.","ThroughResources":"The through resources."}},"AWS::EC2::NetworkInsightsAccessScope.PacketHeaderStatementRequest":{"attributes":{},"description":"Describes a packet header statement.","properties":{"DestinationAddresses":"The destination addresses.","DestinationPorts":"The destination ports.","DestinationPrefixLists":"The destination prefix lists.","Protocols":"The protocols.","SourceAddresses":"The source addresses.","SourcePorts":"The source ports.","SourcePrefixLists":"The source prefix lists."}},"AWS::EC2::NetworkInsightsAccessScope.PathStatementRequest":{"attributes":{},"description":"Describes a path statement.","properties":{"PacketHeaderStatement":"The packet header statement.","ResourceStatement":"The resource statement."}},"AWS::EC2::NetworkInsightsAccessScope.ResourceStatementRequest":{"attributes":{},"description":"Describes a resource statement.","properties":{"ResourceTypes":"The resource types.","Resources":"The resources."}},"AWS::EC2::NetworkInsightsAccessScope.ThroughResourcesStatementRequest":{"attributes":{},"description":"Describes a through resource statement.","properties":{"ResourceStatement":"The resource statement."}},"AWS::EC2::NetworkInsightsAccessScopeAnalysis":{"attributes":{"AnalyzedEniCount":"The number of network interfaces analyzed.","EndDate":"The end date of the analysis.","FindingsFound":"Indicates whether there are findings (true | false | unknown).","NetworkInsightsAccessScopeAnalysisArn":"The ARN of the Network Access Scope analysis.","NetworkInsightsAccessScopeAnalysisId":"The ID of the Network Access Scope analysis.","Ref":"`Ref` returns the ID of the network insights analysis.","StartDate":"The start date of the analysis.","Status":"The status of the analysis (running | succeeded | failed).","StatusMessage":"The status message."},"description":"Describes a Network Access Scope analysis.","properties":{"NetworkInsightsAccessScopeId":"The ID of the Network Access Scope.","Tags":"The tags."}},"AWS::EC2::NetworkInsightsAnalysis":{"attributes":{"AlternatePathHints":"Potential intermediate components.","Explanations":"The explanations. For more information, see [Reachability Analyzer explanation codes](https://docs.aws.amazon.com/vpc/latest/reachability/explanation-codes.html) .","ForwardPathComponents":"The components in the path from source to destination.","NetworkInsightsAnalysisArn":"The Amazon Resource Name (ARN) of the network insights analysis.","NetworkInsightsAnalysisId":"The ID of the network insights analysis.","NetworkPathFound":"Indicates whether the destination is reachable from the source.","Ref":"`Ref` returns the ID of the network insights analysis.","ReturnPathComponents":"The components in the path from destination to source.","StartDate":"The time the analysis started.","Status":"The status of the network insights analysis.","StatusMessage":"The status message, if the status is `failed` .","SuggestedAccounts":"The IDs of potential intermediate accounts."},"description":"Specifies a network insights analysis.","properties":{"AdditionalAccounts":"The member accounts that contain resources that the path can traverse.","FilterInArns":"The Amazon Resource Names (ARN) of the resources that the path must traverse.","NetworkInsightsPathId":"The ID of the path.","Tags":"The tags to apply."}},"AWS::EC2::NetworkInsightsAnalysis.AdditionalDetail":{"attributes":{},"description":"Describes an additional detail for a path analysis. For more information, see [Reachability Analyzer additional detail codes](https://docs.aws.amazon.com/vpc/latest/reachability/additional-detail-codes.html) .","properties":{"AdditionalDetailType":"The additional detail code.","Component":"The path component.","LoadBalancers":"The load balancers.","ServiceName":"The name of the VPC endpoint service."}},"AWS::EC2::NetworkInsightsAnalysis.AlternatePathHint":{"attributes":{},"description":"Describes an potential intermediate component of a feasible path.","properties":{"ComponentArn":"The Amazon Resource Name (ARN) of the component.","ComponentId":"The ID of the component."}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisAclRule":{"attributes":{},"description":"Describes a network access control (ACL) rule.","properties":{"Cidr":"The IPv4 address range, in CIDR notation.","Egress":"Indicates whether the rule is an outbound rule.","PortRange":"The range of ports.","Protocol":"The protocol.","RuleAction":"Indicates whether to allow or deny traffic that matches the rule.","RuleNumber":"The rule number."}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisComponent":{"attributes":{},"description":"Describes a path component.","properties":{"Arn":"The Amazon Resource Name (ARN) of the component.","Id":"The ID of the component."}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisLoadBalancerListener":{"attributes":{},"description":"Describes a load balancer listener.","properties":{"InstancePort":"[Classic Load Balancers] The back-end port for the listener.","LoadBalancerPort":"The port on which the load balancer is listening."}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisLoadBalancerTarget":{"attributes":{},"description":"Describes a load balancer target.","properties":{"Address":"The IP address.","AvailabilityZone":"The Availability Zone.","Instance":"Information about the instance.","Port":"The port on which the target is listening."}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisPacketHeader":{"attributes":{},"description":"Describes a header. Reflects any changes made by a component as traffic passes through. The fields of an inbound header are null except for the first component of a path.","properties":{"DestinationAddresses":"The destination addresses.","DestinationPortRanges":"The destination port ranges.","Protocol":"The protocol.","SourceAddresses":"The source addresses.","SourcePortRanges":"The source port ranges."}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisRouteTableRoute":{"attributes":{},"description":"Describes a route table route.","properties":{"NatGatewayId":"The ID of a NAT gateway.","NetworkInterfaceId":"The ID of a network interface.","Origin":"Describes how the route was created. The following are the possible values:\\n\\n- CreateRouteTable - The route was automatically created when the route table was created.\\n- CreateRoute - The route was manually added to the route table.\\n- EnableVgwRoutePropagation - The route was propagated by route propagation.","State":"The state. The following are the possible values:\\n\\n- active\\n- blackhole","TransitGatewayId":"The ID of a transit gateway.","VpcPeeringConnectionId":"The ID of a VPC peering connection.","destinationCidr":"The destination IPv4 address, in CIDR notation.","destinationPrefixListId":"The prefix of the AWS service .","egressOnlyInternetGatewayId":"The ID of an egress-only internet gateway.","gatewayId":"The ID of the gateway, such as an internet gateway or virtual private gateway.","instanceId":"The ID of the instance, such as a NAT instance."}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisSecurityGroupRule":{"attributes":{},"description":"Describes a security group rule.","properties":{"Cidr":"The IPv4 address range, in CIDR notation.","Direction":"The direction. The following are the possible values:\\n\\n- egress\\n- ingress","PortRange":"The port range.","PrefixListId":"The prefix list ID.","Protocol":"The protocol name.","SecurityGroupId":"The security group ID."}},"AWS::EC2::NetworkInsightsAnalysis.Explanation":{"attributes":{},"description":"Describes an explanation code for an unreachable path. For more information, see [Reachability Analyzer explanation codes](https://docs.aws.amazon.com/vpc/latest/reachability/explanation-codes.html) .","properties":{"Acl":"The network ACL.","AclRule":"The network ACL rule.","Address":"The IPv4 address, in CIDR notation.","Addresses":"The IPv4 addresses, in CIDR notation.","AttachedTo":"The resource to which the component is attached.","AvailabilityZones":"The Availability Zones.","Cidrs":"The CIDR ranges.","ClassicLoadBalancerListener":"The listener for a Classic Load Balancer.","Component":"The component.","ComponentAccount":"The AWS account for the component.","ComponentRegion":"The Region for the component.","CustomerGateway":"The customer gateway.","Destination":"The destination.","DestinationVpc":"The destination VPC.","Direction":"The direction. The following are the possible values:\\n\\n- egress\\n- ingress","ElasticLoadBalancerListener":"The load balancer listener.","ExplanationCode":"The explanation code.","IngressRouteTable":"The route table.","InternetGateway":"The internet gateway.","LoadBalancerArn":"The Amazon Resource Name (ARN) of the load balancer.","LoadBalancerListenerPort":"The listener port of the load balancer.","LoadBalancerTarget":"The target.","LoadBalancerTargetGroup":"The target group.","LoadBalancerTargetGroups":"The target groups.","LoadBalancerTargetPort":"The target port.","MissingComponent":"The missing component.","NatGateway":"The NAT gateway.","NetworkInterface":"The network interface.","PacketField":"The packet field.","Port":"The port.","PortRanges":"The port ranges.","PrefixList":"The prefix list.","Protocols":"The protocols.","RouteTable":"The route table.","RouteTableRoute":"The route table route.","SecurityGroup":"The security group.","SecurityGroupRule":"The security group rule.","SecurityGroups":"The security groups.","SourceVpc":"The source VPC.","State":"The state.","Subnet":"The subnet.","SubnetRouteTable":"The route table for the subnet.","TransitGateway":"The transit gateway.","TransitGatewayAttachment":"The transit gateway attachment.","TransitGatewayRouteTable":"The transit gateway route table.","TransitGatewayRouteTableRoute":"The transit gateway route table route.","Vpc":"The component VPC.","VpcPeeringConnection":"The VPC peering connection.","VpnConnection":"The VPN connection.","VpnGateway":"The VPN gateway.","vpcEndpoint":"The VPC endpoint."}},"AWS::EC2::NetworkInsightsAnalysis.PathComponent":{"attributes":{},"description":"Describes a path component.","properties":{"AclRule":"The network ACL rule.","AdditionalDetails":"The additional details.","Component":"The component.","DestinationVpc":"The destination VPC.","ElasticLoadBalancerListener":"The load balancer listener.","Explanations":"The explanation codes.","InboundHeader":"The inbound header.","OutboundHeader":"The outbound header.","RouteTableRoute":"The route table route.","SecurityGroupRule":"The security group rule.","SequenceNumber":"The sequence number.","ServiceName":"The name of the VPC endpoint service.","SourceVpc":"The source VPC.","Subnet":"The subnet.","TransitGateway":"The transit gateway.","TransitGatewayRouteTableRoute":"The route in a transit gateway route table.","Vpc":"The component VPC."}},"AWS::EC2::NetworkInsightsAnalysis.PortRange":{"attributes":{},"description":"Describes a range of ports.","properties":{"From":"The first port in the range.","To":"The last port in the range."}},"AWS::EC2::NetworkInsightsAnalysis.TransitGatewayRouteTableRoute":{"attributes":{},"description":"Describes a route in a transit gateway route table.","properties":{"AttachmentId":"The ID of the route attachment.","DestinationCidr":"The CIDR block used for destination matches.","PrefixListId":"The ID of the prefix list.","ResourceId":"The ID of the resource for the route attachment.","ResourceType":"The resource type for the route attachment.","RouteOrigin":"The route origin. The following are the possible values:\\n\\n- static\\n- propagated","State":"The state of the route."}},"AWS::EC2::NetworkInsightsPath":{"attributes":{"CreatedDate":"The time stamp when the path was created.","DestinationArn":"The Amazon Resource Name (ARN) of the destination.","NetworkInsightsPathArn":"The Amazon Resource Name (ARN) of the path.","NetworkInsightsPathId":"The ID of the path.","Ref":"`Ref` returns the ID of the path.","SourceArn":"The Amazon Resource Name (ARN) of the source."},"description":"Specifies a path to analyze for reachability.\\n\\nVPC Reachability Analyzer enables you to analyze and debug network reachability between two resources in your virtual private cloud (VPC). For more information, see the [Reachability Analyzer User Guide](https://docs.aws.amazon.com/vpc/latest/reachability/what-is-reachability-analyzer.html) .","properties":{"Destination":"The ID or ARN of the destination. If the resource is in another account, you must specify an ARN.","DestinationIp":"The IP address of the destination.","DestinationPort":"The destination port.","FilterAtDestination":"Scopes the analysis to network paths that match specific filters at the destination. If you specify this parameter, you can\'t specify the parameter for the destination IP address.","FilterAtSource":"Scopes the analysis to network paths that match specific filters at the source. If you specify this parameter, you can\'t specify the parameters for the source IP address or the destination port.","Protocol":"The protocol.","Source":"The ID or ARN of the source. If the resource is in another account, you must specify an ARN.","SourceIp":"The IP address of the source.","Tags":"The tags to add to the path."}},"AWS::EC2::NetworkInsightsPath.FilterPortRange":{"attributes":{},"description":"Describes a port range.","properties":{"FromPort":"The first port in the range.","ToPort":"The last port in the range."}},"AWS::EC2::NetworkInsightsPath.PathFilter":{"attributes":{},"description":"Describes a set of filters for a path analysis. Use path filters to scope the analysis when there can be multiple resulting paths.","properties":{"DestinationAddress":"The destination IPv4 address.","DestinationPortRange":"The destination port range.","SourceAddress":"The source IPv4 address.","SourcePortRange":"The source port range."}},"AWS::EC2::NetworkInterface":{"attributes":{"Id":"The ID of the network interface.","PrimaryPrivateIpAddress":"The primary private IP address of the network interface. For example, `10.0.0.192` .","Ref":"`Ref` returns the ID of the network interface.","SecondaryPrivateIpAddresses":"The secondary private IP addresses of the network interface. For example, `[\\"10.0.0.161\\", \\"10.0.0.162\\", \\"10.0.0.163\\"]` ."},"description":"Describes a network interface in an Amazon EC2 instance for AWS CloudFormation .","properties":{"Description":"A description for the network interface.","GroupSet":"The security group IDs associated with this network interface.","InterfaceType":"The type of network interface. The default is `interface` . The supported values are `efa` and `trunk` .","Ipv6AddressCount":"The number of IPv6 addresses to assign to a network interface. Amazon EC2 automatically selects the IPv6 addresses from the subnet range. To specify specific IPv6 addresses, use the `Ipv6Addresses` property and don\'t specify this property.","Ipv6Addresses":"One or more specific IPv6 addresses from the IPv6 CIDR block range of your subnet to associate with the network interface. If you\'re specifying a number of IPv6 addresses, use the `Ipv6AddressCount` property and don\'t specify this property.","PrivateIpAddress":"Assigns a single private IP address to the network interface, which is used as the primary private IP address. If you want to specify multiple private IP address, use the `PrivateIpAddresses` property.","PrivateIpAddresses":"Assigns private IP addresses to the network interface. You can specify a primary private IP address by setting the value of the `Primary` property to `true` in the `PrivateIpAddressSpecification` property. If you want EC2 to automatically assign private IP addresses, use the `SecondaryPrivateIpAddressCount` property and do not specify this property.","SecondaryPrivateIpAddressCount":"The number of secondary private IPv4 addresses to assign to a network interface. When you specify a number of secondary IPv4 addresses, Amazon EC2 selects these IP addresses within the subnet\'s IPv4 CIDR range. You can\'t specify this option and specify more than one private IP address using `privateIpAddresses` .\\n\\nYou can\'t specify a count of private IPv4 addresses if you\'ve specified one of the following: specific private IPv4 addresses, specific IPv4 prefixes, or a count of IPv4 prefixes.","SourceDestCheck":"Enable or disable source/destination checks, which ensure that the instance is either the source or the destination of any traffic that it receives. If the value is `true` , source/destination checks are enabled; otherwise, they are disabled. The default value is `true` . You must disable source/destination checks if the instance runs services such as network address translation, routing, or firewalls.","SubnetId":"The ID of the subnet to associate with the network interface.","Tags":"An arbitrary set of tags (key-value pairs) for this network interface."}},"AWS::EC2::NetworkInterface.InstanceIpv6Address":{"attributes":{},"description":"Describes the IPv6 addresses to associate with the network interface.","properties":{"Ipv6Address":"An IPv6 address to associate with the network interface."}},"AWS::EC2::NetworkInterface.PrivateIpAddressSpecification":{"attributes":{},"description":"Describes a secondary private IPv4 address for a network interface.","properties":{"Primary":"Sets the private IP address as the primary private address. You can set only one primary private IP address. If you don\'t specify a primary private IP address, Amazon EC2 automatically assigns a primary private IP address.","PrivateIpAddress":"The private IP address of the network interface."}},"AWS::EC2::NetworkInterfaceAttachment":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"Attaches an elastic network interface (ENI) to an Amazon EC2 instance. You can use this resource type to attach additional network interfaces to an instance without interruption.","properties":{"DeleteOnTermination":"Whether to delete the network interface when the instance terminates. By default, this value is set to `true` .","DeviceIndex":"The network interface\'s position in the attachment order. For example, the first attached network interface has a `DeviceIndex` of 0.","InstanceId":"The ID of the instance to which you will attach the ENI.","NetworkInterfaceId":"The ID of the ENI that you want to attach."}},"AWS::EC2::NetworkInterfacePermission":{"attributes":{"Ref":"`Ref` returns the resource name. For example: `eni-perm-055663b682ea24b48` ."},"description":"Specifies a permission for an Amazon EC2 network interface. For example, you can grant an AWS authorized partner account permission to attach the specified network interface to an instance in their account.","properties":{"AwsAccountId":"The AWS account ID.","NetworkInterfaceId":"The ID of the network interface.","Permission":"The type of permission to grant: `INSTANCE-ATTACH` or `EIP-ASSOCIATE` ."}},"AWS::EC2::NetworkPerformanceMetricSubscription":{"attributes":{"Ref":"`Ref` returns the `primaryIdentifier` property, which consists of the following properties: `source` , `destination` , `metric` , and `statistic` , with each value separated by a pipe (|). For example, `{ \\"Ref\\": \\"us-east-1|us-east-2|aggregate-latency|p50\\" }` ."},"description":"Describes Infrastructure Performance subscriptions.","properties":{"Destination":"The Region or Availability Zone that\'s the target for the subscription. For example, `eu-west-1` .","Metric":"The metric used for the subscription.","Source":"The Region or Availability Zone that\'s the source for the subscription. For example, `us-east-1` .","Statistic":"The statistic used for the subscription."}},"AWS::EC2::PlacementGroup":{"attributes":{"GroupName":"The name of the placement group.","Ref":"`Ref` returns the name of the placement group."},"description":"Specifies a placement group in which to launch instances. The strategy of the placement group determines how the instances are organized within the group.\\n\\nA `cluster` placement group is a logical grouping of instances within a single Availability Zone that benefit from low network latency, high network throughput. A `spread` placement group places instances on distinct hardware. A `partition` placement group places groups of instances in different partitions, where instances in one partition do not share the same hardware with instances in another partition.\\n\\nFor more information, see [Placement Groups](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html) in the *Amazon EC2 User Guide* .","properties":{"PartitionCount":"The number of partitions. Valid only when *Strategy* is set to `partition` .","SpreadLevel":"Determines how placement groups spread instances.\\n\\n- Host – You can use `host` only with Outpost placement groups.\\n- Rack – No usage restrictions.","Strategy":"The placement strategy.","Tags":"The tags to apply to the new placement group."}},"AWS::EC2::PrefixList":{"attributes":{"Arn":"The ARN of the prefix list. For example, `arn:aws:ec2:us-east-1:123456789012:prefix-list/pl-0123123123123abcd` .","OwnerId":"The ID of the owner of the prefix list. For example, `123456789012` .","PrefixListId":"The ID of the prefix list. For example, `pl-0123123123123abcd` .","Ref":"`Ref` returns the ID of the prefix list.","Version":"The version of the prefix list. For example, `1` ."},"description":"Specifies a managed prefix list. You can add one or more entries to the prefix list. Each entry consists of a CIDR block and an optional description.","properties":{"AddressFamily":"The IP address type.\\n\\nValid Values: `IPv4` | `IPv6`","Entries":"One or more entries for the prefix list.","MaxEntries":"The maximum number of entries for the prefix list.","PrefixListName":"A name for the prefix list.\\n\\nConstraints: Up to 255 characters in length. The name cannot start with `com.amazonaws` .","Tags":"The tags for the prefix list."}},"AWS::EC2::PrefixList.Entry":{"attributes":{},"description":"An entry for a prefix list.","properties":{"Cidr":"The CIDR block.","Description":"A description for the entry.\\n\\nConstraints: Up to 255 characters in length."}},"AWS::EC2::Route":{"attributes":{"Ref":"`Ref` returns the ID of the route."},"description":"Specifies a route in a route table.\\n\\nYou must specify either `DestinationCidrBlock` or `DestinationIpv6CidrBlock` , plus the ID of one of the target resources.\\n\\nIf you create a route that references a transit gateway in the same template where you create the transit gateway, you must declare a dependency on the transit gateway attachment. The route table cannot use the transit gateway until it has successfully attached to the VPC. Add a [DependsOn Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) in the `AWS::EC2::Route` resource to explicitly declare a dependency on the `AWS::EC2::TransitGatewayAttachment` resource.","properties":{"CarrierGatewayId":"The ID of the carrier gateway.\\n\\nYou can only use this option when the VPC contains a subnet which is associated with a Wavelength Zone.","DestinationCidrBlock":"The IPv4 CIDR address block used for the destination match. Routing decisions are based on the most specific match. We modify the specified CIDR block to its canonical form; for example, if you specify `100.68.0.18/18` , we modify it to `100.68.0.0/18` .","DestinationIpv6CidrBlock":"The IPv6 CIDR block used for the destination match. Routing decisions are based on the most specific match.","EgressOnlyInternetGatewayId":"[IPv6 traffic only] The ID of an egress-only internet gateway.","GatewayId":"The ID of an internet gateway or virtual private gateway attached to your VPC.","InstanceId":"The ID of a NAT instance in your VPC. The operation fails if you specify an instance ID unless exactly one network interface is attached.","LocalGatewayId":"The ID of the local gateway.","NatGatewayId":"[IPv4 traffic only] The ID of a NAT gateway.","NetworkInterfaceId":"The ID of a network interface.","RouteTableId":"The ID of the route table for the route.","TransitGatewayId":"The ID of a transit gateway.","VpcEndpointId":"The ID of a VPC endpoint. Supported for Gateway Load Balancer endpoints only.","VpcPeeringConnectionId":"The ID of a VPC peering connection."}},"AWS::EC2::RouteTable":{"attributes":{"Ref":"`Ref` returns the ID of the route table.","RouteTableId":"The ID of the route table."},"description":"Specifies a route table for the specified VPC. After you create a route table, you can add routes and associate the table with a subnet.\\n\\nFor more information, see [Route Tables](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html) in the *Amazon VPC User Guide* .","properties":{"Tags":"Any tags assigned to the route table.","VpcId":"The ID of the VPC."}},"AWS::EC2::SecurityGroup":{"attributes":{"GroupId":"The group ID of the specified security group, such as `sg-94b3a1f6` .","Ref":"`Ref` returns the resource ID.","VpcId":"The physical ID of the VPC. You can obtain the physical ID by using a reference to an [AWS::EC2::VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html) , such as: `{ \\"Ref\\" : \\"myVPC\\" }` ."},"description":"Specifies a security group. To create a security group, use the [VpcId](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-vpcid) property to specify the VPC for which to create the security group.\\n\\nIf you do not specify an egress rule, we add egress rules that allow IPv4 and IPv6 traffic on all ports and protocols to any destination. We do not add these rules if you specify your own egress rules. If you later remove your egress rules, we restore the default egress rules.\\n\\nThis type supports updates. For more information about updating stacks, see [AWS CloudFormation Stacks Updates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks.html) .\\n\\n> To cross-reference two security groups in the ingress and egress rules of those security groups, use the [AWS::EC2::SecurityGroupEgress](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html) and [AWS::EC2::SecurityGroupIngress](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-ingress.html) resources to define your rules. Do not use the embedded ingress and egress rules in the `AWS::EC2::SecurityGroup` . Doing so creates a circular dependency, which AWS CloudFormation doesn\'t allow.","properties":{"GroupDescription":"A description for the security group.\\n\\nConstraints: Up to 255 characters in length\\n\\nValid characters: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*","GroupName":"The name of the security group.\\n\\nConstraints: Up to 255 characters in length. Cannot start with `sg-` .\\n\\nValid characters: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*","SecurityGroupEgress":"The outbound rules associated with the security group. There is a short interruption during which you cannot connect to the security group.","SecurityGroupIngress":"The inbound rules associated with the security group. There is a short interruption during which you cannot connect to the security group.","Tags":"Any tags assigned to the security group.","VpcId":"The ID of the VPC for the security group."}},"AWS::EC2::SecurityGroup.Egress":{"attributes":{},"description":"Adds the specified egress rules to a security group for use with a VPC.\\n\\nAn outbound rule permits instances to send traffic to the specified destination IPv4 or IPv6 CIDR address ranges, or to the specified destination security groups for the same VPC.\\n\\nYou specify a protocol for each rule (for example, TCP). For the TCP and UDP protocols, you must also specify the destination port or port range. For the ICMP protocol, you must also specify the ICMP type and code. You can use -1 for the type or code to mean all types or all codes.\\n\\nYou must specify only one of the following properties: `CidrIp` , `CidrIpv6` , `DestinationPrefixListId` , or `DestinationSecurityGroupId` .\\n\\nYou must specify a destination security group ( `DestinationPrefixListId` or `DestinationSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ). If you do not specify one of these parameters, the stack will launch successfully but the rule will not be added to the security group.\\n\\nRule changes are propagated to affected instances as quickly as possible. However, a small delay might occur.\\n\\nFor more information about VPC security group limits, see [Amazon VPC Limits](https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html) .\\n\\nUse `SecurityGroup.Ingress` and `SecurityGroup.Egress` only when necessary, typically to allow security groups to reference each other in ingress and egress rules. Otherwise, use the embedded ingress and egress rules of the security group. For more information, see [Amazon EC2 Security Groups](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html) .\\n\\nThe EC2 Security Group Rule is an embedded property of the `AWS::EC2::SecurityGroup` type.","properties":{"CidrIp":"The IPv4 address range, in CIDR format.\\n\\nYou must specify a destination security group ( `DestinationPrefixListId` or `DestinationSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).\\n\\nFor examples of rules that you can add to security groups for specific access scenarios, see [Security group rules for different use cases](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html) in the *Amazon EC2 User Guide* .","CidrIpv6":"The IPv6 address range, in CIDR format.\\n\\nYou must specify a destination security group ( `DestinationPrefixListId` or `DestinationSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).\\n\\nFor examples of rules that you can add to security groups for specific access scenarios, see [Security group rules for different use cases](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html) in the *Amazon EC2 User Guide* .","Description":"A description for the security group rule.\\n\\nConstraints: Up to 255 characters in length. Allowed characters are a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=;{}!$*","DestinationPrefixListId":"The prefix list IDs for the destination AWS service. This is the AWS service that you want to access through a VPC endpoint from instances associated with the security group.\\n\\nYou must specify a destination security group ( `DestinationPrefixListId` or `DestinationSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).","DestinationSecurityGroupId":"The ID of the destination VPC security group.\\n\\nYou must specify a destination security group ( `DestinationPrefixListId` or `DestinationSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).","FromPort":"If the protocol is TCP or UDP, this is the start of the port range. If the protocol is ICMP or ICMPv6, this is the type number. A value of -1 indicates all ICMP/ICMPv6 types. If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.","IpProtocol":"The IP protocol name ( `tcp` , `udp` , `icmp` , `icmpv6` ) or number (see [Protocol Numbers](https://docs.aws.amazon.com/http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) ).\\n\\nUse `-1` to specify all protocols. When authorizing security group rules, specifying `-1` or a protocol number other than `tcp` , `udp` , `icmp` , or `icmpv6` allows traffic on all ports, regardless of any port range you specify. For `tcp` , `udp` , and `icmp` , you must specify a port range. For `icmpv6` , the port range is optional; if you omit the port range, traffic for all types and codes is allowed.","ToPort":"If the protocol is TCP or UDP, this is the end of the port range. If the protocol is ICMP or ICMPv6, this is the code. A value of -1 indicates all ICMP/ICMPv6 codes. If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes."}},"AWS::EC2::SecurityGroup.Ingress":{"attributes":{},"description":"Adds an inbound rule to a security group.\\n\\nAn inbound rule permits instances to receive traffic from the specified IPv4 or IPv6 CIDR address range, or from the instances associated with the specified security group.\\n\\nYou must specify only one of the following properties: `CidrIp` , `CidrIpv6` , `SourcePrefixListId` , `SourceSecurityGroupId` , or `SourceSecurityGroupName` .\\n\\nYou specify a protocol for each rule (for example, TCP). For TCP and UDP, you must also specify a port or port range. For ICMP/ICMPv6, you must also specify the ICMP/ICMPv6 type and code. You can use -1 to mean all types or all codes.\\n\\nYou must specify a source security group ( `SourcePrefixListId` , `SourceSecurityGroupId` , or `SourceSecurityGroupName` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ). If you do not specify one of these parameters, the stack will launch successfully but the rule will not be added to the security group.\\n\\nRule changes are propagated to instances within the security group as quickly as possible. However, a small delay might occur.\\n\\nThe EC2 Security Group Rule is an embedded property of the `AWS::EC2::SecurityGroup` type.","properties":{"CidrIp":"The IPv4 address range, in CIDR format.\\n\\nYou must specify a source security group ( `SourcePrefixListId` or `SourceSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).\\n\\nFor examples of rules that you can add to security groups for specific access scenarios, see [Security group rules for different use cases](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html) in the *Amazon EC2 User Guide* .","CidrIpv6":"The IPv6 address range, in CIDR format.\\n\\nYou must specify a source security group ( `SourcePrefixListId` or `SourceSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).\\n\\nFor examples of rules that you can add to security groups for specific access scenarios, see [Security group rules for different use cases](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html) in the *Amazon EC2 User Guide* .","Description":"Updates the description of an ingress (inbound) security group rule. You can replace an existing description, or add a description to a rule that did not have one previously.\\n\\nConstraints: Up to 255 characters in length. Allowed characters are a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=;{}!$*","FromPort":"If the protocol is TCP or UDP, this is the start of the port range. If the protocol is ICMP or ICMPv6, this is the type number. A value of -1 indicates all ICMP/ICMPv6 types. If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.","IpProtocol":"The IP protocol name ( `tcp` , `udp` , `icmp` , `icmpv6` ) or number (see [Protocol Numbers](https://docs.aws.amazon.com/http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) ).\\n\\nUse `-1` to specify all protocols. When authorizing security group rules, specifying `-1` or a protocol number other than `tcp` , `udp` , `icmp` , or `icmpv6` allows traffic on all ports, regardless of any port range you specify. For `tcp` , `udp` , and `icmp` , you must specify a port range. For `icmpv6` , the port range is optional; if you omit the port range, traffic for all types and codes is allowed.","SourcePrefixListId":"The ID of a prefix list.","SourceSecurityGroupId":"The ID of the security group. You must specify either the security group ID or the security group name in the request. For security groups in a nondefault VPC, you must specify the security group ID.","SourceSecurityGroupName":"[Default VPC] The name of the source security group. You must specify either the security group ID or the security group name. You can\'t specify the group name in combination with an IP address range. Creates rules that grant full ICMP, UDP, and TCP access.\\n\\nFor security groups in a nondefault VPC, you must specify the group ID.","SourceSecurityGroupOwnerId":"[nondefault VPC] The AWS account ID for the source security group, if the source security group is in a different account. You can\'t specify this property with an IP address range. Creates rules that grant full ICMP, UDP, and TCP access.\\n\\nIf you specify `SourceSecurityGroupName` or `SourceSecurityGroupId` and that security group is owned by a different account than the account creating the stack, you must specify the `SourceSecurityGroupOwnerId` ; otherwise, this property is optional.","ToPort":"If the protocol is TCP or UDP, this is the end of the port range. If the protocol is ICMP or ICMPv6, this is the code. A value of -1 indicates all ICMP/ICMPv6 codes. If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes."}},"AWS::EC2::SecurityGroupEgress":{"attributes":{"Ref":"`Ref` returns the name of the security egress rule."},"description":"Adds the specified egress rules to a security group.\\n\\nAn outbound rule permits instances to send traffic to the specified destination IPv4 or IPv6 CIDR address ranges, or to the specified destination security groups for the same VPC.\\n\\nYou specify a protocol for each rule (for example, TCP). For the TCP and UDP protocols, you must also specify the destination port or port range. For the ICMP protocol, you must also specify the ICMP type and code. You can use -1 for the type or code to mean all types or all codes.\\n\\nYou must specify only one of the following properties: `CidrIp` , `CidrIpv6` , `DestinationPrefixListId` , or `DestinationSecurityGroupId` .\\n\\nYou must specify a destination security group ( `DestinationPrefixListId` or `DestinationSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ). If you do not specify one of these parameters, the stack will launch successfully but the rule will not be added to the security group.\\n\\nRule changes are propagated to affected instances as quickly as possible. However, a small delay might occur.\\n\\nFor more information about VPC security group limits, see [Amazon VPC Limits](https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html) .\\n\\nUse `AWS::EC2::SecurityGroupIngress` and `AWS::EC2::SecurityGroupEgress` only when necessary, typically to allow security groups to reference each other in ingress and egress rules. Otherwise, use the embedded ingress and egress rules of the security group. For more information, see [Amazon EC2 Security Groups](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html) .","properties":{"CidrIp":"The IPv4 address range, in CIDR format.\\n\\nYou must specify a destination security group ( `DestinationPrefixListId` or `DestinationSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).\\n\\nFor examples of rules that you can add to security groups for specific access scenarios, see [Security group rules for different use cases](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html) in the *Amazon EC2 User Guide* .","CidrIpv6":"The IPv6 address range, in CIDR format.\\n\\nYou must specify a destination security group ( `DestinationPrefixListId` or `DestinationSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).\\n\\nFor examples of rules that you can add to security groups for specific access scenarios, see [Security group rules for different use cases](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html) in the *Amazon EC2 User Guide* .","Description":"The description of an egress (outbound) security group rule.\\n\\nConstraints: Up to 255 characters in length. Allowed characters are a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=;{}!$*","DestinationPrefixListId":"The prefix list IDs for an AWS service. This is the AWS service that you want to access through a VPC endpoint from instances associated with the security group.\\n\\nYou must specify a destination security group ( `DestinationPrefixListId` or `DestinationSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).","DestinationSecurityGroupId":"The ID of the security group.\\n\\nYou must specify a destination security group ( `DestinationPrefixListId` or `DestinationSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).","FromPort":"If the protocol is TCP or UDP, this is the start of the port range. If the protocol is ICMP or ICMPv6, this is the type number. A value of -1 indicates all ICMP/ICMPv6 types. If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.","GroupId":"The ID of the security group. You must specify either the security group ID or the security group name in the request. For security groups in a nondefault VPC, you must specify the security group ID.","IpProtocol":"The IP protocol name ( `tcp` , `udp` , `icmp` , `icmpv6` ) or number (see [Protocol Numbers](https://docs.aws.amazon.com/http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) ).\\n\\nUse `-1` to specify all protocols. When authorizing security group rules, specifying `-1` or a protocol number other than `tcp` , `udp` , `icmp` , or `icmpv6` allows traffic on all ports, regardless of any port range you specify. For `tcp` , `udp` , and `icmp` , you must specify a port range. For `icmpv6` , the port range is optional; if you omit the port range, traffic for all types and codes is allowed.","ToPort":"If the protocol is TCP or UDP, this is the end of the port range. If the protocol is ICMP or ICMPv6, this is the code. A value of -1 indicates all ICMP/ICMPv6 codes. If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes."}},"AWS::EC2::SecurityGroupIngress":{"attributes":{},"description":"Adds an inbound rule to a security group.\\n\\nAn inbound rule permits instances to receive traffic from the specified IPv4 or IPv6 CIDR address range, or from the instances associated with the specified security group.\\n\\nYou must specify only one of the following properties: `CidrIp` , `CidrIpv6` , `SourcePrefixListId` , `SourceSecurityGroupId` , or `SourceSecurityGroupName` .\\n\\nYou specify a protocol for each rule (for example, TCP). For TCP and UDP, you must also specify a port or port range. For ICMP/ICMPv6, you must also specify the ICMP/ICMPv6 type and code. You can use -1 to mean all types or all codes.\\n\\nYou must specify a source security group ( `SourcePrefixListId` , `SourceSecurityGroupId` , or `SourceSecurityGroupName` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ). If you do not specify one of these parameters, the stack will launch successfully but the rule will not be added to the security group.\\n\\nRule changes are propagated to instances within the security group as quickly as possible. However, a small delay might occur.","properties":{"CidrIp":"The IPv4 address range, in CIDR format.\\n\\nYou must specify a source security group ( `SourcePrefixListId` or `SourceSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).\\n\\nFor examples of rules that you can add to security groups for specific access scenarios, see [Security group rules for different use cases](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html) in the *Amazon EC2 User Guide* .","CidrIpv6":"The IPv6 address range, in CIDR format.\\n\\nYou must specify a source security group ( `SourcePrefixListId` or `SourceSecurityGroupId` ) or a CIDR range ( `CidrIp` or `CidrIpv6` ).\\n\\nFor examples of rules that you can add to security groups for specific access scenarios, see [Security group rules for different use cases](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html) in the *Amazon EC2 User Guide* .","Description":"Updates the description of an ingress (inbound) security group rule. You can replace an existing description, or add a description to a rule that did not have one previously.\\n\\nConstraints: Up to 255 characters in length. Allowed characters are a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=;{}!$*","FromPort":"The start of port range for the TCP and UDP protocols, or an ICMP/ICMPv6 type number. A value of `-1` indicates all ICMP/ICMPv6 types. If you specify all ICMP/ICMPv6 types, you must specify all codes.\\n\\nUse this for ICMP and any protocol that uses ports.","GroupId":"The ID of the security group.","GroupName":"The name of the security group.\\n\\nConstraints: Up to 255 characters in length. Cannot start with `sg-` .\\n\\nValid characters: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*","IpProtocol":"The IP protocol name ( `tcp` , `udp` , `icmp` , `icmpv6` ) or number (see [Protocol Numbers](https://docs.aws.amazon.com/http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) ).\\n\\nUse `-1` to specify all protocols. When authorizing security group rules, specifying `-1` or a protocol number other than `tcp` , `udp` , `icmp` , or `icmpv6` allows traffic on all ports, regardless of any port range you specify. For `tcp` , `udp` , and `icmp` , you must specify a port range. For `icmpv6` , the port range is optional; if you omit the port range, traffic for all types and codes is allowed.","SourcePrefixListId":"The ID of a prefix list.","SourceSecurityGroupId":"The ID of the security group. You must specify either the security group ID or the security group name. For security groups in a nondefault VPC, you must specify the security group ID.","SourceSecurityGroupName":"[Default VPC] The name of the source security group. You must specify either the security group ID or the security group name. You can\'t specify the group name in combination with an IP address range. Creates rules that grant full ICMP, UDP, and TCP access.\\n\\nFor security groups in a nondefault VPC, you must specify the group ID.","SourceSecurityGroupOwnerId":"[nondefault VPC] The AWS account ID for the source security group, if the source security group is in a different account. You can\'t specify this property with an IP address range. Creates rules that grant full ICMP, UDP, and TCP access.\\n\\nIf you specify `SourceSecurityGroupName` or `SourceSecurityGroupId` and that security group is owned by a different account than the account creating the stack, you must specify `SourceSecurityGroupOwnerId` ; otherwise, this property is optional.","ToPort":"The end of port range for the TCP and UDP protocols, or an ICMP/ICMPv6 code. A value of `-1` indicates all ICMP/ICMPv6 codes for the specified ICMP type. If you specify all ICMP/ICMPv6 types, you must specify all codes.\\n\\nUse this for ICMP and any protocol that uses ports."}},"AWS::EC2::SpotFleet":{"attributes":{"Id":"The ID of the Spot Fleet.","Ref":"`Ref` returns the ID of the Spot Fleet."},"description":"Specifies a Spot Fleet request.\\n\\nThe Spot Fleet request specifies the total target capacity and the On-Demand target capacity. Amazon EC2 calculates the difference between the total capacity and On-Demand capacity, and launches the difference as Spot capacity.\\n\\nYou can submit a single request that includes multiple launch specifications that vary by instance type, AMI, Availability Zone, or subnet.\\n\\nBy default, the Spot Fleet requests Spot Instances in the Spot Instance pool where the price per unit is the lowest. Each launch specification can include its own instance weighting that reflects the value of the instance type to your application workload.\\n\\nAlternatively, you can specify that the Spot Fleet distribute the target capacity across the Spot pools included in its launch specifications. By ensuring that the Spot Instances in your Spot Fleet are in different Spot pools, you can improve the availability of your fleet.\\n\\nYou can specify tags for the Spot Fleet request and instances launched by the fleet. You cannot tag other resource types in a Spot Fleet request because only the `spot-fleet-request` and `instance` resource types are supported.\\n\\nFor more information, see [Spot Fleet](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\n> We strongly discourage using the RequestSpotFleet API because it is a legacy API with no planned investment. For options for requesting Spot Instances, see [Which is the best Spot request method to use?](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-best-practices.html#which-spot-request-method-to-use) in the *Amazon EC2 User Guide for Linux Instances* .","properties":{"SpotFleetRequestConfigData":"Describes the configuration of a Spot Fleet request."}},"AWS::EC2::SpotFleet.AcceleratorCountRequest":{"attributes":{},"description":"The minimum and maximum number of accelerators (GPUs, FPGAs, or AWS Inferentia chips) on an instance. To exclude accelerator-enabled instance types, set `Max` to `0` .","properties":{"Max":"The maximum number of accelerators. To specify no maximum limit, omit this parameter. To exclude accelerator-enabled instance types, set `Max` to `0` .","Min":"The minimum number of accelerators. To specify no minimum limit, omit this parameter."}},"AWS::EC2::SpotFleet.AcceleratorTotalMemoryMiBRequest":{"attributes":{},"description":"The minimum and maximum amount of total accelerator memory, in MiB.","properties":{"Max":"The maximum amount of accelerator memory, in MiB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of accelerator memory, in MiB. To specify no minimum limit, omit this parameter."}},"AWS::EC2::SpotFleet.BaselineEbsBandwidthMbpsRequest":{"attributes":{},"description":"The minimum and maximum baseline bandwidth to Amazon EBS, in Mbps. For more information, see [Amazon EBS–optimized instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html) in the *Amazon EC2 User Guide* .","properties":{"Max":"The maximum baseline bandwidth, in Mbps. To specify no maximum limit, omit this parameter.","Min":"The minimum baseline bandwidth, in Mbps. To specify no minimum limit, omit this parameter."}},"AWS::EC2::SpotFleet.BlockDeviceMapping":{"attributes":{},"description":"Specifies a block device mapping.\\n\\nYou can specify `Ebs` or `VirtualName` , but not both.","properties":{"DeviceName":"The device name (for example, `/dev/sdh` or `xvdh` ).","Ebs":"Parameters used to automatically set up EBS volumes when the instance is launched.","NoDevice":"To omit the device from the block device mapping, specify an empty string. When this property is specified, the device is removed from the block device mapping regardless of the assigned value.","VirtualName":"The virtual device name ( `ephemeral` N). Instance store volumes are numbered starting from 0. An instance type with 2 available instance store volumes can specify mappings for `ephemeral0` and `ephemeral1` . The number of available instance store volumes depends on the instance type. After you connect to the instance, you must mount the volume.\\n\\nNVMe instance store volumes are automatically enumerated and assigned a device name. Including them in your block device mapping has no effect.\\n\\nConstraints: For M3 instances, you must specify instance store volumes in the block device mapping for the instance. When you launch an M3 instance, we ignore any instance store volumes specified in the block device mapping for the AMI."}},"AWS::EC2::SpotFleet.ClassicLoadBalancer":{"attributes":{},"description":"Specifies a Classic Load Balancer.","properties":{"Name":"The name of the load balancer."}},"AWS::EC2::SpotFleet.ClassicLoadBalancersConfig":{"attributes":{},"description":"Specifies the Classic Load Balancers to attach to a Spot Fleet. Spot Fleet registers the running Spot Instances with these Classic Load Balancers.","properties":{"ClassicLoadBalancers":"One or more Classic Load Balancers."}},"AWS::EC2::SpotFleet.EbsBlockDevice":{"attributes":{},"description":"Describes a block device for an EBS volume.","properties":{"DeleteOnTermination":"Indicates whether the EBS volume is deleted on instance termination. For more information, see [Preserving Amazon EBS volumes on instance termination](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#preserving-volumes-on-termination) in the *Amazon EC2 User Guide* .","Encrypted":"Indicates whether the encryption state of an EBS volume is changed while being restored from a backing snapshot. The effect of setting the encryption state to `true` depends on the volume origin (new or from a snapshot), starting encryption state, ownership, and whether encryption by default is enabled. For more information, see [Amazon EBS Encryption](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#encryption-parameters) in the *Amazon EC2 User Guide* .\\n\\nIn no case can you remove encryption from an encrypted volume.\\n\\nEncrypted volumes can only be attached to instances that support Amazon EBS encryption. For more information, see [Supported Instance Types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#EBSEncryption_supported_instances) .\\n\\nThis parameter is not returned by [DescribeImageAttribute](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImageAttribute.html) .","Iops":"The number of I/O operations per second (IOPS). For `gp3` , `io1` , and `io2` volumes, this represents the number of IOPS that are provisioned for the volume. For `gp2` volumes, this represents the baseline performance of the volume and the rate at which the volume accumulates I/O credits for bursting.\\n\\nThe following are the supported values for each volume type:\\n\\n- `gp3` : 3,000-16,000 IOPS\\n- `io1` : 100-64,000 IOPS\\n- `io2` : 100-64,000 IOPS\\n\\nFor `io1` and `io2` volumes, we guarantee 64,000 IOPS only for [Instances built on the Nitro System](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances) . Other instance families guarantee performance up to 32,000 IOPS.\\n\\nThis parameter is required for `io1` and `io2` volumes. The default for `gp3` volumes is 3,000 IOPS. This parameter is not supported for `gp2` , `st1` , `sc1` , or `standard` volumes.","SnapshotId":"The ID of the snapshot.","VolumeSize":"The size of the volume, in GiBs. You must specify either a snapshot ID or a volume size. If you specify a snapshot, the default is the snapshot size. You can specify a volume size that is equal to or larger than the snapshot size.\\n\\nThe following are the supported volumes sizes for each volume type:\\n\\n- `gp2` and `gp3` :1-16,384\\n- `io1` and `io2` : 4-16,384\\n- `st1` and `sc1` : 125-16,384\\n- `standard` : 1-1,024","VolumeType":"The volume type. For more information, see [Amazon EBS volume types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html) in the *Amazon EC2 User Guide* . If the volume type is `io1` or `io2` , you must specify the IOPS that the volume supports."}},"AWS::EC2::SpotFleet.FleetLaunchTemplateSpecification":{"attributes":{},"description":"Specifies the launch template to be used by the Spot Fleet request for configuring Amazon EC2 instances.\\n\\nYou must specify the following:\\n\\n- The ID or the name of the launch template, but not both.\\n- The version of the launch template.\\n\\n`FleetLaunchTemplateSpecification` is a property of the [AWS::EC2::SpotFleet](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-spotfleet.html) resource.\\n\\nFor information about creating a launch template, see [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) and [Create a launch template](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html#create-launch-template) in the *Amazon EC2 User Guide* .\\n\\nFor examples of launch templates, see [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples) .","properties":{"LaunchTemplateId":"The ID of the launch template.\\n\\nYou must specify the `LaunchTemplateId` or the `LaunchTemplateName` , but not both.","LaunchTemplateName":"The name of the launch template.\\n\\nYou must specify the `LaunchTemplateName` or the `LaunchTemplateId` , but not both.","Version":"The version number of the launch template.\\n\\nSpecifying `$Latest` or `$Default` for the template version number is not supported. However, you can specify `LatestVersionNumber` or `DefaultVersionNumber` using the `Fn::GetAtt` intrinsic function. For more information, see [Fn::GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate-return-values-fn--getatt) ."}},"AWS::EC2::SpotFleet.GroupIdentifier":{"attributes":{},"description":"Describes a security group.","properties":{"GroupId":"The ID of the security group."}},"AWS::EC2::SpotFleet.IamInstanceProfileSpecification":{"attributes":{},"description":"Describes an IAM instance profile.","properties":{"Arn":"The Amazon Resource Name (ARN) of the instance profile."}},"AWS::EC2::SpotFleet.InstanceIpv6Address":{"attributes":{},"description":"Describes an IPv6 address.","properties":{"Ipv6Address":"The IPv6 address."}},"AWS::EC2::SpotFleet.InstanceNetworkInterfaceSpecification":{"attributes":{},"description":"Describes a network interface.","properties":{"AssociatePublicIpAddress":"Indicates whether to assign a public IPv4 address to an instance you launch in a VPC. The public IP address can only be assigned to a network interface for eth0, and can only be assigned to a new network interface, not an existing one. You cannot specify more than one network interface in the request. If launching into a default subnet, the default value is `true` .","DeleteOnTermination":"Indicates whether the network interface is deleted when the instance is terminated.","Description":"The description of the network interface. Applies only if creating a network interface when launching an instance.","DeviceIndex":"The position of the network interface in the attachment order. A primary network interface has a device index of 0.\\n\\nIf you specify a network interface when launching an instance, you must specify the device index.","Groups":"The IDs of the security groups for the network interface. Applies only if creating a network interface when launching an instance.","Ipv6AddressCount":"A number of IPv6 addresses to assign to the network interface. Amazon EC2 chooses the IPv6 addresses from the range of the subnet. You cannot specify this option and the option to assign specific IPv6 addresses in the same request. You can specify this option if you\'ve specified a minimum number of instances to launch.","Ipv6Addresses":"The IPv6 addresses to assign to the network interface. You cannot specify this option and the option to assign a number of IPv6 addresses in the same request. You cannot specify this option if you\'ve specified a minimum number of instances to launch.","NetworkInterfaceId":"The ID of the network interface.\\n\\nIf you are creating a Spot Fleet, omit this parameter because you can’t specify a network interface ID in a launch specification.","PrivateIpAddresses":"The private IPv4 addresses to assign to the network interface. Only one private IPv4 address can be designated as primary. You cannot specify this option if you\'re launching more than one instance in a [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) request.","SecondaryPrivateIpAddressCount":"The number of secondary private IPv4 addresses. You can\'t specify this option and specify more than one private IP address using the private IP addresses option. You cannot specify this option if you\'re launching more than one instance in a [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) request.","SubnetId":"The ID of the subnet associated with the network interface. Applies only if creating a network interface when launching an instance."}},"AWS::EC2::SpotFleet.InstanceRequirementsRequest":{"attributes":{},"description":"The attributes for the instance types. When you specify instance attributes, Amazon EC2 will identify instance types with these attributes.\\n\\nYou must specify `VCpuCount` and `MemoryMiB` . All other attributes are optional. Any unspecified optional attribute is set to its default.\\n\\nWhen you specify multiple attributes, you get instance types that satisfy all of the specified attributes. If you specify multiple values for an attribute, you get instance types that satisfy any of the specified values.\\n\\nTo limit the list of instance types from which Amazon EC2 can identify matching instance types, you can use one of the following parameters, but not both in the same request:\\n\\n- `AllowedInstanceTypes` - The instance types to include in the list. All other instance types are ignored, even if they match your specified attributes.\\n- `ExcludedInstanceTypes` - The instance types to exclude from the list, even if they match your specified attributes.\\n\\n> If you specify `InstanceRequirements` , you can\'t specify `InstanceType` .\\n> \\n> Attribute-based instance type selection is only supported when using Auto Scaling groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in the [launch instance wizard](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html) , or with the [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API or [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) AWS CloudFormation resource, you can\'t specify `InstanceRequirements` . \\n\\nFor more information, see [Attribute-based instance type selection for EC2 Fleet](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html) , [Attribute-based instance type selection for Spot Fleet](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-attribute-based-instance-type-selection.html) , and [Spot placement score](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-placement-score.html) in the *Amazon EC2 User Guide* .","properties":{"AcceleratorCount":"The minimum and maximum number of accelerators (GPUs, FPGAs, or AWS Inferentia chips) on an instance.\\n\\nTo exclude accelerator-enabled instance types, set `Max` to `0` .\\n\\nDefault: No minimum or maximum limits","AcceleratorManufacturers":"Indicates whether instance types must have accelerators by specific manufacturers.\\n\\n- For instance types with NVIDIA devices, specify `nvidia` .\\n- For instance types with AMD devices, specify `amd` .\\n- For instance types with AWS devices, specify `amazon-web-services` .\\n- For instance types with Xilinx devices, specify `xilinx` .\\n\\nDefault: Any manufacturer","AcceleratorNames":"The accelerators that must be on the instance type.\\n\\n- For instance types with NVIDIA A100 GPUs, specify `a100` .\\n- For instance types with NVIDIA V100 GPUs, specify `v100` .\\n- For instance types with NVIDIA K80 GPUs, specify `k80` .\\n- For instance types with NVIDIA T4 GPUs, specify `t4` .\\n- For instance types with NVIDIA M60 GPUs, specify `m60` .\\n- For instance types with AMD Radeon Pro V520 GPUs, specify `radeon-pro-v520` .\\n- For instance types with Xilinx VU9P FPGAs, specify `vu9p` .\\n- For instance types with AWS Inferentia chips, specify `inferentia` .\\n- For instance types with NVIDIA GRID K520 GPUs, specify `k520` .\\n\\nDefault: Any accelerator","AcceleratorTotalMemoryMiB":"The minimum and maximum amount of total accelerator memory, in MiB.\\n\\nDefault: No minimum or maximum limits","AcceleratorTypes":"The accelerator types that must be on the instance type.\\n\\n- To include instance types with GPU hardware, specify `gpu` .\\n- To include instance types with FPGA hardware, specify `fpga` .\\n- To include instance types with inference hardware, specify `inference` .\\n\\nDefault: Any accelerator type","AllowedInstanceTypes":"The instance types to apply your specified attributes against. All other instance types are ignored, even if they match your specified attributes.\\n\\nYou can use strings with one or more wild cards, represented by an asterisk ( `*` ), to allow an instance type, size, or generation. The following are examples: `m5.8xlarge` , `c5*.*` , `m5a.*` , `r*` , `*3*` .\\n\\nFor example, if you specify `c5*` ,Amazon EC2 will allow the entire C5 instance family, which includes all C5a and C5n instance types. If you specify `m5a.*` , Amazon EC2 will allow all the M5a instance types, but not the M5n instance types.\\n\\n> If you specify `AllowedInstanceTypes` , you can\'t specify `ExcludedInstanceTypes` . \\n\\nDefault: All instance types","BareMetal":"Indicates whether bare metal instance types must be included, excluded, or required.\\n\\n- To include bare metal instance types, specify `included` .\\n- To require only bare metal instance types, specify `required` .\\n- To exclude bare metal instance types, specify `excluded` .\\n\\nDefault: `excluded`","BaselineEbsBandwidthMbps":"The minimum and maximum baseline bandwidth to Amazon EBS, in Mbps. For more information, see [Amazon EBS–optimized instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html) in the *Amazon EC2 User Guide* .\\n\\nDefault: No minimum or maximum limits","BurstablePerformance":"Indicates whether burstable performance T instance types are included, excluded, or required. For more information, see [Burstable performance instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html) .\\n\\n- To include burstable performance instance types, specify `included` .\\n- To require only burstable performance instance types, specify `required` .\\n- To exclude burstable performance instance types, specify `excluded` .\\n\\nDefault: `excluded`","CpuManufacturers":"The CPU manufacturers to include.\\n\\n- For instance types with Intel CPUs, specify `intel` .\\n- For instance types with AMD CPUs, specify `amd` .\\n- For instance types with AWS CPUs, specify `amazon-web-services` .\\n\\n> Don\'t confuse the CPU manufacturer with the CPU architecture. Instances will be launched with a compatible CPU architecture based on the Amazon Machine Image (AMI) that you specify in your launch template. \\n\\nDefault: Any manufacturer","ExcludedInstanceTypes":"The instance types to exclude.\\n\\nYou can use strings with one or more wild cards, represented by an asterisk ( `*` ), to exclude an instance family, type, size, or generation. The following are examples: `m5.8xlarge` , `c5*.*` , `m5a.*` , `r*` , `*3*` .\\n\\nFor example, if you specify `c5*` ,Amazon EC2 will exclude the entire C5 instance family, which includes all C5a and C5n instance types. If you specify `m5a.*` , Amazon EC2 will exclude all the M5a instance types, but not the M5n instance types.\\n\\n> If you specify `ExcludedInstanceTypes` , you can\'t specify `AllowedInstanceTypes` . \\n\\nDefault: No excluded instance types","InstanceGenerations":"Indicates whether current or previous generation instance types are included. The current generation instance types are recommended for use. Current generation instance types are typically the latest two to three generations in each instance family. For more information, see [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) in the *Amazon EC2 User Guide* .\\n\\nFor current generation instance types, specify `current` .\\n\\nFor previous generation instance types, specify `previous` .\\n\\nDefault: Current and previous generation instance types","LocalStorage":"Indicates whether instance types with instance store volumes are included, excluded, or required. For more information, [Amazon EC2 instance store](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html) in the *Amazon EC2 User Guide* .\\n\\n- To include instance types with instance store volumes, specify `included` .\\n- To require only instance types with instance store volumes, specify `required` .\\n- To exclude instance types with instance store volumes, specify `excluded` .\\n\\nDefault: `included`","LocalStorageTypes":"The type of local storage that is required.\\n\\n- For instance types with hard disk drive (HDD) storage, specify `hdd` .\\n- For instance types with solid state drive (SSD) storage, specify `ssd` .\\n\\nDefault: `hdd` and `ssd`","MemoryGiBPerVCpu":"The minimum and maximum amount of memory per vCPU, in GiB.\\n\\nDefault: No minimum or maximum limits","MemoryMiB":"The minimum and maximum amount of memory, in MiB.","NetworkBandwidthGbps":"The minimum and maximum amount of baseline network bandwidth, in gigabits per second (Gbps). For more information, see [Amazon EC2 instance network bandwidth](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html) in the *Amazon EC2 User Guide* .\\n\\nDefault: No minimum or maximum limits","NetworkInterfaceCount":"The minimum and maximum number of network interfaces.\\n\\nDefault: No minimum or maximum limits","OnDemandMaxPricePercentageOverLowestPrice":"The price protection threshold for On-Demand Instances. This is the maximum you’ll pay for an On-Demand Instance, expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance types priced above your threshold.\\n\\nThe parameter accepts an integer, which Amazon EC2 interprets as a percentage.\\n\\nTo turn off price protection, specify a high value, such as `999999` .\\n\\nThis parameter is not supported for [GetSpotPlacementScores](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html) and [GetInstanceTypesFromInstanceRequirements](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html) .\\n\\n> If you set `TargetCapacityUnitType` to `vcpu` or `memory-mib` , the price protection threshold is applied based on the per-vCPU or per-memory price instead of the per-instance price. \\n\\nDefault: `20`","RequireHibernateSupport":"Indicates whether instance types must support hibernation for On-Demand Instances.\\n\\nThis parameter is not supported for [GetSpotPlacementScores](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html) .\\n\\nDefault: `false`","SpotMaxPricePercentageOverLowestPrice":"The price protection threshold for Spot Instance. This is the maximum you’ll pay for an Spot Instance, expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance types priced above your threshold.\\n\\nThe parameter accepts an integer, which Amazon EC2 interprets as a percentage.\\n\\nTo turn off price protection, specify a high value, such as `999999` .\\n\\nThis parameter is not supported for [GetSpotPlacementScores](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html) and [GetInstanceTypesFromInstanceRequirements](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html) .\\n\\n> If you set `TargetCapacityUnitType` to `vcpu` or `memory-mib` , the price protection threshold is applied based on the per-vCPU or per-memory price instead of the per-instance price. \\n\\nDefault: `100`","TotalLocalStorageGB":"The minimum and maximum amount of total local storage, in GB.\\n\\nDefault: No minimum or maximum limits","VCpuCount":"The minimum and maximum number of vCPUs."}},"AWS::EC2::SpotFleet.LaunchTemplateConfig":{"attributes":{},"description":"Specifies a launch template and overrides.","properties":{"LaunchTemplateSpecification":"The launch template to use. Make sure that the launch template does not contain the `NetworkInterfaceId` parameter because you can\'t specify a network interface ID in a Spot Fleet.","Overrides":"Any parameters that you specify override the same parameters in the launch template."}},"AWS::EC2::SpotFleet.LaunchTemplateOverrides":{"attributes":{},"description":"Specifies overrides for a launch template.","properties":{"AvailabilityZone":"The Availability Zone in which to launch the instances.","InstanceRequirements":"The instance requirements. When you specify instance requirements, Amazon EC2 will identify instance types with the provided requirements, and then use your On-Demand and Spot allocation strategies to launch instances from these instance types, in the same way as when you specify a list of instance types.\\n\\n> If you specify `InstanceRequirements` , you can\'t specify `InstanceType` .","InstanceType":"The instance type.","Priority":"The priority for the launch template override. The highest priority is launched first.\\n\\nIf `OnDemandAllocationStrategy` is set to `prioritized` , Spot Fleet uses priority to determine which launch template override to use first in fulfilling On-Demand capacity.\\n\\nIf the Spot `AllocationStrategy` is set to `capacityOptimizedPrioritized` , Spot Fleet uses priority on a best-effort basis to determine which launch template override to use in fulfilling Spot capacity, but optimizes for capacity first.\\n\\nValid values are whole numbers starting at `0` . The lower the number, the higher the priority. If no number is set, the launch template override has the lowest priority. You can set the same priority for different launch template overrides.","SpotPrice":"The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not recommend using this parameter because it can lead to increased interruptions. If you do not specify this parameter, you will pay the current Spot price.\\n\\n> If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify this parameter.","SubnetId":"The ID of the subnet in which to launch the instances.","WeightedCapacity":"The number of units provided by the specified instance type."}},"AWS::EC2::SpotFleet.LoadBalancersConfig":{"attributes":{},"description":"Specifies the Classic Load Balancers and target groups to attach to a Spot Fleet request.","properties":{"ClassicLoadBalancersConfig":"The Classic Load Balancers.","TargetGroupsConfig":"The target groups."}},"AWS::EC2::SpotFleet.MemoryGiBPerVCpuRequest":{"attributes":{},"description":"The minimum and maximum amount of memory per vCPU, in GiB.","properties":{"Max":"The maximum amount of memory per vCPU, in GiB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of memory per vCPU, in GiB. To specify no minimum limit, omit this parameter."}},"AWS::EC2::SpotFleet.MemoryMiBRequest":{"attributes":{},"description":"The minimum and maximum amount of memory, in MiB.","properties":{"Max":"The maximum amount of memory, in MiB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of memory, in MiB. To specify no minimum limit, specify `0` ."}},"AWS::EC2::SpotFleet.NetworkBandwidthGbpsRequest":{"attributes":{},"description":"The minimum and maximum amount of baseline network bandwidth, in gigabits per second (Gbps). For more information, see [Amazon EC2 instance network bandwidth](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html) in the *Amazon EC2 User Guide* .\\n\\nDefault: No minimum or maximum limits","properties":{"Max":"The maximum amount of network bandwidth, in Gbps. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of network bandwidth, in Gbps. To specify no minimum limit, omit this parameter."}},"AWS::EC2::SpotFleet.NetworkInterfaceCountRequest":{"attributes":{},"description":"The minimum and maximum number of network interfaces.","properties":{"Max":"The maximum number of network interfaces. To specify no maximum limit, omit this parameter.","Min":"The minimum number of network interfaces. To specify no minimum limit, omit this parameter."}},"AWS::EC2::SpotFleet.PrivateIpAddressSpecification":{"attributes":{},"description":"Describes a secondary private IPv4 address for a network interface.","properties":{"Primary":"Indicates whether the private IPv4 address is the primary private IPv4 address. Only one IPv4 address can be designated as primary.","PrivateIpAddress":"The private IPv4 address."}},"AWS::EC2::SpotFleet.SpotCapacityRebalance":{"attributes":{},"description":"The Spot Instance replacement strategy to use when Amazon EC2 emits a signal that your Spot Instance is at an elevated risk of being interrupted. For more information, see [Capacity rebalancing](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-capacity-rebalance.html) in the *Amazon EC2 User Guide for Linux Instances* .","properties":{"ReplacementStrategy":"The replacement strategy to use. Only available for fleets of type `maintain` .\\n\\n`launch` - Spot Fleet launches a new replacement Spot Instance when a rebalance notification is emitted for an existing Spot Instance in the fleet. Spot Fleet does not terminate the instances that receive a rebalance notification. You can terminate the old instances, or you can leave them running. You are charged for all instances while they are running.\\n\\n`launch-before-terminate` - Spot Fleet launches a new replacement Spot Instance when a rebalance notification is emitted for an existing Spot Instance in the fleet, and then, after a delay that you specify (in `TerminationDelay` ), terminates the instances that received a rebalance notification.","TerminationDelay":"The amount of time (in seconds) that Amazon EC2 waits before terminating the old Spot Instance after launching a new replacement Spot Instance.\\n\\nRequired when `ReplacementStrategy` is set to `launch-before-terminate` .\\n\\nNot valid when `ReplacementStrategy` is set to `launch` .\\n\\nValid values: Minimum value of `120` seconds. Maximum value of `7200` seconds."}},"AWS::EC2::SpotFleet.SpotFleetLaunchSpecification":{"attributes":{},"description":"Specifies the launch specification for one or more Spot Instances. If you include On-Demand capacity in your fleet request, you can\'t use `SpotFleetLaunchSpecification` ; you must use [LaunchTemplateConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateconfig.html) .","properties":{"BlockDeviceMappings":"One or more block devices that are mapped to the Spot Instances. You can\'t specify both a snapshot ID and an encryption value. This is because only blank volumes can be encrypted on creation. If a snapshot is the basis for a volume, it is not blank and its encryption status is used for the volume encryption status.","EbsOptimized":"Indicates whether the instances are optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn\'t available with all instance types. Additional usage charges apply when using an EBS Optimized instance.\\n\\nDefault: `false`","IamInstanceProfile":"The IAM instance profile.","ImageId":"The ID of the AMI.","InstanceRequirements":"The attributes for the instance types. When you specify instance attributes, Amazon EC2 will identify instance types with those attributes.\\n\\n> If you specify `InstanceRequirements` , you can\'t specify `InstanceType` .","InstanceType":"The instance type.","KernelId":"The ID of the kernel.","KeyName":"The name of the key pair.","Monitoring":"Enable or disable monitoring for the instances.","NetworkInterfaces":"One or more network interfaces. If you specify a network interface, you must specify subnet IDs and security group IDs using the network interface.\\n\\n> `SpotFleetLaunchSpecification` currently does not support Elastic Fabric Adapter (EFA). To specify an EFA, you must use [LaunchTemplateConfig](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_LaunchTemplateConfig.html) .","Placement":"The placement information.","RamdiskId":"The ID of the RAM disk. Some kernels require additional drivers at launch. Check the kernel requirements for information about whether you need to specify a RAM disk. To find kernel requirements, refer to the AWS Resource Center and search for the kernel ID.","SecurityGroups":"The security groups.","SpotPrice":"The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not recommend using this parameter because it can lead to increased interruptions. If you do not specify this parameter, you will pay the current Spot price.\\n\\n> If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify this parameter.","SubnetId":"The IDs of the subnets in which to launch the instances. To specify multiple subnets, separate them using commas; for example, \\"subnet-1234abcdeexample1, subnet-0987cdef6example2\\".","TagSpecifications":"The tags to apply during creation.","UserData":"The base64-encoded user data that instances use when starting up. User data is limited to 16 KB.","WeightedCapacity":"The number of units provided by the specified instance type. These are the same units that you chose to set the target capacity in terms of instances, or a performance characteristic such as vCPUs, memory, or I/O.\\n\\nIf the target capacity divided by this value is not a whole number, Amazon EC2 rounds the number of instances to the next whole number. If this value is not specified, the default is 1."}},"AWS::EC2::SpotFleet.SpotFleetMonitoring":{"attributes":{},"description":"Describes whether monitoring is enabled.","properties":{"Enabled":"Enables monitoring for the instance.\\n\\nDefault: `false`"}},"AWS::EC2::SpotFleet.SpotFleetRequestConfigData":{"attributes":{},"description":"Specifies the configuration of a Spot Fleet request. For more information, see [Spot Fleet](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet.html) in the *Amazon EC2 User Guide* .\\n\\nYou must specify either `LaunchSpecifications` or `LaunchTemplateConfigs` .","properties":{"AllocationStrategy":"The strategy that determines how to allocate the target Spot Instance capacity across the Spot Instance pools specified by the Spot Fleet launch configuration. For more information, see [Allocation strategies for Spot Instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-allocation-strategy.html) in the *Amazon EC2 User Guide* .\\n\\n- **priceCapacityOptimized (recommended)** - Spot Fleet identifies the pools with the highest capacity availability for the number of instances that are launching. This means that we will request Spot Instances from the pools that we believe have the lowest chance of interruption in the near term. Spot Fleet then requests Spot Instances from the lowest priced of these pools.\\n- **capacityOptimized** - Spot Fleet identifies the pools with the highest capacity availability for the number of instances that are launching. This means that we will request Spot Instances from the pools that we believe have the lowest chance of interruption in the near term. To give certain instance types a higher chance of launching first, use `capacityOptimizedPrioritized` . Set a priority for each instance type by using the `Priority` parameter for `LaunchTemplateOverrides` . You can assign the same priority to different `LaunchTemplateOverrides` . EC2 implements the priorities on a best-effort basis, but optimizes for capacity first. `capacityOptimizedPrioritized` is supported only if your Spot Fleet uses a launch template. Note that if the `OnDemandAllocationStrategy` is set to `prioritized` , the same priority is applied when fulfilling On-Demand capacity.\\n- **diversified** - Spot Fleet requests instances from all of the Spot Instance pools that you specify.\\n- **lowestPrice** - Spot Fleet requests instances from the lowest priced Spot Instance pool that has available capacity. If the lowest priced pool doesn\'t have available capacity, the Spot Instances come from the next lowest priced pool that has available capacity. If a pool runs out of capacity before fulfilling your desired capacity, Spot Fleet will continue to fulfill your request by drawing from the next lowest priced pool. To ensure that your desired capacity is met, you might receive Spot Instances from several pools. Because this strategy only considers instance price and not capacity availability, it might lead to high interruption rates.\\n\\nDefault: `lowestPrice`","Context":"Reserved.","ExcessCapacityTerminationPolicy":"Indicates whether running Spot Instances should be terminated if you decrease the target capacity of the Spot Fleet request below the current size of the Spot Fleet.\\n\\nSupported only for fleets of type `maintain` .","IamFleetRole":"The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role that grants the Spot Fleet the permission to request, launch, terminate, and tag instances on your behalf. For more information, see [Spot Fleet Prerequisites](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-requests.html#spot-fleet-prerequisites) in the *Amazon EC2 User Guide for Linux Instances* . Spot Fleet can terminate Spot Instances on your behalf when you cancel its Spot Fleet request or when the Spot Fleet request expires, if you set `TerminateInstancesWithExpiration` .","InstanceInterruptionBehavior":"The behavior when a Spot Instance is interrupted. The default is `terminate` .","InstancePoolsToUseCount":"The number of Spot pools across which to allocate your target Spot capacity. Valid only when Spot *AllocationStrategy* is set to `lowest-price` . Spot Fleet selects the cheapest Spot pools and evenly allocates your target Spot capacity across the number of Spot pools that you specify.\\n\\nNote that Spot Fleet attempts to draw Spot Instances from the number of pools that you specify on a best effort basis. If a pool runs out of Spot capacity before fulfilling your target capacity, Spot Fleet will continue to fulfill your request by drawing from the next cheapest pool. To ensure that your target capacity is met, you might receive Spot Instances from more than the number of pools that you specified. Similarly, if most of the pools have no Spot capacity, you might receive your full target capacity from fewer than the number of pools that you specified.","LaunchSpecifications":"The launch specifications for the Spot Fleet request. If you specify `LaunchSpecifications` , you can\'t specify `LaunchTemplateConfigs` .","LaunchTemplateConfigs":"The launch template and overrides. If you specify `LaunchTemplateConfigs` , you can\'t specify `LaunchSpecifications` .","LoadBalancersConfig":"One or more Classic Load Balancers and target groups to attach to the Spot Fleet request. Spot Fleet registers the running Spot Instances with the specified Classic Load Balancers and target groups.\\n\\nWith Network Load Balancers, Spot Fleet cannot register instances that have the following instance types: C1, CC1, CC2, CG1, CG2, CR1, CS1, G1, G2, HI1, HS1, M1, M2, M3, and T1.","OnDemandAllocationStrategy":"The order of the launch template overrides to use in fulfilling On-Demand capacity. If you specify `lowestPrice` , Spot Fleet uses price to determine the order, launching the lowest price first. If you specify `prioritized` , Spot Fleet uses the priority that you assign to each Spot Fleet launch template override, launching the highest priority first. If you do not specify a value, Spot Fleet defaults to `lowestPrice` .","OnDemandMaxTotalPrice":"The maximum amount per hour for On-Demand Instances that you\'re willing to pay. You can use the `onDemandMaxTotalPrice` parameter, the `spotMaxTotalPrice` parameter, or both parameters to ensure that your fleet cost does not exceed your budget. If you set a maximum price per hour for the On-Demand Instances and Spot Instances in your request, Spot Fleet will launch instances until it reaches the maximum amount you\'re willing to pay. When the maximum amount you\'re willing to pay is reached, the fleet stops launching instances even if it hasn’t met the target capacity.","OnDemandTargetCapacity":"The number of On-Demand units to request. You can choose to set the target capacity in terms of instances or a performance characteristic that is important to your application workload, such as vCPUs, memory, or I/O. If the request type is `maintain` , you can specify a target capacity of 0 and add capacity later.","ReplaceUnhealthyInstances":"Indicates whether Spot Fleet should replace unhealthy instances.","SpotMaintenanceStrategies":"The strategies for managing your Spot Instances that are at an elevated risk of being interrupted.","SpotMaxTotalPrice":"The maximum amount per hour for Spot Instances that you\'re willing to pay. You can use the `spotdMaxTotalPrice` parameter, the `onDemandMaxTotalPrice` parameter, or both parameters to ensure that your fleet cost does not exceed your budget. If you set a maximum price per hour for the On-Demand Instances and Spot Instances in your request, Spot Fleet will launch instances until it reaches the maximum amount you\'re willing to pay. When the maximum amount you\'re willing to pay is reached, the fleet stops launching instances even if it hasn’t met the target capacity.","SpotPrice":"The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not recommend using this parameter because it can lead to increased interruptions. If you do not specify this parameter, you will pay the current Spot price.\\n\\n> If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify this parameter.","TagSpecifications":"The key-value pair for tagging the Spot Fleet request on creation. The value for `ResourceType` must be `spot-fleet-request` , otherwise the Spot Fleet request fails. To tag instances at launch, specify the tags in the [launch template](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html#create-launch-template) (valid only if you use `LaunchTemplateConfigs` ) or in the `[SpotFleetTagSpecification](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotFleetTagSpecification.html)` (valid only if you use `LaunchSpecifications` ). For information about tagging after launch, see [Tagging Your Resources](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#tag-resources) .","TargetCapacity":"The number of units to request for the Spot Fleet. You can choose to set the target capacity in terms of instances or a performance characteristic that is important to your application workload, such as vCPUs, memory, or I/O. If the request type is `maintain` , you can specify a target capacity of 0 and add capacity later.","TargetCapacityUnitType":"The unit for the target capacity. `TargetCapacityUnitType` can only be specified when `InstanceRequirements` is specified.\\n\\nDefault: `units` (translates to number of instances)","TerminateInstancesWithExpiration":"Indicates whether running Spot Instances are terminated when the Spot Fleet request expires.","Type":"The type of request. Indicates whether the Spot Fleet only requests the target capacity or also attempts to maintain it. When this value is `request` , the Spot Fleet only places the required requests. It does not attempt to replenish Spot Instances if capacity is diminished, nor does it submit requests in alternative Spot pools if capacity is not available. When this value is `maintain` , the Spot Fleet maintains the target capacity. The Spot Fleet places the required requests to meet capacity and automatically replenishes any interrupted instances. Default: `maintain` . `instant` is listed but is not used by Spot Fleet.","ValidFrom":"The start date and time of the request, in UTC format ( *YYYY* - *MM* - *DD* T *HH* : *MM* : *SS* Z). By default, Amazon EC2 starts fulfilling the request immediately.","ValidUntil":"The end date and time of the request, in UTC format ( *YYYY* - *MM* - *DD* T *HH* : *MM* : *SS* Z). After the end date and time, no new Spot Instance requests are placed or able to fulfill the request. If no value is specified, the Spot Fleet request remains until you cancel it."}},"AWS::EC2::SpotFleet.SpotFleetTagSpecification":{"attributes":{},"description":"The tags for a Spot Fleet resource.","properties":{"ResourceType":"The type of resource. Currently, the only resource type that is supported is `instance` . To tag the Spot Fleet request on creation, use the `TagSpecifications` parameter in `[SpotFleetRequestConfigData](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotFleetRequestConfigData.html)` .","Tags":"The tags."}},"AWS::EC2::SpotFleet.SpotMaintenanceStrategies":{"attributes":{},"description":"The strategies for managing your Spot Instances that are at an elevated risk of being interrupted.","properties":{"CapacityRebalance":"The Spot Instance replacement strategy to use when Amazon EC2 emits a signal that your Spot Instance is at an elevated risk of being interrupted. For more information, see [Capacity rebalancing](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-capacity-rebalance.html) in the *Amazon EC2 User Guide for Linux Instances* ."}},"AWS::EC2::SpotFleet.SpotPlacement":{"attributes":{},"description":"Describes Spot Instance placement.","properties":{"AvailabilityZone":"The Availability Zone.\\n\\nTo specify multiple Availability Zones, separate them using commas; for example, \\"us-west-2a, us-west-2b\\".","GroupName":"The name of the placement group.","Tenancy":"The tenancy of the instance (if the instance is running in a VPC). An instance with a tenancy of `dedicated` runs on single-tenant hardware. The `host` tenancy is not supported for Spot Instances."}},"AWS::EC2::SpotFleet.TargetGroup":{"attributes":{},"description":"Describes a load balancer target group.","properties":{"Arn":"The Amazon Resource Name (ARN) of the target group."}},"AWS::EC2::SpotFleet.TargetGroupsConfig":{"attributes":{},"description":"Describes the target groups to attach to a Spot Fleet. Spot Fleet registers the running Spot Instances with these target groups.","properties":{"TargetGroups":"One or more target groups."}},"AWS::EC2::SpotFleet.TotalLocalStorageGBRequest":{"attributes":{},"description":"The minimum and maximum amount of total local storage, in GB.","properties":{"Max":"The maximum amount of total local storage, in GB. To specify no maximum limit, omit this parameter.","Min":"The minimum amount of total local storage, in GB. To specify no minimum limit, omit this parameter."}},"AWS::EC2::SpotFleet.VCpuCountRangeRequest":{"attributes":{},"description":"The minimum and maximum number of vCPUs.","properties":{"Max":"The maximum number of vCPUs. To specify no maximum limit, omit this parameter.","Min":"The minimum number of vCPUs. To specify no minimum limit, specify `0` ."}},"AWS::EC2::Subnet":{"attributes":{"AvailabilityZone":"The Availability Zone of this subnet. For example, `us-east-1a` .","AvailabilityZoneId":"The Availability Zone ID of this subnet. For example, `use1-az1` .","CidrBlock":"The IPv4 CIDR blocks that are associated with the subnet.","Ipv6CidrBlocks":"The IPv6 CIDR blocks that are associated with the subnet.","NetworkAclAssociationId":"The ID of the network ACL that is associated with the subnet\'s VPC, such as `acl-5fb85d36` .","OutpostArn":"The Amazon Resource Name (ARN) of the Outpost.","Ref":"`Ref` returns the ID of the subnet.","SubnetId":"The ID of the subnet.","VpcId":"The ID of the subnet\'s VPC, such as `vpc-11ad4878` ."},"description":"Specifies a subnet for the specified VPC.\\n\\nFor an IPv4 only subnet, specify an IPv4 CIDR block. If the VPC has an IPv6 CIDR block, you can create an IPv6 only subnet or a dual stack subnet instead. For an IPv6 only subnet, specify an IPv6 CIDR block. For a dual stack subnet, specify both an IPv4 CIDR block and an IPv6 CIDR block.\\n\\nFor more information, see [Subnets for your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html) in the *Amazon VPC User Guide* .","properties":{"AssignIpv6AddressOnCreation":"Indicates whether a network interface created in this subnet receives an IPv6 address. The default value is `false` .\\n\\nIf you specify `AssignIpv6AddressOnCreation` , you must also specify `Ipv6CidrBlock` .","AvailabilityZone":"The Availability Zone of the subnet.\\n\\nIf you update this property, you must also update the `CidrBlock` property.","AvailabilityZoneId":"The AZ ID of the subnet.","CidrBlock":"The IPv4 CIDR block assigned to the subnet.\\n\\nIf you update this property, we create a new subnet, and then delete the existing one.","EnableDns64":"Indicates whether DNS queries made to the Amazon-provided DNS Resolver in this subnet should return synthetic IPv6 addresses for IPv4-only destinations. For more information, see [DNS64 and NAT64](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-nat64-dns64) in the *Amazon Virtual Private Cloud User Guide* .","Ipv6CidrBlock":"The IPv6 CIDR block.\\n\\nIf you specify `AssignIpv6AddressOnCreation` , you must also specify `Ipv6CidrBlock` .","Ipv6Native":"Indicates whether this is an IPv6 only subnet. For more information, see [Subnet basics](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html#subnet-basics) in the *Amazon Virtual Private Cloud User Guide* .","MapPublicIpOnLaunch":"Indicates whether instances launched in this subnet receive a public IPv4 address. The default value is `false` .","OutpostArn":"The Amazon Resource Name (ARN) of the Outpost.","PrivateDnsNameOptionsOnLaunch":"The hostname type for EC2 instances launched into this subnet and how DNS A and AAAA record queries to the instances should be handled. For more information, see [Amazon EC2 instance hostname types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html) in the *Amazon Elastic Compute Cloud User Guide* .\\n\\nAvailable options:\\n\\n- EnableResourceNameDnsAAAARecord (true | false)\\n- EnableResourceNameDnsARecord (true | false)\\n- HostnameType (ip-name | resource-name)","Tags":"Any tags assigned to the subnet.","VpcId":"The ID of the VPC the subnet is in.\\n\\nIf you update this property, you must also update the `CidrBlock` property."}},"AWS::EC2::Subnet.PrivateDnsNameOptionsOnLaunch":{"attributes":{},"description":"Describes the options for instance hostnames.","properties":{"EnableResourceNameDnsAAAARecord":"Indicates whether to respond to DNS queries for instance hostname with DNS AAAA records.","EnableResourceNameDnsARecord":"Indicates whether to respond to DNS queries for instance hostnames with DNS A records.","HostnameType":"The type of hostname for EC2 instances. For IPv4 only subnets, an instance DNS name must be based on the instance IPv4 address. For IPv6 only subnets, an instance DNS name must be based on the instance ID. For dual-stack subnets, you can specify whether DNS names use the instance IPv4 address or the instance ID."}},"AWS::EC2::SubnetCidrBlock":{"attributes":{"Id":"The ID of the association.","Ref":"`Ref` returns the association ID for the subnet’s IPv6 CIDR block."},"description":"Associates a CIDR block with your subnet. You can associate a single IPv6 CIDR block with your subnet. An IPv6 CIDR block must have a prefix length of /64.","properties":{"Ipv6CidrBlock":"The IPv6 network range for the subnet, in CIDR notation. The subnet size must use a /64 prefix length.\\n\\nThis parameter is required for an IPv6 only subnet.","SubnetId":"The ID of the subnet."}},"AWS::EC2::SubnetNetworkAclAssociation":{"attributes":{"AssociationId":"Returns the value of this object\'s AssociationId property.","Ref":"`Ref` returns the ID of the subnet network ACL association."},"description":"Associates a subnet with a network ACL. For more information, see [ReplaceNetworkAclAssociation](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-ReplaceNetworkAclAssociation.html) in the *Amazon EC2 API Reference* .\\n\\nWhen `AWS::EC2::SubnetNetworkAclAssociation` resources are created during create or update operations, AWS CloudFormation adopts existing resources that share the same key properties (the properties that contribute to uniquely identify the resource). However, if the operation fails and rolls back, AWS CloudFormation deletes the previously out-of-band resources. You can protect against this behavior by using `Retain` deletion policies. For more information, see [DeletionPolicy Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) .","properties":{"NetworkAclId":"The ID of the network ACL.","SubnetId":"The ID of the subnet."}},"AWS::EC2::SubnetRouteTableAssociation":{"attributes":{"Id":"The ID of the subnet route table association.","Ref":"`Ref` returns the ID of the subnet route table association."},"description":"Associates a subnet with a route table. The subnet and route table must be in the same VPC. This association causes traffic originating from the subnet to be routed according to the routes in the route table. A route table can be associated with multiple subnets. To create a route table, see [AWS::EC2::RouteTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-routetable.html) .","properties":{"RouteTableId":"The ID of the route table.\\n\\nThe physical ID changes when the route table ID is changed.","SubnetId":"The ID of the subnet."}},"AWS::EC2::TrafficMirrorFilter":{"attributes":{"Ref":"`Ref` returns the ID of the Traffic Mirror filter."},"description":"Specifies a Traffic Mirror filter.\\n\\nA Traffic Mirror filter is a set of rules that defines the traffic to mirror.\\n\\nBy default, no traffic is mirrored. To mirror traffic, use [AWS::EC2::TrafficMirrorFilterRule](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html) to add Traffic Mirror rules to the filter. The rules you add define what traffic gets mirrored.","properties":{"Description":"The description of the Traffic Mirror filter.","NetworkServices":"The network service traffic that is associated with the Traffic Mirror filter.\\n\\nValid values are `amazon-dns` .","Tags":"The tags to assign to a Traffic Mirror filter."}},"AWS::EC2::TrafficMirrorFilterRule":{"attributes":{"Ref":"`Ref` returns the ID of the Traffic Mirror filter rule."},"description":"Creates a Traffic Mirror filter rule.\\n\\nA Traffic Mirror rule defines the Traffic Mirror source traffic to mirror.\\n\\nYou need the Traffic Mirror filter ID when you create the rule.","properties":{"Description":"The description of the Traffic Mirror rule.","DestinationCidrBlock":"The destination CIDR block to assign to the Traffic Mirror rule.","DestinationPortRange":"The destination port range.","Protocol":"The protocol, for example UDP, to assign to the Traffic Mirror rule.\\n\\nFor information about the protocol value, see [Protocol Numbers](https://docs.aws.amazon.com/https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) on the Internet Assigned Numbers Authority (IANA) website.","RuleAction":"The action to take on the filtered traffic.","RuleNumber":"The number of the Traffic Mirror rule. This number must be unique for each Traffic Mirror rule in a given direction. The rules are processed in ascending order by rule number.","SourceCidrBlock":"The source CIDR block to assign to the Traffic Mirror rule.","SourcePortRange":"The source port range.","TrafficDirection":"The type of traffic.","TrafficMirrorFilterId":"The ID of the filter that this rule is associated with."}},"AWS::EC2::TrafficMirrorFilterRule.TrafficMirrorPortRange":{"attributes":{},"description":"Describes the Traffic Mirror port range.","properties":{"FromPort":"The start of the Traffic Mirror port range. This applies to the TCP and UDP protocols.","ToPort":"The end of the Traffic Mirror port range. This applies to the TCP and UDP protocols."}},"AWS::EC2::TrafficMirrorSession":{"attributes":{"Ref":"`Ref` returns the ID of the Traffic Mirror Session."},"description":"Creates a Traffic Mirror session.\\n\\nA Traffic Mirror session actively copies packets from a Traffic Mirror source to a Traffic Mirror target. Create a filter, and then assign it to the session to define a subset of the traffic to mirror, for example all TCP traffic.\\n\\nThe Traffic Mirror source and the Traffic Mirror target (monitoring appliances) can be in the same VPC, or in a different VPC connected via VPC peering or a transit gateway.\\n\\nBy default, no traffic is mirrored. Use [AWS::EC2::TrafficMirrorFilterRule](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html) to specify filter rules that specify the traffic to mirror.","properties":{"Description":"The description of the Traffic Mirror session.","NetworkInterfaceId":"The ID of the source network interface.","PacketLength":"The number of bytes in each packet to mirror. These are bytes after the VXLAN header. Do not specify this parameter when you want to mirror the entire packet. To mirror a subset of the packet, set this to the length (in bytes) that you want to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target.\\n\\nIf you do not want to mirror the entire packet, use the `PacketLength` parameter to specify the number of bytes in each packet to mirror.","SessionNumber":"The session number determines the order in which sessions are evaluated when an interface is used by multiple sessions. The first session with a matching filter is the one that mirrors the packets.\\n\\nValid values are 1-32766.","Tags":"The tags to assign to a Traffic Mirror session.","TrafficMirrorFilterId":"The ID of the Traffic Mirror filter.","TrafficMirrorTargetId":"The ID of the Traffic Mirror target.","VirtualNetworkId":"The VXLAN ID for the Traffic Mirror session. For more information about the VXLAN protocol, see [RFC 7348](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc7348) . If you do not specify a `VirtualNetworkId` , an account-wide unique id is chosen at random."}},"AWS::EC2::TrafficMirrorTarget":{"attributes":{"Ref":"`Ref` returns the ID of the Traffic Mirror target."},"description":"Specifies a target for your Traffic Mirror session.\\n\\nA Traffic Mirror target is the destination for mirrored traffic. The Traffic Mirror source and the Traffic Mirror target (monitoring appliances) can be in the same VPC, or in different VPCs connected via VPC peering or a transit gateway.\\n\\nA Traffic Mirror target can be a network interface, a Network Load Balancer, or a Gateway Load Balancer endpoint.\\n\\nTo use the target in a Traffic Mirror session, use [AWS::EC2::TrafficMirrorSession](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html) .","properties":{"Description":"The description of the Traffic Mirror target.","GatewayLoadBalancerEndpointId":"The ID of the Gateway Load Balancer endpoint.","NetworkInterfaceId":"The network interface ID that is associated with the target.","NetworkLoadBalancerArn":"The Amazon Resource Name (ARN) of the Network Load Balancer that is associated with the target.","Tags":"The tags to assign to the Traffic Mirror target."}},"AWS::EC2::TransitGateway":{"attributes":{"Id":"The ID of the transit gateway.","Ref":"`Ref` returns the ID of the transit gateway."},"description":"Specifies a transit gateway.\\n\\nYou can use a transit gateway to interconnect your virtual private clouds (VPC) and on-premises networks. After the transit gateway enters the `available` state, you can attach your VPCs and VPN connections to the transit gateway.\\n\\nTo attach your VPCs, use [AWS::EC2::TransitGatewayAttachment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html) .\\n\\nTo attach a VPN connection, use [AWS::EC2::CustomerGateway](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-customer-gateway.html) to create a customer gateway and specify the ID of the customer gateway and the ID of the transit gateway in a call to [AWS::EC2::VPNConnection](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html) .\\n\\nWhen you create a transit gateway, we create a default transit gateway route table and use it as the default association route table and the default propagation route table. You can use [AWS::EC2::TransitGatewayRouteTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetable.html) to create additional transit gateway route tables. If you disable automatic route propagation, we do not create a default transit gateway route table. You can use [AWS::EC2::TransitGatewayRouteTablePropagation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetablepropagation.html) to propagate routes from a resource attachment to a transit gateway route table. If you disable automatic associations, you can use [AWS::EC2::TransitGatewayRouteTableAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetableassociation.html) to associate a resource attachment with a transit gateway route table.","properties":{"AmazonSideAsn":"A private Autonomous System Number (ASN) for the Amazon side of a BGP session. The range is 64512 to 65534 for 16-bit ASNs. The default is 64512.","AssociationDefaultRouteTableId":"The ID of the default association route table.","AutoAcceptSharedAttachments":"Enable or disable automatic acceptance of attachment requests. Disabled by default.","DefaultRouteTableAssociation":"Enable or disable automatic association with the default association route table. Enabled by default.","DefaultRouteTablePropagation":"Enable or disable automatic propagation of routes to the default propagation route table. Enabled by default.","Description":"The description of the transit gateway.","DnsSupport":"Enable or disable DNS support. Enabled by default.","MulticastSupport":"Indicates whether multicast is enabled on the transit gateway","PropagationDefaultRouteTableId":"The ID of the default propagation route table.","Tags":"The tags for the transit gateway.","TransitGatewayCidrBlocks":"The transit gateway CIDR blocks.","VpnEcmpSupport":"Enable or disable Equal Cost Multipath Protocol support. Enabled by default."}},"AWS::EC2::TransitGatewayAttachment":{"attributes":{"Id":"The ID of the attachment.","Ref":"`Ref` returns the ID of the attachment."},"description":"Attaches a VPC to a transit gateway.\\n\\nIf you attach a VPC with a CIDR range that overlaps the CIDR range of a VPC that is already attached, the new VPC CIDR range is not propagated to the default propagation route table.\\n\\nTo send VPC traffic to an attached transit gateway, add a route to the VPC route table using [AWS::EC2::Route](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html) .\\n\\nTo update tags for a VPC attachment after creation without replacing the attachment, use [AWS::EC2::TransitGatewayVpcAttachment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html) instead.","properties":{"Options":"The VPC attachment options.","SubnetIds":"The IDs of one or more subnets. You can specify only one subnet per Availability Zone. You must specify at least one subnet, but we recommend that you specify two subnets for better availability. The transit gateway uses one IP address from each specified subnet.","Tags":"The tags for the attachment.","TransitGatewayId":"The ID of the transit gateway.","VpcId":"The ID of the VPC."}},"AWS::EC2::TransitGatewayAttachment.Options":{"attributes":{},"description":"Describes the VPC attachment options.","properties":{"ApplianceModeSupport":"Enable or disable appliance mode support. The default is `disable` .","DnsSupport":"Enable or disable DNS support. The default is `disable` .","Ipv6Support":"Enable or disable IPv6 support. The default is `disable` ."}},"AWS::EC2::TransitGatewayConnect":{"attributes":{"CreationTime":"The creation time.","Ref":"`Ref` returns the transit gateway attachment.","State":"The state of the attachment.","TransitGatewayAttachmentId":"The ID of the transit gateway attachment.","TransitGatewayId":"The ID of the transit gateway."},"description":"Creates a Connect attachment from a specified transit gateway attachment. A Connect attachment is a GRE-based tunnel attachment that you can use to establish a connection between a transit gateway and an appliance.\\n\\nA Connect attachment uses an existing VPC or AWS Direct Connect attachment as the underlying transport mechanism.","properties":{"Options":"The Connect attachment options.\\n\\n- protocol (gre)","Tags":"The tags for the attachment.","TransportTransitGatewayAttachmentId":"The ID of the attachment from which the Connect attachment was created."}},"AWS::EC2::TransitGatewayConnect.TransitGatewayConnectOptions":{"attributes":{},"description":"Describes the Connect attachment options.","properties":{"Protocol":"The tunnel protocol."}},"AWS::EC2::TransitGatewayMulticastDomain":{"attributes":{"CreationTime":"The time the multicast domain was created.","Ref":"`Ref` returns the transit gateway multicast domain ID. For example: `tgw-mcast-domain-000fb24d04EXAMPLE` .","State":"The state of the multicast domain.","TransitGatewayMulticastDomainArn":"The Amazon Resource Name (ARN) of the multicast domain.","TransitGatewayMulticastDomainId":"The ID of the multicast domain."},"description":"Creates a multicast domain using the specified transit gateway.\\n\\nThe transit gateway must be in the available state before you create a domain.","properties":{"Options":"The options for the transit gateway multicast domain.\\n\\n- AutoAcceptSharedAssociations (enable | disable)\\n- Igmpv2Support (enable | disable)\\n- StaticSourcesSupport (enable | disable)","Tags":"The tags for the transit gateway multicast domain.","TransitGatewayId":"The ID of the transit gateway."}},"AWS::EC2::TransitGatewayMulticastDomain.Options":{"attributes":{},"description":"The options for the transit gateway multicast domain.","properties":{"AutoAcceptSharedAssociations":"Indicates whether to automatically accept cross-account subnet associations that are associated with the transit gateway multicast domain.","Igmpv2Support":"Specify whether to enable Internet Group Management Protocol (IGMP) version 2 for the transit gateway multicast domain.","StaticSourcesSupport":"Specify whether to enable support for statically configuring multicast group sources for a domain."}},"AWS::EC2::TransitGatewayMulticastDomainAssociation":{"attributes":{"Ref":"`Ref` returns the transit gateway multicast domain ID. For example: `tgw-mcast-domain-000fb24d04EXAMPLE` .","ResourceId":"The ID of the resource.","ResourceType":"The type of resource, for example a VPC attachment.","State":"The state of the resource."},"description":"Associates the specified subnets and transit gateway attachments with the specified transit gateway multicast domain.\\n\\nThe transit gateway attachment must be in the available state before you can add a resource.","properties":{"SubnetId":"The IDs of the subnets to associate with the transit gateway multicast domain.","TransitGatewayAttachmentId":"The ID of the transit gateway attachment.","TransitGatewayMulticastDomainId":"The ID of the transit gateway multicast domain."}},"AWS::EC2::TransitGatewayMulticastGroupMember":{"attributes":{"GroupMember":"Information about the registered transit gateway multicast domain group members.","GroupSource":"Indicates that the resource is a transit gateway multicast domain group member.","MemberType":"The type of group member, for example static.","Ref":"`Ref` returns the transit gateway multicast domain group member ID.","ResourceId":"The ID of the resource.","ResourceType":"The type of resource, for example a VPC attachment.","SourceType":"The type of source.","SubnetId":"The ID of the subnet.","TransitGatewayAttachmentId":"The ID of the transit gateway attachment."},"description":"Registers members (network interfaces) with the transit gateway multicast group. A member is a network interface associated with a supported EC2 instance that receives multicast traffic. For information about supported instances, see [Multicast Consideration](https://docs.aws.amazon.com/vpc/latest/tgw/transit-gateway-limits.html#multicast-limits) in *Amazon VPC Transit Gateways* .","properties":{"GroupIpAddress":"The IP address assigned to the transit gateway multicast group.","NetworkInterfaceId":"The group members\' network interface IDs to register with the transit gateway multicast group.","TransitGatewayMulticastDomainId":"The ID of the transit gateway multicast domain."}},"AWS::EC2::TransitGatewayMulticastGroupSource":{"attributes":{"GroupMember":"Information about the registered transit gateway multicast domain group members.","GroupSource":"Indicates that the resource is a transit gateway group member.","MemberType":"The type of group member, for example static.","Ref":"`Ref` returns the transit gateway multicast domain group source.","ResourceId":"The ID of the resource.","ResourceType":"The type of resource, for example a VPC attachment.","SourceType":"The type of source.","SubnetId":"The ID of the subnet.","TransitGatewayAttachmentId":"The ID of the transit gateway attachment."},"description":"Registers sources (network interfaces) with the specified transit gateway multicast domain.\\n\\nA multicast source is a network interface attached to a supported instance that sends multicast traffic. For information about supported instances, see [Multicast Considerations](https://docs.aws.amazon.com/vpc/latest/tgw/transit-gateway-limits.html#multicast-limits) in *Amazon VPC Transit Gateways* .","properties":{"GroupIpAddress":"The IP address assigned to the transit gateway multicast group.","NetworkInterfaceId":"The group sources\' network interface IDs to register with the transit gateway multicast group.","TransitGatewayMulticastDomainId":"The ID of the transit gateway multicast domain."}},"AWS::EC2::TransitGatewayPeeringAttachment":{"attributes":{"CreationTime":"The time the transit gateway peering attachment was created.","Ref":"`Ref` returns the ID of the transit gateway peering attachment.","State":"The state of the transit gateway peering attachment. Note that the `initiating` state has been deprecated.","Status":"The status of the transit gateway peering attachment.","Status.Code":"The status code.","Status.Message":"The status message.","TransitGatewayAttachmentId":"The ID of the transit gateway peering attachment."},"description":"Requests a transit gateway peering attachment between the specified transit gateway (requester) and a peer transit gateway (accepter). The peer transit gateway can be in your account or a different AWS account .\\n\\nAfter you create the peering attachment, the owner of the accepter transit gateway must accept the attachment request.","properties":{"PeerAccountId":"The ID of the AWS account that owns the transit gateway.","PeerRegion":"The Region of the transit gateway.","PeerTransitGatewayId":"The ID of the transit gateway.","Tags":"The tags for the transit gateway peering attachment.","TransitGatewayId":"The ID of the transit gateway peering attachment."}},"AWS::EC2::TransitGatewayPeeringAttachment.PeeringAttachmentStatus":{"attributes":{},"description":"The status of the transit gateway peering attachment.","properties":{"Code":"The status code.","Message":"The status message, if applicable."}},"AWS::EC2::TransitGatewayRoute":{"attributes":{"Ref":"`Ref` returns the ID of the transit gateway route."},"description":"Specifies a static route for a transit gateway route table.","properties":{"Blackhole":"Indicates whether to drop traffic that matches this route.","DestinationCidrBlock":"The CIDR block used for destination matches.","TransitGatewayAttachmentId":"The ID of the attachment.","TransitGatewayRouteTableId":"The ID of the transit gateway route table."}},"AWS::EC2::TransitGatewayRouteTable":{"attributes":{"Ref":"`Ref` returns the ID of the transit gateway route table."},"description":"Specifies a route table for a transit gateway.","properties":{"Tags":"Any tags assigned to the route table.","TransitGatewayId":"The ID of the transit gateway."}},"AWS::EC2::TransitGatewayRouteTableAssociation":{"attributes":{"Ref":"`Ref` returns the ID of the transit gateway route table association."},"description":"Associates the specified attachment with the specified transit gateway route table. You can associate one route table with an attachment.\\n\\nBefore you can update the route table associated with an attachment, you must disassociate the transit gateway route table that is currently associated with the attachment. First update the stack to remove the associated transit gateway route table, and then update the stack with the ID of the new transit gateway route table to associate.","properties":{"TransitGatewayAttachmentId":"The ID of the attachment.","TransitGatewayRouteTableId":"The ID of the route table for the transit gateway."}},"AWS::EC2::TransitGatewayRouteTablePropagation":{"attributes":{"Ref":"`Ref` returns the ID of the transit gateway route table that is propagated."},"description":"Enables the specified attachment to propagate routes to the specified propagation route table.\\n\\nFor more information about enabling transit gateway route propagation, see [EnableTransitGatewayRouteTablePropagation](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableTransitGatewayRouteTablePropagation.html) in the *Amazon EC2 API Reference* .","properties":{"TransitGatewayAttachmentId":"The ID of the attachment.","TransitGatewayRouteTableId":"The ID of the propagation route table."}},"AWS::EC2::TransitGatewayVpcAttachment":{"attributes":{"Id":"The ID of the attachment.","Ref":"`Ref` returns the ID of the attachment."},"description":"Specifies a VPC attachment.","properties":{"AddSubnetIds":"The IDs of one or more subnets to add. You can specify at most one subnet per Availability Zone.","Options":"The VPC attachment options.","RemoveSubnetIds":"The IDs of one or more subnets to remove.","SubnetIds":"The IDs of the subnets.","Tags":"The tags for the VPC attachment.","TransitGatewayId":"The ID of the transit gateway.","VpcId":"The ID of the VPC."}},"AWS::EC2::TransitGatewayVpcAttachment.Options":{"attributes":{},"description":"Describes the VPC attachment options.","properties":{"ApplianceModeSupport":"Enable or disable appliance mode support. The default is `disable` .","DnsSupport":"Enable or disable DNS support. The default is `disable` .","Ipv6Support":"Enable or disable IPv6 support. The default is `disable` ."}},"AWS::EC2::VPC":{"attributes":{"CidrBlock":"The primary IPv4 CIDR block for the VPC. For example, 10.0.0.0/16.","CidrBlockAssociations":"The association IDs of the IPv4 CIDR blocks for the VPC. For example, [ vpc-cidr-assoc-0280ab6b ].","DefaultNetworkAcl":"The ID of the default network ACL for the VPC. For example, acl-814dafe3.","DefaultSecurityGroup":"The ID of the default security group for the VPC. For example, sg-b178e0d3.","Ipv6CidrBlocks":"The IPv6 CIDR blocks for the VPC. For example, [ 2001:db8:1234:1a00::/56 ].","Ref":"`Ref` returns the ID of the VPC.","VpcId":"The ID of the VPC."},"description":"Specifies a virtual private cloud (VPC).\\n\\nYou can optionally request an IPv6 CIDR block for the VPC. You can request an Amazon-provided IPv6 CIDR block from Amazon\'s pool of IPv6 addresses, or an IPv6 CIDR block from an IPv6 address pool that you provisioned through bring your own IP addresses (BYOIP).\\n\\nFor more information, see [Virtual private clouds (VPC)](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/configure-your-vpc.html) in the *Amazon VPC User Guide* .","properties":{"CidrBlock":"The IPv4 network range for the VPC, in CIDR notation. For example, `10.0.0.0/16` . We modify the specified CIDR block to its canonical form; for example, if you specify `100.68.0.18/18` , we modify it to `100.68.0.0/18` .\\n\\nYou must specify either `CidrBlock` or `Ipv4IpamPoolId` .","EnableDnsHostnames":"Indicates whether the instances launched in the VPC get DNS hostnames. If enabled, instances in the VPC get DNS hostnames; otherwise, they do not. Disabled by default for nondefault VPCs. For more information, see [DNS attributes in your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-support) .\\n\\nYou can only enable DNS hostnames if you\'ve enabled DNS support.","EnableDnsSupport":"Indicates whether the DNS resolution is supported for the VPC. If enabled, queries to the Amazon provided DNS server at the 169.254.169.253 IP address, or the reserved IP address at the base of the VPC network range \\"plus two\\" succeed. If disabled, the Amazon provided DNS service in the VPC that resolves public DNS hostnames to IP addresses is not enabled. Enabled by default. For more information, see [DNS attributes in your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-support) .","InstanceTenancy":"The allowed tenancy of instances launched into the VPC.\\n\\n- `default` : An instance launched into the VPC runs on shared hardware by default, unless you explicitly specify a different tenancy during instance launch.\\n- `dedicated` : An instance launched into the VPC runs on dedicated hardware by default, unless you explicitly specify a tenancy of `host` during instance launch. You cannot specify a tenancy of `default` during instance launch.\\n\\nUpdating `InstanceTenancy` requires no replacement only if you are updating its value from `dedicated` to `default` . Updating `InstanceTenancy` from `default` to `dedicated` requires replacement.","Ipv4IpamPoolId":"The ID of an IPv4 IPAM pool you want to use for allocating this VPC\'s CIDR. For more information, see [What is IPAM?](https://docs.aws.amazon.com//vpc/latest/ipam/what-is-it-ipam.html) in the *Amazon VPC IPAM User Guide* .\\n\\nYou must specify either `CidrBlock` or `Ipv4IpamPoolId` .","Ipv4NetmaskLength":"The netmask length of the IPv4 CIDR you want to allocate to this VPC from an Amazon VPC IP Address Manager (IPAM) pool. For more information about IPAM, see [What is IPAM?](https://docs.aws.amazon.com//vpc/latest/ipam/what-is-it-ipam.html) in the *Amazon VPC IPAM User Guide* .","Tags":"The tags for the VPC."}},"AWS::EC2::VPCCidrBlock":{"attributes":{"Ref":"`Ref` returns the association ID for the VPC CIDR block."},"description":"Associates a CIDR block with your VPC. You can only associate a single IPv6 CIDR block with your VPC. The IPv6 CIDR block size is fixed at /56.\\n\\nFor more information about associating CIDR blocks with your VPC and applicable restrictions, see [VPC and Subnet Sizing](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html#VPC_Sizing) in the *Amazon VPC User Guide* .","properties":{"AmazonProvidedIpv6CidrBlock":"Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC. You cannot specify the range of IPv6 addresses, or the size of the CIDR block.","CidrBlock":"An IPv4 CIDR block to associate with the VPC.","Ipv4IpamPoolId":"Associate a CIDR allocated from an IPv4 IPAM pool to a VPC. For more information about Amazon VPC IP Address Manager (IPAM), see [What is IPAM?](https://docs.aws.amazon.com//vpc/latest/ipam/what-is-it-ipam.html) in the *Amazon VPC IPAM User Guide* .","Ipv4NetmaskLength":"The netmask length of the IPv4 CIDR you would like to associate from an Amazon VPC IP Address Manager (IPAM) pool. For more information about IPAM, see [What is IPAM?](https://docs.aws.amazon.com//vpc/latest/ipam/what-is-it-ipam.html) in the *Amazon VPC IPAM User Guide* .","Ipv6CidrBlock":"An IPv6 CIDR block from the IPv6 address pool. You must also specify `Ipv6Pool` in the request.\\n\\nTo let Amazon choose the IPv6 CIDR block for you, omit this parameter.","Ipv6IpamPoolId":"Associates a CIDR allocated from an IPv6 IPAM pool to a VPC. For more information about Amazon VPC IP Address Manager (IPAM), see [What is IPAM?](https://docs.aws.amazon.com//vpc/latest/ipam/what-is-it-ipam.html) in the *Amazon VPC IPAM User Guide* .","Ipv6NetmaskLength":"The netmask length of the IPv6 CIDR you would like to associate from an Amazon VPC IP Address Manager (IPAM) pool. For more information about IPAM, see [What is IPAM?](https://docs.aws.amazon.com//vpc/latest/ipam/what-is-it-ipam.html) in the *Amazon VPC IPAM User Guide* .","Ipv6Pool":"The ID of an IPv6 address pool from which to allocate the IPv6 CIDR block.","VpcId":"The ID of the VPC."}},"AWS::EC2::VPCDHCPOptionsAssociation":{"attributes":{"Ref":"`Ref` returns the ID of the DHCP options association."},"description":"Associates a set of DHCP options with a VPC, or associates no DHCP options with the VPC.\\n\\nAfter you associate the options with the VPC, any existing instances and all new instances that you launch in that VPC use the options. You don\'t need to restart or relaunch the instances. They automatically pick up the changes within a few hours, depending on how frequently the instance renews its DHCP lease. You can explicitly renew the lease using the operating system on the instance.","properties":{"DhcpOptionsId":"The ID of the DHCP options set, or `default` to associate no DHCP options with the VPC.","VpcId":"The ID of the VPC."}},"AWS::EC2::VPCEndpoint":{"attributes":{"CreationTimestamp":"The date and time the VPC endpoint was created. For example: `Fri Sep 28 23:34:36 UTC 2018.`","DnsEntries":"(Interface endpoints) The DNS entries for the endpoint. Each entry is a combination of the hosted zone ID and the DNS name. The entries are ordered as follows: regional public DNS, zonal public DNS, private DNS, and wildcard DNS. This order is not enforced for AWS Marketplace services.\\n\\nThe following is an example. In the first entry, the hosted zone ID is Z1HUB23UULQXV and the DNS name is vpce-01abc23456de78f9g-12abccd3.ec2.us-east-1.vpce.amazonaws.com.\\n\\n[\\"Z1HUB23UULQXV:vpce-01abc23456de78f9g-12abccd3.ec2.us-east-1.vpce.amazonaws.com\\", \\"Z1HUB23UULQXV:vpce-01abc23456de78f9g-12abccd3-us-east-1a.ec2.us-east-1.vpce.amazonaws.com\\", \\"Z1C12344VYDITB0:ec2.us-east-1.amazonaws.com\\"]\\n\\nIf you update the `PrivateDnsEnabled` or `SubnetIds` properties, the DNS entries in the list will change.","Id":"The ID of the VPC endpoint.","NetworkInterfaceIds":"(Interface endpoints) The network interface IDs. If you update the `PrivateDnsEnabled` or `SubnetIds` properties, the items in this list might change.","Ref":"`Ref` returns the ID of the VPC endpoint."},"description":"Specifies a VPC endpoint. A VPC endpoint provides a private connection between your VPC and an endpoint service. You can use an endpoint service provided by AWS , an AWS Marketplace Partner, or another AWS accounts in your organization. For more information, see the [AWS PrivateLink User Guide](https://docs.aws.amazon.com/vpc/latest/privatelink/) .\\n\\nAn endpoint of type `Interface` establishes connections between the subnets in your VPC and an AWS service , your own service, or a service hosted by another AWS account . With an interface VPC endpoint, you specify the subnets in which to create the endpoint and the security groups to associate with the endpoint network interfaces.\\n\\nAn endpoint of type `gateway` serves as a target for a route in your route table for traffic destined for Amazon S3 or DynamoDB . You can specify an endpoint policy for the endpoint, which controls access to the service from your VPC. You can also specify the VPC route tables that use the endpoint. For more information about connectivity to Amazon S3 , see [Why can\'t I connect to an S3 bucket using a gateway VPC endpoint?](https://docs.aws.amazon.com/premiumsupport/knowledge-center/connect-s3-vpc-endpoint)\\n\\nAn endpoint of type `GatewayLoadBalancer` provides private connectivity between your VPC and virtual appliances from a service provider.","properties":{"PolicyDocument":"An endpoint policy, which controls access to the service from the VPC. The default endpoint policy allows full access to the service. Endpoint policies are supported only for gateway and interface endpoints.\\n\\nFor CloudFormation templates in YAML, you can provide the policy in JSON or YAML format. AWS CloudFormation converts YAML policies to JSON format before calling the API to create or modify the VPC endpoint.","PrivateDnsEnabled":"Indicate whether to associate a private hosted zone with the specified VPC. The private hosted zone contains a record set for the default public DNS name for the service for the Region (for example, `kinesis.us-east-1.amazonaws.com` ), which resolves to the private IP addresses of the endpoint network interfaces in the VPC. This enables you to make requests to the default public DNS name for the service instead of the public DNS names that are automatically generated by the VPC endpoint service.\\n\\nTo use a private hosted zone, you must set the following VPC attributes to `true` : `enableDnsHostnames` and `enableDnsSupport` .\\n\\nThis property is supported only for interface endpoints.\\n\\nDefault: `false`","RouteTableIds":"The IDs of the route tables. Routing is supported only for gateway endpoints.","SecurityGroupIds":"The IDs of the security groups to associate with the endpoint network interfaces. If this parameter is not specified, we use the default security group for the VPC. Security groups are supported only for interface endpoints.","ServiceName":"The name of the endpoint service.","SubnetIds":"The IDs of the subnets in which to create endpoint network interfaces. You must specify this property for an interface endpoint or a Gateway Load Balancer endpoint. You can\'t specify this property for a gateway endpoint. For a Gateway Load Balancer endpoint, you can specify only one subnet.","VpcEndpointType":"The type of endpoint.\\n\\nDefault: Gateway","VpcId":"The ID of the VPC."}},"AWS::EC2::VPCEndpointConnectionNotification":{"attributes":{"Ref":"`Ref` returns the ID of the VPC endpoint connection."},"description":"Specifies a connection notification for a VPC endpoint or VPC endpoint service. A connection notification notifies you of specific endpoint events. You must create an SNS topic to receive notifications. For more information, see [Create a Topic](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) in the *Amazon Simple Notification Service Developer Guide* .\\n\\nYou can create a connection notification for interface endpoints only.","properties":{"ConnectionEvents":"The endpoint events for which to receive notifications. Valid values are `Accept` , `Connect` , `Delete` , and `Reject` .","ConnectionNotificationArn":"The ARN of the SNS topic for the notifications.","ServiceId":"The ID of the endpoint service.","VPCEndpointId":"The ID of the endpoint."}},"AWS::EC2::VPCEndpointService":{"attributes":{"Ref":"`Ref` returns the ID of the VPC endpoint service configuration.","ServiceId":"The ID of the endpoint service."},"description":"Creates a VPC endpoint service configuration to which service consumers ( AWS accounts, users, and IAM roles) can connect.\\n\\nTo create an endpoint service configuration, you must first create one of the following for your service:\\n\\n- A [Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html) . Service consumers connect to your service using an interface endpoint.\\n- A [Gateway Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/gateway/introduction.html) . Service consumers connect to your service using a Gateway Load Balancer endpoint.\\n\\nFor more information, see the [AWS PrivateLink User Guide](https://docs.aws.amazon.com/vpc/latest/privatelink/) .","properties":{"AcceptanceRequired":"Indicates whether requests from service consumers to create an endpoint to your service must be accepted.","ContributorInsightsEnabled":"Indicates whether to enable the built-in Contributor Insights rules provided by AWS PrivateLink .","GatewayLoadBalancerArns":"The Amazon Resource Names (ARNs) of the Gateway Load Balancers.","NetworkLoadBalancerArns":"The Amazon Resource Names (ARNs) of the Network Load Balancers.","PayerResponsibility":"The entity that is responsible for the endpoint costs. The default is the endpoint owner. If you set the payer responsibility to the service owner, you cannot set it back to the endpoint owner."}},"AWS::EC2::VPCEndpointServicePermissions":{"attributes":{"Ref":"`Ref` returns the ID of the VPC endpoint service permissions."},"description":"Grant or revoke permissions for service consumers (users, IAM roles, and AWS accounts) to connect to a VPC endpoint service.\\n\\nIf you grant permissions to all principals, the service is public. Any users who know the name of a public service can send a request to attach an endpoint. If the service does not require manual approval, attachments are automatically approved.","properties":{"AllowedPrincipals":"The Amazon Resource Names (ARN) of one or more principals (for example, users, IAM roles, and AWS accounts ). Permissions are granted to the principals in this list. To grant permissions to all principals, specify an asterisk (*). Permissions are revoked for principals not in this list. If the list is empty, then all permissions are revoked.","ServiceId":"The ID of the service."}},"AWS::EC2::VPCGatewayAttachment":{"attributes":{"Ref":"`Ref` returns the ID of the VPC gateway attachment."},"description":"Attaches an internet gateway, or a virtual private gateway to a VPC, enabling connectivity between the internet and the VPC.","properties":{"InternetGatewayId":"The ID of the internet gateway.\\n\\nYou must specify either `InternetGatewayId` or `VpnGatewayId` , but not both.","VpcId":"The ID of the VPC.","VpnGatewayId":"The ID of the virtual private gateway.\\n\\nYou must specify either `InternetGatewayId` or `VpnGatewayId` , but not both."}},"AWS::EC2::VPCPeeringConnection":{"attributes":{"Id":"The ID of the peering connection.","Ref":"`Ref` returns the ID of the VPC peering connection."},"description":"Requests a VPC peering connection between two VPCs: a requester VPC that you own and an accepter VPC with which to create the connection. The accepter VPC can belong to a different AWS account and can be in a different Region than the requester VPC.\\n\\nThe requester VPC and accepter VPC cannot have overlapping CIDR blocks. If you create a VPC peering connection request between VPCs with overlapping CIDR blocks, the VPC peering connection has a status of `failed` .\\n\\nIf the VPCs belong to different accounts, the acceptor account must have a role that allows the requester account to accept the VPC peering connection. For more information, see [Walkthough: Peer with a VPC in another AWS account](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/peer-with-vpc-in-another-account.html) .\\n\\nIf the requester and acceptor VPCs are in the same account, the peering request is accepted without a peering role.","properties":{"PeerOwnerId":"The AWS account ID of the owner of the accepter VPC.\\n\\nDefault: Your AWS account ID","PeerRegion":"The Region code for the accepter VPC, if the accepter VPC is located in a Region other than the Region in which you make the request.\\n\\nDefault: The Region in which you make the request.","PeerRoleArn":"The Amazon Resource Name (ARN) of the VPC peer role for the peering connection in another AWS account.\\n\\nThis is required when you are peering a VPC in a different AWS account.","PeerVpcId":"The ID of the VPC with which you are creating the VPC peering connection. You must specify this parameter in the request.","Tags":"Any tags assigned to the resource.","VpcId":"The ID of the VPC."}},"AWS::EC2::VPNConnection":{"attributes":{"Ref":"`Ref` returns the ID of the VPN connection.","VpnConnectionId":"The ID of the VPN connection."},"description":"Specifies a VPN connection between a virtual private gateway and a VPN customer gateway or a transit gateway and a VPN customer gateway.\\n\\nTo specify a VPN connection between a transit gateway and customer gateway, use the `TransitGatewayId` and `CustomerGatewayId` properties.\\n\\nTo specify a VPN connection between a virtual private gateway and customer gateway, use the `VpnGatewayId` and `CustomerGatewayId` properties.\\n\\nFor more information, see [AWS Site-to-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html) in the *AWS Site-to-Site VPN User Guide* .","properties":{"CustomerGatewayId":"The ID of the customer gateway at your end of the VPN connection.","StaticRoutesOnly":"Indicates whether the VPN connection uses static routes only. Static routes must be used for devices that don\'t support BGP.\\n\\nIf you are creating a VPN connection for a device that does not support Border Gateway Protocol (BGP), you must specify `true` .","Tags":"Any tags assigned to the VPN connection.","TransitGatewayId":"The ID of the transit gateway associated with the VPN connection.\\n\\nYou must specify either `TransitGatewayId` or `VpnGatewayId` , but not both.","Type":"The type of VPN connection.","VpnGatewayId":"The ID of the virtual private gateway at the AWS side of the VPN connection.\\n\\nYou must specify either `TransitGatewayId` or `VpnGatewayId` , but not both.","VpnTunnelOptionsSpecifications":"The tunnel options for the VPN connection."}},"AWS::EC2::VPNConnection.VpnTunnelOptionsSpecification":{"attributes":{},"description":"The tunnel options for a single VPN tunnel.","properties":{"PreSharedKey":"The pre-shared key (PSK) to establish initial authentication between the virtual private gateway and customer gateway.\\n\\nConstraints: Allowed characters are alphanumeric characters, periods (.), and underscores (_). Must be between 8 and 64 characters in length and cannot start with zero (0).","TunnelInsideCidr":"The range of inside IP addresses for the tunnel. Any specified CIDR blocks must be unique across all VPN connections that use the same virtual private gateway.\\n\\nConstraints: A size /30 CIDR block from the `169.254.0.0/16` range. The following CIDR blocks are reserved and cannot be used:\\n\\n- `169.254.0.0/30`\\n- `169.254.1.0/30`\\n- `169.254.2.0/30`\\n- `169.254.3.0/30`\\n- `169.254.4.0/30`\\n- `169.254.5.0/30`\\n- `169.254.169.252/30`"}},"AWS::EC2::VPNConnectionRoute":{"attributes":{"Ref":"`Ref` returns the ID of the VPN connection route."},"description":"Specifies a static route for a VPN connection between an existing virtual private gateway and a VPN customer gateway. The static route allows traffic to be routed from the virtual private gateway to the VPN customer gateway.\\n\\nFor more information, see [AWS Site-to-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html) in the *AWS Site-to-Site VPN User Guide* .","properties":{"DestinationCidrBlock":"The CIDR block associated with the local subnet of the customer network.","VpnConnectionId":"The ID of the VPN connection."}},"AWS::EC2::VPNGateway":{"attributes":{"Ref":"`Ref` returns the ID of the VPN gateway.","VPNGatewayId":"The ID of the VPN gateway."},"description":"Specifies a virtual private gateway. A virtual private gateway is the endpoint on the VPC side of your VPN connection. You can create a virtual private gateway before creating the VPC itself.\\n\\nFor more information, see [AWS Site-to-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html) in the *AWS Site-to-Site VPN User Guide* .","properties":{"AmazonSideAsn":"The private Autonomous System Number (ASN) for the Amazon side of a BGP session.","Tags":"Any tags assigned to the virtual private gateway.","Type":"The type of VPN connection the virtual private gateway supports."}},"AWS::EC2::VPNGatewayRoutePropagation":{"attributes":{"Ref":"`Ref` returns the ID of the VPN gateway."},"description":"Enables a virtual private gateway (VGW) to propagate routes to the specified route table of a VPC.\\n\\nIf you reference a VPN gateway that is in the same template as your VPN gateway route propagation, you must explicitly declare a dependency on the VPN gateway attachment. The `AWS::EC2::VPNGatewayRoutePropagation` resource cannot use the VPN gateway until it has successfully attached to the VPC. Add a [DependsOn Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) in the `AWS::EC2::VPNGatewayRoutePropagation` resource to explicitly declare a dependency on the VPN gateway attachment.","properties":{"RouteTableIds":"The ID of the route table. The routing table must be associated with the same VPC that the virtual private gateway is attached to.","VpnGatewayId":"The ID of the virtual private gateway that is attached to a VPC. The virtual private gateway must be attached to the same VPC that the routing tables are associated with."}},"AWS::EC2::VerifiedAccessEndpoint":{"attributes":{"CreationTime":"The creation time.","DeviceValidationDomain":"Use this to construct the redirect URI to add to your OIDC provider\'s allow list.","EndpointDomain":"The DNS name generated for the endpoint.","LastUpdatedTime":"The last updated time.","Ref":"`Ref` returns the ID of the Verified Access endpoint.","Status":"The endpoint status.","VerifiedAccessEndpointId":"The ID of the Verified Access endpoint.","VerifiedAccessInstanceId":"The instance identifier."},"description":"An AWS Verified Access endpoint specifies the application that AWS Verified Access provides access to. It must be attached to an AWS Verified Access group. An AWS Verified Access endpoint must also have an attached access policy before you attached it to a group.","properties":{"ApplicationDomain":"The DNS name for users to reach your application.","AttachmentType":"The type of attachment used to provide connectivity between the AWS Verified Access endpoint and the application.","Description":"A description for the AWS Verified Access endpoint.","DomainCertificateArn":"The ARN of a public TLS/SSL certificate imported into or created with ACM.","EndpointDomainPrefix":"A custom identifier that is prepended to the DNS name that is generated for the endpoint.","EndpointType":"The type of AWS Verified Access endpoint. Incoming application requests will be sent to an IP address, load balancer or a network interface depending on the endpoint type specified.","LoadBalancerOptions":"The load balancer details if creating the AWS Verified Access endpoint as `load-balancer` type.","NetworkInterfaceOptions":"The options for network-interface type endpoint.","PolicyDocument":"The Verified Access policy document.","PolicyEnabled":"The status of the Verified Access policy.","SecurityGroupIds":"The IDs of the security groups for the endpoint.","Tags":"The tags.","VerifiedAccessGroupId":"The ID of the AWS Verified Access group."}},"AWS::EC2::VerifiedAccessEndpoint.LoadBalancerOptions":{"attributes":{},"description":"Describes the load balancer options when creating an AWS Verified Access endpoint using the `load-balancer` type.","properties":{"LoadBalancerArn":"The ARN of the load balancer.","Port":"The IP port number.","Protocol":"The IP protocol.","SubnetIds":"The IDs of the subnets."}},"AWS::EC2::VerifiedAccessEndpoint.NetworkInterfaceOptions":{"attributes":{},"description":"Describes the network interface options when creating an AWS Verified Access endpoint using the `network-interface` type.","properties":{"NetworkInterfaceId":"The ID of the network interface.","Port":"The IP port number.","Protocol":"The IP protocol."}},"AWS::EC2::VerifiedAccessGroup":{"attributes":{"CreationTime":"The creation time.","LastUpdatedTime":"The last updated time.","Owner":"The ID of the AWS account that owns the group.","Ref":"`Ref` returns the ID of the Verified Access group.","VerifiedAccessGroupArn":"The ARN of the Verified Access group.","VerifiedAccessGroupId":"The ID of the Verified Access group."},"description":"Describes a Verified Access group.","properties":{"Description":"A description for the AWS Verified Access group.","PolicyDocument":"The Verified Access policy document.","PolicyEnabled":"The status of the Verified Access policy.","Tags":"The tags.","VerifiedAccessInstanceId":"The ID of the AWS Verified Access instance."}},"AWS::EC2::VerifiedAccessInstance":{"attributes":{"CreationTime":"The creation time.","LastUpdatedTime":"The last updated time.","Ref":"`Ref` returns the ID of the Verified Access instance.","VerifiedAccessInstanceId":"The ID of the Verified Access instance."},"description":"Describes a Verified Access instance.","properties":{"Description":"A description for the AWS Verified Access instance.","LoggingConfigurations":"The current logging configuration for the Verified Access instances.","Tags":"The tags.","VerifiedAccessTrustProviderIds":"The IDs of the AWS Verified Access trust providers.","VerifiedAccessTrustProviders":"The IDs of the AWS Verified Access trust providers."}},"AWS::EC2::VerifiedAccessInstance.CloudWatchLogs":{"attributes":{},"description":"Options for CloudWatch Logs as a logging destination.","properties":{"Enabled":"Indicates whether logging is enabled.","LogGroup":"The ID of the CloudWatch Logs log group."}},"AWS::EC2::VerifiedAccessInstance.KinesisDataFirehose":{"attributes":{},"description":"Options for Kinesis as a logging destination.","properties":{"DeliveryStream":"The ID of the delivery stream.","Enabled":"Indicates whether logging is enabled."}},"AWS::EC2::VerifiedAccessInstance.S3":{"attributes":{},"description":"Options for Amazon S3 as a logging destination.","properties":{"BucketName":"The bucket name.","BucketOwner":"The AWS account number that owns the bucket.","Enabled":"Indicates whether logging is enabled.","Prefix":"The bucket prefix."}},"AWS::EC2::VerifiedAccessInstance.VerifiedAccessLogs":{"attributes":{},"description":"Describes the options for Verified Access logs.","properties":{"CloudWatchLogs":"CloudWatch Logs logging destination.","IncludeTrustContext":"Include trust data sent by trust providers into the logs.","KinesisDataFirehose":"Kinesis logging destination.","LogVersion":"The logging version to use.\\n\\nValid values: `ocsf-0.1` | `ocsf-1.0.0-rc.2`","S3":"Amazon S3 logging options."}},"AWS::EC2::VerifiedAccessInstance.VerifiedAccessTrustProvider":{"attributes":{},"description":"Describes a Verified Access trust provider.","properties":{"Description":"A description for the AWS Verified Access trust provider.","DeviceTrustProviderType":"The type of device-based trust provider.","TrustProviderType":"The type of Verified Access trust provider.","UserTrustProviderType":"The type of user-based trust provider.","VerifiedAccessTrustProviderId":"The ID of the AWS Verified Access trust provider."}},"AWS::EC2::VerifiedAccessTrustProvider":{"attributes":{"CreationTime":"The creation time.","LastUpdatedTime":"The last updated time.","Ref":"`Ref` returns the ID of the Verified Access trust provider.","VerifiedAccessTrustProviderId":"The ID of the Verified Access trust provider."},"description":"Describes a Verified Access trust provider.","properties":{"Description":"A description for the AWS Verified Access trust provider.","DeviceOptions":"The options for device-identity trust provider.","DeviceTrustProviderType":"The type of device-based trust provider.","OidcOptions":"The options for an OpenID Connect-compatible user-identity trust provider.","PolicyReferenceName":"The identifier to be used when working with policy rules.","Tags":"The tags.","TrustProviderType":"The type of Verified Access trust provider.","UserTrustProviderType":"The type of user-based trust provider."}},"AWS::EC2::VerifiedAccessTrustProvider.DeviceOptions":{"attributes":{},"description":"Describes the options for an AWS Verified Access device-identity based trust provider.","properties":{"TenantId":"The ID of the tenant application with the device-identity provider."}},"AWS::EC2::VerifiedAccessTrustProvider.OidcOptions":{"attributes":{},"description":"Describes the options for an OpenID Connect-compatible user-identity trust provider.","properties":{"AuthorizationEndpoint":"The OIDC authorization endpoint.","ClientId":"The client identifier.","ClientSecret":"The client secret.","Issuer":"The OIDC issuer.","Scope":"The OpenID Connect (OIDC) scope specified.","TokenEndpoint":"The OIDC token endpoint.","UserInfoEndpoint":"The OIDC user info endpoint."}},"AWS::EC2::Volume":{"attributes":{"Ref":"`Ref` returns the resource name. For example: `vol-5cb85026` .","VolumeId":"The ID of the volume."},"description":"Specifies an Amazon Elastic Block Store (Amazon EBS) volume. You can attach the volume to an instance in the same Availability Zone using [AWS::EC2::VolumeAttachment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html) .\\n\\nWhen you use AWS CloudFormation to update an Amazon EBS volume that modifies `Iops` , `Size` , or `VolumeType` , there is a cooldown period before another operation can occur. This can cause your stack to report being in `UPDATE_IN_PROGRESS` or `UPDATE_ROLLBACK_IN_PROGRESS` for long periods of time.\\n\\nAmazon EBS does not support sizing down an Amazon EBS volume. AWS CloudFormation does not attempt to modify an Amazon EBS volume to a smaller size on rollback.\\n\\nSome common scenarios when you might encounter a cooldown period for Amazon EBS include:\\n\\n- You successfully update an Amazon EBS volume and the update succeeds. When you attempt another update within the cooldown window, that update will be subject to a cooldown period.\\n- You successfully update an Amazon EBS volume and the update succeeds but another change in your `update-stack` call fails. The rollback will be subject to a cooldown period.\\n\\nFor more information on the cooldown period, see [Requirements when modifying volumes](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/modify-volume-requirements.html) .\\n\\n*DeletionPolicy attribute*\\n\\nTo control how AWS CloudFormation handles the volume when the stack is deleted, set a deletion policy for your volume. You can choose to retain the volume, to delete the volume, or to create a snapshot of the volume. For more information, see [DeletionPolicy attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) .\\n\\n> If you set a deletion policy that creates a snapshot, all tags on the volume are included in the snapshot.","properties":{"AutoEnableIO":"Indicates whether the volume is auto-enabled for I/O operations. By default, Amazon EBS disables I/O to the volume from attached EC2 instances when it determines that a volume\'s data is potentially inconsistent. If the consistency of the volume is not a concern, and you prefer that the volume be made available immediately if it\'s impaired, you can configure the volume to automatically enable I/O.","AvailabilityZone":"The ID of the Availability Zone in which to create the volume. For example, `us-east-1a` .","Encrypted":"Indicates whether the volume should be encrypted. The effect of setting the encryption state to `true` depends on the volume origin (new or from a snapshot), starting encryption state, ownership, and whether encryption by default is enabled. For more information, see [Encryption by default](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#encryption-by-default) in the *Amazon Elastic Compute Cloud User Guide* .\\n\\nEncrypted Amazon EBS volumes must be attached to instances that support Amazon EBS encryption. For more information, see [Supported instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#EBSEncryption_supported_instances) .","Iops":"The number of I/O operations per second (IOPS). For `gp3` , `io1` , and `io2` volumes, this represents the number of IOPS that are provisioned for the volume. For `gp2` volumes, this represents the baseline performance of the volume and the rate at which the volume accumulates I/O credits for bursting.\\n\\nThe following are the supported values for each volume type:\\n\\n- `gp3` : 3,000-16,000 IOPS\\n- `io1` : 100-64,000 IOPS\\n- `io2` : 100-64,000 IOPS\\n\\n`io1` and `io2` volumes support up to 64,000 IOPS only on [Instances built on the Nitro System](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances) . Other instance families support performance up to 32,000 IOPS.\\n\\nThis parameter is required for `io1` and `io2` volumes. The default for `gp3` volumes is 3,000 IOPS. This parameter is not supported for `gp2` , `st1` , `sc1` , or `standard` volumes.","KmsKeyId":"The identifier of the AWS KMS key to use for Amazon EBS encryption. If `KmsKeyId` is specified, the encrypted state must be `true` .\\n\\nIf you omit this property and your account is enabled for encryption by default, or *Encrypted* is set to `true` , then the volume is encrypted using the default key specified for your account. If your account does not have a default key, then the volume is encrypted using the AWS managed key .\\n\\nAlternatively, if you want to specify a different key, you can specify one of the following:\\n\\n- Key ID. For example, 1234abcd-12ab-34cd-56ef-1234567890ab.\\n- Key alias. Specify the alias for the key, prefixed with `alias/` . For example, for a key with the alias `my_cmk` , use `alias/my_cmk` . Or to specify the AWS managed key , use `alias/aws/ebs` .\\n- Key ARN. For example, arn:aws:kms:us-east-1:012345678910:key/1234abcd-12ab-34cd-56ef-1234567890ab.\\n- Alias ARN. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.","MultiAttachEnabled":"Indicates whether Amazon EBS Multi-Attach is enabled.\\n\\nAWS CloudFormation does not currently support updating a single-attach volume to be multi-attach enabled, updating a multi-attach enabled volume to be single-attach, or updating the size or number of I/O operations per second (IOPS) of a multi-attach enabled volume.","OutpostArn":"The Amazon Resource Name (ARN) of the Outpost.","Size":"The size of the volume, in GiBs. You must specify either a snapshot ID or a volume size. If you specify a snapshot, the default is the snapshot size. You can specify a volume size that is equal to or larger than the snapshot size.\\n\\nThe following are the supported volumes sizes for each volume type:\\n\\n- `gp2` and `gp3` : 1-16,384\\n- `io1` and `io2` : 4-16,384\\n- `st1` and `sc1` : 125-16,384\\n- `standard` : 1-1,024","SnapshotId":"The snapshot from which to create the volume. You must specify either a snapshot ID or a volume size.","Tags":"The tags to apply to the volume during creation.","Throughput":"The throughput to provision for a volume, with a maximum of 1,000 MiB/s.\\n\\nThis parameter is valid only for `gp3` volumes. The default value is 125.\\n\\nValid Range: Minimum value of 125. Maximum value of 1000.","VolumeType":"The volume type. This parameter can be one of the following values:\\n\\n- General Purpose SSD: `gp2` | `gp3`\\n- Provisioned IOPS SSD: `io1` | `io2`\\n- Throughput Optimized HDD: `st1`\\n- Cold HDD: `sc1`\\n- Magnetic: `standard`\\n\\nFor more information, see [Amazon EBS volume types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html) in the *Amazon Elastic Compute Cloud User Guide* .\\n\\nDefault: `gp2`"}},"AWS::EC2::VolumeAttachment":{"attributes":{},"description":"Attaches an Amazon EBS volume to a running instance and exposes it to the instance with the specified device name.\\n\\nBefore this resource can be deleted (and therefore the volume detached), you must first unmount the volume in the instance. Failure to do so results in the volume being stuck in the busy state while it is trying to detach, which could possibly damage the file system or the data it contains.\\n\\nIf an Amazon EBS volume is the root device of an instance, it cannot be detached while the instance is in the \\"running\\" state. To detach the root volume, stop the instance first.\\n\\nIf the root volume is detached from an instance with an AWS Marketplace product code, then the product codes from that volume are no longer associated with the instance.","properties":{"Device":"The device name (for example, `/dev/sdh` or `xvdh` ).","InstanceId":"The ID of the instance to which the volume attaches. This value can be a reference to an [`AWS::EC2::Instance`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource, or it can be the physical ID of an existing EC2 instance.","VolumeId":"The ID of the Amazon EBS volume. The volume and instance must be within the same Availability Zone. This value can be a reference to an [`AWS::EC2::Volume`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html) resource, or it can be the volume ID of an existing Amazon EBS volume."}},"AWS::ECR::PublicRepository":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) for the specified `AWS::ECR::PublicRepository` resource. For example, `arn:aws:ecr-public:: *123456789012* :repository/ *test-repository*` .","Ref":"`Ref` returns the resource name, such as `test-repository` ."},"description":"The `AWS::ECR::PublicRepository` resource specifies an Amazon Elastic Container Registry Public (Amazon ECR Public) repository, where users can push and pull Docker images, Open Container Initiative (OCI) images, and OCI compatible artifacts. For more information, see [Amazon ECR public repositories](https://docs.aws.amazon.com/AmazonECR/latest/public/public-repositories.html) in the *Amazon ECR Public User Guide* .","properties":{"RepositoryCatalogData":"","RepositoryName":"The name to use for the public repository. The repository name may be specified on its own (such as `nginx-web-app` ) or it can be prepended with a namespace to group the repository into a category (such as `project-a/nginx-web-app` ). If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the repository name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","RepositoryPolicyText":"The JSON repository policy text to apply to the public repository. For more information, see [Amazon ECR Public repository policies](https://docs.aws.amazon.com/AmazonECR/latest/public/public-repository-policies.html) in the *Amazon ECR Public User Guide* .","Tags":"An array of key-value pairs to apply to this resource."}},"AWS::ECR::PublicRepository.RepositoryCatalogData":{"attributes":{},"description":"The details about the repository that are publicly visible in the Amazon ECR Public Gallery. For more information, see [Amazon ECR Public repository catalog data](https://docs.aws.amazon.com/AmazonECR/latest/public/public-repository-catalog-data.html) in the *Amazon ECR Public User Guide* .","properties":{"AboutText":"The longform description of the contents of the repository. This text appears in the repository details on the Amazon ECR Public Gallery.","Architectures":"The architecture tags that are associated with the repository.","OperatingSystems":"The operating system tags that are associated with the repository.","RepositoryDescription":"The short description of the repository.","UsageText":"The longform usage details of the contents of the repository. The usage text provides context for users of the repository."}},"AWS::ECR::PullThroughCacheRule":{"attributes":{},"description":"Creates a pull through cache rule. A pull through cache rule provides a way to cache images from an external public registry in your Amazon ECR private registry.","properties":{"EcrRepositoryPrefix":"The Amazon ECR repository prefix associated with the pull through cache rule.","UpstreamRegistryUrl":"The upstream registry URL associated with the pull through cache rule."}},"AWS::ECR::RegistryPolicy":{"attributes":{"RegistryId":"The account ID of the private registry the policy is associated with."},"description":"The `AWS::ECR::RegistryPolicy` resource creates or updates the permissions policy for a private registry.\\n\\nA private registry policy is used to specify permissions for another AWS account and is used when configuring cross-account replication. For more information, see [Registry permissions](https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-permissions.html) in the *Amazon Elastic Container Registry User Guide* .","properties":{"PolicyText":"The JSON policy text for your registry."}},"AWS::ECR::ReplicationConfiguration":{"attributes":{"RegistryId":"The account ID of the destination registry."},"description":"The `AWS::ECR::ReplicationConfiguration` resource creates or updates the replication configuration for a private registry. The first time a replication configuration is applied to a private registry, a service-linked IAM role is created in your account for the replication process. For more information, see [Using Service-Linked Roles for Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/using-service-linked-roles.html) in the *Amazon Elastic Container Registry User Guide* .\\n\\n> When configuring cross-account replication, the destination account must grant the source account permission to replicate. This permission is controlled using a private registry permissions policy. For more information, see `AWS::ECR::RegistryPolicy` .","properties":{"ReplicationConfiguration":"The replication configuration for a registry."}},"AWS::ECR::ReplicationConfiguration.ReplicationConfiguration":{"attributes":{},"description":"The replication configuration for a registry.","properties":{"Rules":"An array of objects representing the replication destinations and repository filters for a replication configuration."}},"AWS::ECR::ReplicationConfiguration.ReplicationDestination":{"attributes":{},"description":"An array of objects representing the destination for a replication rule.","properties":{"Region":"The Region to replicate to.","RegistryId":"The AWS account ID of the Amazon ECR private registry to replicate to. When configuring cross-Region replication within your own registry, specify your own account ID."}},"AWS::ECR::ReplicationConfiguration.ReplicationRule":{"attributes":{},"description":"An array of objects representing the replication destinations and repository filters for a replication configuration.","properties":{"Destinations":"An array of objects representing the destination for a replication rule.","RepositoryFilters":"An array of objects representing the filters for a replication rule. Specifying a repository filter for a replication rule provides a method for controlling which repositories in a private registry are replicated."}},"AWS::ECR::ReplicationConfiguration.RepositoryFilter":{"attributes":{},"description":"The filter settings used with image replication. Specifying a repository filter to a replication rule provides a method for controlling which repositories in a private registry are replicated. If no filters are added, the contents of all repositories are replicated.","properties":{"Filter":"The repository filter details. When the `PREFIX_MATCH` filter type is specified, this value is required and should be the repository name prefix to configure replication for.","FilterType":"The repository filter type. The only supported value is `PREFIX_MATCH` , which is a repository name prefix specified with the `filter` parameter."}},"AWS::ECR::Repository":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) for the specified `AWS::ECR::Repository` resource. For example, `arn:aws:ecr: *eu-west-1* : *123456789012* :repository/ *test-repository*` .","Ref":"`Ref` returns the resource name, such as `test-repository` .","RepositoryUri":"Returns the URI for the specified `AWS::ECR::Repository` resource. For example, `*123456789012* .dkr.ecr. *us-west-2* .amazonaws.com/repository` ."},"description":"The `AWS::ECR::Repository` resource specifies an Amazon Elastic Container Registry (Amazon ECR) repository, where users can push and pull Docker images, Open Container Initiative (OCI) images, and OCI compatible artifacts. For more information, see [Amazon ECR private repositories](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Repositories.html) in the *Amazon ECR User Guide* .","properties":{"EncryptionConfiguration":"The encryption configuration for the repository. This determines how the contents of your repository are encrypted at rest.","ImageScanningConfiguration":"The image scanning configuration for the repository. This determines whether images are scanned for known vulnerabilities after being pushed to the repository.","ImageTagMutability":"The tag mutability setting for the repository. If this parameter is omitted, the default setting of `MUTABLE` will be used which will allow image tags to be overwritten. If `IMMUTABLE` is specified, all image tags within the repository will be immutable which will prevent them from being overwritten.","LifecyclePolicy":"Creates or updates a lifecycle policy. For information about lifecycle policy syntax, see [Lifecycle policy template](https://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html) .","RepositoryName":"The name to use for the repository. The repository name may be specified on its own (such as `nginx-web-app` ) or it can be prepended with a namespace to group the repository into a category (such as `project-a/nginx-web-app` ). If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the repository name. For more information, see [Name type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\nThe repository name must start with a letter and can only contain lowercase letters, numbers, hyphens, underscores, and forward slashes.\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","RepositoryPolicyText":"The JSON repository policy text to apply to the repository. For more information, see [Amazon ECR repository policies](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html) in the *Amazon Elastic Container Registry User Guide* .","Tags":"An array of key-value pairs to apply to this resource."}},"AWS::ECR::Repository.EncryptionConfiguration":{"attributes":{},"description":"The encryption configuration for the repository. This determines how the contents of your repository are encrypted at rest.\\n\\nBy default, when no encryption configuration is set or the `AES256` encryption type is used, Amazon ECR uses server-side encryption with Amazon S3-managed encryption keys which encrypts your data at rest using an AES-256 encryption algorithm. This does not require any action on your part.\\n\\nFor more control over the encryption of the contents of your repository, you can use server-side encryption with AWS Key Management Service key stored in AWS Key Management Service ( AWS KMS ) to encrypt your images. For more information, see [Amazon ECR encryption at rest](https://docs.aws.amazon.com/AmazonECR/latest/userguide/encryption-at-rest.html) in the *Amazon Elastic Container Registry User Guide* .","properties":{"EncryptionType":"The encryption type to use.\\n\\nIf you use the `KMS` encryption type, the contents of the repository will be encrypted using server-side encryption with AWS Key Management Service key stored in AWS KMS . When you use AWS KMS to encrypt your data, you can either use the default AWS managed AWS KMS key for Amazon ECR, or specify your own AWS KMS key, which you already created. For more information, see [Protecting data using server-side encryption with an AWS KMS key stored in AWS Key Management Service (SSE-KMS)](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html) in the *Amazon Simple Storage Service Console Developer Guide* .\\n\\nIf you use the `AES256` encryption type, Amazon ECR uses server-side encryption with Amazon S3-managed encryption keys which encrypts the images in the repository using an AES-256 encryption algorithm. For more information, see [Protecting data using server-side encryption with Amazon S3-managed encryption keys (SSE-S3)](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html) in the *Amazon Simple Storage Service Console Developer Guide* .","KmsKey":"If you use the `KMS` encryption type, specify the AWS KMS key to use for encryption. The alias, key ID, or full ARN of the AWS KMS key can be specified. The key must exist in the same Region as the repository. If no key is specified, the default AWS managed AWS KMS key for Amazon ECR will be used."}},"AWS::ECR::Repository.ImageScanningConfiguration":{"attributes":{},"description":"The image scanning configuration for a repository.","properties":{"ScanOnPush":"The setting that determines whether images are scanned after being pushed to a repository. If set to `true` , images will be scanned after being pushed. If this parameter is not specified, it will default to `false` and images will not be scanned unless a scan is manually started."}},"AWS::ECR::Repository.LifecyclePolicy":{"attributes":{},"description":"The `LifecyclePolicy` property type specifies a lifecycle policy. For information about lifecycle policy syntax, see [Lifecycle policy template](https://docs.aws.amazon.com/AmazonECR/latest/userguide/LifecyclePolicies.html) in the *Amazon ECR User Guide* .","properties":{"LifecyclePolicyText":"The JSON repository policy text to apply to the repository.","RegistryId":"The AWS account ID associated with the registry that contains the repository. If you do not specify a registry, the default registry is assumed."}},"AWS::ECS::CapacityProvider":{"attributes":{"Ref":"`Ref` returns the resource name.\\n\\nIn the following example, the `Ref` function returns the name of the capacity provider, such as `MyStack-MyCapacityProvider-JrwYBzxovGfr` .\\n\\n`{ \\"Ref\\": \\"MyCapacityProvider\\" }`"},"description":"Creates a new capacity provider. Capacity providers are associated with an Amazon ECS cluster and are used in capacity provider strategies to facilitate cluster auto scaling.\\n\\nOnly capacity providers that use an Auto Scaling group can be created. Amazon ECS tasks on AWS Fargate use the `FARGATE` and `FARGATE_SPOT` capacity providers. These providers are available to all accounts in the AWS Regions that AWS Fargate supports.","properties":{"AutoScalingGroupProvider":"The Auto Scaling group settings for the capacity provider.","Name":"The name of the capacity provider. If a name is specified, it cannot start with `aws` , `ecs` , or `fargate` . If no name is specified, a default name in the `CFNStackName-CFNResourceName-RandomString` format is used.","Tags":"The metadata that you apply to the capacity provider to help you categorize and organize it. Each tag consists of a key and an optional value. You define both.\\n\\nThe following basic restrictions apply to tags:\\n\\n- Maximum number of tags per resource - 50\\n- For each resource, each tag key must be unique, and each tag key can have only one value.\\n- Maximum key length - 128 Unicode characters in UTF-8\\n- Maximum value length - 256 Unicode characters in UTF-8\\n- If your tagging schema is used across multiple services and resources, remember that other services may have restrictions on allowed characters. Generally allowed characters are: letters, numbers, and spaces representable in UTF-8, and the following characters: + - = . _ : / @.\\n- Tag keys and values are case-sensitive.\\n- Do not use `aws:` , `AWS:` , or any upper or lowercase combination of such as a prefix for either keys or values as it is reserved for AWS use. You cannot edit or delete tag keys or values with this prefix. Tags with this prefix do not count against your tags per resource limit."}},"AWS::ECS::CapacityProvider.AutoScalingGroupProvider":{"attributes":{},"description":"The details of the Auto Scaling group for the capacity provider.","properties":{"AutoScalingGroupArn":"The Amazon Resource Name (ARN) that identifies the Auto Scaling group.","ManagedScaling":"The managed scaling settings for the Auto Scaling group capacity provider.","ManagedTerminationProtection":"The managed termination protection setting to use for the Auto Scaling group capacity provider. This determines whether the Auto Scaling group has managed termination protection. The default is off.\\n\\n> When using managed termination protection, managed scaling must also be used otherwise managed termination protection doesn\'t work. \\n\\nWhen managed termination protection is on, Amazon ECS prevents the Amazon EC2 instances in an Auto Scaling group that contain tasks from being terminated during a scale-in action. The Auto Scaling group and each instance in the Auto Scaling group must have instance protection from scale-in actions on as well. For more information, see [Instance Protection](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-instance-termination.html#instance-protection) in the *AWS Auto Scaling User Guide* .\\n\\nWhen managed termination protection is off, your Amazon EC2 instances aren\'t protected from termination when the Auto Scaling group scales in."}},"AWS::ECS::CapacityProvider.ManagedScaling":{"attributes":{},"description":"The managed scaling settings for the Auto Scaling group capacity provider.\\n\\nWhen managed scaling is turned on, Amazon ECS manages the scale-in and scale-out actions of the Auto Scaling group. Amazon ECS manages a target tracking scaling policy using an Amazon ECS managed CloudWatch metric with the specified `targetCapacity` value as the target value for the metric. For more information, see [Using managed scaling](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/asg-capacity-providers.html#asg-capacity-providers-managed-scaling) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nIf managed scaling is off, the user must manage the scaling of the Auto Scaling group.","properties":{"InstanceWarmupPeriod":"The period of time, in seconds, after a newly launched Amazon EC2 instance can contribute to CloudWatch metrics for Auto Scaling group. If this parameter is omitted, the default value of `300` seconds is used.","MaximumScalingStepSize":"The maximum number of Amazon EC2 instances that Amazon ECS will scale out at one time. The scale in process is not affected by this parameter. If this parameter is omitted, the default value of `1` is used.","MinimumScalingStepSize":"The minimum number of Amazon EC2 instances that Amazon ECS will scale out at one time. The scale in process is not affected by this parameter If this parameter is omitted, the default value of `1` is used.\\n\\nWhen additional capacity is required, Amazon ECS will scale up the minimum scaling step size even if the actual demand is less than the minimum scaling step size.\\n\\nIf you use a capacity provider with an Auto Scaling group configured with more than one Amazon EC2 instance type or Availability Zone, Amazon ECS will scale up by the exact minimum scaling step size value and will ignore both the maximum scaling step size as well as the capacity demand.","Status":"Determines whether to use managed scaling for the capacity provider.","TargetCapacity":"The target capacity utilization as a percentage for the capacity provider. The specified value must be greater than `0` and less than or equal to `100` . For example, if you want the capacity provider to maintain 10% spare capacity, then that means the utilization is 90%, so use a `targetCapacity` of `90` . The default value of `100` percent results in the Amazon EC2 instances in your Auto Scaling group being completely used."}},"AWS::ECS::Cluster":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the Amazon ECS cluster, such as `arn:aws:ecs:us-east-2:123456789012:cluster/MyECSCluster` .","Ref":"`Ref` returns the resource name.\\n\\nIn the following example, the `Ref` function returns the name of the `MyECSCluster` cluster, such as `MyStack-MyECSCluster-NT5EUXTNTXXD` .\\n\\n`{ \\"Ref\\": \\"MyECSCluster\\" }`"},"description":"The `AWS::ECS::Cluster` resource creates an Amazon Elastic Container Service (Amazon ECS) cluster.","properties":{"CapacityProviders":"The short name of one or more capacity providers to associate with the cluster. A capacity provider must be associated with a cluster before it can be included as part of the default capacity provider strategy of the cluster or used in a capacity provider strategy when calling the [CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html) or [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html) actions.\\n\\nIf specifying a capacity provider that uses an Auto Scaling group, the capacity provider must be created but not associated with another cluster. New Auto Scaling group capacity providers can be created with the [CreateCapacityProvider](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html) API operation.\\n\\nTo use a AWS Fargate capacity provider, specify either the `FARGATE` or `FARGATE_SPOT` capacity providers. The AWS Fargate capacity providers are available to all accounts and only need to be associated with a cluster to be used.\\n\\nThe [PutCapacityProvider](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutCapacityProvider.html) API operation is used to update the list of available capacity providers for a cluster after the cluster is created.","ClusterName":"A user-generated string that you use to identify your cluster. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID for the name.","ClusterSettings":"The settings to use when creating a cluster. This parameter is used to turn on CloudWatch Container Insights for a cluster.","Configuration":"The execute command configuration for the cluster.","DefaultCapacityProviderStrategy":"The default capacity provider strategy for the cluster. When services or tasks are run in the cluster with no launch type or capacity provider strategy specified, the default capacity provider strategy is used.","ServiceConnectDefaults":"Use this parameter to set a default Service Connect namespace. After you set a default Service Connect namespace, any new services with Service Connect turned on that are created in the cluster are added as client services in the namespace. This setting only applies to new services that set the `enabled` parameter to `true` in the `ServiceConnectConfiguration` . You can set the namespace of each service individually in the `ServiceConnectConfiguration` to override this default parameter.\\n\\nTasks that run in a namespace can use short names to connect to services in the namespace. Tasks can connect to services across all of the clusters in the namespace. Tasks connect through a managed proxy container that collects logs and metrics for increased visibility. Only the tasks that Amazon ECS services create are supported with Service Connect. For more information, see [Service Connect](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html) in the *Amazon Elastic Container Service Developer Guide* .","Tags":"The metadata that you apply to the cluster to help you categorize and organize them. Each tag consists of a key and an optional value. You define both.\\n\\nThe following basic restrictions apply to tags:\\n\\n- Maximum number of tags per resource - 50\\n- For each resource, each tag key must be unique, and each tag key can have only one value.\\n- Maximum key length - 128 Unicode characters in UTF-8\\n- Maximum value length - 256 Unicode characters in UTF-8\\n- If your tagging schema is used across multiple services and resources, remember that other services may have restrictions on allowed characters. Generally allowed characters are: letters, numbers, and spaces representable in UTF-8, and the following characters: + - = . _ : / @.\\n- Tag keys and values are case-sensitive.\\n- Do not use `aws:` , `AWS:` , or any upper or lowercase combination of such as a prefix for either keys or values as it is reserved for AWS use. You cannot edit or delete tag keys or values with this prefix. Tags with this prefix do not count against your tags per resource limit."}},"AWS::ECS::Cluster.CapacityProviderStrategyItem":{"attributes":{},"description":"The `CapacityProviderStrategyItem` property specifies the details of the default capacity provider strategy for the cluster. When services or tasks are run in the cluster with no launch type or capacity provider strategy specified, the default capacity provider strategy is used.","properties":{"Base":"The *base* value designates how many tasks, at a minimum, to run on the specified capacity provider. Only one capacity provider in a capacity provider strategy can have a *base* defined. If no value is specified, the default value of `0` is used.","CapacityProvider":"The short name of the capacity provider.","Weight":"The *weight* value designates the relative percentage of the total number of tasks launched that should use the specified capacity provider. The `weight` value is taken into consideration after the `base` value, if defined, is satisfied.\\n\\nIf no `weight` value is specified, the default value of `0` is used. When multiple capacity providers are specified within a capacity provider strategy, at least one of the capacity providers must have a weight value greater than zero and any capacity providers with a weight of `0` can\'t be used to place tasks. If you specify multiple capacity providers in a strategy that all have a weight of `0` , any `RunTask` or `CreateService` actions using the capacity provider strategy will fail.\\n\\nAn example scenario for using weights is defining a strategy that contains two capacity providers and both have a weight of `1` , then when the `base` is satisfied, the tasks will be split evenly across the two capacity providers. Using that same logic, if you specify a weight of `1` for *capacityProviderA* and a weight of `4` for *capacityProviderB* , then for every one task that\'s run using *capacityProviderA* , four tasks would use *capacityProviderB* ."}},"AWS::ECS::Cluster.ClusterConfiguration":{"attributes":{},"description":"The execute command configuration for the cluster.","properties":{"ExecuteCommandConfiguration":"The details of the execute command configuration."}},"AWS::ECS::Cluster.ClusterSettings":{"attributes":{},"description":"The settings to use when creating a cluster. This parameter is used to turn on CloudWatch Container Insights for a cluster.","properties":{"Name":"The name of the cluster setting. The value is `containerInsights` .","Value":"The value to set for the cluster setting. The supported values are `enabled` and `disabled` .\\n\\nIf you set `name` to `containerInsights` and `value` to `enabled` , CloudWatch Container Insights will be on for the cluster, otherwise it will be off unless the `containerInsights` account setting is turned on. If a cluster value is specified, it will override the `containerInsights` value set with [PutAccountSetting](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutAccountSetting.html) or [PutAccountSettingDefault](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutAccountSettingDefault.html) ."}},"AWS::ECS::Cluster.ExecuteCommandConfiguration":{"attributes":{},"description":"The details of the execute command configuration.","properties":{"KmsKeyId":"Specify an AWS Key Management Service key ID to encrypt the data between the local client and the container.","LogConfiguration":"The log configuration for the results of the execute command actions. The logs can be sent to CloudWatch Logs or an Amazon S3 bucket. When `logging=OVERRIDE` is specified, a `logConfiguration` must be provided.","Logging":"The log setting to use for redirecting logs for your execute command results. The following log settings are available.\\n\\n- `NONE` : The execute command session is not logged.\\n- `DEFAULT` : The `awslogs` configuration in the task definition is used. If no logging parameter is specified, it defaults to this value. If no `awslogs` log driver is configured in the task definition, the output won\'t be logged.\\n- `OVERRIDE` : Specify the logging details as a part of `logConfiguration` . If the `OVERRIDE` logging option is specified, the `logConfiguration` is required."}},"AWS::ECS::Cluster.ExecuteCommandLogConfiguration":{"attributes":{},"description":"The log configuration for the results of the execute command actions. The logs can be sent to CloudWatch Logs or an Amazon S3 bucket.","properties":{"CloudWatchEncryptionEnabled":"Determines whether to use encryption on the CloudWatch logs. If not specified, encryption will be off.","CloudWatchLogGroupName":"The name of the CloudWatch log group to send logs to.\\n\\n> The CloudWatch log group must already be created.","S3BucketName":"The name of the S3 bucket to send logs to.\\n\\n> The S3 bucket must already be created.","S3EncryptionEnabled":"Determines whether to use encryption on the S3 logs. If not specified, encryption is not used.","S3KeyPrefix":"An optional folder in the S3 bucket to place logs in."}},"AWS::ECS::Cluster.ServiceConnectDefaults":{"attributes":{},"description":"Use this parameter to set a default Service Connect namespace. After you set a default Service Connect namespace, any new services with Service Connect turned on that are created in the cluster are added as client services in the namespace. This setting only applies to new services that set the `enabled` parameter to `true` in the `ServiceConnectConfiguration` . You can set the namespace of each service individually in the `ServiceConnectConfiguration` to override this default parameter.\\n\\nTasks that run in a namespace can use short names to connect to services in the namespace. Tasks can connect to services across all of the clusters in the namespace. Tasks connect through a managed proxy container that collects logs and metrics for increased visibility. Only the tasks that Amazon ECS services create are supported with Service Connect. For more information, see [Service Connect](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"Namespace":"The namespace name or full Amazon Resource Name (ARN) of the AWS Cloud Map namespace that\'s used when you create a service and don\'t specify a Service Connect configuration. The namespace name can include up to 1024 characters. The name is case-sensitive. The name can\'t include hyphens (-), tilde (~), greater than (>), less than (<), or slash (/).\\n\\nIf you enter an existing namespace name or ARN, then that namespace will be used. Any namespace type is supported. The namespace must be in this account and this AWS Region.\\n\\nIf you enter a new name, a AWS Cloud Map namespace will be created. Amazon ECS creates a AWS Cloud Map namespace with the \\"API calls\\" method of instance discovery only. This instance discovery method is the \\"HTTP\\" namespace type in the AWS Command Line Interface . Other types of instance discovery aren\'t used by Service Connect.\\n\\nIf you update the service with an empty string `\\"\\"` for the namespace name, the cluster configuration for Service Connect is removed. Note that the namespace will remain in AWS Cloud Map and must be deleted separately.\\n\\nFor more information about AWS Cloud Map , see [Working with Services](https://docs.aws.amazon.com/cloud-map/latest/dg/working-with-services.html) in the *AWS Cloud Map Developer Guide* ."}},"AWS::ECS::ClusterCapacityProviderAssociations":{"attributes":{"Ref":"`Ref` returns the cluster name."},"description":"The `AWS::ECS::ClusterCapacityProviderAssociations` resource associates one or more capacity providers and a default capacity provider strategy with a cluster.","properties":{"CapacityProviders":"The capacity providers to associate with the cluster.","Cluster":"The cluster the capacity provider association is the target of.","DefaultCapacityProviderStrategy":"The default capacity provider strategy to associate with the cluster."}},"AWS::ECS::ClusterCapacityProviderAssociations.CapacityProviderStrategy":{"attributes":{},"description":"The `CapacityProviderStrategy` property specifies the details of the default capacity provider strategy for the cluster. When services or tasks are run in the cluster with no launch type or capacity provider strategy specified, the default capacity provider strategy is used.","properties":{"Base":"The *base* value designates how many tasks, at a minimum, to run on the specified capacity provider. Only one capacity provider in a capacity provider strategy can have a *base* defined. If no value is specified, the default value of `0` is used.","CapacityProvider":"The short name of the capacity provider.","Weight":"The *weight* value designates the relative percentage of the total number of tasks launched that should use the specified capacity provider. The `weight` value is taken into consideration after the `base` value, if defined, is satisfied.\\n\\nIf no `weight` value is specified, the default value of `0` is used. When multiple capacity providers are specified within a capacity provider strategy, at least one of the capacity providers must have a weight value greater than zero and any capacity providers with a weight of `0` will not be used to place tasks. If you specify multiple capacity providers in a strategy that all have a weight of `0` , any `RunTask` or `CreateService` actions using the capacity provider strategy will fail.\\n\\nAn example scenario for using weights is defining a strategy that contains two capacity providers and both have a weight of `1` , then when the `base` is satisfied, the tasks will be split evenly across the two capacity providers. Using that same logic, if you specify a weight of `1` for *capacityProviderA* and a weight of `4` for *capacityProviderB* , then for every one task that is run using *capacityProviderA* , four tasks would use *capacityProviderB* ."}},"AWS::ECS::PrimaryTaskSet":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"Modifies which task set in a service is the primary task set. Any parameters that are updated on the primary task set in a service will transition to the service. This is used when a service uses the `EXTERNAL` deployment controller type. For more information, see [Amazon ECS Deployment Types](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"Cluster":"The short name or full Amazon Resource Name (ARN) of the cluster that hosts the service that the task set exists in.","Service":"The short name or full Amazon Resource Name (ARN) of the service that the task set exists in.","TaskSetId":"The short name or full Amazon Resource Name (ARN) of the task set to set as the primary task set in the deployment."}},"AWS::ECS::Service":{"attributes":{"Name":"The name of the Amazon ECS service, such as `sample-webapp` .","Ref":"`Ref` returns the Amazon Resource Name (ARN).\\n\\nIn the following example, the `Ref` function returns the ARN of the `MyECSService` service, such as `arn:aws:ecs:us-west-2:123456789012:service/sample-webapp` .\\n\\n`{ \\"Ref\\": \\"MyECSService\\" }`","ServiceArn":"Not currently supported in AWS CloudFormation ."},"description":"The `AWS::ECS::Service` resource creates an Amazon Elastic Container Service (Amazon ECS) service that runs and maintains the requested number of tasks and associated load balancers.\\n\\n> The stack update fails if you change any properties that require replacement and at least one Amazon ECS Service Connect `ServiceConnectService` is configured. This is because AWS CloudFormation creates the replacement service first, but each `ServiceConnectService` must have a name that is unique in the namespace. > Starting April 15, 2023, AWS ; will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS , or Amazon EC2 . However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.","properties":{"CapacityProviderStrategy":"The capacity provider strategy to use for the service.\\n\\nIf a `capacityProviderStrategy` is specified, the `launchType` parameter must be omitted. If no `capacityProviderStrategy` or `launchType` is specified, the `defaultCapacityProviderStrategy` for the cluster is used.\\n\\nA capacity provider strategy may contain a maximum of 6 capacity providers.","Cluster":"The short name or full Amazon Resource Name (ARN) of the cluster that you run your service on. If you do not specify a cluster, the default cluster is assumed.","DeploymentConfiguration":"Optional deployment parameters that control how many tasks run during the deployment and the ordering of stopping and starting tasks.","DeploymentController":"The deployment controller to use for the service. If no deployment controller is specified, the default value of `ECS` is used.","DesiredCount":"The number of instantiations of the specified task definition to place and keep running in your service.\\n\\nFor new services, if a desired count is not specified, a default value of `1` is used. When using the `DAEMON` scheduling strategy, the desired count is not required.\\n\\nFor existing services, if a desired count is not specified, it is omitted from the operation.","EnableECSManagedTags":"Specifies whether to turn on Amazon ECS managed tags for the tasks within the service. For more information, see [Tagging your Amazon ECS resources](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nWhen you use Amazon ECS managed tags, you need to set the `propagateTags` request parameter.","EnableExecuteCommand":"Determines whether the execute command functionality is turned on for the service. If `true` , the execute command functionality is turned on for all containers in tasks as part of the service.","HealthCheckGracePeriodSeconds":"The period of time, in seconds, that the Amazon ECS service scheduler ignores unhealthy Elastic Load Balancing target health checks after a task has first started. This is only used when your service is configured to use a load balancer. If your service has a load balancer defined and you don\'t specify a health check grace period value, the default value of `0` is used.\\n\\nIf you do not use an Elastic Load Balancing, we recommend that you use the `startPeriod` in the task definition health check parameters. For more information, see [Health check](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html) .\\n\\nIf your service\'s tasks take a while to start and respond to Elastic Load Balancing health checks, you can specify a health check grace period of up to 2,147,483,647 seconds (about 69 years). During that time, the Amazon ECS service scheduler ignores health check status. This grace period can prevent the service scheduler from marking tasks as unhealthy and stopping them before they have time to come up.","LaunchType":"The launch type on which to run your service. For more information, see [Amazon ECS Launch Types](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html) in the *Amazon Elastic Container Service Developer Guide* .","LoadBalancers":"A list of load balancer objects to associate with the service. If you specify the `Role` property, `LoadBalancers` must be specified as well. For information about the number of load balancers that you can specify per service, see [Service Load Balancing](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html) in the *Amazon Elastic Container Service Developer Guide* .","NetworkConfiguration":"The network configuration for the service. This parameter is required for task definitions that use the `awsvpc` network mode to receive their own elastic network interface, and it is not supported for other network modes. For more information, see [Task Networking](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html) in the *Amazon Elastic Container Service Developer Guide* .","PlacementConstraints":"An array of placement constraint objects to use for tasks in your service. You can specify a maximum of 10 constraints for each task. This limit includes constraints in the task definition and those specified at runtime.","PlacementStrategies":"The placement strategy objects to use for tasks in your service. You can specify a maximum of 5 strategy rules for each service.","PlatformVersion":"The platform version that your tasks in the service are running on. A platform version is specified only for tasks using the Fargate launch type. If one isn\'t specified, the `LATEST` platform version is used. For more information, see [AWS Fargate platform versions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html) in the *Amazon Elastic Container Service Developer Guide* .","PropagateTags":"Specifies whether to propagate the tags from the task definition to the task. If no value is specified, the tags aren\'t propagated. Tags can only be propagated to the task during task creation. To add tags to a task after task creation, use the [TagResource](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TagResource.html) API action.\\n\\nThe default is `NONE` .","Role":"The name or full Amazon Resource Name (ARN) of the IAM role that allows Amazon ECS to make calls to your load balancer on your behalf. This parameter is only permitted if you are using a load balancer with your service and your task definition doesn\'t use the `awsvpc` network mode. If you specify the `role` parameter, you must also specify a load balancer object with the `loadBalancers` parameter.\\n\\n> If your account has already created the Amazon ECS service-linked role, that role is used for your service unless you specify a role here. The service-linked role is required if your task definition uses the `awsvpc` network mode or if the service is configured to use service discovery, an external deployment controller, multiple target groups, or Elastic Inference accelerators in which case you don\'t specify a role here. For more information, see [Using service-linked roles for Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html) in the *Amazon Elastic Container Service Developer Guide* . \\n\\nIf your specified role has a path other than `/` , then you must either specify the full role ARN (this is recommended) or prefix the role name with the path. For example, if a role with the name `bar` has a path of `/foo/` then you would specify `/foo/bar` as the role name. For more information, see [Friendly names and paths](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names) in the *IAM User Guide* .","SchedulingStrategy":"The scheduling strategy to use for the service. For more information, see [Services](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html) .\\n\\nThere are two service scheduler strategies available:\\n\\n- `REPLICA` -The replica scheduling strategy places and maintains the desired number of tasks across your cluster. By default, the service scheduler spreads tasks across Availability Zones. You can use task placement strategies and constraints to customize task placement decisions. This scheduler strategy is required if the service uses the `CODE_DEPLOY` or `EXTERNAL` deployment controller types.\\n- `DAEMON` -The daemon scheduling strategy deploys exactly one task on each active container instance that meets all of the task placement constraints that you specify in your cluster. The service scheduler also evaluates the task placement constraints for running tasks and will stop tasks that don\'t meet the placement constraints. When you\'re using this strategy, you don\'t need to specify a desired number of tasks, a task placement strategy, or use Service Auto Scaling policies.\\n\\n> Tasks using the Fargate launch type or the `CODE_DEPLOY` or `EXTERNAL` deployment controller types don\'t support the `DAEMON` scheduling strategy.","ServiceConnectConfiguration":"The configuration for this service to discover and connect to services, and be discovered by, and connected from, other services within a namespace.\\n\\nTasks that run in a namespace can use short names to connect to services in the namespace. Tasks can connect to services across all of the clusters in the namespace. Tasks connect through a managed proxy container that collects logs and metrics for increased visibility. Only the tasks that Amazon ECS services create are supported with Service Connect. For more information, see [Service Connect](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html) in the *Amazon Elastic Container Service Developer Guide* .","ServiceName":"The name of your service. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. Service names must be unique within a cluster, but you can have similarly named services in multiple clusters within a Region or across multiple Regions.\\n\\n> The stack update fails if you change any properties that require replacement and the `ServiceName` is configured. This is because AWS CloudFormation creates the replacement service first, but each `ServiceName` must be unique in the cluster.","ServiceRegistries":"The details of the service discovery registry to associate with this service. For more information, see [Service discovery](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html) .\\n\\n> Each service may be associated with one service registry. Multiple service registries for each service isn\'t supported.","Tags":"The metadata that you apply to the service to help you categorize and organize them. Each tag consists of a key and an optional value, both of which you define. When a service is deleted, the tags are deleted as well.\\n\\nThe following basic restrictions apply to tags:\\n\\n- Maximum number of tags per resource - 50\\n- For each resource, each tag key must be unique, and each tag key can have only one value.\\n- Maximum key length - 128 Unicode characters in UTF-8\\n- Maximum value length - 256 Unicode characters in UTF-8\\n- If your tagging schema is used across multiple services and resources, remember that other services may have restrictions on allowed characters. Generally allowed characters are: letters, numbers, and spaces representable in UTF-8, and the following characters: + - = . _ : / @.\\n- Tag keys and values are case-sensitive.\\n- Do not use `aws:` , `AWS:` , or any upper or lowercase combination of such as a prefix for either keys or values as it is reserved for AWS use. You cannot edit or delete tag keys or values with this prefix. Tags with this prefix do not count against your tags per resource limit.","TaskDefinition":"The `family` and `revision` ( `family:revision` ) or full ARN of the task definition to run in your service. If a `revision` isn\'t specified, the latest `ACTIVE` revision is used.\\n\\nA task definition must be specified if the service uses either the `ECS` or `CODE_DEPLOY` deployment controllers.\\n\\nFor more information about deployment types, see [Amazon ECS deployment types](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html) ."}},"AWS::ECS::Service.AwsVpcConfiguration":{"attributes":{},"description":"An object representing the networking details for a task or service.","properties":{"AssignPublicIp":"Whether the task\'s elastic network interface receives a public IP address. The default value is `DISABLED` .","SecurityGroups":"The IDs of the security groups associated with the task or service. If you don\'t specify a security group, the default security group for the VPC is used. There\'s a limit of 5 security groups that can be specified per `AwsVpcConfiguration` .\\n\\n> All specified security groups must be from the same VPC.","Subnets":"The IDs of the subnets associated with the task or service. There\'s a limit of 16 subnets that can be specified per `AwsVpcConfiguration` .\\n\\n> All specified subnets must be from the same VPC."}},"AWS::ECS::Service.CapacityProviderStrategyItem":{"attributes":{},"description":"The details of a capacity provider strategy. A capacity provider strategy can be set when using the `RunTask` or `CreateService` APIs or as the default capacity provider strategy for a cluster with the `CreateCluster` API.\\n\\nOnly capacity providers that are already associated with a cluster and have an `ACTIVE` or `UPDATING` status can be used in a capacity provider strategy. The `PutClusterCapacityProviders` API is used to associate a capacity provider with a cluster.\\n\\nIf specifying a capacity provider that uses an Auto Scaling group, the capacity provider must already be created. New Auto Scaling group capacity providers can be created with the `CreateCapacityProvider` API operation.\\n\\nTo use an AWS Fargate capacity provider, specify either the `FARGATE` or `FARGATE_SPOT` capacity providers. The AWS Fargate capacity providers are available to all accounts and only need to be associated with a cluster to be used in a capacity provider strategy.","properties":{"Base":"The *base* value designates how many tasks, at a minimum, to run on the specified capacity provider. Only one capacity provider in a capacity provider strategy can have a *base* defined. If no value is specified, the default value of `0` is used.","CapacityProvider":"The short name of the capacity provider.","Weight":"The *weight* value designates the relative percentage of the total number of tasks launched that should use the specified capacity provider. The `weight` value is taken into consideration after the `base` value, if defined, is satisfied.\\n\\nIf no `weight` value is specified, the default value of `0` is used. When multiple capacity providers are specified within a capacity provider strategy, at least one of the capacity providers must have a weight value greater than zero and any capacity providers with a weight of `0` can\'t be used to place tasks. If you specify multiple capacity providers in a strategy that all have a weight of `0` , any `RunTask` or `CreateService` actions using the capacity provider strategy will fail.\\n\\nAn example scenario for using weights is defining a strategy that contains two capacity providers and both have a weight of `1` , then when the `base` is satisfied, the tasks will be split evenly across the two capacity providers. Using that same logic, if you specify a weight of `1` for *capacityProviderA* and a weight of `4` for *capacityProviderB* , then for every one task that\'s run using *capacityProviderA* , four tasks would use *capacityProviderB* ."}},"AWS::ECS::Service.DeploymentAlarms":{"attributes":{},"description":"One of the methods which provide a way for you to quickly identify when a deployment has failed, and then to optionally roll back the failure to the last working deployment.\\n\\nWhen the alarms are generated, Amazon ECS sets the service deployment to failed. Set the rollback parameter to have Amazon ECS to roll back your service to the last completed deployment after a failure.\\n\\nYou can only use the `DeploymentAlarms` method to detect failures when the `DeploymentController` is set to `ECS` (rolling update).\\n\\nFor more information, see [Rolling update](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-ecs.html) in the **Amazon Elastic Container Service Developer Guide** .","properties":{"AlarmNames":"One or more CloudWatch alarm names. Use a \\",\\" to separate the alarms.","Enable":"Determines whether to use the CloudWatch alarm option in the service deployment process.","Rollback":"Determines whether to configure Amazon ECS to roll back the service if a service deployment fails. If rollback is used, when a service deployment fails, the service is rolled back to the last deployment that completed successfully."}},"AWS::ECS::Service.DeploymentCircuitBreaker":{"attributes":{},"description":"> The deployment circuit breaker can only be used for services using the rolling update ( `ECS` ) deployment type. \\n\\nThe *deployment circuit breaker* determines whether a service deployment will fail if the service can\'t reach a steady state. If it is turned on, a service deployment will transition to a failed state and stop launching new tasks. You can also configure Amazon ECS to roll back your service to the last completed deployment after a failure. For more information, see [Rolling update](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-ecs.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nFor more information about API failure reasons, see [API failure reasons](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/api_failures_messages.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"Enable":"Determines whether to use the deployment circuit breaker logic for the service.","Rollback":"Determines whether to configure Amazon ECS to roll back the service if a service deployment fails. If rollback is on, when a service deployment fails, the service is rolled back to the last deployment that completed successfully."}},"AWS::ECS::Service.DeploymentConfiguration":{"attributes":{},"description":"The `DeploymentConfiguration` property specifies optional deployment parameters that control how many tasks run during the deployment and the ordering of stopping and starting tasks.","properties":{"Alarms":"Information about the CloudWatch alarms.","DeploymentCircuitBreaker":"> The deployment circuit breaker can only be used for services using the rolling update ( `ECS` ) deployment type. \\n\\nThe *deployment circuit breaker* determines whether a service deployment will fail if the service can\'t reach a steady state. If you use the deployment circuit breaker, a service deployment will transition to a failed state and stop launching new tasks. If you use the rollback option, when a service deployment fails, the service is rolled back to the last deployment that completed successfully. For more information, see [Rolling update](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-ecs.html) in the *Amazon Elastic Container Service Developer Guide*","MaximumPercent":"If a service is using the rolling update ( `ECS` ) deployment type, the `maximumPercent` parameter represents an upper limit on the number of your service\'s tasks that are allowed in the `RUNNING` or `PENDING` state during a deployment, as a percentage of the `desiredCount` (rounded down to the nearest integer). This parameter enables you to define the deployment batch size. For example, if your service is using the `REPLICA` service scheduler and has a `desiredCount` of four tasks and a `maximumPercent` value of 200%, the scheduler may start four new tasks before stopping the four older tasks (provided that the cluster resources required to do this are available). The default `maximumPercent` value for a service using the `REPLICA` service scheduler is 200%.\\n\\nIf a service is using either the blue/green ( `CODE_DEPLOY` ) or `EXTERNAL` deployment types and tasks that use the EC2 launch type, the *maximum percent* value is set to the default value and is used to define the upper limit on the number of the tasks in the service that remain in the `RUNNING` state while the container instances are in the `DRAINING` state. If the tasks in the service use the Fargate launch type, the maximum percent value is not used, although it is returned when describing your service.","MinimumHealthyPercent":"If a service is using the rolling update ( `ECS` ) deployment type, the `minimumHealthyPercent` represents a lower limit on the number of your service\'s tasks that must remain in the `RUNNING` state during a deployment, as a percentage of the `desiredCount` (rounded up to the nearest integer). This parameter enables you to deploy without using additional cluster capacity. For example, if your service has a `desiredCount` of four tasks and a `minimumHealthyPercent` of 50%, the service scheduler may stop two existing tasks to free up cluster capacity before starting two new tasks.\\n\\nFor services that *do not* use a load balancer, the following should be noted:\\n\\n- A service is considered healthy if all essential containers within the tasks in the service pass their health checks.\\n- If a task has no essential containers with a health check defined, the service scheduler will wait for 40 seconds after a task reaches a `RUNNING` state before the task is counted towards the minimum healthy percent total.\\n- If a task has one or more essential containers with a health check defined, the service scheduler will wait for the task to reach a healthy status before counting it towards the minimum healthy percent total. A task is considered healthy when all essential containers within the task have passed their health checks. The amount of time the service scheduler can wait for is determined by the container health check settings.\\n\\nFor services are that *do* use a load balancer, the following should be noted:\\n\\n- If a task has no essential containers with a health check defined, the service scheduler will wait for the load balancer target group health check to return a healthy status before counting the task towards the minimum healthy percent total.\\n- If a task has an essential container with a health check defined, the service scheduler will wait for both the task to reach a healthy status and the load balancer target group health check to return a healthy status before counting the task towards the minimum healthy percent total.\\n\\nIf a service is using either the blue/green ( `CODE_DEPLOY` ) or `EXTERNAL` deployment types and is running tasks that use the EC2 launch type, the *minimum healthy percent* value is set to the default value and is used to define the lower limit on the number of the tasks in the service that remain in the `RUNNING` state while the container instances are in the `DRAINING` state. If a service is using either the blue/green ( `CODE_DEPLOY` ) or `EXTERNAL` deployment types and is running tasks that use the Fargate launch type, the minimum healthy percent value is not used, although it is returned when describing your service."}},"AWS::ECS::Service.DeploymentController":{"attributes":{},"description":"The deployment controller to use for the service. For more information, see [Amazon ECS deployment types](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"Type":"The deployment controller type to use. There are three deployment controller types available:\\n\\n- **ECS** - The rolling update ( `ECS` ) deployment type involves replacing the current running version of the container with the latest version. The number of containers Amazon ECS adds or removes from the service during a rolling update is controlled by adjusting the minimum and maximum number of healthy tasks allowed during a service deployment, as specified in the [DeploymentConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeploymentConfiguration.html) .\\n- **CODE_DEPLOY** - The blue/green ( `CODE_DEPLOY` ) deployment type uses the blue/green deployment model powered by AWS CodeDeploy , which allows you to verify a new deployment of a service before sending production traffic to it.\\n- **EXTERNAL** - The external ( `EXTERNAL` ) deployment type enables you to use any third-party deployment controller for full control over the deployment process for an Amazon ECS service."}},"AWS::ECS::Service.LoadBalancer":{"attributes":{},"description":"The `LoadBalancer` property specifies details on a load balancer that is used with a service.\\n\\nIf the service is using the `CODE_DEPLOY` deployment controller, the service is required to use either an Application Load Balancer or Network Load Balancer. When you are creating an AWS CodeDeploy deployment group, you specify two target groups (referred to as a `targetGroupPair` ). Each target group binds to a separate task set in the deployment. The load balancer can also have up to two listeners, a required listener for production traffic and an optional listener that allows you to test new revisions of the service before routing production traffic to it.\\n\\nServices with tasks that use the `awsvpc` network mode (for example, those with the Fargate launch type) only support Application Load Balancers and Network Load Balancers. Classic Load Balancers are not supported. Also, when you create any target groups for these services, you must choose `ip` as the target type, not `instance` . Tasks that use the `awsvpc` network mode are associated with an elastic network interface, not an Amazon EC2 instance.","properties":{"ContainerName":"The name of the container (as it appears in a container definition) to associate with the load balancer.","ContainerPort":"The port on the container to associate with the load balancer. This port must correspond to a `containerPort` in the task definition the tasks in the service are using. For tasks that use the EC2 launch type, the container instance they\'re launched on must allow ingress traffic on the `hostPort` of the port mapping.","LoadBalancerName":"The name of the load balancer to associate with the Amazon ECS service or task set.\\n\\nA load balancer name is only specified when using a Classic Load Balancer. If you are using an Application Load Balancer or a Network Load Balancer the load balancer name parameter should be omitted.","TargetGroupArn":"The full Amazon Resource Name (ARN) of the Elastic Load Balancing target group or groups associated with a service or task set.\\n\\nA target group ARN is only specified when using an Application Load Balancer or Network Load Balancer. If you\'re using a Classic Load Balancer, omit the target group ARN.\\n\\nFor services using the `ECS` deployment controller, you can specify one or multiple target groups. For more information, see [Registering multiple target groups with a service](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nFor services using the `CODE_DEPLOY` deployment controller, you\'re required to define two target groups for the load balancer. For more information, see [Blue/green deployment with CodeDeploy](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-bluegreen.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\n> If your service\'s task definition uses the `awsvpc` network mode, you must choose `ip` as the target type, not `instance` . Do this when creating your target groups because tasks that use the `awsvpc` network mode are associated with an elastic network interface, not an Amazon EC2 instance. This network mode is required for the Fargate launch type."}},"AWS::ECS::Service.LogConfiguration":{"attributes":{},"description":"The log configuration for the container. This parameter maps to `LogConfig` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--log-driver` option to [`docker run`](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/commandline/run/) .\\n\\nBy default, containers use the same logging driver that the Docker daemon uses. However, the container might use a different logging driver than the Docker daemon by specifying a log driver configuration in the container definition. For more information about the options for different supported log drivers, see [Configure logging drivers](https://docs.aws.amazon.com/https://docs.docker.com/engine/admin/logging/overview/) in the Docker documentation.\\n\\nUnderstand the following when specifying a log configuration for your containers.\\n\\n- Amazon ECS currently supports a subset of the logging drivers available to the Docker daemon (shown in the valid values below). Additional log drivers may be available in future releases of the Amazon ECS container agent.\\n- This parameter requires version 1.18 of the Docker Remote API or greater on your container instance.\\n- For tasks that are hosted on Amazon EC2 instances, the Amazon ECS container agent must register the available logging drivers with the `ECS_AVAILABLE_LOGGING_DRIVERS` environment variable before containers placed on that instance can use these log configuration options. For more information, see [Amazon ECS container agent configuration](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html) in the *Amazon Elastic Container Service Developer Guide* .\\n- For tasks that are on AWS Fargate , because you don\'t have access to the underlying infrastructure your tasks are hosted on, any additional software needed must be installed outside of the task. For example, the Fluentd output aggregators or a remote host running Logstash to send Gelf logs to.","properties":{"LogDriver":"The log driver to use for the container.\\n\\nFor tasks on AWS Fargate , the supported log drivers are `awslogs` , `splunk` , and `awsfirelens` .\\n\\nFor tasks hosted on Amazon EC2 instances, the supported log drivers are `awslogs` , `fluentd` , `gelf` , `json-file` , `journald` , `logentries` , `syslog` , `splunk` , and `awsfirelens` .\\n\\nFor more information about using the `awslogs` log driver, see [Using the awslogs log driver](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_awslogs.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nFor more information about using the `awsfirelens` log driver, see [Custom log routing](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\n> If you have a custom driver that isn\'t listed, you can fork the Amazon ECS container agent project that\'s [available on GitHub](https://docs.aws.amazon.com/https://github.com/aws/amazon-ecs-agent) and customize it to work with that driver. We encourage you to submit pull requests for changes that you would like to have included. However, we don\'t currently provide support for running modified copies of this software.","Options":"The configuration options to send to the log driver. This parameter requires version 1.19 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: `sudo docker version --format \'{{.Server.APIVersion}}\'`","SecretOptions":"The secrets to pass to the log configuration. For more information, see [Specifying sensitive data](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html) in the *Amazon Elastic Container Service Developer Guide* ."}},"AWS::ECS::Service.NetworkConfiguration":{"attributes":{},"description":"The `NetworkConfiguration` property specifies an object representing the network configuration for a task or service.","properties":{"AwsvpcConfiguration":"The VPC subnets and security groups that are associated with a task.\\n\\n> All specified subnets and security groups must be from the same VPC."}},"AWS::ECS::Service.PlacementConstraint":{"attributes":{},"description":"The `PlacementConstraint` property specifies an object representing a constraint on task placement in the task definition. For more information, see [Task Placement Constraints](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"Expression":"A cluster query language expression to apply to the constraint. The expression can have a maximum length of 2000 characters. You can\'t specify an expression if the constraint type is `distinctInstance` . For more information, see [Cluster query language](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html) in the *Amazon Elastic Container Service Developer Guide* .","Type":"The type of constraint. Use `distinctInstance` to ensure that each task in a particular group is running on a different container instance. Use `memberOf` to restrict the selection to a group of valid candidates."}},"AWS::ECS::Service.PlacementStrategy":{"attributes":{},"description":"The `PlacementStrategy` property specifies the task placement strategy for a task or service. For more information, see [Task Placement Strategies](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-strategies.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"Field":"The field to apply the placement strategy against. For the `spread` placement strategy, valid values are `instanceId` (or `host` , which has the same effect), or any platform or custom attribute that is applied to a container instance, such as `attribute:ecs.availability-zone` . For the `binpack` placement strategy, valid values are `CPU` and `MEMORY` . For the `random` placement strategy, this field is not used.","Type":"The type of placement strategy. The `random` placement strategy randomly places tasks on available candidates. The `spread` placement strategy spreads placement across available candidates evenly based on the `field` parameter. The `binpack` strategy places tasks on available candidates that have the least available amount of the resource that\'s specified with the `field` parameter. For example, if you binpack on memory, a task is placed on the instance with the least amount of remaining memory but still enough to run the task."}},"AWS::ECS::Service.Secret":{"attributes":{},"description":"An object representing the secret to expose to your container. Secrets can be exposed to a container in the following ways:\\n\\n- To inject sensitive data into your containers as environment variables, use the `secrets` container definition parameter.\\n- To reference sensitive information in the log configuration of a container, use the `secretOptions` container definition parameter.\\n\\nFor more information, see [Specifying sensitive data](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"Name":"The name of the secret.","ValueFrom":"The secret to expose to the container. The supported values are either the full ARN of the AWS Secrets Manager secret or the full ARN of the parameter in the SSM Parameter Store.\\n\\nFor information about the require AWS Identity and Access Management permissions, see [Required IAM permissions for Amazon ECS secrets](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-secrets.html#secrets-iam) (for Secrets Manager) or [Required IAM permissions for Amazon ECS secrets](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-parameters.html) (for Systems Manager Parameter store) in the *Amazon Elastic Container Service Developer Guide* .\\n\\n> If the SSM Parameter Store parameter exists in the same Region as the task you\'re launching, then you can use either the full ARN or name of the parameter. If the parameter exists in a different Region, then the full ARN must be specified."}},"AWS::ECS::Service.ServiceConnectClientAlias":{"attributes":{},"description":"Each alias (\\"endpoint\\") is a fully-qualified name and port number that other tasks (\\"clients\\") can use to connect to this service.\\n\\nEach name and port mapping must be unique within the namespace.\\n\\nTasks that run in a namespace can use short names to connect to services in the namespace. Tasks can connect to services across all of the clusters in the namespace. Tasks connect through a managed proxy container that collects logs and metrics for increased visibility. Only the tasks that Amazon ECS services create are supported with Service Connect. For more information, see [Service Connect](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"DnsName":"The `dnsName` is the name that you use in the applications of client tasks to connect to this service. The name must be a valid DNS name but doesn\'t need to be fully-qualified. The name can include up to 127 characters. The name can include lowercase letters, numbers, underscores (_), hyphens (-), and periods (.). The name can\'t start with a hyphen.\\n\\nIf this parameter isn\'t specified, the default value of `discoveryName.namespace` is used. If the `discoveryName` isn\'t specified, the port mapping name from the task definition is used in `portName.namespace` .\\n\\nTo avoid changing your applications in client Amazon ECS services, set this to the same name that the client application uses by default. For example, a few common names are `database` , `db` , or the lowercase name of a database, such as `mysql` or `redis` . For more information, see [Service Connect](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html) in the *Amazon Elastic Container Service Developer Guide* .","Port":"The listening port number for the Service Connect proxy. This port is available inside of all of the tasks within the same namespace.\\n\\nTo avoid changing your applications in client Amazon ECS services, set this to the same port that the client application uses by default. For more information, see [Service Connect](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html) in the *Amazon Elastic Container Service Developer Guide* ."}},"AWS::ECS::Service.ServiceConnectConfiguration":{"attributes":{},"description":"The Service Connect configuration of your Amazon ECS service. The configuration for this service to discover and connect to services, and be discovered by, and connected from, other services within a namespace.\\n\\nTasks that run in a namespace can use short names to connect to services in the namespace. Tasks can connect to services across all of the clusters in the namespace. Tasks connect through a managed proxy container that collects logs and metrics for increased visibility. Only the tasks that Amazon ECS services create are supported with Service Connect. For more information, see [Service Connect](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"Enabled":"Specifies whether to use Service Connect with this service.","LogConfiguration":"The log configuration for the container. This parameter maps to `LogConfig` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--log-driver` option to [`docker run`](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/commandline/run/) .\\n\\nBy default, containers use the same logging driver that the Docker daemon uses. However, the container might use a different logging driver than the Docker daemon by specifying a log driver configuration in the container definition. For more information about the options for different supported log drivers, see [Configure logging drivers](https://docs.aws.amazon.com/https://docs.docker.com/engine/admin/logging/overview/) in the Docker documentation.\\n\\nUnderstand the following when specifying a log configuration for your containers.\\n\\n- Amazon ECS currently supports a subset of the logging drivers available to the Docker daemon (shown in the valid values below). Additional log drivers may be available in future releases of the Amazon ECS container agent.\\n- This parameter requires version 1.18 of the Docker Remote API or greater on your container instance.\\n- For tasks that are hosted on Amazon EC2 instances, the Amazon ECS container agent must register the available logging drivers with the `ECS_AVAILABLE_LOGGING_DRIVERS` environment variable before containers placed on that instance can use these log configuration options. For more information, see [Amazon ECS container agent configuration](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html) in the *Amazon Elastic Container Service Developer Guide* .\\n- For tasks that are on AWS Fargate , because you don\'t have access to the underlying infrastructure your tasks are hosted on, any additional software needed must be installed outside of the task. For example, the Fluentd output aggregators or a remote host running Logstash to send Gelf logs to.","Namespace":"The namespace name or full Amazon Resource Name (ARN) of the AWS Cloud Map namespace for use with Service Connect. The namespace must be in the same AWS Region as the Amazon ECS service and cluster. The type of namespace doesn\'t affect Service Connect. For more information about AWS Cloud Map , see [Working with Services](https://docs.aws.amazon.com/cloud-map/latest/dg/working-with-services.html) in the *AWS Cloud Map Developer Guide* .","Services":"The list of Service Connect service objects. These are names and aliases (also known as endpoints) that are used by other Amazon ECS services to connect to this service.\\n\\nThis field is not required for a \\"client\\" Amazon ECS service that\'s a member of a namespace only to connect to other services within the namespace. An example of this would be a frontend application that accepts incoming requests from either a load balancer that\'s attached to the service or by other means.\\n\\nAn object selects a port from the task definition, assigns a name for the AWS Cloud Map service, and a list of aliases (endpoints) and ports for client applications to refer to this service."}},"AWS::ECS::Service.ServiceConnectService":{"attributes":{},"description":"The Service Connect service object configuration. For more information, see [Service Connect](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"ClientAliases":"The list of client aliases for this Service Connect service. You use these to assign names that can be used by client applications. The maximum number of client aliases that you can have in this list is 1.\\n\\nEach alias (\\"endpoint\\") is a fully-qualified name and port number that other Amazon ECS tasks (\\"clients\\") can use to connect to this service.\\n\\nEach name and port mapping must be unique within the namespace.\\n\\nFor each `ServiceConnectService` , you must provide at least one `clientAlias` with one `port` .","DiscoveryName":"The `discoveryName` is the name of the new AWS Cloud Map service that Amazon ECS creates for this Amazon ECS service. This must be unique within the AWS Cloud Map namespace. The name can contain up to 64 characters. The name can include lowercase letters, numbers, underscores (_), and hyphens (-). The name can\'t start with a hyphen.\\n\\nIf the `discoveryName` isn\'t specified, the port mapping name from the task definition is used in `portName.namespace` .","IngressPortOverride":"The port number for the Service Connect proxy to listen on.\\n\\nUse the value of this field to bypass the proxy for traffic on the port number specified in the named `portMapping` in the task definition of this application, and then use it in your VPC security groups to allow traffic into the proxy for this Amazon ECS service.\\n\\nIn `awsvpc` mode and Fargate, the default value is the container port number. The container port number is in the `portMapping` in the task definition. In bridge mode, the default value is the ephemeral port of the Service Connect proxy.","PortName":"The `portName` must match the name of one of the `portMappings` from all the containers in the task definition of this Amazon ECS service."}},"AWS::ECS::Service.ServiceRegistry":{"attributes":{},"description":"The `ServiceRegistry` property specifies details of the service registry. For more information, see [Service Discovery](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"ContainerName":"The container name value to be used for your service discovery service. It\'s already specified in the task definition. If the task definition that your service task specifies uses the `bridge` or `host` network mode, you must specify a `containerName` and `containerPort` combination from the task definition. If the task definition that your service task specifies uses the `awsvpc` network mode and a type SRV DNS record is used, you must specify either a `containerName` and `containerPort` combination or a `port` value. However, you can\'t specify both.","ContainerPort":"The port value to be used for your service discovery service. It\'s already specified in the task definition. If the task definition your service task specifies uses the `bridge` or `host` network mode, you must specify a `containerName` and `containerPort` combination from the task definition. If the task definition your service task specifies uses the `awsvpc` network mode and a type SRV DNS record is used, you must specify either a `containerName` and `containerPort` combination or a `port` value. However, you can\'t specify both.","Port":"The port value used if your service discovery service specified an SRV record. This field might be used if both the `awsvpc` network mode and SRV records are used.","RegistryArn":"The Amazon Resource Name (ARN) of the service registry. The currently supported service registry is AWS Cloud Map . For more information, see [CreateService](https://docs.aws.amazon.com/cloud-map/latest/api/API_CreateService.html) ."}},"AWS::ECS::TaskDefinition":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN).\\n\\nIn the following example, the `Ref` function returns the ARN of the `MyTaskDefinition` task definition, such as `arn:aws:ecs:us-west-2:123456789012:task-definition/TaskDefinitionFamily:1` .\\n\\n`{ \\"Ref\\": \\"MyTaskDefinition\\" }`"},"description":"Registers a new task definition from the supplied `family` and `containerDefinitions` . Optionally, you can add data volumes to your containers with the `volumes` parameter. For more information about task definition parameters and defaults, see [Amazon ECS Task Definitions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_defintions.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nYou can specify a role for your task with the `taskRoleArn` parameter. When you specify a role for a task, its containers can then use the latest versions of the AWS CLI or SDKs to make API requests to the AWS services that are specified in the policy that\'s associated with the role. For more information, see [IAM Roles for Tasks](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nYou can specify a Docker networking mode for the containers in your task definition with the `networkMode` parameter. The available network modes correspond to those described in [Network settings](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#/network-settings) in the Docker run reference. If you specify the `awsvpc` network mode, the task is allocated an elastic network interface, and you must specify a `NetworkConfiguration` when you create a service or run a task with the task definition. For more information, see [Task Networking](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"ContainerDefinitions":"A list of container definitions in JSON format that describe the different containers that make up your task. For more information about container definition parameters and defaults, see [Amazon ECS Task Definitions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_defintions.html) in the *Amazon Elastic Container Service Developer Guide* .","Cpu":"The number of `cpu` units used by the task. If you use the EC2 launch type, this field is optional. Any value can be used. If you use the Fargate launch type, this field is required. You must use one of the following values. The value that you choose determines your range of valid values for the `memory` parameter.\\n\\nThe CPU units cannot be less than 1 vCPU when you use Windows containers on Fargate.\\n\\n- 256 (.25 vCPU) - Available `memory` values: 512 (0.5 GB), 1024 (1 GB), 2048 (2 GB)\\n- 512 (.5 vCPU) - Available `memory` values: 1024 (1 GB), 2048 (2 GB), 3072 (3 GB), 4096 (4 GB)\\n- 1024 (1 vCPU) - Available `memory` values: 2048 (2 GB), 3072 (3 GB), 4096 (4 GB), 5120 (5 GB), 6144 (6 GB), 7168 (7 GB), 8192 (8 GB)\\n- 2048 (2 vCPU) - Available `memory` values: 4096 (4 GB) and 16384 (16 GB) in increments of 1024 (1 GB)\\n- 4096 (4 vCPU) - Available `memory` values: 8192 (8 GB) and 30720 (30 GB) in increments of 1024 (1 GB)\\n- 8192 (8 vCPU) - Available `memory` values: 16 GB and 60 GB in 4 GB increments\\n\\nThis option requires Linux platform `1.4.0` or later.\\n- 16384 (16vCPU) - Available `memory` values: 32GB and 120 GB in 8 GB increments\\n\\nThis option requires Linux platform `1.4.0` or later.","EphemeralStorage":"The ephemeral storage settings to use for tasks run with the task definition.","ExecutionRoleArn":"The Amazon Resource Name (ARN) of the task execution role that grants the Amazon ECS container agent permission to make AWS API calls on your behalf. The task execution IAM role is required depending on the requirements of your task. For more information, see [Amazon ECS task execution IAM role](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html) in the *Amazon Elastic Container Service Developer Guide* .","Family":"The name of a family that this task definition is registered to. Up to 255 letters (uppercase and lowercase), numbers, hyphens, and underscores are allowed.\\n\\nA family groups multiple versions of a task definition. Amazon ECS gives the first task definition that you registered to a family a revision number of 1. Amazon ECS gives sequential revision numbers to each task definition that you add.\\n\\n> To use revision numbers when you update a task definition, specify this property. If you don\'t specify a value, AWS CloudFormation generates a new task definition each time that you update it.","InferenceAccelerators":"The Elastic Inference accelerators to use for the containers in the task.","IpcMode":"The IPC resource namespace to use for the containers in the task. The valid values are `host` , `task` , or `none` . If `host` is specified, then all containers within the tasks that specified the `host` IPC mode on the same container instance share the same IPC resources with the host Amazon EC2 instance. If `task` is specified, all containers within the specified task share the same IPC resources. If `none` is specified, then IPC resources within the containers of a task are private and not shared with other containers in a task or on the container instance. If no value is specified, then the IPC resource namespace sharing depends on the Docker daemon setting on the container instance. For more information, see [IPC settings](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#ipc-settings---ipc) in the *Docker run reference* .\\n\\nIf the `host` IPC mode is used, be aware that there is a heightened risk of undesired IPC namespace expose. For more information, see [Docker security](https://docs.aws.amazon.com/https://docs.docker.com/engine/security/security/) .\\n\\nIf you are setting namespaced kernel parameters using `systemControls` for the containers in the task, the following will apply to your IPC resource namespace. For more information, see [System Controls](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\n- For tasks that use the `host` IPC mode, IPC namespace related `systemControls` are not supported.\\n- For tasks that use the `task` IPC mode, IPC namespace related `systemControls` will apply to all containers within a task.\\n\\n> This parameter is not supported for Windows containers or tasks run on AWS Fargate .","Memory":"The amount (in MiB) of memory used by the task.\\n\\nIf your tasks runs on Amazon EC2 instances, you must specify either a task-level memory value or a container-level memory value. This field is optional and any value can be used. If a task-level memory value is specified, the container-level memory value is optional. For more information regarding container-level memory and memory reservation, see [ContainerDefinition](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerDefinition.html) .\\n\\nIf your tasks runs on AWS Fargate , this field is required. You must use one of the following values. The value you choose determines your range of valid values for the `cpu` parameter.\\n\\n- 512 (0.5 GB), 1024 (1 GB), 2048 (2 GB) - Available `cpu` values: 256 (.25 vCPU)\\n- 1024 (1 GB), 2048 (2 GB), 3072 (3 GB), 4096 (4 GB) - Available `cpu` values: 512 (.5 vCPU)\\n- 2048 (2 GB), 3072 (3 GB), 4096 (4 GB), 5120 (5 GB), 6144 (6 GB), 7168 (7 GB), 8192 (8 GB) - Available `cpu` values: 1024 (1 vCPU)\\n- Between 4096 (4 GB) and 16384 (16 GB) in increments of 1024 (1 GB) - Available `cpu` values: 2048 (2 vCPU)\\n- Between 8192 (8 GB) and 30720 (30 GB) in increments of 1024 (1 GB) - Available `cpu` values: 4096 (4 vCPU)\\n- Between 16 GB and 60 GB in 4 GB increments - Available `cpu` values: 8192 (8 vCPU)\\n\\nThis option requires Linux platform `1.4.0` or later.\\n- Between 32GB and 120 GB in 8 GB increments - Available `cpu` values: 16384 (16 vCPU)\\n\\nThis option requires Linux platform `1.4.0` or later.","NetworkMode":"The Docker networking mode to use for the containers in the task. The valid values are `none` , `bridge` , `awsvpc` , and `host` . If no network mode is specified, the default is `bridge` .\\n\\nFor Amazon ECS tasks on Fargate, the `awsvpc` network mode is required. For Amazon ECS tasks on Amazon EC2 Linux instances, any network mode can be used. For Amazon ECS tasks on Amazon EC2 Windows instances, `` or `awsvpc` can be used. If the network mode is set to `none` , you cannot specify port mappings in your container definitions, and the tasks containers do not have external connectivity. The `host` and `awsvpc` network modes offer the highest networking performance for containers because they use the EC2 network stack instead of the virtualized network stack provided by the `bridge` mode.\\n\\nWith the `host` and `awsvpc` network modes, exposed container ports are mapped directly to the corresponding host port (for the `host` network mode) or the attached elastic network interface port (for the `awsvpc` network mode), so you cannot take advantage of dynamic host port mappings.\\n\\n> When using the `host` network mode, you should not run containers using the root user (UID 0). It is considered best practice to use a non-root user. \\n\\nIf the network mode is `awsvpc` , the task is allocated an elastic network interface, and you must specify a `NetworkConfiguration` value when you create a service or run a task with the task definition. For more information, see [Task Networking](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nIf the network mode is `host` , you cannot run multiple instantiations of the same task on a single container instance when port mappings are used.\\n\\nFor more information, see [Network settings](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#network-settings) in the *Docker run reference* .","PidMode":"The process namespace to use for the containers in the task. The valid values are `host` or `task` . If `host` is specified, then all containers within the tasks that specified the `host` PID mode on the same container instance share the same process namespace with the host Amazon EC2 instance. If `task` is specified, all containers within the specified task share the same process namespace. If no value is specified, the default is a private namespace. For more information, see [PID settings](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#pid-settings---pid) in the *Docker run reference* .\\n\\nIf the `host` PID mode is used, be aware that there is a heightened risk of undesired process namespace expose. For more information, see [Docker security](https://docs.aws.amazon.com/https://docs.docker.com/engine/security/security/) .\\n\\n> This parameter is not supported for Windows containers or tasks run on AWS Fargate .","PlacementConstraints":"An array of placement constraint objects to use for tasks.\\n\\n> This parameter isn\'t supported for tasks run on AWS Fargate .","ProxyConfiguration":"The configuration details for the App Mesh proxy.\\n\\nYour Amazon ECS container instances require at least version 1.26.0 of the container agent and at least version 1.26.0-1 of the `ecs-init` package to use a proxy configuration. If your container instances are launched from the Amazon ECS optimized AMI version `20190301` or later, they contain the required versions of the container agent and `ecs-init` . For more information, see [Amazon ECS-optimized Linux AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html) in the *Amazon Elastic Container Service Developer Guide* .","RequiresCompatibilities":"The task launch types the task definition was validated against. The valid values are `EC2` , `FARGATE` , and `EXTERNAL` . For more information, see [Amazon ECS launch types](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html) in the *Amazon Elastic Container Service Developer Guide* .","RuntimePlatform":"The operating system that your tasks definitions run on. A platform family is specified only for tasks using the Fargate launch type.\\n\\nWhen you specify a task definition in a service, this value must match the `runtimePlatform` value of the service.","Tags":"The metadata that you apply to the task definition to help you categorize and organize them. Each tag consists of a key and an optional value. You define both of them.\\n\\nThe following basic restrictions apply to tags:\\n\\n- Maximum number of tags per resource - 50\\n- For each resource, each tag key must be unique, and each tag key can have only one value.\\n- Maximum key length - 128 Unicode characters in UTF-8\\n- Maximum value length - 256 Unicode characters in UTF-8\\n- If your tagging schema is used across multiple services and resources, remember that other services may have restrictions on allowed characters. Generally allowed characters are: letters, numbers, and spaces representable in UTF-8, and the following characters: + - = . _ : / @.\\n- Tag keys and values are case-sensitive.\\n- Do not use `aws:` , `AWS:` , or any upper or lowercase combination of such as a prefix for either keys or values as it is reserved for AWS use. You cannot edit or delete tag keys or values with this prefix. Tags with this prefix do not count against your tags per resource limit.","TaskRoleArn":"The short name or full Amazon Resource Name (ARN) of the AWS Identity and Access Management role that grants containers in the task permission to call AWS APIs on your behalf. For more information, see [Amazon ECS Task Role](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nIAM roles for tasks on Windows require that the `-EnableTaskIAMRole` option is set when you launch the Amazon ECS-optimized Windows AMI. Your containers must also run some configuration code to use the feature. For more information, see [Windows IAM roles for tasks](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/windows_task_IAM_roles.html) in the *Amazon Elastic Container Service Developer Guide* .","Volumes":"The list of data volume definitions for the task. For more information, see [Using data volumes in tasks](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\n> The `host` and `sourcePath` parameters aren\'t supported for tasks run on AWS Fargate ."}},"AWS::ECS::TaskDefinition.AuthorizationConfig":{"attributes":{},"description":"The authorization configuration details for the Amazon EFS file system.","properties":{"AccessPointId":"The Amazon EFS access point ID to use. If an access point is specified, the root directory value specified in the `EFSVolumeConfiguration` must either be omitted or set to `/` which will enforce the path set on the EFS access point. If an access point is used, transit encryption must be on in the `EFSVolumeConfiguration` . For more information, see [Working with Amazon EFS access points](https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html) in the *Amazon Elastic File System User Guide* .","IAM":"Determines whether to use the Amazon ECS task role defined in a task definition when mounting the Amazon EFS file system. If it is turned on, transit encryption must be turned on in the `EFSVolumeConfiguration` . If this parameter is omitted, the default value of `DISABLED` is used. For more information, see [Using Amazon EFS access points](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/efs-volumes.html#efs-volume-accesspoints) in the *Amazon Elastic Container Service Developer Guide* ."}},"AWS::ECS::TaskDefinition.ContainerDefinition":{"attributes":{},"description":"The `ContainerDefinition` property specifies a container definition. Container definitions are used in task definitions to describe the different containers that are launched as part of a task.","properties":{"Command":"The command that\'s passed to the container. This parameter maps to `Cmd` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `COMMAND` parameter to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) . For more information, see [https://docs.docker.com/engine/reference/builder/#cmd](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/builder/#cmd) . If there are multiple arguments, each argument is a separated string in the array.","Cpu":"The number of `cpu` units reserved for the container. This parameter maps to `CpuShares` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--cpu-shares` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\nThis field is optional for tasks using the Fargate launch type, and the only requirement is that the total amount of CPU reserved for all containers within a task be lower than the task-level `cpu` value.\\n\\n> You can determine the number of CPU units that are available per EC2 instance type by multiplying the vCPUs listed for that instance type on the [Amazon EC2 Instances](https://docs.aws.amazon.com/ec2/instance-types/) detail page by 1,024. \\n\\nLinux containers share unallocated CPU units with other containers on the container instance with the same ratio as their allocated amount. For example, if you run a single-container task on a single-core instance type with 512 CPU units specified for that container, and that\'s the only task running on the container instance, that container could use the full 1,024 CPU unit share at any given time. However, if you launched another copy of the same task on that container instance, each task is guaranteed a minimum of 512 CPU units when needed. Moreover, each container could float to higher CPU usage if the other container was not using it. If both tasks were 100% active all of the time, they would be limited to 512 CPU units.\\n\\nOn Linux container instances, the Docker daemon on the container instance uses the CPU value to calculate the relative CPU share ratios for running containers. For more information, see [CPU share constraint](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#cpu-share-constraint) in the Docker documentation. The minimum valid CPU share value that the Linux kernel allows is 2. However, the CPU parameter isn\'t required, and you can use CPU values below 2 in your container definitions. For CPU values below 2 (including null), the behavior varies based on your Amazon ECS container agent version:\\n\\n- *Agent versions less than or equal to 1.1.0:* Null and zero CPU values are passed to Docker as 0, which Docker then converts to 1,024 CPU shares. CPU values of 1 are passed to Docker as 1, which the Linux kernel converts to two CPU shares.\\n- *Agent versions greater than or equal to 1.2.0:* Null, zero, and CPU values of 1 are passed to Docker as 2.\\n\\nOn Windows container instances, the CPU limit is enforced as an absolute limit, or a quota. Windows containers only have access to the specified amount of CPU that\'s described in the task definition. A null or zero CPU value is passed to Docker as `0` , which Windows interprets as 1% of one CPU.","DependsOn":"The dependencies defined for container startup and shutdown. A container can contain multiple dependencies. When a dependency is defined for container startup, for container shutdown it is reversed.\\n\\nFor tasks using the EC2 launch type, the container instances require at least version 1.26.0 of the container agent to turn on container dependencies. However, we recommend using the latest container agent version. For information about checking your agent version and updating to the latest version, see [Updating the Amazon ECS Container Agent](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html) in the *Amazon Elastic Container Service Developer Guide* . If you\'re using an Amazon ECS-optimized Linux AMI, your instance needs at least version 1.26.0-1 of the `ecs-init` package. If your container instances are launched from version `20190301` or later, then they contain the required versions of the container agent and `ecs-init` . For more information, see [Amazon ECS-optimized Linux AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nFor tasks using the Fargate launch type, the task or service requires the following platforms:\\n\\n- Linux platform version `1.3.0` or later.\\n- Windows platform version `1.0.0` or later.\\n\\nIf the task definition is used in a blue/green deployment that uses [AWS::CodeDeploy::DeploymentGroup BlueGreenDeploymentConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-bluegreendeploymentconfiguration.html) , the `dependsOn` parameter is not supported. For more information see [Issue #680](https://docs.aws.amazon.com/https://github.com/aws-cloudformation/cloudformation-coverage-roadmap/issues/680) on the on the GitHub website.","DisableNetworking":"When this parameter is true, networking is off within the container. This parameter maps to `NetworkDisabled` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) .\\n\\n> This parameter is not supported for Windows containers.","DnsSearchDomains":"A list of DNS search domains that are presented to the container. This parameter maps to `DnsSearch` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--dns-search` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> This parameter is not supported for Windows containers.","DnsServers":"A list of DNS servers that are presented to the container. This parameter maps to `Dns` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--dns` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> This parameter is not supported for Windows containers.","DockerLabels":"A key/value map of labels to add to the container. This parameter maps to `Labels` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--label` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) . This parameter requires version 1.18 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: `sudo docker version --format \'{{.Server.APIVersion}}\'`","DockerSecurityOptions":"A list of strings to provide custom configuration for multiple security systems. For more information about valid values, see [Docker Run Security Configuration](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) . This field isn\'t valid for containers in tasks using the Fargate launch type.\\n\\nFor Linux tasks on EC2, this parameter can be used to reference custom labels for SELinux and AppArmor multi-level security systems.\\n\\nFor any tasks on EC2, this parameter can be used to reference a credential spec file that configures a container for Active Directory authentication. For more information, see [Using gMSAs for Windows Containers](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/windows-gmsa.html) and [Using gMSAs for Linux Containers](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/linux-gmsa.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nThis parameter maps to `SecurityOpt` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--security-opt` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> The Amazon ECS container agent running on a container instance must register with the `ECS_SELINUX_CAPABLE=true` or `ECS_APPARMOR_CAPABLE=true` environment variables before containers placed on that instance can use these security options. For more information, see [Amazon ECS Container Agent Configuration](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html) in the *Amazon Elastic Container Service Developer Guide* . \\n\\nFor more information about valid values, see [Docker Run Security Configuration](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\nValid values: \\"no-new-privileges\\" | \\"apparmor:PROFILE\\" | \\"label:value\\" | \\"credentialspec:CredentialSpecFilePath\\"","EntryPoint":"> Early versions of the Amazon ECS container agent don\'t properly handle `entryPoint` parameters. If you have problems using `entryPoint` , update your container agent or enter your commands and arguments as `command` array items instead. \\n\\nThe entry point that\'s passed to the container. This parameter maps to `Entrypoint` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--entrypoint` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) . For more information, see [https://docs.docker.com/engine/reference/builder/#entrypoint](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/builder/#entrypoint) .","Environment":"The environment variables to pass to a container. This parameter maps to `Env` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--env` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> We don\'t recommend that you use plaintext environment variables for sensitive information, such as credential data.","EnvironmentFiles":"A list of files containing the environment variables to pass to a container. This parameter maps to the `--env-file` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\nYou can specify up to ten environment files. The file must have a `.env` file extension. Each line in an environment file contains an environment variable in `VARIABLE=VALUE` format. Lines beginning with `#` are treated as comments and are ignored. For more information about the environment variable file syntax, see [Declare default environment variables in file](https://docs.aws.amazon.com/https://docs.docker.com/compose/env-file/) .\\n\\nIf there are environment variables specified using the `environment` parameter in a container definition, they take precedence over the variables contained within an environment file. If multiple environment files are specified that contain the same variable, they\'re processed from the top down. We recommend that you use unique variable names. For more information, see [Specifying Environment Variables](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/taskdef-envfiles.html) in the *Amazon Elastic Container Service Developer Guide* .","Essential":"If the `essential` parameter of a container is marked as `true` , and that container fails or stops for any reason, all other containers that are part of the task are stopped. If the `essential` parameter of a container is marked as `false` , its failure doesn\'t affect the rest of the containers in a task. If this parameter is omitted, a container is assumed to be essential.\\n\\nAll tasks must have at least one essential container. If you have an application that\'s composed of multiple containers, group containers that are used for a common purpose into components, and separate the different components into multiple task definitions. For more information, see [Application Architecture](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/application_architecture.html) in the *Amazon Elastic Container Service Developer Guide* .","ExtraHosts":"A list of hostnames and IP address mappings to append to the `/etc/hosts` file on the container. This parameter maps to `ExtraHosts` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--add-host` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> This parameter isn\'t supported for Windows containers or tasks that use the `awsvpc` network mode.","FirelensConfiguration":"The FireLens configuration for the container. This is used to specify and configure a log router for container logs. For more information, see [Custom Log Routing](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html) in the *Amazon Elastic Container Service Developer Guide* .","HealthCheck":"The container health check command and associated configuration parameters for the container. This parameter maps to `HealthCheck` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `HEALTHCHECK` parameter of [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .","Hostname":"The hostname to use for your container. This parameter maps to `Hostname` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--hostname` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> The `hostname` parameter is not supported if you\'re using the `awsvpc` network mode.","Image":"The image used to start a container. This string is passed directly to the Docker daemon. By default, images in the Docker Hub registry are available. Other repositories are specified with either `*repository-url* / *image* : *tag*` or `*repository-url* / *image* @ *digest*` . Up to 255 letters (uppercase and lowercase), numbers, hyphens, underscores, colons, periods, forward slashes, and number signs are allowed. This parameter maps to `Image` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `IMAGE` parameter of [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n- When a new task starts, the Amazon ECS container agent pulls the latest version of the specified image and tag for the container to use. However, subsequent updates to a repository image aren\'t propagated to already running tasks.\\n- Images in Amazon ECR repositories can be specified by either using the full `registry/repository:tag` or `registry/repository@digest` . For example, `012345678910.dkr.ecr..amazonaws.com/:latest` or `012345678910.dkr.ecr..amazonaws.com/@sha256:94afd1f2e64d908bc90dbca0035a5b567EXAMPLE` .\\n- Images in official repositories on Docker Hub use a single name (for example, `ubuntu` or `mongo` ).\\n- Images in other repositories on Docker Hub are qualified with an organization name (for example, `amazon/amazon-ecs-agent` ).\\n- Images in other online repositories are qualified further by a domain name (for example, `quay.io/assemblyline/ubuntu` ).","Interactive":"When this parameter is `true` , you can deploy containerized applications that require `stdin` or a `tty` to be allocated. This parameter maps to `OpenStdin` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--interactive` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .","Links":"The `links` parameter allows containers to communicate with each other without the need for port mappings. This parameter is only supported if the network mode of a task definition is `bridge` . The `name:internalName` construct is analogous to `name:alias` in Docker links. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. For more information about linking Docker containers, go to [Legacy container links](https://docs.aws.amazon.com/https://docs.docker.com/network/links/) in the Docker documentation. This parameter maps to `Links` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--link` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> This parameter is not supported for Windows containers. > Containers that are collocated on a single container instance may be able to communicate with each other without requiring links or host port mappings. Network isolation is achieved on the container instance using security groups and VPC settings.","LinuxParameters":"Linux-specific modifications that are applied to the container, such as Linux kernel capabilities. For more information see [KernelCapabilities](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_KernelCapabilities.html) .\\n\\n> This parameter is not supported for Windows containers.","LogConfiguration":"The log configuration specification for the container.\\n\\nThis parameter maps to `LogConfig` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--log-driver` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . By default, containers use the same logging driver that the Docker daemon uses. However, the container may use a different logging driver than the Docker daemon by specifying a log driver with this parameter in the container definition. To use a different logging driver for a container, the log system must be configured properly on the container instance (or on a different log server for remote logging options). For more information on the options for different supported log drivers, see [Configure logging drivers](https://docs.aws.amazon.com/https://docs.docker.com/engine/admin/logging/overview/) in the Docker documentation.\\n\\n> Amazon ECS currently supports a subset of the logging drivers available to the Docker daemon (shown in the [LogConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_LogConfiguration.html) data type). Additional log drivers may be available in future releases of the Amazon ECS container agent. \\n\\nThis parameter requires version 1.18 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: `sudo docker version --format \'{{.Server.APIVersion}}\'`\\n\\n> The Amazon ECS container agent running on a container instance must register the logging drivers available on that instance with the `ECS_AVAILABLE_LOGGING_DRIVERS` environment variable before containers placed on that instance can use these log configuration options. For more information, see [Amazon ECS Container Agent Configuration](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html) in the *Amazon Elastic Container Service Developer Guide* .","Memory":"The amount (in MiB) of memory to present to the container. If your container attempts to exceed the memory specified here, the container is killed. The total amount of memory reserved for all containers within a task must be lower than the task `memory` value, if one is specified. This parameter maps to `Memory` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--memory` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\nIf using the Fargate launch type, this parameter is optional.\\n\\nIf using the EC2 launch type, you must specify either a task-level memory value or a container-level memory value. If you specify both a container-level `memory` and `memoryReservation` value, `memory` must be greater than `memoryReservation` . If you specify `memoryReservation` , then that value is subtracted from the available memory resources for the container instance where the container is placed. Otherwise, the value of `memory` is used.\\n\\nThe Docker 20.10.0 or later daemon reserves a minimum of 6 MiB of memory for a container, so you should not specify fewer than 6 MiB of memory for your containers.\\n\\nThe Docker 19.03.13-ce or earlier daemon reserves a minimum of 4 MiB of memory for a container, so you should not specify fewer than 4 MiB of memory for your containers.","MemoryReservation":"The soft limit (in MiB) of memory to reserve for the container. When system memory is under heavy contention, Docker attempts to keep the container memory to this soft limit. However, your container can consume more memory when it needs to, up to either the hard limit specified with the `memory` parameter (if applicable), or all of the available memory on the container instance, whichever comes first. This parameter maps to `MemoryReservation` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--memory-reservation` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\nIf a task-level memory value is not specified, you must specify a non-zero integer for one or both of `memory` or `memoryReservation` in a container definition. If you specify both, `memory` must be greater than `memoryReservation` . If you specify `memoryReservation` , then that value is subtracted from the available memory resources for the container instance where the container is placed. Otherwise, the value of `memory` is used.\\n\\nFor example, if your container normally uses 128 MiB of memory, but occasionally bursts to 256 MiB of memory for short periods of time, you can set a `memoryReservation` of 128 MiB, and a `memory` hard limit of 300 MiB. This configuration would allow the container to only reserve 128 MiB of memory from the remaining resources on the container instance, but also allow the container to consume more memory resources when needed.\\n\\nThe Docker 20.10.0 or later daemon reserves a minimum of 6 MiB of memory for a container. So, don\'t specify less than 6 MiB of memory for your containers.\\n\\nThe Docker 19.03.13-ce or earlier daemon reserves a minimum of 4 MiB of memory for a container. So, don\'t specify less than 4 MiB of memory for your containers.","MountPoints":"The mount points for data volumes in your container.\\n\\nThis parameter maps to `Volumes` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--volume` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\nWindows containers can mount whole directories on the same drive as `$env:ProgramData` . Windows containers can\'t mount directories on a different drive, and mount point can\'t be across drives.","Name":"The name of a container. If you\'re linking multiple containers together in a task definition, the `name` of one container can be entered in the `links` of another container to connect the containers. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. This parameter maps to `name` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--name` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .","PortMappings":"The list of port mappings for the container. Port mappings allow containers to access ports on the host container instance to send or receive traffic.\\n\\nFor task definitions that use the `awsvpc` network mode, you should only specify the `containerPort` . The `hostPort` can be left blank or it must be the same value as the `containerPort` .\\n\\nPort mappings on Windows use the `NetNAT` gateway address rather than `localhost` . There is no loopback for port mappings on Windows, so you cannot access a container\'s mapped port from the host itself.\\n\\nThis parameter maps to `PortBindings` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--publish` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . If the network mode of a task definition is set to `none` , then you can\'t specify port mappings. If the network mode of a task definition is set to `host` , then host ports must either be undefined or they must match the container port in the port mapping.\\n\\n> After a task reaches the `RUNNING` status, manual and automatic host and container port assignments are visible in the *Network Bindings* section of a container description for a selected task in the Amazon ECS console. The assignments are also visible in the `networkBindings` section [DescribeTasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html) responses.","Privileged":"When this parameter is true, the container is given elevated privileges on the host container instance (similar to the `root` user). This parameter maps to `Privileged` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--privileged` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> This parameter is not supported for Windows containers or tasks run on AWS Fargate .","PseudoTerminal":"When this parameter is `true` , a TTY is allocated. This parameter maps to `Tty` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--tty` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .","ReadonlyRootFilesystem":"When this parameter is true, the container is given read-only access to its root file system. This parameter maps to `ReadonlyRootfs` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--read-only` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> This parameter is not supported for Windows containers.","RepositoryCredentials":"The private repository authentication credentials to use.","ResourceRequirements":"The type and amount of a resource to assign to a container. The only supported resource is a GPU.","Secrets":"The secrets to pass to the container. For more information, see [Specifying Sensitive Data](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html) in the *Amazon Elastic Container Service Developer Guide* .","StartTimeout":"Time duration (in seconds) to wait before giving up on resolving dependencies for a container. For example, you specify two containers in a task definition with containerA having a dependency on containerB reaching a `COMPLETE` , `SUCCESS` , or `HEALTHY` status. If a `startTimeout` value is specified for containerB and it doesn\'t reach the desired status within that time then containerA gives up and not start. This results in the task transitioning to a `STOPPED` state.\\n\\n> When the `ECS_CONTAINER_START_TIMEOUT` container agent configuration variable is used, it\'s enforced independently from this start timeout value. \\n\\nFor tasks using the Fargate launch type, the task or service requires the following platforms:\\n\\n- Linux platform version `1.3.0` or later.\\n- Windows platform version `1.0.0` or later.\\n\\nFor tasks using the EC2 launch type, your container instances require at least version `1.26.0` of the container agent to use a container start timeout value. However, we recommend using the latest container agent version. For information about checking your agent version and updating to the latest version, see [Updating the Amazon ECS Container Agent](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html) in the *Amazon Elastic Container Service Developer Guide* . If you\'re using an Amazon ECS-optimized Linux AMI, your instance needs at least version `1.26.0-1` of the `ecs-init` package. If your container instances are launched from version `20190301` or later, then they contain the required versions of the container agent and `ecs-init` . For more information, see [Amazon ECS-optimized Linux AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nThe valid values are 2-120 seconds.","StopTimeout":"Time duration (in seconds) to wait before the container is forcefully killed if it doesn\'t exit normally on its own.\\n\\nFor tasks using the Fargate launch type, the task or service requires the following platforms:\\n\\n- Linux platform version `1.3.0` or later.\\n- Windows platform version `1.0.0` or later.\\n\\nThe max stop timeout value is 120 seconds and if the parameter is not specified, the default value of 30 seconds is used.\\n\\nFor tasks that use the EC2 launch type, if the `stopTimeout` parameter isn\'t specified, the value set for the Amazon ECS container agent configuration variable `ECS_CONTAINER_STOP_TIMEOUT` is used. If neither the `stopTimeout` parameter or the `ECS_CONTAINER_STOP_TIMEOUT` agent configuration variable are set, then the default values of 30 seconds for Linux containers and 30 seconds on Windows containers are used. Your container instances require at least version 1.26.0 of the container agent to use a container stop timeout value. However, we recommend using the latest container agent version. For information about checking your agent version and updating to the latest version, see [Updating the Amazon ECS Container Agent](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html) in the *Amazon Elastic Container Service Developer Guide* . If you\'re using an Amazon ECS-optimized Linux AMI, your instance needs at least version 1.26.0-1 of the `ecs-init` package. If your container instances are launched from version `20190301` or later, then they contain the required versions of the container agent and `ecs-init` . For more information, see [Amazon ECS-optimized Linux AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nThe valid values are 2-120 seconds.","SystemControls":"A list of namespaced kernel parameters to set in the container. This parameter maps to `Sysctls` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--sysctl` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> We don\'t recommended that you specify network-related `systemControls` parameters for multiple containers in a single task that also uses either the `awsvpc` or `host` network modes. For tasks that use the `awsvpc` network mode, the container that\'s started last determines which `systemControls` parameters take effect. For tasks that use the `host` network mode, it changes the container instance\'s namespaced kernel parameters as well as the containers.","Ulimits":"A list of `ulimits` to set in the container. This parameter maps to `Ulimits` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--ulimit` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . Valid naming values are displayed in the [Ulimit](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_Ulimit.html) data type. This parameter requires version 1.18 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: `sudo docker version --format \'{{.Server.APIVersion}}\'`\\n\\n> This parameter is not supported for Windows containers.","User":"The user to use inside the container. This parameter maps to `User` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--user` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> When running tasks using the `host` network mode, don\'t run containers using the root user (UID 0). We recommend using a non-root user for better security. \\n\\nYou can specify the `user` using the following formats. If specifying a UID or GID, you must specify it as a positive integer.\\n\\n- `user`\\n- `user:group`\\n- `uid`\\n- `uid:gid`\\n- `user:gid`\\n- `uid:group`\\n\\n> This parameter is not supported for Windows containers.","VolumesFrom":"Data volumes to mount from another container. This parameter maps to `VolumesFrom` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--volumes-from` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .","WorkingDirectory":"The working directory to run commands inside the container in. This parameter maps to `WorkingDir` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--workdir` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) ."}},"AWS::ECS::TaskDefinition.ContainerDependency":{"attributes":{},"description":"The `ContainerDependency` property specifies the dependencies defined for container startup and shutdown. A container can contain multiple dependencies. When a dependency is defined for container startup, for container shutdown it is reversed.\\n\\nYour Amazon ECS container instances require at least version 1.26.0 of the container agent to enable container dependencies. However, we recommend using the latest container agent version. For information about checking your agent version and updating to the latest version, see [Updating the Amazon ECS Container Agent](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html) in the *Amazon Elastic Container Service Developer Guide* . If you are using an Amazon ECS-optimized Linux AMI, your instance needs at least version 1.26.0-1 of the `ecs-init` package. If your container instances are launched from version `20190301` or later, then they contain the required versions of the container agent and `ecs-init` . For more information, see [Amazon ECS-optimized Linux AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\n> For tasks using the Fargate launch type, this parameter requires that the task or service uses platform version 1.3.0 or later.","properties":{"Condition":"The dependency condition of the container. The following are the available conditions and their behavior:\\n\\n- `START` - This condition emulates the behavior of links and volumes today. It validates that a dependent container is started before permitting other containers to start.\\n- `COMPLETE` - This condition validates that a dependent container runs to completion (exits) before permitting other containers to start. This can be useful for nonessential containers that run a script and then exit. This condition can\'t be set on an essential container.\\n- `SUCCESS` - This condition is the same as `COMPLETE` , but it also requires that the container exits with a `zero` status. This condition can\'t be set on an essential container.\\n- `HEALTHY` - This condition validates that the dependent container passes its Docker health check before permitting other containers to start. This requires that the dependent container has health checks configured. This condition is confirmed only at task startup.","ContainerName":"The name of a container."}},"AWS::ECS::TaskDefinition.Device":{"attributes":{},"description":"The `Device` property specifies an object representing a container instance host device.","properties":{"ContainerPath":"The path inside the container at which to expose the host device.","HostPath":"The path for the device on the host container instance.","Permissions":"The explicit permissions to provide to the container for the device. By default, the container has permissions for `read` , `write` , and `mknod` for the device."}},"AWS::ECS::TaskDefinition.DockerVolumeConfiguration":{"attributes":{},"description":"The `DockerVolumeConfiguration` property specifies a Docker volume configuration and is used when you use Docker volumes. Docker volumes are only supported when you are using the EC2 launch type. Windows containers only support the use of the `local` driver. To use bind mounts, specify a `host` instead.","properties":{"Autoprovision":"If this value is `true` , the Docker volume is created if it doesn\'t already exist.\\n\\n> This field is only used if the `scope` is `shared` .","Driver":"The Docker volume driver to use. The driver value must match the driver name provided by Docker because it is used for task placement. If the driver was installed using the Docker plugin CLI, use `docker plugin ls` to retrieve the driver name from your container instance. If the driver was installed using another method, use Docker plugin discovery to retrieve the driver name. For more information, see [Docker plugin discovery](https://docs.aws.amazon.com/https://docs.docker.com/engine/extend/plugin_api/#plugin-discovery) . This parameter maps to `Driver` in the [Create a volume](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/VolumeCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `xxdriver` option to [docker volume create](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/commandline/volume_create/) .","DriverOpts":"A map of Docker driver-specific options passed through. This parameter maps to `DriverOpts` in the [Create a volume](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/VolumeCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `xxopt` option to [docker volume create](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/commandline/volume_create/) .","Labels":"Custom metadata to add to your Docker volume. This parameter maps to `Labels` in the [Create a volume](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/VolumeCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `xxlabel` option to [docker volume create](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/commandline/volume_create/) .","Scope":"The scope for the Docker volume that determines its lifecycle. Docker volumes that are scoped to a `task` are automatically provisioned when the task starts and destroyed when the task stops. Docker volumes that are scoped as `shared` persist after the task stops."}},"AWS::ECS::TaskDefinition.EFSVolumeConfiguration":{"attributes":{},"description":"This parameter is specified when you\'re using an Amazon Elastic File System file system for task storage. For more information, see [Amazon EFS volumes](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/efs-volumes.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"AuthorizationConfig":"The authorization configuration details for the Amazon EFS file system.","FilesystemId":"The Amazon EFS file system ID to use.","RootDirectory":"The directory within the Amazon EFS file system to mount as the root directory inside the host. If this parameter is omitted, the root of the Amazon EFS volume will be used. Specifying `/` will have the same effect as omitting this parameter.\\n\\n> If an EFS access point is specified in the `authorizationConfig` , the root directory parameter must either be omitted or set to `/` which will enforce the path set on the EFS access point.","TransitEncryption":"Determines whether to use encryption for Amazon EFS data in transit between the Amazon ECS host and the Amazon EFS server. Transit encryption must be turned on if Amazon EFS IAM authorization is used. If this parameter is omitted, the default value of `DISABLED` is used. For more information, see [Encrypting data in transit](https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html) in the *Amazon Elastic File System User Guide* .","TransitEncryptionPort":"The port to use when sending encrypted data between the Amazon ECS host and the Amazon EFS server. If you do not specify a transit encryption port, it will use the port selection strategy that the Amazon EFS mount helper uses. For more information, see [EFS mount helper](https://docs.aws.amazon.com/efs/latest/ug/efs-mount-helper.html) in the *Amazon Elastic File System User Guide* ."}},"AWS::ECS::TaskDefinition.EnvironmentFile":{"attributes":{},"description":"A list of files containing the environment variables to pass to a container. You can specify up to ten environment files. The file must have a `.env` file extension. Each line in an environment file should contain an environment variable in `VARIABLE=VALUE` format. Lines beginning with `#` are treated as comments and are ignored. For more information about the environment variable file syntax, see [Declare default environment variables in file](https://docs.aws.amazon.com/https://docs.docker.com/compose/env-file/) .\\n\\nIf there are environment variables specified using the `environment` parameter in a container definition, they take precedence over the variables contained within an environment file. If multiple environment files are specified that contain the same variable, they\'re processed from the top down. We recommend that you use unique variable names. For more information, see [Specifying environment variables](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/taskdef-envfiles.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nThis parameter is only supported for tasks hosted on Fargate using the following platform versions:\\n\\n- Linux platform version `1.4.0` or later.\\n- Windows platform version `1.0.0` or later.","properties":{"Type":"The file type to use. The only supported value is `s3` .","Value":"The Amazon Resource Name (ARN) of the Amazon S3 object containing the environment variable file."}},"AWS::ECS::TaskDefinition.EphemeralStorage":{"attributes":{},"description":"The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on AWS Fargate . For more information, see [Fargate task storage](https://docs.aws.amazon.com/AmazonECS/latest/userguide/using_data_volumes.html) in the *Amazon ECS User Guide for AWS Fargate* .\\n\\n> For tasks using the Fargate launch type, the task requires the following platforms:\\n> \\n> - Linux platform version `1.4.0` or later.\\n> - Windows platform version `1.0.0` or later.","properties":{"SizeInGiB":"The total amount, in GiB, of ephemeral storage to set for the task. The minimum supported value is `21` GiB and the maximum supported value is `200` GiB."}},"AWS::ECS::TaskDefinition.FirelensConfiguration":{"attributes":{},"description":"The FireLens configuration for the container. This is used to specify and configure a log router for container logs. For more information, see [Custom log routing](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"Options":"The options to use when configuring the log router. This field is optional and can be used to add additional metadata, such as the task, task definition, cluster, and container instance details to the log event.\\n\\nIf specified, valid option keys are:\\n\\n- `enable-ecs-log-metadata` , which can be `true` or `false`\\n- `config-file-type` , which can be `s3` or `file`\\n- `config-file-value` , which is either an S3 ARN or a file path","Type":"The log router to use. The valid values are `fluentd` or `fluentbit` ."}},"AWS::ECS::TaskDefinition.HealthCheck":{"attributes":{},"description":"The `HealthCheck` property specifies an object representing a container health check. Health check parameters that are specified in a container definition override any Docker health checks that exist in the container image (such as those specified in a parent image or from the image\'s Dockerfile). This configuration maps to the `HEALTHCHECK` parameter of [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .\\n\\n> The Amazon ECS container agent only monitors and reports on the health checks specified in the task definition. Amazon ECS does not monitor Docker health checks that are embedded in a container image and not specified in the container definition. Health check parameters that are specified in a container definition override any Docker health checks that exist in the container image. \\n\\nIf a task is run manually, and not as part of a service, the task will continue its lifecycle regardless of its health status. For tasks that are part of a service, if the task reports as unhealthy then the task will be stopped and the service scheduler will replace it.\\n\\nThe following are notes about container health check support:\\n\\n- Container health checks require version 1.17.0 or greater of the Amazon ECS container agent. For more information, see [Updating the Amazon ECS Container Agent](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html) .\\n- Container health checks are supported for Fargate tasks if you are using platform version 1.1.0 or greater. For more information, see [AWS Fargate Platform Versions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html) .\\n- Container health checks are not supported for tasks that are part of a service that is configured to use a Classic Load Balancer.","properties":{"Command":"A string array representing the command that the container runs to determine if it is healthy. The string array must start with `CMD` to run the command arguments directly, or `CMD-SHELL` to run the command with the container\'s default shell.\\n\\nWhen you use the AWS Management Console JSON panel, the AWS Command Line Interface , or the APIs, enclose the list of commands in double quotes and brackets.\\n\\n`[ \\"CMD-SHELL\\", \\"curl -f http://localhost/ || exit 1\\" ]`\\n\\nYou don\'t include the double quotes and brackets when you use the AWS Management Console.\\n\\n`CMD-SHELL, curl -f http://localhost/ || exit 1`\\n\\nAn exit code of 0 indicates success, and non-zero exit code indicates failure. For more information, see `HealthCheck` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) .","Interval":"The time period in seconds between each health check execution. You may specify between 5 and 300 seconds. The default value is 30 seconds.","Retries":"The number of times to retry a failed health check before the container is considered unhealthy. You may specify between 1 and 10 retries. The default value is 3.","StartPeriod":"The optional grace period to provide containers time to bootstrap before failed health checks count towards the maximum number of retries. You can specify between 0 and 300 seconds. By default, the `startPeriod` is off.\\n\\n> If a health check succeeds within the `startPeriod` , then the container is considered healthy and any subsequent failures count toward the maximum number of retries.","Timeout":"The time period in seconds to wait for a health check to succeed before it is considered a failure. You may specify between 2 and 60 seconds. The default value is 5."}},"AWS::ECS::TaskDefinition.HostEntry":{"attributes":{},"description":"The `HostEntry` property specifies a hostname and an IP address that are added to the `/etc/hosts` file of a container through the `extraHosts` parameter of its `ContainerDefinition` resource.","properties":{"Hostname":"The hostname to use in the `/etc/hosts` entry.","IpAddress":"The IP address to use in the `/etc/hosts` entry."}},"AWS::ECS::TaskDefinition.HostVolumeProperties":{"attributes":{},"description":"The `HostVolumeProperties` property specifies details on a container instance bind mount host volume.","properties":{"SourcePath":"When the `host` parameter is used, specify a `sourcePath` to declare the path on the host container instance that\'s presented to the container. If this parameter is empty, then the Docker daemon has assigned a host path for you. If the `host` parameter contains a `sourcePath` file location, then the data volume persists at the specified location on the host container instance until you delete it manually. If the `sourcePath` value doesn\'t exist on the host container instance, the Docker daemon creates it. If the location does exist, the contents of the source path folder are exported.\\n\\nIf you\'re using the Fargate launch type, the `sourcePath` parameter is not supported."}},"AWS::ECS::TaskDefinition.InferenceAccelerator":{"attributes":{},"description":"Details on an Elastic Inference accelerator. For more information, see [Working with Amazon Elastic Inference on Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-inference.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"DeviceName":"The Elastic Inference accelerator device name. The `deviceName` must also be referenced in a container definition as a [ResourceRequirement](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ResourceRequirement.html) .","DeviceType":"The Elastic Inference accelerator type to use."}},"AWS::ECS::TaskDefinition.KernelCapabilities":{"attributes":{},"description":"The `KernelCapabilities` property specifies the Linux capabilities for the container that are added to or dropped from the default configuration that is provided by Docker. For more information on the default capabilities and the non-default available capabilities, see [Runtime privilege and Linux capabilities](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) in the *Docker run reference* . For more detailed information on these Linux capabilities, see the [capabilities(7)](https://docs.aws.amazon.com/http://man7.org/linux/man-pages/man7/capabilities.7.html) Linux manual page.","properties":{"Add":"The Linux capabilities for the container that have been added to the default configuration provided by Docker. This parameter maps to `CapAdd` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--cap-add` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> Tasks launched on AWS Fargate only support adding the `SYS_PTRACE` kernel capability. \\n\\nValid values: `\\"ALL\\" | \\"AUDIT_CONTROL\\" | \\"AUDIT_WRITE\\" | \\"BLOCK_SUSPEND\\" | \\"CHOWN\\" | \\"DAC_OVERRIDE\\" | \\"DAC_READ_SEARCH\\" | \\"FOWNER\\" | \\"FSETID\\" | \\"IPC_LOCK\\" | \\"IPC_OWNER\\" | \\"KILL\\" | \\"LEASE\\" | \\"LINUX_IMMUTABLE\\" | \\"MAC_ADMIN\\" | \\"MAC_OVERRIDE\\" | \\"MKNOD\\" | \\"NET_ADMIN\\" | \\"NET_BIND_SERVICE\\" | \\"NET_BROADCAST\\" | \\"NET_RAW\\" | \\"SETFCAP\\" | \\"SETGID\\" | \\"SETPCAP\\" | \\"SETUID\\" | \\"SYS_ADMIN\\" | \\"SYS_BOOT\\" | \\"SYS_CHROOT\\" | \\"SYS_MODULE\\" | \\"SYS_NICE\\" | \\"SYS_PACCT\\" | \\"SYS_PTRACE\\" | \\"SYS_RAWIO\\" | \\"SYS_RESOURCE\\" | \\"SYS_TIME\\" | \\"SYS_TTY_CONFIG\\" | \\"SYSLOG\\" | \\"WAKE_ALARM\\"`","Drop":"The Linux capabilities for the container that have been removed from the default configuration provided by Docker. This parameter maps to `CapDrop` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--cap-drop` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\nValid values: `\\"ALL\\" | \\"AUDIT_CONTROL\\" | \\"AUDIT_WRITE\\" | \\"BLOCK_SUSPEND\\" | \\"CHOWN\\" | \\"DAC_OVERRIDE\\" | \\"DAC_READ_SEARCH\\" | \\"FOWNER\\" | \\"FSETID\\" | \\"IPC_LOCK\\" | \\"IPC_OWNER\\" | \\"KILL\\" | \\"LEASE\\" | \\"LINUX_IMMUTABLE\\" | \\"MAC_ADMIN\\" | \\"MAC_OVERRIDE\\" | \\"MKNOD\\" | \\"NET_ADMIN\\" | \\"NET_BIND_SERVICE\\" | \\"NET_BROADCAST\\" | \\"NET_RAW\\" | \\"SETFCAP\\" | \\"SETGID\\" | \\"SETPCAP\\" | \\"SETUID\\" | \\"SYS_ADMIN\\" | \\"SYS_BOOT\\" | \\"SYS_CHROOT\\" | \\"SYS_MODULE\\" | \\"SYS_NICE\\" | \\"SYS_PACCT\\" | \\"SYS_PTRACE\\" | \\"SYS_RAWIO\\" | \\"SYS_RESOURCE\\" | \\"SYS_TIME\\" | \\"SYS_TTY_CONFIG\\" | \\"SYSLOG\\" | \\"WAKE_ALARM\\"`"}},"AWS::ECS::TaskDefinition.KeyValuePair":{"attributes":{},"description":"A key-value pair object.","properties":{"Name":"The name of the key-value pair. For environment variables, this is the name of the environment variable.","Value":"The value of the key-value pair. For environment variables, this is the value of the environment variable."}},"AWS::ECS::TaskDefinition.LinuxParameters":{"attributes":{},"description":"The Linux-specific options that are applied to the container, such as Linux [KernelCapabilities](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_KernelCapabilities.html) .","properties":{"Capabilities":"The Linux capabilities for the container that are added to or dropped from the default configuration provided by Docker.\\n\\n> For tasks that use the Fargate launch type, `capabilities` is supported for all platform versions but the `add` parameter is only supported if using platform version 1.4.0 or later.","Devices":"Any host devices to expose to the container. This parameter maps to `Devices` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--device` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> If you\'re using tasks that use the Fargate launch type, the `devices` parameter isn\'t supported.","InitProcessEnabled":"Run an `init` process inside the container that forwards signals and reaps processes. This parameter maps to the `--init` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) . This parameter requires version 1.25 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: `sudo docker version --format \'{{.Server.APIVersion}}\'`","MaxSwap":"The total amount of swap memory (in MiB) a container can use. This parameter will be translated to the `--memory-swap` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) where the value would be the sum of the container memory plus the `maxSwap` value.\\n\\nIf a `maxSwap` value of `0` is specified, the container will not use swap. Accepted values are `0` or any positive integer. If the `maxSwap` parameter is omitted, the container will use the swap configuration for the container instance it is running on. A `maxSwap` value must be set for the `swappiness` parameter to be used.\\n\\n> If you\'re using tasks that use the Fargate launch type, the `maxSwap` parameter isn\'t supported.\\n> \\n> If you\'re using tasks on Amazon Linux 2023 the `swappiness` parameter isn\'t supported.","SharedMemorySize":"The value for the size (in MiB) of the `/dev/shm` volume. This parameter maps to the `--shm-size` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> If you are using tasks that use the Fargate launch type, the `sharedMemorySize` parameter is not supported.","Swappiness":"This allows you to tune a container\'s memory swappiness behavior. A `swappiness` value of `0` will cause swapping to not happen unless absolutely necessary. A `swappiness` value of `100` will cause pages to be swapped very aggressively. Accepted values are whole numbers between `0` and `100` . If the `swappiness` parameter is not specified, a default value of `60` is used. If a value is not specified for `maxSwap` then this parameter is ignored. This parameter maps to the `--memory-swappiness` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> If you\'re using tasks that use the Fargate launch type, the `swappiness` parameter isn\'t supported.\\n> \\n> If you\'re using tasks on Amazon Linux 2023 the `swappiness` parameter isn\'t supported.","Tmpfs":"The container path, mount options, and size (in MiB) of the tmpfs mount. This parameter maps to the `--tmpfs` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\n> If you\'re using tasks that use the Fargate launch type, the `tmpfs` parameter isn\'t supported."}},"AWS::ECS::TaskDefinition.LogConfiguration":{"attributes":{},"description":"The `LogConfiguration` property specifies log configuration options to send to a custom log driver for the container.","properties":{"LogDriver":"The log driver to use for the container.\\n\\nFor tasks on AWS Fargate , the supported log drivers are `awslogs` , `splunk` , and `awsfirelens` .\\n\\nFor tasks hosted on Amazon EC2 instances, the supported log drivers are `awslogs` , `fluentd` , `gelf` , `json-file` , `journald` , `logentries` , `syslog` , `splunk` , and `awsfirelens` .\\n\\nFor more information about using the `awslogs` log driver, see [Using the awslogs log driver](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_awslogs.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nFor more information about using the `awsfirelens` log driver, see [Custom log routing](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\n> If you have a custom driver that isn\'t listed, you can fork the Amazon ECS container agent project that\'s [available on GitHub](https://docs.aws.amazon.com/https://github.com/aws/amazon-ecs-agent) and customize it to work with that driver. We encourage you to submit pull requests for changes that you would like to have included. However, we don\'t currently provide support for running modified copies of this software.","Options":"The configuration options to send to the log driver. This parameter requires version 1.19 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: `sudo docker version --format \'{{.Server.APIVersion}}\'`","SecretOptions":"The secrets to pass to the log configuration. For more information, see [Specifying sensitive data](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html) in the *Amazon Elastic Container Service Developer Guide* ."}},"AWS::ECS::TaskDefinition.MountPoint":{"attributes":{},"description":"The details for a volume mount point that\'s used in a container definition.","properties":{"ContainerPath":"The path on the container to mount the host volume at.","ReadOnly":"If this value is `true` , the container has read-only access to the volume. If this value is `false` , then the container can write to the volume. The default value is `false` .","SourceVolume":"The name of the volume to mount. Must be a volume name referenced in the `name` parameter of task definition `volume` ."}},"AWS::ECS::TaskDefinition.PortMapping":{"attributes":{},"description":"The `PortMapping` property specifies a port mapping. Port mappings allow containers to access ports on the host container instance to send or receive traffic. Port mappings are specified as part of the container definition.\\n\\nIf you are using containers in a task with the `awsvpc` or `host` network mode, exposed ports should be specified using `containerPort` . The `hostPort` can be left blank or it must be the same value as the `containerPort` .\\n\\nAfter a task reaches the `RUNNING` status, manual and automatic host and container port assignments are visible in the `networkBindings` section of [DescribeTasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html) API responses.","properties":{"AppProtocol":"The application protocol that\'s used for the port mapping. This parameter only applies to Service Connect. We recommend that you set this parameter to be consistent with the protocol that your application uses. If you set this parameter, Amazon ECS adds protocol-specific connection handling to the Service Connect proxy. If you set this parameter, Amazon ECS adds protocol-specific telemetry in the Amazon ECS console and CloudWatch.\\n\\nIf you don\'t set a value for this parameter, then TCP is used. However, Amazon ECS doesn\'t add protocol-specific telemetry for TCP.\\n\\nTasks that run in a namespace can use short names to connect to services in the namespace. Tasks can connect to services across all of the clusters in the namespace. Tasks connect through a managed proxy container that collects logs and metrics for increased visibility. Only the tasks that Amazon ECS services create are supported with Service Connect. For more information, see [Service Connect](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html) in the *Amazon Elastic Container Service Developer Guide* .","ContainerPort":"The port number on the container that\'s bound to the user-specified or automatically assigned host port.\\n\\nIf you use containers in a task with the `awsvpc` or `host` network mode, specify the exposed ports using `containerPort` .\\n\\nIf you use containers in a task with the `bridge` network mode and you specify a container port and not a host port, your container automatically receives a host port in the ephemeral port range. For more information, see `hostPort` . Port mappings that are automatically assigned in this way do not count toward the 100 reserved ports limit of a container instance.","ContainerPortRange":"The port number range on the container that\'s bound to the dynamically mapped host port range.\\n\\nThe following rules apply when you specify a `containerPortRange` :\\n\\n- You must use either the `bridge` network mode or the `awsvpc` network mode.\\n- This parameter is available for both the EC2 and AWS Fargate launch types.\\n- This parameter is available for both the Linux and Windows operating systems.\\n- The container instance must have at least version 1.67.0 of the container agent and at least version 1.67.0-1 of the `ecs-init` package\\n- You can specify a maximum of 100 port ranges per container.\\n- You do not specify a `hostPortRange` . The value of the `hostPortRange` is set as follows:\\n\\n- For containers in a task with the `awsvpc` network mode, the `hostPort` is set to the same value as the `containerPort` . This is a static mapping strategy.\\n- For containers in a task with the `bridge` network mode, the Amazon ECS agent finds open host ports from the default ephemeral range and passes it to docker to bind them to the container ports.\\n- The `containerPortRange` valid values are between 1 and 65535.\\n- A port can only be included in one port mapping per container.\\n- You cannot specify overlapping port ranges.\\n- The first port in the range must be less than last port in the range.\\n- Docker recommends that you turn off the docker-proxy in the Docker daemon config file when you have a large number of ports.\\n\\nFor more information, see [Issue #11185](https://docs.aws.amazon.com/https://github.com/moby/moby/issues/11185) on the Github website.\\n\\nFor information about how to turn off the docker-proxy in the Docker daemon config file, see [Docker daemon](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/bootstrap_container_instance.html#bootstrap_docker_daemon) in the *Amazon ECS Developer Guide* .\\n\\nYou can call [`DescribeTasks`](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html) to view the `hostPortRange` which are the host ports that are bound to the container ports.","HostPort":"The port number on the container instance to reserve for your container.\\n\\nIf you specify a `containerPortRange` , leave this field empty and the value of the `hostPort` is set as follows:\\n\\n- For containers in a task with the `awsvpc` network mode, the `hostPort` is set to the same value as the `containerPort` . This is a static mapping strategy.\\n- For containers in a task with the `bridge` network mode, the Amazon ECS agent finds open ports on the host and automatically binds them to the container ports. This is a dynamic mapping strategy.\\n\\nIf you use containers in a task with the `awsvpc` or `host` network mode, the `hostPort` can either be left blank or set to the same value as the `containerPort` .\\n\\nIf you use containers in a task with the `bridge` network mode, you can specify a non-reserved host port for your container port mapping, or you can omit the `hostPort` (or set it to `0` ) while specifying a `containerPort` and your container automatically receives a port in the ephemeral port range for your container instance operating system and Docker version.\\n\\nThe default ephemeral port range for Docker version 1.6.0 and later is listed on the instance under `/proc/sys/net/ipv4/ip_local_port_range` . If this kernel parameter is unavailable, the default ephemeral port range from 49153 through 65535 is used. Do not attempt to specify a host port in the ephemeral port range as these are reserved for automatic assignment. In general, ports below 32768 are outside of the ephemeral port range.\\n\\nThe default reserved ports are 22 for SSH, the Docker ports 2375 and 2376, and the Amazon ECS container agent ports 51678-51680. Any host port that was previously specified in a running task is also reserved while the task is running. That is, after a task stops, the host port is released. The current reserved ports are displayed in the `remainingResources` of [DescribeContainerInstances](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeContainerInstances.html) output. A container instance can have up to 100 reserved ports at a time. This number includes the default reserved ports. Automatically assigned ports aren\'t included in the 100 reserved ports quota.","Name":"The name that\'s used for the port mapping. This parameter only applies to Service Connect. This parameter is the name that you use in the `serviceConnectConfiguration` of a service. The name can include up to 64 characters. The characters can include lowercase letters, numbers, underscores (_), and hyphens (-). The name can\'t start with a hyphen.\\n\\nFor more information, see [Service Connect](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html) in the *Amazon Elastic Container Service Developer Guide* .","Protocol":"The protocol used for the port mapping. Valid values are `tcp` and `udp` . The default is `tcp` ."}},"AWS::ECS::TaskDefinition.ProxyConfiguration":{"attributes":{},"description":"The configuration details for the App Mesh proxy.\\n\\nFor tasks that use the EC2 launch type, the container instances require at least version 1.26.0 of the container agent and at least version 1.26.0-1 of the `ecs-init` package to use a proxy configuration. If your container instances are launched from the Amazon ECS optimized AMI version `20190301` or later, then they contain the required versions of the container agent and `ecs-init` . For more information, see [Amazon ECS-optimized Linux AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html)","properties":{"ContainerName":"The name of the container that will serve as the App Mesh proxy.","ProxyConfigurationProperties":"The set of network configuration parameters to provide the Container Network Interface (CNI) plugin, specified as key-value pairs.\\n\\n- `IgnoredUID` - (Required) The user ID (UID) of the proxy container as defined by the `user` parameter in a container definition. This is used to ensure the proxy ignores its own traffic. If `IgnoredGID` is specified, this field can be empty.\\n- `IgnoredGID` - (Required) The group ID (GID) of the proxy container as defined by the `user` parameter in a container definition. This is used to ensure the proxy ignores its own traffic. If `IgnoredUID` is specified, this field can be empty.\\n- `AppPorts` - (Required) The list of ports that the application uses. Network traffic to these ports is forwarded to the `ProxyIngressPort` and `ProxyEgressPort` .\\n- `ProxyIngressPort` - (Required) Specifies the port that incoming traffic to the `AppPorts` is directed to.\\n- `ProxyEgressPort` - (Required) Specifies the port that outgoing traffic from the `AppPorts` is directed to.\\n- `EgressIgnoredPorts` - (Required) The egress traffic going to the specified ports is ignored and not redirected to the `ProxyEgressPort` . It can be an empty list.\\n- `EgressIgnoredIPs` - (Required) The egress traffic going to the specified IP addresses is ignored and not redirected to the `ProxyEgressPort` . It can be an empty list.","Type":"The proxy type. The only supported value is `APPMESH` ."}},"AWS::ECS::TaskDefinition.RepositoryCredentials":{"attributes":{},"description":"The repository credentials for private registry authentication.","properties":{"CredentialsParameter":"The Amazon Resource Name (ARN) of the secret containing the private repository credentials.\\n\\n> When you use the Amazon ECS API, AWS CLI , or AWS SDK, if the secret exists in the same Region as the task that you\'re launching then you can use either the full ARN or the name of the secret. When you use the AWS Management Console, you must specify the full ARN of the secret."}},"AWS::ECS::TaskDefinition.ResourceRequirement":{"attributes":{},"description":"The type and amount of a resource to assign to a container. The supported resource types are GPUs and Elastic Inference accelerators. For more information, see [Working with GPUs on Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-gpu.html) or [Working with Amazon Elastic Inference on Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-inference.html) in the *Amazon Elastic Container Service Developer Guide*","properties":{"Type":"The type of resource to assign to a container. The supported values are `GPU` or `InferenceAccelerator` .","Value":"The value for the specified resource type.\\n\\nIf the `GPU` type is used, the value is the number of physical `GPUs` the Amazon ECS container agent reserves for the container. The number of GPUs that\'s reserved for all containers in a task can\'t exceed the number of available GPUs on the container instance that the task is launched on.\\n\\nIf the `InferenceAccelerator` type is used, the `value` matches the `deviceName` for an [InferenceAccelerator](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_InferenceAccelerator.html) specified in a task definition."}},"AWS::ECS::TaskDefinition.RuntimePlatform":{"attributes":{},"description":"Information about the platform for the Amazon ECS service or task.\\n\\nFor more information about `RuntimePlatform` , see [RuntimePlatform](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#runtime-platform) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"CpuArchitecture":"The CPU architecture.\\n\\nYou can run your Linux tasks on an ARM-based platform by setting the value to `ARM64` . This option is available for tasks that run on Linux Amazon EC2 instance or Linux containers on Fargate.","OperatingSystemFamily":"The operating system."}},"AWS::ECS::TaskDefinition.Secret":{"attributes":{},"description":"An object representing the secret to expose to your container. Secrets can be exposed to a container in the following ways:\\n\\n- To inject sensitive data into your containers as environment variables, use the `secrets` container definition parameter.\\n- To reference sensitive information in the log configuration of a container, use the `secretOptions` container definition parameter.\\n\\nFor more information, see [Specifying sensitive data](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"Name":"The name of the secret.","ValueFrom":"The secret to expose to the container. The supported values are either the full ARN of the AWS Secrets Manager secret or the full ARN of the parameter in the SSM Parameter Store.\\n\\nFor information about the require AWS Identity and Access Management permissions, see [Required IAM permissions for Amazon ECS secrets](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-secrets.html#secrets-iam) (for Secrets Manager) or [Required IAM permissions for Amazon ECS secrets](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-parameters.html) (for Systems Manager Parameter store) in the *Amazon Elastic Container Service Developer Guide* .\\n\\n> If the SSM Parameter Store parameter exists in the same Region as the task you\'re launching, then you can use either the full ARN or name of the parameter. If the parameter exists in a different Region, then the full ARN must be specified."}},"AWS::ECS::TaskDefinition.SystemControl":{"attributes":{},"description":"A list of namespaced kernel parameters to set in the container. This parameter maps to `Sysctls` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/#operation/ContainerCreate) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.35/) and the `--sysctl` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/#security-configuration) .\\n\\nWe don\'t recommend that you specify network-related `systemControls` parameters for multiple containers in a single task. This task also uses either the `awsvpc` or `host` network mode. It does it for the following reasons.\\n\\n- For tasks that use the `awsvpc` network mode, if you set `systemControls` for any container, it applies to all containers in the task. If you set different `systemControls` for multiple containers in a single task, the container that\'s started last determines which `systemControls` take effect.\\n- For tasks that use the `host` network mode, the `systemControls` parameter applies to the container instance\'s kernel parameter and that of all containers of any tasks running on that container instance.","properties":{"Namespace":"The namespaced kernel parameter to set a `value` for.","Value":"The value for the namespaced kernel parameter that\'s specified in `namespace` ."}},"AWS::ECS::TaskDefinition.TaskDefinitionPlacementConstraint":{"attributes":{},"description":"The constraint on task placement in the task definition. For more information, see [Task placement constraints](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\n> Task placement constraints aren\'t supported for tasks run on AWS Fargate .","properties":{"Expression":"A cluster query language expression to apply to the constraint. For more information, see [Cluster query language](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html) in the *Amazon Elastic Container Service Developer Guide* .","Type":"The type of constraint. The `MemberOf` constraint restricts selection to be from a group of valid candidates."}},"AWS::ECS::TaskDefinition.Tmpfs":{"attributes":{},"description":"The container path, mount options, and size of the tmpfs mount.","properties":{"ContainerPath":"The absolute file path where the tmpfs volume is to be mounted.","MountOptions":"The list of tmpfs volume mount options.\\n\\nValid values: `\\"defaults\\" | \\"ro\\" | \\"rw\\" | \\"suid\\" | \\"nosuid\\" | \\"dev\\" | \\"nodev\\" | \\"exec\\" | \\"noexec\\" | \\"sync\\" | \\"async\\" | \\"dirsync\\" | \\"remount\\" | \\"mand\\" | \\"nomand\\" | \\"atime\\" | \\"noatime\\" | \\"diratime\\" | \\"nodiratime\\" | \\"bind\\" | \\"rbind\\" | \\"unbindable\\" | \\"runbindable\\" | \\"private\\" | \\"rprivate\\" | \\"shared\\" | \\"rshared\\" | \\"slave\\" | \\"rslave\\" | \\"relatime\\" | \\"norelatime\\" | \\"strictatime\\" | \\"nostrictatime\\" | \\"mode\\" | \\"uid\\" | \\"gid\\" | \\"nr_inodes\\" | \\"nr_blocks\\" | \\"mpol\\"`","Size":"The maximum size (in MiB) of the tmpfs volume."}},"AWS::ECS::TaskDefinition.Ulimit":{"attributes":{},"description":"The `ulimit` settings to pass to the container.\\n\\nAmazon ECS tasks hosted on AWS Fargate use the default resource limit values set by the operating system with the exception of the `nofile` resource limit parameter which AWS Fargate overrides. The `nofile` resource limit sets a restriction on the number of open files that a container can use. The default `nofile` soft limit is `1024` and the default hard limit is `4096` .\\n\\nYou can specify the `ulimit` settings for a container in a task definition.","properties":{"HardLimit":"The hard limit for the `ulimit` type.","Name":"The `type` of the `ulimit` .","SoftLimit":"The soft limit for the `ulimit` type."}},"AWS::ECS::TaskDefinition.Volume":{"attributes":{},"description":"The `Volume` property specifies a data volume used in a task definition. For tasks that use a Docker volume, specify a `DockerVolumeConfiguration` . For tasks that use a bind mount host volume, specify a `host` and optional `sourcePath` . For more information about `host` and optional `sourcePath` , see [Volumes](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#volumes) and [Using Data Volumes in Tasks](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html) .","properties":{"DockerVolumeConfiguration":"This parameter is specified when you use Docker volumes.\\n\\nWindows containers only support the use of the `local` driver. To use bind mounts, specify the `host` parameter instead.\\n\\n> Docker volumes aren\'t supported by tasks run on AWS Fargate .","EFSVolumeConfiguration":"This parameter is specified when you use an Amazon Elastic File System file system for task storage.","Host":"This parameter is specified when you use bind mount host volumes. The contents of the `host` parameter determine whether your bind mount host volume persists on the host container instance and where it\'s stored. If the `host` parameter is empty, then the Docker daemon assigns a host path for your data volume. However, the data isn\'t guaranteed to persist after the containers that are associated with it stop running.\\n\\nWindows containers can mount whole directories on the same drive as `$env:ProgramData` . Windows containers can\'t mount directories on a different drive, and mount point can\'t be across drives. For example, you can mount `C:\\\\my\\\\path:C:\\\\my\\\\path` and `D:\\\\:D:\\\\` , but not `D:\\\\my\\\\path:C:\\\\my\\\\path` or `D:\\\\:C:\\\\my\\\\path` .","Name":"The name of the volume. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. This name is referenced in the `sourceVolume` parameter of container definition `mountPoints` ."}},"AWS::ECS::TaskDefinition.VolumeFrom":{"attributes":{},"description":"Details on a data volume from another container in the same task definition.","properties":{"ReadOnly":"If this value is `true` , the container has read-only access to the volume. If this value is `false` , then the container can write to the volume. The default value is `false` .","SourceContainer":"The name of another container within the same task definition to mount volumes from."}},"AWS::ECS::TaskSet":{"attributes":{"Id":"The ID of the task set.","Ref":"`Ref` returns the resource name."},"description":"Create a task set in the specified cluster and service. This is used when a service uses the `EXTERNAL` deployment controller type. For more information, see [Amazon ECS deployment types](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"Cluster":"The short name or full Amazon Resource Name (ARN) of the cluster that hosts the service to create the task set in.","ExternalId":"An optional non-unique tag that identifies this task set in external systems. If the task set is associated with a service discovery registry, the tasks in this task set will have the `ECS_TASK_SET_EXTERNAL_ID` AWS Cloud Map attribute set to the provided value.","LaunchType":"The launch type that new tasks in the task set uses. For more information, see [Amazon ECS launch types](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nIf a `launchType` is specified, the `capacityProviderStrategy` parameter must be omitted.","LoadBalancers":"A load balancer object representing the load balancer to use with the task set. The supported load balancer types are either an Application Load Balancer or a Network Load Balancer.","NetworkConfiguration":"The network configuration for the task set.","PlatformVersion":"The platform version that the tasks in the task set uses. A platform version is specified only for tasks using the Fargate launch type. If one isn\'t specified, the `LATEST` platform version is used.","Scale":"A floating-point percentage of your desired number of tasks to place and keep running in the task set.","Service":"The short name or full Amazon Resource Name (ARN) of the service to create the task set in.","ServiceRegistries":"The details of the service discovery registries to assign to this task set. For more information, see [Service discovery](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html) .","TaskDefinition":"The task definition for the tasks in the task set to use. If a revision isn\'t specified, the latest `ACTIVE` revision is used."}},"AWS::ECS::TaskSet.AwsVpcConfiguration":{"attributes":{},"description":"An object representing the networking details for a task or service.","properties":{"AssignPublicIp":"Whether the task\'s elastic network interface receives a public IP address. The default value is `DISABLED` .","SecurityGroups":"The IDs of the security groups associated with the task or service. If you don\'t specify a security group, the default security group for the VPC is used. There\'s a limit of 5 security groups that can be specified per `AwsVpcConfiguration` .\\n\\n> All specified security groups must be from the same VPC.","Subnets":"The IDs of the subnets associated with the task or service. There\'s a limit of 16 subnets that can be specified per `AwsVpcConfiguration` .\\n\\n> All specified subnets must be from the same VPC."}},"AWS::ECS::TaskSet.LoadBalancer":{"attributes":{},"description":"The load balancer configuration to use with a service or task set.\\n\\nWhen you add, update, or remove a load balancer configuration, Amazon ECS starts a new deployment with the updated Elastic Load Balancing configuration. This causes tasks to register to and deregister from load balancers.\\n\\nWe recommend that you verify this on a test environment before you update the Elastic Load Balancing configuration.\\n\\nA service-linked role is required for services that use multiple target groups. For more information, see [Using service-linked roles](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"ContainerName":"The name of the container (as it appears in a container definition) to associate with the load balancer.","ContainerPort":"The port on the container to associate with the load balancer. This port must correspond to a `containerPort` in the task definition the tasks in the service are using. For tasks that use the EC2 launch type, the container instance they\'re launched on must allow ingress traffic on the `hostPort` of the port mapping.","LoadBalancerName":"The name of the load balancer to associate with the Amazon ECS service or task set.\\n\\nA load balancer name is only specified when using a Classic Load Balancer. If you are using an Application Load Balancer or a Network Load Balancer the load balancer name parameter should be omitted.","TargetGroupArn":"The full Amazon Resource Name (ARN) of the Elastic Load Balancing target group or groups associated with a service or task set.\\n\\nA target group ARN is only specified when using an Application Load Balancer or Network Load Balancer. If you\'re using a Classic Load Balancer, omit the target group ARN.\\n\\nFor services using the `ECS` deployment controller, you can specify one or multiple target groups. For more information, see [Registering multiple target groups with a service](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nFor services using the `CODE_DEPLOY` deployment controller, you\'re required to define two target groups for the load balancer. For more information, see [Blue/green deployment with CodeDeploy](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-bluegreen.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\n> If your service\'s task definition uses the `awsvpc` network mode, you must choose `ip` as the target type, not `instance` . Do this when creating your target groups because tasks that use the `awsvpc` network mode are associated with an elastic network interface, not an Amazon EC2 instance. This network mode is required for the Fargate launch type."}},"AWS::ECS::TaskSet.NetworkConfiguration":{"attributes":{},"description":"The network configuration for a task or service.","properties":{"AwsVpcConfiguration":"The VPC subnets and security groups that are associated with a task.\\n\\n> All specified subnets and security groups must be from the same VPC."}},"AWS::ECS::TaskSet.Scale":{"attributes":{},"description":"A floating-point percentage of the desired number of tasks to place and keep running in the task set.","properties":{"Unit":"The unit of measure for the scale value.","Value":"The value, specified as a percent total of a service\'s `desiredCount` , to scale the task set. Accepted values are numbers between 0 and 100."}},"AWS::ECS::TaskSet.ServiceRegistry":{"attributes":{},"description":"The details for the service registry.\\n\\nEach service may be associated with one service registry. Multiple service registries for each service are not supported.\\n\\nWhen you add, update, or remove the service registries configuration, Amazon ECS starts a new deployment. New tasks are registered and deregistered to the updated service registry configuration.","properties":{"ContainerName":"The container name value to be used for your service discovery service. It\'s already specified in the task definition. If the task definition that your service task specifies uses the `bridge` or `host` network mode, you must specify a `containerName` and `containerPort` combination from the task definition. If the task definition that your service task specifies uses the `awsvpc` network mode and a type SRV DNS record is used, you must specify either a `containerName` and `containerPort` combination or a `port` value. However, you can\'t specify both.","ContainerPort":"The port value to be used for your service discovery service. It\'s already specified in the task definition. If the task definition your service task specifies uses the `bridge` or `host` network mode, you must specify a `containerName` and `containerPort` combination from the task definition. If the task definition your service task specifies uses the `awsvpc` network mode and a type SRV DNS record is used, you must specify either a `containerName` and `containerPort` combination or a `port` value. However, you can\'t specify both.","Port":"The port value used if your service discovery service specified an SRV record. This field might be used if both the `awsvpc` network mode and SRV records are used.","RegistryArn":"The Amazon Resource Name (ARN) of the service registry. The currently supported service registry is AWS Cloud Map . For more information, see [CreateService](https://docs.aws.amazon.com/cloud-map/latest/api/API_CreateService.html) ."}},"AWS::EFS::AccessPoint":{"attributes":{"AccessPointId":"The ID of the EFS access point.","Arn":"The Amazon Resource Name (ARN) of the access point.","Ref":"`Ref` returns the AccessPoint ID. For example:\\n\\n`{\\"Ref\\":\\"access_point-logical_id\\"}` returns\\n\\n`fsap-0123456789abcdef0`"},"description":"The `AWS::EFS::AccessPoint` resource creates an EFS access point. An access point is an application-specific view into an EFS file system that applies an operating system user and group, and a file system path, to any file system request made through the access point. The operating system user and group override any identity information provided by the NFS client. The file system path is exposed as the access point\'s root directory. Applications using the access point can only access data in its own directory and below. To learn more, see [Mounting a file system using EFS access points](https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html) .\\n\\nThis operation requires permissions for the `elasticfilesystem:CreateAccessPoint` action.","properties":{"AccessPointTags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","ClientToken":"The opaque string specified in the request to ensure idempotent creation.","FileSystemId":"The ID of the EFS file system that the access point applies to. Accepts only the ID format for input when specifying a file system, for example `fs-0123456789abcedf2` .","PosixUser":"The full POSIX identity, including the user ID, group ID, and secondary group IDs on the access point that is used for all file operations by NFS clients using the access point.","RootDirectory":"The directory on the Amazon EFS file system that the access point exposes as the root directory to NFS clients using the access point."}},"AWS::EFS::AccessPoint.AccessPointTag":{"attributes":{},"description":"A tag is a key-value pair attached to a file system. Allowed characters in the `Key` and `Value` properties are letters, white space, and numbers that can be represented in UTF-8, and the following characters: `+ - = . _ : /`","properties":{"Key":"The tag key (String). The key can\'t start with `aws:` .","Value":"The value of the tag key."}},"AWS::EFS::AccessPoint.CreationInfo":{"attributes":{},"description":"Required if the `RootDirectory` > `Path` specified does not exist. Specifies the POSIX IDs and permissions to apply to the access point\'s `RootDirectory` > `Path` . If the access point root directory does not exist, EFS creates it with these settings when a client connects to the access point. When specifying `CreationInfo` , you must include values for all properties.\\n\\nAmazon EFS creates a root directory only if you have provided the CreationInfo: OwnUid, OwnGID, and permissions for the directory. If you do not provide this information, Amazon EFS does not create the root directory. If the root directory does not exist, attempts to mount using the access point will fail.\\n\\n> If you do not provide `CreationInfo` and the specified `RootDirectory` does not exist, attempts to mount the file system using the access point will fail.","properties":{"OwnerGid":"Specifies the POSIX group ID to apply to the `RootDirectory` . Accepts values from 0 to 2^32 (4294967295).","OwnerUid":"Specifies the POSIX user ID to apply to the `RootDirectory` . Accepts values from 0 to 2^32 (4294967295).","Permissions":"Specifies the POSIX permissions to apply to the `RootDirectory` , in the format of an octal number representing the file\'s mode bits."}},"AWS::EFS::AccessPoint.PosixUser":{"attributes":{},"description":"The full POSIX identity, including the user ID, group ID, and any secondary group IDs, on the access point that is used for all file system operations performed by NFS clients using the access point.","properties":{"Gid":"The POSIX group ID used for all file system operations using this access point.","SecondaryGids":"Secondary POSIX group IDs used for all file system operations using this access point.","Uid":"The POSIX user ID used for all file system operations using this access point."}},"AWS::EFS::AccessPoint.RootDirectory":{"attributes":{},"description":"Specifies the directory on the Amazon EFS file system that the access point provides access to. The access point exposes the specified file system path as the root directory of your file system to applications using the access point. NFS clients using the access point can only access data in the access point\'s `RootDirectory` and it\'s subdirectories.","properties":{"CreationInfo":"(Optional) Specifies the POSIX IDs and permissions to apply to the access point\'s `RootDirectory` . If the `RootDirectory` > `Path` specified does not exist, EFS creates the root directory using the `CreationInfo` settings when a client connects to an access point. When specifying the `CreationInfo` , you must provide values for all properties.\\n\\n> If you do not provide `CreationInfo` and the specified `RootDirectory` > `Path` does not exist, attempts to mount the file system using the access point will fail.","Path":"Specifies the path on the EFS file system to expose as the root directory to NFS clients using the access point to access the EFS file system. A path can have up to four subdirectories. If the specified path does not exist, you are required to provide the `CreationInfo` ."}},"AWS::EFS::FileSystem":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the EFS file system.\\n\\nExample: `arn:aws:elasticfilesystem:us-west-2:1111333322228888:file-system/fs-0123456789abcdef8`","FileSystemId":"The ID of the EFS file system. For example: `fs-abcdef0123456789a`","Ref":"`Ref` returns the FileSystem ID. For example:\\n\\n`{\\"Ref\\":\\"logical_file_system_id\\"}`\\n\\nreturns `fs-0123456789abcdef2` ."},"description":"The `AWS::EFS::FileSystem` resource creates a new, empty file system in Amazon Elastic File System ( Amazon EFS ). You must create a mount target ( [AWS::EFS::MountTarget](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-mounttarget.html) ) to mount your EFS file system on an Amazon EC2 or other AWS cloud compute resource.","properties":{"AvailabilityZoneName":"Used to create a file system that uses One Zone storage classes. It specifies the AWS Availability Zone in which to create the file system. Use the format `us-east-1a` to specify the Availability Zone. For more information about One Zone storage classes, see [Using EFS storage classes](https://docs.aws.amazon.com/efs/latest/ug/storage-classes.html) in the *Amazon EFS User Guide* .\\n\\n> One Zone storage classes are not available in all Availability Zones in AWS Regions where Amazon EFS is available.","BackupPolicy":"Use the `BackupPolicy` to turn automatic backups on or off for the file system.","BypassPolicyLockoutSafetyCheck":"(Optional) A boolean that specifies whether or not to bypass the `FileSystemPolicy` lockout safety check. The lockout safety check determines whether the policy in the request will lock out, or prevent, the IAM principal that is making the request from making future `PutFileSystemPolicy` requests on this file system. Set `BypassPolicyLockoutSafetyCheck` to `True` only when you intend to prevent the IAM principal that is making the request from making subsequent `PutFileSystemPolicy` requests on this file system. The default value is `False` .","Encrypted":"A Boolean value that, if true, creates an encrypted file system. When creating an encrypted file system, you have the option of specifying a KmsKeyId for an existing AWS KMS key . If you don\'t specify a KMS key , then the default KMS key for Amazon EFS , `/aws/elasticfilesystem` , is used to protect the encrypted file system.","FileSystemPolicy":"The `FileSystemPolicy` for the EFS file system. A file system policy is an IAM resource policy used to control NFS access to an EFS file system. For more information, see [Using IAM to control NFS access to Amazon EFS](https://docs.aws.amazon.com/efs/latest/ug/iam-access-control-nfs-efs.html) in the *Amazon EFS User Guide* .","FileSystemTags":"Use to create one or more tags associated with the file system. Each tag is a user-defined key-value pair. Name your file system on creation by including a `\\"Key\\":\\"Name\\",\\"Value\\":\\"{value}\\"` key-value pair. Each key must be unique. For more information, see [Tagging AWS resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) in the *AWS General Reference Guide* .","KmsKeyId":"The ID of the AWS KMS key to be used to protect the encrypted file system. This parameter is only required if you want to use a nondefault KMS key . If this parameter is not specified, the default KMS key for Amazon EFS is used. This ID can be in one of the following formats:\\n\\n- Key ID - A unique identifier of the key, for example `1234abcd-12ab-34cd-56ef-1234567890ab` .\\n- ARN - An Amazon Resource Name (ARN) for the key, for example `arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab` .\\n- Key alias - A previously created display name for a key, for example `alias/projectKey1` .\\n- Key alias ARN - An ARN for a key alias, for example `arn:aws:kms:us-west-2:444455556666:alias/projectKey1` .\\n\\nIf `KmsKeyId` is specified, the `Encrypted` parameter must be set to true.","LifecyclePolicies":"An array of `LifecyclePolicy` objects that define the file system\'s `LifecycleConfiguration` object. A `LifecycleConfiguration` object informs EFS lifecycle management and intelligent tiering of the following:\\n\\n- When to move files in the file system from primary storage to the IA storage class.\\n- When to move files that are in IA storage to primary storage.\\n\\n> Amazon EFS requires that each `LifecyclePolicy` object have only a single transition. This means that in a request body, `LifecyclePolicies` needs to be structured as an array of `LifecyclePolicy` objects, one object for each transition, `TransitionToIA` , `TransitionToPrimaryStorageClass` . See the example requests in the following section for more information.","PerformanceMode":"The performance mode of the file system. We recommend `generalPurpose` performance mode for most file systems. File systems using the `maxIO` performance mode can scale to higher levels of aggregate throughput and operations per second with a tradeoff of slightly higher latencies for most file operations. The performance mode can\'t be changed after the file system has been created.\\n\\n> The `maxIO` mode is not supported on file systems using One Zone storage classes. \\n\\nDefault is `generalPurpose` .","ProvisionedThroughputInMibps":"The throughput, measured in mebibytes per second (MiBps), that you want to provision for a file system that you\'re creating. Required if `ThroughputMode` is set to `provisioned` . Valid values are 1-3414 MiBps, with the upper limit depending on Region. To increase this limit, contact AWS Support . For more information, see [Amazon EFS quotas that you can increase](https://docs.aws.amazon.com/efs/latest/ug/limits.html#soft-limits) in the *Amazon EFS User Guide* .","ThroughputMode":"Specifies the throughput mode for the file system. The mode can be `bursting` , `provisioned` , or `elastic` . If you set `ThroughputMode` to `provisioned` , you must also set a value for `ProvisionedThroughputInMibps` . After you create the file system, you can decrease your file system\'s throughput in Provisioned Throughput mode or change between the throughput modes, with certain time restrictions. For more information, see [Specifying throughput with provisioned mode](https://docs.aws.amazon.com/efs/latest/ug/performance.html#provisioned-throughput) in the *Amazon EFS User Guide* .\\n\\nDefault is `elastic` ."}},"AWS::EFS::FileSystem.BackupPolicy":{"attributes":{},"description":"The backup policy turns automatic backups for the file system on or off.","properties":{"Status":"Set the backup policy status for the file system.\\n\\n- *`ENABLED`* - Turns automatic backups on for the file system.\\n- *`DISABLED`* - Turns automatic backups off for the file system."}},"AWS::EFS::FileSystem.ElasticFileSystemTag":{"attributes":{},"description":"A tag is a key-value pair attached to a file system. Allowed characters in the `Key` and `Value` properties are letters, white space, and numbers that can be represented in UTF-8, and the following characters: `+ - = . _ : /`","properties":{"Key":"The tag key (String). The key can\'t start with `aws:` .","Value":"The value of the tag key."}},"AWS::EFS::FileSystem.LifecyclePolicy":{"attributes":{},"description":"Describes a policy used by EFS lifecycle management and EFS Intelligent-Tiering that specifies when to transition files into and out of the file system\'s Infrequent Access (IA) storage class. For more information, see [EFS Intelligent‐Tiering and EFS Lifecycle Management](https://docs.aws.amazon.com/efs/latest/ug/lifecycle-management-efs.html) .\\n\\n> - Each `LifecyclePolicy` object can have only a single transition. This means that in a request body, `LifecyclePolicies` must be structured as an array of `LifecyclePolicy` objects, one object for each transition, `TransitionToIA` , `TransitionToPrimaryStorageClass` .\\n> - See the AWS::EFS::FileSystem examples for the correct `LifecyclePolicy` structure. Do not use the syntax shown on this page.","properties":{"TransitionToIA":"Describes the period of time that a file is not accessed, after which it transitions to IA storage. Metadata operations such as listing the contents of a directory don\'t count as file access events.","TransitionToPrimaryStorageClass":"Describes when to transition a file from IA storage to primary storage. Metadata operations such as listing the contents of a directory don\'t count as file access events."}},"AWS::EFS::MountTarget":{"attributes":{"Id":"The ID of the Amazon EFS file system that the mount target provides access to.\\n\\nExample: `fs-0123456789111222a`","IpAddress":"The IPv4 address of the mount target.\\n\\nExample: 192.0.2.0","Ref":"`Ref` returns the MountTarget ID. For example:\\n\\n`{\\"Ref\\":\\"logical_mount_target_id\\"}` returns\\n\\n`fsmt-0123456789abcdef8` ."},"description":"The `AWS::EFS::MountTarget` resource is an Amazon EFS resource that creates a mount target for an EFS file system. You can then mount the file system on Amazon EC2 instances or other resources by using the mount target.","properties":{"FileSystemId":"The ID of the file system for which to create the mount target.","IpAddress":"Valid IPv4 address within the address range of the specified subnet.","SecurityGroups":"Up to five VPC security group IDs, of the form `sg-xxxxxxxx` . These must be for the same VPC as subnet specified.","SubnetId":"The ID of the subnet to add the mount target in. For file systems that use One Zone storage classes, use the subnet that is associated with the file system\'s Availability Zone."}},"AWS::EKS::Addon":{"attributes":{"Arn":"The ARN of the add-on, such as `arn:aws:eks:us-west-2:111122223333:addon/1-19/vpc-cni/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` .","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"vpc-cni\\" }`\\n\\nFor the add-on `vpc-cni` , `Ref` returns the name of the add-on. For example, `cluster-name|vpc-cni` ."},"description":"Creates an Amazon EKS add-on.\\n\\nAmazon EKS add-ons help to automate the provisioning and lifecycle management of common operational software for Amazon EKS clusters. For more information, see [Amazon EKS add-ons](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html) in the *Amazon EKS User Guide* .","properties":{"AddonName":"The name of the add-on.","AddonVersion":"The version of the add-on.","ClusterName":"The name of the cluster.","ConfigurationValues":"The configuration values that you provided.","PreserveOnDelete":"Specifying this option preserves the add-on software on your cluster but Amazon EKS stops managing any settings for the add-on. If an IAM account is associated with the add-on, it isn\'t removed.","ResolveConflicts":"How to resolve field value conflicts for an Amazon EKS add-on. Conflicts are handled based on the value you choose:\\n\\n- *None* – If the self-managed version of the add-on is installed on your cluster, Amazon EKS doesn\'t change the value. Creation of the add-on might fail.\\n- *Overwrite* – If the self-managed version of the add-on is installed on your cluster and the Amazon EKS default value is different than the existing value, Amazon EKS changes the value to the Amazon EKS default value.\\n- *Preserve* – This is similar to the NONE option. If the self-managed version of the add-on is installed on your cluster Amazon EKS doesn\'t change the add-on resource properties. Creation of the add-on might fail if conflicts are detected. This option works differently during the update operation. For more information, see [UpdateAddon](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateAddon.html) .\\n\\nIf you don\'t currently have the self-managed version of the add-on installed on your cluster, the Amazon EKS add-on is installed. Amazon EKS sets all values to default values, regardless of the option that you specify.","ServiceAccountRoleArn":"The Amazon Resource Name (ARN) of an existing IAM role to bind to the add-on\'s service account. The role must be assigned the IAM permissions required by the add-on. If you don\'t specify an existing IAM role, then the add-on uses the permissions assigned to the node IAM role. For more information, see [Amazon EKS node IAM role](https://docs.aws.amazon.com/eks/latest/userguide/create-node-role.html) in the *Amazon EKS User Guide* .\\n\\n> To specify an existing IAM role, you must have an IAM OpenID Connect (OIDC) provider created for your cluster. For more information, see [Enabling IAM roles for service accounts on your cluster](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html) in the *Amazon EKS User Guide* .","Tags":"The metadata that you apply to the add-on to assist with categorization and organization. Each tag consists of a key and an optional value, both of which you define. Add-on tags do not propagate to any other resources associated with the cluster."}},"AWS::EKS::Cluster":{"attributes":{"Arn":"The ARN of the cluster, such as `arn:aws:eks:us-west-2:666666666666:cluster/prod` .","CertificateAuthorityData":"The `certificate-authority-data` for your cluster.","ClusterSecurityGroupId":"The cluster security group that was created by Amazon EKS for the cluster. Managed node groups use this security group for control plane to data plane communication.\\n\\nThis parameter is only returned by Amazon EKS clusters that support managed node groups. For more information, see [Managed node groups](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html) in the *Amazon EKS User Guide* .","EncryptionConfigKeyArn":"Amazon Resource Name (ARN) or alias of the customer master key (CMK).","Endpoint":"The endpoint for your Kubernetes API server, such as `https://5E1D0CEXAMPLEA591B746AFC5AB30262.yl4.us-west-2.eks.amazonaws.com` .","Id":"The ID of your local Amazon EKS cluster on an AWS Outpost. This property isn\'t available for an Amazon EKS cluster on the AWS cloud.","KubernetesNetworkConfig.ServiceIpv6Cidr":"The CIDR block that Kubernetes Service IP addresses are assigned from if you created a `1.21` or later cluster with version `>1.10.1` or later of the Amazon VPC CNI add-on and specified `ipv6` for *ipFamily* when you created the cluster. Kubernetes assigns Service addresses from the unique local address range ( `fc00::/7` ) because you can\'t specify a custom `IPv6` CIDR block when you create the cluster.","OpenIdConnectIssuerUrl":"The issuer URL for the OIDC identity provider.","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myCluster\\" }`\\n\\nFor the Amazon EKS cluster `myCluster` , `Ref` returns the name of the cluster."},"description":"Creates an Amazon EKS control plane.\\n\\nThe Amazon EKS control plane consists of control plane instances that run the Kubernetes software, such as `etcd` and the API server. The control plane runs in an account managed by AWS , and the Kubernetes API is exposed by the Amazon EKS API server endpoint. Each Amazon EKS cluster control plane is single tenant and unique. It runs on its own set of Amazon EC2 instances.\\n\\nThe cluster control plane is provisioned across multiple Availability Zones and fronted by an Elastic Load Balancing Network Load Balancer. Amazon EKS also provisions elastic network interfaces in your VPC subnets to provide connectivity from the control plane instances to the nodes (for example, to support `kubectl exec` , `logs` , and `proxy` data flows).\\n\\nAmazon EKS nodes run in your AWS account and connect to your cluster\'s control plane over the Kubernetes API server endpoint and a certificate file that is created for your cluster.\\n\\nIn most cases, it takes several minutes to create a cluster. After you create an Amazon EKS cluster, you must configure your Kubernetes tooling to communicate with the API server and launch nodes into your cluster. For more information, see [Managing Cluster Authentication](https://docs.aws.amazon.com/eks/latest/userguide/managing-auth.html) and [Launching Amazon EKS nodes](https://docs.aws.amazon.com/eks/latest/userguide/launch-workers.html) in the *Amazon EKS User Guide* .","properties":{"EncryptionConfig":"The encryption configuration for the cluster.","KubernetesNetworkConfig":"The Kubernetes network configuration for the cluster.","Logging":"The logging configuration for your cluster.","Name":"The unique name to give to your cluster.","OutpostConfig":"An object representing the configuration of your local Amazon EKS cluster on an AWS Outpost. This object isn\'t available for clusters on the AWS cloud.","ResourcesVpcConfig":"The VPC configuration that\'s used by the cluster control plane. Amazon EKS VPC resources have specific requirements to work properly with Kubernetes. For more information, see [Cluster VPC Considerations](https://docs.aws.amazon.com/eks/latest/userguide/network_reqs.html) and [Cluster Security Group Considerations](https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html) in the *Amazon EKS User Guide* . You must specify at least two subnets. You can specify up to five security groups, but we recommend that you use a dedicated security group for your cluster control plane.\\n\\n> Updates require replacement of the `SecurityGroupIds` and `SubnetIds` sub-properties.","RoleArn":"The Amazon Resource Name (ARN) of the IAM role that provides permissions for the Kubernetes control plane to make calls to AWS API operations on your behalf. For more information, see [Amazon EKS Service IAM Role](https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html) in the **Amazon EKS User Guide** .","Tags":"The metadata that you apply to the cluster to assist with categorization and organization. Each tag consists of a key and an optional value, both of which you define. Cluster tags don\'t propagate to any other resources associated with the cluster.\\n\\n> You must have the `eks:TagResource` and `eks:UntagResource` permissions for your [IAM principal](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html) to manage the AWS CloudFormation stack. If you don\'t have these permissions, there might be unexpected behavior with stack-level tags propagating to the resource during resource creation and update.","Version":"The desired Kubernetes version for your cluster. If you don\'t specify a value here, the default version available in Amazon EKS is used.\\n\\n> The default version might not be the latest version available."}},"AWS::EKS::Cluster.ClusterLogging":{"attributes":{},"description":"The cluster control plane logging configuration for your cluster.\\n\\n> When updating a resource, you must include this `ClusterLogging` property if the previous CloudFormation template of the resource had it.","properties":{"EnabledTypes":"The enabled control plane logs for your cluster. All log types are disabled if the array is empty.\\n\\n> When updating a resource, you must include this `EnabledTypes` property if the previous CloudFormation template of the resource had it."}},"AWS::EKS::Cluster.ControlPlanePlacement":{"attributes":{},"description":"The placement configuration for all the control plane instances of your local Amazon EKS cluster on an AWS Outpost. For more information, see [Capacity considerations](https://docs.aws.amazon.com/eks/latest/userguide/eks-outposts-capacity-considerations.html) in the Amazon EKS User Guide.","properties":{"GroupName":"The name of the placement group for the Kubernetes control plane instances."}},"AWS::EKS::Cluster.EncryptionConfig":{"attributes":{},"description":"The encryption configuration for the cluster.","properties":{"Provider":"The encryption provider for the cluster.","Resources":"Specifies the resources to be encrypted. The only supported value is \\"secrets\\"."}},"AWS::EKS::Cluster.KubernetesNetworkConfig":{"attributes":{},"description":"The Kubernetes network configuration for the cluster.","properties":{"IpFamily":"Specify which IP family is used to assign Kubernetes pod and service IP addresses. If you don\'t specify a value, `ipv4` is used by default. You can only specify an IP family when you create a cluster and can\'t change this value once the cluster is created. If you specify `ipv6` , the VPC and subnets that you specify for cluster creation must have both `IPv4` and `IPv6` CIDR blocks assigned to them. You can\'t specify `ipv6` for clusters in China Regions.\\n\\nYou can only specify `ipv6` for `1.21` and later clusters that use version `1.10.1` or later of the Amazon VPC CNI add-on. If you specify `ipv6` , then ensure that your VPC meets the requirements listed in the considerations listed in [Assigning IPv6 addresses to pods and services](https://docs.aws.amazon.com/eks/latest/userguide/cni-ipv6.html) in the Amazon EKS User Guide. Kubernetes assigns services `IPv6` addresses from the unique local address range `(fc00::/7)` . You can\'t specify a custom `IPv6` CIDR block. Pod addresses are assigned from the subnet\'s `IPv6` CIDR.","ServiceIpv4Cidr":"Don\'t specify a value if you select `ipv6` for *ipFamily* . The CIDR block to assign Kubernetes service IP addresses from. If you don\'t specify a block, Kubernetes assigns addresses from either the `10.100.0.0/16` or `172.20.0.0/16` CIDR blocks. We recommend that you specify a block that does not overlap with resources in other networks that are peered or connected to your VPC. The block must meet the following requirements:\\n\\n- Within one of the following private IP address blocks: `10.0.0.0/8` , `172.16.0.0/12` , or `192.168.0.0/16` .\\n- Doesn\'t overlap with any CIDR block assigned to the VPC that you selected for VPC.\\n- Between /24 and /12.\\n\\n> You can only specify a custom CIDR block when you create a cluster and can\'t change this value once the cluster is created.","ServiceIpv6Cidr":"The CIDR block that Kubernetes pod and service IP addresses are assigned from if you created a 1.21 or later cluster with version 1.10.1 or later of the Amazon VPC CNI add-on and specified `ipv6` for *ipFamily* when you created the cluster. Kubernetes assigns service addresses from the unique local address range ( `fc00::/7` ) because you can\'t specify a custom IPv6 CIDR block when you create the cluster."}},"AWS::EKS::Cluster.Logging":{"attributes":{},"description":"Enable or disable exporting the Kubernetes control plane logs for your cluster to CloudWatch Logs. By default, cluster control plane logs aren\'t exported to CloudWatch Logs. For more information, see [Amazon EKS Cluster control plane logs](https://docs.aws.amazon.com/eks/latest/userguide/control-plane-logs.html) in the **Amazon EKS User Guide** .\\n\\n> When updating a resource, you must include this `Logging` property if the previous CloudFormation template of the resource had it. > CloudWatch Logs ingestion, archive storage, and data scanning rates apply to exported control plane logs. For more information, see [CloudWatch Pricing](https://docs.aws.amazon.com/cloudwatch/pricing/) .","properties":{"ClusterLogging":"The cluster control plane logging configuration for your cluster."}},"AWS::EKS::Cluster.LoggingTypeConfig":{"attributes":{},"description":"The enabled logging type. For a list of the valid logging types, see the [`types` property of `LogSetup`](https://docs.aws.amazon.com/eks/latest/APIReference/API_LogSetup.html#AmazonEKS-Type-LogSetup-types) in the *Amazon EKS API Reference* .","properties":{"Type":"The name of the log type."}},"AWS::EKS::Cluster.OutpostConfig":{"attributes":{},"description":"The configuration of your local Amazon EKS cluster on an AWS Outpost. Before creating a cluster on an Outpost, review [Creating a local cluster on an Outpost](https://docs.aws.amazon.com/eks/latest/userguide/eks-outposts-local-cluster-create.html) in the *Amazon EKS User Guide* . This API isn\'t available for Amazon EKS clusters on the AWS cloud.","properties":{"ControlPlaneInstanceType":"The Amazon EC2 instance type that you want to use for your local Amazon EKS cluster on Outposts. Choose an instance type based on the number of nodes that your cluster will have. For more information, see [Capacity considerations](https://docs.aws.amazon.com/eks/latest/userguide/eks-outposts-capacity-considerations.html) in the *Amazon EKS User Guide* .\\n\\nThe instance type that you specify is used for all Kubernetes control plane instances. The instance type can\'t be changed after cluster creation. The control plane is not automatically scaled by Amazon EKS.","ControlPlanePlacement":"An object representing the placement configuration for all the control plane instances of your local Amazon EKS cluster on an AWS Outpost. For more information, see [Capacity considerations](https://docs.aws.amazon.com/eks/latest/userguide/eks-outposts-capacity-considerations.html) in the *Amazon EKS User Guide* .","OutpostArns":"The ARN of the Outpost that you want to use for your local Amazon EKS cluster on Outposts. Only a single Outpost ARN is supported."}},"AWS::EKS::Cluster.Provider":{"attributes":{},"description":"Identifies the AWS Key Management Service ( AWS KMS ) key used to encrypt the secrets.","properties":{"KeyArn":"Amazon Resource Name (ARN) or alias of the KMS key. The KMS key must be symmetric and created in the same AWS Region as the cluster. If the KMS key was created in a different account, the [IAM principal](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html) must have access to the KMS key. For more information, see [Allowing users in other accounts to use a KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html) in the *AWS Key Management Service Developer Guide* ."}},"AWS::EKS::Cluster.ResourcesVpcConfig":{"attributes":{},"description":"An object representing the VPC configuration to use for an Amazon EKS cluster.\\n\\n> When updating a resource, you must include these properties if the previous CloudFormation template of the resource had them:\\n> \\n> - `EndpointPublicAccess`\\n> - `EndpointPrivateAccess`\\n> - `PublicAccessCidrs`","properties":{"EndpointPrivateAccess":"Set this value to `true` to enable private access for your cluster\'s Kubernetes API server endpoint. If you enable private access, Kubernetes API requests from within your cluster\'s VPC use the private VPC endpoint. The default value for this parameter is `false` , which disables private access for your Kubernetes API server. If you disable private access and you have nodes or AWS Fargate pods in the cluster, then ensure that `publicAccessCidrs` includes the necessary CIDR blocks for communication with the nodes or Fargate pods. For more information, see [Amazon EKS cluster endpoint access control](https://docs.aws.amazon.com/eks/latest/userguide/cluster-endpoint.html) in the **Amazon EKS User Guide** .","EndpointPublicAccess":"Set this value to `false` to disable public access to your cluster\'s Kubernetes API server endpoint. If you disable public access, your cluster\'s Kubernetes API server can only receive requests from within the cluster VPC. The default value for this parameter is `true` , which enables public access for your Kubernetes API server. For more information, see [Amazon EKS cluster endpoint access control](https://docs.aws.amazon.com/eks/latest/userguide/cluster-endpoint.html) in the **Amazon EKS User Guide** .","PublicAccessCidrs":"The CIDR blocks that are allowed access to your cluster\'s public Kubernetes API server endpoint. Communication to the endpoint from addresses outside of the CIDR blocks that you specify is denied. The default value is `0.0.0.0/0` . If you\'ve disabled private endpoint access and you have nodes or AWS Fargate pods in the cluster, then ensure that you specify the necessary CIDR blocks. For more information, see [Amazon EKS cluster endpoint access control](https://docs.aws.amazon.com/eks/latest/userguide/cluster-endpoint.html) in the **Amazon EKS User Guide** .","SecurityGroupIds":"Specify one or more security groups for the cross-account elastic network interfaces that Amazon EKS creates to use that allow communication between your nodes and the Kubernetes control plane. If you don\'t specify any security groups, then familiarize yourself with the difference between Amazon EKS defaults for clusters deployed with Kubernetes. For more information, see [Amazon EKS security group considerations](https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html) in the **Amazon EKS User Guide** .","SubnetIds":"Specify subnets for your Amazon EKS nodes. Amazon EKS creates cross-account elastic network interfaces in these subnets to allow communication between your nodes and the Kubernetes control plane."}},"AWS::EKS::FargateProfile":{"attributes":{"Arn":"The ARN of the cluster, such as `arn:aws:eks:us-west-2:666666666666:fargateprofile/myCluster/myFargateProfile/1cb1a11a-1dc1-1d11-cf11-1111f11fa111` .","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myFargateProfile\\" }`\\n\\nFor the Fargate profile `myFargateProfile` , Ref returns the physical resource ID of the Fargate profile. For example, `/` ."},"description":"Creates an AWS Fargate profile for your Amazon EKS cluster. You must have at least one Fargate profile in a cluster to be able to run pods on Fargate.\\n\\nThe Fargate profile allows an administrator to declare which pods run on Fargate and specify which pods run on which Fargate profile. This declaration is done through the profile’s selectors. Each profile can have up to five selectors that contain a namespace and labels. A namespace is required for every selector. The label field consists of multiple optional key-value pairs. Pods that match the selectors are scheduled on Fargate. If a to-be-scheduled pod matches any of the selectors in the Fargate profile, then that pod is run on Fargate.\\n\\nWhen you create a Fargate profile, you must specify a pod execution role to use with the pods that are scheduled with the profile. This role is added to the cluster\'s Kubernetes [Role Based Access Control](https://docs.aws.amazon.com/https://kubernetes.io/docs/reference/access-authn-authz/rbac/) (RBAC) for authorization so that the `kubelet` that is running on the Fargate infrastructure can register with your Amazon EKS cluster so that it can appear in your cluster as a node. The pod execution role also provides IAM permissions to the Fargate infrastructure to allow read access to Amazon ECR image repositories. For more information, see [Pod Execution Role](https://docs.aws.amazon.com/eks/latest/userguide/pod-execution-role.html) in the *Amazon EKS User Guide* .\\n\\nFargate profiles are immutable. However, you can create a new updated profile to replace an existing profile and then delete the original after the updated profile has finished creating.\\n\\nIf any Fargate profiles in a cluster are in the `DELETING` status, you must wait for that Fargate profile to finish deleting before you can create any other profiles in that cluster.\\n\\nFor more information, see [AWS Fargate Profile](https://docs.aws.amazon.com/eks/latest/userguide/fargate-profile.html) in the *Amazon EKS User Guide* .","properties":{"ClusterName":"The name of the Amazon EKS cluster to apply the Fargate profile to.","FargateProfileName":"The name of the Fargate profile.","PodExecutionRoleArn":"The Amazon Resource Name (ARN) of the pod execution role to use for pods that match the selectors in the Fargate profile. The pod execution role allows Fargate infrastructure to register with your cluster as a node, and it provides read access to Amazon ECR image repositories. For more information, see [Pod Execution Role](https://docs.aws.amazon.com/eks/latest/userguide/pod-execution-role.html) in the *Amazon EKS User Guide* .","Selectors":"The selectors to match for pods to use this Fargate profile. Each selector must have an associated namespace. Optionally, you can also specify labels for a namespace. You may specify up to five selectors in a Fargate profile.","Subnets":"The IDs of subnets to launch your pods into. At this time, pods running on Fargate are not assigned public IP addresses, so only private subnets (with no direct route to an Internet Gateway) are accepted for this parameter.","Tags":"The metadata to apply to the Fargate profile to assist with categorization and organization. Each tag consists of a key and an optional value. You define both. Fargate profile tags do not propagate to any other resources associated with the Fargate profile, such as the pods that are scheduled with it."}},"AWS::EKS::FargateProfile.Label":{"attributes":{},"description":"A key-value pair.","properties":{"Key":"Enter a key.","Value":"Enter a value."}},"AWS::EKS::FargateProfile.Selector":{"attributes":{},"description":"An object representing an AWS Fargate profile selector.","properties":{"Labels":"The Kubernetes labels that the selector should match. A pod must contain all of the labels that are specified in the selector for it to be considered a match.","Namespace":"The Kubernetes namespace that the selector should match."}},"AWS::EKS::IdentityProviderConfig":{"attributes":{"IdentityProviderConfigArn":"The Amazon Resource Name (ARN) associated with the identity provider config.","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myIdentityProviderConfig\\" }`\\n\\nFor the IdentityProviderConfig, Ref returns the physical resource ID of the config. For example, `cluster-name/oidc/identity-provider-config-name` ."},"description":"Associate an identity provider configuration to a cluster.\\n\\nIf you want to authenticate identities using an identity provider, you can create an identity provider configuration and associate it to your cluster. After configuring authentication to your cluster you can create Kubernetes `roles` and `clusterroles` to assign permissions to the roles, and then bind the roles to the identities using Kubernetes `rolebindings` and `clusterrolebindings` . For more information see [Using RBAC Authorization](https://docs.aws.amazon.com/https://kubernetes.io/docs/reference/access-authn-authz/rbac/) in the Kubernetes documentation.","properties":{"ClusterName":"The cluster that the configuration is associated to.","IdentityProviderConfigName":"The name of the configuration.","Oidc":"An object representing an OpenID Connect (OIDC) identity provider configuration.","Tags":"The metadata to apply to the provider configuration to assist with categorization and organization. Each tag consists of a key and an optional value. You define both.","Type":"The type of the identity provider configuration. The only type available is `oidc` ."}},"AWS::EKS::IdentityProviderConfig.OidcIdentityProviderConfig":{"attributes":{},"description":"An object representing the configuration for an OpenID Connect (OIDC) identity provider.","properties":{"ClientId":"This is also known as *audience* . The ID of the client application that makes authentication requests to the OIDC identity provider.","GroupsClaim":"The JSON web token (JWT) claim that the provider uses to return your groups.","GroupsPrefix":"The prefix that is prepended to group claims to prevent clashes with existing names (such as `system:` groups). For example, the value `oidc:` creates group names like `oidc:engineering` and `oidc:infra` . The prefix can\'t contain `system:`","IssuerUrl":"The URL of the OIDC identity provider that allows the API server to discover public signing keys for verifying tokens.","RequiredClaims":"The key-value pairs that describe required claims in the identity token. If set, each claim is verified to be present in the token with a matching value.","UsernameClaim":"The JSON Web token (JWT) claim that is used as the username.","UsernamePrefix":"The prefix that is prepended to username claims to prevent clashes with existing names. The prefix can\'t contain `system:`"}},"AWS::EKS::IdentityProviderConfig.RequiredClaim":{"attributes":{},"description":"A key-value pair that describes a required claim in the identity token. If set, each claim is verified to be present in the token with a matching value.","properties":{"Key":"The key to match from the token.","Value":"The value for the key from the token."}},"AWS::EKS::Nodegroup":{"attributes":{"Arn":"The Amazon Resource Name (ARN) associated with the managed node group.","ClusterName":"The name of the cluster that the managed node group resides in.","Id":"","NodegroupName":"The name associated with an Amazon EKS managed node group.","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myNodegroup\\" }`\\n\\nFor the Amazon EKS node group `myNodegroup` , Ref returns the physical resource ID of the node group. For example, `cluster-name/nodegroup_name` ."},"description":"Creates a managed node group for an Amazon EKS cluster. You can only create a node group for your cluster that is equal to the current Kubernetes version for the cluster.\\n\\nAn Amazon EKS managed node group is an Amazon EC2 Auto Scaling group and associated Amazon EC2 instances that are managed by AWS for an Amazon EKS cluster. For more information, see [Managed node groups](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html) in the *Amazon EKS User Guide* .\\n\\n> Windows AMI types are only supported for commercial Regions that support Windows Amazon EKS.","properties":{"AmiType":"The AMI type for your node group. If you specify `launchTemplate` , and your launch template uses a custom AMI, then don\'t specify `amiType` , or the node group deployment will fail. If your launch template uses a Windows custom AMI, then add `eks:kube-proxy-windows` to your Windows nodes `rolearn` in the `aws-auth` `ConfigMap` . For more information about using launch templates with Amazon EKS, see [Launch template support](https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html) in the *Amazon EKS User Guide* .","CapacityType":"The capacity type of your managed node group.","ClusterName":"The name of the cluster to create the node group in.","DiskSize":"The root device disk size (in GiB) for your node group instances. The default disk size is 20 GiB for Linux and Bottlerocket. The default disk size is 50 GiB for Windows. If you specify `launchTemplate` , then don\'t specify `diskSize` , or the node group deployment will fail. For more information about using launch templates with Amazon EKS, see [Launch template support](https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html) in the *Amazon EKS User Guide* .","ForceUpdateEnabled":"Force the update if the existing node group\'s pods are unable to be drained due to a pod disruption budget issue. If an update fails because pods could not be drained, you can force the update after it fails to terminate the old node whether or not any pods are running on the node.","InstanceTypes":"Specify the instance types for a node group. If you specify a GPU instance type, make sure to also specify an applicable GPU AMI type with the `amiType` parameter. If you specify `launchTemplate` , then you can specify zero or one instance type in your launch template *or* you can specify 0-20 instance types for `instanceTypes` . If however, you specify an instance type in your launch template *and* specify any `instanceTypes` , the node group deployment will fail. If you don\'t specify an instance type in a launch template or for `instanceTypes` , then `t3.medium` is used, by default. If you specify `Spot` for `capacityType` , then we recommend specifying multiple values for `instanceTypes` . For more information, see [Managed node group capacity types](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html#managed-node-group-capacity-types) and [Launch template support](https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html) in the *Amazon EKS User Guide* .","Labels":"The Kubernetes labels applied to the nodes in the node group.\\n\\n> Only labels that are applied with the Amazon EKS API are shown here. There may be other Kubernetes labels applied to the nodes in this group.","LaunchTemplate":"An object representing a node group\'s launch template specification. If specified, then do not specify `instanceTypes` , `diskSize` , or `remoteAccess` and make sure that the launch template meets the requirements in `launchTemplateSpecification` .","NodeRole":"The Amazon Resource Name (ARN) of the IAM role to associate with your node group. The Amazon EKS worker node `kubelet` daemon makes calls to AWS APIs on your behalf. Nodes receive permissions for these API calls through an IAM instance profile and associated policies. Before you can launch nodes and register them into a cluster, you must create an IAM role for those nodes to use when they are launched. For more information, see [Amazon EKS node IAM role](https://docs.aws.amazon.com/eks/latest/userguide/create-node-role.html) in the **Amazon EKS User Guide** . If you specify `launchTemplate` , then don\'t specify [`IamInstanceProfile`](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_IamInstanceProfile.html) in your launch template, or the node group deployment will fail. For more information about using launch templates with Amazon EKS, see [Launch template support](https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html) in the *Amazon EKS User Guide* .","NodegroupName":"The unique name to give your node group.","ReleaseVersion":"The AMI version of the Amazon EKS optimized AMI to use with your node group (for example, `1.14.7- *YYYYMMDD*` ). By default, the latest available AMI version for the node group\'s current Kubernetes version is used. For more information, see [Amazon EKS optimized Linux AMI Versions](https://docs.aws.amazon.com/eks/latest/userguide/eks-linux-ami-versions.html) in the *Amazon EKS User Guide* .\\n\\n> Changing this value triggers an update of the node group if one is available. You can\'t update other properties at the same time as updating `Release Version` .","RemoteAccess":"The remote access configuration to use with your node group. For Linux, the protocol is SSH. For Windows, the protocol is RDP. If you specify `launchTemplate` , then don\'t specify `remoteAccess` , or the node group deployment will fail. For more information about using launch templates with Amazon EKS, see [Launch template support](https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html) in the *Amazon EKS User Guide* .","ScalingConfig":"The scaling configuration details for the Auto Scaling group that is created for your node group.","Subnets":"The subnets to use for the Auto Scaling group that is created for your node group. If you specify `launchTemplate` , then don\'t specify [`SubnetId`](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html) in your launch template, or the node group deployment will fail. For more information about using launch templates with Amazon EKS, see [Launch template support](https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html) in the *Amazon EKS User Guide* .","Tags":"The metadata applied to the node group to assist with categorization and organization. Each tag consists of a key and an optional value. You define both. Node group tags do not propagate to any other resources associated with the node group, such as the Amazon EC2 instances or subnets.","Taints":"The Kubernetes taints to be applied to the nodes in the node group when they are created. Effect is one of `No_Schedule` , `Prefer_No_Schedule` , or `No_Execute` . Kubernetes taints can be used together with tolerations to control how workloads are scheduled to your nodes. For more information, see [Node taints on managed node groups](https://docs.aws.amazon.com/eks/latest/userguide/node-taints-managed-node-groups.html) .","UpdateConfig":"The node group update configuration.","Version":"The Kubernetes version to use for your managed nodes. By default, the Kubernetes version of the cluster is used, and this is the only accepted specified value. If you specify `launchTemplate` , and your launch template uses a custom AMI, then don\'t specify `version` , or the node group deployment will fail. For more information about using launch templates with Amazon EKS, see [Launch template support](https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html) in the *Amazon EKS User Guide* .\\n\\n> You can\'t update other properties at the same time as updating `Version` ."}},"AWS::EKS::Nodegroup.LaunchTemplateSpecification":{"attributes":{},"description":"An object representing a node group launch template specification. The launch template can\'t include [`SubnetId`](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html) , [`IamInstanceProfile`](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_IamInstanceProfile.html) , [`RequestSpotInstances`](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotInstances.html) , [`HibernationOptions`](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_HibernationOptionsRequest.html) , or [`TerminateInstances`](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TerminateInstances.html) , or the node group deployment or update will fail. For more information about launch templates, see [`CreateLaunchTemplate`](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateLaunchTemplate.html) in the Amazon EC2 API Reference. For more information about using launch templates with Amazon EKS, see [Launch template support](https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html) in the *Amazon EKS User Guide* .\\n\\nYou must specify either the launch template ID or the launch template name in the request, but not both.","properties":{"Id":"The ID of the launch template.\\n\\nYou must specify either the launch template ID or the launch template name in the request, but not both.","Name":"The name of the launch template.\\n\\nYou must specify either the launch template name or the launch template ID in the request, but not both.","Version":"The version number of the launch template to use. If no version is specified, then the template\'s default version is used."}},"AWS::EKS::Nodegroup.RemoteAccess":{"attributes":{},"description":"An object representing the remote access configuration for the managed node group.","properties":{"Ec2SshKey":"The Amazon EC2 SSH key name that provides access for SSH communication with the nodes in the managed node group. For more information, see [Amazon EC2 key pairs and Linux instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html) in the *Amazon Elastic Compute Cloud User Guide for Linux Instances* . For Windows, an Amazon EC2 SSH key is used to obtain the RDP password. For more information, see [Amazon EC2 key pairs and Windows instances](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-key-pairs.html) in the *Amazon Elastic Compute Cloud User Guide for Windows Instances* .","SourceSecurityGroups":"The security group IDs that are allowed SSH access (port 22) to the nodes. For Windows, the port is 3389. If you specify an Amazon EC2 SSH key but don\'t specify a source security group when you create a managed node group, then the port on the nodes is opened to the internet ( `0.0.0.0/0` ). For more information, see [Security Groups for Your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) in the *Amazon Virtual Private Cloud User Guide* ."}},"AWS::EKS::Nodegroup.ScalingConfig":{"attributes":{},"description":"An object representing the scaling configuration details for the Auto Scaling group that is associated with your node group. When creating a node group, you must specify all or none of the properties. When updating a node group, you can specify any or none of the properties.","properties":{"DesiredSize":"The current number of nodes that the managed node group should maintain.\\n\\n> If you use Cluster Autoscaler, you shouldn\'t change the desiredSize value directly, as this can cause the Cluster Autoscaler to suddenly scale up or scale down. \\n\\nWhenever this parameter changes, the number of worker nodes in the node group is updated to the specified size. If this parameter is given a value that is smaller than the current number of running worker nodes, the necessary number of worker nodes are terminated to match the given value. When using CloudFormation, no action occurs if you remove this parameter from your CFN template.\\n\\nThis parameter can be different from minSize in some cases, such as when starting with extra hosts for testing. This parameter can also be different when you want to start with an estimated number of needed hosts, but let Cluster Autoscaler reduce the number if there are too many. When Cluster Autoscaler is used, the desiredSize parameter is altered by Cluster Autoscaler (but can be out-of-date for short periods of time). Cluster Autoscaler doesn\'t scale a managed node group lower than minSize or higher than maxSize.","MaxSize":"The maximum number of nodes that the managed node group can scale out to. For information about the maximum number that you can specify, see [Amazon EKS service quotas](https://docs.aws.amazon.com/eks/latest/userguide/service-quotas.html) in the *Amazon EKS User Guide* .","MinSize":"The minimum number of nodes that the managed node group can scale in to."}},"AWS::EKS::Nodegroup.Taint":{"attributes":{},"description":"A property that allows a node to repel a set of pods. For more information, see [Node taints on managed node groups](https://docs.aws.amazon.com/eks/latest/userguide/node-taints-managed-node-groups.html) .","properties":{"Effect":"The effect of the taint.","Key":"The key of the taint.","Value":"The value of the taint."}},"AWS::EKS::Nodegroup.UpdateConfig":{"attributes":{},"description":"The update configuration for the node group.","properties":{"MaxUnavailable":"The maximum number of nodes unavailable at once during a version update. Nodes will be updated in parallel. This value or `maxUnavailablePercentage` is required to have a value.The maximum number is 100.","MaxUnavailablePercentage":"The maximum percentage of nodes unavailable during a version update. This percentage of nodes will be updated in parallel, up to 100 nodes at once. This value or `maxUnavailable` is required to have a value."}},"AWS::EMR::Cluster":{"attributes":{"MasterPublicDNS":"The public DNS name of the master node (instance), such as `ec2-12-123-123-123.us-west-2.compute.amazonaws.com` .","Ref":"`Ref` returns returns the cluster ID, such as j-1ABCD123AB1A."},"description":"The `AWS::EMR::Cluster` resource specifies an Amazon EMR cluster. This cluster is a collection of Amazon EC2 instances that run open source big data frameworks and applications to process and analyze vast amounts of data. For more information, see the [Amazon EMR Management Guide](https://docs.aws.amazon.com//emr/latest/ManagementGuide/) .\\n\\nAmazon EMR now supports launching task instance groups and task instance fleets as part of the `AWS::EMR::Cluster` resource. This can be done by using the `JobFlowInstancesConfig` property type\'s `TaskInstanceGroups` and `TaskInstanceFleets` subproperties. Using these subproperties reduces delays in provisioning task nodes compared to specifying task nodes with the `AWS::EMR::InstanceGroupConfig` and `AWS::EMR::InstanceFleetConfig` resources. Please refer to the examples at the bottom of this page to learn how to use these subproperties.","properties":{"AdditionalInfo":"A JSON string for selecting additional features.","Applications":"The applications to install on this cluster, for example, Spark, Flink, Oozie, Zeppelin, and so on.","AutoScalingRole":"An IAM role for automatic scaling policies. The default role is `EMR_AutoScaling_DefaultRole` . The IAM role provides permissions that the automatic scaling feature requires to launch and terminate Amazon EC2 instances in an instance group.","AutoTerminationPolicy":"","BootstrapActions":"A list of bootstrap actions to run before Hadoop starts on the cluster nodes.","Configurations":"Applies only to Amazon EMR releases 4.x and later. The list of configurations that are supplied to the Amazon EMR cluster.","CustomAmiId":"Available only in Amazon EMR releases 5.7.0 and later. The ID of a custom Amazon EBS-backed Linux AMI if the cluster uses a custom AMI.","EbsRootVolumeSize":"The size, in GiB, of the Amazon EBS root device volume of the Linux AMI that is used for each Amazon EC2 instance. Available in Amazon EMR releases 4.x and later.","Instances":"A specification of the number and type of Amazon EC2 instances.","JobFlowRole":"Also called instance profile and Amazon EC2 role. An IAM role for an Amazon EMR cluster. The Amazon EC2 instances of the cluster assume this role. The default role is `EMR_EC2_DefaultRole` . In order to use the default role, you must have already created it using the AWS CLI or console.","KerberosAttributes":"Attributes for Kerberos configuration when Kerberos authentication is enabled using a security configuration. For more information see [Use Kerberos Authentication](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-kerberos.html) in the *Amazon EMR Management Guide* .","LogEncryptionKmsKeyId":"The AWS KMS key used for encrypting log files. This attribute is only available with Amazon EMR 5.30.0 and later, excluding Amazon EMR 6.0.0.","LogUri":"The path to the Amazon S3 location where logs for this cluster are stored.","ManagedScalingPolicy":"Creates or updates a managed scaling policy for an Amazon EMR cluster. The managed scaling policy defines the limits for resources, such as Amazon EC2 instances that can be added or terminated from a cluster. The policy only applies to the core and task nodes. The master node cannot be scaled after initial configuration.","Name":"The name of the cluster.","OSReleaseLabel":"","ReleaseLabel":"The Amazon EMR release label, which determines the version of open-source application packages installed on the cluster. Release labels are in the form `emr-x.x.x` , where x.x.x is an Amazon EMR release version such as `emr-5.14.0` . For more information about Amazon EMR release versions and included application versions and features, see [](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/) . The release label applies only to Amazon EMR releases version 4.0 and later. Earlier versions use `AmiVersion` .","ScaleDownBehavior":"The way that individual Amazon EC2 instances terminate when an automatic scale-in activity occurs or an instance group is resized. `TERMINATE_AT_INSTANCE_HOUR` indicates that Amazon EMR terminates nodes at the instance-hour boundary, regardless of when the request to terminate the instance was submitted. This option is only available with Amazon EMR 5.1.0 and later and is the default for clusters created using that version. `TERMINATE_AT_TASK_COMPLETION` indicates that Amazon EMR adds nodes to a deny list and drains tasks from nodes before terminating the Amazon EC2 instances, regardless of the instance-hour boundary. With either behavior, Amazon EMR removes the least active nodes first and blocks instance termination if it could lead to HDFS corruption. `TERMINATE_AT_TASK_COMPLETION` is available only in Amazon EMR releases 4.1.0 and later, and is the default for versions of Amazon EMR earlier than 5.1.0.","SecurityConfiguration":"The name of the security configuration applied to the cluster.","ServiceRole":"The IAM role that Amazon EMR assumes in order to access AWS resources on your behalf.","StepConcurrencyLevel":"Specifies the number of steps that can be executed concurrently. The default value is `1` . The maximum value is `256` .","Steps":"A list of steps to run.","Tags":"A list of tags associated with a cluster.","VisibleToAllUsers":"Indicates whether the cluster is visible to all IAM users of the AWS account associated with the cluster. If this value is set to `true` , all IAM users of that AWS account can view and manage the cluster if they have the proper policy permissions set. If this value is `false` , only the IAM user that created the cluster can view and manage it. This value can be changed using the SetVisibleToAllUsers action.\\n\\n> When you create clusters directly through the EMR console or API, this value is set to `true` by default. However, for `AWS::EMR::Cluster` resources in CloudFormation, the default is `false` ."}},"AWS::EMR::Cluster.Application":{"attributes":{},"description":"`Application` is a property of `AWS::EMR::Cluster` . The `Application` property type defines the open-source big data applications for EMR to install and configure when a cluster is created.\\n\\nWith Amazon EMR release version 4.0 and later, the only accepted parameter is the application `Name` . To pass arguments to these applications, you use configuration classifications specified using JSON objects in a `Configuration` property. For more information, see [Configuring Applications](https://docs.aws.amazon.com//emr/latest/ReleaseGuide/emr-configure-apps.html) .\\n\\nWith earlier Amazon EMR releases, the application is any AWS or third-party software that you can add to the cluster. You can specify the version of the application and arguments to pass to it. Amazon EMR accepts and forwards the argument list to the corresponding installation script as a bootstrap action argument.","properties":{"AdditionalInfo":"This option is for advanced users only. This is meta information about clusters and applications that are used for testing and troubleshooting.","Args":"Arguments for Amazon EMR to pass to the application.","Name":"The name of the application.","Version":"The version of the application."}},"AWS::EMR::Cluster.AutoScalingPolicy":{"attributes":{},"description":"`AutoScalingPolicy` is a subproperty of `InstanceGroupConfig` . `AutoScalingPolicy` defines how an instance group dynamically adds and terminates EC2 instances in response to the value of a CloudWatch metric. For more information, see [Using Automatic Scaling in Amazon EMR](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-automatic-scaling.html) in the *Amazon EMR Management Guide* .","properties":{"Constraints":"The upper and lower Amazon EC2 instance limits for an automatic scaling policy. Automatic scaling activity will not cause an instance group to grow above or below these limits.","Rules":"The scale-in and scale-out rules that comprise the automatic scaling policy."}},"AWS::EMR::Cluster.AutoTerminationPolicy":{"attributes":{},"description":"","properties":{"IdleTimeout":""}},"AWS::EMR::Cluster.BootstrapActionConfig":{"attributes":{},"description":"`BootstrapActionConfig` is a property of `AWS::EMR::Cluster` that can be used to run bootstrap actions on EMR clusters. You can use a bootstrap action to install software and configure EC2 instances for all cluster nodes before EMR installs and configures open-source big data applications on cluster instances. For more information, see [Create Bootstrap Actions to Install Additional Software](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-plan-bootstrap.html) in the *Amazon EMR Management Guide* .","properties":{"Name":"The name of the bootstrap action.","ScriptBootstrapAction":"The script run by the bootstrap action."}},"AWS::EMR::Cluster.CloudWatchAlarmDefinition":{"attributes":{},"description":"`CloudWatchAlarmDefinition` is a subproperty of the `ScalingTrigger` property, which determines when to trigger an automatic scaling activity. Scaling activity begins when you satisfy the defined alarm conditions.","properties":{"ComparisonOperator":"Determines how the metric specified by `MetricName` is compared to the value specified by `Threshold` .","Dimensions":"A CloudWatch metric dimension.","EvaluationPeriods":"The number of periods, in five-minute increments, during which the alarm condition must exist before the alarm triggers automatic scaling activity. The default value is `1` .","MetricName":"The name of the CloudWatch metric that is watched to determine an alarm condition.","Namespace":"The namespace for the CloudWatch metric. The default is `AWS/ElasticMapReduce` .","Period":"The period, in seconds, over which the statistic is applied. CloudWatch metrics for Amazon EMR are emitted every five minutes (300 seconds), so if you specify a CloudWatch metric, specify `300` .","Statistic":"The statistic to apply to the metric associated with the alarm. The default is `AVERAGE` .","Threshold":"The value against which the specified statistic is compared.","Unit":"The unit of measure associated with the CloudWatch metric being watched. The value specified for `Unit` must correspond to the units specified in the CloudWatch metric."}},"AWS::EMR::Cluster.ComputeLimits":{"attributes":{},"description":"The Amazon EC2 unit limits for a managed scaling policy. The managed scaling activity of a cluster can not be above or below these limits. The limit only applies to the core and task nodes. The master node cannot be scaled after initial configuration.","properties":{"MaximumCapacityUnits":"The upper boundary of Amazon EC2 units. It is measured through vCPU cores or instances for instance groups and measured through units for instance fleets. Managed scaling activities are not allowed beyond this boundary. The limit only applies to the core and task nodes. The master node cannot be scaled after initial configuration.","MaximumCoreCapacityUnits":"The upper boundary of Amazon EC2 units for core node type in a cluster. It is measured through vCPU cores or instances for instance groups and measured through units for instance fleets. The core units are not allowed to scale beyond this boundary. The parameter is used to split capacity allocation between core and task nodes.","MaximumOnDemandCapacityUnits":"The upper boundary of On-Demand Amazon EC2 units. It is measured through vCPU cores or instances for instance groups and measured through units for instance fleets. The On-Demand units are not allowed to scale beyond this boundary. The parameter is used to split capacity allocation between On-Demand and Spot Instances.","MinimumCapacityUnits":"The lower boundary of Amazon EC2 units. It is measured through vCPU cores or instances for instance groups and measured through units for instance fleets. Managed scaling activities are not allowed beyond this boundary. The limit only applies to the core and task nodes. The master node cannot be scaled after initial configuration.","UnitType":"The unit type used for specifying a managed scaling policy."}},"AWS::EMR::Cluster.Configuration":{"attributes":{},"description":"> Used only with Amazon EMR release 4.0 and later. \\n\\n`Configuration` is a subproperty of `InstanceFleetConfig` or `InstanceGroupConfig` . `Configuration` specifies optional configurations for customizing open-source big data applications and environment parameters. A configuration consists of a classification, properties, and optional nested configurations. A classification refers to an application-specific configuration file. Properties are the settings you want to change in that file. For more information, see [Configuring Applications](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html) in the *Amazon EMR Release Guide* .","properties":{"Classification":"The classification within a configuration.","ConfigurationProperties":"A list of additional configurations to apply within a configuration object.","Configurations":"A list of additional configurations to apply within a configuration object."}},"AWS::EMR::Cluster.EbsBlockDeviceConfig":{"attributes":{},"description":"`EbsBlockDeviceConfig` is a subproperty of the `EbsConfiguration` property type. `EbsBlockDeviceConfig` defines the number and type of EBS volumes to associate with all EC2 instances in an EMR cluster.","properties":{"VolumeSpecification":"EBS volume specifications such as volume type, IOPS, size (GiB) and throughput (MiB/s) that are requested for the EBS volume attached to an Amazon EC2 instance in the cluster.","VolumesPerInstance":"Number of EBS volumes with a specific volume configuration that are associated with every instance in the instance group"}},"AWS::EMR::Cluster.EbsConfiguration":{"attributes":{},"description":"`EbsConfiguration` is a subproperty of `InstanceFleetConfig` or `InstanceGroupConfig` . `EbsConfiguration` determines the EBS volumes to attach to EMR cluster instances.","properties":{"EbsBlockDeviceConfigs":"An array of Amazon EBS volume specifications attached to a cluster instance.","EbsOptimized":"Indicates whether an Amazon EBS volume is EBS-optimized."}},"AWS::EMR::Cluster.HadoopJarStepConfig":{"attributes":{},"description":"The `HadoopJarStepConfig` property type specifies a job flow step consisting of a JAR file whose main function will be executed. The main function submits a job for the cluster to execute as a step on the master node, and then waits for the job to finish or fail before executing subsequent steps.","properties":{"Args":"A list of command line arguments passed to the JAR file\'s main function when executed.","Jar":"A path to a JAR file run during the step.","MainClass":"The name of the main class in the specified Java file. If not specified, the JAR file should specify a Main-Class in its manifest file.","StepProperties":"A list of Java properties that are set when the step runs. You can use these properties to pass key-value pairs to your main function."}},"AWS::EMR::Cluster.InstanceFleetConfig":{"attributes":{},"description":"Use `InstanceFleetConfig` to define instance fleets for an EMR cluster. A cluster can not use both instance fleets and instance groups. For more information, see [Configure Instance Fleets](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-instance-group-configuration.html) in the *Amazon EMR Management Guide* .\\n\\n> The instance fleet configuration is available only in Amazon EMR versions 4.8.0 and later, excluding 5.0.x versions.","properties":{"InstanceTypeConfigs":"The instance type configurations that define the Amazon EC2 instances in the instance fleet.","LaunchSpecifications":"The launch specification for the instance fleet.","Name":"The friendly name of the instance fleet.","TargetOnDemandCapacity":"The target capacity of On-Demand units for the instance fleet, which determines how many On-Demand instances to provision. When the instance fleet launches, Amazon EMR tries to provision On-Demand instances as specified by `InstanceTypeConfig` . Each instance configuration has a specified `WeightedCapacity` . When an On-Demand instance is provisioned, the `WeightedCapacity` units count toward the target capacity. Amazon EMR provisions instances until the target capacity is totally fulfilled, even if this results in an overage. For example, if there are 2 units remaining to fulfill capacity, and Amazon EMR can only provision an instance with a `WeightedCapacity` of 5 units, the instance is provisioned, and the target capacity is exceeded by 3 units.\\n\\n> If not specified or set to 0, only Spot instances are provisioned for the instance fleet using `TargetSpotCapacity` . At least one of `TargetSpotCapacity` and `TargetOnDemandCapacity` should be greater than 0. For a master instance fleet, only one of `TargetSpotCapacity` and `TargetOnDemandCapacity` can be specified, and its value must be 1.","TargetSpotCapacity":"The target capacity of Spot units for the instance fleet, which determines how many Spot instances to provision. When the instance fleet launches, Amazon EMR tries to provision Spot instances as specified by `InstanceTypeConfig` . Each instance configuration has a specified `WeightedCapacity` . When a Spot instance is provisioned, the `WeightedCapacity` units count toward the target capacity. Amazon EMR provisions instances until the target capacity is totally fulfilled, even if this results in an overage. For example, if there are 2 units remaining to fulfill capacity, and Amazon EMR can only provision an instance with a `WeightedCapacity` of 5 units, the instance is provisioned, and the target capacity is exceeded by 3 units.\\n\\n> If not specified or set to 0, only On-Demand instances are provisioned for the instance fleet. At least one of `TargetSpotCapacity` and `TargetOnDemandCapacity` should be greater than 0. For a master instance fleet, only one of `TargetSpotCapacity` and `TargetOnDemandCapacity` can be specified, and its value must be 1."}},"AWS::EMR::Cluster.InstanceFleetProvisioningSpecifications":{"attributes":{},"description":"`InstanceFleetProvisioningSpecification` is a subproperty of `InstanceFleetConfig` . `InstanceFleetProvisioningSpecification` defines the launch specification for Spot instances in an instance fleet, which determines the defined duration and provisioning timeout behavior for Spot instances.\\n\\n> The instance fleet configuration is available only in Amazon EMR versions 4.8.0 and later, excluding 5.0.x versions.","properties":{"OnDemandSpecification":"The launch specification for On-Demand Instances in the instance fleet, which determines the allocation strategy.\\n\\n> The instance fleet configuration is available only in Amazon EMR releases 4.8.0 and later, excluding 5.0.x versions. On-Demand Instances allocation strategy is available in Amazon EMR releases 5.12.1 and later.","SpotSpecification":"The launch specification for Spot instances in the fleet, which determines the defined duration, provisioning timeout behavior, and allocation strategy."}},"AWS::EMR::Cluster.InstanceGroupConfig":{"attributes":{},"description":"Use `InstanceGroupConfig` to define instance groups for an EMR cluster. A cluster can not use both instance groups and instance fleets. For more information, see [Create a Cluster with Instance Fleets or Uniform Instance Groups](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-instance-group-configuration.html) in the *Amazon EMR Management Guide* .","properties":{"AutoScalingPolicy":"`AutoScalingPolicy` is a subproperty of the [InstanceGroupConfig](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-properties-emr-cluster-jobflowinstancesconfig-instancegroupconfig.html) property type that specifies the constraints and rules of an automatic scaling policy in Amazon EMR . The automatic scaling policy defines how an instance group dynamically adds and terminates EC2 instances in response to the value of a CloudWatch metric. Only core and task instance groups can use automatic scaling policies. For more information, see [Using Automatic Scaling in Amazon EMR](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-automatic-scaling.html) .","BidPrice":"If specified, indicates that the instance group uses Spot Instances. This is the maximum price you are willing to pay for Spot Instances. Specify `OnDemandPrice` to set the amount equal to the On-Demand price, or specify an amount in USD.","Configurations":"> Amazon EMR releases 4.x or later. \\n\\nThe list of configurations supplied for an Amazon EMR cluster instance group. You can specify a separate configuration for each instance group (master, core, and task).","CustomAmiId":"The custom AMI ID to use for the provisioned instance group.","EbsConfiguration":"EBS configurations that will be attached to each Amazon EC2 instance in the instance group.","InstanceCount":"Target number of instances for the instance group.","InstanceType":"The Amazon EC2 instance type for all instances in the instance group.","Market":"Market type of the Amazon EC2 instances used to create a cluster node.","Name":"Friendly name given to the instance group."}},"AWS::EMR::Cluster.InstanceTypeConfig":{"attributes":{},"description":"> The instance fleet configuration is available only in Amazon EMR versions 4.8.0 and later, excluding 5.0.x versions. \\n\\n`InstanceTypeConfig` is a sub-property of `InstanceFleetConfig` . `InstanceTypeConfig` determines the EC2 instances that Amazon EMR attempts to provision to fulfill On-Demand and Spot target capacities.","properties":{"BidPrice":"The bid price for each Amazon EC2 Spot Instance type as defined by `InstanceType` . Expressed in USD. If neither `BidPrice` nor `BidPriceAsPercentageOfOnDemandPrice` is provided, `BidPriceAsPercentageOfOnDemandPrice` defaults to 100%.","BidPriceAsPercentageOfOnDemandPrice":"The bid price, as a percentage of On-Demand price, for each Amazon EC2 Spot Instance as defined by `InstanceType` . Expressed as a number (for example, 20 specifies 20%). If neither `BidPrice` nor `BidPriceAsPercentageOfOnDemandPrice` is provided, `BidPriceAsPercentageOfOnDemandPrice` defaults to 100%.","Configurations":"A configuration classification that applies when provisioning cluster instances, which can include configurations for applications and software that run on the cluster.","CustomAmiId":"The custom AMI ID to use for the instance type.","EbsConfiguration":"The configuration of Amazon Elastic Block Store (Amazon EBS) attached to each instance as defined by `InstanceType` .","InstanceType":"An Amazon EC2 instance type, such as `m3.xlarge` .","WeightedCapacity":"The number of units that a provisioned instance of this type provides toward fulfilling the target capacities defined in `InstanceFleetConfig` . This value is 1 for a master instance fleet, and must be 1 or greater for core and task instance fleets. Defaults to 1 if not specified."}},"AWS::EMR::Cluster.JobFlowInstancesConfig":{"attributes":{},"description":"`JobFlowInstancesConfig` is a property of the `AWS::EMR::Cluster` resource. `JobFlowInstancesConfig` defines the instance groups or instance fleets that comprise the cluster. `JobFlowInstancesConfig` must contain either `InstanceFleetConfig` or `InstanceGroupConfig` . They cannot be used together.\\n\\nYou can now define task instance groups or task instance fleets using the `TaskInstanceGroups` and `TaskInstanceFleets` subproperties. Using these subproperties reduces delays in provisioning task nodes compared to specifying task nodes with the `InstanceFleetConfig` and `InstanceGroupConfig` resources.","properties":{"AdditionalMasterSecurityGroups":"A list of additional Amazon EC2 security group IDs for the master node.","AdditionalSlaveSecurityGroups":"A list of additional Amazon EC2 security group IDs for the core and task nodes.","CoreInstanceFleet":"Describes the EC2 instances and instance configurations for the core instance fleet when using clusters with the instance fleet configuration.","CoreInstanceGroup":"Describes the EC2 instances and instance configurations for core instance groups when using clusters with the uniform instance group configuration.","Ec2KeyName":"The name of the Amazon EC2 key pair that can be used to connect to the master node using SSH as the user called \\"hadoop.\\"","Ec2SubnetId":"Applies to clusters that use the uniform instance group configuration. To launch the cluster in Amazon Virtual Private Cloud (Amazon VPC), set this parameter to the identifier of the Amazon VPC subnet where you want the cluster to launch. If you do not specify this value and your account supports EC2-Classic, the cluster launches in EC2-Classic.","Ec2SubnetIds":"Applies to clusters that use the instance fleet configuration. When multiple Amazon EC2 subnet IDs are specified, Amazon EMR evaluates them and launches instances in the optimal subnet.\\n\\n> The instance fleet configuration is available only in Amazon EMR releases 4.8.0 and later, excluding 5.0.x versions.","EmrManagedMasterSecurityGroup":"The identifier of the Amazon EC2 security group for the master node. If you specify `EmrManagedMasterSecurityGroup` , you must also specify `EmrManagedSlaveSecurityGroup` .","EmrManagedSlaveSecurityGroup":"The identifier of the Amazon EC2 security group for the core and task nodes. If you specify `EmrManagedSlaveSecurityGroup` , you must also specify `EmrManagedMasterSecurityGroup` .","HadoopVersion":"Applies only to Amazon EMR release versions earlier than 4.0. The Hadoop version for the cluster. Valid inputs are \\"0.18\\" (no longer maintained), \\"0.20\\" (no longer maintained), \\"0.20.205\\" (no longer maintained), \\"1.0.3\\", \\"2.2.0\\", or \\"2.4.0\\". If you do not set this value, the default of 0.18 is used, unless the `AmiVersion` parameter is set in the RunJobFlow call, in which case the default version of Hadoop for that AMI version is used.","KeepJobFlowAliveWhenNoSteps":"Specifies whether the cluster should remain available after completing all steps. Defaults to `true` . For more information about configuring cluster termination, see [Control Cluster Termination](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-termination.html) in the *EMR Management Guide* .","MasterInstanceFleet":"Describes the EC2 instances and instance configurations for the master instance fleet when using clusters with the instance fleet configuration.","MasterInstanceGroup":"Describes the EC2 instances and instance configurations for the master instance group when using clusters with the uniform instance group configuration.","Placement":"The Availability Zone in which the cluster runs.","ServiceAccessSecurityGroup":"The identifier of the Amazon EC2 security group for the Amazon EMR service to access clusters in VPC private subnets.","TaskInstanceFleets":"Describes the EC2 instances and instance configurations for the task instance fleets when using clusters with the instance fleet configuration. These task instance fleets are added to the cluster as part of the cluster launch. Each task instance fleet must have a unique name specified so that CloudFormation can differentiate between the task instance fleets.\\n\\n> You can currently specify only one task instance fleet for a cluster. After creating the cluster, you can only modify the mutable properties of `InstanceFleetConfig` , which are `TargetOnDemandCapacity` and `TargetSpotCapacity` . Modifying any other property results in cluster replacement. > To allow a maximum of 30 Amazon EC2 instance types per fleet, include `TaskInstanceFleets` when you create your cluster. If you create your cluster without `TaskInstanceFleets` , Amazon EMR uses its default allocation strategy, which allows for a maximum of five Amazon EC2 instance types.","TaskInstanceGroups":"Describes the EC2 instances and instance configurations for task instance groups when using clusters with the uniform instance group configuration. These task instance groups are added to the cluster as part of the cluster launch. Each task instance group must have a unique name specified so that CloudFormation can differentiate between the task instance groups.\\n\\n> After creating the cluster, you can only modify the mutable properties of `InstanceGroupConfig` , which are `AutoScalingPolicy` and `InstanceCount` . Modifying any other property results in cluster replacement.","TerminationProtected":"Specifies whether to lock the cluster to prevent the Amazon EC2 instances from being terminated by API call, user intervention, or in the event of a job-flow error."}},"AWS::EMR::Cluster.KerberosAttributes":{"attributes":{},"description":"`KerberosAttributes` is a property of the `AWS::EMR::Cluster` resource. `KerberosAttributes` define the cluster-specific Kerberos configuration when Kerberos authentication is enabled using a security configuration. The cluster-specific configuration must be compatible with the security configuration. For more information see [Use Kerberos Authentication](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-kerberos.html) in the *EMR Management Guide* .","properties":{"ADDomainJoinPassword":"The Active Directory password for `ADDomainJoinUser` .","ADDomainJoinUser":"Required only when establishing a cross-realm trust with an Active Directory domain. A user with sufficient privileges to join resources to the domain.","CrossRealmTrustPrincipalPassword":"Required only when establishing a cross-realm trust with a KDC in a different realm. The cross-realm principal password, which must be identical across realms.","KdcAdminPassword":"The password used within the cluster for the kadmin service on the cluster-dedicated KDC, which maintains Kerberos principals, password policies, and keytabs for the cluster.","Realm":"The name of the Kerberos realm to which all nodes in a cluster belong. For example, `EC2.INTERNAL` ."}},"AWS::EMR::Cluster.KeyValue":{"attributes":{},"description":"`KeyValue` is a subproperty of the `HadoopJarStepConfig` property type. `KeyValue` is used to pass parameters to a step.","properties":{"Key":"The unique identifier of a key-value pair.","Value":"The value part of the identified key."}},"AWS::EMR::Cluster.ManagedScalingPolicy":{"attributes":{},"description":"Managed scaling policy for an Amazon EMR cluster. The policy specifies the limits for resources that can be added or terminated from a cluster. The policy only applies to the core and task nodes. The master node cannot be scaled after initial configuration.","properties":{"ComputeLimits":"The Amazon EC2 unit limits for a managed scaling policy. The managed scaling activity of a cluster is not allowed to go above or below these limits. The limit only applies to the core and task nodes. The master node cannot be scaled after initial configuration."}},"AWS::EMR::Cluster.MetricDimension":{"attributes":{},"description":"`MetricDimension` is a subproperty of the `CloudWatchAlarmDefinition` property type. `MetricDimension` specifies a CloudWatch dimension, which is specified with a `Key` `Value` pair. The key is known as a `Name` in CloudWatch. By default, Amazon EMR uses one dimension whose `Key` is `JobFlowID` and `Value` is a variable representing the cluster ID, which is `${emr.clusterId}` . This enables the automatic scaling rule for EMR to bootstrap when the cluster ID becomes available during cluster creation.","properties":{"Key":"The dimension name.","Value":"The dimension value."}},"AWS::EMR::Cluster.OnDemandProvisioningSpecification":{"attributes":{},"description":"The launch specification for On-Demand Instances in the instance fleet, which determines the allocation strategy.\\n\\n> The instance fleet configuration is available only in Amazon EMR releases 4.8.0 and later, excluding 5.0.x versions. On-Demand Instances allocation strategy is available in Amazon EMR releases 5.12.1 and later.","properties":{"AllocationStrategy":"Specifies the strategy to use in launching On-Demand instance fleets. Currently, the only option is `lowest-price` (the default), which launches the lowest price first."}},"AWS::EMR::Cluster.PlacementType":{"attributes":{},"description":"`PlacementType` is a property of the `AWS::EMR::Cluster` resource. `PlacementType` determines the Amazon EC2 Availability Zone configuration of the cluster (job flow).","properties":{"AvailabilityZone":"The Amazon EC2 Availability Zone for the cluster. `AvailabilityZone` is used for uniform instance groups, while `AvailabilityZones` (plural) is used for instance fleets."}},"AWS::EMR::Cluster.ScalingAction":{"attributes":{},"description":"`ScalingAction` is a subproperty of the `ScalingRule` property type. `ScalingAction` determines the type of adjustment the automatic scaling activity makes when triggered, and the periodicity of the adjustment.","properties":{"Market":"Not available for instance groups. Instance groups use the market type specified for the group.","SimpleScalingPolicyConfiguration":"The type of adjustment the automatic scaling activity makes when triggered, and the periodicity of the adjustment."}},"AWS::EMR::Cluster.ScalingConstraints":{"attributes":{},"description":"`ScalingConstraints` is a subproperty of the `AutoScalingPolicy` property type. `ScalingConstraints` defines the upper and lower EC2 instance limits for an automatic scaling policy. Automatic scaling activities triggered by automatic scaling rules will not cause an instance group to grow above or shrink below these limits.","properties":{"MaxCapacity":"The upper boundary of Amazon EC2 instances in an instance group beyond which scaling activities are not allowed to grow. Scale-out activities will not add instances beyond this boundary.","MinCapacity":"The lower boundary of Amazon EC2 instances in an instance group below which scaling activities are not allowed to shrink. Scale-in activities will not terminate instances below this boundary."}},"AWS::EMR::Cluster.ScalingRule":{"attributes":{},"description":"`ScalingRule` is a subproperty of the `AutoScalingPolicy` property type. `ScalingRule` defines the scale-in or scale-out rules for scaling activity, including the CloudWatch metric alarm that triggers activity, how EC2 instances are added or removed, and the periodicity of adjustments. The automatic scaling policy for an instance group can comprise one or more automatic scaling rules.","properties":{"Action":"The conditions that trigger an automatic scaling activity.","Description":"A friendly, more verbose description of the automatic scaling rule.","Name":"The name used to identify an automatic scaling rule. Rule names must be unique within a scaling policy.","Trigger":"The CloudWatch alarm definition that determines when automatic scaling activity is triggered."}},"AWS::EMR::Cluster.ScalingTrigger":{"attributes":{},"description":"`ScalingTrigger` is a subproperty of the `ScalingRule` property type. `ScalingTrigger` determines the conditions that trigger an automatic scaling activity.","properties":{"CloudWatchAlarmDefinition":"The definition of a CloudWatch metric alarm. When the defined alarm conditions are met along with other trigger parameters, scaling activity begins."}},"AWS::EMR::Cluster.ScriptBootstrapActionConfig":{"attributes":{},"description":"`ScriptBootstrapActionConfig` is a subproperty of the `BootstrapActionConfig` property type. `ScriptBootstrapActionConfig` specifies the arguments and location of the bootstrap script for EMR to run on all cluster nodes before it installs open-source big data applications on them.","properties":{"Args":"A list of command line arguments to pass to the bootstrap action script.","Path":"Location in Amazon S3 of the script to run during a bootstrap action."}},"AWS::EMR::Cluster.SimpleScalingPolicyConfiguration":{"attributes":{},"description":"`SimpleScalingPolicyConfiguration` is a subproperty of the `ScalingAction` property type. `SimpleScalingPolicyConfiguration` determines how an automatic scaling action adds or removes instances, the cooldown period, and the number of EC2 instances that are added each time the CloudWatch metric alarm condition is satisfied.","properties":{"AdjustmentType":"The way in which Amazon EC2 instances are added (if `ScalingAdjustment` is a positive number) or terminated (if `ScalingAdjustment` is a negative number) each time the scaling activity is triggered. `CHANGE_IN_CAPACITY` is the default. `CHANGE_IN_CAPACITY` indicates that the Amazon EC2 instance count increments or decrements by `ScalingAdjustment` , which should be expressed as an integer. `PERCENT_CHANGE_IN_CAPACITY` indicates the instance count increments or decrements by the percentage specified by `ScalingAdjustment` , which should be expressed as an integer. For example, 20 indicates an increase in 20% increments of cluster capacity. `EXACT_CAPACITY` indicates the scaling activity results in an instance group with the number of Amazon EC2 instances specified by `ScalingAdjustment` , which should be expressed as a positive integer.","CoolDown":"The amount of time, in seconds, after a scaling activity completes before any further trigger-related scaling activities can start. The default value is 0.","ScalingAdjustment":"The amount by which to scale in or scale out, based on the specified `AdjustmentType` . A positive value adds to the instance group\'s Amazon EC2 instance count while a negative number removes instances. If `AdjustmentType` is set to `EXACT_CAPACITY` , the number should only be a positive integer. If `AdjustmentType` is set to `PERCENT_CHANGE_IN_CAPACITY` , the value should express the percentage as an integer. For example, -20 indicates a decrease in 20% increments of cluster capacity."}},"AWS::EMR::Cluster.SpotProvisioningSpecification":{"attributes":{},"description":"`SpotProvisioningSpecification` is a subproperty of the `InstanceFleetProvisioningSpecifications` property type. `SpotProvisioningSpecification` determines the launch specification for Spot instances in the instance fleet, which includes the defined duration and provisioning timeout behavior.\\n\\n> The instance fleet configuration is available only in Amazon EMR versions 4.8.0 and later, excluding 5.0.x versions.","properties":{"AllocationStrategy":"Specifies one of the following strategies to launch Spot Instance fleets: `price-capacity-optimized` , `capacity-optimized` , `lowest-price` , or `diversified` . For more information on the provisioning strategies, see [Allocation strategies for Spot Instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-allocation-strategy.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\n> When you launch a Spot Instance fleet with the old console, it automatically launches with the `capacity-optimized` strategy. You can\'t change the allocation strategy from the old console.","BlockDurationMinutes":"The defined duration for Spot Instances (also known as Spot blocks) in minutes. When specified, the Spot Instance does not terminate before the defined duration expires, and defined duration pricing for Spot Instances applies. Valid values are 60, 120, 180, 240, 300, or 360. The duration period starts as soon as a Spot Instance receives its instance ID. At the end of the duration, Amazon EC2 marks the Spot Instance for termination and provides a Spot Instance termination notice, which gives the instance a two-minute warning before it terminates.\\n\\n> Spot Instances with a defined duration (also known as Spot blocks) are no longer available to new customers from July 1, 2021. For customers who have previously used the feature, we will continue to support Spot Instances with a defined duration until December 31, 2022.","TimeoutAction":"The action to take when `TargetSpotCapacity` has not been fulfilled when the `TimeoutDurationMinutes` has expired; that is, when all Spot Instances could not be provisioned within the Spot provisioning timeout. Valid values are `TERMINATE_CLUSTER` and `SWITCH_TO_ON_DEMAND` . SWITCH_TO_ON_DEMAND specifies that if no Spot Instances are available, On-Demand Instances should be provisioned to fulfill any remaining Spot capacity.","TimeoutDurationMinutes":"The Spot provisioning timeout period in minutes. If Spot Instances are not provisioned within this time period, the `TimeOutAction` is taken. Minimum value is 5 and maximum value is 1440. The timeout applies only during initial provisioning, when the cluster is first created."}},"AWS::EMR::Cluster.StepConfig":{"attributes":{},"description":"`StepConfig` is a property of the `AWS::EMR::Cluster` resource. The `StepConfig` property type specifies a cluster (job flow) step, which runs only on the master node. Steps are used to submit data processing jobs to the cluster.","properties":{"ActionOnFailure":"The action to take when the cluster step fails. Possible values are `CANCEL_AND_WAIT` and `CONTINUE` .","HadoopJarStep":"The JAR file used for the step.","Name":"The name of the step."}},"AWS::EMR::Cluster.VolumeSpecification":{"attributes":{},"description":"`VolumeSpecification` is a subproperty of the `EbsBlockDeviceConfig` property type. `VolumeSecification` determines the volume type, IOPS, and size (GiB) for EBS volumes attached to EC2 instances.","properties":{"Iops":"The number of I/O operations per second (IOPS) that the volume supports.","SizeInGB":"The volume size, in gibibytes (GiB). This can be a number from 1 - 1024. If the volume type is EBS-optimized, the minimum value is 10.","VolumeType":"The volume type. Volume types supported are gp3, gp2, io1, st1, sc1, and standard."}},"AWS::EMR::InstanceFleetConfig":{"attributes":{"Ref":"`Ref` returns returns the ID of the instance fleet."},"description":"Use `InstanceFleetConfig` to define instance fleets for an EMR cluster. A cluster can not use both instance fleets and instance groups. For more information, see [Configure Instance Fleets](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-instance-group-configuration.html) in the *Amazon EMR Management Guide* .\\n\\n> The instance fleet configuration is available only in Amazon EMR versions 4.8.0 and later, excluding 5.0.x versions. > You can currently only add a task instance fleet to a cluster with this resource. If you use this resource, CloudFormation waits for the cluster launch to complete before adding the task instance fleet to the cluster. In order to add a task instance fleet to the cluster as part of the cluster launch and minimize delays in provisioning task nodes, use the `TaskInstanceFleets` subproperty for the [AWS::EMR::Cluster JobFlowInstancesConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html) property instead. To use this subproperty, see [AWS::EMR::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html) for examples.","properties":{"ClusterId":"The unique identifier of the EMR cluster.","InstanceFleetType":"The node type that the instance fleet hosts.\\n\\n*Allowed Values* : TASK","InstanceTypeConfigs":"`InstanceTypeConfigs` determine the EC2 instances that Amazon EMR attempts to provision to fulfill On-Demand and Spot target capacities.\\n\\n> The instance fleet configuration is available only in Amazon EMR versions 4.8.0 and later, excluding 5.0.x versions.","LaunchSpecifications":"The launch specification for the instance fleet.","Name":"The friendly name of the instance fleet.","TargetOnDemandCapacity":"The target capacity of On-Demand units for the instance fleet, which determines how many On-Demand instances to provision. When the instance fleet launches, Amazon EMR tries to provision On-Demand instances as specified by `InstanceTypeConfig` . Each instance configuration has a specified `WeightedCapacity` . When an On-Demand instance is provisioned, the `WeightedCapacity` units count toward the target capacity. Amazon EMR provisions instances until the target capacity is totally fulfilled, even if this results in an overage. For example, if there are 2 units remaining to fulfill capacity, and Amazon EMR can only provision an instance with a `WeightedCapacity` of 5 units, the instance is provisioned, and the target capacity is exceeded by 3 units.\\n\\n> If not specified or set to 0, only Spot instances are provisioned for the instance fleet using `TargetSpotCapacity` . At least one of `TargetSpotCapacity` and `TargetOnDemandCapacity` should be greater than 0. For a master instance fleet, only one of `TargetSpotCapacity` and `TargetOnDemandCapacity` can be specified, and its value must be 1.","TargetSpotCapacity":"The target capacity of Spot units for the instance fleet, which determines how many Spot instances to provision. When the instance fleet launches, Amazon EMR tries to provision Spot instances as specified by `InstanceTypeConfig` . Each instance configuration has a specified `WeightedCapacity` . When a Spot instance is provisioned, the `WeightedCapacity` units count toward the target capacity. Amazon EMR provisions instances until the target capacity is totally fulfilled, even if this results in an overage. For example, if there are 2 units remaining to fulfill capacity, and Amazon EMR can only provision an instance with a `WeightedCapacity` of 5 units, the instance is provisioned, and the target capacity is exceeded by 3 units.\\n\\n> If not specified or set to 0, only On-Demand instances are provisioned for the instance fleet. At least one of `TargetSpotCapacity` and `TargetOnDemandCapacity` should be greater than 0. For a master instance fleet, only one of `TargetSpotCapacity` and `TargetOnDemandCapacity` can be specified, and its value must be 1."}},"AWS::EMR::InstanceFleetConfig.Configuration":{"attributes":{},"description":"> Used only with Amazon EMR release 4.0 and later. \\n\\n`Configuration` specifies optional configurations for customizing open-source big data applications and environment parameters. A configuration consists of a classification, properties, and optional nested configurations. A classification refers to an application-specific configuration file. Properties are the settings you want to change in that file. For more information, see [Configuring Applications](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html) in the *Amazon EMR Release Guide* .","properties":{"Classification":"The classification within a configuration.","ConfigurationProperties":"Within a configuration classification, a set of properties that represent the settings that you want to change in the configuration file. Duplicates not allowed.","Configurations":"A list of additional configurations to apply within a configuration object."}},"AWS::EMR::InstanceFleetConfig.EbsBlockDeviceConfig":{"attributes":{},"description":"`EbsBlockDeviceConfig` is a subproperty of the `EbsConfiguration` property type. `EbsBlockDeviceConfig` defines the number and type of EBS volumes to associate with all EC2 instances in an EMR cluster.","properties":{"VolumeSpecification":"EBS volume specifications such as volume type, IOPS, size (GiB) and throughput (MiB/s) that are requested for the EBS volume attached to an Amazon EC2 instance in the cluster.","VolumesPerInstance":"Number of EBS volumes with a specific volume configuration that are associated with every instance in the instance group"}},"AWS::EMR::InstanceFleetConfig.EbsConfiguration":{"attributes":{},"description":"`EbsConfiguration` determines the EBS volumes to attach to EMR cluster instances.","properties":{"EbsBlockDeviceConfigs":"An array of Amazon EBS volume specifications attached to a cluster instance.","EbsOptimized":"Indicates whether an Amazon EBS volume is EBS-optimized."}},"AWS::EMR::InstanceFleetConfig.InstanceFleetProvisioningSpecifications":{"attributes":{},"description":"> The instance fleet configuration is available only in Amazon EMR versions 4.8.0 and later, excluding 5.0.x versions. \\n\\n`InstanceTypeConfig` is a sub-property of `InstanceFleetConfig` . `InstanceTypeConfig` determines the EC2 instances that Amazon EMR attempts to provision to fulfill On-Demand and Spot target capacities.","properties":{"OnDemandSpecification":"The launch specification for On-Demand Instances in the instance fleet, which determines the allocation strategy.\\n\\n> The instance fleet configuration is available only in Amazon EMR releases 4.8.0 and later, excluding 5.0.x versions. On-Demand Instances allocation strategy is available in Amazon EMR releases 5.12.1 and later.","SpotSpecification":"The launch specification for Spot instances in the fleet, which determines the defined duration, provisioning timeout behavior, and allocation strategy."}},"AWS::EMR::InstanceFleetConfig.InstanceTypeConfig":{"attributes":{},"description":"`InstanceType` config is a subproperty of `InstanceFleetConfig` . An instance type configuration specifies each instance type in an instance fleet. The configuration determines the EC2 instances Amazon EMR attempts to provision to fulfill On-Demand and Spot target capacities.\\n\\n> The instance fleet configuration is available only in Amazon EMR versions 4.8.0 and later, excluding 5.0.x versions.","properties":{"BidPrice":"The bid price for each Amazon EC2 Spot Instance type as defined by `InstanceType` . Expressed in USD. If neither `BidPrice` nor `BidPriceAsPercentageOfOnDemandPrice` is provided, `BidPriceAsPercentageOfOnDemandPrice` defaults to 100%.","BidPriceAsPercentageOfOnDemandPrice":"The bid price, as a percentage of On-Demand price, for each Amazon EC2 Spot Instance as defined by `InstanceType` . Expressed as a number (for example, 20 specifies 20%). If neither `BidPrice` nor `BidPriceAsPercentageOfOnDemandPrice` is provided, `BidPriceAsPercentageOfOnDemandPrice` defaults to 100%.","Configurations":"> Amazon EMR releases 4.x or later. \\n\\nAn optional configuration specification to be used when provisioning cluster instances, which can include configurations for applications and software bundled with Amazon EMR. A configuration consists of a classification, properties, and optional nested configurations. A classification refers to an application-specific configuration file. Properties are the settings you want to change in that file. For more information, see [Configuring Applications](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html) .","CustomAmiId":"The custom AMI ID to use for the instance type.","EbsConfiguration":"The configuration of Amazon Elastic Block Store (Amazon EBS) attached to each instance as defined by `InstanceType` .","InstanceType":"An Amazon EC2 instance type, such as `m3.xlarge` .","WeightedCapacity":"The number of units that a provisioned instance of this type provides toward fulfilling the target capacities defined in `InstanceFleetConfig` . This value is 1 for a master instance fleet, and must be 1 or greater for core and task instance fleets. Defaults to 1 if not specified."}},"AWS::EMR::InstanceFleetConfig.OnDemandProvisioningSpecification":{"attributes":{},"description":"The launch specification for On-Demand Instances in the instance fleet, which determines the allocation strategy.\\n\\n> The instance fleet configuration is available only in Amazon EMR releases 4.8.0 and later, excluding 5.0.x versions. On-Demand Instances allocation strategy is available in Amazon EMR releases 5.12.1 and later.","properties":{"AllocationStrategy":"Specifies the strategy to use in launching On-Demand instance fleets. Currently, the only option is `lowest-price` (the default), which launches the lowest price first."}},"AWS::EMR::InstanceFleetConfig.SpotProvisioningSpecification":{"attributes":{},"description":"`SpotProvisioningSpecification` is a subproperty of the `InstanceFleetProvisioningSpecifications` property type. `SpotProvisioningSpecification` determines the launch specification for Spot instances in the instance fleet, which includes the defined duration and provisioning timeout behavior.\\n\\n> The instance fleet configuration is available only in Amazon EMR versions 4.8.0 and later, excluding 5.0.x versions.","properties":{"AllocationStrategy":"Specifies one of the following strategies to launch Spot Instance fleets: `price-capacity-optimized` , `capacity-optimized` , `lowest-price` , or `diversified` . For more information on the provisioning strategies, see [Allocation strategies for Spot Instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-allocation-strategy.html) in the *Amazon EC2 User Guide for Linux Instances* .\\n\\n> When you launch a Spot Instance fleet with the old console, it automatically launches with the `capacity-optimized` strategy. You can\'t change the allocation strategy from the old console.","BlockDurationMinutes":"The defined duration for Spot Instances (also known as Spot blocks) in minutes. When specified, the Spot Instance does not terminate before the defined duration expires, and defined duration pricing for Spot Instances applies. Valid values are 60, 120, 180, 240, 300, or 360. The duration period starts as soon as a Spot Instance receives its instance ID. At the end of the duration, Amazon EC2 marks the Spot Instance for termination and provides a Spot Instance termination notice, which gives the instance a two-minute warning before it terminates.\\n\\n> Spot Instances with a defined duration (also known as Spot blocks) are no longer available to new customers from July 1, 2021. For customers who have previously used the feature, we will continue to support Spot Instances with a defined duration until December 31, 2022.","TimeoutAction":"The action to take when `TargetSpotCapacity` has not been fulfilled when the `TimeoutDurationMinutes` has expired; that is, when all Spot Instances could not be provisioned within the Spot provisioning timeout. Valid values are `TERMINATE_CLUSTER` and `SWITCH_TO_ON_DEMAND` . SWITCH_TO_ON_DEMAND specifies that if no Spot Instances are available, On-Demand Instances should be provisioned to fulfill any remaining Spot capacity.","TimeoutDurationMinutes":"The Spot provisioning timeout period in minutes. If Spot Instances are not provisioned within this time period, the `TimeOutAction` is taken. Minimum value is 5 and maximum value is 1440. The timeout applies only during initial provisioning, when the cluster is first created."}},"AWS::EMR::InstanceFleetConfig.VolumeSpecification":{"attributes":{},"description":"`VolumeSpecification` is a subproperty of the `EbsBlockDeviceConfig` property type. `VolumeSecification` determines the volume type, IOPS, and size (GiB) for EBS volumes attached to EC2 instances.","properties":{"Iops":"The number of I/O operations per second (IOPS) that the volume supports.","SizeInGB":"The volume size, in gibibytes (GiB). This can be a number from 1 - 1024. If the volume type is EBS-optimized, the minimum value is 10.","VolumeType":"The volume type. Volume types supported are gp3, gp2, io1, st1, sc1, and standard."}},"AWS::EMR::InstanceGroupConfig":{"attributes":{"Ref":"`Ref` returns returns the ID of the instance group."},"description":"Use `InstanceGroupConfig` to define instance groups for an EMR cluster. A cluster can not use both instance groups and instance fleets. For more information, see [Create a Cluster with Instance Fleets or Uniform Instance Groups](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-instance-group-configuration.html) in the *Amazon EMR Management Guide* .\\n\\n> You can currently only add task instance groups to a cluster with this resource. If you use this resource, CloudFormation waits for the cluster launch to complete before adding the task instance group to the cluster. In order to add task instance groups to the cluster as part of the cluster launch and minimize delays in provisioning task nodes, use the `TaskInstanceGroups` subproperty for the [AWS::EMR::Cluster JobFlowInstancesConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html) property instead. To use this subproperty, see [AWS::EMR::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html) for examples.","properties":{"AutoScalingPolicy":"`AutoScalingPolicy` is a subproperty of `InstanceGroupConfig` . `AutoScalingPolicy` defines how an instance group dynamically adds and terminates EC2 instances in response to the value of a CloudWatch metric. For more information, see [Using Automatic Scaling in Amazon EMR](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-automatic-scaling.html) in the *Amazon EMR Management Guide* .","BidPrice":"If specified, indicates that the instance group uses Spot Instances. This is the maximum price you are willing to pay for Spot Instances. Specify `OnDemandPrice` to set the amount equal to the On-Demand price, or specify an amount in USD.","Configurations":"> Amazon EMR releases 4.x or later. \\n\\nThe list of configurations supplied for an Amazon EMR cluster instance group. You can specify a separate configuration for each instance group (master, core, and task).","CustomAmiId":"The custom AMI ID to use for the provisioned instance group.","EbsConfiguration":"`EbsConfiguration` determines the EBS volumes to attach to EMR cluster instances.","InstanceCount":"Target number of instances for the instance group.","InstanceRole":"The role of the instance group in the cluster.\\n\\n*Allowed Values* : TASK","InstanceType":"The Amazon EC2 instance type for all instances in the instance group.","JobFlowId":"The ID of an Amazon EMR cluster that you want to associate this instance group with.","Market":"Market type of the Amazon EC2 instances used to create a cluster node.","Name":"Friendly name given to the instance group."}},"AWS::EMR::InstanceGroupConfig.AutoScalingPolicy":{"attributes":{},"description":"`AutoScalingPolicy` defines how an instance group dynamically adds and terminates EC2 instances in response to the value of a CloudWatch metric. For more information, see [Using Automatic Scaling in Amazon EMR](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-automatic-scaling.html) in the *Amazon EMR Management Guide* .","properties":{"Constraints":"The upper and lower Amazon EC2 instance limits for an automatic scaling policy. Automatic scaling activity will not cause an instance group to grow above or below these limits.","Rules":"The scale-in and scale-out rules that comprise the automatic scaling policy."}},"AWS::EMR::InstanceGroupConfig.CloudWatchAlarmDefinition":{"attributes":{},"description":"`CloudWatchAlarmDefinition` is a subproperty of the `ScalingTrigger` property, which determines when to trigger an automatic scaling activity. Scaling activity begins when you satisfy the defined alarm conditions.","properties":{"ComparisonOperator":"Determines how the metric specified by `MetricName` is compared to the value specified by `Threshold` .","Dimensions":"A CloudWatch metric dimension.","EvaluationPeriods":"The number of periods, in five-minute increments, during which the alarm condition must exist before the alarm triggers automatic scaling activity. The default value is `1` .","MetricName":"The name of the CloudWatch metric that is watched to determine an alarm condition.","Namespace":"The namespace for the CloudWatch metric. The default is `AWS/ElasticMapReduce` .","Period":"The period, in seconds, over which the statistic is applied. CloudWatch metrics for Amazon EMR are emitted every five minutes (300 seconds), so if you specify a CloudWatch metric, specify `300` .","Statistic":"The statistic to apply to the metric associated with the alarm. The default is `AVERAGE` .","Threshold":"The value against which the specified statistic is compared.","Unit":"The unit of measure associated with the CloudWatch metric being watched. The value specified for `Unit` must correspond to the units specified in the CloudWatch metric."}},"AWS::EMR::InstanceGroupConfig.Configuration":{"attributes":{},"description":"`Configurations` is a property of the `AWS::EMR::Cluster` resource that specifies the configuration of applications on an Amazon EMR cluster.\\n\\nConfigurations are optional. You can use them to have EMR customize applications and software bundled with Amazon EMR when a cluster is created. A configuration consists of a classification, properties, and optional nested configurations. A classification refers to an application-specific configuration file. Properties are the settings you want to change in that file. For more information, see [Configuring Applications](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html) .\\n\\n> Applies only to Amazon EMR releases 4.0 and later.","properties":{"Classification":"The classification within a configuration.","ConfigurationProperties":"Within a configuration classification, a set of properties that represent the settings that you want to change in the configuration file. Duplicates not allowed.","Configurations":"A list of additional configurations to apply within a configuration object."}},"AWS::EMR::InstanceGroupConfig.EbsBlockDeviceConfig":{"attributes":{},"description":"Configuration of requested EBS block device associated with the instance group with count of volumes that are associated to every instance.","properties":{"VolumeSpecification":"EBS volume specifications such as volume type, IOPS, size (GiB) and throughput (MiB/s) that are requested for the EBS volume attached to an Amazon EC2 instance in the cluster.","VolumesPerInstance":"Number of EBS volumes with a specific volume configuration that are associated with every instance in the instance group"}},"AWS::EMR::InstanceGroupConfig.EbsConfiguration":{"attributes":{},"description":"The Amazon EBS configuration of a cluster instance.","properties":{"EbsBlockDeviceConfigs":"An array of Amazon EBS volume specifications attached to a cluster instance.","EbsOptimized":"Indicates whether an Amazon EBS volume is EBS-optimized."}},"AWS::EMR::InstanceGroupConfig.MetricDimension":{"attributes":{},"description":"`MetricDimension` is a subproperty of the `CloudWatchAlarmDefinition` property type. `MetricDimension` specifies a CloudWatch dimension, which is specified with a `Key` `Value` pair. The key is known as a `Name` in CloudWatch. By default, Amazon EMR uses one dimension whose `Key` is `JobFlowID` and `Value` is a variable representing the cluster ID, which is `${emr.clusterId}` . This enables the automatic scaling rule for EMR to bootstrap when the cluster ID becomes available during cluster creation.","properties":{"Key":"The dimension name.","Value":"The dimension value."}},"AWS::EMR::InstanceGroupConfig.ScalingAction":{"attributes":{},"description":"`ScalingAction` is a subproperty of the `ScalingRule` property type. `ScalingAction` determines the type of adjustment the automatic scaling activity makes when triggered, and the periodicity of the adjustment.","properties":{"Market":"Not available for instance groups. Instance groups use the market type specified for the group.","SimpleScalingPolicyConfiguration":"The type of adjustment the automatic scaling activity makes when triggered, and the periodicity of the adjustment."}},"AWS::EMR::InstanceGroupConfig.ScalingConstraints":{"attributes":{},"description":"`ScalingConstraints` is a subproperty of the `AutoScalingPolicy` property type. `ScalingConstraints` defines the upper and lower EC2 instance limits for an automatic scaling policy. Automatic scaling activities triggered by automatic scaling rules will not cause an instance group to grow above or shrink below these limits.","properties":{"MaxCapacity":"The upper boundary of Amazon EC2 instances in an instance group beyond which scaling activities are not allowed to grow. Scale-out activities will not add instances beyond this boundary.","MinCapacity":"The lower boundary of Amazon EC2 instances in an instance group below which scaling activities are not allowed to shrink. Scale-in activities will not terminate instances below this boundary."}},"AWS::EMR::InstanceGroupConfig.ScalingRule":{"attributes":{},"description":"`ScalingRule` is a subproperty of the `AutoScalingPolicy` property type. `ScalingRule` defines the scale-in or scale-out rules for scaling activity, including the CloudWatch metric alarm that triggers activity, how EC2 instances are added or removed, and the periodicity of adjustments. The automatic scaling policy for an instance group can comprise one or more automatic scaling rules.","properties":{"Action":"The conditions that trigger an automatic scaling activity.","Description":"A friendly, more verbose description of the automatic scaling rule.","Name":"The name used to identify an automatic scaling rule. Rule names must be unique within a scaling policy.","Trigger":"The CloudWatch alarm definition that determines when automatic scaling activity is triggered."}},"AWS::EMR::InstanceGroupConfig.ScalingTrigger":{"attributes":{},"description":"`ScalingTrigger` is a subproperty of the `ScalingRule` property type. `ScalingTrigger` determines the conditions that trigger an automatic scaling activity.","properties":{"CloudWatchAlarmDefinition":"The definition of a CloudWatch metric alarm. When the defined alarm conditions are met along with other trigger parameters, scaling activity begins."}},"AWS::EMR::InstanceGroupConfig.SimpleScalingPolicyConfiguration":{"attributes":{},"description":"`SimpleScalingPolicyConfiguration` is a subproperty of the `ScalingAction` property type. `SimpleScalingPolicyConfiguration` determines how an automatic scaling action adds or removes instances, the cooldown period, and the number of EC2 instances that are added each time the CloudWatch metric alarm condition is satisfied.","properties":{"AdjustmentType":"The way in which Amazon EC2 instances are added (if `ScalingAdjustment` is a positive number) or terminated (if `ScalingAdjustment` is a negative number) each time the scaling activity is triggered. `CHANGE_IN_CAPACITY` is the default. `CHANGE_IN_CAPACITY` indicates that the Amazon EC2 instance count increments or decrements by `ScalingAdjustment` , which should be expressed as an integer. `PERCENT_CHANGE_IN_CAPACITY` indicates the instance count increments or decrements by the percentage specified by `ScalingAdjustment` , which should be expressed as an integer. For example, 20 indicates an increase in 20% increments of cluster capacity. `EXACT_CAPACITY` indicates the scaling activity results in an instance group with the number of Amazon EC2 instances specified by `ScalingAdjustment` , which should be expressed as a positive integer.","CoolDown":"The amount of time, in seconds, after a scaling activity completes before any further trigger-related scaling activities can start. The default value is 0.","ScalingAdjustment":"The amount by which to scale in or scale out, based on the specified `AdjustmentType` . A positive value adds to the instance group\'s Amazon EC2 instance count while a negative number removes instances. If `AdjustmentType` is set to `EXACT_CAPACITY` , the number should only be a positive integer. If `AdjustmentType` is set to `PERCENT_CHANGE_IN_CAPACITY` , the value should express the percentage as an integer. For example, -20 indicates a decrease in 20% increments of cluster capacity."}},"AWS::EMR::InstanceGroupConfig.VolumeSpecification":{"attributes":{},"description":"`VolumeSpecification` is a subproperty of the `EbsBlockDeviceConfig` property type. `VolumeSecification` determines the volume type, IOPS, and size (GiB) for EBS volumes attached to EC2 instances.","properties":{"Iops":"The number of I/O operations per second (IOPS) that the volume supports.","SizeInGB":"The volume size, in gibibytes (GiB). This can be a number from 1 - 1024. If the volume type is EBS-optimized, the minimum value is 10.","VolumeType":"The volume type. Volume types supported are gp3, gp2, io1, st1, sc1, and standard."}},"AWS::EMR::SecurityConfiguration":{"attributes":{"Ref":"`Ref` returns returns the security configuration name, such as `mySecurityConfiguration` ."},"description":"Use a `SecurityConfiguration` resource to configure data encryption, Kerberos authentication (available in Amazon EMR release version 5.10.0 and later), and Amazon S3 authorization for EMRFS (available in EMR 5.10.0 and later). You can re-use a security configuration for any number of clusters in your account. For more information and example security configuration JSON objects, see [Create a Security Configuration](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-create-security-configuration.html) in the *Amazon EMR Management Guide* .","properties":{"Name":"The name of the security configuration.","SecurityConfiguration":"The security configuration details in JSON format."}},"AWS::EMR::Step":{"attributes":{"Ref":"`Ref` returns returns the ID of the step."},"description":"Use `Step` to specify a cluster (job flow) step, which runs only on the master node. Steps are used to submit data processing jobs to a cluster.","properties":{"ActionOnFailure":"This specifies what action to take when the cluster step fails. Possible values are `CANCEL_AND_WAIT` and `CONTINUE` .","HadoopJarStep":"The `HadoopJarStepConfig` property type specifies a job flow step consisting of a JAR file whose main function will be executed. The main function submits a job for the cluster to execute as a step on the master node, and then waits for the job to finish or fail before executing subsequent steps.","JobFlowId":"A string that uniquely identifies the cluster (job flow).","Name":"The name of the cluster step."}},"AWS::EMR::Step.HadoopJarStepConfig":{"attributes":{},"description":"A job flow step consisting of a JAR file whose main function will be executed. The main function submits a job for Hadoop to execute and waits for the job to finish or fail.","properties":{"Args":"A list of command line arguments passed to the JAR file\'s main function when executed.","Jar":"A path to a JAR file run during the step.","MainClass":"The name of the main class in the specified Java file. If not specified, the JAR file should specify a Main-Class in its manifest file.","StepProperties":"A list of Java properties that are set when the step runs. You can use these properties to pass key value pairs to your main function."}},"AWS::EMR::Step.KeyValue":{"attributes":{},"description":"`KeyValue` is a subproperty of the `HadoopJarStepConfig` property type. `KeyValue` is used to pass parameters to a step.","properties":{"Key":"The unique identifier of a key-value pair.","Value":"The value part of the identified key."}},"AWS::EMR::Studio":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the Amazon EMR Studio. For example: `arn:aws:elasticmapreduce:us-east-1:653XXXXXXXXX:studio/es-EXAMPLE12345678XXXXXXXXXXX` .","Ref":"`Ref` returns the resource ID. For example:\\n\\n`{ \\"Ref\\": \\"es-EXAMPLE12345678XXXXXXXXXXX\\" }`\\n\\nRef returns the ID of the Amazon EMR Studio.","StudioId":"The ID of the Amazon EMR Studio. For example: `es-EXAMPLE12345678XXXXXXXXXXX` .","Url":"The unique access URL of the Amazon EMR Studio. For example: `https://es-EXAMPLE12345678XXXXXXXXXXX.emrstudio-prod.us-east-1.amazonaws.com` ."},"description":"The `AWS::EMR::Studio` resource specifies an Amazon EMR Studio. An EMR Studio is a web-based, integrated development environment for fully managed Jupyter notebooks that run on Amazon EMR clusters. For more information, see the [*Amazon EMR Management Guide*](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio.html) .","properties":{"AuthMode":"Specifies whether the Studio authenticates users using IAM Identity Center or IAM.","DefaultS3Location":"The Amazon S3 location to back up EMR Studio Workspaces and notebook files.","Description":"A detailed description of the Amazon EMR Studio.","EngineSecurityGroupId":"The ID of the Amazon EMR Studio Engine security group. The Engine security group allows inbound network traffic from the Workspace security group, and it must be in the same VPC specified by `VpcId` .","IdpAuthUrl":"Your identity provider\'s authentication endpoint. Amazon EMR Studio redirects federated users to this endpoint for authentication when logging in to a Studio with the Studio URL.","IdpRelayStateParameterName":"The name of your identity provider\'s `RelayState` parameter.","Name":"A descriptive name for the Amazon EMR Studio.","ServiceRole":"The Amazon Resource Name (ARN) of the IAM role that will be assumed by the Amazon EMR Studio. The service role provides a way for Amazon EMR Studio to interoperate with other AWS services.","SubnetIds":"A list of subnet IDs to associate with the Amazon EMR Studio. A Studio can have a maximum of 5 subnets. The subnets must belong to the VPC specified by `VpcId` . Studio users can create a Workspace in any of the specified subnets.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","UserRole":"The Amazon Resource Name (ARN) of the IAM user role that will be assumed by users and groups logged in to a Studio. The permissions attached to this IAM role can be scoped down for each user or group using session policies. You only need to specify `UserRole` when you set `AuthMode` to `SSO` .","VpcId":"The ID of the Amazon Virtual Private Cloud (Amazon VPC) to associate with the Studio.","WorkspaceSecurityGroupId":"The ID of the Workspace security group associated with the Amazon EMR Studio. The Workspace security group allows outbound network traffic to resources in the Engine security group and to the internet."}},"AWS::EMR::StudioSessionMapping":{"attributes":{},"description":"The `AWS::EMR::StudioSessionMapping` resource is an Amazon EMR resource type that maps a user or group to the Amazon EMR Studio specified by `StudioId` , and applies a session policy that defines Studio permissions for that user or group.","properties":{"IdentityName":"The name of the user or group. For more information, see [UserName](https://docs.aws.amazon.com/singlesignon/latest/IdentityStoreAPIReference/API_User.html#singlesignon-Type-User-UserName) and [DisplayName](https://docs.aws.amazon.com/singlesignon/latest/IdentityStoreAPIReference/API_Group.html#singlesignon-Type-Group-DisplayName) in the *IAM Identity Center Identity Store API Reference* .","IdentityType":"Specifies whether the identity to map to the Amazon EMR Studio is a user or a group.","SessionPolicyArn":"The Amazon Resource Name (ARN) for the session policy that will be applied to the user or group. Session policies refine Studio user permissions without the need to use multiple IAM user roles. For more information, see [Create an EMR Studio user role with session policies](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-user-role.html) in the *Amazon EMR Management Guide* .","StudioId":"The ID of the Amazon EMR Studio to which the user or group will be mapped."}},"AWS::EMRContainers::VirtualCluster":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the project, such as `arn:aws:emr-containers:us-east-1:123456789012:/virtualclusters/ab4rp1abcs8xz47n3x0example` .","Id":"The ID of the virtual cluster, such as `ab4rp1abcs8xz47n3x0example` .","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the ID of the virtual cluster.\\n\\nFor more information about using the `Ref` function, see [`Ref`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::EMRContainers::VirtualCluster` resource specifies a virtual cluster. A virtual cluster is a managed entity on Amazon EMR on EKS. You can create, describe, list, and delete virtual clusters. They do not consume any additional resources in your system. A single virtual cluster maps to a single Kubernetes namespace. Given this relationship, you can model virtual clusters the same way you model Kubernetes namespaces to meet your requirements.","properties":{"ContainerProvider":"The container provider of the virtual cluster.","Name":"The name of the virtual cluster.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::EMRContainers::VirtualCluster.ContainerInfo":{"attributes":{},"description":"The information about the container used for a job run or a managed endpoint.","properties":{"EksInfo":"The information about the Amazon EKS cluster."}},"AWS::EMRContainers::VirtualCluster.ContainerProvider":{"attributes":{},"description":"The information about the container provider.","properties":{"Id":"The ID of the container cluster.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 100\\n\\n*Pattern* : `^[0-9A-Za-z][A-Za-z0-9\\\\-_]*`","Info":"The information about the container cluster.","Type":"The type of the container provider. Amazon EKS is the only supported type as of now."}},"AWS::EMRContainers::VirtualCluster.EksInfo":{"attributes":{},"description":"The information about the Amazon EKS cluster.","properties":{"Namespace":"The namespaces of the EKS cluster.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 63\\n\\n*Pattern* : `[a-z0-9]([-a-z0-9]*[a-z0-9])?`"}},"AWS::EMRServerless::Application":{"attributes":{"ApplicationId":"The ID of the application, such as `ab4rp1abcs8xz47n3x0example` .","Arn":"The Amazon Resource Name (ARN) of the project.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the ID of the application.\\n\\nFor more information about using the `Ref` function, see [`Ref`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::EMRServerless::Application` resource specifies an EMR Serverless application. An application uses open source analytics frameworks to run jobs that process data. To create an application, you must specify the release version for the open source framework version you want to use and the type of application you want, such as Apache Spark or Apache Hive. After you create an application, you can submit data processing jobs or interactive requests to it.","properties":{"Architecture":"The CPU architecture type of the application. Allowed values: `X86_64` or `ARM64`","AutoStartConfiguration":"The configuration for an application to automatically start on job submission.","AutoStopConfiguration":"The configuration for an application to automatically stop after a certain amount of time being idle.","ImageConfiguration":"","InitialCapacity":"The initial capacity of the application.","MaximumCapacity":"The maximum capacity of the application. This is cumulative across all workers at any given point in time during the lifespan of the application is created. No new resources will be created once any one of the defined limits is hit.","Name":"The name of the application.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 64\\n\\n*Pattern* : `^[A-Za-z0-9._\\\\\\\\/#-]+$`","NetworkConfiguration":"The network configuration for customer VPC connectivity for the application.","ReleaseLabel":"The EMR release version associated with the application.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 64\\n\\n*Pattern* : `^[A-Za-z0-9._/-]+$`","Tags":"The tags assigned to the application.","Type":"The type of application, such as Spark or Hive.","WorkerTypeSpecifications":""}},"AWS::EMRServerless::Application.AutoStartConfiguration":{"attributes":{},"description":"The configuration for an application to automatically start on job submission.","properties":{"Enabled":"Enables the application to automatically start on job submission. Defaults to true."}},"AWS::EMRServerless::Application.AutoStopConfiguration":{"attributes":{},"description":"The configuration for an application to automatically stop after a certain amount of time being idle.","properties":{"Enabled":"Enables the application to automatically stop after a certain amount of time being idle. Defaults to true.","IdleTimeoutMinutes":"The amount of idle time in minutes after which your application will automatically stop. Defaults to 15 minutes.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 10080"}},"AWS::EMRServerless::Application.ImageConfigurationInput":{"attributes":{},"description":"","properties":{"ImageUri":""}},"AWS::EMRServerless::Application.InitialCapacityConfig":{"attributes":{},"description":"The initial capacity configuration per worker.","properties":{"WorkerConfiguration":"The resource configuration of the initial capacity configuration.","WorkerCount":"The number of workers in the initial capacity configuration.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 1000000"}},"AWS::EMRServerless::Application.InitialCapacityConfigKeyValuePair":{"attributes":{},"description":"The initial capacity configuration per worker.","properties":{"Key":"The worker type for an analytics framework. For Spark applications, the key can either be set to `Driver` or `Executor` . For Hive applications, it can be set to `HiveDriver` or `TezTask` .\\n\\n*Minimum* : 1\\n\\n*Maximum* : 50\\n\\n*Pattern* : `^[a-zA-Z]+[-_]*[a-zA-Z]+$`","Value":"The value for the initial capacity configuration per worker."}},"AWS::EMRServerless::Application.MaximumAllowedResources":{"attributes":{},"description":"The maximum allowed cumulative resources for an application. No new resources will be created once the limit is hit.","properties":{"Cpu":"The maximum allowed CPU for an application.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 15\\n\\n*Pattern* : `^[1-9][0-9]*(\\\\\\\\s)?(vCPU|vcpu|VCPU)?$`","Disk":"The maximum allowed disk for an application.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 15\\n\\n*Pattern* : `^[1-9][0-9]*(\\\\\\\\s)?(GB|gb|gB|Gb)$\\"`","Memory":"The maximum allowed resources for an application.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 15\\n\\n*Pattern* : `^[1-9][0-9]*(\\\\\\\\s)?(GB|gb|gB|Gb)?$`"}},"AWS::EMRServerless::Application.NetworkConfiguration":{"attributes":{},"description":"The network configuration for customer VPC connectivity.","properties":{"SecurityGroupIds":"The array of security group Ids for customer VPC connectivity.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 32\\n\\n*Pattern* : `^[-0-9a-zA-Z]+`","SubnetIds":"The array of subnet Ids for customer VPC connectivity.\\n\\n*Minimum* : 1\\n\\n*Maximum* : 32\\n\\n*Pattern* : `^[-0-9a-zA-Z]+`"}},"AWS::EMRServerless::Application.WorkerConfiguration":{"attributes":{},"description":"The resource configuration of the initial capacity configuration.","properties":{"Cpu":"*Minimum* : 1\\n\\n*Maximum* : 15\\n\\n*Pattern* : `^[1-9][0-9]*(\\\\\\\\s)?(vCPU|vcpu|VCPU)?$`","Disk":"*Minimum* : 1\\n\\n*Maximum* : 15\\n\\n*Pattern* : `^[1-9][0-9]*(\\\\\\\\s)?(GB|gb|gB|Gb)$\\"`","Memory":"*Minimum* : 1\\n\\n*Maximum* : 15\\n\\n*Pattern* : `^[1-9][0-9]*(\\\\\\\\s)?(GB|gb|gB|Gb)?$`"}},"AWS::EMRServerless::Application.WorkerTypeSpecificationInput":{"attributes":{},"description":"","properties":{"ImageConfiguration":""}},"AWS::ElastiCache::CacheCluster":{"attributes":{"ConfigurationEndpoint.Address":"The DNS hostname of the cache node.\\n\\n> Redis (cluster mode disabled) replication groups don\'t have this attribute. Therefore, `Fn::GetAtt` returns a value for this attribute only if the replication group is clustered. Otherwise, `Fn::GetAtt` fails.","ConfigurationEndpoint.Port":"The port number of the configuration endpoint for the Memcached cache cluster.\\n\\n> Redis (cluster mode disabled) replication groups don\'t have this attribute. Therefore, `Fn::GetAtt` returns a value for this attribute only if the replication group is clustered. Otherwise, `Fn::GetAtt` fails.","RedisEndpoint.Address":"The DNS address of the configuration endpoint for the Redis cache cluster.","RedisEndpoint.Port":"The port number of the configuration endpoint for the Redis cache cluster.","Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource name.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The AWS::ElastiCache::CacheCluster type creates an Amazon ElastiCache cache cluster.","properties":{"AZMode":"Specifies whether the nodes in this Memcached cluster are created in a single Availability Zone or created across multiple Availability Zones in the cluster\'s region.\\n\\nThis parameter is only supported for Memcached clusters.\\n\\nIf the `AZMode` and `PreferredAvailabilityZones` are not specified, ElastiCache assumes `single-az` mode.","AutoMinorVersionUpgrade":"If you are running Redis engine version 6.0 or later, set this parameter to yes if you want to opt-in to the next minor version upgrade campaign. This parameter is disabled for previous versions.","CacheNodeType":"The compute and memory capacity of the nodes in the node group (shard).\\n\\nThe following node types are supported by ElastiCache. Generally speaking, the current generation types provide more memory and computational power at lower cost when compared to their equivalent previous generation counterparts. Changing the CacheNodeType of a Memcached instance is currently not supported. If you need to scale using Memcached, we recommend forcing a replacement update by changing the `LogicalResourceId` of the resource.\\n\\n- General purpose:\\n\\n- Current generation:\\n\\n*M6g node types:* `cache.m6g.large` , `cache.m6g.xlarge` , `cache.m6g.2xlarge` , `cache.m6g.4xlarge` , `cache.m6g.8xlarge` , `cache.m6g.12xlarge` , `cache.m6g.16xlarge` , `cache.m6g.24xlarge`\\n\\n*M5 node types:* `cache.m5.large` , `cache.m5.xlarge` , `cache.m5.2xlarge` , `cache.m5.4xlarge` , `cache.m5.12xlarge` , `cache.m5.24xlarge`\\n\\n*M4 node types:* `cache.m4.large` , `cache.m4.xlarge` , `cache.m4.2xlarge` , `cache.m4.4xlarge` , `cache.m4.10xlarge`\\n\\n*T4g node types:* `cache.t4g.micro` , `cache.t4g.small` , `cache.t4g.medium`\\n\\n*T3 node types:* `cache.t3.micro` , `cache.t3.small` , `cache.t3.medium`\\n\\n*T2 node types:* `cache.t2.micro` , `cache.t2.small` , `cache.t2.medium`\\n- Previous generation: (not recommended)\\n\\n*T1 node types:* `cache.t1.micro`\\n\\n*M1 node types:* `cache.m1.small` , `cache.m1.medium` , `cache.m1.large` , `cache.m1.xlarge`\\n\\n*M3 node types:* `cache.m3.medium` , `cache.m3.large` , `cache.m3.xlarge` , `cache.m3.2xlarge`\\n- Compute optimized:\\n\\n- Previous generation: (not recommended)\\n\\n*C1 node types:* `cache.c1.xlarge`\\n- Memory optimized:\\n\\n- Current generation:\\n\\n*R6gd node types:* `cache.r6gd.xlarge` , `cache.r6gd.2xlarge` , `cache.r6gd.4xlarge` , `cache.r6gd.8xlarge` , `cache.r6gd.12xlarge` , `cache.r6gd.16xlarge`\\n\\n> The `r6gd` family is available in the following regions: `us-east-2` , `us-east-1` , `us-west-2` , `us-west-1` , `eu-west-1` , `eu-central-1` , `ap-northeast-1` , `ap-southeast-1` , `ap-southeast-2` . \\n\\n*R6g node types:* `cache.r6g.large` , `cache.r6g.xlarge` , `cache.r6g.2xlarge` , `cache.r6g.4xlarge` , `cache.r6g.8xlarge` , `cache.r6g.12xlarge` , `cache.r6g.16xlarge` , `cache.r6g.24xlarge`\\n\\n*R5 node types:* `cache.r5.large` , `cache.r5.xlarge` , `cache.r5.2xlarge` , `cache.r5.4xlarge` , `cache.r5.12xlarge` , `cache.r5.24xlarge`\\n\\n*R4 node types:* `cache.r4.large` , `cache.r4.xlarge` , `cache.r4.2xlarge` , `cache.r4.4xlarge` , `cache.r4.8xlarge` , `cache.r4.16xlarge`\\n- Previous generation: (not recommended)\\n\\n*M2 node types:* `cache.m2.xlarge` , `cache.m2.2xlarge` , `cache.m2.4xlarge`\\n\\n*R3 node types:* `cache.r3.large` , `cache.r3.xlarge` , `cache.r3.2xlarge` , `cache.r3.4xlarge` , `cache.r3.8xlarge`\\n\\nFor region availability, see [Supported Node Types by Region](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/CacheNodes.SupportedTypes.html#CacheNodes.SupportedTypesByRegion)\\n\\n*Additional node type info*\\n\\n- All current generation instance types are created in Amazon VPC by default.\\n- Redis append-only files (AOF) are not supported for T1 or T2 instances.\\n- Redis Multi-AZ with automatic failover is not supported on T1 instances.\\n- Redis configuration variables `appendonly` and `appendfsync` are not supported on Redis version 2.8.22 and later.","CacheParameterGroupName":"The name of the parameter group to associate with this cluster. If this argument is omitted, the default parameter group for the specified engine is used. You cannot use any parameter group which has `cluster-enabled=\'yes\'` when creating a cluster.","CacheSecurityGroupNames":"A list of security group names to associate with this cluster.\\n\\nUse this parameter only when you are creating a cluster outside of an Amazon Virtual Private Cloud (Amazon VPC).","CacheSubnetGroupName":"The name of the subnet group to be used for the cluster.\\n\\nUse this parameter only when you are creating a cluster in an Amazon Virtual Private Cloud (Amazon VPC).\\n\\n> If you\'re going to launch your cluster in an Amazon VPC, you need to create a subnet group before you start creating a cluster. For more information, see [AWS::ElastiCache::SubnetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-subnetgroup.html) .","ClusterName":"A name for the cache cluster. If you don\'t specify a name, AWSCloudFormation generates a unique physical ID and uses that ID for the cache cluster. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\nThe name must contain 1 to 50 alphanumeric characters or hyphens. The name must start with a letter and cannot end with a hyphen or contain two consecutive hyphens.","Engine":"The name of the cache engine to be used for this cluster.\\n\\nValid values for this parameter are: `memcached` | `redis`","EngineVersion":"The version number of the cache engine to be used for this cluster. To view the supported cache engine versions, use the DescribeCacheEngineVersions operation.\\n\\n*Important:* You can upgrade to a newer engine version (see [Selecting a Cache Engine and Version](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/SelectEngine.html#VersionManagement) ), but you cannot downgrade to an earlier engine version. If you want to use an earlier engine version, you must delete the existing cluster or replication group and create it anew with the earlier engine version.","IpDiscovery":"The network type you choose when modifying a cluster, either `ipv4` | `ipv6` . IPv6 is supported for workloads using Redis engine version 6.2 onward or Memcached engine version 1.6.6 on all instances built on the [Nitro system](https://docs.aws.amazon.com/ec2/nitro/) .","LogDeliveryConfigurations":"Specifies the destination, format and type of the logs.","NetworkType":"Must be either `ipv4` | `ipv6` | `dual_stack` . IPv6 is supported for workloads using Redis engine version 6.2 onward or Memcached engine version 1.6.6 on all instances built on the [Nitro system](https://docs.aws.amazon.com/ec2/nitro/) .","NotificationTopicArn":"The Amazon Resource Name (ARN) of the Amazon Simple Notification Service (SNS) topic to which notifications are sent.\\n\\n> The Amazon SNS topic owner must be the same as the cluster owner.","NumCacheNodes":"The number of cache nodes that the cache cluster should have.\\n\\n> However, if the `PreferredAvailabilityZone` and `PreferredAvailabilityZones` properties were not previously specified and you don\'t specify any new values, an update requires [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","Port":"The port number on which each of the cache nodes accepts connections.","PreferredAvailabilityZone":"The EC2 Availability Zone in which the cluster is created.\\n\\nAll nodes belonging to this cluster are placed in the preferred Availability Zone. If you want to create your nodes across multiple Availability Zones, use `PreferredAvailabilityZones` .\\n\\nDefault: System chosen Availability Zone.","PreferredAvailabilityZones":"A list of the Availability Zones in which cache nodes are created. The order of the zones in the list is not important.\\n\\nThis option is only supported on Memcached.\\n\\n> If you are creating your cluster in an Amazon VPC (recommended) you can only locate nodes in Availability Zones that are associated with the subnets in the selected subnet group.\\n> \\n> The number of Availability Zones listed must equal the value of `NumCacheNodes` . \\n\\nIf you want all the nodes in the same Availability Zone, use `PreferredAvailabilityZone` instead, or repeat the Availability Zone multiple times in the list.\\n\\nDefault: System chosen Availability Zones.","PreferredMaintenanceWindow":"Specifies the weekly time range during which maintenance on the cluster is performed. It is specified as a range in the format ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window is a 60 minute period. Valid values for `ddd` are:\\n\\nSpecifies the weekly time range during which maintenance on the cluster is performed. It is specified as a range in the format ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window is a 60 minute period.\\n\\nValid values for `ddd` are:\\n\\n- `sun`\\n- `mon`\\n- `tue`\\n- `wed`\\n- `thu`\\n- `fri`\\n- `sat`\\n\\nExample: `sun:23:00-mon:01:30`","SnapshotArns":"A single-element string list containing an Amazon Resource Name (ARN) that uniquely identifies a Redis RDB snapshot file stored in Amazon S3. The snapshot file is used to populate the node group (shard). The Amazon S3 object name in the ARN cannot contain any commas.\\n\\n> This parameter is only valid if the `Engine` parameter is `redis` . \\n\\nExample of an Amazon S3 ARN: `arn:aws:s3:::my_bucket/snapshot1.rdb`","SnapshotName":"The name of a Redis snapshot from which to restore data into the new node group (shard). The snapshot status changes to `restoring` while the new node group (shard) is being created.\\n\\n> This parameter is only valid if the `Engine` parameter is `redis` .","SnapshotRetentionLimit":"The number of days for which ElastiCache retains automatic snapshots before deleting them. For example, if you set `SnapshotRetentionLimit` to 5, a snapshot taken today is retained for 5 days before being deleted.\\n\\n> This parameter is only valid if the `Engine` parameter is `redis` . \\n\\nDefault: 0 (i.e., automatic backups are disabled for this cache cluster).","SnapshotWindow":"The daily time range (in UTC) during which ElastiCache begins taking a daily snapshot of your node group (shard).\\n\\nExample: `05:00-09:00`\\n\\nIf you do not specify this parameter, ElastiCache automatically chooses an appropriate time range.\\n\\n> This parameter is only valid if the `Engine` parameter is `redis` .","Tags":"A list of tags to be added to this resource.","TransitEncryptionEnabled":"A flag that enables in-transit encryption when set to true.","VpcSecurityGroupIds":"One or more VPC security groups associated with the cluster.\\n\\nUse this parameter only when you are creating a cluster in an Amazon Virtual Private Cloud (Amazon VPC)."}},"AWS::ElastiCache::CacheCluster.CloudWatchLogsDestinationDetails":{"attributes":{},"description":"Configuration details of a CloudWatch Logs destination. Note that this field is marked as required but only if CloudWatch Logs was chosen as the destination.","properties":{"LogGroup":"The name of the CloudWatch Logs log group."}},"AWS::ElastiCache::CacheCluster.DestinationDetails":{"attributes":{},"description":"Configuration details of either a CloudWatch Logs destination or Kinesis Data Firehose destination.","properties":{"CloudWatchLogsDetails":"The configuration details of the CloudWatch Logs destination. Note that this field is marked as required but only if CloudWatch Logs was chosen as the destination.","KinesisFirehoseDetails":"The configuration details of the Kinesis Data Firehose destination. Note that this field is marked as required but only if Kinesis Data Firehose was chosen as the destination."}},"AWS::ElastiCache::CacheCluster.KinesisFirehoseDestinationDetails":{"attributes":{},"description":"The configuration details of the Kinesis Data Firehose destination. Note that this field is marked as required but only if Kinesis Data Firehose was chosen as the destination.","properties":{"DeliveryStream":"The name of the Kinesis Data Firehose delivery stream."}},"AWS::ElastiCache::CacheCluster.LogDeliveryConfigurationRequest":{"attributes":{},"description":"Specifies the destination, format and type of the logs.","properties":{"DestinationDetails":"Configuration details of either a CloudWatch Logs destination or Kinesis Data Firehose destination.","DestinationType":"Specify either CloudWatch Logs or Kinesis Data Firehose as the destination type. Valid values are either `cloudwatch-logs` or `kinesis-firehose` .","LogFormat":"Valid values are either `json` or `text` .","LogType":"Valid value is either `slow-log` , which refers to [slow-log](https://docs.aws.amazon.com/https://redis.io/commands/slowlog) or `engine-log` ."}},"AWS::ElastiCache::GlobalReplicationGroup":{"attributes":{"GlobalReplicationGroupId":"The ID used to associate a secondary cluster to the Global Replication Group.","Ref":"","Status":"The status of the Global Datastore. Can be `Creating` , `Modifying` , `Available` , `Deleting` or `Primary-Only` . Primary-only status indicates the global datastore contains only a primary cluster. Either all secondary clusters are deleted or not successfully created."},"description":"Consists of a primary cluster that accepts writes and an associated secondary cluster that resides in a different Amazon region. The secondary cluster accepts only reads. The primary cluster automatically replicates updates to the secondary cluster.\\n\\n- The *GlobalReplicationGroupIdSuffix* represents the name of the Global datastore, which is what you use to associate a secondary cluster.","properties":{"AutomaticFailoverEnabled":"Specifies whether a read-only replica is automatically promoted to read/write primary if the existing primary fails.\\n\\n`AutomaticFailoverEnabled` must be enabled for Redis (cluster mode enabled) replication groups.","CacheNodeType":"The cache node type of the Global datastore","CacheParameterGroupName":"The name of the cache parameter group to use with the Global datastore. It must be compatible with the major engine version used by the Global datastore.","EngineVersion":"The Elasticache Redis engine version.","GlobalNodeGroupCount":"The number of node groups that comprise the Global Datastore.","GlobalReplicationGroupDescription":"The optional description of the Global datastore","GlobalReplicationGroupIdSuffix":"The suffix name of a Global Datastore. The suffix guarantees uniqueness of the Global Datastore name across multiple regions.","Members":"The replication groups that comprise the Global datastore.","RegionalConfigurations":"The Regions that comprise the Global Datastore."}},"AWS::ElastiCache::GlobalReplicationGroup.GlobalReplicationGroupMember":{"attributes":{},"description":"A member of a Global datastore. It contains the Replication Group Id, the Amazon region and the role of the replication group.","properties":{"ReplicationGroupId":"The replication group id of the Global datastore member.","ReplicationGroupRegion":"The Amazon region of the Global datastore member.","Role":"Indicates the role of the replication group, `PRIMARY` or `SECONDARY` ."}},"AWS::ElastiCache::GlobalReplicationGroup.RegionalConfiguration":{"attributes":{},"description":"A list of the replication groups","properties":{"ReplicationGroupId":"The name of the secondary cluster","ReplicationGroupRegion":"The Amazon region where the cluster is stored","ReshardingConfigurations":"A list of PreferredAvailabilityZones objects that specifies the configuration of a node group in the resharded cluster."}},"AWS::ElastiCache::GlobalReplicationGroup.ReshardingConfiguration":{"attributes":{},"description":"A list of `PreferredAvailabilityZones` objects that specifies the configuration of a node group in the resharded cluster.","properties":{"NodeGroupId":"Either the ElastiCache for Redis supplied 4-digit id or a user supplied id for the node group these configuration values apply to.","PreferredAvailabilityZones":"A list of preferred availability zones for the nodes in this cluster."}},"AWS::ElastiCache::ParameterGroup":{"attributes":{"Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource name.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::ElastiCache::ParameterGroup` type creates a new cache parameter group. Cache parameter groups control the parameters for a cache cluster.","properties":{"CacheParameterGroupFamily":"The name of the cache parameter group family that this cache parameter group is compatible with.\\n\\nValid values are: `memcached1.4` | `memcached1.5` | `memcached1.6` | `redis2.6` | `redis2.8` | `redis3.2` | `redis4.0` | `redis5.0` | `redis6.x` | `redis7`","Description":"The description for this cache parameter group.","Properties":"A comma-delimited list of parameter name/value pairs.\\n\\nFor example:\\n\\n```\\n\\"Properties\\" : { \\"cas_disabled\\" : \\"1\\", \\"chunk_size_growth_factor\\" : \\"1.02\\"\\n}\\n```","Tags":"A tag that can be added to an ElastiCache parameter group. Tags are composed of a Key/Value pair. You can use tags to categorize and track all your parameter groups. A tag with a null Value is permitted."}},"AWS::ElastiCache::ReplicationGroup":{"attributes":{"ConfigurationEndPoint.Address":"The DNS hostname of the cache node.\\n\\n> Redis (cluster mode disabled) replication groups don\'t have this attribute. Therefore, `Fn::GetAtt` returns a value for this attribute only if the replication group is clustered. Otherwise, `Fn::GetAtt` fails. For Redis (cluster mode disabled) replication groups, use the `PrimaryEndpoint` or `ReadEndpoint` attributes.","ConfigurationEndPoint.Port":"The port number that the cache engine is listening on.","PrimaryEndPoint.Address":"The DNS address of the primary read-write cache node.","PrimaryEndPoint.Port":"The number of the port that the primary read-write cache engine is listening on.","ReadEndPoint.Addresses":"A string with a list of endpoints for the primary and read-only replicas. The order of the addresses maps to the order of the ports from the `ReadEndPoint.Ports` attribute.","ReadEndPoint.Addresses.List":"A string with a list of endpoints for the read-only replicas. The order of the addresses maps to the order of the ports from the `ReadEndPoint.Ports` attribute.","ReadEndPoint.Ports":"A string with a list of ports for the read-only replicas. The order of the ports maps to the order of the addresses from the `ReadEndPoint.Addresses` attribute.","ReadEndPoint.Ports.List":"A string with a list of ports for the read-only replicas. The order of the ports maps to the order of the addresses from the ReadEndPoint.Addresses attribute.","ReaderEndPoint.Address":"The address of the reader endpoint.","ReaderEndPoint.Port":"The port used by the reader endpoint.","Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, Ref returns the resource name.\\n\\nFor more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::ElastiCache::ReplicationGroup` resource creates an Amazon ElastiCache Redis replication group. A Redis (cluster mode disabled) replication group is a collection of cache clusters, where one of the clusters is a primary read-write cluster and the others are read-only replicas.\\n\\nA Redis (cluster mode enabled) cluster is comprised of from 1 to 90 shards (API/CLI: node groups). Each shard has a primary node and up to 5 read-only replica nodes. The configuration can range from 90 shards and 0 replicas to 15 shards and 5 replicas, which is the maximum number or replicas allowed.\\n\\nThe node or shard limit can be increased to a maximum of 500 per cluster if the Redis engine version is 5.0.6 or higher. For example, you can choose to configure a 500 node cluster that ranges between 83 shards (one primary and 5 replicas per shard) and 500 shards (single primary and no replicas). Make sure there are enough available IP addresses to accommodate the increase. Common pitfalls include the subnets in the subnet group have too small a CIDR range or the subnets are shared and heavily used by other clusters. For more information, see [Creating a Subnet Group](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/SubnetGroups.Creating.html) . For versions below 5.0.6, the limit is 250 per cluster.\\n\\nTo request a limit increase, see [Amazon Service Limits](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html) and choose the limit type *Nodes per cluster per instance type* .","properties":{"AtRestEncryptionEnabled":"A flag that enables encryption at rest when set to `true` .\\n\\nYou cannot modify the value of `AtRestEncryptionEnabled` after the replication group is created. To enable encryption at rest on a replication group you must set `AtRestEncryptionEnabled` to `true` when you create the replication group.\\n\\n*Required:* Only available when creating a replication group in an Amazon VPC using redis version `3.2.6` or `4.x` onward.\\n\\nDefault: `false`","AuthToken":"*Reserved parameter.* The password used to access a password protected server.\\n\\n`AuthToken` can be specified only on replication groups where `TransitEncryptionEnabled` is `true` . For more information, see [Authenticating Users with the Redis AUTH Command](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/auth.html) .\\n\\n> For HIPAA compliance, you must specify `TransitEncryptionEnabled` as `true` , an `AuthToken` , and a `CacheSubnetGroup` . \\n\\nPassword constraints:\\n\\n- Must be only printable ASCII characters.\\n- Must be at least 16 characters and no more than 128 characters in length.\\n- Nonalphanumeric characters are restricted to (!, &, #, $, ^, <, >, -, ).\\n\\nFor more information, see [AUTH password](https://docs.aws.amazon.com/http://redis.io/commands/AUTH) at http://redis.io/commands/AUTH.\\n\\n> If ADDING the AuthToken, update requires [Replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","AutoMinorVersionUpgrade":"If you are running Redis engine version 6.0 or later, set this parameter to yes if you want to opt-in to the next minor version upgrade campaign. This parameter is disabled for previous versions.","AutomaticFailoverEnabled":"Specifies whether a read-only replica is automatically promoted to read/write primary if the existing primary fails.\\n\\n`AutomaticFailoverEnabled` must be enabled for Redis (cluster mode enabled) replication groups.\\n\\nDefault: false","CacheNodeType":"The compute and memory capacity of the nodes in the node group (shard).\\n\\nThe following node types are supported by ElastiCache. Generally speaking, the current generation types provide more memory and computational power at lower cost when compared to their equivalent previous generation counterparts.\\n\\n- General purpose:\\n\\n- Current generation:\\n\\n*M6g node types:* `cache.m6g.large` , `cache.m6g.xlarge` , `cache.m6g.2xlarge` , `cache.m6g.4xlarge` , `cache.m6g.12xlarge` , `cache.m6g.24xlarge`\\n\\n*M5 node types:* `cache.m5.large` , `cache.m5.xlarge` , `cache.m5.2xlarge` , `cache.m5.4xlarge` , `cache.m5.12xlarge` , `cache.m5.24xlarge`\\n\\n*M4 node types:* `cache.m4.large` , `cache.m4.xlarge` , `cache.m4.2xlarge` , `cache.m4.4xlarge` , `cache.m4.10xlarge`\\n\\n*T4g node types:* `cache.t4g.micro` , `cache.t4g.small` , `cache.t4g.medium`\\n\\n*T3 node types:* `cache.t3.micro` , `cache.t3.small` , `cache.t3.medium`\\n\\n*T2 node types:* `cache.t2.micro` , `cache.t2.small` , `cache.t2.medium`\\n- Previous generation: (not recommended)\\n\\n*T1 node types:* `cache.t1.micro`\\n\\n*M1 node types:* `cache.m1.small` , `cache.m1.medium` , `cache.m1.large` , `cache.m1.xlarge`\\n\\n*M3 node types:* `cache.m3.medium` , `cache.m3.large` , `cache.m3.xlarge` , `cache.m3.2xlarge`\\n- Compute optimized:\\n\\n- Previous generation: (not recommended)\\n\\n*C1 node types:* `cache.c1.xlarge`\\n- Memory optimized:\\n\\n- Current generation:\\n\\n*R6gd node types:* `cache.r6gd.xlarge` , `cache.r6gd.2xlarge` , `cache.r6gd.4xlarge` , `cache.r6gd.8xlarge` , `cache.r6gd.12xlarge` , `cache.r6gd.16xlarge`\\n\\n> The `r6gd` family is available in the following regions: `us-east-2` , `us-east-1` , `us-west-2` , `us-west-1` , `eu-west-1` , `eu-central-1` , `ap-northeast-1` , `ap-southeast-1` , `ap-southeast-2` . \\n\\n*R6g node types:* `cache.r6g.large` , `cache.r6g.xlarge` , `cache.r6g.2xlarge` , `cache.r6g.4xlarge` , `cache.r6g.12xlarge` , `cache.r6g.24xlarge`\\n\\n*R5 node types:* `cache.r5.large` , `cache.r5.xlarge` , `cache.r5.2xlarge` , `cache.r5.4xlarge` , `cache.r5.12xlarge` , `cache.r5.24xlarge`\\n\\n*R4 node types:* `cache.r4.large` , `cache.r4.xlarge` , `cache.r4.2xlarge` , `cache.r4.4xlarge` , `cache.r4.8xlarge` , `cache.r4.16xlarge`\\n- Previous generation: (not recommended)\\n\\n*M2 node types:* `cache.m2.xlarge` , `cache.m2.2xlarge` , `cache.m2.4xlarge`\\n\\n*R3 node types:* `cache.r3.large` , `cache.r3.xlarge` , `cache.r3.2xlarge` , `cache.r3.4xlarge` , `cache.r3.8xlarge`\\n\\nFor region availability, see [Supported Node Types by Amazon Region](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/CacheNodes.SupportedTypes.html#CacheNodes.SupportedTypesByRegion)","CacheParameterGroupName":"The name of the parameter group to associate with this replication group. If this argument is omitted, the default cache parameter group for the specified engine is used.\\n\\nIf you are running Redis version 3.2.4 or later, only one node group (shard), and want to use a default parameter group, we recommend that you specify the parameter group by name.\\n\\n- To create a Redis (cluster mode disabled) replication group, use `CacheParameterGroupName=default.redis3.2` .\\n- To create a Redis (cluster mode enabled) replication group, use `CacheParameterGroupName=default.redis3.2.cluster.on` .","CacheSecurityGroupNames":"A list of cache security group names to associate with this replication group.","CacheSubnetGroupName":"The name of the cache subnet group to be used for the replication group.\\n\\n> If you\'re going to launch your cluster in an Amazon VPC, you need to create a subnet group before you start creating a cluster. For more information, see [AWS::ElastiCache::SubnetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-subnetgroup.html) .","ClusterMode":"Enabled or Disabled. To modify cluster mode from Disabled to Enabled, you must first set the cluster mode to Compatible. Compatible mode allows your Redis clients to connect using both cluster mode enabled and cluster mode disabled. After you migrate all Redis clients to use cluster mode enabled, you can then complete cluster mode configuration and set the cluster mode to Enabled. For more information, see [Modify cluster mode](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/modify-cluster-mode.html) .","DataTieringEnabled":"Enables data tiering. Data tiering is only supported for replication groups using the r6gd node type. This parameter must be set to true when using r6gd nodes. For more information, see [Data tiering](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/data-tiering.html) .","Engine":"The name of the cache engine to be used for the clusters in this replication group. The value must be set to `Redis` .","EngineVersion":"The version number of the cache engine to be used for the clusters in this replication group. To view the supported cache engine versions, use the `DescribeCacheEngineVersions` operation.\\n\\n*Important:* You can upgrade to a newer engine version (see [Selecting a Cache Engine and Version](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/SelectEngine.html#VersionManagement) ) in the *ElastiCache User Guide* , but you cannot downgrade to an earlier engine version. If you want to use an earlier engine version, you must delete the existing cluster or replication group and create it anew with the earlier engine version.","GlobalReplicationGroupId":"The name of the Global datastore","IpDiscovery":"The network type you choose when creating a replication group, either `ipv4` | `ipv6` . IPv6 is supported for workloads using Redis engine version 6.2 onward or Memcached engine version 1.6.6 on all instances built on the [Nitro system](https://docs.aws.amazon.com/ec2/nitro/) .","KmsKeyId":"The ID of the KMS key used to encrypt the disk on the cluster.","LogDeliveryConfigurations":"Specifies the destination, format and type of the logs.","MultiAZEnabled":"A flag indicating if you have Multi-AZ enabled to enhance fault tolerance. For more information, see [Minimizing Downtime: Multi-AZ](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/AutoFailover.html) .","NetworkType":"Must be either `ipv4` | `ipv6` | `dual_stack` . IPv6 is supported for workloads using Redis engine version 6.2 onward or Memcached engine version 1.6.6 on all instances built on the [Nitro system](https://docs.aws.amazon.com/ec2/nitro/) .","NodeGroupConfiguration":"`NodeGroupConfiguration` is a property of the `AWS::ElastiCache::ReplicationGroup` resource that configures an Amazon ElastiCache (ElastiCache) Redis cluster node group.\\n\\nIf you set [UseOnlineResharding](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html#cfn-attributes-updatepolicy-useonlineresharding) to `true` , you can update `NodeGroupConfiguration` without interruption. When `UseOnlineResharding` is set to `false` , or is not specified, updating `NodeGroupConfiguration` results in [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","NotificationTopicArn":"The Amazon Resource Name (ARN) of the Amazon Simple Notification Service (SNS) topic to which notifications are sent.\\n\\n> The Amazon SNS topic owner must be the same as the cluster owner.","NumCacheClusters":"The number of clusters this replication group initially has.\\n\\nThis parameter is not used if there is more than one node group (shard). You should use `ReplicasPerNodeGroup` instead.\\n\\nIf `AutomaticFailoverEnabled` is `true` , the value of this parameter must be at least 2. If `AutomaticFailoverEnabled` is `false` you can omit this parameter (it will default to 1), or you can explicitly set it to a value between 2 and 6.\\n\\nThe maximum permitted value for `NumCacheClusters` is 6 (1 primary plus 5 replicas).","NumNodeGroups":"An optional parameter that specifies the number of node groups (shards) for this Redis (cluster mode enabled) replication group. For Redis (cluster mode disabled) either omit this parameter or set it to 1.\\n\\nIf you set [UseOnlineResharding](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html#cfn-attributes-updatepolicy-useonlineresharding) to `true` , you can update `NumNodeGroups` without interruption. When `UseOnlineResharding` is set to `false` , or is not specified, updating `NumNodeGroups` results in [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .\\n\\nDefault: 1","Port":"The port number on which each member of the replication group accepts connections.","PreferredCacheClusterAZs":"A list of EC2 Availability Zones in which the replication group\'s clusters are created. The order of the Availability Zones in the list is the order in which clusters are allocated. The primary cluster is created in the first AZ in the list.\\n\\nThis parameter is not used if there is more than one node group (shard). You should use `NodeGroupConfiguration` instead.\\n\\n> If you are creating your replication group in an Amazon VPC (recommended), you can only locate clusters in Availability Zones associated with the subnets in the selected subnet group.\\n> \\n> The number of Availability Zones listed must equal the value of `NumCacheClusters` . \\n\\nDefault: system chosen Availability Zones.","PreferredMaintenanceWindow":"Specifies the weekly time range during which maintenance on the cluster is performed. It is specified as a range in the format ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window is a 60 minute period.\\n\\nValid values for `ddd` are:\\n\\n- `sun`\\n- `mon`\\n- `tue`\\n- `wed`\\n- `thu`\\n- `fri`\\n- `sat`\\n\\nExample: `sun:23:00-mon:01:30`","PrimaryClusterId":"The identifier of the cluster that serves as the primary for this replication group. This cluster must already exist and have a status of `available` .\\n\\nThis parameter is not required if `NumCacheClusters` , `NumNodeGroups` , or `ReplicasPerNodeGroup` is specified.","ReplicasPerNodeGroup":"An optional parameter that specifies the number of replica nodes in each node group (shard). Valid values are 0 to 5.","ReplicationGroupDescription":"A user-created description for the replication group.","ReplicationGroupId":"The replication group identifier. This parameter is stored as a lowercase string.\\n\\nConstraints:\\n\\n- A name must contain from 1 to 40 alphanumeric characters or hyphens.\\n- The first character must be a letter.\\n- A name cannot end with a hyphen or contain two consecutive hyphens.","SecurityGroupIds":"One or more Amazon VPC security groups associated with this replication group.\\n\\nUse this parameter only when you are creating a replication group in an Amazon Virtual Private Cloud (Amazon VPC).","SnapshotArns":"A list of Amazon Resource Names (ARN) that uniquely identify the Redis RDB snapshot files stored in Amazon S3. The snapshot files are used to populate the new replication group. The Amazon S3 object name in the ARN cannot contain any commas. The new replication group will have the number of node groups (console: shards) specified by the parameter *NumNodeGroups* or the number of node groups configured by *NodeGroupConfiguration* regardless of the number of ARNs specified here.\\n\\nExample of an Amazon S3 ARN: `arn:aws:s3:::my_bucket/snapshot1.rdb`","SnapshotName":"The name of a snapshot from which to restore data into the new replication group. The snapshot status changes to `restoring` while the new replication group is being created.","SnapshotRetentionLimit":"The number of days for which ElastiCache retains automatic snapshots before deleting them. For example, if you set `SnapshotRetentionLimit` to 5, a snapshot that was taken today is retained for 5 days before being deleted.\\n\\nDefault: 0 (i.e., automatic backups are disabled for this cluster).","SnapshotWindow":"The daily time range (in UTC) during which ElastiCache begins taking a daily snapshot of your node group (shard).\\n\\nExample: `05:00-09:00`\\n\\nIf you do not specify this parameter, ElastiCache automatically chooses an appropriate time range.","SnapshottingClusterId":"The cluster ID that is used as the daily snapshot source for the replication group. This parameter cannot be set for Redis (cluster mode enabled) replication groups.","Tags":"A list of tags to be added to this resource. Tags are comma-separated key,value pairs (e.g. Key= `myKey` , Value= `myKeyValue` . You can include multiple tags as shown following: Key= `myKey` , Value= `myKeyValue` Key= `mySecondKey` , Value= `mySecondKeyValue` . Tags on replication groups will be replicated to all nodes.","TransitEncryptionEnabled":"A flag that enables in-transit encryption when set to `true` .\\n\\nYou cannot modify the value of `TransitEncryptionEnabled` after the cluster is created. To enable in-transit encryption on a cluster you must set `TransitEncryptionEnabled` to `true` when you create a cluster.\\n\\nThis parameter is valid only if the `Engine` parameter is `redis` , the `EngineVersion` parameter is `3.2.6` or `4.x` onward, and the cluster is being created in an Amazon VPC.\\n\\nIf you enable in-transit encryption, you must also specify a value for `CacheSubnetGroup` .\\n\\n*Required:* Only available when creating a replication group in an Amazon VPC using redis version `3.2.6` or `4.x` onward.\\n\\nDefault: `false`\\n\\n> For HIPAA compliance, you must specify `TransitEncryptionEnabled` as `true` , an `AuthToken` , and a `CacheSubnetGroup` .","TransitEncryptionMode":"A setting that allows you to migrate your clients to use in-transit encryption, with no downtime.\\n\\nWhen setting `TransitEncryptionEnabled` to `true` , you can set your `TransitEncryptionMode` to `preferred` in the same request, to allow both encrypted and unencrypted connections at the same time. Once you migrate all your Redis clients to use encrypted connections you can modify the value to `required` to allow encrypted connections only.\\n\\nSetting `TransitEncryptionMode` to `required` is a two-step process that requires you to first set the `TransitEncryptionMode` to `preferred` , after that you can set `TransitEncryptionMode` to `required` .\\n\\nThis process will not trigger the replacement of the replication group.","UserGroupIds":"The ID of user group to associate with the replication group."}},"AWS::ElastiCache::ReplicationGroup.CloudWatchLogsDestinationDetails":{"attributes":{},"description":"The configuration details of the CloudWatch Logs destination. Note that this field is marked as required but only if CloudWatch Logs was chosen as the destination.","properties":{"LogGroup":"The name of the CloudWatch Logs log group."}},"AWS::ElastiCache::ReplicationGroup.DestinationDetails":{"attributes":{},"description":"Configuration details of either a CloudWatch Logs destination or Kinesis Data Firehose destination.","properties":{"CloudWatchLogsDetails":"The configuration details of the CloudWatch Logs destination. Note that this field is marked as required but only if CloudWatch Logs was chosen as the destination.","KinesisFirehoseDetails":"The configuration details of the Kinesis Data Firehose destination. Note that this field is marked as required but only if Kinesis Data Firehose was chosen as the destination."}},"AWS::ElastiCache::ReplicationGroup.KinesisFirehoseDestinationDetails":{"attributes":{},"description":"The configuration details of the Kinesis Data Firehose destination. Note that this field is marked as required but only if Kinesis Data Firehose was chosen as the destination.","properties":{"DeliveryStream":"The name of the Kinesis Data Firehose delivery stream."}},"AWS::ElastiCache::ReplicationGroup.LogDeliveryConfigurationRequest":{"attributes":{},"description":"Specifies the destination, format and type of the logs.","properties":{"DestinationDetails":"Configuration details of either a CloudWatch Logs destination or Kinesis Data Firehose destination.","DestinationType":"Specify either CloudWatch Logs or Kinesis Data Firehose as the destination type. Valid values are either `cloudwatch-logs` or `kinesis-firehose` .","LogFormat":"Valid values are either `json` or `text` .","LogType":"Valid value is either `slow-log` , which refers to [slow-log](https://docs.aws.amazon.com/https://redis.io/commands/slowlog) or `engine-log` ."}},"AWS::ElastiCache::ReplicationGroup.NodeGroupConfiguration":{"attributes":{},"description":"`NodeGroupConfiguration` is a property of the `AWS::ElastiCache::ReplicationGroup` resource that configures an Amazon ElastiCache (ElastiCache) Redis cluster node group.","properties":{"NodeGroupId":"Either the ElastiCache for Redis supplied 4-digit id or a user supplied id for the node group these configuration values apply to.","PrimaryAvailabilityZone":"The Availability Zone where the primary node of this node group (shard) is launched.","ReplicaAvailabilityZones":"A list of Availability Zones to be used for the read replicas. The number of Availability Zones in this list must match the value of `ReplicaCount` or `ReplicasPerNodeGroup` if not specified.","ReplicaCount":"The number of read replica nodes in this node group (shard).","Slots":"A string of comma-separated values where the first set of values are the slot numbers (zero based), and the second set of values are the keyspaces for each slot. The following example specifies three slots (numbered 0, 1, and 2): `0,1,2,0-4999,5000-9999,10000-16,383` .\\n\\nIf you don\'t specify a value, ElastiCache allocates keys equally among each slot.\\n\\nWhen you use an `UseOnlineResharding` update policy to update the number of node groups without interruption, ElastiCache evenly distributes the keyspaces between the specified number of slots. This cannot be updated later. Therefore, after updating the number of node groups in this way, you should remove the value specified for the `Slots` property of each `NodeGroupConfiguration` from the stack template, as it no longer reflects the actual values in each node group. For more information, see [UseOnlineResharding Policy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html#cfn-attributes-updatepolicy-useonlineresharding) ."}},"AWS::ElastiCache::SecurityGroup":{"attributes":{"Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource name.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::ElastiCache::SecurityGroup` resource creates a cache security group. For more information about cache security groups, go to [CacheSecurityGroups](https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/VPCs.html) in the *Amazon ElastiCache User Guide* or go to [CreateCacheSecurityGroup](https://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheSecurityGroup.html) in the *Amazon ElastiCache API Reference Guide* .\\n\\nFor more information, see [CreateCacheSubnetGroup](https://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheSubnetGroup.html) .","properties":{"Description":"A description for the cache security group.","Tags":"A tag that can be added to an ElastiCache security group. Tags are composed of a Key/Value pair. You can use tags to categorize and track all your security groups. A tag with a null Value is permitted."}},"AWS::ElastiCache::SecurityGroupIngress":{"attributes":{"Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource name.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The AWS::ElastiCache::SecurityGroupIngress type authorizes ingress to a cache security group from hosts in specified Amazon EC2 security groups. For more information about ElastiCache security group ingress, go to [AuthorizeCacheSecurityGroupIngress](https://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_AuthorizeCacheSecurityGroupIngress.html) in the *Amazon ElastiCache API Reference Guide* .\\n\\n> Updates are not supported.","properties":{"CacheSecurityGroupName":"The name of the Cache Security Group to authorize.","EC2SecurityGroupName":"Name of the EC2 Security Group to include in the authorization.","EC2SecurityGroupOwnerId":"Specifies the Amazon Account ID of the owner of the EC2 security group specified in the EC2SecurityGroupName property. The Amazon access key ID is not an acceptable value."}},"AWS::ElastiCache::SubnetGroup":{"attributes":{"Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, Ref returns the resource name.\\n\\nFor more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates a cache subnet group. For more information about cache subnet groups, go to Cache Subnet Groups in the *Amazon ElastiCache User Guide* or go to [CreateCacheSubnetGroup](https://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_CreateCacheSubnetGroup.html) in the *Amazon ElastiCache API Reference Guide* .","properties":{"CacheSubnetGroupName":"The name for the cache subnet group. This value is stored as a lowercase string.\\n\\nConstraints: Must contain no more than 255 alphanumeric characters or hyphens.\\n\\nExample: `mysubnetgroup`","Description":"The description for the cache subnet group.","SubnetIds":"The EC2 subnet IDs for the cache subnet group.","Tags":"A tag that can be added to an ElastiCache subnet group. Tags are composed of a Key/Value pair. You can use tags to categorize and track all your subnet groups. A tag with a null Value is permitted."}},"AWS::ElastiCache::User":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the user.","Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource name.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) .","Status":"Indicates the user status. Can be \\"active\\", \\"modifying\\" or \\"deleting\\"."},"description":"For Redis engine version 6.0 onwards: Creates a Redis user. For more information, see [Using Role Based Access Control (RBAC)](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Clusters.RBAC.html) .","properties":{"AccessString":"Access permissions string used for this user.","AuthenticationMode":"Specifies the authentication mode to use. Below is an example of the possible JSON values:\\n\\n```\\n{ Type: Passwords: [\\"*****\\", \\"******\\"] // If Type is password.\\n}\\n```","Engine":"The current supported value is redis.","NoPasswordRequired":"Indicates a password is not required for this user.","Passwords":"Passwords used for this user. You can create up to two passwords for each user.","Tags":"","UserId":"The ID of the user.","UserName":"The username of the user."}},"AWS::ElastiCache::User.AuthenticationMode":{"attributes":{},"description":"Specifies the authentication mode to use.","properties":{"Passwords":"Specifies the passwords to use for authentication if `Type` is set to `password` .","Type":"Specifies the authentication type. Possible options are IAM authentication, password and no password."}},"AWS::ElastiCache::UserGroup":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the user group.","Ref":"When the logical ID of this resource is provided to the `Ref` intrinsic function, `Ref` returns the resource name.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) .","Status":"Indicates user group status. Can be \\"creating\\", \\"active\\", \\"modifying\\", \\"deleting\\"."},"description":"For Redis engine version 6.0 onwards: Creates a Redis user group. For more information, see [Using Role Based Access Control (RBAC)](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Clusters.RBAC.html)","properties":{"Engine":"The current supported value is redis.","Tags":"","UserGroupId":"The ID of the user group.","UserIds":"The list of user IDs that belong to the user group. A user named `default` must be included."}},"AWS::ElasticBeanstalk::Application":{"attributes":{"Ref":""},"description":"Specify an AWS Elastic Beanstalk application by using the AWS::ElasticBeanstalk::Application resource in an AWS CloudFormation template. \\n\\nThe AWS::ElasticBeanstalk::Application resource is an AWS Elastic Beanstalk Beanstalk resource type that specifies an Elastic Beanstalk application.","properties":{"ApplicationName":"A name for the Elastic Beanstalk application. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the application name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","Description":"Your description of the application.","ResourceLifecycleConfig":"Specifies an application resource lifecycle configuration to prevent your application from accumulating too many versions."}},"AWS::ElasticBeanstalk::Application.ApplicationResourceLifecycleConfig":{"attributes":{},"description":"Use the `ApplicationResourceLifecycleConfig` property type to specify lifecycle settings for resources that belong to an AWS Elastic Beanstalk application when defining an AWS::ElasticBeanstalk::Application resource in an AWS CloudFormation template. \\n\\nThe resource lifecycle configuration for an application. Defines lifecycle settings for resources that belong to the application, and the service role that Elastic Beanstalk assumes in order to apply lifecycle settings. The version lifecycle configuration defines lifecycle settings for application versions.\\n\\n`ApplicationResourceLifecycleConfig` is a property of the [AWS::ElasticBeanstalk::Application](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-beanstalk.html) resource.","properties":{"ServiceRole":"The ARN of an IAM service role that Elastic Beanstalk has permission to assume.\\n\\nThe `ServiceRole` property is required the first time that you provide a `ResourceLifecycleConfig` for the application. After you provide it once, Elastic Beanstalk persists the Service Role with the application, and you don\'t need to specify it again. You can, however, specify it in subsequent updates to change the Service Role to another value.","VersionLifecycleConfig":"Defines lifecycle settings for application versions."}},"AWS::ElasticBeanstalk::Application.ApplicationVersionLifecycleConfig":{"attributes":{},"description":"Use the `ApplicationVersionLifecycleConfig` property type to specify application version lifecycle settings for an AWS Elastic Beanstalk application when defining an AWS::ElasticBeanstalk::Application resource in an AWS CloudFormation template. \\n\\nThe application version lifecycle settings for an application. Defines the rules that Elastic Beanstalk applies to an application\'s versions in order to avoid hitting the per-region limit for application versions.\\n\\nWhen Elastic Beanstalk deletes an application version from its database, you can no longer deploy that version to an environment. The source bundle remains in S3 unless you configure the rule to delete it.\\n\\n`ApplicationVersionLifecycleConfig` is a property of the [ApplicationResourceLifecycleConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-applicationresourcelifecycleconfig.html) property type.","properties":{"MaxAgeRule":"Specify a max age rule to restrict the length of time that application versions are retained for an application.","MaxCountRule":"Specify a max count rule to restrict the number of application versions that are retained for an application."}},"AWS::ElasticBeanstalk::Application.MaxAgeRule":{"attributes":{},"description":"Use the `MaxAgeRule` property type to specify a max age rule to restrict the length of time that application versions are retained for an AWS Elastic Beanstalk application when defining an AWS::ElasticBeanstalk::Application resource in an AWS CloudFormation template. \\n\\nA lifecycle rule that deletes application versions after the specified number of days.\\n\\n`MaxAgeRule` is a property of the [ApplicationVersionLifecycleConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-applicationversionlifecycleconfig.html) property type.","properties":{"DeleteSourceFromS3":"Set to `true` to delete a version\'s source bundle from Amazon S3 when Elastic Beanstalk deletes the application version.","Enabled":"Specify `true` to apply the rule, or `false` to disable it.","MaxAgeInDays":"Specify the number of days to retain an application versions."}},"AWS::ElasticBeanstalk::Application.MaxCountRule":{"attributes":{},"description":"Use the `MaxAgeRule` property type to specify a max count rule to restrict the number of application versions that are retained for an AWS Elastic Beanstalk application when defining an AWS::ElasticBeanstalk::Application resource in an AWS CloudFormation template. \\n\\nA lifecycle rule that deletes the oldest application version when the maximum count is exceeded.\\n\\n`MaxCountRule` is a property of the [ApplicationVersionLifecycleConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-applicationversionlifecycleconfig.html) property type.","properties":{"DeleteSourceFromS3":"Set to `true` to delete a version\'s source bundle from Amazon S3 when Elastic Beanstalk deletes the application version.","Enabled":"Specify `true` to apply the rule, or `false` to disable it.","MaxCount":"Specify the maximum number of application versions to retain."}},"AWS::ElasticBeanstalk::ApplicationVersion":{"attributes":{"Id":"","Ref":""},"description":"Specify an AWS Elastic Beanstalk application version by using the AWS::ElasticBeanstalk::ApplicationVersion resource in an AWS CloudFormation template. \\n\\nThe AWS::ElasticBeanstalk::ApplicationVersion resource is an AWS Elastic Beanstalk resource type that specifies an application version, an iteration of deployable code, for an Elastic Beanstalk application.\\n\\n> After you create an application version with a specified Amazon S3 bucket and key location, you can\'t change that Amazon S3 location. If you change the Amazon S3 location, an attempt to launch an environment from the application version will fail.","properties":{"ApplicationName":"The name of the Elastic Beanstalk application that is associated with this application version.","Description":"A description of this application version.","SourceBundle":"The Amazon S3 bucket and key that identify the location of the source bundle for this version.\\n\\n> The Amazon S3 bucket must be in the same region as the environment."}},"AWS::ElasticBeanstalk::ApplicationVersion.SourceBundle":{"attributes":{},"description":"Use the `SourceBundle` property type to specify the Amazon S3 location of the source bundle for an AWS Elastic Beanstalk application version when defining an AWS::ElasticBeanstalk::ApplicationVersion resource in an AWS CloudFormation template. \\n\\nThe `SourceBundle` property is an embedded property of the [AWS::ElasticBeanstalk::ApplicationVersion](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-beanstalk-sourcebundle.html) resource. It specifies the Amazon S3 location of the source bundle for an AWS Elastic Beanstalk application version.","properties":{"S3Bucket":"The Amazon S3 bucket where the data is located.","S3Key":"The Amazon S3 key where the data is located."}},"AWS::ElasticBeanstalk::ConfigurationTemplate":{"attributes":{"Ref":"","TemplateName":""},"description":"Specify an AWS Elastic Beanstalk configuration template by using the AWS::ElasticBeanstalk::ConfigurationTemplate resource in an AWS CloudFormation template. \\n\\nThe AWS::ElasticBeanstalk::ConfigurationTemplate resource is an AWS Elastic Beanstalk resource type that specifies an Elastic Beanstalk configuration template, associated with a specific Elastic Beanstalk application. You define application configuration settings in a configuration template. You can then use the configuration template to deploy different versions of the application with the same configuration settings.\\n\\n> The Elastic Beanstalk console and documentation often refer to configuration templates as *saved configurations* . When you set configuration options in a saved configuration (configuration template), Elastic Beanstalk applies them with a particular precedence as part of applying options from multiple sources. For more information, see [Configuration Options](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options.html) in the *AWS Elastic Beanstalk Developer Guide* .","properties":{"ApplicationName":"The name of the Elastic Beanstalk application to associate with this configuration template.","Description":"An optional description for this configuration.","EnvironmentId":"The ID of an environment whose settings you want to use to create the configuration template. You must specify `EnvironmentId` if you don\'t specify `PlatformArn` , `SolutionStackName` , or `SourceConfiguration` .","OptionSettings":"Option values for the Elastic Beanstalk configuration, such as the instance type. If specified, these values override the values obtained from the solution stack or the source configuration template. For a complete list of Elastic Beanstalk configuration options, see [Option Values](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options.html) in the *AWS Elastic Beanstalk Developer Guide* .","PlatformArn":"The Amazon Resource Name (ARN) of the custom platform. For more information, see [Custom Platforms](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platforms.html) in the *AWS Elastic Beanstalk Developer Guide* .\\n\\n> If you specify `PlatformArn` , then don\'t specify `SolutionStackName` .","SolutionStackName":"The name of an Elastic Beanstalk solution stack (platform version) that this configuration uses. For example, `64bit Amazon Linux 2013.09 running Tomcat 7 Java 7` . A solution stack specifies the operating system, runtime, and application server for a configuration template. It also determines the set of configuration options as well as the possible and default values. For more information, see [Supported Platforms](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/concepts.platforms.html) in the *AWS Elastic Beanstalk Developer Guide* .\\n\\nYou must specify `SolutionStackName` if you don\'t specify `PlatformArn` , `EnvironmentId` , or `SourceConfiguration` .\\n\\nUse the [`ListAvailableSolutionStacks`](https://docs.aws.amazon.com/elasticbeanstalk/latest/api/API_ListAvailableSolutionStacks.html) API to obtain a list of available solution stacks.","SourceConfiguration":"An Elastic Beanstalk configuration template to base this one on. If specified, Elastic Beanstalk uses the configuration values from the specified configuration template to create a new configuration.\\n\\nValues specified in `OptionSettings` override any values obtained from the `SourceConfiguration` .\\n\\nYou must specify `SourceConfiguration` if you don\'t specify `PlatformArn` , `EnvironmentId` , or `SolutionStackName` .\\n\\nConstraint: If both solution stack name and source configuration are specified, the solution stack of the source configuration template must match the specified solution stack name."}},"AWS::ElasticBeanstalk::ConfigurationTemplate.ConfigurationOptionSetting":{"attributes":{},"description":"Use the `ConfigurationOptionSetting` property type to specify an option for an AWS Elastic Beanstalk configuration template when defining an AWS::ElasticBeanstalk::ConfigurationTemplate resource in an AWS CloudFormation template. \\n\\nThe `ConfigurationOptionSetting` property type specifies an option for an AWS Elastic Beanstalk configuration template.\\n\\nThe `OptionSettings` property of the [AWS::ElasticBeanstalk::ConfigurationTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-beanstalk-configurationtemplate.html) resource contains a list of `ConfigurationOptionSetting` property types.\\n\\nFor a list of possible namespaces and option values, see [Option Values](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options.html) in the *AWS Elastic Beanstalk Developer Guide* .","properties":{"Namespace":"A unique namespace that identifies the option\'s associated AWS resource.","OptionName":"The name of the configuration option.","ResourceName":"A unique resource name for the option setting. Use it for a time–based scaling configuration option.","Value":"The current value for the configuration option."}},"AWS::ElasticBeanstalk::ConfigurationTemplate.SourceConfiguration":{"attributes":{},"description":"Use the `SourceConfiguration` property type to specify another AWS Elastic Beanstalk configuration template as the base to creating a new AWS::ElasticBeanstalk::ConfigurationTemplate resource in an AWS CloudFormation template. \\n\\nAn AWS Elastic Beanstalk configuration template to base a new one on. You can use it to define a [AWS::ElasticBeanstalk::ConfigurationTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-beanstalk-configurationtemplate.html) resource.","properties":{"ApplicationName":"The name of the application associated with the configuration.","TemplateName":"The name of the configuration template."}},"AWS::ElasticBeanstalk::Environment":{"attributes":{"EndpointURL":"For load-balanced, autoscaling environments, the URL to the load balancer. For single-instance environments, the IP address of the instance.\\n\\nExample load balancer URL:\\n\\nExample instance IP address:\\n\\n`192.0.2.0`","Ref":""},"description":"Specify an AWS Elastic Beanstalk environment by using the AWS::ElasticBeanstalk::Environment resource in an AWS CloudFormation template. \\n\\nThe AWS::ElasticBeanstalk::Environment resource is an AWS Elastic Beanstalk resource type that specifies an Elastic Beanstalk environment.","properties":{"ApplicationName":"The name of the application that is associated with this environment.","CNAMEPrefix":"If specified, the environment attempts to use this value as the prefix for the CNAME in your Elastic Beanstalk environment URL. If not specified, the CNAME is generated automatically by appending a random alphanumeric string to the environment name.","Description":"Your description for this environment.","EnvironmentName":"A unique name for the environment.\\n\\nConstraint: Must be from 4 to 40 characters in length. The name can contain only letters, numbers, and hyphens. It can\'t start or end with a hyphen. This name must be unique within a region in your account.\\n\\nIf you don\'t specify the `CNAMEPrefix` parameter, the environment name becomes part of the CNAME, and therefore part of the visible URL for your application.\\n\\nIf you don\'t specify an environment name, AWS CloudFormation generates a unique physical ID and uses that ID for the environment name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","OperationsRole":"> The operations role feature of AWS Elastic Beanstalk is in beta release and is subject to change. \\n\\nThe Amazon Resource Name (ARN) of an existing IAM role to be used as the environment\'s operations role. If specified, Elastic Beanstalk uses the operations role for permissions to downstream services during this call and during subsequent calls acting on this environment. To specify an operations role, you must have the `iam:PassRole` permission for the role.","OptionSettings":"Key-value pairs defining configuration options for this environment, such as the instance type. These options override the values that are defined in the solution stack or the [configuration template](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-beanstalk-configurationtemplate.html) . If you remove any options during a stack update, the removed options retain their current values.","PlatformArn":"The Amazon Resource Name (ARN) of the custom platform to use with the environment. For more information, see [Custom Platforms](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platforms.html) in the *AWS Elastic Beanstalk Developer Guide* .\\n\\n> If you specify `PlatformArn` , don\'t specify `SolutionStackName` .","SolutionStackName":"The name of an Elastic Beanstalk solution stack (platform version) to use with the environment. If specified, Elastic Beanstalk sets the configuration values to the default values associated with the specified solution stack. For a list of current solution stacks, see [Elastic Beanstalk Supported Platforms](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html) in the *AWS Elastic Beanstalk Platforms* guide.\\n\\n> If you specify `SolutionStackName` , don\'t specify `PlatformArn` or `TemplateName` .","Tags":"Specifies the tags applied to resources in the environment.","TemplateName":"The name of the Elastic Beanstalk configuration template to use with the environment.\\n\\n> If you specify `TemplateName` , then don\'t specify `SolutionStackName` .","Tier":"Specifies the tier to use in creating this environment. The environment tier that you choose determines whether Elastic Beanstalk provisions resources to support a web application that handles HTTP(S) requests or a web application that handles background-processing tasks.","VersionLabel":"The name of the application version to deploy.\\n\\nDefault: If not specified, Elastic Beanstalk attempts to deploy the sample application."}},"AWS::ElasticBeanstalk::Environment.OptionSetting":{"attributes":{},"description":"Use the `OptionSetting` property type to specify an option for an AWS Elastic Beanstalk environment when defining an AWS::ElasticBeanstalk::Environment resource in an AWS CloudFormation template. \\n\\nThe `OptionSetting` property type specifies an option for an AWS Elastic Beanstalk environment.\\n\\nThe `OptionSettings` property of the [AWS::ElasticBeanstalk::Environment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-beanstalk-environment.html) resource contains a list of `OptionSetting` property types.\\n\\nFor a list of possible namespaces and option values, see [Option Values](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options.html) in the *AWS Elastic Beanstalk Developer Guide* .","properties":{"Namespace":"A unique namespace that identifies the option\'s associated AWS resource.","OptionName":"The name of the configuration option.","ResourceName":"A unique resource name for the option setting. Use it for a time–based scaling configuration option.","Value":"The current value for the configuration option."}},"AWS::ElasticBeanstalk::Environment.Tier":{"attributes":{},"description":"Use the `Tier` property type to specify the environment tier for an AWS Elastic Beanstalk environment when defining an AWS::ElasticBeanstalk::Environment resource in an AWS CloudFormation template. \\n\\nDescribes the environment tier for an [AWS::ElasticBeanstalk::Environment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-beanstalk-environment.html) resource. For more information, see [Environment Tiers](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html) in the *AWS Elastic Beanstalk Developer Guide* .","properties":{"Name":"The name of this environment tier.\\n\\nValid values:\\n\\n- For *Web server tier* – `WebServer`\\n- For *Worker tier* – `Worker`","Type":"The type of this environment tier.\\n\\nValid values:\\n\\n- For *Web server tier* – `Standard`\\n- For *Worker tier* – `SQS/HTTP`","Version":"The version of this environment tier. When you don\'t set a value to it, Elastic Beanstalk uses the latest compatible worker tier version.\\n\\n> This member is deprecated. Any specific version that you set may become out of date. We recommend leaving it unspecified."}},"AWS::ElasticLoadBalancing::LoadBalancer":{"attributes":{"CanonicalHostedZoneName":"The name of the Route 53 hosted zone that is associated with the load balancer. Internal-facing load balancers don\'t use this value, use `DNSName` instead.","CanonicalHostedZoneNameID":"The ID of the Route 53 hosted zone name that is associated with the load balancer.","DNSName":"The DNS name for the load balancer.","Ref":"`Ref` returns the name of the load balancer.","SourceSecurityGroup.GroupName":"The name of the security group that you can use as part of your inbound rules for your load balancer\'s back-end instances.","SourceSecurityGroup.OwnerAlias":"The owner of the source security group."},"description":"Specifies a Classic Load Balancer.\\n\\nYou can specify the `AvailabilityZones` or `Subnets` property, but not both.\\n\\nIf this resource has a public IP address and is also in a VPC that is defined in the same template, you must use the [DependsOn attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) to declare a dependency on the VPC-gateway attachment.","properties":{"AccessLoggingPolicy":"Information about where and how access logs are stored for the load balancer.","AppCookieStickinessPolicy":"Information about a policy for application-controlled session stickiness.","AvailabilityZones":"The Availability Zones for the load balancer. For load balancers in a VPC, specify `Subnets` instead.\\n\\nUpdate requires replacement if you did not previously specify an Availability Zone or if you are removing all Availability Zones. Otherwise, update requires no interruption.","ConnectionDrainingPolicy":"If enabled, the load balancer allows existing requests to complete before the load balancer shifts traffic away from a deregistered or unhealthy instance.\\n\\nFor more information, see [Configure Connection Draining](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/config-conn-drain.html) in the *Classic Load Balancers Guide* .","ConnectionSettings":"If enabled, the load balancer allows the connections to remain idle (no data is sent over the connection) for the specified duration.\\n\\nBy default, Elastic Load Balancing maintains a 60-second idle connection timeout for both front-end and back-end connections of your load balancer. For more information, see [Configure Idle Connection Timeout](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/config-idle-timeout.html) in the *Classic Load Balancers Guide* .","CrossZone":"If enabled, the load balancer routes the request traffic evenly across all instances regardless of the Availability Zones.\\n\\nFor more information, see [Configure Cross-Zone Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/enable-disable-crosszone-lb.html) in the *Classic Load Balancers Guide* .","HealthCheck":"The health check settings to use when evaluating the health of your EC2 instances.\\n\\nUpdate requires replacement if you did not previously specify health check settings or if you are removing the health check settings. Otherwise, update requires no interruption.","Instances":"The IDs of the instances for the load balancer.","LBCookieStickinessPolicy":"Information about a policy for duration-based session stickiness.","Listeners":"The listeners for the load balancer. You can specify at most one listener per port.\\n\\nIf you update the properties for a listener, AWS CloudFormation deletes the existing listener and creates a new one with the specified properties. While the new listener is being created, clients cannot connect to the load balancer.","LoadBalancerName":"The name of the load balancer. This name must be unique within your set of load balancers for the region.\\n\\nIf you don\'t specify a name, AWS CloudFormation generates a unique physical ID for the load balancer. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) . If you specify a name, you cannot perform updates that require replacement of this resource, but you can perform other updates. To replace the resource, specify a new name.","Policies":"The policies defined for your Classic Load Balancer. Specify only back-end server policies.","Scheme":"The type of load balancer. Valid only for load balancers in a VPC.\\n\\nIf `Scheme` is `internet-facing` , the load balancer has a public DNS name that resolves to a public IP address.\\n\\nIf `Scheme` is `internal` , the load balancer has a public DNS name that resolves to a private IP address.","SecurityGroups":"The security groups for the load balancer. Valid only for load balancers in a VPC.","Subnets":"The IDs of the subnets for the load balancer. You can specify at most one subnet per Availability Zone.\\n\\nUpdate requires replacement if you did not previously specify a subnet or if you are removing all subnets. Otherwise, update requires no interruption. To update to a different subnet in the current Availability Zone, you must first update to a subnet in a different Availability Zone, then update to the new subnet in the original Availability Zone.","Tags":"The tags associated with a load balancer."}},"AWS::ElasticLoadBalancing::LoadBalancer.AccessLoggingPolicy":{"attributes":{},"description":"Specifies where and how access logs are stored for your Classic Load Balancer.","properties":{"EmitInterval":"The interval for publishing the access logs. You can specify an interval of either 5 minutes or 60 minutes.\\n\\nDefault: 60 minutes","Enabled":"Specifies whether access logs are enabled for the load balancer.","S3BucketName":"The name of the Amazon S3 bucket where the access logs are stored.","S3BucketPrefix":"The logical hierarchy you created for your Amazon S3 bucket, for example `my-bucket-prefix/prod` . If the prefix is not provided, the log is placed at the root level of the bucket."}},"AWS::ElasticLoadBalancing::LoadBalancer.AppCookieStickinessPolicy":{"attributes":{},"description":"Specifies a policy for application-controlled session stickiness for your Classic Load Balancer.\\n\\nTo associate a policy with a listener, use the [PolicyNames](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-listener.html#cfn-ec2-elb-listener-policynames) property for the listener.","properties":{"CookieName":"The name of the application cookie used for stickiness.","PolicyName":"The mnemonic name for the policy being created. The name must be unique within a set of policies for this load balancer."}},"AWS::ElasticLoadBalancing::LoadBalancer.ConnectionDrainingPolicy":{"attributes":{},"description":"Specifies the connection draining settings for your Classic Load Balancer.","properties":{"Enabled":"Specifies whether connection draining is enabled for the load balancer.","Timeout":"The maximum time, in seconds, to keep the existing connections open before deregistering the instances."}},"AWS::ElasticLoadBalancing::LoadBalancer.ConnectionSettings":{"attributes":{},"description":"Specifies the idle timeout value for your Classic Load Balancer.","properties":{"IdleTimeout":"The time, in seconds, that the connection is allowed to be idle (no data has been sent over the connection) before it is closed by the load balancer."}},"AWS::ElasticLoadBalancing::LoadBalancer.HealthCheck":{"attributes":{},"description":"Specifies health check settings for your Classic Load Balancer.","properties":{"HealthyThreshold":"The number of consecutive health checks successes required before moving the instance to the `Healthy` state.","Interval":"The approximate interval, in seconds, between health checks of an individual instance.","Target":"The instance being checked. The protocol is either TCP, HTTP, HTTPS, or SSL. The range of valid ports is one (1) through 65535.\\n\\nTCP is the default, specified as a TCP: port pair, for example \\"TCP:5000\\". In this case, a health check simply attempts to open a TCP connection to the instance on the specified port. Failure to connect within the configured timeout is considered unhealthy.\\n\\nSSL is also specified as SSL: port pair, for example, SSL:5000.\\n\\nFor HTTP/HTTPS, you must include a ping path in the string. HTTP is specified as a HTTP:port;/;PathToPing; grouping, for example \\"HTTP:80/weather/us/wa/seattle\\". In this case, a HTTP GET request is issued to the instance on the given port and path. Any answer other than \\"200 OK\\" within the timeout period is considered unhealthy.\\n\\nThe total length of the HTTP ping target must be 1024 16-bit Unicode characters or less.","Timeout":"The amount of time, in seconds, during which no response means a failed health check.\\n\\nThis value must be less than the `Interval` value.","UnhealthyThreshold":"The number of consecutive health check failures required before moving the instance to the `Unhealthy` state."}},"AWS::ElasticLoadBalancing::LoadBalancer.LBCookieStickinessPolicy":{"attributes":{},"description":"Specifies a policy for duration-based session stickiness for your Classic Load Balancer.\\n\\nTo associate a policy with a listener, use the [PolicyNames](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-listener.html#cfn-ec2-elb-listener-policynames) property for the listener.","properties":{"CookieExpirationPeriod":"The time period, in seconds, after which the cookie should be considered stale. If this parameter is not specified, the stickiness session lasts for the duration of the browser session.","PolicyName":"The name of the policy. This name must be unique within the set of policies for this load balancer."}},"AWS::ElasticLoadBalancing::LoadBalancer.Listeners":{"attributes":{},"description":"Specifies a listener for your Classic Load Balancer.\\n\\nModifying any property replaces the listener.","properties":{"InstancePort":"The port on which the instance is listening.","InstanceProtocol":"The protocol to use for routing traffic to instances: HTTP, HTTPS, TCP, or SSL.\\n\\nIf the front-end protocol is TCP or SSL, the back-end protocol must be TCP or SSL. If the front-end protocol is HTTP or HTTPS, the back-end protocol must be HTTP or HTTPS.\\n\\nIf there is another listener with the same `InstancePort` whose `InstanceProtocol` is secure, (HTTPS or SSL), the listener\'s `InstanceProtocol` must also be secure.\\n\\nIf there is another listener with the same `InstancePort` whose `InstanceProtocol` is HTTP or TCP, the listener\'s `InstanceProtocol` must be HTTP or TCP.","LoadBalancerPort":"The port on which the load balancer is listening. On EC2-VPC, you can specify any port from the range 1-65535. On EC2-Classic, you can specify any port from the following list: 25, 80, 443, 465, 587, 1024-65535.","PolicyNames":"The names of the policies to associate with the listener.","Protocol":"The load balancer transport protocol to use for routing: HTTP, HTTPS, TCP, or SSL.","SSLCertificateId":"The Amazon Resource Name (ARN) of the server certificate."}},"AWS::ElasticLoadBalancing::LoadBalancer.Policies":{"attributes":{},"description":"Specifies policies for your Classic Load Balancer.\\n\\nTo associate policies with a listener, use the [PolicyNames](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-listener.html#cfn-ec2-elb-listener-policynames) property for the listener.","properties":{"Attributes":"The policy attributes.","InstancePorts":"The instance ports for the policy. Required only for some policy types.","LoadBalancerPorts":"The load balancer ports for the policy. Required only for some policy types.","PolicyName":"The name of the policy.","PolicyType":"The name of the policy type."}},"AWS::ElasticLoadBalancingV2::Listener":{"attributes":{"ListenerArn":"The Amazon Resource Name (ARN) of the listener.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the listener."},"description":"Specifies a listener for an Application Load Balancer, Network Load Balancer, or Gateway Load Balancer.","properties":{"AlpnPolicy":"[TLS listener] The name of the Application-Layer Protocol Negotiation (ALPN) policy.","Certificates":"The default SSL server certificate for a secure listener. You must provide exactly one certificate if the listener protocol is HTTPS or TLS.\\n\\nTo create a certificate list for a secure listener, use [AWS::ElasticLoadBalancingV2::ListenerCertificate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenercertificate.html) .","DefaultActions":"The actions for the default rule. You cannot define a condition for a default rule.\\n\\nTo create additional rules for an Application Load Balancer, use [AWS::ElasticLoadBalancingV2::ListenerRule](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenerrule.html) .","LoadBalancerArn":"The Amazon Resource Name (ARN) of the load balancer.","Port":"The port on which the load balancer is listening. You cannot specify a port for a Gateway Load Balancer.","Protocol":"The protocol for connections from clients to the load balancer. For Application Load Balancers, the supported protocols are HTTP and HTTPS. For Network Load Balancers, the supported protocols are TCP, TLS, UDP, and TCP_UDP. You can’t specify the UDP or TCP_UDP protocol if dual-stack mode is enabled. You cannot specify a protocol for a Gateway Load Balancer.","SslPolicy":"[HTTPS and TLS listeners] The security policy that defines which protocols and ciphers are supported.\\n\\nFor more information, see [Security policies](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html#describe-ssl-policies) in the *Application Load Balancers Guide* and [Security policies](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-tls-listener.html#describe-ssl-policies) in the *Network Load Balancers Guide* ."}},"AWS::ElasticLoadBalancingV2::Listener.Action":{"attributes":{},"description":"Specifies an action for a listener rule.","properties":{"AuthenticateCognitoConfig":"[HTTPS listeners] Information for using Amazon Cognito to authenticate users. Specify only when `Type` is `authenticate-cognito` .","AuthenticateOidcConfig":"[HTTPS listeners] Information about an identity provider that is compliant with OpenID Connect (OIDC). Specify only when `Type` is `authenticate-oidc` .","FixedResponseConfig":"[Application Load Balancer] Information for creating an action that returns a custom HTTP response. Specify only when `Type` is `fixed-response` .","ForwardConfig":"Information for creating an action that distributes requests among one or more target groups. For Network Load Balancers, you can specify a single target group. Specify only when `Type` is `forward` . If you specify both `ForwardConfig` and `TargetGroupArn` , you can specify only one target group using `ForwardConfig` and it must be the same target group specified in `TargetGroupArn` .","Order":"The order for the action. This value is required for rules with multiple actions. The action with the lowest value for order is performed first.","RedirectConfig":"[Application Load Balancer] Information for creating a redirect action. Specify only when `Type` is `redirect` .","TargetGroupArn":"The Amazon Resource Name (ARN) of the target group. Specify only when `Type` is `forward` and you want to route to a single target group. To route to one or more target groups, use `ForwardConfig` instead.","Type":"The type of action."}},"AWS::ElasticLoadBalancingV2::Listener.AuthenticateCognitoConfig":{"attributes":{},"description":"Specifies information required when integrating with Amazon Cognito to authenticate users.","properties":{"AuthenticationRequestExtraParams":"The query parameters (up to 10) to include in the redirect request to the authorization endpoint.","OnUnauthenticatedRequest":"The behavior if the user is not authenticated. The following are possible values:\\n\\n- deny `` - Return an HTTP 401 Unauthorized error.\\n- allow `` - Allow the request to be forwarded to the target.\\n- authenticate `` - Redirect the request to the IdP authorization endpoint. This is the default value.","Scope":"The set of user claims to be requested from the IdP. The default is `openid` .\\n\\nTo verify which scope values your IdP supports and how to separate multiple values, see the documentation for your IdP.","SessionCookieName":"The name of the cookie used to maintain session information. The default is AWSELBAuthSessionCookie.","SessionTimeout":"The maximum duration of the authentication session, in seconds. The default is 604800 seconds (7 days).","UserPoolArn":"The Amazon Resource Name (ARN) of the Amazon Cognito user pool.","UserPoolClientId":"The ID of the Amazon Cognito user pool client.","UserPoolDomain":"The domain prefix or fully-qualified domain name of the Amazon Cognito user pool."}},"AWS::ElasticLoadBalancingV2::Listener.AuthenticateOidcConfig":{"attributes":{},"description":"Specifies information required using an identity provide (IdP) that is compliant with OpenID Connect (OIDC) to authenticate users.","properties":{"AuthenticationRequestExtraParams":"The query parameters (up to 10) to include in the redirect request to the authorization endpoint.","AuthorizationEndpoint":"The authorization endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.","ClientId":"The OAuth 2.0 client identifier.","ClientSecret":"The OAuth 2.0 client secret. This parameter is required if you are creating a rule. If you are modifying a rule, you can omit this parameter if you set `UseExistingClientSecret` to true.","Issuer":"The OIDC issuer identifier of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.","OnUnauthenticatedRequest":"The behavior if the user is not authenticated. The following are possible values:\\n\\n- deny `` - Return an HTTP 401 Unauthorized error.\\n- allow `` - Allow the request to be forwarded to the target.\\n- authenticate `` - Redirect the request to the IdP authorization endpoint. This is the default value.","Scope":"The set of user claims to be requested from the IdP. The default is `openid` .\\n\\nTo verify which scope values your IdP supports and how to separate multiple values, see the documentation for your IdP.","SessionCookieName":"The name of the cookie used to maintain session information. The default is AWSELBAuthSessionCookie.","SessionTimeout":"The maximum duration of the authentication session, in seconds. The default is 604800 seconds (7 days).","TokenEndpoint":"The token endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.","UseExistingClientSecret":"Indicates whether to use the existing client secret when modifying a rule. If you are creating a rule, you can omit this parameter or set it to false.","UserInfoEndpoint":"The user info endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path."}},"AWS::ElasticLoadBalancingV2::Listener.Certificate":{"attributes":{},"description":"Specifies an SSL server certificate to use as the default certificate for a secure listener.","properties":{"CertificateArn":"The Amazon Resource Name (ARN) of the certificate."}},"AWS::ElasticLoadBalancingV2::Listener.FixedResponseConfig":{"attributes":{},"description":"Specifies information required when returning a custom HTTP response.","properties":{"ContentType":"The content type.\\n\\nValid Values: text/plain | text/css | text/html | application/javascript | application/json","MessageBody":"The message.","StatusCode":"The HTTP response code (2XX, 4XX, or 5XX)."}},"AWS::ElasticLoadBalancingV2::Listener.ForwardConfig":{"attributes":{},"description":"Information for creating an action that distributes requests among one or more target groups. For Network Load Balancers, you can specify a single target group. Specify only when `Type` is `forward` . If you specify both `ForwardConfig` and `TargetGroupArn` , you can specify only one target group using `ForwardConfig` and it must be the same target group specified in `TargetGroupArn` .","properties":{"TargetGroupStickinessConfig":"Information about the target group stickiness for a rule.","TargetGroups":"Information about how traffic will be distributed between multiple target groups in a forward rule."}},"AWS::ElasticLoadBalancingV2::Listener.RedirectConfig":{"attributes":{},"description":"Information about a redirect action.\\n\\nA URI consists of the following components: protocol://hostname:port/path?query. You must modify at least one of the following components to avoid a redirect loop: protocol, hostname, port, or path. Any components that you do not modify retain their original values.\\n\\nYou can reuse URI components using the following reserved keywords:\\n\\n- #{protocol}\\n- #{host}\\n- #{port}\\n- #{path} (the leading \\"/\\" is removed)\\n- #{query}\\n\\nFor example, you can change the path to \\"/new/#{path}\\", the hostname to \\"example.#{host}\\", or the query to \\"#{query}&value=xyz\\".","properties":{"Host":"The hostname. This component is not percent-encoded. The hostname can contain #{host}.","Path":"The absolute path, starting with the leading \\"/\\". This component is not percent-encoded. The path can contain #{host}, #{path}, and #{port}.","Port":"The port. You can specify a value from 1 to 65535 or #{port}.","Protocol":"The protocol. You can specify HTTP, HTTPS, or #{protocol}. You can redirect HTTP to HTTP, HTTP to HTTPS, and HTTPS to HTTPS. You cannot redirect HTTPS to HTTP.","Query":"The query parameters, URL-encoded when necessary, but not percent-encoded. Do not include the leading \\"?\\", as it is automatically added. You can specify any of the reserved keywords.","StatusCode":"The HTTP redirect code. The redirect is either permanent (HTTP 301) or temporary (HTTP 302)."}},"AWS::ElasticLoadBalancingV2::Listener.TargetGroupStickinessConfig":{"attributes":{},"description":"Information about the target group stickiness for a rule.","properties":{"DurationSeconds":"The time period, in seconds, during which requests from a client should be routed to the same target group. The range is 1-604800 seconds (7 days).","Enabled":"Indicates whether target group stickiness is enabled."}},"AWS::ElasticLoadBalancingV2::Listener.TargetGroupTuple":{"attributes":{},"description":"Information about how traffic will be distributed between multiple target groups in a forward rule.","properties":{"TargetGroupArn":"The Amazon Resource Name (ARN) of the target group.","Weight":"The weight. The range is 0 to 999."}},"AWS::ElasticLoadBalancingV2::ListenerCertificate":{"attributes":{},"description":"Specifies an SSL server certificate to add to the certificate list for an HTTPS or TLS listener.","properties":{"Certificates":"The certificate. You can specify one certificate per resource.","ListenerArn":"The Amazon Resource Name (ARN) of the listener."}},"AWS::ElasticLoadBalancingV2::ListenerCertificate.Certificate":{"attributes":{},"description":"Specifies an SSL server certificate for the certificate list of a secure listener.","properties":{"CertificateArn":"The Amazon Resource Name (ARN) of the certificate."}},"AWS::ElasticLoadBalancingV2::ListenerRule":{"attributes":{"IsDefault":"Indicates whether this is the default rule.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the listener rule.","RuleArn":"The Amazon Resource Name (ARN) of the rule."},"description":"Specifies a listener rule. The listener must be associated with an Application Load Balancer. Each rule consists of a priority, one or more actions, and one or more conditions.\\n\\nFor more information, see [Quotas for your Application Load Balancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-limits.html) in the *User Guide for Application Load Balancers* .","properties":{"Actions":"The actions.\\n\\nThe rule must include exactly one of the following types of actions: `forward` , `fixed-response` , or `redirect` , and it must be the last action to be performed. If the rule is for an HTTPS listener, it can also optionally include an authentication action.","Conditions":"The conditions.\\n\\nThe rule can optionally include up to one of each of the following conditions: `http-request-method` , `host-header` , `path-pattern` , and `source-ip` . A rule can also optionally include one or more of each of the following conditions: `http-header` and `query-string` .","ListenerArn":"The Amazon Resource Name (ARN) of the listener.","Priority":"The rule priority. A listener can\'t have multiple rules with the same priority.\\n\\nIf you try to reorder rules by updating their priorities, do not specify a new priority if an existing rule already uses this priority, as this can cause an error. If you need to reuse a priority with a different rule, you must remove it as a priority first, and then specify it in a subsequent update."}},"AWS::ElasticLoadBalancingV2::ListenerRule.Action":{"attributes":{},"description":"Specifies an action for a listener rule.","properties":{"AuthenticateCognitoConfig":"[HTTPS listeners] Information for using Amazon Cognito to authenticate users. Specify only when `Type` is `authenticate-cognito` .","AuthenticateOidcConfig":"[HTTPS listeners] Information about an identity provider that is compliant with OpenID Connect (OIDC). Specify only when `Type` is `authenticate-oidc` .","FixedResponseConfig":"[Application Load Balancer] Information for creating an action that returns a custom HTTP response. Specify only when `Type` is `fixed-response` .","ForwardConfig":"Information for creating an action that distributes requests among one or more target groups. For Network Load Balancers, you can specify a single target group. Specify only when `Type` is `forward` . If you specify both `ForwardConfig` and `TargetGroupArn` , you can specify only one target group using `ForwardConfig` and it must be the same target group specified in `TargetGroupArn` .","Order":"The order for the action. This value is required for rules with multiple actions. The action with the lowest value for order is performed first.","RedirectConfig":"[Application Load Balancer] Information for creating a redirect action. Specify only when `Type` is `redirect` .","TargetGroupArn":"The Amazon Resource Name (ARN) of the target group. Specify only when `Type` is `forward` and you want to route to a single target group. To route to one or more target groups, use `ForwardConfig` instead.","Type":"The type of action."}},"AWS::ElasticLoadBalancingV2::ListenerRule.AuthenticateCognitoConfig":{"attributes":{},"description":"Specifies information required when integrating with Amazon Cognito to authenticate users.","properties":{"AuthenticationRequestExtraParams":"The query parameters (up to 10) to include in the redirect request to the authorization endpoint.","OnUnauthenticatedRequest":"The behavior if the user is not authenticated. The following are possible values:\\n\\n- deny `` - Return an HTTP 401 Unauthorized error.\\n- allow `` - Allow the request to be forwarded to the target.\\n- authenticate `` - Redirect the request to the IdP authorization endpoint. This is the default value.","Scope":"The set of user claims to be requested from the IdP. The default is `openid` .\\n\\nTo verify which scope values your IdP supports and how to separate multiple values, see the documentation for your IdP.","SessionCookieName":"The name of the cookie used to maintain session information. The default is AWSELBAuthSessionCookie.","SessionTimeout":"The maximum duration of the authentication session, in seconds. The default is 604800 seconds (7 days).","UserPoolArn":"The Amazon Resource Name (ARN) of the Amazon Cognito user pool.","UserPoolClientId":"The ID of the Amazon Cognito user pool client.","UserPoolDomain":"The domain prefix or fully-qualified domain name of the Amazon Cognito user pool."}},"AWS::ElasticLoadBalancingV2::ListenerRule.AuthenticateOidcConfig":{"attributes":{},"description":"Specifies information required using an identity provide (IdP) that is compliant with OpenID Connect (OIDC) to authenticate users.","properties":{"AuthenticationRequestExtraParams":"The query parameters (up to 10) to include in the redirect request to the authorization endpoint.","AuthorizationEndpoint":"The authorization endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.","ClientId":"The OAuth 2.0 client identifier.","ClientSecret":"The OAuth 2.0 client secret. This parameter is required if you are creating a rule. If you are modifying a rule, you can omit this parameter if you set `UseExistingClientSecret` to true.","Issuer":"The OIDC issuer identifier of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.","OnUnauthenticatedRequest":"The behavior if the user is not authenticated. The following are possible values:\\n\\n- deny `` - Return an HTTP 401 Unauthorized error.\\n- allow `` - Allow the request to be forwarded to the target.\\n- authenticate `` - Redirect the request to the IdP authorization endpoint. This is the default value.","Scope":"The set of user claims to be requested from the IdP. The default is `openid` .\\n\\nTo verify which scope values your IdP supports and how to separate multiple values, see the documentation for your IdP.","SessionCookieName":"The name of the cookie used to maintain session information. The default is AWSELBAuthSessionCookie.","SessionTimeout":"The maximum duration of the authentication session, in seconds. The default is 604800 seconds (7 days).","TokenEndpoint":"The token endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path.","UseExistingClientSecret":"Indicates whether to use the existing client secret when modifying a rule. If you are creating a rule, you can omit this parameter or set it to false.","UserInfoEndpoint":"The user info endpoint of the IdP. This must be a full URL, including the HTTPS protocol, the domain, and the path."}},"AWS::ElasticLoadBalancingV2::ListenerRule.FixedResponseConfig":{"attributes":{},"description":"Specifies information required when returning a custom HTTP response.","properties":{"ContentType":"The content type.\\n\\nValid Values: text/plain | text/css | text/html | application/javascript | application/json","MessageBody":"The message.","StatusCode":"The HTTP response code (2XX, 4XX, or 5XX)."}},"AWS::ElasticLoadBalancingV2::ListenerRule.ForwardConfig":{"attributes":{},"description":"Information for creating an action that distributes requests among one or more target groups. For Network Load Balancers, you can specify a single target group. Specify only when `Type` is `forward` . If you specify both `ForwardConfig` and `TargetGroupArn` , you can specify only one target group using `ForwardConfig` and it must be the same target group specified in `TargetGroupArn` .","properties":{"TargetGroupStickinessConfig":"Information about the target group stickiness for a rule.","TargetGroups":"Information about how traffic will be distributed between multiple target groups in a forward rule."}},"AWS::ElasticLoadBalancingV2::ListenerRule.HostHeaderConfig":{"attributes":{},"description":"Information about a host header condition.","properties":{"Values":"The host names. The maximum size of each name is 128 characters. The comparison is case insensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character).\\n\\nIf you specify multiple strings, the condition is satisfied if one of the strings matches the host name."}},"AWS::ElasticLoadBalancingV2::ListenerRule.HttpHeaderConfig":{"attributes":{},"description":"Information about an HTTP header condition.\\n\\nThere is a set of standard HTTP header fields. You can also define custom HTTP header fields.","properties":{"HttpHeaderName":"The name of the HTTP header field. The maximum size is 40 characters. The header name is case insensitive. The allowed characters are specified by RFC 7230. Wildcards are not supported.","Values":"The strings to compare against the value of the HTTP header. The maximum size of each string is 128 characters. The comparison strings are case insensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character).\\n\\nIf the same header appears multiple times in the request, we search them in order until a match is found.\\n\\nIf you specify multiple strings, the condition is satisfied if one of the strings matches the value of the HTTP header. To require that all of the strings are a match, create one condition per string."}},"AWS::ElasticLoadBalancingV2::ListenerRule.HttpRequestMethodConfig":{"attributes":{},"description":"Information about an HTTP method condition.\\n\\nHTTP defines a set of request methods, also referred to as HTTP verbs. For more information, see the [HTTP Method Registry](https://docs.aws.amazon.com/https://www.iana.org/assignments/http-methods/http-methods.xhtml) . You can also define custom HTTP methods.","properties":{"Values":"The name of the request method. The maximum size is 40 characters. The allowed characters are A-Z, hyphen (-), and underscore (_). The comparison is case sensitive. Wildcards are not supported; therefore, the method name must be an exact match.\\n\\nIf you specify multiple strings, the condition is satisfied if one of the strings matches the HTTP request method. We recommend that you route GET and HEAD requests in the same way, because the response to a HEAD request may be cached."}},"AWS::ElasticLoadBalancingV2::ListenerRule.PathPatternConfig":{"attributes":{},"description":"Information about a path pattern condition.","properties":{"Values":"The path patterns to compare against the request URL. The maximum size of each string is 128 characters. The comparison is case sensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character).\\n\\nIf you specify multiple strings, the condition is satisfied if one of them matches the request URL. The path pattern is compared only to the path of the URL, not to its query string."}},"AWS::ElasticLoadBalancingV2::ListenerRule.QueryStringConfig":{"attributes":{},"description":"Information about a query string condition.\\n\\nThe query string component of a URI starts after the first \'?\' character and is terminated by either a \'#\' character or the end of the URI. A typical query string contains key/value pairs separated by \'&\' characters. The allowed characters are specified by RFC 3986. Any character can be percentage encoded.","properties":{"Values":"The key/value pairs or values to find in the query string. The maximum size of each string is 128 characters. The comparison is case insensitive. The following wildcard characters are supported: * (matches 0 or more characters) and ? (matches exactly 1 character). To search for a literal \'*\' or \'?\' character in a query string, you must escape these characters in `Values` using a \'\\\\\' character.\\n\\nIf you specify multiple key/value pairs or values, the condition is satisfied if one of them is found in the query string."}},"AWS::ElasticLoadBalancingV2::ListenerRule.QueryStringKeyValue":{"attributes":{},"description":"Information about a key/value pair.","properties":{"Key":"The key. You can omit the key.","Value":"The value."}},"AWS::ElasticLoadBalancingV2::ListenerRule.RedirectConfig":{"attributes":{},"description":"Information about a redirect action.\\n\\nA URI consists of the following components: protocol://hostname:port/path?query. You must modify at least one of the following components to avoid a redirect loop: protocol, hostname, port, or path. Any components that you do not modify retain their original values.\\n\\nYou can reuse URI components using the following reserved keywords:\\n\\n- #{protocol}\\n- #{host}\\n- #{port}\\n- #{path} (the leading \\"/\\" is removed)\\n- #{query}\\n\\nFor example, you can change the path to \\"/new/#{path}\\", the hostname to \\"example.#{host}\\", or the query to \\"#{query}&value=xyz\\".","properties":{"Host":"The hostname. This component is not percent-encoded. The hostname can contain #{host}.","Path":"The absolute path, starting with the leading \\"/\\". This component is not percent-encoded. The path can contain #{host}, #{path}, and #{port}.","Port":"The port. You can specify a value from 1 to 65535 or #{port}.","Protocol":"The protocol. You can specify HTTP, HTTPS, or #{protocol}. You can redirect HTTP to HTTP, HTTP to HTTPS, and HTTPS to HTTPS. You cannot redirect HTTPS to HTTP.","Query":"The query parameters, URL-encoded when necessary, but not percent-encoded. Do not include the leading \\"?\\", as it is automatically added. You can specify any of the reserved keywords.","StatusCode":"The HTTP redirect code. The redirect is either permanent (HTTP 301) or temporary (HTTP 302)."}},"AWS::ElasticLoadBalancingV2::ListenerRule.RuleCondition":{"attributes":{},"description":"Specifies a condition for a listener rule.","properties":{"Field":"The field in the HTTP request. The following are the possible values:\\n\\n- `http-header`\\n- `http-request-method`\\n- `host-header`\\n- `path-pattern`\\n- `query-string`\\n- `source-ip`","HostHeaderConfig":"Information for a host header condition. Specify only when `Field` is `host-header` .","HttpHeaderConfig":"Information for an HTTP header condition. Specify only when `Field` is `http-header` .","HttpRequestMethodConfig":"Information for an HTTP method condition. Specify only when `Field` is `http-request-method` .","PathPatternConfig":"Information for a path pattern condition. Specify only when `Field` is `path-pattern` .","QueryStringConfig":"Information for a query string condition. Specify only when `Field` is `query-string` .","SourceIpConfig":"Information for a source IP condition. Specify only when `Field` is `source-ip` .","Values":"The condition value. Specify only when `Field` is `host-header` or `path-pattern` . Alternatively, to specify multiple host names or multiple path patterns, use `HostHeaderConfig` or `PathPatternConfig` .\\n\\nIf `Field` is `host-header` and you\'re not using `HostHeaderConfig` , you can specify a single host name (for example, my.example.com). A host name is case insensitive, can be up to 128 characters in length, and can contain any of the following characters.\\n\\n- A-Z, a-z, 0-9\\n- - .\\n- * (matches 0 or more characters)\\n- ? (matches exactly 1 character)\\n\\nIf `Field` is `path-pattern` and you\'re not using `PathPatternConfig` , you can specify a single path pattern (for example, /img/*). A path pattern is case-sensitive, can be up to 128 characters in length, and can contain any of the following characters.\\n\\n- A-Z, a-z, 0-9\\n- _ - . $ / ~ \\" \' @ : +\\n- & (using &)\\n- * (matches 0 or more characters)\\n- ? (matches exactly 1 character)"}},"AWS::ElasticLoadBalancingV2::ListenerRule.SourceIpConfig":{"attributes":{},"description":"Information about a source IP condition.\\n\\nYou can use this condition to route based on the IP address of the source that connects to the load balancer. If a client is behind a proxy, this is the IP address of the proxy not the IP address of the client.","properties":{"Values":"The source IP addresses, in CIDR format. You can use both IPv4 and IPv6 addresses. Wildcards are not supported.\\n\\nIf you specify multiple addresses, the condition is satisfied if the source IP address of the request matches one of the CIDR blocks. This condition is not satisfied by the addresses in the X-Forwarded-For header."}},"AWS::ElasticLoadBalancingV2::ListenerRule.TargetGroupStickinessConfig":{"attributes":{},"description":"Information about the target group stickiness for a rule.","properties":{"DurationSeconds":"The time period, in seconds, during which requests from a client should be routed to the same target group. The range is 1-604800 seconds (7 days).","Enabled":"Indicates whether target group stickiness is enabled."}},"AWS::ElasticLoadBalancingV2::ListenerRule.TargetGroupTuple":{"attributes":{},"description":"Information about how traffic will be distributed between multiple target groups in a forward rule.","properties":{"TargetGroupArn":"The Amazon Resource Name (ARN) of the target group.","Weight":"The weight. The range is 0 to 999."}},"AWS::ElasticLoadBalancingV2::LoadBalancer":{"attributes":{"CanonicalHostedZoneID":"The ID of the Amazon Route 53 hosted zone associated with the load balancer. For example, `Z2P70J7EXAMPLE` .","DNSName":"The DNS name for the load balancer. For example, `my-load-balancer-424835706.us-west-2.elb.amazonaws.com` .","LoadBalancerFullName":"The full name of the load balancer. For example, `app/my-load-balancer/50dc6c495c0c9188` .","LoadBalancerName":"The name of the load balancer. For example, `my-load-balancer` .","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the load balancer.","SecurityGroups":"The IDs of the security groups for the load balancer."},"description":"Specifies an Application Load Balancer, a Network Load Balancer, or a Gateway Load Balancer.","properties":{"IpAddressType":"The IP address type. The possible values are `ipv4` (for IPv4 addresses) and `dualstack` (for IPv4 and IPv6 addresses). You can’t specify `dualstack` for a load balancer with a UDP or TCP_UDP listener.","LoadBalancerAttributes":"The load balancer attributes.","Name":"The name of the load balancer. This name must be unique per region per account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, must not begin or end with a hyphen, and must not begin with \\"internal-\\".\\n\\nIf you don\'t specify a name, AWS CloudFormation generates a unique physical ID for the load balancer. If you specify a name, you cannot perform updates that require replacement of this resource, but you can perform other updates. To replace the resource, specify a new name.","Scheme":"The nodes of an Internet-facing load balancer have public IP addresses. The DNS name of an Internet-facing load balancer is publicly resolvable to the public IP addresses of the nodes. Therefore, Internet-facing load balancers can route requests from clients over the internet.\\n\\nThe nodes of an internal load balancer have only private IP addresses. The DNS name of an internal load balancer is publicly resolvable to the private IP addresses of the nodes. Therefore, internal load balancers can route requests only from clients with access to the VPC for the load balancer.\\n\\nThe default is an Internet-facing load balancer.\\n\\nYou cannot specify a scheme for a Gateway Load Balancer.","SecurityGroups":"[Application Load Balancers] The IDs of the security groups for the load balancer.","SubnetMappings":"The IDs of the public subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings, but not both.\\n\\n[Application Load Balancers] You must specify subnets from at least two Availability Zones. You cannot specify Elastic IP addresses for your subnets.\\n\\n[Application Load Balancers on Outposts] You must specify one Outpost subnet.\\n\\n[Application Load Balancers on Local Zones] You can specify subnets from one or more Local Zones.\\n\\n[Network Load Balancers] You can specify subnets from one or more Availability Zones. You can specify one Elastic IP address per subnet if you need static IP addresses for your internet-facing load balancer. For internal load balancers, you can specify one private IP address per subnet from the IPv4 range of the subnet. For internet-facing load balancer, you can specify one IPv6 address per subnet.\\n\\n[Gateway Load Balancers] You can specify subnets from one or more Availability Zones. You cannot specify Elastic IP addresses for your subnets.","Subnets":"The IDs of the public subnets. You can specify only one subnet per Availability Zone. You must specify either subnets or subnet mappings, but not both. To specify an Elastic IP address, specify subnet mappings instead of subnets.\\n\\n[Application Load Balancers] You must specify subnets from at least two Availability Zones.\\n\\n[Application Load Balancers on Outposts] You must specify one Outpost subnet.\\n\\n[Application Load Balancers on Local Zones] You can specify subnets from one or more Local Zones.\\n\\n[Network Load Balancers] You can specify subnets from one or more Availability Zones.\\n\\n[Gateway Load Balancers] You can specify subnets from one or more Availability Zones.","Tags":"The tags to assign to the load balancer.","Type":"The type of load balancer. The default is `application` ."}},"AWS::ElasticLoadBalancingV2::LoadBalancer.LoadBalancerAttribute":{"attributes":{},"description":"Specifies an attribute for an Application Load Balancer, a Network Load Balancer, or a Gateway Load Balancer.","properties":{"Key":"The name of the attribute.\\n\\nThe following attributes are supported by all load balancers:\\n\\n- `deletion_protection.enabled` - Indicates whether deletion protection is enabled. The value is `true` or `false` . The default is `false` .\\n- `load_balancing.cross_zone.enabled` - Indicates whether cross-zone load balancing is enabled. The possible values are `true` and `false` . The default for Network Load Balancers and Gateway Load Balancers is `false` . The default for Application Load Balancers is `true` , and cannot be changed.\\n\\nThe following attributes are supported by both Application Load Balancers and Network Load Balancers:\\n\\n- `access_logs.s3.enabled` - Indicates whether access logs are enabled. The value is `true` or `false` . The default is `false` .\\n- `access_logs.s3.bucket` - The name of the S3 bucket for the access logs. This attribute is required if access logs are enabled. The bucket must exist in the same region as the load balancer and have a bucket policy that grants Elastic Load Balancing permissions to write to the bucket.\\n- `access_logs.s3.prefix` - The prefix for the location in the S3 bucket for the access logs.\\n- `ipv6.deny_all_igw_traffic` - Blocks internet gateway (IGW) access to the load balancer. It is set to `false` for internet-facing load balancers and `true` for internal load balancers, preventing unintended access to your internal load balancer through an internet gateway.\\n\\nThe following attributes are supported by only Application Load Balancers:\\n\\n- `idle_timeout.timeout_seconds` - The idle timeout value, in seconds. The valid range is 1-4000 seconds. The default is 60 seconds.\\n- `routing.http.desync_mitigation_mode` - Determines how the load balancer handles requests that might pose a security risk to your application. The possible values are `monitor` , `defensive` , and `strictest` . The default is `defensive` .\\n- `routing.http.drop_invalid_header_fields.enabled` - Indicates whether HTTP headers with invalid header fields are removed by the load balancer ( `true` ) or routed to targets ( `false` ). The default is `false` .\\n- `routing.http.preserve_host_header.enabled` - Indicates whether the Application Load Balancer should preserve the `Host` header in the HTTP request and send it to the target without any change. The possible values are `true` and `false` . The default is `false` .\\n- `routing.http.x_amzn_tls_version_and_cipher_suite.enabled` - Indicates whether the two headers ( `x-amzn-tls-version` and `x-amzn-tls-cipher-suite` ), which contain information about the negotiated TLS version and cipher suite, are added to the client request before sending it to the target. The `x-amzn-tls-version` header has information about the TLS protocol version negotiated with the client, and the `x-amzn-tls-cipher-suite` header has information about the cipher suite negotiated with the client. Both headers are in OpenSSL format. The possible values for the attribute are `true` and `false` . The default is `false` .\\n- `routing.http.xff_client_port.enabled` - Indicates whether the `X-Forwarded-For` header should preserve the source port that the client used to connect to the load balancer. The possible values are `true` and `false` . The default is `false` .\\n- `routing.http.xff_header_processing.mode` - Enables you to modify, preserve, or remove the `X-Forwarded-For` header in the HTTP request before the Application Load Balancer sends the request to the target. The possible values are `append` , `preserve` , and `remove` . The default is `append` .\\n\\n- If the value is `append` , the Application Load Balancer adds the client IP address (of the last hop) to the `X-Forwarded-For` header in the HTTP request before it sends it to targets.\\n- If the value is `preserve` the Application Load Balancer preserves the `X-Forwarded-For` header in the HTTP request, and sends it to targets without any change.\\n- If the value is `remove` , the Application Load Balancer removes the `X-Forwarded-For` header in the HTTP request before it sends it to targets.\\n- `routing.http2.enabled` - Indicates whether HTTP/2 is enabled. The possible values are `true` and `false` . The default is `true` . Elastic Load Balancing requires that message header names contain only alphanumeric characters and hyphens.\\n- `waf.fail_open.enabled` - Indicates whether to allow a WAF-enabled load balancer to route requests to targets if it is unable to forward the request to AWS WAF. The possible values are `true` and `false` . The default is `false` .","Value":"The value of the attribute."}},"AWS::ElasticLoadBalancingV2::LoadBalancer.SubnetMapping":{"attributes":{},"description":"Specifies a subnet for a load balancer.","properties":{"AllocationId":"[Network Load Balancers] The allocation ID of the Elastic IP address for an internet-facing load balancer.","IPv6Address":"[Network Load Balancers] The IPv6 address.","PrivateIPv4Address":"[Network Load Balancers] The private IPv4 address for an internal load balancer.","SubnetId":"The ID of the subnet."}},"AWS::ElasticLoadBalancingV2::TargetGroup":{"attributes":{"LoadBalancerArns":"The Amazon Resource Name (ARN) of the load balancer that routes traffic to this target group.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the target group.","TargetGroupArn":"The Amazon Resource Name (ARN) of the target group.","TargetGroupFullName":"The full name of the target group. For example, `targetgroup/my-target-group/cbf133c568e0d028` .","TargetGroupName":"The name of the target group. For example, `my-target-group` ."},"description":"Specifies a target group for an Application Load Balancer, a Network Load Balancer, or a Gateway Load Balancer.\\n\\nBefore you register a Lambda function as a target, you must create a `AWS::Lambda::Permission` resource that grants the Elastic Load Balancing service principal permission to invoke the Lambda function.","properties":{"HealthCheckEnabled":"Indicates whether health checks are enabled. If the target type is `lambda` , health checks are disabled by default but can be enabled. If the target type is `instance` , `ip` , or `alb` , health checks are always enabled and cannot be disabled.","HealthCheckIntervalSeconds":"The approximate amount of time, in seconds, between health checks of an individual target. The range is 5-300. If the target group protocol is TCP, TLS, UDP, TCP_UDP, HTTP or HTTPS, the default is 30 seconds. If the target group protocol is GENEVE, the default is 10 seconds. If the target type is `lambda` , the default is 35 seconds.","HealthCheckPath":"[HTTP/HTTPS health checks] The destination for health checks on the targets.\\n\\n[HTTP1 or HTTP2 protocol version] The ping path. The default is /.\\n\\n[GRPC protocol version] The path of a custom health check method with the format /package.service/method. The default is / AWS .ALB/healthcheck.","HealthCheckPort":"The port the load balancer uses when performing health checks on targets. If the protocol is HTTP, HTTPS, TCP, TLS, UDP, or TCP_UDP, the default is `traffic-port` , which is the port on which each target receives traffic from the load balancer. If the protocol is GENEVE, the default is port 80.","HealthCheckProtocol":"The protocol the load balancer uses when performing health checks on targets. For Application Load Balancers, the default is HTTP. For Network Load Balancers and Gateway Load Balancers, the default is TCP. The TCP protocol is not supported for health checks if the protocol of the target group is HTTP or HTTPS. The GENEVE, TLS, UDP, and TCP_UDP protocols are not supported for health checks.","HealthCheckTimeoutSeconds":"The amount of time, in seconds, during which no response from a target means a failed health check. The range is 2–120 seconds. For target groups with a protocol of HTTP, the default is 6 seconds. For target groups with a protocol of TCP, TLS or HTTPS, the default is 10 seconds. For target groups with a protocol of GENEVE, the default is 5 seconds. If the target type is `lambda` , the default is 30 seconds.","HealthyThresholdCount":"The number of consecutive health check successes required before considering a target healthy. The range is 2-10. If the target group protocol is TCP, TCP_UDP, UDP, TLS, HTTP or HTTPS, the default is 5. For target groups with a protocol of GENEVE, the default is 5. If the target type is `lambda` , the default is 5.","IpAddressType":"The type of IP address used for this target group. The possible values are `ipv4` and `ipv6` . This is an optional parameter. If not specified, the IP address type defaults to `ipv4` .","Matcher":"[HTTP/HTTPS health checks] The HTTP or gRPC codes to use when checking for a successful response from a target. For target groups with a protocol of TCP, TCP_UDP, UDP or TLS the range is 200-599. For target groups with a protocol of HTTP or HTTPS, the range is 200-499. For target groups with a protocol of GENEVE, the range is 200-399.","Name":"The name of the target group.\\n\\nThis name must be unique per region per account, can have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and must not begin or end with a hyphen.","Port":"The port on which the targets receive traffic. This port is used unless you specify a port override when registering the target. If the target is a Lambda function, this parameter does not apply. If the protocol is GENEVE, the supported port is 6081.","Protocol":"The protocol to use for routing traffic to the targets. For Application Load Balancers, the supported protocols are HTTP and HTTPS. For Network Load Balancers, the supported protocols are TCP, TLS, UDP, or TCP_UDP. For Gateway Load Balancers, the supported protocol is GENEVE. A TCP_UDP listener must be associated with a TCP_UDP target group. If the target is a Lambda function, this parameter does not apply.","ProtocolVersion":"[HTTP/HTTPS protocol] The protocol version. The possible values are `GRPC` , `HTTP1` , and `HTTP2` .","Tags":"The tags.","TargetGroupAttributes":"The attributes.","TargetType":"The type of target that you must specify when registering targets with this target group. You can\'t specify targets for a target group using more than one target type.\\n\\n- `instance` - Register targets by instance ID. This is the default value.\\n- `ip` - Register targets by IP address. You can specify IP addresses from the subnets of the virtual private cloud (VPC) for the target group, the RFC 1918 range (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16), and the RFC 6598 range (100.64.0.0/10). You can\'t specify publicly routable IP addresses.\\n- `lambda` - Register a single Lambda function as a target.\\n- `alb` - Register a single Application Load Balancer as a target.","Targets":"The targets.","UnhealthyThresholdCount":"The number of consecutive health check failures required before considering a target unhealthy. The range is 2-10. If the target group protocol is TCP, TCP_UDP, UDP, TLS, HTTP or HTTPS, the default is 2. For target groups with a protocol of GENEVE, the default is 2. If the target type is `lambda` , the default is 5.","VpcId":"The identifier of the virtual private cloud (VPC). If the target is a Lambda function, this parameter does not apply. Otherwise, this parameter is required."}},"AWS::ElasticLoadBalancingV2::TargetGroup.Matcher":{"attributes":{},"description":"Specifies the HTTP codes that healthy targets must use when responding to an HTTP health check.","properties":{"GrpcCode":"You can specify values between 0 and 99. You can specify multiple values (for example, \\"0,1\\") or a range of values (for example, \\"0-5\\"). The default value is 12.","HttpCode":"For Application Load Balancers, you can specify values between 200 and 499, with the default value being 200. You can specify multiple values (for example, \\"200,202\\") or a range of values (for example, \\"200-299\\").\\n\\nFor Network Load Balancers, you can specify values between 200 and 599, with the default value being 200-399. You can specify multiple values (for example, \\"200,202\\") or a range of values (for example, \\"200-299\\").\\n\\nFor Gateway Load Balancers, this must be \\"200–399\\".\\n\\nNote that when using shorthand syntax, some values such as commas need to be escaped."}},"AWS::ElasticLoadBalancingV2::TargetGroup.TargetDescription":{"attributes":{},"description":"Specifies a target to add to a target group.","properties":{"AvailabilityZone":"An Availability Zone or `all` . This determines whether the target receives traffic from the load balancer nodes in the specified Availability Zone or from all enabled Availability Zones for the load balancer.\\n\\nFor Application Load Balancer target groups, the specified Availability Zone value is only applicable when cross-zone load balancing is off. Otherwise the parameter is ignored and treated as `all` .\\n\\nThis parameter is not supported if the target type of the target group is `instance` or `alb` .\\n\\nIf the target type is `ip` and the IP address is in a subnet of the VPC for the target group, the Availability Zone is automatically detected and this parameter is optional. If the IP address is outside the VPC, this parameter is required.\\n\\nFor Application Load Balancer target groups with cross-zone load balancing off, if the target type is `ip` and the IP address is outside of the VPC for the target group, this should be an Availability Zone inside the VPC for the target group.\\n\\nIf the target type is `lambda` , this parameter is optional and the only supported value is `all` .","Id":"The ID of the target. If the target type of the target group is `instance` , specify an instance ID. If the target type is `ip` , specify an IP address. If the target type is `lambda` , specify the ARN of the Lambda function. If the target type is `alb` , specify the ARN of the Application Load Balancer target.","Port":"The port on which the target is listening. If the target group protocol is GENEVE, the supported port is 6081. If the target type is `alb` , the targeted Application Load Balancer must have at least one listener whose port matches the target group port. This parameter is not used if the target is a Lambda function."}},"AWS::ElasticLoadBalancingV2::TargetGroup.TargetGroupAttribute":{"attributes":{},"description":"Specifies a target group attribute.","properties":{"Key":"The name of the attribute.\\n\\nThe following attributes are supported by all load balancers:\\n\\n- `deregistration_delay.timeout_seconds` - The amount of time, in seconds, for Elastic Load Balancing to wait before changing the state of a deregistering target from `draining` to `unused` . The range is 0-3600 seconds. The default value is 300 seconds. If the target is a Lambda function, this attribute is not supported.\\n- `stickiness.enabled` - Indicates whether target stickiness is enabled. The value is `true` or `false` . The default is `false` .\\n- `stickiness.type` - Indicates the type of stickiness. The possible values are:\\n\\n- `lb_cookie` and `app_cookie` for Application Load Balancers.\\n- `source_ip` for Network Load Balancers.\\n- `source_ip_dest_ip` and `source_ip_dest_ip_proto` for Gateway Load Balancers.\\n\\nThe following attributes are supported by Application Load Balancers and Network Load Balancers:\\n\\n- `load_balancing.cross_zone.enabled` - Indicates whether cross zone load balancing is enabled. The value is `true` , `false` or `use_load_balancer_configuration` . The default is `use_load_balancer_configuration` .\\n- `target_group_health.dns_failover.minimum_healthy_targets.count` - The minimum number of targets that must be healthy. If the number of healthy targets is below this value, mark the zone as unhealthy in DNS, so that traffic is routed only to healthy zones. The possible values are `off` or an integer from 1 to the maximum number of targets. The default is `off` .\\n- `target_group_health.dns_failover.minimum_healthy_targets.percentage` - The minimum percentage of targets that must be healthy. If the percentage of healthy targets is below this value, mark the zone as unhealthy in DNS, so that traffic is routed only to healthy zones. The possible values are `off` or an integer from 1 to 100. The default is `off` .\\n- `target_group_health.unhealthy_state_routing.minimum_healthy_targets.count` - The minimum number of targets that must be healthy. If the number of healthy targets is below this value, send traffic to all targets, including unhealthy targets. The possible values are 1 to the maximum number of targets. The default is 1.\\n- `target_group_health.unhealthy_state_routing.minimum_healthy_targets.percentage` - The minimum percentage of targets that must be healthy. If the percentage of healthy targets is below this value, send traffic to all targets, including unhealthy targets. The possible values are `off` or an integer from 1 to 100. The default is `off` .\\n\\nThe following attributes are supported only if the load balancer is an Application Load Balancer and the target is an instance or an IP address:\\n\\n- `load_balancing.algorithm.type` - The load balancing algorithm determines how the load balancer selects targets when routing requests. The value is `round_robin` or `least_outstanding_requests` . The default is `round_robin` .\\n- `slow_start.duration_seconds` - The time period, in seconds, during which a newly registered target receives an increasing share of the traffic to the target group. After this time period ends, the target receives its full share of traffic. The range is 30-900 seconds (15 minutes). The default is 0 seconds (disabled).\\n- `stickiness.app_cookie.cookie_name` - Indicates the name of the application-based cookie. Names that start with the following prefixes are not allowed: `AWSALB` , `AWSALBAPP` , and `AWSALBTG` ; they\'re reserved for use by the load balancer.\\n- `stickiness.app_cookie.duration_seconds` - The time period, in seconds, during which requests from a client should be routed to the same target. After this time period expires, the application-based cookie is considered stale. The range is 1 second to 1 week (604800 seconds). The default value is 1 day (86400 seconds).\\n- `stickiness.lb_cookie.duration_seconds` - The time period, in seconds, during which requests from a client should be routed to the same target. After this time period expires, the load balancer-generated cookie is considered stale. The range is 1 second to 1 week (604800 seconds). The default value is 1 day (86400 seconds).\\n\\nThe following attribute is supported only if the load balancer is an Application Load Balancer and the target is a Lambda function:\\n\\n- `lambda.multi_value_headers.enabled` - Indicates whether the request and response headers that are exchanged between the load balancer and the Lambda function include arrays of values or strings. The value is `true` or `false` . The default is `false` . If the value is `false` and the request contains a duplicate header field name or query parameter key, the load balancer uses the last value sent by the client.\\n\\nThe following attributes are supported only by Network Load Balancers:\\n\\n- `deregistration_delay.connection_termination.enabled` - Indicates whether the load balancer terminates connections at the end of the deregistration timeout. The value is `true` or `false` . The default is `false` .\\n- `preserve_client_ip.enabled` - Indicates whether client IP preservation is enabled. The value is `true` or `false` . The default is disabled if the target group type is IP address and the target group protocol is TCP or TLS. Otherwise, the default is enabled. Client IP preservation cannot be disabled for UDP and TCP_UDP target groups.\\n- `proxy_protocol_v2.enabled` - Indicates whether Proxy Protocol version 2 is enabled. The value is `true` or `false` . The default is `false` .\\n\\nThe following attributes are supported only by Gateway Load Balancers:\\n\\n- `target_failover.on_deregistration` - Indicates how the Gateway Load Balancer handles existing flows when a target is deregistered. The possible values are `rebalance` and `no_rebalance` . The default is `no_rebalance` . The two attributes ( `target_failover.on_deregistration` and `target_failover.on_unhealthy` ) can\'t be set independently. The value you set for both attributes must be the same.\\n- `target_failover.on_unhealthy` - Indicates how the Gateway Load Balancer handles existing flows when a target is unhealthy. The possible values are `rebalance` and `no_rebalance` . The default is `no_rebalance` . The two attributes ( `target_failover.on_deregistration` and `target_failover.on_unhealthy` ) cannot be set independently. The value you set for both attributes must be the same.","Value":"The value of the attribute."}},"AWS::Elasticsearch::Domain":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the domain, such as `arn:aws:es:us-west-2:123456789012:domain/mystack-elasti-1ab2cdefghij` . This returned value is the same as the one returned by `AWS::Elasticsearch::Domain.DomainArn` .","DomainArn":"The Amazon Resource Name (ARN) of the domain, such as `arn:aws:es:us-west-2:123456789012:domain/mystack-elasti-1ab2cdefghij` . This returned value is the same as the one returned by `AWS::Elasticsearch::Domain.Arn` .","DomainEndpoint":"The domain-specific endpoint that\'s used for requests to the OpenSearch APIs, such as `search-mystack-elasti-1ab2cdefghij-ab1c2deckoyb3hofw7wpqa3cm.us-west-1.es.amazonaws.com` .","Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, Ref returns the resource name, such as `mystack-elasticsea-abc1d2efg3h4.` For more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The AWS::Elasticsearch::Domain resource creates an Amazon OpenSearch Service domain.\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and legacy Elasticsearch. For instructions to upgrade domains defined within CloudFormation from Elasticsearch to OpenSearch, see [Remarks](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#aws-resource-opensearchservice-domain--remarks) .","properties":{"AccessPolicies":"An AWS Identity and Access Management ( IAM ) policy document that specifies who can access the OpenSearch Service domain and their permissions. For more information, see [Configuring access policies](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-creating) in the *Amazon OpenSearch Service Developer Guid* e.","AdvancedOptions":"Additional options to specify for the OpenSearch Service domain. For more information, see [Advanced cluster parameters](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomain-configure-advanced-options) in the *Amazon OpenSearch Service Developer Guide* .","AdvancedSecurityOptions":"Specifies options for fine-grained access control.","CognitoOptions":"Configures OpenSearch Service to use Amazon Cognito authentication for OpenSearch Dashboards.","DomainEndpointOptions":"Specifies additional options for the domain endpoint, such as whether to require HTTPS for all traffic or whether to use a custom endpoint rather than the default endpoint.","DomainName":"A name for the OpenSearch Service domain. For valid values, see the [DomainName](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/configuration-api.html#configuration-api-datatypes-domainname) data type in the *Amazon OpenSearch Service Developer Guide* . If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the domain name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","EBSOptions":"The configurations of Amazon Elastic Block Store (Amazon EBS) volumes that are attached to data nodes in the OpenSearch Service domain. For more information, see [EBS volume size limits](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/limits.html#ebsresource) in the *Amazon OpenSearch Service Developer Guide* .","ElasticsearchClusterConfig":"ElasticsearchClusterConfig is a property of the AWS::Elasticsearch::Domain resource that configures the cluster of an Amazon OpenSearch Service domain.","ElasticsearchVersion":"The version of Elasticsearch to use, such as 2.3. If not specified, 1.5 is used as the default. For information about the versions that OpenSearch Service supports, see [Supported versions of OpenSearch and Elasticsearch](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/what-is.html#choosing-version) in the *Amazon OpenSearch Service Developer Guide* .\\n\\nIf you set the [EnableVersionUpgrade](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html#cfn-attributes-updatepolicy-upgradeopensearchdomain) update policy to `true` , you can update `ElasticsearchVersion` without interruption. When `EnableVersionUpgrade` is set to `false` , or is not specified, updating `ElasticsearchVersion` results in [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","EncryptionAtRestOptions":"Whether the domain should encrypt data at rest, and if so, the AWS Key Management Service key to use. See [Encryption of data at rest for Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/encryption-at-rest.html) .","LogPublishingOptions":"An object with one or more of the following keys: `SEARCH_SLOW_LOGS` , `ES_APPLICATION_LOGS` , `INDEX_SLOW_LOGS` , `AUDIT_LOGS` , depending on the types of logs you want to publish. Each key needs a valid `LogPublishingOption` value.","NodeToNodeEncryptionOptions":"Specifies whether node-to-node encryption is enabled. See [Node-to-node encryption for Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ntn.html) .","SnapshotOptions":"*DEPRECATED* . The automated snapshot configuration for the OpenSearch Service domain indices.","Tags":"An arbitrary set of tags (key–value pairs) to associate with the OpenSearch Service domain.","VPCOptions":"The virtual private cloud (VPC) configuration for the OpenSearch Service domain. For more information, see [Launching your Amazon OpenSearch Service domains within a VPC](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html) in the *Amazon OpenSearch Service Developer Guide* ."}},"AWS::Elasticsearch::Domain.AdvancedSecurityOptionsInput":{"attributes":{},"description":"Specifies options for fine-grained access control.\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"AnonymousAuthEnabled":"","Enabled":"True to enable fine-grained access control. You must also enable encryption of data at rest and node-to-node encryption.","InternalUserDatabaseEnabled":"True to enable the internal user database.","MasterUserOptions":"Specifies information about the master user."}},"AWS::Elasticsearch::Domain.CognitoOptions":{"attributes":{},"description":"Configures OpenSearch Service to use Amazon Cognito authentication for OpenSearch Dashboards.\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"Enabled":"Whether to enable or disable Amazon Cognito authentication for OpenSearch Dashboards. See [Amazon Cognito authentication for OpenSearch Dashboards](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cognito-auth.html) .","IdentityPoolId":"The Amazon Cognito identity pool ID that you want OpenSearch Service to use for OpenSearch Dashboards authentication. Required if you enable Cognito authentication.","RoleArn":"The `AmazonESCognitoAccess` role that allows OpenSearch Service to configure your user pool and identity pool. Required if you enable Cognito authentication.","UserPoolId":"The Amazon Cognito user pool ID that you want OpenSearch Service to use for OpenSearch Dashboards authentication. Required if you enable Cognito authentication."}},"AWS::Elasticsearch::Domain.ColdStorageOptions":{"attributes":{},"description":"Specifies options for cold storage. For more information, see [Cold storage for Amazon Elasticsearch Service](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/cold-storage.html) .\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"Enabled":"Whether to enable or disable cold storage on the domain. You must enable UltraWarm storage in order to enable cold storage."}},"AWS::Elasticsearch::Domain.DomainEndpointOptions":{"attributes":{},"description":"Specifies additional options for the domain endpoint, such as whether to require HTTPS for all traffic or whether to use a custom endpoint rather than the default endpoint.\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"CustomEndpoint":"The fully qualified URL for your custom endpoint. Required if you enabled a custom endpoint for the domain.","CustomEndpointCertificateArn":"The AWS Certificate Manager ARN for your domain\'s SSL/TLS certificate. Required if you enabled a custom endpoint for the domain.","CustomEndpointEnabled":"True to enable a custom endpoint for the domain. If enabled, you must also provide values for `CustomEndpoint` and `CustomEndpointCertificateArn` .","EnforceHTTPS":"True to require that all traffic to the domain arrive over HTTPS.","TLSSecurityPolicy":"The minimum TLS version required for traffic to the domain. Valid values are TLS 1.3 (recommended) or 1.2:\\n\\n- `Policy-Min-TLS-1-0-2019-07`\\n- `Policy-Min-TLS-1-2-2019-07`"}},"AWS::Elasticsearch::Domain.EBSOptions":{"attributes":{},"description":"The configurations of Amazon Elastic Block Store (Amazon EBS) volumes that are attached to data nodes in the OpenSearch Service domain. For more information, see [EBS volume size limits](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/limits.html#ebsresource) in the *Amazon OpenSearch Service Developer Guide* .\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"EBSEnabled":"Specifies whether Amazon EBS volumes are attached to data nodes in the OpenSearch Service domain.","Iops":"The number of I/O operations per second (IOPS) that the volume supports. This property applies only to provisioned IOPS EBS volume types.","VolumeSize":"The size (in GiB) of the EBS volume for each data node. The minimum and maximum size of an EBS volume depends on the EBS volume type and the instance type to which it is attached. For more information, see [EBS volume size limits](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/limits.html#ebsresource) in the *Amazon OpenSearch Service Developer Guide* .","VolumeType":"The EBS volume type to use with the OpenSearch Service domain, such as standard, gp2, or io1. For more information about each type, see [Amazon EBS volume types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html) in the *Amazon EC2 User Guide for Linux Instances* ."}},"AWS::Elasticsearch::Domain.ElasticsearchClusterConfig":{"attributes":{},"description":"The cluster configuration for the OpenSearch Service domain. You can specify options such as the instance type and the number of instances. For more information, see [Creating and managing Amazon OpenSearch Service domains](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html) in the *Amazon OpenSearch Service Developer Guide* .\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"ColdStorageOptions":"Specifies cold storage options for the domain.","DedicatedMasterCount":"The number of instances to use for the master node. If you specify this property, you must specify true for the DedicatedMasterEnabled property.","DedicatedMasterEnabled":"Indicates whether to use a dedicated master node for the OpenSearch Service domain. A dedicated master node is a cluster node that performs cluster management tasks, but doesn\'t hold data or respond to data upload requests. Dedicated master nodes offload cluster management tasks to increase the stability of your search clusters. See [Dedicated master nodes in Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-dedicatedmasternodes.html) .","DedicatedMasterType":"The hardware configuration of the computer that hosts the dedicated master node, such as `m3.medium.elasticsearch` . If you specify this property, you must specify true for the `DedicatedMasterEnabled` property. For valid values, see [Supported instance types in Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/supported-instance-types.html) .","InstanceCount":"The number of data nodes (instances) to use in the OpenSearch Service domain.","InstanceType":"The instance type for your data nodes, such as `m3.medium.elasticsearch` . For valid values, see [Supported instance types in Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/supported-instance-types.html) .","WarmCount":"The number of warm nodes in the cluster. Required if you enable warm storage.","WarmEnabled":"Whether to enable warm storage for the cluster.","WarmType":"The instance type for the cluster\'s warm nodes. Required if you enable warm storage.","ZoneAwarenessConfig":"Specifies zone awareness configuration options. Only use if `ZoneAwarenessEnabled` is `true` .","ZoneAwarenessEnabled":"Indicates whether to enable zone awareness for the OpenSearch Service domain. When you enable zone awareness, OpenSearch Service allocates the nodes and replica index shards that belong to a cluster across two Availability Zones (AZs) in the same region to prevent data loss and minimize downtime in the event of node or data center failure. Don\'t enable zone awareness if your cluster has no replica index shards or is a single-node cluster. For more information, see [Configuring a multi-AZ domain in Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-multiaz.html) ."}},"AWS::Elasticsearch::Domain.EncryptionAtRestOptions":{"attributes":{},"description":"Whether the domain should encrypt data at rest, and if so, the AWS Key Management Service key to use.\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"Enabled":"Specify `true` to enable encryption at rest.","KmsKeyId":"The KMS key ID. Takes the form `1a2a3a4-1a2a-3a4a-5a6a-1a2a3a4a5a6a` . Required if you enable encryption at rest."}},"AWS::Elasticsearch::Domain.LogPublishingOption":{"attributes":{},"description":"> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* . \\n\\nSpecifies whether the OpenSearch Service domain publishes the Elasticsearch application, search slow logs, or index slow logs to Amazon CloudWatch. Each option must be an object of name `SEARCH_SLOW_LOGS` , `ES_APPLICATION_LOGS` , `INDEX_SLOW_LOGS` , or `AUDIT_LOGS` depending on the type of logs you want to publish.\\n\\nIf you enable a slow log, you still have to enable the *collection* of slow logs using the Configuration API. To learn more, see [Enabling log publishing ( AWS CLI)](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createdomain-configure-slow-logs.html#createdomain-configure-slow-logs-cli) .","properties":{"CloudWatchLogsLogGroupArn":"Specifies the CloudWatch log group to publish to. Required if you enable log publishing for the domain.","Enabled":"If `true` , enables the publishing of logs to CloudWatch.\\n\\nDefault: `false` ."}},"AWS::Elasticsearch::Domain.MasterUserOptions":{"attributes":{},"description":"Specifies information about the master user. Required if you enabled the internal user database.\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"MasterUserARN":"ARN for the master user. Only specify if `InternalUserDatabaseEnabled` is false in `AdvancedSecurityOptions` .","MasterUserName":"Username for the master user. Only specify if `InternalUserDatabaseEnabled` is true in `AdvancedSecurityOptions` .","MasterUserPassword":"Password for the master user. Only specify if `InternalUserDatabaseEnabled` is true in `AdvancedSecurityOptions` ."}},"AWS::Elasticsearch::Domain.NodeToNodeEncryptionOptions":{"attributes":{},"description":"Specifies whether node-to-node encryption is enabled.\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"Enabled":"Specifies whether node-to-node encryption is enabled, as a Boolean."}},"AWS::Elasticsearch::Domain.SnapshotOptions":{"attributes":{},"description":"> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* . \\n\\n*DEPRECATED* . For domains running Elasticsearch 5.3 and later, OpenSearch Service takes hourly automated snapshots, making this setting irrelevant. For domains running earlier versions of Elasticsearch, OpenSearch Service takes daily automated snapshots.\\n\\nThe automated snapshot configuration for the OpenSearch Service domain indices.","properties":{"AutomatedSnapshotStartHour":"The hour in UTC during which the service takes an automated daily snapshot of the indices in the OpenSearch Service domain. For example, if you specify 0, OpenSearch Service takes an automated snapshot everyday between midnight and 1 am. You can specify a value between 0 and 23."}},"AWS::Elasticsearch::Domain.VPCOptions":{"attributes":{},"description":"The virtual private cloud (VPC) configuration for the OpenSearch Service domain. For more information, see [Launching your Amazon OpenSearch Service domains using a VPC](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html) in the *Amazon OpenSearch Service Developer Guide* .\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"SecurityGroupIds":"The list of security group IDs that are associated with the VPC endpoints for the domain. If you don\'t provide a security group ID, OpenSearch Service uses the default security group for the VPC. To learn more, see [Security groups for your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) in the *Amazon VPC User Guide* .","SubnetIds":"Provide one subnet ID for each Availability Zone that your domain uses. For example, you must specify three subnet IDs for a three Availability Zone domain. To learn more, see [VPCs and subnets](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html) in the *Amazon VPC User Guide* .\\n\\nRequired if you\'re creating your domain inside a VPC."}},"AWS::Elasticsearch::Domain.ZoneAwarenessConfig":{"attributes":{},"description":"Specifies zone awareness configuration options. Only use if `ZoneAwarenessEnabled` is `true` .\\n\\n> The `AWS::Elasticsearch::Domain` resource is being replaced by the [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html) resource. While the legacy Elasticsearch resource and options are still supported, we recommend modifying your existing Cloudformation templates to use the new OpenSearch Service resource, which supports both OpenSearch and Elasticsearch. For more information about the service rename, see [New resource types](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/rename.html#rename-resource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"AvailabilityZoneCount":"If you enabled multiple Availability Zones (AZs), the number of AZs that you want the domain to use.\\n\\nValid values are `2` and `3` . Default is 2."}},"AWS::EventSchemas::Discoverer":{"attributes":{"CrossAccount":"Defines whether event schemas from other accounts are discovered. Default is True.","DiscovererArn":"The ARN of the discoverer.","DiscovererId":"The ID of the discoverer.","Ref":"When you provide the logical ID of this resource to the `Ref` intrinsic function, `Ref` returns the ARN of the discoverer."},"description":"Use the `AWS::EventSchemas::Discoverer` resource to specify a *discoverer* that is associated with an event bus. A discoverer allows the Amazon EventBridge Schema Registry to automatically generate schemas based on events on an event bus.","properties":{"CrossAccount":"Allows for the discovery of the event schemas that are sent to the event bus from another account.","Description":"A description for the discoverer.","SourceArn":"The ARN of the event bus.","Tags":"Tags associated with the resource."}},"AWS::EventSchemas::Discoverer.TagsEntry":{"attributes":{},"description":"Tags to associate with the discoverer.","properties":{"Key":"They key of a key-value pair.","Value":"They value of a key-value pair."}},"AWS::EventSchemas::Registry":{"attributes":{"Ref":"When you provide the logical ID of this resource to the `Ref` intrinsic function, `Ref` returns the ARN of the schema. For example:\\n\\n`{ \\"Ref\\": \\"MyRegistry\\" }`\\n\\nReturns a value similar to the following:\\n\\n`arn:aws:schemas:us-east-1:012345678901:registry/MyRegistry`","RegistryArn":"The ARN of the registry.","RegistryName":"The name of the registry."},"description":"Use the `AWS::EventSchemas::Registry` to specify a schema registry. Schema registries are containers for Schemas. Registries collect and organize schemas so that your schemas are in logical groups.","properties":{"Description":"A description of the registry to be created.","RegistryName":"The name of the schema registry.","Tags":"Tags to associate with the registry."}},"AWS::EventSchemas::Registry.TagsEntry":{"attributes":{},"description":"Tags to associate with the schema registry.","properties":{"Key":"They key of a key-value pair.","Value":"They value of a key-value pair."}},"AWS::EventSchemas::RegistryPolicy":{"attributes":{"Id":"The ID of the policy.","Ref":"When you provide the logical ID of this resource to the `Ref` intrinsic function, `Ref` the name of the registry."},"description":"Use the `AWS::EventSchemas::RegistryPolicy` resource to specify resource-based policies for an EventBridge Schema Registry.","properties":{"Policy":"A resource-based policy.","RegistryName":"The name of the registry.","RevisionId":"The revision ID of the policy."}},"AWS::EventSchemas::Schema":{"attributes":{"Ref":"When you provide the logical ID of this resource to the `Ref` intrinsic function, `Ref` returns the ARN of the schema. For example:\\n\\n`{ \\"Ref\\": \\"MySchema\\" }`\\n\\nReturns a value similar to the following:\\n\\n`arn:aws:schemas:us-east-1:012345678901:schema/MyRegistry/MySchema`","SchemaArn":"The ARN of the schema.","SchemaName":"The name of the schema.","SchemaVersion":"The version number of the schema."},"description":"Use the `AWS::EventSchemas::Schema` resource to specify an event schema.","properties":{"Content":"The source of the schema definition.","Description":"A description of the schema.","RegistryName":"The name of the schema registry.","SchemaName":"The name of the schema.","Tags":"Tags associated with the schema.","Type":"The type of schema.\\n\\nValid types include `OpenApi3` and `JSONSchemaDraft4` ."}},"AWS::EventSchemas::Schema.TagsEntry":{"attributes":{},"description":"Tags to associate with the schema.","properties":{"Key":"They key of a key-value pair.","Value":"They value of a key-value pair."}},"AWS::Events::ApiDestination":{"attributes":{"Arn":"The ARN of the API destination that was created by the request.","Ref":"`Ref` returns the name of the API destination that was created by the request."},"description":"Creates an API destination, which is an HTTP invocation endpoint configured as a target for events.\\n\\nWhen using ApiDesinations with OAuth authentication we recommend these best practices:\\n\\n- Create a secret in Secrets Manager with your OAuth credentials.\\n- Reference that secret in your CloudFormation template for `AWS::Events::Connection` using CloudFormation dynamic reference syntax. For more information, see [Secrets Manager secrets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) .\\n\\nWhen the Connection resource is created the secret will be passed to EventBridge and stored in the customer account using “Service Linked Secrets,” effectively creating two secrets. This will minimize the cost because the original secret is only accessed when a CloudFormation template is created or updated, not every time an event is sent to the ApiDestination. The secret stored in the customer account by EventBridge is the one used for each event sent to the ApiDestination and AWS is responsible for the fees.\\n\\n> The secret stored in the customer account by EventBridge can’t be updated directly, only when a CloudFormation template is updated. \\n\\nFor examples of CloudFormation templates that use secrets, see [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-connection.html#aws-resource-events-connection--examples) .","properties":{"ConnectionArn":"The ARN of the connection to use for the API destination. The destination endpoint must support the authorization type specified for the connection.","Description":"A description for the API destination to create.","HttpMethod":"The method to use for the request to the HTTP invocation endpoint.","InvocationEndpoint":"The URL to the HTTP invocation endpoint for the API destination.","InvocationRateLimitPerSecond":"The maximum number of requests per second to send to the HTTP invocation endpoint.","Name":"The name for the API destination to create."}},"AWS::Events::Archive":{"attributes":{"Arn":"The ARN of the archive created.","Ref":"`Ref` returns the archive name."},"description":"Creates an archive of events with the specified settings. When you create an archive, incoming events might not immediately start being sent to the archive. Allow a short period of time for changes to take effect. If you do not specify a pattern to filter events sent to the archive, all events are sent to the archive except replayed events. Replayed events are not sent to an archive.","properties":{"ArchiveName":"The name for the archive to create.","Description":"A description for the archive.","EventPattern":"An event pattern to use to filter events sent to the archive.","RetentionDays":"The number of days to retain events for. Default value is 0. If set to 0, events are retained indefinitely","SourceArn":"The ARN of the event bus that sends events to the archive."}},"AWS::Events::Connection":{"attributes":{"Arn":"The ARN of the connection that was created by the request.","Ref":"`Ref` returns the name of the connection that was created by the request.","SecretArn":"The ARN for the secret created for the connection."},"description":"Creates a connection. A connection defines the authorization type and credentials to use for authorization with an API destination HTTP endpoint.","properties":{"AuthParameters":"A `CreateConnectionAuthRequestParameters` object that contains the authorization parameters to use to authorize with the endpoint.","AuthorizationType":"The type of authorization to use for the connection.\\n\\n> OAUTH tokens are refreshed when a 401 or 407 response is returned.","Description":"A description for the connection to create.","Name":"The name for the connection to create."}},"AWS::Events::Connection.ApiKeyAuthParameters":{"attributes":{},"description":"Contains the API key authorization parameters for the connection.","properties":{"ApiKeyName":"The name of the API key to use for authorization.","ApiKeyValue":"The value for the API key to use for authorization."}},"AWS::Events::Connection.AuthParameters":{"attributes":{},"description":"Contains the authorization parameters to use for the connection.","properties":{"ApiKeyAuthParameters":"The API Key parameters to use for authorization.","BasicAuthParameters":"The authorization parameters for Basic authorization.","InvocationHttpParameters":"Additional parameters for the connection that are passed through with every invocation to the HTTP endpoint.","OAuthParameters":"The OAuth parameters to use for authorization."}},"AWS::Events::Connection.BasicAuthParameters":{"attributes":{},"description":"Contains the Basic authorization parameters for the connection.","properties":{"Password":"The password associated with the user name to use for Basic authorization.","Username":"The user name to use for Basic authorization."}},"AWS::Events::Connection.ClientParameters":{"attributes":{},"description":"Contains the OAuth authorization parameters to use for the connection.","properties":{"ClientID":"The client ID to use for OAuth authorization.","ClientSecret":"The client secret assciated with the client ID to use for OAuth authorization."}},"AWS::Events::Connection.ConnectionHttpParameters":{"attributes":{},"description":"Contains additional parameters for the connection.","properties":{"BodyParameters":"Contains additional body string parameters for the connection.","HeaderParameters":"Contains additional header parameters for the connection.","QueryStringParameters":"Contains additional query string parameters for the connection."}},"AWS::Events::Connection.OAuthParameters":{"attributes":{},"description":"Contains the OAuth authorization parameters to use for the connection.","properties":{"AuthorizationEndpoint":"The URL to the authorization endpoint when OAuth is specified as the authorization type.","ClientParameters":"A `CreateConnectionOAuthClientRequestParameters` object that contains the client parameters for OAuth authorization.","HttpMethod":"The method to use for the authorization request.","OAuthHttpParameters":"A `ConnectionHttpParameters` object that contains details about the additional parameters to use for the connection."}},"AWS::Events::Connection.Parameter":{"attributes":{},"description":"Additional query string parameter for the connection. You can include up to 100 additional query string parameters per request. Each additional parameter counts towards the event payload size, which cannot exceed 64 KB.","properties":{"IsValueSecret":"Specifies whether the value is secret.","Key":"The key for a query string parameter.","Value":"The value associated with the key for the query string parameter."}},"AWS::Events::Endpoint":{"attributes":{"Arn":"The ARN of the endpoint.","EndpointId":"The ID of the endpoint.","EndpointUrl":"The URL of the endpoint.","Ref":"`Ref` returns Endpoint ID, such as `mystack-Endpoint-ABCDEFGHIJK` .","State":"The current state of the endpoint.","StateReason":"The reason the endpoint is in its current state."},"description":"A global endpoint used to improve your application\'s availability by making it regional-fault tolerant. For more information about global endpoints, see [Making applications Regional-fault tolerant with global endpoints and event replication](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-global-endpoints.html) in the *Amazon EventBridge User Guide* .","properties":{"Description":"A description for the endpoint.","EventBuses":"The event buses being used by the endpoint.\\n\\n*Exactly* : `2`","Name":"The name of the endpoint.","ReplicationConfig":"Whether event replication was enabled or disabled for this endpoint. The default state is `ENABLED` which means you must supply a `RoleArn` . If you don\'t have a `RoleArn` or you don\'t want event replication enabled, set the state to `DISABLED` .","RoleArn":"The ARN of the role used by event replication for the endpoint.","RoutingConfig":"The routing configuration of the endpoint."}},"AWS::Events::Endpoint.EndpointEventBus":{"attributes":{},"description":"The event buses the endpoint is associated with.","properties":{"EventBusArn":"The ARN of the event bus the endpoint is associated with."}},"AWS::Events::Endpoint.FailoverConfig":{"attributes":{},"description":"The failover configuration for an endpoint. This includes what triggers failover and what happens when it\'s triggered.","properties":{"Primary":"The main Region of the endpoint.","Secondary":"The Region that events are routed to when failover is triggered or event replication is enabled."}},"AWS::Events::Endpoint.Primary":{"attributes":{},"description":"The primary Region of the endpoint.","properties":{"HealthCheck":"The ARN of the health check used by the endpoint to determine whether failover is triggered."}},"AWS::Events::Endpoint.ReplicationConfig":{"attributes":{},"description":"Endpoints can replicate all events to the secondary Region.","properties":{"State":"The state of event replication."}},"AWS::Events::Endpoint.RoutingConfig":{"attributes":{},"description":"The routing configuration of the endpoint.","properties":{"FailoverConfig":"The failover configuration for an endpoint. This includes what triggers failover and what happens when it\'s triggered."}},"AWS::Events::Endpoint.Secondary":{"attributes":{},"description":"The secondary Region that processes events when failover is triggered or replication is enabled.","properties":{"Route":"Defines the secondary Region."}},"AWS::Events::EventBus":{"attributes":{"Arn":"The ARN of the event bus, such as `arn:aws:events:us-east-2:123456789012:event-bus/aws.partner/PartnerName/acct1/repo1` .","Name":"The name of the event bus, such as `PartnerName/acct1/repo1` .","Policy":"The policy for the event bus in JSON form.","Ref":"The name of the new event bus."},"description":"Creates a new event bus within your account. This can be a custom event bus which you can use to receive events from your custom applications and services, or it can be a partner event bus which can be matched to a partner event source.","properties":{"EventSourceName":"If you are creating a partner event bus, this specifies the partner event source that the new event bus will be matched with.","Name":"The name of the new event bus.\\n\\nCustom event bus names can\'t contain the `/` character, but you can use the `/` character in partner event bus names. In addition, for partner event buses, the name must exactly match the name of the partner event source that this event bus is matched to.\\n\\nYou can\'t use the name `default` for a custom event bus, as this name is already used for your account\'s default event bus.","Tags":"Tags to associate with the event bus."}},"AWS::Events::EventBus.TagEntry":{"attributes":{},"description":"A key-value pair associated with an AWS resource. In EventBridge, rules and event buses support tagging.","properties":{"Key":"A string you can use to assign a value. The combination of tag keys and values can help you organize and categorize your resources.","Value":"The value for the specified tag key."}},"AWS::Events::EventBusPolicy":{"attributes":{"Ref":"`Ref` returns the event bus policy ID, such as `EventBusPolicy-1aBCdeFGh2J3` ."},"description":"Running `PutPermission` permits the specified AWS account or AWS organization to put events to the specified *event bus* . Amazon EventBridge (CloudWatch Events) rules in your account are triggered by these events arriving to an event bus in your account.\\n\\nFor another account to send events to your account, that external account must have an EventBridge rule with your account\'s event bus as a target.\\n\\nTo enable multiple AWS accounts to put events to your event bus, run `PutPermission` once for each of these accounts. Or, if all the accounts are members of the same AWS organization, you can run `PutPermission` once specifying `Principal` as \\"*\\" and specifying the AWS organization ID in `Condition` , to grant permissions to all accounts in that organization.\\n\\nIf you grant permissions using an organization, then accounts in that organization must specify a `RoleArn` with proper permissions when they use `PutTarget` to add your account\'s event bus as a target. For more information, see [Sending and Receiving Events Between AWS Accounts](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-cross-account-event-delivery.html) in the *Amazon EventBridge User Guide* .\\n\\nThe permission policy on the event bus cannot exceed 10 KB in size.","properties":{"Action":"The action that you are enabling the other account to perform.","Condition":"This parameter enables you to limit the permission to accounts that fulfill a certain condition, such as being a member of a certain AWS organization. For more information about AWS Organizations, see [What Is AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) in the *AWS Organizations User Guide* .\\n\\nIf you specify `Condition` with an AWS organization ID, and specify \\"*\\" as the value for `Principal` , you grant permission to all the accounts in the named organization.\\n\\nThe `Condition` is a JSON string which must contain `Type` , `Key` , and `Value` fields.","EventBusName":"The name of the event bus associated with the rule. If you omit this, the default event bus is used.","Principal":"The 12-digit AWS account ID that you are permitting to put events to your default event bus. Specify \\"*\\" to permit any account to put events to your default event bus.\\n\\nIf you specify \\"*\\" without specifying `Condition` , avoid creating rules that may match undesirable events. To create more secure rules, make sure that the event pattern for each rule contains an `account` field with a specific account ID from which to receive events. Rules with an account field do not match any events sent from other accounts.","Statement":"A JSON string that describes the permission policy statement. You can include a `Policy` parameter in the request instead of using the `StatementId` , `Action` , `Principal` , or `Condition` parameters.","StatementId":"An identifier string for the external account that you are granting permissions to. If you later want to revoke the permission for this external account, specify this `StatementId` when you run [RemovePermission](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_RemovePermission.html) .\\n\\n> Each `StatementId` must be unique."}},"AWS::Events::EventBusPolicy.Condition":{"attributes":{},"description":"A JSON string which you can use to limit the event bus permissions you are granting to only accounts that fulfill the condition. Currently, the only supported condition is membership in a certain AWS organization. The string must contain `Type` , `Key` , and `Value` fields. The `Value` field specifies the ID of the AWS organization. Following is an example value for `Condition` :\\n\\n`\'{\\"Type\\" : \\"StringEquals\\", \\"Key\\": \\"aws:PrincipalOrgID\\", \\"Value\\": \\"o-1234567890\\"}\'`","properties":{"Key":"Specifies the key for the condition. Currently the only supported key is `aws:PrincipalOrgID` .","Type":"Specifies the type of condition. Currently the only supported value is `StringEquals` .","Value":"Specifies the value for the key. Currently, this must be the ID of the organization."}},"AWS::Events::Rule":{"attributes":{"Arn":"The ARN of the rule, such as `arn:aws:events:us-east-2:123456789012:rule/example` .","Ref":"`Ref` returns event rule ID, such as `mystack-ScheduledRule-ABCDEFGHIJK` ."},"description":"Creates or updates the specified rule. Rules are enabled by default, or based on value of the state. You can disable a rule using [DisableRule](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_DisableRule.html) .\\n\\nA single rule watches for events from a single event bus. Events generated by AWS services go to your account\'s default event bus. Events generated by SaaS partner services or applications go to the matching partner event bus. If you have custom applications or services, you can specify whether their events go to your default event bus or a custom event bus that you have created. For more information, see [CreateEventBus](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_CreateEventBus.html) .\\n\\nIf you are updating an existing rule, the rule is replaced with what you specify in this `PutRule` command. If you omit arguments in `PutRule` , the old values for those arguments are not kept. Instead, they are replaced with null values.\\n\\nWhen you create or update a rule, incoming events might not immediately start matching to new or updated rules. Allow a short period of time for changes to take effect.\\n\\nA rule must contain at least an EventPattern or ScheduleExpression. Rules with EventPatterns are triggered when a matching event is observed. Rules with ScheduleExpressions self-trigger based on the given schedule. A rule can have both an EventPattern and a ScheduleExpression, in which case the rule triggers on matching events as well as on a schedule.\\n\\nMost services in AWS treat : or / as the same character in Amazon Resource Names (ARNs). However, EventBridge uses an exact match in event patterns and rules. Be sure to use the correct ARN characters when creating event patterns so that they match the ARN syntax in the event you want to match.\\n\\nIn EventBridge, it is possible to create rules that lead to infinite loops, where a rule is fired repeatedly. For example, a rule might detect that ACLs have changed on an S3 bucket, and trigger software to change them to the desired state. If the rule is not written carefully, the subsequent change to the ACLs fires the rule again, creating an infinite loop.\\n\\nTo prevent this, write the rules so that the triggered actions do not re-fire the same rule. For example, your rule could fire only if ACLs are found to be in a bad state, instead of after any change.\\n\\nAn infinite loop can quickly cause higher than expected charges. We recommend that you use budgeting, which alerts you when charges exceed your specified limit. For more information, see [Managing Your Costs with Budgets](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/budgets-managing-costs.html) .","properties":{"Description":"The description of the rule.","EventBusName":"The name or ARN of the event bus associated with the rule. If you omit this, the default event bus is used.","EventPattern":"The event pattern of the rule. For more information, see [Events and Event Patterns](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-and-event-patterns.html) in the *Amazon EventBridge User Guide* .","Name":"The name of the rule.","RoleArn":"The Amazon Resource Name (ARN) of the role that is used for target invocation.\\n\\nIf you\'re setting an event bus in another account as the target and that account granted permission to your account through an organization instead of directly by the account ID, you must specify a `RoleArn` with proper permissions in the `Target` structure, instead of here in this parameter.","ScheduleExpression":"The scheduling expression. For example, \\"cron(0 20 * * ? *)\\", \\"rate(5 minutes)\\". For more information, see [Creating an Amazon EventBridge rule that runs on a schedule](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule-schedule.html) .","State":"The state of the rule.","Targets":"Adds the specified targets to the specified rule, or updates the targets if they are already associated with the rule.\\n\\nTargets are the resources that are invoked when a rule is triggered.\\n\\nThe maximum number of entries per request is 10.\\n\\n> Each rule can have up to five (5) targets associated with it at one time. \\n\\nFor a list of services you can configure as targets for events, see [EventBridge targets](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-targets.html) in the *Amazon EventBridge User Guide* .\\n\\nCreating rules with built-in targets is supported only in the AWS Management Console . The built-in targets are:\\n\\n- `Amazon EBS CreateSnapshot API call`\\n- `Amazon EC2 RebootInstances API call`\\n- `Amazon EC2 StopInstances API call`\\n- `Amazon EC2 TerminateInstances API call`\\n\\nFor some target types, `PutTargets` provides target-specific parameters. If the target is a Kinesis data stream, you can optionally specify which shard the event goes to by using the `KinesisParameters` argument. To invoke a command on multiple EC2 instances with one rule, you can use the `RunCommandParameters` field.\\n\\nTo be able to make API calls against the resources that you own, Amazon EventBridge needs the appropriate permissions:\\n\\n- For AWS Lambda and Amazon SNS resources, EventBridge relies on resource-based policies.\\n- For EC2 instances, Kinesis Data Streams, AWS Step Functions state machines and API Gateway APIs, EventBridge relies on IAM roles that you specify in the `RoleARN` argument in `PutTargets` .\\n\\nFor more information, see [Authentication and Access Control](https://docs.aws.amazon.com/eventbridge/latest/userguide/auth-and-access-control-eventbridge.html) in the *Amazon EventBridge User Guide* .\\n\\nIf another AWS account is in the same region and has granted you permission (using `PutPermission` ), you can send events to that account. Set that account\'s event bus as a target of the rules in your account. To send the matched events to the other account, specify that account\'s event bus as the `Arn` value when you run `PutTargets` . If your account sends events to another account, your account is charged for each sent event. Each event sent to another account is charged as a custom event. The account receiving the event is not charged. For more information, see [Amazon EventBridge Pricing](https://docs.aws.amazon.com/eventbridge/pricing/) .\\n\\n> `Input` , `InputPath` , and `InputTransformer` are not available with `PutTarget` if the target is an event bus of a different AWS account. \\n\\nIf you are setting the event bus of another account as the target, and that account granted permission to your account through an organization instead of directly by the account ID, then you must specify a `RoleArn` with proper permissions in the `Target` structure. For more information, see [Sending and Receiving Events Between AWS Accounts](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-cross-account-event-delivery.html) in the *Amazon EventBridge User Guide* .\\n\\n> If you have an IAM role on a cross-account event bus target, a `PutTargets` call without a role on the same target (same `Id` and `Arn` ) will not remove the role. \\n\\nFor more information about enabling cross-account events, see [PutPermission](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutPermission.html) .\\n\\n*Input* , *InputPath* , and *InputTransformer* are mutually exclusive and optional parameters of a target. When a rule is triggered due to a matched event:\\n\\n- If none of the following arguments are specified for a target, then the entire event is passed to the target in JSON format (unless the target is Amazon EC2 Run Command or Amazon ECS task, in which case nothing from the event is passed to the target).\\n- If *Input* is specified in the form of valid JSON, then the matched event is overridden with this constant.\\n- If *InputPath* is specified in the form of JSONPath (for example, `$.detail` ), then only the part of the event specified in the path is passed to the target (for example, only the detail part of the event is passed).\\n- If *InputTransformer* is specified, then one or more specified JSONPaths are extracted from the event and used as values in a template that you specify as the input to the target.\\n\\nWhen you specify `InputPath` or `InputTransformer` , you must use JSON dot notation, not bracket notation.\\n\\nWhen you add targets to a rule and the associated rule triggers soon after, new or updated targets might not be immediately invoked. Allow a short period of time for changes to take effect.\\n\\nThis action can partially fail if too many requests are made at the same time. If that happens, `FailedEntryCount` is non-zero in the response and each entry in `FailedEntries` provides the ID of the failed target and the error code."}},"AWS::Events::Rule.AwsVpcConfiguration":{"attributes":{},"description":"This structure specifies the VPC subnets and security groups for the task, and whether a public IP address is to be used. This structure is relevant only for ECS tasks that use the `awsvpc` network mode.","properties":{"AssignPublicIp":"Specifies whether the task\'s elastic network interface receives a public IP address. You can specify `ENABLED` only when `LaunchType` in `EcsParameters` is set to `FARGATE` .","SecurityGroups":"Specifies the security groups associated with the task. These security groups must all be in the same VPC. You can specify as many as five security groups. If you do not specify a security group, the default security group for the VPC is used.","Subnets":"Specifies the subnets associated with the task. These subnets must all be in the same VPC. You can specify as many as 16 subnets."}},"AWS::Events::Rule.BatchArrayProperties":{"attributes":{},"description":"The array properties for the submitted job, such as the size of the array. The array size can be between 2 and 10,000. If you specify array properties for a job, it becomes an array job. This parameter is used only if the target is an AWS Batch job.","properties":{"Size":"The size of the array, if this is an array batch job. Valid values are integers between 2 and 10,000."}},"AWS::Events::Rule.BatchParameters":{"attributes":{},"description":"The custom parameters to be used when the target is an AWS Batch job.","properties":{"ArrayProperties":"The array properties for the submitted job, such as the size of the array. The array size can be between 2 and 10,000. If you specify array properties for a job, it becomes an array job. This parameter is used only if the target is an AWS Batch job.","JobDefinition":"The ARN or name of the job definition to use if the event target is an AWS Batch job. This job definition must already exist.","JobName":"The name to use for this execution of the job, if the target is an AWS Batch job.","RetryStrategy":"The retry strategy to use for failed jobs, if the target is an AWS Batch job. The retry strategy is the number of times to retry the failed job execution. Valid values are 1–10. When you specify a retry strategy here, it overrides the retry strategy defined in the job definition."}},"AWS::Events::Rule.BatchRetryStrategy":{"attributes":{},"description":"The retry strategy to use for failed jobs, if the target is an AWS Batch job. If you specify a retry strategy here, it overrides the retry strategy defined in the job definition.","properties":{"Attempts":"The number of times to attempt to retry, if the job fails. Valid values are 1–10."}},"AWS::Events::Rule.CapacityProviderStrategyItem":{"attributes":{},"description":"The details of a capacity provider strategy. To learn more, see [CapacityProviderStrategyItem](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CapacityProviderStrategyItem.html) in the Amazon ECS API Reference.","properties":{"Base":"The base value designates how many tasks, at a minimum, to run on the specified capacity provider. Only one capacity provider in a capacity provider strategy can have a base defined. If no value is specified, the default value of 0 is used.","CapacityProvider":"The short name of the capacity provider.","Weight":"The weight value designates the relative percentage of the total number of tasks launched that should use the specified capacity provider. The weight value is taken into consideration after the base value, if defined, is satisfied."}},"AWS::Events::Rule.DeadLetterConfig":{"attributes":{},"description":"A `DeadLetterConfig` object that contains information about a dead-letter queue configuration.","properties":{"Arn":"The ARN of the SQS queue specified as the target for the dead-letter queue."}},"AWS::Events::Rule.EcsParameters":{"attributes":{},"description":"The custom parameters to be used when the target is an Amazon ECS task.","properties":{"CapacityProviderStrategy":"The capacity provider strategy to use for the task.\\n\\nIf a `capacityProviderStrategy` is specified, the `launchType` parameter must be omitted. If no `capacityProviderStrategy` or launchType is specified, the `defaultCapacityProviderStrategy` for the cluster is used.","EnableECSManagedTags":"Specifies whether to enable Amazon ECS managed tags for the task. For more information, see [Tagging Your Amazon ECS Resources](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html) in the Amazon Elastic Container Service Developer Guide.","EnableExecuteCommand":"Whether or not to enable the execute command functionality for the containers in this task. If true, this enables execute command functionality on all containers in the task.","Group":"Specifies an ECS task group for the task. The maximum length is 255 characters.","LaunchType":"Specifies the launch type on which your task is running. The launch type that you specify here must match one of the launch type (compatibilities) of the target task. The `FARGATE` value is supported only in the Regions where AWS Fargate with Amazon ECS is supported. For more information, see [AWS Fargate on Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS-Fargate.html) in the *Amazon Elastic Container Service Developer Guide* .","NetworkConfiguration":"Use this structure if the Amazon ECS task uses the `awsvpc` network mode. This structure specifies the VPC subnets and security groups associated with the task, and whether a public IP address is to be used. This structure is required if `LaunchType` is `FARGATE` because the `awsvpc` mode is required for Fargate tasks.\\n\\nIf you specify `NetworkConfiguration` when the target ECS task does not use the `awsvpc` network mode, the task fails.","PlacementConstraints":"An array of placement constraint objects to use for the task. You can specify up to 10 constraints per task (including constraints in the task definition and those specified at runtime).","PlacementStrategies":"The placement strategy objects to use for the task. You can specify a maximum of five strategy rules per task.","PlatformVersion":"Specifies the platform version for the task. Specify only the numeric portion of the platform version, such as `1.1.0` .\\n\\nThis structure is used only if `LaunchType` is `FARGATE` . For more information about valid platform versions, see [AWS Fargate Platform Versions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html) in the *Amazon Elastic Container Service Developer Guide* .","PropagateTags":"Specifies whether to propagate the tags from the task definition to the task. If no value is specified, the tags are not propagated. Tags can only be propagated to the task during task creation. To add tags to a task after task creation, use the TagResource API action.","ReferenceId":"The reference ID to use for the task.","TagList":"The metadata that you apply to the task to help you categorize and organize them. Each tag consists of a key and an optional value, both of which you define. To learn more, see [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html#ECS-RunTask-request-tags) in the Amazon ECS API Reference.","TaskCount":"The number of tasks to create based on `TaskDefinition` . The default is 1.","TaskDefinitionArn":"The ARN of the task definition to use if the event target is an Amazon ECS task."}},"AWS::Events::Rule.HttpParameters":{"attributes":{},"description":"These are custom parameter to be used when the target is an API Gateway APIs or EventBridge ApiDestinations. In the latter case, these are merged with any InvocationParameters specified on the Connection, with any values from the Connection taking precedence.","properties":{"HeaderParameters":"The headers that need to be sent as part of request invoking the API Gateway API or EventBridge ApiDestination.","PathParameterValues":"The path parameter values to be used to populate API Gateway API or EventBridge ApiDestination path wildcards (\\"*\\").","QueryStringParameters":"The query string keys/values that need to be sent as part of request invoking the API Gateway API or EventBridge ApiDestination."}},"AWS::Events::Rule.InputTransformer":{"attributes":{},"description":"Contains the parameters needed for you to provide custom input to a target based on one or more pieces of data extracted from the event.","properties":{"InputPathsMap":"Map of JSON paths to be extracted from the event. You can then insert these in the template in `InputTemplate` to produce the output you want to be sent to the target.\\n\\n`InputPathsMap` is an array key-value pairs, where each value is a valid JSON path. You can have as many as 100 key-value pairs. You must use JSON dot notation, not bracket notation.\\n\\nThe keys cannot start with \\" AWS .\\"","InputTemplate":"Input template where you specify placeholders that will be filled with the values of the keys from `InputPathsMap` to customize the data sent to the target. Enclose each `InputPathsMaps` value in brackets: < *value* >\\n\\nIf `InputTemplate` is a JSON object (surrounded by curly braces), the following restrictions apply:\\n\\n- The placeholder cannot be used as an object key.\\n\\nThe following example shows the syntax for using `InputPathsMap` and `InputTemplate` .\\n\\n`\\"InputTransformer\\":`\\n\\n`{`\\n\\n`\\"InputPathsMap\\": {\\"instance\\": \\"$.detail.instance\\",\\"status\\": \\"$.detail.status\\"},`\\n\\n`\\"InputTemplate\\": \\" is in state \\"`\\n\\n`}`\\n\\nTo have the `InputTemplate` include quote marks within a JSON string, escape each quote marks with a slash, as in the following example:\\n\\n`\\"InputTransformer\\":`\\n\\n`{`\\n\\n`\\"InputPathsMap\\": {\\"instance\\": \\"$.detail.instance\\",\\"status\\": \\"$.detail.status\\"},`\\n\\n`\\"InputTemplate\\": \\" is in state \\\\\\"\\\\\\"\\"`\\n\\n`}`\\n\\nThe `InputTemplate` can also be valid JSON with varibles in quotes or out, as in the following example:\\n\\n`\\"InputTransformer\\":`\\n\\n`{`\\n\\n`\\"InputPathsMap\\": {\\"instance\\": \\"$.detail.instance\\",\\"status\\": \\"$.detail.status\\"},`\\n\\n`\\"InputTemplate\\": \'{\\"myInstance\\": ,\\"myStatus\\": \\" is in state \\\\\\"\\\\\\"\\"}\'`\\n\\n`}`"}},"AWS::Events::Rule.KinesisParameters":{"attributes":{},"description":"This object enables you to specify a JSON path to extract from the event and use as the partition key for the Amazon Kinesis data stream, so that you can control the shard to which the event goes. If you do not include this parameter, the default is to use the `eventId` as the partition key.","properties":{"PartitionKeyPath":"The JSON path to be extracted from the event and used as the partition key. For more information, see [Amazon Kinesis Streams Key Concepts](https://docs.aws.amazon.com/streams/latest/dev/key-concepts.html#partition-key) in the *Amazon Kinesis Streams Developer Guide* ."}},"AWS::Events::Rule.NetworkConfiguration":{"attributes":{},"description":"This structure specifies the network configuration for an ECS task.","properties":{"AwsVpcConfiguration":"Use this structure to specify the VPC subnets and security groups for the task, and whether a public IP address is to be used. This structure is relevant only for ECS tasks that use the `awsvpc` network mode."}},"AWS::Events::Rule.PlacementConstraint":{"attributes":{},"description":"An object representing a constraint on task placement. To learn more, see [Task Placement Constraints](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html) in the Amazon Elastic Container Service Developer Guide.","properties":{"Expression":"A cluster query language expression to apply to the constraint. You cannot specify an expression if the constraint type is `distinctInstance` . To learn more, see [Cluster Query Language](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html) in the Amazon Elastic Container Service Developer Guide.","Type":"The type of constraint. Use distinctInstance to ensure that each task in a particular group is running on a different container instance. Use memberOf to restrict the selection to a group of valid candidates."}},"AWS::Events::Rule.PlacementStrategy":{"attributes":{},"description":"The task placement strategy for a task or service. To learn more, see [Task Placement Strategies](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-strategies.html) in the Amazon Elastic Container Service Service Developer Guide.","properties":{"Field":"The field to apply the placement strategy against. For the spread placement strategy, valid values are instanceId (or host, which has the same effect), or any platform or custom attribute that is applied to a container instance, such as attribute:ecs.availability-zone. For the binpack placement strategy, valid values are cpu and memory. For the random placement strategy, this field is not used.","Type":"The type of placement strategy. The random placement strategy randomly places tasks on available candidates. The spread placement strategy spreads placement across available candidates evenly based on the field parameter. The binpack strategy places tasks on available candidates that have the least available amount of the resource that is specified with the field parameter. For example, if you binpack on memory, a task is placed on the instance with the least amount of remaining memory (but still enough to run the task)."}},"AWS::Events::Rule.RedshiftDataParameters":{"attributes":{},"description":"These are custom parameters to be used when the target is a Amazon Redshift cluster to invoke the Amazon Redshift Data API ExecuteStatement based on EventBridge events.","properties":{"Database":"The name of the database. Required when authenticating using temporary credentials.","DbUser":"The database user name. Required when authenticating using temporary credentials.","SecretManagerArn":"The name or ARN of the secret that enables access to the database. Required when authenticating using AWS Secrets Manager.","Sql":"The SQL statement text to run.","StatementName":"The name of the SQL statement. You can name the SQL statement when you create it to identify the query.","WithEvent":"Indicates whether to send an event back to EventBridge after the SQL statement runs."}},"AWS::Events::Rule.RetryPolicy":{"attributes":{},"description":"A `RetryPolicy` object that includes information about the retry policy settings.","properties":{"MaximumEventAgeInSeconds":"The maximum amount of time, in seconds, to continue to make retry attempts.","MaximumRetryAttempts":"The maximum number of retry attempts to make before the request fails. Retry attempts continue until either the maximum number of attempts is made or until the duration of the `MaximumEventAgeInSeconds` is met."}},"AWS::Events::Rule.RunCommandParameters":{"attributes":{},"description":"This parameter contains the criteria (either InstanceIds or a tag) used to specify which EC2 instances are to be sent the command.","properties":{"RunCommandTargets":"Currently, we support including only one RunCommandTarget block, which specifies either an array of InstanceIds or a tag."}},"AWS::Events::Rule.RunCommandTarget":{"attributes":{},"description":"Information about the EC2 instances that are to be sent the command, specified as key-value pairs. Each `RunCommandTarget` block can include only one key, but this key may specify multiple values.","properties":{"Key":"Can be either `tag:` *tag-key* or `InstanceIds` .","Values":"If `Key` is `tag:` *tag-key* , `Values` is a list of tag values. If `Key` is `InstanceIds` , `Values` is a list of Amazon EC2 instance IDs."}},"AWS::Events::Rule.SageMakerPipelineParameter":{"attributes":{},"description":"Name/Value pair of a parameter to start execution of a SageMaker Model Building Pipeline.","properties":{"Name":"Name of parameter to start execution of a SageMaker Model Building Pipeline.","Value":"Value of parameter to start execution of a SageMaker Model Building Pipeline."}},"AWS::Events::Rule.SageMakerPipelineParameters":{"attributes":{},"description":"These are custom parameters to use when the target is a SageMaker Model Building Pipeline that starts based on EventBridge events.","properties":{"PipelineParameterList":"List of Parameter names and values for SageMaker Model Building Pipeline execution."}},"AWS::Events::Rule.SqsParameters":{"attributes":{},"description":"This structure includes the custom parameter to be used when the target is an SQS FIFO queue.","properties":{"MessageGroupId":"The FIFO message group ID to use as the target."}},"AWS::Events::Rule.Tag":{"attributes":{},"description":"A key-value pair associated with an ECS Target of an EventBridge rule. The tag will be propagated to ECS by EventBridge when starting an ECS task based on a matched event.\\n\\n> Currently, tags are only available when using ECS with EventBridge .","properties":{"Key":"A string you can use to assign a value. The combination of tag keys and values can help you organize and categorize your resources.","Value":"The value for the specified tag key."}},"AWS::Events::Rule.Target":{"attributes":{},"description":"Targets are the resources to be invoked when a rule is triggered. For a complete list of services and resources that can be set as a target, see [PutTargets](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutTargets.html) .\\n\\nIf you are setting the event bus of another account as the target, and that account granted permission to your account through an organization instead of directly by the account ID, then you must specify a `RoleArn` with proper permissions in the `Target` structure. For more information, see [Sending and Receiving Events Between AWS Accounts](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-cross-account-event-delivery.html) in the *Amazon EventBridge User Guide* .","properties":{"Arn":"The Amazon Resource Name (ARN) of the target.","BatchParameters":"If the event target is an AWS Batch job, this contains the job definition, job name, and other parameters. For more information, see [Jobs](https://docs.aws.amazon.com/batch/latest/userguide/jobs.html) in the *AWS Batch User Guide* .","DeadLetterConfig":"The `DeadLetterConfig` that defines the target queue to send dead-letter queue events to.","EcsParameters":"Contains the Amazon ECS task definition and task count to be used, if the event target is an Amazon ECS task. For more information about Amazon ECS tasks, see [Task Definitions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_defintions.html) in the *Amazon EC2 Container Service Developer Guide* .","HttpParameters":"Contains the HTTP parameters to use when the target is a API Gateway endpoint or EventBridge ApiDestination.\\n\\nIf you specify an API Gateway API or EventBridge ApiDestination as a target, you can use this parameter to specify headers, path parameters, and query string keys/values as part of your target invoking request. If you\'re using ApiDestinations, the corresponding Connection can also have these values configured. In case of any conflicting keys, values from the Connection take precedence.","Id":"The ID of the target within the specified rule. Use this ID to reference the target when updating the rule. We recommend using a memorable and unique string.","Input":"Valid JSON text passed to the target. In this case, nothing from the event itself is passed to the target. For more information, see [The JavaScript Object Notation (JSON) Data Interchange Format](https://docs.aws.amazon.com/http://www.rfc-editor.org/rfc/rfc7159.txt) .","InputPath":"The value of the JSONPath that is used for extracting part of the matched event when passing it to the target. You may use JSON dot notation or bracket notation. For more information about JSON paths, see [JSONPath](https://docs.aws.amazon.com/http://goessner.net/articles/JsonPath/) .","InputTransformer":"Settings to enable you to provide custom input to a target based on certain event data. You can extract one or more key-value pairs from the event and then use that data to send customized input to the target.","KinesisParameters":"The custom parameter you can use to control the shard assignment, when the target is a Kinesis data stream. If you do not include this parameter, the default is to use the `eventId` as the partition key.","RedshiftDataParameters":"Contains the Amazon Redshift Data API parameters to use when the target is a Amazon Redshift cluster.\\n\\nIf you specify a Amazon Redshift Cluster as a Target, you can use this to specify parameters to invoke the Amazon Redshift Data API ExecuteStatement based on EventBridge events.","RetryPolicy":"The `RetryPolicy` object that contains the retry policy configuration to use for the dead-letter queue.","RoleArn":"The Amazon Resource Name (ARN) of the IAM role to be used for this target when the rule is triggered. If one rule triggers multiple targets, you can use a different IAM role for each target.","RunCommandParameters":"Parameters used when you are using the rule to invoke Amazon EC2 Run Command.","SageMakerPipelineParameters":"Contains the SageMaker Model Building Pipeline parameters to start execution of a SageMaker Model Building Pipeline.\\n\\nIf you specify a SageMaker Model Building Pipeline as a target, you can use this to specify parameters to start a pipeline execution based on EventBridge events.","SqsParameters":"Contains the message group ID to use when the target is a FIFO queue.\\n\\nIf you specify an SQS FIFO queue as a target, the queue must have content-based deduplication enabled."}},"AWS::Evidently::Experiment":{"attributes":{"Arn":"The ARN of the experiment. For example, `arn:aws:evidently:us-west-2:0123455678912:project/myProject/experiment/myExperiment`","Ref":"`Ref` returns the ARN of the experiment. For example, `arn:aws:evidently:us-west-2:0123455678912:project/myProject/experiment/myExperiment`"},"description":"Creates or updates an Evidently *experiment* . Before you create an experiment, you must create the feature to use for the experiment.\\n\\nAn experiment helps you make feature design decisions based on evidence and data. An experiment can test as many as five variations at once. Evidently collects experiment data and analyzes it by statistical methods, and provides clear recommendations about which variations perform better.","properties":{"Description":"An optional description of the experiment.","MetricGoals":"An array of structures that defines the metrics used for the experiment, and whether a higher or lower value for each metric is the goal. You can use up to three metrics in an experiment.","Name":"A name for the new experiment.","OnlineAbConfig":"A structure that contains the configuration of which variation to use as the \\"control\\" version. The \\"control\\" version is used for comparison with other variations. This structure also specifies how much experiment traffic is allocated to each variation.","Project":"The name or the ARN of the project where this experiment is to be created.","RandomizationSalt":"When Evidently assigns a particular user session to an experiment, it must use a randomization ID to determine which variation the user session is served. This randomization ID is a combination of the entity ID and `randomizationSalt` . If you omit `randomizationSalt` , Evidently uses the experiment name as the `randomizationSalt` .","RemoveSegment":"Set this to `true` to remove the segment that is associated with this experiment. You can\'t use this parameter if the experiment is currently running.","RunningStatus":"A structure that you can use to start and stop the experiment.","SamplingRate":"The portion of the available audience that you want to allocate to this experiment, in thousandths of a percent. The available audience is the total audience minus the audience that you have allocated to overrides or current launches of this feature.\\n\\nThis is represented in thousandths of a percent. For example, specify 10,000 to allocate 10% of the available audience.","Segment":"Specifies an audience *segment* to use in the experiment. When a segment is used in an experiment, only user sessions that match the segment pattern are used in the experiment.\\n\\nFor more information, see [Segment rule pattern syntax](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Evidently-segments-syntax.html) .","Tags":"Assigns one or more tags (key-value pairs) to the experiment.\\n\\nTags can help you organize and categorize your resources. You can also use them to scope user permissions by granting a user permission to access or change only resources with certain tag values.\\n\\nTags don\'t have any semantic meaning to AWS and are interpreted strictly as strings of characters.\\n\\nYou can associate as many as 50 tags with an experiment.\\n\\nFor more information, see [Tagging AWS resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) .","Treatments":"An array of structures that describe the configuration of each feature variation used in the experiment."}},"AWS::Evidently::Experiment.MetricGoalObject":{"attributes":{},"description":"Use this structure to tell Evidently whether higher or lower values are desired for a metric that is used in an experiment.","properties":{"DesiredChange":"`INCREASE` means that a variation with a higher number for this metric is performing better.\\n\\n`DECREASE` means that a variation with a lower number for this metric is performing better.","EntityIdKey":"The entity, such as a user or session, that does an action that causes a metric value to be recorded. An example is `userDetails.userID` .","EventPattern":"The EventBridge event pattern that defines how the metric is recorded.\\n\\nFor more information about EventBridge event patterns, see [Amazon EventBridge event patterns](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html) .","MetricName":"A name for the metric. It can include up to 255 characters.","UnitLabel":"A label for the units that the metric is measuring.","ValueKey":"The JSON path to reference the numerical metric value in the event."}},"AWS::Evidently::Experiment.OnlineAbConfigObject":{"attributes":{},"description":"A structure that contains the configuration of which variation to use as the \\"control\\" version. The \\"control\\" version is used for comparison with other variations. This structure also specifies how much experiment traffic is allocated to each variation.","properties":{"ControlTreatmentName":"The name of the variation that is to be the default variation that the other variations are compared to.","TreatmentWeights":"A set of key-value pairs. The keys are treatment names, and the values are the portion of experiment traffic to be assigned to that treatment. Specify the traffic portion in thousandths of a percent, so 20,000 for a variation would allocate 20% of the experiment traffic to that variation."}},"AWS::Evidently::Experiment.RunningStatusObject":{"attributes":{},"description":"Use this structure to start and stop the experiment.","properties":{"AnalysisCompleteTime":"If you are using AWS CloudFormation to start the experiment, use this field to specify when the experiment is to end. The format is as a UNIX timestamp. For more information about this format, see [The Current Epoch Unix Timestamp](https://docs.aws.amazon.com/https://www.unixtimestamp.com/index.php) .","DesiredState":"If you are using AWS CloudFormation to stop this experiment, specify either `COMPLETED` or `CANCELLED` here to indicate how to classify this experiment.","Reason":"If you are using AWS CloudFormation to stop this experiment, this is an optional field that you can use to record why the experiment is being stopped or cancelled.","Status":"To start the experiment now, specify `START` for this parameter. If this experiment is currently running and you want to stop it now, specify `STOP` ."}},"AWS::Evidently::Experiment.TreatmentObject":{"attributes":{},"description":"A structure that defines one treatment in an experiment. A treatment is a variation of the feature that you are including in the experiment.","properties":{"Description":"The description of the treatment.","Feature":"The name of the feature for this experiment.","TreatmentName":"A name for this treatment. It can include up to 127 characters.","Variation":"The name of the variation to use for this treatment."}},"AWS::Evidently::Experiment.TreatmentToWeight":{"attributes":{},"description":"This structure defines how much experiment traffic to allocate to one treatment used in the experiment.","properties":{"SplitWeight":"The portion of experiment traffic to allocate to this treatment. Specify the traffic portion in thousandths of a percent, so 20,000 allocated to a treatment would allocate 20% of the experiment traffic to that treatment.","Treatment":"The name of the treatment."}},"AWS::Evidently::Feature":{"attributes":{"Arn":"The ARN of the feature. For example, `arn:aws:evidently:us-west-2:0123455678912:project/myProject/feature/myFeature` .","Ref":"`Ref` returns the ARN of the feature. For example, `arn:aws:evidently:us-west-2:0123455678912:project/myProject/feature/myFeature`"},"description":"Creates or updates an Evidently *feature* that you want to launch or test. You can define up to five variations of a feature, and use these variations in your launches and experiments. A feature must be created in a project. For information about creating a project, see [CreateProject](https://docs.aws.amazon.com/cloudwatchevidently/latest/APIReference/API_CreateProject.html) .","properties":{"DefaultVariation":"The name of the variation to use as the default variation. The default variation is served to users who are not allocated to any ongoing launches or experiments of this feature.\\n\\nThis variation must also be listed in the `Variations` structure.\\n\\nIf you omit `DefaultVariation` , the first variation listed in the `Variations` structure is used as the default variation.","Description":"An optional description of the feature.","EntityOverrides":"Specify users that should always be served a specific variation of a feature. Each user is specified by a key-value pair . For each key, specify a user by entering their user ID, account ID, or some other identifier. For the value, specify the name of the variation that they are to be served.","EvaluationStrategy":"Specify `ALL_RULES` to activate the traffic allocation specified by any ongoing launches or experiments. Specify `DEFAULT_VARIATION` to serve the default variation to all users instead.","Name":"The name for the feature. It can include up to 127 characters.","Project":"The name or ARN of the project that is to contain the new feature.","Tags":"Assigns one or more tags (key-value pairs) to the feature.\\n\\nTags can help you organize and categorize your resources. You can also use them to scope user permissions by granting a user permission to access or change only resources with certain tag values.\\n\\nTags don\'t have any semantic meaning to AWS and are interpreted strictly as strings of characters.\\n\\nYou can associate as many as 50 tags with a feature.\\n\\nFor more information, see [Tagging AWS resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) .","Variations":"An array of structures that contain the configuration of the feature\'s different variations.\\n\\nEach `VariationObject` in the `Variations` array for a feature must have the same type of value ( `BooleanValue` , `DoubleValue` , `LongValue` or `StringValue` )."}},"AWS::Evidently::Feature.EntityOverride":{"attributes":{},"description":"A set of key-value pairs that specify users who should always be served a specific variation of a feature. Each key specifies a user using their user ID, account ID, or some other identifier. The value specifies the name of the variation that the user is to be served.","properties":{"EntityId":"The entity ID to be served the variation specified in `Variation` .","Variation":"The name of the variation to serve to the user session that matches the `EntityId` ."}},"AWS::Evidently::Feature.VariationObject":{"attributes":{},"description":"This structure contains the name and variation value of one variation of a feature. It can contain only one of the following parameters: `BooleanValue` , `DoubleValue` , `LongValue` or `StringValue` .","properties":{"BooleanValue":"The value assigned to this variation, if the variation type is boolean.","DoubleValue":"The value assigned to this variation, if the variation type is a double.","LongValue":"The value assigned to this variation, if the variation type is a long.","StringValue":"The value assigned to this variation, if the variation type is a string.","VariationName":"A name for the variation. It can include up to 127 characters."}},"AWS::Evidently::Launch":{"attributes":{"Arn":"The ARN of the launch. For example, `arn:aws:evidently:us-west-2:0123455678912:project/myProject/launch/myLaunch`","Ref":"`Ref` returns the ARN of the launch. For example, `arn:aws:evidently:us-west-2:0123455678912:project/myProject/launch/myLaunch`"},"description":"Creates or updates a *launch* of a given feature. Before you create a launch, you must create the feature to use for the launch.\\n\\nYou can use a launch to safely validate new features by serving them to a specified percentage of your users while you roll out the feature. You can monitor the performance of the new feature to help you decide when to ramp up traffic to more users. This helps you reduce risk and identify unintended consequences before you fully launch the feature.","properties":{"Description":"An optional description for the launch.","ExecutionStatus":"A structure that you can use to start and stop the launch.","Groups":"An array of structures that contains the feature and variations that are to be used for the launch. You can up to five launch groups in a launch.","MetricMonitors":"An array of structures that define the metrics that will be used to monitor the launch performance. You can have up to three metric monitors in the array.","Name":"The name for the launch. It can include up to 127 characters.","Project":"The name or ARN of the project that you want to create the launch in.","RandomizationSalt":"When Evidently assigns a particular user session to a launch, it must use a randomization ID to determine which variation the user session is served. This randomization ID is a combination of the entity ID and `randomizationSalt` . If you omit `randomizationSalt` , Evidently uses the launch name as the `randomizationsSalt` .","ScheduledSplitsConfig":"An array of structures that define the traffic allocation percentages among the feature variations during each step of the launch.","Tags":"Assigns one or more tags (key-value pairs) to the launch.\\n\\nTags can help you organize and categorize your resources. You can also use them to scope user permissions by granting a user permission to access or change only resources with certain tag values.\\n\\nTags don\'t have any semantic meaning to AWS and are interpreted strictly as strings of characters.\\n\\nYou can associate as many as 50 tags with a launch.\\n\\nFor more information, see [Tagging AWS resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) ."}},"AWS::Evidently::Launch.ExecutionStatusObject":{"attributes":{},"description":"Use this structure to start and stop the launch.","properties":{"DesiredState":"If you are using AWS CloudFormation to stop this launch, specify either `COMPLETED` or `CANCELLED` here to indicate how to classify this experiment. If you omit this parameter, the default of `COMPLETED` is used.","Reason":"If you are using AWS CloudFormation to stop this launch, this is an optional field that you can use to record why the launch is being stopped or cancelled.","Status":"To start the launch now, specify `START` for this parameter. If this launch is currently running and you want to stop it now, specify `STOP` ."}},"AWS::Evidently::Launch.GroupToWeight":{"attributes":{},"description":"A structure containing the percentage of launch traffic to allocate to one launch group.","properties":{"GroupName":"The name of the launch group. It can include up to 127 characters.","SplitWeight":"The portion of launch traffic to allocate to this launch group.\\n\\nThis is represented in thousandths of a percent. For example, specify 20,000 to allocate 20% of the launch audience to this launch group."}},"AWS::Evidently::Launch.LaunchGroupObject":{"attributes":{},"description":"A structure that defines one launch group in a launch. A launch group is a variation of the feature that you are including in the launch.","properties":{"Description":"A description of the launch group.","Feature":"The feature that this launch is using.","GroupName":"A name for this launch group. It can include up to 127 characters.","Variation":"The feature variation to use for this launch group."}},"AWS::Evidently::Launch.MetricDefinitionObject":{"attributes":{},"description":"This structure defines a metric that you want to use to evaluate the variations during a launch or experiment.","properties":{"EntityIdKey":"The entity, such as a user or session, that does an action that causes a metric value to be recorded. An example is `userDetails.userID` .","EventPattern":"The EventBridge event pattern that defines how the metric is recorded.\\n\\nFor more information about EventBridge event patterns, see [Amazon EventBridge event patterns](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html) .","MetricName":"A name for the metric. It can include up to 255 characters.","UnitLabel":"A label for the units that the metric is measuring.","ValueKey":"The value that is tracked to produce the metric."}},"AWS::Evidently::Launch.SegmentOverride":{"attributes":{},"description":"Use this structure to specify different traffic splits for one or more audience *segments* . A segment is a portion of your audience that share one or more characteristics. Examples could be Chrome browser users, users in Europe, or Firefox browser users in Europe who also fit other criteria that your application collects, such as age.\\n\\nFor more information, see [Use segments to focus your audience](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Evidently-segments.html) .\\n\\nThis sructure is an array of up to six segment override objects. Each of these objects specifies a segment that you have already created, and defines the traffic split for that segment.","properties":{"EvaluationOrder":"A number indicating the order to use to evaluate segment overrides, if there are more than one. Segment overrides with lower numbers are evaluated first.","Segment":"The ARN of the segment to use for this override.","Weights":"The traffic allocation percentages among the feature variations to assign to this segment. This is a set of key-value pairs. The keys are variation names. The values represent the amount of traffic to allocate to that variation for this segment. This is expressed in thousandths of a percent, so a weight of 50000 represents 50% of traffic."}},"AWS::Evidently::Launch.StepConfig":{"attributes":{},"description":"A structure that defines when each step of the launch is to start, and how much launch traffic is to be allocated to each variation during each step.","properties":{"GroupWeights":"An array of structures that define how much launch traffic to allocate to each launch group during this step of the launch.","SegmentOverrides":"An array of structures that you can use to specify different traffic splits for one or more audience *segments* . A segment is a portion of your audience that share one or more characteristics. Examples could be Chrome browser users, users in Europe, or Firefox browser users in Europe who also fit other criteria that your application collects, such as age.\\n\\nFor more information, see [Use segments to focus your audience](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Evidently-segments.html) .","StartTime":"The date and time to start this step of the launch. Use UTC format, `yyyy-MM-ddTHH:mm:ssZ` . For example, `2025-11-25T23:59:59Z`"}},"AWS::Evidently::Project":{"attributes":{"Arn":"The ARN of the project. For example, `arn:aws:evidently:us-west-2:0123455678912:project/myProject`","Ref":"`Ref` returns the ARN of the project. For example, `arn:aws:evidently:us-west-2:0123455678912:project/myProject`"},"description":"Creates a project, which is the logical object in Evidently that can contain features, launches, and experiments. Use projects to group similar features together.","properties":{"AppConfigResource":"Use this parameter if the project will use *client-side evaluation powered by AWS AppConfig* . Client-side evaluation allows your application to assign variations to user sessions locally instead of by calling the [EvaluateFeature](https://docs.aws.amazon.com/cloudwatchevidently/latest/APIReference/API_EvaluateFeature.html) operation. This mitigates the latency and availability risks that come with an API call. For more information, see [Use client-side evaluation - powered by AWS AppConfig .](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Evidently-client-side-evaluation.html)\\n\\nThis parameter is a structure that contains information about the AWS AppConfig application that will be used as for client-side evaluation.\\n\\nTo create a project that uses client-side evaluation, you must have the `evidently:ExportProjectAsConfiguration` permission.","DataDelivery":"A structure that contains information about where Evidently is to store evaluation events for longer term storage, if you choose to do so. If you choose not to store these events, Evidently deletes them after using them to produce metrics and other experiment results that you can view.\\n\\nYou can\'t specify both `CloudWatchLogs` and `S3Destination` in the same operation.","Description":"An optional description of the project.","Name":"The name for the project. It can include up to 127 characters.","Tags":"Assigns one or more tags (key-value pairs) to the project.\\n\\nTags can help you organize and categorize your resources. You can also use them to scope user permissions by granting a user permission to access or change only resources with certain tag values.\\n\\nTags don\'t have any semantic meaning to AWS and are interpreted strictly as strings of characters.\\n\\nYou can associate as many as 50 tags with a project.\\n\\nFor more information, see [Tagging AWS resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) ."}},"AWS::Evidently::Project.AppConfigResourceObject":{"attributes":{},"description":"This is a structure that defines the configuration of how your application integrates with AWS AppConfig to run client-side evaluation.","properties":{"ApplicationId":"The ID of the AWS AppConfig application to use for client-side evaluation.","EnvironmentId":"The ID of the AWS AppConfig environment to use for client-side evaluation."}},"AWS::Evidently::Project.DataDeliveryObject":{"attributes":{},"description":"A structure that contains information about where Evidently is to store evaluation events for longer term storage.","properties":{"LogGroup":"If the project stores evaluation events in CloudWatch Logs , this structure stores the log group name.","S3":"If the project stores evaluation events in an Amazon S3 bucket, this structure stores the bucket name and bucket prefix."}},"AWS::Evidently::Project.S3Destination":{"attributes":{},"description":"If the project stores evaluation events in an Amazon S3 bucket, this structure stores the bucket name and bucket prefix.","properties":{"BucketName":"The name of the bucket in which Evidently stores evaluation events.","Prefix":"The bucket prefix in which Evidently stores evaluation events."}},"AWS::Evidently::Segment":{"attributes":{"Arn":"The ARN of the segment. For example, `arn:aws:evidently:us-west-2:123456789012:segment/australiaSegment`","Ref":"`Ref` returns the ARN of the segment. For example, `arn:aws:evidently:us-west-2:123456789012:segment/australiaSegment`"},"description":"Creates or updates a *segment* of your audience. A segment is a portion of your audience that share one or more characteristics. Examples could be Chrome browser users, users in Europe, or Firefox browser users in Europe who also fit other criteria that your application collects, such as age.\\n\\nUsing a segment in an experiment limits that experiment to evaluate only the users who match the segment criteria. Using one or more segments in a launch allow you to define different traffic splits for the different audience segments.\\n\\nFor more information about segment pattern syntax, see [Segment rule pattern syntax](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Evidently-segments-syntax.html) .\\n\\nThe pattern that you define for a segment is matched against the value of `evaluationContext` , which is passed into Evidently in the [EvaluateFeature](https://docs.aws.amazon.com/cloudwatchevidently/latest/APIReference/API_EvaluateFeature.html) operation, when Evidently assigns a feature variation to a user.","properties":{"Description":"An optional description for this segment.","Name":"A name for the segment.","Pattern":"The pattern to use for the segment. For more information about pattern syntax, see [Segment rule pattern syntax](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Evidently-segments-syntax.html) .","Tags":"Assigns one or more tags (key-value pairs) to the feature.\\n\\nTags can help you organize and categorize your resources. You can also use them to scope user permissions by granting a user permission to access or change only resources with certain tag values.\\n\\nTags don\'t have any semantic meaning to AWS and are interpreted strictly as strings of characters.\\n\\nYou can associate as many as 50 tags with a feature.\\n\\nFor more information, see [Tagging AWS resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) ."}},"AWS::FIS::ExperimentTemplate":{"attributes":{"Id":"The ID of the experiment template.","Ref":"`Ref` returns the experiment template ID."},"description":"Specifies an experiment template.\\n\\nAn experiment template includes the following components:\\n\\n- *Targets* : A target can be a specific resource in your AWS environment, or one or more resources that match criteria that you specify, for example, resources that have specific tags.\\n- *Actions* : The actions to carry out on the target. You can specify multiple actions, the duration of each action, and when to start each action during an experiment.\\n- *Stop conditions* : If a stop condition is triggered while an experiment is running, the experiment is automatically stopped. You can define a stop condition as a CloudWatch alarm.\\n\\nFor more information, see [Experiment templates](https://docs.aws.amazon.com/fis/latest/userguide/experiment-templates.html) in the *AWS Fault Injection Simulator User Guide* .","properties":{"Actions":"The actions for the experiment.","Description":"A description for the experiment template.","LogConfiguration":"The configuration for experiment logging.","RoleArn":"The Amazon Resource Name (ARN) of an IAM role that grants the AWS FIS service permission to perform service actions on your behalf.","StopConditions":"The stop conditions.","Tags":"The tags to apply to the experiment template.","Targets":"The targets for the experiment."}},"AWS::FIS::ExperimentTemplate.CloudWatchLogsConfiguration":{"attributes":{},"description":"Specifies the configuration for experiment logging to CloudWatch Logs .","properties":{"LogGroupArn":"The Amazon Resource Name (ARN) of the destination Amazon CloudWatch Logs log group."}},"AWS::FIS::ExperimentTemplate.ExperimentTemplateAction":{"attributes":{},"description":"Specifies an action for an experiment template.\\n\\nFor more information, see [Actions](https://docs.aws.amazon.com/fis/latest/userguide/actions.html) in the *AWS Fault Injection Simulator User Guide* .","properties":{"ActionId":"The ID of the action. The format of the action ID is: aws: *service-name* : *action-type* .","Description":"A description for the action.","Parameters":"The parameters for the action, if applicable.","StartAfter":"The name of the action that must be completed before the current action starts. Omit this parameter to run the action at the start of the experiment.","Targets":"The targets for the action."}},"AWS::FIS::ExperimentTemplate.ExperimentTemplateLogConfiguration":{"attributes":{},"description":"Specifies the configuration for experiment logging.\\n\\nFor more information, see [Experiment logging](https://docs.aws.amazon.com/fis/latest/userguide/monitoring-logging.html) in the *AWS Fault Injection Simulator User Guide* .","properties":{"CloudWatchLogsConfiguration":"The configuration for experiment logging to CloudWatch Logs .","LogSchemaVersion":"The schema version.","S3Configuration":"The configuration for experiment logging to Amazon S3 ."}},"AWS::FIS::ExperimentTemplate.ExperimentTemplateStopCondition":{"attributes":{},"description":"Specifies a stop condition for an experiment template.\\n\\nFor more information, see [Stop conditions](https://docs.aws.amazon.com/fis/latest/userguide/stop-conditions.html) in the *AWS Fault Injection Simulator User Guide* .","properties":{"Source":"The source for the stop condition. Specify `aws:cloudwatch:alarm` if the stop condition is defined by a CloudWatch alarm. Specify `none` if there is no stop condition.","Value":"The Amazon Resource Name (ARN) of the CloudWatch alarm. This is required if the source is a CloudWatch alarm."}},"AWS::FIS::ExperimentTemplate.ExperimentTemplateTarget":{"attributes":{},"description":"Specifies a target for an experiment. You must specify at least one Amazon Resource Name (ARN) or at least one resource tag. You cannot specify both ARNs and tags.\\n\\nFor more information, see [Targets](https://docs.aws.amazon.com/fis/latest/userguide/targets.html) in the *AWS Fault Injection Simulator User Guide* .","properties":{"Filters":"The filters to apply to identify target resources using specific attributes.","Parameters":"The parameters for the resource type.","ResourceArns":"The Amazon Resource Names (ARNs) of the resources.","ResourceTags":"The tags for the target resources.","ResourceType":"The resource type. The resource type must be supported for the specified action.","SelectionMode":"Scopes the identified resources to a specific count of the resources at random, or a percentage of the resources. All identified resources are included in the target.\\n\\n- ALL - Run the action on all identified targets. This is the default.\\n- COUNT(n) - Run the action on the specified number of targets, chosen from the identified targets at random. For example, COUNT(1) selects one of the targets.\\n- PERCENT(n) - Run the action on the specified percentage of targets, chosen from the identified targets at random. For example, PERCENT(25) selects 25% of the targets."}},"AWS::FIS::ExperimentTemplate.ExperimentTemplateTargetFilter":{"attributes":{},"description":"Specifies a filter used for the target resource input in an experiment template.\\n\\nFor more information, see [Resource filters](https://docs.aws.amazon.com/fis/latest/userguide/targets.html#target-filters) in the *AWS Fault Injection Simulator User Guide* .","properties":{"Path":"The attribute path for the filter.","Values":"The attribute values for the filter."}},"AWS::FIS::ExperimentTemplate.S3Configuration":{"attributes":{},"description":"Specifies the configuration for experiment logging to Amazon S3 .","properties":{"BucketName":"The name of the destination bucket.","Prefix":"The bucket prefix."}},"AWS::FMS::NotificationChannel":{"attributes":{"Ref":"The `Ref` for this resource returns the `SnsTopicArn` . This is the Amazon Resource Name (ARN) that uniquely identifies the Amazon Simple Notification Service ( Amazon SNS ) topic. For example, `arn:aws:sns:us-west-2:111122223333:MyTopic` . For more information about SNS, see [Amazon Simple Notification Service Resource Type Reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_SNS.html) .\\n\\n`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"Designates the IAM role and Amazon Simple Notification Service (SNS) topic to use to record SNS logs.\\n\\nTo perform this action outside of the console, you must configure the SNS topic to allow the role `AWSServiceRoleForFMS` to publish SNS logs. For more information, see [Firewall Manager required permissions for API actions](https://docs.aws.amazon.com/waf/latest/developerguide/fms-api-permissions-ref.html) in the *AWS Firewall Manager Developer Guide* .","properties":{"SnsRoleName":"The Amazon Resource Name (ARN) of the IAM role that allows Amazon SNS to record AWS Firewall Manager activity.","SnsTopicArn":"The Amazon Resource Name (ARN) of the SNS topic that collects notifications from AWS Firewall Manager ."}},"AWS::FMS::Policy":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the policy.","Id":"The ID of the policy.","Ref":"The `Ref` for this resource returns the `PolicyId` .\\n\\n`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"An AWS Firewall Manager policy.\\n\\nFirewall Manager provides the following types of policies:\\n\\n- An AWS Shield Advanced policy, which applies Shield Advanced protection to specified accounts and resources.\\n- An AWS WAF policy (type WAFV2), which defines rule groups to run first in the corresponding AWS WAF web ACL and rule groups to run last in the web ACL.\\n- An AWS WAF Classic policy, which defines a rule group. AWS WAF Classic doesn\'t support rule groups in Amazon CloudFront , so, to create AWS WAF Classic policies through CloudFront , you first need to create your rule groups outside of CloudFront .\\n- A security group policy, which manages VPC security groups across your AWS organization.\\n- An AWS Network Firewall policy, which provides firewall rules to filter network traffic in specified Amazon VPCs.\\n- A DNS Firewall policy, which provides Amazon Route 53 Resolver DNS Firewall rules to filter DNS queries for specified Amazon VPCs.\\n- A third-party firewall policy, which manages a third-party firewall service such as the Palo Alto Networks Cloud Next-Generation Firewall.\\n\\nEach policy is specific to one of the types. If you want to enforce more than one policy type across accounts, create multiple policies. You can create multiple policies for each type.\\n\\nThese policies require some setup to use. For more information, see the sections on prerequisites and getting started under [AWS Firewall Manager](https://docs.aws.amazon.com/waf/latest/developerguide/fms-prereq.html) .","properties":{"DeleteAllPolicyResources":"Used when deleting a policy. If `true` , Firewall Manager performs cleanup according to the policy type.\\n\\nFor AWS WAF and Shield Advanced policies, Firewall Manager does the following:\\n\\n- Deletes rule groups created by Firewall Manager\\n- Removes web ACLs from in-scope resources\\n- Deletes web ACLs that contain no rules or rule groups\\n\\nFor security group policies, Firewall Manager does the following for each security group in the policy:\\n\\n- Disassociates the security group from in-scope resources\\n- Deletes the security group if it was created through Firewall Manager and if it\'s no longer associated with any resources through another policy\\n\\nAfter the cleanup, in-scope resources are no longer protected by web ACLs in this policy. Protection of out-of-scope resources remains unchanged. Scope is determined by tags that you create and accounts that you associate with the policy. When creating the policy, if you specify that only resources in specific accounts or with specific tags are in scope of the policy, those accounts and resources are handled by the policy. All others are out of scope. If you don\'t specify tags or accounts, all resources are in scope.","ExcludeMap":"Specifies the AWS account IDs and AWS Organizations organizational units (OUs) to exclude from the policy. Specifying an OU is the equivalent of specifying all accounts in the OU and in any of its child OUs, including any child OUs and accounts that are added at a later time.\\n\\nYou can specify inclusions or exclusions, but not both. If you specify an `IncludeMap` , AWS Firewall Manager applies the policy to all accounts specified by the `IncludeMap` , and does not evaluate any `ExcludeMap` specifications. If you do not specify an `IncludeMap` , then Firewall Manager applies the policy to all accounts except for those specified by the `ExcludeMap` .\\n\\nYou can specify account IDs, OUs, or a combination:\\n\\n- Specify account IDs by setting the key to `ACCOUNT` . For example, the following is a valid map: `{“ACCOUNT” : [“accountID1”, “accountID2”]}` .\\n- Specify OUs by setting the key to `ORGUNIT` . For example, the following is a valid map: `{“ORGUNIT” : [“ouid111”, “ouid112”]}` .\\n- Specify accounts and OUs together in a single map, separated with a comma. For example, the following is a valid map: `{“ACCOUNT” : [“accountID1”, “accountID2”], “ORGUNIT” : [“ouid111”, “ouid112”]}` .","ExcludeResourceTags":"Used only when tags are specified in the `ResourceTags` property. If this property is `True` , resources with the specified tags are not in scope of the policy. If it\'s `False` , only resources with the specified tags are in scope of the policy.","IncludeMap":"Specifies the AWS account IDs and AWS Organizations organizational units (OUs) to include in the policy. Specifying an OU is the equivalent of specifying all accounts in the OU and in any of its child OUs, including any child OUs and accounts that are added at a later time.\\n\\nYou can specify inclusions or exclusions, but not both. If you specify an `IncludeMap` , AWS Firewall Manager applies the policy to all accounts specified by the `IncludeMap` , and does not evaluate any `ExcludeMap` specifications. If you do not specify an `IncludeMap` , then Firewall Manager applies the policy to all accounts except for those specified by the `ExcludeMap` .\\n\\nYou can specify account IDs, OUs, or a combination:\\n\\n- Specify account IDs by setting the key to `ACCOUNT` . For example, the following is a valid map: `{“ACCOUNT” : [“accountID1”, “accountID2”]}` .\\n- Specify OUs by setting the key to `ORGUNIT` . For example, the following is a valid map: `{“ORGUNIT” : [“ouid111”, “ouid112”]}` .\\n- Specify accounts and OUs together in a single map, separated with a comma. For example, the following is a valid map: `{“ACCOUNT” : [“accountID1”, “accountID2”], “ORGUNIT” : [“ouid111”, “ouid112”]}` .","PolicyDescription":"The definition of the AWS Network Firewall firewall policy.","PolicyName":"The name of the AWS Firewall Manager policy.","RemediationEnabled":"Indicates if the policy should be automatically applied to new resources.","ResourceSetIds":"The unique identifiers of the resource sets used by the policy.","ResourceTags":"An array of `ResourceTag` objects, used to explicitly include resources in the policy scope or explicitly exclude them. If this isn\'t set, then tags aren\'t used to modify policy scope. See also `ExcludeResourceTags` .","ResourceType":"The type of resource protected by or in scope of the policy. This is in the format shown in the [AWS Resource Types Reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html) . To apply this policy to multiple resource types, specify a resource type of `ResourceTypeList` and then specify the resource types in a `ResourceTypeList` .\\n\\nFor AWS WAF and Shield Advanced, example resource types include `AWS::ElasticLoadBalancingV2::LoadBalancer` and `AWS::CloudFront::Distribution` . For a security group common policy, valid values are `AWS::EC2::NetworkInterface` and `AWS::EC2::Instance` . For a security group content audit policy, valid values are `AWS::EC2::SecurityGroup` , `AWS::EC2::NetworkInterface` , and `AWS::EC2::Instance` . For a security group usage audit policy, the value is `AWS::EC2::SecurityGroup` . For an AWS Network Firewall policy or DNS Firewall policy, the value is `AWS::EC2::VPC` .","ResourceTypeList":"An array of `ResourceType` objects. Use this only to specify multiple resource types. To specify a single resource type, use `ResourceType` .","ResourcesCleanUp":"Indicates whether AWS Firewall Manager should automatically remove protections from resources that leave the policy scope and clean up resources that Firewall Manager is managing for accounts when those accounts leave policy scope. For example, Firewall Manager will disassociate a Firewall Manager managed web ACL from a protected customer resource when the customer resource leaves policy scope.\\n\\nBy default, Firewall Manager doesn\'t remove protections or delete Firewall Manager managed resources.\\n\\nThis option is not available for Shield Advanced or AWS WAF Classic policies.","SecurityServicePolicyData":"Details about the security service that is being used to protect the resources.\\n\\nThis contains the following settings:\\n\\n- Type - Indicates the service type that the policy uses to protect the resource. For security group policies, Firewall Manager supports one security group for each common policy and for each content audit policy. This is an adjustable limit that you can increase by contacting AWS Support .\\n\\nValid values: `DNS_FIREWALL` | `NETWORK_FIREWALL` | `SECURITY_GROUPS_COMMON` | `SECURITY_GROUPS_CONTENT_AUDIT` | `SECURITY_GROUPS_USAGE_AUDIT` | `SHIELD_ADVANCED` | `THIRD_PARTY_FIREWALL` | `WAFV2` | `WAF`\\n- ManagedServiceData - Details about the service that are specific to the service type, in JSON format.\\n\\n- Example: `DNS_FIREWALL`\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"DNS_FIREWALL\\\\\\",\\\\\\"preProcessRuleGroups\\\\\\":[{\\\\\\"ruleGroupId\\\\\\":\\\\\\"rslvr-frg-1\\\\\\",\\\\\\"priority\\\\\\":10}],\\\\\\"postProcessRuleGroups\\\\\\":[{\\\\\\"ruleGroupId\\\\\\":\\\\\\"rslvr-frg-2\\\\\\",\\\\\\"priority\\\\\\":9911}]}\\"`\\n\\n> Valid values for `preProcessRuleGroups` are between 1 and 99. Valid values for `postProcessRuleGroups` are between 9901 and 10000.\\n- Example: `NETWORK_FIREWALL` - Centralized deployment model\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"NETWORK_FIREWALL\\\\\\",\\\\\\"awsNetworkFirewallConfig\\\\\\":{\\\\\\"networkFirewallStatelessRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateless-rulegroup/test\\\\\\",\\\\\\"priority\\\\\\":1}],\\\\\\"networkFirewallStatelessDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessFragmentDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessCustomActions\\\\\\":[{\\\\\\"actionName\\\\\\":\\\\\\"customActionName\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"metricdimensionvalue\\\\\\"}]}}}],\\\\\\"networkFirewallStatefulRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateful-rulegroup/test\\\\\\"}],\\\\\\"networkFirewallLoggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"ALERT\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}},{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"FLOW\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}}],\\\\\\"overrideExistingConfig\\\\\\":true}},\\\\\\"firewallDeploymentModel\\\\\\":{\\\\\\"centralizedFirewallDeploymentModel\\\\\\":{\\\\\\"centralizedFirewallOrchestrationConfig\\\\\\":{\\\\\\"inspectionVpcIds\\\\\\":[{\\\\\\"resourceId\\\\\\":\\\\\\"vpc-1234\\\\\\",\\\\\\"accountId\\\\\\":\\\\\\"123456789011\\\\\\"}],\\\\\\"firewallCreationConfig\\\\\\":{\\\\\\"endpointLocation\\\\\\":{\\\\\\"availabilityZoneConfigList\\\\\\":[{\\\\\\"availabilityZoneId\\\\\\":null,\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1a\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\"]}]}},\\\\\\"allowedIPV4CidrList\\\\\\":[]}}}}\\"`\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html) to `DISTRIBUTED` .\\n- Example: `NETWORK_FIREWALL` - Distributed deployment model with automatic Availability Zone configuration\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"NETWORK_FIREWALL\\\\\\",\\\\\\"networkFirewallStatelessRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateless-rulegroup/test\\\\\\",\\\\\\"priority\\\\\\":1}],\\\\\\"networkFirewallStatelessDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessFragmentDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessCustomActions\\\\\\":[{\\\\\\"actionName\\\\\\":\\\\\\"customActionName\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"metricdimensionvalue\\\\\\"}]}}}],\\\\\\"networkFirewallStatefulRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateful-rulegroup/test\\\\\\"}],\\\\\\"networkFirewallOrchestrationConfig\\\\\\":{\\\\\\"singleFirewallEndpointPerVPC\\\\\\":false,\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\",\\\\\\"192.168.0.0/28\\\\\\"],\\\\\\"routeManagementAction\\\\\\":\\\\\\"OFF\\\\\\"},\\\\\\"networkFirewallLoggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"ALERT\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}},{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"FLOW\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}}],\\\\\\"overrideExistingConfig\\\\\\":true}}\\"`\\n\\nWith automatic Availbility Zone configuration, Firewall Manager chooses which Availability Zones to create the endpoints in. To use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html) to `DISTRIBUTED` .\\n- Example: `NETWORK_FIREWALL` - Distributed deployment model with automatic Availability Zone configuration and route management\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"NETWORK_FIREWALL\\\\\\",\\\\\\"networkFirewallStatelessRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateless-rulegroup/test\\\\\\",\\\\\\"priority\\\\\\":1}],\\\\\\"networkFirewallStatelessDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessFragmentDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessCustomActions\\\\\\":[{\\\\\\"actionName\\\\\\":\\\\\\"customActionName\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"metricdimensionvalue\\\\\\"}]}}}],\\\\\\"networkFirewallStatefulRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateful-rulegroup/test\\\\\\"}],\\\\\\"networkFirewallOrchestrationConfig\\\\\\":{\\\\\\"singleFirewallEndpointPerVPC\\\\\\":false,\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\",\\\\\\"192.168.0.0/28\\\\\\"],\\\\\\"routeManagementAction\\\\\\":\\\\\\"MONITOR\\\\\\",\\\\\\"routeManagementTargetTypes\\\\\\":[\\\\\\"InternetGateway\\\\\\"]},\\\\\\"networkFirewallLoggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"ALERT\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}},{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\": \\\\\\"FLOW\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}}],\\\\\\"overrideExistingConfig\\\\\\":true}}\\"`\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html) to `DISTRIBUTED` .\\n- Example: `NETWORK_FIREWALL` - Distributed deployment model with custom Availability Zone configuration\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"NETWORK_FIREWALL\\\\\\",\\\\\\"networkFirewallStatelessRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateless-rulegroup/test\\\\\\",\\\\\\"priority\\\\\\":1}],\\\\\\"networkFirewallStatelessDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessFragmentDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"fragmentcustomactionname\\\\\\"],\\\\\\"networkFirewallStatelessCustomActions\\\\\\":[{\\\\\\"actionName\\\\\\":\\\\\\"customActionName\\\\\\", \\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"metricdimensionvalue\\\\\\"}]}}},{\\\\\\"actionName\\\\\\":\\\\\\"fragmentcustomactionname\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"fragmentmetricdimensionvalue\\\\\\"}]}}}],\\\\\\"networkFirewallStatefulRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateful-rulegroup/test\\\\\\"}],\\\\\\"networkFirewallOrchestrationConfig\\\\\\":{\\\\\\"firewallCreationConfig\\\\\\":{ \\\\\\"endpointLocation\\\\\\":{\\\\\\"availabilityZoneConfigList\\\\\\":[{\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1a\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\"]},{\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1b\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[ \\\\\\"10.0.0.0/28\\\\\\"]}]} },\\\\\\"singleFirewallEndpointPerVPC\\\\\\":false,\\\\\\"allowedIPV4CidrList\\\\\\":null,\\\\\\"routeManagementAction\\\\\\":\\\\\\"OFF\\\\\\",\\\\\\"networkFirewallLoggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"ALERT\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}},{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"FLOW\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}}],\\\\\\"overrideExistingConfig\\\\\\":boolean}}\\"`\\n\\nWith custom Availability Zone configuration, you define which specific Availability Zones to create endpoints in by configuring `firewallCreationConfig` . To configure the Availability Zones in `firewallCreationConfig` , specify either the `availabilityZoneName` or `availabilityZoneId` parameter, not both parameters.\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html) to `DISTRIBUTED` .\\n- Example: `NETWORK_FIREWALL` - Distributed deployment model with custom Availability Zone configuration and route management\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"NETWORK_FIREWALL\\\\\\",\\\\\\"networkFirewallStatelessRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateless-rulegroup/test\\\\\\",\\\\\\"priority\\\\\\":1}],\\\\\\"networkFirewallStatelessDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessFragmentDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"fragmentcustomactionname\\\\\\"],\\\\\\"networkFirewallStatelessCustomActions\\\\\\":[{\\\\\\"actionName\\\\\\":\\\\\\"customActionName\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"metricdimensionvalue\\\\\\"}]}}},{\\\\\\"actionName\\\\\\":\\\\\\"fragmentcustomactionname\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"fragmentmetricdimensionvalue\\\\\\"}]}}}],\\\\\\"networkFirewallStatefulRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateful-rulegroup/test\\\\\\"}],\\\\\\"networkFirewallOrchestrationConfig\\\\\\":{\\\\\\"firewallCreationConfig\\\\\\":{\\\\\\"endpointLocation\\\\\\":{\\\\\\"availabilityZoneConfigList\\\\\\":[{\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1a\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\"]},{\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1b\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\"]}]}},\\\\\\"singleFirewallEndpointPerVPC\\\\\\":false,\\\\\\"allowedIPV4CidrList\\\\\\":null,\\\\\\"routeManagementAction\\\\\\":\\\\\\"MONITOR\\\\\\",\\\\\\"routeManagementTargetTypes\\\\\\":[\\\\\\"InternetGateway\\\\\\"],\\\\\\"routeManagementConfig\\\\\\":{\\\\\\"allowCrossAZTrafficIfNoEndpoint\\\\\\":true}},\\\\\\"networkFirewallLoggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"ALERT\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}},{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"FLOW\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}}],\\\\\\"overrideExistingConfig\\\\\\":boolean}}\\"`\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html) to `DISTRIBUTED` .\\n- Example: `THIRD_PARTY_FIREWALL` - Palo Alto Networks Cloud Next-Generation Firewall centralized deployment model\\n\\n`\\"{ \\\\\\"type\\\\\\":\\\\\\"THIRD_PARTY_FIREWALL\\\\\\", \\\\\\"thirdPartyFirewall\\\\\\":\\\\\\"PALO_ALTO_NETWORKS_CLOUD_NGFW\\\\\\", \\\\\\"thirdPartyFirewallConfig\\\\\\":{ \\\\\\"thirdPartyFirewallPolicyList\\\\\\":[\\\\\\"global-1\\\\\\"] },\\\\\\"firewallDeploymentModel\\\\\\":{\\\\\\"centralizedFirewallDeploymentModel\\\\\\":{\\\\\\"centralizedFirewallOrchestrationConfig\\\\\\":{\\\\\\"inspectionVpcIds\\\\\\":[{\\\\\\"resourceId\\\\\\":\\\\\\"vpc-1234\\\\\\",\\\\\\"accountId\\\\\\":\\\\\\"123456789011\\\\\\"}],\\\\\\"firewallCreationConfig\\\\\\":{\\\\\\"endpointLocation\\\\\\":{\\\\\\"availabilityZoneConfigList\\\\\\":[{\\\\\\"availabilityZoneId\\\\\\":null,\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1a\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\"]}]}},\\\\\\"allowedIPV4CidrList\\\\\\":[]}}}}\\"`\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-thirdpartyfirewallpolicy.html) to `CENTRALIZED` .\\n- Example: `THIRD_PARTY_FIREWALL` - Palo Alto Networks Cloud Next-Generation Firewall distributed deployment model\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"THIRD_PARTY_FIREWALL\\\\\\",\\\\\\"thirdPartyFirewall\\\\\\":\\\\\\"PALO_ALTO_NETWORKS_CLOUD_NGFW\\\\\\",\\\\\\"thirdPartyFirewallConfig\\\\\\":{\\\\\\"thirdPartyFirewallPolicyList\\\\\\":[\\\\\\"global-1\\\\\\"] },\\\\\\"firewallDeploymentModel\\\\\\":{ \\\\\\"distributedFirewallDeploymentModel\\\\\\":{ \\\\\\"distributedFirewallOrchestrationConfig\\\\\\":{\\\\\\"firewallCreationConfig\\\\\\":{\\\\\\"endpointLocation\\\\\\":{ \\\\\\"availabilityZoneConfigList\\\\\\":[ {\\\\\\"availabilityZoneName\\\\\\":\\\\\\"${AvailabilityZone}\\\\\\" } ] } }, \\\\\\"allowedIPV4CidrList\\\\\\":[ ] } } } }\\"`\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-thirdpartyfirewallpolicy.html) to `DISTRIBUTED` .\\n- Specification for `SHIELD_ADVANCED` for Amazon CloudFront distributions\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"SHIELD_ADVANCED\\\\\\",\\\\\\"automaticResponseConfiguration\\\\\\": {\\\\\\"automaticResponseStatus\\\\\\":\\\\\\"ENABLED|IGNORED|DISABLED\\\\\\", \\\\\\"automaticResponseAction\\\\\\":\\\\\\"BLOCK|COUNT\\\\\\"}, \\\\\\"overrideCustomerWebaclClassic\\\\\\":true|false}\\"`\\n\\nFor example: `\\"{\\\\\\"type\\\\\\":\\\\\\"SHIELD_ADVANCED\\\\\\",\\\\\\"automaticResponseConfiguration\\\\\\": {\\\\\\"automaticResponseStatus\\\\\\":\\\\\\"ENABLED\\\\\\", \\\\\\"automaticResponseAction\\\\\\":\\\\\\"COUNT\\\\\\"}}\\"`\\n\\nThe default value for `automaticResponseStatus` is `IGNORED` . The value for `automaticResponseAction` is only required when `automaticResponseStatus` is set to `ENABLED` . The default value for `overrideCustomerWebaclClassic` is `false` .\\n\\nFor other resource types that you can protect with a Shield Advanced policy, this `ManagedServiceData` configuration is an empty string.\\n- Example: `WAFV2`\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"WAFV2\\\\\\",\\\\\\"preProcessRuleGroups\\\\\\":[{\\\\\\"ruleGroupArn\\\\\\":null,\\\\\\"overrideAction\\\\\\":{\\\\\\"type\\\\\\":\\\\\\"NONE\\\\\\"},\\\\\\"managedRuleGroupIdentifier\\\\\\":{\\\\\\"version\\\\\\":null,\\\\\\"vendorName\\\\\\":\\\\\\"AWS\\\\\\",\\\\\\"managedRuleGroupName\\\\\\":\\\\\\"AWSManagedRulesAmazonIpReputationList\\\\\\"},\\\\\\"ruleGroupType\\\\\\":\\\\\\"ManagedRuleGroup\\\\\\",\\\\\\"excludeRules\\\\\\":[{\\\\\\"name\\\\\\":\\\\\\"NoUserAgent_HEADER\\\\\\"}]}],\\\\\\"postProcessRuleGroups\\\\\\":[],\\\\\\"defaultAction\\\\\\":{\\\\\\"type\\\\\\":\\\\\\"ALLOW\\\\\\"},\\\\\\"overrideCustomerWebACLAssociation\\\\\\":false,\\\\\\"loggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[\\\\\\"arn:aws:firehose:us-west-2:12345678912:deliverystream/aws-waf-logs-fms-admin-destination\\\\\\"],\\\\\\"redactedFields\\\\\\":[{\\\\\\"redactedFieldType\\\\\\":\\\\\\"SingleHeader\\\\\\",\\\\\\"redactedFieldValue\\\\\\":\\\\\\"Cookies\\\\\\"},{\\\\\\"redactedFieldType\\\\\\":\\\\\\"Method\\\\\\"}]}}\\"`\\n\\nIn the `loggingConfiguration` , you can specify one `logDestinationConfigs` , you can optionally provide up to 20 `redactedFields` , and the `RedactedFieldType` must be one of `URI` , `QUERY_STRING` , `HEADER` , or `METHOD` .\\n- Example: `AWS WAF Classic`\\n\\n`\\"{\\\\\\"type\\\\\\": \\\\\\"WAF\\\\\\", \\\\\\"ruleGroups\\\\\\": [{\\\\\\"id\\\\\\":\\\\\\"12345678-1bcd-9012-efga-0987654321ab\\\\\\", \\\\\\"overrideAction\\\\\\" : {\\\\\\"type\\\\\\": \\\\\\"COUNT\\\\\\"}}], \\\\\\"defaultAction\\\\\\": {\\\\\\"type\\\\\\": \\\\\\"BLOCK\\\\\\"}}\\"`\\n- Example: `WAFV2` - AWS Firewall Manager support for AWS WAF managed rule group versioning\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"WAFV2\\\\\\",\\\\\\"preProcessRuleGroups\\\\\\":[{\\\\\\"ruleGroupArn\\\\\\":null,\\\\\\"overrideAction\\\\\\":{\\\\\\"type\\\\\\":\\\\\\"NONE\\\\\\"},\\\\\\"managedRuleGroupIdentifier\\\\\\":{\\\\\\"versionEnabled\\\\\\":true,\\\\\\"version\\\\\\":\\\\\\"Version_2.0\\\\\\",\\\\\\"vendorName\\\\\\":\\\\\\"AWS\\\\\\",\\\\\\"managedRuleGroupName\\\\\\":\\\\\\"AWSManagedRulesCommonRuleSet\\\\\\"},\\\\\\"ruleGroupType\\\\\\":\\\\\\"ManagedRuleGroup\\\\\\",\\\\\\"excludeRules\\\\\\":[{\\\\\\"name\\\\\\":\\\\\\"NoUserAgent_HEADER\\\\\\"}]}],\\\\\\"postProcessRuleGroups\\\\\\":[],\\\\\\"defaultAction\\\\\\":{\\\\\\"type\\\\\\":\\\\\\"ALLOW\\\\\\"},\\\\\\"overrideCustomerWebACLAssociation\\\\\\":false,\\\\\\"loggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[\\\\\\"arn:aws:firehose:us-west-2:12345678912:deliverystream/aws-waf-logs-fms-admin-destination\\\\\\"],\\\\\\"redactedFields\\\\\\":[{\\\\\\"redactedFieldType\\\\\\":\\\\\\"SingleHeader\\\\\\",\\\\\\"redactedFieldValue\\\\\\":\\\\\\"Cookies\\\\\\"},{\\\\\\"redactedFieldType\\\\\\":\\\\\\"Method\\\\\\"}]}}\\"`\\n\\nTo use a specific version of a AWS WAF managed rule group in your Firewall Manager policy, you must set `versionEnabled` to `true` , and set `version` to the version you\'d like to use. If you don\'t set `versionEnabled` to `true` , or if you omit `versionEnabled` , then Firewall Manager uses the default version of the AWS WAF managed rule group.\\n- Example: `SECURITY_GROUPS_COMMON`\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"SECURITY_GROUPS_COMMON\\\\\\",\\\\\\"revertManualSecurityGroupChanges\\\\\\":false,\\\\\\"exclusiveResourceSecurityGroupManagement\\\\\\":false, \\\\\\"applyToAllEC2InstanceENIs\\\\\\":false,\\\\\\"securityGroups\\\\\\":[{\\\\\\"id\\\\\\":\\\\\\" sg-000e55995d61a06bd\\\\\\"}]}\\"`\\n- Example: Shared VPCs. Apply the preceding policy to resources in shared VPCs as well as to those in VPCs that the account owns\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"SECURITY_GROUPS_COMMON\\\\\\",\\\\\\"revertManualSecurityGroupChanges\\\\\\":false,\\\\\\"exclusiveResourceSecurityGroupManagement\\\\\\":false, \\\\\\"applyToAllEC2InstanceENIs\\\\\\":false,\\\\\\"includeSharedVPC\\\\\\":true,\\\\\\"securityGroups\\\\\\":[{\\\\\\"id\\\\\\":\\\\\\" sg-000e55995d61a06bd\\\\\\"}]}\\"`\\n- Example: `SECURITY_GROUPS_CONTENT_AUDIT`\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"SECURITY_GROUPS_CONTENT_AUDIT\\\\\\",\\\\\\"securityGroups\\\\\\":[{\\\\\\"id\\\\\\":\\\\\\"sg-000e55995d61a06bd\\\\\\"}],\\\\\\"securityGroupAction\\\\\\":{\\\\\\"type\\\\\\":\\\\\\"ALLOW\\\\\\"}}\\"`\\n\\nThe security group action for content audit can be `ALLOW` or `DENY` . For `ALLOW` , all in-scope security group rules must be within the allowed range of the policy\'s security group rules. For `DENY` , all in-scope security group rules must not contain a value or a range that matches a rule value or range in the policy security group.\\n- Example: `SECURITY_GROUPS_USAGE_AUDIT`\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"SECURITY_GROUPS_USAGE_AUDIT\\\\\\",\\\\\\"deleteUnusedSecurityGroups\\\\\\":true,\\\\\\"coalesceRedundantSecurityGroups\\\\\\":true}\\"`","Tags":"A collection of key:value pairs associated with an AWS resource. The key:value pair can be anything you define. Typically, the tag key represents a category (such as \\"environment\\") and the tag value represents a specific value within that category (such as \\"test,\\" \\"development,\\" or \\"production\\"). You can add up to 50 tags to each AWS resource."}},"AWS::FMS::Policy.IEMap":{"attributes":{},"description":"Specifies the AWS account IDs and AWS Organizations organizational units (OUs) to include in or exclude from the policy. Specifying an OU is the equivalent of specifying all accounts in the OU and in any of its child OUs, including any child OUs and accounts that are added at a later time.\\n\\nThis is used for the policy\'s `IncludeMap` and `ExcludeMap` .\\n\\nYou can specify account IDs, OUs, or a combination:\\n\\n- Specify account IDs by setting the key to `ACCOUNT` . For example, the following is a valid map: `{“ACCOUNT” : [“accountID1”, “accountID2”]}` .\\n- Specify OUs by setting the key to `ORGUNIT` . For example, the following is a valid map: `{“ORGUNIT” : [“ouid111”, “ouid112”]}` .\\n- Specify accounts and OUs together in a single map, separated with a comma. For example, the following is a valid map: `{“ACCOUNT” : [“accountID1”, “accountID2”], “ORGUNIT” : [“ouid111”, “ouid112”]}` .","properties":{"ACCOUNT":"The account list for the map.","ORGUNIT":"The organizational unit list for the map."}},"AWS::FMS::Policy.NetworkFirewallPolicy":{"attributes":{},"description":"Configures the firewall policy deployment model of AWS Network Firewall . For information about Network Firewall deployment models, see [AWS Network Firewall example architectures with routing](https://docs.aws.amazon.com/network-firewall/latest/developerguide/architectures.html) in the *Network Firewall Developer Guide* .","properties":{"FirewallDeploymentModel":"Defines the deployment model to use for the firewall policy. To use a distributed model, set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-thirdpartyfirewallpolicy.html) to `DISTRIBUTED` ."}},"AWS::FMS::Policy.PolicyOption":{"attributes":{},"description":"Contains the AWS Network Firewall firewall policy options to configure the policy\'s deployment model and third-party firewall policy settings.","properties":{"NetworkFirewallPolicy":"Defines the deployment model to use for the firewall policy.","ThirdPartyFirewallPolicy":"Defines the policy options for a third-party firewall policy."}},"AWS::FMS::Policy.PolicyTag":{"attributes":{},"description":"A collection of key:value pairs associated with an AWS resource. The key:value pair can be anything you define. Typically, the tag key represents a category (such as \\"environment\\") and the tag value represents a specific value within that category (such as \\"test,\\" \\"development,\\" or \\"production\\"). You can add up to 50 tags to each AWS resource.","properties":{"Key":"Part of the key:value pair that defines a tag. You can use a tag key to describe a category of information, such as \\"customer.\\" Tag keys are case-sensitive.","Value":"Part of the key:value pair that defines a tag. You can use a tag value to describe a specific value within a category, such as \\"companyA\\" or \\"companyB.\\" Tag values are case-sensitive."}},"AWS::FMS::Policy.ResourceTag":{"attributes":{},"description":"The resource tags that AWS Firewall Manager uses to determine if a particular resource should be included or excluded from the AWS Firewall Manager policy. Tags enable you to categorize your AWS resources in different ways, for example, by purpose, owner, or environment. Each tag consists of a key and an optional value. Firewall Manager combines the tags with \\"AND\\" so that, if you add more than one tag to a policy scope, a resource must have all the specified tags to be included or excluded. For more information, see [Working with Tag Editor](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/tag-editor.html) .","properties":{"Key":"The resource tag key.","Value":"The resource tag value."}},"AWS::FMS::Policy.SecurityServicePolicyData":{"attributes":{},"description":"Details about the security service that is being used to protect the resources.","properties":{"ManagedServiceData":"Details about the service that are specific to the service type, in JSON format.\\n\\n- Example: `DNS_FIREWALL`\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"DNS_FIREWALL\\\\\\",\\\\\\"preProcessRuleGroups\\\\\\":[{\\\\\\"ruleGroupId\\\\\\":\\\\\\"rslvr-frg-1\\\\\\",\\\\\\"priority\\\\\\":10}],\\\\\\"postProcessRuleGroups\\\\\\":[{\\\\\\"ruleGroupId\\\\\\":\\\\\\"rslvr-frg-2\\\\\\",\\\\\\"priority\\\\\\":9911}]}\\"`\\n\\n> Valid values for `preProcessRuleGroups` are between 1 and 99. Valid values for `postProcessRuleGroups` are between 9901 and 10000.\\n- Example: `NETWORK_FIREWALL` - Centralized deployment model\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"NETWORK_FIREWALL\\\\\\",\\\\\\"awsNetworkFirewallConfig\\\\\\":{\\\\\\"networkFirewallStatelessRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateless-rulegroup/test\\\\\\",\\\\\\"priority\\\\\\":1}],\\\\\\"networkFirewallStatelessDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessFragmentDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessCustomActions\\\\\\":[{\\\\\\"actionName\\\\\\":\\\\\\"customActionName\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"metricdimensionvalue\\\\\\"}]}}}],\\\\\\"networkFirewallStatefulRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateful-rulegroup/test\\\\\\"}],\\\\\\"networkFirewallLoggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"ALERT\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}},{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"FLOW\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}}],\\\\\\"overrideExistingConfig\\\\\\":true}},\\\\\\"firewallDeploymentModel\\\\\\":{\\\\\\"centralizedFirewallDeploymentModel\\\\\\":{\\\\\\"centralizedFirewallOrchestrationConfig\\\\\\":{\\\\\\"inspectionVpcIds\\\\\\":[{\\\\\\"resourceId\\\\\\":\\\\\\"vpc-1234\\\\\\",\\\\\\"accountId\\\\\\":\\\\\\"123456789011\\\\\\"}],\\\\\\"firewallCreationConfig\\\\\\":{\\\\\\"endpointLocation\\\\\\":{\\\\\\"availabilityZoneConfigList\\\\\\":[{\\\\\\"availabilityZoneId\\\\\\":null,\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1a\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\"]}]}},\\\\\\"allowedIPV4CidrList\\\\\\":[]}}}}\\"`\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html) to `DISTRIBUTED` .\\n- Example: `NETWORK_FIREWALL` - Distributed deployment model with automatic Availability Zone configuration\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"NETWORK_FIREWALL\\\\\\",\\\\\\"networkFirewallStatelessRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateless-rulegroup/test\\\\\\",\\\\\\"priority\\\\\\":1}],\\\\\\"networkFirewallStatelessDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessFragmentDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessCustomActions\\\\\\":[{\\\\\\"actionName\\\\\\":\\\\\\"customActionName\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"metricdimensionvalue\\\\\\"}]}}}],\\\\\\"networkFirewallStatefulRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateful-rulegroup/test\\\\\\"}],\\\\\\"networkFirewallOrchestrationConfig\\\\\\":{\\\\\\"singleFirewallEndpointPerVPC\\\\\\":false,\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\",\\\\\\"192.168.0.0/28\\\\\\"],\\\\\\"routeManagementAction\\\\\\":\\\\\\"OFF\\\\\\"},\\\\\\"networkFirewallLoggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"ALERT\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}},{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"FLOW\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}}],\\\\\\"overrideExistingConfig\\\\\\":true}}\\"`\\n\\nWith automatic Availbility Zone configuration, Firewall Manager chooses which Availability Zones to create the endpoints in. To use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html) to `DISTRIBUTED` .\\n- Example: `NETWORK_FIREWALL` - Distributed deployment model with automatic Availability Zone configuration and route management\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"NETWORK_FIREWALL\\\\\\",\\\\\\"networkFirewallStatelessRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateless-rulegroup/test\\\\\\",\\\\\\"priority\\\\\\":1}],\\\\\\"networkFirewallStatelessDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessFragmentDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessCustomActions\\\\\\":[{\\\\\\"actionName\\\\\\":\\\\\\"customActionName\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"metricdimensionvalue\\\\\\"}]}}}],\\\\\\"networkFirewallStatefulRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateful-rulegroup/test\\\\\\"}],\\\\\\"networkFirewallOrchestrationConfig\\\\\\":{\\\\\\"singleFirewallEndpointPerVPC\\\\\\":false,\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\",\\\\\\"192.168.0.0/28\\\\\\"],\\\\\\"routeManagementAction\\\\\\":\\\\\\"MONITOR\\\\\\",\\\\\\"routeManagementTargetTypes\\\\\\":[\\\\\\"InternetGateway\\\\\\"]},\\\\\\"networkFirewallLoggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"ALERT\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}},{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\": \\\\\\"FLOW\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}}],\\\\\\"overrideExistingConfig\\\\\\":true}}\\"`\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html) to `DISTRIBUTED` .\\n- Example: `NETWORK_FIREWALL` - Distributed deployment model with custom Availability Zone configuration\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"NETWORK_FIREWALL\\\\\\",\\\\\\"networkFirewallStatelessRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateless-rulegroup/test\\\\\\",\\\\\\"priority\\\\\\":1}],\\\\\\"networkFirewallStatelessDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessFragmentDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"fragmentcustomactionname\\\\\\"],\\\\\\"networkFirewallStatelessCustomActions\\\\\\":[{\\\\\\"actionName\\\\\\":\\\\\\"customActionName\\\\\\", \\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"metricdimensionvalue\\\\\\"}]}}},{\\\\\\"actionName\\\\\\":\\\\\\"fragmentcustomactionname\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"fragmentmetricdimensionvalue\\\\\\"}]}}}],\\\\\\"networkFirewallStatefulRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateful-rulegroup/test\\\\\\"}],\\\\\\"networkFirewallOrchestrationConfig\\\\\\":{\\\\\\"firewallCreationConfig\\\\\\":{ \\\\\\"endpointLocation\\\\\\":{\\\\\\"availabilityZoneConfigList\\\\\\":[{\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1a\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\"]},{\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1b\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[ \\\\\\"10.0.0.0/28\\\\\\"]}]} },\\\\\\"singleFirewallEndpointPerVPC\\\\\\":false,\\\\\\"allowedIPV4CidrList\\\\\\":null,\\\\\\"routeManagementAction\\\\\\":\\\\\\"OFF\\\\\\",\\\\\\"networkFirewallLoggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"ALERT\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}},{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"FLOW\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}}],\\\\\\"overrideExistingConfig\\\\\\":boolean}}\\"`\\n\\nWith custom Availability Zone configuration, you define which specific Availability Zones to create endpoints in by configuring `firewallCreationConfig` . To configure the Availability Zones in `firewallCreationConfig` , specify either the `availabilityZoneName` or `availabilityZoneId` parameter, not both parameters.\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html) to `DISTRIBUTED` .\\n- Example: `NETWORK_FIREWALL` - Distributed deployment model with custom Availability Zone configuration and route management\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"NETWORK_FIREWALL\\\\\\",\\\\\\"networkFirewallStatelessRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateless-rulegroup/test\\\\\\",\\\\\\"priority\\\\\\":1}],\\\\\\"networkFirewallStatelessDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"customActionName\\\\\\"],\\\\\\"networkFirewallStatelessFragmentDefaultActions\\\\\\":[\\\\\\"aws:forward_to_sfe\\\\\\",\\\\\\"fragmentcustomactionname\\\\\\"],\\\\\\"networkFirewallStatelessCustomActions\\\\\\":[{\\\\\\"actionName\\\\\\":\\\\\\"customActionName\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"metricdimensionvalue\\\\\\"}]}}},{\\\\\\"actionName\\\\\\":\\\\\\"fragmentcustomactionname\\\\\\",\\\\\\"actionDefinition\\\\\\":{\\\\\\"publishMetricAction\\\\\\":{\\\\\\"dimensions\\\\\\":[{\\\\\\"value\\\\\\":\\\\\\"fragmentmetricdimensionvalue\\\\\\"}]}}}],\\\\\\"networkFirewallStatefulRuleGroupReferences\\\\\\":[{\\\\\\"resourceARN\\\\\\":\\\\\\"arn:aws:network-firewall:us-east-1:123456789011:stateful-rulegroup/test\\\\\\"}],\\\\\\"networkFirewallOrchestrationConfig\\\\\\":{\\\\\\"firewallCreationConfig\\\\\\":{\\\\\\"endpointLocation\\\\\\":{\\\\\\"availabilityZoneConfigList\\\\\\":[{\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1a\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\"]},{\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1b\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\"]}]}},\\\\\\"singleFirewallEndpointPerVPC\\\\\\":false,\\\\\\"allowedIPV4CidrList\\\\\\":null,\\\\\\"routeManagementAction\\\\\\":\\\\\\"MONITOR\\\\\\",\\\\\\"routeManagementTargetTypes\\\\\\":[\\\\\\"InternetGateway\\\\\\"],\\\\\\"routeManagementConfig\\\\\\":{\\\\\\"allowCrossAZTrafficIfNoEndpoint\\\\\\":true}},\\\\\\"networkFirewallLoggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"ALERT\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}},{\\\\\\"logDestinationType\\\\\\":\\\\\\"S3\\\\\\",\\\\\\"logType\\\\\\":\\\\\\"FLOW\\\\\\",\\\\\\"logDestination\\\\\\":{\\\\\\"bucketName\\\\\\":\\\\\\"s3-bucket-name\\\\\\"}}],\\\\\\"overrideExistingConfig\\\\\\":boolean}}\\"`\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html) to `DISTRIBUTED` .\\n- Example: `THIRD_PARTY_FIREWALL` - Palo Alto Networks Cloud Next-Generation Firewall centralized deployment model\\n\\n`\\"{ \\\\\\"type\\\\\\":\\\\\\"THIRD_PARTY_FIREWALL\\\\\\", \\\\\\"thirdPartyFirewall\\\\\\":\\\\\\"PALO_ALTO_NETWORKS_CLOUD_NGFW\\\\\\", \\\\\\"thirdPartyFirewallConfig\\\\\\":{ \\\\\\"thirdPartyFirewallPolicyList\\\\\\":[\\\\\\"global-1\\\\\\"] },\\\\\\"firewallDeploymentModel\\\\\\":{\\\\\\"centralizedFirewallDeploymentModel\\\\\\":{\\\\\\"centralizedFirewallOrchestrationConfig\\\\\\":{\\\\\\"inspectionVpcIds\\\\\\":[{\\\\\\"resourceId\\\\\\":\\\\\\"vpc-1234\\\\\\",\\\\\\"accountId\\\\\\":\\\\\\"123456789011\\\\\\"}],\\\\\\"firewallCreationConfig\\\\\\":{\\\\\\"endpointLocation\\\\\\":{\\\\\\"availabilityZoneConfigList\\\\\\":[{\\\\\\"availabilityZoneId\\\\\\":null,\\\\\\"availabilityZoneName\\\\\\":\\\\\\"us-east-1a\\\\\\",\\\\\\"allowedIPV4CidrList\\\\\\":[\\\\\\"10.0.0.0/28\\\\\\"]}]}},\\\\\\"allowedIPV4CidrList\\\\\\":[]}}}}\\"`\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-thirdpartyfirewallpolicy.html) to `CENTRALIZED` .\\n- Example: `THIRD_PARTY_FIREWALL` - Palo Alto Networks Cloud Next-Generation Firewall distributed deployment model\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"THIRD_PARTY_FIREWALL\\\\\\",\\\\\\"thirdPartyFirewall\\\\\\":\\\\\\"PALO_ALTO_NETWORKS_CLOUD_NGFW\\\\\\",\\\\\\"thirdPartyFirewallConfig\\\\\\":{\\\\\\"thirdPartyFirewallPolicyList\\\\\\":[\\\\\\"global-1\\\\\\"] },\\\\\\"firewallDeploymentModel\\\\\\":{ \\\\\\"distributedFirewallDeploymentModel\\\\\\":{ \\\\\\"distributedFirewallOrchestrationConfig\\\\\\":{\\\\\\"firewallCreationConfig\\\\\\":{\\\\\\"endpointLocation\\\\\\":{ \\\\\\"availabilityZoneConfigList\\\\\\":[ {\\\\\\"availabilityZoneName\\\\\\":\\\\\\"${AvailabilityZone}\\\\\\" } ] } }, \\\\\\"allowedIPV4CidrList\\\\\\":[ ] } } } }\\"`\\n\\nTo use the distributed deployment model, you must set [FirewallDeploymentModel](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-thirdpartyfirewallpolicy.html) to `DISTRIBUTED` .\\n- Specification for `SHIELD_ADVANCED` for Amazon CloudFront distributions\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"SHIELD_ADVANCED\\\\\\",\\\\\\"automaticResponseConfiguration\\\\\\": {\\\\\\"automaticResponseStatus\\\\\\":\\\\\\"ENABLED|IGNORED|DISABLED\\\\\\", \\\\\\"automaticResponseAction\\\\\\":\\\\\\"BLOCK|COUNT\\\\\\"}, \\\\\\"overrideCustomerWebaclClassic\\\\\\":true|false}\\"`\\n\\nFor example: `\\"{\\\\\\"type\\\\\\":\\\\\\"SHIELD_ADVANCED\\\\\\",\\\\\\"automaticResponseConfiguration\\\\\\": {\\\\\\"automaticResponseStatus\\\\\\":\\\\\\"ENABLED\\\\\\", \\\\\\"automaticResponseAction\\\\\\":\\\\\\"COUNT\\\\\\"}}\\"`\\n\\nThe default value for `automaticResponseStatus` is `IGNORED` . The value for `automaticResponseAction` is only required when `automaticResponseStatus` is set to `ENABLED` . The default value for `overrideCustomerWebaclClassic` is `false` .\\n\\nFor other resource types that you can protect with a Shield Advanced policy, this `ManagedServiceData` configuration is an empty string.\\n- Example: `WAFV2`\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"WAFV2\\\\\\",\\\\\\"preProcessRuleGroups\\\\\\":[{\\\\\\"ruleGroupArn\\\\\\":null,\\\\\\"overrideAction\\\\\\":{\\\\\\"type\\\\\\":\\\\\\"NONE\\\\\\"},\\\\\\"managedRuleGroupIdentifier\\\\\\":{\\\\\\"version\\\\\\":null,\\\\\\"vendorName\\\\\\":\\\\\\"AWS\\\\\\",\\\\\\"managedRuleGroupName\\\\\\":\\\\\\"AWSManagedRulesAmazonIpReputationList\\\\\\"},\\\\\\"ruleGroupType\\\\\\":\\\\\\"ManagedRuleGroup\\\\\\",\\\\\\"excludeRules\\\\\\":[{\\\\\\"name\\\\\\":\\\\\\"NoUserAgent_HEADER\\\\\\"}]}],\\\\\\"postProcessRuleGroups\\\\\\":[],\\\\\\"defaultAction\\\\\\":{\\\\\\"type\\\\\\":\\\\\\"ALLOW\\\\\\"},\\\\\\"overrideCustomerWebACLAssociation\\\\\\":false,\\\\\\"loggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[\\\\\\"arn:aws:firehose:us-west-2:12345678912:deliverystream/aws-waf-logs-fms-admin-destination\\\\\\"],\\\\\\"redactedFields\\\\\\":[{\\\\\\"redactedFieldType\\\\\\":\\\\\\"SingleHeader\\\\\\",\\\\\\"redactedFieldValue\\\\\\":\\\\\\"Cookies\\\\\\"},{\\\\\\"redactedFieldType\\\\\\":\\\\\\"Method\\\\\\"}]}}\\"`\\n\\nIn the `loggingConfiguration` , you can specify one `logDestinationConfigs` , you can optionally provide up to 20 `redactedFields` , and the `RedactedFieldType` must be one of `URI` , `QUERY_STRING` , `HEADER` , or `METHOD` .\\n- Example: `AWS WAF Classic`\\n\\n`\\"{\\\\\\"type\\\\\\": \\\\\\"WAF\\\\\\", \\\\\\"ruleGroups\\\\\\": [{\\\\\\"id\\\\\\":\\\\\\"12345678-1bcd-9012-efga-0987654321ab\\\\\\", \\\\\\"overrideAction\\\\\\" : {\\\\\\"type\\\\\\": \\\\\\"COUNT\\\\\\"}}], \\\\\\"defaultAction\\\\\\": {\\\\\\"type\\\\\\": \\\\\\"BLOCK\\\\\\"}}\\"`\\n- Example: `WAFV2` - AWS Firewall Manager support for AWS WAF managed rule group versioning\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"WAFV2\\\\\\",\\\\\\"preProcessRuleGroups\\\\\\":[{\\\\\\"ruleGroupArn\\\\\\":null,\\\\\\"overrideAction\\\\\\":{\\\\\\"type\\\\\\":\\\\\\"NONE\\\\\\"},\\\\\\"managedRuleGroupIdentifier\\\\\\":{\\\\\\"versionEnabled\\\\\\":true,\\\\\\"version\\\\\\":\\\\\\"Version_2.0\\\\\\",\\\\\\"vendorName\\\\\\":\\\\\\"AWS\\\\\\",\\\\\\"managedRuleGroupName\\\\\\":\\\\\\"AWSManagedRulesCommonRuleSet\\\\\\"},\\\\\\"ruleGroupType\\\\\\":\\\\\\"ManagedRuleGroup\\\\\\",\\\\\\"excludeRules\\\\\\":[{\\\\\\"name\\\\\\":\\\\\\"NoUserAgent_HEADER\\\\\\"}]}],\\\\\\"postProcessRuleGroups\\\\\\":[],\\\\\\"defaultAction\\\\\\":{\\\\\\"type\\\\\\":\\\\\\"ALLOW\\\\\\"},\\\\\\"overrideCustomerWebACLAssociation\\\\\\":false,\\\\\\"loggingConfiguration\\\\\\":{\\\\\\"logDestinationConfigs\\\\\\":[\\\\\\"arn:aws:firehose:us-west-2:12345678912:deliverystream/aws-waf-logs-fms-admin-destination\\\\\\"],\\\\\\"redactedFields\\\\\\":[{\\\\\\"redactedFieldType\\\\\\":\\\\\\"SingleHeader\\\\\\",\\\\\\"redactedFieldValue\\\\\\":\\\\\\"Cookies\\\\\\"},{\\\\\\"redactedFieldType\\\\\\":\\\\\\"Method\\\\\\"}]}}\\"`\\n\\nTo use a specific version of a AWS WAF managed rule group in your Firewall Manager policy, you must set `versionEnabled` to `true` , and set `version` to the version you\'d like to use. If you don\'t set `versionEnabled` to `true` , or if you omit `versionEnabled` , then Firewall Manager uses the default version of the AWS WAF managed rule group.\\n- Example: `SECURITY_GROUPS_COMMON`\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"SECURITY_GROUPS_COMMON\\\\\\",\\\\\\"revertManualSecurityGroupChanges\\\\\\":false,\\\\\\"exclusiveResourceSecurityGroupManagement\\\\\\":false, \\\\\\"applyToAllEC2InstanceENIs\\\\\\":false,\\\\\\"securityGroups\\\\\\":[{\\\\\\"id\\\\\\":\\\\\\" sg-000e55995d61a06bd\\\\\\"}]}\\"`\\n- Example: Shared VPCs. Apply the preceding policy to resources in shared VPCs as well as to those in VPCs that the account owns\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"SECURITY_GROUPS_COMMON\\\\\\",\\\\\\"revertManualSecurityGroupChanges\\\\\\":false,\\\\\\"exclusiveResourceSecurityGroupManagement\\\\\\":false, \\\\\\"applyToAllEC2InstanceENIs\\\\\\":false,\\\\\\"includeSharedVPC\\\\\\":true,\\\\\\"securityGroups\\\\\\":[{\\\\\\"id\\\\\\":\\\\\\" sg-000e55995d61a06bd\\\\\\"}]}\\"`\\n- Example: `SECURITY_GROUPS_CONTENT_AUDIT`\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"SECURITY_GROUPS_CONTENT_AUDIT\\\\\\",\\\\\\"securityGroups\\\\\\":[{\\\\\\"id\\\\\\":\\\\\\"sg-000e55995d61a06bd\\\\\\"}],\\\\\\"securityGroupAction\\\\\\":{\\\\\\"type\\\\\\":\\\\\\"ALLOW\\\\\\"}}\\"`\\n\\nThe security group action for content audit can be `ALLOW` or `DENY` . For `ALLOW` , all in-scope security group rules must be within the allowed range of the policy\'s security group rules. For `DENY` , all in-scope security group rules must not contain a value or a range that matches a rule value or range in the policy security group.\\n- Example: `SECURITY_GROUPS_USAGE_AUDIT`\\n\\n`\\"{\\\\\\"type\\\\\\":\\\\\\"SECURITY_GROUPS_USAGE_AUDIT\\\\\\",\\\\\\"deleteUnusedSecurityGroups\\\\\\":true,\\\\\\"coalesceRedundantSecurityGroups\\\\\\":true}\\"`","PolicyOption":"Contains the Network Firewall firewall policy options to configure a centralized deployment model.","Type":"The service that the policy is using to protect the resources. This specifies the type of policy that is created, either an AWS WAF policy, a Shield Advanced policy, or a security group policy. For security group policies, Firewall Manager supports one security group for each common policy and for each content audit policy. This is an adjustable limit that you can increase by contacting AWS Support ."}},"AWS::FMS::Policy.ThirdPartyFirewallPolicy":{"attributes":{},"description":"Configures the deployment model for the third-party firewall.","properties":{"FirewallDeploymentModel":"Defines the deployment model to use for the third-party firewall policy."}},"AWS::FMS::ResourceSet":{"attributes":{"Id":"The ID of the resource set.","Ref":"The `Ref` for this resource returns the `ResourceSet.Id` .\\n\\n`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"A set of resources to include in a policy.","properties":{"Description":"A description of the resource set.","Name":"The descriptive name of the resource set. You can\'t change the name of a resource set after you create it.","ResourceTypeList":"Determines the resources that can be associated to the resource set. Depending on your setting for max results and the number of resource sets, a single call might not return the full list.","Resources":"The resources included in the resource set.","Tags":"A collection of key:value pairs associated with a resource set. The key:value pair can be anything you define. Typically, the tag key represents a category (such as \\"environment\\") and the tag value represents a specific value within that category (such as \\"test,\\" \\"development,\\" or \\"production\\"). You can add up to 50 tags to each AWS resource."}},"AWS::FSx::DataRepositoryAssociation":{"attributes":{"AssociationId":"Returns the data repository association\'s system generated Association ID.\\n\\nExample: `dra-abcdef0123456789d`","Ref":"`Ref` returns the data repository association resource ID. For example:\\n\\n`{\\"Ref\\":\\"data_repository_association_logical_id\\"}`\\n\\nReturns `dra-0123456789abcdef6` .","ResourceARN":"Returns the data repository association\'s Amazon Resource Name (ARN).\\n\\nExample: `arn:aws:fsx:us-east-1:111122223333:association/fs-abc012345def6789a/dra-abcdef0123456789b`"},"description":"Creates an Amazon FSx for Lustre data repository association (DRA). A data repository association is a link between a directory on the file system and an Amazon S3 bucket or prefix. You can have a maximum of 8 data repository associations on a file system. Data repository associations are supported on all FSx for Lustre 2.12 and newer file systems, excluding `scratch_1` deployment type.\\n\\nEach data repository association must have a unique Amazon FSx file system directory and a unique S3 bucket or prefix associated with it. You can configure a data repository association for automatic import only, for automatic export only, or for both. To learn more about linking a data repository to your file system, see [Linking your file system to an S3 bucket](https://docs.aws.amazon.com/fsx/latest/LustreGuide/create-dra-linked-data-repo.html) .","properties":{"BatchImportMetaDataOnCreate":"A boolean flag indicating whether an import data repository task to import metadata should run after the data repository association is created. The task runs if this flag is set to `true` .","DataRepositoryPath":"The path to the Amazon S3 data repository that will be linked to the file system. The path can be an S3 bucket or prefix in the format `s3://myBucket/myPrefix/` . This path specifies where in the S3 data repository files will be imported from or exported to.","FileSystemId":"The ID of the file system on which the data repository association is configured.","FileSystemPath":"A path on the Amazon FSx for Lustre file system that points to a high-level directory (such as `/ns1/` ) or subdirectory (such as `/ns1/subdir/` ) that will be mapped 1-1 with `DataRepositoryPath` . The leading forward slash in the name is required. Two data repository associations cannot have overlapping file system paths. For example, if a data repository is associated with file system path `/ns1/` , then you cannot link another data repository with file system path `/ns1/ns2` .\\n\\nThis path specifies where in your file system files will be exported from or imported to. This file system directory can be linked to only one Amazon S3 bucket, and no other S3 bucket can be linked to the directory.\\n\\n> If you specify only a forward slash ( `/` ) as the file system path, you can link only one data repository to the file system. You can only specify \\"/\\" as the file system path for the first data repository associated with a file system.","ImportedFileChunkSize":"For files imported from a data repository, this value determines the stripe count and maximum amount of data per file (in MiB) stored on a single physical disk. The maximum number of disks that a single file can be striped across is limited by the total number of disks that make up the file system or cache.\\n\\nThe default chunk size is 1,024 MiB (1 GiB) and can go as high as 512,000 MiB (500 GiB). Amazon S3 objects have a maximum size of 5 TB.","S3":"The configuration for an Amazon S3 data repository linked to an Amazon FSx Lustre file system with a data repository association. The configuration defines which file events (new, changed, or deleted files or directories) are automatically imported from the linked data repository to the file system or automatically exported from the file system to the data repository.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FSx::DataRepositoryAssociation.AutoExportPolicy":{"attributes":{},"description":"Describes a data repository association\'s automatic export policy. The `AutoExportPolicy` defines the types of updated objects on the file system that will be automatically exported to the data repository. As you create, modify, or delete files, Amazon FSx for Lustre automatically exports the defined changes asynchronously once your application finishes modifying the file.\\n\\nThe `AutoExportPolicy` is only supported on Amazon FSx for Lustre file systems with a data repository association.","properties":{"Events":"The `AutoExportPolicy` can have the following event values:\\n\\n- `NEW` - New files and directories are automatically exported to the data repository as they are added to the file system.\\n- `CHANGED` - Changes to files and directories on the file system are automatically exported to the data repository.\\n- `DELETED` - Files and directories are automatically deleted on the data repository when they are deleted on the file system.\\n\\nYou can define any combination of event types for your `AutoExportPolicy` ."}},"AWS::FSx::DataRepositoryAssociation.AutoImportPolicy":{"attributes":{},"description":"Describes the data repository association\'s automatic import policy. The AutoImportPolicy defines how Amazon FSx keeps your file metadata and directory listings up to date by importing changes to your Amazon FSx for Lustre file system as you modify objects in a linked S3 bucket.\\n\\nThe `AutoImportPolicy` is only supported on Amazon FSx for Lustre file systems with a data repository association.","properties":{"Events":"The `AutoImportPolicy` can have the following event values:\\n\\n- `NEW` - Amazon FSx automatically imports metadata of files added to the linked S3 bucket that do not currently exist in the FSx file system.\\n- `CHANGED` - Amazon FSx automatically updates file metadata and invalidates existing file content on the file system as files change in the data repository.\\n- `DELETED` - Amazon FSx automatically deletes files on the file system as corresponding files are deleted in the data repository.\\n\\nYou can define any combination of event types for your `AutoImportPolicy` ."}},"AWS::FSx::DataRepositoryAssociation.S3":{"attributes":{},"description":"The configuration for an Amazon S3 data repository linked to an Amazon FSx Lustre file system with a data repository association. The configuration defines which file events (new, changed, or deleted files or directories) are automatically imported from the linked data repository to the file system or automatically exported from the file system to the data repository.","properties":{"AutoExportPolicy":"Describes a data repository association\'s automatic export policy. The `AutoExportPolicy` defines the types of updated objects on the file system that will be automatically exported to the data repository. As you create, modify, or delete files, Amazon FSx for Lustre automatically exports the defined changes asynchronously once your application finishes modifying the file.\\n\\nThe `AutoExportPolicy` is only supported on Amazon FSx for Lustre file systems with a data repository association.","AutoImportPolicy":"Describes the data repository association\'s automatic import policy. The AutoImportPolicy defines how Amazon FSx keeps your file metadata and directory listings up to date by importing changes to your Amazon FSx for Lustre file system as you modify objects in a linked S3 bucket.\\n\\nThe `AutoImportPolicy` is only supported on Amazon FSx for Lustre file systems with a data repository association."}},"AWS::FSx::FileSystem":{"attributes":{"DNSName":"Returns the FSx for Windows file system\'s DNSName.\\n\\nExample: `amznfsxp1honlek.corp.example.com`","LustreMountName":"Returns the Lustre file system\'s `LustreMountName` .\\n\\nExample for `SCRATCH_1` deployment types: This value is always `fsx` .\\n\\nExample for `SCRATCH_2` and `PERSISTENT` deployment types: `2p3fhbmv`","Ref":"`Ref` returns the file system resource ID. For example:\\n\\n`{\\"Ref\\":\\"file_system_logical_id\\"}`\\n\\nReturns `fs-0123456789abcdef6` .","ResourceARN":"Returns the Amazon Resource Name (ARN) for the Amazon FSx file system.\\n\\nExample: `arn:aws:fsx:us-east-2:111122223333:file-system/fs-0123abcd56789ef0a`","RootVolumeId":"Returns the root volume ID of the FSx for OpenZFS file system.\\n\\nExample: `fsvol-0123456789abcdefa`"},"description":"The `AWS::FSx::FileSystem` resource is an Amazon FSx resource type that specifies an Amazon FSx file system. You can create any of the following supported file system types:\\n\\n- Amazon FSx for Lustre\\n- Amazon FSx for NetApp ONTAP\\n- Amazon FSx for OpenZFS\\n- Amazon FSx for Windows File Server","properties":{"BackupId":"The ID of the file system backup that you are using to create a file system. For more information, see [CreateFileSystemFromBackup](https://docs.aws.amazon.com/fsx/latest/APIReference/API_CreateFileSystemFromBackup.html) .","FileSystemType":"The type of Amazon FSx file system, which can be `LUSTRE` , `WINDOWS` , `ONTAP` , or `OPENZFS` .","FileSystemTypeVersion":"(Optional) For FSx for Lustre file systems, sets the Lustre version for the file system that you\'re creating. Valid values are `2.10` and `2.12` :\\n\\n- 2.10 is supported by the Scratch and Persistent_1 Lustre deployment types.\\n- 2.12 is supported by all Lustre deployment types. `2.12` is required when setting FSx for Lustre `DeploymentType` to `PERSISTENT_2` .\\n\\nDefault value = `2.10` , except when `DeploymentType` is set to `PERSISTENT_2` , then the default is `2.12` .\\n\\n> If you set `FileSystemTypeVersion` to `2.10` for a `PERSISTENT_2` Lustre deployment type, the `CreateFileSystem` operation fails.","KmsKeyId":"The ID of the AWS Key Management Service ( AWS KMS ) key used to encrypt Amazon FSx file system data. Used as follows with Amazon FSx file system types:\\n\\n- Amazon FSx for Lustre `PERSISTENT_1` and `PERSISTENT_2` deployment types only.\\n\\n`SCRATCH_1` and `SCRATCH_2` types are encrypted using the Amazon FSx service AWS KMS key for your account.\\n- Amazon FSx for NetApp ONTAP\\n- Amazon FSx for OpenZFS\\n- Amazon FSx for Windows File Server","LustreConfiguration":"The Lustre configuration for the file system being created.\\n\\n> The following parameters are not supported for file systems with a data repository association.\\n> \\n> - `AutoImportPolicy`\\n> - `ExportPath`\\n> - `ImportedChunkSize`\\n> - `ImportPath`","OntapConfiguration":"The ONTAP configuration properties of the FSx for ONTAP file system that you are creating.","OpenZFSConfiguration":"The Amazon FSx for OpenZFS configuration properties for the file system that you are creating.","SecurityGroupIds":"A list of IDs specifying the security groups to apply to all network interfaces created for file system access. This list isn\'t returned in later requests to describe the file system.","StorageCapacity":"Sets the storage capacity of the file system that you\'re creating. `StorageCapacity` is required if you are creating a new file system.\\n\\n*FSx for Lustre file systems* - The amount of storage capacity that you can configure depends on the value that you set for `StorageType` and the Lustre `DeploymentType` , as follows:\\n\\n- For `SCRATCH_2` , `PERSISTENT_2` and `PERSISTENT_1` deployment types using SSD storage type, the valid values are 1200 GiB, 2400 GiB, and increments of 2400 GiB.\\n- For `PERSISTENT_1` HDD file systems, valid values are increments of 6000 GiB for 12 MB/s/TiB file systems and increments of 1800 GiB for 40 MB/s/TiB file systems.\\n- For `SCRATCH_1` deployment type, valid values are 1200 GiB, 2400 GiB, and increments of 3600 GiB.\\n\\n*FSx for ONTAP file systems* - The amount of storage capacity that you can configure is from 1024 GiB up to 196,608 GiB (192 TiB).\\n\\n*FSx for OpenZFS file systems* - The amount of storage capacity that you can configure is from 64 GiB up to 524,288 GiB (512 TiB). If you are creating a file system from a backup, you can specify a storage capacity equal to or greater than the original file system\'s storage capacity.\\n\\n*FSx for Windows File Server file systems* - The amount of storage capacity that you can configure depends on the value that you set for `StorageType` as follows:\\n\\n- For SSD storage, valid values are 32 GiB-65,536 GiB (64 TiB).\\n- For HDD storage, valid values are 2000 GiB-65,536 GiB (64 TiB).","StorageType":"Sets the storage type for the file system that you\'re creating. Valid values are `SSD` and `HDD` .\\n\\n- Set to `SSD` to use solid state drive storage. SSD is supported on all Windows, Lustre, ONTAP, and OpenZFS deployment types.\\n- Set to `HDD` to use hard disk drive storage. HDD is supported on `SINGLE_AZ_2` and `MULTI_AZ_1` Windows file system deployment types, and on `PERSISTENT_1` Lustre file system deployment types.\\n\\nDefault value is `SSD` . For more information, see [Storage type options](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/optimize-fsx-costs.html#storage-type-options) in the *FSx for Windows File Server User Guide* and [Multiple storage options](https://docs.aws.amazon.com/fsx/latest/LustreGuide/what-is.html#storage-options) in the *FSx for Lustre User Guide* .","SubnetIds":"Specifies the IDs of the subnets that the file system will be accessible from. For Windows and ONTAP `MULTI_AZ_1` deployment types,provide exactly two subnet IDs, one for the preferred file server and one for the standby file server. You specify one of these subnets as the preferred subnet using the `WindowsConfiguration > PreferredSubnetID` or `OntapConfiguration > PreferredSubnetID` properties. For more information about Multi-AZ file system configuration, see [Availability and durability: Single-AZ and Multi-AZ file systems](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/high-availability-multiAZ.html) in the *Amazon FSx for Windows User Guide* and [Availability and durability](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/high-availability-multiAZ.html) in the *Amazon FSx for ONTAP User Guide* .\\n\\nFor Windows `SINGLE_AZ_1` and `SINGLE_AZ_2` and all Lustre deployment types, provide exactly one subnet ID. The file server is launched in that subnet\'s Availability Zone.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","WindowsConfiguration":"The configuration object for the Microsoft Windows file system you are creating. This value is required if `FileSystemType` is set to `WINDOWS` ."}},"AWS::FSx::FileSystem.AuditLogConfiguration":{"attributes":{},"description":"The configuration that Amazon FSx for Windows File Server uses to audit and log user accesses of files, folders, and file shares on the Amazon FSx for Windows File Server file system.","properties":{"AuditLogDestination":"The Amazon Resource Name (ARN) for the destination of the audit logs. The destination can be any Amazon CloudWatch Logs log group ARN or Amazon Kinesis Data Firehose delivery stream ARN.\\n\\nThe name of the Amazon CloudWatch Logs log group must begin with the `/aws/fsx` prefix. The name of the Amazon Kinesis Data Firehose delivery stream must begin with the `aws-fsx` prefix.\\n\\nThe destination ARN (either CloudWatch Logs log group or Kinesis Data Firehose delivery stream) must be in the same AWS partition, AWS Region , and AWS account as your Amazon FSx file system.","FileAccessAuditLogLevel":"Sets which attempt type is logged by Amazon FSx for file and folder accesses.\\n\\n- `SUCCESS_ONLY` - only successful attempts to access files or folders are logged.\\n- `FAILURE_ONLY` - only failed attempts to access files or folders are logged.\\n- `SUCCESS_AND_FAILURE` - both successful attempts and failed attempts to access files or folders are logged.\\n- `DISABLED` - access auditing of files and folders is turned off.","FileShareAccessAuditLogLevel":"Sets which attempt type is logged by Amazon FSx for file share accesses.\\n\\n- `SUCCESS_ONLY` - only successful attempts to access file shares are logged.\\n- `FAILURE_ONLY` - only failed attempts to access file shares are logged.\\n- `SUCCESS_AND_FAILURE` - both successful attempts and failed attempts to access file shares are logged.\\n- `DISABLED` - access auditing of file shares is turned off."}},"AWS::FSx::FileSystem.ClientConfigurations":{"attributes":{},"description":"Specifies who can mount an OpenZFS file system and the options available while mounting the file system.","properties":{"Clients":"A value that specifies who can mount the file system. You can provide a wildcard character ( `*` ), an IP address ( `0.0.0.0` ), or a CIDR address ( `192.0.2.0/24` ). By default, Amazon FSx uses the wildcard character when specifying the client.","Options":"The options to use when mounting the file system. For a list of options that you can use with Network File System (NFS), see the [exports(5) - Linux man page](https://docs.aws.amazon.com/https://linux.die.net/man/5/exports) . When choosing your options, consider the following:\\n\\n- `crossmnt` is used by default. If you don\'t specify `crossmnt` when changing the client configuration, you won\'t be able to see or access snapshots in your file system\'s snapshot directory.\\n- `sync` is used by default. If you instead specify `async` , the system acknowledges writes before writing to disk. If the system crashes before the writes are finished, you lose the unwritten data."}},"AWS::FSx::FileSystem.DiskIopsConfiguration":{"attributes":{},"description":"The SSD IOPS (input/output operations per second) configuration for an Amazon FSx for NetApp ONTAP or FSx for OpenZFS file system. By default, Amazon FSx automatically provisions 3 IOPS per GB of storage capacity. You can provision additional IOPS per GB of storage. The configuration consists of the total number of provisioned SSD IOPS and how it is was provisioned, or the mode (by the customer or by Amazon FSx).","properties":{"Iops":"The total number of SSD IOPS provisioned for the file system.","Mode":"Specifies whether the file system is using the `AUTOMATIC` setting of SSD IOPS of 3 IOPS per GB of storage capacity, , or if it using a `USER_PROVISIONED` value."}},"AWS::FSx::FileSystem.LustreConfiguration":{"attributes":{},"description":"The configuration for the Amazon FSx for Lustre file system.","properties":{"AutoImportPolicy":"(Optional) When you create your file system, your existing S3 objects appear as file and directory listings. Use this property to choose how Amazon FSx keeps your file and directory listings up to date as you add or modify objects in your linked S3 bucket. `AutoImportPolicy` can have the following values:\\n\\n- `NONE` - (Default) AutoImport is off. Amazon FSx only updates file and directory listings from the linked S3 bucket when the file system is created. FSx does not update file and directory listings for any new or changed objects after choosing this option.\\n- `NEW` - AutoImport is on. Amazon FSx automatically imports directory listings of any new objects added to the linked S3 bucket that do not currently exist in the FSx file system.\\n- `NEW_CHANGED` - AutoImport is on. Amazon FSx automatically imports file and directory listings of any new objects added to the S3 bucket and any existing objects that are changed in the S3 bucket after you choose this option.\\n- `NEW_CHANGED_DELETED` - AutoImport is on. Amazon FSx automatically imports file and directory listings of any new objects added to the S3 bucket, any existing objects that are changed in the S3 bucket, and any objects that were deleted in the S3 bucket.\\n\\nFor more information, see [Automatically import updates from your S3 bucket](https://docs.aws.amazon.com/fsx/latest/LustreGuide/autoimport-data-repo.html) .\\n\\n> This parameter is not supported for Lustre file systems with a data repository association.","AutomaticBackupRetentionDays":"The number of days to retain automatic backups. Setting this property to `0` disables automatic backups. You can retain automatic backups for a maximum of 90 days. The default is `0` .","CopyTagsToBackups":"A Boolean flag indicating whether tags for the file system should be copied to backups. This value defaults to false. If it\'s set to true, all tags for the file system are copied to all automatic and user-initiated backups where the user doesn\'t specify tags. If this value is true, and you specify one or more tags, only the specified tags are copied to backups. If you specify one or more tags when creating a user-initiated backup, no tags are copied from the file system, regardless of this value. Only valid for use with `PERSISTENT_1` deployment types.","DailyAutomaticBackupStartTime":"A recurring daily time, in the format `HH:MM` . `HH` is the zero-padded hour of the day (0-23), and `MM` is the zero-padded minute of the hour. For example, `05:00` specifies 5 AM daily.","DataCompressionType":"Sets the data compression configuration for the file system. `DataCompressionType` can have the following values:\\n\\n- `NONE` - (Default) Data compression is turned off when the file system is created.\\n- `LZ4` - Data compression is turned on with the LZ4 algorithm.\\n\\nFor more information, see [Lustre data compression](https://docs.aws.amazon.com/fsx/latest/LustreGuide/data-compression.html) in the *Amazon FSx for Lustre User Guide* .","DeploymentType":"(Optional) Choose `SCRATCH_1` and `SCRATCH_2` deployment types when you need temporary storage and shorter-term processing of data. The `SCRATCH_2` deployment type provides in-transit encryption of data and higher burst throughput capacity than `SCRATCH_1` .\\n\\nChoose `PERSISTENT_1` for longer-term storage and for throughput-focused workloads that aren’t latency-sensitive. `PERSISTENT_1` supports encryption of data in transit, and is available in all AWS Regions in which FSx for Lustre is available.\\n\\nChoose `PERSISTENT_2` for longer-term storage and for latency-sensitive workloads that require the highest levels of IOPS/throughput. `PERSISTENT_2` supports SSD storage, and offers higher `PerUnitStorageThroughput` (up to 1000 MB/s/TiB). `PERSISTENT_2` is available in a limited number of AWS Regions . For more information, and an up-to-date list of AWS Regions in which `PERSISTENT_2` is available, see [File system deployment options for FSx for Lustre](https://docs.aws.amazon.com/fsx/latest/LustreGuide/using-fsx-lustre.html#lustre-deployment-types) in the *Amazon FSx for Lustre User Guide* .\\n\\n> If you choose `PERSISTENT_2` , and you set `FileSystemTypeVersion` to `2.10` , the `CreateFileSystem` operation fails. \\n\\nEncryption of data in transit is automatically turned on when you access `SCRATCH_2` , `PERSISTENT_1` and `PERSISTENT_2` file systems from Amazon EC2 instances that support automatic encryption in the AWS Regions where they are available. For more information about encryption in transit for FSx for Lustre file systems, see [Encrypting data in transit](https://docs.aws.amazon.com/fsx/latest/LustreGuide/encryption-in-transit-fsxl.html) in the *Amazon FSx for Lustre User Guide* .\\n\\n(Default = `SCRATCH_1` )","DriveCacheType":"The type of drive cache used by `PERSISTENT_1` file systems that are provisioned with HDD storage devices. This parameter is required when storage type is HDD. Set this property to `READ` to improve the performance for frequently accessed files by caching up to 20% of the total storage capacity of the file system.\\n\\nThis parameter is required when `StorageType` is set to `HDD` and `DeploymentType` is `PERSISTENT_1` .","ExportPath":"(Optional) Specifies the path in the Amazon S3 bucket where the root of your Amazon FSx file system is exported. The path must use the same Amazon S3 bucket as specified in ImportPath. You can provide an optional prefix to which new and changed data is to be exported from your Amazon FSx for Lustre file system. If an `ExportPath` value is not provided, Amazon FSx sets a default export path, `s3://import-bucket/FSxLustre[creation-timestamp]` . The timestamp is in UTC format, for example `s3://import-bucket/FSxLustre20181105T222312Z` .\\n\\nThe Amazon S3 export bucket must be the same as the import bucket specified by `ImportPath` . If you specify only a bucket name, such as `s3://import-bucket` , you get a 1:1 mapping of file system objects to S3 bucket objects. This mapping means that the input data in S3 is overwritten on export. If you provide a custom prefix in the export path, such as `s3://import-bucket/[custom-optional-prefix]` , Amazon FSx exports the contents of your file system to that export prefix in the Amazon S3 bucket.\\n\\n> This parameter is not supported for file systems with a data repository association.","ImportPath":"(Optional) The path to the Amazon S3 bucket (including the optional prefix) that you\'re using as the data repository for your Amazon FSx for Lustre file system. The root of your FSx for Lustre file system will be mapped to the root of the Amazon S3 bucket you select. An example is `s3://import-bucket/optional-prefix` . If you specify a prefix after the Amazon S3 bucket name, only object keys with that prefix are loaded into the file system.\\n\\n> This parameter is not supported for Lustre file systems with a data repository association.","ImportedFileChunkSize":"(Optional) For files imported from a data repository, this value determines the stripe count and maximum amount of data per file (in MiB) stored on a single physical disk. The maximum number of disks that a single file can be striped across is limited by the total number of disks that make up the file system.\\n\\nThe default chunk size is 1,024 MiB (1 GiB) and can go as high as 512,000 MiB (500 GiB). Amazon S3 objects have a maximum size of 5 TB.\\n\\n> This parameter is not supported for Lustre file systems with a data repository association.","PerUnitStorageThroughput":"Required with `PERSISTENT_1` and `PERSISTENT_2` deployment types, provisions the amount of read and write throughput for each 1 tebibyte (TiB) of file system storage capacity, in MB/s/TiB. File system throughput capacity is calculated by multiplying file system storage capacity (TiB) by the `PerUnitStorageThroughput` (MB/s/TiB). For a 2.4-TiB file system, provisioning 50 MB/s/TiB of `PerUnitStorageThroughput` yields 120 MB/s of file system throughput. You pay for the amount of throughput that you provision.\\n\\nValid values:\\n\\n- For `PERSISTENT_1` SSD storage: 50, 100, 200 MB/s/TiB.\\n- For `PERSISTENT_1` HDD storage: 12, 40 MB/s/TiB.\\n- For `PERSISTENT_2` SSD storage: 125, 250, 500, 1000 MB/s/TiB.","WeeklyMaintenanceStartTime":"A recurring weekly time, in the format `D:HH:MM` .\\n\\n`D` is the day of the week, for which 1 represents Monday and 7 represents Sunday. For further details, see [the ISO-8601 spec as described on Wikipedia](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/ISO_week_date) .\\n\\n`HH` is the zero-padded hour of the day (0-23), and `MM` is the zero-padded minute of the hour.\\n\\nFor example, `1:05:00` specifies maintenance at 5 AM Monday."}},"AWS::FSx::FileSystem.NfsExports":{"attributes":{},"description":"The configuration object for mounting a file system.","properties":{"ClientConfigurations":"A list of configuration objects that contain the client and options for mounting the OpenZFS file system."}},"AWS::FSx::FileSystem.OntapConfiguration":{"attributes":{},"description":"The configuration for this Amazon FSx for NetApp ONTAP file system.","properties":{"AutomaticBackupRetentionDays":"The number of days to retain automatic backups. Setting this property to `0` disables automatic backups. You can retain automatic backups for a maximum of 90 days. The default is `30` .","DailyAutomaticBackupStartTime":"A recurring daily time, in the format `HH:MM` . `HH` is the zero-padded hour of the day (0-23), and `MM` is the zero-padded minute of the hour. For example, `05:00` specifies 5 AM daily.","DeploymentType":"Specifies the FSx for ONTAP file system deployment type to use in creating the file system.\\n\\n- `MULTI_AZ_1` - (Default) A high availability file system configured for Multi-AZ redundancy to tolerate temporary Availability Zone (AZ) unavailability.\\n- `SINGLE_AZ_1` - A file system configured for Single-AZ redundancy.\\n\\nFor information about the use cases for Multi-AZ and Single-AZ deployments, refer to [Choosing a file system deployment type](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/high-availability-AZ.html) .","DiskIopsConfiguration":"The SSD IOPS configuration for the FSx for ONTAP file system.","EndpointIpAddressRange":"(Multi-AZ only) Specifies the IP address range in which the endpoints to access your file system will be created. By default in the Amazon FSx API, Amazon FSx selects an unused IP address range for you from the 198.19.* range. By default in the Amazon FSx console, Amazon FSx chooses the last 64 IP addresses from the VPC’s primary CIDR range to use as the endpoint IP address range for the file system. You can have overlapping endpoint IP addresses for file systems deployed in the same VPC/route tables, as long as they don\'t overlap with any subnet.","FsxAdminPassword":"The ONTAP administrative password for the `fsxadmin` user with which you administer your file system using the NetApp ONTAP CLI and REST API.","PreferredSubnetId":"Required when `DeploymentType` is set to `MULTI_AZ_1` . This specifies the subnet in which you want the preferred file server to be located.","RouteTableIds":"(Multi-AZ only) Specifies the virtual private cloud (VPC) route tables in which your file system\'s endpoints will be created. You should specify all VPC route tables associated with the subnets in which your clients are located. By default, Amazon FSx selects your VPC\'s default route table.","ThroughputCapacity":"Sets the throughput capacity for the file system that you\'re creating. Valid values are 128, 256, 512, 1024, 2048, and 4096 MBps.","WeeklyMaintenanceStartTime":"A recurring weekly time, in the format `D:HH:MM` .\\n\\n`D` is the day of the week, for which 1 represents Monday and 7 represents Sunday. For further details, see [the ISO-8601 spec as described on Wikipedia](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/ISO_week_date) .\\n\\n`HH` is the zero-padded hour of the day (0-23), and `MM` is the zero-padded minute of the hour.\\n\\nFor example, `1:05:00` specifies maintenance at 5 AM Monday."}},"AWS::FSx::FileSystem.OpenZFSConfiguration":{"attributes":{},"description":"The OpenZFS configuration for the file system that\'s being created.","properties":{"AutomaticBackupRetentionDays":"The number of days to retain automatic backups. Setting this property to `0` disables automatic backups. You can retain automatic backups for a maximum of 90 days. The default is `30` .","CopyTagsToBackups":"A Boolean value indicating whether tags for the file system should be copied to backups. This value defaults to `false` . If it\'s set to `true` , all tags for the file system are copied to all automatic and user-initiated backups where the user doesn\'t specify tags. If this value is `true` , and you specify one or more tags, only the specified tags are copied to backups. If you specify one or more tags when creating a user-initiated backup, no tags are copied from the file system, regardless of this value.","CopyTagsToVolumes":"A Boolean value indicating whether tags for the file system should be copied to volumes. This value defaults to `false` . If it\'s set to `true` , all tags for the file system are copied to volumes where the user doesn\'t specify tags. If this value is `true` , and you specify one or more tags, only the specified tags are copied to volumes. If you specify one or more tags when creating the volume, no tags are copied from the file system, regardless of this value.","DailyAutomaticBackupStartTime":"A recurring daily time, in the format `HH:MM` . `HH` is the zero-padded hour of the day (0-23), and `MM` is the zero-padded minute of the hour. For example, `05:00` specifies 5 AM daily.","DeploymentType":"Specifies the file system deployment type. Single AZ deployment types are configured for redundancy within a single Availability Zone in an AWS Region . Valid values are the following:\\n\\n- `SINGLE_AZ_1` - (Default) Creates file systems with throughput capacities of 64 - 4,096 MBps. `Single_AZ_1` is available in all AWS Regions where Amazon FSx for OpenZFS is available.\\n- `SINGLE_AZ_2` - Creates file systems with throughput capacities of 160 - 10,240 MB/s using an NVMe L2ARC cache. `Single_AZ_2` is available only in the US East (N. Virginia), US East (Ohio), US West (Oregon), and Europe (Ireland) AWS Regions .\\n\\nFor more information, see: [Deployment type availability](https://docs.aws.amazon.com/fsx/latest/OpenZFSGuide/availability-durability.html#available-aws-regions) and [File system performance](https://docs.aws.amazon.com/fsx/latest/OpenZFSGuide/performance.html#zfs-fs-performance) in the *Amazon FSx for OpenZFS User Guide* .","DiskIopsConfiguration":"The SSD IOPS (input/output operations per second) configuration for an Amazon FSx for NetApp ONTAP or FSx for OpenZFS file system. By default, Amazon FSx automatically provisions 3 IOPS per GB of storage capacity. You can provision additional IOPS per GB of storage. The configuration consists of the total number of provisioned SSD IOPS and how it is was provisioned, or the mode (by the customer or by Amazon FSx).","Options":"To delete a file system if there are child volumes present below the root volume, use the string `DELETE_CHILD_VOLUMES_AND_SNAPSHOTS` . If your file system has child volumes and you don\'t use this option, the delete request will fail.","RootVolumeConfiguration":"The configuration Amazon FSx uses when creating the root value of the Amazon FSx for OpenZFS file system. All volumes are children of the root volume.","ThroughputCapacity":"Specifies the throughput of an Amazon FSx for OpenZFS file system, measured in megabytes per second (MBps). Valid values depend on the DeploymentType you choose, as follows:\\n\\n- For `SINGLE_AZ_1` , valid values are 64, 128, 256, 512, 1024, 2048, 3072, or 4096 MBps.\\n- For `SINGLE_AZ_2` , valid values are 160, 320, 640, 1280, 2560, 3840, 5120, 7680, or 10240 MBps.\\n\\nYou pay for additional throughput capacity that you provision.","WeeklyMaintenanceStartTime":"A recurring weekly time, in the format `D:HH:MM` .\\n\\n`D` is the day of the week, for which 1 represents Monday and 7 represents Sunday. For further details, see [the ISO-8601 spec as described on Wikipedia](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/ISO_week_date) .\\n\\n`HH` is the zero-padded hour of the day (0-23), and `MM` is the zero-padded minute of the hour.\\n\\nFor example, `1:05:00` specifies maintenance at 5 AM Monday."}},"AWS::FSx::FileSystem.RootVolumeConfiguration":{"attributes":{},"description":"The configuration of an Amazon FSx for OpenZFS root volume.","properties":{"CopyTagsToSnapshots":"A Boolean value indicating whether tags for the volume should be copied to snapshots of the volume. This value defaults to `false` . If it\'s set to `true` , all tags for the volume are copied to snapshots where the user doesn\'t specify tags. If this value is `true` and you specify one or more tags, only the specified tags are copied to snapshots. If you specify one or more tags when creating the snapshot, no tags are copied from the volume, regardless of this value.","DataCompressionType":"Specifies the method used to compress the data on the volume. The compression type is `NONE` by default.\\n\\n- `NONE` - Doesn\'t compress the data on the volume. `NONE` is the default.\\n- `ZSTD` - Compresses the data in the volume using the Zstandard (ZSTD) compression algorithm. Compared to LZ4, Z-Standard provides a better compression ratio to minimize on-disk storage utilization.\\n- `LZ4` - Compresses the data in the volume using the LZ4 compression algorithm. Compared to Z-Standard, LZ4 is less compute-intensive and delivers higher write throughput speeds.","NfsExports":"The configuration object for mounting a file system.","ReadOnly":"A Boolean value indicating whether the volume is read-only. Setting this value to `true` can be useful after you have completed changes to a volume and no longer want changes to occur.","RecordSizeKiB":"Specifies the record size of an OpenZFS root volume, in kibibytes (KiB). Valid values are 4, 8, 16, 32, 64, 128, 256, 512, or 1024 KiB. The default is 128 KiB. Most workloads should use the default record size. Database workflows can benefit from a smaller record size, while streaming workflows can benefit from a larger record size. For additional guidance on setting a custom record size, see [Tips for maximizing performance](https://docs.aws.amazon.com/fsx/latest/OpenZFSGuide/performance.html#performance-tips-zfs) in the *Amazon FSx for OpenZFS User Guide* .","UserAndGroupQuotas":"An object specifying how much storage users or groups can use on the volume."}},"AWS::FSx::FileSystem.SelfManagedActiveDirectoryConfiguration":{"attributes":{},"description":"The configuration that Amazon FSx uses to join a FSx for Windows File Server file system or an FSx for ONTAP storage virtual machine (SVM) to a self-managed (including on-premises) Microsoft Active Directory (AD) directory. For more information, see [Using Amazon FSx for Windows with your self-managed Microsoft Active Directory](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/self-managed-AD.html) or [Managing FSx for ONTAP SVMs](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/managing-svms.html) .","properties":{"DnsIps":"A list of up to three IP addresses of DNS servers or domain controllers in the self-managed AD directory.","DomainName":"The fully qualified domain name of the self-managed AD directory, such as `corp.example.com` .","FileSystemAdministratorsGroup":"(Optional) The name of the domain group whose members are granted administrative privileges for the file system. Administrative privileges include taking ownership of files and folders, setting audit controls (audit ACLs) on files and folders, and administering the file system remotely by using the FSx Remote PowerShell. The group that you specify must already exist in your domain. If you don\'t provide one, your AD domain\'s Domain Admins group is used.","OrganizationalUnitDistinguishedName":"(Optional) The fully qualified distinguished name of the organizational unit within your self-managed AD directory. Amazon FSx only accepts OU as the direct parent of the file system. An example is `OU=FSx,DC=yourdomain,DC=corp,DC=com` . To learn more, see [RFC 2253](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc2253) . If none is provided, the FSx file system is created in the default location of your self-managed AD directory.\\n\\n> Only Organizational Unit (OU) objects can be the direct parent of the file system that you\'re creating.","Password":"The password for the service account on your self-managed AD domain that Amazon FSx will use to join to your AD domain.","UserName":"The user name for the service account on your self-managed AD domain that Amazon FSx will use to join to your AD domain. This account must have the permission to join computers to the domain in the organizational unit provided in `OrganizationalUnitDistinguishedName` , or in the default location of your AD domain."}},"AWS::FSx::FileSystem.UserAndGroupQuotas":{"attributes":{},"description":"The configuration for how much storage a user or group can use on the volume.","properties":{"Id":"The ID of the user or group.","StorageCapacityQuotaGiB":"The amount of storage that the user or group can use in gibibytes (GiB).","Type":"A value that specifies whether the quota applies to a user or group."}},"AWS::FSx::FileSystem.WindowsConfiguration":{"attributes":{},"description":"The Microsoft Windows configuration for the file system that\'s being created.","properties":{"ActiveDirectoryId":"The ID for an existing AWS Managed Microsoft Active Directory (AD) instance that the file system should join when it\'s created. Required if you are joining the file system to an existing AWS Managed Microsoft AD.","Aliases":"An array of one or more DNS alias names that you want to associate with the Amazon FSx file system. Aliases allow you to use existing DNS names to access the data in your Amazon FSx file system. You can associate up to 50 aliases with a file system at any time.\\n\\nFor more information, see [Working with DNS Aliases](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/managing-dns-aliases.html) and [Walkthrough 5: Using DNS aliases to access your file system](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/walkthrough05-file-system-custom-CNAME.html) , including additional steps you must take to be able to access your file system using a DNS alias.\\n\\nAn alias name has to meet the following requirements:\\n\\n- Formatted as a fully-qualified domain name (FQDN), `hostname.domain` , for example, `accounting.example.com` .\\n- Can contain alphanumeric characters, the underscore (_), and the hyphen (-).\\n- Cannot start or end with a hyphen.\\n- Can start with a numeric.\\n\\nFor DNS alias names, Amazon FSx stores alphabetical characters as lowercase letters (a-z), regardless of how you specify them: as uppercase letters, lowercase letters, or the corresponding letters in escape codes.","AuditLogConfiguration":"The configuration that Amazon FSx for Windows File Server uses to audit and log user accesses of files, folders, and file shares on the Amazon FSx for Windows File Server file system.","AutomaticBackupRetentionDays":"The number of days to retain automatic backups. Setting this property to `0` disables automatic backups. You can retain automatic backups for a maximum of 90 days. The default is `30` .","CopyTagsToBackups":"A boolean flag indicating whether tags for the file system should be copied to backups. This value defaults to false. If it\'s set to true, all tags for the file system are copied to all automatic and user-initiated backups where the user doesn\'t specify tags. If this value is true, and you specify one or more tags, only the specified tags are copied to backups. If you specify one or more tags when creating a user-initiated backup, no tags are copied from the file system, regardless of this value.","DailyAutomaticBackupStartTime":"A recurring daily time, in the format `HH:MM` . `HH` is the zero-padded hour of the day (0-23), and `MM` is the zero-padded minute of the hour. For example, `05:00` specifies 5 AM daily.","DeploymentType":"Specifies the file system deployment type, valid values are the following:\\n\\n- `MULTI_AZ_1` - Deploys a high availability file system that is configured for Multi-AZ redundancy to tolerate temporary Availability Zone (AZ) unavailability. You can only deploy a Multi-AZ file system in AWS Regions that have a minimum of three Availability Zones. Also supports HDD storage type\\n- `SINGLE_AZ_1` - (Default) Choose to deploy a file system that is configured for single AZ redundancy.\\n- `SINGLE_AZ_2` - The latest generation Single AZ file system. Specifies a file system that is configured for single AZ redundancy and supports HDD storage type.\\n\\nFor more information, see [Availability and Durability: Single-AZ and Multi-AZ File Systems](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/high-availability-multiAZ.html) .","PreferredSubnetId":"Required when `DeploymentType` is set to `MULTI_AZ_1` . This specifies the subnet in which you want the preferred file server to be located. For in- AWS applications, we recommend that you launch your clients in the same availability zone as your preferred file server to reduce cross-availability zone data transfer costs and minimize latency.","SelfManagedActiveDirectoryConfiguration":"The configuration that Amazon FSx uses to join a FSx for Windows File Server file system or an FSx for ONTAP storage virtual machine (SVM) to a self-managed (including on-premises) Microsoft Active Directory (AD) directory. For more information, see [Using Amazon FSx for Windows with your self-managed Microsoft Active Directory](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/self-managed-AD.html) or [Managing FSx for ONTAP SVMs](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/managing-svms.html) .","ThroughputCapacity":"Sets the throughput capacity of an Amazon FSx file system, measured in megabytes per second (MB/s), in 2 to the *n* th increments, between 2^3 (8) and 2^11 (2048).\\n\\n> To increase storage capacity, a file system must have a minimum throughput capacity of 16 MB/s.","WeeklyMaintenanceStartTime":"A recurring weekly time, in the format `D:HH:MM` .\\n\\n`D` is the day of the week, for which 1 represents Monday and 7 represents Sunday. For further details, see [the ISO-8601 spec as described on Wikipedia](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/ISO_week_date) .\\n\\n`HH` is the zero-padded hour of the day (0-23), and `MM` is the zero-padded minute of the hour.\\n\\nFor example, `1:05:00` specifies maintenance at 5 AM Monday."}},"AWS::FSx::Snapshot":{"attributes":{"Ref":"`Ref` returns the ID of the snapshot. For example:\\n\\n`{\\"Ref\\":\\"logical_snapshot_id\\"}`\\n\\nReturns `fsvolsnap-0123456789abcedf5` .","ResourceARN":"Returns the snapshot\'s Amazon Resource Name (ARN).\\n\\nExample: `arn:aws:fsx:us-east-2:111133334444:snapshot/fsvol-01234567890123456/fsvolsnap-0123456789abcedf5`"},"description":"A snapshot of an Amazon FSx for OpenZFS volume.","properties":{"Name":"The name of the snapshot.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","VolumeId":"The ID of the volume that the snapshot is of."}},"AWS::FSx::StorageVirtualMachine":{"attributes":{"Ref":"`Ref` returns the resource ID, such as `svm-01234567890123456` . For example:\\n\\n`{\\"Ref\\": \\"svm_logical_id\\"}` returns\\n\\n`svm-01234567890123456`","ResourceARN":"Returns the storage virtual machine\'s Amazon Resource Name (ARN).\\n\\nExample: `arn:aws:fsx:us-east-2:111111111111:storage-virtual-machine/fs-0123456789abcdef1/svm-01234567890123456`","StorageVirtualMachineId":"Returns the storgage virtual machine\'s system generated ID.\\n\\nExample: `svm-0123456789abcedf1`","UUID":"Returns the storage virtual machine\'s system generated unique identifier (UUID).\\n\\nExample: `abcd0123-cd45-ef67-11aa-1111aaaa23bc`"},"description":"Creates a storage virtual machine (SVM) for an Amazon FSx for ONTAP file system.","properties":{"ActiveDirectoryConfiguration":"Describes the Microsoft Active Directory configuration to which the SVM is joined, if applicable.","FileSystemId":"Specifies the FSx for ONTAP file system on which to create the SVM.","Name":"The name of the SVM.","RootVolumeSecurityStyle":"The security style of the root volume of the SVM. Specify one of the following values:\\n\\n- `UNIX` if the file system is managed by a UNIX administrator, the majority of users are NFS clients, and an application accessing the data uses a UNIX user as the service account.\\n- `NTFS` if the file system is managed by a Windows administrator, the majority of users are SMB clients, and an application accessing the data uses a Windows user as the service account.\\n- `MIXED` if the file system is managed by both UNIX and Windows administrators and users consist of both NFS and SMB clients.","SvmAdminPassword":"Specifies the password to use when logging on to the SVM using a secure shell (SSH) connection to the SVM\'s management endpoint. Doing so enables you to manage the SVM using the NetApp ONTAP CLI or REST API. If you do not specify a password, you can still use the file system\'s `fsxadmin` user to manage the SVM. For more information, see [Managing SVMs using the NetApp ONTAP CLI](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/managing-resources-ontap-apps.html#vsadmin-ontap-cli) in the *FSx for ONTAP User Guide* .","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FSx::StorageVirtualMachine.ActiveDirectoryConfiguration":{"attributes":{},"description":"Describes the self-managed Microsoft Active Directory to which you want to join the SVM. Joining an Active Directory provides user authentication and access control for SMB clients, including Microsoft Windows and macOS client accessing the file system.","properties":{"NetBiosName":"The NetBIOS name of the Active Directory computer object that will be created for your SVM.","SelfManagedActiveDirectoryConfiguration":"The configuration that Amazon FSx uses to join the ONTAP storage virtual machine (SVM) to your self-managed (including on-premises) Microsoft Active Directory (AD) directory."}},"AWS::FSx::StorageVirtualMachine.SelfManagedActiveDirectoryConfiguration":{"attributes":{},"description":"The configuration that Amazon FSx uses to join a FSx for Windows File Server file system or an FSx for ONTAP storage virtual machine (SVM) to a self-managed (including on-premises) Microsoft Active Directory (AD) directory. For more information, see [Using Amazon FSx for Windows with your self-managed Microsoft Active Directory](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/self-managed-AD.html) or [Managing FSx for ONTAP SVMs](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/managing-svms.html) .","properties":{"DnsIps":"A list of up to three IP addresses of DNS servers or domain controllers in the self-managed AD directory.","DomainName":"The fully qualified domain name of the self-managed AD directory, such as `corp.example.com` .","FileSystemAdministratorsGroup":"(Optional) The name of the domain group whose members are granted administrative privileges for the file system. Administrative privileges include taking ownership of files and folders, setting audit controls (audit ACLs) on files and folders, and administering the file system remotely by using the FSx Remote PowerShell. The group that you specify must already exist in your domain. If you don\'t provide one, your AD domain\'s Domain Admins group is used.","OrganizationalUnitDistinguishedName":"(Optional) The fully qualified distinguished name of the organizational unit within your self-managed AD directory. Amazon FSx only accepts OU as the direct parent of the file system. An example is `OU=FSx,DC=yourdomain,DC=corp,DC=com` . To learn more, see [RFC 2253](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc2253) . If none is provided, the FSx file system is created in the default location of your self-managed AD directory.\\n\\n> Only Organizational Unit (OU) objects can be the direct parent of the file system that you\'re creating.","Password":"The password for the service account on your self-managed AD domain that Amazon FSx will use to join to your AD domain.","UserName":"The user name for the service account on your self-managed AD domain that Amazon FSx will use to join to your AD domain. This account must have the permission to join computers to the domain in the organizational unit provided in `OrganizationalUnitDistinguishedName` , or in the default location of your AD domain."}},"AWS::FSx::Volume":{"attributes":{"Ref":"`Ref` returns the ID for the volume. For example:\\n\\n`{\\"Ref\\":\\"vol_logical_id\\"}`\\n\\nReturns `fsvol-0123456789abcdef6` .","ResourceARN":"Returns the volume\'s Amazon Resource Name (ARN).\\n\\nExample: `arn:aws:fsx:us-east-2:111122223333:volume/fs-0123456789abcdef9/fsvol-01234567891112223`","UUID":"Returns the volume\'s universally unique identifier (UUID).\\n\\nExample: `abcd0123-cd45-ef67-11aa-1111aaaa23bc`","VolumeId":"Returns the volume\'s ID.\\n\\nExample: `fsvol-0123456789abcdefa`"},"description":"Creates an FSx for ONTAP or Amazon FSx for OpenZFS storage volume.","properties":{"BackupId":"Specifies the ID of the volume backup to use to create a new volume.","Name":"The name of the volume.","OntapConfiguration":"The configuration of an Amazon FSx for NetApp ONTAP volume.","OpenZFSConfiguration":"The configuration of an Amazon FSx for OpenZFS volume.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","VolumeType":"The type of the volume."}},"AWS::FSx::Volume.ClientConfigurations":{"attributes":{},"description":"Specifies who can mount an OpenZFS file system and the options available while mounting the file system.","properties":{"Clients":"A value that specifies who can mount the file system. You can provide a wildcard character ( `*` ), an IP address ( `0.0.0.0` ), or a CIDR address ( `192.0.2.0/24` ). By default, Amazon FSx uses the wildcard character when specifying the client.","Options":"The options to use when mounting the file system. For a list of options that you can use with Network File System (NFS), see the [exports(5) - Linux man page](https://docs.aws.amazon.com/https://linux.die.net/man/5/exports) . When choosing your options, consider the following:\\n\\n- `crossmnt` is used by default. If you don\'t specify `crossmnt` when changing the client configuration, you won\'t be able to see or access snapshots in your file system\'s snapshot directory.\\n- `sync` is used by default. If you instead specify `async` , the system acknowledges writes before writing to disk. If the system crashes before the writes are finished, you lose the unwritten data."}},"AWS::FSx::Volume.NfsExports":{"attributes":{},"description":"The configuration object for mounting a Network File System (NFS) file system.","properties":{"ClientConfigurations":"A list of configuration objects that contain the client and options for mounting the OpenZFS file system."}},"AWS::FSx::Volume.OntapConfiguration":{"attributes":{},"description":"Specifies the configuration of the ONTAP volume that you are creating.","properties":{"CopyTagsToBackups":"A boolean flag indicating whether tags for the volume should be copied to backups. This value defaults to false. If it\'s set to true, all tags for the volume are copied to all automatic and user-initiated backups where the user doesn\'t specify tags. If this value is true, and you specify one or more tags, only the specified tags are copied to backups. If you specify one or more tags when creating a user-initiated backup, no tags are copied from the volume, regardless of this value.","JunctionPath":"Specifies the location in the SVM\'s namespace where the volume is mounted. This parameter is required. The `JunctionPath` must have a leading forward slash, such as `/vol3` .","OntapVolumeType":"Specifies the type of volume you are creating. Valid values are the following:\\n\\n- `RW` specifies a read/write volume. `RW` is the default.\\n- `DP` specifies a data-protection volume. A `DP` volume is read-only and can be used as the destination of a NetApp SnapMirror relationship.\\n\\nFor more information, see [Volume types](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/volume-types) in the *Amazon FSx for NetApp ONTAP User Guide* .","SecurityStyle":"Specifies the security style for the volume. If a volume\'s security style is not specified, it is automatically set to the root volume\'s security style. The security style determines the type of permissions that FSx for ONTAP uses to control data access. For more information, see [Volume security style](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/managing-volumes.html#volume-security-style) in the *Amazon FSx for NetApp ONTAP User Guide* . Specify one of the following values:\\n\\n- `UNIX` if the file system is managed by a UNIX administrator, the majority of users are NFS clients, and an application accessing the data uses a UNIX user as the service account.\\n- `NTFS` if the file system is managed by a Windows administrator, the majority of users are SMB clients, and an application accessing the data uses a Windows user as the service account.\\n- `MIXED` if the file system is managed by both UNIX and Windows administrators and users consist of both NFS and SMB clients.","SizeInMegabytes":"Specifies the size of the volume, in megabytes (MB), that you are creating.","SnapshotPolicy":"Specifies the snapshot policy for the volume. There are three built-in snapshot policies:\\n\\n- `default` : This is the default policy. A maximum of six hourly snapshots taken five minutes past the hour. A maximum of two daily snapshots taken Monday through Saturday at 10 minutes after midnight. A maximum of two weekly snapshots taken every Sunday at 15 minutes after midnight.\\n- `default-1weekly` : This policy is the same as the `default` policy except that it only retains one snapshot from the weekly schedule.\\n- `none` : This policy does not take any snapshots. This policy can be assigned to volumes to prevent automatic snapshots from being taken.\\n\\nYou can also provide the name of a custom policy that you created with the ONTAP CLI or REST API.\\n\\nFor more information, see [Snapshot policies](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/snapshots-ontap.html#snapshot-policies) in the *Amazon FSx for NetApp ONTAP User Guide* .","StorageEfficiencyEnabled":"Set to true to enable deduplication, compression, and compaction storage efficiency features on the volume, or set to false to disable them. This parameter is required.","StorageVirtualMachineId":"Specifies the ONTAP SVM in which to create the volume.","TieringPolicy":"Describes the data tiering policy for an ONTAP volume. When enabled, Amazon FSx for ONTAP\'s intelligent tiering automatically transitions a volume\'s data between the file system\'s primary storage and capacity pool storage based on your access patterns.\\n\\nValid tiering policies are the following:\\n\\n- `SNAPSHOT_ONLY` - (Default value) moves cold snapshots to the capacity pool storage tier.\\n\\n- `AUTO` - moves cold user data and snapshots to the capacity pool storage tier based on your access patterns.\\n\\n- `ALL` - moves all user data blocks in both the active file system and Snapshot copies to the storage pool tier.\\n\\n- `NONE` - keeps a volume\'s data in the primary storage tier, preventing it from being moved to the capacity pool tier."}},"AWS::FSx::Volume.OpenZFSConfiguration":{"attributes":{},"description":"Specifies the configuration of the Amazon FSx for OpenZFS volume that you are creating.","properties":{"CopyTagsToSnapshots":"A Boolean value indicating whether tags for the volume should be copied to snapshots. This value defaults to `false` . If it\'s set to `true` , all tags for the volume are copied to snapshots where the user doesn\'t specify tags. If this value is `true` , and you specify one or more tags, only the specified tags are copied to snapshots. If you specify one or more tags when creating the snapshot, no tags are copied from the volume, regardless of this value.","DataCompressionType":"Specifies the method used to compress the data on the volume. The compression type is `NONE` by default.\\n\\n- `NONE` - Doesn\'t compress the data on the volume. `NONE` is the default.\\n- `ZSTD` - Compresses the data in the volume using the Zstandard (ZSTD) compression algorithm. Compared to LZ4, Z-Standard provides a better compression ratio to minimize on-disk storage utilization.\\n- `LZ4` - Compresses the data in the volume using the LZ4 compression algorithm. Compared to Z-Standard, LZ4 is less compute-intensive and delivers higher write throughput speeds.","NfsExports":"The configuration object for mounting a Network File System (NFS) file system.","Options":"To delete the volume\'s child volumes, snapshots, and clones, use the string `DELETE_CHILD_VOLUMES_AND_SNAPSHOTS` .","OriginSnapshot":"The configuration object that specifies the snapshot to use as the origin of the data for the volume.","ParentVolumeId":"The ID of the volume to use as the parent volume of the volume that you are creating.","ReadOnly":"A Boolean value indicating whether the volume is read-only.","RecordSizeKiB":"Specifies the suggested block size for a volume in a ZFS dataset, in kibibytes (KiB). Valid values are 4, 8, 16, 32, 64, 128, 256, 512, or 1024 KiB. The default is 128 KiB. We recommend using the default setting for the majority of use cases. Generally, workloads that write in fixed small or large record sizes may benefit from setting a custom record size, like database workloads (small record size) or media streaming workloads (large record size). For additional guidance on when to set a custom record size, see [ZFS Record size](https://docs.aws.amazon.com/fsx/latest/OpenZFSGuide/performance.html#record-size-performance) in the *Amazon FSx for OpenZFS User Guide* .","StorageCapacityQuotaGiB":"Sets the maximum storage size in gibibytes (GiB) for the volume. You can specify a quota that is larger than the storage on the parent volume. A volume quota limits the amount of storage that the volume can consume to the configured amount, but does not guarantee the space will be available on the parent volume. To guarantee quota space, you must also set `StorageCapacityReservationGiB` . To *not* specify a storage capacity quota, set this to `-1` .\\n\\nFor more information, see [Volume properties](https://docs.aws.amazon.com/fsx/latest/OpenZFSGuide/managing-volumes.html#volume-properties) in the *Amazon FSx for OpenZFS User Guide* .","StorageCapacityReservationGiB":"Specifies the amount of storage in gibibytes (GiB) to reserve from the parent volume. Setting `StorageCapacityReservationGiB` guarantees that the specified amount of storage space on the parent volume will always be available for the volume. You can\'t reserve more storage than the parent volume has. To *not* specify a storage capacity reservation, set this to `0` or `-1` . For more information, see [Volume properties](https://docs.aws.amazon.com/fsx/latest/OpenZFSGuide/managing-volumes.html#volume-properties) in the *Amazon FSx for OpenZFS User Guide* .","UserAndGroupQuotas":"An object specifying how much storage users or groups can use on the volume."}},"AWS::FSx::Volume.OriginSnapshot":{"attributes":{},"description":"The configuration object that specifies the snapshot to use as the origin of the data for the volume.","properties":{"CopyStrategy":"The strategy used when copying data from the snapshot to the new volume.\\n\\n- `CLONE` - The new volume references the data in the origin snapshot. Cloning a snapshot is faster than copying data from the snapshot to a new volume and doesn\'t consume disk throughput. However, the origin snapshot can\'t be deleted if there is a volume using its copied data.\\n- `FULL_COPY` - Copies all data from the snapshot to the new volume.","SnapshotARN":"Specifies the snapshot to use when creating an OpenZFS volume from a snapshot."}},"AWS::FSx::Volume.TieringPolicy":{"attributes":{},"description":"Describes the data tiering policy for an ONTAP volume. When enabled, Amazon FSx for ONTAP\'s intelligent tiering automatically transitions a volume\'s data between the file system\'s primary storage and capacity pool storage based on your access patterns.\\n\\nValid tiering policies are the following:\\n\\n- `SNAPSHOT_ONLY` - (Default value) moves cold snapshots to the capacity pool storage tier.\\n\\n- `AUTO` - moves cold user data and snapshots to the capacity pool storage tier based on your access patterns.\\n\\n- `ALL` - moves all user data blocks in both the active file system and Snapshot copies to the storage pool tier.\\n\\n- `NONE` - keeps a volume\'s data in the primary storage tier, preventing it from being moved to the capacity pool tier.","properties":{"CoolingPeriod":"Specifies the number of days that user data in a volume must remain inactive before it is considered \\"cold\\" and moved to the capacity pool. Used with the `AUTO` and `SNAPSHOT_ONLY` tiering policies. Enter a whole number between 2 and 183. Default values are 31 days for `AUTO` and 2 days for `SNAPSHOT_ONLY` .","Name":"Specifies the tiering policy used to transition data. Default value is `SNAPSHOT_ONLY` .\\n\\n- `SNAPSHOT_ONLY` - moves cold snapshots to the capacity pool storage tier.\\n- `AUTO` - moves cold user data and snapshots to the capacity pool storage tier based on your access patterns.\\n- `ALL` - moves all user data blocks in both the active file system and Snapshot copies to the storage pool tier.\\n- `NONE` - keeps a volume\'s data in the primary storage tier, preventing it from being moved to the capacity pool tier."}},"AWS::FSx::Volume.UserAndGroupQuotas":{"attributes":{},"description":"An object specifying how much storage users or groups can use on the volume.","properties":{"Id":"The ID of the user or group.","StorageCapacityQuotaGiB":"The amount of storage that the user or group can use in gibibytes (GiB).","Type":"A value that specifies whether the quota applies to a user or group."}},"AWS::FinSpace::Environment":{"attributes":{"AwsAccountId":"The ID of the AWS account in which the FinSpace environment is created.","DedicatedServiceAccountId":"The AWS account ID of the dedicated service account associated with your FinSpace environment.","EnvironmentArn":"The Amazon Resource Name (ARN) of your FinSpace environment.","EnvironmentId":"The identifier of the FinSpace environment.","EnvironmentUrl":"The sign-in url for the web application of your FinSpace environment.","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myEnvironment\\" }`\\n\\nFor the Amazon FinSpace environment group `myEnvironment` , `Ref` returns the name of the environment.","SageMakerStudioDomainUrl":"The url of the integrated FinSpace notebook environment in your web application.","Status":"The current status of creation of the FinSpace environment."},"description":"The `AWS::FinSpace::Environment` resource represents an Amazon FinSpace environment.","properties":{"Description":"The description of the FinSpace environment.","FederationMode":"The authentication mode for the environment.","FederationParameters":"Configuration information when authentication mode is FEDERATED.","KmsKeyId":"The KMS key id used to encrypt in the FinSpace environment.","Name":"The name of the FinSpace environment.","SuperuserParameters":"Configuration information for the superuser.","Tags":""}},"AWS::FinSpace::Environment.AttributeMapItems":{"attributes":{},"description":"","properties":{"Key":"","Value":""}},"AWS::FinSpace::Environment.FederationParameters":{"attributes":{},"description":"Configuration information when authentication mode is FEDERATED.","properties":{"ApplicationCallBackURL":"The redirect or sign-in URL that should be entered into the SAML 2.0 compliant identity provider configuration (IdP).","AttributeMap":"SAML attribute name and value. The name must always be `Email` and the value should be set to the attribute definition in which user email is set. For example, name would be `Email` and value `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress` . Please check your SAML 2.0 compliant identity provider (IdP) documentation for details.","FederationProviderName":"Name of the identity provider (IdP).","FederationURN":"The Uniform Resource Name (URN). Also referred as Service Provider URN or Audience URI or Service Provider Entity ID.","SamlMetadataDocument":"SAML 2.0 Metadata document from identity provider (IdP).","SamlMetadataURL":"Provide the metadata URL from your SAML 2.0 compliant identity provider (IdP)."}},"AWS::FinSpace::Environment.SuperuserParameters":{"attributes":{},"description":"Configuration information for the superuser.","properties":{"EmailAddress":"The email address of the superuser.","FirstName":"The first name of the superuser.","LastName":"The last name of the superuser."}},"AWS::Forecast::Dataset":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the dataset.","Ref":"`Ref` returns the resource name."},"description":"Creates an Amazon Forecast dataset. The information about the dataset that you provide helps Forecast understand how to consume the data for model training. This includes the following:\\n\\n- *`DataFrequency`* - How frequently your historical time-series data is collected.\\n- *`Domain`* and *`DatasetType`* - Each dataset has an associated dataset domain and a type within the domain. Amazon Forecast provides a list of predefined domains and types within each domain. For each unique dataset domain and type within the domain, Amazon Forecast requires your data to include a minimum set of predefined fields.\\n- *`Schema`* - A schema specifies the fields in the dataset, including the field name and data type.\\n\\nAfter creating a dataset, you import your training data into it and add the dataset to a dataset group. You use the dataset group to create a predictor. For more information, see [Importing datasets](https://docs.aws.amazon.com/forecast/latest/dg/howitworks-datasets-groups.html) .\\n\\nTo get a list of all your datasets, use the [ListDatasets](https://docs.aws.amazon.com/forecast/latest/dg/API_ListDatasets.html) operation.\\n\\nFor example Forecast datasets, see the [Amazon Forecast Sample GitHub repository](https://docs.aws.amazon.com/https://github.com/aws-samples/amazon-forecast-samples) .\\n\\n> The `Status` of a dataset must be `ACTIVE` before you can import training data. Use the [DescribeDataset](https://docs.aws.amazon.com/forecast/latest/dg/API_DescribeDataset.html) operation to get the status.","properties":{"DataFrequency":"The frequency of data collection. This parameter is required for RELATED_TIME_SERIES datasets.\\n\\nValid intervals are an integer followed by Y (Year), M (Month), W (Week), D (Day), H (Hour), and min (Minute). For example, \\"1D\\" indicates every day and \\"15min\\" indicates every 15 minutes. You cannot specify a value that would overlap with the next larger frequency. That means, for example, you cannot specify a frequency of 60 minutes, because that is equivalent to 1 hour. The valid values for each frequency are the following:\\n\\n- Minute - 1-59\\n- Hour - 1-23\\n- Day - 1-6\\n- Week - 1-4\\n- Month - 1-11\\n- Year - 1\\n\\nThus, if you want every other week forecasts, specify \\"2W\\". Or, if you want quarterly forecasts, you specify \\"3M\\".","DatasetName":"The name of the dataset.","DatasetType":"The dataset type.","Domain":"The domain associated with the dataset.","EncryptionConfig":"A Key Management Service (KMS) key and the Identity and Access Management (IAM) role that Amazon Forecast can assume to access the key.","Schema":"The schema for the dataset. The schema attributes and their order must match the fields in your data. The dataset `Domain` and `DatasetType` that you choose determine the minimum required fields in your training data. For information about the required fields for a specific dataset domain and type, see [Dataset Domains and Dataset Types](https://docs.aws.amazon.com/forecast/latest/dg/howitworks-domains-ds-types.html) .","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::Forecast::Dataset.AttributesItems":{"attributes":{},"description":"","properties":{"AttributeName":"","AttributeType":""}},"AWS::Forecast::Dataset.EncryptionConfig":{"attributes":{},"description":"An AWS Key Management Service (KMS) key and an AWS Identity and Access Management (IAM) role that Amazon Forecast can assume to access the key. You can specify this optional object in the `CreateDataset` and `CreatePredictor` requests.","properties":{"KmsKeyArn":"The Amazon Resource Name (ARN) of the KMS key.","RoleArn":"The ARN of the IAM role that Amazon Forecast can assume to access the AWS KMS key.\\n\\nPassing a role across AWS accounts is not allowed. If you pass a role that isn\'t in your account, you get an `InvalidInputException` error."}},"AWS::Forecast::Dataset.Schema":{"attributes":{},"description":"Defines the fields of a dataset.","properties":{"Attributes":"An array of attributes specifying the name and type of each field in a dataset."}},"AWS::Forecast::Dataset.TagsItems":{"attributes":{},"description":"","properties":{"Key":"","Value":""}},"AWS::Forecast::DatasetGroup":{"attributes":{"DatasetGroupArn":"The Amazon Resource Name (ARN) of the dataset group."},"description":"Creates a dataset group, which holds a collection of related datasets. You can add datasets to the dataset group when you create the dataset group, or later by using the [UpdateDatasetGroup](https://docs.aws.amazon.com/forecast/latest/dg/API_UpdateDatasetGroup.html) operation.\\n\\nAfter creating a dataset group and adding datasets, you use the dataset group when you create a predictor. For more information, see [Dataset groups](https://docs.aws.amazon.com/forecast/latest/dg/howitworks-datasets-groups.html) .\\n\\nTo get a list of all your datasets groups, use the [ListDatasetGroups](https://docs.aws.amazon.com/forecast/latest/dg/API_ListDatasetGroups.html) operation.\\n\\n> The `Status` of a dataset group must be `ACTIVE` before you can use the dataset group to create a predictor. To get the status, use the [DescribeDatasetGroup](https://docs.aws.amazon.com/forecast/latest/dg/API_DescribeDatasetGroup.html) operation.","properties":{"DatasetArns":"An array of Amazon Resource Names (ARNs) of the datasets that you want to include in the dataset group.","DatasetGroupName":"The name of the dataset group.","Domain":"The domain associated with the dataset group. When you add a dataset to a dataset group, this value and the value specified for the `Domain` parameter of the [CreateDataset](https://docs.aws.amazon.com/forecast/latest/dg/API_CreateDataset.html) operation must match.\\n\\nThe `Domain` and `DatasetType` that you choose determine the fields that must be present in training data that you import to a dataset. For example, if you choose the `RETAIL` domain and `TARGET_TIME_SERIES` as the `DatasetType` , Amazon Forecast requires that `item_id` , `timestamp` , and `demand` fields are present in your data. For more information, see [Dataset groups](https://docs.aws.amazon.com/forecast/latest/dg/howitworks-datasets-groups.html) .","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::Detector":{"attributes":{"Arn":"The detector ARN.","CreatedTime":"Timestamp of when detector was created.","DetectorVersionId":"The name of the detector.","EventType.Arn":"","EventType.CreatedTime":"","EventType.LastUpdatedTime":"","LastUpdatedTime":"Timestamp of when detector was last updated.","Ref":"`Ref` returns the primary identifier for the resource, which is the ARN.\\n\\nExample: `{\\"Ref\\": \\"arn:aws:frauddetector:us-west-2:123123123123:outcome/outcome_name\\"}`"},"description":"Manages a detector and associated detector versions.","properties":{"AssociatedModels":"The models to associate with this detector. You must provide the ARNs of all the models you want to associate.","Description":"The detector description.","DetectorId":"The name of the detector.","DetectorVersionStatus":"The status of the detector version. If a value is not provided for this property, AWS CloudFormation assumes `DRAFT` status.\\n\\nValid values: `ACTIVE | DRAFT`","EventType":"The event type associated with this detector.","RuleExecutionMode":"The rule execution mode for the rules included in the detector version.\\n\\nValid values: `FIRST_MATCHED | ALL_MATCHED` Default value: `FIRST_MATCHED`\\n\\nYou can define and edit the rule mode at the detector version level, when it is in draft status.\\n\\nIf you specify `FIRST_MATCHED` , Amazon Fraud Detector evaluates rules sequentially, first to last, stopping at the first matched rule. Amazon Fraud dectector then provides the outcomes for that single rule.\\n\\nIf you specifiy `ALL_MATCHED` , Amazon Fraud Detector evaluates all rules and returns the outcomes for all matched rules.","Rules":"The rules to include in the detector version.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::Detector.EntityType":{"attributes":{},"description":"The entity type details.","properties":{"Arn":"The entity type ARN.","CreatedTime":"Timestamp of when the entity type was created.","Description":"The entity type description.","Inline":"Indicates whether the resource is defined within this CloudFormation template and impacts the create, update, and delete behavior of the stack. If the value is `true` , CloudFormation will create/update/delete the resource when creating/updating/deleting the stack. If the value is `false` , CloudFormation will validate that the object exists and then use it within the resource without making changes to the object.\\n\\nFor example, when creating `AWS::FraudDetector::Detector` you must define at least two variables. You can set `Inline=true` for these Variables and CloudFormation will create/update/delete the variables as part of stack operations. However, if you set `Inline=false` , CloudFormation will associate the variables to your detector but not execute any changes to the variables.","LastUpdatedTime":"Timestamp of when the entity type was last updated.","Name":"The entity type name.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::Detector.EventType":{"attributes":{},"description":"The event type details.","properties":{"Arn":"The entity type ARN.","CreatedTime":"Timestamp of when the event type was created.","Description":"The event type description.","EntityTypes":"The event type entity types.","EventVariables":"The event type event variables.","Inline":"Indicates whether the resource is defined within this CloudFormation template and impacts the create, update, and delete behavior of the stack. If the value is `true` , CloudFormation will create/update/delete the resource when creating/updating/deleting the stack. If the value is `false` , CloudFormation will validate that the object exists and then use it within the resource without making changes to the object.\\n\\nFor example, when creating `AWS::FraudDetector::Detector` you must define at least two variables. You can set `Inline=true` for these variables and CloudFormation will create/update/delete the Variables as part of stack operations. However, if you set `Inline=false` , CloudFormation will associate the variables to your detector but not execute any changes to the variables.","Labels":"The event type labels.","LastUpdatedTime":"Timestamp of when the event type was last updated.","Name":"The event type name.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::Detector.EventVariable":{"attributes":{},"description":"The event type variable for the detector.","properties":{"Arn":"The event variable ARN.","CreatedTime":"Timestamp for when the event variable was created.","DataSource":"The data source of the event variable.\\n\\nValid values: `EVENT | EXTERNAL_MODEL_SCORE`\\n\\nWhen defining a variable within a detector, you can only use the `EVENT` value for DataSource when the *Inline* property is set to true. If the *Inline* property is set false, you can use either `EVENT` or `MODEL_SCORE` for DataSource.","DataType":"The data type of the event variable.\\n\\nValid values: `STRING | INTEGER | BOOLEAN | FLOAT`","DefaultValue":"The default value of the event variable. This is required if you are providing the details of your variables instead of the ARN.","Description":"The description of the event variable.","Inline":"Indicates whether the resource is defined within this CloudFormation template and impacts the create, update, and delete behavior of the stack. If the value is `true` , CloudFormation will create/update/delete the resource when creating/updating/deleting the stack. If the value is `false` , CloudFormation will validate that the object exists and then use it within the resource without making changes to the object.\\n\\nFor example, when creating `AWS::FraudDetector::Detector` you must define at least two variables. You can set `Inline=true` for these variables and CloudFormation will create/update/delete the variables as part of stack operations. However, if you set `Inline=false` , CloudFormation will associate the variables to your detector but not execute any changes to the variables.","LastUpdatedTime":"Timestamp for when the event variable was last updated.","Name":"The name of the event variable.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","VariableType":"The type of event variable. For more information, see [Variable types](https://docs.aws.amazon.com/frauddetector/latest/ug/create-a-variable.html#variable-types) ."}},"AWS::FraudDetector::Detector.Label":{"attributes":{},"description":"The label details.","properties":{"Arn":"The label ARN.","CreatedTime":"Timestamp of when the event type was created.","Description":"The label description.","Inline":"Indicates whether the resource is defined within this CloudFormation template and impacts the create, update, and delete behavior of the stack. If the value is `true` , CloudFormation will create/update/delete the resource when creating/updating/deleting the stack. If the value is `false` , CloudFormation will validate that the object exists and then use it within the resource without making changes to the object.\\n\\nFor example, when creating `AWS::FraudDetector::Detector` you must define at least two variables. You can set `Inline=true` for these variables and CloudFormation will create/update/delete the variables as part of stack operations. However, if you set `Inline=false` , CloudFormation will associate the variables to your detector but not execute any changes to the variables.","LastUpdatedTime":"Timestamp of when the label was last updated.","Name":"The label name.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::Detector.Model":{"attributes":{},"description":"","properties":{"Arn":""}},"AWS::FraudDetector::Detector.Outcome":{"attributes":{},"description":"The outcome.","properties":{"Arn":"The outcome ARN.","CreatedTime":"The timestamp when the outcome was created.","Description":"The outcome description.","Inline":"Indicates whether the resource is defined within this CloudFormation template and impacts the create, update, and delete behavior of the stack. If the value is `true` , CloudFormation will create/update/delete the resource when creating/updating/deleting the stack. If the value is `false` , CloudFormation will validate that the object exists and then use it within the resource without making changes to the object.\\n\\nFor example, when creating `AWS::FraudDetector::Detector` you must define at least two variables. You can set `Inline=true` for these variables and CloudFormation will create/update/delete the variables as part of stack operations. However, if you set `Inline=false` , CloudFormation will associate the variables to your detector but not execute any changes to the variables.","LastUpdatedTime":"The timestamp when the outcome was last updated.","Name":"The outcome name.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::Detector.Rule":{"attributes":{},"description":"A rule. Rule is a condition that tells Amazon Fraud Detector how to interpret variables values during a fraud prediction.","properties":{"Arn":"The rule ARN.","CreatedTime":"Timestamp for when the rule was created.","Description":"The rule description.","DetectorId":"The detector for which the rule is associated.","Expression":"The rule expression. A rule expression captures the business logic. For more information, see [Rule language reference](https://docs.aws.amazon.com/frauddetector/latest/ug/rule-language-reference.html) .","Language":"The rule language.","LastUpdatedTime":"Timestamp for when the rule was last updated.","Outcomes":"The rule outcome.","RuleId":"The rule ID.","RuleVersion":"The rule version.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::EntityType":{"attributes":{"Arn":"The entity type ARN.","CreatedTime":"Timestamp of when entity type was created.","LastUpdatedTime":"Timestamp of when entity type was last updated.","Ref":"`Ref` returns the primary identifier for the resource, which is the ARN.\\n\\nExample: `{ \\"Ref\\": \\"arn:aws:frauddetector:us-west-2:123123123123:outcome/outcome_name\\"}`"},"description":"Manages an entity type. An entity represents who is performing the event. As part of a fraud prediction, you pass the entity ID to indicate the specific entity who performed the event. An entity type classifies the entity. Example classifications include customer, merchant, or account.","properties":{"Description":"The entity type description.","Name":"The entity type name.\\n\\nPattern: `^[0-9a-z_-]+$`","Tags":"A key and value pair."}},"AWS::FraudDetector::EventType":{"attributes":{"Arn":"The event type ARN.","CreatedTime":"Timestamp of when event type was created.","LastUpdatedTime":"Timestamp of when event type was last updated.","Ref":"`Ref` returns the primary identifier for the resource, which is the Arn.\\n\\nExample: `{\\"Ref\\": \\"arn:aws:frauddetector:us-west-2:123123123123:outcome/outcome_name\\"}`"},"description":"Manages an event type. An event is a business activity that is evaluated for fraud risk. With Amazon Fraud Detector, you generate fraud predictions for events. An event type defines the structure for an event sent to Amazon Fraud Detector. This includes the variables sent as part of the event, the entity performing the event (such as a customer), and the labels that classify the event. Example event types include online payment transactions, account registrations, and authentications.","properties":{"Description":"The event type description.","EntityTypes":"The event type entity types.","EventVariables":"The event type event variables.","Labels":"The event type labels.","Name":"The event type name.\\n\\nPattern : `^[0-9a-z_-]+$`","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::EventType.EntityType":{"attributes":{},"description":"The entity type details.","properties":{"Arn":"The entity type ARN.","CreatedTime":"Timestamp of when the entity type was created.","Description":"The entity type description.","Inline":"Indicates whether the resource is defined within this CloudFormation template and impacts the create, update, and delete behavior of the stack. If the value is `true` , CloudFormation will create/update/delete the resource when creating/updating/deleting the stack. If the value is `false` , CloudFormation will validate that the object exists and then use it within the resource without making changes to the object.\\n\\nFor example, when creating `AWS::FraudDetector::EventType` you must define at least two variables. You can set `Inline=true` for these variables and CloudFormation will create/update/delete the variables as part of stack operations. However, if you set `Inline=false` , CloudFormation will associate the variables to your event type but not execute any changes to the variables.","LastUpdatedTime":"Timestamp of when the entity type was last updated.","Name":"The entity type name.\\n\\n`^[0-9a-z_-]+$`","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::EventType.EventVariable":{"attributes":{},"description":"The variables associated with this event type.","properties":{"Arn":"The event variable ARN.","CreatedTime":"Timestamp for when event variable was created.","DataSource":"The source of the event variable.\\n\\nValid values: `EVENT | EXTERNAL_MODEL_SCORE`\\n\\nWhen defining a variable within a event type, you can only use the `EVENT` value for DataSource when the *Inline* property is set to true. If the *Inline* property is set false, you can use either `EVENT` or `MODEL_SCORE` for DataSource.","DataType":"The data type of the event variable. For more information, see [Data types](https://docs.aws.amazon.com/frauddetector/latest/ug/variables.html#data-types) .","DefaultValue":"The default value of the event variable","Description":"The event variable description.","Inline":"Indicates whether the resource is defined within this CloudFormation template and impacts the create, update, and delete behavior of the stack. If the value is `true` , CloudFormation will create/update/delete the resource when creating/updating/deleting the stack. If the value is `false` , CloudFormation will validate that the object exists and then use it within the resource without making changes to the object.\\n\\nFor example, when creating `AWS::FraudDetector::EventType` you must define at least two variables. You can set `Inline=true` for these variables and CloudFormation will create/update/delete the Variables as part of stack operations. However, if you set `Inline=false` , CloudFormation will associate the variables to your event type but not execute any changes to the variables.","LastUpdatedTime":"Timestamp for when the event variable was last updated.","Name":"The name of the event variable.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","VariableType":"The type of event variable. For more information, see [Variable types](https://docs.aws.amazon.com/frauddetector/latest/ug/variables.html#variable-types) ."}},"AWS::FraudDetector::EventType.Label":{"attributes":{},"description":"The label associated with the event type.","properties":{"Arn":"The label ARN.","CreatedTime":"Timestamp of when the event type was created.","Description":"The label description.","Inline":"Indicates whether the resource is defined within this CloudFormation template and impacts the create, update, and delete behavior of the stack. If the value is `true` , CloudFormation will create/update/delete the resource when creating/updating/deleting the stack. If the value is `false` , CloudFormation will validate that the object exists and then use it within the resource without making changes to the object.\\n\\nFor example, when creating `AWS::FraudDetector::EventType` you must define at least two variables. You can set `Inline=true` for these variables and CloudFormation will create/update/delete the variables as part of stack operations. However, if you set `Inline=false` , CloudFormation will associate the variables to your EventType but not execute any changes to the variables.","LastUpdatedTime":"Timestamp of when the label was last updated.","Name":"The label name.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::Label":{"attributes":{"Arn":"The ARN of the label.","CreatedTime":"Timestamp of when label was created.","LastUpdatedTime":"Timestamp of when label was last updated.","Ref":"`Ref` returns the primary identifier for the resource, which is the ARN.\\n\\nExample: `{\\"Ref\\": \\"arn:aws:frauddetector:us-west-2:123123123123:outcome/outcome_name\\"}`"},"description":"Creates or updates label. A label classifies an event as fraudulent or legitimate. Labels are associated with event types and used to train supervised machine learning models in Amazon Fraud Detector.","properties":{"Description":"The label description.","Name":"The label name.\\n\\nPattern: `^[0-9a-z_-]+$`","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::List":{"attributes":{"Arn":"The event type ARN.","CreatedTime":"Timestamp of when the list was created.","LastUpdatedTime":"Timestamp of when list was last updated.","Ref":"`Ref` returns the primary identifier for the resource, which is the Arn.\\n\\nExample: `{\\"Ref\\": \\"arn:aws:frauddetector:us-west-2:123123123123:outcome/outcome_name\\"}`"},"description":"Creates a list.\\n\\nList is a set of input data for a variable in your event dataset. You use the input data in a rule that\'s associated with your detector. For more information, see [Lists](https://docs.aws.amazon.com//frauddetector/latest/ug/lists.html) .","properties":{"Description":"The description of the list.","Elements":"The elements in the list.","Name":"The name of the list.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","VariableType":"The variable type of the list. For more information, see [Variable types](https://docs.aws.amazon.com/frauddetector/latest/ug/variables.html#variable-types)"}},"AWS::FraudDetector::Outcome":{"attributes":{"Arn":"The ARN of the outcome.","CreatedTime":"Timestamp of when outcome was created.","LastUpdatedTime":"Timestamp of when outcome was last updated.","Ref":"`Ref` returns the primary identifier for the resource, which is the ARN.\\n\\nExample: `{\\"Ref\\": \\"arn:aws:frauddetector:us-west-2:123123123123:outcome/outcome_name\\"}`"},"description":"Creates or updates an outcome.","properties":{"Description":"The outcome description.","Name":"The outcome name.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::FraudDetector::Variable":{"attributes":{"Arn":"The ARN of the variable.","CreatedTime":"Timestamp of when variable was created.","LastUpdatedTime":"Timestamp of when variable was last updated.","Ref":"`Ref` returns the primary identifier for the resource, which is the ARN.\\n\\nExample: `{ \\"Ref\\": \\"arn:aws:frauddetector:us-west-2:123123123123:outcome/outcome_name\\"}`"},"description":"Manages a variable.","properties":{"DataSource":"The data source of the variable.\\n\\nValid values: `EVENT | EXTERNAL_MODEL_SCORE`\\n\\nWhen defining a variable within a detector, you can only use the `EVENT` value for DataSource when the *Inline* property is set to true. If the *Inline* property is set false, you can use either `EVENT` or `MODEL_SCORE` for DataSource.","DataType":"The data type of the variable.\\n\\nValid data types: `STRING | INTEGER | BOOLEAN | FLOAT`","DefaultValue":"The default value of the variable.","Description":"The description of the variable.","Name":"The name of the variable.\\n\\nPattern: `^[0-9a-z_-]+$`","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","VariableType":"The type of the variable. For more information see [Variable types](https://docs.aws.amazon.com/frauddetector/latest/ug/create-a-variable.html#variable-types) .\\n\\nValid Values: `AUTH_CODE | AVS | BILLING_ADDRESS_L1 | BILLING_ADDRESS_L2 | BILLING_CITY | BILLING_COUNTRY | BILLING_NAME | BILLING_PHONE | BILLING_STATE | BILLING_ZIP | CARD_BIN | CATEGORICAL | CURRENCY_CODE | EMAIL_ADDRESS | FINGERPRINT | FRAUD_LABEL | FREE_FORM_TEXT | IP_ADDRESS | NUMERIC | ORDER_ID | PAYMENT_TYPE | PHONE_NUMBER | PRICE | PRODUCT_CATEGORY | SHIPPING_ADDRESS_L1 | SHIPPING_ADDRESS_L2 | SHIPPING_CITY | SHIPPING_COUNTRY | SHIPPING_NAME | SHIPPING_PHONE | SHIPPING_STATE | SHIPPING_ZIP | USERAGENT`"}},"AWS::GameLift::Alias":{"attributes":{"AliasId":"A unique identifier for the alias. For example, `arn:aws:gamelift:us-west-1::alias/alias-a1234567-b8c9-0d1e-2fa3-b45c6d7e8912`\\n\\nAlias IDs are unique within a Region.","Ref":"`Ref` returns the alias ID, such as `alias-1111aaaa-22bb-33cc-44dd-5555eeee66ff` ."},"description":"The `AWS::GameLift::Alias` resource creates an alias for an Amazon GameLift (GameLift) fleet destination. There are two types of routing strategies for aliases: simple and terminal. A simple alias points to an active fleet. A terminal alias displays a message instead of routing players to an active fleet. For example, a terminal alias might display a URL link that directs players to an upgrade site. You can use aliases to define destinations in a game session queue or when requesting new game sessions.","properties":{"Description":"A human-readable description of the alias.","Name":"A descriptive label that is associated with an alias. Alias names do not need to be unique.","RoutingStrategy":"The routing configuration, including routing type and fleet target, for the alias."}},"AWS::GameLift::Alias.RoutingStrategy":{"attributes":{},"description":"The routing configuration for a fleet alias.","properties":{"FleetId":"A unique identifier for a fleet that the alias points to. If you specify `SIMPLE` for the `Type` property, you must specify this property.","Message":"The message text to be used with a terminal routing strategy. If you specify `TERMINAL` for the `Type` property, you must specify this property.","Type":"A type of routing strategy.\\n\\nPossible routing types include the following:\\n\\n- *SIMPLE* - The alias resolves to one specific fleet. Use this type when routing to active fleets.\\n- *TERMINAL* - The alias does not resolve to a fleet but instead can be used to display a message to the user. A terminal alias throws a `TerminalRoutingStrategyException` with the message that you specified in the `Message` property."}},"AWS::GameLift::Build":{"attributes":{"BuildId":"","Ref":"`Ref` returns the build ID, such as `build-1111aaaa-22bb-33cc-44dd-5555eeee66ff` ."},"description":"The `AWS::GameLift::Build` resource creates a game server build that is installed and run on instances in an Amazon GameLift fleet. This resource points to an Amazon S3 location that contains a zip file with all of the components of the game server build.","properties":{"Name":"A descriptive label that is associated with a build. Build names do not need to be unique.","OperatingSystem":"The operating system that your game server binaries run on. This value determines the type of fleet resources that you use for this build. If your game build contains multiple executables, they all must run on the same operating system. You must specify a valid operating system in this request. There is no default value. You can\'t change a build\'s operating system later.\\n\\n> The Amazon Linux 2023 OS is not available in the China Regions. > Support is ending in 2023 for the Windows Server 2012 and Amazon Linux (AL1) operating systems. If you have active fleets using these operating systems, you can continue to create new builds using these until their end of support. All other users must use Windows Server 2016, Amazon Linux 2, or Amazon Linux 2023. For more information, including specific end-of-support dates, see the Amazon GameLift FAQs for [Windows Server](https://docs.aws.amazon.com/gamelift/faq/win2012/) and [Linux Server](https://docs.aws.amazon.com/gamelift/faq/al1/) .","ServerSdkVersion":"The Amazon GameLift Server SDK version used to develop your game server.","StorageLocation":"Information indicating where your game build files are stored. Use this parameter only when creating a build with files stored in an Amazon S3 bucket that you own. The storage location must specify an Amazon S3 bucket name and key. The location must also specify a role ARN that you set up to allow Amazon GameLift to access your Amazon S3 bucket. The S3 bucket and your new build must be in the same Region.\\n\\nIf a `StorageLocation` is specified, the size of your file can be found in your Amazon S3 bucket. Amazon GameLift will report a `SizeOnDisk` of 0.","Version":"Version information that is associated with this build. Version strings do not need to be unique."}},"AWS::GameLift::Build.StorageLocation":{"attributes":{},"description":"","properties":{"Bucket":"","Key":"","ObjectVersion":"","RoleArn":""}},"AWS::GameLift::Fleet":{"attributes":{"FleetId":"A unique identifier for the fleet.","Ref":"`Ref` returns the fleet ID, such as `fleet-1111aaaa-22bb-33cc-44dd-5555eeee66ff` ."},"description":"The `AWS::GameLift::Fleet` resource creates an Amazon GameLift (GameLift) fleet to host custom game server or Realtime Servers. A fleet is a set of EC2 instances, configured with instructions to run game servers on each instance.","properties":{"AnywhereConfiguration":"","BuildId":"A unique identifier for a build to be deployed on the new fleet. If you are deploying the fleet with a custom game build, you must specify this property. The build must have been successfully uploaded to Amazon GameLift and be in a `READY` status. This fleet setting cannot be changed once the fleet is created.","CertificateConfiguration":"Prompts Amazon GameLift to generate a TLS/SSL certificate for the fleet. Amazon GameLift uses the certificates to encrypt traffic between game clients and the game servers running on Amazon GameLift. By default, the `CertificateConfiguration` is `DISABLED` . You can\'t change this property after you create the fleet.\\n\\nAWS Certificate Manager (ACM) certificates expire after 13 months. Certificate expiration can cause fleets to fail, preventing players from connecting to instances in the fleet. We recommend you replace fleets before 13 months, consider using fleet aliases for a smooth transition.\\n\\n> ACM isn\'t available in all AWS regions. A fleet creation request with certificate generation enabled in an unsupported Region, fails with a 4xx error. For more information about the supported Regions, see [Supported Regions](https://docs.aws.amazon.com/acm/latest/userguide/acm-regions.html) in the *AWS Certificate Manager User Guide* .","ComputeType":"The type of compute resource used to host your game servers. You can use your own compute resources with Amazon GameLift Anywhere or use Amazon EC2 instances with managed Amazon GameLift.","Description":"A description for the fleet.","DesiredEC2Instances":"The number of EC2 instances that you want this fleet to host. When creating a new fleet, GameLift automatically sets this value to \\"1\\" and initiates a single instance. Once the fleet is active, update this value to trigger GameLift to add or remove instances from the fleet.","EC2InboundPermissions":"The allowed IP address ranges and port settings that allow inbound traffic to access game sessions on this fleet. If the fleet is hosting a custom game build, this property must be set before players can connect to game sessions. For Realtime Servers fleets, Amazon GameLift automatically sets TCP and UDP ranges.","EC2InstanceType":"The Amazon GameLift-supported Amazon EC2 instance type to use for all fleet instances. Instance type determines the computing resources that will be used to host your game servers, including CPU, memory, storage, and networking capacity. See [Amazon Elastic Compute Cloud Instance Types](https://docs.aws.amazon.com/ec2/instance-types/) for detailed descriptions of Amazon EC2 instance types.","FleetType":"Indicates whether to use On-Demand or Spot instances for this fleet. By default, this property is set to `ON_DEMAND` . Learn more about when to use [On-Demand versus Spot Instances](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-ec2-instances.html#gamelift-ec2-instances-spot) . This property cannot be changed after the fleet is created.","InstanceRoleARN":"A unique identifier for an IAM role that manages access to your AWS services. With an instance role ARN set, any application that runs on an instance in this fleet can assume the role, including install scripts, server processes, and daemons (background processes). Create a role or look up a role\'s ARN by using the [IAM dashboard](https://docs.aws.amazon.com/iam/) in the AWS Management Console . Learn more about using on-box credentials for your game servers at [Access external resources from a game server](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-server-resources.html) . This property cannot be changed after the fleet is created.","Locations":"A set of remote locations to deploy additional instances to and manage as part of the fleet. This parameter can only be used when creating fleets in AWS Regions that support multiple locations. You can add any Amazon GameLift-supported AWS Region as a remote location, in the form of an AWS Region code such as `us-west-2` . To create a fleet with instances in the home Region only, don\'t use this parameter.\\n\\nTo use this parameter, Amazon GameLift requires you to use your home location in the request.","MaxSize":"The maximum number of instances that are allowed in the specified fleet location. If this parameter is not set, the default is 1.","MetricGroups":"The name of an AWS CloudWatch metric group to add this fleet to. A metric group is used to aggregate the metrics for multiple fleets. You can specify an existing metric group name or set a new name to create a new metric group. A fleet can be included in only one metric group at a time.","MinSize":"The minimum number of instances that are allowed in the specified fleet location. If this parameter is not set, the default is 0.","Name":"A descriptive label that is associated with a fleet. Fleet names do not need to be unique.","NewGameSessionProtectionPolicy":"The status of termination protection for active game sessions on the fleet. By default, this property is set to `NoProtection` .\\n\\n- *NoProtection* - Game sessions can be terminated during active gameplay as a result of a scale-down event.\\n- *FullProtection* - Game sessions in `ACTIVE` status cannot be terminated during a scale-down event.","PeerVpcAwsAccountId":"Used when peering your Amazon GameLift fleet with a VPC, the unique identifier for the AWS account that owns the VPC. You can find your account ID in the AWS Management Console under account settings.","PeerVpcId":"A unique identifier for a VPC with resources to be accessed by your Amazon GameLift fleet. The VPC must be in the same Region as your fleet. To look up a VPC ID, use the [VPC Dashboard](https://docs.aws.amazon.com/vpc/) in the AWS Management Console . Learn more about VPC peering in [VPC Peering with Amazon GameLift Fleets](https://docs.aws.amazon.com/gamelift/latest/developerguide/vpc-peering.html) .","ResourceCreationLimitPolicy":"A policy that limits the number of game sessions that an individual player can create on instances in this fleet within a specified span of time.","RuntimeConfiguration":"Instructions for how to launch and maintain server processes on instances in the fleet. The runtime configuration defines one or more server process configurations, each identifying a build executable or Realtime script file and the number of processes of that type to run concurrently.\\n\\n> The `RuntimeConfiguration` parameter is required unless the fleet is being configured using the older parameters `ServerLaunchPath` and `ServerLaunchParameters` , which are still supported for backward compatibility.","ScriptId":"The unique identifier for a Realtime configuration script to be deployed on fleet instances. You can use either the script ID or ARN. Scripts must be uploaded to Amazon GameLift prior to creating the fleet. This fleet property cannot be changed later.\\n\\n> You can\'t use the `!Ref` command to reference a script created with a CloudFormation template for the fleet property `ScriptId` . Instead, use `Fn::GetAtt Script.Arn` or `Fn::GetAtt Script.Id` to retrieve either of these properties as input for `ScriptId` . Alternatively, enter a `ScriptId` string manually."}},"AWS::GameLift::Fleet.AnywhereConfiguration":{"attributes":{},"description":"Amazon GameLift Anywhere configuration options for your Anywhere fleets.","properties":{"Cost":"The cost to run your fleet per hour. Amazon GameLift uses the provided cost of your fleet to balance usage in queues. For more information about queues, see [Setting up queues](https://docs.aws.amazon.com/gamelift/latest/developerguide/queues-intro.html) in the *Amazon GameLift Developer Guide* ."}},"AWS::GameLift::Fleet.CertificateConfiguration":{"attributes":{},"description":"Determines whether a TLS/SSL certificate is generated for a fleet. This feature must be enabled when creating the fleet. All instances in a fleet share the same certificate. The certificate can be retrieved by calling the [GameLift Server SDK](https://docs.aws.amazon.com/gamelift/latest/developerguide/reference-serversdk.html) operation `GetInstanceCertificate` .","properties":{"CertificateType":"Indicates whether a TLS/SSL certificate is generated for a fleet.\\n\\nValid values include:\\n\\n- *GENERATED* - Generate a TLS/SSL certificate for this fleet.\\n- *DISABLED* - (default) Do not generate a TLS/SSL certificate for this fleet."}},"AWS::GameLift::Fleet.IpPermission":{"attributes":{},"description":"A range of IP addresses and port settings that allow inbound traffic to connect to server processes on an instance in a fleet. New game sessions are assigned an IP address/port number combination, which must fall into the fleet\'s allowed ranges. Fleets with custom game builds must have permissions explicitly set. For Realtime Servers fleets, GameLift automatically opens two port ranges, one for TCP messaging and one for UDP.","properties":{"FromPort":"A starting value for a range of allowed port numbers.\\n\\nFor fleets using Linux builds, only ports `22` and `1026-60000` are valid.\\n\\nFor fleets using Windows builds, only ports `1026-60000` are valid.","IpRange":"A range of allowed IP addresses. This value must be expressed in CIDR notation. Example: \\" `000.000.000.000/[subnet mask]` \\" or optionally the shortened version \\" `0.0.0.0/[subnet mask]` \\".","Protocol":"The network communication protocol used by the fleet.","ToPort":"An ending value for a range of allowed port numbers. Port numbers are end-inclusive. This value must be equal to or greater than `FromPort` .\\n\\nFor fleets using Linux builds, only ports `22` and `1026-60000` are valid.\\n\\nFor fleets using Windows builds, only ports `1026-60000` are valid."}},"AWS::GameLift::Fleet.LocationCapacity":{"attributes":{},"description":"Current resource capacity settings in a specified fleet or location. The location value might refer to a fleet\'s remote location or its home Region.\\n\\n*Related actions*\\n\\n[DescribeFleetCapacity](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeFleetCapacity.html) | [DescribeFleetLocationCapacity](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeFleetLocationCapacity.html) | [UpdateFleetCapacity](https://docs.aws.amazon.com/gamelift/latest/apireference/API_UpdateFleetCapacity.html)","properties":{"DesiredEC2Instances":"The number of Amazon EC2 instances you want to maintain in the specified fleet location. This value must fall between the minimum and maximum size limits.","MaxSize":"The maximum number of instances that are allowed in the specified fleet location. If this parameter is not set, the default is 1.","MinSize":"The minimum number of instances that are allowed in the specified fleet location. If this parameter is not set, the default is 0."}},"AWS::GameLift::Fleet.LocationConfiguration":{"attributes":{},"description":"A remote location where a multi-location fleet can deploy game servers for game hosting.","properties":{"Location":"An AWS Region code, such as `us-west-2` .","LocationCapacity":"Current resource capacity settings in a specified fleet or location. The location value might refer to a fleet\'s remote location or its home Region.\\n\\n*Related actions*\\n\\n[DescribeFleetCapacity](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeFleetCapacity.html) | [DescribeFleetLocationCapacity](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeFleetLocationCapacity.html) | [UpdateFleetCapacity](https://docs.aws.amazon.com/gamelift/latest/apireference/API_UpdateFleetCapacity.html)"}},"AWS::GameLift::Fleet.ResourceCreationLimitPolicy":{"attributes":{},"description":"A policy that limits the number of game sessions a player can create on the same fleet. This optional policy gives game owners control over how players can consume available game server resources. A resource creation policy makes the following statement: \\"An individual player can create a maximum number of new game sessions within a specified time period\\".\\n\\nThe policy is evaluated when a player tries to create a new game session. For example, assume you have a policy of 10 new game sessions and a time period of 60 minutes. On receiving a `CreateGameSession` request, Amazon GameLift checks that the player (identified by `CreatorId` ) has created fewer than 10 game sessions in the past 60 minutes.","properties":{"NewGameSessionsPerCreator":"A policy that puts limits on the number of game sessions that a player can create within a specified span of time. With this policy, you can control players\' ability to consume available resources.\\n\\nThe policy is evaluated when a player tries to create a new game session. On receiving a `CreateGameSession` request, Amazon GameLift checks that the player (identified by `CreatorId` ) has created fewer than game session limit in the specified time period.","PolicyPeriodInMinutes":"The time span used in evaluating the resource creation limit policy."}},"AWS::GameLift::Fleet.RuntimeConfiguration":{"attributes":{},"description":"A collection of server process configurations that describe the set of processes to run on each instance in a fleet. Server processes run either an executable in a custom game build or a Realtime Servers script. GameLift launches the configured processes, manages their life cycle, and replaces them as needed. Each instance checks regularly for an updated runtime configuration.\\n\\nA GameLift instance is limited to 50 processes running concurrently. To calculate the total number of processes in a runtime configuration, add the values of the `ConcurrentExecutions` parameter for each ServerProcess. Learn more about [Running Multiple Processes on a Fleet](https://docs.aws.amazon.com/gamelift/latest/developerguide/fleets-multiprocess.html) .","properties":{"GameSessionActivationTimeoutSeconds":"The maximum amount of time (in seconds) allowed to launch a new game session and have it report ready to host players. During this time, the game session is in status `ACTIVATING` . If the game session does not become active before the timeout, it is ended and the game session status is changed to `TERMINATED` .","MaxConcurrentGameSessionActivations":"The number of game sessions in status `ACTIVATING` to allow on an instance. This setting limits the instance resources that can be used for new game activations at any one time.","ServerProcesses":"A collection of server process configurations that identify what server processes to run on each instance in a fleet."}},"AWS::GameLift::Fleet.ServerProcess":{"attributes":{},"description":"A set of instructions for launching server processes on each instance in a fleet. Server processes run either an executable in a custom game build or a Realtime Servers script.","properties":{"ConcurrentExecutions":"The number of server processes using this configuration that run concurrently on each instance.","LaunchPath":"The location of a game build executable or the Realtime script file that contains the `Init()` function. Game builds and Realtime scripts are installed on instances at the root:\\n\\n- Windows (custom game builds only): `C:\\\\game` . Example: \\" `C:\\\\game\\\\MyGame\\\\server.exe` \\"\\n- Linux: `/local/game` . Examples: \\" `/local/game/MyGame/server.exe` \\" or \\" `/local/game/MyRealtimeScript.js` \\"","Parameters":"An optional list of parameters to pass to the server executable or Realtime script on launch."}},"AWS::GameLift::GameServerGroup":{"attributes":{"AutoScalingGroupArn":"A unique identifier for the auto scaling group.","GameServerGroupArn":"A unique identifier for the game server group.","Ref":""},"description":"*This operation is used with the Amazon GameLift FleetIQ solution and game server groups.*\\n\\nCreates a GameLift FleetIQ game server group for managing game hosting on a collection of Amazon EC2 instances for game hosting. This operation creates the game server group, creates an Auto Scaling group in your AWS account , and establishes a link between the two groups. You can view the status of your game server groups in the GameLift console. Game server group metrics and events are emitted to Amazon CloudWatch.\\n\\nBefore creating a new game server group, you must have the following:\\n\\n- An Amazon EC2 launch template that specifies how to launch Amazon EC2 instances with your game server build. For more information, see [Launching an Instance from a Launch Template](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) in the *Amazon EC2 User Guide* .\\n- An IAM role that extends limited access to your AWS account to allow GameLift FleetIQ to create and interact with the Auto Scaling group. For more information, see [Create IAM roles for cross-service interaction](https://docs.aws.amazon.com/gamelift/latest/fleetiqguide/gsg-iam-permissions-roles.html) in the *GameLift FleetIQ Developer Guide* .\\n\\nTo create a new game server group, specify a unique group name, IAM role and Amazon EC2 launch template, and provide a list of instance types that can be used in the group. You must also set initial maximum and minimum limits on the group\'s instance count. You can optionally set an Auto Scaling policy with target tracking based on a GameLift FleetIQ metric.\\n\\nOnce the game server group and corresponding Auto Scaling group are created, you have full access to change the Auto Scaling group\'s configuration as needed. Several properties that are set when creating a game server group, including maximum/minimum size and auto-scaling policy settings, must be updated directly in the Auto Scaling group. Keep in mind that some Auto Scaling group properties are periodically updated by GameLift FleetIQ as part of its balancing activities to optimize for availability and cost.\\n\\n*Learn more*\\n\\n[GameLift FleetIQ Guide](https://docs.aws.amazon.com/gamelift/latest/fleetiqguide/gsg-intro.html)","properties":{"AutoScalingPolicy":"Configuration settings to define a scaling policy for the Auto Scaling group that is optimized for game hosting. The scaling policy uses the metric `\\"PercentUtilizedGameServers\\"` to maintain a buffer of idle game servers that can immediately accommodate new games and players. After the Auto Scaling group is created, update this value directly in the Auto Scaling group using the AWS console or APIs.","BalancingStrategy":"Indicates how Amazon GameLift FleetIQ balances the use of Spot Instances and On-Demand Instances in the game server group. Method options include the following:\\n\\n- `SPOT_ONLY` - Only Spot Instances are used in the game server group. If Spot Instances are unavailable or not viable for game hosting, the game server group provides no hosting capacity until Spot Instances can again be used. Until then, no new instances are started, and the existing nonviable Spot Instances are terminated (after current gameplay ends) and are not replaced.\\n- `SPOT_PREFERRED` - (default value) Spot Instances are used whenever available in the game server group. If Spot Instances are unavailable, the game server group continues to provide hosting capacity by falling back to On-Demand Instances. Existing nonviable Spot Instances are terminated (after current gameplay ends) and are replaced with new On-Demand Instances.\\n- `ON_DEMAND_ONLY` - Only On-Demand Instances are used in the game server group. No Spot Instances are used, even when available, while this balancing strategy is in force.","DeleteOption":"The type of delete to perform. To delete a game server group, specify the `DeleteOption` . Options include the following:\\n\\n- `SAFE_DELETE` – (default) Terminates the game server group and Amazon EC2 Auto Scaling group only when it has no game servers that are in `UTILIZED` status.\\n- `FORCE_DELETE` – Terminates the game server group, including all active game servers regardless of their utilization status, and the Amazon EC2 Auto Scaling group.\\n- `RETAIN` – Does a safe delete of the game server group but retains the Amazon EC2 Auto Scaling group as is.","GameServerGroupName":"A developer-defined identifier for the game server group. The name is unique for each Region in each AWS account.","GameServerProtectionPolicy":"A flag that indicates whether instances in the game server group are protected from early termination. Unprotected instances that have active game servers running might be terminated during a scale-down event, causing players to be dropped from the game. Protected instances cannot be terminated while there are active game servers running except in the event of a forced game server group deletion (see ). An exception to this is with Spot Instances, which can be terminated by AWS regardless of protection status.","InstanceDefinitions":"The set of Amazon EC2 instance types that Amazon GameLift FleetIQ can use when balancing and automatically scaling instances in the corresponding Auto Scaling group.","LaunchTemplate":"The Amazon EC2 launch template that contains configuration settings and game server code to be deployed to all instances in the game server group. You can specify the template using either the template name or ID. For help with creating a launch template, see [Creating a Launch Template for an Auto Scaling Group](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html) in the *Amazon Elastic Compute Cloud Auto Scaling User Guide* . After the Auto Scaling group is created, update this value directly in the Auto Scaling group using the AWS console or APIs.\\n\\n> If you specify network interfaces in your launch template, you must explicitly set the property `AssociatePublicIpAddress` to \\"true\\". If no network interface is specified in the launch template, Amazon GameLift FleetIQ uses your account\'s default VPC.","MaxSize":"The maximum number of instances allowed in the Amazon EC2 Auto Scaling group. During automatic scaling events, Amazon GameLift FleetIQ and EC2 do not scale up the group above this maximum. After the Auto Scaling group is created, update this value directly in the Auto Scaling group using the AWS console or APIs.","MinSize":"The minimum number of instances allowed in the Amazon EC2 Auto Scaling group. During automatic scaling events, Amazon GameLift FleetIQ and Amazon EC2 do not scale down the group below this minimum. In production, this value should be set to at least 1. After the Auto Scaling group is created, update this value directly in the Auto Scaling group using the AWS console or APIs.","RoleArn":"The Amazon Resource Name ( [ARN](https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-arn-format.html) ) for an IAM role that allows Amazon GameLift to access your Amazon EC2 Auto Scaling groups.","Tags":"A list of labels to assign to the new game server group resource. Tags are developer-defined key-value pairs. Tagging AWS resources is useful for resource management, access management, and cost allocation. For more information, see [Tagging AWS Resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) in the *AWS General Reference* . Once the resource is created, you can use TagResource, UntagResource, and ListTagsForResource to add, remove, and view tags, respectively. The maximum tag limit may be lower than stated. See the AWS General Reference for actual tagging limits.","VpcSubnets":"A list of virtual private cloud (VPC) subnets to use with instances in the game server group. By default, all Amazon GameLift FleetIQ-supported Availability Zones are used. You can use this parameter to specify VPCs that you\'ve set up. This property cannot be updated after the game server group is created, and the corresponding Auto Scaling group will always use the property value that is set with this request, even if the Auto Scaling group is updated directly."}},"AWS::GameLift::GameServerGroup.AutoScalingPolicy":{"attributes":{},"description":"*This data type is used with the GameLift FleetIQ and game server groups.*\\n\\nConfiguration settings for intelligent automatic scaling that uses target tracking. After the Auto Scaling group is created, all updates to Auto Scaling policies, including changing this policy and adding or removing other policies, is done directly on the Auto Scaling group.","properties":{"EstimatedInstanceWarmup":"Length of time, in seconds, it takes for a new instance to start new game server processes and register with Amazon GameLift FleetIQ. Specifying a warm-up time can be useful, particularly with game servers that take a long time to start up, because it avoids prematurely starting new instances.","TargetTrackingConfiguration":"Settings for a target-based scaling policy applied to Auto Scaling group. These settings are used to create a target-based policy that tracks the GameLift FleetIQ metric `PercentUtilizedGameServers` and specifies a target value for the metric. As player usage changes, the policy triggers to adjust the game server group capacity so that the metric returns to the target value."}},"AWS::GameLift::GameServerGroup.InstanceDefinition":{"attributes":{},"description":"*This data type is used with the Amazon GameLift FleetIQ and game server groups.*\\n\\nAn allowed instance type for a `GameServerGroup` . All game server groups must have at least two instance types defined for it. GameLift FleetIQ periodically evaluates each defined instance type for viability. It then updates the Auto Scaling group with the list of viable instance types.","properties":{"InstanceType":"An Amazon EC2 instance type designation.","WeightedCapacity":"Instance weighting that indicates how much this instance type contributes to the total capacity of a game server group. Instance weights are used by Amazon GameLift FleetIQ to calculate the instance type\'s cost per unit hour and better identify the most cost-effective options. For detailed information on weighting instance capacity, see [Instance Weighting](https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-instance-weighting.html) in the *Amazon Elastic Compute Cloud Auto Scaling User Guide* . Default value is \\"1\\"."}},"AWS::GameLift::GameServerGroup.LaunchTemplate":{"attributes":{},"description":"*This data type is used with the GameLift FleetIQ and game server groups.*\\n\\nAn Amazon EC2 launch template that contains configuration settings and game server code to be deployed to all instances in a game server group. The launch template is specified when creating a new game server group with `GameServerGroup` .","properties":{"LaunchTemplateId":"A unique identifier for an existing Amazon EC2 launch template.","LaunchTemplateName":"A readable identifier for an existing Amazon EC2 launch template.","Version":"The version of the Amazon EC2 launch template to use. If no version is specified, the default version will be used. With Amazon EC2, you can specify a default version for a launch template. If none is set, the default is the first version created."}},"AWS::GameLift::GameServerGroup.TargetTrackingConfiguration":{"attributes":{},"description":"*This data type is used with the Amazon GameLift FleetIQ and game server groups.*\\n\\nSettings for a target-based scaling policy as part of a `GameServerGroupAutoScalingPolicy` . These settings are used to create a target-based policy that tracks the GameLift FleetIQ metric `\\"PercentUtilizedGameServers\\"` and specifies a target value for the metric. As player usage changes, the policy triggers to adjust the game server group capacity so that the metric returns to the target value.","properties":{"TargetValue":"Desired value to use with a game server group target-based scaling policy."}},"AWS::GameLift::GameSessionQueue":{"attributes":{"Arn":"The unique Amazon Resource Name (ARN) for the `GameSessionQueue` .","Name":"A descriptive label that is associated with a game session queue. Names are unique within each Region.","Ref":"`Ref` returns the name of the game session queue, which is unique within each Region."},"description":"The `AWS::GameLift::GameSessionQueue` resource creates a placement queue that processes requests for new game sessions. A queue uses FleetIQ algorithms to determine the best placement locations and find an available game server, then prompts the game server to start a new game session. Queues can have destinations (GameLift fleets or aliases), which determine where the queue can place new game sessions. A queue can have destinations with varied fleet type (Spot and On-Demand), instance type, and AWS Region .","properties":{"CustomEventData":"Information to be added to all events that are related to this game session queue.","Destinations":"A list of fleets and/or fleet aliases that can be used to fulfill game session placement requests in the queue. Destinations are identified by either a fleet ARN or a fleet alias ARN, and are listed in order of placement preference.","FilterConfiguration":"A list of locations where a queue is allowed to place new game sessions. Locations are specified in the form of AWS Region codes, such as `us-west-2` . If this parameter is not set, game sessions can be placed in any queue location.","Name":"A descriptive label that is associated with game session queue. Queue names must be unique within each Region.","NotificationTarget":"An SNS topic ARN that is set up to receive game session placement notifications. See [Setting up notifications for game session placement](https://docs.aws.amazon.com/gamelift/latest/developerguide/queue-notification.html) .","PlayerLatencyPolicies":"A set of policies that act as a sliding cap on player latency. FleetIQ works to deliver low latency for most players in a game session. These policies ensure that no individual player can be placed into a game with unreasonably high latency. Use multiple policies to gradually relax latency requirements a step at a time. Multiple policies are applied based on their maximum allowed latency, starting with the lowest value.","PriorityConfiguration":"Custom settings to use when prioritizing destinations and locations for game session placements. This configuration replaces the FleetIQ default prioritization process. Priority types that are not explicitly named will be automatically applied at the end of the prioritization process.","Tags":"A list of labels to assign to the new game session queue resource. Tags are developer-defined key-value pairs. Tagging AWS resources are useful for resource management, access management and cost allocation. For more information, see [Tagging AWS Resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) in the *AWS General Reference* . Once the resource is created, you can use TagResource, UntagResource, and ListTagsForResource to add, remove, and view tags. The maximum tag limit may be lower than stated. See the AWS General Reference for actual tagging limits.","TimeoutInSeconds":"The maximum time, in seconds, that a new game session placement request remains in the queue. When a request exceeds this time, the game session placement changes to a `TIMED_OUT` status. By default, this property is set to `600` ."}},"AWS::GameLift::GameSessionQueue.Destination":{"attributes":{},"description":"A fleet or alias designated in a game session queue. Queues fulfill requests for new game sessions by placing a new game session on any of the queue\'s destinations.","properties":{"DestinationArn":"The Amazon Resource Name (ARN) that is assigned to fleet or fleet alias. ARNs, which include a fleet ID or alias ID and a Region name, provide a unique identifier across all Regions."}},"AWS::GameLift::GameSessionQueue.FilterConfiguration":{"attributes":{},"description":"A list of fleet locations where a game session queue can place new game sessions. You can use a filter to temporarily turn off placements for specific locations. For queues that have multi-location fleets, you can use a filter configuration allow placement with some, but not all of these locations.","properties":{"AllowedLocations":"A list of locations to allow game session placement in, in the form of AWS Region codes such as `us-west-2` ."}},"AWS::GameLift::GameSessionQueue.PlayerLatencyPolicy":{"attributes":{},"description":"The queue setting that determines the highest latency allowed for individual players when placing a game session. When a latency policy is in force, a game session cannot be placed with any fleet in a Region where a player reports latency higher than the cap. Latency policies are only enforced when the placement request contains player latency information.","properties":{"MaximumIndividualPlayerLatencyMilliseconds":"The maximum latency value that is allowed for any player, in milliseconds. All policies must have a value set for this property.","PolicyDurationSeconds":"The length of time, in seconds, that the policy is enforced while placing a new game session. A null value for this property means that the policy is enforced until the queue times out."}},"AWS::GameLift::GameSessionQueue.PriorityConfiguration":{"attributes":{},"description":"Custom prioritization settings for use by a game session queue when placing new game sessions with available game servers. When defined, this configuration replaces the default FleetIQ prioritization process, which is as follows:\\n\\n- If player latency data is included in a game session request, destinations and locations are prioritized first based on lowest average latency (1), then on lowest hosting cost (2), then on destination list order (3), and finally on location (alphabetical) (4). This approach ensures that the queue\'s top priority is to place game sessions where average player latency is lowest, and--if latency is the same--where the hosting cost is less, etc.\\n- If player latency data is not included, destinations and locations are prioritized first on destination list order (1), and then on location (alphabetical) (2). This approach ensures that the queue\'s top priority is to place game sessions on the first destination fleet listed. If that fleet has multiple locations, the game session is placed on the first location (when listed alphabetically).\\n\\nChanging the priority order will affect how game sessions are placed.","properties":{"LocationOrder":"The prioritization order to use for fleet locations, when the `PriorityOrder` property includes `LOCATION` . Locations are identified by AWS Region codes such as `us-west-2` . Each location can only be listed once.","PriorityOrder":"The recommended sequence to use when prioritizing where to place new game sessions. Each type can only be listed once.\\n\\n- `LATENCY` -- FleetIQ prioritizes locations where the average player latency (provided in each game session request) is lowest.\\n- `COST` -- FleetIQ prioritizes destinations with the lowest current hosting costs. Cost is evaluated based on the location, instance type, and fleet type (Spot or On-Demand) for each destination in the queue.\\n- `DESTINATION` -- FleetIQ prioritizes based on the order that destinations are listed in the queue configuration.\\n- `LOCATION` -- FleetIQ prioritizes based on the provided order of locations, as defined in `LocationOrder` ."}},"AWS::GameLift::Location":{"attributes":{"LocationArn":"","Ref":""},"description":"Creates a custom location for use in an Anywhere fleet.","properties":{"LocationName":"The location\'s name.","Tags":""}},"AWS::GameLift::MatchmakingConfiguration":{"attributes":{"Arn":"The unique Amazon Resource Name (ARN) for the `MatchmakingConfiguration` .","Name":"The `MatchmakingConfiguration` name, which is unique.","Ref":"`Ref` returns the `MatchmakingConfiguration` name, which is unique."},"description":"The `AWS::GameLift::MatchmakingConfiguration` resource defines a new matchmaking configuration for use with FlexMatch. Whether you\'re using FlexMatch with GameLift hosting or as a standalone matchmaking service, the matchmaking configuration sets out rules for matching players and forming teams. If you\'re using GameLift hosting, it also defines how to start game sessions for each match. Your matchmaking system can use multiple configurations to handle different game scenarios. All matchmaking requests identify the matchmaking configuration to use and provide player attributes that are consistent with that configuration.","properties":{"AcceptanceRequired":"A flag that determines whether a match that was created with this configuration must be accepted by the matched players. To require acceptance, set to `TRUE` . With this option enabled, matchmaking tickets use the status `REQUIRES_ACCEPTANCE` to indicate when a completed potential match is waiting for player acceptance.","AcceptanceTimeoutSeconds":"The length of time (in seconds) to wait for players to accept a proposed match, if acceptance is required.","AdditionalPlayerCount":"The number of player slots in a match to keep open for future players. For example, if the configuration\'s rule set specifies a match for a single 10-person team, and the additional player count is set to 2, 10 players will be selected for the match and 2 more player slots will be open for future players. This parameter is not used if `FlexMatchMode` is set to `STANDALONE` .","BackfillMode":"The method used to backfill game sessions that are created with this matchmaking configuration. Specify `MANUAL` when your game manages backfill requests manually or does not use the match backfill feature. Specify `AUTOMATIC` to have GameLift create a `StartMatchBackfill` request whenever a game session has one or more open slots. Learn more about manual and automatic backfill in [Backfill Existing Games with FlexMatch](https://docs.aws.amazon.com/gamelift/latest/flexmatchguide/match-backfill.html) . Automatic backfill is not available when `FlexMatchMode` is set to `STANDALONE` .","CustomEventData":"Information to add to all events related to the matchmaking configuration.","Description":"A description for the matchmaking configuration.","FlexMatchMode":"Indicates whether this matchmaking configuration is being used with Amazon GameLift hosting or as a standalone matchmaking solution.\\n\\n- *STANDALONE* - FlexMatch forms matches and returns match information, including players and team assignments, in a [MatchmakingSucceeded](https://docs.aws.amazon.com/gamelift/latest/flexmatchguide/match-events.html#match-events-matchmakingsucceeded) event.\\n- *WITH_QUEUE* - FlexMatch forms matches and uses the specified Amazon GameLift queue to start a game session for the match.","GameProperties":"A set of custom properties for a game session, formatted as key-value pairs. These properties are passed to a game server process with a request to start a new game session. See [Start a Game Session](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-server-api.html#gamelift-sdk-server-startsession) . This parameter is not used if `FlexMatchMode` is set to `STANDALONE` .","GameSessionData":"A set of custom game session properties, formatted as a single string value. This data is passed to a game server process with a request to start a new game session. See [Start a Game Session](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-server-api.html#gamelift-sdk-server-startsession) . This parameter is not used if `FlexMatchMode` is set to `STANDALONE` .","GameSessionQueueArns":"The Amazon Resource Name ( [ARN](https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-arn-format.html) ) that is assigned to a Amazon GameLift game session queue resource and uniquely identifies it. ARNs are unique across all Regions. Format is `arn:aws:gamelift:::gamesessionqueue/` . Queues can be located in any Region. Queues are used to start new Amazon GameLift-hosted game sessions for matches that are created with this matchmaking configuration. If `FlexMatchMode` is set to `STANDALONE` , do not set this parameter.","Name":"A unique identifier for the matchmaking configuration. This name is used to identify the configuration associated with a matchmaking request or ticket.","NotificationTarget":"An SNS topic ARN that is set up to receive matchmaking notifications. See [Setting up notifications for matchmaking](https://docs.aws.amazon.com/gamelift/latest/flexmatchguide/match-notification.html) for more information.","RequestTimeoutSeconds":"The maximum duration, in seconds, that a matchmaking ticket can remain in process before timing out. Requests that fail due to timing out can be resubmitted as needed.","RuleSetName":"A unique identifier for the matchmaking rule set to use with this configuration. You can use either the rule set name or ARN value. A matchmaking configuration can only use rule sets that are defined in the same Region.","Tags":"A list of labels to assign to the new matchmaking configuration resource. Tags are developer-defined key-value pairs. Tagging AWS resources are useful for resource management, access management and cost allocation. For more information, see [Tagging AWS Resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) in the *AWS General Reference* . Once the resource is created, you can use TagResource, UntagResource, and ListTagsForResource to add, remove, and view tags. The maximum tag limit may be lower than stated. See the AWS General Reference for actual tagging limits."}},"AWS::GameLift::MatchmakingConfiguration.GameProperty":{"attributes":{},"description":"Set of key-value pairs that contain information about a game session. When included in a game session request, these properties communicate details to be used when setting up the new game session. For example, a game property might specify a game mode, level, or map. Game properties are passed to the game server process when initiating a new game session. For more information, see the [Amazon GameLift Developer Guide](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-client-api.html#gamelift-sdk-client-api-create) .","properties":{"Key":"The game property identifier.","Value":"The game property value."}},"AWS::GameLift::MatchmakingRuleSet":{"attributes":{"Arn":"The unique Amazon Resource Name (ARN) assigned to the rule set.","Name":"The unique name of the rule set.","Ref":"`Ref` returns the rule set name, which is unique within each Region."},"description":"Creates a new rule set for FlexMatch matchmaking. A rule set describes the type of match to create, such as the number and size of teams. It also sets the parameters for acceptable player matches, such as minimum skill level or character type.\\n\\nTo create a matchmaking rule set, provide unique rule set name and the rule set body in JSON format. Rule sets must be defined in the same Region as the matchmaking configuration they are used with.\\n\\nSince matchmaking rule sets cannot be edited, it is a good idea to check the rule set syntax.\\n\\n*Learn more*\\n\\n- [Build a rule set](https://docs.aws.amazon.com/gamelift/latest/flexmatchguide/match-rulesets.html)\\n- [Design a matchmaker](https://docs.aws.amazon.com/gamelift/latest/flexmatchguide/match-configuration.html)\\n- [Matchmaking with FlexMatch](https://docs.aws.amazon.com/gamelift/latest/flexmatchguide/match-intro.html)","properties":{"Name":"A unique identifier for the matchmaking rule set. A matchmaking configuration identifies the rule set it uses by this name value. Note that the rule set name is different from the optional `name` field in the rule set body.","RuleSetBody":"A collection of matchmaking rules, formatted as a JSON string. Comments are not allowed in JSON, but most elements support a description field.","Tags":"A list of labels to assign to the new matchmaking rule set resource. Tags are developer-defined key-value pairs. Tagging AWS resources are useful for resource management, access management and cost allocation. For more information, see [Tagging AWS Resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) in the *AWS General Reference* . Once the resource is created, you can use TagResource, UntagResource, and ListTagsForResource to add, remove, and view tags. The maximum tag limit may be lower than stated. See the AWS General Reference for actual tagging limits."}},"AWS::GameLift::Script":{"attributes":{"Arn":"The unique Amazon Resource Name (ARN) for the script.","Id":"A unique identifier for a Realtime script.","Ref":"`Ref` returns the `ScriptId` , such as `script-1111aaaa-22bb-33cc-44dd-5555eeee66ff` ."},"description":"The `AWS::GameLift::Script` resource creates a new script record for your Realtime Servers script. Realtime scripts are JavaScript that provide configuration settings and optional custom game logic for your game. The script is deployed when you create a Realtime Servers fleet to host your game sessions. Script logic is executed during an active game session.","properties":{"Name":"A descriptive label that is associated with a script. Script names do not need to be unique.","StorageLocation":"The location of the Amazon S3 bucket where a zipped file containing your Realtime scripts is stored. The storage location must specify the Amazon S3 bucket name, the zip file name (the \\"key\\"), and a role ARN that allows Amazon GameLift to access the Amazon S3 storage location. The S3 bucket must be in the same Region where you want to create a new script. By default, Amazon GameLift uploads the latest version of the zip file; if you have S3 object versioning turned on, you can use the `ObjectVersion` parameter to specify an earlier version.","Tags":"A list of labels to assign to the new script resource. Tags are developer-defined key-value pairs. Tagging AWS resources are useful for resource management, access management and cost allocation. For more information, see [Tagging AWS Resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) in the *AWS General Reference* . Once the resource is created, you can use TagResource, UntagResource, and ListTagsForResource to add, remove, and view tags. The maximum tag limit may be lower than stated. See the AWS General Reference for actual tagging limits.","Version":"The version that is associated with a build or script. Version strings do not need to be unique."}},"AWS::GameLift::Script.S3Location":{"attributes":{},"description":"The location in Amazon S3 where build or script files can be stored for access by Amazon GameLift.","properties":{"Bucket":"An Amazon S3 bucket identifier. Thename of the S3 bucket.\\n\\n> Amazon GameLift doesn\'t support uploading from Amazon S3 buckets with names that contain a dot (.).","Key":"The name of the zip file that contains the build files or script files.","ObjectVersion":"The version of the file, if object versioning is turned on for the bucket. Amazon GameLift uses this information when retrieving files from an S3 bucket that you own. Use this parameter to specify a specific version of the file. If not set, the latest version of the file is retrieved.","RoleArn":"The Amazon Resource Name ( [ARN](https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-arn-format.html) ) for an IAM role that allows Amazon GameLift to access the S3 bucket."}},"AWS::GlobalAccelerator::Accelerator":{"attributes":{"AcceleratorArn":"The ARN of the accelerator, such as `arn:aws:globalaccelerator::012345678901:accelerator/1234abcd-abcd-1234-abcd-1234abcdefgh` .","DnsName":"The Domain Name System (DNS) name that Global Accelerator creates that points to an accelerator\'s static IPv4 addresses.","DualStackDnsName":"The DNS name that Global Accelerator creates that points to a dual-stack accelerator\'s four static IP addresses: two IPv4 addresses and two IPv6 addresses.","Ipv4Addresses":"The array of IPv4 addresses in the IP address set. An IP address set can have a maximum of two IP addresses.","Ipv6Addresses":"The array of IPv6 addresses in the IP address set. An IP address set can have a maximum of two IP addresses.","Ref":"`Ref` returns the ARN of the accelerator, such as `arn:aws:globalaccelerator::012345678901:accelerator/1234abcd-abcd-1234-abcd-1234abcdefgh` ."},"description":"The `AWS::GlobalAccelerator::Accelerator` resource is a Global Accelerator resource type that contains information about how you create an accelerator. An accelerator includes one or more listeners that process inbound connections and direct traffic to one or more endpoint groups, each of which includes endpoints, such as Application Load Balancers, Network Load Balancers, and Amazon EC2 instances.","properties":{"Enabled":"Indicates whether the accelerator is enabled. The value is true or false. The default value is true.\\n\\nIf the value is set to true, the accelerator cannot be deleted. If set to false, accelerator can be deleted.","IpAddressType":"The IP address type that an accelerator supports. For a standard accelerator, the value can be IPV4 or DUAL_STACK.","IpAddresses":"Optionally, if you\'ve added your own IP address pool to Global Accelerator (BYOIP), you can choose IP addresses from your own pool to use for the accelerator\'s static IP addresses when you create an accelerator. You can specify one or two addresses, separated by a comma. Do not include the /32 suffix.\\n\\nOnly one IP address from each of your IP address ranges can be used for each accelerator. If you specify only one IP address from your IP address range, Global Accelerator assigns a second static IP address for the accelerator from the AWS IP address pool.\\n\\nNote that you can\'t update IP addresses for an existing accelerator. To change them, you must create a new accelerator with the new addresses.\\n\\nFor more information, see [Bring Your Own IP Addresses (BYOIP)](https://docs.aws.amazon.com/global-accelerator/latest/dg/using-byoip.html) in the *AWS Global Accelerator Developer Guide* .","Name":"The name of the accelerator. The name must contain only alphanumeric characters or hyphens (-), and must not begin or end with a hyphen.","Tags":"Create tags for an accelerator.\\n\\nFor more information, see [Tagging](https://docs.aws.amazon.com/global-accelerator/latest/dg/tagging-in-global-accelerator.html) in the *AWS Global Accelerator Developer Guide* ."}},"AWS::GlobalAccelerator::EndpointGroup":{"attributes":{"EndpointGroupArn":"The ARN of the endpoint group, such as `arn:aws:globalaccelerator::012345678901:accelerator/1234abcd-abcd-1234-abcd-1234abcdefgh/listener/0123vxyz/endpoint-group/098765zyxwvu` .","Ref":"`Ref` returns the ARN of the endpoint group, such as `arn:aws:globalaccelerator::012345678901:accelerator/1234abcd-abcd-1234-abcd-1234abcdefgh/listener/0123vxyz/endpoint-group/098765zyxwvu` ."},"description":"The `AWS::GlobalAccelerator::EndpointGroup` resource is a Global Accelerator resource type that contains information about how you create an endpoint group for the specified listener. An endpoint group is a collection of endpoints in one AWS Region .","properties":{"EndpointConfigurations":"The list of endpoint objects.","EndpointGroupRegion":"The AWS Regions where the endpoint group is located.","HealthCheckIntervalSeconds":"The time—10 seconds or 30 seconds—between health checks for each endpoint. The default value is 30.","HealthCheckPath":"If the protocol is HTTP/S, then this value provides the ping path that Global Accelerator uses for the destination on the endpoints for health checks. The default is slash (/).","HealthCheckPort":"The port that Global Accelerator uses to perform health checks on endpoints that are part of this endpoint group.\\n\\nThe default port is the port for the listener that this endpoint group is associated with. If the listener port is a list, Global Accelerator uses the first specified port in the list of ports.","HealthCheckProtocol":"The protocol that Global Accelerator uses to perform health checks on endpoints that are part of this endpoint group. The default value is TCP.","ListenerArn":"The Amazon Resource Name (ARN) of the listener.","PortOverrides":"Allows you to override the destination ports used to route traffic to an endpoint. Using a port override lets you map a list of external destination ports (that your users send traffic to) to a list of internal destination ports that you want an application endpoint to receive traffic on.","ThresholdCount":"The number of consecutive health checks required to set the state of a healthy endpoint to unhealthy, or to set an unhealthy endpoint to healthy. The default value is 3.","TrafficDialPercentage":"The percentage of traffic to send to an AWS Regions . Additional traffic is distributed to other endpoint groups for this listener.\\n\\nUse this action to increase (dial up) or decrease (dial down) traffic to a specific Region. The percentage is applied to the traffic that would otherwise have been routed to the Region based on optimal routing.\\n\\nThe default value is 100."}},"AWS::GlobalAccelerator::EndpointGroup.EndpointConfiguration":{"attributes":{},"description":"A complex type for endpoints. A resource must be valid and active when you add it as an endpoint.","properties":{"ClientIPPreservationEnabled":"Indicates whether client IP address preservation is enabled for an Application Load Balancer endpoint. The value is true or false. The default value is true for new accelerators.\\n\\nIf the value is set to true, the client\'s IP address is preserved in the `X-Forwarded-For` request header as traffic travels to applications on the Application Load Balancer endpoint fronted by the accelerator.\\n\\nFor more information, see [Preserve Client IP Addresses](https://docs.aws.amazon.com/global-accelerator/latest/dg/preserve-client-ip-address.html) in the *AWS Global Accelerator Developer Guide* .","EndpointId":"An ID for the endpoint. If the endpoint is a Network Load Balancer or Application Load Balancer, this is the Amazon Resource Name (ARN) of the resource. If the endpoint is an Elastic IP address, this is the Elastic IP address allocation ID. For Amazon EC2 instances, this is the EC2 instance ID. A resource must be valid and active when you add it as an endpoint.\\n\\nAn Application Load Balancer can be either internal or internet-facing.","Weight":"The weight associated with the endpoint. When you add weights to endpoints, you configure Global Accelerator to route traffic based on proportions that you specify. For example, you might specify endpoint weights of 4, 5, 5, and 6 (sum=20). The result is that 4/20 of your traffic, on average, is routed to the first endpoint, 5/20 is routed both to the second and third endpoints, and 6/20 is routed to the last endpoint. For more information, see [Endpoint Weights](https://docs.aws.amazon.com/global-accelerator/latest/dg/about-endpoints-endpoint-weights.html) in the *AWS Global Accelerator Developer Guide* ."}},"AWS::GlobalAccelerator::EndpointGroup.PortOverride":{"attributes":{},"description":"Override specific listener ports used to route traffic to endpoints that are part of an endpoint group. For example, you can create a port override in which the listener receives user traffic on ports 80 and 443, but your accelerator routes that traffic to ports 1080 and 1443, respectively, on the endpoints.\\n\\nFor more information, see [Port overrides](https://docs.aws.amazon.com/global-accelerator/latest/dg/about-endpoint-groups-port-override.html) in the *AWS Global Accelerator Developer Guide* .","properties":{"EndpointPort":"The endpoint port that you want a listener port to be mapped to. This is the port on the endpoint, such as the Application Load Balancer or Amazon EC2 instance.","ListenerPort":"The listener port that you want to map to a specific endpoint port. This is the port that user traffic arrives to the Global Accelerator on."}},"AWS::GlobalAccelerator::Listener":{"attributes":{"ListenerArn":"The ARN of the listener, such as `arn:aws:globalaccelerator::012345678901:accelerator/1234abcd-abcd-1234-abcd-1234abcdefgh/listener/0123vxyz` .","Ref":"`Ref` returns the ARN of the listener, such as `arn:aws:globalaccelerator::012345678901:accelerator/1234abcd-abcd-1234-abcd-1234abcdefgh/listener/0123vxyz` ."},"description":"The `AWS::GlobalAccelerator::Listener` resource is a Global Accelerator resource type that contains information about how you create a listener to process inbound connections from clients to an accelerator. Connections arrive to assigned static IP addresses on a port, port range, or list of port ranges that you specify.","properties":{"AcceleratorArn":"The Amazon Resource Name (ARN) of your accelerator.","ClientAffinity":"Client affinity lets you direct all requests from a user to the same endpoint, if you have stateful applications, regardless of the port and protocol of the client request. Client affinity gives you control over whether to always route each client to the same specific endpoint.\\n\\nAWS Global Accelerator uses a consistent-flow hashing algorithm to choose the optimal endpoint for a connection. If client affinity is `NONE` , Global Accelerator uses the \\"five-tuple\\" (5-tuple) properties—source IP address, source port, destination IP address, destination port, and protocol—to select the hash value, and then chooses the best endpoint. However, with this setting, if someone uses different ports to connect to Global Accelerator, their connections might not be always routed to the same endpoint because the hash value changes.\\n\\nIf you want a given client to always be routed to the same endpoint, set client affinity to `SOURCE_IP` instead. When you use the `SOURCE_IP` setting, Global Accelerator uses the \\"two-tuple\\" (2-tuple) properties— source (client) IP address and destination IP address—to select the hash value.\\n\\nThe default value is `NONE` .","PortRanges":"The list of port ranges for the connections from clients to the accelerator.","Protocol":"The protocol for the connections from clients to the accelerator."}},"AWS::GlobalAccelerator::Listener.PortRange":{"attributes":{},"description":"A complex type for a range of ports for a listener.","properties":{"FromPort":"The first port in the range of ports, inclusive.","ToPort":"The last port in the range of ports, inclusive."}},"AWS::Glue::Classifier":{"attributes":{"Ref":"`Ref` returns the classifier name."},"description":"The `AWS::Glue::Classifier` resource creates an AWS Glue classifier that categorizes data sources and specifies schemas. For more information, see [Adding Classifiers to a Crawler](https://docs.aws.amazon.com/glue/latest/dg/add-classifier.html) and [Classifier Structure](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-classifiers.html#aws-glue-api-crawler-classifiers-Classifier) in the *AWS Glue Developer Guide* .","properties":{"CsvClassifier":"A classifier for comma-separated values (CSV).","GrokClassifier":"A classifier that uses `grok` .","JsonClassifier":"A classifier for JSON content.","XMLClassifier":"A classifier for XML content."}},"AWS::Glue::Classifier.CsvClassifier":{"attributes":{},"description":"A classifier for custom `CSV` content.","properties":{"AllowSingleColumn":"Enables the processing of files that contain only one column.","ContainsHeader":"Indicates whether the CSV file contains a header.\\n\\nA value of `UNKNOWN` specifies that the classifier will detect whether the CSV file contains headings.\\n\\nA value of `PRESENT` specifies that the CSV file contains headings.\\n\\nA value of `ABSENT` specifies that the CSV file does not contain headings.","Delimiter":"A custom symbol to denote what separates each column entry in the row.","DisableValueTrimming":"Specifies not to trim values before identifying the type of column values. The default value is `true` .","Header":"A list of strings representing column names.","Name":"The name of the classifier.","QuoteSymbol":"A custom symbol to denote what combines content into a single column value. It must be different from the column delimiter."}},"AWS::Glue::Classifier.GrokClassifier":{"attributes":{},"description":"A classifier that uses `grok` patterns.","properties":{"Classification":"An identifier of the data format that the classifier matches, such as Twitter, JSON, Omniture logs, and so on.","CustomPatterns":"Optional custom grok patterns defined by this classifier. For more information, see custom patterns in [Writing Custom Classifiers](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html) .","GrokPattern":"The grok pattern applied to a data store by this classifier. For more information, see built-in patterns in [Writing Custom Classifiers](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html) .","Name":"The name of the classifier."}},"AWS::Glue::Classifier.JsonClassifier":{"attributes":{},"description":"A classifier for `JSON` content.","properties":{"JsonPath":"A `JsonPath` string defining the JSON data for the classifier to classify. AWS Glue supports a subset of `JsonPath` , as described in [Writing JsonPath Custom Classifiers](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#custom-classifier-json) .","Name":"The name of the classifier."}},"AWS::Glue::Classifier.XMLClassifier":{"attributes":{},"description":"A classifier for `XML` content.","properties":{"Classification":"An identifier of the data format that the classifier matches.","Name":"The name of the classifier.","RowTag":"The XML tag designating the element that contains each record in an XML document being parsed. This can\'t identify a self-closing element (closed by `/>` ). An empty row element that contains only attributes can be parsed as long as it ends with a closing tag (for example, `` is okay, but `` is not)."}},"AWS::Glue::Connection":{"attributes":{"Ref":"`Ref` returns the connection name."},"description":"The `AWS::Glue::Connection` resource specifies an AWS Glue connection to a data source. For more information, see [Adding a Connection to Your Data Store](https://docs.aws.amazon.com/glue/latest/dg/populate-add-connection.html) and [Connection Structure](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-connections.html#aws-glue-api-catalog-connections-Connection) in the *AWS Glue Developer Guide* .","properties":{"CatalogId":"The ID of the data catalog to create the catalog object in. Currently, this should be the AWS account ID.\\n\\n> To specify the account ID, you can use the `Ref` intrinsic function with the `AWS::AccountId` pseudo parameter. For example: `!Ref AWS::AccountId` .","ConnectionInput":"The connection that you want to create."}},"AWS::Glue::Connection.ConnectionInput":{"attributes":{},"description":"A structure that is used to specify a connection to create or update.","properties":{"ConnectionProperties":"These key-value pairs define parameters for the connection.","ConnectionType":"The type of the connection. Currently, these types are supported:\\n\\n- `JDBC` - Designates a connection to a database through Java Database Connectivity (JDBC).\\n\\n`JDBC` Connections use the following ConnectionParameters.\\n\\n- Required: All of ( `HOST` , `PORT` , `JDBC_ENGINE` ) or `JDBC_CONNECTION_URL` .\\n- Required: All of ( `USERNAME` , `PASSWORD` ) or `SECRET_ID` .\\n- Optional: `JDBC_ENFORCE_SSL` , `CUSTOM_JDBC_CERT` , `CUSTOM_JDBC_CERT_STRING` , `SKIP_CUSTOM_JDBC_CERT_VALIDATION` . These parameters are used to configure SSL with JDBC.\\n- `KAFKA` - Designates a connection to an Apache Kafka streaming platform.\\n\\n`KAFKA` Connections use the following ConnectionParameters.\\n\\n- Required: `KAFKA_BOOTSTRAP_SERVERS` .\\n- Optional: `KAFKA_SSL_ENABLED` , `KAFKA_CUSTOM_CERT` , `KAFKA_SKIP_CUSTOM_CERT_VALIDATION` . These parameters are used to configure SSL with `KAFKA` .\\n- Optional: `KAFKA_CLIENT_KEYSTORE` , `KAFKA_CLIENT_KEYSTORE_PASSWORD` , `KAFKA_CLIENT_KEY_PASSWORD` , `ENCRYPTED_KAFKA_CLIENT_KEYSTORE_PASSWORD` , `ENCRYPTED_KAFKA_CLIENT_KEY_PASSWORD` . These parameters are used to configure TLS client configuration with SSL in `KAFKA` .\\n- Optional: `KAFKA_SASL_MECHANISM` . Can be specified as `SCRAM-SHA-512` , `GSSAPI` , or `AWS_MSK_IAM` .\\n- Optional: `KAFKA_SASL_SCRAM_USERNAME` , `KAFKA_SASL_SCRAM_PASSWORD` , `ENCRYPTED_KAFKA_SASL_SCRAM_PASSWORD` . These parameters are used to configure SASL/SCRAM-SHA-512 authentication with `KAFKA` .\\n- Optional: `KAFKA_SASL_GSSAPI_KEYTAB` , `KAFKA_SASL_GSSAPI_KRB5_CONF` , `KAFKA_SASL_GSSAPI_SERVICE` , `KAFKA_SASL_GSSAPI_PRINCIPAL` . These parameters are used to configure SASL/GSSAPI authentication with `KAFKA` .\\n- `MONGODB` - Designates a connection to a MongoDB document database.\\n\\n`MONGODB` Connections use the following ConnectionParameters.\\n\\n- Required: `CONNECTION_URL` .\\n- Required: All of ( `USERNAME` , `PASSWORD` ) or `SECRET_ID` .\\n- `NETWORK` - Designates a network connection to a data source within an Amazon Virtual Private Cloud environment (Amazon VPC).\\n\\n`NETWORK` Connections do not require ConnectionParameters. Instead, provide a PhysicalConnectionRequirements.\\n- `MARKETPLACE` - Uses configuration settings contained in a connector purchased from AWS Marketplace to read from and write to data stores that are not natively supported by AWS Glue .\\n\\n`MARKETPLACE` Connections use the following ConnectionParameters.\\n\\n- Required: `CONNECTOR_TYPE` , `CONNECTOR_URL` , `CONNECTOR_CLASS_NAME` , `CONNECTION_URL` .\\n- Required for `JDBC` `CONNECTOR_TYPE` connections: All of ( `USERNAME` , `PASSWORD` ) or `SECRET_ID` .\\n- `CUSTOM` - Uses configuration settings contained in a custom connector to read from and write to data stores that are not natively supported by AWS Glue .\\n\\n`SFTP` is not supported.\\n\\nFor more information about how optional ConnectionProperties are used to configure features in AWS Glue , consult [AWS Glue connection properties](https://docs.aws.amazon.com/glue/latest/dg/connection-defining.html) .\\n\\nFor more information about how optional ConnectionProperties are used to configure features in AWS Glue Studio, consult [Using connectors and connections](https://docs.aws.amazon.com/glue/latest/ug/connectors-chapter.html) .","Description":"The description of the connection.","MatchCriteria":"A list of criteria that can be used in selecting this connection.","Name":"The name of the connection. Connection will not function as expected without a name.","PhysicalConnectionRequirements":"A map of physical connection requirements, such as virtual private cloud (VPC) and `SecurityGroup` , that are needed to successfully make this connection."}},"AWS::Glue::Connection.PhysicalConnectionRequirements":{"attributes":{},"description":"Specifies the physical requirements for a connection.","properties":{"AvailabilityZone":"The connection\'s Availability Zone. This field is redundant because the specified subnet implies the Availability Zone to be used. Currently the field must be populated, but it will be deprecated in the future.","SecurityGroupIdList":"The security group ID list used by the connection.","SubnetId":"The subnet ID used by the connection."}},"AWS::Glue::Crawler":{"attributes":{"Ref":"`Ref` returns the crawler name."},"description":"The `AWS::Glue::Crawler` resource specifies an AWS Glue crawler. For more information, see [Cataloging Tables with a Crawler](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html) and [Crawler Structure](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-crawling.html#aws-glue-api-crawler-crawling-Crawler) in the *AWS Glue Developer Guide* .","properties":{"Classifiers":"A list of UTF-8 strings that specify the names of custom classifiers that are associated with the crawler.","Configuration":"Crawler configuration information. This versioned JSON string allows users to specify aspects of a crawler\'s behavior. For more information, see [Configuring a Crawler](https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html) .","CrawlerSecurityConfiguration":"The name of the `SecurityConfiguration` structure to be used by this crawler.","DatabaseName":"The name of the database in which the crawler\'s output is stored.","Description":"A description of the crawler.","Name":"The name of the crawler.","RecrawlPolicy":"A policy that specifies whether to crawl the entire dataset again, or to crawl only folders that were added since the last crawler run.","Role":"The Amazon Resource Name (ARN) of an IAM role that\'s used to access customer resources, such as Amazon Simple Storage Service (Amazon S3) data.","Schedule":"For scheduled crawlers, the schedule when the crawler runs.","SchemaChangePolicy":"The policy that specifies update and delete behaviors for the crawler. The policy tells the crawler what to do in the event that it detects a change in a table that already exists in the customer\'s database at the time of the crawl. The `SchemaChangePolicy` does not affect whether or how new tables and partitions are added. New tables and partitions are always created regardless of the `SchemaChangePolicy` on a crawler.\\n\\nThe SchemaChangePolicy consists of two components, `UpdateBehavior` and `DeleteBehavior` .","TablePrefix":"The prefix added to the names of tables that are created.","Tags":"The tags to use with this crawler.","Targets":"A collection of targets to crawl."}},"AWS::Glue::Crawler.CatalogTarget":{"attributes":{},"description":"Specifies an AWS Glue Data Catalog target.","properties":{"ConnectionName":"The name of the connection for an Amazon S3-backed Data Catalog table to be a target of the crawl when using a `Catalog` connection type paired with a `NETWORK` Connection type.","DatabaseName":"The name of the database to be synchronized.","DlqEventQueueArn":"A valid Amazon dead-letter SQS ARN. For example, `arn:aws:sqs:region:account:deadLetterQueue` .","EventQueueArn":"A valid Amazon SQS ARN. For example, `arn:aws:sqs:region:account:sqs` .","Tables":"A list of the tables to be synchronized."}},"AWS::Glue::Crawler.DeltaTarget":{"attributes":{},"description":"Specifies a Delta data store to crawl one or more Delta tables.","properties":{"ConnectionName":"The name of the connection to use to connect to the Delta table target.","CreateNativeDeltaTable":"Specifies whether the crawler will create native tables, to allow integration with query engines that support querying of the Delta transaction log directly.","DeltaTables":"A list of the Amazon S3 paths to the Delta tables.","WriteManifest":"Specifies whether to write the manifest files to the Delta table path."}},"AWS::Glue::Crawler.DynamoDBTarget":{"attributes":{},"description":"Specifies an Amazon DynamoDB table to crawl.","properties":{"Path":"The name of the DynamoDB table to crawl."}},"AWS::Glue::Crawler.JdbcTarget":{"attributes":{},"description":"Specifies a JDBC data store to crawl.","properties":{"ConnectionName":"The name of the connection to use to connect to the JDBC target.","Exclusions":"A list of glob patterns used to exclude from the crawl. For more information, see [Catalog Tables with a Crawler](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html) .","Path":"The path of the JDBC target."}},"AWS::Glue::Crawler.MongoDBTarget":{"attributes":{},"description":"Specifies an Amazon DocumentDB or MongoDB data store to crawl.","properties":{"ConnectionName":"The name of the connection to use to connect to the Amazon DocumentDB or MongoDB target.","Path":"The path of the Amazon DocumentDB or MongoDB target (database/collection)."}},"AWS::Glue::Crawler.RecrawlPolicy":{"attributes":{},"description":"When crawling an Amazon S3 data source after the first crawl is complete, specifies whether to crawl the entire dataset again or to crawl only folders that were added since the last crawler run. For more information, see [Incremental Crawls in AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/incremental-crawls.html) in the developer guide.","properties":{"RecrawlBehavior":"Specifies whether to crawl the entire dataset again or to crawl only folders that were added since the last crawler run.\\n\\nA value of `CRAWL_EVERYTHING` specifies crawling the entire dataset again.\\n\\nA value of `CRAWL_NEW_FOLDERS_ONLY` specifies crawling only folders that were added since the last crawler run.\\n\\nA value of `CRAWL_EVENT_MODE` specifies crawling only the changes identified by Amazon S3 events."}},"AWS::Glue::Crawler.S3Target":{"attributes":{},"description":"Specifies a data store in Amazon Simple Storage Service (Amazon S3).","properties":{"ConnectionName":"The name of a connection which allows a job or crawler to access data in Amazon S3 within an Amazon Virtual Private Cloud environment (Amazon VPC).","DlqEventQueueArn":"A valid Amazon dead-letter SQS ARN. For example, `arn:aws:sqs:region:account:deadLetterQueue` .","EventQueueArn":"A valid Amazon SQS ARN. For example, `arn:aws:sqs:region:account:sqs` .","Exclusions":"A list of glob patterns used to exclude from the crawl. For more information, see [Catalog Tables with a Crawler](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html) .","Path":"The path to the Amazon S3 target.","SampleSize":"Sets the number of files in each leaf folder to be crawled when crawling sample files in a dataset. If not set, all the files are crawled. A valid value is an integer between 1 and 249."}},"AWS::Glue::Crawler.Schedule":{"attributes":{},"description":"A scheduling object using a `cron` statement to schedule an event.","properties":{"ScheduleExpression":"A `cron` expression used to specify the schedule. For more information, see [Time-Based Schedules for Jobs and Crawlers](https://docs.aws.amazon.com/glue/latest/dg/monitor-data-warehouse-schedule.html) . For example, to run something every day at 12:15 UTC, specify `cron(15 12 * * ? *)` ."}},"AWS::Glue::Crawler.SchemaChangePolicy":{"attributes":{},"description":"The policy that specifies update and delete behaviors for the crawler. The policy tells the crawler what to do in the event that it detects a change in a table that already exists in the customer\'s database at the time of the crawl. The `SchemaChangePolicy` does not affect whether or how new tables and partitions are added. New tables and partitions are always created regardless of the `SchemaChangePolicy` on a crawler.\\n\\nThe SchemaChangePolicy consists of two components, `UpdateBehavior` and `DeleteBehavior` .","properties":{"DeleteBehavior":"The deletion behavior when the crawler finds a deleted object.\\n\\nA value of `LOG` specifies that if a table or partition is found to no longer exist, do not delete it, only log that it was found to no longer exist.\\n\\nA value of `DELETE_FROM_DATABASE` specifies that if a table or partition is found to have been removed, delete it from the database.\\n\\nA value of `DEPRECATE_IN_DATABASE` specifies that if a table has been found to no longer exist, to add a property to the table that says \\"DEPRECATED\\" and includes a timestamp with the time of deprecation.","UpdateBehavior":"The update behavior when the crawler finds a changed schema.\\n\\nA value of `LOG` specifies that if a table or a partition already exists, and a change is detected, do not update it, only log that a change was detected. Add new tables and new partitions (including on existing tables).\\n\\nA value of `UPDATE_IN_DATABASE` specifies that if a table or partition already exists, and a change is detected, update it. Add new tables and partitions."}},"AWS::Glue::Crawler.Targets":{"attributes":{},"description":"Specifies data stores to crawl.","properties":{"CatalogTargets":"Specifies AWS Glue Data Catalog targets.","DeltaTargets":"Specifies an array of Delta data store targets.","DynamoDBTargets":"Specifies Amazon DynamoDB targets.","JdbcTargets":"Specifies JDBC targets.","MongoDBTargets":"A list of Mongo DB targets.","S3Targets":"Specifies Amazon Simple Storage Service (Amazon S3) targets."}},"AWS::Glue::DataCatalogEncryptionSettings":{"attributes":{"Ref":""},"description":"Sets the security configuration for a specified catalog. After the configuration has been set, the specified encryption is applied to every catalog write thereafter.","properties":{"CatalogId":"The ID of the Data Catalog in which the settings are created.","DataCatalogEncryptionSettings":"Contains configuration information for maintaining Data Catalog security."}},"AWS::Glue::DataCatalogEncryptionSettings.ConnectionPasswordEncryption":{"attributes":{},"description":"The data structure used by the Data Catalog to encrypt the password as part of `CreateConnection` or `UpdateConnection` and store it in the `ENCRYPTED_PASSWORD` field in the connection properties. You can enable catalog encryption or only password encryption.\\n\\nWhen a `CreationConnection` request arrives containing a password, the Data Catalog first encrypts the password using your AWS KMS key. It then encrypts the whole connection object again if catalog encryption is also enabled.\\n\\nThis encryption requires that you set AWS KMS key permissions to enable or restrict access on the password key according to your security requirements. For example, you might want only administrators to have decrypt permission on the password key.","properties":{"KmsKeyId":"An AWS KMS key that is used to encrypt the connection password.\\n\\nIf connection password protection is enabled, the caller of `CreateConnection` and `UpdateConnection` needs at least `kms:Encrypt` permission on the specified AWS KMS key, to encrypt passwords before storing them in the Data Catalog. You can set the decrypt permission to enable or restrict access on the password key according to your security requirements.","ReturnConnectionPasswordEncrypted":"When the `ReturnConnectionPasswordEncrypted` flag is set to \\"true\\", passwords remain encrypted in the responses of `GetConnection` and `GetConnections` . This encryption takes effect independently from catalog encryption."}},"AWS::Glue::DataCatalogEncryptionSettings.DataCatalogEncryptionSettings":{"attributes":{},"description":"Contains configuration information for maintaining Data Catalog security.","properties":{"ConnectionPasswordEncryption":"When connection password protection is enabled, the Data Catalog uses a customer-provided key to encrypt the password as part of `CreateConnection` or `UpdateConnection` and store it in the `ENCRYPTED_PASSWORD` field in the connection properties. You can enable catalog encryption or only password encryption.","EncryptionAtRest":"Specifies the encryption-at-rest configuration for the Data Catalog."}},"AWS::Glue::DataCatalogEncryptionSettings.EncryptionAtRest":{"attributes":{},"description":"Specifies the encryption-at-rest configuration for the Data Catalog.","properties":{"CatalogEncryptionMode":"The encryption-at-rest mode for encrypting Data Catalog data.","SseAwsKmsKeyId":"The ID of the AWS KMS key to use for encryption at rest."}},"AWS::Glue::DataQualityRuleset":{"attributes":{"Ref":""},"description":"The `AWS::Glue::DataQualityRuleset` resource specifies a data quality ruleset with DQDL rules applied to a specified AWS Glue table. For more information, see AWS Glue Data Quality in the AWS Glue Developer Guide.","properties":{"ClientToken":"Used for idempotency and is recommended to be set to a random ID (such as a UUID) to avoid creating or starting multiple instances of the same resource.","Description":"A description of the data quality ruleset.","Name":"The name of the data quality ruleset.","Ruleset":"A Data Quality Definition Language (DQDL) ruleset. For more information see the AWS Glue Developer Guide.","Tags":"A list of tags applied to the data quality ruleset.","TargetTable":"An object representing an AWS Glue table."}},"AWS::Glue::DataQualityRuleset.DataQualityTargetTable":{"attributes":{},"description":"An object representing an AWS Glue table.","properties":{"DatabaseName":"The name of the database where the AWS Glue table exists.","TableName":"The name of the AWS Glue table."}},"AWS::Glue::Database":{"attributes":{"Ref":"`Ref` returns the database name."},"description":"The `AWS::Glue::Database` resource specifies a logical grouping of tables in AWS Glue . For more information, see [Defining a Database in Your Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/define-database.html) and [Database Structure](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-databases.html#aws-glue-api-catalog-databases-Database) in the *AWS Glue Developer Guide* .","properties":{"CatalogId":"The AWS account ID for the account in which to create the catalog object.\\n\\n> To specify the account ID, you can use the `Ref` intrinsic function with the `AWS::AccountId` pseudo parameter. For example: `!Ref AWS::AccountId`","DatabaseInput":"The metadata for the database."}},"AWS::Glue::Database.DataLakePrincipal":{"attributes":{},"description":"The AWS Lake Formation principal.","properties":{"DataLakePrincipalIdentifier":"An identifier for the AWS Lake Formation principal."}},"AWS::Glue::Database.DatabaseIdentifier":{"attributes":{},"description":"A structure that describes a target database for resource linking.","properties":{"CatalogId":"The ID of the Data Catalog in which the database resides.","DatabaseName":"The name of the catalog database."}},"AWS::Glue::Database.DatabaseInput":{"attributes":{},"description":"The structure used to create or update a database.","properties":{"CreateTableDefaultPermissions":"Creates a set of default permissions on the table for principals. Used by AWS Lake Formation . Not used in the normal course of AWS Glue operations.","Description":"A description of the database.","FederatedDatabase":"A `FederatedDatabase` structure that references an entity outside the AWS Glue Data Catalog .","LocationUri":"The location of the database (for example, an HDFS path).","Name":"The name of the database. For Hive compatibility, this is folded to lowercase when it is stored.","Parameters":"These key-value pairs define parameters and properties of the database.","TargetDatabase":"A `DatabaseIdentifier` structure that describes a target database for resource linking."}},"AWS::Glue::Database.FederatedDatabase":{"attributes":{},"description":"A `FederatedDatabase` structure that references an entity outside the AWS Glue Data Catalog .","properties":{"ConnectionName":"The name of the connection to the external metastore.","Identifier":"A unique identifier for the federated database."}},"AWS::Glue::Database.PrincipalPrivileges":{"attributes":{},"description":"the permissions granted to a principal","properties":{"Permissions":"The permissions that are granted to the principal.","Principal":"The principal who is granted permissions."}},"AWS::Glue::DevEndpoint":{"attributes":{"Ref":"`Ref` returns the endpoint name."},"description":"The `AWS::Glue::DevEndpoint` resource specifies a development endpoint where a developer can remotely debug ETL scripts for AWS Glue . For more information, see [DevEndpoint Structure](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-dev-endpoint.html#aws-glue-api-jobs-dev-endpoint-DevEndpoint) in the AWS Glue Developer Guide.","properties":{"Arguments":"A map of arguments used to configure the `DevEndpoint` .\\n\\nValid arguments are:\\n\\n- `\\"--enable-glue-datacatalog\\": \\"\\"`\\n- `\\"GLUE_PYTHON_VERSION\\": \\"3\\"`\\n- `\\"GLUE_PYTHON_VERSION\\": \\"2\\"`\\n\\nYou can specify a version of Python support for development endpoints by using the `Arguments` parameter in the `CreateDevEndpoint` or `UpdateDevEndpoint` APIs. If no arguments are provided, the version defaults to Python 2.","EndpointName":"The name of the `DevEndpoint` .","ExtraJarsS3Path":"The path to one or more Java `.jar` files in an S3 bucket that should be loaded in your `DevEndpoint` .\\n\\n> You can only use pure Java/Scala libraries with a `DevEndpoint` .","ExtraPythonLibsS3Path":"The paths to one or more Python libraries in an Amazon S3 bucket that should be loaded in your `DevEndpoint` . Multiple values must be complete paths separated by a comma.\\n\\n> You can only use pure Python libraries with a `DevEndpoint` . Libraries that rely on C extensions, such as the [pandas](https://docs.aws.amazon.com/http://pandas.pydata.org/) Python data analysis library, are not currently supported.","GlueVersion":"The AWS Glue version determines the versions of Apache Spark and Python that AWS Glue supports. The Python version indicates the version supported for running your ETL scripts on development endpoints.\\n\\nFor more information about the available AWS Glue versions and corresponding Spark and Python versions, see [Glue version](https://docs.aws.amazon.com/glue/latest/dg/add-job.html) in the developer guide.\\n\\nDevelopment endpoints that are created without specifying a Glue version default to Glue 0.9.\\n\\nYou can specify a version of Python support for development endpoints by using the `Arguments` parameter in the `CreateDevEndpoint` or `UpdateDevEndpoint` APIs. If no arguments are provided, the version defaults to Python 2.","NumberOfNodes":"The number of AWS Glue Data Processing Units (DPUs) allocated to this `DevEndpoint` .","NumberOfWorkers":"The number of workers of a defined `workerType` that are allocated to the development endpoint.\\n\\nThe maximum number of workers you can define are 299 for `G.1X` , and 149 for `G.2X` .","PublicKey":"The public key to be used by this `DevEndpoint` for authentication. This attribute is provided for backward compatibility because the recommended attribute to use is public keys.","PublicKeys":"A list of public keys to be used by the `DevEndpoints` for authentication. Using this attribute is preferred over a single public key because the public keys allow you to have a different private key per client.\\n\\n> If you previously created an endpoint with a public key, you must remove that key to be able to set a list of public keys. Call the `UpdateDevEndpoint` API operation with the public key content in the `deletePublicKeys` attribute, and the list of new keys in the `addPublicKeys` attribute.","RoleArn":"The Amazon Resource Name (ARN) of the IAM role used in this `DevEndpoint` .","SecurityConfiguration":"The name of the `SecurityConfiguration` structure to be used with this `DevEndpoint` .","SecurityGroupIds":"A list of security group identifiers used in this `DevEndpoint` .","SubnetId":"The subnet ID for this `DevEndpoint` .","Tags":"The tags to use with this DevEndpoint.","WorkerType":"The type of predefined worker that is allocated to the development endpoint. Accepts a value of Standard, G.1X, or G.2X.\\n\\n- For the `Standard` worker type, each worker provides 4 vCPU, 16 GB of memory and a 50GB disk, and 2 executors per worker.\\n- For the `G.1X` worker type, each worker maps to 1 DPU (4 vCPU, 16 GB of memory, 64 GB disk), and provides 1 executor per worker. We recommend this worker type for memory-intensive jobs.\\n- For the `G.2X` worker type, each worker maps to 2 DPU (8 vCPU, 32 GB of memory, 128 GB disk), and provides 1 executor per worker. We recommend this worker type for memory-intensive jobs.\\n\\nKnown issue: when a development endpoint is created with the `G.2X` `WorkerType` configuration, the Spark drivers for the development endpoint will run on 4 vCPU, 16 GB of memory, and a 64 GB disk."}},"AWS::Glue::Job":{"attributes":{"Ref":"`Ref` returns the job name."},"description":"The `AWS::Glue::Job` resource specifies an AWS Glue job in the data catalog. For more information, see [Adding Jobs in AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/add-job.html) and [Job Structure](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-Job) in the *AWS Glue Developer Guide.*","properties":{"AllocatedCapacity":"This parameter is no longer supported. Use `MaxCapacity` instead.\\n\\nThe number of capacity units that are allocated to this job.","Command":"The code that executes a job.","Connections":"The connections used for this job.","DefaultArguments":"The default arguments for this job, specified as name-value pairs.\\n\\nYou can specify arguments here that your own job-execution script consumes, in addition to arguments that AWS Glue itself consumes.\\n\\nFor information about how to specify and consume your own job arguments, see [Calling AWS Glue APIs in Python](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-calling.html) in the *AWS Glue Developer Guide* .\\n\\nFor information about the key-value pairs that AWS Glue consumes to set up your job, see [Special Parameters Used by AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html) in the *AWS Glue Developer Guide* .","Description":"A description of the job.","ExecutionClass":"Indicates whether the job is run with a standard or flexible execution class. The standard execution class is ideal for time-sensitive workloads that require fast job startup and dedicated resources.\\n\\nThe flexible execution class is appropriate for time-insensitive jobs whose start and completion times may vary.\\n\\nOnly jobs with AWS Glue version 3.0 and above and command type `glueetl` will be allowed to set `ExecutionClass` to `FLEX` . The flexible execution class is available for Spark jobs.","ExecutionProperty":"The maximum number of concurrent runs that are allowed for this job.","GlueVersion":"Glue version determines the versions of Apache Spark and Python that AWS Glue supports. The Python version indicates the version supported for jobs of type Spark.\\n\\nFor more information about the available AWS Glue versions and corresponding Spark and Python versions, see [Glue version](https://docs.aws.amazon.com/glue/latest/dg/add-job.html) in the developer guide.\\n\\nJobs that are created without specifying a Glue version default to Glue 0.9.","LogUri":"This field is reserved for future use.","MaxCapacity":"The number of AWS Glue data processing units (DPUs) that can be allocated when this job runs. A DPU is a relative measure of processing power that consists of 4 vCPUs of compute capacity and 16 GB of memory.\\n\\nDo not set `Max Capacity` if using `WorkerType` and `NumberOfWorkers` .\\n\\nThe value that can be allocated for `MaxCapacity` depends on whether you are running a Python shell job or an Apache Spark ETL job:\\n\\n- When you specify a Python shell job ( `JobCommand.Name` =\\"pythonshell\\"), you can allocate either 0.0625 or 1 DPU. The default is 0.0625 DPU.\\n- When you specify an Apache Spark ETL job ( `JobCommand.Name` =\\"glueetl\\"), you can allocate from 2 to 100 DPUs. The default is 10 DPUs. This job type cannot have a fractional DPU allocation.","MaxRetries":"The maximum number of times to retry this job after a JobRun fails.","Name":"The name you assign to this job definition.","NonOverridableArguments":"Non-overridable arguments for this job, specified as name-value pairs.","NotificationProperty":"Specifies configuration properties of a notification.","NumberOfWorkers":"The number of workers of a defined `workerType` that are allocated when a job runs.\\n\\nThe maximum number of workers you can define are 299 for `G.1X` , and 149 for `G.2X` .","Role":"The name or Amazon Resource Name (ARN) of the IAM role associated with this job.","SecurityConfiguration":"The name of the `SecurityConfiguration` structure to be used with this job.","Tags":"The tags to use with this job.","Timeout":"The job timeout in minutes. This is the maximum time that a job run can consume resources before it is terminated and enters TIMEOUT status. The default is 2,880 minutes (48 hours).","WorkerType":"The type of predefined worker that is allocated when a job runs. Accepts a value of G.1X, G.2X, G.4X, G.8X or G.025X for Spark jobs. Accepts the value Z.2X for Ray jobs.\\n\\n- For the `G.1X` worker type, each worker maps to 1 DPU (4 vCPUs, 16 GB of memory) with 84GB disk (approximately 34GB free), and provides 1 executor per worker. We recommend this worker type for workloads such as data transforms, joins, and queries, to offers a scalable and cost effective way to run most jobs.\\n- For the `G.2X` worker type, each worker maps to 2 DPU (8 vCPUs, 32 GB of memory) with 128GB disk (approximately 77GB free), and provides 1 executor per worker. We recommend this worker type for workloads such as data transforms, joins, and queries, to offers a scalable and cost effective way to run most jobs.\\n- For the `G.4X` worker type, each worker maps to 4 DPU (16 vCPUs, 64 GB of memory) with 256GB disk (approximately 235GB free), and provides 1 executor per worker. We recommend this worker type for jobs whose workloads contain your most demanding transforms, aggregations, joins, and queries. This worker type is available only for AWS Glue version 3.0 or later Spark ETL jobs in the following AWS Regions: US East (Ohio), US East (N. Virginia), US West (Oregon), Asia Pacific (Singapore), Asia Pacific (Sydney), Asia Pacific (Tokyo), Canada (Central), Europe (Frankfurt), Europe (Ireland), and Europe (Stockholm).\\n- For the `G.8X` worker type, each worker maps to 8 DPU (32 vCPUs, 128 GB of memory) with 512GB disk (approximately 487GB free), and provides 1 executor per worker. We recommend this worker type for jobs whose workloads contain your most demanding transforms, aggregations, joins, and queries. This worker type is available only for AWS Glue version 3.0 or later Spark ETL jobs, in the same AWS Regions as supported for the `G.4X` worker type.\\n- For the `G.025X` worker type, each worker maps to 0.25 DPU (2 vCPUs, 4 GB of memory) with 84GB disk (approximately 34GB free), and provides 1 executor per worker. We recommend this worker type for low volume streaming jobs. This worker type is only available for AWS Glue version 3.0 streaming jobs.\\n- For the `Z.2X` worker type, each worker maps to 2 M-DPU (8vCPUs, 64 GB of memory) with 128 GB disk (approximately 120GB free), and provides up to 8 Ray workers based on the autoscaler."}},"AWS::Glue::Job.ConnectionsList":{"attributes":{},"description":"Specifies the connections used by a job.","properties":{"Connections":"A list of connections used by the job."}},"AWS::Glue::Job.ExecutionProperty":{"attributes":{},"description":"An execution property of a job.","properties":{"MaxConcurrentRuns":"The maximum number of concurrent runs allowed for the job. The default is 1. An error is returned when this threshold is reached. The maximum value you can specify is controlled by a service limit."}},"AWS::Glue::Job.JobCommand":{"attributes":{},"description":"Specifies code executed when a job is run.","properties":{"Name":"The name of the job command. For an Apache Spark ETL job, this must be `glueetl` . For a Python shell job, it must be `pythonshell` . For an Apache Spark streaming ETL job, this must be `gluestreaming` . For a Ray job, this must be `glueray` .","PythonVersion":"The Python version being used to execute a Python shell job. Allowed values are 3 or 3.9. Version 2 is deprecated.","Runtime":"In Ray jobs, Runtime is used to specify the versions of Ray, Python and additional libraries available in your environment. This field is not used in other job types. For supported runtime environment values, see [Working with Ray jobs](https://docs.aws.amazon.com/glue/latest/dg/ray-jobs-section.html) in the AWS Glue Developer Guide.","ScriptLocation":"Specifies the Amazon Simple Storage Service (Amazon S3) path to a script that executes a job (required)."}},"AWS::Glue::Job.NotificationProperty":{"attributes":{},"description":"Specifies configuration properties of a notification.","properties":{"NotifyDelayAfter":"After a job run starts, the number of minutes to wait before sending a job run delay notification."}},"AWS::Glue::MLTransform":{"attributes":{"Ref":"`Ref` returns the transform ID."},"description":"The AWS::Glue::MLTransform is an AWS Glue resource type that manages machine learning transforms.","properties":{"Description":"A user-defined, long-form description text for the machine learning transform.","GlueVersion":"This value determines which version of AWS Glue this machine learning transform is compatible with. Glue 1.0 is recommended for most customers. If the value is not set, the Glue compatibility defaults to Glue 0.9. For more information, see [AWS Glue Versions](https://docs.aws.amazon.com/glue/latest/dg/release-notes.html#release-notes-versions) in the developer guide.","InputRecordTables":"A list of AWS Glue table definitions used by the transform.","MaxCapacity":"The number of AWS Glue data processing units (DPUs) that are allocated to task runs for this transform. You can allocate from 2 to 100 DPUs; the default is 10. A DPU is a relative measure of processing power that consists of 4 vCPUs of compute capacity and 16 GB of memory. For more information, see the [AWS Glue pricing page](https://docs.aws.amazon.com/glue/pricing/) .\\n\\n`MaxCapacity` is a mutually exclusive option with `NumberOfWorkers` and `WorkerType` .\\n\\n- If either `NumberOfWorkers` or `WorkerType` is set, then `MaxCapacity` cannot be set.\\n- If `MaxCapacity` is set then neither `NumberOfWorkers` or `WorkerType` can be set.\\n- If `WorkerType` is set, then `NumberOfWorkers` is required (and vice versa).\\n- `MaxCapacity` and `NumberOfWorkers` must both be at least 1.\\n\\nWhen the `WorkerType` field is set to a value other than `Standard` , the `MaxCapacity` field is set automatically and becomes read-only.","MaxRetries":"The maximum number of times to retry after an `MLTaskRun` of the machine learning transform fails.","Name":"A user-defined name for the machine learning transform. Names are required to be unique. `Name` is optional:\\n\\n- If you supply `Name` , the stack cannot be repeatedly created.\\n- If `Name` is not provided, a randomly generated name will be used instead.","NumberOfWorkers":"The number of workers of a defined `workerType` that are allocated when a task of the transform runs.\\n\\nIf `WorkerType` is set, then `NumberOfWorkers` is required (and vice versa).","Role":"The name or Amazon Resource Name (ARN) of the IAM role with the required permissions. The required permissions include both AWS Glue service role permissions to AWS Glue resources, and Amazon S3 permissions required by the transform.\\n\\n- This role needs AWS Glue service role permissions to allow access to resources in AWS Glue . See [Attach a Policy to IAM Users That Access AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/attach-policy-iam-user.html) .\\n- This role needs permission to your Amazon Simple Storage Service (Amazon S3) sources, targets, temporary directory, scripts, and any libraries used by the task run for this transform.","Tags":"The tags to use with this machine learning transform. You may use tags to limit access to the machine learning transform. For more information about tags in AWS Glue , see [AWS Tags in AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/monitor-tags.html) in the developer guide.","Timeout":"The timeout in minutes of the machine learning transform.","TransformEncryption":"The encryption-at-rest settings of the transform that apply to accessing user data. Machine learning\\ntransforms can access user data encrypted in Amazon S3 using KMS.\\n\\nAdditionally, imported labels and trained transforms can now be encrypted using a customer provided\\nKMS key.","TransformParameters":"The algorithm-specific parameters that are associated with the machine learning transform.","WorkerType":"The type of predefined worker that is allocated when a task of this transform runs. Accepts a value of Standard, G.1X, or G.2X.\\n\\n- For the `Standard` worker type, each worker provides 4 vCPU, 16 GB of memory and a 50GB disk, and 2 executors per worker.\\n- For the `G.1X` worker type, each worker provides 4 vCPU, 16 GB of memory and a 64GB disk, and 1 executor per worker.\\n- For the `G.2X` worker type, each worker provides 8 vCPU, 32 GB of memory and a 128GB disk, and 1 executor per worker.\\n\\n`MaxCapacity` is a mutually exclusive option with `NumberOfWorkers` and `WorkerType` .\\n\\n- If either `NumberOfWorkers` or `WorkerType` is set, then `MaxCapacity` cannot be set.\\n- If `MaxCapacity` is set then neither `NumberOfWorkers` or `WorkerType` can be set.\\n- If `WorkerType` is set, then `NumberOfWorkers` is required (and vice versa).\\n- `MaxCapacity` and `NumberOfWorkers` must both be at least 1."}},"AWS::Glue::MLTransform.FindMatchesParameters":{"attributes":{},"description":"The parameters to configure the find matches transform.","properties":{"AccuracyCostTradeoff":"The value that is selected when tuning your transform for a balance between accuracy and cost. A value of 0.5 means that the system balances accuracy and cost concerns. A value of 1.0 means a bias purely for accuracy, which typically results in a higher cost, sometimes substantially higher. A value of 0.0 means a bias purely for cost, which results in a less accurate `FindMatches` transform, sometimes with unacceptable accuracy.\\n\\nAccuracy measures how well the transform finds true positives and true negatives. Increasing accuracy requires more machine resources and cost. But it also results in increased recall.\\n\\nCost measures how many compute resources, and thus money, are consumed to run the transform.","EnforceProvidedLabels":"The value to switch on or off to force the output to match the provided labels from users. If the value is `True` , the `find matches` transform forces the output to match the provided labels. The results override the normal conflation results. If the value is `False` , the `find matches` transform does not ensure all the labels provided are respected, and the results rely on the trained model.\\n\\nNote that setting this value to true may increase the conflation execution time.","PrecisionRecallTradeoff":"The value selected when tuning your transform for a balance between precision and recall. A value of 0.5 means no preference; a value of 1.0 means a bias purely for precision, and a value of 0.0 means a bias for recall. Because this is a tradeoff, choosing values close to 1.0 means very low recall, and choosing values close to 0.0 results in very low precision.\\n\\nThe precision metric indicates how often your model is correct when it predicts a match.\\n\\nThe recall metric indicates that for an actual match, how often your model predicts the match.","PrimaryKeyColumnName":"The name of a column that uniquely identifies rows in the source table. Used to help identify matching records."}},"AWS::Glue::MLTransform.GlueTables":{"attributes":{},"description":"The database and table in the AWS Glue Data Catalog that is used for input or output data.","properties":{"CatalogId":"A unique identifier for the AWS Glue Data Catalog .","ConnectionName":"The name of the connection to the AWS Glue Data Catalog .","DatabaseName":"A database name in the AWS Glue Data Catalog .","TableName":"A table name in the AWS Glue Data Catalog ."}},"AWS::Glue::MLTransform.InputRecordTables":{"attributes":{},"description":"A list of AWS Glue table definitions used by the transform.","properties":{"GlueTables":"The database and table in the AWS Glue Data Catalog that is used for input or output data."}},"AWS::Glue::MLTransform.MLUserDataEncryption":{"attributes":{},"description":"The encryption-at-rest settings of the transform that apply to accessing user data.","properties":{"KmsKeyId":"The ID for the customer-provided KMS key.","MLUserDataEncryptionMode":"The encryption mode applied to user data. Valid values are:\\n\\n- DISABLED: encryption is disabled.\\n- SSEKMS: use of server-side encryption with AWS Key Management Service (SSE-KMS) for user data\\nstored in Amazon S3."}},"AWS::Glue::MLTransform.TransformEncryption":{"attributes":{},"description":"The encryption-at-rest settings of the transform that apply to accessing user data. Machine learning\\ntransforms can access user data encrypted in Amazon S3 using KMS.\\n\\nAdditionally, imported labels and trained transforms can now be encrypted using a customer provided\\nKMS key.","properties":{"MLUserDataEncryption":"The encryption-at-rest settings of the transform that apply to accessing user data.","TaskRunSecurityConfigurationName":"The name of the security configuration."}},"AWS::Glue::MLTransform.TransformParameters":{"attributes":{},"description":"The algorithm-specific parameters that are associated with the machine learning transform.","properties":{"FindMatchesParameters":"The parameters for the find matches algorithm.","TransformType":"The type of machine learning transform. `FIND_MATCHES` is the only option.\\n\\nFor information about the types of machine learning transforms, see [Creating Machine Learning Transforms](https://docs.aws.amazon.com/glue/latest/dg/add-job-machine-learning-transform.html) ."}},"AWS::Glue::Partition":{"attributes":{"Ref":"`Ref` returns the partition name."},"description":"The `AWS::Glue::Partition` resource creates an AWS Glue partition, which represents a slice of table data. For more information, see [CreatePartition Action](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html#aws-glue-api-catalog-partitions-CreatePartition) and [Partition Structure](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html#aws-glue-api-catalog-partitions-Partition) in the *AWS Glue Developer Guide* .","properties":{"CatalogId":"The AWS account ID of the catalog in which the partion is to be created.\\n\\n> To specify the account ID, you can use the `Ref` intrinsic function with the `AWS::AccountId` pseudo parameter. For example: `!Ref AWS::AccountId`","DatabaseName":"The name of the catalog database in which to create the partition.","PartitionInput":"The structure used to create and update a partition.","TableName":"The name of the metadata table in which the partition is to be created."}},"AWS::Glue::Partition.Column":{"attributes":{},"description":"A column in a `Table` .","properties":{"Comment":"A free-form text comment.","Name":"The name of the `Column` .","Type":"The data type of the `Column` ."}},"AWS::Glue::Partition.Order":{"attributes":{},"description":"Specifies the sort order of a sorted column.","properties":{"Column":"The name of the column.","SortOrder":"Indicates that the column is sorted in ascending order ( `== 1` ), or in descending order ( `==0` )."}},"AWS::Glue::Partition.PartitionInput":{"attributes":{},"description":"The structure used to create and update a partition.","properties":{"Parameters":"These key-value pairs define partition parameters.","StorageDescriptor":"Provides information about the physical location where the partition is stored.","Values":"The values of the partition. Although this parameter is not required by the SDK, you must specify this parameter for a valid input.\\n\\nThe values for the keys for the new partition must be passed as an array of String objects that must be ordered in the same order as the partition keys appearing in the Amazon S3 prefix. Otherwise AWS Glue will add the values to the wrong keys."}},"AWS::Glue::Partition.SchemaId":{"attributes":{},"description":"A structure that contains schema identity fields. Either this or the `SchemaVersionId` has to be\\nprovided.","properties":{"RegistryName":"The name of the schema registry that contains the schema.","SchemaArn":"The Amazon Resource Name (ARN) of the schema. One of `SchemaArn` or `SchemaName` has to be\\nprovided.","SchemaName":"The name of the schema. One of `SchemaArn` or `SchemaName` has to be provided."}},"AWS::Glue::Partition.SchemaReference":{"attributes":{},"description":"An object that references a schema stored in the AWS Glue Schema Registry.","properties":{"SchemaId":"A structure that contains schema identity fields. Either this or the `SchemaVersionId` has to be\\nprovided.","SchemaVersionId":"The unique ID assigned to a version of the schema. Either this or the `SchemaId` has to be provided.","SchemaVersionNumber":"The version number of the schema."}},"AWS::Glue::Partition.SerdeInfo":{"attributes":{},"description":"Information about a serialization/deserialization program (SerDe) that serves as an extractor and loader.","properties":{"Name":"Name of the SerDe.","Parameters":"These key-value pairs define initialization parameters for the SerDe.","SerializationLibrary":"Usually the class that implements the SerDe. An example is `org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe` ."}},"AWS::Glue::Partition.SkewedInfo":{"attributes":{},"description":"Specifies skewed values in a table. Skewed values are those that occur with very high frequency.","properties":{"SkewedColumnNames":"A list of names of columns that contain skewed values.","SkewedColumnValueLocationMaps":"A mapping of skewed values to the columns that contain them.","SkewedColumnValues":"A list of values that appear so frequently as to be considered skewed."}},"AWS::Glue::Partition.StorageDescriptor":{"attributes":{},"description":"Describes the physical storage of table data.","properties":{"BucketColumns":"A list of reducer grouping columns, clustering columns, and bucketing columns in the table.","Columns":"A list of the `Columns` in the table.","Compressed":"`True` if the data in the table is compressed, or `False` if not.","InputFormat":"The input format: `SequenceFileInputFormat` (binary), or `TextInputFormat` , or a custom format.","Location":"The physical location of the table. By default, this takes the form of the warehouse location, followed by the database location in the warehouse, followed by the table name.","NumberOfBuckets":"The number of buckets.\\n\\nYou must specify this property if the partition contains any dimension columns.","OutputFormat":"The output format: `SequenceFileOutputFormat` (binary), or `IgnoreKeyTextOutputFormat` , or a custom format.","Parameters":"The user-supplied properties in key-value form.","SchemaReference":"An object that references a schema stored in the AWS Glue Schema Registry.","SerdeInfo":"The serialization/deserialization (SerDe) information.","SkewedInfo":"The information about values that appear frequently in a column (skewed values).","SortColumns":"A list specifying the sort order of each bucket in the table.","StoredAsSubDirectories":"`True` if the table data is stored in subdirectories, or `False` if not."}},"AWS::Glue::Registry":{"attributes":{"Arn":"","Ref":"`Ref` returns a combination of \\"VersionId|Key|Value\\" as a string."},"description":"The AWS::Glue::Registry is an AWS Glue resource type that manages registries of schemas in the AWS Glue Schema Registry.","properties":{"Description":"A description of the registry.","Name":"The name of the registry.","Tags":"AWS tags that contain a key value pair and may be searched by console, command line, or API."}},"AWS::Glue::Schema":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the schema.","InitialSchemaVersionId":"","Ref":""},"description":"The `AWS::Glue::Schema` is an AWS Glue resource type that manages schemas in the AWS Glue Schema Registry.","properties":{"CheckpointVersion":"Specify the `VersionNumber` or the `IsLatest` for setting the checkpoint for the schema. This is only required for updating a checkpoint.","Compatibility":"The compatibility mode of the schema.","DataFormat":"The data format of the schema definition. Currently only `AVRO` is supported.","Description":"A description of the schema if specified when created.","Name":"Name of the schema to be created of max length of 255, and may only contain letters, numbers, hyphen, underscore, dollar sign, or hash mark. No whitespace.","Registry":"The registry where a schema is stored.","SchemaDefinition":"The schema definition using the `DataFormat` setting for `SchemaName` .","Tags":"AWS tags that contain a key value pair and may be searched by console, command line, or API."}},"AWS::Glue::Schema.Registry":{"attributes":{},"description":"Specifies a registry in the AWS Glue Schema Registry.","properties":{"Arn":"The Amazon Resource Name (ARN) of the registry.","Name":"The name of the registry."}},"AWS::Glue::Schema.SchemaVersion":{"attributes":{},"description":"Specifies the version of a schema.","properties":{"IsLatest":"Indicates if this version is the latest version of the schema.","VersionNumber":"The version number of the schema."}},"AWS::Glue::SchemaVersion":{"attributes":{"Ref":"","VersionId":""},"description":"The `AWS::Glue::SchemaVersion` is an AWS Glue resource type that manages schema versions of schemas in the AWS Glue Schema Registry.","properties":{"Schema":"The schema that includes the schema version.","SchemaDefinition":"The schema definition for the schema version."}},"AWS::Glue::SchemaVersion.Schema":{"attributes":{},"description":"A wrapper structure to contain schema identity fields. Either `SchemaArn` , or `SchemaName` and `RegistryName` has to be provided.","properties":{"RegistryName":"The name of the registry where the schema is stored. Either `SchemaArn` , or `SchemaName` and `RegistryName` has to be provided.","SchemaArn":"The Amazon Resource Name (ARN) of the schema. Either `SchemaArn` , or `SchemaName` and `RegistryName` has to be provided.","SchemaName":"The name of the schema. Either `SchemaArn` , or `SchemaName` and `RegistryName` has to be provided."}},"AWS::Glue::SchemaVersionMetadata":{"attributes":{"Ref":""},"description":"The `AWS::Glue::SchemaVersionMetadata` is an AWS Glue resource type that defines the metadata key-value pairs for a schema version in AWS Glue Schema Registry.","properties":{"Key":"A metadata key in a key-value pair for metadata.","SchemaVersionId":"The version number of the schema.","Value":"A metadata key\'s corresponding value."}},"AWS::Glue::SecurityConfiguration":{"attributes":{"Ref":""},"description":"Creates a new security configuration. A security configuration is a set of security properties that can be used by AWS Glue . You can use a security configuration to encrypt data at rest. For information about using security configurations in AWS Glue , see [Encrypting Data Written by Crawlers, Jobs, and Development Endpoints](https://docs.aws.amazon.com/glue/latest/dg/encryption-security-configuration.html) .","properties":{"EncryptionConfiguration":"The encryption configuration associated with this security configuration.","Name":"The name of the security configuration."}},"AWS::Glue::SecurityConfiguration.CloudWatchEncryption":{"attributes":{},"description":"Specifies how Amazon CloudWatch data should be encrypted.","properties":{"CloudWatchEncryptionMode":"The encryption mode to use for CloudWatch data.","KmsKeyArn":"The Amazon Resource Name (ARN) of the KMS key to be used to encrypt the data."}},"AWS::Glue::SecurityConfiguration.EncryptionConfiguration":{"attributes":{},"description":"Specifies an encryption configuration.","properties":{"CloudWatchEncryption":"The encryption configuration for Amazon CloudWatch.","JobBookmarksEncryption":"The encryption configuration for job bookmarks.","S3Encryptions":"The encyption configuration for Amazon Simple Storage Service (Amazon S3) data."}},"AWS::Glue::SecurityConfiguration.JobBookmarksEncryption":{"attributes":{},"description":"Specifies how job bookmark data should be encrypted.","properties":{"JobBookmarksEncryptionMode":"The encryption mode to use for job bookmarks data.","KmsKeyArn":"The Amazon Resource Name (ARN) of the KMS key to be used to encrypt the data."}},"AWS::Glue::SecurityConfiguration.S3Encryption":{"attributes":{},"description":"Specifies how Amazon Simple Storage Service (Amazon S3) data should be encrypted.","properties":{"KmsKeyArn":"The Amazon Resource Name (ARN) of the KMS key to be used to encrypt the data.","S3EncryptionMode":"The encryption mode to use for Amazon S3 data."}},"AWS::Glue::SecurityConfiguration.S3Encryptions":{"attributes":{},"description":"The `S3Encryptions` property type specifies the encyption configuration for Amazon Simple Storage Service (Amazon S3) data for a security configuration.","properties":{}},"AWS::Glue::Table":{"attributes":{"Ref":"`Ref` returns the table name."},"description":"The `AWS::Glue::Table` resource specifies tabular data in the AWS Glue data catalog. For more information, see [Defining Tables in the AWS Glue Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/tables-described.html) and [Table Structure](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-Table) in the *AWS Glue Developer Guide* .","properties":{"CatalogId":"The ID of the Data Catalog in which to create the `Table` .","DatabaseName":"The name of the database where the table metadata resides. For Hive compatibility, this must be all lowercase.","TableInput":"A structure used to define a table."}},"AWS::Glue::Table.Column":{"attributes":{},"description":"A column in a `Table` .","properties":{"Comment":"A free-form text comment.","Name":"The name of the `Column` .","Type":"The data type of the `Column` ."}},"AWS::Glue::Table.Order":{"attributes":{},"description":"Specifies the sort order of a sorted column.","properties":{"Column":"The name of the column.","SortOrder":"Indicates that the column is sorted in ascending order ( `== 1` ), or in descending order ( `==0` )."}},"AWS::Glue::Table.SchemaId":{"attributes":{},"description":"A structure that contains schema identity fields. Either this or the `SchemaVersionId` has to be\\nprovided.","properties":{"RegistryName":"The name of the schema registry that contains the schema.","SchemaArn":"The Amazon Resource Name (ARN) of the schema. One of `SchemaArn` or `SchemaName` has to be\\nprovided.","SchemaName":"The name of the schema. One of `SchemaArn` or `SchemaName` has to be provided."}},"AWS::Glue::Table.SchemaReference":{"attributes":{},"description":"An object that references a schema stored in the AWS Glue Schema Registry.","properties":{"SchemaId":"A structure that contains schema identity fields. Either this or the `SchemaVersionId` has to be\\nprovided.","SchemaVersionId":"The unique ID assigned to a version of the schema. Either this or the `SchemaId` has to be provided.","SchemaVersionNumber":"The version number of the schema."}},"AWS::Glue::Table.SerdeInfo":{"attributes":{},"description":"Information about a serialization/deserialization program (SerDe) that serves as an extractor and loader.","properties":{"Name":"Name of the SerDe.","Parameters":"These key-value pairs define initialization parameters for the SerDe.","SerializationLibrary":"Usually the class that implements the SerDe. An example is `org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe` ."}},"AWS::Glue::Table.SkewedInfo":{"attributes":{},"description":"Specifies skewed values in a table. Skewed values are those that occur with very high frequency.","properties":{"SkewedColumnNames":"A list of names of columns that contain skewed values.","SkewedColumnValueLocationMaps":"A mapping of skewed values to the columns that contain them.","SkewedColumnValues":"A list of values that appear so frequently as to be considered skewed."}},"AWS::Glue::Table.StorageDescriptor":{"attributes":{},"description":"Describes the physical storage of table data.","properties":{"BucketColumns":"A list of reducer grouping columns, clustering columns, and bucketing columns in the table.","Columns":"A list of the `Columns` in the table.","Compressed":"`True` if the data in the table is compressed, or `False` if not.","InputFormat":"The input format: `SequenceFileInputFormat` (binary), or `TextInputFormat` , or a custom format.","Location":"The physical location of the table. By default, this takes the form of the warehouse location, followed by the database location in the warehouse, followed by the table name.","NumberOfBuckets":"Must be specified if the table contains any dimension columns.","OutputFormat":"The output format: `SequenceFileOutputFormat` (binary), or `IgnoreKeyTextOutputFormat` , or a custom format.","Parameters":"The user-supplied properties in key-value form.","SchemaReference":"An object that references a schema stored in the AWS Glue Schema Registry.","SerdeInfo":"The serialization/deserialization (SerDe) information.","SkewedInfo":"The information about values that appear frequently in a column (skewed values).","SortColumns":"A list specifying the sort order of each bucket in the table.","StoredAsSubDirectories":"`True` if the table data is stored in subdirectories, or `False` if not."}},"AWS::Glue::Table.TableIdentifier":{"attributes":{},"description":"A structure that describes a target table for resource linking.","properties":{"CatalogId":"The ID of the Data Catalog in which the table resides.","DatabaseName":"The name of the catalog database that contains the target table.","Name":"The name of the target table."}},"AWS::Glue::Table.TableInput":{"attributes":{},"description":"A structure used to define a table.","properties":{"Description":"A description of the table.","Name":"The table name. For Hive compatibility, this is folded to lowercase when it is stored.","Owner":"The table owner. Included for Apache Hive compatibility. Not used in the normal course of AWS Glue operations.","Parameters":"These key-value pairs define properties associated with the table.","PartitionKeys":"A list of columns by which the table is partitioned. Only primitive types are supported as partition keys.\\n\\nWhen you create a table used by Amazon Athena, and you do not specify any `partitionKeys` , you must at least set the value of `partitionKeys` to an empty list. For example:\\n\\n`\\"PartitionKeys\\": []`","Retention":"The retention time for this table.","StorageDescriptor":"A storage descriptor containing information about the physical storage of this table.","TableType":"The type of this table. AWS Glue will create tables with the `EXTERNAL_TABLE` type. Other services, such as Athena, may create tables with additional table types.\\n\\nAWS Glue related table types:\\n\\n- **EXTERNAL_TABLE** - Hive compatible attribute - indicates a non-Hive managed table.\\n- **GOVERNED** - Used by AWS Lake Formation . The AWS Glue Data Catalog understands `GOVERNED` .","TargetTable":"A `TableIdentifier` structure that describes a target table for resource linking.","ViewExpandedText":"Included for Apache Hive compatibility. Not used in the normal course of AWS Glue operations.","ViewOriginalText":"Included for Apache Hive compatibility. Not used in the normal course of AWS Glue operations. If the table is a `VIRTUAL_VIEW` , certain Athena configuration encoded in base64."}},"AWS::Glue::Trigger":{"attributes":{"Ref":"`Ref` returns the trigger name."},"description":"The `AWS::Glue::Trigger` resource specifies triggers that run AWS Glue jobs. For more information, see [Triggering Jobs in AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/trigger-job.html) and [Trigger Structure](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-trigger.html#aws-glue-api-jobs-trigger-Trigger) in the *AWS Glue Developer Guide* .","properties":{"Actions":"The actions initiated by this trigger.","Description":"A description of this trigger.","EventBatchingCondition":"Batch condition that must be met (specified number of events received or batch time window expired) before EventBridge event trigger fires.","Name":"The name of the trigger.","Predicate":"The predicate of this trigger, which defines when it will fire.","Schedule":"A `cron` expression used to specify the schedule. For more information, see [Time-Based Schedules for Jobs and Crawlers](https://docs.aws.amazon.com/glue/latest/dg/monitor-data-warehouse-schedule.html) in the *AWS Glue Developer Guide* . For example, to run something every day at 12:15 UTC, specify `cron(15 12 * * ? *)` .","StartOnCreation":"Set to true to start `SCHEDULED` and `CONDITIONAL` triggers when created. True is not supported for `ON_DEMAND` triggers.","Tags":"The tags to use with this trigger.","Type":"The type of trigger that this is.","WorkflowName":"The name of the workflow associated with the trigger."}},"AWS::Glue::Trigger.Action":{"attributes":{},"description":"Defines an action to be initiated by a trigger.","properties":{"Arguments":"The job arguments used when this trigger fires. For this job run, they replace the default arguments set in the job definition itself.\\n\\nYou can specify arguments here that your own job-execution script consumes, in addition to arguments that AWS Glue itself consumes.\\n\\nFor information about how to specify and consume your own job arguments, see [Calling AWS Glue APIs in Python](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-calling.html) in the *AWS Glue Developer Guide* .\\n\\nFor information about the key-value pairs that AWS Glue consumes to set up your job, see the [Special Parameters Used by AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html) topic in the developer guide.","CrawlerName":"The name of the crawler to be used with this action.","JobName":"The name of a job to be executed.","NotificationProperty":"Specifies configuration properties of a job run notification.","SecurityConfiguration":"The name of the `SecurityConfiguration` structure to be used with this action.","Timeout":"The `JobRun` timeout in minutes. This is the maximum time that a job run can consume resources before it is terminated and enters TIMEOUT status. The default is 2,880 minutes (48 hours). This overrides the timeout value set in the parent job."}},"AWS::Glue::Trigger.Condition":{"attributes":{},"description":"Defines a condition under which a trigger fires.","properties":{"CrawlState":"The state of the crawler to which this condition applies.","CrawlerName":"The name of the crawler to which this condition applies.","JobName":"The name of the job whose `JobRuns` this condition applies to, and on which this trigger waits.","LogicalOperator":"A logical operator.","State":"The condition state. Currently, the values supported are `SUCCEEDED` , `STOPPED` , `TIMEOUT` , and `FAILED` ."}},"AWS::Glue::Trigger.EventBatchingCondition":{"attributes":{},"description":"Batch condition that must be met (specified number of events received or batch time window expired) before EventBridge event trigger fires.","properties":{"BatchSize":"Number of events that must be received from Amazon EventBridge before EventBridge event trigger fires.","BatchWindow":"Window of time in seconds after which EventBridge event trigger fires. Window starts when first event is received."}},"AWS::Glue::Trigger.NotificationProperty":{"attributes":{},"description":"Specifies configuration properties of a job run notification.","properties":{"NotifyDelayAfter":"After a job run starts, the number of minutes to wait before sending a job run delay notification"}},"AWS::Glue::Trigger.Predicate":{"attributes":{},"description":"Defines the predicate of the trigger, which determines when it fires.","properties":{"Conditions":"A list of the conditions that determine when the trigger will fire.","Logical":"An optional field if only one condition is listed. If multiple conditions are listed, then this field is required."}},"AWS::Glue::Workflow":{"attributes":{"Ref":"`Ref` returns the workflow name."},"description":"The `AWS::Glue::Workflow` is an AWS Glue resource type that manages AWS Glue workflows. A workflow is a container for a set of related jobs, crawlers, and triggers in AWS Glue . Using a workflow, you can design a complex multi-job extract, transform, and load (ETL) activity that AWS Glue can execute and track as single entity.","properties":{"DefaultRunProperties":"A collection of properties to be used as part of each execution of the workflow","Description":"A description of the workflow","MaxConcurrentRuns":"You can use this parameter to prevent unwanted multiple updates to data, to control costs, or in some cases, to prevent exceeding the maximum number of concurrent runs of any of the component jobs. If you leave this parameter blank, there is no limit to the number of concurrent workflow runs.","Name":"The name of the workflow representing the flow","Tags":"The tags to use with this workflow."}},"AWS::Grafana::Workspace":{"attributes":{"CreationTimestamp":"The date that the workspace was created.\\n\\nType: Timestamp","Endpoint":"The URL that users can use to access the Grafana console in the workspace.\\n\\nType: String","GrafanaVersion":"Specifies the version of Grafana supported by this workspace.\\n\\nType: String","Id":"The unique ID of this workspace.\\n\\nType: String","ModificationTimestamp":"The most recent date that the workspace was modified.\\n\\nType: Timestamp","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"Id\\" }`","SamlConfigurationStatus":"Specifies whether the workspace\'s SAML configuration is complete.\\n\\nValid values: `CONFIGURED | NOT_CONFIGURED`\\n\\nType: String","SsoClientId":"The ID of the IAM Identity Center-managed application that is created by Amazon Managed Grafana .\\n\\nType: String","Status":"The current status of the workspace.\\n\\nValid values: `ACTIVE | CREATING | DELETING | FAILED | UPDATING | UPGRADING | DELETION_FAILED | CREATION_FAILED | UPDATE_FAILED | UPGRADE_FAILED | LICENSE_REMOVAL_FAILED`\\n\\nType: String"},"description":"Specifies a *workspace* . In a workspace, you can create Grafana dashboards and visualizations to analyze your metrics, logs, and traces. You don\'t have to build, package, or deploy any hardware to run the Grafana server.","properties":{"AccountAccessType":"Specifies whether the workspace can access AWS resources in this AWS account only, or whether it can also access AWS resources in other accounts in the same organization. If this is `ORGANIZATION` , the `OrganizationalUnits` parameter specifies which organizational units the workspace can access.","AuthenticationProviders":"Specifies whether this workspace uses SAML 2.0, AWS IAM Identity Center (successor to AWS Single Sign-On) , or both to authenticate users for using the Grafana console within a workspace. For more information, see [User authentication in Amazon Managed Grafana](https://docs.aws.amazon.com/grafana/latest/userguide/authentication-in-AMG.html) .","ClientToken":"A unique, case-sensitive, user-provided identifier to ensure the idempotency of the request.","DataSources":"Specifies the AWS data sources that have been configured to have IAM roles and permissions created to allow Amazon Managed Grafana to read data from these sources.\\n\\nThis list is only used when the workspace was created through the AWS console, and the `permissionType` is `SERVICE_MANAGED` .","Description":"The user-defined description of the workspace.","GrafanaVersion":"Specifies the version of Grafana to support in the new workspace.\\n\\nSupported values are `8.4` and `9.4` .","Name":"The name of the workspace.","NetworkAccessControl":"The configuration settings for network access to your workspace.","NotificationDestinations":"The AWS notification channels that Amazon Managed Grafana can automatically create IAM roles and permissions for, to allow Amazon Managed Grafana to use these channels.","OrganizationRoleName":"The name of the IAM role that is used to access resources through Organizations .","OrganizationalUnits":"Specifies the organizational units that this workspace is allowed to use data sources from, if this workspace is in an account that is part of an organization.","PermissionType":"If this is `SERVICE_MANAGED` , and the workplace was created through the Amazon Managed Grafana console, then Amazon Managed Grafana automatically creates the IAM roles and provisions the permissions that the workspace needs to use AWS data sources and notification channels.\\n\\nIf this is `CUSTOMER_MANAGED` , you must manage those roles and permissions yourself.\\n\\nIf you are working with a workspace in a member account of an organization and that account is not a delegated administrator account, and you want the workspace to access data sources in other AWS accounts in the organization, this parameter must be set to `CUSTOMER_MANAGED` .\\n\\nFor more information about converting between customer and service managed, see [Managing permissions for data sources and notification channels](https://docs.aws.amazon.com/grafana/latest/userguide/AMG-datasource-and-notification.html) . For more information about the roles and permissions that must be managed for customer managed workspaces, see [Amazon Managed Grafana permissions and policies for AWS data sources and notification channels](https://docs.aws.amazon.com/grafana/latest/userguide/AMG-manage-permissions.html)","RoleArn":"The IAM role that grants permissions to the AWS resources that the workspace will view data from. This role must already exist.","SamlConfiguration":"If the workspace uses SAML, use this structure to map SAML assertion attributes to workspace user information and define which groups in the assertion attribute are to have the `Admin` and `Editor` roles in the workspace.","StackSetName":"The name of the AWS CloudFormation stack set that is used to generate IAM roles to be used for this workspace.","VpcConfiguration":"The configuration settings for an Amazon VPC that contains data sources for your Grafana workspace to connect to.\\n\\n> Connecting to a private VPC is not yet available in the Asia Pacific (Seoul) Region (ap-northeast-2)."}},"AWS::Grafana::Workspace.AssertionAttributes":{"attributes":{},"description":"A structure that defines which attributes in the IdP assertion are to be used to define information about the users authenticated by the IdP to use the workspace.","properties":{"Email":"The name of the attribute within the SAML assertion to use as the email names for SAML users.","Groups":"The name of the attribute within the SAML assertion to use as the user full \\"friendly\\" names for user groups.","Login":"The name of the attribute within the SAML assertion to use as the login names for SAML users.","Name":"The name of the attribute within the SAML assertion to use as the user full \\"friendly\\" names for SAML users.","Org":"The name of the attribute within the SAML assertion to use as the user full \\"friendly\\" names for the users\' organizations.","Role":"The name of the attribute within the SAML assertion to use as the user roles."}},"AWS::Grafana::Workspace.IdpMetadata":{"attributes":{},"description":"A structure containing the identity provider (IdP) metadata used to integrate the identity provider with this workspace. You can specify the metadata either by providing a URL to its location in the `url` parameter, or by specifying the full metadata in XML format in the `xml` parameter. Specifying both will cause an error.","properties":{"Url":"The URL of the location containing the IdP metadata.","Xml":"The full IdP metadata, in XML format."}},"AWS::Grafana::Workspace.NetworkAccessControl":{"attributes":{},"description":"The configuration settings for in-bound network access to your workspace.\\n\\nWhen this is configured, only listed IP addresses and VPC endpoints will be able to access your workspace. Standard Grafana authentication and authorization are still required.\\n\\nAccess is granted to a caller that is in either the IP address list or the VPC endpoint list - they do not need to be in both.\\n\\nIf this is not configured, or is removed, then all IP addresses and VPC endpoints are allowed. Standard Grafana authentication and authorization are still required.\\n\\n> While both `prefixListIds` and `vpceIds` are required, you can pass in an empty array of strings for either parameter if you do not want to allow any of that type.\\n> \\n> If both are passed as empty arrays, no traffic is allowed to the workspace, because only *explicitly* allowed connections are accepted.","properties":{"PrefixListIds":"An array of prefix list IDs. A prefix list is a list of CIDR ranges of IP addresses. The IP addresses specified are allowed to access your workspace. If the list is not included in the configuration (passed an empty array) then no IP addresses are allowed to access the workspace. You create a prefix list using the Amazon VPC console.\\n\\nPrefix list IDs have the format `pl- *1a2b3c4d*` .\\n\\nFor more information about prefix lists, see [Group CIDR blocks using managed prefix lists](https://docs.aws.amazon.com/vpc/latest/userguide/managed-prefix-lists.html) in the *Amazon Virtual Private Cloud User Guide* .","VpceIds":"An array of Amazon VPC endpoint IDs for the workspace. You can create VPC endpoints to your Amazon Managed Grafana workspace for access from within a VPC. If a `NetworkAccessConfiguration` is specified then only VPC endpoints specified here are allowed to access the workspace. If you pass in an empty array of strings, then no VPCs are allowed to access the workspace.\\n\\nVPC endpoint IDs have the format `vpce- *1a2b3c4d*` .\\n\\nFor more information about creating an interface VPC endpoint, see [Interface VPC endpoints](https://docs.aws.amazon.com/grafana/latest/userguide/VPC-endpoints) in the *Amazon Managed Grafana User Guide* .\\n\\n> The only VPC endpoints that can be specified here are interface VPC endpoints for Grafana workspaces (using the `com.amazonaws.[region].grafana-workspace` service endpoint). Other VPC endpoints are ignored."}},"AWS::Grafana::Workspace.RoleValues":{"attributes":{},"description":"This structure defines which groups defined in the SAML assertion attribute are to be mapped to the Grafana `Admin` and `Editor` roles in the workspace. SAML authenticated users not part of `Admin` or `Editor` role groups have `Viewer` permission over the workspace.","properties":{"Admin":"A list of groups from the SAML assertion attribute to grant the Grafana `Admin` role to.","Editor":"A list of groups from the SAML assertion attribute to grant the Grafana `Editor` role to."}},"AWS::Grafana::Workspace.SamlConfiguration":{"attributes":{},"description":"A structure containing information about how this workspace works with SAML.","properties":{"AllowedOrganizations":"Lists which organizations defined in the SAML assertion are allowed to use the Amazon Managed Grafana workspace. If this is empty, all organizations in the assertion attribute have access.","AssertionAttributes":"A structure that defines which attributes in the SAML assertion are to be used to define information about the users authenticated by that IdP to use the workspace.","IdpMetadata":"A structure containing the identity provider (IdP) metadata used to integrate the identity provider with this workspace.","LoginValidityDuration":"How long a sign-on session by a SAML user is valid, before the user has to sign on again.","RoleValues":"A structure containing arrays that map group names in the SAML assertion to the Grafana `Admin` and `Editor` roles in the workspace."}},"AWS::Grafana::Workspace.VpcConfiguration":{"attributes":{},"description":"The configuration settings for an Amazon VPC that contains data sources for your Grafana workspace to connect to.\\n\\n> Provided `securityGroupIds` and `subnetIds` must be part of the same VPC.\\n> \\n> Connecting to a private VPC is not yet available in the Asia Pacific (Seoul) Region (ap-northeast-2).","properties":{"SecurityGroupIds":"The list of Amazon EC2 security group IDs attached to the Amazon VPC for your Grafana workspace to connect. Duplicates not allowed.\\n\\n*Array Members* : Minimum number of 1 items. Maximum number of 5 items.\\n\\n*Length* : Minimum length of 0. Maximum length of 255.","SubnetIds":"The list of Amazon EC2 subnet IDs created in the Amazon VPC for your Grafana workspace to connect. Duplicates not allowed.\\n\\n*Array Members* : Minimum number of 2 items. Maximum number of 6 items.\\n\\n*Length* : Minimum length of 0. Maximum length of 255."}},"AWS::Greengrass::ConnectorDefinition":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `ConnectorDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/connectors/1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","Id":"The ID of the `ConnectorDefinition` , such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","LatestVersionArn":"The ARN of the last `ConnectorDefinitionVersion` that was added to the `ConnectorDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/connectors/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` .","Name":"The name of the `ConnectorDefinition` , such as `MyConnectorDefinition` .","Ref":"`Ref` returns the ID of the connector definition, such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` ."},"description":"The `AWS::Greengrass::ConnectorDefinition` resource represents a connector definition for AWS IoT Greengrass . Connector definitions are used to organize your connector definition versions.\\n\\nConnector definitions can reference multiple connector definition versions. All connector definition versions must be associated with a connector definition. Each connector definition version can contain one or more connectors.\\n\\n> When you create a connector definition, you can optionally include an initial connector definition version. To associate a connector definition version later, create an [`AWS::Greengrass::ConnectorDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinitionversion.html) resource and specify the ID of this connector definition.\\n> \\n> After you create the connector definition version that contains the connectors you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"InitialVersion":"The connector definition version to include when the connector definition is created. A connector definition version contains a list of [`connector`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connector.html) property types.\\n\\n> To associate a connector definition version after the connector definition is created, create an [`AWS::Greengrass::ConnectorDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinitionversion.html) resource and specify the ID of this connector definition.","Name":"The name of the connector definition.","Tags":"Application-specific metadata to attach to the connector definition. You can use tags in IAM policies to control access to AWS IoT Greengrass resources. You can also use tags to categorize your resources. For more information, see [Tagging Your AWS IoT Greengrass Resources](https://docs.aws.amazon.com/greengrass/latest/developerguide/tagging.html) in the *Developer Guide* .\\n\\nThis `Json` property type is processed as a map of key-value pairs. It uses the following format, which is different from most `Tags` implementations in AWS CloudFormation templates.\\n\\n```json\\n\\"Tags\\": { \\"KeyName0\\": \\"value\\", \\"KeyName1\\": \\"value\\", \\"KeyName2\\": \\"value\\"\\n}\\n```"}},"AWS::Greengrass::ConnectorDefinition.Connector":{"attributes":{},"description":"Connectors are modules that provide built-in integration with local infrastructure, device protocols, AWS , and other cloud services. For more information, see [Integrate with Services and Protocols Using Greengrass Connectors](https://docs.aws.amazon.com/greengrass/latest/developerguide/connectors.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Connectors` property of the [`ConnectorDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connectordefinitionversion.html) property type contains a list of `Connector` property types.","properties":{"ConnectorArn":"The Amazon Resource Name (ARN) of the connector.\\n\\nFor more information about connectors provided by AWS , see [Greengrass Connectors Provided by AWS](https://docs.aws.amazon.com/greengrass/latest/developerguide/connectors-list.html) .","Id":"A descriptive or arbitrary ID for the connector. This value must be unique within the connector definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","Parameters":"The parameters or configuration used by the connector.\\n\\nFor more information about connectors provided by AWS , see [Greengrass Connectors Provided by AWS](https://docs.aws.amazon.com/greengrass/latest/developerguide/connectors-list.html) ."}},"AWS::Greengrass::ConnectorDefinition.ConnectorDefinitionVersion":{"attributes":{},"description":"A connector definition version contains a list of connectors.\\n\\n> After you create a connector definition version that contains the connectors you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) . \\n\\nIn an AWS CloudFormation template, `ConnectorDefinitionVersion` is the property type of the `InitialVersion` property in the [`AWS::Greengrass::ConnectorDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinition.html) resource.","properties":{"Connectors":"The connectors in this version. Only one instance of a given connector can be added to a connector definition version at a time."}},"AWS::Greengrass::ConnectorDefinitionVersion":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the connector definition version, such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/connectors/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` ."},"description":"The `AWS::Greengrass::ConnectorDefinitionVersion` resource represents a connector definition version for AWS IoT Greengrass . A connector definition version contains a list of connectors.\\n\\n> To create a connector definition version, you must specify the ID of the connector definition that you want to associate with the version. For information about creating a connector definition, see [`AWS::Greengrass::ConnectorDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinition.html) .\\n> \\n> After you create a connector definition version that contains the connectors you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"ConnectorDefinitionId":"The ID of the connector definition associated with this version. This value is a GUID.","Connectors":"The connectors in this version. Only one instance of a given connector can be added to the connector definition version at a time."}},"AWS::Greengrass::ConnectorDefinitionVersion.Connector":{"attributes":{},"description":"Connectors are modules that provide built-in integration with local infrastructure, device protocols, AWS , and other cloud services. For more information, see [Integrate with Services and Protocols Using Greengrass Connectors](https://docs.aws.amazon.com/greengrass/latest/developerguide/connectors.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Connectors` property of the [`AWS::Greengrass::ConnectorDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinitionversion.html) resource contains a list of `Connector` property types.","properties":{"ConnectorArn":"The Amazon Resource Name (ARN) of the connector.\\n\\nFor more information about connectors provided by AWS , see [Greengrass Connectors Provided by AWS](https://docs.aws.amazon.com/greengrass/latest/developerguide/connectors-list.html) .","Id":"A descriptive or arbitrary ID for the connector. This value must be unique within the connector definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","Parameters":"The parameters or configuration that the connector uses.\\n\\nFor more information about connectors provided by AWS , see [Greengrass Connectors Provided by AWS](https://docs.aws.amazon.com/greengrass/latest/developerguide/connectors-list.html) ."}},"AWS::Greengrass::CoreDefinition":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `CoreDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/cores/1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","Id":"The ID of the `CoreDefinition` , such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","LatestVersionArn":"The ARN of the last `CoreDefinitionVersion` that was added to the `CoreDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/cores/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` .","Name":"The name of the `CoreDefinition` , such as `MyCoreDefinition` .","Ref":"`Ref` returns the ID of the core definition, such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` ."},"description":"The `AWS::Greengrass::CoreDefinition` resource represents a core definition for AWS IoT Greengrass . Core definitions are used to organize your core definition versions.\\n\\nCore definitions can reference multiple core definition versions. All core definition versions must be associated with a core definition. Each core definition version can contain one Greengrass core.\\n\\n> When you create a core definition, you can optionally include an initial core definition version. To associate a core definition version later, create an [`AWS::Greengrass::CoreDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinitionversion.html) resource and specify the ID of this core definition.\\n> \\n> After you create the core definition version that contains the core you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"InitialVersion":"The core definition version to include when the core definition is created. Currently, a core definition version can contain only one [`core`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html) .\\n\\n> To associate a core definition version after the core definition is created, create an [`AWS::Greengrass::CoreDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinitionversion.html) resource and specify the ID of this core definition.","Name":"The name of the core definition.","Tags":"Application-specific metadata to attach to the core definition. You can use tags in IAM policies to control access to AWS IoT Greengrass resources. You can also use tags to categorize your resources. For more information, see [Tagging Your AWS IoT Greengrass Resources](https://docs.aws.amazon.com/greengrass/latest/developerguide/tagging.html) in the *Developer Guide* .\\n\\nThis `Json` property type is processed as a map of key-value pairs. It uses the following format, which is different from most `Tags` implementations in AWS CloudFormation templates.\\n\\n```json\\n\\"Tags\\": { \\"KeyName0\\": \\"value\\", \\"KeyName1\\": \\"value\\", \\"KeyName2\\": \\"value\\"\\n}\\n```"}},"AWS::Greengrass::CoreDefinition.Core":{"attributes":{},"description":"A core is an AWS IoT device that runs the AWS IoT Greengrass core software and manages local processes for a Greengrass group. For more information, see [What Is AWS IoT Greengrass ?](https://docs.aws.amazon.com/greengrass/latest/developerguide/what-is-gg.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Cores` property of the [`CoreDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-coredefinitionversion.html) property type contains a list of `Core` property types. Currently, the list can contain only one core.","properties":{"CertificateArn":"The Amazon Resource Name (ARN) of the device certificate for the core. This X.509 certificate is used to authenticate the core with AWS IoT and AWS IoT Greengrass services.","Id":"A descriptive or arbitrary ID for the core. This value must be unique within the core definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","SyncShadow":"Indicates whether the core\'s local shadow is synced with the cloud automatically. The default is false.","ThingArn":"The ARN of the core, which is an AWS IoT device (thing)."}},"AWS::Greengrass::CoreDefinition.CoreDefinitionVersion":{"attributes":{},"description":"A core definition version contains a Greengrass [core](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html) .\\n\\n> After you create a core definition version that contains the core you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) . \\n\\nIn an AWS CloudFormation template, `CoreDefinitionVersion` is the property type of the `InitialVersion` property in the [`AWS::Greengrass::CoreDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinition.html) resource.","properties":{"Cores":"The Greengrass core in this version. Currently, the `Cores` property for a core definition version can contain only one core."}},"AWS::Greengrass::CoreDefinitionVersion":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the core definition version, such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/cores/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` ."},"description":"The `AWS::Greengrass::CoreDefinitionVersion` resource represents a core definition version for AWS IoT Greengrass . A core definition version contains a Greengrass core.\\n\\n> To create a core definition version, you must specify the ID of the core definition that you want to associate with the version. For information about creating a core definition, see [`AWS::Greengrass::CoreDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinition.html) .\\n> \\n> After you create a core definition version that contains the core you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"CoreDefinitionId":"The ID of the core definition associated with this version. This value is a GUID.","Cores":"The Greengrass core in this version. Currently, the `Cores` property for a core definition version can contain only one core."}},"AWS::Greengrass::CoreDefinitionVersion.Core":{"attributes":{},"description":"A core is an AWS IoT device that runs the AWS IoT Greengrass core software and manages local processes for a Greengrass group. For more information, see [What Is AWS IoT Greengrass ?](https://docs.aws.amazon.com/greengrass/latest/developerguide/what-is-gg.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Cores` property of the [`AWS::Greengrass::CoreDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinitionversion.html) resource contains a list of `Core` property types. Currently, the list can contain only one core.","properties":{"CertificateArn":"The ARN of the device certificate for the core. This X.509 certificate is used to authenticate the core with AWS IoT and AWS IoT Greengrass services.","Id":"A descriptive or arbitrary ID for the core. This value must be unique within the core definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","SyncShadow":"Indicates whether the core\'s local shadow is synced with the cloud automatically. The default is false.","ThingArn":"The Amazon Resource Name (ARN) of the core, which is an AWS IoT device (thing)."}},"AWS::Greengrass::DeviceDefinition":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `DeviceDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/devices/1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","Id":"The ID of the `DeviceDefinition` , such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","LatestVersionArn":"The ARN of the last `DeviceDefinitionVersion` that was added to the `DeviceDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/devices/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` .","Name":"The name of the device definition.","Ref":"`Ref` returns the ID of the device definition, such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` ."},"description":"The `AWS::Greengrass::DeviceDefinition` resource represents a device definition for AWS IoT Greengrass . Device definitions are used to organize your device definition versions.\\n\\nDevice definitions can reference multiple device definition versions. All device definition versions must be associated with a device definition. Each device definition version can contain one or more devices.\\n\\n> When you create a device definition, you can optionally include an initial device definition version. To associate a device definition version later, create an [`AWS::Greengrass::DeviceDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinitionversion.html) resource and specify the ID of this device definition.\\n> \\n> After you create the device definition version that contains the devices you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"InitialVersion":"The device definition version to include when the device definition is created. A device definition version contains a list of [`device`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html) property types.\\n\\n> To associate a device definition version after the device definition is created, create an [`AWS::Greengrass::DeviceDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinitionversion.html) resource and specify the ID of this device definition.","Name":"The name of the device definition.","Tags":"Application-specific metadata to attach to the device definition. You can use tags in IAM policies to control access to AWS IoT Greengrass resources. You can also use tags to categorize your resources. For more information, see [Tagging Your AWS IoT Greengrass Resources](https://docs.aws.amazon.com/greengrass/latest/developerguide/tagging.html) in the *Developer Guide* .\\n\\nThis `Json` property type is processed as a map of key-value pairs. It uses the following format, which is different from most `Tags` implementations in AWS CloudFormation templates.\\n\\n```json\\n\\"Tags\\": { \\"KeyName0\\": \\"value\\", \\"KeyName1\\": \\"value\\", \\"KeyName2\\": \\"value\\"\\n}\\n```"}},"AWS::Greengrass::DeviceDefinition.Device":{"attributes":{},"description":"A device is an AWS IoT device (thing) that\'s added to a Greengrass group. Greengrass devices can communicate with the Greengrass core in the same group. For more information, see [What Is AWS IoT Greengrass ?](https://docs.aws.amazon.com/greengrass/latest/developerguide/what-is-gg.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Devices` property of the [`DeviceDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-devicedefinitionversion.html) property type contains a list of `Device` property types.","properties":{"CertificateArn":"The Amazon Resource Name (ARN) of the device certificate for the device. This X.509 certificate is used to authenticate the device with AWS IoT and AWS IoT Greengrass services.","Id":"A descriptive or arbitrary ID for the device. This value must be unique within the device definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","SyncShadow":"Indicates whether the device\'s local shadow is synced with the cloud automatically.","ThingArn":"The ARN of the device, which is an AWS IoT device (thing)."}},"AWS::Greengrass::DeviceDefinition.DeviceDefinitionVersion":{"attributes":{},"description":"A device definition version contains a list of [devices](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html) .\\n\\n> After you create a device definition version that contains the devices you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) . \\n\\nIn an AWS CloudFormation template, `DeviceDefinitionVersion` is the property type of the `InitialVersion` property in the [`AWS::Greengrass::DeviceDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinition.html) resource.","properties":{"Devices":"The devices in this version."}},"AWS::Greengrass::DeviceDefinitionVersion":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the device definition version, such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/devices/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` ."},"description":"The `AWS::Greengrass::DeviceDefinitionVersion` resource represents a device definition version for AWS IoT Greengrass . A device definition version contains a list of devices.\\n\\n> To create a device definition version, you must specify the ID of the device definition that you want to associate with the version. For information about creating a device definition, see [`AWS::Greengrass::DeviceDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinition.html) .\\n> \\n> After you create a device definition version that contains the devices you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"DeviceDefinitionId":"The ID of the device definition associated with this version. This value is a GUID.","Devices":"The devices in this version."}},"AWS::Greengrass::DeviceDefinitionVersion.Device":{"attributes":{},"description":"A device is an AWS IoT device (thing) that\'s added to a Greengrass group. Greengrass devices can communicate with the Greengrass core in the same group. For more information, see [What Is AWS IoT Greengrass ?](https://docs.aws.amazon.com/greengrass/latest/developerguide/what-is-gg.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Devices` property of the [`AWS::Greengrass::DeviceDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinitionversion.html) resource contains a list of `Device` property types.","properties":{"CertificateArn":"The ARN of the device certificate for the device. This X.509 certificate is used to authenticate the device with AWS IoT and AWS IoT Greengrass services.","Id":"A descriptive or arbitrary ID for the device. This value must be unique within the device definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","SyncShadow":"Indicates whether the device\'s local shadow is synced with the cloud automatically.","ThingArn":"The Amazon Resource Name (ARN) of the device, which is an AWS IoT device (thing)."}},"AWS::Greengrass::FunctionDefinition":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `FunctionDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/functions/1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","Id":"The ID of the `FunctionDefinition` , such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","LatestVersionArn":"The ARN of the last `FunctionDefinitionVersion` that was added to the `FunctionDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/functions/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` .","Name":"The name of the `FunctionDefinition` , such as `MyFunctionDefinition` .","Ref":"`Ref` returns the ID of the function definition, such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` ."},"description":"The `AWS::Greengrass::FunctionDefinition` resource represents a function definition for AWS IoT Greengrass . Function definitions are used to organize your function definition versions.\\n\\nFunction definitions can reference multiple function definition versions. All function definition versions must be associated with a function definition. Each function definition version can contain one or more functions.\\n\\n> When you create a function definition, you can optionally include an initial function definition version. To associate a function definition version later, create an [`AWS::Greengrass::FunctionDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html) resource and specify the ID of this function definition.\\n> \\n> After you create the function definition version that contains the functions you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"InitialVersion":"The function definition version to include when the function definition is created. A function definition version contains a list of [`function`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-function.html) property types.\\n\\n> To associate a function definition version after the function definition is created, create an [`AWS::Greengrass::FunctionDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html) resource and specify the ID of this function definition.","Name":"The name of the function definition.","Tags":"Application-specific metadata to attach to the function definition. You can use tags in IAM policies to control access to AWS IoT Greengrass resources. You can also use tags to categorize your resources. For more information, see [Tagging Your AWS IoT Greengrass Resources](https://docs.aws.amazon.com/greengrass/latest/developerguide/tagging.html) in the *Developer Guide* .\\n\\nThis `Json` property type is processed as a map of key-value pairs. It uses the following format, which is different from most `Tags` implementations in AWS CloudFormation templates.\\n\\n```json\\n\\"Tags\\": { \\"KeyName0\\": \\"value\\", \\"KeyName1\\": \\"value\\", \\"KeyName2\\": \\"value\\"\\n}\\n```"}},"AWS::Greengrass::FunctionDefinition.DefaultConfig":{"attributes":{},"description":"The default configuration that applies to all Lambda functions in the function definition version. Individual Lambda functions can override these settings.\\n\\nIn an AWS CloudFormation template, `DefaultConfig` is a property of the [`FunctionDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functiondefinitionversion.html) property type.","properties":{"Execution":"Configuration settings for the Lambda execution environment on the AWS IoT Greengrass core."}},"AWS::Greengrass::FunctionDefinition.Environment":{"attributes":{},"description":"The environment configuration for a Lambda function on the AWS IoT Greengrass core.\\n\\nIn an AWS CloudFormation template, `Environment` is a property of the [`FunctionConfiguration`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html) property type.","properties":{"AccessSysfs":"Indicates whether the function is allowed to access the `/sys` directory on the core device, which allows the read device information from `/sys` .\\n\\n> This property applies only to Lambda functions that run in a Greengrass container.","Execution":"Settings for the Lambda execution environment in AWS IoT Greengrass .","ResourceAccessPolicies":"A list of the [resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html) in the group that the function can access, with the corresponding read-only or read-write permissions. The maximum is 10 resources.\\n\\n> This property applies only for Lambda functions that run in a Greengrass container.","Variables":"Environment variables for the Lambda function."}},"AWS::Greengrass::FunctionDefinition.Execution":{"attributes":{},"description":"Configuration settings for the Lambda execution environment on the AWS IoT Greengrass core.\\n\\nIn an AWS CloudFormation template, `Execution` is a property of the [`DefaultConfig`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-defaultconfig.html) property type for a function definition version and the [`Environment`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html) property type for a function.","properties":{"IsolationMode":"The containerization that the Lambda function runs in. Valid values are `GreengrassContainer` or `NoContainer` . Typically, this is `GreengrassContainer` . For more information, see [Containerization](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html#lambda-function-containerization) in the *Developer Guide* .\\n\\n- When set on the [`DefaultConfig`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-defaultconfig.html) property of a function definition version, this setting is used as the default containerization for all Lambda functions in the function definition version.\\n- When set on the [`Environment`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html) property of a function, this setting applies to the individual function and overrides the default. Omit this value to run the function with the default containerization.\\n\\n> We recommend that you run in a Greengrass container unless your business case requires that you run without containerization.","RunAs":"The user and group permissions used to run the Lambda function. Typically, this is the ggc_user and ggc_group. For more information, see [Run as](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html#lambda-access-identity.html) in the *Developer Guide* .\\n\\n- When set on the [`DefaultConfig`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-defaultconfig.html) property of a function definition version, this setting is used as the default access identity for all Lambda functions in the function definition version.\\n- When set on the [`Environment`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html) property of a function, this setting applies to the individual function and overrides the default. You can override the user, group, or both. Omit this value to run the function with the default permissions.\\n\\n> Running as the root user increases risks to your data and device. Do not run as root (UID/GID=0) unless your business case requires it. For more information and requirements, see [Running a Lambda Function as Root](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html#lambda-running-as-root) ."}},"AWS::Greengrass::FunctionDefinition.Function":{"attributes":{},"description":"A function is a Lambda function that\'s referenced from an AWS IoT Greengrass group. The function is deployed to a Greengrass core where it runs locally. For more information, see [Run Lambda Functions on the AWS IoT Greengrass Core](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-functions.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Functions` property of the [`FunctionDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functiondefinitionversion.html) property type contains a list of `Function` property types.","properties":{"FunctionArn":"The Amazon Resource Name (ARN) of the alias (recommended) or version of the referenced Lambda function.","FunctionConfiguration":"The group-specific settings of the Lambda function. These settings configure the function\'s behavior in the Greengrass group.","Id":"A descriptive or arbitrary ID for the function. This value must be unique within the function definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` ."}},"AWS::Greengrass::FunctionDefinition.FunctionConfiguration":{"attributes":{},"description":"The group-specific configuration settings for a Lambda function. These settings configure the function\'s behavior in the Greengrass group. For more information, see [Controlling Execution of Greengrass Lambda Functions by Using Group-Specific Configuration](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `FunctionConfiguration` is a property of the [`Function`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-function.html) property type.","properties":{"EncodingType":"The expected encoding type of the input payload for the function. Valid values are `json` (default) and `binary` .","Environment":"The environment configuration of the function.","ExecArgs":"The execution arguments.","Executable":"The name of the function executable.","MemorySize":"The memory size (in KB) required by the function.\\n\\n> This property applies only to Lambda functions that run in a Greengrass container.","Pinned":"Indicates whether the function is pinned (or *long-lived* ). Pinned functions start when the core starts and process all requests in the same container. The default value is false.","Timeout":"The allowed execution time (in seconds) after which the function should terminate. For pinned functions, this timeout applies for each request."}},"AWS::Greengrass::FunctionDefinition.FunctionDefinitionVersion":{"attributes":{},"description":"A function definition version contains a list of functions.\\n\\n> After you create a function definition version that contains the functions you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) . \\n\\nIn an AWS CloudFormation template, `FunctionDefinitionVersion` is the property type of the `InitialVersion` property in the [`AWS::Greengrass::FunctionDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinition.html) resource.","properties":{"DefaultConfig":"The default configuration that applies to all Lambda functions in the group. Individual Lambda functions can override these settings.","Functions":"The functions in this version."}},"AWS::Greengrass::FunctionDefinition.ResourceAccessPolicy":{"attributes":{},"description":"A list of the [resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html) in the group that the function can access, with the corresponding read-only or read-write permissions. The maximum is 10 resources.\\n\\n> This property applies only to Lambda functions that run in a Greengrass container. \\n\\nIn an AWS CloudFormation template, `ResourceAccessPolicy` is a property of the [`Environment`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html) property type.","properties":{"Permission":"The read-only or read-write access that the Lambda function has to the resource. Valid values are `ro` or `rw` .","ResourceId":"The ID of the resource. This ID is assigned to the resource when you create the resource definition."}},"AWS::Greengrass::FunctionDefinition.RunAs":{"attributes":{},"description":"The access identity whose permissions are used to run the Lambda function. This setting overrides the default access identity that\'s specified for the group (by default, ggc_user and ggc_group). You can override the user, group, or both. For more information, see [Run as](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html#lambda-access-identity.html) in the *Developer Guide* .\\n\\n> Running as the root user increases risks to your data and device. Do not run as root (UID/GID=0) unless your business case requires it. For more information and requirements, see [Running a Lambda Function as Root](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html#lambda-running-as-root) . \\n\\nIn an AWS CloudFormation template, `RunAs` is a property of the [`Execution`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-execution.html) property type.","properties":{"Gid":"The group ID whose permissions are used to run the Lambda function. You can use the `getent group` command on your core device to look up the group ID.","Uid":"The user ID whose permissions are used to run the Lambda function. You can use the `getent passwd` command on your core device to look up the user ID."}},"AWS::Greengrass::FunctionDefinitionVersion":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the function definition version, such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/functions/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` ."},"description":"The `AWS::Greengrass::FunctionDefinitionVersion` resource represents a function definition version for AWS IoT Greengrass . A function definition version contains contain a list of functions.\\n\\n> To create a function definition version, you must specify the ID of the function definition that you want to associate with the version. For information about creating a function definition, see [`AWS::Greengrass::FunctionDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinition.html) .\\n> \\n> After you create a function definition version that contains the functions you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"DefaultConfig":"The default configuration that applies to all Lambda functions in the group. Individual Lambda functions can override these settings.","FunctionDefinitionId":"The ID of the function definition associated with this version. This value is a GUID.","Functions":"The functions in this version."}},"AWS::Greengrass::FunctionDefinitionVersion.DefaultConfig":{"attributes":{},"description":"The default configuration that applies to all Lambda functions in the function definition version. Individual Lambda functions can override these settings.\\n\\nIn an AWS CloudFormation template, `DefaultConfig` is a property of the [`AWS::Greengrass::FunctionDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html) resource.","properties":{"Execution":"Configuration settings for the Lambda execution environment on the AWS IoT Greengrass core."}},"AWS::Greengrass::FunctionDefinitionVersion.Environment":{"attributes":{},"description":"The environment configuration for a Lambda function on the AWS IoT Greengrass core.\\n\\nIn an AWS CloudFormation template, `Environment` is a property of the [`FunctionConfiguration`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html) property type.","properties":{"AccessSysfs":"Indicates whether the function is allowed to access the `/sys` directory on the core device, which allows the read device information from `/sys` .\\n\\n> This property applies only to Lambda functions that run in a Greengrass container.","Execution":"Settings for the Lambda execution environment in AWS IoT Greengrass .","ResourceAccessPolicies":"A list of the [resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html) in the group that the function can access, with the corresponding read-only or read-write permissions. The maximum is 10 resources.\\n\\n> This property applies only to Lambda functions that run in a Greengrass container.","Variables":"Environment variables for the Lambda function."}},"AWS::Greengrass::FunctionDefinitionVersion.Execution":{"attributes":{},"description":"Configuration settings for the Lambda execution environment on the AWS IoT Greengrass core.\\n\\nIn an AWS CloudFormation template, `Execution` is a property of the [`DefaultConfig`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-defaultconfig.html) property type for a function definition version and the [`Environment`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html) property type for a function.","properties":{"IsolationMode":"The containerization that the Lambda function runs in. Valid values are `GreengrassContainer` or `NoContainer` . Typically, this is `GreengrassContainer` . For more information, see [Containerization](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html#lambda-function-containerization) in the *Developer Guide* .\\n\\n- When set on the [`DefaultConfig`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-defaultconfig.html) property of a function definition version, this setting is used as the default containerization for all Lambda functions in the function definition version.\\n- When set on the [`Environment`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html) property of a function, this setting applies to the individual function and overrides the default. Omit this value to run the function with the default containerization.\\n\\n> We recommend that you run in a Greengrass container unless your business case requires that you run without containerization.","RunAs":"The user and group permissions used to run the Lambda function. Typically, this is the ggc_user and ggc_group. For more information, see [Run as](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html#lambda-access-identity.html) in the *Developer Guide* .\\n\\n- When set on the [`DefaultConfig`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-defaultconfig.html) property of a function definition version, this setting is used as the default access identity for all Lambda functions in the function definition version.\\n- When set on the [`Environment`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html) property of a function, this setting applies to the individual function and overrides the default. You can override the user, group, or both. Omit this value to run the function with the default permissions.\\n\\n> Running as the root user increases risks to your data and device. Do not run as root (UID/GID=0) unless your business case requires it. For more information and requirements, see [Running a Lambda Function as Root](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html#lambda-running-as-root) ."}},"AWS::Greengrass::FunctionDefinitionVersion.Function":{"attributes":{},"description":"A function is a Lambda function that\'s referenced from an AWS IoT Greengrass group. The function is deployed to a Greengrass core where it runs locally. For more information, see [Run Lambda Functions on the AWS IoT Greengrass Core](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-functions.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Functions` property of the [`AWS::Greengrass::FunctionDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html) resource contains a list of `Function` property types.","properties":{"FunctionArn":"The Amazon Resource Name (ARN) of the alias (recommended) or version of the referenced Lambda function.","FunctionConfiguration":"The group-specific settings of the Lambda function. These settings configure the function\'s behavior in the Greengrass group.","Id":"A descriptive or arbitrary ID for the function. This value must be unique within the function definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` ."}},"AWS::Greengrass::FunctionDefinitionVersion.FunctionConfiguration":{"attributes":{},"description":"The group-specific configuration settings for a Lambda function. These settings configure the function\'s behavior in the Greengrass group. For more information, see [Controlling Execution of Greengrass Lambda Functions by Using Group-Specific Configuration](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `FunctionConfiguration` is a property of the [`Function`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-function.html) property type.","properties":{"EncodingType":"The expected encoding type of the input payload for the function. Valid values are `json` (default) and `binary` .","Environment":"The environment configuration of the function.","ExecArgs":"The execution arguments.","Executable":"The name of the function executable.","MemorySize":"The memory size (in KB) required by the function.\\n\\n> This property applies only to Lambda functions that run in a Greengrass container.","Pinned":"Indicates whether the function is pinned (or *long-lived* ). Pinned functions start when the core starts and process all requests in the same container. The default value is false.","Timeout":"The allowed execution time (in seconds) after which the function should terminate. For pinned functions, this timeout applies for each request."}},"AWS::Greengrass::FunctionDefinitionVersion.ResourceAccessPolicy":{"attributes":{},"description":"A list of the [resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html) in the group that the function can access, with the corresponding read-only or read-write permissions. The maximum is 10 resources.\\n\\n> This property applies only to Lambda functions that run in a Greengrass container. \\n\\nIn an AWS CloudFormation template, `ResourceAccessPolicy` is a property of the [`Environment`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html) property type.","properties":{"Permission":"The read-only or read-write access that the Lambda function has to the resource. Valid values are `ro` or `rw` .","ResourceId":"The ID of the resource. This ID is assigned to the resource when you create the resource definition."}},"AWS::Greengrass::FunctionDefinitionVersion.RunAs":{"attributes":{},"description":"The user and group permissions used to run the Lambda function. This setting overrides the default access identity that\'s specified for the group (by default, ggc_user and ggc_group). You can override the user, group, or both. For more information, see [Run as](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html#lambda-access-identity.html) in the *Developer Guide* .\\n\\n> Running as the root user increases risks to your data and device. Do not run as root (UID/GID=0) unless your business case requires it. For more information and requirements, see [Running a Lambda Function as Root](https://docs.aws.amazon.com/greengrass/latest/developerguide/lambda-group-config.html#lambda-running-as-root) . \\n\\nIn an AWS CloudFormation template, `RunAs` is a property of the [`Execution`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-execution.html) property type.","properties":{"Gid":"The group ID whose permissions are used to run the Lambda function. You can use the `getent group` command on your core device to look up the group ID.","Uid":"The user ID whose permissions are used to run the Lambda function. You can use the `getent passwd` command on your core device to look up the user ID."}},"AWS::Greengrass::Group":{"attributes":{"Arn":"The ARN of the `Group` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/groups/1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","Id":"The ID of the `Group` , such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","LatestVersionArn":"The ARN of the last `GroupVersion` that was added to the `Group` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/groups/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` .","Name":"The name of the `Group` , such as `MyGroup` .","Ref":"`Ref` returns the ID of the group, such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","RoleArn":"The ARN of the IAM role that\'s attached to the `Group` , such as `arn:aws:iam:: :role/role-name` .","RoleAttachedAt":"The time (in milliseconds since the epoch) when the group role was attached to the `Group` ."},"description":"AWS IoT Greengrass seamlessly extends AWS to edge devices so they can act locally on the data they generate, while still using the cloud for management, analytics, and durable storage. With AWS IoT Greengrass , connected devices can run AWS Lambda functions, execute predictions based on machine learning models, keep device data in sync, and communicate with other devices securely – even when not connected to the internet. For more information, see the [Developer Guide](https://docs.aws.amazon.com/greengrass/latest/developerguide/what-is-gg.html) .\\n\\n> For AWS Region support, see [AWS CloudFormation Support for AWS IoT Greengrass](https://docs.aws.amazon.com/greengrass/latest/developerguide/cloudformation-support.html) in the *Developer Guide* . \\n\\nThe `AWS::Greengrass::Group` resource represents a group in AWS IoT Greengrass . In the AWS IoT Greengrass API, groups are used to organize your group versions.\\n\\nGroups can reference multiple group versions. All group versions must be associated with a group. A group version references a device definition version, subscription definition version, and other version types that contain the components you want to deploy to a Greengrass core device.\\n\\nTo deploy a group version, the group version must reference a core definition version that contains one core. Other version types are optionally included, depending on your business need.\\n\\n> When you create a group, you can optionally include an initial group version. To associate a group version later, create a [`AWS::Greengrass::GroupVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html) resource and specify the ID of this group.\\n> \\n> To change group components (such as devices, subscriptions, or functions), you must create new versions. This is because versions are immutable. For example, to add a function, you create a function definition version that contains the new function (and all other functions that you want to deploy). Then you create a group version that references the new function definition version (and all other version types that you want to deploy). \\n\\n*Deploying a Group Version*\\n\\nAfter you create the group version in your AWS CloudFormation template, you can deploy it using the [`aws greengrass create-deployment`](https://docs.aws.amazon.com/greengrass/latest/apireference/createdeployment-post.html) command in the AWS CLI or from the *Greengrass* node in the AWS IoT console. To deploy a group version, you must have a Greengrass service role associated with your AWS account . For more information, see [AWS CloudFormation Support for AWS IoT Greengrass](https://docs.aws.amazon.com/greengrass/latest/developerguide/cloudformation-support.html) in the *Developer Guide* .","properties":{"InitialVersion":"The group version to include when the group is created. A group version references the Amazon Resource Name (ARN) of a core definition version, device definition version, subscription definition version, and other version types. The group version must reference a core definition version that contains one core. Other version types are optionally included, depending on your business need.\\n\\n> To associate a group version after the group is created, create an [`AWS::Greengrass::GroupVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html) resource and specify the ID of this group.","Name":"The name of the group.","RoleArn":"The Amazon Resource Name (ARN) of the IAM role attached to the group. This role contains the permissions that Lambda functions and connectors use to interact with other AWS services.","Tags":"Application-specific metadata to attach to the group. You can use tags in IAM policies to control access to AWS IoT Greengrass resources. You can also use tags to categorize your resources. For more information, see [Tagging Your AWS IoT Greengrass Resources](https://docs.aws.amazon.com/greengrass/latest/developerguide/tagging.html) in the *Developer Guide* .\\n\\nThis `Json` property type is processed as a map of key-value pairs. It uses the following format, which is different from most `Tags` implementations in AWS CloudFormation templates.\\n\\n```json\\n\\"Tags\\": { \\"KeyName0\\": \\"value\\", \\"KeyName1\\": \\"value\\", \\"KeyName2\\": \\"value\\"\\n}\\n```"}},"AWS::Greengrass::Group.GroupVersion":{"attributes":{},"description":"A group version in AWS IoT Greengrass , which references of a core definition version, device definition version, subscription definition version, and other version types that contain the components you want to deploy to a Greengrass core device. The group version must reference a core definition version that contains one core. Other version types are optionally included, depending on your business need.\\n\\nIn an AWS CloudFormation template, `GroupVersion` is the property type of the `InitialVersion` property in the [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) resource.","properties":{"ConnectorDefinitionVersionArn":"The Amazon Resource Name (ARN) of the connector definition version that contains the connectors you want to deploy with the group version.","CoreDefinitionVersionArn":"The ARN of the core definition version that contains the core you want to deploy with the group version. Currently, the core definition version can contain only one core.","DeviceDefinitionVersionArn":"The ARN of the device definition version that contains the devices you want to deploy with the group version.","FunctionDefinitionVersionArn":"The ARN of the function definition version that contains the functions you want to deploy with the group version.","LoggerDefinitionVersionArn":"The ARN of the logger definition version that contains the loggers you want to deploy with the group version.","ResourceDefinitionVersionArn":"The ARN of the resource definition version that contains the resources you want to deploy with the group version.","SubscriptionDefinitionVersionArn":"The ARN of the subscription definition version that contains the subscriptions you want to deploy with the group version."}},"AWS::Greengrass::GroupVersion":{"attributes":{"Ref":"`Ref` returns the ARN of the group version, such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/groups/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` ."},"description":"The `AWS::Greengrass::GroupVersion` resource represents a group version in AWS IoT Greengrass . A group version references a core definition version, device definition version, subscription definition version, and other version types that contain the components you want to deploy to a Greengrass core device. The group version must reference a core definition version that contains one core. Other version types are optionally included, depending on your business need.\\n\\n> To create a group version, you must specify the ID of the group that you want to associate with the version. For information about creating a group, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"ConnectorDefinitionVersionArn":"The Amazon Resource Name (ARN) of the connector definition version that contains the connectors you want to deploy with the group version.","CoreDefinitionVersionArn":"The ARN of the core definition version that contains the core you want to deploy with the group version. Currently, the core definition version can contain only one core.","DeviceDefinitionVersionArn":"The ARN of the device definition version that contains the devices you want to deploy with the group version.","FunctionDefinitionVersionArn":"The ARN of the function definition version that contains the functions you want to deploy with the group version.","GroupId":"The ID of the group associated with this version. This value is a GUID.","LoggerDefinitionVersionArn":"The ARN of the logger definition version that contains the loggers you want to deploy with the group version.","ResourceDefinitionVersionArn":"The ARN of the resource definition version that contains the resources you want to deploy with the group version.","SubscriptionDefinitionVersionArn":"The ARN of the subscription definition version that contains the subscriptions you want to deploy with the group version."}},"AWS::Greengrass::LoggerDefinition":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `LoggerDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/loggers/1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","Id":"The ID of the `LoggerDefinition` , such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","LatestVersionArn":"The ARN of the last `LoggerDefinitionVersion` that was added to the `LoggerDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/loggers/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` .","Name":"The name of the `LoggerDefinition` , such as `MyLoggerDefinition` .","Ref":"`Ref` returns the ID of the logger definition, such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` ."},"description":"The `AWS::Greengrass::LoggerDefinition` resource represents a logger definition for AWS IoT Greengrass . Logger definitions are used to organize your logger definition versions.\\n\\nLogger definitions can reference multiple logger definition versions. All logger definition versions must be associated with a logger definition. Each logger definition version can contain one or more loggers.\\n\\n> When you create a logger definition, you can optionally include an initial logger definition version. To associate a logger definition version later, create an [`AWS::Greengrass::LoggerDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinitionversion.html) resource and specify the ID of this logger definition.\\n> \\n> After you create the logger definition version that contains the loggers you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"InitialVersion":"The logger definition version to include when the logger definition is created. A logger definition version contains a list of [`logger`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html) property types.\\n\\n> To associate a logger definition version after the logger definition is created, create an [`AWS::Greengrass::LoggerDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinitionversion.html) resource and specify the ID of this logger definition.","Name":"The name of the logger definition.","Tags":"Application-specific metadata to attach to the logger definition. You can use tags in IAM policies to control access to AWS IoT Greengrass resources. You can also use tags to categorize your resources. For more information, see [Tagging Your AWS IoT Greengrass Resources](https://docs.aws.amazon.com/greengrass/latest/developerguide/tagging.html) in the *Developer Guide* .\\n\\nThis `Json` property type is processed as a map of key-value pairs. It uses the following format, which is different from most `Tags` implementations in AWS CloudFormation templates.\\n\\n```json\\n\\"Tags\\": { \\"KeyName0\\": \\"value\\", \\"KeyName1\\": \\"value\\", \\"KeyName2\\": \\"value\\"\\n}\\n```"}},"AWS::Greengrass::LoggerDefinition.Logger":{"attributes":{},"description":"A logger represents logging settings for the AWS IoT Greengrass group, which can be stored in CloudWatch and the local file system of your core device. All log entries include a timestamp, log level, and information about the event. For more information, see [Monitoring with AWS IoT Greengrass Logs](https://docs.aws.amazon.com/greengrass/latest/developerguide/greengrass-logs-overview.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Loggers` property of the [`LoggerDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-loggerdefinitionversion.html) property type contains a list of `Logger` property types.","properties":{"Component":"The source of the log event. Valid values are `GreengrassSystem` or `Lambda` . When `GreengrassSystem` is used, events from Greengrass system components are logged. When `Lambda` is used, events from user-defined Lambda functions are logged.","Id":"A descriptive or arbitrary ID for the logger. This value must be unique within the logger definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","Level":"The log-level threshold. Log events below this threshold are filtered out and aren\'t stored. Valid values are `DEBUG` , `INFO` (recommended), `WARN` , `ERROR` , or `FATAL` .","Space":"The amount of file space (in KB) to use when writing logs to the local file system. This property does not apply for CloudWatch Logs .","Type":"The storage mechanism for log events. Valid values are `FileSystem` or `AWSCloudWatch` . When `AWSCloudWatch` is used, log events are sent to CloudWatch Logs . When `FileSystem` is used, log events are stored on the local file system."}},"AWS::Greengrass::LoggerDefinition.LoggerDefinitionVersion":{"attributes":{},"description":"A logger definition version contains a list of [loggers](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html) .\\n\\n> After you create a logger definition version that contains the loggers you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) . \\n\\nIn an AWS CloudFormation template, `LoggerDefinitionVersion` is the property type of the `InitialVersion` property in the [`AWS::Greengrass::LoggerDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinition.html) resource.","properties":{"Loggers":"The loggers in this version."}},"AWS::Greengrass::LoggerDefinitionVersion":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the logger definition version, such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/loggers/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` ."},"description":"The `AWS::Greengrass::LoggerDefinitionVersion` resource represents a logger definition version for AWS IoT Greengrass . A logger definition version contains a list of loggers.\\n\\n> To create a logger definition version, you must specify the ID of the logger definition that you want to associate with the version. For information about creating a logger definition, see [`AWS::Greengrass::LoggerDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinition.html) .\\n> \\n> After you create a logger definition version that contains the loggers you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"LoggerDefinitionId":"The ID of the logger definition associated with this version. This value is a GUID.","Loggers":"The loggers in this version."}},"AWS::Greengrass::LoggerDefinitionVersion.Logger":{"attributes":{},"description":"A logger represents logging settings for the AWS IoT Greengrass group, which can be stored in CloudWatch and the local file system of your core device. All log entries include a timestamp, log level, and information about the event. For more information, see [Monitoring with AWS IoT Greengrass Logs](https://docs.aws.amazon.com/greengrass/latest/developerguide/greengrass-logs-overview.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Loggers` property of the [`AWS::Greengrass::LoggerDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinitionversion.html) resource contains a list of `Logger` property types.","properties":{"Component":"The source of the log event. Valid values are `GreengrassSystem` or `Lambda` . When `GreengrassSystem` is used, events from Greengrass system components are logged. When `Lambda` is used, events from user-defined Lambda functions are logged.","Id":"A descriptive or arbitrary ID for the logger. This value must be unique within the logger definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","Level":"The log-level threshold. Log events below this threshold are filtered out and aren\'t stored. Valid values are `DEBUG` , `INFO` (recommended), `WARN` , `ERROR` , or `FATAL` .","Space":"The amount of file space (in KB) to use when writing logs to the local file system. This property does not apply for CloudWatch Logs .","Type":"The storage mechanism for log events. Valid values are `FileSystem` or `AWSCloudWatch` . When `AWSCloudWatch` is used, log events are sent to CloudWatch Logs . When `FileSystem` is used, log events are stored on the local file system."}},"AWS::Greengrass::ResourceDefinition":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `ResourceDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/resources/1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","Id":"The ID of the `ResourceDefinition` , such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","LatestVersionArn":"The ARN of the last `ResourceDefinitionVersion` that was added to the `ResourceDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/resources/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` .","Name":"The name of the `ResourceDefinition` , such as `MyResourceDefinition` .","Ref":"`Ref` returns the ID of the resource definition, such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` ."},"description":"The `AWS::Greengrass::ResourceDefinition` resource represents a resource definition for AWS IoT Greengrass . Resource definitions are used to organize your resource definition versions.\\n\\nResource definitions can reference multiple resource definition versions. All resource definition versions must be associated with a resource definition. Each resource definition version can contain one or more resources. (In AWS CloudFormation , resources are named *resource instances* .)\\n\\n> When you create a resource definition, you can optionally include an initial resource definition version. To associate a resource definition version later, create an [`AWS::Greengrass::ResourceDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinitionversion.html) resource and specify the ID of this resource definition.\\n> \\n> After you create the resource definition version that contains the resources you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"InitialVersion":"The resource definition version to include when the resource definition is created. A resource definition version contains a list of [`resource instance`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourceinstance.html) property types.\\n\\n> To associate a resource definition version after the resource definition is created, create an [`AWS::Greengrass::ResourceDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinitionversion.html) resource and specify the ID of this resource definition.","Name":"The name of the resource definition.","Tags":"Application-specific metadata to attach to the resource definition. You can use tags in IAM policies to control access to AWS IoT Greengrass resources. You can also use tags to categorize your resources. For more information, see [Tagging Your AWS IoT Greengrass Resources](https://docs.aws.amazon.com/greengrass/latest/developerguide/tagging.html) in the *Developer Guide* .\\n\\nThis `Json` property type is processed as a map of key-value pairs. It uses the following format, which is different from most `Tags` implementations in AWS CloudFormation templates.\\n\\n```json\\n\\"Tags\\": { \\"KeyName0\\": \\"value\\", \\"KeyName1\\": \\"value\\", \\"KeyName2\\": \\"value\\"\\n}\\n```"}},"AWS::Greengrass::ResourceDefinition.GroupOwnerSetting":{"attributes":{},"description":"Settings that define additional Linux OS group permissions to give to the Lambda function process. You can give the permissions of the Linux group that owns the resource or choose another Linux group. These permissions are in addition to the function\'s `RunAs` permissions.\\n\\nIn an AWS CloudFormation template, `GroupOwnerSetting` is a property of the [`LocalDeviceResourceData`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-localdeviceresourcedata.html) and [`LocalVolumeResourceData`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-localvolumeresourcedata.html) property types.","properties":{"AutoAddGroupOwner":"Indicates whether to give the privileges of the Linux group that owns the resource to the Lambda process. This gives the Lambda process the file access permissions of the Linux group.","GroupOwner":"The name of the Linux group whose privileges you want to add to the Lambda process. This value is ignored if `AutoAddGroupOwner` is true."}},"AWS::Greengrass::ResourceDefinition.LocalDeviceResourceData":{"attributes":{},"description":"Settings for a local device resource, which represents a file under `/dev` . For more information, see [Access Local Resources with Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-local-resources.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `LocalDeviceResourceData` can be used in the [`ResourceDataContainer`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedatacontainer.html) property type.","properties":{"GroupOwnerSetting":"Settings that define additional Linux OS group permissions to give to the Lambda function process.","SourcePath":"The local absolute path of the device resource. The source path for a device resource can refer only to a character device or block device under `/dev` ."}},"AWS::Greengrass::ResourceDefinition.LocalVolumeResourceData":{"attributes":{},"description":"Settings for a local volume resource, which represents a file or directory on the root file system. For more information, see [Access Local Resources with Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-local-resources.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `LocalVolumeResourceData` can be used in the [`ResourceDataContainer`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedatacontainer.html) property type.","properties":{"DestinationPath":"The absolute local path of the resource in the Lambda environment.","GroupOwnerSetting":"Settings that define additional Linux OS group permissions to give to the Lambda function process.","SourcePath":"The local absolute path of the volume resource on the host. The source path for a volume resource type cannot start with `/sys` ."}},"AWS::Greengrass::ResourceDefinition.ResourceDataContainer":{"attributes":{},"description":"A container for resource data, which defines the resource type. The container takes only one of the following supported resource data types: `LocalDeviceResourceData` , `LocalVolumeResourceData` , `SageMakerMachineLearningModelResourceData` , `S3MachineLearningModelResourceData` , or `SecretsManagerSecretResourceData` .\\n\\n> Only one resource type can be defined for a `ResourceDataContainer` instance. \\n\\nIn an AWS CloudFormation template, `ResourceDataContainer` is a property of the [`ResourceInstance`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourceinstance.html) property type.","properties":{"LocalDeviceResourceData":"Settings for a local device resource.","LocalVolumeResourceData":"Settings for a local volume resource.","S3MachineLearningModelResourceData":"Settings for a machine learning resource stored in Amazon S3 .","SageMakerMachineLearningModelResourceData":"Settings for a machine learning resource saved as an SageMaker training job.","SecretsManagerSecretResourceData":"Settings for a secret resource."}},"AWS::Greengrass::ResourceDefinition.ResourceDefinitionVersion":{"attributes":{},"description":"A resource definition version contains a list of resources. (In AWS CloudFormation , resources are named *resource instances* .)\\n\\n> After you create a resource definition version that contains the resources you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) . \\n\\nIn an AWS CloudFormation template, `ResourceDefinitionVersion` is the property type of the `InitialVersion` property in the [`AWS::Greengrass::ResourceDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinition.html) resource.","properties":{"Resources":"The resources in this version."}},"AWS::Greengrass::ResourceDefinition.ResourceDownloadOwnerSetting":{"attributes":{},"description":"The owner setting for a downloaded machine learning resource. For more information, see [Access Machine Learning Resources from Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-ml-resources.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `ResourceDownloadOwnerSetting` is the property type of the `OwnerSetting` property for the [`S3MachineLearningModelResourceData`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-s3machinelearningmodelresourcedata.html) and [`SageMakerMachineLearningModelResourceData`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-sagemakermachinelearningmodelresourcedata.html) property types.","properties":{"GroupOwner":"The group owner of the machine learning resource. This is the group ID (GID) of an existing Linux OS group on the system. The group\'s permissions are added to the Lambda process.","GroupPermission":"The permissions that the group owner has to the machine learning resource. Valid values are `rw` (read-write) or `ro` (read-only)."}},"AWS::Greengrass::ResourceDefinition.ResourceInstance":{"attributes":{},"description":"A local resource, machine learning resource, or secret resource. For more information, see [Access Local Resources with Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-local-resources.html) , [Perform Machine Learning Inference](https://docs.aws.amazon.com/greengrass/latest/developerguide/ml-inference.html) , and [Deploy Secrets to the AWS IoT Greengrass Core](https://docs.aws.amazon.com/greengrass/latest/developerguide/secrets.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Resources` property of the [`AWS::Greengrass::ResourceDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinition.html) resource contains a list of `ResourceInstance` property types.","properties":{"Id":"A descriptive or arbitrary ID for the resource. This value must be unique within the resource definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","Name":"The descriptive resource name, which is displayed on the AWS IoT Greengrass console. Maximum length 128 characters with pattern [a-zA-Z0-9:_-]+. This must be unique within a Greengrass group.","ResourceDataContainer":"A container for resource data. The container takes only one of the following supported resource data types: `LocalDeviceResourceData` , `LocalVolumeResourceData` , `SageMakerMachineLearningModelResourceData` , `S3MachineLearningModelResourceData` , or `SecretsManagerSecretResourceData` .\\n\\n> Only one resource type can be defined for a `ResourceDataContainer` instance."}},"AWS::Greengrass::ResourceDefinition.S3MachineLearningModelResourceData":{"attributes":{},"description":"Settings for an Amazon S3 machine learning resource. For more information, see [Perform Machine Learning Inference](https://docs.aws.amazon.com/greengrass/latest/developerguide/ml-inference.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `S3MachineLearningModelResourceData` can be used in the [`ResourceDataContainer`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedatacontainer.html) property type.","properties":{"DestinationPath":"The absolute local path of the resource inside the Lambda environment.","OwnerSetting":"The owner setting for the downloaded machine learning resource. For more information, see [Access Machine Learning Resources from Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-ml-resources.html) in the *Developer Guide* .","S3Uri":"The URI of the source model in an Amazon S3 bucket. The model package must be in `tar.gz` or `.zip` format."}},"AWS::Greengrass::ResourceDefinition.SageMakerMachineLearningModelResourceData":{"attributes":{},"description":"Settings for an Secrets Manager machine learning resource. For more information, see [Perform Machine Learning Inference](https://docs.aws.amazon.com/greengrass/latest/developerguide/ml-inference.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `SageMakerMachineLearningModelResourceData` can be used in the [`ResourceDataContainer`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedatacontainer.html) property type.","properties":{"DestinationPath":"The absolute local path of the resource inside the Lambda environment.","OwnerSetting":"The owner setting for the downloaded machine learning resource. For more information, see [Access Machine Learning Resources from Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-ml-resources.html) in the *Developer Guide* .","SageMakerJobArn":"The Amazon Resource Name (ARN) of the Amazon SageMaker training job that represents the source model."}},"AWS::Greengrass::ResourceDefinition.SecretsManagerSecretResourceData":{"attributes":{},"description":"Settings for a secret resource, which references a secret from AWS Secrets Manager . AWS IoT Greengrass stores a local, encrypted copy of the secret on the Greengrass core, where it can be securely accessed by connectors and Lambda functions. For more information, see [Deploy Secrets to the AWS IoT Greengrass Core](https://docs.aws.amazon.com/greengrass/latest/developerguide/secrets.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `SecretsManagerSecretResourceData` can be used in the [`ResourceDataContainer`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedatacontainer.html) property type.","properties":{"ARN":"The Amazon Resource Name (ARN) of the Secrets Manager secret to make available on the core. The value of the secret\'s latest version (represented by the `AWSCURRENT` staging label) is included by default.","AdditionalStagingLabelsToDownload":"The staging labels whose values you want to make available on the core, in addition to `AWSCURRENT` ."}},"AWS::Greengrass::ResourceDefinitionVersion":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the resource definition version, such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/resources/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` ."},"description":"The `AWS::Greengrass::ResourceDefinitionVersion` resource represents a resource definition version for AWS IoT Greengrass . A resource definition version contains a list of resources. (In AWS CloudFormation , resources are named *resource instances* .)\\n\\n> To create a resource definition version, you must specify the ID of the resource definition that you want to associate with the version. For information about creating a resource definition, see [`AWS::Greengrass::ResourceDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinition.html) .\\n> \\n> After you create a resource definition version that contains the resources you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"ResourceDefinitionId":"The ID of the resource definition associated with this version. This value is a GUID.","Resources":"The resources in this version."}},"AWS::Greengrass::ResourceDefinitionVersion.GroupOwnerSetting":{"attributes":{},"description":"Settings that define additional Linux OS group permissions to give to the Lambda function process. You can give the permissions of the Linux group that owns the resource or choose another Linux group. These permissions are in addition to the function\'s `RunAs` permissions.\\n\\nIn an AWS CloudFormation template, `GroupOwnerSetting` is a property of the [`LocalDeviceResourceData`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localdeviceresourcedata.html) and [`LocalVolumeResourceData`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localvolumeresourcedata.html) property types.","properties":{"AutoAddGroupOwner":"Indicates whether to give the privileges of the Linux group that owns the resource to the Lambda process. This gives the Lambda process the file access permissions of the Linux group.","GroupOwner":"The name of the Linux group whose privileges you want to add to the Lambda process. This value is ignored if `AutoAddGroupOwner` is true."}},"AWS::Greengrass::ResourceDefinitionVersion.LocalDeviceResourceData":{"attributes":{},"description":"Settings for a local device resource, which represents a file under `/dev` . For more information, see [Access Local Resources with Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-local-resources.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `LocalDeviceResourceData` can be used in the [`ResourceDataContainer`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html) property type.","properties":{"GroupOwnerSetting":"Settings that define additional Linux OS group permissions to give to the Lambda function process.","SourcePath":"The local absolute path of the device resource. The source path for a device resource can refer only to a character device or block device under `/dev` ."}},"AWS::Greengrass::ResourceDefinitionVersion.LocalVolumeResourceData":{"attributes":{},"description":"Settings for a local volume resource, which represents a file or directory on the root file system. For more information, see [Access Local Resources with Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-local-resources.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `LocalVolumeResourceData` can be used in the [`ResourceDataContainer`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html) property type.","properties":{"DestinationPath":"The absolute local path of the resource in the Lambda environment.","GroupOwnerSetting":"Settings that define additional Linux OS group permissions to give to the Lambda function process.","SourcePath":"The local absolute path of the volume resource on the host. The source path for a volume resource type cannot start with `/sys` ."}},"AWS::Greengrass::ResourceDefinitionVersion.ResourceDataContainer":{"attributes":{},"description":"A container for resource data, which defines the resource type. The container takes only one of the following supported resource data types: `LocalDeviceResourceData` , `LocalVolumeResourceData` , `SageMakerMachineLearningModelResourceData` , `S3MachineLearningModelResourceData` , or `SecretsManagerSecretResourceData` .\\n\\n> Only one resource type can be defined for a `ResourceDataContainer` instance. \\n\\nIn an AWS CloudFormation template, `ResourceDataContainer` is a property of the [`ResourceInstance`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html) property type.","properties":{"LocalDeviceResourceData":"Settings for a local device resource.","LocalVolumeResourceData":"Settings for a local volume resource.","S3MachineLearningModelResourceData":"Settings for a machine learning resource stored in Amazon S3 .","SageMakerMachineLearningModelResourceData":"Settings for a machine learning resource saved as an SageMaker training job.","SecretsManagerSecretResourceData":"Settings for a secret resource."}},"AWS::Greengrass::ResourceDefinitionVersion.ResourceDownloadOwnerSetting":{"attributes":{},"description":"The owner setting for a downloaded machine learning resource. For more information, see [Access Machine Learning Resources from Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-ml-resources.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `ResourceDownloadOwnerSetting` is the property type of the `OwnerSetting` property for the [`S3MachineLearningModelResourceData`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata.html) and [`SageMakerMachineLearningModelResourceData`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata.html) property types.","properties":{"GroupOwner":"The group owner of the machine learning resource. This is the group ID (GID) of an existing Linux OS group on the system. The group\'s permissions are added to the Lambda process.","GroupPermission":"The permissions that the group owner has to the machine learning resource. Valid values are `rw` (read-write) or `ro` (read-only)."}},"AWS::Greengrass::ResourceDefinitionVersion.ResourceInstance":{"attributes":{},"description":"A local resource, machine learning resource, or secret resource. For more information, see [Access Local Resources with Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-local-resources.html) , [Perform Machine Learning Inference](https://docs.aws.amazon.com/greengrass/latest/developerguide/ml-inference.html) , and [Deploy Secrets to the AWS IoT Greengrass Core](https://docs.aws.amazon.com/greengrass/latest/developerguide/secrets.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, the `Resources` property of the [`AWS::Greengrass::ResourceDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinitionversion.html) resource contains a list of `ResourceInstance` property types.","properties":{"Id":"A descriptive or arbitrary ID for the resource. This value must be unique within the resource definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","Name":"The descriptive resource name, which is displayed on the AWS IoT Greengrass console. Maximum length 128 characters with pattern [a-zA-Z0-9:_-]+. This must be unique within a Greengrass group.","ResourceDataContainer":"A container for resource data. The container takes only one of the following supported resource data types: `LocalDeviceResourceData` , `LocalVolumeResourceData` , `SageMakerMachineLearningModelResourceData` , `S3MachineLearningModelResourceData` , or `SecretsManagerSecretResourceData` .\\n\\n> Only one resource type can be defined for a `ResourceDataContainer` instance."}},"AWS::Greengrass::ResourceDefinitionVersion.S3MachineLearningModelResourceData":{"attributes":{},"description":"Settings for an Amazon S3 machine learning resource. For more information, see [Perform Machine Learning Inference](https://docs.aws.amazon.com/greengrass/latest/developerguide/ml-inference.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `S3MachineLearningModelResourceData` can be used in the [`ResourceDataContainer`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html) property type.","properties":{"DestinationPath":"The absolute local path of the resource inside the Lambda environment.","OwnerSetting":"The owner setting for the downloaded machine learning resource. For more information, see [Access Machine Learning Resources from Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-ml-resources.html) in the *Developer Guide* .","S3Uri":"The URI of the source model in an Amazon S3 bucket. The model package must be in `tar.gz` or `.zip` format."}},"AWS::Greengrass::ResourceDefinitionVersion.SageMakerMachineLearningModelResourceData":{"attributes":{},"description":"Settings for an Secrets Manager machine learning resource. For more information, see [Perform Machine Learning Inference](https://docs.aws.amazon.com/greengrass/latest/developerguide/ml-inference.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `SageMakerMachineLearningModelResourceData` can be used in the [`ResourceDataContainer`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html) property type.","properties":{"DestinationPath":"The absolute local path of the resource inside the Lambda environment.","OwnerSetting":"The owner setting for the downloaded machine learning resource. For more information, see [Access Machine Learning Resources from Lambda Functions](https://docs.aws.amazon.com/greengrass/latest/developerguide/access-ml-resources.html) in the *Developer Guide* .","SageMakerJobArn":"The Amazon Resource Name (ARN) of the Amazon SageMaker training job that represents the source model."}},"AWS::Greengrass::ResourceDefinitionVersion.SecretsManagerSecretResourceData":{"attributes":{},"description":"Settings for a secret resource, which references a secret from AWS Secrets Manager . AWS IoT Greengrass stores a local, encrypted copy of the secret on the Greengrass core, where it can be securely accessed by connectors and Lambda functions. For more information, see [Deploy Secrets to the AWS IoT Greengrass Core](https://docs.aws.amazon.com/greengrass/latest/developerguide/secrets.html) in the *Developer Guide* .\\n\\nIn an AWS CloudFormation template, `SecretsManagerSecretResourceData` can be used in the [`ResourceDataContainer`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html) property type.","properties":{"ARN":"The Amazon Resource Name (ARN) of the Secrets Manager secret to make available on the core. The value of the secret\'s latest version (represented by the `AWSCURRENT` staging label) is included by default.","AdditionalStagingLabelsToDownload":"The staging labels whose values you want to make available on the core, in addition to `AWSCURRENT` ."}},"AWS::Greengrass::SubscriptionDefinition":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `SubscriptionDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/subscriptions/1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","Id":"The ID of the `SubscriptionDefinition` , such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` .","LatestVersionArn":"The ARN of the last `SubscriptionDefinitionVersion` that was added to the `SubscriptionDefinition` , such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/subscriptions/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` .","Name":"The name of the `SubscriptionDefinition` , such as `MySubscriptionDefinition` .","Ref":"`Ref` returns the ID of the subscription definition, such as `1234a5b6-78cd-901e-2fgh-3i45j6k178l9` ."},"description":"The `AWS::Greengrass::SubscriptionDefinition` resource represents a subscription definition for AWS IoT Greengrass . Subscription definitions are used to organize your subscription definition versions.\\n\\nSubscription definitions can reference multiple subscription definition versions. All subscription definition versions must be associated with a subscription definition. Each subscription definition version can contain one or more subscriptions.\\n\\n> When you create a subscription definition, you can optionally include an initial subscription definition version. To associate a subscription definition version later, create an [`AWS::Greengrass::SubscriptionDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinitionversion.html) resource and specify the ID of this subscription definition.\\n> \\n> After you create the subscription definition version that contains the subscriptions you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"InitialVersion":"The subscription definition version to include when the subscription definition is created. A subscription definition version contains a list of [`subscription`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html) property types.\\n\\n> To associate a subscription definition version after the subscription definition is created, create an [`AWS::Greengrass::SubscriptionDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinitionversion.html) resource and specify the ID of this subscription definition.","Name":"The name of the subscription definition.","Tags":"Application-specific metadata to attach to the subscription definition. You can use tags in IAM policies to control access to AWS IoT Greengrass resources. You can also use tags to categorize your resources. For more information, see [Tagging Your AWS IoT Greengrass Resources](https://docs.aws.amazon.com/greengrass/latest/developerguide/tagging.html) in the *Developer Guide* .\\n\\nThis `Json` property type is processed as a map of key-value pairs. It uses the following format, which is different from most `Tags` implementations in AWS CloudFormation templates.\\n\\n```json\\n\\"Tags\\": { \\"KeyName0\\": \\"value\\", \\"KeyName1\\": \\"value\\", \\"KeyName2\\": \\"value\\"\\n}\\n```"}},"AWS::Greengrass::SubscriptionDefinition.Subscription":{"attributes":{},"description":"Subscriptions define how MQTT messages can be exchanged between devices, functions, and connectors in the group, and with AWS IoT or the local shadow service. A subscription defines a message source, message target, and a topic (or subject) that\'s used to route messages from the source to the target. A subscription defines the message flow in one direction, from the source to the target. For two-way communication, you must set up two subscriptions, one for each direction.\\n\\nIn an AWS CloudFormation template, the `Subscriptions` property of the [`SubscriptionDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscriptiondefinitionversion.html) property type contains a list of `Subscription` property types.","properties":{"Id":"A descriptive or arbitrary ID for the subscription. This value must be unique within the subscription definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","Source":"The originator of the message. The value can be a thing ARN, the ARN of a Lambda function alias (recommended) or version, a connector ARN, `cloud` (which represents the AWS IoT cloud), or `GGShadowService` .","Subject":"The MQTT topic used to route the message.","Target":"The destination of the message. The value can be a thing ARN, the ARN of a Lambda function alias (recommended) or version, a connector ARN, `cloud` (which represents the AWS IoT cloud), or `GGShadowService` ."}},"AWS::Greengrass::SubscriptionDefinition.SubscriptionDefinitionVersion":{"attributes":{},"description":"A subscription definition version contains a list of [subscriptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html) .\\n\\n> After you create a subscription definition version that contains the subscriptions you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) . \\n\\nIn an AWS CloudFormation template, `SubscriptionDefinitionVersion` is the property type of the `InitialVersion` property in the [`AWS::Greengrass::SubscriptionDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinition.html) resource.","properties":{"Subscriptions":"The subscriptions in this version."}},"AWS::Greengrass::SubscriptionDefinitionVersion":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the subscription definition version, such as `arn:aws:greengrass:us-east-1: :/greengrass/definition/subscriptions/1234a5b6-78cd-901e-2fgh-3i45j6k178l9/versions/9876ac30-4bdb-4f9d-95af-b5fdb66be1a2` ."},"description":"The `AWS::Greengrass::SubscriptionDefinitionVersion` resource represents a subscription definition version for AWS IoT Greengrass . A subscription definition version contains a list of subscriptions.\\n\\n> To create a subscription definition version, you must specify the ID of the subscription definition that you want to associate with the version. For information about creating a subscription definition, see [`AWS::Greengrass::SubscriptionDefinition`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinition.html) .\\n> \\n> After you create a subscription definition version that contains the subscriptions you want to deploy, you must add it to your group version. For more information, see [`AWS::Greengrass::Group`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html) .","properties":{"SubscriptionDefinitionId":"The ID of the subscription definition associated with this version. This value is a GUID.","Subscriptions":"The subscriptions in this version."}},"AWS::Greengrass::SubscriptionDefinitionVersion.Subscription":{"attributes":{},"description":"Subscriptions define how MQTT messages can be exchanged between devices, functions, and connectors in the group, and with AWS IoT or the local shadow service. A subscription defines a message source, message target, and a topic (or subject) that\'s used to route messages from the source to the target. A subscription defines the message flow in one direction, from the source to the target. For two-way communication, you must set up two subscriptions, one for each direction.\\n\\nIn an AWS CloudFormation template, the `Subscriptions` property of the [`AWS::Greengrass::SubscriptionDefinitionVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinitionversion.html) resource contains a list of `Subscription` property types.","properties":{"Id":"A descriptive or arbitrary ID for the subscription. This value must be unique within the subscription definition version. Maximum length is 128 characters with pattern `[a-zA-Z0-9:_-]+` .","Source":"The originator of the message. The value can be a thing ARN, the ARN of a Lambda function alias (recommended) or version, a connector ARN, `cloud` (which represents the AWS IoT cloud), or `GGShadowService` .","Subject":"The MQTT topic used to route the message.","Target":"The destination of the message. The value can be a thing ARN, the ARN of a Lambda function alias (recommended) or version, a connector ARN, `cloud` (which represents the AWS IoT cloud), or `GGShadowService` ."}},"AWS::GreengrassV2::ComponentVersion":{"attributes":{"Arn":"The ARN of the component version.","ComponentName":"The name of the component.","ComponentVersion":"The version of the component.","Ref":"`Ref` returns the `Arn` ."},"description":"Creates a component. Components are software that run on AWS IoT Greengrass core devices. After you develop and test a component on your core device, you can use this operation to upload your component to AWS IoT Greengrass . Then, you can deploy the component to other core devices.\\n\\nYou can use this operation to do the following:\\n\\n- *Create components from recipes*\\n\\nCreate a component from a recipe, which is a file that defines the component\'s metadata, parameters, dependencies, lifecycle, artifacts, and platform capability. For more information, see [AWS IoT Greengrass component recipe reference](https://docs.aws.amazon.com/greengrass/v2/developerguide/component-recipe-reference.html) in the *AWS IoT Greengrass V2 Developer Guide* .\\n\\nTo create a component from a recipe, specify `inlineRecipe` when you call this operation.\\n- *Create components from Lambda functions*\\n\\nCreate a component from an AWS Lambda function that runs on AWS IoT Greengrass . This creates a recipe and artifacts from the Lambda function\'s deployment package. You can use this operation to migrate Lambda functions from AWS IoT Greengrass V1 to AWS IoT Greengrass V2 .\\n\\nThis function only accepts Lambda functions that use the following runtimes:\\n\\n- Python 2.7 – `python2.7`\\n- Python 3.7 – `python3.7`\\n- Python 3.8 – `python3.8`\\n- Java 8 – `java8`\\n- Node.js 10 – `nodejs10.x`\\n- Node.js 12 – `nodejs12.x`\\n\\nTo create a component from a Lambda function, specify `lambdaFunction` when you call this operation.","properties":{"InlineRecipe":"The recipe to use to create the component. The recipe defines the component\'s metadata, parameters, dependencies, lifecycle, artifacts, and platform compatibility.\\n\\nYou must specify either `InlineRecipe` or `LambdaFunction` .","LambdaFunction":"The parameters to create a component from a Lambda function.\\n\\nYou must specify either `InlineRecipe` or `LambdaFunction` .","Tags":"Application-specific metadata to attach to the component version. You can use tags in IAM policies to control access to AWS IoT Greengrass resources. You can also use tags to categorize your resources. For more information, see [Tag your AWS IoT Greengrass Version 2 resources](https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html) in the *AWS IoT Greengrass V2 Developer Guide* .\\n\\nThis `Json` property type is processed as a map of key-value pairs. It uses the following format, which is different from most `Tags` implementations in AWS CloudFormation templates.\\n\\n```json\\n\\"Tags\\": { \\"KeyName0\\": \\"value\\", \\"KeyName1\\": \\"value\\", \\"KeyName2\\": \\"value\\"\\n}\\n```"}},"AWS::GreengrassV2::ComponentVersion.ComponentDependencyRequirement":{"attributes":{},"description":"Contains information about a component dependency for a Lambda function component.","properties":{"DependencyType":"The type of this dependency. Choose from the following options:\\n\\n- `SOFT` – The component doesn\'t restart if the dependency changes state.\\n- `HARD` – The component restarts if the dependency changes state.\\n\\nDefault: `HARD`","VersionRequirement":"The component version requirement for the component dependency.\\n\\nAWS IoT Greengrass uses semantic version constraints. For more information, see [Semantic Versioning](https://docs.aws.amazon.com/https://semver.org/) ."}},"AWS::GreengrassV2::ComponentVersion.ComponentPlatform":{"attributes":{},"description":"Contains information about a platform that a component supports.","properties":{"Attributes":"A dictionary of attributes for the platform. The AWS IoT Greengrass Core software defines the `os` and `platform` by default. You can specify additional platform attributes for a core device when you deploy the AWS IoT Greengrass nucleus component. For more information, see the [AWS IoT Greengrass nucleus component](https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-nucleus-component.html) in the *AWS IoT Greengrass V2 Developer Guide* .","Name":"The friendly name of the platform. This name helps you identify the platform.\\n\\nIf you omit this parameter, AWS IoT Greengrass creates a friendly name from the `os` and `architecture` of the platform."}},"AWS::GreengrassV2::ComponentVersion.LambdaContainerParams":{"attributes":{},"description":"Contains information about a container in which AWS Lambda functions run on AWS IoT Greengrass core devices.","properties":{"Devices":"The list of system devices that the container can access.","MemorySizeInKB":"The memory size of the container, expressed in kilobytes.\\n\\nDefault: `16384` (16 MB)","MountROSysfs":"Whether or not the container can read information from the device\'s `/sys` folder.\\n\\nDefault: `false`","Volumes":"The list of volumes that the container can access."}},"AWS::GreengrassV2::ComponentVersion.LambdaDeviceMount":{"attributes":{},"description":"Contains information about a device that Linux processes in a container can access.","properties":{"AddGroupOwner":"Whether or not to add the component\'s system user as an owner of the device.\\n\\nDefault: `false`","Path":"The mount path for the device in the file system.","Permission":"The permission to access the device: read/only ( `ro` ) or read/write ( `rw` ).\\n\\nDefault: `ro`"}},"AWS::GreengrassV2::ComponentVersion.LambdaEventSource":{"attributes":{},"description":"Contains information about an event source for an AWS Lambda function. The event source defines the topics on which this Lambda function subscribes to receive messages that run the function.","properties":{"Topic":"The topic to which to subscribe to receive event messages.","Type":"The type of event source. Choose from the following options:\\n\\n- `PUB_SUB` – Subscribe to local publish/subscribe messages. This event source type doesn\'t support MQTT wildcards ( `+` and `#` ) in the event source topic.\\n- `IOT_CORE` – Subscribe to AWS IoT Core MQTT messages. This event source type supports MQTT wildcards ( `+` and `#` ) in the event source topic."}},"AWS::GreengrassV2::ComponentVersion.LambdaExecutionParameters":{"attributes":{},"description":"Contains parameters for a Lambda function that runs on AWS IoT Greengrass .","properties":{"EnvironmentVariables":"The map of environment variables that are available to the Lambda function when it runs.","EventSources":"The list of event sources to which to subscribe to receive work messages. The Lambda function runs when it receives a message from an event source. You can subscribe this function to local publish/subscribe messages and AWS IoT Core MQTT messages.","ExecArgs":"The list of arguments to pass to the Lambda function when it runs.","InputPayloadEncodingType":"The encoding type that the Lambda function supports.\\n\\nDefault: `json`","LinuxProcessParams":"The parameters for the Linux process that contains the Lambda function.","MaxIdleTimeInSeconds":"The maximum amount of time in seconds that a non-pinned Lambda function can idle before the AWS IoT Greengrass Core software stops its process.","MaxInstancesCount":"The maximum number of instances that a non-pinned Lambda function can run at the same time.","MaxQueueSize":"The maximum size of the message queue for the Lambda function component. The AWS IoT Greengrass core device stores messages in a FIFO (first-in-first-out) queue until it can run the Lambda function to consume each message.","Pinned":"Whether or not the Lambda function is pinned, or long-lived.\\n\\n- A pinned Lambda function starts when the AWS IoT Greengrass Core starts and keeps running in its own container.\\n- A non-pinned Lambda function starts only when it receives a work item and exists after it idles for `maxIdleTimeInSeconds` . If the function has multiple work items, the AWS IoT Greengrass Core software creates multiple instances of the function.\\n\\nDefault: `true`","StatusTimeoutInSeconds":"The interval in seconds at which a pinned (also known as long-lived) Lambda function component sends status updates to the Lambda manager component.","TimeoutInSeconds":"The maximum amount of time in seconds that the Lambda function can process a work item."}},"AWS::GreengrassV2::ComponentVersion.LambdaFunctionRecipeSource":{"attributes":{},"description":"Contains information about an AWS Lambda function to import to create a component.","properties":{"ComponentDependencies":"The component versions on which this Lambda function component depends.","ComponentLambdaParameters":"The system and runtime parameters for the Lambda function as it runs on the AWS IoT Greengrass core device.","ComponentName":"The name of the component.\\n\\nDefaults to the name of the Lambda function.","ComponentPlatforms":"The platforms that the component version supports.","ComponentVersion":"The version of the component.\\n\\nDefaults to the version of the Lambda function as a semantic version. For example, if your function version is `3` , the component version becomes `3.0.0` .","LambdaArn":"The ARN of the Lambda function. The ARN must include the version of the function to import. You can\'t use version aliases like `$LATEST` ."}},"AWS::GreengrassV2::ComponentVersion.LambdaLinuxProcessParams":{"attributes":{},"description":"Contains parameters for a Linux process that contains an AWS Lambda function.","properties":{"ContainerParams":"The parameters for the container in which the Lambda function runs.","IsolationMode":"The isolation mode for the process that contains the Lambda function. The process can run in an isolated runtime environment inside the AWS IoT Greengrass container, or as a regular process outside any container.\\n\\nDefault: `GreengrassContainer`"}},"AWS::GreengrassV2::ComponentVersion.LambdaVolumeMount":{"attributes":{},"description":"Contains information about a volume that Linux processes in a container can access. When you define a volume, the AWS IoT Greengrass Core software mounts the source files to the destination inside the container.","properties":{"AddGroupOwner":"Whether or not to add the AWS IoT Greengrass user group as an owner of the volume.\\n\\nDefault: `false`","DestinationPath":"The path to the logical volume in the file system.","Permission":"The permission to access the volume: read/only ( `ro` ) or read/write ( `rw` ).\\n\\nDefault: `ro`","SourcePath":"The path to the physical volume in the file system."}},"AWS::GreengrassV2::Deployment":{"attributes":{"DeploymentId":"The ID of the deployment.","Ref":"`Ref` returns the `DeploymentId` ."},"description":"Creates a continuous deployment for a target, which is a AWS IoT Greengrass core device or group of core devices. When you add a new core device to a group of core devices that has a deployment, AWS IoT Greengrass deploys that group\'s deployment to the new device.\\n\\nYou can define one deployment for each target. When you create a new deployment for a target that has an existing deployment, you replace the previous deployment. AWS IoT Greengrass applies the new deployment to the target devices.\\n\\nYou can only add, update, or delete up to 10 deployments at a time to a single target.\\n\\nEvery deployment has a revision number that indicates how many deployment revisions you define for a target. Use this operation to create a new revision of an existing deployment. This operation returns the revision number of the new deployment when you create it.\\n\\nFor more information, see the [Create deployments](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-deployments.html) in the *AWS IoT Greengrass V2 Developer Guide* .\\n\\n> Deployment resources are deleted when you delete stacks. To keep the deployments in a stack, you must specify `\\"DeletionPolicy\\": \\"Retain\\"` on each deployment resource in the stack template that you want to keep. For more information, see [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) .\\n> \\n> You can only delete up to 10 deployment resources at a time. If you delete more than 10 resources, you receive an error.","properties":{"Components":"The components to deploy. This is a dictionary, where each key is the name of a component, and each key\'s value is the version and configuration to deploy for that component.","DeploymentName":"The name of the deployment.","DeploymentPolicies":"The deployment policies for the deployment. These policies define how the deployment updates components and handles failure.","IotJobConfiguration":"The job configuration for the deployment configuration. The job configuration specifies the rollout, timeout, and stop configurations for the deployment configuration.","ParentTargetArn":"The parent deployment\'s [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) for a subdeployment.","Tags":"Application-specific metadata to attach to the deployment. You can use tags in IAM policies to control access to AWS IoT Greengrass resources. You can also use tags to categorize your resources. For more information, see [Tag your AWS IoT Greengrass Version 2 resources](https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html) in the *AWS IoT Greengrass V2 Developer Guide* .\\n\\nThis `Json` property type is processed as a map of key-value pairs. It uses the following format, which is different from most `Tags` implementations in AWS CloudFormation templates.\\n\\n```json\\n\\"Tags\\": { \\"KeyName0\\": \\"value\\", \\"KeyName1\\": \\"value\\", \\"KeyName2\\": \\"value\\"\\n}\\n```","TargetArn":"The ARN of the target AWS IoT thing or thing group."}},"AWS::GreengrassV2::Deployment.ComponentConfigurationUpdate":{"attributes":{},"description":"Contains information about a deployment\'s update to a component\'s configuration on AWS IoT Greengrass core devices. For more information, see [Update component configurations](https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html) in the *AWS IoT Greengrass V2 Developer Guide* .","properties":{"Merge":"A serialized JSON string that contains the configuration object to merge to target devices. The core device merges this configuration with the component\'s existing configuration. If this is the first time a component deploys on a device, the core device merges this configuration with the component\'s default configuration. This means that the core device keeps it\'s existing configuration for keys and values that you don\'t specify in this object. For more information, see [Merge configuration updates](https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html#merge-configuration-update) in the *AWS IoT Greengrass V2 Developer Guide* .","Reset":"The list of configuration nodes to reset to default values on target devices. Use JSON pointers to specify each node to reset. JSON pointers start with a forward slash ( `/` ) and use forward slashes to separate the key for each level in the object. For more information, see the [JSON pointer specification](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc6901) and [Reset configuration updates](https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html#reset-configuration-update) in the *AWS IoT Greengrass V2 Developer Guide* ."}},"AWS::GreengrassV2::Deployment.ComponentDeploymentSpecification":{"attributes":{},"description":"Contains information about a component to deploy.","properties":{"ComponentVersion":"The version of the component.","ConfigurationUpdate":"The configuration updates to deploy for the component. You can define reset updates and merge updates. A reset updates the keys that you specify to the default configuration for the component. A merge updates the core device\'s component configuration with the keys and values that you specify. The AWS IoT Greengrass Core software applies reset updates before it applies merge updates. For more information, see [Update component configuration](https://docs.aws.amazon.com/greengrass/v2/developerguide/update-component-configurations.html) .","RunWith":"The system user and group that the software uses to run component processes on the core device. If you omit this parameter, the software uses the system user and group that you configure for the core device. For more information, see [Configure the user and group that run components](https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user) in the *AWS IoT Greengrass V2 Developer Guide* ."}},"AWS::GreengrassV2::Deployment.ComponentRunWith":{"attributes":{},"description":"Contains information system user and group that the AWS IoT Greengrass Core software uses to run component processes on the core device. For more information, see [Configure the user and group that run components](https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user) in the *AWS IoT Greengrass V2 Developer Guide* .","properties":{"PosixUser":"The POSIX system user and (optional) group to use to run this component. Specify the user and group separated by a colon ( `:` ) in the following format: `user:group` . The group is optional. If you don\'t specify a group, the AWS IoT Greengrass Core software uses the primary user for the group.","SystemResourceLimits":"The system resource limits to apply to this component\'s process on the core device. AWS IoT Greengrass supports this feature only on Linux core devices.\\n\\nIf you omit this parameter, the AWS IoT Greengrass Core software uses the default system resource limits that you configure on the AWS IoT Greengrass nucleus component. For more information, see [Configure system resource limits for components](https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-system-resource-limits) .","WindowsUser":"The Windows user to use to run this component on Windows core devices. The user must exist on each Windows core device, and its name and password must be in the LocalSystem account\'s Credentials Manager instance.\\n\\nIf you omit this parameter, the AWS IoT Greengrass Core software uses the default Windows user that you configure on the AWS IoT Greengrass nucleus component. For more information, see [Configure the user and group that run components](https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-user) ."}},"AWS::GreengrassV2::Deployment.DeploymentComponentUpdatePolicy":{"attributes":{},"description":"Contains information about a deployment\'s policy that defines when components are safe to update.\\n\\nEach component on a device can report whether or not it\'s ready to update. After a component and its dependencies are ready, they can apply the update in the deployment. You can configure whether or not the deployment notifies components of an update and waits for a response. You specify the amount of time each component has to respond to the update notification.","properties":{"Action":"Whether or not to notify components and wait for components to become safe to update. Choose from the following options:\\n\\n- `NOTIFY_COMPONENTS` – The deployment notifies each component before it stops and updates that component. Components can use the [SubscribeToComponentUpdates](https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-subscribetocomponentupdates) IPC operation to receive these notifications. Then, components can respond with the [DeferComponentUpdate](https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-defercomponentupdate) IPC operation. For more information, see the [Create deployments](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-deployments.html) in the *AWS IoT Greengrass V2 Developer Guide* .\\n- `SKIP_NOTIFY_COMPONENTS` – The deployment doesn\'t notify components or wait for them to be safe to update.\\n\\nDefault: `NOTIFY_COMPONENTS`","TimeoutInSeconds":"The amount of time in seconds that each component on a device has to report that it\'s safe to update. If the component waits for longer than this timeout, then the deployment proceeds on the device.\\n\\nDefault: `60`"}},"AWS::GreengrassV2::Deployment.DeploymentConfigurationValidationPolicy":{"attributes":{},"description":"Contains information about how long a component on a core device can validate its configuration updates before it times out. Components can use the [SubscribeToValidateConfigurationUpdates](https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-subscribetovalidateconfigurationupdates) IPC operation to receive notifications when a deployment specifies a configuration update. Then, components can respond with the [SendConfigurationValidityReport](https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-operation-sendconfigurationvalidityreport) IPC operation. For more information, see the [Create deployments](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-deployments.html) in the *AWS IoT Greengrass V2 Developer Guide* .","properties":{"TimeoutInSeconds":"The amount of time in seconds that a component can validate its configuration updates. If the validation time exceeds this timeout, then the deployment proceeds for the device.\\n\\nDefault: `30`"}},"AWS::GreengrassV2::Deployment.DeploymentIoTJobConfiguration":{"attributes":{},"description":"Contains information about an AWS IoT job configuration.","properties":{"AbortConfig":"The stop configuration for the job. This configuration defines when and how to stop a job rollout.","JobExecutionsRolloutConfig":"The rollout configuration for the job. This configuration defines the rate at which the job rolls out to the fleet of target devices.","TimeoutConfig":"The timeout configuration for the job. This configuration defines the amount of time each device has to complete the job."}},"AWS::GreengrassV2::Deployment.DeploymentPolicies":{"attributes":{},"description":"Contains information about policies that define how a deployment updates components and handles failure.","properties":{"ComponentUpdatePolicy":"The component update policy for the configuration deployment. This policy defines when it\'s safe to deploy the configuration to devices.","ConfigurationValidationPolicy":"The configuration validation policy for the configuration deployment. This policy defines how long each component has to validate its configure updates.","FailureHandlingPolicy":"The failure handling policy for the configuration deployment. This policy defines what to do if the deployment fails.\\n\\nDefault: `ROLLBACK`"}},"AWS::GreengrassV2::Deployment.IoTJobAbortConfig":{"attributes":{},"description":"Contains a list of criteria that define when and how to cancel a configuration deployment.","properties":{"CriteriaList":"The list of criteria that define when and how to cancel the configuration deployment."}},"AWS::GreengrassV2::Deployment.IoTJobAbortCriteria":{"attributes":{},"description":"Contains criteria that define when and how to cancel a job.\\n\\nThe deployment stops if the following conditions are true:\\n\\n- The number of things that receive the deployment exceeds the `minNumberOfExecutedThings` .\\n- The percentage of failures with type `failureType` exceeds the `thresholdPercentage` .","properties":{"Action":"The action to perform when the criteria are met.","FailureType":"The type of job deployment failure that can cancel a job.","MinNumberOfExecutedThings":"The minimum number of things that receive the configuration before the job can cancel.","ThresholdPercentage":"The minimum percentage of `failureType` failures that occur before the job can cancel.\\n\\nThis parameter supports up to two digits after the decimal (for example, you can specify `10.9` or `10.99` , but not `10.999` )."}},"AWS::GreengrassV2::Deployment.IoTJobExecutionsRolloutConfig":{"attributes":{},"description":"Contains information about the rollout configuration for a job. This configuration defines the rate at which the job deploys a configuration to a fleet of target devices.","properties":{"ExponentialRate":"The exponential rate to increase the job rollout rate.","MaximumPerMinute":"The maximum number of devices that receive a pending job notification, per minute."}},"AWS::GreengrassV2::Deployment.IoTJobExponentialRolloutRate":{"attributes":{},"description":"Contains information about an exponential rollout rate for a configuration deployment job.","properties":{"BaseRatePerMinute":"The minimum number of devices that receive a pending job notification, per minute, when the job starts. This parameter defines the initial rollout rate of the job.","IncrementFactor":"The exponential factor to increase the rollout rate for the job.\\n\\nThis parameter supports up to one digit after the decimal (for example, you can specify `1.5` , but not `1.55` ).","RateIncreaseCriteria":"The criteria to increase the rollout rate for the job."}},"AWS::GreengrassV2::Deployment.IoTJobRateIncreaseCriteria":{"attributes":{},"description":"Contains information about criteria to meet before a job increases its rollout rate. Specify either `numberOfNotifiedThings` or `numberOfSucceededThings` .","properties":{"NumberOfNotifiedThings":"The number of devices to receive the job notification before the rollout rate increases.","NumberOfSucceededThings":"The number of devices to successfully run the configuration job before the rollout rate increases."}},"AWS::GreengrassV2::Deployment.IoTJobTimeoutConfig":{"attributes":{},"description":"Contains information about the timeout configuration for a job.","properties":{"InProgressTimeoutInMinutes":"The amount of time, in minutes, that devices have to complete the job. The timer starts when the job status is set to `IN_PROGRESS` . If the job status doesn\'t change to a terminal state before the time expires, then the job status is set to `TIMED_OUT` .\\n\\nThe timeout interval must be between 1 minute and 7 days (10080 minutes)."}},"AWS::GreengrassV2::Deployment.SystemResourceLimits":{"attributes":{},"description":"Contains information about system resource limits that the software applies to a component\'s processes.","properties":{"Cpus":"The maximum amount of CPU time that a component\'s processes can use on the core device. A core device\'s total CPU time is equivalent to the device\'s number of CPU cores. For example, on a core device with 4 CPU cores, you can set this value to 2 to limit the component\'s processes to 50 percent usage of each CPU core. On a device with 1 CPU core, you can set this value to 0.25 to limit the component\'s processes to 25 percent usage of the CPU. If you set this value to a number greater than the number of CPU cores, the AWS IoT Greengrass Core software doesn\'t limit the component\'s CPU usage.","Memory":"The maximum amount of RAM, expressed in kilobytes, that a component\'s processes can use on the core device. For more information, see [Configure system resource limits for components](https://docs.aws.amazon.com/greengrass/v2/developerguide/configure-greengrass-core-v2.html#configure-component-system-resource-limits) ."}},"AWS::GroundStation::Config":{"attributes":{"Arn":"The ARN of the config, such as `arn:aws:groundstation:us-east-2:1234567890:config/tracking/9940bf3b-d2ba-427e-9906-842b5e5d2296` .","Id":"The ID of the config, such as `9940bf3b-d2ba-427e-9906-842b5e5d2296` .","Ref":"`Ref` returns the ARN of the config. For example:\\n\\n`{ \\"Ref\\": \\"Config\\" }`\\n\\nFor the Ground Station config, `Ref` returns the ARN of the config.","Type":"The type of the config, such as `tracking` ."},"description":"Creates a `Config` with the specified parameters.\\n\\nConfig objects provide Ground Station with the details necessary in order to schedule and execute satellite contacts.","properties":{"ConfigData":"Object containing the parameters of a config. Only one subtype may be specified per config. See the subtype definitions for a description of each config subtype.","Name":"The name of the config object.","Tags":"Tags assigned to a resource."}},"AWS::GroundStation::Config.AntennaDownlinkConfig":{"attributes":{},"description":"Provides information about how AWS Ground Station should configure an antenna for downlink during a contact. Use an antenna downlink config in a mission profile to receive the downlink data in raw DigIF format.","properties":{"SpectrumConfig":"Defines the spectrum configuration."}},"AWS::GroundStation::Config.AntennaDownlinkDemodDecodeConfig":{"attributes":{},"description":"Provides information about how AWS Ground Station should configure an antenna for downlink during a contact. Use an antenna downlink demod decode config in a mission profile to receive the downlink data that has been demodulated and decoded.","properties":{"DecodeConfig":"Defines how the RF signal will be decoded.","DemodulationConfig":"Defines how the RF signal will be demodulated.","SpectrumConfig":"Defines the spectrum configuration."}},"AWS::GroundStation::Config.AntennaUplinkConfig":{"attributes":{},"description":"Provides information about how AWS Ground Station should configure an antenna for uplink during a contact.","properties":{"SpectrumConfig":"Defines the spectrum configuration.","TargetEirp":"The equivalent isotropically radiated power (EIRP) to use for uplink transmissions. Valid values are between 20.0 to 50.0 dBW.","TransmitDisabled":"Whether or not uplink transmit is disabled."}},"AWS::GroundStation::Config.ConfigData":{"attributes":{},"description":"Config objects provide information to Ground Station about how to configure the antenna and how data flows during a contact.","properties":{"AntennaDownlinkConfig":"Provides information for an antenna downlink config object. Antenna downlink config objects are used to provide parameters for downlinks where no demodulation or decoding is performed by Ground Station (RF over IP downlinks).","AntennaDownlinkDemodDecodeConfig":"Provides information for a downlink demod decode config object. Downlink demod decode config objects are used to provide parameters for downlinks where the Ground Station service will demodulate and decode the downlinked data.","AntennaUplinkConfig":"Provides information for an uplink config object. Uplink config objects are used to provide parameters for uplink contacts.","DataflowEndpointConfig":"Provides information for a dataflow endpoint config object. Dataflow endpoint config objects are used to provide parameters about which IP endpoint(s) to use during a contact. Dataflow endpoints are where Ground Station sends data during a downlink contact and where Ground Station receives data to send to the satellite during an uplink contact.","S3RecordingConfig":"Provides information for an S3 recording config object. S3 recording config objects are used to provide parameters for S3 recording during downlink contacts.","TrackingConfig":"Provides information for a tracking config object. Tracking config objects are used to provide parameters about how to track the satellite through the sky during a contact.","UplinkEchoConfig":"Provides information for an uplink echo config object. Uplink echo config objects are used to provide parameters for uplink echo during uplink contacts."}},"AWS::GroundStation::Config.DataflowEndpointConfig":{"attributes":{},"description":"Provides information to AWS Ground Station about which IP endpoints to use during a contact.","properties":{"DataflowEndpointName":"The name of the dataflow endpoint to use during contacts.","DataflowEndpointRegion":"The region of the dataflow endpoint to use during contacts. When omitted, Ground Station will use the region of the contact."}},"AWS::GroundStation::Config.DecodeConfig":{"attributes":{},"description":"Defines decoding settings.","properties":{"UnvalidatedJSON":"The decoding settings are in JSON format and define a set of steps to perform to decode the data."}},"AWS::GroundStation::Config.DemodulationConfig":{"attributes":{},"description":"Defines demodulation settings.","properties":{"UnvalidatedJSON":"The demodulation settings are in JSON format and define parameters for demodulation, for example which modulation scheme (e.g. PSK, QPSK, etc.) and matched filter to use."}},"AWS::GroundStation::Config.Eirp":{"attributes":{},"description":"Defines an equivalent isotropically radiated power (EIRP).","properties":{"Units":"The units of the EIRP.","Value":"The value of the EIRP. Valid values are between 20.0 to 50.0 dBW."}},"AWS::GroundStation::Config.Frequency":{"attributes":{},"description":"Defines a frequency.","properties":{"Units":"The units of the frequency.","Value":"The value of the frequency. Valid values are between 2200 to 2300 MHz and 7750 to 8400 MHz for downlink and 2025 to 2120 MHz for uplink."}},"AWS::GroundStation::Config.FrequencyBandwidth":{"attributes":{},"description":"Defines a bandwidth.","properties":{"Units":"The units of the bandwidth.","Value":"The value of the bandwidth. AWS Ground Station currently has the following bandwidth limitations: \\n\\n- For `AntennaDownlinkDemodDecodeconfig` , valid values are between 125 kHz to 650 MHz.\\n- For `AntennaDownlinkconfig` , valid values are between 10 kHz to 54 MHz.\\n- For `AntennaUplinkConfig` , valid values are between 10 kHz to 54 MHz."}},"AWS::GroundStation::Config.S3RecordingConfig":{"attributes":{},"description":"Provides information about how AWS Ground Station should save downlink data to S3.","properties":{"BucketArn":"S3 Bucket where the data is written. The name of the S3 Bucket provided must begin with `aws-groundstation` .","Prefix":"The prefix of the S3 data object. If you choose to use any optional keys for substitution, these values will be replaced with the corresponding information from your contact details. For example, a prefix of `{satellite_id}/{year}/{month}/{day}/` will replaced with `fake_satellite_id/2021/01/10/`\\n\\n*Optional keys for substitution* : `{satellite_id}` | `{config-name}` | `{config-id}` | `{year}` | `{month}` | `{day}`","RoleArn":"Defines the ARN of the role assumed for putting archives to S3."}},"AWS::GroundStation::Config.SpectrumConfig":{"attributes":{},"description":"Defines a spectrum.","properties":{"Bandwidth":"The bandwidth of the spectrum. AWS Ground Station currently has the following bandwidth limitations: \\n\\n- For `AntennaDownlinkDemodDecodeconfig` , valid values are between 125 kHz to 650 MHz.\\n- For `AntennaDownlinkconfig` , valid values are between 10 kHz to 54 MHz.\\n- For `AntennaUplinkConfig` , valid values are between 10 kHz to 54 MHz.","CenterFrequency":"The center frequency of the spectrum. Valid values are between 2200 to 2300 MHz and 7750 to 8400 MHz for downlink and 2025 to 2120 MHz for uplink.","Polarization":"The polarization of the spectrum. Valid values are `\\"RIGHT_HAND\\"` and `\\"LEFT_HAND\\"` . Capturing both `\\"RIGHT_HAND\\"` and `\\"LEFT_HAND\\"` polarization requires two separate configs."}},"AWS::GroundStation::Config.TrackingConfig":{"attributes":{},"description":"Provides information about how AWS Ground Station should track the satellite through the sky during a contact.","properties":{"Autotrack":"Specifies whether or not to use autotrack. `REMOVED` specifies that program track should only be used during the contact. `PREFERRED` specifies that autotracking is preferred during the contact but fallback to program track if the signal is lost. `REQUIRED` specifies that autotracking is required during the contact and not to use program track if the signal is lost."}},"AWS::GroundStation::Config.UplinkEchoConfig":{"attributes":{},"description":"Provides information about how AWS Ground Station should echo back uplink transmissions to a dataflow endpoint.","properties":{"AntennaUplinkConfigArn":"Defines the ARN of the uplink config to echo back to a dataflow endpoint.","Enabled":"Whether or not uplink echo is enabled."}},"AWS::GroundStation::Config.UplinkSpectrumConfig":{"attributes":{},"description":"Defines a uplink spectrum.","properties":{"CenterFrequency":"The center frequency of the spectrum. Valid values are between 2200 to 2300 MHz and 7750 to 8400 MHz for downlink and 2025 to 2120 MHz for uplink.","Polarization":"The polarization of the spectrum. Valid values are `\\"RIGHT_HAND\\"` and `\\"LEFT_HAND\\"` ."}},"AWS::GroundStation::DataflowEndpointGroup":{"attributes":{"Arn":"The ARN of the dataflow endpoint group, such as `arn:aws:groundstation:us-east-2:1234567890:dataflow-endpoint-group/9940bf3b-d2ba-427e-9906-842b5e5d2296` .","Id":"UUID of a dataflow endpoint group.","Ref":"`Ref` returns the ARN of the dataflow endpoint group. For example:\\n\\n`{ \\"Ref\\": \\"DataflowEndpointGroup\\" }`\\n\\nFor the Ground Station dataflow endpoint group, `Ref` returns the ARN of the dataflow endpoint group."},"description":"Creates a Dataflow Endpoint Group request.\\n\\nDataflow endpoint groups contain a list of endpoints. When the name of a dataflow endpoint group is specified in a mission profile, the Ground Station service will connect to the endpoints and flow data during a contact.\\n\\nFor more information about dataflow endpoint groups, see [Dataflow Endpoint Groups](https://docs.aws.amazon.com/ground-station/latest/ug/dataflowendpointgroups.html) .","properties":{"ContactPostPassDurationSeconds":"Amount of time, in seconds, after a contact ends that the Ground Station Dataflow Endpoint Group will be in a `POSTPASS` state. A Ground Station Dataflow Endpoint Group State Change event will be emitted when the Dataflow Endpoint Group enters and exits the `POSTPASS` state.","ContactPrePassDurationSeconds":"Amount of time, in seconds, before a contact starts that the Ground Station Dataflow Endpoint Group will be in a `PREPASS` state. A Ground Station Dataflow Endpoint Group State Change event will be emitted when the Dataflow Endpoint Group enters and exits the `PREPASS` state.","EndpointDetails":"List of Endpoint Details, containing address and port for each endpoint.","Tags":"Tags assigned to a resource."}},"AWS::GroundStation::DataflowEndpointGroup.AwsGroundStationAgentEndpoint":{"attributes":{},"description":"","properties":{"AgentStatus":"","AuditResults":"","EgressAddress":"","IngressAddress":"","Name":""}},"AWS::GroundStation::DataflowEndpointGroup.ConnectionDetails":{"attributes":{},"description":"","properties":{"Mtu":"","SocketAddress":""}},"AWS::GroundStation::DataflowEndpointGroup.DataflowEndpoint":{"attributes":{},"description":"Contains information such as socket address and name that defines an endpoint.","properties":{"Address":"The address and port of an endpoint.","Mtu":"Maximum transmission unit (MTU) size in bytes of a dataflow endpoint. Valid values are between 1400 and 1500. A default value of 1500 is used if not set.","Name":"The endpoint name.\\n\\nWhen listing available contacts for a satellite, Ground Station searches for a dataflow endpoint whose name matches the value specified by the dataflow endpoint config of the selected mission profile. If no matching dataflow endpoints are found then Ground Station will not display any available contacts for the satellite."}},"AWS::GroundStation::DataflowEndpointGroup.EndpointDetails":{"attributes":{},"description":"The security details and endpoint information.","properties":{"AwsGroundStationAgentEndpoint":"","Endpoint":"Information about the endpoint such as name and the endpoint address.","SecurityDetails":"The role ARN, and IDs for security groups and subnets."}},"AWS::GroundStation::DataflowEndpointGroup.IntegerRange":{"attributes":{},"description":"","properties":{"Maximum":"","Minimum":""}},"AWS::GroundStation::DataflowEndpointGroup.RangedConnectionDetails":{"attributes":{},"description":"","properties":{"Mtu":"","SocketAddress":""}},"AWS::GroundStation::DataflowEndpointGroup.RangedSocketAddress":{"attributes":{},"description":"","properties":{"Name":"","PortRange":""}},"AWS::GroundStation::DataflowEndpointGroup.SecurityDetails":{"attributes":{},"description":"Information about IAM roles, subnets, and security groups needed for this DataflowEndpointGroup.","properties":{"RoleArn":"The ARN of a role which Ground Station has permission to assume, such as `arn:aws:iam::1234567890:role/DataDeliveryServiceRole` .\\n\\nGround Station will assume this role and create an ENI in your VPC on the specified subnet upon creation of a dataflow endpoint group. This ENI is used as the ingress/egress point for data streamed during a satellite contact.","SecurityGroupIds":"The security group Ids of the security role, such as `sg-1234567890abcdef0` .","SubnetIds":"The subnet Ids of the security details, such as `subnet-12345678` ."}},"AWS::GroundStation::DataflowEndpointGroup.SocketAddress":{"attributes":{},"description":"The address of the endpoint, such as `192.168.1.1` .","properties":{"Name":"The name of the endpoint, such as `Endpoint 1` .","Port":"The port of the endpoint, such as `55888` ."}},"AWS::GroundStation::MissionProfile":{"attributes":{"Arn":"The ARN of the mission profile, such as `arn:aws:groundstation:us-east-2:1234567890:mission-profile/9940bf3b-d2ba-427e-9906-842b5e5d2296` .","Id":"The ID of the mission profile, such as `9940bf3b-d2ba-427e-9906-842b5e5d2296` .","Ref":"`Ref` returns the ARN of the mission profile. For example:\\n\\n`{ \\"Ref\\": \\"MissionProfile\\" }`\\n\\n`Ref` returns the ARN of the mission profile.","Region":"The region of the mission profile."},"description":"Mission profiles specify parameters and provide references to config objects to define how Ground Station lists and executes contacts.","properties":{"ContactPostPassDurationSeconds":"Amount of time in seconds after a contact ends that you’d like to receive a CloudWatch Event indicating the pass has finished. For more information on CloudWatch Events, see the [What Is CloudWatch Events?](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html)","ContactPrePassDurationSeconds":"Amount of time in seconds prior to contact start that you\'d like to receive a CloudWatch Event indicating an upcoming pass. For more information on CloudWatch Events, see the [What Is CloudWatch Events?](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html)","DataflowEdges":"A list containing lists of config ARNs. Each list of config ARNs is an edge, with a \\"from\\" config and a \\"to\\" config.","MinimumViableContactDurationSeconds":"Minimum length of a contact in seconds that Ground Station will return when listing contacts. Ground Station will not return contacts shorter than this duration.","Name":"The name of the mission profile.","StreamsKmsKey":"","StreamsKmsRole":"","Tags":"Tags assigned to the mission profile.","TrackingConfigArn":"The ARN of a tracking config objects that defines how to track the satellite through the sky during a contact."}},"AWS::GroundStation::MissionProfile.DataflowEdge":{"attributes":{},"description":"A dataflow edge defines from where and to where data will flow during a contact.","properties":{"Destination":"The ARN of the destination for this dataflow edge. For example, specify the ARN of a dataflow endpoint config for a downlink edge or an antenna uplink config for an uplink edge.","Source":"The ARN of the source for this dataflow edge. For example, specify the ARN of an antenna downlink config for a downlink edge or a dataflow endpoint config for an uplink edge."}},"AWS::GroundStation::MissionProfile.StreamsKmsKey":{"attributes":{},"description":"","properties":{"KmsAliasArn":"","KmsKeyArn":""}},"AWS::GuardDuty::Detector":{"attributes":{"Ref":"`Ref` returns the unique ID of the detector."},"description":"The `AWS::GuardDuty::Detector` resource specifies a new GuardDuty detector. A detector is an object that represents the GuardDuty service. A detector is required for GuardDuty to become operational.\\n\\nMake sure you use either `DataSources` or `Features` in a one request, and not both.","properties":{"DataSources":"Describes which data sources will be enabled for the detector.","Enable":"Specifies whether the detector is to be enabled on creation.","Features":"A list of features that will be configured for the detector.","FindingPublishingFrequency":"Specifies how frequently updated findings are exported.","Tags":"Specifies tags added to a new detector resource. Each tag consists of a key and an optional value, both of which you define.\\n\\nCurrently, support is available only for creating and deleting a tag. No support exists for updating the tags.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::GuardDuty::Detector.CFNDataSourceConfigurations":{"attributes":{},"description":"Describes whether S3 data event logs, Kubernetes audit logs, or Malware Protection will be enabled as a data source when the detector is created.","properties":{"Kubernetes":"Describes which Kubernetes data sources are enabled for a detector.","MalwareProtection":"Describes whether Malware Protection will be enabled as a data source.","S3Logs":"Describes whether S3 data event logs are enabled as a data source."}},"AWS::GuardDuty::Detector.CFNKubernetesAuditLogsConfiguration":{"attributes":{},"description":"Describes which optional data sources are enabled for a detector.","properties":{"Enable":"Describes whether Kubernetes audit logs are enabled as a data source for the detector."}},"AWS::GuardDuty::Detector.CFNKubernetesConfiguration":{"attributes":{},"description":"Describes which Kubernetes protection data sources are enabled for the detector.","properties":{"AuditLogs":"Describes whether Kubernetes audit logs are enabled as a data source for the detector."}},"AWS::GuardDuty::Detector.CFNMalwareProtectionConfiguration":{"attributes":{},"description":"Describes whether Malware Protection will be enabled as a data source.","properties":{"ScanEc2InstanceWithFindings":"Describes the configuration of Malware Protection for EC2 instances with findings."}},"AWS::GuardDuty::Detector.CFNS3LogsConfiguration":{"attributes":{},"description":"Describes whether S3 data event logs will be enabled as a data source when the detector is created.","properties":{"Enable":"The status of S3 data event logs as a data source."}},"AWS::GuardDuty::Detector.CFNScanEc2InstanceWithFindingsConfiguration":{"attributes":{},"description":"Describes whether Malware Protection for EC2 instances with findings will be enabled as a data source.","properties":{"EbsVolumes":"Describes the configuration for scanning EBS volumes as data source."}},"AWS::GuardDuty::Detector.FeatureAdditionalConfiguration":{"attributes":{},"description":"Describes the additional configuration for a feature. If you want to specify any additional configuration for your feature, it is required to provide the `Name` and `Status` for that additional configuration. For more information, see [DetectorAdditionalConfiguration](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DetectorAdditionalConfiguration.html) .\\n\\nIf you\'re providing additional configuration, ensure to provide the corresponding [FeatureConfigurations](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-featureconfigurations.html#cfn-guardduty-detector-featureconfigurations-additionalconfiguration) .","properties":{"Name":"Name of the additional configuration of a feature.","Status":"Status of the additional configuration of a feature."}},"AWS::GuardDuty::Detector.FeatureConfigurations":{"attributes":{},"description":"Describes the configuration for a feature.\\n\\nAlthough the `Required` field associated with the following properties specifies `No` , if you provide information for `Name` , you will need to provide the information for `Status` too. For information about the available feature configurations, see [DetectorFeatureConfiguration](https://docs.aws.amazon.com/guardduty/latest/APIReference/API_DetectorFeatureConfiguration.html) .","properties":{"AdditionalConfiguration":"Additional configuration of the feature.","Name":"Name of the feature.","Status":"Status of the feature."}},"AWS::GuardDuty::Filter":{"attributes":{"Ref":"`Ref` returns the name of the filter, such as `SampleFilter` ."},"description":"The `AWS::GuardDuty::Filter` resource specifies a new filter defined by the provided `findingCriteria` .","properties":{"Action":"Specifies the action that is to be applied to the findings that match the filter.","Description":"The description of the filter. Valid characters include alphanumeric characters, and special characters such as hyphen, period, colon, underscore, parentheses ( `{ }` , `[ ]` , and `( )` ), forward slash, horizontal tab, vertical tab, newline, form feed, return, and whitespace.","DetectorId":"The ID of the detector belonging to the GuardDuty account that you want to create a filter for.","FindingCriteria":"Represents the criteria to be used in the filter for querying findings.","Name":"The name of the filter. Valid characters include period (.), underscore (_), dash (-), and alphanumeric characters. A whitespace is considered to be an invalid character.","Rank":"Specifies the position of the filter in the list of current filters. Also specifies the order in which this filter is applied to the findings. The minimum value for this property is 1 and the maximum is 100.\\n\\nBy default, filters may not be created in the same order as they are ranked. To ensure that the filters are created in the expected order, you can use an optional attribute, [DependsOn](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) , with the following syntax: `\\"DependsOn\\":[ \\"ObjectName\\" ]` .","Tags":"The tags to be added to a new filter resource. Each tag consists of a key and an optional value, both of which you define.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::GuardDuty::Filter.Condition":{"attributes":{},"description":"Specifies the condition to apply to a single field when filtering through GuardDuty findings.","properties":{"Eq":"Represents the equal condition to apply to a single field when querying for findings.","Equals":"Represents an *equal* ** condition to be applied to a single field when querying for findings.","GreaterThan":"Represents a *greater than* condition to be applied to a single field when querying for findings.","GreaterThanOrEqual":"Represents a *greater than or equal* condition to be applied to a single field when querying for findings.","Gt":"Represents a *greater than* condition to be applied to a single field when querying for findings.","Gte":"Represents the greater than or equal condition to apply to a single field when querying for findings.","LessThan":"Represents a *less than* condition to be applied to a single field when querying for findings.","LessThanOrEqual":"Represents a *less than or equal* condition to be applied to a single field when querying for findings.","Lt":"Represents the less than condition to apply to a single field when querying for findings.","Lte":"Represents the less than or equal condition to apply to a single field when querying for findings.","Neq":"Represents the not equal condition to apply to a single field when querying for findings.","NotEquals":"Represents a *not equal* ** condition to be applied to a single field when querying for findings."}},"AWS::GuardDuty::Filter.FindingCriteria":{"attributes":{},"description":"Represents a map of finding properties that match specified conditions and values when querying findings.","properties":{"Criterion":"Represents a map of finding properties that match specified conditions and values when querying findings.\\n\\nFor a mapping of JSON criterion to their console equivalent see [Finding criteria](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_filter-findings.html#filter_criteria) . The following are the available criterion:\\n\\n- accountId\\n- region\\n- confidence\\n- id\\n- resource.accessKeyDetails.accessKeyId\\n- resource.accessKeyDetails.principalId\\n- resource.accessKeyDetails.userName\\n- resource.accessKeyDetails.userType\\n- resource.instanceDetails.iamInstanceProfile.id\\n- resource.instanceDetails.imageId\\n- resource.instanceDetails.instanceId\\n- resource.instanceDetails.outpostArn\\n- resource.instanceDetails.networkInterfaces.ipv6Addresses\\n- resource.instanceDetails.networkInterfaces.privateIpAddresses.privateIpAddress\\n- resource.instanceDetails.networkInterfaces.publicDnsName\\n- resource.instanceDetails.networkInterfaces.publicIp\\n- resource.instanceDetails.networkInterfaces.securityGroups.groupId\\n- resource.instanceDetails.networkInterfaces.securityGroups.groupName\\n- resource.instanceDetails.networkInterfaces.subnetId\\n- resource.instanceDetails.networkInterfaces.vpcId\\n- resource.instanceDetails.tags.key\\n- resource.instanceDetails.tags.value\\n- resource.resourceType\\n- service.action.actionType\\n- service.action.awsApiCallAction.api\\n- service.action.awsApiCallAction.callerType\\n- service.action.awsApiCallAction.errorCode\\n- service.action.awsApiCallAction.remoteIpDetails.city.cityName\\n- service.action.awsApiCallAction.remoteIpDetails.country.countryName\\n- service.action.awsApiCallAction.remoteIpDetails.ipAddressV4\\n- service.action.awsApiCallAction.remoteIpDetails.organization.asn\\n- service.action.awsApiCallAction.remoteIpDetails.organization.asnOrg\\n- service.action.awsApiCallAction.serviceName\\n- service.action.dnsRequestAction.domain\\n- service.action.networkConnectionAction.blocked\\n- service.action.networkConnectionAction.connectionDirection\\n- service.action.networkConnectionAction.localPortDetails.port\\n- service.action.networkConnectionAction.protocol\\n- service.action.networkConnectionAction.localIpDetails.ipAddressV4\\n- service.action.networkConnectionAction.remoteIpDetails.city.cityName\\n- service.action.networkConnectionAction.remoteIpDetails.country.countryName\\n- service.action.networkConnectionAction.remoteIpDetails.ipAddressV4\\n- service.action.networkConnectionAction.remoteIpDetails.organization.asn\\n- service.action.networkConnectionAction.remoteIpDetails.organization.asnOrg\\n- service.action.networkConnectionAction.remotePortDetails.port\\n- service.additionalInfo.threatListName\\n- service.archived\\n\\nWhen this attribute is set to TRUE, only archived findings are listed. When it\'s set to FALSE, only unarchived findings are listed. When this attribute is not set, all existing findings are listed.\\n- service.resourceRole\\n- severity\\n- type\\n- updatedAt\\n\\nType: ISO 8601 string format: YYYY-MM-DDTHH:MM:SS.SSSZ or YYYY-MM-DDTHH:MM:SSZ depending on whether the value contains milliseconds.","ItemType":"Specifies the condition to be applied to a single field when filtering through findings."}},"AWS::GuardDuty::IPSet":{"attributes":{"Ref":"`Ref` returns the unique ID of the `IPSet` ."},"description":"The `AWS::GuardDuty::IPSet` resource specifies a new `IPSet` . An `IPSet` is a list of trusted IP addresses from which secure communication is allowed with AWS infrastructure and applications.","properties":{"Activate":"Indicates whether or not GuardDuty uses the `IPSet` .","DetectorId":"The unique ID of the detector of the GuardDuty account that you want to create an IPSet for.","Format":"The format of the file that contains the IPSet.","Location":"The URI of the file that contains the IPSet.","Name":"The user-friendly name to identify the IPSet.\\n\\nAllowed characters are alphanumeric, whitespace, dash (-), and underscores (_).","Tags":"The tags to be added to a new IP set resource. Each tag consists of a key and an optional value, both of which you define.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::GuardDuty::Master":{"attributes":{"Ref":"`Ref` returns the unique ID of the GuardDuty administrator account, such as 012345678901."},"description":"You can use the `AWS::GuardDuty::Master` resource in a GuardDuty member account to accept an invitation from a GuardDuty administrator account. The invitation to the member account must be sent prior to using the `AWS::GuardDuty::Master` resource to accept the administrator account\'s invitation. You can invite a member account by using the `InviteMembers` operation of the GuardDuty API, or by creating an `AWS::GuardDuty::Member` resource.","properties":{"DetectorId":"The unique ID of the detector of the GuardDuty member account.","InvitationId":"The ID of the invitation that is sent to the account designated as a member account. You can find the invitation ID by using the ListInvitation action of the GuardDuty API.","MasterId":"The AWS account ID of the account designated as the GuardDuty administrator account."}},"AWS::GuardDuty::Member":{"attributes":{"Ref":"`Ref` returns the unique ID of the GuardDuty member account, such as 012345678901."},"description":"You can use the `AWS::GuardDuty::Member` resource to add an AWS account as a GuardDuty member account to the current GuardDuty administrator account. If the value of the `Status` property is not provided or is set to `Created` , a member account is created but not invited. If the value of the `Status` property is set to `Invited` , a member account is created and invited. An `AWS::GuardDuty::Member` resource must be created with the `Status` property set to `Invited` before the `AWS::GuardDuty::Master` resource can be created in a GuardDuty member account.","properties":{"DetectorId":"The ID of the detector associated with the GuardDuty service to add the member to.","DisableEmailNotification":"Specifies whether or not to disable email notification for the member account that you invite.","Email":"The email address associated with the member account.","MemberId":"The AWS account ID of the account to designate as a member.","Message":"The invitation message that you want to send to the accounts that you\'re inviting to GuardDuty as members.","Status":"You can use the `Status` property to update the status of the relationship between the member account and its administrator account. Valid values are `Created` and `Invited` when using an `AWS::GuardDuty::Member` resource. If the value for this property is not provided or set to `Created` , a member account is created but not invited. If the value of this property is set to `Invited` , a member account is created and invited."}},"AWS::GuardDuty::ThreatIntelSet":{"attributes":{"Ref":"`Ref` returns the unique ID of the `ThreatIntelSet` ."},"description":"The `AWS::GuardDuty::ThreatIntelSet` resource specifies a new `ThreatIntelSet` . A `ThreatIntelSet` consists of known malicious IP addresses. GuardDuty generates findings based on the `ThreatIntelSet` when it is activated.","properties":{"Activate":"A Boolean value that indicates whether GuardDuty is to start using the uploaded ThreatIntelSet.","DetectorId":"The unique ID of the detector of the GuardDuty account that you want to create a threatIntelSet for.","Format":"The format of the file that contains the ThreatIntelSet.","Location":"The URI of the file that contains the ThreatIntelSet.","Name":"A user-friendly ThreatIntelSet name displayed in all findings that are generated by activity that involves IP addresses included in this ThreatIntelSet.","Tags":"The tags to be added to a new threat list resource. Each tag consists of a key and an optional value, both of which you define.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::HealthLake::FHIRDatastore":{"attributes":{"CreatedAt":"","CreatedAt.Nanos":"","CreatedAt.Seconds":"","DatastoreArn":"The Data Store ARN is generated during the creation of the Data Store and can be found in the output from the initial Data Store creation request.","DatastoreEndpoint":"The endpoint for the created Data Store.","DatastoreId":"The Amazon generated Data Store id. This id is in the output from the initial Data Store creation call.","DatastoreStatus":"The status of the FHIR Data Store. Possible statuses are ‘CREATING’, ‘ACTIVE’, ‘DELETING’, ‘DELETED’.","Ref":""},"description":"Creates a Data Store that can ingest and export FHIR formatted data.\\n\\n> Please note that when a user tries to do an Update operation via CloudFormation, changes to the Data Store name, Type Version, PreloadDataConfig, or SSEConfiguration will delete their existing Data Store for the stack and create a new one. This will lead to potential loss of data.","properties":{"DatastoreName":"The user generated name for the Data Store.","DatastoreTypeVersion":"The FHIR version of the Data Store. The only supported version is R4.","IdentityProviderConfiguration":"","PreloadDataConfig":"The preloaded data configuration for the Data Store. Only data preloaded from Synthea is supported.","SseConfiguration":"The server-side encryption key configuration for a customer provided encryption key specified for creating a Data Store.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::HealthLake::FHIRDatastore.CreatedAt":{"attributes":{},"description":"","properties":{"Nanos":"","Seconds":""}},"AWS::HealthLake::FHIRDatastore.IdentityProviderConfiguration":{"attributes":{},"description":"","properties":{"AuthorizationStrategy":"","FineGrainedAuthorizationEnabled":"","IdpLambdaArn":"","Metadata":""}},"AWS::HealthLake::FHIRDatastore.KmsEncryptionConfig":{"attributes":{},"description":"The customer-managed-key(CMK) used when creating a Data Store. If a customer owned key is not specified, an Amazon owned key will be used for encryption.","properties":{"CmkType":"The type of customer-managed-key(CMK) used for encryption. The two types of supported CMKs are customer owned CMKs and Amazon owned CMKs. For more information on CMK types, see [KmsEncryptionConfig](https://docs.aws.amazon.com/healthlake/latest/APIReference/API_KmsEncryptionConfig.html#HealthLake-Type-KmsEncryptionConfig-CmkType) .","KmsKeyId":"The KMS encryption key id/alias used to encrypt the Data Store contents at rest."}},"AWS::HealthLake::FHIRDatastore.PreloadDataConfig":{"attributes":{},"description":"Optional parameter to preload data upon creation of the Data Store. Currently, the only supported preloaded data is synthetic data generated from Synthea.","properties":{"PreloadDataType":"The type of preloaded data. Only Synthea preloaded data is supported."}},"AWS::HealthLake::FHIRDatastore.SseConfiguration":{"attributes":{},"description":"The server-side encryption key configuration for a customer provided encryption key.","properties":{"KmsEncryptionConfig":"The server-side encryption key configuration for a customer provided encryption key (CMK)."}},"AWS::IAM::AccessKey":{"attributes":{"Ref":"`Ref` returns the `AccessKeyId` . For example: `AKIAIOSFODNN7EXAMPLE` .","SecretAccessKey":"Returns the secret access key for the specified AWS::IAM::AccessKey resource. For example: wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY."},"description":"Creates a new AWS secret access key and corresponding AWS access key ID for the specified user. The default status for new keys is `Active` .\\n\\nFor information about quotas on the number of keys you can create, see [IAM and AWS STS quotas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html) in the *IAM User Guide* .\\n\\n> To ensure the security of your AWS account , the secret access key is accessible only during key and user creation. You must save the key (for example, in a text file) if you want to be able to access it again. If a secret key is lost, you can rotate access keys by increasing the value of the `serial` property.","properties":{"Serial":"This value is specific to CloudFormation and can only be *incremented* . Incrementing this value notifies CloudFormation that you want to rotate your access key. When you update your stack, CloudFormation will replace the existing access key with a new key.","Status":"The status of the access key. `Active` means that the key is valid for API calls, while `Inactive` means it is not.","UserName":"The name of the IAM user that the new key will belong to.\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-"}},"AWS::IAM::Group":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) for the specified `AWS::IAM::Group` resource. For example: `arn:aws:iam::123456789012:group/mystack-mygroup-1DZETITOWEKVO` .","Ref":"`Ref` returns the `GroupName` . For example: `mystack-mygroup-1DZETITOWEKVO` ."},"description":"Creates a new group.\\n\\nFor information about the number of groups you can create, see [Limitations on IAM Entities](https://docs.aws.amazon.com/IAM/latest/UserGuide/LimitationsOnEntities.html) in the *IAM User Guide* .","properties":{"GroupName":"The name of the group to create. Do not include the path in this value.\\n\\nThe group name must be unique within the account. Group names are not distinguished by case. For example, you cannot create groups named both \\"ADMINS\\" and \\"admins\\". If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the group name.\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name. \\n\\nIf you specify a name, you must specify the `CAPABILITY_NAMED_IAM` value to acknowledge your template\'s capabilities. For more information, see [Acknowledging IAM Resources in AWS CloudFormation Templates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#using-iam-capabilities) .\\n\\n> Naming an IAM resource can cause an unrecoverable error if you reuse the same template in multiple Regions. To prevent this, we recommend using `Fn::Join` and `AWS::Region` to create a Region-specific name, as in the following example: `{\\"Fn::Join\\": [\\"\\", [{\\"Ref\\": \\"AWS::Region\\"}, {\\"Ref\\": \\"MyResourceName\\"}]]}` .","ManagedPolicyArns":"The Amazon Resource Name (ARN) of the IAM policy you want to attach.\\n\\nFor more information about ARNs, see [Amazon Resource Names (ARNs)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *AWS General Reference* .","Path":"The path to the group. For more information about paths, see [IAM identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) in the *IAM User Guide* .\\n\\nThis parameter is optional. If it is not included, it defaults to a slash (/).\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of either a forward slash (/) by itself or a string that must begin and end with forward slashes. In addition, it can contain any ASCII character from the ! ( `\\\\u0021` ) through the DEL character ( `\\\\u007F` ), including most punctuation characters, digits, and upper and lowercased letters.","Policies":"Adds or updates an inline policy document that is embedded in the specified IAM group. To view AWS::IAM::Group snippets, see [Declaring an IAM Group Resource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-iam.html#scenario-iam-group) .\\n\\n> The name of each inline policy for a role, user, or group must be unique. If you don\'t choose unique names, updates to the IAM identity will fail. \\n\\nFor information about limits on the number of inline policies that you can embed in a group, see [Limitations on IAM Entities](https://docs.aws.amazon.com/IAM/latest/UserGuide/LimitationsOnEntities.html) in the *IAM User Guide* ."}},"AWS::IAM::Group.Policy":{"attributes":{},"description":"Contains information about an attached policy.\\n\\nAn attached policy is a managed policy that has been attached to a user, group, or role.\\n\\nFor more information about managed policies, see [Managed Policies and Inline Policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html) in the *IAM User Guide* .","properties":{"PolicyDocument":"The policy document.","PolicyName":"The friendly name (not ARN) identifying the policy."}},"AWS::IAM::InstanceProfile":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) for the instance profile. For example:\\n\\n`{\\"Fn::GetAtt\\" : [\\"MyProfile\\", \\"Arn\\"] }`\\n\\nThis returns a value such as `arn:aws:iam::1234567890:instance-profile/MyProfile-ASDNSDLKJ` .","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"MyProfile\\" }`\\n\\nFor the `AWS::IAM::InstanceProfile` resource with the logical ID `MyProfile` , Ref returns the name of the instance profile."},"description":"Creates a new instance profile. For information about instance profiles, see [Using instance profiles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html) .\\n\\nFor information about the number of instance profiles you can create, see [IAM object quotas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html) in the *IAM User Guide* .","properties":{"InstanceProfileName":"The name of the instance profile to create.\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-","Path":"The path to the instance profile. For more information about paths, see [IAM Identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) in the *IAM User Guide* .\\n\\nThis parameter is optional. If it is not included, it defaults to a slash (/).\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of either a forward slash (/) by itself or a string that must begin and end with forward slashes. In addition, it can contain any ASCII character from the ! ( `\\\\u0021` ) through the DEL character ( `\\\\u007F` ), including most punctuation characters, digits, and upper and lowercased letters.","Roles":"The name of the role to associate with the instance profile. Only one role can be assigned to an EC2 instance at a time, and all applications on the instance share the same role and permissions."}},"AWS::IAM::ManagedPolicy":{"attributes":{"Ref":"`Ref` returns the ARN.\\n\\nIn the following sample, the `Ref` function returns the ARN of the `CreateTestDBPolicy` managed policy, such as `arn:aws:iam::123456789012:policy/teststack-CreateTestDBPolicy-16M23YE3CS700` .\\n\\n`{ \\"Ref\\": \\"CreateTestDBPolicy\\" }`"},"description":"Creates a new managed policy for your AWS account .\\n\\nThis operation creates a policy version with a version identifier of `v1` and sets v1 as the policy\'s default version. For more information about policy versions, see [Versioning for managed policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-versions.html) in the *IAM User Guide* .\\n\\nAs a best practice, you can validate your IAM policies. To learn more, see [Validating IAM policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_policy-validator.html) in the *IAM User Guide* .\\n\\nFor more information about managed policies in general, see [Managed policies and inline policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html) in the *IAM User Guide* .","properties":{"Description":"A friendly description of the policy.\\n\\nTypically used to store information about the permissions defined in the policy. For example, \\"Grants access to production DynamoDB tables.\\"\\n\\nThe policy description is immutable. After a value is assigned, it cannot be changed.","Groups":"The name (friendly name, not ARN) of the group to attach the policy to.\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-","ManagedPolicyName":"The friendly name of the policy.\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name. \\n\\nIf you specify a name, you must specify the `CAPABILITY_NAMED_IAM` value to acknowledge your template\'s capabilities. For more information, see [Acknowledging IAM Resources in AWS CloudFormation Templates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#using-iam-capabilities) .\\n\\n> Naming an IAM resource can cause an unrecoverable error if you reuse the same template in multiple Regions. To prevent this, we recommend using `Fn::Join` and `AWS::Region` to create a Region-specific name, as in the following example: `{\\"Fn::Join\\": [\\"\\", [{\\"Ref\\": \\"AWS::Region\\"}, {\\"Ref\\": \\"MyResourceName\\"}]]}` .","Path":"The path for the policy.\\n\\nFor more information about paths, see [IAM identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) in the *IAM User Guide* .\\n\\nThis parameter is optional. If it is not included, it defaults to a slash (/).\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of either a forward slash (/) by itself or a string that must begin and end with forward slashes. In addition, it can contain any ASCII character from the ! ( `\\\\u0021` ) through the DEL character ( `\\\\u007F` ), including most punctuation characters, digits, and upper and lowercased letters.\\n\\n> You cannot use an asterisk (*) in the path name.","PolicyDocument":"The JSON policy document that you want to use as the content for the new policy.\\n\\nYou must provide policies in JSON format in IAM. However, for AWS CloudFormation templates formatted in YAML, you can provide the policy in JSON or YAML format. AWS CloudFormation always converts a YAML policy to JSON format before submitting it to IAM.\\n\\nThe maximum length of the policy document that you can pass in this operation, including whitespace, is listed below. To view the maximum character counts of a managed policy with no whitespaces, see [IAM and AWS STS character quotas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entity-length) .\\n\\nTo learn more about JSON policy grammar, see [Grammar of the IAM JSON policy language](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html) in the *IAM User Guide* .\\n\\nThe [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) used to validate this parameter is a string of characters consisting of the following:\\n\\n- Any printable ASCII character ranging from the space character ( `\\\\u0020` ) through the end of the ASCII character range\\n- The printable characters in the Basic Latin and Latin-1 Supplement character set (through `\\\\u00FF` )\\n- The special characters tab ( `\\\\u0009` ), line feed ( `\\\\u000A` ), and carriage return ( `\\\\u000D` )","Roles":"The name (friendly name, not ARN) of the role to attach the policy to.\\n\\nThis parameter allows (per its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-\\n\\n> If an external policy (such as `AWS::IAM::Policy` or `AWS::IAM::ManagedPolicy` ) has a `Ref` to a role and if a resource (such as `AWS::ECS::Service` ) also has a `Ref` to the same role, add a `DependsOn` attribute to the resource to make the resource depend on the external policy. This dependency ensures that the role\'s policy is available throughout the resource\'s lifecycle. For example, when you delete a stack with an `AWS::ECS::Service` resource, the `DependsOn` attribute ensures that AWS CloudFormation deletes the `AWS::ECS::Service` resource before deleting its role\'s policy.","Users":"The name (friendly name, not ARN) of the IAM user to attach the policy to.\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-"}},"AWS::IAM::OIDCProvider":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) for the specified `AWS::IAM::OIDCProvider` resource.","Ref":"`Ref` returns the ARN."},"description":"Creates or updates an IAM entity to describe an identity provider (IdP) that supports [OpenID Connect (OIDC)](https://docs.aws.amazon.com/http://openid.net/connect/) .\\n\\nThe OIDC provider that you create with this operation can be used as a principal in a role\'s trust policy. Such a policy establishes a trust relationship between AWS and the OIDC provider.\\n\\nWhen you create the IAM OIDC provider, you specify the following:\\n\\n- The URL of the OIDC identity provider (IdP) to trust\\n- A list of client IDs (also known as audiences) that identify the application or applications that are allowed to authenticate using the OIDC provider\\n- A list of tags that are attached to the specified IAM OIDC provider\\n- A list of thumbprints of one or more server certificates that the IdP uses\\n\\nYou get all of this information from the OIDC IdP that you want to use to access AWS .\\n\\nWhen you update the IAM OIDC provider, you specify the following:\\n\\n- The URL of the OIDC identity provider (IdP) to trust\\n- A list of client IDs (also known as audiences) that replaces the existing list of client IDs associated with the OIDC IdP\\n- A list of tags that replaces the existing list of tags attached to the specified IAM OIDC provider\\n- A list of thumbprints that replaces the existing list of server certificates thumbprints that the IdP uses\\n\\n> The trust for the OIDC provider is derived from the IAM provider that this operation creates. Therefore, it is best to limit access to the [CreateOpenIDConnectProvider](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html) operation to highly privileged users.","properties":{"ClientIdList":"A list of client IDs (also known as audiences) that are associated with the specified IAM OIDC provider resource object. For more information, see [CreateOpenIDConnectProvider](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html) .","Tags":"A list of tags that are attached to the specified IAM OIDC provider. The returned list of tags is sorted by tag key. For more information about tagging, see [Tagging IAM resources](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html) in the *IAM User Guide* .","ThumbprintList":"A list of certificate thumbprints that are associated with the specified IAM OIDC provider resource object. For more information, see [CreateOpenIDConnectProvider](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html) .","Url":"The URL that the IAM OIDC provider resource object is associated with. For more information, see [CreateOpenIDConnectProvider](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html) ."}},"AWS::IAM::Policy":{"attributes":{"Ref":""},"description":"Adds or updates an inline policy document that is embedded in the specified IAM user, group, or role.\\n\\nAn IAM user can also have a managed policy attached to it. For information about policies, see [Managed Policies and Inline Policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html) in the *IAM User Guide* .\\n\\nThe Groups, Roles, and Users properties are optional. However, you must specify at least one of these properties.\\n\\nFor information about policy documents see [Creating IAM policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html) in the *IAM User Guide* .\\n\\nFor information about limits on the number of inline policies that you can embed in an identity, see [Limitations on IAM Entities](https://docs.aws.amazon.com/IAM/latest/UserGuide/LimitationsOnEntities.html) in the *IAM User Guide* .","properties":{"Groups":"The name of the group to associate the policy with.\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-.","PolicyDocument":"The policy document.\\n\\nYou must provide policies in JSON format in IAM. However, for AWS CloudFormation templates formatted in YAML, you can provide the policy in JSON or YAML format. AWS CloudFormation always converts a YAML policy to JSON format before submitting it to IAM.\\n\\nThe [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) used to validate this parameter is a string of characters consisting of the following:\\n\\n- Any printable ASCII character ranging from the space character ( `\\\\u0020` ) through the end of the ASCII character range\\n- The printable characters in the Basic Latin and Latin-1 Supplement character set (through `\\\\u00FF` )\\n- The special characters tab ( `\\\\u0009` ), line feed ( `\\\\u000A` ), and carriage return ( `\\\\u000D` )","PolicyName":"The name of the policy document.\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-","Roles":"The name of the role to associate the policy with.\\n\\nThis parameter allows (per its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-\\n\\n> If an external policy (such as `AWS::IAM::Policy` or `AWS::IAM::ManagedPolicy` ) has a `Ref` to a role and if a resource (such as `AWS::ECS::Service` ) also has a `Ref` to the same role, add a `DependsOn` attribute to the resource to make the resource depend on the external policy. This dependency ensures that the role\'s policy is available throughout the resource\'s lifecycle. For example, when you delete a stack with an `AWS::ECS::Service` resource, the `DependsOn` attribute ensures that AWS CloudFormation deletes the `AWS::ECS::Service` resource before deleting its role\'s policy.","Users":"The name of the user to associate the policy with.\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-"}},"AWS::IAM::Role":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) for the role. For example:\\n\\n`{\\"Fn::GetAtt\\" : [\\"MyRole\\", \\"Arn\\"] }`\\n\\nThis will return a value such as `arn:aws:iam::1234567890:role/MyRole-AJJHDSKSDF` .","Ref":"For example:\\n\\n`{ \\"Ref\\": \\"RootRole\\" }`\\n\\nFor the `AWS::IAM::Role` resource with the logical ID `RootRole` , `Ref` will return the role name.","RoleId":"Returns the stable and unique string identifying the role. For example, `AIDAJQABLZS4A3QDU576Q` .\\n\\nFor more information about IDs, see [IAM Identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) in the *IAM User Guide* ."},"description":"Creates a new role for your AWS account .\\n\\nFor more information about roles, see [IAM roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) in the *IAM User Guide* . For information about quotas for role names and the number of roles you can create, see [IAM and AWS STS quotas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html) in the *IAM User Guide* .","properties":{"AssumeRolePolicyDocument":"The trust policy that is associated with this role. Trust policies define which entities can assume the role. You can associate only one trust policy with a role. For an example of a policy that can be used to assume a role, see [Template Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#aws-resource-iam-role--examples) . For more information about the elements that you can use in an IAM policy, see [IAM Policy Elements Reference](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html) in the *IAM User Guide* .","Description":"A description of the role that you provide.","ManagedPolicyArns":"A list of Amazon Resource Names (ARNs) of the IAM managed policies that you want to attach to the role.\\n\\nFor more information about ARNs, see [Amazon Resource Names (ARNs) and AWS Service Namespaces](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *AWS General Reference* .","MaxSessionDuration":"The maximum session duration (in seconds) that you want to set for the specified role. If you do not specify a value for this setting, the default value of one hour is applied. This setting can have a value from 1 hour to 12 hours.\\n\\nAnyone who assumes the role from the AWS CLI or API can use the `DurationSeconds` API parameter or the `duration-seconds` AWS CLI parameter to request a longer session. The `MaxSessionDuration` setting determines the maximum duration that can be requested using the `DurationSeconds` parameter. If users don\'t specify a value for the `DurationSeconds` parameter, their security credentials are valid for one hour by default. This applies when you use the `AssumeRole*` API operations or the `assume-role*` AWS CLI operations but does not apply when you use those operations to create a console URL. For more information, see [Using IAM roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) in the *IAM User Guide* .","Path":"The path to the role. For more information about paths, see [IAM Identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) in the *IAM User Guide* .\\n\\nThis parameter is optional. If it is not included, it defaults to a slash (/).\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of either a forward slash (/) by itself or a string that must begin and end with forward slashes. In addition, it can contain any ASCII character from the ! ( `\\\\u0021` ) through the DEL character ( `\\\\u007F` ), including most punctuation characters, digits, and upper and lowercased letters.","PermissionsBoundary":"The ARN of the policy used to set the permissions boundary for the role.\\n\\nFor more information about permissions boundaries, see [Permissions boundaries for IAM identities](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html) in the *IAM User Guide* .","Policies":"Adds or updates an inline policy document that is embedded in the specified IAM role.\\n\\nWhen you embed an inline policy in a role, the inline policy is used as part of the role\'s access (permissions) policy. The role\'s trust policy is created at the same time as the role. You can update a role\'s trust policy later. For more information about IAM roles, go to [Using Roles to Delegate Permissions and Federate Identities](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-toplevel.html) .\\n\\nA role can also have an attached managed policy. For information about policies, see [Managed Policies and Inline Policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html) in the *IAM User Guide* .\\n\\nFor information about limits on the number of inline policies that you can embed with a role, see [Limitations on IAM Entities](https://docs.aws.amazon.com/IAM/latest/UserGuide/LimitationsOnEntities.html) in the *IAM User Guide* .\\n\\n> If an external policy (such as `AWS::IAM::Policy` or `AWS::IAM::ManagedPolicy` ) has a `Ref` to a role and if a resource (such as `AWS::ECS::Service` ) also has a `Ref` to the same role, add a `DependsOn` attribute to the resource to make the resource depend on the external policy. This dependency ensures that the role\'s policy is available throughout the resource\'s lifecycle. For example, when you delete a stack with an `AWS::ECS::Service` resource, the `DependsOn` attribute ensures that AWS CloudFormation deletes the `AWS::ECS::Service` resource before deleting its role\'s policy.","RoleName":"A name for the IAM role, up to 64 characters in length. For valid values, see the `RoleName` parameter for the [`CreateRole`](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html) action in the *IAM User Guide* .\\n\\nThis parameter allows (per its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-. The role name must be unique within the account. Role names are not distinguished by case. For example, you cannot create roles named both \\"Role1\\" and \\"role1\\".\\n\\nIf you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the role name.\\n\\nIf you specify a name, you must specify the `CAPABILITY_NAMED_IAM` value to acknowledge your template\'s capabilities. For more information, see [Acknowledging IAM Resources in AWS CloudFormation Templates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#using-iam-capabilities) .\\n\\n> Naming an IAM resource can cause an unrecoverable error if you reuse the same template in multiple Regions. To prevent this, we recommend using `Fn::Join` and `AWS::Region` to create a Region-specific name, as in the following example: `{\\"Fn::Join\\": [\\"\\", [{\\"Ref\\": \\"AWS::Region\\"}, {\\"Ref\\": \\"MyResourceName\\"}]]}` .","Tags":"A list of tags that are attached to the role. For more information about tagging, see [Tagging IAM resources](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html) in the *IAM User Guide* ."}},"AWS::IAM::Role.Policy":{"attributes":{},"description":"Contains information about an attached policy.\\n\\nAn attached policy is a managed policy that has been attached to a user, group, or role.\\n\\nFor more information about managed policies, refer to [Managed Policies and Inline Policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html) in the *IAM User Guide* .","properties":{"PolicyDocument":"The entire contents of the policy that defines permissions. For more information, see [Overview of JSON policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json) .","PolicyName":"The friendly name (not ARN) identifying the policy."}},"AWS::IAM::SAMLProvider":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) for the specified `AWS::IAM::SAMLProvider` resource.","Ref":"`Ref` returns the ARN."},"description":"Creates an IAM resource that describes an identity provider (IdP) that supports SAML 2.0.\\n\\nThe SAML provider resource that you create with this operation can be used as a principal in an IAM role\'s trust policy. Such a policy can enable federated users who sign in using the SAML IdP to assume the role. You can create an IAM role that supports Web-based single sign-on (SSO) to the AWS Management Console or one that supports API access to AWS .\\n\\nWhen you create the SAML provider resource, you upload a SAML metadata document that you get from your IdP. That document includes the issuer\'s name, expiration information, and keys that can be used to validate the SAML authentication response (assertions) that the IdP sends. You must generate the metadata document using the identity management software that is used as your organization\'s IdP.\\n\\n> This operation requires [Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) . \\n\\nFor more information, see [Enabling SAML 2.0 federated users to access the AWS Management Console](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-saml.html) and [About SAML 2.0-based federation](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html) in the *IAM User Guide* .","properties":{"Name":"The name of the provider to create.\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-","SamlMetadataDocument":"An XML document generated by an identity provider (IdP) that supports SAML 2.0. The document includes the issuer\'s name, expiration information, and keys that can be used to validate the SAML authentication response (assertions) that are received from the IdP. You must generate the metadata document using the identity management software that is used as your organization\'s IdP.\\n\\nFor more information, see [About SAML 2.0-based federation](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html) in the *IAM User Guide*","Tags":"A list of tags that you want to attach to the new IAM SAML provider. Each tag consists of a key name and an associated value. For more information about tagging, see [Tagging IAM resources](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html) in the *IAM User Guide* .\\n\\n> If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request fails and the resource is not created."}},"AWS::IAM::ServerCertificate":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) for the specified `AWS::IAM::ServerCertificate` resource.","Ref":"`Ref` returns the `ServerCertificateName` ."},"description":"Uploads a server certificate entity for the AWS account . The server certificate entity includes a public key certificate, a private key, and an optional certificate chain, which should all be PEM-encoded.\\n\\nWe recommend that you use [AWS Certificate Manager](https://docs.aws.amazon.com/acm/) to provision, manage, and deploy your server certificates. With ACM you can request a certificate, deploy it to AWS resources, and let ACM handle certificate renewals for you. Certificates provided by ACM are free. For more information about using ACM, see the [AWS Certificate Manager User Guide](https://docs.aws.amazon.com/acm/latest/userguide/) .\\n\\nFor more information about working with server certificates, see [Working with server certificates](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html) in the *IAM User Guide* . This topic includes a list of AWS services that can use the server certificates that you manage with IAM.\\n\\nFor information about the number of server certificates you can upload, see [IAM and AWS STS quotas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html) in the *IAM User Guide* .\\n\\n> Because the body of the public key certificate, private key, and the certificate chain can be large, you should use POST rather than GET when calling `UploadServerCertificate` . For information about setting up signatures and authorization through the API, see [Signing AWS API requests](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) in the *AWS General Reference* . For general information about using the Query API with IAM, see [Calling the API by making HTTP query requests](https://docs.aws.amazon.com/IAM/latest/UserGuide/programming.html) in the *IAM User Guide* .","properties":{"CertificateBody":"The contents of the public key certificate.","CertificateChain":"The contents of the public key certificate chain.","Path":"The path for the server certificate. For more information about paths, see [IAM identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) in the *IAM User Guide* .\\n\\nThis parameter is optional. If it is not included, it defaults to a slash (/). This parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of either a forward slash (/) by itself or a string that must begin and end with forward slashes. In addition, it can contain any ASCII character from the ! ( `\\\\u0021` ) through the DEL character ( `\\\\u007F` ), including most punctuation characters, digits, and upper and lowercased letters.\\n\\n> If you are uploading a server certificate specifically for use with Amazon CloudFront distributions, you must specify a path using the `path` parameter. The path must begin with `/cloudfront` and must include a trailing slash (for example, `/cloudfront/test/` ).","PrivateKey":"The contents of the private key in PEM-encoded format.\\n\\nThe [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) used to validate this parameter is a string of characters consisting of the following:\\n\\n- Any printable ASCII character ranging from the space character ( `\\\\u0020` ) through the end of the ASCII character range\\n- The printable characters in the Basic Latin and Latin-1 Supplement character set (through `\\\\u00FF` )\\n- The special characters tab ( `\\\\u0009` ), line feed ( `\\\\u000A` ), and carriage return ( `\\\\u000D` )","ServerCertificateName":"The name for the server certificate. Do not include the path in this value. The name of the certificate cannot contain any spaces.\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-","Tags":"A list of tags that are attached to the server certificate. For more information about tagging, see [Tagging IAM resources](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html) in the *IAM User Guide* ."}},"AWS::IAM::ServiceLinkedRole":{"attributes":{"Ref":"`Ref` returns the `RoleName` created for the service-linked role. The `CustomSuffix` is appended to the service-provided prefix with an underscore followed by the `CustomSuffix` to form the complete role name. For example, `AWSServiceRoleForAutoScaling` or `AWSServiceRoleForAutoScaling_TestSuffix` if a `CustomSuffix` is specified.","RoleName":"Returns the friendly name that identifies the role. For example, `AWSServiceRoleForAutoScaling` or `AWSServiceRoleForAutoScaling_TestSuffix` if a `CustomSuffix` is specified."},"description":"Creates an IAM role that is linked to a specific AWS service. The service controls the attached policies and when the role can be deleted. This helps ensure that the service is not broken by an unexpectedly changed or deleted role, which could put your AWS resources into an unknown state. Allowing the service to control the role helps improve service stability and proper cleanup when a service and its role are no longer needed. For more information, see [Using service-linked roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html) in the *IAM User Guide* .\\n\\nTo attach a policy to this service-linked role, you must make the request using the AWS service that depends on this role.","properties":{"AWSServiceName":"The service principal for the AWS service to which this role is attached. You use a string similar to a URL but without the http:// in front. For example: `elasticbeanstalk.amazonaws.com` .\\n\\nService principals are unique and case-sensitive. To find the exact service principal for your service-linked role, see [AWS services that work with IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html) in the *IAM User Guide* . Look for the services that have *Yes* in the *Service-Linked Role* column. Choose the *Yes* link to view the service-linked role documentation for that service.","CustomSuffix":"A string that you provide, which is combined with the service-provided prefix to form the complete role name. If you make multiple requests for the same service, then you must supply a different `CustomSuffix` for each request. Otherwise the request fails with a duplicate role name error. For example, you could add `-1` or `-debug` to the suffix.\\n\\nSome services do not support the `CustomSuffix` parameter. If you provide an optional suffix and the operation fails, try the operation again without the suffix.","Description":"The description of the role."}},"AWS::IAM::User":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) for the specified `AWS::IAM::User` resource. For example: `arn:aws:iam::123456789012:user/mystack-myuser-1CCXAFG2H2U4D` .","Ref":"`Ref` returns the `UserName` . For example: `mystack-myuser-1CCXAFG2H2U4D` ."},"description":"Creates a new IAM user for your AWS account .\\n\\nFor information about quotas for the number of IAM users you can create, see [IAM and AWS STS quotas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html) in the *IAM User Guide* .","properties":{"Groups":"A list of group names to which you want to add the user.","LoginProfile":"Creates a password for the specified IAM user. A password allows an IAM user to access AWS services through the AWS Management Console .\\n\\nYou can use the AWS CLI , the AWS API, or the *Users* page in the IAM console to create a password for any IAM user. Use [ChangePassword](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ChangePassword.html) to update your own existing password in the *My Security Credentials* page in the AWS Management Console .\\n\\nFor more information about managing passwords, see [Managing passwords](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_ManagingLogins.html) in the *IAM User Guide* .","ManagedPolicyArns":"A list of Amazon Resource Names (ARNs) of the IAM managed policies that you want to attach to the user.\\n\\nFor more information about ARNs, see [Amazon Resource Names (ARNs) and AWS Service Namespaces](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *AWS General Reference* .","Path":"The path for the user name. For more information about paths, see [IAM identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) in the *IAM User Guide* .\\n\\nThis parameter is optional. If it is not included, it defaults to a slash (/).\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of either a forward slash (/) by itself or a string that must begin and end with forward slashes. In addition, it can contain any ASCII character from the ! ( `\\\\u0021` ) through the DEL character ( `\\\\u007F` ), including most punctuation characters, digits, and upper and lowercased letters.","PermissionsBoundary":"The ARN of the managed policy that is used to set the permissions boundary for the user.\\n\\nA permissions boundary policy defines the maximum permissions that identity-based policies can grant to an entity, but does not grant permissions. Permissions boundaries do not define the maximum permissions that a resource-based policy can grant to an entity. To learn more, see [Permissions boundaries for IAM entities](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html) in the *IAM User Guide* .\\n\\nFor more information about policy types, see [Policy types](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policy-types) in the *IAM User Guide* .","Policies":"Adds or updates an inline policy document that is embedded in the specified IAM user. To view AWS::IAM::User snippets, see [Declaring an IAM User Resource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-iam.html#scenario-iam-user) .\\n\\n> The name of each policy for a role, user, or group must be unique. If you don\'t choose unique names, updates to the IAM identity will fail. \\n\\nFor information about limits on the number of inline policies that you can embed in a user, see [Limitations on IAM Entities](https://docs.aws.amazon.com/IAM/latest/UserGuide/LimitationsOnEntities.html) in the *IAM User Guide* .","Tags":"A list of tags that you want to attach to the new user. Each tag consists of a key name and an associated value. For more information about tagging, see [Tagging IAM resources](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html) in the *IAM User Guide* .\\n\\n> If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request fails and the resource is not created.","UserName":"The name of the user to create. Do not include the path in this value.\\n\\nThis parameter allows (per its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-. The user name must be unique within the account. User names are not distinguished by case. For example, you cannot create users named both \\"John\\" and \\"john\\".\\n\\nIf you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the user name.\\n\\nIf you specify a name, you must specify the `CAPABILITY_NAMED_IAM` value to acknowledge your template\'s capabilities. For more information, see [Acknowledging IAM Resources in AWS CloudFormation Templates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#using-iam-capabilities) .\\n\\n> Naming an IAM resource can cause an unrecoverable error if you reuse the same template in multiple Regions. To prevent this, we recommend using `Fn::Join` and `AWS::Region` to create a Region-specific name, as in the following example: `{\\"Fn::Join\\": [\\"\\", [{\\"Ref\\": \\"AWS::Region\\"}, {\\"Ref\\": \\"MyResourceName\\"}]]}` ."}},"AWS::IAM::User.LoginProfile":{"attributes":{},"description":"Creates a password for the specified user, giving the user the ability to access AWS services through the AWS Management Console . For more information about managing passwords, see [Managing Passwords](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_ManagingLogins.html) in the *IAM User Guide* .","properties":{"Password":"The user\'s password.","PasswordResetRequired":"Specifies whether the user is required to set a new password on next sign-in."}},"AWS::IAM::User.Policy":{"attributes":{},"description":"Contains information about an attached policy.\\n\\nAn attached policy is a managed policy that has been attached to a user, group, or role.\\n\\nFor more information about managed policies, refer to [Managed Policies and Inline Policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html) in the *IAM User Guide* .","properties":{"PolicyDocument":"The entire contents of the policy that defines permissions. For more information, see [Overview of JSON policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json) .","PolicyName":"The friendly name (not ARN) identifying the policy."}},"AWS::IAM::UserToGroupAddition":{"attributes":{"Ref":"For example:\\n\\n`{ \\"Ref\\": \\"MyUserToGroupAddition\\" }`\\n\\nFor the `AWS::IAM::UserToGroupAddition` resource with the logical ID `MyUserToGroupAddition` , `Ref` will return the AWS resource name."},"description":"Adds the specified user to the specified group.","properties":{"GroupName":"The name of the group to update.\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-","Users":"A list of the names of the users that you want to add to the group."}},"AWS::IAM::VirtualMFADevice":{"attributes":{"Ref":"`Ref` returns the `SerialNumber` .","SerialNumber":"Returns the serial number for the specified `AWS::IAM::VirtualMFADevice` resource."},"description":"Creates a new virtual MFA device for the AWS account . After creating the virtual MFA, use [EnableMFADevice](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html) to attach the MFA device to an IAM user. For more information about creating and working with virtual MFA devices, see [Using a virtual MFA device](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_VirtualMFA.html) in the *IAM User Guide* .\\n\\nFor information about the maximum number of MFA devices you can create, see [IAM and AWS STS quotas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html) in the *IAM User Guide* .\\n\\n> The seed information contained in the QR code and the Base32 string should be treated like any other secret access information. In other words, protect the seed information as you would your AWS access keys or your passwords. After you provision your virtual device, you should ensure that the information is destroyed following secure procedures.","properties":{"Path":"The path for the virtual MFA device. For more information about paths, see [IAM identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) in the *IAM User Guide* .\\n\\nThis parameter is optional. If it is not included, it defaults to a slash (/).\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of either a forward slash (/) by itself or a string that must begin and end with forward slashes. In addition, it can contain any ASCII character from the ! ( `\\\\u0021` ) through the DEL character ( `\\\\u007F` ), including most punctuation characters, digits, and upper and lowercased letters.","Tags":"A list of tags that you want to attach to the new IAM virtual MFA device. Each tag consists of a key name and an associated value. For more information about tagging, see [Tagging IAM resources](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html) in the *IAM User Guide* .\\n\\n> If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request fails and the resource is not created.","Users":"The IAM user associated with this virtual MFA device.","VirtualMfaDeviceName":"The name of the virtual MFA device, which must be unique. Use with path to uniquely identify a virtual MFA device.\\n\\nThis parameter allows (through its [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) ) a string of characters consisting of upper and lowercase alphanumeric characters with no spaces. You can also include any of the following characters: _+=,.@-"}},"AWS::IVS::Channel":{"attributes":{"Arn":"The channel ARN. For example: `arn:aws:ivs:us-west-2:123456789012:channel/abcdABCDefgh`","IngestEndpoint":"Channel ingest endpoint, part of the definition of an ingest server, used when you set up streaming software.\\n\\nFor example: `a1b2c3d4e5f6.global-contribute.live-video.net`","PlaybackUrl":"Channel playback URL. For example: `https://a1b2c3d4e5f6.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.abcdEFGH.m3u8`","Ref":"`Ref` returns the channel ARN. For example:\\n\\n`{ \\"Ref\\": \\"myChannel\\" }`\\n\\nFor the channel `myChannel` , `Ref` returns the channel ARN."},"description":"The `AWS::IVS::Channel` resource specifies an channel. A channel stores configuration information related to your live stream. For more information, see [CreateChannel](https://docs.aws.amazon.com/ivs/latest/APIReference/API_CreateChannel.html) in the *Amazon Interactive Video Service API Reference* .\\n\\n> By default, the IVS API CreateChannel endpoint creates a stream key in addition to a channel. The Channel resource *does not* create a stream key; to create a stream key, use the StreamKey resource instead.","properties":{"Authorized":"Whether the channel is authorized.\\n\\n*Default* : `false`","InsecureIngest":"Whether the channel allows insecure RTMP ingest.\\n\\n*Default* : `false`","LatencyMode":"Channel latency mode. Valid values:\\n\\n- `NORMAL` : Use NORMAL to broadcast and deliver live video up to Full HD.\\n- `LOW` : Use LOW for near real-time interactions with viewers.\\n\\n> In the console, `LOW` and `NORMAL` correspond to `Ultra-low` and `Standard` , respectively. \\n\\n*Default* : `LOW`","Name":"Channel name.","Preset":"An optional transcode preset for the channel. This is selectable only for `ADVANCED_HD` and `ADVANCED_SD` channel types. For those channel types, the default preset is `HIGHER_BANDWIDTH_DELIVERY` . For other channel types ( `BASIC` and `STANDARD` ), `preset` is the empty string (\\"\\").","RecordingConfigurationArn":"The ARN of a RecordingConfiguration resource. An empty string indicates that recording is disabled for the channel. A RecordingConfiguration ARN indicates that recording is enabled using the specified recording configuration. See the [RecordingConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-recordingconfiguration.html) resource for more information and an example.\\n\\n*Default* : \\"\\" (empty string, recording is disabled)","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","Type":"The channel type, which determines the allowable resolution and bitrate. *If you exceed the allowable resolution or bitrate, the stream probably will disconnect immediately.* Valid values:\\n\\n- `STANDARD` : Video is transcoded: multiple qualities are generated from the original input to automatically give viewers the best experience for their devices and network conditions. Transcoding allows higher playback quality across a range of download speeds. Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps. Audio is transcoded only for renditions 360p and below; above that, audio is passed through.\\n- `BASIC` : Video is transmuxed: Amazon IVS delivers the original input to viewers. The viewer’s video-quality choice is limited to the original input. Resolution can be up to 1080p and bitrate can be up to 1.5 Mbps for 480p and up to 3.5 Mbps for resolutions between 480p and 1080p.\\n- `ADVANCED_SD` : Video is transcoded; multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions. Input resolution can be up to 1080p and bitrate can be up to 8.5 Mbps; output is capped at SD quality (480p). You can select an optional transcode preset (see below). Audio for all renditions is transcoded, and an audio-only rendition is available.\\n- `ADVANCED_HD` : Video is transcoded; multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions. Input resolution can be up to 1080p and bitrate can be up to 8.5 Mbps; output is capped at HD quality (720p). You can select an optional transcode preset (see below). Audio for all renditions is transcoded, and an audio-only rendition is available.\\n\\nOptional *transcode presets* (available for the `ADVANCED` types) allow you to trade off available download bandwidth and video quality, to optimize the viewing experience. There are two presets:\\n\\n- *Constrained bandwidth delivery* uses a lower bitrate for each quality level. Use it if you have low download bandwidth and/or simple video content (e.g., talking heads)\\n- *Higher bandwidth delivery* uses a higher bitrate for each quality level. Use it if you have high download bandwidth and/or complex video content (e.g., flashes and quick scene changes).\\n\\n*Default* : `STANDARD`"}},"AWS::IVS::PlaybackKeyPair":{"attributes":{"Arn":"Key-pair ARN. For example: `arn:aws:ivs:us-west-2:693991300569:playback-key/f99cde61-c2b0-4df3-8941-ca7d38acca1a`","Fingerprint":"Key-pair identifier. For example: `98:0d:1a:a0:19:96:1e:ea:0a:0a:2c:9a:42:19:2b:e7`","Ref":"`Ref` returns the playback key pair ARN. For example:\\n\\n`{ \\"Ref\\": \\"myPlaybackKeyPair\\" }`\\n\\nFor the playback key pair `myPlaybackKeyPair` , `Ref` returns the playback key pair ARN."},"description":"The `AWS::IVS::PlaybackKeyPair` resource specifies an playback key pair. uses a public playback key to validate playback tokens that have been signed with the corresponding private key. For more information, see [Setting Up Private Channels](https://docs.aws.amazon.com/ivs/latest/userguide/private-channels.html) in the *Amazon Interactive Video Service User Guide* .","properties":{"Name":"Playback-key-pair name. The value does not need to be unique.","PublicKeyMaterial":"The public portion of a customer-generated key pair.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::IVS::RecordingConfiguration":{"attributes":{"Arn":"The recording configuration ARN. For example: `arn:aws:ivs:us-west-2:123456789012:recording-configuration/abcdABCDefgh`","Ref":"`Ref` returns the recording-configuration ARN. For example:\\n\\n`{ \\"Ref\\": \\"myRecordingConfiguration\\" }`\\n\\nFor the recording configuration `myRecordingConfiguration` , `Ref` returns the recording-configuration ARN.","State":"Indicates the current state of the recording configuration. When the state is `ACTIVE` , the configuration is ready to record a channel stream. Valid values: `CREATING` | `CREATE_FAILED` | `ACTIVE` ."},"description":"The `AWS::IVS::RecordingConfiguration` resource specifies an recording configuration. A recording configuration enables the recording of a channel’s live streams to a data store. Multiple channels can reference the same recording configuration. For more information, see [RecordingConfiguration](https://docs.aws.amazon.com/ivs/latest/APIReference/API_RecordingConfiguration.html) in the *Amazon Interactive Video Service API Reference* .","properties":{"DestinationConfiguration":"A destination configuration contains information about where recorded video will be stored. See the [DestinationConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-destinationconfiguration.html) property type for more information.","Name":"Recording-configuration name. The value does not need to be unique.","RecordingReconnectWindowSeconds":"If a broadcast disconnects and then reconnects within the specified interval, the multiple streams will be considered a single broadcast and merged together.\\n\\n*Default* : `0`","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","ThumbnailConfiguration":"A thumbnail configuration enables/disables the recording of thumbnails for a live session and controls the interval at which thumbnails are generated for the live session. See the [ThumbnailConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-thunbnailconfiguration.html) property type for more information."}},"AWS::IVS::RecordingConfiguration.DestinationConfiguration":{"attributes":{},"description":"The DestinationConfiguration property type describes the location where recorded videos will be stored. Each member represents a type of destination configuration. For recording, you define one and only one type of destination configuration.","properties":{"S3":"An S3 destination configuration where recorded videos will be stored. See the [S3DestinationConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-s3destinationconfiguration.html) property type for more information."}},"AWS::IVS::RecordingConfiguration.S3DestinationConfiguration":{"attributes":{},"description":"The S3DestinationConfiguration property type describes an S3 location where recorded videos will be stored.","properties":{"BucketName":"Location (S3 bucket name) where recorded videos will be stored."}},"AWS::IVS::RecordingConfiguration.ThumbnailConfiguration":{"attributes":{},"description":"The ThumbnailConfiguration property type describes a configuration of thumbnails for recorded video.","properties":{"RecordingMode":"Thumbnail recording mode. Valid values:\\n\\n- `DISABLED` : Use DISABLED to disable the generation of thumbnails for recorded video.\\n- `INTERVAL` : Use INTERVAL to enable the generation of thumbnails for recorded video at a time interval controlled by the [TargetIntervalSeconds](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-thumbnailconfiguration.html#cfn-ivs-recordingconfiguration-thumbnailconfiguration-targetintervalseconds) property.\\n\\n*Default* : `INTERVAL`","TargetIntervalSeconds":"The targeted thumbnail-generation interval in seconds. This is configurable (and required) only if [RecordingMode](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-thumbnailconfiguration.html#cfn-ivs-recordingconfiguration-thumbnailconfiguration-recordingmode) is `INTERVAL` .\\n\\n> Setting a value for `TargetIntervalSeconds` does not guarantee that thumbnails are generated at the specified interval. For thumbnails to be generated at the `TargetIntervalSeconds` interval, the `IDR/Keyframe` value for the input video must be less than the `TargetIntervalSeconds` value. See [Amazon IVS Streaming Configuration](https://docs.aws.amazon.com/ivs/latest/userguide/streaming-config.html) for information on setting `IDR/Keyframe` to the recommended value in video-encoder settings. \\n\\n*Default* : 60\\n\\n*Valid Range* : Minumum value of 5. Maximum value of 60."}},"AWS::IVS::StreamKey":{"attributes":{"Arn":"The stream-key ARN. For example: `arn:aws:ivs:us-west-2:123456789012:stream-key/g1H2I3j4k5L6`","Ref":"`Ref` returns the resource ARN. For example:\\n\\n`{ \\"Ref\\": \\"myStreamKey\\" }`\\n\\nFor the stream key `myStreamKey` , `Ref` returns the stream key ARN.","Value":"The stream-key value. For example: `sk_us-west-2_abcdABCDefgh_567890abcdef`"},"description":"The `AWS::IVS::StreamKey` resource specifies an stream key associated with the referenced channel. Use a stream key to initiate a live stream.","properties":{"ChannelArn":"Channel ARN for the stream.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::IVSChat::LoggingConfiguration":{"attributes":{"Arn":"The logging-configuration ARN. For example: `arn:aws:ivschat:us-west-2:123456789012:logging-configuration/abcdABCDefgh`","Id":"The logging-configuration ID. For example: `abcdABCDefgh`","Ref":"`Ref` returns the logging-configuration ARN. For example:\\n\\n`{ \\"Ref\\": \\"myLoggingConfiguration\\" }`\\n\\nFor the logging configuration `myLoggingConfiguration` , `Ref` returns the logging-configuration ARN.","State":"Indicates the current state of the logging configuration. When the state is `ACTIVE` , the configuration is ready to log a chat session. Valid values: `CREATING` | `CREATE_FAILED` | `DELETING` | `DELETE_FAILED` | `UPDATING` | `UPDATE_FAILED` | `ACTIVE` ."},"description":"The `AWS::IVSChat::LoggingConfiguration` resource specifies an logging configuration that allows clients to store and record sent messages. For more information, see [CreateLoggingConfiguration](https://docs.aws.amazon.com/ivs/latest/ChatAPIReference/API_CreateLoggingConfiguration.html) in the *Amazon Interactive Video Service Chat API Reference* .","properties":{"DestinationConfiguration":"The DestinationConfiguration is a complex type that contains information about where chat content will be logged.","Name":"Logging-configuration name. The value does not need to be unique.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::IVSChat::LoggingConfiguration.CloudWatchLogsDestinationConfiguration":{"attributes":{},"description":"The CloudWatchLogsDestinationConfiguration property type specifies a CloudWatch Logs location where chat logs will be stored.","properties":{"LogGroupName":"Name of the Amazon Cloudwatch Logs destination where chat activity will be logged."}},"AWS::IVSChat::LoggingConfiguration.DestinationConfiguration":{"attributes":{},"description":"The DestinationConfiguration property type describes a location where chat logs will be stored. Each member represents the configuration of one log destination. For logging, you define only one type of destination.","properties":{"CloudWatchLogs":"An Amazon CloudWatch Logs destination configuration where chat activity will be logged.","Firehose":"An Amazon Kinesis Data Firehose destination configuration where chat activity will be logged.","S3":"An Amazon S3 destination configuration where chat activity will be logged."}},"AWS::IVSChat::LoggingConfiguration.FirehoseDestinationConfiguration":{"attributes":{},"description":"The FirehoseDestinationConfiguration property type specifies a Kinesis Firehose location where chat logs will be stored.","properties":{"DeliveryStreamName":"Name of the Amazon Kinesis Firehose delivery stream where chat activity will be logged."}},"AWS::IVSChat::LoggingConfiguration.S3DestinationConfiguration":{"attributes":{},"description":"The S3DestinationConfiguration property type specifies an S3 location where chat logs will be stored.","properties":{"BucketName":"Name of the Amazon S3 bucket where chat activity will be logged."}},"AWS::IVSChat::Room":{"attributes":{"Arn":"The room ARN. For example: `arn:aws:ivschat:us-west-2:123456789012:room/abcdABCDefgh`","Id":"The room ID. For example: `abcdABCDefgh`","Ref":"`Ref` returns the room ARN. For example:\\n\\n`{ \\"Ref\\": \\"myRoom\\" }`\\n\\nFor the room `myRoom` , `Ref` returns the room ARN."},"description":"The `AWS::IVSChat::Room` resource specifies an room that allows clients to connect and pass messages. For more information, see [CreateRoom](https://docs.aws.amazon.com/ivs/latest/ChatAPIReference/API_CreateRoom.html) in the *Amazon Interactive Video Service Chat API Reference* .","properties":{"LoggingConfigurationIdentifiers":"List of logging-configuration identifiers attached to the room.","MaximumMessageLength":"Maximum number of characters in a single message. Messages are expected to be UTF-8 encoded and this limit applies specifically to rune/code-point count, not number of bytes.","MaximumMessageRatePerSecond":"Maximum number of messages per second that can be sent to the room (by all clients).","MessageReviewHandler":"Configuration information for optional review of messages.","Name":"Room name. The value does not need to be unique.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::IVSChat::Room.MessageReviewHandler":{"attributes":{},"description":"The MessageReviewHandler property type specifies configuration information for optional message review.","properties":{"FallbackResult":"Specifies the fallback behavior (whether the message is allowed or denied) if the handler does not return a valid response, encounters an error, or times out. (For the timeout period, see [Service Quotas](https://docs.aws.amazon.com/ivs/latest/userguide/service-quotas.html) .) If allowed, the message is delivered with returned content to all users connected to the room. If denied, the message is not delivered to any user.\\n\\n*Default* : `ALLOW`","Uri":"Identifier of the message review handler. Currently this must be an ARN of a lambda function."}},"AWS::IdentityStore::Group":{"attributes":{"GroupId":"The identifier of the newly created group in the identity store.","Ref":""},"description":"A group object, which contains a specified group’s metadata and attributes.","properties":{"Description":"A string containing the description of the group.","DisplayName":"","IdentityStoreId":""}},"AWS::IdentityStore::GroupMembership":{"attributes":{"MembershipId":"The identifier for a `GroupMembership` in the identity store.","Ref":""},"description":"Contains the identifiers for a group, a group member, and a `GroupMembership` object in the identity store.","properties":{"GroupId":"","IdentityStoreId":"","MemberId":"An object containing the identifier of a group member. Setting `MemberId` \'s `UserId` field to a specific User\'s ID indicates we should consider that User as a group member."}},"AWS::IdentityStore::GroupMembership.MemberId":{"attributes":{},"description":"An object that contains the identifier of a group member. Setting the `UserID` field to the specific identifier for a user indicates that the user is a member of the group.","properties":{"UserId":""}},"AWS::ImageBuilder::Component":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the component. The following pattern is applied: `^arn:aws[^:]*:imagebuilder:[^:]+:(?:\\\\d{12}|aws):(?:image-recipe|infrastructure-configuration|distribution-configuration|component|image|image-pipeline)/[a-z0-9-_]+(?:/(?:(?:x|\\\\d+)\\\\.(?:x|\\\\d+)\\\\.(?:x|\\\\d+))(?:/\\\\d+)?)?$` .","Encrypted":"Returns the encryption status of the component. For example `true` or `false` .","Name":"Returns the name of the component.","Ref":"`Ref` returns the resource ARN, such as `arn:aws:imagebuilder:us-west-2:123456789012:component/examplecomponent/2019.12.02/1` .","Type":"Image Builder determines the component type based on the phases that are defined in the component document. If there is only one phase, and its name is \\"test\\", then the type is `TEST` . For all other components, the type is `BUILD` ."},"description":"Creates a new component that can be used to build, validate, test, and assess your image. The component is based on a YAML document that you specify using exactly one of the following methods:\\n\\n- Inline, using the `data` property in the request body.\\n- A URL that points to a YAML document file stored in Amazon S3, using the `uri` property in the request body.","properties":{"ChangeDescription":"The change description of the component. Describes what change has been made in this version, or what makes this version different from other versions of this component.","Data":"Component `data` contains inline YAML document content for the component. Alternatively, you can specify the `uri` of a YAML document file stored in Amazon S3. However, you cannot specify both properties.","Description":"Describes the contents of the component.","KmsKeyId":"The ID of the KMS key that is used to encrypt this component.","Name":"The name of the component.","Platform":"The operating system platform of the component.","SupportedOsVersions":"The operating system (OS) version supported by the component. If the OS information is available, a prefix match is performed against the base image OS version during image recipe creation.","Tags":"The tags that apply to the component.","Uri":"The `uri` of a YAML component document file. This must be an S3 URL ( `s3://bucket/key` ), and the requester must have permission to access the S3 bucket it points to. If you use Amazon S3, you can specify component content up to your service quota.\\n\\nAlternatively, you can specify the YAML document inline, using the component `data` property. You cannot specify both properties.","Version":"The component version. For example, `1.0.0` ."}},"AWS::ImageBuilder::ContainerRecipe":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the container recipe. For example, `arn:aws:imagebuilder:us-east-1:123456789012:container-recipe/mybasicrecipe/2020.12.17` .","Name":"Returns the name of the container recipe.","Ref":"`Ref` returns the resource ARN, such as `arn:aws:imagebuilder:us-east-1:123456789012:container-recipe/mybasicrecipe/2020.12.17` ."},"description":"Creates a new container recipe. Container recipes define how images are configured, tested, and assessed.","properties":{"Components":"Build and test components that are included in the container recipe. Recipes require a minimum of one build component, and can have a maximum of 20 build and test components in any combination.","ContainerType":"Specifies the type of container, such as Docker.","Description":"The description of the container recipe.","DockerfileTemplateData":"Dockerfiles are text documents that are used to build Docker containers, and ensure that they contain all of the elements required by the application running inside. The template data consists of contextual variables where Image Builder places build information or scripts, based on your container image recipe.","DockerfileTemplateUri":"The S3 URI for the Dockerfile that will be used to build your container image.","ImageOsVersionOverride":"Specifies the operating system version for the base image.","InstanceConfiguration":"A group of options that can be used to configure an instance for building and testing container images.","KmsKeyId":"Identifies which KMS key is used to encrypt the container image for distribution to the target Region.","Name":"The name of the container recipe.","ParentImage":"The base image for the container recipe.","PlatformOverride":"Specifies the operating system platform when you use a custom base image.","Tags":"Tags that are attached to the container recipe.","TargetRepository":"The destination repository for the container image.","Version":"The semantic version of the container recipe.\\n\\n> The semantic version has four nodes: ../. You can assign values for the first three, and can filter on all of them.\\n> \\n> *Assignment:* For the first three nodes you can assign any positive integer value, including zero, with an upper limit of 2^30-1, or 1073741823 for each node. Image Builder automatically assigns the build number to the fourth node.\\n> \\n> *Patterns:* You can use any numeric pattern that adheres to the assignment requirements for the nodes that you can assign. For example, you might choose a software version pattern, such as 1.0.0, or a date, such as 2021.01.01.\\n> \\n> *Filtering:* With semantic versioning, you have the flexibility to use wildcards (x) to specify the most recent versions or nodes when selecting the base image or components for your recipe. When you use a wildcard in any node, all nodes to the right of the first wildcard must also be wildcards.","WorkingDirectory":"The working directory for use during build and test workflows."}},"AWS::ImageBuilder::ContainerRecipe.ComponentConfiguration":{"attributes":{},"description":"Configuration details of the component.","properties":{"ComponentArn":"The Amazon Resource Name (ARN) of the component.","Parameters":""}},"AWS::ImageBuilder::ContainerRecipe.ComponentParameter":{"attributes":{},"description":"","properties":{"Name":"","Value":""}},"AWS::ImageBuilder::ContainerRecipe.EbsInstanceBlockDeviceSpecification":{"attributes":{},"description":"Amazon EBS-specific block device mapping specifications.","properties":{"DeleteOnTermination":"Use to configure delete on termination of the associated device.","Encrypted":"Use to configure device encryption.","Iops":"Use to configure device IOPS.","KmsKeyId":"Use to configure the KMS key to use when encrypting the device.","SnapshotId":"The snapshot that defines the device contents.","Throughput":"*For GP3 volumes only* – The throughput in MiB/s that the volume supports.","VolumeSize":"Use to override the device\'s volume size.","VolumeType":"Use to override the device\'s volume type."}},"AWS::ImageBuilder::ContainerRecipe.InstanceBlockDeviceMapping":{"attributes":{},"description":"Defines block device mappings for the instance used to configure your image.","properties":{"DeviceName":"The device to which these mappings apply.","Ebs":"Use to manage Amazon EBS-specific configuration for this mapping.","NoDevice":"Use to remove a mapping from the base image.","VirtualName":"Use to manage instance ephemeral devices."}},"AWS::ImageBuilder::ContainerRecipe.InstanceConfiguration":{"attributes":{},"description":"Defines a custom base AMI and block device mapping configurations of an instance used for building and testing container images.","properties":{"BlockDeviceMappings":"Defines the block devices to attach for building an instance from this Image Builder AMI.","Image":"The AMI ID to use as the base image for a container build and test instance. If not specified, Image Builder will use the appropriate ECS-optimized AMI as a base image."}},"AWS::ImageBuilder::ContainerRecipe.TargetContainerRepository":{"attributes":{},"description":"The container repository where the output container image is stored.","properties":{"RepositoryName":"The name of the container repository where the output container image is stored. This name is prefixed by the repository location.","Service":"Specifies the service in which this image was registered."}},"AWS::ImageBuilder::DistributionConfiguration":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of this distribution configuration. The following pattern is applied: `^arn:aws[^:]*:imagebuilder:[^:]+:(?:\\\\d{12}|aws):(?:image-recipe|infrastructure-configuration|distribution-configuration|component|image|image-pipeline)/[a-z0-9-_]+(?:/(?:(?:x|\\\\d+)\\\\.(?:x|\\\\d+)\\\\.(?:x|\\\\d+))(?:/\\\\d+)?)?$` .","Name":"Returns the name of the distribution configuration.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the resource, such as `arn:aws:imagebuilder:us-west-2:123456789012:distribution-configuration/myexampledistribution` ."},"description":"A distribution configuration allows you to specify the name and description of your output AMI, authorize other AWS account s to launch the AMI, and replicate the AMI to other AWS Regions . It also allows you to export the AMI to Amazon S3 .","properties":{"Description":"The description of this distribution configuration.","Distributions":"The distributions of this distribution configuration formatted as an array of Distribution objects.","Name":"The name of this distribution configuration.","Tags":"The tags of this distribution configuration."}},"AWS::ImageBuilder::DistributionConfiguration.AmiDistributionConfiguration":{"attributes":{},"description":"Define and configure the output AMIs of the pipeline.","properties":{"AmiTags":"The tags to apply to AMIs distributed to this Region.","Description":"The description of the AMI distribution configuration. Minimum and maximum length are in characters.","KmsKeyId":"The KMS key identifier used to encrypt the distributed image.","LaunchPermissionConfiguration":"Launch permissions can be used to configure which AWS account s can use the AMI to launch instances.","Name":"The name of the output AMI.","TargetAccountIds":"The ID of an account to which you want to distribute an image."}},"AWS::ImageBuilder::DistributionConfiguration.ContainerDistributionConfiguration":{"attributes":{},"description":"Container distribution settings for encryption, licensing, and sharing in a specific Region.","properties":{"ContainerTags":"Tags that are attached to the container distribution configuration.","Description":"The description of the container distribution configuration.","TargetRepository":"The destination repository for the container distribution configuration."}},"AWS::ImageBuilder::DistributionConfiguration.Distribution":{"attributes":{},"description":"The distribution configuration distribution defines the settings for a specific Region in the Distribution Configuration. You must specify whether the distribution is for an AMI or a container image. To do so, include exactly one of the following data types for your distribution:\\n\\n- amiDistributionConfiguration\\n- containerDistributionConfiguration","properties":{"AmiDistributionConfiguration":"The specific AMI settings, such as launch permissions and AMI tags. For details, see example schema below.","ContainerDistributionConfiguration":"Container distribution settings for encryption, licensing, and sharing in a specific Region. For details, see example schema below.","FastLaunchConfigurations":"","LaunchTemplateConfigurations":"A group of launchTemplateConfiguration settings that apply to image distribution for specified accounts.","LicenseConfigurationArns":"The License Manager Configuration to associate with the AMI in the specified Region. For more information, see the [LicenseConfiguration API](https://docs.aws.amazon.com/license-manager/latest/APIReference/API_LicenseConfiguration.html) .","Region":"The target Region for the Distribution Configuration. For example, `eu-west-1` ."}},"AWS::ImageBuilder::DistributionConfiguration.FastLaunchConfiguration":{"attributes":{},"description":"","properties":{"AccountId":"","Enabled":"","LaunchTemplate":"","MaxParallelLaunches":"","SnapshotConfiguration":""}},"AWS::ImageBuilder::DistributionConfiguration.FastLaunchLaunchTemplateSpecification":{"attributes":{},"description":"","properties":{"LaunchTemplateId":"","LaunchTemplateName":"","LaunchTemplateVersion":""}},"AWS::ImageBuilder::DistributionConfiguration.FastLaunchSnapshotConfiguration":{"attributes":{},"description":"","properties":{"TargetResourceCount":""}},"AWS::ImageBuilder::DistributionConfiguration.LaunchPermissionConfiguration":{"attributes":{},"description":"Describes the configuration for a launch permission. The launch permission modification request is sent to the [Amazon EC2 ModifyImageAttribute](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyImageAttribute.html) API on behalf of the user for each Region they have selected to distribute the AMI. To make an AMI public, set the launch permission authorized accounts to `all` . See the examples for making an AMI public at [Amazon EC2 ModifyImageAttribute](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyImageAttribute.html) .","properties":{"OrganizationArns":"The ARN for an AWS Organization that you want to share your AMI with. For more information, see [What is AWS Organizations ?](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) .","OrganizationalUnitArns":"The ARN for an AWS Organizations organizational unit (OU) that you want to share your AMI with. For more information about key concepts for AWS Organizations , see [AWS Organizations terminology and concepts](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html) .","UserGroups":"The name of the group.","UserIds":"The AWS account ID."}},"AWS::ImageBuilder::DistributionConfiguration.LaunchTemplateConfiguration":{"attributes":{},"description":"Identifies an Amazon EC2 launch template to use for a specific account.","properties":{"AccountId":"The account ID that this configuration applies to.","LaunchTemplateId":"Identifies the Amazon EC2 launch template to use.","SetDefaultVersion":"Set the specified Amazon EC2 launch template as the default launch template for the specified account."}},"AWS::ImageBuilder::DistributionConfiguration.TargetContainerRepository":{"attributes":{},"description":"The container repository where the output container image is stored.","properties":{"RepositoryName":"The name of the container repository where the output container image is stored. This name is prefixed by the repository location.","Service":"Specifies the service in which this image was registered."}},"AWS::ImageBuilder::Image":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the image. For example, `arn:aws:imagebuilder:us-west-2:123456789012:image/mybasicrecipe/2019.12.03/1` .","ImageId":"Returns the AMI ID of the Amazon EC2 AMI in the Region in which you are using Image Builder. Values are returned only for AMIs, and not for container images.","ImageUri":"Returns a list of URIs for container images created in the context Region. Values are returned only for container images, and not for AMIs.","Name":"Returns the name of the image.","Ref":"`Ref` returns the resource ARN, such as `arn:aws:imagebuilder:us-west-2:123456789012:image/my-example-image` ."},"description":"An image build version. An image is a customized, secure, and up-to-date “golden” server image that is pre-installed and pre-configured with software and settings to meet specific IT standards.","properties":{"ContainerRecipeArn":"The Amazon Resource Name (ARN) of the container recipe that is used for this pipeline.","DistributionConfigurationArn":"The Amazon Resource Name (ARN) of the distribution configuration.","EnhancedImageMetadataEnabled":"Indicates whether Image Builder collects additional information about the image, such as the operating system (OS) version and package list.","ImageRecipeArn":"The Amazon Resource Name (ARN) of the image recipe.","ImageScanningConfiguration":"","ImageTestsConfiguration":"The configuration settings for your image test components, which includes a toggle that allows you to turn off tests, and a timeout setting.","InfrastructureConfigurationArn":"The Amazon Resource Name (ARN) of the infrastructure configuration associated with this image pipeline.","Tags":"The tags of the image."}},"AWS::ImageBuilder::Image.EcrConfiguration":{"attributes":{},"description":"","properties":{"ContainerTags":"","RepositoryName":""}},"AWS::ImageBuilder::Image.ImageScanningConfiguration":{"attributes":{},"description":"","properties":{"EcrConfiguration":"","ImageScanningEnabled":""}},"AWS::ImageBuilder::Image.ImageTestsConfiguration":{"attributes":{},"description":"When you create an image or container recipe with Image Builder , you can add the build or test components that are used to create the final image. You must have at least one build component to create a recipe, but test components are not required. If you have added tests, they run after the image is created, to ensure that the target image is functional and can be used reliably for launching Amazon EC2 instances.","properties":{"ImageTestsEnabled":"Determines if tests should run after building the image. Image Builder defaults to enable tests to run following the image build, before image distribution.","TimeoutMinutes":"The maximum time in minutes that tests are permitted to run.\\n\\n> The timeoutMinutes attribute is not currently active. This value is ignored."}},"AWS::ImageBuilder::ImagePipeline":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the image pipeline. For example, `arn:aws:imagebuilder:us-west-2:123456789012:image-pipeline/mywindows2016pipeline` .","Name":"Returns the name of the image pipeline.","Ref":"`Ref` returns the resource ARN, such as `arn:aws:imagebuilder:us-west-2:123456789012:image-pipeline/mywindows2016pipeline` ."},"description":"An image pipeline is the automation configuration for building secure OS images on AWS . The Image Builder image pipeline is associated with an image recipe that defines the build, validation, and test phases for an image build lifecycle. An image pipeline can be associated with an infrastructure configuration that defines where your image is built. You can define attributes, such as instance type, subnets, security groups, logging, and other infrastructure-related configurations. You can also associate your image pipeline with a distribution configuration to define how you would like to deploy your image.","properties":{"ContainerRecipeArn":"The Amazon Resource Name (ARN) of the container recipe that is used for this pipeline.","Description":"The description of this image pipeline.","DistributionConfigurationArn":"The Amazon Resource Name (ARN) of the distribution configuration associated with this image pipeline.","EnhancedImageMetadataEnabled":"Collects additional information about the image being created, including the operating system (OS) version and package list. This information is used to enhance the overall experience of using EC2 Image Builder. Enabled by default.","ImageRecipeArn":"The Amazon Resource Name (ARN) of the image recipe associated with this image pipeline.","ImageScanningConfiguration":"","ImageTestsConfiguration":"The configuration of the image tests that run after image creation to ensure the quality of the image that was created.","InfrastructureConfigurationArn":"The Amazon Resource Name (ARN) of the infrastructure configuration associated with this image pipeline.","Name":"The name of the image pipeline.","Schedule":"The schedule of the image pipeline. A schedule configures how often and when a pipeline automatically creates a new image.","Status":"The status of the image pipeline.","Tags":"The tags of this image pipeline."}},"AWS::ImageBuilder::ImagePipeline.EcrConfiguration":{"attributes":{},"description":"","properties":{"ContainerTags":"","RepositoryName":""}},"AWS::ImageBuilder::ImagePipeline.ImageScanningConfiguration":{"attributes":{},"description":"","properties":{"EcrConfiguration":"","ImageScanningEnabled":""}},"AWS::ImageBuilder::ImagePipeline.ImageTestsConfiguration":{"attributes":{},"description":"When you create an image or container recipe with Image Builder , you can add the build or test components that your image pipeline uses to create the final image. You must have at least one build component to create a recipe, but test components are not required. Your pipeline runs tests after it builds the image, to ensure that the target image is functional and can be used reliably for launching Amazon EC2 instances.","properties":{"ImageTestsEnabled":"Defines if tests should be executed when building this image. For example, `true` or `false` .","TimeoutMinutes":"The maximum time in minutes that tests are permitted to run.\\n\\n> The timeoutMinutes attribute is not currently active. This value is ignored."}},"AWS::ImageBuilder::ImagePipeline.Schedule":{"attributes":{},"description":"A schedule configures how often and when a pipeline will automatically create a new image.","properties":{"PipelineExecutionStartCondition":"The condition configures when the pipeline should trigger a new image build. When the `pipelineExecutionStartCondition` is set to `EXPRESSION_MATCH_AND_DEPENDENCY_UPDATES_AVAILABLE` , and you use semantic version filters on the base image or components in your image recipe, Image Builder will build a new image only when there are new versions of the image or components in your recipe that match the semantic version filter. When it is set to `EXPRESSION_MATCH_ONLY` , it will build a new image every time the CRON expression matches the current time. For semantic version syntax, see [CreateComponent](https://docs.aws.amazon.com/imagebuilder/latest/APIReference/API_CreateComponent.html) in the *Image Builder API Reference* .","ScheduleExpression":"The cron expression determines how often EC2 Image Builder evaluates your `pipelineExecutionStartCondition` .\\n\\nFor information on how to format a cron expression in Image Builder, see [Use cron expressions in EC2 Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/image-builder-cron.html) ."}},"AWS::ImageBuilder::ImageRecipe":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the image recipe. For example, `arn:aws:imagebuilder:us-east-1:123456789012:image-recipe/mybasicrecipe/2019.12.03` .","Name":"The name of the image recipe.","Ref":"`Ref` returns the resource ARN, such as `arn:aws:imagebuilder:us-east-1:123456789012:image-recipe/mybasicrecipe/2019.12.03` ."},"description":"An Image Builder image recipe is a document that defines the base image and the components to be applied to the base image to produce the desired configuration for the output image. You can use an image recipe to duplicate builds. Image Builder image recipes can be shared, branched, and edited using the console wizard, the AWS CLI , or the API. You can use image recipes with your version control software to maintain shareable versioned image recipes.","properties":{"AdditionalInstanceConfiguration":"Before you create a new AMI, Image Builder launches temporary Amazon EC2 instances to build and test your image configuration. Instance configuration adds a layer of control over those instances. You can define settings and add scripts to run when an instance is launched from your AMI.","BlockDeviceMappings":"The block device mappings to apply when creating images from this recipe.","Components":"The components of the image recipe. Components are orchestration documents that define a sequence of steps for downloading, installing, configuring, and testing software packages. They also define validation and security hardening steps. A component is defined using a YAML document format.","Description":"The description of the image recipe.","Name":"The name of the image recipe.","ParentImage":"The parent image of the image recipe. The string must be either an Image ARN or an AMI ID.","Tags":"The tags of the image recipe.","Version":"The semantic version of the image recipe.","WorkingDirectory":"The working directory to be used during build and test workflows."}},"AWS::ImageBuilder::ImageRecipe.AdditionalInstanceConfiguration":{"attributes":{},"description":"In addition to your infrastructure configuration, these settings provide an extra layer of control over your build instances. You can also specify commands to run on launch for all of your build instances.\\n\\nImage Builder does not automatically install the Systems Manager agent on Windows instances. If your base image includes the Systems Manager agent, then the AMI that you create will also include the agent. For Linux instances, if the base image does not already include the Systems Manager agent, Image Builder installs it. For Linux instances where Image Builder installs the Systems Manager agent, you can choose whether to keep it for the AMI that you create.","properties":{"SystemsManagerAgent":"Contains settings for the Systems Manager agent on your build instance.","UserDataOverride":"Use this property to provide commands or a command script to run when you launch your build instance.\\n\\nThe userDataOverride property replaces any commands that Image Builder might have added to ensure that Systems Manager is installed on your Linux build instance. If you override the user data, make sure that you add commands to install Systems Manager, if it is not pre-installed on your base image.\\n\\n> The user data is always base 64 encoded. For example, the following commands are encoded as `IyEvYmluL2Jhc2gKbWtkaXIgLXAgL3Zhci9iYi8KdG91Y2ggL3Zhci$` :\\n> \\n> *#!/bin/bash*\\n> \\n> mkdir -p /var/bb/\\n> \\n> touch /var"}},"AWS::ImageBuilder::ImageRecipe.ComponentConfiguration":{"attributes":{},"description":"Configuration details of the component.","properties":{"ComponentArn":"The Amazon Resource Name (ARN) of the component.","Parameters":"A group of parameter settings that Image Builder uses to configure the component for a specific recipe."}},"AWS::ImageBuilder::ImageRecipe.ComponentParameter":{"attributes":{},"description":"Contains a key/value pair that sets the named component parameter.","properties":{"Name":"The name of the component parameter to set.","Value":"Sets the value for the named component parameter."}},"AWS::ImageBuilder::ImageRecipe.EbsInstanceBlockDeviceSpecification":{"attributes":{},"description":"The image recipe EBS instance block device specification includes the Amazon EBS-specific block device mapping specifications for the image.","properties":{"DeleteOnTermination":"Configures delete on termination of the associated device.","Encrypted":"Use to configure device encryption.","Iops":"Use to configure device IOPS.","KmsKeyId":"Use to configure the KMS key to use when encrypting the device.","SnapshotId":"The snapshot that defines the device contents.","Throughput":"*For GP3 volumes only* – The throughput in MiB/s that the volume supports.","VolumeSize":"Overrides the volume size of the device.","VolumeType":"Overrides the volume type of the device."}},"AWS::ImageBuilder::ImageRecipe.InstanceBlockDeviceMapping":{"attributes":{},"description":"Defines block device mappings for the instance used to configure your image.","properties":{"DeviceName":"The device to which these mappings apply.","Ebs":"Use to manage Amazon EBS-specific configuration for this mapping.","NoDevice":"Enter an empty string to remove a mapping from the parent image.\\n\\nThe following is an example of an empty string value in the `NoDevice` field.\\n\\n`NoDevice:\\"\\"`","VirtualName":"Manages the instance ephemeral devices."}},"AWS::ImageBuilder::ImageRecipe.SystemsManagerAgent":{"attributes":{},"description":"Contains settings for the Systems Manager agent on your build instance.","properties":{"UninstallAfterBuild":"Controls whether the Systems Manager agent is removed from your final build image, prior to creating the new AMI. If this is set to true, then the agent is removed from the final image. If it\'s set to false, then the agent is left in, so that it is included in the new AMI. The default value is false."}},"AWS::ImageBuilder::InfrastructureConfiguration":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the infrastructure configuration. The following pattern is applied: `^arn:aws[^:]*:imagebuilder:[^:]+:(?:\\\\d{12}|aws):(?:image-recipe|infrastructure-configuration|distribution-configuration|component|image|image-pipeline)/[a-z0-9-_]+(?:/(?:(?:x|\\\\d+)\\\\.(?:x|\\\\d+)\\\\.(?:x|\\\\d+))(?:/\\\\d+)?)?$` .","Name":"The name of the infrastructure configuration.","Ref":"`Ref` returns the resource ARN, such as `arn:aws:imagebuilder:us-west-2:123456789012:infrastructure-configuration/my-example-infrastructure` ."},"description":"The infrastructure configuration allows you to specify the infrastructure within which to build and test your image. In the infrastructure configuration, you can specify instance types, subnets, and security groups to associate with your instance. You can also associate an Amazon EC2 key pair with the instance used to build your image. This allows you to log on to your instance to troubleshoot if your build fails and you set terminateInstanceOnFailure to false.","properties":{"Description":"The description of the infrastructure configuration.","InstanceMetadataOptions":"The instance metadata option settings for the infrastructure configuration.","InstanceProfileName":"The instance profile of the infrastructure configuration.","InstanceTypes":"The instance types of the infrastructure configuration.","KeyPair":"The Amazon EC2 key pair of the infrastructure configuration.","Logging":"The logging configuration defines where Image Builder uploads your logs.","Name":"The name of the infrastructure configuration.","ResourceTags":"The tags attached to the resource created by Image Builder.","SecurityGroupIds":"The security group IDs of the infrastructure configuration.","SnsTopicArn":"The Amazon Resource Name (ARN) of the SNS topic for the infrastructure configuration.","SubnetId":"The subnet ID of the infrastructure configuration.","Tags":"The tags of the infrastructure configuration.","TerminateInstanceOnFailure":"The terminate instance on failure configuration of the infrastructure configuration."}},"AWS::ImageBuilder::InfrastructureConfiguration.InstanceMetadataOptions":{"attributes":{},"description":"The instance metadata options that apply to the HTTP requests that pipeline builds use to launch EC2 build and test instances. For more information about instance metadata options, see [Configure the instance metadata options](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html) in the **Amazon EC2 User Guide** for Linux instances, or [Configure the instance metadata options](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/configuring-instance-metadata-options.html) in the **Amazon EC2 Windows Guide** for Windows instances.","properties":{"HttpPutResponseHopLimit":"Limit the number of hops that an instance metadata request can traverse to reach its destination. The default is one hop. However, if HTTP tokens are required, container image builds need a minimum of two hops.","HttpTokens":"Indicates whether a signed token header is required for instance metadata retrieval requests. The values affect the response as follows:\\n\\n- *required* – When you retrieve the IAM role credentials, version 2.0 credentials are returned in all cases.\\n- *optional* – You can include a signed token header in your request to retrieve instance metadata, or you can leave it out. If you include it, version 2.0 credentials are returned for the IAM role. Otherwise, version 1.0 credentials are returned.\\n\\nThe default setting is *optional* ."}},"AWS::ImageBuilder::InfrastructureConfiguration.Logging":{"attributes":{},"description":"Logging configuration defines where Image Builder uploads your logs.","properties":{"S3Logs":"The Amazon S3 logging configuration."}},"AWS::ImageBuilder::InfrastructureConfiguration.S3Logs":{"attributes":{},"description":"Amazon S3 logging configuration.","properties":{"S3BucketName":"The S3 bucket in which to store the logs.","S3KeyPrefix":"The Amazon S3 path to the bucket where the logs are stored."}},"AWS::Inspector::AssessmentTarget":{"attributes":{"Arn":"The Amazon Resource Name (ARN) that specifies the assessment target that is created.","Ref":"`Ref` returns the `ResourceGroupArn` of the new assessment target."},"description":"The `AWS::Inspector::AssessmentTarget` resource is used to create Amazon Inspector assessment targets, which specify the Amazon EC2 instances that will be analyzed during an assessment run.","properties":{"AssessmentTargetName":"The name of the Amazon Inspector assessment target. The name must be unique within the AWS account .","ResourceGroupArn":"The ARN that specifies the resource group that is used to create the assessment target. If `resourceGroupArn` is not specified, all EC2 instances in the current AWS account and Region are included in the assessment target."}},"AWS::Inspector::AssessmentTemplate":{"attributes":{"Arn":"The Amazon Resource Name (ARN) that specifies the assessment template that is created.","Ref":"`Ref` returns the `AssessmentTargetArn` of the new assessment template."},"description":"The `AWS::Inspector::AssessmentTemplate` resource creates an Amazon Inspector assessment template, which specifies the Inspector assessment targets that will be evaluated by an assessment run and its related configurations.","properties":{"AssessmentTargetArn":"The ARN of the assessment target to be included in the assessment template.","AssessmentTemplateName":"The user-defined name that identifies the assessment template that you want to create. You can create several assessment templates for the same assessment target. The names of the assessment templates that correspond to a particular assessment target must be unique.","DurationInSeconds":"The duration of the assessment run in seconds.","RulesPackageArns":"The ARNs of the rules packages that you want to use in the assessment template.","UserAttributesForFindings":"The user-defined attributes that are assigned to every finding that is generated by the assessment run that uses this assessment template. Within an assessment template, each key must be unique."}},"AWS::Inspector::ResourceGroup":{"attributes":{"Arn":"The Amazon Resource Name (ARN) that specifies the resource group that is created.","Ref":"`Ref` returns the ARN of the new resource group."},"description":"The `AWS::Inspector::ResourceGroup` resource is used to create Amazon Inspector resource groups. A resource group defines a set of tags that, when queried, identify the AWS resources that make up the assessment target.","properties":{"ResourceGroupTags":"The tags (key and value pairs) that will be associated with the resource group.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::InspectorV2::Filter":{"attributes":{"Arn":"The Amazon Resource Number (ARN) associated with this filter.","Ref":"`Ref` returns the ARN of the filter. For example:\\n\\n`arn:aws:inspector2:us-east-1:012345678901:owner/012345678901/filter/c1c0fe5d28e39baa`"},"description":"Details about a filter.","properties":{"Description":"A description of the filter.","FilterAction":"The action that is to be applied to the findings that match the filter.","FilterCriteria":"Details on the filter criteria associated with this filter.","Name":"The name of the filter."}},"AWS::InspectorV2::Filter.DateFilter":{"attributes":{},"description":"Contains details on the time range used to filter findings.","properties":{"EndInclusive":"A timestamp representing the end of the time period filtered on.","StartInclusive":"A timestamp representing the start of the time period filtered on."}},"AWS::InspectorV2::Filter.FilterCriteria":{"attributes":{},"description":"Details on the criteria used to define the filter.","properties":{"AwsAccountId":"Details of the AWS account IDs used to filter findings.","ComponentId":"Details of the component IDs used to filter findings.","ComponentType":"Details of the component types used to filter findings.","Ec2InstanceImageId":"Details of the Amazon EC2 instance image IDs used to filter findings.","Ec2InstanceSubnetId":"Details of the Amazon EC2 instance subnet IDs used to filter findings.","Ec2InstanceVpcId":"Details of the Amazon EC2 instance VPC IDs used to filter findings.","EcrImageArchitecture":"Details of the Amazon ECR image architecture types used to filter findings.","EcrImageHash":"Details of the Amazon ECR image hashes used to filter findings.","EcrImagePushedAt":"Details on the Amazon ECR image push date and time used to filter findings.","EcrImageRegistry":"Details on the Amazon ECR registry used to filter findings.","EcrImageRepositoryName":"Details on the name of the Amazon ECR repository used to filter findings.","EcrImageTags":"The tags attached to the Amazon ECR container image.","FindingArn":"Details on the finding ARNs used to filter findings.","FindingStatus":"Details on the finding status types used to filter findings.","FindingType":"Details on the finding types used to filter findings.","FirstObservedAt":"Details on the date and time a finding was first seen used to filter findings.","InspectorScore":"The Amazon Inspector score to filter on.","LastObservedAt":"Details on the date and time a finding was last seen used to filter findings.","NetworkProtocol":"Details on network protocol used to filter findings.","PortRange":"Details on the port ranges used to filter findings.","RelatedVulnerabilities":"Details on the related vulnerabilities used to filter findings.","ResourceId":"Details on the resource IDs used to filter findings.","ResourceTags":"Details on the resource tags used to filter findings.","ResourceType":"Details on the resource types used to filter findings.","Severity":"Details on the severity used to filter findings.","Title":"Details on the finding title used to filter findings.","UpdatedAt":"Details on the date and time a finding was last updated at used to filter findings.","VendorSeverity":"Details on the vendor severity used to filter findings.","VulnerabilityId":"Details on the vulnerability ID used to filter findings.","VulnerabilitySource":"Details on the vulnerability score to filter findings by.","VulnerablePackages":"Details on the vulnerable packages used to filter findings."}},"AWS::InspectorV2::Filter.MapFilter":{"attributes":{},"description":"An object that describes details of a map filter.","properties":{"Comparison":"The operator to use when comparing values in the filter.","Key":"The tag key used in the filter.","Value":"The tag value used in the filter."}},"AWS::InspectorV2::Filter.NumberFilter":{"attributes":{},"description":"An object that describes the details of a number filter.","properties":{"LowerInclusive":"The lowest number to be included in the filter.","UpperInclusive":"The highest number to be included in the filter."}},"AWS::InspectorV2::Filter.PackageFilter":{"attributes":{},"description":"Contains information on the details of a package filter.","properties":{"Architecture":"An object that contains details on the package architecture type to filter on.","Epoch":"An object that contains details on the package epoch to filter on.","Name":"An object that contains details on the name of the package to filter on.","Release":"An object that contains details on the package release to filter on.","SourceLayerHash":"An object that contains details on the source layer hash to filter on.","Version":"The package version to filter on."}},"AWS::InspectorV2::Filter.PortRangeFilter":{"attributes":{},"description":"An object that describes the details of a port range filter.","properties":{"BeginInclusive":"The port number the port range begins at.","EndInclusive":"The port number the port range ends at."}},"AWS::InspectorV2::Filter.StringFilter":{"attributes":{},"description":"An object that describes the details of a string filter.","properties":{"Comparison":"The operator to use when comparing values in the filter.","Value":"The value to filter on."}},"AWS::InternetMonitor::Monitor":{"attributes":{"CreatedAt":"The time when the monitor was created.","ModifiedAt":"The last time that the monitor was modified.","MonitorArn":"The Amazon Resource Name (ARN) of the monitor.","ProcessingStatus":"The health of data processing for the monitor. For more information, see `ProcessingStatus` under [MonitorListMember](https://docs.aws.amazon.com/internet-monitor/latest/api/API_MonitorListMember.html) in the *Amazon CloudWatch Internet Monitor API Reference* .","ProcessingStatusInfo":"Additional information about the health of the data processing for the monitor.","Ref":"`Ref` returns the ARN of the monitor, such as `arn:aws:internetmonitor:us-east-1:111122223333:monitor/TestMonitor` ."},"description":"The `AWS::InternetMonitor::Monitor` resource is an Internet Monitor resource type that contains information about how you create a monitor in Amazon CloudWatch Internet Monitor. A monitor in Internet Monitor provides visibility into performance and availability between your applications hosted on AWS and your end users, using a traffic profile that it creates based on the application resources that you add: Virtual Private Clouds (VPCs), Amazon CloudFront distributions, or WorkSpaces directories.\\n\\nInternet Monitor also alerts you to internet issues that impact your application in the city-networks (geographies and networks) where your end users use it. With Internet Monitor, you can quickly pinpoint the locations and providers that are affected, so that you can address the issue.\\n\\nFor more information, see [Using Amazon CloudWatch Internet Monitor](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-InternetMonitor.html) in the *Amazon CloudWatch User Guide* .","properties":{"HealthEventsConfig":"","InternetMeasurementsLogDelivery":"Publish internet measurements for a monitor for all city-networks (up to the 500,000 service limit) to another location, such as an Amazon S3 bucket. Measurements are also published to Amazon CloudWatch Logs for the first 500 (by traffic volume) city-networks (client locations and ASNs, typically internet service providers or ISPs).","MaxCityNetworksToMonitor":"The maximum number of city-networks to monitor for your resources. A city-network is the location (city) where clients access your application resources from and the network, such as an internet service provider, that clients access the resources through.\\n\\nFor more information, see [Choosing a city-network maximum value](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/IMCityNetworksMaximum.html) in *Using Amazon CloudWatch Internet Monitor* .","MonitorName":"The name of the monitor. A monitor name can contain only alphanumeric characters, dashes (-), periods (.), and underscores (_).","Resources":"The resources that have been added for the monitor, listed by their Amazon Resource Names (ARNs).","ResourcesToAdd":"The resources to add to a monitor, which you provide as a set of Amazon Resource Names (ARNs).\\n\\nYou can add a combination of Virtual Private Clouds (VPCs) and Amazon CloudFront distributions, or you can add WorkSpaces directories. You can\'t add all three types of resources.\\n\\n> If you add only VPC resources, at least one VPC must have an Internet Gateway attached to it, to make sure that it has internet connectivity.","ResourcesToRemove":"The resources to remove from a monitor, which you provide as a set of Amazon Resource Names (ARNs).","Status":"The status of a monitor. The accepted values that you can specify for `Status` are `ACTIVE` and `INACTIVE` .","Tags":"The tags for a monitor, listed as a set of *key:value* pairs.","TrafficPercentageToMonitor":"The percentage of the internet-facing traffic for your application that you want to monitor. You can also, optionally, set a limit for the number of city-networks (client locations and ASNs, typically internet service providers) that Internet Monitor will monitor traffic for. The city-networks maximum limit caps the number of city-networks that Internet Monitor monitors for your application, regardless of the percentage of traffic that you choose to monitor."}},"AWS::InternetMonitor::Monitor.HealthEventsConfig":{"attributes":{},"description":"","properties":{"AvailabilityScoreThreshold":"","PerformanceScoreThreshold":""}},"AWS::InternetMonitor::Monitor.InternetMeasurementsLogDelivery":{"attributes":{},"description":"","properties":{"S3Config":"The configuration information for publishing Amazon CloudWatch Internet Monitor internet measurements to Amazon S3. The configuration includes the bucket name and (optionally) bucket prefix for the S3 bucket to store the measurements, and the delivery status. The delivery status is `ENABLED` if you choose to deliver internet measurements to an S3 bucket, and `DISABLED` otherwise."}},"AWS::InternetMonitor::Monitor.S3Config":{"attributes":{},"description":"The configuration for publishing Amazon CloudWatch Internet Monitor internet measurements to Amazon S3. The configuration includes the bucket name and (optionally) bucket prefix for the S3 bucket to store the measurements, and the delivery status. The delivery status is `ENABLED` if you choose to deliver internet measurements to S3 logs, and `DISABLED` otherwise.","properties":{"BucketName":"The Amazon S3 bucket name for internet measurements publishing.","BucketPrefix":"An optional Amazon S3 bucket prefix for internet measurements publishing.","LogDeliveryStatus":"The status of publishing Internet Monitor internet measurements to an Amazon S3 bucket. The delivery status is `ENABLED` if you choose to deliver internet measurements to an S3 bucket, and `DISABLED` otherwise."}},"AWS::IoT1Click::Device":{"attributes":{"Arn":"The ARN of the device, such as `arn:aws:iot1click:us-west-2:123456789012:devices/G030PX0312744DWM` .","DeviceId":"The unique identifier of the device.","Enabled":"A Boolean value indicating whether the device is enabled ( `true` ) or not ( `false` ).","Ref":"`Ref` returns the device ARN, such as `arn:aws:iot1click:us-west-2:123456789012:devices/G030PX0312744DWM` ."},"description":"The `AWS::IoT1Click::Device` resource controls the enabled state of an AWS IoT 1-Click compatible device. For more information, see [Device](https://docs.aws.amazon.com/iot-1-click/1.0/devices-apireference/devices-deviceid.html) in the *AWS IoT 1-Click Devices API Reference* .","properties":{"DeviceId":"The ID of the device, such as `G030PX0312744DWM` .","Enabled":"A Boolean value indicating whether the device is enabled ( `true` ) or not ( `false` )."}},"AWS::IoT1Click::Placement":{"attributes":{"PlacementName":"The name of the placement, such as `floor17` .","ProjectName":"The name of the project containing the placement, such as `conference-rooms` .","Ref":"`Ref` returns a string of the form `projects/A/placements/B` , where A is the name of the project and B is the name of the placement."},"description":"The `AWS::IoT1Click::Placement` resource creates a placement to be associated with an AWS IoT 1-Click project. A placement is an instance of a device in a location. For more information, see [Projects, Templates, and Placements](https://docs.aws.amazon.com/iot-1-click/latest/developerguide/1click-PTP.html) in the *AWS IoT 1-Click Developer Guide* .","properties":{"AssociatedDevices":"The devices to associate with the placement, as defined by a mapping of zero or more key-value pairs wherein the key is a template name and the value is a device ID.","Attributes":"The user-defined attributes associated with the placement.","PlacementName":"The name of the placement.","ProjectName":"The name of the project containing the placement."}},"AWS::IoT1Click::Project":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the project, such as `arn:aws:iot1click:us-east-1:123456789012:projects/project-a1bzhi` .","ProjectName":"The name of the project, such as `project-a1bzhi` .","Ref":"`Ref` returns the project ARN, such as `arn:aws:iot1click:us-west-2:0123456789012:projects/test-project` ."},"description":"The `AWS::IoT1Click::Project` resource creates an empty project with a placement template. A project contains zero or more placements that adhere to the placement template defined in the project. For more information, see [CreateProject](https://docs.aws.amazon.com/iot-1-click/latest/projects-apireference/API_CreateProject.html) in the *AWS IoT 1-Click Projects API Reference* .","properties":{"Description":"The description of the project.","PlacementTemplate":"An object describing the project\'s placement specifications.","ProjectName":"The name of the project from which to obtain information."}},"AWS::IoT1Click::Project.DeviceTemplate":{"attributes":{},"description":"In AWS CloudFormation , use the `DeviceTemplate` property type to define the template for an AWS IoT 1-Click project.\\n\\n`DeviceTemplate` is a property of the `AWS::IoT1Click::Project` resource.","properties":{"CallbackOverrides":"An optional AWS Lambda function to invoke instead of the default AWS Lambda function provided by the placement template.","DeviceType":"The device type, which currently must be `\\"button\\"` ."}},"AWS::IoT1Click::Project.PlacementTemplate":{"attributes":{},"description":"In AWS CloudFormation , use the `PlacementTemplate` property type to define the template for an AWS IoT 1-Click project.\\n\\n`PlacementTemplate` is a property of the `AWS::IoT1Click::Project` resource.","properties":{"DefaultAttributes":"The default attributes (key-value pairs) to be applied to all placements using this template.","DeviceTemplates":"An object specifying the [DeviceTemplate](https://docs.aws.amazon.com/iot-1-click/latest/projects-apireference/API_DeviceTemplate.html) for all placements using this ( [PlacementTemplate](https://docs.aws.amazon.com/iot-1-click/latest/projects-apireference/API_PlacementTemplate.html) ) template."}},"AWS::IoT::AccountAuditConfiguration":{"attributes":{"Ref":"`Ref` returns the account ID."},"description":"Use the `AWS::IoT::AccountAuditConfiguration` resource to configure or reconfigure the Device Defender audit settings for your account. Settings include how audit notifications are sent and which audit checks are enabled or disabled. For API reference, see [UpdateAccountAuditConfiguration](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAccountAuditConfiguration.html) and for detailed information on all available audit checks, see [Audit checks](https://docs.aws.amazon.com/iot/latest/developerguide/device-defender-audit-checks.html) .","properties":{"AccountId":"The ID of the account. You can use the expression `!Sub \\"${AWS::AccountId}\\"` to use your account ID.","AuditCheckConfigurations":"Specifies which audit checks are enabled and disabled for this account.\\n\\nSome data collection might start immediately when certain checks are enabled. When a check is disabled, any data collected so far in relation to the check is deleted. To disable a check, set the value of the `Enabled:` key to `false` .\\n\\nIf an enabled check is removed from the template, it will also be disabled.\\n\\nYou can\'t disable a check if it\'s used by any scheduled audit. You must delete the check from the scheduled audit or delete the scheduled audit itself to disable the check.\\n\\nFor more information on avialbe auidt checks see [AWS::IoT::AccountAuditConfiguration AuditCheckConfigurations](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html)","AuditNotificationTargetConfigurations":"Information about the targets to which audit notifications are sent.","RoleArn":"The Amazon Resource Name (ARN) of the role that grants permission to AWS IoT to access information about your devices, policies, certificates, and other items as required when performing an audit."}},"AWS::IoT::AccountAuditConfiguration.AuditCheckConfiguration":{"attributes":{},"description":"Which audit checks are enabled and disabled for this account.","properties":{"Enabled":"True if this audit check is enabled for this account."}},"AWS::IoT::AccountAuditConfiguration.AuditCheckConfigurations":{"attributes":{},"description":"The types of audit checks that can be performed.","properties":{"AuthenticatedCognitoRoleOverlyPermissiveCheck":"Checks the permissiveness of an authenticated Amazon Cognito identity pool role. For this check, AWS IoT Device Defender audits all Amazon Cognito identity pools that have been used to connect to the AWS IoT message broker during the 31 days before the audit is performed.","CaCertificateExpiringCheck":"Checks if a CA certificate is expiring. This check applies to CA certificates expiring within 30 days or that have expired.","CaCertificateKeyQualityCheck":"Checks the quality of the CA certificate key. The quality checks if the key is in a valid format, not expired, and if the key meets a minimum required size. This check applies to CA certificates that are `ACTIVE` or `PENDING_TRANSFER` .","ConflictingClientIdsCheck":"Checks if multiple devices connect using the same client ID.","DeviceCertificateExpiringCheck":"Checks if a device certificate is expiring. This check applies to device certificates expiring within 30 days or that have expired.","DeviceCertificateKeyQualityCheck":"Checks the quality of the device certificate key. The quality checks if the key is in a valid format, not expired, signed by a registered certificate authority, and if the key meets a minimum required size.","DeviceCertificateSharedCheck":"Checks if multiple concurrent connections use the same X.509 certificate to authenticate with AWS IoT .","IntermediateCaRevokedForActiveDeviceCertificatesCheck":"","IoTPolicyPotentialMisConfigurationCheck":"","IotPolicyOverlyPermissiveCheck":"Checks the permissiveness of a policy attached to an authenticated Amazon Cognito identity pool role.","IotRoleAliasAllowsAccessToUnusedServicesCheck":"Checks if a role alias has access to services that haven\'t been used for the AWS IoT device in the last year.","IotRoleAliasOverlyPermissiveCheck":"Checks if the temporary credentials provided by AWS IoT role aliases are overly permissive.","LoggingDisabledCheck":"Checks if AWS IoT logs are disabled.","RevokedCaCertificateStillActiveCheck":"Checks if a revoked CA certificate is still active.","RevokedDeviceCertificateStillActiveCheck":"Checks if a revoked device certificate is still active.","UnauthenticatedCognitoRoleOverlyPermissiveCheck":"Checks if policy attached to an unauthenticated Amazon Cognito identity pool role is too permissive."}},"AWS::IoT::AccountAuditConfiguration.AuditNotificationTarget":{"attributes":{},"description":"Information about the targets to which audit notifications are sent.","properties":{"Enabled":"True if notifications to the target are enabled.","RoleArn":"The ARN of the role that grants permission to send notifications to the target.","TargetArn":"The ARN of the target (SNS topic) to which audit notifications are sent."}},"AWS::IoT::AccountAuditConfiguration.AuditNotificationTargetConfigurations":{"attributes":{},"description":"The configuration of the audit notification target.","properties":{"Sns":"The `Sns` notification target."}},"AWS::IoT::Authorizer":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the authorizer.","Ref":"`Ref` returns the authorizer name. For example:\\n\\n`{ \\"Ref\\": \\"MyAuthorizer\\" }`"},"description":"Specifies an authorizer.","properties":{"AuthorizerFunctionArn":"The authorizer\'s Lambda function ARN.","AuthorizerName":"The authorizer name.","EnableCachingForHttp":"When `true` , the result from the authorizer\'s Lambda function is cached for clients that use persistent HTTP connections. The results are cached for the time specified by the Lambda function in `refreshAfterInSeconds` . This value doesn\'t affect authorization of clients that use MQTT connections.","SigningDisabled":"Specifies whether AWS IoT validates the token signature in an authorization request.","Status":"The status of the authorizer.\\n\\nValid values: `ACTIVE` | `INACTIVE`","Tags":"Metadata which can be used to manage the custom authorizer.\\n\\n> For URI Request parameters use format: ...key1=value1&key2=value2...\\n> \\n> For the CLI command-line parameter use format: &&tags \\"key1=value1&key2=value2...\\"\\n> \\n> For the cli-input-json file use format: \\"tags\\": \\"key1=value1&key2=value2...\\"","TokenKeyName":"The key used to extract the token from the HTTP headers.","TokenSigningPublicKeys":"The public keys used to validate the token signature returned by your custom authentication service."}},"AWS::IoT::BillingGroup":{"attributes":{"Arn":"The ARN of the billing group.","Id":"The ID of the billing group.","Ref":"`Ref` returns the billing group id."},"description":"Creates a new billing group.\\n\\nRequires permission to access the [CreateBillingGroup](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions) action.","properties":{"BillingGroupName":"The name of the billing group.","BillingGroupProperties":"The properties of the billing group.","Tags":"Metadata which can be used to manage the billing group."}},"AWS::IoT::BillingGroup.BillingGroupProperties":{"attributes":{},"description":"The properties of a billing group.","properties":{"BillingGroupDescription":"The description of the billing group."}},"AWS::IoT::CACertificate":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) for the CA certificate. For example:\\n\\n`{ \\"Fn::GetAtt\\": [\\"MyCACertificate\\", \\"Arn\\"] }`\\n\\nA value similar to the following is returned:\\n\\n`arn:aws:iot:us-east-1:123456789012:cacert/a6be6b84559801927e35a8f901fae08b5971d78d1562e29504ff9663b276a5f5`","Id":"The CA certificate ID.","Ref":"`Ref` returns the CA certificate ID."},"description":"Specifies a CA certificate.","properties":{"AutoRegistrationStatus":"Whether the CA certificate is configured for auto registration of device certificates. Valid values are \\"ENABLE\\" and \\"DISABLE\\".","CACertificatePem":"The certificate data in PEM format.","CertificateMode":"The mode of the CA.\\n\\nAll the device certificates that are registered using this CA will be registered in the same mode as the CA. For more information about certificate mode for device certificates, see [certificate mode](https://docs.aws.amazon.com//iot/latest/apireference/API_CertificateDescription.html#iot-Type-CertificateDescription-certificateMode) .\\n\\nValid values are \\"DEFAULT\\" and \\"SNI_ONLY\\".","RegistrationConfig":"Information about the registration configuration.","RemoveAutoRegistration":"If true, removes auto registration.","Status":"The status of the CA certificate.\\n\\nValid values are \\"ACTIVE\\" and \\"INACTIVE\\".","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","VerificationCertificatePem":"The private key verification certificate."}},"AWS::IoT::CACertificate.RegistrationConfig":{"attributes":{},"description":"The registration configuration.","properties":{"RoleArn":"The ARN of the role.","TemplateBody":"The template body.","TemplateName":"The name of the provisioning template."}},"AWS::IoT::Certificate":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) for the certificate. For example:\\n\\n`{ \\"Fn::GetAtt\\": [\\"MyCertificate\\", \\"Arn\\"] }`\\n\\nA value similar to the following is returned:\\n\\n`arn:aws:iot:ap-southeast-2:123456789012:cert/a1234567b89c012d3e4fg567hij8k9l01mno1p23q45678901rs234567890t1u2`","Id":"The certificate ID.","Ref":"`Ref` returns the certificate ID. For example:\\n\\n`{ \\"Ref\\": \\"MyCertificate\\" }`\\n\\nA value similar to the following is returned:\\n\\n`a1234567b89c012d3e4fg567hij8k9l01mno1p23q45678901rs234567890t1u2`"},"description":"Use the `AWS::IoT::Certificate` resource to declare an AWS IoT X.509 certificate. For information about working with X.509 certificates, see [X.509 Client Certificates](https://docs.aws.amazon.com/iot/latest/developerguide/x509-client-certs.html) in the *AWS IoT Developer Guide* .","properties":{"CACertificatePem":"The CA certificate used to sign the device certificate being registered, not available when CertificateMode is SNI_ONLY.","CertificateMode":"Specifies which mode of certificate registration to use with this resource. Valid options are DEFAULT with CaCertificatePem and CertificatePem, SNI_ONLY with CertificatePem, and Default with CertificateSigningRequest.\\n\\n`DEFAULT` : A certificate in `DEFAULT` mode is either generated by AWS IoT Core or registered with an issuer certificate authority (CA). Devices with certificates in `DEFAULT` mode aren\'t required to send the Server Name Indication (SNI) extension when connecting to AWS IoT Core . However, to use features such as custom domains and VPC endpoints, we recommend that you use the SNI extension when connecting to AWS IoT Core .\\n\\n`SNI_ONLY` : A certificate in `SNI_ONLY` mode is registered without an issuer CA. Devices with certificates in `SNI_ONLY` mode must send the SNI extension when connecting to AWS IoT Core .","CertificatePem":"The certificate data in PEM format. Requires SNI_ONLY for the certificate mode or the accompanying CACertificatePem for registration.","CertificateSigningRequest":"The certificate signing request (CSR).","Status":"The status of the certificate.\\n\\nValid values are ACTIVE, INACTIVE, REVOKED, PENDING_TRANSFER, and PENDING_ACTIVATION.\\n\\nThe status value REGISTER_INACTIVE is deprecated and should not be used."}},"AWS::IoT::CustomMetric":{"attributes":{"MetricArn":"The Amazon Resource Number (ARN) of the custom metric; for example, `arn: *aws-partition* :iot: *region* : *accountId* :custommetric/ *metricName*` .","Ref":"`Ref` returns the custom metric name."},"description":"Use the `AWS::IoT::CustomMetric` resource to define a custom metric published by your devices to Device Defender. For API reference, see [CreateCustomMetric](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateCustomMetric.html) and for general information, see [Custom metrics](https://docs.aws.amazon.com/iot/latest/developerguide/dd-detect-custom-metrics.html) .","properties":{"DisplayName":"The friendly name in the console for the custom metric. This name doesn\'t have to be unique. Don\'t use this name as the metric identifier in the device metric report. You can update the friendly name after you define it.","MetricName":"The name of the custom metric. This will be used in the metric report submitted from the device/thing. The name can\'t begin with `aws:` . You can’t change the name after you define it.","MetricType":"The type of the custom metric. Types include `string-list` , `ip-address-list` , `number-list` , and `number` .\\n\\n> The type `number` only takes a single metric value as an input, but when you submit the metrics value in the DeviceMetrics report, you must pass it as an array with a single value.","Tags":"Metadata that can be used to manage the custom metric."}},"AWS::IoT::Dimension":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the dimension.","Ref":"`Ref` returns the dimension name."},"description":"Use the `AWS::IoT::Dimension` to limit the scope of a metric used in a security profile for AWS IoT Device Defender . For example, using a `TOPIC_FILTER` dimension, you can narrow down the scope of the metric to only MQTT topics where the name matches the pattern specified in the dimension. For API reference, see [CreateDimension](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateDimension.html) and for general information, see [Scoping metrics in security profiles using dimensions](https://docs.aws.amazon.com/iot/latest/developerguide/scoping-security-behavior.html) .","properties":{"Name":"A unique identifier for the dimension.","StringValues":"Specifies the value or list of values for the dimension. For `TOPIC_FILTER` dimensions, this is a pattern used to match the MQTT topic (for example, \\"admin/#\\").","Tags":"Metadata that can be used to manage the dimension.","Type":"Specifies the type of dimension. Supported types: `TOPIC_FILTER.`"}},"AWS::IoT::DomainConfiguration":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the domain configuration.","DomainType":"The type of service delivered by the domain.","Ref":"`Ref` returns the domain configuration name. For example:\\n\\n`{ \\"Ref\\": \\"MyDomainConfiguration\\" }`","ServerCertificates":"The ARNs of the certificates that AWS IoT passes to the device during the TLS handshake. Currently you can specify only one certificate ARN. This value is not required for AWS -managed domains."},"description":"Specifies a domain configuration.","properties":{"AuthorizerConfig":"An object that specifies the authorization service for a domain.","DomainConfigurationName":"The name of the domain configuration. This value must be unique to a region.","DomainConfigurationStatus":"The status to which the domain configuration should be updated.\\n\\nValid values: `ENABLED` | `DISABLED`","DomainName":"The name of the domain.","ServerCertificateArns":"The ARNs of the certificates that AWS IoT passes to the device during the TLS handshake. Currently you can specify only one certificate ARN. This value is not required for AWS -managed domains.","ServiceType":"The type of service delivered by the endpoint.\\n\\n> AWS IoT Core currently supports only the `DATA` service type.","Tags":"Metadata which can be used to manage the domain configuration.\\n\\n> For URI Request parameters use format: ...key1=value1&key2=value2...\\n> \\n> For the CLI command-line parameter use format: &&tags \\"key1=value1&key2=value2...\\"\\n> \\n> For the cli-input-json file use format: \\"tags\\": \\"key1=value1&key2=value2...\\"","TlsConfig":"An object that specifies the TLS configuration for a domain.","ValidationCertificateArn":"The certificate used to validate the server certificate and prove domain name ownership. This certificate must be signed by a public certificate authority. This value is not required for AWS -managed domains."}},"AWS::IoT::DomainConfiguration.AuthorizerConfig":{"attributes":{},"description":"An object that specifies the authorization service for a domain.","properties":{"AllowAuthorizerOverride":"A Boolean that specifies whether the domain configuration\'s authorization service can be overridden.","DefaultAuthorizerName":"The name of the authorization service for a domain configuration."}},"AWS::IoT::DomainConfiguration.ServerCertificateSummary":{"attributes":{},"description":"An object that contains information about a server certificate.","properties":{"ServerCertificateArn":"The ARN of the server certificate.","ServerCertificateStatus":"The status of the server certificate.","ServerCertificateStatusDetail":"Details that explain the status of the server certificate."}},"AWS::IoT::DomainConfiguration.TlsConfig":{"attributes":{},"description":"An object that specifies the TLS configuration for a domain.","properties":{"SecurityPolicy":"The security policy for a domain configuration. For more information, see [Security policies](https://docs.aws.amazon.com/iot/latest/developerguide/transport-security.html#tls-policy-table) in the *AWS IoT Core developer guide* ."}},"AWS::IoT::FleetMetric":{"attributes":{"CreationDate":"The time the fleet metric was created.","LastModifiedDate":"The time the fleet metric was last modified.","MetricArn":"The Amazon Resource Name (ARN) of the fleet metric.","Ref":"`Ref` returns the fleet metric name.","Version":"The fleet metric version."},"description":"Use the `AWS::IoT::FleetMetric` resource to declare a fleet metric.","properties":{"AggregationField":"The field to aggregate.","AggregationType":"The type of the aggregation query.","Description":"The fleet metric description.","IndexName":"The name of the index to search.","MetricName":"The name of the fleet metric to create.","Period":"The time in seconds between fleet metric emissions. Range [60(1 min), 86400(1 day)] and must be multiple of 60.","QueryString":"The search query string.","QueryVersion":"The query version.","Tags":"Metadata which can be used to manage the fleet metric.","Unit":"Used to support unit transformation such as milliseconds to seconds. Must be a unit supported by CW metric. Default to null."}},"AWS::IoT::FleetMetric.AggregationType":{"attributes":{},"description":"The type of aggregation queries.","properties":{"Name":"The name of the aggregation type.","Values":"A list of the values of aggregation types."}},"AWS::IoT::JobTemplate":{"attributes":{"Arn":"The ARN of the job to use as the basis for the job template.","Ref":"`Ref` returns the job template Id. For example:\\n\\n`{ \\"Ref\\": \\"MyJobTemplate-12345\\" }`"},"description":"Represents a job template.","properties":{"AbortConfig":"The criteria that determine when and how a job abort takes place.","Description":"A description of the job template.","Document":"The job document.\\n\\nRequired if you don\'t specify a value for `documentSource` .","DocumentSource":"An S3 link, or S3 object URL, to the job document. The link is an Amazon S3 object URL and is required if you don\'t specify a value for `document` .\\n\\nFor example, `--document-source https://s3. *region-code* .amazonaws.com/example-firmware/device-firmware.1.0`\\n\\nFor more information, see [Methods for accessing a bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-bucket-intro.html) .","JobArn":"The ARN of the job to use as the basis for the job template.","JobExecutionsRetryConfig":"Allows you to create the criteria to retry a job.","JobExecutionsRolloutConfig":"Allows you to create a staged rollout of a job.","JobTemplateId":"A unique identifier for the job template. We recommend using a UUID. Alpha-numeric characters, \\"-\\", and \\"_\\" are valid for use here.","MaintenanceWindows":"An optional configuration within the SchedulingConfig to setup a recurring maintenance window with a predetermined start time and duration for the rollout of a job document to all devices in a target group for a job.","PresignedUrlConfig":"Configuration for pre-signed S3 URLs.","Tags":"Metadata that can be used to manage the job template.","TimeoutConfig":"Specifies the amount of time each device has to finish its execution of the job. A timer is started when the job execution status is set to `IN_PROGRESS` . If the job execution status is not set to another terminal state before the timer expires, it will be automatically set to `TIMED_OUT` ."}},"AWS::IoT::JobTemplate.AbortConfig":{"attributes":{},"description":"The criteria that determine when and how a job abort takes place.","properties":{"CriteriaList":"The list of criteria that determine when and how to abort the job."}},"AWS::IoT::JobTemplate.AbortCriteria":{"attributes":{},"description":"The criteria that determine when and how a job abort takes place.","properties":{"Action":"The type of job action to take to initiate the job abort.","FailureType":"The type of job execution failures that can initiate a job abort.","MinNumberOfExecutedThings":"The minimum number of things which must receive job execution notifications before the job can be aborted.","ThresholdPercentage":"The minimum percentage of job execution failures that must occur to initiate the job abort.\\n\\nAWS IoT Core supports up to two digits after the decimal (for example, 10.9 and 10.99, but not 10.999)."}},"AWS::IoT::JobTemplate.ExponentialRolloutRate":{"attributes":{},"description":"Allows you to create an exponential rate of rollout for a job.","properties":{"BaseRatePerMinute":"The minimum number of things that will be notified of a pending job, per minute at the start of job rollout. This parameter allows you to define the initial rate of rollout.","IncrementFactor":"The exponential factor to increase the rate of rollout for a job.\\n\\nAWS IoT Core supports up to one digit after the decimal (for example, 1.5, but not 1.55).","RateIncreaseCriteria":"The criteria to initiate the increase in rate of rollout for a job."}},"AWS::IoT::JobTemplate.JobExecutionsRetryConfig":{"attributes":{},"description":"The configuration that determines how many retries are allowed for each failure type for a job.","properties":{"RetryCriteriaList":"The list of criteria that determines how many retries are allowed for each failure type for a job."}},"AWS::IoT::JobTemplate.JobExecutionsRolloutConfig":{"attributes":{},"description":"Allows you to create a staged rollout of a job.","properties":{"ExponentialRolloutRate":"The rate of increase for a job rollout. This parameter allows you to define an exponential rate for a job rollout.","MaximumPerMinute":"The maximum number of things that will be notified of a pending job, per minute. This parameter allows you to create a staged rollout."}},"AWS::IoT::JobTemplate.MaintenanceWindow":{"attributes":{},"description":"An optional configuration within the `SchedulingConfig` to setup a recurring maintenance window with a predetermined start time and duration for the rollout of a job document to all devices in a target group for a job.","properties":{"DurationInMinutes":"Displays the duration of the next maintenance window.","StartTime":"Displays the start time of the next maintenance window."}},"AWS::IoT::JobTemplate.PresignedUrlConfig":{"attributes":{},"description":"Configuration for pre-signed S3 URLs.","properties":{"ExpiresInSec":"How long (in seconds) pre-signed URLs are valid. Valid values are 60 - 3600, the default value is 3600 seconds. Pre-signed URLs are generated when Jobs receives an MQTT request for the job document.","RoleArn":"The ARN of an IAM role that grants grants permission to download files from the S3 bucket where the job data/updates are stored. The role must also grant permission for IoT to download the files.\\n\\n> For information about addressing the confused deputy problem, see [cross-service confused deputy prevention](https://docs.aws.amazon.com/iot/latest/developerguide/cross-service-confused-deputy-prevention.html) in the *AWS IoT Core developer guide* ."}},"AWS::IoT::JobTemplate.RateIncreaseCriteria":{"attributes":{},"description":"Allows you to define a criteria to initiate the increase in rate of rollout for a job.","properties":{"NumberOfNotifiedThings":"The threshold for number of notified things that will initiate the increase in rate of rollout.","NumberOfSucceededThings":"The threshold for number of succeeded things that will initiate the increase in rate of rollout."}},"AWS::IoT::JobTemplate.RetryCriteria":{"attributes":{},"description":"The criteria that determines how many retries are allowed for each failure type for a job.","properties":{"FailureType":"The type of job execution failures that can initiate a job retry.","NumberOfRetries":"The number of retries allowed for a failure type for the job."}},"AWS::IoT::JobTemplate.TimeoutConfig":{"attributes":{},"description":"Specifies the amount of time each device has to finish its execution of the job. A timer is started when the job execution status is set to `IN_PROGRESS` . If the job execution status is not set to another terminal state before the timer expires, it will be automatically set to `TIMED_OUT` .","properties":{"InProgressTimeoutInMinutes":"Specifies the amount of time, in minutes, this device has to finish execution of this job. The timeout interval can be anywhere between 1 minute and 7 days (1 to 10080 minutes). The in progress timer can\'t be updated and will apply to all job executions for the job. Whenever a job execution remains in the IN_PROGRESS status for longer than this interval, the job execution will fail and switch to the terminal `TIMED_OUT` status."}},"AWS::IoT::Logging":{"attributes":{"Ref":"`Ref` returns the log ID. For example:\\n\\n`{\\"Ref\\": \\"Log-12345\\"}`"},"description":"Configure logging.","properties":{"AccountId":"The account ID.","DefaultLogLevel":"The default log level. Valid Values: `DEBUG | INFO | ERROR | WARN | DISABLED`","RoleArn":"The role ARN used for the log."}},"AWS::IoT::MitigationAction":{"attributes":{"MitigationActionArn":"The Amazon Resource Name (ARN) of the mitigation action.","MitigationActionId":"The ID of the mitigation action.","Ref":"`Ref` returns the mitigation action name."},"description":"Defines an action that can be applied to audit findings by using StartAuditMitigationActionsTask. For API reference, see [CreateMitigationAction](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateMitigationAction.html) and for general information, see [Mitigation actions](https://docs.aws.amazon.com/iot/latest/developerguide/dd-mitigation-actions.html) .","properties":{"ActionName":"The friendly name of the mitigation action.","ActionParams":"The set of parameters for this mitigation action. The parameters vary, depending on the kind of action you apply.","RoleArn":"The IAM role ARN used to apply this mitigation action.","Tags":"Metadata that can be used to manage the mitigation action."}},"AWS::IoT::MitigationAction.ActionParams":{"attributes":{},"description":"Defines the type of action and the parameters for that action.","properties":{"AddThingsToThingGroupParams":"Specifies the group to which you want to add the devices.","EnableIoTLoggingParams":"Specifies the logging level and the role with permissions for logging. You cannot specify a logging level of `DISABLED` .","PublishFindingToSnsParams":"Specifies the topic to which the finding should be published.","ReplaceDefaultPolicyVersionParams":"Replaces the policy version with a default or blank policy. You specify the template name. Only a value of `BLANK_POLICY` is currently supported.","UpdateCACertificateParams":"Specifies the new state for the CA certificate. Only a value of `DEACTIVATE` is currently supported.","UpdateDeviceCertificateParams":"Specifies the new state for a device certificate. Only a value of `DEACTIVATE` is currently supported."}},"AWS::IoT::MitigationAction.AddThingsToThingGroupParams":{"attributes":{},"description":"Parameters used when defining a mitigation action that move a set of things to a thing group.","properties":{"OverrideDynamicGroups":"Specifies if this mitigation action can move the things that triggered the mitigation action even if they are part of one or more dynamic thing groups.","ThingGroupNames":"The list of groups to which you want to add the things that triggered the mitigation action. You can add a thing to a maximum of 10 groups, but you can\'t add a thing to more than one group in the same hierarchy."}},"AWS::IoT::MitigationAction.EnableIoTLoggingParams":{"attributes":{},"description":"Parameters used when defining a mitigation action that enable AWS IoT Core logging.","properties":{"LogLevel":"Specifies the type of information to be logged.","RoleArnForLogging":"The Amazon Resource Name (ARN) of the IAM role used for logging."}},"AWS::IoT::MitigationAction.PublishFindingToSnsParams":{"attributes":{},"description":"Parameters to define a mitigation action that publishes findings to Amazon SNS. You can implement your own custom actions in response to the Amazon SNS messages.","properties":{"TopicArn":"The ARN of the topic to which you want to publish the findings."}},"AWS::IoT::MitigationAction.ReplaceDefaultPolicyVersionParams":{"attributes":{},"description":"Parameters to define a mitigation action that adds a blank policy to restrict permissions.","properties":{"TemplateName":"The name of the template to be applied. The only supported value is `BLANK_POLICY` ."}},"AWS::IoT::MitigationAction.UpdateCACertificateParams":{"attributes":{},"description":"Parameters to define a mitigation action that changes the state of the CA certificate to inactive.","properties":{"Action":"The action that you want to apply to the CA certificate. The only supported value is `DEACTIVATE` ."}},"AWS::IoT::MitigationAction.UpdateDeviceCertificateParams":{"attributes":{},"description":"Parameters to define a mitigation action that changes the state of the device certificate to inactive.","properties":{"Action":"The action that you want to apply to the device certificate. The only supported value is `DEACTIVATE` ."}},"AWS::IoT::Policy":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the AWS IoT policy, such as `arn:aws:iot:us-east-2:123456789012:policy/MyPolicy` .","Id":"The name of this policy.","Ref":"`Ref` returns the policy name. For example:\\n\\n`{ \\"Ref\\": \\"MyPolicy\\" }`"},"description":"Use the `AWS::IoT::Policy` resource to declare an AWS IoT policy. For more information about working with AWS IoT policies, see [Authorization](https://docs.aws.amazon.com/iot/latest/developerguide/authorization.html) in the *AWS IoT Developer Guide* .","properties":{"PolicyDocument":"The JSON document that describes the policy.","PolicyName":"The policy name."}},"AWS::IoT::PolicyPrincipalAttachment":{"attributes":{},"description":"Use the `AWS::IoT::PolicyPrincipalAttachment` resource to attach an AWS IoT policy to a principal (an X.509 certificate or other credential).\\n\\nFor information about working with AWS IoT policies and principals, see [Authorization](https://docs.aws.amazon.com/iot/latest/developerguide/authorization.html) in the *AWS IoT Developer Guide* .","properties":{"PolicyName":"The name of the AWS IoT policy.","Principal":"The principal, which can be a certificate ARN (as returned from the `CreateCertificate` operation) or an Amazon Cognito ID."}},"AWS::IoT::ProvisioningTemplate":{"attributes":{"Ref":"`Ref` returns the template name. For example:\\n\\n`{ \\"Ref\\": \\"MyTemplate\\" }`\\n\\nFor a stack named MyStack, a value similar to the following is returned:\\n\\n`MyStack-MyTemplate-AB1CDEFGHIJK`","TemplateArn":"The ARN that identifies the provisioning template."},"description":"Creates a fleet provisioning template.","properties":{"Description":"The description of the fleet provisioning template.","Enabled":"True to enable the fleet provisioning template, otherwise false.","PreProvisioningHook":"Creates a pre-provisioning hook template.","ProvisioningRoleArn":"The role ARN for the role associated with the fleet provisioning template. This IoT role grants permission to provision a device.","Tags":"Metadata that can be used to manage the fleet provisioning template.","TemplateBody":"The JSON formatted contents of the fleet provisioning template version.","TemplateName":"The name of the fleet provisioning template.","TemplateType":"The type of the provisioning template."}},"AWS::IoT::ProvisioningTemplate.ProvisioningHook":{"attributes":{},"description":"Structure that contains payloadVersion and targetArn. Provisioning hooks can be used when fleet provisioning to validate device parameters before allowing the device to be provisioned.","properties":{"PayloadVersion":"The payload that was sent to the target function. The valid payload is `\\"2020-04-01\\"` .","TargetArn":"The ARN of the target function."}},"AWS::IoT::ResourceSpecificLogging":{"attributes":{"Ref":"`Ref` returns the resource-specific log ID. For example:\\n\\n`{\\"Ref\\": \\"MyResourceLog-12345\\" }`","TargetId":"The target Id."},"description":"Configure resource-specific logging.","properties":{"LogLevel":"The default log level.Valid Values: `DEBUG | INFO | ERROR | WARN | DISABLED`","TargetName":"The target name.","TargetType":"The target type. Valid Values: `DEFAULT | THING_GROUP`"}},"AWS::IoT::RoleAlias":{"attributes":{"Ref":"`Ref` returns the role alias name.","RoleAliasArn":"The role alias ARN."},"description":"Specifies a role alias.\\n\\nRequires permission to access the [CreateRoleAlias](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions) action.","properties":{"CredentialDurationSeconds":"The number of seconds for which the credential is valid.","RoleAlias":"The role alias.","RoleArn":"The role ARN.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::IoT::ScheduledAudit":{"attributes":{"Ref":"`Ref` returns the scheduled audit name.","ScheduledAuditArn":"The ARN of the scheduled audit."},"description":"Use the `AWS::IoT::ScheduledAudit` resource to create a scheduled audit that is run at a specified time interval. For API reference, see [CreateScheduleAudit](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateScheduledAudit.html) and for general information, see [Audit](https://docs.aws.amazon.com/iot/latest/developerguide/device-defender-audit.html) .","properties":{"DayOfMonth":"The day of the month on which the scheduled audit is run (if the `frequency` is \\"MONTHLY\\"). If days 29-31 are specified, and the month does not have that many days, the audit takes place on the \\"LAST\\" day of the month.","DayOfWeek":"The day of the week on which the scheduled audit is run (if the `frequency` is \\"WEEKLY\\" or \\"BIWEEKLY\\").","Frequency":"How often the scheduled audit occurs.","ScheduledAuditName":"The name of the scheduled audit.","Tags":"Metadata that can be used to manage the scheduled audit.","TargetCheckNames":"Which checks are performed during the scheduled audit. Checks must be enabled for your account. (Use `DescribeAccountAuditConfiguration` to see the list of all checks, including those that are enabled or use `UpdateAccountAuditConfiguration` to select which checks are enabled.)\\n\\nThe following checks are currently aviable:\\n\\n- `AUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK`\\n- `CA_CERTIFICATE_EXPIRING_CHECK`\\n- `CA_CERTIFICATE_KEY_QUALITY_CHECK`\\n- `CONFLICTING_CLIENT_IDS_CHECK`\\n- `DEVICE_CERTIFICATE_EXPIRING_CHECK`\\n- `DEVICE_CERTIFICATE_KEY_QUALITY_CHECK`\\n- `DEVICE_CERTIFICATE_SHARED_CHECK`\\n- `IOT_POLICY_OVERLY_PERMISSIVE_CHECK`\\n- `IOT_ROLE_ALIAS_ALLOWS_ACCESS_TO_UNUSED_SERVICES_CHECK`\\n- `IOT_ROLE_ALIAS_OVERLY_PERMISSIVE_CHECK`\\n- `LOGGING_DISABLED_CHECK`\\n- `REVOKED_CA_CERTIFICATE_STILL_ACTIVE_CHECK`\\n- `REVOKED_DEVICE_CERTIFICATE_STILL_ACTIVE_CHECK`\\n- `UNAUTHENTICATED_COGNITO_ROLE_OVERLY_PERMISSIVE_CHECK`"}},"AWS::IoT::SecurityProfile":{"attributes":{"Ref":"`Ref` returns the security profile name.","SecurityProfileArn":"The Amazon Resource Name (ARN) of the security profile."},"description":"Use the `AWS::IoT::SecurityProfile` resource to create a Device Defender security profile. For API reference, see [CreateSecurityProfile](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateSecurityProfile.html) and for general information, see [Detect](https://docs.aws.amazon.com/iot/latest/developerguide/device-defender-detect.html) .","properties":{"AdditionalMetricsToRetainV2":"A list of metrics whose data is retained (stored). By default, data is retained for any metric used in the profile\'s `behaviors` , but it\'s also retained for any metric specified here. Can be used with custom metrics; can\'t be used with dimensions.","AlertTargets":"Specifies the destinations to which alerts are sent. (Alerts are always sent to the console.) Alerts are generated when a device (thing) violates a behavior.","Behaviors":"Specifies the behaviors that, when violated by a device (thing), cause an alert.","SecurityProfileDescription":"A description of the security profile.","SecurityProfileName":"The name you gave to the security profile.","Tags":"Metadata that can be used to manage the security profile.","TargetArns":"The ARN of the target (thing group) to which the security profile is attached."}},"AWS::IoT::SecurityProfile.AlertTarget":{"attributes":{},"description":"A structure containing the alert target ARN and the role ARN.","properties":{"AlertTargetArn":"The Amazon Resource Name (ARN) of the notification target to which alerts are sent.","RoleArn":"The ARN of the role that grants permission to send alerts to the notification target."}},"AWS::IoT::SecurityProfile.Behavior":{"attributes":{},"description":"A Device Defender security profile behavior.","properties":{"Criteria":"The criteria that determine if a device is behaving normally in regard to the `metric` .","Metric":"What is measured by the behavior.","MetricDimension":"The dimension of the metric.","Name":"The name you\'ve given to the behavior.","SuppressAlerts":"The alert status. If you set the value to `true` , alerts will be suppressed."}},"AWS::IoT::SecurityProfile.BehaviorCriteria":{"attributes":{},"description":"The criteria by which the behavior is determined to be normal.","properties":{"ComparisonOperator":"The operator that relates the thing measured ( `metric` ) to the criteria (containing a `value` or `statisticalThreshold` ). Valid operators include:\\n\\n- `string-list` : `in-set` and `not-in-set`\\n- `number-list` : `in-set` and `not-in-set`\\n- `ip-address-list` : `in-cidr-set` and `not-in-cidr-set`\\n- `number` : `less-than` , `less-than-equals` , `greater-than` , and `greater-than-equals`","ConsecutiveDatapointsToAlarm":"If a device is in violation of the behavior for the specified number of consecutive datapoints, an alarm occurs. If not specified, the default is 1.","ConsecutiveDatapointsToClear":"If an alarm has occurred and the offending device is no longer in violation of the behavior for the specified number of consecutive datapoints, the alarm is cleared. If not specified, the default is 1.","DurationSeconds":"Use this to specify the time duration over which the behavior is evaluated, for those criteria that have a time dimension (for example, `NUM_MESSAGES_SENT` ). For a `statisticalThreshhold` metric comparison, measurements from all devices are accumulated over this time duration before being used to calculate percentiles, and later, measurements from an individual device are also accumulated over this time duration before being given a percentile rank. Cannot be used with list-based metric datatypes.","MlDetectionConfig":"The confidence level of the detection model.","StatisticalThreshold":"A statistical ranking (percentile)that indicates a threshold value by which a behavior is determined to be in compliance or in violation of the behavior.","Value":"The value to be compared with the `metric` ."}},"AWS::IoT::SecurityProfile.MachineLearningDetectionConfig":{"attributes":{},"description":"The `MachineLearningDetectionConfig` property type controls confidence of the machine learning model.","properties":{"ConfidenceLevel":"The model confidence level.\\n\\nThere are three levels of confidence, `\\"high\\"` , `\\"medium\\"` , and `\\"low\\"` .\\n\\nThe higher the confidence level, the lower the sensitivity, and the lower the alarm frequency will be."}},"AWS::IoT::SecurityProfile.MetricDimension":{"attributes":{},"description":"The dimension of the metric.","properties":{"DimensionName":"The name of the dimension.","Operator":"Operators are constructs that perform logical operations. Valid values are `IN` and `NOT_IN` ."}},"AWS::IoT::SecurityProfile.MetricToRetain":{"attributes":{},"description":"The metric you want to retain. Dimensions are optional.","properties":{"Metric":"A standard of measurement.","MetricDimension":"The dimension of the metric."}},"AWS::IoT::SecurityProfile.MetricValue":{"attributes":{},"description":"The value to be compared with the `metric` .","properties":{"Cidrs":"If the `comparisonOperator` calls for a set of CIDRs, use this to specify that set to be compared with the `metric` .","Count":"If the `comparisonOperator` calls for a numeric value, use this to specify that numeric value to be compared with the `metric` .","Number":"The numeric values of a metric.","Numbers":"The numeric value of a metric.","Ports":"If the `comparisonOperator` calls for a set of ports, use this to specify that set to be compared with the `metric` .","Strings":"The string values of a metric."}},"AWS::IoT::SecurityProfile.StatisticalThreshold":{"attributes":{},"description":"A statistical ranking (percentile) that indicates a threshold value by which a behavior is determined to be in compliance or in violation of the behavior.","properties":{"Statistic":"The percentile that resolves to a threshold value by which compliance with a behavior is determined. Metrics are collected over the specified period ( `durationSeconds` ) from all reporting devices in your account and statistical ranks are calculated. Then, the measurements from a device are collected over the same period. If the accumulated measurements from the device fall above or below ( `comparisonOperator` ) the value associated with the percentile specified, then the device is considered to be in compliance with the behavior, otherwise a violation occurs."}},"AWS::IoT::Thing":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the AWS IoT thing, such as `arn:aws:iot:us-east-2:123456789012:thing/MyThing` .","Id":"The Id of this thing.","Ref":"`Ref` returns the thing name. For example:\\n\\n`{ \\"Ref\\": \\"MyThing\\" }`\\n\\nFor a stack named MyStack, a value similar to the following is returned:\\n\\n`MyStack-MyThing-AB1CDEFGHIJK`"},"description":"Use the `AWS::IoT::Thing` resource to declare an AWS IoT thing.\\n\\nFor information about working with things, see [How AWS IoT Works](https://docs.aws.amazon.com/iot/latest/developerguide/aws-iot-how-it-works.html) and [Device Registry for AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/thing-registry.html) in the *AWS IoT Developer Guide* .","properties":{"AttributePayload":"A string that contains up to three key value pairs. Maximum length of 800. Duplicates not allowed.","ThingName":"The name of the thing to update.\\n\\nYou can\'t change a thing\'s name. To change a thing\'s name, you must create a new thing, give it the new name, and then delete the old thing."}},"AWS::IoT::Thing.AttributePayload":{"attributes":{},"description":"The AttributePayload property specifies up to three attributes for an AWS IoT as key-value pairs. AttributePayload is a property of the [AWS::IoT::Thing](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thing.html) resource.","properties":{"Attributes":"A JSON string containing up to three key-value pair in JSON format. For example:\\n\\n`{\\\\\\"attributes\\\\\\":{\\\\\\"string1\\\\\\":\\\\\\"string2\\\\\\"}}`"}},"AWS::IoT::ThingGroup":{"attributes":{"Arn":"The thing group ARN.","Id":"The thing group ID.","Ref":"`Ref` returns the thing group id."},"description":"Creates a new thing group. A dynamic thing group is created if the resource template contains the `QueryString` attribute. A dynamic thing group will not contain the `ParentGroupName` attribute. A static thing group and dynamic thing group can\'t be converted to each other via the addition or removal of the `QueryString` attribute.\\n\\n> This is a control plane operation. See [Authorization](https://docs.aws.amazon.com/iot/latest/developerguide/iot-authorization.html) for information about authorizing control plane actions. \\n\\nRequires permission to access the [CreateThingGroup](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions) action.","properties":{"ParentGroupName":"The parent thing group name.\\n\\nA Dynamic Thing Group does not have `parentGroupName` defined.","QueryString":"The dynamic thing group search query string.\\n\\nThe `queryString` attribute *is* required for `CreateDynamicThingGroup` . The `queryString` attribute *is not* required for `CreateThingGroup` .","Tags":"Metadata which can be used to manage the thing group or dynamic thing group.","ThingGroupName":"The thing group name.","ThingGroupProperties":"Thing group properties."}},"AWS::IoT::ThingGroup.AttributePayload":{"attributes":{},"description":"The attribute payload.","properties":{"Attributes":"A JSON string containing up to three key-value pair in JSON format. For example:\\n\\n`{\\\\\\"attributes\\\\\\":{\\\\\\"string1\\\\\\":\\\\\\"string2\\\\\\"}}`"}},"AWS::IoT::ThingGroup.ThingGroupProperties":{"attributes":{},"description":"Thing group properties.","properties":{"AttributePayload":"The thing group attributes in JSON format.","ThingGroupDescription":"The thing group description."}},"AWS::IoT::ThingPrincipalAttachment":{"attributes":{},"description":"Use the `AWS::IoT::ThingPrincipalAttachment` resource to attach a principal (an X.509 certificate or another credential) to a thing.\\n\\nFor more information about working with AWS IoT things and principals, see [Authorization](https://docs.aws.amazon.com/iot/latest/developerguide/authorization.html) in the *AWS IoT Developer Guide* .","properties":{"Principal":"The principal, which can be a certificate ARN (as returned from the `CreateCertificate` operation) or an Amazon Cognito ID.","ThingName":"The name of the AWS IoT thing."}},"AWS::IoT::ThingType":{"attributes":{"Arn":"The thing type arn.","Id":"The thing type id.","Ref":"`Ref` returns the thing type id."},"description":"Creates a new thing type.","properties":{"DeprecateThingType":"Deprecates a thing type. You can not associate new things with deprecated thing type.\\n\\nRequires permission to access the [DeprecateThingType](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions) action.","Tags":"Metadata which can be used to manage the thing type.","ThingTypeName":"The name of the thing type.","ThingTypeProperties":"The thing type properties for the thing type to create. It contains information about the new thing type including a description, and a list of searchable thing attribute names. `ThingTypeProperties` can\'t be updated after the initial creation of the `ThingType` ."}},"AWS::IoT::ThingType.ThingTypeProperties":{"attributes":{},"description":"The ThingTypeProperties contains information about the thing type including: a thing type description, and a list of searchable thing attribute names.","properties":{"SearchableAttributes":"A list of searchable thing attribute names.","ThingTypeDescription":"The description of the thing type."}},"AWS::IoT::TopicRule":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the AWS IoT rule, such as `arn:aws:iot:us-east-2:123456789012:rule/MyIoTRule` .","Ref":"`Ref` returns the topic rule name. For example:\\n\\n`{ \\"Ref\\": \\"MyTopicRule\\" }`\\n\\nFor a stack named My-Stack (the - character is omitted), a value similar to the following is returned:\\n\\n`MyStackMyTopicRule12ABC3D456EFG`"},"description":"Use the `AWS::IoT::TopicRule` resource to declare an AWS IoT rule. For information about working with AWS IoT rules, see [Rules for AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html) in the *AWS IoT Developer Guide* .","properties":{"RuleName":"The name of the rule.","Tags":"Metadata which can be used to manage the topic rule.\\n\\n> For URI Request parameters use format: ...key1=value1&key2=value2...\\n> \\n> For the CLI command-line parameter use format: --tags \\"key1=value1&key2=value2...\\"\\n> \\n> For the cli-input-json file use format: \\"tags\\": \\"key1=value1&key2=value2...\\"","TopicRulePayload":"The rule payload."}},"AWS::IoT::TopicRule.Action":{"attributes":{},"description":"Describes the actions associated with a rule.","properties":{"CloudwatchAlarm":"Change the state of a CloudWatch alarm.","CloudwatchLogs":"Sends data to CloudWatch.","CloudwatchMetric":"Capture a CloudWatch metric.","DynamoDB":"Write to a DynamoDB table.","DynamoDBv2":"Write to a DynamoDB table. This is a new version of the DynamoDB action. It allows you to write each attribute in an MQTT message payload into a separate DynamoDB column.","Elasticsearch":"Write data to an Amazon OpenSearch Service domain.\\n\\n> The `Elasticsearch` action can only be used by existing rule actions. To create a new rule action or to update an existing rule action, use the `OpenSearch` rule action instead. For more information, see [OpenSearchAction](https://docs.aws.amazon.com//iot/latest/apireference/API_OpenSearchAction.html) .","Firehose":"Write to an Amazon Kinesis Firehose stream.","Http":"Send data to an HTTPS endpoint.","IotAnalytics":"Sends message data to an AWS IoT Analytics channel.","IotEvents":"Sends an input to an AWS IoT Events detector.","IotSiteWise":"Sends data from the MQTT message that triggered the rule to AWS IoT SiteWise asset properties.","Kafka":"Send messages to an Amazon Managed Streaming for Apache Kafka (Amazon MSK) or self-managed Apache Kafka cluster.","Kinesis":"Write data to an Amazon Kinesis stream.","Lambda":"Invoke a Lambda function.","Location":"Sends device location data to [Amazon Location Service](https://docs.aws.amazon.com//location/latest/developerguide/welcome.html) .","OpenSearch":"Write data to an Amazon OpenSearch Service domain.","Republish":"Publish to another MQTT topic.","S3":"Write to an Amazon S3 bucket.","Sns":"Publish to an Amazon SNS topic.","Sqs":"Publish to an Amazon SQS queue.","StepFunctions":"Starts execution of a Step Functions state machine.","Timestream":"Writes attributes from an MQTT message."}},"AWS::IoT::TopicRule.AssetPropertyTimestamp":{"attributes":{},"description":"An asset property timestamp entry containing the following information.","properties":{"OffsetInNanos":"Optional. A string that contains the nanosecond time offset. Accepts substitution templates.","TimeInSeconds":"A string that contains the time in seconds since epoch. Accepts substitution templates."}},"AWS::IoT::TopicRule.AssetPropertyValue":{"attributes":{},"description":"An asset property value entry containing the following information.","properties":{"Quality":"Optional. A string that describes the quality of the value. Accepts substitution templates. Must be `GOOD` , `BAD` , or `UNCERTAIN` .","Timestamp":"The asset property value timestamp.","Value":"The value of the asset property."}},"AWS::IoT::TopicRule.AssetPropertyVariant":{"attributes":{},"description":"Contains an asset property value (of a single type).","properties":{"BooleanValue":"Optional. A string that contains the boolean value ( `true` or `false` ) of the value entry. Accepts substitution templates.","DoubleValue":"Optional. A string that contains the double value of the value entry. Accepts substitution templates.","IntegerValue":"Optional. A string that contains the integer value of the value entry. Accepts substitution templates.","StringValue":"Optional. The string value of the value entry. Accepts substitution templates."}},"AWS::IoT::TopicRule.CloudwatchAlarmAction":{"attributes":{},"description":"Describes an action that updates a CloudWatch alarm.","properties":{"AlarmName":"The CloudWatch alarm name.","RoleArn":"The IAM role that allows access to the CloudWatch alarm.","StateReason":"The reason for the alarm change.","StateValue":"The value of the alarm state. Acceptable values are: OK, ALARM, INSUFFICIENT_DATA."}},"AWS::IoT::TopicRule.CloudwatchLogsAction":{"attributes":{},"description":"Describes an action that updates a CloudWatch log.","properties":{"BatchMode":"Indicates whether batches of log records will be extracted and uploaded into CloudWatch.","LogGroupName":"The CloudWatch log name.","RoleArn":"The IAM role that allows access to the CloudWatch log."}},"AWS::IoT::TopicRule.CloudwatchMetricAction":{"attributes":{},"description":"Describes an action that captures a CloudWatch metric.","properties":{"MetricName":"The CloudWatch metric name.","MetricNamespace":"The CloudWatch metric namespace name.","MetricTimestamp":"An optional [Unix timestamp](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/cloudwatch_concepts.html#about_timestamp) .","MetricUnit":"The [metric unit](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/cloudwatch_concepts.html#Unit) supported by CloudWatch.","MetricValue":"The CloudWatch metric value.","RoleArn":"The IAM role that allows access to the CloudWatch metric."}},"AWS::IoT::TopicRule.DynamoDBAction":{"attributes":{},"description":"Describes an action to write to a DynamoDB table.\\n\\nThe `tableName` , `hashKeyField` , and `rangeKeyField` values must match the values used when you created the table.\\n\\nThe `hashKeyValue` and `rangeKeyvalue` fields use a substitution template syntax. These templates provide data at runtime. The syntax is as follows: ${ *sql-expression* }.\\n\\nYou can specify any valid expression in a WHERE or SELECT clause, including JSON properties, comparisons, calculations, and functions. For example, the following field uses the third level of the topic:\\n\\n`\\"hashKeyValue\\": \\"${topic(3)}\\"`\\n\\nThe following field uses the timestamp:\\n\\n`\\"rangeKeyValue\\": \\"${timestamp()}\\"`\\n\\nFor more information, see [DynamoDBv2 Action](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rule-actions.html) in the *AWS IoT Developer Guide* .","properties":{"HashKeyField":"The hash key name.","HashKeyType":"The hash key type. Valid values are \\"STRING\\" or \\"NUMBER\\"","HashKeyValue":"The hash key value.","PayloadField":"The action payload. This name can be customized.","RangeKeyField":"The range key name.","RangeKeyType":"The range key type. Valid values are \\"STRING\\" or \\"NUMBER\\"","RangeKeyValue":"The range key value.","RoleArn":"The ARN of the IAM role that grants access to the DynamoDB table.","TableName":"The name of the DynamoDB table."}},"AWS::IoT::TopicRule.DynamoDBv2Action":{"attributes":{},"description":"Describes an action to write to a DynamoDB table.\\n\\nThis DynamoDB action writes each attribute in the message payload into it\'s own column in the DynamoDB table.","properties":{"PutItem":"Specifies the DynamoDB table to which the message data will be written. For example:\\n\\n`{ \\"dynamoDBv2\\": { \\"roleArn\\": \\"aws:iam:12341251:my-role\\" \\"putItem\\": { \\"tableName\\": \\"my-table\\" } } }`\\n\\nEach attribute in the message payload will be written to a separate column in the DynamoDB database.","RoleArn":"The ARN of the IAM role that grants access to the DynamoDB table."}},"AWS::IoT::TopicRule.ElasticsearchAction":{"attributes":{},"description":"Describes an action that writes data to an Amazon OpenSearch Service domain.\\n\\n> The `Elasticsearch` action can only be used by existing rule actions. To create a new rule action or to update an existing rule action, use the `OpenSearch` rule action instead. For more information, see [OpenSearchAction](https://docs.aws.amazon.com//iot/latest/apireference/API_OpenSearchAction.html) .","properties":{"Endpoint":"The endpoint of your OpenSearch domain.","Id":"The unique identifier for the document you are storing.","Index":"The index where you want to store your data.","RoleArn":"The IAM role ARN that has access to OpenSearch.","Type":"The type of document you are storing."}},"AWS::IoT::TopicRule.FirehoseAction":{"attributes":{},"description":"Describes an action that writes data to an Amazon Kinesis Firehose stream.","properties":{"BatchMode":"Whether to deliver the Kinesis Data Firehose stream as a batch by using [`PutRecordBatch`](https://docs.aws.amazon.com/firehose/latest/APIReference/API_PutRecordBatch.html) . The default value is `false` .\\n\\nWhen `batchMode` is `true` and the rule\'s SQL statement evaluates to an Array, each Array element forms one record in the [`PutRecordBatch`](https://docs.aws.amazon.com/firehose/latest/APIReference/API_PutRecordBatch.html) request. The resulting array can\'t have more than 500 records.","DeliveryStreamName":"The delivery stream name.","RoleArn":"The IAM role that grants access to the Amazon Kinesis Firehose stream.","Separator":"A character separator that will be used to separate records written to the Firehose stream. Valid values are: \'\\\\n\' (newline), \'\\\\t\' (tab), \'\\\\r\\\\n\' (Windows newline), \',\' (comma)."}},"AWS::IoT::TopicRule.HttpAction":{"attributes":{},"description":"Send data to an HTTPS endpoint.","properties":{"Auth":"The authentication method to use when sending data to an HTTPS endpoint.","ConfirmationUrl":"The URL to which AWS IoT sends a confirmation message. The value of the confirmation URL must be a prefix of the endpoint URL. If you do not specify a confirmation URL AWS IoT uses the endpoint URL as the confirmation URL. If you use substitution templates in the confirmationUrl, you must create and enable topic rule destinations that match each possible value of the substitution template before traffic is allowed to your endpoint URL.","Headers":"The HTTP headers to send with the message data.","Url":"The endpoint URL. If substitution templates are used in the URL, you must also specify a `confirmationUrl` . If this is a new destination, a new `TopicRuleDestination` is created if possible."}},"AWS::IoT::TopicRule.HttpActionHeader":{"attributes":{},"description":"The HTTP action header.","properties":{"Key":"The HTTP header key.","Value":"The HTTP header value. Substitution templates are supported."}},"AWS::IoT::TopicRule.HttpAuthorization":{"attributes":{},"description":"The authorization method used to send messages.","properties":{"Sigv4":"Use Sig V4 authorization. For more information, see [Signature Version 4 Signing Process](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) ."}},"AWS::IoT::TopicRule.IotAnalyticsAction":{"attributes":{},"description":"Sends message data to an AWS IoT Analytics channel.","properties":{"BatchMode":"Whether to process the action as a batch. The default value is `false` .\\n\\nWhen `batchMode` is `true` and the rule SQL statement evaluates to an Array, each Array element is delivered as a separate message when passed by [`BatchPutMessage`](https://docs.aws.amazon.com/iotanalytics/latest/APIReference/API_BatchPutMessage.html) The resulting array can\'t have more than 100 messages.","ChannelName":"The name of the IoT Analytics channel to which message data will be sent.","RoleArn":"The ARN of the role which has a policy that grants IoT Analytics permission to send message data via IoT Analytics (iotanalytics:BatchPutMessage)."}},"AWS::IoT::TopicRule.IotEventsAction":{"attributes":{},"description":"Sends an input to an AWS IoT Events detector.","properties":{"BatchMode":"Whether to process the event actions as a batch. The default value is `false` .\\n\\nWhen `batchMode` is `true` , you can\'t specify a `messageId` .\\n\\nWhen `batchMode` is `true` and the rule SQL statement evaluates to an Array, each Array element is treated as a separate message when Events by calling [`BatchPutMessage`](https://docs.aws.amazon.com/iotevents/latest/apireference/API_iotevents-data_BatchPutMessage.html) . The resulting array can\'t have more than 10 messages.","InputName":"The name of the AWS IoT Events input.","MessageId":"The ID of the message. The default `messageId` is a new UUID value.\\n\\nWhen `batchMode` is `true` , you can\'t specify a `messageId` --a new UUID value will be assigned.\\n\\nAssign a value to this property to ensure that only one input (message) with a given `messageId` will be processed by an AWS IoT Events detector.","RoleArn":"The ARN of the role that grants AWS IoT permission to send an input to an AWS IoT Events detector. (\\"Action\\":\\"iotevents:BatchPutMessage\\")."}},"AWS::IoT::TopicRule.IotSiteWiseAction":{"attributes":{},"description":"Describes an action to send data from an MQTT message that triggered the rule to AWS IoT SiteWise asset properties.","properties":{"PutAssetPropertyValueEntries":"A list of asset property value entries.","RoleArn":"The ARN of the role that grants AWS IoT permission to send an asset property value to AWS IoT SiteWise. ( `\\"Action\\": \\"iotsitewise:BatchPutAssetPropertyValue\\"` ). The trust policy can restrict access to specific asset hierarchy paths."}},"AWS::IoT::TopicRule.KafkaAction":{"attributes":{},"description":"Send messages to an Amazon Managed Streaming for Apache Kafka (Amazon MSK) or self-managed Apache Kafka cluster.","properties":{"ClientProperties":"Properties of the Apache Kafka producer client.","DestinationArn":"The ARN of Kafka action\'s VPC `TopicRuleDestination` .","Key":"The Kafka message key.","Partition":"The Kafka message partition.","Topic":"The Kafka topic for messages to be sent to the Kafka broker."}},"AWS::IoT::TopicRule.KinesisAction":{"attributes":{},"description":"Describes an action to write data to an Amazon Kinesis stream.","properties":{"PartitionKey":"The partition key.","RoleArn":"The ARN of the IAM role that grants access to the Amazon Kinesis stream.","StreamName":"The name of the Amazon Kinesis stream."}},"AWS::IoT::TopicRule.LambdaAction":{"attributes":{},"description":"Describes an action to invoke a Lambda function.","properties":{"FunctionArn":"The ARN of the Lambda function."}},"AWS::IoT::TopicRule.LocationAction":{"attributes":{},"description":"Describes an action to send device location updates from an MQTT message to an Amazon Location tracker resource.","properties":{"DeviceId":"The unique ID of the device providing the location data.","Latitude":"A string that evaluates to a double value that represents the latitude of the device\'s location.","Longitude":"A string that evaluates to a double value that represents the longitude of the device\'s location.","RoleArn":"The IAM role that grants permission to write to the Amazon Location resource.","Timestamp":"The time that the location data was sampled. The default value is the time the MQTT message was processed.","TrackerName":"The name of the tracker resource in Amazon Location in which the location is updated."}},"AWS::IoT::TopicRule.OpenSearchAction":{"attributes":{},"description":"Describes an action that writes data to an Amazon OpenSearch Service domain.","properties":{"Endpoint":"The endpoint of your OpenSearch domain.","Id":"The unique identifier for the document you are storing.","Index":"The OpenSearch index where you want to store your data.","RoleArn":"The IAM role ARN that has access to OpenSearch.","Type":"The type of document you are storing."}},"AWS::IoT::TopicRule.PutAssetPropertyValueEntry":{"attributes":{},"description":"An asset property value entry containing the following information.","properties":{"AssetId":"The ID of the AWS IoT SiteWise asset. You must specify either a `propertyAlias` or both an `aliasId` and a `propertyId` . Accepts substitution templates.","EntryId":"Optional. A unique identifier for this entry that you can define to better track which message caused an error in case of failure. Accepts substitution templates. Defaults to a new UUID.","PropertyAlias":"The name of the property alias associated with your asset property. You must specify either a `propertyAlias` or both an `aliasId` and a `propertyId` . Accepts substitution templates.","PropertyId":"The ID of the asset\'s property. You must specify either a `propertyAlias` or both an `aliasId` and a `propertyId` . Accepts substitution templates.","PropertyValues":"A list of property values to insert that each contain timestamp, quality, and value (TQV) information."}},"AWS::IoT::TopicRule.PutItemInput":{"attributes":{},"description":"The input for the DynamoActionVS action that specifies the DynamoDB table to which the message data will be written.","properties":{"TableName":"The table where the message data will be written."}},"AWS::IoT::TopicRule.RepublishAction":{"attributes":{},"description":"Describes an action to republish to another topic.","properties":{"Headers":"MQTT Version 5.0 headers information. For more information, see [MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) in the IoT Core Developer Guide.","Qos":"The Quality of Service (QoS) level to use when republishing messages. The default value is 0.","RoleArn":"The ARN of the IAM role that grants access.","Topic":"The name of the MQTT topic."}},"AWS::IoT::TopicRule.RepublishActionHeaders":{"attributes":{},"description":"Specifies MQTT Version 5.0 headers information. For more information, see [MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) in the IoT Core Developer Guide.","properties":{"ContentType":"A UTF-8 encoded string that describes the content of the publishing message.\\n\\nFor more information, see [Content Type](https://docs.aws.amazon.com/https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901118) in the MQTT Version 5.0 specification.\\n\\nSupports [substitution templates](https://docs.aws.amazon.com//iot/latest/developerguide/iot-substitution-templates.html) .","CorrelationData":"The base64-encoded binary data used by the sender of the request message to identify which request the response message is for.\\n\\nFor more information, see [Correlation Data](https://docs.aws.amazon.com/https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901115) in the MQTT Version 5.0 specification.\\n\\nSupports [substitution templates](https://docs.aws.amazon.com//iot/latest/developerguide/iot-substitution-templates.html) .\\n\\n> This binary data must be base64-encoded.","MessageExpiry":"A user-defined integer value that represents the message expiry interval at the broker. If the messages haven\'t been sent to the subscribers within that interval, the message expires and is removed. The value of `messageExpiry` represents the number of seconds before it expires. For more information about the limits of `messageExpiry` , see [Message broker and protocol limits and quotas](https://docs.aws.amazon.com//general/latest/gr/iot-core.html#limits_iot) in the IoT Core Reference Guide.\\n\\nSupports [substitution templates](https://docs.aws.amazon.com//iot/latest/developerguide/iot-substitution-templates.html) .","PayloadFormatIndicator":"An `Enum` string value that indicates whether the payload is formatted as UTF-8.\\n\\nValid values are `UNSPECIFIED_BYTES` and `UTF8_DATA` .\\n\\nFor more information, see [Payload Format Indicator](https://docs.aws.amazon.com/https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901111) from the MQTT Version 5.0 specification.\\n\\nSupports [substitution templates](https://docs.aws.amazon.com//iot/latest/developerguide/iot-substitution-templates.html) .","ResponseTopic":"A UTF-8 encoded string that\'s used as the topic name for a response message. The response topic is used to describe the topic to which the receiver should publish as part of the request-response flow. The topic must not contain wildcard characters.\\n\\nFor more information, see [Response Topic](https://docs.aws.amazon.com/https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901114) in the MQTT Version 5.0 specification.\\n\\nSupports [substitution templates](https://docs.aws.amazon.com//iot/latest/developerguide/iot-substitution-templates.html) .","UserProperties":"An array of key-value pairs that you define in the MQTT5 header."}},"AWS::IoT::TopicRule.S3Action":{"attributes":{},"description":"Describes an action to write data to an Amazon S3 bucket.","properties":{"BucketName":"The Amazon S3 bucket.","CannedAcl":"The Amazon S3 canned ACL that controls access to the object identified by the object key. For more information, see [S3 canned ACLs](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl) .","Key":"The object key. For more information, see [Actions, resources, and condition keys for Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/list_amazons3.html) .","RoleArn":"The ARN of the IAM role that grants access."}},"AWS::IoT::TopicRule.SigV4Authorization":{"attributes":{},"description":"For more information, see [Signature Version 4 signing process](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) .","properties":{"RoleArn":"The ARN of the signing role.","ServiceName":"The service name to use while signing with Sig V4.","SigningRegion":"The signing region."}},"AWS::IoT::TopicRule.SnsAction":{"attributes":{},"description":"Describes an action to publish to an Amazon SNS topic.","properties":{"MessageFormat":"(Optional) The message format of the message to publish. Accepted values are \\"JSON\\" and \\"RAW\\". The default value of the attribute is \\"RAW\\". SNS uses this setting to determine if the payload should be parsed and relevant platform-specific bits of the payload should be extracted. For more information, see [Amazon SNS Message and JSON Formats](https://docs.aws.amazon.com/sns/latest/dg/json-formats.html) in the *Amazon Simple Notification Service Developer Guide* .","RoleArn":"The ARN of the IAM role that grants access.","TargetArn":"The ARN of the SNS topic."}},"AWS::IoT::TopicRule.SqsAction":{"attributes":{},"description":"Describes an action to publish data to an Amazon SQS queue.","properties":{"QueueUrl":"The URL of the Amazon SQS queue.","RoleArn":"The ARN of the IAM role that grants access.","UseBase64":"Specifies whether to use Base64 encoding."}},"AWS::IoT::TopicRule.StepFunctionsAction":{"attributes":{},"description":"Starts execution of a Step Functions state machine.","properties":{"ExecutionNamePrefix":"(Optional) A name will be given to the state machine execution consisting of this prefix followed by a UUID. Step Functions automatically creates a unique name for each state machine execution if one is not provided.","RoleArn":"The ARN of the role that grants IoT permission to start execution of a state machine (\\"Action\\":\\"states:StartExecution\\").","StateMachineName":"The name of the Step Functions state machine whose execution will be started."}},"AWS::IoT::TopicRule.Timestamp":{"attributes":{},"description":"Describes how to interpret an application-defined timestamp value from an MQTT message payload and the precision of that value.","properties":{"Unit":"The precision of the timestamp value that results from the expression described in `value` .","Value":"An expression that returns a long epoch time value."}},"AWS::IoT::TopicRule.TimestreamAction":{"attributes":{},"description":"Describes an action that writes records into an Amazon Timestream table.","properties":{"DatabaseName":"The name of an Amazon Timestream database that has the table to write records into.","Dimensions":"Metadata attributes of the time series that are written in each measure record.","RoleArn":"The Amazon Resource Name (ARN) of the role that grants AWS IoT permission to write to the Timestream database table.","TableName":"The table where the message data will be written.","Timestamp":"The value to use for the entry\'s timestamp. If blank, the time that the entry was processed is used."}},"AWS::IoT::TopicRule.TimestreamDimension":{"attributes":{},"description":"Metadata attributes of the time series that are written in each measure record.","properties":{"Name":"The metadata dimension name. This is the name of the column in the Amazon Timestream database table record.","Value":"The value to write in this column of the database record."}},"AWS::IoT::TopicRule.TimestreamTimestamp":{"attributes":{},"description":"The value to use for the entry\'s timestamp. If blank, the time that the entry was processed is used.","properties":{"Unit":"The precision of the timestamp value that results from the expression described in `value` .","Value":"An expression that returns a long epoch time value."}},"AWS::IoT::TopicRule.TopicRulePayload":{"attributes":{},"description":"Describes a rule.","properties":{"Actions":"The actions associated with the rule.","AwsIotSqlVersion":"The version of the SQL rules engine to use when evaluating the rule.\\n\\nThe default value is 2015-10-08.","Description":"The description of the rule.","ErrorAction":"The action to take when an error occurs.","RuleDisabled":"Specifies whether the rule is disabled.","Sql":"The SQL statement used to query the topic. For more information, see [AWS IoT SQL Reference](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-reference.html) in the *AWS IoT Developer Guide* ."}},"AWS::IoT::TopicRule.UserProperty":{"attributes":{},"description":"A key-value pair that you define in the header.","properties":{"Key":"A key to be specified in `UserProperty` .","Value":"A value to be specified in `UserProperty` ."}},"AWS::IoT::TopicRuleDestination":{"attributes":{"Arn":"The topic rule destination URL.","Ref":"`Ref` returns the topic rule destination. For example:\\n\\n`{ \\"Ref\\": \\"TopicRuleDestination\\" }`\\n\\nA value similar to the following is returned:\\n\\n`a1234567b89c012d3e4fg567hij8k9l01mno1p23q45678901rs234567890t1u2`","StatusReason":"Additional details or reason why the topic rule destination is in the current status."},"description":"A topic rule destination.","properties":{"HttpUrlProperties":"Properties of the HTTP URL.","Status":"- **IN_PROGRESS** - A topic rule destination was created but has not been confirmed. You can set status to `IN_PROGRESS` by calling `UpdateTopicRuleDestination` . Calling `UpdateTopicRuleDestination` causes a new confirmation challenge to be sent to your confirmation endpoint.\\n- **ENABLED** - Confirmation was completed, and traffic to this destination is allowed. You can set status to `DISABLED` by calling `UpdateTopicRuleDestination` .\\n- **DISABLED** - Confirmation was completed, and traffic to this destination is not allowed. You can set status to `ENABLED` by calling `UpdateTopicRuleDestination` .\\n- **ERROR** - Confirmation could not be completed; for example, if the confirmation timed out. You can call `GetTopicRuleDestination` for details about the error. You can set status to `IN_PROGRESS` by calling `UpdateTopicRuleDestination` . Calling `UpdateTopicRuleDestination` causes a new confirmation challenge to be sent to your confirmation endpoint.","VpcProperties":"Properties of the virtual private cloud (VPC) connection."}},"AWS::IoT::TopicRuleDestination.HttpUrlDestinationSummary":{"attributes":{},"description":"HTTP URL destination properties.","properties":{"ConfirmationUrl":"The URL used to confirm the HTTP topic rule destination URL."}},"AWS::IoT::TopicRuleDestination.VpcDestinationProperties":{"attributes":{},"description":"The properties of a virtual private cloud (VPC) destination.","properties":{"RoleArn":"The ARN of a role that has permission to create and attach to elastic network interfaces (ENIs).","SecurityGroups":"The security groups of the VPC destination.","SubnetIds":"The subnet IDs of the VPC destination.","VpcId":"The ID of the VPC."}},"AWS::IoTAnalytics::Channel":{"attributes":{},"description":"The AWS::IoTAnalytics::Channel resource collects data from an MQTT topic and archives the raw, unprocessed messages before publishing the data to a pipeline. For more information, see [How to Use AWS IoT Analytics](https://docs.aws.amazon.com/iotanalytics/latest/userguide/welcome.html#aws-iot-analytics-how) in the *AWS IoT Analytics User Guide* .","properties":{"ChannelName":"The name of the channel.","ChannelStorage":"Where channel data is stored.","RetentionPeriod":"How long, in days, message data is kept for the channel.","Tags":"Metadata which can be used to manage the channel.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::IoTAnalytics::Channel.ChannelStorage":{"attributes":{},"description":"Where channel data is stored. You may choose one of `serviceManagedS3` , `customerManagedS3` storage. If not specified, the default is `serviceManagedS3` . This can\'t be changed after creation of the channel.","properties":{"CustomerManagedS3":"Used to store channel data in an S3 bucket that you manage. If customer managed storage is selected, the `retentionPeriod` parameter is ignored. You can\'t change the choice of S3 storage after the data store is created.","ServiceManagedS3":"Used to store channel data in an S3 bucket managed by AWS IoT Analytics . You can\'t change the choice of S3 storage after the data store is created."}},"AWS::IoTAnalytics::Channel.CustomerManagedS3":{"attributes":{},"description":"Used to store channel data in an S3 bucket that you manage.","properties":{"Bucket":"The name of the S3 bucket in which channel data is stored.","KeyPrefix":"(Optional) The prefix used to create the keys of the channel data objects. Each object in an S3 bucket has a key that is its unique identifier within the bucket (each object in a bucket has exactly one key). The prefix must end with a forward slash (/).","RoleArn":"The ARN of the role that grants AWS IoT Analytics permission to interact with your Amazon S3 resources."}},"AWS::IoTAnalytics::Channel.RetentionPeriod":{"attributes":{},"description":"How long, in days, message data is kept.","properties":{"NumberOfDays":"The number of days that message data is kept. The `unlimited` parameter must be false.","Unlimited":"If true, message data is kept indefinitely."}},"AWS::IoTAnalytics::Dataset":{"attributes":{},"description":"The AWS::IoTAnalytics::Dataset resource stores data retrieved from a data store by applying a `queryAction` (an SQL query) or a `containerAction` (executing a containerized application). The data set can be populated manually by calling `CreateDatasetContent` or automatically according to a `trigger` you specify. For more information, see [How to Use AWS IoT Analytics](https://docs.aws.amazon.com/iotanalytics/latest/userguide/welcome.html#aws-iot-analytics-how) in the *AWS IoT Analytics User Guide* .","properties":{"Actions":"The `DatasetAction` objects that automatically create the dataset contents.","ContentDeliveryRules":"When dataset contents are created they are delivered to destinations specified here.","DatasetName":"The name of the dataset.","LateDataRules":"A list of data rules that send notifications to CloudWatch, when data arrives late. To specify `lateDataRules` , the dataset must use a [DeltaTimer](https://docs.aws.amazon.com/iotanalytics/latest/APIReference/API_DeltaTime.html) filter.","RetentionPeriod":"Optional. How long, in days, message data is kept for the dataset.","Tags":"Metadata which can be used to manage the data set.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","Triggers":"The `DatasetTrigger` objects that specify when the dataset is automatically updated.","VersioningConfiguration":"Optional. How many versions of dataset contents are kept. If not specified or set to null, only the latest version plus the latest succeeded version (if they are different) are kept for the time period specified by the `retentionPeriod` parameter. For more information, see [Keeping Multiple Versions of AWS IoT Analytics datasets](https://docs.aws.amazon.com/iotanalytics/latest/userguide/getting-started.html#aws-iot-analytics-dataset-versions) in the *AWS IoT Analytics User Guide* ."}},"AWS::IoTAnalytics::Dataset.Action":{"attributes":{},"description":"Information needed to run the \\"containerAction\\" to produce data set contents.","properties":{"ActionName":"The name of the data set action by which data set contents are automatically created.","ContainerAction":"Information which allows the system to run a containerized application in order to create the data set contents. The application must be in a Docker container along with any needed support libraries.","QueryAction":"An \\"SqlQueryDatasetAction\\" object that uses an SQL query to automatically create data set contents."}},"AWS::IoTAnalytics::Dataset.ContainerAction":{"attributes":{},"description":"Information needed to run the \\"containerAction\\" to produce data set contents.","properties":{"ExecutionRoleArn":"The ARN of the role which gives permission to the system to access needed resources in order to run the \\"containerAction\\". This includes, at minimum, permission to retrieve the data set contents which are the input to the containerized application.","Image":"The ARN of the Docker container stored in your account. The Docker container contains an application and needed support libraries and is used to generate data set contents.","ResourceConfiguration":"Configuration of the resource which executes the \\"containerAction\\".","Variables":"The values of variables used within the context of the execution of the containerized application (basically, parameters passed to the application). Each variable must have a name and a value given by one of \\"stringValue\\", \\"datasetContentVersionValue\\", or \\"outputFileUriValue\\"."}},"AWS::IoTAnalytics::Dataset.DatasetContentDeliveryRule":{"attributes":{},"description":"When dataset contents are created, they are delivered to destination specified here.","properties":{"Destination":"The destination to which dataset contents are delivered.","EntryName":"The name of the dataset content delivery rules entry."}},"AWS::IoTAnalytics::Dataset.DatasetContentDeliveryRuleDestination":{"attributes":{},"description":"The destination to which dataset contents are delivered.","properties":{"IotEventsDestinationConfiguration":"Configuration information for delivery of dataset contents to AWS IoT Events .","S3DestinationConfiguration":"Configuration information for delivery of dataset contents to Amazon S3."}},"AWS::IoTAnalytics::Dataset.DatasetContentVersionValue":{"attributes":{},"description":"The dataset whose latest contents are used as input to the notebook or application.","properties":{"DatasetName":"The name of the dataset whose latest contents are used as input to the notebook or application."}},"AWS::IoTAnalytics::Dataset.DeltaTime":{"attributes":{},"description":"Used to limit data to that which has arrived since the last execution of the action.","properties":{"OffsetSeconds":"The number of seconds of estimated in-flight lag time of message data. When you create dataset contents using message data from a specified timeframe, some message data might still be in flight when processing begins, and so do not arrive in time to be processed. Use this field to make allowances for the in flight time of your message data, so that data not processed from a previous timeframe is included with the next timeframe. Otherwise, missed message data would be excluded from processing during the next timeframe too, because its timestamp places it within the previous timeframe.","TimeExpression":"An expression by which the time of the message data might be determined. This can be the name of a timestamp field or a SQL expression that is used to derive the time the message data was generated."}},"AWS::IoTAnalytics::Dataset.DeltaTimeSessionWindowConfiguration":{"attributes":{},"description":"A structure that contains the configuration information of a delta time session window.\\n\\n[`DeltaTime`](https://docs.aws.amazon.com/iotanalytics/latest/APIReference/API_DeltaTime.html) specifies a time interval. You can use `DeltaTime` to create dataset contents with data that has arrived in the data store since the last execution. For an example of `DeltaTime` , see [Creating a SQL dataset with a delta window (CLI)](https://docs.aws.amazon.com/iotanalytics/latest/userguide/automate-create-dataset.html#automate-example6) in the *AWS IoT Analytics User Guide* .","properties":{"TimeoutInMinutes":"A time interval. You can use `timeoutInMinutes` so that AWS IoT Analytics can batch up late data notifications that have been generated since the last execution. AWS IoT Analytics sends one batch of notifications to Amazon CloudWatch Events at one time.\\n\\nFor more information about how to write a timestamp expression, see [Date and Time Functions and Operators](https://docs.aws.amazon.com/https://prestodb.io/docs/current/functions/datetime.html) , in the *Presto 0.172 Documentation* ."}},"AWS::IoTAnalytics::Dataset.Filter":{"attributes":{},"description":"Information which is used to filter message data, to segregate it according to the time frame in which it arrives.","properties":{"DeltaTime":"Used to limit data to that which has arrived since the last execution of the action."}},"AWS::IoTAnalytics::Dataset.GlueConfiguration":{"attributes":{},"description":"Configuration information for coordination with AWS Glue , a fully managed extract, transform and load (ETL) service.","properties":{"DatabaseName":"The name of the database in your AWS Glue Data Catalog in which the table is located. An AWS Glue Data Catalog database contains metadata tables.","TableName":"The name of the table in your AWS Glue Data Catalog that is used to perform the ETL operations. An AWS Glue Data Catalog table contains partitioned data and descriptions of data sources and targets."}},"AWS::IoTAnalytics::Dataset.IotEventsDestinationConfiguration":{"attributes":{},"description":"Configuration information for delivery of dataset contents to AWS IoT Events .","properties":{"InputName":"The name of the AWS IoT Events input to which dataset contents are delivered.","RoleArn":"The ARN of the role that grants AWS IoT Analytics permission to deliver dataset contents to an AWS IoT Events input."}},"AWS::IoTAnalytics::Dataset.LateDataRule":{"attributes":{},"description":"A structure that contains the name and configuration information of a late data rule.","properties":{"RuleConfiguration":"The information needed to configure the late data rule.","RuleName":"The name of the late data rule."}},"AWS::IoTAnalytics::Dataset.LateDataRuleConfiguration":{"attributes":{},"description":"The information needed to configure a delta time session window.","properties":{"DeltaTimeSessionWindowConfiguration":"The information needed to configure a delta time session window."}},"AWS::IoTAnalytics::Dataset.OutputFileUriValue":{"attributes":{},"description":"The value of the variable as a structure that specifies an output file URI.","properties":{"FileName":"The URI of the location where dataset contents are stored, usually the URI of a file in an S3 bucket."}},"AWS::IoTAnalytics::Dataset.QueryAction":{"attributes":{},"description":"An \\"SqlQueryDatasetAction\\" object that uses an SQL query to automatically create data set contents.","properties":{"Filters":"Pre-filters applied to message data.","SqlQuery":"An \\"SqlQueryDatasetAction\\" object that uses an SQL query to automatically create data set contents."}},"AWS::IoTAnalytics::Dataset.ResourceConfiguration":{"attributes":{},"description":"The configuration of the resource used to execute the `containerAction` .","properties":{"ComputeType":"The type of the compute resource used to execute the `containerAction` . Possible values are: `ACU_1` (vCPU=4, memory=16 GiB) or `ACU_2` (vCPU=8, memory=32 GiB).","VolumeSizeInGB":"The size, in GB, of the persistent storage available to the resource instance used to execute the `containerAction` (min: 1, max: 50)."}},"AWS::IoTAnalytics::Dataset.RetentionPeriod":{"attributes":{},"description":"How long, in days, message data is kept.","properties":{"NumberOfDays":"The number of days that message data is kept. The `unlimited` parameter must be false.","Unlimited":"If true, message data is kept indefinitely."}},"AWS::IoTAnalytics::Dataset.S3DestinationConfiguration":{"attributes":{},"description":"Configuration information for delivery of dataset contents to Amazon Simple Storage Service (Amazon S3).","properties":{"Bucket":"The name of the S3 bucket to which dataset contents are delivered.","GlueConfiguration":"Configuration information for coordination with AWS Glue , a fully managed extract, transform and load (ETL) service.","Key":"The key of the dataset contents object in an S3 bucket. Each object has a key that is a unique identifier. Each object has exactly one key.\\n\\nYou can create a unique key with the following options:\\n\\n- Use `!{iotanalytics:scheduleTime}` to insert the time of a scheduled SQL query run.\\n- Use `!{iotanalytics:versionId}` to insert a unique hash that identifies a dataset content.\\n- Use `!{iotanalytics:creationTime}` to insert the creation time of a dataset content.\\n\\nThe following example creates a unique key for a CSV file: `dataset/mydataset/!{iotanalytics:scheduleTime}/!{iotanalytics:versionId}.csv`\\n\\n> If you don\'t use `!{iotanalytics:versionId}` to specify the key, you might get duplicate keys. For example, you might have two dataset contents with the same `scheduleTime` but different `versionId` s. This means that one dataset content overwrites the other.","RoleArn":"The ARN of the role that grants AWS IoT Analytics permission to interact with your Amazon S3 and AWS Glue resources."}},"AWS::IoTAnalytics::Dataset.Schedule":{"attributes":{},"description":"The schedule for when to trigger an update.","properties":{"ScheduleExpression":"The expression that defines when to trigger an update. For more information, see [Schedule Expressions for Rules](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html) in the Amazon CloudWatch documentation."}},"AWS::IoTAnalytics::Dataset.Trigger":{"attributes":{},"description":"The \\"DatasetTrigger\\" that specifies when the data set is automatically updated.","properties":{"Schedule":"The \\"Schedule\\" when the trigger is initiated.","TriggeringDataset":"Information about the data set whose content generation triggers the new data set content generation."}},"AWS::IoTAnalytics::Dataset.TriggeringDataset":{"attributes":{},"description":"Information about the dataset whose content generation triggers the new dataset content generation.","properties":{"DatasetName":"The name of the data set whose content generation triggers the new data set content generation."}},"AWS::IoTAnalytics::Dataset.Variable":{"attributes":{},"description":"An instance of a variable to be passed to the `containerAction` execution. Each variable must have a name and a value given by one of `stringValue` , `datasetContentVersionValue` , or `outputFileUriValue` .","properties":{"DatasetContentVersionValue":"The value of the variable as a structure that specifies a dataset content version.","DoubleValue":"The value of the variable as a double (numeric).","OutputFileUriValue":"The value of the variable as a structure that specifies an output file URI.","StringValue":"The value of the variable as a string.","VariableName":"The name of the variable."}},"AWS::IoTAnalytics::Dataset.VersioningConfiguration":{"attributes":{},"description":"Information about the versioning of dataset contents.","properties":{"MaxVersions":"How many versions of dataset contents are kept. The `unlimited` parameter must be `false` .","Unlimited":"If true, unlimited versions of dataset contents are kept."}},"AWS::IoTAnalytics::Datastore":{"attributes":{},"description":"AWS::IoTAnalytics::Datastore resource is a repository for messages. For more information, see [How to Use AWS IoT Analytics](https://docs.aws.amazon.com/iotanalytics/latest/userguide/welcome.html#aws-iot-analytics-how) in the *AWS IoT Analytics User Guide* .","properties":{"DatastoreName":"The name of the data store.","DatastorePartitions":"Information about the partition dimensions in a data store.","DatastoreStorage":"Where data store data is stored.","FileFormatConfiguration":"Contains the configuration information of file formats. AWS IoT Analytics data stores support JSON and [Parquet](https://docs.aws.amazon.com/https://parquet.apache.org/) .\\n\\nThe default file format is JSON. You can specify only one format.\\n\\nYou can\'t change the file format after you create the data store.","RetentionPeriod":"How long, in days, message data is kept for the data store. When `customerManagedS3` storage is selected, this parameter is ignored.","Tags":"Metadata which can be used to manage the data store.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::IoTAnalytics::Datastore.Column":{"attributes":{},"description":"Contains information about a column that stores your data.","properties":{"Name":"The name of the column.","Type":"The type of data. For more information about the supported data types, see [Common data types](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-common.html) in the *AWS Glue Developer Guide* ."}},"AWS::IoTAnalytics::Datastore.CustomerManagedS3":{"attributes":{},"description":"S3-customer-managed; When you choose customer-managed storage, the `retentionPeriod` parameter is ignored. You can\'t change the choice of Amazon S3 storage after your data store is created.","properties":{"Bucket":"The name of the Amazon S3 bucket where your data is stored.","KeyPrefix":"(Optional) The prefix used to create the keys of the data store data objects. Each object in an Amazon S3 bucket has a key that is its unique identifier in the bucket. Each object in a bucket has exactly one key. The prefix must end with a forward slash (/).","RoleArn":"The ARN of the role that grants AWS IoT Analytics permission to interact with your Amazon S3 resources."}},"AWS::IoTAnalytics::Datastore.CustomerManagedS3Storage":{"attributes":{},"description":"Amazon S3 -customer-managed; When you choose customer-managed storage, the `retentionPeriod` parameter is ignored. You can\'t change the choice of Amazon S3 storage after your data store is created.","properties":{"Bucket":"The name of the Amazon S3 bucket where your data is stored.","KeyPrefix":"(Optional) The prefix used to create the keys of the data store data objects. Each object in an Amazon S3 bucket has a key that is its unique identifier in the bucket. Each object in a bucket has exactly one key. The prefix must end with a forward slash (/)."}},"AWS::IoTAnalytics::Datastore.DatastorePartition":{"attributes":{},"description":"A single dimension to partition a data store. The dimension must be an `AttributePartition` or a `TimestampPartition` .","properties":{"Partition":"A partition dimension defined by an attribute.","TimestampPartition":"A partition dimension defined by a timestamp attribute."}},"AWS::IoTAnalytics::Datastore.DatastorePartitions":{"attributes":{},"description":"Information about the partition dimensions in a data store.","properties":{"Partitions":"A list of partition dimensions in a data store."}},"AWS::IoTAnalytics::Datastore.DatastoreStorage":{"attributes":{},"description":"Where data store data is stored.","properties":{"CustomerManagedS3":"Use this to store data store data in an S3 bucket that you manage. The choice of service-managed or customer-managed S3 storage cannot be changed after creation of the data store.","IotSiteWiseMultiLayerStorage":"Use this to store data used by AWS IoT SiteWise in an Amazon S3 bucket that you manage. You can\'t change the choice of Amazon S3 storage after your data store is created.","ServiceManagedS3":"Use this to store data store data in an S3 bucket managed by the AWS IoT Analytics service. The choice of service-managed or customer-managed S3 storage cannot be changed after creation of the data store."}},"AWS::IoTAnalytics::Datastore.FileFormatConfiguration":{"attributes":{},"description":"Contains the configuration information of file formats. AWS IoT Analytics data stores support JSON and [Parquet](https://docs.aws.amazon.com/https://parquet.apache.org/) .\\n\\nThe default file format is JSON. You can specify only one format.\\n\\nYou can\'t change the file format after you create the data store.","properties":{"JsonConfiguration":"Contains the configuration information of the JSON format.","ParquetConfiguration":"Contains the configuration information of the Parquet format."}},"AWS::IoTAnalytics::Datastore.IotSiteWiseMultiLayerStorage":{"attributes":{},"description":"Stores data used by AWS IoT SiteWise in an Amazon S3 bucket that you manage. You can\'t change the choice of Amazon S3 storage after your data store is created.","properties":{"CustomerManagedS3Storage":"Stores data used by AWS IoT SiteWise in an Amazon S3 bucket that you manage."}},"AWS::IoTAnalytics::Datastore.ParquetConfiguration":{"attributes":{},"description":"Contains the configuration information of the Parquet format.","properties":{"SchemaDefinition":"Information needed to define a schema."}},"AWS::IoTAnalytics::Datastore.Partition":{"attributes":{},"description":"A single dimension to partition a data store. The dimension must be an `AttributePartition` or a `TimestampPartition` .","properties":{"AttributeName":"The name of the attribute that defines a partition dimension."}},"AWS::IoTAnalytics::Datastore.RetentionPeriod":{"attributes":{},"description":"How long, in days, message data is kept.","properties":{"NumberOfDays":"The number of days that message data is kept. The `unlimited` parameter must be false.","Unlimited":"If true, message data is kept indefinitely."}},"AWS::IoTAnalytics::Datastore.SchemaDefinition":{"attributes":{},"description":"Information needed to define a schema.","properties":{"Columns":"Specifies one or more columns that store your data.\\n\\nEach schema can have up to 100 columns. Each column can have up to 100 nested types."}},"AWS::IoTAnalytics::Datastore.TimestampPartition":{"attributes":{},"description":"A partition dimension defined by a timestamp attribute.","properties":{"AttributeName":"The attribute name of the partition defined by a timestamp.","TimestampFormat":"The timestamp format of a partition defined by a timestamp. The default format is seconds since epoch (January 1, 1970 at midnight UTC time)."}},"AWS::IoTAnalytics::Pipeline":{"attributes":{},"description":"The AWS::IoTAnalytics::Pipeline resource consumes messages from one or more channels and allows you to process the messages before storing them in a data store. You must specify both a `channel` and a `datastore` activity and, optionally, as many as 23 additional activities in the `pipelineActivities` array. For more information, see [How to Use AWS IoT Analytics](https://docs.aws.amazon.com/iotanalytics/latest/userguide/welcome.html#aws-iot-analytics-how) in the *AWS IoT Analytics User Guide* .","properties":{"PipelineActivities":"A list of \\"PipelineActivity\\" objects. Activities perform transformations on your messages, such as removing, renaming or adding message attributes; filtering messages based on attribute values; invoking your Lambda functions on messages for advanced processing; or performing mathematical transformations to normalize device data.\\n\\nThe list can be 2-25 *PipelineActivity* objects and must contain both a `channel` and a `datastore` activity. Each entry in the list must contain only one activity, for example:\\n\\n`pipelineActivities = [ { \\"channel\\": { ... } }, { \\"lambda\\": { ... } }, ... ]`","PipelineName":"The name of the pipeline.","Tags":"Metadata which can be used to manage the pipeline.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::IoTAnalytics::Pipeline.Activity":{"attributes":{},"description":"An activity that performs a transformation on a message.","properties":{"AddAttributes":"Adds other attributes based on existing attributes in the message.","Channel":"Determines the source of the messages to be processed.","Datastore":"Specifies where to store the processed message data.","DeviceRegistryEnrich":"Adds data from the AWS IoT device registry to your message.","DeviceShadowEnrich":"Adds information from the AWS IoT Device Shadows service to a message.","Filter":"Filters a message based on its attributes.","Lambda":"Runs a Lambda function to modify the message.","Math":"Computes an arithmetic expression using the message\'s attributes and adds it to the message.","RemoveAttributes":"Removes attributes from a message.","SelectAttributes":"Creates a new message using only the specified attributes from the original message."}},"AWS::IoTAnalytics::Pipeline.AddAttributes":{"attributes":{},"description":"An activity that adds other attributes based on existing attributes in the message.","properties":{"Attributes":"A list of 1-50 \\"AttributeNameMapping\\" objects that map an existing attribute to a new attribute.\\n\\n> The existing attributes remain in the message, so if you want to remove the originals, use \\"RemoveAttributeActivity\\".","Name":"The name of the \'addAttributes\' activity.","Next":"The next activity in the pipeline."}},"AWS::IoTAnalytics::Pipeline.Channel":{"attributes":{},"description":"Determines the source of the messages to be processed.","properties":{"ChannelName":"The name of the channel from which the messages are processed.","Name":"The name of the \'channel\' activity.","Next":"The next activity in the pipeline."}},"AWS::IoTAnalytics::Pipeline.Datastore":{"attributes":{},"description":"The datastore activity that specifies where to store the processed data.","properties":{"DatastoreName":"The name of the data store where processed messages are stored.","Name":"The name of the datastore activity."}},"AWS::IoTAnalytics::Pipeline.DeviceRegistryEnrich":{"attributes":{},"description":"An activity that adds data from the AWS IoT device registry to your message.","properties":{"Attribute":"The name of the attribute that is added to the message.","Name":"The name of the \'deviceRegistryEnrich\' activity.","Next":"The next activity in the pipeline.","RoleArn":"The ARN of the role that allows access to the device\'s registry information.","ThingName":"The name of the IoT device whose registry information is added to the message."}},"AWS::IoTAnalytics::Pipeline.DeviceShadowEnrich":{"attributes":{},"description":"An activity that adds information from the AWS IoT Device Shadows service to a message.","properties":{"Attribute":"The name of the attribute that is added to the message.","Name":"The name of the \'deviceShadowEnrich\' activity.","Next":"The next activity in the pipeline.","RoleArn":"The ARN of the role that allows access to the device\'s shadow.","ThingName":"The name of the IoT device whose shadow information is added to the message."}},"AWS::IoTAnalytics::Pipeline.Filter":{"attributes":{},"description":"An activity that filters a message based on its attributes.","properties":{"Filter":"An expression that looks like an SQL WHERE clause that must return a Boolean value.","Name":"The name of the \'filter\' activity.","Next":"The next activity in the pipeline."}},"AWS::IoTAnalytics::Pipeline.Lambda":{"attributes":{},"description":"An activity that runs a Lambda function to modify the message.","properties":{"BatchSize":"The number of messages passed to the Lambda function for processing.\\n\\nThe AWS Lambda function must be able to process all of these messages within five minutes, which is the maximum timeout duration for Lambda functions.","LambdaName":"The name of the Lambda function that is run on the message.","Name":"The name of the \'lambda\' activity.","Next":"The next activity in the pipeline."}},"AWS::IoTAnalytics::Pipeline.Math":{"attributes":{},"description":"An activity that computes an arithmetic expression using the message\'s attributes.","properties":{"Attribute":"The name of the attribute that contains the result of the math operation.","Math":"An expression that uses one or more existing attributes and must return an integer value.","Name":"The name of the \'math\' activity.","Next":"The next activity in the pipeline."}},"AWS::IoTAnalytics::Pipeline.RemoveAttributes":{"attributes":{},"description":"An activity that removes attributes from a message.","properties":{"Attributes":"A list of 1-50 attributes to remove from the message.","Name":"The name of the \'removeAttributes\' activity.","Next":"The next activity in the pipeline."}},"AWS::IoTAnalytics::Pipeline.SelectAttributes":{"attributes":{},"description":"Creates a new message using only the specified attributes from the original message.","properties":{"Attributes":"A list of the attributes to select from the message.","Name":"The name of the \'selectAttributes\' activity.","Next":"The next activity in the pipeline."}},"AWS::IoTCoreDeviceAdvisor::SuiteDefinition":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the Suite Definition name.","SuiteDefinitionArn":"The Arn of the Suite Definition.","SuiteDefinitionId":"The version of the Suite Definition.","SuiteDefinitionVersion":"The ID of the Suite Definition."},"description":"Creates a Device Advisor test suite.\\n\\nRequires permission to access the [CreateSuiteDefinition](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions) action.","properties":{"SuiteDefinitionConfiguration":"The configuration of the Suite Definition. Listed below are the required elements of the `SuiteDefinitionConfiguration` .\\n\\n- ***devicePermissionRoleArn*** - The device permission arn.\\n\\nThis is a required element.\\n\\n*Type:* String\\n- ***devices*** - The list of configured devices under test. For more information on devices under test, see [DeviceUnderTest](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdeviceadvisor_DeviceUnderTest.html)\\n\\nNot a required element.\\n\\n*Type:* List of devices under test\\n- ***intendedForQualification*** - The tests intended for qualification in a suite.\\n\\nNot a required element.\\n\\n*Type:* Boolean\\n- ***rootGroup*** - The test suite root group. For more information on creating and using root groups see the [Device Advisor workflow](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-workflow.html) .\\n\\nThis is a required element.\\n\\n*Type:* String\\n- ***suiteDefinitionName*** - The Suite Definition Configuration name.\\n\\nThis is a required element.\\n\\n*Type:* String","Tags":"Metadata that can be used to manage the the Suite Definition."}},"AWS::IoTCoreDeviceAdvisor::SuiteDefinition.DeviceUnderTest":{"attributes":{},"description":"","properties":{"CertificateArn":"","ThingArn":""}},"AWS::IoTCoreDeviceAdvisor::SuiteDefinition.SuiteDefinitionConfiguration":{"attributes":{},"description":"","properties":{"DevicePermissionRoleArn":"","Devices":"","IntendedForQualification":"","RootGroup":"","SuiteDefinitionName":""}},"AWS::IoTEvents::AlarmModel":{"attributes":{"Ref":"`Ref` returns the name of the alarm model. For example:\\n\\n`{\\"Ref\\": \\"myAlarmModel\\"}`\\n\\nFor the AWS IoT Events alarm model `myAlarmModel` , `Ref` returns the name of the alarm model."},"description":"Represents an alarm model to monitor an AWS IoT Events input attribute. You can use the alarm to get notified when the value is outside a specified range. For more information, see [Create an alarm model](https://docs.aws.amazon.com/iotevents/latest/developerguide/create-alarms.html) in the *AWS IoT Events Developer Guide* .","properties":{"AlarmCapabilities":"Contains the configuration information of alarm state changes.","AlarmEventActions":"Contains information about one or more alarm actions.","AlarmModelDescription":"The description of the alarm model.","AlarmModelName":"The name of the alarm model.","AlarmRule":"Defines when your alarm is invoked.","Key":"An input attribute used as a key to create an alarm. AWS IoT Events routes [inputs](https://docs.aws.amazon.com/iotevents/latest/apireference/API_Input.html) associated with this key to the alarm.","RoleArn":"The ARN of the IAM role that allows the alarm to perform actions and access AWS resources. For more information, see [Amazon Resource Names (ARNs)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *AWS General Reference* .","Severity":"A non-negative integer that reflects the severity level of the alarm.","Tags":"A list of key-value pairs that contain metadata for the alarm model. The tags help you manage the alarm model. For more information, see [Tagging your AWS IoT Events resources](https://docs.aws.amazon.com/iotevents/latest/developerguide/tagging-iotevents.html) in the *AWS IoT Events Developer Guide* .\\n\\nYou can create up to 50 tags for one alarm model."}},"AWS::IoTEvents::AlarmModel.AcknowledgeFlow":{"attributes":{},"description":"Specifies whether to get notified for alarm state changes.","properties":{"Enabled":"The value must be `TRUE` or `FALSE` . If `TRUE` , you receive a notification when the alarm state changes. You must choose to acknowledge the notification before the alarm state can return to `NORMAL` . If `FALSE` , you won\'t receive notifications. The alarm automatically changes to the `NORMAL` state when the input property value returns to the specified range."}},"AWS::IoTEvents::AlarmModel.AlarmAction":{"attributes":{},"description":"Specifies one of the following actions to receive notifications when the alarm state changes.","properties":{"DynamoDB":"Defines an action to write to the Amazon DynamoDB table that you created. The standard action payload contains all the information about the detector model instance and the event that triggered the action. You can customize the [payload](https://docs.aws.amazon.com/iotevents/latest/apireference/API_Payload.html) . One column of the DynamoDB table receives all attribute-value pairs in the payload that you specify.\\n\\nYou must use expressions for all parameters in `DynamoDBAction` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `hashKeyType` parameter can be `\'STRING\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `hashKeyField` parameter can be `$input.GreenhouseInput.name` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `hashKeyValue` parameter uses a substitution template.\\n\\n`\'${$input.GreenhouseInput.temperature * 6 / 5 + 32} in Fahrenheit\'`\\n- For a string concatenation, you must use `+` . A string concatenation can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `tableName` parameter uses a string concatenation.\\n\\n`\'GreenhouseTemperatureTable \' + $input.GreenhouseInput.date`\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .\\n\\nIf the defined payload type is a string, `DynamoDBAction` writes non-JSON data to the DynamoDB table as binary data. The DynamoDB console displays the data as Base64-encoded text. The value for the `payloadField` parameter is `_raw` .","DynamoDBv2":"Defines an action to write to the Amazon DynamoDB table that you created. The default action payload contains all the information about the detector model instance and the event that triggered the action. You can customize the [payload](https://docs.aws.amazon.com/iotevents/latest/apireference/API_Payload.html) . A separate column of the DynamoDB table receives one attribute-value pair in the payload that you specify.\\n\\nYou must use expressions for all parameters in `DynamoDBv2Action` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `tableName` parameter can be `\'GreenhouseTemperatureTable\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `tableName` parameter can be `$variable.ddbtableName` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `contentExpression` parameter in `Payload` uses a substitution template.\\n\\n`\'{\\\\\\"sensorID\\\\\\": \\\\\\"${$input.GreenhouseInput.sensor_id}\\\\\\", \\\\\\"temperature\\\\\\": \\\\\\"${$input.GreenhouseInput.temperature * 9 / 5 + 32}\\\\\\"}\'`\\n- For a string concatenation, you must use `+` . A string concatenation can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `tableName` parameter uses a string concatenation.\\n\\n`\'GreenhouseTemperatureTable \' + $input.GreenhouseInput.date`\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .\\n\\nThe value for the `type` parameter in `Payload` must be `JSON` .","Firehose":"Sends information about the detector model instance and the event that triggered the action to an Amazon Kinesis Data Firehose delivery stream.","IotEvents":"Sends an AWS IoT Events input, passing in information about the detector model instance and the event that triggered the action.","IotSiteWise":"Sends information about the detector model instance and the event that triggered the action to a specified asset property in AWS IoT SiteWise .\\n\\nYou must use expressions for all parameters in `IotSiteWiseAction` . The expressions accept literals, operators, functions, references, and substitutions templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `propertyAlias` parameter can be `\'/company/windfarm/3/turbine/7/temperature\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `assetId` parameter can be `$input.TurbineInput.assetId1` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `propertyAlias` parameter uses a substitution template.\\n\\n`\'company/windfarm/${$input.TemperatureInput.sensorData.windfarmID}/turbine/ ${$input.TemperatureInput.sensorData.turbineID}/temperature\'`\\n\\nYou must specify either `propertyAlias` or both `assetId` and `propertyId` to identify the target asset property in AWS IoT SiteWise .\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .","IotTopicPublish":"Information required to publish the MQTT message through the AWS IoT message broker.","Lambda":"Calls a Lambda function, passing in information about the detector model instance and the event that triggered the action.","Sns":"Information required to publish the Amazon SNS message.","Sqs":"Sends information about the detector model instance and the event that triggered the action to an Amazon SQS queue."}},"AWS::IoTEvents::AlarmModel.AlarmCapabilities":{"attributes":{},"description":"Contains the configuration information of alarm state changes.","properties":{"AcknowledgeFlow":"Specifies whether to get notified for alarm state changes.","InitializationConfiguration":"Specifies the default alarm state. The configuration applies to all alarms that were created based on this alarm model."}},"AWS::IoTEvents::AlarmModel.AlarmEventActions":{"attributes":{},"description":"Contains information about one or more alarm actions.","properties":{"AlarmActions":"Specifies one or more supported actions to receive notifications when the alarm state changes."}},"AWS::IoTEvents::AlarmModel.AlarmRule":{"attributes":{},"description":"Defines when your alarm is invoked.","properties":{"SimpleRule":"A rule that compares an input property value to a threshold value with a comparison operator."}},"AWS::IoTEvents::AlarmModel.AssetPropertyTimestamp":{"attributes":{},"description":"A structure that contains timestamp information. For more information, see [TimeInNanos](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_TimeInNanos.html) in the *AWS IoT SiteWise API Reference* .\\n\\nYou must use expressions for all parameters in `AssetPropertyTimestamp` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `timeInSeconds` parameter can be `\'1586400675\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `offsetInNanos` parameter can be `$variable.time` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `timeInSeconds` parameter uses a substitution template.\\n\\n`\'${$input.TemperatureInput.sensorData.timestamp / 1000}\'`\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .","properties":{"OffsetInNanos":"The nanosecond offset converted from `timeInSeconds` . The valid range is between 0-999999999.","TimeInSeconds":"The timestamp, in seconds, in the Unix epoch format. The valid range is between 1-31556889864403199."}},"AWS::IoTEvents::AlarmModel.AssetPropertyValue":{"attributes":{},"description":"A structure that contains value information. For more information, see [AssetPropertyValue](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_AssetPropertyValue.html) in the *AWS IoT SiteWise API Reference* .\\n\\nYou must use expressions for all parameters in `AssetPropertyValue` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `quality` parameter can be `\'GOOD\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `quality` parameter can be `$input.TemperatureInput.sensorData.quality` .\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .","properties":{"Quality":"The quality of the asset property value. The value must be `\'GOOD\'` , `\'BAD\'` , or `\'UNCERTAIN\'` .","Timestamp":"The timestamp associated with the asset property value. The default is the current event time.","Value":"The value to send to an asset property."}},"AWS::IoTEvents::AlarmModel.AssetPropertyVariant":{"attributes":{},"description":"A structure that contains an asset property value. For more information, see [Variant](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_Variant.html) in the *AWS IoT SiteWise API Reference* .\\n\\nYou must use expressions for all parameters in `AssetPropertyVariant` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `integerValue` parameter can be `\'100\'` .\\n- For references, you must specify either variables or parameters. For example, the value for the `booleanValue` parameter can be `$variable.offline` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `doubleValue` parameter uses a substitution template.\\n\\n`\'${$input.TemperatureInput.sensorData.temperature * 6 / 5 + 32}\'`\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .\\n\\nYou must specify one of the following value types, depending on the `dataType` of the specified asset property. For more information, see [AssetProperty](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_AssetProperty.html) in the *AWS IoT SiteWise API Reference* .","properties":{"BooleanValue":"The asset property value is a Boolean value that must be `\'TRUE\'` or `\'FALSE\'` . You must use an expression, and the evaluated result should be a Boolean value.","DoubleValue":"The asset property value is a double. You must use an expression, and the evaluated result should be a double.","IntegerValue":"The asset property value is an integer. You must use an expression, and the evaluated result should be an integer.","StringValue":"The asset property value is a string. You must use an expression, and the evaluated result should be a string."}},"AWS::IoTEvents::AlarmModel.DynamoDB":{"attributes":{},"description":"Defines an action to write to the Amazon DynamoDB table that you created. The standard action payload contains all the information about the detector model instance and the event that triggered the action. You can customize the [payload](https://docs.aws.amazon.com/iotevents/latest/apireference/API_Payload.html) . One column of the DynamoDB table receives all attribute-value pairs in the payload that you specify.\\n\\nYou must use expressions for all parameters in `DynamoDBAction` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `hashKeyType` parameter can be `\'STRING\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `hashKeyField` parameter can be `$input.GreenhouseInput.name` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `hashKeyValue` parameter uses a substitution template.\\n\\n`\'${$input.GreenhouseInput.temperature * 6 / 5 + 32} in Fahrenheit\'`\\n- For a string concatenation, you must use `+` . A string concatenation can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `tableName` parameter uses a string concatenation.\\n\\n`\'GreenhouseTemperatureTable \' + $input.GreenhouseInput.date`\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .\\n\\nIf the defined payload type is a string, `DynamoDBAction` writes non-JSON data to the DynamoDB table as binary data. The DynamoDB console displays the data as Base64-encoded text. The value for the `payloadField` parameter is `_raw` .","properties":{"HashKeyField":"The name of the hash key (also called the partition key). The `hashKeyField` value must match the partition key of the target DynamoDB table.","HashKeyType":"The data type for the hash key (also called the partition key). You can specify the following values:\\n\\n- `\'STRING\'` - The hash key is a string.\\n- `\'NUMBER\'` - The hash key is a number.\\n\\nIf you don\'t specify `hashKeyType` , the default value is `\'STRING\'` .","HashKeyValue":"The value of the hash key (also called the partition key).","Operation":"The type of operation to perform. You can specify the following values:\\n\\n- `\'INSERT\'` - Insert data as a new item into the DynamoDB table. This item uses the specified hash key as a partition key. If you specified a range key, the item uses the range key as a sort key.\\n- `\'UPDATE\'` - Update an existing item of the DynamoDB table with new data. This item\'s partition key must match the specified hash key. If you specified a range key, the range key must match the item\'s sort key.\\n- `\'DELETE\'` - Delete an existing item of the DynamoDB table. This item\'s partition key must match the specified hash key. If you specified a range key, the range key must match the item\'s sort key.\\n\\nIf you don\'t specify this parameter, AWS IoT Events triggers the `\'INSERT\'` operation.","Payload":"Information needed to configure the payload.\\n\\nBy default, AWS IoT Events generates a standard payload in JSON for any action. This action payload contains all attribute-value pairs that have the information about the detector model instance and the event triggered the action. To configure the action payload, you can use `contentExpression` .","PayloadField":"The name of the DynamoDB column that receives the action payload.\\n\\nIf you don\'t specify this parameter, the name of the DynamoDB column is `payload` .","RangeKeyField":"The name of the range key (also called the sort key). The `rangeKeyField` value must match the sort key of the target DynamoDB table.","RangeKeyType":"The data type for the range key (also called the sort key), You can specify the following values:\\n\\n- `\'STRING\'` - The range key is a string.\\n- `\'NUMBER\'` - The range key is number.\\n\\nIf you don\'t specify `rangeKeyField` , the default value is `\'STRING\'` .","RangeKeyValue":"The value of the range key (also called the sort key).","TableName":"The name of the DynamoDB table. The `tableName` value must match the table name of the target DynamoDB table."}},"AWS::IoTEvents::AlarmModel.DynamoDBv2":{"attributes":{},"description":"Defines an action to write to the Amazon DynamoDB table that you created. The default action payload contains all the information about the detector model instance and the event that triggered the action. You can customize the [payload](https://docs.aws.amazon.com/iotevents/latest/apireference/API_Payload.html) . A separate column of the DynamoDB table receives one attribute-value pair in the payload that you specify.\\n\\nYou must use expressions for all parameters in `DynamoDBv2Action` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `tableName` parameter can be `\'GreenhouseTemperatureTable\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `tableName` parameter can be `$variable.ddbtableName` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `contentExpression` parameter in `Payload` uses a substitution template.\\n\\n`\'{\\\\\\"sensorID\\\\\\": \\\\\\"${$input.GreenhouseInput.sensor_id}\\\\\\", \\\\\\"temperature\\\\\\": \\\\\\"${$input.GreenhouseInput.temperature * 9 / 5 + 32}\\\\\\"}\'`\\n- For a string concatenation, you must use `+` . A string concatenation can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `tableName` parameter uses a string concatenation.\\n\\n`\'GreenhouseTemperatureTable \' + $input.GreenhouseInput.date`\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .\\n\\nThe value for the `type` parameter in `Payload` must be `JSON` .","properties":{"Payload":"Information needed to configure the payload.\\n\\nBy default, AWS IoT Events generates a standard payload in JSON for any action. This action payload contains all attribute-value pairs that have the information about the detector model instance and the event triggered the action. To configure the action payload, you can use `contentExpression` .","TableName":"The name of the DynamoDB table."}},"AWS::IoTEvents::AlarmModel.Firehose":{"attributes":{},"description":"Sends information about the detector model instance and the event that triggered the action to an Amazon Kinesis Data Firehose delivery stream.","properties":{"DeliveryStreamName":"The name of the Kinesis Data Firehose delivery stream where the data is written.","Payload":"You can configure the action payload when you send a message to an Amazon Kinesis Data Firehose delivery stream.","Separator":"A character separator that is used to separate records written to the Kinesis Data Firehose delivery stream. Valid values are: \'\\\\n\' (newline), \'\\\\t\' (tab), \'\\\\r\\\\n\' (Windows newline), \',\' (comma)."}},"AWS::IoTEvents::AlarmModel.InitializationConfiguration":{"attributes":{},"description":"Specifies the default alarm state. The configuration applies to all alarms that were created based on this alarm model.","properties":{"DisabledOnInitialization":"The value must be `TRUE` or `FALSE` . If `FALSE` , all alarm instances created based on the alarm model are activated. The default value is `TRUE` ."}},"AWS::IoTEvents::AlarmModel.IotEvents":{"attributes":{},"description":"Sends an AWS IoT Events input, passing in information about the detector model instance and the event that triggered the action.","properties":{"InputName":"The name of the AWS IoT Events input where the data is sent.","Payload":"You can configure the action payload when you send a message to an AWS IoT Events input."}},"AWS::IoTEvents::AlarmModel.IotSiteWise":{"attributes":{},"description":"Sends information about the detector model instance and the event that triggered the action to a specified asset property in AWS IoT SiteWise .\\n\\nYou must use expressions for all parameters in `IotSiteWiseAction` . The expressions accept literals, operators, functions, references, and substitutions templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `propertyAlias` parameter can be `\'/company/windfarm/3/turbine/7/temperature\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `assetId` parameter can be `$input.TurbineInput.assetId1` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `propertyAlias` parameter uses a substitution template.\\n\\n`\'company/windfarm/${$input.TemperatureInput.sensorData.windfarmID}/turbine/ ${$input.TemperatureInput.sensorData.turbineID}/temperature\'`\\n\\nYou must specify either `propertyAlias` or both `assetId` and `propertyId` to identify the target asset property in AWS IoT SiteWise .\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .","properties":{"AssetId":"The ID of the asset that has the specified property.","EntryId":"A unique identifier for this entry. You can use the entry ID to track which data entry causes an error in case of failure. The default is a new unique identifier.","PropertyAlias":"The alias of the asset property.","PropertyId":"The ID of the asset property.","PropertyValue":"The value to send to the asset property. This value contains timestamp, quality, and value (TQV) information."}},"AWS::IoTEvents::AlarmModel.IotTopicPublish":{"attributes":{},"description":"Information required to publish the MQTT message through the AWS IoT message broker.","properties":{"MqttTopic":"The MQTT topic of the message. You can use a string expression that includes variables ( `$variable.` ) and input values ( `$input..` ) as the topic string.","Payload":"You can configure the action payload when you publish a message to an AWS IoT Core topic."}},"AWS::IoTEvents::AlarmModel.Lambda":{"attributes":{},"description":"Calls a Lambda function, passing in information about the detector model instance and the event that triggered the action.","properties":{"FunctionArn":"The ARN of the Lambda function that is executed.","Payload":"You can configure the action payload when you send a message to a Lambda function."}},"AWS::IoTEvents::AlarmModel.Payload":{"attributes":{},"description":"Information needed to configure the payload.\\n\\nBy default, AWS IoT Events generates a standard payload in JSON for any action. This action payload contains all attribute-value pairs that have the information about the detector model instance and the event triggered the action. To configure the action payload, you can use `contentExpression` .","properties":{"ContentExpression":"The content of the payload. You can use a string expression that includes quoted strings ( `\'\'` ), variables ( `$variable.` ), input values ( `$input..` ), string concatenations, and quoted strings that contain `${}` as the content. The recommended maximum size of a content expression is 1 KB.","Type":"The value of the payload type can be either `STRING` or `JSON` ."}},"AWS::IoTEvents::AlarmModel.SimpleRule":{"attributes":{},"description":"A rule that compares an input property value to a threshold value with a comparison operator.","properties":{"ComparisonOperator":"The comparison operator.","InputProperty":"The value on the left side of the comparison operator. You can specify an AWS IoT Events input attribute as an input property.","Threshold":"The value on the right side of the comparison operator. You can enter a number or specify an AWS IoT Events input attribute."}},"AWS::IoTEvents::AlarmModel.Sns":{"attributes":{},"description":"Information required to publish the Amazon SNS message.","properties":{"Payload":"You can configure the action payload when you send a message as an Amazon SNS push notification.","TargetArn":"The ARN of the Amazon SNS target where the message is sent."}},"AWS::IoTEvents::AlarmModel.Sqs":{"attributes":{},"description":"Sends information about the detector model instance and the event that triggered the action to an Amazon SQS queue.","properties":{"Payload":"You can configure the action payload when you send a message to an Amazon SQS queue.","QueueUrl":"The URL of the SQS queue where the data is written.","UseBase64":"Set this to TRUE if you want the data to be base-64 encoded before it is written to the queue. Otherwise, set this to FALSE."}},"AWS::IoTEvents::DetectorModel":{"attributes":{"Ref":"`Ref` returns the name of the detector model. For example:\\n\\n`{\\"Ref\\": \\"myDetectorModel\\"}`\\n\\nFor the AWS IoT Events detector model `myDetectorModel` , `Ref` returns the name of the detector model."},"description":"The AWS::IoTEvents::DetectorModel resource creates a detector model. You create a *detector model* (a model of your equipment or process) using *states* . For each state, you define conditional (Boolean) logic that evaluates the incoming inputs to detect significant events. When an event is detected, it can change the state or trigger custom-built or predefined actions using other AWS services. You can define additional events that trigger actions when entering or exiting a state and, optionally, when a condition is met. For more information, see [How to Use AWS IoT Events](https://docs.aws.amazon.com/iotevents/latest/developerguide/how-to-use-iotevents.html) in the *AWS IoT Events Developer Guide* .\\n\\n> When you successfully update a detector model (using the AWS IoT Events console, AWS IoT Events API or CLI commands, or AWS CloudFormation ) all detector instances created by the model are reset to their initial states. (The detector\'s `state` , and the values of any variables and timers are reset.)\\n> \\n> When you successfully update a detector model (using the AWS IoT Events console, AWS IoT Events API or CLI commands, or AWS CloudFormation ) the version number of the detector model is incremented. (A detector model with version number 1 before the update has version number 2 after the update succeeds.)\\n> \\n> If you attempt to update a detector model using AWS CloudFormation and the update does not succeed, the system may, in some cases, restore the original detector model. When this occurs, the detector model\'s version is incremented twice (for example, from version 1 to version 3) and the detector instances are reset.\\n> \\n> Also, be aware that if you attempt to update several detector models at once using AWS CloudFormation , some updates may succeed and others fail. In this case, the effects on each detector model\'s detector instances and version number depend on whether the update succeeded or failed, with the results as stated.","properties":{"DetectorModelDefinition":"Information that defines how a detector operates.","DetectorModelDescription":"A brief description of the detector model.","DetectorModelName":"The name of the detector model.","EvaluationMethod":"Information about the order in which events are evaluated and how actions are executed.","Key":"The value used to identify a detector instance. When a device or system sends input, a new detector instance with a unique key value is created. AWS IoT Events can continue to route input to its corresponding detector instance based on this identifying information.\\n\\nThis parameter uses a JSON-path expression to select the attribute-value pair in the message payload that is used for identification. To route the message to the correct detector instance, the device must send a message payload that contains the same attribute-value.","RoleArn":"The ARN of the role that grants permission to AWS IoT Events to perform its operations.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::IoTEvents::DetectorModel.Action":{"attributes":{},"description":"An action to be performed when the `condition` is TRUE.","properties":{"ClearTimer":"Information needed to clear the timer.","DynamoDB":"Writes to the DynamoDB table that you created. The default action payload contains all attribute-value pairs that have the information about the detector model instance and the event that triggered the action. You can customize the [payload](https://docs.aws.amazon.com/iotevents/latest/apireference/API_Payload.html) . One column of the DynamoDB table receives all attribute-value pairs in the payload that you specify. For more information, see [Actions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-event-actions.html) in *AWS IoT Events Developer Guide* .","DynamoDBv2":"Writes to the DynamoDB table that you created. The default action payload contains all attribute-value pairs that have the information about the detector model instance and the event that triggered the action. You can customize the [payload](https://docs.aws.amazon.com/iotevents/latest/apireference/API_Payload.html) . A separate column of the DynamoDB table receives one attribute-value pair in the payload that you specify. For more information, see [Actions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-event-actions.html) in *AWS IoT Events Developer Guide* .","Firehose":"Sends information about the detector model instance and the event that triggered the action to an Amazon Kinesis Data Firehose delivery stream.","IotEvents":"Sends AWS IoT Events input, which passes information about the detector model instance and the event that triggered the action.","IotSiteWise":"Sends information about the detector model instance and the event that triggered the action to an asset property in AWS IoT SiteWise .","IotTopicPublish":"Publishes an MQTT message with the given topic to the AWS IoT message broker.","Lambda":"Calls a Lambda function, passing in information about the detector model instance and the event that triggered the action.","ResetTimer":"Information needed to reset the timer.","SetTimer":"Information needed to set the timer.","SetVariable":"Sets a variable to a specified value.","Sns":"Sends an Amazon SNS message.","Sqs":"Sends an Amazon SNS message."}},"AWS::IoTEvents::DetectorModel.AssetPropertyTimestamp":{"attributes":{},"description":"A structure that contains timestamp information. For more information, see [TimeInNanos](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_TimeInNanos.html) in the *AWS IoT SiteWise API Reference* .\\n\\nYou must use expressions for all parameters in `AssetPropertyTimestamp` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `timeInSeconds` parameter can be `\'1586400675\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `offsetInNanos` parameter can be `$variable.time` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `timeInSeconds` parameter uses a substitution template.\\n\\n`\'${$input.TemperatureInput.sensorData.timestamp / 1000}\'`\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .","properties":{"OffsetInNanos":"The nanosecond offset converted from `timeInSeconds` . The valid range is between 0-999999999.","TimeInSeconds":"The timestamp, in seconds, in the Unix epoch format. The valid range is between 1-31556889864403199."}},"AWS::IoTEvents::DetectorModel.AssetPropertyValue":{"attributes":{},"description":"A structure that contains value information. For more information, see [AssetPropertyValue](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_AssetPropertyValue.html) in the *AWS IoT SiteWise API Reference* .\\n\\nYou must use expressions for all parameters in `AssetPropertyValue` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `quality` parameter can be `\'GOOD\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `quality` parameter can be `$input.TemperatureInput.sensorData.quality` .\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .","properties":{"Quality":"The quality of the asset property value. The value must be `\'GOOD\'` , `\'BAD\'` , or `\'UNCERTAIN\'` .","Timestamp":"The timestamp associated with the asset property value. The default is the current event time.","Value":"The value to send to an asset property."}},"AWS::IoTEvents::DetectorModel.AssetPropertyVariant":{"attributes":{},"description":"A structure that contains an asset property value. For more information, see [Variant](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_Variant.html) in the *AWS IoT SiteWise API Reference* .\\n\\nYou must use expressions for all parameters in `AssetPropertyVariant` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `integerValue` parameter can be `\'100\'` .\\n- For references, you must specify either variables or parameters. For example, the value for the `booleanValue` parameter can be `$variable.offline` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `doubleValue` parameter uses a substitution template.\\n\\n`\'${$input.TemperatureInput.sensorData.temperature * 6 / 5 + 32}\'`\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .\\n\\nYou must specify one of the following value types, depending on the `dataType` of the specified asset property. For more information, see [AssetProperty](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_AssetProperty.html) in the *AWS IoT SiteWise API Reference* .","properties":{"BooleanValue":"The asset property value is a Boolean value that must be `\'TRUE\'` or `\'FALSE\'` . You must use an expression, and the evaluated result should be a Boolean value.","DoubleValue":"The asset property value is a double. You must use an expression, and the evaluated result should be a double.","IntegerValue":"The asset property value is an integer. You must use an expression, and the evaluated result should be an integer.","StringValue":"The asset property value is a string. You must use an expression, and the evaluated result should be a string."}},"AWS::IoTEvents::DetectorModel.ClearTimer":{"attributes":{},"description":"Information needed to clear the timer.","properties":{"TimerName":"The name of the timer to clear."}},"AWS::IoTEvents::DetectorModel.DetectorModelDefinition":{"attributes":{},"description":"Information that defines how a detector operates.","properties":{"InitialStateName":"The state that is entered at the creation of each detector (instance).","States":"Information about the states of the detector."}},"AWS::IoTEvents::DetectorModel.DynamoDB":{"attributes":{},"description":"Defines an action to write to the Amazon DynamoDB table that you created. The standard action payload contains all the information about the detector model instance and the event that triggered the action. You can customize the [payload](https://docs.aws.amazon.com/iotevents/latest/apireference/API_Payload.html) . One column of the DynamoDB table receives all attribute-value pairs in the payload that you specify.\\n\\nYou must use expressions for all parameters in `DynamoDBAction` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `hashKeyType` parameter can be `\'STRING\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `hashKeyField` parameter can be `$input.GreenhouseInput.name` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `hashKeyValue` parameter uses a substitution template.\\n\\n`\'${$input.GreenhouseInput.temperature * 6 / 5 + 32} in Fahrenheit\'`\\n- For a string concatenation, you must use `+` . A string concatenation can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `tableName` parameter uses a string concatenation.\\n\\n`\'GreenhouseTemperatureTable \' + $input.GreenhouseInput.date`\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .\\n\\nIf the defined payload type is a string, `DynamoDBAction` writes non-JSON data to the DynamoDB table as binary data. The DynamoDB console displays the data as Base64-encoded text. The value for the `payloadField` parameter is `_raw` .","properties":{"HashKeyField":"The name of the hash key (also called the partition key). The `hashKeyField` value must match the partition key of the target DynamoDB table.","HashKeyType":"The data type for the hash key (also called the partition key). You can specify the following values:\\n\\n- `\'STRING\'` - The hash key is a string.\\n- `\'NUMBER\'` - The hash key is a number.\\n\\nIf you don\'t specify `hashKeyType` , the default value is `\'STRING\'` .","HashKeyValue":"The value of the hash key (also called the partition key).","Operation":"The type of operation to perform. You can specify the following values:\\n\\n- `\'INSERT\'` - Insert data as a new item into the DynamoDB table. This item uses the specified hash key as a partition key. If you specified a range key, the item uses the range key as a sort key.\\n- `\'UPDATE\'` - Update an existing item of the DynamoDB table with new data. This item\'s partition key must match the specified hash key. If you specified a range key, the range key must match the item\'s sort key.\\n- `\'DELETE\'` - Delete an existing item of the DynamoDB table. This item\'s partition key must match the specified hash key. If you specified a range key, the range key must match the item\'s sort key.\\n\\nIf you don\'t specify this parameter, AWS IoT Events triggers the `\'INSERT\'` operation.","Payload":"Information needed to configure the payload.\\n\\nBy default, AWS IoT Events generates a standard payload in JSON for any action. This action payload contains all attribute-value pairs that have the information about the detector model instance and the event triggered the action. To configure the action payload, you can use `contentExpression` .","PayloadField":"The name of the DynamoDB column that receives the action payload.\\n\\nIf you don\'t specify this parameter, the name of the DynamoDB column is `payload` .","RangeKeyField":"The name of the range key (also called the sort key). The `rangeKeyField` value must match the sort key of the target DynamoDB table.","RangeKeyType":"The data type for the range key (also called the sort key), You can specify the following values:\\n\\n- `\'STRING\'` - The range key is a string.\\n- `\'NUMBER\'` - The range key is number.\\n\\nIf you don\'t specify `rangeKeyField` , the default value is `\'STRING\'` .","RangeKeyValue":"The value of the range key (also called the sort key).","TableName":"The name of the DynamoDB table. The `tableName` value must match the table name of the target DynamoDB table."}},"AWS::IoTEvents::DetectorModel.DynamoDBv2":{"attributes":{},"description":"Defines an action to write to the Amazon DynamoDB table that you created. The default action payload contains all the information about the detector model instance and the event that triggered the action. You can customize the [payload](https://docs.aws.amazon.com/iotevents/latest/apireference/API_Payload.html) . A separate column of the DynamoDB table receives one attribute-value pair in the payload that you specify.\\n\\nYou must use expressions for all parameters in `DynamoDBv2Action` . The expressions accept literals, operators, functions, references, and substitution templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `tableName` parameter can be `\'GreenhouseTemperatureTable\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `tableName` parameter can be `$variable.ddbtableName` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `contentExpression` parameter in `Payload` uses a substitution template.\\n\\n`\'{\\\\\\"sensorID\\\\\\": \\\\\\"${$input.GreenhouseInput.sensor_id}\\\\\\", \\\\\\"temperature\\\\\\": \\\\\\"${$input.GreenhouseInput.temperature * 9 / 5 + 32}\\\\\\"}\'`\\n- For a string concatenation, you must use `+` . A string concatenation can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `tableName` parameter uses a string concatenation.\\n\\n`\'GreenhouseTemperatureTable \' + $input.GreenhouseInput.date`\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .\\n\\nThe value for the `type` parameter in `Payload` must be `JSON` .","properties":{"Payload":"Information needed to configure the payload.\\n\\nBy default, AWS IoT Events generates a standard payload in JSON for any action. This action payload contains all attribute-value pairs that have the information about the detector model instance and the event triggered the action. To configure the action payload, you can use `contentExpression` .","TableName":"The name of the DynamoDB table."}},"AWS::IoTEvents::DetectorModel.Event":{"attributes":{},"description":"Specifies the `actions` to be performed when the `condition` evaluates to TRUE.","properties":{"Actions":"The actions to be performed.","Condition":"Optional. The Boolean expression that, when TRUE, causes the `actions` to be performed. If not present, the actions are performed (=TRUE). If the expression result is not a Boolean value, the actions are not performed (=FALSE).","EventName":"The name of the event."}},"AWS::IoTEvents::DetectorModel.Firehose":{"attributes":{},"description":"Sends information about the detector model instance and the event that triggered the action to an Amazon Kinesis Data Firehose delivery stream.","properties":{"DeliveryStreamName":"The name of the Kinesis Data Firehose delivery stream where the data is written.","Payload":"You can configure the action payload when you send a message to an Amazon Kinesis Data Firehose delivery stream.","Separator":"A character separator that is used to separate records written to the Kinesis Data Firehose delivery stream. Valid values are: \'\\\\n\' (newline), \'\\\\t\' (tab), \'\\\\r\\\\n\' (Windows newline), \',\' (comma)."}},"AWS::IoTEvents::DetectorModel.IotEvents":{"attributes":{},"description":"Sends an AWS IoT Events input, passing in information about the detector model instance and the event that triggered the action.","properties":{"InputName":"The name of the AWS IoT Events input where the data is sent.","Payload":"You can configure the action payload when you send a message to an AWS IoT Events input."}},"AWS::IoTEvents::DetectorModel.IotSiteWise":{"attributes":{},"description":"Sends information about the detector model instance and the event that triggered the action to a specified asset property in AWS IoT SiteWise .\\n\\nYou must use expressions for all parameters in `IotSiteWiseAction` . The expressions accept literals, operators, functions, references, and substitutions templates.\\n\\n**Examples** - For literal values, the expressions must contain single quotes. For example, the value for the `propertyAlias` parameter can be `\'/company/windfarm/3/turbine/7/temperature\'` .\\n- For references, you must specify either variables or input values. For example, the value for the `assetId` parameter can be `$input.TurbineInput.assetId1` .\\n- For a substitution template, you must use `${}` , and the template must be in single quotes. A substitution template can also contain a combination of literals, operators, functions, references, and substitution templates.\\n\\nIn the following example, the value for the `propertyAlias` parameter uses a substitution template.\\n\\n`\'company/windfarm/${$input.TemperatureInput.sensorData.windfarmID}/turbine/ ${$input.TemperatureInput.sensorData.turbineID}/temperature\'`\\n\\nYou must specify either `propertyAlias` or both `assetId` and `propertyId` to identify the target asset property in AWS IoT SiteWise .\\n\\nFor more information, see [Expressions](https://docs.aws.amazon.com/iotevents/latest/developerguide/iotevents-expressions.html) in the *AWS IoT Events Developer Guide* .","properties":{"AssetId":"The ID of the asset that has the specified property.","EntryId":"A unique identifier for this entry. You can use the entry ID to track which data entry causes an error in case of failure. The default is a new unique identifier.","PropertyAlias":"The alias of the asset property.","PropertyId":"The ID of the asset property.","PropertyValue":"The value to send to the asset property. This value contains timestamp, quality, and value (TQV) information."}},"AWS::IoTEvents::DetectorModel.IotTopicPublish":{"attributes":{},"description":"Information required to publish the MQTT message through the AWS IoT message broker.","properties":{"MqttTopic":"The MQTT topic of the message. You can use a string expression that includes variables ( `$variable.` ) and input values ( `$input..` ) as the topic string.","Payload":"You can configure the action payload when you publish a message to an AWS IoT Core topic."}},"AWS::IoTEvents::DetectorModel.Lambda":{"attributes":{},"description":"Calls a Lambda function, passing in information about the detector model instance and the event that triggered the action.","properties":{"FunctionArn":"The ARN of the Lambda function that is executed.","Payload":"You can configure the action payload when you send a message to a Lambda function."}},"AWS::IoTEvents::DetectorModel.OnEnter":{"attributes":{},"description":"When entering this state, perform these `actions` if the `condition` is TRUE.","properties":{"Events":"Specifies the actions that are performed when the state is entered and the `condition` is `TRUE` ."}},"AWS::IoTEvents::DetectorModel.OnExit":{"attributes":{},"description":"When exiting this state, perform these `actions` if the specified `condition` is `TRUE` .","properties":{"Events":"Specifies the `actions` that are performed when the state is exited and the `condition` is `TRUE` ."}},"AWS::IoTEvents::DetectorModel.OnInput":{"attributes":{},"description":"Specifies the actions performed when the `condition` evaluates to TRUE.","properties":{"Events":"Specifies the actions performed when the `condition` evaluates to TRUE.","TransitionEvents":"Specifies the actions performed, and the next state entered, when a `condition` evaluates to TRUE."}},"AWS::IoTEvents::DetectorModel.Payload":{"attributes":{},"description":"Information needed to configure the payload.\\n\\nBy default, AWS IoT Events generates a standard payload in JSON for any action. This action payload contains all attribute-value pairs that have the information about the detector model instance and the event triggered the action. To configure the action payload, you can use `contentExpression` .","properties":{"ContentExpression":"The content of the payload. You can use a string expression that includes quoted strings ( `\'\'` ), variables ( `$variable.` ), input values ( `$input..` ), string concatenations, and quoted strings that contain `${}` as the content. The recommended maximum size of a content expression is 1 KB.","Type":"The value of the payload type can be either `STRING` or `JSON` ."}},"AWS::IoTEvents::DetectorModel.ResetTimer":{"attributes":{},"description":"Information required to reset the timer. The timer is reset to the previously evaluated result of the duration. The duration expression isn\'t reevaluated when you reset the timer.","properties":{"TimerName":"The name of the timer to reset."}},"AWS::IoTEvents::DetectorModel.SetTimer":{"attributes":{},"description":"Information needed to set the timer.","properties":{"DurationExpression":"The duration of the timer, in seconds. You can use a string expression that includes numbers, variables ( `$variable.` ), and input values ( `$input..` ) as the duration. The range of the duration is 1-31622400 seconds. To ensure accuracy, the minimum duration is 60 seconds. The evaluated result of the duration is rounded down to the nearest whole number.","Seconds":"The number of seconds until the timer expires. The minimum value is 60 seconds to ensure accuracy. The maximum value is 31622400 seconds.","TimerName":"The name of the timer."}},"AWS::IoTEvents::DetectorModel.SetVariable":{"attributes":{},"description":"Information about the variable and its new value.","properties":{"Value":"The new value of the variable.","VariableName":"The name of the variable."}},"AWS::IoTEvents::DetectorModel.Sns":{"attributes":{},"description":"Information required to publish the Amazon SNS message.","properties":{"Payload":"You can configure the action payload when you send a message as an Amazon SNS push notification.","TargetArn":"The ARN of the Amazon SNS target where the message is sent."}},"AWS::IoTEvents::DetectorModel.Sqs":{"attributes":{},"description":"Sends information about the detector model instance and the event that triggered the action to an Amazon SQS queue.","properties":{"Payload":"You can configure the action payload when you send a message to an Amazon SQS queue.","QueueUrl":"The URL of the SQS queue where the data is written.","UseBase64":"Set this to TRUE if you want the data to be base-64 encoded before it is written to the queue. Otherwise, set this to FALSE."}},"AWS::IoTEvents::DetectorModel.State":{"attributes":{},"description":"Information that defines a state of a detector.","properties":{"OnEnter":"When entering this state, perform these `actions` if the `condition` is TRUE.","OnExit":"When exiting this state, perform these `actions` if the specified `condition` is `TRUE` .","OnInput":"When an input is received and the `condition` is TRUE, perform the specified `actions` .","StateName":"The name of the state."}},"AWS::IoTEvents::DetectorModel.TransitionEvent":{"attributes":{},"description":"Specifies the actions performed and the next state entered when a `condition` evaluates to TRUE.","properties":{"Actions":"The actions to be performed.","Condition":"Required. A Boolean expression that when TRUE causes the actions to be performed and the `nextState` to be entered.","EventName":"The name of the transition event.","NextState":"The next state to enter."}},"AWS::IoTEvents::Input":{"attributes":{"Ref":"`Ref` returns the name of the input. For example:\\n\\n`{\\"Ref\\": \\"myInput\\"}`\\n\\nFor the AWS IoT Events input `myInput` , `Ref` returns the name of the input."},"description":"The AWS::IoTEvents::Input resource creates an input. To monitor your devices and processes, they must have a way to get telemetry data into AWS IoT Events . This is done by sending messages as *inputs* to AWS IoT Events . For more information, see [How to Use AWS IoT Events](https://docs.aws.amazon.com/iotevents/latest/developerguide/how-to-use-iotevents.html) in the *AWS IoT Events Developer Guide* .","properties":{"InputDefinition":"The definition of the input.","InputDescription":"A brief description of the input.","InputName":"The name of the input.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::IoTEvents::Input.Attribute":{"attributes":{},"description":"The attributes from the JSON payload that are made available by the input. Inputs are derived from messages sent to the AWS IoT Events system using `BatchPutMessage` . Each such message contains a JSON payload. Those attributes (and their paired values) specified here are available for use in the `condition` expressions used by detectors.","properties":{"JsonPath":"An expression that specifies an attribute-value pair in a JSON structure. Use this to specify an attribute from the JSON payload that is made available by the input. Inputs are derived from messages sent to AWS IoT Events ( `BatchPutMessage` ). Each such message contains a JSON payload. The attribute (and its paired value) specified here are available for use in the `condition` expressions used by detectors.\\n\\nSyntax: `....`"}},"AWS::IoTEvents::Input.InputDefinition":{"attributes":{},"description":"The definition of the input.","properties":{"Attributes":"The attributes from the JSON payload that are made available by the input. Inputs are derived from messages sent to the AWS IoT Events system using `BatchPutMessage` . Each such message contains a JSON payload, and those attributes (and their paired values) specified here are available for use in the `condition` expressions used by detectors that monitor this input."}},"AWS::IoTFleetHub::Application":{"attributes":{"ApplicationArn":"The ARN of the web application.","ApplicationCreationDate":"The date (in Unix epoch time) when the web application was created.","ApplicationId":"The unique Id of the web application.","ApplicationLastUpdateDate":"The date (in Unix epoch time) when the web application was last updated.","ApplicationState":"The current state of the web application.","ApplicationUrl":"The URL of the web application.","ErrorMessage":"A message that explains any failures included in the applicationState response field. This message explains failures in the `CreateApplication` and `DeleteApplication` actions.","Ref":"When you pass the logical ID of this resource to the intrinsic Ref function, Ref returns the application ID.","SsoClientId":"The Id of the single sign-on client that you use to authenticate and authorize users on the web application."},"description":"Represents a Fleet Hub for AWS IoT Device Management web application.","properties":{"ApplicationDescription":"An optional description of the web application.","ApplicationName":"The name of the web application.","RoleArn":"The ARN of the role that the web application assumes when it interacts with AWS IoT Core .\\n\\n> The name of the role must be in the form `FleetHub_random_string` . \\n\\nPattern: `^arn:[!-~]+$`","Tags":"A set of key/value pairs that you can use to manage the web application resource."}},"AWS::IoTFleetWise::Campaign":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the campaign.","CreationTime":"The time the campaign was created in seconds since epoch (January 1, 1970 at midnight UTC time).","LastModificationTime":"The last time the campaign was modified.","Ref":"`Ref` returns the Name.","Status":"The state of the campaign. The status can be one of: `CREATING` , `WAITING_FOR_APPROVAL` , `RUNNING` , and `SUSPENDED` ."},"description":"Creates an orchestration of data collection rules. The AWS IoT FleetWise Edge Agent software running in vehicles uses campaigns to decide how to collect and transfer data to the cloud. You create campaigns in the cloud. After you or your team approve campaigns, AWS IoT FleetWise automatically deploys them to vehicles.\\n\\nFor more information, see [Collect and transfer data with campaigns](https://docs.aws.amazon.com/iot-fleetwise/latest/developerguide/campaigns.html) in the *AWS IoT FleetWise Developer Guide* .","properties":{"Action":"Specifies how to update a campaign. The action can be one of the following:\\n\\n- `APPROVE` - To approve delivering a data collection scheme to vehicles.\\n- `SUSPEND` - To suspend collecting signal data. The campaign is deleted from vehicles and all vehicles in the suspended campaign will stop sending data.\\n- `RESUME` - To reactivate the `SUSPEND` campaign. The campaign is redeployed to all vehicles and the vehicles will resume sending data.\\n- `UPDATE` - To update a campaign.","CollectionScheme":"The data collection scheme associated with the campaign. You can specify a scheme that collects data based on time or an event.","Compression":"(Optional) Whether to compress signals before transmitting data to AWS IoT FleetWise . If you don\'t want to compress the signals, use `OFF` . If it\'s not specified, `SNAPPY` is used.\\n\\nDefault: `SNAPPY`","DataDestinationConfigs":"(Optional) The destination where the campaign sends data. You can choose to send data to be stored in Amazon S3 or Amazon Timestream .\\n\\nAmazon S3 optimizes the cost of data storage and provides additional mechanisms to use vehicle data, such as data lakes, centralized data storage, data processing pipelines, and analytics. AWS IoT FleetWise supports at-least-once file delivery to S3. Your vehicle data is stored on multiple AWS IoT FleetWise servers for redundancy and high availability.\\n\\nYou can use Amazon Timestream to access and analyze time series data, and Timestream to query vehicle data so that you can identify trends and patterns.","DataExtraDimensions":"(Optional) A list of vehicle attributes to associate with a campaign.\\n\\nEnrich the data with specified vehicle attributes. For example, add `make` and `model` to the campaign, and AWS IoT FleetWise will associate the data with those attributes as dimensions in Amazon Timestream . You can then query the data against `make` and `model` .\\n\\nDefault: An empty array","Description":"(Optional) The description of the campaign.","DiagnosticsMode":"(Optional) Option for a vehicle to send diagnostic trouble codes to AWS IoT FleetWise . If you want to send diagnostic trouble codes, use `SEND_ACTIVE_DTCS` . If it\'s not specified, `OFF` is used.\\n\\nDefault: `OFF`","ExpiryTime":"(Optional) The time the campaign expires, in seconds since epoch (January 1, 1970 at midnight UTC time). Vehicle data isn\'t collected after the campaign expires.\\n\\nDefault: 253402214400 (December 31, 9999, 00:00:00 UTC)","Name":"The name of a campaign.","PostTriggerCollectionDuration":"(Optional) How long (in milliseconds) to collect raw data after a triggering event initiates the collection. If it\'s not specified, `0` is used.\\n\\nDefault: `0`","Priority":"(Optional) A number indicating the priority of one campaign over another campaign for a certain vehicle or fleet. A campaign with the lowest value is deployed to vehicles before any other campaigns. If it\'s not specified, `0` is used.\\n\\nDefault: `0`","SignalCatalogArn":"The Amazon Resource Name (ARN) of the signal catalog associated with the campaign.","SignalsToCollect":"(Optional) A list of information about signals to collect.","SpoolingMode":"(Optional) Whether to store collected data after a vehicle lost a connection with the cloud. After a connection is re-established, the data is automatically forwarded to AWS IoT FleetWise . If you want to store collected data when a vehicle loses connection with the cloud, use `TO_DISK` . If it\'s not specified, `OFF` is used.\\n\\nDefault: `OFF`","StartTime":"(Optional) The time, in milliseconds, to deliver a campaign after it was approved. If it\'s not specified, `0` is used.\\n\\nDefault: `0`","Tags":"(Optional) Metadata that can be used to manage the campaign.","TargetArn":"The Amazon Resource Name (ARN) of a vehicle or fleet to which the campaign is deployed."}},"AWS::IoTFleetWise::Campaign.CollectionScheme":{"attributes":{},"description":"Specifies what data to collect and how often or when to collect it.","properties":{"ConditionBasedCollectionScheme":"(Optional) Information about a collection scheme that uses a simple logical expression to recognize what data to collect.","TimeBasedCollectionScheme":"(Optional) Information about a collection scheme that uses a time period to decide how often to collect data."}},"AWS::IoTFleetWise::Campaign.ConditionBasedCollectionScheme":{"attributes":{},"description":"Information about a collection scheme that uses a simple logical expression to recognize what data to collect.","properties":{"ConditionLanguageVersion":"(Optional) Specifies the version of the conditional expression language.","Expression":"The logical expression used to recognize what data to collect. For example, `$variable.Vehicle.OutsideAirTemperature >= 105.0` .","MinimumTriggerIntervalMs":"(Optional) The minimum duration of time between two triggering events to collect data, in milliseconds.\\n\\n> If a signal changes often, you might want to collect data at a slower rate.","TriggerMode":"(Optional) Whether to collect data for all triggering events ( `ALWAYS` ). Specify ( `RISING_EDGE` ), or specify only when the condition first evaluates to false. For example, triggering on \\"AirbagDeployed\\"; Users aren\'t interested on triggering when the airbag is already exploded; they only care about the change from not deployed => deployed."}},"AWS::IoTFleetWise::Campaign.DataDestinationConfig":{"attributes":{},"description":"The destination where the AWS IoT FleetWise campaign sends data. You can send data to be stored in Amazon S3 or Amazon Timestream .","properties":{"S3Config":"(Optional) The Amazon S3 bucket where the AWS IoT FleetWise campaign sends data.","TimestreamConfig":"(Optional) The Amazon Timestream table where the campaign sends data."}},"AWS::IoTFleetWise::Campaign.S3Config":{"attributes":{},"description":"The Amazon S3 bucket where the AWS IoT FleetWise campaign sends data. Amazon S3 is an object storage service that stores data as objects within buckets. For more information, see [Creating, configuring, and working with Amazon S3 buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html) in the *Amazon Simple Storage Service User Guide* .","properties":{"BucketArn":"The Amazon Resource Name (ARN) of the Amazon S3 bucket.","DataFormat":"(Optional) Specify the format that files are saved in the Amazon S3 bucket. You can save files in an Apache Parquet or JSON format.\\n\\n- Parquet - Store data in a columnar storage file format. Parquet is optimal for fast data retrieval and can reduce costs. This option is selected by default.\\n- JSON - Store data in a standard text-based JSON file format.","Prefix":"(Optional) Enter an S3 bucket prefix. The prefix is the string of characters after the bucket name and before the object name. You can use the prefix to organize data stored in Amazon S3 buckets. For more information, see [Organizing objects using prefixes](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html) in the *Amazon Simple Storage Service User Guide* .\\n\\nBy default, AWS IoT FleetWise sets the prefix `processed-data/year=YY/month=MM/date=DD/hour=HH/` (in UTC) to data it delivers to Amazon S3 . You can enter a prefix to append it to this default prefix. For example, if you enter the prefix `vehicles` , the prefix will be `vehicles/processed-data/year=YY/month=MM/date=DD/hour=HH/` .","StorageCompressionFormat":"(Optional) By default, stored data is compressed as a .gzip file. Compressed files have a reduced file size, which can optimize the cost of data storage."}},"AWS::IoTFleetWise::Campaign.SignalInformation":{"attributes":{},"description":"Information about a signal.","properties":{"MaxSampleCount":"(Optional) The maximum number of samples to collect.","MinimumSamplingIntervalMs":"(Optional) The minimum duration of time (in milliseconds) between two triggering events to collect data.\\n\\n> If a signal changes often, you might want to collect data at a slower rate.","Name":"The name of the signal."}},"AWS::IoTFleetWise::Campaign.TimeBasedCollectionScheme":{"attributes":{},"description":"Information about a collection scheme that uses a time period to decide how often to collect data.","properties":{"PeriodMs":"The time period (in milliseconds) to decide how often to collect data. For example, if the time period is `60000` , the Edge Agent software collects data once every minute."}},"AWS::IoTFleetWise::Campaign.TimestreamConfig":{"attributes":{},"description":"The Amazon Timestream table where the AWS IoT FleetWise campaign sends data. Timestream stores and organizes data to optimize query processing time and to reduce storage costs. For more information, see [Data modeling](https://docs.aws.amazon.com/timestream/latest/developerguide/data-modeling.html) in the *Amazon Timestream Developer Guide* .","properties":{"ExecutionRoleArn":"The Amazon Resource Name (ARN) of the task execution role that grants AWS IoT FleetWise permission to deliver data to the Amazon Timestream table.","TimestreamTableArn":"The Amazon Resource Name (ARN) of the Amazon Timestream table."}},"AWS::IoTFleetWise::DecoderManifest":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the decoder manifest.","CreationTime":"The time the decoder manifest was created in seconds since epoch (January 1, 1970 at midnight UTC time).","LastModificationTime":"The time the decoder manifest was last updated in seconds since epoch (January 1, 1970 at midnight UTC time).","Ref":"`Ref` returns the Name."},"description":"Creates the decoder manifest associated with a model manifest. To create a decoder manifest, the following must be true:\\n\\n- Every signal decoder has a unique name.\\n- Each signal decoder is associated with a network interface.\\n- Each network interface has a unique ID.\\n- The signal decoders are specified in the model manifest.","properties":{"Description":"(Optional) A brief description of the decoder manifest.","ModelManifestArn":"The Amazon Resource Name (ARN) of a vehicle model (model manifest) associated with the decoder manifest.","Name":"The name of the decoder manifest.","NetworkInterfaces":"(Optional) A list of information about available network interfaces.","SignalDecoders":"(Optional) A list of information about signal decoders.","Status":"(Optional) The state of the decoder manifest. If the status is `ACTIVE` , the decoder manifest can\'t be edited. If the status is marked `DRAFT` , you can edit the decoder manifest.","Tags":"(Optional) Metadata that can be used to manage the decoder manifest."}},"AWS::IoTFleetWise::DecoderManifest.CanInterface":{"attributes":{},"description":"A single controller area network (CAN) device interface.","properties":{"Name":"The unique name of the interface.","ProtocolName":"(Optional) The name of the communication protocol for the interface.","ProtocolVersion":"(Optional) The version of the communication protocol for the interface."}},"AWS::IoTFleetWise::DecoderManifest.CanSignal":{"attributes":{},"description":"(Optional) Information about a single controller area network (CAN) signal and the messages it receives and transmits.","properties":{"Factor":"A multiplier used to decode the CAN message.","IsBigEndian":"Whether the byte ordering of a CAN message is big-endian.","IsSigned":"Whether the message data is specified as a signed value.","Length":"How many bytes of data are in the message.","MessageId":"The ID of the message.","Name":"(Optional) The name of the signal.","Offset":"The offset used to calculate the signal value. Combined with factor, the calculation is `value = raw_value * factor + offset` .","StartBit":"Indicates the beginning of the CAN message."}},"AWS::IoTFleetWise::DecoderManifest.NetworkInterfacesItems":{"attributes":{},"description":"(Optional) A list of information about available network interfaces.","properties":{"CanInterface":"(Optional) Information about a network interface specified by the Controller Area Network (CAN) protocol.","InterfaceId":"The ID of the network interface.","ObdInterface":"(Optional) Information about a network interface specified by the On-board diagnostic (OBD) II protocol.","Type":"The network protocol for the vehicle. For example, `CAN_SIGNAL` specifies a protocol that defines how data is communicated between electronic control units (ECUs). `OBD_SIGNAL` specifies a protocol that defines how self-diagnostic data is communicated between ECUs."}},"AWS::IoTFleetWise::DecoderManifest.ObdInterface":{"attributes":{},"description":"A network interface that specifies the On-board diagnostic (OBD) II network protocol.","properties":{"DtcRequestIntervalSeconds":"(Optional) The maximum number message requests per diagnostic trouble code per second.","HasTransmissionEcu":"(Optional) Whether the vehicle has a transmission control module (TCM).","Name":"The name of the interface.","ObdStandard":"(Optional) The standard OBD II PID.","PidRequestIntervalSeconds":"(Optional) The maximum number message requests per second.","RequestMessageId":"The ID of the message requesting vehicle data.","UseExtendedIds":"(Optional) Whether to use extended IDs in the message."}},"AWS::IoTFleetWise::DecoderManifest.ObdSignal":{"attributes":{},"description":"Information about signal messages using the on-board diagnostics (OBD) II protocol in a vehicle.","properties":{"BitMaskLength":"(Optional) The number of bits to mask in a message.","BitRightShift":"(Optional) The number of positions to shift bits in the message.","ByteLength":"The length of a message.","Offset":"The offset used to calculate the signal value. Combined with scaling, the calculation is `value = raw_value * scaling + offset` .","Pid":"The diagnostic code used to request data from a vehicle for this signal.","PidResponseLength":"The length of the requested data.","Scaling":"A multiplier used to decode the message.","ServiceMode":"The mode of operation (diagnostic service) in a message.","StartByte":"Indicates the beginning of the message."}},"AWS::IoTFleetWise::DecoderManifest.SignalDecodersItems":{"attributes":{},"description":"Information about a signal decoder.","properties":{"CanSignal":"(Optional) Information about a single controller area network (CAN) signal and the messages it receives and transmits.","FullyQualifiedName":"The fully qualified name of a signal decoder as defined in a vehicle model.","InterfaceId":"The ID of a network interface that specifies what network protocol a vehicle follows.","ObdSignal":"(Optional) Information about signal messages using the on-board diagnostics (OBD) II protocol in a vehicle.","Type":"The network protocol for the vehicle. For example, `CAN_SIGNAL` specifies a protocol that defines how data is communicated between electronic control units (ECUs). `OBD_SIGNAL` specifies a protocol that defines how self-diagnostic data is communicated between ECUs."}},"AWS::IoTFleetWise::Fleet":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the created fleet.","CreationTime":"The time the fleet was created in seconds since epoch (January 1, 1970 at midnight UTC time).","LastModificationTime":"The time the fleet was last updated, in seconds since epoch (January 1, 1970 at midnight UTC time).","Ref":"`Ref` returns the Id."},"description":"Creates a fleet that represents a group of vehicles.\\n\\n> You must create both a signal catalog and vehicles before you can create a fleet. \\n\\nFor more information, see [Fleets](https://docs.aws.amazon.com/iot-fleetwise/latest/developerguide/fleets.html) in the *AWS IoT FleetWise Developer Guide* .","properties":{"Description":"(Optional) A brief description of the fleet.","Id":"The unique ID of the fleet.","SignalCatalogArn":"The ARN of the signal catalog associated with the fleet.","Tags":"(Optional) Metadata that can be used to manage the fleet."}},"AWS::IoTFleetWise::ModelManifest":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the vehicle model.","CreationTime":"The time the vehicle model was created, in seconds since epoch (January 1, 1970 at midnight UTC time).","LastModificationTime":"The time the vehicle model was last updated, in seconds since epoch (January 1, 1970 at midnight UTC time).","Ref":"`Ref` returns the Name."},"description":"Creates a vehicle model (model manifest) that specifies signals (attributes, branches, sensors, and actuators).\\n\\nFor more information, see [Vehicle models](https://docs.aws.amazon.com/iot-fleetwise/latest/developerguide/vehicle-models.html) in the *AWS IoT FleetWise Developer Guide* .","properties":{"Description":"(Optional) A brief description of the vehicle model.","Name":"The name of the vehicle model.","Nodes":"(Optional) A list of nodes, which are a general abstraction of signals.","SignalCatalogArn":"The Amazon Resource Name (ARN) of the signal catalog associated with the vehicle model.","Status":"(Optional) The state of the vehicle model. If the status is `ACTIVE` , the vehicle model can\'t be edited. If the status is `DRAFT` , you can edit the vehicle model.","Tags":"(Optional) Metadata that can be used to manage the vehicle model."}},"AWS::IoTFleetWise::SignalCatalog":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the signal catalog.","CreationTime":"The time the signal catalog was created in seconds since epoch (January 1, 1970 at midnight UTC time).","LastModificationTime":"The time the signal catalog was last updated in seconds since epoch (January 1, 1970 at midnight UTC time).","NodeCounts.TotalActuators":"The total number of nodes in a vehicle network that represent actuators.","NodeCounts.TotalAttributes":"The total number of nodes in a vehicle network that represent attributes.","NodeCounts.TotalBranches":"The total number of nodes in a vehicle network that represent branches.","NodeCounts.TotalNodes":"The total number of nodes in a vehicle network.","NodeCounts.TotalSensors":"The total number of nodes in a vehicle network that represent sensors.","Ref":"`Ref` returns the Name."},"description":"Creates a collection of standardized signals that can be reused to create vehicle models.","properties":{"Description":"(Optional) A brief description of the signal catalog.","Name":"(Optional) The name of the signal catalog.","NodeCounts":"(Optional) Information about the number of nodes and node types in a vehicle network.","Nodes":"(Optional) A list of information about nodes, which are a general abstraction of signals.","Tags":"(Optional) Metadata that can be used to manage the signal catalog."}},"AWS::IoTFleetWise::SignalCatalog.Actuator":{"attributes":{},"description":"A signal that represents a vehicle device such as the engine, heater, and door locks. Data from an actuator reports the state of a certain vehicle device.\\n\\n> Updating actuator data can change the state of a device. For example, you can turn on or off the heater by updating its actuator data.","properties":{"AllowedValues":"(Optional) A list of possible values an actuator can take.","AssignedValue":"(Optional) A specified value for the actuator.","DataType":"The specified data type of the actuator.","Description":"(Optional) A brief description of the actuator.","FullyQualifiedName":"The fully qualified name of the actuator. For example, the fully qualified name of an actuator might be `Vehicle.Front.Left.Door.Lock` .","Max":"(Optional) The specified possible maximum value of an actuator.","Min":"(Optional) The specified possible minimum value of an actuator.","Unit":"(Optional) The scientific unit for the actuator."}},"AWS::IoTFleetWise::SignalCatalog.Attribute":{"attributes":{},"description":"A signal that represents static information about the vehicle, such as engine type or manufacturing date.","properties":{"AllowedValues":"(Optional) A list of possible values an attribute can be assigned.","AssignedValue":"(Optional) A specified value for the attribute.","DataType":"The specified data type of the attribute.","DefaultValue":"(Optional) The default value of the attribute.","Description":"(Optional) A brief description of the attribute.","FullyQualifiedName":"The fully qualified name of the attribute. For example, the fully qualified name of an attribute might be `Vehicle.Body.Engine.Type` .","Max":"(Optional) The specified possible maximum value of the attribute.","Min":"(Optional) The specified possible minimum value of the attribute.","Unit":"(Optional) The scientific unit for the attribute."}},"AWS::IoTFleetWise::SignalCatalog.Branch":{"attributes":{},"description":"A group of signals that are defined in a hierarchical structure.","properties":{"Description":"(Optional) A brief description of the branch.","FullyQualifiedName":"The fully qualified name of the branch. For example, the fully qualified name of a branch might be `Vehicle.Body.Engine` ."}},"AWS::IoTFleetWise::SignalCatalog.Node":{"attributes":{},"description":"A general abstraction of a signal. A node can be specified as an actuator, attribute, branch, or sensor.","properties":{"Actuator":"(Optional) Information about a node specified as an actuator.\\n\\n> An actuator is a digital representation of a vehicle device.","Attribute":"(Optional) Information about a node specified as an attribute.\\n\\n> An attribute represents static information about a vehicle.","Branch":"(Optional) Information about a node specified as a branch.\\n\\n> A group of signals that are defined in a hierarchical structure.","Sensor":"(Optional) An input component that reports the environmental condition of a vehicle.\\n\\n> You can collect data about fluid levels, temperatures, vibrations, or battery voltage from sensors."}},"AWS::IoTFleetWise::SignalCatalog.NodeCounts":{"attributes":{},"description":"Information about the number of nodes and node types in a vehicle network.","properties":{"TotalActuators":"(Optional) The total number of nodes in a vehicle network that represent actuators.","TotalAttributes":"(Optional) The total number of nodes in a vehicle network that represent attributes.","TotalBranches":"(Optional) The total number of nodes in a vehicle network that represent branches.","TotalNodes":"(Optional) The total number of nodes in a vehicle network.","TotalSensors":"(Optional) The total number of nodes in a vehicle network that represent sensors."}},"AWS::IoTFleetWise::SignalCatalog.Sensor":{"attributes":{},"description":"An input component that reports the environmental condition of a vehicle.\\n\\n> You can collect data about fluid levels, temperatures, vibrations, or battery voltage from sensors.","properties":{"AllowedValues":"(Optional) A list of possible values a sensor can take.","DataType":"The specified data type of the sensor.","Description":"(Optional) A brief description of a sensor.","FullyQualifiedName":"The fully qualified name of the sensor. For example, the fully qualified name of a sensor might be `Vehicle.Body.Engine.Battery` .","Max":"(Optional) The specified possible maximum value of the sensor.","Min":"(Optional) The specified possible minimum value of the sensor.","Unit":"(Optional) The scientific unit of measurement for data collected by the sensor."}},"AWS::IoTFleetWise::Vehicle":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the vehicle.","CreationTime":"The time the vehicle was created in seconds since epoch (January 1, 1970 at midnight UTC time).","LastModificationTime":"The time the vehicle was last updated in seconds since epoch (January 1, 1970 at midnight UTC time).","Ref":"`Ref` returns the Name."},"description":"Creates a vehicle, which is an instance of a vehicle model (model manifest). Vehicles created from the same vehicle model consist of the same signals inherited from the vehicle model.\\n\\n> If you have an existing AWS IoT thing, you can use AWS IoT FleetWise to create a vehicle and collect data from your thing. \\n\\nFor more information, see [Create a vehicle (console)](https://docs.aws.amazon.com/iot-fleetwise/latest/developerguide/create-vehicle-console.html) in the *AWS IoT FleetWise Developer Guide* .","properties":{"AssociationBehavior":"(Optional) An option to create a new AWS IoT thing when creating a vehicle, or to validate an existing thing as a vehicle.","Attributes":"(Optional) Static information about a vehicle in a key-value pair. For example: `\\"engine Type\\"` : `\\"v6\\"`","DecoderManifestArn":"The Amazon Resource Name (ARN) of a decoder manifest associated with the vehicle to create.","ModelManifestArn":"The Amazon Resource Name (ARN) of the vehicle model (model manifest) to create the vehicle from.","Name":"The unique ID of the vehicle.","Tags":"(Optional) Metadata which can be used to manage the vehicle."}},"AWS::IoTSiteWise::AccessPolicy":{"attributes":{"AccessPolicyArn":"The [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) of the access policy, which has the following format.\\n\\n`arn:${Partition}:iotsitewise:${Region}:${Account}:access-policy/${AccessPolicyId}`","AccessPolicyId":"The ID of the access policy.","Ref":"`Ref` returns the `AccessPolicyId` ."},"description":"Creates an access policy that grants the specified identity (IAM Identity Center user, IAM Identity Center group, or IAM user) access to the specified AWS IoT SiteWise Monitor portal or project resource.","properties":{"AccessPolicyIdentity":"The identity for this access policy. Choose an IAM Identity Center user, an IAM Identity Center group, or an IAM user.","AccessPolicyPermission":"The permission level for this access policy. Choose either a `ADMINISTRATOR` or `VIEWER` . Note that a project `ADMINISTRATOR` is also known as a project owner.","AccessPolicyResource":"The AWS IoT SiteWise Monitor resource for this access policy. Choose either a portal or a project."}},"AWS::IoTSiteWise::AccessPolicy.AccessPolicyIdentity":{"attributes":{},"description":"The identity (IAM Identity Center user, IAM Identity Center group, or IAM user) to which this access policy applies.","properties":{"IamRole":"An IAM role identity.","IamUser":"An IAM user identity.","User":"The IAM Identity Center user to which this access policy maps."}},"AWS::IoTSiteWise::AccessPolicy.AccessPolicyResource":{"attributes":{},"description":"The AWS IoT SiteWise Monitor resource for this access policy. Choose either a portal or a project.","properties":{"Portal":"The AWS IoT SiteWise Monitor portal for this access policy.","Project":"The AWS IoT SiteWise Monitor project for this access policy."}},"AWS::IoTSiteWise::AccessPolicy.IamRole":{"attributes":{},"description":"Contains information about an AWS Identity and Access Management role. For more information, see [IAM roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) in the *IAM User Guide* .","properties":{"arn":"The ARN of the IAM role. For more information, see [IAM ARNs](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) in the *IAM User Guide* ."}},"AWS::IoTSiteWise::AccessPolicy.IamUser":{"attributes":{},"description":"Contains information about an AWS Identity and Access Management user.","properties":{"arn":"The ARN of the IAM user. For more information, see [IAM ARNs](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) in the *IAM User Guide* .\\n\\n> If you delete the IAM user, access policies that contain this identity include an empty `arn` . You can delete the access policy for the IAM user that no longer exists."}},"AWS::IoTSiteWise::AccessPolicy.Portal":{"attributes":{},"description":"The `Portal` property type specifies the AWS IoT SiteWise Monitor portal for an [AWS::IoTSiteWise::AccessPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-accesspolicy.html) .","properties":{"id":"The ID of the portal."}},"AWS::IoTSiteWise::AccessPolicy.Project":{"attributes":{},"description":"The `Project` property type specifies the AWS IoT SiteWise Monitor project for an [AWS::IoTSiteWise::AccessPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-accesspolicy.html) .","properties":{"id":"The ID of the project."}},"AWS::IoTSiteWise::AccessPolicy.User":{"attributes":{},"description":"The `User` property type specifies the AWS IoT SiteWise Monitor user for an [AWS::IoTSiteWise::AccessPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-accesspolicy.html) .","properties":{"id":"The ID of the user."}},"AWS::IoTSiteWise::Asset":{"attributes":{"AssetArn":"The ARN of the asset.","AssetId":"The ID of the asset.","Ref":"`Ref` returns `AssetId` and `AssetArn` ."},"description":"Creates an asset from an existing asset model. For more information, see [Creating assets](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-assets.html) in the *AWS IoT SiteWise User Guide* .","properties":{"AssetDescription":"A description for the asset.","AssetHierarchies":"A list of asset hierarchies that each contain a `hierarchyLogicalId` . A hierarchy specifies allowed parent/child asset relationships.","AssetModelId":"The ID of the asset model from which to create the asset.","AssetName":"A unique, friendly name for the asset.\\n\\nThe maximum length is 256 characters with the pattern `[^\\\\u0000-\\\\u001F\\\\u007F]+` .","AssetProperties":"The list of asset properties for the asset.\\n\\nThis object doesn\'t include properties that you define in composite models. You can find composite model properties in the `assetCompositeModels` object.","Tags":"A list of key-value pairs that contain metadata for the asset. For more information, see [Tagging your AWS IoT SiteWise resources](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html) in the *AWS IoT SiteWise User Guide* ."}},"AWS::IoTSiteWise::Asset.AssetHierarchy":{"attributes":{},"description":"Describes an asset hierarchy that contains a `childAssetId` and `hierarchyLogicalId` .","properties":{"ChildAssetId":"The Id of the child asset.","LogicalId":"The `LogicalID` of the hierarchy. This ID is a `hierarchyLogicalId` .\\n\\nThe maximum length is 256 characters, with the pattern `[^\\\\u0000-\\\\u001F\\\\u007F]+` ."}},"AWS::IoTSiteWise::Asset.AssetProperty":{"attributes":{},"description":"Contains asset property information.","properties":{"Alias":"The property alias that identifies the property, such as an OPC-UA server data stream path (for example, `/company/windfarm/3/turbine/7/temperature` ). For more information, see [Mapping industrial data streams to asset properties](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/connect-data-streams.html) in the *AWS IoT SiteWise User Guide* .\\n\\nThe property alias must have 1-1000 characters.","LogicalId":"The `LogicalID` of the asset property.\\n\\nThe maximum length is 256 characters, with the pattern `[^\\\\u0000-\\\\u001F\\\\u007F]+` .","NotificationState":"The MQTT notification state ( `ENABLED` or `DISABLED` ) for this asset property. When the notification state is `ENABLED` , AWS IoT SiteWise publishes property value updates to a unique MQTT topic. For more information, see [Interacting with other services](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/interact-with-other-services.html) in the *AWS IoT SiteWise User Guide* .\\n\\nIf you omit this parameter, the notification state is set to `DISABLED` .\\n\\n> You must use all caps for the NotificationState parameter. If you use lower case letters, you will receive a schema validation error.","Unit":"The unit (such as `Newtons` or `RPM` ) of the asset property."}},"AWS::IoTSiteWise::AssetModel":{"attributes":{"AssetModelId":"The ID of the asset model.","Ref":"`Ref` returns the `AssetModelId` ."},"description":"Creates an asset model from specified property and hierarchy definitions. You create assets from asset models. With asset models, you can easily create assets of the same type that have standardized definitions. Each asset created from a model inherits the asset model\'s property and hierarchy definitions. For more information, see [Defining asset models](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/define-models.html) in the *AWS IoT SiteWise User Guide* .","properties":{"AssetModelCompositeModels":"The composite asset models that are part of this asset model. Composite asset models are asset models that contain specific properties. Each composite model has a type that defines the properties that the composite model supports. You can use composite asset models to define alarms on this asset model.","AssetModelDescription":"A description for the asset model.","AssetModelHierarchies":"The hierarchy definitions of the asset model. Each hierarchy specifies an asset model whose assets can be children of any other assets created from this asset model. For more information, see [Defining relationships between assets](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html) in the *AWS IoT SiteWise User Guide* .\\n\\nYou can specify up to 10 hierarchies per asset model. For more information, see [Quotas](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html) in the *AWS IoT SiteWise User Guide* .","AssetModelName":"A unique, friendly name for the asset model.\\n\\nThe maximum length is 256 characters with the pattern `[^\\\\u0000-\\\\u001F\\\\u007F]+` .","AssetModelProperties":"The property definitions of the asset model. For more information, see [Defining data properties](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html) in the *AWS IoT SiteWise User Guide* .\\n\\nYou can specify up to 200 properties per asset model. For more information, see [Quotas](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html) in the *AWS IoT SiteWise User Guide* .","Tags":"A list of key-value pairs that contain metadata for the asset. For more information, see [Tagging your AWS IoT SiteWise resources](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html) in the *AWS IoT SiteWise User Guide* ."}},"AWS::IoTSiteWise::AssetModel.AssetModelCompositeModel":{"attributes":{},"description":"Contains information about a composite model in an asset model. This object contains the asset property definitions that you define in the composite model. You can use composite asset models to define alarms on this asset model.\\n\\nIf you use the `AssetModelCompositeModel` property to create an alarm, you must use the following information to define three asset model properties:\\n\\n- Use an asset model property to specify the alarm type.\\n\\n- The name must be `AWS/ALARM_TYPE` .\\n- The data type must be `STRING` .\\n- For the `Type` property, the type name must be `Attribute` and the default value must be `IOT_EVENTS` .\\n- Use an asset model property to specify the alarm source.\\n\\n- The name must be `AWS/ALARM_SOURCE` .\\n- The data type must be `STRING` .\\n- For the `Type` property, the type name must be `Attribute` and the default value must be the ARN of the alarm model that you created in AWS IoT Events .\\n\\n> For the ARN of the alarm model, you can use the `Fn::Sub` intrinsic function to substitute the `AWS::Partition` , `AWS::Region` , and `AWS::AccountId` variables in an input string with values that you specify.\\n> \\n> For example, `Fn::Sub: \\"arn:${AWS::Partition}:iotevents:${AWS::Region}:${AWS::AccountId}:alarmModel/TestAlarmModel\\"` .\\n> \\n> Replace `TestAlarmModel` with the name of your alarm model.\\n> \\n> For more information about using the `Fn::Sub` intrinsic function, see [Fn::Sub](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html) .\\n- Use an asset model property to specify the state of the alarm.\\n\\n- The name must be `AWS/ALARM_STATE` .\\n- The data type must be `STRUCT` .\\n- The `DataTypeSpec` value must be `AWS/ALARM_STATE` .\\n- For the `Type` property, the type name must be `Measurement` .\\n\\nAt the bottom of this page, we provide a YAML example that you can modify to create an alarm.","properties":{"CompositeModelProperties":"The asset property definitions for this composite model.","Description":"The description of the composite model.","Name":"The name of the composite model.","Type":"The type of the composite model. For alarm composite models, this type is `AWS/ALARM` ."}},"AWS::IoTSiteWise::AssetModel.AssetModelHierarchy":{"attributes":{},"description":"Describes an asset hierarchy that contains a hierarchy\'s name, `LogicalID` , and child asset model ID that specifies the type of asset that can be in this hierarchy.","properties":{"ChildAssetModelId":"The Id of the asset model.","LogicalId":"The `LogicalID` of the asset model hierarchy. This ID is a `hierarchyLogicalId` .\\n\\nThe maximum length is 256 characters, with the pattern `[^\\\\u0000-\\\\u001F\\\\u007F]+`","Name":"The name of the asset model hierarchy.\\n\\nThe maximum length is 256 characters with the pattern `[^\\\\u0000-\\\\u001F\\\\u007F]+` ."}},"AWS::IoTSiteWise::AssetModel.AssetModelProperty":{"attributes":{},"description":"Contains information about an asset model property.","properties":{"DataType":"The data type of the asset model property. The value can be `STRING` , `INTEGER` , `DOUBLE` , `BOOLEAN` , or `STRUCT` .","DataTypeSpec":"The data type of the structure for this property. This parameter exists on properties that have the `STRUCT` data type.","LogicalId":"The `LogicalID` of the asset model property.\\n\\nThe maximum length is 256 characters, with the pattern `[^\\\\\\\\u0000-\\\\\\\\u001F\\\\\\\\u007F]+` .","Name":"The name of the asset model property.\\n\\nThe maximum length is 256 characters with the pattern `[^\\\\u0000-\\\\u001F\\\\u007F]+` .","Type":"Contains a property type, which can be one of `Attribute` , `Measurement` , `Metric` , or `Transform` .","Unit":"The unit of the asset model property, such as `Newtons` or `RPM` ."}},"AWS::IoTSiteWise::AssetModel.Attribute":{"attributes":{},"description":"Contains an asset attribute property. For more information, see [Defining data properties](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html#attributes) in the *AWS IoT SiteWise User Guide* .","properties":{"DefaultValue":"The default value of the asset model property attribute. All assets that you create from the asset model contain this attribute value. You can update an attribute\'s value after you create an asset. For more information, see [Updating attribute values](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/update-attribute-values.html) in the *AWS IoT SiteWise User Guide* ."}},"AWS::IoTSiteWise::AssetModel.ExpressionVariable":{"attributes":{},"description":"Contains expression variable information.","properties":{"Name":"The friendly name of the variable to be used in the expression.\\n\\nThe maximum length is 64 characters with the pattern `^[a-z][a-z0-9_]*$` .","Value":"The variable that identifies an asset property from which to use values."}},"AWS::IoTSiteWise::AssetModel.Metric":{"attributes":{},"description":"Contains an asset metric property. With metrics, you can calculate aggregate functions, such as an average, maximum, or minimum, as specified through an expression. A metric maps several values to a single value (such as a sum).\\n\\nThe maximum number of dependent/cascading variables used in any one metric calculation is 10. Therefore, a *root* metric can have up to 10 cascading metrics in its computational dependency tree. Additionally, a metric can only have a data type of `DOUBLE` and consume properties with data types of `INTEGER` or `DOUBLE` .\\n\\nFor more information, see [Defining data properties](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html#metrics) in the *AWS IoT SiteWise User Guide* .","properties":{"Expression":"The mathematical expression that defines the metric aggregation function. You can specify up to 10 variables per expression. You can specify up to 10 functions per expression.\\n\\nFor more information, see [Quotas](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html) in the *AWS IoT SiteWise User Guide* .","Variables":"The list of variables used in the expression.","Window":"The window (time interval) over which AWS IoT SiteWise computes the metric\'s aggregation expression. AWS IoT SiteWise computes one data point per `window` ."}},"AWS::IoTSiteWise::AssetModel.MetricWindow":{"attributes":{},"description":"Contains a time interval window used for data aggregate computations (for example, average, sum, count, and so on).","properties":{"Tumbling":"The tumbling time interval window."}},"AWS::IoTSiteWise::AssetModel.PropertyType":{"attributes":{},"description":"Contains a property type, which can be one of `Attribute` , `Measurement` , `Metric` , or `Transform` .","properties":{"Attribute":"Specifies an asset attribute property. An attribute generally contains static information, such as the serial number of an [industrial IoT](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Internet_of_things#Industrial_applications) wind turbine.\\n\\nThis is required if the `TypeName` is `Attribute` and has a `DefaultValue` .","Metric":"Specifies an asset metric property. A metric contains a mathematical expression that uses aggregate functions to process all input data points over a time interval and output a single data point, such as to calculate the average hourly temperature.\\n\\nThis is required if the `TypeName` is `Metric` .","Transform":"Specifies an asset transform property. A transform contains a mathematical expression that maps a property\'s data points from one form to another, such as a unit conversion from Celsius to Fahrenheit.\\n\\nThis is required if the `TypeName` is `Transform` .","TypeName":"The type of property type, which can be one of `Attribute` , `Measurement` , `Metric` , or `Transform` ."}},"AWS::IoTSiteWise::AssetModel.Transform":{"attributes":{},"description":"Contains an asset transform property. A transform is a one-to-one mapping of a property\'s data points from one form to another. For example, you can use a transform to convert a Celsius data stream to Fahrenheit by applying the transformation expression to each data point of the Celsius stream. Transforms can only input properties that are `INTEGER` , `DOUBLE` , or `BOOLEAN` type. Booleans convert to `0` ( `FALSE` ) and `1` ( `TRUE` )..\\n\\nFor more information, see [Defining data properties](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-properties.html#transforms) in the *AWS IoT SiteWise User Guide* .","properties":{"Expression":"The mathematical expression that defines the transformation function. You can specify up to 10 variables per expression. You can specify up to 10 functions per expression.\\n\\nFor more information, see [Quotas](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/quotas.html) in the *AWS IoT SiteWise User Guide* .","Variables":"The list of variables used in the expression."}},"AWS::IoTSiteWise::AssetModel.TumblingWindow":{"attributes":{},"description":"Contains a tumbling window, which is a repeating fixed-sized, non-overlapping, and contiguous time window. You can use this window in metrics to aggregate data from properties and other assets.\\n\\nYou can use `m` , `h` , `d` , and `w` when you specify an interval or offset. Note that `m` represents minutes, `h` represents hours, `d` represents days, and `w` represents weeks. You can also use `s` to represent seconds in `offset` .\\n\\nThe `interval` and `offset` parameters support the [ISO 8601 format](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/ISO_8601) . For example, `PT5S` represents 5 seconds, `PT5M` represents 5 minutes, and `PT5H` represents 5 hours.","properties":{"Interval":"The time interval for the tumbling window. The interval time must be between 1 minute and 1 week.\\n\\nAWS IoT SiteWise computes the `1w` interval the end of Sunday at midnight each week (UTC), the `1d` interval at the end of each day at midnight (UTC), the `1h` interval at the end of each hour, and so on.\\n\\nWhen AWS IoT SiteWise aggregates data points for metric computations, the start of each interval is exclusive and the end of each interval is inclusive. AWS IoT SiteWise places the computed data point at the end of the interval.","Offset":"The offset for the tumbling window. The `offset` parameter accepts the following:\\n\\n- The offset time.\\n\\nFor example, if you specify `18h` for `offset` and `1d` for `interval` , AWS IoT SiteWise aggregates data in one of the following ways:\\n\\n- If you create the metric before or at 6 PM (UTC), you get the first aggregation result at 6 PM (UTC) on the day when you create the metric.\\n- If you create the metric after 6 PM (UTC), you get the first aggregation result at 6 PM (UTC) the next day.\\n- The ISO 8601 format.\\n\\nFor example, if you specify `PT18H` for `offset` and `1d` for `interval` , AWS IoT SiteWise aggregates data in one of the following ways:\\n\\n- If you create the metric before or at 6 PM (UTC), you get the first aggregation result at 6 PM (UTC) on the day when you create the metric.\\n- If you create the metric after 6 PM (UTC), you get the first aggregation result at 6 PM (UTC) the next day.\\n- The 24-hour clock.\\n\\nFor example, if you specify `00:03:00` for `offset` , `5m` for `interval` , and you create the metric at 2 PM (UTC), you get the first aggregation result at 2:03 PM (UTC). You get the second aggregation result at 2:08 PM (UTC).\\n- The offset time zone.\\n\\nFor example, if you specify `2021-07-23T18:00-08` for `offset` and `1d` for `interval` , AWS IoT SiteWise aggregates data in one of the following ways:\\n\\n- If you create the metric before or at 6 PM (PST), you get the first aggregation result at 6 PM (PST) on the day when you create the metric.\\n- If you create the metric after 6 PM (PST), you get the first aggregation result at 6 PM (PST) the next day."}},"AWS::IoTSiteWise::AssetModel.VariableValue":{"attributes":{},"description":"Identifies a property value used in an expression.","properties":{"HierarchyLogicalId":"The `LogicalID` of the hierarchy to query for the `PropertyLogicalID` .\\n\\nYou use a `hierarchyLogicalID` instead of a model ID because you can have several hierarchies using the same model and therefore the same property. For example, you might have separately grouped assets that come from the same asset model. For more information, see [Defining relationships between assets](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/asset-hierarchies.html) in the *AWS IoT SiteWise User Guide* .","PropertyLogicalId":"The `LogicalID` of the property to use as the variable."}},"AWS::IoTSiteWise::Dashboard":{"attributes":{"DashboardArn":"The [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) of the dashboard, which has the following format.\\n\\n`arn:${Partition}:iotsitewise:${Region}:${Account}:dashboard/${DashboardId}`","DashboardId":"The ID of the dashboard.","Ref":"`Ref` returns the `DashboardId` ."},"description":"Creates a dashboard in an AWS IoT SiteWise Monitor project.","properties":{"DashboardDefinition":"The dashboard definition specified in a JSON literal. For detailed information, see [Creating dashboards (CLI)](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/create-dashboards-using-aws-cli.html) in the *AWS IoT SiteWise User Guide* .","DashboardDescription":"A description for the dashboard.","DashboardName":"A friendly name for the dashboard.","ProjectId":"The ID of the project in which to create the dashboard.","Tags":"A list of key-value pairs that contain metadata for the dashboard. For more information, see [Tagging your AWS IoT SiteWise resources](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html) in the *AWS IoT SiteWise User Guide* ."}},"AWS::IoTSiteWise::Gateway":{"attributes":{"GatewayId":"The ID for the gateway.","Ref":"`Ref` returns the `GatewayId` ."},"description":"Creates a gateway, which is a virtual or edge device that delivers industrial data streams from local servers to AWS IoT SiteWise . For more information, see [Ingesting data using a gateway](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/gateway-connector.html) in the *AWS IoT SiteWise User Guide* .","properties":{"GatewayCapabilitySummaries":"A list of gateway capability summaries that each contain a namespace and status. Each gateway capability defines data sources for the gateway. To retrieve a capability configuration\'s definition, use [DescribeGatewayCapabilityConfiguration](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeGatewayCapabilityConfiguration.html) .","GatewayName":"A unique, friendly name for the gateway.\\n\\nThe maximum length is 256 characters with the pattern `[^\\\\u0000-\\\\u001F\\\\u007F]+` .","GatewayPlatform":"The gateway\'s platform. You can only specify one platform in a gateway.","Tags":"A list of key-value pairs that contain metadata for the gateway. For more information, see [Tagging your AWS IoT SiteWise resources](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html) in the *AWS IoT SiteWise User Guide* ."}},"AWS::IoTSiteWise::Gateway.GatewayCapabilitySummary":{"attributes":{},"description":"Contains a summary of a gateway capability configuration.","properties":{"CapabilityConfiguration":"The JSON document that defines the configuration for the gateway capability. For more information, see [Configuring data sources (CLI)](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/configure-sources.html#configure-source-cli) in the *AWS IoT SiteWise User Guide* .","CapabilityNamespace":"The namespace of the capability configuration. For example, if you configure OPC-UA sources from the AWS IoT SiteWise console, your OPC-UA capability configuration has the namespace `iotsitewise:opcuacollector:version` , where `version` is a number such as `1` .\\n\\nThe maximum length is 512 characters with the pattern `^[a-zA-Z]+:[a-zA-Z]+:[0-9]+$` ."}},"AWS::IoTSiteWise::Gateway.GatewayPlatform":{"attributes":{},"description":"Contains a gateway\'s platform information.","properties":{"Greengrass":"A gateway that runs on AWS IoT Greengrass .","GreengrassV2":"A gateway that runs on AWS IoT Greengrass V2."}},"AWS::IoTSiteWise::Gateway.Greengrass":{"attributes":{},"description":"Contains details for a gateway that runs on AWS IoT Greengrass . To create a gateway that runs on AWS IoT Greengrass , you must add the IoT SiteWise connector to a Greengrass group and deploy it. Your Greengrass group must also have permissions to upload data to AWS IoT SiteWise . For more information, see [Ingesting data using a gateway](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/gateway-connector.html) in the *AWS IoT SiteWise User Guide* .","properties":{"GroupArn":"The [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) of the Greengrass group. For more information about how to find a group\'s ARN, see [ListGroups](https://docs.aws.amazon.com/greengrass/latest/apireference/listgroups-get.html) and [GetGroup](https://docs.aws.amazon.com/greengrass/latest/apireference/getgroup-get.html) in the *AWS IoT Greengrass API Reference* ."}},"AWS::IoTSiteWise::Gateway.GreengrassV2":{"attributes":{},"description":"Contains details for a gateway that runs on AWS IoT Greengrass V2. To create a gateway that runs on AWS IoT Greengrass V2, you must deploy the IoT SiteWise Edge component to your gateway device. Your [Greengrass device role](https://docs.aws.amazon.com/greengrass/v2/developerguide/device-service-role.html) must use the `AWSIoTSiteWiseEdgeAccess` policy. For more information, see [Using AWS IoT SiteWise at the edge](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/sw-gateways.html) in the *AWS IoT SiteWise User Guide* .","properties":{"CoreDeviceThingName":"The name of the AWS IoT thing for your AWS IoT Greengrass V2 core device."}},"AWS::IoTSiteWise::Portal":{"attributes":{"PortalArn":"The [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) of the portal, which has the following format.\\n\\n`arn:${Partition}:iotsitewise:${Region}:${Account}:portal/${PortalId}`","PortalClientId":"The IAM Identity Center application generated client ID (used with IAM Identity Center APIs).","PortalId":"The ID of the created portal.","PortalStartUrl":"The public URL for the AWS IoT SiteWise Monitor portal.","Ref":"`Ref` returns the `PortalId` ."},"description":"Creates a portal, which can contain projects and dashboards. Before you can create a portal, you must enable IAM Identity Center . AWS IoT SiteWise Monitor uses IAM Identity Center to manage user permissions. For more information, see [Enabling IAM Identity Center](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-get-started.html#mon-gs-sso) in the *AWS IoT SiteWise User Guide* .\\n\\n> Before you can sign in to a new portal, you must add at least one IAM Identity Center user or group to that portal. For more information, see [Adding or removing portal administrators](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/administer-portals.html#portal-change-admins) in the *AWS IoT SiteWise User Guide* .","properties":{"Alarms":"Contains the configuration information of an alarm created in an AWS IoT SiteWise Monitor portal. You can use the alarm to monitor an asset property and get notified when the asset property value is outside a specified range. For more information, see [Monitoring with alarms](https://docs.aws.amazon.com/iot-sitewise/latest/appguide/monitor-alarms.html) in the *AWS IoT SiteWise Application Guide* .","NotificationSenderEmail":"The email address that sends alarm notifications.\\n\\n> If you use the [AWS IoT Events managed Lambda function](https://docs.aws.amazon.com/iotevents/latest/developerguide/lambda-support.html) to manage your emails, you must [verify the sender email address in Amazon SES](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/verify-email-addresses.html) .","PortalAuthMode":"The service to use to authenticate users to the portal. Choose from the following options:\\n\\n- `SSO` – The portal uses AWS IAM Identity Center (successor to AWS Single Sign-On) to authenticate users and manage user permissions. Before you can create a portal that uses IAM Identity Center , you must enable IAM Identity Center . For more information, see [Enabling IAM Identity Center](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-get-started.html#mon-gs-sso) in the *AWS IoT SiteWise User Guide* . This option is only available in AWS Regions other than the China Regions.\\n- `IAM` – The portal uses AWS Identity and Access Management ( IAM ) to authenticate users and manage user permissions.\\n\\nYou can\'t change this value after you create a portal.\\n\\nDefault: `SSO`","PortalContactEmail":"The AWS administrator\'s contact email address.","PortalDescription":"A description for the portal.","PortalName":"A friendly name for the portal.","RoleArn":"The [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) of a service role that allows the portal\'s users to access your AWS IoT SiteWise resources on your behalf. For more information, see [Using service roles for AWS IoT SiteWise Monitor](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/monitor-service-role.html) in the *AWS IoT SiteWise User Guide* .","Tags":"A list of key-value pairs that contain metadata for the portal. For more information, see [Tagging your AWS IoT SiteWise resources](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html) in the *AWS IoT SiteWise User Guide* ."}},"AWS::IoTSiteWise::Portal.Alarms":{"attributes":{},"description":"Contains the configuration information of an alarm created in an AWS IoT SiteWise Monitor portal. You can use the alarm to monitor an asset property and get notified when the asset property value is outside a specified range. For more information, see [Monitoring with alarms](https://docs.aws.amazon.com/iot-sitewise/latest/appguide/monitor-alarms.html) in the *AWS IoT SiteWise Application Guide* .","properties":{"AlarmRoleArn":"The [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) of the IAM role that allows the alarm to perform actions and access AWS resources and services, such as AWS IoT Events .","NotificationLambdaArn":"The [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) of the Lambda function that manages alarm notifications. For more information, see [Managing alarm notifications](https://docs.aws.amazon.com/iotevents/latest/developerguide/lambda-support.html) in the *AWS IoT Events Developer Guide* ."}},"AWS::IoTSiteWise::Project":{"attributes":{"ProjectArn":"The [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) of the project, which has the following format.\\n\\n`arn:${Partition}:iotsitewise:${Region}:${Account}:project/${ProjectId}`","ProjectId":"The ID of the project.","Ref":"`Ref` returns the `ProjectId` ."},"description":"Creates a project in the specified portal.\\n\\n> Make sure that the project name and description don\'t contain confidential information.","properties":{"AssetIds":"A list that contains the IDs of each asset associated with the project.","PortalId":"The ID of the portal in which to create the project.","ProjectDescription":"A description for the project.","ProjectName":"A friendly name for the project.","Tags":"A list of key-value pairs that contain metadata for the project. For more information, see [Tagging your AWS IoT SiteWise resources](https://docs.aws.amazon.com/iot-sitewise/latest/userguide/tag-resources.html) in the *AWS IoT SiteWise User Guide* ."}},"AWS::IoTTwinMaker::ComponentType":{"attributes":{"Arn":"The ARN of the component type.","CreationDateTime":"The date and time when the component type was created.","IsAbstract":"A boolean value that specifies whether the component type is abstract.","IsSchemaInitialized":"A boolean value that specifies whether the component type has a schema initializer and that the schema initializer has run.","Ref":"`Ref` returns the workspace Id and the ComponentType Id.","Status":"The component type status.","Status.Error":"The component type error.","Status.Error.Code":"component type error code.","Status.Error.Message":"The component type error message.","Status.State":"The component type state.","UpdateDateTime":"The component type the update time."},"description":"Use the `AWS::IoTTwinMaker::ComponentType` resource to declare a component type.","properties":{"ComponentTypeId":"The ID of the component type.","Description":"The description of the component type.","ExtendsFrom":"The name of the parent component type that this component type extends.","Functions":"An object that maps strings to the functions in the component type. Each string in the mapping must be unique to this object.\\n\\nFor information on the FunctionResponse object see the [FunctionResponse](https://docs.aws.amazon.com//iot-twinmaker/latest/apireference/API_FunctionResponse.html) API reference.","IsSingleton":"A boolean value that specifies whether an entity can have more than one component of this type.","PropertyDefinitions":"An object that maps strings to the property definitions in the component type. Each string in the mapping must be unique to this object.\\n\\nFor information about the PropertyDefinitionResponse object, see the [PropertyDefinitionResponse](https://docs.aws.amazon.com//iot-twinmaker/latest/apireference/API_PropertyDefinitionResponse.html) API reference.","PropertyGroups":"An object that maps strings to the property groups in the component type. Each string in the mapping must be unique to this object.","Tags":"The ComponentType tags.","WorkspaceId":"The ID of the workspace."}},"AWS::IoTTwinMaker::ComponentType.DataConnector":{"attributes":{},"description":"The data connector.","properties":{"IsNative":"A boolean value that specifies whether the data connector is native to IoT TwinMaker.","Lambda":"The Lambda function associated with the data connector."}},"AWS::IoTTwinMaker::ComponentType.DataType":{"attributes":{},"description":"An object that specifies the data type of a property.","properties":{"AllowedValues":"The allowed values for this data type.","NestedType":"The nested type in the data type.","Relationship":"A relationship that associates a component with another component.","Type":"The underlying type of the data type.\\n\\nValid Values: `RELATIONSHIP | STRING | LONG | BOOLEAN | INTEGER | DOUBLE | LIST | MAP`","UnitOfMeasure":"The unit of measure used in this data type."}},"AWS::IoTTwinMaker::ComponentType.DataValue":{"attributes":{},"description":"An object that specifies a value for a property.","properties":{"BooleanValue":"A boolean value.","DoubleValue":"A double value.","Expression":"An expression that produces the value.","IntegerValue":"An integer value.","ListValue":"A list of multiple values.","LongValue":"A long value.","MapValue":"An object that maps strings to multiple `DataValue` objects.","RelationshipValue":"A value that relates a component to another component.","StringValue":"A string value."}},"AWS::IoTTwinMaker::ComponentType.Error":{"attributes":{},"description":"The component type error.","properties":{"Code":"The component type error code.","Message":"The component type error message."}},"AWS::IoTTwinMaker::ComponentType.Function":{"attributes":{},"description":"The function body.","properties":{"ImplementedBy":"The data connector.","RequiredProperties":"The required properties of the function.","Scope":"The scope of the function."}},"AWS::IoTTwinMaker::ComponentType.LambdaFunction":{"attributes":{},"description":"The Lambda function.","properties":{"Arn":"The Lambda function ARN."}},"AWS::IoTTwinMaker::ComponentType.PropertyDefinition":{"attributes":{},"description":"PropertyDefinition is an object that maps strings to the property definitions in the component type.","properties":{"Configurations":"A mapping that specifies configuration information about the property.","DataType":"","DefaultValue":"A boolean value that specifies whether the property ID comes from an external data store.","IsExternalId":"A boolean value that specifies whether the property ID comes from an external data store.","IsRequiredInEntity":"A boolean value that specifies whether the property is required in an entity.","IsStoredExternally":"A boolean value that specifies whether the property is stored externally.","IsTimeSeries":"A boolean value that specifies whether the property consists of time series data."}},"AWS::IoTTwinMaker::ComponentType.PropertyGroup":{"attributes":{},"description":"The property group.","properties":{"GroupType":"The group type.","PropertyNames":"The property names."}},"AWS::IoTTwinMaker::ComponentType.Relationship":{"attributes":{},"description":"An object that specifies a relationship with another component type.","properties":{"RelationshipType":"The type of the relationship.","TargetComponentTypeId":"The ID of the target component type associated with this relationship."}},"AWS::IoTTwinMaker::ComponentType.RelationshipValue":{"attributes":{},"description":"The component type relationship value.","properties":{"TargetComponentName":"The target component name.","TargetEntityId":"The target entity Id."}},"AWS::IoTTwinMaker::ComponentType.Status":{"attributes":{},"description":"The component type status.","properties":{"Error":"The component type error.","State":"The component type status state."}},"AWS::IoTTwinMaker::Entity":{"attributes":{"Arn":"The entity ARN.","CreationDateTime":"The date and time the entity was created.","HasChildEntities":"A boolean value that specifies whether the entity has child entities or not.","Ref":"`Ref` returns the workspace Id and the entity Id.","Status":"The entity status.","Status.Error":"The error.","Status.Error.Code":"The error code.","Status.Error.Message":"The error message.","Status.State":"The state ofthe entity, component type, or workspace.","UpdateDateTime":"The date and time when the component type was last updated."},"description":"Use the `AWS::IoTTwinMaker::Entity` resource to declare an entity.","properties":{"Components":"An object that maps strings to the components in the entity. Each string in the mapping must be unique to this object.\\n\\nFor information on the component object see the [component](https://docs.aws.amazon.com//iot-twinmaker/latest/apireference/API_ComponentResponse.html) API reference.","Description":"The description of the entity.","EntityId":"The entity ID.","EntityName":"The entity name.","ParentEntityId":"The ID of the parent entity.","Tags":"Metadata that you can use to manage the entity.","WorkspaceId":"The ID of the workspace."}},"AWS::IoTTwinMaker::Entity.Component":{"attributes":{},"description":"The entity component.","properties":{"ComponentName":"The name of the component.","ComponentTypeId":"The ID of the ComponentType.","DefinedIn":"The name of the property definition set in the request.","Description":"The description of the component.","Properties":"An object that maps strings to the properties to set in the component type. Each string in the mapping must be unique to this object.","PropertyGroups":"An object that maps strings to the property groups in the component type. Each string in the mapping must be unique to this object.","Status":"The status of the component."}},"AWS::IoTTwinMaker::Entity.DataType":{"attributes":{},"description":"The entity data type.","properties":{"AllowedValues":"The allowed values.","NestedType":"The nested type.","Relationship":"The relationship.","Type":"The entity type.","UnitOfMeasure":"The unit of measure."}},"AWS::IoTTwinMaker::Entity.DataValue":{"attributes":{},"description":"An object that specifies a value for a property.","properties":{"BooleanValue":"A boolean value.","DoubleValue":"A double value.","Expression":"An expression that produces the value.","IntegerValue":"An integer value.","ListValue":"A list of multiple values.","LongValue":"A long value.","MapValue":"An object that maps strings to multiple DataValue objects.","RelationshipValue":"A value that relates a component to another component.","StringValue":"A string value."}},"AWS::IoTTwinMaker::Entity.Definition":{"attributes":{},"description":"The entity definition.","properties":{"Configuration":"The configuration.","DataType":"The data type","DefaultValue":"The default value.","IsExternalId":"Displays if the entity has a external Id.","IsFinal":"Displays if the entity is final.","IsImported":"Displays if the entity is imported.","IsInherited":"Displays if the entity is inherited.","IsRequiredInEntity":"Displays if the entity is a required entity.","IsStoredExternally":"Displays if the entity is tored externally.","IsTimeSeries":"Displays if the entity"}},"AWS::IoTTwinMaker::Entity.Error":{"attributes":{},"description":"The entity error.","properties":{"Code":"The entity error code.","Message":"The entity error message."}},"AWS::IoTTwinMaker::Entity.Property":{"attributes":{},"description":"An object that sets information about a property.","properties":{"Definition":"An object that specifies information about a property.","Value":"An object that contains information about a value for a time series property."}},"AWS::IoTTwinMaker::Entity.PropertyGroup":{"attributes":{},"description":"The property group.","properties":{"GroupType":"The group type.","PropertyNames":"The property names."}},"AWS::IoTTwinMaker::Entity.Relationship":{"attributes":{},"description":"The entity relationship.","properties":{"RelationshipType":"The relationship type.","TargetComponentTypeId":"the component type Id target."}},"AWS::IoTTwinMaker::Entity.RelationshipValue":{"attributes":{},"description":"The entity relationship.","properties":{"TargetComponentName":"The target component name.","TargetEntityId":"The target entity Id."}},"AWS::IoTTwinMaker::Entity.Status":{"attributes":{},"description":"The current status of the entity.","properties":{"Error":"The error message.","State":"The current state of the entity, component, component type, or workspace.\\n\\nValid Values: `CREATING | UPDATING | DELETING | ACTIVE | ERROR`"}},"AWS::IoTTwinMaker::Scene":{"attributes":{"Arn":"The scene ARN.","CreationDateTime":"The date and time when the scene was created.","GeneratedSceneMetadata":"The generated scene metadata.","Ref":"`Ref` returns the workspace Id and the sence Id.","UpdateDateTime":"The scene the update time."},"description":"Use the `AWS::IoTTwinMaker::Scene` resource to declare a scene.","properties":{"Capabilities":"A list of capabilities that the scene uses to render.","ContentLocation":"The relative path that specifies the location of the content definition file.","Description":"The description of this scene.","SceneId":"The scene ID.","SceneMetadata":"The scene metadata.","Tags":"The ComponentType tags.","WorkspaceId":"The ID of the workspace."}},"AWS::IoTTwinMaker::SyncJob":{"attributes":{"Arn":"The SyncJob ARN.","CreationDateTime":"The creation date and time of the SyncJob.","Ref":"`Ref` returns the workspace Id and the entity Id.","State":"The SyncJob\'s state.","UpdateDateTime":"The update date and time."},"description":"The SyncJob.","properties":{"SyncRole":"The SyncJob IAM role. This IAM role is used by the sync job to read from the syncSource, and create, update or delete the corresponding resources.","SyncSource":"The sync source.\\n\\n> Currently the only supported syncSoucre is `SITEWISE` .","Tags":"Metadata you can use to manage the SyncJob.","WorkspaceId":"The ID of the workspace that contains the sync job."}},"AWS::IoTTwinMaker::Workspace":{"attributes":{"Arn":"The workspace ARN.","CreationDateTime":"The date and time the workspace was created.","Ref":"`Ref` returns the workspace Id and the entity Id.","UpdateDateTime":"The date and time the workspace was updated."},"description":"Use the `AWS::IoTTwinMaker::Workspace` resource to declare a workspace.","properties":{"Description":"The description of the workspace.","Role":"The ARN of the execution role associated with the workspace.","S3Location":"The ARN of the S3 bucket where resources associated with the workspace are stored.","Tags":"Metadata that you can use to manage the workspace.","WorkspaceId":"The ID of the workspace."}},"AWS::IoTWireless::Destination":{"attributes":{"Arn":"The ARN of the destination created.","Ref":"`Ref` returns the Destination name."},"description":"Creates a new destination that maps a device message to an AWS IoT rule.","properties":{"Description":"The description of the new resource. Maximum length is 2048 characters.","Expression":"The rule name to send messages to.","ExpressionType":"The type of value in `Expression` .","Name":"The name of the new resource.","RoleArn":"The ARN of the IAM Role that authorizes the destination.","Tags":"The tags are an array of key-value pairs to attach to the specified resource. Tags can have a minimum of 0 and a maximum of 50 items."}},"AWS::IoTWireless::DeviceProfile":{"attributes":{"Arn":"The ARN of the device profile created.","Id":"The ID of the device profile created.","Ref":"`Ref` returns the device profile ID."},"description":"Creates a new device profile.","properties":{"LoRaWAN":"LoRaWAN device profile object.","Name":"The name of the new resource.","Tags":"The tags are an array of key-value pairs to attach to the specified resource. Tags can have a minimum of 0 and a maximum of 50 items."}},"AWS::IoTWireless::DeviceProfile.LoRaWANDeviceProfile":{"attributes":{},"description":"LoRaWAN device profile object.","properties":{"ClassBTimeout":"The ClassBTimeout value.","ClassCTimeout":"The ClassCTimeout value.","FactoryPresetFreqsList":"The list of values that make up the FactoryPresetFreqs value. Valid range of values include a minimum value of 1000000 and a maximum value of 16700000.","MacVersion":"The MAC version (such as OTAA 1.1 or OTAA 1.0.3) to use with this device profile.","MaxDutyCycle":"The MaxDutyCycle value.","MaxEirp":"The MaxEIRP value.","PingSlotDr":"The PingSlotDR value.","PingSlotFreq":"The PingSlotFreq value.","PingSlotPeriod":"The PingSlotPeriod value.","RegParamsRevision":"The version of regional parameters.","RfRegion":"The frequency band (RFRegion) value.","RxDataRate2":"The RXDataRate2 value.","RxDelay1":"The RXDelay1 value.","RxDrOffset1":"The RXDROffset1 value.","RxFreq2":"The RXFreq2 value.","Supports32BitFCnt":"The Supports32BitFCnt value.","SupportsClassB":"The SupportsClassB value.","SupportsClassC":"The SupportsClassC value.","SupportsJoin":"The SupportsJoin value."}},"AWS::IoTWireless::FuotaTask":{"attributes":{"Arn":"The ARN of a FUOTA task","FuotaTaskStatus":"The status of a FUOTA task.","Id":"The ID of a FUOTA task.","LoRaWAN.StartTime":"Start time of a FUOTA task.","Ref":"`Ref` returns the FUOTA task."},"description":"A FUOTA task.","properties":{"AssociateMulticastGroup":"The ID of the multicast group to associate with a FUOTA task.","AssociateWirelessDevice":"The ID of the wireless device to associate with a multicast group.","Description":"The description of the new resource.","DisassociateMulticastGroup":"The ID of the multicast group to disassociate from a FUOTA task.","DisassociateWirelessDevice":"The ID of the wireless device to disassociate from a FUOTA task.","FirmwareUpdateImage":"The S3 URI points to a firmware update image that is to be used with a FUOTA task.","FirmwareUpdateRole":"The firmware update role that is to be used with a FUOTA task.","LoRaWAN":"The LoRaWAN information used with a FUOTA task.","Name":"The name of a FUOTA task.","Tags":"The tags are an array of key-value pairs to attach to the specified resource. Tags can have a minimum of 0 and a maximum of 50 items."}},"AWS::IoTWireless::FuotaTask.LoRaWAN":{"attributes":{},"description":"The LoRaWAN information used with a FUOTA task.","properties":{"RfRegion":"The frequency band (RFRegion) value.","StartTime":"Start time of a FUOTA task."}},"AWS::IoTWireless::MulticastGroup":{"attributes":{"Arn":"The ARN of the multicast group.","Id":"The ID of the multicast group.","LoRaWAN.NumberOfDevicesInGroup":"The number of devices that are associated to the multicast group.","LoRaWAN.NumberOfDevicesRequested":"The number of devices that are requested to be associated with the multicast group.","Ref":"`Ref` returns the multicast group.","Status":"The status of a multicast group."},"description":"A multicast group.","properties":{"AssociateWirelessDevice":"The ID of the wireless device to associate with a multicast group.","Description":"The description of the multicast group.","DisassociateWirelessDevice":"The ID of the wireless device to disassociate from a multicast group.","LoRaWAN":"The LoRaWAN information that is to be used with the multicast group.","Name":"The name of the multicast group.","Tags":"The tags are an array of key-value pairs to attach to the specified resource. Tags can have a minimum of 0 and a maximum of 50 items."}},"AWS::IoTWireless::MulticastGroup.LoRaWAN":{"attributes":{},"description":"The LoRaWAN information that is to be used with the multicast group.","properties":{"DlClass":"DlClass for LoRaWAN. Valid values are ClassB and ClassC.","NumberOfDevicesInGroup":"Number of devices that are associated to the multicast group.","NumberOfDevicesRequested":"Number of devices that are requested to be associated with the multicast group.","RfRegion":"The frequency band (RFRegion) value."}},"AWS::IoTWireless::NetworkAnalyzerConfiguration":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the resource.","Ref":"`Ref` returns the network analyzer configuration."},"description":"Network analyzer configuration.","properties":{"Description":"The description of the resource.","Name":"Name of the network analyzer configuration.","Tags":"The tags to attach to the specified resource. Tags are metadata that you can use to manage a resource.","TraceContent":"Trace content for your wireless gateway and wireless device resources.","WirelessDevices":"Wireless device resources to add to the network analyzer configuration. Provide the `WirelessDeviceId` of the resource to add in the input array.","WirelessGateways":"Wireless gateway resources to add to the network analyzer configuration. Provide the `WirelessGatewayId` of the resource to add in the input array."}},"AWS::IoTWireless::NetworkAnalyzerConfiguration.TraceContent":{"attributes":{},"description":"Trace content for your wireless gateway and wireless device resources.","properties":{"LogLevel":"The log level for a log message. The log levels can be disabled, or set to `ERROR` to display less verbose logs containing only error information, or to `INFO` for more detailed logs","WirelessDeviceFrameInfo":"`FrameInfo` of your wireless device resources for the trace content. Use FrameInfo to debug the communication between your LoRaWAN end devices and the network server."}},"AWS::IoTWireless::PartnerAccount":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the resource.","Ref":"`Ref` returns the partner account.","SidewalkResponse":"The Sidewalk account credentials."},"description":"A partner account. If `PartnerAccountId` and `PartnerType` are `null` , returns all partner accounts.","properties":{"PartnerAccountId":"The ID of the partner account to update.","Sidewalk":"The Sidewalk account credentials.","Tags":"The tags are an array of key-value pairs to attach to the specified resource. Tags can have a minimum of 0 and a maximum of 50 items."}},"AWS::IoTWireless::PartnerAccount.SidewalkAccountInfo":{"attributes":{},"description":"Information about a Sidewalk account.","properties":{"AppServerPrivateKey":"The Sidewalk application server private key. The application server private key is a secret key, which you should handle in a similar way as you would an application password. You can protect the application server private key by storing the value in the AWS Secrets Manager and use the [secretsmanager](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) to reference this value."}},"AWS::IoTWireless::PartnerAccount.SidewalkAccountInfoWithFingerprint":{"attributes":{},"description":"Information about a Sidewalk account.","properties":{"AmazonId":"The Sidewalk Amazon ID.","Arn":"The Amazon Resource Name (ARN) of the resource.","Fingerprint":"The fingerprint of the Sidewalk application server private key."}},"AWS::IoTWireless::PartnerAccount.SidewalkUpdateAccount":{"attributes":{},"description":"Sidewalk update.","properties":{"AppServerPrivateKey":"The new Sidewalk application server private key."}},"AWS::IoTWireless::ServiceProfile":{"attributes":{"Arn":"The ARN of the service profile created.","Id":"The ID of the service profile created.","LoRaWAN.ChannelMask":"The ChannelMask value.","LoRaWAN.DevStatusReqFreq":"The DevStatusReqFreq value.","LoRaWAN.DlBucketSize":"The DLBucketSize value.","LoRaWAN.DlRate":"The DLRate value.","LoRaWAN.DlRatePolicy":"The DLRatePolicy value.","LoRaWAN.DrMax":"The DRMax value.","LoRaWAN.DrMin":"The DRMin value.","LoRaWAN.HrAllowed":"The HRAllowed value that describes whether handover roaming is allowed.","LoRaWAN.MinGwDiversity":"The MinGwDiversity value.","LoRaWAN.NwkGeoLoc":"The NwkGeoLoc value.","LoRaWAN.PrAllowed":"The PRAllowed value that describes whether passive roaming is allowed.","LoRaWAN.RaAllowed":"The RAAllowed value that describes whether roaming activation is allowed.","LoRaWAN.ReportDevStatusBattery":"The ReportDevStatusBattery value.","LoRaWAN.ReportDevStatusMargin":"The ReportDevStatusMargin value.","LoRaWAN.TargetPer":"The TargetPer value.","LoRaWAN.UlBucketSize":"The UlBucketSize value.","LoRaWAN.UlRate":"The ULRate value.","LoRaWAN.UlRatePolicy":"The ULRatePolicy value.","Ref":"`Ref` returns the service profile ID."},"description":"Creates a new service profile.","properties":{"LoRaWAN":"LoRaWAN service profile object.","Name":"The name of the new resource.","Tags":"The tags are an array of key-value pairs to attach to the specified resource. Tags can have a minimum of 0 and a maximum of 50 items."}},"AWS::IoTWireless::ServiceProfile.LoRaWANServiceProfile":{"attributes":{},"description":"LoRaWANServiceProfile object.","properties":{"AddGwMetadata":"The AddGWMetaData value.","ChannelMask":"The ChannelMask value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","DevStatusReqFreq":"The DevStatusReqFreq value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","DlBucketSize":"The DLBucketSize value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","DlRate":"The DLRate value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","DlRatePolicy":"The DLRatePolicy value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","DrMax":"The DRMax value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","DrMin":"The DRMin value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","HrAllowed":"The HRAllowed value that describes whether handover roaming is allowed.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","MinGwDiversity":"The MinGwDiversity value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","NwkGeoLoc":"The NwkGeoLoc value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","PrAllowed":"The PRAllowed value that describes whether passive roaming is allowed.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","RaAllowed":"The RAAllowed value that describes whether roaming activation is allowed.","ReportDevStatusBattery":"The ReportDevStatusBattery value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","ReportDevStatusMargin":"The ReportDevStatusMargin value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","TargetPer":"The TargetPer value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","UlBucketSize":"The UlBucketSize value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","UlRate":"The ULRate value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`","UlRatePolicy":"The ULRatePolicy value.\\n\\nThis property is `ReadOnly` and can\'t be inputted for create. It\'s returned with `Fn::GetAtt`"}},"AWS::IoTWireless::TaskDefinition":{"attributes":{"Arn":"The Amazon Resource Name of the resource.","Id":"The ID of the new wireless gateway task definition.","Ref":"`Ref` returns the task definition."},"description":"Creates a gateway task definition.","properties":{"AutoCreateTasks":"Whether to automatically create tasks using this task definition for all gateways with the specified current version. If `false` , the task must be created by calling `CreateWirelessGatewayTask` .","Name":"The name of the new resource.","Tags":"The tags are an array of key-value pairs to attach to the specified resource. Tags can have a minimum of 0 and a maximum of 50 items.","Update":"Information about the gateways to update."}},"AWS::IoTWireless::TaskDefinition.LoRaWANGatewayVersion":{"attributes":{},"description":"LoRaWANGatewayVersion object.","properties":{"Model":"The model number of the wireless gateway.","PackageVersion":"The version of the wireless gateway firmware.","Station":"The basic station version of the wireless gateway."}},"AWS::IoTWireless::TaskDefinition.LoRaWANUpdateGatewayTaskCreate":{"attributes":{},"description":"The signature used to verify the update firmware.","properties":{"CurrentVersion":"The version of the gateways that should receive the update.","SigKeyCrc":"The CRC of the signature private key to check.","UpdateSignature":"The signature used to verify the update firmware.","UpdateVersion":"The firmware version to update the gateway to."}},"AWS::IoTWireless::TaskDefinition.LoRaWANUpdateGatewayTaskEntry":{"attributes":{},"description":"LoRaWANUpdateGatewayTaskEntry object.","properties":{"CurrentVersion":"The version of the gateways that should receive the update.","UpdateVersion":"The firmware version to update the gateway to."}},"AWS::IoTWireless::TaskDefinition.UpdateWirelessGatewayTaskCreate":{"attributes":{},"description":"UpdateWirelessGatewayTaskCreate object.","properties":{"LoRaWAN":"The properties that relate to the LoRaWAN wireless gateway.","UpdateDataRole":"The IAM role used to read data from the S3 bucket.","UpdateDataSource":"The link to the S3 bucket."}},"AWS::IoTWireless::WirelessDevice":{"attributes":{"Arn":"The ARN of the wireless device created.","Id":"The ID of the wireless device created.","Ref":"`Ref` returns the wireless device ID.","ThingName":"The name of the thing associated with the wireless device. The value is empty if a thing isn\'t associated with the device."},"description":"Provisions a wireless device.","properties":{"Description":"The description of the new resource. Maximum length is 2048.","DestinationName":"The name of the destination to assign to the new wireless device. Can have only have alphanumeric, - (hyphen) and _ (underscore) characters and it can\'t have any spaces.","LastUplinkReceivedAt":"The date and time when the most recent uplink was received.","LoRaWAN":"The device configuration information to use to create the wireless device. Must be at least one of OtaaV10x, OtaaV11, AbpV11, or AbpV10x.","Name":"The name of the new resource.","Tags":"The tags are an array of key-value pairs to attach to the specified resource. Tags can have a minimum of 0 and a maximum of 50 items.","ThingArn":"The ARN of the thing to associate with the wireless device.","Type":"The wireless device type."}},"AWS::IoTWireless::WirelessDevice.AbpV10x":{"attributes":{},"description":"ABP device object for LoRaWAN specification v1.0.x.","properties":{"DevAddr":"The DevAddr value.","SessionKeys":"Session keys for ABP v1.0.x"}},"AWS::IoTWireless::WirelessDevice.AbpV11":{"attributes":{},"description":"ABP device object for create APIs for v1.1.","properties":{"DevAddr":"The DevAddr value.","SessionKeys":"Session keys for ABP v1.1."}},"AWS::IoTWireless::WirelessDevice.LoRaWANDevice":{"attributes":{},"description":"LoRaWAN object for create functions.","properties":{"AbpV10x":"LoRaWAN object for create APIs.","AbpV11":"ABP device object for create APIs for v1.1.","DevEui":"The DevEUI value.","DeviceProfileId":"The ID of the device profile for the new wireless device.","OtaaV10x":"OTAA device object for create APIs for v1.0.x","OtaaV11":"OTAA device object for v1.1 for create APIs.","ServiceProfileId":"The ID of the service profile."}},"AWS::IoTWireless::WirelessDevice.OtaaV10x":{"attributes":{},"description":"OTAA device object for create APIs for v1.0.x.","properties":{"AppEui":"The AppEUI value, with pattern of `[a-fA-F0-9]{16}` .","AppKey":"The AppKey is a secret key, which you should handle in a similar way as you would an application password. You can protect the AppKey value by storing it in the AWS Secrets Manager and use the [secretsmanager](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) to reference this value."}},"AWS::IoTWireless::WirelessDevice.OtaaV11":{"attributes":{},"description":"OTAA device object for v1.1 for create APIs.","properties":{"AppKey":"The AppKey is a secret key, which you should handle in a similar way as you would an application password. You can protect the AppKey value by storing it in the AWS Secrets Manager and use the [secretsmanager](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) to reference this value.","JoinEui":"The JoinEUI value.","NwkKey":"The NwkKey is a secret key, which you should handle in a similar way as you would an application password. You can protect the NwkKey value by storing it in the AWS Secrets Manager and use the [secretsmanager](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) to reference this value."}},"AWS::IoTWireless::WirelessDevice.SessionKeysAbpV10x":{"attributes":{},"description":"LoRaWAN object for create APIs.","properties":{"AppSKey":"The AppSKey is a secret key, which you should handle in a similar way as you would an application password. You can protect the AppSKey value by storing it in the AWS Secrets Manager and use the [secretsmanager](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) to reference this value.","NwkSKey":"The NwkSKey is a secret key, which you should handle in a similar way as you would an application password. You can protect the NwkSKey value by storing it in the AWS Secrets Manager and use the [secretsmanager](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) to reference this value."}},"AWS::IoTWireless::WirelessDevice.SessionKeysAbpV11":{"attributes":{},"description":"Session keys for ABP v1.1.","properties":{"AppSKey":"The AppSKey is a secret key, which you should handle in a similar way as you would an application password. You can protect the AppSKey value by storing it in the AWS Secrets Manager and use the [secretsmanager](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) to reference this value.","FNwkSIntKey":"The FNwkSIntKey is a secret key, which you should handle in a similar way as you would an application password. You can protect the FNwkSIntKey value by storing it in the AWS Secrets Manager and use the [secretsmanager](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) to reference this value.","NwkSEncKey":"The NwkSEncKey is a secret key, which you should handle in a similar way as you would an application password. You can protect the NwkSEncKey value by storing it in the AWS Secrets Manager and use the [secretsmanager](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) to reference this value.","SNwkSIntKey":"The SNwkSIntKey is a secret key, which you should handle in a similar way as you would an application password. You can protect the SNwkSIntKey value by storing it in the AWS Secrets Manager and use the [secretsmanager](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager) to reference this value."}},"AWS::IoTWireless::WirelessDeviceImportTask":{"attributes":{"Arn":"The ARN (Amazon Resource Name) of the import task.","CreationDate":"The date and time at which the wireless device import task was created.","FailedImportedDevicesCount":"The summary information of count of wireless devices that failed to onboard to the import task.","Id":"The import task ID.","InitializedImportedDevicesCount":"The summary information of count of wireless devices that are waiting for the control log to be added to an import task.","OnboardedImportedDevicesCount":"The summary information of count of wireless devices that have been onboarded to the import task.","PendingImportedDevicesCount":"The summary information of count of wireless devices that are waiting in the queue to be onboarded to the import task.","Ref":"`Ref` returns the wireless device import task.","Sidewalk.DeviceCreationFileList":"","Status":"The status of a wireless device import task. The status can be `INITIALIZING` , `INITIALIZED` , `PENDING` , `COMPLETE` , `FAILED` , or `DELETING` .","StatusReason":"The reason that provides additional information about the import task status."},"description":"Information about an import task for wireless devices. When creating the resource, either create a single wireless device import task using the Sidewalk manufacturing serial number (SMSN) of the wireless device, or create an import task for multiple devices by specifying both the `DeviceCreationFile` and the `Role` .","properties":{"DestinationName":"The name of the destination that describes the IoT rule to route messages from the Sidewalk devices in the import task to other applications.","Sidewalk":"The Sidewalk-related information of the wireless device import task.","Tags":"Adds to or modifies the tags of the given resource. Tags are metadata that you can use to manage a resource."}},"AWS::IoTWireless::WirelessDeviceImportTask.Sidewalk":{"attributes":{},"description":"Sidewalk-related information about a wireless device import task.","properties":{"DeviceCreationFile":"The CSV file contained in an S3 bucket that\'s used for adding devices to an import task.","DeviceCreationFileList":"List of Sidewalk devices that are added to the import task.","Role":"The IAM role that allows AWS IoT Wireless to access the CSV file in the S3 bucket.","SidewalkManufacturingSn":"The Sidewalk manufacturing serial number (SMSN) of the Sidewalk device."}},"AWS::IoTWireless::WirelessGateway":{"attributes":{"Arn":"The ARN of the wireless gateway created.","Id":"The ID of the wireless gateway created.","Ref":"`Ref` returns the wireless gateway ID."},"description":"Provisions a wireless gateway.","properties":{"Description":"The description of the new resource. The maximum length is 2048 characters.","LastUplinkReceivedAt":"The date and time when the most recent uplink was received.","LoRaWAN":"The gateway configuration information to use to create the wireless gateway.","Name":"The name of the new resource.","Tags":"The tags are an array of key-value pairs to attach to the specified resource. Tags can have a minimum of 0 and a maximum of 50 items.","ThingArn":"The ARN of the thing to associate with the wireless gateway.","ThingName":"The name of the thing associated with the wireless gateway. The value is empty if a thing isn\'t associated with the gateway."}},"AWS::IoTWireless::WirelessGateway.LoRaWANGateway":{"attributes":{},"description":"LoRaWAN wireless gateway object.","properties":{"GatewayEui":"The gateway\'s EUI value.","RfRegion":"The frequency band (RFRegion) value."}},"AWS::KMS::Alias":{"attributes":{"Ref":"`Ref` returns the alias name, such as `alias/exampleAlias` ."},"description":"The `AWS::KMS::Alias` resource specifies a display name for a [KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys) . You can use an alias to identify a KMS key in the AWS KMS console, in the [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) operation, and in [cryptographic operations](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations) , such as [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) and [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) .\\n\\n> Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see [ABAC for AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/abac.html) in the *AWS Key Management Service Developer Guide* . \\n\\nUsing an alias to refer to a KMS key can help you simplify key management. For example, an alias in your code can be associated with different KMS keys in different AWS Regions . For more information, see [Using aliases](https://docs.aws.amazon.com/kms/latest/developerguide/kms-alias.html) in the *AWS Key Management Service Developer Guide* .\\n\\nWhen specifying an alias, observe the following rules.\\n\\n- Each alias is associated with one KMS key, but multiple aliases can be associated with the same KMS key.\\n- The alias and its associated KMS key must be in the same AWS account and Region.\\n- The alias name must be unique in the AWS account and Region. However, you can create aliases with the same name in different AWS Regions . For example, you can have an `alias/projectKey` in multiple Regions, each of which is associated with a KMS key in its Region.\\n- Each alias name must begin with `alias/` followed by a name, such as `alias/exampleKey` . The alias name can contain only alphanumeric characters, forward slashes (/), underscores (_), and dashes (-). Alias names cannot begin with `alias/aws/` . That alias name prefix is reserved for [AWS managed keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) .\\n\\n*Regions*\\n\\nAWS KMS CloudFormation resources are available in all AWS Regions in which AWS KMS and AWS CloudFormation are supported.","properties":{"AliasName":"Specifies the alias name. This value must begin with `alias/` followed by a name, such as `alias/ExampleAlias` .\\n\\n> If you change the value of the `AliasName` property, the existing alias is deleted and a new alias is created for the specified KMS key. This change can disrupt applications that use the alias. It can also allow or deny access to a KMS key affected by attribute-based access control (ABAC). \\n\\nThe alias must be string of 1-256 characters. It can contain only alphanumeric characters, forward slashes (/), underscores (_), and dashes (-). The alias name cannot begin with `alias/aws/` . The `alias/aws/` prefix is reserved for [AWS managed keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) .\\n\\n*Pattern* : `^alias/[a-zA-Z0-9/_-]+$`\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `256`","TargetKeyId":"Associates the alias with the specified [customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) . The KMS key must be in the same AWS account and Region.\\n\\nA valid key ID is required. If you supply a null or empty string value, this operation returns an error.\\n\\nFor help finding the key ID and ARN, see [Finding the key ID and ARN](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html#find-cmk-id-arn) in the *AWS Key Management Service Developer Guide* .\\n\\nSpecify the key ID or the key ARN of the KMS key.\\n\\nFor example:\\n\\n- Key ID: `1234abcd-12ab-34cd-56ef-1234567890ab`\\n- Key ARN: `arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab`\\n\\nTo get the key ID and key ARN for a KMS key, use [ListKeys](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListKeys.html) or [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) ."}},"AWS::KMS::Key":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the KMS key, such as `arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab` .\\n\\nFor information about the key ARN of a KMS key, see [Key ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN) in the *AWS Key Management Service Developer Guide* .","KeyId":"The key ID of the KMS key, such as `1234abcd-12ab-34cd-56ef-1234567890ab` .\\n\\nFor information about the key ID of a KMS key, see [Key ID](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id) in the *AWS Key Management Service Developer Guide* .","Ref":"`Ref` returns the key ID, such as `1234abcd-12ab-34cd-56ef-1234567890ab` ."},"description":"The `AWS::KMS::Key` resource specifies an [KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys) in AWS Key Management Service . You can use this resource to create symmetric encryption KMS keys, asymmetric KMS keys for encryption or signing, and symmetric HMAC KMS keys. You can use `AWS::KMS::Key` to create [multi-Region primary keys](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html#mrk-primary-key) of all supported types. To replicate a multi-Region key, use the `AWS::KMS::ReplicaKey` resource.\\n\\n> If you change the value of the `KeySpec` , `KeyUsage` , or `MultiRegion` properties of an existing KMS key, the update request fails, regardless of the value of the [`UpdateReplacePolicy` attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html) . This prevents you from accidentally deleting a KMS key by changing any of its immutable property values. > AWS KMS replaced the term *customer master key (CMK)* with *AWS KMS key* and *KMS key* . The concept has not changed. To prevent breaking changes, AWS KMS is keeping some variations of this term. \\n\\nYou can use symmetric encryption KMS keys to encrypt and decrypt small amounts of data, but they are more commonly used to generate data keys and data key pairs. You can also use a symmetric encryption KMS key to encrypt data stored in AWS services that are [integrated with AWS KMS](https://docs.aws.amazon.com//kms/features/#AWS_Service_Integration) . For more information, see [Symmetric encryption KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks) in the *AWS Key Management Service Developer Guide* .\\n\\nYou can use asymmetric KMS keys to encrypt and decrypt data or sign messages and verify signatures. To create an asymmetric key, you must specify an asymmetric `KeySpec` value and a `KeyUsage` value. For details, see [Asymmetric keys in AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html) in the *AWS Key Management Service Developer Guide* .\\n\\nYou can use HMAC KMS keys (which are also symmetric keys) to generate and verify hash-based message authentication codes. To create an HMAC key, you must specify an HMAC `KeySpec` value and a `KeyUsage` value of `GENERATE_VERIFY_MAC` . For details, see [HMAC keys in AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/hmac.html) in the *AWS Key Management Service Developer Guide* .\\n\\nYou can also create symmetric encryption, asymmetric, and HMAC multi-Region primary keys. To create a multi-Region primary key, set the `MultiRegion` property to `true` . For information about multi-Region keys, see [Multi-Region keys in AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) in the *AWS Key Management Service Developer Guide* .\\n\\nYou cannot use the `AWS::KMS::Key` resource to specify a KMS key with [imported key material](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html) or a KMS key in a [custom key store](https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html) .\\n\\n*Regions*\\n\\nAWS KMS CloudFormation resources are available in all Regions in which AWS KMS and AWS CloudFormation are supported. You can use the `AWS::KMS::Key` resource to create and manage all KMS key types that are supported in a Region.","properties":{"Description":"A description of the KMS key. Use a description that helps you to distinguish this KMS key from others in the account, such as its intended use.","EnableKeyRotation":"Enables automatic rotation of the key material for the specified KMS key. By default, automatic key rotation is not enabled.\\n\\nAWS KMS supports automatic rotation only for symmetric encryption KMS keys ( `KeySpec` = `SYMMETRIC_DEFAULT` ). For asymmetric KMS keys and HMAC KMS keys, omit the `EnableKeyRotation` property or set it to `false` .\\n\\nTo enable automatic key rotation of the key material for a multi-Region KMS key, set `EnableKeyRotation` to `true` on the primary key (created by using `AWS::KMS::Key` ). AWS KMS copies the rotation status to all replica keys. For details, see [Rotating multi-Region keys](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-manage.html#multi-region-rotate) in the *AWS Key Management Service Developer Guide* .\\n\\nWhen you enable automatic rotation, AWS KMS automatically creates new key material for the KMS key one year after the enable date and every year thereafter. AWS KMS retains all key material until you delete the KMS key. For detailed information about automatic key rotation, see [Rotating KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html) in the *AWS Key Management Service Developer Guide* .","Enabled":"Specifies whether the KMS key is enabled. Disabled KMS keys cannot be used in cryptographic operations.\\n\\nWhen `Enabled` is `true` , the *key state* of the KMS key is `Enabled` . When `Enabled` is `false` , the key state of the KMS key is `Disabled` . The default value is `true` .\\n\\nThe actual key state of the KMS key might be affected by actions taken outside of CloudFormation, such as running the [EnableKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_EnableKey.html) , [DisableKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DisableKey.html) , or [ScheduleKeyDeletion](https://docs.aws.amazon.com/kms/latest/APIReference/API_ScheduleKeyDeletion.html) operations.\\n\\nFor information about the key states of a KMS key, see [Key state: Effect on your KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html) in the *AWS Key Management Service Developer Guide* .","KeyPolicy":"The key policy that authorizes use of the KMS key. The key policy must conform to the following rules.\\n\\n- The key policy must allow the caller to make a subsequent [PutKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html) request on the KMS key. This reduces the risk that the KMS key becomes unmanageable. For more information, refer to the scenario in the [Default key policy](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-root-enable-iam) section of the **AWS Key Management Service Developer Guide** .\\n- Each statement in the key policy must contain one or more principals. The principals in the key policy must exist and be visible to AWS KMS . When you create a new AWS principal (for example, an IAM user or role), you might need to enforce a delay before including the new principal in a key policy because the new principal might not be immediately visible to AWS KMS . For more information, see [Changes that I make are not always immediately visible](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency) in the *AWS Identity and Access Management User Guide* .\\n\\nIf you are unsure of which policy to use, consider the *default key policy* . This is the key policy that AWS KMS applies to KMS keys that are created by using the CreateKey API with no specified key policy. It gives the AWS account that owns the key permission to perform all operations on the key. It also allows you write IAM policies to authorize access to the key. For details, see [Default key policy](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default) in the *AWS Key Management Service Developer Guide* .\\n\\nA key policy document can include only the following characters:\\n\\n- Printable ASCII characters\\n- Printable characters in the Basic Latin and Latin-1 Supplement character set\\n- The tab ( `\\\\u0009` ), line feed ( `\\\\u000A` ), and carriage return ( `\\\\u000D` ) special characters\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `32768`","KeySpec":"Specifies the type of KMS key to create. The default value, `SYMMETRIC_DEFAULT` , creates a KMS key with a 256-bit symmetric key for encryption and decryption. In China Regions, `SYMMETRIC_DEFAULT` creates a 128-bit symmetric key that uses SM4 encryption. You can\'t change the `KeySpec` value after the KMS key is created. For help choosing a key spec for your KMS key, see [Choosing a KMS key type](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-choose.html) in the *AWS Key Management Service Developer Guide* .\\n\\nThe `KeySpec` property determines the type of key material in the KMS key and the algorithms that the KMS key supports. To further restrict the algorithms that can be used with the KMS key, use a condition key in its key policy or IAM policy. For more information, see [AWS KMS condition keys](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms) in the *AWS Key Management Service Developer Guide* .\\n\\n> If you change the value of the `KeySpec` property on an existing KMS key, the update request fails, regardless of the value of the [`UpdateReplacePolicy` attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html) . This prevents you from accidentally deleting a KMS key by changing an immutable property value. > [AWS services that are integrated with AWS KMS](https://docs.aws.amazon.com/kms/features/#AWS_Service_Integration) use symmetric encryption KMS keys to protect your data. These services do not support encryption with asymmetric KMS keys. For help determining whether a KMS key is asymmetric, see [Identifying asymmetric KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/find-symm-asymm.html) in the *AWS Key Management Service Developer Guide* . \\n\\nAWS KMS supports the following key specs for KMS keys:\\n\\n- Symmetric encryption key (default)\\n\\n- `SYMMETRIC_DEFAULT` (AES-256-GCM)\\n- HMAC keys (symmetric)\\n\\n- `HMAC_224`\\n- `HMAC_256`\\n- `HMAC_384`\\n- `HMAC_512`\\n- Asymmetric RSA key pairs\\n\\n- `RSA_2048`\\n- `RSA_3072`\\n- `RSA_4096`\\n- Asymmetric NIST-recommended elliptic curve key pairs\\n\\n- `ECC_NIST_P256` (secp256r1)\\n- `ECC_NIST_P384` (secp384r1)\\n- `ECC_NIST_P521` (secp521r1)\\n- Other asymmetric elliptic curve key pairs\\n\\n- `ECC_SECG_P256K1` (secp256k1), commonly used for cryptocurrencies.\\n- SM2 key pairs (China Regions only)\\n\\n- `SM2`","KeyUsage":"Determines the [cryptographic operations](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations) for which you can use the KMS key. The default value is `ENCRYPT_DECRYPT` . This property is required for asymmetric KMS keys and HMAC KMS keys. You can\'t change the `KeyUsage` value after the KMS key is created.\\n\\n> If you change the value of the `KeyUsage` property on an existing KMS key, the update request fails, regardless of the value of the [`UpdateReplacePolicy` attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html) . This prevents you from accidentally deleting a KMS key by changing an immutable property value. \\n\\nSelect only one valid value.\\n\\n- For symmetric encryption KMS keys, omit the property or specify `ENCRYPT_DECRYPT` .\\n- For asymmetric KMS keys with RSA key material, specify `ENCRYPT_DECRYPT` or `SIGN_VERIFY` .\\n- For asymmetric KMS keys with ECC key material, specify `SIGN_VERIFY` .\\n- For asymmetric KMS keys with SM2 (China Regions only) key material, specify `ENCRYPT_DECRYPT` or `SIGN_VERIFY` .\\n- For HMAC KMS keys, specify `GENERATE_VERIFY_MAC` .","MultiRegion":"Creates a multi-Region primary key that you can replicate in other AWS Regions . You can\'t change the `MultiRegion` value after the KMS key is created.\\n\\nFor a list of AWS Regions in which multi-Region keys are supported, see [Multi-Region keys in AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) in the ** .\\n\\n> If you change the value of the `MultiRegion` property on an existing KMS key, the update request fails, regardless of the value of the [`UpdateReplacePolicy` attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html) . This prevents you from accidentally deleting a KMS key by changing an immutable property value. \\n\\nFor a multi-Region key, set to this property to `true` . For a single-Region key, omit this property or set it to `false` . The default value is `false` .\\n\\n*Multi-Region keys* are an AWS KMS feature that lets you create multiple interoperable KMS keys in different AWS Regions . Because these KMS keys have the same key ID, key material, and other metadata, you can use them to encrypt data in one AWS Region and decrypt it in a different AWS Region without making a cross-Region call or exposing the plaintext data. For more information, see [Multi-Region keys](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) in the *AWS Key Management Service Developer Guide* .\\n\\nYou can create a symmetric encryption, HMAC, or asymmetric multi-Region KMS key, and you can create a multi-Region key with imported key material. However, you cannot create a multi-Region key in a custom key store.\\n\\nTo create a replica of this primary key in a different AWS Region , create an [AWS::KMS::ReplicaKey](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-replicakey.html) resource in a CloudFormation stack in the replica Region. Specify the key ARN of this primary key.","PendingWindowInDays":"Specifies the number of days in the waiting period before AWS KMS deletes a KMS key that has been removed from a CloudFormation stack. Enter a value between 7 and 30 days. The default value is 30 days.\\n\\nWhen you remove a KMS key from a CloudFormation stack, AWS KMS schedules the KMS key for deletion and starts the mandatory waiting period. The `PendingWindowInDays` property determines the length of waiting period. During the waiting period, the key state of KMS key is `Pending Deletion` or `Pending Replica Deletion` , which prevents the KMS key from being used in cryptographic operations. When the waiting period expires, AWS KMS permanently deletes the KMS key.\\n\\nAWS KMS will not delete a [multi-Region primary key](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) that has replica keys. If you remove a multi-Region primary key from a CloudFormation stack, its key state changes to `PendingReplicaDeletion` so it cannot be replicated or used in cryptographic operations. This state can persist indefinitely. When the last of its replica keys is deleted, the key state of the primary key changes to `PendingDeletion` and the waiting period specified by `PendingWindowInDays` begins. When this waiting period expires, AWS KMS deletes the primary key. For details, see [Deleting multi-Region keys](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-delete.html) in the *AWS Key Management Service Developer Guide* .\\n\\nYou cannot use a CloudFormation template to cancel deletion of the KMS key after you remove it from the stack, regardless of the waiting period. If you specify a KMS key in your template, even one with the same name, CloudFormation creates a new KMS key. To cancel deletion of a KMS key, use the AWS KMS console or the [CancelKeyDeletion](https://docs.aws.amazon.com/kms/latest/APIReference/API_CancelKeyDeletion.html) operation.\\n\\nFor information about the `Pending Deletion` and `Pending Replica Deletion` key states, see [Key state: Effect on your KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html) in the *AWS Key Management Service Developer Guide* . For more information about deleting KMS keys, see the [ScheduleKeyDeletion](https://docs.aws.amazon.com/kms/latest/APIReference/API_ScheduleKeyDeletion.html) operation in the *AWS Key Management Service API Reference* and [Deleting KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html) in the *AWS Key Management Service Developer Guide* .\\n\\n*Minimum* : 7\\n\\n*Maximum* : 30","Tags":"Assigns one or more tags to the replica key.\\n\\n> Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see [ABAC for AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/abac.html) in the *AWS Key Management Service Developer Guide* . \\n\\nFor information about tags in AWS KMS , see [Tagging keys](https://docs.aws.amazon.com/kms/latest/developerguide/tagging-keys.html) in the *AWS Key Management Service Developer Guide* . For information about tags in CloudFormation, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::KMS::ReplicaKey":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the replica key, such as `arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab` .\\n\\nThe key ARNs of related multi-Region keys differ only in the Region value. For information about the key ARNs of multi-Region keys, see [How multi-Region keys work](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html#mrk-how-it-works) in the *AWS Key Management Service Developer Guide* .","KeyId":"The key ID of the replica key, such as `mrk-1234abcd12ab34cd56ef1234567890ab` .\\n\\nRelated multi-Region keys have the same key ID. For information about the key IDs of multi-Region keys, see [How multi-Region keys work](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html#mrk-how-it-works) in the *AWS Key Management Service Developer Guide* .","Ref":"`Ref` returns the key ID, such as `mrk-1234abcd12ab34cd56ef1234567890ab` ."},"description":"The `AWS::KMS::ReplicaKey` resource specifies a multi-Region replica key that is based on a multi-Region primary key.\\n\\n*Multi-Region keys* are an AWS KMS feature that lets you create multiple interoperable KMS keys in different AWS Regions . Because these KMS keys have the same key ID, key material, and other metadata, you can use them to encrypt data in one AWS Region and decrypt it in a different AWS Region without making a cross-Region call or exposing the plaintext data. For more information, see [Multi-Region keys](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) in the *AWS Key Management Service Developer Guide* .\\n\\nA multi-Region *primary key* is a fully functional symmetric encryption KMS key, HMAC KMS key, or asymmetric KMS key that is also the model for replica keys in other AWS Regions . To create a multi-Region primary key, add an [AWS::KMS::Key](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html) resource to your CloudFormation stack. Set its `MultiRegion` property to true.\\n\\nA multi-Region *replica key* is a fully functional KMS key that has the same key ID and key material as a multi-Region primary key, but is located in a different AWS Region of the same AWS partition. There can be multiple replicas of a primary key, but each must be in a different AWS Region .\\n\\nWhen you create a replica key in AWS CloudFormation , the replica key is created in the AWS Region represented by the endpoint you use for the request. If you try to replicate a multi-Region key into a Region in which the key type is not supported, the request will fail.\\n\\nA primary key and its replicas have the same key ID and key material. They also have the same key spec, key usage, key material origin, and automatic key rotation status. These properties are known as *shared properties* . If they change, AWS KMS synchronizes the change to all related multi-Region keys. All other properties of a replica key can differ, including its key policy, tags, aliases, and key state. AWS KMS does not synchronize these properties.\\n\\n*Regions*\\n\\nAWS KMS CloudFormation resources are available in all AWS Regions in which AWS KMS and AWS CloudFormation are supported. You can use the `AWS::KMS::ReplicaKey` resource to create replica keys in all Regions that support multi-Region KMS keys. For details, see [Multi-Region keys in AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html) in the ** .","properties":{"Description":"A description of the KMS key.\\n\\nThe default value is an empty string (no description).\\n\\nThe description is not a shared property of multi-Region keys. You can specify the same description or a different description for each key in a set of related multi-Region keys. AWS Key Management Service does not synchronize this property.","Enabled":"Specifies whether the replica key is enabled. Disabled KMS keys cannot be used in cryptographic operations.\\n\\nWhen `Enabled` is `true` , the *key state* of the KMS key is `Enabled` . When `Enabled` is `false` , the key state of the KMS key is `Disabled` . The default value is `true` .\\n\\nThe actual key state of the replica might be affected by actions taken outside of CloudFormation, such as running the [EnableKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_EnableKey.html) , [DisableKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DisableKey.html) , or [ScheduleKeyDeletion](https://docs.aws.amazon.com/kms/latest/APIReference/API_ScheduleKeyDeletion.html) operations. Also, while the replica key is being created, its key state is `Creating` . When the process is complete, the key state of the replica key changes to `Enabled` .\\n\\nFor information about the key states of a KMS key, see [Key state: Effect on your KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html) in the *AWS Key Management Service Developer Guide* .","KeyPolicy":"The key policy that authorizes use of the replica key.\\n\\nThe key policy is not a shared property of multi-Region keys. You can specify the same key policy or a different key policy for each key in a set of related multi-Region keys. AWS KMS does not synchronize this property.\\n\\nThe key policy must conform to the following rules.\\n\\n- The key policy must give the caller [PutKeyPolicy](https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html) permission on the KMS key. This reduces the risk that the KMS key becomes unmanageable. For more information, refer to the scenario in the [Default key policy](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-root-enable-iam) section of the **AWS Key Management Service Developer Guide** .\\n- Each statement in the key policy must contain one or more principals. The principals in the key policy must exist and be visible to AWS KMS . When you create a new AWS principal (for example, an IAM user or role), you might need to enforce a delay before including the new principal in a key policy because the new principal might not be immediately visible to AWS KMS . For more information, see [Changes that I make are not always immediately visible](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency) in the *AWS Identity and Access Management User Guide* .\\n\\nA key policy document can include only the following characters:\\n\\n- Printable ASCII characters from the space character ( `\\\\u0020` ) through the end of the ASCII character range.\\n- Printable characters in the Basic Latin and Latin-1 Supplement character set (through `\\\\u00FF` ).\\n- The tab ( `\\\\u0009` ), line feed ( `\\\\u000A` ), and carriage return ( `\\\\u000D` ) special characters\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `32768`","PendingWindowInDays":"Specifies the number of days in the waiting period before AWS KMS deletes a replica key that has been removed from a CloudFormation stack. Enter a value between 7 and 30 days. The default value is 30 days.\\n\\nWhen you remove a replica key from a CloudFormation stack, AWS KMS schedules the replica key for deletion and starts the mandatory waiting period. The `PendingWindowInDays` property determines the length of waiting period. During the waiting period, the key state of replica key is `Pending Deletion` , which prevents it from being used in cryptographic operations. When the waiting period expires, AWS KMS permanently deletes the replica key.\\n\\nIf the KMS key is a multi-Region primary key with replica keys, the waiting period begins when the last of its replica keys is deleted. Otherwise, the waiting period begins immediately.\\n\\nYou cannot use a CloudFormation template to cancel deletion of the replica after you remove it from the stack, regardless of the waiting period. However, if you specify a replica key in your template that is based on the same primary key as the original replica key, CloudFormation creates a new replica key with the same key ID, key material, and other shared properties of the original replica key. This new replica key can decrypt ciphertext that was encrypted under the original replica key, or any related multi-Region key.\\n\\nFor detailed information about deleting multi-Region keys, see [Deleting multi-Region keys](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-delete.html) in the *AWS Key Management Service Developer Guide* .\\n\\nFor information about the `PendingDeletion` key state, see [Key state: Effect on your KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html) in the *AWS Key Management Service Developer Guide* . For more information about deleting KMS keys, see the [ScheduleKeyDeletion](https://docs.aws.amazon.com/kms/latest/APIReference/API_ScheduleKeyDeletion.html) operation in the *AWS Key Management Service API Reference* and [Deleting KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html) in the *AWS Key Management Service Developer Guide* .\\n\\n*Minimum* : 7\\n\\n*Maximum* : 30","PrimaryKeyArn":"Specifies the multi-Region primary key to replicate. The primary key must be in a different AWS Region of the same AWS partition. You can create only one replica of a given primary key in each AWS Region .\\n\\n> If you change the `PrimaryKeyArn` value of a replica key, the existing replica key is scheduled for deletion and a new replica key is created based on the specified primary key. While it is scheduled for deletion, the existing replica key becomes unusable. You can cancel the scheduled deletion of the key outside of CloudFormation.\\n> \\n> However, if you inadvertently delete a replica key, you can decrypt ciphertext encrypted by that replica key by using any related multi-Region key. If necessary, you can recreate the replica in the same Region after the previous one is completely deleted. For details, see [Deleting multi-Region keys](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-delete.html) in the *AWS Key Management Service Developer Guide* \\n\\nSpecify the key ARN of an existing multi-Region primary key. For example, `arn:aws:kms:us-east-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab` .","Tags":"Assigns one or more tags to the replica key.\\n\\n> Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see [ABAC for AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/abac.html) in the *AWS Key Management Service Developer Guide* . \\n\\nTags are not a shared property of multi-Region keys. You can specify the same tags or different tags for each key in a set of related multi-Region keys. AWS KMS does not synchronize this property.\\n\\nEach tag consists of a tag key and a tag value. Both the tag key and the tag value are required, but the tag value can be an empty (null) string. You cannot have more than one tag on a KMS key with the same tag key. If you specify an existing tag key with a different tag value, AWS KMS replaces the current tag value with the specified one.\\n\\nWhen you assign tags to an AWS resource, AWS generates a cost allocation report with usage and costs aggregated by tags. Tags can also be used to control access to a KMS key. For details, see [Tagging keys](https://docs.aws.amazon.com/kms/latest/developerguide/tagging-keys.html) ."}},"AWS::KafkaConnect::Connector":{"attributes":{"ConnectorArn":"The Amazon Resource Name (ARN) of the newly created connector.","Ref":""},"description":"Creates a connector using the specified properties.","properties":{"Capacity":"The connector\'s compute capacity settings.","ConnectorConfiguration":"The configuration of the connector.","ConnectorDescription":"The description of the connector.","ConnectorName":"The name of the connector.","KafkaCluster":"The details of the Apache Kafka cluster to which the connector is connected.","KafkaClusterClientAuthentication":"The type of client authentication used to connect to the Apache Kafka cluster. The value is NONE when no client authentication is used.","KafkaClusterEncryptionInTransit":"Details of encryption in transit to the Apache Kafka cluster.","KafkaConnectVersion":"The version of Kafka Connect. It has to be compatible with both the Apache Kafka cluster\'s version and the plugins.","LogDelivery":"The settings for delivering connector logs to Amazon CloudWatch Logs.","Plugins":"Specifies which plugin to use for the connector. You must specify a single-element list. Amazon MSK Connect does not currently support specifying multiple plugins.","ServiceExecutionRoleArn":"The Amazon Resource Name (ARN) of the IAM role used by the connector to access Amazon Web Services resources.","WorkerConfiguration":"The worker configurations that are in use with the connector."}},"AWS::KafkaConnect::Connector.ApacheKafkaCluster":{"attributes":{},"description":"The details of the Apache Kafka cluster to which the connector is connected.","properties":{"BootstrapServers":"The bootstrap servers of the cluster.","Vpc":"Details of an Amazon VPC which has network connectivity to the Apache Kafka cluster."}},"AWS::KafkaConnect::Connector.AutoScaling":{"attributes":{},"description":"Specifies how the connector scales.","properties":{"MaxWorkerCount":"The maximum number of workers allocated to the connector.","McuCount":"The number of microcontroller units (MCUs) allocated to each connector worker. The valid values are 1,2,4,8.","MinWorkerCount":"The minimum number of workers allocated to the connector.","ScaleInPolicy":"The sacle-in policy for the connector.","ScaleOutPolicy":"The sacle-out policy for the connector."}},"AWS::KafkaConnect::Connector.Capacity":{"attributes":{},"description":"Information about the capacity of the connector, whether it is auto scaled or provisioned.","properties":{"AutoScaling":"Information about the auto scaling parameters for the connector.","ProvisionedCapacity":"Details about a fixed capacity allocated to a connector."}},"AWS::KafkaConnect::Connector.CloudWatchLogsLogDelivery":{"attributes":{},"description":"The settings for delivering connector logs to Amazon CloudWatch Logs.","properties":{"Enabled":"Whether log delivery to Amazon CloudWatch Logs is enabled.","LogGroup":"The name of the CloudWatch log group that is the destination for log delivery."}},"AWS::KafkaConnect::Connector.CustomPlugin":{"attributes":{},"description":"A plugin is an AWS resource that contains the code that defines a connector\'s logic.","properties":{"CustomPluginArn":"The Amazon Resource Name (ARN) of the custom plugin.","Revision":"The revision of the custom plugin."}},"AWS::KafkaConnect::Connector.FirehoseLogDelivery":{"attributes":{},"description":"The settings for delivering logs to Amazon Kinesis Data Firehose.","properties":{"DeliveryStream":"The name of the Kinesis Data Firehose delivery stream that is the destination for log delivery.","Enabled":"Specifies whether connector logs get delivered to Amazon Kinesis Data Firehose."}},"AWS::KafkaConnect::Connector.KafkaCluster":{"attributes":{},"description":"The details of the Apache Kafka cluster to which the connector is connected.","properties":{"ApacheKafkaCluster":"The Apache Kafka cluster to which the connector is connected."}},"AWS::KafkaConnect::Connector.KafkaClusterClientAuthentication":{"attributes":{},"description":"The client authentication information used in order to authenticate with the Apache Kafka cluster.","properties":{"AuthenticationType":"The type of client authentication used to connect to the Apache Kafka cluster. Value NONE means that no client authentication is used."}},"AWS::KafkaConnect::Connector.KafkaClusterEncryptionInTransit":{"attributes":{},"description":"Details of encryption in transit to the Apache Kafka cluster.","properties":{"EncryptionType":"The type of encryption in transit to the Apache Kafka cluster."}},"AWS::KafkaConnect::Connector.LogDelivery":{"attributes":{},"description":"Details about log delivery.","properties":{"WorkerLogDelivery":"The workers can send worker logs to different destination types. This configuration specifies the details of these destinations."}},"AWS::KafkaConnect::Connector.Plugin":{"attributes":{},"description":"A plugin is an AWS resource that contains the code that defines your connector logic.","properties":{"CustomPlugin":"Details about a custom plugin."}},"AWS::KafkaConnect::Connector.ProvisionedCapacity":{"attributes":{},"description":"Details about a connector\'s provisioned capacity.","properties":{"McuCount":"The number of microcontroller units (MCUs) allocated to each connector worker. The valid values are 1,2,4,8.","WorkerCount":"The number of workers that are allocated to the connector."}},"AWS::KafkaConnect::Connector.S3LogDelivery":{"attributes":{},"description":"Details about delivering logs to Amazon S3.","properties":{"Bucket":"The name of the S3 bucket that is the destination for log delivery.","Enabled":"Specifies whether connector logs get sent to the specified Amazon S3 destination.","Prefix":"The S3 prefix that is the destination for log delivery."}},"AWS::KafkaConnect::Connector.ScaleInPolicy":{"attributes":{},"description":"The scale-in policy for the connector.","properties":{"CpuUtilizationPercentage":"Specifies the CPU utilization percentage threshold at which you want connector scale in to be triggered."}},"AWS::KafkaConnect::Connector.ScaleOutPolicy":{"attributes":{},"description":"The scale-out policy for the connector.","properties":{"CpuUtilizationPercentage":"The CPU utilization percentage threshold at which you want connector scale out to be triggered."}},"AWS::KafkaConnect::Connector.Vpc":{"attributes":{},"description":"Information about the VPC in which the connector resides.","properties":{"SecurityGroups":"The security groups for the connector.","Subnets":"The subnets for the connector."}},"AWS::KafkaConnect::Connector.WorkerConfiguration":{"attributes":{},"description":"The configuration of the workers, which are the processes that run the connector logic.","properties":{"Revision":"The revision of the worker configuration.","WorkerConfigurationArn":"The Amazon Resource Name (ARN) of the worker configuration."}},"AWS::KafkaConnect::Connector.WorkerLogDelivery":{"attributes":{},"description":"Workers can send worker logs to different destination types. This configuration specifies the details of these destinations.","properties":{"CloudWatchLogs":"Details about delivering logs to Amazon CloudWatch Logs.","Firehose":"Details about delivering logs to Amazon Kinesis Data Firehose.","S3":"Details about delivering logs to Amazon S3."}},"AWS::Kendra::DataSource":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the data source. For example:\\n\\n`arn:aws:kendra:us-west-2:111122223333:index/335c3741-41df-46a6-b5d3-61f85b787884/data-source/b8cae438-6787-4091-8897-684a652bbb0a`","Id":"The identifier for the data source. For example:\\n\\n`b8cae438-6787-4091-8897-684a652bbb0a` .","Ref":"`Ref` returns the data source ID. For example:\\n\\n`{ \\"Ref\\": \\"|\\" }`"},"description":"Creates a data source connector that you want to use with an Amazon Kendra index.\\n\\nYou specify a name, data source connector type and description for your data source. You also specify configuration information for the data source connector.","properties":{"CustomDocumentEnrichmentConfiguration":"Configuration information for altering document metadata and content during the document ingestion process.","DataSourceConfiguration":"Configuration information for an Amazon Kendra data source. The contents of the configuration depend on the type of data source. You can only specify one type of data source in the configuration.\\n\\nYou can\'t specify the `Configuration` parameter when the `Type` parameter is set to `CUSTOM` .\\n\\nThe `Configuration` parameter is required for all other data sources.","Description":"A description for the data source connector.","IndexId":"The identifier of the index you want to use with the data source connector.","Name":"The name of the data source.","RoleArn":"The Amazon Resource Name (ARN) of a role with permission to access the data source.\\n\\nYou can\'t specify the `RoleArn` parameter when the `Type` parameter is set to `CUSTOM` .\\n\\nThe `RoleArn` parameter is required for all other data sources.","Schedule":"Sets the frequency that Amazon Kendra checks the documents in your data source and updates the index. If you don\'t set a schedule, Amazon Kendra doesn\'t periodically update the index.","Tags":"An array of key-value pairs to apply to this resource\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","Type":"The type of the data source."}},"AWS::Kendra::DataSource.AccessControlListConfiguration":{"attributes":{},"description":"Specifies access control list files for the documents in a data source.","properties":{"KeyPath":"Path to the AWS S3 bucket that contains the access control list files."}},"AWS::Kendra::DataSource.AclConfiguration":{"attributes":{},"description":"Provides information about the column that should be used for filtering the query response by groups.","properties":{"AllowedGroupsColumnName":"A list of groups, separated by semi-colons, that filters a query response based on user context. The document is only returned to users that are in one of the groups specified in the `UserContext` field of the [Query](https://docs.aws.amazon.com/kendra/latest/dg/API_Query.html) operation."}},"AWS::Kendra::DataSource.ColumnConfiguration":{"attributes":{},"description":"Provides information about how Amazon Kendra should use the columns of a database in an index.","properties":{"ChangeDetectingColumns":"One to five columns that indicate when a document in the database has changed.","DocumentDataColumnName":"The column that contains the contents of the document.","DocumentIdColumnName":"The column that provides the document\'s identifier.","DocumentTitleColumnName":"The column that contains the title of the document.","FieldMappings":"An array of objects that map database column names to the corresponding fields in an index. You must first create the fields in the index using the [UpdateIndex](https://docs.aws.amazon.com/kendra/latest/dg/API_UpdateIndex.html) operation."}},"AWS::Kendra::DataSource.ConfluenceAttachmentConfiguration":{"attributes":{},"description":"Configuration of attachment settings for the Confluence data source. Attachment settings are optional, if you don\'t specify settings attachments, Amazon Kendra won\'t index them.","properties":{"AttachmentFieldMappings":"Maps attributes or field names of Confluence attachments to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Confluence fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Confluence data source field names must exist in your Confluence custom metadata.\\n\\nIf you specify the `AttachentFieldMappings` parameter, you must specify at least one field mapping.","CrawlAttachments":"`TRUE` to index attachments of pages and blogs in Confluence."}},"AWS::Kendra::DataSource.ConfluenceAttachmentToIndexFieldMapping":{"attributes":{},"description":"Maps attributes or field names of Confluence attachments to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Confluence fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Confuence data source field names must exist in your Confluence custom metadata.","properties":{"DataSourceFieldName":"The name of the field in the data source.\\n\\nYou must first create the index field using the `UpdateIndex` API.","DateFieldFormat":"The format for date fields in the data source. If the field specified in `DataSourceFieldName` is a date field you must specify the date format. If the field is not a date field, an exception is thrown.","IndexFieldName":"The name of the index field to map to the Confluence data source field. The index field type must match the Confluence field type."}},"AWS::Kendra::DataSource.ConfluenceBlogConfiguration":{"attributes":{},"description":"Configuration of blog settings for the Confluence data source. Blogs are always indexed unless filtered from the index by the `ExclusionPatterns` or `InclusionPatterns` fields in the `ConfluenceConfiguration` object.","properties":{"BlogFieldMappings":"Maps attributes or field names of Confluence blogs to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Confluence fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Confluence data source field names must exist in your Confluence custom metadata.\\n\\nIf you specify the `BlogFieldMappings` parameter, you must specify at least one field mapping."}},"AWS::Kendra::DataSource.ConfluenceBlogToIndexFieldMapping":{"attributes":{},"description":"Maps attributes or field names of Confluence blog to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Confluence fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Confluence data source field names must exist in your Confluence custom metadata.","properties":{"DataSourceFieldName":"The name of the field in the data source.","DateFieldFormat":"The format for date fields in the data source. If the field specified in `DataSourceFieldName` is a date field you must specify the date format. If the field is not a date field, an exception is thrown.","IndexFieldName":"The name of the index field to map to the Confluence data source field. The index field type must match the Confluence field type."}},"AWS::Kendra::DataSource.ConfluenceConfiguration":{"attributes":{},"description":"Provides the configuration information to connect to Confluence as your data source.","properties":{"AttachmentConfiguration":"Configuration information for indexing attachments to Confluence blogs and pages.","BlogConfiguration":"Configuration information for indexing Confluence blogs.","ExclusionPatterns":"A list of regular expression patterns to exclude certain blog posts, pages, spaces, or attachments in your Confluence. Content that matches the patterns are excluded from the index. Content that doesn\'t match the patterns is included in the index. If content matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the content isn\'t included in the index.","InclusionPatterns":"A list of regular expression patterns to include certain blog posts, pages, spaces, or attachments in your Confluence. Content that matches the patterns are included in the index. Content that doesn\'t match the patterns is excluded from the index. If content matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the content isn\'t included in the index.","PageConfiguration":"Configuration information for indexing Confluence pages.","SecretArn":"The Amazon Resource Name (ARN) of an AWS Secrets Manager secret that contains the user name and password required to connect to the Confluence instance. If you use Confluence Cloud, you use a generated API token as the password.\\n\\nYou can also provide authentication credentials in the form of a personal access token. For more information, see [Using a Confluence data source](https://docs.aws.amazon.com/kendra/latest/dg/data-source-confluence.html) .","ServerUrl":"The URL of your Confluence instance. Use the full URL of the server. For example, *https://server.example.com:port/* . You can also use an IP address, for example, *https://192.168.1.113/* .","SpaceConfiguration":"Configuration information for indexing Confluence spaces.","Version":"The version or the type of Confluence installation to connect to.","VpcConfiguration":"Configuration information for an Amazon Virtual Private Cloud to connect to your Confluence. For more information, see [Configuring a VPC](https://docs.aws.amazon.com/kendra/latest/dg/vpc-configuration.html) ."}},"AWS::Kendra::DataSource.ConfluencePageConfiguration":{"attributes":{},"description":"Configuration of the page settings for the Confluence data source.","properties":{"PageFieldMappings":"Maps attributes or field names of Confluence pages to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Confluence fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Confluence data source field names must exist in your Confluence custom metadata.\\n\\nIf you specify the `PageFieldMappings` parameter, you must specify at least one field mapping."}},"AWS::Kendra::DataSource.ConfluencePageToIndexFieldMapping":{"attributes":{},"description":"Maps attributes or field names of Confluence pages to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Confluence fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Confluence data source field names must exist in your Confluence custom metadata.","properties":{"DataSourceFieldName":"The name of the field in the data source.","DateFieldFormat":"The format for date fields in the data source. If the field specified in `DataSourceFieldName` is a date field you must specify the date format. If the field is not a date field, an exception is thrown.","IndexFieldName":"The name of the index field to map to the Confluence data source field. The index field type must match the Confluence field type."}},"AWS::Kendra::DataSource.ConfluenceSpaceConfiguration":{"attributes":{},"description":"Configuration information for indexing Confluence spaces.","properties":{"CrawlArchivedSpaces":"`TRUE` to index archived spaces.","CrawlPersonalSpaces":"`TRUE` to index personal spaces. You can add restrictions to items in personal spaces. If personal spaces are indexed, queries without user context information may return restricted items from a personal space in their results. For more information, see [Filtering on user context](https://docs.aws.amazon.com/kendra/latest/dg/user-context-filter.html) .","ExcludeSpaces":"A list of space keys of Confluence spaces. If you include a key, the blogs, documents, and attachments in the space are not indexed. If a space is in both the `ExcludeSpaces` and the `IncludeSpaces` list, the space is excluded.","IncludeSpaces":"A list of space keys for Confluence spaces. If you include a key, the blogs, documents, and attachments in the space are indexed. Spaces that aren\'t in the list aren\'t indexed. A space in the list must exist. Otherwise, Amazon Kendra logs an error when the data source is synchronized. If a space is in both the `IncludeSpaces` and the `ExcludeSpaces` list, the space is excluded.","SpaceFieldMappings":"Maps attributes or field names of Confluence spaces to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Confluence fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Confluence data source field names must exist in your Confluence custom metadata.\\n\\nIf you specify the `SpaceFieldMappings` parameter, you must specify at least one field mapping."}},"AWS::Kendra::DataSource.ConfluenceSpaceToIndexFieldMapping":{"attributes":{},"description":"Maps attributes or field names of Confluence spaces to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Confluence fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Confluence data source field names must exist in your Confluence custom metadata.","properties":{"DataSourceFieldName":"The name of the field in the data source.","DateFieldFormat":"The format for date fields in the data source. If the field specified in `DataSourceFieldName` is a date field you must specify the date format. If the field is not a date field, an exception is thrown.","IndexFieldName":"The name of the index field to map to the Confluence data source field. The index field type must match the Confluence field type."}},"AWS::Kendra::DataSource.ConnectionConfiguration":{"attributes":{},"description":"Provides the configuration information that\'s required to connect to a database.","properties":{"DatabaseHost":"The name of the host for the database. Can be either a string (host.subdomain.domain.tld) or an IPv4 or IPv6 address.","DatabaseName":"The name of the database containing the document data.","DatabasePort":"The port that the database uses for connections.","SecretArn":"The Amazon Resource Name (ARN) of credentials stored in AWS Secrets Manager . The credentials should be a user/password pair. For more information, see [Using a Database Data Source](https://docs.aws.amazon.com/kendra/latest/dg/data-source-database.html) . For more information about AWS Secrets Manager , see [What Is AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) in the *AWS Secrets Manager* user guide.","TableName":"The name of the table that contains the document data."}},"AWS::Kendra::DataSource.CustomDocumentEnrichmentConfiguration":{"attributes":{},"description":"Provides the configuration information for altering document metadata and content during the document ingestion process.\\n\\nFor more information, see [Customizing document metadata during the ingestion process](https://docs.aws.amazon.com/kendra/latest/dg/custom-document-enrichment.html) .","properties":{"InlineConfigurations":"Configuration information to alter document attributes or metadata fields and content when ingesting documents into Amazon Kendra.","PostExtractionHookConfiguration":"Configuration information for invoking a Lambda function in AWS Lambda on the structured documents with their metadata and text extracted. You can use a Lambda function to apply advanced logic for creating, modifying, or deleting document metadata and content. For more information, see [Advanced data manipulation](https://docs.aws.amazon.com/kendra/latest/dg/custom-document-enrichment.html#advanced-data-manipulation) .","PreExtractionHookConfiguration":"Configuration information for invoking a Lambda function in AWS Lambda on the original or raw documents before extracting their metadata and text. You can use a Lambda function to apply advanced logic for creating, modifying, or deleting document metadata and content. For more information, see [Advanced data manipulation](https://docs.aws.amazon.com/kendra/latest/dg/custom-document-enrichment.html#advanced-data-manipulation) .","RoleArn":"The Amazon Resource Name (ARN) of a role with permission to run `PreExtractionHookConfiguration` and `PostExtractionHookConfiguration` for altering document metadata and content during the document ingestion process. For more information, see [IAM roles for Amazon Kendra](https://docs.aws.amazon.com/kendra/latest/dg/iam-roles.html) ."}},"AWS::Kendra::DataSource.DataSourceConfiguration":{"attributes":{},"description":"Provides the configuration information for an Amazon Kendra data source.","properties":{"ConfluenceConfiguration":"Provides the configuration information to connect to Confluence as your data source.","DatabaseConfiguration":"Provides the configuration information to connect to a database as your data source.","GoogleDriveConfiguration":"Provides the configuration information to connect to Google Drive as your data source.","OneDriveConfiguration":"Provides the configuration information to connect to Microsoft OneDrive as your data source.","S3Configuration":"Provides the configuration information to connect to an Amazon S3 bucket as your data source.","SalesforceConfiguration":"Provides the configuration information to connect to Salesforce as your data source.","ServiceNowConfiguration":"Provides the configuration information to connect to ServiceNow as your data source.","SharePointConfiguration":"Provides the configuration information to connect to Microsoft SharePoint as your data source.","WebCrawlerConfiguration":"Provides the configuration information required for Amazon Kendra Web Crawler.","WorkDocsConfiguration":"Provides the configuration information to connect to Amazon WorkDocs as your data source."}},"AWS::Kendra::DataSource.DataSourceToIndexFieldMapping":{"attributes":{},"description":"Maps a column or attribute in the data source to an index field. You must first create the fields in the index using the [UpdateIndex](https://docs.aws.amazon.com/kendra/latest/dg/API_UpdateIndex.html) operation.","properties":{"DataSourceFieldName":"The name of the column or attribute in the data source.","DateFieldFormat":"The type of data stored in the column or attribute.","IndexFieldName":"The name of the field in the index."}},"AWS::Kendra::DataSource.DataSourceVpcConfiguration":{"attributes":{},"description":"Provides the configuration information to connect to an Amazon VPC.","properties":{"SecurityGroupIds":"A list of identifiers of security groups within your Amazon VPC. The security groups should enable Amazon Kendra to connect to the data source.","SubnetIds":"A list of identifiers for subnets within your Amazon VPC. The subnets should be able to connect to each other in the VPC, and they should have outgoing access to the Internet through a NAT device."}},"AWS::Kendra::DataSource.DatabaseConfiguration":{"attributes":{},"description":"Provides the configuration information to connect to a index.","properties":{"AclConfiguration":"Information about the database column that provides information for user context filtering.","ColumnConfiguration":"Information about where the index should get the document information from the database.","ConnectionConfiguration":"Configuration information that\'s required to connect to a database.","DatabaseEngineType":"The type of database engine that runs the database.","SqlConfiguration":"Provides information about how Amazon Kendra uses quote marks around SQL identifiers when querying a database data source.","VpcConfiguration":"Provides information for connecting to an Amazon VPC."}},"AWS::Kendra::DataSource.DocumentAttributeCondition":{"attributes":{},"description":"The condition used for the target document attribute or metadata field when ingesting documents into Amazon Kendra. You use this with [DocumentAttributeTarget to apply the condition](https://docs.aws.amazon.com/kendra/latest/dg/API_DocumentAttributeTarget.html) .\\n\\nFor example, you can create the \'Department\' target field and have it prefill department names associated with the documents based on information in the \'Source_URI\' field. Set the condition that if the \'Source_URI\' field contains \'financial\' in its URI value, then prefill the target field \'Department\' with the target value \'Finance\' for the document.\\n\\nAmazon Kendra cannot create a target field if it has not already been created as an index field. After you create your index field, you can create a document metadata field using `DocumentAttributeTarget` . Amazon Kendra then will map your newly created metadata field to your index field.","properties":{"ConditionDocumentAttributeKey":"The identifier of the document attribute used for the condition.\\n\\nFor example, \'Source_URI\' could be an identifier for the attribute or metadata field that contains source URIs associated with the documents.\\n\\nAmazon Kendra currently does not support `_document_body` as an attribute key used for the condition.","ConditionOnValue":"The value used by the operator.\\n\\nFor example, you can specify the value \'financial\' for strings in the \'Source_URI\' field that partially match or contain this value.","Operator":"The condition operator.\\n\\nFor example, you can use \'Contains\' to partially match a string."}},"AWS::Kendra::DataSource.DocumentAttributeTarget":{"attributes":{},"description":"The target document attribute or metadata field you want to alter when ingesting documents into Amazon Kendra.\\n\\nFor example, you can delete customer identification numbers associated with the documents, stored in the document metadata field called \'Customer_ID\'. You set the target key as \'Customer_ID\' and the deletion flag to `TRUE` . This removes all customer ID values in the field \'Customer_ID\'. This would scrub personally identifiable information from each document\'s metadata.\\n\\nAmazon Kendra cannot create a target field if it has not already been created as an index field. After you create your index field, you can create a document metadata field using `DocumentAttributeTarget` . Amazon Kendra then will map your newly created metadata field to your index field.\\n\\nYou can also use this with [DocumentAttributeCondition](https://docs.aws.amazon.com/kendra/latest/dg/API_DocumentAttributeCondition.html) .","properties":{"TargetDocumentAttributeKey":"The identifier of the target document attribute or metadata field.\\n\\nFor example, \'Department\' could be an identifier for the target attribute or metadata field that includes the department names associated with the documents.","TargetDocumentAttributeValue":"The target value you want to create for the target attribute.\\n\\nFor example, \'Finance\' could be the target value for the target attribute key \'Department\'.","TargetDocumentAttributeValueDeletion":"`TRUE` to delete the existing target value for your specified target attribute key. You cannot create a target value and set this to `TRUE` . To create a target value ( `TargetDocumentAttributeValue` ), set this to `FALSE` ."}},"AWS::Kendra::DataSource.DocumentAttributeValue":{"attributes":{},"description":"The value of a document attribute. You can only provide one value for a document attribute.","properties":{"DateValue":"A date expressed as an ISO 8601 string.\\n\\nIt is important for the time zone to be included in the ISO 8601 date-time format. For example, 2012-03-25T12:30:10+01:00 is the ISO 8601 date-time format for March 25th 2012 at 12:30PM (plus 10 seconds) in Central European Time.","LongValue":"A long integer value.","StringListValue":"A list of strings. The default maximum length or number of strings is 10.","StringValue":"A string, such as \\"department\\"."}},"AWS::Kendra::DataSource.DocumentsMetadataConfiguration":{"attributes":{},"description":"Document metadata files that contain information such as the document access control information, source URI, document author, and custom attributes. Each metadata file contains metadata about a single document.","properties":{"S3Prefix":"A prefix used to filter metadata configuration files in the AWS S3 bucket. The S3 bucket might contain multiple metadata files. Use `S3Prefix` to include only the desired metadata files."}},"AWS::Kendra::DataSource.GoogleDriveConfiguration":{"attributes":{},"description":"Provides the configuration information to connect to Google Drive as your data source.","properties":{"ExcludeMimeTypes":"A list of MIME types to exclude from the index. All documents matching the specified MIME type are excluded.\\n\\nFor a list of MIME types, see [Using a Google Workspace Drive data source](https://docs.aws.amazon.com/kendra/latest/dg/data-source-google-drive.html) .","ExcludeSharedDrives":"A list of identifiers or shared drives to exclude from the index. All files and folders stored on the shared drive are excluded.","ExcludeUserAccounts":"A list of email addresses of the users. Documents owned by these users are excluded from the index. Documents shared with excluded users are indexed unless they are excluded in another way.","ExclusionPatterns":"A list of regular expression patterns to exclude certain items in your Google Drive, including shared drives and users\' My Drives. Items that match the patterns are excluded from the index. Items that don\'t match the patterns are included in the index. If an item matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the item isn\'t included in the index.","FieldMappings":"Maps Google Drive data source attributes or field names to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Google Drive fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Google Drive data source field names must exist in your Google Drive custom metadata.","InclusionPatterns":"A list of regular expression patterns to include certain items in your Google Drive, including shared drives and users\' My Drives. Items that match the patterns are included in the index. Items that don\'t match the patterns are excluded from the index. If an item matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the item isn\'t included in the index.","SecretArn":"The Amazon Resource Name (ARN) of a AWS Secrets Manager secret that contains the credentials required to connect to Google Drive. For more information, see [Using a Google Workspace Drive data source](https://docs.aws.amazon.com/kendra/latest/dg/data-source-google-drive.html) ."}},"AWS::Kendra::DataSource.HookConfiguration":{"attributes":{},"description":"Provides the configuration information for invoking a Lambda function in AWS Lambda to alter document metadata and content when ingesting documents into Amazon Kendra. You can configure your Lambda function using [PreExtractionHookConfiguration](https://docs.aws.amazon.com/kendra/latest/dg/API_CustomDocumentEnrichmentConfiguration.html) if you want to apply advanced alterations on the original or raw documents. If you want to apply advanced alterations on the Amazon Kendra structured documents, you must configure your Lambda function using [PostExtractionHookConfiguration](https://docs.aws.amazon.com/kendra/latest/dg/API_CustomDocumentEnrichmentConfiguration.html) . You can only invoke one Lambda function. However, this function can invoke other functions it requires.\\n\\nFor more information, see [Customizing document metadata during the ingestion process](https://docs.aws.amazon.com/kendra/latest/dg/custom-document-enrichment.html) .","properties":{"InvocationCondition":"The condition used for when a Lambda function should be invoked.\\n\\nFor example, you can specify a condition that if there are empty date-time values, then Amazon Kendra should invoke a function that inserts the current date-time.","LambdaArn":"The Amazon Resource Name (ARN) of a role with permission to run a Lambda function during ingestion. For more information, see [IAM roles for Amazon Kendra](https://docs.aws.amazon.com/kendra/latest/dg/iam-roles.html) .","S3Bucket":"Stores the original, raw documents or the structured, parsed documents before and after altering them. For more information, see [Data contracts for Lambda functions](https://docs.aws.amazon.com/kendra/latest/dg/custom-document-enrichment.html#cde-data-contracts-lambda) ."}},"AWS::Kendra::DataSource.InlineCustomDocumentEnrichmentConfiguration":{"attributes":{},"description":"Provides the configuration information for applying basic logic to alter document metadata and content when ingesting documents into Amazon Kendra. To apply advanced logic, to go beyond what you can do with basic logic, see [HookConfiguration](https://docs.aws.amazon.com/kendra/latest/dg/API_HookConfiguration.html) .\\n\\nFor more information, see [Customizing document metadata during the ingestion process](https://docs.aws.amazon.com/kendra/latest/dg/custom-document-enrichment.html) .","properties":{"Condition":"Configuration of the condition used for the target document attribute or metadata field when ingesting documents into Amazon Kendra.","DocumentContentDeletion":"`TRUE` to delete content if the condition used for the target attribute is met.","Target":"Configuration of the target document attribute or metadata field when ingesting documents into Amazon Kendra. You can also include a value."}},"AWS::Kendra::DataSource.OneDriveConfiguration":{"attributes":{},"description":"Provides the configuration information to connect to OneDrive as your data source.","properties":{"DisableLocalGroups":"`TRUE` to disable local groups information.","ExclusionPatterns":"A list of regular expression patterns to exclude certain documents in your OneDrive. Documents that match the patterns are excluded from the index. Documents that don\'t match the patterns are included in the index. If a document matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the document isn\'t included in the index.\\n\\nThe pattern is applied to the file name.","FieldMappings":"A list of `DataSourceToIndexFieldMapping` objects that map OneDrive data source attributes or field names to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to OneDrive fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The OneDrive data source field names must exist in your OneDrive custom metadata.","InclusionPatterns":"A list of regular expression patterns to include certain documents in your OneDrive. Documents that match the patterns are included in the index. Documents that don\'t match the patterns are excluded from the index. If a document matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the document isn\'t included in the index.\\n\\nThe pattern is applied to the file name.","OneDriveUsers":"A list of user accounts whose documents should be indexed.","SecretArn":"The Amazon Resource Name (ARN) of an AWS Secrets Manager secret that contains the user name and password to connect to OneDrive. The user name should be the application ID for the OneDrive application, and the password is the application key for the OneDrive application.","TenantDomain":"The Azure Active Directory domain of the organization."}},"AWS::Kendra::DataSource.OneDriveUsers":{"attributes":{},"description":"User accounts whose documents should be indexed.","properties":{"OneDriveUserList":"A list of users whose documents should be indexed. Specify the user names in email format, for example, `username@tenantdomain` . If you need to index the documents of more than 100 users, use the `OneDriveUserS3Path` field to specify the location of a file containing a list of users.","OneDriveUserS3Path":"The S3 bucket location of a file containing a list of users whose documents should be indexed."}},"AWS::Kendra::DataSource.ProxyConfiguration":{"attributes":{},"description":"Provides the configuration information for a web proxy to connect to website hosts.","properties":{"Credentials":"Your secret ARN, which you can create in [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)\\n\\nThe credentials are optional. You use a secret if web proxy credentials are required to connect to a website host. Amazon Kendra currently support basic authentication to connect to a web proxy server. The secret stores your credentials.","Host":"The name of the website host you want to connect to via a web proxy server.\\n\\nFor example, the host name of https://a.example.com/page1.html is \\"a.example.com\\".","Port":"The port number of the website host you want to connect to via a web proxy server.\\n\\nFor example, the port for https://a.example.com/page1.html is 443, the standard port for HTTPS."}},"AWS::Kendra::DataSource.S3DataSourceConfiguration":{"attributes":{},"description":"Provides the configuration information to connect to an Amazon S3 bucket.","properties":{"AccessControlListConfiguration":"Provides the path to the S3 bucket that contains the user context filtering files for the data source. For the format of the file, see [Access control for S3 data sources](https://docs.aws.amazon.com/kendra/latest/dg/s3-acl.html) .","BucketName":"The name of the bucket that contains the documents.","DocumentsMetadataConfiguration":"Specifies document metadata files that contain information such as the document access control information, source URI, document author, and custom attributes. Each metadata file contains metadata about a single document.","ExclusionPatterns":"A list of glob patterns for documents that should not be indexed. If a document that matches an inclusion prefix or inclusion pattern also matches an exclusion pattern, the document is not indexed.\\n\\nSome [examples](https://docs.aws.amazon.com/cli/latest/reference/s3/#use-of-exclude-and-include-filters) are:\\n\\n- **.png , *.jpg* will exclude all PNG and JPEG image files in a directory (files with the extensions .png and .jpg).\\n- **internal** will exclude all files in a directory that contain \'internal\' in the file name, such as \'internal\', \'internal_only\', \'company_internal\'.\\n- ***/*internal** will exclude all internal-related files in a directory and its subdirectories.","InclusionPatterns":"A list of glob patterns for documents that should be indexed. If a document that matches an inclusion pattern also matches an exclusion pattern, the document is not indexed.\\n\\nSome [examples](https://docs.aws.amazon.com/cli/latest/reference/s3/#use-of-exclude-and-include-filters) are:\\n\\n- **.txt* will include all text files in a directory (files with the extension .txt).\\n- ***/*.txt* will include all text files in a directory and its subdirectories.\\n- **tax** will include all files in a directory that contain \'tax\' in the file name, such as \'tax\', \'taxes\', \'income_tax\'.","InclusionPrefixes":"A list of S3 prefixes for the documents that should be included in the index."}},"AWS::Kendra::DataSource.S3Path":{"attributes":{},"description":"Information required to find a specific file in an Amazon S3 bucket.","properties":{"Bucket":"The name of the S3 bucket that contains the file.","Key":"The name of the file."}},"AWS::Kendra::DataSource.SalesforceChatterFeedConfiguration":{"attributes":{},"description":"The configuration information for syncing a Salesforce chatter feed. The contents of the object comes from the Salesforce FeedItem table.","properties":{"DocumentDataFieldName":"The name of the column in the Salesforce FeedItem table that contains the content to index. Typically this is the `Body` column.","DocumentTitleFieldName":"The name of the column in the Salesforce FeedItem table that contains the title of the document. This is typically the `Title` column.","FieldMappings":"Maps fields from a Salesforce chatter feed into Amazon Kendra index fields.","IncludeFilterTypes":"Filters the documents in the feed based on status of the user. When you specify `ACTIVE_USERS` only documents from users who have an active account are indexed. When you specify `STANDARD_USER` only documents for Salesforce standard users are documented. You can specify both."}},"AWS::Kendra::DataSource.SalesforceConfiguration":{"attributes":{},"description":"Provides the configuration information to connect to Salesforce as your data source.","properties":{"ChatterFeedConfiguration":"Configuration information for Salesforce chatter feeds.","CrawlAttachments":"Indicates whether Amazon Kendra should index attachments to Salesforce objects.","ExcludeAttachmentFilePatterns":"A list of regular expression patterns to exclude certain documents in your Salesforce. Documents that match the patterns are excluded from the index. Documents that don\'t match the patterns are included in the index. If a document matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the document isn\'t included in the index.\\n\\nThe pattern is applied to the name of the attached file.","IncludeAttachmentFilePatterns":"A list of regular expression patterns to include certain documents in your Salesforce. Documents that match the patterns are included in the index. Documents that don\'t match the patterns are excluded from the index. If a document matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the document isn\'t included in the index.\\n\\nThe pattern is applied to the name of the attached file.","KnowledgeArticleConfiguration":"Configuration information for the knowledge article types that Amazon Kendra indexes. Amazon Kendra indexes standard knowledge articles and the standard fields of knowledge articles, or the custom fields of custom knowledge articles, but not both.","SecretArn":"The Amazon Resource Name (ARN) of an AWS Secrets Manager secret that contains the key/value pairs required to connect to your Salesforce instance. The secret must contain a JSON structure with the following keys:\\n\\n- authenticationUrl - The OAUTH endpoint that Amazon Kendra connects to get an OAUTH token.\\n- consumerKey - The application public key generated when you created your Salesforce application.\\n- consumerSecret - The application private key generated when you created your Salesforce application.\\n- password - The password associated with the user logging in to the Salesforce instance.\\n- securityToken - The token associated with the user logging in to the Salesforce instance.\\n- username - The user name of the user logging in to the Salesforce instance.","ServerUrl":"The instance URL for the Salesforce site that you want to index.","StandardObjectAttachmentConfiguration":"Configuration information for processing attachments to Salesforce standard objects.","StandardObjectConfigurations":"Configuration of the Salesforce standard objects that Amazon Kendra indexes."}},"AWS::Kendra::DataSource.SalesforceCustomKnowledgeArticleTypeConfiguration":{"attributes":{},"description":"Provides the configuration information for indexing Salesforce custom articles.","properties":{"DocumentDataFieldName":"The name of the field in the custom knowledge article that contains the document data to index.","DocumentTitleFieldName":"The name of the field in the custom knowledge article that contains the document title.","FieldMappings":"Maps attributes or field names of the custom knowledge article to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Salesforce fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Salesforce data source field names must exist in your Salesforce custom metadata.","Name":"The name of the configuration."}},"AWS::Kendra::DataSource.SalesforceKnowledgeArticleConfiguration":{"attributes":{},"description":"Provides the configuration information for the knowledge article types that Amazon Kendra indexes. Amazon Kendra indexes standard knowledge articles and the standard fields of knowledge articles, or the custom fields of custom knowledge articles, but not both","properties":{"CustomKnowledgeArticleTypeConfigurations":"Configuration information for custom Salesforce knowledge articles.","IncludedStates":"Specifies the document states that should be included when Amazon Kendra indexes knowledge articles. You must specify at least one state.","StandardKnowledgeArticleTypeConfiguration":"Configuration information for standard Salesforce knowledge articles."}},"AWS::Kendra::DataSource.SalesforceStandardKnowledgeArticleTypeConfiguration":{"attributes":{},"description":"Provides the configuration information for standard Salesforce knowledge articles.","properties":{"DocumentDataFieldName":"The name of the field that contains the document data to index.","DocumentTitleFieldName":"The name of the field that contains the document title.","FieldMappings":"Maps attributes or field names of the knowledge article to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Salesforce fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Salesforce data source field names must exist in your Salesforce custom metadata."}},"AWS::Kendra::DataSource.SalesforceStandardObjectAttachmentConfiguration":{"attributes":{},"description":"Provides the configuration information for processing attachments to Salesforce standard objects.","properties":{"DocumentTitleFieldName":"The name of the field used for the document title.","FieldMappings":"One or more objects that map fields in attachments to Amazon Kendra index fields."}},"AWS::Kendra::DataSource.SalesforceStandardObjectConfiguration":{"attributes":{},"description":"Specifies configuration information for indexing a single standard object.","properties":{"DocumentDataFieldName":"The name of the field in the standard object table that contains the document contents.","DocumentTitleFieldName":"The name of the field in the standard object table that contains the document title.","FieldMappings":"Maps attributes or field names of the standard object to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Salesforce fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Salesforce data source field names must exist in your Salesforce custom metadata.","Name":"The name of the standard object."}},"AWS::Kendra::DataSource.ServiceNowConfiguration":{"attributes":{},"description":"Provides the configuration information to connect to ServiceNow as your data source.","properties":{"AuthenticationType":"The type of authentication used to connect to the ServiceNow instance. If you choose `HTTP_BASIC` , Amazon Kendra is authenticated using the user name and password provided in the AWS Secrets Manager secret in the `SecretArn` field. If you choose `OAUTH2` , Amazon Kendra is authenticated using the credentials of client ID, client secret, user name and password.\\n\\nWhen you use `OAUTH2` authentication, you must generate a token and a client secret using the ServiceNow console. For more information, see [Using a ServiceNow data source](https://docs.aws.amazon.com/kendra/latest/dg/data-source-servicenow.html) .","HostUrl":"The ServiceNow instance that the data source connects to. The host endpoint should look like the following: *{instance}.service-now.com.*","KnowledgeArticleConfiguration":"Configuration information for crawling knowledge articles in the ServiceNow site.","SecretArn":"The Amazon Resource Name (ARN) of the AWS Secrets Manager secret that contains the user name and password required to connect to the ServiceNow instance. You can also provide OAuth authentication credentials of user name, password, client ID, and client secret. For more information, see [Using a ServiceNow data source](https://docs.aws.amazon.com/kendra/latest/dg/data-source-servicenow.html) .","ServiceCatalogConfiguration":"Configuration information for crawling service catalogs in the ServiceNow site.","ServiceNowBuildVersion":"The identifier of the release that the ServiceNow host is running. If the host is not running the `LONDON` release, use `OTHERS` ."}},"AWS::Kendra::DataSource.ServiceNowKnowledgeArticleConfiguration":{"attributes":{},"description":"Provides the configuration information for crawling knowledge articles in the ServiceNow site.","properties":{"CrawlAttachments":"`TRUE` to index attachments to knowledge articles.","DocumentDataFieldName":"The name of the ServiceNow field that is mapped to the index document contents field in the Amazon Kendra index.","DocumentTitleFieldName":"The name of the ServiceNow field that is mapped to the index document title field.","ExcludeAttachmentFilePatterns":"A list of regular expression patterns applied to exclude certain knowledge article attachments. Attachments that match the patterns are excluded from the index. Items that don\'t match the patterns are included in the index. If an item matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the item isn\'t included in the index.","FieldMappings":"Maps attributes or field names of knoweldge articles to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to ServiceNow fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The ServiceNow data source field names must exist in your ServiceNow custom metadata.","FilterQuery":"A query that selects the knowledge articles to index. The query can return articles from multiple knowledge bases, and the knowledge bases can be public or private.\\n\\nThe query string must be one generated by the ServiceNow console. For more information, see [Specifying documents to index with a query](https://docs.aws.amazon.com/kendra/latest/dg/servicenow-query.html) .","IncludeAttachmentFilePatterns":"A list of regular expression patterns applied to include knowledge article attachments. Attachments that match the patterns are included in the index. Items that don\'t match the patterns are excluded from the index. If an item matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the item isn\'t included in the index."}},"AWS::Kendra::DataSource.ServiceNowServiceCatalogConfiguration":{"attributes":{},"description":"Provides the configuration information for crawling service catalog items in the ServiceNow site","properties":{"CrawlAttachments":"`TRUE` to index attachments to service catalog items.","DocumentDataFieldName":"The name of the ServiceNow field that is mapped to the index document contents field in the Amazon Kendra index.","DocumentTitleFieldName":"The name of the ServiceNow field that is mapped to the index document title field.","ExcludeAttachmentFilePatterns":"A list of regular expression patterns to exclude certain attachments of catalogs in your ServiceNow. Item that match the patterns are excluded from the index. Items that don\'t match the patterns are included in the index. If an item matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the item isn\'t included in the index.\\n\\nThe regex is applied to the file name of the attachment.","FieldMappings":"Maps attributes or field names of catalogs to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to ServiceNow fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The ServiceNow data source field names must exist in your ServiceNow custom metadata.","IncludeAttachmentFilePatterns":"A list of regular expression patterns to include certain attachments of catalogs in your ServiceNow. Item that match the patterns are included in the index. Items that don\'t match the patterns are excluded from the index. If an item matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the item isn\'t included in the index.\\n\\nThe regex is applied to the file name of the attachment."}},"AWS::Kendra::DataSource.SharePointConfiguration":{"attributes":{},"description":"Provides the configuration information to connect to Microsoft SharePoint as your data source.","properties":{"CrawlAttachments":"`TRUE` to index document attachments.","DisableLocalGroups":"`TRUE` to disable local groups information.","DocumentTitleFieldName":"The Microsoft SharePoint attribute field that contains the title of the document.","ExclusionPatterns":"A list of regular expression patterns. Documents that match the patterns are excluded from the index. Documents that don\'t match the patterns are included in the index. If a document matches both an exclusion pattern and an inclusion pattern, the document is not included in the index.\\n\\nThe regex is applied to the display URL of the SharePoint document.","FieldMappings":"A list of `DataSourceToIndexFieldMapping` objects that map Microsoft SharePoint attributes or fields to Amazon Kendra index fields. You must first create the index fields using the [UpdateIndex](https://docs.aws.amazon.com/kendra/latest/dg/API_UpdateIndex.html) operation before you map SharePoint attributes. For more information, see [Mapping Data Source Fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) .","InclusionPatterns":"A list of regular expression patterns to include certain documents in your SharePoint. Documents that match the patterns are included in the index. Documents that don\'t match the patterns are excluded from the index. If a document matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the document isn\'t included in the index.\\n\\nThe regex applies to the display URL of the SharePoint document.","SecretArn":"The Amazon Resource Name (ARN) of an AWS Secrets Manager secret that contains the user name and password required to connect to the SharePoint instance. For more information, see [Microsoft SharePoint](https://docs.aws.amazon.com/kendra/latest/dg/data-source-sharepoint.html) .","SharePointVersion":"The version of Microsoft SharePoint that you use.","SslCertificateS3Path":"Information required to find a specific file in an Amazon S3 bucket.","Urls":"The Microsoft SharePoint site URLs for the documents you want to index.","UseChangeLog":"`TRUE` to use the SharePoint change log to determine which documents require updating in the index. Depending on the change log\'s size, it may take longer for Amazon Kendra to use the change log than to scan all of your documents in SharePoint.","VpcConfiguration":"Provides information for connecting to an Amazon VPC."}},"AWS::Kendra::DataSource.SqlConfiguration":{"attributes":{},"description":"Provides information that configures Amazon Kendra to use a SQL database.","properties":{"QueryIdentifiersEnclosingOption":"Determines whether Amazon Kendra encloses SQL identifiers for tables and column names in double quotes (\\") when making a database query. You can set the value to `DOUBLE_QUOTES` or `NONE` .\\n\\nBy default, Amazon Kendra passes SQL identifiers the way that they are entered into the data source configuration. It does not change the case of identifiers or enclose them in quotes.\\n\\nPostgreSQL internally converts uppercase characters to lower case characters in identifiers unless they are quoted. Choosing this option encloses identifiers in quotes so that PostgreSQL does not convert the character\'s case.\\n\\nFor MySQL databases, you must enable the ansi_quotes option when you set this field to `DOUBLE_QUOTES` ."}},"AWS::Kendra::DataSource.WebCrawlerAuthenticationConfiguration":{"attributes":{},"description":"Provides the configuration information to connect to websites that require user authentication.","properties":{"BasicAuthentication":"The list of configuration information that\'s required to connect to and crawl a website host using basic authentication credentials.\\n\\nThe list includes the name and port number of the website host."}},"AWS::Kendra::DataSource.WebCrawlerBasicAuthentication":{"attributes":{},"description":"Provides the configuration information to connect to websites that require basic user authentication.","properties":{"Credentials":"Your secret ARN, which you can create in [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)\\n\\nYou use a secret if basic authentication credentials are required to connect to a website. The secret stores your credentials of user name and password.","Host":"The name of the website host you want to connect to using authentication credentials.\\n\\nFor example, the host name of https://a.example.com/page1.html is \\"a.example.com\\".","Port":"The port number of the website host you want to connect to using authentication credentials.\\n\\nFor example, the port for https://a.example.com/page1.html is 443, the standard port for HTTPS."}},"AWS::Kendra::DataSource.WebCrawlerConfiguration":{"attributes":{},"description":"Provides the configuration information required for Amazon Kendra Web Crawler.","properties":{"AuthenticationConfiguration":"Configuration information required to connect to websites using authentication.\\n\\nYou can connect to websites using basic authentication of user name and password. You use a secret in [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) to store your authentication credentials.\\n\\nYou must provide the website host name and port number. For example, the host name of https://a.example.com/page1.html is \\"a.example.com\\" and the port is 443, the standard port for HTTPS.","CrawlDepth":"The \'depth\' or number of levels from the seed level to crawl. For example, the seed URL page is depth 1 and any hyperlinks on this page that are also crawled are depth 2.","MaxContentSizePerPageInMegaBytes":"The maximum size (in MB) of a web page or attachment to crawl.\\n\\nFiles larger than this size (in MB) are skipped/not crawled.\\n\\nThe default maximum size of a web page or attachment is set to 50 MB.","MaxLinksPerPage":"The maximum number of URLs on a web page to include when crawling a website. This number is per web page.\\n\\nAs a website’s web pages are crawled, any URLs the web pages link to are also crawled. URLs on a web page are crawled in order of appearance.\\n\\nThe default maximum links per page is 100.","MaxUrlsPerMinuteCrawlRate":"The maximum number of URLs crawled per website host per minute.\\n\\nA minimum of one URL is required.\\n\\nThe default maximum number of URLs crawled per website host per minute is 300.","ProxyConfiguration":"Configuration information required to connect to your internal websites via a web proxy.\\n\\nYou must provide the website host name and port number. For example, the host name of https://a.example.com/page1.html is \\"a.example.com\\" and the port is 443, the standard port for HTTPS.\\n\\nWeb proxy credentials are optional and you can use them to connect to a web proxy server that requires basic authentication. To store web proxy credentials, you use a secret in [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) .","UrlExclusionPatterns":"A list of regular expression patterns to exclude certain URLs to crawl. URLs that match the patterns are excluded from the index. URLs that don\'t match the patterns are included in the index. If a URL matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the URL file isn\'t included in the index.","UrlInclusionPatterns":"A list of regular expression patterns to include certain URLs to crawl. URLs that match the patterns are included in the index. URLs that don\'t match the patterns are excluded from the index. If a URL matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the URL file isn\'t included in the index.","Urls":"Specifies the seed or starting point URLs of the websites or the sitemap URLs of the websites you want to crawl.\\n\\nYou can include website subdomains. You can list up to 100 seed URLs and up to three sitemap URLs.\\n\\nYou can only crawl websites that use the secure communication protocol, Hypertext Transfer Protocol Secure (HTTPS). If you receive an error when crawling a website, it could be that the website is blocked from crawling.\\n\\n*When selecting websites to index, you must adhere to the [Amazon Acceptable Use Policy](https://docs.aws.amazon.com/aup/) and all other Amazon terms. Remember that you must only use Amazon Kendra Web Crawler to index your own webpages, or webpages that you have authorization to index.*"}},"AWS::Kendra::DataSource.WebCrawlerSeedUrlConfiguration":{"attributes":{},"description":"Provides the configuration information of the seed or starting point URLs to crawl.\\n\\n*When selecting websites to index, you must adhere to the [Amazon Acceptable Use Policy](https://docs.aws.amazon.com/aup/) and all other Amazon terms. Remember that you must only use the Amazon Kendra web crawler to index your own webpages, or webpages that you have authorization to index.*","properties":{"SeedUrls":"The list of seed or starting point URLs of the websites you want to crawl.\\n\\nThe list can include a maximum of 100 seed URLs.","WebCrawlerMode":"You can choose one of the following modes:\\n\\n- `HOST_ONLY` —crawl only the website host names. For example, if the seed URL is \\"abc.example.com\\", then only URLs with host name \\"abc.example.com\\" are crawled.\\n- `SUBDOMAINS` —crawl the website host names with subdomains. For example, if the seed URL is \\"abc.example.com\\", then \\"a.abc.example.com\\" and \\"b.abc.example.com\\" are also crawled.\\n- `EVERYTHING` —crawl the website host names with subdomains and other domains that the web pages link to.\\n\\nThe default mode is set to `HOST_ONLY` ."}},"AWS::Kendra::DataSource.WebCrawlerSiteMapsConfiguration":{"attributes":{},"description":"Provides the configuration information of the sitemap URLs to crawl.\\n\\n*When selecting websites to index, you must adhere to the [Amazon Acceptable Use Policy](https://docs.aws.amazon.com/aup/) and all other Amazon terms. Remember that you must only use the Amazon Kendra web crawler to index your own webpages, or webpages that you have authorization to index.*","properties":{"SiteMaps":"The list of sitemap URLs of the websites you want to crawl.\\n\\nThe list can include a maximum of three sitemap URLs."}},"AWS::Kendra::DataSource.WebCrawlerUrls":{"attributes":{},"description":"Specifies the seed or starting point URLs of the websites or the sitemap URLs of the websites you want to crawl.\\n\\nYou can include website subdomains. You can list up to 100 seed URLs and up to three sitemap URLs.\\n\\nYou can only crawl websites that use the secure communication protocol, Hypertext Transfer Protocol Secure (HTTPS). If you receive an error when crawling a website, it could be that the website is blocked from crawling.\\n\\n*When selecting websites to index, you must adhere to the [Amazon Acceptable Use Policy](https://docs.aws.amazon.com/aup/) and all other Amazon terms. Remember that you must only use the Amazon Kendra web crawler to index your own webpages, or webpages that you have authorization to index.*","properties":{"SeedUrlConfiguration":"Configuration of the seed or starting point URLs of the websites you want to crawl.\\n\\nYou can choose to crawl only the website host names, or the website host names with subdomains, or the website host names with subdomains and other domains that the web pages link to.\\n\\nYou can list up to 100 seed URLs.","SiteMapsConfiguration":"Configuration of the sitemap URLs of the websites you want to crawl.\\n\\nOnly URLs belonging to the same website host names are crawled. You can list up to three sitemap URLs."}},"AWS::Kendra::DataSource.WorkDocsConfiguration":{"attributes":{},"description":"Provides the configuration information to connect to Amazon WorkDocs as your data source.\\n\\nAmazon WorkDocs connector is available in Oregon, North Virginia, Sydney, Singapore and Ireland regions.","properties":{"CrawlComments":"`TRUE` to include comments on documents in your index. Including comments in your index means each comment is a document that can be searched on.\\n\\nThe default is set to `FALSE` .","ExclusionPatterns":"A list of regular expression patterns to exclude certain files in your Amazon WorkDocs site repository. Files that match the patterns are excluded from the index. Files that don’t match the patterns are included in the index. If a file matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the file isn\'t included in the index.","FieldMappings":"A list of `DataSourceToIndexFieldMapping` objects that map Amazon WorkDocs data source attributes or field names to Amazon Kendra index field names. To create custom fields, use the `UpdateIndex` API before you map to Amazon WorkDocs fields. For more information, see [Mapping data source fields](https://docs.aws.amazon.com/kendra/latest/dg/field-mapping.html) . The Amazon WorkDocs data source field names must exist in your Amazon WorkDocs custom metadata.","InclusionPatterns":"A list of regular expression patterns to include certain files in your Amazon WorkDocs site repository. Files that match the patterns are included in the index. Files that don\'t match the patterns are excluded from the index. If a file matches both an inclusion and exclusion pattern, the exclusion pattern takes precedence and the file isn\'t included in the index.","OrganizationId":"The identifier of the directory corresponding to your Amazon WorkDocs site repository.\\n\\nYou can find the organization ID in the [AWS Directory Service](https://docs.aws.amazon.com/directoryservicev2/) by going to *Active Directory* , then *Directories* . Your Amazon WorkDocs site directory has an ID, which is the organization ID. You can also set up a new Amazon WorkDocs directory in the AWS Directory Service console and enable a Amazon WorkDocs site for the directory in the Amazon WorkDocs console.","UseChangeLog":"`TRUE` to use the Amazon WorkDocs change log to determine which documents require updating in the index. Depending on the change log\'s size, it may take longer for Amazon Kendra to use the change log than to scan all of your documents in Amazon WorkDocs."}},"AWS::Kendra::Faq":{"attributes":{"Arn":"`arn:aws:kendra:us-west-2:111122223333:index/335c3741-41df-46a6-b5d3-61f85b787884/faq/f61995a6-cd5c-4e99-9cfc-58816d8bfaa7`","Id":"The identifier for the FAQ. For example:\\n\\n`f61995a6-cd5c-4e99-9cfc-58816d8bfaa7`","Ref":"`Ref` returns the FAQ identifier. For example:\\n\\n`{ \\"Ref\\": \\"|\\" }`"},"description":"Creates an new set of frequently asked question (FAQ) questions and answers.","properties":{"Description":"A description for the FAQ.","FileFormat":"The format of the input file. You can choose between a basic CSV format, a CSV format that includes customs attributes in a header, and a JSON format that includes custom attributes.\\n\\nThe format must match the format of the file stored in the S3 bucket identified in the S3Path parameter.\\n\\nValid values are:\\n\\n- `CSV`\\n- `CSV_WITH_HEADER`\\n- `JSON`","IndexId":"The identifier of the index that contains the FAQ.","Name":"The name that you assigned the FAQ when you created or updated the FAQ.","RoleArn":"The Amazon Resource Name (ARN) of a role with permission to access the S3 bucket that contains the FAQ.","S3Path":"The Amazon Simple Storage Service (Amazon S3) location of the FAQ input data.","Tags":"An array of key-value pairs to apply to this resource\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::Kendra::Faq.S3Path":{"attributes":{},"description":"Information required to find a specific file in an Amazon S3 bucket.","properties":{"Bucket":"The name of the S3 bucket that contains the file.","Key":"The name of the file."}},"AWS::Kendra::Index":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the index. For example: `arn:aws:kendra:us-west-2:111122223333:index/0123456789abcdef` .","Id":"The identifier for the index. For example: `f4aeaa10-8056-4b2c-a343-522ca0f41234` .","Ref":"`Ref` returns the index ID. For example:\\n\\n`{\\"Ref\\": \\"index-id\\"}`"},"description":"Creates an Amazon Kendra index\\n\\nOnce the index is active you can add documents to your index using the [BatchPutDocument](https://docs.aws.amazon.com/kendra/latest/dg/BatchPutDocument.html) operation or using one of the supported data sources.","properties":{"CapacityUnits":"","Description":"A description for the index.","DocumentMetadataConfigurations":"Specifies the properties of an index field. You can add either a custom or a built-in field. You can add and remove built-in fields at any time. When a built-in field is removed it\'s configuration reverts to the default for the field. Custom fields can\'t be removed from an index after they are added.","Edition":"Indicates whether the index is a Enterprise Edition index or a Developer Edition index. Valid values are `DEVELOPER_EDITION` and `ENTERPRISE_EDITION` .","Name":"The name of the index.","RoleArn":"An IAM role that gives Amazon Kendra permissions to access your Amazon CloudWatch logs and metrics. This is also the role used when you use the [BatchPutDocument](https://docs.aws.amazon.com/kendra/latest/dg/BatchPutDocument.html) operation to index documents from an Amazon S3 bucket.","ServerSideEncryptionConfiguration":"The identifier of the AWS KMS customer managed key (CMK) to use to encrypt data indexed by Amazon Kendra. Amazon Kendra doesn\'t support asymmetric CMKs.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","UserContextPolicy":"The user context policy.\\n\\nATTRIBUTE_FILTER\\n\\n- All indexed content is searchable and displayable for all users. If you want to filter search results on user context, you can use the attribute filters of `_user_id` and `_group_ids` or you can provide user and group information in `UserContext` .\\n\\nUSER_TOKEN\\n\\n- Enables token-based user access control to filter search results on user context. All documents with no access control and all documents accessible to the user will be searchable and displayable.","UserTokenConfigurations":"Defines the type of user token used for the index."}},"AWS::Kendra::Index.CapacityUnitsConfiguration":{"attributes":{},"description":"Specifies additional capacity units configured for your Enterprise Edition index. You can add and remove capacity units to fit your usage requirements.","properties":{"QueryCapacityUnits":"The amount of extra query capacity for an index and [GetQuerySuggestions](https://docs.aws.amazon.com/kendra/latest/dg/API_GetQuerySuggestions.html) capacity.\\n\\nA single extra capacity unit for an index provides 0.1 queries per second or approximately 8,000 queries per day. You can add up to 100 extra capacity units.\\n\\n`GetQuerySuggestions` capacity is five times the provisioned query capacity for an index, or the base capacity of 2.5 calls per second, whichever is higher. For example, the base capacity for an index is 0.1 queries per second, and `GetQuerySuggestions` capacity has a base of 2.5 calls per second. If you add another 0.1 queries per second to total 0.2 queries per second for an index, the `GetQuerySuggestions` capacity is 2.5 calls per second (higher than five times 0.2 queries per second).","StorageCapacityUnits":"The amount of extra storage capacity for an index. A single capacity unit provides 30 GB of storage space or 100,000 documents, whichever is reached first. You can add up to 100 extra capacity units."}},"AWS::Kendra::Index.DocumentMetadataConfiguration":{"attributes":{},"description":"Specifies the properties, such as relevance tuning and searchability, of an index field.","properties":{"Name":"The name of the index field.","Relevance":"Provides tuning parameters to determine how the field affects the search results.","Search":"Provides information about how the field is used during a search.","Type":"The data type of the index field."}},"AWS::Kendra::Index.JsonTokenTypeConfiguration":{"attributes":{},"description":"Provides the configuration information for the JSON token type.","properties":{"GroupAttributeField":"The group attribute field.","UserNameAttributeField":"The user name attribute field."}},"AWS::Kendra::Index.JwtTokenTypeConfiguration":{"attributes":{},"description":"Provides the configuration information for the JWT token type.","properties":{"ClaimRegex":"The regular expression that identifies the claim.","GroupAttributeField":"The group attribute field.","Issuer":"The issuer of the token.","KeyLocation":"The location of the key.","SecretManagerArn":"The Amazon Resource Name (arn) of the secret.","URL":"The signing key URL.","UserNameAttributeField":"The user name attribute field."}},"AWS::Kendra::Index.Relevance":{"attributes":{},"description":"Provides information for tuning the relevance of a field in a search. When a query includes terms that match the field, the results are given a boost in the response based on these tuning parameters.","properties":{"Duration":"Specifies the time period that the boost applies to. For example, to make the boost apply to documents with the field value within the last month, you would use \\"2628000s\\". Once the field value is beyond the specified range, the effect of the boost drops off. The higher the importance, the faster the effect drops off. If you don\'t specify a value, the default is 3 months. The value of the field is a numeric string followed by the character \\"s\\", for example \\"86400s\\" for one day, or \\"604800s\\" for one week.\\n\\nOnly applies to `DATE` fields.","Freshness":"Indicates that this field determines how \\"fresh\\" a document is. For example, if document 1 was created on November 5, and document 2 was created on October 31, document 1 is \\"fresher\\" than document 2. You can only set the `Freshness` field on one `DATE` type field. Only applies to `DATE` fields.","Importance":"The relative importance of the field in the search. Larger numbers provide more of a boost than smaller numbers.","RankOrder":"Determines how values should be interpreted.\\n\\nWhen the `RankOrder` field is `ASCENDING` , higher numbers are better. For example, a document with a rating score of 10 is higher ranking than a document with a rating score of 1.\\n\\nWhen the `RankOrder` field is `DESCENDING` , lower numbers are better. For example, in a task tracking application, a priority 1 task is more important than a priority 5 task.\\n\\nOnly applies to `LONG` and `DOUBLE` fields.","ValueImportanceItems":"An array of key-value pairs for different boosts when they appear in the search result list. For example, if you want to boost query terms that match the \\"department\\" field in the result, query terms that match this field are boosted in the result. You can add entries from the department field to boost documents with those values higher.\\n\\nFor example, you can add entries to the map with names of departments. If you add \\"HR\\", 5 and \\"Legal\\",3 those departments are given special attention when they appear in the metadata of a document."}},"AWS::Kendra::Index.Search":{"attributes":{},"description":"Provides information about how a custom index field is used during a search.","properties":{"Displayable":"Determines whether the field is returned in the query response. The default is `true` .","Facetable":"Indicates that the field can be used to create search facets, a count of results for each value in the field. The default is `false` .","Searchable":"Determines whether the field is used in the search. If the `Searchable` field is `true` , you can use relevance tuning to manually tune how Amazon Kendra weights the field in the search. The default is `true` for string fields and `false` for number and date fields.","Sortable":"Determines whether the field can be used to sort the results of a query. The default is `false` ."}},"AWS::Kendra::Index.ServerSideEncryptionConfiguration":{"attributes":{},"description":"Provides the identifier of the AWS KMS customer master key (CMK) used to encrypt data indexed by Amazon Kendra. We suggest that you use a CMK from your account to help secure your index. Amazon Kendra doesn\'t support asymmetric CMKs.","properties":{"KmsKeyId":"The identifier of the AWS KMS key . Amazon Kendra doesn\'t support asymmetric keys."}},"AWS::Kendra::Index.UserTokenConfiguration":{"attributes":{},"description":"Provides the configuration information for a token.","properties":{"JsonTokenTypeConfiguration":"Information about the JSON token type configuration.","JwtTokenTypeConfiguration":"Information about the JWT token type configuration."}},"AWS::Kendra::Index.ValueImportanceItem":{"attributes":{},"description":"Specifies a key-value pair of the search boost value for a document when the key is part of the metadata of a document.","properties":{"Key":"The document metadata value used for the search boost.","Value":"The boost value for a document when the key is part of the metadata of a document."}},"AWS::KendraRanking::ExecutionPlan":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the rescore execution plan.","Id":"The identifier of the rescore execution plan.","Ref":"`Ref` returns the rescore execution plan ID. For example:\\n\\n`{\\"Ref\\": \\"rescore-execution-plan-id\\"}`"},"description":"Creates a rescore execution plan. A rescore execution plan is an Amazon Kendra Intelligent Ranking resource used for provisioning the `Rescore` API. You set the number of capacity units that you require for Amazon Kendra Intelligent Ranking to rescore or re-rank a search service\'s results.\\n\\nFor an example of using the `CreateRescoreExecutionPlan` API, including using the Python and Java SDKs, see [Semantically ranking a search service\'s results](https://docs.aws.amazon.com/kendra/latest/dg/search-service-rerank.html) .","properties":{"CapacityUnits":"You can set additional capacity units to meet the needs of your rescore execution plan. You are given a single capacity unit by default. If you want to use the default capacity, you don\'t set additional capacity units. For more information on the default capacity and additional capacity units, see [Adjusting capacity](https://docs.aws.amazon.com/kendra/latest/dg/adjusting-capacity.html) .","Description":"A description for the rescore execution plan.","Name":"A name for the rescore execution plan.","Tags":"A list of key-value pairs that identify or categorize your rescore execution plan. You can also use tags to help control access to the rescore execution plan. Tag keys and values can consist of Unicode letters, digits, white space. They can also consist of underscore, period, colon, equal, plus, and asperand."}},"AWS::KendraRanking::ExecutionPlan.CapacityUnitsConfiguration":{"attributes":{},"description":"Sets additional capacity units configured for your rescore execution plan. A rescore execution plan is an Amazon Kendra Intelligent Ranking resource used for provisioning the `Rescore` API. You can add and remove capacity units to fit your usage requirements.","properties":{"RescoreCapacityUnits":"The amount of extra capacity for your rescore execution plan.\\n\\nA single extra capacity unit for a rescore execution plan provides 0.01 rescore requests per second. You can add up to 1000 extra capacity units."}},"AWS::Kinesis::Stream":{"attributes":{"Arn":"The Amazon resource name (ARN) of the Kinesis stream, such as `arn:aws:kinesis:us-east-2:123456789012:stream/mystream` .","Ref":"When you specify an AWS::Kinesis::Stream resource as an argument to the `Ref` function, AWS CloudFormation returns the stream name (physical ID).\\n\\nFor more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates a Kinesis stream that captures and transports data records that are emitted from data sources. For information about creating streams, see [CreateStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_CreateStream.html) in the Amazon Kinesis API Reference.","properties":{"Name":"The name of the Kinesis stream. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the stream name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\nIf you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","RetentionPeriodHours":"The number of hours for the data records that are stored in shards to remain accessible. The default value is 24. For more information about the stream retention period, see [Changing the Data Retention Period](https://docs.aws.amazon.com/streams/latest/dev/kinesis-extended-retention.html) in the Amazon Kinesis Developer Guide.","ShardCount":"The number of shards that the stream uses. For greater provisioned throughput, increase the number of shards.","StreamEncryption":"When specified, enables or updates server-side encryption using an AWS KMS key for a specified stream. Removing this property from your stack template and updating your stack disables encryption.","StreamModeDetails":"Specifies the capacity mode to which you want to set your data stream. Currently, in Kinesis Data Streams, you can choose between an *on-demand* capacity mode and a *provisioned* capacity mode for your data streams.","Tags":"An arbitrary set of tags (key–value pairs) to associate with the Kinesis stream. For information about constraints for this property, see [Tag Restrictions](https://docs.aws.amazon.com/streams/latest/dev/tagging.html#tagging-restrictions) in the *Amazon Kinesis Developer Guide* ."}},"AWS::Kinesis::Stream.StreamEncryption":{"attributes":{},"description":"Enables or updates server-side encryption using an AWS KMS key for a specified stream.\\n\\n> When invoking this API, you must use either the `StreamARN` or the `StreamName` parameter, or both. It is recommended that you use the `StreamARN` input parameter when you invoke this API. \\n\\nStarting encryption is an asynchronous operation. Upon receiving the request, Kinesis Data Streams returns immediately and sets the status of the stream to `UPDATING` . After the update is complete, Kinesis Data Streams sets the status of the stream back to `ACTIVE` . Updating or applying encryption normally takes a few seconds to complete, but it can take minutes. You can continue to read and write data to your stream while its status is `UPDATING` . Once the status of the stream is `ACTIVE` , encryption begins for records written to the stream.\\n\\nAPI Limits: You can successfully apply a new AWS KMS key for server-side encryption 25 times in a rolling 24-hour period.\\n\\nNote: It can take up to 5 seconds after the stream is in an `ACTIVE` status before all records written to the stream are encrypted. After you enable encryption, you can verify that encryption is applied by inspecting the API response from `PutRecord` or `PutRecords` .","properties":{"EncryptionType":"The encryption type to use. The only valid value is `KMS` .","KeyId":"The GUID for the customer-managed AWS KMS key to use for encryption. This value can be a globally unique identifier, a fully specified Amazon Resource Name (ARN) to either an alias or a key, or an alias name prefixed by \\"alias/\\".You can also use a master key owned by Kinesis Data Streams by specifying the alias `aws/kinesis` .\\n\\n- Key ARN example: `arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012`\\n- Alias ARN example: `arn:aws:kms:us-east-1:123456789012:alias/MyAliasName`\\n- Globally unique key ID example: `12345678-1234-1234-1234-123456789012`\\n- Alias name example: `alias/MyAliasName`\\n- Master key owned by Kinesis Data Streams: `alias/aws/kinesis`"}},"AWS::Kinesis::Stream.StreamModeDetails":{"attributes":{},"description":"Specifies the capacity mode to which you want to set your data stream. Currently, in Kinesis Data Streams, you can choose between an *on-demand* capacity mode and a *provisioned* capacity mode for your data streams.","properties":{"StreamMode":"Specifies the capacity mode to which you want to set your data stream. Currently, in Kinesis Data Streams, you can choose between an *on-demand* capacity mode and a *provisioned* capacity mode for your data streams."}},"AWS::Kinesis::StreamConsumer":{"attributes":{"ConsumerARN":"When you register a consumer, Kinesis Data Streams generates an ARN for it. You need this ARN to be able to call [SubscribeToShard](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_SubscribeToShard.html) .\\n\\nIf you delete a consumer and then create a new one with the same name, it won\'t have the same ARN. That\'s because consumer ARNs contain the creation timestamp. This is important to keep in mind if you have IAM policies that reference consumer ARNs.","ConsumerCreationTimestamp":"The time at which the consumer was created.","ConsumerName":"The name you gave the consumer when you registered it.","ConsumerStatus":"A consumer can\'t read data while in the `CREATING` or `DELETING` states.","Ref":"When you pass the logical ID of an `AWS::Kinesis::StreamConsumer` resource to the intrinsic Ref function, the function returns the consumer ARN. For example ARN formats, see [Example ARNs](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arns-syntax) .\\n\\nFor more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) .","StreamARN":"The ARN of the data stream with which the consumer is registered."},"description":"Use the AWS CloudFormation `AWS::Kinesis::StreamConsumer` resource to register a consumer with a Kinesis data stream. The consumer you register can then call [SubscribeToShard](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_SubscribeToShard.html) to receive data from the stream using enhanced fan-out, at a rate of up to 2 MiB per second for every shard you subscribe to. This rate is unaffected by the total number of consumers that read from the same stream.\\n\\nYou can register up to five consumers per stream. However, you can request a limit increase using the [Kinesis Data Streams limits form](https://docs.aws.amazon.com/support/v1?#/) . A given consumer can only be registered with one stream at a time.\\n\\nFor more information, see [Using Consumers with Enhanced Fan-Out](https://docs.aws.amazon.com/streams/latest/dev/introduction-to-enhanced-consumers.html) .","properties":{"ConsumerName":"The name of the consumer is something you choose when you register the consumer.","StreamARN":"The ARN of the stream with which you registered the consumer."}},"AWS::KinesisAnalytics::Application":{"attributes":{},"description":"The `AWS::KinesisAnalytics::Application` resource creates an Amazon Kinesis Data Analytics application. For more information, see the [Amazon Kinesis Data Analytics Developer Guide](https://docs.aws.amazon.com//kinesisanalytics/latest/dev/what-is.html) .","properties":{"ApplicationCode":"One or more SQL statements that read input data, transform it, and generate output. For example, you can write a SQL statement that reads data from one in-application stream, generates a running average of the number of advertisement clicks by vendor, and insert resulting rows in another in-application stream using pumps. For more information about the typical pattern, see [Application Code](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-app-code.html) .\\n\\nYou can provide such series of SQL statements, where output of one statement can be used as the input for the next statement. You store intermediate results by creating in-application streams and pumps.\\n\\nNote that the application code must create the streams with names specified in the `Outputs` . For example, if your `Outputs` defines output streams named `ExampleOutputStream1` and `ExampleOutputStream2` , then your application code must create these streams.","ApplicationDescription":"Summary description of the application.","ApplicationName":"Name of your Amazon Kinesis Analytics application (for example, `sample-app` ).","Inputs":"Use this parameter to configure the application input.\\n\\nYou can configure your application to receive input from a single streaming source. In this configuration, you map this streaming source to an in-application stream that is created. Your application code can then query the in-application stream like a table (you can think of it as a constantly updating table).\\n\\nFor the streaming source, you provide its Amazon Resource Name (ARN) and format of data on the stream (for example, JSON, CSV, etc.). You also must provide an IAM role that Amazon Kinesis Analytics can assume to read this stream on your behalf.\\n\\nTo create the in-application stream, you need to specify a schema to transform your data into a schematized version used in SQL. In the schema, you provide the necessary mapping of the data elements in the streaming source to record columns in the in-app stream."}},"AWS::KinesisAnalytics::Application.CSVMappingParameters":{"attributes":{},"description":"Provides additional mapping information when the record format uses delimiters, such as CSV. For example, the following sample records use CSV format, where the records use the *\'\\\\n\'* as the row delimiter and a comma (\\",\\") as the column delimiter:\\n\\n`\\"name1\\", \\"address1\\"`\\n\\n`\\"name2\\", \\"address2\\"`","properties":{"RecordColumnDelimiter":"Column delimiter. For example, in a CSV format, a comma (\\",\\") is the typical column delimiter.","RecordRowDelimiter":"Row delimiter. For example, in a CSV format, *\'\\\\n\'* is the typical row delimiter."}},"AWS::KinesisAnalytics::Application.Input":{"attributes":{},"description":"When you configure the application input, you specify the streaming source, the in-application stream name that is created, and the mapping between the two. For more information, see [Configuring Application Input](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-input.html) .","properties":{"InputParallelism":"Describes the number of in-application streams to create.\\n\\nData from your source is routed to these in-application input streams.\\n\\nSee [Configuring Application Input](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-input.html) .","InputProcessingConfiguration":"The [InputProcessingConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputprocessingconfiguration.html) for the input. An input processor transforms records as they are received from the stream, before the application\'s SQL code executes. Currently, the only input processing configuration available is [InputLambdaProcessor](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputlambdaprocessor.html) .","InputSchema":"Describes the format of the data in the streaming source, and how each data element maps to corresponding columns in the in-application stream that is being created.\\n\\nAlso used to describe the format of the reference data source.","KinesisFirehoseInput":"If the streaming source is an Amazon Kinesis Firehose delivery stream, identifies the delivery stream\'s ARN and an IAM role that enables Amazon Kinesis Analytics to access the stream on your behalf.\\n\\nNote: Either `KinesisStreamsInput` or `KinesisFirehoseInput` is required.","KinesisStreamsInput":"If the streaming source is an Amazon Kinesis stream, identifies the stream\'s Amazon Resource Name (ARN) and an IAM role that enables Amazon Kinesis Analytics to access the stream on your behalf.\\n\\nNote: Either `KinesisStreamsInput` or `KinesisFirehoseInput` is required.","NamePrefix":"Name prefix to use when creating an in-application stream. Suppose that you specify a prefix \\"MyInApplicationStream.\\" Amazon Kinesis Analytics then creates one or more (as per the `InputParallelism` count you specified) in-application streams with names \\"MyInApplicationStream_001,\\" \\"MyInApplicationStream_002,\\" and so on."}},"AWS::KinesisAnalytics::Application.InputLambdaProcessor":{"attributes":{},"description":"An object that contains the Amazon Resource Name (ARN) of the [AWS Lambda](https://docs.aws.amazon.com/lambda/) function that is used to preprocess records in the stream, and the ARN of the IAM role that is used to access the AWS Lambda function.","properties":{"ResourceARN":"The ARN of the [AWS Lambda](https://docs.aws.amazon.com/lambda/) function that operates on records in the stream.\\n\\n> To specify an earlier version of the Lambda function than the latest, include the Lambda function version in the Lambda function ARN. For more information about Lambda ARNs, see [Example ARNs: AWS Lambda](https://docs.aws.amazon.com//general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-lambda)","RoleARN":"The ARN of the IAM role that is used to access the AWS Lambda function."}},"AWS::KinesisAnalytics::Application.InputParallelism":{"attributes":{},"description":"Describes the number of in-application streams to create for a given streaming source. For information about parallelism, see [Configuring Application Input](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-input.html) .","properties":{"Count":"Number of in-application streams to create. For more information, see [Limits](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/limits.html) ."}},"AWS::KinesisAnalytics::Application.InputProcessingConfiguration":{"attributes":{},"description":"Provides a description of a processor that is used to preprocess the records in the stream before being processed by your application code. Currently, the only input processor available is [AWS Lambda](https://docs.aws.amazon.com/lambda/) .","properties":{"InputLambdaProcessor":"The [InputLambdaProcessor](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputlambdaprocessor.html) that is used to preprocess the records in the stream before being processed by your application code."}},"AWS::KinesisAnalytics::Application.InputSchema":{"attributes":{},"description":"Describes the format of the data in the streaming source, and how each data element maps to corresponding columns in the in-application stream that is being created.\\n\\nAlso used to describe the format of the reference data source.","properties":{"RecordColumns":"A list of `RecordColumn` objects.","RecordEncoding":"Specifies the encoding of the records in the streaming source. For example, UTF-8.","RecordFormat":"Specifies the format of the records on the streaming source."}},"AWS::KinesisAnalytics::Application.JSONMappingParameters":{"attributes":{},"description":"Provides additional mapping information when JSON is the record format on the streaming source.","properties":{"RecordRowPath":"Path to the top-level parent that contains the records."}},"AWS::KinesisAnalytics::Application.KinesisFirehoseInput":{"attributes":{},"description":"Identifies an Amazon Kinesis Firehose delivery stream as the streaming source. You provide the delivery stream\'s Amazon Resource Name (ARN) and an IAM role ARN that enables Amazon Kinesis Analytics to access the stream on your behalf.","properties":{"ResourceARN":"ARN of the input delivery stream.","RoleARN":"ARN of the IAM role that Amazon Kinesis Analytics can assume to access the stream on your behalf. You need to make sure that the role has the necessary permissions to access the stream."}},"AWS::KinesisAnalytics::Application.KinesisStreamsInput":{"attributes":{},"description":"Identifies an Amazon Kinesis stream as the streaming source. You provide the stream\'s Amazon Resource Name (ARN) and an IAM role ARN that enables Amazon Kinesis Analytics to access the stream on your behalf.","properties":{"ResourceARN":"ARN of the input Amazon Kinesis stream to read.","RoleARN":"ARN of the IAM role that Amazon Kinesis Analytics can assume to access the stream on your behalf. You need to grant the necessary permissions to this role."}},"AWS::KinesisAnalytics::Application.MappingParameters":{"attributes":{},"description":"When configuring application input at the time of creating or updating an application, provides additional mapping information specific to the record format (such as JSON, CSV, or record fields delimited by some delimiter) on the streaming source.","properties":{"CSVMappingParameters":"Provides additional mapping information when the record format uses delimiters (for example, CSV).","JSONMappingParameters":"Provides additional mapping information when JSON is the record format on the streaming source."}},"AWS::KinesisAnalytics::Application.RecordColumn":{"attributes":{},"description":"Describes the mapping of each data element in the streaming source to the corresponding column in the in-application stream.\\n\\nAlso used to describe the format of the reference data source.","properties":{"Mapping":"Reference to the data element in the streaming input or the reference data source. This element is required if the [RecordFormatType](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/API_RecordFormat.html#analytics-Type-RecordFormat-RecordFormatTypel) is `JSON` .","Name":"Name of the column created in the in-application input stream or reference table.","SqlType":"Type of column created in the in-application input stream or reference table."}},"AWS::KinesisAnalytics::Application.RecordFormat":{"attributes":{},"description":"Describes the record format and relevant mapping information that should be applied to schematize the records on the stream.","properties":{"MappingParameters":"When configuring application input at the time of creating or updating an application, provides additional mapping information specific to the record format (such as JSON, CSV, or record fields delimited by some delimiter) on the streaming source.","RecordFormatType":"The type of record format."}},"AWS::KinesisAnalytics::ApplicationOutput":{"attributes":{},"description":"Adds an external destination to your Amazon Kinesis Analytics application.\\n\\nIf you want Amazon Kinesis Analytics to deliver data from an in-application stream within your application to an external destination (such as an Amazon Kinesis stream, an Amazon Kinesis Firehose delivery stream, or an Amazon Lambda function), you add the relevant configuration to your application using this operation. You can configure one or more outputs for your application. Each output configuration maps an in-application stream and an external destination.\\n\\nYou can use one of the output configurations to deliver data from your in-application error stream to an external destination so that you can analyze the errors. For more information, see [Understanding Application Output (Destination)](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-output.html) .\\n\\nAny configuration update, including adding a streaming source using this operation, results in a new version of the application. You can use the `DescribeApplication` operation to find the current application version.\\n\\nFor the limits on the number of application inputs and outputs you can configure, see [Limits](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/limits.html) .\\n\\nThis operation requires permissions to perform the `kinesisanalytics:AddApplicationOutput` action.","properties":{"ApplicationName":"Name of the application to which you want to add the output configuration.","Output":"An array of objects, each describing one output configuration. In the output configuration, you specify the name of an in-application stream, a destination (that is, an Amazon Kinesis stream, an Amazon Kinesis Firehose delivery stream, or an AWS Lambda function), and record the formation to use when writing to the destination."}},"AWS::KinesisAnalytics::ApplicationOutput.DestinationSchema":{"attributes":{},"description":"Describes the data format when records are written to the destination. For more information, see [Configuring Application Output](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-output.html) .","properties":{"RecordFormatType":"Specifies the format of the records on the output stream."}},"AWS::KinesisAnalytics::ApplicationOutput.KinesisFirehoseOutput":{"attributes":{},"description":"When configuring application output, identifies an Amazon Kinesis Firehose delivery stream as the destination. You provide the stream Amazon Resource Name (ARN) and an IAM role that enables Amazon Kinesis Analytics to write to the stream on your behalf.","properties":{"ResourceARN":"ARN of the destination Amazon Kinesis Firehose delivery stream to write to.","RoleARN":"ARN of the IAM role that Amazon Kinesis Analytics can assume to write to the destination stream on your behalf. You need to grant the necessary permissions to this role."}},"AWS::KinesisAnalytics::ApplicationOutput.KinesisStreamsOutput":{"attributes":{},"description":"When configuring application output, identifies an Amazon Kinesis stream as the destination. You provide the stream Amazon Resource Name (ARN) and also an IAM role ARN that Amazon Kinesis Analytics can use to write to the stream on your behalf.","properties":{"ResourceARN":"ARN of the destination Amazon Kinesis stream to write to.","RoleARN":"ARN of the IAM role that Amazon Kinesis Analytics can assume to write to the destination stream on your behalf. You need to grant the necessary permissions to this role."}},"AWS::KinesisAnalytics::ApplicationOutput.LambdaOutput":{"attributes":{},"description":"When configuring application output, identifies an AWS Lambda function as the destination. You provide the function Amazon Resource Name (ARN) and also an IAM role ARN that Amazon Kinesis Analytics can use to write to the function on your behalf.","properties":{"ResourceARN":"Amazon Resource Name (ARN) of the destination Lambda function to write to.\\n\\n> To specify an earlier version of the Lambda function than the latest, include the Lambda function version in the Lambda function ARN. For more information about Lambda ARNs, see [Example ARNs: AWS Lambda](https://docs.aws.amazon.com//general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-lambda)","RoleARN":"ARN of the IAM role that Amazon Kinesis Analytics can assume to write to the destination function on your behalf. You need to grant the necessary permissions to this role."}},"AWS::KinesisAnalytics::ApplicationOutput.Output":{"attributes":{},"description":"Describes application output configuration in which you identify an in-application stream and a destination where you want the in-application stream data to be written. The destination can be an Amazon Kinesis stream or an Amazon Kinesis Firehose delivery stream.\\n\\nFor limits on how many destinations an application can write and other limitations, see [Limits](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/limits.html) .","properties":{"DestinationSchema":"Describes the data format when records are written to the destination. For more information, see [Configuring Application Output](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-output.html) .","KinesisFirehoseOutput":"Identifies an Amazon Kinesis Firehose delivery stream as the destination.","KinesisStreamsOutput":"Identifies an Amazon Kinesis stream as the destination.","LambdaOutput":"Identifies an AWS Lambda function as the destination.","Name":"Name of the in-application stream."}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource":{"attributes":{},"description":"Adds a reference data source to an existing application.\\n\\nAmazon Kinesis Analytics reads reference data (that is, an Amazon S3 object) and creates an in-application table within your application. In the request, you provide the source (S3 bucket name and object key name), name of the in-application table to create, and the necessary mapping information that describes how data in Amazon S3 object maps to columns in the resulting in-application table.\\n\\nFor conceptual information, see [Configuring Application Input](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-input.html) . For the limits on data sources you can add to your application, see [Limits](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/limits.html) .\\n\\nThis operation requires permissions to perform the `kinesisanalytics:AddApplicationOutput` action.","properties":{"ApplicationName":"Name of an existing application.","ReferenceDataSource":"The reference data source can be an object in your Amazon S3 bucket. Amazon Kinesis Analytics reads the object and copies the data into the in-application table that is created. You provide an S3 bucket, object key name, and the resulting in-application table that is created. You must also provide an IAM role with the necessary permissions that Amazon Kinesis Analytics can assume to read the object from your S3 bucket on your behalf."}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.CSVMappingParameters":{"attributes":{},"description":"Provides additional mapping information when the record format uses delimiters, such as CSV. For example, the following sample records use CSV format, where the records use the *\'\\\\n\'* as the row delimiter and a comma (\\",\\") as the column delimiter:\\n\\n`\\"name1\\", \\"address1\\"`\\n\\n`\\"name2\\", \\"address2\\"`","properties":{"RecordColumnDelimiter":"Column delimiter. For example, in a CSV format, a comma (\\",\\") is the typical column delimiter.","RecordRowDelimiter":"Row delimiter. For example, in a CSV format, *\'\\\\n\'* is the typical row delimiter."}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.JSONMappingParameters":{"attributes":{},"description":"Provides additional mapping information when JSON is the record format on the streaming source.","properties":{"RecordRowPath":"Path to the top-level parent that contains the records."}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.MappingParameters":{"attributes":{},"description":"When configuring application input at the time of creating or updating an application, provides additional mapping information specific to the record format (such as JSON, CSV, or record fields delimited by some delimiter) on the streaming source.","properties":{"CSVMappingParameters":"Provides additional mapping information when the record format uses delimiters (for example, CSV).","JSONMappingParameters":"Provides additional mapping information when JSON is the record format on the streaming source."}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.RecordColumn":{"attributes":{},"description":"Describes the mapping of each data element in the streaming source to the corresponding column in the in-application stream.\\n\\nAlso used to describe the format of the reference data source.","properties":{"Mapping":"Reference to the data element in the streaming input or the reference data source. This element is required if the [RecordFormatType](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/API_RecordFormat.html#analytics-Type-RecordFormat-RecordFormatTypel) is `JSON` .","Name":"Name of the column created in the in-application input stream or reference table.","SqlType":"Type of column created in the in-application input stream or reference table."}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.RecordFormat":{"attributes":{},"description":"Describes the record format and relevant mapping information that should be applied to schematize the records on the stream.","properties":{"MappingParameters":"When configuring application input at the time of creating or updating an application, provides additional mapping information specific to the record format (such as JSON, CSV, or record fields delimited by some delimiter) on the streaming source.","RecordFormatType":"The type of record format."}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.ReferenceDataSource":{"attributes":{},"description":"Describes the reference data source by providing the source information (S3 bucket name and object key name), the resulting in-application table name that is created, and the necessary schema to map the data elements in the Amazon S3 object to the in-application table.","properties":{"ReferenceSchema":"Describes the format of the data in the streaming source, and how each data element maps to corresponding columns created in the in-application stream.","S3ReferenceDataSource":"Identifies the S3 bucket and object that contains the reference data. Also identifies the IAM role Amazon Kinesis Analytics can assume to read this object on your behalf. An Amazon Kinesis Analytics application loads reference data only once. If the data changes, you call the `UpdateApplication` operation to trigger reloading of data into your application.","TableName":"Name of the in-application table to create."}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.ReferenceSchema":{"attributes":{},"description":"The ReferenceSchema property type specifies the format of the data in the reference source for a SQL-based Amazon Kinesis Data Analytics application.","properties":{"RecordColumns":"A list of RecordColumn objects.","RecordEncoding":"Specifies the encoding of the records in the reference source. For example, UTF-8.","RecordFormat":"Specifies the format of the records on the reference source."}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.S3ReferenceDataSource":{"attributes":{},"description":"Identifies the S3 bucket and object that contains the reference data. Also identifies the IAM role Amazon Kinesis Analytics can assume to read this object on your behalf.\\n\\nAn Amazon Kinesis Analytics application loads reference data only once. If the data changes, you call the [UpdateApplication](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/API_UpdateApplication.html) operation to trigger reloading of data into your application.","properties":{"BucketARN":"Amazon Resource Name (ARN) of the S3 bucket.","FileKey":"Object key name containing reference data.","ReferenceRoleARN":"ARN of the IAM role that the service can assume to read data on your behalf. This role must have permission for the `s3:GetObject` action on the object and trust policy that allows Amazon Kinesis Analytics service principal to assume this role."}},"AWS::KinesisAnalyticsV2::Application":{"attributes":{},"description":"Creates an Amazon Kinesis Data Analytics application. For information about creating a Kinesis Data Analytics application, see [Creating an Application](https://docs.aws.amazon.com/kinesisanalytics/latest/java/getting-started.html) .","properties":{"ApplicationConfiguration":"Use this parameter to configure the application.","ApplicationDescription":"The description of the application.","ApplicationMaintenanceConfiguration":"","ApplicationMode":"To create a Kinesis Data Analytics Studio notebook, you must set the mode to `INTERACTIVE` . However, for a Kinesis Data Analytics for Apache Flink application, the mode is optional.","ApplicationName":"The name of the application.","RunConfiguration":"","RuntimeEnvironment":"The runtime environment for the application.","ServiceExecutionRole":"Specifies the IAM role that the application uses to access external resources.","Tags":"A list of one or more tags to assign to the application. A tag is a key-value pair that identifies an application. Note that the maximum number of application tags includes system tags. The maximum number of user-defined application tags is 50."}},"AWS::KinesisAnalyticsV2::Application.ApplicationCodeConfiguration":{"attributes":{},"description":"Describes code configuration for an application.","properties":{"CodeContent":"The location and type of the application code.","CodeContentType":"Specifies whether the code content is in text or zip format."}},"AWS::KinesisAnalyticsV2::Application.ApplicationConfiguration":{"attributes":{},"description":"Specifies the creation parameters for a Kinesis Data Analytics application.","properties":{"ApplicationCodeConfiguration":"The code location and type parameters for a Flink-based Kinesis Data Analytics application.","ApplicationSnapshotConfiguration":"Describes whether snapshots are enabled for a Flink-based Kinesis Data Analytics application.","EnvironmentProperties":"Describes execution properties for a Flink-based Kinesis Data Analytics application.","FlinkApplicationConfiguration":"The creation and update parameters for a Flink-based Kinesis Data Analytics application.","SqlApplicationConfiguration":"The creation and update parameters for a SQL-based Kinesis Data Analytics application.","VpcConfigurations":"The array of descriptions of VPC configurations available to the application.","ZeppelinApplicationConfiguration":"The configuration parameters for a Kinesis Data Analytics Studio notebook."}},"AWS::KinesisAnalyticsV2::Application.ApplicationMaintenanceConfiguration":{"attributes":{},"description":"Specifies the maintence window parameters for a Kinesis Data Analytics application.","properties":{"ApplicationMaintenanceWindowStartTime":"Specifies the start time of the maintence window."}},"AWS::KinesisAnalyticsV2::Application.ApplicationRestoreConfiguration":{"attributes":{},"description":"Specifies the method and snapshot to use when restarting an application using previously saved application state.","properties":{"ApplicationRestoreType":"Specifies how the application should be restored.","SnapshotName":"The identifier of an existing snapshot of application state to use to restart an application. The application uses this value if `RESTORE_FROM_CUSTOM_SNAPSHOT` is specified for the `ApplicationRestoreType` ."}},"AWS::KinesisAnalyticsV2::Application.ApplicationSnapshotConfiguration":{"attributes":{},"description":"Describes whether snapshots are enabled for a Flink-based Kinesis Data Analytics application.","properties":{"SnapshotsEnabled":"Describes whether snapshots are enabled for a Flink-based Kinesis Data Analytics application."}},"AWS::KinesisAnalyticsV2::Application.CSVMappingParameters":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, provides additional mapping information when the record format uses delimiters, such as CSV. For example, the following sample records use CSV format, where the records use the *\'\\\\n\'* as the row delimiter and a comma (\\",\\") as the column delimiter:\\n\\n`\\"name1\\", \\"address1\\"`\\n\\n`\\"name2\\", \\"address2\\"`","properties":{"RecordColumnDelimiter":"The column delimiter. For example, in a CSV format, a comma (\\",\\") is the typical column delimiter.","RecordRowDelimiter":"The row delimiter. For example, in a CSV format, *\'\\\\n\'* is the typical row delimiter."}},"AWS::KinesisAnalyticsV2::Application.CatalogConfiguration":{"attributes":{},"description":"The configuration parameters for the default Amazon Glue database. You use this database for SQL queries that you write in a Kinesis Data Analytics Studio notebook.","properties":{"GlueDataCatalogConfiguration":"The configuration parameters for the default Amazon Glue database. You use this database for Apache Flink SQL queries and table API transforms that you write in a Kinesis Data Analytics Studio notebook."}},"AWS::KinesisAnalyticsV2::Application.CheckpointConfiguration":{"attributes":{},"description":"Describes an application\'s checkpointing configuration. Checkpointing is the process of persisting application state for fault tolerance. For more information, see [Checkpoints for Fault Tolerance](https://docs.aws.amazon.com/https://ci.apache.org/projects/flink/flink-docs-release-1.8/concepts/programming-model.html#checkpoints-for-fault-tolerance) in the [Apache Flink Documentation](https://docs.aws.amazon.com/https://ci.apache.org/projects/flink/flink-docs-release-1.8/) .","properties":{"CheckpointInterval":"Describes the interval in milliseconds between checkpoint operations.\\n\\n> If `CheckpointConfiguration.ConfigurationType` is `DEFAULT` , the application will use a `CheckpointInterval` value of 60000, even if this value is set to another value using this API or in application code.","CheckpointingEnabled":"Describes whether checkpointing is enabled for a Flink-based Kinesis Data Analytics application.\\n\\n> If `CheckpointConfiguration.ConfigurationType` is `DEFAULT` , the application will use a `CheckpointingEnabled` value of `true` , even if this value is set to another value using this API or in application code.","ConfigurationType":"Describes whether the application uses Kinesis Data Analytics\' default checkpointing behavior. You must set this property to `CUSTOM` in order to set the `CheckpointingEnabled` , `CheckpointInterval` , or `MinPauseBetweenCheckpoints` parameters.\\n\\n> If this value is set to `DEFAULT` , the application will use the following values, even if they are set to other values using APIs or application code:\\n> \\n> - *CheckpointingEnabled:* true\\n> - *CheckpointInterval:* 60000\\n> - *MinPauseBetweenCheckpoints:* 5000","MinPauseBetweenCheckpoints":"Describes the minimum time in milliseconds after a checkpoint operation completes that a new checkpoint operation can start. If a checkpoint operation takes longer than the `CheckpointInterval` , the application otherwise performs continual checkpoint operations. For more information, see [Tuning Checkpointing](https://docs.aws.amazon.com/https://ci.apache.org/projects/flink/flink-docs-release-1.8/ops/state/large_state_tuning.html#tuning-checkpointing) in the [Apache Flink Documentation](https://docs.aws.amazon.com/https://ci.apache.org/projects/flink/flink-docs-release-1.8/) .\\n\\n> If `CheckpointConfiguration.ConfigurationType` is `DEFAULT` , the application will use a `MinPauseBetweenCheckpoints` value of 5000, even if this value is set using this API or in application code."}},"AWS::KinesisAnalyticsV2::Application.CodeContent":{"attributes":{},"description":"Specifies either the application code, or the location of the application code, for a Flink-based Kinesis Data Analytics application.","properties":{"S3ContentLocation":"Information about the Amazon S3 bucket that contains the application code.","TextContent":"The text-format code for a Flink-based Kinesis Data Analytics application.","ZipFileContent":"The zip-format code for a Flink-based Kinesis Data Analytics application."}},"AWS::KinesisAnalyticsV2::Application.CustomArtifactConfiguration":{"attributes":{},"description":"The configuration of connectors and user-defined functions.","properties":{"ArtifactType":"Set this to either `UDF` or `DEPENDENCY_JAR` . `UDF` stands for user-defined functions. This type of artifact must be in an S3 bucket. A `DEPENDENCY_JAR` can be in either Maven or an S3 bucket.","MavenReference":"The parameters required to fully specify a Maven reference.","S3ContentLocation":"The location of the custom artifacts."}},"AWS::KinesisAnalyticsV2::Application.DeployAsApplicationConfiguration":{"attributes":{},"description":"The information required to deploy a Kinesis Data Analytics Studio notebook as an application with durable state.","properties":{"S3ContentLocation":"The description of an Amazon S3 object that contains the Amazon Data Analytics application, including the Amazon Resource Name (ARN) of the S3 bucket, the name of the Amazon S3 object that contains the data, and the version number of the Amazon S3 object that contains the data."}},"AWS::KinesisAnalyticsV2::Application.EnvironmentProperties":{"attributes":{},"description":"Describes execution properties for a Flink-based Kinesis Data Analytics application.","properties":{"PropertyGroups":"Describes the execution property groups."}},"AWS::KinesisAnalyticsV2::Application.FlinkApplicationConfiguration":{"attributes":{},"description":"Describes configuration parameters for a Flink-based Kinesis Data Analytics application or a Studio notebook.","properties":{"CheckpointConfiguration":"Describes an application\'s checkpointing configuration. Checkpointing is the process of persisting application state for fault tolerance. For more information, see [Checkpoints for Fault Tolerance](https://docs.aws.amazon.com/https://ci.apache.org/projects/flink/flink-docs-release-1.8/concepts/programming-model.html#checkpoints-for-fault-tolerance) in the [Apache Flink Documentation](https://docs.aws.amazon.com/https://ci.apache.org/projects/flink/flink-docs-release-1.8/) .","MonitoringConfiguration":"Describes configuration parameters for Amazon CloudWatch logging for an application.","ParallelismConfiguration":"Describes parameters for how an application executes multiple tasks simultaneously."}},"AWS::KinesisAnalyticsV2::Application.FlinkRunConfiguration":{"attributes":{},"description":"Describes the starting parameters for a Flink-based Kinesis Data Analytics application.","properties":{"AllowNonRestoredState":"When restoring from a snapshot, specifies whether the runtime is allowed to skip a state that cannot be mapped to the new program. This will happen if the program is updated between snapshots to remove stateful parameters, and state data in the snapshot no longer corresponds to valid application data. For more information, see [Allowing Non-Restored State](https://docs.aws.amazon.com/https://ci.apache.org/projects/flink/flink-docs-release-1.8/ops/state/savepoints.html#allowing-non-restored-state) in the [Apache Flink documentation](https://docs.aws.amazon.com/https://ci.apache.org/projects/flink/flink-docs-release-1.8/) .\\n\\n> This value defaults to `false` . If you update your application without specifying this parameter, `AllowNonRestoredState` will be set to `false` , even if it was previously set to `true` ."}},"AWS::KinesisAnalyticsV2::Application.GlueDataCatalogConfiguration":{"attributes":{},"description":"The configuration of the Glue Data Catalog that you use for Apache Flink SQL queries and table API transforms that you write in an application.","properties":{"DatabaseARN":"The Amazon Resource Name (ARN) of the database."}},"AWS::KinesisAnalyticsV2::Application.Input":{"attributes":{},"description":"When you configure the application input for a SQL-based Kinesis Data Analytics application, you specify the streaming source, the in-application stream name that is created, and the mapping between the two.","properties":{"InputParallelism":"Describes the number of in-application streams to create.","InputProcessingConfiguration":"The [InputProcessingConfiguration](https://docs.aws.amazon.com/kinesisanalytics/latest/apiv2/API_InputProcessingConfiguration.html) for the input. An input processor transforms records as they are received from the stream, before the application\'s SQL code executes. Currently, the only input processing configuration available is [InputLambdaProcessor](https://docs.aws.amazon.com/kinesisanalytics/latest/apiv2/API_InputLambdaProcessor.html) .","InputSchema":"Describes the format of the data in the streaming source, and how each data element maps to corresponding columns in the in-application stream that is being created.\\n\\nAlso used to describe the format of the reference data source.","KinesisFirehoseInput":"If the streaming source is an Amazon Kinesis Data Firehose delivery stream, identifies the delivery stream\'s ARN.","KinesisStreamsInput":"If the streaming source is an Amazon Kinesis data stream, identifies the stream\'s Amazon Resource Name (ARN).","NamePrefix":"The name prefix to use when creating an in-application stream. Suppose that you specify a prefix \\" `MyInApplicationStream` .\\" Kinesis Data Analytics then creates one or more (as per the `InputParallelism` count you specified) in-application streams with the names \\" `MyInApplicationStream_001` ,\\" \\" `MyInApplicationStream_002` ,\\" and so on."}},"AWS::KinesisAnalyticsV2::Application.InputLambdaProcessor":{"attributes":{},"description":"An object that contains the Amazon Resource Name (ARN) of the Amazon Lambda function that is used to preprocess records in the stream in a SQL-based Kinesis Data Analytics application.","properties":{"ResourceARN":"The ARN of the Amazon Lambda function that operates on records in the stream.\\n\\n> To specify an earlier version of the Lambda function than the latest, include the Lambda function version in the Lambda function ARN. For more information about Lambda ARNs, see [Example ARNs: Amazon Lambda](https://docs.aws.amazon.com//general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-lambda)"}},"AWS::KinesisAnalyticsV2::Application.InputParallelism":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, describes the number of in-application streams to create for a given streaming source.","properties":{"Count":"The number of in-application streams to create."}},"AWS::KinesisAnalyticsV2::Application.InputProcessingConfiguration":{"attributes":{},"description":"For an SQL-based Amazon Kinesis Data Analytics application, describes a processor that is used to preprocess the records in the stream before being processed by your application code. Currently, the only input processor available is [Amazon Lambda](https://docs.aws.amazon.com/lambda/) .","properties":{"InputLambdaProcessor":"The [InputLambdaProcessor](https://docs.aws.amazon.com/kinesisanalytics/latest/apiv2/API_InputLambdaProcessor.html) that is used to preprocess the records in the stream before being processed by your application code."}},"AWS::KinesisAnalyticsV2::Application.InputSchema":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, describes the format of the data in the streaming source, and how each data element maps to corresponding columns created in the in-application stream.","properties":{"RecordColumns":"A list of `RecordColumn` objects.","RecordEncoding":"Specifies the encoding of the records in the streaming source. For example, UTF-8.","RecordFormat":"Specifies the format of the records on the streaming source."}},"AWS::KinesisAnalyticsV2::Application.JSONMappingParameters":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, provides additional mapping information when JSON is the record format on the streaming source.","properties":{"RecordRowPath":"The path to the top-level parent that contains the records."}},"AWS::KinesisAnalyticsV2::Application.KinesisFirehoseInput":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, identifies a Kinesis Data Firehose delivery stream as the streaming source. You provide the delivery stream\'s Amazon Resource Name (ARN).","properties":{"ResourceARN":"The Amazon Resource Name (ARN) of the delivery stream."}},"AWS::KinesisAnalyticsV2::Application.KinesisStreamsInput":{"attributes":{},"description":"Identifies a Kinesis data stream as the streaming source. You provide the stream\'s Amazon Resource Name (ARN).","properties":{"ResourceARN":"The ARN of the input Kinesis data stream to read."}},"AWS::KinesisAnalyticsV2::Application.MappingParameters":{"attributes":{},"description":"When you configure a SQL-based Kinesis Data Analytics application\'s input at the time of creating or updating an application, provides additional mapping information specific to the record format (such as JSON, CSV, or record fields delimited by some delimiter) on the streaming source.","properties":{"CSVMappingParameters":"Provides additional mapping information when the record format uses delimiters (for example, CSV).","JSONMappingParameters":"Provides additional mapping information when JSON is the record format on the streaming source."}},"AWS::KinesisAnalyticsV2::Application.MavenReference":{"attributes":{},"description":"The information required to specify a Maven reference. You can use Maven references to specify dependency JAR files.","properties":{"ArtifactId":"The artifact ID of the Maven reference.","GroupId":"The group ID of the Maven reference.","Version":"The version of the Maven reference."}},"AWS::KinesisAnalyticsV2::Application.MonitoringConfiguration":{"attributes":{},"description":"Describes configuration parameters for Amazon CloudWatch logging for a Java-based Kinesis Data Analytics application. For more information about CloudWatch logging, see [Monitoring](https://docs.aws.amazon.com/kinesisanalytics/latest/java/monitoring-overview) .","properties":{"ConfigurationType":"Describes whether to use the default CloudWatch logging configuration for an application. You must set this property to `CUSTOM` in order to set the `LogLevel` or `MetricsLevel` parameters.","LogLevel":"Describes the verbosity of the CloudWatch Logs for an application.","MetricsLevel":"Describes the granularity of the CloudWatch Logs for an application. The `Parallelism` level is not recommended for applications with a Parallelism over 64 due to excessive costs."}},"AWS::KinesisAnalyticsV2::Application.ParallelismConfiguration":{"attributes":{},"description":"Describes parameters for how a Flink-based Kinesis Data Analytics application executes multiple tasks simultaneously. For more information about parallelism, see [Parallel Execution](https://docs.aws.amazon.com/https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/parallel.html) in the [Apache Flink Documentation](https://docs.aws.amazon.com/https://ci.apache.org/projects/flink/flink-docs-release-1.8/) .","properties":{"AutoScalingEnabled":"Describes whether the Kinesis Data Analytics service can increase the parallelism of the application in response to increased throughput.","ConfigurationType":"Describes whether the application uses the default parallelism for the Kinesis Data Analytics service. You must set this property to `CUSTOM` in order to change your application\'s `AutoScalingEnabled` , `Parallelism` , or `ParallelismPerKPU` properties.","Parallelism":"Describes the initial number of parallel tasks that a Java-based Kinesis Data Analytics application can perform. The Kinesis Data Analytics service can increase this number automatically if [ParallelismConfiguration:AutoScalingEnabled](https://docs.aws.amazon.com/kinesisanalytics/latest/apiv2/API_ParallelismConfiguration.html#kinesisanalytics-Type-ParallelismConfiguration-AutoScalingEnabled.html) is set to `true` .","ParallelismPerKPU":"Describes the number of parallel tasks that a Java-based Kinesis Data Analytics application can perform per Kinesis Processing Unit (KPU) used by the application. For more information about KPUs, see [Amazon Kinesis Data Analytics Pricing](https://docs.aws.amazon.com/kinesis/data-analytics/pricing/) ."}},"AWS::KinesisAnalyticsV2::Application.PropertyGroup":{"attributes":{},"description":"Property key-value pairs passed into an application.","properties":{"PropertyGroupId":"Describes the key of an application execution property key-value pair.","PropertyMap":"Describes the value of an application execution property key-value pair."}},"AWS::KinesisAnalyticsV2::Application.RecordColumn":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, describes the mapping of each data element in the streaming source to the corresponding column in the in-application stream.\\n\\nAlso used to describe the format of the reference data source.","properties":{"Mapping":"A reference to the data element in the streaming input or the reference data source.","Name":"The name of the column that is created in the in-application input stream or reference table.","SqlType":"The type of column created in the in-application input stream or reference table."}},"AWS::KinesisAnalyticsV2::Application.RecordFormat":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, describes the record format and relevant mapping information that should be applied to schematize the records on the stream.","properties":{"MappingParameters":"When you configure application input at the time of creating or updating an application, provides additional mapping information specific to the record format (such as JSON, CSV, or record fields delimited by some delimiter) on the streaming source.","RecordFormatType":"The type of record format."}},"AWS::KinesisAnalyticsV2::Application.RunConfiguration":{"attributes":{},"description":"Describes the starting parameters for an Kinesis Data Analytics application.","properties":{"ApplicationRestoreConfiguration":"Describes the restore behavior of a restarting application.","FlinkRunConfiguration":"Describes the starting parameters for a Flink-based Kinesis Data Analytics application."}},"AWS::KinesisAnalyticsV2::Application.S3ContentBaseLocation":{"attributes":{},"description":"The base location of the Amazon Data Analytics application.","properties":{"BasePath":"The base path for the S3 bucket.","BucketARN":"The Amazon Resource Name (ARN) of the S3 bucket."}},"AWS::KinesisAnalyticsV2::Application.S3ContentLocation":{"attributes":{},"description":"The location of an application or a custom artifact.","properties":{"BucketARN":"The Amazon Resource Name (ARN) for the S3 bucket containing the application code.","FileKey":"The file key for the object containing the application code.","ObjectVersion":"The version of the object containing the application code."}},"AWS::KinesisAnalyticsV2::Application.SqlApplicationConfiguration":{"attributes":{},"description":"Describes the inputs, outputs, and reference data sources for a SQL-based Kinesis Data Analytics application.","properties":{"Inputs":"The array of [Input](https://docs.aws.amazon.com/kinesisanalytics/latest/apiv2/API_Input.html) objects describing the input streams used by the application."}},"AWS::KinesisAnalyticsV2::Application.VpcConfiguration":{"attributes":{},"description":"Describes the parameters of a VPC used by the application.","properties":{"SecurityGroupIds":"The array of [SecurityGroup](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SecurityGroup.html) IDs used by the VPC configuration.","SubnetIds":"The array of [Subnet](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Subnet.html) IDs used by the VPC configuration."}},"AWS::KinesisAnalyticsV2::Application.ZeppelinApplicationConfiguration":{"attributes":{},"description":"The configuration of a Kinesis Data Analytics Studio notebook.","properties":{"CatalogConfiguration":"The Amazon Glue Data Catalog that you use in queries in a Kinesis Data Analytics Studio notebook.","CustomArtifactsConfiguration":"A list of `CustomArtifactConfiguration` objects.","DeployAsApplicationConfiguration":"The information required to deploy a Kinesis Data Analytics Studio notebook as an application with durable state.","MonitoringConfiguration":"The monitoring configuration of a Kinesis Data Analytics Studio notebook."}},"AWS::KinesisAnalyticsV2::Application.ZeppelinMonitoringConfiguration":{"attributes":{},"description":"Describes configuration parameters for Amazon CloudWatch logging for a Kinesis Data Analytics Studio notebook. For more information about CloudWatch logging, see [Monitoring](https://docs.aws.amazon.com/kinesisanalytics/latest/java/monitoring-overview.html) .","properties":{"LogLevel":"The verbosity of the CloudWatch Logs for an application. You can set it to `INFO` , `WARN` , `ERROR` , or `DEBUG` ."}},"AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption":{"attributes":{},"description":"Adds an Amazon CloudWatch log stream to monitor application configuration errors.\\n\\n> Only one *ApplicationCloudWatchLoggingOption* resource can be attached per application.","properties":{"ApplicationName":"The name of the application.","CloudWatchLoggingOption":"Provides a description of Amazon CloudWatch logging options, including the log stream Amazon Resource Name (ARN)."}},"AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption.CloudWatchLoggingOption":{"attributes":{},"description":"Provides a description of Amazon CloudWatch logging options, including the log stream Amazon Resource Name (ARN).","properties":{"LogStreamARN":"The ARN of the CloudWatch log to receive application messages."}},"AWS::KinesisAnalyticsV2::ApplicationOutput":{"attributes":{},"description":"Adds an external destination to your SQL-based Amazon Kinesis Data Analytics application.\\n\\nIf you want Kinesis Data Analytics to deliver data from an in-application stream within your application to an external destination (such as an Kinesis data stream, a Kinesis Data Firehose delivery stream, or an Amazon Lambda function), you add the relevant configuration to your application using this operation. You can configure one or more outputs for your application. Each output configuration maps an in-application stream and an external destination.\\n\\nYou can use one of the output configurations to deliver data from your in-application error stream to an external destination so that you can analyze the errors.\\n\\nAny configuration update, including adding a streaming source using this operation, results in a new version of the application. You can use the [DescribeApplication](https://docs.aws.amazon.com/kinesisanalytics/latest/apiv2/API_DescribeApplication.html) operation to find the current application version.\\n\\n> Creation of multiple outputs should be sequential (use of DependsOn) to avoid a problem with a stale application version ( *ConcurrentModificationException* ).","properties":{"ApplicationName":"The name of the application.","Output":"Describes a SQL-based Kinesis Data Analytics application\'s output configuration, in which you identify an in-application stream and a destination where you want the in-application stream data to be written. The destination can be a Kinesis data stream or a Kinesis Data Firehose delivery stream."}},"AWS::KinesisAnalyticsV2::ApplicationOutput.DestinationSchema":{"attributes":{},"description":"Describes the data format when records are written to the destination in a SQL-based Kinesis Data Analytics application.","properties":{"RecordFormatType":"Specifies the format of the records on the output stream."}},"AWS::KinesisAnalyticsV2::ApplicationOutput.KinesisFirehoseOutput":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, when configuring application output, identifies a Kinesis Data Firehose delivery stream as the destination. You provide the stream Amazon Resource Name (ARN) of the delivery stream.","properties":{"ResourceARN":"The ARN of the destination delivery stream to write to."}},"AWS::KinesisAnalyticsV2::ApplicationOutput.KinesisStreamsOutput":{"attributes":{},"description":"When you configure a SQL-based Kinesis Data Analytics application\'s output, identifies a Kinesis data stream as the destination. You provide the stream Amazon Resource Name (ARN).","properties":{"ResourceARN":"The ARN of the destination Kinesis data stream to write to."}},"AWS::KinesisAnalyticsV2::ApplicationOutput.LambdaOutput":{"attributes":{},"description":"When you configure a SQL-based Kinesis Data Analytics application\'s output, identifies an Amazon Lambda function as the destination. You provide the function Amazon Resource Name (ARN) of the Lambda function.","properties":{"ResourceARN":"The Amazon Resource Name (ARN) of the destination Lambda function to write to.\\n\\n> To specify an earlier version of the Lambda function than the latest, include the Lambda function version in the Lambda function ARN. For more information about Lambda ARNs, see [Example ARNs: Amazon Lambda](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-lambda)"}},"AWS::KinesisAnalyticsV2::ApplicationOutput.Output":{"attributes":{},"description":"Describes a SQL-based Kinesis Data Analytics application\'s output configuration, in which you identify an in-application stream and a destination where you want the in-application stream data to be written. The destination can be a Kinesis data stream or a Kinesis Data Firehose delivery stream.","properties":{"DestinationSchema":"Describes the data format when records are written to the destination.","KinesisFirehoseOutput":"Identifies a Kinesis Data Firehose delivery stream as the destination.","KinesisStreamsOutput":"Identifies a Kinesis data stream as the destination.","LambdaOutput":"Identifies an Amazon Lambda function as the destination.","Name":"The name of the in-application stream."}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource":{"attributes":{},"description":"Adds a reference data source to an existing SQL-based Kinesis Data Analytics application.\\n\\nKinesis Data Analytics reads reference data (that is, an Amazon S3 object) and creates an in-application table within your application. In the request, you provide the source (S3 bucket name and object key name), name of the in-application table to create, and the necessary mapping information that describes how data in an Amazon S3 object maps to columns in the resulting in-application table.","properties":{"ApplicationName":"The name of the application.","ReferenceDataSource":"For a SQL-based Kinesis Data Analytics application, describes the reference data source by providing the source information (Amazon S3 bucket name and object key name), the resulting in-application table name that is created, and the necessary schema to map the data elements in the Amazon S3 object to the in-application table."}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.CSVMappingParameters":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, provides additional mapping information when the record format uses delimiters, such as CSV. For example, the following sample records use CSV format, where the records use the *\'\\\\n\'* as the row delimiter and a comma (\\",\\") as the column delimiter:\\n\\n`\\"name1\\", \\"address1\\"`\\n\\n`\\"name2\\", \\"address2\\"`","properties":{"RecordColumnDelimiter":"The column delimiter. For example, in a CSV format, a comma (\\",\\") is the typical column delimiter.","RecordRowDelimiter":"The row delimiter. For example, in a CSV format, *\'\\\\n\'* is the typical row delimiter."}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.JSONMappingParameters":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, provides additional mapping information when JSON is the record format on the streaming source.","properties":{"RecordRowPath":"The path to the top-level parent that contains the records."}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.MappingParameters":{"attributes":{},"description":"When you configure a SQL-based Kinesis Data Analytics application\'s input at the time of creating or updating an application, provides additional mapping information specific to the record format (such as JSON, CSV, or record fields delimited by some delimiter) on the streaming source.","properties":{"CSVMappingParameters":"Provides additional mapping information when the record format uses delimiters (for example, CSV).","JSONMappingParameters":"Provides additional mapping information when JSON is the record format on the streaming source."}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.RecordColumn":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, describes the mapping of each data element in the streaming source to the corresponding column in the in-application stream.\\n\\nAlso used to describe the format of the reference data source.","properties":{"Mapping":"A reference to the data element in the streaming input or the reference data source.","Name":"The name of the column that is created in the in-application input stream or reference table.","SqlType":"The type of column created in the in-application input stream or reference table."}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.RecordFormat":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, describes the record format and relevant mapping information that should be applied to schematize the records on the stream.","properties":{"MappingParameters":"When you configure application input at the time of creating or updating an application, provides additional mapping information specific to the record format (such as JSON, CSV, or record fields delimited by some delimiter) on the streaming source.","RecordFormatType":"The type of record format."}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.ReferenceDataSource":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, describes the reference data source by providing the source information (Amazon S3 bucket name and object key name), the resulting in-application table name that is created, and the necessary schema to map the data elements in the Amazon S3 object to the in-application table.","properties":{"ReferenceSchema":"Describes the format of the data in the streaming source, and how each data element maps to corresponding columns created in the in-application stream.","S3ReferenceDataSource":"Identifies the S3 bucket and object that contains the reference data. A Kinesis Data Analytics application loads reference data only once. If the data changes, you call the [UpdateApplication](https://docs.aws.amazon.com/kinesisanalytics/latest/apiv2/API_UpdateApplication.html) operation to trigger reloading of data into your application.","TableName":"The name of the in-application table to create."}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.ReferenceSchema":{"attributes":{},"description":"For a SQL-based Kinesis Data Analytics application, describes the format of the data in the streaming source, and how each data element maps to corresponding columns created in the in-application stream.","properties":{"RecordColumns":"A list of `RecordColumn` objects.","RecordEncoding":"Specifies the encoding of the records in the streaming source. For example, UTF-8.","RecordFormat":"Specifies the format of the records on the streaming source."}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.S3ReferenceDataSource":{"attributes":{},"description":"For an SQL-based Amazon Kinesis Data Analytics application, identifies the Amazon S3 bucket and object that contains the reference data.\\n\\nA Kinesis Data Analytics application loads reference data only once. If the data changes, you call the [UpdateApplication](https://docs.aws.amazon.com/kinesisanalytics/latest/apiv2/API_UpdateApplication.html) operation to trigger reloading of data into your application.","properties":{"BucketARN":"The Amazon Resource Name (ARN) of the S3 bucket.","FileKey":"The object key name containing the reference data."}},"AWS::KinesisFirehose::DeliveryStream":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the delivery stream, such as `arn:aws:firehose:us-east-2:123456789012:deliverystream/delivery-stream-name` .","Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, Ref returns the delivery stream name, such as `mystack-deliverystream-1ABCD2EF3GHIJ` .\\n\\nFor more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::KinesisFirehose::DeliveryStream` resource specifies an Amazon Kinesis Data Firehose (Kinesis Data Firehose) delivery stream that delivers real-time streaming data to an Amazon Simple Storage Service (Amazon S3), Amazon Redshift, or Amazon Elasticsearch Service (Amazon ES) destination. For more information, see [Creating an Amazon Kinesis Data Firehose Delivery Stream](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html) in the *Amazon Kinesis Data Firehose Developer Guide* .","properties":{"AmazonOpenSearchServerlessDestinationConfiguration":"","AmazonopensearchserviceDestinationConfiguration":"The destination in Amazon OpenSearch Service. You can specify only one destination.","DeliveryStreamEncryptionConfigurationInput":"Specifies the type and Amazon Resource Name (ARN) of the CMK to use for Server-Side Encryption (SSE).","DeliveryStreamName":"The name of the delivery stream.","DeliveryStreamType":"The delivery stream type. This can be one of the following values:\\n\\n- `DirectPut` : Provider applications access the delivery stream directly.\\n- `KinesisStreamAsSource` : The delivery stream uses a Kinesis data stream as a source.","ElasticsearchDestinationConfiguration":"An Amazon ES destination for the delivery stream.\\n\\nConditional. You must specify only one destination configuration.\\n\\nIf you change the delivery stream destination from an Amazon ES destination to an Amazon S3 or Amazon Redshift destination, update requires [some interruptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-some-interrupt) .","ExtendedS3DestinationConfiguration":"An Amazon S3 destination for the delivery stream.\\n\\nConditional. You must specify only one destination configuration.\\n\\nIf you change the delivery stream destination from an Amazon Extended S3 destination to an Amazon ES destination, update requires [some interruptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-some-interrupt) .","HttpEndpointDestinationConfiguration":"Enables configuring Kinesis Firehose to deliver data to any HTTP endpoint destination. You can specify only one destination.","KinesisStreamSourceConfiguration":"When a Kinesis stream is used as the source for the delivery stream, a [KinesisStreamSourceConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration.html) containing the Kinesis stream ARN and the role ARN for the source stream.","RedshiftDestinationConfiguration":"An Amazon Redshift destination for the delivery stream.\\n\\nConditional. You must specify only one destination configuration.\\n\\nIf you change the delivery stream destination from an Amazon Redshift destination to an Amazon ES destination, update requires [some interruptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-some-interrupt) .","S3DestinationConfiguration":"The `S3DestinationConfiguration` property type specifies an Amazon Simple Storage Service (Amazon S3) destination to which Amazon Kinesis Data Firehose (Kinesis Data Firehose) delivers data.\\n\\nConditional. You must specify only one destination configuration.\\n\\nIf you change the delivery stream destination from an Amazon S3 destination to an Amazon ES destination, update requires [some interruptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-some-interrupt) .","SplunkDestinationConfiguration":"The configuration of a destination in Splunk for the delivery stream.","Tags":"A set of tags to assign to the delivery stream. A tag is a key-value pair that you can define and assign to AWS resources. Tags are metadata. For example, you can add friendly names and descriptions or other types of information that can help you distinguish the delivery stream. For more information about tags, see [Using Cost Allocation Tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html) in the AWS Billing and Cost Management User Guide.\\n\\nYou can specify up to 50 tags when creating a delivery stream."}},"AWS::KinesisFirehose::DeliveryStream.AmazonOpenSearchServerlessBufferingHints":{"attributes":{},"description":"","properties":{"IntervalInSeconds":"","SizeInMBs":""}},"AWS::KinesisFirehose::DeliveryStream.AmazonOpenSearchServerlessDestinationConfiguration":{"attributes":{},"description":"","properties":{"BufferingHints":"","CloudWatchLoggingOptions":"","CollectionEndpoint":"","IndexName":"","ProcessingConfiguration":"","RetryOptions":"","RoleARN":"","S3BackupMode":"","S3Configuration":"","VpcConfiguration":""}},"AWS::KinesisFirehose::DeliveryStream.AmazonOpenSearchServerlessRetryOptions":{"attributes":{},"description":"","properties":{"DurationInSeconds":""}},"AWS::KinesisFirehose::DeliveryStream.AmazonopensearchserviceBufferingHints":{"attributes":{},"description":"Describes the buffering to perform before delivering data to the Amazon OpenSearch Service destination.","properties":{"IntervalInSeconds":"Buffer incoming data for the specified period of time, in seconds, before delivering it to the destination. The default value is 300 (5 minutes).","SizeInMBs":"Buffer incoming data to the specified size, in MBs, before delivering it to the destination. The default value is 5. We recommend setting this parameter to a value greater than the amount of data you typically ingest into the delivery stream in 10 seconds. For example, if you typically ingest data at 1 MB/sec, the value should be 10 MB or higher."}},"AWS::KinesisFirehose::DeliveryStream.AmazonopensearchserviceDestinationConfiguration":{"attributes":{},"description":"Describes the configuration of a destination in Amazon OpenSearch Service.","properties":{"BufferingHints":"The buffering options. If no value is specified, the default values for AmazonopensearchserviceBufferingHints are used.","CloudWatchLoggingOptions":"Describes the Amazon CloudWatch logging options for your delivery stream.","ClusterEndpoint":"The endpoint to use when communicating with the cluster. Specify either this ClusterEndpoint or the DomainARN field.","DocumentIdOptions":"","DomainARN":"The ARN of the Amazon OpenSearch Service domain.","IndexName":"The Amazon OpenSearch Service index name.","IndexRotationPeriod":"The Amazon OpenSearch Service index rotation period. Index rotation appends a timestamp to the IndexName to facilitate the expiration of old data.","ProcessingConfiguration":"Describes a data processing configuration.","RetryOptions":"The retry behavior in case Kinesis Data Firehose is unable to deliver documents to Amazon OpenSearch Service. The default value is 300 (5 minutes).","RoleARN":"The Amazon Resource Name (ARN) of the IAM role to be assumed by Kinesis Data Firehose for calling the Amazon OpenSearch Service Configuration API and for indexing documents.","S3BackupMode":"Defines how documents should be delivered to Amazon S3.","S3Configuration":"Describes the configuration of a destination in Amazon S3.","TypeName":"The Amazon OpenSearch Service type name.","VpcConfiguration":"The details of the VPC of the Amazon OpenSearch Service destination."}},"AWS::KinesisFirehose::DeliveryStream.AmazonopensearchserviceRetryOptions":{"attributes":{},"description":"Configures retry behavior in case Kinesis Data Firehose is unable to deliver documents to Amazon OpenSearch Service.","properties":{"DurationInSeconds":"After an initial failure to deliver to Amazon OpenSearch Service, the total amount of time during which Kinesis Data Firehose retries delivery (including the first attempt). After this time has elapsed, the failed documents are written to Amazon S3. Default value is 300 seconds (5 minutes). A value of 0 (zero) results in no retries."}},"AWS::KinesisFirehose::DeliveryStream.BufferingHints":{"attributes":{},"description":"The `BufferingHints` property type specifies how Amazon Kinesis Data Firehose (Kinesis Data Firehose) buffers incoming data before delivering it to the destination. The first buffer condition that is satisfied triggers Kinesis Data Firehose to deliver the data.","properties":{"IntervalInSeconds":"The length of time, in seconds, that Kinesis Data Firehose buffers incoming data before delivering it to the destination. For valid values, see the `IntervalInSeconds` content for the [BufferingHints](https://docs.aws.amazon.com/firehose/latest/APIReference/API_BufferingHints.html) data type in the *Amazon Kinesis Data Firehose API Reference* .","SizeInMBs":"The size of the buffer, in MBs, that Kinesis Data Firehose uses for incoming data before delivering it to the destination. For valid values, see the `SizeInMBs` content for the [BufferingHints](https://docs.aws.amazon.com/firehose/latest/APIReference/API_BufferingHints.html) data type in the *Amazon Kinesis Data Firehose API Reference* ."}},"AWS::KinesisFirehose::DeliveryStream.CloudWatchLoggingOptions":{"attributes":{},"description":"The `CloudWatchLoggingOptions` property type specifies Amazon CloudWatch Logs (CloudWatch Logs) logging options that Amazon Kinesis Data Firehose (Kinesis Data Firehose) uses for the delivery stream.","properties":{"Enabled":"Indicates whether CloudWatch Logs logging is enabled.","LogGroupName":"The name of the CloudWatch Logs log group that contains the log stream that Kinesis Data Firehose will use.\\n\\nConditional. If you enable logging, you must specify this property.","LogStreamName":"The name of the CloudWatch Logs log stream that Kinesis Data Firehose uses to send logs about data delivery.\\n\\nConditional. If you enable logging, you must specify this property."}},"AWS::KinesisFirehose::DeliveryStream.CopyCommand":{"attributes":{},"description":"The `CopyCommand` property type configures the Amazon Redshift `COPY` command that Amazon Kinesis Data Firehose (Kinesis Data Firehose) uses to load data into an Amazon Redshift cluster from an Amazon S3 bucket.","properties":{"CopyOptions":"Parameters to use with the Amazon Redshift `COPY` command. For examples, see the `CopyOptions` content for the [CopyCommand](https://docs.aws.amazon.com/firehose/latest/APIReference/API_CopyCommand.html) data type in the *Amazon Kinesis Data Firehose API Reference* .","DataTableColumns":"A comma-separated list of column names.","DataTableName":"The name of the target table. The table must already exist in the database."}},"AWS::KinesisFirehose::DeliveryStream.DataFormatConversionConfiguration":{"attributes":{},"description":"Specifies that you want Kinesis Data Firehose to convert data from the JSON format to the Parquet or ORC format before writing it to Amazon S3. Kinesis Data Firehose uses the serializer and deserializer that you specify, in addition to the column information from the AWS Glue table, to deserialize your input data from JSON and then serialize it to the Parquet or ORC format. For more information, see [Kinesis Data Firehose Record Format Conversion](https://docs.aws.amazon.com/firehose/latest/dev/record-format-conversion.html) .","properties":{"Enabled":"Defaults to `true` . Set it to `false` if you want to disable format conversion while preserving the configuration details.","InputFormatConfiguration":"Specifies the deserializer that you want Kinesis Data Firehose to use to convert the format of your data from JSON. This parameter is required if `Enabled` is set to true.","OutputFormatConfiguration":"Specifies the serializer that you want Kinesis Data Firehose to use to convert the format of your data to the Parquet or ORC format. This parameter is required if `Enabled` is set to true.","SchemaConfiguration":"Specifies the AWS Glue Data Catalog table that contains the column information. This parameter is required if `Enabled` is set to true."}},"AWS::KinesisFirehose::DeliveryStream.DeliveryStreamEncryptionConfigurationInput":{"attributes":{},"description":"Specifies the type and Amazon Resource Name (ARN) of the CMK to use for Server-Side Encryption (SSE).","properties":{"KeyARN":"If you set `KeyType` to `CUSTOMER_MANAGED_CMK` , you must specify the Amazon Resource Name (ARN) of the CMK. If you set `KeyType` to `AWS _OWNED_CMK` , Kinesis Data Firehose uses a service-account CMK.","KeyType":"Indicates the type of customer master key (CMK) to use for encryption. The default setting is `AWS_OWNED_CMK` . For more information about CMKs, see [Customer Master Keys (CMKs)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) .\\n\\nYou can use a CMK of type CUSTOMER_MANAGED_CMK to encrypt up to 500 delivery streams.\\n\\n> To encrypt your delivery stream, use symmetric CMKs. Kinesis Data Firehose doesn\'t support asymmetric CMKs. For information about symmetric and asymmetric CMKs, see [About Symmetric and Asymmetric CMKs](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-concepts.html) in the AWS Key Management Service developer guide."}},"AWS::KinesisFirehose::DeliveryStream.Deserializer":{"attributes":{},"description":"The deserializer you want Kinesis Data Firehose to use for converting the input data from JSON. Kinesis Data Firehose then serializes the data to its final format using the `Serializer` . Kinesis Data Firehose supports two types of deserializers: the [Apache Hive JSON SerDe](https://docs.aws.amazon.com/https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-JSON) and the [OpenX JSON SerDe](https://docs.aws.amazon.com/https://github.com/rcongiu/Hive-JSON-Serde) .","properties":{"HiveJsonSerDe":"The native Hive / HCatalog JsonSerDe. Used by Kinesis Data Firehose for deserializing data, which means converting it from the JSON format in preparation for serializing it to the Parquet or ORC format. This is one of two deserializers you can choose, depending on which one offers the functionality you need. The other option is the OpenX SerDe.","OpenXJsonSerDe":"The OpenX SerDe. Used by Kinesis Data Firehose for deserializing data, which means converting it from the JSON format in preparation for serializing it to the Parquet or ORC format. This is one of two deserializers you can choose, depending on which one offers the functionality you need. The other option is the native Hive / HCatalog JsonSerDe."}},"AWS::KinesisFirehose::DeliveryStream.DocumentIdOptions":{"attributes":{},"description":"","properties":{"DefaultDocumentIdFormat":""}},"AWS::KinesisFirehose::DeliveryStream.DynamicPartitioningConfiguration":{"attributes":{},"description":"The `DynamicPartitioningConfiguration` property type specifies the configuration of the dynamic partitioning mechanism that creates targeted data sets from the streaming data by partitioning it based on partition keys.","properties":{"Enabled":"Specifies whether dynamic partitioning is enabled for this Kinesis Data Firehose delivery stream.","RetryOptions":"Specifies the retry behavior in case Kinesis Data Firehose is unable to deliver data to an Amazon S3 prefix."}},"AWS::KinesisFirehose::DeliveryStream.ElasticsearchBufferingHints":{"attributes":{},"description":"The `ElasticsearchBufferingHints` property type specifies how Amazon Kinesis Data Firehose (Kinesis Data Firehose) buffers incoming data while delivering it to the destination. The first buffer condition that is satisfied triggers Kinesis Data Firehose to deliver the data.\\n\\nElasticsearchBufferingHints is the property type for the `BufferingHints` property of the [Amazon Kinesis Data Firehose DeliveryStream ElasticsearchDestinationConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html) property type.","properties":{"IntervalInSeconds":"The length of time, in seconds, that Kinesis Data Firehose buffers incoming data before delivering it to the destination. For valid values, see the `IntervalInSeconds` content for the [BufferingHints](https://docs.aws.amazon.com/firehose/latest/APIReference/API_BufferingHints.html) data type in the *Amazon Kinesis Data Firehose API Reference* .","SizeInMBs":"The size of the buffer, in MBs, that Kinesis Data Firehose uses for incoming data before delivering it to the destination. For valid values, see the `SizeInMBs` content for the [BufferingHints](https://docs.aws.amazon.com/firehose/latest/APIReference/API_BufferingHints.html) data type in the *Amazon Kinesis Data Firehose API Reference* ."}},"AWS::KinesisFirehose::DeliveryStream.ElasticsearchDestinationConfiguration":{"attributes":{},"description":"The `ElasticsearchDestinationConfiguration` property type specifies an Amazon Elasticsearch Service (Amazon ES) domain that Amazon Kinesis Data Firehose (Kinesis Data Firehose) delivers data to.","properties":{"BufferingHints":"Configures how Kinesis Data Firehose buffers incoming data while delivering it to the Amazon ES domain.","CloudWatchLoggingOptions":"The Amazon CloudWatch Logs logging options for the delivery stream.","ClusterEndpoint":"The endpoint to use when communicating with the cluster. Specify either this `ClusterEndpoint` or the `DomainARN` field.","DocumentIdOptions":"","DomainARN":"The ARN of the Amazon ES domain. The IAM role must have permissions for `DescribeElasticsearchDomain` , `DescribeElasticsearchDomains` , and `DescribeElasticsearchDomainConfig` after assuming the role specified in *RoleARN* .\\n\\nSpecify either `ClusterEndpoint` or `DomainARN` .","IndexName":"The name of the Elasticsearch index to which Kinesis Data Firehose adds data for indexing.","IndexRotationPeriod":"The frequency of Elasticsearch index rotation. If you enable index rotation, Kinesis Data Firehose appends a portion of the UTC arrival timestamp to the specified index name, and rotates the appended timestamp accordingly. For more information, see [Index Rotation for the Amazon ES Destination](https://docs.aws.amazon.com/firehose/latest/dev/basic-deliver.html#es-index-rotation) in the *Amazon Kinesis Data Firehose Developer Guide* .","ProcessingConfiguration":"The data processing configuration for the Kinesis Data Firehose delivery stream.","RetryOptions":"The retry behavior when Kinesis Data Firehose is unable to deliver data to Amazon ES.","RoleARN":"The Amazon Resource Name (ARN) of the IAM role to be assumed by Kinesis Data Firehose for calling the Amazon ES Configuration API and for indexing documents. For more information, see [Controlling Access with Amazon Kinesis Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html) .","S3BackupMode":"The condition under which Kinesis Data Firehose delivers data to Amazon Simple Storage Service (Amazon S3). You can send Amazon S3 all documents (all data) or only the documents that Kinesis Data Firehose could not deliver to the Amazon ES destination. For more information and valid values, see the `S3BackupMode` content for the [ElasticsearchDestinationConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_ElasticsearchDestinationConfiguration.html) data type in the *Amazon Kinesis Data Firehose API Reference* .","S3Configuration":"The S3 bucket where Kinesis Data Firehose backs up incoming data.","TypeName":"The Elasticsearch type name that Amazon ES adds to documents when indexing data.","VpcConfiguration":"The details of the VPC of the Amazon ES destination."}},"AWS::KinesisFirehose::DeliveryStream.ElasticsearchRetryOptions":{"attributes":{},"description":"The `ElasticsearchRetryOptions` property type configures the retry behavior for when Amazon Kinesis Data Firehose (Kinesis Data Firehose) can\'t deliver data to Amazon Elasticsearch Service (Amazon ES).","properties":{"DurationInSeconds":"After an initial failure to deliver to Amazon ES, the total amount of time during which Kinesis Data Firehose re-attempts delivery (including the first attempt). If Kinesis Data Firehose can\'t deliver the data within the specified time, it writes the data to the backup S3 bucket. For valid values, see the `DurationInSeconds` content for the [ElasticsearchRetryOptions](https://docs.aws.amazon.com/firehose/latest/APIReference/API_ElasticsearchRetryOptions.html) data type in the *Amazon Kinesis Data Firehose API Reference* ."}},"AWS::KinesisFirehose::DeliveryStream.EncryptionConfiguration":{"attributes":{},"description":"The `EncryptionConfiguration` property type specifies the encryption settings that Amazon Kinesis Data Firehose (Kinesis Data Firehose) uses when delivering data to Amazon Simple Storage Service (Amazon S3).","properties":{"KMSEncryptionConfig":"The AWS Key Management Service ( AWS KMS) encryption key that Amazon S3 uses to encrypt your data.","NoEncryptionConfig":"Disables encryption. For valid values, see the `NoEncryptionConfig` content for the [EncryptionConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_EncryptionConfiguration.html) data type in the *Amazon Kinesis Data Firehose API Reference* ."}},"AWS::KinesisFirehose::DeliveryStream.ExtendedS3DestinationConfiguration":{"attributes":{},"description":"The `ExtendedS3DestinationConfiguration` property type configures an Amazon S3 destination for an Amazon Kinesis Data Firehose delivery stream.","properties":{"BucketARN":"The Amazon Resource Name (ARN) of the Amazon S3 bucket. For constraints, see [ExtendedS3DestinationConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_ExtendedS3DestinationConfiguration.html) in the *Amazon Kinesis Data Firehose API Reference* .","BufferingHints":"The buffering option.","CloudWatchLoggingOptions":"The Amazon CloudWatch logging options for your delivery stream.","CompressionFormat":"The compression format. If no value is specified, the default is `UNCOMPRESSED` .","DataFormatConversionConfiguration":"The serializer, deserializer, and schema for converting data from the JSON format to the Parquet or ORC format before writing it to Amazon S3.","DynamicPartitioningConfiguration":"The configuration of the dynamic partitioning mechanism that creates targeted data sets from the streaming data by partitioning it based on partition keys.","EncryptionConfiguration":"The encryption configuration for the Kinesis Data Firehose delivery stream. The default value is `NoEncryption` .","ErrorOutputPrefix":"A prefix that Kinesis Data Firehose evaluates and adds to failed records before writing them to S3. This prefix appears immediately following the bucket name. For information about how to specify this prefix, see [Custom Prefixes for Amazon S3 Objects](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html) .","Prefix":"The `YYYY/MM/DD/HH` time format prefix is automatically used for delivered Amazon S3 files. For more information, see [ExtendedS3DestinationConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_ExtendedS3DestinationConfiguration.html) in the *Amazon Kinesis Data Firehose API Reference* .","ProcessingConfiguration":"The data processing configuration for the Kinesis Data Firehose delivery stream.","RoleARN":"The Amazon Resource Name (ARN) of the AWS credentials. For constraints, see [ExtendedS3DestinationConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_ExtendedS3DestinationConfiguration.html) in the *Amazon Kinesis Data Firehose API Reference* .","S3BackupConfiguration":"The configuration for backup in Amazon S3.","S3BackupMode":"The Amazon S3 backup mode. After you create a delivery stream, you can update it to enable Amazon S3 backup if it is disabled. If backup is enabled, you can\'t update the delivery stream to disable it."}},"AWS::KinesisFirehose::DeliveryStream.HiveJsonSerDe":{"attributes":{},"description":"The native Hive / HCatalog JsonSerDe. Used by Kinesis Data Firehose for deserializing data, which means converting it from the JSON format in preparation for serializing it to the Parquet or ORC format. This is one of two deserializers you can choose, depending on which one offers the functionality you need. The other option is the OpenX SerDe.","properties":{"TimestampFormats":"Indicates how you want Kinesis Data Firehose to parse the date and timestamps that may be present in your input data JSON. To specify these format strings, follow the pattern syntax of JodaTime\'s DateTimeFormat format strings. For more information, see [Class DateTimeFormat](https://docs.aws.amazon.com/https://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html) . You can also use the special value `millis` to parse timestamps in epoch milliseconds. If you don\'t specify a format, Kinesis Data Firehose uses `java.sql.Timestamp::valueOf` by default."}},"AWS::KinesisFirehose::DeliveryStream.HttpEndpointCommonAttribute":{"attributes":{},"description":"Describes the metadata that\'s delivered to the specified HTTP endpoint destination. Kinesis Firehose supports any custom HTTP endpoint or HTTP endpoints owned by supported third-party service providers, including Datadog, MongoDB, and New Relic.","properties":{"AttributeName":"The name of the HTTP endpoint common attribute.","AttributeValue":"The value of the HTTP endpoint common attribute."}},"AWS::KinesisFirehose::DeliveryStream.HttpEndpointConfiguration":{"attributes":{},"description":"Describes the configuration of the HTTP endpoint to which Kinesis Firehose delivers data. Kinesis Firehose supports any custom HTTP endpoint or HTTP endpoints owned by supported third-party service providers, including Datadog, MongoDB, and New Relic.","properties":{"AccessKey":"The access key required for Kinesis Firehose to authenticate with the HTTP endpoint selected as the destination.","Name":"The name of the HTTP endpoint selected as the destination.","Url":"The URL of the HTTP endpoint selected as the destination."}},"AWS::KinesisFirehose::DeliveryStream.HttpEndpointDestinationConfiguration":{"attributes":{},"description":"Describes the configuration of the HTTP endpoint destination. Kinesis Firehose supports any custom HTTP endpoint or HTTP endpoints owned by supported third-party service providers, including Datadog, MongoDB, and New Relic.","properties":{"BufferingHints":"The buffering options that can be used before data is delivered to the specified destination. Kinesis Data Firehose treats these options as hints, and it might choose to use more optimal values. The SizeInMBs and IntervalInSeconds parameters are optional. However, if you specify a value for one of them, you must also provide a value for the other.","CloudWatchLoggingOptions":"Describes the Amazon CloudWatch logging options for your delivery stream.","EndpointConfiguration":"The configuration of the HTTP endpoint selected as the destination.","ProcessingConfiguration":"Describes the data processing configuration.","RequestConfiguration":"The configuration of the request sent to the HTTP endpoint specified as the destination.","RetryOptions":"Describes the retry behavior in case Kinesis Data Firehose is unable to deliver data to the specified HTTP endpoint destination, or if it doesn\'t receive a valid acknowledgment of receipt from the specified HTTP endpoint destination.","RoleARN":"Kinesis Data Firehose uses this IAM role for all the permissions that the delivery stream needs.","S3BackupMode":"Describes the S3 bucket backup options for the data that Kinesis Data Firehose delivers to the HTTP endpoint destination. You can back up all documents (AllData) or only the documents that Kinesis Data Firehose could not deliver to the specified HTTP endpoint destination (FailedDataOnly).","S3Configuration":"Describes the configuration of a destination in Amazon S3."}},"AWS::KinesisFirehose::DeliveryStream.HttpEndpointRequestConfiguration":{"attributes":{},"description":"The configuration of the HTTP endpoint request. Kinesis Firehose supports any custom HTTP endpoint or HTTP endpoints owned by supported third-party service providers, including Datadog, MongoDB, and New Relic.","properties":{"CommonAttributes":"Describes the metadata sent to the HTTP endpoint destination.","ContentEncoding":"Kinesis Data Firehose uses the content encoding to compress the body of a request before sending the request to the destination. For more information, see Content-Encoding in MDN Web Docs, the official Mozilla documentation."}},"AWS::KinesisFirehose::DeliveryStream.InputFormatConfiguration":{"attributes":{},"description":"Specifies the deserializer you want to use to convert the format of the input data. This parameter is required if `Enabled` is set to true.","properties":{"Deserializer":"Specifies which deserializer to use. You can choose either the Apache Hive JSON SerDe or the OpenX JSON SerDe. If both are non-null, the server rejects the request."}},"AWS::KinesisFirehose::DeliveryStream.KMSEncryptionConfig":{"attributes":{},"description":"The `KMSEncryptionConfig` property type specifies the AWS Key Management Service ( AWS KMS) encryption key that Amazon Simple Storage Service (Amazon S3) uses to encrypt data delivered by the Amazon Kinesis Data Firehose (Kinesis Data Firehose) stream.","properties":{"AWSKMSKeyARN":"The Amazon Resource Name (ARN) of the AWS KMS encryption key that Amazon S3 uses to encrypt data delivered by the Kinesis Data Firehose stream. The key must belong to the same region as the destination S3 bucket."}},"AWS::KinesisFirehose::DeliveryStream.KinesisStreamSourceConfiguration":{"attributes":{},"description":"The `KinesisStreamSourceConfiguration` property type specifies the stream and role Amazon Resource Names (ARNs) for a Kinesis stream used as the source for a delivery stream.","properties":{"KinesisStreamARN":"The ARN of the source Kinesis data stream.","RoleARN":"The ARN of the role that provides access to the source Kinesis data stream."}},"AWS::KinesisFirehose::DeliveryStream.OpenXJsonSerDe":{"attributes":{},"description":"The OpenX SerDe. Used by Kinesis Data Firehose for deserializing data, which means converting it from the JSON format in preparation for serializing it to the Parquet or ORC format. This is one of two deserializers you can choose, depending on which one offers the functionality you need. The other option is the native Hive / HCatalog JsonSerDe.","properties":{"CaseInsensitive":"When set to `true` , which is the default, Kinesis Data Firehose converts JSON keys to lowercase before deserializing them.","ColumnToJsonKeyMappings":"Maps column names to JSON keys that aren\'t identical to the column names. This is useful when the JSON contains keys that are Hive keywords. For example, `timestamp` is a Hive keyword. If you have a JSON key named `timestamp` , set this parameter to `{\\"ts\\": \\"timestamp\\"}` to map this key to a column named `ts` .","ConvertDotsInJsonKeysToUnderscores":"When set to `true` , specifies that the names of the keys include dots and that you want Kinesis Data Firehose to replace them with underscores. This is useful because Apache Hive does not allow dots in column names. For example, if the JSON contains a key whose name is \\"a.b\\", you can define the column name to be \\"a_b\\" when using this option.\\n\\nThe default is `false` ."}},"AWS::KinesisFirehose::DeliveryStream.OrcSerDe":{"attributes":{},"description":"A serializer to use for converting data to the ORC format before storing it in Amazon S3. For more information, see [Apache ORC](https://docs.aws.amazon.com/https://orc.apache.org/docs/) .","properties":{"BlockSizeBytes":"The Hadoop Distributed File System (HDFS) block size. This is useful if you intend to copy the data from Amazon S3 to HDFS before querying. The default is 256 MiB and the minimum is 64 MiB. Kinesis Data Firehose uses this value for padding calculations.","BloomFilterColumns":"The column names for which you want Kinesis Data Firehose to create bloom filters. The default is `null` .","BloomFilterFalsePositiveProbability":"The Bloom filter false positive probability (FPP). The lower the FPP, the bigger the Bloom filter. The default value is 0.05, the minimum is 0, and the maximum is 1.","Compression":"The compression code to use over data blocks. The default is `SNAPPY` .","DictionaryKeyThreshold":"Represents the fraction of the total number of non-null rows. To turn off dictionary encoding, set this fraction to a number that is less than the number of distinct keys in a dictionary. To always use dictionary encoding, set this threshold to 1.","EnablePadding":"Set this to `true` to indicate that you want stripes to be padded to the HDFS block boundaries. This is useful if you intend to copy the data from Amazon S3 to HDFS before querying. The default is `false` .","FormatVersion":"The version of the file to write. The possible values are `V0_11` and `V0_12` . The default is `V0_12` .","PaddingTolerance":"A number between 0 and 1 that defines the tolerance for block padding as a decimal fraction of stripe size. The default value is 0.05, which means 5 percent of stripe size.\\n\\nFor the default values of 64 MiB ORC stripes and 256 MiB HDFS blocks, the default block padding tolerance of 5 percent reserves a maximum of 3.2 MiB for padding within the 256 MiB block. In such a case, if the available size within the block is more than 3.2 MiB, a new, smaller stripe is inserted to fit within that space. This ensures that no stripe crosses block boundaries and causes remote reads within a node-local task.\\n\\nKinesis Data Firehose ignores this parameter when `EnablePadding` is `false` .","RowIndexStride":"The number of rows between index entries. The default is 10,000 and the minimum is 1,000.","StripeSizeBytes":"The number of bytes in each stripe. The default is 64 MiB and the minimum is 8 MiB."}},"AWS::KinesisFirehose::DeliveryStream.OutputFormatConfiguration":{"attributes":{},"description":"Specifies the serializer that you want Kinesis Data Firehose to use to convert the format of your data before it writes it to Amazon S3. This parameter is required if `Enabled` is set to true.","properties":{"Serializer":"Specifies which serializer to use. You can choose either the ORC SerDe or the Parquet SerDe. If both are non-null, the server rejects the request."}},"AWS::KinesisFirehose::DeliveryStream.ParquetSerDe":{"attributes":{},"description":"A serializer to use for converting data to the Parquet format before storing it in Amazon S3. For more information, see [Apache Parquet](https://docs.aws.amazon.com/https://parquet.apache.org/documentation/latest/) .","properties":{"BlockSizeBytes":"The Hadoop Distributed File System (HDFS) block size. This is useful if you intend to copy the data from Amazon S3 to HDFS before querying. The default is 256 MiB and the minimum is 64 MiB. Kinesis Data Firehose uses this value for padding calculations.","Compression":"The compression code to use over data blocks. The possible values are `UNCOMPRESSED` , `SNAPPY` , and `GZIP` , with the default being `SNAPPY` . Use `SNAPPY` for higher decompression speed. Use `GZIP` if the compression ratio is more important than speed.","EnableDictionaryCompression":"Indicates whether to enable dictionary compression.","MaxPaddingBytes":"The maximum amount of padding to apply. This is useful if you intend to copy the data from Amazon S3 to HDFS before querying. The default is 0.","PageSizeBytes":"The Parquet page size. Column chunks are divided into pages. A page is conceptually an indivisible unit (in terms of compression and encoding). The minimum value is 64 KiB and the default is 1 MiB.","WriterVersion":"Indicates the version of row format to output. The possible values are `V1` and `V2` . The default is `V1` ."}},"AWS::KinesisFirehose::DeliveryStream.ProcessingConfiguration":{"attributes":{},"description":"The `ProcessingConfiguration` property configures data processing for an Amazon Kinesis Data Firehose delivery stream.","properties":{"Enabled":"Indicates whether data processing is enabled (true) or disabled (false).","Processors":"The data processors."}},"AWS::KinesisFirehose::DeliveryStream.Processor":{"attributes":{},"description":"The `Processor` property specifies a data processor for an Amazon Kinesis Data Firehose delivery stream.","properties":{"Parameters":"The processor parameters.","Type":"The type of processor. Valid values: `Lambda` ."}},"AWS::KinesisFirehose::DeliveryStream.ProcessorParameter":{"attributes":{},"description":"The `ProcessorParameter` property specifies a processor parameter in a data processor for an Amazon Kinesis Data Firehose delivery stream.","properties":{"ParameterName":"The name of the parameter. Currently the following default values are supported: 3 for `NumberOfRetries` and 60 for the `BufferIntervalInSeconds` . The `BufferSizeInMBs` ranges between 0.2 MB and up to 3MB. The default buffering hint is 1MB for all destinations, except Splunk. For Splunk, the default buffering hint is 256 KB.","ParameterValue":"The parameter value."}},"AWS::KinesisFirehose::DeliveryStream.RedshiftDestinationConfiguration":{"attributes":{},"description":"The `RedshiftDestinationConfiguration` property type specifies an Amazon Redshift cluster to which Amazon Kinesis Data Firehose (Kinesis Data Firehose) delivers data.","properties":{"CloudWatchLoggingOptions":"The CloudWatch logging options for your delivery stream.","ClusterJDBCURL":"The connection string that Kinesis Data Firehose uses to connect to the Amazon Redshift cluster.","CopyCommand":"Configures the Amazon Redshift `COPY` command that Kinesis Data Firehose uses to load data into the cluster from the Amazon S3 bucket.","Password":"The password for the Amazon Redshift user that you specified in the `Username` property.","ProcessingConfiguration":"The data processing configuration for the Kinesis Data Firehose delivery stream.","RetryOptions":"The retry behavior in case Kinesis Data Firehose is unable to deliver documents to Amazon Redshift. Default value is 3600 (60 minutes).","RoleARN":"The ARN of the AWS Identity and Access Management (IAM) role that grants Kinesis Data Firehose access to your Amazon S3 bucket and AWS KMS (if you enable data encryption). For more information, see [Grant Kinesis Data Firehose Access to an Amazon Redshift Destination](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#using-iam-rs) in the *Amazon Kinesis Data Firehose Developer Guide* .","S3BackupConfiguration":"The configuration for backup in Amazon S3.","S3BackupMode":"The Amazon S3 backup mode. After you create a delivery stream, you can update it to enable Amazon S3 backup if it is disabled. If backup is enabled, you can\'t update the delivery stream to disable it.","S3Configuration":"The S3 bucket where Kinesis Data Firehose first delivers data. After the data is in the bucket, Kinesis Data Firehose uses the `COPY` command to load the data into the Amazon Redshift cluster. For the Amazon S3 bucket\'s compression format, don\'t specify `SNAPPY` or `ZIP` because the Amazon Redshift `COPY` command doesn\'t support them.","Username":"The Amazon Redshift user that has permission to access the Amazon Redshift cluster. This user must have `INSERT` privileges for copying data from the Amazon S3 bucket to the cluster."}},"AWS::KinesisFirehose::DeliveryStream.RedshiftRetryOptions":{"attributes":{},"description":"Configures retry behavior in case Kinesis Data Firehose is unable to deliver documents to Amazon Redshift.","properties":{"DurationInSeconds":"The length of time during which Kinesis Data Firehose retries delivery after a failure, starting from the initial request and including the first attempt. The default value is 3600 seconds (60 minutes). Kinesis Data Firehose does not retry if the value of `DurationInSeconds` is 0 (zero) or if the first delivery attempt takes longer than the current value."}},"AWS::KinesisFirehose::DeliveryStream.RetryOptions":{"attributes":{},"description":"Describes the retry behavior in case Kinesis Data Firehose is unable to deliver data to the specified HTTP endpoint destination, or if it doesn\'t receive a valid acknowledgment of receipt from the specified HTTP endpoint destination. Kinesis Firehose supports any custom HTTP endpoint or HTTP endpoints owned by supported third-party service providers, including Datadog, MongoDB, and New Relic.","properties":{"DurationInSeconds":"The total amount of time that Kinesis Data Firehose spends on retries. This duration starts after the initial attempt to send data to the custom destination via HTTPS endpoint fails. It doesn\'t include the periods during which Kinesis Data Firehose waits for acknowledgment from the specified destination after each attempt."}},"AWS::KinesisFirehose::DeliveryStream.S3DestinationConfiguration":{"attributes":{},"description":"The `S3DestinationConfiguration` property type specifies an Amazon Simple Storage Service (Amazon S3) destination to which Amazon Kinesis Data Firehose (Kinesis Data Firehose) delivers data.","properties":{"BucketARN":"The Amazon Resource Name (ARN) of the Amazon S3 bucket to send data to.","BufferingHints":"Configures how Kinesis Data Firehose buffers incoming data while delivering it to the Amazon S3 bucket.","CloudWatchLoggingOptions":"The CloudWatch logging options for your delivery stream.","CompressionFormat":"The type of compression that Kinesis Data Firehose uses to compress the data that it delivers to the Amazon S3 bucket. For valid values, see the `CompressionFormat` content for the [S3DestinationConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_S3DestinationConfiguration.html) data type in the *Amazon Kinesis Data Firehose API Reference* .","EncryptionConfiguration":"Configures Amazon Simple Storage Service (Amazon S3) server-side encryption. Kinesis Data Firehose uses AWS Key Management Service ( AWS KMS) to encrypt the data that it delivers to your Amazon S3 bucket.","ErrorOutputPrefix":"A prefix that Kinesis Data Firehose evaluates and adds to failed records before writing them to S3. This prefix appears immediately following the bucket name. For information about how to specify this prefix, see [Custom Prefixes for Amazon S3 Objects](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html) .","Prefix":"A prefix that Kinesis Data Firehose adds to the files that it delivers to the Amazon S3 bucket. The prefix helps you identify the files that Kinesis Data Firehose delivered.","RoleARN":"The ARN of an AWS Identity and Access Management (IAM) role that grants Kinesis Data Firehose access to your Amazon S3 bucket and AWS KMS (if you enable data encryption). For more information, see [Grant Kinesis Data Firehose Access to an Amazon S3 Destination](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#using-iam-s3) in the *Amazon Kinesis Data Firehose Developer Guide* ."}},"AWS::KinesisFirehose::DeliveryStream.SchemaConfiguration":{"attributes":{},"description":"Specifies the schema to which you want Kinesis Data Firehose to configure your data before it writes it to Amazon S3. This parameter is required if `Enabled` is set to true.","properties":{"CatalogId":"The ID of the AWS Glue Data Catalog. If you don\'t supply this, the AWS account ID is used by default.","DatabaseName":"Specifies the name of the AWS Glue database that contains the schema for the output data.\\n\\n> If the `SchemaConfiguration` request parameter is used as part of invoking the `CreateDeliveryStream` API, then the `DatabaseName` property is required and its value must be specified.","Region":"If you don\'t specify an AWS Region, the default is the current Region.","RoleARN":"The role that Kinesis Data Firehose can use to access AWS Glue. This role must be in the same account you use for Kinesis Data Firehose. Cross-account roles aren\'t allowed.\\n\\n> If the `SchemaConfiguration` request parameter is used as part of invoking the `CreateDeliveryStream` API, then the `RoleARN` property is required and its value must be specified.","TableName":"Specifies the AWS Glue table that contains the column information that constitutes your data schema.\\n\\n> If the `SchemaConfiguration` request parameter is used as part of invoking the `CreateDeliveryStream` API, then the `TableName` property is required and its value must be specified.","VersionId":"Specifies the table version for the output data schema. If you don\'t specify this version ID, or if you set it to `LATEST` , Kinesis Data Firehose uses the most recent version. This means that any updates to the table are automatically picked up."}},"AWS::KinesisFirehose::DeliveryStream.Serializer":{"attributes":{},"description":"The serializer that you want Kinesis Data Firehose to use to convert data to the target format before writing it to Amazon S3. Kinesis Data Firehose supports two types of serializers: the [ORC SerDe](https://docs.aws.amazon.com/https://hive.apache.org/javadocs/r1.2.2/api/org/apache/hadoop/hive/ql/io/orc/OrcSerde.html) and the [Parquet SerDe](https://docs.aws.amazon.com/https://hive.apache.org/javadocs/r1.2.2/api/org/apache/hadoop/hive/ql/io/parquet/serde/ParquetHiveSerDe.html) .","properties":{"OrcSerDe":"A serializer to use for converting data to the ORC format before storing it in Amazon S3. For more information, see [Apache ORC](https://docs.aws.amazon.com/https://orc.apache.org/docs/) .","ParquetSerDe":"A serializer to use for converting data to the Parquet format before storing it in Amazon S3. For more information, see [Apache Parquet](https://docs.aws.amazon.com/https://parquet.apache.org/documentation/latest/) ."}},"AWS::KinesisFirehose::DeliveryStream.SplunkDestinationConfiguration":{"attributes":{},"description":"The `SplunkDestinationConfiguration` property type specifies the configuration of a destination in Splunk for a Kinesis Data Firehose delivery stream.","properties":{"CloudWatchLoggingOptions":"The Amazon CloudWatch logging options for your delivery stream.","HECAcknowledgmentTimeoutInSeconds":"The amount of time that Kinesis Data Firehose waits to receive an acknowledgment from Splunk after it sends it data. At the end of the timeout period, Kinesis Data Firehose either tries to send the data again or considers it an error, based on your retry settings.","HECEndpoint":"The HTTP Event Collector (HEC) endpoint to which Kinesis Data Firehose sends your data.","HECEndpointType":"This type can be either `Raw` or `Event` .","HECToken":"This is a GUID that you obtain from your Splunk cluster when you create a new HEC endpoint.","ProcessingConfiguration":"The data processing configuration.","RetryOptions":"The retry behavior in case Kinesis Data Firehose is unable to deliver data to Splunk, or if it doesn\'t receive an acknowledgment of receipt from Splunk.","S3BackupMode":"Defines how documents should be delivered to Amazon S3. When set to `FailedEventsOnly` , Kinesis Data Firehose writes any data that could not be indexed to the configured Amazon S3 destination. When set to `AllEvents` , Kinesis Data Firehose delivers all incoming records to Amazon S3, and also writes failed documents to Amazon S3. The default value is `FailedEventsOnly` .\\n\\nYou can update this backup mode from `FailedEventsOnly` to `AllEvents` . You can\'t update it from `AllEvents` to `FailedEventsOnly` .","S3Configuration":"The configuration for the backup Amazon S3 location."}},"AWS::KinesisFirehose::DeliveryStream.SplunkRetryOptions":{"attributes":{},"description":"The `SplunkRetryOptions` property type specifies retry behavior in case Kinesis Data Firehose is unable to deliver documents to Splunk or if it doesn\'t receive an acknowledgment from Splunk.","properties":{"DurationInSeconds":"The total amount of time that Kinesis Data Firehose spends on retries. This duration starts after the initial attempt to send data to Splunk fails. It doesn\'t include the periods during which Kinesis Data Firehose waits for acknowledgment from Splunk after each attempt."}},"AWS::KinesisFirehose::DeliveryStream.VpcConfiguration":{"attributes":{},"description":"The details of the VPC of the Amazon ES destination.","properties":{"RoleARN":"The ARN of the IAM role that you want the delivery stream to use to create endpoints in the destination VPC. You can use your existing Kinesis Data Firehose delivery role or you can specify a new role. In either case, make sure that the role trusts the Kinesis Data Firehose service principal and that it grants the following permissions:\\n\\n- `ec2:DescribeVpcs`\\n- `ec2:DescribeVpcAttribute`\\n- `ec2:DescribeSubnets`\\n- `ec2:DescribeSecurityGroups`\\n- `ec2:DescribeNetworkInterfaces`\\n- `ec2:CreateNetworkInterface`\\n- `ec2:CreateNetworkInterfacePermission`\\n- `ec2:DeleteNetworkInterface`\\n\\nIf you revoke these permissions after you create the delivery stream, Kinesis Data Firehose can\'t scale out by creating more ENIs when necessary. You might therefore see a degradation in performance.","SecurityGroupIds":"The IDs of the security groups that you want Kinesis Data Firehose to use when it creates ENIs in the VPC of the Amazon ES destination. You can use the same security group that the Amazon ES domain uses or different ones. If you specify different security groups here, ensure that they allow outbound HTTPS traffic to the Amazon ES domain\'s security group. Also ensure that the Amazon ES domain\'s security group allows HTTPS traffic from the security groups specified here. If you use the same security group for both your delivery stream and the Amazon ES domain, make sure the security group inbound rule allows HTTPS traffic.","SubnetIds":"The IDs of the subnets that Kinesis Data Firehose uses to create ENIs in the VPC of the Amazon ES destination. Make sure that the routing tables and inbound and outbound rules allow traffic to flow from the subnets whose IDs are specified here to the subnets that have the destination Amazon ES endpoints. Kinesis Data Firehose creates at least one ENI in each of the subnets that are specified here. Do not delete or modify these ENIs.\\n\\nThe number of ENIs that Kinesis Data Firehose creates in the subnets specified here scales up and down automatically based on throughput. To enable Kinesis Data Firehose to scale up the number of ENIs to match throughput, ensure that you have sufficient quota. To help you calculate the quota you need, assume that Kinesis Data Firehose can create up to three ENIs for this delivery stream for each of the subnets specified here."}},"AWS::KinesisVideo::SignalingChannel":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the signaling channel.","Ref":""},"description":"Specifies a signaling channel.\\n\\n`CreateSignalingChannel` is an asynchronous operation.","properties":{"MessageTtlSeconds":"The period of time a signaling channel retains undelivered messages before they are discarded.","Name":"A name for the signaling channel that you are creating. It must be unique for each AWS account and AWS Region .","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","Type":"A type of the signaling channel that you are creating. Currently, `SINGLE_MASTER` is the only supported channel type."}},"AWS::KinesisVideo::Stream":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the stream.","Ref":""},"description":"Specifies a new Kinesis video stream.\\n\\nWhen you create a new stream, Kinesis Video Streams assigns it a version number. When you change the stream\'s metadata, Kinesis Video Streams updates the version.\\n\\n`CreateStream` is an asynchronous operation.\\n\\nFor information about how the service works, see [How it Works](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/how-it-works.html) .\\n\\nYou must have permissions for the `KinesisVideo:CreateStream` action.","properties":{"DataRetentionInHours":"How long the stream retains data, in hours.","DeviceName":"The name of the device that is associated with the stream.","KmsKeyId":"The ID of the AWS Key Management Service ( AWS KMS ) key that Kinesis Video Streams uses to encrypt data on the stream.","MediaType":"The `MediaType` of the stream.","Name":"The name of the stream.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::LakeFormation::DataCellsFilter":{"attributes":{"Ref":"`Ref` returns the resource properties such as TableCatalogId, DatabaseName, TableName, and FilterName. For example: 123456789012|ExampleDbName|ExampleTableName|ExampleFilterName"},"description":"A structure that represents a data cell filter with column-level, row-level, and/or cell-level security. Data cell filters belong to a specific table in a Data Catalog . During a stack operation, AWS CloudFormation calls the AWS Lake Formation `CreateDataCellsFilter` API operation to create a `DataCellsFilter` resource, and calls the `DeleteDataCellsFilter` API operation to delete it.","properties":{"ColumnNames":"An array of UTF-8 strings. A list of column names.","ColumnWildcard":"A wildcard with exclusions. You must specify either a `ColumnNames` list or the `ColumnWildCard` .","DatabaseName":"UTF-8 string, not less than 1 or more than 255 bytes long, matching the [single-line string pattern](https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-aws-lake-formation-api-common.html) .\\n\\nA database in the Data Catalog .","Name":"UTF-8 string, not less than 1 or more than 255 bytes long, matching the [single-line string pattern](https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-aws-lake-formation-api-common.html) .\\n\\nThe name given by the user to the data filter cell.","RowFilter":"A PartiQL predicate.","TableCatalogId":"Catalog id string, not less than 1 or more than 255 bytes long, matching the [single-line string pattern](https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-aws-lake-formation-api-common.html) .\\n\\nThe ID of the catalog to which the table belongs.","TableName":"UTF-8 string, not less than 1 or more than 255 bytes long, matching the [single-line string pattern](https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-aws-lake-formation-api-common.html) .\\n\\nA table in the database."}},"AWS::LakeFormation::DataCellsFilter.ColumnWildcard":{"attributes":{},"description":"A wildcard object, consisting of an optional list of excluded column names or indexes.","properties":{"ExcludedColumnNames":"Excludes column names. Any column with this name will be excluded."}},"AWS::LakeFormation::DataCellsFilter.RowFilter":{"attributes":{},"description":"A PartiQL predicate.","properties":{"AllRowsWildcard":"A wildcard for all rows.","FilterExpression":"A filter expression."}},"AWS::LakeFormation::DataLakeSettings":{"attributes":{},"description":"The `AWS::LakeFormation::DataLakeSettings` resource is an AWS Lake Formation resource type that manages the data lake settings for your account.","properties":{"Admins":"A list of AWS Lake Formation principals.","AllowExternalDataFiltering":"Whether to allow Amazon EMR clusters or other third-party query engines to access data managed by Lake Formation .\\n\\nIf set to true, you allow Amazon EMR clusters or other third-party engines to access data in Amazon S3 locations that are registered with Lake Formation .\\n\\nIf false or null, no third-party query engines will be able to access data in Amazon S3 locations that are registered with Lake Formation.\\n\\nFor more information, see [External data filtering setting](https://docs.aws.amazon.com/lake-formation/latest/dg/initial-LF-setup.html#external-data-filter) .","AuthorizedSessionTagValueList":"Lake Formation relies on a privileged process secured by Amazon EMR or the third party integrator to tag the user\'s role while assuming it. Lake Formation will publish the acceptable key-value pair, for example key = \\"LakeFormationTrustedCaller\\" and value = \\"TRUE\\" and the third party integrator must properly tag the temporary security credentials that will be used to call Lake Formation \'s administrative API operations.","CreateDatabaseDefaultPermissions":"Specifies whether access control on a newly created database is managed by Lake Formation permissions or exclusively by IAM permissions.\\n\\nA null value indicates that the access is controlled by Lake Formation permissions. `ALL` permissions assigned to `IAM_ALLOWED_PRINCIPALS` group indicates that the user\'s IAM permissions determine the access to the database. This is referred to as the setting \\"Use only IAM access control,\\" and is to support backward compatibility with the AWS Glue permission model implemented by IAM permissions.\\n\\nThe only permitted values are an empty array or an array that contains a single JSON object that grants `ALL` to `IAM_ALLOWED_PRINCIPALS` .\\n\\nFor more information, see [Changing the default security settings for your data lake](https://docs.aws.amazon.com/lake-formation/latest/dg/change-settings.html) .","CreateTableDefaultPermissions":"Specifies whether access control on a newly created table is managed by Lake Formation permissions or exclusively by IAM permissions.\\n\\nA null value indicates that the access is controlled by Lake Formation permissions. `ALL` permissions assigned to `IAM_ALLOWED_PRINCIPALS` group indicate that the user\'s IAM permissions determine the access to the table. This is referred to as the setting \\"Use only IAM access control,\\" and is to support the backward compatibility with the AWS Glue permission model implemented by IAM permissions.\\n\\nThe only permitted values are an empty array or an array that contains a single JSON object that grants `ALL` permissions to `IAM_ALLOWED_PRINCIPALS` .\\n\\nFor more information, see [Changing the default security settings for your data lake](https://docs.aws.amazon.com/lake-formation/latest/dg/change-settings.html) .","ExternalDataFilteringAllowList":"A list of the account IDs of AWS accounts with Amazon EMR clusters or third-party engines that are allwed to perform data filtering.","Parameters":"A key-value map that provides an additional configuration on your data lake. `CrossAccountVersion` is the key you can configure in the `Parameters` field. Accepted values for the `CrossAccountVersion` key are 1, 2, and 3.","TrustedResourceOwners":"An array of UTF-8 strings.\\n\\nA list of the resource-owning account IDs that the caller\'s account can use to share their user access details (user ARNs). The user ARNs can be logged in the resource owner\'s CloudTrail log. You may want to specify this property when you are in a high-trust boundary, such as the same team or company."}},"AWS::LakeFormation::DataLakeSettings.Admins":{"attributes":{},"description":"A list of AWS Lake Formation principals.","properties":{}},"AWS::LakeFormation::DataLakeSettings.CreateDatabaseDefaultPermissions":{"attributes":{},"description":"Specifies whether access control on a newly created database is managed by Lake Formation permissions or exclusively by IAM permissions.\\n\\nA null value indicates that the access is controlled by Lake Formation permissions. A value that assigns `ALL` to `IAM_ALLOWED_PRINCIPALS` indicates access control by IAM permissions. This is referred to as the setting \\"Use only IAM access control,\\" and is for backward compatibility with the AWS Glue permission model implemented by IAM permissions.\\n\\nThe only permitted values are an empty array or an array that contains a single JSON object that grants `ALL` to `IAM_ALLOWED_PRINCIPALS` .\\n\\nFor more information, see [Changing the default security settings for your data lake](https://docs.aws.amazon.com/lake-formation/latest/dg/change-settings.html) .","properties":{}},"AWS::LakeFormation::DataLakeSettings.CreateTableDefaultPermissions":{"attributes":{},"description":"Specifies whether access control on a newly created table is managed by Lake Formation permissions or exclusively by IAM permissions.\\n\\nA null value indicates that the access is controlled by Lake Formation permissions. A value that assigns `ALL` to `IAM_ALLOWED_PRINCIPALS` indicates access control by IAM permissions. This is referred to as the setting \\"Use only IAM access control,\\" and is for backward compatibility with the AWS Glue permission model implemented by IAM permissions.\\n\\nThe only permitted values are an empty array or an array that contains a single JSON object that grants `ALL` to `IAM_ALLOWED_PRINCIPALS` .\\n\\nFor more information, see [Changing the Default Security Settings for Your Data Lake](https://docs.aws.amazon.com/lake-formation/latest/dg/change-settings.html) .","properties":{}},"AWS::LakeFormation::DataLakeSettings.DataLakePrincipal":{"attributes":{},"description":"The Lake Formation principal.","properties":{"DataLakePrincipalIdentifier":"An identifier for the Lake Formation principal."}},"AWS::LakeFormation::DataLakeSettings.ExternalDataFilteringAllowList":{"attributes":{},"description":"A list of the account IDs of AWS accounts with Amazon EMR clusters that are allowed to perform data filtering.","properties":{}},"AWS::LakeFormation::DataLakeSettings.PrincipalPermissions":{"attributes":{},"description":"Permissions granted to a principal.","properties":{"Permissions":"The permissions that are granted to the principal.","Principal":"The principal who is granted permissions."}},"AWS::LakeFormation::Permissions":{"attributes":{},"description":"The `AWS::LakeFormation::Permissions` resource represents the permissions that a principal has on an AWS Glue Data Catalog resource (such as AWS Glue database or AWS Glue tables). When you upload a permissions stack, the permissions are granted to the principal and when you remove the stack, the permissions are revoked from the principal. If you remove a stack, and the principal does not have the permissions referenced in the stack then AWS Lake Formation will throw an error because you can’t call revoke on non-existing permissions. To successfully remove the stack, you’ll need to regrant those permissions and then remove the stack.\\n\\n> New versions of AWS Lake Formation permission resources are now available. For more information, see: [AWS:LakeFormation::PrincipalPermissions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-principalpermissions.html)","properties":{"DataLakePrincipal":"The AWS Lake Formation principal.","Permissions":"The permissions granted or revoked.","PermissionsWithGrantOption":"Indicates the ability to grant permissions (as a subset of permissions granted).","Resource":"A structure for the resource."}},"AWS::LakeFormation::Permissions.ColumnWildcard":{"attributes":{},"description":"A wildcard object, consisting of an optional list of excluded column names or indexes.","properties":{"ExcludedColumnNames":"Excludes column names. Any column with this name will be excluded."}},"AWS::LakeFormation::Permissions.DataLakePrincipal":{"attributes":{},"description":"The Lake Formation principal.","properties":{"DataLakePrincipalIdentifier":"An identifier for the Lake Formation principal."}},"AWS::LakeFormation::Permissions.DataLocationResource":{"attributes":{},"description":"A structure for a data location object where permissions are granted or revoked.","properties":{"CatalogId":"The identifier for the Data Catalog . By default, it is the account ID of the caller.","S3Resource":"The Amazon Resource Name (ARN) that uniquely identifies the data location resource."}},"AWS::LakeFormation::Permissions.DatabaseResource":{"attributes":{},"description":"A structure for the database object.","properties":{"CatalogId":"The identifier for the Data Catalog . By default, it is the account ID of the caller.","Name":"The name of the database resource. Unique to the Data Catalog."}},"AWS::LakeFormation::Permissions.Resource":{"attributes":{},"description":"A structure for the resource.","properties":{"DataLocationResource":"A structure for a data location object where permissions are granted or revoked.","DatabaseResource":"A structure for the database object.","TableResource":"A structure for the table object. A table is a metadata definition that represents your data. You can Grant and Revoke table privileges to a principal.","TableWithColumnsResource":"A structure for a table with columns object. This object is only used when granting a SELECT permission."}},"AWS::LakeFormation::Permissions.TableResource":{"attributes":{},"description":"A structure for the table object. A table is a metadata definition that represents your data. You can Grant and Revoke table privileges to a principal.","properties":{"CatalogId":"The identifier for the Data Catalog . By default, it is the account ID of the caller.","DatabaseName":"The name of the database for the table. Unique to a Data Catalog. A database is a set of associated table definitions organized into a logical group. You can Grant and Revoke database privileges to a principal.","Name":"The name of the table.","TableWildcard":"An empty object representing all tables under a database. If this field is specified instead of the `Name` field, all tables under `DatabaseName` will have permission changes applied."}},"AWS::LakeFormation::Permissions.TableWildcard":{"attributes":{},"description":"A wildcard object representing every table under a database.","properties":{}},"AWS::LakeFormation::Permissions.TableWithColumnsResource":{"attributes":{},"description":"A structure for a table with columns object. This object is only used when granting a SELECT permission.\\n\\nThis object must take a value for at least one of `ColumnsNames` , `ColumnsIndexes` , or `ColumnsWildcard` .","properties":{"CatalogId":"The identifier for the Data Catalog . By default, it is the account ID of the caller.","ColumnNames":"The list of column names for the table. At least one of `ColumnNames` or `ColumnWildcard` is required.","ColumnWildcard":"A wildcard specified by a `ColumnWildcard` object. At least one of `ColumnNames` or `ColumnWildcard` is required.","DatabaseName":"The name of the database for the table with columns resource. Unique to the Data Catalog. A database is a set of associated table definitions organized into a logical group. You can Grant and Revoke database privileges to a principal.","Name":"The name of the table resource. A table is a metadata definition that represents your data. You can Grant and Revoke table privileges to a principal."}},"AWS::LakeFormation::PrincipalPermissions":{"attributes":{"PrincipalIdentifier":"Json encoding of the input principal. For example: `{\\"DataLakePrincipalIdentifier\\":\\"arn:aws:iam::123456789012:role/ExampleRole\\"}`","Ref":"`Ref` returns the primary identifier of the resource. The primary identifier of the resource is a combination of `ResourceIdentifier` and `PrincipalIdentifier` separated by a pipe.\\n\\nFor example: `{\\"DataLakePrincipalIdentifier\\":\\"arn:aws:iam::123456789012:role/ExampleRole\\"}|{\\"Catalog\\":null,\\"Database\\":null,\\"Table\\":null,\\"TableWithColumns\\":null,\\"DataLocation\\":null,\\"DataCellsFilter\\":{\\"TableCatalogId\\":\\"123456789012\\",\\"DatabaseName\\":\\"ExampleDatabase\\",\\"TableName\\":\\"ExampleTable\\",\\"Name\\":\\"ExampleFilter\\"},\\"LFTag\\":null,\\"LFTagPolicy\\":null}`","ResourceIdentifier":"Json encoding of the input resource. For example: `{\\"Catalog\\":null,\\"Database\\":null,\\"Table\\":null,\\"TableWithColumns\\":null,\\"DataLocation\\":null,\\"DataCellsFilter\\":{\\"TableCatalogId\\":\\"123456789012\\",\\"DatabaseName\\":\\"ExampleDatabase\\",\\"TableName\\":\\"ExampleTable\\",\\"Name\\":\\"ExampleFilter\\"},\\"LFTag\\":null,\\"LFTagPolicy\\":null}`"},"description":"The `AWS::LakeFormation::PrincipalPermissions` resource represents the permissions that a principal has on a Data Catalog resource (such as AWS Glue databases or AWS Glue tables). When you create a `PrincipalPermissions` resource, the permissions are granted via the AWS Lake Formation `GrantPermissions` API operation. When you delete a `PrincipalPermissions` resource, the permissions on principal-resource pair are revoked via the AWS Lake Formation `RevokePermissions` API operation.","properties":{"Catalog":"The identifier for the Data Catalog . By default, the account ID. The Data Catalog is the persistent metadata store. It contains database definitions, table definitions, and other control information to manage your Lake Formation environment.","Permissions":"The permissions granted or revoked.","PermissionsWithGrantOption":"Indicates the ability to grant permissions (as a subset of permissions granted).","Principal":"The principal to be granted a permission.","Resource":"The resource to be granted or revoked permissions."}},"AWS::LakeFormation::PrincipalPermissions.ColumnWildcard":{"attributes":{},"description":"A wildcard object, consisting of an optional list of excluded column names or indexes.","properties":{"ExcludedColumnNames":"Excludes column names. Any column with this name will be excluded."}},"AWS::LakeFormation::PrincipalPermissions.DataCellsFilterResource":{"attributes":{},"description":"A structure that describes certain columns on certain rows.","properties":{"DatabaseName":"A database in the Data Catalog .","Name":"The name given by the user to the data filter cell.","TableCatalogId":"The ID of the catalog to which the table belongs.","TableName":"The name of the table."}},"AWS::LakeFormation::PrincipalPermissions.DataLakePrincipal":{"attributes":{},"description":"The AWS Lake Formation principal.","properties":{"DataLakePrincipalIdentifier":"An identifier for the AWS Lake Formation principal."}},"AWS::LakeFormation::PrincipalPermissions.DataLocationResource":{"attributes":{},"description":"A structure for a data location object where permissions are granted or revoked.","properties":{"CatalogId":"The identifier for the Data Catalog where the location is registered with AWS Lake Formation .","ResourceArn":"The Amazon Resource Name (ARN) that uniquely identifies the data location resource."}},"AWS::LakeFormation::PrincipalPermissions.DatabaseResource":{"attributes":{},"description":"A structure for the database object.","properties":{"CatalogId":"The identifier for the Data Catalog. By default, it is the account ID of the caller.","Name":"The name of the database resource. Unique to the Data Catalog."}},"AWS::LakeFormation::PrincipalPermissions.LFTag":{"attributes":{},"description":"The LF-tag key and values attached to a resource.","properties":{"TagKey":"The key-name for the LF-tag.","TagValues":"A list of possible values of the corresponding `TagKey` of an LF-tag key-value pair."}},"AWS::LakeFormation::PrincipalPermissions.LFTagKeyResource":{"attributes":{},"description":"A structure containing an LF-tag key and values for a resource.","properties":{"CatalogId":"The identifier for the Data Catalog where the location is registered with Data Catalog .","TagKey":"The key-name for the LF-tag.","TagValues":"A list of possible values for the corresponding `TagKey` of an LF-tag key-value pair."}},"AWS::LakeFormation::PrincipalPermissions.LFTagPolicyResource":{"attributes":{},"description":"A list of LF-tag conditions that define a resource\'s LF-tag policy.\\n\\nA structure that allows an admin to grant user permissions on certain conditions. For example, granting a role access to all columns that do not have the LF-tag \'PII\' in tables that have the LF-tag \'Prod\'.","properties":{"CatalogId":"The identifier for the Data Catalog . The Data Catalog is the persistent metadata store. It contains database definitions, table definitions, and other control information to manage your AWS Lake Formation environment.","Expression":"A list of LF-tag conditions that apply to the resource\'s LF-tag policy.","ResourceType":"The resource type for which the LF-tag policy applies."}},"AWS::LakeFormation::PrincipalPermissions.Resource":{"attributes":{},"description":"A structure for the resource.","properties":{"Catalog":"The identifier for the Data Catalog. By default, the account ID. The Data Catalog is the persistent metadata store. It contains database definitions, table definitions, and other control information to manage your AWS Lake Formation environment.","DataCellsFilter":"A data cell filter.","DataLocation":"The location of an Amazon S3 path where permissions are granted or revoked.","Database":"The database for the resource. Unique to the Data Catalog. A database is a set of associated table definitions organized into a logical group. You can Grant and Revoke database permissions to a principal.","LFTag":"The LF-tag key and values attached to a resource.","LFTagPolicy":"A list of LF-tag conditions that define a resource\'s LF-tag policy.","Table":"The table for the resource. A table is a metadata definition that represents your data. You can Grant and Revoke table privileges to a principal.","TableWithColumns":"The table with columns for the resource. A principal with permissions to this resource can select metadata from the columns of a table in the Data Catalog and the underlying data in Amazon S3."}},"AWS::LakeFormation::PrincipalPermissions.TableResource":{"attributes":{},"description":"A structure for the table object. A table is a metadata definition that represents your data. You can Grant and Revoke table privileges to a principal.","properties":{"CatalogId":"","DatabaseName":"The name of the database for the table. Unique to a Data Catalog. A database is a set of associated table definitions organized into a logical group. You can Grant and Revoke database privileges to a principal.","Name":"The name of the table.","TableWildcard":"A wildcard object representing every table under a database.\\n\\nAt least one of `TableResource$Name` or `TableResource$TableWildcard` is required."}},"AWS::LakeFormation::PrincipalPermissions.TableWithColumnsResource":{"attributes":{},"description":"A structure for a table with columns object. This object is only used when granting a SELECT permission.\\n\\nThis object must take a value for at least one of `ColumnsNames` , `ColumnsIndexes` , or `ColumnsWildcard` .","properties":{"CatalogId":"The identifier for the Data Catalog where the location is registered with AWS Lake Formation .","ColumnNames":"The list of column names for the table. At least one of `ColumnNames` or `ColumnWildcard` is required.","ColumnWildcard":"A wildcard specified by a `ColumnWildcard` object. At least one of `ColumnNames` or `ColumnWildcard` is required.","DatabaseName":"The name of the database for the table with columns resource. Unique to the Data Catalog. A database is a set of associated table definitions organized into a logical group. You can Grant and Revoke database privileges to a principal.","Name":"The name of the table resource. A table is a metadata definition that represents your data. You can Grant and Revoke table privileges to a principal."}},"AWS::LakeFormation::Resource":{"attributes":{},"description":"The `AWS::LakeFormation::Resource` represents the data ( buckets and folders) that is being registered with AWS Lake Formation . During a stack operation, AWS CloudFormation calls the AWS Lake Formation [`RegisterResource`](https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-credential-vending.html#aws-lake-formation-api-credential-vending-RegisterResource) API operation to register the resource. To remove a `Resource` type, AWS CloudFormation calls the AWS Lake Formation [`DeregisterResource`](https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-credential-vending.html#aws-lake-formation-api-credential-vending-DeregisterResource) API operation.","properties":{"ResourceArn":"The Amazon Resource Name (ARN) of the resource.","RoleArn":"The IAM role that registered a resource.","UseServiceLinkedRole":"Designates a trusted caller, an IAM principal, by registering this caller with the Data Catalog .","WithFederation":"Allows Lake Formation to assume a role to access tables in a federated database."}},"AWS::LakeFormation::Tag":{"attributes":{"Ref":"`Ref` returns the Tag’s `TagKey` property value.\\n\\nFor example: `tagKeyName`"},"description":"The `AWS::LakeFormation::Tag` resource represents an LF-tag, which consists of a key and one or more possible values for the key. During a stack operation, AWS CloudFormation calls the AWS Lake Formation `CreateLFTag` API to create a tag, and `UpdateLFTag` API to update a tag resource, and a `DeleteLFTag` to delete it.","properties":{"CatalogId":"Catalog id string, not less than 1 or more than 255 bytes long, matching the [single-line string pattern](https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-aws-lake-formation-api-common.html) .\\n\\nThe identifier for the Data Catalog . By default, the account ID. The Data Catalog is the persistent metadata store. It contains database definitions, table definitions, and other control information to manage your AWS Lake Formation environment.","TagKey":"UTF-8 string, not less than 1 or more than 255 bytes long, matching the [single-line string pattern](https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-aws-lake-formation-api-common.html) .\\n\\nThe key-name for the LF-tag.","TagValues":"An array of UTF-8 strings, not less than 1 or more than 50 strings.\\n\\nA list of possible values of the corresponding `TagKey` of an LF-tag key-value pair."}},"AWS::LakeFormation::TagAssociation":{"attributes":{"Ref":"`Ref` returns a combination of the `ResourceIdentifier` and `TagsIdentifier` seperated with a pipe.\\n\\nFor example: `{\\"Catalog\\":null,\\"Database\\":{\\"CatalogId\\":null,\\"Name\\":\\"ExampleDbName\\"},\\"Table\\":null,\\"TableWithColumns\\":null}|[{\\"CatalogId\\":null,\\"TagKey\\":\\"tagKey1\\",\\"TagValues\\":null}]`","ResourceIdentifier":"Json encoding of the input resource.\\n\\n**Examples** - Database: `{\\"Catalog\\":null,\\"Database\\":{\\"CatalogId\\":\\"123456789012\\",\\"Name\\":\\"ExampleDbName\\"},\\"Table\\":null,\\"TableWithColumns\\":null}`\\n- Table: `{\\"Catalog\\":null,\\"Database\\":null,\\"Table\\":{\\"CatalogId\\":\\"123456789012\\",\\"DatabaseName\\":\\"ExampleDbName\\",\\"Name\\":\\"ExampleTableName\\",\\"TableWildcard\\":null},\\"TableWithColumns\\":null}`\\n- Columns: `{\\"Catalog\\":null,\\"Database\\":null,\\"Table\\":null,\\"TableWithColumns\\":{\\"CatalogId\\":\\"123456789012\\",\\"DatabaseName\\":\\"ExampleDbName\\",\\"Name\\":\\"ExampleTableName\\",\\"ColumnNames\\":[\\"ExampleColName1\\",\\"ExampleColName2\\"]}}`","TagsIdentifier":"Json encoding of the input LFTags list.\\n\\nFor example: `[{\\"CatalogId\\":null,\\"TagKey\\":\\"tagKey1\\",\\"TagValues\\":null},{\\"CatalogId\\":null,\\"TagKey\\":\\"tagKey2\\",\\"TagValues\\":null}]`"},"description":"The `AWS::LakeFormation::TagAssociation` resource represents an assignment of an LF-tag to a Data Catalog resource (database, table, or column). During a stack operation, CloudFormation calls AWS Lake Formation `AddLFTagsToResource` API to create a `TagAssociation` resource and calls the `RemoveLFTagsToResource` API to delete it.","properties":{"LFTags":"A structure containing an LF-tag key-value pair.","Resource":"UTF-8 string (valid values: `DATABASE | TABLE` ).\\n\\nThe resource for which the LF-tag policy applies."}},"AWS::LakeFormation::TagAssociation.DatabaseResource":{"attributes":{},"description":"A structure for the database object.","properties":{"CatalogId":"The identifier for the Data Catalog . By default, it should be the account ID of the caller.","Name":"The name of the database resource. Unique to the Data Catalog."}},"AWS::LakeFormation::TagAssociation.LFTagPair":{"attributes":{},"description":"A structure containing the catalog ID, tag key, and tag values of an LF-tag key-value pair.","properties":{"CatalogId":"The identifier for the Data Catalog . By default, it is the account ID of the caller.","TagKey":"The key-name for the LF-tag.","TagValues":"A list of possible values of the corresponding `TagKey` of an LF-tag key-value pair."}},"AWS::LakeFormation::TagAssociation.Resource":{"attributes":{},"description":"A structure for the resource.","properties":{"Catalog":"The identifier for the Data Catalog. By default, the account ID. The Data Catalog is the persistent metadata store. It contains database definitions, table definitions, and other control information to manage your AWS Lake Formation environment.","Database":"The database for the resource. Unique to the Data Catalog. A database is a set of associated table definitions organized into a logical group. You can Grant and Revoke database permissions to a principal.","Table":"The table for the resource. A table is a metadata definition that represents your data. You can Grant and Revoke table privileges to a principal.","TableWithColumns":"The table with columns for the resource. A principal with permissions to this resource can select metadata from the columns of a table in the Data Catalog and the underlying data in Amazon S3."}},"AWS::LakeFormation::TagAssociation.TableResource":{"attributes":{},"description":"A structure for the table object. A table is a metadata definition that represents your data. You can Grant and Revoke table privileges to a principal.","properties":{"CatalogId":"The identifier for the Data Catalog . By default, it is the account ID of the caller.","DatabaseName":"The name of the database for the table. Unique to a Data Catalog. A database is a set of associated table definitions organized into a logical group. You can Grant and Revoke database privileges to a principal.","Name":"The name of the table.","TableWildcard":"A wildcard object representing every table under a database.This is an object with no properties that effectively behaves as a true or false depending on whether not it is passed as a parameter. The valid inputs for a property with this type in either yaml or json is null or {}.\\n\\nAt least one of `TableResource$Name` or `TableResource$TableWildcard` is required."}},"AWS::LakeFormation::TagAssociation.TableWithColumnsResource":{"attributes":{},"description":"A structure for a table with columns object. This object is only used when granting a SELECT permission.\\n\\nThis object must take a value for at least one of `ColumnsNames` , `ColumnsIndexes` , or `ColumnsWildcard` .","properties":{"CatalogId":"A wildcard object representing every table under a database.\\n\\nAt least one of TableResource$Name or TableResource$TableWildcard is required.","ColumnNames":"The list of column names for the table. At least one of `ColumnNames` or `ColumnWildcard` is required.","DatabaseName":"The name of the database for the table with columns resource. Unique to the Data Catalog. A database is a set of associated table definitions organized into a logical group. You can Grant and Revoke database privileges to a principal.","Name":"The name of the table resource. A table is a metadata definition that represents your data. You can Grant and Revoke table privileges to a principal."}},"AWS::Lambda::Alias":{"attributes":{"Ref":"`Ref` returns the resource ARN."},"description":"The `AWS::Lambda::Alias` resource creates an [alias](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html) for a Lambda function version. Use aliases to provide clients with a function identifier that you can update to invoke a different version.\\n\\nYou can also map an alias to split invocation requests between two versions. Use the `RoutingConfig` parameter to specify a second version and the percentage of invocation requests that it receives.","properties":{"Description":"A description of the alias.","FunctionName":"The name of the Lambda function.\\n\\n**Name formats** - *Function name* - `MyFunction` .\\n- *Function ARN* - `arn:aws:lambda:us-west-2:123456789012:function:MyFunction` .\\n- *Partial ARN* - `123456789012:function:MyFunction` .\\n\\nThe length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.","FunctionVersion":"The function version that the alias invokes.","Name":"The name of the alias.","ProvisionedConcurrencyConfig":"Specifies a [provisioned concurrency](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html) configuration for a function\'s alias.","RoutingConfig":"The [routing configuration](https://docs.aws.amazon.com/lambda/latest/dg/lambda-traffic-shifting-using-aliases.html) of the alias."}},"AWS::Lambda::Alias.AliasRoutingConfiguration":{"attributes":{},"description":"The [traffic-shifting](https://docs.aws.amazon.com/lambda/latest/dg/lambda-traffic-shifting-using-aliases.html) configuration of a Lambda function alias.","properties":{"AdditionalVersionWeights":"The second version, and the percentage of traffic that\'s routed to it."}},"AWS::Lambda::Alias.ProvisionedConcurrencyConfiguration":{"attributes":{},"description":"A provisioned concurrency configuration for a function\'s alias.","properties":{"ProvisionedConcurrentExecutions":"The amount of provisioned concurrency to allocate for the alias."}},"AWS::Lambda::Alias.VersionWeight":{"attributes":{},"description":"The [traffic-shifting](https://docs.aws.amazon.com/lambda/latest/dg/lambda-traffic-shifting-using-aliases.html) configuration of a Lambda function alias.","properties":{"FunctionVersion":"The qualifier of the second version.","FunctionWeight":"The percentage of traffic that the alias routes to the second version."}},"AWS::Lambda::CodeSigningConfig":{"attributes":{"CodeSigningConfigArn":"The Amazon Resource Name (ARN) of the code signing configuration.","CodeSigningConfigId":"The code signing configuration ID.","Ref":"`Ref` returns the resource name."},"description":"Details about a [Code signing configuration](https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html) .","properties":{"AllowedPublishers":"List of allowed publishers.","CodeSigningPolicies":"The code signing policy controls the validation failure action for signature mismatch or expiry.","Description":"Code signing configuration description."}},"AWS::Lambda::CodeSigningConfig.AllowedPublishers":{"attributes":{},"description":"List of signing profiles that can sign a code package.","properties":{"SigningProfileVersionArns":"The Amazon Resource Name (ARN) for each of the signing profiles. A signing profile defines a trusted user who can sign a code package."}},"AWS::Lambda::CodeSigningConfig.CodeSigningPolicies":{"attributes":{},"description":"Code signing configuration [policies](https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html#config-codesigning-policies) specify the validation failure action for signature mismatch or expiry.","properties":{"UntrustedArtifactOnDeployment":"Code signing configuration policy for deployment validation failure. If you set the policy to `Enforce` , Lambda blocks the deployment request if signature validation checks fail. If you set the policy to `Warn` , Lambda allows the deployment and creates a CloudWatch log.\\n\\nDefault value: `Warn`"}},"AWS::Lambda::EventInvokeConfig":{"attributes":{"Ref":""},"description":"The `AWS::Lambda::EventInvokeConfig` resource configures options for [asynchronous invocation](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html) on a version or an alias.\\n\\nBy default, Lambda retries an asynchronous invocation twice if the function returns an error. It retains events in a queue for up to six hours. When an event fails all processing attempts or stays in the asynchronous invocation queue for too long, Lambda discards it.","properties":{"DestinationConfig":"A destination for events after they have been sent to a function for processing.\\n\\n**Destinations** - *Function* - The Amazon Resource Name (ARN) of a Lambda function.\\n- *Queue* - The ARN of a standard SQS queue.\\n- *Topic* - The ARN of a standard SNS topic.\\n- *Event Bus* - The ARN of an Amazon EventBridge event bus.","FunctionName":"The name of the Lambda function.\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `64`\\n\\n*Pattern* : `([a-zA-Z0-9-_]+)`","MaximumEventAgeInSeconds":"The maximum age of a request that Lambda sends to a function for processing.","MaximumRetryAttempts":"The maximum number of times to retry when the function returns an error.","Qualifier":"The identifier of a version or alias.\\n\\n- *Version* - A version number.\\n- *Alias* - An alias name.\\n- *Latest* - To specify the unpublished version, use `$LATEST` ."}},"AWS::Lambda::EventInvokeConfig.DestinationConfig":{"attributes":{},"description":"A configuration object that specifies the destination of an event after Lambda processes it.","properties":{"OnFailure":"The destination configuration for failed invocations.","OnSuccess":"The destination configuration for successful invocations."}},"AWS::Lambda::EventInvokeConfig.OnFailure":{"attributes":{},"description":"A destination for events that failed processing.","properties":{"Destination":"The Amazon Resource Name (ARN) of the destination resource."}},"AWS::Lambda::EventInvokeConfig.OnSuccess":{"attributes":{},"description":"A destination for events that were processed successfully.","properties":{"Destination":"The Amazon Resource Name (ARN) of the destination resource."}},"AWS::Lambda::EventSourceMapping":{"attributes":{"Id":"The event source mapping\'s ID.","Ref":"`Ref` returns the mapping\'s ID."},"description":"The `AWS::Lambda::EventSourceMapping` resource creates a mapping between an event source and an AWS Lambda function. Lambda reads items from the event source and triggers the function.\\n\\nFor details about each event source type, see the following topics. In particular, each of the topics describes the required and optional parameters for the specific event source.\\n\\n- [Configuring a Dynamo DB stream as an event source](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html#services-dynamodb-eventsourcemapping)\\n- [Configuring a Kinesis stream as an event source](https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html#services-kinesis-eventsourcemapping)\\n- [Configuring an SQS queue as an event source](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-eventsource)\\n- [Configuring an MQ broker as an event source](https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html#services-mq-eventsourcemapping)\\n- [Configuring MSK as an event source](https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html)\\n- [Configuring Self-Managed Apache Kafka as an event source](https://docs.aws.amazon.com/lambda/latest/dg/kafka-smaa.html)\\n- [Configuring Amazon DocumentDB as an event source](https://docs.aws.amazon.com/lambda/latest/dg/with-documentdb.html)","properties":{"AmazonManagedKafkaEventSourceConfig":"Specific configuration settings for an Amazon Managed Streaming for Apache Kafka (Amazon MSK) event source.","BatchSize":"The maximum number of records in each batch that Lambda pulls from your stream or queue and sends to your function. Lambda passes all of the records in the batch to the function in a single call, up to the payload limit for synchronous invocation (6 MB).\\n\\n- *Amazon Kinesis* – Default 100. Max 10,000.\\n- *Amazon DynamoDB Streams* – Default 100. Max 10,000.\\n- *Amazon Simple Queue Service* – Default 10. For standard queues the max is 10,000. For FIFO queues the max is 10.\\n- *Amazon Managed Streaming for Apache Kafka* – Default 100. Max 10,000.\\n- *Self-managed Apache Kafka* – Default 100. Max 10,000.\\n- *Amazon MQ (ActiveMQ and RabbitMQ)* – Default 100. Max 10,000.\\n- *DocumentDB* – Default 100. Max 10,000.","BisectBatchOnFunctionError":"(Kinesis and DynamoDB Streams only) If the function returns an error, split the batch in two and retry. The default value is false.","DestinationConfig":"(Kinesis and DynamoDB Streams only) An Amazon SQS queue or Amazon SNS topic destination for discarded records.","DocumentDBEventSourceConfig":"Specific configuration settings for a DocumentDB event source.","Enabled":"When true, the event source mapping is active. When false, Lambda pauses polling and invocation.\\n\\nDefault: True","EventSourceArn":"The Amazon Resource Name (ARN) of the event source.\\n\\n- *Amazon Kinesis* – The ARN of the data stream or a stream consumer.\\n- *Amazon DynamoDB Streams* – The ARN of the stream.\\n- *Amazon Simple Queue Service* – The ARN of the queue.\\n- *Amazon Managed Streaming for Apache Kafka* – The ARN of the cluster.\\n- *Amazon MQ* – The ARN of the broker.\\n- *Amazon DocumentDB* – The ARN of the DocumentDB change stream.","FilterCriteria":"An object that defines the filter criteria that determine whether Lambda should process an event. For more information, see [Lambda event filtering](https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html) .","FunctionName":"The name of the Lambda function.\\n\\n**Name formats** - *Function name* – `MyFunction` .\\n- *Function ARN* – `arn:aws:lambda:us-west-2:123456789012:function:MyFunction` .\\n- *Version or Alias ARN* – `arn:aws:lambda:us-west-2:123456789012:function:MyFunction:PROD` .\\n- *Partial ARN* – `123456789012:function:MyFunction` .\\n\\nThe length constraint applies only to the full ARN. If you specify only the function name, it\'s limited to 64 characters in length.","FunctionResponseTypes":"(Streams and SQS) A list of current response type enums applied to the event source mapping.\\n\\nValid Values: `ReportBatchItemFailures`","MaximumBatchingWindowInSeconds":"The maximum amount of time, in seconds, that Lambda spends gathering records before invoking the function.\\n\\n*Default ( Kinesis , DynamoDB , Amazon SQS event sources)* : 0\\n\\n*Default ( Amazon MSK , Kafka, Amazon MQ , Amazon DocumentDB event sources)* : 500 ms\\n\\n*Related setting:* For Amazon SQS event sources, when you set `BatchSize` to a value greater than 10, you must set `MaximumBatchingWindowInSeconds` to at least 1.","MaximumRecordAgeInSeconds":"(Kinesis and DynamoDB Streams only) Discard records older than the specified age. The default value is -1,\\nwhich sets the maximum age to infinite. When the value is set to infinite, Lambda never discards old records.\\n\\n> The minimum valid value for maximum record age is 60s. Although values less than 60 and greater than -1 fall within the parameter\'s absolute range, they are not allowed","MaximumRetryAttempts":"(Kinesis and DynamoDB Streams only) Discard records after the specified number of retries. The default value is -1,\\nwhich sets the maximum number of retries to infinite. When MaximumRetryAttempts is infinite, Lambda retries failed records until the record expires in the event source.","ParallelizationFactor":"(Kinesis and DynamoDB Streams only) The number of batches to process concurrently from each shard. The default value is 1.","Queues":"(Amazon MQ) The name of the Amazon MQ broker destination queue to consume.","ScalingConfig":"(Amazon SQS only) The scaling configuration for the event source. For more information, see [Configuring maximum concurrency for Amazon SQS event sources](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-max-concurrency) .","SelfManagedEventSource":"The self-managed Apache Kafka cluster for your event source.","SelfManagedKafkaEventSourceConfig":"Specific configuration settings for a self-managed Apache Kafka event source.","SourceAccessConfigurations":"An array of the authentication protocol, VPC components, or virtual host to secure and define your event source.","StartingPosition":"The position in a stream from which to start reading. Required for Amazon Kinesis and Amazon DynamoDB.\\n\\n- *LATEST* - Read only new records.\\n- *TRIM_HORIZON* - Process all available records.\\n- *AT_TIMESTAMP* - Specify a time from which to start reading records.","StartingPositionTimestamp":"With `StartingPosition` set to `AT_TIMESTAMP` , the time from which to start reading, in Unix time seconds. `StartingPositionTimestamp` cannot be in the future.","Topics":"The name of the Kafka topic.","TumblingWindowInSeconds":"(Kinesis and DynamoDB Streams only) The duration in seconds of a processing window for DynamoDB and Kinesis Streams event sources. A value of 0 seconds indicates no tumbling window."}},"AWS::Lambda::EventSourceMapping.AmazonManagedKafkaEventSourceConfig":{"attributes":{},"description":"Specific configuration settings for an Amazon Managed Streaming for Apache Kafka (Amazon MSK) event source.","properties":{"ConsumerGroupId":"The identifier for the Kafka consumer group to join. The consumer group ID must be unique among all your Kafka event sources. After creating a Kafka event source mapping with the consumer group ID specified, you cannot update this value. For more information, see [Customizable consumer group ID](https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html#services-msk-consumer-group-id) ."}},"AWS::Lambda::EventSourceMapping.DestinationConfig":{"attributes":{},"description":"A configuration object that specifies the destination of an event after Lambda processes it.","properties":{"OnFailure":"The destination configuration for failed invocations."}},"AWS::Lambda::EventSourceMapping.DocumentDBEventSourceConfig":{"attributes":{},"description":"Specific configuration settings for a DocumentDB event source.","properties":{"CollectionName":"The name of the collection to consume within the database. If you do not specify a collection, Lambda consumes all collections.","DatabaseName":"The name of the database to consume within the DocumentDB cluster.","FullDocument":"Determines what DocumentDB sends to your event stream during document update operations. If set to UpdateLookup, DocumentDB sends a delta describing the changes, along with a copy of the entire document. Otherwise, DocumentDB sends only a partial document that contains the changes."}},"AWS::Lambda::EventSourceMapping.Endpoints":{"attributes":{},"description":"The list of bootstrap servers for your Kafka brokers in the following format: `\\"KafkaBootstrapServers\\": [\\"abc.xyz.com:xxxx\\",\\"abc2.xyz.com:xxxx\\"]` .","properties":{"KafkaBootstrapServers":"The list of bootstrap servers for your Kafka brokers in the following format: `\\"KafkaBootstrapServers\\": [\\"abc.xyz.com:xxxx\\",\\"abc2.xyz.com:xxxx\\"]` ."}},"AWS::Lambda::EventSourceMapping.Filter":{"attributes":{},"description":"A structure within a `FilterCriteria` object that defines an event filtering pattern.","properties":{"Pattern":"A filter pattern. For more information on the syntax of a filter pattern, see [Filter rule syntax](https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html#filtering-syntax) ."}},"AWS::Lambda::EventSourceMapping.FilterCriteria":{"attributes":{},"description":"An object that contains the filters for an event source.","properties":{"Filters":"A list of filters."}},"AWS::Lambda::EventSourceMapping.OnFailure":{"attributes":{},"description":"A destination for events that failed processing.","properties":{"Destination":"The Amazon Resource Name (ARN) of the destination resource."}},"AWS::Lambda::EventSourceMapping.ScalingConfig":{"attributes":{},"description":"(Amazon SQS only) The scaling configuration for the event source. To remove the configuration, pass an empty value.","properties":{"MaximumConcurrency":"Limits the number of concurrent instances that the Amazon SQS event source can invoke."}},"AWS::Lambda::EventSourceMapping.SelfManagedEventSource":{"attributes":{},"description":"The self-managed Apache Kafka cluster for your event source.","properties":{"Endpoints":"The list of bootstrap servers for your Kafka brokers in the following format: `\\"KafkaBootstrapServers\\": [\\"abc.xyz.com:xxxx\\",\\"abc2.xyz.com:xxxx\\"]` ."}},"AWS::Lambda::EventSourceMapping.SelfManagedKafkaEventSourceConfig":{"attributes":{},"description":"Specific configuration settings for a self-managed Apache Kafka event source.","properties":{"ConsumerGroupId":"The identifier for the Kafka consumer group to join. The consumer group ID must be unique among all your Kafka event sources. After creating a Kafka event source mapping with the consumer group ID specified, you cannot update this value. For more information, see [Customizable consumer group ID](https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html#services-msk-consumer-group-id) ."}},"AWS::Lambda::EventSourceMapping.SourceAccessConfiguration":{"attributes":{},"description":"An array of the authentication protocol, VPC components, or virtual host to secure and define your event source.","properties":{"Type":"The type of authentication protocol, VPC components, or virtual host for your event source. For example: `\\"Type\\":\\"SASL_SCRAM_512_AUTH\\"` .\\n\\n- `BASIC_AUTH` – (Amazon MQ) The AWS Secrets Manager secret that stores your broker credentials.\\n- `BASIC_AUTH` – (Self-managed Apache Kafka) The Secrets Manager ARN of your secret key used for SASL/PLAIN authentication of your Apache Kafka brokers.\\n- `VPC_SUBNET` – (Self-managed Apache Kafka) The subnets associated with your VPC. Lambda connects to these subnets to fetch data from your self-managed Apache Kafka cluster.\\n- `VPC_SECURITY_GROUP` – (Self-managed Apache Kafka) The VPC security group used to manage access to your self-managed Apache Kafka brokers.\\n- `SASL_SCRAM_256_AUTH` – (Self-managed Apache Kafka) The Secrets Manager ARN of your secret key used for SASL SCRAM-256 authentication of your self-managed Apache Kafka brokers.\\n- `SASL_SCRAM_512_AUTH` – (Amazon MSK, Self-managed Apache Kafka) The Secrets Manager ARN of your secret key used for SASL SCRAM-512 authentication of your self-managed Apache Kafka brokers.\\n- `VIRTUAL_HOST` –- (RabbitMQ) The name of the virtual host in your RabbitMQ broker. Lambda uses this RabbitMQ host as the event source. This property cannot be specified in an UpdateEventSourceMapping API call.\\n- `CLIENT_CERTIFICATE_TLS_AUTH` – (Amazon MSK, self-managed Apache Kafka) The Secrets Manager ARN of your secret key containing the certificate chain (X.509 PEM), private key (PKCS#8 PEM), and private key password (optional) used for mutual TLS authentication of your MSK/Apache Kafka brokers.\\n- `SERVER_ROOT_CA_CERTIFICATE` – (Self-managed Apache Kafka) The Secrets Manager ARN of your secret key containing the root CA certificate (X.509 PEM) used for TLS encryption of your Apache Kafka brokers.","URI":"The value for your chosen configuration in `Type` . For example: `\\"URI\\": \\"arn:aws:secretsmanager:us-east-1:01234567890:secret:MyBrokerSecretName\\"` ."}},"AWS::Lambda::Function":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the function.","Ref":"`Ref` returns the resource name.","SnapStartResponse":"","SnapStartResponse.ApplyOn":"","SnapStartResponse.OptimizationStatus":""},"description":"The `AWS::Lambda::Function` resource creates a Lambda function. To create a function, you need a [deployment package](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html) and an [execution role](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) . The deployment package is a .zip file archive or container image that contains your function code. The execution role grants the function permission to use AWS services, such as Amazon CloudWatch Logs for log streaming and AWS X-Ray for request tracing.\\n\\nYou set the package type to `Image` if the deployment package is a [container image](https://docs.aws.amazon.com/lambda/latest/dg/lambda-images.html) . For a container image, the code property must include the URI of a container image in the Amazon ECR registry. You do not need to specify the handler and runtime properties.\\n\\nYou set the package type to `Zip` if the deployment package is a [.zip file archive](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html#gettingstarted-package-zip) . For a .zip file archive, the code property specifies the location of the .zip file. You must also specify the handler and runtime properties. For a Python example, see [Deploy Python Lambda functions with .zip file archives](https://docs.aws.amazon.com/lambda/latest/dg/python-package.html) .\\n\\nYou can use [code signing](https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html) if your deployment package is a .zip file archive. To enable code signing for this function, specify the ARN of a code-signing configuration. When a user attempts to deploy a code package with `UpdateFunctionCode` , Lambda checks that the code package has a valid signature from a trusted publisher. The code-signing configuration includes a set of signing profiles, which define the trusted publishers for this function.\\n\\nNote that you configure [provisioned concurrency](https://docs.aws.amazon.com/lambda/latest/dg/provisioned-concurrency.html) on a `AWS::Lambda::Version` or a `AWS::Lambda::Alias` .\\n\\nFor a complete introduction to Lambda functions, see [What is Lambda?](https://docs.aws.amazon.com/lambda/latest/dg/lambda-welcome.html) in the *Lambda developer guide.*","properties":{"Architectures":"The instruction set architecture that the function supports. Enter a string array with one of the valid values (arm64 or x86_64). The default value is `x86_64` .","Code":"The code for the function.","CodeSigningConfigArn":"To enable code signing for this function, specify the ARN of a code-signing configuration. A code-signing configuration\\nincludes a set of signing profiles, which define the trusted publishers for this function.","DeadLetterConfig":"A dead-letter queue configuration that specifies the queue or topic where Lambda sends asynchronous events when they fail processing. For more information, see [Dead-letter queues](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-dlq) .","Description":"A description of the function.","Environment":"Environment variables that are accessible from function code during execution.","EphemeralStorage":"The size of the function\'s `/tmp` directory in MB. The default value is 512, but it can be any whole number between 512 and 10,240 MB.","FileSystemConfigs":"Connection settings for an Amazon EFS file system. To connect a function to a file system, a mount target must be available in every Availability Zone that your function connects to. If your template contains an [AWS::EFS::MountTarget](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-mounttarget.html) resource, you must also specify a `DependsOn` attribute to ensure that the mount target is created or updated before the function.\\n\\nFor more information about using the `DependsOn` attribute, see [DependsOn Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) .","FunctionName":"The name of the Lambda function, up to 64 characters in length. If you don\'t specify a name, AWS CloudFormation generates one.\\n\\nIf you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","Handler":"The name of the method within your code that Lambda calls to run your function. Handler is required if the deployment package is a .zip file archive. The format includes the file name. It can also include namespaces and other qualifiers, depending on the runtime. For more information, see [Lambda programming model](https://docs.aws.amazon.com/lambda/latest/dg/foundation-progmodel.html) .","ImageConfig":"Configuration values that override the container image Dockerfile settings. For more information, see [Container image settings](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-parms) .","KmsKeyArn":"The ARN of the AWS Key Management Service ( AWS KMS ) customer managed key that\'s used to encrypt your function\'s [environment variables](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-encryption) . When [Lambda SnapStart](https://docs.aws.amazon.com/lambda/latest/dg/snapstart-security.html) is activated, Lambda also uses this key is to encrypt your function\'s snapshot. If you deploy your function using a container image, Lambda also uses this key to encrypt your function when it\'s deployed. Note that this is not the same key that\'s used to protect your container image in the Amazon Elastic Container Registry (Amazon ECR).\\nIf you don\'t provide a customer managed key, Lambda uses a default service key.","Layers":"A list of [function layers](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) to add to the function\'s execution environment. Specify each layer by its ARN, including the version.","MemorySize":"The amount of [memory available to the function](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-memory-console) at runtime. Increasing the function memory also increases its CPU allocation. The default value is 128 MB. The value can be any multiple of 1 MB.","PackageType":"The type of deployment package. Set to `Image` for container image and set `Zip` for .zip file archive.","ReservedConcurrentExecutions":"The number of simultaneous executions to reserve for the function.","Role":"The Amazon Resource Name (ARN) of the function\'s execution role.","Runtime":"The identifier of the function\'s [runtime](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html) . Runtime is required if the deployment package is a .zip file archive.\\n\\nThe following list includes deprecated runtimes. For more information, see [Runtime deprecation policy](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-support-policy) .","RuntimeManagementConfig":"Sets the runtime management configuration for a function\'s version. For more information, see [Runtime updates](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html) .","SnapStart":"The function\'s [AWS Lambda SnapStart](https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html) setting.","Tags":"A list of [tags](https://docs.aws.amazon.com/lambda/latest/dg/tagging.html) to apply to the function.","Timeout":"The amount of time (in seconds) that Lambda allows a function to run before stopping it. The default is 3 seconds. The maximum allowed value is 900 seconds. For more information, see [Lambda execution environment](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-context.html) .","TracingConfig":"Set `Mode` to `Active` to sample and trace a subset of incoming requests with [X-Ray](https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html) .","VpcConfig":"For network connectivity to AWS resources in a VPC, specify a list of security groups and subnets in the VPC. When you connect a function to a VPC, it can access resources and the internet only through that VPC. For more information, see [Configuring a Lambda function to access resources in a VPC](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html) ."}},"AWS::Lambda::Function.Code":{"attributes":{},"description":"The [deployment package](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html) for a Lambda function. To deploy a function defined as a container image, you specify the location of a container image in the Amazon ECR registry. For a .zip file deployment package, you can specify the location of an object in Amazon S3. For Node.js and Python functions, you can specify the function code inline in the template.\\n\\nChanges to a deployment package in Amazon S3 are not detected automatically during stack updates. To update the function code, change the object key or version in the template.","properties":{"ImageUri":"URI of a [container image](https://docs.aws.amazon.com/lambda/latest/dg/lambda-images.html) in the Amazon ECR registry.","S3Bucket":"An Amazon S3 bucket in the same AWS Region as your function. The bucket can be in a different AWS account .","S3Key":"The Amazon S3 key of the deployment package.","S3ObjectVersion":"For versioned objects, the version of the deployment package object to use.","ZipFile":"(Node.js and Python) The source code of your Lambda function. If you include your function source inline with this parameter, AWS CloudFormation places it in a file named `index` and zips it to create a [deployment package](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html) . This zip file cannot exceed 4MB. For the `Handler` property, the first part of the handler identifier must be `index` . For example, `index.handler` .\\n\\nFor JSON, you must escape quotes and special characters such as newline ( `\\\\n` ) with a backslash.\\n\\nIf you specify a function that interacts with an AWS CloudFormation custom resource, you don\'t have to write your own functions to send responses to the custom resource that invoked the function. AWS CloudFormation provides a response module ( [cfn-response](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-lambda-function-code-cfnresponsemodule.html) ) that simplifies sending responses. See [Using AWS Lambda with AWS CloudFormation](https://docs.aws.amazon.com/lambda/latest/dg/services-cloudformation.html) for details."}},"AWS::Lambda::Function.DeadLetterConfig":{"attributes":{},"description":"The [dead-letter queue](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#dlq) for failed asynchronous invocations.","properties":{"TargetArn":"The Amazon Resource Name (ARN) of an Amazon SQS queue or Amazon SNS topic."}},"AWS::Lambda::Function.Environment":{"attributes":{},"description":"A function\'s environment variable settings. You can use environment variables to adjust your function\'s behavior without updating code. An environment variable is a pair of strings that are stored in a function\'s version-specific configuration.","properties":{"Variables":"Environment variable key-value pairs. For more information, see [Using Lambda environment variables](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html) ."}},"AWS::Lambda::Function.EphemeralStorage":{"attributes":{},"description":"The size of the function\'s `/tmp` directory in MB. The default value is 512, but it can be any whole number between 512 and 10,240 MB.","properties":{"Size":"The size of the function\'s `/tmp` directory."}},"AWS::Lambda::Function.FileSystemConfig":{"attributes":{},"description":"Details about the connection between a Lambda function and an [Amazon EFS file system](https://docs.aws.amazon.com/lambda/latest/dg/configuration-filesystem.html) .","properties":{"Arn":"The Amazon Resource Name (ARN) of the Amazon EFS access point that provides access to the file system.","LocalMountPath":"The path where the function can access the file system, starting with `/mnt/` ."}},"AWS::Lambda::Function.ImageConfig":{"attributes":{},"description":"Configuration values that override the container image Dockerfile settings. For more information, see [Container image settings](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-parms) .","properties":{"Command":"Specifies parameters that you want to pass in with ENTRYPOINT. You can specify a maximum of 1,500 parameters in the list.","EntryPoint":"Specifies the entry point to their application, which is typically the location of the runtime executable. You can specify a maximum of 1,500 string entries in the list.","WorkingDirectory":"Specifies the working directory. The length of the directory string cannot exceed 1,000 characters."}},"AWS::Lambda::Function.RuntimeManagementConfig":{"attributes":{},"description":"Sets the runtime management configuration for a function\'s version. For more information, see [Runtime updates](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html) .","properties":{"RuntimeVersionArn":"The ARN of the runtime version you want the function to use.\\n\\n> This is only required if you\'re using the *Manual* runtime update mode.","UpdateRuntimeOn":"Specify the runtime update mode.\\n\\n- *Auto (default)* - Automatically update to the most recent and secure runtime version using a [Two-phase runtime version rollout](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html#runtime-management-two-phase) . This is the best choice for most customers to ensure they always benefit from runtime updates.\\n- *FunctionUpdate* - Lambda updates the runtime of you function to the most recent and secure runtime version when you update your function. This approach synchronizes runtime updates with function deployments, giving you control over when runtime updates are applied and allowing you to detect and mitigate rare runtime update incompatibilities early. When using this setting, you need to regularly update your functions to keep their runtime up-to-date.\\n- *Manual* - You specify a runtime version in your function configuration. The function will use this runtime version indefinitely. In the rare case where a new runtime version is incompatible with an existing function, this allows you to roll back your function to an earlier runtime version. For more information, see [Roll back a runtime version](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html#runtime-management-rollback) .\\n\\n*Valid Values* : `Auto` | `FunctionUpdate` | `Manual`"}},"AWS::Lambda::Function.SnapStart":{"attributes":{},"description":"The function\'s [AWS Lambda SnapStart](https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html) setting.","properties":{"ApplyOn":"Set `ApplyOn` to `PublishedVersions` to create a snapshot of the initialized execution environment when you publish a function version."}},"AWS::Lambda::Function.SnapStartResponse":{"attributes":{},"description":"The function\'s [SnapStart](https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html) setting.","properties":{"ApplyOn":"When set to `PublishedVersions` , Lambda creates a snapshot of the execution environment when you publish a function version.","OptimizationStatus":"When you provide a [qualified Amazon Resource Name (ARN)](https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html#versioning-versions-using) , this response element indicates whether SnapStart is activated for the specified function version."}},"AWS::Lambda::Function.TracingConfig":{"attributes":{},"description":"The function\'s [AWS X-Ray](https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html) tracing configuration. To sample and record incoming requests, set `Mode` to `Active` .","properties":{"Mode":"The tracing mode."}},"AWS::Lambda::Function.VpcConfig":{"attributes":{},"description":"The VPC security groups and subnets that are attached to a Lambda function. When you connect a function to a VPC, Lambda creates an elastic network interface for each combination of security group and subnet in the function\'s VPC configuration. The function can only access resources and the internet through that VPC. For more information, see [VPC Settings](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html) .\\n\\n> When you delete a function, AWS CloudFormation monitors the state of its network interfaces and waits for Lambda to delete them before proceeding. If the VPC is defined in the same stack, the network interfaces need to be deleted by Lambda before AWS CloudFormation can delete the VPC\'s resources.\\n> \\n> To monitor network interfaces, AWS CloudFormation needs the `ec2:DescribeNetworkInterfaces` permission. It obtains this from the user or role that modifies the stack. If you don\'t provide this permission, AWS CloudFormation does not wait for network interfaces to be deleted.","properties":{"SecurityGroupIds":"A list of VPC security group IDs.","SubnetIds":"A list of VPC subnet IDs."}},"AWS::Lambda::LayerVersion":{"attributes":{"LayerVersionArn":"","Ref":"`Ref` returns the ARN of the layer version, such as `arn:aws:lambda:us-west-2:123456789012:layer:my-layer:1` ."},"description":"The `AWS::Lambda::LayerVersion` resource creates a [Lambda layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) from a ZIP archive.","properties":{"CompatibleArchitectures":"A list of compatible [instruction set architectures](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html) .","CompatibleRuntimes":"A list of compatible [function runtimes](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html) . Used for filtering with [ListLayers](https://docs.aws.amazon.com/lambda/latest/dg/API_ListLayers.html) and [ListLayerVersions](https://docs.aws.amazon.com/lambda/latest/dg/API_ListLayerVersions.html) .","Content":"The function layer archive.","Description":"The description of the version.","LayerName":"The name or Amazon Resource Name (ARN) of the layer.","LicenseInfo":"The layer\'s software license. It can be any of the following:\\n\\n- An [SPDX license identifier](https://docs.aws.amazon.com/https://spdx.org/licenses/) . For example, `MIT` .\\n- The URL of a license hosted on the internet. For example, `https://opensource.org/licenses/MIT` .\\n- The full text of the license."}},"AWS::Lambda::LayerVersion.Content":{"attributes":{},"description":"A ZIP archive that contains the contents of an [Lambda layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) .","properties":{"S3Bucket":"The Amazon S3 bucket of the layer archive.","S3Key":"The Amazon S3 key of the layer archive.","S3ObjectVersion":"For versioned objects, the version of the layer archive object to use."}},"AWS::Lambda::LayerVersionPermission":{"attributes":{"Ref":"`Ref` returns the layer version ARN and statement ID, such as `arn:aws:lambda:us-west-2:123456789012:layer:my-layer:1#engineering-org` ."},"description":"The `AWS::Lambda::LayerVersionPermission` resource adds permissions to the resource-based policy of a version of an [Lambda layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) . Use this action to grant layer usage permission to other accounts. You can grant permission to a single account, all AWS accounts, or all accounts in an organization.\\n\\n> Since the release of the [UpdateReplacePolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html) both `UpdateReplacePolicy` and `DeletionPolicy` are required to protect your Resources/LayerPermissions from deletion.","properties":{"Action":"The API action that grants access to the layer. For example, `lambda:GetLayerVersion` .","LayerVersionArn":"The name or Amazon Resource Name (ARN) of the layer.","OrganizationId":"With the principal set to `*` , grant permission to all accounts in the specified organization.","Principal":"An account ID, or `*` to grant layer usage permission to all accounts in an organization, or all AWS accounts (if `organizationId` is not specified). For the last case, make sure that you really do want all AWS accounts to have usage permission to this layer."}},"AWS::Lambda::Permission":{"attributes":{},"description":"The `AWS::Lambda::Permission` resource grants an AWS service or another account permission to use a function. You can apply the policy at the function level, or specify a qualifier to restrict access to a single version or alias. If you use a qualifier, the invoker must use the full Amazon Resource Name (ARN) of that version or alias to invoke the function.\\n\\nTo grant permission to another account, specify the account ID as the `Principal` . To grant permission to an organization defined in AWS Organizations , specify the organization ID as the `PrincipalOrgID` . For AWS services, the principal is a domain-style identifier defined by the service, like `s3.amazonaws.com` or `sns.amazonaws.com` . For AWS services, you can also specify the ARN of the associated resource as the `SourceArn` . If you grant permission to a service principal without specifying the source, other accounts could potentially configure resources in their account to invoke your Lambda function.\\n\\nIf your function has a function URL, you can specify the `FunctionUrlAuthType` parameter. This adds a condition to your permission that only applies when your function URL\'s `AuthType` matches the specified `FunctionUrlAuthType` . For more information about the `AuthType` parameter, see [Security and auth model for Lambda function URLs](https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html) .\\n\\nThis resource adds a statement to a resource-based permission policy for the function. For more information about function policies, see [Lambda Function Policies](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html) .","properties":{"Action":"The action that the principal can use on the function. For example, `lambda:InvokeFunction` or `lambda:GetFunction` .","EventSourceToken":"For Alexa Smart Home functions, a token that the invoker must supply.","FunctionName":"The name of the Lambda function, version, or alias.\\n\\n**Name formats** - *Function name* – `my-function` (name-only), `my-function:v1` (with alias).\\n- *Function ARN* – `arn:aws:lambda:us-west-2:123456789012:function:my-function` .\\n- *Partial ARN* – `123456789012:function:my-function` .\\n\\nYou can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.","FunctionUrlAuthType":"The type of authentication that your function URL uses. Set to `AWS_IAM` if you want to restrict access to authenticated users only. Set to `NONE` if you want to bypass IAM authentication to create a public endpoint. For more information, see [Security and auth model for Lambda function URLs](https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html) .","Principal":"The AWS service or AWS account that invokes the function. If you specify a service, use `SourceArn` or `SourceAccount` to limit who can invoke the function through that service.","PrincipalOrgID":"The identifier for your organization in AWS Organizations . Use this to grant permissions to all the AWS accounts under this organization.","SourceAccount":"For AWS service , the ID of the AWS account that owns the resource. Use this together with `SourceArn` to ensure that the specified account owns the resource. It is possible for an Amazon S3 bucket to be deleted by its owner and recreated by another account.","SourceArn":"For AWS services , the ARN of the AWS resource that invokes the function. For example, an Amazon S3 bucket or Amazon SNS topic.\\n\\nNote that Lambda configures the comparison using the `StringLike` operator."}},"AWS::Lambda::Url":{"attributes":{"FunctionArn":"The Amazon Resource Name (ARN) of the function.","FunctionUrl":"The HTTP URL endpoint for your function.","Ref":"`Ref` returns the resource name."},"description":"The `AWS::Lambda::Url` resource creates a function URL with the specified configuration parameters. A [function URL](https://docs.aws.amazon.com/lambda/latest/dg/lambda-urls.html) is a dedicated HTTP(S) endpoint that you can use to invoke your function.","properties":{"AuthType":"The type of authentication that your function URL uses. Set to `AWS_IAM` if you want to restrict access to authenticated users only. Set to `NONE` if you want to bypass IAM authentication to create a public endpoint. For more information, see [Security and auth model for Lambda function URLs](https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html) .","Cors":"The [Cross-Origin Resource Sharing (CORS)](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) settings for your function URL.","InvokeMode":"Use one of the following options:\\n\\n- `BUFFERED` – This is the default option. Lambda invokes your function using the `Invoke` API operation. Invocation results are available when the payload is complete. The maximum payload size is 6 MB.\\n- `RESPONSE_STREAM` – Your function streams payload results as they become available. Lambda invokes your function using the `InvokeWithResponseStream` API operation. The maximum response payload size is 20 MB, however, you can [request a quota increase](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html) .","Qualifier":"The alias name.","TargetFunctionArn":"The name of the Lambda function.\\n\\n**Name formats** - *Function name* - `my-function` .\\n- *Function ARN* - `arn:aws:lambda:us-west-2:123456789012:function:my-function` .\\n- *Partial ARN* - `123456789012:function:my-function` .\\n\\nThe length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length."}},"AWS::Lambda::Url.Cors":{"attributes":{},"description":"The [Cross-Origin Resource Sharing (CORS)](https://docs.aws.amazon.com/https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) settings for your function URL. Use CORS to grant access to your function URL from any origin. You can also use CORS to control access for specific HTTP headers and methods in requests to your function URL.","properties":{"AllowCredentials":"Whether you want to allow cookies or other credentials in requests to your function URL. The default is `false` .","AllowHeaders":"The HTTP headers that origins can include in requests to your function URL. For example: `Date` , `Keep-Alive` , `X-Custom-Header` .","AllowMethods":"The HTTP methods that are allowed when calling your function URL. For example: `GET` , `POST` , `DELETE` , or the wildcard character ( `*` ).","AllowOrigins":"The origins that can access your function URL. You can list any number of specific origins, separated by a comma. For example: `https://www.example.com` , `http://localhost:60905` .\\n\\nAlternatively, you can grant access to all origins with the wildcard character ( `*` ).","ExposeHeaders":"The HTTP headers in your function response that you want to expose to origins that call your function URL. For example: `Date` , `Keep-Alive` , `X-Custom-Header` .","MaxAge":"The maximum amount of time, in seconds, that browsers can cache results of a preflight request. By default, this is set to `0` , which means the browser will not cache results."}},"AWS::Lambda::Version":{"attributes":{"Ref":"`Ref` returns the ARN of the version, such as `arn:aws:lambda:us-west-2:123456789012:function:helloworld:1` .","Version":"The version number."},"description":"The `AWS::Lambda::Version` resource creates a [version](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html) from the current code and configuration of a function. Use versions to create a snapshot of your function code and configuration that doesn\'t change.","properties":{"CodeSha256":"Only publish a version if the hash value matches the value that\'s specified. Use this option to avoid publishing a version if the function code has changed since you last updated it. Updates are not supported for this property.","Description":"A description for the version to override the description in the function configuration. Updates are not supported for this property.","FunctionName":"The name of the Lambda function.\\n\\n**Name formats** - *Function name* - `MyFunction` .\\n- *Function ARN* - `arn:aws:lambda:us-west-2:123456789012:function:MyFunction` .\\n- *Partial ARN* - `123456789012:function:MyFunction` .\\n\\nThe length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.","ProvisionedConcurrencyConfig":"Specifies a provisioned concurrency configuration for a function\'s version. Updates are not supported for this property."}},"AWS::Lambda::Version.ProvisionedConcurrencyConfiguration":{"attributes":{},"description":"A [provisioned concurrency](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html) configuration for a function\'s version.","properties":{"ProvisionedConcurrentExecutions":"The amount of provisioned concurrency to allocate for the version."}},"AWS::Lex::Bot":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the bot.","Id":"The unique identifier of the bot."},"description":"> Amazon Lex V2 is the only supported version in AWS CloudFormation . \\n\\nSpecifies an Amazon Lex conversational bot.\\n\\nYou must configure an intent based on the `AMAZON.FallbackIntent` built-in intent. If you don\'t add one, creating the bot will fail.","properties":{"AutoBuildBotLocales":"Indicates whether Amazon Lex V2 should automatically build the locales for the bot after a change.","BotFileS3Location":"The Amazon S3 location of files used to import a bot. The files must be in the import format specified in [JSON format for importing and exporting](https://docs.aws.amazon.com/lexv2/latest/dg/import-export-format.html) in the *Amazon Lex developer guide.*","BotLocales":"A list of locales for the bot.","BotTags":"A list of tags to add to the bot. You can only add tags when you import a bot. You can\'t use the `UpdateBot` operation to update tags. To update tags, use the `TagResource` operation.","DataPrivacy":"By default, data stored by Amazon Lex is encrypted. The `DataPrivacy` structure provides settings that determine how Amazon Lex handles special cases of securing the data for your bot.","Description":"The description of the version.","IdleSessionTTLInSeconds":"The time, in seconds, that Amazon Lex should keep information about a user\'s conversation with the bot.\\n\\nA user interaction remains active for the amount of time specified. If no conversation occurs during this time, the session expires and Amazon Lex deletes any data provided before the timeout.\\n\\nYou can specify between 60 (1 minute) and 86,400 (24 hours) seconds.","Name":"The name of the bot locale.","RoleArn":"The Amazon Resource Name (ARN) of the IAM role used to build and run the bot.","TestBotAliasSettings":"Specifies configuration settings for the alias used to test the bot. If the `TestBotAliasSettings` property is not specified, the settings are configured with default values.","TestBotAliasTags":"A list of tags to add to the test alias for a bot. You can only add tags when you import a bot. You can\'t use the `UpdateAlias` operation to update tags. To update tags on the test alias, use the `TagResource` operation."}},"AWS::Lex::Bot.AdvancedRecognitionSetting":{"attributes":{},"description":"Provides settings that enable advanced recognition settings for slot values.","properties":{"AudioRecognitionStrategy":"Enables using the slot values as a custom vocabulary for recognizing user utterances."}},"AWS::Lex::Bot.AllowedInputTypes":{"attributes":{},"description":"Specifies the allowed input types.","properties":{"AllowAudioInput":"Indicates whether audio input is allowed.","AllowDTMFInput":"Indicates whether DTMF input is allowed."}},"AWS::Lex::Bot.AudioAndDTMFInputSpecification":{"attributes":{},"description":"Specifies the audio and DTMF input specification.","properties":{"AudioSpecification":"Specifies the settings on audio input.","DTMFSpecification":"Specifies the settings on DTMF input.","StartTimeoutMs":"Time for which a bot waits before assuming that the customer isn\'t going to speak or press a key. This timeout is shared between Audio and DTMF inputs."}},"AWS::Lex::Bot.AudioLogDestination":{"attributes":{},"description":"The location of audio log files collected when conversation logging is enabled for a bot.","properties":{"S3Bucket":"Specifies the Amazon S3 bucket where the audio files are stored."}},"AWS::Lex::Bot.AudioLogSetting":{"attributes":{},"description":"Settings for logging audio of conversations between Amazon Lex and a user. You specify whether to log audio and the Amazon S3 bucket where the audio file is stored.","properties":{"Destination":"Specifies the location of the audio log files collected when conversation logging is enabled for a bot.","Enabled":"Determines whether audio logging in enabled for the bot."}},"AWS::Lex::Bot.AudioSpecification":{"attributes":{},"description":"Specifies the audio input specifications.","properties":{"EndTimeoutMs":"Time for which a bot waits after the customer stops speaking to assume the utterance is finished.","MaxLengthMs":"Time for how long Amazon Lex waits before speech input is truncated and the speech is returned to application."}},"AWS::Lex::Bot.BotAliasLocaleSettings":{"attributes":{},"description":"Specifies settings that are unique to a locale. For example, you can use different Lambda function depending on the bot\'s locale.","properties":{"CodeHookSpecification":"Specifies the Lambda function that should be used in the locale.","Enabled":"Determines whether the locale is enabled for the bot. If the value is `false` , the locale isn\'t available for use."}},"AWS::Lex::Bot.BotAliasLocaleSettingsItem":{"attributes":{},"description":"Specifies locale settings for a single locale.","properties":{"BotAliasLocaleSetting":"Specifies locale settings for a locale.","LocaleId":"Specifies the locale that the settings apply to."}},"AWS::Lex::Bot.BotLocale":{"attributes":{},"description":"Provides configuration information for a locale.","properties":{"CustomVocabulary":"Specifies a custom vocabulary to use with a specific locale.","Description":"A description of the bot locale. Use this to help identify the bot locale in lists.","Intents":"One or more intents defined for the locale.","LocaleId":"The identifier of the language and locale that the bot will be used in. The string must match one of the supported locales.","NluConfidenceThreshold":"Determines the threshold where Amazon Lex will insert the `AMAZON.FallbackIntent` , `AMAZON.KendraSearchIntent` , or both when returning alternative intents. You must configure an `AMAZON.FallbackIntent` . `AMAZON.KendraSearchIntent` is only inserted if it is configured for the bot.","SlotTypes":"One or more slot types defined for the locale.","VoiceSettings":"Defines settings for using an Amazon Polly voice to communicate with a user."}},"AWS::Lex::Bot.Button":{"attributes":{},"description":"Describes a button to use on a response card used to gather slot values from a user.","properties":{"Text":"The text that appears on the button. Use this to tell the user what value is returned when they choose this button.","Value":"The value returned to Amazon Lex when the user chooses this button. This must be one of the slot values configured for the slot."}},"AWS::Lex::Bot.CloudWatchLogGroupLogDestination":{"attributes":{},"description":"The Amazon CloudWatch Logs log group where the text and metadata logs are delivered. The log group must exist before you enable logging.","properties":{"CloudWatchLogGroupArn":"The Amazon Resource Name (ARN) of the log group where text and metadata logs are delivered.","LogPrefix":"The prefix of the log stream name within the log group that you specified"}},"AWS::Lex::Bot.CodeHookSpecification":{"attributes":{},"description":"Contains information about code hooks that Amazon Lex calls during a conversation.","properties":{"LambdaCodeHook":"Specifies a Lambda function that verifies requests to a bot or fulfills the user\'s request to a bot."}},"AWS::Lex::Bot.Condition":{"attributes":{},"description":"Provides an expression that evaluates to true or false.","properties":{"ExpressionString":"The expression string that is evaluated."}},"AWS::Lex::Bot.ConditionalBranch":{"attributes":{},"description":"A set of actions that Amazon Lex should run if the condition is matched.","properties":{"Condition":"Contains the expression to evaluate. If the condition is true, the branch\'s actions are taken.","Name":"The name of the branch.","NextStep":"The next step in the conversation.","Response":"Specifies a list of message groups that Amazon Lex uses to respond the user input."}},"AWS::Lex::Bot.ConditionalSpecification":{"attributes":{},"description":"Provides a list of conditional branches. Branches are evaluated in the order that they are entered in the list. The first branch with a condition that evaluates to true is executed. The last branch in the list is the default branch. The default branch should not have any condition expression. The default branch is executed if no other branch has a matching condition.","properties":{"ConditionalBranches":"A list of conditional branches. A conditional branch is made up of a condition, a response and a next step. The response and next step are executed when the condition is true.","DefaultBranch":"The conditional branch that should be followed when the conditions for other branches are not satisfied. A conditional branch is made up of a condition, a response and a next step.","IsActive":"Determines whether a conditional branch is active. When `IsActive` is false, the conditions are not evaluated."}},"AWS::Lex::Bot.ConversationLogSettings":{"attributes":{},"description":"Configures conversation logging that saves audio, text, and metadata for the conversations with your users.","properties":{"AudioLogSettings":"The Amazon S3 settings for logging audio to an S3 bucket.","TextLogSettings":"The Amazon CloudWatch Logs settings for logging text and metadata."}},"AWS::Lex::Bot.CustomPayload":{"attributes":{},"description":"A custom response string that Amazon Lex sends to your application. You define the content and structure the string.","properties":{"Value":"The string that is sent to your application."}},"AWS::Lex::Bot.CustomVocabulary":{"attributes":{},"description":"Specifies a custom vocabulary. A custom vocabulary is a list of words that you expect to be used during a conversation with your bot.","properties":{"CustomVocabularyItems":"Specifies a list of words that you expect to be used during a conversation with your bot."}},"AWS::Lex::Bot.CustomVocabularyItem":{"attributes":{},"description":"Specifies an entry in a custom vocabulary.","properties":{"DisplayAs":"The DisplayAs value for the custom vocabulary item from the custom vocabulary list.","Phrase":"Specifies 1 - 4 words that should be recognized.","Weight":"Specifies the degree to which the phrase recognition is boosted. The default value is 1."}},"AWS::Lex::Bot.DTMFSpecification":{"attributes":{},"description":"Specifies the DTMF input specifications.","properties":{"DeletionCharacter":"The DTMF character that clears the accumulated DTMF digits and immediately ends the input.","EndCharacter":"The DTMF character that immediately ends input. If the user does not press this character, the input ends after the end timeout.","EndTimeoutMs":"How long the bot should wait after the last DTMF character input before assuming that the input has concluded.","MaxLength":"The maximum number of DTMF digits allowed in an utterance."}},"AWS::Lex::Bot.DataPrivacy":{"attributes":{},"description":"By default, data stored by Amazon Lex is encrypted. The `DataPrivacy` structure provides settings that determine how Amazon Lex handles special cases of securing the data for your bot.","properties":{"ChildDirected":"For each Amazon Lex bot created with the Amazon Lex Model Building Service, you must specify whether your use of Amazon Lex is related to a website, program, or other application that is directed or targeted, in whole or in part, to children under age 13 and subject to the Children\'s Online Privacy Protection Act (COPPA) by specifying `true` or `false` in the `childDirected` field. By specifying `true` in the `childDirected` field, you confirm that your use of Amazon Lex *is* related to a website, program, or other application that is directed or targeted, in whole or in part, to children under age 13 and subject to COPPA. By specifying `false` in the `childDirected` field, you confirm that your use of Amazon Lex *is not* related to a website, program, or other application that is directed or targeted, in whole or in part, to children under age 13 and subject to COPPA. You may not specify a default value for the `childDirected` field that does not accurately reflect whether your use of Amazon Lex is related to a website, program, or other application that is directed or targeted, in whole or in part, to children under age 13 and subject to COPPA. If your use of Amazon Lex relates to a website, program, or other application that is directed in whole or in part, to children under age 13, you must obtain any required verifiable parental consent under COPPA. For information regarding the use of Amazon Lex in connection with websites, programs, or other applications that are directed or targeted, in whole or in part, to children under age 13, see the [Amazon Lex FAQ](https://docs.aws.amazon.com/lex/faqs#data-security) ."}},"AWS::Lex::Bot.DefaultConditionalBranch":{"attributes":{},"description":"A set of actions that Amazon Lex should run if none of the other conditions are met.","properties":{"NextStep":"The next step in the conversation.","Response":"Specifies a list of message groups that Amazon Lex uses to respond the user input."}},"AWS::Lex::Bot.DialogAction":{"attributes":{},"description":"Defines the action that the bot executes at runtime when the conversation reaches this step.","properties":{"SlotToElicit":"If the dialog action is `ElicitSlot` , defines the slot to elicit from the user.","SuppressNextMessage":"When true the next message for the intent is not used.","Type":"The action that the bot should execute."}},"AWS::Lex::Bot.DialogCodeHookInvocationSetting":{"attributes":{},"description":"Settings that specify the dialog code hook that is called by Amazon Lex at a step of the conversation.","properties":{"EnableCodeHookInvocation":"Indicates whether a Lambda function should be invoked for the dialog.","InvocationLabel":"A label that indicates the dialog step from which the dialog code hook is happening.","IsActive":"Determines whether a dialog code hook is used when the intent is activated.","PostCodeHookSpecification":"Contains the responses and actions that Amazon Lex takes after the Lambda function is complete."}},"AWS::Lex::Bot.DialogCodeHookSetting":{"attributes":{},"description":"Settings that determine the Lambda function that Amazon Lex uses for processing user responses.","properties":{"Enabled":"Enables the dialog code hook so that it processes user requests."}},"AWS::Lex::Bot.DialogState":{"attributes":{},"description":"The current state of the conversation with the user.","properties":{"DialogAction":"Defines the action that the bot executes at runtime when the conversation reaches this step.","Intent":"Override settings to configure the intent state.","SessionAttributes":"Map of key/value pairs representing session-specific context information. It contains application information passed between Amazon Lex and a client application."}},"AWS::Lex::Bot.ElicitationCodeHookInvocationSetting":{"attributes":{},"description":"Settings that specify the dialog code hook that is called by Amazon Lex between eliciting slot values.","properties":{"EnableCodeHookInvocation":"Indicates whether a Lambda function should be invoked for the dialog.","InvocationLabel":"A label that indicates the dialog step from which the dialog code hook is happening."}},"AWS::Lex::Bot.ExternalSourceSetting":{"attributes":{},"description":"Provides information about the external source of the slot type\'s definition.","properties":{"GrammarSlotTypeSetting":"Settings required for a slot type based on a grammar that you provide."}},"AWS::Lex::Bot.FulfillmentCodeHookSetting":{"attributes":{},"description":"Determines if a Lambda function should be invoked for a specific intent.","properties":{"Enabled":"Indicates whether a Lambda function should be invoked to fulfill a specific intent.","FulfillmentUpdatesSpecification":"Provides settings for update messages sent to the user for long-running Lambda fulfillment functions. Fulfillment updates can be used only with streaming conversations.","IsActive":"Determines whether the fulfillment code hook is used. When `active` is false, the code hook doesn\'t run.","PostFulfillmentStatusSpecification":"Provides settings for messages sent to the user for after the Lambda fulfillment function completes. Post-fulfillment messages can be sent for both streaming and non-streaming conversations."}},"AWS::Lex::Bot.FulfillmentStartResponseSpecification":{"attributes":{},"description":"Provides settings for a message that is sent to the user when a fulfillment Lambda function starts running.","properties":{"AllowInterrupt":"Determines whether the user can interrupt the start message while it is playing.","DelayInSeconds":"The delay between when the Lambda fulfillment function starts running and the start message is played. If the Lambda function returns before the delay is over, the start message isn\'t played.","MessageGroups":"1 - 5 message groups that contain start messages. Amazon Lex chooses one of the messages to play to the user."}},"AWS::Lex::Bot.FulfillmentUpdateResponseSpecification":{"attributes":{},"description":"Provides settings for a message that is sent periodically to the user while a fulfillment Lambda function is running.","properties":{"AllowInterrupt":"Determines whether the user can interrupt an update message while it is playing.","FrequencyInSeconds":"The frequency that a message is sent to the user. When the period ends, Amazon Lex chooses a message from the message groups and plays it to the user. If the fulfillment Lambda returns before the first period ends, an update message is not played to the user.","MessageGroups":"1 - 5 message groups that contain update messages. Amazon Lex chooses one of the messages to play to the user."}},"AWS::Lex::Bot.FulfillmentUpdatesSpecification":{"attributes":{},"description":"Provides information for updating the user on the progress of fulfilling an intent.","properties":{"Active":"Determines whether fulfillment updates are sent to the user. When this field is true, updates are sent.\\n\\nIf the `active` field is set to true, the `startResponse` , `updateResponse` , and `timeoutInSeconds` fields are required.","StartResponse":"Provides configuration information for the message sent to users when the fulfillment Lambda functions starts running.","TimeoutInSeconds":"The length of time that the fulfillment Lambda function should run before it times out.","UpdateResponse":"Provides configuration information for messages sent periodically to the user while the fulfillment Lambda function is running."}},"AWS::Lex::Bot.GrammarSlotTypeSetting":{"attributes":{},"description":"Settings requried for a slot type based on a grammar that you provide.","properties":{"Source":"The source of the grammar used to create the slot type."}},"AWS::Lex::Bot.GrammarSlotTypeSource":{"attributes":{},"description":"Describes the Amazon S3 bucket name and location for the grammar that is the source for the slot type.","properties":{"KmsKeyArn":"The AWS KMS key required to decrypt the contents of the grammar, if any.","S3BucketName":"The name of the Amazon S3 bucket that contains the grammar source.","S3ObjectKey":"The path to the grammar in the Amazon S3 bucket."}},"AWS::Lex::Bot.ImageResponseCard":{"attributes":{},"description":"A card that is shown to the user by a messaging platform. You define the contents of the card, the card is displayed by the platform.\\n\\nWhen you use a response card, the response from the user is constrained to the text associated with a button on the card.","properties":{"Buttons":"A list of buttons that should be displayed on the response card. The arrangement of the buttons is determined by the platform that displays the button.","ImageUrl":"The URL of an image to display on the response card. The image URL must be publicly available so that the platform displaying the response card has access to the image.","Subtitle":"The subtitle to display on the response card. The format of the subtitle is determined by the platform displaying the response card.","Title":"The title to display on the response card. The format of the title is determined by the platform displaying the response card."}},"AWS::Lex::Bot.InitialResponseSetting":{"attributes":{},"description":"Configuration setting for a response sent to the user before Amazon Lex starts eliciting slots.","properties":{"CodeHook":"Settings that specify the dialog code hook that is called by Amazon Lex at a step of the conversation.","Conditional":"Provides a list of conditional branches. Branches are evaluated in the order that they are entered in the list. The first branch with a condition that evaluates to true is executed. The last branch in the list is the default branch. The default branch should not have any condition expression. The default branch is executed if no other branch has a matching condition.","InitialResponse":"Specifies a list of message groups that Amazon Lex uses to respond the user input.","NextStep":"The next step in the conversation."}},"AWS::Lex::Bot.InputContext":{"attributes":{},"description":"A context that must be active for an intent to be selected by Amazon Lex.","properties":{"Name":"The name of the context."}},"AWS::Lex::Bot.Intent":{"attributes":{},"description":"Represents an action that the user wants to perform.","properties":{"Description":"A description of the intent. Use the description to help identify the intent in lists.","DialogCodeHook":"Specifies that Amazon Lex invokes the alias Lambda function for each user input. You can invoke this Lambda function to personalize user interaction.","FulfillmentCodeHook":"Specifies that Amazon Lex invokes the alias Lambda function when the intent is ready for fulfillment. You can invoke this function to complete the bot\'s transaction with the user.","InitialResponseSetting":"Configuration setting for a response sent to the user before Amazon Lex starts eliciting slots.","InputContexts":"A list of contexts that must be active for this intent to be considered by Amazon Lex .","IntentClosingSetting":"Sets the response that Amazon Lex sends to the user when the intent is closed.","IntentConfirmationSetting":"Provides prompts that Amazon Lex sends to the user to confirm the completion of an intent. If the user answers \\"no,\\" the settings contain a statement that is sent to the user to end the intent.","KendraConfiguration":"Provides configuration information for the `AMAZON.KendraSearchIntent` intent. When you use this intent, Amazon Lex searches the specified Amazon Kendra index and returns documents from the index that match the user\'s utterance.","Name":"The name of the intent. Intent names must be unique within the locale that contains the intent and can\'t match the name of any built-in intent.","OutputContexts":"A list of contexts that the intent activates when it is fulfilled.","ParentIntentSignature":"A unique identifier for the built-in intent to base this intent on.","SampleUtterances":"A list of utterances that a user might say to signal the intent.","SlotPriorities":"Indicates the priority for slots. Amazon Lex prompts the user for slot values in priority order.","Slots":"A list of slots that the intent requires for fulfillment."}},"AWS::Lex::Bot.IntentClosingSetting":{"attributes":{},"description":"Provides a statement the Amazon Lex conveys to the user when the intent is successfully fulfilled.","properties":{"ClosingResponse":"The response that Amazon Lex sends to the user when the intent is complete.","Conditional":"A list of conditional branches associated with the intent\'s closing response. These branches are executed when the `nextStep` attribute is set to `EvalutateConditional` .","IsActive":"Specifies whether an intent\'s closing response is used. When this field is false, the closing response isn\'t sent to the user. If the `IsActive` field isn\'t specified, the default is true.","NextStep":"Specifies the next step that the bot executes after playing the intent\'s closing response."}},"AWS::Lex::Bot.IntentConfirmationSetting":{"attributes":{},"description":"Provides a prompt for making sure that the user is ready for the intent to be fulfilled.","properties":{"CodeHook":"The `DialogCodeHookInvocationSetting` object associated with intent\'s confirmation step. The dialog code hook is triggered based on these invocation settings when the confirmation next step or declination next step or failure next step is `InvokeDialogCodeHook` .","ConfirmationConditional":"A list of conditional branches to evaluate after the intent is closed.","ConfirmationNextStep":"Specifies the next step that the bot executes when the customer confirms the intent.","ConfirmationResponse":"Specifies a list of message groups that Amazon Lex uses to respond the user input.","DeclinationConditional":"A list of conditional branches to evaluate after the intent is declined.","DeclinationNextStep":"Specifies the next step that the bot executes when the customer declines the intent.","DeclinationResponse":"When the user answers \\"no\\" to the question defined in `promptSpecification` , Amazon Lex responds with this response to acknowledge that the intent was canceled.","ElicitationCodeHook":"The `DialogCodeHookInvocationSetting` used when the code hook is invoked during confirmation prompt retries.","FailureConditional":"Provides a list of conditional branches. Branches are evaluated in the order that they are entered in the list. The first branch with a condition that evaluates to true is executed. The last branch in the list is the default branch. The default branch should not have any condition expression. The default branch is executed if no other branch has a matching condition.","FailureNextStep":"The next step to take in the conversation if the confirmation step fails.","FailureResponse":"Specifies a list of message groups that Amazon Lex uses to respond the user input when the intent confirmation fails.","IsActive":"Specifies whether the intent\'s confirmation is sent to the user. When this field is false, confirmation and declination responses aren\'t sent. If the `IsActive` field isn\'t specified, the default is true.","PromptSpecification":"Prompts the user to confirm the intent. This question should have a yes or no answer.\\n\\nAmazon Lex uses this prompt to ensure that the user acknowledges that the intent is ready for fulfillment. For example, with the `OrderPizza` intent, you might want to confirm that the order is correct before placing it. For other intents, such as intents that simply respond to user questions, you might not need to ask the user for confirmation before providing the information."}},"AWS::Lex::Bot.IntentOverride":{"attributes":{},"description":"Override settings to configure the intent state.","properties":{"Name":"The name of the intent. Only required when you\'re switching intents.","Slots":"A map of all of the slot value overrides for the intent. The name of the slot maps to the value of the slot. Slots that are not included in the map aren\'t overridden."}},"AWS::Lex::Bot.KendraConfiguration":{"attributes":{},"description":"Provides configuration information for the `AMAZON.KendraSearchIntent` intent. When you use this intent, Amazon Lex searches the specified Amazon Kendra index and returns documents from the index that match the user\'s utterance.","properties":{"KendraIndex":"The Amazon Resource Name (ARN) of the Amazon Kendra index that you want the `AMAZON.KendraSearchIntent` intent to search. The index must be in the same account and Region as the Amazon Lex bot.","QueryFilterString":"A query filter that Amazon Lex sends to Amazon Kendra to filter the response from a query. The filter is in the format defined by Amazon Kendra. For more information, see [Filtering queries](https://docs.aws.amazon.com/kendra/latest/dg/filtering.html) .","QueryFilterStringEnabled":"Determines whether the `AMAZON.KendraSearchIntent` intent uses a custom query string to query the Amazon Kendra index."}},"AWS::Lex::Bot.LambdaCodeHook":{"attributes":{},"description":"Specifies a Lambda function that verifies requests to a bot or fulfills the user\'s request to a bot.","properties":{"CodeHookInterfaceVersion":"The version of the request-response that you want Amazon Lex to use to invoke your Lambda function.","LambdaArn":"The Amazon Resource Name (ARN) of the Lambda function."}},"AWS::Lex::Bot.Message":{"attributes":{},"description":"The object that provides message text and its type.","properties":{"CustomPayload":"A message in a custom format defined by the client application.","ImageResponseCard":"A message that defines a response card that the client application can show to the user.","PlainTextMessage":"A message in plain text format.","SSMLMessage":"A message in Speech Synthesis Markup Language (SSML)."}},"AWS::Lex::Bot.MessageGroup":{"attributes":{},"description":"Provides one or more messages that Amazon Lex should send to the user.","properties":{"Message":"The primary message that Amazon Lex should send to the user.","Variations":"Message variations to send to the user. When variations are defined, Amazon Lex chooses the primary message or one of the variations to send to the user."}},"AWS::Lex::Bot.MultipleValuesSetting":{"attributes":{},"description":"Indicates whether a slot can return multiple values.","properties":{"AllowMultipleValues":"Indicates whether a slot can return multiple values. When `true` , the slot may return more than one value in a response. When `false` , the slot returns only a single value.\\n\\nMulti-value slots are only available in the en-US locale. If you set this value to `true` in any other locale, Amazon Lex throws a `ValidationException` .\\n\\nIf the `allowMutlipleValues` is not set, the default value is `false` ."}},"AWS::Lex::Bot.ObfuscationSetting":{"attributes":{},"description":"Determines whether Amazon Lex obscures slot values in conversation logs.","properties":{"ObfuscationSettingType":"Value that determines whether Amazon Lex obscures slot values in conversation logs. The default is to obscure the values."}},"AWS::Lex::Bot.OutputContext":{"attributes":{},"description":"Describes a session context that is activated when an intent is fulfilled.","properties":{"Name":"The name of the output context.","TimeToLiveInSeconds":"The amount of time, in seconds, that the output context should remain active. The time is figured from the first time the context is sent to the user.","TurnsToLive":"The number of conversation turns that the output context should remain active. The number of turns is counted from the first time that the context is sent to the user."}},"AWS::Lex::Bot.PlainTextMessage":{"attributes":{},"description":"Defines an ASCII text message to send to the user.","properties":{"Value":"The message to send to the user."}},"AWS::Lex::Bot.PostDialogCodeHookInvocationSpecification":{"attributes":{},"description":"Specifies next steps to run after the dialog code hook finishes.","properties":{"FailureConditional":"A list of conditional branches to evaluate after the dialog code hook throws an exception or returns with the `State` field of the `Intent` object set to `Failed` .","FailureNextStep":"Specifies the next step the bot runs after the dialog code hook throws an exception or returns with the `State` field of the `Intent` object set to `Failed` .","FailureResponse":"Specifies a list of message groups that Amazon Lex uses to respond the user input when the code hook fails.","SuccessConditional":"A list of conditional branches to evaluate after the dialog code hook finishes successfully.","SuccessNextStep":"Specifics the next step the bot runs after the dialog code hook finishes successfully.","SuccessResponse":"Specifies a list of message groups that Amazon Lex uses to respond when the code hook succeeds.","TimeoutConditional":"A list of conditional branches to evaluate if the code hook times out.","TimeoutNextStep":"Specifies the next step that the bot runs when the code hook times out.","TimeoutResponse":"Specifies a list of message groups that Amazon Lex uses to respond to the user input when the code hook times out."}},"AWS::Lex::Bot.PostFulfillmentStatusSpecification":{"attributes":{},"description":"Provides a setting that determines whether the post-fulfillment response is sent to the user. For more information, see [](https://docs.aws.amazon.com/lexv2/latest/dg/streaming-progress.html#progress-complete)","properties":{"FailureConditional":"A list of conditional branches to evaluate after the fulfillment code hook throws an exception or returns with the `State` field of the `Intent` object set to `Failed` .","FailureNextStep":"Specifies the next step the bot runs after the fulfillment code hook throws an exception or returns with the `State` field of the `Intent` object set to `Failed` .","FailureResponse":"Specifies a list of message groups that Amazon Lex uses to respond when fulfillment isn\'t successful.","SuccessConditional":"A list of conditional branches to evaluate after the fulfillment code hook finishes successfully.","SuccessNextStep":"Specifies the next step in the conversation that Amazon Lex invokes when the fulfillment code hook completes successfully.","SuccessResponse":"Specifies a list of message groups that Amazon Lex uses to respond when the fulfillment is successful.","TimeoutConditional":"A list of conditional branches to evaluate if the fulfillment code hook times out.","TimeoutNextStep":"Specifies the next step that the bot runs when the fulfillment code hook times out.","TimeoutResponse":"Specifies a list of message groups that Amazon Lex uses to respond when fulfillment isn\'t completed within the timeout period."}},"AWS::Lex::Bot.PromptAttemptSpecification":{"attributes":{},"description":"Specifies the settings on a prompt attempt.","properties":{"AllowInterrupt":"Indicates whether the user can interrupt a speech prompt attempt from the bot.","AllowedInputTypes":"Indicates the allowed input types of the prompt attempt.","AudioAndDTMFInputSpecification":"Specifies the settings on audio and DTMF input.","TextInputSpecification":"Specifies the settings on text input."}},"AWS::Lex::Bot.PromptSpecification":{"attributes":{},"description":"Specifies a list of message groups that Amazon Lex sends to a user to elicit a response.","properties":{"AllowInterrupt":"Indicates whether the user can interrupt a speech prompt from the bot.","MaxRetries":"The maximum number of times the bot tries to elicit a response from the user using this prompt.","MessageGroupsList":"A collection of messages that Amazon Lex can send to the user. Amazon Lex chooses the actual message to send at runtime.","MessageSelectionStrategy":"Indicates how a message is selected from a message group among retries.","PromptAttemptsSpecification":"Specifies the advanced settings on each attempt of the prompt."}},"AWS::Lex::Bot.ResponseSpecification":{"attributes":{},"description":"Specifies a list of message groups that Amazon Lex uses to respond the user input.","properties":{"AllowInterrupt":"Indicates whether the user can interrupt a speech response from Amazon Lex.","MessageGroupsList":"A collection of responses that Amazon Lex can send to the user. Amazon Lex chooses the actual response to send at runtime."}},"AWS::Lex::Bot.S3BucketLogDestination":{"attributes":{},"description":"Specifies an Amazon S3 bucket for logging audio conversations","properties":{"KmsKeyArn":"The Amazon Resource Name (ARN) of an AWS Key Management Service (KMS) key for encrypting audio log files stored in an Amazon S3 bucket.","LogPrefix":"The S3 prefix to assign to audio log files.","S3BucketArn":"The Amazon Resource Name (ARN) of an Amazon S3 bucket where audio log files are stored."}},"AWS::Lex::Bot.S3Location":{"attributes":{},"description":"Defines an Amazon S3 bucket location.","properties":{"S3Bucket":"The S3 bucket name.","S3ObjectKey":"The path and file name to the object in the S3 bucket.","S3ObjectVersion":"The version of the object in the S3 bucket."}},"AWS::Lex::Bot.SSMLMessage":{"attributes":{},"description":"Defines a Speech Synthesis Markup Language (SSML) prompt.","properties":{"Value":"The SSML text that defines the prompt."}},"AWS::Lex::Bot.SampleUtterance":{"attributes":{},"description":"A sample utterance that invokes an intent or respond to a slot elicitation prompt.","properties":{"Utterance":"A sample utterance that invokes an intent or respond to a slot elicitation prompt."}},"AWS::Lex::Bot.SampleValue":{"attributes":{},"description":"Defines one of the values for a slot type.","properties":{"Value":"The value that can be used for a slot type."}},"AWS::Lex::Bot.SentimentAnalysisSettings":{"attributes":{},"description":"Determines whether Amazon Lex will use Amazon Comprehend to detect the sentiment of user utterances.","properties":{"DetectSentiment":"Sets whether Amazon Lex uses Amazon Comprehend to detect the sentiment of user utterances."}},"AWS::Lex::Bot.SessionAttribute":{"attributes":{},"description":"A key/value pair representing session-specific context information. It contains application information passed between Amazon Lex V2 and a client application.","properties":{"Key":"The name of the session attribute.","Value":"The session-specific context information for the session attribute."}},"AWS::Lex::Bot.Slot":{"attributes":{},"description":"Specifies the definition of a slot. Amazon Lex elicits slot values from uses to fulfill the user\'s intent.","properties":{"Description":"The description of the slot.","MultipleValuesSetting":"Indicates whether a slot can return multiple values.","Name":"The name given to the slot.","ObfuscationSetting":"Determines whether the contents of the slot are obfuscated in Amazon CloudWatch Logs logs. Use obfuscated slots to protect information such as personally identifiable information (PII) in logs.","SlotTypeName":"The name of the slot type that this slot is based on. The slot type defines the acceptable values for the slot.","ValueElicitationSetting":"Determines the slot resolution strategy that Amazon Lex uses to return slot type values. The field can be set to one of the following values:\\n\\n- ORIGINAL_VALUE - Returns the value entered by the user, if the user value is similar to a slot value.\\n- TOP_RESOLUTION - If there is a resolution list for the slot, return the first value in the resolution list as the slot type value. If there is no resolution list, null is returned.\\n\\nIf you don\'t specify the `valueSelectionStrategy` , the default is `ORIGINAL_VALUE` ."}},"AWS::Lex::Bot.SlotCaptureSetting":{"attributes":{},"description":"Settings used when Amazon Lex successfully captures a slot value from a user.","properties":{"CaptureConditional":"A list of conditional branches to evaluate after the slot value is captured.","CaptureNextStep":"Specifies the next step that the bot runs when the slot value is captured before the code hook times out.","CaptureResponse":"Specifies a list of message groups that Amazon Lex uses to respond the user input.","CodeHook":"Code hook called after Amazon Lex successfully captures a slot value.","ElicitationCodeHook":"Code hook called when Amazon Lex doesn\'t capture a slot value.","FailureConditional":"A list of conditional branches to evaluate when the slot value isn\'t captured.","FailureNextStep":"Specifies the next step that the bot runs when the slot value code is not recognized.","FailureResponse":"Specifies a list of message groups that Amazon Lex uses to respond the user input when the slot fails to be captured."}},"AWS::Lex::Bot.SlotDefaultValue":{"attributes":{},"description":"Specifies the default value to use when a user doesn\'t provide a value for a slot.","properties":{"DefaultValue":"The default value to use when a user doesn\'t provide a value for a slot."}},"AWS::Lex::Bot.SlotDefaultValueSpecification":{"attributes":{},"description":"The default value to use when a user doesn\'t provide a value for a slot.","properties":{"DefaultValueList":"A list of default values. Amazon Lex chooses the default value to use in the order that they are presented in the list."}},"AWS::Lex::Bot.SlotPriority":{"attributes":{},"description":"Sets the priority that Amazon Lex should use when eliciting slot values from a user.","properties":{"Priority":"The priority that Amazon Lex should apply to the slot.","SlotName":"The name of the slot."}},"AWS::Lex::Bot.SlotType":{"attributes":{},"description":"Describes a slot type.","properties":{"Description":"A description of the slot type. Use the description to help identify the slot type in lists.","ExternalSourceSetting":"Sets the type of external information used to create the slot type.","Name":"The name of the slot type. A slot type name must be unique withing the account.","ParentSlotTypeSignature":"The built-in slot type used as a parent of this slot type. When you define a parent slot type, the new slot type has the configuration of the parent lot type.\\n\\nOnly `AMAZON.AlphaNumeric` is supported.","SlotTypeValues":"A list of SlotTypeValue objects that defines the values that the slot type can take. Each value can have a list of synonyms, additional values that help train the machine learning model about the values that it resolves for the slot.","ValueSelectionSetting":"Determines the slot resolution strategy that Amazon Lex uses to return slot type values. The field can be set to one of the following values:\\n\\n- `ORIGINAL_VALUE` - Returns the value entered by the user, if the user value is similar to the slot value.\\n- `TOP_RESOLUTION` - If there is a resolution list for the slot, return the first value in the resolution list as the slot type value. If there is no resolution list, null is returned.\\n\\nIf you don\'t specify the `valueSelectionStrategy` , the default is `ORIGINAL_VALUE` ."}},"AWS::Lex::Bot.SlotTypeValue":{"attributes":{},"description":"Each slot type can have a set of values. Each `SlotTypeValue` represents a value that the slot type can take.","properties":{"SampleValue":"The value of the slot type entry.","Synonyms":"Additional values related to the slot type entry."}},"AWS::Lex::Bot.SlotValue":{"attributes":{},"description":"The value to set in a slot.","properties":{"InterpretedValue":"The value that Amazon Lex determines for the slot. The actual value depends on the setting of the value selection strategy for the bot. You can choose to use the value entered by the user, or you can have Amazon Lex choose the first value in the `resolvedValues` list."}},"AWS::Lex::Bot.SlotValueElicitationSetting":{"attributes":{},"description":"Specifies the elicitation setting details eliciting a slot.","properties":{"DefaultValueSpecification":"A list of default values for a slot. Default values are used when Amazon Lex hasn\'t determined a value for a slot. You can specify default values from context variables, session attributes, and defined values.","PromptSpecification":"The prompt that Amazon Lex uses to elicit the slot value from the user.","SampleUtterances":"If you know a specific pattern that users might respond to an Amazon Lex request for a slot value, you can provide those utterances to improve accuracy. This is optional. In most cases, Amazon Lex is capable of understanding user utterances.","SlotCaptureSetting":"Specifies the settings that Amazon Lex uses when a slot value is successfully entered by a user.","SlotConstraint":"Specifies whether the slot is required or optional.","WaitAndContinueSpecification":"Specifies the prompts that Amazon Lex uses while a bot is waiting for customer input."}},"AWS::Lex::Bot.SlotValueOverride":{"attributes":{},"description":"The slot values that Amazon Lex uses when it sets slot values in a dialog step.","properties":{"Shape":"When the shape value is `List` , it indicates that the `values` field contains a list of slot values. When the value is `Scalar` , it indicates that the `value` field contains a single value.","Value":"The current value of the slot.","Values":"A list of one or more values that the user provided for the slot. For example, for a slot that elicits pizza toppings, the values might be \\"pepperoni\\" and \\"pineapple.\\""}},"AWS::Lex::Bot.SlotValueOverrideMap":{"attributes":{},"description":"Maps a slot name to the [SlotValueOverride](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_SlotValueOverride.html) object.","properties":{"SlotName":"The name of the slot.","SlotValueOverride":"The SlotValueOverride object to which the slot name will be mapped."}},"AWS::Lex::Bot.SlotValueRegexFilter":{"attributes":{},"description":"Provides a regular expression used to validate the value of a slot.","properties":{"Pattern":"A regular expression used to validate the value of a slot.\\n\\nUse a standard regular expression. Amazon Lex supports the following characters in the regular expression:\\n\\n- A-Z, a-z\\n- 0-9\\n- Unicode characters (\\"\\\\⁠u\\")\\n\\nRepresent Unicode characters with four digits, for example \\"\\\\⁠u0041\\" or \\"\\\\⁠u005A\\".\\n\\nThe following regular expression operators are not supported:\\n\\n- Infinite repeaters: *, +, or {x,} with no upper bound.\\n- Wild card (.)"}},"AWS::Lex::Bot.SlotValueSelectionSetting":{"attributes":{},"description":"Contains settings used by Amazon Lex to select a slot value.","properties":{"AdvancedRecognitionSetting":"Provides settings that enable advanced recognition settings for slot values. You can use this to enable using slot values as a custom vocabulary for recognizing user utterances.","RegexFilter":"A regular expression used to validate the value of a slot.","ResolutionStrategy":"Determines the slot resolution strategy that Amazon Lex uses to return slot type values. The field can be set to one of the following values:\\n\\n- `ORIGINAL_VALUE` - Returns the value entered by the user, if the user value is similar to the slot value.\\n- `TOP_RESOLUTION` - If there is a resolution list for the slot, return the first value in the resolution list as the slot type value. If there is no resolution list, null is returned.\\n\\nIf you don\'t specify the `valueSelectionStrategy` , the default is `ORIGINAL_VALUE` ."}},"AWS::Lex::Bot.StillWaitingResponseSpecification":{"attributes":{},"description":"Defines the messages that Amazon Lex sends to a user to remind them that the bot is waiting for a response.","properties":{"AllowInterrupt":"Indicates that the user can interrupt the response by speaking while the message is being played.","FrequencyInSeconds":"How often a message should be sent to the user. Minimum of 1 second, maximum of 5 minutes.","MessageGroupsList":"One or more message groups, each containing one or more messages, that define the prompts that Amazon Lex sends to the user.","TimeoutInSeconds":"If Amazon Lex waits longer than this length of time for a response, it will stop sending messages."}},"AWS::Lex::Bot.TestBotAliasSettings":{"attributes":{},"description":"Specifies configuration settings for the alias used to test the bot. If the `TestBotAliasSettings` property is not specified, the settings are configured with default values.","properties":{"BotAliasLocaleSettings":"Specifies settings that are unique to a locale. For example, you can use a different Lambda function depending on the bot\'s locale.","ConversationLogSettings":"Specifies settings for conversation logs that save audio, text, and metadata information for conversations with your users.","Description":"Specifies a description for the test bot alias.","SentimentAnalysisSettings":"Specifies whether Amazon Lex will use Amazon Comprehend to detect the sentiment of user utterances."}},"AWS::Lex::Bot.TextInputSpecification":{"attributes":{},"description":"Specifies the text input specifications.","properties":{"StartTimeoutMs":"Time for which a bot waits before re-prompting a customer for text input."}},"AWS::Lex::Bot.TextLogDestination":{"attributes":{},"description":"Defines the Amazon CloudWatch Logs destination log group for conversation text logs.","properties":{"CloudWatch":"Defines the Amazon CloudWatch Logs log group where text and metadata logs are delivered."}},"AWS::Lex::Bot.TextLogSetting":{"attributes":{},"description":"Defines settings to enable text conversation logs.","properties":{"Destination":"Specifies the Amazon CloudWatch Logs destination log group for conversation text logs.","Enabled":"Determines whether conversation logs should be stored for an alias."}},"AWS::Lex::Bot.VoiceSettings":{"attributes":{},"description":"Defines settings for using an Amazon Polly voice to communicate with a user.","properties":{"Engine":"Indicates the type of Amazon Polly voice that Amazon Lex should use for voice interaction with the user. For more information, see the [`engine` parameter of the `SynthesizeSpeech` operation](https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html#polly-SynthesizeSpeech-request-Engine) in the *Amazon Polly developer guide* .\\n\\nIf you do not specify a value, the default is `standard` .","VoiceId":"The identifier of the Amazon Polly voice to use."}},"AWS::Lex::Bot.WaitAndContinueSpecification":{"attributes":{},"description":"Specifies the prompts that Amazon Lex uses while a bot is waiting for customer input.","properties":{"ContinueResponse":"The response that Amazon Lex sends to indicate that the bot is ready to continue the conversation.","IsActive":"Specifies whether the bot will wait for a user to respond. When this field is false, wait and continue responses for a slot aren\'t used. If the `IsActive` field isn\'t specified, the default is true.","StillWaitingResponse":"A response that Amazon Lex sends periodically to the user to indicate that the bot is still waiting for input from the user.","WaitingResponse":"The response that Amazon Lex sends to indicate that the bot is waiting for the conversation to continue."}},"AWS::Lex::BotAlias":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the bot alias.","BotAliasId":"The unique identifier of the bot alias.","BotAliasStatus":"The current status of the bot alias. When the status is Available the alias is ready for use with your bot."},"description":"> Amazon Lex V2 is the only supported version in AWS CloudFormation . \\n\\nSpecifies an alias for the specified version of a bot. Use an alias to enable you to change the version of a bot without updating applications that use the bot.\\n\\nFor example, you can specify an alias called \\"PROD\\" that your applications use to call the Amazon Lex bot.","properties":{"BotAliasLocaleSettings":"Specifies settings that are unique to a locale. For example, you can use different Lambda function depending on the bot\'s locale.","BotAliasName":"The name of the bot alias.","BotAliasTags":"An array of key-value pairs to apply to this resource.\\n\\nYou can only add tags when you specify an alias.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","BotId":"The unique identifier of the bot.","BotVersion":"The version of the bot that the bot alias references.","ConversationLogSettings":"Specifies whether Amazon Lex logs text and audio for conversations with the bot. When you enable conversation logs, text logs store text input, transcripts of audio input, and associated metadata in Amazon CloudWatch logs. Audio logs store input in Amazon S3 .","Description":"The description of the bot alias.","SentimentAnalysisSettings":"Determines whether Amazon Lex will use Amazon Comprehend to detect the sentiment of user utterances."}},"AWS::Lex::BotAlias.AudioLogDestination":{"attributes":{},"description":"Specifies the S3 bucket location where audio logs are stored.","properties":{"S3Bucket":"The S3 bucket location where audio logs are stored."}},"AWS::Lex::BotAlias.AudioLogSetting":{"attributes":{},"description":"Settings for logging audio of conversations between Amazon Lex and a user. You specify whether to log audio and the Amazon S3 bucket where the audio file is stored.","properties":{"Destination":"The location of audio log files collected when conversation logging is enabled for a bot.","Enabled":"Determines whether audio logging in enabled for the bot."}},"AWS::Lex::BotAlias.BotAliasLocaleSettings":{"attributes":{},"description":"Specifies settings that are unique to a locale. For example, you can use different Lambda function depending on the bot\'s locale.","properties":{"CodeHookSpecification":"Specifies the Lambda function that should be used in the locale.","Enabled":"Determines whether the locale is enabled for the bot. If the value is `false` , the locale isn\'t available for use."}},"AWS::Lex::BotAlias.BotAliasLocaleSettingsItem":{"attributes":{},"description":"Specifies settings that are unique to a locale. For example, you can use different Lambda function depending on the bot\'s locale.","properties":{"BotAliasLocaleSetting":"Specifies settings that are unique to a locale.","LocaleId":"The unique identifier of the locale."}},"AWS::Lex::BotAlias.CloudWatchLogGroupLogDestination":{"attributes":{},"description":"The Amazon CloudWatch Logs log group where the text and metadata logs are delivered. The log group must exist before you enable logging.","properties":{"CloudWatchLogGroupArn":"The Amazon Resource Name (ARN) of the log group where text and metadata logs are delivered.","LogPrefix":"The prefix of the log stream name within the log group that you specified"}},"AWS::Lex::BotAlias.CodeHookSpecification":{"attributes":{},"description":"Contains information about code hooks that Amazon Lex calls during a conversation.","properties":{"LambdaCodeHook":"Specifies a Lambda function that verifies requests to a bot or fulfills the user\'s request to a bot."}},"AWS::Lex::BotAlias.ConversationLogSettings":{"attributes":{},"description":"Configures conversation logging that saves audio, text, and metadata for the conversations with your users.","properties":{"AudioLogSettings":"The Amazon S3 settings for logging audio to an S3 bucket.","TextLogSettings":"The Amazon CloudWatch Logs settings for logging text and metadata."}},"AWS::Lex::BotAlias.LambdaCodeHook":{"attributes":{},"description":"Specifies a Lambda function that verifies requests to a bot or fulfills the user\'s request to a bot.","properties":{"CodeHookInterfaceVersion":"The version of the request-response that you want Amazon Lex to use to invoke your Lambda function.","LambdaArn":"The Amazon Resource Name (ARN) of the Lambda function."}},"AWS::Lex::BotAlias.S3BucketLogDestination":{"attributes":{},"description":"Specifies an Amazon S3 bucket for logging audio conversations","properties":{"KmsKeyArn":"The Amazon Resource Name (ARN) of an AWS Key Management Service (KMS) key for encrypting audio log files stored in an Amazon S3 bucket.","LogPrefix":"The S3 prefix to assign to audio log files.","S3BucketArn":"The Amazon Resource Name (ARN) of an Amazon S3 bucket where audio log files are stored."}},"AWS::Lex::BotAlias.SentimentAnalysisSettings":{"attributes":{},"description":"Determines whether Amazon Lex will use Amazon Comprehend to detect the sentiment of user utterances.","properties":{"DetectSentiment":"Sets whether Amazon Lex uses Amazon Comprehend to detect the sentiment of user utterances."}},"AWS::Lex::BotAlias.TextLogDestination":{"attributes":{},"description":"Defines the Amazon CloudWatch Logs destination log group for conversation text logs.","properties":{"CloudWatch":"Defines the Amazon CloudWatch Logs log group where text and metadata logs are delivered."}},"AWS::Lex::BotAlias.TextLogSetting":{"attributes":{},"description":"Defines settings to enable text conversation logs.","properties":{"Destination":"Defines the Amazon CloudWatch Logs destination log group for conversation text logs.","Enabled":"Determines whether conversation logs should be stored for an alias."}},"AWS::Lex::BotVersion":{"attributes":{"BotVersion":"The version of the bot."},"description":"> Amazon Lex V2 is the only supported version in AWS CloudFormation . \\n\\nSpecifies a new version of the bot based on the `DRAFT` version. If the `DRAFT` version of this resource hasn\'t changed since you created the last version, Amazon Lex doesn\'t create a new version, it returns the last created version.\\n\\nWhen you specify the first version of a bot, Amazon Lex sets the version to 1. Subsequent versions increment by 1.","properties":{"BotId":"The unique identifier of the bot.","BotVersionLocaleSpecification":"Specifies the locales that Amazon Lex adds to this version. You can choose the Draft version or any other previously published version for each locale. When you specify a source version, the locale data is copied from the source version to the new version.","Description":"The description of the version."}},"AWS::Lex::BotVersion.BotVersionLocaleDetails":{"attributes":{},"description":"The version of a bot used for a bot locale.","properties":{"SourceBotVersion":"The version of a bot used for a bot locale."}},"AWS::Lex::BotVersion.BotVersionLocaleSpecification":{"attributes":{},"description":"Specifies the locale that Amazon Lex adds to this version. You can choose the Draft version or any other previously published version for each locale. When you specify a source version, the locale data is copied from the source version to the new version.","properties":{"BotVersionLocaleDetails":"The version of a bot used for a bot locale.","LocaleId":"The identifier of the locale to add to the version."}},"AWS::Lex::ResourcePolicy":{"attributes":{"Id":"The identifier of the resource policy.","RevisionId":"Specifies the current revision of a resource policy."},"description":"> Amazon Lex V2 is the only supported version in AWS CloudFormation . \\n\\nSpecifies a new resource policy with the specified policy statements.","properties":{"Policy":"A resource policy to add to the resource. The policy is a JSON structure that contains one or more statements that define the policy. The policy must follow IAM syntax. If the policy isn\'t valid, Amazon Lex returns a validation exception.","ResourceArn":"The Amazon Resource Name (ARN) of the bot or bot alias that the resource policy is attached to."}},"AWS::LicenseManager::Grant":{"attributes":{"GrantArn":"The Amazon Resource Name (ARN) of the grant.","Ref":"`Ref` returns the ID of the grant.","Version":"The grant version."},"description":"Specifies a grant.\\n\\nA grant shares the use of license entitlements with specific AWS accounts . For more information, see [Granted licenses](https://docs.aws.amazon.com/license-manager/latest/userguide/granted-licenses.html) in the *AWS License Manager User Guide* .","properties":{"AllowedOperations":"Allowed operations for the grant.","GrantName":"Grant name.","HomeRegion":"Home Region of the grant.","LicenseArn":"License ARN.","Principals":"The grant principals. You can specify one of the following as an Amazon Resource Name (ARN):\\n\\n- An AWS account, which includes only the account specified.\\n\\n- An organizational unit (OU), which includes all accounts in the OU.\\n\\n- An organization, which will include all accounts across your organization.","Status":"Granted license status."}},"AWS::LicenseManager::License":{"attributes":{"LicenseArn":"The Amazon Resource Name (ARN) of the license.","Ref":"`Ref` returns the ID of the license.","Version":"The license version."},"description":"Specifies a granted license.\\n\\nGranted licenses are licenses for products that your organization purchased from AWS Marketplace or directly from a seller who integrated their software with managed entitlements. For more information, see [Granted licenses](https://docs.aws.amazon.com/license-manager/latest/userguide/granted-licenses.html) in the *AWS License Manager User Guide* .","properties":{"Beneficiary":"License beneficiary.","ConsumptionConfiguration":"Configuration for consumption of the license.","Entitlements":"License entitlements.","HomeRegion":"Home Region of the license.","Issuer":"License issuer.","LicenseMetadata":"License metadata.","LicenseName":"License name.","ProductName":"Product name.","ProductSKU":"Product SKU.","Status":"License status.","Validity":"Date and time range during which the license is valid, in ISO8601-UTC format."}},"AWS::LicenseManager::License.BorrowConfiguration":{"attributes":{},"description":"Details about a borrow configuration.","properties":{"AllowEarlyCheckIn":"Indicates whether early check-ins are allowed.","MaxTimeToLiveInMinutes":"Maximum time for the borrow configuration, in minutes."}},"AWS::LicenseManager::License.ConsumptionConfiguration":{"attributes":{},"description":"Details about a consumption configuration.","properties":{"BorrowConfiguration":"Details about a borrow configuration.","ProvisionalConfiguration":"Details about a provisional configuration.","RenewType":"Renewal frequency."}},"AWS::LicenseManager::License.Entitlement":{"attributes":{},"description":"Describes a resource entitled for use with a license.","properties":{"AllowCheckIn":"Indicates whether check-ins are allowed.","MaxCount":"Maximum entitlement count. Use if the unit is not None.","Name":"Entitlement name.","Overage":"Indicates whether overages are allowed.","Unit":"Entitlement unit.","Value":"Entitlement resource. Use only if the unit is None."}},"AWS::LicenseManager::License.IssuerData":{"attributes":{},"description":"Details associated with the issuer of a license.","properties":{"Name":"Issuer name.","SignKey":"Asymmetric KMS key from AWS Key Management Service . The KMS key must have a key usage of sign and verify, and support the RSASSA-PSS SHA-256 signing algorithm."}},"AWS::LicenseManager::License.Metadata":{"attributes":{},"description":"Describes key/value pairs.","properties":{"Name":"The key name.","Value":"The value."}},"AWS::LicenseManager::License.ProvisionalConfiguration":{"attributes":{},"description":"Details about a provisional configuration.","properties":{"MaxTimeToLiveInMinutes":"Maximum time for the provisional configuration, in minutes."}},"AWS::LicenseManager::License.ValidityDateFormat":{"attributes":{},"description":"Date and time range during which the license is valid, in ISO8601-UTC format.","properties":{"Begin":"Start of the time range.","End":"End of the time range."}},"AWS::Lightsail::Alarm":{"attributes":{"AlarmArn":"The Amazon Resource Name (ARN) of the alarm.","Ref":"","State":"The current state of the alarm.\\n\\nAn alarm has the following possible states:\\n\\n- `ALARM` - The metric is outside of the defined threshold.\\n- `INSUFFICIENT_DATA` - The alarm has recently started, the metric is not available, or not enough data is available for the metric to determine the alarm state.\\n- `OK` - The metric is within the defined threshold."},"description":"The `AWS::Lightsail::Alarm` resource specifies an alarm that can be used to monitor a single metric for one of your Lightsail resources.","properties":{"AlarmName":"The name of the alarm.","ComparisonOperator":"The arithmetic operation to use when comparing the specified statistic and threshold.","ContactProtocols":"The contact protocols for the alarm, such as `Email` , `SMS` (text messaging), or both.\\n\\n*Allowed Values* : `Email` | `SMS`","DatapointsToAlarm":"The number of data points within the evaluation periods that must be breaching to cause the alarm to go to the `ALARM` state.","EvaluationPeriods":"The number of periods over which data is compared to the specified threshold.","MetricName":"The name of the metric associated with the alarm.","MonitoredResourceName":"The name of the Lightsail resource that the alarm monitors.","NotificationEnabled":"A Boolean value indicating whether the alarm is enabled.","NotificationTriggers":"The alarm states that trigger a notification.\\n\\n> To specify the `OK` and `INSUFFICIENT_DATA` values, you must also specify `ContactProtocols` values. Otherwise, the `OK` and `INSUFFICIENT_DATA` values will not take effect and the stack will drift. \\n\\n*Allowed Values* : `OK` | `ALARM` | `INSUFFICIENT_DATA`","Threshold":"The value against which the specified statistic is compared.","TreatMissingData":"Specifies how the alarm handles missing data points.\\n\\nAn alarm can treat missing data in the following ways:\\n\\n- `breaching` - Assumes the missing data is not within the threshold. Missing data counts towards the number of times that the metric is not within the threshold.\\n- `notBreaching` - Assumes the missing data is within the threshold. Missing data does not count towards the number of times that the metric is not within the threshold.\\n- `ignore` - Ignores the missing data. Maintains the current alarm state.\\n- `missing` - Missing data is treated as missing."}},"AWS::Lightsail::Bucket":{"attributes":{"AbleToUpdateBundle":"A Boolean value indicating whether the bundle that is currently applied to your distribution can be changed to another bundle.","BucketArn":"The Amazon Resource Name (ARN) of the bucket.","Ref":"","Url":"The URL of the bucket."},"description":"The `AWS::Lightsail::Bucket` resource specifies a bucket.","properties":{"AccessRules":"An object that describes the access rules for the bucket.","BucketName":"The name of the bucket.","BundleId":"The bundle ID for the bucket (for example, `small_1_0` ).\\n\\nA bucket bundle specifies the monthly cost, storage space, and data transfer quota for a bucket.","ObjectVersioning":"Indicates whether object versioning is enabled for the bucket.\\n\\nThe following options can be configured:\\n\\n- `Enabled` - Object versioning is enabled.\\n- `Suspended` - Object versioning was previously enabled but is currently suspended. Existing object versions are retained.\\n- `NeverEnabled` - Object versioning has never been enabled.","ReadOnlyAccessAccounts":"An array of AWS account IDs that have read-only access to the bucket.","ResourcesReceivingAccess":"An array of Lightsail instances that have access to the bucket.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *AWS CloudFormation User Guide* .\\n\\n> The `Value` of `Tags` is optional for Lightsail resources."}},"AWS::Lightsail::Bucket.AccessRules":{"attributes":{},"description":"`AccessRules` is a property of the [AWS::Lightsail::Bucket](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-bucket.html) resource. It describes access rules for a bucket.","properties":{"AllowPublicOverrides":"A Boolean value indicating whether the access control list (ACL) permissions that are applied to individual objects override the `GetObject` option that is currently specified.\\n\\nWhen this is true, you can use the [PutObjectAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectAcl.html) Amazon S3 API operation to set individual objects to public (read-only) or private, using either the `public-read` ACL or the `private` ACL.","GetObject":"Specifies the anonymous access to all objects in a bucket.\\n\\nThe following options can be specified:\\n\\n- `public` - Sets all objects in the bucket to public (read-only), making them readable by everyone on the internet.\\n\\nIf the `GetObject` value is set to `public` , then all objects in the bucket default to public regardless of the `allowPublicOverrides` value.\\n- `private` - Sets all objects in the bucket to private, making them readable only by you and anyone that you grant access to.\\n\\nIf the `GetObject` value is set to `private` , and the `allowPublicOverrides` value is set to `true` , then all objects in the bucket default to private unless they are configured with a `public-read` ACL. Individual objects with a `public-read` ACL are readable by everyone on the internet."}},"AWS::Lightsail::Certificate":{"attributes":{"CertificateArn":"The Amazon Resource Name (ARN) of the certificate.","Ref":"","Status":"The validation status of the certificate."},"description":"The `AWS::Lightsail::Certificate` resource specifies an SSL/TLS certificate that you can use with a content delivery network (CDN) distribution and a container service.\\n\\n> For information about certificates that you can use with a load balancer, see [AWS::Lightsail::LoadBalancerTlsCertificate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancertlscertificate.html) .","properties":{"CertificateName":"The name of the certificate.","DomainName":"The domain name of the certificate.","SubjectAlternativeNames":"An array of strings that specify the alternate domains (such as `example.org` ) and subdomains (such as `blog.example.com` ) of the certificate.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *AWS CloudFormation User Guide* .\\n\\n> The `Value` of `Tags` is optional for Lightsail resources."}},"AWS::Lightsail::Container":{"attributes":{"ContainerArn":"The Amazon Resource Name (ARN) of the container.","Ref":"","Url":"The publicly accessible URL of the container service.\\n\\nIf no public endpoint is specified in the current deployment, this URL returns a 404 response."},"description":"The `AWS::Lightsail::Container` resource specifies a container service.\\n\\nA Lightsail container service is a compute resource to which you can deploy containers.","properties":{"ContainerServiceDeployment":"An object that describes the current container deployment of the container service.","IsDisabled":"A Boolean value indicating whether the container service is disabled.","Power":"The power specification of the container service.\\n\\nThe power specifies the amount of RAM, the number of vCPUs, and the base price of the container service.","PublicDomainNames":"The public domain name of the container service, such as `example.com` and `www.example.com` .\\n\\nYou can specify up to four public domain names for a container service. The domain names that you specify are used when you create a deployment with a container that is configured as the public endpoint of your container service.\\n\\nIf you don\'t specify public domain names, then you can use the default domain of the container service.\\n\\n> You must create and validate an SSL/TLS certificate before you can use public domain names with your container service. Use the [AWS::Lightsail::Certificate](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-certificate.html) resource to create a certificate for the public domain names that you want to use with your container service.","Scale":"The scale specification of the container service.\\n\\nThe scale specifies the allocated compute nodes of the container service.","ServiceName":"The name of the container service.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *AWS CloudFormation User Guide* .\\n\\n> The `Value` of `Tags` is optional for Lightsail resources."}},"AWS::Lightsail::Container.Container":{"attributes":{},"description":"`Container` is a property of the [ContainerServiceDeployment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-containerservicedeployment.html) property. It describes the settings of a container that will be launched, or that is launched, to an Amazon Lightsail container service.","properties":{"Command":"The launch command for the container.","ContainerName":"The name of the container.","Environment":"The environment variables of the container.","Image":"The name of the image used for the container.\\n\\nContainer images that are sourced from (registered and stored on) your container service start with a colon ( `:` ). For example, if your container service name is `container-service-1` , the container image label is `mystaticsite` , and you want to use the third version ( `3` ) of the registered container image, then you should specify `:container-service-1.mystaticsite.3` . To use the latest version of a container image, specify `latest` instead of a version number (for example, `:container-service-1.mystaticsite.latest` ). Your container service will automatically use the highest numbered version of the registered container image.\\n\\nContainer images that are sourced from a public registry like Docker Hub don’t start with a colon. For example, `nginx:latest` or `nginx` .","Ports":"An object that describes the open firewall ports and protocols of the container."}},"AWS::Lightsail::Container.ContainerServiceDeployment":{"attributes":{},"description":"`ContainerServiceDeployment` is a property of the [AWS::Lightsail::Container](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-container.html) resource. It describes a container deployment configuration of a container service.\\n\\nA deployment specifies the settings, such as the ports and launch command, of containers that are deployed to your container service.","properties":{"Containers":"An object that describes the configuration for the containers of the deployment.","PublicEndpoint":"An object that describes the endpoint of the deployment."}},"AWS::Lightsail::Container.EnvironmentVariable":{"attributes":{},"description":"`EnvironmentVariable` is a property of the [Container](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-container.html) property. It describes the environment variables of a container on a container service which are key-value parameters that provide dynamic configuration of the application or script run by the container.","properties":{"Value":"The environment variable value.","Variable":"The environment variable key."}},"AWS::Lightsail::Container.HealthCheckConfig":{"attributes":{},"description":"`HealthCheckConfig` is a property of the [PublicEndpoint](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-publicendpoint.html) property. It describes the healthcheck configuration of a container deployment on a container service.","properties":{"HealthyThreshold":"The number of consecutive health check successes required before moving the container to the `Healthy` state. The default value is `2` .","IntervalSeconds":"The approximate interval, in seconds, between health checks of an individual container. You can specify between `5` and `300` seconds. The default value is `5` .","Path":"The path on the container on which to perform the health check. The default value is `/` .","SuccessCodes":"The HTTP codes to use when checking for a successful response from a container. You can specify values between `200` and `499` . You can specify multiple values (for example, `200,202` ) or a range of values (for example, `200-299` ).","TimeoutSeconds":"The amount of time, in seconds, during which no response means a failed health check. You can specify between `2` and `60` seconds. The default value is `2` .","UnhealthyThreshold":"The number of consecutive health check failures required before moving the container to the `Unhealthy` state. The default value is `2` ."}},"AWS::Lightsail::Container.PortInfo":{"attributes":{},"description":"`PortInfo` is a property of the [Container](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-container.html) property. It describes the ports to open and the protocols to use for a container on a Amazon Lightsail container service.","properties":{"Port":"The open firewall ports of the container.","Protocol":"The protocol name for the open ports.\\n\\n*Allowed values* : `HTTP` | `HTTPS` | `TCP` | `UDP`"}},"AWS::Lightsail::Container.PublicDomainName":{"attributes":{},"description":"`PublicDomainName` is a property of the [AWS::Lightsail::Container](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-container.html) resource. It describes the public domain names to use with a container service, such as `example.com` and `www.example.com` . It also describes the certificates to use with a container service.","properties":{"CertificateName":"The name of the certificate for the public domains.","DomainNames":"The public domain names to use with the container service."}},"AWS::Lightsail::Container.PublicEndpoint":{"attributes":{},"description":"`PublicEndpoint` is a property of the [ContainerServiceDeployment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-containerservicedeployment.html) property. It describes describes the settings of the public endpoint of a container on a container service.","properties":{"ContainerName":"The name of the container entry of the deployment that the endpoint configuration applies to.","ContainerPort":"The port of the specified container to which traffic is forwarded to.","HealthCheckConfig":"An object that describes the health check configuration of the container."}},"AWS::Lightsail::Database":{"attributes":{"DatabaseArn":"The Amazon Resource Name (ARN) of the database (for example, `arn:aws:lightsail:us-east-2:123456789101:RelationalDatabase/244ad76f-8aad-4741-809f-12345EXAMPLE` ).","Ref":""},"description":"The `AWS::Lightsail::Database` resource specifies an Amazon Lightsail database.","properties":{"AvailabilityZone":"The Availability Zone for the database.","BackupRetention":"A Boolean value indicating whether automated backup retention is enabled for the database.","CaCertificateIdentifier":"The certificate associated with the database.","MasterDatabaseName":"The meaning of this parameter differs according to the database engine you use.\\n\\n*MySQL*\\n\\nThe name of the database to create when the Lightsail database resource is created. If this parameter isn\'t specified, no database is created in the database resource.\\n\\nConstraints:\\n\\n- Must contain 1-64 letters or numbers.\\n- Must begin with a letter. Subsequent characters can be letters, underscores, or numbers (0-9).\\n- Can\'t be a word reserved by the specified database engine.\\n\\nFor more information about reserved words in MySQL, see the Keywords and Reserved Words articles for [MySQL 5.6](https://docs.aws.amazon.com/https://dev.mysql.com/doc/refman/5.6/en/keywords.html) , [MySQL 5.7](https://docs.aws.amazon.com/https://dev.mysql.com/doc/refman/5.7/en/keywords.html) , and [MySQL 8.0](https://docs.aws.amazon.com/https://dev.mysql.com/doc/refman/8.0/en/keywords.html) .\\n\\n*PostgreSQL*\\n\\nThe name of the database to create when the Lightsail database resource is created. If this parameter isn\'t specified, a database named `postgres` is created in the database resource.\\n\\nConstraints:\\n\\n- Must contain 1-63 letters or numbers.\\n- Must begin with a letter. Subsequent characters can be letters, underscores, or numbers (0-9).\\n- Can\'t be a word reserved by the specified database engine.\\n\\nFor more information about reserved words in PostgreSQL, see the SQL Key Words articles for [PostgreSQL 9.6](https://docs.aws.amazon.com/https://www.postgresql.org/docs/9.6/sql-keywords-appendix.html) , [PostgreSQL 10](https://docs.aws.amazon.com/https://www.postgresql.org/docs/10/sql-keywords-appendix.html) , [PostgreSQL 11](https://docs.aws.amazon.com/https://www.postgresql.org/docs/11/sql-keywords-appendix.html) , and [PostgreSQL 12](https://docs.aws.amazon.com/https://www.postgresql.org/docs/12/sql-keywords-appendix.html) .","MasterUserPassword":"The password for the primary user of the database. The password can include any printable ASCII character except the following: /, \\", or @. It cannot contain spaces.\\n\\n> The `MasterUserPassword` and `RotateMasterUserPassword` parameters cannot be used together in the same template. \\n\\n*MySQL*\\n\\nConstraints: Must contain 8-41 characters.\\n\\n*PostgreSQL*\\n\\nConstraints: Must contain 8-128 characters.","MasterUsername":"The name for the primary user.\\n\\n*MySQL*\\n\\nConstraints:\\n\\n- Required for MySQL.\\n- Must be 1-16 letters or numbers. Can contain underscores.\\n- First character must be a letter.\\n- Can\'t be a reserved word for the chosen database engine.\\n\\nFor more information about reserved words in MySQL 5.6 or 5.7, see the Keywords and Reserved Words articles for [MySQL 5.6](https://docs.aws.amazon.com/https://dev.mysql.com/doc/refman/5.6/en/keywords.html) , [MySQL 5.7](https://docs.aws.amazon.com/https://dev.mysql.com/doc/refman/5.7/en/keywords.html) , or [MySQL 8.0](https://docs.aws.amazon.com/https://dev.mysql.com/doc/refman/8.0/en/keywords.html) .\\n\\n*PostgreSQL*\\n\\nConstraints:\\n\\n- Required for PostgreSQL.\\n- Must be 1-63 letters or numbers. Can contain underscores.\\n- First character must be a letter.\\n- Can\'t be a reserved word for the chosen database engine.\\n\\nFor more information about reserved words in MySQL 5.6 or 5.7, see the Keywords and Reserved Words articles for [PostgreSQL 9.6](https://docs.aws.amazon.com/https://www.postgresql.org/docs/9.6/sql-keywords-appendix.html) , [PostgreSQL 10](https://docs.aws.amazon.com/https://www.postgresql.org/docs/10/sql-keywords-appendix.html) , [PostgreSQL 11](https://docs.aws.amazon.com/https://www.postgresql.org/docs/11/sql-keywords-appendix.html) , and [PostgreSQL 12](https://docs.aws.amazon.com/https://www.postgresql.org/docs/12/sql-keywords-appendix.html) .","PreferredBackupWindow":"The daily time range during which automated backups are created for the database (for example, `16:00-16:30` ).","PreferredMaintenanceWindow":"The weekly time range during which system maintenance can occur for the database, formatted as follows: `ddd:hh24:mi-ddd:hh24:mi` . For example, `Tue:17:00-Tue:17:30` .","PubliclyAccessible":"A Boolean value indicating whether the database is accessible to anyone on the internet.","RelationalDatabaseBlueprintId":"The blueprint ID for the database (for example, `mysql_8_0` ).","RelationalDatabaseBundleId":"The bundle ID for the database (for example, `medium_1_0` ).","RelationalDatabaseName":"The name of the instance.","RelationalDatabaseParameters":"An array of parameters for the database.","RotateMasterUserPassword":"A Boolean value indicating whether to change the primary user password to a new, strong password generated by Lightsail .\\n\\n> The `RotateMasterUserPassword` and `MasterUserPassword` parameters cannot be used together in the same template.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *AWS CloudFormation User Guide* .\\n\\n> The `Value` of `Tags` is optional for Lightsail resources."}},"AWS::Lightsail::Database.RelationalDatabaseParameter":{"attributes":{},"description":"`RelationalDatabaseParameter` is a property of the [AWS::Lightsail::Database](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html) resource. It describes parameters for the database.","properties":{"AllowedValues":"The valid range of values for the parameter.","ApplyMethod":"Indicates when parameter updates are applied.\\n\\nCan be `immediate` or `pending-reboot` .","ApplyType":"Specifies the engine-specific parameter type.","DataType":"The valid data type of the parameter.","Description":"A description of the parameter.","IsModifiable":"A Boolean value indicating whether the parameter can be modified.","ParameterName":"The name of the parameter.","ParameterValue":"The value for the parameter."}},"AWS::Lightsail::Disk":{"attributes":{"AttachedTo":"The instance to which the disk is attached.","AttachmentState":"(Deprecated) The attachment state of the disk.\\n\\n> In releases prior to November 14, 2017, this parameter returned `attached` for system disks in the API response. It is now deprecated, but still included in the response. Use `isAttached` instead.","DiskArn":"The Amazon Resource Name (ARN) of the disk.","Iops":"The input/output operations per second (IOPS) of the disk.","IsAttached":"A Boolean value indicating whether the disk is attached to an instance.","Location.AvailabilityZone":"","Location.RegionName":"","Path":"The path of the disk.","Ref":"","ResourceType":"The resource type of the disk (for example, `Disk` ).","State":"The state of the disk (for example, `in-use` ).","SupportCode":"The support code of the disk.\\n\\nInclude this code in your email to support when you have questions about a disk or another resource in Lightsail . This code helps our support team to look up your Lightsail information."},"description":"The `AWS::Lightsail::Disk` resource specifies a disk that can be attached to an Amazon Lightsail instance that is in the same AWS Region and Availability Zone.","properties":{"AddOns":"An array of add-ons for the disk.\\n\\n> If the disk has an add-on enabled when performing a delete disk request, the add-on is automatically disabled before the disk is deleted.","AvailabilityZone":"The AWS Region and Availability Zone location for the disk (for example, `us-east-1a` ).","DiskName":"The name of the disk.","Location":"","SizeInGb":"The size of the disk in GB.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *AWS CloudFormation User Guide* .\\n\\n> The `Value` of `Tags` is optional for Lightsail resources."}},"AWS::Lightsail::Disk.AddOn":{"attributes":{},"description":"`AddOn` is a property of the [AWS::Lightsail::Disk](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-disk.html) resource. It describes the add-ons for a disk.","properties":{"AddOnType":"The add-on type (for example, `AutoSnapshot` ).\\n\\n> `AutoSnapshot` is the only add-on that can be enabled for a disk.","AutoSnapshotAddOnRequest":"The parameters for the automatic snapshot add-on, such as the daily time when an automatic snapshot will be created.","Status":"The status of the add-on.\\n\\nValid Values: `Enabled` | `Disabled`"}},"AWS::Lightsail::Disk.AutoSnapshotAddOn":{"attributes":{},"description":"`AutoSnapshotAddOn` is a property of the [AddOn](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-disk-addon.html) property. It describes the automatic snapshot add-on for a disk.","properties":{"SnapshotTimeOfDay":"The daily time when an automatic snapshot will be created.\\n\\nConstraints:\\n\\n- Must be in `HH:00` format, and in an hourly increment.\\n- Specified in Coordinated Universal Time (UTC).\\n- The snapshot will be automatically created between the time specified and up to 45 minutes after."}},"AWS::Lightsail::Disk.Location":{"attributes":{},"description":"","properties":{"AvailabilityZone":"","RegionName":""}},"AWS::Lightsail::Distribution":{"attributes":{"AbleToUpdateBundle":"Indicates whether you can update the distribution’s current bundle to another bundle.","DistributionArn":"The Amazon Resource Name (ARN) of the distribution.","Ref":"","Status":"The status of the distribution."},"description":"The `AWS::Lightsail::Distribution` resource specifies a content delivery network (CDN) distribution. You can create distributions only in the `us-east-1` AWS Region.\\n\\nA distribution is a globally distributed network of caching servers that improve the performance of your website or web application hosted on a Lightsail instance, static content hosted on a Lightsail bucket, or through a Lightsail load balancer.","properties":{"BundleId":"The ID of the bundle applied to the distribution.","CacheBehaviorSettings":"An object that describes the cache behavior settings of the distribution.","CacheBehaviors":"An array of objects that describe the per-path cache behavior of the distribution.","CertificateName":"The name of the SSL/TLS certificate attached to the distribution.","DefaultCacheBehavior":"An object that describes the default cache behavior of the distribution.","DistributionName":"The name of the distribution","IpAddressType":"The IP address type of the distribution.\\n\\nThe possible values are `ipv4` for IPv4 only, and `dualstack` for IPv4 and IPv6.","IsEnabled":"A Boolean value indicating whether the distribution is enabled.","Origin":"An object that describes the origin resource of the distribution, such as a Lightsail instance, bucket, or load balancer.\\n\\nThe distribution pulls, caches, and serves content from the origin.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *AWS CloudFormation User Guide* .\\n\\n> The `Value` of `Tags` is optional for Lightsail resources."}},"AWS::Lightsail::Distribution.CacheBehavior":{"attributes":{},"description":"`CacheBehavior` is a property of the [AWS::Lightsail::Distribution](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html) resource. It describes the default cache behavior of an Amazon Lightsail content delivery network (CDN) distribution.","properties":{"Behavior":"The cache behavior of the distribution.\\n\\nThe following cache behaviors can be specified:\\n\\n- *`cache`* - This option is best for static sites. When specified, your distribution caches and serves your entire website as static content. This behavior is ideal for websites with static content that doesn\'t change depending on who views it, or for websites that don\'t use cookies, headers, or query strings to personalize content.\\n- *`dont-cache`* - This option is best for sites that serve a mix of static and dynamic content. When specified, your distribution caches and serves only the content that is specified in the distribution’s `CacheBehaviorPerPath` parameter. This behavior is ideal for websites or web applications that use cookies, headers, and query strings to personalize content for individual users."}},"AWS::Lightsail::Distribution.CacheBehaviorPerPath":{"attributes":{},"description":"`CacheBehaviorPerPath` is a property of the [AWS::Lightsail::Distribution](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html) resource. It describes the per-path cache behavior of an Amazon Lightsail content delivery network (CDN) distribution.\\n\\nUse a per-path cache behavior to override the default cache behavior of a distribution, or to add an exception to it. For example, if you set the `CacheBehavior` to `cache` , you can use a per-path cache behavior to specify a directory, file, or file type that your distribution will cache. If you don’t want your distribution to cache a specified directory, file, or file type, set the per-path cache behavior to `dont-cache` .","properties":{"Behavior":"The cache behavior for the specified path.\\n\\nYou can specify one of the following per-path cache behaviors:\\n\\n- *`cache`* - This behavior caches the specified path.\\n- *`dont-cache`* - This behavior doesn\'t cache the specified path.","Path":"The path to a directory or file to cache, or not cache. Use an asterisk symbol to specify wildcard directories ( `path/to/assets/*` ), and file types ( `*.html` , `*jpg` , `*js` ). Directories and file paths are case-sensitive.\\n\\nExamples:\\n\\n- Specify the following to cache all files in the document root of an Apache web server running on a instance.\\n\\n`var/www/html/`\\n- Specify the following file to cache only the index page in the document root of an Apache web server.\\n\\n`var/www/html/index.html`\\n- Specify the following to cache only the .html files in the document root of an Apache web server.\\n\\n`var/www/html/*.html`\\n- Specify the following to cache only the .jpg, .png, and .gif files in the images sub-directory of the document root of an Apache web server.\\n\\n`var/www/html/images/*.jpg`\\n\\n`var/www/html/images/*.png`\\n\\n`var/www/html/images/*.gif`\\n\\nSpecify the following to cache all files in the images subdirectory of the document root of an Apache web server.\\n\\n`var/www/html/images/`"}},"AWS::Lightsail::Distribution.CacheSettings":{"attributes":{},"description":"`CacheSettings` is a property of the [AWS::Lightsail::Distribution](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html) resource. It describes the cache settings of an Amazon Lightsail content delivery network (CDN) distribution.\\n\\nThese settings apply only to your distribution’s `CacheBehaviors` that have a `Behavior` of `cache` . This includes the `DefaultCacheBehavior` .","properties":{"AllowedHTTPMethods":"The HTTP methods that are processed and forwarded to the distribution\'s origin.\\n\\nYou can specify the following options:\\n\\n- `GET,HEAD` - The distribution forwards the `GET` and `HEAD` methods.\\n- `GET,HEAD,OPTIONS` - The distribution forwards the `GET` , `HEAD` , and `OPTIONS` methods.\\n- `GET,HEAD,OPTIONS,PUT,PATCH,POST,DELETE` - The distribution forwards the `GET` , `HEAD` , `OPTIONS` , `PUT` , `PATCH` , `POST` , and `DELETE` methods.\\n\\nIf you specify `GET,HEAD,OPTIONS,PUT,PATCH,POST,DELETE` , you might need to restrict access to your distribution\'s origin so users can\'t perform operations that you don\'t want them to. For example, you might not want users to have permission to delete objects from your origin.","CachedHTTPMethods":"The HTTP method responses that are cached by your distribution.\\n\\nYou can specify the following options:\\n\\n- `GET,HEAD` - The distribution caches responses to the `GET` and `HEAD` methods.\\n- `GET,HEAD,OPTIONS` - The distribution caches responses to the `GET` , `HEAD` , and `OPTIONS` methods.","DefaultTTL":"The default amount of time that objects stay in the distribution\'s cache before the distribution forwards another request to the origin to determine whether the content has been updated.\\n\\n> The value specified applies only when the origin does not add HTTP headers such as `Cache-Control max-age` , `Cache-Control s-maxage` , and `Expires` to objects.","ForwardedCookies":"An object that describes the cookies that are forwarded to the origin. Your content is cached based on the cookies that are forwarded.","ForwardedHeaders":"An object that describes the headers that are forwarded to the origin. Your content is cached based on the headers that are forwarded.","ForwardedQueryStrings":"An object that describes the query strings that are forwarded to the origin. Your content is cached based on the query strings that are forwarded.","MaximumTTL":"The maximum amount of time that objects stay in the distribution\'s cache before the distribution forwards another request to the origin to determine whether the object has been updated.\\n\\nThe value specified applies only when the origin adds HTTP headers such as `Cache-Control max-age` , `Cache-Control s-maxage` , and `Expires` to objects.","MinimumTTL":"The minimum amount of time that objects stay in the distribution\'s cache before the distribution forwards another request to the origin to determine whether the object has been updated.\\n\\nA value of `0` must be specified for `minimumTTL` if the distribution is configured to forward all headers to the origin."}},"AWS::Lightsail::Distribution.CookieObject":{"attributes":{},"description":"`CookieObject` is a property of the [CacheSettings](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html) property. It describes whether an Amazon Lightsail content delivery network (CDN) distribution forwards cookies to the origin and, if so, which ones.\\n\\nFor the cookies that you specify, your distribution caches separate versions of the specified content based on the cookie values in viewer requests.","properties":{"CookiesAllowList":"The specific cookies to forward to your distribution\'s origin.","Option":"Specifies which cookies to forward to the distribution\'s origin for a cache behavior.\\n\\nUse one of the following configurations for your distribution:\\n\\n- *`all`* - Forwards all cookies to your origin.\\n- *`none`* - Doesn’t forward cookies to your origin.\\n- *`allow-list`* - Forwards only the cookies that you specify using the `CookiesAllowList` parameter."}},"AWS::Lightsail::Distribution.HeaderObject":{"attributes":{},"description":"`HeaderObject` is a property of the [CacheSettings](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html) property. It describes the request headers used by your distribution, which caches your content based on the request headers.\\n\\nFor the headers that you specify, your distribution caches separate versions of the specified content based on the header values in viewer requests. For example, suppose that viewer requests for logo.jpg contain a custom product header that has a value of either acme or apex. Also, suppose that you configure your distribution to cache your content based on values in the product header. Your distribution forwards the product header to the origin and caches the response from the origin once for each header value.","properties":{"HeadersAllowList":"The specific headers to forward to your distribution\'s origin.","Option":"The headers that you want your distribution to forward to your origin. Your distribution caches your content based on these headers.\\n\\nUse one of the following configurations for your distribution:\\n\\n- *`all`* - Forwards all headers to your origin..\\n- *`none`* - Forwards only the default headers.\\n- *`allow-list`* - Forwards only the headers that you specify using the `HeadersAllowList` parameter."}},"AWS::Lightsail::Distribution.InputOrigin":{"attributes":{},"description":"`InputOrigin` is a property of the [AWS::Lightsail::Distribution](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html) resource. It describes the origin resource of an Amazon Lightsail content delivery network (CDN) distribution.\\n\\nAn origin can be a instance, bucket, or load balancer. A distribution pulls content from an origin, caches it, and serves it to viewers through a worldwide network of edge servers.","properties":{"Name":"The name of the origin resource.","ProtocolPolicy":"The protocol that your Amazon Lightsail distribution uses when establishing a connection with your origin to pull content.","RegionName":"The AWS Region name of the origin resource."}},"AWS::Lightsail::Distribution.QueryStringObject":{"attributes":{},"description":"`QueryStringObject` is a property of the [CacheSettings](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html) property. It describes the query string parameters that an Amazon Lightsail content delivery network (CDN) distribution to bases caching on.\\n\\nFor the query strings that you specify, your distribution caches separate versions of the specified content based on the query string values in viewer requests.","properties":{"Option":"Indicates whether the distribution forwards and caches based on query strings.","QueryStringsAllowList":"The specific query strings that the distribution forwards to the origin.\\n\\nYour distribution caches content based on the specified query strings.\\n\\nIf the `option` parameter is true, then your distribution forwards all query strings, regardless of what you specify using the `QueryStringsAllowList` parameter."}},"AWS::Lightsail::Instance":{"attributes":{"Hardware.CpuCount":"The number of vCPUs the instance has.","Hardware.RamSizeInGb":"The amount of RAM in GB on the instance (for example, `1.0` ).","InstanceArn":"The Amazon Resource Name (ARN) of the instance (for example, `arn:aws:lightsail:us-east-2:123456789101:Instance/244ad76f-8aad-4741-809f-12345EXAMPLE` ).","IsStaticIp":"A Boolean value indicating whether the instance has a static IP assigned to it.","Location.AvailabilityZone":"The AWS Region and Availability Zone where the instance is located.","Location.RegionName":"The AWS Region of the instance.","Networking.MonthlyTransfer.GbPerMonthAllocated":"The amount of allocated monthly data transfer (in GB) for an instance.","PrivateIpAddress":"The private IP address of the instance.","PublicIpAddress":"The public IP address of the instance.","Ref":"","ResourceType":"The resource type of the instance (for example, `Instance` ).","SshKeyName":"The name of the SSH key pair used by the instance.","State.Code":"The status code of the instance.","State.Name":"The state of the instance (for example, `running` or `pending` ).","SupportCode":"The support code of the instance.\\n\\nInclude this code in your email to support when you have questions about an instance or another resource in Lightsail . This code helps our support team to look up your Lightsail information.","UserName":"The user name for connecting to the instance (for example, `ec2-user` )."},"description":"The `AWS::Lightsail::Instance` resource specifies an Amazon Lightsail instance.","properties":{"AddOns":"An array of add-ons for the instance.\\n\\n> If the instance has an add-on enabled when performing a delete instance request, the add-on is automatically disabled before the instance is deleted.","AvailabilityZone":"The Availability Zone for the instance.","BlueprintId":"The blueprint ID for the instance (for example, `os_amlinux_2016_03` ).","BundleId":"The bundle ID for the instance (for example, `micro_1_0` ).","Hardware":"The hardware properties for the instance, such as the vCPU count, attached disks, and amount of RAM.\\n\\n> The instance restarts when performing an attach disk or detach disk request. This resets the public IP address of your instance if a static IP isn\'t attached to it.","InstanceName":"The name of the instance.","KeyPairName":"The name of the key pair to use for the instance.\\n\\nIf no key pair name is specified, the Regional Lightsail default key pair is used.","Location":"The location for the instance, such as the AWS Region and Availability Zone.\\n\\n> The `Location` property is read-only and should not be specified in a create instance or update instance request.","Networking":"The public ports and the monthly amount of data transfer allocated for the instance.","State":"The status code and the state (for example, `running` ) of the instance.\\n\\n> The `State` property is read-only and should not be specified in a create instance or update instance request.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *AWS CloudFormation User Guide* .\\n\\n> The `Value` of `Tags` is optional for Lightsail resources.","UserData":"The optional launch script for the instance.\\n\\nSpecify a launch script to configure an instance with additional user data. For example, you might want to specify `apt-get -y update` as a launch script.\\n\\n> Depending on the blueprint of your instance, the command to get software on your instance varies. Amazon Linux and CentOS use `yum` , Debian and Ubuntu use `apt-get` , and FreeBSD uses `pkg` ."}},"AWS::Lightsail::Instance.AddOn":{"attributes":{},"description":"`AddOn` is a property of the [AWS::Lightsail::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html) resource. It describes the add-ons for an instance.","properties":{"AddOnType":"The add-on type (for example, `AutoSnapshot` ).\\n\\n> `AutoSnapshot` is the only add-on that can be enabled for an instance.","AutoSnapshotAddOnRequest":"The parameters for the automatic snapshot add-on, such as the daily time when an automatic snapshot will be created.","Status":"The status of the add-on.\\n\\nValid Values: `Enabled` | `Disabled`"}},"AWS::Lightsail::Instance.AutoSnapshotAddOn":{"attributes":{},"description":"`AutoSnapshotAddOn` is a property of the [AddOn](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-addon.html) property. It describes the automatic snapshot add-on for an instance.","properties":{"SnapshotTimeOfDay":"The daily time when an automatic snapshot will be created.\\n\\nConstraints:\\n\\n- Must be in `HH:00` format, and in an hourly increment.\\n- Specified in Coordinated Universal Time (UTC).\\n- The snapshot will be automatically created between the time specified and up to 45 minutes after."}},"AWS::Lightsail::Instance.Disk":{"attributes":{},"description":"`Disk` is a property of the [Hardware](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-hardware.html) property. It describes a disk attached to an instance.","properties":{"AttachedTo":"The resources to which the disk is attached.","AttachmentState":"(Deprecated) The attachment state of the disk.\\n\\n> In releases prior to November 14, 2017, this parameter returned `attached` for system disks in the API response. It is now deprecated, but still included in the response. Use `isAttached` instead.","DiskName":"The unique name of the disk.","IOPS":"The input/output operations per second (IOPS) of the disk.","IsSystemDisk":"A Boolean value indicating whether this disk is a system disk (has an operating system loaded on it).","Path":"The disk path.","SizeInGb":"The size of the disk in GB."}},"AWS::Lightsail::Instance.Hardware":{"attributes":{},"description":"`Hardware` is a property of the [AWS::Lightsail::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html) resource. It describes the hardware properties for the instance, such as the vCPU count, attached disks, and amount of RAM.","properties":{"CpuCount":"The number of vCPUs the instance has.\\n\\n> The `CpuCount` property is read-only and should not be specified in a create instance or update instance request.","Disks":"The disks attached to the instance.\\n\\nThe instance restarts when performing an attach disk or detach disk request. This resets the public IP address of your instance if a static IP isn\'t attached to it.","RamSizeInGb":"The amount of RAM in GB on the instance (for example, `1.0` ).\\n\\n> The `RamSizeInGb` property is read-only and should not be specified in a create instance or update instance request."}},"AWS::Lightsail::Instance.Location":{"attributes":{},"description":"`Location` is a property of the [AWS::Lightsail::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html) resource. It describes the location for an instance.","properties":{"AvailabilityZone":"The Availability Zone for the instance.","RegionName":"The name of the AWS Region for the instance."}},"AWS::Lightsail::Instance.MonthlyTransfer":{"attributes":{},"description":"`MonthlyTransfer` is a property of the [Networking](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-networking.html) property. It describes the amount of allocated monthly data transfer (in GB) for an instance.","properties":{"GbPerMonthAllocated":"The amount of allocated monthly data transfer (in GB) for an instance."}},"AWS::Lightsail::Instance.Networking":{"attributes":{},"description":"`Networking` is a property of the [AWS::Lightsail::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html) resource. It describes the public ports and the monthly amount of data transfer allocated for the instance.","properties":{"MonthlyTransfer":"The monthly amount of data transfer, in GB, allocated for the instance","Ports":"An array of ports to open on the instance."}},"AWS::Lightsail::Instance.Port":{"attributes":{},"description":"`Port` is a property of the [Networking](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-networking.html) property. It describes information about ports for an instance.","properties":{"AccessDirection":"The access direction ( `inbound` or `outbound` ).\\n\\n> Lightsail currently supports only `inbound` access direction.","AccessFrom":"The location from which access is allowed. For example, `Anywhere (0.0.0.0/0)` , or `Custom` if a specific IP address or range of IP addresses is allowed.","AccessType":"The type of access ( `Public` or `Private` ).","CidrListAliases":"An alias that defines access for a preconfigured range of IP addresses.\\n\\nThe only alias currently supported is `lightsail-connect` , which allows IP addresses of the browser-based RDP/SSH client in the Lightsail console to connect to your instance.","Cidrs":"The IPv4 address, or range of IPv4 addresses (in CIDR notation) that are allowed to connect to an instance through the ports, and the protocol.\\n\\n> The `ipv6Cidrs` parameter lists the IPv6 addresses that are allowed to connect to an instance. \\n\\nExamples:\\n\\n- To allow the IP address `192.0.2.44` , specify `192.0.2.44` or `192.0.2.44/32` .\\n- To allow the IP addresses `192.0.2.0` to `192.0.2.255` , specify `192.0.2.0/24` .","CommonName":"The common name of the port information.","FromPort":"The first port in a range of open ports on an instance.\\n\\nAllowed ports:\\n\\n- TCP and UDP - `0` to `65535`\\n- ICMP - The ICMP type for IPv4 addresses. For example, specify `8` as the `fromPort` (ICMP type), and `-1` as the `toPort` (ICMP code), to enable ICMP Ping.\\n- ICMPv6 - The ICMP type for IPv6 addresses. For example, specify `128` as the `fromPort` (ICMPv6 type), and `0` as `toPort` (ICMPv6 code).","Ipv6Cidrs":"The IPv6 address, or range of IPv6 addresses (in CIDR notation) that are allowed to connect to an instance through the ports, and the protocol. Only devices with an IPv6 address can connect to an instance through IPv6; otherwise, IPv4 should be used.\\n\\n> The `cidrs` parameter lists the IPv4 addresses that are allowed to connect to an instance.","Protocol":"The IP protocol name.\\n\\nThe name can be one of the following:\\n\\n- `tcp` - Transmission Control Protocol (TCP) provides reliable, ordered, and error-checked delivery of streamed data between applications running on hosts communicating by an IP network. If you have an application that doesn\'t require reliable data stream service, use UDP instead.\\n- `all` - All transport layer protocol types.\\n- `udp` - With User Datagram Protocol (UDP), computer applications can send messages (or datagrams) to other hosts on an Internet Protocol (IP) network. Prior communications are not required to set up transmission channels or data paths. Applications that don\'t require reliable data stream service can use UDP, which provides a connectionless datagram service that emphasizes reduced latency over reliability. If you do require reliable data stream service, use TCP instead.\\n- `icmp` - Internet Control Message Protocol (ICMP) is used to send error messages and operational information indicating success or failure when communicating with an instance. For example, an error is indicated when an instance could not be reached. When you specify `icmp` as the `protocol` , you must specify the ICMP type using the `fromPort` parameter, and ICMP code using the `toPort` parameter.","ToPort":"The last port in a range of open ports on an instance.\\n\\nAllowed ports:\\n\\n- TCP and UDP - `0` to `65535`\\n- ICMP - The ICMP code for IPv4 addresses. For example, specify `8` as the `fromPort` (ICMP type), and `-1` as the `toPort` (ICMP code), to enable ICMP Ping.\\n- ICMPv6 - The ICMP code for IPv6 addresses. For example, specify `128` as the `fromPort` (ICMPv6 type), and `0` as `toPort` (ICMPv6 code)."}},"AWS::Lightsail::Instance.State":{"attributes":{},"description":"`State` is a property of the [AWS::Lightsail::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html) resource. It describes the status code and the state (for example, `running` ) of an instance.","properties":{"Code":"The status code of the instance.","Name":"The state of the instance (for example, `running` or `pending` )."}},"AWS::Lightsail::LoadBalancer":{"attributes":{"LoadBalancerArn":"The Amazon Resource Name (ARN) of the load balancer.","Ref":""},"description":"The `AWS::Lightsail::LoadBalancer` resource specifies a load balancer that can be used with Lightsail instances.\\n\\n> You cannot attach a TLS certificate to a load balancer using the `AWS::Lightsail::LoadBalancer` resource type. Instead, use the `AWS::Lightsail::LoadBalancerTlsCertificate` resource type to create a certificate and attach it to a load balancer.","properties":{"AttachedInstances":"The Lightsail instances to attach to the load balancer.","HealthCheckPath":"The path on the attached instance where the health check will be performed. If no path is specified, the load balancer tries to make a request to the default (root) page ( `/index.html` ).","InstancePort":"The port that the load balancer uses to direct traffic to your Lightsail instances. For HTTP traffic, specify port `80` . For HTTPS traffic, specify port `443` .","IpAddressType":"The IP address type of the load balancer.\\n\\nThe possible values are `ipv4` for IPv4 only, and `dualstack` for both IPv4 and IPv6.","LoadBalancerName":"The name of the load balancer.","SessionStickinessEnabled":"A Boolean value indicating whether session stickiness is enabled.\\n\\nEnable session stickiness (also known as *session affinity* ) to bind a user\'s session to a specific instance. This ensures that all requests from the user during the session are sent to the same instance.","SessionStickinessLBCookieDurationSeconds":"The time period, in seconds, after which the load balancer session stickiness cookie should be considered stale. If you do not specify this parameter, the default value is 0, which indicates that the sticky session should last for the duration of the browser session.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *AWS CloudFormation User Guide* .\\n\\n> The `Value` of `Tags` is optional for Lightsail resources.","TlsPolicyName":"The name of the TLS security policy for the load balancer."}},"AWS::Lightsail::LoadBalancerTlsCertificate":{"attributes":{"LoadBalancerTlsCertificateArn":"The Amazon Resource Name (ARN) of the SSL/TLS certificate.","Ref":"","Status":"The validation status of the SSL/TLS certificate.\\n\\nValid Values: `PENDING_VALIDATION` | `ISSUED` | `INACTIVE` | `EXPIRED` | `VALIDATION_TIMED_OUT` | `REVOKED` | `FAILED` | `UNKNOWN`"},"description":"The `AWS::Lightsail::LoadBalancerTlsCertificate` resource specifies a TLS certificate that can be used with a Lightsail load balancer.","properties":{"CertificateAlternativeNames":"An array of alternative domain names and subdomain names for your SSL/TLS certificate.\\n\\nIn addition to the primary domain name, you can have up to nine alternative domain names. Wildcards (such as `*.example.com` ) are not supported.","CertificateDomainName":"The domain name for the SSL/TLS certificate. For example, `example.com` or `www.example.com` .","CertificateName":"The name of the SSL/TLS certificate.","HttpsRedirectionEnabled":"A Boolean value indicating whether HTTPS redirection is enabled for the load balancer that the TLS certificate is attached to.","IsAttached":"A Boolean value indicating whether the SSL/TLS certificate is attached to a Lightsail load balancer.","LoadBalancerName":"The name of the load balancer that the SSL/TLS certificate is attached to."}},"AWS::Lightsail::StaticIp":{"attributes":{"IpAddress":"The IP address of the static IP.","IsAttached":"A Boolean value indicating whether the static IP is attached to an instance.","Ref":"","StaticIpArn":"The Amazon Resource Name (ARN) of the static IP (for example, `arn:aws:lightsail:us-east-2:123456789101:StaticIp/244ad76f-8aad-4741-809f-12345EXAMPLE` )."},"description":"The `AWS::Lightsail::StaticIp` resource specifies a static IP that can be attached to an Amazon Lightsail instance that is in the same AWS Region and Availability Zone.","properties":{"AttachedTo":"The instance that the static IP is attached to.","StaticIpName":"The name of the static IP."}},"AWS::Location::GeofenceCollection":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the geofence collection resource. Used when you need to specify a resource across all AWS .\\n\\n- Format example: `arn:aws:geo:region:account-id:geofence-collection/ExampleGeofenceCollection`","CollectionArn":"Synonym for `Arn` . The Amazon Resource Name (ARN) for the geofence collection resource. Used when you need to specify a resource across all AWS .\\n\\n- Format example: `arn:aws:geo:region:account-id:geofence-collection/ExampleGeofenceCollection`","CreateTime":"The timestamp for when the geofence collection resource was created in [ISO 8601](https://docs.aws.amazon.com/https://www.iso.org/iso-8601-date-and-time-format.html) format: `YYYY-MM-DDThh:mm:ss.sssZ` .","Ref":"`Ref` returns the `GeofenceCollection` name.","UpdateTime":"The timestamp for when the geofence collection resource was last updated in [ISO 8601](https://docs.aws.amazon.com/https://www.iso.org/iso-8601-date-and-time-format.html) format: `YYYY-MM-DDThh:mm:ss.sssZ` ."},"description":"The `AWS::Location::GeofenceCollection` resource specifies the ability to detect and act when a tracked device enters or exits a defined geographical boundary known as a geofence.","properties":{"CollectionName":"A custom name for the geofence collection.\\n\\nRequirements:\\n\\n- Contain only alphanumeric characters (A–Z, a–z, 0–9), hyphens (-), periods (.), and underscores (_).\\n- Must be a unique geofence collection name.\\n- No spaces allowed. For example, `ExampleGeofenceCollection` .","Description":"An optional description for the geofence collection.","KmsKeyId":"A key identifier for an [AWS KMS customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) . Enter a key ID, key ARN, alias name, or alias ARN."}},"AWS::Location::Map":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the map resource. Used to specify a resource across all AWS .\\n\\n- Format example: `arn:aws:geo:region:account-id:maps/ExampleMap`","CreateTime":"The timestamp for when the map resource was created in [ISO 8601](https://docs.aws.amazon.com/https://www.iso.org/iso-8601-date-and-time-format.html) format: `YYYY-MM-DDThh:mm:ss.sssZ` .","DataSource":"The data provider for the associated map tiles.","MapArn":"Synonym for `Arn` . The Amazon Resource Name (ARN) for the map resource. Used to specify a resource across all AWS .\\n\\n- Format example: `arn:aws:geo:region:account-id:maps/ExampleMap`","Ref":"`Ref` returns the `Map` name.","UpdateTime":"The timestamp for when the map resource was last updated in [ISO 8601](https://docs.aws.amazon.com/https://www.iso.org/iso-8601-date-and-time-format.html) format: `YYYY-MM-DDThh:mm:ss.sssZ` ."},"description":"The `AWS::Location::Map` resource specifies a map resource in your AWS account, which provides map tiles of different styles sourced from global location data providers.","properties":{"Configuration":"Specifies the `MapConfiguration` , including the map style, for the map resource that you create. The map style defines the look of maps and the data provider for your map resource.","Description":"An optional description for the map resource.","MapName":"The name for the map resource.\\n\\nRequirements:\\n\\n- Must contain only alphanumeric characters (A–Z, a–z, 0–9), hyphens (-), periods (.), and underscores (_).\\n- Must be a unique map resource name.\\n- No spaces allowed. For example, `ExampleMap` .","PricingPlan":"No longer used. If included, the only allowed value is `RequestBasedUsage` .\\n\\n*Allowed Values* : `RequestBasedUsage`"}},"AWS::Location::Map.MapConfiguration":{"attributes":{},"description":"Specifies the map tile style selected from an available provider.","properties":{"Style":"Specifies the map style selected from an available data provider.\\n\\nValid [Esri map styles](https://docs.aws.amazon.com/location/latest/developerguide/esri.html) :\\n\\n- `VectorEsriDarkGrayCanvas` – The Esri Dark Gray Canvas map style. A vector basemap with a dark gray, neutral background with minimal colors, labels, and features that\'s designed to draw attention to your thematic content.\\n- `RasterEsriImagery` – The Esri Imagery map style. A raster basemap that provides one meter or better satellite and aerial imagery in many parts of the world and lower resolution satellite imagery worldwide.\\n- `VectorEsriLightGrayCanvas` – The Esri Light Gray Canvas map style, which provides a detailed vector basemap with a light gray, neutral background style with minimal colors, labels, and features that\'s designed to draw attention to your thematic content.\\n- `VectorEsriTopographic` – The Esri Light map style, which provides a detailed vector basemap with a classic Esri map style.\\n- `VectorEsriStreets` – The Esri Street Map style, which provides a detailed vector basemap for the world symbolized with a classic Esri street map style. The vector tile layer is similar in content and style to the World Street Map raster map.\\n- `VectorEsriNavigation` – The Esri Navigation map style, which provides a detailed basemap for the world symbolized with a custom navigation map style that\'s designed for use during the day in mobile devices.\\n\\nValid [HERE Technologies map styles](https://docs.aws.amazon.com/location/latest/developerguide/HERE.html) :\\n\\n- `VectorHereContrast` – The HERE Contrast (Berlin) map style is a high contrast detailed base map of the world that blends 3D and 2D rendering.\\n\\n> The `VectorHereContrast` style has been renamed from `VectorHereBerlin` . `VectorHereBerlin` has been deprecated, but will continue to work in applications that use it.\\n- `VectorHereExplore` – A default HERE map style containing a neutral, global map and its features including roads, buildings, landmarks, and water features. It also now includes a fully designed map of Japan.\\n- `VectorHereExploreTruck` – A global map containing truck restrictions and attributes (e.g. width / height / HAZMAT) symbolized with highlighted segments and icons on top of HERE Explore to support use cases within transport and logistics.\\n- `RasterHereExploreSatellite` – A global map containing high resolution satellite imagery.\\n- `HybridHereExploreSatellite` – A global map displaying the road network, street names, and city labels over satellite imagery. This style will automatically retrieve both raster and vector tiles, and your charges will be based on total tiles retrieved.\\n\\n> Hybrid styles use both vector and raster tiles when rendering the map that you see. This means that more tiles are retrieved than when using either vector or raster tiles alone. Your charges will include all tiles retrieved.\\n\\nValid [GrabMaps map styles](https://docs.aws.amazon.com/location/latest/developerguide/grab.html) :\\n\\n- `VectorGrabStandardLight` – The Grab Standard Light map style provides a basemap with detailed land use coloring, area names, roads, landmarks, and points of interest covering Southeast Asia.\\n- `VectorGrabStandardDark` – The Grab Standard Dark map style provides a dark variation of the standard basemap covering Southeast Asia.\\n\\n> Grab provides maps only for countries in Southeast Asia, and is only available in the Asia Pacific (Singapore) Region ( `ap-southeast-1` ). For more information, see [GrabMaps countries and area covered](https://docs.aws.amazon.com/location/latest/developerguide/grab.html#grab-coverage-area) . \\n\\nValid [Open Data map styles](https://docs.aws.amazon.com/location/latest/developerguide/open-data.html) :\\n\\n- `VectorOpenDataStandardLight` – The Open Data Standard Light map style provides a detailed basemap for the world suitable for website and mobile application use. The map includes highways major roads, minor roads, railways, water features, cities, parks, landmarks, building footprints, and administrative boundaries.\\n- `VectorOpenDataStandardDark` – Open Data Standard Dark is a dark-themed map style that provides a detailed basemap for the world suitable for website and mobile application use. The map includes highways major roads, minor roads, railways, water features, cities, parks, landmarks, building footprints, and administrative boundaries.\\n- `VectorOpenDataVisualizationLight` – The Open Data Visualization Light map style is a light-themed style with muted colors and fewer features that aids in understanding overlaid data.\\n- `VectorOpenDataVisualizationDark` – The Open Data Visualization Dark map style is a dark-themed style with muted colors and fewer features that aids in understanding overlaid data."}},"AWS::Location::PlaceIndex":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the place index resource. Used to specify a resource across AWS .\\n\\n- Format example: `arn:aws:geo:region:account-id:place-index/ExamplePlaceIndex`","CreateTime":"The timestamp for when the place index resource was created in [ISO 8601](https://docs.aws.amazon.com/https://www.iso.org/iso-8601-date-and-time-format.html) format: `YYYY-MM-DDThh:mm:ss.sssZ` .","IndexArn":"Synonym for `Arn` . The Amazon Resource Name (ARN) for the place index resource. Used to specify a resource across AWS .\\n\\n- Format example: `arn:aws:geo:region:account-id:place-index/ExamplePlaceIndex`","Ref":"`Ref` returns the `PlaceIndex` name.","UpdateTime":"The timestamp for when the place index resource was last updated in [ISO 8601](https://docs.aws.amazon.com/https://www.iso.org/iso-8601-date-and-time-format.html) format: `YYYY-MM-DDThh:mm:ss.sssZ` ."},"description":"Specifies a place index resource in your AWS account. Use a place index resource to geocode addresses and other text queries by using the `SearchPlaceIndexForText` operation, and reverse geocode coordinates by using the `SearchPlaceIndexForPosition` operation, and enable autosuggestions by using the `SearchPlaceIndexForSuggestions` operation.\\n\\n> If your application is tracking or routing assets you use in your business, such as delivery vehicles or employees, you must not use Esri as your geolocation provider. See section 82 of the [AWS service terms](https://docs.aws.amazon.com/service-terms) for more details.","properties":{"DataSource":"Specifies the geospatial data provider for the new place index.\\n\\n> This field is case-sensitive. Enter the valid values as shown. For example, entering `HERE` returns an error. \\n\\nValid values include:\\n\\n- `Esri` – For additional information about [Esri](https://docs.aws.amazon.com/location/latest/developerguide/esri.html) \'s coverage in your region of interest, see [Esri details on geocoding coverage](https://docs.aws.amazon.com/https://developers.arcgis.com/rest/geocode/api-reference/geocode-coverage.htm) .\\n- `Grab` – Grab provides place index functionality for Southeast Asia. For additional information about [GrabMaps](https://docs.aws.amazon.com/location/latest/developerguide/grab.html) \' coverage, see [GrabMaps countries and areas covered](https://docs.aws.amazon.com/location/latest/developerguide/grab.html#grab-coverage-area) .\\n- `Here` – For additional information about [HERE Technologies](https://docs.aws.amazon.com/location/latest/developerguide/HERE.html) \' coverage in your region of interest, see [HERE details on goecoding coverage](https://docs.aws.amazon.com/https://developer.here.com/documentation/geocoder/dev_guide/topics/coverage-geocoder.html) .\\n\\n> If you specify HERE Technologies ( `Here` ) as the data provider, you may not [store results](https://docs.aws.amazon.com//location-places/latest/APIReference/API_DataSourceConfiguration.html) for locations in Japan. For more information, see the [AWS Service Terms](https://docs.aws.amazon.com/service-terms/) for Amazon Location Service.\\n\\nFor additional information , see [Data providers](https://docs.aws.amazon.com/location/latest/developerguide/what-is-data-provider.html) on the *Amazon Location Service Developer Guide* .","DataSourceConfiguration":"Specifies the data storage option requesting Places.","Description":"The optional description for the place index resource.","IndexName":"The name of the place index resource.\\n\\nRequirements:\\n\\n- Contain only alphanumeric characters (A–Z, a–z, 0–9), hyphens (-), periods (.), and underscores (_).\\n- Must be a unique place index resource name.\\n- No spaces allowed. For example, `ExamplePlaceIndex` .","PricingPlan":"No longer used. If included, the only allowed value is `RequestBasedUsage` .\\n\\n*Allowed Values* : `RequestBasedUsage`"}},"AWS::Location::PlaceIndex.DataSourceConfiguration":{"attributes":{},"description":"Specifies the data storage option requesting Places.","properties":{"IntendedUse":"Specifies how the results of an operation will be stored by the caller.\\n\\nValid values include:\\n\\n- `SingleUse` specifies that the results won\'t be stored.\\n- `Storage` specifies that the result can be cached or stored in a database.\\n\\nDefault value: `SingleUse`"}},"AWS::Location::RouteCalculator":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the route calculator resource. Use the ARN when you specify a resource across all AWS .\\n\\n- Format example: `arn:aws:geo:region:account-id:route-calculator/ExampleCalculator`","CalculatorArn":"Synonym for `Arn` . The Amazon Resource Name (ARN) for the route calculator resource. Use the ARN when you specify a resource across all AWS .\\n\\n- Format example: `arn:aws:geo:region:account-id:route-calculator/ExampleCalculator`","CreateTime":"The timestamp for when the route calculator resource was created in [ISO 8601](https://docs.aws.amazon.com/https://www.iso.org/iso-8601-date-and-time-format.html) format: `YYYY-MM-DDThh:mm:ss.sssZ` .","Ref":"`Ref` returns the `RouteCalculator` name.","UpdateTime":"The timestamp for when the route calculator resource was last updated in [ISO 8601](https://docs.aws.amazon.com/https://www.iso.org/iso-8601-date-and-time-format.html) format: `YYYY-MM-DDThh:mm:ss.sssZ` ."},"description":"Specifies a route calculator resource in your AWS account.\\n\\nYou can send requests to a route calculator resource to estimate travel time, distance, and get directions. A route calculator sources traffic and road network data from your chosen data provider.\\n\\n> If your application is tracking or routing assets you use in your business, such as delivery vehicles or employees, you must not use Esri as your geolocation provider. See section 82 of the [AWS service terms](https://docs.aws.amazon.com/service-terms) for more details.","properties":{"CalculatorName":"The name of the route calculator resource.\\n\\nRequirements:\\n\\n- Can use alphanumeric characters (A–Z, a–z, 0–9) , hyphens (-), periods (.), and underscores (_).\\n- Must be a unique Route calculator resource name.\\n- No spaces allowed. For example, `ExampleRouteCalculator` .","DataSource":"Specifies the data provider of traffic and road network data.\\n\\n> This field is case-sensitive. Enter the valid values as shown. For example, entering `HERE` returns an error. \\n\\nValid values include:\\n\\n- `Esri` – For additional information about [Esri](https://docs.aws.amazon.com/location/latest/developerguide/esri.html) \'s coverage in your region of interest, see [Esri details on street networks and traffic coverage](https://docs.aws.amazon.com/https://doc.arcgis.com/en/arcgis-online/reference/network-coverage.htm) .\\n\\nRoute calculators that use Esri as a data source only calculate routes that are shorter than 400 km.\\n- `Grab` – Grab provides routing functionality for Southeast Asia. For additional information about [GrabMaps](https://docs.aws.amazon.com/location/latest/developerguide/grab.html) \' coverage, see [GrabMaps countries and areas covered](https://docs.aws.amazon.com/location/latest/developerguide/grab.html#grab-coverage-area) .\\n- `Here` – For additional information about [HERE Technologies](https://docs.aws.amazon.com/location/latest/developerguide/HERE.html) \' coverage in your region of interest, see [HERE car routing coverage](https://docs.aws.amazon.com/https://developer.here.com/documentation/routing-api/dev_guide/topics/coverage/car-routing.html) and [HERE truck routing coverage](https://docs.aws.amazon.com/https://developer.here.com/documentation/routing-api/dev_guide/topics/coverage/truck-routing.html) .\\n\\nFor additional information , see [Data providers](https://docs.aws.amazon.com/location/latest/developerguide/what-is-data-provider.html) on the *Amazon Location Service Developer Guide* .","Description":"The optional description for the route calculator resource.","PricingPlan":"No longer used. If included, the only allowed value is `RequestBasedUsage` .\\n\\n*Allowed Values* : `RequestBasedUsage`"}},"AWS::Location::Tracker":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the tracker resource. Used when you need to specify a resource across all AWS .\\n\\n- Format example: `arn:aws:geo:region:account-id:tracker/ExampleTracker`","CreateTime":"The timestamp for when the tracker resource was created in [ISO 8601](https://docs.aws.amazon.com/https://www.iso.org/iso-8601-date-and-time-format.html) format: `YYYY-MM-DDThh:mm:ss.sssZ` .","Ref":"`Ref` returns the `Tracker` name.","TrackerArn":"Synonym for `Arn` . The Amazon Resource Name (ARN) for the tracker resource. Used when you need to specify a resource across all AWS .\\n\\n- Format example: `arn:aws:geo:region:account-id:tracker/ExampleTracker`","UpdateTime":"The timestamp for when the tracker resource was last updated in [ISO 8601](https://docs.aws.amazon.com/https://www.iso.org/iso-8601-date-and-time-format.html) format: `YYYY-MM-DDThh:mm:ss.sssZ` ."},"description":"Specifies a tracker resource in your AWS account , which lets you receive current and historical location of devices.","properties":{"Description":"An optional description for the tracker resource.","KmsKeyId":"A key identifier for an [AWS KMS customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) . Enter a key ID, key ARN, alias name, or alias ARN.","PositionFiltering":"Specifies the position filtering for the tracker resource.\\n\\nValid values:\\n\\n- `TimeBased` - Location updates are evaluated against linked geofence collections, but not every location update is stored. If your update frequency is more often than 30 seconds, only one update per 30 seconds is stored for each unique device ID.\\n- `DistanceBased` - If the device has moved less than 30 m (98.4 ft), location updates are ignored. Location updates within this area are neither evaluated against linked geofence collections, nor stored. This helps control costs by reducing the number of geofence evaluations and historical device positions to paginate through. Distance-based filtering can also reduce the effects of GPS noise when displaying device trajectories on a map.\\n- `AccuracyBased` - If the device has moved less than the measured accuracy, location updates are ignored. For example, if two consecutive updates from a device have a horizontal accuracy of 5 m and 10 m, the second update is ignored if the device has moved less than 15 m. Ignored location updates are neither evaluated against linked geofence collections, nor stored. This can reduce the effects of GPS noise when displaying device trajectories on a map, and can help control your costs by reducing the number of geofence evaluations.\\n\\nThis field is optional. If not specified, the default value is `TimeBased` .","TrackerName":"The name for the tracker resource.\\n\\nRequirements:\\n\\n- Contain only alphanumeric characters (A-Z, a-z, 0-9) , hyphens (-), periods (.), and underscores (_).\\n- Must be a unique tracker resource name.\\n- No spaces allowed. For example, `ExampleTracker` ."}},"AWS::Location::TrackerConsumer":{"attributes":{"Ref":"`Ref` returns the `GeofenceCollection` name."},"description":"The `AWS::Location::TrackerConsumer` resource specifies an association between a geofence collection and a tracker resource. The geofence collection is referred to as the *consumer* of the tracker. This allows the tracker resource to communicate location data to the linked geofence collection.\\n\\n> Currently not supported — Cross-account configurations, such as creating associations between a tracker resource in one account and a geofence collection in another account.","properties":{"ConsumerArn":"The Amazon Resource Name (ARN) for the geofence collection to be associated to tracker resource. Used when you need to specify a resource across all AWS .\\n\\n- Format example: `arn:aws:geo:region:account-id:geofence-collection/ExampleGeofenceCollectionConsumer`","TrackerName":"The name for the tracker resource.\\n\\nRequirements:\\n\\n- Contain only alphanumeric characters (A-Z, a-z, 0-9) , hyphens (-), periods (.), and underscores (_).\\n- Must be a unique tracker resource name.\\n- No spaces allowed. For example, `ExampleTracker` ."}},"AWS::Logs::Destination":{"attributes":{"Arn":"The ARN of the CloudWatch Logs destination, such as `arn:aws:logs:us-west-1:123456789012:destination:MyDestination` .","Ref":"`Ref` returns the resource name, such as `TestDestination` ."},"description":"The AWS::Logs::Destination resource specifies a CloudWatch Logs destination. A destination encapsulates a physical resource (such as an Amazon Kinesis data stream) and enables you to subscribe that resource to a stream of log events.","properties":{"DestinationName":"The name of the destination.","DestinationPolicy":"An IAM policy document that governs which AWS accounts can create subscription filters against this destination.","RoleArn":"The ARN of an IAM role that permits CloudWatch Logs to send data to the specified AWS resource.","TargetArn":"The Amazon Resource Name (ARN) of the physical target where the log events are delivered (for example, a Kinesis stream)."}},"AWS::Logs::LogGroup":{"attributes":{"Arn":"The ARN of the log group, such as `arn:aws:logs:us-west-1:123456789012:log-group:/mystack-testgroup-12ABC1AB12A1:*`","Ref":"`Ref` returns the resource name."},"description":"The `AWS::Logs::LogGroup` resource specifies a log group. A log group defines common properties for log streams, such as their retention and access control rules. Each log stream must belong to one log group.\\n\\nYou can create up to 1,000,000 log groups per Region per account. You must use the following guidelines when naming a log group:\\n\\n- Log group names must be unique within a Region for an AWS account.\\n- Log group names can be between 1 and 512 characters long.\\n- Log group names consist of the following characters: a-z, A-Z, 0-9, \'_\' (underscore), \'-\' (hyphen), \'/\' (forward slash), and \'.\' (period).","properties":{"DataProtectionPolicy":"Creates a data protection policy and assigns it to the log group. A data protection policy can help safeguard sensitive data that\'s ingested by the log group by auditing and masking the sensitive log data. When a user who does not have permission to view masked data views a log event that includes masked data, the sensitive data is replaced by asterisks.\\n\\nFor more information, including a list of types of data that can be audited and masked, see [Protect sensitive log data with masking](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/mask-sensitive-log-data.html) .","KmsKeyId":"The Amazon Resource Name (ARN) of the AWS KMS key to use when encrypting log data.\\n\\nTo associate an AWS KMS key with the log group, specify the ARN of that KMS key here. If you do so, ingested data is encrypted using this key. This association is stored as long as the data encrypted with the KMS key is still within CloudWatch Logs . This enables CloudWatch Logs to decrypt this data whenever it is requested.\\n\\nIf you attempt to associate a KMS key with the log group but the KMS key doesn\'t exist or is deactivated, you will receive an `InvalidParameterException` error.\\n\\nLog group data is always encrypted in CloudWatch Logs . If you omit this key, the encryption does not use AWS KMS . For more information, see [Encrypt log data in CloudWatch Logs using AWS Key Management Service](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html)","LogGroupName":"The name of the log group. If you don\'t specify a name, AWS CloudFormation generates a unique ID for the log group.","RetentionInDays":"The number of days to retain the log events in the specified log group. Possible values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1096, 1827, 2192, 2557, 2922, 3288, and 3653.\\n\\nTo set a log group so that its log events do not expire, use [DeleteRetentionPolicy](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DeleteRetentionPolicy.html) .","Tags":"An array of key-value pairs to apply to the log group.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::Logs::LogStream":{"attributes":{"Ref":"`Ref` returns the resource name, such as `MyAppLogStream` ."},"description":"The `AWS::Logs::LogStream` resource specifies an Amazon CloudWatch Logs log stream in a specific log group. A log stream represents the sequence of events coming from an application instance or resource that you are monitoring.\\n\\nThere is no limit on the number of log streams that you can create for a log group.\\n\\nYou must use the following guidelines when naming a log stream:\\n\\n- Log stream names must be unique within the log group.\\n- Log stream names can be between 1 and 512 characters long.\\n- The \':\' (colon) and \'*\' (asterisk) characters are not allowed.","properties":{"LogGroupName":"The name of the log group where the log stream is created.","LogStreamName":"The name of the log stream. The name must be unique within the log group."}},"AWS::Logs::MetricFilter":{"attributes":{},"description":"The `AWS::Logs::MetricFilter` resource specifies a metric filter that describes how CloudWatch Logs extracts information from logs and transforms it into Amazon CloudWatch metrics. If you have multiple metric filters that are associated with a log group, all the filters are applied to the log streams in that group.\\n\\nThe maximum number of metric filters that can be associated with a log group is 100.","properties":{"FilterName":"The name of the metric filter.","FilterPattern":"A filter pattern for extracting metric data out of ingested log events. For more information, see [Filter and Pattern Syntax](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html) .","LogGroupName":"The name of an existing log group that you want to associate with this metric filter.","MetricTransformations":"The metric transformations."}},"AWS::Logs::MetricFilter.Dimension":{"attributes":{},"description":"Specifies the CloudWatch metric dimensions to publish with this metric.\\n\\nBecause dimensions are part of the unique identifier for a metric, whenever a unique dimension name/value pair is extracted from your logs, you are creating a new variation of that metric.\\n\\nFor more information about publishing dimensions with metrics created by metric filters, see [Publishing dimensions with metrics from values in JSON or space-delimited log events](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html#logs-metric-filters-dimensions) .\\n\\n> Metrics extracted from log events are charged as custom metrics. To prevent unexpected high charges, do not specify high-cardinality fields such as `IPAddress` or `requestID` as dimensions. Each different value found for a dimension is treated as a separate metric and accrues charges as a separate custom metric.\\n> \\n> To help prevent accidental high charges, Amazon disables a metric filter if it generates 1000 different name/value pairs for the dimensions that you have specified within a certain amount of time.\\n> \\n> You can also set up a billing alarm to alert you if your charges are higher than expected. For more information, see [Creating a Billing Alarm to Monitor Your Estimated AWS Charges](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html) .","properties":{"Key":"The name for the CloudWatch metric dimension that the metric filter creates.\\n\\nDimension names must contain only ASCII characters, must include at least one non-whitespace character, and cannot start with a colon (:).","Value":"The log event field that will contain the value for this dimension. This dimension will only be published for a metric if the value is found in the log event. For example, `$.eventType` for JSON log events, or `$server` for space-delimited log events."}},"AWS::Logs::MetricFilter.MetricTransformation":{"attributes":{},"description":"`MetricTransformation` is a property of the `AWS::Logs::MetricFilter` resource that describes how to transform log streams into a CloudWatch metric.","properties":{"DefaultValue":"(Optional) The value to emit when a filter pattern does not match a log event. This value can be null.","Dimensions":"The fields to use as dimensions for the metric. One metric filter can include as many as three dimensions.\\n\\n> Metrics extracted from log events are charged as custom metrics. To prevent unexpected high charges, do not specify high-cardinality fields such as `IPAddress` or `requestID` as dimensions. Each different value found for a dimension is treated as a separate metric and accrues charges as a separate custom metric.\\n> \\n> CloudWatch Logs disables a metric filter if it generates 1000 different name/value pairs for your specified dimensions within a certain amount of time. This helps to prevent accidental high charges.\\n> \\n> You can also set up a billing alarm to alert you if your charges are higher than expected. For more information, see [Creating a Billing Alarm to Monitor Your Estimated AWS Charges](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html) .","MetricName":"The name of the CloudWatch metric.","MetricNamespace":"A custom namespace to contain your metric in CloudWatch. Use namespaces to group together metrics that are similar. For more information, see [Namespaces](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Namespace) .","MetricValue":"The value that is published to the CloudWatch metric. For example, if you\'re counting the occurrences of a particular term like `Error` , specify 1 for the metric value. If you\'re counting the number of bytes transferred, reference the value that is in the log event by using $. followed by the name of the field that you specified in the filter pattern, such as `$.size` .","Unit":"The unit to assign to the metric. If you omit this, the unit is set as `None` ."}},"AWS::Logs::QueryDefinition":{"attributes":{"QueryDefinitionId":"The ID of the query definition.","Ref":"`Ref` returns the query definition ID."},"description":"Creates a query definition for CloudWatch Logs Insights. For more information, see [Analyzing Log Data with CloudWatch Logs Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html) .","properties":{"LogGroupNames":"Use this parameter if you want the query to query only certain log groups.","Name":"A name for the query definition.","QueryString":"The query string to use for this query definition. For more information, see [CloudWatch Logs Insights Query Syntax](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html) ."}},"AWS::Logs::ResourcePolicy":{"attributes":{"Ref":"`Ref` returns the `PolicyName` of the resource policy."},"description":"Creates or updates a resource policy that allows other AWS services to put log events to this account. An account can have up to 10 resource policies per AWS Region.","properties":{"PolicyDocument":"The details of the policy. It must be formatted in JSON, and you must use backslashes to escape characters that need to be escaped in JSON strings, such as double quote marks.","PolicyName":"The name of the resource policy."}},"AWS::Logs::SubscriptionFilter":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"The `AWS::Logs::SubscriptionFilter` resource specifies a subscription filter and associates it with the specified log group. Subscription filters allow you to subscribe to a real-time stream of log events and have them delivered to a specific destination. Currently, the supported destinations are:\\n\\n- An Amazon Kinesis data stream belonging to the same account as the subscription filter, for same-account delivery.\\n- A logical destination that belongs to a different account, for cross-account delivery.\\n- An Amazon Kinesis Firehose delivery stream that belongs to the same account as the subscription filter, for same-account delivery.\\n- An AWS Lambda function that belongs to the same account as the subscription filter, for same-account delivery.\\n\\nThere can be as many as two subscription filters associated with a log group.","properties":{"DestinationArn":"The Amazon Resource Name (ARN) of the destination.","Distribution":"The method used to distribute log data to the destination, which can be either random or grouped by log stream.","FilterName":"The name of the subscription filter.","FilterPattern":"The filtering expressions that restrict what gets delivered to the destination AWS resource. For more information about the filter pattern syntax, see [Filter and Pattern Syntax](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html) .","LogGroupName":"The log group to associate with the subscription filter. All log events that are uploaded to this log group are filtered and delivered to the specified AWS resource if the filter pattern matches the log events.","RoleArn":"The ARN of an IAM role that grants CloudWatch Logs permissions to deliver ingested log events to the destination stream. You don\'t need to provide the ARN when you are working with a logical destination for cross-account delivery."}},"AWS::LookoutEquipment::InferenceScheduler":{"attributes":{"InferenceSchedulerArn":"The Amazon Resource Name (ARN) of the inference scheduler being created."},"description":"Creates a scheduled inference. Scheduling an inference is setting up a continuous real-time inference plan to analyze new measurement data. When setting up the schedule, you provide an Amazon S3 bucket location for the input data, assign it a delimiter between separate entries in the data, set an offset delay if desired, and set the frequency of inferencing. You must also provide an Amazon S3 bucket location for the output data.\\n\\n> Updating some properties below (for example, InferenceSchedulerName and ServerSideKmsKeyId) triggers a resource replacement, which requires a new model. To replace such a property using AWS CloudFormation , but without creating a completely new stack, you must replace ModelName. If you need to replace the property, but want to use the same model, delete the current stack and create a new one with the updated properties.","properties":{"DataDelayOffsetInMinutes":"A period of time (in minutes) by which inference on the data is delayed after the data starts. For instance, if an offset delay time of five minutes was selected, inference will not begin on the data until the first data measurement after the five minute mark. For example, if five minutes is selected, the inference scheduler will wake up at the configured frequency with the additional five minute delay time to check the customer S3 bucket. The customer can upload data at the same frequency and they don\'t need to stop and restart the scheduler when uploading new data.","DataInputConfiguration":"Specifies configuration information for the input data for the inference scheduler, including delimiter, format, and dataset location.","DataOutputConfiguration":"Specifies configuration information for the output results for the inference scheduler, including the Amazon S3 location for the output.","DataUploadFrequency":"How often data is uploaded to the source S3 bucket for the input data. This value is the length of time between data uploads. For instance, if you select 5 minutes, Amazon Lookout for Equipment will upload the real-time data to the source bucket once every 5 minutes. This frequency also determines how often Amazon Lookout for Equipment starts a scheduled inference on your data. In this example, it starts once every 5 minutes.","InferenceSchedulerName":"The name of the inference scheduler.","ModelName":"The name of the ML model used for the inference scheduler.","RoleArn":"The Amazon Resource Name (ARN) of a role with permission to access the data source being used for the inference.","ServerSideKmsKeyId":"Provides the identifier of the AWS KMS key used to encrypt inference scheduler data by Amazon Lookout for Equipment .","Tags":"Any tags associated with the inference scheduler.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::LookoutEquipment::InferenceScheduler.DataInputConfiguration":{"attributes":{},"description":"","properties":{"InferenceInputNameConfiguration":"","InputTimeZoneOffset":"","S3InputConfiguration":""}},"AWS::LookoutEquipment::InferenceScheduler.DataOutputConfiguration":{"attributes":{},"description":"","properties":{"KmsKeyId":"","S3OutputConfiguration":""}},"AWS::LookoutEquipment::InferenceScheduler.InputNameConfiguration":{"attributes":{},"description":"","properties":{"ComponentTimestampDelimiter":"","TimestampFormat":""}},"AWS::LookoutEquipment::InferenceScheduler.S3InputConfiguration":{"attributes":{},"description":"","properties":{"Bucket":"","Prefix":""}},"AWS::LookoutEquipment::InferenceScheduler.S3OutputConfiguration":{"attributes":{},"description":"","properties":{"Bucket":"","Prefix":""}},"AWS::LookoutMetrics::Alert":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the alert. For example, `arn:aws:lookoutmetrics:us-east-2:123456789012:Alert:my-alert`","Ref":"`Ref` returns the resource name."},"description":"The `AWS::LookoutMetrics::Alert` type creates an alert for an anomaly detector.","properties":{"Action":"Action that will be triggered when there is an alert.","AlertDescription":"A description of the alert.","AlertName":"The name of the alert.","AlertSensitivityThreshold":"An integer from 0 to 100 specifying the alert sensitivity threshold.","AnomalyDetectorArn":"The ARN of the detector to which the alert is attached."}},"AWS::LookoutMetrics::Alert.Action":{"attributes":{},"description":"A configuration that specifies the action to perform when anomalies are detected.","properties":{"LambdaConfiguration":"A configuration for an AWS Lambda channel.","SNSConfiguration":"A configuration for an Amazon SNS channel."}},"AWS::LookoutMetrics::Alert.LambdaConfiguration":{"attributes":{},"description":"Contains information about a Lambda configuration.","properties":{"LambdaArn":"The ARN of the Lambda function.","RoleArn":"The ARN of an IAM role that has permission to invoke the Lambda function."}},"AWS::LookoutMetrics::Alert.SNSConfiguration":{"attributes":{},"description":"Contains information about the SNS topic to which you want to send your alerts and the IAM role that has access to that topic.","properties":{"RoleArn":"The ARN of the IAM role that has access to the target SNS topic.","SnsTopicArn":"The ARN of the target SNS topic."}},"AWS::LookoutMetrics::AnomalyDetector":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the detector. For example, `arn:aws:lookoutmetrics:us-east-2:123456789012:AnomalyDetector:my-detector`","Ref":"`Ref` returns the resource name."},"description":"The `AWS::LookoutMetrics::AnomalyDetector` type creates an anomaly detector.","properties":{"AnomalyDetectorConfig":"Contains information about the configuration of the anomaly detector.","AnomalyDetectorDescription":"A description of the detector.","AnomalyDetectorName":"The name of the detector.","KmsKeyArn":"The ARN of the KMS key to use to encrypt your data.","MetricSetList":"The detector\'s dataset."}},"AWS::LookoutMetrics::AnomalyDetector.AnomalyDetectorConfig":{"attributes":{},"description":"Contains information about a detector\'s configuration.","properties":{"AnomalyDetectorFrequency":"The frequency at which the detector analyzes its source data."}},"AWS::LookoutMetrics::AnomalyDetector.AppFlowConfig":{"attributes":{},"description":"Details about an Amazon AppFlow flow datasource.","properties":{"FlowName":"name of the flow.","RoleArn":"An IAM role that gives Amazon Lookout for Metrics permission to access the flow."}},"AWS::LookoutMetrics::AnomalyDetector.CloudwatchConfig":{"attributes":{},"description":"Details about an Amazon CloudWatch datasource.","properties":{"RoleArn":"An IAM role that gives Amazon Lookout for Metrics permission to access data in Amazon CloudWatch."}},"AWS::LookoutMetrics::AnomalyDetector.CsvFormatDescriptor":{"attributes":{},"description":"Contains information about how a source CSV data file should be analyzed.","properties":{"Charset":"The character set in which the source CSV file is written.","ContainsHeader":"Whether or not the source CSV file contains a header.","Delimiter":"The character used to delimit the source CSV file.","FileCompression":"The level of compression of the source CSV file.","HeaderList":"A list of the source CSV file\'s headers, if any.","QuoteSymbol":"The character used as a quote character."}},"AWS::LookoutMetrics::AnomalyDetector.FileFormatDescriptor":{"attributes":{},"description":"Contains information about a source file\'s formatting.","properties":{"CsvFormatDescriptor":"Contains information about how a source CSV data file should be analyzed.","JsonFormatDescriptor":"Contains information about how a source JSON data file should be analyzed."}},"AWS::LookoutMetrics::AnomalyDetector.JsonFormatDescriptor":{"attributes":{},"description":"Contains information about how a source JSON data file should be analyzed.","properties":{"Charset":"The character set in which the source JSON file is written.","FileCompression":"The level of compression of the source CSV file."}},"AWS::LookoutMetrics::AnomalyDetector.Metric":{"attributes":{},"description":"A calculation made by contrasting a measure and a dimension from your source data.","properties":{"AggregationFunction":"The function with which the metric is calculated.","MetricName":"The name of the metric.","Namespace":"The namespace for the metric."}},"AWS::LookoutMetrics::AnomalyDetector.MetricSet":{"attributes":{},"description":"Contains information about a dataset.","properties":{"DimensionList":"A list of the fields you want to treat as dimensions.","MetricList":"A list of metrics that the dataset will contain.","MetricSetDescription":"A description of the dataset you are creating.","MetricSetFrequency":"The frequency with which the source data will be analyzed for anomalies.","MetricSetName":"The name of the dataset.","MetricSource":"Contains information about how the source data should be interpreted.","Offset":"After an interval ends, the amount of seconds that the detector waits before importing data. Offset is only supported for S3, Redshift, Athena and datasources.","TimestampColumn":"Contains information about the column used for tracking time in your source data.","Timezone":"The time zone in which your source data was recorded."}},"AWS::LookoutMetrics::AnomalyDetector.MetricSource":{"attributes":{},"description":"Contains information about how the source data should be interpreted.","properties":{"AppFlowConfig":"Details about an AppFlow datasource.","CloudwatchConfig":"Details about an Amazon CloudWatch monitoring datasource.","RDSSourceConfig":"Details about an Amazon Relational Database Service (RDS) datasource.","RedshiftSourceConfig":"Details about an Amazon Redshift database datasource.","S3SourceConfig":"Contains information about the configuration of the S3 bucket that contains source files."}},"AWS::LookoutMetrics::AnomalyDetector.RDSSourceConfig":{"attributes":{},"description":"Contains information about the Amazon Relational Database Service (RDS) configuration.","properties":{"DBInstanceIdentifier":"A string identifying the database instance.","DatabaseHost":"The host name of the database.","DatabaseName":"The name of the RDS database.","DatabasePort":"The port number where the database can be accessed.","RoleArn":"The Amazon Resource Name (ARN) of the role.","SecretManagerArn":"The Amazon Resource Name (ARN) of the AWS Secrets Manager role.","TableName":"The name of the table in the database.","VpcConfiguration":"An object containing information about the Amazon Virtual Private Cloud (VPC) configuration."}},"AWS::LookoutMetrics::AnomalyDetector.RedshiftSourceConfig":{"attributes":{},"description":"Provides information about the Amazon Redshift database configuration.","properties":{"ClusterIdentifier":"A string identifying the Redshift cluster.","DatabaseHost":"The name of the database host.","DatabaseName":"The Redshift database name.","DatabasePort":"The port number where the database can be accessed.","RoleArn":"The Amazon Resource Name (ARN) of the role providing access to the database.","SecretManagerArn":"The Amazon Resource Name (ARN) of the AWS Secrets Manager role.","TableName":"The table name of the Redshift database.","VpcConfiguration":"Contains information about the Amazon Virtual Private Cloud (VPC) configuration."}},"AWS::LookoutMetrics::AnomalyDetector.S3SourceConfig":{"attributes":{},"description":"Contains information about the configuration of the S3 bucket that contains source files.","properties":{"FileFormatDescriptor":"Contains information about a source file\'s formatting.","HistoricalDataPathList":"A list of paths to the historical data files.","RoleArn":"The ARN of an IAM role that has read and write access permissions to the source S3 bucket.","TemplatedPathList":"A list of templated paths to the source files."}},"AWS::LookoutMetrics::AnomalyDetector.TimestampColumn":{"attributes":{},"description":"Contains information about the column used to track time in a source data file.","properties":{"ColumnFormat":"The format of the timestamp column.","ColumnName":"The name of the timestamp column."}},"AWS::LookoutMetrics::AnomalyDetector.VpcConfiguration":{"attributes":{},"description":"Contains configuration information about the Amazon Virtual Private Cloud (VPC).","properties":{"SecurityGroupIdList":"An array of strings containing the list of security groups.","SubnetIdList":"An array of strings containing the Amazon VPC subnet IDs (e.g., `subnet-0bb1c79de3EXAMPLE` ."}},"AWS::LookoutVision::Project":{"attributes":{"Arn":"Returns the Amazon Resource Name of the project.","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"CircuitBoardProject\\" }`\\n\\nFor the Amazon Lookout for Vision `CircuitBoardProject` , Ref returns the name of the project."},"description":"The `AWS::LookoutVision::Project` type creates an Amazon Lookout for Vision project. A project is a grouping of the resources needed to create and manage an Amazon Lookout for Vision model.","properties":{"ProjectName":"The name of the project."}},"AWS::M2::Application":{"attributes":{"ApplicationArn":"The Amazon Resource Name (ARN) of the application.","ApplicationId":"The identifier of the application.","Ref":"`Ref` returns the application Amazon Resource Name (ARN), such as the following:\\n\\n`{ \\"Ref\\": “SampleApp” }`\\n\\nReturns a value similar to the following:\\n\\n`arn:aws:m2:us-west-2:1234567890:app/y3ca6bhaife2bcvxar3lpivfou`"},"description":"Specifies a new application with given parameters. Requires an existing runtime environment and application definition file.\\n\\nFor information about application definitions, see the [AWS Mainframe Modernization User Guide](https://docs.aws.amazon.com/m2/latest/userguide/applications-m2-definition.html) .","properties":{"Definition":"The application definition for a particular application. You can specify either inline JSON or an Amazon S3 bucket location.\\n\\nFor information about application definitions, see the [AWS Mainframe Modernization User Guide](https://docs.aws.amazon.com/m2/latest/userguide/applications-m2-definition.html) .","Description":"The description of the application.","EngineType":"The type of the target platform for this application.","KmsKeyId":"The identifier of a customer managed key.","Name":"The name of the application.","RoleArn":"","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::M2::Application.Definition":{"attributes":{},"description":"The application definition for a particular application. You can specify either inline JSON or an Amazon S3 bucket location.","properties":{"Content":"The content of the application definition. This is a JSON object that contains the resource configuration/definitions that identify an application.","S3Location":"The S3 bucket that contains the application definition."}},"AWS::M2::Environment":{"attributes":{"EnvironmentArn":"The Amazon Resource Name (ARN) of the runtime environment.","EnvironmentId":"The unique identifier of the runtime environment.","Ref":"`Ref` returns the environment Amazon Resource Name (ARN), such as the following:\\n\\n`{ \\"Ref\\": “SampleEnv” }`\\n\\nReturns a value similar to the following:\\n\\n`arn:aws:m2:us-west-2:1234567890:env/y3ca6bhaife2bcvxar3lpivfou`"},"description":"Specifies a runtime environment for a given runtime engine.","properties":{"Description":"The description of the runtime environment.","EngineType":"The target platform for the runtime environment.","EngineVersion":"The version of the runtime engine.","HighAvailabilityConfig":"Defines the details of a high availability configuration.","InstanceType":"The instance type of the runtime environment.","KmsKeyId":"The identifier of a customer managed key.","Name":"The name of the runtime environment.","PreferredMaintenanceWindow":"Configures the maintenance window that you want for the runtime environment. The maintenance window must have the format `ddd:hh24:mi-ddd:hh24:mi` and must be less than 24 hours. The following two examples are valid maintenance windows: `sun:23:45-mon:00:15` or `sat:01:00-sat:03:00` .\\n\\nIf you do not provide a value, a random system-generated value will be assigned.","PubliclyAccessible":"Specifies whether the runtime environment is publicly accessible.","SecurityGroupIds":"The list of security groups for the VPC associated with this runtime environment.","StorageConfigurations":"Defines the storage configuration for a runtime environment.","SubnetIds":"The list of subnets associated with the VPC for this runtime environment.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::M2::Environment.EfsStorageConfiguration":{"attributes":{},"description":"Defines the storage configuration for an Amazon EFS file system.","properties":{"FileSystemId":"The file system identifier.","MountPoint":"The mount point for the file system."}},"AWS::M2::Environment.FsxStorageConfiguration":{"attributes":{},"description":"Defines the storage configuration for an Amazon FSx file system.","properties":{"FileSystemId":"The file system identifier.","MountPoint":"The mount point for the file system."}},"AWS::M2::Environment.HighAvailabilityConfig":{"attributes":{},"description":"Defines the details of a high availability configuration.","properties":{"DesiredCapacity":"The number of instances in a high availability configuration. The minimum possible value is 1 and the maximum is 100."}},"AWS::M2::Environment.StorageConfiguration":{"attributes":{},"description":"Defines the storage configuration for a runtime environment.","properties":{"Efs":"Defines the storage configuration for an Amazon EFS file system.","Fsx":"Defines the storage configuration for an Amazon FSx file system."}},"AWS::MSK::BatchScramSecret":{"attributes":{"Ref":""},"description":"","properties":{"ClusterArn":"","SecretArnList":""}},"AWS::MSK::Cluster":{"attributes":{"Arn":"","Ref":""},"description":"Creates a new MSK cluster. The following Python 3.6 examples shows how you can create a cluster that\'s distributed over two Availability Zones. Before you run this Python script, replace the example subnet and security-group IDs with the IDs of your subnets and security group. When you create an MSK cluster, its brokers get evenly distributed over a number of Availability Zones that\'s equal to the number of subnets that you specify in the `BrokerNodeGroupInfo` parameter. In this example, you can add a third subnet to get a cluster that\'s distributed over three Availability Zones.\\n\\n```PYTHON\\nimport boto3 client = boto3.client(\'kafka\') response = client.create_cluster( BrokerNodeGroupInfo={ \'BrokerAZDistribution\': \'DEFAULT\', \'ClientSubnets\': [ \'subnet-012345678901fedcba\', \'subnet-9876543210abcdef01\' ], \'InstanceType\': \'kafka.m5.large\', \'SecurityGroups\': [ \'sg-012345abcdef789789\' ] }, ClusterName=\'SalesCluster\', EncryptionInfo={ \'EncryptionInTransit\': { \'ClientBroker\': \'TLS_PLAINTEXT\', \'InCluster\': True } }, EnhancedMonitoring=\'PER_TOPIC_PER_BROKER\', KafkaVersion=\'2.2.1\', NumberOfBrokerNodes=2\\n) print(response)\\n```","properties":{"BrokerNodeGroupInfo":"Information about the broker nodes in the cluster.","ClientAuthentication":"Includes all client authentication related information.","ClusterName":"The name of the cluster.","ConfigurationInfo":"Represents the configuration that you want MSK to use for the cluster.","CurrentVersion":"The version of the cluster that you want to update.","EncryptionInfo":"Includes all encryption-related information.","EnhancedMonitoring":"Specifies the level of monitoring for the MSK cluster. The possible values are `DEFAULT` , `PER_BROKER` , and `PER_TOPIC_PER_BROKER` .","KafkaVersion":"The version of Apache Kafka. You can use Amazon MSK to create clusters that use Apache Kafka versions 1.1.1 and 2.2.1.","LoggingInfo":"Logging Info details.","NumberOfBrokerNodes":"The number of broker nodes in the cluster.","OpenMonitoring":"The settings for open monitoring.","StorageMode":"This controls storage mode for supported storage tiers.","Tags":"Create tags when creating the cluster."}},"AWS::MSK::Cluster.BrokerLogs":{"attributes":{},"description":"The broker logs configuration for this MSK cluster.","properties":{"CloudWatchLogs":"Details of the CloudWatch Logs destination for broker logs.","Firehose":"Details of the Kinesis Data Firehose delivery stream that is the destination for broker logs.","S3":"Details of the Amazon S3 destination for broker logs."}},"AWS::MSK::Cluster.BrokerNodeGroupInfo":{"attributes":{},"description":"Describes the setup to be used for the broker nodes in the cluster.","properties":{"BrokerAZDistribution":"This parameter is currently not in use.","ClientSubnets":"The list of subnets to connect to in the client virtual private cloud (VPC). Amazon creates elastic network interfaces inside these subnets. Client applications use elastic network interfaces to produce and consume data.\\n\\nIf you use the US West (N. California) Region, specify exactly two subnets. For other Regions where Amazon MSK is available, you can specify either two or three subnets. The subnets that you specify must be in distinct Availability Zones. When you create a cluster, Amazon MSK distributes the broker nodes evenly across the subnets that you specify.\\n\\nClient subnets can\'t occupy the Availability Zone with ID `use1-az3` .","ConnectivityInfo":"Information about the cluster\'s connectivity setting.","InstanceType":"The type of Amazon EC2 instances to use for brokers. The following instance types are allowed: kafka.m5.large, kafka.m5.xlarge, kafka.m5.2xlarge, kafka.m5.4xlarge, kafka.m5.8xlarge, kafka.m5.12xlarge, kafka.m5.16xlarge, and kafka.m5.24xlarge, and kafka.t3.small.","SecurityGroups":"The security groups to associate with the elastic network interfaces in order to specify who can connect to and communicate with the Amazon MSK cluster. If you don\'t specify a security group, Amazon MSK uses the default security group associated with the VPC. If you specify security groups that were shared with you, you must ensure that you have permissions to them. Specifically, you need the `ec2:DescribeSecurityGroups` permission.","StorageInfo":"Contains information about storage volumes attached to Amazon MSK broker nodes."}},"AWS::MSK::Cluster.ClientAuthentication":{"attributes":{},"description":"Includes all client authentication information.","properties":{"Sasl":"Details for client authentication using SASL. To turn on SASL, you must also turn on `EncryptionInTransit` by setting `inCluster` to true. You must set `clientBroker` to either `TLS` or `TLS_PLAINTEXT` . If you choose `TLS_PLAINTEXT` , then you must also set `unauthenticated` to true.","Tls":"Details for ClientAuthentication using TLS. To turn on TLS access control, you must also turn on `EncryptionInTransit` by setting `inCluster` to true and `clientBroker` to `TLS` .","Unauthenticated":"Details for ClientAuthentication using no authentication."}},"AWS::MSK::Cluster.CloudWatchLogs":{"attributes":{},"description":"Details of the CloudWatch Logs destination for broker logs.","properties":{"Enabled":"Specifies whether broker logs get sent to the specified CloudWatch Logs destination.","LogGroup":"The CloudWatch log group that is the destination for broker logs."}},"AWS::MSK::Cluster.ConfigurationInfo":{"attributes":{},"description":"Specifies the configuration to use for the brokers.","properties":{"Arn":"ARN of the configuration to use.","Revision":"The revision of the configuration to use."}},"AWS::MSK::Cluster.ConnectivityInfo":{"attributes":{},"description":"Broker access controls.","properties":{"PublicAccess":"Access control settings for the cluster\'s brokers.","VpcConnectivity":"VPC connection control settings for brokers"}},"AWS::MSK::Cluster.EBSStorageInfo":{"attributes":{},"description":"Contains information about the EBS storage volumes attached to the broker nodes.","properties":{"ProvisionedThroughput":"EBS volume provisioned throughput information.","VolumeSize":"The size in GiB of the EBS volume for the data drive on each broker node."}},"AWS::MSK::Cluster.EncryptionAtRest":{"attributes":{},"description":"The data-volume encryption details. You can\'t update encryption at rest settings for existing clusters.","properties":{"DataVolumeKMSKeyId":"The ARN of the Amazon KMS key for encrypting data at rest. If you don\'t specify a KMS key, MSK creates one for you and uses it."}},"AWS::MSK::Cluster.EncryptionInTransit":{"attributes":{},"description":"The settings for encrypting data in transit.","properties":{"ClientBroker":"Indicates the encryption setting for data in transit between clients and brokers. You must set it to one of the following values.\\n\\n`TLS` means that client-broker communication is enabled with TLS only.\\n\\n`TLS_PLAINTEXT` means that client-broker communication is enabled for both TLS-encrypted, as well as plaintext data.\\n\\n`PLAINTEXT` means that client-broker communication is enabled in plaintext only.\\n\\nThe default value is `TLS` .","InCluster":"When set to true, it indicates that data communication among the broker nodes of the cluster is encrypted. When set to false, the communication happens in plaintext.\\n\\nThe default value is true."}},"AWS::MSK::Cluster.EncryptionInfo":{"attributes":{},"description":"Includes encryption-related information, such as the Amazon KMS key used for encrypting data at rest and whether you want MSK to encrypt your data in transit.","properties":{"EncryptionAtRest":"The data-volume encryption details.","EncryptionInTransit":"The details for encryption in transit."}},"AWS::MSK::Cluster.Firehose":{"attributes":{},"description":"Firehose details for BrokerLogs.","properties":{"DeliveryStream":"The Kinesis Data Firehose delivery stream that is the destination for broker logs.","Enabled":"Specifies whether broker logs get send to the specified Kinesis Data Firehose delivery stream."}},"AWS::MSK::Cluster.Iam":{"attributes":{},"description":"Details for SASL/IAM client authentication.","properties":{"Enabled":"SASL/IAM authentication is enabled or not."}},"AWS::MSK::Cluster.JmxExporter":{"attributes":{},"description":"Indicates whether you want to enable or disable the JMX Exporter.","properties":{"EnabledInBroker":"Indicates whether you want to enable or disable the JMX Exporter."}},"AWS::MSK::Cluster.LoggingInfo":{"attributes":{},"description":"You can configure your MSK cluster to send broker logs to different destination types. This is a container for the configuration details related to broker logs.","properties":{"BrokerLogs":"You can configure your MSK cluster to send broker logs to different destination types. This configuration specifies the details of these destinations."}},"AWS::MSK::Cluster.NodeExporter":{"attributes":{},"description":"Indicates whether you want to enable or disable the Node Exporter.","properties":{"EnabledInBroker":"Indicates whether you want to enable or disable the Node Exporter."}},"AWS::MSK::Cluster.OpenMonitoring":{"attributes":{},"description":"JMX and Node monitoring for the MSK cluster.","properties":{"Prometheus":"Prometheus exporter settings."}},"AWS::MSK::Cluster.Prometheus":{"attributes":{},"description":"Prometheus settings for open monitoring.","properties":{"JmxExporter":"Indicates whether you want to enable or disable the JMX Exporter.","NodeExporter":"Indicates whether you want to enable or disable the Node Exporter."}},"AWS::MSK::Cluster.ProvisionedThroughput":{"attributes":{},"description":"Contains information about provisioned throughput for EBS storage volumes attached to kafka broker nodes.","properties":{"Enabled":"Provisioned throughput is enabled or not.","VolumeThroughput":"Throughput value of the EBS volumes for the data drive on each kafka broker node in MiB per second."}},"AWS::MSK::Cluster.PublicAccess":{"attributes":{},"description":"Broker access controls","properties":{"Type":"DISABLED means that public access is turned off. SERVICE_PROVIDED_EIPS means that public access is turned on."}},"AWS::MSK::Cluster.S3":{"attributes":{},"description":"The details of the Amazon S3 destination for broker logs.","properties":{"Bucket":"The name of the S3 bucket that is the destination for broker logs.","Enabled":"Specifies whether broker logs get sent to the specified Amazon S3 destination.","Prefix":"The S3 prefix that is the destination for broker logs."}},"AWS::MSK::Cluster.Sasl":{"attributes":{},"description":"Details for client authentication using SASL. To turn on SASL, you must also turn on `EncryptionInTransit` by setting `inCluster` to true. You must set `clientBroker` to either `TLS` or `TLS_PLAINTEXT` . If you choose `TLS_PLAINTEXT` , then you must also set `unauthenticated` to true.","properties":{"Iam":"Details for ClientAuthentication using IAM.","Scram":"Details for SASL/SCRAM client authentication."}},"AWS::MSK::Cluster.Scram":{"attributes":{},"description":"Details for SASL/SCRAM client authentication.","properties":{"Enabled":"SASL/SCRAM authentication is enabled or not."}},"AWS::MSK::Cluster.StorageInfo":{"attributes":{},"description":"Contains information about storage volumes attached to Amazon MSK broker nodes.","properties":{"EBSStorageInfo":"EBS volume information."}},"AWS::MSK::Cluster.Tls":{"attributes":{},"description":"Details for client authentication using TLS.","properties":{"CertificateAuthorityArnList":"List of AWS Private CA ARNs.","Enabled":"TLS authentication is enabled or not."}},"AWS::MSK::Cluster.Unauthenticated":{"attributes":{},"description":"Details for allowing no client authentication.","properties":{"Enabled":"Unauthenticated is enabled or not."}},"AWS::MSK::Cluster.VpcConnectivity":{"attributes":{},"description":"VPC connection control settings for brokers.","properties":{"ClientAuthentication":"VPC connection control settings for brokers."}},"AWS::MSK::Cluster.VpcConnectivityClientAuthentication":{"attributes":{},"description":"Includes all client authentication information for VpcConnectivity.","properties":{"Sasl":"Details for VpcConnectivity ClientAuthentication using SASL.","Tls":"Details for VpcConnectivity ClientAuthentication using TLS."}},"AWS::MSK::Cluster.VpcConnectivityIam":{"attributes":{},"description":"Details for SASL/IAM client authentication for VpcConnectivity.","properties":{"Enabled":"SASL/IAM authentication is enabled or not."}},"AWS::MSK::Cluster.VpcConnectivitySasl":{"attributes":{},"description":"Details for client authentication using SASL for VpcConnectivity.","properties":{"Iam":"Details for ClientAuthentication using IAM for VpcConnectivity.","Scram":"Details for SASL/SCRAM client authentication for VpcConnectivity."}},"AWS::MSK::Cluster.VpcConnectivityScram":{"attributes":{},"description":"Details for SASL/SCRAM client authentication for vpcConnectivity.","properties":{"Enabled":"SASL/SCRAM authentication is enabled or not."}},"AWS::MSK::Cluster.VpcConnectivityTls":{"attributes":{},"description":"Details for client authentication using TLS for vpcConnectivity.","properties":{"Enabled":"TLS authentication is enabled or not."}},"AWS::MSK::ClusterPolicy":{"attributes":{"CurrentVersion":"The current version of the policy attached to the specified cluster.","Ref":"`Ref` returns the ARN of the cluster for the resource policy.\\n\\nFor Amazon MSK cluster policy `MyClusterPolicy` , `Ref` returns the cluster ARN for the resource policy whose logical ID is `MyClusterPolicy` ."},"description":"Create or update cluster policy.","properties":{"ClusterArn":"The Amazon Resource Name (ARN) that uniquely identifies the cluster.","Policy":"Resource policy for the cluster."}},"AWS::MSK::Configuration":{"attributes":{"Arn":"","Ref":""},"description":"Creates a new MSK configuration. To see an example of how to use this operation, first save the following text to a file and name the file config-file.txt .\\n\\n`auto.create.topics.enable = true zookeeper.connection.timeout.ms = 1000 log.roll.ms = 604800000` \\n\\nNow run the following Python 3.6 script in the folder where you saved config-file.txt . This script uses the properties specified in config-file.txt to create a configuration named `SalesClusterConfiguration` . This configuration can work with Apache Kafka versions 1.1.1 and 2.1.0.\\n\\n```PYTHON\\nimport boto3 client = boto3.client(\'kafka\') config_file = open(\'config-file.txt\', \'r\') server_properties = config_file.read() response = client.create_configuration( Name=\'SalesClusterConfiguration\', Description=\'The configuration to use on all sales clusters.\', KafkaVersions=[\'1.1.1\', \'2.1.0\'], ServerProperties=server_properties\\n) print(response)\\n```","properties":{"Description":"The description of the configuration.","KafkaVersionsList":"","Name":"The name of the configuration. Configuration names are strings that match the regex \\"^[0-9A-Za-z][0-9A-Za-z-]{0,}$\\".","ServerProperties":"Contents of the server.properties file. When using the API, you must ensure that the contents of the file are base64 encoded. When using the console, the SDK, or the CLI, the contents of server.properties can be in plaintext."}},"AWS::MSK::ServerlessCluster":{"attributes":{"Arn":"","Ref":""},"description":"","properties":{"ClientAuthentication":"","ClusterName":"","Tags":"","VpcConfigs":""}},"AWS::MSK::ServerlessCluster.ClientAuthentication":{"attributes":{},"description":"Includes all client authentication information.","properties":{"Sasl":"Details for client authentication using SASL. To turn on SASL, you must also turn on `EncryptionInTransit` by setting `inCluster` to true. You must set `clientBroker` to either `TLS` or `TLS_PLAINTEXT` . If you choose `TLS_PLAINTEXT` , then you must also set `unauthenticated` to true."}},"AWS::MSK::ServerlessCluster.Iam":{"attributes":{},"description":"Details for SASL/IAM client authentication.","properties":{"Enabled":"SASL/IAM authentication is enabled or not."}},"AWS::MSK::ServerlessCluster.Sasl":{"attributes":{},"description":"Details for client authentication using SASL. To turn on SASL, you must also turn on `EncryptionInTransit` by setting `inCluster` to true. You must set `clientBroker` to either `TLS` or `TLS_PLAINTEXT` . If you choose `TLS_PLAINTEXT` , then you must also set `unauthenticated` to true.","properties":{"Iam":"Details for ClientAuthentication using IAM."}},"AWS::MSK::ServerlessCluster.VpcConfig":{"attributes":{},"description":"","properties":{"SecurityGroups":"","SubnetIds":""}},"AWS::MSK::VpcConnection":{"attributes":{"Arn":"The ARN of the VPC connection.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the VPC connection.\\n\\nFor Amazon MSK VPC connection `MyVpcConnection` , `Ref` returns the ARN of the VPC connection whose logical ID is `MyVpcConnection` ."},"description":"Create remote VPC connection.","properties":{"Authentication":"The type of private link authentication.","ClientSubnets":"The list of subnets in the client VPC to connect to.","SecurityGroups":"The security groups to attach to the ENIs for the broker nodes.","Tags":"Create tags when creating the VPC connection.","TargetClusterArn":"The Amazon Resource Name (ARN) of the cluster.","VpcId":"The VPC id of the remote client."}},"AWS::MWAA::Environment":{"attributes":{"Arn":"The ARN for the Amazon MWAA environment.","LoggingConfiguration.DagProcessingLogs.CloudWatchLogGroupArn":"The ARN for the CloudWatch Logs group where the Apache Airflow DAG processing logs are published.","LoggingConfiguration.SchedulerLogs.CloudWatchLogGroupArn":"The ARN for the CloudWatch Logs group where the Apache Airflow Scheduler logs are published.","LoggingConfiguration.TaskLogs.CloudWatchLogGroupArn":"The ARN for the CloudWatch Logs group where the Apache Airflow task logs are published.","LoggingConfiguration.WebserverLogs.CloudWatchLogGroupArn":"The ARN for the CloudWatch Logs group where the Apache Airflow Web server logs are published.","LoggingConfiguration.WorkerLogs.CloudWatchLogGroupArn":"The ARN for the CloudWatch Logs group where the Apache Airflow Worker logs are published.","Ref":"`Ref` returns the environment details.","WebserverUrl":"The URL of your Apache Airflow UI."},"description":"The `AWS::MWAA::Environment` resource creates an Amazon Managed Workflows for Apache Airflow (MWAA) environment.","properties":{"AirflowConfigurationOptions":"A list of key-value pairs containing the Airflow configuration options for your environment. For example, `core.default_timezone: utc` . To learn more, see [Apache Airflow configuration options](https://docs.aws.amazon.com/mwaa/latest/userguide/configuring-env-variables.html) .","AirflowVersion":"The version of Apache Airflow to use for the environment. If no value is specified, defaults to the latest version.\\n\\n*Allowed Values* : `2.0.2` | `1.10.12` | `2.2.2` | `2.4.3` | `2.5.1` (latest)","DagS3Path":"The relative path to the DAGs folder on your Amazon S3 bucket. For example, `dags` . To learn more, see [Adding or updating DAGs](https://docs.aws.amazon.com/mwaa/latest/userguide/configuring-dag-folder.html) .","EnvironmentClass":"The environment class type. Valid values: `mw1.small` , `mw1.medium` , `mw1.large` . To learn more, see [Amazon MWAA environment class](https://docs.aws.amazon.com/mwaa/latest/userguide/environment-class.html) .","ExecutionRoleArn":"The Amazon Resource Name (ARN) of the execution role in IAM that allows MWAA to access AWS resources in your environment. For example, `arn:aws:iam::123456789:role/my-execution-role` . To learn more, see [Amazon MWAA Execution role](https://docs.aws.amazon.com/mwaa/latest/userguide/mwaa-create-role.html) .","KmsKey":"The AWS Key Management Service (KMS) key to encrypt and decrypt the data in your environment. You can use an AWS KMS key managed by MWAA, or a customer-managed KMS key (advanced).","LoggingConfiguration":"The Apache Airflow logs being sent to CloudWatch Logs: `DagProcessingLogs` , `SchedulerLogs` , `TaskLogs` , `WebserverLogs` , `WorkerLogs` .","MaxWorkers":"The maximum number of workers that you want to run in your environment. MWAA scales the number of Apache Airflow workers up to the number you specify in the `MaxWorkers` field. For example, `20` . When there are no more tasks running, and no more in the queue, MWAA disposes of the extra workers leaving the one worker that is included with your environment, or the number you specify in `MinWorkers` .","MinWorkers":"The minimum number of workers that you want to run in your environment. MWAA scales the number of Apache Airflow workers up to the number you specify in the `MaxWorkers` field. When there are no more tasks running, and no more in the queue, MWAA disposes of the extra workers leaving the worker count you specify in the `MinWorkers` field. For example, `2` .","Name":"The name of your Amazon MWAA environment.","NetworkConfiguration":"The VPC networking components used to secure and enable network traffic between the AWS resources for your environment. To learn more, see [About networking on Amazon MWAA](https://docs.aws.amazon.com/mwaa/latest/userguide/networking-about.html) .","PluginsS3ObjectVersion":"The version of the plugins.zip file on your Amazon S3 bucket. To learn more, see [Installing custom plugins](https://docs.aws.amazon.com/mwaa/latest/userguide/configuring-dag-import-plugins.html) .","PluginsS3Path":"The relative path to the `plugins.zip` file on your Amazon S3 bucket. For example, `plugins.zip` . To learn more, see [Installing custom plugins](https://docs.aws.amazon.com/mwaa/latest/userguide/configuring-dag-import-plugins.html) .","RequirementsS3ObjectVersion":"The version of the requirements.txt file on your Amazon S3 bucket. To learn more, see [Installing Python dependencies](https://docs.aws.amazon.com/mwaa/latest/userguide/working-dags-dependencies.html) .","RequirementsS3Path":"The relative path to the `requirements.txt` file on your Amazon S3 bucket. For example, `requirements.txt` . To learn more, see [Installing Python dependencies](https://docs.aws.amazon.com/mwaa/latest/userguide/working-dags-dependencies.html) .","Schedulers":"The number of schedulers that you want to run in your environment. Valid values:\\n\\n- *v2* - Accepts between 2 to 5. Defaults to 2.\\n- *v1* - Accepts 1.","SourceBucketArn":"The Amazon Resource Name (ARN) of the Amazon S3 bucket where your DAG code and supporting files are stored. For example, `arn:aws:s3:::my-airflow-bucket-unique-name` . To learn more, see [Create an Amazon S3 bucket for Amazon MWAA](https://docs.aws.amazon.com/mwaa/latest/userguide/mwaa-s3-bucket.html) .","StartupScriptS3ObjectVersion":"The version of the startup shell script in your Amazon S3 bucket. You must specify the [version ID](https://docs.aws.amazon.com/AmazonS3/latest/userguide/versioning-workflows.html) that Amazon S3 assigns to the file every time you update the script.\\n\\nVersion IDs are Unicode, UTF-8 encoded, URL-ready, opaque strings that are no more than 1,024 bytes long. The following is an example:\\n\\n`3sL4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo`\\n\\nFor more information, see [Using a startup script](https://docs.aws.amazon.com/mwaa/latest/userguide/using-startup-script.html) .","StartupScriptS3Path":"The relative path to the startup shell script in your Amazon S3 bucket. For example, `s3://mwaa-environment/startup.sh` .\\n\\nAmazon MWAA runs the script as your environment starts, and before running the Apache Airflow process. You can use this script to install dependencies, modify Apache Airflow configuration options, and set environment variables. For more information, see [Using a startup script](https://docs.aws.amazon.com/mwaa/latest/userguide/using-startup-script.html) .","Tags":"The key-value tag pairs associated to your environment. For example, `\\"Environment\\": \\"Staging\\"` . To learn more, see [Tagging](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) .","WebserverAccessMode":"The Apache Airflow *Web server* access mode. To learn more, see [Apache Airflow access modes](https://docs.aws.amazon.com/mwaa/latest/userguide/configuring-networking.html) . Valid values: `PRIVATE_ONLY` or `PUBLIC_ONLY` .","WeeklyMaintenanceWindowStart":"The day and time of the week to start weekly maintenance updates of your environment in the following format: `DAY:HH:MM` . For example: `TUE:03:30` . You can specify a start time in 30 minute increments only. Supported input includes the following:\\n\\n- MON|TUE|WED|THU|FRI|SAT|SUN:([01]\\\\\\\\d|2[0-3]):(00|30)"}},"AWS::MWAA::Environment.LoggingConfiguration":{"attributes":{},"description":"The type of Apache Airflow logs to send to CloudWatch Logs.","properties":{"DagProcessingLogs":"Defines the processing logs sent to CloudWatch Logs and the logging level to send.","SchedulerLogs":"Defines the scheduler logs sent to CloudWatch Logs and the logging level to send.","TaskLogs":"Defines the task logs sent to CloudWatch Logs and the logging level to send.","WebserverLogs":"Defines the web server logs sent to CloudWatch Logs and the logging level to send.","WorkerLogs":"Defines the worker logs sent to CloudWatch Logs and the logging level to send."}},"AWS::MWAA::Environment.ModuleLoggingConfiguration":{"attributes":{},"description":"Defines the type of logs to send for the Apache Airflow log type (e.g. `DagProcessingLogs` ).","properties":{"CloudWatchLogGroupArn":"The ARN of the CloudWatch Logs log group for each type of Apache Airflow log type that you have enabled.\\n\\n> `CloudWatchLogGroupArn` is available only as a return value, accessible when specified as an attribute in the [`Fn:GetAtt`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#aws-resource-mwaa-environment-return-values) intrinsic function. Any value you provide for `CloudWatchLogGroupArn` is discarded by Amazon MWAA.","Enabled":"Indicates whether to enable the Apache Airflow log type (e.g. `DagProcessingLogs` ) in CloudWatch Logs.","LogLevel":"Defines the Apache Airflow logs to send for the log type (e.g. `DagProcessingLogs` ) to CloudWatch Logs. Valid values: `CRITICAL` , `ERROR` , `WARNING` , `INFO` ."}},"AWS::MWAA::Environment.NetworkConfiguration":{"attributes":{},"description":"The VPC networking components used to secure and enable network traffic between the AWS resources for your environment. To learn more, see [About networking on Amazon MWAA](https://docs.aws.amazon.com/mwaa/latest/userguide/networking-about.html) .","properties":{"SecurityGroupIds":"A list of one or more security group IDs. Accepts up to 5 security group IDs. A security group must be attached to the same VPC as the subnets. To learn more, see [Security in your VPC on Amazon MWAA](https://docs.aws.amazon.com/mwaa/latest/userguide/vpc-security.html) .","SubnetIds":"A list of subnet IDs. *Required* to create an environment. Must be private subnets in two different availability zones. A subnet must be attached to the same VPC as the security group. To learn more, see [About networking on Amazon MWAA](https://docs.aws.amazon.com/mwaa/latest/userguide/networking-about.html) ."}},"AWS::Macie::AllowList":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the allow list.","Id":"The unique identifier for the allow list.","Ref":"`Ref` returns the ID of the `AllowList` . For example, `{ \\"Ref\\": \\"AllowList\\" }` .","Status":"The current status of the allow list, which indicates whether Amazon Macie can access and use the list\'s criteria. If the list\'s criteria specify a regular expression ( `Regex` ), this value is typically `OK` . Macie can compile the expression. If the list\'s criteria specify an Amazon S3 object ( `S3WordsList` ), possible values are:\\n\\n- `OK` - Macie can retrieve and parse the contents of the object.\\n- `S3_OBJECT_ACCESS_DENIED` - Macie isn\'t allowed to access the object or the object is encrypted with a customer managed AWS KMS key that Macie isn\'t allowed to use. Check the bucket policy and other permissions settings for the bucket and the object. If the object is encrypted, also ensure that it\'s encrypted with a key that Macie is allowed to use.\\n- `S3_OBJECT_EMPTY` - Macie can retrieve the object but the object doesn\'t contain any content. Ensure that the object contains the correct entries. Also ensure that the list\'s criteria specify the correct bucket and object names.\\n- `S3_OBJECT_NOT_FOUND` - The object doesn\'t exist in Amazon S3 . Ensure that the list\'s criteria specify the correct bucket and object names.\\n- `S3_OBJECT_OVERSIZE` - Macie can retrieve the object. However, the object contains too many entries or its storage size exceeds the quota for an allow list. Try breaking the list into multiple files and ensure that each file doesn\'t exceed any quotas. Then configure list settings in Macie for each file.\\n- `S3_THROTTLED` - Amazon S3 throttled the request to retrieve the object. Wait a few minutes and then try again.\\n- `S3_USER_ACCESS_DENIED` - Amazon S3 denied the request to retrieve the object. If the specified object exists, you\'re not allowed to access it or it\'s encrypted with an AWS KMS key that you\'re not allowed to use. Work with your AWS administrator to ensure that the list\'s criteria specify the correct bucket and object names, and you have read access to the bucket and the object. If the object is encrypted, also ensure that it\'s encrypted with a key that you\'re allowed to use.\\n- `UNKNOWN_ERROR` - A transient or internal error occurred when Macie attempted to retrieve or parse the object. Wait a few minutes and then try again. A list can also have this status if it\'s encrypted with a key that Amazon S3 and Macie can\'t access or use.\\n\\nFor more information, see [Allow list options and requirements](https://docs.aws.amazon.com/macie/latest/user/allow-lists-options.html) in the *Amazon Macie User Guide* ."},"description":"The `AWS::Macie::AllowList` resource specifies an allow list. In Amazon Macie , an allow list defines specific text or a text pattern for Macie to ignore when it inspects data sources for sensitive data. If data matches text or a text pattern in an allow list, Macie doesn’t report the data in sensitive data findings or sensitive data discovery results, even if the data matches the criteria of a custom data identifier or a managed data identifier. You can create and use allow lists in all the AWS Regions where Macie is currently available except the Asia Pacific (Osaka) Region.\\n\\nMacie supports two types of allow lists:\\n\\n- *Predefined text* - For this type of list ( `S3WordsList` ), you create a line-delimited plaintext file that lists specific text to ignore, and you store the file in an Amazon Simple Storage Service ( Amazon S3 ) bucket. You then configure settings for Macie to access the list in the bucket.\\n\\nThis type of list typically contains specific words, phrases, and other kinds of character sequences that aren’t sensitive, aren\'t likely to change, and don’t necessarily adhere to a common pattern. If you use this type of list, Macie doesn\'t report occurrences of text that exactly match a complete entry in the list. Macie treats each entry in the list as a string literal value. Matches aren\'t case sensitive.\\n- *Regular expression* - For this type of list ( `Regex` ), you specify a regular expression that defines a text pattern to ignore. Unlike an allow list with predefined text, you store the regex and all other list settings in Macie .\\n\\nThis type of list is helpful if you want to specify text that isn’t sensitive but varies or is likely to change while also adhering to a common pattern. If you use this type of list, Macie doesn\'t report occurrences of text that completely match the pattern defined by the list.\\n\\nFor more information, see [Defining sensitive data exceptions with allow lists](https://docs.aws.amazon.com/macie/latest/user/allow-lists.html) in the *Amazon Macie User Guide* .\\n\\nAn `AWS::Macie::Session` resource must exist for an AWS account before you can create an `AWS::Macie::AllowList` resource for the account. Use a [DependsOn attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) to ensure that an `AWS::Macie::Session` resource is created before other Macie resources are created for an account. For example, `\\"DependsOn\\": \\"Session\\"` .","properties":{"Criteria":"The criteria that specify the text or text pattern to ignore. The criteria can be the location and name of an Amazon S3 object that lists specific text to ignore ( `S3WordsList` ), or a regular expression ( `Regex` ) that defines a text pattern to ignore.","Description":"A custom description of the allow list. The description can contain 1-512 characters.","Name":"A custom name for the allow list. The name can contain 1-128 characters.","Tags":"An array of key-value pairs to apply to the allow list.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::Macie::AllowList.Criteria":{"attributes":{},"description":"Specifies the criteria for an allow list, which is a list that defines specific text or a text pattern to ignore when inspecting data sources for sensitive data. The criteria can be:\\n\\n- The location and name of an Amazon Simple Storage Service ( Amazon S3 ) object that lists specific, predefined text to ignore ( `S3WordsList` ), or\\n- A regular expression ( `Regex` ) that defines a text pattern to ignore.\\n\\nThe criteria must specify either an S3 object or a regular expression. It can\'t specify both.","properties":{"Regex":"The regular expression ( *regex* ) that defines the text pattern to ignore. The expression can contain 1-512 characters.","S3WordsList":"The location and name of an Amazon S3 object that lists specific text to ignore."}},"AWS::Macie::AllowList.S3WordsList":{"attributes":{},"description":"Specifies the location and name of an Amazon Simple Storage Service ( Amazon S3 ) object that lists specific, predefined text to ignore when inspecting data sources for sensitive data.","properties":{"BucketName":"The full name of the S3 bucket that contains the object. This value correlates to the `Name` field of a bucket\'s properties in Amazon S3 .\\n\\nThis value is case sensitive. In addition, don\'t use wildcard characters or specify partial values for the name.","ObjectKey":"The full name of the S3 object. This value correlates to the `Key` field of an object\'s properties in Amazon S3 . If the name includes a path, include the complete path. For example, `AllowLists/Macie/MyList.txt` .\\n\\nThis value is case sensitive. In addition, don\'t use wildcard characters or specify partial values for the name."}},"AWS::Macie::CustomDataIdentifier":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the custom data identifier.","Id":"The unique identifier for the custom data identifier.","Ref":"`Ref` returns the ID of the `CustomDataIdentifier` . For example, `{ \\"Ref\\": \\"CustomDataIdentifier\\" }`"},"description":"The `AWS::Macie::CustomDataIdentifier` resource specifies a custom data identifier. A *custom data identifier* is a set of custom criteria for Amazon Macie to use when it inspects data sources for sensitive data. The criteria consist of a regular expression ( *regex* ) that defines a text pattern to match and, optionally, character sequences and a proximity rule that refine the results. The character sequences can be:\\n\\n- *Keywords* , which are words or phrases that must be in proximity of text that matches the regex, or\\n- *Ignore words* , which are words or phrases to exclude from the results.\\n\\nBy using custom data identifiers, you can supplement the managed data identifiers that Macie provides and detect sensitive data that reflects your particular scenarios, intellectual property, or proprietary data. For more information, see [Building custom data identifiers](https://docs.aws.amazon.com/macie/latest/user/custom-data-identifiers.html) in the *Amazon Macie User Guide* .\\n\\nAn `AWS::Macie::Session` resource must exist for an AWS account before you can create an `AWS::Macie::CustomDataIdentifier` resource for the account. Use a [DependsOn attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) to ensure that an `AWS::Macie::Session` resource is created before other Macie resources are created for an account. For example, `\\"DependsOn\\": \\"Session\\"` .","properties":{"Description":"A custom description of the custom data identifier. The description can contain 1-512 characters.\\n\\nAvoid including sensitive data in the description. Users of the account might be able to see the description, depending on the actions that they\'re allowed to perform in Amazon Macie .","IgnoreWords":"An array of character sequences ( *ignore words* ) to exclude from the results. If text matches the regular expression ( `Regex` ) but it contains a string in this array, Amazon Macie ignores the text and doesn\'t include it in the results.\\n\\nThe array can contain 1-10 ignore words. Each ignore word can contain 4-90 UTF-8 characters. Ignore words are case sensitive.","Keywords":"An array of character sequences ( *keywords* ), one of which must precede and be in proximity ( `MaximumMatchDistance` ) of the regular expression ( `Regex` ) to match.\\n\\nThe array can contain 1-50 keywords. Each keyword can contain 3-90 UTF-8 characters. Keywords aren\'t case sensitive.","MaximumMatchDistance":"The maximum number of characters that can exist between the end of at least one complete character sequence specified by the `Keywords` array and the end of text that matches the regular expression ( `Regex` ). If a complete keyword precedes all the text that matches the regular expression and the keyword is within the specified distance, Amazon Macie includes the result.\\n\\nThe distance can be 1-300 characters. The default value is 50.","Name":"A custom name for the custom data identifier. The name can contain 1-128 characters.\\n\\nAvoid including sensitive data in the name of a custom data identifier. Users of the account might be able to see the name, depending on the actions that they\'re allowed to perform in Amazon Macie .","Regex":"The regular expression ( *regex* ) that defines the text pattern to match. The expression can contain 1-512 characters."}},"AWS::Macie::FindingsFilter":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the findings filter.","Id":"The unique identifier for the findings filter.","Ref":"`Ref` returns the ID of the `FindingsFilter` . For example, `{ \\"Ref\\": \\"FindingsFilter\\" }` ."},"description":"The `AWS::Macie::FindingsFilter` resource specifies a findings filter. In Amazon Macie , a *findings filter* , also referred to as a *filter rule* , is a set of custom criteria that specifies which findings to include or exclude from the results of a query for findings. The criteria can help you identify and focus on findings that have specific characteristics, such as severity, type, or the name of an affected AWS resource. You can also configure a findings filter to suppress (automatically archive) findings that match the filter\'s criteria. For more information, see [Filtering findings](https://docs.aws.amazon.com/macie/latest/user/findings-filter-overview.html) in the *Amazon Macie User Guide* .\\n\\nAn `AWS::Macie::Session` resource must exist for an AWS account before you can create an `AWS::Macie::FindingsFilter` resource for the account. Use a [DependsOn attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) to ensure that an `AWS::Macie::Session` resource is created before other Macie resources are created for an account. For example, `\\"DependsOn\\": \\"Session\\"` .","properties":{"Action":"The action to perform on findings that match the filter criteria ( `FindingCriteria` ). Valid values are:\\n\\n- `ARCHIVE` - Suppress (automatically archive) the findings.\\n- `NOOP` - Don\'t perform any action on the findings.","Description":"A custom description of the findings filter. The description can contain 1-512 characters.\\n\\nAvoid including sensitive data in the description. Users of the account might be able to see the description, depending on the actions that they\'re allowed to perform in Amazon Macie .","FindingCriteria":"The criteria to use to filter findings.","Name":"A custom name for the findings filter. The name can contain 3-64 characters.\\n\\nAvoid including sensitive data in the name. Users of the account might be able to see the name, depending on the actions that they\'re allowed to perform in Amazon Macie .","Position":"The position of the findings filter in the list of saved filters on the Amazon Macie console. This value also determines the order in which the filter is applied to findings, relative to other filters that are also applied to findings."}},"AWS::Macie::FindingsFilter.CriterionAdditionalProperties":{"attributes":{},"description":"Specifies a condition that defines the property, operator, and one or more values to use in a findings filter. A *findings filter* , also referred to as a *filter rule* , is a set of custom criteria that specifies which findings to include or exclude from the results of a query for findings. You can also configure a findings filter to suppress (automatically archive) findings that match the filter\'s criteria. For more information, see [Filtering findings](https://docs.aws.amazon.com/macie/latest/user/findings-filter-overview.html) in the *Amazon Macie User Guide* .","properties":{"eq":"The value for the specified property matches (equals) the specified value. If you specify multiple values, Amazon Macie uses OR logic to join the values.","gt":"The value for the specified property is greater than the specified value.","gte":"The value for the specified property is greater than or equal to the specified value.","lt":"The value for the specified property is less than the specified value.","lte":"The value for the specified property is less than or equal to the specified value.","neq":"The value for the specified property doesn\'t match (doesn\'t equal) the specified value. If you specify multiple values, Amazon Macie uses OR logic to join the values."}},"AWS::Macie::FindingsFilter.FindingCriteria":{"attributes":{},"description":"Specifies, as a map, one or more property-based conditions for a findings filter. A *findings filter* , also referred to as a *filter rule* , is a set of custom criteria that specifies which findings to include or exclude from the results of a query for findings. You can also configure a findings filter to suppress (automatically archive) findings that match the filter\'s criteria. For more information, see [Filtering findings](https://docs.aws.amazon.com/macie/latest/user/findings-filter-overview.html) in the *Amazon Macie User Guide* .","properties":{"Criterion":"Specifies a condition that defines the property, operator, and one or more values to use to filter the results."}},"AWS::Macie::Session":{"attributes":{"AwsAccountId":"The account ID for the AWS account in which the Amazon Macie session is created.","Ref":"`Ref` returns the account ID for the AWS account in which the Amazon Macie session is created. For example, `{ \\"Ref\\": \\"Session\\" }` .","ServiceRole":"The Amazon Resource Name (ARN) of the service-linked role that allows Amazon Macie to monitor and analyze data in AWS resources for the account."},"description":"The `AWS::Macie::Session` resource represents the Amazon Macie service and certain configuration settings for an Amazon Macie account in a specific AWS Region . It enables Macie to become operational for a specific account in a specific Region. An account can have only one session in each Region.\\n\\nYou must create an `AWS::Macie::Session` resource for an account before you can create other types of resources for the account. Use a [DependsOn attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) to ensure that an `AWS::Macie::Session` resource is created before other Macie resources are created for an account. For example, `\\"DependsOn\\": \\"Session\\"` .","properties":{"FindingPublishingFrequency":"Specifies how often Amazon Macie publishes updates to policy findings for the account. This includes publishing updates to AWS Security Hub and Amazon EventBridge (formerly Amazon CloudWatch Events ). Valid values are:\\n\\n- FIFTEEN_MINUTES\\n- ONE_HOUR\\n- SIX_HOURS","Status":"The status of Amazon Macie for the account. Valid values are: `ENABLED` , start or resume all Macie activities for the account; and, `PAUSED` , suspend all Macie activities for the account."}},"AWS::ManagedBlockchain::Accessor":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the accessor. For more information about ARNs and their format, see [Amazon Resource Names (ARNs)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *AWS General Reference* .","BillingToken":"The billing token is a property of the accessor. Use this token to make Ethereum API calls to your Ethereum node. The billing token is used to track your accessor object for billing Ethereum API requests made to your Ethereum nodes.","CreationDate":"The creation date and time of the accessor.","Id":"The unique identifier of the accessor.","Ref":"`Ref` returns the Accessor ID.","Status":"The current status of the accessor."},"description":"Creates a new accessor for use with Managed Blockchain Ethereum nodes. An accessor contains information required for token based access to your Ethereum nodes.","properties":{"AccessorType":"The type of the accessor.\\n\\n> Currently, accessor type is restricted to `BILLING_TOKEN` .","Tags":"The tags assigned to the Accessor.\\n\\nFor more information about tags, see [Tagging Resources](https://docs.aws.amazon.com/managed-blockchain/latest/ethereum-dev/tagging-resources.html) in the *Amazon Managed Blockchain Ethereum Developer Guide* , or [Tagging Resources](https://docs.aws.amazon.com/managed-blockchain/latest/hyperledger-fabric-dev/tagging-resources.html) in the *Amazon Managed Blockchain Hyperledger Fabric Developer Guide* ."}},"AWS::ManagedBlockchain::Member":{"attributes":{"MemberId":"The unique identifier of the member.","NetworkId":"The unique identifier of the network to which the member belongs.","Ref":"`Ref` returns the member ID."},"description":"Creates a member within a Managed Blockchain network.\\n\\nApplies only to Hyperledger Fabric.","properties":{"InvitationId":"The unique identifier of the invitation to join the network sent to the account that creates the member.","MemberConfiguration":"Configuration properties of the member.","NetworkConfiguration":"Configuration properties of the network to which the member belongs.","NetworkId":"The unique identifier of the network to which the member belongs."}},"AWS::ManagedBlockchain::Member.ApprovalThresholdPolicy":{"attributes":{},"description":"A policy type that defines the voting rules for the network. The rules decide if a proposal is approved. Approval may be based on criteria such as the percentage of `YES` votes and the duration of the proposal. The policy applies to all proposals and is specified when the network is created.\\n\\nApplies only to Hyperledger Fabric.","properties":{"ProposalDurationInHours":"The duration from the time that a proposal is created until it expires. If members cast neither the required number of `YES` votes to approve the proposal nor the number of `NO` votes required to reject it before the duration expires, the proposal is `EXPIRED` and `ProposalActions` aren\'t carried out.","ThresholdComparator":"Determines whether the vote percentage must be greater than the `ThresholdPercentage` or must be greater than or equal to the `ThreholdPercentage` to be approved.","ThresholdPercentage":"The percentage of votes among all members that must be `YES` for a proposal to be approved. For example, a `ThresholdPercentage` value of `50` indicates 50%. The `ThresholdComparator` determines the precise comparison. If a `ThresholdPercentage` value of `50` is specified on a network with 10 members, along with a `ThresholdComparator` value of `GREATER_THAN` , this indicates that 6 `YES` votes are required for the proposal to be approved."}},"AWS::ManagedBlockchain::Member.MemberConfiguration":{"attributes":{},"description":"Configuration properties of the member.\\n\\nApplies only to Hyperledger Fabric.","properties":{"Description":"An optional description of the member.","MemberFrameworkConfiguration":"Configuration properties of the blockchain framework relevant to the member.","Name":"The name of the member."}},"AWS::ManagedBlockchain::Member.MemberFabricConfiguration":{"attributes":{},"description":"Configuration properties for Hyperledger Fabric for a member in a Managed Blockchain network that is using the Hyperledger Fabric framework.","properties":{"AdminPassword":"The password for the member\'s initial administrative user. The `AdminPassword` must be at least 8 characters long and no more than 32 characters. It must contain at least one uppercase letter, one lowercase letter, and one digit. It cannot have a single quotation mark (‘), a double quotation marks (“), a forward slash(/), a backward slash(\\\\), @, or a space.","AdminUsername":"The user name for the member\'s initial administrative user."}},"AWS::ManagedBlockchain::Member.MemberFrameworkConfiguration":{"attributes":{},"description":"Configuration properties relevant to a member for the blockchain framework that the Managed Blockchain network uses.","properties":{"MemberFabricConfiguration":"Configuration properties for Hyperledger Fabric."}},"AWS::ManagedBlockchain::Member.NetworkConfiguration":{"attributes":{},"description":"Configuration properties of the network to which the member belongs.","properties":{"Description":"Attributes of the blockchain framework for the network.","Framework":"The blockchain framework that the network uses.","FrameworkVersion":"The version of the blockchain framework that the network uses.","Name":"The name of the network.","NetworkFrameworkConfiguration":"Configuration properties relevant to the network for the blockchain framework that the network uses.","VotingPolicy":"The voting rules that the network uses to decide if a proposal is accepted."}},"AWS::ManagedBlockchain::Member.NetworkFabricConfiguration":{"attributes":{},"description":"Hyperledger Fabric configuration properties for the network.","properties":{"Edition":"The edition of Amazon Managed Blockchain that the network uses. Valid values are `standard` and `starter` . For more information, see [Amazon Managed Blockchain Pricing](https://docs.aws.amazon.com/managed-blockchain/pricing/)"}},"AWS::ManagedBlockchain::Member.NetworkFrameworkConfiguration":{"attributes":{},"description":"Configuration properties relevant to the network for the blockchain framework that the network uses.","properties":{"NetworkFabricConfiguration":"Configuration properties for Hyperledger Fabric for a member in a Managed Blockchain network that is using the Hyperledger Fabric framework."}},"AWS::ManagedBlockchain::Member.VotingPolicy":{"attributes":{},"description":"The voting rules for the network to decide if a proposal is accepted\\n\\nApplies only to Hyperledger Fabric.","properties":{"ApprovalThresholdPolicy":"Defines the rules for the network for voting on proposals, such as the percentage of `YES` votes required for the proposal to be approved and the duration of the proposal. The policy applies to all proposals and is specified when the network is created."}},"AWS::ManagedBlockchain::Node":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the node.","MemberId":"The unique identifier of the member in which the node is created. Applies only to Hyperledger Fabric.","NetworkId":"The unique identifier of the network that the node is in.","NodeId":"The unique identifier of the node.","Ref":"`Ref` returns the node ID."},"description":"Creates a node on the specified blockchain network.\\n\\nApplies to Hyperledger Fabric and Ethereum.","properties":{"MemberId":"The unique identifier of the member to which the node belongs. Applies only to Hyperledger Fabric.","NetworkId":"The unique identifier of the network for the node.\\n\\nEthereum public networks have the following `NetworkId` s:\\n\\n- `n-ethereum-mainnet`\\n- `n-ethereum-goerli`\\n- `n-ethereum-rinkeby`","NodeConfiguration":"Configuration properties of a peer node."}},"AWS::ManagedBlockchain::Node.NodeConfiguration":{"attributes":{},"description":"Configuration properties of a peer node within a membership.","properties":{"AvailabilityZone":"The Availability Zone in which the node exists. Required for Ethereum nodes.","InstanceType":"The Amazon Managed Blockchain instance type for the node."}},"AWS::MediaConnect::Bridge":{"attributes":{"BridgeArn":"The Amazon Resource Name (ARN) of the bridge.","BridgeState":"The current status of the bridge. Possible values are: ACTIVE or STANDBY.","Ref":"`Ref` returns the bridge ARN. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:mediaconnect:us-east-1:111122223333:bridge:1-23aBC45dEF67hiJ8-12AbC34DE5fG:BasketballArenaIngress\\" }`"},"description":"The AWS::MediaConnect::Bridge resource defines a connection between your data center’s gateway instances and the cloud. For each bridge, you specify the type of bridge, transport protocol to use, and details for any outputs and failover.","properties":{"EgressGatewayBridge":"Create a bridge with the egress bridge type. An egress bridge is a cloud-to-ground bridge. The content comes from an existing MediaConnect flow and is delivered to your premises.","IngressGatewayBridge":"Create a bridge with the ingress bridge type. An ingress bridge is a ground-to-cloud bridge. The content originates at your premises and is delivered to the cloud.","Name":"The network output name. This name is used to reference the output and must be unique among outputs in this bridge.","Outputs":"The outputs that you want to add to this bridge.","PlacementArn":"The bridge placement Amazon Resource Number (ARN).","SourceFailoverConfig":"The settings for source failover.","Sources":"The sources that you want to add to this bridge."}},"AWS::MediaConnect::Bridge.BridgeFlowSource":{"attributes":{},"description":"The source of the bridge. A flow source originates in MediaConnect as an existing cloud flow.","properties":{"FlowArn":"The ARN of the cloud flow used as a source of this bridge.","FlowVpcInterfaceAttachment":"The name of the VPC interface attachment to use for this source.","Name":"The name of the flow source."}},"AWS::MediaConnect::Bridge.BridgeNetworkOutput":{"attributes":{},"description":"The output of the bridge. A network output is delivered to your premises.","properties":{"IpAddress":"The network output IP Address.","Name":"The network output name.","NetworkName":"The network output\'s gateway network name.","Port":"The network output port.","Protocol":"The network output protocol.","Ttl":"The network output TTL."}},"AWS::MediaConnect::Bridge.BridgeNetworkSource":{"attributes":{},"description":"The source of the bridge. A network source originates at your premises.","properties":{"MulticastIp":"The network source multicast IP.","Name":"The name of the network source. This name is used to reference the source and must be unique among sources in this bridge.","NetworkName":"The network source\'s gateway network name.","Port":"The network source port.","Protocol":"The network source protocol."}},"AWS::MediaConnect::Bridge.BridgeOutput":{"attributes":{},"description":"The output of the bridge.","properties":{"NetworkOutput":"The output of the bridge. A network output is delivered to your premises."}},"AWS::MediaConnect::Bridge.BridgeSource":{"attributes":{},"description":"The bridge\'s source.","properties":{"FlowSource":"The source of the bridge. A flow source originates in MediaConnect as an existing cloud flow.","NetworkSource":"The source of the bridge. A network source originates at your premises."}},"AWS::MediaConnect::Bridge.EgressGatewayBridge":{"attributes":{},"description":"Create a bridge with the egress bridge type. An egress bridge is a cloud-to-ground bridge. The content comes from an existing MediaConnect flow and is delivered to your premises.","properties":{"MaxBitrate":"The maximum expected bitrate (in bps) of the egress bridge."}},"AWS::MediaConnect::Bridge.FailoverConfig":{"attributes":{},"description":"The settings for source failover.","properties":{"FailoverMode":"The type of failover you choose for this flow. MERGE combines the source streams into a single stream, allowing graceful recovery from any single-source loss. FAILOVER allows switching between different streams.","SourcePriority":"The priority you want to assign to a source. You can have a primary stream and a backup stream or two equally prioritized streams. This setting only applies when Failover Mode is set to FAILOVER.","State":"The state of source failover on the flow. If the state is inactive, the flow can have only one source. If the state is active, the flow can have one or two sources."}},"AWS::MediaConnect::Bridge.IngressGatewayBridge":{"attributes":{},"description":"Create a bridge with the ingress bridge type. An ingress bridge is a ground-to-cloud bridge. The content originates at your premises and is delivered to the cloud.","properties":{"MaxBitrate":"The maximum expected bitrate (in bps) of the ingress bridge.","MaxOutputs":"The maximum number of outputs on the ingress bridge."}},"AWS::MediaConnect::Bridge.SourcePriority":{"attributes":{},"description":"The priority you want to assign to a source. You can have a primary stream and a backup stream or two equally prioritized streams. This setting only applies when Failover Mode is set to FAILOVER.","properties":{"PrimarySource":"The name of the source you choose as the primary source for this flow."}},"AWS::MediaConnect::Bridge.VpcInterfaceAttachment":{"attributes":{},"description":"The VPC interface that you want to send your output to.","properties":{"VpcInterfaceName":"The name of the VPC interface that you want to send your output to."}},"AWS::MediaConnect::BridgeOutput":{"attributes":{"Ref":"`Ref` returns the bridge ARN and the bridge name. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:mediaconnect:us-east-1:111122223333:bridge:1-23aBC45dEF67hiJ8-12AbC34DE5fG:BasketballArenaIngress|Output:PrimaryOutput1\\" }`"},"description":"Adds outputs to an existing bridge.","properties":{"BridgeArn":"The ARN of the bridge that you want to describe.","Name":"The network output name. This name is used to reference the output and must be unique among outputs in this bridge.","NetworkOutput":"Add a network output to an existing bridge."}},"AWS::MediaConnect::BridgeOutput.BridgeNetworkOutput":{"attributes":{},"description":"The output of the bridge. A network output is delivered to your premises.","properties":{"IpAddress":"The network output IP Address.","NetworkName":"The network output\'s gateway network name.","Port":"The network output port.","Protocol":"The network output protocol.","Ttl":"The network output TTL."}},"AWS::MediaConnect::BridgeSource":{"attributes":{"Ref":"`Ref` returns the bridge ARN and bridge name. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:mediaconnect:us-east-1:111122223333:bridge:1-23aBC45dEF67hiJ8-12AbC34DE5fG:BasketballArenaIngress|Source:PrimarySource1\\" }`"},"description":"Adds sources to an existing bridge.","properties":{"BridgeArn":"The ARN of the bridge that you want to describe.","FlowSource":"Add a flow source to an existing bridge.","Name":"The name of the network source. This name is used to reference the source and must be unique among sources in this bridge.","NetworkSource":"Add a network source to an existing bridge."}},"AWS::MediaConnect::BridgeSource.BridgeFlowSource":{"attributes":{},"description":"The source of the bridge. A flow source originates in MediaConnect as an existing cloud flow.","properties":{"FlowArn":"The ARN of the cloud flow used as a source of this bridge.","FlowVpcInterfaceAttachment":"The name of the VPC interface attachment to use for this source."}},"AWS::MediaConnect::BridgeSource.BridgeNetworkSource":{"attributes":{},"description":"The source of the bridge. A network source originates at your premises.","properties":{"MulticastIp":"The network source multicast IP.","NetworkName":"The network source\'s gateway network name.","Port":"The network source port.","Protocol":"The network source protocol."}},"AWS::MediaConnect::BridgeSource.VpcInterfaceAttachment":{"attributes":{},"description":"The VPC interface that you want to send your output to.","properties":{"VpcInterfaceName":"The name of the VPC interface that you want to send your output to."}},"AWS::MediaConnect::Flow":{"attributes":{"FlowArn":"The Amazon Resource Name (ARN) of the flow.","FlowAvailabilityZone":"The Availability Zone that the flow was created in. These options are limited to the Availability Zones within the current AWS Region.","Ref":"`Ref` returns the flow ARN. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:mediaconnect:us-east-1:111122223333:flow:1-23aBC45dEF67hiJ8-12AbC34DE5fG:BasketballGame\\" }`","Source.IngestIp":"The IP address that the flow listens on for incoming content.","Source.SourceArn":"The ARN of the source.","Source.SourceIngestPort":"The port that the flow listens on for incoming content. If the protocol of the source is Zixi, the port must be set to 2088."},"description":"The AWS::MediaConnect::Flow resource defines a connection between one or more video sources and one or more outputs. For each flow, you specify the transport protocol to use, encryption information, and details for any outputs or entitlements that you want. AWS Elemental MediaConnect returns an ingest endpoint where you can send your live video as a single unicast stream. The service replicates and distributes the video to every output that you specify, whether inside or outside the AWS Cloud. You can also set up entitlements on a flow to allow other AWS accounts to access your content.","properties":{"AvailabilityZone":"The Availability Zone that you want to create the flow in. These options are limited to the Availability Zones within the current AWS Region.","Name":"The name of the flow.","Source":"The settings for the source that you want to use for the new flow.","SourceFailoverConfig":"The settings for source failover."}},"AWS::MediaConnect::Flow.Encryption":{"attributes":{},"description":"Information about the encryption of the flow.","properties":{"Algorithm":"The type of algorithm that is used for static key encryption (such as aes128, aes192, or aes256). If you are using SPEKE or SRT-password encryption, this property must be left blank.","ConstantInitializationVector":"A 128-bit, 16-byte hex value represented by a 32-character string, to be used with the key for encrypting content. This parameter is not valid for static key encryption.","DeviceId":"The value of one of the devices that you configured with your digital rights management (DRM) platform key provider. This parameter is required for SPEKE encryption and is not valid for static key encryption.","KeyType":"The type of key that is used for the encryption. If you don\'t specify a `keyType` value, the service uses the default setting ( `static-key` ). Valid key types are: `static-key` , `speke` , and `srt-password` .","Region":"The AWS Region that the API Gateway proxy endpoint was created in. This parameter is required for SPEKE encryption and is not valid for static key encryption.","ResourceId":"An identifier for the content. The service sends this value to the key server to identify the current endpoint. The resource ID is also known as the content ID. This parameter is required for SPEKE encryption and is not valid for static key encryption.","RoleArn":"The Amazon Resource Name (ARN) of the role that you created during setup (when you set up MediaConnect as a trusted entity).","SecretArn":"The ARN of the secret that you created in AWS Secrets Manager to store the encryption key.","Url":"The URL from the API Gateway proxy that you set up to talk to your key server. This parameter is required for SPEKE encryption and is not valid for static key encryption."}},"AWS::MediaConnect::Flow.FailoverConfig":{"attributes":{},"description":"The settings for source failover.","properties":{"FailoverMode":"The type of failover you choose for this flow. MERGE combines the source streams into a single stream, allowing graceful recovery from any single-source loss. FAILOVER allows switching between different streams. The string for this property must be entered as MERGE or FAILOVER. No other string entry is valid.","RecoveryWindow":"The size of the buffer (delay) that the service maintains. A larger buffer means a longer delay in transmitting the stream, but more room for error correction. A smaller buffer means a shorter delay, but less room for error correction. You can choose a value from 100-500 ms. If you keep this field blank, the service uses the default value of 200 ms. This setting only applies when Failover Mode is set to MERGE.","SourcePriority":"The priority you want to assign to a source. You can have a primary stream and a backup stream or two equally prioritized streams. This setting only applies when Failover Mode is set to FAILOVER.","State":"The state of source failover on the flow. If the state is inactive, the flow can have only one source. If the state is active, the flow can have one or two sources."}},"AWS::MediaConnect::Flow.GatewayBridgeSource":{"attributes":{},"description":"","properties":{"BridgeArn":"","VpcInterfaceAttachment":""}},"AWS::MediaConnect::Flow.Source":{"attributes":{},"description":"The details of the sources of the flow.\\n\\nIf you are creating a flow with a VPC source, you must first create the flow with a temporary standard source by doing the following:\\n\\n- Use CloudFormation to create a flow with a standard source that uses the flow’s public IP address.\\n- Use CloudFormation to create the VPC interface to add to this flow. This can also be done as part of the previous step.\\n- After CloudFormation has created the flow and the VPC interface, update the source to point to the VPC interface that you created.","properties":{"Decryption":"The type of encryption that is used on the content ingested from the source.","Description":"A description of the source. This description is not visible outside of the current AWS account.","EntitlementArn":"The ARN of the entitlement that allows you to subscribe to content that comes from another AWS account. The entitlement is set by the content originator and the ARN is generated as part of the originator’s flow.","GatewayBridgeSource":"","IngestIp":"The IP address that the flow listens on for incoming content.","IngestPort":"The port that the flow listens on for incoming content. If the protocol of the source is Zixi, the port must be set to 2088.","MaxBitrate":"The maximum bitrate for RIST, RTP, and RTP-FEC streams.","MaxLatency":"The maximum latency in milliseconds for a RIST or Zixi-based source.","MinLatency":"The minimum latency in milliseconds for SRT-based streams. In streams that use the SRT protocol, this value that you set on your MediaConnect source or output represents the minimal potential latency of that connection. The latency of the stream is set to the highest number between the sender’s minimum latency and the receiver’s minimum latency.","Name":"The name of the source.","Protocol":"The protocol that is used by the source. AWS CloudFormation does not currently support CDI or ST 2110 JPEG XS source protocols.","SenderControlPort":"The port that the flow uses to send outbound requests to initiate connection with the sender.","SenderIpAddress":"The IP address that the flow communicates with to initiate connection with the sender.","SourceArn":"The ARN of the source.","SourceIngestPort":"The port that the flow listens on for incoming content. If the protocol of the source is Zixi, the port must be set to 2088.","SourceListenerAddress":"Source IP or domain name for SRT-caller protocol.","SourceListenerPort":"Source port for SRT-caller protocol.","StreamId":"The stream ID that you want to use for the transport. This parameter applies only to Zixi-based streams.","VpcInterfaceName":"The name of the VPC interface that the source content comes from.","WhitelistCidr":"The range of IP addresses that are allowed to contribute content to your source. Format the IP addresses as a Classless Inter-Domain Routing (CIDR) block; for example, 10.0.0.0/16."}},"AWS::MediaConnect::Flow.SourcePriority":{"attributes":{},"description":"The priority you want to assign to a source. You can have a primary stream and a backup stream or two equally prioritized streams. This setting only applies when Failover Mode is set to FAILOVER.","properties":{"PrimarySource":"The name of the source you choose as the primary source for this flow."}},"AWS::MediaConnect::Flow.VpcInterfaceAttachment":{"attributes":{},"description":"","properties":{"VpcInterfaceName":""}},"AWS::MediaConnect::FlowEntitlement":{"attributes":{"EntitlementArn":"The entitlement ARN.","Ref":"`Ref` returns the entitlement ARN. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:mediaconnect:us-west-2:111122223333:entitlement:1-11aa22bb11aa22bb-3333cccc4444:AnyCompany_Entitlement\\" }`"},"description":"The AWS::MediaConnect::FlowEntitlement resource defines the permission that an AWS account grants to another AWS account to allow access to the content in a specific AWS Elemental MediaConnect flow. The content originator grants an entitlement to a specific AWS account (the subscriber). When an entitlement is granted, the subscriber can create a flow using the originator\'s flow as the source. Each flow can have up to 50 entitlements.","properties":{"DataTransferSubscriberFeePercent":"The percentage of the entitlement data transfer fee that you want the subscriber to be responsible for.","Description":"A description of the entitlement. This description appears only on the MediaConnect console and is not visible outside of the current AWS account.","Encryption":"The type of encryption that MediaConnect will use on the output that is associated with the entitlement.","EntitlementStatus":"An indication of whether the new entitlement should be enabled or disabled as soon as it is created. If you don’t specify the entitlementStatus field in your request, MediaConnect sets it to ENABLED.","FlowArn":"The Amazon Resource Name (ARN) of the flow.","Name":"The name of the entitlement. This value must be unique within the current flow.","Subscribers":"The AWS account IDs that you want to share your content with. The receiving accounts (subscribers) will be allowed to create their own flows using your content as the source."}},"AWS::MediaConnect::FlowEntitlement.Encryption":{"attributes":{},"description":"Information about the encryption of the flow.","properties":{"Algorithm":"The type of algorithm that is used for static key encryption (such as aes128, aes192, or aes256). If you are using SPEKE or SRT-password encryption, this property must be left blank.","ConstantInitializationVector":"A 128-bit, 16-byte hex value represented by a 32-character string, to be used with the key for encrypting content. This parameter is not valid for static key encryption.","DeviceId":"The value of one of the devices that you configured with your digital rights management (DRM) platform key provider. This parameter is required for SPEKE encryption and is not valid for static key encryption.","KeyType":"The type of key that is used for the encryption. If you don\'t specify a `keyType` value, the service uses the default setting ( `static-key` ). Valid key types are: `static-key` , `speke` , and `srt-password` .","Region":"The AWS Region that the API Gateway proxy endpoint was created in. This parameter is required for SPEKE encryption and is not valid for static key encryption.","ResourceId":"An identifier for the content. The service sends this value to the key server to identify the current endpoint. The resource ID is also known as the content ID. This parameter is required for SPEKE encryption and is not valid for static key encryption.","RoleArn":"The Amazon Resource Name (ARN) of the role that you created during setup (when you set up MediaConnect as a trusted entity).","SecretArn":"The ARN of the secret that you created in AWS Secrets Manager to store the encryption key.","Url":"The URL from the API Gateway proxy that you set up to talk to your key server. This parameter is required for SPEKE encryption and is not valid for static key encryption."}},"AWS::MediaConnect::FlowOutput":{"attributes":{"OutputArn":"The ARN of the output.","Ref":"`Ref` returns the output ARN. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:mediaconnect:us-east-1:111122223333:output:2-3aBC45dEF67hiJ89-c34de5fG678h:NYCOutput\\" }`"},"description":"The AWS::MediaConnect::FlowOutput resource defines the destination address, protocol, and port that AWS Elemental MediaConnect sends the ingested video to. Each flow can have up to 50 outputs. An output can have the same protocol or a different protocol from the source. The following protocols are supported: RIST, RTP, RTP-FEC, SRT-listener, SRT-caller, Zixi pull, Zixi push, and Fujitsu-QoS. CDI and ST 2110 JPEG XS protocols are not currently supported by AWS CloudFormation.","properties":{"CidrAllowList":"The range of IP addresses that are allowed to initiate output requests to this flow. Format the IP addresses as a Classless Inter-Domain Routing (CIDR) block; for example, 10.0.0.0/16.","Description":"A description of the output. This description is not visible outside of the current AWS account even if the account grants entitlements to other accounts.","Destination":"The IP address where you want to send the output.","Encryption":"The encryption credentials that you want to use for the output.","FlowArn":"The Amazon Resource Name (ARN) of the flow this output is attached to.","MaxLatency":"The maximum latency in milliseconds. This parameter applies only to RIST-based, Zixi-based, and Fujitsu-based streams.","MinLatency":"The minimum latency in milliseconds for SRT-based streams. In streams that use the SRT protocol, this value that you set on your MediaConnect source or output represents the minimal potential latency of that connection. The latency of the stream is set to the highest number between the sender’s minimum latency and the receiver’s minimum latency.","Name":"The name of the VPC interface.","Port":"The port to use when MediaConnect distributes content to the output.","Protocol":"The protocol to use for the output.","RemoteId":"The identifier that is assigned to the Zixi receiver. This parameter applies only to outputs that use Zixi pull.","SmoothingLatency":"The smoothing latency in milliseconds for RIST, RTP, and RTP-FEC streams.","StreamId":"The stream ID that you want to use for this transport. This parameter applies only to Zixi and SRT caller-based streams.","VpcInterfaceAttachment":"The VPC interface that you want to send your output to."}},"AWS::MediaConnect::FlowOutput.Encryption":{"attributes":{},"description":"Information about the encryption of the flow.","properties":{"Algorithm":"The type of algorithm that is used for static key encryption (such as aes128, aes192, or aes256). If you are using SPEKE or SRT-password encryption, this property must be left blank.","KeyType":"The type of key that is used for the encryption. If you don\'t specify a `keyType` value, the service uses the default setting ( `static-key` ). Valid key types are: `static-key` , `speke` , and `srt-password` .","RoleArn":"The Amazon Resource Name (ARN) of the role that you created during setup (when you set up MediaConnect as a trusted entity).","SecretArn":"The ARN of the secret that you created in AWS Secrets Manager to store the encryption key."}},"AWS::MediaConnect::FlowOutput.VpcInterfaceAttachment":{"attributes":{},"description":"The VPC interface that you want to send your output to.","properties":{"VpcInterfaceName":"The name of the VPC interface that you want to send your output to."}},"AWS::MediaConnect::FlowSource":{"attributes":{"IngestIp":"The IP address that the flow listens on for incoming content.","Ref":"`Ref` returns the source ARN. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:mediaconnect:us-east-1:111122223333:source:2-3aBC45dEF67hiJ89-c34de5fG678h:AwardsShowSource\\" }`","SourceArn":"The ARN of the source.","SourceIngestPort":"The port that the flow listens on for incoming content. If the protocol of the source is Zixi, the port must be set to 2088."},"description":"The AWS::MediaConnect::FlowSource resource is used to add additional sources to an existing flow. Adding an additional source requires Failover to be enabled. When you enable Failover, the additional source must use the same protocol as the existing source. A source is the external video content that includes configuration information (encryption and source type) and a network address. Each flow has at least one source. A standard source comes from a source other than another AWS Elemental MediaConnect flow, such as an on-premises encoder.","properties":{"Decryption":"The type of encryption that is used on the content ingested from the source.","Description":"A description of the source. This description is not visible outside of the current AWS account.","EntitlementArn":"The ARN of the entitlement that allows you to subscribe to the flow. The entitlement is set by the content originator, and the ARN is generated as part of the originator\'s flow.","FlowArn":"The Amazon Resource Name (ARN) of the flow this source is connected to. The flow must have Failover enabled to add an additional source.","GatewayBridgeSource":"","IngestPort":"The port that the flow listens on for incoming content. If the protocol of the source is Zixi, the port must be set to 2088.","MaxBitrate":"The maximum bitrate for RIST, RTP, and RTP-FEC streams.","MaxLatency":"The maximum latency in milliseconds. This parameter applies only to RIST-based, Zixi-based, and Fujitsu-based streams.","MinLatency":"The minimum latency in milliseconds for SRT-based streams. In streams that use the SRT protocol, this value that you set on your MediaConnect source or output represents the minimal potential latency of that connection. The latency of the stream is set to the highest number between the sender’s minimum latency and the receiver’s minimum latency.","Name":"The name of the source.","Protocol":"The protocol that the source uses to deliver the content to MediaConnect. Adding additional sources to an existing flow requires Failover to be enabled. When you enable Failover, the additional source must use the same protocol as the existing source. Only the following protocols support failover: Zixi-push, RTP-FEC, RTP, RIST and SRT protocols.\\n\\nIf you use failover with SRT caller or listener, the `FailoverMode` property must be set to `FAILOVER` . The `FailoverMode` property is found in the `FailoverConfig` resource of the same flow ARN you used for the source\'s `FlowArn` property. SRT caller/listener does not support merge mode failover.","SenderControlPort":"The port that the flow uses to send outbound requests to initiate connection with the sender.","SenderIpAddress":"The IP address that the flow communicates with to initiate connection with the sender.","SourceListenerAddress":"Source IP or domain name for SRT-caller protocol.","SourceListenerPort":"Source port for SRT-caller protocol.","StreamId":"The stream ID that you want to use for this transport. This parameter applies only to Zixi and SRT caller-based streams.","VpcInterfaceName":"The name of the VPC interface that you want to send your output to.","WhitelistCidr":"The range of IP addresses that are allowed to contribute content to your source. Format the IP addresses as a Classless Inter-Domain Routing (CIDR) block; for example, 10.0.0.0/16."}},"AWS::MediaConnect::FlowSource.Encryption":{"attributes":{},"description":"Information about the encryption of the flow.","properties":{"Algorithm":"The type of algorithm that is used for static key encryption (such as aes128, aes192, or aes256). If you are using SPEKE or SRT-password encryption, this property must be left blank.","ConstantInitializationVector":"A 128-bit, 16-byte hex value represented by a 32-character string, to be used with the key for encrypting content. This parameter is not valid for static key encryption.","DeviceId":"The value of one of the devices that you configured with your digital rights management (DRM) platform key provider. This parameter is required for SPEKE encryption and is not valid for static key encryption.","KeyType":"The type of key that is used for the encryption. If you don\'t specify a `keyType` value, the service uses the default setting ( `static-key` ). Valid key types are: `static-key` , `speke` , and `srt-password` .","Region":"The AWS Region that the API Gateway proxy endpoint was created in. This parameter is required for SPEKE encryption and is not valid for static key encryption.","ResourceId":"An identifier for the content. The service sends this value to the key server to identify the current endpoint. The resource ID is also known as the content ID. This parameter is required for SPEKE encryption and is not valid for static key encryption.","RoleArn":"The Amazon Resource Name (ARN) of the role that you created during setup (when you set up MediaConnect as a trusted entity).","SecretArn":"The ARN of the secret that you created in AWS Secrets Manager to store the encryption key.","Url":"The URL from the API Gateway proxy that you set up to talk to your key server. This parameter is required for SPEKE encryption and is not valid for static key encryption."}},"AWS::MediaConnect::FlowSource.GatewayBridgeSource":{"attributes":{},"description":"","properties":{"BridgeArn":"","VpcInterfaceAttachment":""}},"AWS::MediaConnect::FlowSource.VpcInterfaceAttachment":{"attributes":{},"description":"","properties":{"VpcInterfaceName":""}},"AWS::MediaConnect::FlowVpcInterface":{"attributes":{"NetworkInterfaceIds":"The IDs of the network interfaces that MediaConnect created in your account.","Ref":"`Ref` returns the flow ARN and the name of the VPC interface. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:mediaconnect:us-east-1:111122223333:flow:1-23aBC45dEF67hiJ8-12AbC34DE5fG:BasketballGame|MyVPCInterface\\" }`"},"description":"The AWS::MediaConnect::FlowVpcInterface resource is a connection between your AWS Elemental MediaConnect flow and a virtual private cloud (VPC) that you created using the Amazon Virtual Private Cloud service.\\n\\nTo avoid streaming your content over the public internet, you can add up to two VPC interfaces to your flow and use those connections to transfer content between your VPC and MediaConnect.\\n\\nYou can update an existing flow to add a VPC interface. If you haven’t created the flow yet, you must create the flow with a temporary standard source by doing the following:\\n\\n- Use CloudFormation to create a flow with a standard source that uses to the flow’s public IP address.\\n- Use CloudFormation to create a VPC interface to add to this flow. This can also be done as part of the previous step.\\n- After CloudFormation has created the flow and the VPC interface, update the source to point to the VPC interface that you created.","properties":{"FlowArn":"The Amazon Resource Name (ARN) of the flow.","Name":"The name of the VPC Interface. This value must be unique within the current flow.","RoleArn":"The Amazon Resource Name (ARN) of the role that you created when you set up MediaConnect as a trusted service.","SecurityGroupIds":"The VPC security groups that you want MediaConnect to use for your VPC configuration. You must include at least one security group in the request.","SubnetId":"The subnet IDs that you want to use for your VPC interface.\\n\\nA range of IP addresses in your VPC. When you create your VPC, you specify a range of IPv4 addresses for the VPC in the form of a Classless Inter-Domain Routing (CIDR) block; for example, 10.0.0.0/16. This is the primary CIDR block for your VPC. When you create a subnet for your VPC, you specify the CIDR block for the subnet, which is a subset of the VPC CIDR block.\\n\\nThe subnets that you use across all VPC interfaces on the flow must be in the same Availability Zone as the flow."}},"AWS::MediaConnect::Gateway":{"attributes":{"GatewayArn":"The Amazon Resource Name (ARN) of the gateway.","GatewayState":"The current state of the gateway. Possible values are: CREATING, ACTIVE, UPDATING, ERROR, DELETING, DELETED.","Ref":"`Ref` returns the gateway ARN. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:mediaconnect:us-east-1:111122223333:gateway:1-23aBC45dEF67hiJ8-12AbC34DE5fG:WestOffice\\" }`"},"description":"The AWS::MediaConnect::Gateway resource is used to create a new gateway. AWS Elemental MediaConnect Gateway is a feature of MediaConnect that allows the deployment of on-premises resources for transporting live video to and from the AWS Cloud. MediaConnect Gateway allows you to contribute live video to the AWS Cloud from on-premises hardware, as well as distribute live video from the AWS Cloud to your local data center.","properties":{"EgressCidrBlocks":"The range of IP addresses that are allowed to contribute content or initiate output requests for flows communicating with this gateway. These IP addresses should be in the form of a Classless Inter-Domain Routing (CIDR) block; for example, 10.0.0.0/16.","Name":"The name of the gateway. This name can not be modified after the gateway is created.","Networks":"The list of networks that you want to add."}},"AWS::MediaConnect::Gateway.GatewayNetwork":{"attributes":{},"description":"The network settings for a gateway.","properties":{"CidrBlock":"A unique IP address range to use for this network. These IP addresses should be in the form of a Classless Inter-Domain Routing (CIDR) block; for example, 10.0.0.0/16.","Name":"The name of the network. This name is used to reference the network and must be unique among networks in this gateway."}},"AWS::MediaConvert::JobTemplate":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the job template, such as `arn:aws:mediaconvert:us-west-2:123456789012` .","Name":"The name of the job template, such as `Streaming stack DASH` .","Ref":"When you pass the logical ID of an `AWS::MediaConvert::JobTemplate` resource to the intrinsic `Ref` function, the function returns the name of the job template, such as `Streaming stack DASH` ."},"description":"The AWS::MediaConvert::JobTemplate resource is an AWS Elemental MediaConvert resource type that you can use to generate transcoding jobs.\\n\\nWhen you declare this entity in your AWS CloudFormation template, you pass in your transcoding job settings in JSON or YAML format. This settings specification must be formed in a particular way that conforms to AWS Elemental MediaConvert job validation. For more information about creating a job template model for the `SettingsJson` property, see the Remarks section later in this topic.\\n\\nFor information about job templates, see [Working with AWS Elemental MediaConvert Job Templates](https://docs.aws.amazon.com/mediaconvert/latest/ug/working-with-job-templates.html) in the ** .","properties":{"AccelerationSettings":"Accelerated transcoding can significantly speed up jobs with long, visually complex content. Outputs that use this feature incur pro-tier pricing. For information about feature limitations, For more information, see [Job Limitations for Accelerated Transcoding in AWS Elemental MediaConvert](https://docs.aws.amazon.com/mediaconvert/latest/ug/job-requirements.html) in the *AWS Elemental MediaConvert User Guide* .","Category":"Optional. A category for the job template you are creating","Description":"Optional. A description of the job template you are creating.","HopDestinations":"Optional. Configuration for a destination queue to which the job can hop once a customer-defined minimum wait time has passed. For more information, see [Setting Up Queue Hopping to Avoid Long Waits](https://docs.aws.amazon.com/mediaconvert/latest/ug/setting-up-queue-hopping-to-avoid-long-waits.html) in the *AWS Elemental MediaConvert User Guide* .","Name":"The name of the job template you are creating.","Priority":"Specify the relative priority for this job. In any given queue, the service begins processing the job with the highest value first. When more than one job has the same priority, the service begins processing the job that you submitted first. If you don\'t specify a priority, the service uses the default value 0. Minimum: -50 Maximum: 50","Queue":"Optional. The queue that jobs created from this template are assigned to. Specify the Amazon Resource Name (ARN) of the queue. For example, arn:aws:mediaconvert:us-west-2:505474453218:queues/Default. If you don\'t specify this, jobs will go to the default queue.","SettingsJson":"Specify, in JSON format, the transcoding job settings for this job template. This specification must conform to the AWS Elemental MediaConvert job validation. For information about forming this specification, see the Remarks section later in this topic.\\n\\nFor more information about MediaConvert job templates, see [Working with AWS Elemental MediaConvert Job Templates](https://docs.aws.amazon.com/mediaconvert/latest/ug/working-with-job-templates.html) in the ** .","StatusUpdateInterval":"Specify how often MediaConvert sends STATUS_UPDATE events to Amazon CloudWatch Events. Set the interval, in seconds, between status updates. MediaConvert sends an update at this interval from the time the service begins processing your job to the time it completes the transcode or encounters an error.\\n\\nSpecify one of the following enums:\\n\\nSECONDS_10\\n\\nSECONDS_12\\n\\nSECONDS_15\\n\\nSECONDS_20\\n\\nSECONDS_30\\n\\nSECONDS_60\\n\\nSECONDS_120\\n\\nSECONDS_180\\n\\nSECONDS_240\\n\\nSECONDS_300\\n\\nSECONDS_360\\n\\nSECONDS_420\\n\\nSECONDS_480\\n\\nSECONDS_540\\n\\nSECONDS_600","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::MediaConvert::JobTemplate.AccelerationSettings":{"attributes":{},"description":"Accelerated transcoding can significantly speed up jobs with long, visually complex content. Outputs that use this feature incur pro-tier pricing. For information about feature limitations, For more information, see [Job Limitations for Accelerated Transcoding in AWS Elemental MediaConvert](https://docs.aws.amazon.com/mediaconvert/latest/ug/job-requirements.html) in the *AWS Elemental MediaConvert User Guide* .","properties":{"Mode":"Specify the conditions when the service will run your job with accelerated transcoding."}},"AWS::MediaConvert::JobTemplate.HopDestination":{"attributes":{},"description":"Optional. Configuration for a destination queue to which the job can hop once a customer-defined minimum wait time has passed. For more information, see [Setting Up Queue Hopping to Avoid Long Waits](https://docs.aws.amazon.com/mediaconvert/latest/ug/setting-up-queue-hopping-to-avoid-long-waits.html) in the *AWS Elemental MediaConvert User Guide* .","properties":{"Priority":"Optional. When you set up a job to use queue hopping, you can specify a different relative priority for the job in the destination queue. If you don\'t specify, the relative priority will remain the same as in the previous queue.","Queue":"Optional unless the job is submitted on the default queue. When you set up a job to use queue hopping, you can specify a destination queue. This queue cannot be the original queue to which the job is submitted. If the original queue isn\'t the default queue and you don\'t specify the destination queue, the job will move to the default queue.","WaitMinutes":"Required for setting up a job to use queue hopping. Minimum wait time in minutes until the job can hop to the destination queue. Valid range is 1 to 4320 minutes, inclusive."}},"AWS::MediaConvert::Preset":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the output preset, such as `arn:aws:mediaconvert:us-west-2:123456789012` .","Name":"The name of the output preset, such as `HEVC high res` .","Ref":"When you pass the logical ID of an `AWS::MediaConvert::Preset` resource to the intrinsic `Ref` function, the function returns the name of the output preset, such as `HEVC high res` ."},"description":"The AWS::MediaConvert::Preset resource is an AWS Elemental MediaConvert resource type that you can use to specify encoding settings for a single output in a transcoding job.\\n\\nWhen you declare this entity in your AWS CloudFormation template, you pass in your transcoding job settings in JSON or YAML format. This settings specification must be formed in a particular way that conforms to AWS Elemental MediaConvert job validation. For more information about creating an output preset model for the `SettingsJson` property, see the Remarks section later in this topic.\\n\\nFor more information about output MediaConvert presets, see [Working with AWS Elemental MediaConvert Output Presets](https://docs.aws.amazon.com/mediaconvert/latest/ug/working-with-presets.html) in the ** .","properties":{"Category":"The new category for the preset, if you are changing it.","Description":"The new description for the preset, if you are changing it.","Name":"The name of the preset that you are modifying.","SettingsJson":"Specify, in JSON format, the transcoding job settings for this output preset. This specification must conform to the AWS Elemental MediaConvert job validation. For information about forming this specification, see the Remarks section later in this topic.\\n\\nFor more information about MediaConvert output presets, see [Working with AWS Elemental MediaConvert Output Presets](https://docs.aws.amazon.com/mediaconvert/latest/ug/working-with-presets.html) in the ** .","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::MediaConvert::Queue":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the queue, such as `arn:aws:mediaconvert:us-west-2:123456789012` .","Name":"The name of the queue, such as `Queue 2` .","Ref":"When you pass the logical ID of an `AWS::MediaConvert::Queue` resource to the intrinsic `Ref` function, the function returns the name of the queue, such as `Queue 2` ."},"description":"The AWS::MediaConvert::Queue resource is an AWS Elemental MediaConvert resource type that you can use to manage the resources that are available to your account for parallel processing of jobs. For more information about queues, see [Working with AWS Elemental MediaConvert Queues](https://docs.aws.amazon.com/mediaconvert/latest/ug/working-with-queues.html) in the ** .","properties":{"Description":"Optional. A description of the queue that you are creating.","Name":"The name of the queue that you are creating.","PricingPlan":"When you use AWS CloudFormation , you can create only on-demand queues. Therefore, always set `PricingPlan` to the value \\"ON_DEMAND\\" when declaring an AWS::MediaConvert::Queue in your AWS CloudFormation template.\\n\\nTo create a reserved queue, use the AWS Elemental MediaConvert console at https://console.aws.amazon.com/mediaconvert to set up a contract. For more information, see [Working with AWS Elemental MediaConvert Queues](https://docs.aws.amazon.com/mediaconvert/latest/ug/working-with-queues.html) in the ** .","Status":"Initial state of the queue. Queues can be either ACTIVE or PAUSED. If you create a paused queue, then jobs that you send to that queue won\'t begin.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::MediaLive::Channel":{"attributes":{"Arn":"The ARN of the MediaLive channel. For example: arn:aws:medialive:us-west-1:111122223333:medialive:channel:1234567","Inputs":"The inputs that are attached to this channel. The inputs are identified by their IDs (not by their names or their ARNs).","Ref":"`Ref` returns the name of the channel.\\n\\nFor example: `{ \\"Ref\\": \\"myChannel\\" }`"},"description":"The AWS::MediaLive::Channel resource is a MediaLive resource type that creates a channel.\\n\\nA MediaLive channel ingests and transcodes (decodes and encodes) source content from the inputs that are attached to that channel, and packages the new content into outputs.","properties":{"CdiInputSpecification":"Specification of CDI inputs for this channel.","ChannelClass":"The class for this channel. For a channel with two pipelines, the class is STANDARD. For a channel with one pipeline, the class is SINGLE_PIPELINE.","Destinations":"The settings that identify the destination for the outputs in this MediaLive output package.","EncoderSettings":"The encoding configuration for the output content.","InputAttachments":"The list of input attachments for the channel.","InputSpecification":"The input specification for this channel. It specifies the key characteristics of the inputs for this channel: the maximum bitrate, the resolution, and the codec.","LogLevel":"The verbosity for logging activity for this channel. Charges for logging (which are generated through Amazon CloudWatch Logging) are higher for higher verbosities.","Maintenance":"","Name":"A name for this audio selector. The AudioDescription (in an output) references this name in order to identify a specific input audio to include in that output.","RoleArn":"The IAM role for MediaLive to assume when running this channel. The role is identified by its ARN.","Tags":"A collection of tags for this channel. Each tag is a key-value pair.","Vpc":"Settings to enable VPC mode in the channel, so that the endpoints for all outputs are in your VPC."}},"AWS::MediaLive::Channel.AacSettings":{"attributes":{},"description":"The settings for an AAC audio encode in the output.\\n\\nThe parent of this entity is AudioCodecSettings.","properties":{"Bitrate":"The average bitrate in bits/second. Valid values depend on the rate control mode and profile.","CodingMode":"Mono, stereo, or 5.1 channel layout. Valid values depend on the rate control mode and profile. The adReceiverMix setting receives a stereo description plus control track, and emits a mono AAC encode of the description track, with control data emitted in the PES header as per ETSI TS 101 154 Annex E.","InputType":"Set to broadcasterMixedAd when the input contains pre-mixed main audio + AD (narration) as a stereo pair. The Audio Type field (audioType) will be set to 3, which signals to downstream systems that this stream contains broadcaster mixed AD. Note that the input received by the encoder must contain pre-mixed audio; MediaLive does not perform the mixing. The values in audioTypeControl and audioType (in AudioDescription) are ignored when set to broadcasterMixedAd. Leave this set to normal when the input does not contain pre-mixed audio + AD.","Profile":"The AAC profile.","RateControlMode":"The rate control mode.","RawFormat":"Sets the LATM/LOAS AAC output for raw containers.","SampleRate":"The sample rate in Hz. Valid values depend on the rate control mode and profile.","Spec":"Uses MPEG-2 AAC audio instead of MPEG-4 AAC audio for raw or MPEG-2 Transport Stream containers.","VbrQuality":"The VBR quality level. This is used only if rateControlMode is VBR."}},"AWS::MediaLive::Channel.Ac3Settings":{"attributes":{},"description":"The settings for an AC3 audio encode in the output.\\n\\nThe parent of this entity is AudioCodecSettings.","properties":{"Bitrate":"The average bitrate in bits/second. Valid bitrates depend on the coding mode.","BitstreamMode":"Specifies the bitstream mode (bsmod) for the emitted AC-3 stream. For more information about these values, see ATSC A/52-2012.","CodingMode":"The Dolby Digital coding mode. This determines the number of channels.","Dialnorm":"Sets the dialnorm for the output. If excluded and the input audio is Dolby Digital, dialnorm is passed through.","DrcProfile":"If set to filmStandard, adds dynamic range compression signaling to the output bitstream as defined in the Dolby Digital specification.","LfeFilter":"When set to enabled, applies a 120Hz lowpass filter to the LFE channel prior to encoding. This is valid only in codingMode32Lfe mode.","MetadataControl":"When set to followInput, encoder metadata is sourced from the DD, DD+, or DolbyE decoder that supplies this audio data. If the audio is supplied from one of these streams, the static metadata settings are used."}},"AWS::MediaLive::Channel.AncillarySourceSettings":{"attributes":{},"description":"Information about the ancillary captions to extract from the input.\\n\\nThe parent of this entity is CaptionSelectorSettings.","properties":{"SourceAncillaryChannelNumber":"Specifies the number (1 to 4) of the captions channel you want to extract from the ancillary captions. If you plan to convert the ancillary captions to another format, complete this field. If you plan to choose Embedded as the captions destination in the output (to pass through all the channels in the ancillary captions), leave this field blank because MediaLive ignores the field."}},"AWS::MediaLive::Channel.ArchiveCdnSettings":{"attributes":{},"description":"Settings to configure the destination of an Archive output.\\n\\nThe parent of this entity is ArchiveGroupSettings.","properties":{"ArchiveS3Settings":"Sets up Amazon S3 as the destination for this Archive output."}},"AWS::MediaLive::Channel.ArchiveContainerSettings":{"attributes":{},"description":"The archive container settings.\\n\\nThe parent of this entity is ArchiveOutputSettings.","properties":{"M2tsSettings":"The settings for the M2TS in the archive output.","RawSettings":"The settings for Raw archive output type."}},"AWS::MediaLive::Channel.ArchiveGroupSettings":{"attributes":{},"description":"The settings for an archive output group.\\n\\nThe parent of this entity is OutputGroupSettings.","properties":{"ArchiveCdnSettings":"Settings to configure the destination of an Archive output.","Destination":"A directory and base file name where archive files should be written.","RolloverInterval":"The number of seconds to write to an archive file before closing and starting a new one."}},"AWS::MediaLive::Channel.ArchiveOutputSettings":{"attributes":{},"description":"The archive output settings.\\n\\nThe parent of this entity is OutputSettings.","properties":{"ContainerSettings":"The settings that are specific to the container type of the file.","Extension":"The output file extension. If excluded, this is auto-selected from the container type.","NameModifier":"A string that is concatenated to the end of the destination file name. The string is required for multiple outputs of the same type."}},"AWS::MediaLive::Channel.ArchiveS3Settings":{"attributes":{},"description":"Sets up Amazon S3 as the destination for this Archive output.\\n\\nThe parent of this entity is ArchiveCdnSettings.","properties":{"CannedAcl":"Specify the canned ACL to apply to each S3 request. Defaults to none."}},"AWS::MediaLive::Channel.AribDestinationSettings":{"attributes":{},"description":"The configuration of ARIB captions in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{}},"AWS::MediaLive::Channel.AribSourceSettings":{"attributes":{},"description":"Information about the ARIB captions to extract from the input.\\n\\nThe parent of this entity is CaptionSelectorSettings.","properties":{}},"AWS::MediaLive::Channel.AudioChannelMapping":{"attributes":{},"description":"The settings for remixing audio.\\n\\nThe parent of this entity is RemixSettings.","properties":{"InputChannelLevels":"The indices and gain values for each input channel that should be remixed into this output channel.","OutputChannel":"The index of the output channel that is being produced."}},"AWS::MediaLive::Channel.AudioCodecSettings":{"attributes":{},"description":"The configuration of the audio codec in the audio output.\\n\\nThe parent of this entity is AudioDescription.","properties":{"AacSettings":"The setup of the AAC audio codec in the output.","Ac3Settings":"The setup of an AC3 audio codec in the output.","Eac3AtmosSettings":"","Eac3Settings":"The setup of an EAC3 audio codec in the output.","Mp2Settings":"The setup of an MP2 audio codec in the output.","PassThroughSettings":"The setup to pass through the Dolby audio codec to the output.","WavSettings":"Settings for audio encoded with the WAV codec."}},"AWS::MediaLive::Channel.AudioDescription":{"attributes":{},"description":"The encoding information for one output audio.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"AudioNormalizationSettings":"The advanced audio normalization settings.","AudioSelectorName":"The name of the AudioSelector that is used as the source for this AudioDescription.","AudioType":"Applies only if audioTypeControl is useConfigured. The values for audioType are defined in ISO-IEC 13818-1.","AudioTypeControl":"Determines how audio type is determined. followInput: If the input contains an ISO 639 audioType, then that value is passed through to the output. If the input contains no ISO 639 audioType, the value in Audio Type is included in the output. useConfigured: The value in Audio Type is included in the output. Note that this field and audioType are both ignored if inputType is broadcasterMixedAd.","AudioWatermarkingSettings":"Settings to configure one or more solutions that insert audio watermarks in the audio encode","CodecSettings":"The audio codec settings.","LanguageCode":"Indicates the language of the audio output track. Used only if languageControlMode is useConfigured, or there is no ISO 639 language code specified in the input.","LanguageCodeControl":"Choosing followInput causes the ISO 639 language code of the output to follow the ISO 639 language code of the input. The languageCode setting is used when useConfigured is set, or when followInput is selected but there is no ISO 639 language code specified by the input.","Name":"The name of this AudioDescription. Outputs use this name to uniquely identify this AudioDescription. Description names should be unique within this channel.","RemixSettings":"The settings that control how input audio channels are remixed into the output audio channels.","StreamName":"Used for Microsoft Smooth and Apple HLS outputs. Indicates the name displayed by the player (for example, English or Director Commentary)."}},"AWS::MediaLive::Channel.AudioDolbyEDecode":{"attributes":{},"description":"","properties":{"ProgramSelection":""}},"AWS::MediaLive::Channel.AudioHlsRenditionSelection":{"attributes":{},"description":"Selector for HLS audio rendition.\\n\\nThe parent of this entity is AudioSelectorSettings.","properties":{"GroupId":"Specifies the GROUP-ID in the #EXT-X-MEDIA tag of the target HLS audio rendition.","Name":"Specifies the NAME in the #EXT-X-MEDIA tag of the target HLS audio rendition."}},"AWS::MediaLive::Channel.AudioLanguageSelection":{"attributes":{},"description":"Information about the audio language to extract.\\n\\nThe parent of this entity is AudioSelectorSettings.","properties":{"LanguageCode":"Selects a specific three-letter language code from within an audio source.","LanguageSelectionPolicy":"When set to \\"strict,\\" the transport stream demux strictly identifies audio streams by their language descriptor. If a PMT update occurs such that an audio stream matching the initially selected language is no longer present, then mute is encoded until the language returns. If set to \\"loose,\\" then on a PMT update the demux chooses another audio stream in the program with the same stream type if it can\'t find one with the same language."}},"AWS::MediaLive::Channel.AudioNormalizationSettings":{"attributes":{},"description":"The settings for normalizing video.\\n\\nThe parent of this entity is AudioDescription.","properties":{"Algorithm":"The audio normalization algorithm to use. itu17701 conforms to the CALM Act specification. itu17702 conforms to the EBU R-128 specification.","AlgorithmControl":"When set to correctAudio, the output audio is corrected using the chosen algorithm. If set to measureOnly, the audio is measured but not adjusted.","TargetLkfs":"The Target LKFS(loudness) to adjust volume to. If no value is entered, a default value is used according to the chosen algorithm. The CALM Act (1770-1) recommends a target of -24 LKFS. The EBU R-128 specification (1770-2) recommends a target of -23 LKFS."}},"AWS::MediaLive::Channel.AudioOnlyHlsSettings":{"attributes":{},"description":"The configuration of an audio-only HLS output.\\n\\nThe parent of this entity is HlsSettings.","properties":{"AudioGroupId":"Specifies the group that the audio rendition belongs to.","AudioOnlyImage":"Used with an audio-only stream. It must be a .jpg or .png file. If given, this image is used as the cover art for the audio-only output. Ideally, it should be formatted for an iPhone screen for two reasons. The iPhone does not resize the image; instead, it crops a centered image on the top/bottom and left/right. Additionally, this image file gets saved bit-for-bit into every 10-second segment file, so it increases bandwidth by {image file size} * {segment count} * {user count.}.","AudioTrackType":"Four types of audio-only tracks are supported: Audio-Only Variant Stream The client can play back this audio-only stream instead of video in low-bandwidth scenarios. Represented as an EXT-X-STREAM-INF in the HLS manifest. Alternate Audio, Auto Select, Default Alternate rendition that the client should try to play back by default. Represented as an EXT-X-MEDIA in the HLS manifest with DEFAULT=YES, AUTOSELECT=YES Alternate Audio, Auto Select, Not Default Alternate rendition that the client might try to play back by default. Represented as an EXT-X-MEDIA in the HLS manifest with DEFAULT=NO, AUTOSELECT=YES Alternate Audio, not Auto Select Alternate rendition that the client will not try to play back by default. Represented as an EXT-X-MEDIA in the HLS manifest with DEFAULT=NO, AUTOSELECT=NO.","SegmentType":"Specifies the segment type."}},"AWS::MediaLive::Channel.AudioPidSelection":{"attributes":{},"description":"Used to extract audio by The PID.\\n\\nThe parent of this entity is AudioSelectorSettings.","properties":{"Pid":"Select the audio by this PID."}},"AWS::MediaLive::Channel.AudioSelector":{"attributes":{},"description":"Information about one audio to extract from the input.\\n\\nThe parent of this entity is InputSettings.","properties":{"Name":"A name for this AudioSelector.","SelectorSettings":"Information about the specific audio to extract from the input."}},"AWS::MediaLive::Channel.AudioSelectorSettings":{"attributes":{},"description":"Information about the audio to extract from the input.\\n\\nThe parent of this entity is AudioSelector.","properties":{"AudioHlsRenditionSelection":"Selector for HLS audio rendition.","AudioLanguageSelection":"The language code of the audio to select.","AudioPidSelection":"The PID of the audio to select.","AudioTrackSelection":"Information about the audio track to extract."}},"AWS::MediaLive::Channel.AudioSilenceFailoverSettings":{"attributes":{},"description":"MediaLive will perform a failover if audio is not detected in this input for the specified period.\\n\\nThe parent of this entity is FailoverConditionSettings.","properties":{"AudioSelectorName":"The name of the audio selector in the input that MediaLive should monitor to detect silence. Select your most important rendition. If you didn\'t create an audio selector in this input, leave blank.","AudioSilenceThresholdMsec":"The amount of time (in milliseconds) that the active input must be silent before automatic input failover occurs. Silence is defined as audio loss or audio quieter than -50 dBFS."}},"AWS::MediaLive::Channel.AudioTrack":{"attributes":{},"description":"Information about one audio track to extract. You can select multiple tracks.\\n\\nThe parent of this entity is AudioTrackSelection.","properties":{"Track":"1-based integer value that maps to a specific audio track"}},"AWS::MediaLive::Channel.AudioTrackSelection":{"attributes":{},"description":"Information about the audio track to extract.\\n\\nThe parent of this entity is AudioSelectorSettings.","properties":{"DolbyEDecode":"","Tracks":"Selects one or more unique audio tracks from within a source."}},"AWS::MediaLive::Channel.AudioWatermarkSettings":{"attributes":{},"description":"Audio Watermark Settings\\n\\nThe parent of this entity is AudioDescription.","properties":{"NielsenWatermarksSettings":"Settings to configure Nielsen Watermarks in the audio encode"}},"AWS::MediaLive::Channel.AutomaticInputFailoverSettings":{"attributes":{},"description":"Settings to configure the conditions that will define the input as unhealthy and that will make MediaLive fail over to the other input in the input failover pair.\\n\\nThe parent of this entity is InputAttachment.","properties":{"ErrorClearTimeMsec":"This clear time defines the requirement a recovered input must meet to be considered healthy. The input must have no failover conditions for this length of time. Enter a time in milliseconds. This value is particularly important if the input_preference for the failover pair is set to PRIMARY_INPUT_PREFERRED, because after this time, MediaLive will switch back to the primary input.","FailoverConditions":"A list of failover conditions. If any of these conditions occur, MediaLive will perform a failover to the other input.","InputPreference":"Input preference when deciding which input to make active when a previously failed input has recovered.","SecondaryInputId":"The input ID of the secondary input in the automatic input failover pair."}},"AWS::MediaLive::Channel.AvailBlanking":{"attributes":{},"description":"The configuration of ad avail blanking in the output.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"AvailBlankingImage":"The blanking image to be used. Keep empty for solid black. Only .bmp and .png images are supported.","State":"When set to enabled, the video, audio, and captions are blanked when insertion metadata is added."}},"AWS::MediaLive::Channel.AvailConfiguration":{"attributes":{},"description":"The setup of ad avail handling in the output.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"AvailSettings":"The setup of ad avail handling in the output."}},"AWS::MediaLive::Channel.AvailSettings":{"attributes":{},"description":"The settings for the ad avail setup in the output.\\n\\nThe parent of this entity is AvailConfiguration.","properties":{"Esam":"","Scte35SpliceInsert":"The setup for SCTE-35 splice insert handling.","Scte35TimeSignalApos":"The setup for SCTE-35 time signal APOS handling."}},"AWS::MediaLive::Channel.BlackoutSlate":{"attributes":{},"description":"The settings for a blackout slate.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"BlackoutSlateImage":"The blackout slate image to be used. Keep empty for solid black. Only .bmp and .png images are supported.","NetworkEndBlackout":"Setting to enabled causes MediaLive to blackout the video, audio, and captions, and raise the \\"Network Blackout Image\\" slate when an SCTE104/35 Network End Segmentation Descriptor is encountered. The blackout is lifted when the Network Start Segmentation Descriptor is encountered. The Network End and Network Start descriptors must contain a network ID that matches the value entered in Network ID.","NetworkEndBlackoutImage":"The path to the local file to use as the Network End Blackout image. The image is scaled to fill the entire output raster.","NetworkId":"Provides a Network ID that matches EIDR ID format (for example, \\"10.XXXX/XXXX-XXXX-XXXX-XXXX-XXXX-C\\").","State":"When set to enabled, this causes video, audio, and captions to be blanked when indicated by program metadata."}},"AWS::MediaLive::Channel.BurnInDestinationSettings":{"attributes":{},"description":"The settings for burn-in captions in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{"Alignment":"If no explicit xPosition or yPosition is provided, setting alignment to centered places the captions at the bottom center of the output. Similarly, setting a left alignment aligns captions to the bottom left of the output. If x and y positions are specified in conjunction with the alignment parameter, the font is justified (either left or centered) relative to those coordinates. Selecting \\"smart\\" justification left-justifies live subtitles and center-justifies pre-recorded subtitles. All burn-in and DVB-Sub font settings must match.","BackgroundColor":"Specifies the color of the rectangle behind the captions. All burn-in and DVB-Sub font settings must match.","BackgroundOpacity":"Specifies the opacity of the background rectangle. 255 is opaque; 0 is transparent. Keeping this parameter blank is equivalent to setting it to 0 (transparent). All burn-in and DVB-Sub font settings must match.","Font":"The external font file that is used for captions burn-in. The file extension must be .ttf or .tte. Although you can select output fonts for many different types of input captions, embedded, STL, and Teletext sources use a strict grid system. Using external fonts with these captions sources could cause an unexpected display of proportional fonts. All burn-in and DVB-Sub font settings must match.","FontColor":"Specifies the color of the burned-in captions. This option is not valid for source captions that are STL, 608/embedded, or Teletext. These source settings are already pre-defined by the captions stream. All burn-in and DVB-Sub font settings must match.","FontOpacity":"Specifies the opacity of the burned-in captions. 255 is opaque; 0 is transparent. All burn-in and DVB-Sub font settings must match.","FontResolution":"The font resolution in DPI (dots per inch). The default is 96 dpi. All burn-in and DVB-Sub font settings must match.","FontSize":"When set to auto, fontSize scales depending on the size of the output. Providing a positive integer specifies the exact font size in points. All burn-in and DVB-Sub font settings must match.","OutlineColor":"Specifies the font outline color. This option is not valid for source captions that are either 608/embedded or Teletext. These source settings are already pre-defined by the captions stream. All burn-in and DVB-Sub font settings must match.","OutlineSize":"Specifies font outline size in pixels. This option is not valid for source captions that are either 608/embedded or Teletext. These source settings are already pre-defined by the captions stream. All burn-in and DVB-Sub font settings must match.","ShadowColor":"Specifies the color of the shadow cast by the captions. All burn-in and DVB-Sub font settings must match.","ShadowOpacity":"Specifies the opacity of the shadow. 255 is opaque; 0 is transparent. Keeping this parameter blank is equivalent to setting it to 0 (transparent). All burn-in and DVB-Sub font settings must match.","ShadowXOffset":"Specifies the horizontal offset of the shadow that is relative to the captions in pixels. A value of -2 would result in a shadow offset 2 pixels to the left. All burn-in and DVB-Sub font settings must match.","ShadowYOffset":"Specifies the vertical offset of the shadow that is relative to the captions in pixels. A value of -2 would result in a shadow offset 2 pixels above the text. All burn-in and DVB-Sub font settings must match.","TeletextGridControl":"Controls whether a fixed grid size is used to generate the output subtitles bitmap. This applies only to Teletext inputs and DVB-Sub/Burn-in outputs.","XPosition":"Specifies the horizontal position of the captions relative to the left side of the output in pixels. A value of 10 would result in the captions starting 10 pixels from the left of the output. If no explicit xPosition is provided, the horizontal captions position is determined by the alignment parameter. All burn-in and DVB-Sub font settings must match.","YPosition":"Specifies the vertical position of the captions relative to the top of the output in pixels. A value of 10 would result in the captions starting 10 pixels from the top of the output. If no explicit yPosition is provided, the captions are positioned towards the bottom of the output. All burn-in and DVB-Sub font settings must match."}},"AWS::MediaLive::Channel.CaptionDescription":{"attributes":{},"description":"The encoding information for output captions.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"Accessibility":"","CaptionSelectorName":"Specifies which input captions selector to use as a captions source when generating output captions. This field should match a captionSelector name.","DestinationSettings":"Additional settings for a captions destination that depend on the destination type.","LanguageCode":"An ISO 639-2 three-digit code. For more information, see http://www.loc.gov/standards/iso639-2/.","LanguageDescription":"Human-readable information to indicate the captions that are available for players (for example, English or Spanish).","Name":"The name of the captions description. The name is used to associate a captions description with an output. Names must be unique within a channel."}},"AWS::MediaLive::Channel.CaptionDestinationSettings":{"attributes":{},"description":"The configuration of one captions encode in the output.\\n\\nThe parent of this entity is CaptionDescription.","properties":{"AribDestinationSettings":"The configuration of one ARIB captions encode in the output.","BurnInDestinationSettings":"The configuration of one burn-in captions encode in the output.","DvbSubDestinationSettings":"The configuration of one DVB Sub captions encode in the output.","EbuTtDDestinationSettings":"Settings for EBU-TT captions in the output.","EmbeddedDestinationSettings":"The configuration of one embedded captions encode in the output.","EmbeddedPlusScte20DestinationSettings":"The configuration of one embedded plus SCTE-20 captions encode in the output.","RtmpCaptionInfoDestinationSettings":"The configuration of one RTMPCaptionInfo captions encode in the output.","Scte20PlusEmbeddedDestinationSettings":"The configuration of one SCTE20 plus embedded captions encode in the output.","Scte27DestinationSettings":"The configuration of one SCTE-27 captions encode in the output.","SmpteTtDestinationSettings":"The configuration of one SMPTE-TT captions encode in the output.","TeletextDestinationSettings":"The configuration of one Teletext captions encode in the output.","TtmlDestinationSettings":"The configuration of one TTML captions encode in the output.","WebvttDestinationSettings":"The configuration of one WebVTT captions encode in the output."}},"AWS::MediaLive::Channel.CaptionLanguageMapping":{"attributes":{},"description":"Maps a captions channel to an ISO 693-2 language code (http://www.loc.gov/standards/iso639-2), with an optional description.\\n\\nThe parent of this entity is HlsGroupSettings.","properties":{"CaptionChannel":"The closed caption channel being described by this CaptionLanguageMapping. Each channel mapping must have a unique channel number (maximum of 4).","LanguageCode":"A three-character ISO 639-2 language code (see http://www.loc.gov/standards/iso639-2).","LanguageDescription":"The textual description of language."}},"AWS::MediaLive::Channel.CaptionRectangle":{"attributes":{},"description":"Settings to configure the caption rectangle for an output captions that will be created using this Teletext source captions.\\n\\nThe parent of this entity is TeletextSourceSettings.","properties":{"Height":"See the description in leftOffset.\\n\\nFor height, specify the entire height of the rectangle as a percentage of the underlying frame height. For example, \\\\\\"80\\\\\\" means the rectangle height is 80% of the underlying frame height. The topOffset and rectangleHeight must add up to 100% or less. This field corresponds to tts:extent - Y in the TTML standard.","LeftOffset":"Applies only if you plan to convert these source captions to EBU-TT-D or TTML in an output. (Make sure to leave the default if you don\'t have either of these formats in the output.) You can define a display rectangle for the captions that is smaller than the underlying video frame. You define the rectangle by specifying the position of the left edge, top edge, bottom edge, and right edge of the rectangle, all within the underlying video frame. The units for the measurements are percentages. If you specify a value for one of these fields, you must specify a value for all of them.\\n\\nFor leftOffset, specify the position of the left edge of the rectangle, as a percentage of the underlying frame width, and relative to the left edge of the frame. For example, \\\\\\"10\\\\\\" means the measurement is 10% of the underlying frame width. The rectangle left edge starts at that position from the left edge of the frame. This field corresponds to tts:origin - X in the TTML standard.","TopOffset":"See the description in leftOffset.\\n\\nFor topOffset, specify the position of the top edge of the rectangle, as a percentage of the underlying frame height, and relative to the top edge of the frame. For example, \\\\\\"10\\\\\\" means the measurement is 10% of the underlying frame height. The rectangle top edge starts at that position from the top edge of the frame. This field corresponds to tts:origin - Y in the TTML standard.","Width":"See the description in leftOffset.\\n\\nFor width, specify the entire width of the rectangle as a percentage of the underlying frame width. For example, \\\\\\"80\\\\\\" means the rectangle width is 80% of the underlying frame width. The leftOffset and rectangleWidth must add up to 100% or less. This field corresponds to tts:extent - X in the TTML standard."}},"AWS::MediaLive::Channel.CaptionSelector":{"attributes":{},"description":"Information about one caption to extract from the input.\\n\\nThe parent of this entity is InputSettings.","properties":{"LanguageCode":"When specified, this field indicates the three-letter language code of the captions track to extract from the source.","Name":"The name identifier for a captions selector. This name is used to associate this captions selector with one or more captions descriptions. Names must be unique within a channel.","SelectorSettings":"Information about the specific audio to extract from the input."}},"AWS::MediaLive::Channel.CaptionSelectorSettings":{"attributes":{},"description":"Captions Selector Settings\\n\\nThe parent of this entity is CaptionSelector.","properties":{"AncillarySourceSettings":"Information about the ancillary captions to extract from the input.","AribSourceSettings":"Information about the ARIB captions to extract from the input.","DvbSubSourceSettings":"Information about the DVB Sub captions to extract from the input.","EmbeddedSourceSettings":"Information about the embedded captions to extract from the input.","Scte20SourceSettings":"Information about the SCTE-20 captions to extract from the input.","Scte27SourceSettings":"Information about the SCTE-27 captions to extract from the input.","TeletextSourceSettings":"Information about the Teletext captions to extract from the input."}},"AWS::MediaLive::Channel.CdiInputSpecification":{"attributes":{},"description":"The input specification for this channel. It specifies the key characteristics of CDI inputs for this channel, when those characteristics are different from other inputs.\\n\\nThis entity is at the top level in the channel.","properties":{"Resolution":"Maximum CDI input resolution"}},"AWS::MediaLive::Channel.ColorSpacePassthroughSettings":{"attributes":{},"description":"Passthrough applies no color space conversion to the output.\\n\\nThe parents of this entity are H264ColorSpaceSettings and H265ColorSpaceSettings.","properties":{}},"AWS::MediaLive::Channel.DolbyVision81Settings":{"attributes":{},"description":"","properties":{}},"AWS::MediaLive::Channel.DvbNitSettings":{"attributes":{},"description":"The configuration of DVB NIT.\\n\\nThe parent of this entity is M2tsSettings.","properties":{"NetworkId":"The numeric value placed in the Network Information Table (NIT).","NetworkName":"The network name text placed in the networkNameDescriptor inside the Network Information Table (NIT). The maximum length is 256 characters.","RepInterval":"The number of milliseconds between instances of this table in the output transport stream."}},"AWS::MediaLive::Channel.DvbSdtSettings":{"attributes":{},"description":"A DVB Service Description Table (SDT).\\n\\nThe parent of this entity is M2tsSettings.","properties":{"OutputSdt":"Selects a method of inserting SDT information into an output stream. The sdtFollow setting copies SDT information from input stream to output stream. The sdtFollowIfPresent setting copies SDT information from input stream to output stream if SDT information is present in the input. Otherwise, it falls back on the user-defined values. The sdtManual setting means that the user will enter the SDT information. The sdtNone setting means that the output stream will not contain SDT information.","RepInterval":"The number of milliseconds between instances of this table in the output transport stream.","ServiceName":"The service name placed in the serviceDescriptor in the Service Description Table (SDT). The maximum length is 256 characters.","ServiceProviderName":"The service provider name placed in the serviceDescriptor in the Service Description Table (SDT). The maximum length is 256 characters."}},"AWS::MediaLive::Channel.DvbSubDestinationSettings":{"attributes":{},"description":"The settings for DVB Sub captions in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{"Alignment":"If no explicit xPosition or yPosition is provided, setting the alignment to centered places the captions at the bottom center of the output. Similarly, setting a left alignment aligns captions to the bottom left of the output. If x and y positions are specified in conjunction with the alignment parameter, the font is justified (either left or centered) relative to those coordinates. Selecting \\"smart\\" justification left-justifies live subtitles and center-justifies pre-recorded subtitles. This option is not valid for source captions that are STL or 608/embedded. These source settings are already pre-defined by the captions stream. All burn-in and DVB-Sub font settings must match.","BackgroundColor":"Specifies the color of the rectangle behind the captions. All burn-in and DVB-Sub font settings must match.","BackgroundOpacity":"Specifies the opacity of the background rectangle. 255 is opaque; 0 is transparent. Keeping this parameter blank is equivalent to setting it to 0 (transparent). All burn-in and DVB-Sub font settings must match.","Font":"The external font file that is used for captions burn-in. The file extension must be .ttf or .tte. Although you can select output fonts for many different types of input captions, embedded, STL, and Teletext sources use a strict grid system. Using external fonts with these captions sources could cause an unexpected display of proportional fonts. All burn-in and DVB-Sub font settings must match.","FontColor":"Specifies the color of the burned-in captions. This option is not valid for source captions that are STL, 608/embedded, or Teletext. These source settings are already pre-defined by the captions stream. All burn-in and DVB-Sub font settings must match.","FontOpacity":"Specifies the opacity of the burned-in captions. 255 is opaque; 0 is transparent. All burn-in and DVB-Sub font settings must match.","FontResolution":"The font resolution in DPI (dots per inch). The default is 96 dpi. All burn-in and DVB-Sub font settings must match.","FontSize":"When set to auto, fontSize scales depending on the size of the output. Providing a positive integer specifies the exact font size in points. All burn-in and DVB-Sub font settings must match.","OutlineColor":"Specifies the font outline color. This option is not valid for source captions that are either 608/embedded or Teletext. These source settings are already pre-defined by the captions stream. All burn-in and DVB-Sub font settings must match.","OutlineSize":"Specifies the font outline size in pixels. This option is not valid for source captions that are either 608/embedded or Teletext. These source settings are already pre-defined by the captions stream. All burn-in and DVB-Sub font settings must match.","ShadowColor":"Specifies the color of the shadow that is cast by the captions. All burn-in and DVB-Sub font settings must match.","ShadowOpacity":"Specifies the opacity of the shadow. 255 is opaque; 0 is transparent. Keeping this parameter blank is equivalent to setting it to 0 (transparent). All burn-in and DVB-Sub font settings must match.","ShadowXOffset":"Specifies the horizontal offset of the shadow relative to the captions in pixels. A value of -2 would result in a shadow offset 2 pixels to the left. All burn-in and DVB-Sub font settings must match.","ShadowYOffset":"Specifies the vertical offset of the shadow relative to the captions in pixels. A value of -2 would result in a shadow offset 2 pixels above the text. All burn-in and DVB-Sub font settings must match.","TeletextGridControl":"Controls whether a fixed grid size is used to generate the output subtitles bitmap. This applies to only Teletext inputs and DVB-Sub/Burn-in outputs.","XPosition":"Specifies the horizontal position of the captions relative to the left side of the output in pixels. A value of 10 would result in the captions starting 10 pixels from the left of the output. If no explicit xPosition is provided, the horizontal captions position is determined by the alignment parameter. This option is not valid for source captions that are STL, 608/embedded, or Teletext. These source settings are already pre-defined by the captions stream. All burn-in and DVB-Sub font settings must match.","YPosition":"Specifies the vertical position of the captions relative to the top of the output in pixels. A value of 10 would result in the captions starting 10 pixels from the top of the output. If no explicit yPosition is provided, the captions are positioned towards the bottom of the output. This option is not valid for source captions that are STL, 608/embedded, or Teletext. These source settings are already pre-defined by the captions stream. All burn-in and DVB-Sub font settings must match."}},"AWS::MediaLive::Channel.DvbSubSourceSettings":{"attributes":{},"description":"Information about the DVB Sub captions to extract from the input.\\n\\nThe parent of this entity is CaptionSelectorSettings.","properties":{"OcrLanguage":"If you will configure a WebVTT caption description that references this caption selector, use this field to\\nprovide the language to consider when translating the image-based source to text.","Pid":"When using DVB-Sub with burn-in or SMPTE-TT, use this PID for the source content. It is unused for DVB-Sub passthrough. All DVB-Sub content is passed through, regardless of selectors."}},"AWS::MediaLive::Channel.DvbTdtSettings":{"attributes":{},"description":"The DVB Time and Date Table (TDT).\\n\\nThe parent of this entity is M2tsSettings.","properties":{"RepInterval":"The number of milliseconds between instances of this table in the output transport stream."}},"AWS::MediaLive::Channel.Eac3AtmosSettings":{"attributes":{},"description":"","properties":{"Bitrate":"","CodingMode":"","Dialnorm":"","DrcLine":"","DrcRf":"","HeightTrim":"","SurroundTrim":""}},"AWS::MediaLive::Channel.Eac3Settings":{"attributes":{},"description":"The settings for an EAC3 audio encode in the output.\\n\\nThe parent of this entity is AudioCodecSettings.","properties":{"AttenuationControl":"When set to attenuate3Db, applies a 3 dB attenuation to the surround channels. Used only for the 3/2 coding mode.","Bitrate":"The average bitrate in bits/second. Valid bitrates depend on the coding mode.","BitstreamMode":"Specifies the bitstream mode (bsmod) for the emitted E-AC-3 stream. For more information, see ATSC A/52-2012 (Annex E).","CodingMode":"The Dolby Digital Plus coding mode. This mode determines the number of channels.","DcFilter":"When set to enabled, activates a DC highpass filter for all input channels.","Dialnorm":"Sets the dialnorm for the output. If blank and the input audio is Dolby Digital Plus, dialnorm will be passed through.","DrcLine":"Sets the Dolby dynamic range compression profile.","DrcRf":"Sets the profile for heavy Dolby dynamic range compression, ensuring that the instantaneous signal peaks do not exceed specified levels.","LfeControl":"When encoding 3/2 audio, setting to lfe enables the LFE channel.","LfeFilter":"When set to enabled, applies a 120Hz lowpass filter to the LFE channel prior to encoding. Valid only with a codingMode32 coding mode.","LoRoCenterMixLevel":"The Left only/Right only center mix level. Used only for the 3/2 coding mode.","LoRoSurroundMixLevel":"The Left only/Right only surround mix level. Used only for a 3/2 coding mode.","LtRtCenterMixLevel":"The Left total/Right total center mix level. Used only for a 3/2 coding mode.","LtRtSurroundMixLevel":"The Left total/Right total surround mix level. Used only for the 3/2 coding mode.","MetadataControl":"When set to followInput, encoder metadata is sourced from the DD, DD+, or DolbyE decoder that supplies this audio data. If the audio is not supplied from one of these streams, then the static metadata settings are used.","PassthroughControl":"When set to whenPossible, input DD+ audio will be passed through if it is present on the input. This detection is dynamic over the life of the transcode. Inputs that alternate between DD+ and non-DD+ content will have a consistent DD+ output as the system alternates between passthrough and encoding.","PhaseControl":"When set to shift90Degrees, applies a 90-degree phase shift to the surround channels. Used only for a 3/2 coding mode.","StereoDownmix":"A stereo downmix preference. Used only for the 3/2 coding mode.","SurroundExMode":"When encoding 3/2 audio, sets whether an extra center back surround channel is matrix encoded into the left and right surround channels.","SurroundMode":"When encoding 2/0 audio, sets whether Dolby Surround is matrix-encoded into the two channels."}},"AWS::MediaLive::Channel.EbuTtDDestinationSettings":{"attributes":{},"description":"Settings for EBU-TT captions in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{"CopyrightHolder":"Applies only if you plan to convert these source captions to EBU-TT-D or TTML in an output. Complete this field if you want to include the name of the copyright holder in the copyright metadata tag in the TTML","FillLineGap":"Specifies how to handle the gap between the lines (in multi-line captions). - enabled: Fill with the captions background color (as specified in the input captions).\\n- disabled: Leave the gap unfilled.","FontFamily":"Specifies the font family to include in the font data attached to the EBU-TT captions. Valid only if styleControl is set to include. If you leave this field empty, the font family is set to \\"monospaced\\". (If styleControl is set to exclude, the font family is always set to \\"monospaced\\".) You specify only the font family. All other style information (color, bold, position and so on) is copied from the input captions. The size is always set to 100% to allow the downstream player to choose the size. - Enter a list of font families, as a comma-separated list of font names, in order of preference. The name can be a font family (such as “Arial”), or a generic font family (such as “serif”), or “default” (to let the downstream player choose the font).\\n- Leave blank to set the family to “monospace”.","StyleControl":"Specifies the style information (font color, font position, and so on) to include in the font data that is attached to the EBU-TT captions. - include: Take the style information (font color, font position, and so on) from the source captions and include that information in the font data attached to the EBU-TT captions. This option is valid only if the source captions are Embedded or Teletext.\\n- exclude: In the font data attached to the EBU-TT captions, set the font family to \\"monospaced\\". Do not include any other style information."}},"AWS::MediaLive::Channel.EmbeddedDestinationSettings":{"attributes":{},"description":"The configuration of embedded captions in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{}},"AWS::MediaLive::Channel.EmbeddedPlusScte20DestinationSettings":{"attributes":{},"description":"The settings for embedded plus SCTE-20 captions in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{}},"AWS::MediaLive::Channel.EmbeddedSourceSettings":{"attributes":{},"description":"Information about the embedded captions to extract from the input.\\n\\nThe parent of this entity is CaptionSelectorSettings.","properties":{"Convert608To708":"If this is upconvert, 608 data is both passed through the \\"608 compatibility bytes\\" fields of the 708 wrapper as well as translated into 708. If 708 data is present in the source content, it is discarded.","Scte20Detection":"Set to \\"auto\\" to handle streams with intermittent or non-aligned SCTE-20 and embedded captions.","Source608ChannelNumber":"Specifies the 608/708 channel number within the video track from which to extract captions. This is unused for passthrough.","Source608TrackNumber":"This field is unused and deprecated."}},"AWS::MediaLive::Channel.EncoderSettings":{"attributes":{},"description":"The settings for the encoding of outputs.\\n\\nThis entity is at the top level in the channel.","properties":{"AudioDescriptions":"The encoding information for output audio.","AvailBlanking":"The settings for ad avail blanking.","AvailConfiguration":"The configuration settings for the ad avail handling.","BlackoutSlate":"The settings for the blackout slate.","CaptionDescriptions":"The encoding information for output captions.","FeatureActivations":"Settings to enable specific features.","GlobalConfiguration":"The configuration settings that apply to the entire channel.","MotionGraphicsConfiguration":"Settings to enable and configure the motion graphics overlay feature in the channel.","NielsenConfiguration":"The settings to configure Nielsen watermarks.","OutputGroups":"The settings for the output groups in the channel.","TimecodeConfig":"Contains settings used to acquire and adjust timecode information from the inputs.","VideoDescriptions":"The encoding information for output videos."}},"AWS::MediaLive::Channel.Esam":{"attributes":{},"description":"","properties":{"AcquisitionPointId":"","AdAvailOffset":"","PasswordParam":"","PoisEndpoint":"","Username":"","ZoneIdentity":""}},"AWS::MediaLive::Channel.FailoverCondition":{"attributes":{},"description":"Failover Condition settings. There can be multiple failover conditions inside AutomaticInputFailoverSettings.\\n\\nThe parent of this entity is AutomaticInputFailoverSettings.","properties":{"FailoverConditionSettings":"Settings for a specific failover condition."}},"AWS::MediaLive::Channel.FailoverConditionSettings":{"attributes":{},"description":"Settings for one failover condition.\\n\\nThe parent of this entity is FailoverCondition.","properties":{"AudioSilenceSettings":"MediaLive will perform a failover if the specified audio selector is silent for the specified period.","InputLossSettings":"MediaLive will perform a failover if content is not detected in this input for the specified period.","VideoBlackSettings":"MediaLive will perform a failover if content is considered black for the specified period."}},"AWS::MediaLive::Channel.FeatureActivations":{"attributes":{},"description":"Settings to enable specific features. You can\'t configure these features until you have enabled them in the channel.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"InputPrepareScheduleActions":"Enables the Input Prepare feature. You can create Input Prepare actions in the schedule only if this feature is enabled.\\nIf you disable the feature on an existing schedule, make sure that you first delete all input prepare actions from the schedule."}},"AWS::MediaLive::Channel.FecOutputSettings":{"attributes":{},"description":"The settings for FEC.\\n\\nThe parent of this entity is UdpOutputSettings.","properties":{"ColumnDepth":"The parameter D from SMPTE 2022-1. The height of the FEC protection matrix. The number of transport stream packets per column error correction packet. The number must be between 4 and 20, inclusive.","IncludeFec":"Enables column only or column and row-based FEC.","RowLength":"The parameter L from SMPTE 2022-1. The width of the FEC protection matrix. Must be between 1 and 20, inclusive. If only Column FEC is used, then larger values increase robustness. If Row FEC is used, then this is the number of transport stream packets per row error correction packet, and the value must be between 4 and 20, inclusive, if includeFec is columnAndRow. If includeFec is column, this value must be 1 to 20, inclusive."}},"AWS::MediaLive::Channel.Fmp4HlsSettings":{"attributes":{},"description":"Settings for the fMP4 containers.\\n\\nThe parent of this entity is HlsSettings.","properties":{"AudioRenditionSets":"List all the audio groups that are used with the video output stream. Input all the audio GROUP-IDs that are associated to the video, separate by \',\'.","NielsenId3Behavior":"If set to passthrough, Nielsen inaudible tones for media tracking will be detected in the input audio and an equivalent ID3 tag will be inserted in the output.","TimedMetadataBehavior":"When set to passthrough, timed metadata is passed through from input to output."}},"AWS::MediaLive::Channel.FrameCaptureCdnSettings":{"attributes":{},"description":"Settings to configure the destination of a Frame Capture output.\\n\\nThe parent of this entity is FrameCaptureGroupSettings.","properties":{"FrameCaptureS3Settings":"Sets up Amazon S3 as the destination for this Frame Capture output."}},"AWS::MediaLive::Channel.FrameCaptureGroupSettings":{"attributes":{},"description":"The settings for a frame capture output group.\\n\\nThe parent of this entity is OutputGroupSettings.","properties":{"Destination":"The destination for the frame capture files. The destination is either the URI for an Amazon S3 bucket and object, plus a file name prefix (for example, s3ssl://sportsDelivery/highlights/20180820/curling_) or the URI for a MediaStore container, plus a file name prefix (for example, mediastoressl://sportsDelivery/20180820/curling_). The final file names consist of the prefix from the destination field (for example, \\"curling_\\") + name modifier + the counter (5 digits, starting from 00001) + extension (which is always .jpg). For example, curlingLow.00001.jpg.","FrameCaptureCdnSettings":"Settings to configure the destination of a Frame Capture output."}},"AWS::MediaLive::Channel.FrameCaptureHlsSettings":{"attributes":{},"description":"Settings for a frame capture output in an HLS output group.\\n\\nThe parent of this entity is HlsSettings.","properties":{}},"AWS::MediaLive::Channel.FrameCaptureOutputSettings":{"attributes":{},"description":"The frame capture output settings.\\n\\nThe parent of this entity is OutputSettings.","properties":{"NameModifier":"Required if the output group contains more than one output. This modifier forms part of the output file name."}},"AWS::MediaLive::Channel.FrameCaptureS3Settings":{"attributes":{},"description":"Sets up Amazon S3 as the destination for this Frame Capture output.\\n\\nThe parent of this entity is FrameCaptureCdnSettings.","properties":{"CannedAcl":"Specify the canned ACL to apply to each S3 request. Defaults to none."}},"AWS::MediaLive::Channel.FrameCaptureSettings":{"attributes":{},"description":"The frame capture settings.\\n\\nThe parent of this entity is VideoCodecSettings.","properties":{"CaptureInterval":"The frequency, in seconds, for capturing frames for inclusion in the output. For example, \\"10\\" means capture a frame every 10 seconds.","CaptureIntervalUnits":"Unit for the frame capture interval.","TimecodeBurninSettings":""}},"AWS::MediaLive::Channel.GlobalConfiguration":{"attributes":{},"description":"The configuration settings that apply to the entire channel.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"InitialAudioGain":"The value to set the initial audio gain for the channel.","InputEndAction":"Indicates the action to take when the current input completes (for example, end-of-file). When switchAndLoopInputs is configured, MediaLive restarts at the beginning of the first input. When \\"none\\" is configured, MediaLive transcodes either black, a solid color, or a user-specified slate images per the \\"Input Loss Behavior\\" configuration until the next input switch occurs (which is controlled through the Channel Schedule API).","InputLossBehavior":"The settings for system actions when the input is lost.","OutputLockingMode":"Indicates how MediaLive pipelines are synchronized. PIPELINELOCKING - MediaLive attempts to synchronize the output of each pipeline to the other. EPOCHLOCKING - MediaLive attempts to synchronize the output of each pipeline to the Unix epoch.","OutputTimingSource":"Indicates whether the rate of frames emitted by the Live encoder should be paced by its system clock (which optionally might be locked to another source through NTP) or should be locked to the clock of the source that is providing the input stream.","SupportLowFramerateInputs":"Adjusts the video input buffer for streams with very low video frame rates. This is commonly set to enabled for music channels with less than one video frame per second."}},"AWS::MediaLive::Channel.H264ColorSpaceSettings":{"attributes":{},"description":"Settings for configuring color space in an H264 video encode.\\n\\nThe parent of this entity is H264Settings.","properties":{"ColorSpacePassthroughSettings":"Passthrough applies no color space conversion to the output.","Rec601Settings":"Settings to configure the handling of Rec601 color space.","Rec709Settings":"Settings to configure the handling of Rec709 color space."}},"AWS::MediaLive::Channel.H264FilterSettings":{"attributes":{},"description":"Settings to configure video filters that apply to the H264 codec.\\n\\nThe parent of this entity is H264Settings.","properties":{"TemporalFilterSettings":"Settings for applying the temporal filter to the video."}},"AWS::MediaLive::Channel.H264Settings":{"attributes":{},"description":"The settings for the H.264 codec in the output.\\n\\nThe parent of this entity is VideoCodecSettings.","properties":{"AdaptiveQuantization":"The adaptive quantization. This allows intra-frame quantizers to vary to improve visual quality.","AfdSignaling":"Indicates that AFD values will be written into the output stream. If afdSignaling is auto, the system tries to preserve the input AFD value (in cases where multiple AFD values are valid). If set to fixed, the AFD value is the value configured in the fixedAfd parameter.","Bitrate":"The average bitrate in bits/second. This is required when the rate control mode is VBR or CBR. It isn\'t used for QVBR. In a Microsoft Smooth output group, each output must have a unique value when its bitrate is rounded down to the nearest multiple of 1000.","BufFillPct":"The percentage of the buffer that should initially be filled (HRD buffer model).","BufSize":"The size of the buffer (HRD buffer model) in bits/second.","ColorMetadata":"Includes color space metadata in the output.","ColorSpaceSettings":"Settings to configure the color space handling for the video.","EntropyEncoding":"The entropy encoding mode. Use cabac (must be in Main or High profile) or cavlc.","FilterSettings":"Optional filters that you can apply to an encode.","FixedAfd":"A four-bit AFD value to write on all frames of video in the output stream. Valid only when afdSignaling is set to Fixed.","FlickerAq":"If set to enabled, adjusts the quantization within each frame to reduce flicker or pop on I-frames.","ForceFieldPictures":"This setting applies only when scan type is \\"interlaced.\\" It controls whether coding is performed on a field basis or on a frame basis. (When the video is progressive, the coding is always performed on a frame basis.)\\nenabled: Force MediaLive to code on a field basis, so that odd and even sets of fields are coded separately.\\ndisabled: Code the two sets of fields separately (on a field basis) or together (on a frame basis using PAFF), depending on what is most appropriate for the content.","FramerateControl":"Indicates how the output video frame rate is specified. If you select \\"specified,\\" the output video frame rate is determined by framerateNumerator and framerateDenominator. If you select \\"initializeFromSource,\\" the output video frame rate is set equal to the input video frame rate of the first input.","FramerateDenominator":"The frame rate denominator.","FramerateNumerator":"The frame rate numerator. The frame rate is a fraction, for example, 24000/1001 = 23.976 fps.","GopBReference":"If enabled, uses reference B frames for GOP structures that have B frames > 1.","GopClosedCadence":"The frequency of closed GOPs. In streaming applications, we recommend that you set this to 1 so that a decoder joining mid-stream will receive an IDR frame as quickly as possible. Setting this value to 0 will break output segmenting.","GopNumBFrames":"The number of B-frames between reference frames.","GopSize":"The GOP size (keyframe interval) in units of either frames or seconds per gopSizeUnits. The value must be greater than zero.","GopSizeUnits":"Indicates if the gopSize is specified in frames or seconds. If seconds, the system converts the gopSize into a frame count at runtime.","Level":"The H.264 level.","LookAheadRateControl":"The amount of lookahead. A value of low can decrease latency and memory usage, while high can produce better quality for certain content.","MaxBitrate":"For QVBR: See the tooltip for Quality level. For VBR: Set the maximum bitrate in order to accommodate expected spikes in the complexity of the video.","MinIInterval":"Meaningful only if sceneChangeDetect is set to enabled. This setting enforces separation between repeated (cadence) I-frames and I-frames inserted by Scene Change Detection. If a scene change I-frame is within I-interval frames of a cadence I-frame, the GOP is shrunk or stretched to the scene change I-frame. GOP stretch requires enabling lookahead as well as setting the I-interval. The normal cadence resumes for the next GOP. Note that the maximum GOP stretch = GOP size + Min-I-interval - 1.","NumRefFrames":"The number of reference frames to use. The encoder might use more than requested if you use B-frames or interlaced encoding.","ParControl":"Indicates how the output pixel aspect ratio is specified. If \\"specified\\" is selected, the output video pixel aspect ratio is determined by parNumerator and parDenominator. If \\"initializeFromSource\\" is selected, the output pixels aspect ratio will be set equal to the input video pixel aspect ratio of the first input.","ParDenominator":"The Pixel Aspect Ratio denominator.","ParNumerator":"The Pixel Aspect Ratio numerator.","Profile":"An H.264 profile.","QualityLevel":"Leave as STANDARD_QUALITY or choose a different value (which might result in additional costs to run the channel).\\n- ENHANCED_QUALITY: Produces a slightly better video quality without an increase in the bitrate. Has an effect only when the Rate control mode is QVBR or CBR. If this channel is in a MediaLive multiplex, the value must be ENHANCED_QUALITY.\\n- STANDARD_QUALITY: Valid for any Rate control mode.","QvbrQualityLevel":"Controls the target quality for the video encode. This applies only when the rate control mode is QVBR. Set values for the QVBR quality level field and Max bitrate field that suit your most important viewing devices. Recommended values are: - Primary screen: Quality level: 8 to 10. Max bitrate: 4M - PC or tablet: Quality level: 7. Max bitrate: 1.5M to 3M - Smartphone: Quality level: 6. Max bitrate: 1M to 1.5M.","RateControlMode":"The rate control mode. QVBR: The quality will match the specified quality level except when it is constrained by the maximum bitrate. We recommend this if you or your viewers pay for bandwidth. VBR: The quality and bitrate vary, depending on the video complexity. We recommend this instead of QVBR if you want to maintain a specific average bitrate over the duration of the channel. CBR: The quality varies, depending on the video complexity. We recommend this only if you distribute your assets to devices that can\'t handle variable bitrates.","ScanType":"Sets the scan type of the output to progressive or top-field-first interlaced.","SceneChangeDetect":"The scene change detection. On: inserts I-frames when the scene change is detected. Off: does not force an I-frame when the scene change is detected.","Slices":"The number of slices per picture. The number must be less than or equal to the number of macroblock rows for progressive pictures, and less than or equal to half the number of macroblock rows for interlaced pictures. This field is optional. If you don\'t specify a value, MediaLive chooses the number of slices based on the encode resolution.","Softness":"Softness. Selects a quantizer matrix. Larger values reduce high-frequency content in the encoded image.","SpatialAq":"If set to enabled, adjusts quantization within each frame based on the spatial variation of content complexity.","SubgopLength":"If set to fixed, uses gopNumBFrames B-frames per sub-GOP. If set to dynamic, optimizes the number of B-frames used for each sub-GOP to improve visual quality.","Syntax":"Produces a bitstream that is compliant with SMPTE RP-2027.","TemporalAq":"If set to enabled, adjusts quantization within each frame based on the temporal variation of content complexity.","TimecodeBurninSettings":"","TimecodeInsertion":"Determines how timecodes should be inserted into the video elementary stream. disabled: don\'t include timecodes. picTimingSei: pass through picture timing SEI messages from the source specified in Timecode Config."}},"AWS::MediaLive::Channel.H265ColorSpaceSettings":{"attributes":{},"description":"H265 Color Space Settings\\n\\nThe parent of this entity is H265Settings.","properties":{"ColorSpacePassthroughSettings":"Passthrough applies no color space conversion to the output.","DolbyVision81Settings":"","Hdr10Settings":"Settings to configure the handling of HDR10 color space.","Rec601Settings":"Settings to configure the handling of Rec601 color space.","Rec709Settings":"Settings to configure the handling of Rec709 color space."}},"AWS::MediaLive::Channel.H265FilterSettings":{"attributes":{},"description":"Settings to configure video filters that apply to the H265 codec.\\n\\nThe parent of this entity is H265Settings.","properties":{"TemporalFilterSettings":"Settings for applying the temporal filter to the video."}},"AWS::MediaLive::Channel.H265Settings":{"attributes":{},"description":"H265 Settings\\n\\nThe parent of this entity is VideoCodecSettings.","properties":{"AdaptiveQuantization":"Adaptive quantization. Allows intra-frame quantizers to vary to improve visual quality.","AfdSignaling":"Indicates that AFD values will be written into the output stream. If afdSignaling is \\"auto\\", the system will try to preserve the input AFD value (in cases where multiple AFD values are valid). If set to \\"fixed\\", the AFD value will be the value configured in the fixedAfd parameter.","AlternativeTransferFunction":"Whether or not EML should insert an Alternative Transfer Function SEI message to support backwards compatibility with non-HDR decoders and displays.","Bitrate":"Average bitrate in bits/second. Required when the rate control mode is VBR or CBR. Not used for QVBR. In an MS Smooth output group, each output must have a unique value when its bitrate is rounded down to the nearest multiple of 1000.","BufSize":"Size of buffer (HRD buffer model) in bits.","ColorMetadata":"Includes colorspace metadata in the output.","ColorSpaceSettings":"Color Space settings","FilterSettings":"Optional filters that you can apply to an encode.","FixedAfd":"Four bit AFD value to write on all frames of video in the output stream. Only valid when afdSignaling is set to \'Fixed\'.","FlickerAq":"If set to enabled, adjust quantization within each frame to reduce flicker or \'pop\' on I-frames.","FramerateDenominator":"Framerate denominator.","FramerateNumerator":"Framerate numerator - framerate is a fraction, e.g. 24000 / 1001 = 23.976 fps.","GopClosedCadence":"Frequency of closed GOPs. In streaming applications, it is recommended that this be set to 1 so a decoder joining mid-stream will receive an IDR frame as quickly as possible. Setting this value to 0 will break output segmenting.","GopSize":"GOP size (keyframe interval) in units of either frames or seconds per gopSizeUnits.\\nIf gopSizeUnits is frames, gopSize must be an integer and must be greater than or equal to 1.\\nIf gopSizeUnits is seconds, gopSize must be greater than 0, but need not be an integer.","GopSizeUnits":"Indicates if the gopSize is specified in frames or seconds. If seconds the system will convert the gopSize into a frame count at run time.","Level":"H.265 Level.","LookAheadRateControl":"Amount of lookahead. A value of low can decrease latency and memory usage, while high can produce better quality for certain content.","MaxBitrate":"For QVBR: See the tooltip for Quality level","MinIInterval":"Only meaningful if sceneChangeDetect is set to enabled. Defaults to 5 if multiplex rate control is used. Enforces separation between repeated (cadence) I-frames and I-frames inserted by Scene Change Detection. If a scene change I-frame is within I-interval frames of a cadence I-frame, the GOP is shrunk and/or stretched to the scene change I-frame. GOP stretch requires enabling lookahead as well as setting I-interval. The normal cadence resumes for the next GOP. Note: Maximum GOP stretch = GOP size + Min-I-interval - 1","ParDenominator":"Pixel Aspect Ratio denominator.","ParNumerator":"Pixel Aspect Ratio numerator.","Profile":"H.265 Profile.","QvbrQualityLevel":"Controls the target quality for the video encode. Applies only when the rate control mode is QVBR. Set values for the QVBR quality level field and Max bitrate field that suit your most important viewing devices. Recommended values are:\\n- Primary screen: Quality level: 8 to 10. Max bitrate: 4M\\n- PC or tablet: Quality level: 7. Max bitrate: 1.5M to 3M\\n- Smartphone: Quality level: 6. Max bitrate: 1M to 1.5M","RateControlMode":"Rate control mode. QVBR: Quality will match the specified quality level except when it is constrained by the\\nmaximum bitrate. Recommended if you or your viewers pay for bandwidth. CBR: Quality varies, depending on the video complexity. Recommended only if you distribute\\nyour assets to devices that cannot handle variable bitrates. Multiplex: This rate control mode is only supported (and is required) when the video is being\\ndelivered to a MediaLive Multiplex in which case the rate control configuration is controlled\\nby the properties within the Multiplex Program.","ScanType":"Sets the scan type of the output to progressive or top-field-first interlaced.","SceneChangeDetect":"Scene change detection.","Slices":"Number of slices per picture. Must be less than or equal to the number of macroblock rows for progressive pictures, and less than or equal to half the number of macroblock rows for interlaced pictures.\\nThis field is optional; when no value is specified the encoder will choose the number of slices based on encode resolution.","Tier":"H.265 Tier.","TimecodeBurninSettings":"","TimecodeInsertion":"Determines how timecodes should be inserted into the video elementary stream.\\n- \'disabled\': Do not include timecodes\\n- \'picTimingSei\': Pass through picture timing SEI messages from the source specified in Timecode Config"}},"AWS::MediaLive::Channel.Hdr10Settings":{"attributes":{},"description":"Hdr10 Settings\\n\\nThe parents of this entity are H265ColorSpaceSettings (for color space settings in the output) and VideoSelectorColorSpaceSettings (for color space settings in the input).","properties":{"MaxCll":"Maximum Content Light Level\\nAn integer metadata value defining the maximum light level, in nits,\\nof any single pixel within an encoded HDR video stream or file.","MaxFall":"Maximum Frame Average Light Level\\nAn integer metadata value defining the maximum average light level, in nits,\\nfor any single frame within an encoded HDR video stream or file."}},"AWS::MediaLive::Channel.HlsAkamaiSettings":{"attributes":{},"description":"The Akamai settings in an HLS output.\\n\\nThe parent of this entity is HlsCdnSettings.","properties":{"ConnectionRetryInterval":"The number of seconds to wait before retrying a connection to the CDN if the connection is lost.","FilecacheDuration":"The size, in seconds, of the file cache for streaming outputs.","HttpTransferMode":"Specifies whether to use chunked transfer encoding to Akamai. To enable this feature, contact Akamai.","NumRetries":"The number of retry attempts that will be made before the channel is put into an error state.","RestartDelay":"If a streaming output fails, the number of seconds to wait until a restart is initiated. A value of 0 means never restart.","Salt":"The salt for authenticated Akamai.","Token":"The token parameter for authenticated Akamai. If this is not specified, _gda_ is used."}},"AWS::MediaLive::Channel.HlsBasicPutSettings":{"attributes":{},"description":"The configuration of HLS Basic Put Settings.\\n\\nThe parent of this entity is HlsCdnSettings.","properties":{"ConnectionRetryInterval":"The number of seconds to wait before retrying a connection to the CDN if the connection is lost.","FilecacheDuration":"The size, in seconds, of the file cache for streaming outputs.","NumRetries":"The number of retry attempts that MediaLive makes before the channel is put into an error state.","RestartDelay":"If a streaming output fails, the number of seconds to wait until a restart is initiated. A value of 0 means never restart."}},"AWS::MediaLive::Channel.HlsCdnSettings":{"attributes":{},"description":"The settings for the CDN of an HLS output.\\n\\nThe parent of this entity is HlsGroupSettings.","properties":{"HlsAkamaiSettings":"Sets up Akamai as the downstream system for the HLS output group.","HlsBasicPutSettings":"The settings for Basic Put for the HLS output.","HlsMediaStoreSettings":"Sets up MediaStore as the destination for the HLS output.","HlsS3Settings":"Sets up Amazon S3 as the destination for this HLS output.","HlsWebdavSettings":"The settings for Web VTT captions in the HLS output group.\\n\\nThe parent of this entity is HlsGroupSettings."}},"AWS::MediaLive::Channel.HlsGroupSettings":{"attributes":{},"description":"The settings for an HLS output group.\\n\\nThe parent of this entity is OutputGroupSettings.","properties":{"AdMarkers":"Chooses one or more ad marker types to pass SCTE35 signals through to this group of Apple HLS outputs.","BaseUrlContent":"A partial URI prefix that will be prepended to each output in the media .m3u8 file. The partial URI prefix can be used if the base manifest is delivered from a different URL than the main .m3u8 file.","BaseUrlContent1":"Optional. One value per output group. This field is required only if you are completing Base URL content A, and the downstream system has notified you that the media files for pipeline 1 of all outputs are in a location different from the media files for pipeline 0.","BaseUrlManifest":"A partial URI prefix that will be prepended to each output in the media .m3u8 file. The partial URI prefix can be used if the base manifest is delivered from a different URL than the main .m3u8 file.","BaseUrlManifest1":"Optional. One value per output group. Complete this field only if you are completing Base URL manifest A, and the downstream system has notified you that the child manifest files for pipeline 1 of all outputs are in a location different from the child manifest files for pipeline 0.","CaptionLanguageMappings":"A mapping of up to 4 captions channels to captions languages. This is meaningful only if captionLanguageSetting is set to \\"insert.\\"","CaptionLanguageSetting":"Applies only to 608 embedded output captions. Insert: Include CLOSED-CAPTIONS lines in the manifest. Specify at least one language in the CC1 Language Code field. One CLOSED-CAPTION line is added for each Language Code that you specify. Make sure to specify the languages in the order in which they appear in the original source (if the source is embedded format) or the order of the captions selectors (if the source is other than embedded). Otherwise, languages in the manifest will not match properly with the output captions. None: Include the CLOSED-CAPTIONS=NONE line in the manifest. Omit: Omit any CLOSED-CAPTIONS line from the manifest.","ClientCache":"When set to \\"disabled,\\" sets the #EXT-X-ALLOW-CACHE:no tag in the manifest, which prevents clients from saving media segments for later replay.","CodecSpecification":"The specification to use (RFC-6381 or the default RFC-4281) during m3u8 playlist generation.","ConstantIv":"Used with encryptionType. This is a 128-bit, 16-byte hex value that is represented by a 32-character text string. If ivSource is set to \\"explicit,\\" this parameter is required and is used as the IV for encryption.","Destination":"A directory or HTTP destination for the HLS segments, manifest files, and encryption keys (if enabled).","DirectoryStructure":"Places segments in subdirectories.","DiscontinuityTags":"Specifies whether to insert EXT-X-DISCONTINUITY tags in the HLS child manifests for this output group.\\nTypically, choose Insert because these tags are required in the manifest (according to the HLS specification) and serve an important purpose.\\nChoose Never Insert only if the downstream system is doing real-time failover (without using the MediaLive automatic failover feature) and only if that downstream system has advised you to exclude the tags.","EncryptionType":"Encrypts the segments with the specified encryption scheme. Exclude this parameter if you don\'t want encryption.","HlsCdnSettings":"The parameters that control interactions with the CDN.","HlsId3SegmentTagging":"State of HLS ID3 Segment Tagging","IFrameOnlyPlaylists":"DISABLED: Don\'t create an I-frame-only manifest, but do create the master and media manifests (according to the Output Selection field). STANDARD: Create an I-frame-only manifest for each output that contains video, as well as the other manifests (according to the Output Selection field). The I-frame manifest contains a #EXT-X-I-FRAMES-ONLY tag to indicate it is I-frame only, and one or more #EXT-X-BYTERANGE entries identifying the I-frame position. For example, #EXT-X-BYTERANGE:160364@1461888\\".","IncompleteSegmentBehavior":"Specifies whether to include the final (incomplete) segment in the media output when the pipeline stops producing output because of a channel stop, a channel pause or a loss of input to the pipeline.\\nAuto means that MediaLive decides whether to include the final segment, depending on the channel class and the types of output groups.\\nSuppress means to never include the incomplete segment. We recommend you choose Auto and let MediaLive control the behavior.","IndexNSegments":"Applies only if the Mode field is LIVE. Specifies the maximum number of segments in the media manifest file. After this maximum, older segments are removed from the media manifest. This number must be less than or equal to the Keep Segments field.","InputLossAction":"A parameter that controls output group behavior on an input loss.","IvInManifest":"Used with encryptionType. The IV (initialization vector) is a 128-bit number used in conjunction with the key for encrypting blocks. If set to \\"include,\\" the IV is listed in the manifest. Otherwise, the IV is not in the manifest.","IvSource":"Used with encryptionType. The IV (initialization vector) is a 128-bit number used in conjunction with the key for encrypting blocks. If this setting is \\"followsSegmentNumber,\\" it causes the IV to change every segment (to match the segment number). If this is set to \\"explicit,\\" you must enter a constantIv value.","KeepSegments":"Applies only if the Mode field is LIVE. Specifies the number of media segments (.ts files) to retain in the destination directory.","KeyFormat":"Specifies how the key is represented in the resource identified by the URI. If the parameter is absent, an implicit value of \\"identity\\" is used. A reverse DNS string can also be specified.","KeyFormatVersions":"Either a single positive integer version value or a slash-delimited list of version values (1/2/3).","KeyProviderSettings":"The key provider settings.","ManifestCompression":"When set to gzip, compresses HLS playlist.","ManifestDurationFormat":"Indicates whether the output manifest should use a floating point or integer values for segment duration.","MinSegmentLength":"When set, minimumSegmentLength is enforced by looking ahead and back within the specified range for a nearby avail and extending the segment size if needed.","Mode":"If \\"vod,\\" all segments are indexed and kept permanently in the destination and manifest. If \\"live,\\" only the number segments specified in keepSegments and indexNSegments are kept. Newer segments replace older segments, which might prevent players from rewinding all the way to the beginning of the channel. VOD mode uses HLS EXT-X-PLAYLIST-TYPE of EVENT while the channel is running, converting it to a \\"VOD\\" type manifest on completion of the stream.","OutputSelection":"MANIFESTSANDSEGMENTS: Generates manifests (the master manifest, if applicable, and media manifests) for this output group. SEGMENTSONLY: Doesn\'t generate any manifests for this output group.","ProgramDateTime":"Includes or excludes the EXT-X-PROGRAM-DATE-TIME tag in .m3u8 manifest files. The value is calculated as follows: Either the program date and time are initialized using the input timecode source, or the time is initialized using the input timecode source and the date is initialized using the timestampOffset.","ProgramDateTimeClock":"","ProgramDateTimePeriod":"The period of insertion of the EXT-X-PROGRAM-DATE-TIME entry, in seconds.","RedundantManifest":"ENABLED: The master manifest (.m3u8 file) for each pipeline includes information about both pipelines: first its own media files, then the media files of the other pipeline. This feature allows a playout device that supports stale manifest detection to switch from one manifest to the other, when the current manifest seems to be stale. There are still two destinations and two master manifests, but both master manifests reference the media files from both pipelines. DISABLED: The master manifest (.m3u8 file) for each pipeline includes information about its own pipeline only. For an HLS output group with MediaPackage as the destination, the DISABLED behavior is always followed. MediaPackage regenerates the manifests it serves to players, so a redundant manifest from MediaLive is irrelevant.","SegmentLength":"The length of the MPEG-2 Transport Stream segments to create, in seconds. Note that segments will end on the next keyframe after this number of seconds, so the actual segment length might be longer.","SegmentationMode":"useInputSegmentation has been deprecated. The configured segment size is always used.","SegmentsPerSubdirectory":"The number of segments to write to a subdirectory before starting a new one. For this setting to have an effect, directoryStructure must be subdirectoryPerStream.","StreamInfResolution":"The include or exclude RESOLUTION attribute for a video in the EXT-X-STREAM-INF tag of a variant manifest.","TimedMetadataId3Frame":"Indicates the ID3 frame that has the timecode.","TimedMetadataId3Period":"The timed metadata interval, in seconds.","TimestampDeltaMilliseconds":"Provides an extra millisecond delta offset to fine tune the timestamps.","TsFileMode":"SEGMENTEDFILES: Emits the program as segments -multiple .ts media files. SINGLEFILE: Applies only if the Mode field is VOD. Emits the program as a single .ts media file. The media manifest includes #EXT-X-BYTERANGE tags to index segments for playback. A typical use for this value is when sending the output to AWS Elemental MediaConvert, which can accept only a single media file. Playback while the channel is running is not guaranteed due to HTTP server caching."}},"AWS::MediaLive::Channel.HlsInputSettings":{"attributes":{},"description":"Information about how to connect to the upstream system.\\n\\nThe parent of this entity is NetworkInputSettings.","properties":{"Bandwidth":"When specified, the HLS stream with the m3u8 bandwidth that most closely matches this value is chosen. Otherwise, the highest bandwidth stream in the m3u8 is chosen. The bitrate is specified in bits per second, as in an HLS manifest.","BufferSegments":"When specified, reading of the HLS input begins this many buffer segments from the end (most recently written segment). When not specified, the HLS input begins with the first segment specified in the m3u8.","Retries":"The number of consecutive times that attempts to read a manifest or segment must fail before the input is considered unavailable.","RetryInterval":"The number of seconds between retries when an attempt to read a manifest or segment fails.","Scte35Source":"Identifies the source for the SCTE-35 messages that MediaLive will ingest. Messages can be ingested from the content segments (in the stream) or from tags in the playlist (the HLS manifest). MediaLive ignores SCTE-35 information in the source that is not selected."}},"AWS::MediaLive::Channel.HlsMediaStoreSettings":{"attributes":{},"description":"The configuration of a MediaStore container as the destination for an HLS output.\\n\\nThe parent of this entity is HlsCdnSettings.","properties":{"ConnectionRetryInterval":"The number of seconds to wait before retrying a connection to the CDN if the connection is lost.","FilecacheDuration":"The size, in seconds, of the file cache for streaming outputs.","MediaStoreStorageClass":"When set to temporal, output files are stored in non-persistent memory for faster reading and writing.","NumRetries":"The number of retry attempts that are made before the channel is put into an error state.","RestartDelay":"If a streaming output fails, the number of seconds to wait until a restart is initiated. A value of 0 means never restart."}},"AWS::MediaLive::Channel.HlsOutputSettings":{"attributes":{},"description":"The settings for an HLS output.\\n\\nThe parent of this entity is OutputSettings.","properties":{"H265PackagingType":"Only applicable when this output is referencing an H.265 video description.\\nSpecifies whether MP4 segments should be packaged as HEV1 or HVC1.","HlsSettings":"The settings regarding the underlying stream. These settings are different for audio-only outputs.","NameModifier":"A string that is concatenated to the end of the destination file name. Accepts \\\\\\"Format Identifiers\\\\\\":#formatIdentifierParameters.","SegmentModifier":"A string that is concatenated to the end of segment file names."}},"AWS::MediaLive::Channel.HlsS3Settings":{"attributes":{},"description":"Sets up Amazon S3 as the destination for this HLS output.\\n\\nThe parent of this entity is HlsCdnSettings.","properties":{"CannedAcl":"Specify the canned ACL to apply to each S3 request. Defaults to none."}},"AWS::MediaLive::Channel.HlsSettings":{"attributes":{},"description":"The settings for an HLS output.\\n\\nThe parent of this entity is HlsOutputSettings.","properties":{"AudioOnlyHlsSettings":"The settings for an audio-only output.","Fmp4HlsSettings":"The settings for an fMP4 container.","FrameCaptureHlsSettings":"Settings for a frame capture output in an HLS output group.","StandardHlsSettings":"The settings for a standard output (an output that is not audio-only)."}},"AWS::MediaLive::Channel.HlsWebdavSettings":{"attributes":{},"description":"The configuration of a WebDav server as the downstream system for an HLS output.\\n\\nThe parent of this entity is HlsCdnSettings.","properties":{"ConnectionRetryInterval":"The number of seconds to wait before retrying a connection to the CDN if the connection is lost.","FilecacheDuration":"The size, in seconds, of the file cache for streaming outputs.","HttpTransferMode":"Specifies whether to use chunked transfer encoding to WebDAV.","NumRetries":"The number of retry attempts that are made before the channel is put into an error state.","RestartDelay":"If a streaming output fails, the number of seconds to wait until a restart is initiated. A value of 0 means never restart."}},"AWS::MediaLive::Channel.HtmlMotionGraphicsSettings":{"attributes":{},"description":"Settings to configure the motion graphics overlay to use an HTML asset.\\n\\nThe parent of this entity is MotionGraphicsSetting.","properties":{}},"AWS::MediaLive::Channel.InputAttachment":{"attributes":{},"description":"An input to attach to this channel.\\n\\nThis entity is at the top level in the channel.","properties":{"AutomaticInputFailoverSettings":"Settings to implement automatic input failover in this input.","InputAttachmentName":"A name for the attachment. This is required if you want to use this input in an input switch action.","InputId":"The ID of the input to attach.","InputSettings":"Information about the content to extract from the input and about the general handling of the content."}},"AWS::MediaLive::Channel.InputChannelLevel":{"attributes":{},"description":"The setting to remix the audio.\\n\\nThe parent of this entity is AudioChannelMappings.","properties":{"Gain":"The remixing value. Units are in dB, and acceptable values are within the range from -60 (mute) to 6 dB.","InputChannel":"The index of the input channel that is used as a source."}},"AWS::MediaLive::Channel.InputLocation":{"attributes":{},"description":"The input location.\\n\\nThe parent of this entity is InputLossBehavior.","properties":{"PasswordParam":"The password parameter that holds the password for accessing the downstream system. This applies only if the downstream system requires credentials.","Uri":"The URI should be a path to a file that is accessible to the Live system (for example, an http:// URI) depending on the output type. For example, an RTMP destination should have a URI similar to rtmp://fmsserver/live.","Username":"The user name to connect to the downstream system. This applies only if the downstream system requires credentials."}},"AWS::MediaLive::Channel.InputLossBehavior":{"attributes":{},"description":"The configuration of channel behavior when the input is lost.\\n\\nThe parent of this entity is GlobalConfiguration.","properties":{"BlackFrameMsec":"On input loss, the number of milliseconds to substitute black into the output before switching to the frame specified by inputLossImageType. A value x, where 0 <= x <= 1,000,000 and a value of 1,000,000, is interpreted as infinite.","InputLossImageColor":"When the input loss image type is \\"color,\\" this field specifies the color to use. Value: 6 hex characters that represent the values of RGB.","InputLossImageSlate":"When the input loss image type is \\"slate,\\" these fields specify the parameters for accessing the slate.","InputLossImageType":"Indicates whether to substitute a solid color or a slate into the output after the input loss exceeds blackFrameMsec.","RepeatFrameMsec":"On input loss, the number of milliseconds to repeat the previous picture before substituting black into the output. A value x, where 0 <= x <= 1,000,000 and a value of 1,000,000, is interpreted as infinite."}},"AWS::MediaLive::Channel.InputLossFailoverSettings":{"attributes":{},"description":"MediaLive will perform a failover if content is not detected in this input for the specified period.\\n\\nThe parent of this entity is FailoverConditionSettings.","properties":{"InputLossThresholdMsec":"The amount of time (in milliseconds) that no input is detected. After that time, an input failover will occur."}},"AWS::MediaLive::Channel.InputSettings":{"attributes":{},"description":"Information about extracting content from the input and about handling the content.\\n\\nThe parent of this entity is InputAttachment.","properties":{"AudioSelectors":"Information about the specific audio to extract from the input.\\n\\nThe parent of this entity is InputSettings.","CaptionSelectors":"Information about the specific captions to extract from the input.","DeblockFilter":"Enables or disables the deblock filter when filtering.","DenoiseFilter":"Enables or disables the denoise filter when filtering.","FilterStrength":"Adjusts the magnitude of filtering from 1 (minimal) to 5 (strongest).","InputFilter":"Turns on the filter for this input. MPEG-2 inputs have the deblocking filter enabled by default. 1) auto - filtering is applied depending on input type/quality 2) disabled - no filtering is applied to the input 3) forced - filtering is applied regardless of the input type.","NetworkInputSettings":"Information about how to connect to the upstream system.","Scte35Pid":"","Smpte2038DataPreference":"Specifies whether to extract applicable ancillary data from a SMPTE-2038 source in this input. Applicable data types are captions, timecode, AFD, and SCTE-104 messages.\\n- PREFER: Extract from SMPTE-2038 if present in this input, otherwise extract from another source (if any).\\n- IGNORE: Never extract any ancillary data from SMPTE-2038.","SourceEndBehavior":"The loop input if it is a file.","VideoSelector":"Information about one video to extract from the input."}},"AWS::MediaLive::Channel.InputSpecification":{"attributes":{},"description":"The input specification for this channel. It specifies the key characteristics of the inputs for this channel: the maximum bitrate, the resolution, and the codec.\\n\\nThis entity is at the top level in the channel.","properties":{"Codec":"The codec to include in the input specification for this channel.","MaximumBitrate":"The maximum input bitrate for any input attached to this channel.","Resolution":"The resolution for any input attached to this channel."}},"AWS::MediaLive::Channel.KeyProviderSettings":{"attributes":{},"description":"The configuration of key provider settings.\\n\\nThe parent of this entity is HlsGroupSettings.","properties":{"StaticKeySettings":"The configuration of static key settings."}},"AWS::MediaLive::Channel.M2tsSettings":{"attributes":{},"description":"The configuration of the M2TS in the output.\\n\\nThe parents of this entity are ArchiveContainerSettings and UdpContainerSettings.","properties":{"AbsentInputAudioBehavior":"When set to drop, the output audio streams are removed from the program if the selected input audio stream is removed from the input. This allows the output audio configuration to dynamically change based on the input configuration. If this is set to encodeSilence, all output audio streams will output encoded silence when not connected to an active input stream.","Arib":"When set to enabled, uses ARIB-compliant field muxing and removes video descriptor.","AribCaptionsPid":"The PID for ARIB Captions in the transport stream. You can enter the value as a decimal or hexadecimal value. Valid values are 32 (or 0x20)..8182 (or 0x1ff6).","AribCaptionsPidControl":"If set to auto, The PID number used for ARIB Captions will be auto-selected from unused PIDs. If set to useConfigured, ARIB captions will be on the configured PID number.","AudioBufferModel":"When set to dvb, uses the DVB buffer model for Dolby Digital audio. When set to atsc, the ATSC model is used.","AudioFramesPerPes":"The number of audio frames to insert for each PES packet.","AudioPids":"The PID of the elementary audio streams in the transport stream. Multiple values are accepted, and can be entered in ranges or by comma separation. You can enter the value as a decimal or hexadecimal value. Each PID specified must be in the range of 32 (or 0x20)..8182 (or 0x1ff6).","AudioStreamType":"When set to atsc, uses stream type = 0x81 for AC3 and stream type = 0x87 for EAC3. When set to dvb, uses stream type = 0x06.","Bitrate":"The output bitrate of the transport stream in bits per second. Setting to 0 lets the muxer automatically determine the appropriate bitrate.","BufferModel":"If set to multiplex, uses the multiplex buffer model for accurate interleaving. Setting to bufferModel to none can lead to lower latency, but low-memory devices might not be able to play back the stream without interruptions.","CcDescriptor":"When set to enabled, generates captionServiceDescriptor in PMT.","DvbNitSettings":"Inserts a DVB Network Information Table (NIT) at the specified table repetition interval.","DvbSdtSettings":"Inserts a DVB Service Description Table (SDT) at the specified table repetition interval.","DvbSubPids":"The PID for the input source DVB Subtitle data to this output. Multiple values are accepted, and can be entered in ranges and/or by comma separation. You can enter the value as a decimal or hexadecimal value. Each PID specified must be in the range of 32 (or 0x20)..8182 (or 0x1ff6).","DvbTdtSettings":"Inserts DVB Time and Date Table (TDT) at the specified table repetition interval.","DvbTeletextPid":"The PID for the input source DVB Teletext data to this output. You can enter the value as a decimal or hexadecimal value. Valid values are 32 (or 0x20)..8182 (or 0x1ff6).","Ebif":"If set to passthrough, passes any EBIF data from the input source to this output.","EbpAudioInterval":"When videoAndFixedIntervals is selected, audio EBP markers are added to partitions 3 and 4. The interval between these additional markers is fixed, and is slightly shorter than the video EBP marker interval. This is only available when EBP Cablelabs segmentation markers are selected. Partitions 1 and 2 always follow the video interval.","EbpLookaheadMs":"When set, enforces that Encoder Boundary Points do not come within the specified time interval of each other by looking ahead at input video. If another EBP is going to come in within the specified time interval, the current EBP is not emitted, and the segment is \\"stretched\\" to the next marker. The lookahead value does not add latency to the system. The channel must be configured elsewhere to create sufficient latency to make the lookahead accurate.","EbpPlacement":"Controls placement of EBP on audio PIDs. If set to videoAndAudioPids, EBP markers are placed on the video PID and all audio PIDs. If set to videoPid, EBP markers are placed on only the video PID.","EcmPid":"This field is unused and deprecated.","EsRateInPes":"Includes or excludes the ES Rate field in the PES header.","EtvPlatformPid":"The PID for the input source ETV Platform data to this output. You can enter it as a decimal or hexadecimal value. Valid values are 32 (or 0x20) to 8182 (or 0x1ff6).","EtvSignalPid":"The PID for input source ETV Signal data to this output. You can enter the value as a decimal or hexadecimal value. Valid values are 32 (or 0x20)..8182 (or 0x1ff6).","FragmentTime":"The length in seconds of each fragment. This is used only with EBP markers.","Klv":"If set to passthrough, passes any KLV data from the input source to this output.","KlvDataPids":"The PID for the input source KLV data to this output. Multiple values are accepted, and can be entered in ranges or by comma separation. You can enter the value as a decimal or hexadecimal value. Each PID specified must be in the range of 32 (or 0x20)..8182 (or 0x1ff6).","NielsenId3Behavior":"If set to passthrough, Nielsen inaudible tones for media tracking will be detected in the input audio and an equivalent ID3 tag will be inserted in the output.","NullPacketBitrate":"The value, in bits per second, of extra null packets to insert into the transport stream. This can be used if a downstream encryption system requires periodic null packets.","PatInterval":"The number of milliseconds between instances of this table in the output transport stream. Valid values are 0, 10..1000.","PcrControl":"When set to pcrEveryPesPacket, a Program Clock Reference value is inserted for every Packetized Elementary Stream (PES) header. This parameter is effective only when the PCR PID is the same as the video or audio elementary stream.","PcrPeriod":"The maximum time, in milliseconds, between Program Clock References (PCRs) inserted into the transport stream.","PcrPid":"The PID of the Program Clock Reference (PCR) in the transport stream. When no value is given, MediaLive assigns the same value as the video PID. You can enter the value as a decimal or hexadecimal value. Valid values are 32 (or 0x20)..8182 (or 0x1ff6).","PmtInterval":"The number of milliseconds between instances of this table in the output transport stream. Valid values are 0, 10..1000.","PmtPid":"The PID for the Program Map Table (PMT) in the transport stream. You can enter the value as a decimal or hexadecimal value. Valid values are 32 (or 0x20)..8182 (or 0x1ff6).","ProgramNum":"The value of the program number field in the Program Map Table (PMT).","RateMode":"When VBR, does not insert null packets into the transport stream to fill the specified bitrate. The bitrate setting acts as the maximum bitrate when VBR is set.","Scte27Pids":"The PID for the input source SCTE-27 data to this output. Multiple values are accepted, and can be entered in ranges or by comma separation. You can enter the value as a decimal or hexadecimal value. Each PID specified must be in the range of 32 (or 0x20)..8182 (or 0x1ff6).","Scte35Control":"Optionally passes SCTE-35 signals from the input source to this output.","Scte35Pid":"The PID of the SCTE-35 stream in the transport stream. You can enter the value as a decimal or hexadecimal value. Valid values are 32 (or 0x20)..8182 (or 0x1ff6).","Scte35PrerollPullupMilliseconds":"","SegmentationMarkers":"Inserts segmentation markers at each segmentationTime period. raiSegstart sets the Random Access Indicator bit in the adaptation field. raiAdapt sets the RAI bit and adds the current timecode in the private data bytes. psiSegstart inserts PAT and PMT tables at the start of segments. ebp adds Encoder Boundary Point information to the adaptation field as per OpenCable specification OC-SP-EBP-I01-130118. ebpLegacy adds Encoder Boundary Point information to the adaptation field using a legacy proprietary format.","SegmentationStyle":"The segmentation style parameter controls how segmentation markers are inserted into the transport stream. With avails, it is possible that segments might be truncated, which can influence where future segmentation markers are inserted. When a segmentation style of resetCadence is selected and a segment is truncated due to an avail, we will reset the segmentation cadence. This means the subsequent segment will have a duration of $segmentationTime seconds. When a segmentation style of maintainCadence is selected and a segment is truncated due to an avail, we will not reset the segmentation cadence. This means the subsequent segment will likely be truncated as well. However, all segments after that will have a duration of $segmentationTime seconds. Note that EBP lookahead is a slight exception to this rule.","SegmentationTime":"The length, in seconds, of each segment. This is required unless markers is set to None_.","TimedMetadataBehavior":"When set to passthrough, timed metadata is passed through from input to output.","TimedMetadataPid":"The PID of the timed metadata stream in the transport stream. You can enter the value as a decimal or hexadecimal value. Valid values are 32 (or 0x20)..8182 (or 0x1ff6).","TransportStreamId":"The value of the transport stream ID field in the Program Map Table (PMT).","VideoPid":"The PID of the elementary video stream in the transport stream. You can enter the value as a decimal or hexadecimal value. Valid values are 32 (or 0x20)..8182 (or 0x1ff6)."}},"AWS::MediaLive::Channel.M3u8Settings":{"attributes":{},"description":"Settings for the M3U8 container.\\n\\nThe parent of this entity is StandardHlsSettings.","properties":{"AudioFramesPerPes":"The number of audio frames to insert for each PES packet.","AudioPids":"The PID of the elementary audio streams in the transport stream. Multiple values are accepted, and can be entered in ranges or by comma separation. You can enter the value as a decimal or hexadecimal value.","EcmPid":"This parameter is unused and deprecated.","NielsenId3Behavior":"If set to passthrough, Nielsen inaudible tones for media tracking will be detected in the input audio and an equivalent ID3 tag will be inserted in the output.","PatInterval":"The number of milliseconds between instances of this table in the output transport stream. A value of \\\\\\"0\\\\\\" writes out the PMT once per segment file.","PcrControl":"When set to pcrEveryPesPacket, a Program Clock Reference value is inserted for every Packetized Elementary Stream (PES) header. This parameter is effective only when the PCR PID is the same as the video or audio elementary stream.","PcrPeriod":"The maximum time, in milliseconds, between Program Clock References (PCRs) inserted into the transport stream.","PcrPid":"The PID of the Program Clock Reference (PCR) in the transport stream. When no value is given, MediaLive assigns the same value as the video PID. You can enter the value as a decimal or hexadecimal value.","PmtInterval":"The number of milliseconds between instances of this table in the output transport stream. A value of \\\\\\"0\\\\\\" writes out the PMT once per segment file.","PmtPid":"The PID for the Program Map Table (PMT) in the transport stream. You can enter the value as a decimal or hexadecimal value.","ProgramNum":"The value of the program number field in the Program Map Table (PMT).","Scte35Behavior":"If set to passthrough, passes any SCTE-35 signals from the input source to this output.","Scte35Pid":"The PID of the SCTE-35 stream in the transport stream. You can enter the value as a decimal or hexadecimal value.","TimedMetadataBehavior":"When set to passthrough, timed metadata is passed through from input to output.","TimedMetadataPid":"The PID of the timed metadata stream in the transport stream. You can enter the value as a decimal or hexadecimal value. Valid values are 32 (or 0x20)..8182 (or 0x1ff6).","TransportStreamId":"The value of the transport stream ID field in the Program Map Table (PMT).","VideoPid":"The PID of the elementary video stream in the transport stream. You can enter the value as a decimal or hexadecimal value."}},"AWS::MediaLive::Channel.MaintenanceCreateSettings":{"attributes":{},"description":"","properties":{"MaintenanceDay":"","MaintenanceStartTime":""}},"AWS::MediaLive::Channel.MaintenanceUpdateSettings":{"attributes":{},"description":"","properties":{"MaintenanceDay":"","MaintenanceScheduledDate":"","MaintenanceStartTime":""}},"AWS::MediaLive::Channel.MediaPackageGroupSettings":{"attributes":{},"description":"The settings for the MediaPackage group.\\n\\nThe parent of this entity is OutputGroupSettings.","properties":{"Destination":"The MediaPackage channel destination."}},"AWS::MediaLive::Channel.MediaPackageOutputDestinationSettings":{"attributes":{},"description":"Destination settings for a MediaPackage output.\\n\\nThe parent of this entity is OutputDestination.","properties":{"ChannelId":"The ID of the channel in MediaPackage that is the destination for this output group. You don\'t need to specify the individual inputs in MediaPackage; MediaLive handles the connection of the two MediaLive pipelines to the two MediaPackage inputs. The MediaPackage channel and MediaLive channel must be in the same Region."}},"AWS::MediaLive::Channel.MediaPackageOutputSettings":{"attributes":{},"description":"The settings for a MediaPackage output.\\n\\nThe parent of this entity is OutputSettings.","properties":{}},"AWS::MediaLive::Channel.MotionGraphicsConfiguration":{"attributes":{},"description":"Settings to enable and configure the motion graphics overlay feature in the channel.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"MotionGraphicsInsertion":"Enables or disables the motion graphics overlay feature in the channel.","MotionGraphicsSettings":"Settings to enable and configure the motion graphics overlay feature in the channel."}},"AWS::MediaLive::Channel.MotionGraphicsSettings":{"attributes":{},"description":"Settings to enable and configure the motion graphics overlay feature in the channel.\\n\\nThe parent of this entity is MotionGraphicsConfiguration.","properties":{"HtmlMotionGraphicsSettings":"Settings to configure the motion graphics overlay to use an HTML asset."}},"AWS::MediaLive::Channel.Mp2Settings":{"attributes":{},"description":"The configuration for this MP2 audio.\\n\\nThe parent of this entity is AudioCodecSettings.","properties":{"Bitrate":"The average bitrate in bits/second.","CodingMode":"The MPEG2 Audio coding mode. Valid values are codingMode10 (for mono) or codingMode20 (for stereo).","SampleRate":"The sample rate in Hz."}},"AWS::MediaLive::Channel.Mpeg2FilterSettings":{"attributes":{},"description":"Settings to configure video filters that apply to the MPEG-2 codec.\\n\\nThe parent of this entity is Mpeg2FilterSettings.","properties":{"TemporalFilterSettings":"Settings for applying the temporal filter to the video."}},"AWS::MediaLive::Channel.Mpeg2Settings":{"attributes":{},"description":"The settings for the MPEG-2 codec in the output.\\n\\nThe parent of this entity is VideoCodecSetting.","properties":{"AdaptiveQuantization":"Choose Off to disable adaptive quantization. Or choose another value to enable the quantizer and set its strength. The strengths are: Auto, Off, Low, Medium, High. When you enable this field, MediaLive allows intra-frame quantizers to vary, which might improve visual quality.","AfdSignaling":"Indicates the AFD values that MediaLive will write into the video encode. If you do not know what AFD signaling is, or if your downstream system has not given you guidance, choose AUTO.\\nAUTO: MediaLive will try to preserve the input AFD value (in cases where multiple AFD values are valid).\\nFIXED: MediaLive will use the value you specify in fixedAFD.","ColorMetadata":"Specifies whether to include the color space metadata. The metadata describes the color space that applies to the video (the colorSpace field). We recommend that you insert the metadata.","ColorSpace":"Choose the type of color space conversion to apply to the output. For detailed information on setting up both the input and the output to obtain the desired color space in the output, see the section on \\\\\\"MediaLive Features - Video - color space\\\\\\" in the MediaLive User Guide.\\nPASSTHROUGH: Keep the color space of the input content - do not convert it.\\nAUTO:Convert all content that is SD to rec 601, and convert all content that is HD to rec 709.","DisplayAspectRatio":"Sets the pixel aspect ratio for the encode.","FilterSettings":"Optionally specify a noise reduction filter, which can improve quality of compressed content. If you do not choose a filter, no filter will be applied.\\nTEMPORAL: This filter is useful for both source content that is noisy (when it has excessive digital artifacts) and source content that is clean.\\nWhen the content is noisy, the filter cleans up the source content before the encoding phase, with these two effects: First, it improves the output video quality because the content has been cleaned up. Secondly, it decreases the bandwidth because MediaLive does not waste bits on encoding noise.\\nWhen the content is reasonably clean, the filter tends to decrease the bitrate.","FixedAfd":"Complete this field only when afdSignaling is set to FIXED. Enter the AFD value (4 bits) to write on all frames of the video encode.","FramerateDenominator":"description\\": \\"The framerate denominator. For example, 1001. The framerate is the numerator divided by the denominator. For example, 24000 / 1001 = 23.976 FPS.","FramerateNumerator":"The framerate numerator. For example, 24000. The framerate is the numerator divided by the denominator. For example, 24000 / 1001 = 23.976 FPS.","GopClosedCadence":"MPEG2: default is open GOP.","GopNumBFrames":"Relates to the GOP structure. The number of B-frames between reference frames. If you do not know what a B-frame is, use the default.","GopSize":"Relates to the GOP structure. The GOP size (keyframe interval) in the units specified in gopSizeUnits. If you do not know what GOP is, use the default.\\nIf gopSizeUnits is frames, then the gopSize must be an integer and must be greater than or equal to 1.\\nIf gopSizeUnits is seconds, the gopSize must be greater than 0, but does not need to be an integer.","GopSizeUnits":"Relates to the GOP structure. Specifies whether the gopSize is specified in frames or seconds. If you do not plan to change the default gopSize, leave the default. If you specify SECONDS, MediaLive will internally convert the gop size to a frame count.","ScanType":"Set the scan type of the output to PROGRESSIVE or INTERLACED (top field first).","SubgopLength":"Relates to the GOP structure. If you do not know what GOP is, use the default.\\nFIXED: Set the number of B-frames in each sub-GOP to the value in gopNumBFrames.\\nDYNAMIC: Let MediaLive optimize the number of B-frames in each sub-GOP, to improve visual quality.","TimecodeBurninSettings":"","TimecodeInsertion":"Determines how MediaLive inserts timecodes in the output video. For detailed information about setting up the input and the output for a timecode, see the section on \\\\\\"MediaLive Features - Timecode configuration\\\\\\" in the MediaLive User Guide.\\nDISABLED: do not include timecodes.\\nGOP_TIMECODE: Include timecode metadata in the GOP header."}},"AWS::MediaLive::Channel.MsSmoothGroupSettings":{"attributes":{},"description":"The settings for a Microsoft Smooth output group.\\n\\nThe parent of this entity is OutputGroupSettings.","properties":{"AcquisitionPointId":"The value of the Acquisition Point Identity element that is used in each message placed in the sparse track. Enabled only if sparseTrackType is not \\"none.\\"","AudioOnlyTimecodeControl":"If set to passthrough for an audio-only Microsoft Smooth output, the fragment absolute time is set to the current timecode. This option does not write timecodes to the audio elementary stream.","CertificateMode":"If set to verifyAuthenticity, verifies the HTTPS certificate chain to a trusted certificate authority (CA). This causes HTTPS outputs to self-signed certificates to fail.","ConnectionRetryInterval":"The number of seconds to wait before retrying the connection to the IIS server if the connection is lost. Content is cached during this time, and the cache is delivered to the IIS server after the connection is re-established.","Destination":"The Smooth Streaming publish point on an IIS server. MediaLive acts as a \\"Push\\" encoder to IIS.","EventId":"The Microsoft Smooth channel ID that is sent to the IIS server. Specify the ID only if eventIdMode is set to useConfigured.","EventIdMode":"Specifies whether to send a channel ID to the IIS server. If no channel ID is sent and the same channel is used without changing the publishing point, clients might see cached video from the previous run. Options: - \\"useConfigured\\" - use the value provided in eventId - \\"useTimestamp\\" - generate and send a channel ID based on the current timestamp - \\"noEventId\\" - do not send a channel ID to the IIS server.","EventStopBehavior":"When set to sendEos, sends an EOS signal to an IIS server when stopping the channel.","FilecacheDuration":"The size, in seconds, of the file cache for streaming outputs.","FragmentLength":"The length, in seconds, of mp4 fragments to generate. The fragment length must be compatible with GOP size and frame rate.","InputLossAction":"A parameter that controls output group behavior on an input loss.","NumRetries":"The number of retry attempts.","RestartDelay":"The number of seconds before initiating a restart due to output failure, due to exhausting the numRetries on one segment, or exceeding filecacheDuration.","SegmentationMode":"useInputSegmentation has been deprecated. The configured segment size is always used.","SendDelayMs":"The number of milliseconds to delay the output from the second pipeline.","SparseTrackType":"If set to scte35, uses incoming SCTE-35 messages to generate a sparse track in this group of Microsoft Smooth outputs.","StreamManifestBehavior":"When set to send, sends a stream manifest so that the publishing point doesn\'t start until all streams start.","TimestampOffset":"The timestamp offset for the channel. Used only if timestampOffsetMode is set to useConfiguredOffset.","TimestampOffsetMode":"The type of timestamp date offset to use. - useEventStartDate: Use the date the channel was started as the offset - useConfiguredOffset: Use an explicitly configured date as the offset."}},"AWS::MediaLive::Channel.MsSmoothOutputSettings":{"attributes":{},"description":"Configuration of a Microsoft Smooth output.\\n\\nThe parent of this entity is OutputSettings.","properties":{"H265PackagingType":"Only applicable when this output is referencing an H.265 video description.\\nSpecifies whether MP4 segments should be packaged as HEV1 or HVC1.","NameModifier":"A string that is concatenated to the end of the destination file name. This is required for multiple outputs of the same type."}},"AWS::MediaLive::Channel.MultiplexGroupSettings":{"attributes":{},"description":"The settings for a Multiplex output group.\\n\\nThe parent of this entity is OutputGroupSettings.","properties":{}},"AWS::MediaLive::Channel.MultiplexOutputSettings":{"attributes":{},"description":"Configuration of a Multiplex output.\\n\\nThe parent of this entity is OutputSettings.","properties":{"Destination":"Destination is a Multiplex."}},"AWS::MediaLive::Channel.MultiplexProgramChannelDestinationSettings":{"attributes":{},"description":"Destination settings for a Multiplex output.\\n\\nThe parent of this entity is OutputDestination.","properties":{"MultiplexId":"The ID of the Multiplex that the encoder is providing output to. You do not need to specify the individual inputs to the Multiplex; MediaLive will handle the connection of the two MediaLive pipelines to the two Multiplex instances.\\nThe Multiplex must be in the same region as the Channel.","ProgramName":"The program name of the Multiplex program that the encoder is providing output to."}},"AWS::MediaLive::Channel.NetworkInputSettings":{"attributes":{},"description":"Information about how to connect to the upstream system.\\n\\nThe parent of this entity is InputSettings.","properties":{"HlsInputSettings":"Information about how to connect to the upstream system.","ServerValidation":"Checks HTTPS server certificates. When set to checkCryptographyOnly, cryptography in the certificate is checked, but not the server\'s name. Certain subdomains (notably S3 buckets that use dots in the bucket name) don\'t strictly match the corresponding certificate\'s wildcard pattern and would otherwise cause the channel to error. This setting is ignored for protocols that do not use HTTPS."}},"AWS::MediaLive::Channel.NielsenCBET":{"attributes":{},"description":"Complete these fields only if you want to insert watermarks of type Nielsen CBET\\n\\nThe parent of this entity is NielsenWatermarksSettings","properties":{"CbetCheckDigitString":"Enter the CBET check digits to use in the watermark.","CbetStepaside":"Determines the method of CBET insertion mode when prior encoding is detected on the same layer.","Csid":"Enter the CBET Source ID (CSID) to use in the watermark"}},"AWS::MediaLive::Channel.NielsenConfiguration":{"attributes":{},"description":"The settings to configure Nielsen watermarks.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"DistributorId":"Enter the Distributor ID assigned to your organization by Nielsen.","NielsenPcmToId3Tagging":"Enables Nielsen PCM to ID3 tagging"}},"AWS::MediaLive::Channel.NielsenNaesIiNw":{"attributes":{},"description":"Complete these fields only if you want to insert watermarks of type Nielsen NAES II (N2) and Nielsen NAES VI (NW).\\n\\nThe parent of this entity is NielsenWatermarksSettings.","properties":{"CheckDigitString":"Enter the check digit string for the watermark","Sid":"Enter the Nielsen Source ID (SID) to include in the watermark","Timezone":""}},"AWS::MediaLive::Channel.NielsenWatermarksSettings":{"attributes":{},"description":"Settings to configure Nielsen Watermarks in the audio encode.\\n\\nThe parent of this entity is AudioWatermarkSettings.","properties":{"NielsenCbetSettings":"Complete these fields only if you want to insert watermarks of type Nielsen CBET","NielsenDistributionType":"Choose the distribution types that you want to assign to the watermarks:\\n- PROGRAM_CONTENT\\n- FINAL_DISTRIBUTOR","NielsenNaesIiNwSettings":"Complete these fields only if you want to insert watermarks of type Nielsen NAES II (N2) and Nielsen NAES VI (NW)."}},"AWS::MediaLive::Channel.Output":{"attributes":{},"description":"The output settings.\\n\\nThe parent of this entity is OutputGroup.","properties":{"AudioDescriptionNames":"The names of the audio descriptions that are used as audio sources for this output.","CaptionDescriptionNames":"The names of the caption descriptions that are used as captions sources for this output.","OutputName":"The name that is used to identify an output.","OutputSettings":"The output type-specific settings.","VideoDescriptionName":"The name of the VideoDescription that is used as the source for this output."}},"AWS::MediaLive::Channel.OutputDestination":{"attributes":{},"description":"Configuration information for an output.\\n\\nThis entity is at the top level in the channel.","properties":{"Id":"The ID for this destination.","MediaPackageSettings":"The destination settings for a MediaPackage output.","MultiplexSettings":"Destination settings for a Multiplex output; one destination for both encoders.","Settings":"The destination settings for an output."}},"AWS::MediaLive::Channel.OutputDestinationSettings":{"attributes":{},"description":"The configuration information for this output.\\n\\nThe parent of this entity is OutputDestination.","properties":{"PasswordParam":"The password parameter that holds the password for accessing the downstream system. This password parameter applies only if the downstream system requires credentials.","StreamName":"The stream name for the content. This applies only to RTMP outputs.","Url":"The URL for the destination.","Username":"The user name to connect to the downstream system. This applies only if the downstream system requires credentials."}},"AWS::MediaLive::Channel.OutputGroup":{"attributes":{},"description":"The settings for one output group.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"Name":"A custom output group name that you can optionally define. Only letters, numbers, and the underscore character are allowed. The maximum length is 32 characters.","OutputGroupSettings":"The settings associated with the output group.","Outputs":"The settings for the outputs in the output group."}},"AWS::MediaLive::Channel.OutputGroupSettings":{"attributes":{},"description":"The configuration of the output group.\\n\\nThe parent of this entity is OutputGroup.","properties":{"ArchiveGroupSettings":"The configuration of an archive output group.\\n\\nThe parent of this entity is OutputGroupSettings.","FrameCaptureGroupSettings":"The configuration of a frame capture output group.","HlsGroupSettings":"The configuration of an HLS output group.","MediaPackageGroupSettings":"The configuration of a MediaPackage output group.","MsSmoothGroupSettings":"The configuration of a Microsoft Smooth output group.","MultiplexGroupSettings":"The settings for a Multiplex output group.","RtmpGroupSettings":"The configuration of an RTMP output group.","UdpGroupSettings":"The configuration of a UDP output group."}},"AWS::MediaLive::Channel.OutputLocationRef":{"attributes":{},"description":"A reference to an OutputDestination ID that is defined in the channel.\\n\\nThis entity is used by ArchiveGroupSettings, FrameCaptureGroupSettings, HlsGroupSettings, MediaPackageGroupSettings, MSSmoothGroupSettings, RtmpOutputSettings, and UdpOutputSettings.","properties":{"DestinationRefId":"A reference ID for this destination."}},"AWS::MediaLive::Channel.OutputSettings":{"attributes":{},"description":"The output settings.\\n\\nThe parent of this entity is Output.","properties":{"ArchiveOutputSettings":"The settings for an archive output.","FrameCaptureOutputSettings":"The settings for a frame capture output.\\n\\nThe parent of this entity is OutputGroupSettings.","HlsOutputSettings":"The settings for an HLS output.\\n\\nThe parent of this entity is OutputGroupSettings.","MediaPackageOutputSettings":"The settings for a MediaPackage output.\\n\\nThe parent of this entity is OutputGroupSettings.","MsSmoothOutputSettings":"The settings for a Microsoft Smooth output.","MultiplexOutputSettings":"Configuration of a Multiplex output.","RtmpOutputSettings":"The settings for an RTMP output.\\n\\nThe parent of this entity is OutputGroupSettings.","UdpOutputSettings":"The settings for a UDP output.\\n\\nThe parent of this entity is OutputGroupSettings."}},"AWS::MediaLive::Channel.PassThroughSettings":{"attributes":{},"description":"The settings for passing through audio to the output.\\n\\nThe parent of this entity is AudioCodecSettings.","properties":{}},"AWS::MediaLive::Channel.RawSettings":{"attributes":{},"description":"The container for WAV audio in the output group.\\n\\nThe parent of this entity is ArchiveContainerSettings.","properties":{}},"AWS::MediaLive::Channel.Rec601Settings":{"attributes":{},"description":"Rec601 Settings\\n\\nThe parents of this entity are H264ColorSpaceSettings and H265ColorSpaceSettings.","properties":{}},"AWS::MediaLive::Channel.Rec709Settings":{"attributes":{},"description":"Rec709 Settings\\n\\nThe parents of this entity are H264ColorSpaceSettings and H265ColorSpaceSettings.","properties":{}},"AWS::MediaLive::Channel.RemixSettings":{"attributes":{},"description":"The settings for remixing audio in the output.\\n\\nThe parent of this entity is AudioDescription.","properties":{"ChannelMappings":"A mapping of input channels to output channels, with appropriate gain adjustments.","ChannelsIn":"The number of input channels to be used.","ChannelsOut":"The number of output channels to be produced. Valid values: 1, 2, 4, 6, 8."}},"AWS::MediaLive::Channel.RtmpCaptionInfoDestinationSettings":{"attributes":{},"description":"The settings for RTMPCaptionInfo captions encode in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{}},"AWS::MediaLive::Channel.RtmpGroupSettings":{"attributes":{},"description":"The configuration of an RTMP output group.\\n\\nThe parent of this entity is OutputGroupSettings.","properties":{"AdMarkers":"Choose the ad marker type for this output group. MediaLive will create a message based on the content of each SCTE-35 message, format it for that marker type, and insert it in the datastream.","AuthenticationScheme":"An authentication scheme to use when connecting with a CDN.","CacheFullBehavior":"Controls behavior when the content cache fills up. If a remote origin server stalls the RTMP connection and doesn\'t accept content fast enough, the media cache fills up. When the cache reaches the duration specified by cacheLength, the cache stops accepting new content. If set to disconnectImmediately, the RTMP output forces a disconnect. Clear the media cache, and reconnect after restartDelay seconds. If set to waitForServer, the RTMP output waits up to 5 minutes to allow the origin server to begin accepting data again.","CacheLength":"The cache length, in seconds, that is used to calculate buffer size.","CaptionData":"Controls the types of data that pass to onCaptionInfo outputs. If set to all, 608 and 708 carried DTVCC data is passed. If set to field1AndField2608, DTVCC data is stripped out, but 608 data from both fields is passed. If set to field1608, only the data carried in 608 from field 1 video is passed.","InputLossAction":"Controls the behavior of this RTMP group if the input becomes unavailable. emitOutput: Emit a slate until the input returns. pauseOutput: Stop transmitting data until the input returns. This does not close the underlying RTMP connection.","RestartDelay":"If a streaming output fails, the number of seconds to wait until a restart is initiated. A value of 0 means never restart."}},"AWS::MediaLive::Channel.RtmpOutputSettings":{"attributes":{},"description":"The settings for one RTMP output.\\n\\nThe parent of this entity is OutputSettings.","properties":{"CertificateMode":"If set to verifyAuthenticity, verifies the TLS certificate chain to a trusted certificate authority (CA). This causes RTMPS outputs with self-signed certificates to fail.","ConnectionRetryInterval":"The number of seconds to wait before retrying a connection to the Flash Media server if the connection is lost.","Destination":"The RTMP endpoint excluding the stream name (for example, rtmp://host/appname).","NumRetries":"The number of retry attempts."}},"AWS::MediaLive::Channel.Scte20PlusEmbeddedDestinationSettings":{"attributes":{},"description":"The configuration of SCTE-20 plus embedded captions in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{}},"AWS::MediaLive::Channel.Scte20SourceSettings":{"attributes":{},"description":"Information about the SCTE-20 captions to extract from the input.\\n\\nThe parent of this entity is CaptionSelectorSettings.","properties":{"Convert608To708":"If upconvert, 608 data is both passed through the \\"608 compatibility bytes\\" fields of the 708 wrapper as well as translated into 708. Any 708 data present in the source content is discarded.","Source608ChannelNumber":"Specifies the 608/708 channel number within the video track from which to extract captions."}},"AWS::MediaLive::Channel.Scte27DestinationSettings":{"attributes":{},"description":"The configuration of SCTE-27 captions in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{}},"AWS::MediaLive::Channel.Scte27SourceSettings":{"attributes":{},"description":"Information about the SCTE-27 captions to extract from the input.\\n\\nThe parent of this entity is CaptionSelectorSettings.","properties":{"OcrLanguage":"If you will configure a WebVTT caption description that references this caption selector, use this field to\\nprovide the language to consider when translating the image-based source to text.","Pid":"The PID field is used in conjunction with the captions selector languageCode field as follows: Specify PID and Language: Extracts captions from that PID; the language is \\"informational.\\" Specify PID and omit Language: Extracts the specified PID. Omit PID and specify Language: Extracts the specified language, whichever PID that happens to be. Omit PID and omit Language: Valid only if source is DVB-Sub that is being passed through; all languages are passed through."}},"AWS::MediaLive::Channel.Scte35SpliceInsert":{"attributes":{},"description":"The setup of SCTE-35 splice insert handling.\\n\\nThe parent of this entity is AvailSettings.","properties":{"AdAvailOffset":"When specified, this offset (in milliseconds) is added to the input ad avail PTS time. This applies only to embedded SCTE 104/35 messages. It doesn\'t apply to OOB messages.","NoRegionalBlackoutFlag":"When set to ignore, segment descriptors with noRegionalBlackoutFlag set to 0 no longer trigger blackouts or ad avail slates.","WebDeliveryAllowedFlag":"When set to ignore, segment descriptors with webDeliveryAllowedFlag set to 0 no longer trigger blackouts or ad avail slates."}},"AWS::MediaLive::Channel.Scte35TimeSignalApos":{"attributes":{},"description":"The settings for the SCTE-35 time signal APOS mode.\\n\\nThe parent of this entity is AvailSettings.","properties":{"AdAvailOffset":"When specified, this offset (in milliseconds) is added to the input ad avail PTS time. This applies only to embedded SCTE 104/35 messages. It doesn\'t apply to OOB messages.","NoRegionalBlackoutFlag":"When set to ignore, segment descriptors with noRegionalBlackoutFlag set to 0 no longer trigger blackouts or ad avail slates.","WebDeliveryAllowedFlag":"When set to ignore, segment descriptors with webDeliveryAllowedFlag set to 0 no longer trigger blackouts or ad avail slates."}},"AWS::MediaLive::Channel.SmpteTtDestinationSettings":{"attributes":{},"description":"The setup of SMPTE-TT captions in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{}},"AWS::MediaLive::Channel.StandardHlsSettings":{"attributes":{},"description":"The configuration of an HLS output that is a standard output (not an audio-only output).\\n\\nThe parent of this entity is HlsSettings.","properties":{"AudioRenditionSets":"Lists all the audio groups that are used with the video output stream. This inputs all the audio GROUP-IDs that are associated with the video, separated by a comma (,).","M3u8Settings":"Settings for the M3U8 container."}},"AWS::MediaLive::Channel.StaticKeySettings":{"attributes":{},"description":"The static key settings.\\n\\nThe parent of this entity is KeyProviderSettings.","properties":{"KeyProviderServer":"The URL of the license server that is used for protecting content.","StaticKeyValue":"The static key value as a 32 character hexadecimal string."}},"AWS::MediaLive::Channel.TeletextDestinationSettings":{"attributes":{},"description":"The settings for a Teletext captions output encode.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{}},"AWS::MediaLive::Channel.TeletextSourceSettings":{"attributes":{},"description":"Information about the Teletext captions to extract from the input.\\n\\nThe parent of this entity is CaptionSelectorSettings.","properties":{"OutputRectangle":"Settings to configure the caption rectangle for an output captions that will be created using this Teletext source captions.","PageNumber":"Specifies the Teletext page number within the data stream from which to extract captions. The range is 0x100 (256) to 0x8FF (2303). This is unused for passthrough. It should be specified as a hexadecimal string with no \\"0x\\" prefix."}},"AWS::MediaLive::Channel.TemporalFilterSettings":{"attributes":{},"description":"Settings for the temporal filter to apply to the video.\\n\\nThe parents of this entity are H264FilterSettings, H265FilterSettings, and Mpeg2FilterSettings.","properties":{"PostFilterSharpening":"If you enable this filter, the results are the following:\\n- If the source content is noisy (it contains excessive digital artifacts), the filter cleans up the source.\\n- If the source content is already clean, the filter tends to decrease the bitrate, especially when the rate control mode is QVBR.","Strength":"Choose a filter strength. We recommend a strength of 1 or 2. A higher strength might take out good information, resulting in an image that is overly soft."}},"AWS::MediaLive::Channel.TimecodeBurninSettings":{"attributes":{},"description":"","properties":{"FontSize":"","Position":"","Prefix":""}},"AWS::MediaLive::Channel.TimecodeConfig":{"attributes":{},"description":"The configuration of the timecode in the output.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"Source":"Identifies the source for the timecode that will be associated with the channel outputs. Embedded (embedded): Initialize the output timecode with timecode from the source. If no embedded timecode is detected in the source, the system falls back to using \\"Start at 0\\" (zerobased). System Clock (systemclock): Use the UTC time. Start at 0 (zerobased): The time of the first frame of the channel will be 00:00:00:00.","SyncThreshold":"The threshold in frames beyond which output timecode is resynchronized to the input timecode. Discrepancies below this threshold are permitted to avoid unnecessary discontinuities in the output timecode. There is no timecode sync when this is not specified."}},"AWS::MediaLive::Channel.TtmlDestinationSettings":{"attributes":{},"description":"The setup of TTML captions in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{"StyleControl":"When set to passthrough, passes through style and position information from a TTML-like input source (TTML, SMPTE-TT, CFF-TT) to the CFF-TT output or TTML output."}},"AWS::MediaLive::Channel.UdpContainerSettings":{"attributes":{},"description":"The configuration of a UDP output.\\n\\nThe parent of this entity is UdpOutputSettings.","properties":{"M2tsSettings":"The M2TS configuration for this UDP output."}},"AWS::MediaLive::Channel.UdpGroupSettings":{"attributes":{},"description":"The configuration of a UDP output group.\\n\\nThe parent of this entity is OutputGroupSettings.","properties":{"InputLossAction":"Specifies the behavior of the last resort when the input video is lost, and no more backup inputs are available. When dropTs is selected, the entire transport stream stops emitting. When dropProgram is selected, the program can be dropped from the transport stream (and replaced with null packets to meet the TS bitrate requirement). Or when emitProgram is selected, the transport stream continues to be produced normally with repeat frames, black frames, or slate frames substituted for the absent input video.","TimedMetadataId3Frame":"Indicates the ID3 frame that has the timecode.","TimedMetadataId3Period":"The timed metadata interval in seconds."}},"AWS::MediaLive::Channel.UdpOutputSettings":{"attributes":{},"description":"The settings for one UDP output.\\n\\nThe parent of this entity is OutputSettings.","properties":{"BufferMsec":"The UDP output buffering in milliseconds. Larger values increase latency through the transcoder but simultaneously assist the transcoder in maintaining a constant, low-jitter UDP/RTP output while accommodating clock recovery, input switching, input disruptions, picture reordering, and so on.","ContainerSettings":"The settings for the UDP output.","Destination":"The destination address and port number for RTP or UDP packets. These can be unicast or multicast RTP or UDP (for example, rtp://239.10.10.10:5001 or udp://10.100.100.100:5002).","FecOutputSettings":"The settings for enabling and adjusting Forward Error Correction on UDP outputs."}},"AWS::MediaLive::Channel.VideoBlackFailoverSettings":{"attributes":{},"description":"MediaLive will perform a failover if content is considered black for the specified period.\\n\\nThe parent of this entity is FailoverConditionSettings.","properties":{"BlackDetectThreshold":"A value used in calculating the threshold below which MediaLive considers a pixel to be \'black\'. For the input to be considered black, every pixel in a frame must be below this threshold. The threshold is calculated as a percentage (expressed as a decimal) of white. Therefore .1 means 10% white (or 90% black). Note how the formula works for any color depth. For example, if you set this field to 0.1 in 10-bit color depth: (1023*0.1=102.3), which means a pixel value of 102 or less is \'black\'. If you set this field to .1 in an 8-bit color depth: (255*0.1=25.5), which means a pixel value of 25 or less is \'black\'. The range is 0.0 to 1.0, with any number of decimal places.","VideoBlackThresholdMsec":"The amount of time (in milliseconds) that the active input must be black before automatic input failover occurs."}},"AWS::MediaLive::Channel.VideoCodecSettings":{"attributes":{},"description":"The settings for the video codec in the output.\\n\\nThe parent of this entity is VideoDescription.","properties":{"FrameCaptureSettings":"The settings for the video codec in a frame capture output.","H264Settings":"The settings for the H.264 codec in the output.","H265Settings":"Settings for video encoded with the H265 codec.","Mpeg2Settings":"Settings for video encoded with the MPEG-2 codec."}},"AWS::MediaLive::Channel.VideoDescription":{"attributes":{},"description":"Encoding information for one output video.\\n\\nThe parent of this entity is EncoderSettings.","properties":{"CodecSettings":"The video codec settings.","Height":"The output video height, in pixels. This must be an even number. For most codecs, you can keep this field and width blank in order to use the height and width (resolution) from the source. Note that we don\'t recommend keeping the field blank. For the Frame Capture codec, height and width are required.","Name":"The name of this VideoDescription. Outputs use this name to uniquely identify this description. Description names should be unique within this channel.","RespondToAfd":"Indicates how to respond to the AFD values in the input stream. RESPOND causes input video to be clipped, depending on the AFD value, input display aspect ratio, and output display aspect ratio, and (except for the FRAMECAPTURE codec) includes the values in the output. PASSTHROUGH (does not apply to FRAMECAPTURE codec) ignores the AFD values and includes the values in the output, so input video is not clipped. NONE ignores the AFD values and does not include the values through to the output, so input video is not clipped.","ScalingBehavior":"STRETCHTOOUTPUT configures the output position to stretch the video to the specified output resolution (height and width). This option overrides any position value. DEFAULT might insert black boxes (pillar boxes or letter boxes) around the video to provide the specified output resolution.","Sharpness":"Changes the strength of the anti-alias filter used for scaling. 0 is the softest setting, and 100 is the sharpest. We recommend a setting of 50 for most content.","Width":"The output video width, in pixels. It must be an even number. For most codecs, you can keep this field and height blank in order to use the height and width (resolution) from the source. Note that we don\'t recommend keeping the field blank. For the Frame Capture codec, height and width are required."}},"AWS::MediaLive::Channel.VideoSelector":{"attributes":{},"description":"Information about the video to extract from the input. An input can contain only one video selector.\\n\\nThe parent of this entity is InputSettings.","properties":{"ColorSpace":"Specifies the color space of an input. This setting works in tandem with colorSpaceConversion to determine if MediaLive will perform any conversion.","ColorSpaceSettings":"Settings to configure color space settings in the incoming video.","ColorSpaceUsage":"Applies only if colorSpace is a value other than Follow. This field controls how the value in the colorSpace field is used. Fallback means that when the input does include color space data, that data is used, but when the input has no color space data, the value in colorSpace is used. Choose fallback if your input is sometimes missing color space data, but when it does have color space data, that data is correct. Force means to always use the value in colorSpace. Choose force if your input usually has no color space data or might have unreliable color space data.","SelectorSettings":"Information about the video to select from the content."}},"AWS::MediaLive::Channel.VideoSelectorColorSpaceSettings":{"attributes":{},"description":"Settings to configure color space settings in the incoming video.\\n\\nThe parent of this entity is VideoSelector.","properties":{"Hdr10Settings":"Settings to configure color space settings in the incoming video."}},"AWS::MediaLive::Channel.VideoSelectorPid":{"attributes":{},"description":"Selects a specific PID from within a video source.\\n\\nThe parent of this entity is VideoSelectorSettings.","properties":{"Pid":"Selects a specific PID from within a video source."}},"AWS::MediaLive::Channel.VideoSelectorProgramId":{"attributes":{},"description":"Used to extract video by the program ID.\\n\\nThe parent of this entity is VideoSelectorSettings.","properties":{"ProgramId":"Selects a specific program from within a multi-program transport stream. If the program doesn\'t exist, MediaLive selects the first program within the transport stream by default."}},"AWS::MediaLive::Channel.VideoSelectorSettings":{"attributes":{},"description":"Information about the video to extract from the input.\\n\\nThe parent of this entity is VideoSelector.","properties":{"VideoSelectorPid":"Used to extract video by PID.","VideoSelectorProgramId":"Used to extract video by program ID."}},"AWS::MediaLive::Channel.VpcOutputSettings":{"attributes":{},"description":"Settings to enable VPC mode in the channel, so that the endpoints for all outputs are in your VPC.\\n\\nThis entity is at the top level in the channel.","properties":{"PublicAddressAllocationIds":"List of public address allocation IDs to associate with ENIs that will be created in Output VPC. Must specify one for SINGLE_PIPELINE, two for STANDARD channels","SecurityGroupIds":"A list of up to 5 EC2 VPC security group IDs to attach to the Output VPC network interfaces.\\nIf none are specified then the VPC default security group will be used","SubnetIds":"A list of VPC subnet IDs from the same VPC.\\nIf STANDARD channel, subnet IDs must be mapped to two unique availability zones (AZ)."}},"AWS::MediaLive::Channel.WavSettings":{"attributes":{},"description":"The setup of WAV audio in the output.\\n\\nThe parent of this entity is AudioCodecSettings.","properties":{"BitDepth":"Bits per sample.","CodingMode":"The audio coding mode for the WAV audio. The mode determines the number of channels in the audio.","SampleRate":"Sample rate in Hz."}},"AWS::MediaLive::Channel.WebvttDestinationSettings":{"attributes":{},"description":"The configuration of Web VTT captions in the output.\\n\\nThe parent of this entity is CaptionDestinationSettings.","properties":{"StyleControl":"Controls whether the color and position of the source captions is passed through to the WebVTT output captions. PASSTHROUGH - Valid only if the source captions are EMBEDDED or TELETEXT. NO_STYLE_DATA - Don\'t pass through the style. The output captions will not contain any font styling information."}},"AWS::MediaLive::Input":{"attributes":{"Arn":"The ARN of the MediaLive input. For example: arn:aws:medialive:us-west-1:111122223333:medialive:input:1234567. MediaLive creates this ARN when it creates the input.","Destinations":"For a push input, the the destination or destinations for the input. The destinations are the URLs of locations on MediaLive where the upstream system pushes the content to, for this input. MediaLive creates these addresses when it creates the input.","Ref":"`Ref` returns the MediaLive id of the input.\\n\\nFor example: `{ \\"Ref\\": \\"myInput\\" }`","Sources":"For a pull input, the source or sources for the input. The sources are the URLs of locations on the upstream system where MediaLive pulls the content from, for this input. You included these URLs in the create request."},"description":"The AWS::MediaLive::Input resource is a MediaLive resource type that creates an input.\\n\\nA MediaLive input holds information that describes how the MediaLive channel is connected to the upstream system that is providing the source content that is to be transcoded.","properties":{"Destinations":"Settings that apply only if the input is a push type of input.","InputDevices":"Settings that apply only if the input is an Elemental Link input.","InputSecurityGroups":"The list of input security groups (referenced by IDs) to attach to the input if the input is a push type.","MediaConnectFlows":"Settings that apply only if the input is a MediaConnect input.","Name":"A name for the input.","RoleArn":"The IAM role for MediaLive to assume when creating a MediaConnect input or Amazon VPC input. This doesn\'t apply to other types of inputs. The role is identified by its ARN.","Sources":"Settings that apply only if the input is a pull type of input.","Tags":"A collection of tags for this input. Each tag is a key-value pair.","Type":"The type for this input.","Vpc":"Settings that apply only if the input is an push input where the source is on Amazon VPC."}},"AWS::MediaLive::Input.InputDestinationRequest":{"attributes":{},"description":"Settings that apply only if the input is a push type of input.\\n\\nThe parent of this entity is Input.","properties":{"StreamName":"The stream name (application name/application instance) for the location the RTMP source content will be pushed to in MediaLive."}},"AWS::MediaLive::Input.InputDeviceRequest":{"attributes":{},"description":"This entity is not used. Ignore it.","properties":{"Id":"This property is not used. Ignore it."}},"AWS::MediaLive::Input.InputDeviceSettings":{"attributes":{},"description":"Settings that apply only if the input is an Elemental Link input.\\n\\nThe parent of this entity is Input.","properties":{"Id":"The unique ID for the device."}},"AWS::MediaLive::Input.InputSourceRequest":{"attributes":{},"description":"Settings that apply only if the input is a pull type of input.\\n\\nThe parent of this entity is Input.","properties":{"PasswordParam":"The password parameter that holds the password for accessing the upstream system. The password parameter applies only if the upstream system requires credentials.","Url":"For a pull input, the URL where MediaLive pulls the source content from.","Username":"The user name to connect to the upstream system. The user name applies only if the upstream system requires credentials."}},"AWS::MediaLive::Input.InputVpcRequest":{"attributes":{},"description":"Settings that apply only if the input is an push input where the source is on Amazon VPC.\\n\\nThe parent of this entity is Input.","properties":{"SecurityGroupIds":"The list of up to five VPC security group IDs to attach to the input VPC network interfaces. The security groups require subnet IDs. If none are specified, MediaLive uses the VPC default security group.","SubnetIds":"The list of two VPC subnet IDs from the same VPC. You must associate subnet IDs to two unique Availability Zones."}},"AWS::MediaLive::Input.MediaConnectFlowRequest":{"attributes":{},"description":"Settings that apply only if the input is a MediaConnect input.\\n\\nThe parent of this entity is Input.","properties":{"FlowArn":"The ARN of one or two MediaConnect flows that are the sources for this MediaConnect input."}},"AWS::MediaLive::InputSecurityGroup":{"attributes":{"Arn":"The ARN of the MediaLive input security group. For example: arn:aws:medialive:us-west-1:111122223333:medialive:inputSecurityGroup:1234567","Ref":"`Ref` returns the name of the input security group.\\n\\nFor example: `{ \\"Ref\\": \\"myInputSecurityGroup\\" }`"},"description":"The AWS::MediaLive::InputSecurityGroup is a MediaLive resource type that creates an input security group.\\n\\nA MediaLive input security group is associated with a MediaLive input. The input security group is an \\"allow list\\" of IP addresses that controls whether an external IP address can push content to the associated MediaLive input.","properties":{"Tags":"A collection of tags for this input security group. Each tag is a key-value pair.","WhitelistRules":"The list of IPv4 CIDR addresses to include in the input security group as \\"allowed\\" addresses."}},"AWS::MediaLive::InputSecurityGroup.InputWhitelistRuleCidr":{"attributes":{},"description":"An IPv4 CIDR range to include in this input security group.\\n\\nThe parent of this entity is InputSecurityGroup.","properties":{"Cidr":"An IPv4 CIDR range to include in this input security group."}},"AWS::MediaPackage::Asset":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the asset. You can get this from the response to any request to the asset.","CreatedAt":"The date and time that the asset was initially submitted for ingest.","Ref":"`Ref` returns the name of the asset.\\n\\nFor example: `{ \\"Ref\\": \\"myAsset\\" }`"},"description":"Creates an asset to ingest VOD content.\\n\\nAfter it\'s created, the asset starts ingesting content and generates playback URLs for the packaging configurations associated with it. When ingest is complete, downstream devices use the appropriate URL to request VOD content from AWS Elemental MediaPackage .","properties":{"EgressEndpoints":"List of playback endpoints that are available for this asset.","Id":"Unique identifier that you assign to the asset.","PackagingGroupId":"The ID of the packaging group associated with this asset.","ResourceId":"Unique identifier for this asset, as it\'s configured in the key provider service.","SourceArn":"The ARN for the source content in Amazon S3.","SourceRoleArn":"The ARN for the IAM role that provides AWS Elemental MediaPackage access to the Amazon S3 bucket where the source content is stored. Valid format: arn:aws:iam::{accountID}:role/{name}","Tags":"The tags to assign to the asset."}},"AWS::MediaPackage::Asset.EgressEndpoint":{"attributes":{},"description":"The playback endpoint for a packaging configuration on an asset.","properties":{"PackagingConfigurationId":"The ID of a packaging configuration that\'s applied to this asset.","Url":"The URL that\'s used to request content from this endpoint."}},"AWS::MediaPackage::Channel":{"attributes":{"Arn":"The channel\'s unique system-generated resource name, based on the AWS record.","Ref":"`Ref` returns the name of the channel.\\n\\nFor example: `{ \\"Ref\\": \\"myChannel\\" }`"},"description":"Creates a channel to receive content.\\n\\nAfter it\'s created, a channel provides static input URLs. These URLs remain the same throughout the lifetime of the channel, regardless of any failures or upgrades that might occur. Use these URLs to configure the outputs of your upstream encoder.","properties":{"Description":"Any descriptive information that you want to add to the channel for future identification purposes.","EgressAccessLogs":"Configures egress access logs.","HlsIngest":"The input URL where the source stream should be sent.","Id":"Unique identifier that you assign to the channel.","IngressAccessLogs":"Configures ingress access logs.","Tags":"The tags to assign to the channel."}},"AWS::MediaPackage::Channel.HlsIngest":{"attributes":{},"description":"HLS ingest configuration.","properties":{"ingestEndpoints":"The input URL where the source stream should be sent."}},"AWS::MediaPackage::Channel.IngestEndpoint":{"attributes":{},"description":"An endpoint for ingesting source content for a channel.","properties":{"Id":"The endpoint identifier.","Password":"The system-generated password for WebDAV input authentication.","Url":"The input URL where the source stream should be sent.","Username":"The system-generated username for WebDAV input authentication."}},"AWS::MediaPackage::Channel.LogConfiguration":{"attributes":{},"description":"The access log configuration parameters for your channel.","properties":{"LogGroupName":"Sets a custom Amazon CloudWatch log group name."}},"AWS::MediaPackage::OriginEndpoint":{"attributes":{"Arn":"The endpoint\'s unique system-generated resource name, based on the AWS record.","Ref":"`Ref` returns the name of the origin endpoint.\\n\\nFor example: `{ \\"Ref\\": \\"myOriginEndpoint\\" }`","Url":"URL for the key provider’s key retrieval API endpoint. Must start with https://."},"description":"Create an endpoint on an AWS Elemental MediaPackage channel.\\n\\nAn endpoint represents a single delivery point of a channel, and defines content output handling through various components, such as packaging protocols, DRM and encryption integration, and more.\\n\\nAfter it\'s created, an endpoint provides a fixed public URL. This URL remains the same throughout the lifetime of the endpoint, regardless of any failures or upgrades that might occur. Integrate the URL with a downstream CDN (such as Amazon CloudFront) or playback device.","properties":{"Authorization":"Parameters for CDN authorization.","ChannelId":"The ID of the channel associated with this endpoint.","CmafPackage":"Parameters for Common Media Application Format (CMAF) packaging.","DashPackage":"Parameters for DASH packaging.","Description":"Any descriptive information that you want to add to the endpoint for future identification purposes.","HlsPackage":"Parameters for Apple HLS packaging.","Id":"The manifest ID is required and must be unique within the OriginEndpoint. The ID can\'t be changed after the endpoint is created.","ManifestName":"A short string that\'s appended to the end of the endpoint URL to create a unique path to this endpoint.","MssPackage":"Parameters for Microsoft Smooth Streaming packaging.","Origination":"Controls video origination from this endpoint.\\n\\nValid values:\\n\\n- `ALLOW` - enables this endpoint to serve content to requesting devices.\\n- `DENY` - prevents this endpoint from serving content. Denying origination is helpful for harvesting live-to-VOD assets. For more information about harvesting and origination, see [Live-to-VOD Requirements](https://docs.aws.amazon.com/mediapackage/latest/ug/ltov-reqmts.html) .","StartoverWindowSeconds":"Maximum duration (seconds) of content to retain for startover playback. Omit this attribute or enter `0` to indicate that startover playback is disabled for this endpoint.","Tags":"The tags to assign to the endpoint.","TimeDelaySeconds":"Minimum duration (seconds) of delay to enforce on the playback of live content. Omit this attribute or enter `0` to indicate that there is no time delay in effect for this endpoint.","Whitelist":"The IP addresses that can access this endpoint."}},"AWS::MediaPackage::OriginEndpoint.Authorization":{"attributes":{},"description":"Parameters for enabling CDN authorization on the endpoint.","properties":{"CdnIdentifierSecret":"The Amazon Resource Name (ARN) for the secret in AWS Secrets Manager that your Content Delivery Network (CDN) uses for authorization to access your endpoint.","SecretsRoleArn":"The Amazon Resource Name (ARN) for the IAM role that allows AWS Elemental MediaPackage to communicate with AWS Secrets Manager ."}},"AWS::MediaPackage::OriginEndpoint.CmafEncryption":{"attributes":{},"description":"Holds encryption information so that access to the content can be controlled by a DRM solution.","properties":{"ConstantInitializationVector":"An optional 128-bit, 16-byte hex value represented by a 32-character string, used in conjunction with the key for encrypting blocks. If you don\'t specify a value, then AWS Elemental MediaPackage creates the constant initialization vector (IV).","EncryptionMethod":"The encryption method to use.","KeyRotationIntervalSeconds":"Number of seconds before AWS Elemental MediaPackage rotates to a new key. By default, rotation is set to 60 seconds. Set to `0` to disable key rotation.","SpekeKeyProvider":"Parameters for the SPEKE key provider."}},"AWS::MediaPackage::OriginEndpoint.CmafPackage":{"attributes":{},"description":"Parameters for Common Media Application Format (CMAF) packaging.","properties":{"Encryption":"Parameters for encrypting content.","HlsManifests":"A list of HLS manifest configurations that are available from this endpoint.","SegmentDurationSeconds":"Duration (in seconds) of each segment. Actual segments are rounded to the nearest multiple of the source segment duration.","SegmentPrefix":"An optional custom string that is prepended to the name of each segment. If not specified, the segment prefix defaults to the ChannelId.","StreamSelection":"Limitations for outputs from the endpoint, based on the video bitrate."}},"AWS::MediaPackage::OriginEndpoint.DashEncryption":{"attributes":{},"description":"Holds encryption information so that access to the content can be controlled by a DRM solution.","properties":{"KeyRotationIntervalSeconds":"Number of seconds before AWS Elemental MediaPackage rotates to a new key. By default, rotation is set to 60 seconds. Set to `0` to disable key rotation.","SpekeKeyProvider":"Parameters for the SPEKE key provider."}},"AWS::MediaPackage::OriginEndpoint.DashPackage":{"attributes":{},"description":"Parameters for DASH packaging.","properties":{"AdTriggers":"Specifies the SCTE-35 message types that AWS Elemental MediaPackage treats as ad markers in the output manifest.\\n\\nValid values:\\n\\n- `BREAK`\\n- `DISTRIBUTOR_ADVERTISEMENT`\\n- `DISTRIBUTOR_OVERLAY_PLACEMENT_OPPORTUNITY` .\\n- `DISTRIBUTOR_PLACEMENT_OPPORTUNITY` .\\n- `PROVIDER_ADVERTISEMENT` .\\n- `PROVIDER_OVERLAY_PLACEMENT_OPPORTUNITY` .\\n- `PROVIDER_PLACEMENT_OPPORTUNITY` .\\n- `SPLICE_INSERT` .","AdsOnDeliveryRestrictions":"The flags on SCTE-35 segmentation descriptors that have to be present for AWS Elemental MediaPackage to insert ad markers in the output manifest. For information about SCTE-35 in AWS Elemental MediaPackage , see [SCTE-35 Message Options in AWS Elemental MediaPackage](https://docs.aws.amazon.com/mediapackage/latest/ug/scte.html) .","Encryption":"Parameters for encrypting content.","IncludeIframeOnlyStream":"This applies only to stream sets with a single video track. When true, the stream set includes an additional I-frame trick-play only stream, along with the other tracks. If false, this extra stream is not included.","ManifestLayout":"Determines the position of some tags in the manifest.\\n\\nValid values:\\n\\n- `FULL` - Elements like `SegmentTemplate` and `ContentProtection` are included in each `Representation` .\\n- `COMPACT` - Duplicate elements are combined and presented at the `AdaptationSet` level.","ManifestWindowSeconds":"Time window (in seconds) contained in each manifest.","MinBufferTimeSeconds":"Minimum amount of content (measured in seconds) that a player must keep available in the buffer.","MinUpdatePeriodSeconds":"Minimum amount of time (in seconds) that the player should wait before requesting updates to the manifest.","PeriodTriggers":"Controls whether AWS Elemental MediaPackage produces single-period or multi-period DASH manifests. For more information about periods, see [Multi-period DASH in AWS Elemental MediaPackage](https://docs.aws.amazon.com/mediapackage/latest/ug/multi-period.html) .\\n\\nValid values:\\n\\n- `ADS` - AWS Elemental MediaPackage will produce multi-period DASH manifests. Periods are created based on the SCTE-35 ad markers present in the input manifest.\\n- *No value* - AWS Elemental MediaPackage will produce single-period DASH manifests. This is the default setting.","Profile":"The DASH profile for the output.\\n\\nValid values:\\n\\n- `NONE` - The output doesn\'t use a DASH profile.\\n- `HBBTV_1_5` - The output is compliant with HbbTV v1.5.\\n- `DVB_DASH_2014` - The output is compliant with DVB-DASH 2014.","SegmentDurationSeconds":"Duration (in seconds) of each fragment. Actual fragments are rounded to the nearest multiple of the source fragment duration.","SegmentTemplateFormat":"Determines the type of variable used in the `media` URL of the `SegmentTemplate` tag in the manifest. Also specifies if segment timeline information is included in `SegmentTimeline` or `SegmentTemplate` .\\n\\nValid values:\\n\\n- `NUMBER_WITH_TIMELINE` - The `$Number$` variable is used in the `media` URL. The value of this variable is the sequential number of the segment. A full `SegmentTimeline` object is presented in each `SegmentTemplate` .\\n- `NUMBER_WITH_DURATION` - The `$Number$` variable is used in the `media` URL and a `duration` attribute is added to the segment template. The `SegmentTimeline` object is removed from the representation.\\n- `TIME_WITH_TIMELINE` - The `$Time$` variable is used in the `media` URL. The value of this variable is the timestamp of when the segment starts. A full `SegmentTimeline` object is presented in each `SegmentTemplate` .","StreamSelection":"Limitations for outputs from the endpoint, based on the video bitrate.","SuggestedPresentationDelaySeconds":"Amount of time (in seconds) that the player should be from the live point at the end of the manifest.","UtcTiming":"Determines the type of UTC timing included in the DASH Media Presentation Description (MPD).","UtcTimingUri":"Specifies the value attribute of the UTC timing field when utcTiming is set to HTTP-ISO or HTTP-HEAD."}},"AWS::MediaPackage::OriginEndpoint.EncryptionContractConfiguration":{"attributes":{},"description":"Use `encryptionContractConfiguration` to configure one or more content encryption keys for your endpoints that use SPEKE Version 2.0. The encryption contract defines the content keys used to encrypt the audio and video tracks in your stream. To configure the encryption contract, specify which audio and video encryption presets to use. For more information about these presets, see [SPEKE Version 2.0 Presets](https://docs.aws.amazon.com/mediapackage/latest/ug/drm-content-speke-v2-presets.html) .\\n\\nNote the following considerations when using `encryptionContractConfiguration` :\\n\\n- You can use `encryptionContractConfiguration` for DASH endpoints that use SPEKE Version 2.0. SPEKE Version 2.0 relies on the CPIX Version 2.3 specification.\\n- You cannot combine an `UNENCRYPTED` preset with `UNENCRYPTED` or `SHARED` presets across `presetSpeke20Audio` and `presetSpeke20Video` .\\n- When you use a `SHARED` preset, you must use it for both `presetSpeke20Audio` and `presetSpeke20Video` .","properties":{}},"AWS::MediaPackage::OriginEndpoint.HlsEncryption":{"attributes":{},"description":"Holds encryption information so that access to the content can be controlled by a DRM solution.","properties":{"ConstantInitializationVector":"A 128-bit, 16-byte hex value represented by a 32-character string, used with the key for encrypting blocks.","EncryptionMethod":"HLS encryption type.","KeyRotationIntervalSeconds":"Number of seconds before AWS Elemental MediaPackage rotates to a new key. By default, rotation is set to 60 seconds. Set to `0` to disable key rotation.","RepeatExtXKey":"Repeat the `EXT-X-KEY` directive for every media segment. This might result in an increase in client requests to the DRM server.","SpekeKeyProvider":"Parameters for the SPEKE key provider."}},"AWS::MediaPackage::OriginEndpoint.HlsManifest":{"attributes":{},"description":"An HTTP Live Streaming (HLS) manifest configuration on a CMAF endpoint.","properties":{"AdMarkers":"Controls how ad markers are included in the packaged endpoint.\\n\\nValid values:\\n\\n- `NONE` - Omits all SCTE-35 ad markers from the output.\\n- `PASSTHROUGH` - Creates a copy in the output of the SCTE-35 ad markers (comments) taken directly from the input manifest.\\n- `SCTE35_ENHANCED` - Generates ad markers and blackout tags in the output based on the SCTE-35 messages from the input manifest.","AdTriggers":"Specifies the SCTE-35 message types that AWS Elemental MediaPackage treats as ad markers in the output manifest.\\n\\nValid values:\\n\\n- `BREAK`\\n- `DISTRIBUTOR_ADVERTISEMENT`\\n- `DISTRIBUTOR_OVERLAY_PLACEMENT_OPPORTUNITY`\\n- `DISTRIBUTOR_PLACEMENT_OPPORTUNITY`\\n- `PROVIDER_ADVERTISEMENT`\\n- `PROVIDER_OVERLAY_PLACEMENT_OPPORTUNITY`\\n- `PROVIDER_PLACEMENT_OPPORTUNITY`\\n- `SPLICE_INSERT`","AdsOnDeliveryRestrictions":"The flags on SCTE-35 segmentation descriptors that have to be present for AWS Elemental MediaPackage to insert ad markers in the output manifest. For information about SCTE-35 in AWS Elemental MediaPackage , see [SCTE-35 Message Options in AWS Elemental MediaPackage](https://docs.aws.amazon.com/mediapackage/latest/ug/scte.html) .","Id":"The manifest ID is required and must be unique within the OriginEndpoint. The ID can\'t be changed after the endpoint is created.","IncludeIframeOnlyStream":"Applies to stream sets with a single video track only. When true, the stream set includes an additional I-frame only stream, along with the other tracks. If false, this extra stream is not included.","ManifestName":"A short string that\'s appended to the end of the endpoint URL to create a unique path to this endpoint. The manifestName on the HLSManifest object overrides the manifestName that you provided on the originEndpoint object.","PlaylistType":"When specified as either `event` or `vod` , a corresponding `EXT-X-PLAYLIST-TYPE` entry is included in the media playlist. Indicates if the playlist is live-to-VOD content.","PlaylistWindowSeconds":"Time window (in seconds) contained in each parent manifest.","ProgramDateTimeIntervalSeconds":"Inserts `EXT-X-PROGRAM-DATE-TIME` tags in the output manifest at the interval that you specify. Additionally, ID3Timed metadata messages are generated every 5 seconds starting when the content was ingested.\\n\\nIrrespective of this parameter, if any ID3Timed metadata is in the HLS input, it is passed through to the HLS output.\\n\\nOmit this attribute or enter `0` to indicate that the `EXT-X-PROGRAM-DATE-TIME` tags are not included in the manifest.","Url":"The URL that\'s used to request this manifest from this endpoint."}},"AWS::MediaPackage::OriginEndpoint.HlsPackage":{"attributes":{},"description":"Parameters for Apple HLS packaging.","properties":{"AdMarkers":"Controls how ad markers are included in the packaged endpoint.\\n\\nValid values:\\n\\n- `NONE` - Omits all SCTE-35 ad markers from the output.\\n- `PASSTHROUGH` - Creates a copy in the output of the SCTE-35 ad markers (comments) taken directly from the input manifest.\\n- `SCTE35_ENHANCED` - Generates ad markers and blackout tags in the output based on the SCTE-35 messages from the input manifest.","AdTriggers":"Specifies the SCTE-35 message types that AWS Elemental MediaPackage treats as ad markers in the output manifest.\\n\\nValid values:\\n\\n- `BREAK`\\n- `DISTRIBUTOR_ADVERTISEMENT`\\n- `DISTRIBUTOR_OVERLAY_PLACEMENT_OPPORTUNITY`\\n- `DISTRIBUTOR_PLACEMENT_OPPORTUNITY`\\n- `PROVIDER_ADVERTISEMENT`\\n- `PROVIDER_OVERLAY_PLACEMENT_OPPORTUNITY`\\n- `PROVIDER_PLACEMENT_OPPORTUNITY`\\n- `SPLICE_INSERT`","AdsOnDeliveryRestrictions":"The flags on SCTE-35 segmentation descriptors that have to be present for AWS Elemental MediaPackage to insert ad markers in the output manifest. For information about SCTE-35 in AWS Elemental MediaPackage , see [SCTE-35 Message Options in AWS Elemental MediaPackage](https://docs.aws.amazon.com/mediapackage/latest/ug/scte.html) .","Encryption":"Parameters for encrypting content.","IncludeDvbSubtitles":"When enabled, MediaPackage passes through digital video broadcasting (DVB) subtitles into the output.","IncludeIframeOnlyStream":"Only applies to stream sets with a single video track. When true, the stream set includes an additional I-frame only stream, along with the other tracks. If false, this extra stream is not included.","PlaylistType":"When specified as either `event` or `vod` , a corresponding `EXT-X-PLAYLIST-TYPE` entry is included in the media playlist. Indicates if the playlist is live-to-VOD content.","PlaylistWindowSeconds":"Time window (in seconds) contained in each parent manifest.","ProgramDateTimeIntervalSeconds":"Inserts `EXT-X-PROGRAM-DATE-TIME` tags in the output manifest at the interval that you specify. Additionally, ID3Timed metadata messages are generated every 5 seconds starting when the content was ingested.\\n\\nIrrespective of this parameter, if any ID3Timed metadata is in the HLS input, it is passed through to the HLS output.\\n\\nOmit this attribute or enter `0` to indicate that the `EXT-X-PROGRAM-DATE-TIME` tags are not included in the manifest.","SegmentDurationSeconds":"Duration (in seconds) of each fragment. Actual fragments are rounded to the nearest multiple of the source fragment duration.","StreamSelection":"Limitations for outputs from the endpoint, based on the video bitrate.","UseAudioRenditionGroup":"When true, AWS Elemental MediaPackage bundles all audio tracks in a rendition group. All other tracks in the stream can be used with any audio rendition from the group."}},"AWS::MediaPackage::OriginEndpoint.MssEncryption":{"attributes":{},"description":"Holds encryption information so that access to the content can be controlled by a DRM solution.","properties":{"SpekeKeyProvider":"Parameters for the SPEKE key provider."}},"AWS::MediaPackage::OriginEndpoint.MssPackage":{"attributes":{},"description":"Parameters for Microsoft Smooth Streaming packaging.","properties":{"Encryption":"Parameters for encrypting content.","ManifestWindowSeconds":"Time window (in seconds) contained in each manifest.","SegmentDurationSeconds":"Duration (in seconds) of each fragment. Actual fragments are rounded to the nearest multiple of the source fragment duration.","StreamSelection":"Limitations for outputs from the endpoint, based on the video bitrate."}},"AWS::MediaPackage::OriginEndpoint.SpekeKeyProvider":{"attributes":{},"description":"Key provider settings for DRM.","properties":{"CertificateArn":"The Amazon Resource Name (ARN) for the certificate that you imported to AWS Certificate Manager to add content key encryption to this endpoint. For this feature to work, your DRM key provider must support content key encryption.","EncryptionContractConfiguration":"Use `encryptionContractConfiguration` to configure one or more content encryption keys for your endpoints that use SPEKE Version 2.0. The encryption contract defines which content keys are used to encrypt the audio and video tracks in your stream. To configure the encryption contract, specify which audio and video encryption presets to use.","ResourceId":"Unique identifier for this endpoint, as it is configured in the key provider service.","RoleArn":"The ARN for the IAM role that\'s granted by the key provider to provide access to the key provider API. This role must have a trust policy that allows AWS Elemental MediaPackage to assume the role, and it must have a sufficient permissions policy to allow access to the specific key retrieval URL. Valid format: arn:aws:iam::{accountID}:role/{name}","SystemIds":"List of unique identifiers for the DRM systems to use, as defined in the CPIX specification.","Url":"URL for the key provider’s key retrieval API endpoint. Must start with https://."}},"AWS::MediaPackage::OriginEndpoint.StreamSelection":{"attributes":{},"description":"Limitations for outputs from the endpoint, based on the video bitrate.","properties":{"MaxVideoBitsPerSecond":"The upper limit of the bitrates that this endpoint serves. If the video track exceeds this threshold, then AWS Elemental MediaPackage excludes it from output. If you don\'t specify a value, it defaults to 2147483647 bits per second.","MinVideoBitsPerSecond":"The lower limit of the bitrates that this endpoint serves. If the video track is below this threshold, then AWS Elemental MediaPackage excludes it from output. If you don\'t specify a value, it defaults to 0 bits per second.","StreamOrder":"Order in which the different video bitrates are presented to the player.\\n\\nValid values: `ORIGINAL` , `VIDEO_BITRATE_ASCENDING` , `VIDEO_BITRATE_DESCENDING` ."}},"AWS::MediaPackage::PackagingConfiguration":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the packaging configuration. You can get this from the response to any request to the packaging configuration.","Ref":"`Ref` returns the name of the packaging configuration.\\n\\nFor example: `{ \\"Ref\\": \\"myPackagingConfiguration\\" }`"},"description":"Creates a packaging configuration in a packaging group.\\n\\nThe packaging configuration represents a single delivery point for an asset. It determines the format and setting for the egressing content. Specify only one package format per configuration, such as `HlsPackage` .","properties":{"CmafPackage":"Parameters for CMAF packaging.","DashPackage":"Parameters for DASH-ISO packaging.","HlsPackage":"Parameters for Apple HLS packaging.","Id":"Unique identifier that you assign to the packaging configuration.","MssPackage":"Parameters for Microsoft Smooth Streaming packaging.","PackagingGroupId":"The ID of the packaging group associated with this packaging configuration.","Tags":"The tags to assign to the packaging configuration."}},"AWS::MediaPackage::PackagingConfiguration.CmafEncryption":{"attributes":{},"description":"Holds encryption information so that access to the content can be controlled by a DRM solution.","properties":{"SpekeKeyProvider":"Parameters for the SPEKE key provider."}},"AWS::MediaPackage::PackagingConfiguration.CmafPackage":{"attributes":{},"description":"Parameters for a packaging configuration that uses Common Media Application Format (CMAF) packaging.","properties":{"Encryption":"Parameters for encrypting content.","HlsManifests":"A list of HLS manifest configurations that are available from this endpoint.","IncludeEncoderConfigurationInSegments":"When includeEncoderConfigurationInSegments is set to true, AWS Elemental MediaPackage places your encoder\'s Sequence Parameter Set (SPS), Picture Parameter Set (PPS), and Video Parameter Set (VPS) metadata in every video segment instead of in the init fragment. This lets you use different SPS/PPS/VPS settings for your assets during content playback.","SegmentDurationSeconds":"Duration (in seconds) of each segment. Actual segments are rounded to the nearest multiple of the source fragment duration."}},"AWS::MediaPackage::PackagingConfiguration.DashEncryption":{"attributes":{},"description":"Holds encryption information so that access to the content can be controlled by a DRM solution.","properties":{"SpekeKeyProvider":"Parameters for the SPEKE key provider."}},"AWS::MediaPackage::PackagingConfiguration.DashManifest":{"attributes":{},"description":"Parameters for a DASH manifest.","properties":{"ManifestLayout":"Determines the position of some tags in the Media Presentation Description (MPD). When set to `FULL` , elements like `SegmentTemplate` and `ContentProtection` are included in each `Representation` . When set to `COMPACT` , duplicate elements are combined and presented at the AdaptationSet level.","ManifestName":"A short string that\'s appended to the end of the endpoint URL to create a unique path to this packaging configuration.","MinBufferTimeSeconds":"Minimum amount of content (measured in seconds) that a player must keep available in the buffer.","Profile":"The DASH profile type. When set to `HBBTV_1_5` , the content is compliant with HbbTV 1.5.","ScteMarkersSource":"The source of scte markers used.\\n\\nValue description:\\n\\n- `SEGMENTS` - The scte markers are sourced from the segments of the ingested content.\\n- `MANIFEST` - the scte markers are sourced from the manifest of the ingested content. The MANIFEST value is compatible with source HLS playlists using the SCTE-35 Enhanced syntax ( `EXT-OATCLS-SCTE35` tags). SCTE-35 Elemental and SCTE-35 Daterange syntaxes are not supported with this option.","StreamSelection":"Limitations for outputs from the endpoint, based on the video bitrate."}},"AWS::MediaPackage::PackagingConfiguration.DashPackage":{"attributes":{},"description":"Parameters for a packaging configuration that uses Dynamic Adaptive Streaming over HTTP (DASH) packaging.","properties":{"DashManifests":"A list of DASH manifest configurations that are available from this endpoint.","Encryption":"Parameters for encrypting content.","IncludeEncoderConfigurationInSegments":"When includeEncoderConfigurationInSegments is set to true, AWS Elemental MediaPackage places your encoder\'s Sequence Parameter Set (SPS), Picture Parameter Set (PPS), and Video Parameter Set (VPS) metadata in every video segment instead of in the init fragment. This lets you use different SPS/PPS/VPS settings for your assets during content playback.","IncludeIframeOnlyStream":"This applies only to stream sets with a single video track. When true, the stream set includes an additional I-frame trick-play only stream, along with the other tracks. If false, this extra stream is not included.","PeriodTriggers":"Controls whether AWS Elemental MediaPackage produces single-period or multi-period DASH manifests. For more information about periods, see [Multi-period DASH in AWS Elemental MediaPackage](https://docs.aws.amazon.com/mediapackage/latest/ug/multi-period.html) .\\n\\nValid values:\\n\\n- `ADS` - AWS Elemental MediaPackage will produce multi-period DASH manifests. Periods are created based on the SCTE-35 ad markers present in the input manifest.\\n- *No value* - AWS Elemental MediaPackage will produce single-period DASH manifests. This is the default setting.","SegmentDurationSeconds":"Duration (in seconds) of each fragment. Actual fragments are rounded to the nearest multiple of the source segment duration.","SegmentTemplateFormat":"Determines the type of SegmentTemplate included in the Media Presentation Description (MPD). When set to `NUMBER_WITH_TIMELINE` , a full timeline is presented in each SegmentTemplate, with $Number$ media URLs. When set to `TIME_WITH_TIMELINE` , a full timeline is presented in each SegmentTemplate, with $Time$ media URLs. When set to `NUMBER_WITH_DURATION` , only a duration is included in each SegmentTemplate, with $Number$ media URLs."}},"AWS::MediaPackage::PackagingConfiguration.EncryptionContractConfiguration":{"attributes":{},"description":"Use `encryptionContractConfiguration` to configure one or more content encryption keys for your endpoints that use SPEKE Version 2.0. The encryption contract defines the content keys used to encrypt the audio and video tracks in your stream. To configure the encryption contract, specify which audio and video encryption presets to use. For more information about these presets, see [SPEKE Version 2.0 Presets](https://docs.aws.amazon.com/mediapackage/latest/ug/drm-content-speke-v2-presets.html) .\\n\\nNote the following considerations when using `encryptionContractConfiguration` :\\n\\n- You can use `encryptionContractConfiguration` for DASH endpoints that use SPEKE Version 2.0. SPEKE Version 2.0 relies on the CPIX Version 2.3 specification.\\n- You cannot combine an `UNENCRYPTED` preset with `UNENCRYPTED` or `SHARED` presets across `presetSpeke20Audio` and `presetSpeke20Video` .\\n- When you use a `SHARED` preset, you must use it for both `presetSpeke20Audio` and `presetSpeke20Video` .","properties":{}},"AWS::MediaPackage::PackagingConfiguration.HlsEncryption":{"attributes":{},"description":"Holds encryption information so that access to the content can be controlled by a DRM solution.","properties":{"ConstantInitializationVector":"A 128-bit, 16-byte hex value represented by a 32-character string, used with the key for encrypting blocks. If you don\'t specify a constant initialization vector (IV), AWS Elemental MediaPackage periodically rotates the IV.","EncryptionMethod":"HLS encryption type.","SpekeKeyProvider":"Parameters for the SPEKE key provider."}},"AWS::MediaPackage::PackagingConfiguration.HlsManifest":{"attributes":{},"description":"Parameters for an HLS manifest.","properties":{"AdMarkers":"This setting controls ad markers in the packaged content.\\n\\nValid values:\\n\\n- `NONE` - Omits all SCTE-35 ad markers from the output.\\n- `PASSTHROUGH` - Creates a copy in the output of the SCTE-35 ad markers (comments) taken directly from the input manifest.\\n- `SCTE35_ENHANCED` - Generates ad markers and blackout tags in the output based on the SCTE-35 messages from the input manifest.","IncludeIframeOnlyStream":"Applies to stream sets with a single video track only. When enabled, the output includes an additional I-frame only stream, along with the other tracks.","ManifestName":"A short string that\'s appended to the end of the endpoint URL to create a unique path to this packaging configuration.","ProgramDateTimeIntervalSeconds":"Inserts `EXT-X-PROGRAM-DATE-TIME` tags in the output manifest at the interval that you specify. Additionally, ID3Timed metadata messages are generated every 5 seconds starting when the content was ingested.\\n\\nIrrespective of this parameter, if any ID3Timed metadata is in the HLS input, it is passed through to the HLS output.\\n\\nOmit this attribute or enter `0` to indicate that the `EXT-X-PROGRAM-DATE-TIME` tags are not included in the manifest.","RepeatExtXKey":"Repeat the `EXT-X-KEY` directive for every media segment. This might result in an increase in client requests to the DRM server.","StreamSelection":"Video bitrate limitations for outputs from this packaging configuration."}},"AWS::MediaPackage::PackagingConfiguration.HlsPackage":{"attributes":{},"description":"Parameters for a packaging configuration that uses HTTP Live Streaming (HLS) packaging.","properties":{"Encryption":"Parameters for encrypting content.","HlsManifests":"A list of HLS manifest configurations that are available from this endpoint.","IncludeDvbSubtitles":"When enabled, MediaPackage passes through digital video broadcasting (DVB) subtitles into the output.","SegmentDurationSeconds":"Duration (in seconds) of each fragment. Actual fragments are rounded to the nearest multiple of the source fragment duration.","UseAudioRenditionGroup":"When true, AWS Elemental MediaPackage bundles all audio tracks in a rendition group. All other tracks in the stream can be used with any audio rendition from the group."}},"AWS::MediaPackage::PackagingConfiguration.MssEncryption":{"attributes":{},"description":"Holds encryption information so that access to the content can be controlled by a DRM solution.","properties":{"SpekeKeyProvider":"Parameters for the SPEKE key provider."}},"AWS::MediaPackage::PackagingConfiguration.MssManifest":{"attributes":{},"description":"Parameters for a Microsoft Smooth manifest.","properties":{"ManifestName":"A short string that\'s appended to the end of the endpoint URL to create a unique path to this packaging configuration.","StreamSelection":"Video bitrate limitations for outputs from this packaging configuration."}},"AWS::MediaPackage::PackagingConfiguration.MssPackage":{"attributes":{},"description":"Parameters for a packaging configuration that uses Microsoft Smooth Streaming (MSS) packaging.","properties":{"Encryption":"Parameters for encrypting content.","MssManifests":"A list of Microsoft Smooth manifest configurations that are available from this endpoint.","SegmentDurationSeconds":"Duration (in seconds) of each fragment. Actual fragments are rounded to the nearest multiple of the source fragment duration."}},"AWS::MediaPackage::PackagingConfiguration.SpekeKeyProvider":{"attributes":{},"description":"A configuration for accessing an external Secure Packager and Encoder Key Exchange (SPEKE) service that provides encryption keys.","properties":{"EncryptionContractConfiguration":"Use `encryptionContractConfiguration` to configure one or more content encryption keys for your endpoints that use SPEKE Version 2.0. The encryption contract defines which content keys are used to encrypt the audio and video tracks in your stream. To configure the encryption contract, specify which audio and video encryption presets to use.","RoleArn":"The ARN for the IAM role that\'s granted by the key provider to provide access to the key provider API. Valid format: arn:aws:iam::{accountID}:role/{name}","SystemIds":"List of unique identifiers for the DRM systems to use, as defined in the CPIX specification.","Url":"URL for the key provider\'s key retrieval API endpoint. Must start with https://."}},"AWS::MediaPackage::PackagingConfiguration.StreamSelection":{"attributes":{},"description":"Limitations for outputs from the endpoint, based on the video bitrate.","properties":{"MaxVideoBitsPerSecond":"The upper limit of the bitrates that this endpoint serves. If the video track exceeds this threshold, then AWS Elemental MediaPackage excludes it from output. If you don\'t specify a value, it defaults to 2147483647 bits per second.","MinVideoBitsPerSecond":"The lower limit of the bitrates that this endpoint serves. If the video track is below this threshold, then AWS Elemental MediaPackage excludes it from output. If you don\'t specify a value, it defaults to 0 bits per second.","StreamOrder":"Order in which the different video bitrates are presented to the player.\\n\\nValid values: `ORIGINAL` , `VIDEO_BITRATE_ASCENDING` , `VIDEO_BITRATE_DESCENDING` ."}},"AWS::MediaPackage::PackagingGroup":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the packaging group. You can get this from the response to any request to the packaging group.","DomainName":"The URL for the assets in the PackagingGroup.","Ref":"`Ref` returns the name of the packaging group.\\n\\nFor example: `{ \\"Ref\\": \\"myPackagingGroup\\" }`"},"description":"Creates a packaging group.\\n\\nThe packaging group holds one or more packaging configurations. When you create an asset, you specify the packaging group associated with the asset. The asset has playback endpoints for each packaging configuration within the group.","properties":{"Authorization":"Parameters for CDN authorization.","EgressAccessLogs":"The configuration parameters for egress access logging.","Id":"Unique identifier that you assign to the packaging group.","Tags":"The tags to assign to the packaging group."}},"AWS::MediaPackage::PackagingGroup.Authorization":{"attributes":{},"description":"Parameters for enabling CDN authorization.","properties":{"CdnIdentifierSecret":"The Amazon Resource Name (ARN) for the secret in AWS Secrets Manager that is used for CDN authorization.","SecretsRoleArn":"The Amazon Resource Name (ARN) for the IAM role that allows AWS Elemental MediaPackage to communicate with AWS Secrets Manager ."}},"AWS::MediaPackage::PackagingGroup.LogConfiguration":{"attributes":{},"description":"Sets a custom Amazon CloudWatch log group name for egress logs. If a log group name isn\'t specified, the default name is used: /aws/MediaPackage/EgressAccessLogs.","properties":{"LogGroupName":"Sets a custom Amazon CloudWatch log group name for egress logs. If a log group name isn\'t specified, the default name is used: /aws/MediaPackage/EgressAccessLogs."}},"AWS::MediaStore::Container":{"attributes":{"Endpoint":"The DNS endpoint of the container. Use the endpoint to identify the specific container when sending requests to the data plane. The service assigns this value when the container is created. Once the value has been assigned, it does not change.","Ref":"`Ref` returns the name of the container.\\n\\nFor example: `{ \\"Ref\\": \\"myContainer\\" }`"},"description":"The AWS::MediaStore::Container resource specifies a storage container to hold objects. A container is similar to a bucket in Amazon S3.\\n\\nWhen you create a container using AWS CloudFormation , the template manages data for five API actions: creating a container, setting access logging, updating the default container policy, adding a cross-origin resource sharing (CORS) policy, and adding an object lifecycle policy.","properties":{"AccessLoggingEnabled":"The state of access logging on the container. This value is `false` by default, indicating that AWS Elemental MediaStore does not send access logs to Amazon CloudWatch Logs. When you enable access logging on the container, MediaStore changes this value to `true` , indicating that the service delivers access logs for objects stored in that container to CloudWatch Logs.","ContainerName":"The name for the container. The name must be from 1 to 255 characters. Container names must be unique to your AWS account within a specific region. As an example, you could create a container named `movies` in every region, as long as you don’t have an existing container with that name.","CorsPolicy":"Sets the cross-origin resource sharing (CORS) configuration on a container so that the container can service cross-origin requests. For example, you might want to enable a request whose origin is http://www.example.com to access your AWS Elemental MediaStore container at my.example.container.com by using the browser\'s XMLHttpRequest capability.\\n\\nTo enable CORS on a container, you attach a CORS policy to the container. In the CORS policy, you configure rules that identify origins and the HTTP methods that can be executed on your container. The policy can contain up to 398,000 characters. You can add up to 100 rules to a CORS policy. If more than one rule applies, the service uses the first applicable rule listed.\\n\\nTo learn more about CORS, see [Cross-Origin Resource Sharing (CORS) in AWS Elemental MediaStore](https://docs.aws.amazon.com/mediastore/latest/ug/cors-policy.html) .","LifecyclePolicy":"Writes an object lifecycle policy to a container. If the container already has an object lifecycle policy, the service replaces the existing policy with the new policy. It takes up to 20 minutes for the change to take effect.\\n\\nFor information about how to construct an object lifecycle policy, see [Components of an Object Lifecycle Policy](https://docs.aws.amazon.com/mediastore/latest/ug/policies-object-lifecycle-components.html) .","MetricPolicy":"","Policy":"Creates an access policy for the specified container to restrict the users and clients that can access it. For information about the data that is included in an access policy, see the [AWS Identity and Access Management User Guide](https://docs.aws.amazon.com/iam/) .\\n\\nFor this release of the REST API, you can create only one policy for a container. If you enter `PutContainerPolicy` twice, the second command modifies the existing policy.","Tags":""}},"AWS::MediaStore::Container.CorsRule":{"attributes":{},"description":"A rule for a CORS policy. You can add up to 100 rules to a CORS policy. If more than one rule applies, the service uses the first applicable rule listed.","properties":{"AllowedHeaders":"Specifies which headers are allowed in a preflight `OPTIONS` request through the `Access-Control-Request-Headers` header. Each header name that is specified in `Access-Control-Request-Headers` must have a corresponding entry in the rule. Only the headers that were requested are sent back.\\n\\nThis element can contain only one wildcard character (*).","AllowedMethods":"Identifies an HTTP method that the origin that is specified in the rule is allowed to execute.\\n\\nEach CORS rule must contain at least one `AllowedMethods` and one `AllowedOrigins` element.","AllowedOrigins":"One or more response headers that you want users to be able to access from their applications (for example, from a JavaScript `XMLHttpRequest` object).\\n\\nEach CORS rule must have at least one `AllowedOrigins` element. The string value can include only one wildcard character (*), for example, http://*.example.com. Additionally, you can specify only one wildcard character to allow cross-origin access for all origins.","ExposeHeaders":"One or more headers in the response that you want users to be able to access from their applications (for example, from a JavaScript `XMLHttpRequest` object).\\n\\nThis element is optional for each rule.","MaxAgeSeconds":"The time in seconds that your browser caches the preflight response for the specified resource.\\n\\nA CORS rule can have only one `MaxAgeSeconds` element."}},"AWS::MediaStore::Container.MetricPolicy":{"attributes":{},"description":"The metric policy that is associated with the container. A metric policy allows AWS Elemental MediaStore to send metrics to Amazon CloudWatch. In the policy, you must indicate whether you want MediaStore to send container-level metrics. You can also include rules to define groups of objects that you want MediaStore to send object-level metrics for.\\n\\nTo view examples of how to construct a metric policy for your use case, see [Example Metric Policies](https://docs.aws.amazon.com/mediastore/latest/ug/policies-metric-examples.html) .","properties":{"ContainerLevelMetrics":"A setting to enable or disable metrics at the container level.","MetricPolicyRules":"A parameter that holds an array of rules that enable metrics at the object level. This parameter is optional, but if you choose to include it, you must also include at least one rule. By default, you can include up to five rules. You can also [request a quota increase](https://docs.aws.amazon.com/servicequotas/home?region=us-east-1#!/services/mediastore/quotas) to allow up to 300 rules per policy."}},"AWS::MediaStore::Container.MetricPolicyRule":{"attributes":{},"description":"A setting that enables metrics at the object level. Each rule contains an object group and an object group name. If the policy includes the MetricPolicyRules parameter, you must include at least one rule. Each metric policy can include up to five rules by default. You can also [request a quota increase](https://docs.aws.amazon.com/servicequotas/home?region=us-east-1#!/services/mediastore/quotas) to allow up to 300 rules per policy.","properties":{"ObjectGroup":"A path or file name that defines which objects to include in the group. Wildcards (*) are acceptable.","ObjectGroupName":"A name that allows you to refer to the object group."}},"AWS::MediaTailor::PlaybackConfiguration":{"attributes":{"DashConfiguration.ManifestEndpointPrefix":"The URL generated by MediaTailor to initiate a playback session. The session uses server-side reporting. This setting is ignored in PUT operations.","HlsConfiguration.ManifestEndpointPrefix":"The URL that is used to initiate a playback session for devices that support Apple HLS. The session uses server-side reporting.","PlaybackConfigurationArn":"The Amazon Resource Name (ARN) for the playback configuration.","PlaybackEndpointPrefix":"The URL that the player accesses to get a manifest from MediaTailor . This session will use server-side reporting.","SessionInitializationEndpointPrefix":"The URL that the player uses to initialize a session that uses client-side reporting."},"description":"Adds a new playback configuration to AWS Elemental MediaTailor .","properties":{"AdDecisionServerUrl":"","AvailSuppression":"","Bumper":"","CdnConfiguration":"","ConfigurationAliases":"The player parameters and aliases used as dynamic variables during session initialization. For more information, see [Domain Variables](https://docs.aws.amazon.com/mediatailor/latest/ug/variables-domain.html) .","DashConfiguration":"","HlsConfiguration":"The configuration for HLS content.","LivePreRollConfiguration":"","ManifestProcessingRules":"","Name":"","PersonalizationThresholdSeconds":"","SlateAdUrl":"","Tags":"","TranscodeProfileName":"","VideoContentSourceUrl":""}},"AWS::MediaTailor::PlaybackConfiguration.AdMarkerPassthrough":{"attributes":{},"description":"","properties":{"Enabled":""}},"AWS::MediaTailor::PlaybackConfiguration.AvailSuppression":{"attributes":{},"description":"","properties":{"Mode":"","Value":""}},"AWS::MediaTailor::PlaybackConfiguration.Bumper":{"attributes":{},"description":"","properties":{"EndUrl":"","StartUrl":""}},"AWS::MediaTailor::PlaybackConfiguration.CdnConfiguration":{"attributes":{},"description":"","properties":{"AdSegmentUrlPrefix":"","ContentSegmentUrlPrefix":""}},"AWS::MediaTailor::PlaybackConfiguration.DashConfiguration":{"attributes":{},"description":"The configuration for DASH content.","properties":{"ManifestEndpointPrefix":"The URL generated by MediaTailor to initiate a playback session. The session uses server-side reporting. This setting is ignored in PUT operations.","MpdLocation":"The setting that controls whether MediaTailor includes the Location tag in DASH manifests. MediaTailor populates the Location tag with the URL for manifest update requests, to be used by players that don\'t support sticky redirects. Disable this if you have CDN routing rules set up for accessing MediaTailor manifests, and you are either using client-side reporting or your players support sticky HTTP redirects. Valid values are `DISABLED` and `EMT_DEFAULT` . The `EMT_DEFAULT` setting enables the inclusion of the tag and is the default value.","OriginManifestType":"The setting that controls whether MediaTailor handles manifests from the origin server as multi-period manifests or single-period manifests. If your origin server produces single-period manifests, set this to `SINGLE_PERIOD` . The default setting is `MULTI_PERIOD` . For multi-period manifests, omit this setting or set it to `MULTI_PERIOD` ."}},"AWS::MediaTailor::PlaybackConfiguration.HlsConfiguration":{"attributes":{},"description":"The configuration for HLS content.","properties":{"ManifestEndpointPrefix":"The URL that is used to initiate a playback session for devices that support Apple HLS. The session uses server-side reporting."}},"AWS::MediaTailor::PlaybackConfiguration.LivePreRollConfiguration":{"attributes":{},"description":"","properties":{"AdDecisionServerUrl":"","MaxDurationSeconds":""}},"AWS::MediaTailor::PlaybackConfiguration.ManifestProcessingRules":{"attributes":{},"description":"","properties":{"AdMarkerPassthrough":""}},"AWS::MemoryDB::ACL":{"attributes":{"Arn":"When you pass the logical ID of this resource to the intrinsic `Ref` function, Ref returns the ARN of the Access Control List, such as `arn:aws:memorydb:us-east-1:123456789012:acl/my-acl`","Status":"Indicates ACL status.\\n\\n*Valid values* : `creating` | `active` | `modifying` | `deleting`"},"description":"Specifies an Access Control List. For more information, see [Authenticating users with Access Contol Lists (ACLs)](https://docs.aws.amazon.com/memorydb/latest/devguide/clusters.acls.html) .","properties":{"ACLName":"The name of the Access Control List.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","UserNames":"The list of users that belong to the Access Control List."}},"AWS::MemoryDB::Cluster":{"attributes":{"ARN":"When you pass the logical ID of this resource to the intrinsic `Ref` function, Ref returns the ARN of the cluster , such as `arn:aws:memorydb:us-east-1:123456789012:cluster/my-cluster`","ClusterEndpoint.Address":"The address of the cluster \'s configuration endpoint.","ClusterEndpoint.Port":"The port used by the cluster configuration endpoint.","ParameterGroupStatus":"The status of the parameter group used by the cluster , for example `active` or `applying` .","Status":"The status of the cluster. For example, \'available\', \'updating\' or \'creating\'."},"description":"Specifies a cluster . All nodes in the cluster run the same protocol-compliant engine software.","properties":{"ACLName":"The name of the Access Control List to associate with the cluster .","AutoMinorVersionUpgrade":"When set to true, the cluster will automatically receive minor engine version upgrades after launch.","ClusterEndpoint":"The cluster \'s configuration endpoint.","ClusterName":"The name of the cluster .","DataTiering":"Enables data tiering. Data tiering is only supported for replication groups using the r6gd node type. This parameter must be set to true when using r6gd nodes. For more information, see [Data tiering](https://docs.aws.amazon.com/memorydb/latest/devguide/data-tiering.html) .","Description":"A description of the cluster .","EngineVersion":"The Redis engine version used by the cluster .","FinalSnapshotName":"The user-supplied name of a final cluster snapshot. This is the unique name that identifies the snapshot. MemoryDB creates the snapshot, and then deletes the cluster immediately afterward.","KmsKeyId":"The ID of the KMS key used to encrypt the cluster .","MaintenanceWindow":"Specifies the weekly time range during which maintenance on the cluster is performed. It is specified as a range in the format `ddd:hh24:mi-ddd:hh24:mi` (24H Clock UTC). The minimum maintenance window is a 60 minute period.\\n\\n*Pattern* : `ddd:hh24:mi-ddd:hh24:mi`","NodeType":"The cluster \'s node type.","NumReplicasPerShard":"The number of replicas to apply to each shard.\\n\\n*Default value* : `1`\\n\\n*Maximum value* : `5`","NumShards":"The number of shards in the cluster .","ParameterGroupName":"The name of the parameter group used by the cluster .","Port":"The port used by the cluster .","SecurityGroupIds":"A list of security group names to associate with this cluster .","SnapshotArns":"A list of Amazon Resource Names (ARN) that uniquely identify the RDB snapshot files stored in Amazon S3. The snapshot files are used to populate the new cluster . The Amazon S3 object name in the ARN cannot contain any commas.","SnapshotName":"The name of a snapshot from which to restore data into the new cluster . The snapshot status changes to restoring while the new cluster is being created.","SnapshotRetentionLimit":"The number of days for which MemoryDB retains automatic snapshots before deleting them. For example, if you set SnapshotRetentionLimit to 5, a snapshot that was taken today is retained for 5 days before being deleted.","SnapshotWindow":"The daily time range (in UTC) during which MemoryDB begins taking a daily snapshot of your shard. Example: 05:00-09:00 If you do not specify this parameter, MemoryDB automatically chooses an appropriate time range.","SnsTopicArn":"When you pass the logical ID of this resource to the intrinsic `Ref` function, Ref returns the ARN of the SNS topic, such as `arn:aws:memorydb:us-east-1:123456789012:mySNSTopic`","SnsTopicStatus":"The SNS topic must be in Active status to receive notifications.","SubnetGroupName":"The name of the subnet group used by the cluster .","TLSEnabled":"A flag to indicate if In-transit encryption is enabled.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::MemoryDB::Cluster.Endpoint":{"attributes":{},"description":"Represents the information required for client programs to connect to the cluster and its nodes.","properties":{"Address":"The DNS hostname of the node.","Port":"The port number that the engine is listening on."}},"AWS::MemoryDB::ParameterGroup":{"attributes":{"ARN":"When you pass the logical ID of this resource to the intrinsic `Ref` function, Ref returns the ARN of the parameter group, such as `arn:aws:memorydb:us-east-1:123456789012:parametergroup/my-parameter-group`"},"description":"Specifies a new MemoryDB parameter group. A parameter group is a collection of parameters and their values that are applied to all of the nodes in any cluster . For more information, see [Configuring engine parameters using parameter groups](https://docs.aws.amazon.com/memorydb/latest/devguide/parametergroups.html) .","properties":{"Description":"A description of the parameter group.","Family":"The name of the parameter group family that this parameter group is compatible with.","ParameterGroupName":"The name of the parameter group.","Parameters":"Returns the detailed parameter list for the parameter group.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::MemoryDB::SubnetGroup":{"attributes":{"ARN":"When you pass the logical ID of this resource to the intrinsic `Ref` function, Ref returns the ARN of the subnet group, such as `arn:aws:memorydb:us-east-1:123456789012:subnetgroup/my-subnet-group`"},"description":"Specifies a subnet group. A subnet group is a collection of subnets (typically private) that you can designate for your cluster s running in an Amazon Virtual Private Cloud (VPC) environment. When you create a cluster in an Amazon VPC , you must specify a subnet group. MemoryDB uses that subnet group to choose a subnet and IP addresses within that subnet to associate with your nodes. For more information, see [Subnets and subnet groups](https://docs.aws.amazon.com/memorydb/latest/devguide/subnetgroups.html) .","properties":{"Description":"A description of the subnet group.","SubnetGroupName":"The name of the subnet group to be used for the cluster .","SubnetIds":"A list of Amazon VPC subnet IDs for the subnet group.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::MemoryDB::User":{"attributes":{"Arn":"When you pass the logical ID of this resource to the intrinsic `Ref` function, Ref returns the ARN of the user, such as `arn:aws:memorydb:us-east-1:123456789012:user/user1`","Status":"Indicates the user status.\\n\\n*Valid values* : `active` | `modifying` | `deleting`"},"description":"Specifies a MemoryDB user. For more information, see [Authenticating users with Access Contol Lists (ACLs)](https://docs.aws.amazon.com/memorydb/latest/devguide/clusters.acls.html) .","properties":{"AccessString":"Access permissions string used for this user.","AuthenticationMode":"Denotes whether the user requires a password to authenticate.\\n\\n*Example:*\\n\\n`mynewdbuser: Type: AWS::MemoryDB::User Properties: AccessString: on ~* &* +@all AuthenticationMode: Passwords: \'1234567890123456\' Type: password UserName: mynewdbuser AuthenticationMode: { \\"Passwords\\": [\\"1234567890123456\\"], \\"Type\\": \\"Password\\" }`","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","UserName":"The name of the user."}},"AWS::MemoryDB::User.AuthenticationMode":{"attributes":{},"description":"","properties":{"Passwords":"","Type":""}},"AWS::Neptune::DBCluster":{"attributes":{"ClusterResourceId":"The resource id for the DB cluster. For example: `cluster-ABCD1234EFGH5678IJKL90MNOP` . The cluster ID uniquely identifies the cluster and is used in things like IAM authentication policies.","Endpoint":"The connection endpoint for the DB cluster. For example: `mystack-mydbcluster-1apw1j4phylrk.cg034hpkmmjt.us-east-2.rds.amazonaws.com`","Port":"The port number on which the DB cluster accepts connections. For example: `8182` .","ReadEndpoint":"The reader endpoint for the DB cluster. For example: `mystack-mydbcluster-ro-1apw1j4phylrk.cg034hpkmmjt.us-east-2.rds.amazonaws.com`","Ref":"`Ref` returns the resource name."},"description":"The `AWS::Neptune::DBCluster` resource creates an Amazon Neptune DB cluster. Neptune is a fully managed graph database.\\n\\n> Currently, you can create this resource only in AWS Regions in which Amazon Neptune is supported. \\n\\nIf no `DeletionPolicy` is set for `AWS::Neptune::DBCluster` resources, the default deletion behavior is that the entire volume will be deleted without a snapshot. To retain a backup of the volume, the `DeletionPolicy` should be set to `Snapshot` . For more information about how AWS CloudFormation deletes resources, see [DeletionPolicy Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) .\\n\\nYou can use `AWS::Neptune::DBCluster.DeletionProtection` to help guard against unintended deletion of your DB cluster.","properties":{"AssociatedRoles":"Provides a list of the Amazon Identity and Access Management (IAM) roles that are associated with the DB cluster. IAM roles that are associated with a DB cluster grant permission for the DB cluster to access other Amazon services on your behalf.","AvailabilityZones":"Provides the list of EC2 Availability Zones that instances in the DB cluster can be created in.","BackupRetentionPeriod":"Specifies the number of days for which automatic DB snapshots are retained.\\n\\nAn update may require some interruption. See [ModifyDBInstance](https://docs.aws.amazon.com/neptune/latest/userguide/api-instances.html#ModifyDBInstance) in the Amazon Neptune User Guide for more information.","CopyTagsToSnapshot":"*If set to `true` , tags are copied to any snapshot of the DB cluster that is created.*","DBClusterIdentifier":"Contains a user-supplied DB cluster identifier. This identifier is the unique key that identifies a DB cluster.","DBClusterParameterGroupName":"Provides the name of the DB cluster parameter group.\\n\\nAn update may require some interruption. See [ModifyDBInstance](https://docs.aws.amazon.com/neptune/latest/userguide/api-instances.html#ModifyDBInstance) in the Amazon Neptune User Guide for more information.","DBInstanceParameterGroupName":"The name of the DB parameter group to apply to all instances of the DB cluster. Used only in case of a major engine version upgrade request\\n\\nNote that when you apply a parameter group using `DBInstanceParameterGroupName` , parameter changes are applied immediately, not during the next maintenance window.\\n\\n**Constraints** - The DB parameter group must be in the same DB parameter group family as the target DB cluster version.\\n- The `DBInstanceParameterGroupName` parameter is only valid for major engine version upgrades.","DBSubnetGroupName":"Specifies information on the subnet group associated with the DB cluster, including the name, description, and subnets in the subnet group.","DeletionProtection":"Indicates whether or not the DB cluster has deletion protection enabled. The database can\'t be deleted when deletion protection is enabled.","EnableCloudwatchLogsExports":"Specifies a list of log types that are enabled for export to CloudWatch Logs.","EngineVersion":"Indicates the database engine version.","IamAuthEnabled":"True if mapping of Amazon Identity and Access Management (IAM) accounts to database accounts is enabled, and otherwise false.","KmsKeyId":"If `StorageEncrypted` is true, the Amazon KMS key identifier for the encrypted DB cluster.","PreferredBackupWindow":"Specifies the daily time range during which automated backups are created if automated backups are enabled, as determined by the `BackupRetentionPeriod` .\\n\\nAn update may require some interruption.","PreferredMaintenanceWindow":"Specifies the weekly time range during which system maintenance can occur, in Universal Coordinated Time (UTC).","RestoreToTime":"Creates a new DB cluster from a DB snapshot or DB cluster snapshot.\\n\\nIf a DB snapshot is specified, the target DB cluster is created from the source DB snapshot with a default configuration and default security group.\\n\\nIf a DB cluster snapshot is specified, the target DB cluster is created from the source DB cluster restore point with the same configuration as the original source DB cluster, except that the new DB cluster is created with the default security group.","RestoreType":"Creates a new DB cluster from a DB snapshot or DB cluster snapshot.\\n\\nIf a DB snapshot is specified, the target DB cluster is created from the source DB snapshot with a default configuration and default security group.\\n\\nIf a DB cluster snapshot is specified, the target DB cluster is created from the source DB cluster restore point with the same configuration as the original source DB cluster, except that the new DB cluster is created with the default security group.","ServerlessScalingConfiguration":"","SnapshotIdentifier":"Specifies the identifier for a DB cluster snapshot. Must match the identifier of an existing snapshot.\\n\\nAfter you restore a DB cluster using a `SnapshotIdentifier` , you must specify the same `SnapshotIdentifier` for any future updates to the DB cluster. When you specify this property for an update, the DB cluster is not restored from the snapshot again, and the data in the database is not changed.\\n\\nHowever, if you don\'t specify the `SnapshotIdentifier` , an empty DB cluster is created, and the original DB cluster is deleted. If you specify a property that is different from the previous snapshot restore property, the DB cluster is restored from the snapshot specified by the `SnapshotIdentifier` , and the original DB cluster is deleted.","SourceDBClusterIdentifier":"Creates a new DB cluster from a DB snapshot or DB cluster snapshot.\\n\\nIf a DB snapshot is specified, the target DB cluster is created from the source DB snapshot with a default configuration and default security group.\\n\\nIf a DB cluster snapshot is specified, the target DB cluster is created from the source DB cluster restore point with the same configuration as the original source DB cluster, except that the new DB cluster is created with the default security group.","StorageEncrypted":"Indicates whether the DB cluster is encrypted.\\n\\nIf you specify the `DBClusterIdentifier` , `DBSnapshotIdentifier` , or `SourceDBInstanceIdentifier` property, don\'t specify this property. The value is inherited from the cluster, snapshot, or source DB instance. If you specify the `KmsKeyId` property, you must enable encryption.\\n\\nIf you specify the `KmsKeyId` , you must enable encryption by setting `StorageEncrypted` to true.","Tags":"The tags assigned to this cluster.","UseLatestRestorableTime":"Creates a new DB cluster from a DB snapshot or DB cluster snapshot.\\n\\nIf a DB snapshot is specified, the target DB cluster is created from the source DB snapshot with a default configuration and default security group.\\n\\nIf a DB cluster snapshot is specified, the target DB cluster is created from the source DB cluster restore point with the same configuration as the original source DB cluster, except that the new DB cluster is created with the default security group.","VpcSecurityGroupIds":"Provides a list of VPC security groups that the DB cluster belongs to."}},"AWS::Neptune::DBCluster.DBClusterRole":{"attributes":{},"description":"Describes an Amazon Identity and Access Management (IAM) role that is associated with a DB cluster.","properties":{"FeatureName":"The name of the feature associated with the Amazon Identity and Access Management (IAM) role. For the list of supported feature names, see [DescribeDBEngineVersions](https://docs.aws.amazon.com/neptune/latest/userguide/api-other-apis.html#DescribeDBEngineVersions) .","RoleArn":"The Amazon Resource Name (ARN) of the IAM role that is associated with the DB cluster."}},"AWS::Neptune::DBCluster.ServerlessScalingConfiguration":{"attributes":{},"description":"","properties":{"MaxCapacity":"","MinCapacity":""}},"AWS::Neptune::DBClusterParameterGroup":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"The `AWS::Neptune::DBClusterParameterGroup` resource creates a new Amazon Neptune DB cluster parameter group.\\n\\n> Applying a parameter group to a DB cluster might require instances to reboot, resulting in a database outage while the instances reboot. > If you provide a custom `DBClusterParameterGroup` that you associate with the `DBCluster` , it is best to specify an `EngineVersion` property in the `DBCluster` . That `EngineVersion` needs to be compatible with the value of the `Family` property in the `DBClusterParameterGroup` .","properties":{"Description":"Provides the customer-specified description for this DB cluster parameter group.","Family":"Must be `neptune1` for engine versions prior to [1.2.0.0](https://docs.aws.amazon.com/neptune/latest/userguide/engine-releases-1.2.0.0.html) , or `neptune1.2` for engine version `1.2.0.0` and higher.","Name":"Provides the name of the DB cluster parameter group.","Parameters":"The parameters to set for this DB cluster parameter group.\\n\\nThe parameters are expressed as a JSON object consisting of key-value pairs.\\n\\nIf you update the parameters, some interruption may occur depending on which parameters you update.","Tags":"The tags that you want to attach to this parameter group."}},"AWS::Neptune::DBInstance":{"attributes":{"Endpoint":"The connection endpoint for the database. For example: `mystack-mydb-1apw1j4phylrk.cg034hpkmmjt.us-east-2.rds.amazonaws.com` .","Port":"The port number on which the database accepts connections. For example: `8182` .","Ref":"`Ref` returns the resource name."},"description":"The `AWS::Neptune::DBInstance` type creates an Amazon Neptune DB instance.\\n\\n*Updating DB Instances*\\n\\nYou can set a deletion policy for your DB instance to control how AWS CloudFormation handles the instance when the stack is deleted. For Neptune DB instances, you can choose to *retain* the instance, to *delete* the instance, or to *create a snapshot* of the instance. The default AWS CloudFormation behavior depends on the `DBClusterIdentifier` property:\\n\\n- For `AWS::Neptune::DBInstance` resources that don\'t specify the `DBClusterIdentifier` property, AWS CloudFormation saves a snapshot of the DB instance.\\n- For `AWS::Neptune::DBInstance` resources that do specify the `DBClusterIdentifier` property, AWS CloudFormation deletes the DB instance.\\n\\n*Deleting DB Instances*\\n\\n> If a DB instance is deleted or replaced during an update, AWS CloudFormation deletes all automated snapshots. However, it retains manual DB snapshots. During an update that requires replacement, you can apply a stack policy to prevent DB instances from being replaced. \\n\\nWhen properties labeled *Update requires: Replacement* are updated, AWS CloudFormation first creates a replacement DB instance, changes references from other dependent resources to point to the replacement DB instance, and finally deletes the old DB instance.\\n\\n> We highly recommend that you take a snapshot of the database before updating the stack. If you don\'t, you lose the data when AWS CloudFormation replaces your DB instance. To preserve your data, perform the following procedure:\\n> \\n> - Deactivate any applications that are using the DB instance so that there\'s no activity on the DB instance.\\n> - Create a snapshot of the DB instance.\\n> - If you want to restore your instance using a DB snapshot, modify the updated template with your DB instance changes and add the `DBSnapshotIdentifier` property with the ID of the DB snapshot that you want to use.\\n> - Update the stack.","properties":{"AllowMajorVersionUpgrade":"Indicates that major version upgrades are allowed. Changing this parameter doesn\'t result in an outage and the change is asynchronously applied as soon as possible. This parameter must be set to true when specifying a value for the EngineVersion parameter that is a different major version than the DB instance\'s current version.\\n\\nWhen you change this parameter for an existing DB cluster, CloudFormation will replace your existing DB cluster with a new, empty one that uses the engine version you specified.","AutoMinorVersionUpgrade":"Indicates that minor version patches are applied automatically.\\n\\nWhen updating this property, some interruptions may occur.","AvailabilityZone":"Specifies the name of the Availability Zone the DB instance is located in.","DBClusterIdentifier":"If the DB instance is a member of a DB cluster, contains the name of the DB cluster that the DB instance is a member of.","DBInstanceClass":"Contains the name of the compute and memory capacity class of the DB instance.\\n\\nIf you update this property, some interruptions may occur.","DBInstanceIdentifier":"Contains a user-supplied database identifier. This identifier is the unique key that identifies a DB instance.","DBParameterGroupName":"The name of an existing DB parameter group or a reference to an AWS::Neptune::DBParameterGroup resource created in the template. If any of the data members of the referenced parameter group are changed during an update, the DB instance might need to be restarted, which causes some interruption. If the parameter group contains static parameters, whether they were changed or not, an update triggers a reboot.","DBSnapshotIdentifier":"This parameter is not supported.\\n\\n`AWS::Neptune::DBInstance` does not support restoring from snapshots.\\n\\n`AWS::Neptune::DBCluster` does support restoring from snapshots.","DBSubnetGroupName":"A DB subnet group to associate with the DB instance. If you update this value, the new subnet group must be a subnet group in a new virtual private cloud (VPC).","PreferredMaintenanceWindow":"Specifies the weekly time range during which system maintenance can occur, in Universal Coordinated Time (UTC).","Tags":"An arbitrary set of tags (key-value pairs) for this DB instance."}},"AWS::Neptune::DBParameterGroup":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"`AWS::Neptune::DBParameterGroup` creates a new DB parameter group. This type can be declared in a template and referenced in the `DBParameterGroupName` parameter of `AWS::Neptune::DBInstance` .\\n\\n> Applying a parameter group to a DB instance might require the instance to reboot, resulting in a database outage for the duration of the reboot. > If you provide a custom `DBParameterGroup` that you associate with `DBInstance` , it is best to specify an `EngineVersion` property in `DBCluster` . That `EngineVersion` needs to be compatible with the value of the `Family` property in the `DBParameterGroup` . \\n\\nA DB parameter group is initially created with the default parameters for the database engine used by the DB instance. To provide custom values for any of the parameters, you must modify the group after creating it using *ModifyDBParameterGroup* . Once you\'ve created a DB parameter group, you need to associate it with your DB instance using *ModifyDBInstance* . When you associate a new DB parameter group with a running DB instance, you need to reboot the DB instance without failover for the new DB parameter group and associated settings to take effect.\\n\\n> After you create a DB parameter group, you should wait at least 5 minutes before creating your first DB instance that uses that DB parameter group as the default parameter group. This allows Amazon Neptune to fully complete the create action before the parameter group is used as the default for a new DB instance. This is especially important for parameters that are critical when creating the default database for a DB instance, such as the character set for the default database defined by the `character_set_database` parameter. You can use the *Parameter Groups* option of the Amazon Neptune console or the *DescribeDBParameters* command to verify that your DB parameter group has been created or modified.","properties":{"Description":"Provides the customer-specified description for this DB parameter group.","Family":"Must be `neptune1` for engine versions prior to [1.2.0.0](https://docs.aws.amazon.com/neptune/latest/userguide/engine-releases-1.2.0.0.html) , or `neptune1.2` for engine version `1.2.0.0` and higher.","Name":"Provides the name of the DB parameter group.","Parameters":"The parameters to set for this DB parameter group.\\n\\nThe parameters are expressed as a JSON object consisting of key-value pairs.\\n\\nChanges to dynamic parameters are applied immediately. During an update, if you have static parameters (whether they were changed or not), it triggers AWS CloudFormation to reboot the associated DB instance without failover.","Tags":"The tags that you want to attach to this parameter group."}},"AWS::Neptune::DBSubnetGroup":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"The `AWS::Neptune::DBSubnetGroup` type creates an Amazon Neptune DB subnet group. Subnet groups must contain at least two subnets in two different Availability Zones in the same AWS Region.","properties":{"DBSubnetGroupDescription":"Provides the description of the DB subnet group.","DBSubnetGroupName":"The name of the DB subnet group.","SubnetIds":"The Amazon EC2 subnet IDs for the DB subnet group.","Tags":"The tags that you want to attach to the DB subnet group."}},"AWS::NetworkFirewall::Firewall":{"attributes":{"EndpointIds":"The unique IDs of the firewall endpoints for all of the subnets that you attached to the firewall. The subnets are not listed in any particular order. For example: `[\\"us-west-2c:vpce-111122223333\\", \\"us-west-2a:vpce-987654321098\\", \\"us-west-2b:vpce-012345678901\\"]` .","FirewallArn":"The Amazon Resource Name (ARN) of the `Firewall` .","FirewallId":"The name of the `Firewall` resource.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the firewall. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:network-firewall:us-east-1:012345678901:firewall/myFirewallName\\" }`"},"description":"Use the `Firewall` to provide stateful, managed, network firewall and intrusion detection and prevention filtering for your VPCs in Amazon VPC .\\n\\nThe firewall defines the configuration settings for an AWS Network Firewall firewall. The settings include the firewall policy, the subnets in your VPC to use for the firewall endpoints, and any tags that are attached to the firewall AWS resource.","properties":{"DeleteProtection":"A flag indicating whether it is possible to delete the firewall. A setting of `TRUE` indicates that the firewall is protected against deletion. Use this setting to protect against accidentally deleting a firewall that is in use. When you create a firewall, the operation initializes this flag to `TRUE` .","Description":"A description of the firewall.","FirewallName":"The descriptive name of the firewall. You can\'t change the name of a firewall after you create it.","FirewallPolicyArn":"The Amazon Resource Name (ARN) of the firewall policy.\\n\\nThe relationship of firewall to firewall policy is many to one. Each firewall requires one firewall policy association, and you can use the same firewall policy for multiple firewalls.","FirewallPolicyChangeProtection":"A setting indicating whether the firewall is protected against a change to the firewall policy association. Use this setting to protect against accidentally modifying the firewall policy for a firewall that is in use. When you create a firewall, the operation initializes this setting to `TRUE` .","SubnetChangeProtection":"A setting indicating whether the firewall is protected against changes to the subnet associations. Use this setting to protect against accidentally modifying the subnet associations for a firewall that is in use. When you create a firewall, the operation initializes this setting to `TRUE` .","SubnetMappings":"The public subnets that Network Firewall is using for the firewall. Each subnet must belong to a different Availability Zone.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","VpcId":"The unique identifier of the VPC where the firewall is in use. You can\'t change the VPC of a firewall after you create the firewall."}},"AWS::NetworkFirewall::Firewall.SubnetMapping":{"attributes":{},"description":"The ID for a subnet that you want to associate with the firewall. AWS Network Firewall creates an instance of the associated firewall in each subnet that you specify, to filter traffic in the subnet\'s Availability Zone.","properties":{"IPAddressType":"The subnet\'s IP address type. You can\'t change the IP address type after you create the subnet.","SubnetId":"The unique identifier for the subnet."}},"AWS::NetworkFirewall::FirewallPolicy":{"attributes":{"FirewallPolicyArn":"The Amazon Resource Name (ARN) of the `FirewallPolicy` .","FirewallPolicyId":"The unique ID of the `FirewallPolicy` resource.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the firewall policy. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:network-firewall:us-east-1:012345678901:firewall-policy/myFirewallPolicyName\\" }`"},"description":"Use the `FirewallPolicy` to define the stateless and stateful network traffic filtering behavior for your `Firewall` . You can use one firewall policy for multiple firewalls.","properties":{"Description":"A description of the firewall policy.","FirewallPolicy":"The traffic filtering behavior of a firewall policy, defined in a collection of stateless and stateful rule groups and other settings.","FirewallPolicyName":"The descriptive name of the firewall policy. You can\'t change the name of a firewall policy after you create it.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::NetworkFirewall::FirewallPolicy.ActionDefinition":{"attributes":{},"description":"A custom action to use in stateless rule actions settings.","properties":{"PublishMetricAction":"Stateless inspection criteria that publishes the specified metrics to Amazon CloudWatch for the matching packet. This setting defines a CloudWatch dimension value to be published.\\n\\nYou can pair this custom action with any of the standard stateless rule actions. For example, you could pair this in a rule action with the standard action that forwards the packet for stateful inspection. Then, when a packet matches the rule, Network Firewall publishes metrics for the packet and forwards it."}},"AWS::NetworkFirewall::FirewallPolicy.CustomAction":{"attributes":{},"description":"An optional, non-standard action to use for stateless packet handling. You can define this in addition to the standard action that you must specify.\\n\\nYou define and name the custom actions that you want to be able to use, and then you reference them by name in your actions settings.\\n\\nYou can use custom actions in the following places:\\n\\n- In an `RuleGroup.StatelessRulesAndCustomActions` . The custom actions are available for use by name inside the `StatelessRulesAndCustomActions` where you define them. You can use them for your stateless rule actions to specify what to do with a packet that matches the rule\'s match attributes.\\n- In an `FirewallPolicy` specification, in `StatelessCustomActions` . The custom actions are available for use inside the policy where you define them. You can use them for the policy\'s default stateless actions settings to specify what to do with packets that don\'t match any of the policy\'s stateless rules.","properties":{"ActionDefinition":"The custom action associated with the action name.","ActionName":"The descriptive name of the custom action. You can\'t change the name of a custom action after you create it."}},"AWS::NetworkFirewall::FirewallPolicy.Dimension":{"attributes":{},"description":"The value to use in an Amazon CloudWatch custom metric dimension. This is used in the `PublishMetrics` custom action. A CloudWatch custom metric dimension is a name/value pair that\'s part of the identity of a metric.\\n\\nAWS Network Firewall sets the dimension name to `CustomAction` and you provide the dimension value.\\n\\nFor more information about CloudWatch custom metric dimensions, see [Publishing Custom Metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html#usingDimensions) in the [Amazon CloudWatch User Guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) .","properties":{"Value":"The value to use in the custom metric dimension."}},"AWS::NetworkFirewall::FirewallPolicy.FirewallPolicy":{"attributes":{},"description":"The traffic filtering behavior of a firewall policy, defined in a collection of stateless and stateful rule groups and other settings.","properties":{"PolicyVariables":"Contains variables that you can use to override default Suricata settings in your firewall policy.","StatefulDefaultActions":"The default actions to take on a packet that doesn\'t match any stateful rules. The stateful default action is optional, and is only valid when using the strict rule order.\\n\\nValid values of the stateful default action:\\n\\n- aws:drop_strict\\n- aws:drop_established\\n- aws:alert_strict\\n- aws:alert_established\\n\\nFor more information, see [Strict evaluation order](https://docs.aws.amazon.com/network-firewall/latest/developerguide/suricata-rule-evaluation-order.html#suricata-strict-rule-evaluation-order.html) in the *AWS Network Firewall Developer Guide* .","StatefulEngineOptions":"Additional options governing how Network Firewall handles stateful rules. The stateful rule groups that you use in your policy must have stateful rule options settings that are compatible with these settings.","StatefulRuleGroupReferences":"References to the stateful rule groups that are used in the policy. These define the inspection criteria in stateful rules.","StatelessCustomActions":"The custom action definitions that are available for use in the firewall policy\'s `StatelessDefaultActions` setting. You name each custom action that you define, and then you can use it by name in your default actions specifications.","StatelessDefaultActions":"The actions to take on a packet if it doesn\'t match any of the stateless rules in the policy. If you want non-matching packets to be forwarded for stateful inspection, specify `aws:forward_to_sfe` .\\n\\nYou must specify one of the standard actions: `aws:pass` , `aws:drop` , or `aws:forward_to_sfe` . In addition, you can specify custom actions that are compatible with your standard section choice.\\n\\nFor example, you could specify `[\\"aws:pass\\"]` or you could specify `[\\"aws:pass\\", “customActionName”]` . For information about compatibility, see the custom action descriptions.","StatelessFragmentDefaultActions":"The actions to take on a fragmented packet if it doesn\'t match any of the stateless rules in the policy. If you want non-matching fragmented packets to be forwarded for stateful inspection, specify `aws:forward_to_sfe` .\\n\\nYou must specify one of the standard actions: `aws:pass` , `aws:drop` , or `aws:forward_to_sfe` . In addition, you can specify custom actions that are compatible with your standard section choice.\\n\\nFor example, you could specify `[\\"aws:pass\\"]` or you could specify `[\\"aws:pass\\", “customActionName”]` . For information about compatibility, see the custom action descriptions.","StatelessRuleGroupReferences":"References to the stateless rule groups that are used in the policy. These define the matching criteria in stateless rules."}},"AWS::NetworkFirewall::FirewallPolicy.IPSet":{"attributes":{},"description":"A list of IP addresses and address ranges, in CIDR notation. This is part of a `RuleVariables` .","properties":{"Definition":"The list of IP addresses and address ranges, in CIDR notation."}},"AWS::NetworkFirewall::FirewallPolicy.PolicyVariables":{"attributes":{},"description":"Contains variables that you can use to override default Suricata settings in your firewall policy.","properties":{"RuleVariables":"The IPv4 or IPv6 addresses in CIDR notation to use for the Suricata `HOME_NET` variable. If your firewall uses an inspection VPC, you might want to override the `HOME_NET` variable with the CIDRs of your home networks. If you don\'t override `HOME_NET` with your own CIDRs, Network Firewall by default uses the CIDR of your inspection VPC."}},"AWS::NetworkFirewall::FirewallPolicy.PublishMetricAction":{"attributes":{},"description":"Stateless inspection criteria that publishes the specified metrics to Amazon CloudWatch for the matching packet. This setting defines a CloudWatch dimension value to be published.","properties":{"Dimensions":""}},"AWS::NetworkFirewall::FirewallPolicy.StatefulEngineOptions":{"attributes":{},"description":"Configuration settings for the handling of the stateful rule groups in a firewall policy.","properties":{"RuleOrder":"Indicates how to manage the order of stateful rule evaluation for the policy. `DEFAULT_ACTION_ORDER` is the default behavior. Stateful rules are provided to the rule engine as Suricata compatible strings, and Suricata evaluates them based on certain settings. For more information, see [Evaluation order for stateful rules](https://docs.aws.amazon.com/network-firewall/latest/developerguide/suricata-rule-evaluation-order.html) in the *AWS Network Firewall Developer Guide* .","StreamExceptionPolicy":"Configures how Network Firewall processes traffic when a network connection breaks midstream. Network connections can break due to disruptions in external networks or within the firewall itself.\\n\\n- `DROP` - Network Firewall fails closed and drops all subsequent traffic going to the firewall. This is the default behavior.\\n- `CONTINUE` - Network Firewall continues to apply rules to the subsequent traffic without context from traffic before the break. This impacts the behavior of rules that depend on this context. For example, if you have a stateful rule to `drop http` traffic, Network Firewall won\'t match the traffic for this rule because the service won\'t have the context from session initialization defining the application layer protocol as HTTP. However, this behavior is rule dependent—a TCP-layer rule using a `flow:stateless` rule would still match, as would the `aws:drop_strict` default action.\\n- `REJECT` - Network Firewall fails closed and drops all subsequent traffic going to the firewall. Network Firewall also sends a TCP reject packet back to your client so that the client can immediately establish a new session. Network Firewall will have context about the new session and will apply rules to the subsequent traffic."}},"AWS::NetworkFirewall::FirewallPolicy.StatefulRuleGroupOverride":{"attributes":{},"description":"The setting that allows the policy owner to change the behavior of the rule group within a policy.","properties":{"Action":"The action that changes the rule group from `DROP` to `ALERT` . This only applies to managed rule groups."}},"AWS::NetworkFirewall::FirewallPolicy.StatefulRuleGroupReference":{"attributes":{},"description":"Identifier for a single stateful rule group, used in a firewall policy to refer to a rule group.","properties":{"Override":"The action that allows the policy owner to override the behavior of the rule group within a policy.","Priority":"An integer setting that indicates the order in which to run the stateful rule groups in a single `FirewallPolicy` . This setting only applies to firewall policies that specify the `STRICT_ORDER` rule order in the stateful engine options settings.\\n\\nNetwork Firewall evalutes each stateful rule group against a packet starting with the group that has the lowest priority setting. You must ensure that the priority settings are unique within each policy.\\n\\nYou can change the priority settings of your rule groups at any time. To make it easier to insert rule groups later, number them so there\'s a wide range in between, for example use 100, 200, and so on.","ResourceArn":"The Amazon Resource Name (ARN) of the stateful rule group."}},"AWS::NetworkFirewall::FirewallPolicy.StatelessRuleGroupReference":{"attributes":{},"description":"Identifier for a single stateless rule group, used in a firewall policy to refer to the rule group.","properties":{"Priority":"An integer setting that indicates the order in which to run the stateless rule groups in a single `FirewallPolicy` . Network Firewall applies each stateless rule group to a packet starting with the group that has the lowest priority setting. You must ensure that the priority settings are unique within each policy.","ResourceArn":"The Amazon Resource Name (ARN) of the stateless rule group."}},"AWS::NetworkFirewall::LoggingConfiguration":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the firewall that the logging configuration is associated with. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:network-firewall:us-east-1:012345678901:firewall/myFirewallName\\" }`"},"description":"Use the `LoggingConfiguration` to define the destinations and logging options for an `Firewall` .\\n\\nYou must change the logging configuration by changing one `LogDestinationConfig` setting at a time in your `LogDestinationConfigs` .\\n\\nYou can make only one of the following changes to your `LoggingConfiguration` resource:\\n\\n- Create a new log destination object by adding a single `LogDestinationConfig` array element to `LogDestinationConfigs` .\\n- Delete a log destination object by removing a single `LogDestinationConfig` array element from `LogDestinationConfigs` .\\n- Change the `LogDestination` setting in a single `LogDestinationConfig` array element.\\n\\nYou can\'t change the `LogDestinationType` or `LogType` in a `LogDestinationConfig` . To change these settings, delete the existing `LogDestinationConfig` object and create a new one, in two separate modifications.","properties":{"FirewallArn":"The Amazon Resource Name (ARN) of the `Firewall` that the logging configuration is associated with. You can\'t change the firewall specification after you create the logging configuration.","FirewallName":"The name of the firewall that the logging configuration is associated with. You can\'t change the firewall specification after you create the logging configuration.","LoggingConfiguration":"Defines how AWS Network Firewall performs logging for a `Firewall` ."}},"AWS::NetworkFirewall::LoggingConfiguration.LogDestinationConfig":{"attributes":{},"description":"Defines where AWS Network Firewall sends logs for the firewall for one log type. This is used in `LoggingConfiguration` . You can send each type of log to an Amazon S3 bucket, a CloudWatch log group, or a Kinesis Data Firehose delivery stream.\\n\\nNetwork Firewall generates logs for stateful rule groups. You can save alert and flow log types. The stateful rules engine records flow logs for all network traffic that it receives. It records alert logs for traffic that matches stateful rules that have the rule action set to `DROP` or `ALERT` .","properties":{"LogDestination":"The named location for the logs, provided in a key:value mapping that is specific to the chosen destination type.\\n\\n- For an Amazon S3 bucket, provide the name of the bucket, with key `bucketName` , and optionally provide a prefix, with key `prefix` . The following example specifies an Amazon S3 bucket named `DOC-EXAMPLE-BUCKET` and the prefix `alerts` :\\n\\n`\\"LogDestination\\": { \\"bucketName\\": \\"DOC-EXAMPLE-BUCKET\\", \\"prefix\\": \\"alerts\\" }`\\n- For a CloudWatch log group, provide the name of the CloudWatch log group, with key `logGroup` . The following example specifies a log group named `alert-log-group` :\\n\\n`\\"LogDestination\\": { \\"logGroup\\": \\"alert-log-group\\" }`\\n- For a Kinesis Data Firehose delivery stream, provide the name of the delivery stream, with key `deliveryStream` . The following example specifies a delivery stream named `alert-delivery-stream` :\\n\\n`\\"LogDestination\\": { \\"deliveryStream\\": \\"alert-delivery-stream\\" }`","LogDestinationType":"The type of storage destination to send these logs to. You can send logs to an Amazon S3 bucket, a CloudWatch log group, or a Kinesis Data Firehose delivery stream.","LogType":"The type of log to send. Alert logs report traffic that matches a stateful rule with an action setting that sends an alert log message. Flow logs are standard network traffic flow logs."}},"AWS::NetworkFirewall::LoggingConfiguration.LoggingConfiguration":{"attributes":{},"description":"Defines how AWS Network Firewall performs logging for a `Firewall` .","properties":{"LogDestinationConfigs":"Defines the logging destinations for the logs for a firewall. Network Firewall generates logs for stateful rule groups."}},"AWS::NetworkFirewall::RuleGroup":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the rule group. For example:\\n\\n`{ \\"Ref\\": \\"arn:aws:network-firewall:us-east-1:012345678901:stateful-rulegroup/myStatefulRuleGroupName\\" }`","RuleGroupArn":"The Amazon Resource Name (ARN) of the `RuleGroup` .","RuleGroupId":"The unique ID of the `RuleGroup` resource."},"description":"Use the `RuleGroup` to define a reusable collection of stateless or stateful network traffic filtering rules. You use rule groups in an `FirewallPolicy` to specify the filtering behavior of an `Firewall` .","properties":{"Capacity":"The maximum operating resources that this rule group can use. You can\'t change a rule group\'s capacity setting after you create the rule group. When you update a rule group, you are limited to this capacity. When you reference a rule group from a firewall policy, Network Firewall reserves this capacity for the rule group.","Description":"A description of the rule group.","RuleGroup":"An object that defines the rule group rules.","RuleGroupName":"The descriptive name of the rule group. You can\'t change the name of a rule group after you create it.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","Type":"Indicates whether the rule group is stateless or stateful. If the rule group is stateless, it contains\\nstateless rules. If it is stateful, it contains stateful rules."}},"AWS::NetworkFirewall::RuleGroup.ActionDefinition":{"attributes":{},"description":"A custom action to use in stateless rule actions settings.","properties":{"PublishMetricAction":"Stateless inspection criteria that publishes the specified metrics to Amazon CloudWatch for the matching packet. This setting defines a CloudWatch dimension value to be published.\\n\\nYou can pair this custom action with any of the standard stateless rule actions. For example, you could pair this in a rule action with the standard action that forwards the packet for stateful inspection. Then, when a packet matches the rule, Network Firewall publishes metrics for the packet and forwards it."}},"AWS::NetworkFirewall::RuleGroup.Address":{"attributes":{},"description":"A single IP address specification. This is used in the `RuleGroup.MatchAttributes` source and destination specifications.","properties":{"AddressDefinition":"Specify an IP address or a block of IP addresses in Classless Inter-Domain Routing (CIDR) notation. Network Firewall supports all address ranges for IPv4 and IPv6.\\n\\nExamples:\\n\\n- To configure Network Firewall to inspect for the IP address 192.0.2.44, specify `192.0.2.44/32` .\\n- To configure Network Firewall to inspect for IP addresses from 192.0.2.0 to 192.0.2.255, specify `192.0.2.0/24` .\\n- To configure Network Firewall to inspect for the IP address 1111:0000:0000:0000:0000:0000:0000:0111, specify `1111:0000:0000:0000:0000:0000:0000:0111/128` .\\n- To configure Network Firewall to inspect for IP addresses from 1111:0000:0000:0000:0000:0000:0000:0000 to 1111:0000:0000:0000:ffff:ffff:ffff:ffff, specify `1111:0000:0000:0000:0000:0000:0000:0000/64` .\\n\\nFor more information about CIDR notation, see the Wikipedia entry [Classless Inter-Domain Routing](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) ."}},"AWS::NetworkFirewall::RuleGroup.CustomAction":{"attributes":{},"description":"An optional, non-standard action to use for stateless packet handling. You can define this in addition to the standard action that you must specify.\\n\\nYou define and name the custom actions that you want to be able to use, and then you reference them by name in your actions settings.\\n\\nYou can use custom actions in the following places:\\n\\n- In an `RuleGroup.StatelessRulesAndCustomActions` . The custom actions are available for use by name inside the `StatelessRulesAndCustomActions` where you define them. You can use them for your stateless rule actions to specify what to do with a packet that matches the rule\'s match attributes.\\n- In an `FirewallPolicy` specification, in `StatelessCustomActions` . The custom actions are available for use inside the policy where you define them. You can use them for the policy\'s default stateless actions settings to specify what to do with packets that don\'t match any of the policy\'s stateless rules.","properties":{"ActionDefinition":"The custom action associated with the action name.","ActionName":"The descriptive name of the custom action. You can\'t change the name of a custom action after you create it."}},"AWS::NetworkFirewall::RuleGroup.Dimension":{"attributes":{},"description":"The value to use in an Amazon CloudWatch custom metric dimension. This is used in the `PublishMetrics` custom action. A CloudWatch custom metric dimension is a name/value pair that\'s part of the identity of a metric.\\n\\nAWS Network Firewall sets the dimension name to `CustomAction` and you provide the dimension value.\\n\\nFor more information about CloudWatch custom metric dimensions, see [Publishing Custom Metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html#usingDimensions) in the [Amazon CloudWatch User Guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) .","properties":{"Value":"The value to use in the custom metric dimension."}},"AWS::NetworkFirewall::RuleGroup.Header":{"attributes":{},"description":"The 5-tuple criteria for AWS Network Firewall to use to inspect packet headers in stateful traffic flow inspection. Traffic flows that match the criteria are a match for the corresponding stateful rule.","properties":{"Destination":"The destination IP address or address range to inspect for, in CIDR notation. To match with any address, specify `ANY` .\\n\\nSpecify an IP address or a block of IP addresses in Classless Inter-Domain Routing (CIDR) notation. Network Firewall supports all address ranges for IPv4 and IPv6.\\n\\nExamples:\\n\\n- To configure Network Firewall to inspect for the IP address 192.0.2.44, specify `192.0.2.44/32` .\\n- To configure Network Firewall to inspect for IP addresses from 192.0.2.0 to 192.0.2.255, specify `192.0.2.0/24` .\\n- To configure Network Firewall to inspect for the IP address 1111:0000:0000:0000:0000:0000:0000:0111, specify `1111:0000:0000:0000:0000:0000:0000:0111/128` .\\n- To configure Network Firewall to inspect for IP addresses from 1111:0000:0000:0000:0000:0000:0000:0000 to 1111:0000:0000:0000:ffff:ffff:ffff:ffff, specify `1111:0000:0000:0000:0000:0000:0000:0000/64` .\\n\\nFor more information about CIDR notation, see the Wikipedia entry [Classless Inter-Domain Routing](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) .","DestinationPort":"The destination port to inspect for. You can specify an individual port, for example `1994` and you can specify a port range, for example `1990:1994` . To match with any port, specify `ANY` .","Direction":"The direction of traffic flow to inspect. If set to `ANY` , the inspection matches bidirectional traffic, both from the source to the destination and from the destination to the source. If set to `FORWARD` , the inspection only matches traffic going from the source to the destination.","Protocol":"The protocol to inspect for. To specify all, you can use `IP` , because all traffic on AWS and on the internet is IP.","Source":"The source IP address or address range to inspect for, in CIDR notation. To match with any address, specify `ANY` .\\n\\nSpecify an IP address or a block of IP addresses in Classless Inter-Domain Routing (CIDR) notation. Network Firewall supports all address ranges for IPv4 and IPv6.\\n\\nExamples:\\n\\n- To configure Network Firewall to inspect for the IP address 192.0.2.44, specify `192.0.2.44/32` .\\n- To configure Network Firewall to inspect for IP addresses from 192.0.2.0 to 192.0.2.255, specify `192.0.2.0/24` .\\n- To configure Network Firewall to inspect for the IP address 1111:0000:0000:0000:0000:0000:0000:0111, specify `1111:0000:0000:0000:0000:0000:0000:0111/128` .\\n- To configure Network Firewall to inspect for IP addresses from 1111:0000:0000:0000:0000:0000:0000:0000 to 1111:0000:0000:0000:ffff:ffff:ffff:ffff, specify `1111:0000:0000:0000:0000:0000:0000:0000/64` .\\n\\nFor more information about CIDR notation, see the Wikipedia entry [Classless Inter-Domain Routing](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) .","SourcePort":"The source port to inspect for. You can specify an individual port, for example `1994` and you can specify a port range, for example `1990:1994` . To match with any port, specify `ANY` ."}},"AWS::NetworkFirewall::RuleGroup.IPSet":{"attributes":{},"description":"A list of IP addresses and address ranges, in CIDR notation. This is part of a `RuleGroup.RuleVariables` .","properties":{"Definition":"The list of IP addresses and address ranges, in CIDR notation."}},"AWS::NetworkFirewall::RuleGroup.IPSetReference":{"attributes":{},"description":"Configures one or more `IPSetReferences` for a Suricata-compatible rule group. An IP set reference is a rule variable that references a resource that you create and manage in another AWS service, such as an Amazon VPC prefix list. Network Firewall IP set references enable you to dynamically update the contents of your rules. When you create, update, or delete the IP set you are referencing in your rule, Network Firewall automatically updates the rule\'s content with the changes. For more information about IP set references in Network Firewall , see [Using IP set references](https://docs.aws.amazon.com/network-firewall/latest/developerguide/rule-groups-ip-set-references.html) in the *Network Firewall Developer Guide* .","properties":{"ReferenceArn":"The Amazon Resource Name (ARN) of the resource to include in the `RuleGroup.IPSetReference` ."}},"AWS::NetworkFirewall::RuleGroup.MatchAttributes":{"attributes":{},"description":"Criteria for Network Firewall to use to inspect an individual packet in stateless rule inspection. Each match attributes set can include one or more items such as IP address, CIDR range, port number, protocol, and TCP flags.","properties":{"DestinationPorts":"The destination ports to inspect for. If not specified, this matches with any destination port. This setting is only used for protocols 6 (TCP) and 17 (UDP).\\n\\nYou can specify individual ports, for example `1994` and you can specify port ranges, for example `1990:1994` .","Destinations":"The destination IP addresses and address ranges to inspect for, in CIDR notation. If not specified, this matches with any destination address.","Protocols":"The protocols to inspect for, specified using each protocol\'s assigned internet protocol number (IANA). If not specified, this matches with any protocol.","SourcePorts":"The source ports to inspect for. If not specified, this matches with any source port. This setting is only used for protocols 6 (TCP) and 17 (UDP).\\n\\nYou can specify individual ports, for example `1994` and you can specify port ranges, for example `1990:1994` .","Sources":"The source IP addresses and address ranges to inspect for, in CIDR notation. If not specified, this matches with any source address.","TCPFlags":"The TCP flags and masks to inspect for. If not specified, this matches with any settings. This setting is only used for protocol 6 (TCP)."}},"AWS::NetworkFirewall::RuleGroup.PortRange":{"attributes":{},"description":"A single port range specification. This is used for source and destination port ranges in the stateless `RuleGroup.MatchAttributes` .","properties":{"FromPort":"The lower limit of the port range. This must be less than or equal to the `ToPort` specification.","ToPort":"The upper limit of the port range. This must be greater than or equal to the `FromPort` specification."}},"AWS::NetworkFirewall::RuleGroup.PortSet":{"attributes":{},"description":"A set of port ranges for use in the rules in a rule group.","properties":{"Definition":"The set of port ranges."}},"AWS::NetworkFirewall::RuleGroup.PublishMetricAction":{"attributes":{},"description":"Stateless inspection criteria that publishes the specified metrics to Amazon CloudWatch for the matching packet. This setting defines a CloudWatch dimension value to be published.","properties":{"Dimensions":""}},"AWS::NetworkFirewall::RuleGroup.ReferenceSets":{"attributes":{},"description":"Configures the `ReferenceSets` for a stateful rule group. For more information, see the [Using IP set references in Suricata compatible rule groups](https://docs.aws.amazon.com/network-firewall/latest/developerguide/rule-groups-ip-set-references.html) in the *Network Firewall User Guide* .","properties":{"IPSetReferences":"The IP set references to use in the stateful rule group."}},"AWS::NetworkFirewall::RuleGroup.RuleDefinition":{"attributes":{},"description":"The inspection criteria and action for a single stateless rule. AWS Network Firewall inspects each packet for the specified matching criteria. When a packet matches the criteria, Network Firewall performs the rule\'s actions on the packet.","properties":{"Actions":"The actions to take on a packet that matches one of the stateless rule definition\'s match attributes. You must specify a standard action and you can add custom actions.\\n\\n> Network Firewall only forwards a packet for stateful rule inspection if you specify `aws:forward_to_sfe` for a rule that the packet matches, or if the packet doesn\'t match any stateless rule and you specify `aws:forward_to_sfe` for the `StatelessDefaultActions` setting for the `FirewallPolicy` . \\n\\nFor every rule, you must specify exactly one of the following standard actions.\\n\\n- *aws:pass* - Discontinues all inspection of the packet and permits it to go to its intended destination.\\n- *aws:drop* - Discontinues all inspection of the packet and blocks it from going to its intended destination.\\n- *aws:forward_to_sfe* - Discontinues stateless inspection of the packet and forwards it to the stateful rule engine for inspection.\\n\\nAdditionally, you can specify a custom action. To do this, you define a custom action by name and type, then provide the name you\'ve assigned to the action in this `Actions` setting.\\n\\nTo provide more than one action in this setting, separate the settings with a comma. For example, if you have a publish metrics custom action that you\'ve named `MyMetricsAction` , then you could specify the standard action `aws:pass` combined with the custom action using `[“aws:pass”, “MyMetricsAction”]` .","MatchAttributes":"Criteria for Network Firewall to use to inspect an individual packet in stateless rule inspection. Each match attributes set can include one or more items such as IP address, CIDR range, port number, protocol, and TCP flags."}},"AWS::NetworkFirewall::RuleGroup.RuleGroup":{"attributes":{},"description":"The object that defines the rules in a rule group.\\n\\nAWS Network Firewall uses a rule group to inspect and control network traffic. You define stateless rule groups to inspect individual packets and you define stateful rule groups to inspect packets in the context of their traffic flow.\\n\\nTo use a rule group, you include it by reference in an Network Firewall firewall policy, then you use the policy in a firewall. You can reference a rule group from more than one firewall policy, and you can use a firewall policy in more than one firewall.","properties":{"ReferenceSets":"The reference sets for the stateful rule group.","RuleVariables":"Settings that are available for use in the rules in the rule group. You can only use these for stateful rule groups.","RulesSource":"The stateful rules or stateless rules for the rule group.","StatefulRuleOptions":"Additional options governing how Network Firewall handles stateful rules. The policies where you use your stateful rule group must have stateful rule options settings that are compatible with these settings."}},"AWS::NetworkFirewall::RuleGroup.RuleOption":{"attributes":{},"description":"Additional settings for a stateful rule.","properties":{"Keyword":"The Suricata rule option keywords. For Network Firewall , the keyword signature ID (sid) is required in the format `sid: 112233` . The sid must be unique within the rule group. For information about Suricata rule option keywords, see [Rule options](https://docs.aws.amazon.com/https://suricata.readthedocs.io/en/suricata-6.0.9/rules/intro.html#rule-options) .","Settings":"The Suricata rule option settings. Settings have zero or more values, and the number of possible settings and required settings depends on the keyword. The format for Settings is `number` . For information about Suricata rule option settings, see [Rule options](https://docs.aws.amazon.com/https://suricata.readthedocs.io/en/suricata-6.0.9/rules/intro.html#rule-options) ."}},"AWS::NetworkFirewall::RuleGroup.RuleVariables":{"attributes":{},"description":"Settings that are available for use in the rules in the `RuleGroup` where this is defined.","properties":{"IPSets":"A list of IP addresses and address ranges, in CIDR notation.","PortSets":"A list of port ranges."}},"AWS::NetworkFirewall::RuleGroup.RulesSource":{"attributes":{},"description":"The stateless or stateful rules definitions for use in a single rule group. Each rule group requires a single `RulesSource` . You can use an instance of this for either stateless rules or stateful rules.","properties":{"RulesSourceList":"Stateful inspection criteria for a domain list rule group.","RulesString":"Stateful inspection criteria, provided in Suricata compatible intrusion prevention system (IPS) rules. Suricata is an open-source network IPS that includes a standard rule-based language for network traffic inspection.\\n\\nThese rules contain the inspection criteria and the action to take for traffic that matches the criteria, so this type of rule group doesn\'t have a separate action setting.","StatefulRules":"An array of individual stateful rules inspection criteria to be used together in a stateful rule group. Use this option to specify simple Suricata rules with protocol, source and destination, ports, direction, and rule options. For information about the Suricata `Rules` format, see [Rules Format](https://docs.aws.amazon.com/https://suricata.readthedocs.io/en/suricata-6.0.9/rules/intro.html) .","StatelessRulesAndCustomActions":"Stateless inspection criteria to be used in a stateless rule group."}},"AWS::NetworkFirewall::RuleGroup.RulesSourceList":{"attributes":{},"description":"Stateful inspection criteria for a domain list rule group.\\n\\nFor HTTPS traffic, domain filtering is SNI-based. It uses the server name indicator extension of the TLS handshake.\\n\\nBy default, Network Firewall domain list inspection only includes traffic coming from the VPC where you deploy the firewall. To inspect traffic from IP addresses outside of the deployment VPC, you set the `HOME_NET` rule variable to include the CIDR range of the deployment VPC plus the other CIDR ranges. For more information, see `RuleGroup.RuleVariables` in this guide and [Stateful domain list rule groups in AWS Network Firewall](https://docs.aws.amazon.com/network-firewall/latest/developerguide/stateful-rule-groups-domain-names.html) in the *Network Firewall Developer Guide*","properties":{"GeneratedRulesType":"Whether you want to allow or deny access to the domains in your target list.","TargetTypes":"The types of targets to inspect for. Valid values are `TLS_SNI` and `HTTP_HOST` .","Targets":"The domains that you want to inspect for in your traffic flows. Valid domain specifications are the following:\\n\\n- Explicit names. For example, `abc.example.com` matches only the domain `abc.example.com` .\\n- Names that use a domain wildcard, which you indicate with an initial \' `.` \'. For example, `.example.com` matches `example.com` and matches all subdomains of `example.com` , such as `abc.example.com` and `www.example.com` ."}},"AWS::NetworkFirewall::RuleGroup.StatefulRule":{"attributes":{},"description":"A single Suricata rules specification, for use in a stateful rule group. Use this option to specify a simple Suricata rule with protocol, source and destination, ports, direction, and rule options. For information about the Suricata `Rules` format, see [Rules Format](https://docs.aws.amazon.com/https://suricata.readthedocs.io/en/suricata-6.0.9/rules/intro.html) .","properties":{"Action":"Defines what Network Firewall should do with the packets in a traffic flow when the flow matches the stateful rule criteria. For all actions, Network Firewall performs the specified action and discontinues stateful inspection of the traffic flow.\\n\\nThe actions for a stateful rule are defined as follows:\\n\\n- *PASS* - Permits the packets to go to the intended destination.\\n- *DROP* - Blocks the packets from going to the intended destination and sends an alert log message, if alert logging is configured in the `Firewall` `LoggingConfiguration` .\\n- *REJECT* - Drops traffic that matches the conditions of the stateful rule and sends a TCP reset packet back to sender of the packet. A TCP reset packet is a packet with no payload and a `RST` bit contained in the TCP header flags. `REJECT` is available only for TCP traffic.\\n- *ALERT* - Permits the packets to go to the intended destination and sends an alert log message, if alert logging is configured in the `Firewall` `LoggingConfiguration` .\\n\\nYou can use this action to test a rule that you intend to use to drop traffic. You can enable the rule with `ALERT` action, verify in the logs that the rule is filtering as you want, then change the action to `DROP` .\\n- *REJECT* - Drops TCP traffic that matches the conditions of the stateful rule, and sends a TCP reset packet back to sender of the packet. A TCP reset packet is a packet with no payload and a `RST` bit contained in the TCP header flags. Also sends an alert log mesage if alert logging is configured in the `Firewall` `LoggingConfiguration` .\\n\\n`REJECT` isn\'t currently available for use with IMAP and FTP protocols.","Header":"The stateful inspection criteria for this rule, used to inspect traffic flows.","RuleOptions":"Additional settings for a stateful rule, provided as keywords and settings."}},"AWS::NetworkFirewall::RuleGroup.StatefulRuleOptions":{"attributes":{},"description":"Additional options governing how Network Firewall handles the rule group. You can only use these for stateful rule groups.","properties":{"RuleOrder":"Indicates how to manage the order of the rule evaluation for the rule group. `DEFAULT_ACTION_ORDER` is the default behavior. Stateful rules are provided to the rule engine as Suricata compatible strings, and Suricata evaluates them based on certain settings. For more information, see [Evaluation order for stateful rules](https://docs.aws.amazon.com/network-firewall/latest/developerguide/suricata-rule-evaluation-order.html) in the *AWS Network Firewall Developer Guide* ."}},"AWS::NetworkFirewall::RuleGroup.StatelessRule":{"attributes":{},"description":"A single stateless rule. This is used in `RuleGroup.StatelessRulesAndCustomActions` .","properties":{"Priority":"Indicates the order in which to run this rule relative to all of the rules that are defined for a stateless rule group. Network Firewall evaluates the rules in a rule group starting with the lowest priority setting. You must ensure that the priority settings are unique for the rule group.\\n\\nEach stateless rule group uses exactly one `StatelessRulesAndCustomActions` object, and each `StatelessRulesAndCustomActions` contains exactly one `StatelessRules` object. To ensure unique priority settings for your rule groups, set unique priorities for the stateless rules that you define inside any single `StatelessRules` object.\\n\\nYou can change the priority settings of your rules at any time. To make it easier to insert rules later, number them so there\'s a wide range in between, for example use 100, 200, and so on.","RuleDefinition":"Defines the stateless 5-tuple packet inspection criteria and the action to take on a packet that matches the criteria."}},"AWS::NetworkFirewall::RuleGroup.StatelessRulesAndCustomActions":{"attributes":{},"description":"Stateless inspection criteria. Each stateless rule group uses exactly one of these data types to define its stateless rules.","properties":{"CustomActions":"Defines an array of individual custom action definitions that are available for use by the stateless rules in this `StatelessRulesAndCustomActions` specification. You name each custom action that you define, and then you can use it by name in your stateless rule `RuleGroup.RuleDefinition` `Actions` specification.","StatelessRules":"Defines the set of stateless rules for use in a stateless rule group."}},"AWS::NetworkFirewall::RuleGroup.TCPFlagField":{"attributes":{},"description":"TCP flags and masks to inspect packets for. This is used in the `RuleGroup.MatchAttributes` specification.\\n\\nFor example:\\n\\n`\\"TCPFlags\\": [ { \\"Flags\\": [ \\"ECE\\", \\"SYN\\" ], \\"Masks\\": [ \\"SYN\\", \\"ECE\\" ] } ]`","properties":{"Flags":"Used in conjunction with the `Masks` setting to define the flags that must be set and flags that must not be set in order for the packet to match. This setting can only specify values that are also specified in the `Masks` setting.\\n\\nFor the flags that are specified in the masks setting, the following must be true for the packet to match:\\n\\n- The ones that are set in this flags setting must be set in the packet.\\n- The ones that are not set in this flags setting must also not be set in the packet.","Masks":"The set of flags to consider in the inspection. To inspect all flags in the valid values list, leave this with no setting."}},"AWS::NetworkManager::ConnectAttachment":{"attributes":{"AttachmentId":"The ID of the Connect attachment.","AttachmentPolicyRuleNumber":"The rule number associated with the attachment.","AttachmentType":"The type of attachment. This will be `CONNECT` .","CoreNetworkArn":"The ARN of the core network.","CreatedAt":"The timestamp when the Connect attachment was created.","OwnerAccountId":"The ID of the Connect attachment owner.","Ref":"`Ref` returns the `AttachmentId` . For example, `{ \\"Ref: \\"attachment-02767e74104a33690\\" }` .","ResourceArn":"The resource ARN for the Connect attachment.","SegmentName":"The name of the Connect attachment\'s segment.","State":"The state of the Connect attachment. This can be: `REJECTED` | `PENDING_ATTACHMENT_ACCEPTANCE` | `CREATING` | `FAILED` | `AVAILABLE` | `UPDATING` | `PENDING_NETWORK_UPDATE` | `PENDING_TAG_ACCEPTANCE` | `DELETING` .","UpdatedAt":"The timestamp when the Connect attachment was last updated."},"description":"Creates a core network Connect attachment from a specified core network attachment.\\n\\nA core network Connect attachment is a GRE-based tunnel attachment that you can use to establish a connection between a core network and an appliance. A core network Connect attachment uses an existing VPC attachment as the underlying transport mechanism.","properties":{"CoreNetworkId":"The ID of the core network where the Connect attachment is located.","EdgeLocation":"The Region where the edge is located.","Options":"Options for connecting an attachment.","ProposedSegmentChange":"","Tags":"","TransportAttachmentId":"The ID of the transport attachment."}},"AWS::NetworkManager::ConnectAttachment.ConnectAttachmentOptions":{"attributes":{},"description":"Describes a core network Connect attachment options.","properties":{"Protocol":"The protocol used for the attachment connection."}},"AWS::NetworkManager::ConnectAttachment.ProposedSegmentChange":{"attributes":{},"description":"Describes a proposed segment change. In some cases, the segment change must first be evaluated and accepted.","properties":{"AttachmentPolicyRuleNumber":"The rule number in the policy document that applies to this change.","SegmentName":"The name of the segment to change.","Tags":"The list of key-value tags that changed for the segment."}},"AWS::NetworkManager::ConnectPeer":{"attributes":{"Configuration":"","Configuration.BgpConfigurations":"","Configuration.CoreNetworkAddress":"","Configuration.InsideCidrBlocks":"","Configuration.PeerAddress":"","Configuration.Protocol":"","ConnectPeerId":"The ID of the Connect peer.","CoreNetworkId":"The core network ID.","CreatedAt":"The timestamp when the Connect peer was created.","EdgeLocation":"The Region where the edge is located.","Ref":"`Ref` returns the `ConnectPeerId` . For example, `{ \\"Ref: \\"connect-peer--041e25dbc928d7e61\\" }` .","State":"The state of the Connect peer. This will be: `REJECTED` | `PENDING_ATTACHMENT_ACCEPTANCE` | `CREATING` | `FAILED` | `AVAILABLE` | `UPDATING` | `PENDING_NETWORK_UPDATE` | `PENDING_TAG_ACCEPTANCE` | `DELETING` ."},"description":"Creates a core network Connect peer for a specified core network connect attachment between a core network and an appliance. The peer address and transit gateway address must be the same IP address family (IPv4 or IPv6).","properties":{"BgpOptions":"","ConnectAttachmentId":"The ID of the attachment to connect.","CoreNetworkAddress":"The IP address of a core network.","InsideCidrBlocks":"The inside IP addresses used for a Connect peer configuration.","PeerAddress":"The IP address of the Connect peer.","Tags":"The list of key-value tags associated with the Connect peer."}},"AWS::NetworkManager::ConnectPeer.BgpOptions":{"attributes":{},"description":"Describes the BGP options.","properties":{"PeerAsn":"The Peer ASN of the BGP."}},"AWS::NetworkManager::ConnectPeer.ConnectPeerBgpConfiguration":{"attributes":{},"description":"Describes a core network BGP configuration.","properties":{"CoreNetworkAddress":"The address of a core network.","CoreNetworkAsn":"The ASN of the Coret Network.","PeerAddress":"The address of a core network Connect peer.","PeerAsn":"The ASN of the Connect peer."}},"AWS::NetworkManager::ConnectPeer.ConnectPeerConfiguration":{"attributes":{},"description":"Describes a core network Connect peer configuration.","properties":{"BgpConfigurations":"The Connect peer BGP configurations.","CoreNetworkAddress":"The IP address of a core network.","InsideCidrBlocks":"The inside IP addresses used for a Connect peer configuration.","PeerAddress":"The IP address of the Connect peer.","Protocol":"The protocol used for a Connect peer configuration."}},"AWS::NetworkManager::CoreNetwork":{"attributes":{"CoreNetworkArn":"The ARN of the core network.","CoreNetworkId":"The ID of the core network.","CreatedAt":"The timestamp when the core network was created.","Edges":"The edges.","OwnerAccount":"","Ref":"`Ref` returns the ID of the core network. For example, `{ \\"Ref: \\"core-network-060ea2740fe60fd38\\" }` .","Segments":"The segments.","State":"The current state of the core network. These states are: `CREATING` | `UPDATING` | `AVAILABLE` | `DELETING` ."},"description":"Describes a core network.","properties":{"Description":"The description of a core network.","GlobalNetworkId":"The ID of the global network that your core network is a part of.","PolicyDocument":"Describes a core network policy. For more information, see [Core network policies](https://docs.aws.amazon.com/network-manager/latest/cloudwan/cloudwan-policy-change-sets.html) .\\n\\nIf you update the policy document, CloudFormation will apply the core network change set generated from the updated policy document, and then set it as the LIVE policy.","Tags":"The list of key-value tags associated with a core network."}},"AWS::NetworkManager::CoreNetwork.CoreNetworkEdge":{"attributes":{},"description":"Describes a core network edge.","properties":{"Asn":"The ASN of a core network edge.","EdgeLocation":"The Region where a core network edge is located.","InsideCidrBlocks":"The inside IP addresses used for core network edges."}},"AWS::NetworkManager::CoreNetwork.CoreNetworkSegment":{"attributes":{},"description":"Describes a core network segment, which are dedicated routes. Only attachments within this segment can communicate with each other.","properties":{"EdgeLocations":"The Regions where the edges are located.","Name":"The name of a core network segment.","SharedSegments":"The shared segments of a core network."}},"AWS::NetworkManager::CustomerGatewayAssociation":{"attributes":{"Ref":"`Ref` returns the ID of the global network and the Amazon Resource Name (ARN) of the customer gateway. For example: `global-network-01231231231231231|arn:aws:ec2:eu-central-1:123456789012:customer-gateway/cgw-00112233aabbcc112` ."},"description":"Specifies an association between a customer gateway, a device, and optionally, a link. If you specify a link, it must be associated with the specified device. The customer gateway must be connected to a VPN attachment on a transit gateway that\'s registered in your global network.\\n\\nYou cannot associate a customer gateway with more than one device and link.","properties":{"CustomerGatewayArn":"The Amazon Resource Name (ARN) of the customer gateway.","DeviceId":"The ID of the device.","GlobalNetworkId":"The ID of the global network.","LinkId":"The ID of the link."}},"AWS::NetworkManager::Device":{"attributes":{"CreatedAt":"","DeviceArn":"The ARN of the device. For example, `arn:aws:networkmanager::123456789012:device/global-network-01231231231231231/device-07f6fd08867abc123` .","DeviceId":"The ID of the device. For example, `device-07f6fd08867abc123` .","Ref":"`Ref` returns the IDs of the global network and device. For example: `global-network-01231231231231231|device-07f6fd08867abc123` ."},"description":"Specifies a device.","properties":{"AWSLocation":"","Description":"A description of the device.\\n\\nConstraints: Maximum length of 256 characters.","GlobalNetworkId":"The ID of the global network.","Location":"The site location.","Model":"The model of the device.\\n\\nConstraints: Maximum length of 128 characters.","SerialNumber":"The serial number of the device.\\n\\nConstraints: Maximum length of 128 characters.","SiteId":"The site ID.","Tags":"The tags for the device.","Type":"The device type.","Vendor":"The vendor of the device.\\n\\nConstraints: Maximum length of 128 characters."}},"AWS::NetworkManager::Device.AWSLocation":{"attributes":{},"description":"","properties":{"SubnetArn":"","Zone":""}},"AWS::NetworkManager::Device.Location":{"attributes":{},"description":"Describes a location.","properties":{"Address":"The physical address.","Latitude":"The latitude.","Longitude":"The longitude."}},"AWS::NetworkManager::GlobalNetwork":{"attributes":{"Arn":"The ARN of the global network. For example, `arn:aws:networkmanager::123456789012:global-network/global-network-01231231231231231` .","Id":"The ID of the global network. For example, `global-network-01231231231231231` .","Ref":"`Ref` returns the ID of the global network. For example: `global-network-01231231231231231` ."},"description":"Creates a new, empty global network.","properties":{"Description":"A description of the global network.\\n\\nConstraints: Maximum length of 256 characters.","Tags":"The tags for the global network."}},"AWS::NetworkManager::Link":{"attributes":{"LinkArn":"The ARN of the link. For example, `arn:aws:networkmanager::123456789012:link/global-network-01231231231231231/link-11112222aaaabbbb1` .","LinkId":"The ID of the link. For example, `link-11112222aaaabbbb1` .","Ref":"`Ref` returns the IDs of the global network and link. For example: `global-network-01231231231231231|link-11112222aaaabbbb1` ."},"description":"Specifies a link for a site.","properties":{"Bandwidth":"The bandwidth for the link.","Description":"A description of the link.\\n\\nConstraints: Maximum length of 256 characters.","GlobalNetworkId":"The ID of the global network.","Provider":"The provider of the link.\\n\\nConstraints: Maximum length of 128 characters. Cannot include the following characters: | \\\\ ^","SiteId":"The ID of the site.","Tags":"The tags for the link.","Type":"The type of the link.\\n\\nConstraints: Maximum length of 128 characters. Cannot include the following characters: | \\\\ ^"}},"AWS::NetworkManager::Link.Bandwidth":{"attributes":{},"description":"Describes bandwidth information.","properties":{"DownloadSpeed":"Download speed in Mbps.","UploadSpeed":"Upload speed in Mbps."}},"AWS::NetworkManager::LinkAssociation":{"attributes":{"Ref":"`Ref` returns the IDs of the global network, device, and link. For example: `global-network-01231231231231231|device-07f6fd08867abc123|link-11112222aaaabbbb1` ."},"description":"Describes the association between a device and a link.","properties":{"DeviceId":"The device ID for the link association.","GlobalNetworkId":"The ID of the global network.","LinkId":"The ID of the link."}},"AWS::NetworkManager::Site":{"attributes":{"Ref":"`Ref` returns the IDs of the global network and the site. For example: `global-network-01231231231231231|site-444555aaabbb11223` .","SiteArn":"The ARN of the site. For example, `arn:aws:networkmanager::123456789012:site/global-network-01231231231231231/site-444555aaabbb11223` .","SiteId":"The ID of the site. For example, `site-444555aaabbb11223` ."},"description":"Creates a new site in a global network.","properties":{"Description":"A description of your site.\\n\\nConstraints: Maximum length of 256 characters.","GlobalNetworkId":"The ID of the global network.","Location":"The site location. This information is used for visualization in the Network Manager console. If you specify the address, the latitude and longitude are automatically calculated.\\n\\n- `Address` : The physical address of the site.\\n- `Latitude` : The latitude of the site.\\n- `Longitude` : The longitude of the site.","Tags":"The tags for the site."}},"AWS::NetworkManager::Site.Location":{"attributes":{},"description":"Describes a location.","properties":{"Address":"The physical address.","Latitude":"The latitude.","Longitude":"The longitude."}},"AWS::NetworkManager::SiteToSiteVpnAttachment":{"attributes":{"AttachmentId":"The ID of the site-to-site VPN attachment.","AttachmentPolicyRuleNumber":"The policy rule number associated with the attachment.","AttachmentType":"The type of attachment. This will be `SITE_TO_SITE_VPN` .","CoreNetworkArn":"The ARN of the core network.","CreatedAt":"The timestamp when the site-to-site VPN attachment was created.","EdgeLocation":"The Region where the core network edge is located.","OwnerAccountId":"The ID of the site-to-site VPN attachment owner.","Ref":"`Ref` returns the `AttachmentId` . For example, `{ \\"Ref: \\"attachment-05467e74104d33861\\" }` .","ResourceArn":"The resource ARN for the site-to-site VPN attachment.","SegmentName":"The name of the site-to-site VPN attachment\'s segment.","State":"The state of the site-to-site VPN attachment. This can be: `REJECTED` | `PENDING_ATTACHMENT_ACCEPTANCE` | `CREATING` | `FAILED` | `AVAILABLE` | `UPDATING` | `PENDING_NETWORK_UPDATE` | `PENDING_TAG_ACCEPTANCE` | `DELETING` .","UpdatedAt":"The timestamp when the site-to-site VPN attachment was last updated."},"description":"Creates an Amazon Web Services site-to-site VPN attachment on an edge location of a core network.","properties":{"CoreNetworkId":"","ProposedSegmentChange":"","Tags":"","VpnConnectionArn":"The ARN of the site-to-site VPN attachment."}},"AWS::NetworkManager::SiteToSiteVpnAttachment.ProposedSegmentChange":{"attributes":{},"description":"Describes a proposed segment change. In some cases, the segment change must first be evaluated and accepted.","properties":{"AttachmentPolicyRuleNumber":"The rule number in the policy document that applies to this change.","SegmentName":"The name of the segment to change.","Tags":"The list of key-value tags that changed for the segment."}},"AWS::NetworkManager::TransitGatewayPeering":{"attributes":{"CoreNetworkArn":"The ARN of the core network.","CreatedAt":"The timestamp when the core network peering was created.","EdgeLocation":"The edge location for the peer.","OwnerAccountId":"The ID of the account owner.","PeeringId":"The ID of the peering.","PeeringType":"The peering type. This will be `TRANSIT_GATEWAY` .","Ref":"`Ref` returns the `peeringId` . For example: `peering-01234ab1234a12a12` .","ResourceArn":"The ARN of the resource peered to a core network.","State":"The current state of the peer. This can be `CREATING` | `FAILED` | `AVAILABLE` | `DELETING` .","TransitGatewayPeeringAttachmentId":"The ID of the peering attachment."},"description":"Creates a transit gateway peering connection.","properties":{"CoreNetworkId":"The ID of the core network.","Tags":"The list of key-value tags associated with the peering.","TransitGatewayArn":"The ARN of the transit gateway."}},"AWS::NetworkManager::TransitGatewayRegistration":{"attributes":{"Ref":"`Ref` returns the ID of the global network and the ARN of the transit gateway. For example: `global-network-01231231231231231|arn:aws:ec2:us-west-2:123456789012:transit-gateway/tgw-123abc05e04123abc` ."},"description":"Registers a transit gateway in your global network. Not all Regions support transit gateways for global networks. For a list of the supported Regions, see [Region Availability](https://docs.aws.amazon.com/network-manager/latest/tgwnm/what-are-global-networks.html#nm-available-regions) in the *AWS Transit Gateways for Global Networks User Guide* . The transit gateway can be in any of the supported AWS Regions, but it must be owned by the same AWS account that owns the global network. You cannot register a transit gateway in more than one global network.","properties":{"GlobalNetworkId":"The ID of the global network.","TransitGatewayArn":"The Amazon Resource Name (ARN) of the transit gateway."}},"AWS::NetworkManager::TransitGatewayRouteTableAttachment":{"attributes":{"AttachmentId":"The ID of the transit gateway route table attachment.","AttachmentPolicyRuleNumber":"The policy rule number associated with the attachment.","AttachmentType":"The type of attachment. This will be `TRANSIT_GATEWAY_ROUTE_TABLE` .","CoreNetworkArn":"The ARN of the core network.","CoreNetworkId":"The ID of the core network.","CreatedAt":"The timestamp when the transit gateway route table attachment was created.","EdgeLocation":"The Region where the core network edge is located.","OwnerAccountId":"The ID of the transit gateway route table attachment owner.","Ref":"`Ref` returns the attachment ID of the transit gateway route table. For example: `attachment-12367e74104d31234` .","ResourceArn":"The resource ARN for the transit gateway route table attachment.","SegmentName":"The name of the attachment\'s segment.","State":"The state of the attachment. This can be: `REJECTED` | `PENDING_ATTACHMENT_ACCEPTANCE` | `CREATING` | `FAILED` | `AVAILABLE` | `UPDATING` | `PENDING_NETWORK_UPDATE` | `PENDING_TAG_ACCEPTANCE` | `DELETING` .","UpdatedAt":"The timestamp when the transit gateway route table attachment was last updated."},"description":"Creates a transit gateway route table attachment.","properties":{"PeeringId":"The ID of the transit gateway peering.","ProposedSegmentChange":"This property is read-only. Values can\'t be assigned to it.","Tags":"The list of key-value pairs associated with the transit gateway route table attachment.","TransitGatewayRouteTableArn":"The ARN of the transit gateway attachment route table. For example, `\\"TransitGatewayRouteTableArn\\": \\"arn:aws:ec2:us-west-2:123456789012:transit-gateway-route-table/tgw-rtb-9876543210123456\\"` ."}},"AWS::NetworkManager::TransitGatewayRouteTableAttachment.ProposedSegmentChange":{"attributes":{},"description":"Describes a proposed segment change. In some cases, the segment change must first be evaluated and accepted.","properties":{"AttachmentPolicyRuleNumber":"The rule number in the policy document that applies to this change.","SegmentName":"The name of the segment to change.","Tags":"The list of key-value tags that changed for the segment."}},"AWS::NetworkManager::VpcAttachment":{"attributes":{"AttachmentId":"The ID of the VPC attachment.","AttachmentPolicyRuleNumber":"The policy rule number associated with the attachment.","AttachmentType":"The type of attachment. This will be `VPC` .","CoreNetworkArn":"The ARN of the core network.","CreatedAt":"The timestamp when the VPC attachment was created.","EdgeLocation":"The Region where the core network edge is located.","OwnerAccountId":"The ID of the VPC attachment owner.","Ref":"`Ref` returns the `AttachmentId` . For example, `{ \\"Ref: \\"attachment-00067e74104d33769\\" }` .","ResourceArn":"The resource ARN for the VPC attachment.","SegmentName":"The name of the attachment\'s segment.","State":"The state of the attachment. This can be: `REJECTED` | `PENDING_ATTACHMENT_ACCEPTANCE` | `CREATING` | `FAILED` | `AVAILABLE` | `UPDATING` | `PENDING_NETWORK_UPDATE` | `PENDING_TAG_ACCEPTANCE` | `DELETING` .","UpdatedAt":"The timestamp when the VPC attachment was last updated."},"description":"Creates a VPC attachment on an edge location of a core network.","properties":{"CoreNetworkId":"The core network ID.","Options":"Options for creating the VPC attachment.","ProposedSegmentChange":"","SubnetArns":"The subnet ARNs.","Tags":"The tags associated with the VPC attachment.","VpcArn":"The ARN of the VPC attachment."}},"AWS::NetworkManager::VpcAttachment.ProposedSegmentChange":{"attributes":{},"description":"Describes a proposed segment change. In some cases, the segment change must first be evaluated and accepted.","properties":{"AttachmentPolicyRuleNumber":"The rule number in the policy document that applies to this change.","SegmentName":"The name of the segment to change.","Tags":"The list of key-value tags that changed for the segment."}},"AWS::NetworkManager::VpcAttachment.VpcOptions":{"attributes":{},"description":"Describes the VPC options.","properties":{"ApplianceModeSupport":"Indicates whether appliance mode is supported. If enabled, traffic flow between a source and destination use the same Availability Zone for the VPC attachment for the lifetime of that flow. The default value is `false` .","Ipv6Support":"Indicates whether IPv6 is supported."}},"AWS::NimbleStudio::LaunchProfile":{"attributes":{"LaunchProfileId":"The unique identifier for the launch profile resource."},"description":"The `AWS::NimbleStudio::LaunchProfile` resource represents access permissions for a set of studio components, including types of workstations, render farms, and shared file systems. Launch profiles are shared with studio users to give them access to the set of studio components.","properties":{"Description":"A human-readable description of the launch profile.","Ec2SubnetIds":"Unique identifiers for a collection of EC2 subnets.","LaunchProfileProtocolVersions":"The version number of the protocol that is used by the launch profile. The only valid version is \\"2021-03-31\\".","Name":"A friendly name for the launch profile.","StreamConfiguration":"A configuration for a streaming session.","StudioComponentIds":"Unique identifiers for a collection of studio components that can be used with this launch profile.","StudioId":"The unique identifier for a studio resource. In Nimble Studio , all other resources are contained in a studio resource.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::NimbleStudio::LaunchProfile.StreamConfiguration":{"attributes":{},"description":"A configuration for a streaming session.","properties":{"AutomaticTerminationMode":"","ClipboardMode":"Allows or deactivates the use of the system clipboard to copy and paste between the streaming session and streaming client.","Ec2InstanceTypes":"The EC2 instance types that users can select from when launching a streaming session with this launch profile.","MaxSessionLengthInMinutes":"The length of time, in minutes, that a streaming session can be active before it is stopped or terminated. After this point, Nimble Studio automatically terminates or stops the session. The default length of time is 690 minutes, and the maximum length of time is 30 days.","MaxStoppedSessionLengthInMinutes":"Integer that determines if you can start and stop your sessions and how long a session can stay in the `STOPPED` state. The default value is 0. The maximum value is 5760.\\n\\nThis field is allowed only when `sessionPersistenceMode` is `ACTIVATED` and `automaticTerminationMode` is `ACTIVATED` .\\n\\nIf the value is set to 0, your sessions can’t be `STOPPED` . If you then call `StopStreamingSession` , the session fails. If the time that a session stays in the `READY` state exceeds the `maxSessionLengthInMinutes` value, the session will automatically be terminated (instead of `STOPPED` ).\\n\\nIf the value is set to a positive number, the session can be stopped. You can call `StopStreamingSession` to stop sessions in the `READY` state. If the time that a session stays in the `READY` state exceeds the `maxSessionLengthInMinutes` value, the session will automatically be stopped (instead of terminated).","SessionBackup":"","SessionPersistenceMode":"","SessionStorage":"The upload storage for a streaming session.","StreamingImageIds":"The streaming images that users can select from when launching a streaming session with this launch profile.","VolumeConfiguration":""}},"AWS::NimbleStudio::LaunchProfile.StreamConfigurationSessionBackup":{"attributes":{},"description":"","properties":{"MaxBackupsToRetain":"","Mode":""}},"AWS::NimbleStudio::LaunchProfile.StreamConfigurationSessionStorage":{"attributes":{},"description":"The configuration for a streaming session’s upload storage.","properties":{"Mode":"Allows artists to upload files to their workstations. The only valid option is `UPLOAD` .","Root":"The configuration for the upload storage root of the streaming session."}},"AWS::NimbleStudio::LaunchProfile.StreamingSessionStorageRoot":{"attributes":{},"description":"The upload storage root location (folder) on streaming workstations where files are uploaded.","properties":{"Linux":"The folder path in Linux workstations where files are uploaded.","Windows":"The folder path in Windows workstations where files are uploaded."}},"AWS::NimbleStudio::LaunchProfile.VolumeConfiguration":{"attributes":{},"description":"","properties":{"Iops":"","Size":"","Throughput":""}},"AWS::NimbleStudio::StreamingImage":{"attributes":{"EncryptionConfiguration":"","EncryptionConfiguration.KeyArn":"","EncryptionConfiguration.KeyType":"","EulaIds":"The list of IDs of EULAs that must be accepted before a streaming session can be started using this streaming image.","Owner":"The owner of the streaming image, either the studioId that contains the streaming image or \'amazon\' for images that are provided by .","Platform":"The platform of the streaming image, either WINDOWS or LINUX.","StreamingImageId":"The unique identifier for the streaming image resource."},"description":"The `AWS::NimbleStudio::StreamingImage` resource creates a streaming image in a studio. A streaming image defines the operating system and software to be used in an streaming session.","properties":{"Description":"A human-readable description of the streaming image.","Ec2ImageId":"The ID of an EC2 machine image with which to create the streaming image.","Name":"A friendly name for a streaming image resource.","StudioId":"The unique identifier for a studio resource. In Nimble Studio , all other resources are contained in a studio resource.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::NimbleStudio::StreamingImage.StreamingImageEncryptionConfiguration":{"attributes":{},"description":"","properties":{"KeyArn":"","KeyType":""}},"AWS::NimbleStudio::Studio":{"attributes":{"HomeRegion":"The AWS Region where the studio resource is located. For example, `us-west-2` .","SsoClientId":"The IAM Identity Center application client ID that is used to integrate with IAM Identity Center , which enables IAM Identity Center users to log into the portal.","StudioId":"The unique identifier for the studio resource.","StudioUrl":"The unique identifier for the studio resource."},"description":"The `AWS::NimbleStudio::Studio` resource creates a new studio resource. In , all other resources are contained in a studio.\\n\\nWhen creating a studio, two IAM roles must be provided: the admin role and the user role. These roles are assumed by your users when they log in to the portal. The user role must have the AmazonNimbleStudio-StudioUser managed policy attached for the portal to function properly. The Admin Role must have the AmazonNimbleStudio-StudioAdmin managed policy attached for the portal to function properly.\\n\\nYou can optionally specify an AWS Key Management Service key in the StudioEncryptionConfiguration. In Nimble Studio, resource names, descriptions, initialization scripts, and other data you provide are always encrypted at rest using an AWS Key Management Service key. By default, this key is owned by AWS and managed on your behalf. You may provide your own AWS Key Management Service key when calling CreateStudio to encrypt this data using a key that you own and manage. When providing an AWS Key Management Service key during studio creation, creates AWS Key Management Service grants in your account to provide your studio user and admin roles access to these AWS Key Management Service keys. If you delete this grant, the studio will no longer be accessible to your portal users. If you delete the studio AWS Key Management Service key, your studio will no longer be accessible.","properties":{"AdminRoleArn":"The IAM role that studio admins assume when logging in to the Nimble Studio portal.","DisplayName":"A friendly name for the studio.","StudioEncryptionConfiguration":"Configuration of the encryption method that is used for the studio.","StudioName":"The name of the studio, as included in the URL when accessing it in the Nimble Studio portal.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","UserRoleArn":"The IAM role that studio users assume when logging in to the Nimble Studio portal."}},"AWS::NimbleStudio::Studio.StudioEncryptionConfiguration":{"attributes":{},"description":"Configuration of the encryption method that is used for the studio.","properties":{"KeyArn":"The ARN for a KMS key that is used to encrypt studio data.","KeyType":"The type of KMS key that is used to encrypt studio data."}},"AWS::NimbleStudio::StudioComponent":{"attributes":{"StudioComponentId":"The unique identifier for the studio component resource."},"description":"The `AWS::NimbleStudio::StudioComponent` resource represents a network resource that is used by a studio\'s users and workflows. A typical studio contains studio components for the following: a render farm, an Active Directory, a licensing service, and a shared file system.\\n\\nAccess to a studio component is managed by specifying security groups for the resource, as well as its endpoint.\\n\\nA studio component also has a set of initialization scripts, which are returned by `GetLaunchProfileInitialization` . These initialization scripts run on streaming sessions when they start. They provide users with flexibility in controlling how studio resources are configured on a streaming session.","properties":{"Configuration":"The configuration of the studio component, based on component type.","Description":"A human-readable description for the studio component resource.","Ec2SecurityGroupIds":"The EC2 security groups that control access to the studio component.","InitializationScripts":"Initialization scripts for studio components.","Name":"A friendly name for the studio component resource.","ScriptParameters":"Parameters for the studio component scripts.","StudioId":"The unique identifier for a studio resource. In Nimble Studio , all other resources are contained in a studio resource.","Subtype":"The specific subtype of a studio component.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","Type":"The type of the studio component."}},"AWS::NimbleStudio::StudioComponent.ActiveDirectoryComputerAttribute":{"attributes":{},"description":"An LDAP attribute of an Active Directory computer account, in the form of a name:value pair.","properties":{"Name":"The name for the LDAP attribute.","Value":"The value for the LDAP attribute."}},"AWS::NimbleStudio::StudioComponent.ActiveDirectoryConfiguration":{"attributes":{},"description":"The configuration for a AWS Directory Service for Microsoft Active Directory studio resource.","properties":{"ComputerAttributes":"A collection of custom attributes for an Active Directory computer.","DirectoryId":"The directory ID of the AWS Directory Service for Microsoft Active Directory to access using this studio component.","OrganizationalUnitDistinguishedName":"The distinguished name (DN) and organizational unit (OU) of an Active Directory computer."}},"AWS::NimbleStudio::StudioComponent.ComputeFarmConfiguration":{"attributes":{},"description":"The configuration for a render farm that is associated with a studio resource.","properties":{"ActiveDirectoryUser":"The name of an Active Directory user that is used on ComputeFarm worker instances.","Endpoint":"The endpoint of the ComputeFarm that is accessed by the studio component resource."}},"AWS::NimbleStudio::StudioComponent.LicenseServiceConfiguration":{"attributes":{},"description":"The configuration for a license service that is associated with a studio resource.","properties":{"Endpoint":"The endpoint of the license service that is accessed by the studio component resource."}},"AWS::NimbleStudio::StudioComponent.ScriptParameterKeyValue":{"attributes":{},"description":"A parameter for a studio component script, in the form of a key-value pair.","properties":{"Key":"A script parameter key.","Value":"A script parameter value."}},"AWS::NimbleStudio::StudioComponent.SharedFileSystemConfiguration":{"attributes":{},"description":"The configuration for a shared file storage system that is associated with a studio resource.","properties":{"Endpoint":"The endpoint of the shared file system that is accessed by the studio component resource.","FileSystemId":"The unique identifier for a file system.","LinuxMountPoint":"The mount location for a shared file system on a Linux virtual workstation.","ShareName":"The name of the file share.","WindowsMountDrive":"The mount location for a shared file system on a Windows virtual workstation."}},"AWS::NimbleStudio::StudioComponent.StudioComponentConfiguration":{"attributes":{},"description":"The configuration of the studio component, based on component type.","properties":{"ActiveDirectoryConfiguration":"The configuration for a AWS Directory Service for Microsoft Active Directory studio resource.","ComputeFarmConfiguration":"The configuration for a render farm that is associated with a studio resource.","LicenseServiceConfiguration":"The configuration for a license service that is associated with a studio resource.","SharedFileSystemConfiguration":"The configuration for a shared file storage system that is associated with a studio resource."}},"AWS::NimbleStudio::StudioComponent.StudioComponentInitializationScript":{"attributes":{},"description":"Initialization scripts for studio components.","properties":{"LaunchProfileProtocolVersion":"The version number of the protocol that is used by the launch profile. The only valid version is \\"2021-03-31\\".","Platform":"The platform of the initialization script, either Windows or Linux.","RunContext":"The method to use when running the initialization script.","Script":"The initialization script."}},"AWS::OSIS::Pipeline":{"attributes":{"IngestEndpointUrls":"A list of the ingestion endpoints for the pipeline that you can send data to. Currently, only a single ingestion endpoint is supported for a pipeline. For example, `my-pipeline-123456789012.us-east-1.osis.amazonaws.com` .","PipelineArn":"The Amazon Resource Name (ARN) of the pipeline.","Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, Ref returns the resource name, such as `mystack-abc1d2efg3h4` . For more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) .","VpcEndpoints":"The VPC interface endpoints that have access to the pipeline."},"description":"The AWS::OSIS::Pipeline resource creates an Amazon OpenSearch Ingestion pipeline.","properties":{"LogPublishingOptions":"Key-value pairs that represent log publishing settings.","MaxUnits":"The maximum pipeline capacity, in Ingestion Compute Units (ICUs).","MinUnits":"The minimum pipeline capacity, in Ingestion Compute Units (ICUs).","PipelineConfigurationBody":"The Data Prepper pipeline configuration in YAML format.","PipelineName":"The name of the pipeline.","Tags":"List of tags to add to the pipeline upon creation.","VpcOptions":"Options that specify the subnets and security groups for an OpenSearch Ingestion VPC endpoint."}},"AWS::OSIS::Pipeline.CloudWatchLogDestination":{"attributes":{},"description":"","properties":{"LogGroup":""}},"AWS::OSIS::Pipeline.LogPublishingOptions":{"attributes":{},"description":"Container for the values required to configure logging for the pipeline. If you don\'t specify these values, OpenSearch Ingestion will not publish logs from your application to CloudWatch Logs.","properties":{"CloudWatchLogDestination":"The destination for OpenSearch Ingestion logs sent to Amazon CloudWatch Logs. This parameter is required if `IsLoggingEnabled` is set to `true` .","IsLoggingEnabled":"Whether logs should be published."}},"AWS::OSIS::Pipeline.VpcEndpoint":{"attributes":{},"description":"An OpenSearch Ingestion-managed VPC endpoint that will access one or more pipelines.","properties":{"VpcEndpointId":"The unique identifier of the endpoint.","VpcId":"The ID for your VPC. AWS PrivateLink generates this value when you create a VPC.","VpcOptions":"Information about the VPC, including associated subnets and security groups."}},"AWS::OSIS::Pipeline.VpcOptions":{"attributes":{},"description":"Options that specify the subnets and security groups for an OpenSearch Ingestion VPC endpoint.","properties":{"SecurityGroupIds":"A list of security groups associated with the VPC endpoint.","SubnetIds":"A list of subnet IDs associated with the VPC endpoint."}},"AWS::Oam::Link":{"attributes":{"Arn":"The ARN of the link. For example, `arn:aws:oam:us-west-1:111111111111:link:abcd1234-a123-456a-a12b-a123b456c789`","Label":"The friendly human-readable name used to identify this source account when it is viewed from the monitoring account. For example, `my-account1` .","Ref":"`Ref` returns the ARN of the link. For example, `arn:aws:oam:us-west-1:111111111111:link:abcd1234-a123-456a-a12b-a123b456c789` ."},"description":"Creates a link between a source account and a sink that you have created in a monitoring account.\\n\\nBefore you create a link, you must create a sink in the monitoring account. The sink must have a sink policy that permits the source account to link to it. You can grant permission to source accounts by granting permission to an entire organization, an organizational unit, or to individual accounts.\\n\\nFor more information, see [CreateSink](https://docs.aws.amazon.com/OAM/latest/APIReference/API_CreateSink.html) and [PutSinkPolicy](https://docs.aws.amazon.com/OAM/latest/APIReference/API_PutSinkPolicy.html) .\\n\\nEach monitoring account can be linked to as many as 100,000 source accounts.\\n\\nEach source account can be linked to as many as five monitoring accounts.","properties":{"LabelTemplate":"Specify a friendly human-readable name to use to identify this source account when you are viewing data from it in the monitoring account.\\n\\nYou can include the following variables in your template:\\n\\n- `$AccountName` is the name of the account\\n- `$AccountEmail` is a globally-unique email address, which includes the email domain, such as `mariagarcia@example.com`\\n- `$AccountEmailNoDomain` is an email address without the domain name, such as `mariagarcia`","ResourceTypes":"An array of strings that define which types of data that the source account shares with the monitoring account. Valid values are `AWS::CloudWatch::Metric | AWS::Logs::LogGroup | AWS::XRay::Trace` .","SinkIdentifier":"The ARN of the sink in the monitoring account that you want to link to. You can use [ListSinks](https://docs.aws.amazon.com/OAM/latest/APIReference/API_ListSinks.html) to find the ARNs of sinks.","Tags":"An array of key-value pairs to apply to the link.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::Oam::Sink":{"attributes":{"Arn":"The ARN of the sink. For example, `arn:aws:oam:us-west-1:111111111111:sink:abcd1234-a123-456a-a12b-a123b456c789`","Ref":"`Ref` returns the ARN of the link. For example, `arn:aws:oam:us-west-1:111111111111:link:abcd1234-a123-456a-a12b-a123b456c789` ."},"description":"Creates or updates a *sink* in the current account, so that it can be used as a monitoring account in CloudWatch cross-account observability. A sink is a resource that represents an attachment point in a monitoring account, which source accounts can link to to be able to send observability data.\\n\\nAfter you create a sink, you must create a sink policy that allows source accounts to attach to it. For more information, see [PutSinkPolicy](https://docs.aws.amazon.com/OAM/latest/APIReference/API_PutSinkPolicy.html) .\\n\\nAn account can have one sink.","properties":{"Name":"A name for the sink.","Policy":"The IAM policy that grants permissions to source accounts to link to this sink. The policy can grant permission in the following ways:\\n\\n- Include organization IDs or organization paths to permit all accounts in an organization\\n- Include account IDs to permit the specified accounts","Tags":"An array of key-value pairs to apply to the sink.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::Omics::AnnotationStore":{"attributes":{"CreationTime":"When the store was created.","Id":"The store\'s ID.","Ref":"`Ref` returns the details of this resource. For example:\\n\\n`{ \\"Ref\\": \\"AnnotationStore.Id\\" }` `Ref` returns the id for the annotation store.","Status":"The store\'s status.","StatusMessage":"The store\'s status message.","StoreArn":"The store\'s ARN.","StoreSizeBytes":"The store\'s size in bytes.","UpdateTime":"When the store was updated."},"description":"Creates an annotation store.","properties":{"Description":"A description for the store.","Name":"The name of the Annotation Store.","Reference":"The genome reference for the store\'s annotations.","SseConfig":"The store\'s server-side encryption (SSE) settings.","StoreFormat":"The annotation file format of the store.","StoreOptions":"File parsing options for the annotation store.","Tags":"Tags for the store."}},"AWS::Omics::AnnotationStore.ReferenceItem":{"attributes":{},"description":"A genome reference.","properties":{"ReferenceArn":"The reference\'s ARN."}},"AWS::Omics::AnnotationStore.SseConfig":{"attributes":{},"description":"Server-side encryption (SSE) settings for a store.","properties":{"KeyArn":"An encryption key ARN.","Type":"The encryption type."}},"AWS::Omics::AnnotationStore.StoreOptions":{"attributes":{},"description":"The store\'s file parsing options.","properties":{"TsvStoreOptions":"Formatting options for a TSV file."}},"AWS::Omics::AnnotationStore.TsvStoreOptions":{"attributes":{},"description":"The store\'s parsing options.","properties":{"AnnotationType":"The store\'s annotation type.","FormatToHeader":"The store\'s header key to column name mapping.","Schema":"The schema of an annotation store."}},"AWS::Omics::ReferenceStore":{"attributes":{"Arn":"","CreationTime":"When the store was created.","Ref":"`Ref` returns the details of this resource. For example:\\n\\n`{ \\"Ref\\": \\"ReferenceStore.Arn\\" }` `Ref` returns the arn for the reference store.","ReferenceStoreId":"The store\'s ID."},"description":"Creates a reference store.","properties":{"Description":"A description for the store.","Name":"A name for the store.","SseConfig":"Server-side encryption (SSE) settings for the store.","Tags":"Tags for the store."}},"AWS::Omics::ReferenceStore.SseConfig":{"attributes":{},"description":"Server-side encryption (SSE) settings for a store.","properties":{"KeyArn":"An encryption key ARN.","Type":"The encryption type."}},"AWS::Omics::RunGroup":{"attributes":{"Arn":"The run group\'s ARN.","CreationTime":"When the run group was created.","Id":"The run group\'s ID.","Ref":"`Ref` returns the details of this resource. For example:\\n\\n`{ \\"Ref\\": \\"RunGroup.CreationTime\\" }` `Ref` returns the timestamp for a run group."},"description":"Creates a run group.","properties":{"MaxCpus":"The group\'s maximum CPU count setting.","MaxDuration":"The group\'s maximum duration setting in minutes.","MaxRuns":"The group\'s maximum concurrent run setting.","Name":"The group\'s name.","Tags":"Tags for the group."}},"AWS::Omics::SequenceStore":{"attributes":{"Arn":"The store\'s ARN.","CreationTime":"When the store was created.","Ref":"`Ref` returns the details of this resource. For example:\\n\\n`{ \\"Ref\\": \\"SequenceStore.CreationTime\\" }` `Ref` returns the timestamp for when the sequence store was created.","SequenceStoreId":"The store\'s ID."},"description":"Creates a sequence store.","properties":{"Description":"A description for the store.","FallbackLocation":"","Name":"A name for the store.","SseConfig":"Server-side encryption (SSE) settings for the store.","Tags":"Tags for the store."}},"AWS::Omics::SequenceStore.SseConfig":{"attributes":{},"description":"Server-side encryption (SSE) settings for a store.","properties":{"KeyArn":"An encryption key ARN.","Type":"The encryption type."}},"AWS::Omics::VariantStore":{"attributes":{"CreationTime":"When the store was created.","Id":"The store\'s ID.","Ref":"`Ref` returns the details of this resource. For example:\\n\\n`{ \\"Ref\\": \\"VariantStore.Status\\" }`\\n\\nFor the Amazon Omics resource `VariantStore.Status` , `Ref` returns the status of the variant store.","Status":"The store\'s status.","StatusMessage":"The store\'s status message.","StoreArn":"The store\'s ARN.","StoreSizeBytes":"The store\'s size in bytes.","UpdateTime":"When the store was updated."},"description":"Create a store for variant data.","properties":{"Description":"A description for the store.","Name":"A name for the store.","Reference":"The genome reference for the store\'s variants.","SseConfig":"Server-side encryption (SSE) settings for the store.","Tags":"Tags for the store."}},"AWS::Omics::VariantStore.ReferenceItem":{"attributes":{},"description":"The read set\'s genome reference ARN.","properties":{"ReferenceArn":"The reference\'s ARN."}},"AWS::Omics::VariantStore.SseConfig":{"attributes":{},"description":"Server-side encryption (SSE) settings for a store.","properties":{"KeyArn":"An encryption key ARN.","Type":"The encryption type."}},"AWS::Omics::Workflow":{"attributes":{"Arn":"The ARN for the workflow.","CreationTime":"When the workflow was created.","Id":"The workflow\'s ID.","Ref":"`Ref` returns the details of this resource. For example:\\n\\n`{ \\"Ref\\": \\"Workflow.Type\\" }` `Ref` returns the type of workflow.","Status":"The workflow\'s status.","Type":"The workflow\'s type."},"description":"Creates a workflow.","properties":{"DefinitionUri":"The URI of a definition for the workflow.","Description":"The parameter\'s description.","Engine":"An engine for the workflow.","Main":"The path of the main definition file for the workflow.","Name":"The workflow\'s name.","ParameterTemplate":"The workflow\'s parameter template.","StorageCapacity":"A storage capacity for the workflow in gigabytes.","Tags":"Tags for the workflow."}},"AWS::Omics::Workflow.WorkflowParameter":{"attributes":{},"description":"A workflow parameter.","properties":{"Description":"The parameter\'s description.","Optional":"Whether the parameter is optional."}},"AWS::OpenSearchServerless::AccessPolicy":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the name of the access policy. For more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates a data access policy for OpenSearch Serverless. Access policies limit access to collections and the resources within them, and allow a user to access that data irrespective of the access mechanism or network source. For more information, see [Data access control for Amazon OpenSearch Serverless](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html) .","properties":{"Description":"The description of the policy.","Name":"The name of the policy.","Policy":"The JSON policy document without any whitespaces.","Type":"The type of access policy. Currently the only option is `data` ."}},"AWS::OpenSearchServerless::Collection":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the collection. For example, `arn:aws:aoss:us-east-1:123456789012:collection/07tjusf2h91cunochc` .","CollectionEndpoint":"Collection-specific endpoint used to submit index, search, and data upload requests to an OpenSearch Serverless collection. For example, `https://07tjusf2h91cunochc.us-east-1.aoss.amazonaws.com` .","DashboardEndpoint":"Collection-specific endpoint used to access OpenSearch Dashboards. For example, `https://07tjusf2h91cunochc.us-east-1.aoss.amazonaws.com/_dashboards` .","Id":"A unique identifier for the collection. For example, `07tjusf2h91cunochc` .","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the collection ID. For more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Specifies an OpenSearch Serverless collection. For more information, see [Creating and managing Amazon OpenSearch Serverless collections](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-manage.html) in the *Amazon OpenSearch Service Developer Guide* .\\n\\n> You must create a matching [encryption policy](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-encryption.html) in order for a collection to be created successfully. You can specify the policy resource within the same CloudFormation template as the collection resource if you use the [DependsOn](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) attribute. See [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-collection.html#aws-resource-opensearchserverless-collection--examples) for a sample template. Otherwise the encryption policy must already exist before you create the collection.","properties":{"Description":"A description of the collection.","Name":"The name of the collection.\\n\\nCollection names must meet the following criteria:\\n\\n- Starts with a lowercase letter\\n- Unique to your account and AWS Region\\n- Contains between 3 and 28 characters\\n- Contains only lowercase letters a-z, the numbers 0-9, and the hyphen (-)","Tags":"An arbitrary set of tags (key–value pairs) to associate with the collection.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","Type":"The type of collection. Possible values are `SEARCH` and `TIMESERIES` . For more information, see [Choosing a collection type](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-overview.html#serverless-usecase) ."}},"AWS::OpenSearchServerless::SecurityConfig":{"attributes":{"Id":"The unique identifier of the security configuration. For example, `saml/123456789012/myprovider` .","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the name of the ID of the security configuration. For more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Specifies a security configuration for OpenSearch Serverless. For more information, see [SAML authentication for Amazon OpenSearch Serverless](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-saml.html) .","properties":{"Description":"The description of the security configuration.","Name":"The name of the security configuration.","SamlOptions":"SAML options for the security configuration in the form of a key-value map.","Type":"The type of security configuration. Currently the only option is `saml` ."}},"AWS::OpenSearchServerless::SecurityConfig.SamlConfigOptions":{"attributes":{},"description":"Describes SAML options for an OpenSearch Serverless security configuration in the form of a key-value map.","properties":{"GroupAttribute":"The group attribute for this SAML integration.","Metadata":"The XML IdP metadata file generated from your identity provider.","SessionTimeout":"The session timeout, in minutes. Default is 60 minutes (12 hours).","UserAttribute":"A user attribute for this SAML integration."}},"AWS::OpenSearchServerless::SecurityPolicy":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the name of the security policy. For more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates an encryption or network policy to be used by one or more OpenSearch Serverless collections.\\n\\nNetwork policies specify access to a collection and its OpenSearch Dashboards endpoint from public networks or specific VPC endpoints. For more information, see [Network access for Amazon OpenSearch Serverless](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-network.html) .\\n\\nEncryption policies specify a KMS encryption key to assign to particular collections. For more information, see [Encryption at rest for Amazon OpenSearch Serverless](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-encryption.html) .","properties":{"Description":"The description of the security policy.","Name":"The name of the policy.","Policy":"The JSON policy document without any whitespaces.","Type":"The type of security policy. Can be either `encryption` or `network` ."}},"AWS::OpenSearchServerless::VpcEndpoint":{"attributes":{"Id":"The unique identifier of the endpoint. For example, `vpce-050f79086ee71ac05` .","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the endpoint ID. For more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates an OpenSearch Serverless-managed interface VPC endpoint. For more information, see [Access Amazon OpenSearch Serverless using an interface endpoint](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-vpc.html) .","properties":{"Name":"The name of the endpoint.","SecurityGroupIds":"The unique identifiers of the security groups that define the ports, protocols, and sources for inbound traffic that you are authorizing into your endpoint.","SubnetIds":"The ID of the subnets from which you access OpenSearch Serverless.","VpcId":"The ID of the VPC from which you access OpenSearch Serverless."}},"AWS::OpenSearchService::Domain":{"attributes":{"AdvancedSecurityOptions.AnonymousAuthDisableDate":"Date and time when the migration period will be disabled. Only necessary when [enabling fine-grained access control on an existing domain](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing) .","Arn":"The Amazon Resource Name (ARN) of the domain, such as `arn:aws:es:us-west-2:123456789012:domain/mystack-1ab2cdefghij` .","DomainArn":"The Amazon Resource Name (ARN) of the domain.","DomainEndpoint":"The domain-specific endpoint used for requests to the OpenSearch APIs, such as `search-mystack-1ab2cdefghij-ab1c2deckoyb3hofw7wpqa3cm.us-west-1.es.amazonaws.com` .","DomainEndpoints":"","Id":"The resource ID. For example, `123456789012/my-domain` .","Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, Ref returns the resource name, such as `mystack-abc1d2efg3h4.` For more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) .","ServiceSoftwareOptions":"The current status of the service software for a domain.","ServiceSoftwareOptions.AutomatedUpdateDate":"The timestamp, in Epoch time, until which you can manually request a service software update. After this date, we automatically update your service software.","ServiceSoftwareOptions.Cancellable":"True if you\'re able to cancel your service software version update. False if you can\'t cancel your service software update.","ServiceSoftwareOptions.CurrentVersion":"The current service software version present on the domain.","ServiceSoftwareOptions.Description":"A description of the service software update status.","ServiceSoftwareOptions.NewVersion":"The new service software version, if one is available.","ServiceSoftwareOptions.OptionalDeployment":"True if a service software is never automatically updated. False if a service software is automatically updated after the automated update date.","ServiceSoftwareOptions.UpdateAvailable":"True if you\'re able to update your service software version. False if you can\'t update your service software version.","ServiceSoftwareOptions.UpdateStatus":"The status of your service software update."},"description":"The AWS::OpenSearchService::Domain resource creates an Amazon OpenSearch Service domain.","properties":{"AccessPolicies":"An AWS Identity and Access Management ( IAM ) policy document that specifies who can access the OpenSearch Service domain and their permissions. For more information, see [Configuring access policies](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-creating) in the *Amazon OpenSearch Service Developer Guide* .","AdvancedOptions":"Additional options to specify for the OpenSearch Service domain. For more information, see [AdvancedOptions](https://docs.aws.amazon.com/opensearch-service/latest/APIReference/API_CreateDomain.html#API_CreateDomain_RequestBody) in the OpenSearch Service API reference.","AdvancedSecurityOptions":"Specifies options for fine-grained access control and SAML authentication.\\n\\nIf you specify advanced security options, you must also enable node-to-node encryption ( [NodeToNodeEncryptionOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-nodetonodeencryptionoptions.html) ) and encryption at rest ( [EncryptionAtRestOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-encryptionatrestoptions.html) ). You must also enable `EnforceHTTPS` within [DomainEndpointOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-domainendpointoptions.html) , which requires HTTPS for all traffic to the domain.","ClusterConfig":"Container for the cluster configuration of a domain.","CognitoOptions":"Configures OpenSearch Service to use Amazon Cognito authentication for OpenSearch Dashboards.","DomainEndpointOptions":"Specifies additional options for the domain endpoint, such as whether to require HTTPS for all traffic or whether to use a custom endpoint rather than the default endpoint.","DomainName":"A name for the OpenSearch Service domain. The name must have a minimum length of 3 and a maximum length of 28. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the domain name. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\nRequired when creating a new domain.\\n\\n> If you specify a name, you can\'t perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","EBSOptions":"The configurations of Amazon Elastic Block Store (Amazon EBS) volumes that are attached to data nodes in the OpenSearch Service domain. For more information, see [EBS volume size limits](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/limits.html#ebsresource) in the *Amazon OpenSearch Service Developer Guide* .","EncryptionAtRestOptions":"Whether the domain should encrypt data at rest, and if so, the AWS KMS key to use. See [Encryption of data at rest for Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/encryption-at-rest.html) .","EngineVersion":"The version of OpenSearch to use. The value must be in the format `OpenSearch_X.Y` or `Elasticsearch_X.Y` . If not specified, the latest version of OpenSearch is used. For information about the versions that OpenSearch Service supports, see [Supported versions of OpenSearch and Elasticsearch](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/what-is.html#choosing-version) in the *Amazon OpenSearch Service Developer Guide* .\\n\\nIf you set the [EnableVersionUpgrade](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html#cfn-attributes-updatepolicy-upgradeopensearchdomain) update policy to `true` , you can update `EngineVersion` without interruption. When `EnableVersionUpgrade` is set to `false` , or is not specified, updating `EngineVersion` results in [replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) .","LogPublishingOptions":"An object with one or more of the following keys: `SEARCH_SLOW_LOGS` , `ES_APPLICATION_LOGS` , `INDEX_SLOW_LOGS` , `AUDIT_LOGS` , depending on the types of logs you want to publish. Each key needs a valid `LogPublishingOption` value. For the full syntax, see the [examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#aws-resource-opensearchservice-domain--examples) .","NodeToNodeEncryptionOptions":"Specifies whether node-to-node encryption is enabled. See [Node-to-node encryption for Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ntn.html) .","OffPeakWindowOptions":"Options for a domain\'s off-peak window, during which OpenSearch Service can perform mandatory configuration changes on the domain.","SnapshotOptions":"*DEPRECATED* . The automated snapshot configuration for the OpenSearch Service domain indexes.","SoftwareUpdateOptions":"Options for configuring service software updates for a domain.","Tags":"An arbitrary set of tags (key–value pairs) to associate with the OpenSearch Service domain.","VPCOptions":"The virtual private cloud (VPC) configuration for the OpenSearch Service domain. For more information, see [Launching your Amazon OpenSearch Service domains within a VPC](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html) in the *Amazon OpenSearch Service Developer Guide* .\\n\\nIf you remove this entity altogether, along with its associated properties, it causes a replacement. You might encounter this scenario if you\'re updating your security configuration from a VPC to a public endpoint."}},"AWS::OpenSearchService::Domain.AdvancedSecurityOptionsInput":{"attributes":{},"description":"Specifies options for fine-grained access control.\\n\\nIf you specify advanced security options, you must also enable node-to-node encryption ( [NodeToNodeEncryptionOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-nodetonodeencryptionoptions.html) ) and encryption at rest ( [EncryptionAtRestOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-encryptionatrestoptions.html) ). You must also enable `EnforceHTTPS` within [DomainEndpointOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-domainendpointoptions.html) , which requires HTTPS for all traffic to the domain.","properties":{"AnonymousAuthDisableDate":"Date and time when the migration period will be disabled. Only necessary when [enabling fine-grained access control on an existing domain](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing) .","AnonymousAuthEnabled":"True to enable a 30-day migration period during which administrators can create role mappings. Only necessary when [enabling fine-grained access control on an existing domain](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html#fgac-enabling-existing) .","Enabled":"True to enable fine-grained access control. You must also enable encryption of data at rest and node-to-node encryption. See [Fine-grained access control in Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html) .","InternalUserDatabaseEnabled":"True to enable the internal user database.","MasterUserOptions":"Specifies information about the master user.","SAMLOptions":"Container for information about the SAML configuration for OpenSearch Dashboards."}},"AWS::OpenSearchService::Domain.ClusterConfig":{"attributes":{},"description":"The cluster configuration for the OpenSearch Service domain. You can specify options such as the instance type and the number of instances. For more information, see [Creating and managing Amazon OpenSearch Service domains](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"DedicatedMasterCount":"The number of instances to use for the master node. If you specify this property, you must specify `true` for the `DedicatedMasterEnabled` property.","DedicatedMasterEnabled":"Indicates whether to use a dedicated master node for the OpenSearch Service domain. A dedicated master node is a cluster node that performs cluster management tasks, but doesn\'t hold data or respond to data upload requests. Dedicated master nodes offload cluster management tasks to increase the stability of your search clusters. See [Dedicated master nodes in Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-dedicatedmasternodes.html) .","DedicatedMasterType":"The hardware configuration of the computer that hosts the dedicated master node, such as `m3.medium.search` . If you specify this property, you must specify `true` for the `DedicatedMasterEnabled` property. For valid values, see [Supported instance types in Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/supported-instance-types.html) .","InstanceCount":"The number of data nodes (instances) to use in the OpenSearch Service domain.","InstanceType":"The instance type for your data nodes, such as `m3.medium.search` . For valid values, see [Supported instance types in Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/supported-instance-types.html) .","MultiAZWithStandbyEnabled":"Indicates whether Multi-AZ with Standby deployment option is enabled. For more information, see [Multi-AZ with Standby](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-multiaz.html#managedomains-za-standby) .","WarmCount":"The number of warm nodes in the cluster.","WarmEnabled":"Whether to enable UltraWarm storage for the cluster. See [UltraWarm storage for Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ultrawarm.html) .","WarmType":"The instance type for the cluster\'s warm nodes.","ZoneAwarenessConfig":"Specifies zone awareness configuration options. Only use if `ZoneAwarenessEnabled` is `true` .","ZoneAwarenessEnabled":"Indicates whether to enable zone awareness for the OpenSearch Service domain. When you enable zone awareness, OpenSearch Service allocates the nodes and replica index shards that belong to a cluster across two Availability Zones (AZs) in the same region to prevent data loss and minimize downtime in the event of node or data center failure. Don\'t enable zone awareness if your cluster has no replica index shards or is a single-node cluster. For more information, see [Configuring a multi-AZ domain in Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-multiaz.html) ."}},"AWS::OpenSearchService::Domain.CognitoOptions":{"attributes":{},"description":"Configures OpenSearch Service to use Amazon Cognito authentication for OpenSearch Dashboards.","properties":{"Enabled":"Whether to enable or disable Amazon Cognito authentication for OpenSearch Dashboards. See [Amazon Cognito authentication for OpenSearch Dashboards](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/cognito-auth.html) .","IdentityPoolId":"The Amazon Cognito identity pool ID that you want OpenSearch Service to use for OpenSearch Dashboards authentication.\\n\\nRequired if you enabled Cognito Authentication for OpenSearch Dashboards.","RoleArn":"The `AmazonOpenSearchServiceCognitoAccess` role that allows OpenSearch Service to configure your user pool and identity pool.\\n\\nRequired if you enabled Cognito Authentication for OpenSearch Dashboards.","UserPoolId":"The Amazon Cognito user pool ID that you want OpenSearch Service to use for OpenSearch Dashboards authentication.\\n\\nRequired if you enabled Cognito Authentication for OpenSearch Dashboards."}},"AWS::OpenSearchService::Domain.DomainEndpointOptions":{"attributes":{},"description":"Specifies additional options for the domain endpoint, such as whether to require HTTPS for all traffic or whether to use a custom endpoint rather than the default endpoint.","properties":{"CustomEndpoint":"The fully qualified URL for your custom endpoint. Required if you enabled a custom endpoint for the domain.","CustomEndpointCertificateArn":"The AWS Certificate Manager ARN for your domain\'s SSL/TLS certificate. Required if you enabled a custom endpoint for the domain.","CustomEndpointEnabled":"True to enable a custom endpoint for the domain. If enabled, you must also provide values for `CustomEndpoint` and `CustomEndpointCertificateArn` .","EnforceHTTPS":"True to require that all traffic to the domain arrive over HTTPS. Required if you enable fine-grained access control in [AdvancedSecurityOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html) .","TLSSecurityPolicy":"The minimum TLS version required for traffic to the domain. Valid values are TLS 1.3 (recommended) or 1.2:\\n\\n- `Policy-Min-TLS-1-0-2019-07`\\n- `Policy-Min-TLS-1-2-2019-07`"}},"AWS::OpenSearchService::Domain.EBSOptions":{"attributes":{},"description":"The configurations of Amazon Elastic Block Store (Amazon EBS) volumes that are attached to data nodes in the OpenSearch Service domain. For more information, see [EBS volume size limits](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/limits.html#ebsresource) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"EBSEnabled":"Specifies whether Amazon EBS volumes are attached to data nodes in the OpenSearch Service domain.","Iops":"The number of I/O operations per second (IOPS) that the volume supports. This property applies only to the `gp3` and provisioned IOPS EBS volume types.","Throughput":"The throughput (in MiB/s) of the EBS volumes attached to data nodes. Applies only to the `gp3` volume type.","VolumeSize":"The size (in GiB) of the EBS volume for each data node. The minimum and maximum size of an EBS volume depends on the EBS volume type and the instance type to which it is attached. For more information, see [EBS volume size limits](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/limits.html#ebsresource) in the *Amazon OpenSearch Service Developer Guide* .","VolumeType":"The EBS volume type to use with the OpenSearch Service domain. If you choose `gp3` , you must also specify values for `Iops` and `Throughput` . For more information about each type, see [Amazon EBS volume types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html) in the *Amazon EC2 User Guide for Linux Instances* ."}},"AWS::OpenSearchService::Domain.EncryptionAtRestOptions":{"attributes":{},"description":"Whether the domain should encrypt data at rest, and if so, the AWS Key Management Service key to use.","properties":{"Enabled":"Specify `true` to enable encryption at rest. Required if you enable fine-grained access control in [AdvancedSecurityOptionsInput](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html) .","KmsKeyId":"The KMS key ID. Takes the form `1a2a3a4-1a2a-3a4a-5a6a-1a2a3a4a5a6a` . Required if you enable encryption at rest.\\n\\nYou can also use `keyAlias` as a value."}},"AWS::OpenSearchService::Domain.Idp":{"attributes":{},"description":"The SAML Identity Provider\'s information.","properties":{"EntityId":"The unique entity ID of the application in the SAML identity provider.","MetadataContent":"The metadata of the SAML application, in XML format."}},"AWS::OpenSearchService::Domain.LogPublishingOption":{"attributes":{},"description":"Specifies whether the OpenSearch Service domain publishes application, search slow logs, or index slow logs to Amazon CloudWatch. Each option must be an object of name `SEARCH_SLOW_LOGS` , `ES_APPLICATION_LOGS` , `INDEX_SLOW_LOGS` , or `AUDIT_LOGS` depending on the type of logs you want to publish. For the full syntax, see the [examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#aws-resource-opensearchservice-domain--examples) .\\n\\nBefore you enable log publishing, you need to create a CloudWatch log group and provide OpenSearch Service the correct permissions to write to it. To learn more, see [Enabling log publishing ( AWS CloudFormation)](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createdomain-configure-slow-logs.html#createdomain-configure-slow-logs-cfn) .","properties":{"CloudWatchLogsLogGroupArn":"Specifies the CloudWatch log group to publish to. Required if you enable log publishing.","Enabled":"If `true` , enables the publishing of logs to CloudWatch.\\n\\nDefault: `false` ."}},"AWS::OpenSearchService::Domain.MasterUserOptions":{"attributes":{},"description":"Specifies information about the master user.\\n\\nRequired if if `InternalUserDatabaseEnabled` is true in [AdvancedSecurityOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html) .","properties":{"MasterUserARN":"Amazon Resource Name (ARN) for the master user. The ARN can point to an IAM user or role. This property is required for Amazon Cognito to work, and it must match the role configured for Cognito. Only specify if `InternalUserDatabaseEnabled` is false in [AdvancedSecurityOptionsInput](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html) .","MasterUserName":"Username for the master user. Only specify if `InternalUserDatabaseEnabled` is true in [AdvancedSecurityOptionsInput](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html) .\\n\\nIf you don\'t want to specify this value directly within the template, you can use a [dynamic reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html) instead.","MasterUserPassword":"Password for the master user. Only specify if `InternalUserDatabaseEnabled` is true in [AdvancedSecurityOptionsInput](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html) .\\n\\nIf you don\'t want to specify this value directly within the template, you can use a [dynamic reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html) instead."}},"AWS::OpenSearchService::Domain.NodeToNodeEncryptionOptions":{"attributes":{},"description":"Specifies options for node-to-node encryption.","properties":{"Enabled":"Specifies to enable or disable node-to-node encryption on the domain. Required if you enable fine-grained access control in [AdvancedSecurityOptionsInput](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html) ."}},"AWS::OpenSearchService::Domain.OffPeakWindow":{"attributes":{},"description":"A custom 10-hour, low-traffic window during which OpenSearch Service can perform mandatory configuration changes on the domain. These actions can include scheduled service software updates and blue/green Auto-Tune enhancements. OpenSearch Service will schedule these actions during the window that you specify. If you don\'t specify a window start time, it defaults to 10:00 P.M. local time.","properties":{"WindowStartTime":"The desired start time for an off-peak maintenance window."}},"AWS::OpenSearchService::Domain.OffPeakWindowOptions":{"attributes":{},"description":"Off-peak window settings for the domain.","properties":{"Enabled":"Specifies whether off-peak window settings are enabled for the domain.","OffPeakWindow":"Off-peak window settings for the domain."}},"AWS::OpenSearchService::Domain.SAMLOptions":{"attributes":{},"description":"Container for information about the SAML configuration for OpenSearch Dashboards.","properties":{"Enabled":"True to enable SAML authentication for a domain.","Idp":"The SAML Identity Provider\'s information.","MasterBackendRole":"The backend role that the SAML master user is mapped to.","MasterUserName":"The SAML master user name, which is stored in the domain\'s internal user database.","RolesKey":"Element of the SAML assertion to use for backend roles. Default is `roles` .","SessionTimeoutMinutes":"The duration, in minutes, after which a user session becomes inactive. Acceptable values are between 1 and 1440, and the default value is 60.","SubjectKey":"Element of the SAML assertion to use for the user name. Default is `NameID` ."}},"AWS::OpenSearchService::Domain.ServiceSoftwareOptions":{"attributes":{},"description":"The current status of the service software for an Amazon OpenSearch Service domain. For more information, see [Service software updates in Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/service-software.html) .","properties":{"AutomatedUpdateDate":"The timestamp, in Epoch time, until which you can manually request a service software update. After this date, we automatically update your service software.","Cancellable":"True if you\'re able to cancel your service software version update. False if you can\'t cancel your service software update.","CurrentVersion":"The current service software version present on the domain.","Description":"A description of the service software update status.","NewVersion":"The new service software version, if one is available.","OptionalDeployment":"True if a service software is never automatically updated. False if a service software is automatically updated after the automated update date.","UpdateAvailable":"True if you\'re able to update your service software version. False if you can\'t update your service software version.","UpdateStatus":"The status of your service software update."}},"AWS::OpenSearchService::Domain.SnapshotOptions":{"attributes":{},"description":"*DEPRECATED* . This setting is only relevant to domains running legacy Elasticsearch OSS versions earlier than 5.3. It does not apply to OpenSearch domains.\\n\\nThe automated snapshot configuration for the OpenSearch Service domain indexes.","properties":{"AutomatedSnapshotStartHour":"The hour in UTC during which the service takes an automated daily snapshot of the indexes in the OpenSearch Service domain. For example, if you specify 0, OpenSearch Service takes an automated snapshot everyday between midnight and 1 am. You can specify a value between 0 and 23."}},"AWS::OpenSearchService::Domain.SoftwareUpdateOptions":{"attributes":{},"description":"Options for configuring service software updates for a domain.","properties":{"AutoSoftwareUpdateEnabled":"Specifies whether automatic service software updates are enabled for the domain."}},"AWS::OpenSearchService::Domain.VPCOptions":{"attributes":{},"description":"The virtual private cloud (VPC) configuration for the OpenSearch Service domain. For more information, see [Launching your Amazon OpenSearch Service domains using a VPC](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html) in the *Amazon OpenSearch Service Developer Guide* .","properties":{"SecurityGroupIds":"The list of security group IDs that are associated with the VPC endpoints for the domain. If you don\'t provide a security group ID, OpenSearch Service uses the default security group for the VPC. To learn more, see [Security groups for your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) in the *Amazon VPC User Guide* .","SubnetIds":"Provide one subnet ID for each Availability Zone that your domain uses. For example, you must specify three subnet IDs for a three-AZ domain. To learn more, see [VPCs and subnets](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html) in the *Amazon VPC User Guide* .\\n\\nIf you specify more than one subnet, you must also configure `ZoneAwarenessEnabled` and `ZoneAwarenessConfig` within [ClusterConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html) , otherwise you\'ll see the error \\"You must specify exactly one subnet\\" during template creation."}},"AWS::OpenSearchService::Domain.WindowStartTime":{"attributes":{},"description":"A custom start time for the off-peak window, in Coordinated Universal Time (UTC). The window length will always be 10 hours, so you can\'t specify an end time. For example, if you specify 11:00 P.M. UTC as a start time, the end time will automatically be set to 9:00 A.M.","properties":{"Hours":"The start hour of the window in Coordinated Universal Time (UTC), using 24-hour time. For example, 17 refers to 5:00 P.M. UTC. The minimum value is 0 and the maximum value is 23.","Minutes":"The start minute of the window, in UTC. The minimum value is 0 and the maximum value is 59."}},"AWS::OpenSearchService::Domain.ZoneAwarenessConfig":{"attributes":{},"description":"Specifies zone awareness configuration options. Only use if `ZoneAwarenessEnabled` is `true` .","properties":{"AvailabilityZoneCount":"If you enabled multiple Availability Zones (AZs), the number of AZs that you want the domain to use.\\n\\nValid values are `2` and `3` . Default is 2."}},"AWS::OpsWorks::App":{"attributes":{"Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myApp\\" }`\\n\\nFor the AWS OpsWorks stack `myApp` , `Ref` returns the ID of the AWS OpsWorks app."},"description":"Creates an app for a specified stack. For more information, see [Creating Apps](https://docs.aws.amazon.com/opsworks/latest/userguide/workingapps-creating.html) .\\n\\n*Required Permissions* : To use this action, an IAM user must have a Manage permissions level for the stack, or an attached policy that explicitly grants permissions. For more information on user permissions, see [Managing User Permissions](https://docs.aws.amazon.com/opsworks/latest/userguide/opsworks-security-users.html) .","properties":{"AppSource":"A `Source` object that specifies the app repository.","Attributes":"One or more user-defined key/value pairs to be added to the stack attributes.","DataSources":"The app\'s data source.","Description":"A description of the app.","Domains":"The app virtual host settings, with multiple domains separated by commas. For example: `\'www.example.com, example.com\'`","EnableSsl":"Whether to enable SSL for the app.","Environment":"An array of `EnvironmentVariable` objects that specify environment variables to be associated with the app. After you deploy the app, these variables are defined on the associated app server instance. For more information, see [Environment Variables](https://docs.aws.amazon.com/opsworks/latest/userguide/workingapps-creating.html#workingapps-creating-environment) .\\n\\nThere is no specific limit on the number of environment variables. However, the size of the associated data structure - which includes the variables\' names, values, and protected flag values - cannot exceed 20 KB. This limit should accommodate most if not all use cases. Exceeding it will cause an exception with the message, \\"Environment: is too large (maximum is 20KB).\\"\\n\\n> If you have specified one or more environment variables, you cannot modify the stack\'s Chef version.","Name":"The app name.","Shortname":"The app\'s short name.","SslConfiguration":"An `SslConfiguration` object with the SSL configuration.","StackId":"The stack ID.","Type":"The app type. Each supported type is associated with a particular layer. For example, PHP applications are associated with a PHP layer. AWS OpsWorks Stacks deploys an application to those instances that are members of the corresponding layer. If your app isn\'t one of the standard types, or you prefer to implement your own Deploy recipes, specify `other` ."}},"AWS::OpsWorks::App.DataSource":{"attributes":{},"description":"Describes an app\'s data source.","properties":{"Arn":"The data source\'s ARN.","DatabaseName":"The database name.","Type":"The data source\'s type, `AutoSelectOpsworksMysqlInstance` , `OpsworksMysqlInstance` , `RdsDbInstance` , or `None` ."}},"AWS::OpsWorks::App.EnvironmentVariable":{"attributes":{},"description":"Represents an app\'s environment variable.","properties":{"Key":"(Required) The environment variable\'s name, which can consist of up to 64 characters and must be specified. The name can contain upper- and lowercase letters, numbers, and underscores (_), but it must start with a letter or underscore.","Secure":"(Optional) Whether the variable\'s value is returned by the [DescribeApps](https://docs.aws.amazon.com/goto/WebAPI/opsworks-2013-02-18/DescribeApps) action. To hide an environment variable\'s value, set `Secure` to `true` . `DescribeApps` returns `*****FILTERED*****` instead of the actual value. The default value for `Secure` is `false` .","Value":"(Optional) The environment variable\'s value, which can be left empty. If you specify a value, it can contain up to 256 characters, which must all be printable."}},"AWS::OpsWorks::App.Source":{"attributes":{},"description":"Contains the information required to retrieve an app or cookbook from a repository. For more information, see [Creating Apps](https://docs.aws.amazon.com/opsworks/latest/userguide/workingapps-creating.html) or [Custom Recipes and Cookbooks](https://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook.html) .","properties":{"Password":"When included in a request, the parameter depends on the repository type.\\n\\n- For Amazon S3 bundles, set `Password` to the appropriate IAM secret access key.\\n- For HTTP bundles and Subversion repositories, set `Password` to the password.\\n\\nFor more information on how to safely handle IAM credentials, see [](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html) .\\n\\nIn responses, AWS OpsWorks Stacks returns `*****FILTERED*****` instead of the actual value.","Revision":"The application\'s version. AWS OpsWorks Stacks enables you to easily deploy new versions of an application. One of the simplest approaches is to have branches or revisions in your repository that represent different versions that can potentially be deployed.","SshKey":"In requests, the repository\'s SSH key.\\n\\nIn responses, AWS OpsWorks Stacks returns `*****FILTERED*****` instead of the actual value.","Type":"The repository type.","Url":"The source URL. The following is an example of an Amazon S3 source URL: `https://s3.amazonaws.com/opsworks-demo-bucket/opsworks_cookbook_demo.tar.gz` .","Username":"This parameter depends on the repository type.\\n\\n- For Amazon S3 bundles, set `Username` to the appropriate IAM access key ID.\\n- For HTTP bundles, Git repositories, and Subversion repositories, set `Username` to the user name."}},"AWS::OpsWorks::App.SslConfiguration":{"attributes":{},"description":"Describes an app\'s SSL configuration.","properties":{"Certificate":"The contents of the certificate\'s domain.crt file.","Chain":"Optional. Can be used to specify an intermediate certificate authority key or client authentication.","PrivateKey":"The private key; the contents of the certificate\'s domain.kex file."}},"AWS::OpsWorks::ElasticLoadBalancerAttachment":{"attributes":{},"description":"Attaches an Elastic Load Balancing load balancer to an AWS OpsWorks layer that you specify.","properties":{"ElasticLoadBalancerName":"The Elastic Load Balancing instance name.","LayerId":"The AWS OpsWorks layer ID to which the Elastic Load Balancing load balancer is attached."}},"AWS::OpsWorks::Instance":{"attributes":{"AvailabilityZone":"The Availability Zone of the AWS OpsWorks instance, such as `us-east-2a` .","PrivateDnsName":"The private DNS name of the AWS OpsWorks instance.","PrivateIp":"The private IP address of the AWS OpsWorks instance, such as `192.0.2.0` .","PublicDnsName":"The public DNS name of the AWS OpsWorks instance.","PublicIp":"The public IP address of the AWS OpsWorks instance, such as `192.0.2.0` .\\n\\n> Use this attribute only when the AWS OpsWorks instance is in an AWS OpsWorks layer that auto-assigns public IP addresses.","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\" *myInstance1* \\" }`\\n\\nFor the AWS OpsWorks instance *myInstance1* , `Ref` returns the AWS OpsWorks instance ID."},"description":"Creates an instance in a specified stack. For more information, see [Adding an Instance to a Layer](https://docs.aws.amazon.com/opsworks/latest/userguide/workinginstances-add.html) .\\n\\n*Required Permissions* : To use this action, an IAM user must have a Manage permissions level for the stack, or an attached policy that explicitly grants permissions. For more information on user permissions, see [Managing User Permissions](https://docs.aws.amazon.com/opsworks/latest/userguide/opsworks-security-users.html) .","properties":{"AgentVersion":"The default AWS OpsWorks Stacks agent version. You have the following options:\\n\\n- `INHERIT` - Use the stack\'s default agent version setting.\\n- *version_number* - Use the specified agent version. This value overrides the stack\'s default setting. To update the agent version, edit the instance configuration and specify a new version. AWS OpsWorks Stacks installs that version on the instance.\\n\\nThe default setting is `INHERIT` . To specify an agent version, you must use the complete version number, not the abbreviated number shown on the console. For a list of available agent version numbers, call [DescribeAgentVersions](https://docs.aws.amazon.com/goto/WebAPI/opsworks-2013-02-18/DescribeAgentVersions) . AgentVersion cannot be set to Chef 12.2.","AmiId":"A custom AMI ID to be used to create the instance. The AMI should be based on one of the supported operating systems. For more information, see [Using Custom AMIs](https://docs.aws.amazon.com/opsworks/latest/userguide/workinginstances-custom-ami.html) .\\n\\n> If you specify a custom AMI, you must set `Os` to `Custom` .","Architecture":"The instance architecture. The default option is `x86_64` . Instance types do not necessarily support both architectures. For a list of the architectures that are supported by the different instance types, see [Instance Families and Types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) .","AutoScalingType":"For load-based or time-based instances, the type. Windows stacks can use only time-based instances.","AvailabilityZone":"The Availability Zone of the AWS OpsWorks instance, such as `us-east-2a` .","BlockDeviceMappings":"An array of `BlockDeviceMapping` objects that specify the instance\'s block devices. For more information, see [Block Device Mapping](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html) . Note that block device mappings are not supported for custom AMIs.","EbsOptimized":"Whether to create an Amazon EBS-optimized instance.","ElasticIps":"A list of Elastic IP addresses to associate with the instance.","Hostname":"The instance host name. The following are character limits for instance host names.\\n\\n- Linux-based instances: 63 characters\\n- Windows-based instances: 15 characters","InstallUpdatesOnBoot":"Whether to install operating system and package updates when the instance boots. The default value is `true` . To control when updates are installed, set this value to `false` . You must then update your instances manually by using [CreateDeployment](https://docs.aws.amazon.com/goto/WebAPI/opsworks-2013-02-18/CreateDeployment) to run the `update_dependencies` stack command or by manually running `yum` (Amazon Linux) or `apt-get` (Ubuntu) on the instances.\\n\\n> We strongly recommend using the default value of `true` to ensure that your instances have the latest security updates.","InstanceType":"The instance type, such as `t2.micro` . For a list of supported instance types, open the stack in the console, choose *Instances* , and choose *+ Instance* . The *Size* list contains the currently supported types. For more information, see [Instance Families and Types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html) . The parameter values that you use to specify the various types are in the *API Name* column of the *Available Instance Types* table.","LayerIds":"An array that contains the instance\'s layer IDs.","Os":"The instance\'s operating system, which must be set to one of the following.\\n\\n- A supported Linux operating system: An Amazon Linux version, such as `Amazon Linux 2` , `Amazon Linux 2018.03` , `Amazon Linux 2017.09` , `Amazon Linux 2017.03` , `Amazon Linux 2016.09` , `Amazon Linux 2016.03` , `Amazon Linux 2015.09` , or `Amazon Linux 2015.03` .\\n- A supported Ubuntu operating system, such as `Ubuntu 18.04 LTS` , `Ubuntu 16.04 LTS` , `Ubuntu 14.04 LTS` , or `Ubuntu 12.04 LTS` .\\n- `CentOS Linux 7`\\n- `Red Hat Enterprise Linux 7`\\n- A supported Windows operating system, such as `Microsoft Windows Server 2012 R2 Base` , `Microsoft Windows Server 2012 R2 with SQL Server Express` , `Microsoft Windows Server 2012 R2 with SQL Server Standard` , or `Microsoft Windows Server 2012 R2 with SQL Server Web` .\\n- A custom AMI: `Custom` .\\n\\nNot all operating systems are supported with all versions of Chef. For more information about the supported operating systems, see [AWS OpsWorks Stacks Operating Systems](https://docs.aws.amazon.com/opsworks/latest/userguide/workinginstances-os.html) .\\n\\nThe default option is the current Amazon Linux version. If you set this parameter to `Custom` , you must use the [CreateInstance](https://docs.aws.amazon.com/goto/WebAPI/opsworks-2013-02-18/CreateInstance) action\'s AmiId parameter to specify the custom AMI that you want to use. Block device mappings are not supported if the value is `Custom` . For more information about how to use custom AMIs with AWS OpsWorks Stacks, see [Using Custom AMIs](https://docs.aws.amazon.com/opsworks/latest/userguide/workinginstances-custom-ami.html) .","RootDeviceType":"The instance root device type. For more information, see [Storage for the Root Device](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ComponentsAMIs.html#storage-for-the-root-device) .","SshKeyName":"The instance\'s Amazon EC2 key-pair name.","StackId":"The stack ID.","SubnetId":"The ID of the instance\'s subnet. If the stack is running in a VPC, you can use this parameter to override the stack\'s default subnet ID value and direct AWS OpsWorks Stacks to launch the instance in a different subnet.","Tenancy":"The instance\'s tenancy option. The default option is no tenancy, or if the instance is running in a VPC, inherit tenancy settings from the VPC. The following are valid values for this parameter: `dedicated` , `default` , or `host` . Because there are costs associated with changes in tenancy options, we recommend that you research tenancy options before choosing them for your instances. For more information about dedicated hosts, see [Dedicated Hosts Overview](https://docs.aws.amazon.com/ec2/dedicated-hosts/) and [Amazon EC2 Dedicated Hosts](https://docs.aws.amazon.com/ec2/dedicated-hosts/) . For more information about dedicated instances, see [Dedicated Instances](https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/dedicated-instance.html) and [Amazon EC2 Dedicated Instances](https://docs.aws.amazon.com/ec2/purchasing-options/dedicated-instances/) .","TimeBasedAutoScaling":"The time-based scaling configuration for the instance.","VirtualizationType":"The instance\'s virtualization type, `paravirtual` or `hvm` .","Volumes":"A list of AWS OpsWorks volume IDs to associate with the instance. For more information, see [`AWS::OpsWorks::Volume`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-volume.html) ."}},"AWS::OpsWorks::Instance.BlockDeviceMapping":{"attributes":{},"description":"Describes a block device mapping. This data type maps directly to the Amazon EC2 [BlockDeviceMapping](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_BlockDeviceMapping.html) data type.","properties":{"DeviceName":"The device name that is exposed to the instance, such as `/dev/sdh` . For the root device, you can use the explicit device name or you can set this parameter to `ROOT_DEVICE` and AWS OpsWorks Stacks will provide the correct device name.","Ebs":"An `EBSBlockDevice` that defines how to configure an Amazon EBS volume when the instance is launched. You can specify either the `VirtualName` or `Ebs` , but not both.","NoDevice":"Suppresses the specified device included in the AMI\'s block device mapping.","VirtualName":"The virtual device name. For more information, see [BlockDeviceMapping](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_BlockDeviceMapping.html) . You can specify either the `VirtualName` or `Ebs` , but not both."}},"AWS::OpsWorks::Instance.EbsBlockDevice":{"attributes":{},"description":"Describes an Amazon EBS volume. This data type maps directly to the Amazon EC2 [EbsBlockDevice](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EbsBlockDevice.html) data type.","properties":{"DeleteOnTermination":"Whether the volume is deleted on instance termination.","Iops":"The number of I/O operations per second (IOPS) that the volume supports. For more information, see [EbsBlockDevice](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EbsBlockDevice.html) .","SnapshotId":"The snapshot ID.","VolumeSize":"The volume size, in GiB. For more information, see [EbsBlockDevice](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EbsBlockDevice.html) .","VolumeType":"The volume type. `gp2` for General Purpose (SSD) volumes, `io1` for Provisioned IOPS (SSD) volumes, `st1` for Throughput Optimized hard disk drives (HDD), `sc1` for Cold HDD,and `standard` for Magnetic volumes.\\n\\nIf you specify the `io1` volume type, you must also specify a value for the `Iops` attribute. The maximum ratio of provisioned IOPS to requested volume size (in GiB) is 50:1. AWS uses the default volume size (in GiB) specified in the AMI attributes to set IOPS to 50 x (volume size)."}},"AWS::OpsWorks::Instance.TimeBasedAutoScaling":{"attributes":{},"description":"Describes an instance\'s time-based auto scaling configuration.","properties":{"Friday":"The schedule for Friday.","Monday":"The schedule for Monday.","Saturday":"The schedule for Saturday.","Sunday":"The schedule for Sunday.","Thursday":"The schedule for Thursday.","Tuesday":"The schedule for Tuesday.","Wednesday":"The schedule for Wednesday."}},"AWS::OpsWorks::Layer":{"attributes":{"Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\" *myLayer* \\" }`\\n\\nFor the AWS OpsWorks layer *myLayer* , `Ref` returns the AWS OpsWorks layer ID."},"description":"Creates a layer. For more information, see [How to Create a Layer](https://docs.aws.amazon.com/opsworks/latest/userguide/workinglayers-basics-create.html) .\\n\\n> You should use *CreateLayer* for noncustom layer types such as PHP App Server only if the stack does not have an existing layer of that type. A stack can have at most one instance of each noncustom layer; if you attempt to create a second instance, *CreateLayer* fails. A stack can have an arbitrary number of custom layers, so you can call *CreateLayer* as many times as you like for that layer type. \\n\\n*Required Permissions* : To use this action, an IAM user must have a Manage permissions level for the stack, or an attached policy that explicitly grants permissions. For more information on user permissions, see [Managing User Permissions](https://docs.aws.amazon.com/opsworks/latest/userguide/opsworks-security-users.html) .","properties":{"Attributes":"One or more user-defined key-value pairs to be added to the stack attributes.\\n\\nTo create a cluster layer, set the `EcsClusterArn` attribute to the cluster\'s ARN.","AutoAssignElasticIps":"Whether to automatically assign an [Elastic IP address](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html) to the layer\'s instances. For more information, see [How to Edit a Layer](https://docs.aws.amazon.com/opsworks/latest/userguide/workinglayers-basics-edit.html) .","AutoAssignPublicIps":"For stacks that are running in a VPC, whether to automatically assign a public IP address to the layer\'s instances. For more information, see [How to Edit a Layer](https://docs.aws.amazon.com/opsworks/latest/userguide/workinglayers-basics-edit.html) .","CustomInstanceProfileArn":"The ARN of an IAM profile to be used for the layer\'s EC2 instances. For more information about IAM ARNs, see [Using Identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) .","CustomJson":"A JSON-formatted string containing custom stack configuration and deployment attributes to be installed on the layer\'s instances. For more information, see [Using Custom JSON](https://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-json-override.html) . This feature is supported as of version 1.7.42 of the AWS CLI .","CustomRecipes":"A `LayerCustomRecipes` object that specifies the layer custom recipes.","CustomSecurityGroupIds":"An array containing the layer custom security group IDs.","EnableAutoHealing":"Whether to disable auto healing for the layer.","InstallUpdatesOnBoot":"Whether to install operating system and package updates when the instance boots. The default value is `true` . To control when updates are installed, set this value to `false` . You must then update your instances manually by using [CreateDeployment](https://docs.aws.amazon.com/goto/WebAPI/opsworks-2013-02-18/CreateDeployment) to run the `update_dependencies` stack command or by manually running `yum` (Amazon Linux) or `apt-get` (Ubuntu) on the instances.\\n\\n> To ensure that your instances have the latest security updates, we strongly recommend using the default value of `true` .","LifecycleEventConfiguration":"A `LifeCycleEventConfiguration` object that you can use to configure the Shutdown event to specify an execution timeout and enable or disable Elastic Load Balancer connection draining.","LoadBasedAutoScaling":"The load-based scaling configuration for the AWS OpsWorks layer.","Name":"The layer name, which is used by the console. Layer names can be a maximum of 32 characters.","Packages":"An array of `Package` objects that describes the layer packages.","Shortname":"For custom layers only, use this parameter to specify the layer\'s short name, which is used internally by AWS OpsWorks Stacks and by Chef recipes. The short name is also used as the name for the directory where your app files are installed. It can have a maximum of 32 characters, which are limited to the alphanumeric characters, \'-\', \'_\', and \'.\'.\\n\\nBuilt-in layer short names are defined by AWS OpsWorks Stacks. For more information, see the [Layer Reference](https://docs.aws.amazon.com/opsworks/latest/userguide/layers.html) .","StackId":"The layer stack ID.","Tags":"Specifies one or more sets of tags (key–value pairs) to associate with this AWS OpsWorks layer. Use tags to manage your resources.","Type":"The layer type. A stack cannot have more than one built-in layer of the same type. It can have any number of custom layers. Built-in layers are not available in Chef 12 stacks.","UseEbsOptimizedInstances":"Whether to use Amazon EBS-optimized instances.","VolumeConfigurations":"A `VolumeConfigurations` object that describes the layer\'s Amazon EBS volumes."}},"AWS::OpsWorks::Layer.AutoScalingThresholds":{"attributes":{},"description":"Describes a load-based auto scaling upscaling or downscaling threshold configuration, which specifies when AWS OpsWorks Stacks starts or stops load-based instances.","properties":{"CpuThreshold":"The CPU utilization threshold, as a percent of the available CPU. A value of -1 disables the threshold.","IgnoreMetricsTime":"The amount of time (in minutes) after a scaling event occurs that AWS OpsWorks Stacks should ignore metrics and suppress additional scaling events. For example, AWS OpsWorks Stacks adds new instances following an upscaling event but the instances won\'t start reducing the load until they have been booted and configured. There is no point in raising additional scaling events during that operation, which typically takes several minutes. `IgnoreMetricsTime` allows you to direct AWS OpsWorks Stacks to suppress scaling events long enough to get the new instances online.","InstanceCount":"The number of instances to add or remove when the load exceeds a threshold.","LoadThreshold":"The load threshold. A value of -1 disables the threshold. For more information about how load is computed, see [Load (computing)](https://docs.aws.amazon.com/http://en.wikipedia.org/wiki/Load_%28computing%29) .","MemoryThreshold":"The memory utilization threshold, as a percent of the available memory. A value of -1 disables the threshold.","ThresholdsWaitTime":"The amount of time, in minutes, that the load must exceed a threshold before more instances are added or removed."}},"AWS::OpsWorks::Layer.LifecycleEventConfiguration":{"attributes":{},"description":"Specifies the lifecycle event configuration","properties":{"ShutdownEventConfiguration":"The Shutdown event configuration."}},"AWS::OpsWorks::Layer.LoadBasedAutoScaling":{"attributes":{},"description":"Describes a layer\'s load-based auto scaling configuration.","properties":{"DownScaling":"An `AutoScalingThresholds` object that describes the downscaling configuration, which defines how and when AWS OpsWorks Stacks reduces the number of instances.","Enable":"Whether load-based auto scaling is enabled for the layer.","UpScaling":"An `AutoScalingThresholds` object that describes the upscaling configuration, which defines how and when AWS OpsWorks Stacks increases the number of instances."}},"AWS::OpsWorks::Layer.Recipes":{"attributes":{},"description":"AWS OpsWorks Stacks supports five lifecycle events: *setup* , *configuration* , *deploy* , *undeploy* , and *shutdown* . For each layer, AWS OpsWorks Stacks runs a set of standard recipes for each event. In addition, you can provide custom recipes for any or all layers and events. AWS OpsWorks Stacks runs custom event recipes after the standard recipes. `LayerCustomRecipes` specifies the custom recipes for a particular layer to be run in response to each of the five events.\\n\\nTo specify a recipe, use the cookbook\'s directory name in the repository followed by two colons and the recipe name, which is the recipe\'s file name without the .rb extension. For example: phpapp2::dbsetup specifies the dbsetup.rb recipe in the repository\'s phpapp2 folder.","properties":{"Configure":"An array of custom recipe names to be run following a `configure` event.","Deploy":"An array of custom recipe names to be run following a `deploy` event.","Setup":"An array of custom recipe names to be run following a `setup` event.","Shutdown":"An array of custom recipe names to be run following a `shutdown` event.","Undeploy":"An array of custom recipe names to be run following a `undeploy` event."}},"AWS::OpsWorks::Layer.ShutdownEventConfiguration":{"attributes":{},"description":"The Shutdown event configuration.","properties":{"DelayUntilElbConnectionsDrained":"Whether to enable Elastic Load Balancing connection draining. For more information, see [Connection Draining](https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#conn-drain)","ExecutionTimeout":"The time, in seconds, that AWS OpsWorks Stacks waits after triggering a Shutdown event before shutting down an instance."}},"AWS::OpsWorks::Layer.VolumeConfiguration":{"attributes":{},"description":"Describes an Amazon EBS volume configuration.","properties":{"Encrypted":"Specifies whether an Amazon EBS volume is encrypted. For more information, see [Amazon EBS Encryption](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html) .","Iops":"The number of I/O operations per second (IOPS) to provision for the volume. For PIOPS volumes, the IOPS per disk.\\n\\nIf you specify `io1` for the volume type, you must specify this property.","MountPoint":"The volume mount point. For example \\"/dev/sdh\\".","NumberOfDisks":"The number of disks in the volume.","RaidLevel":"The volume [RAID level](https://docs.aws.amazon.com/http://en.wikipedia.org/wiki/Standard_RAID_levels) .","Size":"The volume size.","VolumeType":"The volume type. For more information, see [Amazon EBS Volume Types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html) .\\n\\n- `standard` - Magnetic. Magnetic volumes must have a minimum size of 1 GiB and a maximum size of 1024 GiB.\\n- `io1` - Provisioned IOPS (SSD). PIOPS volumes must have a minimum size of 4 GiB and a maximum size of 16384 GiB.\\n- `gp2` - General Purpose (SSD). General purpose volumes must have a minimum size of 1 GiB and a maximum size of 16384 GiB.\\n- `st1` - Throughput Optimized hard disk drive (HDD). Throughput optimized HDD volumes must have a minimum size of 500 GiB and a maximum size of 16384 GiB.\\n- `sc1` - Cold HDD. Cold HDD volumes must have a minimum size of 500 GiB and a maximum size of 16384 GiB."}},"AWS::OpsWorks::Stack":{"attributes":{"Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\" *myStack* \\" }`\\n\\nFor the AWS OpsWorks stack *myStack* , `Ref` returns the AWS OpsWorks stack ID."},"description":"Creates a new stack. For more information, see [Create a New Stack](https://docs.aws.amazon.com/opsworks/latest/userguide/workingstacks-edit.html) .\\n\\n*Required Permissions* : To use this action, an IAM user must have an attached policy that explicitly grants permissions. For more information about user permissions, see [Managing User Permissions](https://docs.aws.amazon.com/opsworks/latest/userguide/opsworks-security-users.html) .","properties":{"AgentVersion":"The default AWS OpsWorks Stacks agent version. You have the following options:\\n\\n- Auto-update - Set this parameter to `LATEST` . AWS OpsWorks Stacks automatically installs new agent versions on the stack\'s instances as soon as they are available.\\n- Fixed version - Set this parameter to your preferred agent version. To update the agent version, you must edit the stack configuration and specify a new version. AWS OpsWorks Stacks installs that version on the stack\'s instances.\\n\\nThe default setting is the most recent release of the agent. To specify an agent version, you must use the complete version number, not the abbreviated number shown on the console. For a list of available agent version numbers, call [DescribeAgentVersions](https://docs.aws.amazon.com/goto/WebAPI/opsworks-2013-02-18/DescribeAgentVersions) . AgentVersion cannot be set to Chef 12.2.\\n\\n> You can also specify an agent version when you create or update an instance, which overrides the stack\'s default setting.","Attributes":"One or more user-defined key-value pairs to be added to the stack attributes.","ChefConfiguration":"A `ChefConfiguration` object that specifies whether to enable Berkshelf and the Berkshelf version on Chef 11.10 stacks. For more information, see [Create a New Stack](https://docs.aws.amazon.com/opsworks/latest/userguide/workingstacks-creating.html) .","CloneAppIds":"If you\'re cloning an AWS OpsWorks stack, a list of AWS OpsWorks application stack IDs from the source stack to include in the cloned stack.","ClonePermissions":"If you\'re cloning an AWS OpsWorks stack, indicates whether to clone the source stack\'s permissions.","ConfigurationManager":"The configuration manager. When you create a stack we recommend that you use the configuration manager to specify the Chef version: 12, 11.10, or 11.4 for Linux stacks, or 12.2 for Windows stacks. The default value for Linux stacks is currently 12.","CustomCookbooksSource":"Contains the information required to retrieve an app or cookbook from a repository. For more information, see [Adding Apps](https://docs.aws.amazon.com/opsworks/latest/userguide/workingapps-creating.html) or [Cookbooks and Recipes](https://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook.html) .","CustomJson":"A string that contains user-defined, custom JSON. It can be used to override the corresponding default stack configuration attribute values or to pass data to recipes. The string should be in the following format:\\n\\n`\\"{\\\\\\"key1\\\\\\": \\\\\\"value1\\\\\\", \\\\\\"key2\\\\\\": \\\\\\"value2\\\\\\",...}\\"`\\n\\nFor more information about custom JSON, see [Use Custom JSON to Modify the Stack Configuration Attributes](https://docs.aws.amazon.com/opsworks/latest/userguide/workingstacks-json.html) .","DefaultAvailabilityZone":"The stack\'s default Availability Zone, which must be in the specified region. For more information, see [Regions and Endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html) . If you also specify a value for `DefaultSubnetId` , the subnet must be in the same zone. For more information, see the `VpcId` parameter description.","DefaultInstanceProfileArn":"The Amazon Resource Name (ARN) of an IAM profile that is the default profile for all of the stack\'s EC2 instances. For more information about IAM ARNs, see [Using Identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) .","DefaultOs":"The stack\'s default operating system, which is installed on every instance unless you specify a different operating system when you create the instance. You can specify one of the following.\\n\\n- A supported Linux operating system: An Amazon Linux version, such as `Amazon Linux 2` , `Amazon Linux 2018.03` , `Amazon Linux 2017.09` , `Amazon Linux 2017.03` , `Amazon Linux 2016.09` , `Amazon Linux 2016.03` , `Amazon Linux 2015.09` , or `Amazon Linux 2015.03` .\\n- A supported Ubuntu operating system, such as `Ubuntu 18.04 LTS` , `Ubuntu 16.04 LTS` , `Ubuntu 14.04 LTS` , or `Ubuntu 12.04 LTS` .\\n- `CentOS Linux 7`\\n- `Red Hat Enterprise Linux 7`\\n- A supported Windows operating system, such as `Microsoft Windows Server 2012 R2 Base` , `Microsoft Windows Server 2012 R2 with SQL Server Express` , `Microsoft Windows Server 2012 R2 with SQL Server Standard` , or `Microsoft Windows Server 2012 R2 with SQL Server Web` .\\n- A custom AMI: `Custom` . You specify the custom AMI you want to use when you create instances. For more information, see [Using Custom AMIs](https://docs.aws.amazon.com/opsworks/latest/userguide/workinginstances-custom-ami.html) .\\n\\nThe default option is the current Amazon Linux version. Not all operating systems are supported with all versions of Chef. For more information about supported operating systems, see [AWS OpsWorks Stacks Operating Systems](https://docs.aws.amazon.com/opsworks/latest/userguide/workinginstances-os.html) .","DefaultRootDeviceType":"The default root device type. This value is the default for all instances in the stack, but you can override it when you create an instance. The default option is `instance-store` . For more information, see [Storage for the Root Device](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ComponentsAMIs.html#storage-for-the-root-device) .","DefaultSshKeyName":"A default Amazon EC2 key pair name. The default value is none. If you specify a key pair name, AWS OpsWorks installs the public key on the instance and you can use the private key with an SSH client to log in to the instance. For more information, see [Using SSH to Communicate with an Instance](https://docs.aws.amazon.com/opsworks/latest/userguide/workinginstances-ssh.html) and [Managing SSH Access](https://docs.aws.amazon.com/opsworks/latest/userguide/security-ssh-access.html) . You can override this setting by specifying a different key pair, or no key pair, when you [create an instance](https://docs.aws.amazon.com/opsworks/latest/userguide/workinginstances-add.html) .","DefaultSubnetId":"The stack\'s default subnet ID. All instances are launched into this subnet unless you specify another subnet ID when you create the instance. This parameter is required if you specify a value for the `VpcId` parameter. If you also specify a value for `DefaultAvailabilityZone` , the subnet must be in that zone.","EcsClusterArn":"The Amazon Resource Name (ARN) of the Amazon Elastic Container Service ( Amazon ECS ) cluster to register with the AWS OpsWorks stack.\\n\\n> If you specify a cluster that\'s registered with another AWS OpsWorks stack, AWS CloudFormation deregisters the existing association before registering the cluster.","ElasticIps":"A list of Elastic IP addresses to register with the AWS OpsWorks stack.\\n\\n> If you specify an IP address that\'s registered with another AWS OpsWorks stack, AWS CloudFormation deregisters the existing association before registering the IP address.","HostnameTheme":"The stack\'s host name theme, with spaces replaced by underscores. The theme is used to generate host names for the stack\'s instances. By default, `HostnameTheme` is set to `Layer_Dependent` , which creates host names by appending integers to the layer\'s short name. The other themes are:\\n\\n- `Baked_Goods`\\n- `Clouds`\\n- `Europe_Cities`\\n- `Fruits`\\n- `Greek_Deities_and_Titans`\\n- `Legendary_creatures_from_Japan`\\n- `Planets_and_Moons`\\n- `Roman_Deities`\\n- `Scottish_Islands`\\n- `US_Cities`\\n- `Wild_Cats`\\n\\nTo obtain a generated host name, call `GetHostNameSuggestion` , which returns a host name based on the current theme.","Name":"The stack name. Stack names can be a maximum of 64 characters.","RdsDbInstances":"The Amazon Relational Database Service ( Amazon RDS ) database instance to register with the AWS OpsWorks stack.\\n\\n> If you specify a database instance that\'s registered with another AWS OpsWorks stack, AWS CloudFormation deregisters the existing association before registering the database instance.","ServiceRoleArn":"The stack\'s IAM role, which allows AWS OpsWorks Stacks to work with AWS resources on your behalf. You must set this parameter to the Amazon Resource Name (ARN) for an existing IAM role. For more information about IAM ARNs, see [Using Identifiers](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html) .","SourceStackId":"If you\'re cloning an AWS OpsWorks stack, the stack ID of the source AWS OpsWorks stack to clone.","Tags":"A map that contains tag keys and tag values that are attached to a stack or layer.\\n\\n- The key cannot be empty.\\n- The key can be a maximum of 127 characters, and can contain only Unicode letters, numbers, or separators, or the following special characters: `+ - = . _ : /`\\n- The value can be a maximum 255 characters, and contain only Unicode letters, numbers, or separators, or the following special characters: `+ - = . _ : /`\\n- Leading and trailing white spaces are trimmed from both the key and value.\\n- A maximum of 40 tags is allowed for any resource.","UseCustomCookbooks":"Whether the stack uses custom cookbooks.","UseOpsworksSecurityGroups":"Whether to associate the AWS OpsWorks Stacks built-in security groups with the stack\'s layers.\\n\\nAWS OpsWorks Stacks provides a standard set of built-in security groups, one for each layer, which are associated with layers by default. With `UseOpsworksSecurityGroups` you can instead provide your own custom security groups. `UseOpsworksSecurityGroups` has the following settings:\\n\\n- True - AWS OpsWorks Stacks automatically associates the appropriate built-in security group with each layer (default setting). You can associate additional security groups with a layer after you create it, but you cannot delete the built-in security group.\\n- False - AWS OpsWorks Stacks does not associate built-in security groups with layers. You must create appropriate EC2 security groups and associate a security group with each layer that you create. However, you can still manually associate a built-in security group with a layer on creation; custom security groups are required only for those layers that need custom settings.\\n\\nFor more information, see [Create a New Stack](https://docs.aws.amazon.com/opsworks/latest/userguide/workingstacks-creating.html) .","VpcId":"The ID of the VPC that the stack is to be launched into. The VPC must be in the stack\'s region. All instances are launched into this VPC. You cannot change the ID later.\\n\\n- If your account supports EC2-Classic, the default value is `no VPC` .\\n- If your account does not support EC2-Classic, the default value is the default VPC for the specified region.\\n\\nIf the VPC ID corresponds to a default VPC and you have specified either the `DefaultAvailabilityZone` or the `DefaultSubnetId` parameter only, AWS OpsWorks Stacks infers the value of the other parameter. If you specify neither parameter, AWS OpsWorks Stacks sets these parameters to the first valid Availability Zone for the specified region and the corresponding default VPC subnet ID, respectively.\\n\\nIf you specify a nondefault VPC ID, note the following:\\n\\n- It must belong to a VPC in your account that is in the specified region.\\n- You must specify a value for `DefaultSubnetId` .\\n\\nFor more information about how to use AWS OpsWorks Stacks with a VPC, see [Running a Stack in a VPC](https://docs.aws.amazon.com/opsworks/latest/userguide/workingstacks-vpc.html) . For more information about default VPC and EC2-Classic, see [Supported Platforms](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-platforms.html) ."}},"AWS::OpsWorks::Stack.ChefConfiguration":{"attributes":{},"description":"Describes the Chef configuration.","properties":{"BerkshelfVersion":"The Berkshelf version.","ManageBerkshelf":"Whether to enable Berkshelf."}},"AWS::OpsWorks::Stack.ElasticIp":{"attributes":{},"description":"Describes an Elastic IP address.","properties":{"Ip":"The IP address.","Name":"The name, which can be a maximum of 32 characters."}},"AWS::OpsWorks::Stack.RdsDbInstance":{"attributes":{},"description":"Describes an Amazon RDS instance.","properties":{"DbPassword":"AWS OpsWorks Stacks returns `*****FILTERED*****` instead of the actual value.","DbUser":"The master user name.","RdsDbInstanceArn":"The instance\'s ARN."}},"AWS::OpsWorks::Stack.Source":{"attributes":{},"description":"Contains the information required to retrieve an app or cookbook from a repository. For more information, see [Creating Apps](https://docs.aws.amazon.com/opsworks/latest/userguide/workingapps-creating.html) or [Custom Recipes and Cookbooks](https://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook.html) .","properties":{"Password":"When included in a request, the parameter depends on the repository type.\\n\\n- For Amazon S3 bundles, set `Password` to the appropriate IAM secret access key.\\n- For HTTP bundles and Subversion repositories, set `Password` to the password.\\n\\nFor more information on how to safely handle IAM credentials, see [](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html) .\\n\\nIn responses, AWS OpsWorks Stacks returns `*****FILTERED*****` instead of the actual value.","Revision":"The application\'s version. AWS OpsWorks Stacks enables you to easily deploy new versions of an application. One of the simplest approaches is to have branches or revisions in your repository that represent different versions that can potentially be deployed.","SshKey":"The repository\'s SSH key. For more information, see [Using Git Repository SSH Keys](https://docs.aws.amazon.com/opsworks/latest/userguide/workingapps-deploykeys.html) in the *AWS OpsWorks User Guide* . To pass in an SSH key as a parameter, see the following example:\\n\\n`\\"Parameters\\" : { \\"GitSSHKey\\" : { \\"Description\\" : \\"Change SSH key newlines to commas.\\", \\"Type\\" : \\"CommaDelimitedList\\", \\"NoEcho\\" : \\"true\\" }, ... \\"CustomCookbooksSource\\": { \\"Revision\\" : { \\"Ref\\": \\"GitRevision\\"}, \\"SshKey\\" : { \\"Fn::Join\\" : [ \\"\\\\n\\", { \\"Ref\\": \\"GitSSHKey\\"} ] }, \\"Type\\": \\"git\\", \\"Url\\": { \\"Ref\\": \\"GitURL\\"} } ...`","Type":"The repository type.","Url":"The source URL. The following is an example of an Amazon S3 source URL: `https://s3.amazonaws.com/opsworks-demo-bucket/opsworks_cookbook_demo.tar.gz` .","Username":"This parameter depends on the repository type.\\n\\n- For Amazon S3 bundles, set `Username` to the appropriate IAM access key ID.\\n- For HTTP bundles, Git repositories, and Subversion repositories, set `Username` to the user name."}},"AWS::OpsWorks::Stack.StackConfigurationManager":{"attributes":{},"description":"Describes the configuration manager.","properties":{"Name":"The name. This parameter must be set to `Chef` .","Version":"The Chef version. This parameter must be set to 12, 11.10, or 11.4 for Linux stacks, and to 12.2 for Windows stacks. The default value for Linux stacks is 12."}},"AWS::OpsWorks::UserProfile":{"attributes":{"Ref":"`Ref` returns the IAM user ARN, such as `arn:aws:iam::123456789012:user/opsworksuser` .","SshUsername":"The user\'s SSH user name, as a string."},"description":"Describes a user\'s SSH information.","properties":{"AllowSelfManagement":"Whether users can specify their own SSH public key through the My Settings page. For more information, see [Managing User Permissions](https://docs.aws.amazon.com/opsworks/latest/userguide/security-settingsshkey.html) .","IamUserArn":"The user\'s IAM ARN.","SshPublicKey":"The user\'s SSH public key.","SshUsername":"The user\'s SSH user name."}},"AWS::OpsWorks::Volume":{"attributes":{"Ref":"`Ref` returns the AWS OpsWorks volume ID, such as `1ab23cd4-92ff-4501-b37c-example` ."},"description":"Describes an instance\'s Amazon EBS volume.","properties":{"Ec2VolumeId":"The Amazon EC2 volume ID.","MountPoint":"The volume mount point. For example, \\"/mnt/disk1\\".","Name":"The volume name. Volume names are a maximum of 128 characters.","StackId":"The stack ID."}},"AWS::OpsWorksCM::Server":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the server, such as `arn:aws:OpsWorksCM:us-east-1:123456789012:server/server-a1bzhi` .","Endpoint":"A DNS name that can be used to access the engine. Example: `myserver-asdfghjkl.us-east-1.opsworks.io` .","Ref":"`Ref` returns the server\'s ARN, such as `arn:aws:OpsWorksCM:us-east-1:123456789012:server/server-a1bzhi` .","ServerName":""},"description":"The `AWS::OpsWorksCM::Server` resource creates an AWS OpsWorks for Chef Automate or OpsWorks for Puppet Enterprise configuration management server. For more information, see [Create a Chef Automate Server in AWS CloudFormation](https://docs.aws.amazon.com/opsworks/latest/userguide/opscm-create-server-cfn.html) or [Create a Puppet Enterprise Master in AWS CloudFormation](https://docs.aws.amazon.com/opsworks/latest/userguide/opspup-create-server-cfn.html) in the *AWS OpsWorks User Guide* , and [CreateServer](https://docs.aws.amazon.com/opsworks-cm/latest/APIReference/API_CreateServer.html) in the *AWS OpsWorks CM API Reference* .","properties":{"AssociatePublicIpAddress":"Associate a public IP address with a server that you are launching. Valid values are `true` or `false` . The default value is `true` .","BackupId":"If you specify this field, AWS OpsWorks CM creates the server by using the backup represented by BackupId.","BackupRetentionCount":"The number of automated backups that you want to keep. Whenever a new backup is created, AWS OpsWorks CM deletes the oldest backups if this number is exceeded. The default value is `1` .","CustomCertificate":"Supported on servers running Chef Automate 2.0 only. A PEM-formatted HTTPS certificate. The value can be be a single, self-signed certificate, or a certificate chain. If you specify a custom certificate, you must also specify values for `CustomDomain` and `CustomPrivateKey` . The following are requirements for the `CustomCertificate` value:\\n\\n- You can provide either a self-signed, custom certificate, or the full certificate chain.\\n- The certificate must be a valid X509 certificate, or a certificate chain in PEM format.\\n- The certificate must be valid at the time of upload. A certificate can\'t be used before its validity period begins (the certificate\'s `NotBefore` date), or after it expires (the certificate\'s `NotAfter` date).\\n- The certificate’s common name or subject alternative names (SANs), if present, must match the value of `CustomDomain` .\\n- The certificate must match the value of `CustomPrivateKey` .","CustomDomain":"Supported on servers running Chef Automate 2.0 only. An optional public endpoint of a server, such as `https://aws.my-company.com` . To access the server, create a CNAME DNS record in your preferred DNS service that points the custom domain to the endpoint that is generated when the server is created (the value of the CreateServer Endpoint attribute). You cannot access the server by using the generated `Endpoint` value if the server is using a custom domain. If you specify a custom domain, you must also specify values for `CustomCertificate` and `CustomPrivateKey` .","CustomPrivateKey":"Supported on servers running Chef Automate 2.0 only. A private key in PEM format for connecting to the server by using HTTPS. The private key must not be encrypted; it cannot be protected by a password or passphrase. If you specify a custom private key, you must also specify values for `CustomDomain` and `CustomCertificate` .","DisableAutomatedBackup":"Enable or disable scheduled backups. Valid values are `true` or `false` . The default value is `true` .","Engine":"The configuration management engine to use. Valid values include `ChefAutomate` and `Puppet` .","EngineAttributes":"Optional engine attributes on a specified server.\\n\\n**Attributes accepted in a Chef createServer request:** - `CHEF_AUTOMATE_PIVOTAL_KEY` : A base64-encoded RSA public key. The corresponding private key is required to access the Chef API. When no CHEF_AUTOMATE_PIVOTAL_KEY is set, a private key is generated and returned in the response. When you are specifying the value of CHEF_AUTOMATE_PIVOTAL_KEY as a parameter in the AWS CloudFormation console, you must add newline ( `\\\\n` ) characters at the end of each line of the pivotal key value.\\n- `CHEF_AUTOMATE_ADMIN_PASSWORD` : The password for the administrative user in the Chef Automate web-based dashboard. The password length is a minimum of eight characters, and a maximum of 32. The password can contain letters, numbers, and special characters (!/@#$%^&+=_). The password must contain at least one lower case letter, one upper case letter, one number, and one special character. When no CHEF_AUTOMATE_ADMIN_PASSWORD is set, one is generated and returned in the response.\\n\\n**Attributes accepted in a Puppet createServer request:** - `PUPPET_ADMIN_PASSWORD` : To work with the Puppet Enterprise console, a password must use ASCII characters.\\n- `PUPPET_R10K_REMOTE` : The r10k remote is the URL of your control repository (for example, ssh://git@your.git-repo.com:user/control-repo.git). Specifying an r10k remote opens TCP port 8170.\\n- `PUPPET_R10K_PRIVATE_KEY` : If you are using a private Git repository, add PUPPET_R10K_PRIVATE_KEY to specify a PEM-encoded private SSH key.","EngineModel":"The engine model of the server. Valid values in this release include `Monolithic` for Puppet and `Single` for Chef.","EngineVersion":"The major release version of the engine that you want to use. For a Chef server, the valid value for EngineVersion is currently `2` . For a Puppet server, valid values are `2019` or `2017` .","InstanceProfileArn":"The ARN of the instance profile that your Amazon EC2 instances use.","InstanceType":"The Amazon EC2 instance type to use. For example, `m5.large` .","KeyPair":"The Amazon EC2 key pair to set for the instance. This parameter is optional; if desired, you may specify this parameter to connect to your instances by using SSH.","PreferredBackupWindow":"The start time for a one-hour period during which AWS OpsWorks CM backs up application-level data on your server if automated backups are enabled. Valid values must be specified in one of the following formats:\\n\\n- `HH:MM` for daily backups\\n- `DDD:HH:MM` for weekly backups\\n\\n`MM` must be specified as `00` . The specified time is in coordinated universal time (UTC). The default value is a random, daily start time.\\n\\n*Example:* `08:00` , which represents a daily start time of 08:00 UTC.\\n\\n*Example:* `Mon:08:00` , which represents a start time of every Monday at 08:00 UTC. (8:00 a.m.)","PreferredMaintenanceWindow":"The start time for a one-hour period each week during which AWS OpsWorks CM performs maintenance on the instance. Valid values must be specified in the following format: `DDD:HH:MM` . `MM` must be specified as `00` . The specified time is in coordinated universal time (UTC). The default value is a random one-hour period on Tuesday, Wednesday, or Friday. See `TimeWindowDefinition` for more information.\\n\\n*Example:* `Mon:08:00` , which represents a start time of every Monday at 08:00 UTC. (8:00 a.m.)","SecurityGroupIds":"A list of security group IDs to attach to the Amazon EC2 instance. If you add this parameter, the specified security groups must be within the VPC that is specified by `SubnetIds` .\\n\\nIf you do not specify this parameter, AWS OpsWorks CM creates one new security group that uses TCP ports 22 and 443, open to 0.0.0.0/0 (everyone).","ServiceRoleArn":"The service role that the AWS OpsWorks CM service backend uses to work with your account. Although the AWS OpsWorks management console typically creates the service role for you, if you are using the AWS CLI or API commands, run the service-role-creation.yaml AWS CloudFormation template, located at https://s3.amazonaws.com/opsworks-cm-us-east-1-prod-default-assets/misc/opsworks-cm-roles.yaml. This template creates a CloudFormation stack that includes the service role and instance profile that you need.","SubnetIds":"The IDs of subnets in which to launch the server EC2 instance.\\n\\nAmazon EC2-Classic customers: This field is required. All servers must run within a VPC. The VPC must have \\"Auto Assign Public IP\\" enabled.\\n\\nEC2-VPC customers: This field is optional. If you do not specify subnet IDs, your EC2 instances are created in a default subnet that is selected by Amazon EC2. If you specify subnet IDs, the VPC must have \\"Auto Assign Public IP\\" enabled.\\n\\nFor more information about supported Amazon EC2 platforms, see [Supported Platforms](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-platforms.html) .","Tags":"A map that contains tag keys and tag values to attach to an AWS OpsWorks for Chef Automate or OpsWorks for Puppet Enterprise server.\\n\\n- The key cannot be empty.\\n- The key can be a maximum of 127 characters, and can contain only Unicode letters, numbers, or separators, or the following special characters: `+ - = . _ : / @`\\n- The value can be a maximum 255 characters, and contain only Unicode letters, numbers, or separators, or the following special characters: `+ - = . _ : / @`\\n- Leading and trailing spaces are trimmed from both the key and value.\\n- A maximum of 50 user-applied tags is allowed for any AWS OpsWorks CM server."}},"AWS::OpsWorksCM::Server.EngineAttribute":{"attributes":{},"description":"The `EngineAttribute` property type specifies administrator credentials for an AWS OpsWorks for Chef Automate or OpsWorks for Puppet Enterprise server. `EngineAttribute` is a property of the `AWS::OpsWorksCM::Server` resource type.","properties":{"Name":"The name of the engine attribute.\\n\\n*Attribute name for Chef Automate servers:*\\n\\n- `CHEF_AUTOMATE_ADMIN_PASSWORD`\\n\\n*Attribute names for Puppet Enterprise servers:*\\n\\n- `PUPPET_ADMIN_PASSWORD`\\n- `PUPPET_R10K_REMOTE`\\n- `PUPPET_R10K_PRIVATE_KEY`","Value":"The value of the engine attribute.\\n\\n*Attribute value for Chef Automate servers:*\\n\\n- `CHEF_AUTOMATE_PIVOTAL_KEY` : A base64-encoded RSA public key. The corresponding private key is required to access the Chef API. You can generate this key by running the following [OpenSSL](https://docs.aws.amazon.com/https://www.openssl.org/) command on Linux-based computers.\\n\\n`openssl genrsa -out *pivotal_key_file_name* .pem 2048`\\n\\nOn Windows-based computers, you can use the PuTTYgen utility to generate a base64-encoded RSA private key. For more information, see [PuTTYgen - Key Generator for PuTTY on Windows](https://docs.aws.amazon.com/https://www.ssh.com/ssh/putty/windows/puttygen) on SSH.com.\\n\\n*Attribute values for Puppet Enterprise servers:*\\n\\n- `PUPPET_ADMIN_PASSWORD` : An administrator password that you can use to sign in to the Puppet Enterprise console webpage after the server is online. The password must use between 8 and 32 ASCII characters.\\n- `PUPPET_R10K_REMOTE` : The r10k remote is the URL of your control repository (for example, ssh://git@your.git-repo.com:user/control-repo.git). Specifying an r10k remote opens TCP port 8170.\\n- `PUPPET_R10K_PRIVATE_KEY` : If you are using a private Git repository, add `PUPPET_R10K_PRIVATE_KEY` to specify a PEM-encoded private SSH key."}},"AWS::Organizations::Account":{"attributes":{"AccountId":"Returns the unique identifier (ID) of the account. For example: `123456789012` .","Arn":"Returns the Amazon Resource Name (ARN) of the account. For example: `arn:aws:organizations::111111111111:account/o-exampleorgid/555555555555` .","JoinedMethod":"Returns the method by which the account joined the organization. For example: `INVITED | CREATED` .","JoinedTimestamp":"Returns the date the account became a part of the organization. For example: `2016-11-24T11:11:48-08:00` .","Ref":"`Ref` returns the `AccountId` . For example: `123456789012` .","Status":"Returns the status of the account in the organization. For example: `ACTIVE | SUSPENDED | PENDING_CLOSURE` ."},"description":"Creates an AWS account that is automatically a member of the organization whose credentials made the request.\\n\\nAWS CloudFormation uses the [`CreateAccount`](https://docs.aws.amazon.com/organizations/latest/APIReference/API_CreateAccount.html) operation to create accounts. This is an asynchronous request that AWS performs in the background. Because `CreateAccount` operates asynchronously, it can return a successful completion message even though account initialization might still be in progress. You might need to wait a few minutes before you can successfully access the account. To check the status of the request, do one of the following:\\n\\n- Use the `Id` value of the `CreateAccountStatus` response element from the `CreateAccount` operation to provide as a parameter to the [`DescribeCreateAccountStatus`](https://docs.aws.amazon.com/organizations/latest/APIReference/API_DescribeCreateAccountStatus.html) operation.\\n- Check the CloudTrail log for the `CreateAccountResult` event. For information on using CloudTrail with AWS Organizations , see [Logging and monitoring in AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_security_incident-response.html#orgs_cloudtrail-integration) in the *AWS Organizations User Guide.*\\n\\nThe user who calls the API to create an account must have the `organizations:CreateAccount` permission. If you enabled all features in the organization, AWS Organizations creates the required service-linked role named `AWSServiceRoleForOrganizations` . For more information, see [AWS Organizations and Service-Linked Roles](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_integrate_services.html#orgs_integrate_services-using_slrs) in the *AWS Organizations User Guide* .\\n\\nIf the request includes tags, then the requester must have the `organizations:TagResource` permission.\\n\\nAWS Organizations preconfigures the new member account with a role (named `OrganizationAccountAccessRole` by default) that grants users in the management account administrator permissions in the new member account. Principals in the management account can assume the role. AWS Organizations clones the company name and address information for the new account from the organization\'s management account.\\n\\nFor more information about creating accounts, see [Creating an AWS account in Your Organization](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_create.html) in the *AWS Organizations User Guide.*\\n\\nThis operation can be called only from the organization\'s management account.\\n\\n*Deleting Account resources*\\n\\nThe default `DeletionPolicy` for resource `AWS::Organizations::Account` is `Retain` . For more information about how AWS CloudFormation deletes resources, see [DeletionPolicy Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) .\\n\\n> - If you include multiple accounts in a single template, you must use the `DependsOn` attribute on each account resource type so that the accounts are created sequentially. If you create multiple accounts at the same time, Organizations returns an error and the stack operation fails.\\n> - You can\'t modify the following list of `Account` resource parameters using AWS CloudFormation updates.\\n> \\n> - AccountName\\n> - Email\\n> - RoleName\\n> \\n> If you attempt to update the listed parameters, CloudFormation will attempt the update, but you will receive an error message as those updates are not supported from an Organizations management account or a [registered delegated administrator](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-orgs-delegated-admin.html) account. Both the update and the update roll-back will fail, so you must skip the account resource update. To update parameters `AccountName` and `Email` , you must sign in to the AWS Management Console as the AWS account root user. For more information, see [Modifying the account name, email address, or password for the AWS account root user](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-root-user.html) in the *AWS Account Management Reference Guide* .\\n> - When you create an account in an organization using the AWS Organizations console, API, or AWS CLI commands, we don\'t automatically collect the information required for the account to operate as a standalone account. That includes collecting the payment method and signing the end user license agreement (EULA). If you must remove an account from your organization later, you can do so only after you provide the missing information. Follow the steps at [To leave an organization as a member account](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_remove.html#leave-without-all-info) in the *AWS Organizations User Guide* .\\n> - When you create an account in an organization using AWS CloudFormation , you can\'t specify a value for the `CreateAccount` operation parameter `IamUserAccessToBilling` . The default value for parameter `IamUserAccessToBilling` is `ALLOW` , and IAM users and roles with the required permissions can access billing information for the new account.\\n> - If you get an exception that indicates `DescribeCreateAccountStatus returns IN_PROGRESS state before time out` . You must check the account creation status using the [`DescribeCreateAccountStatus`](https://docs.aws.amazon.com/organizations/latest/APIReference/API_DescribeCreateAccountStatus.html) operation. If the account state returns as `SUCCEEDED` , you can import the account into AWS CloudFormation management using [`resource import`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import.html) .\\n> - If you get an exception that indicates you have exceeded your account quota for the organization, you can request an increase by using the [Service Quotas console](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_reference_limits.html) .\\n> - If you get an exception that indicates the operation failed because your organization is still initializing, wait one hour and then try again. If the error persists, contact [AWS Support](https://docs.aws.amazon.com/support/home#/) .\\n> - We don\'t recommend that you use the `CreateAccount` operation to create multiple temporary accounts. You can close accounts using the [`CloseAccount`](https://docs.aws.amazon.com/organizations/latest/APIReference/API_CloseAccount.html) operation or from the AWS Organizations console in the organization\'s management account. For information on the requirements and process for closing an account, see [Closing an AWS account](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_close.html) in the *AWS Organizations User Guide* .","properties":{"AccountName":"The account name given to the account when it was created.","Email":"The email address associated with the AWS account.\\n\\nThe [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) for this parameter is a string of characters that represents a standard internet email address.","ParentIds":"The unique identifier (ID) of the root or organizational unit (OU) that you want to create the new account in. If you don\'t specify this parameter, the `ParentId` defaults to the root ID.\\n\\nThis parameter only accepts a string array with one string value.\\n\\nThe [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) for a parent ID string requires one of the following:\\n\\n- *Root* - A string that begins with \\"r-\\" followed by from 4 to 32 lowercase letters or digits.\\n- *Organizational unit (OU)* - A string that begins with \\"ou-\\" followed by from 4 to 32 lowercase letters or digits (the ID of the root that the OU is in). This string is followed by a second \\"-\\" dash and from 8 to 32 additional lowercase letters or digits.","RoleName":"The name of an IAM role that AWS Organizations automatically preconfigures in the new member account. This role trusts the management account, allowing users in the management account to assume the role, as permitted by the management account administrator. The role has administrator permissions in the new member account.\\n\\nIf you don\'t specify this parameter, the role name defaults to `OrganizationAccountAccessRole` .\\n\\nFor more information about how to use this role to access the member account, see the following links:\\n\\n- [Accessing and Administering the Member Accounts in Your Organization](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_access.html#orgs_manage_accounts_create-cross-account-role) in the *AWS Organizations User Guide*\\n- Steps 2 and 3 in [Tutorial: Delegate Access Across AWS accounts Using IAM Roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html) in the *IAM User Guide*\\n\\nThe [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) that is used to validate this parameter. The pattern can include uppercase letters, lowercase letters, digits with no spaces, and any of the following characters: =,.@-","Tags":"A list of tags that you want to attach to the newly created account. For each tag in the list, you must specify both a tag key and a value. You can set the value to an empty string, but you can\'t set it to `null` . For more information about tagging, see [Tagging AWS Organizations resources](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_tagging.html) in the AWS Organizations User Guide.\\n\\n> If any one of the tags is not valid or if you exceed the maximum allowed number of tags for an account, then the entire request fails and the account is not created."}},"AWS::Organizations::Organization":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of an organization.","Id":"The unique identifier (ID) of an organization.","ManagementAccountArn":"The Amazon Resource Name (ARN) of the account that is designated as the management account for the organization.","ManagementAccountEmail":"The email address that is associated with the AWS account that is designated as the management account for the organization.","ManagementAccountId":"The unique identifier (ID) of the management account of an organization.","Ref":"`Ref` returns the `AccountId` . For example: `123456789012` .","RootId":"The unique identifier (ID) for the root."},"description":"Creates an AWS organization. The account whose user is calling the [`CreateOrganization`](https://docs.aws.amazon.com/organizations/latest/APIReference/API_CreateOrganization.html) operation automatically becomes the [management account](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html#account) of the new organization.\\n\\nThis operation must be called using credentials from the account that is to become the new organization\'s management account. The principal must also have the [relevant IAM permissions](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_create.html) .\\n\\n> - If you delete an organization, you can\'t recover it. If you created any policies inside of the organization, they\'re also deleted and you can\'t recover them.\\n> - You can delete an organization only after you remove all member accounts from the organization. If you created some of your member accounts using AWS Organizations , you might be blocked from removing those accounts. You can remove a member account only if it has all the information that\'s required to operate as a standalone AWS account. For more information about how to provide that information and then remove the account, see [Leaving an organization as a member account](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_remove.html#orgs_manage_accounts_leave-as-member) in the *AWS Organizations User Guide* .\\n> - If you closed a member account before you remove it from the organization, it enters a \'suspended\' state for a period of time and you can\'t remove the account from the organization until it is finally closed. This can take up to 90 days and can prevent you from deleting the organization until all member accounts are completely closed.\\n> \\n> For more information, see [Deleting the organization by removing the management account](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_delete.html) in the *AWS Organizations User Guide* .","properties":{"FeatureSet":"Specifies the feature set supported by the new organization. Each feature set supports different levels of functionality.\\n\\n- `ALL` In addition to all the features supported by the consolidated billing feature set, the management account gains access to advanced features that give you more control over accounts in your organization. By default or if you set the `FeatureSet` property to `ALL` , the new organization is created with all features enabled and service control policies automatically enabled in the [root](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html#root) . For more information, see [All features](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html#feature-set-all) in the *AWS Organizations User Guide* .\\n- `CONSOLIDATED_BILLING` All member accounts have their bills consolidated to and paid by the management account. For more information, see [Consolidated billing](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html#feature-set-cb-only) in the *AWS Organizations User Guide.*\\n\\nThe consolidated billing feature subset isn\'t available for organizations in the AWS GovCloud (US) Region.\\n\\nFeature set `ALL` provides the following advanced features:\\n\\n- Apply any [policy type](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies.html#orgs-policy-types) to any member account in the organization.\\n- Apply [service control policies (SCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) to member accounts that restrict the services and actions that users (including the root user) and roles in an account can access. Using SCPs you can prevent member accounts from leaving the organization.\\n- Enable [integration with supported AWS services](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_integrate_services_list.html) to let those services provide functionality across all of the accounts in your organization.\\n\\nIf you don\'t specify this property, the default value is `ALL` ."}},"AWS::Organizations::OrganizationalUnit":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of this OU. For example: `arn:aws:organizations::111111111111:ou/o-exampleorgid/ou-examplerootid111-exampleouid111` .","Id":"The unique identifier (ID) associated with this OU. For example: `ou-examplerootid111-exampleouid111` .","Ref":"`Ref` returns the `Id` . For example: `ou-examplerootid111-exampleouid111` ."},"description":"Creates an organizational unit (OU) within a root or parent OU. An OU is a container for accounts that enables you to organize your accounts to apply policies according to your business requirements. The number of levels deep that you can nest OUs is dependent upon the policy types enabled for that root. For service control policies, the limit is five.\\n\\nFor more information about OUs, see [Managing Organizational Units](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_ous.html) in the *AWS Organizations User Guide.*\\n\\nIf the request includes tags, then the requester must have the `organizations:TagResource` permission.\\n\\nThis operation can be called only from the organization\'s management account.","properties":{"Name":"The friendly name of this OU.\\n\\nThe [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) that is used to validate this parameter is a string of any of the characters in the ASCII character range.","ParentId":"The unique identifier (ID) of the parent root or OU that you want to create the new OU in.\\n\\n> To update the `ParentId` parameter value, you must first remove all accounts attached to the organizational unit (OU). OUs can\'t be moved within the organization with accounts still attached. \\n\\nThe [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) for a parent ID string requires one of the following:\\n\\n- *Root* - A string that begins with \\"r-\\" followed by from 4 to 32 lowercase letters or digits.\\n- *Organizational unit (OU)* - A string that begins with \\"ou-\\" followed by from 4 to 32 lowercase letters or digits (the ID of the root that the OU is in). This string is followed by a second \\"-\\" dash and from 8 to 32 additional lowercase letters or digits.","Tags":"A list of tags that you want to attach to the newly created OU. For each tag in the list, you must specify both a tag key and a value. You can set the value to an empty string, but you can\'t set it to `null` . For more information about tagging, see [Tagging AWS Organizations resources](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_tagging.html) in the AWS Organizations User Guide.\\n\\n> If any one of the tags is not valid or if you exceed the allowed number of tags for an OU, then the entire request fails and the OU is not created."}},"AWS::Organizations::Policy":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the policy. For example: `arn:aws:organizations::111111111111:policy/o-exampleorgid/service_control_policy/p-examplepolicyid111` .","AwsManaged":"Returns a boolean value that indicates whether the specified policy is an AWS managed policy. If true, then you can attach the policy to roots, OUs, or accounts, but you cannot edit it. For example: `true | false` .","Id":"Returns the unique identifier (ID) of the policy. For example: `p-examplepolicyid111` .","Ref":"`Ref` returns the `Id` . For example: `p-examplepolicyid111` ."},"description":"Creates a policy of a specified type that you can attach to a root, an organizational unit (OU), or an individual AWS account .\\n\\nFor more information about policies and their use, see [Managing Organization Policies](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies.html) .\\n\\nIf the request includes tags, then the requester must have the `organizations:TagResource` permission.\\n\\nThis operation can be called only from the organization\'s management account.\\n\\n> Before you can create a policy of a given type, you must first [enable that policy type](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_enable-disable.html) in your organization.","properties":{"Content":"The policy text content. You can specify the policy content as a JSON object or a JSON string.\\n\\n> When you specify the policy content as a JSON string, you can\'t perform drift detection on the CloudFormation stack. For this reason, we recommend specifying the policy content as a JSON object instead. \\n\\nThe text that you supply must adhere to the rules of the policy type you specify in the `Type` parameter. The following AWS Organizations quotas are enforced for the maximum size of a policy document:\\n\\n- Service control policies: 5,120 bytes *(not characters)*\\n- AI services opt-out policies: 2,500 characters\\n- Backup policies: 10,000 characters\\n- Tag policies: 10,000 characters\\n\\nFor more information about Organizations service quotas, see [Quotas for AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_reference_limits.html) in the *AWS Organizations User Guide* .","Description":"Human readable description of the policy.","Name":"Name of the policy.\\n\\nThe [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) that is used to validate this parameter is a string of any of the characters in the ASCII character range.","Tags":"A list of tags that you want to attach to the newly created policy. For each tag in the list, you must specify both a tag key and a value. You can set the value to an empty string, but you can\'t set it to `null` . For more information about tagging, see [Tagging AWS Organizations resources](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_tagging.html) in the AWS Organizations User Guide.\\n\\n> If any one of the tags is not valid or if you exceed the allowed number of tags for a policy, then the entire request fails and the policy is not created.","TargetIds":"List of unique identifiers (IDs) of the root, OU, or account that you want to attach the policy to. You can get the ID by calling the [ListRoots](https://docs.aws.amazon.com/organizations/latest/APIReference/API_ListRoots.html) , [ListOrganizationalUnitsForParent](https://docs.aws.amazon.com/organizations/latest/APIReference/API_ListOrganizationalUnitsForParent.html) , or [ListAccounts](https://docs.aws.amazon.com/organizations/latest/APIReference/API_ListAccounts.html) operations. If you don\'t specify this parameter, the policy is created but not attached to any organization resource.\\n\\nThe [regex pattern](https://docs.aws.amazon.com/http://wikipedia.org/wiki/regex) for a target ID string requires one of the following:\\n\\n- *Root* - A string that begins with \\"r-\\" followed by from 4 to 32 lowercase letters or digits.\\n- *Account* - A string that consists of exactly 12 digits.\\n- *Organizational unit (OU)* - A string that begins with \\"ou-\\" followed by from 4 to 32 lowercase letters or digits (the ID of the root that the OU is in). This string is followed by a second \\"-\\" dash and from 8 to 32 additional lowercase letters or digits.","Type":"The type of policy to create."}},"AWS::Organizations::ResourcePolicy":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the policy. For example: `arn:aws:organizations::111111111111:resourcepolicy/o-exampleorgid/rp-examplepolicyid111` .","Id":"Returns the unique identifier (ID) of the resource policy. For example: `rp-examplepolicyid111` .","Ref":"`Ref` returns the `Id` . For example: `rp-examplepolicyid111` ."},"description":"Creates or updates a resource-based delegation policy that can be used to delegate policy management for AWS Organizations to specified member accounts to perform policy actions that are by default available only to the management account.\\n\\nFor more information about delegated policy management, see [Delegated administrator for AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_delegate_policies.html) in the *AWS Organizations User Guide* .\\n\\nYou can only call this operation from the organization\'s management account.","properties":{"Content":"The policy text of the organization resource policy. You can specify the resource policy content as a JSON object or a JSON string.\\n\\n> When you specify the resource policy content as a JSON string, you can\'t perform drift detection on the CloudFormation stack. For this reason, we recommend specifying the resource policy content as a JSON object instead.","Tags":"A list of tags that you want to attach to the newly created resource policy. For each tag in the list, you must specify both a tag key and a value. You can set the value to an empty string, but you can\'t set it to `null` . For more information about tagging, see [Tagging AWS Organizations resources](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_tagging.html) in the *AWS Organizations User Guide* .\\n\\n> If any one of the tags is not valid or if you exceed the allowed number of tags for the resource policy, then the entire request fails and the resource policy is not created."}},"AWS::Panorama::ApplicationInstance":{"attributes":{"ApplicationInstanceId":"The application instance\'s ID.","Arn":"The application instance\'s ARN.","CreatedTime":"The application instance\'s created time.","DefaultRuntimeContextDeviceName":"The application instance\'s default runtime context device name.","HealthStatus":"The application instance\'s health status.","LastUpdatedTime":"The application instance\'s last updated time.","Ref":"","Status":"The application instance\'s status.","StatusDescription":"The application instance\'s status description."},"description":"Creates an application instance and deploys it to a device.","properties":{"ApplicationInstanceIdToReplace":"The ID of an application instance to replace with the new instance.","DefaultRuntimeContextDevice":"The device\'s ID.","Description":"A description for the application instance.","ManifestOverridesPayload":"Setting overrides for the application manifest.","ManifestPayload":"The application\'s manifest document.","Name":"A name for the application instance.","RuntimeRoleArn":"The ARN of a runtime role for the application instance.","Tags":"Tags for the application instance."}},"AWS::Panorama::ApplicationInstance.ManifestOverridesPayload":{"attributes":{},"description":"Parameter overrides for an application instance. This is a JSON document that has a single key ( `PayloadData` ) where the value is an escaped string representation of the overrides document.","properties":{"PayloadData":"The overrides document."}},"AWS::Panorama::ApplicationInstance.ManifestPayload":{"attributes":{},"description":"A application verion\'s manifest file. This is a JSON document that has a single key ( `PayloadData` ) where the value is an escaped string representation of the application manifest ( `graph.json` ). This file is located in the `graphs` folder in your application source.","properties":{"PayloadData":"The application manifest."}},"AWS::Panorama::Package":{"attributes":{"Arn":"The package\'s ARN.","CreatedTime":"The item\'s created time.","PackageId":"The package\'s ID.","Ref":"","StorageLocation.BinaryPrefixLocation":"","StorageLocation.Bucket":"","StorageLocation.GeneratedPrefixLocation":"","StorageLocation.ManifestPrefixLocation":"","StorageLocation.RepoPrefixLocation":""},"description":"Creates a package and storage location in an Amazon S3 access point.","properties":{"PackageName":"A name for the package.","StorageLocation":"","Tags":"Tags for the package."}},"AWS::Panorama::Package.StorageLocation":{"attributes":{},"description":"","properties":{"BinaryPrefixLocation":"","Bucket":"","GeneratedPrefixLocation":"","ManifestPrefixLocation":"","RepoPrefixLocation":""}},"AWS::Panorama::PackageVersion":{"attributes":{"IsLatestPatch":"Whether the package version is the latest version.","PackageArn":"The package version\'s ARN.","PackageName":"The package version\'s name.","Ref":"","RegisteredTime":"The package version\'s registered time.","Status":"The package version\'s status.","StatusDescription":"The package version\'s status description."},"description":"Registers a package version.","properties":{"MarkLatest":"Whether to mark the new version as the latest version.","OwnerAccount":"An owner account.","PackageId":"A package ID.","PackageVersion":"A package version.","PatchVersion":"A patch version.","UpdatedLatestPatchVersion":"If the version was marked latest, the new version to maker as latest."}},"AWS::Personalize::Dataset":{"attributes":{"DatasetArn":"The Amazon Resource Name (ARN) of the dataset.","Ref":"`Ref` returns the name of the resource."},"description":"Creates an empty dataset and adds it to the specified dataset group. Use [CreateDatasetImportJob](https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetImportJob.html) to import your training data to a dataset.\\n\\nThere are three types of datasets:\\n\\n- Interactions\\n- Items\\n- Users\\n\\nEach dataset type has an associated schema with required field types. Only the `Interactions` dataset is required in order to train a model (also referred to as creating a solution).\\n\\nA dataset can be in one of the following states:\\n\\n- CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED\\n- DELETE PENDING > DELETE IN_PROGRESS\\n\\nTo get the status of the dataset, call [DescribeDataset](https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDataset.html) .\\n\\n**Related APIs** - [CreateDatasetGroup](https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetGroup.html)\\n- [ListDatasets](https://docs.aws.amazon.com/personalize/latest/dg/API_ListDatasets.html)\\n- [DescribeDataset](https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDataset.html)\\n- [DeleteDataset](https://docs.aws.amazon.com/personalize/latest/dg/API_DeleteDataset.html)","properties":{"DatasetGroupArn":"The Amazon Resource Name (ARN) of the dataset group.","DatasetImportJob":"Describes a job that imports training data from a data source (Amazon S3 bucket) to an Amazon Personalize dataset.","DatasetType":"One of the following values:\\n\\n- Interactions\\n- Items\\n- Users","Name":"The name of the dataset.","SchemaArn":"The ARN of the associated schema."}},"AWS::Personalize::Dataset.DataSource":{"attributes":{},"description":"","properties":{"DataLocation":""}},"AWS::Personalize::Dataset.DatasetImportJob":{"attributes":{},"description":"Describes a job that imports training data from a data source (Amazon S3 bucket) to an Amazon Personalize dataset. For more information, see [CreateDatasetImportJob](https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetImportJob.html) .\\n\\nA dataset import job can be in one of the following states:\\n\\n- CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED","properties":{"DataSource":"The Amazon S3 bucket that contains the training data to import.","DatasetArn":"The Amazon Resource Name (ARN) of the dataset that receives the imported data.","DatasetImportJobArn":"The ARN of the dataset import job.","JobName":"The name of the import job.","RoleArn":"The ARN of the IAM role that has permissions to read from the Amazon S3 data source."}},"AWS::Personalize::DatasetGroup":{"attributes":{"DatasetGroupArn":"The Amazon Resource Name (ARN) of the dataset group.","Ref":"`Ref` returns the name of the resource."},"description":"A dataset group is a collection of related datasets (Interactions, User, and Item). You create a dataset group by calling [CreateDatasetGroup](https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetGroup.html) . You then create a dataset and add it to a dataset group by calling [CreateDataset](https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDataset.html) . The dataset group is used to create and train a solution by calling [CreateSolution](https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html) . A dataset group can contain only one of each type of dataset.\\n\\nYou can specify an AWS Key Management Service (KMS) key to encrypt the datasets in the group.","properties":{"Domain":"The domain of a Domain dataset group.","KmsKeyArn":"The Amazon Resource Name (ARN) of the AWS Key Management Service (KMS) key used to encrypt the datasets.","Name":"The name of the dataset group.","RoleArn":"The ARN of the IAM role that has permissions to create the dataset group."}},"AWS::Personalize::Schema":{"attributes":{"Ref":"`Ref` returns the name of the resource.","SchemaArn":"The Amazon Resource Name (ARN) of the schema."},"description":"Creates an Amazon Personalize schema from the specified schema string. The schema you create must be in Avro JSON format.\\n\\nAmazon Personalize recognizes three schema variants. Each schema is associated with a dataset type and has a set of required field and keywords. If you are creating a schema for a dataset in a Domain dataset group, you provide the domain of the Domain dataset group. You specify a schema when you call [CreateDataset](https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDataset.html) .\\n\\nFor more information on schemas, see [Datasets and schemas](https://docs.aws.amazon.com/personalize/latest/dg/how-it-works-dataset-schema.html) .\\n\\n**Related APIs** - [ListSchemas](https://docs.aws.amazon.com/personalize/latest/dg/API_ListSchemas.html)\\n- [DescribeSchema](https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSchema.html)\\n- [DeleteSchema](https://docs.aws.amazon.com/personalize/latest/dg/API_DeleteSchema.html)","properties":{"Domain":"The domain of a schema that you created for a dataset in a Domain dataset group.","Name":"The name of the schema.","Schema":"The schema."}},"AWS::Personalize::Solution":{"attributes":{"Ref":"`Ref` returns the name of the resource.","SolutionArn":"The Amazon Resource Name (ARN) of the solution."},"description":"An object that provides information about a solution. A solution is a trained model that can be deployed as a campaign.","properties":{"DatasetGroupArn":"The Amazon Resource Name (ARN) of the dataset group that provides the training data.","EventType":"The event type (for example, \'click\' or \'like\') that is used for training the model. If no `eventType` is provided, Amazon Personalize uses all interactions for training with equal weight regardless of type.","Name":"The name of the solution.","PerformAutoML":"> We don\'t recommend enabling automated machine learning. Instead, match your use case to the available Amazon Personalize recipes. For more information, see [Determining your use case.](https://docs.aws.amazon.com/personalize/latest/dg/determining-use-case.html) \\n\\nWhen true, Amazon Personalize performs a search for the best USER_PERSONALIZATION recipe from the list specified in the solution configuration ( `recipeArn` must not be specified). When false (the default), Amazon Personalize uses `recipeArn` for training.","PerformHPO":"Whether to perform hyperparameter optimization (HPO) on the chosen recipe. The default is `false` .","RecipeArn":"The ARN of the recipe used to create the solution. This is required when `performAutoML` is false.","SolutionConfig":"Describes the configuration properties for the solution."}},"AWS::Personalize::Solution.AlgorithmHyperParameterRanges":{"attributes":{},"description":"","properties":{"CategoricalHyperParameterRanges":"","ContinuousHyperParameterRanges":"","IntegerHyperParameterRanges":""}},"AWS::Personalize::Solution.AutoMLConfig":{"attributes":{},"description":"","properties":{"MetricName":"","RecipeList":""}},"AWS::Personalize::Solution.CategoricalHyperParameterRange":{"attributes":{},"description":"","properties":{"Name":"","Values":""}},"AWS::Personalize::Solution.ContinuousHyperParameterRange":{"attributes":{},"description":"","properties":{"MaxValue":"","MinValue":"","Name":""}},"AWS::Personalize::Solution.HpoConfig":{"attributes":{},"description":"","properties":{"AlgorithmHyperParameterRanges":"","HpoObjective":"","HpoResourceConfig":""}},"AWS::Personalize::Solution.HpoObjective":{"attributes":{},"description":"","properties":{"MetricName":"","MetricRegex":"","Type":""}},"AWS::Personalize::Solution.HpoResourceConfig":{"attributes":{},"description":"","properties":{"MaxNumberOfTrainingJobs":"","MaxParallelTrainingJobs":""}},"AWS::Personalize::Solution.IntegerHyperParameterRange":{"attributes":{},"description":"","properties":{"MaxValue":"","MinValue":"","Name":""}},"AWS::Personalize::Solution.SolutionConfig":{"attributes":{},"description":"Describes the configuration properties for the solution.","properties":{"AlgorithmHyperParameters":"Lists the hyperparameter names and ranges.","AutoMLConfig":"The [AutoMLConfig](https://docs.aws.amazon.com/personalize/latest/dg/API_AutoMLConfig.html) object containing a list of recipes to search when AutoML is performed.","EventValueThreshold":"Only events with a value greater than or equal to this threshold are used for training a model.","FeatureTransformationParameters":"Lists the feature transformation parameters.","HpoConfig":"Describes the properties for hyperparameter optimization (HPO)."}},"AWS::Pinpoint::ADMChannel":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the channel is associated with."},"description":"A *channel* is a type of platform that you can deliver messages to. You can use the ADM channel to send push notifications through the Amazon Device Messaging (ADM) service to apps that run on Amazon devices, such as Kindle Fire tablets. Before you can use Amazon Pinpoint to send messages to Amazon devices, you have to enable the ADM channel for an Amazon Pinpoint application.\\n\\nThe ADMChannel resource represents the status and authentication settings for the ADM channel for an application.","properties":{"ApplicationId":"The unique identifier for the Amazon Pinpoint application that the ADM channel applies to.","ClientId":"The Client ID that you received from Amazon to send messages by using ADM.","ClientSecret":"The Client Secret that you received from Amazon to send messages by using ADM.","Enabled":"Specifies whether to enable the ADM channel for the application."}},"AWS::Pinpoint::APNSChannel":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the channel is associated with."},"description":"A *channel* is a type of platform that you can deliver messages to. You can use the APNs channel to send push notification messages to the Apple Push Notification service (APNs). Before you can use Amazon Pinpoint to send notifications to APNs, you have to enable the APNs channel for an Amazon Pinpoint application.\\n\\nThe APNSChannel resource represents the status and authentication settings for the APNs channel for an application.","properties":{"ApplicationId":"The unique identifier for the Amazon Pinpoint application that the APNs channel applies to.","BundleId":"The bundle identifier that\'s assigned to your iOS app. This identifier is used for APNs tokens.","Certificate":"The APNs client certificate that you received from Apple. Specify this value if you want Amazon Pinpoint to communicate with APNs by using an APNs certificate.","DefaultAuthenticationMethod":"The default authentication method that you want Amazon Pinpoint to use when authenticating with APNs. Valid options are `key` or `certificate` .","Enabled":"Specifies whether to enable the APNs channel for the application.","PrivateKey":"The private key for the APNs client certificate that you want Amazon Pinpoint to use to communicate with APNs.","TeamId":"The identifier that\'s assigned to your Apple Developer Account team. This identifier is used for APNs tokens.","TokenKey":"The authentication key to use for APNs tokens.","TokenKeyId":"The key identifier that\'s assigned to your APNs signing key. Specify this value if you want Amazon Pinpoint to communicate with APNs by using APNs tokens."}},"AWS::Pinpoint::APNSSandboxChannel":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the channel is associated with."},"description":"A *channel* is a type of platform that you can deliver messages to. You can use the APNs sandbox channel to send push notification messages to the sandbox environment of the Apple Push Notification service (APNs). Before you can use Amazon Pinpoint to send notifications to the APNs sandbox environment, you have to enable the APNs sandbox channel for an Amazon Pinpoint application.\\n\\nThe APNSSandboxChannel resource represents the status and authentication settings of the APNs sandbox channel for an application.","properties":{"ApplicationId":"The unique identifier for the Amazon Pinpoint application that the APNs sandbox channel applies to.","BundleId":"The bundle identifier that\'s assigned to your iOS app. This identifier is used for APNs tokens.","Certificate":"The APNs client certificate that you received from Apple. Specify this value if you want Amazon Pinpoint to communicate with APNs by using an APNs certificate.","DefaultAuthenticationMethod":"The default authentication method that you want Amazon Pinpoint to use when authenticating with APNs. Valid options are `key` or `certificate` .","Enabled":"Specifies whether to enable the APNs Sandbox channel for the Amazon Pinpoint application.","PrivateKey":"The private key for the APNs client certificate that you want Amazon Pinpoint to use to communicate with APNs.","TeamId":"The identifier that\'s assigned to your Apple Developer Account team. This identifier is used for APNs tokens.","TokenKey":"The authentication key to use for APNs tokens.","TokenKeyId":"The key identifier that\'s assigned to your APNs signing key. Specify this value if you want Amazon Pinpoint to communicate with APNs by using APNs tokens."}},"AWS::Pinpoint::APNSVoipChannel":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the channel is associated with."},"description":"A *channel* is a type of platform that you can deliver messages to. You can use the APNs VoIP channel to send VoIP notification messages to the Apple Push Notification service (APNs). Before you can use Amazon Pinpoint to send VoIP notifications to APNs, you have to enable the APNs VoIP channel for an Amazon Pinpoint application.\\n\\nThe APNSVoipChannel resource represents the status and authentication settings of the APNs VoIP channel for an application.","properties":{"ApplicationId":"The unique identifier for the Amazon Pinpoint application that the APNs VoIP channel applies to.","BundleId":"The bundle identifier that\'s assigned to your iOS app. This identifier is used for APNs tokens.","Certificate":"The APNs client certificate that you received from Apple. Specify this value if you want Amazon Pinpoint to communicate with APNs by using an APNs certificate.","DefaultAuthenticationMethod":"The default authentication method that you want Amazon Pinpoint to use when authenticating with APNs. Valid options are `key` or `certificate` .","Enabled":"Specifies whether to enable the APNs VoIP channel for the Amazon Pinpoint application.","PrivateKey":"The private key for the APNs client certificate that you want Amazon Pinpoint to use to communicate with APNs.","TeamId":"The identifier that\'s assigned to your Apple Developer Account team. This identifier is used for APNs tokens.","TokenKey":"The authentication key to use for APNs tokens.","TokenKeyId":"The key identifier that\'s assigned to your APNs signing key. Specify this value if you want Amazon Pinpoint to communicate with APNs by using APNs tokens."}},"AWS::Pinpoint::APNSVoipSandboxChannel":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the channel is associated with."},"description":"A *channel* is a type of platform that you can deliver messages to. You can use the APNs VoIP sandbox channel to send VoIP notification messages to the sandbox environment of the Apple Push Notification service (APNs). Before you can use Amazon Pinpoint to send VoIP notifications to the APNs sandbox environment, you have to enable the APNs VoIP sandbox channel for an Amazon Pinpoint application.\\n\\nThe APNSVoipSandboxChannel resource represents the status and authentication settings of the APNs VoIP sandbox channel for an application.","properties":{"ApplicationId":"The unique identifier for the application that the APNs VoIP sandbox channel applies to.","BundleId":"The bundle identifier that\'s assigned to your iOS app. This identifier is used for APNs tokens.","Certificate":"The APNs client certificate that you received from Apple. Specify this value if you want Amazon Pinpoint to communicate with the APNs sandbox environment by using an APNs certificate.","DefaultAuthenticationMethod":"The default authentication method that you want Amazon Pinpoint to use when authenticating with APNs. Valid options are `key` or `certificate` .","Enabled":"Specifies whether the APNs VoIP sandbox channel is enabled for the application.","PrivateKey":"The private key for the APNs client certificate that you want Amazon Pinpoint to use to communicate with the APNs sandbox environment.","TeamId":"The identifier that\'s assigned to your Apple developer account team. This identifier is used for APNs tokens.","TokenKey":"The authentication key to use for APNs tokens.","TokenKeyId":"The key identifier that\'s assigned to your APNs signing key. Specify this value if you want Amazon Pinpoint to communicate with the APNs sandbox environment by using APNs tokens."}},"AWS::Pinpoint::App":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the application.","Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application."},"description":"An *app* is an Amazon Pinpoint application, also referred to as a *project* . An application is a collection of related settings, customer information, segments, campaigns, and other types of Amazon Pinpoint resources.\\n\\nThe App resource represents an Amazon Pinpoint application.","properties":{"Name":"The display name of the application.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::Pinpoint::ApplicationSettings":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that you\'re specifying the settings for."},"description":"Specifies the settings for an Amazon Pinpoint application. In Amazon Pinpoint, an *application* (also referred to as an *app* or *project* ) is a collection of related settings, customer information, segments, and campaigns, and other types of Amazon Pinpoint resources.","properties":{"ApplicationId":"The unique identifier for the Amazon Pinpoint application.","CampaignHook":"The settings for the Lambda function to use by default as a code hook for campaigns in the application. To override these settings for a specific campaign, use the Campaign resource to define custom Lambda function settings for the campaign.","CloudWatchMetricsEnabled":"Specifies whether to enable application-related alarms in Amazon CloudWatch.","Limits":"The default sending limits for campaigns in the application. To override these limits for a specific campaign, use the Campaign resource to define custom limits for the campaign.","QuietTime":"The default quiet time for campaigns in the application. Quiet time is a specific time range when campaigns don\'t send messages to endpoints, if all the following conditions are met:\\n\\n- The `EndpointDemographic.Timezone` property of the endpoint is set to a valid value.\\n\\n- The current time in the endpoint\'s time zone is later than or equal to the time specified by the `QuietTime.Start` property for the application (or a campaign that has custom quiet time settings).\\n\\n- The current time in the endpoint\'s time zone is earlier than or equal to the time specified by the `QuietTime.End` property for the application (or a campaign that has custom quiet time settings).\\n\\nIf any of the preceding conditions isn\'t met, the endpoint will receive messages from a campaign, even if quiet time is enabled.\\n\\nTo override the default quiet time settings for a specific campaign, use the Campaign resource to define a custom quiet time for the campaign."}},"AWS::Pinpoint::ApplicationSettings.CampaignHook":{"attributes":{},"description":"Specifies the Lambda function to use by default as a code hook for campaigns in the application.","properties":{"LambdaFunctionName":"The name or Amazon Resource Name (ARN) of the Lambda function that Amazon Pinpoint invokes to send messages for campaigns in the application.","Mode":"The mode that Amazon Pinpoint uses to invoke the Lambda function. Possible values are:\\n\\n- `FILTER` - Invoke the function to customize the segment that\'s used by a campaign.\\n- `DELIVERY` - (Deprecated) Previously, invoked the function to send a campaign through a custom channel. This functionality is not supported anymore. To send a campaign through a custom channel, use the `CustomDeliveryConfiguration` and `CampaignCustomMessage` objects of the campaign.","WebUrl":"The web URL that Amazon Pinpoint calls to invoke the Lambda function over HTTPS."}},"AWS::Pinpoint::ApplicationSettings.Limits":{"attributes":{},"description":"Specifies the default sending limits for campaigns in the application.","properties":{"Daily":"The maximum number of messages that a campaign can send to a single endpoint during a 24-hour period. The maximum value is 100.","MaximumDuration":"The maximum amount of time, in seconds, that a campaign can attempt to deliver a message after the scheduled start time for the campaign. The minimum value is 60 seconds.","MessagesPerSecond":"The maximum number of messages that a campaign can send each second. The minimum value is 1. The maximum value is 20,000.","Total":"The maximum number of messages that a campaign can send to a single endpoint during the course of the campaign. The maximum value is 100."}},"AWS::Pinpoint::ApplicationSettings.QuietTime":{"attributes":{},"description":"Specifies the start and end times that define a time range when messages aren\'t sent to endpoints.","properties":{"End":"The specific time when quiet time ends. This value has to use 24-hour notation and be in HH:MM format, where HH is the hour (with a leading zero, if applicable) and MM is the minutes. For example, use `02:30` to represent 2:30 AM, or `14:30` to represent 2:30 PM.","Start":"The specific time when quiet time begins. This value has to use 24-hour notation and be in HH:MM format, where HH is the hour (with a leading zero, if applicable) and MM is the minutes. For example, use `02:30` to represent 2:30 AM, or `14:30` to represent 2:30 PM."}},"AWS::Pinpoint::BaiduChannel":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the channel is associated with."},"description":"A *channel* is a type of platform that you can deliver messages to. You can use the Baidu channel to send notifications to the Baidu Cloud Push notification service. Before you can use Amazon Pinpoint to send notifications to the Baidu Cloud Push service, you have to enable the Baidu channel for an Amazon Pinpoint application.\\n\\nThe BaiduChannel resource represents the status and authentication settings of the Baidu channel for an application.","properties":{"ApiKey":"The API key that you received from the Baidu Cloud Push service to communicate with the service.","ApplicationId":"The unique identifier for the Amazon Pinpoint application that you\'re configuring the Baidu channel for.","Enabled":"Specifies whether to enable the Baidu channel for the application.","SecretKey":"The secret key that you received from the Baidu Cloud Push service to communicate with the service."}},"AWS::Pinpoint::Campaign":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the campaign.","CampaignId":"The unique identifier for the campaign.","Ref":"`Ref` returns a string that combines the unique identifier for the Amazon Pinpoint application with the unique identifier for the segment that the campaign targets."},"description":"Specifies the settings for a campaign. A *campaign* is a messaging initiative that engages a specific segment of users for an Amazon Pinpoint application.","properties":{"AdditionalTreatments":"An array of requests that defines additional treatments for the campaign, in addition to the default treatment for the campaign.","ApplicationId":"The unique identifier for the Amazon Pinpoint application that the campaign is associated with.","CampaignHook":"Specifies the Lambda function to use as a code hook for a campaign.","CustomDeliveryConfiguration":"The delivery configuration settings for sending the treatment through a custom channel. This object is required if the `MessageConfiguration` object for the treatment specifies a `CustomMessage` object.","Description":"A custom description of the campaign.","HoldoutPercent":"The allocated percentage of users (segment members) who shouldn\'t receive messages from the campaign.","IsPaused":"Specifies whether to pause the campaign. A paused campaign doesn\'t run unless you resume it by changing this value to `false` . If you restart a campaign, the campaign restarts from the beginning and not at the point you paused it. If a campaign is running it will complete and then pause. Pause only pauses or skips the next run for a recurring future scheduled campaign. A campaign scheduled for immediate can\'t be paused.","Limits":"The messaging limits for the campaign.","MessageConfiguration":"The message configuration settings for the campaign.","Name":"The name of the campaign.","Priority":"An integer between 1 and 5, inclusive, that represents the priority of the in-app message campaign, where 1 is the highest priority and 5 is the lowest. If there are multiple messages scheduled to be displayed at the same time, the priority determines the order in which those messages are displayed.","Schedule":"The schedule settings for the campaign.","SegmentId":"The unique identifier for the segment to associate with the campaign.","SegmentVersion":"The version of the segment to associate with the campaign.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","TemplateConfiguration":"The message template to use for the treatment.","TreatmentDescription":"A custom description of the default treatment for the campaign.","TreatmentName":"A custom name of the default treatment for the campaign, if the campaign has multiple treatments. A *treatment* is a variation of a campaign that\'s used for A/B testing."}},"AWS::Pinpoint::Campaign.AttributeDimension":{"attributes":{},"description":"Specifies attribute-based criteria for including or excluding endpoints from a segment.","properties":{"AttributeType":"The type of segment dimension to use. Valid values are:\\n\\n- `INCLUSIVE` – endpoints that have attributes matching the values are included in the segment.\\n- `EXCLUSIVE` – endpoints that have attributes matching the values are excluded from the segment.\\n- `CONTAINS` – endpoints that have attributes\' substrings match the values are included in the segment.\\n- `BEFORE` – endpoints with attributes read as ISO_INSTANT datetimes before the value are included in the segment.\\n- `AFTER` – endpoints with attributes read as ISO_INSTANT datetimes after the value are included in the segment.\\n- `BETWEEN` – endpoints with attributes read as ISO_INSTANT datetimes between the values are included in the segment.\\n- `ON` – endpoints with attributes read as ISO_INSTANT dates on the value are included in the segment. Time is ignored in this comparison.","Values":"The criteria values to use for the segment dimension. Depending on the value of the `AttributeType` property, endpoints are included or excluded from the segment if their attribute values match the criteria values."}},"AWS::Pinpoint::Campaign.CampaignCustomMessage":{"attributes":{},"description":"Specifies the contents of a message that\'s sent through a custom channel to recipients of a campaign.","properties":{"Data":"The raw, JSON-formatted string to use as the payload for the message. The maximum size is 5 KB."}},"AWS::Pinpoint::Campaign.CampaignEmailMessage":{"attributes":{},"description":"Specifies the content and \\"From\\" address for an email message that\'s sent to recipients of a campaign.","properties":{"Body":"The body of the email for recipients whose email clients don\'t render HTML content.","FromAddress":"The verified email address to send the email from. The default address is the `FromAddress` specified for the email channel for the application.","HtmlBody":"The body of the email, in HTML format, for recipients whose email clients render HTML content.","Title":"The subject line, or title, of the email."}},"AWS::Pinpoint::Campaign.CampaignEventFilter":{"attributes":{},"description":"Specifies the settings for events that cause a campaign to be sent.","properties":{"Dimensions":"The dimension settings of the event filter for the campaign.","FilterType":"The type of event that causes the campaign to be sent. Valid values are: `SYSTEM` , sends the campaign when a system event occurs; and, `ENDPOINT` , sends the campaign when an endpoint event (Events resource) occurs."}},"AWS::Pinpoint::Campaign.CampaignHook":{"attributes":{},"description":"Specifies settings for invoking an Lambda function that customizes a segment for a campaign.","properties":{"LambdaFunctionName":"The name or Amazon Resource Name (ARN) of the Lambda function that Amazon Pinpoint invokes to customize a segment for a campaign.","Mode":"The mode that Amazon Pinpoint uses to invoke the Lambda function. Possible values are:\\n\\n- `FILTER` - Invoke the function to customize the segment that\'s used by a campaign.\\n- `DELIVERY` - (Deprecated) Previously, invoked the function to send a campaign through a custom channel. This functionality is not supported anymore. To send a campaign through a custom channel, use the `CustomDeliveryConfiguration` and `CampaignCustomMessage` objects of the campaign.","WebUrl":"The web URL that Amazon Pinpoint calls to invoke the Lambda function over HTTPS."}},"AWS::Pinpoint::Campaign.CampaignInAppMessage":{"attributes":{},"description":"Specifies the appearance of an in-app message, including the message type, the title and body text, text and background colors, and the configurations of buttons that appear in the message.","properties":{"Content":"An array that contains configurtion information about the in-app message for the campaign, including title and body text, text colors, background colors, image URLs, and button configurations.","CustomConfig":"Custom data, in the form of key-value pairs, that is included in an in-app messaging payload.","Layout":"A string that describes how the in-app message will appear. You can specify one of the following:\\n\\n- `BOTTOM_BANNER` – a message that appears as a banner at the bottom of the page.\\n- `TOP_BANNER` – a message that appears as a banner at the top of the page.\\n- `OVERLAYS` – a message that covers entire screen.\\n- `MOBILE_FEED` – a message that appears in a window in front of the page.\\n- `MIDDLE_BANNER` – a message that appears as a banner in the middle of the page.\\n- `CAROUSEL` – a scrollable layout of up to five unique messages."}},"AWS::Pinpoint::Campaign.CampaignSmsMessage":{"attributes":{},"description":"Specifies the content and settings for an SMS message that\'s sent to recipients of a campaign.","properties":{"Body":"The body of the SMS message.","EntityId":"The entity ID or Principal Entity (PE) id received from the regulatory body for sending SMS in your country.","MessageType":"The SMS message type. Valid values are `TRANSACTIONAL` (for messages that are critical or time-sensitive, such as a one-time passwords) and `PROMOTIONAL` (for messsages that aren\'t critical or time-sensitive, such as marketing messages).","OriginationNumber":"The long code to send the SMS message from. This value should be one of the dedicated long codes that\'s assigned to your AWS account. Although it isn\'t required, we recommend that you specify the long code using an E.164 format to ensure prompt and accurate delivery of the message. For example, +12065550100.","SenderId":"The alphabetic Sender ID to display as the sender of the message on a recipient\'s device. Support for sender IDs varies by country or region. To specify a phone number as the sender, omit this parameter and use `OriginationNumber` instead. For more information about support for Sender ID by country, see the [Amazon Pinpoint User Guide](https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-countries.html) .","TemplateId":"The template ID received from the regulatory body for sending SMS in your country."}},"AWS::Pinpoint::Campaign.CustomDeliveryConfiguration":{"attributes":{},"description":"Specifies the delivery configuration settings for sending a campaign or campaign treatment through a custom channel. This object is required if you use the `CampaignCustomMessage` object to define the message to send for the campaign or campaign treatment.","properties":{"DeliveryUri":"The destination to send the campaign or treatment to. This value can be one of the following:\\n\\n- The name or Amazon Resource Name (ARN) of an AWS Lambda function to invoke to handle delivery of the campaign or treatment.\\n- The URL for a web application or service that supports HTTPS and can receive the message. The URL has to be a full URL, including the HTTPS protocol.","EndpointTypes":"The types of endpoints to send the campaign or treatment to. Each valid value maps to a type of channel that you can associate with an endpoint by using the `ChannelType` property of an endpoint."}},"AWS::Pinpoint::Campaign.DefaultButtonConfiguration":{"attributes":{},"description":"Specifies the default behavior for a button that appears in an in-app message. You can optionally add button configurations that specifically apply to iOS, Android, or web browser users.","properties":{"BackgroundColor":"The background color of a button, expressed as a hex color code (such as #000000 for black).","BorderRadius":"The border radius of a button.","ButtonAction":"The action that occurs when a recipient chooses a button in an in-app message. You can specify one of the following:\\n\\n- `LINK` – A link to a web destination.\\n- `DEEP_LINK` – A link to a specific page in an application.\\n- `CLOSE` – Dismisses the message.","Link":"The destination (such as a URL) for a button.","Text":"The text that appears on a button in an in-app message.","TextColor":"The color of the body text in a button, expressed as a hex color code (such as #000000 for black)."}},"AWS::Pinpoint::Campaign.EventDimensions":{"attributes":{},"description":"Specifies the dimensions for an event filter that determines when a campaign is sent or a journey activity is performed.","properties":{"Attributes":"One or more custom attributes that your application reports to Amazon Pinpoint. You can use these attributes as selection criteria when you create an event filter.","EventType":"The name of the event that causes the campaign to be sent or the journey activity to be performed. This can be a standard event that Amazon Pinpoint generates, such as `_email.delivered` or `_custom.delivered` . For campaigns, this can also be a custom event that\'s specific to your application. For information about standard events, see [Streaming Amazon Pinpoint Events](https://docs.aws.amazon.com/pinpoint/latest/developerguide/event-streams.html) in the *Amazon Pinpoint Developer Guide* .","Metrics":"One or more custom metrics that your application reports to Amazon Pinpoint . You can use these metrics as selection criteria when you create an event filter."}},"AWS::Pinpoint::Campaign.InAppMessageBodyConfig":{"attributes":{},"description":"Specifies the configuration of main body text of the in-app message.","properties":{"Alignment":"The text alignment of the main body text of the message. Acceptable values: `LEFT` , `CENTER` , `RIGHT` .","Body":"The main body text of the message.","TextColor":"The color of the body text, expressed as a string consisting of a hex color code (such as \\"#000000\\" for black)."}},"AWS::Pinpoint::Campaign.InAppMessageButton":{"attributes":{},"description":"Specifies the configuration of a button that appears in an in-app message.","properties":{"Android":"An object that defines the default behavior for a button in in-app messages sent to Android.","DefaultConfig":"An object that defines the default behavior for a button in an in-app message.","IOS":"An object that defines the default behavior for a button in in-app messages sent to iOS devices.","Web":"An object that defines the default behavior for a button in in-app messages for web applications."}},"AWS::Pinpoint::Campaign.InAppMessageContent":{"attributes":{},"description":"Specifies the configuration and contents of an in-app message.","properties":{"BackgroundColor":"The background color for an in-app message banner, expressed as a hex color code (such as #000000 for black).","BodyConfig":"Specifies the configuration of main body text in an in-app message template.","HeaderConfig":"Specifies the configuration and content of the header or title text of the in-app message.","ImageUrl":"The URL of the image that appears on an in-app message banner.","PrimaryBtn":"An object that contains configuration information about the primary button in an in-app message.","SecondaryBtn":"An object that contains configuration information about the secondary button in an in-app message."}},"AWS::Pinpoint::Campaign.InAppMessageHeaderConfig":{"attributes":{},"description":"Specifies the configuration and content of the header or title text of the in-app message.","properties":{"Alignment":"The text alignment of the title of the message. Acceptable values: `LEFT` , `CENTER` , `RIGHT` .","Header":"The header or title text of the in-app message.","TextColor":"The color of the body text, expressed as a string consisting of a hex color code (such as \\"#000000\\" for black)."}},"AWS::Pinpoint::Campaign.Limits":{"attributes":{},"description":"Specifies the limits on the messages that a campaign can send.","properties":{"Daily":"The maximum number of messages that a campaign can send to a single endpoint during a 24-hour period. The maximum value is 100.","MaximumDuration":"The maximum amount of time, in seconds, that a campaign can attempt to deliver a message after the scheduled start time for the campaign. The minimum value is 60 seconds.","MessagesPerSecond":"The maximum number of messages that a campaign can send each second. The minimum value is 1. The maximum value is 20,000.","Session":"The maximum number of messages that the campaign can send per user session.","Total":"The maximum number of messages that a campaign can send to a single endpoint during the course of the campaign. The maximum value is 100."}},"AWS::Pinpoint::Campaign.Message":{"attributes":{},"description":"Specifies the content and settings for a push notification that\'s sent to recipients of a campaign.","properties":{"Action":"The action to occur if a recipient taps the push notification. Valid values are:\\n\\n- `OPEN_APP` – Your app opens or it becomes the foreground app if it was sent to the background. This is the default action.\\n- `DEEP_LINK` – Your app opens and displays a designated user interface in the app. This setting uses the deep-linking features of iOS and Android.\\n- `URL` – The default mobile browser on the recipient\'s device opens and loads the web page at a URL that you specify.","Body":"The body of the notification message. The maximum number of characters is 200.","ImageIconUrl":"The URL of the image to display as the push notification icon, such as the icon for the app.","ImageSmallIconUrl":"The URL of the image to display as the small, push notification icon, such as a small version of the icon for the app.","ImageUrl":"The URL of an image to display in the push notification.","JsonBody":"The JSON payload to use for a silent push notification.","MediaUrl":"The URL of the image or video to display in the push notification.","RawContent":"The raw, JSON-formatted string to use as the payload for the notification message. If specified, this value overrides all other content for the message.","SilentPush":"Specifies whether the notification is a silent push notification, which is a push notification that doesn\'t display on a recipient\'s device. Silent push notifications can be used for cases such as updating an app\'s configuration, displaying messages in an in-app message center, or supporting phone home functionality.","TimeToLive":"The number of seconds that the push notification service should keep the message, if the service is unable to deliver the notification the first time. This value is converted to an expiration value when it\'s sent to a push notification service. If this value is `0` , the service treats the notification as if it expires immediately and the service doesn\'t store or try to deliver the notification again.\\n\\nThis value doesn\'t apply to messages that are sent through the Amazon Device Messaging (ADM) service.","Title":"The title to display above the notification message on a recipient\'s device.","Url":"The URL to open in a recipient\'s default mobile browser, if a recipient taps the push notification and the value of the `Action` property is `URL` ."}},"AWS::Pinpoint::Campaign.MessageConfiguration":{"attributes":{},"description":"Specifies the message configuration settings for a campaign.","properties":{"ADMMessage":"The message that the campaign sends through the ADM (Amazon Device Messaging) channel. If specified, this message overrides the default message.","APNSMessage":"The message that the campaign sends through the APNs (Apple Push Notification service) channel. If specified, this message overrides the default message.","BaiduMessage":"The message that the campaign sends through the Baidu (Baidu Cloud Push) channel. If specified, this message overrides the default message.","CustomMessage":"The message that the campaign sends through a custom channel, as specified by the delivery configuration ( `CustomDeliveryConfiguration` ) settings for the campaign. If specified, this message overrides the default message.","DefaultMessage":"The default message that the campaign sends through all the channels that are configured for the campaign.","EmailMessage":"The message that the campaign sends through the email channel. If specified, this message overrides the default message.","GCMMessage":"The message that the campaign sends through the GCM channel, which enables Amazon Pinpoint to send push notifications through the Firebase Cloud Messaging (FCM), formerly Google Cloud Messaging (GCM), service. If specified, this message overrides the default message.","InAppMessage":"The default message for the in-app messaging channel. This message overrides the default message ( `DefaultMessage` ).","SMSMessage":"The message that the campaign sends through the SMS channel. If specified, this message overrides the default message."}},"AWS::Pinpoint::Campaign.MetricDimension":{"attributes":{},"description":"Specifies metric-based criteria for including or excluding endpoints from a segment. These criteria derive from custom metrics that you define for endpoints.","properties":{"ComparisonOperator":"The operator to use when comparing metric values. Valid values are: `GREATER_THAN` , `LESS_THAN` , `GREATER_THAN_OR_EQUAL` , `LESS_THAN_OR_EQUAL` , and `EQUAL` .","Value":"The value to compare."}},"AWS::Pinpoint::Campaign.OverrideButtonConfiguration":{"attributes":{},"description":"Specifies the configuration of a button with settings that are specific to a certain device type.","properties":{"ButtonAction":"The action that occurs when a recipient chooses a button in an in-app message. You can specify one of the following:\\n\\n- `LINK` – A link to a web destination.\\n- `DEEP_LINK` – A link to a specific page in an application.\\n- `CLOSE` – Dismisses the message.","Link":"The destination (such as a URL) for a button."}},"AWS::Pinpoint::Campaign.QuietTime":{"attributes":{},"description":"Specifies the start and end times that define a time range when messages aren\'t sent to endpoints.","properties":{"End":"The specific time when quiet time ends. This value has to use 24-hour notation and be in HH:MM format, where HH is the hour (with a leading zero, if applicable) and MM is the minutes. For example, use `02:30` to represent 2:30 AM, or `14:30` to represent 2:30 PM.","Start":"The specific time when quiet time begins. This value has to use 24-hour notation and be in HH:MM format, where HH is the hour (with a leading zero, if applicable) and MM is the minutes. For example, use `02:30` to represent 2:30 AM, or `14:30` to represent 2:30 PM."}},"AWS::Pinpoint::Campaign.Schedule":{"attributes":{},"description":"Specifies the schedule settings for a campaign.","properties":{"EndTime":"The scheduled time, in ISO 8601 format, when the campaign ended or will end.","EventFilter":"The type of event that causes the campaign to be sent, if the value of the `Frequency` property is `EVENT` .","Frequency":"Specifies how often the campaign is sent or whether the campaign is sent in response to a specific event.","IsLocalTime":"Specifies whether the start and end times for the campaign schedule use each recipient\'s local time. To base the schedule on each recipient\'s local time, set this value to `true` .","QuietTime":"The default quiet time for the campaign. Quiet time is a specific time range when a campaign doesn\'t send messages to endpoints, if all the following conditions are met:\\n\\n- The `EndpointDemographic.Timezone` property of the endpoint is set to a valid value.\\n- The current time in the endpoint\'s time zone is later than or equal to the time specified by the `QuietTime.Start` property for the campaign.\\n- The current time in the endpoint\'s time zone is earlier than or equal to the time specified by the `QuietTime.End` property for the campaign.\\n\\nIf any of the preceding conditions isn\'t met, the endpoint will receive messages from the campaign, even if quiet time is enabled.","StartTime":"The scheduled time when the campaign began or will begin. Valid values are: `IMMEDIATE` , to start the campaign immediately; or, a specific time in ISO 8601 format.","TimeZone":"The starting UTC offset for the campaign schedule, if the value of the `IsLocalTime` property is `true` . Valid values are: `UTC, UTC+01, UTC+02, UTC+03, UTC+03:30, UTC+04, UTC+04:30, UTC+05, UTC+05:30, UTC+05:45, UTC+06, UTC+06:30, UTC+07, UTC+08, UTC+09, UTC+09:30, UTC+10, UTC+10:30, UTC+11, UTC+12, UTC+13, UTC-02, UTC-03, UTC-04, UTC-05, UTC-06, UTC-07, UTC-08, UTC-09, UTC-10,` and `UTC-11` ."}},"AWS::Pinpoint::Campaign.SetDimension":{"attributes":{},"description":"Specifies the dimension type and values for a segment dimension.","properties":{"DimensionType":"The type of segment dimension to use. Valid values are: `INCLUSIVE` , endpoints that match the criteria are included in the segment; and, `EXCLUSIVE` , endpoints that match the criteria are excluded from the segment.","Values":"The criteria values to use for the segment dimension. Depending on the value of the `DimensionType` property, endpoints are included or excluded from the segment if their values match the criteria values."}},"AWS::Pinpoint::Campaign.Template":{"attributes":{},"description":"Specifies the name and version of the message template to use for the message.","properties":{"Name":"The name of the message template to use for the message. If specified, this value must match the name of an existing message template.","Version":"The unique identifier for the version of the message template to use for the message. If specified, this value must match the identifier for an existing template version. To retrieve a list of versions and version identifiers for a template, use the [Template Versions](https://docs.aws.amazon.com/pinpoint/latest/apireference/templates-template-name-template-type-versions.html) resource.\\n\\nIf you don\'t specify a value for this property, Amazon Pinpoint uses the *active version* of the template. The *active version* is typically the version of a template that\'s been most recently reviewed and approved for use, depending on your workflow. It isn\'t necessarily the latest version of a template."}},"AWS::Pinpoint::Campaign.TemplateConfiguration":{"attributes":{},"description":"Specifies the message template to use for the message, for each type of channel.","properties":{"EmailTemplate":"The email template to use for the message.","PushTemplate":"The push notification template to use for the message.","SMSTemplate":"The SMS template to use for the message.","VoiceTemplate":"The voice template to use for the message. This object isn\'t supported for campaigns."}},"AWS::Pinpoint::Campaign.WriteTreatmentResource":{"attributes":{},"description":"Specifies the settings for a campaign treatment. A *treatment* is a variation of a campaign that\'s used for A/B testing of a campaign.","properties":{"CustomDeliveryConfiguration":"The delivery configuration settings for sending the treatment through a custom channel. This object is required if the `MessageConfiguration` object for the treatment specifies a `CustomMessage` object.","MessageConfiguration":"The message configuration settings for the treatment.","Schedule":"The schedule settings for the treatment.","SizePercent":"The allocated percentage of users (segment members) to send the treatment to.","TemplateConfiguration":"The message template to use for the treatment.","TreatmentDescription":"A custom description of the treatment.","TreatmentName":"A custom name for the treatment."}},"AWS::Pinpoint::EmailChannel":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the channel is associated with."},"description":"A *channel* is a type of platform that you can deliver messages to. You can use the email channel to send email to users. Before you can use Amazon Pinpoint to send email, you must enable the email channel for an Amazon Pinpoint application.\\n\\nThe EmailChannel resource represents the status, identity, and other settings of the email channel for an application","properties":{"ApplicationId":"The unique identifier for the Amazon Pinpoint application that you\'re specifying the email channel for.","ConfigurationSet":"The [Amazon SES configuration set](https://docs.aws.amazon.com/ses/latest/APIReference/API_ConfigurationSet.html) that you want to apply to messages that you send through the channel.","Enabled":"Specifies whether to enable the email channel for the application.","FromAddress":"The verified email address that you want to send email from when you send email through the channel.","Identity":"The Amazon Resource Name (ARN) of the identity, verified with Amazon Simple Email Service (Amazon SES), that you want to use when you send email through the channel.","RoleArn":"The ARN of the AWS Identity and Access Management (IAM) role that you want Amazon Pinpoint to use when it submits email-related event data for the channel."}},"AWS::Pinpoint::EmailTemplate":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the message template.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the name of the message template ( `TemplateName` )."},"description":"Creates a message template that you can use in messages that are sent through the email channel. A *message template* is a set of content and settings that you can define, save, and reuse in messages for any of your Amazon Pinpoint applications.","properties":{"DefaultSubstitutions":"A JSON object that specifies the default values to use for message variables in the message template. This object is a set of key-value pairs. Each key defines a message variable in the template. The corresponding value defines the default value for that variable. When you create a message that\'s based on the template, you can override these defaults with message-specific and address-specific variables and values.","HtmlPart":"The message body, in HTML format, to use in email messages that are based on the message template. We recommend using HTML format for email clients that render HTML content. You can include links, formatted text, and more in an HTML message.","Subject":"The subject line, or title, to use in email messages that are based on the message template.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","TemplateDescription":"A custom description of the message template.","TemplateName":"The name of the message template.","TextPart":"The message body, in plain text format, to use in email messages that are based on the message template. We recommend using plain text format for email clients that don\'t render HTML content and clients that are connected to high-latency networks, such as mobile devices."}},"AWS::Pinpoint::EventStream":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the event stream is associated with."},"description":"Creates a new event stream for an application or updates the settings of an existing event stream for an application.","properties":{"ApplicationId":"The unique identifier for the Amazon Pinpoint application that you want to export data from.","DestinationStreamArn":"The Amazon Resource Name (ARN) of the Amazon Kinesis data stream or Amazon Kinesis Data Firehose delivery stream that you want to publish event data to.\\n\\nFor a Kinesis data stream, the ARN format is: `arn:aws:kinesis: region : account-id :stream/ stream_name`\\n\\nFor a Kinesis Data Firehose delivery stream, the ARN format is: `arn:aws:firehose: region : account-id :deliverystream/ stream_name`","RoleArn":"The AWS Identity and Access Management (IAM) role that authorizes Amazon Pinpoint to publish event data to the stream in your AWS account."}},"AWS::Pinpoint::GCMChannel":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the channel is associated with."},"description":"A *channel* is a type of platform that you can deliver messages to. You can use the GCM channel to send push notification messages to the Firebase Cloud Messaging (FCM) service, which replaced the Google Cloud Messaging (GCM) service. Before you use Amazon Pinpoint to send notifications to FCM, you have to enable the GCM channel for an Amazon Pinpoint application.\\n\\nThe GCMChannel resource represents the status and authentication settings of the GCM channel for an application.","properties":{"ApiKey":"The Web API key, also called the *server key* , that you received from Google to communicate with Google services.","ApplicationId":"The unique identifier for the Amazon Pinpoint application that the GCM channel applies to.","Enabled":"Specifies whether to enable the GCM channel for the Amazon Pinpoint application."}},"AWS::Pinpoint::InAppTemplate":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the message template."},"description":"Creates a message template that you can use to send in-app messages. A message template is a set of content and settings that you can define, save, and reuse in messages for any of your Amazon Pinpoint applications. The In-App channel is unavailable in AWS GovCloud (US).","properties":{"Content":"An object that contains information about the content of an in-app message, including its title and body text, text colors, background colors, images, buttons, and behaviors.","CustomConfig":"Custom data, in the form of key-value pairs, that is included in an in-app messaging payload.","Layout":"A string that determines the appearance of the in-app message. You can specify one of the following:\\n\\n- `BOTTOM_BANNER` – a message that appears as a banner at the bottom of the page.\\n- `TOP_BANNER` – a message that appears as a banner at the top of the page.\\n- `OVERLAYS` – a message that covers entire screen.\\n- `MOBILE_FEED` – a message that appears in a window in front of the page.\\n- `MIDDLE_BANNER` – a message that appears as a banner in the middle of the page.\\n- `CAROUSEL` – a scrollable layout of up to five unique messages.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","TemplateDescription":"An optional description of the in-app template.","TemplateName":"The name of the in-app message template."}},"AWS::Pinpoint::InAppTemplate.BodyConfig":{"attributes":{},"description":"Specifies the configuration of the main body text of the in-app message.","properties":{"Alignment":"The text alignment of the main body text of the message. Acceptable values: `LEFT` , `CENTER` , `RIGHT` .","Body":"The main body text of the message.","TextColor":"The color of the body text, expressed as a hex color code (such as #000000 for black)."}},"AWS::Pinpoint::InAppTemplate.ButtonConfig":{"attributes":{},"description":"Specifies the behavior of buttons that appear in an in-app message template.","properties":{"Android":"Optional button configuration to use for in-app messages sent to Android devices. This button configuration overrides the default button configuration.","DefaultConfig":"Specifies the default behavior of a button that appears in an in-app message. You can optionally add button configurations that specifically apply to iOS, Android, or web browser users.","IOS":"Optional button configuration to use for in-app messages sent to iOS devices. This button configuration overrides the default button configuration.","Web":"Optional button configuration to use for in-app messages sent to web applications. This button configuration overrides the default button configuration."}},"AWS::Pinpoint::InAppTemplate.DefaultButtonConfiguration":{"attributes":{},"description":"Specifies the default behavior of a button that appears in an in-app message. You can optionally add button configurations that specifically apply to iOS, Android, or web browser users.","properties":{"BackgroundColor":"The background color of a button, expressed as a hex color code (such as #000000 for black).","BorderRadius":"The border radius of a button.","ButtonAction":"The action that occurs when a recipient chooses a button in an in-app message. You can specify one of the following:\\n\\n- `LINK` – A link to a web destination.\\n- `DEEP_LINK` – A link to a specific page in an application.\\n- `CLOSE` – Dismisses the message.","Link":"The destination (such as a URL) for a button.","Text":"The text that appears on a button in an in-app message.","TextColor":"The color of the body text in a button, expressed as a hex color code (such as #000000 for black)."}},"AWS::Pinpoint::InAppTemplate.HeaderConfig":{"attributes":{},"description":"Specifies the configuration and content of the header or title text of the in-app message.","properties":{"Alignment":"The text alignment of the title of the message. Acceptable values: `LEFT` , `CENTER` , `RIGHT` .","Header":"The title text of the in-app message.","TextColor":"The color of the title text, expressed as a hex color code (such as #000000 for black)."}},"AWS::Pinpoint::InAppTemplate.InAppMessageContent":{"attributes":{},"description":"Specifies the configuration of an in-app message, including its header, body, buttons, colors, and images.","properties":{"BackgroundColor":"The background color for an in-app message banner, expressed as a hex color code (such as #000000 for black).","BodyConfig":"An object that contains configuration information about the header or title text of the in-app message.","HeaderConfig":"An object that contains configuration information about the header or title text of the in-app message.","ImageUrl":"The URL of the image that appears on an in-app message banner.","PrimaryBtn":"An object that contains configuration information about the primary button in an in-app message.","SecondaryBtn":"An object that contains configuration information about the secondary button in an in-app message."}},"AWS::Pinpoint::InAppTemplate.OverrideButtonConfiguration":{"attributes":{},"description":"Specifies the configuration of a button with settings that are specific to a certain device type.","properties":{"ButtonAction":"The action that occurs when a recipient chooses a button in an in-app message. You can specify one of the following:\\n\\n- `LINK` – A link to a web destination.\\n- `DEEP_LINK` – A link to a specific page in an application.\\n- `CLOSE` – Dismisses the message.","Link":"The destination (such as a URL) for a button."}},"AWS::Pinpoint::PushTemplate":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the message template.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the name of the message template ( `TemplateName` )."},"description":"Creates a message template that you can use in messages that are sent through a push notification channel. A *message template* is a set of content and settings that you can define, save, and reuse in messages for any of your Amazon Pinpoint applications.","properties":{"ADM":"The message template to use for the ADM (Amazon Device Messaging) channel. This message template overrides the default template for push notification channels ( `Default` ).","APNS":"The message template to use for the APNs (Apple Push Notification service) channel. This message template overrides the default template for push notification channels ( `Default` ).","Baidu":"The message template to use for the Baidu (Baidu Cloud Push) channel. This message template overrides the default template for push notification channels ( `Default` ).","Default":"The default message template to use for push notification channels.","DefaultSubstitutions":"A JSON object that specifies the default values to use for message variables in the message template. This object is a set of key-value pairs. Each key defines a message variable in the template. The corresponding value defines the default value for that variable. When you create a message that\'s based on the template, you can override these defaults with message-specific and address-specific variables and values.","GCM":"The message template to use for the GCM channel, which is used to send notifications through the Firebase Cloud Messaging (FCM), formerly Google Cloud Messaging (GCM), service. This message template overrides the default template for push notification channels ( `Default` ).","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","TemplateDescription":"A custom description of the message template.","TemplateName":"The name of the message template."}},"AWS::Pinpoint::PushTemplate.APNSPushNotificationTemplate":{"attributes":{},"description":"Specifies channel-specific content and settings for a message template that can be used in push notifications that are sent through the APNs (Apple Push Notification service) channel.","properties":{"Action":"The action to occur if a recipient taps a push notification that\'s based on the message template. Valid values are:\\n\\n- `OPEN_APP` – Your app opens or it becomes the foreground app if it was sent to the background. This is the default action.\\n- `DEEP_LINK` – Your app opens and displays a designated user interface in the app. This setting uses the deep-linking features of the iOS platform.\\n- `URL` – The default mobile browser on the recipient\'s device opens and loads the web page at a URL that you specify.","Body":"The message body to use in push notifications that are based on the message template.","MediaUrl":"The URL of an image or video to display in push notifications that are based on the message template.","Sound":"The key for the sound to play when the recipient receives a push notification that\'s based on the message template. The value for this key is the name of a sound file in your app\'s main bundle or the `Library/Sounds` folder in your app\'s data container. If the sound file can\'t be found or you specify `default` for the value, the system plays the default alert sound.","Title":"The title to use in push notifications that are based on the message template. This title appears above the notification message on a recipient\'s device.","Url":"The URL to open in the recipient\'s default mobile browser, if a recipient taps a push notification that\'s based on the message template and the value of the `Action` property is `URL` ."}},"AWS::Pinpoint::PushTemplate.AndroidPushNotificationTemplate":{"attributes":{},"description":"Specifies channel-specific content and settings for a message template that can be used in push notifications that are sent through the ADM (Amazon Device Messaging), Baidu (Baidu Cloud Push), or GCM (Firebase Cloud Messaging, formerly Google Cloud Messaging) channel.","properties":{"Action":"The action to occur if a recipient taps a push notification that\'s based on the message template. Valid values are:\\n\\n- `OPEN_APP` – Your app opens or it becomes the foreground app if it was sent to the background. This is the default action.\\n- `DEEP_LINK` – Your app opens and displays a designated user interface in the app. This action uses the deep-linking features of the Android platform.\\n- `URL` – The default mobile browser on the recipient\'s device opens and loads the web page at a URL that you specify.","Body":"The message body to use in a push notification that\'s based on the message template.","ImageIconUrl":"The URL of the large icon image to display in the content view of a push notification that\'s based on the message template.","ImageUrl":"The URL of an image to display in a push notification that\'s based on the message template.","SmallImageIconUrl":"The URL of the small icon image to display in the status bar and the content view of a push notification that\'s based on the message template.","Sound":"The sound to play when a recipient receives a push notification that\'s based on the message template. You can use the default stream or specify the file name of a sound resource that\'s bundled in your app. On an Android platform, the sound file must reside in `/res/raw/` .","Title":"The title to use in a push notification that\'s based on the message template. This title appears above the notification message on a recipient\'s device.","Url":"The URL to open in a recipient\'s default mobile browser, if a recipient taps a push notification that\'s based on the message template and the value of the `Action` property is `URL` ."}},"AWS::Pinpoint::PushTemplate.DefaultPushNotificationTemplate":{"attributes":{},"description":"Specifies the default settings and content for a message template that can be used in messages that are sent through a push notification channel.","properties":{"Action":"The action to occur if a recipient taps a push notification that\'s based on the message template. Valid values are:\\n\\n- `OPEN_APP` – Your app opens or it becomes the foreground app if it was sent to the background. This is the default action.\\n- `DEEP_LINK` – Your app opens and displays a designated user interface in the app. This setting uses the deep-linking features of the iOS and Android platforms.\\n- `URL` – The default mobile browser on the recipient\'s device opens and loads the web page at a URL that you specify.","Body":"The message body to use in push notifications that are based on the message template.","Sound":"The sound to play when a recipient receives a push notification that\'s based on the message template. You can use the default stream or specify the file name of a sound resource that\'s bundled in your app. On an Android platform, the sound file must reside in `/res/raw/` .\\n\\nFor an iOS platform, this value is the key for the name of a sound file in your app\'s main bundle or the `Library/Sounds` folder in your app\'s data container. If the sound file can\'t be found or you specify `default` for the value, the system plays the default alert sound.","Title":"The title to use in push notifications that are based on the message template. This title appears above the notification message on a recipient\'s device.","Url":"The URL to open in a recipient\'s default mobile browser, if a recipient taps a push notification that\'s based on the message template and the value of the `Action` property is `URL` ."}},"AWS::Pinpoint::SMSChannel":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the channel is associated with."},"description":"A *channel* is a type of platform that you can deliver messages to. To send an SMS text message, you send the message through the SMS channel. Before you can use Amazon Pinpoint to send text messages, you have to enable the SMS channel for an Amazon Pinpoint application.\\n\\nThe SMSChannel resource represents the status, sender ID, and other settings for the SMS channel for an application.","properties":{"ApplicationId":"The unique identifier for the Amazon Pinpoint application that the SMS channel applies to.","Enabled":"Specifies whether to enable the SMS channel for the application.","SenderId":"The identity that you want to display on recipients\' devices when they receive messages from the SMS channel.\\n\\n> SenderIDs are only supported in certain countries and regions. For more information, see [Supported Countries and Regions](https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-countries.html) in the *Amazon Pinpoint User Guide* .","ShortCode":"The registered short code that you want to use when you send messages through the SMS channel.\\n\\n> For information about obtaining a dedicated short code for sending SMS messages, see [Requesting Dedicated Short Codes for SMS Messaging with Amazon Pinpoint](https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-awssupport-short-code.html) in the *Amazon Pinpoint User Guide* ."}},"AWS::Pinpoint::Segment":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the segment.","Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the segment is associated with.","SegmentId":"The unique identifier for the segment."},"description":"Updates the configuration, dimension, and other settings for an existing segment.","properties":{"ApplicationId":"The unique identifier for the Amazon Pinpoint application that the segment is associated with.","Dimensions":"The criteria that define the dimensions for the segment.","Name":"The name of the segment.\\n\\n> A segment must have a name otherwise it will not appear in the Amazon Pinpoint console.","SegmentGroups":"The segment group to use and the dimensions to apply to the group\'s base segments in order to build the segment. A segment group can consist of zero or more base segments. Your request can include only one segment group.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::Pinpoint::Segment.AttributeDimension":{"attributes":{},"description":"Specifies attribute-based criteria for including or excluding endpoints from a segment.","properties":{"AttributeType":"The type of segment dimension to use. Valid values are:\\n\\n- `INCLUSIVE` – endpoints that have attributes matching the values are included in the segment.\\n- `EXCLUSIVE` – endpoints that have attributes matching the values are excluded from the segment.\\n- `CONTAINS` – endpoints that have attributes\' substrings match the values are included in the segment.\\n- `BEFORE` – endpoints with attributes read as ISO_INSTANT datetimes before the value are included in the segment.\\n- `AFTER` – endpoints with attributes read as ISO_INSTANT datetimes after the value are included in the segment.\\n- `BETWEEN` – endpoints with attributes read as ISO_INSTANT datetimes between the values are included in the segment.\\n- `ON` – endpoints with attributes read as ISO_INSTANT dates on the value are included in the segment. Time is ignored in this comparison.","Values":"The criteria values to use for the segment dimension. Depending on the value of the `AttributeType` property, endpoints are included or excluded from the segment if their attribute values match the criteria values."}},"AWS::Pinpoint::Segment.Behavior":{"attributes":{},"description":"Specifies behavior-based criteria for the segment, such as how recently users have used your app.","properties":{"Recency":"Specifies how recently segment members were active."}},"AWS::Pinpoint::Segment.Coordinates":{"attributes":{},"description":"Specifies the GPS coordinates of a location.","properties":{"Latitude":"The latitude coordinate of the location.","Longitude":"The longitude coordinate of the location."}},"AWS::Pinpoint::Segment.Demographic":{"attributes":{},"description":"Specifies demographic-based criteria, such as device platform, for the segment.","properties":{"AppVersion":"The app version criteria for the segment.","Channel":"The channel criteria for the segment.","DeviceType":"The device type criteria for the segment.","Make":"The device make criteria for the segment.","Model":"The device model criteria for the segment.","Platform":"The device platform criteria for the segment."}},"AWS::Pinpoint::Segment.GPSPoint":{"attributes":{},"description":"Specifies the GPS coordinates of the endpoint location.","properties":{"Coordinates":"The GPS coordinates to measure distance from.","RangeInKilometers":"The range, in kilometers, from the GPS coordinates."}},"AWS::Pinpoint::Segment.Groups":{"attributes":{},"description":"An array that defines the set of segment criteria to evaluate when handling segment groups for the segment.","properties":{"Dimensions":"An array that defines the dimensions to include or exclude from the segment.","SourceSegments":"The base segment to build the segment on. A base segment, also called a *source segment* , defines the initial population of endpoints for a segment. When you add dimensions to the segment, Amazon Pinpoint filters the base segment by using the dimensions that you specify.\\n\\nYou can specify more than one dimensional segment or only one imported segment. If you specify an imported segment, the segment size estimate that displays on the Amazon Pinpoint console indicates the size of the imported segment without any filters applied to it.","SourceType":"Specifies how to handle multiple base segments for the segment. For example, if you specify three base segments for the segment, whether the resulting segment is based on all, any, or none of the base segments.","Type":"Specifies how to handle multiple dimensions for the segment. For example, if you specify three dimensions for the segment, whether the resulting segment includes endpoints that match all, any, or none of the dimensions."}},"AWS::Pinpoint::Segment.Location":{"attributes":{},"description":"Specifies location-based criteria, such as region or GPS coordinates, for the segment.","properties":{"Country":"The country or region code, in ISO 3166-1 alpha-2 format, for the segment.","GPSPoint":"The GPS point dimension for the segment."}},"AWS::Pinpoint::Segment.Recency":{"attributes":{},"description":"Specifies how recently segment members were active.","properties":{"Duration":"The duration to use when determining which users have been active or inactive with your app.\\n\\nPossible values: `HR_24` | `DAY_7` | `DAY_14` | `DAY_30` .","RecencyType":"The type of recency dimension to use for the segment. Valid values are: `ACTIVE` and `INACTIVE` . If the value is `ACTIVE` , the segment includes users who have used your app within the specified duration are included in the segment. If the value is `INACTIVE` , the segment includes users who haven\'t used your app within the specified duration are included in the segment."}},"AWS::Pinpoint::Segment.SegmentDimensions":{"attributes":{},"description":"Specifies the dimension settings for a segment.","properties":{"Attributes":"One or more custom attributes to use as criteria for the segment. For more information see [AttributeDimension](https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-segments.html#apps-application-id-segments-model-attributedimension)","Behavior":"The behavior-based criteria, such as how recently users have used your app, for the segment.","Demographic":"The demographic-based criteria, such as device platform, for the segment.","Location":"The location-based criteria, such as region or GPS coordinates, for the segment.","Metrics":"One or more custom metrics to use as criteria for the segment.","UserAttributes":"One or more custom user attributes to use as criteria for the segment."}},"AWS::Pinpoint::Segment.SegmentGroups":{"attributes":{},"description":"Specifies the set of segment criteria to evaluate when handling segment groups for the segment.","properties":{"Groups":"Specifies the set of segment criteria to evaluate when handling segment groups for the segment.","Include":"Specifies how to handle multiple segment groups for the segment. For example, if the segment includes three segment groups, whether the resulting segment includes endpoints that match all, any, or none of the segment groups."}},"AWS::Pinpoint::Segment.SetDimension":{"attributes":{},"description":"Specifies the dimension type and values for a segment dimension.","properties":{"DimensionType":"The type of segment dimension to use. Valid values are: `INCLUSIVE` , endpoints that match the criteria are included in the segment; and, `EXCLUSIVE` , endpoints that match the criteria are excluded from the segment.","Values":"The criteria values to use for the segment dimension. Depending on the value of the `DimensionType` property, endpoints are included or excluded from the segment if their values match the criteria values."}},"AWS::Pinpoint::Segment.SourceSegments":{"attributes":{},"description":"Specifies the base segment to build the segment on. A base segment, also called a *source segment* , defines the initial population of endpoints for a segment. When you add dimensions to the segment, Amazon Pinpoint filters the base segment by using the dimensions that you specify.\\n\\nYou can specify more than one dimensional segment or only one imported segment. If you specify an imported segment, the segment size estimate that displays on the Amazon Pinpoint console indicates the size of the imported segment without any filters applied to it.","properties":{"Id":"The unique identifier for the source segment.","Version":"The version number of the source segment."}},"AWS::Pinpoint::SmsTemplate":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the message template.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the name of the message template ( `TemplateName` )."},"description":"Creates a message template that you can use in messages that are sent through the SMS channel. A *message template* is a set of content and settings that you can define, save, and reuse in messages for any of your Amazon Pinpoint applications.","properties":{"Body":"The message body to use in text messages that are based on the message template.","DefaultSubstitutions":"A JSON object that specifies the default values to use for message variables in the message template. This object is a set of key-value pairs. Each key defines a message variable in the template. The corresponding value defines the default value for that variable. When you create a message that\'s based on the template, you can override these defaults with message-specific and address-specific variables and values.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","TemplateDescription":"A custom description of the message template.","TemplateName":"The name of the message template."}},"AWS::Pinpoint::VoiceChannel":{"attributes":{"Ref":"`Ref` returns the unique identifier ( `ApplicationId` ) for the Amazon Pinpoint application that the channel is associated with."},"description":"A *channel* is a type of platform that you can deliver messages to. To send a voice message, you send the message through the voice channel. Before you can use Amazon Pinpoint to send voice messages, you have to enable the voice channel for an Amazon Pinpoint application.\\n\\nThe VoiceChannel resource represents the status and other information about the voice channel for an application.","properties":{"ApplicationId":"The unique identifier for the Amazon Pinpoint application that the voice channel applies to.","Enabled":"Specifies whether to enable the voice channel for the application."}},"AWS::PinpointEmail::ConfigurationSet":{"attributes":{"Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myConfigurationSet\\" }`\\n\\nFor the Amazon Pinpoint configuration set `myConfigurationSet` , Ref returns the name of the configuration set."},"description":"Create a configuration set. *Configuration sets* are groups of rules that you can apply to the emails you send using Amazon Pinpoint. You apply a configuration set to an email by including a reference to the configuration set in the headers of the email. When you apply a configuration set to an email, all of the rules in that configuration set are applied to the email.","properties":{"DeliveryOptions":"An object that defines the dedicated IP pool that is used to send emails that you send using the configuration set.","Name":"The name of the configuration set.","ReputationOptions":"An object that defines whether or not Amazon Pinpoint collects reputation metrics for the emails that you send that use the configuration set.","SendingOptions":"An object that defines whether or not Amazon Pinpoint can send email that you send using the configuration set.","Tags":"An object that defines the tags (keys and values) that you want to associate with the configuration set.","TrackingOptions":"An object that defines the open and click tracking options for emails that you send using the configuration set."}},"AWS::PinpointEmail::ConfigurationSet.DeliveryOptions":{"attributes":{},"description":"Used to associate a configuration set with a dedicated IP pool.","properties":{"SendingPoolName":"The name of the dedicated IP pool that you want to associate with the configuration set."}},"AWS::PinpointEmail::ConfigurationSet.ReputationOptions":{"attributes":{},"description":"Enable or disable collection of reputation metrics for emails that you send using this configuration set in the current AWS Region.","properties":{"ReputationMetricsEnabled":"If `true` , tracking of reputation metrics is enabled for the configuration set. If `false` , tracking of reputation metrics is disabled for the configuration set."}},"AWS::PinpointEmail::ConfigurationSet.SendingOptions":{"attributes":{},"description":"Used to enable or disable email sending for messages that use this configuration set in the current AWS Region.","properties":{"SendingEnabled":"If `true` , email sending is enabled for the configuration set. If `false` , email sending is disabled for the configuration set."}},"AWS::PinpointEmail::ConfigurationSet.Tags":{"attributes":{},"description":"An object that defines the tags (keys and values) that you want to associate with the configuration set.","properties":{"Key":"One part of a key-value pair that defines a tag. The maximum length of a tag key is 128 characters. The minimum length is 1 character.\\n\\nIf you specify tags for the configuration set, then this value is required.","Value":"The optional part of a key-value pair that defines a tag. The maximum length of a tag value is 256 characters. The minimum length is 0 characters. If you don’t want a resource to have a specific tag value, don’t specify a value for this parameter. Amazon Pinpoint will set the value to an empty string."}},"AWS::PinpointEmail::ConfigurationSet.TrackingOptions":{"attributes":{},"description":"An object that defines the tracking options for a configuration set. When you use Amazon Pinpoint to send an email, it contains an invisible image that\'s used to track when recipients open your email. If your email contains links, those links are changed slightly in order to track when recipients click them.\\n\\nThese images and links include references to a domain operated by AWS . You can optionally configure Amazon Pinpoint to use a domain that you operate for these images and links.","properties":{"CustomRedirectDomain":"The domain that you want to use for tracking open and click events."}},"AWS::PinpointEmail::ConfigurationSetEventDestination":{"attributes":{"Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myEventDestination\\" }`\\n\\nFor the Amazon Pinpoint event destination `myEventDestination` , Ref returns the name of the configuration set event destination."},"description":"Create an event destination. In Amazon Pinpoint, *events* include message sends, deliveries, opens, clicks, bounces, and complaints. *Event destinations* are places that you can send information about these events to. For example, you can send event data to Amazon SNS to receive notifications when you receive bounces or complaints, or you can use Amazon Kinesis Data Firehose to stream data to Amazon S3 for long-term storage.\\n\\nA single configuration set can include more than one event destination.","properties":{"ConfigurationSetName":"The name of the configuration set that contains the event destination that you want to modify.","EventDestination":"An object that defines the event destination.","EventDestinationName":"The name of the event destination that you want to modify."}},"AWS::PinpointEmail::ConfigurationSetEventDestination.CloudWatchDestination":{"attributes":{},"description":"An object that defines an Amazon CloudWatch destination for email events. You can use Amazon CloudWatch to monitor and gain insights on your email sending metrics.","properties":{"DimensionConfigurations":"An array of objects that define the dimensions to use when you send email events to Amazon CloudWatch."}},"AWS::PinpointEmail::ConfigurationSetEventDestination.DimensionConfiguration":{"attributes":{},"description":"An array of objects that define the dimensions to use when you send email events to Amazon CloudWatch.","properties":{"DefaultDimensionValue":"The default value of the dimension that is published to Amazon CloudWatch if you don\'t provide the value of the dimension when you send an email. This value has to meet the following criteria:\\n\\n- It can only contain ASCII letters (a–z, A–Z), numbers (0–9), underscores (_), or dashes (-).\\n- It can contain no more than 256 characters.","DimensionName":"The name of an Amazon CloudWatch dimension associated with an email sending metric. The name has to meet the following criteria:\\n\\n- It can only contain ASCII letters (a–z, A–Z), numbers (0–9), underscores (_), or dashes (-).\\n- It can contain no more than 256 characters.","DimensionValueSource":"The location where Amazon Pinpoint finds the value of a dimension to publish to Amazon CloudWatch. Acceptable values: `MESSAGE_TAG` , `EMAIL_HEADER` , and `LINK_TAG` .\\n\\nIf you want Amazon Pinpoint to use the message tags that you specify using an `X-SES-MESSAGE-TAGS` header or a parameter to the `SendEmail` API, choose `MESSAGE_TAG` . If you want Amazon Pinpoint to use your own email headers, choose `EMAIL_HEADER` . If you want Amazon Pinpoint to use tags that are specified in your links, choose `LINK_TAG` ."}},"AWS::PinpointEmail::ConfigurationSetEventDestination.EventDestination":{"attributes":{},"description":"In Amazon Pinpoint, *events* include message sends, deliveries, opens, clicks, bounces, and complaints. *Event destinations* are places that you can send information about these events to. For example, you can send event data to Amazon SNS to receive notifications when you receive bounces or complaints, or you can use Amazon Kinesis Data Firehose to stream data to Amazon S3 for long-term storage.","properties":{"CloudWatchDestination":"An object that defines an Amazon CloudWatch destination for email events. You can use Amazon CloudWatch to monitor and gain insights on your email sending metrics.","Enabled":"If `true` , the event destination is enabled. When the event destination is enabled, the specified event types are sent to the destinations in this `EventDestinationDefinition` .\\n\\nIf `false` , the event destination is disabled. When the event destination is disabled, events aren\'t sent to the specified destinations.","KinesisFirehoseDestination":"An object that defines an Amazon Kinesis Data Firehose destination for email events. You can use Amazon Kinesis Data Firehose to stream data to other services, such as Amazon S3 and Amazon Redshift.","MatchingEventTypes":"The types of events that Amazon Pinpoint sends to the specified event destinations. Acceptable values: `SEND` , `REJECT` , `BOUNCE` , `COMPLAINT` , `DELIVERY` , `OPEN` , `CLICK` , and `RENDERING_FAILURE` .","PinpointDestination":"An object that defines a Amazon Pinpoint destination for email events. You can use Amazon Pinpoint events to create attributes in Amazon Pinpoint projects. You can use these attributes to create segments for your campaigns.","SnsDestination":"An object that defines an Amazon SNS destination for email events. You can use Amazon SNS to send notification when certain email events occur."}},"AWS::PinpointEmail::ConfigurationSetEventDestination.KinesisFirehoseDestination":{"attributes":{},"description":"An object that defines an Amazon Kinesis Data Firehose destination for email events. You can use Amazon Kinesis Data Firehose to stream data to other services, such as Amazon S3 and Amazon Redshift.","properties":{"DeliveryStreamArn":"The Amazon Resource Name (ARN) of the Amazon Kinesis Data Firehose stream that Amazon Pinpoint sends email events to.","IamRoleArn":"The Amazon Resource Name (ARN) of the IAM role that Amazon Pinpoint uses when sending email events to the Amazon Kinesis Data Firehose stream."}},"AWS::PinpointEmail::ConfigurationSetEventDestination.PinpointDestination":{"attributes":{},"description":"An object that defines a Amazon Pinpoint destination for email events. You can use Amazon Pinpoint events to create attributes in Amazon Pinpoint projects. You can use these attributes to create segments for your campaigns.","properties":{"ApplicationArn":"The Amazon Resource Name (ARN) of the Amazon Pinpoint project that you want to send email events to."}},"AWS::PinpointEmail::ConfigurationSetEventDestination.SnsDestination":{"attributes":{},"description":"An object that defines an Amazon SNS destination for email events. You can use Amazon SNS to send notification when certain email events occur.","properties":{"TopicArn":"The Amazon Resource Name (ARN) of the Amazon SNS topic that you want to publish email events to. For more information about Amazon SNS topics, see the [Amazon SNS Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) ."}},"AWS::PinpointEmail::DedicatedIpPool":{"attributes":{"Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myDedicatedIpPool\\" }`\\n\\nFor the Amazon Pinpoint dedicated IP pool `myDedicatedIpPool` , Ref returns the name of the IP pool."},"description":"A request to create a new dedicated IP pool.","properties":{"PoolName":"The name of the dedicated IP pool.","Tags":"An object that defines the tags (keys and values) that you want to associate with the dedicated IP pool."}},"AWS::PinpointEmail::DedicatedIpPool.Tags":{"attributes":{},"description":"An object that defines the tags (keys and values) that you want to associate with the dedicated IP pool.","properties":{"Key":"One part of a key-value pair that defines a tag. The maximum length of a tag key is 128 characters. The minimum length is 1 character.\\n\\nIf you specify tags for the dedicated IP pool, then this value is required.","Value":"The optional part of a key-value pair that defines a tag. The maximum length of a tag value is 256 characters. The minimum length is 0 characters. If you don’t want a resource to have a specific tag value, don’t specify a value for this parameter. Amazon Pinpoint will set the value to an empty string."}},"AWS::PinpointEmail::Identity":{"attributes":{"IdentityDNSRecordName1":"The host name for the first token that you have to add to the DNS configuration for your domain.\\n\\nFor more information, see [Verifying a Domain](https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-email-manage-verify.html#channels-email-manage-verify-domain) in the Amazon Pinpoint User Guide.","IdentityDNSRecordName2":"The host name for the second token that you have to add to the DNS configuration for your domain.","IdentityDNSRecordName3":"The host name for the third token that you have to add to the DNS configuration for your domain.","IdentityDNSRecordValue1":"The record value for the first token that you have to add to the DNS configuration for your domain.","IdentityDNSRecordValue2":"The record value for the second token that you have to add to the DNS configuration for your domain.","IdentityDNSRecordValue3":"The record value for the third token that you have to add to the DNS configuration for your domain.","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myEmailIdentity\\" }`\\n\\nFor the Amazon Pinpoint identity `myEmailIdentity` , Ref returns the name of the identity (the email address or domain name)."},"description":"Specifies an identity to use for sending email through Amazon Pinpoint. In Amazon Pinpoint, an *identity* is an email address or domain that you use when you send email. Before you can use Amazon Pinpoint to send an email from an identity, you first have to verify it. By verifying an identity, you demonstrate that you\'re the owner of the address or domain, and that you\'ve given Amazon Pinpoint permission to send email from that identity.\\n\\nWhen you verify an email address, Amazon Pinpoint sends an email to the address. Your email address is verified as soon as you follow the link in the verification email.\\n\\nWhen you verify a domain, this operation provides a set of DKIM tokens, which you can convert into CNAME tokens. You add these CNAME tokens to the DNS configuration for your domain. Your domain is verified when Amazon Pinpoint detects these records in the DNS configuration for your domain. It usually takes around 72 hours to complete the domain verification process.\\n\\n> When you use CloudFormation to specify an identity, CloudFormation might indicate that the identity was created successfully. However, you have to verify the identity before you can use it to send email.","properties":{"DkimSigningEnabled":"For domain identities, this attribute is used to enable or disable DomainKeys Identified Mail (DKIM) signing for the domain.\\n\\nIf the value is `true` , then the messages that you send from the domain are signed using both the DKIM keys for your domain, as well as the keys for the `amazonses.com` domain. If the value is `false` , then the messages that you send are only signed using the DKIM keys for the `amazonses.com` domain.","FeedbackForwardingEnabled":"Used to enable or disable feedback forwarding for an identity. This setting determines what happens when an identity is used to send an email that results in a bounce or complaint event.\\n\\nWhen you enable feedback forwarding, Amazon Pinpoint sends you email notifications when bounce or complaint events occur. Amazon Pinpoint sends this notification to the address that you specified in the Return-Path header of the original email.\\n\\nWhen you disable feedback forwarding, Amazon Pinpoint sends notifications through other mechanisms, such as by notifying an Amazon SNS topic. You\'re required to have a method of tracking bounces and complaints. If you haven\'t set up another mechanism for receiving bounce or complaint notifications, Amazon Pinpoint sends an email notification when these events occur (even if this setting is disabled).","MailFromAttributes":"Used to enable or disable the custom Mail-From domain configuration for an email identity.","Name":"The address or domain of the identity, such as *sender@example.com* or *example.co.uk* .","Tags":"An object that defines the tags (keys and values) that you want to associate with the email identity."}},"AWS::PinpointEmail::Identity.MailFromAttributes":{"attributes":{},"description":"A list of attributes that are associated with a MAIL FROM domain.","properties":{"BehaviorOnMxFailure":"The action that Amazon Pinpoint to takes if it can\'t read the required MX record for a custom MAIL FROM domain. When you set this value to `UseDefaultValue` , Amazon Pinpoint uses *amazonses.com* as the MAIL FROM domain. When you set this value to `RejectMessage` , Amazon Pinpoint returns a `MailFromDomainNotVerified` error, and doesn\'t attempt to deliver the email.\\n\\nThese behaviors are taken when the custom MAIL FROM domain configuration is in the `Pending` , `Failed` , and `TemporaryFailure` states.","MailFromDomain":"The name of a domain that an email identity uses as a custom MAIL FROM domain."}},"AWS::PinpointEmail::Identity.Tags":{"attributes":{},"description":"An object that defines the tags (keys and values) that you want to associate with the identity.","properties":{"Key":"One part of a key-value pair that defines a tag. The maximum length of a tag key is 128 characters. The minimum length is 1 character.\\n\\nIf you specify tags for the identity, then this value is required.","Value":"The optional part of a key-value pair that defines a tag. The maximum length of a tag value is 256 characters. The minimum length is 0 characters. If you don’t want a resource to have a specific tag value, don’t specify a value for this parameter. Amazon Pinpoint will set the value to an empty string."}},"AWS::Pipes::Pipe":{"attributes":{"Arn":"The ARN of the pipe.","CreationTime":"The time the pipe was created.","CurrentState":"The state the pipe is in.","LastModifiedTime":"When the pipe was last updated, in [ISO-8601 format](https://docs.aws.amazon.com/https://www.w3.org/TR/NOTE-datetime) (YYYY-MM-DDThh:mm:ss.sTZD).","Ref":"`Ref` returns the name of the pipe that was created by the request.","StateReason":"The reason the pipe is in its current state."},"description":"Create a pipe. Amazon EventBridge Pipes connect event sources to targets and reduces the need for specialized knowledge and integration code.","properties":{"Description":"A description of the pipe.","DesiredState":"The state the pipe should be in.","Enrichment":"The ARN of the enrichment resource.","EnrichmentParameters":"The parameters required to set up enrichment on your pipe.","Name":"The name of the pipe.","RoleArn":"The ARN of the role that allows the pipe to send data to the target.","Source":"The ARN of the source resource.","SourceParameters":"The parameters required to set up a source for your pipe.","Tags":"The list of key-value pairs to associate with the pipe.","Target":"The ARN of the target resource.","TargetParameters":"The parameters required to set up a target for your pipe.\\n\\nFor more information about pipe target parameters, including how to use dynamic path parameters, see [Target parameters](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes-event-target.html) in the *Amazon EventBridge User Guide* ."}},"AWS::Pipes::Pipe.AwsVpcConfiguration":{"attributes":{},"description":"This structure specifies the VPC subnets and security groups for the task, and whether a public IP address is to be used. This structure is relevant only for ECS tasks that use the `awsvpc` network mode.","properties":{"AssignPublicIp":"Specifies whether the task\'s elastic network interface receives a public IP address. You can specify `ENABLED` only when `LaunchType` in `EcsParameters` is set to `FARGATE` .","SecurityGroups":"Specifies the security groups associated with the task. These security groups must all be in the same VPC. You can specify as many as five security groups. If you do not specify a security group, the default security group for the VPC is used.","Subnets":"Specifies the subnets associated with the task. These subnets must all be in the same VPC. You can specify as many as 16 subnets."}},"AWS::Pipes::Pipe.BatchArrayProperties":{"attributes":{},"description":"The array properties for the submitted job, such as the size of the array. The array size can be between 2 and 10,000. If you specify array properties for a job, it becomes an array job. This parameter is used only if the target is an AWS Batch job.","properties":{"Size":"The size of the array, if this is an array batch job."}},"AWS::Pipes::Pipe.BatchContainerOverrides":{"attributes":{},"description":"The overrides that are sent to a container.","properties":{"Command":"The command to send to the container that overrides the default command from the Docker image or the task definition.","Environment":"The environment variables to send to the container. You can add new environment variables, which are added to the container at launch, or you can override the existing environment variables from the Docker image or the task definition.\\n\\n> Environment variables cannot start with \\" `AWS Batch` \\". This naming convention is reserved for variables that AWS Batch sets.","InstanceType":"The instance type to use for a multi-node parallel job.\\n\\n> This parameter isn\'t applicable to single-node container jobs or jobs that run on Fargate resources, and shouldn\'t be provided.","ResourceRequirements":"The type and amount of resources to assign to a container. This overrides the settings in the job definition. The supported resources include `GPU` , `MEMORY` , and `VCPU` ."}},"AWS::Pipes::Pipe.BatchEnvironmentVariable":{"attributes":{},"description":"The environment variables to send to the container. You can add new environment variables, which are added to the container at launch, or you can override the existing environment variables from the Docker image or the task definition.\\n\\n> Environment variables cannot start with \\" `AWS Batch` \\". This naming convention is reserved for variables that AWS Batch sets.","properties":{"Name":"The name of the key-value pair. For environment variables, this is the name of the environment variable.","Value":"The value of the key-value pair. For environment variables, this is the value of the environment variable."}},"AWS::Pipes::Pipe.BatchJobDependency":{"attributes":{},"description":"An object that represents an AWS Batch job dependency.","properties":{"JobId":"The job ID of the AWS Batch job that\'s associated with this dependency.","Type":"The type of the job dependency."}},"AWS::Pipes::Pipe.BatchResourceRequirement":{"attributes":{},"description":"The type and amount of a resource to assign to a container. The supported resources include `GPU` , `MEMORY` , and `VCPU` .","properties":{"Type":"The type of resource to assign to a container. The supported resources include `GPU` , `MEMORY` , and `VCPU` .","Value":"The quantity of the specified resource to reserve for the container. The values vary based on the `type` specified.\\n\\n- **type=\\"GPU\\"** - The number of physical GPUs to reserve for the container. Make sure that the number of GPUs reserved for all containers in a job doesn\'t exceed the number of available GPUs on the compute resource that the job is launched on.\\n\\n> GPUs aren\'t available for jobs that are running on Fargate resources.\\n- **type=\\"MEMORY\\"** - The memory hard limit (in MiB) present to the container. This parameter is supported for jobs that are running on EC2 resources. If your container attempts to exceed the memory specified, the container is terminated. This parameter maps to `Memory` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--memory` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . You must specify at least 4 MiB of memory for a job. This is required but can be specified in several places for multi-node parallel (MNP) jobs. It must be specified for each node at least once. This parameter maps to `Memory` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--memory` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) .\\n\\n> If you\'re trying to maximize your resource utilization by providing your jobs as much memory as possible for a particular instance type, see [Memory management](https://docs.aws.amazon.com/batch/latest/userguide/memory-management.html) in the *AWS Batch User Guide* . \\n\\nFor jobs that are running on Fargate resources, then `value` is the hard limit (in MiB), and must match one of the supported values and the `VCPU` values must be one of the values supported for that memory value.\\n\\n- **value = 512** - `VCPU` = 0.25\\n- **value = 1024** - `VCPU` = 0.25 or 0.5\\n- **value = 2048** - `VCPU` = 0.25, 0.5, or 1\\n- **value = 3072** - `VCPU` = 0.5, or 1\\n- **value = 4096** - `VCPU` = 0.5, 1, or 2\\n- **value = 5120, 6144, or 7168** - `VCPU` = 1 or 2\\n- **value = 8192** - `VCPU` = 1, 2, 4, or 8\\n- **value = 9216, 10240, 11264, 12288, 13312, 14336, or 15360** - `VCPU` = 2 or 4\\n- **value = 16384** - `VCPU` = 2, 4, or 8\\n- **value = 17408, 18432, 19456, 21504, 22528, 23552, 25600, 26624, 27648, 29696, or 30720** - `VCPU` = 4\\n- **value = 20480, 24576, or 28672** - `VCPU` = 4 or 8\\n- **value = 36864, 45056, 53248, or 61440** - `VCPU` = 8\\n- **value = 32768, 40960, 49152, or 57344** - `VCPU` = 8 or 16\\n- **value = 65536, 73728, 81920, 90112, 98304, 106496, 114688, or 122880** - `VCPU` = 16\\n- **type=\\"VCPU\\"** - The number of vCPUs reserved for the container. This parameter maps to `CpuShares` in the [Create a container](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/#create-a-container) section of the [Docker Remote API](https://docs.aws.amazon.com/https://docs.docker.com/engine/api/v1.23/) and the `--cpu-shares` option to [docker run](https://docs.aws.amazon.com/https://docs.docker.com/engine/reference/run/) . Each vCPU is equivalent to 1,024 CPU shares. For EC2 resources, you must specify at least one vCPU. This is required but can be specified in several places; it must be specified for each node at least once.\\n\\nThe default for the Fargate On-Demand vCPU resource count quota is 6 vCPUs. For more information about Fargate quotas, see [AWS Fargate quotas](https://docs.aws.amazon.com/general/latest/gr/ecs-service.html#service-quotas-fargate) in the *AWS General Reference* .\\n\\nFor jobs that are running on Fargate resources, then `value` must match one of the supported values and the `MEMORY` values must be one of the values supported for that `VCPU` value. The supported values are 0.25, 0.5, 1, 2, 4, 8, and 16\\n\\n- **value = 0.25** - `MEMORY` = 512, 1024, or 2048\\n- **value = 0.5** - `MEMORY` = 1024, 2048, 3072, or 4096\\n- **value = 1** - `MEMORY` = 2048, 3072, 4096, 5120, 6144, 7168, or 8192\\n- **value = 2** - `MEMORY` = 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336, 15360, or 16384\\n- **value = 4** - `MEMORY` = 8192, 9216, 10240, 11264, 12288, 13312, 14336, 15360, 16384, 17408, 18432, 19456, 20480, 21504, 22528, 23552, 24576, 25600, 26624, 27648, 28672, 29696, or 30720\\n- **value = 8** - `MEMORY` = 16384, 20480, 24576, 28672, 32768, 36864, 40960, 45056, 49152, 53248, 57344, or 61440\\n- **value = 16** - `MEMORY` = 32768, 40960, 49152, 57344, 65536, 73728, 81920, 90112, 98304, 106496, 114688, or 122880"}},"AWS::Pipes::Pipe.BatchRetryStrategy":{"attributes":{},"description":"The retry strategy that\'s associated with a job. For more information, see [Automated job retries](https://docs.aws.amazon.com/batch/latest/userguide/job_retries.html) in the *AWS Batch User Guide* .","properties":{"Attempts":"The number of times to move a job to the `RUNNABLE` status. If the value of `attempts` is greater than one, the job is retried on failure the same number of attempts as the value."}},"AWS::Pipes::Pipe.CapacityProviderStrategyItem":{"attributes":{},"description":"The details of a capacity provider strategy. To learn more, see [CapacityProviderStrategyItem](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CapacityProviderStrategyItem.html) in the Amazon ECS API Reference.","properties":{"Base":"The base value designates how many tasks, at a minimum, to run on the specified capacity provider. Only one capacity provider in a capacity provider strategy can have a base defined. If no value is specified, the default value of 0 is used.","CapacityProvider":"The short name of the capacity provider.","Weight":"The weight value designates the relative percentage of the total number of tasks launched that should use the specified capacity provider. The weight value is taken into consideration after the base value, if defined, is satisfied."}},"AWS::Pipes::Pipe.DeadLetterConfig":{"attributes":{},"description":"A `DeadLetterConfig` object that contains information about a dead-letter queue configuration.","properties":{"Arn":"The ARN of the Amazon SQS queue specified as the target for the dead-letter queue."}},"AWS::Pipes::Pipe.EcsContainerOverride":{"attributes":{},"description":"The overrides that are sent to a container. An empty container override can be passed in. An example of an empty container override is `{\\"containerOverrides\\": [ ] }` . If a non-empty container override is specified, the `name` parameter must be included.","properties":{"Command":"The command to send to the container that overrides the default command from the Docker image or the task definition. You must also specify a container name.","Cpu":"The number of `cpu` units reserved for the container, instead of the default value from the task definition. You must also specify a container name.","Environment":"The environment variables to send to the container. You can add new environment variables, which are added to the container at launch, or you can override the existing environment variables from the Docker image or the task definition. You must also specify a container name.","EnvironmentFiles":"A list of files containing the environment variables to pass to a container, instead of the value from the container definition.","Memory":"The hard limit (in MiB) of memory to present to the container, instead of the default value from the task definition. If your container attempts to exceed the memory specified here, the container is killed. You must also specify a container name.","MemoryReservation":"The soft limit (in MiB) of memory to reserve for the container, instead of the default value from the task definition. You must also specify a container name.","Name":"The name of the container that receives the override. This parameter is required if any override is specified.","ResourceRequirements":"The type and amount of a resource to assign to a container, instead of the default value from the task definition. The only supported resource is a GPU."}},"AWS::Pipes::Pipe.EcsEnvironmentFile":{"attributes":{},"description":"A list of files containing the environment variables to pass to a container. You can specify up to ten environment files. The file must have a `.env` file extension. Each line in an environment file should contain an environment variable in `VARIABLE=VALUE` format. Lines beginning with `#` are treated as comments and are ignored. For more information about the environment variable file syntax, see [Declare default environment variables in file](https://docs.aws.amazon.com/https://docs.docker.com/compose/env-file/) .\\n\\nIf there are environment variables specified using the `environment` parameter in a container definition, they take precedence over the variables contained within an environment file. If multiple environment files are specified that contain the same variable, they\'re processed from the top down. We recommend that you use unique variable names. For more information, see [Specifying environment variables](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/taskdef-envfiles.html) in the *Amazon Elastic Container Service Developer Guide* .\\n\\nThis parameter is only supported for tasks hosted on Fargate using the following platform versions:\\n\\n- Linux platform version `1.4.0` or later.\\n- Windows platform version `1.0.0` or later.","properties":{"Type":"The file type to use. The only supported value is `s3` .","Value":"The Amazon Resource Name (ARN) of the Amazon S3 object containing the environment variable file."}},"AWS::Pipes::Pipe.EcsEnvironmentVariable":{"attributes":{},"description":"The environment variables to send to the container. You can add new environment variables, which are added to the container at launch, or you can override the existing environment variables from the Docker image or the task definition. You must also specify a container name.","properties":{"Name":"The name of the key-value pair. For environment variables, this is the name of the environment variable.","Value":"The value of the key-value pair. For environment variables, this is the value of the environment variable."}},"AWS::Pipes::Pipe.EcsEphemeralStorage":{"attributes":{},"description":"The amount of ephemeral storage to allocate for the task. This parameter is used to expand the total amount of ephemeral storage available, beyond the default amount, for tasks hosted on Fargate . For more information, see [Fargate task storage](https://docs.aws.amazon.com/AmazonECS/latest/userguide/using_data_volumes.html) in the *Amazon ECS User Guide for Fargate* .\\n\\n> This parameter is only supported for tasks hosted on Fargate using Linux platform version `1.4.0` or later. This parameter is not supported for Windows containers on Fargate .","properties":{"SizeInGiB":"The total amount, in GiB, of ephemeral storage to set for the task. The minimum supported value is `21` GiB and the maximum supported value is `200` GiB."}},"AWS::Pipes::Pipe.EcsInferenceAcceleratorOverride":{"attributes":{},"description":"Details on an Elastic Inference accelerator task override. This parameter is used to override the Elastic Inference accelerator specified in the task definition. For more information, see [Working with Amazon Elastic Inference on Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/userguide/ecs-inference.html) in the *Amazon Elastic Container Service Developer Guide* .","properties":{"DeviceName":"The Elastic Inference accelerator device name to override for the task. This parameter must match a `deviceName` specified in the task definition.","DeviceType":"The Elastic Inference accelerator type to use."}},"AWS::Pipes::Pipe.EcsResourceRequirement":{"attributes":{},"description":"The type and amount of a resource to assign to a container. The supported resource types are GPUs and Elastic Inference accelerators. For more information, see [Working with GPUs on Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-gpu.html) or [Working with Amazon Elastic Inference on Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-inference.html) in the *Amazon Elastic Container Service Developer Guide*","properties":{"Type":"The type of resource to assign to a container. The supported values are `GPU` or `InferenceAccelerator` .","Value":"The value for the specified resource type.\\n\\nIf the `GPU` type is used, the value is the number of physical `GPUs` the Amazon ECS container agent reserves for the container. The number of GPUs that\'s reserved for all containers in a task can\'t exceed the number of available GPUs on the container instance that the task is launched on.\\n\\nIf the `InferenceAccelerator` type is used, the `value` matches the `deviceName` for an InferenceAccelerator specified in a task definition."}},"AWS::Pipes::Pipe.EcsTaskOverride":{"attributes":{},"description":"The overrides that are associated with a task.","properties":{"ContainerOverrides":"One or more container overrides that are sent to a task.","Cpu":"The cpu override for the task.","EphemeralStorage":"The ephemeral storage setting override for the task.\\n\\n> This parameter is only supported for tasks hosted on Fargate that use the following platform versions:\\n> \\n> - Linux platform version `1.4.0` or later.\\n> - Windows platform version `1.0.0` or later.","ExecutionRoleArn":"The Amazon Resource Name (ARN) of the task execution IAM role override for the task. For more information, see [Amazon ECS task execution IAM role](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html) in the *Amazon Elastic Container Service Developer Guide* .","InferenceAcceleratorOverrides":"The Elastic Inference accelerator override for the task.","Memory":"The memory override for the task.","TaskRoleArn":"The Amazon Resource Name (ARN) of the IAM role that containers in this task can assume. All containers in this task are granted the permissions that are specified in this role. For more information, see [IAM Role for Tasks](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) in the *Amazon Elastic Container Service Developer Guide* ."}},"AWS::Pipes::Pipe.Filter":{"attributes":{},"description":"Filter events using an event pattern. For more information, see [Events and Event Patterns](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-and-event-patterns.html) in the *Amazon EventBridge User Guide* .","properties":{"Pattern":"The event pattern."}},"AWS::Pipes::Pipe.FilterCriteria":{"attributes":{},"description":"The collection of event patterns used to filter events.\\n\\nTo remove a filter, specify a `FilterCriteria` object with an empty array of `Filter` objects.\\n\\nFor more information, see [Events and Event Patterns](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-and-event-patterns.html) in the *Amazon EventBridge User Guide* .","properties":{"Filters":"The event patterns."}},"AWS::Pipes::Pipe.MQBrokerAccessCredentials":{"attributes":{},"description":"The AWS Secrets Manager secret that stores your broker credentials.","properties":{"BasicAuth":"The ARN of the Secrets Manager secret."}},"AWS::Pipes::Pipe.MSKAccessCredentials":{"attributes":{},"description":"The AWS Secrets Manager secret that stores your stream credentials.","properties":{"ClientCertificateTlsAuth":"The ARN of the Secrets Manager secret.","SaslScram512Auth":"The ARN of the Secrets Manager secret."}},"AWS::Pipes::Pipe.NetworkConfiguration":{"attributes":{},"description":"This structure specifies the network configuration for an Amazon ECS task.","properties":{"AwsvpcConfiguration":"Use this structure to specify the VPC subnets and security groups for the task, and whether a public IP address is to be used. This structure is relevant only for ECS tasks that use the `awsvpc` network mode."}},"AWS::Pipes::Pipe.PipeEnrichmentHttpParameters":{"attributes":{},"description":"These are custom parameter to be used when the target is an API Gateway REST APIs or EventBridge ApiDestinations. In the latter case, these are merged with any InvocationParameters specified on the Connection, with any values from the Connection taking precedence.","properties":{"HeaderParameters":"The headers that need to be sent as part of request invoking the API Gateway REST API or EventBridge ApiDestination.","PathParameterValues":"The path parameter values to be used to populate API Gateway REST API or EventBridge ApiDestination path wildcards (\\"*\\").","QueryStringParameters":"The query string keys/values that need to be sent as part of request invoking the API Gateway REST API or EventBridge ApiDestination."}},"AWS::Pipes::Pipe.PipeEnrichmentParameters":{"attributes":{},"description":"The parameters required to set up enrichment on your pipe.","properties":{"HttpParameters":"Contains the HTTP parameters to use when the target is a API Gateway REST endpoint or EventBridge ApiDestination.\\n\\nIf you specify an API Gateway REST API or EventBridge ApiDestination as a target, you can use this parameter to specify headers, path parameters, and query string keys/values as part of your target invoking request. If you\'re using ApiDestinations, the corresponding Connection can also have these values configured. In case of any conflicting keys, values from the Connection take precedence.","InputTemplate":"Valid JSON text passed to the enrichment. In this case, nothing from the event itself is passed to the enrichment. For more information, see [The JavaScript Object Notation (JSON) Data Interchange Format](https://docs.aws.amazon.com/http://www.rfc-editor.org/rfc/rfc7159.txt) .\\n\\nTo remove an input template, specify an empty string."}},"AWS::Pipes::Pipe.PipeSourceActiveMQBrokerParameters":{"attributes":{},"description":"The parameters for using an Active MQ broker as a source.","properties":{"BatchSize":"The maximum number of records to include in each batch.","Credentials":"The credentials needed to access the resource.","MaximumBatchingWindowInSeconds":"The maximum length of a time to wait for events.","QueueName":"The name of the destination queue to consume."}},"AWS::Pipes::Pipe.PipeSourceDynamoDBStreamParameters":{"attributes":{},"description":"The parameters for using a DynamoDB stream as a source.","properties":{"BatchSize":"The maximum number of records to include in each batch.","DeadLetterConfig":"Define the target queue to send dead-letter queue events to.","MaximumBatchingWindowInSeconds":"The maximum length of a time to wait for events.","MaximumRecordAgeInSeconds":"(Streams only) Discard records older than the specified age. The default value is -1, which sets the maximum age to infinite. When the value is set to infinite, EventBridge never discards old records.","MaximumRetryAttempts":"(Streams only) Discard records after the specified number of retries. The default value is -1, which sets the maximum number of retries to infinite. When MaximumRetryAttempts is infinite, EventBridge retries failed records until the record expires in the event source.","OnPartialBatchItemFailure":"(Streams only) Define how to handle item process failures. `AUTOMATIC_BISECT` halves each batch and retry each half until all the records are processed or there is one failed message left in the batch.","ParallelizationFactor":"(Streams only) The number of batches to process concurrently from each shard. The default value is 1.","StartingPosition":"(Streams only) The position in a stream from which to start reading.\\n\\n*Valid values* : `TRIM_HORIZON | LATEST`"}},"AWS::Pipes::Pipe.PipeSourceKinesisStreamParameters":{"attributes":{},"description":"The parameters for using a Kinesis stream as a source.","properties":{"BatchSize":"The maximum number of records to include in each batch.","DeadLetterConfig":"Define the target queue to send dead-letter queue events to.","MaximumBatchingWindowInSeconds":"The maximum length of a time to wait for events.","MaximumRecordAgeInSeconds":"(Streams only) Discard records older than the specified age. The default value is -1, which sets the maximum age to infinite. When the value is set to infinite, EventBridge never discards old records.","MaximumRetryAttempts":"(Streams only) Discard records after the specified number of retries. The default value is -1, which sets the maximum number of retries to infinite. When MaximumRetryAttempts is infinite, EventBridge retries failed records until the record expires in the event source.","OnPartialBatchItemFailure":"(Streams only) Define how to handle item process failures. `AUTOMATIC_BISECT` halves each batch and retry each half until all the records are processed or there is one failed message left in the batch.","ParallelizationFactor":"(Streams only) The number of batches to process concurrently from each shard. The default value is 1.","StartingPosition":"(Streams only) The position in a stream from which to start reading.","StartingPositionTimestamp":"With `StartingPosition` set to `AT_TIMESTAMP` , the time from which to start reading, in Unix time seconds."}},"AWS::Pipes::Pipe.PipeSourceManagedStreamingKafkaParameters":{"attributes":{},"description":"The parameters for using an MSK stream as a source.","properties":{"BatchSize":"The maximum number of records to include in each batch.","ConsumerGroupID":"The name of the destination queue to consume.","Credentials":"The credentials needed to access the resource.","MaximumBatchingWindowInSeconds":"The maximum length of a time to wait for events.","StartingPosition":"(Streams only) The position in a stream from which to start reading.","TopicName":"The name of the topic that the pipe will read from."}},"AWS::Pipes::Pipe.PipeSourceParameters":{"attributes":{},"description":"The parameters required to set up a source for your pipe.","properties":{"ActiveMQBrokerParameters":"The parameters for using an Active MQ broker as a source.","DynamoDBStreamParameters":"The parameters for using a DynamoDB stream as a source.","FilterCriteria":"The collection of event patterns used to filter events.\\n\\nTo remove a filter, specify a `FilterCriteria` object with an empty array of `Filter` objects.\\n\\nFor more information, see [Events and Event Patterns](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-and-event-patterns.html) in the *Amazon EventBridge User Guide* .","KinesisStreamParameters":"The parameters for using a Kinesis stream as a source.","ManagedStreamingKafkaParameters":"The parameters for using an MSK stream as a source.","RabbitMQBrokerParameters":"The parameters for using a Rabbit MQ broker as a source.","SelfManagedKafkaParameters":"The parameters for using a self-managed Apache Kafka stream as a source.","SqsQueueParameters":"The parameters for using a Amazon SQS stream as a source."}},"AWS::Pipes::Pipe.PipeSourceRabbitMQBrokerParameters":{"attributes":{},"description":"The parameters for using a Rabbit MQ broker as a source.","properties":{"BatchSize":"The maximum number of records to include in each batch.","Credentials":"The credentials needed to access the resource.","MaximumBatchingWindowInSeconds":"The maximum length of a time to wait for events.","QueueName":"The name of the destination queue to consume.","VirtualHost":"The name of the virtual host associated with the source broker."}},"AWS::Pipes::Pipe.PipeSourceSelfManagedKafkaParameters":{"attributes":{},"description":"The parameters for using a self-managed Apache Kafka stream as a source.","properties":{"AdditionalBootstrapServers":"An array of server URLs.","BatchSize":"The maximum number of records to include in each batch.","ConsumerGroupID":"The name of the destination queue to consume.","Credentials":"The credentials needed to access the resource.","MaximumBatchingWindowInSeconds":"The maximum length of a time to wait for events.","ServerRootCaCertificate":"The ARN of the Secrets Manager secret used for certification.","StartingPosition":"(Streams only) The position in a stream from which to start reading.","TopicName":"The name of the topic that the pipe will read from.","Vpc":"This structure specifies the VPC subnets and security groups for the stream, and whether a public IP address is to be used."}},"AWS::Pipes::Pipe.PipeSourceSqsQueueParameters":{"attributes":{},"description":"The parameters for using a Amazon SQS stream as a source.","properties":{"BatchSize":"The maximum number of records to include in each batch.","MaximumBatchingWindowInSeconds":"The maximum length of a time to wait for events."}},"AWS::Pipes::Pipe.PipeTargetBatchJobParameters":{"attributes":{},"description":"The parameters for using an AWS Batch job as a target.","properties":{"ArrayProperties":"The array properties for the submitted job, such as the size of the array. The array size can be between 2 and 10,000. If you specify array properties for a job, it becomes an array job. This parameter is used only if the target is an AWS Batch job.","ContainerOverrides":"The overrides that are sent to a container.","DependsOn":"A list of dependencies for the job. A job can depend upon a maximum of 20 jobs. You can specify a `SEQUENTIAL` type dependency without specifying a job ID for array jobs so that each child array job completes sequentially, starting at index 0. You can also specify an `N_TO_N` type dependency with a job ID for array jobs. In that case, each index child of this job must wait for the corresponding index child of each dependency to complete before it can begin.","JobDefinition":"The job definition used by this job. This value can be one of `name` , `name:revision` , or the Amazon Resource Name (ARN) for the job definition. If name is specified without a revision then the latest active revision is used.","JobName":"The name of the job. It can be up to 128 letters long. The first character must be alphanumeric, can contain uppercase and lowercase letters, numbers, hyphens (-), and underscores (_).","Parameters":"Additional parameters passed to the job that replace parameter substitution placeholders that are set in the job definition. Parameters are specified as a key and value pair mapping. Parameters included here override any corresponding parameter defaults from the job definition.","RetryStrategy":"The retry strategy to use for failed jobs. When a retry strategy is specified here, it overrides the retry strategy defined in the job definition."}},"AWS::Pipes::Pipe.PipeTargetCloudWatchLogsParameters":{"attributes":{},"description":"The parameters for using an CloudWatch Logs log stream as a target.","properties":{"LogStreamName":"The name of the log stream.","Timestamp":"The time the event occurred, expressed as the number of milliseconds after Jan 1, 1970 00:00:00 UTC."}},"AWS::Pipes::Pipe.PipeTargetEcsTaskParameters":{"attributes":{},"description":"The parameters for using an Amazon ECS task as a target.","properties":{"CapacityProviderStrategy":"The capacity provider strategy to use for the task.\\n\\nIf a `capacityProviderStrategy` is specified, the `launchType` parameter must be omitted. If no `capacityProviderStrategy` or launchType is specified, the `defaultCapacityProviderStrategy` for the cluster is used.","EnableECSManagedTags":"Specifies whether to enable Amazon ECS managed tags for the task. For more information, see [Tagging Your Amazon ECS Resources](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html) in the Amazon Elastic Container Service Developer Guide.","EnableExecuteCommand":"Whether or not to enable the execute command functionality for the containers in this task. If true, this enables execute command functionality on all containers in the task.","Group":"Specifies an Amazon ECS task group for the task. The maximum length is 255 characters.","LaunchType":"Specifies the launch type on which your task is running. The launch type that you specify here must match one of the launch type (compatibilities) of the target task. The `FARGATE` value is supported only in the Regions where AWS Fargate with Amazon ECS is supported. For more information, see [AWS Fargate on Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS-Fargate.html) in the *Amazon Elastic Container Service Developer Guide* .","NetworkConfiguration":"Use this structure if the Amazon ECS task uses the `awsvpc` network mode. This structure specifies the VPC subnets and security groups associated with the task, and whether a public IP address is to be used. This structure is required if `LaunchType` is `FARGATE` because the `awsvpc` mode is required for Fargate tasks.\\n\\nIf you specify `NetworkConfiguration` when the target ECS task does not use the `awsvpc` network mode, the task fails.","Overrides":"The overrides that are associated with a task.","PlacementConstraints":"An array of placement constraint objects to use for the task. You can specify up to 10 constraints per task (including constraints in the task definition and those specified at runtime).","PlacementStrategy":"The placement strategy objects to use for the task. You can specify a maximum of five strategy rules per task.","PlatformVersion":"Specifies the platform version for the task. Specify only the numeric portion of the platform version, such as `1.1.0` .\\n\\nThis structure is used only if `LaunchType` is `FARGATE` . For more information about valid platform versions, see [AWS Fargate Platform Versions](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html) in the *Amazon Elastic Container Service Developer Guide* .","PropagateTags":"Specifies whether to propagate the tags from the task definition to the task. If no value is specified, the tags are not propagated. Tags can only be propagated to the task during task creation. To add tags to a task after task creation, use the `TagResource` API action.","ReferenceId":"The reference ID to use for the task.","Tags":"The metadata that you apply to the task to help you categorize and organize them. Each tag consists of a key and an optional value, both of which you define. To learn more, see [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html#ECS-RunTask-request-tags) in the Amazon ECS API Reference.","TaskCount":"The number of tasks to create based on `TaskDefinition` . The default is 1.","TaskDefinitionArn":"The ARN of the task definition to use if the event target is an Amazon ECS task."}},"AWS::Pipes::Pipe.PipeTargetEventBridgeEventBusParameters":{"attributes":{},"description":"The parameters for using an EventBridge event bus as a target.","properties":{"DetailType":"A free-form string, with a maximum of 128 characters, used to decide what fields to expect in the event detail.","EndpointId":"The URL subdomain of the endpoint. For example, if the URL for Endpoint is https://abcde.veo.endpoints.event.amazonaws.com, then the EndpointId is `abcde.veo` .","Resources":"AWS resources, identified by Amazon Resource Name (ARN), which the event primarily concerns. Any number, including zero, may be present.","Source":"The source of the event.","Time":"The time stamp of the event, per [RFC3339](https://docs.aws.amazon.com/https://www.rfc-editor.org/rfc/rfc3339.txt) . If no time stamp is provided, the time stamp of the [PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html) call is used."}},"AWS::Pipes::Pipe.PipeTargetHttpParameters":{"attributes":{},"description":"These are custom parameter to be used when the target is an API Gateway REST APIs or EventBridge ApiDestinations.","properties":{"HeaderParameters":"The headers that need to be sent as part of request invoking the API Gateway REST API or EventBridge ApiDestination.","PathParameterValues":"The path parameter values to be used to populate API Gateway REST API or EventBridge ApiDestination path wildcards (\\"*\\").","QueryStringParameters":"The query string keys/values that need to be sent as part of request invoking the API Gateway REST API or EventBridge ApiDestination."}},"AWS::Pipes::Pipe.PipeTargetKinesisStreamParameters":{"attributes":{},"description":"The parameters for using a Kinesis stream as a target.","properties":{"PartitionKey":"Determines which shard in the stream the data record is assigned to. Partition keys are Unicode strings with a maximum length limit of 256 characters for each key. Amazon Kinesis Data Streams uses the partition key as input to a hash function that maps the partition key and associated data to a specific shard. Specifically, an MD5 hash function is used to map partition keys to 128-bit integer values and to map associated data records to shards. As a result of this hashing mechanism, all data records with the same partition key map to the same shard within the stream."}},"AWS::Pipes::Pipe.PipeTargetLambdaFunctionParameters":{"attributes":{},"description":"The parameters for using a Lambda function as a target.","properties":{"InvocationType":"Specify whether to invoke the function synchronously or asynchronously.\\n\\n- `REQUEST_RESPONSE` (default) - Invoke synchronously. This corresponds to the `RequestResponse` option in the `InvocationType` parameter for the Lambda [Invoke](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestSyntax) API.\\n- `FIRE_AND_FORGET` - Invoke asynchronously. This corresponds to the `Event` option in the `InvocationType` parameter for the Lambda [Invoke](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestSyntax) API.\\n\\nFor more information, see [Invocation types](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html#pipes-invocation) in the *Amazon EventBridge User Guide* ."}},"AWS::Pipes::Pipe.PipeTargetParameters":{"attributes":{},"description":"The parameters required to set up a target for your pipe.\\n\\nFor more information about pipe target parameters, including how to use dynamic path parameters, see [Target parameters](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes-event-target.html) in the *Amazon EventBridge User Guide* .","properties":{"BatchJobParameters":"The parameters for using an AWS Batch job as a target.","CloudWatchLogsParameters":"The parameters for using an CloudWatch Logs log stream as a target.","EcsTaskParameters":"The parameters for using an Amazon ECS task as a target.","EventBridgeEventBusParameters":"The parameters for using an EventBridge event bus as a target.","HttpParameters":"These are custom parameter to be used when the target is an API Gateway REST APIs or EventBridge ApiDestinations.","InputTemplate":"Valid JSON text passed to the target. In this case, nothing from the event itself is passed to the target. For more information, see [The JavaScript Object Notation (JSON) Data Interchange Format](https://docs.aws.amazon.com/http://www.rfc-editor.org/rfc/rfc7159.txt) .\\n\\nTo remove an input template, specify an empty string.","KinesisStreamParameters":"The parameters for using a Kinesis stream as a target.","LambdaFunctionParameters":"The parameters for using a Lambda function as a target.","RedshiftDataParameters":"These are custom parameters to be used when the target is a Amazon Redshift cluster to invoke the Amazon Redshift Data API BatchExecuteStatement.","SageMakerPipelineParameters":"The parameters for using a SageMaker pipeline as a target.","SqsQueueParameters":"The parameters for using a Amazon SQS stream as a target.","StepFunctionStateMachineParameters":"The parameters for using a Step Functions state machine as a target."}},"AWS::Pipes::Pipe.PipeTargetRedshiftDataParameters":{"attributes":{},"description":"These are custom parameters to be used when the target is a Amazon Redshift cluster to invoke the Amazon Redshift Data API BatchExecuteStatement.","properties":{"Database":"The name of the database. Required when authenticating using temporary credentials.","DbUser":"The database user name. Required when authenticating using temporary credentials.","SecretManagerArn":"The name or ARN of the secret that enables access to the database. Required when authenticating using Secrets Manager .","Sqls":"The SQL statement text to run.","StatementName":"The name of the SQL statement. You can name the SQL statement when you create it to identify the query.","WithEvent":"Indicates whether to send an event back to EventBridge after the SQL statement runs."}},"AWS::Pipes::Pipe.PipeTargetSageMakerPipelineParameters":{"attributes":{},"description":"The parameters for using a SageMaker pipeline as a target.","properties":{"PipelineParameterList":"List of Parameter names and values for SageMaker Model Building Pipeline execution."}},"AWS::Pipes::Pipe.PipeTargetSqsQueueParameters":{"attributes":{},"description":"The parameters for using a Amazon SQS stream as a target.","properties":{"MessageDeduplicationId":"This parameter applies only to FIFO (first-in-first-out) queues.\\n\\nThe token used for deduplication of sent messages.","MessageGroupId":"The FIFO message group ID to use as the target."}},"AWS::Pipes::Pipe.PipeTargetStateMachineParameters":{"attributes":{},"description":"The parameters for using a Step Functions state machine as a target.","properties":{"InvocationType":"Specify whether to invoke the Step Functions state machine synchronously or asynchronously.\\n\\n- `REQUEST_RESPONSE` (default) - Invoke synchronously. For more information, see [StartSyncExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartSyncExecution.html) in the *AWS Step Functions API Reference* .\\n\\n> `REQUEST_RESPONSE` is not supported for `STANDARD` state machine workflows.\\n- `FIRE_AND_FORGET` - Invoke asynchronously. For more information, see [StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html) in the *AWS Step Functions API Reference* .\\n\\nFor more information, see [Invocation types](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html#pipes-invocation) in the *Amazon EventBridge User Guide* ."}},"AWS::Pipes::Pipe.PlacementConstraint":{"attributes":{},"description":"An object representing a constraint on task placement. To learn more, see [Task Placement Constraints](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html) in the Amazon Elastic Container Service Developer Guide.","properties":{"Expression":"A cluster query language expression to apply to the constraint. You cannot specify an expression if the constraint type is `distinctInstance` . To learn more, see [Cluster Query Language](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html) in the Amazon Elastic Container Service Developer Guide.","Type":"The type of constraint. Use distinctInstance to ensure that each task in a particular group is running on a different container instance. Use memberOf to restrict the selection to a group of valid candidates."}},"AWS::Pipes::Pipe.PlacementStrategy":{"attributes":{},"description":"The task placement strategy for a task or service. To learn more, see [Task Placement Strategies](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-strategies.html) in the Amazon Elastic Container Service Service Developer Guide.","properties":{"Field":"The field to apply the placement strategy against. For the spread placement strategy, valid values are instanceId (or host, which has the same effect), or any platform or custom attribute that is applied to a container instance, such as attribute:ecs.availability-zone. For the binpack placement strategy, valid values are cpu and memory. For the random placement strategy, this field is not used.","Type":"The type of placement strategy. The random placement strategy randomly places tasks on available candidates. The spread placement strategy spreads placement across available candidates evenly based on the field parameter. The binpack strategy places tasks on available candidates that have the least available amount of the resource that is specified with the field parameter. For example, if you binpack on memory, a task is placed on the instance with the least amount of remaining memory (but still enough to run the task)."}},"AWS::Pipes::Pipe.SageMakerPipelineParameter":{"attributes":{},"description":"Name/Value pair of a parameter to start execution of a SageMaker Model Building Pipeline.","properties":{"Name":"Name of parameter to start execution of a SageMaker Model Building Pipeline.","Value":"Value of parameter to start execution of a SageMaker Model Building Pipeline."}},"AWS::Pipes::Pipe.SelfManagedKafkaAccessConfigurationCredentials":{"attributes":{},"description":"The AWS Secrets Manager secret that stores your stream credentials.","properties":{"BasicAuth":"The ARN of the Secrets Manager secret.","ClientCertificateTlsAuth":"The ARN of the Secrets Manager secret.","SaslScram256Auth":"The ARN of the Secrets Manager secret.","SaslScram512Auth":"The ARN of the Secrets Manager secret."}},"AWS::Pipes::Pipe.SelfManagedKafkaAccessConfigurationVpc":{"attributes":{},"description":"This structure specifies the VPC subnets and security groups for the stream, and whether a public IP address is to be used.","properties":{"SecurityGroup":"Specifies the security groups associated with the stream. These security groups must all be in the same VPC. You can specify as many as five security groups. If you do not specify a security group, the default security group for the VPC is used.","Subnets":"Specifies the subnets associated with the stream. These subnets must all be in the same VPC. You can specify as many as 16 subnets."}},"AWS::Proton::EnvironmentAccountConnection":{"attributes":{"Arn":"Returns the environment account connection ARN.","Id":"Returns the environment account connection ID.","Ref":"`Ref` returns the ARN of the environment account connection.","Status":"Returns the environment account connection status."},"description":"Detailed data of an AWS Proton environment account connection resource.","properties":{"CodebuildRoleArn":"The Amazon Resource Name (ARN) of an IAM service role in the environment account. AWS Proton uses this role to provision infrastructure resources using CodeBuild-based provisioning in the associated environment account.","ComponentRoleArn":"The Amazon Resource Name (ARN) of the IAM service role that AWS Proton uses when provisioning directly defined components in the associated environment account. It determines the scope of infrastructure that a component can provision in the account.\\n\\nThe environment account connection must have a `componentRoleArn` to allow directly defined components to be associated with any environments running in the account.\\n\\nFor more information about components, see [AWS Proton components](https://docs.aws.amazon.com/proton/latest/userguide/ag-components.html) in the *AWS Proton User Guide* .","EnvironmentAccountId":"The environment account that\'s connected to the environment account connection.","EnvironmentName":"The name of the environment that\'s associated with the environment account connection.","ManagementAccountId":"The ID of the management account that\'s connected to the environment account connection.","RoleArn":"The IAM service role that\'s associated with the environment account connection.","Tags":"An optional list of metadata items that you can associate with the AWS Proton environment account connection. A tag is a key-value pair.\\n\\nFor more information, see [AWS Proton resources and tagging](https://docs.aws.amazon.com/proton/latest/userguide/resources.html) in the *AWS Proton User Guide* ."}},"AWS::Proton::EnvironmentTemplate":{"attributes":{"Arn":"Returns the ARN of the environment template.","Ref":"`Ref` returns the ARN of the environment template."},"description":"Create an environment template for AWS Proton . For more information, see [Environment Templates](https://docs.aws.amazon.com/proton/latest/userguide/ag-templates.html) in the *AWS Proton User Guide* .\\n\\nYou can create an environment template in one of the two following ways:\\n\\n- Register and publish a *standard* environment template that instructs AWS Proton to deploy and manage environment infrastructure.\\n- Register and publish a *customer managed* environment template that connects AWS Proton to your existing provisioned infrastructure that you manage. AWS Proton *doesn\'t* manage your existing provisioned infrastructure. To create an environment template for customer provisioned and managed infrastructure, include the `provisioning` parameter and set the value to `CUSTOMER_MANAGED` . For more information, see [Register and publish an environment template](https://docs.aws.amazon.com/proton/latest/userguide/template-create.html) in the *AWS Proton User Guide* .","properties":{"Description":"A description of the environment template.","DisplayName":"The name of the environment template as displayed in the developer interface.","EncryptionKey":"The customer provided encryption key for the environment template.","Name":"The name of the environment template.","Provisioning":"When included, indicates that the environment template is for customer provisioned and managed infrastructure.","Tags":"An optional list of metadata items that you can associate with the AWS Proton environment template. A tag is a key-value pair.\\n\\nFor more information, see [AWS Proton resources and tagging](https://docs.aws.amazon.com/proton/latest/userguide/resources.html) in the *AWS Proton User Guide* ."}},"AWS::Proton::ServiceTemplate":{"attributes":{"Arn":"Returns the service template ARN.","Ref":"`Ref` returns the ARN of the service template."},"description":"Create a service template. The administrator creates a service template to define standardized infrastructure and an optional CI/CD service pipeline. Developers, in turn, select the service template from AWS Proton . If the selected service template includes a service pipeline definition, they provide a link to their source code repository. AWS Proton then deploys and manages the infrastructure defined by the selected service template. For more information, see [AWS Proton templates](https://docs.aws.amazon.com/proton/latest/userguide/ag-templates.html) in the *AWS Proton User Guide* .","properties":{"Description":"A description of the service template.","DisplayName":"The service template name as displayed in the developer interface.","EncryptionKey":"The customer provided service template encryption key that\'s used to encrypt data.","Name":"The name of the service template.","PipelineProvisioning":"If `pipelineProvisioning` is `true` , a service pipeline is included in the service template. Otherwise, a service pipeline *isn\'t* included in the service template.","Tags":"An object that includes the template bundle S3 bucket path and name for the new version of a service template."}},"AWS::QLDB::Ledger":{"attributes":{"Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\" myQLDBLedger \\" }`\\n\\nFor the resource with the logical ID `myQLDBLedger` , `Ref` returns the Amazon QLDB ledger name."},"description":"The `AWS::QLDB::Ledger` resource specifies a new Amazon Quantum Ledger Database (Amazon QLDB) ledger in your AWS account . Amazon QLDB is a fully managed ledger database that provides a transparent, immutable, and cryptographically verifiable transaction log owned by a central trusted authority. You can use QLDB to track all application data changes, and maintain a complete and verifiable history of changes over time.\\n\\nFor more information, see [CreateLedger](https://docs.aws.amazon.com/qldb/latest/developerguide/API_CreateLedger.html) in the *Amazon QLDB API Reference* .","properties":{"DeletionProtection":"Specifies whether the ledger is protected from being deleted by any user. If not defined during ledger creation, this feature is enabled ( `true` ) by default.\\n\\nIf deletion protection is enabled, you must first disable it before you can delete the ledger. You can disable it by calling the `UpdateLedger` operation to set this parameter to `false` .","KmsKey":"The key in AWS Key Management Service ( AWS KMS ) to use for encryption of data at rest in the ledger. For more information, see [Encryption at rest](https://docs.aws.amazon.com/qldb/latest/developerguide/encryption-at-rest.html) in the *Amazon QLDB Developer Guide* .\\n\\nUse one of the following options to specify this parameter:\\n\\n- `AWS_OWNED_KMS_KEY` : Use an AWS KMS key that is owned and managed by AWS on your behalf.\\n- *Undefined* : By default, use an AWS owned KMS key.\\n- *A valid symmetric customer managed KMS key* : Use the specified symmetric encryption KMS key in your account that you create, own, and manage.\\n\\nAmazon QLDB does not support asymmetric keys. For more information, see [Using symmetric and asymmetric keys](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html) in the *AWS Key Management Service Developer Guide* .\\n\\nTo specify a customer managed KMS key, you can use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with `\\"alias/\\"` . To specify a key in a different AWS account , you must use the key ARN or alias ARN.\\n\\nFor example:\\n\\n- Key ID: `1234abcd-12ab-34cd-56ef-1234567890ab`\\n- Key ARN: `arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab`\\n- Alias name: `alias/ExampleAlias`\\n- Alias ARN: `arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias`\\n\\nFor more information, see [Key identifiers (KeyId)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id) in the *AWS Key Management Service Developer Guide* .","Name":"The name of the ledger that you want to create. The name must be unique among all of the ledgers in your AWS account in the current Region.\\n\\nNaming constraints for ledger names are defined in [Quotas in Amazon QLDB](https://docs.aws.amazon.com/qldb/latest/developerguide/limits.html#limits.naming) in the *Amazon QLDB Developer Guide* .","PermissionsMode":"The permissions mode to assign to the ledger that you want to create. This parameter can have one of the following values:\\n\\n- `ALLOW_ALL` : A legacy permissions mode that enables access control with API-level granularity for ledgers.\\n\\nThis mode allows users who have the `SendCommand` API permission for this ledger to run all PartiQL commands (hence, `ALLOW_ALL` ) on any tables in the specified ledger. This mode disregards any table-level or command-level IAM permissions policies that you create for the ledger.\\n- `STANDARD` : ( *Recommended* ) A permissions mode that enables access control with finer granularity for ledgers, tables, and PartiQL commands.\\n\\nBy default, this mode denies all user requests to run any PartiQL commands on any tables in this ledger. To allow PartiQL commands to run, you must create IAM permissions policies for specific table resources and PartiQL actions, in addition to the `SendCommand` API permission for the ledger. For information, see [Getting started with the standard permissions mode](https://docs.aws.amazon.com/qldb/latest/developerguide/getting-started-standard-mode.html) in the *Amazon QLDB Developer Guide* .\\n\\n> We strongly recommend using the `STANDARD` permissions mode to maximize the security of your ledger data.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::QLDB::Stream":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the QLDB journal stream. For example: `arn:aws:qldb:us-east-1:123456789012:stream/exampleLedger/IiPT4brpZCqCq3f4MTHbYy` .","Id":"The unique ID that QLDB assigns to each QLDB journal stream. For example: `IiPT4brpZCqCq3f4MTHbYy` .","Ref":"`Ref` returns the resource ID or ARN. For example:\\n\\n`{ \\"Ref\\": \\" myQLDBStream \\" }`\\n\\nFor the resource with the logical ID `myQLDBStream` , `Ref` returns the ID or ARN of the Amazon QLDB journal stream."},"description":"The `AWS::QLDB::Stream` resource specifies a journal stream for a given Amazon Quantum Ledger Database (Amazon QLDB) ledger. The stream captures every document revision that is committed to the ledger\'s journal and delivers the data to a specified Amazon Kinesis Data Streams resource.\\n\\nFor more information, see [StreamJournalToKinesis](https://docs.aws.amazon.com/qldb/latest/developerguide/API_StreamJournalToKinesis.html) in the *Amazon QLDB API Reference* .","properties":{"ExclusiveEndTime":"The exclusive date and time that specifies when the stream ends. If you don\'t define this parameter, the stream runs indefinitely until you cancel it.\\n\\nThe `ExclusiveEndTime` must be in `ISO 8601` date and time format and in Universal Coordinated Time (UTC). For example: `2019-06-13T21:36:34Z` .","InclusiveStartTime":"The inclusive start date and time from which to start streaming journal data. This parameter must be in `ISO 8601` date and time format and in Universal Coordinated Time (UTC). For example: `2019-06-13T21:36:34Z` .\\n\\nThe `InclusiveStartTime` cannot be in the future and must be before `ExclusiveEndTime` .\\n\\nIf you provide an `InclusiveStartTime` that is before the ledger\'s `CreationDateTime` , QLDB effectively defaults it to the ledger\'s `CreationDateTime` .","KinesisConfiguration":"The configuration settings of the Kinesis Data Streams destination for your stream request.","LedgerName":"The name of the ledger.","RoleArn":"The Amazon Resource Name (ARN) of the IAM role that grants QLDB permissions for a journal stream to write data records to a Kinesis Data Streams resource.\\n\\nTo pass a role to QLDB when requesting a journal stream, you must have permissions to perform the `iam:PassRole` action on the IAM role resource. This is required for all journal stream requests.","StreamName":"The name that you want to assign to the QLDB journal stream. User-defined names can help identify and indicate the purpose of a stream.\\n\\nYour stream name must be unique among other *active* streams for a given ledger. Stream names have the same naming constraints as ledger names, as defined in [Quotas in Amazon QLDB](https://docs.aws.amazon.com/qldb/latest/developerguide/limits.html#limits.naming) in the *Amazon QLDB Developer Guide* .","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::QLDB::Stream.KinesisConfiguration":{"attributes":{},"description":"The configuration settings of the Amazon Kinesis Data Streams destination for an Amazon QLDB journal stream.","properties":{"AggregationEnabled":"Enables QLDB to publish multiple data records in a single Kinesis Data Streams record, increasing the number of records sent per API call.\\n\\nDefault: `True`\\n\\n> Record aggregation has important implications for processing records and requires de-aggregation in your stream consumer. To learn more, see [KPL Key Concepts](https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-concepts.html) and [Consumer De-aggregation](https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-consumer-deaggregation.html) in the *Amazon Kinesis Data Streams Developer Guide* .","StreamArn":"The Amazon Resource Name (ARN) of the Kinesis Data Streams resource."}},"AWS::QuickSight::Analysis":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the analysis.","CreatedTime":"The time that the analysis was created.","DataSetArns":"The ARNs of the datasets of the analysis.","Errors":"","LastUpdatedTime":"The time that the analysis was last updated."},"description":"Creates an analysis in Amazon QuickSight.","properties":{"AnalysisId":"The ID for the analysis that you\'re creating. This ID displays in the URL of the analysis.","AwsAccountId":"The ID of the AWS account where you are creating an analysis.","Definition":"","Name":"A descriptive name for the analysis that you\'re creating. This name displays for the analysis in the Amazon QuickSight console.","Parameters":"The parameter names and override values that you want to use. An analysis can have any parameter type, and some parameters might accept multiple values.","Permissions":"A structure that describes the principals and the resource-level permissions on an analysis. You can use the `Permissions` structure to grant permissions by providing a list of AWS Identity and Access Management (IAM) action information for each principal listed by Amazon Resource Name (ARN).\\n\\nTo specify no permissions, omit `Permissions` .","SourceEntity":"A source entity to use for the analysis that you\'re creating. This metadata structure contains details that describe a source template and one or more datasets.\\n\\nEither a `SourceEntity` or a `Definition` must be provided in order for the request to be valid.","Status":"Status associated with the analysis.","Tags":"Contains a map of the key-value pairs for the resource tag or tags assigned to the analysis.","ThemeArn":"The ARN for the theme to apply to the analysis that you\'re creating. To see the theme in the Amazon QuickSight console, make sure that you have access to it."}},"AWS::QuickSight::Analysis.AggregationFunction":{"attributes":{},"description":"An aggregation function aggregates values from a dimension or measure.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CategoricalAggregationFunction":"Aggregation for categorical values.\\n\\n- `COUNT` : Aggregate by the total number of values, including duplicates.\\n- `DISTINCT_COUNT` : Aggregate by the total number of distinct values.","DateAggregationFunction":"Aggregation for date values.\\n\\n- `COUNT` : Aggregate by the total number of values, including duplicates.\\n- `DISTINCT_COUNT` : Aggregate by the total number of distinct values.\\n- `MIN` : Select the smallest date value.\\n- `MAX` : Select the largest date value.","NumericalAggregationFunction":"Aggregation for numerical values."}},"AWS::QuickSight::Analysis.AggregationSortConfiguration":{"attributes":{},"description":"The configuration options to sort aggregated values.","properties":{"AggregationFunction":"The function that aggregates the values in `Column` .","Column":"The column that determines the sort order of aggregated values.","SortDirection":"The sort direction of values.\\n\\n- `ASC` : Sort in ascending order.\\n- `DESC` : Sort in descending order."}},"AWS::QuickSight::Analysis.AnalysisDefaults":{"attributes":{},"description":"The configuration for default analysis settings.","properties":{"DefaultNewSheetConfiguration":"The configuration for default new sheet settings."}},"AWS::QuickSight::Analysis.AnalysisDefinition":{"attributes":{},"description":"The definition of an analysis.","properties":{"AnalysisDefaults":"","CalculatedFields":"An array of calculated field definitions for the analysis.","ColumnConfigurations":"An array of analysis-level column configurations. Column configurations can be used to set default formatting for a column to be used throughout an analysis.","DataSetIdentifierDeclarations":"An array of dataset identifier declarations. This mapping allows the usage of dataset identifiers instead of dataset ARNs throughout analysis sub-structures.","FilterGroups":"Filter definitions for an analysis.\\n\\nFor more information, see [Filtering Data in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/adding-a-filter.html) in the *Amazon QuickSight User Guide* .","ParameterDeclarations":"An array of parameter declarations for an analysis.\\n\\nParameters are named variables that can transfer a value for use by an action or an object.\\n\\nFor more information, see [Parameters in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/parameters-in-quicksight.html) in the *Amazon QuickSight User Guide* .","Sheets":"An array of sheet definitions for an analysis. Each `SheetDefinition` provides detailed information about a sheet within this analysis."}},"AWS::QuickSight::Analysis.AnalysisError":{"attributes":{},"description":"Analysis error.","properties":{"Message":"The message associated with the analysis error.","Type":"The type of the analysis error.","ViolatedEntities":"Lists the violated entities that caused the analysis error"}},"AWS::QuickSight::Analysis.AnalysisSourceEntity":{"attributes":{},"description":"The source entity of an analysis.","properties":{"SourceTemplate":"The source template for the source entity of the analysis."}},"AWS::QuickSight::Analysis.AnalysisSourceTemplate":{"attributes":{},"description":"The source template of an analysis.","properties":{"Arn":"The Amazon Resource Name (ARN) of the source template of an analysis.","DataSetReferences":"The dataset references of the source template of an analysis."}},"AWS::QuickSight::Analysis.AnchorDateConfiguration":{"attributes":{},"description":"The date configuration of the filter.","properties":{"AnchorOption":"The options for the date configuration. Choose one of the options below:\\n\\n- `NOW`","ParameterName":"The name of the parameter that is used for the anchor date configuration."}},"AWS::QuickSight::Analysis.ArcAxisConfiguration":{"attributes":{},"description":"The arc axis configuration of a `GaugeChartVisual` .","properties":{"Range":"The arc axis range of a `GaugeChartVisual` .","ReserveRange":"The reserved range of the arc axis."}},"AWS::QuickSight::Analysis.ArcAxisDisplayRange":{"attributes":{},"description":"The arc axis range of a `GaugeChartVisual` .","properties":{"Max":"The maximum value of the arc axis range.","Min":"The minimum value of the arc axis range."}},"AWS::QuickSight::Analysis.ArcConfiguration":{"attributes":{},"description":"The arc configuration of a `GaugeChartVisual` .","properties":{"ArcAngle":"The option that determines the arc angle of a `GaugeChartVisual` .","ArcThickness":"The options that determine the arc thickness of a `GaugeChartVisual` ."}},"AWS::QuickSight::Analysis.ArcOptions":{"attributes":{},"description":"The options that determine the arc thickness of a `GaugeChartVisual` .","properties":{"ArcThickness":"The arc thickness of a `GaugeChartVisual` ."}},"AWS::QuickSight::Analysis.AxisDataOptions":{"attributes":{},"description":"The data options for an axis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateAxisOptions":"The options for an axis with a date field.","NumericAxisOptions":"The options for an axis with a numeric field."}},"AWS::QuickSight::Analysis.AxisDisplayMinMaxRange":{"attributes":{},"description":"The minimum and maximum setup for an axis display range.","properties":{"Maximum":"The maximum setup for an axis display range.","Minimum":"The minimum setup for an axis display range."}},"AWS::QuickSight::Analysis.AxisDisplayOptions":{"attributes":{},"description":"The display options for the axis label.","properties":{"AxisLineVisibility":"Determines whether or not the axis line is visible.","AxisOffset":"The offset value that determines the starting placement of the axis within a visual\'s bounds.","DataOptions":"The data options for an axis.","GridLineVisibility":"Determines whether or not the grid line is visible.","ScrollbarOptions":"The scroll bar options for an axis.","TickLabelOptions":"The tick label options of an axis."}},"AWS::QuickSight::Analysis.AxisDisplayRange":{"attributes":{},"description":"The range setup of a numeric axis display range.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DataDriven":"The data-driven setup of an axis display range.","MinMax":"The minimum and maximum setup of an axis display range."}},"AWS::QuickSight::Analysis.AxisLabelOptions":{"attributes":{},"description":"The label options for a chart axis. You must specify the field that the label is targeted to.","properties":{"ApplyTo":"The options that indicate which field the label belongs to.","CustomLabel":"The text for the axis label.","FontConfiguration":"The font configuration of the axis label."}},"AWS::QuickSight::Analysis.AxisLabelReferenceOptions":{"attributes":{},"description":"The reference that specifies where the axis label is applied to.","properties":{"Column":"The column that the axis label is targeted to.","FieldId":"The field that the axis label is targeted to."}},"AWS::QuickSight::Analysis.AxisLinearScale":{"attributes":{},"description":"The liner axis scale setup.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"StepCount":"The step count setup of a linear axis.","StepSize":"The step size setup of a linear axis."}},"AWS::QuickSight::Analysis.AxisLogarithmicScale":{"attributes":{},"description":"The logarithmic axis scale setup.","properties":{"Base":"The base setup of a logarithmic axis scale."}},"AWS::QuickSight::Analysis.AxisScale":{"attributes":{},"description":"The scale setup options for a numeric axis display.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Linear":"The linear axis scale setup.","Logarithmic":"The logarithmic axis scale setup."}},"AWS::QuickSight::Analysis.AxisTickLabelOptions":{"attributes":{},"description":"The tick label options of an axis.","properties":{"LabelOptions":"Determines whether or not the axis ticks are visible.","RotationAngle":"The rotation angle of the axis tick labels."}},"AWS::QuickSight::Analysis.BarChartAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a bar chart.","properties":{"Category":"The category (y-axis) field well of a bar chart.","Colors":"The color (group/color) field well of a bar chart.","SmallMultiples":"The small multiples field well of a bar chart.","Values":"The value field wells of a bar chart. Values are aggregated by category."}},"AWS::QuickSight::Analysis.BarChartConfiguration":{"attributes":{},"description":"The configuration of a `BarChartVisual` .","properties":{"BarsArrangement":"Determines the arrangement of the bars. The orientation and arrangement of bars determine the type of bar that is used in the visual.","CategoryAxis":"The label display options (grid line, range, scale, axis step) for bar chart category.","CategoryLabelOptions":"The label options (label text, label visibility and sort icon visibility) for a bar chart.","ColorLabelOptions":"The label options (label text, label visibility and sort icon visibility) for a color that is used in a bar chart.","ContributionAnalysisDefaults":"The contribution analysis (anomaly configuration) setup of the visual.","DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","Orientation":"The orientation of the bars in a bar chart visual. There are two valid values in this structure:\\n\\n- `HORIZONTAL` : Used for charts that have horizontal bars. Visuals that use this value are horizontal bar charts, horizontal stacked bar charts, and horizontal stacked 100% bar charts.\\n- `VERTICAL` : Used for charts that have vertical bars. Visuals that use this value are vertical bar charts, vertical stacked bar charts, and vertical stacked 100% bar charts.","ReferenceLines":"The reference line setup of the visual.","SmallMultiplesOptions":"The small multiples setup for the visual.","SortConfiguration":"The sort configuration of a `BarChartVisual` .","Tooltip":"The tooltip display setup of the visual.","ValueAxis":"The label display options (grid line, range, scale, axis step) for a bar chart value.","ValueLabelOptions":"The label options (label text, label visibility and sort icon visibility) for a bar chart value.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Analysis.BarChartFieldWells":{"attributes":{},"description":"The field wells of a `BarChartVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"BarChartAggregatedFieldWells":"The aggregated field wells of a bar chart."}},"AWS::QuickSight::Analysis.BarChartSortConfiguration":{"attributes":{},"description":"sort-configuration-description","properties":{"CategoryItemsLimit":"The limit on the number of categories displayed in a bar chart.","CategorySort":"The sort configuration of category fields.","ColorItemsLimit":"The limit on the number of values displayed in a bar chart.","ColorSort":"The sort configuration of color fields in a bar chart.","SmallMultiplesLimitConfiguration":"The limit on the number of small multiples panels that are displayed.","SmallMultiplesSort":"The sort configuration of the small multiples field."}},"AWS::QuickSight::Analysis.BarChartVisual":{"attributes":{},"description":"A bar chart.\\n\\nThe `BarChartVisual` structure describes a visual that is a member of the bar chart family. The following charts can be described using this structure:\\n\\n- Horizontal bar chart\\n- Vertical bar chart\\n- Horizontal stacked bar chart\\n- Vertical stacked bar chart\\n- Horizontal stacked 100% bar chart\\n- Vertical stacked 100% bar chart\\n\\nFor more information, see [Using bar charts](https://docs.aws.amazon.com/quicksight/latest/user/bar-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.BinCountOptions":{"attributes":{},"description":"The options that determine the bin count of a histogram.","properties":{"Value":"The options that determine the bin count value."}},"AWS::QuickSight::Analysis.BinWidthOptions":{"attributes":{},"description":"The options that determine the bin width of a histogram.","properties":{"BinCountLimit":"The options that determine the bin count limit.","Value":"The options that determine the bin width value."}},"AWS::QuickSight::Analysis.BodySectionConfiguration":{"attributes":{},"description":"The configuration of a body section.","properties":{"Content":"The configuration of content in a body section.","PageBreakConfiguration":"The configuration of a page break for a section.","SectionId":"The unique identifier of a body section.","Style":"The style options of a body section."}},"AWS::QuickSight::Analysis.BodySectionContent":{"attributes":{},"description":"The configuration of content in a body section.","properties":{"Layout":"The layout configuration of a body section."}},"AWS::QuickSight::Analysis.BoxPlotAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well for a box plot.","properties":{"GroupBy":"The group by field well of a box plot chart. Values are grouped based on group by fields.","Values":"The value field well of a box plot chart. Values are aggregated based on group by fields."}},"AWS::QuickSight::Analysis.BoxPlotChartConfiguration":{"attributes":{},"description":"The configuration of a `BoxPlotVisual` .","properties":{"BoxPlotOptions":"The box plot chart options for a box plot visual","CategoryAxis":"The label display options (grid line, range, scale, axis step) of a box plot category.","CategoryLabelOptions":"The label options (label text, label visibility and sort Icon visibility) of a box plot category.","FieldWells":"The field wells of the visual.","Legend":"","PrimaryYAxisDisplayOptions":"The label display options (grid line, range, scale, axis step) of a box plot category.","PrimaryYAxisLabelOptions":"The label options (label text, label visibility and sort icon visibility) of a box plot value.","ReferenceLines":"The reference line setup of the visual.","SortConfiguration":"The sort configuration of a `BoxPlotVisual` .","Tooltip":"The tooltip display setup of the visual.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Analysis.BoxPlotFieldWells":{"attributes":{},"description":"The field wells of a `BoxPlotVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"BoxPlotAggregatedFieldWells":"The aggregated field wells of a box plot."}},"AWS::QuickSight::Analysis.BoxPlotOptions":{"attributes":{},"description":"The options of a box plot visual.","properties":{"AllDataPointsVisibility":"Determines the visibility of all data points of the box plot.","OutlierVisibility":"Determines the visibility of the outlier in a box plot.","StyleOptions":"The style options of the box plot."}},"AWS::QuickSight::Analysis.BoxPlotSortConfiguration":{"attributes":{},"description":"The sort configuration of a `BoxPlotVisual` .","properties":{"CategorySort":"The sort configuration of a group by fields.","PaginationConfiguration":"The pagination configuration of a table visual or box plot."}},"AWS::QuickSight::Analysis.BoxPlotStyleOptions":{"attributes":{},"description":"The style options of the box plot.","properties":{"FillStyle":"The fill styles (solid, transparent) of the box plot."}},"AWS::QuickSight::Analysis.BoxPlotVisual":{"attributes":{},"description":"A box plot.\\n\\nFor more information, see [Using box plots](https://docs.aws.amazon.com/quicksight/latest/user/box-plots.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Analysis.CalculatedField":{"attributes":{},"description":"The calculated field of an analysis.","properties":{"DataSetIdentifier":"The data set that is used in this calculated field.","Expression":"The expression of the calculated field.","Name":"The name of the calculated field."}},"AWS::QuickSight::Analysis.CalculatedMeasureField":{"attributes":{},"description":"The table calculation measure field for pivot tables.","properties":{"Expression":"The expression in the table calculation.","FieldId":"The custom field ID."}},"AWS::QuickSight::Analysis.CascadingControlConfiguration":{"attributes":{},"description":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","properties":{"SourceControls":"A list of source controls that determine the values that are used in the current control."}},"AWS::QuickSight::Analysis.CascadingControlSource":{"attributes":{},"description":"The source controls that are used in a `CascadingControlConfiguration` .","properties":{"ColumnToMatch":"The column identifier that determines which column to look up for the source sheet control.","SourceSheetControlId":"The source sheet control ID of a `CascadingControlSource` ."}},"AWS::QuickSight::Analysis.CategoricalDimensionField":{"attributes":{},"description":"The dimension type field with categorical type columns..","properties":{"Column":"The column that is used in the `CategoricalDimensionField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field.","HierarchyId":"The custom hierarchy ID."}},"AWS::QuickSight::Analysis.CategoricalMeasureField":{"attributes":{},"description":"The measure type field with categorical type columns.","properties":{"AggregationFunction":"The aggregation function of the measure field.","Column":"The column that is used in the `CategoricalMeasureField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Analysis.CategoryDrillDownFilter":{"attributes":{},"description":"The numeric equality type drill down filter.","properties":{"CategoryValues":"A list of the string inputs that are the values of the category drill down filter.","Column":"The column that the filter is applied to."}},"AWS::QuickSight::Analysis.CategoryFilter":{"attributes":{},"description":"A `CategoryFilter` filters text values.\\n\\nFor more information, see [Adding text filters](https://docs.aws.amazon.com/quicksight/latest/user/add-a-text-filter-data-prep.html) in the *Amazon QuickSight User Guide* .","properties":{"Column":"The column that the filter is applied to.","Configuration":"The configuration for a `CategoryFilter` .","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template."}},"AWS::QuickSight::Analysis.CategoryFilterConfiguration":{"attributes":{},"description":"The configuration for a `CategoryFilter` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CustomFilterConfiguration":"A custom filter that filters based on a single value. This filter can be partially matched.","CustomFilterListConfiguration":"A list of custom filter values. In the Amazon QuickSight console, this filter type is called a custom filter list.","FilterListConfiguration":"A list of filter configurations. In the Amazon QuickSight console, this filter type is called a filter list."}},"AWS::QuickSight::Analysis.ChartAxisLabelOptions":{"attributes":{},"description":"The label options for an axis on a chart.","properties":{"AxisLabelOptions":"The label options for a chart axis.","SortIconVisibility":"The visibility configuration of the sort icon on a chart\'s axis label.","Visibility":"The visibility of an axis label on a chart. Choose one of the following options:\\n\\n- `VISIBLE` : Shows the axis.\\n- `HIDDEN` : Hides the axis."}},"AWS::QuickSight::Analysis.ClusterMarker":{"attributes":{},"description":"The cluster marker that is a part of the cluster marker configuration.","properties":{"SimpleClusterMarker":"The simple cluster marker of the cluster marker."}},"AWS::QuickSight::Analysis.ClusterMarkerConfiguration":{"attributes":{},"description":"The cluster marker configuration of the geospatial map selected point style.","properties":{"ClusterMarker":"The cluster marker that is a part of the cluster marker configuration."}},"AWS::QuickSight::Analysis.ColorScale":{"attributes":{},"description":"Determines the color scale that is applied to the visual.","properties":{"ColorFillType":"Determines the color fill type.","Colors":"Determines the list of colors that are applied to the visual.","NullValueColor":"Determines the color that is applied to null values."}},"AWS::QuickSight::Analysis.ColumnConfiguration":{"attributes":{},"description":"The general configuration of a column.","properties":{"Column":"The column.","FormatConfiguration":"The format configuration of a column.","Role":"The role of the column."}},"AWS::QuickSight::Analysis.ColumnHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of the fields for a visual element.","properties":{"DateTimeHierarchy":"The option that determines the hierarchy of any `DateTime` fields.","ExplicitHierarchy":"The option that determines the hierarchy of the fields that are built within a visual\'s field wells. These fields can\'t be duplicated to other visuals.","PredefinedHierarchy":"The option that determines the hierarchy of the fields that are defined during data preparation. These fields are available to use in any analysis that uses the data source."}},"AWS::QuickSight::Analysis.ColumnIdentifier":{"attributes":{},"description":"A column of a data set.","properties":{"ColumnName":"The name of the column.","DataSetIdentifier":"The data set that the column belongs to."}},"AWS::QuickSight::Analysis.ColumnSort":{"attributes":{},"description":"The sort configuration for a column that is not used in a field well.","properties":{"AggregationFunction":"The aggregation function that is defined in the column sort.","Direction":"The sort direction.","SortBy":""}},"AWS::QuickSight::Analysis.ColumnTooltipItem":{"attributes":{},"description":"The tooltip item for the columns that are not part of a field well.","properties":{"Aggregation":"The aggregation function of the column tooltip item.","Column":"The target column of the tooltip item.","Label":"The label of the tooltip item.","Visibility":"The visibility of the tooltip item."}},"AWS::QuickSight::Analysis.ComboChartAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a combo chart.","properties":{"BarValues":"The aggregated `BarValues` field well of a combo chart.","Category":"The aggregated category field wells of a combo chart.","Colors":"The aggregated colors field well of a combo chart.","LineValues":"The aggregated `LineValues` field well of a combo chart."}},"AWS::QuickSight::Analysis.ComboChartConfiguration":{"attributes":{},"description":"The configuration of a `ComboChartVisual` .","properties":{"BarDataLabels":"The options that determine if visual data labels are displayed.\\n\\nThe data label options for a bar in a combo chart.","BarsArrangement":"Determines the bar arrangement in a combo chart. The following are valid values in this structure:\\n\\n- `CLUSTERED` : For clustered bar combo charts.\\n- `STACKED` : For stacked bar combo charts.\\n- `STACKED_PERCENT` : Do not use. If you use this value, the operation returns a validation error.","CategoryAxis":"The category axis of a combo chart.","CategoryLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart category (group/color) field well.","ColorLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart\'s color field well.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","LineDataLabels":"The options that determine if visual data labels are displayed.\\n\\nThe data label options for a line in a combo chart.","PrimaryYAxisDisplayOptions":"The label display options (grid line, range, scale, and axis step) of a combo chart\'s primary y-axis (bar) field well.","PrimaryYAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart\'s primary y-axis (bar) field well.","ReferenceLines":"The reference line setup of the visual.","SecondaryYAxisDisplayOptions":"The label display options (grid line, range, scale, axis step) of a combo chart\'s secondary y-axis (line) field well.","SecondaryYAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart\'s secondary y-axis(line) field well.","SortConfiguration":"The sort configuration of a `ComboChartVisual` .","Tooltip":"The legend display setup of the visual.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Analysis.ComboChartFieldWells":{"attributes":{},"description":"The field wells of the visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"ComboChartAggregatedFieldWells":"The aggregated field wells of a combo chart. Combo charts only have aggregated field wells. Columns in a combo chart are aggregated by category."}},"AWS::QuickSight::Analysis.ComboChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a `ComboChartVisual` .","properties":{"CategoryItemsLimit":"The item limit configuration for the category field well of a combo chart.","CategorySort":"The sort configuration of the category field well in a combo chart.","ColorItemsLimit":"The item limit configuration of the color field well in a combo chart.","ColorSort":"The sort configuration of the color field well in a combo chart."}},"AWS::QuickSight::Analysis.ComboChartVisual":{"attributes":{},"description":"A combo chart.\\n\\nThe `ComboChartVisual` includes stacked bar combo charts and clustered bar combo charts\\n\\nFor more information, see [Using combo charts](https://docs.aws.amazon.com/quicksight/latest/user/combo-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.ComparisonConfiguration":{"attributes":{},"description":"The comparison display configuration of a KPI or gauge chart.","properties":{"ComparisonFormat":"The format of the comparison.","ComparisonMethod":"The method of the comparison. Choose from the following options:\\n\\n- `DIFFERENCE`\\n- `PERCENT_DIFFERENCE`\\n- `PERCENT`"}},"AWS::QuickSight::Analysis.ComparisonFormatConfiguration":{"attributes":{},"description":"The format of the comparison.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"NumberDisplayFormatConfiguration":"The number display format.","PercentageDisplayFormatConfiguration":"The percentage display format."}},"AWS::QuickSight::Analysis.Computation":{"attributes":{},"description":"The computation union that is used in an insight visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Forecast":"The forecast computation configuration.","GrowthRate":"The growth rate computation configuration.","MaximumMinimum":"The maximum and minimum computation configuration.","MetricComparison":"The metric comparison computation configuration.","PeriodOverPeriod":"The period over period computation configuration.","PeriodToDate":"The period to `DataSetIdentifier` computation configuration.","TopBottomMovers":"The top movers and bottom movers computation configuration.","TopBottomRanked":"The top ranked and bottom ranked computation configuration.","TotalAggregation":"The total aggregation computation configuration.","UniqueValues":"The unique values computation configuration."}},"AWS::QuickSight::Analysis.ConditionalFormattingColor":{"attributes":{},"description":"The formatting configuration for the color.","properties":{"Gradient":"Formatting configuration for gradient color.","Solid":"Formatting configuration for solid color."}},"AWS::QuickSight::Analysis.ConditionalFormattingCustomIconCondition":{"attributes":{},"description":"Determines the custom condition for an icon set.","properties":{"Color":"Determines the color of the icon.","DisplayConfiguration":"Determines the icon display configuration.","Expression":"The expression that determines the condition of the icon set.","IconOptions":"Custom icon options for an icon set."}},"AWS::QuickSight::Analysis.ConditionalFormattingCustomIconOptions":{"attributes":{},"description":"Custom icon options for an icon set.","properties":{"Icon":"Determines the type of icon.","UnicodeIcon":"Determines the Unicode icon type."}},"AWS::QuickSight::Analysis.ConditionalFormattingGradientColor":{"attributes":{},"description":"Formatting configuration for gradient color.","properties":{"Color":"Determines the color.","Expression":"The expression that determines the formatting configuration for gradient color."}},"AWS::QuickSight::Analysis.ConditionalFormattingIcon":{"attributes":{},"description":"The formatting configuration for the icon.","properties":{"CustomCondition":"Determines the custom condition for an icon set.","IconSet":"Formatting configuration for icon set."}},"AWS::QuickSight::Analysis.ConditionalFormattingIconDisplayConfiguration":{"attributes":{},"description":"Determines the icon display configuration.","properties":{"IconDisplayOption":"Determines the icon display configuration."}},"AWS::QuickSight::Analysis.ConditionalFormattingIconSet":{"attributes":{},"description":"Formatting configuration for icon set.","properties":{"Expression":"The expression that determines the formatting configuration for the icon set.","IconSetType":"Determines the icon set type."}},"AWS::QuickSight::Analysis.ConditionalFormattingSolidColor":{"attributes":{},"description":"Formatting configuration for solid color.","properties":{"Color":"Determines the color.","Expression":"The expression that determines the formatting configuration for solid color."}},"AWS::QuickSight::Analysis.ContributionAnalysisDefault":{"attributes":{},"description":"The contribution analysis visual display for a line, pie, or bar chart.","properties":{"ContributorDimensions":"The dimensions columns that are used in the contribution analysis, usually a list of `ColumnIdentifiers` .","MeasureFieldId":"The measure field that is used in the contribution analysis."}},"AWS::QuickSight::Analysis.CurrencyDisplayFormatConfiguration":{"attributes":{},"description":"The options that determine the currency display format configuration.","properties":{"DecimalPlacesConfiguration":"The option that determines the decimal places configuration.","NegativeValueConfiguration":"The options that determine the negative value configuration.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumberScale":"Determines the number scale value for the currency format.","Prefix":"Determines the prefix value of the currency format.","SeparatorConfiguration":"The options that determine the numeric separator configuration.","Suffix":"Determines the suffix value of the currency format.","Symbol":"Determines the symbol for the currency format."}},"AWS::QuickSight::Analysis.CustomActionFilterOperation":{"attributes":{},"description":"The filter operation that filters data included in a visual or in an entire sheet.","properties":{"SelectedFieldsConfiguration":"The configuration that chooses the fields to be filtered.","TargetVisualsConfiguration":"The configuration that chooses the target visuals to be filtered."}},"AWS::QuickSight::Analysis.CustomActionNavigationOperation":{"attributes":{},"description":"The navigation operation that navigates between different sheets in the same analysis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"LocalNavigationConfiguration":"The configuration that chooses the navigation target."}},"AWS::QuickSight::Analysis.CustomActionSetParametersOperation":{"attributes":{},"description":"The set parameter operation that sets parameters in custom action.","properties":{"ParameterValueConfigurations":"The parameter that determines the value configuration."}},"AWS::QuickSight::Analysis.CustomActionURLOperation":{"attributes":{},"description":"The URL operation that opens a link to another webpage.","properties":{"URLTarget":"The target of the `CustomActionURLOperation` .\\n\\nValid values are defined as follows:\\n\\n- `NEW_TAB` : Opens the target URL in a new browser tab.\\n- `NEW_WINDOW` : Opens the target URL in a new browser window.\\n- `SAME_TAB` : Opens the target URL in the same browser tab.","URLTemplate":"THe URL link of the `CustomActionURLOperation` ."}},"AWS::QuickSight::Analysis.CustomContentConfiguration":{"attributes":{},"description":"The configuration of a `CustomContentVisual` .","properties":{"ContentType":"The content type of the custom content visual. You can use this to have the visual render as an image.","ContentUrl":"The input URL that links to the custom content that you want in the custom visual.","ImageScaling":"The sizing options for the size of the custom content visual. This structure is required when the `ContentType` of the visual is `\'IMAGE\'` ."}},"AWS::QuickSight::Analysis.CustomContentVisual":{"attributes":{},"description":"A visual that contains custom content.\\n\\nFor more information, see [Using custom visual content](https://docs.aws.amazon.com/quicksight/latest/user/custom-visual-content.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a `CustomContentVisual` .","DataSetIdentifier":"The dataset that is used to create the custom content visual. You can\'t create a visual without a dataset.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.CustomFilterConfiguration":{"attributes":{},"description":"A custom filter that filters based on a single value. This filter can be partially matched.","properties":{"CategoryValue":"The category value for the filter.\\n\\nThis field is mutually exclusive to `ParameterName` .","MatchOperator":"The match operator that is used to determine if a filter should be applied.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","ParameterName":"The parameter whose value should be used for the filter value.\\n\\nThis field is mutually exclusive to `CategoryValue` .","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Analysis.CustomFilterListConfiguration":{"attributes":{},"description":"A list of custom filter values.","properties":{"CategoryValues":"The list of category values for the filter.","MatchOperator":"The match operator that is used to determine if a filter should be applied.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Analysis.CustomNarrativeOptions":{"attributes":{},"description":"The custom narrative options.","properties":{"Narrative":"The string input of custom narrative."}},"AWS::QuickSight::Analysis.CustomParameterValues":{"attributes":{},"description":"The customized parameter values.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimeValues":"A list of datetime-type parameter values.","DecimalValues":"A list of decimal-type parameter values.","IntegerValues":"A list of integer-type parameter values.","StringValues":"A list of string-type parameter values."}},"AWS::QuickSight::Analysis.CustomValuesConfiguration":{"attributes":{},"description":"The configuration of custom values for the destination parameter in `DestinationParameterValueConfiguration` .","properties":{"CustomValues":"","IncludeNullValue":"Includes the null value in custom action parameter values."}},"AWS::QuickSight::Analysis.DataBarsOptions":{"attributes":{},"description":"The options for data bars.","properties":{"FieldId":"The field ID for the data bars options.","NegativeColor":"The color of the negative data bar.","PositiveColor":"The color of the positive data bar."}},"AWS::QuickSight::Analysis.DataColor":{"attributes":{},"description":"Determines the color that is applied to a particular data value.","properties":{"Color":"The color that is applied to the data value.","DataValue":"The data value that the color is applied to."}},"AWS::QuickSight::Analysis.DataFieldSeriesItem":{"attributes":{},"description":"The data field series item configuration of a line chart.","properties":{"AxisBinding":"The axis that you are binding the field to.","FieldId":"The field ID of the field that you are setting the axis binding to.","FieldValue":"The field value of the field that you are setting the axis binding to.","Settings":"The options that determine the presentation of line series associated to the field."}},"AWS::QuickSight::Analysis.DataLabelOptions":{"attributes":{},"description":"The options that determine the presentation of the data labels.","properties":{"CategoryLabelVisibility":"Determines the visibility of the category field labels.","DataLabelTypes":"The option that determines the data label type.","LabelColor":"Determines the color of the data labels.","LabelContent":"Determines the content of the data labels.","LabelFontConfiguration":"Determines the font configuration of the data labels.","MeasureLabelVisibility":"Determines the visibility of the measure field labels.","Overlap":"Determines whether overlap is enabled or disabled for the data labels.","Position":"Determines the position of the data labels.","TotalsVisibility":"Determines the visibility of the total.","Visibility":"Determines the visibility of the data labels."}},"AWS::QuickSight::Analysis.DataLabelType":{"attributes":{},"description":"The option that determines the data label type.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DataPathLabelType":"The option that specifies individual data values for labels.","FieldLabelType":"Determines the label configuration for the entire field.","MaximumLabelType":"Determines the label configuration for the maximum value in a visual.","MinimumLabelType":"Determines the label configuration for the minimum value in a visual.","RangeEndsLabelType":"Determines the label configuration for range end value in a visual."}},"AWS::QuickSight::Analysis.DataPathColor":{"attributes":{},"description":"The color map that determines the color options for a particular element.","properties":{"Color":"The color that needs to be applied to the element.","Element":"The element that the color needs to be applied to.","TimeGranularity":"The time granularity of the field that the color needs to be applied to."}},"AWS::QuickSight::Analysis.DataPathLabelType":{"attributes":{},"description":"The option that specifies individual data values for labels.","properties":{"FieldId":"The field ID of the field that the data label needs to be applied to.","FieldValue":"The actual value of the field that is labeled.","Visibility":"The visibility of the data label."}},"AWS::QuickSight::Analysis.DataPathSort":{"attributes":{},"description":"Allows data paths to be sorted by a specific data value.","properties":{"Direction":"Determines the sort direction.","SortPaths":"The list of data paths that need to be sorted."}},"AWS::QuickSight::Analysis.DataPathValue":{"attributes":{},"description":"The data path that needs to be sorted.","properties":{"FieldId":"The field ID of the field that needs to be sorted.","FieldValue":"The actual value of the field that needs to be sorted."}},"AWS::QuickSight::Analysis.DataSetIdentifierDeclaration":{"attributes":{},"description":"A data set.","properties":{"DataSetArn":"The Amazon Resource Name (ARN) of the data set.","Identifier":"The identifier of the data set, typically the data set\'s name."}},"AWS::QuickSight::Analysis.DataSetReference":{"attributes":{},"description":"Dataset reference.","properties":{"DataSetArn":"Dataset Amazon Resource Name (ARN).","DataSetPlaceholder":"Dataset placeholder."}},"AWS::QuickSight::Analysis.DateAxisOptions":{"attributes":{},"description":"The options that determine how a date axis is displayed.","properties":{"MissingDateVisibility":"Determines whether or not missing dates are displayed."}},"AWS::QuickSight::Analysis.DateDimensionField":{"attributes":{},"description":"The dimension type field with date type columns.","properties":{"Column":"The column that is used in the `DateDimensionField` .","DateGranularity":"The date granularity of the `DateDimensionField` . Choose one of the following options:\\n\\n- `YEAR`\\n- `QUARTER`\\n- `MONTH`\\n- `WEEK`\\n- `DAY`\\n- `HOUR`\\n- `MINUTE`\\n- `SECOND`\\n- `MILLISECOND`","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field.","HierarchyId":"The custom hierarchy ID."}},"AWS::QuickSight::Analysis.DateMeasureField":{"attributes":{},"description":"The measure type field with date type columns.","properties":{"AggregationFunction":"The aggregation function of the measure field.","Column":"The column that is used in the `DateMeasureField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Analysis.DateTimeDefaultValues":{"attributes":{},"description":"The default values of the `DateTimeParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `DataTimeDefaultValues` . Different defaults are displayed according to users, groups, and values mapping.","RollingDate":"The rolling date of the `DataTimeDefaultValues` . The date is determined from the dataset based on input expression.","StaticValues":"The static values of the `DataTimeDefaultValues` ."}},"AWS::QuickSight::Analysis.DateTimeFormatConfiguration":{"attributes":{},"description":"Formatting configuration for `DateTime` fields.","properties":{"DateTimeFormat":"Determines the `DateTime` format.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumericFormatConfiguration":"The formatting configuration for numeric `DateTime` fields."}},"AWS::QuickSight::Analysis.DateTimeHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of any `DateTime` fields.","properties":{"DrillDownFilters":"The option that determines the drill down filters for the `DateTime` hierarchy.","HierarchyId":"The hierarchy ID of the `DateTime` hierarchy."}},"AWS::QuickSight::Analysis.DateTimeParameter":{"attributes":{},"description":"A date-time parameter.","properties":{"Name":"A display name for the date-time parameter.","Values":"The values for the date-time parameter."}},"AWS::QuickSight::Analysis.DateTimeParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `DateTime` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values.","ValueWhenUnset":"The configuration that defines the default value of a `DateTime` parameter when a value has not been set."}},"AWS::QuickSight::Analysis.DateTimePickerControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"DateTimeFormat":"Customize how dates are formatted in controls.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Analysis.DateTimeValueWhenUnsetConfiguration":{"attributes":{},"description":"The configuration that defines the default value of a `DateTime` parameter when a value has not been set.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Analysis.DecimalDefaultValues":{"attributes":{},"description":"The default values of the `DecimalParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `DecimalDefaultValues` . Different defaults are displayed according to users, groups, and values mapping.","StaticValues":"The static values of the `DecimalDefaultValues` ."}},"AWS::QuickSight::Analysis.DecimalParameter":{"attributes":{},"description":"A decimal parameter.","properties":{"Name":"A display name for the decimal parameter.","Values":"The values for the decimal parameter."}},"AWS::QuickSight::Analysis.DecimalParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `Decimal` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","ParameterValueType":"The value type determines whether the parameter is a single-value or multi-value parameter.","ValueWhenUnset":"The configuration that defines the default value of a `Decimal` parameter when a value has not been set."}},"AWS::QuickSight::Analysis.DecimalPlacesConfiguration":{"attributes":{},"description":"The option that determines the decimal places configuration.","properties":{"DecimalPlaces":"The values of the decimal places."}},"AWS::QuickSight::Analysis.DecimalValueWhenUnsetConfiguration":{"attributes":{},"description":"The configuration that defines the default value of a `Decimal` parameter when a value has not been set.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Analysis.DefaultFreeFormLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings of a free-form layout configuration.","properties":{"CanvasSizeOptions":"Determines the screen canvas size options for a free-form layout."}},"AWS::QuickSight::Analysis.DefaultGridLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for a grid layout configuration.","properties":{"CanvasSizeOptions":"Determines the screen canvas size options for a grid layout."}},"AWS::QuickSight::Analysis.DefaultInteractiveLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for interactive layout configuration.","properties":{"FreeForm":"The options that determine the default settings of a free-form layout configuration.","Grid":"The options that determine the default settings for a grid layout configuration."}},"AWS::QuickSight::Analysis.DefaultNewSheetConfiguration":{"attributes":{},"description":"The configuration for default new sheet settings.","properties":{"InteractiveLayoutConfiguration":"The options that determine the default settings for interactive layout configuration.","PaginatedLayoutConfiguration":"The options that determine the default settings for a paginated layout configuration.","SheetContentType":"The option that determines the sheet content type."}},"AWS::QuickSight::Analysis.DefaultPaginatedLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for a paginated layout configuration.","properties":{"SectionBased":"The options that determine the default settings for a section-based layout configuration."}},"AWS::QuickSight::Analysis.DefaultSectionBasedLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for a section-based layout configuration.","properties":{"CanvasSizeOptions":"Determines the screen canvas size options for a section-based layout."}},"AWS::QuickSight::Analysis.DestinationParameterValueConfiguration":{"attributes":{},"description":"The configuration of destination parameter values.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CustomValuesConfiguration":"The configuration of custom values for destination parameter in `DestinationParameterValueConfiguration` .","SelectAllValueOptions":"The configuration that selects all options.","SourceColumn":"","SourceField":"The source field ID of the destination parameter.","SourceParameterName":"The source parameter name of the destination parameter."}},"AWS::QuickSight::Analysis.DimensionField":{"attributes":{},"description":"The dimension type field.","properties":{"CategoricalDimensionField":"The dimension type field with categorical type columns.","DateDimensionField":"The dimension type field with date type columns.","NumericalDimensionField":"The dimension type field with numerical type columns."}},"AWS::QuickSight::Analysis.DonutCenterOptions":{"attributes":{},"description":"The label options of the label that is displayed in the center of a donut chart. This option isn\'t available for pie charts.","properties":{"LabelVisibility":"Determines the visibility of the label in a donut chart. In the Amazon QuickSight console, this option is called `\'Show total\'` ."}},"AWS::QuickSight::Analysis.DonutOptions":{"attributes":{},"description":"The options for configuring a donut chart or pie chart.","properties":{"ArcOptions":"The option for define the arc of the chart shape. Valid values are as follows:\\n\\n- `WHOLE` - A pie chart\\n- `SMALL` - A small-sized donut chart\\n- `MEDIUM` - A medium-sized donut chart\\n- `LARGE` - A large-sized donut chart","DonutCenterOptions":"The label options of the label that is displayed in the center of a donut chart. This option isn\'t available for pie charts."}},"AWS::QuickSight::Analysis.DrillDownFilter":{"attributes":{},"description":"The drill down filter for the column hierarchies.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CategoryFilter":"The category type drill down filter. This filter is used for string type columns.","NumericEqualityFilter":"The numeric equality type drill down filter. This filter is used for number type columns.","TimeRangeFilter":"The time range drill down filter. This filter is used for date time columns."}},"AWS::QuickSight::Analysis.DropDownControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"SelectAllOptions":"The configuration of the `Select all` options in a dropdown control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Analysis.DynamicDefaultValue":{"attributes":{},"description":"Defines different defaults to the users or groups based on mapping.","properties":{"DefaultValueColumn":"The column that contains the default value of each user or group.","GroupNameColumn":"The column that contains the group name.","UserNameColumn":"The column that contains the username."}},"AWS::QuickSight::Analysis.EmptyVisual":{"attributes":{},"description":"An empty visual.\\n\\nEmpty visuals are used in layouts but have not been configured to show any data. A new visual created in the Amazon QuickSight console is considered an `EmptyVisual` until a visual type is selected.","properties":{"Actions":"The list of custom actions that are configured for a visual.","DataSetIdentifier":"The data set that is used in the empty visual. Every visual requires a dataset to render.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.Entity":{"attributes":{},"description":"An object, structure, or sub-structure of an analysis, template, or dashboard.","properties":{"Path":"The hierarchical path of the entity within the analysis, template, or dashboard definition tree."}},"AWS::QuickSight::Analysis.ExcludePeriodConfiguration":{"attributes":{},"description":"The exclude period of `TimeRangeFilter` or `RelativeDatesFilter` .","properties":{"Amount":"The amount or number of the exclude period.","Granularity":"The granularity or unit (day, month, year) of the exclude period.","Status":"The status of the exclude period. Choose from the following options:\\n\\n- `ENABLED`\\n- `DISABLED`"}},"AWS::QuickSight::Analysis.ExplicitHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of the fields that are built within a visual\'s field wells. These fields can\'t be duplicated to other visuals.","properties":{"Columns":"The list of columns that define the explicit hierarchy.","DrillDownFilters":"The option that determines the drill down filters for the explicit hierarchy.","HierarchyId":"The hierarchy ID of the explicit hierarchy."}},"AWS::QuickSight::Analysis.FieldBasedTooltip":{"attributes":{},"description":"The setup for the detailed tooltip.","properties":{"AggregationVisibility":"The visibility of `Show aggregations` .","TooltipFields":"The fields configuration in the tooltip.","TooltipTitleType":"The type for the >tooltip title. Choose one of the following options:\\n\\n- `NONE` : Doesn\'t use the primary value as the title.\\n- `PRIMARY_VALUE` : Uses primary value as the title."}},"AWS::QuickSight::Analysis.FieldLabelType":{"attributes":{},"description":"The field label type.","properties":{"FieldId":"Indicates the field that is targeted by the field label.","Visibility":"The visibility of the field label."}},"AWS::QuickSight::Analysis.FieldSeriesItem":{"attributes":{},"description":"The field series item configuration of a line chart.","properties":{"AxisBinding":"The axis that you are binding the field to.","FieldId":"The field ID of the field for which you are setting the axis binding.","Settings":"The options that determine the presentation of line series associated to the field."}},"AWS::QuickSight::Analysis.FieldSort":{"attributes":{},"description":"The sort configuration for a field in a field well.","properties":{"Direction":"The sort direction. Choose one of the following options:\\n\\n- `ASC` : Ascending\\n- `DESC` : Descending","FieldId":"The sort configuration target field."}},"AWS::QuickSight::Analysis.FieldSortOptions":{"attributes":{},"description":"The field sort options in a chart configuration.","properties":{"ColumnSort":"The sort configuration for a column that is not used in a field well.","FieldSort":"The sort configuration for a field in a field well."}},"AWS::QuickSight::Analysis.FieldTooltipItem":{"attributes":{},"description":"The tooltip item for the fields.","properties":{"FieldId":"The unique ID of the field that is targeted by the tooltip.","Label":"The label of the tooltip item.","Visibility":"The visibility of the tooltip item."}},"AWS::QuickSight::Analysis.FilledMapAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well of the filled map.","properties":{"Geospatial":"The aggregated location field well of the filled map. Values are grouped by location fields.","Values":"The aggregated color field well of a filled map. Values are aggregated based on location fields."}},"AWS::QuickSight::Analysis.FilledMapConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a `FilledMapVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options of a `FilledMapVisual` ."}},"AWS::QuickSight::Analysis.FilledMapConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options of a `FilledMapVisual` .","properties":{"Shape":"The conditional formatting that determines the shape of the filled map."}},"AWS::QuickSight::Analysis.FilledMapConfiguration":{"attributes":{},"description":"The configuration for a `FilledMapVisual` .","properties":{"FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","MapStyleOptions":"The map style options of the filled map visual.","SortConfiguration":"The sort configuration of a `FilledMapVisual` .","Tooltip":"The tooltip display setup of the visual.","WindowOptions":"The window options of the filled map visual."}},"AWS::QuickSight::Analysis.FilledMapFieldWells":{"attributes":{},"description":"The field wells of a `FilledMapVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FilledMapAggregatedFieldWells":"The aggregated field well of the filled map."}},"AWS::QuickSight::Analysis.FilledMapShapeConditionalFormatting":{"attributes":{},"description":"The conditional formatting that determines the shape of the filled map.","properties":{"FieldId":"The field ID of the filled map shape.","Format":"The conditional formatting that determines the background color of a filled map\'s shape."}},"AWS::QuickSight::Analysis.FilledMapSortConfiguration":{"attributes":{},"description":"The sort configuration of a `FilledMapVisual` .","properties":{"CategorySort":"The sort configuration of the location fields."}},"AWS::QuickSight::Analysis.FilledMapVisual":{"attributes":{},"description":"A filled map.\\n\\nFor more information, see [Creating filled maps](https://docs.aws.amazon.com/quicksight/latest/user/filled-maps.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","ConditionalFormatting":"The conditional formatting of a `FilledMapVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Analysis.Filter":{"attributes":{},"description":"With a `Filter` , you can remove portions of data from a particular visual or view.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CategoryFilter":"A `CategoryFilter` filters text values.\\n\\nFor more information, see [Adding text filters](https://docs.aws.amazon.com/quicksight/latest/user/add-a-text-filter-data-prep.html) in the *Amazon QuickSight User Guide* .","NumericEqualityFilter":"A `NumericEqualityFilter` filters numeric values that equal or do not equal a given numeric value.","NumericRangeFilter":"A `NumericRangeFilter` filters numeric values that are either inside or outside a given numeric range.","RelativeDatesFilter":"A `RelativeDatesFilter` filters date values that are relative to a given date.","TimeEqualityFilter":"A `TimeEqualityFilter` filters date-time values that equal or do not equal a given date/time value.","TimeRangeFilter":"A `TimeRangeFilter` filters date-time values that are either inside or outside a given date/time range.","TopBottomFilter":"A `TopBottomFilter` filters data to the top or bottom values for a given column."}},"AWS::QuickSight::Analysis.FilterControl":{"attributes":{},"description":"The control of a filter that is used to interact with a dashboard or an analysis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimePicker":"A control from a date filter that is used to specify date and time.","Dropdown":"A control to display a dropdown list with buttons that are used to select a single value.","List":"A control to display a list of buttons or boxes. This is used to select either a single value or multiple values.","RelativeDateTime":"A control from a date filter that is used to specify the relative date.","Slider":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","TextArea":"A control to display a text box that is used to enter multiple entries.","TextField":"A control to display a text box that is used to enter a single entry."}},"AWS::QuickSight::Analysis.FilterDateTimePickerControl":{"attributes":{},"description":"A control from a date filter that is used to specify date and time.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterDateTimePickerControl` .","SourceFilterId":"The source filter ID of the `FilterDateTimePickerControl` .","Title":"The title of the `FilterDateTimePickerControl` .","Type":"The date time picker type of a `FilterDateTimePickerControl` . Choose one of the following options:\\n\\n- `SINGLE_VALUED` : The filter condition is a fixed date.\\n- `DATE_RANGE` : The filter condition is a date time range."}},"AWS::QuickSight::Analysis.FilterDropDownControl":{"attributes":{},"description":"A control to display a dropdown list with buttons that are used to select a single value.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of the `FilterDropDownControl` .","FilterControlId":"The ID of the `FilterDropDownControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceFilterId":"The source filter ID of the `FilterDropDownControl` .","Title":"The title of the `FilterDropDownControl` .","Type":"The type of the `FilterDropDownControl` . Choose one of the following options:\\n\\n- `MULTI_SELECT` : The user can select multiple entries from a dropdown menu.\\n- `SINGLE_SELECT` : The user can select a single entry from a dropdown menu."}},"AWS::QuickSight::Analysis.FilterGroup":{"attributes":{},"description":"A grouping of individual filters. Filter groups are applied to the same group of visuals.\\n\\nFor more information, see [Adding filter conditions (group filters) with AND and OR operators](https://docs.aws.amazon.com/quicksight/latest/user/add-a-compound-filter.html) in the *Amazon QuickSight User Guide* .","properties":{"CrossDataset":"The filter new feature which can apply filter group to all data sets. Choose one of the following options:\\n\\n- `ALL_DATASETS`\\n- `SINGLE_DATASET`","FilterGroupId":"The value that uniquely identifies a `FilterGroup` within a dashboard, template, or analysis.","Filters":"The list of filters that are present in a `FilterGroup` .","ScopeConfiguration":"The configuration that specifies what scope to apply to a `FilterGroup` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","Status":"The status of the `FilterGroup` ."}},"AWS::QuickSight::Analysis.FilterListConfiguration":{"attributes":{},"description":"A list of filter configurations.","properties":{"CategoryValues":"The list of category values for the filter.","MatchOperator":"The match operator that is used to determine if a filter should be applied.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Analysis.FilterListControl":{"attributes":{},"description":"A control to display a list of buttons or boxes. This is used to select either a single value or multiple values.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterListControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceFilterId":"The source filter ID of the `FilterListControl` .","Title":"The title of the `FilterListControl` .","Type":"The type of `FilterListControl` . Choose one of the following options:\\n\\n- `MULTI_SELECT` : The user can select multiple entries from the list.\\n- `SINGLE_SELECT` : The user can select a single entry from the list."}},"AWS::QuickSight::Analysis.FilterOperationSelectedFieldsConfiguration":{"attributes":{},"description":"The configuration of selected fields in the `CustomActionFilterOperation` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SelectedColumns":"The selected columns of a dataset.","SelectedFieldOptions":"A structure that contains the options that choose which fields are filtered in the `CustomActionFilterOperation` .\\n\\nValid values are defined as follows:\\n\\n- `ALL_FIELDS` : Applies the filter operation to all fields.","SelectedFields":"Chooses the fields that are filtered in `CustomActionFilterOperation` ."}},"AWS::QuickSight::Analysis.FilterOperationTargetVisualsConfiguration":{"attributes":{},"description":"The configuration of target visuals that you want to be filtered.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SameSheetTargetVisualConfiguration":"The configuration of the same-sheet target visuals that you want to be filtered."}},"AWS::QuickSight::Analysis.FilterRelativeDateTimeControl":{"attributes":{},"description":"A control from a date filter that is used to specify the relative date.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterTextAreaControl` .","SourceFilterId":"The source filter ID of the `FilterTextAreaControl` .","Title":"The title of the `FilterTextAreaControl` ."}},"AWS::QuickSight::Analysis.FilterScopeConfiguration":{"attributes":{},"description":"The scope configuration for a `FilterGroup` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SelectedSheets":"The configuration for applying a filter to specific sheets."}},"AWS::QuickSight::Analysis.FilterSelectableValues":{"attributes":{},"description":"A list of selectable values that are used in a control.","properties":{"Values":"The values that are used in the `FilterSelectableValues` ."}},"AWS::QuickSight::Analysis.FilterSliderControl":{"attributes":{},"description":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterSliderControl` .","MaximumValue":"The smaller value that is displayed at the left of the slider.","MinimumValue":"The larger value that is displayed at the right of the slider.","SourceFilterId":"The source filter ID of the `FilterSliderControl` .","StepSize":"The number of increments that the slider bar is divided into.","Title":"The title of the `FilterSliderControl` .","Type":"The type of `FilterSliderControl` . Choose one of the following options:\\n\\n- `SINGLE_POINT` : Filter against(equals) a single data point.\\n- `RANGE` : Filter data that is in a specified range."}},"AWS::QuickSight::Analysis.FilterTextAreaControl":{"attributes":{},"description":"A control to display a text box that is used to enter multiple entries.","properties":{"Delimiter":"The delimiter that is used to separate the lines in text.","DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterTextAreaControl` .","SourceFilterId":"The source filter ID of the `FilterTextAreaControl` .","Title":"The title of the `FilterTextAreaControl` ."}},"AWS::QuickSight::Analysis.FilterTextFieldControl":{"attributes":{},"description":"A control to display a text box that is used to enter a single entry.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterTextFieldControl` .","SourceFilterId":"The source filter ID of the `FilterTextFieldControl` .","Title":"The title of the `FilterTextFieldControl` ."}},"AWS::QuickSight::Analysis.FontConfiguration":{"attributes":{},"description":"Configures the display properties of the given text.","properties":{"FontColor":"Determines the color of the text.","FontDecoration":"Determines the appearance of decorative lines on the text.","FontSize":"The option that determines the text display size.","FontStyle":"Determines the text display face that is inherited by the given font family.","FontWeight":"The option that determines the text display weight, or boldness."}},"AWS::QuickSight::Analysis.FontSize":{"attributes":{},"description":"The option that determines the text display size.","properties":{"Relative":"The lexical name for the text size, proportional to its surrounding context."}},"AWS::QuickSight::Analysis.FontWeight":{"attributes":{},"description":"The option that determines the text display weight, or boldness.","properties":{"Name":"The lexical name for the level of boldness of the text display."}},"AWS::QuickSight::Analysis.ForecastComputation":{"attributes":{},"description":"The forecast computation configuration.","properties":{"ComputationId":"The ID for a computation.","CustomSeasonalityValue":"The custom seasonality value setup of a forecast computation.","LowerBoundary":"The lower boundary setup of a forecast computation.","Name":"The name of a computation.","PeriodsBackward":"The periods backward setup of a forecast computation.","PeriodsForward":"The periods forward setup of a forecast computation.","PredictionInterval":"The prediction interval setup of a forecast computation.","Seasonality":"The seasonality setup of a forecast computation. Choose one of the following options:\\n\\n- `AUTOMATIC`\\n- `CUSTOM` : Checks the custom seasonality value.","Time":"The time field that is used in a computation.","UpperBoundary":"The upper boundary setup of a forecast computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Analysis.ForecastConfiguration":{"attributes":{},"description":"The forecast configuration that is used in a line chart\'s display properties.","properties":{"ForecastProperties":"The forecast properties setup of a forecast in the line chart.","Scenario":"The forecast scenario of a forecast in the line chart."}},"AWS::QuickSight::Analysis.ForecastScenario":{"attributes":{},"description":"The forecast scenario of a forecast in the line chart.","properties":{"WhatIfPointScenario":"The what-if analysis forecast setup with the target date.","WhatIfRangeScenario":"The what-if analysis forecast setup with the date range."}},"AWS::QuickSight::Analysis.FormatConfiguration":{"attributes":{},"description":"The formatting configuration for all types of field.","properties":{"DateTimeFormatConfiguration":"Formatting configuration for `DateTime` fields.","NumberFormatConfiguration":"Formatting configuration for number fields.","StringFormatConfiguration":"Formatting configuration for string fields."}},"AWS::QuickSight::Analysis.FreeFormLayoutCanvasSizeOptions":{"attributes":{},"description":"Configuration options for the canvas of a free-form layout.","properties":{"ScreenCanvasSizeOptions":"The options that determine the sizing of the canvas used in a free-form layout."}},"AWS::QuickSight::Analysis.FreeFormLayoutConfiguration":{"attributes":{},"description":"The configuration of a free-form layout.","properties":{"CanvasSizeOptions":"","Elements":"The elements that are included in a free-form layout."}},"AWS::QuickSight::Analysis.FreeFormLayoutElement":{"attributes":{},"description":"An element within a free-form layout.","properties":{"BackgroundStyle":"The background style configuration of a free-form layout element.","BorderStyle":"The border style configuration of a free-form layout element.","ElementId":"A unique identifier for an element within a free-form layout.","ElementType":"The type of element.","Height":"The height of an element within a free-form layout.","LoadingAnimation":"The loading animation configuration of a free-form layout element.","RenderingRules":"The rendering rules that determine when an element should be displayed within a free-form layout.","SelectedBorderStyle":"The border style configuration of a free-form layout element. This border style is used when the element is selected.","Visibility":"The visibility of an element within a free-form layout.","Width":"The width of an element within a free-form layout.","XAxisLocation":"The x-axis coordinate of the element.","YAxisLocation":"The y-axis coordinate of the element."}},"AWS::QuickSight::Analysis.FreeFormLayoutElementBackgroundStyle":{"attributes":{},"description":"The background style configuration of a free-form layout element.","properties":{"Color":"The background color of a free-form layout element.","Visibility":"The background visibility of a free-form layout element."}},"AWS::QuickSight::Analysis.FreeFormLayoutElementBorderStyle":{"attributes":{},"description":"The background style configuration of a free-form layout element.","properties":{"Color":"The border color of a free-form layout element.","Visibility":"The border visibility of a free-form layout element."}},"AWS::QuickSight::Analysis.FreeFormLayoutScreenCanvasSizeOptions":{"attributes":{},"description":"The options that determine the sizing of the canvas used in a free-form layout.","properties":{"OptimizedViewPortWidth":"The width that the view port will be optimized for when the layout renders."}},"AWS::QuickSight::Analysis.FreeFormSectionLayoutConfiguration":{"attributes":{},"description":"The free-form layout configuration of a section.","properties":{"Elements":"The elements that are included in the free-form layout."}},"AWS::QuickSight::Analysis.FunnelChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a `FunnelChartVisual` .","properties":{"Category":"The category field wells of a funnel chart. Values are grouped by category fields.","Values":"The value field wells of a funnel chart. Values are aggregated based on categories."}},"AWS::QuickSight::Analysis.FunnelChartConfiguration":{"attributes":{},"description":"The configuration of a `FunnelChartVisual` .","properties":{"CategoryLabelOptions":"The label options of the categories that are displayed in a `FunnelChartVisual` .","DataLabelOptions":"The options that determine the presentation of the data labels.","FieldWells":"The field well configuration of a `FunnelChartVisual` .","SortConfiguration":"The sort configuration of a `FunnelChartVisual` .","Tooltip":"The tooltip configuration of a `FunnelChartVisual` .","ValueLabelOptions":"The label options for the values that are displayed in a `FunnelChartVisual` .","VisualPalette":"The visual palette configuration of a `FunnelChartVisual` ."}},"AWS::QuickSight::Analysis.FunnelChartDataLabelOptions":{"attributes":{},"description":"The options that determine the presentation of the data labels.","properties":{"CategoryLabelVisibility":"The visibility of the category labels within the data labels.","LabelColor":"The color of the data label text.","LabelFontConfiguration":"The font configuration for the data labels.\\n\\nOnly the `FontSize` attribute of the font configuration is used for data labels.","MeasureDataLabelStyle":"Determines the style of the metric labels.","MeasureLabelVisibility":"The visibility of the measure labels within the data labels.","Position":"Determines the positioning of the data label relative to a section of the funnel.","Visibility":"The visibility option that determines if data labels are displayed."}},"AWS::QuickSight::Analysis.FunnelChartFieldWells":{"attributes":{},"description":"The field well configuration of a `FunnelChartVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FunnelChartAggregatedFieldWells":"The field well configuration of a `FunnelChartVisual` ."}},"AWS::QuickSight::Analysis.FunnelChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a `FunnelChartVisual` .","properties":{"CategoryItemsLimit":"The limit on the number of categories displayed.","CategorySort":"The sort configuration of the category fields."}},"AWS::QuickSight::Analysis.FunnelChartVisual":{"attributes":{},"description":"A funnel chart.\\n\\nFor more information, see [Using funnel charts](https://docs.aws.amazon.com/quicksight/latest/user/funnel-visual-content.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a `FunnelChartVisual` .","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Analysis.GaugeChartArcConditionalFormatting":{"attributes":{},"description":"The options that determine the presentation of the arc of a `GaugeChartVisual` .","properties":{"ForegroundColor":"The conditional formatting of the arc foreground color."}},"AWS::QuickSight::Analysis.GaugeChartConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a `GaugeChartVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options of a `GaugeChartVisual` ."}},"AWS::QuickSight::Analysis.GaugeChartConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options of a `GaugeChartVisual` .","properties":{"Arc":"The options that determine the presentation of the arc of a `GaugeChartVisual` .","PrimaryValue":"The conditional formatting for the primary value of a `GaugeChartVisual` ."}},"AWS::QuickSight::Analysis.GaugeChartConfiguration":{"attributes":{},"description":"The configuration of a `GaugeChartVisual` .","properties":{"DataLabels":"The data label configuration of a `GaugeChartVisual` .","FieldWells":"The field well configuration of a `GaugeChartVisual` .","GaugeChartOptions":"The options that determine the presentation of the `GaugeChartVisual` .","TooltipOptions":"The tooltip configuration of a `GaugeChartVisual` .","VisualPalette":"The visual palette configuration of a `GaugeChartVisual` ."}},"AWS::QuickSight::Analysis.GaugeChartFieldWells":{"attributes":{},"description":"The field well configuration of a `GaugeChartVisual` .","properties":{"TargetValues":"The target value field wells of a `GaugeChartVisual` .","Values":"The value field wells of a `GaugeChartVisual` ."}},"AWS::QuickSight::Analysis.GaugeChartOptions":{"attributes":{},"description":"The options that determine the presentation of the `GaugeChartVisual` .","properties":{"Arc":"The arc configuration of a `GaugeChartVisual` .","ArcAxis":"The arc axis configuration of a `GaugeChartVisual` .","Comparison":"The comparison configuration of a `GaugeChartVisual` .","PrimaryValueDisplayType":"The options that determine the primary value display type.","PrimaryValueFontConfiguration":"The options that determine the primary value font configuration."}},"AWS::QuickSight::Analysis.GaugeChartPrimaryValueConditionalFormatting":{"attributes":{},"description":"The conditional formatting for the primary value of a `GaugeChartVisual` .","properties":{"Icon":"The conditional formatting of the primary value icon.","TextColor":"The conditional formatting of the primary value text color."}},"AWS::QuickSight::Analysis.GaugeChartVisual":{"attributes":{},"description":"A gauge chart.\\n\\nFor more information, see [Using gauge charts](https://docs.aws.amazon.com/quicksight/latest/user/gauge-chart.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a `GaugeChartVisual` .","ConditionalFormatting":"The conditional formatting of a `GaugeChartVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.GeospatialCoordinateBounds":{"attributes":{},"description":"The bound options (north, south, west, east) of the geospatial window options.","properties":{"East":"The longitude of the east bound of the geospatial coordinate bounds.","North":"The latitude of the north bound of the geospatial coordinate bounds.","South":"The latitude of the south bound of the geospatial coordinate bounds.","West":"The longitude of the west bound of the geospatial coordinate bounds."}},"AWS::QuickSight::Analysis.GeospatialHeatmapColorScale":{"attributes":{},"description":"The color scale specification for the heatmap point style.","properties":{"Colors":"The list of colors to be used in heatmap point style."}},"AWS::QuickSight::Analysis.GeospatialHeatmapConfiguration":{"attributes":{},"description":"The heatmap configuration of the geospatial point style.","properties":{"HeatmapColor":"The color scale specification for the heatmap point style."}},"AWS::QuickSight::Analysis.GeospatialHeatmapDataColor":{"attributes":{},"description":"The color to be used in the heatmap point style.","properties":{"Color":"The hex color to be used in the heatmap point style."}},"AWS::QuickSight::Analysis.GeospatialMapAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells for a geospatial map.","properties":{"Colors":"The color field wells of a geospatial map.","Geospatial":"The geospatial field wells of a geospatial map. Values are grouped by geospatial fields.","Values":"The size field wells of a geospatial map. Values are aggregated based on geospatial fields."}},"AWS::QuickSight::Analysis.GeospatialMapConfiguration":{"attributes":{},"description":"The configuration of a `GeospatialMapVisual` .","properties":{"FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","MapStyleOptions":"The map style options of the geospatial map.","PointStyleOptions":"The point style options of the geospatial map.","Tooltip":"The tooltip display setup of the visual.","VisualPalette":"","WindowOptions":"The window options of the geospatial map."}},"AWS::QuickSight::Analysis.GeospatialMapFieldWells":{"attributes":{},"description":"The field wells of a `GeospatialMapVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"GeospatialMapAggregatedFieldWells":"The aggregated field well for a geospatial map."}},"AWS::QuickSight::Analysis.GeospatialMapStyleOptions":{"attributes":{},"description":"The map style options of the geospatial map.","properties":{"BaseMapStyle":"The base map style of the geospatial map."}},"AWS::QuickSight::Analysis.GeospatialMapVisual":{"attributes":{},"description":"A geospatial map or a points on map visual.\\n\\nFor more information, see [Creating point maps](https://docs.aws.amazon.com/quicksight/latest/user/point-maps.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Analysis.GeospatialPointStyleOptions":{"attributes":{},"description":"The point style of the geospatial map.","properties":{"ClusterMarkerConfiguration":"The cluster marker configuration of the geospatial point style.","HeatmapConfiguration":"The heatmap configuration of the geospatial point style.","SelectedPointStyle":"The selected point styles (point, cluster) of the geospatial map."}},"AWS::QuickSight::Analysis.GeospatialWindowOptions":{"attributes":{},"description":"The window options of the geospatial map visual.","properties":{"Bounds":"The bounds options (north, south, west, east) of the geospatial window options.","MapZoomMode":"The map zoom modes (manual, auto) of the geospatial window options."}},"AWS::QuickSight::Analysis.GlobalTableBorderOptions":{"attributes":{},"description":"Determines the border options for a table visual.","properties":{"SideSpecificBorder":"Determines the options for side specific border.","UniformBorder":"Determines the options for uniform border."}},"AWS::QuickSight::Analysis.GradientColor":{"attributes":{},"description":"Determines the gradient color settings.","properties":{"Stops":"The list of gradient color stops."}},"AWS::QuickSight::Analysis.GradientStop":{"attributes":{},"description":"Determines the gradient stop configuration.","properties":{"Color":"Determines the color.","DataValue":"Determines the data value.","GradientOffset":"Determines gradient offset value."}},"AWS::QuickSight::Analysis.GridLayoutCanvasSizeOptions":{"attributes":{},"description":"Configuration options for the canvas of a grid layout.","properties":{"ScreenCanvasSizeOptions":"The options that determine the sizing of the canvas used in a grid layout."}},"AWS::QuickSight::Analysis.GridLayoutConfiguration":{"attributes":{},"description":"The configuration for a grid layout. Also called a tiled layout.\\n\\nVisuals snap to a grid with standard spacing and alignment. Dashboards are displayed as designed, with options to fit to screen or view at actual size.","properties":{"CanvasSizeOptions":"","Elements":"The elements that are included in a grid layout."}},"AWS::QuickSight::Analysis.GridLayoutElement":{"attributes":{},"description":"An element within a grid layout.","properties":{"ColumnIndex":"The column index for the upper left corner of an element.","ColumnSpan":"The width of a grid element expressed as a number of grid columns.","ElementId":"A unique identifier for an element within a grid layout.","ElementType":"The type of element.","RowIndex":"The row index for the upper left corner of an element.","RowSpan":"The height of a grid element expressed as a number of grid rows."}},"AWS::QuickSight::Analysis.GridLayoutScreenCanvasSizeOptions":{"attributes":{},"description":"The options that determine the sizing of the canvas used in a grid layout.","properties":{"OptimizedViewPortWidth":"The width that the view port will be optimized for when the layout renders.","ResizeOption":"This value determines the layout behavior when the viewport is resized.\\n\\n- `FIXED` : A fixed width will be used when optimizing the layout. In the Amazon QuickSight console, this option is called `Classic` .\\n- `RESPONSIVE` : The width of the canvas will be responsive and optimized to the view port. In the Amazon QuickSight console, this option is called `Tiled` ."}},"AWS::QuickSight::Analysis.GrowthRateComputation":{"attributes":{},"description":"The growth rate computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","PeriodSize":"The period size setup of a growth rate computation.","Time":"The time field that is used in a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Analysis.HeaderFooterSectionConfiguration":{"attributes":{},"description":"The configuration of a header or footer section.","properties":{"Layout":"The layout configuration of the header or footer section.","SectionId":"The unique identifier of the header or footer section.","Style":"The style options of a header or footer section."}},"AWS::QuickSight::Analysis.HeatMapAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a heat map.","properties":{"Columns":"The columns field well of a heat map.","Rows":"The rows field well of a heat map.","Values":"The values field well of a heat map."}},"AWS::QuickSight::Analysis.HeatMapConfiguration":{"attributes":{},"description":"The configuration of a heat map.","properties":{"ColorScale":"The color options (gradient color, point of divergence) in a heat map.","ColumnLabelOptions":"The label options of the column that is displayed in a heat map.","DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","RowLabelOptions":"The label options of the row that is displayed in a `heat map` .","SortConfiguration":"The sort configuration of a heat map.","Tooltip":"The tooltip display setup of the visual."}},"AWS::QuickSight::Analysis.HeatMapFieldWells":{"attributes":{},"description":"The field well configuration of a heat map.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"HeatMapAggregatedFieldWells":"The aggregated field wells of a heat map."}},"AWS::QuickSight::Analysis.HeatMapSortConfiguration":{"attributes":{},"description":"The sort configuration of a heat map.","properties":{"HeatMapColumnItemsLimitConfiguration":"The limit on the number of columns that are displayed in a heat map.","HeatMapColumnSort":"The column sort configuration for heat map for columns that aren\'t a part of a field well.","HeatMapRowItemsLimitConfiguration":"The limit on the number of rows that are displayed in a heat map.","HeatMapRowSort":"The field sort configuration of the rows fields."}},"AWS::QuickSight::Analysis.HeatMapVisual":{"attributes":{},"description":"A heat map.\\n\\nFor more information, see [Using heat maps](https://docs.aws.amazon.com/quicksight/latest/user/heat-map.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a heat map.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.HistogramAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a histogram.","properties":{"Values":"The value field wells of a histogram. Values are aggregated by `COUNT` or `DISTINCT_COUNT` ."}},"AWS::QuickSight::Analysis.HistogramBinOptions":{"attributes":{},"description":"The options that determine the presentation of histogram bins.","properties":{"BinCount":"The options that determine the bin count of a histogram.","BinWidth":"The options that determine the bin width of a histogram.","SelectedBinType":"The options that determine the selected bin type.","StartValue":"The options that determine the bin start value."}},"AWS::QuickSight::Analysis.HistogramConfiguration":{"attributes":{},"description":"The configuration for a `HistogramVisual` .","properties":{"BinOptions":"The options that determine the presentation of histogram bins.","DataLabels":"The data label configuration of a histogram.","FieldWells":"The field well configuration of a histogram.","Tooltip":"The tooltip configuration of a histogram.","VisualPalette":"The visual palette configuration of a histogram.","XAxisDisplayOptions":"The options that determine the presentation of the x-axis.","XAxisLabelOptions":"The options that determine the presentation of the x-axis label.","YAxisDisplayOptions":"The options that determine the presentation of the y-axis."}},"AWS::QuickSight::Analysis.HistogramFieldWells":{"attributes":{},"description":"The field well configuration of a histogram.","properties":{"HistogramAggregatedFieldWells":"The field well configuration of a histogram."}},"AWS::QuickSight::Analysis.HistogramVisual":{"attributes":{},"description":"A histogram.\\n\\nFor more information, see [Using histograms](https://docs.aws.amazon.com/quicksight/latest/user/histogram-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration for a `HistogramVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.InsightConfiguration":{"attributes":{},"description":"The configuration of an insight visual.","properties":{"Computations":"The computations configurations of the insight visual","CustomNarrative":"The custom narrative of the insight visual."}},"AWS::QuickSight::Analysis.InsightVisual":{"attributes":{},"description":"An insight visual.\\n\\nFor more information, see [Working with insights](https://docs.aws.amazon.com/quicksight/latest/user/computational-insights.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","DataSetIdentifier":"The dataset that is used in the insight visual.","InsightConfiguration":"The configuration of an insight visual.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.IntegerDefaultValues":{"attributes":{},"description":"The default values of the `IntegerParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `IntegerDefaultValues` . Different defaults are displayed according to users, groups, and values mapping.","StaticValues":"The static values of the `IntegerDefaultValues` ."}},"AWS::QuickSight::Analysis.IntegerParameter":{"attributes":{},"description":"An integer parameter.","properties":{"Name":"The name of the integer parameter.","Values":"The values for the integer parameter."}},"AWS::QuickSight::Analysis.IntegerParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `Integer` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","ParameterValueType":"The value type determines whether the parameter is a single-value or multi-value parameter.","ValueWhenUnset":"A parameter declaration for the `Integer` data type."}},"AWS::QuickSight::Analysis.IntegerValueWhenUnsetConfiguration":{"attributes":{},"description":"A parameter declaration for the `Integer` data type.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Analysis.ItemsLimitConfiguration":{"attributes":{},"description":"The limit configuration of the visual display for an axis.","properties":{"ItemsLimit":"The limit on how many items of a field are showed in the chart. For example, the number of slices that are displayed in a pie chart.","OtherCategories":"The `Show other` of an axis in the chart. Choose one of the following options:\\n\\n- `INCLUDE`\\n- `EXCLUDE`"}},"AWS::QuickSight::Analysis.KPIConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a KPI visual.","properties":{"ConditionalFormattingOptions":"The conditional formatting options of a KPI visual."}},"AWS::QuickSight::Analysis.KPIConditionalFormattingOption":{"attributes":{},"description":"The conditional formatting options of a KPI visual.","properties":{"PrimaryValue":"The conditional formatting for the primary value of a KPI visual.","ProgressBar":"The conditional formatting for the progress bar of a KPI visual."}},"AWS::QuickSight::Analysis.KPIConfiguration":{"attributes":{},"description":"The configuration of a KPI visual.","properties":{"FieldWells":"The field well configuration of a KPI visual.","KPIOptions":"The options that determine the presentation of a KPI visual.","SortConfiguration":"The sort configuration of a KPI visual."}},"AWS::QuickSight::Analysis.KPIFieldWells":{"attributes":{},"description":"The field well configuration of a KPI visual.","properties":{"TargetValues":"The target value field wells of a KPI visual.","TrendGroups":"The trend group field wells of a KPI visual.","Values":"The value field wells of a KPI visual."}},"AWS::QuickSight::Analysis.KPIOptions":{"attributes":{},"description":"The options that determine the presentation of a KPI visual.","properties":{"Comparison":"The comparison configuration of a KPI visual.","PrimaryValueDisplayType":"The options that determine the primary value display type.","PrimaryValueFontConfiguration":"The options that determine the primary value font configuration.","ProgressBar":"The options that determine the presentation of the progress bar of a KPI visual.","SecondaryValue":"The options that determine the presentation of the secondary value of a KPI visual.","SecondaryValueFontConfiguration":"The options that determine the secondary value font configuration.","TrendArrows":"The options that determine the presentation of trend arrows in a KPI visual."}},"AWS::QuickSight::Analysis.KPIPrimaryValueConditionalFormatting":{"attributes":{},"description":"The conditional formatting for the primary value of a KPI visual.","properties":{"Icon":"The conditional formatting of the primary value\'s icon.","TextColor":"The conditional formatting of the primary value\'s text color."}},"AWS::QuickSight::Analysis.KPIProgressBarConditionalFormatting":{"attributes":{},"description":"The conditional formatting for the progress bar of a KPI visual.","properties":{"ForegroundColor":"The conditional formatting of the progress bar\'s foreground color."}},"AWS::QuickSight::Analysis.KPISortConfiguration":{"attributes":{},"description":"The sort configuration of a KPI visual.","properties":{"TrendGroupSort":"The sort configuration of the trend group fields."}},"AWS::QuickSight::Analysis.KPIVisual":{"attributes":{},"description":"A key performance indicator (KPI).\\n\\nFor more information, see [Using KPIs](https://docs.aws.amazon.com/quicksight/latest/user/kpi.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a KPI visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","ConditionalFormatting":"The conditional formatting of a KPI visual.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.LabelOptions":{"attributes":{},"description":"The share label options for the labels.","properties":{"CustomLabel":"The text for the label.","FontConfiguration":"The font configuration of the label.","Visibility":"Determines whether or not the label is visible."}},"AWS::QuickSight::Analysis.Layout":{"attributes":{},"description":"A `Layout` defines the placement of elements within a sheet.\\n\\nFor more information, see [Types of layout](https://docs.aws.amazon.com/quicksight/latest/user/types-of-layout.html) in the *Amazon QuickSight User Guide* .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Configuration":"The configuration that determines what the type of layout for a sheet."}},"AWS::QuickSight::Analysis.LayoutConfiguration":{"attributes":{},"description":"The configuration that determines what the type of layout will be used on a sheet.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FreeFormLayout":"A free-form is optimized for a fixed width and has more control over the exact placement of layout elements.","GridLayout":"A type of layout that can be used on a sheet. In a grid layout, visuals snap to a grid with standard spacing and alignment. Dashboards are displayed as designed, with options to fit to screen or view at actual size. A grid layout can be configured to behave in one of two ways when the viewport is resized: `FIXED` or `RESPONSIVE` .","SectionBasedLayout":"A section based layout organizes visuals into multiple sections and has customized header, footer and page break."}},"AWS::QuickSight::Analysis.LegendOptions":{"attributes":{},"description":"The options for the legend setup of a visual.","properties":{"Height":"The height of the legend. If this value is omitted, a default height is used when rendering.","Position":"The positions for the legend. Choose one of the following options:\\n\\n- `AUTO`\\n- `RIGHT`\\n- `BOTTOM`\\n- `LEFT`","Title":"The custom title for the legend.","Visibility":"Determines whether or not the legend is visible.","Width":"The width of the legend. If this value is omitted, a default width is used when rendering."}},"AWS::QuickSight::Analysis.LineChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a line chart.","properties":{"Category":"The category field wells of a line chart. Values are grouped by category fields.","Colors":"The color field wells of a line chart. Values are grouped by category fields.","SmallMultiples":"The small multiples field well of a line chart.","Values":"The value field wells of a line chart. Values are aggregated based on categories."}},"AWS::QuickSight::Analysis.LineChartConfiguration":{"attributes":{},"description":"The configuration of a line chart.","properties":{"ContributionAnalysisDefaults":"The default configuration of a line chart\'s contribution analysis.","DataLabels":"The data label configuration of a line chart.","DefaultSeriesSettings":"The options that determine the default presentation of all line series in `LineChartVisual` .","FieldWells":"The field well configuration of a line chart.","ForecastConfigurations":"The forecast configuration of a line chart.","Legend":"The legend configuration of a line chart.","PrimaryYAxisDisplayOptions":"The series axis configuration of a line chart.","PrimaryYAxisLabelOptions":"The options that determine the presentation of the y-axis label.","ReferenceLines":"The reference lines configuration of a line chart.","SecondaryYAxisDisplayOptions":"The series axis configuration of a line chart.","SecondaryYAxisLabelOptions":"The options that determine the presentation of the secondary y-axis label.","Series":"The series item configuration of a line chart.","SmallMultiplesOptions":"The small multiples setup for the visual.","SortConfiguration":"The sort configuration of a line chart.","Tooltip":"The tooltip configuration of a line chart.","Type":"Determines the type of the line chart.","VisualPalette":"The visual palette configuration of a line chart.","XAxisDisplayOptions":"The options that determine the presentation of the x-axis.","XAxisLabelOptions":"The options that determine the presentation of the x-axis label."}},"AWS::QuickSight::Analysis.LineChartDefaultSeriesSettings":{"attributes":{},"description":"The options that determine the default presentation of all line series in `LineChartVisual` .","properties":{"AxisBinding":"The axis to which you are binding all line series to.","LineStyleSettings":"Line styles options for all line series in the visual.","MarkerStyleSettings":"Marker styles options for all line series in the visual."}},"AWS::QuickSight::Analysis.LineChartFieldWells":{"attributes":{},"description":"The field well configuration of a line chart.","properties":{"LineChartAggregatedFieldWells":"The field well configuration of a line chart."}},"AWS::QuickSight::Analysis.LineChartLineStyleSettings":{"attributes":{},"description":"Line styles options for a line series in `LineChartVisual` .","properties":{"LineInterpolation":"Interpolation style for line series.\\n\\n- `LINEAR` : Show as default, linear style.\\n- `SMOOTH` : Show as a smooth curve.\\n- `STEPPED` : Show steps in line.","LineStyle":"Line style for line series.\\n\\n- `SOLID` : Show as a solid line.\\n- `DOTTED` : Show as a dotted line.\\n- `DASHED` : Show as a dashed line.","LineVisibility":"Configuration option that determines whether to show the line for the series.","LineWidth":"Width that determines the line thickness."}},"AWS::QuickSight::Analysis.LineChartMarkerStyleSettings":{"attributes":{},"description":"Marker styles options for a line series in `LineChartVisual` .","properties":{"MarkerColor":"Color of marker in the series.","MarkerShape":"Shape option for markers in the series.\\n\\n- `CIRCLE` : Show marker as a circle.\\n- `TRIANGLE` : Show marker as a triangle.\\n- `SQUARE` : Show marker as a square.\\n- `DIAMOND` : Show marker as a diamond.\\n- `ROUNDED_SQUARE` : Show marker as a rounded square.","MarkerSize":"Size of marker in the series.","MarkerVisibility":"Configuration option that determines whether to show the markers in the series."}},"AWS::QuickSight::Analysis.LineChartSeriesSettings":{"attributes":{},"description":"The options that determine the presentation of a line series in the visual","properties":{"LineStyleSettings":"Line styles options for a line series in `LineChartVisual` .","MarkerStyleSettings":"Marker styles options for a line series in `LineChartVisual` ."}},"AWS::QuickSight::Analysis.LineChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a line chart.","properties":{"CategoryItemsLimitConfiguration":"The limit on the number of categories that are displayed in a line chart.","CategorySort":"The sort configuration of the category fields.","ColorItemsLimitConfiguration":"The limit on the number of lines that are displayed in a line chart.","SmallMultiplesLimitConfiguration":"The limit on the number of small multiples panels that are displayed.","SmallMultiplesSort":"The sort configuration of the small multiples field."}},"AWS::QuickSight::Analysis.LineChartVisual":{"attributes":{},"description":"A line chart.\\n\\nFor more information, see [Using line charts](https://docs.aws.amazon.com/quicksight/latest/user/line-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a line chart.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.LineSeriesAxisDisplayOptions":{"attributes":{},"description":"The series axis configuration of a line chart.","properties":{"AxisOptions":"The options that determine the presentation of the line series axis.","MissingDataConfigurations":"The configuration options that determine how missing data is treated during the rendering of a line chart."}},"AWS::QuickSight::Analysis.ListControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"SearchOptions":"The configuration of the search options in a list control.","SelectAllOptions":"The configuration of the `Select all` options in a list control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Analysis.ListControlSearchOptions":{"attributes":{},"description":"The configuration of the search options in a list control.","properties":{"Visibility":"The visibility configuration of the search options in a list control."}},"AWS::QuickSight::Analysis.ListControlSelectAllOptions":{"attributes":{},"description":"The configuration of the `Select all` options in a list control.","properties":{"Visibility":"The visibility configuration of the `Select all` options in a list control."}},"AWS::QuickSight::Analysis.LoadingAnimation":{"attributes":{},"description":"The configuration of loading animation in free-form layout.","properties":{"Visibility":"The visibility configuration of `LoadingAnimation` ."}},"AWS::QuickSight::Analysis.LocalNavigationConfiguration":{"attributes":{},"description":"The navigation configuration for `CustomActionNavigationOperation` .","properties":{"TargetSheetId":"The sheet that is targeted for navigation in the same analysis."}},"AWS::QuickSight::Analysis.LongFormatText":{"attributes":{},"description":"The text format for a subtitle.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PlainText":"Plain text format.","RichText":"Rich text. Examples of rich text include bold, underline, and italics."}},"AWS::QuickSight::Analysis.MappedDataSetParameter":{"attributes":{},"description":"A dataset parameter that is mapped to an analysis parameter.","properties":{"DataSetIdentifier":"A unique name that identifies a dataset within the analysis or dashboard.","DataSetParameterName":"The name of the dataset parameter."}},"AWS::QuickSight::Analysis.MaximumLabelType":{"attributes":{},"description":"The maximum label of a data path label.","properties":{"Visibility":"The visibility of the maximum label."}},"AWS::QuickSight::Analysis.MaximumMinimumComputation":{"attributes":{},"description":"The maximum and minimum computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","Time":"The time field that is used in a computation.","Type":"The type of computation. Choose one of the following options:\\n\\n- MAXIMUM: A maximum computation.\\n- MINIMUM: A minimum computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Analysis.MeasureField":{"attributes":{},"description":"The measure (metric) type field.","properties":{"CalculatedMeasureField":"The calculated measure field only used in pivot tables.","CategoricalMeasureField":"The measure type field with categorical type columns.","DateMeasureField":"The measure type field with date type columns.","NumericalMeasureField":"The measure type field with numerical type columns."}},"AWS::QuickSight::Analysis.MetricComparisonComputation":{"attributes":{},"description":"The metric comparison computation configuration.","properties":{"ComputationId":"The ID for a computation.","FromValue":"The field that is used in a metric comparison from value setup.","Name":"The name of a computation.","TargetValue":"The field that is used in a metric comparison to value setup.","Time":"The time field that is used in a computation."}},"AWS::QuickSight::Analysis.MinimumLabelType":{"attributes":{},"description":"The minimum label of a data path label.","properties":{"Visibility":"The visibility of the minimum label."}},"AWS::QuickSight::Analysis.MissingDataConfiguration":{"attributes":{},"description":"The configuration options that determine how missing data is treated during the rendering of a line chart.","properties":{"TreatmentOption":"The treatment option that determines how missing data should be rendered. Choose from the following options:\\n\\n- `INTERPOLATE` : Interpolate missing values between the prior and the next known value.\\n- `SHOW_AS_ZERO` : Show missing values as the value `0` .\\n- `SHOW_AS_BLANK` : Display a blank space when rendering missing data."}},"AWS::QuickSight::Analysis.NegativeValueConfiguration":{"attributes":{},"description":"The options that determine the negative value configuration.","properties":{"DisplayMode":"Determines the display mode of the negative value configuration."}},"AWS::QuickSight::Analysis.NullValueFormatConfiguration":{"attributes":{},"description":"The options that determine the null value format configuration.","properties":{"NullString":"Determines the null string of null values."}},"AWS::QuickSight::Analysis.NumberDisplayFormatConfiguration":{"attributes":{},"description":"The options that determine the number display format configuration.","properties":{"DecimalPlacesConfiguration":"The option that determines the decimal places configuration.","NegativeValueConfiguration":"The options that determine the negative value configuration.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumberScale":"Determines the number scale value of the number format.","Prefix":"Determines the prefix value of the number format.","SeparatorConfiguration":"The options that determine the numeric separator configuration.","Suffix":"Determines the suffix value of the number format."}},"AWS::QuickSight::Analysis.NumberFormatConfiguration":{"attributes":{},"description":"Formatting configuration for number fields.","properties":{"FormatConfiguration":"The options that determine the numeric format configuration."}},"AWS::QuickSight::Analysis.NumericAxisOptions":{"attributes":{},"description":"The options for an axis with a numeric field.","properties":{"Range":"The range setup of a numeric axis.","Scale":"The scale setup of a numeric axis."}},"AWS::QuickSight::Analysis.NumericEqualityDrillDownFilter":{"attributes":{},"description":"The category drill down filter.","properties":{"Column":"The column that the filter is applied to.","Value":"The value of the double input numeric drill down filter."}},"AWS::QuickSight::Analysis.NumericEqualityFilter":{"attributes":{},"description":"A `NumericEqualityFilter` filters values that are equal to the specified value.","properties":{"AggregationFunction":"The aggregation function of the filter.","Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","MatchOperator":"The match operator that is used to determine if a filter should be applied.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","ParameterName":"The parameter whose value should be used for the filter value.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`","Value":"The input value."}},"AWS::QuickSight::Analysis.NumericFormatConfiguration":{"attributes":{},"description":"The options that determine the numeric format configuration.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CurrencyDisplayFormatConfiguration":"The options that determine the currency display format configuration.","NumberDisplayFormatConfiguration":"The options that determine the number display format configuration.","PercentageDisplayFormatConfiguration":"The options that determine the percentage display format configuration."}},"AWS::QuickSight::Analysis.NumericRangeFilter":{"attributes":{},"description":"A `NumericRangeFilter` filters values that are within the value range.","properties":{"AggregationFunction":"The aggregation function of the filter.","Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","IncludeMaximum":"Determines whether the maximum value in the filter value range should be included in the filtered results.","IncludeMinimum":"Determines whether the minimum value in the filter value range should be included in the filtered results.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","RangeMaximum":"The maximum value for the filter value range.","RangeMinimum":"The minimum value for the filter value range.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Analysis.NumericRangeFilterValue":{"attributes":{},"description":"The value input pf the numeric range filter.","properties":{"Parameter":"The parameter that is used in the numeric range.","StaticValue":"The static value of the numeric range filter."}},"AWS::QuickSight::Analysis.NumericSeparatorConfiguration":{"attributes":{},"description":"The options that determine the numeric separator configuration.","properties":{"DecimalSeparator":"Determines the decimal separator.","ThousandsSeparator":"The options that determine the thousands separator configuration."}},"AWS::QuickSight::Analysis.NumericalAggregationFunction":{"attributes":{},"description":"Aggregation for numerical values.","properties":{"PercentileAggregation":"An aggregation based on the percentile of values in a dimension or measure.","SimpleNumericalAggregation":"Built-in aggregation functions for numerical values.\\n\\n- `SUM` : The sum of a dimension or measure.\\n- `AVERAGE` : The average of a dimension or measure.\\n- `MIN` : The minimum value of a dimension or measure.\\n- `MAX` : The maximum value of a dimension or measure.\\n- `COUNT` : The count of a dimension or measure.\\n- `DISTINCT_COUNT` : The count of distinct values in a dimension or measure.\\n- `VAR` : The variance of a dimension or measure.\\n- `VARP` : The partitioned variance of a dimension or measure.\\n- `STDEV` : The standard deviation of a dimension or measure.\\n- `STDEVP` : The partitioned standard deviation of a dimension or measure.\\n- `MEDIAN` : The median value of a dimension or measure."}},"AWS::QuickSight::Analysis.NumericalDimensionField":{"attributes":{},"description":"The dimension type field with numerical type columns.","properties":{"Column":"The column that is used in the `NumericalDimensionField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field.","HierarchyId":"The custom hierarchy ID."}},"AWS::QuickSight::Analysis.NumericalMeasureField":{"attributes":{},"description":"The measure type field with numerical type columns.","properties":{"AggregationFunction":"The aggregation function of the measure field.","Column":"The column that is used in the `NumericalMeasureField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Analysis.PaginationConfiguration":{"attributes":{},"description":"The pagination configuration for a table visual or boxplot.","properties":{"PageNumber":"Indicates the page number.","PageSize":"Indicates how many items render in one page."}},"AWS::QuickSight::Analysis.PanelConfiguration":{"attributes":{},"description":"A collection of options that configure how each panel displays in a small multiples chart.","properties":{"BackgroundColor":"Sets the background color for each panel.","BackgroundVisibility":"Determines whether or not a background for each small multiples panel is rendered.","BorderColor":"Sets the line color of panel borders.","BorderStyle":"Sets the line style of panel borders.","BorderThickness":"Sets the line thickness of panel borders.","BorderVisibility":"Determines whether or not each panel displays a border.","GutterSpacing":"Sets the total amount of negative space to display between sibling panels.","GutterVisibility":"Determines whether or not negative space between sibling panels is rendered.","Title":"Configures the title display within each small multiples panel."}},"AWS::QuickSight::Analysis.PanelTitleOptions":{"attributes":{},"description":"The options that determine the title styles for each small multiples panel.","properties":{"FontConfiguration":"","HorizontalTextAlignment":"Sets the horizontal text alignment of the title within each panel.","Visibility":"Determines whether or not panel titles are displayed."}},"AWS::QuickSight::Analysis.ParameterControl":{"attributes":{},"description":"The control of a parameter that users can interact with in a dashboard or an analysis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimePicker":"A control from a date parameter that specifies date and time.","Dropdown":"A control to display a dropdown list with buttons that are used to select a single value.","List":"A control to display a list with buttons or boxes that are used to select either a single value or multiple values.","Slider":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","TextArea":"A control to display a text box that is used to enter multiple entries.","TextField":"A control to display a text box that is used to enter a single entry."}},"AWS::QuickSight::Analysis.ParameterDateTimePickerControl":{"attributes":{},"description":"A control from a date parameter that specifies date and time.","properties":{"DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterDateTimePickerControl` .","SourceParameterName":"The name of the `ParameterDateTimePickerControl` .","Title":"The title of the `ParameterDateTimePickerControl` ."}},"AWS::QuickSight::Analysis.ParameterDeclaration":{"attributes":{},"description":"The declaration definition of a parameter.\\n\\nFor more information, see [Parameters in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/parameters-in-quicksight.html) in the *Amazon QuickSight User Guide* .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimeParameterDeclaration":"A parameter declaration for the `DateTime` data type.","DecimalParameterDeclaration":"A parameter declaration for the `Decimal` data type.","IntegerParameterDeclaration":"A parameter declaration for the `Integer` data type.","StringParameterDeclaration":"A parameter declaration for the `String` data type."}},"AWS::QuickSight::Analysis.ParameterDropDownControl":{"attributes":{},"description":"A control to display a dropdown list with buttons that are used to select a single value.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterDropDownControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceParameterName":"The source parameter name of the `ParameterDropDownControl` .","Title":"The title of the `ParameterDropDownControl` .","Type":"The type parameter name of the `ParameterDropDownControl` ."}},"AWS::QuickSight::Analysis.ParameterListControl":{"attributes":{},"description":"A control to display a list with buttons or boxes that are used to select either a single value or multiple values.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterListControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceParameterName":"The source parameter name of the `ParameterListControl` .","Title":"The title of the `ParameterListControl` .","Type":"The type of `ParameterListControl` ."}},"AWS::QuickSight::Analysis.ParameterSelectableValues":{"attributes":{},"description":"A list of selectable values that are used in a control.","properties":{"LinkToDataSetColumn":"The column identifier that fetches values from the data set.","Values":"The values that are used in `ParameterSelectableValues` ."}},"AWS::QuickSight::Analysis.ParameterSliderControl":{"attributes":{},"description":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","properties":{"DisplayOptions":"The display options of a control.","MaximumValue":"The smaller value that is displayed at the left of the slider.","MinimumValue":"The larger value that is displayed at the right of the slider.","ParameterControlId":"The ID of the `ParameterSliderControl` .","SourceParameterName":"The source parameter name of the `ParameterSliderControl` .","StepSize":"The number of increments that the slider bar is divided into.","Title":"The title of the `ParameterSliderControl` ."}},"AWS::QuickSight::Analysis.ParameterTextAreaControl":{"attributes":{},"description":"A control to display a text box that is used to enter multiple entries.","properties":{"Delimiter":"The delimiter that is used to separate the lines in text.","DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterTextAreaControl` .","SourceParameterName":"The source parameter name of the `ParameterTextAreaControl` .","Title":"The title of the `ParameterTextAreaControl` ."}},"AWS::QuickSight::Analysis.ParameterTextFieldControl":{"attributes":{},"description":"A control to display a text box that is used to enter a single entry.","properties":{"DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterTextFieldControl` .","SourceParameterName":"The source parameter name of the `ParameterTextFieldControl` .","Title":"The title of the `ParameterTextFieldControl` ."}},"AWS::QuickSight::Analysis.Parameters":{"attributes":{},"description":"A list of Amazon QuickSight parameters and the list\'s override values.","properties":{"DateTimeParameters":"The parameters that have a data type of date-time.","DecimalParameters":"The parameters that have a data type of decimal.","IntegerParameters":"The parameters that have a data type of integer.","StringParameters":"The parameters that have a data type of string."}},"AWS::QuickSight::Analysis.PercentVisibleRange":{"attributes":{},"description":"The percent range in the visible range.","properties":{"From":"The lower bound of the range.","To":"The top bound of the range."}},"AWS::QuickSight::Analysis.PercentageDisplayFormatConfiguration":{"attributes":{},"description":"The options that determine the percentage display format configuration.","properties":{"DecimalPlacesConfiguration":"The option that determines the decimal places configuration.","NegativeValueConfiguration":"The options that determine the negative value configuration.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","Prefix":"Determines the prefix value of the percentage format.","SeparatorConfiguration":"The options that determine the numeric separator configuration.","Suffix":"Determines the suffix value of the percentage format."}},"AWS::QuickSight::Analysis.PercentileAggregation":{"attributes":{},"description":"An aggregation based on the percentile of values in a dimension or measure.","properties":{"PercentileValue":"The percentile value. This value can be any numeric constant 0–100. A percentile value of 50 computes the median value of the measure."}},"AWS::QuickSight::Analysis.PeriodOverPeriodComputation":{"attributes":{},"description":"The period over period computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","Time":"The time field that is used in a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Analysis.PeriodToDateComputation":{"attributes":{},"description":"The period to date computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","PeriodTimeGranularity":"The time granularity setup of period to date computation. Choose from the following options:\\n\\n- YEAR: Year to date.\\n- MONTH: Month to date.","Time":"The time field that is used in a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Analysis.PieChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a pie chart.","properties":{"Category":"The category (group/color) field wells of a pie chart.","SmallMultiples":"The small multiples field well of a pie chart.","Values":"The value field wells of a pie chart. Values are aggregated based on categories."}},"AWS::QuickSight::Analysis.PieChartConfiguration":{"attributes":{},"description":"The configuration of a pie chart.","properties":{"CategoryLabelOptions":"The label options of the group/color that is displayed in a pie chart.","ContributionAnalysisDefaults":"The contribution analysis (anomaly configuration) setup of the visual.","DataLabels":"The options that determine if visual data labels are displayed.","DonutOptions":"The options that determine the shape of the chart. This option determines whether the chart is a pie chart or a donut chart.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","SmallMultiplesOptions":"The small multiples setup for the visual.","SortConfiguration":"The sort configuration of a pie chart.","Tooltip":"The tooltip display setup of the visual.","ValueLabelOptions":"The label options for the value that is displayed in a pie chart.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Analysis.PieChartFieldWells":{"attributes":{},"description":"The field well configuration of a pie chart.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PieChartAggregatedFieldWells":"The field well configuration of a pie chart."}},"AWS::QuickSight::Analysis.PieChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a pie chart.","properties":{"CategoryItemsLimit":"The limit on the number of categories that are displayed in a pie chart.","CategorySort":"The sort configuration of the category fields.","SmallMultiplesLimitConfiguration":"The limit on the number of small multiples panels that are displayed.","SmallMultiplesSort":"The sort configuration of the small multiples field."}},"AWS::QuickSight::Analysis.PieChartVisual":{"attributes":{},"description":"A pie or donut chart.\\n\\nThe `PieChartVisual` structure describes a visual that is a member of the pie chart family.\\n\\nThe following charts can be described by using this structure:\\n\\n- Pie charts\\n- Donut charts\\n\\nFor more information, see [Using pie charts](https://docs.aws.amazon.com/quicksight/latest/user/pie-chart.html) in the *Amazon QuickSight User Guide* .\\n\\nFor more information, see [Using donut charts](https://docs.aws.amazon.com/quicksight/latest/user/donut-chart.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a pie chart.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.PivotFieldSortOptions":{"attributes":{},"description":"The field sort options for a pivot table sort configuration.","properties":{"FieldId":"The field ID for the field sort options.","SortBy":"The sort by field for the field sort options."}},"AWS::QuickSight::Analysis.PivotTableAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well for the pivot table.","properties":{"Columns":"The columns field well for a pivot table. Values are grouped by columns fields.","Rows":"The rows field well for a pivot table. Values are grouped by rows fields.","Values":"The values field well for a pivot table. Values are aggregated based on rows and columns fields."}},"AWS::QuickSight::Analysis.PivotTableCellConditionalFormatting":{"attributes":{},"description":"The cell conditional formatting option for a pivot table.","properties":{"FieldId":"The field ID of the cell for conditional formatting.","Scope":"The scope of the cell for conditional formatting.","Scopes":"A list of cell scopes for conditional formatting.","TextFormat":"The text format of the cell for conditional formatting."}},"AWS::QuickSight::Analysis.PivotTableConditionalFormatting":{"attributes":{},"description":"The conditional formatting for a `PivotTableVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options for a `PivotTableVisual` ."}},"AWS::QuickSight::Analysis.PivotTableConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options for a `PivotTableVisual` .","properties":{"Cell":"The cell conditional formatting option for a pivot table."}},"AWS::QuickSight::Analysis.PivotTableConditionalFormattingScope":{"attributes":{},"description":"The scope of the cell for conditional formatting.","properties":{"Role":"The role (field, field total, grand total) of the cell for conditional formatting."}},"AWS::QuickSight::Analysis.PivotTableConfiguration":{"attributes":{},"description":"The configuration for a `PivotTableVisual` .","properties":{"FieldOptions":"The field options for a pivot table visual.","FieldWells":"The field wells of the visual.","PaginatedReportOptions":"The paginated report options for a pivot table visual.","SortConfiguration":"The sort configuration for a `PivotTableVisual` .","TableOptions":"The table options for a pivot table visual.","TotalOptions":"The total options for a pivot table visual."}},"AWS::QuickSight::Analysis.PivotTableDataPathOption":{"attributes":{},"description":"The data path options for the pivot table field options.","properties":{"DataPathList":"The list of data path values for the data path options.","Width":"The width of the data path option."}},"AWS::QuickSight::Analysis.PivotTableFieldCollapseStateOption":{"attributes":{},"description":"The collapse state options for the pivot table field options.","properties":{"State":"The state of the field target of a pivot table. Choose one of the following options:\\n\\n- `COLLAPSED`\\n- `EXPANDED`","Target":"A tagged-union object that sets the collapse state."}},"AWS::QuickSight::Analysis.PivotTableFieldCollapseStateTarget":{"attributes":{},"description":"The target of a pivot table field collapse state.","properties":{"FieldDataPathValues":"The data path of the pivot table\'s header. Used to set the collapse state.","FieldId":"The field ID of the pivot table that the collapse state needs to be set to."}},"AWS::QuickSight::Analysis.PivotTableFieldOption":{"attributes":{},"description":"The selected field options for the pivot table field options.","properties":{"CustomLabel":"The custom label of the pivot table field.","FieldId":"The field ID of the pivot table field.","Visibility":"The visibility of the pivot table field."}},"AWS::QuickSight::Analysis.PivotTableFieldOptions":{"attributes":{},"description":"The field options for a pivot table visual.","properties":{"CollapseStateOptions":"The collapse state options for the pivot table field options.","DataPathOptions":"The data path options for the pivot table field options.","SelectedFieldOptions":"The selected field options for the pivot table field options."}},"AWS::QuickSight::Analysis.PivotTableFieldSubtotalOptions":{"attributes":{},"description":"The optional configuration of subtotals cells.","properties":{"FieldId":"The field ID of the subtotal options."}},"AWS::QuickSight::Analysis.PivotTableFieldWells":{"attributes":{},"description":"The field wells for a pivot table visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PivotTableAggregatedFieldWells":"The aggregated field well for the pivot table."}},"AWS::QuickSight::Analysis.PivotTableOptions":{"attributes":{},"description":"The table options for a pivot table visual.","properties":{"CellStyle":"The table cell style of cells.","CollapsedRowDimensionsVisibility":"The visibility setting of a pivot table\'s collapsed row dimension fields. If the value of this structure is `HIDDEN` , all collapsed columns in a pivot table are automatically hidden. The default value is `VISIBLE` .","ColumnHeaderStyle":"The table cell style of the column header.","ColumnNamesVisibility":"The visibility of the column names.","MetricPlacement":"The metric placement (row, column) options.","RowAlternateColorOptions":"The row alternate color options (widget status, row alternate colors).","RowFieldNamesStyle":"The table cell style of row field names.","RowHeaderStyle":"The table cell style of the row headers.","SingleMetricVisibility":"The visibility of the single metric options.","ToggleButtonsVisibility":"Determines the visibility of the pivot table."}},"AWS::QuickSight::Analysis.PivotTablePaginatedReportOptions":{"attributes":{},"description":"The paginated report options for a pivot table visual.","properties":{"OverflowColumnHeaderVisibility":"The visibility of the repeating header rows on each page.","VerticalOverflowVisibility":"The visibility of the printing table overflow across pages."}},"AWS::QuickSight::Analysis.PivotTableSortBy":{"attributes":{},"description":"The sort by field for the field sort options.","properties":{"Column":"The column sort (field id, direction) for the pivot table sort by options.","DataPath":"The data path sort (data path value, direction) for the pivot table sort by options.","Field":"The field sort (field id, direction) for the pivot table sort by options."}},"AWS::QuickSight::Analysis.PivotTableSortConfiguration":{"attributes":{},"description":"The sort configuration for a `PivotTableVisual` .","properties":{"FieldSortOptions":"The field sort options for a pivot table sort configuration."}},"AWS::QuickSight::Analysis.PivotTableTotalOptions":{"attributes":{},"description":"The total options for a pivot table visual.","properties":{"ColumnSubtotalOptions":"The column subtotal options.","ColumnTotalOptions":"The column total options.","RowSubtotalOptions":"The row subtotal options.","RowTotalOptions":"The row total options."}},"AWS::QuickSight::Analysis.PivotTableVisual":{"attributes":{},"description":"A pivot table.\\n\\nFor more information, see [Using pivot tables](https://docs.aws.amazon.com/quicksight/latest/user/pivot-table.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ConditionalFormatting":"The conditional formatting for a `PivotTableVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Analysis.PivotTotalOptions":{"attributes":{},"description":"The optional configuration of totals cells in a `PivotTableVisual` .","properties":{"CustomLabel":"The custom label string for the total cells.","MetricHeaderCellStyle":"The cell styling options for the total of header cells.","Placement":"The placement (start, end) for the total cells.","ScrollStatus":"The scroll status (pinned, scrolled) for the total cells.","TotalCellStyle":"The cell styling options for the total cells.","TotalsVisibility":"The visibility configuration for the total cells.","ValueCellStyle":"The cell styling options for the totals of value cells."}},"AWS::QuickSight::Analysis.PredefinedHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of the fields that are defined during data preparation. These fields are available to use in any analysis that uses the data source.","properties":{"Columns":"The list of columns that define the predefined hierarchy.","DrillDownFilters":"The option that determines the drill down filters for the predefined hierarchy.","HierarchyId":"The hierarchy ID of the predefined hierarchy."}},"AWS::QuickSight::Analysis.ProgressBarOptions":{"attributes":{},"description":"The options that determine the presentation of the progress bar of a KPI visual.","properties":{"Visibility":"The visibility of the progress bar."}},"AWS::QuickSight::Analysis.RadarChartAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well configuration of a `RadarChartVisual` .","properties":{"Category":"The aggregated field well categories of a radar chart.","Color":"The color that are assigned to the aggregated field wells of a radar chart.","Values":"The values that are assigned to the aggregated field wells of a radar chart."}},"AWS::QuickSight::Analysis.RadarChartAreaStyleSettings":{"attributes":{},"description":"The configured style settings of a radar chart.","properties":{"Visibility":"The visibility settings of a radar chart."}},"AWS::QuickSight::Analysis.RadarChartConfiguration":{"attributes":{},"description":"The configuration of a `RadarChartVisual` .","properties":{"AlternateBandColorsVisibility":"Determines the visibility of the colors of alternatign bands in a radar chart.","AlternateBandEvenColor":"The color of the even-numbered alternate bands of a radar chart.","AlternateBandOddColor":"The color of the odd-numbered alternate bands of a radar chart.","AxesRangeScale":"The axis behavior options of a radar chart.","BaseSeriesSettings":"The base sreies settings of a radar chart.","CategoryAxis":"The category axis of a radar chart.","CategoryLabelOptions":"The category label options of a radar chart.","ColorAxis":"The color axis of a radar chart.","ColorLabelOptions":"The color label options of a radar chart.","FieldWells":"The field well configuration of a `RadarChartVisual` .","Legend":"The legend display setup of the visual.","Shape":"The shape of the radar chart.","SortConfiguration":"The sort configuration of a `RadarChartVisual` .","StartAngle":"The start angle of a radar chart\'s axis.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Analysis.RadarChartFieldWells":{"attributes":{},"description":"The field wells of a radar chart visual.","properties":{"RadarChartAggregatedFieldWells":"The aggregated field wells of a radar chart visual."}},"AWS::QuickSight::Analysis.RadarChartSeriesSettings":{"attributes":{},"description":"The series settings of a radar chart.","properties":{"AreaStyleSettings":"The area style settings of a radar chart."}},"AWS::QuickSight::Analysis.RadarChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a `RadarChartVisual` .","properties":{"CategoryItemsLimit":"The category items limit for a radar chart.","CategorySort":"The category sort options of a radar chart.","ColorItemsLimit":"The color items limit of a radar chart.","ColorSort":"The color sort configuration of a radar chart."}},"AWS::QuickSight::Analysis.RadarChartVisual":{"attributes":{},"description":"A radar chart visual.","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.RangeEndsLabelType":{"attributes":{},"description":"The range ends label type of a data path label.","properties":{"Visibility":"The visibility of the range ends label."}},"AWS::QuickSight::Analysis.ReferenceLine":{"attributes":{},"description":"The reference line visual display options.","properties":{"DataConfiguration":"The data configuration of the reference line.","LabelConfiguration":"The label configuration of the reference line.","Status":"The status of the reference line. Choose one of the following options:\\n\\n- `ENABLE`\\n- `DISABLE`","StyleConfiguration":"The style configuration of the reference line."}},"AWS::QuickSight::Analysis.ReferenceLineCustomLabelConfiguration":{"attributes":{},"description":"The configuration for a custom label on a `ReferenceLine` .","properties":{"CustomLabel":"The string text of the custom label."}},"AWS::QuickSight::Analysis.ReferenceLineDataConfiguration":{"attributes":{},"description":"The data configuration of the reference line.","properties":{"AxisBinding":"The axis binding type of the reference line. Choose one of the following options:\\n\\n- PrimaryY\\n- SecondaryY","DynamicConfiguration":"The dynamic configuration of the reference line data configuration.","StaticConfiguration":"The static data configuration of the reference line data configuration."}},"AWS::QuickSight::Analysis.ReferenceLineDynamicDataConfiguration":{"attributes":{},"description":"The dynamic configuration of the reference line data configuration.","properties":{"Calculation":"The calculation that is used in the dynamic data.","Column":"The column that the dynamic data targets.","MeasureAggregationFunction":"The aggregation function that is used in the dynamic data."}},"AWS::QuickSight::Analysis.ReferenceLineLabelConfiguration":{"attributes":{},"description":"The label configuration of a reference line.","properties":{"CustomLabelConfiguration":"The custom label configuration of the label in a reference line.","FontColor":"The font color configuration of the label in a reference line.","FontConfiguration":"The font configuration of the label in a reference line.","HorizontalPosition":"The horizontal position configuration of the label in a reference line. Choose one of the following options:\\n\\n- `LEFT`\\n- `CENTER`\\n- `RIGHT`","ValueLabelConfiguration":"The value label configuration of the label in a reference line.","VerticalPosition":"The vertical position configuration of the label in a reference line. Choose one of the following options:\\n\\n- `ABOVE`\\n- `BELOW`"}},"AWS::QuickSight::Analysis.ReferenceLineStaticDataConfiguration":{"attributes":{},"description":"The static data configuration of the reference line data configuration.","properties":{"Value":"The double input of the static data."}},"AWS::QuickSight::Analysis.ReferenceLineStyleConfiguration":{"attributes":{},"description":"The style configuration of the reference line.","properties":{"Color":"The hex color of the reference line.","Pattern":"The pattern type of the line style. Choose one of the following options:\\n\\n- `SOLID`\\n- `DASHED`\\n- `DOTTED`"}},"AWS::QuickSight::Analysis.ReferenceLineValueLabelConfiguration":{"attributes":{},"description":"The value label configuration of the label in a reference line.","properties":{"FormatConfiguration":"The format configuration of the value label.","RelativePosition":"The relative position of the value label. Choose one of the following options:\\n\\n- `BEFORE_CUSTOM_LABEL`\\n- `AFTER_CUSTOM_LABEL`"}},"AWS::QuickSight::Analysis.RelativeDateTimeControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"DateTimeFormat":"Customize how dates are formatted in controls.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Analysis.RelativeDatesFilter":{"attributes":{},"description":"A `RelativeDatesFilter` filters relative dates values.","properties":{"AnchorDateConfiguration":"The date configuration of the filter.","Column":"The column that the filter is applied to.","ExcludePeriodConfiguration":"The configuration for the exclude period of the filter.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","MinimumGranularity":"The minimum granularity (period granularity) of the relative dates filter.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","ParameterName":"The parameter whose value should be used for the filter value.","RelativeDateType":"The range date type of the filter. Choose one of the options below:\\n\\n- `PREVIOUS`\\n- `THIS`\\n- `LAST`\\n- `NOW`\\n- `NEXT`","RelativeDateValue":"The date value of the filter.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Analysis.ResourcePermission":{"attributes":{},"description":"Permission for the resource.","properties":{"Actions":"The IAM action to grant or revoke permissions on.","Principal":"The Amazon Resource Name (ARN) of the principal. This can be one of the following:\\n\\n- The ARN of an Amazon QuickSight user or group associated with a data source or dataset. (This is common.)\\n- The ARN of an Amazon QuickSight user, group, or namespace associated with an analysis, dashboard, template, or theme. (This is common.)\\n- The ARN of an AWS account root: This is an IAM ARN rather than a Amazon QuickSight ARN. Use this option only to share resources (templates) across AWS accounts . (This is less common.)","Resource":""}},"AWS::QuickSight::Analysis.RollingDateConfiguration":{"attributes":{},"description":"The rolling date configuration of a date time filter.","properties":{"DataSetIdentifier":"The data set that is used in the rolling date configuration.","Expression":"The expression of the rolling date configuration."}},"AWS::QuickSight::Analysis.RowAlternateColorOptions":{"attributes":{},"description":"Determines the row alternate color options.","properties":{"RowAlternateColors":"Determines the list of row alternate colors.","Status":"Determines the widget status."}},"AWS::QuickSight::Analysis.SameSheetTargetVisualConfiguration":{"attributes":{},"description":"The configuration of the same-sheet target visuals that you want to be filtered.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"TargetVisualOptions":"The options that choose the target visual in the same sheet.\\n\\nValid values are defined as follows:\\n\\n- `ALL_VISUALS` : Applies the filter operation to all visuals in the same sheet.","TargetVisuals":"A list of the target visual IDs that are located in the same sheet of the analysis."}},"AWS::QuickSight::Analysis.SankeyDiagramAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a sankey diagram.","properties":{"Destination":"The destination field wells of a sankey diagram.","Source":"The source field wells of a sankey diagram.","Weight":"The weight field wells of a sankey diagram."}},"AWS::QuickSight::Analysis.SankeyDiagramChartConfiguration":{"attributes":{},"description":"The configuration of a sankey diagram.","properties":{"DataLabels":"The data label configuration of a sankey diagram.","FieldWells":"The field well configuration of a sankey diagram.","SortConfiguration":"The sort configuration of a sankey diagram."}},"AWS::QuickSight::Analysis.SankeyDiagramFieldWells":{"attributes":{},"description":"The field well configuration of a sankey diagram.","properties":{"SankeyDiagramAggregatedFieldWells":"The field well configuration of a sankey diagram."}},"AWS::QuickSight::Analysis.SankeyDiagramSortConfiguration":{"attributes":{},"description":"The sort configuration of a sankey diagram.","properties":{"DestinationItemsLimit":"The limit on the number of destination nodes that are displayed in a sankey diagram.","SourceItemsLimit":"The limit on the number of source nodes that are displayed in a sankey diagram.","WeightSort":"The sort configuration of the weight fields."}},"AWS::QuickSight::Analysis.SankeyDiagramVisual":{"attributes":{},"description":"A sankey diagram.\\n\\nFor more information, see [Using Sankey diagrams](https://docs.aws.amazon.com/quicksight/latest/user/sankey-diagram.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a sankey diagram.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.ScatterPlotCategoricallyAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well of a scatter plot.","properties":{"Category":"The category field well of a scatter plot.","Label":"The label field well of a scatter plot.","Size":"The size field well of a scatter plot.","XAxis":"The x-axis field well of a scatter plot.\\n\\nThe x-axis is aggregated by category.","YAxis":"The y-axis field well of a scatter plot.\\n\\nThe y-axis is aggregated by category."}},"AWS::QuickSight::Analysis.ScatterPlotConfiguration":{"attributes":{},"description":"The configuration of a scatter plot.","properties":{"DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","Tooltip":"The legend display setup of the visual.","VisualPalette":"The palette (chart color) display setup of the visual.","XAxisDisplayOptions":"The label display options (grid line, range, scale, and axis step) of the scatter plot\'s x-axis.","XAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of the scatter plot\'s x-axis.","YAxisDisplayOptions":"The label display options (grid line, range, scale, and axis step) of the scatter plot\'s y-axis.","YAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of the scatter plot\'s y-axis."}},"AWS::QuickSight::Analysis.ScatterPlotFieldWells":{"attributes":{},"description":"The field well configuration of a scatter plot.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"ScatterPlotCategoricallyAggregatedFieldWells":"The aggregated field wells of a scatter plot. The x and y-axes of scatter plots with aggregated field wells are aggregated by category, label, or both.","ScatterPlotUnaggregatedFieldWells":"The unaggregated field wells of a scatter plot. The x and y-axes of these scatter plots are unaggregated."}},"AWS::QuickSight::Analysis.ScatterPlotUnaggregatedFieldWells":{"attributes":{},"description":"The unaggregated field wells of a scatter plot.","properties":{"Category":"The category field well of a scatter plot.","Label":"The label field well of a scatter plot.","Size":"The size field well of a scatter plot.","XAxis":"The x-axis field well of a scatter plot.\\n\\nThe x-axis is a dimension field and cannot be aggregated.","YAxis":"The y-axis field well of a scatter plot.\\n\\nThe y-axis is a dimension field and cannot be aggregated."}},"AWS::QuickSight::Analysis.ScatterPlotVisual":{"attributes":{},"description":"A scatter plot.\\n\\nFor more information, see [Using scatter plots](https://docs.aws.amazon.com/quicksight/latest/user/scatter-plot.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.ScrollBarOptions":{"attributes":{},"description":"The visual display options for a data zoom scroll bar.","properties":{"Visibility":"The visibility of the data zoom scroll bar.","VisibleRange":"The visibility range for the data zoom scroll bar."}},"AWS::QuickSight::Analysis.SecondaryValueOptions":{"attributes":{},"description":"The options that determine the presentation of the secondary value of a KPI visual.","properties":{"Visibility":"Determines the visibility of the secondary value."}},"AWS::QuickSight::Analysis.SectionAfterPageBreak":{"attributes":{},"description":"The configuration of a page break after a section.","properties":{"Status":"The option that enables or disables a page break at the end of a section."}},"AWS::QuickSight::Analysis.SectionBasedLayoutCanvasSizeOptions":{"attributes":{},"description":"The options for the canvas of a section-based layout.","properties":{"PaperCanvasSizeOptions":"The options for a paper canvas of a section-based layout."}},"AWS::QuickSight::Analysis.SectionBasedLayoutConfiguration":{"attributes":{},"description":"The configuration for a section-based layout.","properties":{"BodySections":"A list of body section configurations.","CanvasSizeOptions":"The options for the canvas of a section-based layout.","FooterSections":"A list of footer section configurations.","HeaderSections":"A list of header section configurations."}},"AWS::QuickSight::Analysis.SectionBasedLayoutPaperCanvasSizeOptions":{"attributes":{},"description":"The options for a paper canvas of a section-based layout.","properties":{"PaperMargin":"Defines the spacing between the canvas content and the top, bottom, left, and right edges.","PaperOrientation":"The paper orientation that is used to define canvas dimensions. Choose one of the following options:\\n\\n- PORTRAIT\\n- LANDSCAPE","PaperSize":"The paper size that is used to define canvas dimensions."}},"AWS::QuickSight::Analysis.SectionLayoutConfiguration":{"attributes":{},"description":"The layout configuration of a section.","properties":{"FreeFormLayout":"The free-form layout configuration of a section."}},"AWS::QuickSight::Analysis.SectionPageBreakConfiguration":{"attributes":{},"description":"The configuration of a page break for a section.","properties":{"After":"The configuration of a page break after a section."}},"AWS::QuickSight::Analysis.SectionStyle":{"attributes":{},"description":"The options that style a section.","properties":{"Height":"The height of a section.\\n\\nHeights can only be defined for header and footer sections. The default height margin is 0.5 inches.","Padding":"The spacing between section content and its top, bottom, left, and right edges.\\n\\nThere is no padding by default."}},"AWS::QuickSight::Analysis.SelectedSheetsFilterScopeConfiguration":{"attributes":{},"description":"The configuration for applying a filter to specific sheets or visuals. You can apply this filter to multiple visuals that are on one sheet or to all visuals on a sheet.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SheetVisualScopingConfigurations":"The sheet ID and visual IDs of the sheet and visuals that the filter is applied to."}},"AWS::QuickSight::Analysis.SeriesItem":{"attributes":{},"description":"The series item configuration of a line chart.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DataFieldSeriesItem":"The data field series item configuration of a line chart.","FieldSeriesItem":"The field series item configuration of a line chart."}},"AWS::QuickSight::Analysis.SetParameterValueConfiguration":{"attributes":{},"description":"The configuration of adding parameters in action.","properties":{"DestinationParameterName":"The destination parameter name of the `SetParameterValueConfiguration` .","Value":""}},"AWS::QuickSight::Analysis.ShapeConditionalFormat":{"attributes":{},"description":"The shape conditional formatting of a filled map visual.","properties":{"BackgroundColor":"The conditional formatting for the shape background color of a filled map visual."}},"AWS::QuickSight::Analysis.Sheet":{"attributes":{},"description":"A *sheet* , which is an object that contains a set of visuals that are viewed together on one page in Amazon QuickSight. Every analysis and dashboard contains at least one sheet. Each sheet contains at least one visualization widget, for example a chart, pivot table, or narrative insight. Sheets can be associated with other components, such as controls, filters, and so on.","properties":{"Name":"The name of a sheet. This name is displayed on the sheet\'s tab in the Amazon QuickSight console.","SheetId":"The unique identifier associated with a sheet."}},"AWS::QuickSight::Analysis.SheetControlLayout":{"attributes":{},"description":"A grid layout to define the placement of sheet control.","properties":{"Configuration":"The configuration that determines the elements and canvas size options of sheet control."}},"AWS::QuickSight::Analysis.SheetControlLayoutConfiguration":{"attributes":{},"description":"The configuration that determines the elements and canvas size options of sheet control.","properties":{"GridLayout":"The configuration that determines the elements and canvas size options of sheet control."}},"AWS::QuickSight::Analysis.SheetDefinition":{"attributes":{},"description":"A sheet is an object that contains a set of visuals that are viewed together on one page in a paginated report. Every analysis and dashboard must contain at least one sheet.","properties":{"ContentType":"The layout content type of the sheet. Choose one of the following options:\\n\\n- `PAGINATED` : Creates a sheet for a paginated report.\\n- `INTERACTIVE` : Creates a sheet for an interactive dashboard.","Description":"A description of the sheet.","FilterControls":"The list of filter controls that are on a sheet.\\n\\nFor more information, see [Adding filter controls to analysis sheets](https://docs.aws.amazon.com/quicksight/latest/user/filter-controls.html) in the *Amazon QuickSight User Guide* .","Layouts":"Layouts define how the components of a sheet are arranged.\\n\\nFor more information, see [Types of layout](https://docs.aws.amazon.com/quicksight/latest/user/types-of-layout.html) in the *Amazon QuickSight User Guide* .","Name":"The name of the sheet. This name is displayed on the sheet\'s tab in the Amazon QuickSight console.","ParameterControls":"The list of parameter controls that are on a sheet.\\n\\nFor more information, see [Using a Control with a Parameter in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/parameters-controls.html) in the *Amazon QuickSight User Guide* .","SheetControlLayouts":"The control layouts of the sheet.","SheetId":"The unique identifier of a sheet.","TextBoxes":"The text boxes that are on a sheet.","Title":"The title of the sheet.","Visuals":"A list of the visuals that are on a sheet. Visual placement is determined by the layout of the sheet."}},"AWS::QuickSight::Analysis.SheetElementConfigurationOverrides":{"attributes":{},"description":"The override configuration of the rendering rules of a sheet.","properties":{"Visibility":"Determines whether or not the overrides are visible. Choose one of the following options:\\n\\n- `VISIBLE`\\n- `HIDDEN`"}},"AWS::QuickSight::Analysis.SheetElementRenderingRule":{"attributes":{},"description":"The rendering rules of a sheet that uses a free-form layout.","properties":{"ConfigurationOverrides":"The override configuration of the rendering rules of a sheet.","Expression":"The expression of the rendering rules of a sheet."}},"AWS::QuickSight::Analysis.SheetTextBox":{"attributes":{},"description":"A text box.","properties":{"Content":"The content that is displayed in the text box.","SheetTextBoxId":"The unique identifier for a text box. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have text boxes that share identifiers."}},"AWS::QuickSight::Analysis.SheetVisualScopingConfiguration":{"attributes":{},"description":"The filter that is applied to the options.","properties":{"Scope":"The scope of the applied entities. Choose one of the following options:\\n\\n- `ALL_VISUALS`\\n- `SELECTED_VISUALS`","SheetId":"The selected sheet that the filter is applied to.","VisualIds":"The selected visuals that the filter is applied to."}},"AWS::QuickSight::Analysis.ShortFormatText":{"attributes":{},"description":"The text format for the title.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PlainText":"Plain text format.","RichText":"Rich text. Examples of rich text include bold, underline, and italics."}},"AWS::QuickSight::Analysis.SimpleClusterMarker":{"attributes":{},"description":"The simple cluster marker of the cluster marker.","properties":{"Color":"The color of the simple cluster marker."}},"AWS::QuickSight::Analysis.SliderControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Analysis.SmallMultiplesOptions":{"attributes":{},"description":"Options that determine the layout and display options of a chart\'s small multiples.","properties":{"MaxVisibleColumns":"Sets the maximum number of visible columns to display in the grid of small multiples panels.\\n\\nThe default is `Auto` , which automatically adjusts the columns in the grid to fit the overall layout and size of the given chart.","MaxVisibleRows":"Sets the maximum number of visible rows to display in the grid of small multiples panels.\\n\\nThe default value is `Auto` , which automatically adjusts the rows in the grid to fit the overall layout and size of the given chart.","PanelConfiguration":"Configures the display options for each small multiples panel."}},"AWS::QuickSight::Analysis.Spacing":{"attributes":{},"description":"The configuration of spacing (often a margin or padding).","properties":{"Bottom":"Define the bottom spacing.","Left":"Define the left spacing.","Right":"Define the right spacing.","Top":"Define the top spacing."}},"AWS::QuickSight::Analysis.StringDefaultValues":{"attributes":{},"description":"The default values of the `StringParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `StringDefaultValues` . Different defaults displayed according to users, groups, and values mapping.","StaticValues":"The static values of the `DecimalDefaultValues` ."}},"AWS::QuickSight::Analysis.StringFormatConfiguration":{"attributes":{},"description":"Formatting configuration for string fields.","properties":{"NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumericFormatConfiguration":"The formatting configuration for numeric strings."}},"AWS::QuickSight::Analysis.StringParameter":{"attributes":{},"description":"A string parameter.","properties":{"Name":"A display name for a string parameter.","Values":"The values of a string parameter."}},"AWS::QuickSight::Analysis.StringParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `String` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","ParameterValueType":"The value type determines whether the parameter is a single-value or multi-value parameter.","ValueWhenUnset":"The configuration that defines the default value of a `String` parameter when a value has not been set."}},"AWS::QuickSight::Analysis.StringValueWhenUnsetConfiguration":{"attributes":{},"description":"The configuration that defines the default value of a `String` parameter when a value has not been set.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Analysis.SubtotalOptions":{"attributes":{},"description":"The subtotal options.","properties":{"CustomLabel":"The custom label string for the subtotal cells.","FieldLevel":"The field level (all, custom, last) for the subtotal cells.","FieldLevelOptions":"The optional configuration of subtotal cells.","MetricHeaderCellStyle":"The cell styling options for the subtotals of header cells.","TotalCellStyle":"The cell styling options for the subtotal cells.","TotalsVisibility":"The visibility configuration for the subtotal cells.","ValueCellStyle":"The cell styling options for the subtotals of value cells."}},"AWS::QuickSight::Analysis.TableAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well for the table.","properties":{"GroupBy":"The group by field well for a pivot table. Values are grouped by group by fields.","Values":"The values field well for a pivot table. Values are aggregated based on group by fields."}},"AWS::QuickSight::Analysis.TableBorderOptions":{"attributes":{},"description":"The border options for a table border.","properties":{"Color":"The color of a table border.","Style":"The style (none, solid) of a table border.","Thickness":"The thickness of a table border."}},"AWS::QuickSight::Analysis.TableCellConditionalFormatting":{"attributes":{},"description":"The cell conditional formatting option for a table.","properties":{"FieldId":"The field ID of the cell for conditional formatting.","TextFormat":"The text format of the cell for conditional formatting."}},"AWS::QuickSight::Analysis.TableCellImageSizingConfiguration":{"attributes":{},"description":"The sizing options for the table image configuration.","properties":{"TableCellImageScalingConfiguration":"The cell scaling configuration of the sizing options for the table image configuration."}},"AWS::QuickSight::Analysis.TableCellStyle":{"attributes":{},"description":"The table cell style for a cell in pivot table or table visual.","properties":{"BackgroundColor":"The background color for the table cells.","Border":"The borders for the table cells.","FontConfiguration":"The font configuration of the table cells.","Height":"The height color for the table cells.","HorizontalTextAlignment":"The horizontal text alignment (left, center, right, auto) for the table cells.","TextWrap":"The text wrap (none, wrap) for the table cells.","VerticalTextAlignment":"The vertical text alignment (top, middle, bottom) for the table cells.","Visibility":"The visibility of the table cells."}},"AWS::QuickSight::Analysis.TableConditionalFormatting":{"attributes":{},"description":"The conditional formatting for a `PivotTableVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options for a `PivotTableVisual` ."}},"AWS::QuickSight::Analysis.TableConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options for a `PivotTableVisual` .","properties":{"Cell":"The cell conditional formatting option for a table.","Row":"The row conditional formatting option for a table."}},"AWS::QuickSight::Analysis.TableConfiguration":{"attributes":{},"description":"The configuration for a `TableVisual` .","properties":{"FieldOptions":"The field options for a table visual.","FieldWells":"The field wells of the visual.","PaginatedReportOptions":"The paginated report options for a table visual.","SortConfiguration":"The sort configuration for a `TableVisual` .","TableInlineVisualizations":"A collection of inline visualizations to display within a chart.","TableOptions":"The table options for a table visual.","TotalOptions":"The total options for a table visual."}},"AWS::QuickSight::Analysis.TableFieldCustomIconContent":{"attributes":{},"description":"The custom icon content for the table link content configuration.","properties":{"Icon":"The icon set type (link) of the custom icon content for table URL link content."}},"AWS::QuickSight::Analysis.TableFieldCustomTextContent":{"attributes":{},"description":"The custom text content (value, font configuration) for the table link content configuration.","properties":{"FontConfiguration":"The font configuration of the custom text content for the table URL link content.","Value":"The string value of the custom text content for the table URL link content."}},"AWS::QuickSight::Analysis.TableFieldImageConfiguration":{"attributes":{},"description":"The image configuration of a table field URL.","properties":{"SizingOptions":"The sizing options for the table image configuration."}},"AWS::QuickSight::Analysis.TableFieldLinkConfiguration":{"attributes":{},"description":"The link configuration of a table field URL.","properties":{"Content":"The URL content (text, icon) for the table link configuration.","Target":"The URL target (new tab, new window, same tab) for the table link configuration."}},"AWS::QuickSight::Analysis.TableFieldLinkContentConfiguration":{"attributes":{},"description":"The URL content (text, icon) for the table link configuration.","properties":{"CustomIconContent":"The custom icon content for the table link content configuration.","CustomTextContent":"The custom text content (value, font configuration) for the table link content configuration."}},"AWS::QuickSight::Analysis.TableFieldOption":{"attributes":{},"description":"The options for a table field.","properties":{"CustomLabel":"The custom label for a table field.","FieldId":"The field ID for a table field.","URLStyling":"The URL configuration for a table field.","Visibility":"The visibility of a table field.","Width":"The width for a table field."}},"AWS::QuickSight::Analysis.TableFieldOptions":{"attributes":{},"description":"The field options for a table visual.","properties":{"Order":"The order of field IDs of the field options for a table visual.","SelectedFieldOptions":"The selected field options for the table field options."}},"AWS::QuickSight::Analysis.TableFieldURLConfiguration":{"attributes":{},"description":"The URL configuration for a table field.","properties":{"ImageConfiguration":"The image configuration of a table field URL.","LinkConfiguration":"The link configuration of a table field URL."}},"AWS::QuickSight::Analysis.TableFieldWells":{"attributes":{},"description":"The field wells for a table visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"TableAggregatedFieldWells":"The aggregated field well for the table.","TableUnaggregatedFieldWells":"The unaggregated field well for the table."}},"AWS::QuickSight::Analysis.TableInlineVisualization":{"attributes":{},"description":"The inline visualization of a specific type to display within a chart.","properties":{"DataBars":"The configuration of the inline visualization of the data bars within a chart."}},"AWS::QuickSight::Analysis.TableOptions":{"attributes":{},"description":"The table options for a table visual.","properties":{"CellStyle":"The table cell style of table cells.","HeaderStyle":"The table cell style of a table header.","Orientation":"The orientation (vertical, horizontal) for a table.","RowAlternateColorOptions":"The row alternate color options (widget status, row alternate colors) for a table."}},"AWS::QuickSight::Analysis.TablePaginatedReportOptions":{"attributes":{},"description":"The paginated report options for a table visual.","properties":{"OverflowColumnHeaderVisibility":"The visibility of repeating header rows on each page.","VerticalOverflowVisibility":"The visibility of printing table overflow across pages."}},"AWS::QuickSight::Analysis.TableRowConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a table row.","properties":{"BackgroundColor":"The conditional formatting color (solid, gradient) of the background for a table row.","TextColor":"The conditional formatting color (solid, gradient) of the text for a table row."}},"AWS::QuickSight::Analysis.TableSideBorderOptions":{"attributes":{},"description":"The side border options for a table.","properties":{"Bottom":"The table border options of the bottom border.","InnerHorizontal":"The table border options of the inner horizontal border.","InnerVertical":"The table border options of the inner vertical border.","Left":"The table border options of the left border.","Right":"The table border options of the right border.","Top":"The table border options of the top border."}},"AWS::QuickSight::Analysis.TableSortConfiguration":{"attributes":{},"description":"The sort configuration for a `TableVisual` .","properties":{"PaginationConfiguration":"The pagination configuration (page size, page number) for the table.","RowSort":"The field sort options for rows in the table."}},"AWS::QuickSight::Analysis.TableUnaggregatedFieldWells":{"attributes":{},"description":"The unaggregated field well for the table.","properties":{"Values":"The values field well for a pivot table. Values are unaggregated for an unaggregated table."}},"AWS::QuickSight::Analysis.TableVisual":{"attributes":{},"description":"A table visual.\\n\\nFor more information, see [Using tables as visuals](https://docs.aws.amazon.com/quicksight/latest/user/tabular.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ConditionalFormatting":"The conditional formatting for a `PivotTableVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Analysis.TextAreaControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"PlaceholderOptions":"The configuration of the placeholder options in a text area control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Analysis.TextConditionalFormat":{"attributes":{},"description":"The conditional formatting for the text.","properties":{"BackgroundColor":"The conditional formatting for the text background color.","Icon":"The conditional formatting for the icon.","TextColor":"The conditional formatting for the text color."}},"AWS::QuickSight::Analysis.TextControlPlaceholderOptions":{"attributes":{},"description":"The configuration of the placeholder options in a text control.","properties":{"Visibility":"The visibility configuration of the placeholder options in a text control."}},"AWS::QuickSight::Analysis.TextFieldControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"PlaceholderOptions":"The configuration of the placeholder options in a text field control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Analysis.ThousandSeparatorOptions":{"attributes":{},"description":"The options that determine the thousands separator configuration.","properties":{"Symbol":"Determines the thousands separator symbol.","Visibility":"Determines the visibility of the thousands separator."}},"AWS::QuickSight::Analysis.TimeBasedForecastProperties":{"attributes":{},"description":"The forecast properties setup of a forecast in the line chart.","properties":{"LowerBoundary":"The lower boundary setup of a forecast computation.","PeriodsBackward":"The periods backward setup of a forecast computation.","PeriodsForward":"The periods forward setup of a forecast computation.","PredictionInterval":"The prediction interval setup of a forecast computation.","Seasonality":"The seasonality setup of a forecast computation. Choose one of the following options:\\n\\n- `NULL` : The input is set to `NULL` .\\n- `NON_NULL` : The input is set to a custom value.","UpperBoundary":"The upper boundary setup of a forecast computation."}},"AWS::QuickSight::Analysis.TimeEqualityFilter":{"attributes":{},"description":"A `TimeEqualityFilter` filters values that are equal to a given value.","properties":{"Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","ParameterName":"The parameter whose value should be used for the filter value.\\n\\nThis field is mutually exclusive to `Value` .","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values.","Value":"The value of a `TimeEquality` filter.\\n\\nThis field is mutually exclusive to `ParameterName` ."}},"AWS::QuickSight::Analysis.TimeRangeDrillDownFilter":{"attributes":{},"description":"The time range drill down filter.","properties":{"Column":"The column that the filter is applied to.","RangeMaximum":"The maximum value for the filter value range.","RangeMinimum":"The minimum value for the filter value range.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Analysis.TimeRangeFilter":{"attributes":{},"description":"A `TimeRangeFilter` filters values that are between two specified values.","properties":{"Column":"The column that the filter is applied to.","ExcludePeriodConfiguration":"The exclude period of the time range filter.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","IncludeMaximum":"Determines whether the maximum value in the filter value range should be included in the filtered results.","IncludeMinimum":"Determines whether the minimum value in the filter value range should be included in the filtered results.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","RangeMaximumValue":"The maximum value for the filter value range.","RangeMinimumValue":"The minimum value for the filter value range.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Analysis.TimeRangeFilterValue":{"attributes":{},"description":"The value of a time range filter.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Parameter":"The parameter type input value.","RollingDate":"The rolling date input value.","StaticValue":"The static input value."}},"AWS::QuickSight::Analysis.TooltipItem":{"attributes":{},"description":"The tooltip.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"ColumnTooltipItem":"The tooltip item for the columns that are not part of a field well.","FieldTooltipItem":"The tooltip item for the fields."}},"AWS::QuickSight::Analysis.TooltipOptions":{"attributes":{},"description":"The display options for the visual tooltip.","properties":{"FieldBasedTooltip":"The setup for the detailed tooltip. The tooltip setup is always saved. The display type is decided based on the tooltip type.","SelectedTooltipType":"The selected type for the tooltip. Choose one of the following options:\\n\\n- `BASIC` : A basic tooltip.\\n- `DETAILED` : A detailed tooltip.","TooltipVisibility":"Determines whether or not the tooltip is visible."}},"AWS::QuickSight::Analysis.TopBottomFilter":{"attributes":{},"description":"A `TopBottomFilter` filters values that are at the top or the bottom.","properties":{"AggregationSortConfigurations":"The aggregation and sort configuration of the top bottom filter.","Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","Limit":"The number of items to include in the top bottom filter results.","ParameterName":"The parameter whose value should be used for the filter value.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Analysis.TopBottomMoversComputation":{"attributes":{},"description":"The top movers and bottom movers computation setup.","properties":{"Category":"The category field that is used in a computation.","ComputationId":"The ID for a computation.","MoverSize":"The mover size setup of the top and bottom movers computation.","Name":"The name of a computation.","SortOrder":"The sort order setup of the top and bottom movers computation.","Time":"The time field that is used in a computation.","Type":"The computation type. Choose from the following options:\\n\\n- TOP: Top movers computation.\\n- BOTTOM: Bottom movers computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Analysis.TopBottomRankedComputation":{"attributes":{},"description":"The top ranked and bottom ranked computation configuration.","properties":{"Category":"The category field that is used in a computation.","ComputationId":"The ID for a computation.","Name":"The name of a computation.","ResultSize":"The result size of a top and bottom ranked computation.","Type":"The computation type. Choose one of the following options:\\n\\n- TOP: A top ranked computation.\\n- BOTTOM: A bottom ranked computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Analysis.TotalAggregationComputation":{"attributes":{},"description":"The total aggregation computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Analysis.TotalOptions":{"attributes":{},"description":"The total options for a table visual.","properties":{"CustomLabel":"The custom label string for the total cells.","Placement":"The placement (start, end) for the total cells.","ScrollStatus":"The scroll status (pinned, scrolled) for the total cells.","TotalCellStyle":"Cell styling options for the total cells.","TotalsVisibility":"The visibility configuration for the total cells."}},"AWS::QuickSight::Analysis.TreeMapAggregatedFieldWells":{"attributes":{},"description":"Aggregated field wells of a tree map.","properties":{"Colors":"The color field well of a tree map. Values are grouped by aggregations based on group by fields.","Groups":"The group by field well of a tree map. Values are grouped based on group by fields.","Sizes":"The size field well of a tree map. Values are aggregated based on group by fields."}},"AWS::QuickSight::Analysis.TreeMapConfiguration":{"attributes":{},"description":"The configuration of a tree map.","properties":{"ColorLabelOptions":"The label options (label text, label visibility) for the colors displayed in a tree map.","ColorScale":"The color options (gradient color, point of divergence) of a tree map.","DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","GroupLabelOptions":"The label options (label text, label visibility) of the groups that are displayed in a tree map.","Legend":"The legend display setup of the visual.","SizeLabelOptions":"The label options (label text, label visibility) of the sizes that are displayed in a tree map.","SortConfiguration":"The sort configuration of a tree map.","Tooltip":"The tooltip display setup of the visual."}},"AWS::QuickSight::Analysis.TreeMapFieldWells":{"attributes":{},"description":"The field wells of a tree map.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"TreeMapAggregatedFieldWells":"The aggregated field wells of a tree map."}},"AWS::QuickSight::Analysis.TreeMapSortConfiguration":{"attributes":{},"description":"The sort configuration of a tree map.","properties":{"TreeMapGroupItemsLimitConfiguration":"The limit on the number of groups that are displayed.","TreeMapSort":"The sort configuration of group by fields."}},"AWS::QuickSight::Analysis.TreeMapVisual":{"attributes":{},"description":"A tree map.\\n\\nFor more information, see [Using tree maps](https://docs.aws.amazon.com/quicksight/latest/user/tree-map.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Analysis.TrendArrowOptions":{"attributes":{},"description":"The options that determine the presentation of trend arrows in a KPI visual.","properties":{"Visibility":"The visibility of the trend arrows."}},"AWS::QuickSight::Analysis.UnaggregatedField":{"attributes":{},"description":"The unaggregated field for a table.","properties":{"Column":"The column that is used in the `UnaggregatedField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Analysis.UniqueValuesComputation":{"attributes":{},"description":"The unique values computation configuration.","properties":{"Category":"The category field that is used in a computation.","ComputationId":"The ID for a computation.","Name":"The name of a computation."}},"AWS::QuickSight::Analysis.VisibleRangeOptions":{"attributes":{},"description":"The range options for the data zoom scroll bar.","properties":{"PercentRange":"The percent range in the visible range."}},"AWS::QuickSight::Analysis.Visual":{"attributes":{},"description":"A visual displayed on a sheet in an analysis, dashboard, or template.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"BarChartVisual":"A bar chart.\\n\\nFor more information, see [Using bar charts](https://docs.aws.amazon.com/quicksight/latest/user/bar-charts.html) in the *Amazon QuickSight User Guide* .","BoxPlotVisual":"A box plot.\\n\\nFor more information, see [Using box plots](https://docs.aws.amazon.com/quicksight/latest/user/box-plots.html) in the *Amazon QuickSight User Guide* .","ComboChartVisual":"A combo chart.\\n\\nFor more information, see [Using combo charts](https://docs.aws.amazon.com/quicksight/latest/user/combo-charts.html) in the *Amazon QuickSight User Guide* .","CustomContentVisual":"A visual that contains custom content.\\n\\nFor more information, see [Using custom visual content](https://docs.aws.amazon.com/quicksight/latest/user/custom-visual-content.html) in the *Amazon QuickSight User Guide* .","EmptyVisual":"An empty visual.","FilledMapVisual":"A filled map.\\n\\nFor more information, see [Creating filled maps](https://docs.aws.amazon.com/quicksight/latest/user/filled-maps.html) in the *Amazon QuickSight User Guide* .","FunnelChartVisual":"A funnel chart.\\n\\nFor more information, see [Using funnel charts](https://docs.aws.amazon.com/quicksight/latest/user/funnel-visual-content.html) in the *Amazon QuickSight User Guide* .","GaugeChartVisual":"A gauge chart.\\n\\nFor more information, see [Using gauge charts](https://docs.aws.amazon.com/quicksight/latest/user/gauge-chart.html) in the *Amazon QuickSight User Guide* .","GeospatialMapVisual":"A geospatial map or a points on map visual.\\n\\nFor more information, see [Creating point maps](https://docs.aws.amazon.com/quicksight/latest/user/point-maps.html) in the *Amazon QuickSight User Guide* .","HeatMapVisual":"A heat map.\\n\\nFor more information, see [Using heat maps](https://docs.aws.amazon.com/quicksight/latest/user/heat-map.html) in the *Amazon QuickSight User Guide* .","HistogramVisual":"A histogram.\\n\\nFor more information, see [Using histograms](https://docs.aws.amazon.com/quicksight/latest/user/histogram-charts.html) in the *Amazon QuickSight User Guide* .","InsightVisual":"An insight visual.\\n\\nFor more information, see [Working with insights](https://docs.aws.amazon.com/quicksight/latest/user/computational-insights.html) in the *Amazon QuickSight User Guide* .","KPIVisual":"A key performance indicator (KPI).\\n\\nFor more information, see [Using KPIs](https://docs.aws.amazon.com/quicksight/latest/user/kpi.html) in the *Amazon QuickSight User Guide* .","LineChartVisual":"A line chart.\\n\\nFor more information, see [Using line charts](https://docs.aws.amazon.com/quicksight/latest/user/line-charts.html) in the *Amazon QuickSight User Guide* .","PieChartVisual":"A pie or donut chart.\\n\\nFor more information, see [Using pie charts](https://docs.aws.amazon.com/quicksight/latest/user/pie-chart.html) in the *Amazon QuickSight User Guide* .","PivotTableVisual":"A pivot table.\\n\\nFor more information, see [Using pivot tables](https://docs.aws.amazon.com/quicksight/latest/user/pivot-table.html) in the *Amazon QuickSight User Guide* .","RadarChartVisual":"A radar chart visual.\\n\\nFor more information, see [Using radar charts](https://docs.aws.amazon.com/quicksight/latest/user/radar-chart.html) in the *Amazon QuickSight User Guide* .","SankeyDiagramVisual":"A sankey diagram.\\n\\nFor more information, see [Using Sankey diagrams](https://docs.aws.amazon.com/quicksight/latest/user/sankey-diagram.html) in the *Amazon QuickSight User Guide* .","ScatterPlotVisual":"A scatter plot.\\n\\nFor more information, see [Using scatter plots](https://docs.aws.amazon.com/quicksight/latest/user/scatter-plot.html) in the *Amazon QuickSight User Guide* .","TableVisual":"A table visual.\\n\\nFor more information, see [Using tables as visuals](https://docs.aws.amazon.com/quicksight/latest/user/tabular.html) in the *Amazon QuickSight User Guide* .","TreeMapVisual":"A tree map.\\n\\nFor more information, see [Using tree maps](https://docs.aws.amazon.com/quicksight/latest/user/tree-map.html) in the *Amazon QuickSight User Guide* .","WaterfallVisual":"A waterfall chart.\\n\\nFor more information, see [Using waterfall charts](https://docs.aws.amazon.com/quicksight/latest/user/waterfall-chart.html) in the *Amazon QuickSight User Guide* .","WordCloudVisual":"A word cloud.\\n\\nFor more information, see [Using word clouds](https://docs.aws.amazon.com/quicksight/latest/user/word-cloud.html) in the *Amazon QuickSight User Guide* ."}},"AWS::QuickSight::Analysis.VisualCustomAction":{"attributes":{},"description":"A custom action defined on a visual.","properties":{"ActionOperations":"A list of `VisualCustomActionOperations` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","CustomActionId":"The ID of the `VisualCustomAction` .","Name":"The name of the `VisualCustomAction` .","Status":"The status of the `VisualCustomAction` .","Trigger":"The trigger of the `VisualCustomAction` .\\n\\nValid values are defined as follows:\\n\\n- `DATA_POINT_CLICK` : Initiates a custom action by a left pointer click on a data point.\\n- `DATA_POINT_MENU` : Initiates a custom action by right pointer click from the menu."}},"AWS::QuickSight::Analysis.VisualCustomActionOperation":{"attributes":{},"description":"The operation that is defined by the custom action.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FilterOperation":"The filter operation that filters data included in a visual or in an entire sheet.","NavigationOperation":"The navigation operation that navigates between different sheets in the same analysis.","SetParametersOperation":"The set parameter operation that sets parameters in custom action.","URLOperation":"The URL operation that opens a link to another webpage."}},"AWS::QuickSight::Analysis.VisualPalette":{"attributes":{},"description":"The visual display options for the visual palette.","properties":{"ChartColor":"The chart color options for the visual palette.","ColorMap":"The color map options for the visual palette."}},"AWS::QuickSight::Analysis.VisualSubtitleLabelOptions":{"attributes":{},"description":"The subtitle label options for a visual.","properties":{"FormatText":"The long text format of the subtitle label, such as plain text or rich text.","Visibility":"The visibility of the subtitle label."}},"AWS::QuickSight::Analysis.VisualTitleLabelOptions":{"attributes":{},"description":"The title label options for a visual.","properties":{"FormatText":"The short text format of the title label, such as plain text or rich text.","Visibility":"The visibility of the title label."}},"AWS::QuickSight::Analysis.WaterfallChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a waterfall visual.","properties":{"Breakdowns":"The breakdown field wells of a waterfall visual.","Categories":"The category field wells of a waterfall visual.","Values":"The value field wells of a waterfall visual."}},"AWS::QuickSight::Analysis.WaterfallChartConfiguration":{"attributes":{},"description":"The configuration for a waterfall visual.","properties":{"CategoryAxisDisplayOptions":"The options that determine the presentation of the category axis.","CategoryAxisLabelOptions":"The options that determine the presentation of the category axis label.","DataLabels":"The data label configuration of a waterfall visual.","FieldWells":"The field well configuration of a waterfall visual.","Legend":"The legend configuration of a waterfall visual.","PrimaryYAxisDisplayOptions":"The options that determine the presentation of the y-axis.","PrimaryYAxisLabelOptions":"The options that determine the presentation of the y-axis label.","SortConfiguration":"The sort configuration of a waterfall visual.","VisualPalette":"The visual palette configuration of a waterfall visual.","WaterfallChartOptions":"The options that determine the presentation of a waterfall visual."}},"AWS::QuickSight::Analysis.WaterfallChartFieldWells":{"attributes":{},"description":"The field well configuration of a waterfall visual.","properties":{"WaterfallChartAggregatedFieldWells":"The field well configuration of a waterfall visual."}},"AWS::QuickSight::Analysis.WaterfallChartOptions":{"attributes":{},"description":"The options that determine the presentation of a waterfall visual.","properties":{"TotalBarLabel":"This option determines the total bar label of a waterfall visual."}},"AWS::QuickSight::Analysis.WaterfallChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a waterfall visual.","properties":{"BreakdownItemsLimit":"The limit on the number of bar groups that are displayed.","CategorySort":"The sort configuration of the category fields."}},"AWS::QuickSight::Analysis.WaterfallVisual":{"attributes":{},"description":"A waterfall chart.\\n\\nFor more information, see [Using waterfall charts](https://docs.aws.amazon.com/quicksight/latest/user/waterfall-chart.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration for a waterfall visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Analysis.WhatIfPointScenario":{"attributes":{},"description":"Provides the forecast to meet the target for a particular date.","properties":{"Date":"The date that you need the forecast results for.","Value":"The target value that you want to meet for the provided date."}},"AWS::QuickSight::Analysis.WhatIfRangeScenario":{"attributes":{},"description":"Provides the forecast to meet the target for a particular date range.","properties":{"EndDate":"The end date in the date range that you need the forecast results for.","StartDate":"The start date in the date range that you need the forecast results for.","Value":"The target value that you want to meet for the provided date range."}},"AWS::QuickSight::Analysis.WordCloudAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a word cloud.","properties":{"GroupBy":"The group by field well of a word cloud. Values are grouped by group by fields.","Size":"The size field well of a word cloud. Values are aggregated based on group by fields."}},"AWS::QuickSight::Analysis.WordCloudChartConfiguration":{"attributes":{},"description":"The configuration of a word cloud visual.","properties":{"CategoryLabelOptions":"The label options (label text, label visibility, and sort icon visibility) for the word cloud category.","FieldWells":"The field wells of the visual.","SortConfiguration":"The sort configuration of a word cloud visual.","WordCloudOptions":"The options for a word cloud visual."}},"AWS::QuickSight::Analysis.WordCloudFieldWells":{"attributes":{},"description":"The field wells of a word cloud visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"WordCloudAggregatedFieldWells":"The aggregated field wells of a word cloud."}},"AWS::QuickSight::Analysis.WordCloudOptions":{"attributes":{},"description":"The word cloud options for a word cloud visual.","properties":{"CloudLayout":"The cloud layout options (fluid, normal) of a word cloud.","MaximumStringLength":"The length limit of each word from 1-100.","WordCasing":"The word casing options (lower_case, existing_case) for the words in a word cloud.","WordOrientation":"The word orientation options (horizontal, horizontal_and_vertical) for the words in a word cloud.","WordPadding":"The word padding options (none, small, medium, large) for the words in a word cloud.","WordScaling":"The word scaling options (emphasize, normal) for the words in a word cloud."}},"AWS::QuickSight::Analysis.WordCloudSortConfiguration":{"attributes":{},"description":"The sort configuration of a word cloud visual.","properties":{"CategoryItemsLimit":"The limit on the number of groups that are displayed in a word cloud.","CategorySort":"The sort configuration of group by fields."}},"AWS::QuickSight::Analysis.WordCloudVisual":{"attributes":{},"description":"A word cloud.\\n\\nFor more information, see [Using word clouds](https://docs.aws.amazon.com/quicksight/latest/user/word-cloud.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Dashboard":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the dashboard.","CreatedTime":"The time this dashboard version was created.","LastPublishedTime":"The time that the dashboard was last published.","LastUpdatedTime":"The time that the dashboard was last updated.","Version":"The version of the dashboard.","Version.Arn":"","Version.CreatedTime":"","Version.DataSetArns":"","Version.Description":"","Version.Errors":"","Version.Sheets":"","Version.SourceEntityArn":"","Version.Status":"","Version.ThemeArn":"","Version.VersionNumber":""},"description":"Creates a dashboard from a template. To first create a template, see the `CreateTemplate` API operation.\\n\\nA dashboard is an entity in Amazon QuickSight that identifies Amazon QuickSight reports, created from analyses. You can share Amazon QuickSight dashboards. With the right permissions, you can create scheduled email reports from them. If you have the correct permissions, you can create a dashboard from a template that exists in a different AWS account .","properties":{"AwsAccountId":"The ID of the AWS account where you want to create the dashboard.","DashboardId":"The ID for the dashboard, also added to the IAM policy.","DashboardPublishOptions":"Options for publishing the dashboard when you create it:\\n\\n- `AvailabilityStatus` for `AdHocFilteringOption` - This status can be either `ENABLED` or `DISABLED` . When this is set to `DISABLED` , Amazon QuickSight disables the left filter pane on the published dashboard, which can be used for ad hoc (one-time) filtering. This option is `ENABLED` by default.\\n- `AvailabilityStatus` for `ExportToCSVOption` - This status can be either `ENABLED` or `DISABLED` . The visual option to export data to .CSV format isn\'t enabled when this is set to `DISABLED` . This option is `ENABLED` by default.\\n- `VisibilityState` for `SheetControlsOption` - This visibility state can be either `COLLAPSED` or `EXPANDED` . This option is `COLLAPSED` by default.","Definition":"","Name":"The display name of the dashboard.","Parameters":"The parameters for the creation of the dashboard, which you want to use to override the default settings. A dashboard can have any type of parameters, and some parameters might accept multiple values.","Permissions":"A structure that contains the permissions of the dashboard. You can use this structure for granting permissions by providing a list of IAM action information for each principal ARN.\\n\\nTo specify no permissions, omit the permissions list.","SourceEntity":"The entity that you are using as a source when you create the dashboard. In `SourceEntity` , you specify the type of object that you want to use. You can only create a dashboard from a template, so you use a `SourceTemplate` entity. If you need to create a dashboard from an analysis, first convert the analysis to a template by using the `CreateTemplate` API operation. For `SourceTemplate` , specify the Amazon Resource Name (ARN) of the source template. The `SourceTemplate` ARN can contain any AWS account; and any QuickSight-supported AWS Region .\\n\\nUse the `DataSetReferences` entity within `SourceTemplate` to list the replacement datasets for the placeholders listed in the original. The schema in each dataset must match its placeholder.","Tags":"Contains a map of the key-value pairs for the resource tag or tags assigned to the dashboard.","ThemeArn":"The Amazon Resource Name (ARN) of the theme that is being used for this dashboard. If you add a value for this field, it overrides the value that is used in the source entity. The theme ARN must exist in the same AWS account where you create the dashboard.","VersionDescription":"A description for the first version of the dashboard being created."}},"AWS::QuickSight::Dashboard.AdHocFilteringOption":{"attributes":{},"description":"An ad hoc (one-time) filtering option.","properties":{"AvailabilityStatus":"Availability status."}},"AWS::QuickSight::Dashboard.AggregationFunction":{"attributes":{},"description":"An aggregation function aggregates values from a dimension or measure.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CategoricalAggregationFunction":"Aggregation for categorical values.\\n\\n- `COUNT` : Aggregate by the total number of values, including duplicates.\\n- `DISTINCT_COUNT` : Aggregate by the total number of distinct values.","DateAggregationFunction":"Aggregation for date values.\\n\\n- `COUNT` : Aggregate by the total number of values, including duplicates.\\n- `DISTINCT_COUNT` : Aggregate by the total number of distinct values.\\n- `MIN` : Select the smallest date value.\\n- `MAX` : Select the largest date value.","NumericalAggregationFunction":"Aggregation for numerical values."}},"AWS::QuickSight::Dashboard.AggregationSortConfiguration":{"attributes":{},"description":"The configuration options to sort aggregated values.","properties":{"AggregationFunction":"The function that aggregates the values in `Column` .","Column":"The column that determines the sort order of aggregated values.","SortDirection":"The sort direction of values.\\n\\n- `ASC` : Sort in ascending order.\\n- `DESC` : Sort in descending order."}},"AWS::QuickSight::Dashboard.AnalysisDefaults":{"attributes":{},"description":"The configuration for default analysis settings.","properties":{"DefaultNewSheetConfiguration":"The configuration for default new sheet settings."}},"AWS::QuickSight::Dashboard.AnchorDateConfiguration":{"attributes":{},"description":"The date configuration of the filter.","properties":{"AnchorOption":"The options for the date configuration. Choose one of the options below:\\n\\n- `NOW`","ParameterName":"The name of the parameter that is used for the anchor date configuration."}},"AWS::QuickSight::Dashboard.ArcAxisConfiguration":{"attributes":{},"description":"The arc axis configuration of a `GaugeChartVisual` .","properties":{"Range":"The arc axis range of a `GaugeChartVisual` .","ReserveRange":"The reserved range of the arc axis."}},"AWS::QuickSight::Dashboard.ArcAxisDisplayRange":{"attributes":{},"description":"The arc axis range of a `GaugeChartVisual` .","properties":{"Max":"The maximum value of the arc axis range.","Min":"The minimum value of the arc axis range."}},"AWS::QuickSight::Dashboard.ArcConfiguration":{"attributes":{},"description":"The arc configuration of a `GaugeChartVisual` .","properties":{"ArcAngle":"The option that determines the arc angle of a `GaugeChartVisual` .","ArcThickness":"The options that determine the arc thickness of a `GaugeChartVisual` ."}},"AWS::QuickSight::Dashboard.ArcOptions":{"attributes":{},"description":"The options that determine the arc thickness of a `GaugeChartVisual` .","properties":{"ArcThickness":"The arc thickness of a `GaugeChartVisual` ."}},"AWS::QuickSight::Dashboard.AxisDataOptions":{"attributes":{},"description":"The data options for an axis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateAxisOptions":"The options for an axis with a date field.","NumericAxisOptions":"The options for an axis with a numeric field."}},"AWS::QuickSight::Dashboard.AxisDisplayMinMaxRange":{"attributes":{},"description":"The minimum and maximum setup for an axis display range.","properties":{"Maximum":"The maximum setup for an axis display range.","Minimum":"The minimum setup for an axis display range."}},"AWS::QuickSight::Dashboard.AxisDisplayOptions":{"attributes":{},"description":"The display options for the axis label.","properties":{"AxisLineVisibility":"Determines whether or not the axis line is visible.","AxisOffset":"The offset value that determines the starting placement of the axis within a visual\'s bounds.","DataOptions":"The data options for an axis.","GridLineVisibility":"Determines whether or not the grid line is visible.","ScrollbarOptions":"The scroll bar options for an axis.","TickLabelOptions":"The tick label options of an axis."}},"AWS::QuickSight::Dashboard.AxisDisplayRange":{"attributes":{},"description":"The range setup of a numeric axis display range.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DataDriven":"The data-driven setup of an axis display range.","MinMax":"The minimum and maximum setup of an axis display range."}},"AWS::QuickSight::Dashboard.AxisLabelOptions":{"attributes":{},"description":"The label options for a chart axis. You must specify the field that the label is targeted to.","properties":{"ApplyTo":"The options that indicate which field the label belongs to.","CustomLabel":"The text for the axis label.","FontConfiguration":"The font configuration of the axis label."}},"AWS::QuickSight::Dashboard.AxisLabelReferenceOptions":{"attributes":{},"description":"The reference that specifies where the axis label is applied to.","properties":{"Column":"The column that the axis label is targeted to.","FieldId":"The field that the axis label is targeted to."}},"AWS::QuickSight::Dashboard.AxisLinearScale":{"attributes":{},"description":"The liner axis scale setup.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"StepCount":"The step count setup of a linear axis.","StepSize":"The step size setup of a linear axis."}},"AWS::QuickSight::Dashboard.AxisLogarithmicScale":{"attributes":{},"description":"The logarithmic axis scale setup.","properties":{"Base":"The base setup of a logarithmic axis scale."}},"AWS::QuickSight::Dashboard.AxisScale":{"attributes":{},"description":"The scale setup options for a numeric axis display.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Linear":"The linear axis scale setup.","Logarithmic":"The logarithmic axis scale setup."}},"AWS::QuickSight::Dashboard.AxisTickLabelOptions":{"attributes":{},"description":"The tick label options of an axis.","properties":{"LabelOptions":"Determines whether or not the axis ticks are visible.","RotationAngle":"The rotation angle of the axis tick labels."}},"AWS::QuickSight::Dashboard.BarChartAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a bar chart.","properties":{"Category":"The category (y-axis) field well of a bar chart.","Colors":"The color (group/color) field well of a bar chart.","SmallMultiples":"The small multiples field well of a bar chart.","Values":"The value field wells of a bar chart. Values are aggregated by category."}},"AWS::QuickSight::Dashboard.BarChartConfiguration":{"attributes":{},"description":"The configuration of a `BarChartVisual` .","properties":{"BarsArrangement":"Determines the arrangement of the bars. The orientation and arrangement of bars determine the type of bar that is used in the visual.","CategoryAxis":"The label display options (grid line, range, scale, axis step) for bar chart category.","CategoryLabelOptions":"The label options (label text, label visibility and sort icon visibility) for a bar chart.","ColorLabelOptions":"The label options (label text, label visibility and sort icon visibility) for a color that is used in a bar chart.","ContributionAnalysisDefaults":"The contribution analysis (anomaly configuration) setup of the visual.","DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","Orientation":"The orientation of the bars in a bar chart visual. There are two valid values in this structure:\\n\\n- `HORIZONTAL` : Used for charts that have horizontal bars. Visuals that use this value are horizontal bar charts, horizontal stacked bar charts, and horizontal stacked 100% bar charts.\\n- `VERTICAL` : Used for charts that have vertical bars. Visuals that use this value are vertical bar charts, vertical stacked bar charts, and vertical stacked 100% bar charts.","ReferenceLines":"The reference line setup of the visual.","SmallMultiplesOptions":"The small multiples setup for the visual.","SortConfiguration":"The sort configuration of a `BarChartVisual` .","Tooltip":"The tooltip display setup of the visual.","ValueAxis":"The label display options (grid line, range, scale, axis step) for a bar chart value.","ValueLabelOptions":"The label options (label text, label visibility and sort icon visibility) for a bar chart value.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Dashboard.BarChartFieldWells":{"attributes":{},"description":"The field wells of a `BarChartVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"BarChartAggregatedFieldWells":"The aggregated field wells of a bar chart."}},"AWS::QuickSight::Dashboard.BarChartSortConfiguration":{"attributes":{},"description":"sort-configuration-description","properties":{"CategoryItemsLimit":"The limit on the number of categories displayed in a bar chart.","CategorySort":"The sort configuration of category fields.","ColorItemsLimit":"The limit on the number of values displayed in a bar chart.","ColorSort":"The sort configuration of color fields in a bar chart.","SmallMultiplesLimitConfiguration":"The limit on the number of small multiples panels that are displayed.","SmallMultiplesSort":"The sort configuration of the small multiples field."}},"AWS::QuickSight::Dashboard.BarChartVisual":{"attributes":{},"description":"A bar chart.\\n\\nThe `BarChartVisual` structure describes a visual that is a member of the bar chart family. The following charts can be described using this structure:\\n\\n- Horizontal bar chart\\n- Vertical bar chart\\n- Horizontal stacked bar chart\\n- Vertical stacked bar chart\\n- Horizontal stacked 100% bar chart\\n- Vertical stacked 100% bar chart\\n\\nFor more information, see [Using bar charts](https://docs.aws.amazon.com/quicksight/latest/user/bar-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.BinCountOptions":{"attributes":{},"description":"The options that determine the bin count of a histogram.","properties":{"Value":"The options that determine the bin count value."}},"AWS::QuickSight::Dashboard.BinWidthOptions":{"attributes":{},"description":"The options that determine the bin width of a histogram.","properties":{"BinCountLimit":"The options that determine the bin count limit.","Value":"The options that determine the bin width value."}},"AWS::QuickSight::Dashboard.BodySectionConfiguration":{"attributes":{},"description":"The configuration of a body section.","properties":{"Content":"The configuration of content in a body section.","PageBreakConfiguration":"The configuration of a page break for a section.","SectionId":"The unique identifier of a body section.","Style":"The style options of a body section."}},"AWS::QuickSight::Dashboard.BodySectionContent":{"attributes":{},"description":"The configuration of content in a body section.","properties":{"Layout":"The layout configuration of a body section."}},"AWS::QuickSight::Dashboard.BoxPlotAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well for a box plot.","properties":{"GroupBy":"The group by field well of a box plot chart. Values are grouped based on group by fields.","Values":"The value field well of a box plot chart. Values are aggregated based on group by fields."}},"AWS::QuickSight::Dashboard.BoxPlotChartConfiguration":{"attributes":{},"description":"The configuration of a `BoxPlotVisual` .","properties":{"BoxPlotOptions":"The box plot chart options for a box plot visual","CategoryAxis":"The label display options (grid line, range, scale, axis step) of a box plot category.","CategoryLabelOptions":"The label options (label text, label visibility and sort Icon visibility) of a box plot category.","FieldWells":"The field wells of the visual.","Legend":"","PrimaryYAxisDisplayOptions":"The label display options (grid line, range, scale, axis step) of a box plot category.","PrimaryYAxisLabelOptions":"The label options (label text, label visibility and sort icon visibility) of a box plot value.","ReferenceLines":"The reference line setup of the visual.","SortConfiguration":"The sort configuration of a `BoxPlotVisual` .","Tooltip":"The tooltip display setup of the visual.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Dashboard.BoxPlotFieldWells":{"attributes":{},"description":"The field wells of a `BoxPlotVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"BoxPlotAggregatedFieldWells":"The aggregated field wells of a box plot."}},"AWS::QuickSight::Dashboard.BoxPlotOptions":{"attributes":{},"description":"The options of a box plot visual.","properties":{"AllDataPointsVisibility":"Determines the visibility of all data points of the box plot.","OutlierVisibility":"Determines the visibility of the outlier in a box plot.","StyleOptions":"The style options of the box plot."}},"AWS::QuickSight::Dashboard.BoxPlotSortConfiguration":{"attributes":{},"description":"The sort configuration of a `BoxPlotVisual` .","properties":{"CategorySort":"The sort configuration of a group by fields.","PaginationConfiguration":"The pagination configuration of a table visual or box plot."}},"AWS::QuickSight::Dashboard.BoxPlotStyleOptions":{"attributes":{},"description":"The style options of the box plot.","properties":{"FillStyle":"The fill styles (solid, transparent) of the box plot."}},"AWS::QuickSight::Dashboard.BoxPlotVisual":{"attributes":{},"description":"A box plot.\\n\\nFor more information, see [Using box plots](https://docs.aws.amazon.com/quicksight/latest/user/box-plots.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Dashboard.CalculatedField":{"attributes":{},"description":"The calculated field of an analysis.","properties":{"DataSetIdentifier":"The data set that is used in this calculated field.","Expression":"The expression of the calculated field.","Name":"The name of the calculated field."}},"AWS::QuickSight::Dashboard.CalculatedMeasureField":{"attributes":{},"description":"The table calculation measure field for pivot tables.","properties":{"Expression":"The expression in the table calculation.","FieldId":"The custom field ID."}},"AWS::QuickSight::Dashboard.CascadingControlConfiguration":{"attributes":{},"description":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","properties":{"SourceControls":"A list of source controls that determine the values that are used in the current control."}},"AWS::QuickSight::Dashboard.CascadingControlSource":{"attributes":{},"description":"The source controls that are used in a `CascadingControlConfiguration` .","properties":{"ColumnToMatch":"The column identifier that determines which column to look up for the source sheet control.","SourceSheetControlId":"The source sheet control ID of a `CascadingControlSource` ."}},"AWS::QuickSight::Dashboard.CategoricalDimensionField":{"attributes":{},"description":"The dimension type field with categorical type columns..","properties":{"Column":"The column that is used in the `CategoricalDimensionField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field.","HierarchyId":"The custom hierarchy ID."}},"AWS::QuickSight::Dashboard.CategoricalMeasureField":{"attributes":{},"description":"The measure type field with categorical type columns.","properties":{"AggregationFunction":"The aggregation function of the measure field.","Column":"The column that is used in the `CategoricalMeasureField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Dashboard.CategoryDrillDownFilter":{"attributes":{},"description":"The numeric equality type drill down filter.","properties":{"CategoryValues":"A list of the string inputs that are the values of the category drill down filter.","Column":"The column that the filter is applied to."}},"AWS::QuickSight::Dashboard.CategoryFilter":{"attributes":{},"description":"A `CategoryFilter` filters text values.\\n\\nFor more information, see [Adding text filters](https://docs.aws.amazon.com/quicksight/latest/user/add-a-text-filter-data-prep.html) in the *Amazon QuickSight User Guide* .","properties":{"Column":"The column that the filter is applied to.","Configuration":"The configuration for a `CategoryFilter` .","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template."}},"AWS::QuickSight::Dashboard.CategoryFilterConfiguration":{"attributes":{},"description":"The configuration for a `CategoryFilter` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CustomFilterConfiguration":"A custom filter that filters based on a single value. This filter can be partially matched.","CustomFilterListConfiguration":"A list of custom filter values. In the Amazon QuickSight console, this filter type is called a custom filter list.","FilterListConfiguration":"A list of filter configurations. In the Amazon QuickSight console, this filter type is called a filter list."}},"AWS::QuickSight::Dashboard.ChartAxisLabelOptions":{"attributes":{},"description":"The label options for an axis on a chart.","properties":{"AxisLabelOptions":"The label options for a chart axis.","SortIconVisibility":"The visibility configuration of the sort icon on a chart\'s axis label.","Visibility":"The visibility of an axis label on a chart. Choose one of the following options:\\n\\n- `VISIBLE` : Shows the axis.\\n- `HIDDEN` : Hides the axis."}},"AWS::QuickSight::Dashboard.ClusterMarker":{"attributes":{},"description":"The cluster marker that is a part of the cluster marker configuration.","properties":{"SimpleClusterMarker":"The simple cluster marker of the cluster marker."}},"AWS::QuickSight::Dashboard.ClusterMarkerConfiguration":{"attributes":{},"description":"The cluster marker configuration of the geospatial map selected point style.","properties":{"ClusterMarker":"The cluster marker that is a part of the cluster marker configuration."}},"AWS::QuickSight::Dashboard.ColorScale":{"attributes":{},"description":"Determines the color scale that is applied to the visual.","properties":{"ColorFillType":"Determines the color fill type.","Colors":"Determines the list of colors that are applied to the visual.","NullValueColor":"Determines the color that is applied to null values."}},"AWS::QuickSight::Dashboard.ColumnConfiguration":{"attributes":{},"description":"The general configuration of a column.","properties":{"Column":"The column.","FormatConfiguration":"The format configuration of a column.","Role":"The role of the column."}},"AWS::QuickSight::Dashboard.ColumnHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of the fields for a visual element.","properties":{"DateTimeHierarchy":"The option that determines the hierarchy of any `DateTime` fields.","ExplicitHierarchy":"The option that determines the hierarchy of the fields that are built within a visual\'s field wells. These fields can\'t be duplicated to other visuals.","PredefinedHierarchy":"The option that determines the hierarchy of the fields that are defined during data preparation. These fields are available to use in any analysis that uses the data source."}},"AWS::QuickSight::Dashboard.ColumnIdentifier":{"attributes":{},"description":"A column of a data set.","properties":{"ColumnName":"The name of the column.","DataSetIdentifier":"The data set that the column belongs to."}},"AWS::QuickSight::Dashboard.ColumnSort":{"attributes":{},"description":"The sort configuration for a column that is not used in a field well.","properties":{"AggregationFunction":"The aggregation function that is defined in the column sort.","Direction":"The sort direction.","SortBy":""}},"AWS::QuickSight::Dashboard.ColumnTooltipItem":{"attributes":{},"description":"The tooltip item for the columns that are not part of a field well.","properties":{"Aggregation":"The aggregation function of the column tooltip item.","Column":"The target column of the tooltip item.","Label":"The label of the tooltip item.","Visibility":"The visibility of the tooltip item."}},"AWS::QuickSight::Dashboard.ComboChartAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a combo chart.","properties":{"BarValues":"The aggregated `BarValues` field well of a combo chart.","Category":"The aggregated category field wells of a combo chart.","Colors":"The aggregated colors field well of a combo chart.","LineValues":"The aggregated `LineValues` field well of a combo chart."}},"AWS::QuickSight::Dashboard.ComboChartConfiguration":{"attributes":{},"description":"The configuration of a `ComboChartVisual` .","properties":{"BarDataLabels":"The options that determine if visual data labels are displayed.\\n\\nThe data label options for a bar in a combo chart.","BarsArrangement":"Determines the bar arrangement in a combo chart. The following are valid values in this structure:\\n\\n- `CLUSTERED` : For clustered bar combo charts.\\n- `STACKED` : For stacked bar combo charts.\\n- `STACKED_PERCENT` : Do not use. If you use this value, the operation returns a validation error.","CategoryAxis":"The category axis of a combo chart.","CategoryLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart category (group/color) field well.","ColorLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart\'s color field well.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","LineDataLabels":"The options that determine if visual data labels are displayed.\\n\\nThe data label options for a line in a combo chart.","PrimaryYAxisDisplayOptions":"The label display options (grid line, range, scale, and axis step) of a combo chart\'s primary y-axis (bar) field well.","PrimaryYAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart\'s primary y-axis (bar) field well.","ReferenceLines":"The reference line setup of the visual.","SecondaryYAxisDisplayOptions":"The label display options (grid line, range, scale, axis step) of a combo chart\'s secondary y-axis (line) field well.","SecondaryYAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart\'s secondary y-axis(line) field well.","SortConfiguration":"The sort configuration of a `ComboChartVisual` .","Tooltip":"The legend display setup of the visual.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Dashboard.ComboChartFieldWells":{"attributes":{},"description":"The field wells of the visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"ComboChartAggregatedFieldWells":"The aggregated field wells of a combo chart. Combo charts only have aggregated field wells. Columns in a combo chart are aggregated by category."}},"AWS::QuickSight::Dashboard.ComboChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a `ComboChartVisual` .","properties":{"CategoryItemsLimit":"The item limit configuration for the category field well of a combo chart.","CategorySort":"The sort configuration of the category field well in a combo chart.","ColorItemsLimit":"The item limit configuration of the color field well in a combo chart.","ColorSort":"The sort configuration of the color field well in a combo chart."}},"AWS::QuickSight::Dashboard.ComboChartVisual":{"attributes":{},"description":"A combo chart.\\n\\nThe `ComboChartVisual` includes stacked bar combo charts and clustered bar combo charts\\n\\nFor more information, see [Using combo charts](https://docs.aws.amazon.com/quicksight/latest/user/combo-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.ComparisonConfiguration":{"attributes":{},"description":"The comparison display configuration of a KPI or gauge chart.","properties":{"ComparisonFormat":"The format of the comparison.","ComparisonMethod":"The method of the comparison. Choose from the following options:\\n\\n- `DIFFERENCE`\\n- `PERCENT_DIFFERENCE`\\n- `PERCENT`"}},"AWS::QuickSight::Dashboard.ComparisonFormatConfiguration":{"attributes":{},"description":"The format of the comparison.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"NumberDisplayFormatConfiguration":"The number display format.","PercentageDisplayFormatConfiguration":"The percentage display format."}},"AWS::QuickSight::Dashboard.Computation":{"attributes":{},"description":"The computation union that is used in an insight visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Forecast":"The forecast computation configuration.","GrowthRate":"The growth rate computation configuration.","MaximumMinimum":"The maximum and minimum computation configuration.","MetricComparison":"The metric comparison computation configuration.","PeriodOverPeriod":"The period over period computation configuration.","PeriodToDate":"The period to `DataSetIdentifier` computation configuration.","TopBottomMovers":"The top movers and bottom movers computation configuration.","TopBottomRanked":"The top ranked and bottom ranked computation configuration.","TotalAggregation":"The total aggregation computation configuration.","UniqueValues":"The unique values computation configuration."}},"AWS::QuickSight::Dashboard.ConditionalFormattingColor":{"attributes":{},"description":"The formatting configuration for the color.","properties":{"Gradient":"Formatting configuration for gradient color.","Solid":"Formatting configuration for solid color."}},"AWS::QuickSight::Dashboard.ConditionalFormattingCustomIconCondition":{"attributes":{},"description":"Determines the custom condition for an icon set.","properties":{"Color":"Determines the color of the icon.","DisplayConfiguration":"Determines the icon display configuration.","Expression":"The expression that determines the condition of the icon set.","IconOptions":"Custom icon options for an icon set."}},"AWS::QuickSight::Dashboard.ConditionalFormattingCustomIconOptions":{"attributes":{},"description":"Custom icon options for an icon set.","properties":{"Icon":"Determines the type of icon.","UnicodeIcon":"Determines the Unicode icon type."}},"AWS::QuickSight::Dashboard.ConditionalFormattingGradientColor":{"attributes":{},"description":"Formatting configuration for gradient color.","properties":{"Color":"Determines the color.","Expression":"The expression that determines the formatting configuration for gradient color."}},"AWS::QuickSight::Dashboard.ConditionalFormattingIcon":{"attributes":{},"description":"The formatting configuration for the icon.","properties":{"CustomCondition":"Determines the custom condition for an icon set.","IconSet":"Formatting configuration for icon set."}},"AWS::QuickSight::Dashboard.ConditionalFormattingIconDisplayConfiguration":{"attributes":{},"description":"Determines the icon display configuration.","properties":{"IconDisplayOption":"Determines the icon display configuration."}},"AWS::QuickSight::Dashboard.ConditionalFormattingIconSet":{"attributes":{},"description":"Formatting configuration for icon set.","properties":{"Expression":"The expression that determines the formatting configuration for the icon set.","IconSetType":"Determines the icon set type."}},"AWS::QuickSight::Dashboard.ConditionalFormattingSolidColor":{"attributes":{},"description":"Formatting configuration for solid color.","properties":{"Color":"Determines the color.","Expression":"The expression that determines the formatting configuration for solid color."}},"AWS::QuickSight::Dashboard.ContributionAnalysisDefault":{"attributes":{},"description":"The contribution analysis visual display for a line, pie, or bar chart.","properties":{"ContributorDimensions":"The dimensions columns that are used in the contribution analysis, usually a list of `ColumnIdentifiers` .","MeasureFieldId":"The measure field that is used in the contribution analysis."}},"AWS::QuickSight::Dashboard.CurrencyDisplayFormatConfiguration":{"attributes":{},"description":"The options that determine the currency display format configuration.","properties":{"DecimalPlacesConfiguration":"The option that determines the decimal places configuration.","NegativeValueConfiguration":"The options that determine the negative value configuration.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumberScale":"Determines the number scale value for the currency format.","Prefix":"Determines the prefix value of the currency format.","SeparatorConfiguration":"The options that determine the numeric separator configuration.","Suffix":"Determines the suffix value of the currency format.","Symbol":"Determines the symbol for the currency format."}},"AWS::QuickSight::Dashboard.CustomActionFilterOperation":{"attributes":{},"description":"The filter operation that filters data included in a visual or in an entire sheet.","properties":{"SelectedFieldsConfiguration":"The configuration that chooses the fields to be filtered.","TargetVisualsConfiguration":"The configuration that chooses the target visuals to be filtered."}},"AWS::QuickSight::Dashboard.CustomActionNavigationOperation":{"attributes":{},"description":"The navigation operation that navigates between different sheets in the same analysis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"LocalNavigationConfiguration":"The configuration that chooses the navigation target."}},"AWS::QuickSight::Dashboard.CustomActionSetParametersOperation":{"attributes":{},"description":"The set parameter operation that sets parameters in custom action.","properties":{"ParameterValueConfigurations":"The parameter that determines the value configuration."}},"AWS::QuickSight::Dashboard.CustomActionURLOperation":{"attributes":{},"description":"The URL operation that opens a link to another webpage.","properties":{"URLTarget":"The target of the `CustomActionURLOperation` .\\n\\nValid values are defined as follows:\\n\\n- `NEW_TAB` : Opens the target URL in a new browser tab.\\n- `NEW_WINDOW` : Opens the target URL in a new browser window.\\n- `SAME_TAB` : Opens the target URL in the same browser tab.","URLTemplate":"THe URL link of the `CustomActionURLOperation` ."}},"AWS::QuickSight::Dashboard.CustomContentConfiguration":{"attributes":{},"description":"The configuration of a `CustomContentVisual` .","properties":{"ContentType":"The content type of the custom content visual. You can use this to have the visual render as an image.","ContentUrl":"The input URL that links to the custom content that you want in the custom visual.","ImageScaling":"The sizing options for the size of the custom content visual. This structure is required when the `ContentType` of the visual is `\'IMAGE\'` ."}},"AWS::QuickSight::Dashboard.CustomContentVisual":{"attributes":{},"description":"A visual that contains custom content.\\n\\nFor more information, see [Using custom visual content](https://docs.aws.amazon.com/quicksight/latest/user/custom-visual-content.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a `CustomContentVisual` .","DataSetIdentifier":"The dataset that is used to create the custom content visual. You can\'t create a visual without a dataset.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.CustomFilterConfiguration":{"attributes":{},"description":"A custom filter that filters based on a single value. This filter can be partially matched.","properties":{"CategoryValue":"The category value for the filter.\\n\\nThis field is mutually exclusive to `ParameterName` .","MatchOperator":"The match operator that is used to determine if a filter should be applied.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","ParameterName":"The parameter whose value should be used for the filter value.\\n\\nThis field is mutually exclusive to `CategoryValue` .","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Dashboard.CustomFilterListConfiguration":{"attributes":{},"description":"A list of custom filter values.","properties":{"CategoryValues":"The list of category values for the filter.","MatchOperator":"The match operator that is used to determine if a filter should be applied.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Dashboard.CustomNarrativeOptions":{"attributes":{},"description":"The custom narrative options.","properties":{"Narrative":"The string input of custom narrative."}},"AWS::QuickSight::Dashboard.CustomParameterValues":{"attributes":{},"description":"The customized parameter values.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimeValues":"A list of datetime-type parameter values.","DecimalValues":"A list of decimal-type parameter values.","IntegerValues":"A list of integer-type parameter values.","StringValues":"A list of string-type parameter values."}},"AWS::QuickSight::Dashboard.CustomValuesConfiguration":{"attributes":{},"description":"The configuration of custom values for the destination parameter in `DestinationParameterValueConfiguration` .","properties":{"CustomValues":"","IncludeNullValue":"Includes the null value in custom action parameter values."}},"AWS::QuickSight::Dashboard.DashboardError":{"attributes":{},"description":"Dashboard error.","properties":{"Message":"Message.","Type":"Type.","ViolatedEntities":"Lists the violated entities that caused the dashboard error."}},"AWS::QuickSight::Dashboard.DashboardPublishOptions":{"attributes":{},"description":"Dashboard publish options.","properties":{"AdHocFilteringOption":"Ad hoc (one-time) filtering option.","DataPointDrillUpDownOption":"The drill-down options of data points in a dashboard.","DataPointMenuLabelOption":"The data point menu label options of a dashboard.","DataPointTooltipOption":"The data point tool tip options of a dashboard.","ExportToCSVOption":"Export to .csv option.","ExportWithHiddenFieldsOption":"Determines if hidden fields are exported with a dashboard.","SheetControlsOption":"Sheet controls option.","SheetLayoutElementMaximizationOption":"The sheet layout maximization options of a dashbaord.","VisualAxisSortOption":"The axis sort options of a dashboard.","VisualMenuOption":"The menu options of a visual in a dashboard.","VisualPublishOptions":"The visual publish options of a visual in a dashboard."}},"AWS::QuickSight::Dashboard.DashboardSourceEntity":{"attributes":{},"description":"Dashboard source entity.","properties":{"SourceTemplate":"Source template."}},"AWS::QuickSight::Dashboard.DashboardSourceTemplate":{"attributes":{},"description":"Dashboard source template.","properties":{"Arn":"The Amazon Resource Name (ARN) of the resource.","DataSetReferences":"Dataset references."}},"AWS::QuickSight::Dashboard.DashboardVersion":{"attributes":{},"description":"Dashboard version.","properties":{"Arn":"The Amazon Resource Name (ARN) of the resource.","CreatedTime":"The time that this dashboard version was created.","DataSetArns":"The Amazon Resource Numbers (ARNs) for the datasets that are associated with this version of the dashboard.","Description":"Description.","Errors":"Errors associated with this dashboard version.","Sheets":"A list of the associated sheets with the unique identifier and name of each sheet.","SourceEntityArn":"Source entity ARN.","Status":"The HTTP status of the request.","ThemeArn":"The ARN of the theme associated with a version of the dashboard.","VersionNumber":"Version number for this version of the dashboard."}},"AWS::QuickSight::Dashboard.DashboardVersionDefinition":{"attributes":{},"description":"The contents of a dashboard.","properties":{"AnalysisDefaults":"","CalculatedFields":"An array of calculated field definitions for the dashboard.","ColumnConfigurations":"An array of dashboard-level column configurations. Column configurations are used to set the default formatting for a column that is used throughout a dashboard.","DataSetIdentifierDeclarations":"An array of dataset identifier declarations. With this mapping,you can use dataset identifiers instead of dataset Amazon Resource Names (ARNs) throughout the dashboard\'s sub-structures.","FilterGroups":"The filter definitions for a dashboard.\\n\\nFor more information, see [Filtering Data in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/adding-a-filter.html) in the *Amazon QuickSight User Guide* .","ParameterDeclarations":"The parameter declarations for a dashboard. Parameters are named variables that can transfer a value for use by an action or an object.\\n\\nFor more information, see [Parameters in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/parameters-in-quicksight.html) in the *Amazon QuickSight User Guide* .","Sheets":"An array of sheet definitions for a dashboard."}},"AWS::QuickSight::Dashboard.DashboardVisualPublishOptions":{"attributes":{},"description":"The visual publish options of a visual in a dashboard","properties":{"ExportHiddenFieldsOption":"Determines if hidden fields are included in an exported dashboard."}},"AWS::QuickSight::Dashboard.DataBarsOptions":{"attributes":{},"description":"The options for data bars.","properties":{"FieldId":"The field ID for the data bars options.","NegativeColor":"The color of the negative data bar.","PositiveColor":"The color of the positive data bar."}},"AWS::QuickSight::Dashboard.DataColor":{"attributes":{},"description":"Determines the color that is applied to a particular data value.","properties":{"Color":"The color that is applied to the data value.","DataValue":"The data value that the color is applied to."}},"AWS::QuickSight::Dashboard.DataFieldSeriesItem":{"attributes":{},"description":"The data field series item configuration of a line chart.","properties":{"AxisBinding":"The axis that you are binding the field to.","FieldId":"The field ID of the field that you are setting the axis binding to.","FieldValue":"The field value of the field that you are setting the axis binding to.","Settings":"The options that determine the presentation of line series associated to the field."}},"AWS::QuickSight::Dashboard.DataLabelOptions":{"attributes":{},"description":"The options that determine the presentation of the data labels.","properties":{"CategoryLabelVisibility":"Determines the visibility of the category field labels.","DataLabelTypes":"The option that determines the data label type.","LabelColor":"Determines the color of the data labels.","LabelContent":"Determines the content of the data labels.","LabelFontConfiguration":"Determines the font configuration of the data labels.","MeasureLabelVisibility":"Determines the visibility of the measure field labels.","Overlap":"Determines whether overlap is enabled or disabled for the data labels.","Position":"Determines the position of the data labels.","TotalsVisibility":"Determines the visibility of the total.","Visibility":"Determines the visibility of the data labels."}},"AWS::QuickSight::Dashboard.DataLabelType":{"attributes":{},"description":"The option that determines the data label type.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DataPathLabelType":"The option that specifies individual data values for labels.","FieldLabelType":"Determines the label configuration for the entire field.","MaximumLabelType":"Determines the label configuration for the maximum value in a visual.","MinimumLabelType":"Determines the label configuration for the minimum value in a visual.","RangeEndsLabelType":"Determines the label configuration for range end value in a visual."}},"AWS::QuickSight::Dashboard.DataPathColor":{"attributes":{},"description":"The color map that determines the color options for a particular element.","properties":{"Color":"The color that needs to be applied to the element.","Element":"The element that the color needs to be applied to.","TimeGranularity":"The time granularity of the field that the color needs to be applied to."}},"AWS::QuickSight::Dashboard.DataPathLabelType":{"attributes":{},"description":"The option that specifies individual data values for labels.","properties":{"FieldId":"The field ID of the field that the data label needs to be applied to.","FieldValue":"The actual value of the field that is labeled.","Visibility":"The visibility of the data label."}},"AWS::QuickSight::Dashboard.DataPathSort":{"attributes":{},"description":"Allows data paths to be sorted by a specific data value.","properties":{"Direction":"Determines the sort direction.","SortPaths":"The list of data paths that need to be sorted."}},"AWS::QuickSight::Dashboard.DataPathValue":{"attributes":{},"description":"The data path that needs to be sorted.","properties":{"FieldId":"The field ID of the field that needs to be sorted.","FieldValue":"The actual value of the field that needs to be sorted."}},"AWS::QuickSight::Dashboard.DataPointDrillUpDownOption":{"attributes":{},"description":"The drill down options for data points in a dashbaord.","properties":{"AvailabilityStatus":"The status of the drill down options of data points."}},"AWS::QuickSight::Dashboard.DataPointMenuLabelOption":{"attributes":{},"description":"The data point menu options of a dashboard.","properties":{"AvailabilityStatus":"The status of the data point menu options."}},"AWS::QuickSight::Dashboard.DataPointTooltipOption":{"attributes":{},"description":"The data point tooltip options.","properties":{"AvailabilityStatus":"The status of the data point tool tip options."}},"AWS::QuickSight::Dashboard.DataSetIdentifierDeclaration":{"attributes":{},"description":"A data set.","properties":{"DataSetArn":"The Amazon Resource Name (ARN) of the data set.","Identifier":"The identifier of the data set, typically the data set\'s name."}},"AWS::QuickSight::Dashboard.DataSetReference":{"attributes":{},"description":"Dataset reference.","properties":{"DataSetArn":"Dataset Amazon Resource Name (ARN).","DataSetPlaceholder":"Dataset placeholder."}},"AWS::QuickSight::Dashboard.DateAxisOptions":{"attributes":{},"description":"The options that determine how a date axis is displayed.","properties":{"MissingDateVisibility":"Determines whether or not missing dates are displayed."}},"AWS::QuickSight::Dashboard.DateDimensionField":{"attributes":{},"description":"The dimension type field with date type columns.","properties":{"Column":"The column that is used in the `DateDimensionField` .","DateGranularity":"The date granularity of the `DateDimensionField` . Choose one of the following options:\\n\\n- `YEAR`\\n- `QUARTER`\\n- `MONTH`\\n- `WEEK`\\n- `DAY`\\n- `HOUR`\\n- `MINUTE`\\n- `SECOND`\\n- `MILLISECOND`","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field.","HierarchyId":"The custom hierarchy ID."}},"AWS::QuickSight::Dashboard.DateMeasureField":{"attributes":{},"description":"The measure type field with date type columns.","properties":{"AggregationFunction":"The aggregation function of the measure field.","Column":"The column that is used in the `DateMeasureField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Dashboard.DateTimeDefaultValues":{"attributes":{},"description":"The default values of the `DateTimeParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `DataTimeDefaultValues` . Different defaults are displayed according to users, groups, and values mapping.","RollingDate":"The rolling date of the `DataTimeDefaultValues` . The date is determined from the dataset based on input expression.","StaticValues":"The static values of the `DataTimeDefaultValues` ."}},"AWS::QuickSight::Dashboard.DateTimeFormatConfiguration":{"attributes":{},"description":"Formatting configuration for `DateTime` fields.","properties":{"DateTimeFormat":"Determines the `DateTime` format.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumericFormatConfiguration":"The formatting configuration for numeric `DateTime` fields."}},"AWS::QuickSight::Dashboard.DateTimeHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of any `DateTime` fields.","properties":{"DrillDownFilters":"The option that determines the drill down filters for the `DateTime` hierarchy.","HierarchyId":"The hierarchy ID of the `DateTime` hierarchy."}},"AWS::QuickSight::Dashboard.DateTimeParameter":{"attributes":{},"description":"A date-time parameter.","properties":{"Name":"A display name for the date-time parameter.","Values":"The values for the date-time parameter."}},"AWS::QuickSight::Dashboard.DateTimeParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `DateTime` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values.","ValueWhenUnset":"The configuration that defines the default value of a `DateTime` parameter when a value has not been set."}},"AWS::QuickSight::Dashboard.DateTimePickerControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"DateTimeFormat":"Customize how dates are formatted in controls.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Dashboard.DateTimeValueWhenUnsetConfiguration":{"attributes":{},"description":"The configuration that defines the default value of a `DateTime` parameter when a value has not been set.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Dashboard.DecimalDefaultValues":{"attributes":{},"description":"The default values of the `DecimalParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `DecimalDefaultValues` . Different defaults are displayed according to users, groups, and values mapping.","StaticValues":"The static values of the `DecimalDefaultValues` ."}},"AWS::QuickSight::Dashboard.DecimalParameter":{"attributes":{},"description":"A decimal parameter.","properties":{"Name":"A display name for the decimal parameter.","Values":"The values for the decimal parameter."}},"AWS::QuickSight::Dashboard.DecimalParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `Decimal` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","ParameterValueType":"The value type determines whether the parameter is a single-value or multi-value parameter.","ValueWhenUnset":"The configuration that defines the default value of a `Decimal` parameter when a value has not been set."}},"AWS::QuickSight::Dashboard.DecimalPlacesConfiguration":{"attributes":{},"description":"The option that determines the decimal places configuration.","properties":{"DecimalPlaces":"The values of the decimal places."}},"AWS::QuickSight::Dashboard.DecimalValueWhenUnsetConfiguration":{"attributes":{},"description":"The configuration that defines the default value of a `Decimal` parameter when a value has not been set.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Dashboard.DefaultFreeFormLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings of a free-form layout configuration.","properties":{"CanvasSizeOptions":"Determines the screen canvas size options for a free-form layout."}},"AWS::QuickSight::Dashboard.DefaultGridLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for a grid layout configuration.","properties":{"CanvasSizeOptions":"Determines the screen canvas size options for a grid layout."}},"AWS::QuickSight::Dashboard.DefaultInteractiveLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for interactive layout configuration.","properties":{"FreeForm":"The options that determine the default settings of a free-form layout configuration.","Grid":"The options that determine the default settings for a grid layout configuration."}},"AWS::QuickSight::Dashboard.DefaultNewSheetConfiguration":{"attributes":{},"description":"The configuration for default new sheet settings.","properties":{"InteractiveLayoutConfiguration":"The options that determine the default settings for interactive layout configuration.","PaginatedLayoutConfiguration":"The options that determine the default settings for a paginated layout configuration.","SheetContentType":"The option that determines the sheet content type."}},"AWS::QuickSight::Dashboard.DefaultPaginatedLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for a paginated layout configuration.","properties":{"SectionBased":"The options that determine the default settings for a section-based layout configuration."}},"AWS::QuickSight::Dashboard.DefaultSectionBasedLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for a section-based layout configuration.","properties":{"CanvasSizeOptions":"Determines the screen canvas size options for a section-based layout."}},"AWS::QuickSight::Dashboard.DestinationParameterValueConfiguration":{"attributes":{},"description":"The configuration of destination parameter values.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CustomValuesConfiguration":"The configuration of custom values for destination parameter in `DestinationParameterValueConfiguration` .","SelectAllValueOptions":"The configuration that selects all options.","SourceColumn":"","SourceField":"The source field ID of the destination parameter.","SourceParameterName":"The source parameter name of the destination parameter."}},"AWS::QuickSight::Dashboard.DimensionField":{"attributes":{},"description":"The dimension type field.","properties":{"CategoricalDimensionField":"The dimension type field with categorical type columns.","DateDimensionField":"The dimension type field with date type columns.","NumericalDimensionField":"The dimension type field with numerical type columns."}},"AWS::QuickSight::Dashboard.DonutCenterOptions":{"attributes":{},"description":"The label options of the label that is displayed in the center of a donut chart. This option isn\'t available for pie charts.","properties":{"LabelVisibility":"Determines the visibility of the label in a donut chart. In the Amazon QuickSight console, this option is called `\'Show total\'` ."}},"AWS::QuickSight::Dashboard.DonutOptions":{"attributes":{},"description":"The options for configuring a donut chart or pie chart.","properties":{"ArcOptions":"The option for define the arc of the chart shape. Valid values are as follows:\\n\\n- `WHOLE` - A pie chart\\n- `SMALL` - A small-sized donut chart\\n- `MEDIUM` - A medium-sized donut chart\\n- `LARGE` - A large-sized donut chart","DonutCenterOptions":"The label options of the label that is displayed in the center of a donut chart. This option isn\'t available for pie charts."}},"AWS::QuickSight::Dashboard.DrillDownFilter":{"attributes":{},"description":"The drill down filter for the column hierarchies.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CategoryFilter":"The category type drill down filter. This filter is used for string type columns.","NumericEqualityFilter":"The numeric equality type drill down filter. This filter is used for number type columns.","TimeRangeFilter":"The time range drill down filter. This filter is used for date time columns."}},"AWS::QuickSight::Dashboard.DropDownControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"SelectAllOptions":"The configuration of the `Select all` options in a dropdown control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Dashboard.DynamicDefaultValue":{"attributes":{},"description":"Defines different defaults to the users or groups based on mapping.","properties":{"DefaultValueColumn":"The column that contains the default value of each user or group.","GroupNameColumn":"The column that contains the group name.","UserNameColumn":"The column that contains the username."}},"AWS::QuickSight::Dashboard.EmptyVisual":{"attributes":{},"description":"An empty visual.\\n\\nEmpty visuals are used in layouts but have not been configured to show any data. A new visual created in the Amazon QuickSight console is considered an `EmptyVisual` until a visual type is selected.","properties":{"Actions":"The list of custom actions that are configured for a visual.","DataSetIdentifier":"The data set that is used in the empty visual. Every visual requires a dataset to render.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.Entity":{"attributes":{},"description":"An object, structure, or sub-structure of an analysis, template, or dashboard.","properties":{"Path":"The hierarchical path of the entity within the analysis, template, or dashboard definition tree."}},"AWS::QuickSight::Dashboard.ExcludePeriodConfiguration":{"attributes":{},"description":"The exclude period of `TimeRangeFilter` or `RelativeDatesFilter` .","properties":{"Amount":"The amount or number of the exclude period.","Granularity":"The granularity or unit (day, month, year) of the exclude period.","Status":"The status of the exclude period. Choose from the following options:\\n\\n- `ENABLED`\\n- `DISABLED`"}},"AWS::QuickSight::Dashboard.ExplicitHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of the fields that are built within a visual\'s field wells. These fields can\'t be duplicated to other visuals.","properties":{"Columns":"The list of columns that define the explicit hierarchy.","DrillDownFilters":"The option that determines the drill down filters for the explicit hierarchy.","HierarchyId":"The hierarchy ID of the explicit hierarchy."}},"AWS::QuickSight::Dashboard.ExportHiddenFieldsOption":{"attributes":{},"description":"Determines if hidden fields are included in an exported dashboard.","properties":{"AvailabilityStatus":"The status of the export hidden fields options of a dashbaord."}},"AWS::QuickSight::Dashboard.ExportToCSVOption":{"attributes":{},"description":"Export to .csv option.","properties":{"AvailabilityStatus":"Availability status."}},"AWS::QuickSight::Dashboard.ExportWithHiddenFieldsOption":{"attributes":{},"description":"Determines whether or not hidden fields are visible on exported dashbaords.","properties":{"AvailabilityStatus":"The status of the export with hidden fields options."}},"AWS::QuickSight::Dashboard.FieldBasedTooltip":{"attributes":{},"description":"The setup for the detailed tooltip.","properties":{"AggregationVisibility":"The visibility of `Show aggregations` .","TooltipFields":"The fields configuration in the tooltip.","TooltipTitleType":"The type for the >tooltip title. Choose one of the following options:\\n\\n- `NONE` : Doesn\'t use the primary value as the title.\\n- `PRIMARY_VALUE` : Uses primary value as the title."}},"AWS::QuickSight::Dashboard.FieldLabelType":{"attributes":{},"description":"The field label type.","properties":{"FieldId":"Indicates the field that is targeted by the field label.","Visibility":"The visibility of the field label."}},"AWS::QuickSight::Dashboard.FieldSeriesItem":{"attributes":{},"description":"The field series item configuration of a line chart.","properties":{"AxisBinding":"The axis that you are binding the field to.","FieldId":"The field ID of the field for which you are setting the axis binding.","Settings":"The options that determine the presentation of line series associated to the field."}},"AWS::QuickSight::Dashboard.FieldSort":{"attributes":{},"description":"The sort configuration for a field in a field well.","properties":{"Direction":"The sort direction. Choose one of the following options:\\n\\n- `ASC` : Ascending\\n- `DESC` : Descending","FieldId":"The sort configuration target field."}},"AWS::QuickSight::Dashboard.FieldSortOptions":{"attributes":{},"description":"The field sort options in a chart configuration.","properties":{"ColumnSort":"The sort configuration for a column that is not used in a field well.","FieldSort":"The sort configuration for a field in a field well."}},"AWS::QuickSight::Dashboard.FieldTooltipItem":{"attributes":{},"description":"The tooltip item for the fields.","properties":{"FieldId":"The unique ID of the field that is targeted by the tooltip.","Label":"The label of the tooltip item.","Visibility":"The visibility of the tooltip item."}},"AWS::QuickSight::Dashboard.FilledMapAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well of the filled map.","properties":{"Geospatial":"The aggregated location field well of the filled map. Values are grouped by location fields.","Values":"The aggregated color field well of a filled map. Values are aggregated based on location fields."}},"AWS::QuickSight::Dashboard.FilledMapConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a `FilledMapVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options of a `FilledMapVisual` ."}},"AWS::QuickSight::Dashboard.FilledMapConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options of a `FilledMapVisual` .","properties":{"Shape":"The conditional formatting that determines the shape of the filled map."}},"AWS::QuickSight::Dashboard.FilledMapConfiguration":{"attributes":{},"description":"The configuration for a `FilledMapVisual` .","properties":{"FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","MapStyleOptions":"The map style options of the filled map visual.","SortConfiguration":"The sort configuration of a `FilledMapVisual` .","Tooltip":"The tooltip display setup of the visual.","WindowOptions":"The window options of the filled map visual."}},"AWS::QuickSight::Dashboard.FilledMapFieldWells":{"attributes":{},"description":"The field wells of a `FilledMapVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FilledMapAggregatedFieldWells":"The aggregated field well of the filled map."}},"AWS::QuickSight::Dashboard.FilledMapShapeConditionalFormatting":{"attributes":{},"description":"The conditional formatting that determines the shape of the filled map.","properties":{"FieldId":"The field ID of the filled map shape.","Format":"The conditional formatting that determines the background color of a filled map\'s shape."}},"AWS::QuickSight::Dashboard.FilledMapSortConfiguration":{"attributes":{},"description":"The sort configuration of a `FilledMapVisual` .","properties":{"CategorySort":"The sort configuration of the location fields."}},"AWS::QuickSight::Dashboard.FilledMapVisual":{"attributes":{},"description":"A filled map.\\n\\nFor more information, see [Creating filled maps](https://docs.aws.amazon.com/quicksight/latest/user/filled-maps.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","ConditionalFormatting":"The conditional formatting of a `FilledMapVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Dashboard.Filter":{"attributes":{},"description":"With a `Filter` , you can remove portions of data from a particular visual or view.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CategoryFilter":"A `CategoryFilter` filters text values.\\n\\nFor more information, see [Adding text filters](https://docs.aws.amazon.com/quicksight/latest/user/add-a-text-filter-data-prep.html) in the *Amazon QuickSight User Guide* .","NumericEqualityFilter":"A `NumericEqualityFilter` filters numeric values that equal or do not equal a given numeric value.","NumericRangeFilter":"A `NumericRangeFilter` filters numeric values that are either inside or outside a given numeric range.","RelativeDatesFilter":"A `RelativeDatesFilter` filters date values that are relative to a given date.","TimeEqualityFilter":"A `TimeEqualityFilter` filters date-time values that equal or do not equal a given date/time value.","TimeRangeFilter":"A `TimeRangeFilter` filters date-time values that are either inside or outside a given date/time range.","TopBottomFilter":"A `TopBottomFilter` filters data to the top or bottom values for a given column."}},"AWS::QuickSight::Dashboard.FilterControl":{"attributes":{},"description":"The control of a filter that is used to interact with a dashboard or an analysis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimePicker":"A control from a date filter that is used to specify date and time.","Dropdown":"A control to display a dropdown list with buttons that are used to select a single value.","List":"A control to display a list of buttons or boxes. This is used to select either a single value or multiple values.","RelativeDateTime":"A control from a date filter that is used to specify the relative date.","Slider":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","TextArea":"A control to display a text box that is used to enter multiple entries.","TextField":"A control to display a text box that is used to enter a single entry."}},"AWS::QuickSight::Dashboard.FilterDateTimePickerControl":{"attributes":{},"description":"A control from a date filter that is used to specify date and time.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterDateTimePickerControl` .","SourceFilterId":"The source filter ID of the `FilterDateTimePickerControl` .","Title":"The title of the `FilterDateTimePickerControl` .","Type":"The date time picker type of a `FilterDateTimePickerControl` . Choose one of the following options:\\n\\n- `SINGLE_VALUED` : The filter condition is a fixed date.\\n- `DATE_RANGE` : The filter condition is a date time range."}},"AWS::QuickSight::Dashboard.FilterDropDownControl":{"attributes":{},"description":"A control to display a dropdown list with buttons that are used to select a single value.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of the `FilterDropDownControl` .","FilterControlId":"The ID of the `FilterDropDownControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceFilterId":"The source filter ID of the `FilterDropDownControl` .","Title":"The title of the `FilterDropDownControl` .","Type":"The type of the `FilterDropDownControl` . Choose one of the following options:\\n\\n- `MULTI_SELECT` : The user can select multiple entries from a dropdown menu.\\n- `SINGLE_SELECT` : The user can select a single entry from a dropdown menu."}},"AWS::QuickSight::Dashboard.FilterGroup":{"attributes":{},"description":"A grouping of individual filters. Filter groups are applied to the same group of visuals.\\n\\nFor more information, see [Adding filter conditions (group filters) with AND and OR operators](https://docs.aws.amazon.com/quicksight/latest/user/add-a-compound-filter.html) in the *Amazon QuickSight User Guide* .","properties":{"CrossDataset":"The filter new feature which can apply filter group to all data sets. Choose one of the following options:\\n\\n- `ALL_DATASETS`\\n- `SINGLE_DATASET`","FilterGroupId":"The value that uniquely identifies a `FilterGroup` within a dashboard, template, or analysis.","Filters":"The list of filters that are present in a `FilterGroup` .","ScopeConfiguration":"The configuration that specifies what scope to apply to a `FilterGroup` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","Status":"The status of the `FilterGroup` ."}},"AWS::QuickSight::Dashboard.FilterListConfiguration":{"attributes":{},"description":"A list of filter configurations.","properties":{"CategoryValues":"The list of category values for the filter.","MatchOperator":"The match operator that is used to determine if a filter should be applied.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Dashboard.FilterListControl":{"attributes":{},"description":"A control to display a list of buttons or boxes. This is used to select either a single value or multiple values.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterListControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceFilterId":"The source filter ID of the `FilterListControl` .","Title":"The title of the `FilterListControl` .","Type":"The type of `FilterListControl` . Choose one of the following options:\\n\\n- `MULTI_SELECT` : The user can select multiple entries from the list.\\n- `SINGLE_SELECT` : The user can select a single entry from the list."}},"AWS::QuickSight::Dashboard.FilterOperationSelectedFieldsConfiguration":{"attributes":{},"description":"The configuration of selected fields in the `CustomActionFilterOperation` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SelectedColumns":"The selected columns of a dataset.","SelectedFieldOptions":"A structure that contains the options that choose which fields are filtered in the `CustomActionFilterOperation` .\\n\\nValid values are defined as follows:\\n\\n- `ALL_FIELDS` : Applies the filter operation to all fields.","SelectedFields":"Chooses the fields that are filtered in `CustomActionFilterOperation` ."}},"AWS::QuickSight::Dashboard.FilterOperationTargetVisualsConfiguration":{"attributes":{},"description":"The configuration of target visuals that you want to be filtered.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SameSheetTargetVisualConfiguration":"The configuration of the same-sheet target visuals that you want to be filtered."}},"AWS::QuickSight::Dashboard.FilterRelativeDateTimeControl":{"attributes":{},"description":"A control from a date filter that is used to specify the relative date.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterTextAreaControl` .","SourceFilterId":"The source filter ID of the `FilterTextAreaControl` .","Title":"The title of the `FilterTextAreaControl` ."}},"AWS::QuickSight::Dashboard.FilterScopeConfiguration":{"attributes":{},"description":"The scope configuration for a `FilterGroup` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SelectedSheets":"The configuration for applying a filter to specific sheets."}},"AWS::QuickSight::Dashboard.FilterSelectableValues":{"attributes":{},"description":"A list of selectable values that are used in a control.","properties":{"Values":"The values that are used in the `FilterSelectableValues` ."}},"AWS::QuickSight::Dashboard.FilterSliderControl":{"attributes":{},"description":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterSliderControl` .","MaximumValue":"The smaller value that is displayed at the left of the slider.","MinimumValue":"The larger value that is displayed at the right of the slider.","SourceFilterId":"The source filter ID of the `FilterSliderControl` .","StepSize":"The number of increments that the slider bar is divided into.","Title":"The title of the `FilterSliderControl` .","Type":"The type of `FilterSliderControl` . Choose one of the following options:\\n\\n- `SINGLE_POINT` : Filter against(equals) a single data point.\\n- `RANGE` : Filter data that is in a specified range."}},"AWS::QuickSight::Dashboard.FilterTextAreaControl":{"attributes":{},"description":"A control to display a text box that is used to enter multiple entries.","properties":{"Delimiter":"The delimiter that is used to separate the lines in text.","DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterTextAreaControl` .","SourceFilterId":"The source filter ID of the `FilterTextAreaControl` .","Title":"The title of the `FilterTextAreaControl` ."}},"AWS::QuickSight::Dashboard.FilterTextFieldControl":{"attributes":{},"description":"A control to display a text box that is used to enter a single entry.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterTextFieldControl` .","SourceFilterId":"The source filter ID of the `FilterTextFieldControl` .","Title":"The title of the `FilterTextFieldControl` ."}},"AWS::QuickSight::Dashboard.FontConfiguration":{"attributes":{},"description":"Configures the display properties of the given text.","properties":{"FontColor":"Determines the color of the text.","FontDecoration":"Determines the appearance of decorative lines on the text.","FontSize":"The option that determines the text display size.","FontStyle":"Determines the text display face that is inherited by the given font family.","FontWeight":"The option that determines the text display weight, or boldness."}},"AWS::QuickSight::Dashboard.FontSize":{"attributes":{},"description":"The option that determines the text display size.","properties":{"Relative":"The lexical name for the text size, proportional to its surrounding context."}},"AWS::QuickSight::Dashboard.FontWeight":{"attributes":{},"description":"The option that determines the text display weight, or boldness.","properties":{"Name":"The lexical name for the level of boldness of the text display."}},"AWS::QuickSight::Dashboard.ForecastComputation":{"attributes":{},"description":"The forecast computation configuration.","properties":{"ComputationId":"The ID for a computation.","CustomSeasonalityValue":"The custom seasonality value setup of a forecast computation.","LowerBoundary":"The lower boundary setup of a forecast computation.","Name":"The name of a computation.","PeriodsBackward":"The periods backward setup of a forecast computation.","PeriodsForward":"The periods forward setup of a forecast computation.","PredictionInterval":"The prediction interval setup of a forecast computation.","Seasonality":"The seasonality setup of a forecast computation. Choose one of the following options:\\n\\n- `AUTOMATIC`\\n- `CUSTOM` : Checks the custom seasonality value.","Time":"The time field that is used in a computation.","UpperBoundary":"The upper boundary setup of a forecast computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Dashboard.ForecastConfiguration":{"attributes":{},"description":"The forecast configuration that is used in a line chart\'s display properties.","properties":{"ForecastProperties":"The forecast properties setup of a forecast in the line chart.","Scenario":"The forecast scenario of a forecast in the line chart."}},"AWS::QuickSight::Dashboard.ForecastScenario":{"attributes":{},"description":"The forecast scenario of a forecast in the line chart.","properties":{"WhatIfPointScenario":"The what-if analysis forecast setup with the target date.","WhatIfRangeScenario":"The what-if analysis forecast setup with the date range."}},"AWS::QuickSight::Dashboard.FormatConfiguration":{"attributes":{},"description":"The formatting configuration for all types of field.","properties":{"DateTimeFormatConfiguration":"Formatting configuration for `DateTime` fields.","NumberFormatConfiguration":"Formatting configuration for number fields.","StringFormatConfiguration":"Formatting configuration for string fields."}},"AWS::QuickSight::Dashboard.FreeFormLayoutCanvasSizeOptions":{"attributes":{},"description":"Configuration options for the canvas of a free-form layout.","properties":{"ScreenCanvasSizeOptions":"The options that determine the sizing of the canvas used in a free-form layout."}},"AWS::QuickSight::Dashboard.FreeFormLayoutConfiguration":{"attributes":{},"description":"The configuration of a free-form layout.","properties":{"CanvasSizeOptions":"","Elements":"The elements that are included in a free-form layout."}},"AWS::QuickSight::Dashboard.FreeFormLayoutElement":{"attributes":{},"description":"An element within a free-form layout.","properties":{"BackgroundStyle":"The background style configuration of a free-form layout element.","BorderStyle":"The border style configuration of a free-form layout element.","ElementId":"A unique identifier for an element within a free-form layout.","ElementType":"The type of element.","Height":"The height of an element within a free-form layout.","LoadingAnimation":"The loading animation configuration of a free-form layout element.","RenderingRules":"The rendering rules that determine when an element should be displayed within a free-form layout.","SelectedBorderStyle":"The border style configuration of a free-form layout element. This border style is used when the element is selected.","Visibility":"The visibility of an element within a free-form layout.","Width":"The width of an element within a free-form layout.","XAxisLocation":"The x-axis coordinate of the element.","YAxisLocation":"The y-axis coordinate of the element."}},"AWS::QuickSight::Dashboard.FreeFormLayoutElementBackgroundStyle":{"attributes":{},"description":"The background style configuration of a free-form layout element.","properties":{"Color":"The background color of a free-form layout element.","Visibility":"The background visibility of a free-form layout element."}},"AWS::QuickSight::Dashboard.FreeFormLayoutElementBorderStyle":{"attributes":{},"description":"The background style configuration of a free-form layout element.","properties":{"Color":"The border color of a free-form layout element.","Visibility":"The border visibility of a free-form layout element."}},"AWS::QuickSight::Dashboard.FreeFormLayoutScreenCanvasSizeOptions":{"attributes":{},"description":"The options that determine the sizing of the canvas used in a free-form layout.","properties":{"OptimizedViewPortWidth":"The width that the view port will be optimized for when the layout renders."}},"AWS::QuickSight::Dashboard.FreeFormSectionLayoutConfiguration":{"attributes":{},"description":"The free-form layout configuration of a section.","properties":{"Elements":"The elements that are included in the free-form layout."}},"AWS::QuickSight::Dashboard.FunnelChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a `FunnelChartVisual` .","properties":{"Category":"The category field wells of a funnel chart. Values are grouped by category fields.","Values":"The value field wells of a funnel chart. Values are aggregated based on categories."}},"AWS::QuickSight::Dashboard.FunnelChartConfiguration":{"attributes":{},"description":"The configuration of a `FunnelChartVisual` .","properties":{"CategoryLabelOptions":"The label options of the categories that are displayed in a `FunnelChartVisual` .","DataLabelOptions":"The options that determine the presentation of the data labels.","FieldWells":"The field well configuration of a `FunnelChartVisual` .","SortConfiguration":"The sort configuration of a `FunnelChartVisual` .","Tooltip":"The tooltip configuration of a `FunnelChartVisual` .","ValueLabelOptions":"The label options for the values that are displayed in a `FunnelChartVisual` .","VisualPalette":"The visual palette configuration of a `FunnelChartVisual` ."}},"AWS::QuickSight::Dashboard.FunnelChartDataLabelOptions":{"attributes":{},"description":"The options that determine the presentation of the data labels.","properties":{"CategoryLabelVisibility":"The visibility of the category labels within the data labels.","LabelColor":"The color of the data label text.","LabelFontConfiguration":"The font configuration for the data labels.\\n\\nOnly the `FontSize` attribute of the font configuration is used for data labels.","MeasureDataLabelStyle":"Determines the style of the metric labels.","MeasureLabelVisibility":"The visibility of the measure labels within the data labels.","Position":"Determines the positioning of the data label relative to a section of the funnel.","Visibility":"The visibility option that determines if data labels are displayed."}},"AWS::QuickSight::Dashboard.FunnelChartFieldWells":{"attributes":{},"description":"The field well configuration of a `FunnelChartVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FunnelChartAggregatedFieldWells":"The field well configuration of a `FunnelChartVisual` ."}},"AWS::QuickSight::Dashboard.FunnelChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a `FunnelChartVisual` .","properties":{"CategoryItemsLimit":"The limit on the number of categories displayed.","CategorySort":"The sort configuration of the category fields."}},"AWS::QuickSight::Dashboard.FunnelChartVisual":{"attributes":{},"description":"A funnel chart.\\n\\nFor more information, see [Using funnel charts](https://docs.aws.amazon.com/quicksight/latest/user/funnel-visual-content.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a `FunnelChartVisual` .","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Dashboard.GaugeChartArcConditionalFormatting":{"attributes":{},"description":"The options that determine the presentation of the arc of a `GaugeChartVisual` .","properties":{"ForegroundColor":"The conditional formatting of the arc foreground color."}},"AWS::QuickSight::Dashboard.GaugeChartConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a `GaugeChartVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options of a `GaugeChartVisual` ."}},"AWS::QuickSight::Dashboard.GaugeChartConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options of a `GaugeChartVisual` .","properties":{"Arc":"The options that determine the presentation of the arc of a `GaugeChartVisual` .","PrimaryValue":"The conditional formatting for the primary value of a `GaugeChartVisual` ."}},"AWS::QuickSight::Dashboard.GaugeChartConfiguration":{"attributes":{},"description":"The configuration of a `GaugeChartVisual` .","properties":{"DataLabels":"The data label configuration of a `GaugeChartVisual` .","FieldWells":"The field well configuration of a `GaugeChartVisual` .","GaugeChartOptions":"The options that determine the presentation of the `GaugeChartVisual` .","TooltipOptions":"The tooltip configuration of a `GaugeChartVisual` .","VisualPalette":"The visual palette configuration of a `GaugeChartVisual` ."}},"AWS::QuickSight::Dashboard.GaugeChartFieldWells":{"attributes":{},"description":"The field well configuration of a `GaugeChartVisual` .","properties":{"TargetValues":"The target value field wells of a `GaugeChartVisual` .","Values":"The value field wells of a `GaugeChartVisual` ."}},"AWS::QuickSight::Dashboard.GaugeChartOptions":{"attributes":{},"description":"The options that determine the presentation of the `GaugeChartVisual` .","properties":{"Arc":"The arc configuration of a `GaugeChartVisual` .","ArcAxis":"The arc axis configuration of a `GaugeChartVisual` .","Comparison":"The comparison configuration of a `GaugeChartVisual` .","PrimaryValueDisplayType":"The options that determine the primary value display type.","PrimaryValueFontConfiguration":"The options that determine the primary value font configuration."}},"AWS::QuickSight::Dashboard.GaugeChartPrimaryValueConditionalFormatting":{"attributes":{},"description":"The conditional formatting for the primary value of a `GaugeChartVisual` .","properties":{"Icon":"The conditional formatting of the primary value icon.","TextColor":"The conditional formatting of the primary value text color."}},"AWS::QuickSight::Dashboard.GaugeChartVisual":{"attributes":{},"description":"A gauge chart.\\n\\nFor more information, see [Using gauge charts](https://docs.aws.amazon.com/quicksight/latest/user/gauge-chart.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a `GaugeChartVisual` .","ConditionalFormatting":"The conditional formatting of a `GaugeChartVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.GeospatialCoordinateBounds":{"attributes":{},"description":"The bound options (north, south, west, east) of the geospatial window options.","properties":{"East":"The longitude of the east bound of the geospatial coordinate bounds.","North":"The latitude of the north bound of the geospatial coordinate bounds.","South":"The latitude of the south bound of the geospatial coordinate bounds.","West":"The longitude of the west bound of the geospatial coordinate bounds."}},"AWS::QuickSight::Dashboard.GeospatialHeatmapColorScale":{"attributes":{},"description":"The color scale specification for the heatmap point style.","properties":{"Colors":"The list of colors to be used in heatmap point style."}},"AWS::QuickSight::Dashboard.GeospatialHeatmapConfiguration":{"attributes":{},"description":"The heatmap configuration of the geospatial point style.","properties":{"HeatmapColor":"The color scale specification for the heatmap point style."}},"AWS::QuickSight::Dashboard.GeospatialHeatmapDataColor":{"attributes":{},"description":"The color to be used in the heatmap point style.","properties":{"Color":"The hex color to be used in the heatmap point style."}},"AWS::QuickSight::Dashboard.GeospatialMapAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells for a geospatial map.","properties":{"Colors":"The color field wells of a geospatial map.","Geospatial":"The geospatial field wells of a geospatial map. Values are grouped by geospatial fields.","Values":"The size field wells of a geospatial map. Values are aggregated based on geospatial fields."}},"AWS::QuickSight::Dashboard.GeospatialMapConfiguration":{"attributes":{},"description":"The configuration of a `GeospatialMapVisual` .","properties":{"FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","MapStyleOptions":"The map style options of the geospatial map.","PointStyleOptions":"The point style options of the geospatial map.","Tooltip":"The tooltip display setup of the visual.","VisualPalette":"","WindowOptions":"The window options of the geospatial map."}},"AWS::QuickSight::Dashboard.GeospatialMapFieldWells":{"attributes":{},"description":"The field wells of a `GeospatialMapVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"GeospatialMapAggregatedFieldWells":"The aggregated field well for a geospatial map."}},"AWS::QuickSight::Dashboard.GeospatialMapStyleOptions":{"attributes":{},"description":"The map style options of the geospatial map.","properties":{"BaseMapStyle":"The base map style of the geospatial map."}},"AWS::QuickSight::Dashboard.GeospatialMapVisual":{"attributes":{},"description":"A geospatial map or a points on map visual.\\n\\nFor more information, see [Creating point maps](https://docs.aws.amazon.com/quicksight/latest/user/point-maps.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Dashboard.GeospatialPointStyleOptions":{"attributes":{},"description":"The point style of the geospatial map.","properties":{"ClusterMarkerConfiguration":"The cluster marker configuration of the geospatial point style.","HeatmapConfiguration":"The heatmap configuration of the geospatial point style.","SelectedPointStyle":"The selected point styles (point, cluster) of the geospatial map."}},"AWS::QuickSight::Dashboard.GeospatialWindowOptions":{"attributes":{},"description":"The window options of the geospatial map visual.","properties":{"Bounds":"The bounds options (north, south, west, east) of the geospatial window options.","MapZoomMode":"The map zoom modes (manual, auto) of the geospatial window options."}},"AWS::QuickSight::Dashboard.GlobalTableBorderOptions":{"attributes":{},"description":"Determines the border options for a table visual.","properties":{"SideSpecificBorder":"Determines the options for side specific border.","UniformBorder":"Determines the options for uniform border."}},"AWS::QuickSight::Dashboard.GradientColor":{"attributes":{},"description":"Determines the gradient color settings.","properties":{"Stops":"The list of gradient color stops."}},"AWS::QuickSight::Dashboard.GradientStop":{"attributes":{},"description":"Determines the gradient stop configuration.","properties":{"Color":"Determines the color.","DataValue":"Determines the data value.","GradientOffset":"Determines gradient offset value."}},"AWS::QuickSight::Dashboard.GridLayoutCanvasSizeOptions":{"attributes":{},"description":"Configuration options for the canvas of a grid layout.","properties":{"ScreenCanvasSizeOptions":"The options that determine the sizing of the canvas used in a grid layout."}},"AWS::QuickSight::Dashboard.GridLayoutConfiguration":{"attributes":{},"description":"The configuration for a grid layout. Also called a tiled layout.\\n\\nVisuals snap to a grid with standard spacing and alignment. Dashboards are displayed as designed, with options to fit to screen or view at actual size.","properties":{"CanvasSizeOptions":"","Elements":"The elements that are included in a grid layout."}},"AWS::QuickSight::Dashboard.GridLayoutElement":{"attributes":{},"description":"An element within a grid layout.","properties":{"ColumnIndex":"The column index for the upper left corner of an element.","ColumnSpan":"The width of a grid element expressed as a number of grid columns.","ElementId":"A unique identifier for an element within a grid layout.","ElementType":"The type of element.","RowIndex":"The row index for the upper left corner of an element.","RowSpan":"The height of a grid element expressed as a number of grid rows."}},"AWS::QuickSight::Dashboard.GridLayoutScreenCanvasSizeOptions":{"attributes":{},"description":"The options that determine the sizing of the canvas used in a grid layout.","properties":{"OptimizedViewPortWidth":"The width that the view port will be optimized for when the layout renders.","ResizeOption":"This value determines the layout behavior when the viewport is resized.\\n\\n- `FIXED` : A fixed width will be used when optimizing the layout. In the Amazon QuickSight console, this option is called `Classic` .\\n- `RESPONSIVE` : The width of the canvas will be responsive and optimized to the view port. In the Amazon QuickSight console, this option is called `Tiled` ."}},"AWS::QuickSight::Dashboard.GrowthRateComputation":{"attributes":{},"description":"The growth rate computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","PeriodSize":"The period size setup of a growth rate computation.","Time":"The time field that is used in a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Dashboard.HeaderFooterSectionConfiguration":{"attributes":{},"description":"The configuration of a header or footer section.","properties":{"Layout":"The layout configuration of the header or footer section.","SectionId":"The unique identifier of the header or footer section.","Style":"The style options of a header or footer section."}},"AWS::QuickSight::Dashboard.HeatMapAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a heat map.","properties":{"Columns":"The columns field well of a heat map.","Rows":"The rows field well of a heat map.","Values":"The values field well of a heat map."}},"AWS::QuickSight::Dashboard.HeatMapConfiguration":{"attributes":{},"description":"The configuration of a heat map.","properties":{"ColorScale":"The color options (gradient color, point of divergence) in a heat map.","ColumnLabelOptions":"The label options of the column that is displayed in a heat map.","DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","RowLabelOptions":"The label options of the row that is displayed in a `heat map` .","SortConfiguration":"The sort configuration of a heat map.","Tooltip":"The tooltip display setup of the visual."}},"AWS::QuickSight::Dashboard.HeatMapFieldWells":{"attributes":{},"description":"The field well configuration of a heat map.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"HeatMapAggregatedFieldWells":"The aggregated field wells of a heat map."}},"AWS::QuickSight::Dashboard.HeatMapSortConfiguration":{"attributes":{},"description":"The sort configuration of a heat map.","properties":{"HeatMapColumnItemsLimitConfiguration":"The limit on the number of columns that are displayed in a heat map.","HeatMapColumnSort":"The column sort configuration for heat map for columns that aren\'t a part of a field well.","HeatMapRowItemsLimitConfiguration":"The limit on the number of rows that are displayed in a heat map.","HeatMapRowSort":"The field sort configuration of the rows fields."}},"AWS::QuickSight::Dashboard.HeatMapVisual":{"attributes":{},"description":"A heat map.\\n\\nFor more information, see [Using heat maps](https://docs.aws.amazon.com/quicksight/latest/user/heat-map.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a heat map.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.HistogramAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a histogram.","properties":{"Values":"The value field wells of a histogram. Values are aggregated by `COUNT` or `DISTINCT_COUNT` ."}},"AWS::QuickSight::Dashboard.HistogramBinOptions":{"attributes":{},"description":"The options that determine the presentation of histogram bins.","properties":{"BinCount":"The options that determine the bin count of a histogram.","BinWidth":"The options that determine the bin width of a histogram.","SelectedBinType":"The options that determine the selected bin type.","StartValue":"The options that determine the bin start value."}},"AWS::QuickSight::Dashboard.HistogramConfiguration":{"attributes":{},"description":"The configuration for a `HistogramVisual` .","properties":{"BinOptions":"The options that determine the presentation of histogram bins.","DataLabels":"The data label configuration of a histogram.","FieldWells":"The field well configuration of a histogram.","Tooltip":"The tooltip configuration of a histogram.","VisualPalette":"The visual palette configuration of a histogram.","XAxisDisplayOptions":"The options that determine the presentation of the x-axis.","XAxisLabelOptions":"The options that determine the presentation of the x-axis label.","YAxisDisplayOptions":"The options that determine the presentation of the y-axis."}},"AWS::QuickSight::Dashboard.HistogramFieldWells":{"attributes":{},"description":"The field well configuration of a histogram.","properties":{"HistogramAggregatedFieldWells":"The field well configuration of a histogram."}},"AWS::QuickSight::Dashboard.HistogramVisual":{"attributes":{},"description":"A histogram.\\n\\nFor more information, see [Using histograms](https://docs.aws.amazon.com/quicksight/latest/user/histogram-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration for a `HistogramVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.InsightConfiguration":{"attributes":{},"description":"The configuration of an insight visual.","properties":{"Computations":"The computations configurations of the insight visual","CustomNarrative":"The custom narrative of the insight visual."}},"AWS::QuickSight::Dashboard.InsightVisual":{"attributes":{},"description":"An insight visual.\\n\\nFor more information, see [Working with insights](https://docs.aws.amazon.com/quicksight/latest/user/computational-insights.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","DataSetIdentifier":"The dataset that is used in the insight visual.","InsightConfiguration":"The configuration of an insight visual.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.IntegerDefaultValues":{"attributes":{},"description":"The default values of the `IntegerParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `IntegerDefaultValues` . Different defaults are displayed according to users, groups, and values mapping.","StaticValues":"The static values of the `IntegerDefaultValues` ."}},"AWS::QuickSight::Dashboard.IntegerParameter":{"attributes":{},"description":"An integer parameter.","properties":{"Name":"The name of the integer parameter.","Values":"The values for the integer parameter."}},"AWS::QuickSight::Dashboard.IntegerParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `Integer` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","ParameterValueType":"The value type determines whether the parameter is a single-value or multi-value parameter.","ValueWhenUnset":"A parameter declaration for the `Integer` data type."}},"AWS::QuickSight::Dashboard.IntegerValueWhenUnsetConfiguration":{"attributes":{},"description":"A parameter declaration for the `Integer` data type.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Dashboard.ItemsLimitConfiguration":{"attributes":{},"description":"The limit configuration of the visual display for an axis.","properties":{"ItemsLimit":"The limit on how many items of a field are showed in the chart. For example, the number of slices that are displayed in a pie chart.","OtherCategories":"The `Show other` of an axis in the chart. Choose one of the following options:\\n\\n- `INCLUDE`\\n- `EXCLUDE`"}},"AWS::QuickSight::Dashboard.KPIConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a KPI visual.","properties":{"ConditionalFormattingOptions":"The conditional formatting options of a KPI visual."}},"AWS::QuickSight::Dashboard.KPIConditionalFormattingOption":{"attributes":{},"description":"The conditional formatting options of a KPI visual.","properties":{"PrimaryValue":"The conditional formatting for the primary value of a KPI visual.","ProgressBar":"The conditional formatting for the progress bar of a KPI visual."}},"AWS::QuickSight::Dashboard.KPIConfiguration":{"attributes":{},"description":"The configuration of a KPI visual.","properties":{"FieldWells":"The field well configuration of a KPI visual.","KPIOptions":"The options that determine the presentation of a KPI visual.","SortConfiguration":"The sort configuration of a KPI visual."}},"AWS::QuickSight::Dashboard.KPIFieldWells":{"attributes":{},"description":"The field well configuration of a KPI visual.","properties":{"TargetValues":"The target value field wells of a KPI visual.","TrendGroups":"The trend group field wells of a KPI visual.","Values":"The value field wells of a KPI visual."}},"AWS::QuickSight::Dashboard.KPIOptions":{"attributes":{},"description":"The options that determine the presentation of a KPI visual.","properties":{"Comparison":"The comparison configuration of a KPI visual.","PrimaryValueDisplayType":"The options that determine the primary value display type.","PrimaryValueFontConfiguration":"The options that determine the primary value font configuration.","ProgressBar":"The options that determine the presentation of the progress bar of a KPI visual.","SecondaryValue":"The options that determine the presentation of the secondary value of a KPI visual.","SecondaryValueFontConfiguration":"The options that determine the secondary value font configuration.","TrendArrows":"The options that determine the presentation of trend arrows in a KPI visual."}},"AWS::QuickSight::Dashboard.KPIPrimaryValueConditionalFormatting":{"attributes":{},"description":"The conditional formatting for the primary value of a KPI visual.","properties":{"Icon":"The conditional formatting of the primary value\'s icon.","TextColor":"The conditional formatting of the primary value\'s text color."}},"AWS::QuickSight::Dashboard.KPIProgressBarConditionalFormatting":{"attributes":{},"description":"The conditional formatting for the progress bar of a KPI visual.","properties":{"ForegroundColor":"The conditional formatting of the progress bar\'s foreground color."}},"AWS::QuickSight::Dashboard.KPISortConfiguration":{"attributes":{},"description":"The sort configuration of a KPI visual.","properties":{"TrendGroupSort":"The sort configuration of the trend group fields."}},"AWS::QuickSight::Dashboard.KPIVisual":{"attributes":{},"description":"A key performance indicator (KPI).\\n\\nFor more information, see [Using KPIs](https://docs.aws.amazon.com/quicksight/latest/user/kpi.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a KPI visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","ConditionalFormatting":"The conditional formatting of a KPI visual.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.LabelOptions":{"attributes":{},"description":"The share label options for the labels.","properties":{"CustomLabel":"The text for the label.","FontConfiguration":"The font configuration of the label.","Visibility":"Determines whether or not the label is visible."}},"AWS::QuickSight::Dashboard.Layout":{"attributes":{},"description":"A `Layout` defines the placement of elements within a sheet.\\n\\nFor more information, see [Types of layout](https://docs.aws.amazon.com/quicksight/latest/user/types-of-layout.html) in the *Amazon QuickSight User Guide* .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Configuration":"The configuration that determines what the type of layout for a sheet."}},"AWS::QuickSight::Dashboard.LayoutConfiguration":{"attributes":{},"description":"The configuration that determines what the type of layout will be used on a sheet.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FreeFormLayout":"A free-form is optimized for a fixed width and has more control over the exact placement of layout elements.","GridLayout":"A type of layout that can be used on a sheet. In a grid layout, visuals snap to a grid with standard spacing and alignment. Dashboards are displayed as designed, with options to fit to screen or view at actual size. A grid layout can be configured to behave in one of two ways when the viewport is resized: `FIXED` or `RESPONSIVE` .","SectionBasedLayout":"A section based layout organizes visuals into multiple sections and has customized header, footer and page break."}},"AWS::QuickSight::Dashboard.LegendOptions":{"attributes":{},"description":"The options for the legend setup of a visual.","properties":{"Height":"The height of the legend. If this value is omitted, a default height is used when rendering.","Position":"The positions for the legend. Choose one of the following options:\\n\\n- `AUTO`\\n- `RIGHT`\\n- `BOTTOM`\\n- `LEFT`","Title":"The custom title for the legend.","Visibility":"Determines whether or not the legend is visible.","Width":"The width of the legend. If this value is omitted, a default width is used when rendering."}},"AWS::QuickSight::Dashboard.LineChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a line chart.","properties":{"Category":"The category field wells of a line chart. Values are grouped by category fields.","Colors":"The color field wells of a line chart. Values are grouped by category fields.","SmallMultiples":"The small multiples field well of a line chart.","Values":"The value field wells of a line chart. Values are aggregated based on categories."}},"AWS::QuickSight::Dashboard.LineChartConfiguration":{"attributes":{},"description":"The configuration of a line chart.","properties":{"ContributionAnalysisDefaults":"The default configuration of a line chart\'s contribution analysis.","DataLabels":"The data label configuration of a line chart.","DefaultSeriesSettings":"The options that determine the default presentation of all line series in `LineChartVisual` .","FieldWells":"The field well configuration of a line chart.","ForecastConfigurations":"The forecast configuration of a line chart.","Legend":"The legend configuration of a line chart.","PrimaryYAxisDisplayOptions":"The series axis configuration of a line chart.","PrimaryYAxisLabelOptions":"The options that determine the presentation of the y-axis label.","ReferenceLines":"The reference lines configuration of a line chart.","SecondaryYAxisDisplayOptions":"The series axis configuration of a line chart.","SecondaryYAxisLabelOptions":"The options that determine the presentation of the secondary y-axis label.","Series":"The series item configuration of a line chart.","SmallMultiplesOptions":"The small multiples setup for the visual.","SortConfiguration":"The sort configuration of a line chart.","Tooltip":"The tooltip configuration of a line chart.","Type":"Determines the type of the line chart.","VisualPalette":"The visual palette configuration of a line chart.","XAxisDisplayOptions":"The options that determine the presentation of the x-axis.","XAxisLabelOptions":"The options that determine the presentation of the x-axis label."}},"AWS::QuickSight::Dashboard.LineChartDefaultSeriesSettings":{"attributes":{},"description":"The options that determine the default presentation of all line series in `LineChartVisual` .","properties":{"AxisBinding":"The axis to which you are binding all line series to.","LineStyleSettings":"Line styles options for all line series in the visual.","MarkerStyleSettings":"Marker styles options for all line series in the visual."}},"AWS::QuickSight::Dashboard.LineChartFieldWells":{"attributes":{},"description":"The field well configuration of a line chart.","properties":{"LineChartAggregatedFieldWells":"The field well configuration of a line chart."}},"AWS::QuickSight::Dashboard.LineChartLineStyleSettings":{"attributes":{},"description":"Line styles options for a line series in `LineChartVisual` .","properties":{"LineInterpolation":"Interpolation style for line series.\\n\\n- `LINEAR` : Show as default, linear style.\\n- `SMOOTH` : Show as a smooth curve.\\n- `STEPPED` : Show steps in line.","LineStyle":"Line style for line series.\\n\\n- `SOLID` : Show as a solid line.\\n- `DOTTED` : Show as a dotted line.\\n- `DASHED` : Show as a dashed line.","LineVisibility":"Configuration option that determines whether to show the line for the series.","LineWidth":"Width that determines the line thickness."}},"AWS::QuickSight::Dashboard.LineChartMarkerStyleSettings":{"attributes":{},"description":"Marker styles options for a line series in `LineChartVisual` .","properties":{"MarkerColor":"Color of marker in the series.","MarkerShape":"Shape option for markers in the series.\\n\\n- `CIRCLE` : Show marker as a circle.\\n- `TRIANGLE` : Show marker as a triangle.\\n- `SQUARE` : Show marker as a square.\\n- `DIAMOND` : Show marker as a diamond.\\n- `ROUNDED_SQUARE` : Show marker as a rounded square.","MarkerSize":"Size of marker in the series.","MarkerVisibility":"Configuration option that determines whether to show the markers in the series."}},"AWS::QuickSight::Dashboard.LineChartSeriesSettings":{"attributes":{},"description":"The options that determine the presentation of a line series in the visual","properties":{"LineStyleSettings":"Line styles options for a line series in `LineChartVisual` .","MarkerStyleSettings":"Marker styles options for a line series in `LineChartVisual` ."}},"AWS::QuickSight::Dashboard.LineChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a line chart.","properties":{"CategoryItemsLimitConfiguration":"The limit on the number of categories that are displayed in a line chart.","CategorySort":"The sort configuration of the category fields.","ColorItemsLimitConfiguration":"The limit on the number of lines that are displayed in a line chart.","SmallMultiplesLimitConfiguration":"The limit on the number of small multiples panels that are displayed.","SmallMultiplesSort":"The sort configuration of the small multiples field."}},"AWS::QuickSight::Dashboard.LineChartVisual":{"attributes":{},"description":"A line chart.\\n\\nFor more information, see [Using line charts](https://docs.aws.amazon.com/quicksight/latest/user/line-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a line chart.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.LineSeriesAxisDisplayOptions":{"attributes":{},"description":"The series axis configuration of a line chart.","properties":{"AxisOptions":"The options that determine the presentation of the line series axis.","MissingDataConfigurations":"The configuration options that determine how missing data is treated during the rendering of a line chart."}},"AWS::QuickSight::Dashboard.ListControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"SearchOptions":"The configuration of the search options in a list control.","SelectAllOptions":"The configuration of the `Select all` options in a list control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Dashboard.ListControlSearchOptions":{"attributes":{},"description":"The configuration of the search options in a list control.","properties":{"Visibility":"The visibility configuration of the search options in a list control."}},"AWS::QuickSight::Dashboard.ListControlSelectAllOptions":{"attributes":{},"description":"The configuration of the `Select all` options in a list control.","properties":{"Visibility":"The visibility configuration of the `Select all` options in a list control."}},"AWS::QuickSight::Dashboard.LoadingAnimation":{"attributes":{},"description":"The configuration of loading animation in free-form layout.","properties":{"Visibility":"The visibility configuration of `LoadingAnimation` ."}},"AWS::QuickSight::Dashboard.LocalNavigationConfiguration":{"attributes":{},"description":"The navigation configuration for `CustomActionNavigationOperation` .","properties":{"TargetSheetId":"The sheet that is targeted for navigation in the same analysis."}},"AWS::QuickSight::Dashboard.LongFormatText":{"attributes":{},"description":"The text format for a subtitle.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PlainText":"Plain text format.","RichText":"Rich text. Examples of rich text include bold, underline, and italics."}},"AWS::QuickSight::Dashboard.MappedDataSetParameter":{"attributes":{},"description":"A dataset parameter that is mapped to an analysis parameter.","properties":{"DataSetIdentifier":"A unique name that identifies a dataset within the analysis or dashboard.","DataSetParameterName":"The name of the dataset parameter."}},"AWS::QuickSight::Dashboard.MaximumLabelType":{"attributes":{},"description":"The maximum label of a data path label.","properties":{"Visibility":"The visibility of the maximum label."}},"AWS::QuickSight::Dashboard.MaximumMinimumComputation":{"attributes":{},"description":"The maximum and minimum computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","Time":"The time field that is used in a computation.","Type":"The type of computation. Choose one of the following options:\\n\\n- MAXIMUM: A maximum computation.\\n- MINIMUM: A minimum computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Dashboard.MeasureField":{"attributes":{},"description":"The measure (metric) type field.","properties":{"CalculatedMeasureField":"The calculated measure field only used in pivot tables.","CategoricalMeasureField":"The measure type field with categorical type columns.","DateMeasureField":"The measure type field with date type columns.","NumericalMeasureField":"The measure type field with numerical type columns."}},"AWS::QuickSight::Dashboard.MetricComparisonComputation":{"attributes":{},"description":"The metric comparison computation configuration.","properties":{"ComputationId":"The ID for a computation.","FromValue":"The field that is used in a metric comparison from value setup.","Name":"The name of a computation.","TargetValue":"The field that is used in a metric comparison to value setup.","Time":"The time field that is used in a computation."}},"AWS::QuickSight::Dashboard.MinimumLabelType":{"attributes":{},"description":"The minimum label of a data path label.","properties":{"Visibility":"The visibility of the minimum label."}},"AWS::QuickSight::Dashboard.MissingDataConfiguration":{"attributes":{},"description":"The configuration options that determine how missing data is treated during the rendering of a line chart.","properties":{"TreatmentOption":"The treatment option that determines how missing data should be rendered. Choose from the following options:\\n\\n- `INTERPOLATE` : Interpolate missing values between the prior and the next known value.\\n- `SHOW_AS_ZERO` : Show missing values as the value `0` .\\n- `SHOW_AS_BLANK` : Display a blank space when rendering missing data."}},"AWS::QuickSight::Dashboard.NegativeValueConfiguration":{"attributes":{},"description":"The options that determine the negative value configuration.","properties":{"DisplayMode":"Determines the display mode of the negative value configuration."}},"AWS::QuickSight::Dashboard.NullValueFormatConfiguration":{"attributes":{},"description":"The options that determine the null value format configuration.","properties":{"NullString":"Determines the null string of null values."}},"AWS::QuickSight::Dashboard.NumberDisplayFormatConfiguration":{"attributes":{},"description":"The options that determine the number display format configuration.","properties":{"DecimalPlacesConfiguration":"The option that determines the decimal places configuration.","NegativeValueConfiguration":"The options that determine the negative value configuration.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumberScale":"Determines the number scale value of the number format.","Prefix":"Determines the prefix value of the number format.","SeparatorConfiguration":"The options that determine the numeric separator configuration.","Suffix":"Determines the suffix value of the number format."}},"AWS::QuickSight::Dashboard.NumberFormatConfiguration":{"attributes":{},"description":"Formatting configuration for number fields.","properties":{"FormatConfiguration":"The options that determine the numeric format configuration."}},"AWS::QuickSight::Dashboard.NumericAxisOptions":{"attributes":{},"description":"The options for an axis with a numeric field.","properties":{"Range":"The range setup of a numeric axis.","Scale":"The scale setup of a numeric axis."}},"AWS::QuickSight::Dashboard.NumericEqualityDrillDownFilter":{"attributes":{},"description":"The category drill down filter.","properties":{"Column":"The column that the filter is applied to.","Value":"The value of the double input numeric drill down filter."}},"AWS::QuickSight::Dashboard.NumericEqualityFilter":{"attributes":{},"description":"A `NumericEqualityFilter` filters values that are equal to the specified value.","properties":{"AggregationFunction":"The aggregation function of the filter.","Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","MatchOperator":"The match operator that is used to determine if a filter should be applied.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","ParameterName":"The parameter whose value should be used for the filter value.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`","Value":"The input value."}},"AWS::QuickSight::Dashboard.NumericFormatConfiguration":{"attributes":{},"description":"The options that determine the numeric format configuration.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CurrencyDisplayFormatConfiguration":"The options that determine the currency display format configuration.","NumberDisplayFormatConfiguration":"The options that determine the number display format configuration.","PercentageDisplayFormatConfiguration":"The options that determine the percentage display format configuration."}},"AWS::QuickSight::Dashboard.NumericRangeFilter":{"attributes":{},"description":"A `NumericRangeFilter` filters values that are within the value range.","properties":{"AggregationFunction":"The aggregation function of the filter.","Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","IncludeMaximum":"Determines whether the maximum value in the filter value range should be included in the filtered results.","IncludeMinimum":"Determines whether the minimum value in the filter value range should be included in the filtered results.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","RangeMaximum":"The maximum value for the filter value range.","RangeMinimum":"The minimum value for the filter value range.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Dashboard.NumericRangeFilterValue":{"attributes":{},"description":"The value input pf the numeric range filter.","properties":{"Parameter":"The parameter that is used in the numeric range.","StaticValue":"The static value of the numeric range filter."}},"AWS::QuickSight::Dashboard.NumericSeparatorConfiguration":{"attributes":{},"description":"The options that determine the numeric separator configuration.","properties":{"DecimalSeparator":"Determines the decimal separator.","ThousandsSeparator":"The options that determine the thousands separator configuration."}},"AWS::QuickSight::Dashboard.NumericalAggregationFunction":{"attributes":{},"description":"Aggregation for numerical values.","properties":{"PercentileAggregation":"An aggregation based on the percentile of values in a dimension or measure.","SimpleNumericalAggregation":"Built-in aggregation functions for numerical values.\\n\\n- `SUM` : The sum of a dimension or measure.\\n- `AVERAGE` : The average of a dimension or measure.\\n- `MIN` : The minimum value of a dimension or measure.\\n- `MAX` : The maximum value of a dimension or measure.\\n- `COUNT` : The count of a dimension or measure.\\n- `DISTINCT_COUNT` : The count of distinct values in a dimension or measure.\\n- `VAR` : The variance of a dimension or measure.\\n- `VARP` : The partitioned variance of a dimension or measure.\\n- `STDEV` : The standard deviation of a dimension or measure.\\n- `STDEVP` : The partitioned standard deviation of a dimension or measure.\\n- `MEDIAN` : The median value of a dimension or measure."}},"AWS::QuickSight::Dashboard.NumericalDimensionField":{"attributes":{},"description":"The dimension type field with numerical type columns.","properties":{"Column":"The column that is used in the `NumericalDimensionField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field.","HierarchyId":"The custom hierarchy ID."}},"AWS::QuickSight::Dashboard.NumericalMeasureField":{"attributes":{},"description":"The measure type field with numerical type columns.","properties":{"AggregationFunction":"The aggregation function of the measure field.","Column":"The column that is used in the `NumericalMeasureField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Dashboard.PaginationConfiguration":{"attributes":{},"description":"The pagination configuration for a table visual or boxplot.","properties":{"PageNumber":"Indicates the page number.","PageSize":"Indicates how many items render in one page."}},"AWS::QuickSight::Dashboard.PanelConfiguration":{"attributes":{},"description":"A collection of options that configure how each panel displays in a small multiples chart.","properties":{"BackgroundColor":"Sets the background color for each panel.","BackgroundVisibility":"Determines whether or not a background for each small multiples panel is rendered.","BorderColor":"Sets the line color of panel borders.","BorderStyle":"Sets the line style of panel borders.","BorderThickness":"Sets the line thickness of panel borders.","BorderVisibility":"Determines whether or not each panel displays a border.","GutterSpacing":"Sets the total amount of negative space to display between sibling panels.","GutterVisibility":"Determines whether or not negative space between sibling panels is rendered.","Title":"Configures the title display within each small multiples panel."}},"AWS::QuickSight::Dashboard.PanelTitleOptions":{"attributes":{},"description":"The options that determine the title styles for each small multiples panel.","properties":{"FontConfiguration":"","HorizontalTextAlignment":"Sets the horizontal text alignment of the title within each panel.","Visibility":"Determines whether or not panel titles are displayed."}},"AWS::QuickSight::Dashboard.ParameterControl":{"attributes":{},"description":"The control of a parameter that users can interact with in a dashboard or an analysis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimePicker":"A control from a date parameter that specifies date and time.","Dropdown":"A control to display a dropdown list with buttons that are used to select a single value.","List":"A control to display a list with buttons or boxes that are used to select either a single value or multiple values.","Slider":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","TextArea":"A control to display a text box that is used to enter multiple entries.","TextField":"A control to display a text box that is used to enter a single entry."}},"AWS::QuickSight::Dashboard.ParameterDateTimePickerControl":{"attributes":{},"description":"A control from a date parameter that specifies date and time.","properties":{"DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterDateTimePickerControl` .","SourceParameterName":"The name of the `ParameterDateTimePickerControl` .","Title":"The title of the `ParameterDateTimePickerControl` ."}},"AWS::QuickSight::Dashboard.ParameterDeclaration":{"attributes":{},"description":"The declaration definition of a parameter.\\n\\nFor more information, see [Parameters in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/parameters-in-quicksight.html) in the *Amazon QuickSight User Guide* .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimeParameterDeclaration":"A parameter declaration for the `DateTime` data type.","DecimalParameterDeclaration":"A parameter declaration for the `Decimal` data type.","IntegerParameterDeclaration":"A parameter declaration for the `Integer` data type.","StringParameterDeclaration":"A parameter declaration for the `String` data type."}},"AWS::QuickSight::Dashboard.ParameterDropDownControl":{"attributes":{},"description":"A control to display a dropdown list with buttons that are used to select a single value.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterDropDownControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceParameterName":"The source parameter name of the `ParameterDropDownControl` .","Title":"The title of the `ParameterDropDownControl` .","Type":"The type parameter name of the `ParameterDropDownControl` ."}},"AWS::QuickSight::Dashboard.ParameterListControl":{"attributes":{},"description":"A control to display a list with buttons or boxes that are used to select either a single value or multiple values.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterListControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceParameterName":"The source parameter name of the `ParameterListControl` .","Title":"The title of the `ParameterListControl` .","Type":"The type of `ParameterListControl` ."}},"AWS::QuickSight::Dashboard.ParameterSelectableValues":{"attributes":{},"description":"A list of selectable values that are used in a control.","properties":{"LinkToDataSetColumn":"The column identifier that fetches values from the data set.","Values":"The values that are used in `ParameterSelectableValues` ."}},"AWS::QuickSight::Dashboard.ParameterSliderControl":{"attributes":{},"description":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","properties":{"DisplayOptions":"The display options of a control.","MaximumValue":"The smaller value that is displayed at the left of the slider.","MinimumValue":"The larger value that is displayed at the right of the slider.","ParameterControlId":"The ID of the `ParameterSliderControl` .","SourceParameterName":"The source parameter name of the `ParameterSliderControl` .","StepSize":"The number of increments that the slider bar is divided into.","Title":"The title of the `ParameterSliderControl` ."}},"AWS::QuickSight::Dashboard.ParameterTextAreaControl":{"attributes":{},"description":"A control to display a text box that is used to enter multiple entries.","properties":{"Delimiter":"The delimiter that is used to separate the lines in text.","DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterTextAreaControl` .","SourceParameterName":"The source parameter name of the `ParameterTextAreaControl` .","Title":"The title of the `ParameterTextAreaControl` ."}},"AWS::QuickSight::Dashboard.ParameterTextFieldControl":{"attributes":{},"description":"A control to display a text box that is used to enter a single entry.","properties":{"DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterTextFieldControl` .","SourceParameterName":"The source parameter name of the `ParameterTextFieldControl` .","Title":"The title of the `ParameterTextFieldControl` ."}},"AWS::QuickSight::Dashboard.Parameters":{"attributes":{},"description":"A list of Amazon QuickSight parameters and the list\'s override values.","properties":{"DateTimeParameters":"The parameters that have a data type of date-time.","DecimalParameters":"The parameters that have a data type of decimal.","IntegerParameters":"The parameters that have a data type of integer.","StringParameters":"The parameters that have a data type of string."}},"AWS::QuickSight::Dashboard.PercentVisibleRange":{"attributes":{},"description":"The percent range in the visible range.","properties":{"From":"The lower bound of the range.","To":"The top bound of the range."}},"AWS::QuickSight::Dashboard.PercentageDisplayFormatConfiguration":{"attributes":{},"description":"The options that determine the percentage display format configuration.","properties":{"DecimalPlacesConfiguration":"The option that determines the decimal places configuration.","NegativeValueConfiguration":"The options that determine the negative value configuration.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","Prefix":"Determines the prefix value of the percentage format.","SeparatorConfiguration":"The options that determine the numeric separator configuration.","Suffix":"Determines the suffix value of the percentage format."}},"AWS::QuickSight::Dashboard.PercentileAggregation":{"attributes":{},"description":"An aggregation based on the percentile of values in a dimension or measure.","properties":{"PercentileValue":"The percentile value. This value can be any numeric constant 0–100. A percentile value of 50 computes the median value of the measure."}},"AWS::QuickSight::Dashboard.PeriodOverPeriodComputation":{"attributes":{},"description":"The period over period computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","Time":"The time field that is used in a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Dashboard.PeriodToDateComputation":{"attributes":{},"description":"The period to date computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","PeriodTimeGranularity":"The time granularity setup of period to date computation. Choose from the following options:\\n\\n- YEAR: Year to date.\\n- MONTH: Month to date.","Time":"The time field that is used in a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Dashboard.PieChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a pie chart.","properties":{"Category":"The category (group/color) field wells of a pie chart.","SmallMultiples":"The small multiples field well of a pie chart.","Values":"The value field wells of a pie chart. Values are aggregated based on categories."}},"AWS::QuickSight::Dashboard.PieChartConfiguration":{"attributes":{},"description":"The configuration of a pie chart.","properties":{"CategoryLabelOptions":"The label options of the group/color that is displayed in a pie chart.","ContributionAnalysisDefaults":"The contribution analysis (anomaly configuration) setup of the visual.","DataLabels":"The options that determine if visual data labels are displayed.","DonutOptions":"The options that determine the shape of the chart. This option determines whether the chart is a pie chart or a donut chart.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","SmallMultiplesOptions":"The small multiples setup for the visual.","SortConfiguration":"The sort configuration of a pie chart.","Tooltip":"The tooltip display setup of the visual.","ValueLabelOptions":"The label options for the value that is displayed in a pie chart.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Dashboard.PieChartFieldWells":{"attributes":{},"description":"The field well configuration of a pie chart.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PieChartAggregatedFieldWells":"The field well configuration of a pie chart."}},"AWS::QuickSight::Dashboard.PieChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a pie chart.","properties":{"CategoryItemsLimit":"The limit on the number of categories that are displayed in a pie chart.","CategorySort":"The sort configuration of the category fields.","SmallMultiplesLimitConfiguration":"The limit on the number of small multiples panels that are displayed.","SmallMultiplesSort":"The sort configuration of the small multiples field."}},"AWS::QuickSight::Dashboard.PieChartVisual":{"attributes":{},"description":"A pie or donut chart.\\n\\nThe `PieChartVisual` structure describes a visual that is a member of the pie chart family.\\n\\nThe following charts can be described by using this structure:\\n\\n- Pie charts\\n- Donut charts\\n\\nFor more information, see [Using pie charts](https://docs.aws.amazon.com/quicksight/latest/user/pie-chart.html) in the *Amazon QuickSight User Guide* .\\n\\nFor more information, see [Using donut charts](https://docs.aws.amazon.com/quicksight/latest/user/donut-chart.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a pie chart.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.PivotFieldSortOptions":{"attributes":{},"description":"The field sort options for a pivot table sort configuration.","properties":{"FieldId":"The field ID for the field sort options.","SortBy":"The sort by field for the field sort options."}},"AWS::QuickSight::Dashboard.PivotTableAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well for the pivot table.","properties":{"Columns":"The columns field well for a pivot table. Values are grouped by columns fields.","Rows":"The rows field well for a pivot table. Values are grouped by rows fields.","Values":"The values field well for a pivot table. Values are aggregated based on rows and columns fields."}},"AWS::QuickSight::Dashboard.PivotTableCellConditionalFormatting":{"attributes":{},"description":"The cell conditional formatting option for a pivot table.","properties":{"FieldId":"The field ID of the cell for conditional formatting.","Scope":"The scope of the cell for conditional formatting.","Scopes":"A list of cell scopes for conditional formatting.","TextFormat":"The text format of the cell for conditional formatting."}},"AWS::QuickSight::Dashboard.PivotTableConditionalFormatting":{"attributes":{},"description":"The conditional formatting for a `PivotTableVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options for a `PivotTableVisual` ."}},"AWS::QuickSight::Dashboard.PivotTableConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options for a `PivotTableVisual` .","properties":{"Cell":"The cell conditional formatting option for a pivot table."}},"AWS::QuickSight::Dashboard.PivotTableConditionalFormattingScope":{"attributes":{},"description":"The scope of the cell for conditional formatting.","properties":{"Role":"The role (field, field total, grand total) of the cell for conditional formatting."}},"AWS::QuickSight::Dashboard.PivotTableConfiguration":{"attributes":{},"description":"The configuration for a `PivotTableVisual` .","properties":{"FieldOptions":"The field options for a pivot table visual.","FieldWells":"The field wells of the visual.","PaginatedReportOptions":"The paginated report options for a pivot table visual.","SortConfiguration":"The sort configuration for a `PivotTableVisual` .","TableOptions":"The table options for a pivot table visual.","TotalOptions":"The total options for a pivot table visual."}},"AWS::QuickSight::Dashboard.PivotTableDataPathOption":{"attributes":{},"description":"The data path options for the pivot table field options.","properties":{"DataPathList":"The list of data path values for the data path options.","Width":"The width of the data path option."}},"AWS::QuickSight::Dashboard.PivotTableFieldCollapseStateOption":{"attributes":{},"description":"The collapse state options for the pivot table field options.","properties":{"State":"The state of the field target of a pivot table. Choose one of the following options:\\n\\n- `COLLAPSED`\\n- `EXPANDED`","Target":"A tagged-union object that sets the collapse state."}},"AWS::QuickSight::Dashboard.PivotTableFieldCollapseStateTarget":{"attributes":{},"description":"The target of a pivot table field collapse state.","properties":{"FieldDataPathValues":"The data path of the pivot table\'s header. Used to set the collapse state.","FieldId":"The field ID of the pivot table that the collapse state needs to be set to."}},"AWS::QuickSight::Dashboard.PivotTableFieldOption":{"attributes":{},"description":"The selected field options for the pivot table field options.","properties":{"CustomLabel":"The custom label of the pivot table field.","FieldId":"The field ID of the pivot table field.","Visibility":"The visibility of the pivot table field."}},"AWS::QuickSight::Dashboard.PivotTableFieldOptions":{"attributes":{},"description":"The field options for a pivot table visual.","properties":{"CollapseStateOptions":"The collapse state options for the pivot table field options.","DataPathOptions":"The data path options for the pivot table field options.","SelectedFieldOptions":"The selected field options for the pivot table field options."}},"AWS::QuickSight::Dashboard.PivotTableFieldSubtotalOptions":{"attributes":{},"description":"The optional configuration of subtotals cells.","properties":{"FieldId":"The field ID of the subtotal options."}},"AWS::QuickSight::Dashboard.PivotTableFieldWells":{"attributes":{},"description":"The field wells for a pivot table visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PivotTableAggregatedFieldWells":"The aggregated field well for the pivot table."}},"AWS::QuickSight::Dashboard.PivotTableOptions":{"attributes":{},"description":"The table options for a pivot table visual.","properties":{"CellStyle":"The table cell style of cells.","CollapsedRowDimensionsVisibility":"The visibility setting of a pivot table\'s collapsed row dimension fields. If the value of this structure is `HIDDEN` , all collapsed columns in a pivot table are automatically hidden. The default value is `VISIBLE` .","ColumnHeaderStyle":"The table cell style of the column header.","ColumnNamesVisibility":"The visibility of the column names.","MetricPlacement":"The metric placement (row, column) options.","RowAlternateColorOptions":"The row alternate color options (widget status, row alternate colors).","RowFieldNamesStyle":"The table cell style of row field names.","RowHeaderStyle":"The table cell style of the row headers.","SingleMetricVisibility":"The visibility of the single metric options.","ToggleButtonsVisibility":"Determines the visibility of the pivot table."}},"AWS::QuickSight::Dashboard.PivotTablePaginatedReportOptions":{"attributes":{},"description":"The paginated report options for a pivot table visual.","properties":{"OverflowColumnHeaderVisibility":"The visibility of the repeating header rows on each page.","VerticalOverflowVisibility":"The visibility of the printing table overflow across pages."}},"AWS::QuickSight::Dashboard.PivotTableSortBy":{"attributes":{},"description":"The sort by field for the field sort options.","properties":{"Column":"The column sort (field id, direction) for the pivot table sort by options.","DataPath":"The data path sort (data path value, direction) for the pivot table sort by options.","Field":"The field sort (field id, direction) for the pivot table sort by options."}},"AWS::QuickSight::Dashboard.PivotTableSortConfiguration":{"attributes":{},"description":"The sort configuration for a `PivotTableVisual` .","properties":{"FieldSortOptions":"The field sort options for a pivot table sort configuration."}},"AWS::QuickSight::Dashboard.PivotTableTotalOptions":{"attributes":{},"description":"The total options for a pivot table visual.","properties":{"ColumnSubtotalOptions":"The column subtotal options.","ColumnTotalOptions":"The column total options.","RowSubtotalOptions":"The row subtotal options.","RowTotalOptions":"The row total options."}},"AWS::QuickSight::Dashboard.PivotTableVisual":{"attributes":{},"description":"A pivot table.\\n\\nFor more information, see [Using pivot tables](https://docs.aws.amazon.com/quicksight/latest/user/pivot-table.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ConditionalFormatting":"The conditional formatting for a `PivotTableVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Dashboard.PivotTotalOptions":{"attributes":{},"description":"The optional configuration of totals cells in a `PivotTableVisual` .","properties":{"CustomLabel":"The custom label string for the total cells.","MetricHeaderCellStyle":"The cell styling options for the total of header cells.","Placement":"The placement (start, end) for the total cells.","ScrollStatus":"The scroll status (pinned, scrolled) for the total cells.","TotalCellStyle":"The cell styling options for the total cells.","TotalsVisibility":"The visibility configuration for the total cells.","ValueCellStyle":"The cell styling options for the totals of value cells."}},"AWS::QuickSight::Dashboard.PredefinedHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of the fields that are defined during data preparation. These fields are available to use in any analysis that uses the data source.","properties":{"Columns":"The list of columns that define the predefined hierarchy.","DrillDownFilters":"The option that determines the drill down filters for the predefined hierarchy.","HierarchyId":"The hierarchy ID of the predefined hierarchy."}},"AWS::QuickSight::Dashboard.ProgressBarOptions":{"attributes":{},"description":"The options that determine the presentation of the progress bar of a KPI visual.","properties":{"Visibility":"The visibility of the progress bar."}},"AWS::QuickSight::Dashboard.RadarChartAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well configuration of a `RadarChartVisual` .","properties":{"Category":"The aggregated field well categories of a radar chart.","Color":"The color that are assigned to the aggregated field wells of a radar chart.","Values":"The values that are assigned to the aggregated field wells of a radar chart."}},"AWS::QuickSight::Dashboard.RadarChartAreaStyleSettings":{"attributes":{},"description":"The configured style settings of a radar chart.","properties":{"Visibility":"The visibility settings of a radar chart."}},"AWS::QuickSight::Dashboard.RadarChartConfiguration":{"attributes":{},"description":"The configuration of a `RadarChartVisual` .","properties":{"AlternateBandColorsVisibility":"Determines the visibility of the colors of alternatign bands in a radar chart.","AlternateBandEvenColor":"The color of the even-numbered alternate bands of a radar chart.","AlternateBandOddColor":"The color of the odd-numbered alternate bands of a radar chart.","AxesRangeScale":"The axis behavior options of a radar chart.","BaseSeriesSettings":"The base sreies settings of a radar chart.","CategoryAxis":"The category axis of a radar chart.","CategoryLabelOptions":"The category label options of a radar chart.","ColorAxis":"The color axis of a radar chart.","ColorLabelOptions":"The color label options of a radar chart.","FieldWells":"The field well configuration of a `RadarChartVisual` .","Legend":"The legend display setup of the visual.","Shape":"The shape of the radar chart.","SortConfiguration":"The sort configuration of a `RadarChartVisual` .","StartAngle":"The start angle of a radar chart\'s axis.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Dashboard.RadarChartFieldWells":{"attributes":{},"description":"The field wells of a radar chart visual.","properties":{"RadarChartAggregatedFieldWells":"The aggregated field wells of a radar chart visual."}},"AWS::QuickSight::Dashboard.RadarChartSeriesSettings":{"attributes":{},"description":"The series settings of a radar chart.","properties":{"AreaStyleSettings":"The area style settings of a radar chart."}},"AWS::QuickSight::Dashboard.RadarChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a `RadarChartVisual` .","properties":{"CategoryItemsLimit":"The category items limit for a radar chart.","CategorySort":"The category sort options of a radar chart.","ColorItemsLimit":"The color items limit of a radar chart.","ColorSort":"The color sort configuration of a radar chart."}},"AWS::QuickSight::Dashboard.RadarChartVisual":{"attributes":{},"description":"A radar chart visual.","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.RangeEndsLabelType":{"attributes":{},"description":"The range ends label type of a data path label.","properties":{"Visibility":"The visibility of the range ends label."}},"AWS::QuickSight::Dashboard.ReferenceLine":{"attributes":{},"description":"The reference line visual display options.","properties":{"DataConfiguration":"The data configuration of the reference line.","LabelConfiguration":"The label configuration of the reference line.","Status":"The status of the reference line. Choose one of the following options:\\n\\n- `ENABLE`\\n- `DISABLE`","StyleConfiguration":"The style configuration of the reference line."}},"AWS::QuickSight::Dashboard.ReferenceLineCustomLabelConfiguration":{"attributes":{},"description":"The configuration for a custom label on a `ReferenceLine` .","properties":{"CustomLabel":"The string text of the custom label."}},"AWS::QuickSight::Dashboard.ReferenceLineDataConfiguration":{"attributes":{},"description":"The data configuration of the reference line.","properties":{"AxisBinding":"The axis binding type of the reference line. Choose one of the following options:\\n\\n- PrimaryY\\n- SecondaryY","DynamicConfiguration":"The dynamic configuration of the reference line data configuration.","StaticConfiguration":"The static data configuration of the reference line data configuration."}},"AWS::QuickSight::Dashboard.ReferenceLineDynamicDataConfiguration":{"attributes":{},"description":"The dynamic configuration of the reference line data configuration.","properties":{"Calculation":"The calculation that is used in the dynamic data.","Column":"The column that the dynamic data targets.","MeasureAggregationFunction":"The aggregation function that is used in the dynamic data."}},"AWS::QuickSight::Dashboard.ReferenceLineLabelConfiguration":{"attributes":{},"description":"The label configuration of a reference line.","properties":{"CustomLabelConfiguration":"The custom label configuration of the label in a reference line.","FontColor":"The font color configuration of the label in a reference line.","FontConfiguration":"The font configuration of the label in a reference line.","HorizontalPosition":"The horizontal position configuration of the label in a reference line. Choose one of the following options:\\n\\n- `LEFT`\\n- `CENTER`\\n- `RIGHT`","ValueLabelConfiguration":"The value label configuration of the label in a reference line.","VerticalPosition":"The vertical position configuration of the label in a reference line. Choose one of the following options:\\n\\n- `ABOVE`\\n- `BELOW`"}},"AWS::QuickSight::Dashboard.ReferenceLineStaticDataConfiguration":{"attributes":{},"description":"The static data configuration of the reference line data configuration.","properties":{"Value":"The double input of the static data."}},"AWS::QuickSight::Dashboard.ReferenceLineStyleConfiguration":{"attributes":{},"description":"The style configuration of the reference line.","properties":{"Color":"The hex color of the reference line.","Pattern":"The pattern type of the line style. Choose one of the following options:\\n\\n- `SOLID`\\n- `DASHED`\\n- `DOTTED`"}},"AWS::QuickSight::Dashboard.ReferenceLineValueLabelConfiguration":{"attributes":{},"description":"The value label configuration of the label in a reference line.","properties":{"FormatConfiguration":"The format configuration of the value label.","RelativePosition":"The relative position of the value label. Choose one of the following options:\\n\\n- `BEFORE_CUSTOM_LABEL`\\n- `AFTER_CUSTOM_LABEL`"}},"AWS::QuickSight::Dashboard.RelativeDateTimeControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"DateTimeFormat":"Customize how dates are formatted in controls.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Dashboard.RelativeDatesFilter":{"attributes":{},"description":"A `RelativeDatesFilter` filters relative dates values.","properties":{"AnchorDateConfiguration":"The date configuration of the filter.","Column":"The column that the filter is applied to.","ExcludePeriodConfiguration":"The configuration for the exclude period of the filter.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","MinimumGranularity":"The minimum granularity (period granularity) of the relative dates filter.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","ParameterName":"The parameter whose value should be used for the filter value.","RelativeDateType":"The range date type of the filter. Choose one of the options below:\\n\\n- `PREVIOUS`\\n- `THIS`\\n- `LAST`\\n- `NOW`\\n- `NEXT`","RelativeDateValue":"The date value of the filter.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Dashboard.ResourcePermission":{"attributes":{},"description":"Permission for the resource.","properties":{"Actions":"The IAM action to grant or revoke permissions on.","Principal":"The Amazon Resource Name (ARN) of the principal. This can be one of the following:\\n\\n- The ARN of an Amazon QuickSight user or group associated with a data source or dataset. (This is common.)\\n- The ARN of an Amazon QuickSight user, group, or namespace associated with an analysis, dashboard, template, or theme. (This is common.)\\n- The ARN of an AWS account root: This is an IAM ARN rather than a Amazon QuickSight ARN. Use this option only to share resources (templates) across AWS accounts . (This is less common.)","Resource":""}},"AWS::QuickSight::Dashboard.RollingDateConfiguration":{"attributes":{},"description":"The rolling date configuration of a date time filter.","properties":{"DataSetIdentifier":"The data set that is used in the rolling date configuration.","Expression":"The expression of the rolling date configuration."}},"AWS::QuickSight::Dashboard.RowAlternateColorOptions":{"attributes":{},"description":"Determines the row alternate color options.","properties":{"RowAlternateColors":"Determines the list of row alternate colors.","Status":"Determines the widget status."}},"AWS::QuickSight::Dashboard.SameSheetTargetVisualConfiguration":{"attributes":{},"description":"The configuration of the same-sheet target visuals that you want to be filtered.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"TargetVisualOptions":"The options that choose the target visual in the same sheet.\\n\\nValid values are defined as follows:\\n\\n- `ALL_VISUALS` : Applies the filter operation to all visuals in the same sheet.","TargetVisuals":"A list of the target visual IDs that are located in the same sheet of the analysis."}},"AWS::QuickSight::Dashboard.SankeyDiagramAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a sankey diagram.","properties":{"Destination":"The destination field wells of a sankey diagram.","Source":"The source field wells of a sankey diagram.","Weight":"The weight field wells of a sankey diagram."}},"AWS::QuickSight::Dashboard.SankeyDiagramChartConfiguration":{"attributes":{},"description":"The configuration of a sankey diagram.","properties":{"DataLabels":"The data label configuration of a sankey diagram.","FieldWells":"The field well configuration of a sankey diagram.","SortConfiguration":"The sort configuration of a sankey diagram."}},"AWS::QuickSight::Dashboard.SankeyDiagramFieldWells":{"attributes":{},"description":"The field well configuration of a sankey diagram.","properties":{"SankeyDiagramAggregatedFieldWells":"The field well configuration of a sankey diagram."}},"AWS::QuickSight::Dashboard.SankeyDiagramSortConfiguration":{"attributes":{},"description":"The sort configuration of a sankey diagram.","properties":{"DestinationItemsLimit":"The limit on the number of destination nodes that are displayed in a sankey diagram.","SourceItemsLimit":"The limit on the number of source nodes that are displayed in a sankey diagram.","WeightSort":"The sort configuration of the weight fields."}},"AWS::QuickSight::Dashboard.SankeyDiagramVisual":{"attributes":{},"description":"A sankey diagram.\\n\\nFor more information, see [Using Sankey diagrams](https://docs.aws.amazon.com/quicksight/latest/user/sankey-diagram.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a sankey diagram.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.ScatterPlotCategoricallyAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well of a scatter plot.","properties":{"Category":"The category field well of a scatter plot.","Label":"The label field well of a scatter plot.","Size":"The size field well of a scatter plot.","XAxis":"The x-axis field well of a scatter plot.\\n\\nThe x-axis is aggregated by category.","YAxis":"The y-axis field well of a scatter plot.\\n\\nThe y-axis is aggregated by category."}},"AWS::QuickSight::Dashboard.ScatterPlotConfiguration":{"attributes":{},"description":"The configuration of a scatter plot.","properties":{"DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","Tooltip":"The legend display setup of the visual.","VisualPalette":"The palette (chart color) display setup of the visual.","XAxisDisplayOptions":"The label display options (grid line, range, scale, and axis step) of the scatter plot\'s x-axis.","XAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of the scatter plot\'s x-axis.","YAxisDisplayOptions":"The label display options (grid line, range, scale, and axis step) of the scatter plot\'s y-axis.","YAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of the scatter plot\'s y-axis."}},"AWS::QuickSight::Dashboard.ScatterPlotFieldWells":{"attributes":{},"description":"The field well configuration of a scatter plot.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"ScatterPlotCategoricallyAggregatedFieldWells":"The aggregated field wells of a scatter plot. The x and y-axes of scatter plots with aggregated field wells are aggregated by category, label, or both.","ScatterPlotUnaggregatedFieldWells":"The unaggregated field wells of a scatter plot. The x and y-axes of these scatter plots are unaggregated."}},"AWS::QuickSight::Dashboard.ScatterPlotUnaggregatedFieldWells":{"attributes":{},"description":"The unaggregated field wells of a scatter plot.","properties":{"Category":"The category field well of a scatter plot.","Label":"The label field well of a scatter plot.","Size":"The size field well of a scatter plot.","XAxis":"The x-axis field well of a scatter plot.\\n\\nThe x-axis is a dimension field and cannot be aggregated.","YAxis":"The y-axis field well of a scatter plot.\\n\\nThe y-axis is a dimension field and cannot be aggregated."}},"AWS::QuickSight::Dashboard.ScatterPlotVisual":{"attributes":{},"description":"A scatter plot.\\n\\nFor more information, see [Using scatter plots](https://docs.aws.amazon.com/quicksight/latest/user/scatter-plot.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.ScrollBarOptions":{"attributes":{},"description":"The visual display options for a data zoom scroll bar.","properties":{"Visibility":"The visibility of the data zoom scroll bar.","VisibleRange":"The visibility range for the data zoom scroll bar."}},"AWS::QuickSight::Dashboard.SecondaryValueOptions":{"attributes":{},"description":"The options that determine the presentation of the secondary value of a KPI visual.","properties":{"Visibility":"Determines the visibility of the secondary value."}},"AWS::QuickSight::Dashboard.SectionAfterPageBreak":{"attributes":{},"description":"The configuration of a page break after a section.","properties":{"Status":"The option that enables or disables a page break at the end of a section."}},"AWS::QuickSight::Dashboard.SectionBasedLayoutCanvasSizeOptions":{"attributes":{},"description":"The options for the canvas of a section-based layout.","properties":{"PaperCanvasSizeOptions":"The options for a paper canvas of a section-based layout."}},"AWS::QuickSight::Dashboard.SectionBasedLayoutConfiguration":{"attributes":{},"description":"The configuration for a section-based layout.","properties":{"BodySections":"A list of body section configurations.","CanvasSizeOptions":"The options for the canvas of a section-based layout.","FooterSections":"A list of footer section configurations.","HeaderSections":"A list of header section configurations."}},"AWS::QuickSight::Dashboard.SectionBasedLayoutPaperCanvasSizeOptions":{"attributes":{},"description":"The options for a paper canvas of a section-based layout.","properties":{"PaperMargin":"Defines the spacing between the canvas content and the top, bottom, left, and right edges.","PaperOrientation":"The paper orientation that is used to define canvas dimensions. Choose one of the following options:\\n\\n- PORTRAIT\\n- LANDSCAPE","PaperSize":"The paper size that is used to define canvas dimensions."}},"AWS::QuickSight::Dashboard.SectionLayoutConfiguration":{"attributes":{},"description":"The layout configuration of a section.","properties":{"FreeFormLayout":"The free-form layout configuration of a section."}},"AWS::QuickSight::Dashboard.SectionPageBreakConfiguration":{"attributes":{},"description":"The configuration of a page break for a section.","properties":{"After":"The configuration of a page break after a section."}},"AWS::QuickSight::Dashboard.SectionStyle":{"attributes":{},"description":"The options that style a section.","properties":{"Height":"The height of a section.\\n\\nHeights can only be defined for header and footer sections. The default height margin is 0.5 inches.","Padding":"The spacing between section content and its top, bottom, left, and right edges.\\n\\nThere is no padding by default."}},"AWS::QuickSight::Dashboard.SelectedSheetsFilterScopeConfiguration":{"attributes":{},"description":"The configuration for applying a filter to specific sheets or visuals. You can apply this filter to multiple visuals that are on one sheet or to all visuals on a sheet.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SheetVisualScopingConfigurations":"The sheet ID and visual IDs of the sheet and visuals that the filter is applied to."}},"AWS::QuickSight::Dashboard.SeriesItem":{"attributes":{},"description":"The series item configuration of a line chart.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DataFieldSeriesItem":"The data field series item configuration of a line chart.","FieldSeriesItem":"The field series item configuration of a line chart."}},"AWS::QuickSight::Dashboard.SetParameterValueConfiguration":{"attributes":{},"description":"The configuration of adding parameters in action.","properties":{"DestinationParameterName":"The destination parameter name of the `SetParameterValueConfiguration` .","Value":""}},"AWS::QuickSight::Dashboard.ShapeConditionalFormat":{"attributes":{},"description":"The shape conditional formatting of a filled map visual.","properties":{"BackgroundColor":"The conditional formatting for the shape background color of a filled map visual."}},"AWS::QuickSight::Dashboard.Sheet":{"attributes":{},"description":"A *sheet* , which is an object that contains a set of visuals that are viewed together on one page in Amazon QuickSight. Every analysis and dashboard contains at least one sheet. Each sheet contains at least one visualization widget, for example a chart, pivot table, or narrative insight. Sheets can be associated with other components, such as controls, filters, and so on.","properties":{"Name":"The name of a sheet. This name is displayed on the sheet\'s tab in the Amazon QuickSight console.","SheetId":"The unique identifier associated with a sheet."}},"AWS::QuickSight::Dashboard.SheetControlLayout":{"attributes":{},"description":"A grid layout to define the placement of sheet control.","properties":{"Configuration":"The configuration that determines the elements and canvas size options of sheet control."}},"AWS::QuickSight::Dashboard.SheetControlLayoutConfiguration":{"attributes":{},"description":"The configuration that determines the elements and canvas size options of sheet control.","properties":{"GridLayout":"The configuration that determines the elements and canvas size options of sheet control."}},"AWS::QuickSight::Dashboard.SheetControlsOption":{"attributes":{},"description":"Sheet controls option.","properties":{"VisibilityState":"Visibility state."}},"AWS::QuickSight::Dashboard.SheetDefinition":{"attributes":{},"description":"A sheet is an object that contains a set of visuals that are viewed together on one page in a paginated report. Every analysis and dashboard must contain at least one sheet.","properties":{"ContentType":"The layout content type of the sheet. Choose one of the following options:\\n\\n- `PAGINATED` : Creates a sheet for a paginated report.\\n- `INTERACTIVE` : Creates a sheet for an interactive dashboard.","Description":"A description of the sheet.","FilterControls":"The list of filter controls that are on a sheet.\\n\\nFor more information, see [Adding filter controls to analysis sheets](https://docs.aws.amazon.com/quicksight/latest/user/filter-controls.html) in the *Amazon QuickSight User Guide* .","Layouts":"Layouts define how the components of a sheet are arranged.\\n\\nFor more information, see [Types of layout](https://docs.aws.amazon.com/quicksight/latest/user/types-of-layout.html) in the *Amazon QuickSight User Guide* .","Name":"The name of the sheet. This name is displayed on the sheet\'s tab in the Amazon QuickSight console.","ParameterControls":"The list of parameter controls that are on a sheet.\\n\\nFor more information, see [Using a Control with a Parameter in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/parameters-controls.html) in the *Amazon QuickSight User Guide* .","SheetControlLayouts":"The control layouts of the sheet.","SheetId":"The unique identifier of a sheet.","TextBoxes":"The text boxes that are on a sheet.","Title":"The title of the sheet.","Visuals":"A list of the visuals that are on a sheet. Visual placement is determined by the layout of the sheet."}},"AWS::QuickSight::Dashboard.SheetElementConfigurationOverrides":{"attributes":{},"description":"The override configuration of the rendering rules of a sheet.","properties":{"Visibility":"Determines whether or not the overrides are visible. Choose one of the following options:\\n\\n- `VISIBLE`\\n- `HIDDEN`"}},"AWS::QuickSight::Dashboard.SheetElementRenderingRule":{"attributes":{},"description":"The rendering rules of a sheet that uses a free-form layout.","properties":{"ConfigurationOverrides":"The override configuration of the rendering rules of a sheet.","Expression":"The expression of the rendering rules of a sheet."}},"AWS::QuickSight::Dashboard.SheetLayoutElementMaximizationOption":{"attributes":{},"description":"The sheet layout maximization options of a dashbaord.","properties":{"AvailabilityStatus":"The status of the sheet layout maximization options of a dashbaord."}},"AWS::QuickSight::Dashboard.SheetTextBox":{"attributes":{},"description":"A text box.","properties":{"Content":"The content that is displayed in the text box.","SheetTextBoxId":"The unique identifier for a text box. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have text boxes that share identifiers."}},"AWS::QuickSight::Dashboard.SheetVisualScopingConfiguration":{"attributes":{},"description":"The filter that is applied to the options.","properties":{"Scope":"The scope of the applied entities. Choose one of the following options:\\n\\n- `ALL_VISUALS`\\n- `SELECTED_VISUALS`","SheetId":"The selected sheet that the filter is applied to.","VisualIds":"The selected visuals that the filter is applied to."}},"AWS::QuickSight::Dashboard.ShortFormatText":{"attributes":{},"description":"The text format for the title.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PlainText":"Plain text format.","RichText":"Rich text. Examples of rich text include bold, underline, and italics."}},"AWS::QuickSight::Dashboard.SimpleClusterMarker":{"attributes":{},"description":"The simple cluster marker of the cluster marker.","properties":{"Color":"The color of the simple cluster marker."}},"AWS::QuickSight::Dashboard.SliderControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Dashboard.SmallMultiplesOptions":{"attributes":{},"description":"Options that determine the layout and display options of a chart\'s small multiples.","properties":{"MaxVisibleColumns":"Sets the maximum number of visible columns to display in the grid of small multiples panels.\\n\\nThe default is `Auto` , which automatically adjusts the columns in the grid to fit the overall layout and size of the given chart.","MaxVisibleRows":"Sets the maximum number of visible rows to display in the grid of small multiples panels.\\n\\nThe default value is `Auto` , which automatically adjusts the rows in the grid to fit the overall layout and size of the given chart.","PanelConfiguration":"Configures the display options for each small multiples panel."}},"AWS::QuickSight::Dashboard.Spacing":{"attributes":{},"description":"The configuration of spacing (often a margin or padding).","properties":{"Bottom":"Define the bottom spacing.","Left":"Define the left spacing.","Right":"Define the right spacing.","Top":"Define the top spacing."}},"AWS::QuickSight::Dashboard.StringDefaultValues":{"attributes":{},"description":"The default values of the `StringParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `StringDefaultValues` . Different defaults displayed according to users, groups, and values mapping.","StaticValues":"The static values of the `DecimalDefaultValues` ."}},"AWS::QuickSight::Dashboard.StringFormatConfiguration":{"attributes":{},"description":"Formatting configuration for string fields.","properties":{"NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumericFormatConfiguration":"The formatting configuration for numeric strings."}},"AWS::QuickSight::Dashboard.StringParameter":{"attributes":{},"description":"A string parameter.","properties":{"Name":"A display name for a string parameter.","Values":"The values of a string parameter."}},"AWS::QuickSight::Dashboard.StringParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `String` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","ParameterValueType":"The value type determines whether the parameter is a single-value or multi-value parameter.","ValueWhenUnset":"The configuration that defines the default value of a `String` parameter when a value has not been set."}},"AWS::QuickSight::Dashboard.StringValueWhenUnsetConfiguration":{"attributes":{},"description":"The configuration that defines the default value of a `String` parameter when a value has not been set.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Dashboard.SubtotalOptions":{"attributes":{},"description":"The subtotal options.","properties":{"CustomLabel":"The custom label string for the subtotal cells.","FieldLevel":"The field level (all, custom, last) for the subtotal cells.","FieldLevelOptions":"The optional configuration of subtotal cells.","MetricHeaderCellStyle":"The cell styling options for the subtotals of header cells.","TotalCellStyle":"The cell styling options for the subtotal cells.","TotalsVisibility":"The visibility configuration for the subtotal cells.","ValueCellStyle":"The cell styling options for the subtotals of value cells."}},"AWS::QuickSight::Dashboard.TableAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well for the table.","properties":{"GroupBy":"The group by field well for a pivot table. Values are grouped by group by fields.","Values":"The values field well for a pivot table. Values are aggregated based on group by fields."}},"AWS::QuickSight::Dashboard.TableBorderOptions":{"attributes":{},"description":"The border options for a table border.","properties":{"Color":"The color of a table border.","Style":"The style (none, solid) of a table border.","Thickness":"The thickness of a table border."}},"AWS::QuickSight::Dashboard.TableCellConditionalFormatting":{"attributes":{},"description":"The cell conditional formatting option for a table.","properties":{"FieldId":"The field ID of the cell for conditional formatting.","TextFormat":"The text format of the cell for conditional formatting."}},"AWS::QuickSight::Dashboard.TableCellImageSizingConfiguration":{"attributes":{},"description":"The sizing options for the table image configuration.","properties":{"TableCellImageScalingConfiguration":"The cell scaling configuration of the sizing options for the table image configuration."}},"AWS::QuickSight::Dashboard.TableCellStyle":{"attributes":{},"description":"The table cell style for a cell in pivot table or table visual.","properties":{"BackgroundColor":"The background color for the table cells.","Border":"The borders for the table cells.","FontConfiguration":"The font configuration of the table cells.","Height":"The height color for the table cells.","HorizontalTextAlignment":"The horizontal text alignment (left, center, right, auto) for the table cells.","TextWrap":"The text wrap (none, wrap) for the table cells.","VerticalTextAlignment":"The vertical text alignment (top, middle, bottom) for the table cells.","Visibility":"The visibility of the table cells."}},"AWS::QuickSight::Dashboard.TableConditionalFormatting":{"attributes":{},"description":"The conditional formatting for a `PivotTableVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options for a `PivotTableVisual` ."}},"AWS::QuickSight::Dashboard.TableConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options for a `PivotTableVisual` .","properties":{"Cell":"The cell conditional formatting option for a table.","Row":"The row conditional formatting option for a table."}},"AWS::QuickSight::Dashboard.TableConfiguration":{"attributes":{},"description":"The configuration for a `TableVisual` .","properties":{"FieldOptions":"The field options for a table visual.","FieldWells":"The field wells of the visual.","PaginatedReportOptions":"The paginated report options for a table visual.","SortConfiguration":"The sort configuration for a `TableVisual` .","TableInlineVisualizations":"A collection of inline visualizations to display within a chart.","TableOptions":"The table options for a table visual.","TotalOptions":"The total options for a table visual."}},"AWS::QuickSight::Dashboard.TableFieldCustomIconContent":{"attributes":{},"description":"The custom icon content for the table link content configuration.","properties":{"Icon":"The icon set type (link) of the custom icon content for table URL link content."}},"AWS::QuickSight::Dashboard.TableFieldCustomTextContent":{"attributes":{},"description":"The custom text content (value, font configuration) for the table link content configuration.","properties":{"FontConfiguration":"The font configuration of the custom text content for the table URL link content.","Value":"The string value of the custom text content for the table URL link content."}},"AWS::QuickSight::Dashboard.TableFieldImageConfiguration":{"attributes":{},"description":"The image configuration of a table field URL.","properties":{"SizingOptions":"The sizing options for the table image configuration."}},"AWS::QuickSight::Dashboard.TableFieldLinkConfiguration":{"attributes":{},"description":"The link configuration of a table field URL.","properties":{"Content":"The URL content (text, icon) for the table link configuration.","Target":"The URL target (new tab, new window, same tab) for the table link configuration."}},"AWS::QuickSight::Dashboard.TableFieldLinkContentConfiguration":{"attributes":{},"description":"The URL content (text, icon) for the table link configuration.","properties":{"CustomIconContent":"The custom icon content for the table link content configuration.","CustomTextContent":"The custom text content (value, font configuration) for the table link content configuration."}},"AWS::QuickSight::Dashboard.TableFieldOption":{"attributes":{},"description":"The options for a table field.","properties":{"CustomLabel":"The custom label for a table field.","FieldId":"The field ID for a table field.","URLStyling":"The URL configuration for a table field.","Visibility":"The visibility of a table field.","Width":"The width for a table field."}},"AWS::QuickSight::Dashboard.TableFieldOptions":{"attributes":{},"description":"The field options for a table visual.","properties":{"Order":"The order of field IDs of the field options for a table visual.","SelectedFieldOptions":"The selected field options for the table field options."}},"AWS::QuickSight::Dashboard.TableFieldURLConfiguration":{"attributes":{},"description":"The URL configuration for a table field.","properties":{"ImageConfiguration":"The image configuration of a table field URL.","LinkConfiguration":"The link configuration of a table field URL."}},"AWS::QuickSight::Dashboard.TableFieldWells":{"attributes":{},"description":"The field wells for a table visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"TableAggregatedFieldWells":"The aggregated field well for the table.","TableUnaggregatedFieldWells":"The unaggregated field well for the table."}},"AWS::QuickSight::Dashboard.TableInlineVisualization":{"attributes":{},"description":"The inline visualization of a specific type to display within a chart.","properties":{"DataBars":"The configuration of the inline visualization of the data bars within a chart."}},"AWS::QuickSight::Dashboard.TableOptions":{"attributes":{},"description":"The table options for a table visual.","properties":{"CellStyle":"The table cell style of table cells.","HeaderStyle":"The table cell style of a table header.","Orientation":"The orientation (vertical, horizontal) for a table.","RowAlternateColorOptions":"The row alternate color options (widget status, row alternate colors) for a table."}},"AWS::QuickSight::Dashboard.TablePaginatedReportOptions":{"attributes":{},"description":"The paginated report options for a table visual.","properties":{"OverflowColumnHeaderVisibility":"The visibility of repeating header rows on each page.","VerticalOverflowVisibility":"The visibility of printing table overflow across pages."}},"AWS::QuickSight::Dashboard.TableRowConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a table row.","properties":{"BackgroundColor":"The conditional formatting color (solid, gradient) of the background for a table row.","TextColor":"The conditional formatting color (solid, gradient) of the text for a table row."}},"AWS::QuickSight::Dashboard.TableSideBorderOptions":{"attributes":{},"description":"The side border options for a table.","properties":{"Bottom":"The table border options of the bottom border.","InnerHorizontal":"The table border options of the inner horizontal border.","InnerVertical":"The table border options of the inner vertical border.","Left":"The table border options of the left border.","Right":"The table border options of the right border.","Top":"The table border options of the top border."}},"AWS::QuickSight::Dashboard.TableSortConfiguration":{"attributes":{},"description":"The sort configuration for a `TableVisual` .","properties":{"PaginationConfiguration":"The pagination configuration (page size, page number) for the table.","RowSort":"The field sort options for rows in the table."}},"AWS::QuickSight::Dashboard.TableUnaggregatedFieldWells":{"attributes":{},"description":"The unaggregated field well for the table.","properties":{"Values":"The values field well for a pivot table. Values are unaggregated for an unaggregated table."}},"AWS::QuickSight::Dashboard.TableVisual":{"attributes":{},"description":"A table visual.\\n\\nFor more information, see [Using tables as visuals](https://docs.aws.amazon.com/quicksight/latest/user/tabular.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ConditionalFormatting":"The conditional formatting for a `PivotTableVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Dashboard.TextAreaControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"PlaceholderOptions":"The configuration of the placeholder options in a text area control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Dashboard.TextConditionalFormat":{"attributes":{},"description":"The conditional formatting for the text.","properties":{"BackgroundColor":"The conditional formatting for the text background color.","Icon":"The conditional formatting for the icon.","TextColor":"The conditional formatting for the text color."}},"AWS::QuickSight::Dashboard.TextControlPlaceholderOptions":{"attributes":{},"description":"The configuration of the placeholder options in a text control.","properties":{"Visibility":"The visibility configuration of the placeholder options in a text control."}},"AWS::QuickSight::Dashboard.TextFieldControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"PlaceholderOptions":"The configuration of the placeholder options in a text field control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Dashboard.ThousandSeparatorOptions":{"attributes":{},"description":"The options that determine the thousands separator configuration.","properties":{"Symbol":"Determines the thousands separator symbol.","Visibility":"Determines the visibility of the thousands separator."}},"AWS::QuickSight::Dashboard.TimeBasedForecastProperties":{"attributes":{},"description":"The forecast properties setup of a forecast in the line chart.","properties":{"LowerBoundary":"The lower boundary setup of a forecast computation.","PeriodsBackward":"The periods backward setup of a forecast computation.","PeriodsForward":"The periods forward setup of a forecast computation.","PredictionInterval":"The prediction interval setup of a forecast computation.","Seasonality":"The seasonality setup of a forecast computation. Choose one of the following options:\\n\\n- `NULL` : The input is set to `NULL` .\\n- `NON_NULL` : The input is set to a custom value.","UpperBoundary":"The upper boundary setup of a forecast computation."}},"AWS::QuickSight::Dashboard.TimeEqualityFilter":{"attributes":{},"description":"A `TimeEqualityFilter` filters values that are equal to a given value.","properties":{"Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","ParameterName":"The parameter whose value should be used for the filter value.\\n\\nThis field is mutually exclusive to `Value` .","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values.","Value":"The value of a `TimeEquality` filter.\\n\\nThis field is mutually exclusive to `ParameterName` ."}},"AWS::QuickSight::Dashboard.TimeRangeDrillDownFilter":{"attributes":{},"description":"The time range drill down filter.","properties":{"Column":"The column that the filter is applied to.","RangeMaximum":"The maximum value for the filter value range.","RangeMinimum":"The minimum value for the filter value range.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Dashboard.TimeRangeFilter":{"attributes":{},"description":"A `TimeRangeFilter` filters values that are between two specified values.","properties":{"Column":"The column that the filter is applied to.","ExcludePeriodConfiguration":"The exclude period of the time range filter.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","IncludeMaximum":"Determines whether the maximum value in the filter value range should be included in the filtered results.","IncludeMinimum":"Determines whether the minimum value in the filter value range should be included in the filtered results.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","RangeMaximumValue":"The maximum value for the filter value range.","RangeMinimumValue":"The minimum value for the filter value range.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Dashboard.TimeRangeFilterValue":{"attributes":{},"description":"The value of a time range filter.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Parameter":"The parameter type input value.","RollingDate":"The rolling date input value.","StaticValue":"The static input value."}},"AWS::QuickSight::Dashboard.TooltipItem":{"attributes":{},"description":"The tooltip.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"ColumnTooltipItem":"The tooltip item for the columns that are not part of a field well.","FieldTooltipItem":"The tooltip item for the fields."}},"AWS::QuickSight::Dashboard.TooltipOptions":{"attributes":{},"description":"The display options for the visual tooltip.","properties":{"FieldBasedTooltip":"The setup for the detailed tooltip. The tooltip setup is always saved. The display type is decided based on the tooltip type.","SelectedTooltipType":"The selected type for the tooltip. Choose one of the following options:\\n\\n- `BASIC` : A basic tooltip.\\n- `DETAILED` : A detailed tooltip.","TooltipVisibility":"Determines whether or not the tooltip is visible."}},"AWS::QuickSight::Dashboard.TopBottomFilter":{"attributes":{},"description":"A `TopBottomFilter` filters values that are at the top or the bottom.","properties":{"AggregationSortConfigurations":"The aggregation and sort configuration of the top bottom filter.","Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","Limit":"The number of items to include in the top bottom filter results.","ParameterName":"The parameter whose value should be used for the filter value.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Dashboard.TopBottomMoversComputation":{"attributes":{},"description":"The top movers and bottom movers computation setup.","properties":{"Category":"The category field that is used in a computation.","ComputationId":"The ID for a computation.","MoverSize":"The mover size setup of the top and bottom movers computation.","Name":"The name of a computation.","SortOrder":"The sort order setup of the top and bottom movers computation.","Time":"The time field that is used in a computation.","Type":"The computation type. Choose from the following options:\\n\\n- TOP: Top movers computation.\\n- BOTTOM: Bottom movers computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Dashboard.TopBottomRankedComputation":{"attributes":{},"description":"The top ranked and bottom ranked computation configuration.","properties":{"Category":"The category field that is used in a computation.","ComputationId":"The ID for a computation.","Name":"The name of a computation.","ResultSize":"The result size of a top and bottom ranked computation.","Type":"The computation type. Choose one of the following options:\\n\\n- TOP: A top ranked computation.\\n- BOTTOM: A bottom ranked computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Dashboard.TotalAggregationComputation":{"attributes":{},"description":"The total aggregation computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Dashboard.TotalOptions":{"attributes":{},"description":"The total options for a table visual.","properties":{"CustomLabel":"The custom label string for the total cells.","Placement":"The placement (start, end) for the total cells.","ScrollStatus":"The scroll status (pinned, scrolled) for the total cells.","TotalCellStyle":"Cell styling options for the total cells.","TotalsVisibility":"The visibility configuration for the total cells."}},"AWS::QuickSight::Dashboard.TreeMapAggregatedFieldWells":{"attributes":{},"description":"Aggregated field wells of a tree map.","properties":{"Colors":"The color field well of a tree map. Values are grouped by aggregations based on group by fields.","Groups":"The group by field well of a tree map. Values are grouped based on group by fields.","Sizes":"The size field well of a tree map. Values are aggregated based on group by fields."}},"AWS::QuickSight::Dashboard.TreeMapConfiguration":{"attributes":{},"description":"The configuration of a tree map.","properties":{"ColorLabelOptions":"The label options (label text, label visibility) for the colors displayed in a tree map.","ColorScale":"The color options (gradient color, point of divergence) of a tree map.","DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","GroupLabelOptions":"The label options (label text, label visibility) of the groups that are displayed in a tree map.","Legend":"The legend display setup of the visual.","SizeLabelOptions":"The label options (label text, label visibility) of the sizes that are displayed in a tree map.","SortConfiguration":"The sort configuration of a tree map.","Tooltip":"The tooltip display setup of the visual."}},"AWS::QuickSight::Dashboard.TreeMapFieldWells":{"attributes":{},"description":"The field wells of a tree map.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"TreeMapAggregatedFieldWells":"The aggregated field wells of a tree map."}},"AWS::QuickSight::Dashboard.TreeMapSortConfiguration":{"attributes":{},"description":"The sort configuration of a tree map.","properties":{"TreeMapGroupItemsLimitConfiguration":"The limit on the number of groups that are displayed.","TreeMapSort":"The sort configuration of group by fields."}},"AWS::QuickSight::Dashboard.TreeMapVisual":{"attributes":{},"description":"A tree map.\\n\\nFor more information, see [Using tree maps](https://docs.aws.amazon.com/quicksight/latest/user/tree-map.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Dashboard.TrendArrowOptions":{"attributes":{},"description":"The options that determine the presentation of trend arrows in a KPI visual.","properties":{"Visibility":"The visibility of the trend arrows."}},"AWS::QuickSight::Dashboard.UnaggregatedField":{"attributes":{},"description":"The unaggregated field for a table.","properties":{"Column":"The column that is used in the `UnaggregatedField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Dashboard.UniqueValuesComputation":{"attributes":{},"description":"The unique values computation configuration.","properties":{"Category":"The category field that is used in a computation.","ComputationId":"The ID for a computation.","Name":"The name of a computation."}},"AWS::QuickSight::Dashboard.VisibleRangeOptions":{"attributes":{},"description":"The range options for the data zoom scroll bar.","properties":{"PercentRange":"The percent range in the visible range."}},"AWS::QuickSight::Dashboard.Visual":{"attributes":{},"description":"A visual displayed on a sheet in an analysis, dashboard, or template.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"BarChartVisual":"A bar chart.\\n\\nFor more information, see [Using bar charts](https://docs.aws.amazon.com/quicksight/latest/user/bar-charts.html) in the *Amazon QuickSight User Guide* .","BoxPlotVisual":"A box plot.\\n\\nFor more information, see [Using box plots](https://docs.aws.amazon.com/quicksight/latest/user/box-plots.html) in the *Amazon QuickSight User Guide* .","ComboChartVisual":"A combo chart.\\n\\nFor more information, see [Using combo charts](https://docs.aws.amazon.com/quicksight/latest/user/combo-charts.html) in the *Amazon QuickSight User Guide* .","CustomContentVisual":"A visual that contains custom content.\\n\\nFor more information, see [Using custom visual content](https://docs.aws.amazon.com/quicksight/latest/user/custom-visual-content.html) in the *Amazon QuickSight User Guide* .","EmptyVisual":"An empty visual.","FilledMapVisual":"A filled map.\\n\\nFor more information, see [Creating filled maps](https://docs.aws.amazon.com/quicksight/latest/user/filled-maps.html) in the *Amazon QuickSight User Guide* .","FunnelChartVisual":"A funnel chart.\\n\\nFor more information, see [Using funnel charts](https://docs.aws.amazon.com/quicksight/latest/user/funnel-visual-content.html) in the *Amazon QuickSight User Guide* .","GaugeChartVisual":"A gauge chart.\\n\\nFor more information, see [Using gauge charts](https://docs.aws.amazon.com/quicksight/latest/user/gauge-chart.html) in the *Amazon QuickSight User Guide* .","GeospatialMapVisual":"A geospatial map or a points on map visual.\\n\\nFor more information, see [Creating point maps](https://docs.aws.amazon.com/quicksight/latest/user/point-maps.html) in the *Amazon QuickSight User Guide* .","HeatMapVisual":"A heat map.\\n\\nFor more information, see [Using heat maps](https://docs.aws.amazon.com/quicksight/latest/user/heat-map.html) in the *Amazon QuickSight User Guide* .","HistogramVisual":"A histogram.\\n\\nFor more information, see [Using histograms](https://docs.aws.amazon.com/quicksight/latest/user/histogram-charts.html) in the *Amazon QuickSight User Guide* .","InsightVisual":"An insight visual.\\n\\nFor more information, see [Working with insights](https://docs.aws.amazon.com/quicksight/latest/user/computational-insights.html) in the *Amazon QuickSight User Guide* .","KPIVisual":"A key performance indicator (KPI).\\n\\nFor more information, see [Using KPIs](https://docs.aws.amazon.com/quicksight/latest/user/kpi.html) in the *Amazon QuickSight User Guide* .","LineChartVisual":"A line chart.\\n\\nFor more information, see [Using line charts](https://docs.aws.amazon.com/quicksight/latest/user/line-charts.html) in the *Amazon QuickSight User Guide* .","PieChartVisual":"A pie or donut chart.\\n\\nFor more information, see [Using pie charts](https://docs.aws.amazon.com/quicksight/latest/user/pie-chart.html) in the *Amazon QuickSight User Guide* .","PivotTableVisual":"A pivot table.\\n\\nFor more information, see [Using pivot tables](https://docs.aws.amazon.com/quicksight/latest/user/pivot-table.html) in the *Amazon QuickSight User Guide* .","RadarChartVisual":"A radar chart visual.\\n\\nFor more information, see [Using radar charts](https://docs.aws.amazon.com/quicksight/latest/user/radar-chart.html) in the *Amazon QuickSight User Guide* .","SankeyDiagramVisual":"A sankey diagram.\\n\\nFor more information, see [Using Sankey diagrams](https://docs.aws.amazon.com/quicksight/latest/user/sankey-diagram.html) in the *Amazon QuickSight User Guide* .","ScatterPlotVisual":"A scatter plot.\\n\\nFor more information, see [Using scatter plots](https://docs.aws.amazon.com/quicksight/latest/user/scatter-plot.html) in the *Amazon QuickSight User Guide* .","TableVisual":"A table visual.\\n\\nFor more information, see [Using tables as visuals](https://docs.aws.amazon.com/quicksight/latest/user/tabular.html) in the *Amazon QuickSight User Guide* .","TreeMapVisual":"A tree map.\\n\\nFor more information, see [Using tree maps](https://docs.aws.amazon.com/quicksight/latest/user/tree-map.html) in the *Amazon QuickSight User Guide* .","WaterfallVisual":"A waterfall chart.\\n\\nFor more information, see [Using waterfall charts](https://docs.aws.amazon.com/quicksight/latest/user/waterfall-chart.html) in the *Amazon QuickSight User Guide* .","WordCloudVisual":"A word cloud.\\n\\nFor more information, see [Using word clouds](https://docs.aws.amazon.com/quicksight/latest/user/word-cloud.html) in the *Amazon QuickSight User Guide* ."}},"AWS::QuickSight::Dashboard.VisualAxisSortOption":{"attributes":{},"description":"The axis sort options for a visual.","properties":{"AvailabilityStatus":"The availaiblity status of a visual\'s axis sort options."}},"AWS::QuickSight::Dashboard.VisualCustomAction":{"attributes":{},"description":"A custom action defined on a visual.","properties":{"ActionOperations":"A list of `VisualCustomActionOperations` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","CustomActionId":"The ID of the `VisualCustomAction` .","Name":"The name of the `VisualCustomAction` .","Status":"The status of the `VisualCustomAction` .","Trigger":"The trigger of the `VisualCustomAction` .\\n\\nValid values are defined as follows:\\n\\n- `DATA_POINT_CLICK` : Initiates a custom action by a left pointer click on a data point.\\n- `DATA_POINT_MENU` : Initiates a custom action by right pointer click from the menu."}},"AWS::QuickSight::Dashboard.VisualCustomActionOperation":{"attributes":{},"description":"The operation that is defined by the custom action.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FilterOperation":"The filter operation that filters data included in a visual or in an entire sheet.","NavigationOperation":"The navigation operation that navigates between different sheets in the same analysis.","SetParametersOperation":"The set parameter operation that sets parameters in custom action.","URLOperation":"The URL operation that opens a link to another webpage."}},"AWS::QuickSight::Dashboard.VisualMenuOption":{"attributes":{},"description":"The menu options for a visual.","properties":{"AvailabilityStatus":"The availaiblity status of a visual\'s menu options."}},"AWS::QuickSight::Dashboard.VisualPalette":{"attributes":{},"description":"The visual display options for the visual palette.","properties":{"ChartColor":"The chart color options for the visual palette.","ColorMap":"The color map options for the visual palette."}},"AWS::QuickSight::Dashboard.VisualSubtitleLabelOptions":{"attributes":{},"description":"The subtitle label options for a visual.","properties":{"FormatText":"The long text format of the subtitle label, such as plain text or rich text.","Visibility":"The visibility of the subtitle label."}},"AWS::QuickSight::Dashboard.VisualTitleLabelOptions":{"attributes":{},"description":"The title label options for a visual.","properties":{"FormatText":"The short text format of the title label, such as plain text or rich text.","Visibility":"The visibility of the title label."}},"AWS::QuickSight::Dashboard.WaterfallChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a waterfall visual.","properties":{"Breakdowns":"The breakdown field wells of a waterfall visual.","Categories":"The category field wells of a waterfall visual.","Values":"The value field wells of a waterfall visual."}},"AWS::QuickSight::Dashboard.WaterfallChartConfiguration":{"attributes":{},"description":"The configuration for a waterfall visual.","properties":{"CategoryAxisDisplayOptions":"The options that determine the presentation of the category axis.","CategoryAxisLabelOptions":"The options that determine the presentation of the category axis label.","DataLabels":"The data label configuration of a waterfall visual.","FieldWells":"The field well configuration of a waterfall visual.","Legend":"The legend configuration of a waterfall visual.","PrimaryYAxisDisplayOptions":"The options that determine the presentation of the y-axis.","PrimaryYAxisLabelOptions":"The options that determine the presentation of the y-axis label.","SortConfiguration":"The sort configuration of a waterfall visual.","VisualPalette":"The visual palette configuration of a waterfall visual.","WaterfallChartOptions":"The options that determine the presentation of a waterfall visual."}},"AWS::QuickSight::Dashboard.WaterfallChartFieldWells":{"attributes":{},"description":"The field well configuration of a waterfall visual.","properties":{"WaterfallChartAggregatedFieldWells":"The field well configuration of a waterfall visual."}},"AWS::QuickSight::Dashboard.WaterfallChartOptions":{"attributes":{},"description":"The options that determine the presentation of a waterfall visual.","properties":{"TotalBarLabel":"This option determines the total bar label of a waterfall visual."}},"AWS::QuickSight::Dashboard.WaterfallChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a waterfall visual.","properties":{"BreakdownItemsLimit":"The limit on the number of bar groups that are displayed.","CategorySort":"The sort configuration of the category fields."}},"AWS::QuickSight::Dashboard.WaterfallVisual":{"attributes":{},"description":"A waterfall chart.\\n\\nFor more information, see [Using waterfall charts](https://docs.aws.amazon.com/quicksight/latest/user/waterfall-chart.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration for a waterfall visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Dashboard.WhatIfPointScenario":{"attributes":{},"description":"Provides the forecast to meet the target for a particular date.","properties":{"Date":"The date that you need the forecast results for.","Value":"The target value that you want to meet for the provided date."}},"AWS::QuickSight::Dashboard.WhatIfRangeScenario":{"attributes":{},"description":"Provides the forecast to meet the target for a particular date range.","properties":{"EndDate":"The end date in the date range that you need the forecast results for.","StartDate":"The start date in the date range that you need the forecast results for.","Value":"The target value that you want to meet for the provided date range."}},"AWS::QuickSight::Dashboard.WordCloudAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a word cloud.","properties":{"GroupBy":"The group by field well of a word cloud. Values are grouped by group by fields.","Size":"The size field well of a word cloud. Values are aggregated based on group by fields."}},"AWS::QuickSight::Dashboard.WordCloudChartConfiguration":{"attributes":{},"description":"The configuration of a word cloud visual.","properties":{"CategoryLabelOptions":"The label options (label text, label visibility, and sort icon visibility) for the word cloud category.","FieldWells":"The field wells of the visual.","SortConfiguration":"The sort configuration of a word cloud visual.","WordCloudOptions":"The options for a word cloud visual."}},"AWS::QuickSight::Dashboard.WordCloudFieldWells":{"attributes":{},"description":"The field wells of a word cloud visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"WordCloudAggregatedFieldWells":"The aggregated field wells of a word cloud."}},"AWS::QuickSight::Dashboard.WordCloudOptions":{"attributes":{},"description":"The word cloud options for a word cloud visual.","properties":{"CloudLayout":"The cloud layout options (fluid, normal) of a word cloud.","MaximumStringLength":"The length limit of each word from 1-100.","WordCasing":"The word casing options (lower_case, existing_case) for the words in a word cloud.","WordOrientation":"The word orientation options (horizontal, horizontal_and_vertical) for the words in a word cloud.","WordPadding":"The word padding options (none, small, medium, large) for the words in a word cloud.","WordScaling":"The word scaling options (emphasize, normal) for the words in a word cloud."}},"AWS::QuickSight::Dashboard.WordCloudSortConfiguration":{"attributes":{},"description":"The sort configuration of a word cloud visual.","properties":{"CategoryItemsLimit":"The limit on the number of groups that are displayed in a word cloud.","CategorySort":"The sort configuration of group by fields."}},"AWS::QuickSight::Dashboard.WordCloudVisual":{"attributes":{},"description":"A word cloud.\\n\\nFor more information, see [Using word clouds](https://docs.aws.amazon.com/quicksight/latest/user/word-cloud.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::DataSet":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the dataset.","ConsumedSpiceCapacityInBytes":"","CreatedTime":"The time this dataset version was created.","LastUpdatedTime":"The time this dataset version was last updated.","OutputColumns":""},"description":"Creates a dataset. This operation doesn\'t support datasets that include uploaded files as a source.","properties":{"AwsAccountId":"The AWS account ID.","ColumnGroups":"Groupings of columns that work together in certain Amazon QuickSight features. Currently, only geospatial hierarchy is supported.","ColumnLevelPermissionRules":"A set of one or more definitions of a `ColumnLevelPermissionRule` .","DataSetId":"An ID for the dataset that you want to create. This ID is unique per AWS Region for each AWS account.","DataSetRefreshProperties":"","DataSetUsageConfiguration":"The usage configuration to apply to child datasets that reference this dataset as a source.","DatasetParameters":"","FieldFolders":"The folder that contains fields and nested subfolders for your dataset.","ImportMode":"Indicates whether you want to import the data into SPICE.","IngestionWaitPolicy":"The wait policy to use when creating or updating a Dataset. The default is to wait for SPICE ingestion to finish with timeout of 36 hours.","LogicalTableMap":"Configures the combination and transformation of the data from the physical tables.","Name":"The display name for the dataset.","Permissions":"A list of resource permissions on the dataset.","PhysicalTableMap":"Declares the physical tables that are available in the underlying data sources.","RowLevelPermissionDataSet":"The row-level security configuration for the data that you want to create.","RowLevelPermissionTagConfiguration":"The element you can use to define tags for row-level security.","Tags":"Contains a map of the key-value pairs for the resource tag or tags assigned to the dataset."}},"AWS::QuickSight::DataSet.CalculatedColumn":{"attributes":{},"description":"A calculated column for a dataset.","properties":{"ColumnId":"A unique ID to identify a calculated column. During a dataset update, if the column ID of a calculated column matches that of an existing calculated column, Amazon QuickSight preserves the existing calculated column.","ColumnName":"Column name.","Expression":"An expression that defines the calculated column."}},"AWS::QuickSight::DataSet.CastColumnTypeOperation":{"attributes":{},"description":"A transform operation that casts a column to a different type.","properties":{"ColumnName":"Column name.","Format":"When casting a column from string to datetime type, you can supply a string in a format supported by Amazon QuickSight to denote the source data format.","NewColumnType":"New column data type."}},"AWS::QuickSight::DataSet.ColumnDescription":{"attributes":{},"description":"Metadata that contains a description for a column.","properties":{"Text":"The text of a description for a column."}},"AWS::QuickSight::DataSet.ColumnGroup":{"attributes":{},"description":"Groupings of columns that work together in certain Amazon QuickSight features. This is a variant type structure. For this structure to be valid, only one of the attributes can be non-null.","properties":{"GeoSpatialColumnGroup":"Geospatial column group that denotes a hierarchy."}},"AWS::QuickSight::DataSet.ColumnLevelPermissionRule":{"attributes":{},"description":"A rule defined to grant access on one or more restricted columns. Each dataset can have multiple rules. To create a restricted column, you add it to one or more rules. Each rule must contain at least one column and at least one user or group. To be able to see a restricted column, a user or group needs to be added to a rule for that column.","properties":{"ColumnNames":"An array of column names.","Principals":"An array of Amazon Resource Names (ARNs) for Amazon QuickSight users or groups."}},"AWS::QuickSight::DataSet.ColumnTag":{"attributes":{},"description":"A tag for a column in a `[TagColumnOperation](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_TagColumnOperation.html)` structure. This is a variant type structure. For this structure to be valid, only one of the attributes can be non-null.","properties":{"ColumnDescription":"A description for a column.","ColumnGeographicRole":"A geospatial role for a column."}},"AWS::QuickSight::DataSet.CreateColumnsOperation":{"attributes":{},"description":"A transform operation that creates calculated columns. Columns created in one such operation form a lexical closure.","properties":{"Columns":"Calculated columns to create."}},"AWS::QuickSight::DataSet.CustomSql":{"attributes":{},"description":"A physical table type built from the results of the custom SQL query.","properties":{"Columns":"The column schema from the SQL query result set.","DataSourceArn":"The Amazon Resource Name (ARN) of the data source.","Name":"A display name for the SQL query result.","SqlQuery":"The SQL query."}},"AWS::QuickSight::DataSet.DataSetRefreshProperties":{"attributes":{},"description":"The refresh properties of a dataset.","properties":{"RefreshConfiguration":"The refresh configuration for a dataset."}},"AWS::QuickSight::DataSet.DataSetUsageConfiguration":{"attributes":{},"description":"The usage configuration to apply to child datasets that reference this dataset as a source.","properties":{"DisableUseAsDirectQuerySource":"An option that controls whether a child dataset of a direct query can use this dataset as a source.","DisableUseAsImportedSource":"An option that controls whether a child dataset that\'s stored in QuickSight can use this dataset as a source."}},"AWS::QuickSight::DataSet.DatasetParameter":{"attributes":{},"description":"","properties":{"DateTimeDatasetParameter":"","DecimalDatasetParameter":"","IntegerDatasetParameter":"","StringDatasetParameter":""}},"AWS::QuickSight::DataSet.DateTimeDatasetParameter":{"attributes":{},"description":"","properties":{"DefaultValues":"","Id":"","Name":"","TimeGranularity":"","ValueType":""}},"AWS::QuickSight::DataSet.DateTimeDatasetParameterDefaultValues":{"attributes":{},"description":"","properties":{"StaticValues":"A list of static default values for a given date time parameter. The valid format for this property is `yyyy-MM-dd’T’HH:mm:ss’Z’` ."}},"AWS::QuickSight::DataSet.DecimalDatasetParameter":{"attributes":{},"description":"","properties":{"DefaultValues":"","Id":"","Name":"","ValueType":""}},"AWS::QuickSight::DataSet.DecimalDatasetParameterDefaultValues":{"attributes":{},"description":"","properties":{"StaticValues":""}},"AWS::QuickSight::DataSet.FieldFolder":{"attributes":{},"description":"A FieldFolder element is a folder that contains fields and nested subfolders.","properties":{"Columns":"A folder has a list of columns. A column can only be in one folder.","Description":"The description for a field folder."}},"AWS::QuickSight::DataSet.FilterOperation":{"attributes":{},"description":"A transform operation that filters rows based on a condition.","properties":{"ConditionExpression":"An expression that must evaluate to a Boolean value. Rows for which the expression evaluates to true are kept in the dataset."}},"AWS::QuickSight::DataSet.GeoSpatialColumnGroup":{"attributes":{},"description":"Geospatial column group that denotes a hierarchy.","properties":{"Columns":"Columns in this hierarchy.","CountryCode":"Country code.","Name":"A display name for the hierarchy."}},"AWS::QuickSight::DataSet.IncrementalRefresh":{"attributes":{},"description":"The incremental refresh configuration for a dataset.","properties":{"LookbackWindow":"The lookback window setup for an incremental refresh configuration."}},"AWS::QuickSight::DataSet.IngestionWaitPolicy":{"attributes":{},"description":"The wait policy to use when creating or updating a Dataset. The default is to wait for SPICE ingestion to finish with timeout of 36 hours.","properties":{"IngestionWaitTimeInHours":"The maximum time (in hours) to wait for Ingestion to complete. Default timeout is 36 hours. Applicable only when `DataSetImportMode` mode is set to SPICE and `WaitForSpiceIngestion` is set to true.","WaitForSpiceIngestion":"Wait for SPICE ingestion to finish to mark dataset creation or update as successful. Default (true). Applicable only when `DataSetImportMode` mode is set to SPICE."}},"AWS::QuickSight::DataSet.InputColumn":{"attributes":{},"description":"Metadata for a column that is used as the input of a transform operation.","properties":{"Name":"The name of this column in the underlying data source.","Type":"The data type of the column."}},"AWS::QuickSight::DataSet.IntegerDatasetParameter":{"attributes":{},"description":"","properties":{"DefaultValues":"","Id":"","Name":"","ValueType":""}},"AWS::QuickSight::DataSet.IntegerDatasetParameterDefaultValues":{"attributes":{},"description":"","properties":{"StaticValues":""}},"AWS::QuickSight::DataSet.JoinInstruction":{"attributes":{},"description":"The instructions associated with a join.","properties":{"LeftJoinKeyProperties":"Join key properties of the left operand.","LeftOperand":"The operand on the left side of a join.","OnClause":"The join instructions provided in the `ON` clause of a join.","RightJoinKeyProperties":"Join key properties of the right operand.","RightOperand":"The operand on the right side of a join.","Type":"The type of join that it is."}},"AWS::QuickSight::DataSet.JoinKeyProperties":{"attributes":{},"description":"Properties associated with the columns participating in a join.","properties":{"UniqueKey":"A value that indicates that a row in a table is uniquely identified by the columns in a join key. This is used by Amazon QuickSight to optimize query performance."}},"AWS::QuickSight::DataSet.LogicalTable":{"attributes":{},"description":"A *logical table* is a unit that joins and that data transformations operate on. A logical table has a source, which can be either a physical table or result of a join. When a logical table points to a physical table, the logical table acts as a mutable copy of that physical table through transform operations.","properties":{"Alias":"A display name for the logical table.","DataTransforms":"Transform operations that act on this logical table. For this structure to be valid, only one of the attributes can be non-null.","Source":"Source of this logical table."}},"AWS::QuickSight::DataSet.LogicalTableSource":{"attributes":{},"description":"Information about the source of a logical table. This is a variant type structure. For this structure to be valid, only one of the attributes can be non-null.","properties":{"DataSetArn":"The Amazon Resource Number (ARN) of the parent dataset.","JoinInstruction":"Specifies the result of a join of two logical tables.","PhysicalTableId":"Physical table ID."}},"AWS::QuickSight::DataSet.LookbackWindow":{"attributes":{},"description":"The lookback window setup of an incremental refresh configuration.","properties":{"ColumnName":"The name of the lookback window column.","Size":"The lookback window column size.","SizeUnit":"The size unit that is used for the lookback window column. Valid values for this structure are `HOUR` , `DAY` , and `WEEK` ."}},"AWS::QuickSight::DataSet.NewDefaultValues":{"attributes":{},"description":"","properties":{"DateTimeStaticValues":"A list of static default values for a given date time parameter. The valid format for this property is `yyyy-MM-dd’T’HH:mm:ss’Z’` .","DecimalStaticValues":"","IntegerStaticValues":"","StringStaticValues":""}},"AWS::QuickSight::DataSet.OutputColumn":{"attributes":{},"description":"Output column.","properties":{"Description":"A description for a column.","Name":"A display name for the dataset.","Type":"The type."}},"AWS::QuickSight::DataSet.OverrideDatasetParameterOperation":{"attributes":{},"description":"A transform operation that overrides the dataset parameter values that are defined in another dataset.","properties":{"NewDefaultValues":"The new default values for the parameter.","NewParameterName":"The new name for the parameter.","ParameterName":""}},"AWS::QuickSight::DataSet.PhysicalTable":{"attributes":{},"description":"A view of a data source that contains information about the shape of the data in the underlying source. This is a variant type structure. For this structure to be valid, only one of the attributes can be non-null.","properties":{"CustomSql":"A physical table type built from the results of the custom SQL query.","RelationalTable":"A physical table type for relational data sources.","S3Source":"A physical table type for as S3 data source."}},"AWS::QuickSight::DataSet.ProjectOperation":{"attributes":{},"description":"A transform operation that projects columns. Operations that come after a projection can only refer to projected columns.","properties":{"ProjectedColumns":"Projected columns."}},"AWS::QuickSight::DataSet.RefreshConfiguration":{"attributes":{},"description":"The refresh configuration of a dataset.","properties":{"IncrementalRefresh":"The incremental refresh for the dataset."}},"AWS::QuickSight::DataSet.RelationalTable":{"attributes":{},"description":"A physical table type for relational data sources.","properties":{"Catalog":"","DataSourceArn":"The Amazon Resource Name (ARN) for the data source.","InputColumns":"The column schema of the table.","Name":"The name of the relational table.","Schema":"The schema name. This name applies to certain relational database engines."}},"AWS::QuickSight::DataSet.RenameColumnOperation":{"attributes":{},"description":"A transform operation that renames a column.","properties":{"ColumnName":"The name of the column to be renamed.","NewColumnName":"The new name for the column."}},"AWS::QuickSight::DataSet.ResourcePermission":{"attributes":{},"description":"Permission for the resource.","properties":{"Actions":"The IAM action to grant or revoke permisions on","Principal":"The Amazon Resource Name (ARN) of the principal. This can be one of the following:\\n\\n- The ARN of an Amazon QuickSight user or group associated with a data source or dataset. (This is common.)\\n- The ARN of an Amazon QuickSight user, group, or namespace associated with an analysis, dashboard, template, or theme. (This is common.)\\n- The ARN of an AWS account root: This is an IAM ARN rather than a Amazon QuickSight ARN. Use this option only to share resources (templates) across AWS accounts . (This is less common.)"}},"AWS::QuickSight::DataSet.RowLevelPermissionDataSet":{"attributes":{},"description":"Information about a dataset that contains permissions for row-level security (RLS). The permissions dataset maps fields to users or groups. For more information, see [Using Row-Level Security (RLS) to Restrict Access to a Dataset](https://docs.aws.amazon.com/quicksight/latest/user/restrict-access-to-a-data-set-using-row-level-security.html) in the *Amazon QuickSight User Guide* .\\n\\nThe option to deny permissions by setting `PermissionPolicy` to `DENY_ACCESS` is not supported for new RLS datasets.","properties":{"Arn":"The Amazon Resource Name (ARN) of the dataset that contains permissions for RLS.","FormatVersion":"The user or group rules associated with the dataset that contains permissions for RLS.\\n\\nBy default, `FormatVersion` is `VERSION_1` . When `FormatVersion` is `VERSION_1` , `UserName` and `GroupName` are required. When `FormatVersion` is `VERSION_2` , `UserARN` and `GroupARN` are required, and `Namespace` must not exist.","Namespace":"The namespace associated with the dataset that contains permissions for RLS.","PermissionPolicy":"The type of permissions to use when interpreting the permissions for RLS. `DENY_ACCESS` is included for backward compatibility only.","Status":"The status of the row-level security permission dataset. If enabled, the status is `ENABLED` . If disabled, the status is `DISABLED` ."}},"AWS::QuickSight::DataSet.RowLevelPermissionTagConfiguration":{"attributes":{},"description":"","properties":{"Status":"","TagRuleConfigurations":"","TagRules":""}},"AWS::QuickSight::DataSet.RowLevelPermissionTagRule":{"attributes":{},"description":"","properties":{"ColumnName":"","MatchAllValue":"","TagKey":"","TagMultiValueDelimiter":""}},"AWS::QuickSight::DataSet.S3Source":{"attributes":{},"description":"A physical table type for an S3 data source.","properties":{"DataSourceArn":"The Amazon Resource Name (ARN) for the data source.","InputColumns":"A physical table type for an S3 data source.\\n\\n> For files that aren\'t JSON, only `STRING` data types are supported in input columns.","UploadSettings":"Information about the format for the S3 source file or files."}},"AWS::QuickSight::DataSet.StringDatasetParameter":{"attributes":{},"description":"","properties":{"DefaultValues":"","Id":"","Name":"","ValueType":""}},"AWS::QuickSight::DataSet.StringDatasetParameterDefaultValues":{"attributes":{},"description":"","properties":{"StaticValues":""}},"AWS::QuickSight::DataSet.TagColumnOperation":{"attributes":{},"description":"A transform operation that tags a column with additional information.","properties":{"ColumnName":"The column that this operation acts on.","Tags":"The dataset column tag, currently only used for geospatial type tagging.\\n\\n> This is not tags for the AWS tagging feature."}},"AWS::QuickSight::DataSet.TransformOperation":{"attributes":{},"description":"A data transformation on a logical table. This is a variant type structure. For this structure to be valid, only one of the attributes can be non-null.","properties":{"CastColumnTypeOperation":"A transform operation that casts a column to a different type.","CreateColumnsOperation":"An operation that creates calculated columns. Columns created in one such operation form a lexical closure.","FilterOperation":"An operation that filters rows based on some condition.","OverrideDatasetParameterOperation":"","ProjectOperation":"An operation that projects columns. Operations that come after a projection can only refer to projected columns.","RenameColumnOperation":"An operation that renames a column.","TagColumnOperation":"An operation that tags a column with additional information."}},"AWS::QuickSight::DataSet.UploadSettings":{"attributes":{},"description":"Information about the format for a source file or files.","properties":{"ContainsHeader":"Whether the file has a header row, or the files each have a header row.","Delimiter":"The delimiter between values in the file.","Format":"File format.","StartFromRow":"A row number to start reading data from.","TextQualifier":"Text qualifier."}},"AWS::QuickSight::DataSource":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the dataset.","CreatedTime":"The time that this data source was created.","LastUpdatedTime":"The last time that this data source was updated.","Status":"The HTTP status of the request."},"description":"Creates a data source.","properties":{"AlternateDataSourceParameters":"A set of alternate data source parameters that you want to share for the credentials stored with this data source. The credentials are applied in tandem with the data source parameters when you copy a data source by using a create or update request. The API operation compares the `DataSourceParameters` structure that\'s in the request with the structures in the `AlternateDataSourceParameters` allow list. If the structures are an exact match, the request is allowed to use the credentials from this existing data source. If the `AlternateDataSourceParameters` list is null, the `Credentials` originally used with this `DataSourceParameters` are automatically allowed.","AwsAccountId":"The AWS account ID.","Credentials":"The credentials Amazon QuickSight that uses to connect to your underlying source. Currently, only credentials based on user name and password are supported.","DataSourceId":"An ID for the data source. This ID is unique per AWS Region for each AWS account.","DataSourceParameters":"The parameters that Amazon QuickSight uses to connect to your underlying source.","ErrorInfo":"Error information from the last update or the creation of the data source.","Name":"A display name for the data source.","Permissions":"A list of resource permissions on the data source.","SslProperties":"Secure Socket Layer (SSL) properties that apply when Amazon QuickSight connects to your underlying source.","Tags":"Contains a map of the key-value pairs for the resource tag or tags assigned to the data source.","Type":"The type of the data source. To return a list of all data sources, use `ListDataSources` .\\n\\nUse `AMAZON_ELASTICSEARCH` for Amazon OpenSearch Service.","VpcConnectionProperties":"Use this parameter only when you want Amazon QuickSight to use a VPC connection when connecting to your underlying source."}},"AWS::QuickSight::DataSource.AmazonElasticsearchParameters":{"attributes":{},"description":"The parameters for OpenSearch.","properties":{"Domain":"The OpenSearch domain."}},"AWS::QuickSight::DataSource.AmazonOpenSearchParameters":{"attributes":{},"description":"The parameters for OpenSearch.","properties":{"Domain":"The OpenSearch domain."}},"AWS::QuickSight::DataSource.AthenaParameters":{"attributes":{},"description":"Parameters for Amazon Athena.","properties":{"RoleArn":"Use the `RoleArn` structure to override an account-wide role for a specific Athena data source. For example, say an account administrator has turned off all Athena access with an account-wide role. The administrator can then use `RoleArn` to bypass the account-wide role and allow Athena access for the single Athena data source that is specified in the structure, even if the account-wide role forbidding Athena access is still active.","WorkGroup":"The workgroup that Amazon Athena uses."}},"AWS::QuickSight::DataSource.AuroraParameters":{"attributes":{},"description":"Parameters for Amazon Aurora.","properties":{"Database":"Database.","Host":"Host.","Port":"Port."}},"AWS::QuickSight::DataSource.AuroraPostgreSqlParameters":{"attributes":{},"description":"Parameters for Amazon Aurora PostgreSQL-Compatible Edition.","properties":{"Database":"The Amazon Aurora PostgreSQL database to connect to.","Host":"The Amazon Aurora PostgreSQL-Compatible host to connect to.","Port":"The port that Amazon Aurora PostgreSQL is listening on."}},"AWS::QuickSight::DataSource.CredentialPair":{"attributes":{},"description":"The combination of user name and password that are used as credentials.","properties":{"AlternateDataSourceParameters":"A set of alternate data source parameters that you want to share for these credentials. The credentials are applied in tandem with the data source parameters when you copy a data source by using a create or update request. The API operation compares the `DataSourceParameters` structure that\'s in the request with the structures in the `AlternateDataSourceParameters` allow list. If the structures are an exact match, the request is allowed to use the new data source with the existing credentials. If the `AlternateDataSourceParameters` list is null, the `DataSourceParameters` originally used with these `Credentials` is automatically allowed.","Password":"Password.","Username":"User name."}},"AWS::QuickSight::DataSource.DataSourceCredentials":{"attributes":{},"description":"Data source credentials. This is a variant type structure. For this structure to be valid, only one of the attributes can be non-null.","properties":{"CopySourceArn":"The Amazon Resource Name (ARN) of a data source that has the credential pair that you want to use. When `CopySourceArn` is not null, the credential pair from the data source in the ARN is used as the credentials for the `DataSourceCredentials` structure.","CredentialPair":"Credential pair. For more information, see `[CredentialPair](https://docs.aws.amazon.com/quicksight/latest/APIReference/API_CredentialPair.html)` .","SecretArn":"The Amazon Resource Name (ARN) of the secret associated with the data source in AWS Secrets Manager ."}},"AWS::QuickSight::DataSource.DataSourceErrorInfo":{"attributes":{},"description":"Error information for the data source creation or update.","properties":{"Message":"Error message.","Type":"Error type."}},"AWS::QuickSight::DataSource.DataSourceParameters":{"attributes":{},"description":"The parameters that Amazon QuickSight uses to connect to your underlying data source. This is a variant type structure. For this structure to be valid, only one of the attributes can be non-null.","properties":{"AmazonElasticsearchParameters":"The parameters for OpenSearch.","AmazonOpenSearchParameters":"The parameters for OpenSearch.","AthenaParameters":"The parameters for Amazon Athena.","AuroraParameters":"The parameters for Amazon Aurora MySQL.","AuroraPostgreSqlParameters":"The parameters for Amazon Aurora.","DatabricksParameters":"The required parameters that are needed to connect to a Databricks data source.","MariaDbParameters":"The parameters for MariaDB.","MySqlParameters":"The parameters for MySQL.","OracleParameters":"Oracle parameters.","PostgreSqlParameters":"The parameters for PostgreSQL.","PrestoParameters":"The parameters for Presto.","RdsParameters":"The parameters for Amazon RDS.","RedshiftParameters":"The parameters for Amazon Redshift.","S3Parameters":"The parameters for S3.","SnowflakeParameters":"The parameters for Snowflake.","SparkParameters":"The parameters for Spark.","SqlServerParameters":"The parameters for SQL Server.","TeradataParameters":"The parameters for Teradata."}},"AWS::QuickSight::DataSource.DatabricksParameters":{"attributes":{},"description":"The required parameters that are needed to connect to a Databricks data source.","properties":{"Host":"The host name of the Databricks data source.","Port":"The port for the Databricks data source.","SqlEndpointPath":"The HTTP path of the Databricks data source."}},"AWS::QuickSight::DataSource.ManifestFileLocation":{"attributes":{},"description":"Amazon S3 manifest file location.","properties":{"Bucket":"Amazon S3 bucket.","Key":"Amazon S3 key that identifies an object."}},"AWS::QuickSight::DataSource.MariaDbParameters":{"attributes":{},"description":"The parameters for MariaDB.","properties":{"Database":"Database.","Host":"Host.","Port":"Port."}},"AWS::QuickSight::DataSource.MySqlParameters":{"attributes":{},"description":"The parameters for MySQL.","properties":{"Database":"Database.","Host":"Host.","Port":"Port."}},"AWS::QuickSight::DataSource.OracleParameters":{"attributes":{},"description":"Oracle parameters.","properties":{"Database":"Database.","Host":"Host.","Port":"Port."}},"AWS::QuickSight::DataSource.PostgreSqlParameters":{"attributes":{},"description":"The parameters for PostgreSQL.","properties":{"Database":"Database.","Host":"Host.","Port":"Port."}},"AWS::QuickSight::DataSource.PrestoParameters":{"attributes":{},"description":"The parameters for Presto.","properties":{"Catalog":"Catalog.","Host":"Host.","Port":"Port."}},"AWS::QuickSight::DataSource.RdsParameters":{"attributes":{},"description":"The parameters for Amazon RDS.","properties":{"Database":"Database.","InstanceId":"Instance ID."}},"AWS::QuickSight::DataSource.RedshiftParameters":{"attributes":{},"description":"The parameters for Amazon Redshift. The `ClusterId` field can be blank if `Host` and `Port` are both set. The `Host` and `Port` fields can be blank if the `ClusterId` field is set.","properties":{"ClusterId":"Cluster ID. This field can be blank if the `Host` and `Port` are provided.","Database":"Database.","Host":"Host. This field can be blank if `ClusterId` is provided.","Port":"Port. This field can be blank if the `ClusterId` is provided."}},"AWS::QuickSight::DataSource.ResourcePermission":{"attributes":{},"description":"Permission for the resource.","properties":{"Actions":"The IAM action to grant or revoke permissions on.","Principal":"The Amazon Resource Name (ARN) of the principal. This can be one of the following:\\n\\n- The ARN of an Amazon QuickSight user or group associated with a data source or dataset. (This is common.)\\n- The ARN of an Amazon QuickSight user, group, or namespace associated with an analysis, dashboard, template, or theme. (This is common.)\\n- The ARN of an AWS account root: This is an IAM ARN rather than a Amazon QuickSight ARN. Use this option only to share resources (templates) across AWS accounts . (This is less common.)"}},"AWS::QuickSight::DataSource.S3Parameters":{"attributes":{},"description":"The parameters for S3.","properties":{"ManifestFileLocation":"Location of the Amazon S3 manifest file. This is NULL if the manifest file was uploaded into Amazon QuickSight.","RoleArn":"Use the `RoleArn` structure to override an account-wide role for a specific S3 data source. For example, say an account administrator has turned off all S3 access with an account-wide role. The administrator can then use `RoleArn` to bypass the account-wide role and allow S3 access for the single S3 data source that is specified in the structure, even if the account-wide role forbidding S3 access is still active."}},"AWS::QuickSight::DataSource.SnowflakeParameters":{"attributes":{},"description":"The parameters for Snowflake.","properties":{"Database":"Database.","Host":"Host.","Warehouse":"Warehouse."}},"AWS::QuickSight::DataSource.SparkParameters":{"attributes":{},"description":"The parameters for Spark.","properties":{"Host":"Host.","Port":"Port."}},"AWS::QuickSight::DataSource.SqlServerParameters":{"attributes":{},"description":"The parameters for SQL Server.","properties":{"Database":"Database.","Host":"Host.","Port":"Port."}},"AWS::QuickSight::DataSource.SslProperties":{"attributes":{},"description":"Secure Socket Layer (SSL) properties that apply when Amazon QuickSight connects to your underlying data source.","properties":{"DisableSsl":"A Boolean option to control whether SSL should be disabled."}},"AWS::QuickSight::DataSource.TeradataParameters":{"attributes":{},"description":"The parameters for Teradata.","properties":{"Database":"Database.","Host":"Host.","Port":"Port."}},"AWS::QuickSight::DataSource.VpcConnectionProperties":{"attributes":{},"description":"VPC connection properties.","properties":{"VpcConnectionArn":"The Amazon Resource Name (ARN) for the VPC connection."}},"AWS::QuickSight::RefreshSchedule":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the refresh schedule.","Ref":""},"description":"Creates a refresh schedule for a dataset in Amazon QuickSight .","properties":{"AwsAccountId":"The AWS account ID of the account that you are creating a schedule in.","DataSetId":"The ID of the dataset that you are creating a refresh schedule for.","Schedule":"The refresh schedule of a dataset."}},"AWS::QuickSight::RefreshSchedule.RefreshOnDay":{"attributes":{},"description":"The day that you want yout dataset to refresh.","properties":{"DayOfMonth":"The day of the month that you want your dataset to refresh. This value is required for monthly refresh intervals.","DayOfWeek":"The day of the week that you want to schedule the refresh on. This value is required for weekly and monthly refresh intervals."}},"AWS::QuickSight::RefreshSchedule.RefreshScheduleMap":{"attributes":{},"description":"A summary of a configured refresh schedule for a dataset.","properties":{"RefreshType":"The type of refresh that a dataset undergoes. Valid values are as follows:\\n\\n- `FULL_REFRESH` : A complete refresh of a dataset.\\n- `INCREMENTAL_REFRESH` : A partial refresh of some rows of a dataset, based on the time window specified.\\n\\nFor more information on full and incremental refreshes, see [Refreshing SPICE data](https://docs.aws.amazon.com/quicksight/latest/user/refreshing-imported-data.html) in the *Amazon QuickSight User Guide* .","ScheduleFrequency":"The frequency for the refresh schedule.","ScheduleId":"An identifier for the refresh schedule.","StartAfterDateTime":"Time after which the refresh schedule can be started, expressed in `YYYY-MM-DDTHH:MM:SS` format."}},"AWS::QuickSight::RefreshSchedule.ScheduleFrequency":{"attributes":{},"description":"The frequency for the refresh schedule.","properties":{"Interval":"The interval between scheduled refreshes. Valid values are as follows:\\n\\n- `MINUTE15` : The dataset refreshes every 15 minutes. This value is only supported for incremental refreshes. This interval can only be used for one schedule per dataset.\\n- `MINUTE30` : The dataset refreshes every 30 minutes. This value is only supported for incremental refreshes. This interval can only be used for one schedule per dataset.\\n- `HOURLY` : The dataset refreshes every hour. This interval can only be used for one schedule per dataset.\\n- `DAILY` : The dataset refreshes every day.\\n- `WEEKLY` : The dataset refreshes every week.\\n- `MONTHLY` : The dataset refreshes every month.","RefreshOnDay":"The day of the week that you want to schedule the refresh on. This value is required for weekly and monthly refresh intervals.","TimeOfTheDay":"The time of day that you want the dataset to refresh. This value is expressed in HH:MM format. This field is not required for schedules that refresh hourly.","TimeZone":"The timezone that you want the refresh schedule to use. The timezone ID must match a corresponding ID found on `java.util.time.getAvailableIDs()` ."}},"AWS::QuickSight::Template":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the template.","CreatedTime":"The time this template was created.","LastUpdatedTime":"The time this template was last updated.","Version":"The version of the template.","Version.CreatedTime":"","Version.DataSetConfigurations":"","Version.Description":"","Version.Errors":"","Version.Sheets":"","Version.SourceEntityArn":"","Version.Status":"","Version.ThemeArn":"","Version.VersionNumber":""},"description":"Creates a template from an existing Amazon QuickSight analysis or template. You can use the resulting template to create a dashboard.\\n\\nA *template* is an entity in Amazon QuickSight that encapsulates the metadata required to create an analysis and that you can use to create s dashboard. A template adds a layer of abstraction by using placeholders to replace the dataset associated with the analysis. You can use templates to create dashboards by replacing dataset placeholders with datasets that follow the same schema that was used to create the source analysis and template.","properties":{"AwsAccountId":"The ID for the AWS account that the group is in. You use the ID for the AWS account that contains your Amazon QuickSight account.","Definition":"","Name":"A display name for the template.","Permissions":"A list of resource permissions to be set on the template.","SourceEntity":"The entity that you are using as a source when you create the template. In `SourceEntity` , you specify the type of object you\'re using as source: `SourceTemplate` for a template or `SourceAnalysis` for an analysis. Both of these require an Amazon Resource Name (ARN). For `SourceTemplate` , specify the ARN of the source template. For `SourceAnalysis` , specify the ARN of the source analysis. The `SourceTemplate` ARN can contain any AWS account and any Amazon QuickSight-supported AWS Region .\\n\\nUse the `DataSetReferences` entity within `SourceTemplate` or `SourceAnalysis` to list the replacement datasets for the placeholders listed in the original. The schema in each dataset must match its placeholder.\\n\\nEither a `SourceEntity` or a `Definition` must be provided in order for the request to be valid.","Tags":"Contains a map of the key-value pairs for the resource tag or tags assigned to the resource.","TemplateId":"An ID for the template that you want to create. This template is unique per AWS Region ; in each AWS account.","VersionDescription":"A description of the current template version being created. This API operation creates the first version of the template. Every time `UpdateTemplate` is called, a new version is created. Each version of the template maintains a description of the version in the `VersionDescription` field."}},"AWS::QuickSight::Template.AggregationFunction":{"attributes":{},"description":"An aggregation function aggregates values from a dimension or measure.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CategoricalAggregationFunction":"Aggregation for categorical values.\\n\\n- `COUNT` : Aggregate by the total number of values, including duplicates.\\n- `DISTINCT_COUNT` : Aggregate by the total number of distinct values.","DateAggregationFunction":"Aggregation for date values.\\n\\n- `COUNT` : Aggregate by the total number of values, including duplicates.\\n- `DISTINCT_COUNT` : Aggregate by the total number of distinct values.\\n- `MIN` : Select the smallest date value.\\n- `MAX` : Select the largest date value.","NumericalAggregationFunction":"Aggregation for numerical values."}},"AWS::QuickSight::Template.AggregationSortConfiguration":{"attributes":{},"description":"The configuration options to sort aggregated values.","properties":{"AggregationFunction":"The function that aggregates the values in `Column` .","Column":"The column that determines the sort order of aggregated values.","SortDirection":"The sort direction of values.\\n\\n- `ASC` : Sort in ascending order.\\n- `DESC` : Sort in descending order."}},"AWS::QuickSight::Template.AnalysisDefaults":{"attributes":{},"description":"The configuration for default analysis settings.","properties":{"DefaultNewSheetConfiguration":"The configuration for default new sheet settings."}},"AWS::QuickSight::Template.AnchorDateConfiguration":{"attributes":{},"description":"The date configuration of the filter.","properties":{"AnchorOption":"The options for the date configuration. Choose one of the options below:\\n\\n- `NOW`","ParameterName":"The name of the parameter that is used for the anchor date configuration."}},"AWS::QuickSight::Template.ArcAxisConfiguration":{"attributes":{},"description":"The arc axis configuration of a `GaugeChartVisual` .","properties":{"Range":"The arc axis range of a `GaugeChartVisual` .","ReserveRange":"The reserved range of the arc axis."}},"AWS::QuickSight::Template.ArcAxisDisplayRange":{"attributes":{},"description":"The arc axis range of a `GaugeChartVisual` .","properties":{"Max":"The maximum value of the arc axis range.","Min":"The minimum value of the arc axis range."}},"AWS::QuickSight::Template.ArcConfiguration":{"attributes":{},"description":"The arc configuration of a `GaugeChartVisual` .","properties":{"ArcAngle":"The option that determines the arc angle of a `GaugeChartVisual` .","ArcThickness":"The options that determine the arc thickness of a `GaugeChartVisual` ."}},"AWS::QuickSight::Template.ArcOptions":{"attributes":{},"description":"The options that determine the arc thickness of a `GaugeChartVisual` .","properties":{"ArcThickness":"The arc thickness of a `GaugeChartVisual` ."}},"AWS::QuickSight::Template.AxisDataOptions":{"attributes":{},"description":"The data options for an axis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateAxisOptions":"The options for an axis with a date field.","NumericAxisOptions":"The options for an axis with a numeric field."}},"AWS::QuickSight::Template.AxisDisplayMinMaxRange":{"attributes":{},"description":"The minimum and maximum setup for an axis display range.","properties":{"Maximum":"The maximum setup for an axis display range.","Minimum":"The minimum setup for an axis display range."}},"AWS::QuickSight::Template.AxisDisplayOptions":{"attributes":{},"description":"The display options for the axis label.","properties":{"AxisLineVisibility":"Determines whether or not the axis line is visible.","AxisOffset":"The offset value that determines the starting placement of the axis within a visual\'s bounds.","DataOptions":"The data options for an axis.","GridLineVisibility":"Determines whether or not the grid line is visible.","ScrollbarOptions":"The scroll bar options for an axis.","TickLabelOptions":"The tick label options of an axis."}},"AWS::QuickSight::Template.AxisDisplayRange":{"attributes":{},"description":"The range setup of a numeric axis display range.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DataDriven":"The data-driven setup of an axis display range.","MinMax":"The minimum and maximum setup of an axis display range."}},"AWS::QuickSight::Template.AxisLabelOptions":{"attributes":{},"description":"The label options for a chart axis. You must specify the field that the label is targeted to.","properties":{"ApplyTo":"The options that indicate which field the label belongs to.","CustomLabel":"The text for the axis label.","FontConfiguration":"The font configuration of the axis label."}},"AWS::QuickSight::Template.AxisLabelReferenceOptions":{"attributes":{},"description":"The reference that specifies where the axis label is applied to.","properties":{"Column":"The column that the axis label is targeted to.","FieldId":"The field that the axis label is targeted to."}},"AWS::QuickSight::Template.AxisLinearScale":{"attributes":{},"description":"The liner axis scale setup.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"StepCount":"The step count setup of a linear axis.","StepSize":"The step size setup of a linear axis."}},"AWS::QuickSight::Template.AxisLogarithmicScale":{"attributes":{},"description":"The logarithmic axis scale setup.","properties":{"Base":"The base setup of a logarithmic axis scale."}},"AWS::QuickSight::Template.AxisScale":{"attributes":{},"description":"The scale setup options for a numeric axis display.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Linear":"The linear axis scale setup.","Logarithmic":"The logarithmic axis scale setup."}},"AWS::QuickSight::Template.AxisTickLabelOptions":{"attributes":{},"description":"The tick label options of an axis.","properties":{"LabelOptions":"Determines whether or not the axis ticks are visible.","RotationAngle":"The rotation angle of the axis tick labels."}},"AWS::QuickSight::Template.BarChartAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a bar chart.","properties":{"Category":"The category (y-axis) field well of a bar chart.","Colors":"The color (group/color) field well of a bar chart.","SmallMultiples":"The small multiples field well of a bar chart.","Values":"The value field wells of a bar chart. Values are aggregated by category."}},"AWS::QuickSight::Template.BarChartConfiguration":{"attributes":{},"description":"The configuration of a `BarChartVisual` .","properties":{"BarsArrangement":"Determines the arrangement of the bars. The orientation and arrangement of bars determine the type of bar that is used in the visual.","CategoryAxis":"The label display options (grid line, range, scale, axis step) for bar chart category.","CategoryLabelOptions":"The label options (label text, label visibility and sort icon visibility) for a bar chart.","ColorLabelOptions":"The label options (label text, label visibility and sort icon visibility) for a color that is used in a bar chart.","ContributionAnalysisDefaults":"The contribution analysis (anomaly configuration) setup of the visual.","DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","Orientation":"The orientation of the bars in a bar chart visual. There are two valid values in this structure:\\n\\n- `HORIZONTAL` : Used for charts that have horizontal bars. Visuals that use this value are horizontal bar charts, horizontal stacked bar charts, and horizontal stacked 100% bar charts.\\n- `VERTICAL` : Used for charts that have vertical bars. Visuals that use this value are vertical bar charts, vertical stacked bar charts, and vertical stacked 100% bar charts.","ReferenceLines":"The reference line setup of the visual.","SmallMultiplesOptions":"The small multiples setup for the visual.","SortConfiguration":"The sort configuration of a `BarChartVisual` .","Tooltip":"The tooltip display setup of the visual.","ValueAxis":"The label display options (grid line, range, scale, axis step) for a bar chart value.","ValueLabelOptions":"The label options (label text, label visibility and sort icon visibility) for a bar chart value.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Template.BarChartFieldWells":{"attributes":{},"description":"The field wells of a `BarChartVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"BarChartAggregatedFieldWells":"The aggregated field wells of a bar chart."}},"AWS::QuickSight::Template.BarChartSortConfiguration":{"attributes":{},"description":"sort-configuration-description","properties":{"CategoryItemsLimit":"The limit on the number of categories displayed in a bar chart.","CategorySort":"The sort configuration of category fields.","ColorItemsLimit":"The limit on the number of values displayed in a bar chart.","ColorSort":"The sort configuration of color fields in a bar chart.","SmallMultiplesLimitConfiguration":"The limit on the number of small multiples panels that are displayed.","SmallMultiplesSort":"The sort configuration of the small multiples field."}},"AWS::QuickSight::Template.BarChartVisual":{"attributes":{},"description":"A bar chart.\\n\\nThe `BarChartVisual` structure describes a visual that is a member of the bar chart family. The following charts can be described using this structure:\\n\\n- Horizontal bar chart\\n- Vertical bar chart\\n- Horizontal stacked bar chart\\n- Vertical stacked bar chart\\n- Horizontal stacked 100% bar chart\\n- Vertical stacked 100% bar chart\\n\\nFor more information, see [Using bar charts](https://docs.aws.amazon.com/quicksight/latest/user/bar-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.BinCountOptions":{"attributes":{},"description":"The options that determine the bin count of a histogram.","properties":{"Value":"The options that determine the bin count value."}},"AWS::QuickSight::Template.BinWidthOptions":{"attributes":{},"description":"The options that determine the bin width of a histogram.","properties":{"BinCountLimit":"The options that determine the bin count limit.","Value":"The options that determine the bin width value."}},"AWS::QuickSight::Template.BodySectionConfiguration":{"attributes":{},"description":"The configuration of a body section.","properties":{"Content":"The configuration of content in a body section.","PageBreakConfiguration":"The configuration of a page break for a section.","SectionId":"The unique identifier of a body section.","Style":"The style options of a body section."}},"AWS::QuickSight::Template.BodySectionContent":{"attributes":{},"description":"The configuration of content in a body section.","properties":{"Layout":"The layout configuration of a body section."}},"AWS::QuickSight::Template.BoxPlotAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well for a box plot.","properties":{"GroupBy":"The group by field well of a box plot chart. Values are grouped based on group by fields.","Values":"The value field well of a box plot chart. Values are aggregated based on group by fields."}},"AWS::QuickSight::Template.BoxPlotChartConfiguration":{"attributes":{},"description":"The configuration of a `BoxPlotVisual` .","properties":{"BoxPlotOptions":"The box plot chart options for a box plot visual","CategoryAxis":"The label display options (grid line, range, scale, axis step) of a box plot category.","CategoryLabelOptions":"The label options (label text, label visibility and sort Icon visibility) of a box plot category.","FieldWells":"The field wells of the visual.","Legend":"","PrimaryYAxisDisplayOptions":"The label display options (grid line, range, scale, axis step) of a box plot category.","PrimaryYAxisLabelOptions":"The label options (label text, label visibility and sort icon visibility) of a box plot value.","ReferenceLines":"The reference line setup of the visual.","SortConfiguration":"The sort configuration of a `BoxPlotVisual` .","Tooltip":"The tooltip display setup of the visual.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Template.BoxPlotFieldWells":{"attributes":{},"description":"The field wells of a `BoxPlotVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"BoxPlotAggregatedFieldWells":"The aggregated field wells of a box plot."}},"AWS::QuickSight::Template.BoxPlotOptions":{"attributes":{},"description":"The options of a box plot visual.","properties":{"AllDataPointsVisibility":"Determines the visibility of all data points of the box plot.","OutlierVisibility":"Determines the visibility of the outlier in a box plot.","StyleOptions":"The style options of the box plot."}},"AWS::QuickSight::Template.BoxPlotSortConfiguration":{"attributes":{},"description":"The sort configuration of a `BoxPlotVisual` .","properties":{"CategorySort":"The sort configuration of a group by fields.","PaginationConfiguration":"The pagination configuration of a table visual or box plot."}},"AWS::QuickSight::Template.BoxPlotStyleOptions":{"attributes":{},"description":"The style options of the box plot.","properties":{"FillStyle":"The fill styles (solid, transparent) of the box plot."}},"AWS::QuickSight::Template.BoxPlotVisual":{"attributes":{},"description":"A box plot.\\n\\nFor more information, see [Using box plots](https://docs.aws.amazon.com/quicksight/latest/user/box-plots.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Template.CalculatedField":{"attributes":{},"description":"The calculated field of an analysis.","properties":{"DataSetIdentifier":"The data set that is used in this calculated field.","Expression":"The expression of the calculated field.","Name":"The name of the calculated field."}},"AWS::QuickSight::Template.CalculatedMeasureField":{"attributes":{},"description":"The table calculation measure field for pivot tables.","properties":{"Expression":"The expression in the table calculation.","FieldId":"The custom field ID."}},"AWS::QuickSight::Template.CascadingControlConfiguration":{"attributes":{},"description":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","properties":{"SourceControls":"A list of source controls that determine the values that are used in the current control."}},"AWS::QuickSight::Template.CascadingControlSource":{"attributes":{},"description":"The source controls that are used in a `CascadingControlConfiguration` .","properties":{"ColumnToMatch":"The column identifier that determines which column to look up for the source sheet control.","SourceSheetControlId":"The source sheet control ID of a `CascadingControlSource` ."}},"AWS::QuickSight::Template.CategoricalDimensionField":{"attributes":{},"description":"The dimension type field with categorical type columns..","properties":{"Column":"The column that is used in the `CategoricalDimensionField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field.","HierarchyId":"The custom hierarchy ID."}},"AWS::QuickSight::Template.CategoricalMeasureField":{"attributes":{},"description":"The measure type field with categorical type columns.","properties":{"AggregationFunction":"The aggregation function of the measure field.","Column":"The column that is used in the `CategoricalMeasureField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Template.CategoryDrillDownFilter":{"attributes":{},"description":"The numeric equality type drill down filter.","properties":{"CategoryValues":"A list of the string inputs that are the values of the category drill down filter.","Column":"The column that the filter is applied to."}},"AWS::QuickSight::Template.CategoryFilter":{"attributes":{},"description":"A `CategoryFilter` filters text values.\\n\\nFor more information, see [Adding text filters](https://docs.aws.amazon.com/quicksight/latest/user/add-a-text-filter-data-prep.html) in the *Amazon QuickSight User Guide* .","properties":{"Column":"The column that the filter is applied to.","Configuration":"The configuration for a `CategoryFilter` .","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template."}},"AWS::QuickSight::Template.CategoryFilterConfiguration":{"attributes":{},"description":"The configuration for a `CategoryFilter` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CustomFilterConfiguration":"A custom filter that filters based on a single value. This filter can be partially matched.","CustomFilterListConfiguration":"A list of custom filter values. In the Amazon QuickSight console, this filter type is called a custom filter list.","FilterListConfiguration":"A list of filter configurations. In the Amazon QuickSight console, this filter type is called a filter list."}},"AWS::QuickSight::Template.ChartAxisLabelOptions":{"attributes":{},"description":"The label options for an axis on a chart.","properties":{"AxisLabelOptions":"The label options for a chart axis.","SortIconVisibility":"The visibility configuration of the sort icon on a chart\'s axis label.","Visibility":"The visibility of an axis label on a chart. Choose one of the following options:\\n\\n- `VISIBLE` : Shows the axis.\\n- `HIDDEN` : Hides the axis."}},"AWS::QuickSight::Template.ClusterMarker":{"attributes":{},"description":"The cluster marker that is a part of the cluster marker configuration.","properties":{"SimpleClusterMarker":"The simple cluster marker of the cluster marker."}},"AWS::QuickSight::Template.ClusterMarkerConfiguration":{"attributes":{},"description":"The cluster marker configuration of the geospatial map selected point style.","properties":{"ClusterMarker":"The cluster marker that is a part of the cluster marker configuration."}},"AWS::QuickSight::Template.ColorScale":{"attributes":{},"description":"Determines the color scale that is applied to the visual.","properties":{"ColorFillType":"Determines the color fill type.","Colors":"Determines the list of colors that are applied to the visual.","NullValueColor":"Determines the color that is applied to null values."}},"AWS::QuickSight::Template.ColumnConfiguration":{"attributes":{},"description":"The general configuration of a column.","properties":{"Column":"The column.","FormatConfiguration":"The format configuration of a column.","Role":"The role of the column."}},"AWS::QuickSight::Template.ColumnGroupColumnSchema":{"attributes":{},"description":"A structure describing the name, data type, and geographic role of the columns.","properties":{"Name":"The name of the column group\'s column schema."}},"AWS::QuickSight::Template.ColumnGroupSchema":{"attributes":{},"description":"The column group schema.","properties":{"ColumnGroupColumnSchemaList":"A structure containing the list of schemas for column group columns.","Name":"The name of the column group schema."}},"AWS::QuickSight::Template.ColumnHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of the fields for a visual element.","properties":{"DateTimeHierarchy":"The option that determines the hierarchy of any `DateTime` fields.","ExplicitHierarchy":"The option that determines the hierarchy of the fields that are built within a visual\'s field wells. These fields can\'t be duplicated to other visuals.","PredefinedHierarchy":"The option that determines the hierarchy of the fields that are defined during data preparation. These fields are available to use in any analysis that uses the data source."}},"AWS::QuickSight::Template.ColumnIdentifier":{"attributes":{},"description":"A column of a data set.","properties":{"ColumnName":"The name of the column.","DataSetIdentifier":"The data set that the column belongs to."}},"AWS::QuickSight::Template.ColumnSchema":{"attributes":{},"description":"The column schema.","properties":{"DataType":"The data type of the column schema.","GeographicRole":"The geographic role of the column schema.","Name":"The name of the column schema."}},"AWS::QuickSight::Template.ColumnSort":{"attributes":{},"description":"The sort configuration for a column that is not used in a field well.","properties":{"AggregationFunction":"The aggregation function that is defined in the column sort.","Direction":"The sort direction.","SortBy":""}},"AWS::QuickSight::Template.ColumnTooltipItem":{"attributes":{},"description":"The tooltip item for the columns that are not part of a field well.","properties":{"Aggregation":"The aggregation function of the column tooltip item.","Column":"The target column of the tooltip item.","Label":"The label of the tooltip item.","Visibility":"The visibility of the tooltip item."}},"AWS::QuickSight::Template.ComboChartAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a combo chart.","properties":{"BarValues":"The aggregated `BarValues` field well of a combo chart.","Category":"The aggregated category field wells of a combo chart.","Colors":"The aggregated colors field well of a combo chart.","LineValues":"The aggregated `LineValues` field well of a combo chart."}},"AWS::QuickSight::Template.ComboChartConfiguration":{"attributes":{},"description":"The configuration of a `ComboChartVisual` .","properties":{"BarDataLabels":"The options that determine if visual data labels are displayed.\\n\\nThe data label options for a bar in a combo chart.","BarsArrangement":"Determines the bar arrangement in a combo chart. The following are valid values in this structure:\\n\\n- `CLUSTERED` : For clustered bar combo charts.\\n- `STACKED` : For stacked bar combo charts.\\n- `STACKED_PERCENT` : Do not use. If you use this value, the operation returns a validation error.","CategoryAxis":"The category axis of a combo chart.","CategoryLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart category (group/color) field well.","ColorLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart\'s color field well.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","LineDataLabels":"The options that determine if visual data labels are displayed.\\n\\nThe data label options for a line in a combo chart.","PrimaryYAxisDisplayOptions":"The label display options (grid line, range, scale, and axis step) of a combo chart\'s primary y-axis (bar) field well.","PrimaryYAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart\'s primary y-axis (bar) field well.","ReferenceLines":"The reference line setup of the visual.","SecondaryYAxisDisplayOptions":"The label display options (grid line, range, scale, axis step) of a combo chart\'s secondary y-axis (line) field well.","SecondaryYAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of a combo chart\'s secondary y-axis(line) field well.","SortConfiguration":"The sort configuration of a `ComboChartVisual` .","Tooltip":"The legend display setup of the visual.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Template.ComboChartFieldWells":{"attributes":{},"description":"The field wells of the visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"ComboChartAggregatedFieldWells":"The aggregated field wells of a combo chart. Combo charts only have aggregated field wells. Columns in a combo chart are aggregated by category."}},"AWS::QuickSight::Template.ComboChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a `ComboChartVisual` .","properties":{"CategoryItemsLimit":"The item limit configuration for the category field well of a combo chart.","CategorySort":"The sort configuration of the category field well in a combo chart.","ColorItemsLimit":"The item limit configuration of the color field well in a combo chart.","ColorSort":"The sort configuration of the color field well in a combo chart."}},"AWS::QuickSight::Template.ComboChartVisual":{"attributes":{},"description":"A combo chart.\\n\\nThe `ComboChartVisual` includes stacked bar combo charts and clustered bar combo charts\\n\\nFor more information, see [Using combo charts](https://docs.aws.amazon.com/quicksight/latest/user/combo-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.ComparisonConfiguration":{"attributes":{},"description":"The comparison display configuration of a KPI or gauge chart.","properties":{"ComparisonFormat":"The format of the comparison.","ComparisonMethod":"The method of the comparison. Choose from the following options:\\n\\n- `DIFFERENCE`\\n- `PERCENT_DIFFERENCE`\\n- `PERCENT`"}},"AWS::QuickSight::Template.ComparisonFormatConfiguration":{"attributes":{},"description":"The format of the comparison.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"NumberDisplayFormatConfiguration":"The number display format.","PercentageDisplayFormatConfiguration":"The percentage display format."}},"AWS::QuickSight::Template.Computation":{"attributes":{},"description":"The computation union that is used in an insight visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Forecast":"The forecast computation configuration.","GrowthRate":"The growth rate computation configuration.","MaximumMinimum":"The maximum and minimum computation configuration.","MetricComparison":"The metric comparison computation configuration.","PeriodOverPeriod":"The period over period computation configuration.","PeriodToDate":"The period to `DataSetIdentifier` computation configuration.","TopBottomMovers":"The top movers and bottom movers computation configuration.","TopBottomRanked":"The top ranked and bottom ranked computation configuration.","TotalAggregation":"The total aggregation computation configuration.","UniqueValues":"The unique values computation configuration."}},"AWS::QuickSight::Template.ConditionalFormattingColor":{"attributes":{},"description":"The formatting configuration for the color.","properties":{"Gradient":"Formatting configuration for gradient color.","Solid":"Formatting configuration for solid color."}},"AWS::QuickSight::Template.ConditionalFormattingCustomIconCondition":{"attributes":{},"description":"Determines the custom condition for an icon set.","properties":{"Color":"Determines the color of the icon.","DisplayConfiguration":"Determines the icon display configuration.","Expression":"The expression that determines the condition of the icon set.","IconOptions":"Custom icon options for an icon set."}},"AWS::QuickSight::Template.ConditionalFormattingCustomIconOptions":{"attributes":{},"description":"Custom icon options for an icon set.","properties":{"Icon":"Determines the type of icon.","UnicodeIcon":"Determines the Unicode icon type."}},"AWS::QuickSight::Template.ConditionalFormattingGradientColor":{"attributes":{},"description":"Formatting configuration for gradient color.","properties":{"Color":"Determines the color.","Expression":"The expression that determines the formatting configuration for gradient color."}},"AWS::QuickSight::Template.ConditionalFormattingIcon":{"attributes":{},"description":"The formatting configuration for the icon.","properties":{"CustomCondition":"Determines the custom condition for an icon set.","IconSet":"Formatting configuration for icon set."}},"AWS::QuickSight::Template.ConditionalFormattingIconDisplayConfiguration":{"attributes":{},"description":"Determines the icon display configuration.","properties":{"IconDisplayOption":"Determines the icon display configuration."}},"AWS::QuickSight::Template.ConditionalFormattingIconSet":{"attributes":{},"description":"Formatting configuration for icon set.","properties":{"Expression":"The expression that determines the formatting configuration for the icon set.","IconSetType":"Determines the icon set type."}},"AWS::QuickSight::Template.ConditionalFormattingSolidColor":{"attributes":{},"description":"Formatting configuration for solid color.","properties":{"Color":"Determines the color.","Expression":"The expression that determines the formatting configuration for solid color."}},"AWS::QuickSight::Template.ContributionAnalysisDefault":{"attributes":{},"description":"The contribution analysis visual display for a line, pie, or bar chart.","properties":{"ContributorDimensions":"The dimensions columns that are used in the contribution analysis, usually a list of `ColumnIdentifiers` .","MeasureFieldId":"The measure field that is used in the contribution analysis."}},"AWS::QuickSight::Template.CurrencyDisplayFormatConfiguration":{"attributes":{},"description":"The options that determine the currency display format configuration.","properties":{"DecimalPlacesConfiguration":"The option that determines the decimal places configuration.","NegativeValueConfiguration":"The options that determine the negative value configuration.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumberScale":"Determines the number scale value for the currency format.","Prefix":"Determines the prefix value of the currency format.","SeparatorConfiguration":"The options that determine the numeric separator configuration.","Suffix":"Determines the suffix value of the currency format.","Symbol":"Determines the symbol for the currency format."}},"AWS::QuickSight::Template.CustomActionFilterOperation":{"attributes":{},"description":"The filter operation that filters data included in a visual or in an entire sheet.","properties":{"SelectedFieldsConfiguration":"The configuration that chooses the fields to be filtered.","TargetVisualsConfiguration":"The configuration that chooses the target visuals to be filtered."}},"AWS::QuickSight::Template.CustomActionNavigationOperation":{"attributes":{},"description":"The navigation operation that navigates between different sheets in the same analysis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"LocalNavigationConfiguration":"The configuration that chooses the navigation target."}},"AWS::QuickSight::Template.CustomActionSetParametersOperation":{"attributes":{},"description":"The set parameter operation that sets parameters in custom action.","properties":{"ParameterValueConfigurations":"The parameter that determines the value configuration."}},"AWS::QuickSight::Template.CustomActionURLOperation":{"attributes":{},"description":"The URL operation that opens a link to another webpage.","properties":{"URLTarget":"The target of the `CustomActionURLOperation` .\\n\\nValid values are defined as follows:\\n\\n- `NEW_TAB` : Opens the target URL in a new browser tab.\\n- `NEW_WINDOW` : Opens the target URL in a new browser window.\\n- `SAME_TAB` : Opens the target URL in the same browser tab.","URLTemplate":"THe URL link of the `CustomActionURLOperation` ."}},"AWS::QuickSight::Template.CustomContentConfiguration":{"attributes":{},"description":"The configuration of a `CustomContentVisual` .","properties":{"ContentType":"The content type of the custom content visual. You can use this to have the visual render as an image.","ContentUrl":"The input URL that links to the custom content that you want in the custom visual.","ImageScaling":"The sizing options for the size of the custom content visual. This structure is required when the `ContentType` of the visual is `\'IMAGE\'` ."}},"AWS::QuickSight::Template.CustomContentVisual":{"attributes":{},"description":"A visual that contains custom content.\\n\\nFor more information, see [Using custom visual content](https://docs.aws.amazon.com/quicksight/latest/user/custom-visual-content.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a `CustomContentVisual` .","DataSetIdentifier":"The dataset that is used to create the custom content visual. You can\'t create a visual without a dataset.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.CustomFilterConfiguration":{"attributes":{},"description":"A custom filter that filters based on a single value. This filter can be partially matched.","properties":{"CategoryValue":"The category value for the filter.\\n\\nThis field is mutually exclusive to `ParameterName` .","MatchOperator":"The match operator that is used to determine if a filter should be applied.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","ParameterName":"The parameter whose value should be used for the filter value.\\n\\nThis field is mutually exclusive to `CategoryValue` .","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Template.CustomFilterListConfiguration":{"attributes":{},"description":"A list of custom filter values.","properties":{"CategoryValues":"The list of category values for the filter.","MatchOperator":"The match operator that is used to determine if a filter should be applied.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Template.CustomNarrativeOptions":{"attributes":{},"description":"The custom narrative options.","properties":{"Narrative":"The string input of custom narrative."}},"AWS::QuickSight::Template.CustomParameterValues":{"attributes":{},"description":"The customized parameter values.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimeValues":"A list of datetime-type parameter values.","DecimalValues":"A list of decimal-type parameter values.","IntegerValues":"A list of integer-type parameter values.","StringValues":"A list of string-type parameter values."}},"AWS::QuickSight::Template.CustomValuesConfiguration":{"attributes":{},"description":"The configuration of custom values for the destination parameter in `DestinationParameterValueConfiguration` .","properties":{"CustomValues":"","IncludeNullValue":"Includes the null value in custom action parameter values."}},"AWS::QuickSight::Template.DataBarsOptions":{"attributes":{},"description":"The options for data bars.","properties":{"FieldId":"The field ID for the data bars options.","NegativeColor":"The color of the negative data bar.","PositiveColor":"The color of the positive data bar."}},"AWS::QuickSight::Template.DataColor":{"attributes":{},"description":"Determines the color that is applied to a particular data value.","properties":{"Color":"The color that is applied to the data value.","DataValue":"The data value that the color is applied to."}},"AWS::QuickSight::Template.DataFieldSeriesItem":{"attributes":{},"description":"The data field series item configuration of a line chart.","properties":{"AxisBinding":"The axis that you are binding the field to.","FieldId":"The field ID of the field that you are setting the axis binding to.","FieldValue":"The field value of the field that you are setting the axis binding to.","Settings":"The options that determine the presentation of line series associated to the field."}},"AWS::QuickSight::Template.DataLabelOptions":{"attributes":{},"description":"The options that determine the presentation of the data labels.","properties":{"CategoryLabelVisibility":"Determines the visibility of the category field labels.","DataLabelTypes":"The option that determines the data label type.","LabelColor":"Determines the color of the data labels.","LabelContent":"Determines the content of the data labels.","LabelFontConfiguration":"Determines the font configuration of the data labels.","MeasureLabelVisibility":"Determines the visibility of the measure field labels.","Overlap":"Determines whether overlap is enabled or disabled for the data labels.","Position":"Determines the position of the data labels.","TotalsVisibility":"Determines the visibility of the total.","Visibility":"Determines the visibility of the data labels."}},"AWS::QuickSight::Template.DataLabelType":{"attributes":{},"description":"The option that determines the data label type.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DataPathLabelType":"The option that specifies individual data values for labels.","FieldLabelType":"Determines the label configuration for the entire field.","MaximumLabelType":"Determines the label configuration for the maximum value in a visual.","MinimumLabelType":"Determines the label configuration for the minimum value in a visual.","RangeEndsLabelType":"Determines the label configuration for range end value in a visual."}},"AWS::QuickSight::Template.DataPathColor":{"attributes":{},"description":"The color map that determines the color options for a particular element.","properties":{"Color":"The color that needs to be applied to the element.","Element":"The element that the color needs to be applied to.","TimeGranularity":"The time granularity of the field that the color needs to be applied to."}},"AWS::QuickSight::Template.DataPathLabelType":{"attributes":{},"description":"The option that specifies individual data values for labels.","properties":{"FieldId":"The field ID of the field that the data label needs to be applied to.","FieldValue":"The actual value of the field that is labeled.","Visibility":"The visibility of the data label."}},"AWS::QuickSight::Template.DataPathSort":{"attributes":{},"description":"Allows data paths to be sorted by a specific data value.","properties":{"Direction":"Determines the sort direction.","SortPaths":"The list of data paths that need to be sorted."}},"AWS::QuickSight::Template.DataPathValue":{"attributes":{},"description":"The data path that needs to be sorted.","properties":{"FieldId":"The field ID of the field that needs to be sorted.","FieldValue":"The actual value of the field that needs to be sorted."}},"AWS::QuickSight::Template.DataSetConfiguration":{"attributes":{},"description":"Dataset configuration.","properties":{"ColumnGroupSchemaList":"A structure containing the list of column group schemas.","DataSetSchema":"Dataset schema.","Placeholder":"Placeholder."}},"AWS::QuickSight::Template.DataSetReference":{"attributes":{},"description":"Dataset reference.","properties":{"DataSetArn":"Dataset Amazon Resource Name (ARN).","DataSetPlaceholder":"Dataset placeholder."}},"AWS::QuickSight::Template.DataSetSchema":{"attributes":{},"description":"Dataset schema.","properties":{"ColumnSchemaList":"A structure containing the list of column schemas."}},"AWS::QuickSight::Template.DateAxisOptions":{"attributes":{},"description":"The options that determine how a date axis is displayed.","properties":{"MissingDateVisibility":"Determines whether or not missing dates are displayed."}},"AWS::QuickSight::Template.DateDimensionField":{"attributes":{},"description":"The dimension type field with date type columns.","properties":{"Column":"The column that is used in the `DateDimensionField` .","DateGranularity":"The date granularity of the `DateDimensionField` . Choose one of the following options:\\n\\n- `YEAR`\\n- `QUARTER`\\n- `MONTH`\\n- `WEEK`\\n- `DAY`\\n- `HOUR`\\n- `MINUTE`\\n- `SECOND`\\n- `MILLISECOND`","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field.","HierarchyId":"The custom hierarchy ID."}},"AWS::QuickSight::Template.DateMeasureField":{"attributes":{},"description":"The measure type field with date type columns.","properties":{"AggregationFunction":"The aggregation function of the measure field.","Column":"The column that is used in the `DateMeasureField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Template.DateTimeDefaultValues":{"attributes":{},"description":"The default values of the `DateTimeParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `DataTimeDefaultValues` . Different defaults are displayed according to users, groups, and values mapping.","RollingDate":"The rolling date of the `DataTimeDefaultValues` . The date is determined from the dataset based on input expression.","StaticValues":"The static values of the `DataTimeDefaultValues` ."}},"AWS::QuickSight::Template.DateTimeFormatConfiguration":{"attributes":{},"description":"Formatting configuration for `DateTime` fields.","properties":{"DateTimeFormat":"Determines the `DateTime` format.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumericFormatConfiguration":"The formatting configuration for numeric `DateTime` fields."}},"AWS::QuickSight::Template.DateTimeHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of any `DateTime` fields.","properties":{"DrillDownFilters":"The option that determines the drill down filters for the `DateTime` hierarchy.","HierarchyId":"The hierarchy ID of the `DateTime` hierarchy."}},"AWS::QuickSight::Template.DateTimeParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `DateTime` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values.","ValueWhenUnset":"The configuration that defines the default value of a `DateTime` parameter when a value has not been set."}},"AWS::QuickSight::Template.DateTimePickerControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"DateTimeFormat":"Customize how dates are formatted in controls.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Template.DateTimeValueWhenUnsetConfiguration":{"attributes":{},"description":"The configuration that defines the default value of a `DateTime` parameter when a value has not been set.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Template.DecimalDefaultValues":{"attributes":{},"description":"The default values of the `DecimalParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `DecimalDefaultValues` . Different defaults are displayed according to users, groups, and values mapping.","StaticValues":"The static values of the `DecimalDefaultValues` ."}},"AWS::QuickSight::Template.DecimalParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `Decimal` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","ParameterValueType":"The value type determines whether the parameter is a single-value or multi-value parameter.","ValueWhenUnset":"The configuration that defines the default value of a `Decimal` parameter when a value has not been set."}},"AWS::QuickSight::Template.DecimalPlacesConfiguration":{"attributes":{},"description":"The option that determines the decimal places configuration.","properties":{"DecimalPlaces":"The values of the decimal places."}},"AWS::QuickSight::Template.DecimalValueWhenUnsetConfiguration":{"attributes":{},"description":"The configuration that defines the default value of a `Decimal` parameter when a value has not been set.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Template.DefaultFreeFormLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings of a free-form layout configuration.","properties":{"CanvasSizeOptions":"Determines the screen canvas size options for a free-form layout."}},"AWS::QuickSight::Template.DefaultGridLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for a grid layout configuration.","properties":{"CanvasSizeOptions":"Determines the screen canvas size options for a grid layout."}},"AWS::QuickSight::Template.DefaultInteractiveLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for interactive layout configuration.","properties":{"FreeForm":"The options that determine the default settings of a free-form layout configuration.","Grid":"The options that determine the default settings for a grid layout configuration."}},"AWS::QuickSight::Template.DefaultNewSheetConfiguration":{"attributes":{},"description":"The configuration for default new sheet settings.","properties":{"InteractiveLayoutConfiguration":"The options that determine the default settings for interactive layout configuration.","PaginatedLayoutConfiguration":"The options that determine the default settings for a paginated layout configuration.","SheetContentType":"The option that determines the sheet content type."}},"AWS::QuickSight::Template.DefaultPaginatedLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for a paginated layout configuration.","properties":{"SectionBased":"The options that determine the default settings for a section-based layout configuration."}},"AWS::QuickSight::Template.DefaultSectionBasedLayoutConfiguration":{"attributes":{},"description":"The options that determine the default settings for a section-based layout configuration.","properties":{"CanvasSizeOptions":"Determines the screen canvas size options for a section-based layout."}},"AWS::QuickSight::Template.DestinationParameterValueConfiguration":{"attributes":{},"description":"The configuration of destination parameter values.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CustomValuesConfiguration":"The configuration of custom values for destination parameter in `DestinationParameterValueConfiguration` .","SelectAllValueOptions":"The configuration that selects all options.","SourceColumn":"","SourceField":"The source field ID of the destination parameter.","SourceParameterName":"The source parameter name of the destination parameter."}},"AWS::QuickSight::Template.DimensionField":{"attributes":{},"description":"The dimension type field.","properties":{"CategoricalDimensionField":"The dimension type field with categorical type columns.","DateDimensionField":"The dimension type field with date type columns.","NumericalDimensionField":"The dimension type field with numerical type columns."}},"AWS::QuickSight::Template.DonutCenterOptions":{"attributes":{},"description":"The label options of the label that is displayed in the center of a donut chart. This option isn\'t available for pie charts.","properties":{"LabelVisibility":"Determines the visibility of the label in a donut chart. In the Amazon QuickSight console, this option is called `\'Show total\'` ."}},"AWS::QuickSight::Template.DonutOptions":{"attributes":{},"description":"The options for configuring a donut chart or pie chart.","properties":{"ArcOptions":"The option for define the arc of the chart shape. Valid values are as follows:\\n\\n- `WHOLE` - A pie chart\\n- `SMALL` - A small-sized donut chart\\n- `MEDIUM` - A medium-sized donut chart\\n- `LARGE` - A large-sized donut chart","DonutCenterOptions":"The label options of the label that is displayed in the center of a donut chart. This option isn\'t available for pie charts."}},"AWS::QuickSight::Template.DrillDownFilter":{"attributes":{},"description":"The drill down filter for the column hierarchies.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CategoryFilter":"The category type drill down filter. This filter is used for string type columns.","NumericEqualityFilter":"The numeric equality type drill down filter. This filter is used for number type columns.","TimeRangeFilter":"The time range drill down filter. This filter is used for date time columns."}},"AWS::QuickSight::Template.DropDownControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"SelectAllOptions":"The configuration of the `Select all` options in a dropdown control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Template.DynamicDefaultValue":{"attributes":{},"description":"Defines different defaults to the users or groups based on mapping.","properties":{"DefaultValueColumn":"The column that contains the default value of each user or group.","GroupNameColumn":"The column that contains the group name.","UserNameColumn":"The column that contains the username."}},"AWS::QuickSight::Template.EmptyVisual":{"attributes":{},"description":"An empty visual.\\n\\nEmpty visuals are used in layouts but have not been configured to show any data. A new visual created in the Amazon QuickSight console is considered an `EmptyVisual` until a visual type is selected.","properties":{"Actions":"The list of custom actions that are configured for a visual.","DataSetIdentifier":"The data set that is used in the empty visual. Every visual requires a dataset to render.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.Entity":{"attributes":{},"description":"An object, structure, or sub-structure of an analysis, template, or dashboard.","properties":{"Path":"The hierarchical path of the entity within the analysis, template, or dashboard definition tree."}},"AWS::QuickSight::Template.ExcludePeriodConfiguration":{"attributes":{},"description":"The exclude period of `TimeRangeFilter` or `RelativeDatesFilter` .","properties":{"Amount":"The amount or number of the exclude period.","Granularity":"The granularity or unit (day, month, year) of the exclude period.","Status":"The status of the exclude period. Choose from the following options:\\n\\n- `ENABLED`\\n- `DISABLED`"}},"AWS::QuickSight::Template.ExplicitHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of the fields that are built within a visual\'s field wells. These fields can\'t be duplicated to other visuals.","properties":{"Columns":"The list of columns that define the explicit hierarchy.","DrillDownFilters":"The option that determines the drill down filters for the explicit hierarchy.","HierarchyId":"The hierarchy ID of the explicit hierarchy."}},"AWS::QuickSight::Template.FieldBasedTooltip":{"attributes":{},"description":"The setup for the detailed tooltip.","properties":{"AggregationVisibility":"The visibility of `Show aggregations` .","TooltipFields":"The fields configuration in the tooltip.","TooltipTitleType":"The type for the >tooltip title. Choose one of the following options:\\n\\n- `NONE` : Doesn\'t use the primary value as the title.\\n- `PRIMARY_VALUE` : Uses primary value as the title."}},"AWS::QuickSight::Template.FieldLabelType":{"attributes":{},"description":"The field label type.","properties":{"FieldId":"Indicates the field that is targeted by the field label.","Visibility":"The visibility of the field label."}},"AWS::QuickSight::Template.FieldSeriesItem":{"attributes":{},"description":"The field series item configuration of a line chart.","properties":{"AxisBinding":"The axis that you are binding the field to.","FieldId":"The field ID of the field for which you are setting the axis binding.","Settings":"The options that determine the presentation of line series associated to the field."}},"AWS::QuickSight::Template.FieldSort":{"attributes":{},"description":"The sort configuration for a field in a field well.","properties":{"Direction":"The sort direction. Choose one of the following options:\\n\\n- `ASC` : Ascending\\n- `DESC` : Descending","FieldId":"The sort configuration target field."}},"AWS::QuickSight::Template.FieldSortOptions":{"attributes":{},"description":"The field sort options in a chart configuration.","properties":{"ColumnSort":"The sort configuration for a column that is not used in a field well.","FieldSort":"The sort configuration for a field in a field well."}},"AWS::QuickSight::Template.FieldTooltipItem":{"attributes":{},"description":"The tooltip item for the fields.","properties":{"FieldId":"The unique ID of the field that is targeted by the tooltip.","Label":"The label of the tooltip item.","Visibility":"The visibility of the tooltip item."}},"AWS::QuickSight::Template.FilledMapAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well of the filled map.","properties":{"Geospatial":"The aggregated location field well of the filled map. Values are grouped by location fields.","Values":"The aggregated color field well of a filled map. Values are aggregated based on location fields."}},"AWS::QuickSight::Template.FilledMapConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a `FilledMapVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options of a `FilledMapVisual` ."}},"AWS::QuickSight::Template.FilledMapConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options of a `FilledMapVisual` .","properties":{"Shape":"The conditional formatting that determines the shape of the filled map."}},"AWS::QuickSight::Template.FilledMapConfiguration":{"attributes":{},"description":"The configuration for a `FilledMapVisual` .","properties":{"FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","MapStyleOptions":"The map style options of the filled map visual.","SortConfiguration":"The sort configuration of a `FilledMapVisual` .","Tooltip":"The tooltip display setup of the visual.","WindowOptions":"The window options of the filled map visual."}},"AWS::QuickSight::Template.FilledMapFieldWells":{"attributes":{},"description":"The field wells of a `FilledMapVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FilledMapAggregatedFieldWells":"The aggregated field well of the filled map."}},"AWS::QuickSight::Template.FilledMapShapeConditionalFormatting":{"attributes":{},"description":"The conditional formatting that determines the shape of the filled map.","properties":{"FieldId":"The field ID of the filled map shape.","Format":"The conditional formatting that determines the background color of a filled map\'s shape."}},"AWS::QuickSight::Template.FilledMapSortConfiguration":{"attributes":{},"description":"The sort configuration of a `FilledMapVisual` .","properties":{"CategorySort":"The sort configuration of the location fields."}},"AWS::QuickSight::Template.FilledMapVisual":{"attributes":{},"description":"A filled map.\\n\\nFor more information, see [Creating filled maps](https://docs.aws.amazon.com/quicksight/latest/user/filled-maps.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","ConditionalFormatting":"The conditional formatting of a `FilledMapVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Template.Filter":{"attributes":{},"description":"With a `Filter` , you can remove portions of data from a particular visual or view.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CategoryFilter":"A `CategoryFilter` filters text values.\\n\\nFor more information, see [Adding text filters](https://docs.aws.amazon.com/quicksight/latest/user/add-a-text-filter-data-prep.html) in the *Amazon QuickSight User Guide* .","NumericEqualityFilter":"A `NumericEqualityFilter` filters numeric values that equal or do not equal a given numeric value.","NumericRangeFilter":"A `NumericRangeFilter` filters numeric values that are either inside or outside a given numeric range.","RelativeDatesFilter":"A `RelativeDatesFilter` filters date values that are relative to a given date.","TimeEqualityFilter":"A `TimeEqualityFilter` filters date-time values that equal or do not equal a given date/time value.","TimeRangeFilter":"A `TimeRangeFilter` filters date-time values that are either inside or outside a given date/time range.","TopBottomFilter":"A `TopBottomFilter` filters data to the top or bottom values for a given column."}},"AWS::QuickSight::Template.FilterControl":{"attributes":{},"description":"The control of a filter that is used to interact with a dashboard or an analysis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimePicker":"A control from a date filter that is used to specify date and time.","Dropdown":"A control to display a dropdown list with buttons that are used to select a single value.","List":"A control to display a list of buttons or boxes. This is used to select either a single value or multiple values.","RelativeDateTime":"A control from a date filter that is used to specify the relative date.","Slider":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","TextArea":"A control to display a text box that is used to enter multiple entries.","TextField":"A control to display a text box that is used to enter a single entry."}},"AWS::QuickSight::Template.FilterDateTimePickerControl":{"attributes":{},"description":"A control from a date filter that is used to specify date and time.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterDateTimePickerControl` .","SourceFilterId":"The source filter ID of the `FilterDateTimePickerControl` .","Title":"The title of the `FilterDateTimePickerControl` .","Type":"The date time picker type of a `FilterDateTimePickerControl` . Choose one of the following options:\\n\\n- `SINGLE_VALUED` : The filter condition is a fixed date.\\n- `DATE_RANGE` : The filter condition is a date time range."}},"AWS::QuickSight::Template.FilterDropDownControl":{"attributes":{},"description":"A control to display a dropdown list with buttons that are used to select a single value.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of the `FilterDropDownControl` .","FilterControlId":"The ID of the `FilterDropDownControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceFilterId":"The source filter ID of the `FilterDropDownControl` .","Title":"The title of the `FilterDropDownControl` .","Type":"The type of the `FilterDropDownControl` . Choose one of the following options:\\n\\n- `MULTI_SELECT` : The user can select multiple entries from a dropdown menu.\\n- `SINGLE_SELECT` : The user can select a single entry from a dropdown menu."}},"AWS::QuickSight::Template.FilterGroup":{"attributes":{},"description":"A grouping of individual filters. Filter groups are applied to the same group of visuals.\\n\\nFor more information, see [Adding filter conditions (group filters) with AND and OR operators](https://docs.aws.amazon.com/quicksight/latest/user/add-a-compound-filter.html) in the *Amazon QuickSight User Guide* .","properties":{"CrossDataset":"The filter new feature which can apply filter group to all data sets. Choose one of the following options:\\n\\n- `ALL_DATASETS`\\n- `SINGLE_DATASET`","FilterGroupId":"The value that uniquely identifies a `FilterGroup` within a dashboard, template, or analysis.","Filters":"The list of filters that are present in a `FilterGroup` .","ScopeConfiguration":"The configuration that specifies what scope to apply to a `FilterGroup` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","Status":"The status of the `FilterGroup` ."}},"AWS::QuickSight::Template.FilterListConfiguration":{"attributes":{},"description":"A list of filter configurations.","properties":{"CategoryValues":"The list of category values for the filter.","MatchOperator":"The match operator that is used to determine if a filter should be applied.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Template.FilterListControl":{"attributes":{},"description":"A control to display a list of buttons or boxes. This is used to select either a single value or multiple values.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterListControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceFilterId":"The source filter ID of the `FilterListControl` .","Title":"The title of the `FilterListControl` .","Type":"The type of `FilterListControl` . Choose one of the following options:\\n\\n- `MULTI_SELECT` : The user can select multiple entries from the list.\\n- `SINGLE_SELECT` : The user can select a single entry from the list."}},"AWS::QuickSight::Template.FilterOperationSelectedFieldsConfiguration":{"attributes":{},"description":"The configuration of selected fields in the `CustomActionFilterOperation` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SelectedColumns":"The selected columns of a dataset.","SelectedFieldOptions":"A structure that contains the options that choose which fields are filtered in the `CustomActionFilterOperation` .\\n\\nValid values are defined as follows:\\n\\n- `ALL_FIELDS` : Applies the filter operation to all fields.","SelectedFields":"Chooses the fields that are filtered in `CustomActionFilterOperation` ."}},"AWS::QuickSight::Template.FilterOperationTargetVisualsConfiguration":{"attributes":{},"description":"The configuration of target visuals that you want to be filtered.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SameSheetTargetVisualConfiguration":"The configuration of the same-sheet target visuals that you want to be filtered."}},"AWS::QuickSight::Template.FilterRelativeDateTimeControl":{"attributes":{},"description":"A control from a date filter that is used to specify the relative date.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterTextAreaControl` .","SourceFilterId":"The source filter ID of the `FilterTextAreaControl` .","Title":"The title of the `FilterTextAreaControl` ."}},"AWS::QuickSight::Template.FilterScopeConfiguration":{"attributes":{},"description":"The scope configuration for a `FilterGroup` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SelectedSheets":"The configuration for applying a filter to specific sheets."}},"AWS::QuickSight::Template.FilterSelectableValues":{"attributes":{},"description":"A list of selectable values that are used in a control.","properties":{"Values":"The values that are used in the `FilterSelectableValues` ."}},"AWS::QuickSight::Template.FilterSliderControl":{"attributes":{},"description":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterSliderControl` .","MaximumValue":"The smaller value that is displayed at the left of the slider.","MinimumValue":"The larger value that is displayed at the right of the slider.","SourceFilterId":"The source filter ID of the `FilterSliderControl` .","StepSize":"The number of increments that the slider bar is divided into.","Title":"The title of the `FilterSliderControl` .","Type":"The type of `FilterSliderControl` . Choose one of the following options:\\n\\n- `SINGLE_POINT` : Filter against(equals) a single data point.\\n- `RANGE` : Filter data that is in a specified range."}},"AWS::QuickSight::Template.FilterTextAreaControl":{"attributes":{},"description":"A control to display a text box that is used to enter multiple entries.","properties":{"Delimiter":"The delimiter that is used to separate the lines in text.","DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterTextAreaControl` .","SourceFilterId":"The source filter ID of the `FilterTextAreaControl` .","Title":"The title of the `FilterTextAreaControl` ."}},"AWS::QuickSight::Template.FilterTextFieldControl":{"attributes":{},"description":"A control to display a text box that is used to enter a single entry.","properties":{"DisplayOptions":"The display options of a control.","FilterControlId":"The ID of the `FilterTextFieldControl` .","SourceFilterId":"The source filter ID of the `FilterTextFieldControl` .","Title":"The title of the `FilterTextFieldControl` ."}},"AWS::QuickSight::Template.FontConfiguration":{"attributes":{},"description":"Configures the display properties of the given text.","properties":{"FontColor":"Determines the color of the text.","FontDecoration":"Determines the appearance of decorative lines on the text.","FontSize":"The option that determines the text display size.","FontStyle":"Determines the text display face that is inherited by the given font family.","FontWeight":"The option that determines the text display weight, or boldness."}},"AWS::QuickSight::Template.FontSize":{"attributes":{},"description":"The option that determines the text display size.","properties":{"Relative":"The lexical name for the text size, proportional to its surrounding context."}},"AWS::QuickSight::Template.FontWeight":{"attributes":{},"description":"The option that determines the text display weight, or boldness.","properties":{"Name":"The lexical name for the level of boldness of the text display."}},"AWS::QuickSight::Template.ForecastComputation":{"attributes":{},"description":"The forecast computation configuration.","properties":{"ComputationId":"The ID for a computation.","CustomSeasonalityValue":"The custom seasonality value setup of a forecast computation.","LowerBoundary":"The lower boundary setup of a forecast computation.","Name":"The name of a computation.","PeriodsBackward":"The periods backward setup of a forecast computation.","PeriodsForward":"The periods forward setup of a forecast computation.","PredictionInterval":"The prediction interval setup of a forecast computation.","Seasonality":"The seasonality setup of a forecast computation. Choose one of the following options:\\n\\n- `AUTOMATIC`\\n- `CUSTOM` : Checks the custom seasonality value.","Time":"The time field that is used in a computation.","UpperBoundary":"The upper boundary setup of a forecast computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Template.ForecastConfiguration":{"attributes":{},"description":"The forecast configuration that is used in a line chart\'s display properties.","properties":{"ForecastProperties":"The forecast properties setup of a forecast in the line chart.","Scenario":"The forecast scenario of a forecast in the line chart."}},"AWS::QuickSight::Template.ForecastScenario":{"attributes":{},"description":"The forecast scenario of a forecast in the line chart.","properties":{"WhatIfPointScenario":"The what-if analysis forecast setup with the target date.","WhatIfRangeScenario":"The what-if analysis forecast setup with the date range."}},"AWS::QuickSight::Template.FormatConfiguration":{"attributes":{},"description":"The formatting configuration for all types of field.","properties":{"DateTimeFormatConfiguration":"Formatting configuration for `DateTime` fields.","NumberFormatConfiguration":"Formatting configuration for number fields.","StringFormatConfiguration":"Formatting configuration for string fields."}},"AWS::QuickSight::Template.FreeFormLayoutCanvasSizeOptions":{"attributes":{},"description":"Configuration options for the canvas of a free-form layout.","properties":{"ScreenCanvasSizeOptions":"The options that determine the sizing of the canvas used in a free-form layout."}},"AWS::QuickSight::Template.FreeFormLayoutConfiguration":{"attributes":{},"description":"The configuration of a free-form layout.","properties":{"CanvasSizeOptions":"","Elements":"The elements that are included in a free-form layout."}},"AWS::QuickSight::Template.FreeFormLayoutElement":{"attributes":{},"description":"An element within a free-form layout.","properties":{"BackgroundStyle":"The background style configuration of a free-form layout element.","BorderStyle":"The border style configuration of a free-form layout element.","ElementId":"A unique identifier for an element within a free-form layout.","ElementType":"The type of element.","Height":"The height of an element within a free-form layout.","LoadingAnimation":"The loading animation configuration of a free-form layout element.","RenderingRules":"The rendering rules that determine when an element should be displayed within a free-form layout.","SelectedBorderStyle":"The border style configuration of a free-form layout element. This border style is used when the element is selected.","Visibility":"The visibility of an element within a free-form layout.","Width":"The width of an element within a free-form layout.","XAxisLocation":"The x-axis coordinate of the element.","YAxisLocation":"The y-axis coordinate of the element."}},"AWS::QuickSight::Template.FreeFormLayoutElementBackgroundStyle":{"attributes":{},"description":"The background style configuration of a free-form layout element.","properties":{"Color":"The background color of a free-form layout element.","Visibility":"The background visibility of a free-form layout element."}},"AWS::QuickSight::Template.FreeFormLayoutElementBorderStyle":{"attributes":{},"description":"The background style configuration of a free-form layout element.","properties":{"Color":"The border color of a free-form layout element.","Visibility":"The border visibility of a free-form layout element."}},"AWS::QuickSight::Template.FreeFormLayoutScreenCanvasSizeOptions":{"attributes":{},"description":"The options that determine the sizing of the canvas used in a free-form layout.","properties":{"OptimizedViewPortWidth":"The width that the view port will be optimized for when the layout renders."}},"AWS::QuickSight::Template.FreeFormSectionLayoutConfiguration":{"attributes":{},"description":"The free-form layout configuration of a section.","properties":{"Elements":"The elements that are included in the free-form layout."}},"AWS::QuickSight::Template.FunnelChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a `FunnelChartVisual` .","properties":{"Category":"The category field wells of a funnel chart. Values are grouped by category fields.","Values":"The value field wells of a funnel chart. Values are aggregated based on categories."}},"AWS::QuickSight::Template.FunnelChartConfiguration":{"attributes":{},"description":"The configuration of a `FunnelChartVisual` .","properties":{"CategoryLabelOptions":"The label options of the categories that are displayed in a `FunnelChartVisual` .","DataLabelOptions":"The options that determine the presentation of the data labels.","FieldWells":"The field well configuration of a `FunnelChartVisual` .","SortConfiguration":"The sort configuration of a `FunnelChartVisual` .","Tooltip":"The tooltip configuration of a `FunnelChartVisual` .","ValueLabelOptions":"The label options for the values that are displayed in a `FunnelChartVisual` .","VisualPalette":"The visual palette configuration of a `FunnelChartVisual` ."}},"AWS::QuickSight::Template.FunnelChartDataLabelOptions":{"attributes":{},"description":"The options that determine the presentation of the data labels.","properties":{"CategoryLabelVisibility":"The visibility of the category labels within the data labels.","LabelColor":"The color of the data label text.","LabelFontConfiguration":"The font configuration for the data labels.\\n\\nOnly the `FontSize` attribute of the font configuration is used for data labels.","MeasureDataLabelStyle":"Determines the style of the metric labels.","MeasureLabelVisibility":"The visibility of the measure labels within the data labels.","Position":"Determines the positioning of the data label relative to a section of the funnel.","Visibility":"The visibility option that determines if data labels are displayed."}},"AWS::QuickSight::Template.FunnelChartFieldWells":{"attributes":{},"description":"The field well configuration of a `FunnelChartVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FunnelChartAggregatedFieldWells":"The field well configuration of a `FunnelChartVisual` ."}},"AWS::QuickSight::Template.FunnelChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a `FunnelChartVisual` .","properties":{"CategoryItemsLimit":"The limit on the number of categories displayed.","CategorySort":"The sort configuration of the category fields."}},"AWS::QuickSight::Template.FunnelChartVisual":{"attributes":{},"description":"A funnel chart.\\n\\nFor more information, see [Using funnel charts](https://docs.aws.amazon.com/quicksight/latest/user/funnel-visual-content.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a `FunnelChartVisual` .","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Template.GaugeChartArcConditionalFormatting":{"attributes":{},"description":"The options that determine the presentation of the arc of a `GaugeChartVisual` .","properties":{"ForegroundColor":"The conditional formatting of the arc foreground color."}},"AWS::QuickSight::Template.GaugeChartConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a `GaugeChartVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options of a `GaugeChartVisual` ."}},"AWS::QuickSight::Template.GaugeChartConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options of a `GaugeChartVisual` .","properties":{"Arc":"The options that determine the presentation of the arc of a `GaugeChartVisual` .","PrimaryValue":"The conditional formatting for the primary value of a `GaugeChartVisual` ."}},"AWS::QuickSight::Template.GaugeChartConfiguration":{"attributes":{},"description":"The configuration of a `GaugeChartVisual` .","properties":{"DataLabels":"The data label configuration of a `GaugeChartVisual` .","FieldWells":"The field well configuration of a `GaugeChartVisual` .","GaugeChartOptions":"The options that determine the presentation of the `GaugeChartVisual` .","TooltipOptions":"The tooltip configuration of a `GaugeChartVisual` .","VisualPalette":"The visual palette configuration of a `GaugeChartVisual` ."}},"AWS::QuickSight::Template.GaugeChartFieldWells":{"attributes":{},"description":"The field well configuration of a `GaugeChartVisual` .","properties":{"TargetValues":"The target value field wells of a `GaugeChartVisual` .","Values":"The value field wells of a `GaugeChartVisual` ."}},"AWS::QuickSight::Template.GaugeChartOptions":{"attributes":{},"description":"The options that determine the presentation of the `GaugeChartVisual` .","properties":{"Arc":"The arc configuration of a `GaugeChartVisual` .","ArcAxis":"The arc axis configuration of a `GaugeChartVisual` .","Comparison":"The comparison configuration of a `GaugeChartVisual` .","PrimaryValueDisplayType":"The options that determine the primary value display type.","PrimaryValueFontConfiguration":"The options that determine the primary value font configuration."}},"AWS::QuickSight::Template.GaugeChartPrimaryValueConditionalFormatting":{"attributes":{},"description":"The conditional formatting for the primary value of a `GaugeChartVisual` .","properties":{"Icon":"The conditional formatting of the primary value icon.","TextColor":"The conditional formatting of the primary value text color."}},"AWS::QuickSight::Template.GaugeChartVisual":{"attributes":{},"description":"A gauge chart.\\n\\nFor more information, see [Using gauge charts](https://docs.aws.amazon.com/quicksight/latest/user/gauge-chart.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a `GaugeChartVisual` .","ConditionalFormatting":"The conditional formatting of a `GaugeChartVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.GeospatialCoordinateBounds":{"attributes":{},"description":"The bound options (north, south, west, east) of the geospatial window options.","properties":{"East":"The longitude of the east bound of the geospatial coordinate bounds.","North":"The latitude of the north bound of the geospatial coordinate bounds.","South":"The latitude of the south bound of the geospatial coordinate bounds.","West":"The longitude of the west bound of the geospatial coordinate bounds."}},"AWS::QuickSight::Template.GeospatialHeatmapColorScale":{"attributes":{},"description":"The color scale specification for the heatmap point style.","properties":{"Colors":"The list of colors to be used in heatmap point style."}},"AWS::QuickSight::Template.GeospatialHeatmapConfiguration":{"attributes":{},"description":"The heatmap configuration of the geospatial point style.","properties":{"HeatmapColor":"The color scale specification for the heatmap point style."}},"AWS::QuickSight::Template.GeospatialHeatmapDataColor":{"attributes":{},"description":"The color to be used in the heatmap point style.","properties":{"Color":"The hex color to be used in the heatmap point style."}},"AWS::QuickSight::Template.GeospatialMapAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells for a geospatial map.","properties":{"Colors":"The color field wells of a geospatial map.","Geospatial":"The geospatial field wells of a geospatial map. Values are grouped by geospatial fields.","Values":"The size field wells of a geospatial map. Values are aggregated based on geospatial fields."}},"AWS::QuickSight::Template.GeospatialMapConfiguration":{"attributes":{},"description":"The configuration of a `GeospatialMapVisual` .","properties":{"FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","MapStyleOptions":"The map style options of the geospatial map.","PointStyleOptions":"The point style options of the geospatial map.","Tooltip":"The tooltip display setup of the visual.","VisualPalette":"","WindowOptions":"The window options of the geospatial map."}},"AWS::QuickSight::Template.GeospatialMapFieldWells":{"attributes":{},"description":"The field wells of a `GeospatialMapVisual` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"GeospatialMapAggregatedFieldWells":"The aggregated field well for a geospatial map."}},"AWS::QuickSight::Template.GeospatialMapStyleOptions":{"attributes":{},"description":"The map style options of the geospatial map.","properties":{"BaseMapStyle":"The base map style of the geospatial map."}},"AWS::QuickSight::Template.GeospatialMapVisual":{"attributes":{},"description":"A geospatial map or a points on map visual.\\n\\nFor more information, see [Creating point maps](https://docs.aws.amazon.com/quicksight/latest/user/point-maps.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Template.GeospatialPointStyleOptions":{"attributes":{},"description":"The point style of the geospatial map.","properties":{"ClusterMarkerConfiguration":"The cluster marker configuration of the geospatial point style.","HeatmapConfiguration":"The heatmap configuration of the geospatial point style.","SelectedPointStyle":"The selected point styles (point, cluster) of the geospatial map."}},"AWS::QuickSight::Template.GeospatialWindowOptions":{"attributes":{},"description":"The window options of the geospatial map visual.","properties":{"Bounds":"The bounds options (north, south, west, east) of the geospatial window options.","MapZoomMode":"The map zoom modes (manual, auto) of the geospatial window options."}},"AWS::QuickSight::Template.GlobalTableBorderOptions":{"attributes":{},"description":"Determines the border options for a table visual.","properties":{"SideSpecificBorder":"Determines the options for side specific border.","UniformBorder":"Determines the options for uniform border."}},"AWS::QuickSight::Template.GradientColor":{"attributes":{},"description":"Determines the gradient color settings.","properties":{"Stops":"The list of gradient color stops."}},"AWS::QuickSight::Template.GradientStop":{"attributes":{},"description":"Determines the gradient stop configuration.","properties":{"Color":"Determines the color.","DataValue":"Determines the data value.","GradientOffset":"Determines gradient offset value."}},"AWS::QuickSight::Template.GridLayoutCanvasSizeOptions":{"attributes":{},"description":"Configuration options for the canvas of a grid layout.","properties":{"ScreenCanvasSizeOptions":"The options that determine the sizing of the canvas used in a grid layout."}},"AWS::QuickSight::Template.GridLayoutConfiguration":{"attributes":{},"description":"The configuration for a grid layout. Also called a tiled layout.\\n\\nVisuals snap to a grid with standard spacing and alignment. Dashboards are displayed as designed, with options to fit to screen or view at actual size.","properties":{"CanvasSizeOptions":"","Elements":"The elements that are included in a grid layout."}},"AWS::QuickSight::Template.GridLayoutElement":{"attributes":{},"description":"An element within a grid layout.","properties":{"ColumnIndex":"The column index for the upper left corner of an element.","ColumnSpan":"The width of a grid element expressed as a number of grid columns.","ElementId":"A unique identifier for an element within a grid layout.","ElementType":"The type of element.","RowIndex":"The row index for the upper left corner of an element.","RowSpan":"The height of a grid element expressed as a number of grid rows."}},"AWS::QuickSight::Template.GridLayoutScreenCanvasSizeOptions":{"attributes":{},"description":"The options that determine the sizing of the canvas used in a grid layout.","properties":{"OptimizedViewPortWidth":"The width that the view port will be optimized for when the layout renders.","ResizeOption":"This value determines the layout behavior when the viewport is resized.\\n\\n- `FIXED` : A fixed width will be used when optimizing the layout. In the Amazon QuickSight console, this option is called `Classic` .\\n- `RESPONSIVE` : The width of the canvas will be responsive and optimized to the view port. In the Amazon QuickSight console, this option is called `Tiled` ."}},"AWS::QuickSight::Template.GrowthRateComputation":{"attributes":{},"description":"The growth rate computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","PeriodSize":"The period size setup of a growth rate computation.","Time":"The time field that is used in a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Template.HeaderFooterSectionConfiguration":{"attributes":{},"description":"The configuration of a header or footer section.","properties":{"Layout":"The layout configuration of the header or footer section.","SectionId":"The unique identifier of the header or footer section.","Style":"The style options of a header or footer section."}},"AWS::QuickSight::Template.HeatMapAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a heat map.","properties":{"Columns":"The columns field well of a heat map.","Rows":"The rows field well of a heat map.","Values":"The values field well of a heat map."}},"AWS::QuickSight::Template.HeatMapConfiguration":{"attributes":{},"description":"The configuration of a heat map.","properties":{"ColorScale":"The color options (gradient color, point of divergence) in a heat map.","ColumnLabelOptions":"The label options of the column that is displayed in a heat map.","DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","RowLabelOptions":"The label options of the row that is displayed in a `heat map` .","SortConfiguration":"The sort configuration of a heat map.","Tooltip":"The tooltip display setup of the visual."}},"AWS::QuickSight::Template.HeatMapFieldWells":{"attributes":{},"description":"The field well configuration of a heat map.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"HeatMapAggregatedFieldWells":"The aggregated field wells of a heat map."}},"AWS::QuickSight::Template.HeatMapSortConfiguration":{"attributes":{},"description":"The sort configuration of a heat map.","properties":{"HeatMapColumnItemsLimitConfiguration":"The limit on the number of columns that are displayed in a heat map.","HeatMapColumnSort":"The column sort configuration for heat map for columns that aren\'t a part of a field well.","HeatMapRowItemsLimitConfiguration":"The limit on the number of rows that are displayed in a heat map.","HeatMapRowSort":"The field sort configuration of the rows fields."}},"AWS::QuickSight::Template.HeatMapVisual":{"attributes":{},"description":"A heat map.\\n\\nFor more information, see [Using heat maps](https://docs.aws.amazon.com/quicksight/latest/user/heat-map.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a heat map.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.HistogramAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a histogram.","properties":{"Values":"The value field wells of a histogram. Values are aggregated by `COUNT` or `DISTINCT_COUNT` ."}},"AWS::QuickSight::Template.HistogramBinOptions":{"attributes":{},"description":"The options that determine the presentation of histogram bins.","properties":{"BinCount":"The options that determine the bin count of a histogram.","BinWidth":"The options that determine the bin width of a histogram.","SelectedBinType":"The options that determine the selected bin type.","StartValue":"The options that determine the bin start value."}},"AWS::QuickSight::Template.HistogramConfiguration":{"attributes":{},"description":"The configuration for a `HistogramVisual` .","properties":{"BinOptions":"The options that determine the presentation of histogram bins.","DataLabels":"The data label configuration of a histogram.","FieldWells":"The field well configuration of a histogram.","Tooltip":"The tooltip configuration of a histogram.","VisualPalette":"The visual palette configuration of a histogram.","XAxisDisplayOptions":"The options that determine the presentation of the x-axis.","XAxisLabelOptions":"The options that determine the presentation of the x-axis label.","YAxisDisplayOptions":"The options that determine the presentation of the y-axis."}},"AWS::QuickSight::Template.HistogramFieldWells":{"attributes":{},"description":"The field well configuration of a histogram.","properties":{"HistogramAggregatedFieldWells":"The field well configuration of a histogram."}},"AWS::QuickSight::Template.HistogramVisual":{"attributes":{},"description":"A histogram.\\n\\nFor more information, see [Using histograms](https://docs.aws.amazon.com/quicksight/latest/user/histogram-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration for a `HistogramVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.InsightConfiguration":{"attributes":{},"description":"The configuration of an insight visual.","properties":{"Computations":"The computations configurations of the insight visual","CustomNarrative":"The custom narrative of the insight visual."}},"AWS::QuickSight::Template.InsightVisual":{"attributes":{},"description":"An insight visual.\\n\\nFor more information, see [Working with insights](https://docs.aws.amazon.com/quicksight/latest/user/computational-insights.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","DataSetIdentifier":"The dataset that is used in the insight visual.","InsightConfiguration":"The configuration of an insight visual.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.IntegerDefaultValues":{"attributes":{},"description":"The default values of the `IntegerParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `IntegerDefaultValues` . Different defaults are displayed according to users, groups, and values mapping.","StaticValues":"The static values of the `IntegerDefaultValues` ."}},"AWS::QuickSight::Template.IntegerParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `Integer` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","ParameterValueType":"The value type determines whether the parameter is a single-value or multi-value parameter.","ValueWhenUnset":"A parameter declaration for the `Integer` data type."}},"AWS::QuickSight::Template.IntegerValueWhenUnsetConfiguration":{"attributes":{},"description":"A parameter declaration for the `Integer` data type.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Template.ItemsLimitConfiguration":{"attributes":{},"description":"The limit configuration of the visual display for an axis.","properties":{"ItemsLimit":"The limit on how many items of a field are showed in the chart. For example, the number of slices that are displayed in a pie chart.","OtherCategories":"The `Show other` of an axis in the chart. Choose one of the following options:\\n\\n- `INCLUDE`\\n- `EXCLUDE`"}},"AWS::QuickSight::Template.KPIConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a KPI visual.","properties":{"ConditionalFormattingOptions":"The conditional formatting options of a KPI visual."}},"AWS::QuickSight::Template.KPIConditionalFormattingOption":{"attributes":{},"description":"The conditional formatting options of a KPI visual.","properties":{"PrimaryValue":"The conditional formatting for the primary value of a KPI visual.","ProgressBar":"The conditional formatting for the progress bar of a KPI visual."}},"AWS::QuickSight::Template.KPIConfiguration":{"attributes":{},"description":"The configuration of a KPI visual.","properties":{"FieldWells":"The field well configuration of a KPI visual.","KPIOptions":"The options that determine the presentation of a KPI visual.","SortConfiguration":"The sort configuration of a KPI visual."}},"AWS::QuickSight::Template.KPIFieldWells":{"attributes":{},"description":"The field well configuration of a KPI visual.","properties":{"TargetValues":"The target value field wells of a KPI visual.","TrendGroups":"The trend group field wells of a KPI visual.","Values":"The value field wells of a KPI visual."}},"AWS::QuickSight::Template.KPIOptions":{"attributes":{},"description":"The options that determine the presentation of a KPI visual.","properties":{"Comparison":"The comparison configuration of a KPI visual.","PrimaryValueDisplayType":"The options that determine the primary value display type.","PrimaryValueFontConfiguration":"The options that determine the primary value font configuration.","ProgressBar":"The options that determine the presentation of the progress bar of a KPI visual.","SecondaryValue":"The options that determine the presentation of the secondary value of a KPI visual.","SecondaryValueFontConfiguration":"The options that determine the secondary value font configuration.","TrendArrows":"The options that determine the presentation of trend arrows in a KPI visual."}},"AWS::QuickSight::Template.KPIPrimaryValueConditionalFormatting":{"attributes":{},"description":"The conditional formatting for the primary value of a KPI visual.","properties":{"Icon":"The conditional formatting of the primary value\'s icon.","TextColor":"The conditional formatting of the primary value\'s text color."}},"AWS::QuickSight::Template.KPIProgressBarConditionalFormatting":{"attributes":{},"description":"The conditional formatting for the progress bar of a KPI visual.","properties":{"ForegroundColor":"The conditional formatting of the progress bar\'s foreground color."}},"AWS::QuickSight::Template.KPISortConfiguration":{"attributes":{},"description":"The sort configuration of a KPI visual.","properties":{"TrendGroupSort":"The sort configuration of the trend group fields."}},"AWS::QuickSight::Template.KPIVisual":{"attributes":{},"description":"A key performance indicator (KPI).\\n\\nFor more information, see [Using KPIs](https://docs.aws.amazon.com/quicksight/latest/user/kpi.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a KPI visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","ConditionalFormatting":"The conditional formatting of a KPI visual.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.LabelOptions":{"attributes":{},"description":"The share label options for the labels.","properties":{"CustomLabel":"The text for the label.","FontConfiguration":"The font configuration of the label.","Visibility":"Determines whether or not the label is visible."}},"AWS::QuickSight::Template.Layout":{"attributes":{},"description":"A `Layout` defines the placement of elements within a sheet.\\n\\nFor more information, see [Types of layout](https://docs.aws.amazon.com/quicksight/latest/user/types-of-layout.html) in the *Amazon QuickSight User Guide* .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Configuration":"The configuration that determines what the type of layout for a sheet."}},"AWS::QuickSight::Template.LayoutConfiguration":{"attributes":{},"description":"The configuration that determines what the type of layout will be used on a sheet.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FreeFormLayout":"A free-form is optimized for a fixed width and has more control over the exact placement of layout elements.","GridLayout":"A type of layout that can be used on a sheet. In a grid layout, visuals snap to a grid with standard spacing and alignment. Dashboards are displayed as designed, with options to fit to screen or view at actual size. A grid layout can be configured to behave in one of two ways when the viewport is resized: `FIXED` or `RESPONSIVE` .","SectionBasedLayout":"A section based layout organizes visuals into multiple sections and has customized header, footer and page break."}},"AWS::QuickSight::Template.LegendOptions":{"attributes":{},"description":"The options for the legend setup of a visual.","properties":{"Height":"The height of the legend. If this value is omitted, a default height is used when rendering.","Position":"The positions for the legend. Choose one of the following options:\\n\\n- `AUTO`\\n- `RIGHT`\\n- `BOTTOM`\\n- `LEFT`","Title":"The custom title for the legend.","Visibility":"Determines whether or not the legend is visible.","Width":"The width of the legend. If this value is omitted, a default width is used when rendering."}},"AWS::QuickSight::Template.LineChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a line chart.","properties":{"Category":"The category field wells of a line chart. Values are grouped by category fields.","Colors":"The color field wells of a line chart. Values are grouped by category fields.","SmallMultiples":"The small multiples field well of a line chart.","Values":"The value field wells of a line chart. Values are aggregated based on categories."}},"AWS::QuickSight::Template.LineChartConfiguration":{"attributes":{},"description":"The configuration of a line chart.","properties":{"ContributionAnalysisDefaults":"The default configuration of a line chart\'s contribution analysis.","DataLabels":"The data label configuration of a line chart.","DefaultSeriesSettings":"The options that determine the default presentation of all line series in `LineChartVisual` .","FieldWells":"The field well configuration of a line chart.","ForecastConfigurations":"The forecast configuration of a line chart.","Legend":"The legend configuration of a line chart.","PrimaryYAxisDisplayOptions":"The series axis configuration of a line chart.","PrimaryYAxisLabelOptions":"The options that determine the presentation of the y-axis label.","ReferenceLines":"The reference lines configuration of a line chart.","SecondaryYAxisDisplayOptions":"The series axis configuration of a line chart.","SecondaryYAxisLabelOptions":"The options that determine the presentation of the secondary y-axis label.","Series":"The series item configuration of a line chart.","SmallMultiplesOptions":"The small multiples setup for the visual.","SortConfiguration":"The sort configuration of a line chart.","Tooltip":"The tooltip configuration of a line chart.","Type":"Determines the type of the line chart.","VisualPalette":"The visual palette configuration of a line chart.","XAxisDisplayOptions":"The options that determine the presentation of the x-axis.","XAxisLabelOptions":"The options that determine the presentation of the x-axis label."}},"AWS::QuickSight::Template.LineChartDefaultSeriesSettings":{"attributes":{},"description":"The options that determine the default presentation of all line series in `LineChartVisual` .","properties":{"AxisBinding":"The axis to which you are binding all line series to.","LineStyleSettings":"Line styles options for all line series in the visual.","MarkerStyleSettings":"Marker styles options for all line series in the visual."}},"AWS::QuickSight::Template.LineChartFieldWells":{"attributes":{},"description":"The field well configuration of a line chart.","properties":{"LineChartAggregatedFieldWells":"The field well configuration of a line chart."}},"AWS::QuickSight::Template.LineChartLineStyleSettings":{"attributes":{},"description":"Line styles options for a line series in `LineChartVisual` .","properties":{"LineInterpolation":"Interpolation style for line series.\\n\\n- `LINEAR` : Show as default, linear style.\\n- `SMOOTH` : Show as a smooth curve.\\n- `STEPPED` : Show steps in line.","LineStyle":"Line style for line series.\\n\\n- `SOLID` : Show as a solid line.\\n- `DOTTED` : Show as a dotted line.\\n- `DASHED` : Show as a dashed line.","LineVisibility":"Configuration option that determines whether to show the line for the series.","LineWidth":"Width that determines the line thickness."}},"AWS::QuickSight::Template.LineChartMarkerStyleSettings":{"attributes":{},"description":"Marker styles options for a line series in `LineChartVisual` .","properties":{"MarkerColor":"Color of marker in the series.","MarkerShape":"Shape option for markers in the series.\\n\\n- `CIRCLE` : Show marker as a circle.\\n- `TRIANGLE` : Show marker as a triangle.\\n- `SQUARE` : Show marker as a square.\\n- `DIAMOND` : Show marker as a diamond.\\n- `ROUNDED_SQUARE` : Show marker as a rounded square.","MarkerSize":"Size of marker in the series.","MarkerVisibility":"Configuration option that determines whether to show the markers in the series."}},"AWS::QuickSight::Template.LineChartSeriesSettings":{"attributes":{},"description":"The options that determine the presentation of a line series in the visual","properties":{"LineStyleSettings":"Line styles options for a line series in `LineChartVisual` .","MarkerStyleSettings":"Marker styles options for a line series in `LineChartVisual` ."}},"AWS::QuickSight::Template.LineChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a line chart.","properties":{"CategoryItemsLimitConfiguration":"The limit on the number of categories that are displayed in a line chart.","CategorySort":"The sort configuration of the category fields.","ColorItemsLimitConfiguration":"The limit on the number of lines that are displayed in a line chart.","SmallMultiplesLimitConfiguration":"The limit on the number of small multiples panels that are displayed.","SmallMultiplesSort":"The sort configuration of the small multiples field."}},"AWS::QuickSight::Template.LineChartVisual":{"attributes":{},"description":"A line chart.\\n\\nFor more information, see [Using line charts](https://docs.aws.amazon.com/quicksight/latest/user/line-charts.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a line chart.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.LineSeriesAxisDisplayOptions":{"attributes":{},"description":"The series axis configuration of a line chart.","properties":{"AxisOptions":"The options that determine the presentation of the line series axis.","MissingDataConfigurations":"The configuration options that determine how missing data is treated during the rendering of a line chart."}},"AWS::QuickSight::Template.ListControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"SearchOptions":"The configuration of the search options in a list control.","SelectAllOptions":"The configuration of the `Select all` options in a list control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Template.ListControlSearchOptions":{"attributes":{},"description":"The configuration of the search options in a list control.","properties":{"Visibility":"The visibility configuration of the search options in a list control."}},"AWS::QuickSight::Template.ListControlSelectAllOptions":{"attributes":{},"description":"The configuration of the `Select all` options in a list control.","properties":{"Visibility":"The visibility configuration of the `Select all` options in a list control."}},"AWS::QuickSight::Template.LoadingAnimation":{"attributes":{},"description":"The configuration of loading animation in free-form layout.","properties":{"Visibility":"The visibility configuration of `LoadingAnimation` ."}},"AWS::QuickSight::Template.LocalNavigationConfiguration":{"attributes":{},"description":"The navigation configuration for `CustomActionNavigationOperation` .","properties":{"TargetSheetId":"The sheet that is targeted for navigation in the same analysis."}},"AWS::QuickSight::Template.LongFormatText":{"attributes":{},"description":"The text format for a subtitle.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PlainText":"Plain text format.","RichText":"Rich text. Examples of rich text include bold, underline, and italics."}},"AWS::QuickSight::Template.MappedDataSetParameter":{"attributes":{},"description":"A dataset parameter that is mapped to an analysis parameter.","properties":{"DataSetIdentifier":"A unique name that identifies a dataset within the analysis or dashboard.","DataSetParameterName":"The name of the dataset parameter."}},"AWS::QuickSight::Template.MaximumLabelType":{"attributes":{},"description":"The maximum label of a data path label.","properties":{"Visibility":"The visibility of the maximum label."}},"AWS::QuickSight::Template.MaximumMinimumComputation":{"attributes":{},"description":"The maximum and minimum computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","Time":"The time field that is used in a computation.","Type":"The type of computation. Choose one of the following options:\\n\\n- MAXIMUM: A maximum computation.\\n- MINIMUM: A minimum computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Template.MeasureField":{"attributes":{},"description":"The measure (metric) type field.","properties":{"CalculatedMeasureField":"The calculated measure field only used in pivot tables.","CategoricalMeasureField":"The measure type field with categorical type columns.","DateMeasureField":"The measure type field with date type columns.","NumericalMeasureField":"The measure type field with numerical type columns."}},"AWS::QuickSight::Template.MetricComparisonComputation":{"attributes":{},"description":"The metric comparison computation configuration.","properties":{"ComputationId":"The ID for a computation.","FromValue":"The field that is used in a metric comparison from value setup.","Name":"The name of a computation.","TargetValue":"The field that is used in a metric comparison to value setup.","Time":"The time field that is used in a computation."}},"AWS::QuickSight::Template.MinimumLabelType":{"attributes":{},"description":"The minimum label of a data path label.","properties":{"Visibility":"The visibility of the minimum label."}},"AWS::QuickSight::Template.MissingDataConfiguration":{"attributes":{},"description":"The configuration options that determine how missing data is treated during the rendering of a line chart.","properties":{"TreatmentOption":"The treatment option that determines how missing data should be rendered. Choose from the following options:\\n\\n- `INTERPOLATE` : Interpolate missing values between the prior and the next known value.\\n- `SHOW_AS_ZERO` : Show missing values as the value `0` .\\n- `SHOW_AS_BLANK` : Display a blank space when rendering missing data."}},"AWS::QuickSight::Template.NegativeValueConfiguration":{"attributes":{},"description":"The options that determine the negative value configuration.","properties":{"DisplayMode":"Determines the display mode of the negative value configuration."}},"AWS::QuickSight::Template.NullValueFormatConfiguration":{"attributes":{},"description":"The options that determine the null value format configuration.","properties":{"NullString":"Determines the null string of null values."}},"AWS::QuickSight::Template.NumberDisplayFormatConfiguration":{"attributes":{},"description":"The options that determine the number display format configuration.","properties":{"DecimalPlacesConfiguration":"The option that determines the decimal places configuration.","NegativeValueConfiguration":"The options that determine the negative value configuration.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumberScale":"Determines the number scale value of the number format.","Prefix":"Determines the prefix value of the number format.","SeparatorConfiguration":"The options that determine the numeric separator configuration.","Suffix":"Determines the suffix value of the number format."}},"AWS::QuickSight::Template.NumberFormatConfiguration":{"attributes":{},"description":"Formatting configuration for number fields.","properties":{"FormatConfiguration":"The options that determine the numeric format configuration."}},"AWS::QuickSight::Template.NumericAxisOptions":{"attributes":{},"description":"The options for an axis with a numeric field.","properties":{"Range":"The range setup of a numeric axis.","Scale":"The scale setup of a numeric axis."}},"AWS::QuickSight::Template.NumericEqualityDrillDownFilter":{"attributes":{},"description":"The category drill down filter.","properties":{"Column":"The column that the filter is applied to.","Value":"The value of the double input numeric drill down filter."}},"AWS::QuickSight::Template.NumericEqualityFilter":{"attributes":{},"description":"A `NumericEqualityFilter` filters values that are equal to the specified value.","properties":{"AggregationFunction":"The aggregation function of the filter.","Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","MatchOperator":"The match operator that is used to determine if a filter should be applied.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","ParameterName":"The parameter whose value should be used for the filter value.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`","Value":"The input value."}},"AWS::QuickSight::Template.NumericFormatConfiguration":{"attributes":{},"description":"The options that determine the numeric format configuration.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"CurrencyDisplayFormatConfiguration":"The options that determine the currency display format configuration.","NumberDisplayFormatConfiguration":"The options that determine the number display format configuration.","PercentageDisplayFormatConfiguration":"The options that determine the percentage display format configuration."}},"AWS::QuickSight::Template.NumericRangeFilter":{"attributes":{},"description":"A `NumericRangeFilter` filters values that are within the value range.","properties":{"AggregationFunction":"The aggregation function of the filter.","Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","IncludeMaximum":"Determines whether the maximum value in the filter value range should be included in the filtered results.","IncludeMinimum":"Determines whether the minimum value in the filter value range should be included in the filtered results.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","RangeMaximum":"The maximum value for the filter value range.","RangeMinimum":"The minimum value for the filter value range.","SelectAllOptions":"Select all of the values. Null is not the assigned value of select all.\\n\\n- `FILTER_ALL_VALUES`"}},"AWS::QuickSight::Template.NumericRangeFilterValue":{"attributes":{},"description":"The value input pf the numeric range filter.","properties":{"Parameter":"The parameter that is used in the numeric range.","StaticValue":"The static value of the numeric range filter."}},"AWS::QuickSight::Template.NumericSeparatorConfiguration":{"attributes":{},"description":"The options that determine the numeric separator configuration.","properties":{"DecimalSeparator":"Determines the decimal separator.","ThousandsSeparator":"The options that determine the thousands separator configuration."}},"AWS::QuickSight::Template.NumericalAggregationFunction":{"attributes":{},"description":"Aggregation for numerical values.","properties":{"PercentileAggregation":"An aggregation based on the percentile of values in a dimension or measure.","SimpleNumericalAggregation":"Built-in aggregation functions for numerical values.\\n\\n- `SUM` : The sum of a dimension or measure.\\n- `AVERAGE` : The average of a dimension or measure.\\n- `MIN` : The minimum value of a dimension or measure.\\n- `MAX` : The maximum value of a dimension or measure.\\n- `COUNT` : The count of a dimension or measure.\\n- `DISTINCT_COUNT` : The count of distinct values in a dimension or measure.\\n- `VAR` : The variance of a dimension or measure.\\n- `VARP` : The partitioned variance of a dimension or measure.\\n- `STDEV` : The standard deviation of a dimension or measure.\\n- `STDEVP` : The partitioned standard deviation of a dimension or measure.\\n- `MEDIAN` : The median value of a dimension or measure."}},"AWS::QuickSight::Template.NumericalDimensionField":{"attributes":{},"description":"The dimension type field with numerical type columns.","properties":{"Column":"The column that is used in the `NumericalDimensionField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field.","HierarchyId":"The custom hierarchy ID."}},"AWS::QuickSight::Template.NumericalMeasureField":{"attributes":{},"description":"The measure type field with numerical type columns.","properties":{"AggregationFunction":"The aggregation function of the measure field.","Column":"The column that is used in the `NumericalMeasureField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Template.PaginationConfiguration":{"attributes":{},"description":"The pagination configuration for a table visual or boxplot.","properties":{"PageNumber":"Indicates the page number.","PageSize":"Indicates how many items render in one page."}},"AWS::QuickSight::Template.PanelConfiguration":{"attributes":{},"description":"A collection of options that configure how each panel displays in a small multiples chart.","properties":{"BackgroundColor":"Sets the background color for each panel.","BackgroundVisibility":"Determines whether or not a background for each small multiples panel is rendered.","BorderColor":"Sets the line color of panel borders.","BorderStyle":"Sets the line style of panel borders.","BorderThickness":"Sets the line thickness of panel borders.","BorderVisibility":"Determines whether or not each panel displays a border.","GutterSpacing":"Sets the total amount of negative space to display between sibling panels.","GutterVisibility":"Determines whether or not negative space between sibling panels is rendered.","Title":"Configures the title display within each small multiples panel."}},"AWS::QuickSight::Template.PanelTitleOptions":{"attributes":{},"description":"The options that determine the title styles for each small multiples panel.","properties":{"FontConfiguration":"","HorizontalTextAlignment":"Sets the horizontal text alignment of the title within each panel.","Visibility":"Determines whether or not panel titles are displayed."}},"AWS::QuickSight::Template.ParameterControl":{"attributes":{},"description":"The control of a parameter that users can interact with in a dashboard or an analysis.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimePicker":"A control from a date parameter that specifies date and time.","Dropdown":"A control to display a dropdown list with buttons that are used to select a single value.","List":"A control to display a list with buttons or boxes that are used to select either a single value or multiple values.","Slider":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","TextArea":"A control to display a text box that is used to enter multiple entries.","TextField":"A control to display a text box that is used to enter a single entry."}},"AWS::QuickSight::Template.ParameterDateTimePickerControl":{"attributes":{},"description":"A control from a date parameter that specifies date and time.","properties":{"DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterDateTimePickerControl` .","SourceParameterName":"The name of the `ParameterDateTimePickerControl` .","Title":"The title of the `ParameterDateTimePickerControl` ."}},"AWS::QuickSight::Template.ParameterDeclaration":{"attributes":{},"description":"The declaration definition of a parameter.\\n\\nFor more information, see [Parameters in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/parameters-in-quicksight.html) in the *Amazon QuickSight User Guide* .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DateTimeParameterDeclaration":"A parameter declaration for the `DateTime` data type.","DecimalParameterDeclaration":"A parameter declaration for the `Decimal` data type.","IntegerParameterDeclaration":"A parameter declaration for the `Integer` data type.","StringParameterDeclaration":"A parameter declaration for the `String` data type."}},"AWS::QuickSight::Template.ParameterDropDownControl":{"attributes":{},"description":"A control to display a dropdown list with buttons that are used to select a single value.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterDropDownControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceParameterName":"The source parameter name of the `ParameterDropDownControl` .","Title":"The title of the `ParameterDropDownControl` .","Type":"The type parameter name of the `ParameterDropDownControl` ."}},"AWS::QuickSight::Template.ParameterListControl":{"attributes":{},"description":"A control to display a list with buttons or boxes that are used to select either a single value or multiple values.","properties":{"CascadingControlConfiguration":"The values that are displayed in a control can be configured to only show values that are valid based on what\'s selected in other controls.","DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterListControl` .","SelectableValues":"A list of selectable values that are used in a control.","SourceParameterName":"The source parameter name of the `ParameterListControl` .","Title":"The title of the `ParameterListControl` .","Type":"The type of `ParameterListControl` ."}},"AWS::QuickSight::Template.ParameterSelectableValues":{"attributes":{},"description":"A list of selectable values that are used in a control.","properties":{"LinkToDataSetColumn":"The column identifier that fetches values from the data set.","Values":"The values that are used in `ParameterSelectableValues` ."}},"AWS::QuickSight::Template.ParameterSliderControl":{"attributes":{},"description":"A control to display a horizontal toggle bar. This is used to change a value by sliding the toggle.","properties":{"DisplayOptions":"The display options of a control.","MaximumValue":"The smaller value that is displayed at the left of the slider.","MinimumValue":"The larger value that is displayed at the right of the slider.","ParameterControlId":"The ID of the `ParameterSliderControl` .","SourceParameterName":"The source parameter name of the `ParameterSliderControl` .","StepSize":"The number of increments that the slider bar is divided into.","Title":"The title of the `ParameterSliderControl` ."}},"AWS::QuickSight::Template.ParameterTextAreaControl":{"attributes":{},"description":"A control to display a text box that is used to enter multiple entries.","properties":{"Delimiter":"The delimiter that is used to separate the lines in text.","DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterTextAreaControl` .","SourceParameterName":"The source parameter name of the `ParameterTextAreaControl` .","Title":"The title of the `ParameterTextAreaControl` ."}},"AWS::QuickSight::Template.ParameterTextFieldControl":{"attributes":{},"description":"A control to display a text box that is used to enter a single entry.","properties":{"DisplayOptions":"The display options of a control.","ParameterControlId":"The ID of the `ParameterTextFieldControl` .","SourceParameterName":"The source parameter name of the `ParameterTextFieldControl` .","Title":"The title of the `ParameterTextFieldControl` ."}},"AWS::QuickSight::Template.PercentVisibleRange":{"attributes":{},"description":"The percent range in the visible range.","properties":{"From":"The lower bound of the range.","To":"The top bound of the range."}},"AWS::QuickSight::Template.PercentageDisplayFormatConfiguration":{"attributes":{},"description":"The options that determine the percentage display format configuration.","properties":{"DecimalPlacesConfiguration":"The option that determines the decimal places configuration.","NegativeValueConfiguration":"The options that determine the negative value configuration.","NullValueFormatConfiguration":"The options that determine the null value format configuration.","Prefix":"Determines the prefix value of the percentage format.","SeparatorConfiguration":"The options that determine the numeric separator configuration.","Suffix":"Determines the suffix value of the percentage format."}},"AWS::QuickSight::Template.PercentileAggregation":{"attributes":{},"description":"An aggregation based on the percentile of values in a dimension or measure.","properties":{"PercentileValue":"The percentile value. This value can be any numeric constant 0–100. A percentile value of 50 computes the median value of the measure."}},"AWS::QuickSight::Template.PeriodOverPeriodComputation":{"attributes":{},"description":"The period over period computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","Time":"The time field that is used in a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Template.PeriodToDateComputation":{"attributes":{},"description":"The period to date computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","PeriodTimeGranularity":"The time granularity setup of period to date computation. Choose from the following options:\\n\\n- YEAR: Year to date.\\n- MONTH: Month to date.","Time":"The time field that is used in a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Template.PieChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a pie chart.","properties":{"Category":"The category (group/color) field wells of a pie chart.","SmallMultiples":"The small multiples field well of a pie chart.","Values":"The value field wells of a pie chart. Values are aggregated based on categories."}},"AWS::QuickSight::Template.PieChartConfiguration":{"attributes":{},"description":"The configuration of a pie chart.","properties":{"CategoryLabelOptions":"The label options of the group/color that is displayed in a pie chart.","ContributionAnalysisDefaults":"The contribution analysis (anomaly configuration) setup of the visual.","DataLabels":"The options that determine if visual data labels are displayed.","DonutOptions":"The options that determine the shape of the chart. This option determines whether the chart is a pie chart or a donut chart.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","SmallMultiplesOptions":"The small multiples setup for the visual.","SortConfiguration":"The sort configuration of a pie chart.","Tooltip":"The tooltip display setup of the visual.","ValueLabelOptions":"The label options for the value that is displayed in a pie chart.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Template.PieChartFieldWells":{"attributes":{},"description":"The field well configuration of a pie chart.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PieChartAggregatedFieldWells":"The field well configuration of a pie chart."}},"AWS::QuickSight::Template.PieChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a pie chart.","properties":{"CategoryItemsLimit":"The limit on the number of categories that are displayed in a pie chart.","CategorySort":"The sort configuration of the category fields.","SmallMultiplesLimitConfiguration":"The limit on the number of small multiples panels that are displayed.","SmallMultiplesSort":"The sort configuration of the small multiples field."}},"AWS::QuickSight::Template.PieChartVisual":{"attributes":{},"description":"A pie or donut chart.\\n\\nThe `PieChartVisual` structure describes a visual that is a member of the pie chart family.\\n\\nThe following charts can be described by using this structure:\\n\\n- Pie charts\\n- Donut charts\\n\\nFor more information, see [Using pie charts](https://docs.aws.amazon.com/quicksight/latest/user/pie-chart.html) in the *Amazon QuickSight User Guide* .\\n\\nFor more information, see [Using donut charts](https://docs.aws.amazon.com/quicksight/latest/user/donut-chart.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a pie chart.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.PivotFieldSortOptions":{"attributes":{},"description":"The field sort options for a pivot table sort configuration.","properties":{"FieldId":"The field ID for the field sort options.","SortBy":"The sort by field for the field sort options."}},"AWS::QuickSight::Template.PivotTableAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well for the pivot table.","properties":{"Columns":"The columns field well for a pivot table. Values are grouped by columns fields.","Rows":"The rows field well for a pivot table. Values are grouped by rows fields.","Values":"The values field well for a pivot table. Values are aggregated based on rows and columns fields."}},"AWS::QuickSight::Template.PivotTableCellConditionalFormatting":{"attributes":{},"description":"The cell conditional formatting option for a pivot table.","properties":{"FieldId":"The field ID of the cell for conditional formatting.","Scope":"The scope of the cell for conditional formatting.","Scopes":"A list of cell scopes for conditional formatting.","TextFormat":"The text format of the cell for conditional formatting."}},"AWS::QuickSight::Template.PivotTableConditionalFormatting":{"attributes":{},"description":"The conditional formatting for a `PivotTableVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options for a `PivotTableVisual` ."}},"AWS::QuickSight::Template.PivotTableConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options for a `PivotTableVisual` .","properties":{"Cell":"The cell conditional formatting option for a pivot table."}},"AWS::QuickSight::Template.PivotTableConditionalFormattingScope":{"attributes":{},"description":"The scope of the cell for conditional formatting.","properties":{"Role":"The role (field, field total, grand total) of the cell for conditional formatting."}},"AWS::QuickSight::Template.PivotTableConfiguration":{"attributes":{},"description":"The configuration for a `PivotTableVisual` .","properties":{"FieldOptions":"The field options for a pivot table visual.","FieldWells":"The field wells of the visual.","PaginatedReportOptions":"The paginated report options for a pivot table visual.","SortConfiguration":"The sort configuration for a `PivotTableVisual` .","TableOptions":"The table options for a pivot table visual.","TotalOptions":"The total options for a pivot table visual."}},"AWS::QuickSight::Template.PivotTableDataPathOption":{"attributes":{},"description":"The data path options for the pivot table field options.","properties":{"DataPathList":"The list of data path values for the data path options.","Width":"The width of the data path option."}},"AWS::QuickSight::Template.PivotTableFieldCollapseStateOption":{"attributes":{},"description":"The collapse state options for the pivot table field options.","properties":{"State":"The state of the field target of a pivot table. Choose one of the following options:\\n\\n- `COLLAPSED`\\n- `EXPANDED`","Target":"A tagged-union object that sets the collapse state."}},"AWS::QuickSight::Template.PivotTableFieldCollapseStateTarget":{"attributes":{},"description":"The target of a pivot table field collapse state.","properties":{"FieldDataPathValues":"The data path of the pivot table\'s header. Used to set the collapse state.","FieldId":"The field ID of the pivot table that the collapse state needs to be set to."}},"AWS::QuickSight::Template.PivotTableFieldOption":{"attributes":{},"description":"The selected field options for the pivot table field options.","properties":{"CustomLabel":"The custom label of the pivot table field.","FieldId":"The field ID of the pivot table field.","Visibility":"The visibility of the pivot table field."}},"AWS::QuickSight::Template.PivotTableFieldOptions":{"attributes":{},"description":"The field options for a pivot table visual.","properties":{"CollapseStateOptions":"The collapse state options for the pivot table field options.","DataPathOptions":"The data path options for the pivot table field options.","SelectedFieldOptions":"The selected field options for the pivot table field options."}},"AWS::QuickSight::Template.PivotTableFieldSubtotalOptions":{"attributes":{},"description":"The optional configuration of subtotals cells.","properties":{"FieldId":"The field ID of the subtotal options."}},"AWS::QuickSight::Template.PivotTableFieldWells":{"attributes":{},"description":"The field wells for a pivot table visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PivotTableAggregatedFieldWells":"The aggregated field well for the pivot table."}},"AWS::QuickSight::Template.PivotTableOptions":{"attributes":{},"description":"The table options for a pivot table visual.","properties":{"CellStyle":"The table cell style of cells.","CollapsedRowDimensionsVisibility":"The visibility setting of a pivot table\'s collapsed row dimension fields. If the value of this structure is `HIDDEN` , all collapsed columns in a pivot table are automatically hidden. The default value is `VISIBLE` .","ColumnHeaderStyle":"The table cell style of the column header.","ColumnNamesVisibility":"The visibility of the column names.","MetricPlacement":"The metric placement (row, column) options.","RowAlternateColorOptions":"The row alternate color options (widget status, row alternate colors).","RowFieldNamesStyle":"The table cell style of row field names.","RowHeaderStyle":"The table cell style of the row headers.","SingleMetricVisibility":"The visibility of the single metric options.","ToggleButtonsVisibility":"Determines the visibility of the pivot table."}},"AWS::QuickSight::Template.PivotTablePaginatedReportOptions":{"attributes":{},"description":"The paginated report options for a pivot table visual.","properties":{"OverflowColumnHeaderVisibility":"The visibility of the repeating header rows on each page.","VerticalOverflowVisibility":"The visibility of the printing table overflow across pages."}},"AWS::QuickSight::Template.PivotTableSortBy":{"attributes":{},"description":"The sort by field for the field sort options.","properties":{"Column":"The column sort (field id, direction) for the pivot table sort by options.","DataPath":"The data path sort (data path value, direction) for the pivot table sort by options.","Field":"The field sort (field id, direction) for the pivot table sort by options."}},"AWS::QuickSight::Template.PivotTableSortConfiguration":{"attributes":{},"description":"The sort configuration for a `PivotTableVisual` .","properties":{"FieldSortOptions":"The field sort options for a pivot table sort configuration."}},"AWS::QuickSight::Template.PivotTableTotalOptions":{"attributes":{},"description":"The total options for a pivot table visual.","properties":{"ColumnSubtotalOptions":"The column subtotal options.","ColumnTotalOptions":"The column total options.","RowSubtotalOptions":"The row subtotal options.","RowTotalOptions":"The row total options."}},"AWS::QuickSight::Template.PivotTableVisual":{"attributes":{},"description":"A pivot table.\\n\\nFor more information, see [Using pivot tables](https://docs.aws.amazon.com/quicksight/latest/user/pivot-table.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ConditionalFormatting":"The conditional formatting for a `PivotTableVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Template.PivotTotalOptions":{"attributes":{},"description":"The optional configuration of totals cells in a `PivotTableVisual` .","properties":{"CustomLabel":"The custom label string for the total cells.","MetricHeaderCellStyle":"The cell styling options for the total of header cells.","Placement":"The placement (start, end) for the total cells.","ScrollStatus":"The scroll status (pinned, scrolled) for the total cells.","TotalCellStyle":"The cell styling options for the total cells.","TotalsVisibility":"The visibility configuration for the total cells.","ValueCellStyle":"The cell styling options for the totals of value cells."}},"AWS::QuickSight::Template.PredefinedHierarchy":{"attributes":{},"description":"The option that determines the hierarchy of the fields that are defined during data preparation. These fields are available to use in any analysis that uses the data source.","properties":{"Columns":"The list of columns that define the predefined hierarchy.","DrillDownFilters":"The option that determines the drill down filters for the predefined hierarchy.","HierarchyId":"The hierarchy ID of the predefined hierarchy."}},"AWS::QuickSight::Template.ProgressBarOptions":{"attributes":{},"description":"The options that determine the presentation of the progress bar of a KPI visual.","properties":{"Visibility":"The visibility of the progress bar."}},"AWS::QuickSight::Template.RadarChartAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well configuration of a `RadarChartVisual` .","properties":{"Category":"The aggregated field well categories of a radar chart.","Color":"The color that are assigned to the aggregated field wells of a radar chart.","Values":"The values that are assigned to the aggregated field wells of a radar chart."}},"AWS::QuickSight::Template.RadarChartAreaStyleSettings":{"attributes":{},"description":"The configured style settings of a radar chart.","properties":{"Visibility":"The visibility settings of a radar chart."}},"AWS::QuickSight::Template.RadarChartConfiguration":{"attributes":{},"description":"The configuration of a `RadarChartVisual` .","properties":{"AlternateBandColorsVisibility":"Determines the visibility of the colors of alternatign bands in a radar chart.","AlternateBandEvenColor":"The color of the even-numbered alternate bands of a radar chart.","AlternateBandOddColor":"The color of the odd-numbered alternate bands of a radar chart.","AxesRangeScale":"The axis behavior options of a radar chart.","BaseSeriesSettings":"The base sreies settings of a radar chart.","CategoryAxis":"The category axis of a radar chart.","CategoryLabelOptions":"The category label options of a radar chart.","ColorAxis":"The color axis of a radar chart.","ColorLabelOptions":"The color label options of a radar chart.","FieldWells":"The field well configuration of a `RadarChartVisual` .","Legend":"The legend display setup of the visual.","Shape":"The shape of the radar chart.","SortConfiguration":"The sort configuration of a `RadarChartVisual` .","StartAngle":"The start angle of a radar chart\'s axis.","VisualPalette":"The palette (chart color) display setup of the visual."}},"AWS::QuickSight::Template.RadarChartFieldWells":{"attributes":{},"description":"The field wells of a radar chart visual.","properties":{"RadarChartAggregatedFieldWells":"The aggregated field wells of a radar chart visual."}},"AWS::QuickSight::Template.RadarChartSeriesSettings":{"attributes":{},"description":"The series settings of a radar chart.","properties":{"AreaStyleSettings":"The area style settings of a radar chart."}},"AWS::QuickSight::Template.RadarChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a `RadarChartVisual` .","properties":{"CategoryItemsLimit":"The category items limit for a radar chart.","CategorySort":"The category sort options of a radar chart.","ColorItemsLimit":"The color items limit of a radar chart.","ColorSort":"The color sort configuration of a radar chart."}},"AWS::QuickSight::Template.RadarChartVisual":{"attributes":{},"description":"A radar chart visual.","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.RangeEndsLabelType":{"attributes":{},"description":"The range ends label type of a data path label.","properties":{"Visibility":"The visibility of the range ends label."}},"AWS::QuickSight::Template.ReferenceLine":{"attributes":{},"description":"The reference line visual display options.","properties":{"DataConfiguration":"The data configuration of the reference line.","LabelConfiguration":"The label configuration of the reference line.","Status":"The status of the reference line. Choose one of the following options:\\n\\n- `ENABLE`\\n- `DISABLE`","StyleConfiguration":"The style configuration of the reference line."}},"AWS::QuickSight::Template.ReferenceLineCustomLabelConfiguration":{"attributes":{},"description":"The configuration for a custom label on a `ReferenceLine` .","properties":{"CustomLabel":"The string text of the custom label."}},"AWS::QuickSight::Template.ReferenceLineDataConfiguration":{"attributes":{},"description":"The data configuration of the reference line.","properties":{"AxisBinding":"The axis binding type of the reference line. Choose one of the following options:\\n\\n- PrimaryY\\n- SecondaryY","DynamicConfiguration":"The dynamic configuration of the reference line data configuration.","StaticConfiguration":"The static data configuration of the reference line data configuration."}},"AWS::QuickSight::Template.ReferenceLineDynamicDataConfiguration":{"attributes":{},"description":"The dynamic configuration of the reference line data configuration.","properties":{"Calculation":"The calculation that is used in the dynamic data.","Column":"The column that the dynamic data targets.","MeasureAggregationFunction":"The aggregation function that is used in the dynamic data."}},"AWS::QuickSight::Template.ReferenceLineLabelConfiguration":{"attributes":{},"description":"The label configuration of a reference line.","properties":{"CustomLabelConfiguration":"The custom label configuration of the label in a reference line.","FontColor":"The font color configuration of the label in a reference line.","FontConfiguration":"The font configuration of the label in a reference line.","HorizontalPosition":"The horizontal position configuration of the label in a reference line. Choose one of the following options:\\n\\n- `LEFT`\\n- `CENTER`\\n- `RIGHT`","ValueLabelConfiguration":"The value label configuration of the label in a reference line.","VerticalPosition":"The vertical position configuration of the label in a reference line. Choose one of the following options:\\n\\n- `ABOVE`\\n- `BELOW`"}},"AWS::QuickSight::Template.ReferenceLineStaticDataConfiguration":{"attributes":{},"description":"The static data configuration of the reference line data configuration.","properties":{"Value":"The double input of the static data."}},"AWS::QuickSight::Template.ReferenceLineStyleConfiguration":{"attributes":{},"description":"The style configuration of the reference line.","properties":{"Color":"The hex color of the reference line.","Pattern":"The pattern type of the line style. Choose one of the following options:\\n\\n- `SOLID`\\n- `DASHED`\\n- `DOTTED`"}},"AWS::QuickSight::Template.ReferenceLineValueLabelConfiguration":{"attributes":{},"description":"The value label configuration of the label in a reference line.","properties":{"FormatConfiguration":"The format configuration of the value label.","RelativePosition":"The relative position of the value label. Choose one of the following options:\\n\\n- `BEFORE_CUSTOM_LABEL`\\n- `AFTER_CUSTOM_LABEL`"}},"AWS::QuickSight::Template.RelativeDateTimeControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"DateTimeFormat":"Customize how dates are formatted in controls.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Template.RelativeDatesFilter":{"attributes":{},"description":"A `RelativeDatesFilter` filters relative dates values.","properties":{"AnchorDateConfiguration":"The date configuration of the filter.","Column":"The column that the filter is applied to.","ExcludePeriodConfiguration":"The configuration for the exclude period of the filter.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","MinimumGranularity":"The minimum granularity (period granularity) of the relative dates filter.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","ParameterName":"The parameter whose value should be used for the filter value.","RelativeDateType":"The range date type of the filter. Choose one of the options below:\\n\\n- `PREVIOUS`\\n- `THIS`\\n- `LAST`\\n- `NOW`\\n- `NEXT`","RelativeDateValue":"The date value of the filter.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Template.ResourcePermission":{"attributes":{},"description":"Permission for the resource.","properties":{"Actions":"The IAM action to grant or revoke permissions on.","Principal":"The Amazon Resource Name (ARN) of the principal. This can be one of the following:\\n\\n- The ARN of an Amazon QuickSight user or group associated with a data source or dataset. (This is common.)\\n- The ARN of an Amazon QuickSight user, group, or namespace associated with an analysis, dashboard, template, or theme. (This is common.)\\n- The ARN of an AWS account root: This is an IAM ARN rather than a Amazon QuickSight ARN. Use this option only to share resources (templates) across AWS accounts . (This is less common.)","Resource":""}},"AWS::QuickSight::Template.RollingDateConfiguration":{"attributes":{},"description":"The rolling date configuration of a date time filter.","properties":{"DataSetIdentifier":"The data set that is used in the rolling date configuration.","Expression":"The expression of the rolling date configuration."}},"AWS::QuickSight::Template.RowAlternateColorOptions":{"attributes":{},"description":"Determines the row alternate color options.","properties":{"RowAlternateColors":"Determines the list of row alternate colors.","Status":"Determines the widget status."}},"AWS::QuickSight::Template.SameSheetTargetVisualConfiguration":{"attributes":{},"description":"The configuration of the same-sheet target visuals that you want to be filtered.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"TargetVisualOptions":"The options that choose the target visual in the same sheet.\\n\\nValid values are defined as follows:\\n\\n- `ALL_VISUALS` : Applies the filter operation to all visuals in the same sheet.","TargetVisuals":"A list of the target visual IDs that are located in the same sheet of the analysis."}},"AWS::QuickSight::Template.SankeyDiagramAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a sankey diagram.","properties":{"Destination":"The destination field wells of a sankey diagram.","Source":"The source field wells of a sankey diagram.","Weight":"The weight field wells of a sankey diagram."}},"AWS::QuickSight::Template.SankeyDiagramChartConfiguration":{"attributes":{},"description":"The configuration of a sankey diagram.","properties":{"DataLabels":"The data label configuration of a sankey diagram.","FieldWells":"The field well configuration of a sankey diagram.","SortConfiguration":"The sort configuration of a sankey diagram."}},"AWS::QuickSight::Template.SankeyDiagramFieldWells":{"attributes":{},"description":"The field well configuration of a sankey diagram.","properties":{"SankeyDiagramAggregatedFieldWells":"The field well configuration of a sankey diagram."}},"AWS::QuickSight::Template.SankeyDiagramSortConfiguration":{"attributes":{},"description":"The sort configuration of a sankey diagram.","properties":{"DestinationItemsLimit":"The limit on the number of destination nodes that are displayed in a sankey diagram.","SourceItemsLimit":"The limit on the number of source nodes that are displayed in a sankey diagram.","WeightSort":"The sort configuration of the weight fields."}},"AWS::QuickSight::Template.SankeyDiagramVisual":{"attributes":{},"description":"A sankey diagram.\\n\\nFor more information, see [Using Sankey diagrams](https://docs.aws.amazon.com/quicksight/latest/user/sankey-diagram.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration of a sankey diagram.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.ScatterPlotCategoricallyAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well of a scatter plot.","properties":{"Category":"The category field well of a scatter plot.","Label":"The label field well of a scatter plot.","Size":"The size field well of a scatter plot.","XAxis":"The x-axis field well of a scatter plot.\\n\\nThe x-axis is aggregated by category.","YAxis":"The y-axis field well of a scatter plot.\\n\\nThe y-axis is aggregated by category."}},"AWS::QuickSight::Template.ScatterPlotConfiguration":{"attributes":{},"description":"The configuration of a scatter plot.","properties":{"DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","Legend":"The legend display setup of the visual.","Tooltip":"The legend display setup of the visual.","VisualPalette":"The palette (chart color) display setup of the visual.","XAxisDisplayOptions":"The label display options (grid line, range, scale, and axis step) of the scatter plot\'s x-axis.","XAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of the scatter plot\'s x-axis.","YAxisDisplayOptions":"The label display options (grid line, range, scale, and axis step) of the scatter plot\'s y-axis.","YAxisLabelOptions":"The label options (label text, label visibility, and sort icon visibility) of the scatter plot\'s y-axis."}},"AWS::QuickSight::Template.ScatterPlotFieldWells":{"attributes":{},"description":"The field well configuration of a scatter plot.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"ScatterPlotCategoricallyAggregatedFieldWells":"The aggregated field wells of a scatter plot. The x and y-axes of scatter plots with aggregated field wells are aggregated by category, label, or both.","ScatterPlotUnaggregatedFieldWells":"The unaggregated field wells of a scatter plot. The x and y-axes of these scatter plots are unaggregated."}},"AWS::QuickSight::Template.ScatterPlotUnaggregatedFieldWells":{"attributes":{},"description":"The unaggregated field wells of a scatter plot.","properties":{"Category":"The category field well of a scatter plot.","Label":"The label field well of a scatter plot.","Size":"The size field well of a scatter plot.","XAxis":"The x-axis field well of a scatter plot.\\n\\nThe x-axis is a dimension field and cannot be aggregated.","YAxis":"The y-axis field well of a scatter plot.\\n\\nThe y-axis is a dimension field and cannot be aggregated."}},"AWS::QuickSight::Template.ScatterPlotVisual":{"attributes":{},"description":"A scatter plot.\\n\\nFor more information, see [Using scatter plots](https://docs.aws.amazon.com/quicksight/latest/user/scatter-plot.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.ScrollBarOptions":{"attributes":{},"description":"The visual display options for a data zoom scroll bar.","properties":{"Visibility":"The visibility of the data zoom scroll bar.","VisibleRange":"The visibility range for the data zoom scroll bar."}},"AWS::QuickSight::Template.SecondaryValueOptions":{"attributes":{},"description":"The options that determine the presentation of the secondary value of a KPI visual.","properties":{"Visibility":"Determines the visibility of the secondary value."}},"AWS::QuickSight::Template.SectionAfterPageBreak":{"attributes":{},"description":"The configuration of a page break after a section.","properties":{"Status":"The option that enables or disables a page break at the end of a section."}},"AWS::QuickSight::Template.SectionBasedLayoutCanvasSizeOptions":{"attributes":{},"description":"The options for the canvas of a section-based layout.","properties":{"PaperCanvasSizeOptions":"The options for a paper canvas of a section-based layout."}},"AWS::QuickSight::Template.SectionBasedLayoutConfiguration":{"attributes":{},"description":"The configuration for a section-based layout.","properties":{"BodySections":"A list of body section configurations.","CanvasSizeOptions":"The options for the canvas of a section-based layout.","FooterSections":"A list of footer section configurations.","HeaderSections":"A list of header section configurations."}},"AWS::QuickSight::Template.SectionBasedLayoutPaperCanvasSizeOptions":{"attributes":{},"description":"The options for a paper canvas of a section-based layout.","properties":{"PaperMargin":"Defines the spacing between the canvas content and the top, bottom, left, and right edges.","PaperOrientation":"The paper orientation that is used to define canvas dimensions. Choose one of the following options:\\n\\n- PORTRAIT\\n- LANDSCAPE","PaperSize":"The paper size that is used to define canvas dimensions."}},"AWS::QuickSight::Template.SectionLayoutConfiguration":{"attributes":{},"description":"The layout configuration of a section.","properties":{"FreeFormLayout":"The free-form layout configuration of a section."}},"AWS::QuickSight::Template.SectionPageBreakConfiguration":{"attributes":{},"description":"The configuration of a page break for a section.","properties":{"After":"The configuration of a page break after a section."}},"AWS::QuickSight::Template.SectionStyle":{"attributes":{},"description":"The options that style a section.","properties":{"Height":"The height of a section.\\n\\nHeights can only be defined for header and footer sections. The default height margin is 0.5 inches.","Padding":"The spacing between section content and its top, bottom, left, and right edges.\\n\\nThere is no padding by default."}},"AWS::QuickSight::Template.SelectedSheetsFilterScopeConfiguration":{"attributes":{},"description":"The configuration for applying a filter to specific sheets or visuals. You can apply this filter to multiple visuals that are on one sheet or to all visuals on a sheet.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"SheetVisualScopingConfigurations":"The sheet ID and visual IDs of the sheet and visuals that the filter is applied to."}},"AWS::QuickSight::Template.SeriesItem":{"attributes":{},"description":"The series item configuration of a line chart.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"DataFieldSeriesItem":"The data field series item configuration of a line chart.","FieldSeriesItem":"The field series item configuration of a line chart."}},"AWS::QuickSight::Template.SetParameterValueConfiguration":{"attributes":{},"description":"The configuration of adding parameters in action.","properties":{"DestinationParameterName":"The destination parameter name of the `SetParameterValueConfiguration` .","Value":""}},"AWS::QuickSight::Template.ShapeConditionalFormat":{"attributes":{},"description":"The shape conditional formatting of a filled map visual.","properties":{"BackgroundColor":"The conditional formatting for the shape background color of a filled map visual."}},"AWS::QuickSight::Template.Sheet":{"attributes":{},"description":"A *sheet* , which is an object that contains a set of visuals that are viewed together on one page in Amazon QuickSight. Every analysis and dashboard contains at least one sheet. Each sheet contains at least one visualization widget, for example a chart, pivot table, or narrative insight. Sheets can be associated with other components, such as controls, filters, and so on.","properties":{"Name":"The name of a sheet. This name is displayed on the sheet\'s tab in the Amazon QuickSight console.","SheetId":"The unique identifier associated with a sheet."}},"AWS::QuickSight::Template.SheetControlLayout":{"attributes":{},"description":"A grid layout to define the placement of sheet control.","properties":{"Configuration":"The configuration that determines the elements and canvas size options of sheet control."}},"AWS::QuickSight::Template.SheetControlLayoutConfiguration":{"attributes":{},"description":"The configuration that determines the elements and canvas size options of sheet control.","properties":{"GridLayout":"The configuration that determines the elements and canvas size options of sheet control."}},"AWS::QuickSight::Template.SheetDefinition":{"attributes":{},"description":"A sheet is an object that contains a set of visuals that are viewed together on one page in a paginated report. Every analysis and dashboard must contain at least one sheet.","properties":{"ContentType":"The layout content type of the sheet. Choose one of the following options:\\n\\n- `PAGINATED` : Creates a sheet for a paginated report.\\n- `INTERACTIVE` : Creates a sheet for an interactive dashboard.","Description":"A description of the sheet.","FilterControls":"The list of filter controls that are on a sheet.\\n\\nFor more information, see [Adding filter controls to analysis sheets](https://docs.aws.amazon.com/quicksight/latest/user/filter-controls.html) in the *Amazon QuickSight User Guide* .","Layouts":"Layouts define how the components of a sheet are arranged.\\n\\nFor more information, see [Types of layout](https://docs.aws.amazon.com/quicksight/latest/user/types-of-layout.html) in the *Amazon QuickSight User Guide* .","Name":"The name of the sheet. This name is displayed on the sheet\'s tab in the Amazon QuickSight console.","ParameterControls":"The list of parameter controls that are on a sheet.\\n\\nFor more information, see [Using a Control with a Parameter in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/parameters-controls.html) in the *Amazon QuickSight User Guide* .","SheetControlLayouts":"The control layouts of the sheet.","SheetId":"The unique identifier of a sheet.","TextBoxes":"The text boxes that are on a sheet.","Title":"The title of the sheet.","Visuals":"A list of the visuals that are on a sheet. Visual placement is determined by the layout of the sheet."}},"AWS::QuickSight::Template.SheetElementConfigurationOverrides":{"attributes":{},"description":"The override configuration of the rendering rules of a sheet.","properties":{"Visibility":"Determines whether or not the overrides are visible. Choose one of the following options:\\n\\n- `VISIBLE`\\n- `HIDDEN`"}},"AWS::QuickSight::Template.SheetElementRenderingRule":{"attributes":{},"description":"The rendering rules of a sheet that uses a free-form layout.","properties":{"ConfigurationOverrides":"The override configuration of the rendering rules of a sheet.","Expression":"The expression of the rendering rules of a sheet."}},"AWS::QuickSight::Template.SheetTextBox":{"attributes":{},"description":"A text box.","properties":{"Content":"The content that is displayed in the text box.","SheetTextBoxId":"The unique identifier for a text box. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have text boxes that share identifiers."}},"AWS::QuickSight::Template.SheetVisualScopingConfiguration":{"attributes":{},"description":"The filter that is applied to the options.","properties":{"Scope":"The scope of the applied entities. Choose one of the following options:\\n\\n- `ALL_VISUALS`\\n- `SELECTED_VISUALS`","SheetId":"The selected sheet that the filter is applied to.","VisualIds":"The selected visuals that the filter is applied to."}},"AWS::QuickSight::Template.ShortFormatText":{"attributes":{},"description":"The text format for the title.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"PlainText":"Plain text format.","RichText":"Rich text. Examples of rich text include bold, underline, and italics."}},"AWS::QuickSight::Template.SimpleClusterMarker":{"attributes":{},"description":"The simple cluster marker of the cluster marker.","properties":{"Color":"The color of the simple cluster marker."}},"AWS::QuickSight::Template.SliderControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Template.SmallMultiplesOptions":{"attributes":{},"description":"Options that determine the layout and display options of a chart\'s small multiples.","properties":{"MaxVisibleColumns":"Sets the maximum number of visible columns to display in the grid of small multiples panels.\\n\\nThe default is `Auto` , which automatically adjusts the columns in the grid to fit the overall layout and size of the given chart.","MaxVisibleRows":"Sets the maximum number of visible rows to display in the grid of small multiples panels.\\n\\nThe default value is `Auto` , which automatically adjusts the rows in the grid to fit the overall layout and size of the given chart.","PanelConfiguration":"Configures the display options for each small multiples panel."}},"AWS::QuickSight::Template.Spacing":{"attributes":{},"description":"The configuration of spacing (often a margin or padding).","properties":{"Bottom":"Define the bottom spacing.","Left":"Define the left spacing.","Right":"Define the right spacing.","Top":"Define the top spacing."}},"AWS::QuickSight::Template.StringDefaultValues":{"attributes":{},"description":"The default values of the `StringParameterDeclaration` .","properties":{"DynamicValue":"The dynamic value of the `StringDefaultValues` . Different defaults displayed according to users, groups, and values mapping.","StaticValues":"The static values of the `DecimalDefaultValues` ."}},"AWS::QuickSight::Template.StringFormatConfiguration":{"attributes":{},"description":"Formatting configuration for string fields.","properties":{"NullValueFormatConfiguration":"The options that determine the null value format configuration.","NumericFormatConfiguration":"The formatting configuration for numeric strings."}},"AWS::QuickSight::Template.StringParameterDeclaration":{"attributes":{},"description":"A parameter declaration for the `String` data type.","properties":{"DefaultValues":"The default values of a parameter. If the parameter is a single-value parameter, a maximum of one default value can be provided.","MappedDataSetParameters":"","Name":"The name of the parameter that is being declared.","ParameterValueType":"The value type determines whether the parameter is a single-value or multi-value parameter.","ValueWhenUnset":"The configuration that defines the default value of a `String` parameter when a value has not been set."}},"AWS::QuickSight::Template.StringValueWhenUnsetConfiguration":{"attributes":{},"description":"The configuration that defines the default value of a `String` parameter when a value has not been set.","properties":{"CustomValue":"A custom value that\'s used when the value of a parameter isn\'t set.","ValueWhenUnsetOption":"The built-in options for default values. The value can be one of the following:\\n\\n- `RECOMMENDED` : The recommended value.\\n- `NULL` : The `NULL` value."}},"AWS::QuickSight::Template.SubtotalOptions":{"attributes":{},"description":"The subtotal options.","properties":{"CustomLabel":"The custom label string for the subtotal cells.","FieldLevel":"The field level (all, custom, last) for the subtotal cells.","FieldLevelOptions":"The optional configuration of subtotal cells.","MetricHeaderCellStyle":"The cell styling options for the subtotals of header cells.","TotalCellStyle":"The cell styling options for the subtotal cells.","TotalsVisibility":"The visibility configuration for the subtotal cells.","ValueCellStyle":"The cell styling options for the subtotals of value cells."}},"AWS::QuickSight::Template.TableAggregatedFieldWells":{"attributes":{},"description":"The aggregated field well for the table.","properties":{"GroupBy":"The group by field well for a pivot table. Values are grouped by group by fields.","Values":"The values field well for a pivot table. Values are aggregated based on group by fields."}},"AWS::QuickSight::Template.TableBorderOptions":{"attributes":{},"description":"The border options for a table border.","properties":{"Color":"The color of a table border.","Style":"The style (none, solid) of a table border.","Thickness":"The thickness of a table border."}},"AWS::QuickSight::Template.TableCellConditionalFormatting":{"attributes":{},"description":"The cell conditional formatting option for a table.","properties":{"FieldId":"The field ID of the cell for conditional formatting.","TextFormat":"The text format of the cell for conditional formatting."}},"AWS::QuickSight::Template.TableCellImageSizingConfiguration":{"attributes":{},"description":"The sizing options for the table image configuration.","properties":{"TableCellImageScalingConfiguration":"The cell scaling configuration of the sizing options for the table image configuration."}},"AWS::QuickSight::Template.TableCellStyle":{"attributes":{},"description":"The table cell style for a cell in pivot table or table visual.","properties":{"BackgroundColor":"The background color for the table cells.","Border":"The borders for the table cells.","FontConfiguration":"The font configuration of the table cells.","Height":"The height color for the table cells.","HorizontalTextAlignment":"The horizontal text alignment (left, center, right, auto) for the table cells.","TextWrap":"The text wrap (none, wrap) for the table cells.","VerticalTextAlignment":"The vertical text alignment (top, middle, bottom) for the table cells.","Visibility":"The visibility of the table cells."}},"AWS::QuickSight::Template.TableConditionalFormatting":{"attributes":{},"description":"The conditional formatting for a `PivotTableVisual` .","properties":{"ConditionalFormattingOptions":"Conditional formatting options for a `PivotTableVisual` ."}},"AWS::QuickSight::Template.TableConditionalFormattingOption":{"attributes":{},"description":"Conditional formatting options for a `PivotTableVisual` .","properties":{"Cell":"The cell conditional formatting option for a table.","Row":"The row conditional formatting option for a table."}},"AWS::QuickSight::Template.TableConfiguration":{"attributes":{},"description":"The configuration for a `TableVisual` .","properties":{"FieldOptions":"The field options for a table visual.","FieldWells":"The field wells of the visual.","PaginatedReportOptions":"The paginated report options for a table visual.","SortConfiguration":"The sort configuration for a `TableVisual` .","TableInlineVisualizations":"A collection of inline visualizations to display within a chart.","TableOptions":"The table options for a table visual.","TotalOptions":"The total options for a table visual."}},"AWS::QuickSight::Template.TableFieldCustomIconContent":{"attributes":{},"description":"The custom icon content for the table link content configuration.","properties":{"Icon":"The icon set type (link) of the custom icon content for table URL link content."}},"AWS::QuickSight::Template.TableFieldCustomTextContent":{"attributes":{},"description":"The custom text content (value, font configuration) for the table link content configuration.","properties":{"FontConfiguration":"The font configuration of the custom text content for the table URL link content.","Value":"The string value of the custom text content for the table URL link content."}},"AWS::QuickSight::Template.TableFieldImageConfiguration":{"attributes":{},"description":"The image configuration of a table field URL.","properties":{"SizingOptions":"The sizing options for the table image configuration."}},"AWS::QuickSight::Template.TableFieldLinkConfiguration":{"attributes":{},"description":"The link configuration of a table field URL.","properties":{"Content":"The URL content (text, icon) for the table link configuration.","Target":"The URL target (new tab, new window, same tab) for the table link configuration."}},"AWS::QuickSight::Template.TableFieldLinkContentConfiguration":{"attributes":{},"description":"The URL content (text, icon) for the table link configuration.","properties":{"CustomIconContent":"The custom icon content for the table link content configuration.","CustomTextContent":"The custom text content (value, font configuration) for the table link content configuration."}},"AWS::QuickSight::Template.TableFieldOption":{"attributes":{},"description":"The options for a table field.","properties":{"CustomLabel":"The custom label for a table field.","FieldId":"The field ID for a table field.","URLStyling":"The URL configuration for a table field.","Visibility":"The visibility of a table field.","Width":"The width for a table field."}},"AWS::QuickSight::Template.TableFieldOptions":{"attributes":{},"description":"The field options for a table visual.","properties":{"Order":"The order of field IDs of the field options for a table visual.","SelectedFieldOptions":"The selected field options for the table field options."}},"AWS::QuickSight::Template.TableFieldURLConfiguration":{"attributes":{},"description":"The URL configuration for a table field.","properties":{"ImageConfiguration":"The image configuration of a table field URL.","LinkConfiguration":"The link configuration of a table field URL."}},"AWS::QuickSight::Template.TableFieldWells":{"attributes":{},"description":"The field wells for a table visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"TableAggregatedFieldWells":"The aggregated field well for the table.","TableUnaggregatedFieldWells":"The unaggregated field well for the table."}},"AWS::QuickSight::Template.TableInlineVisualization":{"attributes":{},"description":"The inline visualization of a specific type to display within a chart.","properties":{"DataBars":"The configuration of the inline visualization of the data bars within a chart."}},"AWS::QuickSight::Template.TableOptions":{"attributes":{},"description":"The table options for a table visual.","properties":{"CellStyle":"The table cell style of table cells.","HeaderStyle":"The table cell style of a table header.","Orientation":"The orientation (vertical, horizontal) for a table.","RowAlternateColorOptions":"The row alternate color options (widget status, row alternate colors) for a table."}},"AWS::QuickSight::Template.TablePaginatedReportOptions":{"attributes":{},"description":"The paginated report options for a table visual.","properties":{"OverflowColumnHeaderVisibility":"The visibility of repeating header rows on each page.","VerticalOverflowVisibility":"The visibility of printing table overflow across pages."}},"AWS::QuickSight::Template.TableRowConditionalFormatting":{"attributes":{},"description":"The conditional formatting of a table row.","properties":{"BackgroundColor":"The conditional formatting color (solid, gradient) of the background for a table row.","TextColor":"The conditional formatting color (solid, gradient) of the text for a table row."}},"AWS::QuickSight::Template.TableSideBorderOptions":{"attributes":{},"description":"The side border options for a table.","properties":{"Bottom":"The table border options of the bottom border.","InnerHorizontal":"The table border options of the inner horizontal border.","InnerVertical":"The table border options of the inner vertical border.","Left":"The table border options of the left border.","Right":"The table border options of the right border.","Top":"The table border options of the top border."}},"AWS::QuickSight::Template.TableSortConfiguration":{"attributes":{},"description":"The sort configuration for a `TableVisual` .","properties":{"PaginationConfiguration":"The pagination configuration (page size, page number) for the table.","RowSort":"The field sort options for rows in the table."}},"AWS::QuickSight::Template.TableUnaggregatedFieldWells":{"attributes":{},"description":"The unaggregated field well for the table.","properties":{"Values":"The values field well for a pivot table. Values are unaggregated for an unaggregated table."}},"AWS::QuickSight::Template.TableVisual":{"attributes":{},"description":"A table visual.\\n\\nFor more information, see [Using tables as visuals](https://docs.aws.amazon.com/quicksight/latest/user/tabular.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ConditionalFormatting":"The conditional formatting for a `PivotTableVisual` .","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Template.TemplateError":{"attributes":{},"description":"List of errors that occurred when the template version creation failed.","properties":{"Message":"Description of the error type.","Type":"Type of error.","ViolatedEntities":"An error path that shows which entities caused the template error."}},"AWS::QuickSight::Template.TemplateSourceAnalysis":{"attributes":{},"description":"The source analysis of the template.","properties":{"Arn":"The Amazon Resource Name (ARN) of the resource.","DataSetReferences":"A structure containing information about the dataset references used as placeholders in the template."}},"AWS::QuickSight::Template.TemplateSourceEntity":{"attributes":{},"description":"The source entity of the template.","properties":{"SourceAnalysis":"The source analysis, if it is based on an analysis.","SourceTemplate":"The source template, if it is based on an template."}},"AWS::QuickSight::Template.TemplateSourceTemplate":{"attributes":{},"description":"The source template of the template.","properties":{"Arn":"The Amazon Resource Name (ARN) of the resource."}},"AWS::QuickSight::Template.TemplateVersion":{"attributes":{},"description":"A version of a template.","properties":{"CreatedTime":"The time that this template version was created.","DataSetConfigurations":"Schema of the dataset identified by the placeholder. Any dashboard created from this template should be bound to new datasets matching the same schema described through this API operation.","Description":"The description of the template.","Errors":"Errors associated with this template version.","Sheets":"A list of the associated sheets with the unique identifier and name of each sheet.","SourceEntityArn":"The Amazon Resource Name (ARN) of an analysis or template that was used to create this template.","Status":"The status that is associated with the template.\\n\\n- `CREATION_IN_PROGRESS`\\n- `CREATION_SUCCESSFUL`\\n- `CREATION_FAILED`\\n- `UPDATE_IN_PROGRESS`\\n- `UPDATE_SUCCESSFUL`\\n- `UPDATE_FAILED`\\n- `DELETED`","ThemeArn":"The ARN of the theme associated with this version of the template.","VersionNumber":"The version number of the template version."}},"AWS::QuickSight::Template.TemplateVersionDefinition":{"attributes":{},"description":"The detailed definition of a template.","properties":{"AnalysisDefaults":"","CalculatedFields":"An array of calculated field definitions for the template.","ColumnConfigurations":"An array of template-level column configurations. Column configurations are used to set default formatting for a column that\'s used throughout a template.","DataSetConfigurations":"An array of dataset configurations. These configurations define the required columns for each dataset used within a template.","FilterGroups":"Filter definitions for a template.\\n\\nFor more information, see [Filtering Data](https://docs.aws.amazon.com/quicksight/latest/user/filtering-visual-data.html) in the *Amazon QuickSight User Guide* .","ParameterDeclarations":"An array of parameter declarations for a template.\\n\\n*Parameters* are named variables that can transfer a value for use by an action or an object.\\n\\nFor more information, see [Parameters in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/parameters-in-quicksight.html) in the *Amazon QuickSight User Guide* .","Sheets":"An array of sheet definitions for a template."}},"AWS::QuickSight::Template.TextAreaControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"PlaceholderOptions":"The configuration of the placeholder options in a text area control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Template.TextConditionalFormat":{"attributes":{},"description":"The conditional formatting for the text.","properties":{"BackgroundColor":"The conditional formatting for the text background color.","Icon":"The conditional formatting for the icon.","TextColor":"The conditional formatting for the text color."}},"AWS::QuickSight::Template.TextControlPlaceholderOptions":{"attributes":{},"description":"The configuration of the placeholder options in a text control.","properties":{"Visibility":"The visibility configuration of the placeholder options in a text control."}},"AWS::QuickSight::Template.TextFieldControlDisplayOptions":{"attributes":{},"description":"The display options of a control.","properties":{"PlaceholderOptions":"The configuration of the placeholder options in a text field control.","TitleOptions":"The options to configure the title visibility, name, and font size."}},"AWS::QuickSight::Template.ThousandSeparatorOptions":{"attributes":{},"description":"The options that determine the thousands separator configuration.","properties":{"Symbol":"Determines the thousands separator symbol.","Visibility":"Determines the visibility of the thousands separator."}},"AWS::QuickSight::Template.TimeBasedForecastProperties":{"attributes":{},"description":"The forecast properties setup of a forecast in the line chart.","properties":{"LowerBoundary":"The lower boundary setup of a forecast computation.","PeriodsBackward":"The periods backward setup of a forecast computation.","PeriodsForward":"The periods forward setup of a forecast computation.","PredictionInterval":"The prediction interval setup of a forecast computation.","Seasonality":"The seasonality setup of a forecast computation. Choose one of the following options:\\n\\n- `NULL` : The input is set to `NULL` .\\n- `NON_NULL` : The input is set to a custom value.","UpperBoundary":"The upper boundary setup of a forecast computation."}},"AWS::QuickSight::Template.TimeEqualityFilter":{"attributes":{},"description":"A `TimeEqualityFilter` filters values that are equal to a given value.","properties":{"Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","ParameterName":"The parameter whose value should be used for the filter value.\\n\\nThis field is mutually exclusive to `Value` .","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values.","Value":"The value of a `TimeEquality` filter.\\n\\nThis field is mutually exclusive to `ParameterName` ."}},"AWS::QuickSight::Template.TimeRangeDrillDownFilter":{"attributes":{},"description":"The time range drill down filter.","properties":{"Column":"The column that the filter is applied to.","RangeMaximum":"The maximum value for the filter value range.","RangeMinimum":"The minimum value for the filter value range.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Template.TimeRangeFilter":{"attributes":{},"description":"A `TimeRangeFilter` filters values that are between two specified values.","properties":{"Column":"The column that the filter is applied to.","ExcludePeriodConfiguration":"The exclude period of the time range filter.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","IncludeMaximum":"Determines whether the maximum value in the filter value range should be included in the filtered results.","IncludeMinimum":"Determines whether the minimum value in the filter value range should be included in the filtered results.","NullOption":"This option determines how null values should be treated when filtering data.\\n\\n- `ALL_VALUES` : Include null values in filtered results.\\n- `NULLS_ONLY` : Only include null values in filtered results.\\n- `NON_NULLS_ONLY` : Exclude null values from filtered results.","RangeMaximumValue":"The maximum value for the filter value range.","RangeMinimumValue":"The minimum value for the filter value range.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Template.TimeRangeFilterValue":{"attributes":{},"description":"The value of a time range filter.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"Parameter":"The parameter type input value.","RollingDate":"The rolling date input value.","StaticValue":"The static input value."}},"AWS::QuickSight::Template.TooltipItem":{"attributes":{},"description":"The tooltip.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"ColumnTooltipItem":"The tooltip item for the columns that are not part of a field well.","FieldTooltipItem":"The tooltip item for the fields."}},"AWS::QuickSight::Template.TooltipOptions":{"attributes":{},"description":"The display options for the visual tooltip.","properties":{"FieldBasedTooltip":"The setup for the detailed tooltip. The tooltip setup is always saved. The display type is decided based on the tooltip type.","SelectedTooltipType":"The selected type for the tooltip. Choose one of the following options:\\n\\n- `BASIC` : A basic tooltip.\\n- `DETAILED` : A detailed tooltip.","TooltipVisibility":"Determines whether or not the tooltip is visible."}},"AWS::QuickSight::Template.TopBottomFilter":{"attributes":{},"description":"A `TopBottomFilter` filters values that are at the top or the bottom.","properties":{"AggregationSortConfigurations":"The aggregation and sort configuration of the top bottom filter.","Column":"The column that the filter is applied to.","FilterId":"An identifier that uniquely identifies a filter within a dashboard, analysis, or template.","Limit":"The number of items to include in the top bottom filter results.","ParameterName":"The parameter whose value should be used for the filter value.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Template.TopBottomMoversComputation":{"attributes":{},"description":"The top movers and bottom movers computation setup.","properties":{"Category":"The category field that is used in a computation.","ComputationId":"The ID for a computation.","MoverSize":"The mover size setup of the top and bottom movers computation.","Name":"The name of a computation.","SortOrder":"The sort order setup of the top and bottom movers computation.","Time":"The time field that is used in a computation.","Type":"The computation type. Choose from the following options:\\n\\n- TOP: Top movers computation.\\n- BOTTOM: Bottom movers computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Template.TopBottomRankedComputation":{"attributes":{},"description":"The top ranked and bottom ranked computation configuration.","properties":{"Category":"The category field that is used in a computation.","ComputationId":"The ID for a computation.","Name":"The name of a computation.","ResultSize":"The result size of a top and bottom ranked computation.","Type":"The computation type. Choose one of the following options:\\n\\n- TOP: A top ranked computation.\\n- BOTTOM: A bottom ranked computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Template.TotalAggregationComputation":{"attributes":{},"description":"The total aggregation computation configuration.","properties":{"ComputationId":"The ID for a computation.","Name":"The name of a computation.","Value":"The value field that is used in a computation."}},"AWS::QuickSight::Template.TotalOptions":{"attributes":{},"description":"The total options for a table visual.","properties":{"CustomLabel":"The custom label string for the total cells.","Placement":"The placement (start, end) for the total cells.","ScrollStatus":"The scroll status (pinned, scrolled) for the total cells.","TotalCellStyle":"Cell styling options for the total cells.","TotalsVisibility":"The visibility configuration for the total cells."}},"AWS::QuickSight::Template.TreeMapAggregatedFieldWells":{"attributes":{},"description":"Aggregated field wells of a tree map.","properties":{"Colors":"The color field well of a tree map. Values are grouped by aggregations based on group by fields.","Groups":"The group by field well of a tree map. Values are grouped based on group by fields.","Sizes":"The size field well of a tree map. Values are aggregated based on group by fields."}},"AWS::QuickSight::Template.TreeMapConfiguration":{"attributes":{},"description":"The configuration of a tree map.","properties":{"ColorLabelOptions":"The label options (label text, label visibility) for the colors displayed in a tree map.","ColorScale":"The color options (gradient color, point of divergence) of a tree map.","DataLabels":"The options that determine if visual data labels are displayed.","FieldWells":"The field wells of the visual.","GroupLabelOptions":"The label options (label text, label visibility) of the groups that are displayed in a tree map.","Legend":"The legend display setup of the visual.","SizeLabelOptions":"The label options (label text, label visibility) of the sizes that are displayed in a tree map.","SortConfiguration":"The sort configuration of a tree map.","Tooltip":"The tooltip display setup of the visual."}},"AWS::QuickSight::Template.TreeMapFieldWells":{"attributes":{},"description":"The field wells of a tree map.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"TreeMapAggregatedFieldWells":"The aggregated field wells of a tree map."}},"AWS::QuickSight::Template.TreeMapSortConfiguration":{"attributes":{},"description":"The sort configuration of a tree map.","properties":{"TreeMapGroupItemsLimitConfiguration":"The limit on the number of groups that are displayed.","TreeMapSort":"The sort configuration of group by fields."}},"AWS::QuickSight::Template.TreeMapVisual":{"attributes":{},"description":"A tree map.\\n\\nFor more information, see [Using tree maps](https://docs.aws.amazon.com/quicksight/latest/user/tree-map.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Template.TrendArrowOptions":{"attributes":{},"description":"The options that determine the presentation of trend arrows in a KPI visual.","properties":{"Visibility":"The visibility of the trend arrows."}},"AWS::QuickSight::Template.UnaggregatedField":{"attributes":{},"description":"The unaggregated field for a table.","properties":{"Column":"The column that is used in the `UnaggregatedField` .","FieldId":"The custom field ID.","FormatConfiguration":"The format configuration of the field."}},"AWS::QuickSight::Template.UniqueValuesComputation":{"attributes":{},"description":"The unique values computation configuration.","properties":{"Category":"The category field that is used in a computation.","ComputationId":"The ID for a computation.","Name":"The name of a computation."}},"AWS::QuickSight::Template.VisibleRangeOptions":{"attributes":{},"description":"The range options for the data zoom scroll bar.","properties":{"PercentRange":"The percent range in the visible range."}},"AWS::QuickSight::Template.Visual":{"attributes":{},"description":"A visual displayed on a sheet in an analysis, dashboard, or template.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"BarChartVisual":"A bar chart.\\n\\nFor more information, see [Using bar charts](https://docs.aws.amazon.com/quicksight/latest/user/bar-charts.html) in the *Amazon QuickSight User Guide* .","BoxPlotVisual":"A box plot.\\n\\nFor more information, see [Using box plots](https://docs.aws.amazon.com/quicksight/latest/user/box-plots.html) in the *Amazon QuickSight User Guide* .","ComboChartVisual":"A combo chart.\\n\\nFor more information, see [Using combo charts](https://docs.aws.amazon.com/quicksight/latest/user/combo-charts.html) in the *Amazon QuickSight User Guide* .","CustomContentVisual":"A visual that contains custom content.\\n\\nFor more information, see [Using custom visual content](https://docs.aws.amazon.com/quicksight/latest/user/custom-visual-content.html) in the *Amazon QuickSight User Guide* .","EmptyVisual":"An empty visual.","FilledMapVisual":"A filled map.\\n\\nFor more information, see [Creating filled maps](https://docs.aws.amazon.com/quicksight/latest/user/filled-maps.html) in the *Amazon QuickSight User Guide* .","FunnelChartVisual":"A funnel chart.\\n\\nFor more information, see [Using funnel charts](https://docs.aws.amazon.com/quicksight/latest/user/funnel-visual-content.html) in the *Amazon QuickSight User Guide* .","GaugeChartVisual":"A gauge chart.\\n\\nFor more information, see [Using gauge charts](https://docs.aws.amazon.com/quicksight/latest/user/gauge-chart.html) in the *Amazon QuickSight User Guide* .","GeospatialMapVisual":"A geospatial map or a points on map visual.\\n\\nFor more information, see [Creating point maps](https://docs.aws.amazon.com/quicksight/latest/user/point-maps.html) in the *Amazon QuickSight User Guide* .","HeatMapVisual":"A heat map.\\n\\nFor more information, see [Using heat maps](https://docs.aws.amazon.com/quicksight/latest/user/heat-map.html) in the *Amazon QuickSight User Guide* .","HistogramVisual":"A histogram.\\n\\nFor more information, see [Using histograms](https://docs.aws.amazon.com/quicksight/latest/user/histogram-charts.html) in the *Amazon QuickSight User Guide* .","InsightVisual":"An insight visual.\\n\\nFor more information, see [Working with insights](https://docs.aws.amazon.com/quicksight/latest/user/computational-insights.html) in the *Amazon QuickSight User Guide* .","KPIVisual":"A key performance indicator (KPI).\\n\\nFor more information, see [Using KPIs](https://docs.aws.amazon.com/quicksight/latest/user/kpi.html) in the *Amazon QuickSight User Guide* .","LineChartVisual":"A line chart.\\n\\nFor more information, see [Using line charts](https://docs.aws.amazon.com/quicksight/latest/user/line-charts.html) in the *Amazon QuickSight User Guide* .","PieChartVisual":"A pie or donut chart.\\n\\nFor more information, see [Using pie charts](https://docs.aws.amazon.com/quicksight/latest/user/pie-chart.html) in the *Amazon QuickSight User Guide* .","PivotTableVisual":"A pivot table.\\n\\nFor more information, see [Using pivot tables](https://docs.aws.amazon.com/quicksight/latest/user/pivot-table.html) in the *Amazon QuickSight User Guide* .","RadarChartVisual":"A radar chart visual.\\n\\nFor more information, see [Using radar charts](https://docs.aws.amazon.com/quicksight/latest/user/radar-chart.html) in the *Amazon QuickSight User Guide* .","SankeyDiagramVisual":"A sankey diagram.\\n\\nFor more information, see [Using Sankey diagrams](https://docs.aws.amazon.com/quicksight/latest/user/sankey-diagram.html) in the *Amazon QuickSight User Guide* .","ScatterPlotVisual":"A scatter plot.\\n\\nFor more information, see [Using scatter plots](https://docs.aws.amazon.com/quicksight/latest/user/scatter-plot.html) in the *Amazon QuickSight User Guide* .","TableVisual":"A table visual.\\n\\nFor more information, see [Using tables as visuals](https://docs.aws.amazon.com/quicksight/latest/user/tabular.html) in the *Amazon QuickSight User Guide* .","TreeMapVisual":"A tree map.\\n\\nFor more information, see [Using tree maps](https://docs.aws.amazon.com/quicksight/latest/user/tree-map.html) in the *Amazon QuickSight User Guide* .","WaterfallVisual":"A waterfall chart.\\n\\nFor more information, see [Using waterfall charts](https://docs.aws.amazon.com/quicksight/latest/user/waterfall-chart.html) in the *Amazon QuickSight User Guide* .","WordCloudVisual":"A word cloud.\\n\\nFor more information, see [Using word clouds](https://docs.aws.amazon.com/quicksight/latest/user/word-cloud.html) in the *Amazon QuickSight User Guide* ."}},"AWS::QuickSight::Template.VisualCustomAction":{"attributes":{},"description":"A custom action defined on a visual.","properties":{"ActionOperations":"A list of `VisualCustomActionOperations` .\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","CustomActionId":"The ID of the `VisualCustomAction` .","Name":"The name of the `VisualCustomAction` .","Status":"The status of the `VisualCustomAction` .","Trigger":"The trigger of the `VisualCustomAction` .\\n\\nValid values are defined as follows:\\n\\n- `DATA_POINT_CLICK` : Initiates a custom action by a left pointer click on a data point.\\n- `DATA_POINT_MENU` : Initiates a custom action by right pointer click from the menu."}},"AWS::QuickSight::Template.VisualCustomActionOperation":{"attributes":{},"description":"The operation that is defined by the custom action.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"FilterOperation":"The filter operation that filters data included in a visual or in an entire sheet.","NavigationOperation":"The navigation operation that navigates between different sheets in the same analysis.","SetParametersOperation":"The set parameter operation that sets parameters in custom action.","URLOperation":"The URL operation that opens a link to another webpage."}},"AWS::QuickSight::Template.VisualPalette":{"attributes":{},"description":"The visual display options for the visual palette.","properties":{"ChartColor":"The chart color options for the visual palette.","ColorMap":"The color map options for the visual palette."}},"AWS::QuickSight::Template.VisualSubtitleLabelOptions":{"attributes":{},"description":"The subtitle label options for a visual.","properties":{"FormatText":"The long text format of the subtitle label, such as plain text or rich text.","Visibility":"The visibility of the subtitle label."}},"AWS::QuickSight::Template.VisualTitleLabelOptions":{"attributes":{},"description":"The title label options for a visual.","properties":{"FormatText":"The short text format of the title label, such as plain text or rich text.","Visibility":"The visibility of the title label."}},"AWS::QuickSight::Template.WaterfallChartAggregatedFieldWells":{"attributes":{},"description":"The field well configuration of a waterfall visual.","properties":{"Breakdowns":"The breakdown field wells of a waterfall visual.","Categories":"The category field wells of a waterfall visual.","Values":"The value field wells of a waterfall visual."}},"AWS::QuickSight::Template.WaterfallChartConfiguration":{"attributes":{},"description":"The configuration for a waterfall visual.","properties":{"CategoryAxisDisplayOptions":"The options that determine the presentation of the category axis.","CategoryAxisLabelOptions":"The options that determine the presentation of the category axis label.","DataLabels":"The data label configuration of a waterfall visual.","FieldWells":"The field well configuration of a waterfall visual.","Legend":"The legend configuration of a waterfall visual.","PrimaryYAxisDisplayOptions":"The options that determine the presentation of the y-axis.","PrimaryYAxisLabelOptions":"The options that determine the presentation of the y-axis label.","SortConfiguration":"The sort configuration of a waterfall visual.","VisualPalette":"The visual palette configuration of a waterfall visual.","WaterfallChartOptions":"The options that determine the presentation of a waterfall visual."}},"AWS::QuickSight::Template.WaterfallChartFieldWells":{"attributes":{},"description":"The field well configuration of a waterfall visual.","properties":{"WaterfallChartAggregatedFieldWells":"The field well configuration of a waterfall visual."}},"AWS::QuickSight::Template.WaterfallChartOptions":{"attributes":{},"description":"The options that determine the presentation of a waterfall visual.","properties":{"TotalBarLabel":"This option determines the total bar label of a waterfall visual."}},"AWS::QuickSight::Template.WaterfallChartSortConfiguration":{"attributes":{},"description":"The sort configuration of a waterfall visual.","properties":{"BreakdownItemsLimit":"The limit on the number of bar groups that are displayed.","CategorySort":"The sort configuration of the category fields."}},"AWS::QuickSight::Template.WaterfallVisual":{"attributes":{},"description":"A waterfall chart.\\n\\nFor more information, see [Using waterfall charts](https://docs.aws.amazon.com/quicksight/latest/user/waterfall-chart.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration for a waterfall visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers."}},"AWS::QuickSight::Template.WhatIfPointScenario":{"attributes":{},"description":"Provides the forecast to meet the target for a particular date.","properties":{"Date":"The date that you need the forecast results for.","Value":"The target value that you want to meet for the provided date."}},"AWS::QuickSight::Template.WhatIfRangeScenario":{"attributes":{},"description":"Provides the forecast to meet the target for a particular date range.","properties":{"EndDate":"The end date in the date range that you need the forecast results for.","StartDate":"The start date in the date range that you need the forecast results for.","Value":"The target value that you want to meet for the provided date range."}},"AWS::QuickSight::Template.WordCloudAggregatedFieldWells":{"attributes":{},"description":"The aggregated field wells of a word cloud.","properties":{"GroupBy":"The group by field well of a word cloud. Values are grouped by group by fields.","Size":"The size field well of a word cloud. Values are aggregated based on group by fields."}},"AWS::QuickSight::Template.WordCloudChartConfiguration":{"attributes":{},"description":"The configuration of a word cloud visual.","properties":{"CategoryLabelOptions":"The label options (label text, label visibility, and sort icon visibility) for the word cloud category.","FieldWells":"The field wells of the visual.","SortConfiguration":"The sort configuration of a word cloud visual.","WordCloudOptions":"The options for a word cloud visual."}},"AWS::QuickSight::Template.WordCloudFieldWells":{"attributes":{},"description":"The field wells of a word cloud visual.\\n\\nThis is a union type structure. For this structure to be valid, only one of the attributes can be defined.","properties":{"WordCloudAggregatedFieldWells":"The aggregated field wells of a word cloud."}},"AWS::QuickSight::Template.WordCloudOptions":{"attributes":{},"description":"The word cloud options for a word cloud visual.","properties":{"CloudLayout":"The cloud layout options (fluid, normal) of a word cloud.","MaximumStringLength":"The length limit of each word from 1-100.","WordCasing":"The word casing options (lower_case, existing_case) for the words in a word cloud.","WordOrientation":"The word orientation options (horizontal, horizontal_and_vertical) for the words in a word cloud.","WordPadding":"The word padding options (none, small, medium, large) for the words in a word cloud.","WordScaling":"The word scaling options (emphasize, normal) for the words in a word cloud."}},"AWS::QuickSight::Template.WordCloudSortConfiguration":{"attributes":{},"description":"The sort configuration of a word cloud visual.","properties":{"CategoryItemsLimit":"The limit on the number of groups that are displayed in a word cloud.","CategorySort":"The sort configuration of group by fields."}},"AWS::QuickSight::Template.WordCloudVisual":{"attributes":{},"description":"A word cloud.\\n\\nFor more information, see [Using word clouds](https://docs.aws.amazon.com/quicksight/latest/user/word-cloud.html) in the *Amazon QuickSight User Guide* .","properties":{"Actions":"The list of custom actions that are configured for a visual.","ChartConfiguration":"The configuration settings of the visual.","ColumnHierarchies":"The column hierarchy that is used during drill-downs and drill-ups.","Subtitle":"The subtitle that is displayed on the visual.","Title":"The title that is displayed on the visual.","VisualId":"The unique identifier of a visual. This identifier must be unique within the context of a dashboard, template, or analysis. Two dashboards, analyses, or templates can have visuals with the same identifiers.."}},"AWS::QuickSight::Theme":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the theme.","CreatedTime":"The time the theme was created.","LastUpdatedTime":"The time the theme was last updated.","Type":"Theme type.","Version":"The version of the theme.","Version.Arn":"","Version.BaseThemeId":"","Version.Configuration":"","Version.Configuration.DataColorPalette":"","Version.Configuration.Sheet":"","Version.Configuration.Typography":"","Version.Configuration.UIColorPalette":"","Version.CreatedTime":"","Version.Description":"","Version.Errors":"","Version.Status":"","Version.VersionNumber":""},"description":"Creates a theme.\\n\\nA *theme* is set of configuration options for color and layout. Themes apply to analyses and dashboards. For more information, see [Using Themes in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/themes-in-quicksight.html) in the *Amazon QuickSight User Guide* .","properties":{"AwsAccountId":"The ID of the AWS account where you want to store the new theme.","BaseThemeId":"The ID of the theme that a custom theme will inherit from. All themes inherit from one of the starting themes defined by Amazon QuickSight. For a list of the starting themes, use `ListThemes` or choose *Themes* from within an analysis.","Configuration":"The theme configuration, which contains the theme display properties.","Name":"A display name for the theme.","Permissions":"A valid grouping of resource permissions to apply to the new theme.","Tags":"A map of the key-value pairs for the resource tag or tags that you want to add to the resource.","ThemeId":"An ID for the theme that you want to create. The theme ID is unique per AWS Region in each AWS account.","VersionDescription":"A description of the first version of the theme that you\'re creating. Every time `UpdateTheme` is called, a new version is created. Each version of the theme has a description of the version in the `VersionDescription` field."}},"AWS::QuickSight::Theme.BorderStyle":{"attributes":{},"description":"The display options for tile borders for visuals.","properties":{"Show":"The option to enable display of borders for visuals."}},"AWS::QuickSight::Theme.DataColorPalette":{"attributes":{},"description":"The theme colors that are used for data colors in charts. The colors description is a hexadecimal color code that consists of six alphanumerical characters, prefixed with `#` , for example #37BFF5.","properties":{"Colors":"The hexadecimal codes for the colors.","EmptyFillColor":"The hexadecimal code of a color that applies to charts where a lack of data is highlighted.","MinMaxGradient":"The minimum and maximum hexadecimal codes that describe a color gradient."}},"AWS::QuickSight::Theme.Font":{"attributes":{},"description":"","properties":{"FontFamily":""}},"AWS::QuickSight::Theme.GutterStyle":{"attributes":{},"description":"The display options for gutter spacing between tiles on a sheet.","properties":{"Show":"This Boolean value controls whether to display a gutter space between sheet tiles."}},"AWS::QuickSight::Theme.MarginStyle":{"attributes":{},"description":"The display options for margins around the outside edge of sheets.","properties":{"Show":"This Boolean value controls whether to display sheet margins."}},"AWS::QuickSight::Theme.ResourcePermission":{"attributes":{},"description":"Permission for the resource.","properties":{"Actions":"The IAM action to grant or revoke permissions on.","Principal":"The Amazon Resource Name (ARN) of the principal. This can be one of the following:\\n\\n- The ARN of an Amazon QuickSight user or group associated with a data source or dataset. (This is common.)\\n- The ARN of an Amazon QuickSight user, group, or namespace associated with an analysis, dashboard, template, or theme. (This is common.)\\n- The ARN of an AWS account root: This is an IAM ARN rather than a Amazon QuickSight ARN. Use this option only to share resources (templates) across AWS accounts . (This is less common.)","Resource":""}},"AWS::QuickSight::Theme.SheetStyle":{"attributes":{},"description":"The theme display options for sheets.","properties":{"Tile":"The display options for tiles.","TileLayout":"The layout options for tiles."}},"AWS::QuickSight::Theme.ThemeConfiguration":{"attributes":{},"description":"The theme configuration. This configuration contains all of the display properties for a theme.","properties":{"DataColorPalette":"Color properties that apply to chart data colors.","Sheet":"Display options related to sheets.","Typography":"","UIColorPalette":"Color properties that apply to the UI and to charts, excluding the colors that apply to data."}},"AWS::QuickSight::Theme.ThemeError":{"attributes":{},"description":"Theme error.","properties":{"Message":"The error message.","Type":"The type of error."}},"AWS::QuickSight::Theme.ThemeVersion":{"attributes":{},"description":"A version of a theme.","properties":{"Arn":"The Amazon Resource Name (ARN) of the resource.","BaseThemeId":"The Amazon QuickSight-defined ID of the theme that a custom theme inherits from. All themes initially inherit from a default Amazon QuickSight theme.","Configuration":"The theme configuration, which contains all the theme display properties.","CreatedTime":"The date and time that this theme version was created.","Description":"The description of the theme.","Errors":"Errors associated with the theme.","Status":"The status of the theme version.","VersionNumber":"The version number of the theme."}},"AWS::QuickSight::Theme.TileLayoutStyle":{"attributes":{},"description":"The display options for the layout of tiles on a sheet.","properties":{"Gutter":"The gutter settings that apply between tiles.","Margin":"The margin settings that apply around the outside edge of sheets."}},"AWS::QuickSight::Theme.TileStyle":{"attributes":{},"description":"Display options related to tiles on a sheet.","properties":{"Border":"The border around a tile."}},"AWS::QuickSight::Theme.Typography":{"attributes":{},"description":"","properties":{"FontFamilies":""}},"AWS::QuickSight::Theme.UIColorPalette":{"attributes":{},"description":"The theme colors that apply to UI and to charts, excluding data colors. The colors description is a hexadecimal color code that consists of six alphanumerical characters, prefixed with `#` , for example #37BFF5. For more information, see [Using Themes in Amazon QuickSight](https://docs.aws.amazon.com/quicksight/latest/user/themes-in-quicksight.html) in the *Amazon QuickSight User Guide.*","properties":{"Accent":"This color is that applies to selected states and buttons.","AccentForeground":"The foreground color that applies to any text or other elements that appear over the accent color.","Danger":"The color that applies to error messages.","DangerForeground":"The foreground color that applies to any text or other elements that appear over the error color.","Dimension":"The color that applies to the names of fields that are identified as dimensions.","DimensionForeground":"The foreground color that applies to any text or other elements that appear over the dimension color.","Measure":"The color that applies to the names of fields that are identified as measures.","MeasureForeground":"The foreground color that applies to any text or other elements that appear over the measure color.","PrimaryBackground":"The background color that applies to visuals and other high emphasis UI.","PrimaryForeground":"The color of text and other foreground elements that appear over the primary background regions, such as grid lines, borders, table banding, icons, and so on.","SecondaryBackground":"The background color that applies to the sheet background and sheet controls.","SecondaryForeground":"The foreground color that applies to any sheet title, sheet control text, or UI that appears over the secondary background.","Success":"The color that applies to success messages, for example the check mark for a successful download.","SuccessForeground":"The foreground color that applies to any text or other elements that appear over the success color.","Warning":"This color that applies to warning and informational messages.","WarningForeground":"The foreground color that applies to any text or other elements that appear over the warning color."}},"AWS::QuickSight::Topic":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the topic.","Ref":""},"description":"Creates a new Q topic.","properties":{"AwsAccountId":"The ID of the AWS account that you want to create a topic in.","DataSets":"The data sets that the topic is associated with.","Description":"The description of the topic.","Name":"The name of the topic.","TopicId":"The ID for the topic. This ID is unique per AWS Region for each AWS account."}},"AWS::QuickSight::Topic.CellValueSynonym":{"attributes":{},"description":"A structure that represents the cell value synonym.","properties":{"CellValue":"The cell value.","Synonyms":"Other names or aliases for the cell value."}},"AWS::QuickSight::Topic.CollectiveConstant":{"attributes":{},"description":"A structure that represents a collective constant.","properties":{"ValueList":"A list of values for the collective constant."}},"AWS::QuickSight::Topic.ComparativeOrder":{"attributes":{},"description":"The order in which data is displayed for the column when it\'s used in a comparative context.","properties":{"SpecifedOrder":"The list of columns to be used in the ordering.","TreatUndefinedSpecifiedValues":"The treat of undefined specified values. Valid values for this structure are `LEAST` and `MOST` .","UseOrdering":"The ordering type for a column. Valid values for this structure are `GREATER_IS_BETTER` , `LESSER_IS_BETTER` and `SPECIFIED` ."}},"AWS::QuickSight::Topic.DataAggregation":{"attributes":{},"description":"The definition of a data aggregation.","properties":{"DatasetRowDateGranularity":"The level of time precision that is used to aggregate `DateTime` values.","DefaultDateColumnName":"The column name for the default date."}},"AWS::QuickSight::Topic.DatasetMetadata":{"attributes":{},"description":"A structure that represents a dataset.","properties":{"CalculatedFields":"The list of calculated field definitions.","Columns":"The list of column definitions.","DataAggregation":"The definition of a data aggregation.","DatasetArn":"The Amazon Resource Name (ARN) of the dataset.","DatasetDescription":"The description of the dataset.","DatasetName":"The name of the dataset.","Filters":"The list of filter definitions.","NamedEntities":"The list of named entities definitions."}},"AWS::QuickSight::Topic.DefaultFormatting":{"attributes":{},"description":"A structure that represents a default formatting definition.","properties":{"DisplayFormat":"The display format. Valid values for this structure are `AUTO` , `PERCENT` , `CURRENCY` , `NUMBER` , `DATE` , and `STRING` .","DisplayFormatOptions":"The additional options for display formatting."}},"AWS::QuickSight::Topic.DisplayFormatOptions":{"attributes":{},"description":"A structure that represents additional options for display formatting.","properties":{"BlankCellFormat":"Determines the blank cell format.","CurrencySymbol":"The currency symbol, such as `USD` .","DateFormat":"Determines the `DateTime` format.","DecimalSeparator":"Determines the decimal separator.","FractionDigits":"Determines the number of fraction digits.","GroupingSeparator":"Determines the grouping separator.","NegativeFormat":"The negative format.","Prefix":"The prefix value for a display format.","Suffix":"The suffix value for a display format.","UnitScaler":"The unit scaler. Valid values for this structure are: `NONE` , `AUTO` , `THOUSANDS` , `MILLIONS` , `BILLIONS` , and `TRILLIONS` .","UseBlankCellFormat":"A Boolean value that indicates whether to use blank cell format.","UseGrouping":"A Boolean value that indicates whether to use grouping."}},"AWS::QuickSight::Topic.NamedEntityDefinition":{"attributes":{},"description":"A structure that represents a named entity.","properties":{"FieldName":"The name of the entity.","Metric":"The definition of a metric.","PropertyName":"The property name to be used for the named entity.","PropertyRole":"The property role. Valid values for this structure are `PRIMARY` and `ID` .","PropertyUsage":"The property usage. Valid values for this structure are `INHERIT` , `DIMENSION` , and `MEASURE` ."}},"AWS::QuickSight::Topic.NamedEntityDefinitionMetric":{"attributes":{},"description":"A structure that represents a metric.","properties":{"Aggregation":"The aggregation of a named entity. Valid values for this structure are `SUM` , `MIN` , `MAX` , `COUNT` , `AVERAGE` , `DISTINCT_COUNT` , `STDEV` , `STDEVP` , `VAR` , `VARP` , `PERCENTILE` , `MEDIAN` , and `CUSTOM` .","AggregationFunctionParameters":"The additional parameters for an aggregation function."}},"AWS::QuickSight::Topic.NegativeFormat":{"attributes":{},"description":"A structure that represents a negative format.","properties":{"Prefix":"The prefix for a negative format.","Suffix":"The suffix for a negative format."}},"AWS::QuickSight::Topic.RangeConstant":{"attributes":{},"description":"The value of the constant that is used to specify the endpoints of a range filter.","properties":{"Maximum":"The maximum value for a range constant.","Minimum":"The minimum value for a range constant."}},"AWS::QuickSight::Topic.SemanticEntityType":{"attributes":{},"description":"A structure that represents a semantic entity type.","properties":{"SubTypeName":"The semantic entity sub type name.","TypeName":"The semantic entity type name.","TypeParameters":"The semantic entity type parameters."}},"AWS::QuickSight::Topic.SemanticType":{"attributes":{},"description":"A structure that represents a semantic type.","properties":{"FalseyCellValue":"The semantic type falsey cell value.","FalseyCellValueSynonyms":"The other names or aliases for the false cell value.","SubTypeName":"The semantic type sub type name.","TruthyCellValue":"The semantic type truthy cell value.","TruthyCellValueSynonyms":"The other names or aliases for the true cell value.","TypeName":"The semantic type name.","TypeParameters":"The semantic type parameters."}},"AWS::QuickSight::Topic.TopicCalculatedField":{"attributes":{},"description":"A structure that represents a calculated field.","properties":{"Aggregation":"The default aggregation. Valid values for this structure are `SUM` , `MAX` , `MIN` , `COUNT` , `DISTINCT_COUNT` , and `AVERAGE` .","AllowedAggregations":"The list of aggregation types that are allowed for the calculated field. Valid values for this structure are `COUNT` , `DISTINCT_COUNT` , `MIN` , `MAX` , `MEDIAN` , `SUM` , `AVERAGE` , `STDEV` , `STDEVP` , `VAR` , `VARP` , and `PERCENTILE` .","CalculatedFieldDescription":"The calculated field description.","CalculatedFieldName":"The calculated field name.","CalculatedFieldSynonyms":"The other names or aliases for the calculated field.","CellValueSynonyms":"The other names or aliases for the calculated field cell value.","ColumnDataRole":"The column data role for a calculated field. Valid values for this structure are `DIMENSION` and `MEASURE` .","ComparativeOrder":"The order in which data is displayed for the calculated field when it\'s used in a comparative context.","DefaultFormatting":"The default formatting definition.","Expression":"The calculated field expression.","IsIncludedInTopic":"A boolean value that indicates if a calculated field is included in the topic.","NeverAggregateInFilter":"A Boolean value that indicates whether to never aggregate calculated field in filters.","NotAllowedAggregations":"The list of aggregation types that are not allowed for the calculated field. Valid values for this structure are `COUNT` , `DISTINCT_COUNT` , `MIN` , `MAX` , `MEDIAN` , `SUM` , `AVERAGE` , `STDEV` , `STDEVP` , `VAR` , `VARP` , and `PERCENTILE` .","SemanticType":"The semantic type.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Topic.TopicCategoryFilter":{"attributes":{},"description":"A structure that represents a category filter.","properties":{"CategoryFilterFunction":"The category filter function. Valid values for this structure are `EXACT` and `CONTAINS` .","CategoryFilterType":"The category filter type. This element is used to specify whether a filter is a simple category filter or an inverse category filter.","Constant":"The constant used in a category filter.","Inverse":"A Boolean value that indicates if the filter is inverse."}},"AWS::QuickSight::Topic.TopicCategoryFilterConstant":{"attributes":{},"description":"A constant used in a category filter.","properties":{"CollectiveConstant":"A collective constant used in a category filter. This element is used to specify a list of values for the constant.","ConstantType":"The type of category filter constant. This element is used to specify whether a constant is a singular or collective. Valid values are `SINGULAR` and `COLLECTIVE` .","SingularConstant":"A singular constant used in a category filter. This element is used to specify a single value for the constant."}},"AWS::QuickSight::Topic.TopicColumn":{"attributes":{},"description":"Represents a column in a dataset.","properties":{"Aggregation":"The type of aggregation that is performed on the column data when it\'s queried. Valid values for this structure are `SUM` , `MAX` , `MIN` , `COUNT` , `DISTINCT_COUNT` , and `AVERAGE` .","AllowedAggregations":"The list of aggregation types that are allowed for the column. Valid values for this structure are `COUNT` , `DISTINCT_COUNT` , `MIN` , `MAX` , `MEDIAN` , `SUM` , `AVERAGE` , `STDEV` , `STDEVP` , `VAR` , `VARP` , and `PERCENTILE` .","CellValueSynonyms":"The other names or aliases for the column cell value.","ColumnDataRole":"The role of the column in the data. Valid values are `DIMENSION` and `MEASURE` .","ColumnDescription":"A description of the column and its contents.","ColumnFriendlyName":"A user-friendly name for the column.","ColumnName":"The name of the column.","ColumnSynonyms":"The other names or aliases for the column.","ComparativeOrder":"The order in which data is displayed for the column when it\'s used in a comparative context.","DefaultFormatting":"The default formatting used for values in the column.","IsIncludedInTopic":"A Boolean value that indicates whether the column is included in the query results.","NeverAggregateInFilter":"A Boolean value that indicates whether to aggregate the column data when it\'s used in a filter context.","NotAllowedAggregations":"The list of aggregation types that are not allowed for the column. Valid values for this structure are `COUNT` , `DISTINCT_COUNT` , `MIN` , `MAX` , `MEDIAN` , `SUM` , `AVERAGE` , `STDEV` , `STDEVP` , `VAR` , `VARP` , and `PERCENTILE` .","SemanticType":"The semantic type of data contained in the column.","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Topic.TopicDateRangeFilter":{"attributes":{},"description":"A filter used to restrict data based on a range of dates or times.","properties":{"Constant":"The constant used in a date range filter.","Inclusive":"A Boolean value that indicates whether the date range filter should include the boundary values. If set to true, the filter includes the start and end dates. If set to false, the filter excludes them."}},"AWS::QuickSight::Topic.TopicFilter":{"attributes":{},"description":"A structure that represents a filter used to select items for a topic.","properties":{"CategoryFilter":"The category filter that is associated with this filter.","DateRangeFilter":"The date range filter.","FilterClass":"The class of the filter. Valid values for this structure are `ENFORCED_VALUE_FILTER` , `CONDITIONAL_VALUE_FILTER` , and `NAMED_VALUE_FILTER` .","FilterDescription":"A description of the filter used to select items for a topic.","FilterName":"The name of the filter.","FilterSynonyms":"The other names or aliases for the filter.","FilterType":"The type of the filter. Valid values for this structure are `CATEGORY_FILTER` , `NUMERIC_EQUALITY_FILTER` , `NUMERIC_RANGE_FILTER` , `DATE_RANGE_FILTER` , and `RELATIVE_DATE_FILTER` .","NumericEqualityFilter":"The numeric equality filter.","NumericRangeFilter":"The numeric range filter.","OperandFieldName":"The name of the field that the filter operates on.","RelativeDateFilter":"The relative date filter."}},"AWS::QuickSight::Topic.TopicNamedEntity":{"attributes":{},"description":"A structure that represents a named entity.","properties":{"Definition":"The definition of a named entity.","EntityDescription":"The description of the named entity.","EntityName":"The name of the named entity.","EntitySynonyms":"The other names or aliases for the named entity.","SemanticEntityType":"The type of named entity that a topic represents."}},"AWS::QuickSight::Topic.TopicNumericEqualityFilter":{"attributes":{},"description":"A filter that filters topics based on the value of a numeric field. The filter includes only topics whose numeric field value matches the specified value.","properties":{"Aggregation":"An aggregation function that specifies how to calculate the value of a numeric field for a topic. Valid values for this structure are `NO_AGGREGATION` , `SUM` , `AVERAGE` , `COUNT` , `DISTINCT_COUNT` , `MAX` , `MEDIAN` , `MIN` , `STDEV` , `STDEVP` , `VAR` , and `VARP` .","Constant":"The constant used in a numeric equality filter."}},"AWS::QuickSight::Topic.TopicNumericRangeFilter":{"attributes":{},"description":"A filter that filters topics based on the value of a numeric field. The filter includes only topics whose numeric field value falls within the specified range.","properties":{"Aggregation":"An aggregation function that specifies how to calculate the value of a numeric field for a topic, Valid values for this structure are `NO_AGGREGATION` , `SUM` , `AVERAGE` , `COUNT` , `DISTINCT_COUNT` , `MAX` , `MEDIAN` , `MIN` , `STDEV` , `STDEVP` , `VAR` , and `VARP` .","Constant":"The constant used in a numeric range filter.","Inclusive":"A Boolean value that indicates whether the endpoints of the numeric range are included in the filter. If set to true, topics whose numeric field value is equal to the endpoint values will be included in the filter. If set to false, topics whose numeric field value is equal to the endpoint values will be excluded from the filter."}},"AWS::QuickSight::Topic.TopicRangeFilterConstant":{"attributes":{},"description":"A constant value that is used in a range filter to specify the endpoints of the range.","properties":{"ConstantType":"The data type of the constant value that is used in a range filter. Valid values for this structure are `RANGE` .","RangeConstant":"The value of the constant that is used to specify the endpoints of a range filter."}},"AWS::QuickSight::Topic.TopicRelativeDateFilter":{"attributes":{},"description":"A structure that represents a relative date filter.","properties":{"Constant":"The constant used in a relative date filter.","RelativeDateFilterFunction":"The function to be used in a relative date filter to determine the range of dates to include in the results. Valid values for this structure are `BEFORE` , `AFTER` , and `BETWEEN` .","TimeGranularity":"The level of time precision that is used to aggregate `DateTime` values."}},"AWS::QuickSight::Topic.TopicSingularFilterConstant":{"attributes":{},"description":"A structure that represents a singular filter constant, used in filters to specify a single value to match against.","properties":{"ConstantType":"The type of the singular filter constant. Valid values for this structure are `SINGULAR` .","SingularConstant":"The value of the singular filter constant."}},"AWS::QuickSight::VPCConnection":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the VPC connection.","CreatedTime":"The time that the VPC connection was created.","LastUpdatedTime":"The time that the VPC connection was last updated.","NetworkInterfaces":"A list of network interfaces.","Status":"The HTTP status of the request.","VPCId":"The ID of the VPC connection that you\'re creating. This ID is a unique identifier for each AWS Region in an AWS account."},"description":"Creates a new VPC connection.","properties":{"AvailabilityStatus":"The availability status of the VPC connection.","AwsAccountId":"The AWS account ID of the account where you want to create a new VPC connection.","DnsResolvers":"A list of IP addresses of DNS resolver endpoints for the VPC connection.","Name":"The display name for the VPC connection.","RoleArn":"The ARN of the IAM role associated with the VPC connection.","SecurityGroupIds":"The Amazon EC2 security group IDs associated with the VPC connection.","SubnetIds":"A list of subnet IDs for the VPC connection.","Tags":"A map of the key-value pairs for the resource tag or tags assigned to the VPC connection.","VPCConnectionId":"The ID of the VPC connection that you\'re creating. This ID is a unique identifier for each AWS Region in an AWS account."}},"AWS::QuickSight::VPCConnection.NetworkInterface":{"attributes":{},"description":"The structure that contains information about a network interface.","properties":{"AvailabilityZone":"The availability zone that the network interface resides in.","ErrorMessage":"An error message.","NetworkInterfaceId":"The network interface ID.","Status":"The status of the network interface.","SubnetId":"The subnet ID associated with the network interface."}},"AWS::RAM::Permission":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the new permission.","IsResourceTypeDefault":"Specifies whether this permission is the default for new resource shares that include resources of the associated resource type.","PermissionType":"The type of managed permission. This can be one of the following values:\\n\\n- *AWS_MANAGED_PERMISSION* – AWS created and manages this managed permission. You can associate it with your resource shares, but you can\'t modify it.\\n- *CUSTOMER_MANAGED_PERMISSION* – You, or another principal in your account created this managed permission. You can associate it with your resource shares and create new versions that have different permissions.","Ref":"`Ref` returns the ARN of the permission.","Version":"The version number for this version of the permission."},"description":"Creates a customer managed permission for a specified resource type that you can attach to resource shares. It is created in the AWS Region in which you call the operation.","properties":{"Name":"Specifies the name of the customer managed permission. The name must be unique within the AWS Region .","PolicyTemplate":"A string in JSON format string that contains the following elements of a resource-based policy:\\n\\n- *Effect* : must be set to `ALLOW` .\\n- *Action* : specifies the actions that are allowed by this customer managed permission. The list must contain only actions that are supported by the specified resource type. For a list of all actions supported by each resource type, see [Actions, resources, and condition keys for AWS services](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html) in the *AWS Identity and Access Management User Guide* .\\n- *Condition* : (optional) specifies conditional parameters that must evaluate to true when a user attempts an action for that action to be allowed. For more information about the Condition element, see [IAM policies: Condition element](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html) in the *AWS Identity and Access Management User Guide* .\\n\\nThis template can\'t include either the `Resource` or `Principal` elements. Those are both filled in by AWS RAM when it instantiates the resource-based policy on each resource shared using this managed permission. The `Resource` comes from the ARN of the specific resource that you are sharing. The `Principal` comes from the list of identities added to the resource share.","ResourceType":"Specifies the name of the resource type that this customer managed permission applies to.\\n\\nThe format is `** : **` and is not case sensitive. For example, to specify an Amazon EC2 Subnet, you can use the string `ec2:subnet` . To see the list of valid values for this parameter, query the [ListResourceTypes](https://docs.aws.amazon.com/ram/latest/APIReference/API_ListResourceTypes.html) operation.","Tags":"Specifies a list of one or more tag key and value pairs to attach to the permission."}},"AWS::RAM::ResourceShare":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the resource share.","Ref":"`Ref` returns The ID of the resource share."},"description":"Creates a resource share. You can provide a list of the Amazon Resource Names (ARNs) for the resources that you want to share, a list of principals you want to share the resources with, and the permissions to grant those principals.\\n\\n> Sharing a resource makes it available for use by principals outside of the AWS account that created the resource. Sharing doesn\'t change any permissions or quotas that apply to the resource in the account that created it.","properties":{"AllowExternalPrincipals":"Specifies whether principals outside your organization in AWS Organizations can be associated with a resource share. A value of `true` lets you share with individual AWS accounts that are *not* in your organization. A value of `false` only has meaning if your account is a member of an AWS Organization. The default value is `true` .","Name":"Specifies the name of the resource share.","PermissionArns":"Specifies the [Amazon Resource Names (ARNs)](https://docs.aws.amazon.com//general/latest/gr/aws-arns-and-namespaces.html) of the AWS RAM permission to associate with the resource share. If you do not specify an ARN for the permission, AWS RAM automatically attaches the default version of the permission for each resource type. You can associate only one permission with each resource type included in the resource share.","Principals":"Specifies the principals to associate with the resource share. The possible values are:\\n\\n- An AWS account ID\\n- An Amazon Resource Name (ARN) of an organization in AWS Organizations\\n- An ARN of an organizational unit (OU) in AWS Organizations\\n- An ARN of an IAM role\\n- An ARN of an IAM user\\n\\n> Not all resource types can be shared with IAM roles and users. For more information, see the column *Can share with IAM roles and users* in the tables on [Shareable AWS resources](https://docs.aws.amazon.com/ram/latest/userguide/shareable.html) in the *AWS Resource Access Manager User Guide* .","ResourceArns":"Specifies a list of one or more ARNs of the resources to associate with the resource share.","Tags":"Specifies one or more tags to attach to the resource share itself. It doesn\'t attach the tags to the resources associated with the resource share."}},"AWS::RDS::CustomDBEngineVersion":{"attributes":{"DBEngineVersionArn":"The ARN of the custom engine version.","Ref":""},"description":"Creates a custom DB engine version (CEV).","properties":{"DatabaseInstallationFilesS3BucketName":"The name of an Amazon S3 bucket that contains database installation files for your CEV. For example, a valid bucket name is `my-custom-installation-files` .","DatabaseInstallationFilesS3Prefix":"The Amazon S3 directory that contains the database installation files for your CEV. For example, a valid bucket name is `123456789012/cev1` . If this setting isn\'t specified, no prefix is assumed.","Description":"An optional description of your CEV.","Engine":"The database engine to use for your custom engine version (CEV).\\n\\nValid values:\\n\\n- `custom-oracle-ee`\\n- `custom-oracle-ee-cdb`","EngineVersion":"The name of your CEV. The name format is `major version.customized_string` . For example, a valid CEV name is `19.my_cev1` . This setting is required for RDS Custom for Oracle, but optional for Amazon RDS. The combination of `Engine` and `EngineVersion` is unique per customer per Region.\\n\\n*Constraints:* Minimum length is 1. Maximum length is 60.\\n\\n*Pattern:* `^[a-z0-9_.-]{1,60$` }","KMSKeyId":"The AWS KMS key identifier for an encrypted CEV. A symmetric encryption KMS key is required for RDS Custom, but optional for Amazon RDS.\\n\\nIf you have an existing symmetric encryption KMS key in your account, you can use it with RDS Custom. No further action is necessary. If you don\'t already have a symmetric encryption KMS key in your account, follow the instructions in [Creating a symmetric encryption KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk) in the *AWS Key Management Service Developer Guide* .\\n\\nYou can choose the same symmetric encryption key when you create a CEV and a DB instance, or choose different keys.","Manifest":"The CEV manifest, which is a JSON document that describes the installation .zip files stored in Amazon S3. Specify the name/value pairs in a file or a quoted string. RDS Custom applies the patches in the order in which they are listed.\\n\\nThe following JSON fields are valid:\\n\\n- **MediaImportTemplateVersion** - Version of the CEV manifest. The date is in the format `YYYY-MM-DD` .\\n- **databaseInstallationFileNames** - Ordered list of installation files for the CEV.\\n- **opatchFileNames** - Ordered list of OPatch installers used for the Oracle DB engine.\\n- **psuRuPatchFileNames** - The PSU and RU patches for this CEV.\\n- **OtherPatchFileNames** - The patches that are not in the list of PSU and RU patches. Amazon RDS applies these patches after applying the PSU and RU patches.\\n\\nFor more information, see [Creating the CEV manifest](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-cev.html#custom-cev.preparing.manifest) in the *Amazon RDS User Guide* .","Status":"A value that indicates the status of a custom engine version (CEV).","Tags":"A list of tags. For more information, see [Tagging Amazon RDS Resources](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html) in the *Amazon RDS User Guide.*"}},"AWS::RDS::DBCluster":{"attributes":{"DBClusterArn":"The Amazon Resource Name (ARN) for the DB cluster.","DBClusterResourceId":"The AWS Region -unique, immutable identifier for the DB cluster. This identifier is found in AWS CloudTrail log entries whenever the KMS key for the DB cluster is accessed.","Endpoint":"The connection endpoint for the primary instance of the DB cluster.","Endpoint.Address":"The connection endpoint for the DB cluster. For example: `mystack-mydbcluster-123456789012.us-east-2.rds.amazonaws.com`","Endpoint.Port":"The port number that will accept connections on this DB cluster. For example: `3306`","MasterUserSecret.SecretArn":"The Amazon Resource Name (ARN) of the secret.","ReadEndpoint.Address":"The reader endpoint for the DB cluster. For example: `mystack-mydbcluster-ro-123456789012.us-east-2.rds.amazonaws.com`","Ref":"`Ref` returns the name of the DB cluster."},"description":"The `AWS::RDS::DBCluster` resource creates an Amazon Aurora DB cluster or Multi-AZ DB cluster.\\n\\nFor more information about creating an Aurora DB cluster, see [Creating an Amazon Aurora DB cluster](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.CreateInstance.html) in the *Amazon Aurora User Guide* .\\n\\nFor more information about creating a Multi-AZ DB cluster, see [Creating a Multi-AZ DB cluster](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/create-multi-az-db-cluster.html) in the *Amazon RDS User Guide* .\\n\\n> You can only create this resource in AWS Regions where Amazon Aurora or Multi-AZ DB clusters are supported. \\n\\n*Updating DB clusters*\\n\\nWhen properties labeled \\" *Update requires:* [Replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) \\" are updated, AWS CloudFormation first creates a replacement DB cluster, then changes references from other dependent resources to point to the replacement DB cluster, and finally deletes the old DB cluster.\\n\\n> We highly recommend that you take a snapshot of the database before updating the stack. If you don\'t, you lose the data when AWS CloudFormation replaces your DB cluster. To preserve your data, perform the following procedure:\\n> \\n> - Deactivate any applications that are using the DB cluster so that there\'s no activity on the DB instance.\\n> - Create a snapshot of the DB cluster. For more information, see [Creating a DB Cluster Snapshot](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_CreateSnapshotCluster.html) .\\n> - If you want to restore your DB cluster using a DB cluster snapshot, modify the updated template with your DB cluster changes and add the `SnapshotIdentifier` property with the ID of the DB cluster snapshot that you want to use.\\n> \\n> After you restore a DB cluster with a `SnapshotIdentifier` property, you must specify the same `SnapshotIdentifier` property for any future updates to the DB cluster. When you specify this property for an update, the DB cluster is not restored from the DB cluster snapshot again, and the data in the database is not changed. However, if you don\'t specify the `SnapshotIdentifier` property, an empty DB cluster is created, and the original DB cluster is deleted. If you specify a property that is different from the previous snapshot restore property, a new DB cluster is restored from the specified `SnapshotIdentifier` property, and the original DB cluster is deleted.\\n> - Update the stack. \\n\\nCurrently, when you are updating the stack for an Aurora Serverless DB cluster, you can\'t include changes to any other properties when you specify one of the following properties: `PreferredBackupWindow` , `PreferredMaintenanceWindow` , and `Port` . This limitation doesn\'t apply to provisioned DB clusters.\\n\\nFor more information about updating other properties of this resource, see `[ModifyDBCluster](https://docs.aws.amazon.com//AmazonRDS/latest/APIReference/API_ModifyDBCluster.html)` . For more information about updating stacks, see [AWS CloudFormation Stacks Updates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks.html) .\\n\\n*Deleting DB clusters*\\n\\nThe default `DeletionPolicy` for `AWS::RDS::DBCluster` resources is `Snapshot` . For more information about how AWS CloudFormation deletes resources, see [DeletionPolicy Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) .","properties":{"AllocatedStorage":"The amount of storage in gibibytes (GiB) to allocate to each DB instance in the Multi-AZ DB cluster.\\n\\nValid for Cluster Type: Multi-AZ DB clusters only\\n\\nThis setting is required to create a Multi-AZ DB cluster.","AssociatedRoles":"Provides a list of the AWS Identity and Access Management (IAM) roles that are associated with the DB cluster. IAM roles that are associated with a DB cluster grant permission for the DB cluster to access other Amazon Web Services on your behalf.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","AutoMinorVersionUpgrade":"Specifies whether minor engine upgrades are applied automatically to the DB cluster during the maintenance window. By default, minor engine upgrades are applied automatically.\\n\\nValid for Cluster Type: Multi-AZ DB clusters only","AvailabilityZones":"A list of Availability Zones (AZs) where instances in the DB cluster can be created. For information on AWS Regions and Availability Zones, see [Choosing the Regions and Availability Zones](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.RegionsAndAvailabilityZones.html) in the *Amazon Aurora User Guide* .\\n\\nValid for: Aurora DB clusters only","BacktrackWindow":"The target backtrack window, in seconds. To disable backtracking, set this value to 0.\\n\\n> Currently, Backtrack is only supported for Aurora MySQL DB clusters. \\n\\nDefault: 0\\n\\nConstraints:\\n\\n- If specified, this value must be set to a number from 0 to 259,200 (72 hours).\\n\\nValid for: Aurora MySQL DB clusters only","BackupRetentionPeriod":"The number of days for which automated backups are retained.\\n\\nDefault: 1\\n\\nConstraints:\\n\\n- Must be a value from 1 to 35\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","CopyTagsToSnapshot":"A value that indicates whether to copy all tags from the DB cluster to snapshots of the DB cluster. The default is not to copy them.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","DBClusterIdentifier":"The DB cluster identifier. This parameter is stored as a lowercase string.\\n\\nConstraints:\\n\\n- Must contain from 1 to 63 letters, numbers, or hyphens.\\n- First character must be a letter.\\n- Can\'t end with a hyphen or contain two consecutive hyphens.\\n\\nExample: `my-cluster1`\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","DBClusterInstanceClass":"The compute and memory capacity of each DB instance in the Multi-AZ DB cluster, for example `db.m6gd.xlarge` . Not all DB instance classes are available in all AWS Regions , or for all database engines.\\n\\nFor the full list of DB instance classes and availability for your engine, see [DB instance class](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.html) in the *Amazon RDS User Guide* .\\n\\nThis setting is required to create a Multi-AZ DB cluster.\\n\\nValid for Cluster Type: Multi-AZ DB clusters only","DBClusterParameterGroupName":"The name of the DB cluster parameter group to associate with this DB cluster.\\n\\n> If you apply a parameter group to an existing DB cluster, then its DB instances might need to reboot. This can result in an outage while the DB instances are rebooting.\\n> \\n> If you apply a change to parameter group associated with a stopped DB cluster, then the update stack waits until the DB cluster is started. \\n\\nTo list all of the available DB cluster parameter group names, use the following command:\\n\\n`aws rds describe-db-cluster-parameter-groups --query \\"DBClusterParameterGroups[].DBClusterParameterGroupName\\" --output text`\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","DBInstanceParameterGroupName":"The name of the DB parameter group to apply to all instances of the DB cluster.\\n\\n> When you apply a parameter group using the `DBInstanceParameterGroupName` parameter, the DB cluster isn\'t rebooted automatically. Also, parameter changes are applied immediately rather than during the next maintenance window. \\n\\nDefault: The existing name setting\\n\\nConstraints:\\n\\n- The DB parameter group must be in the same DB parameter group family as this DB cluster.","DBSubnetGroupName":"A DB subnet group that you want to associate with this DB cluster.\\n\\nIf you are restoring a DB cluster to a point in time with `RestoreType` set to `copy-on-write` , and don\'t specify a DB subnet group name, then the DB cluster is restored with a default DB subnet group.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","DBSystemId":"Reserved for future use.","DatabaseName":"The name of your database. If you don\'t provide a name, then Amazon RDS won\'t create a database in this DB cluster. For naming constraints, see [Naming Constraints](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_Limits.html#RDS_Limits.Constraints) in the *Amazon Aurora User Guide* .\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","DeletionProtection":"A value that indicates whether the DB cluster has deletion protection enabled. The database can\'t be deleted when deletion protection is enabled. By default, deletion protection is disabled.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","Domain":"Indicates the directory ID of the Active Directory to create the DB cluster.\\n\\nFor Amazon Aurora DB clusters, Amazon RDS can use Kerberos authentication to authenticate users that connect to the DB cluster.\\n\\nFor more information, see [Kerberos authentication](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/kerberos-authentication.html) in the *Amazon Aurora User Guide* .\\n\\nValid for: Aurora DB clusters only","DomainIAMRoleName":"Specifies the name of the IAM role to use when making API calls to the Directory Service.\\n\\nValid for: Aurora DB clusters only","EnableCloudwatchLogsExports":"The list of log types that need to be enabled for exporting to CloudWatch Logs. The values in the list depend on the DB engine being used. For more information, see [Publishing Database Logs to Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html#USER_LogAccess.Procedural.UploadtoCloudWatch) in the *Amazon Aurora User Guide* .\\n\\n*Aurora MySQL*\\n\\nValid values: `audit` , `error` , `general` , `slowquery`\\n\\n*Aurora PostgreSQL*\\n\\nValid values: `postgresql`\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","EnableHttpEndpoint":"A value that indicates whether to enable the HTTP endpoint for an Aurora Serverless DB cluster. By default, the HTTP endpoint is disabled.\\n\\nWhen enabled, the HTTP endpoint provides a connectionless web service API for running SQL queries on the Aurora Serverless DB cluster. You can also query your database from inside the RDS console with the query editor.\\n\\nFor more information, see [Using the Data API for Aurora Serverless](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html) in the *Amazon Aurora User Guide* .\\n\\nValid for: Aurora DB clusters only","EnableIAMDatabaseAuthentication":"A value that indicates whether to enable mapping of AWS Identity and Access Management (IAM) accounts to database accounts. By default, mapping is disabled.\\n\\nFor more information, see [IAM Database Authentication](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.IAMDBAuth.html) in the *Amazon Aurora User Guide.*\\n\\nValid for: Aurora DB clusters only","Engine":"The name of the database engine to be used for this DB cluster.\\n\\nValid Values:\\n\\n- `aurora-mysql`\\n- `aurora-postgresql`\\n- `mysql`\\n- `postgres`\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","EngineMode":"The DB engine mode of the DB cluster, either `provisioned` or `serverless` .\\n\\nThe `serverless` engine mode only supports Aurora Serverless v1.\\n\\nLimitations and requirements apply to some DB engine modes. For more information, see the following sections in the *Amazon Aurora User Guide* :\\n\\n- [Limitations of Aurora Serverless v1](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.html#aurora-serverless.limitations)\\n- [Requirements for Aurora Serverless v2](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.requirements.html)\\n- [Limitations of parallel query](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-mysql-parallel-query.html#aurora-mysql-parallel-query-limitations)\\n- [Limitations of Aurora global databases](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database.html#aurora-global-database.limitations)\\n\\nValid for: Aurora DB clusters only","EngineVersion":"The version number of the database engine to use.\\n\\nTo list all of the available engine versions for Aurora MySQL version 2 (5.7-compatible) and version 3 (8.0-compatible), use the following command:\\n\\n`aws rds describe-db-engine-versions --engine aurora-mysql --query \\"DBEngineVersions[].EngineVersion\\"`\\n\\nYou can supply either `5.7` or `8.0` to use the default engine version for Aurora MySQL version 2 or version 3, respectively.\\n\\nTo list all of the available engine versions for Aurora PostgreSQL, use the following command:\\n\\n`aws rds describe-db-engine-versions --engine aurora-postgresql --query \\"DBEngineVersions[].EngineVersion\\"`\\n\\nTo list all of the available engine versions for RDS for MySQL, use the following command:\\n\\n`aws rds describe-db-engine-versions --engine mysql --query \\"DBEngineVersions[].EngineVersion\\"`\\n\\nTo list all of the available engine versions for RDS for PostgreSQL, use the following command:\\n\\n`aws rds describe-db-engine-versions --engine postgres --query \\"DBEngineVersions[].EngineVersion\\"`\\n\\n*Aurora MySQL*\\n\\nFor information, see [Database engine updates for Amazon Aurora MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Updates.html) in the *Amazon Aurora User Guide* .\\n\\n*Aurora PostgreSQL*\\n\\nFor information, see [Amazon Aurora PostgreSQL releases and engine versions](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Updates.20180305.html) in the *Amazon Aurora User Guide* .\\n\\n*MySQL*\\n\\nFor information, see [Amazon RDS for MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_MySQL.html#MySQL.Concepts.VersionMgmt) in the *Amazon RDS User Guide* .\\n\\n*PostgreSQL*\\n\\nFor information, see [Amazon RDS for PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts) in the *Amazon RDS User Guide* .\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","GlobalClusterIdentifier":"If you are configuring an Aurora global database cluster and want your Aurora DB cluster to be a secondary member in the global database cluster, specify the global cluster ID of the global database cluster. To define the primary database cluster of the global cluster, use the [AWS::RDS::GlobalCluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html) resource.\\n\\nIf you aren\'t configuring a global database cluster, don\'t specify this property.\\n\\n> To remove the DB cluster from a global database cluster, specify an empty value for the `GlobalClusterIdentifier` property. \\n\\nFor information about Aurora global databases, see [Working with Amazon Aurora Global Databases](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database.html) in the *Amazon Aurora User Guide* .\\n\\nValid for: Aurora DB clusters only","Iops":"The amount of Provisioned IOPS (input/output operations per second) to be initially allocated for each DB instance in the Multi-AZ DB cluster.\\n\\nFor information about valid IOPS values, see [Provisioned IOPS storage](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html#USER_PIOPS) in the *Amazon RDS User Guide* .\\n\\nThis setting is required to create a Multi-AZ DB cluster.\\n\\nValid for Cluster Type: Multi-AZ DB clusters only\\n\\nConstraints:\\n\\n- Must be a multiple between .5 and 50 of the storage amount for the DB cluster.","KmsKeyId":"The Amazon Resource Name (ARN) of the AWS KMS key that is used to encrypt the database instances in the DB cluster, such as `arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef` . If you enable the `StorageEncrypted` property but don\'t specify this property, the default KMS key is used. If you specify this property, you must set the `StorageEncrypted` property to `true` .\\n\\nIf you specify the `SnapshotIdentifier` property, the `StorageEncrypted` property value is inherited from the snapshot, and if the DB cluster is encrypted, the specified `KmsKeyId` property is used.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","ManageMasterUserPassword":"Specifies whether to manage the master user password with AWS Secrets Manager.\\n\\nFor more information, see [Password management with AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) in the *Amazon RDS User Guide* and [Password management with AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html) in the *Amazon Aurora User Guide.*\\n\\nValid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters\\n\\nConstraints:\\n\\n- Can\'t manage the master user password with AWS Secrets Manager if `MasterUserPassword` is specified.","MasterUserPassword":"The master password for the DB instance.\\n\\n> If you specify the `SourceDBClusterIdentifier` , `SnapshotIdentifier` , or `GlobalClusterIdentifier` property, don\'t specify this property. The value is inherited from the source DB cluster, the snapshot, or the primary DB cluster for the global database cluster, respectively. \\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","MasterUserSecret":"The secret managed by RDS in AWS Secrets Manager for the master user password.\\n\\nFor more information, see [Password management with AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) in the *Amazon RDS User Guide* and [Password management with AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html) in the *Amazon Aurora User Guide.*","MasterUsername":"The name of the master user for the DB cluster.\\n\\n> If you specify the `SourceDBClusterIdentifier` , `SnapshotIdentifier` , or `GlobalClusterIdentifier` property, don\'t specify this property. The value is inherited from the source DB cluster, the snapshot, or the primary DB cluster for the global database cluster, respectively. \\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","MonitoringInterval":"The interval, in seconds, between points when Enhanced Monitoring metrics are collected for the DB cluster. To turn off collecting Enhanced Monitoring metrics, specify `0` .\\n\\nIf `MonitoringRoleArn` is specified, also set `MonitoringInterval` to a value other than `0` .\\n\\nValid for Cluster Type: Multi-AZ DB clusters only\\n\\nValid Values: `0 | 1 | 5 | 10 | 15 | 30 | 60`\\n\\nDefault: `0`","MonitoringRoleArn":"The Amazon Resource Name (ARN) for the IAM role that permits RDS to send Enhanced Monitoring metrics to Amazon CloudWatch Logs. An example is `arn:aws:iam:123456789012:role/emaccess` . For information on creating a monitoring role, see [Setting up and enabling Enhanced Monitoring](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Monitoring.OS.html#USER_Monitoring.OS.Enabling) in the *Amazon RDS User Guide* .\\n\\nIf `MonitoringInterval` is set to a value other than `0` , supply a `MonitoringRoleArn` value.\\n\\nValid for Cluster Type: Multi-AZ DB clusters only","NetworkType":"The network type of the DB cluster.\\n\\nValid values:\\n\\n- `IPV4`\\n- `DUAL`\\n\\nThe network type is determined by the `DBSubnetGroup` specified for the DB cluster. A `DBSubnetGroup` can support only the IPv4 protocol or the IPv4 and IPv6 protocols ( `DUAL` ).\\n\\nFor more information, see [Working with a DB instance in a VPC](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html) in the *Amazon Aurora User Guide.*\\n\\nValid for: Aurora DB clusters only","PerformanceInsightsEnabled":"Specifies whether to turn on Performance Insights for the DB cluster.\\n\\nFor more information, see [Using Amazon Performance Insights](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.html) in the *Amazon RDS User Guide* .\\n\\nValid for Cluster Type: Multi-AZ DB clusters only","PerformanceInsightsKmsKeyId":"The AWS KMS key identifier for encryption of Performance Insights data.\\n\\nThe AWS KMS key identifier is the key ARN, key ID, alias ARN, or alias name for the KMS key.\\n\\nIf you don\'t specify a value for `PerformanceInsightsKMSKeyId` , then Amazon RDS uses your default KMS key. There is a default KMS key for your AWS account . Your AWS account has a different default KMS key for each AWS Region .\\n\\nValid for Cluster Type: Multi-AZ DB clusters only","PerformanceInsightsRetentionPeriod":"The number of days to retain Performance Insights data.\\n\\nValid for Cluster Type: Multi-AZ DB clusters only\\n\\nValid Values:\\n\\n- `7`\\n- *month* * 31, where *month* is a number of months from 1-23. Examples: `93` (3 months * 31), `341` (11 months * 31), `589` (19 months * 31)\\n- `731`\\n\\nDefault: `7` days\\n\\nIf you specify a retention period that isn\'t valid, such as `94` , Amazon RDS issues an error.","Port":"The port number on which the DB instances in the DB cluster accept connections.\\n\\nDefault:\\n\\n- When `EngineMode` is `provisioned` , `3306` (for both Aurora MySQL and Aurora PostgreSQL)\\n- When `EngineMode` is `serverless` :\\n\\n- `3306` when `Engine` is `aurora` or `aurora-mysql`\\n- `5432` when `Engine` is `aurora-postgresql`\\n\\n> The `No interruption` on update behavior only applies to DB clusters. If you are updating a DB instance, see [Port](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#cfn-rds-dbinstance-port) for the AWS::RDS::DBInstance resource. \\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","PreferredBackupWindow":"The daily time range during which automated backups are created. For more information, see [Backup Window](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Managing.Backups.html#Aurora.Managing.Backups.BackupWindow) in the *Amazon Aurora User Guide.*\\n\\nConstraints:\\n\\n- Must be in the format `hh24:mi-hh24:mi` .\\n- Must be in Universal Coordinated Time (UTC).\\n- Must not conflict with the preferred maintenance window.\\n- Must be at least 30 minutes.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","PreferredMaintenanceWindow":"The weekly time range during which system maintenance can occur, in Universal Coordinated Time (UTC).\\n\\nFormat: `ddd:hh24:mi-ddd:hh24:mi`\\n\\nThe default is a 30-minute window selected at random from an 8-hour block of time for each AWS Region, occurring on a random day of the week. To see the time blocks available, see [Adjusting the Preferred DB Cluster Maintenance Window](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_UpgradeDBInstance.Maintenance.html#AdjustingTheMaintenanceWindow.Aurora) in the *Amazon Aurora User Guide.*\\n\\nValid Days: Mon, Tue, Wed, Thu, Fri, Sat, Sun.\\n\\nConstraints: Minimum 30-minute window.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","PubliclyAccessible":"Specifies whether the DB cluster is publicly accessible.\\n\\nWhen the DB cluster is publicly accessible, its Domain Name System (DNS) endpoint resolves to the private IP address from within the DB cluster\'s virtual private cloud (VPC). It resolves to the public IP address from outside of the DB cluster\'s VPC. Access to the DB cluster is ultimately controlled by the security group it uses. That public access isn\'t permitted if the security group assigned to the DB cluster doesn\'t permit it.\\n\\nWhen the DB cluster isn\'t publicly accessible, it is an internal DB cluster with a DNS name that resolves to a private IP address.\\n\\nValid for Cluster Type: Multi-AZ DB clusters only\\n\\nDefault: The default behavior varies depending on whether `DBSubnetGroupName` is specified.\\n\\nIf `DBSubnetGroupName` isn\'t specified, and `PubliclyAccessible` isn\'t specified, the following applies:\\n\\n- If the default VPC in the target Region doesn’t have an internet gateway attached to it, the DB cluster is private.\\n- If the default VPC in the target Region has an internet gateway attached to it, the DB cluster is public.\\n\\nIf `DBSubnetGroupName` is specified, and `PubliclyAccessible` isn\'t specified, the following applies:\\n\\n- If the subnets are part of a VPC that doesn’t have an internet gateway attached to it, the DB cluster is private.\\n- If the subnets are part of a VPC that has an internet gateway attached to it, the DB cluster is public.","ReplicationSourceIdentifier":"The Amazon Resource Name (ARN) of the source DB instance or DB cluster if this DB cluster is created as a read replica.\\n\\nValid for: Aurora DB clusters only","RestoreToTime":"The date and time to restore the DB cluster to.\\n\\nValid Values: Value must be a time in Universal Coordinated Time (UTC) format\\n\\nConstraints:\\n\\n- Must be before the latest restorable time for the DB instance\\n- Must be specified if `UseLatestRestorableTime` parameter isn\'t provided\\n- Can\'t be specified if the `UseLatestRestorableTime` parameter is enabled\\n- Can\'t be specified if the `RestoreType` parameter is `copy-on-write`\\n\\nExample: `2015-03-07T23:45:00Z`\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","RestoreType":"The type of restore to be performed. You can specify one of the following values:\\n\\n- `full-copy` - The new DB cluster is restored as a full copy of the source DB cluster.\\n- `copy-on-write` - The new DB cluster is restored as a clone of the source DB cluster.\\n\\nIf you don\'t specify a `RestoreType` value, then the new DB cluster is restored as a full copy of the source DB cluster.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","ScalingConfiguration":"The `ScalingConfiguration` property type specifies the scaling configuration of an Aurora Serverless DB cluster.\\n\\nThis property is only supported for Aurora Serverless v1. For Aurora Serverless v2, use `ServerlessV2ScalingConfiguration` property.\\n\\nValid for: Aurora DB clusters only","ServerlessV2ScalingConfiguration":"The `ServerlessV2ScalingConfiguration` property type specifies the scaling configuration of an Aurora Serverless V2 DB cluster.\\n\\nThis property is only supported for Aurora Serverless v2. For Aurora Serverless v1, use `ScalingConfiguration` property.\\n\\nValid for: Aurora DB clusters only","SnapshotIdentifier":"The identifier for the DB snapshot or DB cluster snapshot to restore from.\\n\\nYou can use either the name or the Amazon Resource Name (ARN) to specify a DB cluster snapshot. However, you can use only the ARN to specify a DB snapshot.\\n\\nAfter you restore a DB cluster with a `SnapshotIdentifier` property, you must specify the same `SnapshotIdentifier` property for any future updates to the DB cluster. When you specify this property for an update, the DB cluster is not restored from the snapshot again, and the data in the database is not changed. However, if you don\'t specify the `SnapshotIdentifier` property, an empty DB cluster is created, and the original DB cluster is deleted. If you specify a property that is different from the previous snapshot restore property, a new DB cluster is restored from the specified `SnapshotIdentifier` property, and the original DB cluster is deleted.\\n\\nIf you specify the `SnapshotIdentifier` property to restore a DB cluster (as opposed to specifying it for DB cluster updates), then don\'t specify the following properties:\\n\\n- `GlobalClusterIdentifier`\\n- `MasterUsername`\\n- `MasterUserPassword`\\n- `ReplicationSourceIdentifier`\\n- `RestoreType`\\n- `SourceDBClusterIdentifier`\\n- `SourceRegion`\\n- `StorageEncrypted` (for an encrypted snapshot)\\n- `UseLatestRestorableTime`\\n\\nConstraints:\\n\\n- Must match the identifier of an existing Snapshot.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","SourceDBClusterIdentifier":"When restoring a DB cluster to a point in time, the identifier of the source DB cluster from which to restore.\\n\\nConstraints:\\n\\n- Must match the identifier of an existing DBCluster.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","SourceRegion":"The AWS Region which contains the source DB cluster when replicating a DB cluster. For example, `us-east-1` .\\n\\nValid for: Aurora DB clusters only","StorageEncrypted":"Indicates whether the DB cluster is encrypted.\\n\\nIf you specify the `KmsKeyId` property, then you must enable encryption.\\n\\nIf you specify the `SourceDBClusterIdentifier` property, don\'t specify this property. The value is inherited from the source DB cluster, and if the DB cluster is encrypted, the specified `KmsKeyId` property is used.\\n\\nIf you specify the `SnapshotIdentifier` and the specified snapshot is encrypted, don\'t specify this property. The value is inherited from the snapshot, and the specified `KmsKeyId` property is used.\\n\\nIf you specify the `SnapshotIdentifier` and the specified snapshot isn\'t encrypted, you can use this property to specify that the restored DB cluster is encrypted. Specify the `KmsKeyId` property for the KMS key to use for encryption. If you don\'t want the restored DB cluster to be encrypted, then don\'t set this property or set it to `false` .\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","StorageType":"The storage type to associate with the DB cluster.\\n\\nFor information on storage types for Aurora DB clusters, see [Storage configurations for Amazon Aurora DB clusters](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.StorageReliability.html#aurora-storage-type) . For information on storage types for Multi-AZ DB clusters, see [Settings for creating Multi-AZ DB clusters](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/create-multi-az-db-cluster.html#create-multi-az-db-cluster-settings) .\\n\\nThis setting is required to create a Multi-AZ DB cluster.\\n\\nWhen specified for a Multi-AZ DB cluster, a value for the `Iops` parameter is required.\\n\\nValid for Cluster Type: Aurora DB clusters and Multi-AZ DB clusters\\n\\nValid Values:\\n\\n- Aurora DB clusters - `aurora | aurora-iopt1`\\n- Multi-AZ DB clusters - `io1`\\n\\nDefault:\\n\\n- Aurora DB clusters - `aurora`\\n- Multi-AZ DB clusters - `io1`","Tags":"An optional array of key-value pairs to apply to this DB cluster.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","UseLatestRestorableTime":"A value that indicates whether to restore the DB cluster to the latest restorable backup time. By default, the DB cluster is not restored to the latest restorable backup time.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters","VpcSecurityGroupIds":"A list of EC2 VPC security groups to associate with this DB cluster.\\n\\nIf you plan to update the resource, don\'t specify VPC security groups in a shared VPC.\\n\\nValid for: Aurora DB clusters and Multi-AZ DB clusters"}},"AWS::RDS::DBCluster.DBClusterRole":{"attributes":{},"description":"Describes an AWS Identity and Access Management (IAM) role that is associated with a DB cluster.","properties":{"FeatureName":"The name of the feature associated with the AWS Identity and Access Management (IAM) role. IAM roles that are associated with a DB cluster grant permission for the DB cluster to access other AWS services on your behalf. For the list of supported feature names, see the `SupportedFeatureNames` description in [DBEngineVersion](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DBEngineVersion.html) in the *Amazon RDS API Reference* .","RoleArn":"The Amazon Resource Name (ARN) of the IAM role that is associated with the DB cluster."}},"AWS::RDS::DBCluster.Endpoint":{"attributes":{},"description":"The `Endpoint` return value specifies the connection endpoint for the primary instance of the DB cluster.","properties":{"Address":"Specifies the connection endpoint for the primary instance of the DB cluster.","Port":"Specifies the port that the database engine is listening on."}},"AWS::RDS::DBCluster.MasterUserSecret":{"attributes":{},"description":"The `MasterUserSecret` return value specifies the secret managed by RDS in AWS Secrets Manager for the master user password.\\n\\nFor more information, see [Password management with AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) in the *Amazon RDS User Guide* and [Password management with AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html) in the *Amazon Aurora User Guide.*","properties":{"KmsKeyId":"The AWS KMS key identifier that is used to encrypt the secret.","SecretArn":"The Amazon Resource Name (ARN) of the secret."}},"AWS::RDS::DBCluster.ReadEndpoint":{"attributes":{},"description":"The `ReadEndpoint` return value specifies the reader endpoint for the DB cluster.\\n\\nThe reader endpoint for a DB cluster load-balances connections across the Aurora Replicas that are available in a DB cluster. As clients request new connections to the reader endpoint, Aurora distributes the connection requests among the Aurora Replicas in the DB cluster. This functionality can help balance your read workload across multiple Aurora Replicas in your DB cluster.\\n\\nIf a failover occurs, and the Aurora Replica that you are connected to is promoted to be the primary instance, your connection is dropped. To continue sending your read workload to other Aurora Replicas in the cluster, you can then reconnect to the reader endpoint.\\n\\nFor more information about Aurora endpoints, see [Amazon Aurora connection management](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.Endpoints.html) in the *Amazon Aurora User Guide* .","properties":{"Address":"The host address of the reader endpoint."}},"AWS::RDS::DBCluster.ScalingConfiguration":{"attributes":{},"description":"The `ScalingConfiguration` property type specifies the scaling configuration of an Aurora Serverless DB cluster.\\n\\nFor more information, see [Using Amazon Aurora Serverless](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.html) in the *Amazon Aurora User Guide* .\\n\\nThis property is only supported for Aurora Serverless v1. For Aurora Serverless v2, use `ServerlessV2ScalingConfiguration` property.\\n\\nValid for: Aurora DB clusters only","properties":{"AutoPause":"A value that indicates whether to allow or disallow automatic pause for an Aurora DB cluster in `serverless` DB engine mode. A DB cluster can be paused only when it\'s idle (it has no connections).\\n\\n> If a DB cluster is paused for more than seven days, the DB cluster might be backed up with a snapshot. In this case, the DB cluster is restored when there is a request to connect to it.","MaxCapacity":"The maximum capacity for an Aurora DB cluster in `serverless` DB engine mode.\\n\\nFor Aurora MySQL, valid capacity values are `1` , `2` , `4` , `8` , `16` , `32` , `64` , `128` , and `256` .\\n\\nFor Aurora PostgreSQL, valid capacity values are `2` , `4` , `8` , `16` , `32` , `64` , `192` , and `384` .\\n\\nThe maximum capacity must be greater than or equal to the minimum capacity.","MinCapacity":"The minimum capacity for an Aurora DB cluster in `serverless` DB engine mode.\\n\\nFor Aurora MySQL, valid capacity values are `1` , `2` , `4` , `8` , `16` , `32` , `64` , `128` , and `256` .\\n\\nFor Aurora PostgreSQL, valid capacity values are `2` , `4` , `8` , `16` , `32` , `64` , `192` , and `384` .\\n\\nThe minimum capacity must be less than or equal to the maximum capacity.","SecondsBeforeTimeout":"The amount of time, in seconds, that Aurora Serverless v1 tries to find a scaling point to perform seamless scaling before enforcing the timeout action. The default is 300.\\n\\nSpecify a value between 60 and 600 seconds.","SecondsUntilAutoPause":"The time, in seconds, before an Aurora DB cluster in `serverless` mode is paused.\\n\\nSpecify a value between 300 and 86,400 seconds.","TimeoutAction":"The action to take when the timeout is reached, either `ForceApplyCapacityChange` or `RollbackCapacityChange` .\\n\\n`ForceApplyCapacityChange` sets the capacity to the specified value as soon as possible.\\n\\n`RollbackCapacityChange` , the default, ignores the capacity change if a scaling point isn\'t found in the timeout period.\\n\\n> If you specify `ForceApplyCapacityChange` , connections that prevent Aurora Serverless v1 from finding a scaling point might be dropped. \\n\\nFor more information, see [Autoscaling for Aurora Serverless v1](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.how-it-works.html#aurora-serverless.how-it-works.auto-scaling) in the *Amazon Aurora User Guide* ."}},"AWS::RDS::DBCluster.ServerlessV2ScalingConfiguration":{"attributes":{},"description":"The `ServerlessV2ScalingConfiguration` property type specifies the scaling configuration of an Aurora Serverless V2 DB cluster.\\n\\nFor more information, see [Using Amazon Aurora Serverless v2](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html) in the *Amazon Aurora User Guide* .\\n\\nIf you have an Aurora cluster, you must set the `ScalingConfigurationInfo` attribute before you add a DB instance that uses the `db.serverless` DB instance class. For more information, see [Clusters that use Aurora Serverless v2 must have a capacity range specified](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.requirements.html#aurora-serverless-v2.requirements.capacity-range) in the *Amazon Aurora User Guide* .\\n\\nThis property is only supported for Aurora Serverless v2. For Aurora Serverless v1, use `ScalingConfiguration` property.","properties":{"MaxCapacity":"The maximum number of Aurora capacity units (ACUs) for a DB instance in an Aurora Serverless v2 cluster. You can specify ACU values in half-step increments, such as 40, 40.5, 41, and so on. The largest value that you can use is 128.\\n\\nThe maximum capacity must be higher than 0.5 ACUs. For more information, see [Choosing the maximum Aurora Serverless v2 capacity setting for a cluster](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html#aurora-serverless-v2.max_capacity_considerations) in the *Amazon Aurora User Guide* .","MinCapacity":"The minimum number of Aurora capacity units (ACUs) for a DB instance in an Aurora Serverless v2 cluster. You can specify ACU values in half-step increments, such as 8, 8.5, 9, and so on. The smallest value that you can use is 0.5."}},"AWS::RDS::DBClusterParameterGroup":{"attributes":{"Ref":"`Ref` returns the name of the DB cluster parameter group."},"description":"The `AWS::RDS::DBClusterParameterGroup` resource creates a new Amazon RDS DB cluster parameter group.\\n\\nFor information about configuring parameters for Amazon Aurora DB clusters, see [Working with parameter groups](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_WorkingWithParamGroups.html) in the *Amazon Aurora User Guide* .\\n\\n> If you apply a parameter group to a DB cluster, then its DB instances might need to reboot. This can result in an outage while the DB instances are rebooting.\\n> \\n> If you apply a change to parameter group associated with a stopped DB cluster, then the update stack waits until the DB cluster is started.","properties":{"DBClusterParameterGroupName":"The name of the DB cluster parameter group.\\n\\nConstraints:\\n\\n- Must not match the name of an existing DB cluster parameter group.\\n\\nIf you don\'t specify a value for `DBClusterParameterGroupName` property, a name is automatically created for the DB cluster parameter group.\\n\\n> This value is stored as a lowercase string.","Description":"A friendly description for this DB cluster parameter group.","Family":"The DB cluster parameter group family name. A DB cluster parameter group can be associated with one and only one DB cluster parameter group family, and can be applied only to a DB cluster running a DB engine and engine version compatible with that DB cluster parameter group family.\\n\\n> The DB cluster parameter group family can\'t be changed when updating a DB cluster parameter group. \\n\\nTo list all of the available parameter group families, use the following command:\\n\\n`aws rds describe-db-engine-versions --query \\"DBEngineVersions[].DBParameterGroupFamily\\"`\\n\\nThe output contains duplicates.\\n\\nFor more information, see `[CreateDBClusterParameterGroup](https://docs.aws.amazon.com//AmazonRDS/latest/APIReference/API_CreateDBClusterParameterGroup.html)` .","Parameters":"Provides a list of parameters for the DB cluster parameter group.","Tags":"An optional array of key-value pairs to apply to this DB cluster parameter group."}},"AWS::RDS::DBInstance":{"attributes":{"CertificateDetails.CAIdentifier":"The CA identifier of the CA certificate used for the DB instance\'s server certificate.","CertificateDetails.ValidTill":"The expiration date of the DB instance’s server certificate.","DBInstanceArn":"The Amazon Resource Name (ARN) for the DB instance.","DBSystemId":"The Oracle system ID (Oracle SID) for a container database (CDB). The Oracle SID is also the name of the CDB.\\n\\nThis setting is valid for RDS Custom only.","DbiResourceId":"The AWS Region-unique, immutable identifier for the DB instance. This identifier is found in AWS CloudTrail log entries whenever the AWS KMS key for the DB instance is accessed.","Endpoint.Address":"The connection endpoint for the database. For example: `mystack-mydb-1apw1j4phylrk.cg034hpkmmjt.us-east-2.rds.amazonaws.com`\\n\\nFor Aurora Serverless DB clusters, the connection endpoint only applies to the DB cluster.","Endpoint.HostedZoneId":"The ID that Amazon Route 53 assigns when you create a hosted zone.","Endpoint.Port":"The port number on which the database accepts connections. For example: `3306`","MasterUserSecret.SecretArn":"The Amazon Resource Name (ARN) of the secret.","Ref":"`Ref` returns the DB instance name."},"description":"The `AWS::RDS::DBInstance` resource creates an Amazon DB instance. The new DB instance can be an RDS DB instance, or it can be a DB instance in an Aurora DB cluster.\\n\\nFor more information about creating an RDS DB instance, see [Creating an Amazon RDS DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html) in the *Amazon RDS User Guide* .\\n\\nFor more information about creating a DB instance in an Aurora DB cluster, see [Creating an Amazon Aurora DB cluster](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.CreateInstance.html) in the *Amazon Aurora User Guide* .\\n\\nIf you import an existing DB instance, and the template configuration doesn\'t match the actual configuration of the DB instance, AWS CloudFormation applies the changes in the template during the import operation.\\n\\n> If a DB instance is deleted or replaced during an update, AWS CloudFormation deletes all automated snapshots. However, it retains manual DB snapshots. During an update that requires replacement, you can apply a stack policy to prevent DB instances from being replaced. For more information, see [Prevent Updates to Stack Resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html) . \\n\\n*Updating DB instances*\\n\\nWhen properties labeled \\" *Update requires:* [Replacement](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) \\" are updated, AWS CloudFormation first creates a replacement DB instance, then changes references from other dependent resources to point to the replacement DB instance, and finally deletes the old DB instance.\\n\\n> We highly recommend that you take a snapshot of the database before updating the stack. If you don\'t, you lose the data when AWS CloudFormation replaces your DB instance. To preserve your data, perform the following procedure:\\n> \\n> - Deactivate any applications that are using the DB instance so that there\'s no activity on the DB instance.\\n> - Create a snapshot of the DB instance. For more information, see [Creating a DB Snapshot](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html) .\\n> - If you want to restore your instance using a DB snapshot, modify the updated template with your DB instance changes and add the `DBSnapshotIdentifier` property with the ID of the DB snapshot that you want to use.\\n> \\n> After you restore a DB instance with a `DBSnapshotIdentifier` property, you must specify the same `DBSnapshotIdentifier` property for any future updates to the DB instance. When you specify this property for an update, the DB instance is not restored from the DB snapshot again, and the data in the database is not changed. However, if you don\'t specify the `DBSnapshotIdentifier` property, an empty DB instance is created, and the original DB instance is deleted. If you specify a property that is different from the previous snapshot restore property, a new DB instance is restored from the specified `DBSnapshotIdentifier` property, and the original DB instance is deleted.\\n> - Update the stack. \\n\\nFor more information about updating other properties of this resource, see `[ModifyDBInstance](https://docs.aws.amazon.com//AmazonRDS/latest/APIReference/API_ModifyDBInstance.html)` . For more information about updating stacks, see [AWS CloudFormation Stacks Updates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks.html) .\\n\\n*Deleting DB instances*\\n\\nFor DB instances that are part of an Aurora DB cluster, you can set a deletion policy for your DB instance to control how AWS CloudFormation handles the DB instance when the stack is deleted. For Amazon RDS DB instances, you can choose to *retain* the DB instance, to *delete* the DB instance, or to *create a snapshot* of the DB instance. The default AWS CloudFormation behavior depends on the `DBClusterIdentifier` property:\\n\\n- For `AWS::RDS::DBInstance` resources that don\'t specify the `DBClusterIdentifier` property, AWS CloudFormation saves a snapshot of the DB instance.\\n- For `AWS::RDS::DBInstance` resources that do specify the `DBClusterIdentifier` property, AWS CloudFormation deletes the DB instance.\\n\\nFor more information, see [DeletionPolicy Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) .","properties":{"AllocatedStorage":"The amount of storage in gibibytes (GiB) to be initially allocated for the database instance.\\n\\n> If any value is set in the `Iops` parameter, `AllocatedStorage` must be at least 100 GiB, which corresponds to the minimum Iops value of 1,000. If you increase the `Iops` value (in 1,000 IOPS increments), then you must also increase the `AllocatedStorage` value (in 100-GiB increments). \\n\\n*Amazon Aurora*\\n\\nNot applicable. Aurora cluster volumes automatically grow as the amount of data in your database increases, though you are only charged for the space that you use in an Aurora cluster volume.\\n\\n*MySQL*\\n\\nConstraints to the amount of storage for each storage type are the following:\\n\\n- General Purpose (SSD) storage (gp2): Must be an integer from 20 to 65536.\\n- Provisioned IOPS storage (io1): Must be an integer from 100 to 65536.\\n- Magnetic storage (standard): Must be an integer from 5 to 3072.\\n\\n*MariaDB*\\n\\nConstraints to the amount of storage for each storage type are the following:\\n\\n- General Purpose (SSD) storage (gp2): Must be an integer from 20 to 65536.\\n- Provisioned IOPS storage (io1): Must be an integer from 100 to 65536.\\n- Magnetic storage (standard): Must be an integer from 5 to 3072.\\n\\n*PostgreSQL*\\n\\nConstraints to the amount of storage for each storage type are the following:\\n\\n- General Purpose (SSD) storage (gp2): Must be an integer from 20 to 65536.\\n- Provisioned IOPS storage (io1): Must be an integer from 100 to 65536.\\n- Magnetic storage (standard): Must be an integer from 5 to 3072.\\n\\n*Oracle*\\n\\nConstraints to the amount of storage for each storage type are the following:\\n\\n- General Purpose (SSD) storage (gp2): Must be an integer from 20 to 65536.\\n- Provisioned IOPS storage (io1): Must be an integer from 100 to 65536.\\n- Magnetic storage (standard): Must be an integer from 10 to 3072.\\n\\n*SQL Server*\\n\\nConstraints to the amount of storage for each storage type are the following:\\n\\n- General Purpose (SSD) storage (gp2):\\n\\n- Enterprise and Standard editions: Must be an integer from 20 to 16384.\\n- Web and Express editions: Must be an integer from 20 to 16384.\\n- Provisioned IOPS storage (io1):\\n\\n- Enterprise and Standard editions: Must be an integer from 20 to 16384.\\n- Web and Express editions: Must be an integer from 20 to 16384.\\n- Magnetic storage (standard):\\n\\n- Enterprise and Standard editions: Must be an integer from 20 to 1024.\\n- Web and Express editions: Must be an integer from 20 to 1024.","AllowMajorVersionUpgrade":"A value that indicates whether major version upgrades are allowed. Changing this parameter doesn\'t result in an outage and the change is asynchronously applied as soon as possible.\\n\\nConstraints: Major version upgrades must be allowed when specifying a value for the `EngineVersion` parameter that is a different major version than the DB instance\'s current version.","AssociatedRoles":"The AWS Identity and Access Management (IAM) roles associated with the DB instance.\\n\\n*Amazon Aurora*\\n\\nNot applicable. The associated roles are managed by the DB cluster.","AutoMinorVersionUpgrade":"A value that indicates whether minor engine upgrades are applied automatically to the DB instance during the maintenance window. By default, minor engine upgrades are applied automatically.","AvailabilityZone":"The Availability Zone (AZ) where the database will be created. For information on AWS Regions and Availability Zones, see [Regions and Availability Zones](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html) .\\n\\nFor Amazon Aurora, each Aurora DB cluster hosts copies of its storage in three separate Availability Zones. Specify one of these Availability Zones. Aurora automatically chooses an appropriate Availability Zone if you don\'t specify one.\\n\\nDefault: A random, system-chosen Availability Zone in the endpoint\'s AWS Region .\\n\\nConstraints:\\n\\n- The `AvailabilityZone` parameter can\'t be specified if the DB instance is a Multi-AZ deployment.\\n- The specified Availability Zone must be in the same AWS Region as the current endpoint.\\n\\nExample: `us-east-1d`","BackupRetentionPeriod":"The number of days for which automated backups are retained. Setting this parameter to a positive number enables backups. Setting this parameter to 0 disables automated backups.\\n\\n*Amazon Aurora*\\n\\nNot applicable. The retention period for automated backups is managed by the DB cluster.\\n\\nDefault: 1\\n\\nConstraints:\\n\\n- Must be a value from 0 to 35\\n- Can\'t be set to 0 if the DB instance is a source to read replicas","CACertificateIdentifier":"The identifier of the CA certificate for this DB instance.\\n\\n> Specifying or updating this property triggers a reboot. \\n\\nFor more information about CA certificate identifiers for RDS DB engines, see [Rotating Your SSL/TLS Certificate](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL-certificate-rotation.html) in the *Amazon RDS User Guide* .\\n\\nFor more information about CA certificate identifiers for Aurora DB engines, see [Rotating Your SSL/TLS Certificate](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.SSL-certificate-rotation.html) in the *Amazon Aurora User Guide* .","CertificateDetails":"The details of the DB instance\'s server certificate.","CertificateRotationRestart":"Specifies whether the DB instance is restarted when you rotate your SSL/TLS certificate.\\n\\nBy default, the DB instance is restarted when you rotate your SSL/TLS certificate. The certificate is not updated until the DB instance is restarted.\\n\\n> Set this parameter only if you are *not* using SSL/TLS to connect to the DB instance. \\n\\nIf you are using SSL/TLS to connect to the DB instance, follow the appropriate instructions for your DB engine to rotate your SSL/TLS certificate:\\n\\n- For more information about rotating your SSL/TLS certificate for RDS DB engines, see [Rotating Your SSL/TLS Certificate.](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL-certificate-rotation.html) in the *Amazon RDS User Guide.*\\n- For more information about rotating your SSL/TLS certificate for Aurora DB engines, see [Rotating Your SSL/TLS Certificate](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.SSL-certificate-rotation.html) in the *Amazon Aurora User Guide* .\\n\\nThis setting doesn\'t apply to RDS Custom DB instances.","CharacterSetName":"For supported engines, indicates that the DB instance should be associated with the specified character set.\\n\\n*Amazon Aurora*\\n\\nNot applicable. The character set is managed by the DB cluster. For more information, see [AWS::RDS::DBCluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html) .","CopyTagsToSnapshot":"Specifies whether to copy tags from the DB instance to snapshots of the DB instance. By default, tags are not copied.\\n\\nThis setting doesn\'t apply to Amazon Aurora DB instances. Copying tags to snapshots is managed by the DB cluster. Setting this value for an Aurora DB instance has no effect on the DB cluster setting.","CustomIAMInstanceProfile":"The instance profile associated with the underlying Amazon EC2 instance of an RDS Custom DB instance.\\n\\nThis setting is required for RDS Custom.\\n\\nConstraints:\\n\\n- The profile must exist in your account.\\n- The profile must have an IAM role that Amazon EC2 has permissions to assume.\\n- The instance profile name and the associated IAM role name must start with the prefix `AWSRDSCustom` .\\n\\nFor the list of permissions required for the IAM role, see [Configure IAM and your VPC](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-setup-orcl.html#custom-setup-orcl.iam-vpc) in the *Amazon RDS User Guide* .","DBClusterIdentifier":"The identifier of the DB cluster that the instance will belong to.","DBClusterSnapshotIdentifier":"The identifier for the RDS for MySQL Multi-AZ DB cluster snapshot to restore from.\\n\\nFor more information on Multi-AZ DB clusters, see [Multi-AZ DB cluster deployments](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts.html) in the *Amazon RDS User Guide* .\\n\\nConstraints:\\n\\n- Must match the identifier of an existing Multi-AZ DB cluster snapshot.\\n- Can\'t be specified when `DBSnapshotIdentifier` is specified.\\n- Must be specified when `DBSnapshotIdentifier` isn\'t specified.\\n- If you are restoring from a shared manual Multi-AZ DB cluster snapshot, the `DBClusterSnapshotIdentifier` must be the ARN of the shared snapshot.\\n- Can\'t be the identifier of an Aurora DB cluster snapshot.\\n- Can\'t be the identifier of an RDS for PostgreSQL Multi-AZ DB cluster snapshot.","DBInstanceClass":"The compute and memory capacity of the DB instance, for example, `db.m4.large` . Not all DB instance classes are available in all AWS Regions, or for all database engines.\\n\\nFor the full list of DB instance classes, and availability for your engine, see [DB Instance Class](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.html) in the *Amazon RDS User Guide.* For more information about DB instance class pricing and AWS Region support for DB instance classes, see [Amazon RDS Pricing](https://docs.aws.amazon.com/rds/pricing/) .","DBInstanceIdentifier":"A name for the DB instance. If you specify a name, AWS CloudFormation converts it to lowercase. If you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the DB instance. For more information, see [Name Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\nFor information about constraints that apply to DB instance identifiers, see [Naming constraints in Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html#RDS_Limits.Constraints) in the *Amazon RDS User Guide* .\\n\\n> If you specify a name, you can\'t perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","DBName":"The meaning of this parameter differs according to the database engine you use.\\n\\n> If you specify the `[DBSnapshotIdentifier](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#cfn-rds-dbinstance-dbsnapshotidentifier)` property, this property only applies to RDS for Oracle. \\n\\n*Amazon Aurora*\\n\\nNot applicable. The database name is managed by the DB cluster.\\n\\n*MySQL*\\n\\nThe name of the database to create when the DB instance is created. If this parameter is not specified, no database is created in the DB instance.\\n\\nConstraints:\\n\\n- Must contain 1 to 64 letters or numbers.\\n- Can\'t be a word reserved by the specified database engine\\n\\n*MariaDB*\\n\\nThe name of the database to create when the DB instance is created. If this parameter is not specified, no database is created in the DB instance.\\n\\nConstraints:\\n\\n- Must contain 1 to 64 letters or numbers.\\n- Can\'t be a word reserved by the specified database engine\\n\\n*PostgreSQL*\\n\\nThe name of the database to create when the DB instance is created. If this parameter is not specified, the default `postgres` database is created in the DB instance.\\n\\nConstraints:\\n\\n- Must begin with a letter. Subsequent characters can be letters, underscores, or digits (0-9).\\n- Must contain 1 to 63 characters.\\n- Can\'t be a word reserved by the specified database engine\\n\\n*Oracle*\\n\\nThe Oracle System ID (SID) of the created DB instance. If you specify `null` , the default value `ORCL` is used. You can\'t specify the string NULL, or any other reserved word, for `DBName` .\\n\\nDefault: `ORCL`\\n\\nConstraints:\\n\\n- Can\'t be longer than 8 characters\\n\\n*SQL Server*\\n\\nNot applicable. Must be null.","DBParameterGroupName":"The name of an existing DB parameter group or a reference to an [AWS::RDS::DBParameterGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbparametergroup.html) resource created in the template.\\n\\nTo list all of the available DB parameter group names, use the following command:\\n\\n`aws rds describe-db-parameter-groups --query \\"DBParameterGroups[].DBParameterGroupName\\" --output text`\\n\\n> If any of the data members of the referenced parameter group are changed during an update, the DB instance might need to be restarted, which causes some interruption. If the parameter group contains static parameters, whether they were changed or not, an update triggers a reboot. \\n\\nIf you don\'t specify a value for `DBParameterGroupName` property, the default DB parameter group for the specified engine and engine version is used.","DBSecurityGroups":"A list of the DB security groups to assign to the DB instance. The list can include both the name of existing DB security groups or references to AWS::RDS::DBSecurityGroup resources created in the template.\\n\\nIf you set DBSecurityGroups, you must not set VPCSecurityGroups, and vice versa. Also, note that the DBSecurityGroups property exists only for backwards compatibility with older regions and is no longer recommended for providing security information to an RDS DB instance. Instead, use VPCSecurityGroups.\\n\\n> If you specify this property, AWS CloudFormation sends only the following properties (if specified) to Amazon RDS during create operations:\\n> \\n> - `AllocatedStorage`\\n> - `AutoMinorVersionUpgrade`\\n> - `AvailabilityZone`\\n> - `BackupRetentionPeriod`\\n> - `CharacterSetName`\\n> - `DBInstanceClass`\\n> - `DBName`\\n> - `DBParameterGroupName`\\n> - `DBSecurityGroups`\\n> - `DBSubnetGroupName`\\n> - `Engine`\\n> - `EngineVersion`\\n> - `Iops`\\n> - `LicenseModel`\\n> - `MasterUsername`\\n> - `MasterUserPassword`\\n> - `MultiAZ`\\n> - `OptionGroupName`\\n> - `PreferredBackupWindow`\\n> - `PreferredMaintenanceWindow`\\n> \\n> All other properties are ignored. Specify a virtual private cloud (VPC) security group if you want to submit other properties, such as `StorageType` , `StorageEncrypted` , or `KmsKeyId` . If you\'re already using the `DBSecurityGroups` property, you can\'t use these other properties by updating your DB instance to use a VPC security group. You must recreate the DB instance.","DBSnapshotIdentifier":"The name or Amazon Resource Name (ARN) of the DB snapshot that\'s used to restore the DB instance. If you\'re restoring from a shared manual DB snapshot, you must specify the ARN of the snapshot.\\n\\nBy specifying this property, you can create a DB instance from the specified DB snapshot. If the `DBSnapshotIdentifier` property is an empty string or the `AWS::RDS::DBInstance` declaration has no `DBSnapshotIdentifier` property, AWS CloudFormation creates a new database. If the property contains a value (other than an empty string), AWS CloudFormation creates a database from the specified snapshot. If a snapshot with the specified name doesn\'t exist, AWS CloudFormation can\'t create the database and it rolls back the stack.\\n\\nSome DB instance properties aren\'t valid when you restore from a snapshot, such as the `MasterUsername` and `MasterUserPassword` properties. For information about the properties that you can specify, see the `RestoreDBInstanceFromDBSnapshot` action in the *Amazon RDS API Reference* .\\n\\nAfter you restore a DB instance with a `DBSnapshotIdentifier` property, you must specify the same `DBSnapshotIdentifier` property for any future updates to the DB instance. When you specify this property for an update, the DB instance is not restored from the DB snapshot again, and the data in the database is not changed. However, if you don\'t specify the `DBSnapshotIdentifier` property, an empty DB instance is created, and the original DB instance is deleted. If you specify a property that is different from the previous snapshot restore property, a new DB instance is restored from the specified `DBSnapshotIdentifier` property, and the original DB instance is deleted.\\n\\nIf you specify the `DBSnapshotIdentifier` property to restore a DB instance (as opposed to specifying it for DB instance updates), then don\'t specify the following properties:\\n\\n- `CharacterSetName`\\n- `DBClusterIdentifier`\\n- `DBName`\\n- `DeleteAutomatedBackups`\\n- `EnablePerformanceInsights`\\n- `KmsKeyId`\\n- `MasterUsername`\\n- `MasterUserPassword`\\n- `PerformanceInsightsKMSKeyId`\\n- `PerformanceInsightsRetentionPeriod`\\n- `PromotionTier`\\n- `SourceDBInstanceIdentifier`\\n- `SourceRegion`\\n- `StorageEncrypted` (for an encrypted snapshot)\\n- `Timezone`\\n\\n*Amazon Aurora*\\n\\nNot applicable. Snapshot restore is managed by the DB cluster.","DBSubnetGroupName":"A DB subnet group to associate with the DB instance. If you update this value, the new subnet group must be a subnet group in a new VPC.\\n\\nIf there\'s no DB subnet group, then the DB instance isn\'t a VPC DB instance.\\n\\nFor more information about using Amazon RDS in a VPC, see [Using Amazon RDS with Amazon Virtual Private Cloud (VPC)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.html) in the *Amazon RDS User Guide* .\\n\\n*Amazon Aurora*\\n\\nNot applicable. The DB subnet group is managed by the DB cluster. If specified, the setting must match the DB cluster setting.","DeleteAutomatedBackups":"A value that indicates whether to remove automated backups immediately after the DB instance is deleted. This parameter isn\'t case-sensitive. The default is to remove automated backups immediately after the DB instance is deleted.\\n\\n*Amazon Aurora*\\n\\nNot applicable. When you delete a DB cluster, all automated backups for that DB cluster are deleted and can\'t be recovered. Manual DB cluster snapshots of the DB cluster are not deleted.","DeletionProtection":"A value that indicates whether the DB instance has deletion protection enabled. The database can\'t be deleted when deletion protection is enabled. By default, deletion protection is disabled. For more information, see [Deleting a DB Instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_DeleteInstance.html) .\\n\\n*Amazon Aurora*\\n\\nNot applicable. You can enable or disable deletion protection for the DB cluster. For more information, see `CreateDBCluster` . DB instances in a DB cluster can be deleted even when deletion protection is enabled for the DB cluster.","Domain":"The Active Directory directory ID to create the DB instance in. Currently, only Microsoft SQL Server, Oracle, and PostgreSQL DB instances can be created in an Active Directory Domain.\\n\\nFor more information, see [Kerberos Authentication](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/kerberos-authentication.html) in the *Amazon RDS User Guide* .","DomainIAMRoleName":"The name of the IAM role to use when making API calls to the Directory Service.\\n\\nThis setting doesn\'t apply to the following DB instances:\\n\\n- Amazon Aurora (The domain is managed by the DB cluster.)\\n- RDS Custom","EnableCloudwatchLogsExports":"The list of log types that need to be enabled for exporting to CloudWatch Logs. The values in the list depend on the DB engine being used. For more information, see [Publishing Database Logs to Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.html#USER_LogAccess.Procedural.UploadtoCloudWatch) in the *Amazon Relational Database Service User Guide* .\\n\\n*Amazon Aurora*\\n\\nNot applicable. CloudWatch Logs exports are managed by the DB cluster.\\n\\n*MariaDB*\\n\\nValid values: `audit` , `error` , `general` , `slowquery`\\n\\n*Microsoft SQL Server*\\n\\nValid values: `agent` , `error`\\n\\n*MySQL*\\n\\nValid values: `audit` , `error` , `general` , `slowquery`\\n\\n*Oracle*\\n\\nValid values: `alert` , `audit` , `listener` , `trace`\\n\\n*PostgreSQL*\\n\\nValid values: `postgresql` , `upgrade`","EnableIAMDatabaseAuthentication":"A value that indicates whether to enable mapping of AWS Identity and Access Management (IAM) accounts to database accounts. By default, mapping is disabled.\\n\\nThis property is supported for RDS for MariaDB, RDS for MySQL, and RDS for PostgreSQL. For more information, see [IAM Database Authentication for MariaDB, MySQL, and PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html) in the *Amazon RDS User Guide.*\\n\\n*Amazon Aurora*\\n\\nNot applicable. Mapping AWS IAM accounts to database accounts is managed by the DB cluster.","EnablePerformanceInsights":"Specifies whether to enable Performance Insights for the DB instance. For more information, see [Using Amazon Performance Insights](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.html) in the *Amazon RDS User Guide* .\\n\\nThis setting doesn\'t apply to RDS Custom DB instances.","Endpoint":"The connection endpoint for the DB instance.\\n\\n> The endpoint might not be shown for instances with the status of `creating` .","Engine":"The name of the database engine that you want to use for this DB instance.\\n\\n> When you are creating a DB instance, the `Engine` property is required. \\n\\nValid Values:\\n\\n- `aurora-mysql` (for Aurora MySQL DB instances)\\n- `aurora-postgresql` (for Aurora PostgreSQL DB instances)\\n- `custom-oracle-ee` (for RDS Custom for Oracle DB instances)\\n- `custom-oracle-ee-cdb` (for RDS Custom for Oracle DB instances)\\n- `custom-sqlserver-ee` (for RDS Custom for SQL Server DB instances)\\n- `custom-sqlserver-se` (for RDS Custom for SQL Server DB instances)\\n- `custom-sqlserver-web` (for RDS Custom for SQL Server DB instances)\\n- `mariadb`\\n- `mysql`\\n- `oracle-ee`\\n- `oracle-ee-cdb`\\n- `oracle-se2`\\n- `oracle-se2-cdb`\\n- `postgres`\\n- `sqlserver-ee`\\n- `sqlserver-se`\\n- `sqlserver-ex`\\n- `sqlserver-web`","EngineVersion":"The version number of the database engine to use.\\n\\nFor a list of valid engine versions, use the `DescribeDBEngineVersions` action.\\n\\nThe following are the database engines and links to information about the major and minor versions that are available with Amazon RDS. Not every database engine is available for every AWS Region.\\n\\n*Amazon Aurora*\\n\\nNot applicable. The version number of the database engine to be used by the DB instance is managed by the DB cluster.\\n\\n*MariaDB*\\n\\nSee [MariaDB on Amazon RDS Versions](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_MariaDB.html#MariaDB.Concepts.VersionMgmt) in the *Amazon RDS User Guide.*\\n\\n*Microsoft SQL Server*\\n\\nSee [Microsoft SQL Server Versions on Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_SQLServer.html#SQLServer.Concepts.General.VersionSupport) in the *Amazon RDS User Guide.*\\n\\n*MySQL*\\n\\nSee [MySQL on Amazon RDS Versions](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_MySQL.html#MySQL.Concepts.VersionMgmt) in the *Amazon RDS User Guide.*\\n\\n*Oracle*\\n\\nSee [Oracle Database Engine Release Notes](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.Oracle.PatchComposition.html) in the *Amazon RDS User Guide.*\\n\\n*PostgreSQL*\\n\\nSee [Supported PostgreSQL Database Versions](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts.General.DBVersions) in the *Amazon RDS User Guide.*","Iops":"The number of I/O operations per second (IOPS) that the database provisions. The value must be equal to or greater than 1000.\\n\\nIf you specify this property, you must follow the range of allowed ratios of your requested IOPS rate to the amount of storage that you allocate (IOPS to allocated storage). For example, you can provision an Oracle database instance with 1000 IOPS and 200 GiB of storage (a ratio of 5:1), or specify 2000 IOPS with 200 GiB of storage (a ratio of 10:1). For more information, see [Amazon RDS Provisioned IOPS Storage to Improve Performance](https://docs.aws.amazon.com/AmazonRDS/latest/DeveloperGuide/CHAP_Storage.html#USER_PIOPS) in the *Amazon RDS User Guide* .\\n\\n> If you specify `io1` for the `StorageType` property, then you must also specify the `Iops` property.","KmsKeyId":"The ARN of the AWS KMS key that\'s used to encrypt the DB instance, such as `arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef` . If you enable the StorageEncrypted property but don\'t specify this property, AWS CloudFormation uses the default KMS key. If you specify this property, you must set the StorageEncrypted property to true.\\n\\nIf you specify the `SourceDBInstanceIdentifier` property, the value is inherited from the source DB instance if the read replica is created in the same region.\\n\\nIf you create an encrypted read replica in a different AWS Region, then you must specify a KMS key for the destination AWS Region. KMS encryption keys are specific to the region that they\'re created in, and you can\'t use encryption keys from one region in another region.\\n\\nIf you specify the `SnapshotIdentifier` property, the `StorageEncrypted` property value is inherited from the snapshot, and if the DB instance is encrypted, the specified `KmsKeyId` property is used.\\n\\nIf you specify `DBSecurityGroups` , AWS CloudFormation ignores this property. To specify both a security group and this property, you must use a VPC security group. For more information about Amazon RDS and VPC, see [Using Amazon RDS with Amazon VPC](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.html) in the *Amazon RDS User Guide* .\\n\\n*Amazon Aurora*\\n\\nNot applicable. The KMS key identifier is managed by the DB cluster.","LicenseModel":"License model information for this DB instance.\\n\\nValid values:\\n\\n- Aurora MySQL - `general-public-license`\\n- Aurora PostgreSQL - `postgresql-license`\\n- MariaDB - `general-public-license`\\n- Microsoft SQL Server - `license-included`\\n- MySQL - `general-public-license`\\n- Oracle - `bring-your-own-license` or `license-included`\\n- PostgreSQL - `postgresql-license`\\n\\n> If you\'ve specified `DBSecurityGroups` and then you update the license model, AWS CloudFormation replaces the underlying DB instance. This will incur some interruptions to database availability.","ManageMasterUserPassword":"Specifies whether to manage the master user password with AWS Secrets Manager.\\n\\nFor more information, see [Password management with AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) in the *Amazon RDS User Guide.*\\n\\nConstraints:\\n\\n- Can\'t manage the master user password with AWS Secrets Manager if `MasterUserPassword` is specified.","MasterUserPassword":"The password for the master user. The password can include any printable ASCII character except \\"/\\", \\"\\"\\", or \\"@\\".\\n\\n*Amazon Aurora*\\n\\nNot applicable. The password for the master user is managed by the DB cluster.\\n\\n*MariaDB*\\n\\nConstraints: Must contain from 8 to 41 characters.\\n\\n*Microsoft SQL Server*\\n\\nConstraints: Must contain from 8 to 128 characters.\\n\\n*MySQL*\\n\\nConstraints: Must contain from 8 to 41 characters.\\n\\n*Oracle*\\n\\nConstraints: Must contain from 8 to 30 characters.\\n\\n*PostgreSQL*\\n\\nConstraints: Must contain from 8 to 128 characters.","MasterUserSecret":"The secret managed by RDS in AWS Secrets Manager for the master user password.\\n\\nFor more information, see [Password management with AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) in the *Amazon RDS User Guide.*","MasterUsername":"The master user name for the DB instance.\\n\\n> If you specify the `SourceDBInstanceIdentifier` or `DBSnapshotIdentifier` property, don\'t specify this property. The value is inherited from the source DB instance or snapshot. \\n\\n*Amazon Aurora*\\n\\nNot applicable. The name for the master user is managed by the DB cluster.\\n\\n*MariaDB*\\n\\nConstraints:\\n\\n- Required for MariaDB.\\n- Must be 1 to 16 letters or numbers.\\n- Can\'t be a reserved word for the chosen database engine.\\n\\n*Microsoft SQL Server*\\n\\nConstraints:\\n\\n- Required for SQL Server.\\n- Must be 1 to 128 letters or numbers.\\n- The first character must be a letter.\\n- Can\'t be a reserved word for the chosen database engine.\\n\\n*MySQL*\\n\\nConstraints:\\n\\n- Required for MySQL.\\n- Must be 1 to 16 letters or numbers.\\n- First character must be a letter.\\n- Can\'t be a reserved word for the chosen database engine.\\n\\n*Oracle*\\n\\nConstraints:\\n\\n- Required for Oracle.\\n- Must be 1 to 30 letters or numbers.\\n- First character must be a letter.\\n- Can\'t be a reserved word for the chosen database engine.\\n\\n*PostgreSQL*\\n\\nConstraints:\\n\\n- Required for PostgreSQL.\\n- Must be 1 to 63 letters or numbers.\\n- First character must be a letter.\\n- Can\'t be a reserved word for the chosen database engine.","MaxAllocatedStorage":"The upper limit in gibibytes (GiB) to which Amazon RDS can automatically scale the storage of the DB instance.\\n\\nFor more information about this setting, including limitations that apply to it, see [Managing capacity automatically with Amazon RDS storage autoscaling](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PIOPS.StorageTypes.html#USER_PIOPS.Autoscaling) in the *Amazon RDS User Guide* .\\n\\nThis setting doesn\'t apply to the following DB instances:\\n\\n- Amazon Aurora (Storage is managed by the DB cluster.)\\n- RDS Custom","MonitoringInterval":"The interval, in seconds, between points when Enhanced Monitoring metrics are collected for the DB instance. To disable collection of Enhanced Monitoring metrics, specify 0. The default is 0.\\n\\nIf `MonitoringRoleArn` is specified, then you must set `MonitoringInterval` to a value other than 0.\\n\\nThis setting doesn\'t apply to RDS Custom.\\n\\nValid Values: `0, 1, 5, 10, 15, 30, 60`","MonitoringRoleArn":"The ARN for the IAM role that permits RDS to send enhanced monitoring metrics to Amazon CloudWatch Logs. For example, `arn:aws:iam:123456789012:role/emaccess` . For information on creating a monitoring role, see [Setting Up and Enabling Enhanced Monitoring](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Monitoring.OS.html#USER_Monitoring.OS.Enabling) in the *Amazon RDS User Guide* .\\n\\nIf `MonitoringInterval` is set to a value other than `0` , then you must supply a `MonitoringRoleArn` value.\\n\\nThis setting doesn\'t apply to RDS Custom DB instances.","MultiAZ":"Specifies whether the database instance is a Multi-AZ DB instance deployment. You can\'t set the `AvailabilityZone` parameter if the `MultiAZ` parameter is set to true.\\n\\nFor more information, see [Multi-AZ deployments for high availability](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html) in the *Amazon RDS User Guide* .\\n\\n*Amazon Aurora*\\n\\nNot applicable. Amazon Aurora storage is replicated across all of the Availability Zones and doesn\'t require the `MultiAZ` option to be set.","NcharCharacterSetName":"The name of the NCHAR character set for the Oracle DB instance.\\n\\nThis setting doesn\'t apply to RDS Custom DB instances.","NetworkType":"The network type of the DB instance.\\n\\nValid values:\\n\\n- `IPV4`\\n- `DUAL`\\n\\nThe network type is determined by the `DBSubnetGroup` specified for the DB instance. A `DBSubnetGroup` can support only the IPv4 protocol or the IPv4 and IPv6 protocols ( `DUAL` ).\\n\\nFor more information, see [Working with a DB instance in a VPC](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html) in the *Amazon RDS User Guide.*","OptionGroupName":"Indicates that the DB instance should be associated with the specified option group.\\n\\nPermanent options, such as the TDE option for Oracle Advanced Security TDE, can\'t be removed from an option group. Also, that option group can\'t be removed from a DB instance once it is associated with a DB instance.","PerformanceInsightsKMSKeyId":"The AWS KMS key identifier for encryption of Performance Insights data.\\n\\nThe KMS key identifier is the key ARN, key ID, alias ARN, or alias name for the KMS key.\\n\\nIf you do not specify a value for `PerformanceInsightsKMSKeyId` , then Amazon RDS uses your default KMS key. There is a default KMS key for your AWS account. Your AWS account has a different default KMS key for each AWS Region.\\n\\nFor information about enabling Performance Insights, see [EnablePerformanceInsights](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#cfn-rds-dbinstance-enableperformanceinsights) .","PerformanceInsightsRetentionPeriod":"The number of days to retain Performance Insights data.\\n\\nThis setting doesn\'t apply to RDS Custom DB instances.\\n\\nValid Values:\\n\\n- `7`\\n- *month* * 31, where *month* is a number of months from 1-23. Examples: `93` (3 months * 31), `341` (11 months * 31), `589` (19 months * 31)\\n- `731`\\n\\nDefault: `7` days\\n\\nIf you specify a retention period that isn\'t valid, such as `94` , Amazon RDS returns an error.","Port":"The port number on which the database accepts connections.\\n\\n*Amazon Aurora*\\n\\nNot applicable. The port number is managed by the DB cluster.","PreferredBackupWindow":"The daily time range during which automated backups are created if automated backups are enabled, using the `BackupRetentionPeriod` parameter. For more information, see [Backup Window](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html#USER_WorkingWithAutomatedBackups.BackupWindow) in the *Amazon RDS User Guide.*\\n\\nConstraints:\\n\\n- Must be in the format `hh24:mi-hh24:mi` .\\n- Must be in Universal Coordinated Time (UTC).\\n- Must not conflict with the preferred maintenance window.\\n- Must be at least 30 minutes.\\n\\n*Amazon Aurora*\\n\\nNot applicable. The daily time range for creating automated backups is managed by the DB cluster.","PreferredMaintenanceWindow":"The weekly time range during which system maintenance can occur, in Universal Coordinated Time (UTC).\\n\\nFormat: `ddd:hh24:mi-ddd:hh24:mi`\\n\\nThe default is a 30-minute window selected at random from an 8-hour block of time for each AWS Region, occurring on a random day of the week. To see the time blocks available, see [Adjusting the Preferred DB Instance Maintenance Window](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Maintenance.html#AdjustingTheMaintenanceWindow) in the *Amazon RDS User Guide.*\\n\\n> This property applies when AWS CloudFormation initially creates the DB instance. If you use AWS CloudFormation to update the DB instance, those updates are applied immediately. \\n\\nConstraints: Minimum 30-minute window.","ProcessorFeatures":"The number of CPU cores and the number of threads per core for the DB instance class of the DB instance.\\n\\nThis setting doesn\'t apply to Amazon Aurora or RDS Custom DB instances.","PromotionTier":"The order of priority in which an Aurora Replica is promoted to the primary instance after a failure of the existing primary instance. For more information, see [Fault Tolerance for an Aurora DB Cluster](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.AuroraHighAvailability.html#Aurora.Managing.FaultTolerance) in the *Amazon Aurora User Guide* .\\n\\nThis setting doesn\'t apply to RDS Custom DB instances.\\n\\nDefault: `1`\\n\\nValid Values: `0 - 15`","PubliclyAccessible":"Indicates whether the DB instance is an internet-facing instance. If you specify true, AWS CloudFormation creates an instance with a publicly resolvable DNS name, which resolves to a public IP address. If you specify false, AWS CloudFormation creates an internal instance with a DNS name that resolves to a private IP address.\\n\\nThe default behavior value depends on your VPC setup and the database subnet group. For more information, see the `PubliclyAccessible` parameter in the [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html) in the *Amazon RDS API Reference* .","ReplicaMode":"The open mode of an Oracle read replica. For more information, see [Working with Oracle Read Replicas for Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/oracle-read-replicas.html) in the *Amazon RDS User Guide* .\\n\\nThis setting is only supported in RDS for Oracle.\\n\\nDefault: `open-read-only`\\n\\nValid Values: `open-read-only` or `mounted`","RestoreTime":"The date and time to restore from.\\n\\nValid Values: Value must be a time in Universal Coordinated Time (UTC) format\\n\\nConstraints:\\n\\n- Must be before the latest restorable time for the DB instance\\n- Can\'t be specified if the `UseLatestRestorableTime` parameter is enabled\\n\\nExample: `2009-09-07T23:45:00Z`","SourceDBClusterIdentifier":"The identifier of the Multi-AZ DB cluster that will act as the source for the read replica. Each DB cluster can have up to 15 read replicas.\\n\\nConstraints:\\n\\n- Must be the identifier of an existing Multi-AZ DB cluster.\\n- Can\'t be specified if the `SourceDBInstanceIdentifier` parameter is also specified.\\n- The specified DB cluster must have automatic backups enabled, that is, its backup retention period must be greater than 0.\\n- The source DB cluster must be in the same AWS Region as the read replica. Cross-Region replication isn\'t supported.","SourceDBInstanceAutomatedBackupsArn":"The Amazon Resource Name (ARN) of the replicated automated backups from which to restore, for example, `arn:aws:rds:useast-1:123456789012:auto-backup:ab-L2IJCEXJP7XQ7HOJ4SIEXAMPLE` .\\n\\nThis setting doesn\'t apply to RDS Custom.","SourceDBInstanceIdentifier":"If you want to create a read replica DB instance, specify the ID of the source DB instance. Each DB instance can have a limited number of read replicas. For more information, see [Working with Read Replicas](https://docs.aws.amazon.com/AmazonRDS/latest/DeveloperGuide/USER_ReadRepl.html) in the *Amazon RDS User Guide* .\\n\\nFor information about constraints that apply to DB instance identifiers, see [Naming constraints in Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html#RDS_Limits.Constraints) in the *Amazon RDS User Guide* .\\n\\nThe `SourceDBInstanceIdentifier` property determines whether a DB instance is a read replica. If you remove the `SourceDBInstanceIdentifier` property from your template and then update your stack, AWS CloudFormation promotes the Read Replica to a standalone DB instance.\\n\\n> - If you specify a source DB instance that uses VPC security groups, we recommend that you specify the `VPCSecurityGroups` property. If you don\'t specify the property, the read replica inherits the value of the `VPCSecurityGroups` property from the source DB when you create the replica. However, if you update the stack, AWS CloudFormation reverts the replica\'s `VPCSecurityGroups` property to the default value because it\'s not defined in the stack\'s template. This change might cause unexpected issues.\\n> - Read replicas don\'t support deletion policies. AWS CloudFormation ignores any deletion policy that\'s associated with a read replica.\\n> - If you specify `SourceDBInstanceIdentifier` , don\'t specify the `DBSnapshotIdentifier` property. You can\'t create a read replica from a snapshot.\\n> - Don\'t set the `BackupRetentionPeriod` , `DBName` , `MasterUsername` , `MasterUserPassword` , and `PreferredBackupWindow` properties. The database attributes are inherited from the source DB instance, and backups are disabled for read replicas.\\n> - If the source DB instance is in a different region than the read replica, specify the source region in `SourceRegion` , and specify an ARN for a valid DB instance in `SourceDBInstanceIdentifier` . For more information, see [Constructing a Amazon RDS Amazon Resource Name (ARN)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Tagging.html#USER_Tagging.ARN) in the *Amazon RDS User Guide* .\\n> - For DB instances in Amazon Aurora clusters, don\'t specify this property. Amazon RDS automatically assigns writer and reader DB instances.","SourceDbiResourceId":"The resource ID of the source DB instance from which to restore.","SourceRegion":"The ID of the region that contains the source DB instance for the read replica.","StorageEncrypted":"A value that indicates whether the DB instance is encrypted. By default, it isn\'t encrypted.\\n\\nIf you specify the `KmsKeyId` property, then you must enable encryption.\\n\\nIf you specify the `SourceDBInstanceIdentifier` property, don\'t specify this property. The value is inherited from the source DB instance, and if the DB instance is encrypted, the specified `KmsKeyId` property is used.\\n\\nIf you specify the `SnapshotIdentifier` and the specified snapshot is encrypted, don\'t specify this property. The value is inherited from the snapshot, and the specified `KmsKeyId` property is used.\\n\\nIf you specify the `SnapshotIdentifier` and the specified snapshot isn\'t encrypted, you can use this property to specify that the restored DB instance is encrypted. Specify the `KmsKeyId` property for the KMS key to use for encryption. If you don\'t want the restored DB instance to be encrypted, then don\'t set this property or set it to `false` .\\n\\n*Amazon Aurora*\\n\\nNot applicable. The encryption for DB instances is managed by the DB cluster.","StorageThroughput":"Specifies the storage throughput value for the DB instance. This setting applies only to the `gp3` storage type.\\n\\nThis setting doesn\'t apply to RDS Custom or Amazon Aurora.","StorageType":"Specifies the storage type to be associated with the DB instance.\\n\\nValid values: `gp2 | gp3 | io1 | standard`\\n\\nThe `standard` value is also known as magnetic.\\n\\nIf you specify `io1` or `gp3` , you must also include a value for the `Iops` parameter.\\n\\nDefault: `io1` if the `Iops` parameter is specified, otherwise `gp2`\\n\\nFor more information, see [Amazon RDS DB Instance Storage](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html) in the *Amazon RDS User Guide* .\\n\\n*Amazon Aurora*\\n\\nNot applicable. Aurora data is stored in the cluster volume, which is a single, virtual volume that uses solid state drives (SSDs).","Tags":"An optional array of key-value pairs to apply to this DB instance.","Timezone":"The time zone of the DB instance. The time zone parameter is currently supported only by [Microsoft SQL Server](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_SQLServer.html#SQLServer.Concepts.General.TimeZone) .","UseDefaultProcessorFeatures":"Specifies whether the DB instance class of the DB instance uses its default processor features.\\n\\nThis setting doesn\'t apply to RDS Custom DB instances.","UseLatestRestorableTime":"A value that indicates whether the DB instance is restored from the latest backup time. By default, the DB instance isn\'t restored from the latest backup time.\\n\\nConstraints: Can\'t be specified if the `RestoreTime` parameter is provided.","VPCSecurityGroups":"A list of the VPC security group IDs to assign to the DB instance. The list can include both the physical IDs of existing VPC security groups and references to [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html) resources created in the template.\\n\\nIf you plan to update the resource, don\'t specify VPC security groups in a shared VPC.\\n\\nIf you set `VPCSecurityGroups` , you must not set [`DBSecurityGroups`](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#cfn-rds-dbinstance-dbsecuritygroups) , and vice versa.\\n\\n> You can migrate a DB instance in your stack from an RDS DB security group to a VPC security group, but keep the following in mind:\\n> \\n> - You can\'t revert to using an RDS security group after you establish a VPC security group membership.\\n> - When you migrate your DB instance to VPC security groups, if your stack update rolls back because the DB instance update fails or because an update fails in another AWS CloudFormation resource, the rollback fails because it can\'t revert to an RDS security group.\\n> - To use the properties that are available when you use a VPC security group, you must recreate the DB instance. If you don\'t, AWS CloudFormation submits only the property values that are listed in the [`DBSecurityGroups`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html#cfn-rds-dbinstance-dbsecuritygroups) property. \\n\\nTo avoid this situation, migrate your DB instance to using VPC security groups only when that is the only change in your stack template.\\n\\n*Amazon Aurora*\\n\\nNot applicable. The associated list of EC2 VPC security groups is managed by the DB cluster. If specified, the setting must match the DB cluster setting."}},"AWS::RDS::DBInstance.CertificateDetails":{"attributes":{},"description":"Returns the details of the DB instance’s server certificate.\\n\\nFor more information, see [Using SSL/TLS to encrypt a connection to a DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html) in the *Amazon RDS User Guide* and [Using SSL/TLS to encrypt a connection to a DB cluster](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.SSL.html) in the *Amazon Aurora User Guide* .","properties":{"CAIdentifier":"The CA identifier of the CA certificate used for the DB instance\'s server certificate.","ValidTill":"The expiration date of the DB instance’s server certificate."}},"AWS::RDS::DBInstance.DBInstanceRole":{"attributes":{},"description":"Describes an AWS Identity and Access Management (IAM) role that is associated with a DB instance.","properties":{"FeatureName":"The name of the feature associated with the AWS Identity and Access Management (IAM) role. IAM roles that are associated with a DB instance grant permission for the DB instance to access other AWS services on your behalf. For the list of supported feature names, see the `SupportedFeatureNames` description in [DBEngineVersion](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DBEngineVersion.html) in the *Amazon RDS API Reference* .","RoleArn":"The Amazon Resource Name (ARN) of the IAM role that is associated with the DB instance."}},"AWS::RDS::DBInstance.Endpoint":{"attributes":{},"description":"This data type represents the information you need to connect to an Amazon RDS DB instance. This data type is used as a response element in the following actions:\\n\\n- `CreateDBInstance`\\n- `DescribeDBInstances`\\n- `DeleteDBInstance`\\n\\nFor the data structure that represents Amazon Aurora DB cluster endpoints, see `DBClusterEndpoint` .","properties":{"Address":"Specifies the DNS address of the DB instance.","HostedZoneId":"Specifies the ID that Amazon Route 53 assigns when you create a hosted zone.","Port":"Specifies the port that the database engine is listening on."}},"AWS::RDS::DBInstance.MasterUserSecret":{"attributes":{},"description":"The `MasterUserSecret` return value specifies the secret managed by RDS in AWS Secrets Manager for the master user password.\\n\\nFor more information, see [Password management with AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) in the *Amazon RDS User Guide* and [Password management with AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html) in the *Amazon Aurora User Guide.*","properties":{"KmsKeyId":"The AWS KMS key identifier that is used to encrypt the secret.","SecretArn":"The Amazon Resource Name (ARN) of the secret."}},"AWS::RDS::DBInstance.ProcessorFeature":{"attributes":{},"description":"The `ProcessorFeature` property type specifies the processor features of a DB instance class status.","properties":{"Name":"The name of the processor feature. Valid names are `coreCount` and `threadsPerCore` .","Value":"The value of a processor feature name."}},"AWS::RDS::DBParameterGroup":{"attributes":{"DBParameterGroupName":"The name of the DB parameter group.","Ref":"`Ref` returns the name of the DB parameter group."},"description":"The `AWS::RDS::DBParameterGroup` resource creates a custom parameter group for an RDS database family.\\n\\nThis type can be declared in a template and referenced in the `DBParameterGroupName` property of an `[AWS::RDS::DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html)` resource.\\n\\nFor information about configuring parameters for Amazon RDS DB instances, see [Working with parameter groups](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html) in the *Amazon RDS User Guide* .\\n\\nFor information about configuring parameters for Amazon Aurora DB instances, see [Working with parameter groups](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_WorkingWithParamGroups.html) in the *Amazon Aurora User Guide* .\\n\\n> Applying a parameter group to a DB instance may require the DB instance to reboot, resulting in a database outage for the duration of the reboot.","properties":{"DBParameterGroupName":"The name of the DB parameter group.\\n\\nConstraints:\\n\\n- Must be 1 to 255 letters, numbers, or hyphens.\\n- First character must be a letter\\n- Can\'t end with a hyphen or contain two consecutive hyphens\\n\\nIf you don\'t specify a value for `DBParameterGroupName` property, a name is automatically created for the DB parameter group.\\n\\n> This value is stored as a lowercase string.","Description":"Provides the customer-specified description for this DB parameter group.","Family":"The DB parameter group family name. A DB parameter group can be associated with one and only one DB parameter group family, and can be applied only to a DB instance running a DB engine and engine version compatible with that DB parameter group family.\\n\\n> The DB parameter group family can\'t be changed when updating a DB parameter group. \\n\\nTo list all of the available parameter group families, use the following command:\\n\\n`aws rds describe-db-engine-versions --query \\"DBEngineVersions[].DBParameterGroupFamily\\"`\\n\\nThe output contains duplicates.\\n\\nFor more information, see `[CreateDBParameterGroup](https://docs.aws.amazon.com//AmazonRDS/latest/APIReference/API_CreateDBParameterGroup.html)` .","Parameters":"An array of parameter names and values for the parameter update. At least one parameter name and value must be supplied. Subsequent arguments are optional.\\n\\nFor more information about DB parameters and DB parameter groups for Amazon RDS DB engines, see [Working with DB Parameter Groups](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html) in the *Amazon RDS User Guide* .\\n\\nFor more information about DB cluster and DB instance parameters and parameter groups for Amazon Aurora DB engines, see [Working with DB Parameter Groups and DB Cluster Parameter Groups](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_WorkingWithParamGroups.html) in the *Amazon Aurora User Guide* .\\n\\n> AWS CloudFormation doesn\'t support specifying an apply method for each individual parameter. The default apply method for each parameter is used.","Tags":"An optional array of key-value pairs to apply to this DB parameter group.\\n\\n> Currently, this is the only property that supports drift detection."}},"AWS::RDS::DBProxy":{"attributes":{"DBProxyArn":"The Amazon Resource Name (ARN) representing the target group.","Endpoint":"The writer endpoint for the RDS DB instance or Aurora DB cluster.","Ref":"`Ref` returns the name of the DB proxy.","VpcId":"The VPC ID to associate with the DB proxy."},"description":"The `AWS::RDS::DBProxy` resource creates or updates a DB proxy.\\n\\nFor information about RDS Proxy for Amazon RDS, see [Managing Connections with Amazon RDS Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.html) in the *Amazon RDS User Guide* .\\n\\nFor information about RDS Proxy for Amazon Aurora, see [Managing Connections with Amazon RDS Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy.html) in the *Amazon Aurora User Guide* .\\n\\n> Limitations apply to RDS Proxy, including DB engine version limitations and AWS Region limitations.\\n> \\n> For information about limitations that apply to RDS Proxy for Amazon RDS, see [Limitations for RDS Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.html#rds-proxy.limitations) in the *Amazon RDS User Guide* .\\n> \\n> For information about that apply to RDS Proxy for Amazon Aurora, see [Limitations for RDS Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy.html#rds-proxy.limitations) in the *Amazon Aurora User Guide* .","properties":{"Auth":"The authorization mechanism that the proxy uses.","DBProxyName":"The identifier for the proxy. This name must be unique for all proxies owned by your AWS account in the specified AWS Region . An identifier must begin with a letter and must contain only ASCII letters, digits, and hyphens; it can\'t end with a hyphen or contain two consecutive hyphens.","DebugLogging":"Whether the proxy includes detailed information about SQL statements in its logs. This information helps you to debug issues involving SQL behavior or the performance and scalability of the proxy connections. The debug information includes the text of SQL statements that you submit through the proxy. Thus, only enable this setting when needed for debugging, and only when you have security measures in place to safeguard any sensitive information that appears in the logs.","EngineFamily":"The kinds of databases that the proxy can connect to. This value determines which database network protocol the proxy recognizes when it interprets network traffic to and from the database. For Aurora MySQL, RDS for MariaDB, and RDS for MySQL databases, specify `MYSQL` . For Aurora PostgreSQL and RDS for PostgreSQL databases, specify `POSTGRESQL` . For RDS for Microsoft SQL Server, specify `SQLSERVER` .\\n\\n*Valid values* : `MYSQL` | `POSTGRESQL` | `SQLSERVER`","IdleClientTimeout":"The number of seconds that a connection to the proxy can be inactive before the proxy disconnects it. You can set this value higher or lower than the connection timeout limit for the associated database.","RequireTLS":"A Boolean parameter that specifies whether Transport Layer Security (TLS) encryption is required for connections to the proxy. By enabling this setting, you can enforce encrypted TLS connections to the proxy.","RoleArn":"The Amazon Resource Name (ARN) of the IAM role that the proxy uses to access secrets in AWS Secrets Manager.","Tags":"An optional set of key-value pairs to associate arbitrary data of your choosing with the proxy.","VpcSecurityGroupIds":"One or more VPC security group IDs to associate with the new proxy.\\n\\nIf you plan to update the resource, don\'t specify VPC security groups in a shared VPC.","VpcSubnetIds":"One or more VPC subnet IDs to associate with the new proxy."}},"AWS::RDS::DBProxy.AuthFormat":{"attributes":{},"description":"Specifies the details of authentication used by a proxy to log in as a specific database user.","properties":{"AuthScheme":"The type of authentication that the proxy uses for connections from the proxy to the underlying database.\\n\\nValid Values: `SECRETS`","ClientPasswordAuthType":"Specifies the details of authentication used by a proxy to log in as a specific database user.","Description":"A user-specified description about the authentication used by a proxy to log in as a specific database user.","IAMAuth":"Whether to require or disallow AWS Identity and Access Management (IAM) authentication for connections to the proxy. The `ENABLED` value is valid only for proxies with RDS for Microsoft SQL Server.\\n\\nValid Values: `ENABLED | DISABLED | REQUIRED`","SecretArn":"The Amazon Resource Name (ARN) representing the secret that the proxy uses to authenticate to the RDS DB instance or Aurora DB cluster. These secrets are stored within Amazon Secrets Manager."}},"AWS::RDS::DBProxy.TagFormat":{"attributes":{},"description":"Metadata assigned to a DB proxy consisting of a key-value pair.","properties":{"Key":"A key is the required name of the tag. The string value can be 1-128 Unicode characters in length and can\'t be prefixed with `aws:` . The string can contain only the set of Unicode letters, digits, white-space, \'_\', \'.\', \'/\', \'=\', \'+\', \'-\' (Java regex: \\"^([\\\\\\\\p{L}\\\\\\\\p{Z}\\\\\\\\p{N}_.:/=+\\\\\\\\-]*)$\\").","Value":"A value is the optional value of the tag. The string value can be 1-256 Unicode characters in length and can\'t be prefixed with `aws:` . The string can contain only the set of Unicode letters, digits, white-space, \'_\', \'.\', \'/\', \'=\', \'+\', \'-\' (Java regex: \\"^([\\\\\\\\p{L}\\\\\\\\p{Z}\\\\\\\\p{N}_.:/=+\\\\\\\\-]*)$\\")."}},"AWS::RDS::DBProxyEndpoint":{"attributes":{"DBProxyEndpointArn":"The Amazon Resource Name (ARN) representing the DB proxy endpoint.","Endpoint":"The custom endpoint for the RDS DB instance or Aurora DB cluster.","IsDefault":"A value that indicates whether this endpoint is the default endpoint for the associated DB proxy. Default DB proxy endpoints always have read/write capability. Other endpoints that you associate with the DB proxy can be either read/write or read-only.","Ref":"`Ref` returns the name of the DB proxy endpoint.","VpcId":"The VPC ID of the DB proxy endpoint."},"description":"The `AWS::RDS::DBProxyEndpoint` resource creates or updates a DB proxy endpoint. You can use custom proxy endpoints to access a proxy through a different VPC than the proxy\'s default VPC.\\n\\nFor more information about RDS Proxy, see [AWS::RDS::DBProxy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html) .","properties":{"DBProxyEndpointName":"The name of the DB proxy endpoint to create.","DBProxyName":"The name of the DB proxy associated with the DB proxy endpoint that you create.","Tags":"An optional set of key-value pairs to associate arbitrary data of your choosing with the proxy.","TargetRole":"A value that indicates whether the DB proxy endpoint can be used for read/write or read-only operations.\\n\\nValid Values: `READ_WRITE | READ_ONLY`","VpcSecurityGroupIds":"The VPC security group IDs for the DB proxy endpoint that you create. You can specify a different set of security group IDs than for the original DB proxy. The default is the default security group for the VPC.","VpcSubnetIds":"The VPC subnet IDs for the DB proxy endpoint that you create. You can specify a different set of subnet IDs than for the original DB proxy."}},"AWS::RDS::DBProxyEndpoint.TagFormat":{"attributes":{},"description":"Metadata assigned to a DB proxy endpoint consisting of a key-value pair.","properties":{"Key":"A value is the optional value of the tag. The string value can be 1-256 Unicode characters in length and can\'t be prefixed with `aws:` . The string can contain only the set of Unicode letters, digits, white-space, \'_\', \'.\', \'/\', \'=\', \'+\', \'-\' (Java regex: \\"^([\\\\\\\\p{L}\\\\\\\\p{Z}\\\\\\\\p{N}_.:/=+\\\\\\\\-]*)$\\").","Value":"Metadata assigned to a DB instance consisting of a key-value pair."}},"AWS::RDS::DBProxyTargetGroup":{"attributes":{"Ref":"`Ref` returns the ARN of the target group.","TargetGroupArn":"The Amazon Resource Name (ARN) representing the target group."},"description":"The `AWS::RDS::DBProxyTargetGroup` resource represents a set of RDS DB instances, Aurora DB clusters, or both that a proxy can connect to. Currently, each target group is associated with exactly one RDS DB instance or Aurora DB cluster.\\n\\nThis data type is used as a response element in the `DescribeDBProxyTargetGroups` action.\\n\\nFor information about RDS Proxy for Amazon RDS, see [Managing Connections with Amazon RDS Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.html) in the *Amazon RDS User Guide* .\\n\\nFor information about RDS Proxy for Amazon Aurora, see [Managing Connections with Amazon RDS Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy.html) in the *Amazon Aurora User Guide* .\\n\\nFor a sample template that creates a DB proxy and registers a DB instance, see [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html#aws-resource-rds-dbproxy--examples) in AWS::RDS::DBProxy.\\n\\n> Limitations apply to RDS Proxy, including DB engine version limitations and AWS Region limitations.\\n> \\n> For information about limitations that apply to RDS Proxy for Amazon RDS, see [Limitations for RDS Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.html#rds-proxy.limitations) in the *Amazon RDS User Guide* .\\n> \\n> For information about that apply to RDS Proxy for Amazon Aurora, see [Limitations for RDS Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy.html#rds-proxy.limitations) in the *Amazon Aurora User Guide* .","properties":{"ConnectionPoolConfigurationInfo":"Settings that control the size and behavior of the connection pool associated with a `DBProxyTargetGroup` .","DBClusterIdentifiers":"One or more DB cluster identifiers.","DBInstanceIdentifiers":"One or more DB instance identifiers.","DBProxyName":"The identifier of the `DBProxy` that is associated with the `DBProxyTargetGroup` .","TargetGroupName":"The identifier for the target group.\\n\\n> Currently, this property must be set to `default` ."}},"AWS::RDS::DBProxyTargetGroup.ConnectionPoolConfigurationInfoFormat":{"attributes":{},"description":"Specifies the settings that control the size and behavior of the connection pool associated with a `DBProxyTargetGroup` .","properties":{"ConnectionBorrowTimeout":"The number of seconds for a proxy to wait for a connection to become available in the connection pool. Only applies when the proxy has opened its maximum number of connections and all connections are busy with client sessions.\\n\\nDefault: 120\\n\\nConstraints: between 1 and 3600, or 0 representing unlimited","InitQuery":"One or more SQL statements for the proxy to run when opening each new database connection. Typically used with `SET` statements to make sure that each connection has identical settings such as time zone and character set. For multiple statements, use semicolons as the separator. You can also include multiple variables in a single `SET` statement, such as `SET x=1, y=2` .\\n\\nDefault: no initialization query","MaxConnectionsPercent":"The maximum size of the connection pool for each target in a target group. The value is expressed as a percentage of the `max_connections` setting for the RDS DB instance or Aurora DB cluster used by the target group.\\n\\nIf you specify `MaxIdleConnectionsPercent` , then you must also include a value for this parameter.\\n\\nDefault: 10 for RDS for Microsoft SQL Server, and 100 for all other engines\\n\\nConstraints: Must be between 1 and 100.","MaxIdleConnectionsPercent":"Controls how actively the proxy closes idle database connections in the connection pool. The value is expressed as a percentage of the `max_connections` setting for the RDS DB instance or Aurora DB cluster used by the target group. With a high value, the proxy leaves a high percentage of idle database connections open. A low value causes the proxy to close more idle connections and return them to the database.\\n\\nIf you specify this parameter, then you must also include a value for `MaxConnectionsPercent` .\\n\\nDefault: The default value is half of the value of `MaxConnectionsPercent` . For example, if `MaxConnectionsPercent` is 80, then the default value of `MaxIdleConnectionsPercent` is 40. If the value of `MaxConnectionsPercent` isn\'t specified, then for SQL Server, `MaxIdleConnectionsPercent` is 5, and for all other engines, the default is 50.\\n\\nConstraints: Must be between 0 and the value of `MaxConnectionsPercent` .","SessionPinningFilters":"Each item in the list represents a class of SQL operations that normally cause all later statements in a session using a proxy to be pinned to the same underlying database connection. Including an item in the list exempts that class of SQL operations from the pinning behavior.\\n\\nDefault: no session pinning filters"}},"AWS::RDS::DBSecurityGroup":{"attributes":{"Ref":"`Ref` returns the name of the DB security group."},"description":"The `AWS::RDS::DBSecurityGroup` resource creates or updates an Amazon RDS DB security group.\\n\\n> EC2-Classic was retired on August 15, 2022. If you haven\'t migrated from EC2-Classic to a VPC, we recommend that you migrate as soon as possible. For more information, see [Migrate from EC2-Classic to a VPC](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-migrate.html) in the *Amazon EC2 User Guide* , the blog [EC2-Classic Networking is Retiring – Here’s How to Prepare](https://docs.aws.amazon.com/aws/ec2-classic-is-retiring-heres-how-to-prepare/) , and [Moving a DB instance not in a VPC into a VPC](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.Non-VPC2VPC.html) in the *Amazon RDS User Guide* .","properties":{"DBSecurityGroupIngress":"Ingress rules to be applied to the DB security group.","EC2VpcId":"The identifier of an Amazon VPC. This property indicates the VPC that this DB security group belongs to.\\n\\n> The `EC2VpcId` property is for backward compatibility with older regions, and is no longer recommended for providing security information to an RDS DB instance.","GroupDescription":"Provides the description of the DB security group.","Tags":"An optional array of key-value pairs to apply to this DB security group."}},"AWS::RDS::DBSecurityGroup.Ingress":{"attributes":{},"description":"The `Ingress` property type specifies an individual ingress rule within an `AWS::RDS::DBSecurityGroup` resource.\\n\\n> EC2-Classic was retired on August 15, 2022. If you haven\'t migrated from EC2-Classic to a VPC, we recommend that you migrate as soon as possible. For more information, see [Migrate from EC2-Classic to a VPC](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-migrate.html) in the *Amazon EC2 User Guide* , the blog [EC2-Classic Networking is Retiring – Here’s How to Prepare](https://docs.aws.amazon.com/aws/ec2-classic-is-retiring-heres-how-to-prepare/) , and [Moving a DB instance not in a VPC into a VPC](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.Non-VPC2VPC.html) in the *Amazon RDS User Guide* .","properties":{"CIDRIP":"The IP range to authorize.","EC2SecurityGroupId":"Id of the EC2 security group to authorize. For VPC DB security groups, `EC2SecurityGroupId` must be provided. Otherwise, `EC2SecurityGroupOwnerId` and either `EC2SecurityGroupName` or `EC2SecurityGroupId` must be provided.","EC2SecurityGroupName":"Name of the EC2 security group to authorize. For VPC DB security groups, `EC2SecurityGroupId` must be provided. Otherwise, `EC2SecurityGroupOwnerId` and either `EC2SecurityGroupName` or `EC2SecurityGroupId` must be provided.","EC2SecurityGroupOwnerId":"AWS account number of the owner of the EC2 security group specified in the `EC2SecurityGroupName` parameter. The AWS access key ID isn\'t an acceptable value. For VPC DB security groups, `EC2SecurityGroupId` must be provided. Otherwise, `EC2SecurityGroupOwnerId` and either `EC2SecurityGroupName` or `EC2SecurityGroupId` must be provided."}},"AWS::RDS::DBSecurityGroupIngress":{"attributes":{"Ref":"`Ref` returns the DB security group that this ingress rule is associated with."},"description":"The `AWS::RDS::DBSecurityGroupIngress` resource enables ingress to a DB security group using one of two forms of authorization. First, you can add EC2 or VPC security groups to the DB security group if the application using the database is running on EC2 or VPC instances. Second, IP ranges are available if the application accessing your database is running on the Internet.\\n\\nThis type supports updates. For more information about updating stacks, see [AWS CloudFormation Stacks Updates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks.html) .\\n\\nFor details about the settings for DB security group ingress, see [AuthorizeDBSecurityGroupIngress](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_AuthorizeDBSecurityGroupIngress.html) .\\n\\n> EC2-Classic was retired on August 15, 2022. If you haven\'t migrated from EC2-Classic to a VPC, we recommend that you migrate as soon as possible. For more information, see [Migrate from EC2-Classic to a VPC](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-migrate.html) in the *Amazon EC2 User Guide* , the blog [EC2-Classic Networking is Retiring – Here’s How to Prepare](https://docs.aws.amazon.com/aws/ec2-classic-is-retiring-heres-how-to-prepare/) , and [Moving a DB instance not in a VPC into a VPC](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.Non-VPC2VPC.html) in the *Amazon RDS User Guide* .","properties":{"CIDRIP":"The IP range to authorize.","DBSecurityGroupName":"The name of the DB security group to add authorization to.","EC2SecurityGroupId":"Id of the EC2 security group to authorize. For VPC DB security groups, `EC2SecurityGroupId` must be provided. Otherwise, `EC2SecurityGroupOwnerId` and either `EC2SecurityGroupName` or `EC2SecurityGroupId` must be provided.","EC2SecurityGroupName":"Name of the EC2 security group to authorize. For VPC DB security groups, `EC2SecurityGroupId` must be provided. Otherwise, `EC2SecurityGroupOwnerId` and either `EC2SecurityGroupName` or `EC2SecurityGroupId` must be provided.","EC2SecurityGroupOwnerId":"AWS account number of the owner of the EC2 security group specified in the `EC2SecurityGroupName` parameter. The AWS access key ID isn\'t an acceptable value. For VPC DB security groups, `EC2SecurityGroupId` must be provided. Otherwise, `EC2SecurityGroupOwnerId` and either `EC2SecurityGroupName` or `EC2SecurityGroupId` must be provided."}},"AWS::RDS::DBSubnetGroup":{"attributes":{"Ref":"`Ref` returns the name of the DB subnet group."},"description":"The `AWS::RDS::DBSubnetGroup` resource creates a database subnet group. Subnet groups must contain at least two subnets in two different Availability Zones in the same region.\\n\\nFor more information, see [Working with DB subnet groups](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html#USER_VPC.Subnets) in the *Amazon RDS User Guide* .","properties":{"DBSubnetGroupDescription":"The description for the DB subnet group.","DBSubnetGroupName":"The name for the DB subnet group. This value is stored as a lowercase string.\\n\\nConstraints: Must contain no more than 255 lowercase alphanumeric characters or hyphens. Must not be \\"Default\\".\\n\\nExample: `mysubnetgroup`","SubnetIds":"The EC2 Subnet IDs for the DB subnet group.","Tags":"An optional array of key-value pairs to apply to this DB subnet group."}},"AWS::RDS::EventSubscription":{"attributes":{"Ref":"`Ref` returns the name of the RDS event subscription."},"description":"The `AWS::RDS::EventSubscription` resource allows you to receive notifications for Amazon Relational Database Service events through the Amazon Simple Notification Service (Amazon SNS). For more information, see [Using Amazon RDS Event Notification](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Events.html) in the *Amazon RDS User Guide* .","properties":{"Enabled":"A value that indicates whether to activate the subscription. If the event notification subscription isn\'t activated, the subscription is created but not active.","EventCategories":"A list of event categories for a particular source type ( `SourceType` ) that you want to subscribe to. You can see a list of the categories for a given source type in the \\"Amazon RDS event categories and event messages\\" section of the [*Amazon RDS User Guide*](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Events.Messages.html) or the [*Amazon Aurora User Guide*](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_Events.Messages.html) . You can also see this list by using the `DescribeEventCategories` operation.","SnsTopicArn":"The Amazon Resource Name (ARN) of the SNS topic created for event notification. The ARN is created by Amazon SNS when you create a topic and subscribe to it.","SourceIds":"The list of identifiers of the event sources for which events are returned. If not specified, then all sources are included in the response. An identifier must begin with a letter and must contain only ASCII letters, digits, and hyphens. It can\'t end with a hyphen or contain two consecutive hyphens.\\n\\nConstraints:\\n\\n- If a `SourceIds` value is supplied, `SourceType` must also be provided.\\n- If the source type is a DB instance, a `DBInstanceIdentifier` value must be supplied.\\n- If the source type is a DB cluster, a `DBClusterIdentifier` value must be supplied.\\n- If the source type is a DB parameter group, a `DBParameterGroupName` value must be supplied.\\n- If the source type is a DB security group, a `DBSecurityGroupName` value must be supplied.\\n- If the source type is a DB snapshot, a `DBSnapshotIdentifier` value must be supplied.\\n- If the source type is a DB cluster snapshot, a `DBClusterSnapshotIdentifier` value must be supplied.","SourceType":"The type of source that is generating the events. For example, if you want to be notified of events generated by a DB instance, set this parameter to `db-instance` . If this value isn\'t specified, all events are returned.\\n\\nValid values: `db-instance` | `db-cluster` | `db-parameter-group` | `db-security-group` | `db-snapshot` | `db-cluster-snapshot`","SubscriptionName":"The name of the subscription.\\n\\nConstraints: The name must be less than 255 characters.","Tags":"An optional array of key-value pairs to apply to this subscription."}},"AWS::RDS::GlobalCluster":{"attributes":{"Ref":"`Ref` returns the name of the global database cluster."},"description":"The `AWS::RDS::GlobalCluster` resource creates or updates an Amazon Aurora global database spread across multiple AWS Regions.\\n\\nThe global database contains a single primary cluster with read-write capability, and a read-only secondary cluster that receives data from the primary cluster through high-speed replication performed by the Aurora storage subsystem.\\n\\nYou can create a global database that is initially empty, and then add a primary cluster and a secondary cluster to it.\\n\\nFor information about Aurora global databases, see [Working with Amazon Aurora Global Databases](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database.html) in the *Amazon Aurora User Guide* .","properties":{"DeletionProtection":"Specifies whether to enable deletion protection for the new global database cluster. The global database can\'t be deleted when deletion protection is enabled.","Engine":"The database engine to use for this global database cluster.\\n\\nValid Values: `aurora-mysql | aurora-postgresql`\\n\\nConstraints:\\n\\n- Can\'t be specified if `SourceDBClusterIdentifier` is specified. In this case, Amazon Aurora uses the engine of the source DB cluster.","EngineVersion":"The engine version to use for this global database cluster.\\n\\nConstraints:\\n\\n- Can\'t be specified if `SourceDBClusterIdentifier` is specified. In this case, Amazon Aurora uses the engine version of the source DB cluster.","GlobalClusterIdentifier":"The cluster identifier for this global database cluster. This parameter is stored as a lowercase string.","SourceDBClusterIdentifier":"The Amazon Resource Name (ARN) to use as the primary cluster of the global database.\\n\\nIf you provide a value for this parameter, don\'t specify values for the following settings because Amazon Aurora uses the values from the specified source DB cluster:\\n\\n- `DatabaseName`\\n- `Engine`\\n- `EngineVersion`\\n- `StorageEncrypted`","StorageEncrypted":"Specifies whether to enable storage encryption for the new global database cluster.\\n\\nConstraints:\\n\\n- Can\'t be specified if `SourceDBClusterIdentifier` is specified. In this case, Amazon Aurora uses the setting from the source DB cluster."}},"AWS::RDS::OptionGroup":{"attributes":{"Ref":"`Ref` returns the name of the option group."},"description":"The `AWS::RDS::OptionGroup` resource creates or updates an option group, to enable and configure features that are specific to a particular DB engine.","properties":{"EngineName":"Specifies the name of the engine that this option group should be associated with.\\n\\nValid Values:\\n\\n- `mariadb`\\n- `mysql`\\n- `oracle-ee`\\n- `oracle-ee-cdb`\\n- `oracle-se2`\\n- `oracle-se2-cdb`\\n- `postgres`\\n- `sqlserver-ee`\\n- `sqlserver-se`\\n- `sqlserver-ex`\\n- `sqlserver-web`","MajorEngineVersion":"Specifies the major version of the engine that this option group should be associated with.","OptionConfigurations":"A list of options and the settings for each option.","OptionGroupDescription":"The description of the option group.","OptionGroupName":"The name of the option group to be created.\\n\\nConstraints:\\n\\n- Must be 1 to 255 letters, numbers, or hyphens\\n- First character must be a letter\\n- Can\'t end with a hyphen or contain two consecutive hyphens\\n\\nExample: `myoptiongroup`\\n\\nIf you don\'t specify a value for `OptionGroupName` property, a name is automatically created for the option group.\\n\\n> This value is stored as a lowercase string.","Tags":"An optional array of key-value pairs to apply to this option group."}},"AWS::RDS::OptionGroup.OptionConfiguration":{"attributes":{},"description":"The `OptionConfiguration` property type specifies an individual option, and its settings, within an `AWS::RDS::OptionGroup` resource.","properties":{"DBSecurityGroupMemberships":"A list of DBSecurityGroupMembership name strings used for this option.","OptionName":"The configuration of options to include in a group.","OptionSettings":"The option settings to include in an option group.","OptionVersion":"The version for the option.","Port":"The optional port for the option.","VpcSecurityGroupMemberships":"A list of VpcSecurityGroupMembership name strings used for this option."}},"AWS::RDS::OptionGroup.OptionSetting":{"attributes":{},"description":"The `OptionSetting` property type specifies the value for an option within an `OptionSetting` property.","properties":{"Name":"The name of the option that has settings that you can set.","Value":"The current value of the option setting."}},"AWS::RUM::AppMonitor":{"attributes":{"Id":"The ID of the app monitor, such as `123456ab-1234-4ca9-9d2f-a1b2c3456789` .","Ref":"`Ref` returns the name of the app monitor."},"description":"Creates a CloudWatch RUM app monitor, which you can use to collect telemetry data from your application and send it to CloudWatch RUM. The data includes performance and reliability information such as page load time, client-side errors, and user behavior.\\n\\nAfter you create an app monitor, sign in to the CloudWatch RUM console to get the JavaScript code snippet to add to your web application. For more information, see [How do I find a code snippet that I\'ve already generated?](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-find-code-snippet.html)","properties":{"AppMonitorConfiguration":"A structure that contains much of the configuration data for the app monitor. If you are using Amazon Cognito for authorization, you must include this structure in your request, and it must include the ID of the Amazon Cognito identity pool to use for authorization. If you don\'t include `AppMonitorConfiguration` , you must set up your own authorization method. For more information, see [Authorize your application to send data to AWS](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-get-started-authorization.html) .\\n\\nIf you omit this argument, the sample rate used for CloudWatch RUM is set to 10% of the user sessions.","CustomEvents":"Specifies whether this app monitor allows the web client to define and send custom events. If you omit this parameter, custom events are `DISABLED` .","CwLogEnabled":"Data collected by CloudWatch RUM is kept by RUM for 30 days and then deleted. This parameter specifies whether CloudWatch RUM sends a copy of this telemetry data to Amazon CloudWatch Logs in your account. This enables you to keep the telemetry data for more than 30 days, but it does incur Amazon CloudWatch Logs charges.\\n\\nIf you omit this parameter, the default is `false` .","Domain":"The top-level internet domain name for which your application has administrative authority. This parameter is required.","Name":"A name for the app monitor. This parameter is required.","Tags":"Assigns one or more tags (key-value pairs) to the app monitor.\\n\\nTags can help you organize and categorize your resources. You can also use them to scope user permissions by granting a user permission to access or change only resources with certain tag values.\\n\\nTags don\'t have any semantic meaning to AWS and are interpreted strictly as strings of characters.\\n\\nYou can associate as many as 50 tags with an app monitor.\\n\\nFor more information, see [Tagging AWS resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) ."}},"AWS::RUM::AppMonitor.AppMonitorConfiguration":{"attributes":{},"description":"This structure contains much of the configuration data for the app monitor.","properties":{"AllowCookies":"If you set this to `true` , the CloudWatch RUM web client sets two cookies, a session cookie and a user cookie. The cookies allow the CloudWatch RUM web client to collect data relating to the number of users an application has and the behavior of the application across a sequence of events. Cookies are stored in the top-level domain of the current page.","EnableXRay":"If you set this to `true` , CloudWatch RUM sends client-side traces to X-Ray for each sampled session. You can then see traces and segments from these user sessions in the RUM dashboard and the CloudWatch ServiceLens console. For more information, see [What is AWS X-Ray ?](https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html)","ExcludedPages":"A list of URLs in your website or application to exclude from RUM data collection.\\n\\nYou can\'t include both `ExcludedPages` and `IncludedPages` in the same app monitor.","FavoritePages":"A list of pages in your application that are to be displayed with a \\"favorite\\" icon in the CloudWatch RUM console.","GuestRoleArn":"The ARN of the guest IAM role that is attached to the Amazon Cognito identity pool that is used to authorize the sending of data to CloudWatch RUM.","IdentityPoolId":"The ID of the Amazon Cognito identity pool that is used to authorize the sending of data to CloudWatch RUM.","IncludedPages":"If this app monitor is to collect data from only certain pages in your application, this structure lists those pages.\\n\\nYou can\'t include both `ExcludedPages` and `IncludedPages` in the same app monitor.","MetricDestinations":"An array of structures that each define a destination that this app monitor will send extended metrics to.","SessionSampleRate":"Specifies the portion of user sessions to use for CloudWatch RUM data collection. Choosing a higher portion gives you more data but also incurs more costs.\\n\\nThe range for this value is 0 to 1 inclusive. Setting this to 1 means that 100% of user sessions are sampled, and setting it to 0.1 means that 10% of user sessions are sampled.\\n\\nIf you omit this parameter, the default of 0.1 is used, and 10% of sessions will be sampled.","Telemetries":"An array that lists the types of telemetry data that this app monitor is to collect.\\n\\n- `errors` indicates that RUM collects data about unhandled JavaScript errors raised by your application.\\n- `performance` indicates that RUM collects performance data about how your application and its resources are loaded and rendered. This includes Core Web Vitals.\\n- `http` indicates that RUM collects data about HTTP errors thrown by your application."}},"AWS::RUM::AppMonitor.CustomEvents":{"attributes":{},"description":"This structure specifies whether this app monitor allows the web client to define and send custom events.","properties":{"Status":"Set this to `ENABLED` to allow the web client to send custom events for this app monitor.\\n\\nValid values are `ENABLED` and `DISABLED` ."}},"AWS::RUM::AppMonitor.MetricDefinition":{"attributes":{},"description":"Specifies one custom metric or extended metric that you want the CloudWatch RUM app monitor to send to a destination. Valid destinations include CloudWatch and Evidently.\\n\\nBy default, RUM app monitors send some metrics to CloudWatch . These default metrics are listed in [CloudWatch metrics that you can collect.](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-metrics.html)\\n\\nIn addition to these default metrics, you can choose to send extended metrics or custom metrics or both.\\n\\n- Extended metrics enable you to send metrics with additional dimensions not included in the default metrics. You can also send extended metrics to Evidently as well as CloudWatch . The valid dimension names for the additional dimensions for extended metrics are `BrowserName` , `CountryCode` , `DeviceType` , `FileType` , `OSName` , and `PageId` . For more information, see [Extended metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-vended-metrics.html) .\\n- Custom metrics are metrics that you define. You can send custom metrics to CloudWatch or to CloudWatch Evidently or to both. With custom metrics, you can use any metric name and namespace, and to derive the metrics you can use any custom events, built-in events, custom attributes, or default attributes.\\n\\nYou can\'t send custom metrics to the `AWS/RUM` namespace. You must send custom metrics to a custom namespace that you define. The namespace that you use can\'t start with `AWS/` . CloudWatch RUM prepends `RUM/CustomMetrics/` to the custom namespace that you define, so the final namespace for your metrics in CloudWatch is `RUM/CustomMetrics/ *your-custom-namespace*` .\\n\\nFor information about syntax rules for specifying custom metrics and extended metrics, see [MetridDefinitionRequest](https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_MetricDefinitionRequest.html) in the *CloudWatch RUM API Reference* .\\n\\nThe maximum number of metric definitions that one destination can contain is 2000.\\n\\nExtended metrics sent to CloudWatch and RUM custom metrics are charged as CloudWatch custom metrics. Each combination of additional dimension name and dimension value counts as a custom metric.\\n\\nIf some metric definitions that you specify are not valid, then the operation will not modify any metric definitions even if other metric definitions specified are valid.","properties":{"DimensionKeys":"This field is a map of field paths to dimension names. It defines the dimensions to associate with this metric in CloudWatch . The value of this field is used only if the metric destination is `CloudWatch` . If the metric destination is `Evidently` , the value of `DimensionKeys` is ignored.","EventPattern":"The pattern that defines the metric. RUM checks events that happen in a user\'s session against the pattern, and events that match the pattern are sent to the metric destination.\\n\\nIf the metrics destination is `CloudWatch` and the event also matches a value in `DimensionKeys` , then the metric is published with the specified dimensions.","Name":"The name of the metric that is defined in this structure.","Namespace":"If you are creating a custom metric instead of an extended metrics, use this parameter to define the metric namespace for that custom metric. Do not specify this parameter if you are creating an extended metric.\\n\\nYou can\'t use any string that starts with `AWS/` for your namespace.","UnitLabel":"Use this field only if you are sending this metric to CloudWatch . It defines the CloudWatch metric unit that this metric is measured in.","ValueKey":"The field within the event object that the metric value is sourced from."}},"AWS::RUM::AppMonitor.MetricDestination":{"attributes":{},"description":"Creates or updates a destination to receive extended metrics from CloudWatch RUM. You can send extended metrics to CloudWatch or to a CloudWatch Evidently experiment.\\n\\nFor more information about extended metrics, see [Extended metrics that you can send to CloudWatch and CloudWatch Evidently](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-vended-metrics.html) .","properties":{"Destination":"Defines the destination to send the metrics to. Valid values are `CloudWatch` and `Evidently` . If you specify `Evidently` , you must also specify the ARN of the CloudWatch Evidently experiment that is to be the destination and an IAM role that has permission to write to the experiment.","DestinationArn":"Use this parameter only if `Destination` is `Evidently` . This parameter specifies the ARN of the Evidently experiment that will receive the extended metrics.","IamRoleArn":"This parameter is required if `Destination` is `Evidently` . If `Destination` is `CloudWatch` , do not use this parameter.\\n\\nThis parameter specifies the ARN of an IAM role that RUM will assume to write to the Evidently experiment that you are sending metrics to. This role must have permission to write to that experiment.","MetricDefinitions":"An array of structures which define the metrics that you want to send."}},"AWS::Redshift::Cluster":{"attributes":{"DeferMaintenanceIdentifier":"A unique identifier for the maintenance window.","Endpoint.Address":"The connection endpoint for the Amazon Redshift cluster. For example: `examplecluster.cg034hpkmmjt.us-east-1.redshift.amazonaws.com` .","Endpoint.Port":"The port number on which the Amazon Redshift cluster accepts connections. For example: `5439` .","Id":"A unique identifier for the cluster. You use this identifier to refer to the cluster for any subsequent cluster operations such as deleting or modifying. The identifier also appears in the Amazon Redshift console.\\n\\nExample: `myexamplecluster`","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myCluster\\" }`\\n\\nFor the Amazon Redshift cluster `myCluster` , `Ref` returns the name of the cluster."},"description":"Specifies a cluster. A *cluster* is a fully managed data warehouse that consists of a set of compute nodes.\\n\\nTo create a cluster in Virtual Private Cloud (VPC), you must provide a cluster subnet group name. The cluster subnet group identifies the subnets of your VPC that Amazon Redshift uses when creating the cluster. For more information about managing clusters, go to [Amazon Redshift Clusters](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html) in the *Amazon Redshift Cluster Management Guide* .","properties":{"AllowVersionUpgrade":"If `true` , major version upgrades can be applied during the maintenance window to the Amazon Redshift engine that is running on the cluster.\\n\\nWhen a new major version of the Amazon Redshift engine is released, you can request that the service automatically apply upgrades during the maintenance window to the Amazon Redshift engine that is running on your cluster.\\n\\nDefault: `true`","AquaConfigurationStatus":"This parameter is retired. It does not set the AQUA configuration status. Amazon Redshift automatically determines whether to use AQUA (Advanced Query Accelerator).","AutomatedSnapshotRetentionPeriod":"The number of days that automated snapshots are retained. If the value is 0, automated snapshots are disabled. Even if automated snapshots are disabled, you can still create manual snapshots when you want with [CreateClusterSnapshot](https://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateClusterSnapshot.html) in the *Amazon Redshift API Reference* .\\n\\nDefault: `1`\\n\\nConstraints: Must be a value from 0 to 35.","AvailabilityZone":"The EC2 Availability Zone (AZ) in which you want Amazon Redshift to provision the cluster. For example, if you have several EC2 instances running in a specific Availability Zone, then you might want the cluster to be provisioned in the same zone in order to decrease network latency.\\n\\nDefault: A random, system-chosen Availability Zone in the region that is specified by the endpoint.\\n\\nExample: `us-east-2d`\\n\\nConstraint: The specified Availability Zone must be in the same region as the current endpoint.","AvailabilityZoneRelocation":"The option to enable relocation for an Amazon Redshift cluster between Availability Zones after the cluster is created.","AvailabilityZoneRelocationStatus":"Describes the status of the Availability Zone relocation operation.","Classic":"A boolean value indicating whether the resize operation is using the classic resize process. If you don\'t provide this parameter or set the value to `false` , the resize type is elastic.","ClusterIdentifier":"A unique identifier for the cluster. You use this identifier to refer to the cluster for any subsequent cluster operations such as deleting or modifying. The identifier also appears in the Amazon Redshift console.\\n\\nConstraints:\\n\\n- Must contain from 1 to 63 alphanumeric characters or hyphens.\\n- Alphabetic characters must be lowercase.\\n- First character must be a letter.\\n- Cannot end with a hyphen or contain two consecutive hyphens.\\n- Must be unique for all clusters within an AWS account .\\n\\nExample: `myexamplecluster`","ClusterParameterGroupName":"The name of the parameter group to be associated with this cluster.\\n\\nDefault: The default Amazon Redshift cluster parameter group. For information about the default parameter group, go to [Working with Amazon Redshift Parameter Groups](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-parameter-groups.html)\\n\\nConstraints:\\n\\n- Must be 1 to 255 alphanumeric characters or hyphens.\\n- First character must be a letter.\\n- Cannot end with a hyphen or contain two consecutive hyphens.","ClusterSecurityGroups":"A list of security groups to be associated with this cluster.\\n\\nDefault: The default cluster security group for Amazon Redshift.","ClusterSubnetGroupName":"The name of a cluster subnet group to be associated with this cluster.\\n\\nIf this parameter is not provided the resulting cluster will be deployed outside virtual private cloud (VPC).","ClusterType":"The type of the cluster. When cluster type is specified as\\n\\n- `single-node` , the *NumberOfNodes* parameter is not required.\\n- `multi-node` , the *NumberOfNodes* parameter is required.\\n\\nValid Values: `multi-node` | `single-node`\\n\\nDefault: `multi-node`","ClusterVersion":"The version of the Amazon Redshift engine software that you want to deploy on the cluster.\\n\\nThe version selected runs on all the nodes in the cluster.\\n\\nConstraints: Only version 1.0 is currently available.\\n\\nExample: `1.0`","DBName":"The name of the first database to be created when the cluster is created.\\n\\nTo create additional databases after the cluster is created, connect to the cluster with a SQL client and use SQL commands to create a database. For more information, go to [Create a Database](https://docs.aws.amazon.com/redshift/latest/dg/t_creating_database.html) in the Amazon Redshift Database Developer Guide.\\n\\nDefault: `dev`\\n\\nConstraints:\\n\\n- Must contain 1 to 64 alphanumeric characters.\\n- Must contain only lowercase letters.\\n- Cannot be a word that is reserved by the service. A list of reserved words can be found in [Reserved Words](https://docs.aws.amazon.com/redshift/latest/dg/r_pg_keywords.html) in the Amazon Redshift Database Developer Guide.","DeferMaintenance":"A Boolean indicating whether to enable the deferred maintenance window.","DeferMaintenanceDuration":"An integer indicating the duration of the maintenance window in days. If you specify a duration, you can\'t specify an end time. The duration must be 45 days or less.","DeferMaintenanceEndTime":"A timestamp for the end of the time period when we defer maintenance.","DeferMaintenanceStartTime":"A timestamp indicating the start time for the deferred maintenance window.","DestinationRegion":"The destination region that snapshots are automatically copied to when cross-region snapshot copy is enabled.","ElasticIp":"The Elastic IP (EIP) address for the cluster.\\n\\nConstraints: The cluster must be provisioned in EC2-VPC and publicly-accessible through an Internet gateway. Don\'t specify the Elastic IP address for a publicly accessible cluster with availability zone relocation turned on. For more information about provisioning clusters in EC2-VPC, go to [Supported Platforms to Launch Your Cluster](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#cluster-platforms) in the Amazon Redshift Cluster Management Guide.","Encrypted":"If `true` , the data in the cluster is encrypted at rest.\\n\\nDefault: false","Endpoint":"The connection endpoint.","EnhancedVpcRouting":"An option that specifies whether to create the cluster with enhanced VPC routing enabled. To create a cluster that uses enhanced VPC routing, the cluster must be in a VPC. For more information, see [Enhanced VPC Routing](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html) in the Amazon Redshift Cluster Management Guide.\\n\\nIf this option is `true` , enhanced VPC routing is enabled.\\n\\nDefault: false","HsmClientCertificateIdentifier":"Specifies the name of the HSM client certificate the Amazon Redshift cluster uses to retrieve the data encryption keys stored in an HSM.","HsmConfigurationIdentifier":"Specifies the name of the HSM configuration that contains the information the Amazon Redshift cluster can use to retrieve and store keys in an HSM.","IamRoles":"A list of AWS Identity and Access Management (IAM) roles that can be used by the cluster to access other AWS services. You must supply the IAM roles in their Amazon Resource Name (ARN) format.\\n\\nThe maximum number of IAM roles that you can associate is subject to a quota. For more information, go to [Quotas and limits](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) in the *Amazon Redshift Cluster Management Guide* .","KmsKeyId":"The AWS Key Management Service (KMS) key ID of the encryption key that you want to use to encrypt data in the cluster.","LoggingProperties":"Specifies logging information, such as queries and connection attempts, for the specified Amazon Redshift cluster.","MaintenanceTrackName":"An optional parameter for the name of the maintenance track for the cluster. If you don\'t provide a maintenance track name, the cluster is assigned to the `current` track.","ManualSnapshotRetentionPeriod":"The default number of days to retain a manual snapshot. If the value is -1, the snapshot is retained indefinitely. This setting doesn\'t change the retention period of existing snapshots.\\n\\nThe value must be either -1 or an integer between 1 and 3,653.","MasterUserPassword":"The password associated with the admin user account for the cluster that is being created.\\n\\nConstraints:\\n\\n- Must be between 8 and 64 characters in length.\\n- Must contain at least one uppercase letter.\\n- Must contain at least one lowercase letter.\\n- Must contain one number.\\n- Can be any printable ASCII character (ASCII code 33-126) except `\'` (single quote), `\\"` (double quote), `\\\\` , `/` , or `@` .","MasterUsername":"The user name associated with the admin user account for the cluster that is being created.\\n\\nConstraints:\\n\\n- Must be 1 - 128 alphanumeric characters or hyphens. The user name can\'t be `PUBLIC` .\\n- Must contain only lowercase letters, numbers, underscore, plus sign, period (dot), at symbol (@), or hyphen.\\n- The first character must be a letter.\\n- Must not contain a colon (:) or a slash (/).\\n- Cannot be a reserved word. A list of reserved words can be found in [Reserved Words](https://docs.aws.amazon.com/redshift/latest/dg/r_pg_keywords.html) in the Amazon Redshift Database Developer Guide.","NodeType":"The node type to be provisioned for the cluster. For information about node types, go to [Working with Clusters](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#how-many-nodes) in the *Amazon Redshift Cluster Management Guide* .\\n\\nValid Values: `ds2.xlarge` | `ds2.8xlarge` | `dc1.large` | `dc1.8xlarge` | `dc2.large` | `dc2.8xlarge` | `ra3.xlplus` | `ra3.4xlarge` | `ra3.16xlarge`","NumberOfNodes":"The number of compute nodes in the cluster. This parameter is required when the *ClusterType* parameter is specified as `multi-node` .\\n\\nFor information about determining how many nodes you need, go to [Working with Clusters](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#how-many-nodes) in the *Amazon Redshift Cluster Management Guide* .\\n\\nIf you don\'t specify this parameter, you get a single-node cluster. When requesting a multi-node cluster, you must specify the number of nodes that you want in the cluster.\\n\\nDefault: `1`\\n\\nConstraints: Value must be at least 1 and no more than 100.","OwnerAccount":"The AWS account used to create or copy the snapshot. Required if you are restoring a snapshot you do not own, optional if you own the snapshot.","Port":"The port number on which the cluster accepts incoming connections.\\n\\nThe cluster is accessible only via the JDBC and ODBC connection strings. Part of the connection string requires the port on which the cluster will listen for incoming connections.\\n\\nDefault: `5439`\\n\\nValid Values: `1150-65535`","PreferredMaintenanceWindow":"The weekly time range (in UTC) during which automated cluster maintenance can occur.\\n\\nFormat: `ddd:hh24:mi-ddd:hh24:mi`\\n\\nDefault: A 30-minute window selected at random from an 8-hour block of time per region, occurring on a random day of the week. For more information about the time blocks for each region, see [Maintenance Windows](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#rs-maintenance-windows) in Amazon Redshift Cluster Management Guide.\\n\\nValid Days: Mon | Tue | Wed | Thu | Fri | Sat | Sun\\n\\nConstraints: Minimum 30-minute window.","PubliclyAccessible":"If `true` , the cluster can be accessed from a public network.","ResourceAction":"The Amazon Redshift operation to be performed. Supported operations are `pause-cluster` and `resume-cluster` .","RevisionTarget":"Describes a `RevisionTarget` object.","RotateEncryptionKey":"Rotates the encryption keys for a cluster.","SnapshotClusterIdentifier":"The name of the cluster the source snapshot was created from. This parameter is required if your user or role has a policy containing a snapshot resource element that specifies anything other than * for the cluster name.","SnapshotCopyGrantName":"The name of the snapshot copy grant.","SnapshotCopyManual":"Indicates whether to apply the snapshot retention period to newly copied manual snapshots instead of automated snapshots.","SnapshotCopyRetentionPeriod":"The number of days to retain automated snapshots in the destination AWS Region after they are copied from the source AWS Region .\\n\\nBy default, this only changes the retention period of copied automated snapshots.\\n\\nIf you decrease the retention period for automated snapshots that are copied to a destination AWS Region , Amazon Redshift deletes any existing automated snapshots that were copied to the destination AWS Region and that fall outside of the new retention period.\\n\\nConstraints: Must be at least 1 and no more than 35 for automated snapshots.\\n\\nIf you specify the `manual` option, only newly copied manual snapshots will have the new retention period.\\n\\nIf you specify the value of -1 newly copied manual snapshots are retained indefinitely.\\n\\nConstraints: The number of days must be either -1 or an integer between 1 and 3,653 for manual snapshots.","SnapshotIdentifier":"The name of the snapshot from which to create the new cluster. This parameter isn\'t case sensitive. You must specify this parameter or `snapshotArn` , but not both.\\n\\nExample: `my-snapshot-id`","Tags":"A list of tag instances.","VpcSecurityGroupIds":"A list of Virtual Private Cloud (VPC) security groups to be associated with the cluster.\\n\\nDefault: The default VPC security group is associated with the cluster."}},"AWS::Redshift::Cluster.Endpoint":{"attributes":{},"description":"Describes a connection endpoint.","properties":{"Address":"The DNS address of the cluster. This property is read only.","Port":"The port that the database engine is listening on. This property is read only."}},"AWS::Redshift::Cluster.LoggingProperties":{"attributes":{},"description":"Specifies logging information, such as queries and connection attempts, for the specified Amazon Redshift cluster.","properties":{"BucketName":"The name of an existing S3 bucket where the log files are to be stored.\\n\\nConstraints:\\n\\n- Must be in the same region as the cluster\\n- The cluster must have read bucket and put object permissions","S3KeyPrefix":"The prefix applied to the log file names.\\n\\nConstraints:\\n\\n- Cannot exceed 512 characters\\n- Cannot contain spaces( ), double quotes (\\"), single quotes (\'), a backslash (\\\\), or control characters. The hexadecimal codes for invalid characters are:\\n\\n- x00 to x20\\n- x22\\n- x27\\n- x5c\\n- x7f or larger"}},"AWS::Redshift::ClusterParameterGroup":{"attributes":{"Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myClusterParameterGroup\\" }`\\n\\nFor the Amazon Redshift cluster parameter group `myClusterParameterGroup` , `Ref` returns the name of the cluster parameter group."},"description":"Describes a parameter group.","properties":{"Description":"The description of the parameter group.","ParameterGroupFamily":"The name of the cluster parameter group family that this cluster parameter group is compatible with. You can create a custom parameter group and then associate your cluster with it. For more information, see [Amazon Redshift parameter groups](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-parameter-groups.html) .","ParameterGroupName":"The name of the cluster parameter group.","Parameters":"An array of parameters to be modified. A maximum of 20 parameters can be modified in a single request.\\n\\nFor each parameter to be modified, you must supply at least the parameter name and parameter value; other name-value pairs of the parameter are optional.\\n\\nFor the workload management (WLM) configuration, you must supply all the name-value pairs in the wlm_json_configuration parameter.","Tags":"The list of tags for the cluster parameter group."}},"AWS::Redshift::ClusterParameterGroup.Parameter":{"attributes":{},"description":"Describes a parameter in a cluster parameter group.","properties":{"ParameterName":"The name of the parameter.","ParameterValue":"The value of the parameter. If `ParameterName` is `wlm_json_configuration` , then the maximum size of `ParameterValue` is 8000 characters."}},"AWS::Redshift::ClusterSecurityGroup":{"attributes":{"Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myClusterSecurityGroup\\" }`\\n\\nFor the Amazon Redshift cluster security group `myClusterSecurityGroup` , Ref returns the name of the cluster security group."},"description":"Specifies a new Amazon Redshift security group. You use security groups to control access to non-VPC clusters.\\n\\nFor information about managing security groups, go to [Amazon Redshift Cluster Security Groups](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-security-groups.html) in the *Amazon Redshift Cluster Management Guide* .","properties":{"Description":"A description for the security group.","Tags":"Specifies an arbitrary set of tags (key–value pairs) to associate with this security group. Use tags to manage your resources."}},"AWS::Redshift::ClusterSecurityGroupIngress":{"attributes":{},"description":"Adds an inbound (ingress) rule to an Amazon Redshift security group. Depending on whether the application accessing your cluster is running on the Internet or an Amazon EC2 instance, you can authorize inbound access to either a Classless Interdomain Routing (CIDR)/Internet Protocol (IP) range or to an Amazon EC2 security group. You can add as many as 20 ingress rules to an Amazon Redshift security group.\\n\\nIf you authorize access to an Amazon EC2 security group, specify *EC2SecurityGroupName* and *EC2SecurityGroupOwnerId* . The Amazon EC2 security group and Amazon Redshift cluster must be in the same AWS Region .\\n\\nIf you authorize access to a CIDR/IP address range, specify *CIDRIP* . For an overview of CIDR blocks, see the Wikipedia article on [Classless Inter-Domain Routing](https://docs.aws.amazon.com/http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) .\\n\\nYou must also associate the security group with a cluster so that clients running on these IP addresses or the EC2 instance are authorized to connect to the cluster. For information about managing security groups, go to [Working with Security Groups](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-security-groups.html) in the *Amazon Redshift Cluster Management Guide* .","properties":{"CIDRIP":"The IP range to be added the Amazon Redshift security group.","ClusterSecurityGroupName":"The name of the security group to which the ingress rule is added.","EC2SecurityGroupName":"The EC2 security group to be added the Amazon Redshift security group.","EC2SecurityGroupOwnerId":"The AWS account number of the owner of the security group specified by the *EC2SecurityGroupName* parameter. The AWS Access Key ID is not an acceptable value.\\n\\nExample: `111122223333`\\n\\nConditional. If you specify the `EC2SecurityGroupName` property, you must specify this property."}},"AWS::Redshift::ClusterSubnetGroup":{"attributes":{"ClusterSubnetGroupName":"The name of the cluster subnet group.","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myClusterSubnetGroup\\" }`\\n\\nFor the Amazon Redshift subnet group `myClusterSubnetGroup` , Ref returns the name of the cluster subnet group."},"description":"Specifies an Amazon Redshift subnet group. You must provide a list of one or more subnets in your existing Amazon Virtual Private Cloud ( Amazon VPC ) when creating Amazon Redshift subnet group.\\n\\nFor information about subnet groups, go to [Amazon Redshift Cluster Subnet Groups](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-cluster-subnet-groups.html) in the *Amazon Redshift Cluster Management Guide* .","properties":{"Description":"A description for the subnet group.","SubnetIds":"An array of VPC subnet IDs. A maximum of 20 subnets can be modified in a single request.","Tags":"Specifies an arbitrary set of tags (key–value pairs) to associate with this subnet group. Use tags to manage your resources."}},"AWS::Redshift::EndpointAccess":{"attributes":{"Address":"The DNS address of the endpoint.","EndpointCreateTime":"The time (UTC) that the endpoint was created.","EndpointStatus":"The status of the endpoint.","Port":"The port number on which the cluster accepts incoming connections.","Ref":"`Ref` returns the resource name.","VpcEndpoint":"The connection endpoint for connecting to an Amazon Redshift cluster through the proxy.","VpcEndpoint.NetworkInterfaces":"","VpcEndpoint.VpcEndpointId":"The connection endpoint ID for connecting an Amazon Redshift cluster through the proxy.","VpcEndpoint.VpcId":"The VPC identifier that the endpoint is associated.","VpcSecurityGroups":"The security groups associated with the endpoint."},"description":"Creates a Redshift-managed VPC endpoint.","properties":{"ClusterIdentifier":"The cluster identifier of the cluster associated with the endpoint.","EndpointName":"The name of the endpoint.","ResourceOwner":"The AWS account ID of the owner of the cluster.","SubnetGroupName":"The subnet group name where Amazon Redshift chooses to deploy the endpoint.","VpcSecurityGroupIds":"The security group that defines the ports, protocols, and sources for inbound traffic that you are authorizing into your endpoint."}},"AWS::Redshift::EndpointAccess.NetworkInterface":{"attributes":{},"description":"Describes a network interface.","properties":{"AvailabilityZone":"The Availability Zone.","NetworkInterfaceId":"The network interface identifier.","PrivateIpAddress":"The IPv4 address of the network interface within the subnet.","SubnetId":"The subnet identifier."}},"AWS::Redshift::EndpointAccess.VpcEndpoint":{"attributes":{},"description":"The connection endpoint for connecting to an Amazon Redshift cluster through the proxy.","properties":{"NetworkInterfaces":"One or more network interfaces of the endpoint. Also known as an interface endpoint.","VpcEndpointId":"The connection endpoint ID for connecting an Amazon Redshift cluster through the proxy.","VpcId":"The VPC identifier that the endpoint is associated."}},"AWS::Redshift::EndpointAccess.VpcSecurityGroup":{"attributes":{},"description":"The security groups associated with the endpoint.","properties":{"Status":"The status of the endpoint.","VpcSecurityGroupId":"The identifier of the VPC security group."}},"AWS::Redshift::EndpointAuthorization":{"attributes":{"AllowedAllVPCs":"Indicates whether all VPCs in the grantee account are allowed access to the cluster.","AllowedVPCs":"The VPCs allowed access to the cluster.","AuthorizeTime":"The time (UTC) when the authorization was created.","ClusterStatus":"The status of the cluster.","EndpointCount":"The number of Redshift-managed VPC endpoints created for the authorization.","Grantee":"The AWS account ID of the grantee of the cluster.","Grantor":"The AWS account ID of the cluster owner.","Status":"The status of the authorization action."},"description":"Describes an endpoint authorization for authorizing Redshift-managed VPC endpoint access to a cluster across AWS accounts .","properties":{"Account":"The AWS account ID of either the cluster owner (grantor) or grantee. If `Grantee` parameter is true, then the `Account` value is of the grantor.","ClusterIdentifier":"The cluster identifier.","Force":"Indicates whether to force the revoke action. If true, the Redshift-managed VPC endpoints associated with the endpoint authorization are also deleted.","VpcIds":"The virtual private cloud (VPC) identifiers to grant access to."}},"AWS::Redshift::EventSubscription":{"attributes":{"CustSubscriptionId":"The name of the Amazon Redshift event notification subscription.","CustomerAwsId":"The AWS account associated with the Amazon Redshift event notification subscription.","EventCategoriesList":"The list of Amazon Redshift event categories specified in the event notification subscription.\\n\\nValues: Configuration, Management, Monitoring, Security, Pending","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"mySubscriptionName\\" }`\\n\\nFor the Amazon Redshift `EventSubscription` , Ref returns the name of the subscription.","SourceIdsList":"A list of the sources that publish events to the Amazon Redshift event notification subscription.","Status":"The status of the Amazon Redshift event notification subscription.\\n\\nConstraints:\\n\\n- Can be one of the following: active | no-permission | topic-not-exist\\n- The status \\"no-permission\\" indicates that Amazon Redshift no longer has permission to post to the Amazon SNS topic. The status \\"topic-not-exist\\" indicates that the topic was deleted after the subscription was created.","SubscriptionCreationTime":"The date and time the Amazon Redshift event notification subscription was created."},"description":"","properties":{"Enabled":"A boolean value; set to `true` to activate the subscription, and set to `false` to create the subscription but not activate it.","EventCategories":"Specifies the Amazon Redshift event categories to be published by the event notification subscription.\\n\\nValues: configuration, management, monitoring, security, pending","Severity":"Specifies the Amazon Redshift event severity to be published by the event notification subscription.\\n\\nValues: ERROR, INFO","SnsTopicArn":"The Amazon Resource Name (ARN) of the Amazon SNS topic used to transmit the event notifications. The ARN is created by Amazon SNS when you create a topic and subscribe to it.","SourceIds":"A list of one or more identifiers of Amazon Redshift source objects. All of the objects must be of the same type as was specified in the source type parameter. The event subscription will return only events generated by the specified objects. If not specified, then events are returned for all objects within the source type specified.\\n\\nExample: my-cluster-1, my-cluster-2\\n\\nExample: my-snapshot-20131010","SourceType":"The type of source that will be generating the events. For example, if you want to be notified of events generated by a cluster, you would set this parameter to cluster. If this value is not specified, events are returned for all Amazon Redshift objects in your AWS account . You must specify a source type in order to specify source IDs.\\n\\nValid values: cluster, cluster-parameter-group, cluster-security-group, cluster-snapshot, and scheduled-action.","SubscriptionName":"The name of the event subscription to be created.\\n\\nConstraints:\\n\\n- Cannot be null, empty, or blank.\\n- Must contain from 1 to 255 alphanumeric characters or hyphens.\\n- First character must be a letter.\\n- Cannot end with a hyphen or contain two consecutive hyphens.","Tags":"A list of tag instances."}},"AWS::Redshift::ScheduledAction":{"attributes":{"NextInvocations":"List of times when the scheduled action will run.","Ref":"`Ref` returns the resource name. For example:\\n\\n`{ \\"Ref\\": \\"myScheduledActionName\\" }`\\n\\nFor the Amazon Redshift `ScheduledActionName` , Ref returns the name of the scheduled action.","State":"The state of the scheduled action. For example, `DISABLED` ."},"description":"Creates a scheduled action. A scheduled action contains a schedule and an Amazon Redshift API action. For example, you can create a schedule of when to run the `ResizeCluster` API operation.","properties":{"Enable":"If true, the schedule is enabled. If false, the scheduled action does not trigger. For more information about `state` of the scheduled action, see `ScheduledAction` .","EndTime":"The end time in UTC when the schedule is no longer active. After this time, the scheduled action does not trigger.","IamRole":"The IAM role to assume to run the scheduled action. This IAM role must have permission to run the Amazon Redshift API operation in the scheduled action. This IAM role must allow the Amazon Redshift scheduler (Principal scheduler.redshift.amazonaws.com) to assume permissions on your behalf. For more information about the IAM role to use with the Amazon Redshift scheduler, see [Using Identity-Based Policies for Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html) in the *Amazon Redshift Cluster Management Guide* .","Schedule":"The schedule for a one-time (at format) or recurring (cron format) scheduled action. Schedule invocations must be separated by at least one hour.\\n\\nFormat of at expressions is \\" `at(yyyy-mm-ddThh:mm:ss)` \\". For example, \\" `at(2016-03-04T17:27:00)` \\".\\n\\nFormat of cron expressions is \\" `cron(Minutes Hours Day-of-month Month Day-of-week Year)` \\". For example, \\" `cron(0 10 ? * MON *)` \\". For more information, see [Cron Expressions](https://docs.aws.amazon.com//AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions) in the *Amazon CloudWatch Events User Guide* .","ScheduledActionDescription":"The description of the scheduled action.","ScheduledActionName":"The name of the scheduled action.","StartTime":"The start time in UTC when the schedule is active. Before this time, the scheduled action does not trigger.","TargetAction":"A JSON format string of the Amazon Redshift API operation with input parameters.\\n\\n\\" `{\\\\\\"ResizeCluster\\\\\\":{\\\\\\"NodeType\\\\\\":\\\\\\"ds2.8xlarge\\\\\\",\\\\\\"ClusterIdentifier\\\\\\":\\\\\\"my-test-cluster\\\\\\",\\\\\\"NumberOfNodes\\\\\\":3}}` \\"."}},"AWS::Redshift::ScheduledAction.PauseClusterMessage":{"attributes":{},"description":"Describes a pause cluster operation. For example, a scheduled action to run the `PauseCluster` API operation.","properties":{"ClusterIdentifier":"The identifier of the cluster to be paused."}},"AWS::Redshift::ScheduledAction.ResizeClusterMessage":{"attributes":{},"description":"Describes a resize cluster operation. For example, a scheduled action to run the `ResizeCluster` API operation.","properties":{"Classic":"A boolean value indicating whether the resize operation is using the classic resize process. If you don\'t provide this parameter or set the value to `false` , the resize type is elastic.","ClusterIdentifier":"The unique identifier for the cluster to resize.","ClusterType":"The new cluster type for the specified cluster.","NodeType":"The new node type for the nodes you are adding. If not specified, the cluster\'s current node type is used.","NumberOfNodes":"The new number of nodes for the cluster. If not specified, the cluster\'s current number of nodes is used."}},"AWS::Redshift::ScheduledAction.ResumeClusterMessage":{"attributes":{},"description":"Describes a resume cluster operation. For example, a scheduled action to run the `ResumeCluster` API operation.","properties":{"ClusterIdentifier":"The identifier of the cluster to be resumed."}},"AWS::Redshift::ScheduledAction.ScheduledActionType":{"attributes":{},"description":"The action type that specifies an Amazon Redshift API operation that is supported by the Amazon Redshift scheduler.","properties":{"PauseCluster":"An action that runs a `PauseCluster` API operation.","ResizeCluster":"An action that runs a `ResizeCluster` API operation.","ResumeCluster":"An action that runs a `ResumeCluster` API operation."}},"AWS::RedshiftServerless::Namespace":{"attributes":{"Namespace":"The collection of computing resources from which an endpoint is created.","Namespace.AdminUsername":"The username of the administrator for the first database created in the namespace.","Namespace.CreationDate":"The date of when the namespace was created.","Namespace.DbName":"The name of the first database created in the namespace.","Namespace.DefaultIamRoleArn":"The Amazon Resource Name (ARN) of the IAM role to set as a default in the namespace.","Namespace.IamRoles":"A list of IAM roles to associate with the namespace.","Namespace.KmsKeyId":"The ID of the AWS Key Management Service key used to encrypt your data.","Namespace.LogExports":"The types of logs the namespace can export. Available export types are `User log` , `Connection log` , and `User activity log` .","Namespace.NamespaceArn":"The Amazon Resource Name (ARN) associated with a namespace.","Namespace.NamespaceId":"The unique identifier of a namespace.","Namespace.NamespaceName":"The name of the namespace. Must be between 3-64 alphanumeric characters in lowercase, and it cannot be a reserved word. A list of reserved words can be found in [Reserved Words](https://docs.aws.amazon.com//redshift/latest/dg/r_pg_keywords.html) in the Amazon Redshift Database Developer Guide.","Namespace.Status":"The status of the namespace.","Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, Ref returns the NamespaceName, such as `sample-namespace.` For more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"A collection of database objects and users.","properties":{"AdminUserPassword":"The password of the administrator for the primary database created in the namespace.","AdminUsername":"The username of the administrator for the primary database created in the namespace.","DbName":"The name of the primary database created in the namespace.","DefaultIamRoleArn":"The Amazon Resource Name (ARN) of the IAM role to set as a default in the namespace.","FinalSnapshotName":"The name of the snapshot to be created before the namespace is deleted.","FinalSnapshotRetentionPeriod":"How long to retain the final snapshot.","IamRoles":"A list of IAM roles to associate with the namespace.","KmsKeyId":"The ID of the AWS Key Management Service key used to encrypt your data.","LogExports":"The types of logs the namespace can export. Available export types are `userlog` , `connectionlog` , and `useractivitylog` .","NamespaceName":"The name of the namespace. Must be between 3-64 alphanumeric characters in lowercase, and it cannot be a reserved word. A list of reserved words can be found in [Reserved Words](https://docs.aws.amazon.com//redshift/latest/dg/r_pg_keywords.html) in the Amazon Redshift Database Developer Guide.","Tags":"The map of the key-value pairs used to tag the namespace."}},"AWS::RedshiftServerless::Namespace.Namespace":{"attributes":{},"description":"A collection of database objects and users.","properties":{"AdminUsername":"The username of the administrator for the first database created in the namespace.","CreationDate":"The date of when the namespace was created.","DbName":"The name of the first database created in the namespace.","DefaultIamRoleArn":"The Amazon Resource Name (ARN) of the IAM role to set as a default in the namespace.","IamRoles":"A list of IAM roles to associate with the namespace.","KmsKeyId":"The ID of the AWS Key Management Service key used to encrypt your data.","LogExports":"The types of logs the namespace can export. Available export types are User log, Connection log, and User activity log.","NamespaceArn":"The Amazon Resource Name (ARN) associated with a namespace.","NamespaceId":"The unique identifier of a namespace.","NamespaceName":"The name of the namespace. Must be between 3-64 alphanumeric characters in lowercase, and it cannot be a reserved word. A list of reserved words can be found in [Reserved Words](https://docs.aws.amazon.com//redshift/latest/dg/r_pg_keywords.html) in the Amazon Redshift Database Developer Guide.","Status":"The status of the namespace."}},"AWS::RedshiftServerless::Workgroup":{"attributes":{"Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, Ref returns the WorkgroupName, such as `sample-workgroup.` For more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) .","Workgroup":"Returns the `Workgroup` value.","Workgroup.BaseCapacity":"The base data warehouse capacity of the workgroup in Redshift Processing Units (RPUs).","Workgroup.ConfigParameters":"","Workgroup.CreationDate":"The creation date of the workgroup.","Workgroup.Endpoint":"","Workgroup.Endpoint.Address":"The DNS address of the VPC endpoint.","Workgroup.Endpoint.Port":"The custom port to use when connecting to a workgroup. Valid port ranges are 5431-5455 and 8191-8215. The default is 5439.","Workgroup.Endpoint.VpcEndpoints":"","Workgroup.EnhancedVpcRouting":"The value that specifies whether to enable enhanced virtual private cloud (VPC) routing, which forces Amazon Redshift Serverless to route traffic through your VPC.","Workgroup.NamespaceName":"The namespace the workgroup is associated with.","Workgroup.PubliclyAccessible":"A value that specifies whether the workgroup can be accessible from a public network.","Workgroup.SecurityGroupIds":"An array of security group IDs to associate with the workgroup.","Workgroup.Status":"The status of the workgroup.","Workgroup.SubnetIds":"An array of subnet IDs the workgroup is associated with.","Workgroup.WorkgroupArn":"The Amazon Resource Name (ARN) that links to the workgroup.","Workgroup.WorkgroupId":"The unique identifier of the workgroup.","Workgroup.WorkgroupName":"The name of the workgroup."},"description":"The collection of compute resources in Amazon Redshift Serverless.","properties":{"BaseCapacity":"The base compute capacity of the workgroup in Redshift Processing Units (RPUs).","ConfigParameters":"A list of parameters to set for finer control over a database. Available options are `datestyle` , `enable_user_activity_logging` , `query_group` , `search_path` , and `max_query_execution_time` .","EnhancedVpcRouting":"The value that specifies whether to enable enhanced virtual private cloud (VPC) routing, which forces Amazon Redshift Serverless to route traffic through your VPC.","NamespaceName":"The namespace the workgroup is associated with.","Port":"The custom port to use when connecting to a workgroup. Valid port ranges are 5431-5455 and 8191-8215. The default is 5439.","PubliclyAccessible":"A value that specifies whether the workgroup can be accessible from a public network.","SecurityGroupIds":"A list of security group IDs to associate with the workgroup.","SubnetIds":"A list of subnet IDs the workgroup is associated with.","Tags":"The map of the key-value pairs used to tag the workgroup.","WorkgroupName":"The name of the workgroup."}},"AWS::RedshiftServerless::Workgroup.ConfigParameter":{"attributes":{},"description":"A array of parameters to set for more control over a serverless database.","properties":{"ParameterKey":"The key of the parameter. The options are `datestyle` , `enable_user_activity_logging` , `query_group` , `search_path` , and `max_query_execution_time` .","ParameterValue":"The value of the parameter to set."}},"AWS::RedshiftServerless::Workgroup.Endpoint":{"attributes":{},"description":"The VPC endpoint object.","properties":{"Address":"The DNS address of the VPC endpoint.","Port":"The port that Amazon Redshift Serverless listens on.","VpcEndpoints":"An array of `VpcEndpoint` objects."}},"AWS::RedshiftServerless::Workgroup.NetworkInterface":{"attributes":{},"description":"Contains information about a network interface in an Amazon Redshift Serverless managed VPC endpoint.","properties":{"AvailabilityZone":"The availability Zone.","NetworkInterfaceId":"The unique identifier of the network interface.","PrivateIpAddress":"The IPv4 address of the network interface within the subnet.","SubnetId":"The unique identifier of the subnet."}},"AWS::RedshiftServerless::Workgroup.VpcEndpoint":{"attributes":{},"description":"The connection endpoint for connecting to Amazon Redshift Serverless through the proxy.","properties":{"NetworkInterfaces":"One or more network interfaces of the endpoint. Also known as an interface endpoint.","VpcEndpointId":"The connection endpoint ID for connecting to Amazon Redshift Serverless.","VpcId":"The VPC identifier that the endpoint is associated with."}},"AWS::RedshiftServerless::Workgroup.Workgroup":{"attributes":{},"description":"The collection of computing resources from which an endpoint is created.","properties":{"BaseCapacity":"The base data warehouse capacity of the workgroup in Redshift Processing Units (RPUs).","ConfigParameters":"An array of parameters to set for advanced control over a database. The options are `auto_mv` , `datestyle` , `enable_case_sensitivity_identifier` , `enable_user_activity_logging` , `query_group` , , `search_path` , and query monitoring metrics that let you define performance boundaries. For more information about query monitoring rules and available metrics, see [Query monitoring metrics for Amazon Redshift Serverless](https://docs.aws.amazon.com/redshift/latest/dg/cm-c-wlm-query-monitoring-rules.html#cm-c-wlm-query-monitoring-metrics-serverless) .","CreationDate":"The creation date of the workgroup.","Endpoint":"The endpoint that is created from the workgroup.","EnhancedVpcRouting":"The value that specifies whether to enable enhanced virtual private cloud (VPC) routing, which forces Amazon Redshift Serverless to route traffic through your VPC.","NamespaceName":"The namespace the workgroup is associated with.","PubliclyAccessible":"A value that specifies whether the workgroup can be accessible from a public network","SecurityGroupIds":"An array of security group IDs to associate with the workgroup.","Status":"The status of the workgroup.","SubnetIds":"An array of subnet IDs the workgroup is associated with.","WorkgroupArn":"The Amazon Resource Name (ARN) that links to the workgroup.","WorkgroupId":"The unique identifier of the workgroup.","WorkgroupName":"The name of the workgroup."}},"AWS::RefactorSpaces::Application":{"attributes":{"ApiGatewayId":"The resource ID of the API Gateway for the proxy.","ApplicationIdentifier":"The unique identifier of the application.","Arn":"The Amazon Resource Name (ARN) of the application.","NlbArn":"The Amazon Resource Name (ARN) of the Network Load Balancer .","NlbName":"The name of the Network Load Balancer configured by the API Gateway proxy.","ProxyUrl":"The endpoint URL of the Amazon API Gateway proxy.","Ref":"`Ref` returns a composite ID following this format: `|` , for example, `env-1234654123|app-1234654123` .","StageName":"The name of the API Gateway stage. The name defaults to `prod` .","VpcLinkId":"The `VpcLink` ID of the API Gateway proxy."},"description":"Creates an AWS Migration Hub Refactor Spaces application. The account that owns the environment also owns the applications created inside the environment, regardless of the account that creates the application. Refactor Spaces provisions an Amazon API Gateway , API Gateway VPC link, and Network Load Balancer for the application proxy inside your account.\\n\\nIn environments created with a [CreateEnvironment:NetworkFabricType](https://docs.aws.amazon.com/migrationhub-refactor-spaces/latest/APIReference/API_CreateEnvironment.html#migrationhubrefactorspaces-CreateEnvironment-request-NetworkFabricType) of `NONE` you need to configure [VPC to VPC connectivity](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/amazon-vpc-to-amazon-vpc-connectivity-options.html) between your service VPC and the application proxy VPC to route traffic through the application proxy to a service with a private URL endpoint. For more information, see [Create an application](https://docs.aws.amazon.com/migrationhub-refactor-spaces/latest/userguide/getting-started-create-application.html) in the *Refactor Spaces User Guide* .","properties":{"ApiGatewayProxy":"The endpoint URL of the Amazon API Gateway proxy.","EnvironmentIdentifier":"The unique identifier of the environment.","Name":"The name of the application.","ProxyType":"The proxy type of the proxy created within the application.","Tags":"The tags assigned to the application.","VpcId":"The ID of the virtual private cloud (VPC)."}},"AWS::RefactorSpaces::Application.ApiGatewayProxyInput":{"attributes":{},"description":"A wrapper object holding the Amazon API Gateway endpoint input.","properties":{"EndpointType":"The type of endpoint to use for the API Gateway proxy. If no value is specified in the request, the value is set to `REGIONAL` by default.\\n\\nIf the value is set to `PRIVATE` in the request, this creates a private API endpoint that is isolated from the public internet. The private endpoint can only be accessed by using Amazon Virtual Private Cloud ( Amazon VPC ) interface endpoints for the Amazon API Gateway that has been granted access. For more information about creating a private connection with Refactor Spaces and interface endpoint ( AWS PrivateLink ) availability, see [Access Refactor Spaces using an interface endpoint ( AWS PrivateLink )](https://docs.aws.amazon.com/migrationhub-refactor-spaces/latest/userguide/vpc-interface-endpoints.html) .","StageName":"The name of the API Gateway stage. The name defaults to `prod` ."}},"AWS::RefactorSpaces::Environment":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the environment.","EnvironmentIdentifier":"The unique identifier of the environment.","Ref":"`Ref` returns the ID of the environment, for example, `env-1234654123` .","TransitGatewayId":"The ID of the AWS Transit Gateway set up by the environment."},"description":"Creates an AWS Migration Hub Refactor Spaces environment. The caller owns the environment resource, and all Refactor Spaces applications, services, and routes created within the environment. They are referred to as the *environment owner* . The environment owner has cross-account visibility and control of Refactor Spaces resources that are added to the environment by other accounts that the environment is shared with.\\n\\nWhen creating an environment with a [CreateEnvironment:NetworkFabricType](https://docs.aws.amazon.com/migrationhub-refactor-spaces/latest/APIReference/API_CreateEnvironment.html#migrationhubrefactorspaces-CreateEnvironment-request-NetworkFabricType) of `TRANSIT_GATEWAY` , Refactor Spaces provisions a transit gateway to enable services in VPCs to communicate directly across accounts. If [CreateEnvironment:NetworkFabricType](https://docs.aws.amazon.com/migrationhub-refactor-spaces/latest/APIReference/API_CreateEnvironment.html#migrationhubrefactorspaces-CreateEnvironment-request-NetworkFabricType) is `NONE` , Refactor Spaces does not create a transit gateway and you must use your network infrastructure to route traffic to services with private URL endpoints.","properties":{"Description":"A description of the environment.","Name":"The name of the environment.","NetworkFabricType":"The network fabric type of the environment.","Tags":"The tags assigned to the environment."}},"AWS::RefactorSpaces::Route":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the route.","PathResourceToId":"A mapping of Amazon API Gateway path resources to resource IDs.","Ref":"`Ref` returns a composite ID following this format: `||` , for example, `env-1234654123|app-1234654123|rte-1234654123` .","RouteIdentifier":"The unique identifier of the route."},"description":"Creates an AWS Migration Hub Refactor Spaces route. The account owner of the service resource is always the environment owner, regardless of which account creates the route. Routes target a service in the application. If an application does not have any routes, then the first route must be created as a `DEFAULT` `RouteType` .\\n\\nWhen created, the default route defaults to an active state so state is not a required input. However, like all other state values the state of the default route can be updated after creation, but only when all other routes are also inactive. Conversely, no route can be active without the default route also being active.\\n\\n> In the `AWS::RefactorSpaces::Route` resource, you can only update the `ActivationState` property, which resides under the `UriPathRoute` and `DefaultRoute` properties. All other properties associated with the `AWS::RefactorSpaces::Route` cannot be updated, even though the property description might indicate otherwise. Updating all other properties will result in the replacement of Route. \\n\\nWhen you create a route, Refactor Spaces configures the Amazon API Gateway to send traffic to the target service as follows:\\n\\n- *URL Endpoints*\\n\\nIf the service has a URL endpoint, and the endpoint resolves to a private IP address, Refactor Spaces routes traffic using the API Gateway VPC link. If a service endpoint resolves to a public IP address, Refactor Spaces routes traffic over the public internet. Services can have HTTP or HTTPS URL endpoints. For HTTPS URLs, publicly-signed certificates are supported. Private Certificate Authorities (CAs) are permitted only if the CA\'s domain is also publicly resolvable.\\n\\nRefactor Spaces automatically resolves the public Domain Name System (DNS) names that are set in `CreateService:UrlEndpoint` when you create a service. The DNS names resolve when the DNS time-to-live (TTL) expires, or every 60 seconds for TTLs less than 60 seconds. This periodic DNS resolution ensures that the route configuration remains up-to-date.\\n\\n*One-time health check*\\n\\nA one-time health check is performed on the service when either the route is updated from inactive to active, or when it is created with an active state. If the health check fails, the route transitions the route state to `FAILED` , an error code of `SERVICE_ENDPOINT_HEALTH_CHECK_FAILURE` is provided, and no traffic is sent to the service.\\n\\nFor private URLs, a target group is created on the Network Load Balancer and the load balancer target group runs default target health checks. By default, the health check is run against the service endpoint URL. Optionally, the health check can be performed against a different protocol, port, and/or path using the [CreateService:UrlEndpoint](https://docs.aws.amazon.com/migrationhub-refactor-spaces/latest/APIReference/API_CreateService.html#migrationhubrefactorspaces-CreateService-request-UrlEndpoint) parameter. All other health check settings for the load balancer use the default values described in the [Health checks for your target groups](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html) in the *Elastic Load Balancing guide* . The health check is considered successful if at least one target within the target group transitions to a healthy state.\\n- *AWS Lambda function endpoints*\\n\\nIf the service has an AWS Lambda function endpoint, then Refactor Spaces configures the Lambda function\'s resource policy to allow the application\'s API Gateway to invoke the function.\\n\\nThe Lambda function state is checked. If the function is not active, the function configuration is updated so that Lambda resources are provisioned. If the Lambda state is `Failed` , then the route creation fails. For more information, see the [GetFunctionConfiguration\'s State response parameter](https://docs.aws.amazon.com/lambda/latest/dg/API_GetFunctionConfiguration.html#SSS-GetFunctionConfiguration-response-State) in the *AWS Lambda Developer Guide* .\\n\\nA check is performed to determine that a Lambda function with the specified ARN exists. If it does not exist, the health check fails. For public URLs, a connection is opened to the public endpoint. If the URL is not reachable, the health check fails.\\n\\n*Environments without a network bridge*\\n\\nWhen you create environments without a network bridge ( [CreateEnvironment:NetworkFabricType](https://docs.aws.amazon.com/migrationhub-refactor-spaces/latest/APIReference/API_CreateEnvironment.html#migrationhubrefactorspaces-CreateEnvironment-request-NetworkFabricType) is `NONE)` and you use your own networking infrastructure, you need to configure [VPC to VPC connectivity](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/amazon-vpc-to-amazon-vpc-connectivity-options.html) between your network and the application proxy VPC. Route creation from the application proxy to service endpoints will fail if your network is not configured to connect to the application proxy VPC. For more information, see [Create a route](https://docs.aws.amazon.com/migrationhub-refactor-spaces/latest/userguide/getting-started-create-role.html) in the *Refactor Spaces User Guide* .","properties":{"ApplicationIdentifier":"The unique identifier of the application.","DefaultRoute":"Configuration for the default route type.","EnvironmentIdentifier":"The unique identifier of the environment.","RouteType":"The route type of the route.","ServiceIdentifier":"The unique identifier of the service.","Tags":"The tags assigned to the route.","UriPathRoute":"The configuration for the URI path route type."}},"AWS::RefactorSpaces::Route.DefaultRouteInput":{"attributes":{},"description":"The configuration for the default route type.","properties":{"ActivationState":"If set to `ACTIVE` , traffic is forwarded to this route’s service after the route is created."}},"AWS::RefactorSpaces::Route.UriPathRouteInput":{"attributes":{},"description":"The configuration for the URI path route type.","properties":{"ActivationState":"If set to `ACTIVE` , traffic is forwarded to this route’s service after the route is created.","AppendSourcePath":"If set to `true` , this option appends the source path to the service URL endpoint.","IncludeChildPaths":"Indicates whether to match all subpaths of the given source path. If this value is `false` , requests must match the source path exactly before they are forwarded to this route\'s service.","Methods":"A list of HTTP methods to match. An empty list matches all values. If a method is present, only HTTP requests using that method are forwarded to this route’s service.","SourcePath":"This is the path that Refactor Spaces uses to match traffic. Paths must start with `/` and are relative to the base of the application. To use path parameters in the source path, add a variable in curly braces. For example, the resource path {user} represents a path parameter called \'user\'."}},"AWS::RefactorSpaces::Service":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the service.","Ref":"`Ref` returns a composite ID following this format: `||` . For example, `env-1234654123|app-1234654123|svc-1234654123` .","ServiceIdentifier":"The unique identifier of the service."},"description":"Creates an AWS Migration Hub Refactor Spaces service. The account owner of the service is always the environment owner, regardless of which account in the environment creates the service. Services have either a URL endpoint in a virtual private cloud (VPC), or a Lambda function endpoint.\\n\\n> If an AWS resource is launched in a service VPC, and you want it to be accessible to all of an environment’s services with VPCs and routes, apply the `RefactorSpacesSecurityGroup` to the resource. Alternatively, to add more cross-account constraints, apply your own security group.","properties":{"ApplicationIdentifier":"The unique identifier of the application.","Description":"A description of the service.","EndpointType":"The endpoint type of the service.","EnvironmentIdentifier":"The unique identifier of the environment.","LambdaEndpoint":"A summary of the configuration for the AWS Lambda endpoint type.","Name":"The name of the service.","Tags":"The tags assigned to the service.","UrlEndpoint":"The summary of the configuration for the URL endpoint type.","VpcId":"The ID of the virtual private cloud (VPC)."}},"AWS::RefactorSpaces::Service.LambdaEndpointInput":{"attributes":{},"description":"The input for the AWS Lambda endpoint type.","properties":{"Arn":"The Amazon Resource Name (ARN) of the Lambda function or alias."}},"AWS::RefactorSpaces::Service.UrlEndpointInput":{"attributes":{},"description":"The configuration for the URL endpoint type.","properties":{"HealthUrl":"The health check URL of the URL endpoint type. If the URL is a public endpoint, the `HealthUrl` must also be a public endpoint. If the URL is a private endpoint inside a virtual private cloud (VPC), the health URL must also be a private endpoint, and the host must be the same as the URL.","Url":"The URL to route traffic to. The URL must be an [rfc3986-formatted URL](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc3986) . If the host is a domain name, the name must be resolvable over the public internet. If the scheme is `https` , the top level domain of the host must be listed in the [IANA root zone database](https://docs.aws.amazon.com/https://www.iana.org/domains/root/db) ."}},"AWS::Rekognition::Collection":{"attributes":{"Arn":"Returns the Amazon Resource Name of the collection.","Ref":"`Ref` returns the collection ID. For example:\\n\\n`{ \\"Ref\\": \\"MyCollection\\" }`"},"description":"The `AWS::Rekognition::Collection` type creates a server-side container called a collection. You can use a collection to store information about detected faces and search for known faces in images, stored videos, and streaming videos.","properties":{"CollectionId":"ID for the collection that you are creating.","Tags":"A set of tags (key-value pairs) that you want to attach to the collection."}},"AWS::Rekognition::Project":{"attributes":{"Arn":"Returns the Amazon Resource Name of the project.","Ref":"`Ref` returns the project name. For example:\\n\\n`{ \\"Ref\\": \\"CircuitBoardProject\\" }`"},"description":"The `AWS::Rekognition::Project` type creates an Amazon Rekognition Custom Labels project. A project is a group of resources needed to create and manage versions of an Amazon Rekognition Custom Labels model.","properties":{"ProjectName":"The name of the project to create."}},"AWS::Rekognition::StreamProcessor":{"attributes":{"Arn":"Amazon Resource Name for the newly created stream processor.","Ref":"`Ref` returns the name of the stream processor. For example:\\n\\n`{ \\"Ref\\": \\"MyStreamProcessor\\" }`","Status":"Current status of the Amazon Rekognition stream processor.","StatusMessage":"Detailed status message about the stream processor."},"description":"The `AWS::Rekognition::StreamProcessor` type creates a stream processor used to detect and recognize faces or to detect connected home labels in a streaming video. Amazon Rekognition Video is a consumer of live video from Amazon Kinesis Video Streams. There are two different settings for stream processors in Amazon Rekognition, one for detecting faces and one for connected home features.\\n\\nIf you are creating a stream processor for detecting faces, you provide a Kinesis video stream (input) and a Kinesis data stream (output). You also specify the face recognition criteria in FaceSearchSettings. For example, the collection containing faces that you want to recognize.\\n\\nIf you are creating a stream processor for detection of connected home labels, you provide a Kinesis video stream for input, and for output an Amazon S3 bucket and an Amazon SNS topic. You can also provide a KMS key ID to encrypt the data sent to your Amazon S3 bucket. You specify what you want to detect in ConnectedHomeSettings, such as people, packages, and pets.\\n\\nYou can also specify where in the frame you want Amazon Rekognition to monitor with BoundingBoxRegionsOfInterest and PolygonRegionsOfInterest. The Name is used to manage the stream processor and it is the identifier for the stream processor. The `AWS::Rekognition::StreamProcessor` resource creates a stream processor in the same Region where you create the Amazon CloudFormation stack.\\n\\nFor more information, see [CreateStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor) .","properties":{"BoundingBoxRegionsOfInterest":"List of BoundingBox objects, each of which denotes a region of interest on screen. For more information, see the BoundingBox field of [RegionOfInterest](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_RegionOfInterest) .","ConnectedHomeSettings":"Connected home settings to use on a streaming video. You can use a stream processor for connected home features and select what you want the stream processor to detect, such as people or pets. When the stream processor has started, one notification is sent for each object class specified. For more information, see the ConnectedHome section of [StreamProcessorSettings](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StreamProcessorSettings) .","DataSharingPreference":"Allows you to opt in or opt out to share data with Rekognition to improve model performance. You can choose this option at the account level or on a per-stream basis. Note that if you opt out at the account level this setting is ignored on individual streams. For more information, see [StreamProcessorDataSharingPreference](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StreamProcessorDataSharingPreference) .","FaceSearchSettings":"The input parameters used to recognize faces in a streaming video analyzed by an Amazon Rekognition stream processor. For more information regarding the contents of the parameters, see [FaceSearchSettings](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_FaceSearchSettings) .","KinesisDataStream":"Amazon Rekognition\'s Video Stream Processor takes a Kinesis video stream as input. This is the Amazon Kinesis Data Streams instance to which the Amazon Rekognition stream processor streams the analysis results. This must be created within the constraints specified at [KinesisDataStream](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_KinesisDataStream) .","KinesisVideoStream":"The Kinesis video stream that provides the source of the streaming video for an Amazon Rekognition Video stream processor. For more information, see [KinesisVideoStream](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_KinesisVideoStream) .","KmsKeyId":"The identifier for your Amazon Key Management Service key (Amazon KMS key). Optional parameter for connected home stream processors used to encrypt results and data published to your Amazon S3 bucket. For more information, see the KMSKeyId section of [CreateStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor) .","Name":"The Name attribute specifies the name of the stream processor and it must be within the constraints described in the Name section of [StreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StreamProcessor) . If you don\'t specify a name, Amazon CloudFormation generates a unique ID and uses that ID for the stream processor name.","NotificationChannel":"The Amazon Simple Notification Service topic to which Amazon Rekognition publishes the object detection results and completion status of a video analysis operation. Amazon Rekognition publishes a notification the first time an object of interest or a person is detected in the video stream. Amazon Rekognition also publishes an end-of-session notification with a summary when the stream processing session is complete. For more information, see [StreamProcessorNotificationChannel](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StreamProcessorNotificationChannel) .","PolygonRegionsOfInterest":"A set of ordered lists of [Point](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_Point) objects. Each entry of the set contains a polygon denoting a region of interest on the screen. Each polygon is an ordered list of [Point](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_Point) objects. For more information, see the Polygon field of [RegionOfInterest](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_RegionOfInterest) .","RoleArn":"The ARN of the IAM role that allows access to the stream processor. The IAM role provides Rekognition read permissions to the Kinesis stream. It also provides write permissions to an Amazon S3 bucket and Amazon Simple Notification Service topic for a connected home stream processor. This is required for both face search and connected home stream processors. For information about constraints, see the RoleArn section of [CreateStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor) .","S3Destination":"The Amazon S3 bucket location to which Amazon Rekognition publishes the detailed inference results of a video analysis operation. For more information, see the S3Destination section of [StreamProcessorOutput](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StreamProcessorOutput) .","Tags":"A set of tags (key-value pairs) that you want to attach to the stream processor. For more information, see the Tags section of [CreateStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor) ."}},"AWS::Rekognition::StreamProcessor.BoundingBox":{"attributes":{},"description":"Identifies the bounding box around the label, face, text, or personal protective equipment. The `left` (x-coordinate) and `top` (y-coordinate) are coordinates representing the top and left sides of the bounding box. Note that the upper-left corner of the image is the origin (0,0).\\n\\nThe `top` and `left` values returned are ratios of the overall image size. For example, if the input image is 700x200 pixels, and the top-left coordinate of the bounding box is 350x50 pixels, the API returns a `left` value of 0.5 (350/700) and a `top` value of 0.25 (50/200).\\n\\nThe `width` and `height` values represent the dimensions of the bounding box as a ratio of the overall image dimension. For example, if the input image is 700x200 pixels, and the bounding box width is 70 pixels, the width returned is 0.1. For more information, see [BoundingBox](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_BoundingBox) .\\n\\n> The bounding box coordinates can have negative values. For example, if Amazon Rekognition is able to detect a face that is at the image edge and is only partially visible, the service can return coordinates that are outside the image bounds and, depending on the image edge, you might get negative values or values greater than 1 for the `left` or `top` values.","properties":{"Height":"Height of the bounding box as a ratio of the overall image height.","Left":"Left coordinate of the bounding box as a ratio of overall image width.","Top":"Top coordinate of the bounding box as a ratio of overall image height.","Width":"Width of the bounding box as a ratio of the overall image width."}},"AWS::Rekognition::StreamProcessor.ConnectedHomeSettings":{"attributes":{},"description":"Connected home settings to use on a streaming video. Defining the settings is required in the request parameter for `CreateStreamProcessor` . Including this setting in the CreateStreamProcessor request lets you use the stream processor for connected home features. You can then select what you want the stream processor to detect, such as people or pets.\\n\\nWhen the stream processor has started, one notification is sent for each object class specified. For example, if packages and pets are selected, one SNS notification is published the first time a package is detected and one SNS notification is published the first time a pet is detected. An end-of-session summary is also published. For more information, see the ConnectedHome section of [StreamProcessorSettings](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StreamProcessorSettings) .","properties":{"Labels":"Specifies what you want to detect in the video, such as people, packages, or pets. The current valid labels you can include in this list are: \\"PERSON\\", \\"PET\\", \\"PACKAGE\\", and \\"ALL\\".","MinConfidence":"The minimum confidence required to label an object in the video."}},"AWS::Rekognition::StreamProcessor.DataSharingPreference":{"attributes":{},"description":"Allows you to opt in or opt out to share data with Rekognition to improve model performance. You can choose this option at the account level or on a per-stream basis. Note that if you opt out at the account level, this setting is ignored on individual streams. For more information, see [StreamProcessorDataSharingPreference](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StreamProcessorDataSharingPreference) .","properties":{"OptIn":"Describes the opt-in status applied to a stream processor\'s data sharing policy."}},"AWS::Rekognition::StreamProcessor.FaceSearchSettings":{"attributes":{},"description":"The input parameters used to recognize faces in a streaming video analyzed by a Amazon Rekognition stream processor. `FaceSearchSettings` is a request parameter for [CreateStreamProcessor](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CreateStreamProcessor) . For more information, see [FaceSearchSettings](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_FaceSearchSettings) .","properties":{"CollectionId":"The ID of a collection that contains faces that you want to search for.","FaceMatchThreshold":"Minimum face match confidence score that must be met to return a result for a recognized face. The default is 80. 0 is the lowest confidence. 100 is the highest confidence. Values between 0 and 100 are accepted, and values lower than 80 are set to 80."}},"AWS::Rekognition::StreamProcessor.KinesisDataStream":{"attributes":{},"description":"Amazon Rekognition Video Stream Processor take as input a Kinesis video stream (Input) and a Kinesis data stream (Output). This is the Amazon Kinesis Data Streams instance to which the Amazon Rekognition stream processor streams the analysis results. This must be created within the constraints specified at [KinesisDataStream](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_KinesisDataStream) .","properties":{"Arn":"ARN of the output Amazon Kinesis Data Streams stream."}},"AWS::Rekognition::StreamProcessor.KinesisVideoStream":{"attributes":{},"description":"The Kinesis video stream that provides the source of the streaming video for an Amazon Rekognition Video stream processor. For more information, see [KinesisVideoStream](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_KinesisVideoStream) .","properties":{"Arn":"ARN of the Kinesis video stream stream that streams the source video."}},"AWS::Rekognition::StreamProcessor.NotificationChannel":{"attributes":{},"description":"The Amazon Simple Notification Service topic to which Amazon Rekognition publishes the object detection results and completion status of a video analysis operation. Amazon Rekognition publishes a notification the first time an object of interest or a person is detected in the video stream. Amazon Rekognition also publishes an an end-of-session notification with a summary when the stream processing session is complete. For more information, see [StreamProcessorNotificationChannel](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StreamProcessorNotificationChannel) .","properties":{"Arn":"The ARN of the SNS topic that receives notifications."}},"AWS::Rekognition::StreamProcessor.S3Destination":{"attributes":{},"description":"The Amazon S3 bucket location to which Amazon Rekognition publishes the detailed inference results of a video analysis operation. These results include the name of the stream processor resource, the session ID of the stream processing session, and labeled timestamps and bounding boxes for detected labels. For more information, see [S3Destination](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_S3Destination) .","properties":{"BucketName":"Describes the destination Amazon Simple Storage Service (Amazon S3) bucket name of a stream processor\'s exports.","ObjectKeyPrefix":"Describes the destination Amazon Simple Storage Service (Amazon S3) object keys of a stream processor\'s exports."}},"AWS::ResilienceHub::App":{"attributes":{"AppArn":"The Amazon Resource Name (ARN) of the app.","Ref":"The returned Amazon Resource Name (ARN) for the app."},"description":"Creates an AWS Resilience Hub application. An AWS Resilience Hub application is a collection of AWS resources structured to prevent and recover AWS application disruptions. To describe a AWS Resilience Hub application, you provide an application name, resources from one or more AWS CloudFormation stacks, AWS Resource Groups , Terraform state files, AppRegistry applications, and an appropriate resiliency policy. In addition, you can also add resources that are located on Amazon Elastic Kubernetes Service ( Amazon EKS ) clusters as optional resources. For more information about the number of resources supported per application, see [Service quotas](https://docs.aws.amazon.com/general/latest/gr/resiliencehub.html#limits_resiliencehub) .\\n\\nAfter you create an AWS Resilience Hub application, you publish it so that you can run a resiliency assessment on it. You can then use recommendations from the assessment to improve resiliency by running another assessment, comparing results, and then iterating the process until you achieve your goals for recovery time objective (RTO) and recovery point objective (RPO).","properties":{"AppAssessmentSchedule":"Assessment execution schedule with \'Daily\' or \'Disabled\' values.","AppTemplateBody":"A JSON string that provides information about your application structure. To learn more about the `appTemplateBody` template, see the sample template provided in the *Examples* section.\\n\\nThe `appTemplateBody` JSON string has the following structure:\\n\\n- *`resources`*\\n\\nThe list of logical resources that needs to be included in the AWS Resilience Hub application.\\n\\nType: Array\\n\\n> Don\'t add the resources that you want to exclude. \\n\\nEach `resources` array item includes the following fields:\\n\\n- *`logicalResourceId`*\\n\\nThe logical identifier of the resource.\\n\\nType: Object\\n\\nEach `logicalResourceId` object includes the following fields:\\n\\n- `identifier`\\n\\nThe identifier of the resource.\\n\\nType: String\\n- `logicalStackName`\\n\\nThe name of the AWS CloudFormation stack this resource belongs to.\\n\\nType: String\\n- `resourceGroupName`\\n\\nThe name of the resource group this resource belongs to.\\n\\nType: String\\n- `terraformSourceName`\\n\\nThe name of the Terraform S3 state file this resource belongs to.\\n\\nType: String\\n- `eksSourceName`\\n\\nThe name of the Amazon Elastic Kubernetes Service cluster and namespace this resource belongs to.\\n\\n> This parameter accepts values in \\"eks-cluster/namespace\\" format. \\n\\nType: String\\n- *`type`*\\n\\nThe type of resource.\\n\\nType: string\\n- *`name`*\\n\\nThe name of the resource.\\n\\nType: String\\n- `additionalInfo`\\n\\nAdditional configuration parameters for an AWS Resilience Hub application. If you want to implement `additionalInfo` through the AWS Resilience Hub console rather than using an API call, see [Configure the application configuration parameters](https://docs.aws.amazon.com//resilience-hub/latest/userguide/app-config-param.html) .\\n\\n> Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account.\\n> \\n> Key: `\\"failover-regions\\"`\\n> \\n> Value: `\\"[{\\"region\\":\\"\\", \\"accounts\\":[{\\"id\\":\\"\\"}]}]\\"`\\n- *`appComponents`*\\n\\nThe list of Application Components (AppComponent) that this resource belongs to. If an AppComponent is not part of the AWS Resilience Hub application, it will be added.\\n\\nType: Array\\n\\nEach `appComponents` array item includes the following fields:\\n\\n- `name`\\n\\nThe name of the AppComponent.\\n\\nType: String\\n- `type`\\n\\nThe type of AppComponent. For more information about the types of AppComponent, see [Grouping resources in an AppComponent](https://docs.aws.amazon.com/resilience-hub/latest/userguide/AppComponent.grouping.html) .\\n\\nType: String\\n- `resourceNames`\\n\\nThe list of included resources that are assigned to the AppComponent.\\n\\nType: Array of strings\\n- `additionalInfo`\\n\\nAdditional configuration parameters for an AWS Resilience Hub application. If you want to implement `additionalInfo` through the AWS Resilience Hub console rather than using an API call, see [Configure the application configuration parameters](https://docs.aws.amazon.com//resilience-hub/latest/userguide/app-config-param.html) .\\n\\n> Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account.\\n> \\n> Key: `\\"failover-regions\\"`\\n> \\n> Value: `\\"[{\\"region\\":\\"\\", \\"accounts\\":[{\\"id\\":\\"\\"}]}]\\"`\\n- *`excludedResources`*\\n\\nThe list of logical resource identifiers to be excluded from the application.\\n\\nType: Array\\n\\n> Don\'t add the resources that you want to include. \\n\\nEach `excludedResources` array item includes the following fields:\\n\\n- *`logicalResourceIds`*\\n\\nThe logical identifier of the resource.\\n\\nType: Object\\n\\n> You can configure only one of the following fields:\\n> \\n> - `logicalStackName`\\n> - `resourceGroupName`\\n> - `terraformSourceName`\\n> - `eksSourceName` \\n\\nEach `logicalResourceIds` object includes the following fields:\\n\\n- `identifier`\\n\\nThe identifier of the resource.\\n\\nType: String\\n- `logicalStackName`\\n\\nThe name of the AWS CloudFormation stack this resource belongs to.\\n\\nType: String\\n- `resourceGroupName`\\n\\nThe name of the resource group this resource belongs to.\\n\\nType: String\\n- `terraformSourceName`\\n\\nThe name of the Terraform S3 state file this resource belongs to.\\n\\nType: String\\n- `eksSourceName`\\n\\nThe name of the Amazon Elastic Kubernetes Service cluster and namespace this resource belongs to.\\n\\n> This parameter accepts values in \\"eks-cluster/namespace\\" format. \\n\\nType: String\\n- *`version`*\\n\\nThe AWS Resilience Hub application version.\\n- `additionalInfo`\\n\\nAdditional configuration parameters for an AWS Resilience Hub application. If you want to implement `additionalInfo` through the AWS Resilience Hub console rather than using an API call, see [Configure the application configuration parameters](https://docs.aws.amazon.com//resilience-hub/latest/userguide/app-config-param.html) .\\n\\n> Currently, this parameter accepts a key-value mapping (in a string format) of only one failover region and one associated account.\\n> \\n> Key: `\\"failover-regions\\"`\\n> \\n> Value: `\\"[{\\"region\\":\\"\\", \\"accounts\\":[{\\"id\\":\\"\\"}]}]\\"`","Description":"The optional description for an app.","Name":"The name for the application.","ResiliencyPolicyArn":"The Amazon Resource Name (ARN) of the resiliency policy.","ResourceMappings":"An array of ResourceMapping objects.","Tags":"The tags assigned to the resource. A tag is a label that you assign to an AWS resource. Each tag consists of a key/value pair."}},"AWS::ResilienceHub::App.PhysicalResourceId":{"attributes":{},"description":"Defines a physical resource identifier.","properties":{"AwsAccountId":"The AWS account that owns the physical resource.","AwsRegion":"The AWS Region that the physical resource is located in.","Identifier":"The identifier of the physical resource.","Type":"Specifies the type of physical resource identifier.\\n\\n- **Arn** - The resource identifier is an Amazon Resource Name (ARN) and it can identify the following list of resources:\\n\\n- `AWS::ECS::Service`\\n- `AWS::EFS::FileSystem`\\n- `AWS::ElasticLoadBalancingV2::LoadBalancer`\\n- `AWS::Lambda::Function`\\n- `AWS::SNS::Topic`\\n- **Native** - The resource identifier is an AWS Resilience Hub -native identifier and it can identify the following list of resources:\\n\\n- `AWS::ApiGateway::RestApi`\\n- `AWS::ApiGatewayV2::Api`\\n- `AWS::AutoScaling::AutoScalingGroup`\\n- `AWS::DocDB::DBCluster`\\n- `AWS::DocDB::DBGlobalCluster`\\n- `AWS::DocDB::DBInstance`\\n- `AWS::DynamoDB::GlobalTable`\\n- `AWS::DynamoDB::Table`\\n- `AWS::EC2::EC2Fleet`\\n- `AWS::EC2::Instance`\\n- `AWS::EC2::NatGateway`\\n- `AWS::EC2::Volume`\\n- `AWS::ElasticLoadBalancing::LoadBalancer`\\n- `AWS::RDS::DBCluster`\\n- `AWS::RDS::DBInstance`\\n- `AWS::RDS::GlobalCluster`\\n- `AWS::Route53::RecordSet`\\n- `AWS::S3::Bucket`\\n- `AWS::SQS::Queue`"}},"AWS::ResilienceHub::App.ResourceMapping":{"attributes":{},"description":"Defines a resource mapping.","properties":{"EksSourceName":"","LogicalStackName":"The name of the CloudFormation stack this resource is mapped to.","MappingType":"Specifies the type of resource mapping.\\n\\nValid Values: CfnStack | Resource | AppRegistryApp | ResourceGroup | Terraform\\n\\n- **AppRegistryApp** - The resource is mapped to another application. The name of the application is contained in the `appRegistryAppName` property.\\n- **CfnStack** - The resource is mapped to a CloudFormation stack. The name of the CloudFormation stack is contained in the `logicalStackName` property.\\n- **Resource** - The resource is mapped to another resource. The name of the resource is contained in the `resourceName` property.\\n- **ResourceGroup** - The resource is mapped to a resource group. The name of the resource group is contained in the `resourceGroupName` property.","PhysicalResourceId":"The identifier of this resource.","ResourceName":"The name of the resource this resource is mapped to.","TerraformSourceName":"The short name of the Terraform source."}},"AWS::ResilienceHub::ResiliencyPolicy":{"attributes":{"PolicyArn":"The Amazon Resource Name (ARN) of the resiliency policy.","Ref":"The returned Amazon Resource Name (ARN) for the resiliency policy."},"description":"Defines a resiliency policy.","properties":{"DataLocationConstraint":"Specifies a high-level geographical location constraint for where your resilience policy data can be stored.","Policy":"The resiliency policy.","PolicyDescription":"The description for the policy.","PolicyName":"The name of the policy","Tags":"The tags assigned to the resource. A tag is a label that you assign to an AWS resource. Each tag consists of a key/value pair.","Tier":"The tier for this resiliency policy, ranging from the highest severity ( `MissionCritical` ) to lowest ( `NonCritical` )."}},"AWS::ResilienceHub::ResiliencyPolicy.FailurePolicy":{"attributes":{},"description":"Defines a failure policy.","properties":{"RpoInSecs":"The Recovery Point Objective (RPO), in seconds.","RtoInSecs":"The Recovery Time Objective (RTO), in seconds."}},"AWS::ResourceExplorer2::DefaultViewAssociation":{"attributes":{"AssociatedAwsPrincipal":"The unique identifier of the principal for which the specified view was made the default for the AWS Region that contains the view. For example:\\n\\n`123456789012`","Ref":"`Ref` returns the identity of the principal that the view is now associated with in the specified AWS Region . For example:\\n\\n`123456789012`"},"description":"Sets the specified view as the default for the AWS Region in which you call this operation. If a user makes a search query that doesn\'t explicitly specify the view to use, Resource Explorer chooses this default view automatically for searches performed in this AWS Region .","properties":{"ViewArn":"The ARN of the view to set as the default for the AWS Region and AWS account in which you call this operation. The specified view must already exist in the specified Region."}},"AWS::ResourceExplorer2::Index":{"attributes":{"Arn":"The ARN of the new index for the AWS Region . For example:\\n\\n`arn:aws:resource-explorer-2:us-east-1:123456789012:index/EXAMPLE8-90ab-cdef-fedc-EXAMPLE22222`","IndexState":"Indicates the current state of the index. For example:\\n\\n`CREATING`","Ref":"`Ref` returns the ARN of the new index. For example:\\n\\n`arn:aws:resource-explorer-2:us-east-1:123456789012:index/EXAMPLE8-90ab-cdef-fedc-EXAMPLE22222`"},"description":"Turns on Resource Explorer in the AWS Region in which you called this operation by creating an index. Resource Explorer begins discovering the resources in this Region and stores the details about the resources in the index so that they can be queried by using the [Search](https://docs.aws.amazon.com/resource-explorer/latest/apireference/API_Search.html) operation.\\n\\nYou can create either a local index that returns search results from only the AWS Region in which the index exists, or you can create an aggregator index that returns search results from all AWS Regions in the AWS account .\\n\\nFor more details about what happens when you turn on Resource Explorer in an AWS Region , see [Turning on Resource Explorer to index your resources in an AWS Region](https://docs.aws.amazon.com/resource-explorer/latest/userguide/manage-service-activate.html) in the *AWS Resource Explorer User Guide.*\\n\\nIf this is the first AWS Region in which you\'ve created an index for Resource Explorer, this operation also creates a service-linked role in your AWS account that allows Resource Explorer to search for your resources and populate the index.","properties":{"Tags":"The specified tags are attached to only the index created in this AWS Region . The tags don\'t attach to any of the resources listed in the index.","Type":"Specifies the type of the index in this Region. For information about the aggregator index and how it differs from a local index, see [Turning on cross-Region search by creating an aggregator index](https://docs.aws.amazon.com/resource-explorer/latest/userguide/manage-aggregator-region.html) in the *AWS Resource Explorer User Guide.* ."}},"AWS::ResourceExplorer2::View":{"attributes":{"Ref":"`Ref` returns the ARN of the new view. For example:\\n\\n`arn:aws:resource-explorer-2:us-east-1:123456789012:view/CFNStackView2/EXAMPLE8-90ab-cdef-fedc-EXAMPLE22222`","ViewArn":"The ARN of the new view. For example:\\n\\n`arn:aws:resource-explorer-2:us-east-1:123456789012:view/MyView/EXAMPLE8-90ab-cdef-fedc-EXAMPLE22222`"},"description":"Creates a view that users can query by using the [Search](https://docs.aws.amazon.com/resource-explorer/latest/apireference/API_Search.html) operation. Results from queries that you make using this view include only resources that match the view\'s `Filters` .","properties":{"Filters":"An array of strings that include search keywords, prefixes, and operators that filter the results that are returned for queries made using this view. When you use this view in a [Search](https://docs.aws.amazon.com/resource-explorer/latest/apireference/API_Search.html) operation, the filter string is combined with the search\'s `QueryString` parameter using a logical `AND` operator.\\n\\nFor information about the supported syntax, see [Search query reference for Resource Explorer](https://docs.aws.amazon.com/resource-explorer/latest/userguide/using-search-query-syntax.html) in the *AWS Resource Explorer User Guide* .\\n\\n> This query string in the context of this operation supports only [filter prefixes](https://docs.aws.amazon.com/resource-explorer/latest/userguide/using-search-query-syntax.html#query-syntax-filters) with optional [operators](https://docs.aws.amazon.com/resource-explorer/latest/userguide/using-search-query-syntax.html#query-syntax-operators) . It doesn\'t support free-form text. For example, the string `region:us* service:ec2 -tag:stage=prod` includes all Amazon EC2 resources in any AWS Region that begin with the letters `us` and are *not* tagged with a key `Stage` that has the value `prod` .","IncludedProperties":"A list of fields that provide additional information about the view.","Tags":"Tag key and value pairs that are attached to the view.","ViewName":"The name of the new view."}},"AWS::ResourceExplorer2::View.Filters":{"attributes":{},"description":"An object with a `FilterString` that specifies which resources to include in the results of queries made using this view.","properties":{"FilterString":""}},"AWS::ResourceExplorer2::View.IncludedProperty":{"attributes":{},"description":"Information about an additional property that describes a resource, that you can optionally include in a view.","properties":{"Name":"The name of the property that is included in this view."}},"AWS::ResourceGroups::Group":{"attributes":{"Arn":"The ARN of the new resource group.","Ref":"The name of the new resource group."},"description":"Creates a resource group with the specified name and description. You can optionally include either a resource query or a service configuration. For more information about constructing a resource query, see [Build queries and groups in AWS Resource Groups](https://docs.aws.amazon.com//ARG/latest/userguide/getting_started-query.html) in the *AWS Resource Groups User Guide* . For more information about service-linked groups and service configurations, see [Service configurations for Resource Groups](https://docs.aws.amazon.com//ARG/latest/APIReference/about-slg.html) .\\n\\n*Minimum permissions*\\n\\nTo run this command, you must have the following permissions:\\n\\n- `resource-groups:CreateGroup`","properties":{"Configuration":"The service configuration currently associated with the resource group and in effect for the members of the resource group. A `Configuration` consists of one or more `ConfigurationItem` entries. For information about service configurations for resource groups and how to construct them, see [Service configurations for resource groups](https://docs.aws.amazon.com//ARG/latest/APIReference/about-slg.html) in the *AWS Resource Groups User Guide* .\\n\\n> You can include either a `Configuration` or a `ResourceQuery` , but not both.","Description":"The description of the resource group.","Name":"The name of a resource group. The name must be unique within the AWS Region in which you create the resource. To create multiple resource groups based on the same CloudFormation stack, you must generate unique names for each.","ResourceQuery":"The resource query structure that is used to dynamically determine which AWS resources are members of the associated resource group. For more information about queries and how to construct them, see [Build queries and groups in AWS Resource Groups](https://docs.aws.amazon.com//ARG/latest/userguide/gettingstarted-query.html) in the *AWS Resource Groups User Guide*\\n\\n> - You can include either a `ResourceQuery` or a `Configuration` , but not both.\\n> - You can specify the group\'s membership either by using a `ResourceQuery` or by using a list of `Resources` , but not both.","Resources":"A list of the Amazon Resource Names (ARNs) of AWS resources that you want to add to the specified group.\\n\\n> - You can specify the group membership either by using a list of `Resources` or by using a `ResourceQuery` , but not both.\\n> - You can include a `Resources` property only if you also specify a `Configuration` property.","Tags":"The tag key and value pairs that are attached to the resource group."}},"AWS::ResourceGroups::Group.ConfigurationItem":{"attributes":{},"description":"One of the items in the service configuration assigned to a resource group. A service configuration can consist of one or more items. For details service configurations and how to construct them, see [Service configurations for resource groups](https://docs.aws.amazon.com//ARG/latest/APIReference/about-slg.html) in the *AWS Resource Groups User Guide* .","properties":{"Parameters":"A collection of parameters for this configuration item. For the list of parameters that you can use with each configuration item `Type` , see [Supported resource types and parameters](https://docs.aws.amazon.com/ARG/latest/APIReference/about-slg.html#about-slg-types) in the *AWS Resource Groups User Guide* .","Type":"Specifies the type of configuration item. Each item must have a unique value for type. For the list of the types that you can specify for a configuration item, see [Supported resource types and parameters](https://docs.aws.amazon.com/ARG/latest/APIReference/about-slg.html#about-slg-types) in the *AWS Resource Groups User Guide* ."}},"AWS::ResourceGroups::Group.ConfigurationParameter":{"attributes":{},"description":"One parameter for a group configuration item. For details about service configurations and how to construct them, see [Service configurations for resource groups](https://docs.aws.amazon.com//ARG/latest/APIReference/about-slg.html) in the *AWS Resource Groups User Guide* .","properties":{"Name":"The name of the group configuration parameter. For the list of parameters that you can use with each configuration item type, see [Supported resource types and parameters](https://docs.aws.amazon.com//ARG/latest/APIReference/about-slg.html#about-slg-types) in the *AWS Resource Groups User Guide* .","Values":"The value or values to be used for the specified parameter. For the list of values you can use with each parameter, see [Supported resource types and parameters](https://docs.aws.amazon.com//ARG/latest/APIReference/about-slg.html#about-slg-types) ."}},"AWS::ResourceGroups::Group.Query":{"attributes":{},"description":"Specifies details within a `ResourceQuery` structure that determines the membership of the resource group. The contents required in the `Query` structure are determined by the `Type` property of the containing `ResourceQuery` structure.","properties":{"ResourceTypeFilters":"Specifies limits to the types of resources that can be included in the resource group. For example, if `ResourceTypeFilters` is `[\\"AWS::EC2::Instance\\", \\"AWS::DynamoDB::Table\\"]` , only EC2 instances or DynamoDB tables can be members of this resource group. The default value is `[\\"AWS::AllSupported\\"]` .","StackIdentifier":"Specifies the ARN of a CloudFormation stack. All supported resources of the CloudFormation stack are members of the resource group. If you don\'t specify an ARN, this parameter defaults to the current stack that you are defining, which means that all the resources of the current stack are grouped.\\n\\nYou can specify a value for `StackIdentifier` only when the `ResourceQuery.Type` property is `CLOUDFORMATION_STACK_1_0.`","TagFilters":"A list of key-value pair objects that limit which resources can be members of the resource group. This property is required when the `ResourceQuery.Type` property is `TAG_FILTERS_1_0` .\\n\\nA resource must have a tag that matches every filter that is provided in the `TagFilters` list."}},"AWS::ResourceGroups::Group.ResourceQuery":{"attributes":{},"description":"The query used to dynamically define the members of a group. For more information about how to construct a query, see [Build queries and groups in AWS Resource Groups](https://docs.aws.amazon.com//ARG/latest/userguide/gettingstarted-query.html) .","properties":{"Query":"The query that defines the membership of the group. This is a structure with properties that depend on the `Type` .\\n\\nThe `Query` structure must be included in the following scenarios:\\n\\n- When the `Type` is `TAG_FILTERS_1_0` , you must specify a `Query` structure that contains a `TagFilters` list of tags. Resources with tags that match those in the `TagFilter` list become members of the resource group.\\n- When the `Type` is `CLOUDFORMATION_STACK_1_0` then this field is required only when you must specify a CloudFormation stack other than the one you are defining. To do this, the `Query` structure must contain the `StackIdentifier` property. If you don\'t specify either a `Query` structure or a `StackIdentifier` within that `Query` , then it defaults to the CloudFormation stack that you\'re currently constructing.","Type":"Specifies the type of resource query that determines this group\'s membership. There are two valid query types:\\n\\n- `TAG_FILTERS_1_0` indicates that the group is a tag-based group. To complete the group membership, you must include the `TagFilters` property to specify the tag filters to use in the query.\\n- `CLOUDFORMATION_STACK_1_0` , the default, indicates that the group is a CloudFormation stack-based group. Group membership is based on the CloudFormation stack. You must specify the `StackIdentifier` property in the query to define which stack to associate the group with, or leave it empty to default to the stack where the group is defined."}},"AWS::ResourceGroups::Group.TagFilter":{"attributes":{},"description":"Specifies a single tag key and optional values that you can use to specify membership in a tag-based group. An AWS resource that doesn\'t have a matching tag key and value is rejected as a member of the group.\\n\\nA `TagFilter` object includes two properties: `Key` (a string) and `Values` (a list of strings). Only resources in the account that are tagged with a matching key-value pair are members of the group. The `Values` property of `TagFilter` is optional, but specifying it narrows the query results.\\n\\nAs an example, suppose the `TagFilters` string is `[{\\"Key\\": \\"Stage\\", \\"Values\\": [\\"Test\\", \\"Beta\\"]}, {\\"Key\\": \\"Storage\\"}]` . In this case, only resources with all of the following tags are members of the group:\\n\\n- `Stage` tag key with a value of either `Test` or `Beta`\\n- `Storage` tag key with any value","properties":{"Key":"A string that defines a tag key. Only resources in the account that are tagged with a specified tag key are members of the tag-based resource group.\\n\\nThis field is required when the `ResourceQuery` structure\'s `Type` property is `TAG_FILTERS_1_0` . You must specify at least one tag key.","Values":"A list of tag values that can be included in the tag-based resource group. This is optional. If you don\'t specify a value or values for a key, then an AWS resource with any value for that key is a member."}},"AWS::RoboMaker::Fleet":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the fleet, such as `arn:aws:robomaker:us-west-2:123456789012:deployment-fleet/MyFleet/1539894765711` .","Ref":"When you pass the logical ID of an `AWS::RoboMaker::Fleet` resource to the intrinsic `Ref` function, the function returns the Amazon Resource Name (ARN) of the fleet, such as `arn:aws:robomaker:us-west-2:123456789012:deployment-fleet/MyFleet/1539894765711` ."},"description":"> The following resource is now deprecated. This resource can no longer be provisioned via stack create or update operations, and should not be included in your stack templates.\\n> \\n> We recommend migrating to AWS IoT Greengrass Version 2. For more information, see [Support Changes: May 2, 2022](https://docs.aws.amazon.com/robomaker/latest/dg/chapter-support-policy.html#software-support-policy-may2022) in the *AWS RoboMaker Developer Guide* . \\n\\nThe `AWS::RoboMaker::Fleet` resource creates an AWS RoboMaker fleet. Fleets contain robots and can receive deployments.","properties":{"Name":"The name of the fleet.","Tags":"The list of all tags added to the fleet."}},"AWS::RoboMaker::Robot":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the robot.","Ref":"When you pass the logical ID of an `AWS::RoboMaker::Robot` resource to the intrinsic `Ref` function, the function returns the Amazon Resource Name (ARN) of the robot application, such as `arn:aws:robomaker:us-west-2:123456789012:robot/MyRobot/1544035373264` ."},"description":"> The following resource is now deprecated. This resource can no longer be provisioned via stack create or update operations, and should not be included in your stack templates.\\n> \\n> We recommend migrating to AWS IoT Greengrass Version 2. For more information, see [Support Changes: May 2, 2022](https://docs.aws.amazon.com/robomaker/latest/dg/chapter-support-policy.html#software-support-policy-may2022) in the *AWS RoboMaker Developer Guide* . \\n\\nThe `AWS::RoboMaker::RobotApplication` resource creates an AWS RoboMaker robot.","properties":{"Architecture":"The architecture of the robot.","Fleet":"The Amazon Resource Name (ARN) of the fleet to which the robot will be registered.","GreengrassGroupId":"The Greengrass group associated with the robot.","Name":"The name of the robot.","Tags":"A map that contains tag keys and tag values that are attached to the robot."}},"AWS::RoboMaker::RobotApplication":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the robot application.","CurrentRevisionId":"The current revision id.","Ref":"When you pass the logical ID of an `AWS::RoboMaker::RobotApplication` resource to the intrinsic `Ref` function, the function returns the Amazon Resource Name (ARN) of the robot application, such as `arn:aws:robomaker:us-west-2:123456789012:robot-application/MyRobotApplication/1546541208251` ."},"description":"The `AWS::RoboMaker::RobotApplication` resource creates an AWS RoboMaker robot application.","properties":{"CurrentRevisionId":"The current revision id.","Environment":"The environment of the robot application.","Name":"The name of the robot application.","RobotSoftwareSuite":"The robot software suite used by the robot application.","Sources":"The sources of the robot application.","Tags":"A map that contains tag keys and tag values that are attached to the robot application."}},"AWS::RoboMaker::RobotApplication.RobotSoftwareSuite":{"attributes":{},"description":"Information about a robot software suite.","properties":{"Name":"The name of the robot software suite. `General` is the only supported value.","Version":"The version of the robot software suite. Not applicable for General software suite."}},"AWS::RoboMaker::RobotApplication.SourceConfig":{"attributes":{},"description":"Information about a source configuration.","properties":{"Architecture":"The target processor architecture for the application.","S3Bucket":"The Amazon S3 bucket name.","S3Key":"The s3 object key."}},"AWS::RoboMaker::RobotApplicationVersion":{"attributes":{"ApplicationVersion":"The robot application version.","Arn":"The Amazon Resource Name (ARN) of the robot application version.","Ref":"When you pass the logical ID of an `AWS::RoboMaker::RobotApplicationVersion` resource to the intrinsic `Ref` function, the function returns the Amazon Resource Name (ARN) of the robot application version, such as `arn:aws:robomaker:us-west-2:123456789012:robot-application/MyRobotApplication/1546541208251` ."},"description":"The `AWS::RoboMaker::RobotApplicationVersion` resource creates an AWS RoboMaker robot version.","properties":{"Application":"The application information for the robot application.","CurrentRevisionId":"The current revision id for the robot application. If you provide a value and it matches the latest revision ID, a new version will be created."}},"AWS::RoboMaker::SimulationApplication":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the simulation application.","CurrentRevisionId":"The current revision id.","Ref":"When you pass the logical ID of an `AWS::RoboMaker::SimulationApplication` resource to the intrinsic `Ref` function, the function returns the Amazon Resource Name (ARN) of the simulation application, such as `arn:aws:robomaker:us-west-2:123456789012:simulation-application/MySimulationApplication/1546541201334` ."},"description":"The `AWS::RoboMaker::SimulationApplication` resource creates an AWS RoboMaker simulation application.","properties":{"CurrentRevisionId":"The current revision id.","Environment":"The environment of the simulation application.","Name":"The name of the simulation application.","RenderingEngine":"The rendering engine for the simulation application.","RobotSoftwareSuite":"The robot software suite used by the simulation application.","SimulationSoftwareSuite":"The simulation software suite used by the simulation application.","Sources":"The sources of the simulation application.","Tags":"A map that contains tag keys and tag values that are attached to the simulation application."}},"AWS::RoboMaker::SimulationApplication.RenderingEngine":{"attributes":{},"description":"Information about a rendering engine.","properties":{"Name":"The name of the rendering engine.","Version":"The version of the rendering engine."}},"AWS::RoboMaker::SimulationApplication.RobotSoftwareSuite":{"attributes":{},"description":"Information about a robot software suite.","properties":{"Name":"The name of the robot software suite. `General` is the only supported value.","Version":"The version of the robot software suite. Not applicable for General software suite."}},"AWS::RoboMaker::SimulationApplication.SimulationSoftwareSuite":{"attributes":{},"description":"Information about a simulation software suite.","properties":{"Name":"The name of the simulation software suite. `SimulationRuntime` is the only supported value.","Version":"The version of the simulation software suite. Not applicable for `SimulationRuntime` ."}},"AWS::RoboMaker::SimulationApplication.SourceConfig":{"attributes":{},"description":"Information about a source configuration.","properties":{"Architecture":"The target processor architecture for the application.","S3Bucket":"The Amazon S3 bucket name.","S3Key":"The s3 object key."}},"AWS::RoboMaker::SimulationApplicationVersion":{"attributes":{"ApplicationVersion":"The simulation application version.","Arn":"The Amazon Resource Name (ARN) of the simulation application version.","Ref":"When you pass the logical ID of an `AWS::RoboMaker::SimulationApplicationVersion` resource to the intrinsic `Ref` function, the function returns the Amazon Resource Name (ARN) of the simulation application version, such as `arn:aws:robomaker:us-west-2:123456789012:simulation-application/MySimulationApplication/1546541201334` ."},"description":"The `AWS::RoboMaker::SimulationApplicationVersion` resource creates a version of an AWS RoboMaker simulation application.","properties":{"Application":"The application information for the simulation application.","CurrentRevisionId":"The current revision id for the simulation application. If you provide a value and it matches the latest revision ID, a new version will be created."}},"AWS::RolesAnywhere::CRL":{"attributes":{"CrlId":"The unique primary identifier of the Crl","Ref":"`Ref` returns `CrlId` ."},"description":"Imports the certificate revocation list (CRL). A CRL is a list of certificates that have been revoked by the issuing certificate Authority (CA). IAM Roles Anywhere validates against the CRL before issuing credentials.\\n\\n*Required permissions:* `rolesanywhere:ImportCrl` .","properties":{"CrlData":"The x509 v3 specified certificate revocation list (CRL).","Enabled":"Specifies whether the certificate revocation list (CRL) is enabled.","Name":"The name of the certificate revocation list (CRL).","Tags":"A list of tags to attach to the certificate revocation list (CRL).","TrustAnchorArn":"The ARN of the TrustAnchor the certificate revocation list (CRL) will provide revocation for."}},"AWS::RolesAnywhere::Profile":{"attributes":{"ProfileArn":"The ARN of the profile.","ProfileId":"The unique primary identifier of the Profile","Ref":"`Ref` returns `ProfileId` ."},"description":"Creates a *profile* , a list of the roles that Roles Anywhere service is trusted to assume. You use profiles to intersect permissions with IAM managed policies.\\n\\n*Required permissions:* `rolesanywhere:CreateProfile` .","properties":{"DurationSeconds":"Sets the maximum number of seconds that vended temporary credentials through [CreateSession](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/authentication-create-session.html) will be valid for, between 900 and 3600.","Enabled":"Indicates whether the profile is enabled.","ManagedPolicyArns":"A list of managed policy ARNs that apply to the vended session credentials.","Name":"The name of the profile.","RequireInstanceProperties":"Specifies whether instance properties are required in temporary credential requests with this profile.","RoleArns":"A list of IAM role ARNs. During `CreateSession` , if a matching role ARN is provided, the properties in this profile will be applied to the intersection session policy.","SessionPolicy":"A session policy that applies to the trust boundary of the vended session credentials.","Tags":"The tags to attach to the profile."}},"AWS::RolesAnywhere::TrustAnchor":{"attributes":{"Ref":"`Ref` returns `TrustAnchorId` .","TrustAnchorArn":"The ARN of the trust anchor.","TrustAnchorId":"The unique identifier of the trust anchor."},"description":"Creates a trust anchor to establish trust between IAM Roles Anywhere and your certificate authority (CA). You can define a trust anchor as a reference to an AWS Private Certificate Authority ( AWS Private CA ) or by uploading a CA certificate. Your AWS workloads can authenticate with the trust anchor using certificates issued by the CA in exchange for temporary AWS credentials.\\n\\n*Required permissions:* `rolesanywhere:CreateTrustAnchor` .","properties":{"Enabled":"Indicates whether the trust anchor is enabled.","Name":"The name of the trust anchor.","Source":"The trust anchor type and its related certificate data.","Tags":"The tags to attach to the trust anchor."}},"AWS::RolesAnywhere::TrustAnchor.Source":{"attributes":{},"description":"The trust anchor type and its related certificate data.","properties":{"SourceData":"The data field of the trust anchor depending on its type.","SourceType":"The type of the TrustAnchor.\\n\\n> `AWS_ACM_PCA` is not an allowed value in your region."}},"AWS::RolesAnywhere::TrustAnchor.SourceData":{"attributes":{},"description":"The data field of the trust anchor depending on its type.","properties":{"AcmPcaArn":"The root certificate of the AWS Private Certificate Authority specified by this ARN is used in trust validation for temporary credential requests. Included for trust anchors of type `AWS_ACM_PCA` .\\n\\n> This field is not supported in your region.","X509CertificateData":"The PEM-encoded data for the certificate anchor. Included for trust anchors of type `CERTIFICATE_BUNDLE` ."}},"AWS::Route53::CidrCollection":{"attributes":{"Arn":"\\"The Amazon resource name (ARN) to uniquely identify the AWS resource.","Id":"The UUID of the CIDR collection.","Ref":"`Ref` returns the `CidrCollection` ID."},"description":"Creates a CIDR collection in the current AWS account.","properties":{"Locations":"A complex type that contains information about the list of CIDR locations.","Name":"The name of a CIDR collection."}},"AWS::Route53::CidrCollection.Location":{"attributes":{},"description":"Specifies the list of CIDR blocks for a CIDR location.","properties":{"CidrList":"List of CIDR blocks.","LocationName":"The CIDR collection location name."}},"AWS::Route53::DNSSEC":{"attributes":{"Ref":"`Ref` returns the hosted zone ID. For example:\\n\\n`{ \\"Ref\\": \\"Z00001111A1ABCaaABC11\\" }`"},"description":"The `AWS::Route53::DNSSEC` resource is used to enable DNSSEC signing in a hosted zone.","properties":{"HostedZoneId":"A unique string (ID) that is used to identify a hosted zone. For example: `Z00001111A1ABCaaABC11` ."}},"AWS::Route53::HealthCheck":{"attributes":{"HealthCheckId":"The identifier that Amazon Route 53 assigned to the health check when you created it. When you add or update a resource record set, you use this value to specify which health check to use. The value can be up to 64 characters long.","Ref":"`Ref` returns the health check ID, such as `e0a123b4-4dba-4650-935e-example` ."},"description":"The `AWS::Route53::HealthCheck` resource is a Route 53 resource type that contains settings for a Route 53 health check.\\n\\nFor information about associating health checks with records, see [HealthCheckId](https://docs.aws.amazon.com/Route53/latest/APIReference/API_ResourceRecordSet.html#Route53-Type-ResourceRecordSet-HealthCheckId) in [ChangeResourceRecordSets](https://docs.aws.amazon.com/Route53/latest/APIReference/API_ChangeResourceRecordSets.html) .\\n\\n> You can\'t create a health check with simple routing. \\n\\n*ELB Load Balancers*\\n\\nIf you\'re registering EC2 instances with an Elastic Load Balancing (ELB) load balancer, do not create Amazon Route 53 health checks for the EC2 instances. When you register an EC2 instance with a load balancer, you configure settings for an ELB health check, which performs a similar function to a Route 53 health check.\\n\\n*Private Hosted Zones*\\n\\nYou can associate health checks with failover records in a private hosted zone. Note the following:\\n\\n- Route 53 health checkers are outside the VPC. To check the health of an endpoint within a VPC by IP address, you must assign a public IP address to the instance in the VPC.\\n- You can configure a health checker to check the health of an external resource that the instance relies on, such as a database server.\\n- You can create a CloudWatch metric, associate an alarm with the metric, and then create a health check that is based on the state of the alarm. For example, you might create a CloudWatch metric that checks the status of the Amazon EC2 `StatusCheckFailed` metric, add an alarm to the metric, and then create a health check that is based on the state of the alarm. For information about creating CloudWatch metrics and alarms by using the CloudWatch console, see the [Amazon CloudWatch User Guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatch.html) .","properties":{"HealthCheckConfig":"A complex type that contains detailed information about one health check.\\n\\nFor the values to enter for `HealthCheckConfig` , see [HealthCheckConfig](https://docs.aws.amazon.com/Route53/latest/APIReference/API_HealthCheckConfig.html)","HealthCheckTags":"The `HealthCheckTags` property describes key-value pairs that are associated with an `AWS::Route53::HealthCheck` resource."}},"AWS::Route53::HealthCheck.AlarmIdentifier":{"attributes":{},"description":"A complex type that identifies the CloudWatch alarm that you want Amazon Route 53 health checkers to use to determine whether the specified health check is healthy.","properties":{"Name":"The name of the CloudWatch alarm that you want Amazon Route 53 health checkers to use to determine whether this health check is healthy.\\n\\n> Route 53 supports CloudWatch alarms with the following features:\\n> \\n> - Standard-resolution metrics. High-resolution metrics aren\'t supported. For more information, see [High-Resolution Metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/publishingMetrics.html#high-resolution-metrics) in the *Amazon CloudWatch User Guide* .\\n> - Statistics: Average, Minimum, Maximum, Sum, and SampleCount. Extended statistics aren\'t supported.","Region":"For the CloudWatch alarm that you want Route 53 health checkers to use to determine whether this health check is healthy, the region that the alarm was created in.\\n\\nFor the current list of CloudWatch regions, see [Amazon CloudWatch endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/cw_region.html) in the *Amazon Web Services General Reference* ."}},"AWS::Route53::HealthCheck.HealthCheckConfig":{"attributes":{},"description":"A complex type that contains information about the health check.","properties":{"AlarmIdentifier":"A complex type that identifies the CloudWatch alarm that you want Amazon Route 53 health checkers to use to determine whether the specified health check is healthy.","ChildHealthChecks":"(CALCULATED Health Checks Only) A complex type that contains one `ChildHealthCheck` element for each health check that you want to associate with a `CALCULATED` health check.","EnableSNI":"Specify whether you want Amazon Route 53 to send the value of `FullyQualifiedDomainName` to the endpoint in the `client_hello` message during TLS negotiation. This allows the endpoint to respond to `HTTPS` health check requests with the applicable SSL/TLS certificate.\\n\\nSome endpoints require that `HTTPS` requests include the host name in the `client_hello` message. If you don\'t enable SNI, the status of the health check will be `SSL alert handshake_failure` . A health check can also have that status for other reasons. If SNI is enabled and you\'re still getting the error, check the SSL/TLS configuration on your endpoint and confirm that your certificate is valid.\\n\\nThe SSL/TLS certificate on your endpoint includes a domain name in the `Common Name` field and possibly several more in the `Subject Alternative Names` field. One of the domain names in the certificate should match the value that you specify for `FullyQualifiedDomainName` . If the endpoint responds to the `client_hello` message with a certificate that does not include the domain name that you specified in `FullyQualifiedDomainName` , a health checker will retry the handshake. In the second attempt, the health checker will omit `FullyQualifiedDomainName` from the `client_hello` message.","FailureThreshold":"The number of consecutive health checks that an endpoint must pass or fail for Amazon Route 53 to change the current status of the endpoint from unhealthy to healthy or vice versa. For more information, see [How Amazon Route 53 Determines Whether an Endpoint Is Healthy](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html) in the *Amazon Route 53 Developer Guide* .\\n\\nIf you don\'t specify a value for `FailureThreshold` , the default value is three health checks.","FullyQualifiedDomainName":"Amazon Route 53 behavior depends on whether you specify a value for `IPAddress` .\\n\\n*If you specify a value for* `IPAddress` :\\n\\nAmazon Route 53 sends health check requests to the specified IPv4 or IPv6 address and passes the value of `FullyQualifiedDomainName` in the `Host` header for all health checks except TCP health checks. This is typically the fully qualified DNS name of the endpoint on which you want Route 53 to perform health checks.\\n\\nWhen Route 53 checks the health of an endpoint, here is how it constructs the `Host` header:\\n\\n- If you specify a value of `80` for `Port` and `HTTP` or `HTTP_STR_MATCH` for `Type` , Route 53 passes the value of `FullyQualifiedDomainName` to the endpoint in the Host header.\\n- If you specify a value of `443` for `Port` and `HTTPS` or `HTTPS_STR_MATCH` for `Type` , Route 53 passes the value of `FullyQualifiedDomainName` to the endpoint in the `Host` header.\\n- If you specify another value for `Port` and any value except `TCP` for `Type` , Route 53 passes `FullyQualifiedDomainName:Port` to the endpoint in the `Host` header.\\n\\nIf you don\'t specify a value for `FullyQualifiedDomainName` , Route 53 substitutes the value of `IPAddress` in the `Host` header in each of the preceding cases.\\n\\n*If you don\'t specify a value for `IPAddress`* :\\n\\nRoute 53 sends a DNS request to the domain that you specify for `FullyQualifiedDomainName` at the interval that you specify for `RequestInterval` . Using an IPv4 address that DNS returns, Route 53 then checks the health of the endpoint.\\n\\n> If you don\'t specify a value for `IPAddress` , Route 53 uses only IPv4 to send health checks to the endpoint. If there\'s no record with a type of A for the name that you specify for `FullyQualifiedDomainName` , the health check fails with a \\"DNS resolution failed\\" error. \\n\\nIf you want to check the health of multiple records that have the same name and type, such as multiple weighted records, and if you choose to specify the endpoint only by `FullyQualifiedDomainName` , we recommend that you create a separate health check for each endpoint. For example, create a health check for each HTTP server that is serving content for www.example.com. For the value of `FullyQualifiedDomainName` , specify the domain name of the server (such as us-east-2-www.example.com), not the name of the records (www.example.com).\\n\\n> In this configuration, if you create a health check for which the value of `FullyQualifiedDomainName` matches the name of the records and you then associate the health check with those records, health check results will be unpredictable. \\n\\nIn addition, if the value that you specify for `Type` is `HTTP` , `HTTPS` , `HTTP_STR_MATCH` , or `HTTPS_STR_MATCH` , Route 53 passes the value of `FullyQualifiedDomainName` in the `Host` header, as it does when you specify a value for `IPAddress` . If the value of `Type` is `TCP` , Route 53 doesn\'t pass a `Host` header.","HealthThreshold":"The number of child health checks that are associated with a `CALCULATED` health check that Amazon Route 53 must consider healthy for the `CALCULATED` health check to be considered healthy. To specify the child health checks that you want to associate with a `CALCULATED` health check, use the [ChildHealthChecks](https://docs.aws.amazon.com/Route53/latest/APIReference/API_UpdateHealthCheck.html#Route53-UpdateHealthCheck-request-ChildHealthChecks) element.\\n\\nNote the following:\\n\\n- If you specify a number greater than the number of child health checks, Route 53 always considers this health check to be unhealthy.\\n- If you specify `0` , Route 53 always considers this health check to be healthy.","IPAddress":"The IPv4 or IPv6 IP address of the endpoint that you want Amazon Route 53 to perform health checks on. If you don\'t specify a value for `IPAddress` , Route 53 sends a DNS request to resolve the domain name that you specify in `FullyQualifiedDomainName` at the interval that you specify in `RequestInterval` . Using an IP address returned by DNS, Route 53 then checks the health of the endpoint.\\n\\nUse one of the following formats for the value of `IPAddress` :\\n\\n- *IPv4 address* : four values between 0 and 255, separated by periods (.), for example, `192.0.2.44` .\\n- *IPv6 address* : eight groups of four hexadecimal values, separated by colons (:), for example, `2001:0db8:85a3:0000:0000:abcd:0001:2345` . You can also shorten IPv6 addresses as described in RFC 5952, for example, `2001:db8:85a3::abcd:1:2345` .\\n\\nIf the endpoint is an EC2 instance, we recommend that you create an Elastic IP address, associate it with your EC2 instance, and specify the Elastic IP address for `IPAddress` . This ensures that the IP address of your instance will never change.\\n\\nFor more information, see [FullyQualifiedDomainName](https://docs.aws.amazon.com/Route53/latest/APIReference/API_UpdateHealthCheck.html#Route53-UpdateHealthCheck-request-FullyQualifiedDomainName) .\\n\\nConstraints: Route 53 can\'t check the health of endpoints for which the IP address is in local, private, non-routable, or multicast ranges. For more information about IP addresses for which you can\'t create health checks, see the following documents:\\n\\n- [RFC 5735, Special Use IPv4 Addresses](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc5735)\\n- [RFC 6598, IANA-Reserved IPv4 Prefix for Shared Address Space](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc6598)\\n- [RFC 5156, Special-Use IPv6 Addresses](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc5156)\\n\\nWhen the value of `Type` is `CALCULATED` or `CLOUDWATCH_METRIC` , omit `IPAddress` .","InsufficientDataHealthStatus":"When CloudWatch has insufficient data about the metric to determine the alarm state, the status that you want Amazon Route 53 to assign to the health check:\\n\\n- `Healthy` : Route 53 considers the health check to be healthy.\\n- `Unhealthy` : Route 53 considers the health check to be unhealthy.\\n- `LastKnownStatus` : Route 53 uses the status of the health check from the last time that CloudWatch had sufficient data to determine the alarm state. For new health checks that have no last known status, the default status for the health check is healthy.","Inverted":"Specify whether you want Amazon Route 53 to invert the status of a health check, for example, to consider a health check unhealthy when it otherwise would be considered healthy.","MeasureLatency":"Specify whether you want Amazon Route 53 to measure the latency between health checkers in multiple AWS regions and your endpoint, and to display CloudWatch latency graphs on the *Health Checks* page in the Route 53 console.\\n\\n> You can\'t change the value of `MeasureLatency` after you create a health check.","Port":"The port on the endpoint that you want Amazon Route 53 to perform health checks on.\\n\\n> Don\'t specify a value for `Port` when you specify a value for [Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-type) of `CLOUDWATCH_METRIC` or `CALCULATED` .","Regions":"A complex type that contains one `Region` element for each region from which you want Amazon Route 53 health checkers to check the specified endpoint.\\n\\nIf you don\'t specify any regions, Route 53 health checkers automatically performs checks from all of the regions that are listed under *Valid Values* .\\n\\nIf you update a health check to remove a region that has been performing health checks, Route 53 will briefly continue to perform checks from that region to ensure that some health checkers are always checking the endpoint (for example, if you replace three regions with four different regions).","RequestInterval":"The number of seconds between the time that Amazon Route 53 gets a response from your endpoint and the time that it sends the next health check request. Each Route 53 health checker makes requests at this interval.\\n\\n> You can\'t change the value of `RequestInterval` after you create a health check. \\n\\nIf you don\'t specify a value for `RequestInterval` , the default value is `30` seconds.","ResourcePath":"The path, if any, that you want Amazon Route 53 to request when performing health checks. The path can be any value for which your endpoint will return an HTTP status code of 2xx or 3xx when the endpoint is healthy, for example, the file /docs/route53-health-check.html. You can also include query string parameters, for example, `/welcome.html?language=jp&login=y` .","RoutingControlArn":"","SearchString":"If the value of Type is `HTTP_STR_MATCH` or `HTTPS_STR_MATCH` , the string that you want Amazon Route 53 to search for in the response body from the specified resource. If the string appears in the response body, Route 53 considers the resource healthy.\\n\\nRoute 53 considers case when searching for `SearchString` in the response body.","Type":"The type of health check that you want to create, which indicates how Amazon Route 53 determines whether an endpoint is healthy.\\n\\n> You can\'t change the value of `Type` after you create a health check. \\n\\nYou can create the following types of health checks:\\n\\n- *HTTP* : Route 53 tries to establish a TCP connection. If successful, Route 53 submits an HTTP request and waits for an HTTP status code of 200 or greater and less than 400.\\n- *HTTPS* : Route 53 tries to establish a TCP connection. If successful, Route 53 submits an HTTPS request and waits for an HTTP status code of 200 or greater and less than 400.\\n\\n> If you specify `HTTPS` for the value of `Type` , the endpoint must support TLS v1.0 or later.\\n- *HTTP_STR_MATCH* : Route 53 tries to establish a TCP connection. If successful, Route 53 submits an HTTP request and searches the first 5,120 bytes of the response body for the string that you specify in `SearchString` .\\n- *HTTPS_STR_MATCH* : Route 53 tries to establish a TCP connection. If successful, Route 53 submits an `HTTPS` request and searches the first 5,120 bytes of the response body for the string that you specify in `SearchString` .\\n- *TCP* : Route 53 tries to establish a TCP connection.\\n- *CLOUDWATCH_METRIC* : The health check is associated with a CloudWatch alarm. If the state of the alarm is `OK` , the health check is considered healthy. If the state is `ALARM` , the health check is considered unhealthy. If CloudWatch doesn\'t have sufficient data to determine whether the state is `OK` or `ALARM` , the health check status depends on the setting for `InsufficientDataHealthStatus` : `Healthy` , `Unhealthy` , or `LastKnownStatus` .\\n\\n> Route 53 supports CloudWatch alarms with the following features:\\n> \\n> - Standard-resolution metrics. High-resolution metrics aren\'t supported. For more information, see [High-Resolution Metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/publishingMetrics.html#high-resolution-metrics) in the *Amazon CloudWatch User Guide* .\\n> - Statistics: Average, Minimum, Maximum, Sum, and SampleCount. Extended statistics aren\'t supported.\\n- *CALCULATED* : For health checks that monitor the status of other health checks, Route 53 adds up the number of health checks that Route 53 health checkers consider to be healthy and compares that number with the value of `HealthThreshold` .\\n- *RECOVERY_CONTROL* : The health check is assocated with a Route53 Application Recovery Controller routing control. If the routing control state is `ON` , the health check is considered healthy. If the state is `OFF` , the health check is considered unhealthy.\\n\\nFor more information, see [How Route 53 Determines Whether an Endpoint Is Healthy](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html) in the *Amazon Route 53 Developer Guide* ."}},"AWS::Route53::HealthCheck.HealthCheckTag":{"attributes":{},"description":"The `HealthCheckTag` property describes one key-value pair that is associated with an `AWS::Route53::HealthCheck` resource.","properties":{"Key":"The value of `Key` depends on the operation that you want to perform:\\n\\n- *Add a tag to a health check or hosted zone* : `Key` is the name that you want to give the new tag.\\n- *Edit a tag* : `Key` is the name of the tag that you want to change the `Value` for.\\n- *Delete a key* : `Key` is the name of the tag you want to remove.\\n- *Give a name to a health check* : Edit the default `Name` tag. In the Amazon Route 53 console, the list of your health checks includes a *Name* column that lets you see the name that you\'ve given to each health check.","Value":"The value of `Value` depends on the operation that you want to perform:\\n\\n- *Add a tag to a health check or hosted zone* : `Value` is the value that you want to give the new tag.\\n- *Edit a tag* : `Value` is the new value that you want to assign the tag."}},"AWS::Route53::HostedZone":{"attributes":{"Id":"The ID that Amazon Route 53 assigned to the hosted zone when you created it.","NameServers":"Returns the set of name servers for the specific hosted zone. For example: `ns1.example.com` .\\n\\nThis attribute is not supported for private hosted zones.","Ref":"`Ref` returns the hosted zone ID, such as `Z23ABC4XYZL05B` ."},"description":"Creates a new public or private hosted zone. You create records in a public hosted zone to define how you want to route traffic on the internet for a domain, such as example.com, and its subdomains (apex.example.com, acme.example.com). You create records in a private hosted zone to define how you want to route traffic for a domain and its subdomains within one or more Amazon Virtual Private Clouds (Amazon VPCs).\\n\\n> You can\'t convert a public hosted zone to a private hosted zone or vice versa. Instead, you must create a new hosted zone with the same name and create new resource record sets. \\n\\nFor more information about charges for hosted zones, see [Amazon Route 53 Pricing](https://docs.aws.amazon.com/route53/pricing/) .\\n\\nNote the following:\\n\\n- You can\'t create a hosted zone for a top-level domain (TLD) such as .com.\\n- If your domain is registered with a registrar other than Route 53, you must update the name servers with your registrar to make Route 53 the DNS service for the domain. For more information, see [Migrating DNS Service for an Existing Domain to Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/MigratingDNS.html) in the *Amazon Route 53 Developer Guide* .\\n\\nWhen you submit a `CreateHostedZone` request, the initial status of the hosted zone is `PENDING` . For public hosted zones, this means that the NS and SOA records are not yet available on all Route 53 DNS servers. When the NS and SOA records are available, the status of the zone changes to `INSYNC` .\\n\\nThe `CreateHostedZone` request requires the caller to have an `ec2:DescribeVpcs` permission.\\n\\n> When creating private hosted zones, the Amazon VPC must belong to the same partition where the hosted zone is created. A partition is a group of AWS Regions . Each AWS account is scoped to one partition.\\n> \\n> The following are the supported partitions:\\n> \\n> - `aws` - AWS Regions\\n> - `aws-cn` - China Regions\\n> - `aws-us-gov` - AWS GovCloud (US) Region\\n> \\n> For more information, see [Access Management](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *AWS General Reference* .","properties":{"HostedZoneConfig":"A complex type that contains an optional comment.\\n\\nIf you don\'t want to specify a comment, omit the `HostedZoneConfig` and `Comment` elements.","HostedZoneTags":"Adds, edits, or deletes tags for a health check or a hosted zone.\\n\\nFor information about using tags for cost allocation, see [Using Cost Allocation Tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html) in the *AWS Billing and Cost Management User Guide* .","Name":"The name of the domain. Specify a fully qualified domain name, for example, *www.example.com* . The trailing dot is optional; Amazon Route 53 assumes that the domain name is fully qualified. This means that Route 53 treats *www.example.com* (without a trailing dot) and *www.example.com.* (with a trailing dot) as identical.\\n\\nIf you\'re creating a public hosted zone, this is the name you have registered with your DNS registrar. If your domain name is registered with a registrar other than Route 53, change the name servers for your domain to the set of `NameServers` that are returned by the `Fn::GetAtt` intrinsic function.","QueryLoggingConfig":"Creates a configuration for DNS query logging. After you create a query logging configuration, Amazon Route 53 begins to publish log data to an Amazon CloudWatch Logs log group.\\n\\nDNS query logs contain information about the queries that Route 53 receives for a specified public hosted zone, such as the following:\\n\\n- Route 53 edge location that responded to the DNS query\\n- Domain or subdomain that was requested\\n- DNS record type, such as A or AAAA\\n- DNS response code, such as `NoError` or `ServFail`\\n\\n- **Log Group and Resource Policy** - Before you create a query logging configuration, perform the following operations.\\n\\n> If you create a query logging configuration using the Route 53 console, Route 53 performs these operations automatically. \\n\\n- Create a CloudWatch Logs log group, and make note of the ARN, which you specify when you create a query logging configuration. Note the following:\\n\\n- You must create the log group in the us-east-1 region.\\n- You must use the same AWS account to create the log group and the hosted zone that you want to configure query logging for.\\n- When you create log groups for query logging, we recommend that you use a consistent prefix, for example:\\n\\n`/aws/route53/ *hosted zone name*`\\n\\nIn the next step, you\'ll create a resource policy, which controls access to one or more log groups and the associated AWS resources, such as Route 53 hosted zones. There\'s a limit on the number of resource policies that you can create, so we recommend that you use a consistent prefix so you can use the same resource policy for all the log groups that you create for query logging.\\n- Create a CloudWatch Logs resource policy, and give it the permissions that Route 53 needs to create log streams and to send query logs to log streams. For the value of `Resource` , specify the ARN for the log group that you created in the previous step. To use the same resource policy for all the CloudWatch Logs log groups that you created for query logging configurations, replace the hosted zone name with `*` , for example:\\n\\n`arn:aws:logs:us-east-1:123412341234:log-group:/aws/route53/*`\\n\\nTo avoid the confused deputy problem, a security issue where an entity without a permission for an action can coerce a more-privileged entity to perform it, you can optionally limit the permissions that a service has to a resource in a resource-based policy by supplying the following values:\\n\\n- For `aws:SourceArn` , supply the hosted zone ARN used in creating the query logging configuration. For example, `aws:SourceArn: arn:aws:route53:::hostedzone/hosted zone ID` .\\n- For `aws:SourceAccount` , supply the account ID for the account that creates the query logging configuration. For example, `aws:SourceAccount:111111111111` .\\n\\nFor more information, see [The confused deputy problem](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) in the *AWS IAM User Guide* .\\n\\n> You can\'t use the CloudWatch console to create or edit a resource policy. You must use the CloudWatch API, one of the AWS SDKs, or the AWS CLI .\\n- **Log Streams and Edge Locations** - When Route 53 finishes creating the configuration for DNS query logging, it does the following:\\n\\n- Creates a log stream for an edge location the first time that the edge location responds to DNS queries for the specified hosted zone. That log stream is used to log all queries that Route 53 responds to for that edge location.\\n- Begins to send query logs to the applicable log stream.\\n\\nThe name of each log stream is in the following format:\\n\\n`*hosted zone ID* / *edge location code*`\\n\\nThe edge location code is a three-letter code and an arbitrarily assigned number, for example, DFW3. The three-letter code typically corresponds with the International Air Transport Association airport code for an airport near the edge location. (These abbreviations might change in the future.) For a list of edge locations, see \\"The Route 53 Global Network\\" on the [Route 53 Product Details](https://docs.aws.amazon.com/route53/details/) page.\\n- **Queries That Are Logged** - Query logs contain only the queries that DNS resolvers forward to Route 53. If a DNS resolver has already cached the response to a query (such as the IP address for a load balancer for example.com), the resolver will continue to return the cached response. It doesn\'t forward another query to Route 53 until the TTL for the corresponding resource record set expires. Depending on how many DNS queries are submitted for a resource record set, and depending on the TTL for that resource record set, query logs might contain information about only one query out of every several thousand queries that are submitted to DNS. For more information about how DNS works, see [Routing Internet Traffic to Your Website or Web Application](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/welcome-dns-service.html) in the *Amazon Route 53 Developer Guide* .\\n- **Log File Format** - For a list of the values in each query log and the format of each value, see [Logging DNS Queries](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/query-logs.html) in the *Amazon Route 53 Developer Guide* .\\n- **Pricing** - For information about charges for query logs, see [Amazon CloudWatch Pricing](https://docs.aws.amazon.com/cloudwatch/pricing/) .\\n- **How to Stop Logging** - If you want Route 53 to stop sending query logs to CloudWatch Logs, delete the query logging configuration. For more information, see [DeleteQueryLoggingConfig](https://docs.aws.amazon.com/Route53/latest/APIReference/API_DeleteQueryLoggingConfig.html) .","VPCs":"*Private hosted zones:* A complex type that contains information about the VPCs that are associated with the specified hosted zone.\\n\\n> For public hosted zones, omit `VPCs` , `VPCId` , and `VPCRegion` ."}},"AWS::Route53::HostedZone.HostedZoneConfig":{"attributes":{},"description":"A complex type that contains an optional comment about your hosted zone. If you don\'t want to specify a comment, omit both the `HostedZoneConfig` and `Comment` elements.","properties":{"Comment":"Any comments that you want to include about the hosted zone."}},"AWS::Route53::HostedZone.HostedZoneTag":{"attributes":{},"description":"A complex type that contains information about a tag that you want to add or edit for the specified health check or hosted zone.","properties":{"Key":"The value of `Key` depends on the operation that you want to perform:\\n\\n- *Add a tag to a health check or hosted zone* : `Key` is the name that you want to give the new tag.\\n- *Edit a tag* : `Key` is the name of the tag that you want to change the `Value` for.\\n- *Delete a key* : `Key` is the name of the tag you want to remove.\\n- *Give a name to a health check* : Edit the default `Name` tag. In the Amazon Route 53 console, the list of your health checks includes a *Name* column that lets you see the name that you\'ve given to each health check.","Value":"The value of `Value` depends on the operation that you want to perform:\\n\\n- *Add a tag to a health check or hosted zone* : `Value` is the value that you want to give the new tag.\\n- *Edit a tag* : `Value` is the new value that you want to assign the tag."}},"AWS::Route53::HostedZone.QueryLoggingConfig":{"attributes":{},"description":"A complex type that contains information about a configuration for DNS query logging.","properties":{"CloudWatchLogsLogGroupArn":"The Amazon Resource Name (ARN) of the CloudWatch Logs log group that Amazon Route 53 is publishing logs to."}},"AWS::Route53::HostedZone.VPC":{"attributes":{},"description":"*Private hosted zones only:* A complex type that contains information about an Amazon VPC. Route 53 Resolver uses the records in the private hosted zone to route traffic in that VPC.\\n\\n> For public hosted zones, omit `VPCs` , `VPCId` , and `VPCRegion` .","properties":{"VPCId":"*Private hosted zones only:* The ID of an Amazon VPC.\\n\\n> For public hosted zones, omit `VPCs` , `VPCId` , and `VPCRegion` .","VPCRegion":"*Private hosted zones only:* The region that an Amazon VPC was created in.\\n\\n> For public hosted zones, omit `VPCs` , `VPCId` , and `VPCRegion` ."}},"AWS::Route53::KeySigningKey":{"attributes":{"Ref":"`Ref` returns a identifier that is based on both the hosted zone ID and the KSK name properties. For example:\\n\\n`{ \\"Ref\\": \\"Z00001111A1ABCaaABC11|KSK1\\" }`"},"description":"The `AWS::Route53::KeySigningKey` resource creates a new key-signing key (KSK) in a hosted zone. The hosted zone ID is passed as a parameter in the KSK properties. You can specify the properties of this KSK using the `Name` , `Status` , and `KeyManagementServiceArn` properties of the resource.","properties":{"HostedZoneId":"The unique string (ID) that is used to identify a hosted zone. For example: `Z00001111A1ABCaaABC11` .","KeyManagementServiceArn":"The Amazon resource name (ARN) for a customer managed customer master key (CMK) in AWS Key Management Service ( AWS KMS ). The `KeyManagementServiceArn` must be unique for each key-signing key (KSK) in a single hosted zone. For example: `arn:aws:kms:us-east-1:111122223333:key/111a2222-a11b-1ab1-2ab2-1ab21a2b3a111` .","Name":"A string used to identify a key-signing key (KSK). `Name` can include numbers, letters, and underscores (_). `Name` must be unique for each key-signing key in the same hosted zone.","Status":"A string that represents the current key-signing key (KSK) status.\\n\\nStatus can have one of the following values:\\n\\n- **ACTIVE** - The KSK is being used for signing.\\n- **INACTIVE** - The KSK is not being used for signing.\\n- **DELETING** - The KSK is in the process of being deleted.\\n- **ACTION_NEEDED** - There is a problem with the KSK that requires you to take action to resolve. For example, the customer managed key might have been deleted, or the permissions for the customer managed key might have been changed.\\n- **INTERNAL_FAILURE** - There was an error during a request. Before you can continue to work with DNSSEC signing, including actions that involve this KSK, you must correct the problem. For example, you may need to activate or deactivate the KSK."}},"AWS::Route53::RecordSet":{"attributes":{"Ref":"`Ref` returns the value of the domain name of the record set, such as `acme.example.com` ."},"description":"Information about the record that you want to create.\\n\\nThe `AWS::Route53::RecordSet` type can be used as a standalone resource or as an embedded property in the `AWS::Route53::RecordSetGroup` type. Note that some `AWS::Route53::RecordSet` properties are valid only when used within `AWS::Route53::RecordSetGroup` .\\n\\nFor more information, see [ChangeResourceRecordSets](https://docs.aws.amazon.com/Route53/latest/APIReference/API_ChangeResourceRecordSets.html) in the *Amazon Route 53 API Reference* .","properties":{"AliasTarget":"*Alias resource record sets only:* Information about the AWS resource, such as a CloudFront distribution or an Amazon S3 bucket, that you want to route traffic to.\\n\\nIf you\'re creating resource records sets for a private hosted zone, note the following:\\n\\n- You can\'t create an alias resource record set in a private hosted zone to route traffic to a CloudFront distribution.\\n- For information about creating failover resource record sets in a private hosted zone, see [Configuring Failover in a Private Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html) in the *Amazon Route 53 Developer Guide* .","CidrRoutingConfig":"The object that is specified in resource record set object when you are linking a resource record set to a CIDR location.\\n\\nA `LocationName` with an asterisk “*” can be used to create a default CIDR record. `CollectionId` is still required for default record.","Comment":"*Optional:* Any comments you want to include about a change batch request.","Failover":"*Failover resource record sets only:* To configure failover, you add the `Failover` element to two resource record sets. For one resource record set, you specify `PRIMARY` as the value for `Failover` ; for the other resource record set, you specify `SECONDARY` . In addition, you include the `HealthCheckId` element and specify the health check that you want Amazon Route 53 to perform for each resource record set.\\n\\nExcept where noted, the following failover behaviors assume that you have included the `HealthCheckId` element in both resource record sets:\\n\\n- When the primary resource record set is healthy, Route 53 responds to DNS queries with the applicable value from the primary resource record set regardless of the health of the secondary resource record set.\\n- When the primary resource record set is unhealthy and the secondary resource record set is healthy, Route 53 responds to DNS queries with the applicable value from the secondary resource record set.\\n- When the secondary resource record set is unhealthy, Route 53 responds to DNS queries with the applicable value from the primary resource record set regardless of the health of the primary resource record set.\\n- If you omit the `HealthCheckId` element for the secondary resource record set, and if the primary resource record set is unhealthy, Route 53 always responds to DNS queries with the applicable value from the secondary resource record set. This is true regardless of the health of the associated endpoint.\\n\\nYou can\'t create non-failover resource record sets that have the same values for the `Name` and `Type` elements as failover resource record sets.\\n\\nFor failover alias resource record sets, you must also include the `EvaluateTargetHealth` element and set the value to true.\\n\\nFor more information about configuring failover for Route 53, see the following topics in the *Amazon Route 53 Developer Guide* :\\n\\n- [Route 53 Health Checks and DNS Failover](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html)\\n- [Configuring Failover in a Private Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html)","GeoLocation":"*Geolocation resource record sets only:* A complex type that lets you control how Amazon Route 53 responds to DNS queries based on the geographic origin of the query. For example, if you want all queries from Africa to be routed to a web server with an IP address of `192.0.2.111` , create a resource record set with a `Type` of `A` and a `ContinentCode` of `AF` .\\n\\n> Although creating geolocation and geolocation alias resource record sets in a private hosted zone is allowed, it\'s not supported. \\n\\nIf you create separate resource record sets for overlapping geographic regions (for example, one resource record set for a continent and one for a country on the same continent), priority goes to the smallest geographic region. This allows you to route most queries for a continent to one resource and to route queries for a country on that continent to a different resource.\\n\\nYou can\'t create two geolocation resource record sets that specify the same geographic location.\\n\\nThe value `*` in the `CountryCode` element matches all geographic locations that aren\'t specified in other geolocation resource record sets that have the same values for the `Name` and `Type` elements.\\n\\n> Geolocation works by mapping IP addresses to locations. However, some IP addresses aren\'t mapped to geographic locations, so even if you create geolocation resource record sets that cover all seven continents, Route 53 will receive some DNS queries from locations that it can\'t identify. We recommend that you create a resource record set for which the value of `CountryCode` is `*` . Two groups of queries are routed to the resource that you specify in this record: queries that come from locations for which you haven\'t created geolocation resource record sets and queries from IP addresses that aren\'t mapped to a location. If you don\'t create a `*` resource record set, Route 53 returns a \\"no answer\\" response for queries from those locations. \\n\\nYou can\'t create non-geolocation resource record sets that have the same values for the `Name` and `Type` elements as geolocation resource record sets.","HealthCheckId":"If you want Amazon Route 53 to return this resource record set in response to a DNS query only when the status of a health check is healthy, include the `HealthCheckId` element and specify the ID of the applicable health check.\\n\\nRoute 53 determines whether a resource record set is healthy based on one of the following:\\n\\n- By periodically sending a request to the endpoint that is specified in the health check\\n- By aggregating the status of a specified group of health checks (calculated health checks)\\n- By determining the current state of a CloudWatch alarm (CloudWatch metric health checks)\\n\\n> Route 53 doesn\'t check the health of the endpoint that is specified in the resource record set, for example, the endpoint specified by the IP address in the `Value` element. When you add a `HealthCheckId` element to a resource record set, Route 53 checks the health of the endpoint that you specified in the health check. \\n\\nFor more information, see the following topics in the *Amazon Route 53 Developer Guide* :\\n\\n- [How Amazon Route 53 Determines Whether an Endpoint Is Healthy](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html)\\n- [Route 53 Health Checks and DNS Failover](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html)\\n- [Configuring Failover in a Private Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html)\\n\\n*When to Specify HealthCheckId*\\n\\nSpecifying a value for `HealthCheckId` is useful only when Route 53 is choosing between two or more resource record sets to respond to a DNS query, and you want Route 53 to base the choice in part on the status of a health check. Configuring health checks makes sense only in the following configurations:\\n\\n- *Non-alias resource record sets* : You\'re checking the health of a group of non-alias resource record sets that have the same routing policy, name, and type (such as multiple weighted records named www.example.com with a type of A) and you specify health check IDs for all the resource record sets.\\n\\nIf the health check status for a resource record set is healthy, Route 53 includes the record among the records that it responds to DNS queries with.\\n\\nIf the health check status for a resource record set is unhealthy, Route 53 stops responding to DNS queries using the value for that resource record set.\\n\\nIf the health check status for all resource record sets in the group is unhealthy, Route 53 considers all resource record sets in the group healthy and responds to DNS queries accordingly.\\n- *Alias resource record sets* : You specify the following settings:\\n\\n- You set `EvaluateTargetHealth` to true for an alias resource record set in a group of resource record sets that have the same routing policy, name, and type (such as multiple weighted records named www.example.com with a type of A).\\n- You configure the alias resource record set to route traffic to a non-alias resource record set in the same hosted zone.\\n- You specify a health check ID for the non-alias resource record set.\\n\\nIf the health check status is healthy, Route 53 considers the alias resource record set to be healthy and includes the alias record among the records that it responds to DNS queries with.\\n\\nIf the health check status is unhealthy, Route 53 stops responding to DNS queries using the alias resource record set.\\n\\n> The alias resource record set can also route traffic to a *group* of non-alias resource record sets that have the same routing policy, name, and type. In that configuration, associate health checks with all of the resource record sets in the group of non-alias resource record sets.\\n\\n*Geolocation Routing*\\n\\nFor geolocation resource record sets, if an endpoint is unhealthy, Route 53 looks for a resource record set for the larger, associated geographic region. For example, suppose you have resource record sets for a state in the United States, for the entire United States, for North America, and a resource record set that has `*` for `CountryCode` is `*` , which applies to all locations. If the endpoint for the state resource record set is unhealthy, Route 53 checks for healthy resource record sets in the following order until it finds a resource record set for which the endpoint is healthy:\\n\\n- The United States\\n- North America\\n- The default resource record set\\n\\n*Specifying the Health Check Endpoint by Domain Name*\\n\\nIf your health checks specify the endpoint only by domain name, we recommend that you create a separate health check for each endpoint. For example, create a health check for each `HTTP` server that is serving content for `www.example.com` . For the value of `FullyQualifiedDomainName` , specify the domain name of the server (such as `us-east-2-www.example.com` ), not the name of the resource record sets ( `www.example.com` ).\\n\\n> Health check results will be unpredictable if you do the following:\\n> \\n> - Create a health check that has the same value for `FullyQualifiedDomainName` as the name of a resource record set.\\n> - Associate that health check with the resource record set.","HostedZoneId":"The ID of the hosted zone that you want to create records in.\\n\\nSpecify either `HostedZoneName` or `HostedZoneId` , but not both. If you have multiple hosted zones with the same domain name, you must specify the hosted zone using `HostedZoneId` .","HostedZoneName":"The name of the hosted zone that you want to create records in. You must include a trailing dot (for example, `www.example.com.` ) as part of the `HostedZoneName` .\\n\\nWhen you create a stack using an AWS::Route53::RecordSet that specifies `HostedZoneName` , AWS CloudFormation attempts to find a hosted zone whose name matches the HostedZoneName. If AWS CloudFormation cannot find a hosted zone with a matching domain name, or if there is more than one hosted zone with the specified domain name, AWS CloudFormation will not create the stack.\\n\\nSpecify either `HostedZoneName` or `HostedZoneId` , but not both. If you have multiple hosted zones with the same domain name, you must specify the hosted zone using `HostedZoneId` .","MultiValueAnswer":"*Multivalue answer resource record sets only* : To route traffic approximately randomly to multiple resources, such as web servers, create one multivalue answer record for each resource and specify `true` for `MultiValueAnswer` . Note the following:\\n\\n- If you associate a health check with a multivalue answer resource record set, Amazon Route 53 responds to DNS queries with the corresponding IP address only when the health check is healthy.\\n- If you don\'t associate a health check with a multivalue answer record, Route 53 always considers the record to be healthy.\\n- Route 53 responds to DNS queries with up to eight healthy records; if you have eight or fewer healthy records, Route 53 responds to all DNS queries with all the healthy records.\\n- If you have more than eight healthy records, Route 53 responds to different DNS resolvers with different combinations of healthy records.\\n- When all records are unhealthy, Route 53 responds to DNS queries with up to eight unhealthy records.\\n- If a resource becomes unavailable after a resolver caches a response, client software typically tries another of the IP addresses in the response.\\n\\nYou can\'t create multivalue answer alias records.","Name":"For `ChangeResourceRecordSets` requests, the name of the record that you want to create, update, or delete. For `ListResourceRecordSets` responses, the name of a record in the specified hosted zone.\\n\\n*ChangeResourceRecordSets Only*\\n\\nEnter a fully qualified domain name, for example, `www.example.com` . You can optionally include a trailing dot. If you omit the trailing dot, Amazon Route 53 assumes that the domain name that you specify is fully qualified. This means that Route 53 treats `www.example.com` (without a trailing dot) and `www.example.com.` (with a trailing dot) as identical.\\n\\nFor information about how to specify characters other than `a-z` , `0-9` , and `-` (hyphen) and how to specify internationalized domain names, see [DNS Domain Name Format](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DomainNameFormat.html) in the *Amazon Route 53 Developer Guide* .\\n\\nYou can use the asterisk (*) wildcard to replace the leftmost label in a domain name, for example, `*.example.com` . Note the following:\\n\\n- The * must replace the entire label. For example, you can\'t specify `*prod.example.com` or `prod*.example.com` .\\n- The * can\'t replace any of the middle labels, for example, marketing.*.example.com.\\n- If you include * in any position other than the leftmost label in a domain name, DNS treats it as an * character (ASCII 42), not as a wildcard.\\n\\n> You can\'t use the * wildcard for resource records sets that have a type of NS.\\n\\nYou can use the * wildcard as the leftmost label in a domain name, for example, `*.example.com` . You can\'t use an * for one of the middle labels, for example, `marketing.*.example.com` . In addition, the * must replace the entire label; for example, you can\'t specify `prod*.example.com` .","Region":"*Latency-based resource record sets only:* The Amazon EC2 Region where you created the resource that this resource record set refers to. The resource typically is an AWS resource, such as an EC2 instance or an ELB load balancer, and is referred to by an IP address or a DNS domain name, depending on the record type.\\n\\nWhen Amazon Route 53 receives a DNS query for a domain name and type for which you have created latency resource record sets, Route 53 selects the latency resource record set that has the lowest latency between the end user and the associated Amazon EC2 Region. Route 53 then returns the value that is associated with the selected resource record set.\\n\\nNote the following:\\n\\n- You can only specify one `ResourceRecord` per latency resource record set.\\n- You can only create one latency resource record set for each Amazon EC2 Region.\\n- You aren\'t required to create latency resource record sets for all Amazon EC2 Regions. Route 53 will choose the region with the best latency from among the regions that you create latency resource record sets for.\\n- You can\'t create non-latency resource record sets that have the same values for the `Name` and `Type` elements as latency resource record sets.","ResourceRecords":"One or more values that correspond with the value that you specified for the `Type` property. For example, if you specified `A` for `Type` , you specify one or more IP addresses in IPv4 format for `ResourceRecords` . For information about the format of values for each record type, see [Supported DNS Resource Record Types](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html) in the *Amazon Route 53 Developer Guide* .\\n\\nNote the following:\\n\\n- You can specify more than one value for all record types except CNAME and SOA.\\n- The maximum length of a value is 4000 characters.\\n- If you\'re creating an alias record, omit `ResourceRecords` .","SetIdentifier":"*Resource record sets that have a routing policy other than simple:* An identifier that differentiates among multiple resource record sets that have the same combination of name and type, such as multiple weighted resource record sets named acme.example.com that have a type of A. In a group of resource record sets that have the same name and type, the value of `SetIdentifier` must be unique for each resource record set.\\n\\nFor information about routing policies, see [Choosing a Routing Policy](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html) in the *Amazon Route 53 Developer Guide* .","TTL":"The resource record cache time to live (TTL), in seconds. Note the following:\\n\\n- If you\'re creating or updating an alias resource record set, omit `TTL` . Amazon Route 53 uses the value of `TTL` for the alias target.\\n- If you\'re associating this resource record set with a health check (if you\'re adding a `HealthCheckId` element), we recommend that you specify a `TTL` of 60 seconds or less so clients respond quickly to changes in health status.\\n- All of the resource record sets in a group of weighted resource record sets must have the same value for `TTL` .\\n- If a group of weighted resource record sets includes one or more weighted alias resource record sets for which the alias target is an ELB load balancer, we recommend that you specify a `TTL` of 60 seconds for all of the non-alias weighted resource record sets that have the same name and type. Values other than 60 seconds (the TTL for load balancers) will change the effect of the values that you specify for `Weight` .","Type":"The DNS record type. For information about different record types and how data is encoded for them, see [Supported DNS Resource Record Types](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html) in the *Amazon Route 53 Developer Guide* .\\n\\nValid values for basic resource record sets: `A` | `AAAA` | `CAA` | `CNAME` | `DS` | `MX` | `NAPTR` | `NS` | `PTR` | `SOA` | `SPF` | `SRV` | `TXT`\\n\\nValues for weighted, latency, geolocation, and failover resource record sets: `A` | `AAAA` | `CAA` | `CNAME` | `MX` | `NAPTR` | `PTR` | `SPF` | `SRV` | `TXT` . When creating a group of weighted, latency, geolocation, or failover resource record sets, specify the same value for all of the resource record sets in the group.\\n\\nValid values for multivalue answer resource record sets: `A` | `AAAA` | `MX` | `NAPTR` | `PTR` | `SPF` | `SRV` | `TXT`\\n\\n> SPF records were formerly used to verify the identity of the sender of email messages. However, we no longer recommend that you create resource record sets for which the value of `Type` is `SPF` . RFC 7208, *Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1* , has been updated to say, \\"...[I]ts existence and mechanism defined in [RFC4408] have led to some interoperability issues. Accordingly, its use is no longer appropriate for SPF version 1; implementations are not to use it.\\" In RFC 7208, see section 14.1, [The SPF DNS Record Type](https://docs.aws.amazon.com/http://tools.ietf.org/html/rfc7208#section-14.1) . \\n\\nValues for alias resource record sets:\\n\\n- *Amazon API Gateway custom regional APIs and edge-optimized APIs:* `A`\\n- *CloudFront distributions:* `A`\\n\\nIf IPv6 is enabled for the distribution, create two resource record sets to route traffic to your distribution, one with a value of `A` and one with a value of `AAAA` .\\n- *Amazon API Gateway environment that has a regionalized subdomain* : `A`\\n- *ELB load balancers:* `A` | `AAAA`\\n- *Amazon S3 buckets:* `A`\\n- *Amazon Virtual Private Cloud interface VPC endpoints* `A`\\n- *Another resource record set in this hosted zone:* Specify the type of the resource record set that you\'re creating the alias for. All values are supported except `NS` and `SOA` .\\n\\n> If you\'re creating an alias record that has the same name as the hosted zone (known as the zone apex), you can\'t route traffic to a record for which the value of `Type` is `CNAME` . This is because the alias record must have the same type as the record you\'re routing traffic to, and creating a CNAME record for the zone apex isn\'t supported even for an alias record.","Weight":"*Weighted resource record sets only:* Among resource record sets that have the same combination of DNS name and type, a value that determines the proportion of DNS queries that Amazon Route 53 responds to using the current resource record set. Route 53 calculates the sum of the weights for the resource record sets that have the same combination of DNS name and type. Route 53 then responds to queries based on the ratio of a resource\'s weight to the total. Note the following:\\n\\n- You must specify a value for the `Weight` element for every weighted resource record set.\\n- You can only specify one `ResourceRecord` per weighted resource record set.\\n- You can\'t create latency, failover, or geolocation resource record sets that have the same values for the `Name` and `Type` elements as weighted resource record sets.\\n- You can create a maximum of 100 weighted resource record sets that have the same values for the `Name` and `Type` elements.\\n- For weighted (but not weighted alias) resource record sets, if you set `Weight` to `0` for a resource record set, Route 53 never responds to queries with the applicable value for that resource record set. However, if you set `Weight` to `0` for all resource record sets that have the same combination of DNS name and type, traffic is routed to all resources with equal probability.\\n\\nThe effect of setting `Weight` to `0` is different when you associate health checks with weighted resource record sets. For more information, see [Options for Configuring Route 53 Active-Active and Active-Passive Failover](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-configuring-options.html) in the *Amazon Route 53 Developer Guide* ."}},"AWS::Route53::RecordSet.AliasTarget":{"attributes":{},"description":"*Alias records only:* Information about the AWS resource, such as a CloudFront distribution or an Amazon S3 bucket, that you want to route traffic to.\\n\\nWhen creating records for a private hosted zone, note the following:\\n\\n- Creating geolocation alias and latency alias records in a private hosted zone is allowed but not supported.\\n- For information about creating failover records in a private hosted zone, see [Configuring Failover in a Private Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html) .","properties":{"DNSName":"*Alias records only:* The value that you specify depends on where you want to route queries:\\n\\n- **Amazon API Gateway custom regional APIs and edge-optimized APIs** - Specify the applicable domain name for your API. You can get the applicable value using the AWS CLI command [get-domain-names](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-domain-names.html) :\\n\\n- For regional APIs, specify the value of `regionalDomainName` .\\n- For edge-optimized APIs, specify the value of `distributionDomainName` . This is the name of the associated CloudFront distribution, such as `da1b2c3d4e5.cloudfront.net` .\\n\\n> The name of the record that you\'re creating must match a custom domain name for your API, such as `api.example.com` .\\n- **Amazon Virtual Private Cloud interface VPC endpoint** - Enter the API endpoint for the interface endpoint, such as `vpce-123456789abcdef01-example-us-east-1a.elasticloadbalancing.us-east-1.vpce.amazonaws.com` . For edge-optimized APIs, this is the domain name for the corresponding CloudFront distribution. You can get the value of `DnsName` using the AWS CLI command [describe-vpc-endpoints](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-vpc-endpoints.html) .\\n- **CloudFront distribution** - Specify the domain name that CloudFront assigned when you created your distribution.\\n\\nYour CloudFront distribution must include an alternate domain name that matches the name of the record. For example, if the name of the record is *acme.example.com* , your CloudFront distribution must include *acme.example.com* as one of the alternate domain names. For more information, see [Using Alternate Domain Names (CNAMEs)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html) in the *Amazon CloudFront Developer Guide* .\\n\\nYou can\'t create a record in a private hosted zone to route traffic to a CloudFront distribution.\\n\\n> For failover alias records, you can\'t specify a CloudFront distribution for both the primary and secondary records. A distribution must include an alternate domain name that matches the name of the record. However, the primary and secondary records have the same name, and you can\'t include the same alternate domain name in more than one distribution.\\n- **Elastic Beanstalk environment** - If the domain name for your Elastic Beanstalk environment includes the region that you deployed the environment in, you can create an alias record that routes traffic to the environment. For example, the domain name `my-environment. *us-west-2* .elasticbeanstalk.com` is a regionalized domain name.\\n\\n> For environments that were created before early 2016, the domain name doesn\'t include the region. To route traffic to these environments, you must create a CNAME record instead of an alias record. Note that you can\'t create a CNAME record for the root domain name. For example, if your domain name is example.com, you can create a record that routes traffic for acme.example.com to your Elastic Beanstalk environment, but you can\'t create a record that routes traffic for example.com to your Elastic Beanstalk environment. \\n\\nFor Elastic Beanstalk environments that have regionalized subdomains, specify the `CNAME` attribute for the environment. You can use the following methods to get the value of the CNAME attribute:\\n\\n- *AWS Management Console* : For information about how to get the value by using the console, see [Using Custom Domains with AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customdomains.html) in the *AWS Elastic Beanstalk Developer Guide* .\\n- *Elastic Beanstalk API* : Use the `DescribeEnvironments` action to get the value of the `CNAME` attribute. For more information, see [DescribeEnvironments](https://docs.aws.amazon.com/elasticbeanstalk/latest/api/API_DescribeEnvironments.html) in the *AWS Elastic Beanstalk API Reference* .\\n- *AWS CLI* : Use the `describe-environments` command to get the value of the `CNAME` attribute. For more information, see [describe-environments](https://docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk/describe-environments.html) in the *AWS CLI* .\\n- **ELB load balancer** - Specify the DNS name that is associated with the load balancer. Get the DNS name by using the AWS Management Console , the ELB API, or the AWS CLI .\\n\\n- *AWS Management Console* : Go to the EC2 page, choose *Load Balancers* in the navigation pane, choose the load balancer, choose the *Description* tab, and get the value of the *DNS name* field.\\n\\nIf you\'re routing traffic to a Classic Load Balancer, get the value that begins with *dualstack* . If you\'re routing traffic to another type of load balancer, get the value that applies to the record type, A or AAAA.\\n- *Elastic Load Balancing API* : Use `DescribeLoadBalancers` to get the value of `DNSName` . For more information, see the applicable guide:\\n\\n- Classic Load Balancers: [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_DescribeLoadBalancers.html)\\n- Application and Network Load Balancers: [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html)\\n- *CloudFormation Fn::GetAtt intrinsic function* : Use the [Fn::GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html) intrinsic function to get the value of `DNSName` :\\n\\n- [Classic Load Balancers](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#aws-properties-ec2-elb-return-values) .\\n- [Application and Network Load Balancers](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#aws-resource-elasticloadbalancingv2-loadbalancer-return-values) .\\n- *AWS CLI* : Use `describe-load-balancers` to get the value of `DNSName` . For more information, see the applicable guide:\\n\\n- Classic Load Balancers: [describe-load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html)\\n- Application and Network Load Balancers: [describe-load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elbv2/describe-load-balancers.html)\\n- **Global Accelerator accelerator** - Specify the DNS name for your accelerator:\\n\\n- *Global Accelerator API* : To get the DNS name, use [DescribeAccelerator](https://docs.aws.amazon.com/global-accelerator/latest/api/API_DescribeAccelerator.html) .\\n- *AWS CLI* : To get the DNS name, use [describe-accelerator](https://docs.aws.amazon.com/cli/latest/reference/globalaccelerator/describe-accelerator.html) .\\n- **Amazon S3 bucket that is configured as a static website** - Specify the domain name of the Amazon S3 website endpoint that you created the bucket in, for example, `s3-website.us-east-2.amazonaws.com` . For more information about valid values, see the table [Amazon S3 Website Endpoints](https://docs.aws.amazon.com/general/latest/gr/s3.html#s3_website_region_endpoints) in the *Amazon Web Services General Reference* . For more information about using S3 buckets for websites, see [Getting Started with Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/getting-started.html) in the *Amazon Route 53 Developer Guide.*\\n- **Another Route 53 record** - Specify the value of the `Name` element for a record in the current hosted zone.\\n\\n> If you\'re creating an alias record that has the same name as the hosted zone (known as the zone apex), you can\'t specify the domain name for a record for which the value of `Type` is `CNAME` . This is because the alias record must have the same type as the record that you\'re routing traffic to, and creating a CNAME record for the zone apex isn\'t supported even for an alias record.","EvaluateTargetHealth":"*Applies only to alias, failover alias, geolocation alias, latency alias, and weighted alias resource record sets:* When `EvaluateTargetHealth` is `true` , an alias resource record set inherits the health of the referenced AWS resource, such as an ELB load balancer or another resource record set in the hosted zone.\\n\\nNote the following:\\n\\n- **CloudFront distributions** - You can\'t set `EvaluateTargetHealth` to `true` when the alias target is a CloudFront distribution.\\n- **Elastic Beanstalk environments that have regionalized subdomains** - If you specify an Elastic Beanstalk environment in `DNSName` and the environment contains an ELB load balancer, Elastic Load Balancing routes queries only to the healthy Amazon EC2 instances that are registered with the load balancer. (An environment automatically contains an ELB load balancer if it includes more than one Amazon EC2 instance.) If you set `EvaluateTargetHealth` to `true` and either no Amazon EC2 instances are healthy or the load balancer itself is unhealthy, Route 53 routes queries to other available resources that are healthy, if any.\\n\\nIf the environment contains a single Amazon EC2 instance, there are no special requirements.\\n- **ELB load balancers** - Health checking behavior depends on the type of load balancer:\\n\\n- *Classic Load Balancers* : If you specify an ELB Classic Load Balancer in `DNSName` , Elastic Load Balancing routes queries only to the healthy Amazon EC2 instances that are registered with the load balancer. If you set `EvaluateTargetHealth` to `true` and either no EC2 instances are healthy or the load balancer itself is unhealthy, Route 53 routes queries to other resources.\\n- *Application and Network Load Balancers* : If you specify an ELB Application or Network Load Balancer and you set `EvaluateTargetHealth` to `true` , Route 53 routes queries to the load balancer based on the health of the target groups that are associated with the load balancer:\\n\\n- For an Application or Network Load Balancer to be considered healthy, every target group that contains targets must contain at least one healthy target. If any target group contains only unhealthy targets, the load balancer is considered unhealthy, and Route 53 routes queries to other resources.\\n- A target group that has no registered targets is considered unhealthy.\\n\\n> When you create a load balancer, you configure settings for Elastic Load Balancing health checks; they\'re not Route 53 health checks, but they perform a similar function. Do not create Route 53 health checks for the EC2 instances that you register with an ELB load balancer.\\n- **S3 buckets** - There are no special requirements for setting `EvaluateTargetHealth` to `true` when the alias target is an S3 bucket.\\n- **Other records in the same hosted zone** - If the AWS resource that you specify in `DNSName` is a record or a group of records (for example, a group of weighted records) but is not another alias record, we recommend that you associate a health check with all of the records in the alias target. For more information, see [What Happens When You Omit Health Checks?](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-complex-configs.html#dns-failover-complex-configs-hc-omitting) in the *Amazon Route 53 Developer Guide* .\\n\\nFor more information and examples, see [Amazon Route 53 Health Checks and DNS Failover](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html) in the *Amazon Route 53 Developer Guide* .","HostedZoneId":"*Alias resource records sets only* : The value used depends on where you want to route traffic:\\n\\n- **Amazon API Gateway custom regional APIs and edge-optimized APIs** - Specify the hosted zone ID for your API. You can get the applicable value using the AWS CLI command [get-domain-names](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-domain-names.html) :\\n\\n- For regional APIs, specify the value of `regionalHostedZoneId` .\\n- For edge-optimized APIs, specify the value of `distributionHostedZoneId` .\\n- **Amazon Virtual Private Cloud interface VPC endpoint** - Specify the hosted zone ID for your interface endpoint. You can get the value of `HostedZoneId` using the AWS CLI command [describe-vpc-endpoints](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-vpc-endpoints.html) .\\n- **CloudFront distribution** - Specify `Z2FDTNDATAQYW2` . This is always the hosted zone ID when you create an alias record that routes traffic to a CloudFront distribution.\\n\\n> Alias records for CloudFront can\'t be created in a private zone.\\n- **Elastic Beanstalk environment** - Specify the hosted zone ID for the region that you created the environment in. The environment must have a regionalized subdomain. For a list of regions and the corresponding hosted zone IDs, see [AWS Elastic Beanstalk endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/elasticbeanstalk.html) in the *Amazon Web Services General Reference* .\\n- **ELB load balancer** - Specify the value of the hosted zone ID for the load balancer. Use the following methods to get the hosted zone ID:\\n\\n- [Service Endpoints](https://docs.aws.amazon.com/general/latest/gr/elb.html) table in the \\"Elastic Load Balancing Endpoints and Quotas\\" topic in the *Amazon Web Services General Reference* : Use the value that corresponds with the region that you created your load balancer in. Note that there are separate columns for Application and Classic Load Balancers and for Network Load Balancers.\\n- *AWS Management Console* : Go to the Amazon EC2 page, choose *Load Balancers* in the navigation pane, select the load balancer, and get the value of the *Hosted zone* field on the *Description* tab.\\n- *Elastic Load Balancing API* : Use `DescribeLoadBalancers` to get the applicable value. For more information, see the applicable guide:\\n\\n- Classic Load Balancers: Use [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_DescribeLoadBalancers.html) to get the value of `CanonicalHostedZoneNameID` .\\n- Application and Network Load Balancers: Use [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html) to get the value of `CanonicalHostedZoneID` .\\n- *CloudFormation Fn::GetAtt intrinsic function* : Use the [Fn::GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html) intrinsic function to get the applicable value:\\n\\n- Classic Load Balancers: Get [CanonicalHostedZoneNameID](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#aws-properties-ec2-elb-return-values) .\\n- Application and Network Load Balancers: Get [CanonicalHostedZoneID](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#aws-resource-elasticloadbalancingv2-loadbalancer-return-values) .\\n- *AWS CLI* : Use `describe-load-balancers` to get the applicable value. For more information, see the applicable guide:\\n\\n- Classic Load Balancers: Use [describe-load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html) to get the value of `CanonicalHostedZoneNameID` .\\n- Application and Network Load Balancers: Use [describe-load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elbv2/describe-load-balancers.html) to get the value of `CanonicalHostedZoneID` .\\n- **Global Accelerator accelerator** - Specify `Z2BJ6XQ5FK7U4H` .\\n- **An Amazon S3 bucket configured as a static website** - Specify the hosted zone ID for the region that you created the bucket in. For more information about valid values, see the table [Amazon S3 Website Endpoints](https://docs.aws.amazon.com/general/latest/gr/s3.html#s3_website_region_endpoints) in the *Amazon Web Services General Reference* .\\n- **Another Route 53 record in your hosted zone** - Specify the hosted zone ID of your hosted zone. (An alias record can\'t reference a record in a different hosted zone.)"}},"AWS::Route53::RecordSet.CidrRoutingConfig":{"attributes":{},"description":"The object that is specified in resource record set object when you are linking a resource record set to a CIDR location.\\n\\nA `LocationName` with an asterisk “*” can be used to create a default CIDR record. `CollectionId` is still required for default record.","properties":{"CollectionId":"The CIDR collection ID.","LocationName":"The CIDR collection location name."}},"AWS::Route53::RecordSet.GeoLocation":{"attributes":{},"description":"A complex type that contains information about a geographic location.","properties":{"ContinentCode":"For geolocation resource record sets, a two-letter abbreviation that identifies a continent. Route 53 supports the following continent codes:\\n\\n- *AF* : Africa\\n- *AN* : Antarctica\\n- *AS* : Asia\\n- *EU* : Europe\\n- *OC* : Oceania\\n- *NA* : North America\\n- *SA* : South America\\n\\nConstraint: Specifying `ContinentCode` with either `CountryCode` or `SubdivisionCode` returns an `InvalidInput` error.","CountryCode":"For geolocation resource record sets, the two-letter code for a country.\\n\\nRoute 53 uses the two-letter country codes that are specified in [ISO standard 3166-1 alpha-2](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) .","SubdivisionCode":"For geolocation resource record sets, the two-letter code for a state of the United States. Route 53 doesn\'t support any other values for `SubdivisionCode` . For a list of state abbreviations, see [Appendix B: Two–Letter State and Possession Abbreviations](https://docs.aws.amazon.com/https://pe.usps.com/text/pub28/28apb.htm) on the United States Postal Service website.\\n\\nIf you specify `subdivisioncode` , you must also specify `US` for `CountryCode` ."}},"AWS::Route53::RecordSetGroup":{"attributes":{"Ref":"`Ref` returns the name of the record set group, for example, `MyRecordSetGroup` ."},"description":"A complex type that contains an optional comment, the name and ID of the hosted zone that you want to make changes in, and values for the records that you want to create.","properties":{"Comment":"*Optional:* Any comments you want to include about a change batch request.","HostedZoneId":"The ID of the hosted zone that you want to create records in.\\n\\nSpecify either `HostedZoneName` or `HostedZoneId` , but not both. If you have multiple hosted zones with the same domain name, you must specify the hosted zone using `HostedZoneId` .","HostedZoneName":"The name of the hosted zone that you want to create records in. You must include a trailing dot (for example, `www.example.com.` ) as part of the `HostedZoneName` .\\n\\nWhen you create a stack using an `AWS::Route53::RecordSet` that specifies `HostedZoneName` , AWS CloudFormation attempts to find a hosted zone whose name matches the `HostedZoneName` . If AWS CloudFormation can\'t find a hosted zone with a matching domain name, or if there is more than one hosted zone with the specified domain name, AWS CloudFormation will not create the stack.\\n\\nSpecify either `HostedZoneName` or `HostedZoneId` , but not both. If you have multiple hosted zones with the same domain name, you must specify the hosted zone using `HostedZoneId` .","RecordSets":"A complex type that contains one `RecordSet` element for each record that you want to create."}},"AWS::Route53::RecordSetGroup.AliasTarget":{"attributes":{},"description":"*Alias records only:* Information about the AWS resource, such as a CloudFront distribution or an Amazon S3 bucket, that you want to route traffic to.\\n\\nWhen creating records for a private hosted zone, note the following:\\n\\n- Creating geolocation alias and latency alias records in a private hosted zone is allowed but not supported.\\n- For information about creating failover records in a private hosted zone, see [Configuring Failover in a Private Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html) .","properties":{"DNSName":"*Alias records only:* The value that you specify depends on where you want to route queries:\\n\\n- **Amazon API Gateway custom regional APIs and edge-optimized APIs** - Specify the applicable domain name for your API. You can get the applicable value using the AWS CLI command [get-domain-names](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-domain-names.html) :\\n\\n- For regional APIs, specify the value of `regionalDomainName` .\\n- For edge-optimized APIs, specify the value of `distributionDomainName` . This is the name of the associated CloudFront distribution, such as `da1b2c3d4e5.cloudfront.net` .\\n\\n> The name of the record that you\'re creating must match a custom domain name for your API, such as `api.example.com` .\\n- **Amazon Virtual Private Cloud interface VPC endpoint** - Enter the API endpoint for the interface endpoint, such as `vpce-123456789abcdef01-example-us-east-1a.elasticloadbalancing.us-east-1.vpce.amazonaws.com` . For edge-optimized APIs, this is the domain name for the corresponding CloudFront distribution. You can get the value of `DnsName` using the AWS CLI command [describe-vpc-endpoints](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-vpc-endpoints.html) .\\n- **CloudFront distribution** - Specify the domain name that CloudFront assigned when you created your distribution.\\n\\nYour CloudFront distribution must include an alternate domain name that matches the name of the record. For example, if the name of the record is *acme.example.com* , your CloudFront distribution must include *acme.example.com* as one of the alternate domain names. For more information, see [Using Alternate Domain Names (CNAMEs)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html) in the *Amazon CloudFront Developer Guide* .\\n\\nYou can\'t create a record in a private hosted zone to route traffic to a CloudFront distribution.\\n\\n> For failover alias records, you can\'t specify a CloudFront distribution for both the primary and secondary records. A distribution must include an alternate domain name that matches the name of the record. However, the primary and secondary records have the same name, and you can\'t include the same alternate domain name in more than one distribution.\\n- **Elastic Beanstalk environment** - If the domain name for your Elastic Beanstalk environment includes the region that you deployed the environment in, you can create an alias record that routes traffic to the environment. For example, the domain name `my-environment. *us-west-2* .elasticbeanstalk.com` is a regionalized domain name.\\n\\n> For environments that were created before early 2016, the domain name doesn\'t include the region. To route traffic to these environments, you must create a CNAME record instead of an alias record. Note that you can\'t create a CNAME record for the root domain name. For example, if your domain name is example.com, you can create a record that routes traffic for acme.example.com to your Elastic Beanstalk environment, but you can\'t create a record that routes traffic for example.com to your Elastic Beanstalk environment. \\n\\nFor Elastic Beanstalk environments that have regionalized subdomains, specify the `CNAME` attribute for the environment. You can use the following methods to get the value of the CNAME attribute:\\n\\n- *AWS Management Console* : For information about how to get the value by using the console, see [Using Custom Domains with AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customdomains.html) in the *AWS Elastic Beanstalk Developer Guide* .\\n- *Elastic Beanstalk API* : Use the `DescribeEnvironments` action to get the value of the `CNAME` attribute. For more information, see [DescribeEnvironments](https://docs.aws.amazon.com/elasticbeanstalk/latest/api/API_DescribeEnvironments.html) in the *AWS Elastic Beanstalk API Reference* .\\n- *AWS CLI* : Use the `describe-environments` command to get the value of the `CNAME` attribute. For more information, see [describe-environments](https://docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk/describe-environments.html) in the *AWS CLI* .\\n- **ELB load balancer** - Specify the DNS name that is associated with the load balancer. Get the DNS name by using the AWS Management Console , the ELB API, or the AWS CLI .\\n\\n- *AWS Management Console* : Go to the EC2 page, choose *Load Balancers* in the navigation pane, choose the load balancer, choose the *Description* tab, and get the value of the *DNS name* field.\\n\\nIf you\'re routing traffic to a Classic Load Balancer, get the value that begins with *dualstack* . If you\'re routing traffic to another type of load balancer, get the value that applies to the record type, A or AAAA.\\n- *Elastic Load Balancing API* : Use `DescribeLoadBalancers` to get the value of `DNSName` . For more information, see the applicable guide:\\n\\n- Classic Load Balancers: [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_DescribeLoadBalancers.html)\\n- Application and Network Load Balancers: [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html)\\n- *CloudFormation Fn::GetAtt intrinsic function* : Use the [Fn::GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html) intrinsic function to get the value of `DNSName` :\\n\\n- [Classic Load Balancers](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#aws-properties-ec2-elb-return-values) .\\n- [Application and Network Load Balancers](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#aws-resource-elasticloadbalancingv2-loadbalancer-return-values) .\\n- *AWS CLI* : Use `describe-load-balancers` to get the value of `DNSName` . For more information, see the applicable guide:\\n\\n- Classic Load Balancers: [describe-load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html)\\n- Application and Network Load Balancers: [describe-load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elbv2/describe-load-balancers.html)\\n- **Global Accelerator accelerator** - Specify the DNS name for your accelerator:\\n\\n- *Global Accelerator API* : To get the DNS name, use [DescribeAccelerator](https://docs.aws.amazon.com/global-accelerator/latest/api/API_DescribeAccelerator.html) .\\n- *AWS CLI* : To get the DNS name, use [describe-accelerator](https://docs.aws.amazon.com/cli/latest/reference/globalaccelerator/describe-accelerator.html) .\\n- **Amazon S3 bucket that is configured as a static website** - Specify the domain name of the Amazon S3 website endpoint that you created the bucket in, for example, `s3-website.us-east-2.amazonaws.com` . For more information about valid values, see the table [Amazon S3 Website Endpoints](https://docs.aws.amazon.com/general/latest/gr/s3.html#s3_website_region_endpoints) in the *Amazon Web Services General Reference* . For more information about using S3 buckets for websites, see [Getting Started with Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/getting-started.html) in the *Amazon Route 53 Developer Guide.*\\n- **Another Route 53 record** - Specify the value of the `Name` element for a record in the current hosted zone.\\n\\n> If you\'re creating an alias record that has the same name as the hosted zone (known as the zone apex), you can\'t specify the domain name for a record for which the value of `Type` is `CNAME` . This is because the alias record must have the same type as the record that you\'re routing traffic to, and creating a CNAME record for the zone apex isn\'t supported even for an alias record.","EvaluateTargetHealth":"*Applies only to alias records with any routing policy:* When `EvaluateTargetHealth` is `true` , an alias record inherits the health of the referenced AWS resource, such as an ELB load balancer or another record in the hosted zone.\\n\\nNote the following:\\n\\n- **CloudFront distributions** - You can\'t set `EvaluateTargetHealth` to `true` when the alias target is a CloudFront distribution.\\n- **Elastic Beanstalk environments that have regionalized subdomains** - If you specify an Elastic Beanstalk environment in `DNSName` and the environment contains an ELB load balancer, Elastic Load Balancing routes queries only to the healthy Amazon EC2 instances that are registered with the load balancer. (An environment automatically contains an ELB load balancer if it includes more than one Amazon EC2 instance.) If you set `EvaluateTargetHealth` to `true` and either no Amazon EC2 instances are healthy or the load balancer itself is unhealthy, Route 53 routes queries to other available resources that are healthy, if any.\\n\\nIf the environment contains a single Amazon EC2 instance, there are no special requirements.\\n- **ELB load balancers** - Health checking behavior depends on the type of load balancer:\\n\\n- *Classic Load Balancers* : If you specify an ELB Classic Load Balancer in `DNSName` , Elastic Load Balancing routes queries only to the healthy Amazon EC2 instances that are registered with the load balancer. If you set `EvaluateTargetHealth` to `true` and either no EC2 instances are healthy or the load balancer itself is unhealthy, Route 53 routes queries to other resources.\\n- *Application and Network Load Balancers* : If you specify an ELB Application or Network Load Balancer and you set `EvaluateTargetHealth` to `true` , Route 53 routes queries to the load balancer based on the health of the target groups that are associated with the load balancer:\\n\\n- For an Application or Network Load Balancer to be considered healthy, every target group that contains targets must contain at least one healthy target. If any target group contains only unhealthy targets, the load balancer is considered unhealthy, and Route 53 routes queries to other resources.\\n- A target group that has no registered targets is considered unhealthy.\\n\\n> When you create a load balancer, you configure settings for Elastic Load Balancing health checks; they\'re not Route 53 health checks, but they perform a similar function. Do not create Route 53 health checks for the EC2 instances that you register with an ELB load balancer.\\n- **S3 buckets** - There are no special requirements for setting `EvaluateTargetHealth` to `true` when the alias target is an S3 bucket.\\n- **Other records in the same hosted zone** - If the AWS resource that you specify in `DNSName` is a record or a group of records (for example, a group of weighted records) but is not another alias record, we recommend that you associate a health check with all of the records in the alias target. For more information, see [What Happens When You Omit Health Checks?](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-complex-configs.html#dns-failover-complex-configs-hc-omitting) in the *Amazon Route 53 Developer Guide* .\\n\\nFor more information and examples, see [Amazon Route 53 Health Checks and DNS Failover](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html) in the *Amazon Route 53 Developer Guide* .","HostedZoneId":"*Alias resource records sets only* : The value used depends on where you want to route traffic:\\n\\n- **Amazon API Gateway custom regional APIs and edge-optimized APIs** - Specify the hosted zone ID for your API. You can get the applicable value using the AWS CLI command [get-domain-names](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-domain-names.html) :\\n\\n- For regional APIs, specify the value of `regionalHostedZoneId` .\\n- For edge-optimized APIs, specify the value of `distributionHostedZoneId` .\\n- **Amazon Virtual Private Cloud interface VPC endpoint** - Specify the hosted zone ID for your interface endpoint. You can get the value of `HostedZoneId` using the AWS CLI command [describe-vpc-endpoints](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-vpc-endpoints.html) .\\n- **CloudFront distribution** - Specify `Z2FDTNDATAQYW2` . This is always the hosted zone ID when you create an alias record that routes traffic to a CloudFront distribution.\\n\\n> Alias records for CloudFront can\'t be created in a private zone.\\n- **Elastic Beanstalk environment** - Specify the hosted zone ID for the region that you created the environment in. The environment must have a regionalized subdomain. For a list of regions and the corresponding hosted zone IDs, see [AWS Elastic Beanstalk endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/elasticbeanstalk.html) in the *Amazon Web Services General Reference* .\\n- **ELB load balancer** - Specify the value of the hosted zone ID for the load balancer. Use the following methods to get the hosted zone ID:\\n\\n- [Service Endpoints](https://docs.aws.amazon.com/general/latest/gr/elb.html) table in the \\"Elastic Load Balancing endpoints and quotas\\" topic in the *Amazon Web Services General Reference* : Use the value that corresponds with the region that you created your load balancer in. Note that there are separate columns for Application and Classic Load Balancers and for Network Load Balancers.\\n- *AWS Management Console* : Go to the Amazon EC2 page, choose *Load Balancers* in the navigation pane, select the load balancer, and get the value of the *Hosted zone* field on the *Description* tab.\\n- *Elastic Load Balancing API* : Use `DescribeLoadBalancers` to get the applicable value. For more information, see the applicable guide:\\n\\n- Classic Load Balancers: Use [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_DescribeLoadBalancers.html) to get the value of `CanonicalHostedZoneNameID` .\\n- Application and Network Load Balancers: Use [DescribeLoadBalancers](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html) to get the value of `CanonicalHostedZoneID` .\\n- *CloudFormation Fn::GetAtt intrinsic function* : Use the [Fn::GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html) intrinsic function to get the applicable value:\\n\\n- Classic Load Balancers: Get [CanonicalHostedZoneNameID](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#aws-properties-ec2-elb-return-values) .\\n- Application and Network Load Balancers: Get [CanonicalHostedZoneID](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#aws-resource-elasticloadbalancingv2-loadbalancer-return-values) .\\n- *AWS CLI* : Use `describe-load-balancers` to get the applicable value. For more information, see the applicable guide:\\n\\n- Classic Load Balancers: Use [describe-load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html) to get the value of `CanonicalHostedZoneNameID` .\\n- Application and Network Load Balancers: Use [describe-load-balancers](https://docs.aws.amazon.com/cli/latest/reference/elbv2/describe-load-balancers.html) to get the value of `CanonicalHostedZoneID` .\\n- **Global Accelerator accelerator** - Specify `Z2BJ6XQ5FK7U4H` .\\n- **An Amazon S3 bucket configured as a static website** - Specify the hosted zone ID for the region that you created the bucket in. For more information about valid values, see the table [Amazon S3 Website Endpoints](https://docs.aws.amazon.com/general/latest/gr/s3.html#s3_website_region_endpoints) in the *Amazon Web Services General Reference* .\\n- **Another Route 53 record in your hosted zone** - Specify the hosted zone ID of your hosted zone. (An alias record can\'t reference a record in a different hosted zone.)"}},"AWS::Route53::RecordSetGroup.CidrRoutingConfig":{"attributes":{},"description":"The object that is specified in resource record set object when you are linking a resource record set to a CIDR location.\\n\\nA `LocationName` with an asterisk “*” can be used to create a default CIDR record. `CollectionId` is still required for default record.","properties":{"CollectionId":"The CIDR collection ID.","LocationName":"The CIDR collection location name."}},"AWS::Route53::RecordSetGroup.GeoLocation":{"attributes":{},"description":"A complex type that contains information about a geographic location.","properties":{"ContinentCode":"For geolocation resource record sets, a two-letter abbreviation that identifies a continent. Route 53 supports the following continent codes:\\n\\n- *AF* : Africa\\n- *AN* : Antarctica\\n- *AS* : Asia\\n- *EU* : Europe\\n- *OC* : Oceania\\n- *NA* : North America\\n- *SA* : South America\\n\\nConstraint: Specifying `ContinentCode` with either `CountryCode` or `SubdivisionCode` returns an `InvalidInput` error.","CountryCode":"For geolocation resource record sets, the two-letter code for a country.\\n\\nRoute 53 uses the two-letter country codes that are specified in [ISO standard 3166-1 alpha-2](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) .","SubdivisionCode":"For geolocation resource record sets, the two-letter code for a state of the United States. Route 53 doesn\'t support any other values for `SubdivisionCode` . For a list of state abbreviations, see [Appendix B: Two–Letter State and Possession Abbreviations](https://docs.aws.amazon.com/https://pe.usps.com/text/pub28/28apb.htm) on the United States Postal Service website.\\n\\nIf you specify `subdivisioncode` , you must also specify `US` for `CountryCode` ."}},"AWS::Route53::RecordSetGroup.RecordSet":{"attributes":{},"description":"Information about one record that you want to create.","properties":{"AliasTarget":"*Alias resource record sets only:* Information about the AWS resource, such as a CloudFront distribution or an Amazon S3 bucket, that you want to route traffic to.\\n\\nIf you\'re creating resource records sets for a private hosted zone, note the following:\\n\\n- You can\'t create an alias resource record set in a private hosted zone to route traffic to a CloudFront distribution.\\n- For information about creating failover resource record sets in a private hosted zone, see [Configuring Failover in a Private Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html) in the *Amazon Route 53 Developer Guide* .","CidrRoutingConfig":"","Failover":"*Failover resource record sets only:* To configure failover, you add the `Failover` element to two resource record sets. For one resource record set, you specify `PRIMARY` as the value for `Failover` ; for the other resource record set, you specify `SECONDARY` . In addition, you include the `HealthCheckId` element and specify the health check that you want Amazon Route 53 to perform for each resource record set.\\n\\nExcept where noted, the following failover behaviors assume that you have included the `HealthCheckId` element in both resource record sets:\\n\\n- When the primary resource record set is healthy, Route 53 responds to DNS queries with the applicable value from the primary resource record set regardless of the health of the secondary resource record set.\\n- When the primary resource record set is unhealthy and the secondary resource record set is healthy, Route 53 responds to DNS queries with the applicable value from the secondary resource record set.\\n- When the secondary resource record set is unhealthy, Route 53 responds to DNS queries with the applicable value from the primary resource record set regardless of the health of the primary resource record set.\\n- If you omit the `HealthCheckId` element for the secondary resource record set, and if the primary resource record set is unhealthy, Route 53 always responds to DNS queries with the applicable value from the secondary resource record set. This is true regardless of the health of the associated endpoint.\\n\\nYou can\'t create non-failover resource record sets that have the same values for the `Name` and `Type` elements as failover resource record sets.\\n\\nFor failover alias resource record sets, you must also include the `EvaluateTargetHealth` element and set the value to true.\\n\\nFor more information about configuring failover for Route 53, see the following topics in the *Amazon Route 53 Developer Guide* :\\n\\n- [Route 53 Health Checks and DNS Failover](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html)\\n- [Configuring Failover in a Private Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html)","GeoLocation":"*Geolocation resource record sets only:* A complex type that lets you control how Amazon Route 53 responds to DNS queries based on the geographic origin of the query. For example, if you want all queries from Africa to be routed to a web server with an IP address of `192.0.2.111` , create a resource record set with a `Type` of `A` and a `ContinentCode` of `AF` .\\n\\n> Although creating geolocation and geolocation alias resource record sets in a private hosted zone is allowed, it\'s not supported. \\n\\nIf you create separate resource record sets for overlapping geographic regions (for example, one resource record set for a continent and one for a country on the same continent), priority goes to the smallest geographic region. This allows you to route most queries for a continent to one resource and to route queries for a country on that continent to a different resource.\\n\\nYou can\'t create two geolocation resource record sets that specify the same geographic location.\\n\\nThe value `*` in the `CountryCode` element matches all geographic locations that aren\'t specified in other geolocation resource record sets that have the same values for the `Name` and `Type` elements.\\n\\n> Geolocation works by mapping IP addresses to locations. However, some IP addresses aren\'t mapped to geographic locations, so even if you create geolocation resource record sets that cover all seven continents, Route 53 will receive some DNS queries from locations that it can\'t identify. We recommend that you create a resource record set for which the value of `CountryCode` is `*` . Two groups of queries are routed to the resource that you specify in this record: queries that come from locations for which you haven\'t created geolocation resource record sets and queries from IP addresses that aren\'t mapped to a location. If you don\'t create a `*` resource record set, Route 53 returns a \\"no answer\\" response for queries from those locations. \\n\\nYou can\'t create non-geolocation resource record sets that have the same values for the `Name` and `Type` elements as geolocation resource record sets.","HealthCheckId":"If you want Amazon Route 53 to return this resource record set in response to a DNS query only when the status of a health check is healthy, include the `HealthCheckId` element and specify the ID of the applicable health check.\\n\\nRoute 53 determines whether a resource record set is healthy based on one of the following:\\n\\n- By periodically sending a request to the endpoint that is specified in the health check\\n- By aggregating the status of a specified group of health checks (calculated health checks)\\n- By determining the current state of a CloudWatch alarm (CloudWatch metric health checks)\\n\\n> Route 53 doesn\'t check the health of the endpoint that is specified in the resource record set, for example, the endpoint specified by the IP address in the `Value` element. When you add a `HealthCheckId` element to a resource record set, Route 53 checks the health of the endpoint that you specified in the health check. \\n\\nFor more information, see the following topics in the *Amazon Route 53 Developer Guide* :\\n\\n- [How Amazon Route 53 Determines Whether an Endpoint Is Healthy](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html)\\n- [Route 53 Health Checks and DNS Failover](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html)\\n- [Configuring Failover in a Private Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html)\\n\\n*When to Specify HealthCheckId*\\n\\nSpecifying a value for `HealthCheckId` is useful only when Route 53 is choosing between two or more resource record sets to respond to a DNS query, and you want Route 53 to base the choice in part on the status of a health check. Configuring health checks makes sense only in the following configurations:\\n\\n- *Non-alias resource record sets* : You\'re checking the health of a group of non-alias resource record sets that have the same routing policy, name, and type (such as multiple weighted records named www.example.com with a type of A) and you specify health check IDs for all the resource record sets.\\n\\nIf the health check status for a resource record set is healthy, Route 53 includes the record among the records that it responds to DNS queries with.\\n\\nIf the health check status for a resource record set is unhealthy, Route 53 stops responding to DNS queries using the value for that resource record set.\\n\\nIf the health check status for all resource record sets in the group is unhealthy, Route 53 considers all resource record sets in the group healthy and responds to DNS queries accordingly.\\n- *Alias resource record sets* : You specify the following settings:\\n\\n- You set `EvaluateTargetHealth` to true for an alias resource record set in a group of resource record sets that have the same routing policy, name, and type (such as multiple weighted records named www.example.com with a type of A).\\n- You configure the alias resource record set to route traffic to a non-alias resource record set in the same hosted zone.\\n- You specify a health check ID for the non-alias resource record set.\\n\\nIf the health check status is healthy, Route 53 considers the alias resource record set to be healthy and includes the alias record among the records that it responds to DNS queries with.\\n\\nIf the health check status is unhealthy, Route 53 stops responding to DNS queries using the alias resource record set.\\n\\n> The alias resource record set can also route traffic to a *group* of non-alias resource record sets that have the same routing policy, name, and type. In that configuration, associate health checks with all of the resource record sets in the group of non-alias resource record sets.\\n\\n*Geolocation Routing*\\n\\nFor geolocation resource record sets, if an endpoint is unhealthy, Route 53 looks for a resource record set for the larger, associated geographic region. For example, suppose you have resource record sets for a state in the United States, for the entire United States, for North America, and a resource record set that has `*` for `CountryCode` is `*` , which applies to all locations. If the endpoint for the state resource record set is unhealthy, Route 53 checks for healthy resource record sets in the following order until it finds a resource record set for which the endpoint is healthy:\\n\\n- The United States\\n- North America\\n- The default resource record set\\n\\n*Specifying the Health Check Endpoint by Domain Name*\\n\\nIf your health checks specify the endpoint only by domain name, we recommend that you create a separate health check for each endpoint. For example, create a health check for each `HTTP` server that is serving content for `www.example.com` . For the value of `FullyQualifiedDomainName` , specify the domain name of the server (such as `us-east-2-www.example.com` ), not the name of the resource record sets ( `www.example.com` ).\\n\\n> Health check results will be unpredictable if you do the following:\\n> \\n> - Create a health check that has the same value for `FullyQualifiedDomainName` as the name of a resource record set.\\n> - Associate that health check with the resource record set.","HostedZoneId":"The ID of the hosted zone that you want to create records in.\\n\\nSpecify either `HostedZoneName` or `HostedZoneId` , but not both. If you have multiple hosted zones with the same domain name, you must specify the hosted zone using `HostedZoneId` .","HostedZoneName":"The name of the hosted zone that you want to create records in. You must include a trailing dot (for example, `www.example.com.` ) as part of the `HostedZoneName` .\\n\\nWhen you create a stack using an `AWS::Route53::RecordSet` that specifies `HostedZoneName` , AWS CloudFormation attempts to find a hosted zone whose name matches the `HostedZoneName` . If AWS CloudFormation can\'t find a hosted zone with a matching domain name, or if there is more than one hosted zone with the specified domain name, AWS CloudFormation will not create the stack.\\n\\nSpecify either `HostedZoneName` or `HostedZoneId` , but not both. If you have multiple hosted zones with the same domain name, you must specify the hosted zone using `HostedZoneId` .","MultiValueAnswer":"*Multivalue answer resource record sets only* : To route traffic approximately randomly to multiple resources, such as web servers, create one multivalue answer record for each resource and specify `true` for `MultiValueAnswer` . Note the following:\\n\\n- If you associate a health check with a multivalue answer resource record set, Amazon Route 53 responds to DNS queries with the corresponding IP address only when the health check is healthy.\\n- If you don\'t associate a health check with a multivalue answer record, Route 53 always considers the record to be healthy.\\n- Route 53 responds to DNS queries with up to eight healthy records; if you have eight or fewer healthy records, Route 53 responds to all DNS queries with all the healthy records.\\n- If you have more than eight healthy records, Route 53 responds to different DNS resolvers with different combinations of healthy records.\\n- When all records are unhealthy, Route 53 responds to DNS queries with up to eight unhealthy records.\\n- If a resource becomes unavailable after a resolver caches a response, client software typically tries another of the IP addresses in the response.\\n\\nYou can\'t create multivalue answer alias records.","Name":"For `ChangeResourceRecordSets` requests, the name of the record that you want to create, update, or delete. For `ListResourceRecordSets` responses, the name of a record in the specified hosted zone.\\n\\n*ChangeResourceRecordSets Only*\\n\\nEnter a fully qualified domain name, for example, `www.example.com` . You can optionally include a trailing dot. If you omit the trailing dot, Amazon Route 53 assumes that the domain name that you specify is fully qualified. This means that Route 53 treats `www.example.com` (without a trailing dot) and `www.example.com.` (with a trailing dot) as identical.\\n\\nFor information about how to specify characters other than `a-z` , `0-9` , and `-` (hyphen) and how to specify internationalized domain names, see [DNS Domain Name Format](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DomainNameFormat.html) in the *Amazon Route 53 Developer Guide* .\\n\\nYou can use the asterisk (*) wildcard to replace the leftmost label in a domain name, for example, `*.example.com` . Note the following:\\n\\n- The * must replace the entire label. For example, you can\'t specify `*prod.example.com` or `prod*.example.com` .\\n- The * can\'t replace any of the middle labels, for example, marketing.*.example.com.\\n- If you include * in any position other than the leftmost label in a domain name, DNS treats it as an * character (ASCII 42), not as a wildcard.\\n\\n> You can\'t use the * wildcard for resource records sets that have a type of NS.\\n\\nYou can use the * wildcard as the leftmost label in a domain name, for example, `*.example.com` . You can\'t use an * for one of the middle labels, for example, `marketing.*.example.com` . In addition, the * must replace the entire label; for example, you can\'t specify `prod*.example.com` .","Region":"*Latency-based resource record sets only:* The Amazon EC2 Region where you created the resource that this resource record set refers to. The resource typically is an AWS resource, such as an EC2 instance or an ELB load balancer, and is referred to by an IP address or a DNS domain name, depending on the record type.\\n\\nWhen Amazon Route 53 receives a DNS query for a domain name and type for which you have created latency resource record sets, Route 53 selects the latency resource record set that has the lowest latency between the end user and the associated Amazon EC2 Region. Route 53 then returns the value that is associated with the selected resource record set.\\n\\nNote the following:\\n\\n- You can only specify one `ResourceRecord` per latency resource record set.\\n- You can only create one latency resource record set for each Amazon EC2 Region.\\n- You aren\'t required to create latency resource record sets for all Amazon EC2 Regions. Route 53 will choose the region with the best latency from among the regions that you create latency resource record sets for.\\n- You can\'t create non-latency resource record sets that have the same values for the `Name` and `Type` elements as latency resource record sets.","ResourceRecords":"Information about the records that you want to create. Each record should be in the format appropriate for the record type specified by the `Type` property. For information about different record types and their record formats, see [Values That You Specify When You Create or Edit Amazon Route 53 Records](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-values.html) in the *Amazon Route 53 Developer Guide* .","SetIdentifier":"*Resource record sets that have a routing policy other than simple:* An identifier that differentiates among multiple resource record sets that have the same combination of name and type, such as multiple weighted resource record sets named acme.example.com that have a type of A. In a group of resource record sets that have the same name and type, the value of `SetIdentifier` must be unique for each resource record set.\\n\\nFor information about routing policies, see [Choosing a Routing Policy](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html) in the *Amazon Route 53 Developer Guide* .","TTL":"The resource record cache time to live (TTL), in seconds. Note the following:\\n\\n- If you\'re creating or updating an alias resource record set, omit `TTL` . Amazon Route 53 uses the value of `TTL` for the alias target.\\n- If you\'re associating this resource record set with a health check (if you\'re adding a `HealthCheckId` element), we recommend that you specify a `TTL` of 60 seconds or less so clients respond quickly to changes in health status.\\n- All of the resource record sets in a group of weighted resource record sets must have the same value for `TTL` .\\n- If a group of weighted resource record sets includes one or more weighted alias resource record sets for which the alias target is an ELB load balancer, we recommend that you specify a `TTL` of 60 seconds for all of the non-alias weighted resource record sets that have the same name and type. Values other than 60 seconds (the TTL for load balancers) will change the effect of the values that you specify for `Weight` .","Type":"The DNS record type. For information about different record types and how data is encoded for them, see [Supported DNS Resource Record Types](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html) in the *Amazon Route 53 Developer Guide* .\\n\\nValid values for basic resource record sets: `A` | `AAAA` | `CAA` | `CNAME` | `DS` | `MX` | `NAPTR` | `NS` | `PTR` | `SOA` | `SPF` | `SRV` | `TXT`\\n\\nValues for weighted, latency, geolocation, and failover resource record sets: `A` | `AAAA` | `CAA` | `CNAME` | `MX` | `NAPTR` | `PTR` | `SPF` | `SRV` | `TXT` . When creating a group of weighted, latency, geolocation, or failover resource record sets, specify the same value for all of the resource record sets in the group.\\n\\nValid values for multivalue answer resource record sets: `A` | `AAAA` | `MX` | `NAPTR` | `PTR` | `SPF` | `SRV` | `TXT`\\n\\n> SPF records were formerly used to verify the identity of the sender of email messages. However, we no longer recommend that you create resource record sets for which the value of `Type` is `SPF` . RFC 7208, *Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1* , has been updated to say, \\"...[I]ts existence and mechanism defined in [RFC4408] have led to some interoperability issues. Accordingly, its use is no longer appropriate for SPF version 1; implementations are not to use it.\\" In RFC 7208, see section 14.1, [The SPF DNS Record Type](https://docs.aws.amazon.com/http://tools.ietf.org/html/rfc7208#section-14.1) . \\n\\nValues for alias resource record sets:\\n\\n- *Amazon API Gateway custom regional APIs and edge-optimized APIs:* `A`\\n- *CloudFront distributions:* `A`\\n\\nIf IPv6 is enabled for the distribution, create two resource record sets to route traffic to your distribution, one with a value of `A` and one with a value of `AAAA` .\\n- *Amazon API Gateway environment that has a regionalized subdomain* : `A`\\n- *ELB load balancers:* `A` | `AAAA`\\n- *Amazon S3 buckets:* `A`\\n- *Amazon Virtual Private Cloud interface VPC endpoints* `A`\\n- *Another resource record set in this hosted zone:* Specify the type of the resource record set that you\'re creating the alias for. All values are supported except `NS` and `SOA` .\\n\\n> If you\'re creating an alias record that has the same name as the hosted zone (known as the zone apex), you can\'t route traffic to a record for which the value of `Type` is `CNAME` . This is because the alias record must have the same type as the record you\'re routing traffic to, and creating a CNAME record for the zone apex isn\'t supported even for an alias record.","Weight":"*Weighted resource record sets only:* Among resource record sets that have the same combination of DNS name and type, a value that determines the proportion of DNS queries that Amazon Route 53 responds to using the current resource record set. Route 53 calculates the sum of the weights for the resource record sets that have the same combination of DNS name and type. Route 53 then responds to queries based on the ratio of a resource\'s weight to the total. Note the following:\\n\\n- You must specify a value for the `Weight` element for every weighted resource record set.\\n- You can only specify one `ResourceRecord` per weighted resource record set.\\n- You can\'t create latency, failover, or geolocation resource record sets that have the same values for the `Name` and `Type` elements as weighted resource record sets.\\n- You can create a maximum of 100 weighted resource record sets that have the same values for the `Name` and `Type` elements.\\n- For weighted (but not weighted alias) resource record sets, if you set `Weight` to `0` for a resource record set, Route 53 never responds to queries with the applicable value for that resource record set. However, if you set `Weight` to `0` for all resource record sets that have the same combination of DNS name and type, traffic is routed to all resources with equal probability.\\n\\nThe effect of setting `Weight` to `0` is different when you associate health checks with weighted resource record sets. For more information, see [Options for Configuring Route 53 Active-Active and Active-Passive Failover](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-configuring-options.html) in the *Amazon Route 53 Developer Guide* ."}},"AWS::Route53RecoveryControl::Cluster":{"attributes":{"ClusterArn":"The Amazon Resource Name (ARN) of the cluster.","ClusterEndpoints":"An array of endpoints for the cluster. You specify one of these endpoints when you want to set or retrieve a routing control state in the cluster.","Ref":"`Ref` returns the `ClusterArn` object.","Status":"The deployment status of the cluster. Status can be one of the following: PENDING, DEPLOYED, PENDING_DELETION."},"description":"Creates a cluster in Amazon Route 53 Application Recovery Controller. A cluster is a set of redundant Regional endpoints that you can run Route 53 ARC API calls against to update or get the state of one or more routing controls.","properties":{"Name":"Name of the cluster. You can use any non-white space character in the name except the following: & > < \' (single quote) \\" (double quote) ; (semicolon).","Tags":"The value for a tag."}},"AWS::Route53RecoveryControl::Cluster.ClusterEndpoint":{"attributes":{},"description":"A cluster endpoint. You specify one of the five cluster endpoints, which consists of an endpoint URL and an AWS Region, when you want to get or update a routing control state in the cluster.\\n\\nFor more information, see [Code examples](https://docs.aws.amazon.com/r53recovery/latest/dg/service_code_examples.html) in the Amazon Route 53 Application Recovery Controller Developer Guide.","properties":{"Endpoint":"A cluster endpoint URL for one of the five redundant clusters that you specify to set or retrieve a routing control state.","Region":"The AWS Region for a cluster endpoint."}},"AWS::Route53RecoveryControl::ControlPanel":{"attributes":{"ControlPanelArn":"The Amazon Resource Name (ARN) of the control panel.","DefaultControlPanel":"The boolean flag that is set to true for the default control panel in the cluster.","Ref":"`Ref` returns the `ControlPanelArn` object.","RoutingControlCount":"The number of routing controls in the control panel.","Status":"The deployment status of control panel. Status can be one of the following: PENDING, DEPLOYED, PENDING_DELETION."},"description":"Creates a new control panel in Amazon Route 53 Application Recovery Controller. A control panel represents a group of routing controls that can be changed together in a single transaction. You can use a control panel to centrally view the operational status of applications across your organization, and trigger multi-app failovers in a single transaction, for example, to fail over from one AWS Region (cell) to another.","properties":{"ClusterArn":"The Amazon Resource Name (ARN) of the cluster for the control panel.","Name":"The name of the control panel. You can use any non-white space character in the name.","Tags":"The value for a tag."}},"AWS::Route53RecoveryControl::RoutingControl":{"attributes":{"Ref":"`Ref` returns the `RoutingControlArn` object.","RoutingControlArn":"The Amazon Resource Name (ARN) of the routing control.","Status":"The deployment status of the routing control. Status can be one of the following: PENDING, DEPLOYED, PENDING_DELETION."},"description":"Creates a routing control in Amazon Route 53 Application Recovery Controller. Routing control states are maintained on the highly reliable cluster data plane.\\n\\nTo get or update the state of the routing control, you must specify a cluster endpoint, which is an endpoint URL and an AWS Region. For more information, see [Code examples](https://docs.aws.amazon.com/r53recovery/latest/dg/service_code_examples.html) in the Amazon Route 53 Application Recovery Controller Developer Guide.","properties":{"ClusterArn":"The Amazon Resource Name (ARN) of the cluster that hosts the routing control.","ControlPanelArn":"The Amazon Resource Name (ARN) of the control panel that includes the routing control.","Name":"The name of the routing control. You can use any non-white space character in the name."}},"AWS::Route53RecoveryControl::SafetyRule":{"attributes":{"Ref":"`Ref` returns the `SafetyRuleArn` object.","SafetyRuleArn":"The Amazon Resource Name (ARN) of the safety rule.","Status":"The deployment status of the safety rule. Status can be one of the following: PENDING, DEPLOYED, PENDING_DELETION."},"description":"Creates a safety rule in a control panel in Amazon Route 53 Application Recovery Controller. Safety rules in Amazon Route 53 Application Recovery Controller let you add safeguards around changing routing control states, and enabling and disabling routing controls, to help prevent unwanted outcomes. Note that the name of a safety rule must be unique within a control panel.\\n\\nThere are two types of safety rules in Route 53 ARC: assertion rules and gating rules.\\n\\nAssertion rule: An assertion rule enforces that, when you change a routing control state, certain criteria are met. For example, the criteria might be that at least one routing control state is `On` after the transaction completes so that traffic continues to be directed to at least one cell for the application. This prevents a fail-open scenario.\\n\\nGating rule: A gating rule lets you configure a gating routing control as an overall on-off switch for a group of routing controls. Or, you can configure more complex gating scenarios, for example, by configuring multiple gating routing controls.\\n\\nFor more information, see [Safety rules](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.safety-rules.html) in the Amazon Route 53 Application Recovery Controller Developer Guide.","properties":{"AssertionRule":"An assertion rule enforces that, when you change a routing control state, that the criteria that you set in the rule configuration is met. Otherwise, the change to the routing control is not accepted. For example, the criteria might be that at least one routing control state is `On` after the transaction so that traffic continues to flow to at least one cell for the application. This ensures that you avoid a fail-open scenario.","ControlPanelArn":"The Amazon Resource Name (ARN) for the control panel.","GatingRule":"A gating rule verifies that a gating routing control or set of gating routing controls, evaluates as true, based on a rule configuration that you specify, which allows a set of routing control state changes to complete.\\n\\nFor example, if you specify one gating routing control and you set the `Type` in the rule configuration to `OR` , that indicates that you must set the gating routing control to `On` for the rule to evaluate as true; that is, for the gating control switch to be On. When you do that, then you can update the routing control states for the target routing controls that you specify in the gating rule.","Name":"The name of the assertion rule. The name must be unique within a control panel. You can use any non-white space character in the name except the following: & > < \' (single quote) \\" (double quote) ; (semicolon)","RuleConfig":"The criteria that you set for specific assertion controls (routing controls) that designate how many control states must be `ON` as the result of a transaction. For example, if you have three assertion controls, you might specify `ATLEAST 2` for your rule configuration. This means that at least two assertion controls must be `ON` , so that at least two AWS Regions have traffic flowing to them.","Tags":"The value for a tag."}},"AWS::Route53RecoveryControl::SafetyRule.AssertionRule":{"attributes":{},"description":"An assertion rule enforces that, when you change a routing control state, that the criteria that you set in the rule configuration is met. Otherwise, the change to the routing control is not accepted. For example, the criteria might be that at least one routing control state is `On` after the transaction so that traffic continues to flow to at least one cell for the application. This ensures that you avoid a fail-open scenario.","properties":{"AssertedControls":"The routing controls that are part of transactions that are evaluated to determine if a request to change a routing control state is allowed. For example, you might include three routing controls, one for each of three AWS Regions.","WaitPeriodMs":"An evaluation period, in milliseconds (ms), during which any request against the target routing controls will fail. This helps prevent flapping of state. The wait period is 5000 ms by default, but you can choose a custom value."}},"AWS::Route53RecoveryControl::SafetyRule.GatingRule":{"attributes":{},"description":"A gating rule verifies that a gating routing control or set of gating routing controls, evaluates as true, based on a rule configuration that you specify, which allows a set of routing control state changes to complete.\\n\\nFor example, if you specify one gating routing control and you set the `Type` in the rule configuration to `OR` , that indicates that you must set the gating routing control to `On` for the rule to evaluate as true; that is, for the gating control switch to be On. When you do that, then you can update the routing control states for the target routing controls that you specify in the gating rule.","properties":{"GatingControls":"An array of gating routing control Amazon Resource Names (ARNs). For a simple on-off switch, specify the ARN for one routing control. The gating routing controls are evaluated by the rule configuration that you specify to determine if the target routing control states can be changed.","TargetControls":"An array of target routing control Amazon Resource Names (ARNs) for which the states can only be updated if the rule configuration that you specify evaluates to true for the gating routing control. As a simple example, if you have a single gating control, it acts as an overall on-off switch for a set of target routing controls. You can use this to manually override automated failover, for example.","WaitPeriodMs":"An evaluation period, in milliseconds (ms), during which any request against the target routing controls will fail. This helps prevent flapping of state. The wait period is 5000 ms by default, but you can choose a custom value."}},"AWS::Route53RecoveryControl::SafetyRule.RuleConfig":{"attributes":{},"description":"The rule configuration for an assertion rule. That is, the criteria that you set for specific assertion controls (routing controls) that specify how many controls must be enabled after a transaction completes.","properties":{"Inverted":"Logical negation of the rule. If the rule would usually evaluate true, it\'s evaluated as false, and vice versa.","Threshold":"The value of N, when you specify an `ATLEAST` rule type. That is, `Threshold` is the number of controls that must be set when you specify an `ATLEAST` type.","Type":"A rule can be one of the following: `ATLEAST` , `AND` , or `OR` ."}},"AWS::Route53RecoveryReadiness::Cell":{"attributes":{"CellArn":"The ARN of the cell.","ParentReadinessScopes":"The readiness scope for the cell, which can be the Amazon Resource Name (ARN) of a cell or the ARN of a recovery group. Although this is a list, it can currently have only one element.","Ref":"`Ref` returns the `CellName` ."},"description":"Creates a cell in recovery group in Amazon Route 53 Application Recovery Controller. A cell in Route 53 ARC represents replicas or independent units of failover in your application. It groups within it all the AWS resources that are necessary for your application to run independently. Typically, you would have define one set of resources in a primary cell and another set in a standby cell in your recovery group.\\n\\nAfter you set up the cells for your application, you can create readiness checks in Route 53 ARC to continually audit readiness for AWS resource quotas, capacity, network routing policies, and other predefined rules.\\n\\nYou can set up notifications about changes that would affect your ability to fail over to a replica and recover. However, you should make decisions about whether to fail away from or to a replica based on your monitoring and health check systems. You should consider readiness checks as a complementary service to those systems.\\n\\nRoute 53 ARC Readiness supports us-east-1 and us-west-2 AWS Regions only.","properties":{"CellName":"The name of the cell to create.","Cells":"A list of cell Amazon Resource Names (ARNs) contained within this cell, for use in nested cells. For example, Availability Zones within specific AWS Regions .","Tags":"A collection of tags associated with a resource."}},"AWS::Route53RecoveryReadiness::ReadinessCheck":{"attributes":{"ReadinessCheckArn":"The Amazon Resource Name (ARN) of the readiness check.","Ref":"`Ref` returns the `ReadinessCheckName` ."},"description":"Creates a readiness check in Amazon Route 53 Application Recovery Controller. A readiness check continually monitors a resource set in your application, such as a set of Amazon Aurora instances, that Route 53 ARC is auditing recovery readiness for. The audits run once every minute on every resource that\'s associated with a readiness check.\\n\\nEvery resource type has a set of rules associated with it that Route 53 ARC uses to audit resources for readiness. For more information, see [Readiness rules descriptions](https://docs.aws.amazon.com/r53recovery/latest/dg/recovery-readiness.rules-resources.html) in the Amazon Route 53 Application Recovery Controller Developer Guide.\\n\\nRoute 53 ARC Readiness supports us-east-1 and us-west-2 AWS Regions only.","properties":{"ReadinessCheckName":"The name of the readiness check to create.","ResourceSetName":"The name of the resource set to check.","Tags":"A collection of tags associated with a resource."}},"AWS::Route53RecoveryReadiness::RecoveryGroup":{"attributes":{"RecoveryGroupArn":"The Amazon Resource Name (ARN) of the recovery group.","Ref":"`Ref` returns the `RecoveryGroupName` ."},"description":"Creates a recovery group in Amazon Route 53 Application Recovery Controller. A recovery group represents your application. It typically consists of two or more cells that are replicas of each other in terms of resources and functionality, so that you can fail over from one to the other, for example, from one Region to another. You create recovery groups so you can use readiness checks to audit resources in your application.\\n\\nFor more information, see [Readiness checks, resource sets, and readiness scopes](https://docs.aws.amazon.com/r53recovery/latest/dg/recovery-readiness.recovery-groups.readiness-scope.html) in the Amazon Route 53 Application Recovery Controller Developer Guide.\\n\\nRoute 53 ARC Readiness supports us-east-1 and us-west-2 AWS Regions only.","properties":{"Cells":"A list of the cell Amazon Resource Names (ARNs) in the recovery group.","RecoveryGroupName":"The name of the recovery group to create.","Tags":"A collection of tags associated with a resource."}},"AWS::Route53RecoveryReadiness::ResourceSet":{"attributes":{"Ref":"`Ref` returns the `ResourceSetName` object.","ResourceSetArn":"The Amazon Resource Name (ARN) of the resource set."},"description":"Creates a resource set in Amazon Route 53 Application Recovery Controller. A resource set is a set of resources of one type, such as Network Load Balancers, that span multiple cells. You can associate a resource set with a readiness check to have Route 53 ARC continually monitor the resources in the set for failover readiness.\\n\\nYou typically create a resource set and a readiness check for each supported type of AWS resource in your application.\\n\\nFor more information, see [Readiness checks, resource sets, and readiness scopes](https://docs.aws.amazon.com/r53recovery/latest/dg/recovery-readiness.recovery-groups.readiness-scope.html) in the Amazon Route 53 Application Recovery Controller Developer Guide.\\n\\nRoute 53 ARC Readiness supports us-east-1 and us-west-2 AWS Regions only.","properties":{"ResourceSetName":"The name of the resource set to create.","ResourceSetType":"The resource type of the resources in the resource set. Enter one of the following values for resource type:\\n\\nAWS::ApiGateway::Stage, AWS::ApiGatewayV2::Stage, AWS::AutoScaling::AutoScalingGroup, AWS::CloudWatch::Alarm, AWS::EC2::CustomerGateway, AWS::DynamoDB::Table, AWS::EC2::Volume, AWS::ElasticLoadBalancing::LoadBalancer, AWS::ElasticLoadBalancingV2::LoadBalancer, AWS::Lambda::Function, AWS::MSK::Cluster, AWS::RDS::DBCluster, AWS::Route53::HealthCheck, AWS::SQS::Queue, AWS::SNS::Topic, AWS::SNS::Subscription, AWS::EC2::VPC, AWS::EC2::VPNConnection, AWS::EC2::VPNGateway, AWS::Route53RecoveryReadiness::DNSTargetResource.\\n\\nNote that AWS::Route53RecoveryReadiness::DNSTargetResource is only used for this setting. It isn\'t an actual AWS CloudFormation resource type.","Resources":"A list of resource objects in the resource set.","Tags":"A tag to associate with the parameters for a resource set."}},"AWS::Route53RecoveryReadiness::ResourceSet.DNSTargetResource":{"attributes":{},"description":"A component for DNS/routing control readiness checks and architecture checks.","properties":{"DomainName":"The domain name that acts as an ingress point to a portion of the customer application.","HostedZoneArn":"The hosted zone Amazon Resource Name (ARN) that contains the DNS record with the provided name of the target resource.","RecordSetId":"The Amazon Route 53 record set ID that uniquely identifies a DNS record, given a name and a type.","RecordType":"The type of DNS record of the target resource.","TargetResource":"The target resource that the Route 53 record points to."}},"AWS::Route53RecoveryReadiness::ResourceSet.NLBResource":{"attributes":{},"description":"The Network Load Balancer resource that a DNS target resource points to.","properties":{"Arn":"The Network Load Balancer resource Amazon Resource Name (ARN)."}},"AWS::Route53RecoveryReadiness::ResourceSet.R53ResourceRecord":{"attributes":{},"description":"The Amazon Route 53 resource that a DNS target resource record points to.","properties":{"DomainName":"The DNS target domain name.","RecordSetId":"The Amazon Route 53 Resource Record Set ID."}},"AWS::Route53RecoveryReadiness::ResourceSet.Resource":{"attributes":{},"description":"The resource element of a resource set.","properties":{"ComponentId":"The component identifier of the resource, generated when DNS target resource is used.","DnsTargetResource":"A component for DNS/routing control readiness checks. This is a required setting when `ResourceSet` `ResourceSetType` is set to `AWS::Route53RecoveryReadiness::DNSTargetResource` . Do not set it for any other `ResourceSetType` setting.","ReadinessScopes":"The recovery group Amazon Resource Name (ARN) or the cell ARN that the readiness checks for this resource set are scoped to.","ResourceArn":"The Amazon Resource Name (ARN) of the AWS resource. This is a required setting for all `ResourceSet` `ResourceSetType` settings except `AWS::Route53RecoveryReadiness::DNSTargetResource` . Do not set this when `ResourceSetType` is set to `AWS::Route53RecoveryReadiness::DNSTargetResource` ."}},"AWS::Route53RecoveryReadiness::ResourceSet.TargetResource":{"attributes":{},"description":"The target resource that the Route 53 record points to.","properties":{"NLBResource":"The Network Load Balancer resource that a DNS target resource points to.","R53Resource":"The Route 53 resource that a DNS target resource record points to."}},"AWS::Route53Resolver::FirewallDomainList":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the firewall domain list.","CreationTime":"The date and time that the domain list was created, in Unix time format and Coordinated Universal Time (UTC).","CreatorRequestId":"A unique string defined by you to identify the request. This allows you to retry failed requests without the risk of running the operation twice. This can be any unique string, for example, a timestamp.","DomainCount":"The number of domain names that are specified in the domain list.","Id":"The ID of the domain list.","ManagedOwnerName":"The owner of the list, used only for lists that are not managed by you. For example, the managed domain list `AWSManagedDomainsMalwareDomainList` has the managed owner name `Route 53 Resolver DNS Firewall` .","ModificationTime":"The date and time that the domain list was last modified, in Unix time format and Coordinated Universal Time (UTC).","Ref":"`Ref` returns the `FirewallDomainList` object.","Status":"The status of the domain list.","StatusMessage":"Additional information about the status of the list, if available."},"description":"High-level information about a list of firewall domains for use in a [AWS::Route53Resolver::FirewallRule](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-firewallrulegroup-rule.html) . This is returned by [GetFirewallDomainList](https://docs.aws.amazon.com/Route53/latest/APIReference/API_route53resolver_GetFirewallDomainList.html) .\\n\\nTo retrieve the domains that are defined for this domain list, call [ListFirewallDomains](https://docs.aws.amazon.com/Route53/latest/APIReference/API_route53resolver_ListFirewallDomains.html) .","properties":{"DomainFileUrl":"The fully qualified URL or URI of the file stored in Amazon Simple Storage Service (Amazon S3) that contains the list of domains to import.\\n\\nThe file must be in an S3 bucket that\'s in the same Region as your DNS Firewall. The file must be a text file and must contain a single domain per line.","Domains":"A list of the domain lists that you have defined.","Name":"The name of the domain list.","Tags":"A list of the tag keys and values that you want to associate with the domain list."}},"AWS::Route53Resolver::FirewallRuleGroup":{"attributes":{"Arn":"The ARN (Amazon Resource Name) of the rule group.","CreationTime":"The date and time that the rule group was created, in Unix time format and Coordinated Universal Time (UTC).","CreatorRequestId":"A unique string defined by you to identify the request. This allows you to retry failed requests without the risk of running the operation twice. This can be any unique string, for example, a timestamp.","Id":"The ID of the rule group.","ModificationTime":"The date and time that the rule group was last modified, in Unix time format and Coordinated Universal Time (UTC).","OwnerId":"The AWS account ID for the account that created the rule group. When a rule group is shared with your account, this is the account that has shared the rule group with you.","Ref":"`Ref` returns the `FirewallRuleGroupId` .","RuleCount":"The number of rules in the rule group.","ShareStatus":"Whether the rule group is shared with other AWS accounts , or was shared with the current account by another AWS account . Sharing is configured through AWS Resource Access Manager ( AWS RAM ).","Status":"The status of the domain list.","StatusMessage":"Additional information about the status of the rule group, if available."},"description":"High-level information for a firewall rule group. A firewall rule group is a collection of rules that DNS Firewall uses to filter DNS network traffic for a VPC. To retrieve the rules for the rule group, call [ListFirewallRules](https://docs.aws.amazon.com/Route53/latest/APIReference/API_route53resolver_ListFirewallRules.html) .","properties":{"FirewallRules":"A list of the rules that you have defined.","Name":"The name of the rule group.","Tags":"A list of the tag keys and values that you want to associate with the rule group."}},"AWS::Route53Resolver::FirewallRuleGroup.FirewallRule":{"attributes":{},"description":"A single firewall rule in a rule group.","properties":{"Action":"The action that DNS Firewall should take on a DNS query when it matches one of the domains in the rule\'s domain list:\\n\\n- `ALLOW` - Permit the request to go through.\\n- `ALERT` - Permit the request to go through but send an alert to the logs.\\n- `BLOCK` - Disallow the request. If this is specified,then `BlockResponse` must also be specified.\\n\\nif `BlockResponse` is `OVERRIDE` , then all of the following `OVERRIDE` attributes must be specified:\\n\\n- `BlockOverrideDnsType`\\n- `BlockOverrideDomain`\\n- `BlockOverrideTtl`","BlockOverrideDnsType":"The DNS record\'s type. This determines the format of the record value that you provided in `BlockOverrideDomain` . Used for the rule action `BLOCK` with a `BlockResponse` setting of `OVERRIDE` .","BlockOverrideDomain":"The custom DNS record to send back in response to the query. Used for the rule action `BLOCK` with a `BlockResponse` setting of `OVERRIDE` .","BlockOverrideTtl":"The recommended amount of time, in seconds, for the DNS resolver or web browser to cache the provided override record. Used for the rule action `BLOCK` with a `BlockResponse` setting of `OVERRIDE` .","BlockResponse":"The way that you want DNS Firewall to block the request. Used for the rule action setting `BLOCK` .\\n\\n- `NODATA` - Respond indicating that the query was successful, but no response is available for it.\\n- `NXDOMAIN` - Respond indicating that the domain name that\'s in the query doesn\'t exist.\\n- `OVERRIDE` - Provide a custom override in the response. This option requires custom handling details in the rule\'s `BlockOverride*` settings.","FirewallDomainListId":"The ID of the domain list that\'s used in the rule.","Priority":"The priority of the rule in the rule group. This value must be unique within the rule group. DNS Firewall processes the rules in a rule group by order of priority, starting from the lowest setting."}},"AWS::Route53Resolver::FirewallRuleGroupAssociation":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the firewall rule group association.","CreationTime":"The date and time that the association was created, in Unix time format and Coordinated Universal Time (UTC).","CreatorRequestId":"A unique string defined by you to identify the request. This allows you to retry failed requests without the risk of running the operation twice. This can be any unique string, for example, a timestamp.","Id":"The identifier for the association.","ManagedOwnerName":"The owner of the association, used only for associations that are not managed by you. If you use AWS Firewall Manager to manage your firewallls from DNS Firewall, then this reports Firewall Manager as the managed owner.","ModificationTime":"The date and time that the association was last modified, in Unix time format and Coordinated Universal Time (UTC).","Ref":"`Ref` returns the `FirewallRuleGroupAssociation` ID.","Status":"The current status of the association.","StatusMessage":"Additional information about the status of the response, if available."},"description":"An association between a firewall rule group and a VPC, which enables DNS filtering for the VPC.","properties":{"FirewallRuleGroupId":"The unique identifier of the firewall rule group.","MutationProtection":"If enabled, this setting disallows modification or removal of the association, to help prevent against accidentally altering DNS firewall protections.","Name":"The name of the association.","Priority":"The setting that determines the processing order of the rule group among the rule groups that are associated with a single VPC. DNS Firewall filters VPC traffic starting from rule group with the lowest numeric priority setting.\\n\\nYou must specify a unique priority for each rule group that you associate with a single VPC. To make it easier to insert rule groups later, leave space between the numbers, for example, use 101, 200, and so on. You can change the priority setting for a rule group association after you create it.\\n\\nThe allowed values for `Priority` are between 100 and 9900 (excluding 100 and 9900).","Tags":"A list of the tag keys and values that you want to associate with the rule group.","VpcId":"The unique identifier of the VPC that is associated with the rule group."}},"AWS::Route53Resolver::ResolverConfig":{"attributes":{"AutodefinedReverse":"The status of whether or not the Route 53 Resolver will create autodefined rules for reverse DNS lookups. This is enabled by default.","Id":"ID for the Route 53 Resolver configuration.","OwnerId":"The owner account ID of the Amazon Virtual Private Cloud VPC.","Ref":"`Ref` returns the `ResolverConfiguration` ID."},"description":"A complex type that contains information about a Resolver configuration for a VPC.","properties":{"AutodefinedReverseFlag":"Represents the desired status of `AutodefinedReverse` . The only supported value on creation is `DISABLE` . Deletion of this resource will return `AutodefinedReverse` to its default value of `ENABLED` .","ResourceId":"The ID of the Amazon Virtual Private Cloud VPC that you\'re configuring Resolver for."}},"AWS::Route53Resolver::ResolverDNSSECConfig":{"attributes":{"Id":"The primary identifier of this `ResolverDNSSECConfig` resource. For example: `rdsc-689d45d1ae623bf3` .","OwnerId":"The AWS account of the owner. For example: `111122223333` .","Ref":"`Ref` returns the ID. For example:\\n\\n`{ \\"Ref\\": \\"rdsc-689d45d1ae623bf3\\" }`","ValidationStatus":"The current status of this `ResolverDNSSECConfig` resource. For example: `Enabled` ."},"description":"The `AWS::Route53Resolver::ResolverDNSSECConfig` resource is a complex type that contains information about a configuration for DNSSEC validation.","properties":{"ResourceId":"The ID of the virtual private cloud (VPC) that you\'re configuring the DNSSEC validation status for."}},"AWS::Route53Resolver::ResolverEndpoint":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the resolver endpoint, such as `arn:aws:route53resolver:us-east-1:123456789012:resolver-endpoint/resolver-endpoint-a1bzhi` .","Direction":"Indicates whether the resolver endpoint allows inbound or outbound DNS queries.","HostVPCId":"The ID of the VPC that you want to create the resolver endpoint in.","IpAddressCount":"The number of IP addresses that the resolver endpoint can use for DNS queries.","Name":"The name that you assigned to the resolver endpoint when you created the endpoint.","OutpostArn":"","PreferredInstanceType":"","Ref":"`Ref` returns the `ResolverEndpoint` object.","ResolverEndpointId":"The ID of the resolver endpoint.","ResolverEndpointType":"For the endpoint type you can choose either IPv4, IPv6. or dual-stack. A dual-stack endpoint means that it will resolve via both IPv4 and IPv6. If you choose either IPv4 or IPv6, this endpoint type is applied to all IP addresses."},"description":"Creates a Resolver endpoint. There are two types of Resolver endpoints, inbound and outbound:\\n\\n- An *inbound Resolver endpoint* forwards DNS queries to the DNS service for a VPC from your network.\\n- An *outbound Resolver endpoint* forwards DNS queries from the DNS service for a VPC to your network.\\n\\n> - You cannot update `ResolverEndpointType` and `IpAddresses` in the same request.\\n> - When you update a dual-stack IP address, you must update both IP addresses. You can’t update only an IPv4 or IPv6 and keep an existing IP address.","properties":{"Direction":"Indicates whether the Resolver endpoint allows inbound or outbound DNS queries:\\n\\n- `INBOUND` : allows DNS queries to your VPC from your network\\n- `OUTBOUND` : allows DNS queries from your VPC to your network","IpAddresses":"The subnets and IP addresses in your VPC that DNS queries originate from (for outbound endpoints) or that you forward DNS queries to (for inbound endpoints). The subnet ID uniquely identifies a VPC.\\n\\n> Even though the minimum is 1, Route 53 requires that you create at least two.","Name":"A friendly name that lets you easily find a configuration in the Resolver dashboard in the Route 53 console.","OutpostArn":"","PreferredInstanceType":"","ResolverEndpointType":"The Resolver endpoint IP address type.","SecurityGroupIds":"The ID of one or more security groups that control access to this VPC. The security group must include one or more inbound rules (for inbound endpoints) or outbound rules (for outbound endpoints). Inbound and outbound rules must allow TCP and UDP access. For inbound access, open port 53. For outbound access, open the port that you\'re using for DNS queries on your network.","Tags":"Route 53 Resolver doesn\'t support updating tags through CloudFormation."}},"AWS::Route53Resolver::ResolverEndpoint.IpAddressRequest":{"attributes":{},"description":"In a [CreateResolverEndpoint](https://docs.aws.amazon.com/Route53/latest/APIReference/API_route53resolver_CreateResolverEndpoint.html) request, the IP address that DNS queries originate from (for outbound endpoints) or that you forward DNS queries to (for inbound endpoints). `IpAddressRequest` also includes the ID of the subnet that contains the IP address.","properties":{"Ip":"The IPv4 address that you want to use for DNS queries.","Ipv6":"The IPv6 address that you want to use for DNS queries.","SubnetId":"The ID of the subnet that contains the IP address."}},"AWS::Route53Resolver::ResolverQueryLoggingConfig":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the query logging configuration.","AssociationCount":"The number of VPCs that are associated with the query logging configuration.","CreationTime":"The date and time that the query logging configuration was created, in Unix time format and Coordinated Universal Time (UTC).","CreatorRequestId":"A unique string that identifies the request that created the query logging configuration. The `CreatorRequestId` allows failed requests to be retried without the risk of running the operation twice.","Id":"The ID for the query logging configuration.","OwnerId":"The AWS account ID for the account that created the query logging configuration.","Ref":"`Ref` returns the ID of the resource that contains settings for one query logging configuration.\\n\\nFor example: `{ \\"Ref\\": \\"rqlc-1111222233334444\\" }`","ShareStatus":"An indication of whether the query logging configuration is shared with other AWS account s, or was shared with the current account by another AWS account . Sharing is configured through AWS Resource Access Manager ( AWS RAM ).","Status":"The status of the specified query logging configuration. Valid values include the following:\\n\\n- `CREATING` : Resolver is creating the query logging configuration.\\n- `CREATED` : The query logging configuration was successfully created. Resolver is logging queries that originate in the specified VPC.\\n- `DELETING` : Resolver is deleting this query logging configuration.\\n- `FAILED` : Resolver can\'t deliver logs to the location that is specified in the query logging configuration. Here are two common causes:\\n\\n- The specified destination (for example, an Amazon S3 bucket) was deleted.\\n- Permissions don\'t allow sending logs to the destination."},"description":"The AWS::Route53Resolver::ResolverQueryLoggingConfig resource is a complex type that contains settings for one query logging configuration.","properties":{"DestinationArn":"The ARN of the resource that you want Resolver to send query logs: an Amazon S3 bucket, a CloudWatch Logs log group, or a Kinesis Data Firehose delivery stream.","Name":"The name of the query logging configuration."}},"AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation":{"attributes":{"CreationTime":"The date and time that the VPC was associated with the query logging configuration, in Unix time format and Coordinated Universal Time (UTC).","Error":"If the value of `Status` is `FAILED` , the value of `Error` indicates the cause:\\n\\n- `DESTINATION_NOT_FOUND` : The specified destination (for example, an Amazon S3 bucket) was deleted.\\n- `ACCESS_DENIED` : Permissions don\'t allow sending logs to the destination.\\n\\nIf the value of `Status` is a value other than `FAILED` , `Error` is null.","ErrorMessage":"Contains additional information about the error. If the value or `Error` is null, the value of `ErrorMessage` is also null.","Id":"The ID of the query logging association.","Ref":"`Ref` returns the ID of the configuration for DNS query logging.\\n\\nFor example: `{ \\"Ref\\": \\"rqlca-1111222233334444\\" }`","Status":"The status of the specified query logging association. Valid values include the following:\\n\\n- `CREATING` : Resolver is creating an association between an Amazon Virtual Private Cloud (Amazon VPC) and a query logging configuration.\\n- `CREATED` : The association between an Amazon VPC and a query logging configuration was successfully created. Resolver is logging queries that originate in the specified VPC.\\n- `DELETING` : Resolver is deleting this query logging association.\\n- `FAILED` : Resolver either couldn\'t create or couldn\'t delete the query logging association."},"description":"The AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation resource is a configuration for DNS query logging. After you create a query logging configuration, Amazon Route 53 begins to publish log data to an Amazon CloudWatch Logs log group.","properties":{"ResolverQueryLogConfigId":"The ID of the query logging configuration that a VPC is associated with.","ResourceId":"The ID of the Amazon VPC that is associated with the query logging configuration."}},"AWS::Route53Resolver::ResolverRule":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the resolver rule, such as `arn:aws:route53resolver:us-east-1:123456789012:resolver-rule/resolver-rule-a1bzhi` .","DomainName":"DNS queries for this domain name are forwarded to the IP addresses that are specified in TargetIps. If a query matches multiple resolver rules (example.com and www.example.com), the query is routed using the resolver rule that contains the most specific domain name (www.example.com).","Name":"A friendly name that lets you easily find a rule in the Resolver dashboard in the Route 53 console.","Ref":"`Ref` returns the `ResolverRule` object, which contains detailed information about the rule.","ResolverEndpointId":"The ID of the outbound endpoint that the rule is associated with, such as `rslvr-out-fdc049932dexample` .","ResolverRuleId":"When the value of `RuleType` is `FORWARD` , the ID that Resolver assigned to the resolver rule when you created it, such as `rslvr-rr-5328a0899aexample` . This value isn\'t applicable when `RuleType` is `SYSTEM` .","TargetIps":"When the value of `RuleType` is `FORWARD` , the IP addresses that the outbound endpoint forwards DNS queries to, typically the IP addresses for DNS resolvers on your network. This value isn\'t applicable when `RuleType` is `SYSTEM` ."},"description":"For DNS queries that originate in your VPCs, specifies which Resolver endpoint the queries pass through, one domain name that you want to forward to your network, and the IP addresses of the DNS resolvers in your network.","properties":{"DomainName":"DNS queries for this domain name are forwarded to the IP addresses that are specified in `TargetIps` . If a query matches multiple Resolver rules (example.com and www.example.com), the query is routed using the Resolver rule that contains the most specific domain name (www.example.com).","Name":"The name for the Resolver rule, which you specified when you created the Resolver rule.","ResolverEndpointId":"The ID of the endpoint that the rule is associated with.","RuleType":"When you want to forward DNS queries for specified domain name to resolvers on your network, specify `FORWARD` .\\n\\nWhen you have a forwarding rule to forward DNS queries for a domain to your network and you want Resolver to process queries for a subdomain of that domain, specify `SYSTEM` .\\n\\nFor example, to forward DNS queries for example.com to resolvers on your network, you create a rule and specify `FORWARD` for `RuleType` . To then have Resolver process queries for apex.example.com, you create a rule and specify `SYSTEM` for `RuleType` .\\n\\nCurrently, only Resolver can create rules that have a value of `RECURSIVE` for `RuleType` .","Tags":"Tags help organize and categorize your Resolver rules. Each tag consists of a key and an optional value, both of which you define.","TargetIps":"An array that contains the IP addresses and ports that an outbound endpoint forwards DNS queries to. Typically, these are the IP addresses of DNS resolvers on your network."}},"AWS::Route53Resolver::ResolverRule.TargetAddress":{"attributes":{},"description":"In a [CreateResolverRule](https://docs.aws.amazon.com/Route53/latest/APIReference/API_route53resolver_CreateResolverRule.html) request, an array of the IPs that you want to forward DNS queries to.","properties":{"Ip":"One IPv4 address that you want to forward DNS queries to.","Ipv6":"One IPv6 address that you want to forward DNS queries to.","Port":"The port at `Ip` that you want to forward DNS queries to."}},"AWS::Route53Resolver::ResolverRuleAssociation":{"attributes":{"Name":"The name of an association between a resolver rule and a VPC, such as `test.example.com in beta VPC` .","Ref":"`Ref` returns the `ResolverRuleAssociationId` .","ResolverRuleAssociationId":"The ID of the resolver rule association that you want to get information about, such as `rslvr-rrassoc-97242eaf88example` .","ResolverRuleId":"The ID of the resolver rule that you associated with the VPC that is specified by `VPCId` , such as `rslvr-rr-5328a0899example` .","VPCId":"The ID of the VPC that you associated the resolver rule with, such as `vpc-03cf94c75cexample` ."},"description":"In the response to an [AssociateResolverRule](https://docs.aws.amazon.com/Route53/latest/APIReference/API_route53resolver_AssociateResolverRule.html) , [DisassociateResolverRule](https://docs.aws.amazon.com/Route53/latest/APIReference/API_route53resolver_DisassociateResolverRule.html) , or [ListResolverRuleAssociations](https://docs.aws.amazon.com/Route53/latest/APIReference/API_route53resolver_ListResolverRuleAssociations.html) request, provides information about an association between a resolver rule and a VPC. The association determines which DNS queries that originate in the VPC are forwarded to your network.","properties":{"Name":"The name of an association between a Resolver rule and a VPC.","ResolverRuleId":"The ID of the Resolver rule that you associated with the VPC that is specified by `VPCId` .","VPCId":"The ID of the VPC that you associated the Resolver rule with."}},"AWS::S3::AccessPoint":{"attributes":{"Alias":"The alias for this access point.","Arn":"This property contains the details of the ARN for the access point.","Name":"The name of this access point.","NetworkOrigin":"Indicates whether this access point allows access from the internet. If `VpcConfiguration` is specified for this access point, then `NetworkOrigin` is `VPC` , and the access point doesn\'t allow access from the internet. Otherwise, `NetworkOrigin` is `Internet` , and the access point allows access from the internet, subject to the access point and bucket access policies.\\n\\n*Allowed values* : `VPC` | `Internet`","Ref":"`Ref` returns the access point name."},"description":"The AWS::S3::AccessPoint resource is an Amazon S3 resource type that you can use to access buckets.","properties":{"Bucket":"The name of the bucket associated with this access point.","BucketAccountId":"The AWS account ID associated with the S3 bucket associated with this access point.","Name":"The name of this access point. If you don\'t specify a name, AWS CloudFormation generates a unique ID and uses that ID for the access point name.","Policy":"The access point policy associated with this access point.","PublicAccessBlockConfiguration":"The PublicAccessBlock configuration that you want to apply to this Amazon S3 bucket. You can enable the configuration options in any combination. For more information about when Amazon S3 considers a bucket or object public, see [The Meaning of \\"Public\\"](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status) in the *Amazon S3 User Guide* .","VpcConfiguration":"The Virtual Private Cloud (VPC) configuration for this access point, if one exists."}},"AWS::S3::AccessPoint.PublicAccessBlockConfiguration":{"attributes":{},"description":"The PublicAccessBlock configuration that you want to apply to this Amazon S3 bucket. You can enable the configuration options in any combination. For more information about when Amazon S3 considers a bucket or object public, see [The Meaning of \\"Public\\"](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status) in the *Amazon S3 User Guide* .","properties":{"BlockPublicAcls":"Specifies whether Amazon S3 should block public access control lists (ACLs) for this bucket and objects in this bucket. Setting this element to `TRUE` causes the following behavior:\\n\\n- PUT Bucket ACL and PUT Object ACL calls fail if the specified ACL is public.\\n- PUT Object calls fail if the request includes a public ACL.\\n- PUT Bucket calls fail if the request includes a public ACL.\\n\\nEnabling this setting doesn\'t affect existing policies or ACLs.","BlockPublicPolicy":"Specifies whether Amazon S3 should block public bucket policies for this bucket. Setting this element to `TRUE` causes Amazon S3 to reject calls to PUT Bucket policy if the specified bucket policy allows public access.\\n\\nEnabling this setting doesn\'t affect existing bucket policies.","IgnorePublicAcls":"Specifies whether Amazon S3 should ignore public ACLs for this bucket and objects in this bucket. Setting this element to `TRUE` causes Amazon S3 to ignore all public ACLs on this bucket and objects in this bucket.\\n\\nEnabling this setting doesn\'t affect the persistence of any existing ACLs and doesn\'t prevent new public ACLs from being set.","RestrictPublicBuckets":"Specifies whether Amazon S3 should restrict public bucket policies for this bucket. Setting this element to `TRUE` restricts access to this bucket to only AWS service principals and authorized users within this account if the bucket has a public policy.\\n\\nEnabling this setting doesn\'t affect previously stored bucket policies, except that public and cross-account access within any public bucket policy, including non-public delegation to specific accounts, is blocked."}},"AWS::S3::AccessPoint.VpcConfiguration":{"attributes":{},"description":"The Virtual Private Cloud (VPC) configuration for this access point.","properties":{"VpcId":"If this field is specified, the access point will only allow connections from the specified VPC ID."}},"AWS::S3::Bucket":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the specified bucket.\\n\\nExample: `arn:aws:s3:::DOC-EXAMPLE-BUCKET`","DomainName":"Returns the IPv4 DNS name of the specified bucket.\\n\\nExample: `DOC-EXAMPLE-BUCKET.s3.amazonaws.com`","DualStackDomainName":"Returns the IPv6 DNS name of the specified bucket.\\n\\nExample: `DOC-EXAMPLE-BUCKET.s3.dualstack.us-east-2.amazonaws.com`\\n\\nFor more information about dual-stack endpoints, see [Using Amazon S3 Dual-Stack Endpoints](https://docs.aws.amazon.com/AmazonS3/latest/dev/dual-stack-endpoints.html) .","Ref":"`Ref` returns the bucket name.\\n\\nExample: ``","RegionalDomainName":"Returns the regional domain name of the specified bucket.\\n\\nExample: `DOC-EXAMPLE-BUCKET.s3.us-east-2.amazonaws.com`","WebsiteURL":"Returns the Amazon S3 website endpoint for the specified bucket.\\n\\nExample (IPv4): `http://DOC-EXAMPLE-BUCKET.s3-website.us-east-2.amazonaws.com`\\n\\nExample (IPv6): `http://DOC-EXAMPLE-BUCKET.s3.dualstack.us-east-2.amazonaws.com`"},"description":"The `AWS::S3::Bucket` resource creates an Amazon S3 bucket in the same AWS Region where you create the AWS CloudFormation stack.\\n\\nTo control how AWS CloudFormation handles the bucket when the stack is deleted, you can set a deletion policy for your bucket. You can choose to *retain* the bucket or to *delete* the bucket. For more information, see [DeletionPolicy Attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) .\\n\\n> You can only delete empty buckets. Deletion fails for buckets that have contents.","properties":{"AccelerateConfiguration":"Configures the transfer acceleration state for an Amazon S3 bucket. For more information, see [Amazon S3 Transfer Acceleration](https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html) in the *Amazon S3 User Guide* .","AccessControl":"A canned access control list (ACL) that grants predefined permissions to the bucket. For more information about canned ACLs, see [Canned ACL](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl) in the *Amazon S3 User Guide* .\\n\\nBe aware that the syntax for this property differs from the information provided in the *Amazon S3 User Guide* . The AccessControl property is case-sensitive and must be one of the following values: Private, PublicRead, PublicReadWrite, AuthenticatedRead, LogDeliveryWrite, BucketOwnerRead, BucketOwnerFullControl, or AwsExecRead.","AnalyticsConfigurations":"Specifies the configuration and any analyses for the analytics filter of an Amazon S3 bucket.","BucketEncryption":"Specifies default encryption for a bucket using server-side encryption with Amazon S3-managed keys (SSE-S3), AWS KMS-managed keys (SSE-KMS), or dual-layer server-side encryption with KMS-managed keys (DSSE-KMS). For information about the Amazon S3 default encryption feature, see [Amazon S3 Default Encryption for S3 Buckets](https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html) in the *Amazon S3 User Guide* .","BucketName":"A name for the bucket. If you don\'t specify a name, AWS CloudFormation generates a unique ID and uses that ID for the bucket name. The bucket name must contain only lowercase letters, numbers, periods (.), and dashes (-) and must follow [Amazon S3 bucket restrictions and limitations](https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html) . For more information, see [Rules for naming Amazon S3 buckets](https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html#bucketnamingrules) in the *Amazon S3 User Guide* .\\n\\n> If you specify a name, you can\'t perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you need to replace the resource, specify a new name.","CorsConfiguration":"Describes the cross-origin access configuration for objects in an Amazon S3 bucket. For more information, see [Enabling Cross-Origin Resource Sharing](https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html) in the *Amazon S3 User Guide* .","IntelligentTieringConfigurations":"Defines how Amazon S3 handles Intelligent-Tiering storage.","InventoryConfigurations":"Specifies the inventory configuration for an Amazon S3 bucket. For more information, see [GET Bucket inventory](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETInventoryConfig.html) in the *Amazon S3 API Reference* .","LifecycleConfiguration":"Specifies the lifecycle configuration for objects in an Amazon S3 bucket. For more information, see [Object Lifecycle Management](https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html) in the *Amazon S3 User Guide* .","LoggingConfiguration":"Settings that define where logs are stored.","MetricsConfigurations":"Specifies a metrics configuration for the CloudWatch request metrics (specified by the metrics configuration ID) from an Amazon S3 bucket. If you\'re updating an existing metrics configuration, note that this is a full replacement of the existing metrics configuration. If you don\'t include the elements you want to keep, they are erased. For more information, see [PutBucketMetricsConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTMetricConfiguration.html) .","NotificationConfiguration":"Configuration that defines how Amazon S3 handles bucket notifications.","ObjectLockConfiguration":"Places an Object Lock configuration on the specified bucket. The rule specified in the Object Lock configuration will be applied by default to every new object placed in the specified bucket. For more information, see [Locking Objects](https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html) .\\n\\n> - The `DefaultRetention` settings require both a mode and a period.\\n> - The `DefaultRetention` period can be either `Days` or `Years` but you must select one. You cannot specify `Days` and `Years` at the same time.\\n> - You can only enable Object Lock for new buckets. If you want to turn on Object Lock for an existing bucket, contact AWS Support.","ObjectLockEnabled":"Indicates whether this bucket has an Object Lock configuration enabled. Enable `ObjectLockEnabled` when you apply `ObjectLockConfiguration` to a bucket.","OwnershipControls":"Configuration that defines how Amazon S3 handles Object Ownership rules.","PublicAccessBlockConfiguration":"Configuration that defines how Amazon S3 handles public access.","ReplicationConfiguration":"Configuration for replicating objects in an S3 bucket. To enable replication, you must also enable versioning by using the `VersioningConfiguration` property.\\n\\nAmazon S3 can store replicated objects in a single destination bucket or multiple destination buckets. The destination bucket or buckets must already exist.","Tags":"An arbitrary set of tags (key-value pairs) for this S3 bucket.","VersioningConfiguration":"Enables multiple versions of all objects in this bucket. You might enable versioning to prevent objects from being deleted or overwritten by mistake or to archive objects so that you can retrieve previous versions of them.","WebsiteConfiguration":"Information used to configure the bucket as a static website. For more information, see [Hosting Websites on Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html) ."}},"AWS::S3::Bucket.AbortIncompleteMultipartUpload":{"attributes":{},"description":"Specifies the days since the initiation of an incomplete multipart upload that Amazon S3 will wait before permanently removing all parts of the upload. For more information, see [Stopping Incomplete Multipart Uploads Using a Bucket Lifecycle Policy](https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config) in the *Amazon S3 User Guide* .","properties":{"DaysAfterInitiation":"Specifies the number of days after which Amazon S3 stops an incomplete multipart upload."}},"AWS::S3::Bucket.AccelerateConfiguration":{"attributes":{},"description":"Configures the transfer acceleration state for an Amazon S3 bucket. For more information, see [Amazon S3 Transfer Acceleration](https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html) in the *Amazon S3 User Guide* .","properties":{"AccelerationStatus":"Specifies the transfer acceleration status of the bucket."}},"AWS::S3::Bucket.AccessControlTranslation":{"attributes":{},"description":"Specify this only in a cross-account scenario (where source and destination bucket owners are not the same), and you want to change replica ownership to the AWS account that owns the destination bucket. If this is not specified in the replication configuration, the replicas are owned by same AWS account that owns the source object.","properties":{"Owner":"Specifies the replica ownership. For default and valid values, see [PUT bucket replication](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTreplication.html) in the *Amazon S3 API Reference* ."}},"AWS::S3::Bucket.AnalyticsConfiguration":{"attributes":{},"description":"Specifies the configuration and any analyses for the analytics filter of an Amazon S3 bucket.","properties":{"Id":"The ID that identifies the analytics configuration.","Prefix":"The prefix that an object must have to be included in the analytics results.","StorageClassAnalysis":"Contains data related to access patterns to be collected and made available to analyze the tradeoffs between different storage classes.","TagFilters":"The tags to use when evaluating an analytics filter.\\n\\nThe analytics only includes objects that meet the filter\'s criteria. If no filter is specified, all of the contents of the bucket are included in the analysis."}},"AWS::S3::Bucket.BucketEncryption":{"attributes":{},"description":"Specifies default encryption for a bucket using server-side encryption with Amazon S3-managed keys (SSE-S3), AWS KMS-managed keys (SSE-KMS), or dual-layer server-side encryption with KMS-managed keys (DSSE-KMS). For information about the Amazon S3 default encryption feature, see [Amazon S3 Default Encryption for S3 Buckets](https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html) in the *Amazon S3 User Guide* .","properties":{"ServerSideEncryptionConfiguration":"Specifies the default server-side-encryption configuration."}},"AWS::S3::Bucket.CorsConfiguration":{"attributes":{},"description":"Describes the cross-origin access configuration for objects in an Amazon S3 bucket. For more information, see [Enabling Cross-Origin Resource Sharing](https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html) in the *Amazon S3 User Guide* .","properties":{"CorsRules":"A set of origins and methods (cross-origin access that you want to allow). You can add up to 100 rules to the configuration."}},"AWS::S3::Bucket.CorsRule":{"attributes":{},"description":"Specifies a cross-origin access rule for an Amazon S3 bucket.","properties":{"AllowedHeaders":"Headers that are specified in the `Access-Control-Request-Headers` header. These headers are allowed in a preflight OPTIONS request. In response to any preflight OPTIONS request, Amazon S3 returns any requested headers that are allowed.","AllowedMethods":"An HTTP method that you allow the origin to run.\\n\\n*Allowed values* : `GET` | `PUT` | `HEAD` | `POST` | `DELETE`","AllowedOrigins":"One or more origins you want customers to be able to access the bucket from.","ExposedHeaders":"One or more headers in the response that you want customers to be able to access from their applications (for example, from a JavaScript `XMLHttpRequest` object).","Id":"A unique identifier for this rule. The value must be no more than 255 characters.","MaxAge":"The time in seconds that your browser is to cache the preflight response for the specified resource."}},"AWS::S3::Bucket.DataExport":{"attributes":{},"description":"Specifies how data related to the storage class analysis for an Amazon S3 bucket should be exported.","properties":{"Destination":"The place to store the data for an analysis.","OutputSchemaVersion":"The version of the output schema to use when exporting data. Must be `V_1` ."}},"AWS::S3::Bucket.DefaultRetention":{"attributes":{},"description":"The container element for specifying the default Object Lock retention settings for new objects placed in the specified bucket.\\n\\n> - The `DefaultRetention` settings require both a mode and a period.\\n> - The `DefaultRetention` period can be either `Days` or `Years` but you must select one. You cannot specify `Days` and `Years` at the same time.","properties":{"Days":"The number of days that you want to specify for the default retention period. If Object Lock is turned on, you must specify `Mode` and specify either `Days` or `Years` .","Mode":"The default Object Lock retention mode you want to apply to new objects placed in the specified bucket. If Object Lock is turned on, you must specify `Mode` and specify either `Days` or `Years` .","Years":"The number of years that you want to specify for the default retention period. If Object Lock is turned on, you must specify `Mode` and specify either `Days` or `Years` ."}},"AWS::S3::Bucket.DeleteMarkerReplication":{"attributes":{},"description":"Specifies whether Amazon S3 replicates delete markers. If you specify a `Filter` in your replication configuration, you must also include a `DeleteMarkerReplication` element. If your `Filter` includes a `Tag` element, the `DeleteMarkerReplication` `Status` must be set to Disabled, because Amazon S3 does not support replicating delete markers for tag-based rules. For an example configuration, see [Basic Rule Configuration](https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html#replication-config-min-rule-config) .\\n\\nFor more information about delete marker replication, see [Basic Rule Configuration](https://docs.aws.amazon.com/AmazonS3/latest/dev/delete-marker-replication.html) .\\n\\n> If you are using an earlier version of the replication configuration, Amazon S3 handles replication of delete markers differently. For more information, see [Backward Compatibility](https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html#replication-backward-compat-considerations) .","properties":{"Status":"Indicates whether to replicate delete markers. Disabled by default."}},"AWS::S3::Bucket.Destination":{"attributes":{},"description":"Specifies information about where to publish analysis or configuration results for an Amazon S3 bucket.","properties":{"BucketAccountId":"The account ID that owns the destination S3 bucket. If no account ID is provided, the owner is not validated before exporting data.\\n\\n> Although this value is optional, we strongly recommend that you set it to help prevent problems if the destination bucket ownership changes.","BucketArn":"The Amazon Resource Name (ARN) of the bucket to which data is exported.","Format":"Specifies the file format used when exporting data to Amazon S3.","Prefix":"The prefix to use when exporting data. The prefix is prepended to all results."}},"AWS::S3::Bucket.EncryptionConfiguration":{"attributes":{},"description":"Specifies encryption-related information for an Amazon S3 bucket that is a destination for replicated objects.","properties":{"ReplicaKmsKeyID":"Specifies the ID (Key ARN or Alias ARN) of the customer managed AWS KMS key stored in AWS Key Management Service (KMS) for the destination bucket. Amazon S3 uses this key to encrypt replica objects. Amazon S3 only supports symmetric encryption KMS keys. For more information, see [Asymmetric keys in AWS KMS](https://docs.aws.amazon.com//kms/latest/developerguide/symmetric-asymmetric.html) in the *AWS Key Management Service Developer Guide* ."}},"AWS::S3::Bucket.EventBridgeConfiguration":{"attributes":{},"description":"Amazon S3 can send events to Amazon EventBridge whenever certain events happen in your bucket, see [Using EventBridge](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventBridge.html) in the *Amazon S3 User Guide* .\\n\\nUnlike other destinations, delivery of events to EventBridge can be either enabled or disabled for a bucket. If enabled, all events will be sent to EventBridge and you can use EventBridge rules to route events to additional targets. For more information, see [What Is Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) in the *Amazon EventBridge User Guide*","properties":{"EventBridgeEnabled":"Enables delivery of events to Amazon EventBridge."}},"AWS::S3::Bucket.FilterRule":{"attributes":{},"description":"Specifies the Amazon S3 object key name to filter on and whether to filter on the suffix or prefix of the key name.","properties":{"Name":"The object key name prefix or suffix identifying one or more objects to which the filtering rule applies. The maximum length is 1,024 characters. Overlapping prefixes and suffixes are not supported. For more information, see [Configuring Event Notifications](https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html) in the *Amazon S3 User Guide* .","Value":"The value that the filter searches for in object key names."}},"AWS::S3::Bucket.IntelligentTieringConfiguration":{"attributes":{},"description":"Specifies the S3 Intelligent-Tiering configuration for an Amazon S3 bucket.\\n\\nFor information about the S3 Intelligent-Tiering storage class, see [Storage class for automatically optimizing frequently and infrequently accessed objects](https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access) .","properties":{"Id":"The ID used to identify the S3 Intelligent-Tiering configuration.","Prefix":"An object key name prefix that identifies the subset of objects to which the rule applies.","Status":"Specifies the status of the configuration.","TagFilters":"A container for a key-value pair.","Tierings":"Specifies a list of S3 Intelligent-Tiering storage class tiers in the configuration. At least one tier must be defined in the list. At most, you can specify two tiers in the list, one for each available AccessTier: `ARCHIVE_ACCESS` and `DEEP_ARCHIVE_ACCESS` .\\n\\n> You only need Intelligent Tiering Configuration enabled on a bucket if you want to automatically move objects stored in the Intelligent-Tiering storage class to Archive Access or Deep Archive Access tiers."}},"AWS::S3::Bucket.InventoryConfiguration":{"attributes":{},"description":"Specifies the inventory configuration for an Amazon S3 bucket. For more information, see [GET Bucket inventory](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETInventoryConfig.html) in the *Amazon S3 API Reference* .","properties":{"Destination":"Contains information about where to publish the inventory results.","Enabled":"Specifies whether the inventory is enabled or disabled. If set to `True` , an inventory list is generated. If set to `False` , no inventory list is generated.","Id":"The ID used to identify the inventory configuration.","IncludedObjectVersions":"Object versions to include in the inventory list. If set to `All` , the list includes all the object versions, which adds the version-related fields `VersionId` , `IsLatest` , and `DeleteMarker` to the list. If set to `Current` , the list does not contain these version-related fields.","OptionalFields":"Contains the optional fields that are included in the inventory results.\\n\\n*Valid values* : `Size | LastModifiedDate | StorageClass | ETag | IsMultipartUploaded | ReplicationStatus | EncryptionStatus | ObjectLockRetainUntilDate | ObjectLockMode | ObjectLockLegalHoldStatus | IntelligentTieringAccessTier | BucketKeyStatus`","Prefix":"Specifies the inventory filter prefix.","ScheduleFrequency":"Specifies the schedule for generating inventory results.\\n\\n*Allowed values* : `Daily` | `Weekly`"}},"AWS::S3::Bucket.LambdaConfiguration":{"attributes":{},"description":"Describes the AWS Lambda functions to invoke and the events for which to invoke them.","properties":{"Event":"The Amazon S3 bucket event for which to invoke the AWS Lambda function. For more information, see [Supported Event Types](https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html) in the *Amazon S3 User Guide* .","Filter":"The filtering rules that determine which objects invoke the AWS Lambda function. For example, you can create a filter so that only image files with a `.jpg` extension invoke the function when they are added to the Amazon S3 bucket.","Function":"The Amazon Resource Name (ARN) of the AWS Lambda function that Amazon S3 invokes when the specified event type occurs."}},"AWS::S3::Bucket.LifecycleConfiguration":{"attributes":{},"description":"Specifies the lifecycle configuration for objects in an Amazon S3 bucket. For more information, see [Object Lifecycle Management](https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html) in the *Amazon S3 User Guide* .","properties":{"Rules":"A lifecycle rule for individual objects in an Amazon S3 bucket."}},"AWS::S3::Bucket.LoggingConfiguration":{"attributes":{},"description":"Describes where logs are stored and the prefix that Amazon S3 assigns to all log object keys for a bucket. For examples and more information, see [PUT Bucket logging](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlogging.html) in the *Amazon S3 API Reference* .\\n\\n> To successfully complete the `AWS::S3::Bucket LoggingConfiguration` request, you must have `s3:PutObject` and `s3:PutObjectAcl` in your IAM permissions.","properties":{"DestinationBucketName":"The name of the bucket where Amazon S3 should store server access log files. You can store log files in any bucket that you own. By default, logs are stored in the bucket where the `LoggingConfiguration` property is defined.","LogFilePrefix":"A prefix for all log object keys. If you store log files from multiple Amazon S3 buckets in a single bucket, you can use a prefix to distinguish which log files came from which bucket."}},"AWS::S3::Bucket.Metrics":{"attributes":{},"description":"A container specifying replication metrics-related settings enabling replication metrics and events.","properties":{"EventThreshold":"A container specifying the time threshold for emitting the `s3:Replication:OperationMissedThreshold` event.","Status":"Specifies whether the replication metrics are enabled."}},"AWS::S3::Bucket.MetricsConfiguration":{"attributes":{},"description":"Specifies a metrics configuration for the CloudWatch request metrics (specified by the metrics configuration ID) from an Amazon S3 bucket. If you\'re updating an existing metrics configuration, note that this is a full replacement of the existing metrics configuration. If you don\'t include the elements you want to keep, they are erased. For examples, see [AWS::S3::Bucket](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket--examples) . For more information, see [PUT Bucket metrics](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTMetricConfiguration.html) in the *Amazon S3 API Reference* .","properties":{"AccessPointArn":"The access point that was used while performing operations on the object. The metrics configuration only includes objects that meet the filter\'s criteria.","Id":"The ID used to identify the metrics configuration. This can be any value you choose that helps you identify your metrics configuration.","Prefix":"The prefix that an object must have to be included in the metrics results.","TagFilters":"Specifies a list of tag filters to use as a metrics configuration filter. The metrics configuration includes only objects that meet the filter\'s criteria."}},"AWS::S3::Bucket.NoncurrentVersionExpiration":{"attributes":{},"description":"Specifies when noncurrent object versions expire. Upon expiration, Amazon S3 permanently deletes the noncurrent object versions. You set this lifecycle configuration action on a bucket that has versioning enabled (or suspended) to request that Amazon S3 delete noncurrent object versions at a specific period in the object\'s lifetime. For more information about setting a lifecycle rule configuration, see [AWS::S3::Bucket Rule](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html) .","properties":{"NewerNoncurrentVersions":"Specifies how many noncurrent versions Amazon S3 will retain. If there are this many more recent noncurrent versions, Amazon S3 will take the associated action. For more information about noncurrent versions, see [Lifecycle configuration elements](https://docs.aws.amazon.com/AmazonS3/latest/userguide/intro-lifecycle-rules.html) in the *Amazon S3 User Guide* .","NoncurrentDays":"Specifies the number of days an object is noncurrent before Amazon S3 can perform the associated action. For information about the noncurrent days calculations, see [How Amazon S3 Calculates When an Object Became Noncurrent](https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html#non-current-days-calculations) in the *Amazon S3 User Guide* ."}},"AWS::S3::Bucket.NoncurrentVersionTransition":{"attributes":{},"description":"Container for the transition rule that describes when noncurrent objects transition to the `STANDARD_IA` , `ONEZONE_IA` , `INTELLIGENT_TIERING` , `GLACIER_IR` , `GLACIER` , or `DEEP_ARCHIVE` storage class. If your bucket is versioning-enabled (or versioning is suspended), you can set this action to request that Amazon S3 transition noncurrent object versions to the `STANDARD_IA` , `ONEZONE_IA` , `INTELLIGENT_TIERING` , `GLACIER_IR` , `GLACIER` , or `DEEP_ARCHIVE` storage class at a specific period in the object\'s lifetime. If you specify this property, don\'t specify the `NoncurrentVersionTransitions` property.","properties":{"NewerNoncurrentVersions":"Specifies how many noncurrent versions Amazon S3 will retain. If there are this many more recent noncurrent versions, Amazon S3 will take the associated action. For more information about noncurrent versions, see [Lifecycle configuration elements](https://docs.aws.amazon.com/AmazonS3/latest/userguide/intro-lifecycle-rules.html) in the *Amazon S3 User Guide* .","StorageClass":"The class of storage used to store the object.","TransitionInDays":"Specifies the number of days an object is noncurrent before Amazon S3 can perform the associated action. For information about the noncurrent days calculations, see [How Amazon S3 Calculates How Long an Object Has Been Noncurrent](https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html#non-current-days-calculations) in the *Amazon S3 User Guide* ."}},"AWS::S3::Bucket.NotificationConfiguration":{"attributes":{},"description":"Describes the notification configuration for an Amazon S3 bucket.\\n\\n> If you create the target resource and related permissions in the same template, you might have a circular dependency.\\n> \\n> For example, you might use the `AWS::Lambda::Permission` resource to grant the bucket permission to invoke an AWS Lambda function. However, AWS CloudFormation can\'t create the bucket until the bucket has permission to invoke the function ( AWS CloudFormation checks whether the bucket can invoke the function). If you\'re using Refs to pass the bucket name, this leads to a circular dependency.\\n> \\n> To avoid this dependency, you can create all resources without specifying the notification configuration. Then, update the stack with a notification configuration.\\n> \\n> For more information on permissions, see [AWS::Lambda::Permission](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html) and [Granting Permissions to Publish Event Notification Messages to a Destination](https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#grant-destinations-permissions-to-s3) .","properties":{"EventBridgeConfiguration":"Enables delivery of events to Amazon EventBridge.","LambdaConfigurations":"Describes the AWS Lambda functions to invoke and the events for which to invoke them.","QueueConfigurations":"The Amazon Simple Queue Service queues to publish messages to and the events for which to publish messages.","TopicConfigurations":"The topic to which notifications are sent and the events for which notifications are generated."}},"AWS::S3::Bucket.NotificationFilter":{"attributes":{},"description":"Specifies object key name filtering rules. For information about key name filtering, see [Configuring event notifications using object key name filtering](https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-how-to-filtering.html) in the *Amazon S3 User Guide* .","properties":{"S3Key":"A container for object key name prefix and suffix filtering rules."}},"AWS::S3::Bucket.ObjectLockConfiguration":{"attributes":{},"description":"Places an Object Lock configuration on the specified bucket. The rule specified in the Object Lock configuration will be applied by default to every new object placed in the specified bucket. For more information, see [Locking Objects](https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html) .","properties":{"ObjectLockEnabled":"Indicates whether this bucket has an Object Lock configuration enabled. Enable `ObjectLockEnabled` when you apply `ObjectLockConfiguration` to a bucket.","Rule":"Specifies the Object Lock rule for the specified object. Enable this rule when you apply `ObjectLockConfiguration` to a bucket. If Object Lock is turned on, bucket settings require both `Mode` and a period of either `Days` or `Years` . You cannot specify `Days` and `Years` at the same time. For more information, see [ObjectLockRule](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-objectlockrule.html) and [DefaultRetention](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-defaultretention.html) ."}},"AWS::S3::Bucket.ObjectLockRule":{"attributes":{},"description":"Specifies the Object Lock rule for the specified object. Enable the this rule when you apply `ObjectLockConfiguration` to a bucket.","properties":{"DefaultRetention":"The default Object Lock retention mode and period that you want to apply to new objects placed in the specified bucket. If Object Lock is turned on, bucket settings require both `Mode` and a period of either `Days` or `Years` . You cannot specify `Days` and `Years` at the same time. For more information about allowable values for mode and period, see [DefaultRetention](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-defaultretention.html) ."}},"AWS::S3::Bucket.OwnershipControls":{"attributes":{},"description":"Specifies the container element for Object Ownership rules.\\n\\nS3 Object Ownership is an Amazon S3 bucket-level setting that you can use to disable access control lists (ACLs) and take ownership of every object in your bucket, simplifying access management for data stored in Amazon S3. For more information, see [Controlling ownership of objects and disabling ACLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html) in the *Amazon S3 User Guide* .","properties":{"Rules":"Specifies the container element for Object Ownership rules."}},"AWS::S3::Bucket.OwnershipControlsRule":{"attributes":{},"description":"Specifies an Object Ownership rule.\\n\\nS3 Object Ownership is an Amazon S3 bucket-level setting that you can use to disable access control lists (ACLs) and take ownership of every object in your bucket, simplifying access management for data stored in Amazon S3. For more information, see [Controlling ownership of objects and disabling ACLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html) in the *Amazon S3 User Guide* .","properties":{"ObjectOwnership":"Specifies an Object Ownership rule.\\n\\n*Allowed values* : `BucketOwnerEnforced` | `ObjectWriter` | `BucketOwnerPreferred`"}},"AWS::S3::Bucket.PublicAccessBlockConfiguration":{"attributes":{},"description":"The PublicAccessBlock configuration that you want to apply to this Amazon S3 bucket. You can enable the configuration options in any combination. For more information about when Amazon S3 considers a bucket or object public, see [The Meaning of \\"Public\\"](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status) in the *Amazon S3 User Guide* .","properties":{"BlockPublicAcls":"Specifies whether Amazon S3 should block public access control lists (ACLs) for this bucket and objects in this bucket. Setting this element to `TRUE` causes the following behavior:\\n\\n- PUT Bucket ACL and PUT Object ACL calls fail if the specified ACL is public.\\n- PUT Object calls fail if the request includes a public ACL.\\n- PUT Bucket calls fail if the request includes a public ACL.\\n\\nEnabling this setting doesn\'t affect existing policies or ACLs.","BlockPublicPolicy":"Specifies whether Amazon S3 should block public bucket policies for this bucket. Setting this element to `TRUE` causes Amazon S3 to reject calls to PUT Bucket policy if the specified bucket policy allows public access.\\n\\nEnabling this setting doesn\'t affect existing bucket policies.","IgnorePublicAcls":"Specifies whether Amazon S3 should ignore public ACLs for this bucket and objects in this bucket. Setting this element to `TRUE` causes Amazon S3 to ignore all public ACLs on this bucket and objects in this bucket.\\n\\nEnabling this setting doesn\'t affect the persistence of any existing ACLs and doesn\'t prevent new public ACLs from being set.","RestrictPublicBuckets":"Specifies whether Amazon S3 should restrict public bucket policies for this bucket. Setting this element to `TRUE` restricts access to this bucket to only AWS service principals and authorized users within this account if the bucket has a public policy.\\n\\nEnabling this setting doesn\'t affect previously stored bucket policies, except that public and cross-account access within any public bucket policy, including non-public delegation to specific accounts, is blocked."}},"AWS::S3::Bucket.QueueConfiguration":{"attributes":{},"description":"Specifies the configuration for publishing messages to an Amazon Simple Queue Service (Amazon SQS) queue when Amazon S3 detects specified events.","properties":{"Event":"The Amazon S3 bucket event about which you want to publish messages to Amazon SQS. For more information, see [Supported Event Types](https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html) in the *Amazon S3 User Guide* .","Filter":"The filtering rules that determine which objects trigger notifications. For example, you can create a filter so that Amazon S3 sends notifications only when image files with a `.jpg` extension are added to the bucket. For more information, see [Configuring event notifications using object key name filtering](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/notification-how-to-filtering.html) in the *Amazon S3 User Guide* .","Queue":"The Amazon Resource Name (ARN) of the Amazon SQS queue to which Amazon S3 publishes a message when it detects events of the specified type. FIFO queues are not allowed when enabling an SQS queue as the event notification destination."}},"AWS::S3::Bucket.RedirectAllRequestsTo":{"attributes":{},"description":"Specifies the redirect behavior of all requests to a website endpoint of an Amazon S3 bucket.","properties":{"HostName":"Name of the host where requests are redirected.","Protocol":"Protocol to use when redirecting requests. The default is the protocol that is used in the original request."}},"AWS::S3::Bucket.RedirectRule":{"attributes":{},"description":"Specifies how requests are redirected. In the event of an error, you can specify a different error code to return.","properties":{"HostName":"The host name to use in the redirect request.","HttpRedirectCode":"The HTTP redirect code to use on the response. Not required if one of the siblings is present.","Protocol":"Protocol to use when redirecting requests. The default is the protocol that is used in the original request.","ReplaceKeyPrefixWith":"The object key prefix to use in the redirect request. For example, to redirect requests for all pages with prefix `docs/` (objects in the `docs/` folder) to `documents/` , you can set a condition block with `KeyPrefixEquals` set to `docs/` and in the Redirect set `ReplaceKeyPrefixWith` to `/documents` . Not required if one of the siblings is present. Can be present only if `ReplaceKeyWith` is not provided.\\n\\n> Replacement must be made for object keys containing special characters (such as carriage returns) when using XML requests. For more information, see [XML related object key constraints](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints) .","ReplaceKeyWith":"The specific object key to use in the redirect request. For example, redirect request to `error.html` . Not required if one of the siblings is present. Can be present only if `ReplaceKeyPrefixWith` is not provided.\\n\\n> Replacement must be made for object keys containing special characters (such as carriage returns) when using XML requests. For more information, see [XML related object key constraints](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints) ."}},"AWS::S3::Bucket.ReplicaModifications":{"attributes":{},"description":"A filter that you can specify for selection for modifications on replicas.","properties":{"Status":"Specifies whether Amazon S3 replicates modifications on replicas.\\n\\n*Allowed values* : `Enabled` | `Disabled`"}},"AWS::S3::Bucket.ReplicationConfiguration":{"attributes":{},"description":"A container for replication rules. You can add up to 1,000 rules. The maximum size of a replication configuration is 2 MB.","properties":{"Role":"The Amazon Resource Name (ARN) of the AWS Identity and Access Management (IAM) role that Amazon S3 assumes when replicating objects. For more information, see [How to Set Up Replication](https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-how-setup.html) in the *Amazon S3 User Guide* .","Rules":"A container for one or more replication rules. A replication configuration must have at least one rule and can contain a maximum of 1,000 rules."}},"AWS::S3::Bucket.ReplicationDestination":{"attributes":{},"description":"A container for information about the replication destination and its configurations including enabling the S3 Replication Time Control (S3 RTC).","properties":{"AccessControlTranslation":"Specify this only in a cross-account scenario (where source and destination bucket owners are not the same), and you want to change replica ownership to the AWS account that owns the destination bucket. If this is not specified in the replication configuration, the replicas are owned by same AWS account that owns the source object.","Account":"Destination bucket owner account ID. In a cross-account scenario, if you direct Amazon S3 to change replica ownership to the AWS account that owns the destination bucket by specifying the `AccessControlTranslation` property, this is the account ID of the destination bucket owner. For more information, see [Cross-Region Replication Additional Configuration: Change Replica Owner](https://docs.aws.amazon.com/AmazonS3/latest/dev/crr-change-owner.html) in the *Amazon S3 User Guide* .\\n\\nIf you specify the `AccessControlTranslation` property, the `Account` property is required.","Bucket":"The Amazon Resource Name (ARN) of the bucket where you want Amazon S3 to store the results.","EncryptionConfiguration":"Specifies encryption-related information.","Metrics":"A container specifying replication metrics-related settings enabling replication metrics and events.","ReplicationTime":"A container specifying S3 Replication Time Control (S3 RTC), including whether S3 RTC is enabled and the time when all objects and operations on objects must be replicated. Must be specified together with a `Metrics` block.","StorageClass":"The storage class to use when replicating objects, such as S3 Standard or reduced redundancy. By default, Amazon S3 uses the storage class of the source object to create the object replica.\\n\\nFor valid values, see the `StorageClass` element of the [PUT Bucket replication](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTreplication.html) action in the *Amazon S3 API Reference* ."}},"AWS::S3::Bucket.ReplicationRule":{"attributes":{},"description":"Specifies which Amazon S3 objects to replicate and where to store the replicas.","properties":{"DeleteMarkerReplication":"Specifies whether Amazon S3 replicates delete markers. If you specify a `Filter` in your replication configuration, you must also include a `DeleteMarkerReplication` element. If your `Filter` includes a `Tag` element, the `DeleteMarkerReplication` `Status` must be set to Disabled, because Amazon S3 does not support replicating delete markers for tag-based rules. For an example configuration, see [Basic Rule Configuration](https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html#replication-config-min-rule-config) .\\n\\nFor more information about delete marker replication, see [Basic Rule Configuration](https://docs.aws.amazon.com/AmazonS3/latest/dev/delete-marker-replication.html) .\\n\\n> If you are using an earlier version of the replication configuration, Amazon S3 handles replication of delete markers differently. For more information, see [Backward Compatibility](https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html#replication-backward-compat-considerations) .","Destination":"A container for information about the replication destination and its configurations including enabling the S3 Replication Time Control (S3 RTC).","Filter":"A filter that identifies the subset of objects to which the replication rule applies. A `Filter` must specify exactly one `Prefix` , `TagFilter` , or an `And` child element. The use of the filter field indicates that this is a V2 replication configuration. This field isn\'t supported in a V1 replication configuration.\\n\\n> V1 replication configuration only supports filtering by key prefix. To filter using a V1 replication configuration, add the `Prefix` directly as a child element of the `Rule` element.","Id":"A unique identifier for the rule. The maximum value is 255 characters. If you don\'t specify a value, AWS CloudFormation generates a random ID. When using a V2 replication configuration this property is capitalized as \\"ID\\".","Prefix":"An object key name prefix that identifies the object or objects to which the rule applies. The maximum prefix length is 1,024 characters. To include all objects in a bucket, specify an empty string. To filter using a V1 replication configuration, add the `Prefix` directly as a child element of the `Rule` element.\\n\\n> Replacement must be made for object keys containing special characters (such as carriage returns) when using XML requests. For more information, see [XML related object key constraints](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints) .","Priority":"The priority indicates which rule has precedence whenever two or more replication rules conflict. Amazon S3 will attempt to replicate objects according to all replication rules. However, if there are two or more rules with the same destination bucket, then objects will be replicated according to the rule with the highest priority. The higher the number, the higher the priority.\\n\\nFor more information, see [Replication](https://docs.aws.amazon.com/AmazonS3/latest/dev/replication.html) in the *Amazon S3 User Guide* .","SourceSelectionCriteria":"A container that describes additional filters for identifying the source objects that you want to replicate. You can choose to enable or disable the replication of these objects.","Status":"Specifies whether the rule is enabled."}},"AWS::S3::Bucket.ReplicationRuleAndOperator":{"attributes":{},"description":"A container for specifying rule filters. The filters determine the subset of objects to which the rule applies. This element is required only if you specify more than one filter.\\n\\nFor example:\\n\\n- If you specify both a `Prefix` and a `TagFilter` , wrap these filters in an `And` tag.\\n- If you specify a filter based on multiple tags, wrap the `TagFilter` elements in an `And` tag","properties":{"Prefix":"An object key name prefix that identifies the subset of objects to which the rule applies.","TagFilters":"An array of tags containing key and value pairs."}},"AWS::S3::Bucket.ReplicationRuleFilter":{"attributes":{},"description":"A filter that identifies the subset of objects to which the replication rule applies. A `Filter` must specify exactly one `Prefix` , `TagFilter` , or an `And` child element.","properties":{"And":"A container for specifying rule filters. The filters determine the subset of objects to which the rule applies. This element is required only if you specify more than one filter. For example:\\n\\n- If you specify both a `Prefix` and a `TagFilter` , wrap these filters in an `And` tag.\\n- If you specify a filter based on multiple tags, wrap the `TagFilter` elements in an `And` tag.","Prefix":"An object key name prefix that identifies the subset of objects to which the rule applies.\\n\\n> Replacement must be made for object keys containing special characters (such as carriage returns) when using XML requests. For more information, see [XML related object key constraints](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints) .","TagFilter":"A container for specifying a tag key and value.\\n\\nThe rule applies only to objects that have the tag in their tag set."}},"AWS::S3::Bucket.ReplicationTime":{"attributes":{},"description":"A container specifying S3 Replication Time Control (S3 RTC) related information, including whether S3 RTC is enabled and the time when all objects and operations on objects must be replicated. Must be specified together with a `Metrics` block.","properties":{"Status":"Specifies whether the replication time is enabled.","Time":"A container specifying the time by which replication should be complete for all objects and operations on objects."}},"AWS::S3::Bucket.ReplicationTimeValue":{"attributes":{},"description":"A container specifying the time value for S3 Replication Time Control (S3 RTC) and replication metrics `EventThreshold` .","properties":{"Minutes":"Contains an integer specifying time in minutes.\\n\\nValid value: 15"}},"AWS::S3::Bucket.RoutingRule":{"attributes":{},"description":"Specifies the redirect behavior and when a redirect is applied. For more information about routing rules, see [Configuring advanced conditional redirects](https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html#advanced-conditional-redirects) in the *Amazon S3 User Guide* .","properties":{"RedirectRule":"Container for redirect information. You can redirect requests to another host, to another page, or with another protocol. In the event of an error, you can specify a different error code to return.","RoutingRuleCondition":"A container for describing a condition that must be met for the specified redirect to apply. For example, 1. If request is for pages in the `/docs` folder, redirect to the `/documents` folder. 2. If request results in HTTP error 4xx, redirect request to another host where you might process the error."}},"AWS::S3::Bucket.RoutingRuleCondition":{"attributes":{},"description":"A container for describing a condition that must be met for the specified redirect to apply. For example, 1. If request is for pages in the `/docs` folder, redirect to the `/documents` folder. 2. If request results in HTTP error 4xx, redirect request to another host where you might process the error.","properties":{"HttpErrorCodeReturnedEquals":"The HTTP error code when the redirect is applied. In the event of an error, if the error code equals this value, then the specified redirect is applied.\\n\\nRequired when parent element `Condition` is specified and sibling `KeyPrefixEquals` is not specified. If both are specified, then both must be true for the redirect to be applied.","KeyPrefixEquals":"The object key name prefix when the redirect is applied. For example, to redirect requests for `ExamplePage.html` , the key prefix will be `ExamplePage.html` . To redirect request for all pages with the prefix `docs/` , the key prefix will be `/docs` , which identifies all objects in the docs/ folder.\\n\\nRequired when the parent element `Condition` is specified and sibling `HttpErrorCodeReturnedEquals` is not specified. If both conditions are specified, both must be true for the redirect to be applied."}},"AWS::S3::Bucket.Rule":{"attributes":{},"description":"Specifies lifecycle rules for an Amazon S3 bucket. For more information, see [Put Bucket Lifecycle Configuration](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html) in the *Amazon S3 API Reference* .\\n\\nYou must specify at least one of the following properties: `AbortIncompleteMultipartUpload` , `ExpirationDate` , `ExpirationInDays` , `NoncurrentVersionExpirationInDays` , `NoncurrentVersionTransition` , `NoncurrentVersionTransitions` , `Transition` , or `Transitions` .","properties":{"AbortIncompleteMultipartUpload":"Specifies a lifecycle rule that stops incomplete multipart uploads to an Amazon S3 bucket.","ExpirationDate":"Indicates when objects are deleted from Amazon S3 and Amazon S3 Glacier. The date value must be in ISO 8601 format. The time is always midnight UTC. If you specify an expiration and transition time, you must use the same time unit for both properties (either in days or by date). The expiration time must also be later than the transition time.","ExpirationInDays":"Indicates the number of days after creation when objects are deleted from Amazon S3 and Amazon S3 Glacier. If you specify an expiration and transition time, you must use the same time unit for both properties (either in days or by date). The expiration time must also be later than the transition time.","ExpiredObjectDeleteMarker":"Indicates whether Amazon S3 will remove a delete marker without any noncurrent versions. If set to true, the delete marker will be removed if there are no noncurrent versions. This cannot be specified with `ExpirationInDays` , `ExpirationDate` , or `TagFilters` .","Id":"Unique identifier for the rule. The value can\'t be longer than 255 characters.","NoncurrentVersionExpiration":"Specifies when noncurrent object versions expire. Upon expiration, Amazon S3 permanently deletes the noncurrent object versions. You set this lifecycle configuration action on a bucket that has versioning enabled (or suspended) to request that Amazon S3 delete noncurrent object versions at a specific period in the object\'s lifetime.","NoncurrentVersionExpirationInDays":"(Deprecated.) For buckets with versioning enabled (or suspended), specifies the time, in days, between when a new version of the object is uploaded to the bucket and when old versions of the object expire. When object versions expire, Amazon S3 permanently deletes them. If you specify a transition and expiration time, the expiration time must be later than the transition time.","NoncurrentVersionTransition":"(Deprecated.) For buckets with versioning enabled (or suspended), specifies when non-current objects transition to a specified storage class. If you specify a transition and expiration time, the expiration time must be later than the transition time. If you specify this property, don\'t specify the `NoncurrentVersionTransitions` property.","NoncurrentVersionTransitions":"For buckets with versioning enabled (or suspended), one or more transition rules that specify when non-current objects transition to a specified storage class. If you specify a transition and expiration time, the expiration time must be later than the transition time. If you specify this property, don\'t specify the `NoncurrentVersionTransition` property.","ObjectSizeGreaterThan":"Specifies the minimum object size in bytes for this rule to apply to. Objects must be larger than this value in bytes. For more information about size based rules, see [Lifecycle configuration using size-based rules](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configuration-examples.html#lc-size-rules) in the *Amazon S3 User Guide* .","ObjectSizeLessThan":"Specifies the maximum object size in bytes for this rule to apply to. Objects must be smaller than this value in bytes. For more information about sized based rules, see [Lifecycle configuration using size-based rules](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-configuration-examples.html#lc-size-rules) in the *Amazon S3 User Guide* .","Prefix":"Object key prefix that identifies one or more objects to which this rule applies.\\n\\n> Replacement must be made for object keys containing special characters (such as carriage returns) when using XML requests. For more information, see [XML related object key constraints](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints) .","Status":"If `Enabled` , the rule is currently being applied. If `Disabled` , the rule is not currently being applied.","TagFilters":"Tags to use to identify a subset of objects to which the lifecycle rule applies.","Transition":"(Deprecated.) Specifies when an object transitions to a specified storage class. If you specify an expiration and transition time, you must use the same time unit for both properties (either in days or by date). The expiration time must also be later than the transition time. If you specify this property, don\'t specify the `Transitions` property.","Transitions":"One or more transition rules that specify when an object transitions to a specified storage class. If you specify an expiration and transition time, you must use the same time unit for both properties (either in days or by date). The expiration time must also be later than the transition time. If you specify this property, don\'t specify the `Transition` property."}},"AWS::S3::Bucket.S3KeyFilter":{"attributes":{},"description":"A container for object key name prefix and suffix filtering rules. For more information about object key name filtering, see [Configuring event notifications using object key name filtering](https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-how-to-filtering.html) in the *Amazon S3 User Guide* .\\n\\n> The same type of filter rule cannot be used more than once. For example, you cannot specify two prefix rules.","properties":{"Rules":"A list of containers for the key-value pair that defines the criteria for the filter rule."}},"AWS::S3::Bucket.ServerSideEncryptionByDefault":{"attributes":{},"description":"Describes the default server-side encryption to apply to new objects in the bucket. If a PUT Object request doesn\'t specify any server-side encryption, this default encryption will be applied. If you don\'t specify a customer managed key at configuration, Amazon S3 automatically creates an AWS KMS key in your AWS account the first time that you add an object encrypted with SSE-KMS to a bucket. By default, Amazon S3 uses this KMS key for SSE-KMS. For more information, see [PUT Bucket encryption](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTencryption.html) in the *Amazon S3 API Reference* .","properties":{"KMSMasterKeyID":"KMS key ID to use for the default encryption. This parameter is allowed if SSEAlgorithm is aws:kms.\\n\\nYou can specify the key ID, key alias, or the Amazon Resource Name (ARN) of the CMK. However, if you are using encryption with cross-account operations, you must use a fully qualified CMK ARN. For more information, see [Using encryption for cross-account operations](https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html#bucket-encryption-update-bucket-policy) .\\n\\nFor example:\\n\\n- Key ID: `1234abcd-12ab-34cd-56ef-1234567890ab`\\n- Key ARN: `arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab`\\n\\n> Amazon S3 only supports symmetric KMS keys and not asymmetric KMS keys. For more information, see [Using Symmetric and Asymmetric Keys](https://docs.aws.amazon.com//kms/latest/developerguide/symmetric-asymmetric.html) in the *AWS Key Management Service Developer Guide* .","SSEAlgorithm":"Server-side encryption algorithm to use for the default encryption."}},"AWS::S3::Bucket.ServerSideEncryptionRule":{"attributes":{},"description":"Specifies the default server-side encryption configuration.","properties":{"BucketKeyEnabled":"Specifies whether Amazon S3 should use an S3 Bucket Key with server-side encryption using KMS (SSE-KMS) for new objects in the bucket. Existing objects are not affected. Setting the `BucketKeyEnabled` element to `true` causes Amazon S3 to use an S3 Bucket Key. By default, S3 Bucket Key is not enabled.\\n\\nFor more information, see [Amazon S3 Bucket Keys](https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-key.html) in the *Amazon S3 User Guide* .","ServerSideEncryptionByDefault":"Specifies the default server-side encryption to apply to new objects in the bucket. If a PUT Object request doesn\'t specify any server-side encryption, this default encryption will be applied."}},"AWS::S3::Bucket.SourceSelectionCriteria":{"attributes":{},"description":"A container that describes additional filters for identifying the source objects that you want to replicate. You can choose to enable or disable the replication of these objects.","properties":{"ReplicaModifications":"A filter that you can specify for selection for modifications on replicas.","SseKmsEncryptedObjects":"A container for filter information for the selection of Amazon S3 objects encrypted with AWS KMS."}},"AWS::S3::Bucket.SseKmsEncryptedObjects":{"attributes":{},"description":"A container for filter information for the selection of S3 objects encrypted with AWS KMS.","properties":{"Status":"Specifies whether Amazon S3 replicates objects created with server-side encryption using an AWS KMS key stored in AWS Key Management Service."}},"AWS::S3::Bucket.StorageClassAnalysis":{"attributes":{},"description":"Specifies data related to access patterns to be collected and made available to analyze the tradeoffs between different storage classes for an Amazon S3 bucket.","properties":{"DataExport":"Specifies how data related to the storage class analysis for an Amazon S3 bucket should be exported."}},"AWS::S3::Bucket.TagFilter":{"attributes":{},"description":"Specifies tags to use to identify a subset of objects for an Amazon S3 bucket.","properties":{"Key":"The tag key.","Value":"The tag value."}},"AWS::S3::Bucket.Tiering":{"attributes":{},"description":"The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically moving data to the most cost-effective storage access tier, without additional operational overhead.","properties":{"AccessTier":"S3 Intelligent-Tiering access tier. See [Storage class for automatically optimizing frequently and infrequently accessed objects](https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access) for a list of access tiers in the S3 Intelligent-Tiering storage class.","Days":"The number of consecutive days of no access after which an object will be eligible to be transitioned to the corresponding tier. The minimum number of days specified for Archive Access tier must be at least 90 days and Deep Archive Access tier must be at least 180 days. The maximum can be up to 2 years (730 days)."}},"AWS::S3::Bucket.TopicConfiguration":{"attributes":{},"description":"A container for specifying the configuration for publication of messages to an Amazon Simple Notification Service (Amazon SNS) topic when Amazon S3 detects specified events.","properties":{"Event":"The Amazon S3 bucket event about which to send notifications. For more information, see [Supported Event Types](https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html) in the *Amazon S3 User Guide* .","Filter":"The filtering rules that determine for which objects to send notifications. For example, you can create a filter so that Amazon S3 sends notifications only when image files with a `.jpg` extension are added to the bucket.","Topic":"The Amazon Resource Name (ARN) of the Amazon SNS topic to which Amazon S3 publishes a message when it detects events of the specified type."}},"AWS::S3::Bucket.Transition":{"attributes":{},"description":"Specifies when an object transitions to a specified storage class. For more information about Amazon S3 lifecycle configuration rules, see [Transitioning Objects Using Amazon S3 Lifecycle](https://docs.aws.amazon.com/AmazonS3/latest/dev/lifecycle-transition-general-considerations.html) in the *Amazon S3 User Guide* .","properties":{"StorageClass":"The storage class to which you want the object to transition.","TransitionDate":"Indicates when objects are transitioned to the specified storage class. The date value must be in ISO 8601 format. The time is always midnight UTC.","TransitionInDays":"Indicates the number of days after creation when objects are transitioned to the specified storage class. The value must be a positive integer."}},"AWS::S3::Bucket.VersioningConfiguration":{"attributes":{},"description":"Describes the versioning state of an Amazon S3 bucket. For more information, see [PUT Bucket versioning](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html) in the *Amazon S3 API Reference* .","properties":{"Status":"The versioning state of the bucket."}},"AWS::S3::Bucket.WebsiteConfiguration":{"attributes":{},"description":"Specifies website configuration parameters for an Amazon S3 bucket.","properties":{"ErrorDocument":"The name of the error document for the website.","IndexDocument":"The name of the index document for the website.","RedirectAllRequestsTo":"The redirect behavior for every request to this bucket\'s website endpoint.\\n\\n> If you specify this property, you can\'t specify any other property.","RoutingRules":"Rules that define when a redirect is applied and the redirect behavior."}},"AWS::S3::BucketPolicy":{"attributes":{},"description":"Applies an Amazon S3 bucket policy to an Amazon S3 bucket. If you are using an identity other than the root user of the AWS account that owns the bucket, the calling identity must have the `PutBucketPolicy` permissions on the specified bucket and belong to the bucket owner\'s account in order to use this operation.\\n\\nIf you don\'t have `PutBucketPolicy` permissions, Amazon S3 returns a `403 Access Denied` error. If you have the correct permissions, but you\'re not using an identity that belongs to the bucket owner\'s account, Amazon S3 returns a `405 Method Not Allowed` error.\\n\\n> As a security precaution, the root user of the AWS account that owns a bucket can always use this operation, even if the policy explicitly denies the root user the ability to perform this action. \\n\\nFor more information, see [Bucket policy examples](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html) .\\n\\nThe following operations are related to `PutBucketPolicy` :\\n\\n- [CreateBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)\\n- [DeleteBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html)","properties":{"Bucket":"The name of the Amazon S3 bucket to which the policy applies.","PolicyDocument":"A policy document containing permissions to add to the specified bucket. In IAM, you must provide policy documents in JSON format. However, in CloudFormation you can provide the policy in JSON or YAML format because CloudFormation converts YAML to JSON before submitting it to IAM. For more information, see the AWS::IAM::Policy [PolicyDocument](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html#cfn-iam-policy-policydocument) resource description in this guide and [Access Policy Language Overview](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html) in the *Amazon S3 User Guide* ."}},"AWS::S3::MultiRegionAccessPoint":{"attributes":{"Alias":"The alias for the Multi-Region Access Point. For more information about the distinction between the name and the alias of an Multi-Region Access Point, see [Managing Multi-Region Access Points](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingMultiRegionAccessPoints.html#multi-region-access-point-naming) in the *Amazon S3 User Guide* .","CreatedAt":"The timestamp of when the Multi-Region Access Point is created.","Ref":"`Ref` returns the name of the Multi-Region Access Point."},"description":"The `AWS::S3::MultiRegionAccessPoint` resource creates an Amazon S3 Multi-Region Access Point. To learn more about Multi-Region Access Points, see [Multi-Region Access Points in Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiRegionAccessPoints.html) in the in the *Amazon S3 User Guide* .","properties":{"Name":"The name of the Multi-Region Access Point.","PublicAccessBlockConfiguration":"The PublicAccessBlock configuration that you want to apply to this Multi-Region Access Point. You can enable the configuration options in any combination. For more information about when Amazon S3 considers an object public, see [The Meaning of \\"Public\\"](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status) in the *Amazon S3 User Guide* .","Regions":"A collection of the Regions and buckets associated with the Multi-Region Access Point."}},"AWS::S3::MultiRegionAccessPoint.PublicAccessBlockConfiguration":{"attributes":{},"description":"The PublicAccessBlock configuration that you want to apply to this Amazon S3 Multi-Region Access Point. You can enable the configuration options in any combination. For more information about when Amazon S3 considers an object public, see [The Meaning of \\"Public\\"](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status) in the *Amazon S3 User Guide* .","properties":{"BlockPublicAcls":"Specifies whether Amazon S3 should block public access control lists (ACLs) for this bucket and objects in this bucket. Setting this element to `TRUE` causes the following behavior:\\n\\n- PUT Bucket ACL and PUT Object ACL calls fail if the specified ACL is public.\\n- PUT Object calls fail if the request includes a public ACL.\\n- PUT Bucket calls fail if the request includes a public ACL.\\n\\nEnabling this setting doesn\'t affect existing policies or ACLs.","BlockPublicPolicy":"Specifies whether Amazon S3 should block public bucket policies for this bucket. Setting this element to `TRUE` causes Amazon S3 to reject calls to PUT Bucket policy if the specified bucket policy allows public access.\\n\\nEnabling this setting doesn\'t affect existing bucket policies.","IgnorePublicAcls":"Specifies whether Amazon S3 should ignore public ACLs for this bucket and objects in this bucket. Setting this element to `TRUE` causes Amazon S3 to ignore all public ACLs on this bucket and objects in this bucket.\\n\\nEnabling this setting doesn\'t affect the persistence of any existing ACLs and doesn\'t prevent new public ACLs from being set.","RestrictPublicBuckets":"Specifies whether Amazon S3 should restrict public bucket policies for this bucket. Setting this element to `TRUE` restricts access to this bucket to only AWS service principals and authorized users within this account if the bucket has a public policy.\\n\\nEnabling this setting doesn\'t affect previously stored bucket policies, except that public and cross-account access within any public bucket policy, including non-public delegation to specific accounts, is blocked."}},"AWS::S3::MultiRegionAccessPoint.Region":{"attributes":{},"description":"A bucket associated with a specific Region when creating Multi-Region Access Points.","properties":{"Bucket":"The name of the associated bucket for the Region.","BucketAccountId":"The AWS account ID that owns the Amazon S3 bucket that\'s associated with this Multi-Region Access Point."}},"AWS::S3::MultiRegionAccessPointPolicy":{"attributes":{"Ref":"`Ref` returns the name of the Multi-Region Access Point."},"description":"Applies an Amazon S3 access policy to an Amazon S3 Multi-Region Access Point.\\n\\nIt is not possible to delete an access policy for a Multi-Region Access Point from the CloudFormation template. When you attempt to delete the policy, CloudFormation updates the policy using `DeletionPolicy:Retain` and `UpdateReplacePolicy:Retain` . CloudFormation updates the policy to only allow access to the account that created the bucket.","properties":{"MrapName":"The name of the Multi-Region Access Point.","Policy":"The access policy associated with the Multi-Region Access Point."}},"AWS::S3::MultiRegionAccessPointPolicy.PolicyStatus":{"attributes":{},"description":"The container element for a bucket\'s policy status.","properties":{"IsPublic":"The policy status for this bucket. `TRUE` indicates that this bucket is public. `FALSE` indicates that the bucket is not public."}},"AWS::S3::StorageLens":{"attributes":{"Ref":"When the logical ID of this resource is provided to the Ref intrinsic function, Ref returns the S3 Storage Lens configuration Id, such as `your-storage-lens-configuration-id` . For more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) .","StorageLensConfiguration.StorageLensArn":"This property contains the details of the ARN of the S3 Storage Lens configuration. This property is read-only."},"description":"The AWS::S3::StorageLens resource creates an Amazon S3 Storage Lens configuration.","properties":{"StorageLensConfiguration":"This resource contains the details Amazon S3 Storage Lens configuration.","Tags":"A set of tags (key–value pairs) to associate with the Storage Lens configuration."}},"AWS::S3::StorageLens.AccountLevel":{"attributes":{},"description":"This resource contains the details of the account-level metrics for Amazon S3 Storage Lens.","properties":{"ActivityMetrics":"This property contains the details of account-level activity metrics for S3 Storage Lens.","AdvancedCostOptimizationMetrics":"This property contains the details of account-level advanced cost optimization metrics for S3 Storage Lens.","AdvancedDataProtectionMetrics":"This property contains the details of account-level advanced data protection metrics for S3 Storage Lens.","BucketLevel":"This property contains the details of the account-level bucket-level configurations for Amazon S3 Storage Lens.","DetailedStatusCodesMetrics":"This property contains the details of account-level detailed status code metrics for S3 Storage Lens."}},"AWS::S3::StorageLens.ActivityMetrics":{"attributes":{},"description":"This resource enables Amazon S3 Storage Lens activity metrics. Activity metrics show details about how your storage is requested, such as requests (for example, All requests, Get requests, Put requests), bytes uploaded or downloaded, and errors.\\n\\nFor more information, see [Assessing your storage activity and usage with S3 Storage Lens](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html) in the *Amazon S3 User Guide* . For a complete list of metrics, see [S3 Storage Lens metrics glossary](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html) in the *Amazon S3 User Guide* .","properties":{"IsEnabled":"A property that indicates whether the activity metrics is enabled."}},"AWS::S3::StorageLens.AdvancedCostOptimizationMetrics":{"attributes":{},"description":"This resource enables Amazon S3 Storage Lens advanced cost optimization metrics. Advanced cost optimization metrics provide insights that you can use to manage and optimize your storage costs, for example, lifecycle rule counts for transitions, expirations, and incomplete multipart uploads.\\n\\nFor more information, see [Assessing your storage activity and usage with S3 Storage Lens](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html) in the *Amazon S3 User Guide* . For a complete list of metrics, see [S3 Storage Lens metrics glossary](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html) in the *Amazon S3 User Guide* .","properties":{"IsEnabled":"Indicates whether advanced cost optimization metrics are enabled."}},"AWS::S3::StorageLens.AdvancedDataProtectionMetrics":{"attributes":{},"description":"This resource enables Amazon S3 Storage Lens advanced data protection metrics. Advanced data protection metrics provide insights that you can use to perform audits and protect your data, for example replication rule counts within and across Regions.\\n\\nFor more information, see [Assessing your storage activity and usage with S3 Storage Lens](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html) in the *Amazon S3 User Guide* . For a complete list of metrics, see [S3 Storage Lens metrics glossary](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html) in the *Amazon S3 User Guide* .","properties":{"IsEnabled":"Indicates whether advanced data protection metrics are enabled."}},"AWS::S3::StorageLens.AwsOrg":{"attributes":{},"description":"This resource contains the details of the AWS Organization for Amazon S3 Storage Lens.","properties":{"Arn":"This resource contains the ARN of the AWS Organization."}},"AWS::S3::StorageLens.BucketLevel":{"attributes":{},"description":"A property for the bucket-level storage metrics for Amazon S3 Storage Lens.","properties":{"ActivityMetrics":"A property for bucket-level activity metrics for S3 Storage Lens.","AdvancedCostOptimizationMetrics":"A property for bucket-level advanced cost optimization metrics for S3 Storage Lens.","AdvancedDataProtectionMetrics":"A property for bucket-level advanced data protection metrics for S3 Storage Lens.","DetailedStatusCodesMetrics":"A property for bucket-level detailed status code metrics for S3 Storage Lens.","PrefixLevel":"A property for bucket-level prefix-level storage metrics for S3 Storage Lens."}},"AWS::S3::StorageLens.BucketsAndRegions":{"attributes":{},"description":"This resource contains the details of the buckets and Regions for the Amazon S3 Storage Lens configuration.","properties":{"Buckets":"This property contains the details of the buckets for the Amazon S3 Storage Lens configuration. This should be the bucket Amazon Resource Name(ARN). For valid values, see [Buckets ARN format here](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_Include.html#API_control_Include_Contents) in the *Amazon S3 API Reference* .","Regions":"This property contains the details of the Regions for the S3 Storage Lens configuration."}},"AWS::S3::StorageLens.CloudWatchMetrics":{"attributes":{},"description":"This resource enables the Amazon CloudWatch publishing option for Amazon S3 Storage Lens metrics.\\n\\nFor more information, see [Monitor S3 Storage Lens metrics in CloudWatch](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_view_metrics_cloudwatch.html) in the *Amazon S3 User Guide* .","properties":{"IsEnabled":"This property identifies whether the CloudWatch publishing option for S3 Storage Lens is enabled."}},"AWS::S3::StorageLens.DataExport":{"attributes":{},"description":"This resource contains the details of the Amazon S3 Storage Lens metrics export.","properties":{"CloudWatchMetrics":"This property enables the Amazon CloudWatch publishing option for S3 Storage Lens metrics.","S3BucketDestination":"This property contains the details of the bucket where the S3 Storage Lens metrics export will be placed."}},"AWS::S3::StorageLens.DetailedStatusCodesMetrics":{"attributes":{},"description":"This resource enables Amazon S3 Storage Lens detailed status code metrics. Detailed status code metrics generate metrics for HTTP status codes, such as `200 OK` , `403 Forbidden` , `503 Service Unavailable` and others.\\n\\nFor more information, see [Assessing your storage activity and usage with S3 Storage Lens](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html) in the *Amazon S3 User Guide* . For a complete list of metrics, see [S3 Storage Lens metrics glossary](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html) in the *Amazon S3 User Guide* .","properties":{"IsEnabled":"Indicates whether detailed status code metrics are enabled."}},"AWS::S3::StorageLens.Encryption":{"attributes":{},"description":"This resource contains the type of server-side encryption used to encrypt an Amazon S3 Storage Lens metrics export. For valid values, see the [StorageLensDataExportEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_StorageLensDataExportEncryption.html) in the *Amazon S3 API Reference* .","properties":{"SSEKMS":"Specifies the use of AWS Key Management Service keys (SSE-KMS) to encrypt the S3 Storage Lens metrics export file.","SSES3":"Specifies the use of an Amazon S3-managed key (SSE-S3) to encrypt the S3 Storage Lens metrics export file."}},"AWS::S3::StorageLens.PrefixLevel":{"attributes":{},"description":"This resource contains the details of the prefix-level of the Amazon S3 Storage Lens.","properties":{"StorageMetrics":"A property for the prefix-level storage metrics for Amazon S3 Storage Lens."}},"AWS::S3::StorageLens.PrefixLevelStorageMetrics":{"attributes":{},"description":"This resource contains the details of the prefix-level storage metrics for Amazon S3 Storage Lens.","properties":{"IsEnabled":"This property identifies whether the details of the prefix-level storage metrics for S3 Storage Lens are enabled.","SelectionCriteria":"This property identifies whether the details of the prefix-level storage metrics for S3 Storage Lens are enabled."}},"AWS::S3::StorageLens.S3BucketDestination":{"attributes":{},"description":"This resource contains the details of the bucket where the Amazon S3 Storage Lens metrics export will be placed.","properties":{"AccountId":"This property contains the details of the AWS account ID of the S3 Storage Lens export bucket destination.","Arn":"This property contains the details of the ARN of the bucket destination of the S3 Storage Lens export.","Encryption":"This property contains the details of the encryption of the bucket destination of the Amazon S3 Storage Lens metrics export.","Format":"This property contains the details of the format of the S3 Storage Lens export bucket destination.","OutputSchemaVersion":"This property contains the details of the output schema version of the S3 Storage Lens export bucket destination.","Prefix":"This property contains the details of the prefix of the bucket destination of the S3 Storage Lens export ."}},"AWS::S3::StorageLens.SSEKMS":{"attributes":{},"description":"Specifies the use of server-side encryption using an AWS Key Management Service key (SSE-KMS) to encrypt the delivered S3 Storage Lens metrics export file.","properties":{"KeyId":"Specifies the Amazon Resource Name (ARN) of the customer managed AWS KMS key to use for encrypting the S3 Storage Lens metrics export file. Amazon S3 only supports symmetric encryption keys. For more information, see [Special-purpose keys](https://docs.aws.amazon.com/kms/latest/developerguide/key-types.html) in the *AWS Key Management Service Developer Guide* ."}},"AWS::S3::StorageLens.SelectionCriteria":{"attributes":{},"description":"This resource contains the details of the Amazon S3 Storage Lens selection criteria.","properties":{"Delimiter":"This property contains the details of the S3 Storage Lens delimiter being used.","MaxDepth":"This property contains the details of the max depth that S3 Storage Lens will collect metrics up to.","MinStorageBytesPercentage":"This property contains the details of the minimum storage bytes percentage threshold that S3 Storage Lens will collect metrics up to."}},"AWS::S3::StorageLens.StorageLensConfiguration":{"attributes":{},"description":"This is the property of the Amazon S3 Storage Lens configuration.","properties":{"AccountLevel":"This property contains the details of the account-level metrics for Amazon S3 Storage Lens configuration.","AwsOrg":"This property contains the details of the AWS Organization for the S3 Storage Lens configuration.","DataExport":"This property contains the details of this S3 Storage Lens configuration\'s metrics export.","Exclude":"This property contains the details of the bucket and or Regions excluded for Amazon S3 Storage Lens configuration.","Id":"This property contains the details of the ID of the S3 Storage Lens configuration.","Include":"This property contains the details of the bucket and or Regions included for Amazon S3 Storage Lens configuration.","IsEnabled":"This property contains the details of whether the Amazon S3 Storage Lens configuration is enabled.","StorageLensArn":"This property contains the details of the ARN of the S3 Storage Lens configuration. This property is read-only."}},"AWS::S3ObjectLambda::AccessPoint":{"attributes":{"Alias":"The alias of the Object Lambda Access Point.","Alias.Status":"The status of the Object Lambda Access Point alias. Valid Values: `PROVISIONING` | `READY` .","Alias.Value":"The alias name value of the Object Lambda Access Point. For example: `myolap-1a4n8yjrb3kda96f67zwrwiiuse1a--ol-s3` .","Arn":"Specifies the ARN for the Object Lambda Access Point.","CreationDate":"The date and time when the specified Object Lambda Access Point was created.","PolicyStatus":"","PolicyStatus.IsPublic":"","PublicAccessBlockConfiguration":"","PublicAccessBlockConfiguration.BlockPublicAcls":"","PublicAccessBlockConfiguration.BlockPublicPolicy":"","PublicAccessBlockConfiguration.IgnorePublicAcls":"","PublicAccessBlockConfiguration.RestrictPublicBuckets":"","Ref":""},"description":"The `AWS::S3ObjectLambda::AccessPoint` resource specifies an Object Lambda Access Point used to access a bucket.","properties":{"Name":"The name of this access point.","ObjectLambdaConfiguration":"A configuration used when creating an Object Lambda Access Point."}},"AWS::S3ObjectLambda::AccessPoint.Alias":{"attributes":{},"description":"The alias of an Object Lambda Access Point. For more information, see [How to use a bucket-style alias for your S3 bucket Object Lambda Access Point](https://docs.aws.amazon.com/AmazonS3/latest/userguide/olap-use.html#ol-access-points-alias) .","properties":{"Status":"The status of the Object Lambda Access Point alias. If the status is `PROVISIONING` , the Object Lambda Access Point is provisioning the alias and the alias is not ready for use yet. If the status is `READY` , the Object Lambda Access Point alias is successfully provisioned and ready for use.","Value":"The alias value of the Object Lambda Access Point."}},"AWS::S3ObjectLambda::AccessPoint.AwsLambda":{"attributes":{},"description":"","properties":{"FunctionArn":"","FunctionPayload":""}},"AWS::S3ObjectLambda::AccessPoint.ContentTransformation":{"attributes":{},"description":"","properties":{"AwsLambda":""}},"AWS::S3ObjectLambda::AccessPoint.ObjectLambdaConfiguration":{"attributes":{},"description":"A configuration used when creating an Object Lambda Access Point.","properties":{"AllowedFeatures":"A container for allowed features. Valid inputs are `GetObject-Range` , `GetObject-PartNumber` , `HeadObject-Range` , and `HeadObject-PartNumber` .","CloudWatchMetricsEnabled":"A container for whether the CloudWatch metrics configuration is enabled.","SupportingAccessPoint":"Standard access point associated with the Object Lambda Access Point.","TransformationConfigurations":"A container for transformation configurations for an Object Lambda Access Point."}},"AWS::S3ObjectLambda::AccessPoint.PolicyStatus":{"attributes":{},"description":"Indicates whether this access point policy is public. For more information about how Amazon S3 evaluates policies to determine whether they are public, see [The Meaning of \\"Public\\"](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status) in the *Amazon S3 User Guide* .","properties":{"IsPublic":""}},"AWS::S3ObjectLambda::AccessPoint.PublicAccessBlockConfiguration":{"attributes":{},"description":"The `PublicAccessBlock` configuration that you want to apply to this Amazon S3 account. You can enable the configuration options in any combination. For more information about when Amazon S3 considers a bucket or object public, see [The Meaning of \\"Public\\"](https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status) in the *Amazon S3 User Guide* .\\n\\nThis data type is not supported for Amazon S3 on Outposts.","properties":{"BlockPublicAcls":"Specifies whether Amazon S3 should block public access control lists (ACLs) for buckets in this account. Setting this element to `TRUE` causes the following behavior:\\n\\n- `PutBucketAcl` and `PutObjectAcl` calls fail if the specified ACL is public.\\n- PUT Object calls fail if the request includes a public ACL.\\n- PUT Bucket calls fail if the request includes a public ACL.\\n\\nEnabling this setting doesn\'t affect existing policies or ACLs.\\n\\nThis property is not supported for Amazon S3 on Outposts.","BlockPublicPolicy":"Specifies whether Amazon S3 should block public bucket policies for buckets in this account. Setting this element to `TRUE` causes Amazon S3 to reject calls to PUT Bucket policy if the specified bucket policy allows public access.\\n\\nEnabling this setting doesn\'t affect existing bucket policies.\\n\\nThis property is not supported for Amazon S3 on Outposts.","IgnorePublicAcls":"Specifies whether Amazon S3 should ignore public ACLs for buckets in this account. Setting this element to `TRUE` causes Amazon S3 to ignore all public ACLs on buckets in this account and any objects that they contain.\\n\\nEnabling this setting doesn\'t affect the persistence of any existing ACLs and doesn\'t prevent new public ACLs from being set.\\n\\nThis property is not supported for Amazon S3 on Outposts.","RestrictPublicBuckets":"Specifies whether Amazon S3 should restrict public bucket policies for buckets in this account. Setting this element to `TRUE` restricts access to buckets with public policies to only AWS service principals and authorized users within this account.\\n\\nEnabling this setting doesn\'t affect previously stored bucket policies, except that public and cross-account access within any public bucket policy, including non-public delegation to specific accounts, is blocked.\\n\\nThis property is not supported for Amazon S3 on Outposts."}},"AWS::S3ObjectLambda::AccessPoint.TransformationConfiguration":{"attributes":{},"description":"A configuration used when creating an Object Lambda Access Point transformation.","properties":{"Actions":"A container for the action of an Object Lambda Access Point configuration. Valid inputs are `GetObject` , `HeadObject` , `ListObject` , and `ListObjectV2` .","ContentTransformation":"A container for the content transformation of an Object Lambda Access Point configuration. Can include the FunctionArn and FunctionPayload. For more information, see [AwsLambdaTransformation](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_AwsLambdaTransformation.html) in the *Amazon S3 API Reference* ."}},"AWS::S3ObjectLambda::AccessPointPolicy":{"attributes":{"Ref":""},"description":"The `AWS::S3ObjectLambda::AccessPointPolicy` resource specifies the Object Lambda Access Point resource policy document.","properties":{"ObjectLambdaAccessPoint":"An access point with an attached AWS Lambda function used to access transformed data from an Amazon S3 bucket.","PolicyDocument":"Object Lambda Access Point resource policy document."}},"AWS::S3Outposts::AccessPoint":{"attributes":{"Arn":"This resource contains the details of the S3 on Outposts bucket access point ARN. This resource is read-only.","Ref":"`Ref` returns the access point ARN."},"description":"The AWS::S3Outposts::AccessPoint resource specifies an access point and associates it with the specified Amazon S3 on Outposts bucket. For more information, see [Managing data access with Amazon S3 access points](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html) .\\n\\n> S3 on Outposts supports only VPC-style access points.","properties":{"Bucket":"The Amazon Resource Name (ARN) of the S3 on Outposts bucket that is associated with this access point.","Name":"The name of this access point.","Policy":"The access point policy associated with this access point.","VpcConfiguration":"The virtual private cloud (VPC) configuration for this access point, if one exists."}},"AWS::S3Outposts::AccessPoint.VpcConfiguration":{"attributes":{},"description":"Contains the virtual private cloud (VPC) configuration for the specified access point.","properties":{"VpcId":"The ID of the VPC configuration."}},"AWS::S3Outposts::Bucket":{"attributes":{"Arn":"Returns the ARN of the specified bucket.\\n\\nExample: `arn:aws:s3Outposts:::DOC-EXAMPLE-BUCKET`","Ref":"`Ref` returns the S3 on Outposts bucket Amazon Resource Name (ARN)."},"description":"The AWS::S3Outposts::Bucket resource specifies a new Amazon S3 on Outposts bucket. To create an S3 on Outposts bucket, you must have S3 on Outposts capacity provisioned on your Outpost. For more information, see [Using Amazon S3 on Outposts](https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html) .\\n\\nS3 on Outposts buckets support the following:\\n\\n- Tags\\n- Lifecycle configuration rules for deleting expired objects\\n\\nFor a complete list of restrictions and Amazon S3 feature limitations on S3 on Outposts, see [Amazon S3 on Outposts Restrictions and Limitations](https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OnOutpostsRestrictionsLimitations.html) .","properties":{"BucketName":"A name for the S3 on Outposts bucket. If you don\'t specify a name, AWS CloudFormation generates a unique ID and uses that ID for the bucket name. The bucket name must contain only lowercase letters, numbers, periods (.), and dashes (-) and must follow [Amazon S3 bucket restrictions and limitations](https://docs.aws.amazon.com/AmazonS3/latest/userguide/BucketRestrictions.html) . For more information, see [Bucket naming rules](https://docs.aws.amazon.com/AmazonS3/latest/userguide/BucketRestrictions.html#bucketnamingrules) .\\n\\n> If you specify a name, you can\'t perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you need to replace the resource, specify a new name.","LifecycleConfiguration":"Creates a new lifecycle configuration for the S3 on Outposts bucket or replaces an existing lifecycle configuration. Outposts buckets only support lifecycle configurations that delete/expire objects after a certain period of time and abort incomplete multipart uploads.","OutpostId":"The ID of the Outpost of the specified bucket.","Tags":"Sets the tags for an S3 on Outposts bucket. For more information, see [Using Amazon S3 on Outposts](https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html) .\\n\\nUse tags to organize your AWS bill to reflect your own cost structure. To do this, sign up to get your AWS account bill with tag key values included. Then, to see the cost of combined resources, organize your billing information according to resources with the same tag key values. For example, you can tag several resources with a specific application name, and then organize your billing information to see the total cost of that application across several services. For more information, see [Cost allocation and tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html) .\\n\\n> Within a bucket, if you add a tag that has the same key as an existing tag, the new value overwrites the old value. For more information, see [Using cost allocation and bucket tags](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CostAllocTagging.html) . \\n\\nTo use this resource, you must have permissions to perform the `s3-outposts:PutBucketTagging` . The S3 on Outposts bucket owner has this permission by default and can grant this permission to others. For more information about permissions, see [Permissions Related to Bucket Subresource Operations](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources) and [Managing access permissions to your Amazon S3 resources](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html) ."}},"AWS::S3Outposts::Bucket.AbortIncompleteMultipartUpload":{"attributes":{},"description":"Specifies the days since the initiation of an incomplete multipart upload that Amazon S3 on Outposts waits before permanently removing all parts of the upload. For more information, see [Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Policy](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config) .","properties":{"DaysAfterInitiation":"Specifies the number of days after initiation that Amazon S3 on Outposts aborts an incomplete multipart upload."}},"AWS::S3Outposts::Bucket.Filter":{"attributes":{},"description":"","properties":{"AndOperator":"","Prefix":"","Tag":""}},"AWS::S3Outposts::Bucket.FilterAndOperator":{"attributes":{},"description":"","properties":{"Prefix":"","Tags":""}},"AWS::S3Outposts::Bucket.FilterTag":{"attributes":{},"description":"","properties":{"Key":"","Value":""}},"AWS::S3Outposts::Bucket.LifecycleConfiguration":{"attributes":{},"description":"The container for the lifecycle configuration for the objects stored in an S3 on Outposts bucket.","properties":{"Rules":"The container for the lifecycle configuration rules for the objects stored in the S3 on Outposts bucket."}},"AWS::S3Outposts::Bucket.Rule":{"attributes":{},"description":"A container for an Amazon S3 on Outposts bucket lifecycle rule.","properties":{"AbortIncompleteMultipartUpload":"The container for the abort incomplete multipart upload rule.","ExpirationDate":"Specifies the expiration for the lifecycle of the object by specifying an expiry date.","ExpirationInDays":"Specifies the expiration for the lifecycle of the object in the form of days that the object has been in the S3 on Outposts bucket.","Filter":"The container for the filter of the lifecycle rule.","Id":"The unique identifier for the lifecycle rule. The value can\'t be longer than 255 characters.","Status":"If `Enabled` , the rule is currently being applied. If `Disabled` , the rule is not currently being applied."}},"AWS::S3Outposts::BucketPolicy":{"attributes":{"Ref":"`Ref` returns the S3 on Outposts bucket Amazon Resource Name (ARN)."},"description":"This resource applies a bucket policy to an Amazon S3 on Outposts bucket.\\n\\nIf you are using an identity other than the root user of the AWS account that owns the S3 on Outposts bucket, the calling identity must have the `s3-outposts:PutBucketPolicy` permissions on the specified Outposts bucket and belong to the bucket owner\'s account in order to use this resource.\\n\\nIf you don\'t have `s3-outposts:PutBucketPolicy` permissions, S3 on Outposts returns a `403 Access Denied` error.\\n\\n> The root user of the AWS account that owns an Outposts bucket can *always* use this resource, even if the policy explicitly denies the root user the ability to perform actions on this resource. \\n\\nFor more information, see the AWS::IAM::Policy [PolicyDocument](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html#cfn-iam-policy-policydocument) resource description in this guide and [Access Policy Language Overview](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html) .","properties":{"Bucket":"The name of the Amazon S3 Outposts bucket to which the policy applies.","PolicyDocument":"A policy document containing permissions to add to the specified bucket. In IAM, you must provide policy documents in JSON format. However, in CloudFormation, you can provide the policy in JSON or YAML format because CloudFormation converts YAML to JSON before submitting it to IAM. For more information, see the AWS::IAM::Policy [PolicyDocument](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html#cfn-iam-policy-policydocument) resource description in this guide and [Access Policy Language Overview](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html) ."}},"AWS::S3Outposts::Endpoint":{"attributes":{"Arn":"The ARN of the endpoint.","CidrBlock":"The VPC CIDR block committed by this endpoint.","CreationTime":"The time the endpoint was created.","Id":"The ID of the endpoint.","NetworkInterfaces":"The network interface of the endpoint.","Ref":"`Ref` returns the Amazon Resource Name (ARN) for the endpoint.","Status":"The status of the endpoint."},"description":"This AWS::S3Outposts::Endpoint resource specifies an endpoint and associates it with the specified Outpost.\\n\\nAmazon S3 on Outposts access points simplify managing data access at scale for shared datasets in S3 on Outposts. S3 on Outposts uses endpoints to connect to S3 on Outposts buckets so that you can perform actions within your virtual private cloud (VPC). For more information, see [Accessing S3 on Outposts using VPC-only access points](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AccessingS3Outposts.html) .\\n\\n> It can take up to 5 minutes for this resource to be created.","properties":{"AccessType":"The container for the type of connectivity used to access the Amazon S3 on Outposts endpoint. To use the Amazon VPC , choose `Private` . To use the endpoint with an on-premises network, choose `CustomerOwnedIp` . If you choose `CustomerOwnedIp` , you must also provide the customer-owned IP address pool (CoIP pool).\\n\\n> `Private` is the default access type value.","CustomerOwnedIpv4Pool":"The ID of the customer-owned IPv4 address pool (CoIP pool) for the endpoint. IP addresses are allocated from this pool for the endpoint.","FailedReason":"","OutpostId":"The ID of the Outpost.","SecurityGroupId":"The ID of the security group to use with the endpoint.","SubnetId":"The ID of the subnet."}},"AWS::S3Outposts::Endpoint.FailedReason":{"attributes":{},"description":"","properties":{"ErrorCode":"","Message":""}},"AWS::S3Outposts::Endpoint.NetworkInterface":{"attributes":{},"description":"The container for the network interface.","properties":{"NetworkInterfaceId":"The ID for the network interface."}},"AWS::SDB::Domain":{"attributes":{"Ref":"`Ref` returns the value of the `DomainName` , such as: `Domain1-123456789012` ."},"description":"Use the `AWS::SDB::Domain` resource to declare a SimpleDB domain. When you specify `AWS::SDB::Domain` as an argument in a `Ref` function, AWS CloudFormation returns the value of the `DomainName` .\\n\\n> The `AWS::SDB::Domain` resource does not allow any updates, including metadata updates.","properties":{"Description":"Information about the SimpleDB domain."}},"AWS::SES::ConfigurationSet":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"Configuration sets let you create groups of rules that you can apply to the emails you send using Amazon SES. For more information about using configuration sets, see [Using Amazon SES Configuration Sets](https://docs.aws.amazon.com/ses/latest/dg/using-configuration-sets.html) in the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/) .\\n\\n> *Required permissions:*\\n> \\n> To apply any of the resource options, you will need to have the corresponding AWS Identity and Access Management (IAM) SES API v2 permissions:\\n> \\n> - `ses:GetConfigurationSet`\\n> \\n> - (This permission is replacing the v1 *ses:DescribeConfigurationSet* permission which will not work with these v2 resource options.)\\n> - `ses:PutConfigurationSetDeliveryOptions`\\n> - `ses:PutConfigurationSetReputationOptions`\\n> - `ses:PutConfigurationSetSendingOptions`\\n> - `ses:PutConfigurationSetSuppressionOptions`\\n> - `ses:PutConfigurationSetTrackingOptions`","properties":{"DeliveryOptions":"Specifies whether messages that use the configuration set are required to use Transport Layer Security (TLS).","Name":"The name of the configuration set. The name must meet the following requirements:\\n\\n- Contain only letters (a-z, A-Z), numbers (0-9), underscores (_), or dashes (-).\\n- Contain 64 characters or fewer.","ReputationOptions":"An object that represents the reputation settings for the configuration set.","SendingOptions":"An object that defines whether or not Amazon SES can send email that you send using the configuration set.","SuppressionOptions":"An object that contains information about the suppression list preferences for your account.","TrackingOptions":"The name of the custom open and click tracking domain associated with the configuration set.","VdmOptions":"The Virtual Deliverability Manager (VDM) options that apply to the configuration set."}},"AWS::SES::ConfigurationSet.DashboardOptions":{"attributes":{},"description":"Settings for your VDM configuration as applicable to the Dashboard.","properties":{"EngagementMetrics":"Specifies the status of your VDM engagement metrics collection. Can be one of the following:\\n\\n- `ENABLED` – Amazon SES enables engagement metrics for the configuration set.\\n- `DISABLED` – Amazon SES disables engagement metrics for the configuration set."}},"AWS::SES::ConfigurationSet.DeliveryOptions":{"attributes":{},"description":"Specifies whether messages that use the configuration set are required to use Transport Layer Security (TLS).","properties":{"SendingPoolName":"The name of the dedicated IP pool to associate with the configuration set.","TlsPolicy":"Specifies whether messages that use the configuration set are required to use Transport Layer Security (TLS). If the value is `REQUIRE` , messages are only delivered if a TLS connection can be established. If the value is `OPTIONAL` , messages can be delivered in plain text if a TLS connection can\'t be established.\\n\\nValid Values: `REQUIRE | OPTIONAL`"}},"AWS::SES::ConfigurationSet.GuardianOptions":{"attributes":{},"description":"Settings for your VDM configuration as applicable to the Guardian.","properties":{"OptimizedSharedDelivery":"Specifies the status of your VDM optimized shared delivery. Can be one of the following:\\n\\n- `ENABLED` – Amazon SES enables optimized shared delivery for the configuration set.\\n- `DISABLED` – Amazon SES disables optimized shared delivery for the configuration set."}},"AWS::SES::ConfigurationSet.ReputationOptions":{"attributes":{},"description":"Contains information about the reputation settings for a configuration set.","properties":{"ReputationMetricsEnabled":"Describes whether or not Amazon SES publishes reputation metrics for the configuration set, such as bounce and complaint rates, to Amazon CloudWatch.\\n\\nIf the value is `true` , reputation metrics are published. If the value is `false` , reputation metrics are not published. The default value is `false` ."}},"AWS::SES::ConfigurationSet.SendingOptions":{"attributes":{},"description":"Used to enable or disable email sending for messages that use this configuration set in the current AWS Region.","properties":{"SendingEnabled":"If `true` , email sending is enabled for the configuration set. If `false` , email sending is disabled for the configuration set."}},"AWS::SES::ConfigurationSet.SuppressionOptions":{"attributes":{},"description":"An object that contains information about the suppression list preferences for your account.","properties":{"SuppressedReasons":"A list that contains the reasons that email addresses are automatically added to the suppression list for your account. This list can contain any or all of the following:\\n\\n- `COMPLAINT` – Amazon SES adds an email address to the suppression list for your account when a message sent to that address results in a complaint.\\n- `BOUNCE` – Amazon SES adds an email address to the suppression list for your account when a message sent to that address results in a hard bounce."}},"AWS::SES::ConfigurationSet.TrackingOptions":{"attributes":{},"description":"A domain that is used to redirect email recipients to an Amazon SES-operated domain. This domain captures open and click events generated by Amazon SES emails.\\n\\nFor more information, see [Configuring Custom Domains to Handle Open and Click Tracking](https://docs.aws.amazon.com/ses/latest/dg/configure-custom-open-click-domains.html) in the *Amazon SES Developer Guide* .","properties":{"CustomRedirectDomain":"The custom subdomain that is used to redirect email recipients to the Amazon SES event tracking domain."}},"AWS::SES::ConfigurationSet.VdmOptions":{"attributes":{},"description":"The Virtual Deliverability Manager (VDM) options that apply to a configuration set.","properties":{"DashboardOptions":"Settings for your VDM configuration as applicable to the Dashboard.","GuardianOptions":"Settings for your VDM configuration as applicable to the Guardian."}},"AWS::SES::ConfigurationSetEventDestination":{"attributes":{"Id":""},"description":"Specifies a configuration set event destination. An event destination is an AWS service that Amazon SES publishes email sending events to. When you specify an event destination, you provide one, and only one, destination. You can send event data to Amazon CloudWatch, Amazon Kinesis Data Firehose, or Amazon Simple Notification Service (Amazon SNS).","properties":{"ConfigurationSetName":"The name of the configuration set that contains the event destination.","EventDestination":"The event destination object."}},"AWS::SES::ConfigurationSetEventDestination.CloudWatchDestination":{"attributes":{},"description":"Contains information associated with an Amazon CloudWatch event destination to which email sending events are published.\\n\\nEvent destinations, such as Amazon CloudWatch, are associated with configuration sets, which enable you to publish email sending events. For information about using configuration sets, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/monitor-sending-activity.html) .","properties":{"DimensionConfigurations":"A list of dimensions upon which to categorize your emails when you publish email sending events to Amazon CloudWatch."}},"AWS::SES::ConfigurationSetEventDestination.DimensionConfiguration":{"attributes":{},"description":"Contains the dimension configuration to use when you publish email sending events to Amazon CloudWatch.\\n\\nFor information about publishing email sending events to Amazon CloudWatch, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/monitor-sending-activity.html) .","properties":{"DefaultDimensionValue":"The default value of the dimension that is published to Amazon CloudWatch if you do not provide the value of the dimension when you send an email. The default value must meet the following requirements:\\n\\n- Contain only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_), dashes (-), at signs (@), or periods (.).\\n- Contain 256 characters or fewer.","DimensionName":"The name of an Amazon CloudWatch dimension associated with an email sending metric. The name must meet the following requirements:\\n\\n- Contain only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_), dashes (-), or colons (:).\\n- Contain 256 characters or fewer.","DimensionValueSource":"The place where Amazon SES finds the value of a dimension to publish to Amazon CloudWatch. To use the message tags that you specify using an `X-SES-MESSAGE-TAGS` header or a parameter to the `SendEmail` / `SendRawEmail` API, specify `messageTag` . To use your own email headers, specify `emailHeader` . To put a custom tag on any link included in your email, specify `linkTag` ."}},"AWS::SES::ConfigurationSetEventDestination.EventDestination":{"attributes":{},"description":"Contains information about an event destination.\\n\\n> When you create or update an event destination, you must provide one, and only one, destination. The destination can be Amazon CloudWatch, Amazon Kinesis Firehose or Amazon Simple Notification Service (Amazon SNS). \\n\\nEvent destinations are associated with configuration sets, which enable you to publish email sending events to Amazon CloudWatch, Amazon Kinesis Firehose, or Amazon Simple Notification Service (Amazon SNS). For information about using configuration sets, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/monitor-sending-activity.html) .","properties":{"CloudWatchDestination":"An object that contains the names, default values, and sources of the dimensions associated with an Amazon CloudWatch event destination.","Enabled":"Sets whether Amazon SES publishes events to this destination when you send an email with the associated configuration set. Set to `true` to enable publishing to this destination; set to `false` to prevent publishing to this destination. The default value is `false` .","KinesisFirehoseDestination":"An object that contains the delivery stream ARN and the IAM role ARN associated with an Amazon Kinesis Firehose event destination.","MatchingEventTypes":"The type of email sending events to publish to the event destination.\\n\\n- `send` - The send request was successful and SES will attempt to deliver the message to the recipient’s mail server. (If account-level or global suppression is being used, SES will still count it as a send, but delivery is suppressed.)\\n- `reject` - SES accepted the email, but determined that it contained a virus and didn’t attempt to deliver it to the recipient’s mail server.\\n- `bounce` - ( *Hard bounce* ) The recipient\'s mail server permanently rejected the email. ( *Soft bounces* are only included when SES fails to deliver the email after retrying for a period of time.)\\n- `complaint` - The email was successfully delivered to the recipient’s mail server, but the recipient marked it as spam.\\n- `delivery` - SES successfully delivered the email to the recipient\'s mail server.\\n- `open` - The recipient received the message and opened it in their email client.\\n- `click` - The recipient clicked one or more links in the email.\\n- `renderingFailure` - The email wasn\'t sent because of a template rendering issue. This event type can occur when template data is missing, or when there is a mismatch between template parameters and data. (This event type only occurs when you send email using the [`SendTemplatedEmail`](https://docs.aws.amazon.com/ses/latest/APIReference/API_SendTemplatedEmail.html) or [`SendBulkTemplatedEmail`](https://docs.aws.amazon.com/ses/latest/APIReference/API_SendBulkTemplatedEmail.html) API operations.)\\n- `deliveryDelay` - The email couldn\'t be delivered to the recipient’s mail server because a temporary issue occurred. Delivery delays can occur, for example, when the recipient\'s inbox is full, or when the receiving email server experiences a transient issue.\\n- `subscription` - The email was successfully delivered, but the recipient updated their subscription preferences by clicking on an *unsubscribe* link as part of your [subscription management](https://docs.aws.amazon.com/ses/latest/dg/sending-email-subscription-management.html) .","Name":"The name of the event destination. The name must meet the following requirements:\\n\\n- Contain only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_), or dashes (-).\\n- Contain 64 characters or fewer.","SnsDestination":"An object that contains the topic ARN associated with an Amazon Simple Notification Service (Amazon SNS) event destination."}},"AWS::SES::ConfigurationSetEventDestination.KinesisFirehoseDestination":{"attributes":{},"description":"Contains the delivery stream ARN and the IAM role ARN associated with an Amazon Kinesis Firehose event destination.\\n\\nEvent destinations, such as Amazon Kinesis Firehose, are associated with configuration sets, which enable you to publish email sending events. For information about using configuration sets, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/monitor-sending-activity.html) .","properties":{"DeliveryStreamARN":"The ARN of the Amazon Kinesis Firehose stream that email sending events should be published to.","IAMRoleARN":"The ARN of the IAM role under which Amazon SES publishes email sending events to the Amazon Kinesis Firehose stream."}},"AWS::SES::ConfigurationSetEventDestination.SnsDestination":{"attributes":{},"description":"Contains the topic ARN associated with an Amazon Simple Notification Service (Amazon SNS) event destination.\\n\\nEvent destinations, such as Amazon SNS, are associated with configuration sets, which enable you to publish email sending events. For information about using configuration sets, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/monitor-sending-activity.html) .","properties":{"TopicARN":"The ARN of the Amazon SNS topic for email sending events. You can find the ARN of a topic by using the [ListTopics](https://docs.aws.amazon.com/sns/latest/api/API_ListTopics.html) Amazon SNS operation.\\n\\nFor more information about Amazon SNS topics, see the [Amazon SNS Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) ."}},"AWS::SES::ContactList":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic Ref function, Ref returns the resource name. For example:\\n\\n`{ \\"Ref\\" : \\"ContactListName\\" }`\\n\\nFor the Amazon SES ContactList, `Ref` returns the name of the contact list."},"description":"A list that contains contacts that have subscribed to a particular topic or topics.","properties":{"ContactListName":"The name of the contact list.","Description":"A description of what the contact list is about.","Tags":"The tags associated with a contact list.","Topics":"An interest group, theme, or label within a list. A contact list can have multiple topics."}},"AWS::SES::ContactList.Topic":{"attributes":{},"description":"An interest group, theme, or label within a list. Lists can have multiple topics.","properties":{"DefaultSubscriptionStatus":"The default subscription status to be applied to a contact if the contact has not noted their preference for subscribing to a topic.","Description":"A description of what the topic is about, which the contact will see.","DisplayName":"The name of the topic the contact will see.","TopicName":"The name of the topic."}},"AWS::SES::DedicatedIpPool":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"Create a new pool of dedicated IP addresses. A pool can include one or more dedicated IP addresses that are associated with your AWS account . You can associate a pool with a configuration set. When you send an email that uses that configuration set, the message is sent from one of the addresses in the associated pool.\\n\\n> You can\'t delete dedicated IP pools that have a `STANDARD` scaling mode with one or more dedicated IP addresses. This constraint doesn\'t apply to dedicated IP pools that have a `MANAGED` scaling mode.","properties":{"PoolName":"The name of the dedicated IP pool that the IP address is associated with.","ScalingMode":"The type of scaling mode.\\n\\nThe following options are available:\\n\\n- `STANDARD` - The customer controls which IPs are part of the dedicated IP pool.\\n- `MANAGED` - The reputation and number of IPs are automatically managed by Amazon SES .\\n\\nThe `STANDARD` option is selected by default if no value is specified.\\n\\n> Updating *ScalingMode* doesn\'t require a replacement if you\'re updating its value from `STANDARD` to `MANAGED` . However, updating *ScalingMode* from `MANAGED` to `STANDARD` is not supported."}},"AWS::SES::EmailIdentity":{"attributes":{"DkimDNSTokenName1":"The host name for the first token that you have to add to the DNS configuration for your domain.","DkimDNSTokenName2":"The host name for the second token that you have to add to the DNS configuration for your domain.","DkimDNSTokenName3":"The host name for the third token that you have to add to the DNS configuration for your domain.","DkimDNSTokenValue1":"The record value for the first token that you have to add to the DNS configuration for your domain.","DkimDNSTokenValue2":"The record value for the second token that you have to add to the DNS configuration for your domain.","DkimDNSTokenValue3":"The record value for the third token that you have to add to the DNS configuration for your domain.","Ref":"`Ref` returns the resource name."},"description":"Specifies an identity for using within SES. An identity is an email address or domain that you use when you send email. Before you can use an identity to send email, you first have to verify it. By verifying an identity, you demonstrate that you\'re the owner of the identity, and that you\'ve given Amazon SES API v2 permission to send email from the identity.\\n\\nWhen you verify an email address, SES sends an email to the address. Your email address is verified as soon as you follow the link in the verification email. When you verify a domain without specifying the DkimSigningAttributes properties, OR only the NextSigningKeyLength property of DkimSigningAttributes, this resource provides a set of CNAME token names and values (DkimDNSTokenName1, DkimDNSTokenValue1, DkimDNSTokenName2, DkimDNSTokenValue2, DkimDNSTokenName3, DkimDNSTokenValue3) as outputs. You can then add these to the DNS configuration for your domain. Your domain is verified when Amazon SES detects these records in the DNS configuration for your domain. This verification method is known as Easy DKIM.\\n\\nAlternatively, you can perform the verification process by providing your own public-private key pair. This verification method is known as Bring Your Own DKIM (BYODKIM). To use BYODKIM, your resource must include DkimSigningAttributes properties DomainSigningSelector and DomainSigningPrivateKey. When you specify this object, you provide a selector (DomainSigningSelector) (a component of the DNS record name that identifies the public key to use for DKIM authentication) and a private key (DomainSigningPrivateKey).\\n\\nAdditionally, you can associate an existing configuration set with the email identity that you\'re verifying.","properties":{"ConfigurationSetAttributes":"Used to associate a configuration set with an email identity.","DkimAttributes":"An object that contains information about the DKIM attributes for the identity.","DkimSigningAttributes":"If your request includes this object, Amazon SES configures the identity to use Bring Your Own DKIM (BYODKIM) for DKIM authentication purposes, or, configures the key length to be used for [Easy DKIM](https://docs.aws.amazon.com/ses/latest/dg/send-email-authentication-dkim-easy.html) .","EmailIdentity":"The email address or domain to verify.","FeedbackAttributes":"Used to enable or disable feedback forwarding for an identity.","MailFromAttributes":"Used to enable or disable the custom Mail-From domain configuration for an email identity."}},"AWS::SES::EmailIdentity.ConfigurationSetAttributes":{"attributes":{},"description":"Used to associate a configuration set with an email identity.","properties":{"ConfigurationSetName":"The configuration set to associate with an email identity."}},"AWS::SES::EmailIdentity.DkimAttributes":{"attributes":{},"description":"Used to enable or disable DKIM authentication for an email identity.","properties":{"SigningEnabled":"Sets the DKIM signing configuration for the identity.\\n\\nWhen you set this value `true` , then the messages that are sent from the identity are signed using DKIM. If you set this value to `false` , your messages are sent without DKIM signing."}},"AWS::SES::EmailIdentity.DkimSigningAttributes":{"attributes":{},"description":"Used to configure or change the DKIM authentication settings for an email domain identity. You can use this operation to do any of the following:\\n\\n- Update the signing attributes for an identity that uses Bring Your Own DKIM (BYODKIM).\\n- Update the key length that should be used for Easy DKIM.\\n- Change from using no DKIM authentication to using Easy DKIM.\\n- Change from using no DKIM authentication to using BYODKIM.\\n- Change from using Easy DKIM to using BYODKIM.\\n- Change from using BYODKIM to using Easy DKIM.","properties":{"DomainSigningPrivateKey":"[Bring Your Own DKIM] A private key that\'s used to generate a DKIM signature.\\n\\nThe private key must use 1024 or 2048-bit RSA encryption, and must be encoded using base64 encoding.\\n\\n> Rather than embedding sensitive information directly in your CFN templates, we recommend you use dynamic parameters in the stack template to reference sensitive information that is stored and managed outside of CFN, such as in the AWS Systems Manager Parameter Store or AWS Secrets Manager.\\n> \\n> For more information, see the [Do not embed credentials in your templates](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html#creds) best practice.","DomainSigningSelector":"[Bring Your Own DKIM] A string that\'s used to identify a public key in the DNS configuration for a domain.","NextSigningKeyLength":"[Easy DKIM] The key length of the future DKIM key pair to be generated. This can be changed at most once per day.\\n\\nValid Values: `RSA_1024_BIT | RSA_2048_BIT`"}},"AWS::SES::EmailIdentity.FeedbackAttributes":{"attributes":{},"description":"Used to enable or disable feedback forwarding for an identity. This setting determines what happens when an identity is used to send an email that results in a bounce or complaint event.","properties":{"EmailForwardingEnabled":"Sets the feedback forwarding configuration for the identity.\\n\\nIf the value is `true` , you receive email notifications when bounce or complaint events occur. These notifications are sent to the address that you specified in the `Return-Path` header of the original email.\\n\\nYou\'re required to have a method of tracking bounces and complaints. If you haven\'t set up another mechanism for receiving bounce or complaint notifications (for example, by setting up an event destination), you receive an email notification when these events occur (even if this setting is disabled)."}},"AWS::SES::EmailIdentity.MailFromAttributes":{"attributes":{},"description":"Used to enable or disable the custom Mail-From domain configuration for an email identity.","properties":{"BehaviorOnMxFailure":"The action to take if the required MX record isn\'t found when you send an email. When you set this value to `USE_DEFAULT_VALUE` , the mail is sent using *amazonses.com* as the MAIL FROM domain. When you set this value to `REJECT_MESSAGE` , the Amazon SES API v2 returns a `MailFromDomainNotVerified` error, and doesn\'t attempt to deliver the email.\\n\\nThese behaviors are taken when the custom MAIL FROM domain configuration is in the `Pending` , `Failed` , and `TemporaryFailure` states.\\n\\nValid Values: `USE_DEFAULT_VALUE | REJECT_MESSAGE`","MailFromDomain":"The custom MAIL FROM domain that you want the verified identity to use. The MAIL FROM domain must meet the following criteria:\\n\\n- It has to be a subdomain of the verified identity.\\n- It can\'t be used to receive email.\\n- It can\'t be used in a \\"From\\" address if the MAIL FROM domain is a destination for feedback forwarding emails."}},"AWS::SES::ReceiptFilter":{"attributes":{},"description":"Specify a new IP address filter. You use IP address filters when you receive email with Amazon SES.","properties":{"Filter":"A data structure that describes the IP address filter to create, which consists of a name, an IP address range, and whether to allow or block mail from it."}},"AWS::SES::ReceiptFilter.Filter":{"attributes":{},"description":"Specifies an IP address filter.","properties":{"IpFilter":"A structure that provides the IP addresses to block or allow, and whether to block or allow incoming mail from them.","Name":"The name of the IP address filter. The name must meet the following requirements:\\n\\n- Contain only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_), or dashes (-).\\n- Start and end with a letter or number.\\n- Contain 64 characters or fewer."}},"AWS::SES::ReceiptFilter.IpFilter":{"attributes":{},"description":"A receipt IP address filter enables you to specify whether to accept or reject mail originating from an IP address or range of IP addresses.\\n\\nFor information about setting up IP address filters, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-ip-filtering-console-walkthrough.html) .","properties":{"Cidr":"A single IP address or a range of IP addresses to block or allow, specified in Classless Inter-Domain Routing (CIDR) notation. An example of a single email address is 10.0.0.1. An example of a range of IP addresses is 10.0.0.1/24. For more information about CIDR notation, see [RFC 2317](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc2317) .","Policy":"Indicates whether to block or allow incoming mail from the specified IP addresses."}},"AWS::SES::ReceiptRule":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"Specifies a receipt rule.","properties":{"After":"The name of an existing rule after which the new rule is placed. If this parameter is null, the new rule is inserted at the beginning of the rule list.","Rule":"A data structure that contains the specified rule\'s name, actions, recipients, domains, enabled status, scan status, and TLS policy.","RuleSetName":"The name of the rule set where the receipt rule is added."}},"AWS::SES::ReceiptRule.Action":{"attributes":{},"description":"An action that Amazon SES can take when it receives an email on behalf of one or more email addresses or domains that you own. An instance of this data type can represent only one action.\\n\\nFor information about setting up receipt rules, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-receipt-rules-console-walkthrough.html) .","properties":{"AddHeaderAction":"Adds a header to the received email.","BounceAction":"Rejects the received email by returning a bounce response to the sender and, optionally, publishes a notification to Amazon Simple Notification Service (Amazon SNS).","LambdaAction":"Calls an AWS Lambda function, and optionally, publishes a notification to Amazon SNS.","S3Action":"Saves the received message to an Amazon Simple Storage Service (Amazon S3) bucket and, optionally, publishes a notification to Amazon SNS.","SNSAction":"Publishes the email content within a notification to Amazon SNS.","StopAction":"Terminates the evaluation of the receipt rule set and optionally publishes a notification to Amazon SNS.","WorkmailAction":"Calls Amazon WorkMail and, optionally, publishes a notification to Amazon Amazon SNS."}},"AWS::SES::ReceiptRule.AddHeaderAction":{"attributes":{},"description":"When included in a receipt rule, this action adds a header to the received email.\\n\\nFor information about adding a header using a receipt rule, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-add-header.html) .","properties":{"HeaderName":"The name of the header to add to the incoming message. The name must contain at least one character, and can contain up to 50 characters. It consists of alphanumeric (a–z, A–Z, 0–9) characters and dashes.","HeaderValue":"The content to include in the header. This value can contain up to 2048 characters. It can\'t contain newline ( `\\\\n` ) or carriage return ( `\\\\r` ) characters."}},"AWS::SES::ReceiptRule.BounceAction":{"attributes":{},"description":"When included in a receipt rule, this action rejects the received email by returning a bounce response to the sender and, optionally, publishes a notification to Amazon Simple Notification Service (Amazon SNS).\\n\\nFor information about sending a bounce message in response to a received email, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-bounce.html) .","properties":{"Message":"Human-readable text to include in the bounce message.","Sender":"The email address of the sender of the bounced email. This is the address from which the bounce message is sent.","SmtpReplyCode":"The SMTP reply code, as defined by [RFC 5321](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc5321) .","StatusCode":"The SMTP enhanced status code, as defined by [RFC 3463](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc3463) .","TopicArn":"The Amazon Resource Name (ARN) of the Amazon SNS topic to notify when the bounce action is taken. You can find the ARN of a topic by using the [ListTopics](https://docs.aws.amazon.com/sns/latest/api/API_ListTopics.html) operation in Amazon SNS.\\n\\nFor more information about Amazon SNS topics, see the [Amazon SNS Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) ."}},"AWS::SES::ReceiptRule.LambdaAction":{"attributes":{},"description":"When included in a receipt rule, this action calls an AWS Lambda function and, optionally, publishes a notification to Amazon Simple Notification Service (Amazon SNS).\\n\\nTo enable Amazon SES to call your AWS Lambda function or to publish to an Amazon SNS topic of another account, Amazon SES must have permission to access those resources. For information about giving permissions, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-permissions.html) .\\n\\nFor information about using AWS Lambda actions in receipt rules, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-lambda.html) .","properties":{"FunctionArn":"The Amazon Resource Name (ARN) of the AWS Lambda function. An example of an AWS Lambda function ARN is `arn:aws:lambda:us-west-2:account-id:function:MyFunction` . For more information about AWS Lambda, see the [AWS Lambda Developer Guide](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) .","InvocationType":"The invocation type of the AWS Lambda function. An invocation type of `RequestResponse` means that the execution of the function immediately results in a response, and a value of `Event` means that the function is invoked asynchronously. The default value is `Event` . For information about AWS Lambda invocation types, see the [AWS Lambda Developer Guide](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html) .\\n\\n> There is a 30-second timeout on `RequestResponse` invocations. You should use `Event` invocation in most cases. Use `RequestResponse` only to make a mail flow decision, such as whether to stop the receipt rule or the receipt rule set.","TopicArn":"The Amazon Resource Name (ARN) of the Amazon SNS topic to notify when the Lambda action is executed. You can find the ARN of a topic by using the [ListTopics](https://docs.aws.amazon.com/sns/latest/api/API_ListTopics.html) operation in Amazon SNS.\\n\\nFor more information about Amazon SNS topics, see the [Amazon SNS Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) ."}},"AWS::SES::ReceiptRule.Rule":{"attributes":{},"description":"Receipt rules enable you to specify which actions Amazon SES should take when it receives mail on behalf of one or more email addresses or domains that you own.\\n\\nEach receipt rule defines a set of email addresses or domains that it applies to. If the email addresses or domains match at least one recipient address of the message, Amazon SES executes all of the receipt rule\'s actions on the message.\\n\\nFor information about setting up receipt rules, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-receipt-rules-console-walkthrough.html) .","properties":{"Actions":"An ordered list of actions to perform on messages that match at least one of the recipient email addresses or domains specified in the receipt rule.","Enabled":"If `true` , the receipt rule is active. The default value is `false` .","Name":"The name of the receipt rule. The name must meet the following requirements:\\n\\n- Contain only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_), dashes (-), or periods (.).\\n- Start and end with a letter or number.\\n- Contain 64 characters or fewer.","Recipients":"The recipient domains and email addresses that the receipt rule applies to. If this field is not specified, this rule matches all recipients on all verified domains.","ScanEnabled":"If `true` , then messages that this receipt rule applies to are scanned for spam and viruses. The default value is `false` .","TlsPolicy":"Specifies whether Amazon SES should require that incoming email is delivered over a connection encrypted with Transport Layer Security (TLS). If this parameter is set to `Require` , Amazon SES bounces emails that are not received over TLS. The default is `Optional` .\\n\\nValid Values: `Require | Optional`"}},"AWS::SES::ReceiptRule.S3Action":{"attributes":{},"description":"When included in a receipt rule, this action saves the received message to an Amazon Simple Storage Service (Amazon S3) bucket and, optionally, publishes a notification to Amazon Simple Notification Service (Amazon SNS).\\n\\nTo enable Amazon SES to write emails to your Amazon S3 bucket, use an AWS KMS key to encrypt your emails, or publish to an Amazon SNS topic of another account, Amazon SES must have permission to access those resources. For information about granting permissions, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-permissions.html) .\\n\\n> When you save your emails to an Amazon S3 bucket, the maximum email size (including headers) is 40 MB. Emails larger than that bounces. \\n\\nFor information about specifying Amazon S3 actions in receipt rules, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-s3.html) .","properties":{"BucketName":"The name of the Amazon S3 bucket for incoming email.","KmsKeyArn":"The customer master key that Amazon SES should use to encrypt your emails before saving them to the Amazon S3 bucket. You can use the default master key or a custom master key that you created in AWS KMS as follows:\\n\\n- To use the default master key, provide an ARN in the form of `arn:aws:kms:REGION:ACCOUNT-ID-WITHOUT-HYPHENS:alias/aws/ses` . For example, if your AWS account ID is 123456789012 and you want to use the default master key in the US West (Oregon) Region, the ARN of the default master key would be `arn:aws:kms:us-west-2:123456789012:alias/aws/ses` . If you use the default master key, you don\'t need to perform any extra steps to give Amazon SES permission to use the key.\\n- To use a custom master key that you created in AWS KMS, provide the ARN of the master key and ensure that you add a statement to your key\'s policy to give Amazon SES permission to use it. For more information about giving permissions, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-permissions.html) .\\n\\nFor more information about key policies, see the [AWS KMS Developer Guide](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html) . If you do not specify a master key, Amazon SES does not encrypt your emails.\\n\\n> Your mail is encrypted by Amazon SES using the Amazon S3 encryption client before the mail is submitted to Amazon S3 for storage. It is not encrypted using Amazon S3 server-side encryption. This means that you must use the Amazon S3 encryption client to decrypt the email after retrieving it from Amazon S3, as the service has no access to use your AWS KMS keys for decryption. This encryption client is currently available with the [AWS SDK for Java](https://docs.aws.amazon.com/sdk-for-java/) and [AWS SDK for Ruby](https://docs.aws.amazon.com/sdk-for-ruby/) only. For more information about client-side encryption using AWS KMS master keys, see the [Amazon S3 Developer Guide](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingClientSideEncryption.html) .","ObjectKeyPrefix":"The key prefix of the Amazon S3 bucket. The key prefix is similar to a directory name that enables you to store similar data under the same directory in a bucket.","TopicArn":"The ARN of the Amazon SNS topic to notify when the message is saved to the Amazon S3 bucket. You can find the ARN of a topic by using the [ListTopics](https://docs.aws.amazon.com/sns/latest/api/API_ListTopics.html) operation in Amazon SNS.\\n\\nFor more information about Amazon SNS topics, see the [Amazon SNS Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) ."}},"AWS::SES::ReceiptRule.SNSAction":{"attributes":{},"description":"When included in a receipt rule, this action publishes a notification to Amazon Simple Notification Service (Amazon SNS). This action includes a complete copy of the email content in the Amazon SNS notifications. Amazon SNS notifications for all other actions simply provide information about the email. They do not include the email content itself.\\n\\nIf you own the Amazon SNS topic, you don\'t need to do anything to give Amazon SES permission to publish emails to it. However, if you don\'t own the Amazon SNS topic, you need to attach a policy to the topic to give Amazon SES permissions to access it. For information about giving permissions, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-permissions.html) .\\n\\n> You can only publish emails that are 150 KB or less (including the header) to Amazon SNS. Larger emails bounce. If you anticipate emails larger than 150 KB, use the S3 action instead. \\n\\nFor information about using a receipt rule to publish an Amazon SNS notification, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-sns.html) .","properties":{"Encoding":"The encoding to use for the email within the Amazon SNS notification. UTF-8 is easier to use, but may not preserve all special characters when a message was encoded with a different encoding format. Base64 preserves all special characters. The default value is UTF-8.","TopicArn":"The Amazon Resource Name (ARN) of the Amazon SNS topic to notify. You can find the ARN of a topic by using the [ListTopics](https://docs.aws.amazon.com/sns/latest/api/API_ListTopics.html) operation in Amazon SNS.\\n\\nFor more information about Amazon SNS topics, see the [Amazon SNS Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) ."}},"AWS::SES::ReceiptRule.StopAction":{"attributes":{},"description":"When included in a receipt rule, this action terminates the evaluation of the receipt rule set and, optionally, publishes a notification to Amazon Simple Notification Service (Amazon SNS).\\n\\nFor information about setting a stop action in a receipt rule, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-stop.html) .","properties":{"Scope":"The scope of the StopAction. The only acceptable value is `RuleSet` .","TopicArn":"The Amazon Resource Name (ARN) of the Amazon SNS topic to notify when the stop action is taken. You can find the ARN of a topic by using the [ListTopics](https://docs.aws.amazon.com/sns/latest/api/API_ListTopics.html) Amazon SNS operation.\\n\\nFor more information about Amazon SNS topics, see the [Amazon SNS Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) ."}},"AWS::SES::ReceiptRule.WorkmailAction":{"attributes":{},"description":"When included in a receipt rule, this action calls Amazon WorkMail and, optionally, publishes a notification to Amazon Simple Notification Service (Amazon SNS). It usually isn\'t necessary to set this up manually, because Amazon WorkMail adds the rule automatically during its setup procedure.\\n\\nFor information using a receipt rule to call Amazon WorkMail, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-workmail.html) .","properties":{"OrganizationArn":"The Amazon Resource Name (ARN) of the Amazon WorkMail organization. Amazon WorkMail ARNs use the following format:\\n\\n`arn:aws:workmail:::organization/`\\n\\nYou can find the ID of your organization by using the [ListOrganizations](https://docs.aws.amazon.com/workmail/latest/APIReference/API_ListOrganizations.html) operation in Amazon WorkMail. Amazon WorkMail organization IDs begin with \\" `m-` \\", followed by a string of alphanumeric characters.\\n\\nFor information about Amazon WorkMail organizations, see the [Amazon WorkMail Administrator Guide](https://docs.aws.amazon.com/workmail/latest/adminguide/organizations_overview.html) .","TopicArn":"The Amazon Resource Name (ARN) of the Amazon SNS topic to notify when the WorkMail action is called. You can find the ARN of a topic by using the [ListTopics](https://docs.aws.amazon.com/sns/latest/api/API_ListTopics.html) operation in Amazon SNS.\\n\\nFor more information about Amazon SNS topics, see the [Amazon SNS Developer Guide](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) ."}},"AWS::SES::ReceiptRuleSet":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"Creates an empty receipt rule set.\\n\\nFor information about setting up receipt rule sets, see the [Amazon SES Developer Guide](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-concepts.html#receiving-email-concepts-rules) .\\n\\nYou can execute this operation no more than once per second.","properties":{"RuleSetName":"The name of the receipt rule set to reorder."}},"AWS::SES::Template":{"attributes":{"Id":""},"description":"Specifies an email template. Email templates enable you to send personalized email to one or more destinations in a single API operation.","properties":{"Template":"The content of the email, composed of a subject line and either an HTML part or a text-only part."}},"AWS::SES::Template.Template":{"attributes":{},"description":"The content of the email, composed of a subject line and either an HTML part or a text-only part.","properties":{"HtmlPart":"The HTML body of the email.","SubjectPart":"The subject line of the email.","TemplateName":"The name of the template.","TextPart":"The email body that is visible to recipients whose email clients do not display HTML content."}},"AWS::SES::VdmAttributes":{"attributes":{"Ref":"`Ref` returns the resource name.","VdmAttributesResourceId":""},"description":"The Virtual Deliverability Manager (VDM) attributes that apply to your Amazon SES account.","properties":{"DashboardAttributes":"Specifies additional settings for your VDM configuration as applicable to the Dashboard.","GuardianAttributes":"Specifies additional settings for your VDM configuration as applicable to the Guardian."}},"AWS::SES::VdmAttributes.DashboardAttributes":{"attributes":{},"description":"Settings for your VDM configuration as applicable to the Dashboard.","properties":{"EngagementMetrics":"Specifies the status of your VDM engagement metrics collection. Can be one of the following:\\n\\n- `ENABLED` – Amazon SES enables engagement metrics for your account.\\n- `DISABLED` – Amazon SES disables engagement metrics for your account."}},"AWS::SES::VdmAttributes.GuardianAttributes":{"attributes":{},"description":"Settings for your VDM configuration as applicable to the Guardian.","properties":{"OptimizedSharedDelivery":"Specifies the status of your VDM optimized shared delivery. Can be one of the following:\\n\\n- `ENABLED` – Amazon SES enables optimized shared delivery for your account.\\n- `DISABLED` – Amazon SES disables optimized shared delivery for your account."}},"AWS::SNS::Subscription":{"attributes":{},"description":"The `AWS::SNS::Subscription` resource subscribes an endpoint to an Amazon SNS topic. For a subscription to be created, the owner of the endpoint must confirm the subscription.","properties":{"DeliveryPolicy":"The delivery policy JSON assigned to the subscription. Enables the subscriber to define the message delivery retry strategy in the case of an HTTP/S endpoint subscribed to the topic. For more information, see `[GetSubscriptionAttributes](https://docs.aws.amazon.com/sns/latest/api/API_GetSubscriptionAttributes.html)` in the *Amazon SNS API Reference* and [Message delivery retries](https://docs.aws.amazon.com/sns/latest/dg/sns-message-delivery-retries.html) in the *Amazon SNS Developer Guide* .","Endpoint":"The subscription\'s endpoint. The endpoint value depends on the protocol that you specify. For more information, see the `Endpoint` parameter of the `[Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html)` action in the *Amazon SNS API Reference* .","FilterPolicy":"The filter policy JSON assigned to the subscription. Enables the subscriber to filter out unwanted messages. For more information, see `[GetSubscriptionAttributes](https://docs.aws.amazon.com/sns/latest/api/API_GetSubscriptionAttributes.html)` in the *Amazon SNS API Reference* and [Message filtering](https://docs.aws.amazon.com/sns/latest/dg/sns-message-filtering.html) in the *Amazon SNS Developer Guide* .","FilterPolicyScope":"This attribute lets you choose the filtering scope by using one of the following string value types:\\n\\n- `MessageAttributes` (default) - The filter is applied on the message attributes.\\n- `MessageBody` - The filter is applied on the message body.","Protocol":"The subscription\'s protocol. For more information, see the `Protocol` parameter of the `[Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html)` action in the *Amazon SNS API Reference* .","RawMessageDelivery":"When set to `true` , enables raw message delivery. Raw messages don\'t contain any JSON formatting and can be sent to Amazon SQS and HTTP/S endpoints. For more information, see `[GetSubscriptionAttributes](https://docs.aws.amazon.com/sns/latest/api/API_GetSubscriptionAttributes.html)` in the *Amazon SNS API Reference* .","RedrivePolicy":"When specified, sends undeliverable messages to the specified Amazon SQS dead-letter queue. Messages that can\'t be delivered due to client errors (for example, when the subscribed endpoint is unreachable) or server errors (for example, when the service that powers the subscribed endpoint becomes unavailable) are held in the dead-letter queue for further analysis or reprocessing.\\n\\nFor more information about the redrive policy and dead-letter queues, see [Amazon SQS dead-letter queues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html) in the *Amazon SQS Developer Guide* .","Region":"For cross-region subscriptions, the region in which the topic resides.\\n\\nIf no region is specified, AWS CloudFormation uses the region of the caller as the default.\\n\\nIf you perform an update operation that only updates the `Region` property of a `AWS::SNS::Subscription` resource, that operation will fail unless you are either:\\n\\n- Updating the `Region` from `NULL` to the caller region.\\n- Updating the `Region` from the caller region to `NULL` .","SubscriptionRoleArn":"This property applies only to Amazon Kinesis Data Firehose delivery stream subscriptions. Specify the ARN of the IAM role that has the following:\\n\\n- Permission to write to the Amazon Kinesis Data Firehose delivery stream\\n- Amazon SNS listed as a trusted entity\\n\\nSpecifying a valid ARN for this attribute is required for Kinesis Data Firehose delivery stream subscriptions. For more information, see [Fanout to Amazon Kinesis Data Firehose delivery streams](https://docs.aws.amazon.com/sns/latest/dg/sns-firehose-as-subscriber.html) in the *Amazon SNS Developer Guide.*","TopicArn":"The ARN of the topic to subscribe to."}},"AWS::SNS::Topic":{"attributes":{"Ref":"`Ref` returns the topic ARN, for example: `arn:aws:sns:us-east-1:123456789012:mystack-mytopic-NZJ5JSMVGFIE` .","TopicArn":"Returns the ARN of an Amazon SNS topic.","TopicName":"Returns the name of an Amazon SNS topic."},"description":"The `AWS::SNS::Topic` resource creates a topic to which notifications can be published.\\n\\n> One account can create a maximum of 100,000 standard topics and 1,000 FIFO topics. For more information, see [Amazon SNS endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/sns.html) in the *AWS General Reference* .","properties":{"ContentBasedDeduplication":"Enables content-based deduplication for FIFO topics.\\n\\n- By default, `ContentBasedDeduplication` is set to `false` . If you create a FIFO topic and this attribute is `false` , you must specify a value for the `MessageDeduplicationId` parameter for the [Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html) action.\\n- When you set `ContentBasedDeduplication` to `true` , Amazon SNS uses a SHA-256 hash to generate the `MessageDeduplicationId` using the body of the message (but not the attributes of the message).\\n\\n(Optional) To override the generated value, you can specify a value for the the `MessageDeduplicationId` parameter for the `Publish` action.","DataProtectionPolicy":"The body of the policy document you want to use for this topic.\\n\\nYou can only add one policy per topic.\\n\\nThe policy must be in JSON string format.\\n\\nLength Constraints: Maximum length of 30,720.","DisplayName":"The display name to use for an Amazon SNS topic with SMS subscriptions. The display name must be maximum 100 characters long, including hyphens (-), underscores (_), spaces, and tabs.","FifoTopic":"Set to true to create a FIFO topic.","KmsMasterKeyId":"The ID of an AWS managed customer master key (CMK) for Amazon SNS or a custom CMK. For more information, see [Key terms](https://docs.aws.amazon.com/sns/latest/dg/sns-server-side-encryption.html#sse-key-terms) . For more examples, see `[KeyId](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html#API_DescribeKey_RequestParameters)` in the *AWS Key Management Service API Reference* .\\n\\nThis property applies only to [server-side-encryption](https://docs.aws.amazon.com/sns/latest/dg/sns-server-side-encryption.html) .","SignatureVersion":"The signature version corresponds to the hashing algorithm used while creating the signature of the notifications, subscription confirmations, or unsubscribe confirmation messages sent by Amazon SNS. By default, `SignatureVersion` is set to `1` .","Subscription":"The Amazon SNS subscriptions (endpoints) for this topic.\\n\\n> If you specify the `Subscription` property in the `AWS::SNS::Topic` resource and it creates an associated subscription resource, the associated subscription is not deleted when the `AWS::SNS::Topic` resource is deleted.","Tags":"The list of tags to add to a new topic.\\n\\n> To be able to tag a topic on creation, you must have the `sns:CreateTopic` and `sns:TagResource` permissions.","TopicName":"The name of the topic you want to create. Topic names must include only uppercase and lowercase ASCII letters, numbers, underscores, and hyphens, and must be between 1 and 256 characters long. FIFO topic names must end with `.fifo` .\\n\\nIf you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the topic name. For more information, see [Name type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) .\\n\\n> If you specify a name, you can\'t perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","TracingConfig":"Tracing mode of an Amazon SNS topic. By default `TracingConfig` is set to `PassThrough` , and the topic passes through the tracing header it receives from an SNS publisher to its subscriptions. If set to `Active` , SNS will vend X-Ray segment data to topic owner account if the sampled flag in the tracing header is true. Only supported on standard topics."}},"AWS::SNS::Topic.Subscription":{"attributes":{},"description":"`Subscription` is an embedded property that describes the subscription endpoints of an Amazon SNS topic.\\n\\n> For full control over subscription behavior (for example, delivery policy, filtering, raw message delivery, and cross-region subscriptions), use the [AWS::SNS::Subscription](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html) resource.","properties":{"Endpoint":"The endpoint that receives notifications from the Amazon SNS topic. The endpoint value depends on the protocol that you specify. For more information, see the `Endpoint` parameter of the `[Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html)` action in the *Amazon SNS API Reference* .","Protocol":"The subscription\'s protocol. For more information, see the `Protocol` parameter of the `[Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html)` action in the *Amazon SNS API Reference* ."}},"AWS::SNS::TopicPolicy":{"attributes":{"Id":""},"description":"The `AWS::SNS::TopicPolicy` resource associates Amazon SNS topics with a policy. For an example snippet, see [Declaring an Amazon SNS policy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-iam.html#scenario-sns-policy) in the *AWS CloudFormation User Guide* .","properties":{"PolicyDocument":"A policy document that contains permissions to add to the specified SNS topics.","Topics":"The Amazon Resource Names (ARN) of the topics to which you want to add the policy. You can use the `[Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html)` function to specify an `[AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html)` resource."}},"AWS::SQS::Queue":{"attributes":{"Arn":"Returns the Amazon Resource Name (ARN) of the queue. For example: `arn:aws:sqs:us-east-2:123456789012:mystack-myqueue-15PG5C2FC1CW8` .","QueueName":"Returns the queue name. For example: `mystack-myqueue-1VF9BKQH5BJVI` .","QueueUrl":"Returns the URLs of the queues from the policy.","Ref":"`Ref` returns the queue URL. For example:\\n\\n`{ \\"Ref\\": \\"https://sqs.us-east-2.amazonaws.com/123456789012/ab1-MyQueue-A2BCDEF3GHI4\\" }`"},"description":"The `AWS::SQS::Queue` resource creates an Amazon SQS standard or FIFO queue.\\n\\nKeep the following caveats in mind:\\n\\n- If you don\'t specify the `FifoQueue` property, Amazon SQS creates a standard queue.\\n\\n> You can\'t change the queue type after you create it and you can\'t convert an existing standard queue into a FIFO queue. You must either create a new FIFO queue for your application or delete your existing standard queue and recreate it as a FIFO queue. For more information, see [Moving from a standard queue to a FIFO queue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues-moving.html) in the *Amazon SQS Developer Guide* .\\n- If you don\'t provide a value for a property, the queue is created with the default value for the property.\\n- If you delete a queue, you must wait at least 60 seconds before creating a queue with the same name.\\n- To successfully create a new queue, you must provide a queue name that adheres to the [limits related to queues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/limits-queues.html) and is unique within the scope of your queues.\\n\\nFor more information about creating FIFO (first-in-first-out) queues, see [Creating an Amazon SQS queue ( AWS CloudFormation )](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/screate-queue-cloudformation.html) in the *Amazon SQS Developer Guide* .","properties":{"ContentBasedDeduplication":"For first-in-first-out (FIFO) queues, specifies whether to enable content-based deduplication. During the deduplication interval, Amazon SQS treats messages that are sent with identical content as duplicates and delivers only one copy of the message. For more information, see the `ContentBasedDeduplication` attribute for the `[CreateQueue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html)` action in the *Amazon SQS API Reference* .","DeduplicationScope":"For high throughput for FIFO queues, specifies whether message deduplication occurs at the message group or queue level. Valid values are `messageGroup` and `queue` .\\n\\nTo enable high throughput for a FIFO queue, set this attribute to `messageGroup` *and* set the `FifoThroughputLimit` attribute to `perMessageGroupId` . If you set these attributes to anything other than these values, normal throughput is in effect and deduplication occurs as specified. For more information, see [High throughput for FIFO queues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/high-throughput-fifo.html) and [Quotas related to messages](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/quotas-messages.html) in the *Amazon SQS Developer Guide* .","DelaySeconds":"The time in seconds for which the delivery of all messages in the queue is delayed. You can specify an integer value of `0` to `900` (15 minutes). The default value is `0` .","FifoQueue":"If set to true, creates a FIFO queue. If you don\'t specify this property, Amazon SQS creates a standard queue. For more information, see [FIFO queues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html) in the *Amazon SQS Developer Guide* .","FifoThroughputLimit":"For high throughput for FIFO queues, specifies whether the FIFO queue throughput quota applies to the entire queue or per message group. Valid values are `perQueue` and `perMessageGroupId` .\\n\\nTo enable high throughput for a FIFO queue, set this attribute to `perMessageGroupId` *and* set the `DeduplicationScope` attribute to `messageGroup` . If you set these attributes to anything other than these values, normal throughput is in effect and deduplication occurs as specified. For more information, see [High throughput for FIFO queues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/high-throughput-fifo.html) and [Quotas related to messages](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/quotas-messages.html) in the *Amazon SQS Developer Guide* .","KmsDataKeyReusePeriodSeconds":"The length of time in seconds for which Amazon SQS can reuse a data key to encrypt or decrypt messages before calling AWS KMS again. The value must be an integer between 60 (1 minute) and 86,400 (24 hours). The default is 300 (5 minutes).\\n\\n> A shorter time period provides better security, but results in more calls to AWS KMS , which might incur charges after Free Tier. For more information, see [Encryption at rest](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-how-does-the-data-key-reuse-period-work) in the *Amazon SQS Developer Guide* .","KmsMasterKeyId":"The ID of an AWS Key Management Service (KMS) for Amazon SQS , or a custom KMS. To use the AWS managed KMS for Amazon SQS , specify a (default) alias ARN, alias name (e.g. `alias/aws/sqs` ), key ARN, or key ID. For more information, see the following:\\n\\n- [Encryption at rest](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html) in the *Amazon SQS Developer Guide*\\n- [CreateQueue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html) in the *Amazon SQS API Reference*\\n- [Request Parameters](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html#API_DescribeKey_RequestParameters) in the *AWS Key Management Service API Reference*\\n- The Key Management Service (KMS) section of the [AWS Key Management Service Best Practices](https://docs.aws.amazon.com/https://d0.awsstatic.com/whitepapers/aws-kms-best-practices.pdf) whitepaper","MaximumMessageSize":"The limit of how many bytes that a message can contain before Amazon SQS rejects it. You can specify an integer value from `1,024` bytes (1 KiB) to `262,144` bytes (256 KiB). The default value is `262,144` (256 KiB).","MessageRetentionPeriod":"The number of seconds that Amazon SQS retains a message. You can specify an integer value from `60` seconds (1 minute) to `1,209,600` seconds (14 days). The default value is `345,600` seconds (4 days).","QueueName":"A name for the queue. To create a FIFO queue, the name of your FIFO queue must end with the `.fifo` suffix. For more information, see [FIFO queues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html) in the *Amazon SQS Developer Guide* .\\n\\nIf you don\'t specify a name, AWS CloudFormation generates a unique physical ID and uses that ID for the queue name. For more information, see [Name type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html) in the *AWS CloudFormation User Guide* .\\n\\n> If you specify a name, you can\'t perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","ReceiveMessageWaitTimeSeconds":"Specifies the duration, in seconds, that the ReceiveMessage action call waits until a message is in the queue in order to include it in the response, rather than returning an empty response if a message isn\'t yet available. You can specify an integer from 1 to 20. Short polling is used as the default or when you specify 0 for this property. For more information, see [Consuming messages using long polling](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html#sqs-long-polling) in the *Amazon SQS Developer Guide* .","RedriveAllowPolicy":"The string that includes the parameters for the permissions for the dead-letter queue redrive permission and which source queues can specify dead-letter queues as a JSON object. The parameters are as follows:\\n\\n- `redrivePermission` : The permission type that defines which source queues can specify the current queue as the dead-letter queue. Valid values are:\\n\\n- `allowAll` : (Default) Any source queues in this AWS account in the same Region can specify this queue as the dead-letter queue.\\n- `denyAll` : No source queues can specify this queue as the dead-letter queue.\\n- `byQueue` : Only queues specified by the `sourceQueueArns` parameter can specify this queue as the dead-letter queue.\\n- `sourceQueueArns` : The Amazon Resource Names (ARN)s of the source queues that can specify this queue as the dead-letter queue and redrive messages. You can specify this parameter only when the `redrivePermission` parameter is set to `byQueue` . You can specify up to 10 source queue ARNs. To allow more than 10 source queues to specify dead-letter queues, set the `redrivePermission` parameter to `allowAll` .","RedrivePolicy":"The string that includes the parameters for the dead-letter queue functionality of the source queue as a JSON object. The parameters are as follows:\\n\\n- `deadLetterTargetArn` : The Amazon Resource Name (ARN) of the dead-letter queue to which Amazon SQS moves messages after the value of `maxReceiveCount` is exceeded.\\n- `maxReceiveCount` : The number of times a message is delivered to the source queue before being moved to the dead-letter queue. When the `ReceiveCount` for a message exceeds the `maxReceiveCount` for a queue, Amazon SQS moves the message to the dead-letter-queue.\\n\\n> The dead-letter queue of a FIFO queue must also be a FIFO queue. Similarly, the dead-letter queue of a standard queue must also be a standard queue. \\n\\n*JSON*\\n\\n`{ \\"deadLetterTargetArn\\" : *String* , \\"maxReceiveCount\\" : *Integer* }`\\n\\n*YAML*\\n\\n`deadLetterTargetArn : *String*`\\n\\n`maxReceiveCount : *Integer*`","SqsManagedSseEnabled":"Enables server-side queue encryption using SQS owned encryption keys. Only one server-side encryption option is supported per queue (for example, [SSE-KMS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-sse-existing-queue.html) or [SSE-SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-sqs-sse-queue.html) ).","Tags":"The tags that you attach to this queue. For more information, see [Resource tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) in the *AWS CloudFormation User Guide* .","VisibilityTimeout":"The length of time during which a message will be unavailable after a message is delivered from the queue. This blocks other components from receiving the same message and gives the initial component time to process and delete the message from the queue.\\n\\nValues must be from 0 to 43,200 seconds (12 hours). If you don\'t specify a value, AWS CloudFormation uses the default value of 30 seconds.\\n\\nFor more information about Amazon SQS queue visibility timeouts, see [Visibility timeout](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) in the *Amazon SQS Developer Guide* ."}},"AWS::SQS::QueuePolicy":{"attributes":{},"description":"The `AWS::SQS::QueuePolicy` type applies a policy to Amazon SQS queues. For an example snippet, see [Declaring an Amazon SQS policy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-iam.html#scenario-sqs-policy) in the *AWS CloudFormation User Guide* .","properties":{"PolicyDocument":"A policy document that contains the permissions for the specified Amazon SQS queues. For more information about Amazon SQS policies, see [Using custom policies with the Amazon SQS access policy language](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-creating-custom-policies.html) in the *Amazon SQS Developer Guide* .","Queues":"The URLs of the queues to which you want to add the policy. You can use the `[Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html)` function to specify an `[AWS::SQS::Queue](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-queues.html)` resource."}},"AWS::SSM::Association":{"attributes":{"AssociationId":"The association ID."},"description":"The `AWS::SSM::Association` resource creates a State Manager association for your managed instances. A State Manager association defines the state that you want to maintain on your instances. For example, an association can specify that anti-virus software must be installed and running on your instances, or that certain ports must be closed. For static targets, the association specifies a schedule for when the configuration is reapplied. For dynamic targets, such as an AWS Resource Groups or an AWS Auto Scaling Group, State Manager applies the configuration when new instances are added to the group. The association also specifies actions to take when applying the configuration. For example, an association for anti-virus software might run once a day. If the software is not installed, then State Manager installs it. If the software is installed, but the service is not running, then the association might instruct State Manager to start the service.","properties":{"ApplyOnlyAtCronInterval":"By default, when you create a new association, the system runs it immediately after it is created and then according to the schedule you specified. Specify this option if you don\'t want an association to run immediately after you create it. This parameter is not supported for rate expressions.","AssociationName":"Specify a descriptive name for the association.","AutomationTargetParameterName":"Choose the parameter that will define how your automation will branch out. This target is required for associations that use an Automation runbook and target resources by using rate controls. Automation is a capability of AWS Systems Manager .","CalendarNames":"The names or Amazon Resource Names (ARNs) of the Change Calendar type documents your associations are gated under. The associations only run when that Change Calendar is open. For more information, see [AWS Systems Manager Change Calendar](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-change-calendar) .","ComplianceSeverity":"The severity level that is assigned to the association.","DocumentVersion":"The version of the SSM document to associate with the target.\\n\\n> Note the following important information.\\n> \\n> - State Manager doesn\'t support running associations that use a new version of a document if that document is shared from another account. State Manager always runs the `default` version of a document if shared from another account, even though the Systems Manager console shows that a new version was processed. If you want to run an association using a new version of a document shared form another account, you must set the document version to `default` .\\n> - `DocumentVersion` is not valid for documents owned by AWS , such as `AWS-RunPatchBaseline` or `AWS-UpdateSSMAgent` . If you specify `DocumentVersion` for an AWS document, the system returns the following error: \\"Error occurred during operation \'CreateAssociation\'.\\" (RequestToken: , HandlerErrorCode: GeneralServiceException).","InstanceId":"The ID of the instance that the SSM document is associated with. You must specify the `InstanceId` or `Targets` property.\\n\\n> `InstanceId` has been deprecated. To specify an instance ID for an association, use the `Targets` parameter. If you use the parameter `InstanceId` , you cannot use the parameters `AssociationName` , `DocumentVersion` , `MaxErrors` , `MaxConcurrency` , `OutputLocation` , or `ScheduleExpression` . To use these parameters, you must use the `Targets` parameter.","MaxConcurrency":"The maximum number of targets allowed to run the association at the same time. You can specify a number, for example 10, or a percentage of the target set, for example 10%. The default value is 100%, which means all targets run the association at the same time.\\n\\nIf a new managed node starts and attempts to run an association while Systems Manager is running `MaxConcurrency` associations, the association is allowed to run. During the next association interval, the new managed node will process its association within the limit specified for `MaxConcurrency` .","MaxErrors":"The number of errors that are allowed before the system stops sending requests to run the association on additional targets. You can specify either an absolute number of errors, for example 10, or a percentage of the target set, for example 10%. If you specify 3, for example, the system stops sending requests when the fourth error is received. If you specify 0, then the system stops sending requests after the first error is returned. If you run an association on 50 managed nodes and set `MaxError` to 10%, then the system stops sending the request when the sixth error is received.\\n\\nExecutions that are already running an association when `MaxErrors` is reached are allowed to complete, but some of these executions may fail as well. If you need to ensure that there won\'t be more than max-errors failed executions, set `MaxConcurrency` to 1 so that executions proceed one at a time.","Name":"The name of the SSM document that contains the configuration information for the instance. You can specify `Command` or `Automation` documents. The documents can be AWS -predefined documents, documents you created, or a document that is shared with you from another account. For SSM documents that are shared with you from other AWS accounts , you must specify the complete SSM document ARN, in the following format:\\n\\n`arn:partition:ssm:region:account-id:document/document-name`\\n\\nFor example: `arn:aws:ssm:us-east-2:12345678912:document/My-Shared-Document`\\n\\nFor AWS -predefined documents and SSM documents you created in your account, you only need to specify the document name. For example, `AWS -ApplyPatchBaseline` or `My-Document` .","OutputLocation":"An Amazon Simple Storage Service (Amazon S3) bucket where you want to store the output details of the request.","Parameters":"The parameters for the runtime configuration of the document.","ScheduleExpression":"A cron expression that specifies a schedule when the association runs. The schedule runs in Coordinated Universal Time (UTC).","ScheduleOffset":"Number of days to wait after the scheduled day to run an association.","SyncCompliance":"The mode for generating association compliance. You can specify `AUTO` or `MANUAL` . In `AUTO` mode, the system uses the status of the association execution to determine the compliance status. If the association execution runs successfully, then the association is `COMPLIANT` . If the association execution doesn\'t run successfully, the association is `NON-COMPLIANT` .\\n\\nIn `MANUAL` mode, you must specify the `AssociationId` as a parameter for the PutComplianceItems API action. In this case, compliance data is not managed by State Manager. It is managed by your direct call to the PutComplianceItems API action.\\n\\nBy default, all associations use `AUTO` mode.","Targets":"The targets for the association. You must specify the `InstanceId` or `Targets` property. You can target all instances in an AWS account by specifying the `InstanceIds` key with a value of `*` . To view a JSON and a YAML example that targets all instances, see \\"Create an association for all managed instances in an AWS account \\" on the Examples page.","WaitForSuccessTimeoutSeconds":"The number of seconds the service should wait for the association status to show \\"Success\\" before proceeding with the stack execution. If the association status doesn\'t show \\"Success\\" after the specified number of seconds, then stack creation fails."}},"AWS::SSM::Association.InstanceAssociationOutputLocation":{"attributes":{},"description":"`InstanceAssociationOutputLocation` is a property of the [AWS::SSM::Association](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html) resource that specifies an Amazon S3 bucket where you want to store the results of this association request.\\n\\nFor the minimal permissions required to enable Amazon S3 output for an association, see [Creating associations](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-state-assoc.html) in the *Systems Manager User Guide* .","properties":{"S3Location":"`S3OutputLocation` is a property of the [InstanceAssociationOutputLocation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-association-instanceassociationoutputlocation.html) property that specifies an Amazon S3 bucket where you want to store the results of this request."}},"AWS::SSM::Association.S3OutputLocation":{"attributes":{},"description":"`S3OutputLocation` is a property of the [AWS::SSM::Association](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html) resource that specifies an Amazon S3 bucket where you want to store the results of this association request.","properties":{"OutputS3BucketName":"The name of the S3 bucket.","OutputS3KeyPrefix":"The S3 bucket subfolder.","OutputS3Region":"The AWS Region of the S3 bucket."}},"AWS::SSM::Association.Target":{"attributes":{},"description":"`Target` is a property of the [AWS::SSM::Association](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html) resource that specifies the targets for an SSM document in Systems Manager . You can target all instances in an AWS account by specifying the `InstanceIds` key with a value of `*` . To view a JSON and a YAML example that targets all instances, see \\"Create an association for all managed instances in an AWS account \\" on the Examples page.","properties":{"Key":"User-defined criteria for sending commands that target managed nodes that meet the criteria.","Values":"User-defined criteria that maps to `Key` . For example, if you specified `tag:ServerRole` , you could specify `value:WebServer` to run a command on instances that include EC2 tags of `ServerRole,WebServer` .\\n\\nDepending on the type of target, the maximum number of values for a key might be lower than the global maximum of 50."}},"AWS::SSM::Document":{"attributes":{"Ref":"`Ref` returns the Systems Manager document name, such as `MyNewSSMDocument` ."},"description":"The `AWS::SSM::Document` resource creates a Systems Manager (SSM) document in AWS Systems Manager . This document defines the actions that Systems Manager performs on your AWS resources.\\n\\n> This resource does not support CloudFormation drift detection.","properties":{"Attachments":"A list of key-value pairs that describe attachments to a version of a document.","Content":"The content for the new SSM document in JSON or YAML. For more information about the schemas for SSM document content, see [SSM document schema features and examples](https://docs.aws.amazon.com/systems-manager/latest/userguide/document-schemas-features.html) in the *AWS Systems Manager User Guide* .\\n\\n> This parameter also supports `String` data types.","DocumentFormat":"Specify the document format for the request. JSON is the default format.","DocumentType":"The type of document to create.\\n\\n*Allowed Values* : `ApplicationConfigurationSchema` | `Automation` | `Automation.ChangeTemplate` | `Command` | `DeploymentStrategy` | `Package` | `Policy` | `Session`","Name":"A name for the SSM document.\\n\\n> You can\'t use the following strings as document name prefixes. These are reserved by AWS for use as document name prefixes:\\n> \\n> - `aws`\\n> - `amazon`\\n> - `amzn`","Requires":"A list of SSM documents required by a document. This parameter is used exclusively by AWS AppConfig . When a user creates an AWS AppConfig configuration in an SSM document, the user must also specify a required document for validation purposes. In this case, an `ApplicationConfiguration` document requires an `ApplicationConfigurationSchema` document for validation purposes. For more information, see [What is AWS AppConfig ?](https://docs.aws.amazon.com/appconfig/latest/userguide/what-is-appconfig.html) in the *AWS AppConfig User Guide* .","Tags":"AWS CloudFormation resource tags to apply to the document. Use tags to help you identify and categorize resources.","TargetType":"Specify a target type to define the kinds of resources the document can run on. For example, to run a document on EC2 instances, specify the following value: `/AWS::EC2::Instance` . If you specify a value of \'/\' the document can run on all types of resources. If you don\'t specify a value, the document can\'t run on any resources. For a list of valid resource types, see [AWS resource and property types reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html) in the *AWS CloudFormation User Guide* .","UpdateMethod":"If the document resource you specify in your template already exists, this parameter determines whether a new version of the existing document is created, or the existing document is replaced. `Replace` is the default method. If you specify `NewVersion` for the `UpdateMethod` parameter, and the `Name` of the document does not match an existing resource, a new document is created. When you specify `NewVersion` , the default version of the document is changed to the newly created version.","VersionName":"An optional field specifying the version of the artifact you are creating with the document. For example, `Release12.1` . This value is unique across all versions of a document, and can\'t be changed."}},"AWS::SSM::Document.AttachmentsSource":{"attributes":{},"description":"Identifying information about a document attachment, including the file name and a key-value pair that identifies the location of an attachment to a document.","properties":{"Key":"The key of a key-value pair that identifies the location of an attachment to a document.","Name":"The name of the document attachment file.","Values":"The value of a key-value pair that identifies the location of an attachment to a document. The format for *Value* depends on the type of key you specify.\\n\\n- For the key *SourceUrl* , the value is an S3 bucket location. For example:\\n\\n`\\"Values\\": [ \\"s3://doc-example-bucket/my-folder\\" ]`\\n- For the key *S3FileUrl* , the value is a file in an S3 bucket. For example:\\n\\n`\\"Values\\": [ \\"s3://doc-example-bucket/my-folder/my-file.py\\" ]`\\n- For the key *AttachmentReference* , the value is constructed from the name of another SSM document in your account, a version number of that document, and a file attached to that document version that you want to reuse. For example:\\n\\n`\\"Values\\": [ \\"MyOtherDocument/3/my-other-file.py\\" ]`\\n\\nHowever, if the SSM document is shared with you from another account, the full SSM document ARN must be specified instead of the document name only. For example:\\n\\n`\\"Values\\": [ \\"arn:aws:ssm:us-east-2:111122223333:document/OtherAccountDocument/3/their-file.py\\" ]`"}},"AWS::SSM::Document.DocumentRequires":{"attributes":{},"description":"An SSM document required by the current document.","properties":{"Name":"The name of the required SSM document. The name can be an Amazon Resource Name (ARN).","Version":"The document version required by the current document."}},"AWS::SSM::MaintenanceWindow":{"attributes":{"Ref":"`Ref` returns the maintenance window ID, such as `mw-abcde1234567890yz` ."},"description":"The `AWS::SSM::MaintenanceWindow` resource represents general information about a maintenance window for AWS Systems Manager . Maintenance Windows let you define a schedule for when to perform potentially disruptive actions on your instances, such as patching an operating system (OS), updating drivers, or installing software. Each maintenance window has a schedule, a duration, a set of registered targets, and a set of registered tasks.\\n\\nFor more information, see [Systems Manager Maintenance Windows](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-maintenance.html) in the *AWS Systems Manager User Guide* and [CreateMaintenanceWindow](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_CreateMaintenanceWindow.html) in the *AWS Systems Manager API Reference* .","properties":{"AllowUnassociatedTargets":"Enables a maintenance window task to run on managed instances, even if you have not registered those instances as targets. If enabled, then you must specify the unregistered instances (by instance ID) when you register a task with the maintenance window.","Cutoff":"The number of hours before the end of the maintenance window that AWS Systems Manager stops scheduling new tasks for execution.","Description":"A description of the maintenance window.","Duration":"The duration of the maintenance window in hours.","EndDate":"The date and time, in ISO-8601 Extended format, for when the maintenance window is scheduled to become inactive.","Name":"The name of the maintenance window.","Schedule":"The schedule of the maintenance window in the form of a cron or rate expression.","ScheduleOffset":"The number of days to wait to run a maintenance window after the scheduled cron expression date and time.","ScheduleTimezone":"The time zone that the scheduled maintenance window executions are based on, in Internet Assigned Numbers Authority (IANA) format.","StartDate":"The date and time, in ISO-8601 Extended format, for when the maintenance window is scheduled to become active. StartDate allows you to delay activation of the Maintenance Window until the specified future date.","Tags":"Optional metadata that you assign to a resource in the form of an arbitrary set of tags (key-value pairs). Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For example, you might want to tag a maintenance window to identify the type of tasks it will run, the types of targets, and the environment it will run in."}},"AWS::SSM::MaintenanceWindowTarget":{"attributes":{"Ref":"`Ref` returns the maintenance window target ID, such as `12a345b6-bbb7-4bb6-90b0-8c9577a2d2b9` ."},"description":"The `AWS::SSM::MaintenanceWindowTarget` resource registers a target with a maintenance window for AWS Systems Manager . For more information, see [RegisterTargetWithMaintenanceWindow](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_RegisterTargetWithMaintenanceWindow.html) in the *AWS Systems Manager API Reference* .","properties":{"Description":"A description for the target.","Name":"The name for the maintenance window target.","OwnerInformation":"A user-provided value that will be included in any Amazon CloudWatch Events events that are raised while running tasks for these targets in this maintenance window.","ResourceType":"The type of target that is being registered with the maintenance window.","Targets":"The targets to register with the maintenance window. In other words, the instances to run commands on when the maintenance window runs.\\n\\nYou must specify targets by using the `WindowTargetIds` parameter.","WindowId":"The ID of the maintenance window to register the target with."}},"AWS::SSM::MaintenanceWindowTarget.Targets":{"attributes":{},"description":"The `Targets` property type specifies adding a target to a maintenance window target in AWS Systems Manager .\\n\\n`Targets` is a property of the [AWS::SSM::MaintenanceWindowTarget](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtarget.html) resource.","properties":{"Key":"User-defined criteria for sending commands that target managed nodes that meet the criteria.","Values":"User-defined criteria that maps to `Key` . For example, if you specified `tag:ServerRole` , you could specify `value:WebServer` to run a command on instances that include EC2 tags of `ServerRole,WebServer` .\\n\\nDepending on the type of target, the maximum number of values for a key might be lower than the global maximum of 50."}},"AWS::SSM::MaintenanceWindowTask":{"attributes":{"Ref":"`Ref` returns the maintenance window task ID, such as `12a345b6-bbb7-4bb6-90b0-8c9577a2d2b9` ."},"description":"The `AWS::SSM::MaintenanceWindowTask` resource defines information about a task for an AWS Systems Manager maintenance window. For more information, see [RegisterTaskWithMaintenanceWindow](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_RegisterTaskWithMaintenanceWindow.html) in the *AWS Systems Manager API Reference* .","properties":{"CutoffBehavior":"The specification for whether tasks should continue to run after the cutoff time specified in the maintenance windows is reached.","Description":"A description of the task.","LoggingInfo":"Information about an Amazon S3 bucket to write Run Command task-level logs to.\\n\\n> `LoggingInfo` has been deprecated. To specify an Amazon S3 bucket to contain logs for Run Command tasks, instead use the `OutputS3BucketName` and `OutputS3KeyPrefix` options in the `TaskInvocationParameters` structure. For information about how Systems Manager handles these options for the supported maintenance window task types, see [AWS ::SSM::MaintenanceWindowTask MaintenanceWindowRunCommandParameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html) .","MaxConcurrency":"The maximum number of targets this task can be run for, in parallel.\\n\\n> Although this element is listed as \\"Required: No\\", a value can be omitted only when you are registering or updating a [targetless task](https://docs.aws.amazon.com/systems-manager/latest/userguide/maintenance-windows-targetless-tasks.html) You must provide a value in all other cases.\\n> \\n> For maintenance window tasks without a target specified, you can\'t supply a value for this option. Instead, the system inserts a placeholder value of `1` . This value doesn\'t affect the running of your task.","MaxErrors":"The maximum number of errors allowed before this task stops being scheduled.\\n\\n> Although this element is listed as \\"Required: No\\", a value can be omitted only when you are registering or updating a [targetless task](https://docs.aws.amazon.com/systems-manager/latest/userguide/maintenance-windows-targetless-tasks.html) You must provide a value in all other cases.\\n> \\n> For maintenance window tasks without a target specified, you can\'t supply a value for this option. Instead, the system inserts a placeholder value of `1` . This value doesn\'t affect the running of your task.","Name":"The task name.","Priority":"The priority of the task in the maintenance window. The lower the number, the higher the priority. Tasks that have the same priority are scheduled in parallel.","ServiceRoleArn":"The Amazon Resource Name (ARN) of the AWS Identity and Access Management (IAM) service role to use to publish Amazon Simple Notification Service (Amazon SNS) notifications for maintenance window Run Command tasks.","Targets":"The targets, either instances or window target IDs.\\n\\n- Specify instances using `Key=InstanceIds,Values= *instanceid1* , *instanceid2*` .\\n- Specify window target IDs using `Key=WindowTargetIds,Values= *window-target-id-1* , *window-target-id-2*` .","TaskArn":"The resource that the task uses during execution.\\n\\nFor `RUN_COMMAND` and `AUTOMATION` task types, `TaskArn` is the SSM document name or Amazon Resource Name (ARN).\\n\\nFor `LAMBDA` tasks, `TaskArn` is the function name or ARN.\\n\\nFor `STEP_FUNCTIONS` tasks, `TaskArn` is the state machine ARN.","TaskInvocationParameters":"The parameters to pass to the task when it runs. Populate only the fields that match the task type. All other fields should be empty.\\n\\n> When you update a maintenance window task that has options specified in `TaskInvocationParameters` , you must provide again all the `TaskInvocationParameters` values that you want to retain. The values you do not specify again are removed. For example, suppose that when you registered a Run Command task, you specified `TaskInvocationParameters` values for `Comment` , `NotificationConfig` , and `OutputS3BucketName` . If you update the maintenance window task and specify only a different `OutputS3BucketName` value, the values for `Comment` and `NotificationConfig` are removed.","TaskParameters":"The parameters to pass to the task when it runs.\\n\\n> `TaskParameters` has been deprecated. To specify parameters to pass to a task when it runs, instead use the `Parameters` option in the `TaskInvocationParameters` structure. For information about how Systems Manager handles these options for the supported maintenance window task types, see [MaintenanceWindowTaskInvocationParameters](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_MaintenanceWindowTaskInvocationParameters.html) .","TaskType":"The type of task. Valid values: `RUN_COMMAND` , `AUTOMATION` , `LAMBDA` , `STEP_FUNCTIONS` .","WindowId":"The ID of the maintenance window where the task is registered."}},"AWS::SSM::MaintenanceWindowTask.CloudWatchOutputConfig":{"attributes":{},"description":"Configuration options for sending command output to Amazon CloudWatch Logs.","properties":{"CloudWatchLogGroupName":"The name of the CloudWatch Logs log group where you want to send command output. If you don\'t specify a group name, AWS Systems Manager automatically creates a log group for you. The log group uses the following naming format:\\n\\n`aws/ssm/ *SystemsManagerDocumentName*`","CloudWatchOutputEnabled":"Enables Systems Manager to send command output to CloudWatch Logs."}},"AWS::SSM::MaintenanceWindowTask.LoggingInfo":{"attributes":{},"description":"The `LoggingInfo` property type specifies information about the Amazon S3 bucket to write instance-level logs to.\\n\\n`LoggingInfo` is a property of the [AWS::SSM::MaintenanceWindowTask](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html) resource.\\n\\n> `LoggingInfo` has been deprecated. To specify an Amazon S3 bucket to contain logs, instead use the `OutputS3BucketName` and `OutputS3KeyPrefix` options in the `TaskInvocationParameters` structure. For information about how Systems Manager handles these options for the supported maintenance window task types, see [AWS ::SSM::MaintenanceWindowTask MaintenanceWindowRunCommandParameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html) .","properties":{"Region":"The AWS Region where the S3 bucket is located.","S3Bucket":"The name of an S3 bucket where execution logs are stored.","S3Prefix":"The Amazon S3 bucket subfolder."}},"AWS::SSM::MaintenanceWindowTask.MaintenanceWindowAutomationParameters":{"attributes":{},"description":"The `MaintenanceWindowAutomationParameters` property type specifies the parameters for an `AUTOMATION` task type for a maintenance window task in AWS Systems Manager .\\n\\n`MaintenanceWindowAutomationParameters` is a property of the [TaskInvocationParameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-taskinvocationparameters.html) property type.\\n\\nFor information about available parameters in Automation runbooks, you can view the content of the runbook itself in the Systems Manager console. For information, see [View runbook content](https://docs.aws.amazon.com/systems-manager/latest/userguide/automation-documents-reference-details.html#view-automation-json) in the *AWS Systems Manager User Guide* .","properties":{"DocumentVersion":"The version of an Automation runbook to use during task execution.","Parameters":"The parameters for the AUTOMATION task."}},"AWS::SSM::MaintenanceWindowTask.MaintenanceWindowLambdaParameters":{"attributes":{},"description":"The `MaintenanceWindowLambdaParameters` property type specifies the parameters for a `LAMBDA` task type for a maintenance window task in AWS Systems Manager .\\n\\n`MaintenanceWindowLambdaParameters` is a property of the [TaskInvocationParameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-taskinvocationparameters.html) property type.","properties":{"ClientContext":"Client-specific information to pass to the AWS Lambda function that you\'re invoking. You can then use the `context` variable to process the client information in your AWS Lambda function.","Payload":"JSON to provide to your AWS Lambda function as input.\\n\\n> Although `Type` is listed as \\"String\\" for this property, the payload content must be formatted as a Base64-encoded binary data object. \\n\\n*Length Constraint:* 4096","Qualifier":"An AWS Lambda function version or alias name. If you specify a function version, the action uses the qualified function Amazon Resource Name (ARN) to invoke a specific Lambda function. If you specify an alias name, the action uses the alias ARN to invoke the Lambda function version that the alias points to."}},"AWS::SSM::MaintenanceWindowTask.MaintenanceWindowRunCommandParameters":{"attributes":{},"description":"The `MaintenanceWindowRunCommandParameters` property type specifies the parameters for a `RUN_COMMAND` task type for a maintenance window task in AWS Systems Manager . This means that these parameters are the same as those for the `SendCommand` API call. For more information about `SendCommand` parameters, see [SendCommand](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_SendCommand.html) in the *AWS Systems Manager API Reference* .\\n\\nFor information about available parameters in SSM Command documents, you can view the content of the document itself in the Systems Manager console. For information, see [Viewing SSM command document content](https://docs.aws.amazon.com/systems-manager/latest/userguide/viewing-ssm-document-content.html) in the *AWS Systems Manager User Guide* .\\n\\n`MaintenanceWindowRunCommandParameters` is a property of the [TaskInvocationParameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-taskinvocationparameters.html) property type.","properties":{"CloudWatchOutputConfig":"Configuration options for sending command output to Amazon CloudWatch Logs.","Comment":"Information about the command or commands to run.","DocumentHash":"The SHA-256 or SHA-1 hash created by the system when the document was created. SHA-1 hashes have been deprecated.","DocumentHashType":"The SHA-256 or SHA-1 hash type. SHA-1 hashes are deprecated.","DocumentVersion":"The AWS Systems Manager document (SSM document) version to use in the request. You can specify `$DEFAULT` , `$LATEST` , or a specific version number. If you run commands by using the AWS CLI, then you must escape the first two options by using a backslash. If you specify a version number, then you don\'t need to use the backslash. For example:\\n\\n`--document-version \\"\\\\$DEFAULT\\"`\\n\\n`--document-version \\"\\\\$LATEST\\"`\\n\\n`--document-version \\"3\\"`","NotificationConfig":"Configurations for sending notifications about command status changes on a per-managed node basis.","OutputS3BucketName":"The name of the Amazon Simple Storage Service (Amazon S3) bucket.","OutputS3KeyPrefix":"The S3 bucket subfolder.","Parameters":"The parameters for the `RUN_COMMAND` task execution.\\n\\nThe supported parameters are the same as those for the `SendCommand` API call. For more information, see [SendCommand](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_SendCommand.html) in the *AWS Systems Manager API Reference* .","ServiceRoleArn":"The Amazon Resource Name (ARN) of the AWS Identity and Access Management (IAM) service role to use to publish Amazon Simple Notification Service (Amazon SNS) notifications for maintenance window Run Command tasks.","TimeoutSeconds":"If this time is reached and the command hasn\'t already started running, it doesn\'t run."}},"AWS::SSM::MaintenanceWindowTask.MaintenanceWindowStepFunctionsParameters":{"attributes":{},"description":"The `MaintenanceWindowStepFunctionsParameters` property type specifies the parameters for the execution of a `STEP_FUNCTIONS` task in a Systems Manager maintenance window.\\n\\n`MaintenanceWindowStepFunctionsParameters` is a property of the [TaskInvocationParameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-taskinvocationparameters.html) property type.","properties":{"Input":"The inputs for the `STEP_FUNCTIONS` task.","Name":"The name of the `STEP_FUNCTIONS` task."}},"AWS::SSM::MaintenanceWindowTask.NotificationConfig":{"attributes":{},"description":"The `NotificationConfig` property type specifies configurations for sending notifications for a maintenance window task in AWS Systems Manager .\\n\\n`NotificationConfig` is a property of the [MaintenanceWindowRunCommandParameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html) property type.","properties":{"NotificationArn":"An Amazon Resource Name (ARN) for an Amazon Simple Notification Service (Amazon SNS) topic. Run Command pushes notifications about command status changes to this topic.","NotificationEvents":"The different events that you can receive notifications for. These events include the following: `All` (events), `InProgress` , `Success` , `TimedOut` , `Cancelled` , `Failed` . To learn more about these events, see [Configuring Amazon SNS Notifications for AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/monitoring-sns-notifications.html) in the *AWS Systems Manager User Guide* .","NotificationType":"The notification type.\\n\\n- `Command` : Receive notification when the status of a command changes.\\n- `Invocation` : For commands sent to multiple instances, receive notification on a per-instance basis when the status of a command changes."}},"AWS::SSM::MaintenanceWindowTask.Target":{"attributes":{},"description":"The `Target` property type specifies targets (either instances or window target IDs). You specify instances by using `Key=InstanceIds,Values=< *instanceid1* >,< *instanceid2* >` . You specify window target IDs using `Key=WindowTargetIds,Values=< *window-target-id-1* >,< *window-target-id-2* >` for a maintenance window task in AWS Systems Manager .\\n\\n`Target` is a property of the [AWS::SSM::MaintenanceWindowTask](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html) property type.\\n\\n> To use `resource-groups:Name` as the key for a maintenance window target, specify the resource group as a `AWS::SSM::MaintenanceWindowTarget` type, and use the `Ref` function to specify the target for `AWS::SSM::MaintenanceWindowTask` . For an example, see *Create a Run Command task that targets instances using a resource group name* in [AWS::SSM::MaintenanceWindowTask Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#aws-resource-ssm-maintenancewindowtask--examples) .","properties":{"Key":"User-defined criteria for sending commands that target instances that meet the criteria. `Key` can be `InstanceIds` or `WindowTargetIds` . For more information about how to target instances within a maintenance window task, see [About \'register-task-with-maintenance-window\' Options and Values](https://docs.aws.amazon.com/systems-manager/latest/userguide/register-tasks-options.html) in the *AWS Systems Manager User Guide* .","Values":"User-defined criteria that maps to `Key` . For example, if you specify `InstanceIds` , you can specify `i-1234567890abcdef0,i-9876543210abcdef0` to run a command on two EC2 instances. For more information about how to target instances within a maintenance window task, see [About \'register-task-with-maintenance-window\' Options and Values](https://docs.aws.amazon.com/systems-manager/latest/userguide/register-tasks-options.html) in the *AWS Systems Manager User Guide* ."}},"AWS::SSM::MaintenanceWindowTask.TaskInvocationParameters":{"attributes":{},"description":"The `TaskInvocationParameters` property type specifies the task execution parameters for a maintenance window task in AWS Systems Manager .\\n\\n`TaskInvocationParameters` is a property of the [AWS::SSM::MaintenanceWindowTask](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html) property type.","properties":{"MaintenanceWindowAutomationParameters":"The parameters for an `AUTOMATION` task type.","MaintenanceWindowLambdaParameters":"The parameters for a `LAMBDA` task type.","MaintenanceWindowRunCommandParameters":"The parameters for a `RUN_COMMAND` task type.","MaintenanceWindowStepFunctionsParameters":"The parameters for a `STEP_FUNCTIONS` task type."}},"AWS::SSM::Parameter":{"attributes":{"Ref":"`Ref` returns the name of the SSM parameter. For example, `ssm-myparameter-ABCNPH3XCAO6` .","Type":"Returns the type of the parameter. Valid values are `String` or `StringList` .","Value":"Returns the value of the parameter."},"description":"The `AWS::SSM::Parameter` resource creates an SSM parameter in AWS Systems Manager Parameter Store.\\n\\n> To create an SSM parameter, you must have the AWS Identity and Access Management ( IAM ) permissions `ssm:PutParameter` and `ssm:AddTagsToResource` . On stack creation, AWS CloudFormation adds the following three tags to the parameter: `aws:cloudformation:stack-name` , `aws:cloudformation:logical-id` , and `aws:cloudformation:stack-id` , in addition to any custom tags you specify.\\n> \\n> To add, update, or remove tags during stack update, you must have IAM permissions for both `ssm:AddTagsToResource` and `ssm:RemoveTagsFromResource` . For more information, see [Managing Access Using Policies](https://docs.aws.amazon.com/systems-manager/latest/userguide/security-iam.html#security_iam_access-manage) in the *AWS Systems Manager User Guide* . \\n\\nFor information about valid values for parameters, see [Requirements and Constraints for Parameter Names](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-su-create.html#sysman-parameter-name-constraints) in the *AWS Systems Manager User Guide* and [PutParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_PutParameter.html) in the *AWS Systems Manager API Reference* .","properties":{"AllowedPattern":"A regular expression used to validate the parameter value. For example, for String types with values restricted to numbers, you can specify the following: `AllowedPattern=^\\\\d+$`","DataType":"The data type of the parameter, such as `text` or `aws:ec2:image` . The default is `text` .","Description":"Information about the parameter.","Name":"The name of the parameter.\\n\\n> The maximum length constraint listed below includes capacity for additional system attributes that aren\'t part of the name. The maximum length for a parameter name, including the full length of the parameter ARN, is 1011 characters. For example, the length of the following parameter name is 65 characters, not 20 characters: `arn:aws:ssm:us-east-2:111222333444:parameter/ExampleParameterName`","Policies":"Information about the policies assigned to a parameter.\\n\\n[Assigning parameter policies](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-policies.html) in the *AWS Systems Manager User Guide* .","Tags":"Optional metadata that you assign to a resource in the form of an arbitrary set of tags (key-value pairs). Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For example, you might want to tag a Systems Manager parameter to identify the type of resource to which it applies, the environment, or the type of configuration data referenced by the parameter.","Tier":"The parameter tier.","Type":"The type of parameter.\\n\\n> AWS CloudFormation doesn\'t support creating a `SecureString` parameter type. \\n\\n*Allowed Values* : String | StringList","Value":"The parameter value.\\n\\n> If type is `StringList` , the system returns a comma-separated string with no spaces between commas in the `Value` field."}},"AWS::SSM::PatchBaseline":{"attributes":{"Ref":"`Ref` returns the patch baseline ID, such as `pb-abcde1234567890yz` .\\n\\n> The ID of the default patch baseline provided by AWS is an ARN, for example `arn:aws:ssm:us-west-2:123456789012:patchbaseline/abcde1234567890yz` ."},"description":"The `AWS::SSM::PatchBaseline` resource defines the basic information for an AWS Systems Manager patch baseline. A patch baseline defines which patches are approved for installation on your instances.\\n\\nFor more information, see [CreatePatchBaseline](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_CreatePatchBaseline.html) in the *AWS Systems Manager API Reference* .","properties":{"ApprovalRules":"A set of rules used to include patches in the baseline.","ApprovedPatches":"A list of explicitly approved patches for the baseline.\\n\\nFor information about accepted formats for lists of approved patches and rejected patches, see [About package name formats for approved and rejected patch lists](https://docs.aws.amazon.com/systems-manager/latest/userguide/patch-manager-approved-rejected-package-name-formats.html) in the *AWS Systems Manager User Guide* .","ApprovedPatchesComplianceLevel":"Defines the compliance level for approved patches. When an approved patch is reported as missing, this value describes the severity of the compliance violation. The default value is `UNSPECIFIED` .","ApprovedPatchesEnableNonSecurity":"Indicates whether the list of approved patches includes non-security updates that should be applied to the managed nodes. The default value is `false` . Applies to Linux managed nodes only.","Description":"A description of the patch baseline.","GlobalFilters":"A set of global filters used to include patches in the baseline.","Name":"The name of the patch baseline.","OperatingSystem":"Defines the operating system the patch baseline applies to. The default value is `WINDOWS` .","PatchGroups":"The name of the patch group to be registered with the patch baseline.","RejectedPatches":"A list of explicitly rejected patches for the baseline.\\n\\nFor information about accepted formats for lists of approved patches and rejected patches, see [About package name formats for approved and rejected patch lists](https://docs.aws.amazon.com/systems-manager/latest/userguide/patch-manager-approved-rejected-package-name-formats.html) in the *AWS Systems Manager User Guide* .","RejectedPatchesAction":"The action for Patch Manager to take on patches included in the `RejectedPackages` list.\\n\\n- *`ALLOW_AS_DEPENDENCY`* : A package in the `Rejected` patches list is installed only if it is a dependency of another package. It is considered compliant with the patch baseline, and its status is reported as `InstalledOther` . This is the default action if no option is specified.\\n- *`BLOCK`* : Packages in the `RejectedPatches` list, and packages that include them as dependencies, aren\'t installed under any circumstances. If a package was installed before it was added to the Rejected patches list, it is considered non-compliant with the patch baseline, and its status is reported as `InstalledRejected` .","Sources":"Information about the patches to use to update the managed nodes, including target operating systems and source repositories. Applies to Linux managed nodes only.","Tags":"Optional metadata that you assign to a resource. Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For example, you might want to tag a patch baseline to identify the severity level of patches it specifies and the operating system family it applies to."}},"AWS::SSM::PatchBaseline.PatchFilter":{"attributes":{},"description":"The `PatchFilter` property type defines a patch filter for an AWS Systems Manager patch baseline.\\n\\nThe `PatchFilters` property of the [PatchFilterGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-patchfiltergroup.html) property type contains a list of `PatchFilter` property types.\\n\\nYou can view lists of valid values for the patch properties by running the `DescribePatchProperties` command. For more information, see [DescribePatchProperties](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_DescribePatchProperties.html) in the *AWS Systems Manager API Reference* .","properties":{"Key":"The key for the filter.\\n\\nFor information about valid keys, see [PatchFilter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_PatchFilter.html) in the *AWS Systems Manager API Reference* .","Values":"The value for the filter key.\\n\\nFor information about valid values for each key based on operating system type, see [PatchFilter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_PatchFilter.html) in the *AWS Systems Manager API Reference* ."}},"AWS::SSM::PatchBaseline.PatchFilterGroup":{"attributes":{},"description":"The `PatchFilterGroup` property type specifies a set of patch filters for an AWS Systems Manager patch baseline, typically used for approval rules for a Systems Manager patch baseline.\\n\\n`PatchFilterGroup` is the property type for the `GlobalFilters` property of the [AWS::SSM::PatchBaseline](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html) resource and the `PatchFilterGroup` property of the [Rule](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-rule.html) property type.","properties":{"PatchFilters":"The set of patch filters that make up the group."}},"AWS::SSM::PatchBaseline.PatchSource":{"attributes":{},"description":"`PatchSource` is the property type for the `Sources` resource of the [AWS::SSM::PatchBaseline](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html) resource.\\n\\nThe AWS CloudFormation `AWS::SSM::PatchSource` resource is used to provide information about the patches to use to update target instances, including target operating systems and source repository. Applies to Linux instances only.","properties":{"Configuration":"The value of the yum repo configuration. For example:\\n\\n`[main]`\\n\\n`name=MyCustomRepository`\\n\\n`baseurl=https://my-custom-repository`\\n\\n`enabled=1`\\n\\n> For information about other options available for your yum repository configuration, see [dnf.conf(5)](https://docs.aws.amazon.com/https://man7.org/linux/man-pages/man5/dnf.conf.5.html) .","Name":"The name specified to identify the patch source.","Products":"The specific operating system versions a patch repository applies to, such as \\"Ubuntu16.04\\", \\"AmazonLinux2016.09\\", \\"RedhatEnterpriseLinux7.2\\" or \\"Suse12.7\\". For lists of supported product values, see [PatchFilter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_PatchFilter.html) in the *AWS Systems Manager API Reference* ."}},"AWS::SSM::PatchBaseline.PatchStringDate":{"attributes":{},"description":"The date for `ApproveUntilDate` , as a String in the format `YYYY-MM-DD` . For example, `2020-12-31` .","properties":{}},"AWS::SSM::PatchBaseline.Rule":{"attributes":{},"description":"The `Rule` property type specifies an approval rule for a Systems Manager patch baseline.\\n\\nThe `PatchRules` property of the [RuleGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-rulegroup.html) property type contains a list of `Rule` property types.","properties":{"ApproveAfterDays":"The number of days after the release date of each patch matched by the rule that the patch is marked as approved in the patch baseline. For example, a value of `7` means that patches are approved seven days after they are released.\\n\\nYou must specify a value for `ApproveAfterDays` .\\n\\nException: Not supported on Debian Server or Ubuntu Server.","ApproveUntilDate":"The cutoff date for auto approval of released patches. Any patches released on or before this date are installed automatically. Not supported on Debian Server or Ubuntu Server.\\n\\nEnter dates in the format `YYYY-MM-DD` . For example, `2021-12-31` .","ComplianceLevel":"A compliance severity level for all approved patches in a patch baseline. Valid compliance severity levels include the following: `UNSPECIFIED` , `CRITICAL` , `HIGH` , `MEDIUM` , `LOW` , and `INFORMATIONAL` .","EnableNonSecurity":"For managed nodes identified by the approval rule filters, enables a patch baseline to apply non-security updates available in the specified repository. The default value is `false` . Applies to Linux managed nodes only.","PatchFilterGroup":"The patch filter group that defines the criteria for the rule."}},"AWS::SSM::PatchBaseline.RuleGroup":{"attributes":{},"description":"The `RuleGroup` property type specifies a set of rules that define the approval rules for an AWS Systems Manager patch baseline.\\n\\n`RuleGroup` is the property type for the `ApprovalRules` property of the [AWS::SSM::PatchBaseline](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html) resource.","properties":{"PatchRules":"The rules that make up the rule group."}},"AWS::SSM::ResourceDataSync":{"attributes":{"Ref":"`Ref` returns the name of the resource data sync, such as `TestResourceDataSync` .","SyncName":"The name of the resource data sync."},"description":"The `AWS::SSM::ResourceDataSync` resource creates, updates, or deletes a resource data sync for AWS Systems Manager . A resource data sync helps you view data from multiple sources in a single location. Systems Manager offers two types of resource data sync: `SyncToDestination` and `SyncFromSource` .\\n\\nYou can configure Systems Manager Inventory to use the `SyncToDestination` type to synchronize Inventory data from multiple AWS Regions to a single Amazon S3 bucket.\\n\\nYou can configure Systems Manager Explorer to use the `SyncFromSource` type to synchronize operational work items (OpsItems) and operational data (OpsData) from multiple AWS Regions . This type can synchronize OpsItems and OpsData from multiple AWS accounts and Regions or from an `EntireOrganization` by using AWS Organizations .\\n\\nA resource data sync is an asynchronous operation that returns immediately. After a successful initial sync is completed, the system continuously syncs data.\\n\\nBy default, data is not encrypted in Amazon S3 . We strongly recommend that you enable encryption in Amazon S3 to ensure secure data storage. We also recommend that you secure access to the Amazon S3 bucket by creating a restrictive bucket policy.\\n\\nFor more information, see [Configuring Inventory Collection](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-inventory-configuring.html#sysman-inventory-datasync) and [Setting Up Systems Manager Explorer to Display Data from Multiple Accounts and Regions](https://docs.aws.amazon.com/systems-manager/latest/userguide/Explorer-resource-data-sync.html) in the *AWS Systems Manager User Guide* .\\n\\nImportant: The following *Syntax* section shows all fields that are supported for a resource data sync. The *Examples* section below shows the recommended way to specify configurations for each sync type. Please see the *Examples* section when you create your resource data sync.","properties":{"BucketName":"The name of the S3 bucket where the aggregated data is stored.","BucketPrefix":"An Amazon S3 prefix for the bucket.","BucketRegion":"The AWS Region with the S3 bucket targeted by the resource data sync.","KMSKeyArn":"The ARN of an encryption key for a destination in Amazon S3 . You can use a KMS key to encrypt inventory data in Amazon S3 . You must specify a key that exist in the same region as the destination Amazon S3 bucket.","S3Destination":"Configuration information for the target S3 bucket.","SyncFormat":"A supported sync format. The following format is currently supported: JsonSerDe","SyncName":"A name for the resource data sync.","SyncSource":"Information about the source where the data was synchronized.","SyncType":"The type of resource data sync. If `SyncType` is `SyncToDestination` , then the resource data sync synchronizes data to an S3 bucket. If the `SyncType` is `SyncFromSource` then the resource data sync synchronizes data from AWS Organizations or from multiple AWS Regions ."}},"AWS::SSM::ResourceDataSync.AwsOrganizationsSource":{"attributes":{},"description":"Information about the `AwsOrganizationsSource` resource data sync source. A sync source of this type can synchronize data from AWS Organizations or, if an AWS organization isn\'t present, from multiple AWS Regions .","properties":{"OrganizationSourceType":"If an AWS organization is present, this is either `OrganizationalUnits` or `EntireOrganization` . For `OrganizationalUnits` , the data is aggregated from a set of organization units. For `EntireOrganization` , the data is aggregated from the entire AWS organization.","OrganizationalUnits":"The AWS Organizations organization units included in the sync."}},"AWS::SSM::ResourceDataSync.S3Destination":{"attributes":{},"description":"Information about the target S3 bucket for the resource data sync.","properties":{"BucketName":"The name of the S3 bucket where the aggregated data is stored.","BucketPrefix":"An Amazon S3 prefix for the bucket.","BucketRegion":"The AWS Region with the S3 bucket targeted by the resource data sync.","KMSKeyArn":"The ARN of an encryption key for a destination in Amazon S3. Must belong to the same Region as the destination S3 bucket.","SyncFormat":"A supported sync format. The following format is currently supported: JsonSerDe"}},"AWS::SSM::ResourceDataSync.SyncSource":{"attributes":{},"description":"Information about the source of the data included in the resource data sync.","properties":{"AwsOrganizationsSource":"Information about the AwsOrganizationsSource resource data sync source. A sync source of this type can synchronize data from AWS Organizations .","IncludeFutureRegions":"Whether to automatically synchronize and aggregate data from new AWS Regions when those Regions come online.","SourceRegions":"The `SyncSource` AWS Regions included in the resource data sync.","SourceType":"The type of data source for the resource data sync. `SourceType` is either `AwsOrganizations` (if an organization is present in AWS Organizations ) or `SingleAccountMultiRegions` ."}},"AWS::SSM::ResourcePolicy":{"attributes":{"PolicyHash":"ID of the current policy version. The hash helps to prevent a situation where multiple users attempt to overwrite a policy. You must provide this hash and the policy ID when updating or deleting a policy.","PolicyId":"ID of the current policy version.","Ref":""},"description":"Creates or updates a Systems Manager resource policy. A resource policy helps you to define the IAM entity (for example, an AWS account ) that can manage your Systems Manager resources. Currently, `OpsItemGroup` is the only resource that supports Systems Manager resource policies. The resource policy for `OpsItemGroup` enables AWS accounts to view and interact with OpsCenter operational work items (OpsItems). OpsCenter is a capability of Systems Manager .","properties":{"Policy":"A policy you want to associate with a resource.","ResourceArn":"Amazon Resource Name (ARN) of the resource to which you want to attach a policy."}},"AWS::SSMContacts::Contact":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `Contact` resource, such as `arn:aws:ssm-contacts:us-west-2:123456789012:contact/contactalias` .","Ref":"`Ref` returns the ARN of the resource."},"description":"The `AWS::SSMContacts::Contact` resource specifies a contact or escalation plan. Incident Manager contacts are a subset of actions and data types that you can use for managing responder engagement and interaction.","properties":{"Alias":"The unique and identifiable alias of the contact or escalation plan.","DisplayName":"The full name of the contact or escalation plan.","Plan":"A list of stages. A contact has an engagement plan with stages that contact specified contact channels. An escalation plan uses stages that contact specified contacts.","Type":"Refers to the type of contact:\\n\\n- `PERSONAL` : A single, individual contact.\\n- `ESCALATION` : An escalation plan.\\n- `ONCALL_SCHEDULE` : An on-call schedule."}},"AWS::SSMContacts::Contact.ChannelTargetInfo":{"attributes":{},"description":"Information about the contact channel that Incident Manager uses to engage the contact.","properties":{"ChannelId":"The Amazon Resource Name (ARN) of the contact channel.","RetryIntervalInMinutes":"The number of minutes to wait before retrying to send engagement if the engagement initially failed."}},"AWS::SSMContacts::Contact.ContactTargetInfo":{"attributes":{},"description":"The contact that Incident Manager is engaging during an incident.","properties":{"ContactId":"The Amazon Resource Name (ARN) of the contact.","IsEssential":"A Boolean value determining if the contact\'s acknowledgement stops the progress of stages in the plan."}},"AWS::SSMContacts::Contact.Stage":{"attributes":{},"description":"The `Stage` property type specifies a set amount of time that an escalation plan or engagement plan engages the specified contacts or contact methods.","properties":{"DurationInMinutes":"The time to wait until beginning the next stage. The duration can only be set to 0 if a target is specified.","RotationIds":"The Amazon Resource Names (ARNs) of the on-call rotations associated with the plan.","Targets":"The contacts or contact methods that the escalation plan or engagement plan is engaging."}},"AWS::SSMContacts::Contact.Targets":{"attributes":{},"description":"The contact or contact channel that\'s being engaged.","properties":{"ChannelTargetInfo":"Information about the contact channel that Incident Manager engages.","ContactTargetInfo":"The contact that Incident Manager is engaging during an incident."}},"AWS::SSMContacts::ContactChannel":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `ContactChannel` resource.","Ref":"`Ref` returns the ARN of the resource, such as `arn:aws:ssm-contacts:us-west-2:123456789012:contact-channel/contactalias/cec1bb12-34f5-6789-a1ee-e1ca2345d6f7` ."},"description":"The `AWS::SSMContacts::ContactChannel` resource specifies a contact channel as the method that Incident Manager uses to engage your contact.","properties":{"ChannelAddress":"The details that Incident Manager uses when trying to engage the contact channel.","ChannelName":"The name of the contact channel.","ChannelType":"The type of the contact channel. Incident Manager supports three contact methods:\\n\\n- SMS\\n- VOICE\\n- EMAIL","ContactId":"The Amazon Resource Name (ARN) of the contact you are adding the contact channel to.","DeferActivation":"If you want to activate the channel at a later time, you can choose to defer activation. Incident Manager can\'t engage your contact channel until it has been activated."}},"AWS::SSMContacts::Plan":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `Plan` resource.","Ref":""},"description":"Information about the stages and on-call rotation teams associated with an escalation plan or engagement plan.","properties":{"ContactId":"The Amazon Resource Name (ARN) of the contact.","RotationIds":"The Amazon Resource Names (ARNs) of the on-call rotations associated with the plan.","Stages":"A list of stages that the escalation plan or engagement plan uses to engage contacts and contact methods."}},"AWS::SSMContacts::Plan.ChannelTargetInfo":{"attributes":{},"description":"Information about the contact channel that Incident Manager uses to engage the contact.","properties":{"ChannelId":"The Amazon Resource Name (ARN) of the contact channel.","RetryIntervalInMinutes":"The number of minutes to wait before retrying to send engagement if the engagement initially failed."}},"AWS::SSMContacts::Plan.ContactTargetInfo":{"attributes":{},"description":"The contact that Incident Manager is engaging during an incident.","properties":{"ContactId":"The Amazon Resource Name (ARN) of the contact.","IsEssential":"A Boolean value determining if the contact\'s acknowledgement stops the progress of stages in the plan."}},"AWS::SSMContacts::Plan.Stage":{"attributes":{},"description":"A set amount of time that an escalation plan or engagement plan engages the specified contacts or contact methods.","properties":{"DurationInMinutes":"The time to wait until beginning the next stage. The duration can only be set to 0 if a target is specified.","Targets":"The contacts or contact methods that the escalation plan or engagement plan is engaging."}},"AWS::SSMContacts::Plan.Targets":{"attributes":{},"description":"The contact or contact channel that\'s being engaged.","properties":{"ChannelTargetInfo":"Information about the contact channel that Incident Manager engages.","ContactTargetInfo":"Information about the contact that Incident Manager engages."}},"AWS::SSMContacts::Rotation":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the `Rotation` resource.","Ref":""},"description":"Specifies a rotation in an on-call schedule.","properties":{"ContactIds":"The Amazon Resource Names (ARNs) of the contacts to add to the rotation.\\n\\nThe order in which you list the contacts is their shift order in the rotation schedule.","Name":"The name for the rotation.","Recurrence":"Information about the rule that specifies when shift team members rotate.","StartTime":"The date and time the rotation goes into effect.","Tags":"Optional metadata to assign to the rotation. Tags enable you to categorize a resource in different ways, such as by purpose, owner, or environment. For more information, see [Tagging Incident Manager resources](https://docs.aws.amazon.com/incident-manager/latest/userguide/tagging.html) in the *Incident Manager User Guide* .","TimeZoneId":"The time zone to base the rotation’s activity on, in Internet Assigned Numbers Authority (IANA) format. For example: \\"America/Los_Angeles\\", \\"UTC\\", or \\"Asia/Seoul\\". For more information, see the [Time Zone Database](https://docs.aws.amazon.com/https://www.iana.org/time-zones) on the IANA website."}},"AWS::SSMContacts::Rotation.CoverageTime":{"attributes":{},"description":"Information about when an on-call shift begins and ends.","properties":{"EndTime":"Information about when an on-call rotation shift ends.","StartTime":"Information about when an on-call rotation shift begins."}},"AWS::SSMContacts::Rotation.MonthlySetting":{"attributes":{},"description":"Information about on-call rotations that recur monthly.","properties":{"DayOfMonth":"The day of the month when monthly recurring on-call rotations begin.","HandOffTime":"The time of day when a monthly recurring on-call shift rotation begins."}},"AWS::SSMContacts::Rotation.RecurrenceSettings":{"attributes":{},"description":"Information about when an on-call rotation is in effect and how long the rotation period lasts.","properties":{"DailySettings":"Information about on-call rotations that recur daily.","MonthlySettings":"Information about on-call rotations that recur monthly.","NumberOfOnCalls":"The number of contacts, or shift team members designated to be on call concurrently during a shift. For example, in an on-call schedule that contains ten contacts, a value of `2` designates that two of them are on call at any given time.","RecurrenceMultiplier":"The number of days, weeks, or months a single rotation lasts.","ShiftCoverages":"Information about the days of the week included in on-call rotation coverage.","WeeklySettings":"Information about on-call rotations that recur weekly."}},"AWS::SSMContacts::Rotation.ShiftCoverage":{"attributes":{},"description":"Information about the days of the week that the on-call rotation coverage includes.","properties":{"CoverageTimes":"The start and end times of the shift.","DayOfWeek":"A list of days on which the schedule is active."}},"AWS::SSMContacts::Rotation.WeeklySetting":{"attributes":{},"description":"Information about rotations that recur weekly.","properties":{"DayOfWeek":"The day of the week when weekly recurring on-call shift rotations begins.","HandOffTime":"The time of day when a weekly recurring on-call shift rotation begins."}},"AWS::SSMIncidents::ReplicationSet":{"attributes":{},"description":"The `AWS::SSMIncidents::ReplicationSet` resource specifies a set of Regions that Incident Manager data is replicated to and the KMS key used to encrypt the data.","properties":{"DeletionProtected":"Determines if the replication set deletion protection is enabled or not. If deletion protection is enabled, you can\'t delete the last Region in the replication set.","Regions":"Specifies the Regions of the replication set.","Tags":"A list of tags to add to the replication set."}},"AWS::SSMIncidents::ReplicationSet.RegionConfiguration":{"attributes":{},"description":"The `RegionConfiguration` property specifies the Region and KMS key to add to the replication set.","properties":{"SseKmsKeyId":"The KMS key ID to use to encrypt your replication set."}},"AWS::SSMIncidents::ReplicationSet.ReplicationRegion":{"attributes":{},"description":"The `ReplicationRegion` property type specifies the Region and KMS key to add to the replication set.","properties":{"RegionConfiguration":"Specifies the Region configuration.","RegionName":"Specifies the region name to add to the replication set."}},"AWS::SSMIncidents::ResponsePlan":{"attributes":{},"description":"The `AWS::SSMIncidents::ResponsePlan` resource specifies the details of the response plan that are used when creating an incident.","properties":{"Actions":"The actions that the response plan starts at the beginning of an incident.","ChatChannel":"The AWS Chatbot chat channel used for collaboration during an incident.","DisplayName":"The human readable name of the response plan.","Engagements":"The Amazon Resource Name (ARN) for the contacts and escalation plans that the response plan engages during an incident.","IncidentTemplate":"Details used to create an incident when using this response plan.","Integrations":"Information about third-party services integrated into the response plan.","Name":"The name of the response plan.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::SSMIncidents::ResponsePlan.Action":{"attributes":{},"description":"The `Action` property type specifies the configuration to launch.","properties":{"SsmAutomation":"Details about the Systems Manager automation document that will be used as a runbook during an incident."}},"AWS::SSMIncidents::ResponsePlan.ChatChannel":{"attributes":{},"description":"The AWS Chatbot chat channel used for collaboration during an incident.","properties":{"ChatbotSns":"The SNS targets that AWS Chatbot uses to notify the chat channel of updates to an incident. You can also make updates to the incident through the chat channel by using the SNS topics"}},"AWS::SSMIncidents::ResponsePlan.DynamicSsmParameter":{"attributes":{},"description":"When you add a runbook to a response plan, you can specify the parameters the runbook should use at runtime. Response plans support parameters with both static and dynamic values. For static values, you enter the value when you define the parameter in the response plan. For dynamic values, the system determines the correct parameter value by collecting information from the incident. Incident Manager supports the following dynamic parameters:\\n\\n*Incident ARN*\\n\\nWhen Incident Manager creates an incident, the system captures the Amazon Resource Name (ARN) of the corresponding incident record and enters it for this parameter in the runbook.\\n\\n> This value can only be assigned to parameters of type `String` . If assigned to a parameter of any other type, the runbook fails to run. \\n\\n*Involved resources*\\n\\nWhen Incident Manager creates an incident, the system captures the ARNs of the resources involved in the incident. These resource ARNs are then assigned to this parameter in the runbook.\\n\\n> This value can only be assigned to parameters of type `StringList` . If assigned to a parameter of any other type, the runbook fails to run.","properties":{"Key":"The key parameter to use when running the Systems Manager Automation runbook.","Value":"The dynamic parameter value."}},"AWS::SSMIncidents::ResponsePlan.DynamicSsmParameterValue":{"attributes":{},"description":"The dynamic parameter value.","properties":{"Variable":"Variable dynamic parameters. A parameter value is determined when an incident is created."}},"AWS::SSMIncidents::ResponsePlan.IncidentTemplate":{"attributes":{},"description":"The `IncidentTemplate` property type specifies details used to create an incident when using this response plan.","properties":{"DedupeString":"Used to create only one incident record for an incident.","Impact":"Defines the impact to the customers. Providing an impact overwrites the impact provided by a response plan.\\n\\n**Possible impacts:** - `1` - Critical impact, this typically relates to full application failure that impacts many to all customers.\\n- `2` - High impact, partial application failure with impact to many customers.\\n- `3` - Medium impact, the application is providing reduced service to customers.\\n- `4` - Low impact, customer might aren\'t impacted by the problem yet.\\n- `5` - No impact, customers aren\'t currently impacted but urgent action is needed to avoid impact.","IncidentTags":"Tags to assign to the template. When the `StartIncident` API action is called, Incident Manager assigns the tags specified in the template to the incident.","NotificationTargets":"The SNS targets that AWS Chatbot uses to notify the chat channel of updates to an incident. You can also make updates to the incident through the chat channel using the SNS topics.","Summary":"The summary describes what has happened during the incident.","Title":"The title of the incident is a brief and easily recognizable."}},"AWS::SSMIncidents::ResponsePlan.Integration":{"attributes":{},"description":"Information about third-party services integrated into a response plan.","properties":{"PagerDutyConfiguration":"Information about the PagerDuty service where the response plan creates an incident."}},"AWS::SSMIncidents::ResponsePlan.NotificationTargetItem":{"attributes":{},"description":"The SNS topic that\'s used by AWS Chatbot to notify the incidents chat channel.","properties":{"SnsTopicArn":"The Amazon Resource Name (ARN) of the SNS topic."}},"AWS::SSMIncidents::ResponsePlan.PagerDutyConfiguration":{"attributes":{},"description":"Details about the PagerDuty configuration for a response plan.","properties":{"Name":"The name of the PagerDuty configuration.","PagerDutyIncidentConfiguration":"Details about the PagerDuty service associated with the configuration.","SecretId":"The ID of the AWS Secrets Manager secret that stores your PagerDuty key, either a General Access REST API Key or User Token REST API Key, and other user credentials."}},"AWS::SSMIncidents::ResponsePlan.PagerDutyIncidentConfiguration":{"attributes":{},"description":"Details about the PagerDuty service where the response plan creates an incident.","properties":{"ServiceId":"The ID of the PagerDuty service that the response plan associates with an incident when it launches."}},"AWS::SSMIncidents::ResponsePlan.SsmAutomation":{"attributes":{},"description":"The `SsmAutomation` property type specifies details about the Systems Manager automation document that will be used as a runbook during an incident.","properties":{"DocumentName":"The automation document\'s name.","DocumentVersion":"The automation document\'s version to use when running.","DynamicParameters":"The key-value pairs to resolve dynamic parameter values when processing a Systems Manager Automation runbook.","Parameters":"The key-value pair parameters to use when running the automation document.","RoleArn":"The Amazon Resource Name (ARN) of the role that the automation document will assume when running commands.","TargetAccount":"The account that the automation document will be run in. This can be in either the management account or an application account."}},"AWS::SSMIncidents::ResponsePlan.SsmParameter":{"attributes":{},"description":"The key-value pair parameters to use when running the automation document.","properties":{"Key":"The key parameter to use when running the automation document.","Values":"The value parameter to use when running the automation document."}},"AWS::SSO::Assignment":{"attributes":{"Ref":"`Ref` returns a generated ID, combined by all fields with the delimiter `|` ."},"description":"Assigns access to a Principal for a specified AWS account using a specified permission set.\\n\\n> The term *principal* here refers to a user or group that is defined in IAM Identity Center .","properties":{"InstanceArn":"The ARN of the IAM Identity Center instance under which the operation will be executed. For more information about ARNs, see [Amazon Resource Names (ARNs) and AWS Service Namespaces](https://docs.aws.amazon.com//general/latest/gr/aws-arns-and-namespaces.html) in the *AWS General Reference* .","PermissionSetArn":"The ARN of the permission set.","PrincipalId":"An identifier for an object in IAM Identity Center, such as a user or group. PrincipalIds are GUIDs (For example, f81d4fae-7dec-11d0-a765-00a0c91e6bf6). For more information about PrincipalIds in IAM Identity Center, see the [IAM Identity Center Identity Store API Reference](https://docs.aws.amazon.com//singlesignon/latest/IdentityStoreAPIReference/welcome.html) .","PrincipalType":"The entity type for which the assignment will be created.","TargetId":"TargetID is an AWS account identifier, (For example, 123456789012).","TargetType":"The entity type for which the assignment will be created."}},"AWS::SSO::InstanceAccessControlAttributeConfiguration":{"attributes":{"Ref":"Specifies the IAM Identity Center identity store attributes to add to your ABAC configuration. When using an external identity provider as an identity source, you can pass attributes through the SAML assertion. Doing so provides an alternative to configuring attributes from the IAM Identity Center identity store. If a SAML assertion passes any of these attributes, IAM Identity Center will replace the attribute value with the value from the IAM Identity Center identity store."},"description":"Enables the attribute-based access control (ABAC) feature for the specified IAM Identity Center instance. You can also specify new attributes to add to your ABAC configuration during the enabling process. For more information about ABAC, see [Attribute-Based Access Control](https://docs.aws.amazon.com//singlesignon/latest/userguide/abac.html) in the *IAM Identity Center User Guide* .\\n\\n> The `InstanceAccessControlAttributeConfiguration` property has been deprecated but is still supported for backwards compatibility purposes. We recommend that you use the `AccessControlAttributes` property instead.","properties":{"AccessControlAttributes":"Lists the attributes that are configured for ABAC in the specified IAM Identity Center instance.","InstanceArn":"The ARN of the IAM Identity Center instance under which the operation will be executed."}},"AWS::SSO::InstanceAccessControlAttributeConfiguration.AccessControlAttribute":{"attributes":{},"description":"These are IAM Identity Center identity store attributes that you can configure for use in attributes-based access control (ABAC). You can create permissions policies that determine who can access your AWS resources based upon the configured attribute values. When you enable ABAC and specify `AccessControlAttributes` , IAM Identity Center passes the attribute values of the authenticated user into IAM for use in policy evaluation.","properties":{"Key":"The name of the attribute associated with your identities in your identity source. This is used to map a specified attribute in your identity source with an attribute in IAM Identity Center .","Value":"The value used for mapping a specified attribute to an identity source."}},"AWS::SSO::InstanceAccessControlAttributeConfiguration.AccessControlAttributeValue":{"attributes":{},"description":"The value used for mapping a specified attribute to an identity source.","properties":{"Source":"The identity source to use when mapping a specified attribute to IAM Identity Center ."}},"AWS::SSO::PermissionSet":{"attributes":{"PermissionSetArn":"The permission set ARN of the permission set, such as `arn:aws:sso:::permissionSet/ins-instanceid/ps-permissionsetid` .","Ref":"`Ref` returns a generated ID, such as `permission-arn|sso-instance-arn` ."},"description":"Specifies a permission set within a specified IAM Identity Center instance.","properties":{"CustomerManagedPolicyReferences":"Specifies the names and paths of the customer managed policies that you have attached to your permission set.","Description":"The description of the `PermissionSet` .","InlinePolicy":"The inline policy that is attached to the permission set.\\n\\n> For `Length Constraints` , if a valid ARN is provided for a permission set, it is possible for an empty inline policy to be returned.","InstanceArn":"The ARN of the IAM Identity Center instance under which the operation will be executed. For more information about ARNs, see [Amazon Resource Names (ARNs) and AWS Service Namespaces](https://docs.aws.amazon.com//general/latest/gr/aws-arns-and-namespaces.html) in the *AWS General Reference* .","ManagedPolicies":"A structure that stores the details of the AWS managed policy.","Name":"The name of the permission set.","PermissionsBoundary":"Specifies the configuration of the AWS managed or customer managed policy that you want to set as a permissions boundary. Specify either `CustomerManagedPolicyReference` to use the name and path of a customer managed policy, or `ManagedPolicyArn` to use the ARN of an AWS managed policy. A permissions boundary represents the maximum permissions that any policy can grant your role. For more information, see [Permissions boundaries for IAM entities](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html) in the *IAM User Guide* .\\n\\n> Policies used as permissions boundaries don\'t provide permissions. You must also attach an IAM policy to the role. To learn how the effective permissions for a role are evaluated, see [IAM JSON policy evaluation logic](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html) in the *IAM User Guide* .","RelayStateType":"Used to redirect users within the application during the federation authentication process.","SessionDuration":"The length of time that the application user sessions are valid for in the ISO-8601 standard.","Tags":"The tags to attach to the new `PermissionSet` ."}},"AWS::SSO::PermissionSet.CustomerManagedPolicyReference":{"attributes":{},"description":"Specifies the name and path of a customer managed policy. You must have an IAM policy that matches the name and path in each AWS account where you want to deploy your permission set.","properties":{"Name":"The name of the IAM policy that you have configured in each account where you want to deploy your permission set.","Path":"The path to the IAM policy that you have configured in each account where you want to deploy your permission set. The default is `/` . For more information, see [Friendly names and paths](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names) in the *IAM User Guide* ."}},"AWS::SSO::PermissionSet.PermissionsBoundary":{"attributes":{},"description":"Specifies the configuration of the AWS managed or customer managed policy that you want to set as a permissions boundary. Specify either `CustomerManagedPolicyReference` to use the name and path of a customer managed policy, or `ManagedPolicyArn` to use the ARN of an AWS managed policy. A permissions boundary represents the maximum permissions that any policy can grant your role. For more information, see [Permissions boundaries for IAM entities](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html) in the *IAM User Guide* .\\n\\n> Policies used as permissions boundaries don\'t provide permissions. You must also attach an IAM policy to the role. To learn how the effective permissions for a role are evaluated, see [IAM JSON policy evaluation logic](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html) in the *IAM User Guide* .","properties":{"CustomerManagedPolicyReference":"Specifies the name and path of a customer managed policy. You must have an IAM policy that matches the name and path in each AWS account where you want to deploy your permission set.","ManagedPolicyArn":"The AWS managed policy ARN that you want to attach to a permission set as a permissions boundary."}},"AWS::SageMaker::App":{"attributes":{"AppArn":"The Amazon Resource Name (ARN) of the app, such as `arn:aws:sagemaker:us-west-2:account-id:app/my-app-name` .","Ref":"`Ref` returns the app type, app name, Domain ID, and user profile name."},"description":"Creates a running app for the specified UserProfile. This operation is automatically invoked by Amazon SageMaker Studio upon access to the associated Domain, and when new kernel configurations are selected by the user. A user may have multiple Apps active simultaneously.","properties":{"AppName":"The name of the app.","AppType":"The type of app.\\n\\n*Allowed Values* : `JupyterServer | KernelGateway | RSessionGateway | RStudioServerPro | TensorBoard | Canvas`","DomainId":"The domain ID.","ResourceSpec":"Specifies the ARNs of a SageMaker image and SageMaker image version, and the instance type that the version runs on.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","UserProfileName":"The user profile name."}},"AWS::SageMaker::App.ResourceSpec":{"attributes":{},"description":"Specifies the ARN\'s of a SageMaker image and SageMaker image version, and the instance type that the version runs on.","properties":{"InstanceType":"The instance type that the image version runs on.\\n\\n> *JupyterServer apps* only support the `system` value.\\n> \\n> For *KernelGateway apps* , the `system` value is translated to `ml.t3.medium` . KernelGateway apps also support all other values for available instance types.","SageMakerImageArn":"The ARN of the SageMaker image that the image version belongs to.","SageMakerImageVersionArn":"The ARN of the image version created on the instance."}},"AWS::SageMaker::AppImageConfig":{"attributes":{"AppImageConfigArn":"The Amazon Resource Name (ARN) of the AppImageConfig, such as `arn:aws:sagemaker:us-west-2:account-id:app-image-config/my-app-image-config-name` .","Ref":"`Ref` returns the name of the AppImageConfig."},"description":"Creates a configuration for running a SageMaker image as a KernelGateway app. The configuration specifies the Amazon Elastic File System (EFS) storage volume on the image, and a list of the kernels in the image.","properties":{"AppImageConfigName":"The name of the AppImageConfig. Must be unique to your account.","KernelGatewayImageConfig":"The configuration for the file system and kernels in the SageMaker image.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::SageMaker::AppImageConfig.FileSystemConfig":{"attributes":{},"description":"The Amazon Elastic File System (EFS) storage configuration for a SageMaker image.","properties":{"DefaultGid":"The default POSIX group ID (GID). If not specified, defaults to `100` .","DefaultUid":"The default POSIX user ID (UID). If not specified, defaults to `1000` .","MountPath":"The path within the image to mount the user\'s EFS home directory. The directory should be empty. If not specified, defaults to */home/sagemaker-user* ."}},"AWS::SageMaker::AppImageConfig.KernelGatewayImageConfig":{"attributes":{},"description":"The configuration for the file system and kernels in a SageMaker image running as a KernelGateway app.","properties":{"FileSystemConfig":"The Amazon Elastic File System (EFS) storage configuration for a SageMaker image.","KernelSpecs":"The specification of the Jupyter kernels in the image."}},"AWS::SageMaker::AppImageConfig.KernelSpec":{"attributes":{},"description":"The specification of a Jupyter kernel.","properties":{"DisplayName":"The display name of the kernel.","Name":"The name of the Jupyter kernel in the image. This value is case sensitive."}},"AWS::SageMaker::CodeRepository":{"attributes":{"CodeRepositoryName":"The name of the code repository, such as `myCodeRepo` .","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the code repository."},"description":"Creates a Git repository as a resource in your SageMaker account. You can associate the repository with notebook instances so that you can use Git source control for the notebooks you create. The Git repository is a resource in your SageMaker account, so it can be associated with more than one notebook instance, and it persists independently from the lifecycle of any notebook instances it is associated with.\\n\\nThe repository can be hosted either in [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) or in any other Git repository.","properties":{"CodeRepositoryName":"The name of the Git repository.","GitConfig":"Configuration details for the Git repository, including the URL where it is located and the ARN of the AWS Secrets Manager secret that contains the credentials used to access the repository.","Tags":"List of tags for Code Repository."}},"AWS::SageMaker::CodeRepository.GitConfig":{"attributes":{},"description":"Specifies configuration details for a Git repository in your AWS account.","properties":{"Branch":"The default branch for the Git repository.","RepositoryUrl":"The URL where the Git repository is located.","SecretArn":"The Amazon Resource Name (ARN) of the AWS Secrets Manager secret that contains the credentials used to access the git repository. The secret must have a staging label of `AWSCURRENT` and must be in the following format:\\n\\n`{\\"username\\": *UserName* , \\"password\\": *Password* }`"}},"AWS::SageMaker::DataQualityJobDefinition":{"attributes":{"CreationTime":"The time when the job definition was created.","JobDefinitionArn":"The Amazon Resource Name (ARN) of the job definition.","Ref":""},"description":"Creates a definition for a job that monitors data quality and drift. For information about model monitor, see [Amazon SageMaker Model Monitor](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor.html) .","properties":{"DataQualityAppSpecification":"Specifies the container that runs the monitoring job.","DataQualityBaselineConfig":"Configures the constraints and baselines for the monitoring job.","DataQualityJobInput":"A list of inputs for the monitoring job. Currently endpoints are supported as monitoring inputs.","DataQualityJobOutputConfig":"The output configuration for monitoring jobs.","EndpointName":"","JobDefinitionName":"The name for the monitoring job definition.","JobResources":"Identifies the resources to deploy for a monitoring job.","NetworkConfig":"Specifies networking configuration for the monitoring job.","RoleArn":"The Amazon Resource Name (ARN) of an IAM role that Amazon SageMaker can assume to perform tasks on your behalf.","StoppingCondition":"A time limit for how long the monitoring job is allowed to run before stopping.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::SageMaker::DataQualityJobDefinition.BatchTransformInput":{"attributes":{},"description":"","properties":{"DataCapturedDestinationS3Uri":"","DatasetFormat":"","LocalPath":"","S3DataDistributionType":"","S3InputMode":""}},"AWS::SageMaker::DataQualityJobDefinition.ClusterConfig":{"attributes":{},"description":"The configuration for the cluster of resources used to run the processing job.","properties":{"InstanceCount":"The number of ML compute instances to use in the model monitoring job. For distributed processing jobs, specify a value greater than 1. The default value is 1.","InstanceType":"The ML compute instance type for the processing job.","VolumeKmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the model monitoring job.","VolumeSizeInGB":"The size of the ML storage volume, in gigabytes, that you want to provision. You must specify sufficient ML storage for your scenario."}},"AWS::SageMaker::DataQualityJobDefinition.ConstraintsResource":{"attributes":{},"description":"The constraints resource for a monitoring job.","properties":{"S3Uri":"The Amazon S3 URI for the constraints resource."}},"AWS::SageMaker::DataQualityJobDefinition.Csv":{"attributes":{},"description":"","properties":{"Header":""}},"AWS::SageMaker::DataQualityJobDefinition.DataQualityAppSpecification":{"attributes":{},"description":"Information about the container that a data quality monitoring job runs.","properties":{"ContainerArguments":"The arguments to send to the container that the monitoring job runs.","ContainerEntrypoint":"The entrypoint for a container used to run a monitoring job.","Environment":"Sets the environment variables in the container that the monitoring job runs.","ImageUri":"The container image that the data quality monitoring job runs.","PostAnalyticsProcessorSourceUri":"An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.","RecordPreprocessorSourceUri":"An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers."}},"AWS::SageMaker::DataQualityJobDefinition.DataQualityBaselineConfig":{"attributes":{},"description":"Configuration for monitoring constraints and monitoring statistics. These baseline resources are compared against the results of the current job from the series of jobs scheduled to collect data periodically.","properties":{"BaseliningJobName":"The name of the job that performs baselining for the data quality monitoring job.","ConstraintsResource":"The constraints resource for a monitoring job.","StatisticsResource":"Configuration for monitoring constraints and monitoring statistics. These baseline resources are compared against the results of the current job from the series of jobs scheduled to collect data periodically."}},"AWS::SageMaker::DataQualityJobDefinition.DataQualityJobInput":{"attributes":{},"description":"The input for the data quality monitoring job. Currently endpoints are supported for input.","properties":{"BatchTransformInput":"","EndpointInput":"Input object for the endpoint"}},"AWS::SageMaker::DataQualityJobDefinition.DatasetFormat":{"attributes":{},"description":"","properties":{"Csv":"","Json":"","Parquet":""}},"AWS::SageMaker::DataQualityJobDefinition.EndpointInput":{"attributes":{},"description":"Input object for the endpoint","properties":{"EndpointName":"An endpoint in customer\'s account which has enabled `DataCaptureConfig` enabled.","LocalPath":"Path to the filesystem where the endpoint data is available to the container.","S3DataDistributionType":"Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to `FullyReplicated`","S3InputMode":"Whether the `Pipe` or `File` is used as the input mode for transferring data for the monitoring job. `Pipe` mode is recommended for large datasets. `File` mode is useful for small files that fit in memory. Defaults to `File` ."}},"AWS::SageMaker::DataQualityJobDefinition.Json":{"attributes":{},"description":"","properties":{"Line":""}},"AWS::SageMaker::DataQualityJobDefinition.MonitoringOutput":{"attributes":{},"description":"The output object for a monitoring job.","properties":{"S3Output":"The Amazon S3 storage location where the results of a monitoring job are saved."}},"AWS::SageMaker::DataQualityJobDefinition.MonitoringOutputConfig":{"attributes":{},"description":"The output configuration for monitoring jobs.","properties":{"KmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption.","MonitoringOutputs":"Monitoring outputs for monitoring jobs. This is where the output of the periodic monitoring jobs is uploaded."}},"AWS::SageMaker::DataQualityJobDefinition.MonitoringResources":{"attributes":{},"description":"Identifies the resources to deploy for a monitoring job.","properties":{"ClusterConfig":"The configuration for the cluster resources used to run the processing job."}},"AWS::SageMaker::DataQualityJobDefinition.NetworkConfig":{"attributes":{},"description":"Networking options for a job, such as network traffic encryption between containers, whether to allow inbound and outbound network calls to and from containers, and the VPC subnets and security groups to use for VPC-enabled jobs.","properties":{"EnableInterContainerTrafficEncryption":"Whether to encrypt all communications between distributed processing jobs. Choose `True` to encrypt communications. Encryption provides greater security for distributed processing jobs, but the processing might take longer.","EnableNetworkIsolation":"Whether to allow inbound and outbound network calls to and from the containers used for the processing job.","VpcConfig":"Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC."}},"AWS::SageMaker::DataQualityJobDefinition.S3Output":{"attributes":{},"description":"The Amazon S3 storage location where the results of a monitoring job are saved.","properties":{"LocalPath":"The local path to the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job. LocalPath is an absolute path for the output data.","S3UploadMode":"Whether to upload the results of the monitoring job continuously or after the job completes.","S3Uri":"A URI that identifies the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job."}},"AWS::SageMaker::DataQualityJobDefinition.StatisticsResource":{"attributes":{},"description":"The statistics resource for a monitoring job.","properties":{"S3Uri":"The Amazon S3 URI for the statistics resource."}},"AWS::SageMaker::DataQualityJobDefinition.StoppingCondition":{"attributes":{},"description":"Specifies a limit to how long a model training job or model compilation job can run. It also specifies how long a managed spot training job has to complete. When the job reaches the time limit, SageMaker ends the training or compilation job. Use this API to cap model training costs.\\n\\nTo stop a training job, SageMaker sends the algorithm the `SIGTERM` signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts, so the results of training are not lost.\\n\\nThe training algorithms provided by SageMaker automatically save the intermediate results of a model training job when possible. This attempt to save artifacts is only a best effort case as model might not be in a state from which it can be saved. For example, if training has just started, the model might not be ready to save. When saved, this intermediate data is a valid model artifact. You can use it to create a model with `CreateModel` .\\n\\n> The Neural Topic Model (NTM) currently does not support saving intermediate model artifacts. When training NTMs, make sure that the maximum runtime is sufficient for the training job to complete.","properties":{"MaxRuntimeInSeconds":"The maximum length of time, in seconds, that a training or compilation job can run before it is stopped.\\n\\nFor compilation jobs, if the job does not complete during this time, a `TimeOut` error is generated. We recommend starting with 900 seconds and increasing as necessary based on your model.\\n\\nFor all other jobs, if the job does not complete during this time, SageMaker ends the job. When `RetryStrategy` is specified in the job request, `MaxRuntimeInSeconds` specifies the maximum time for all of the attempts in total, not each individual attempt. The default value is 1 day. The maximum value is 28 days.\\n\\nThe maximum time that a `TrainingJob` can run in total, including any time spent publishing metrics or archiving and uploading models after it has been stopped, is 30 days."}},"AWS::SageMaker::DataQualityJobDefinition.VpcConfig":{"attributes":{},"description":"Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see [Protect Endpoints by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html) and [Protect Training Jobs by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html) .","properties":{"SecurityGroupIds":"The VPC security group IDs, in the form sg-xxxxxxxx. Specify the security groups for the VPC that is specified in the `Subnets` field.","Subnets":"The ID of the subnets in the VPC to which you want to connect your training job or model. For information about the availability of specific instance types, see [Supported Instance Types and Availability Zones](https://docs.aws.amazon.com/sagemaker/latest/dg/instance-types-az.html) ."}},"AWS::SageMaker::Device":{"attributes":{"Ref":"`Ref` returns the DeviceFleetName."},"description":"The `AWS::SageMaker::Device` resource is an Amazon SageMaker resource type that allows you to register your Devices against an existing SageMaker Edge Manager DeviceFleet. Each device must be listed individually in the CFN specification.","properties":{"Device":"Edge device you want to create.","DeviceFleetName":"The name of the fleet the device belongs to.","Tags":"An array of key-value pairs that contain metadata to help you categorize and organize your devices. Each tag consists of a key and a value, both of which you define."}},"AWS::SageMaker::Device.Device":{"attributes":{},"description":"Information of a particular device.","properties":{"Description":"Description of the device.","DeviceName":"The name of the device.","IotThingName":"AWS Internet of Things (IoT) object name."}},"AWS::SageMaker::DeviceFleet":{"attributes":{"Ref":"`Ref` returns the DeviceFleetName."},"description":"The `AWS::SageMaker::DeviceFleet` resource is an Amazon SageMaker resource type that allows you to create a DeviceFleet that manages your SageMaker Edge Manager Devices. You must register your devices against the `DeviceFleet` separately.","properties":{"Description":"A description of the fleet.","DeviceFleetName":"Name of the device fleet.","OutputConfig":"The output configuration for storing sample data collected by the fleet.","RoleArn":"The Amazon Resource Name (ARN) that has access to AWS Internet of Things (IoT).","Tags":"An array of key-value pairs that contain metadata to help you categorize and organize your device fleets. Each tag consists of a key and a value, both of which you define."}},"AWS::SageMaker::DeviceFleet.EdgeOutputConfig":{"attributes":{},"description":"The output configuration for storing sample data collected by the fleet.","properties":{"KmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt data on the storage volume after compilation job. If you don\'t provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role\'s account.","S3OutputLocation":"The Amazon Simple Storage (S3) bucket URI."}},"AWS::SageMaker::Domain":{"attributes":{"DomainArn":"The Amazon Resource Name (ARN) of the Domain, such as `arn:aws:sagemaker:us-west-2:account-id:domain/my-domain-name` .","DomainId":"The Domain ID.","HomeEfsFileSystemId":"The ID of the Amazon Elastic File System (EFS) managed by this Domain.","Ref":"`Ref` returns the Domain ID, such as `d-xxxxxxxxxxxx` .","SecurityGroupIdForDomainBoundary":"The ID of the security group that authorizes traffic between the `RSessionGateway` apps and the `RStudioServerPro` app.","SingleSignOnManagedApplicationInstanceId":"The IAM Identity Center managed application instance ID.","Url":"The URL for the Domain."},"description":"Creates a `Domain` used by Amazon SageMaker Studio. A domain consists of an associated Amazon Elastic File System (EFS) volume, a list of authorized users, and a variety of security, application, policy, and Amazon Virtual Private Cloud (VPC) configurations. Users within a domain can share notebook files and other artifacts with each other.\\n\\n*EFS storage*\\n\\nWhen a domain is created, an EFS volume is created for use by all of the users within the domain. Each user receives a private home directory within the EFS volume for notebooks, Git repositories, and data files.\\n\\nSageMaker uses the AWS Key Management Service ( AWS KMS) to encrypt the EFS volume attached to the domain with an AWS managed key by default. For more control, you can specify a customer managed key. For more information, see [Protect Data at Rest Using Encryption](https://docs.aws.amazon.com/sagemaker/latest/dg/encryption-at-rest.html) .\\n\\n*VPC configuration*\\n\\nAll SageMaker Studio traffic between the domain and the EFS volume is through the specified VPC and subnets. For other Studio traffic, you can specify the `AppNetworkAccessType` parameter. `AppNetworkAccessType` corresponds to the network access type that you choose when you onboard to Studio. The following options are available:\\n\\n- `PublicInternetOnly` - Non-EFS traffic goes through a VPC managed by Amazon SageMaker, which allows internet access. This is the default value.\\n- `VpcOnly` - All Studio traffic is through the specified VPC and subnets. Internet access is disabled by default. To allow internet access, you must specify a NAT gateway.\\n\\nWhen internet access is disabled, you won\'t be able to run a Studio notebook or to train or host models unless your VPC has an interface endpoint to the SageMaker API and runtime or a NAT gateway and your security groups allow outbound connections.\\n\\n> NFS traffic over TCP on port 2049 needs to be allowed in both inbound and outbound rules in order to launch a SageMaker Studio app successfully. \\n\\nFor more information, see [Connect SageMaker Studio Notebooks to Resources in a VPC](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-notebooks-and-internet-access.html) .","properties":{"AppNetworkAccessType":"Specifies the VPC used for non-EFS traffic. The default value is `PublicInternetOnly` .\\n\\n- `PublicInternetOnly` - Non-EFS traffic is through a VPC managed by Amazon SageMaker , which allows direct internet access\\n- `VpcOnly` - All Studio traffic is through the specified VPC and subnets\\n\\n*Valid Values* : `PublicInternetOnly | VpcOnly`","AppSecurityGroupManagement":"The entity that creates and manages the required security groups for inter-app communication in `VpcOnly` mode. Required when `CreateDomain.AppNetworkAccessType` is `VpcOnly` and `DomainSettings.RStudioServerProDomainSettings.DomainExecutionRoleArn` is provided. If setting up the domain for use with RStudio, this value must be set to `Service` .\\n\\n*Allowed Values* : `Service` | `Customer`","AuthMode":"The mode of authentication that members use to access the Domain.\\n\\n*Valid Values* : `SSO | IAM`","DefaultSpaceSettings":"","DefaultUserSettings":"The default user settings.","DomainName":"The domain name.","DomainSettings":"A collection of settings that apply to the `SageMaker Domain` . These settings are specified through the `CreateDomain` API call.","KmsKeyId":"SageMaker uses AWS KMS to encrypt the EFS volume attached to the Domain with an AWS managed customer master key (CMK) by default. For more control, specify a customer managed CMK.\\n\\n*Length Constraints* : Maximum length of 2048.\\n\\n*Pattern* : `.*`","SubnetIds":"The VPC subnets that Studio uses for communication.\\n\\n*Length Constraints* : Maximum length of 32.\\n\\n*Array members* : Minimum number of 1 item. Maximum number of 16 items.\\n\\n*Pattern* : `[-0-9a-zA-Z]+`","Tags":"Tags to associated with the Domain. Each tag consists of a key and an optional value. Tag keys must be unique per resource. Tags are searchable using the Search API.\\n\\nTags that you specify for the Domain are also added to all apps that are launched in the Domain.\\n\\n*Array members* : Minimum number of 0 items. Maximum number of 50 items.","VpcId":"The ID of the Amazon Virtual Private Cloud (Amazon VPC) that Studio uses for communication.\\n\\n*Length Constraints* : Maximum length of 32.\\n\\n*Pattern* : `[-0-9a-zA-Z]+`"}},"AWS::SageMaker::Domain.CustomImage":{"attributes":{},"description":"A custom SageMaker image. For more information, see [Bring your own SageMaker image](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-byoi.html) .","properties":{"AppImageConfigName":"The name of the AppImageConfig.","ImageName":"The name of the CustomImage. Must be unique to your account.","ImageVersionNumber":"The version number of the CustomImage."}},"AWS::SageMaker::Domain.DefaultSpaceSettings":{"attributes":{},"description":"A collection of settings that apply to spaces created in the Domain.","properties":{"ExecutionRole":"The ARN of the execution role for the space.","JupyterServerAppSettings":"The JupyterServer app settings.","KernelGatewayAppSettings":"The KernelGateway app settings.","SecurityGroups":"The security group IDs for the Amazon Virtual Private Cloud that the space uses for communication."}},"AWS::SageMaker::Domain.DomainSettings":{"attributes":{},"description":"A collection of settings that apply to the `SageMaker Domain` . These settings are specified through the `CreateDomain` API call.","properties":{"RStudioServerProDomainSettings":"A collection of settings that configure the `RStudioServerPro` Domain-level app.","SecurityGroupIds":"The security groups for the Amazon Virtual Private Cloud that the `Domain` uses for communication between Domain-level apps and user apps."}},"AWS::SageMaker::Domain.JupyterServerAppSettings":{"attributes":{},"description":"The JupyterServer app settings.","properties":{"DefaultResourceSpec":"The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the JupyterServer app."}},"AWS::SageMaker::Domain.KernelGatewayAppSettings":{"attributes":{},"description":"The KernelGateway app settings.","properties":{"CustomImages":"A list of custom SageMaker images that are configured to run as a KernelGateway app.","DefaultResourceSpec":"The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the KernelGateway app.\\n\\n> The Amazon SageMaker Studio UI does not use the default instance type value set here. The default instance type set here is used when Apps are created using the AWS Command Line Interface or AWS CloudFormation and the instance type parameter value is not passed."}},"AWS::SageMaker::Domain.RSessionAppSettings":{"attributes":{},"description":"A collection of settings that apply to an `RSessionGateway` app.","properties":{"CustomImages":"A list of custom SageMaker images that are configured to run as a RSession app.","DefaultResourceSpec":"Specifies the ARNs of a SageMaker image and SageMaker image version, and the instance type that the version runs on."}},"AWS::SageMaker::Domain.RStudioServerProAppSettings":{"attributes":{},"description":"A collection of settings that configure user interaction with the `RStudioServerPro` app.","properties":{"AccessStatus":"Indicates whether the current user has access to the `RStudioServerPro` app.","UserGroup":"The level of permissions that the user has within the `RStudioServerPro` app. This value defaults to `User`. The `Admin` value allows the user access to the RStudio Administrative Dashboard."}},"AWS::SageMaker::Domain.RStudioServerProDomainSettings":{"attributes":{},"description":"A collection of settings that configure the `RStudioServerPro` Domain-level app.","properties":{"DefaultResourceSpec":"A collection that defines the default `InstanceType` , `SageMakerImageArn` , and `SageMakerImageVersionArn` for the Domain.","DomainExecutionRoleArn":"The ARN of the execution role for the `RStudioServerPro` Domain-level app.","RStudioConnectUrl":"A URL pointing to an RStudio Connect server.","RStudioPackageManagerUrl":"A URL pointing to an RStudio Package Manager server."}},"AWS::SageMaker::Domain.ResourceSpec":{"attributes":{},"description":"Specifies the ARN\'s of a SageMaker image and SageMaker image version, and the instance type that the version runs on.","properties":{"InstanceType":"The instance type that the image version runs on.\\n\\n> *JupyterServer apps* only support the `system` value.\\n> \\n> For *KernelGateway apps* , the `system` value is translated to `ml.t3.medium` . KernelGateway apps also support all other values for available instance types.","LifecycleConfigArn":"The Amazon Resource Name (ARN) of the Lifecycle Configuration attached to the Resource.","SageMakerImageArn":"The ARN of the SageMaker image that the image version belongs to.","SageMakerImageVersionArn":"The ARN of the image version created on the instance."}},"AWS::SageMaker::Domain.SharingSettings":{"attributes":{},"description":"Specifies options when sharing an Amazon SageMaker Studio notebook. These settings are specified as part of `DefaultUserSettings` when the [CreateDomain](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateDomain.html) API is called, and as part of `UserSettings` when the [CreateUserProfile](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateUserProfile.html) API is called.","properties":{"NotebookOutputOption":"Whether to include the notebook cell output when sharing the notebook. The default is `Disabled` .","S3KmsKeyId":"When `NotebookOutputOption` is `Allowed` , the AWS Key Management Service (KMS) encryption key ID used to encrypt the notebook cell output in the Amazon S3 bucket.","S3OutputPath":"When `NotebookOutputOption` is `Allowed` , the Amazon S3 bucket used to store the shared notebook snapshots."}},"AWS::SageMaker::Domain.UserSettings":{"attributes":{},"description":"A collection of settings that apply to users of Amazon SageMaker Studio. These settings are specified when the [CreateUserProfile](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateUserProfile.html) API is called, and as `DefaultUserSettings` when the [CreateDomain](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateDomain.html) API is called.\\n\\n`SecurityGroups` is aggregated when specified in both calls. For all other settings in `UserSettings` , the values specified in `CreateUserProfile` take precedence over those specified in `CreateDomain` .","properties":{"ExecutionRole":"The execution role for the user.","JupyterServerAppSettings":"The Jupyter server\'s app settings.","KernelGatewayAppSettings":"The kernel gateway app settings.","RSessionAppSettings":"A collection of settings that configure the `RSessionGateway` app.","RStudioServerProAppSettings":"A collection of settings that configure user interaction with the `RStudioServerPro` app.","SecurityGroups":"The security groups for the Amazon Virtual Private Cloud (VPC) that Studio uses for communication.\\n\\nOptional when the `CreateDomain.AppNetworkAccessType` parameter is set to `PublicInternetOnly` .\\n\\nRequired when the `CreateDomain.AppNetworkAccessType` parameter is set to `VpcOnly` , unless specified as part of the `DefaultUserSettings` for the domain.\\n\\nAmazon SageMaker adds a security group to allow NFS traffic from SageMaker Studio. Therefore, the number of security groups that you can specify is one less than the maximum number shown.","SharingSettings":"Specifies options for sharing SageMaker Studio notebooks."}},"AWS::SageMaker::Endpoint":{"attributes":{"EndpointName":"The name of the endpoint, such as `MyEndpoint` .","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the endpoint, such as `arn:aws:sagemaker:us-west-2:012345678901:endpoint/myendpoint` ."},"description":"Use the `AWS::SageMaker::Endpoint` resource to create an endpoint using the specified configuration in the request. Amazon SageMaker uses the endpoint to provision resources and deploy models. You create the endpoint configuration with the [AWS::SageMaker::EndpointConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html) resource. For more information, see [Deploy a Model on Amazon SageMaker Hosting Services](https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-hosting.html) in the *Amazon SageMaker Developer Guide* .","properties":{"DeploymentConfig":"The deployment configuration for an endpoint, which contains the desired deployment strategy and rollback configurations.","EndpointConfigName":"The name of the [AWS::SageMaker::EndpointConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html) resource that specifies the configuration for the endpoint. For more information, see [CreateEndpointConfig](https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateEndpointConfig.html) .","EndpointName":"The name of the endpoint.The name must be unique within an AWS Region in your AWS account. The name is case-insensitive in `CreateEndpoint` , but the case is preserved and must be matched in [](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html) .","ExcludeRetainedVariantProperties":"When you are updating endpoint resources with [RetainAllVariantProperties](https://docs.aws.amazon.com/sagemaker/latest/dg/API_UpdateEndpoint.html#SageMaker-UpdateEndpoint-request-RetainAllVariantProperties) whose value is set to `true` , `ExcludeRetainedVariantProperties` specifies the list of type [VariantProperty](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-variantproperty.html) to override with the values provided by `EndpointConfig` . If you don\'t specify a value for `ExcludeAllVariantProperties` , no variant properties are overridden. Don\'t use this property when creating new endpoint resources or when `RetainAllVariantProperties` is set to `false` .","RetainAllVariantProperties":"When updating endpoint resources, enables or disables the retention of variant properties, such as the instance count or the variant weight. To retain the variant properties of an endpoint when updating it, set `RetainAllVariantProperties` to `true` . To use the variant properties specified in a new `EndpointConfig` call when updating an endpoint, set `RetainAllVariantProperties` to `false` . Use this property only when updating endpoint resources, not when creating new endpoint resources.","RetainDeploymentConfig":"Specifies whether to reuse the last deployment configuration. The default value is false (the configuration is not reused).","Tags":"A list of key-value pairs to apply to this resource.\\n\\nFor more information, see [Resource Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) and [Using Cost Allocation Tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html#allocation-what) in the *AWS Billing and Cost Management User Guide* ."}},"AWS::SageMaker::Endpoint.Alarm":{"attributes":{},"description":"An Amazon CloudWatch alarm configured to monitor metrics on an endpoint.","properties":{"AlarmName":"The name of a CloudWatch alarm in your account."}},"AWS::SageMaker::Endpoint.AutoRollbackConfig":{"attributes":{},"description":"Automatic rollback configuration for handling endpoint deployment failures and recovery.","properties":{"Alarms":"List of CloudWatch alarms in your account that are configured to monitor metrics on an endpoint. If any alarms are tripped during a deployment, SageMaker rolls back the deployment."}},"AWS::SageMaker::Endpoint.BlueGreenUpdatePolicy":{"attributes":{},"description":"Update policy for a blue/green deployment. If this update policy is specified, SageMaker creates a new fleet during the deployment while maintaining the old fleet. SageMaker flips traffic to the new fleet according to the specified traffic routing configuration. Only one update policy should be used in the deployment configuration. If no update policy is specified, SageMaker uses a blue/green deployment strategy with all at once traffic shifting by default.","properties":{"MaximumExecutionTimeoutInSeconds":"Maximum execution timeout for the deployment. Note that the timeout value should be larger than the total waiting time specified in `TerminationWaitInSeconds` and `WaitIntervalInSeconds` .","TerminationWaitInSeconds":"Additional waiting time in seconds after the completion of an endpoint deployment before terminating the old endpoint fleet. Default is 0.","TrafficRoutingConfiguration":"Defines the traffic routing strategy to shift traffic from the old fleet to the new fleet during an endpoint deployment."}},"AWS::SageMaker::Endpoint.CapacitySize":{"attributes":{},"description":"Specifies the type and size of the endpoint capacity to activate for a blue/green deployment, a rolling deployment, or a rollback strategy. You can specify your batches as either instance count or the overall percentage or your fleet.\\n\\nFor a rollback strategy, if you don\'t specify the fields in this object, or if you set the `Value` to 100%, then SageMaker uses a blue/green rollback strategy and rolls all traffic back to the blue fleet.","properties":{"Type":"Specifies the endpoint capacity type.\\n\\n- `INSTANCE_COUNT` : The endpoint activates based on the number of instances.\\n- `CAPACITY_PERCENT` : The endpoint activates based on the specified percentage of capacity.","Value":"Defines the capacity size, either as a number of instances or a capacity percentage."}},"AWS::SageMaker::Endpoint.DeploymentConfig":{"attributes":{},"description":"The deployment configuration for an endpoint, which contains the desired deployment strategy and rollback configurations.","properties":{"AutoRollbackConfiguration":"Automatic rollback configuration for handling endpoint deployment failures and recovery.","BlueGreenUpdatePolicy":"Update policy for a blue/green deployment. If this update policy is specified, SageMaker creates a new fleet during the deployment while maintaining the old fleet. SageMaker flips traffic to the new fleet according to the specified traffic routing configuration. Only one update policy should be used in the deployment configuration. If no update policy is specified, SageMaker uses a blue/green deployment strategy with all at once traffic shifting by default."}},"AWS::SageMaker::Endpoint.TrafficRoutingConfig":{"attributes":{},"description":"Defines the traffic routing strategy during an endpoint deployment to shift traffic from the old fleet to the new fleet.","properties":{"CanarySize":"Batch size for the first step to turn on traffic on the new endpoint fleet. `Value` must be less than or equal to 50% of the variant\'s total instance count.","LinearStepSize":"Batch size for each step to turn on traffic on the new endpoint fleet. `Value` must be 10-50% of the variant\'s total instance count.","Type":"Traffic routing strategy type.\\n\\n- `ALL_AT_ONCE` : Endpoint traffic shifts to the new fleet in a single step.\\n- `CANARY` : Endpoint traffic shifts to the new fleet in two steps. The first step is the canary, which is a small portion of the traffic. The second step is the remainder of the traffic.\\n- `LINEAR` : Endpoint traffic shifts to the new fleet in n steps of a configurable size.","WaitIntervalInSeconds":"The waiting time (in seconds) between incremental steps to turn on traffic on the new endpoint fleet."}},"AWS::SageMaker::Endpoint.VariantProperty":{"attributes":{},"description":"Specifies a production variant property type for an Endpoint.\\n\\nIf you are updating an Endpoint with the [RetainAllVariantProperties](https://docs.aws.amazon.com/sagemaker/latest/dg/API_UpdateEndpoint.html#SageMaker-UpdateEndpoint-request-RetainAllVariantProperties) option set to `true` , the `VarientProperty` objects listed in [ExcludeRetainedVariantProperties](https://docs.aws.amazon.com/sagemaker/latest/dg/API_UpdateEndpoint.html#SageMaker-UpdateEndpoint-request-ExcludeRetainedVariantProperties) override the existing variant properties of the Endpoint.","properties":{"VariantPropertyType":"The type of variant property. The supported values are:\\n\\n- `DesiredInstanceCount` : Overrides the existing variant instance counts using the [InitialInstanceCount](https://docs.aws.amazon.com/sagemaker/latest/dg/API_ProductionVariant.html#SageMaker-Type-ProductionVariant-InitialInstanceCount) values in the [ProductionVariants](https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateEndpointConfig.html#SageMaker-CreateEndpointConfig-request-ProductionVariants) .\\n- `DesiredWeight` : Overrides the existing variant weights using the [InitialVariantWeight](https://docs.aws.amazon.com/sagemaker/latest/dg/API_ProductionVariant.html#SageMaker-Type-ProductionVariant-InitialVariantWeight) values in the [ProductionVariants](https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateEndpointConfig.html#SageMaker-CreateEndpointConfig-request-ProductionVariants) .\\n- `DataCaptureConfig` : (Not currently supported.)"}},"AWS::SageMaker::EndpointConfig":{"attributes":{"EndpointConfigName":"The name of the endpoint configuration, such as `MyEndpointConfiguration` .","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the endpoint configuration, such as `arn:aws:sagemaker:us-west-2:01234567>8901:endpoint-config/myendpointconfig`"},"description":"The `AWS::SageMaker::EndpointConfig` resource creates a configuration for an Amazon SageMaker endpoint. For more information, see [CreateEndpointConfig](https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateEndpointConfig.html) in the *SageMaker Developer Guide* .","properties":{"AsyncInferenceConfig":"Specifies configuration for how an endpoint performs asynchronous inference.","DataCaptureConfig":"Specifies how to capture endpoint data for model monitor. The data capture configuration applies to all production variants hosted at the endpoint.","EndpointConfigName":"The name of the endpoint configuration.","ExplainerConfig":"","KmsKeyId":"The Amazon Resource Name (ARN) of an AWS Key Management Service key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance that hosts the endpoint.\\n\\n- Key ID: `1234abcd-12ab-34cd-56ef-1234567890ab`\\n- Key ARN: `arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab`\\n- Alias name: `alias/ExampleAlias`\\n- Alias name ARN: `arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias`\\n\\nThe KMS key policy must grant permission to the IAM role that you specify in your `CreateEndpoint` , `UpdateEndpoint` requests. For more information, refer to the AWS Key Management Service section [Using Key Policies in AWS KMS](https://docs.aws.amazon.com//kms/latest/developerguide/key-policies.html)\\n\\n> Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can\'t request a `KmsKeyId` when using an instance type with local storage. If any of the models that you specify in the `ProductionVariants` parameter use nitro-based instances with local storage, do not specify a value for the `KmsKeyId` parameter. If you specify a value for `KmsKeyId` when using any nitro-based instances with local storage, the call to `CreateEndpointConfig` fails.\\n> \\n> For a list of instance types that support local instance storage, see [Instance Store Volumes](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes) .\\n> \\n> For more information about local instance storage encryption, see [SSD Instance Store Volumes](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html) .","ProductionVariants":"A list of `ProductionVariant` objects, one for each model that you want to host at this endpoint.","ShadowProductionVariants":"Array of `ProductionVariant` objects. There is one for each model that you want to host at this endpoint in shadow mode with production traffic replicated from the model specified on `ProductionVariants` . If you use this field, you can only specify one variant for `ProductionVariants` and one variant for `ShadowProductionVariants` .","Tags":"A list of key-value pairs to apply to this resource.\\n\\nFor more information, see [Resource Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) and [Using Cost Allocation Tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html#allocation-what) ."}},"AWS::SageMaker::EndpointConfig.AsyncInferenceClientConfig":{"attributes":{},"description":"Configures the behavior of the client used by SageMaker to interact with the model container during asynchronous inference.","properties":{"MaxConcurrentInvocationsPerInstance":"The maximum number of concurrent requests sent by the SageMaker client to the model container. If no value is provided, SageMaker will choose an optimal value for you."}},"AWS::SageMaker::EndpointConfig.AsyncInferenceConfig":{"attributes":{},"description":"Specifies configuration for how an endpoint performs asynchronous inference.","properties":{"ClientConfig":"Configures the behavior of the client used by SageMaker to interact with the model container during asynchronous inference.","OutputConfig":"Specifies the configuration for asynchronous inference invocation outputs."}},"AWS::SageMaker::EndpointConfig.AsyncInferenceNotificationConfig":{"attributes":{},"description":"Specifies the configuration for notifications of inference results for asynchronous inference.","properties":{"ErrorTopic":"Amazon SNS topic to post a notification to when an inference fails. If no topic is provided, no notification is sent on failure.","IncludeInferenceResponseIn":"","SuccessTopic":"Amazon SNS topic to post a notification to when an inference completes successfully. If no topic is provided, no notification is sent on success."}},"AWS::SageMaker::EndpointConfig.AsyncInferenceOutputConfig":{"attributes":{},"description":"Specifies the configuration for asynchronous inference invocation outputs.","properties":{"KmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt the asynchronous inference output in Amazon S3.","NotificationConfig":"Specifies the configuration for notifications of inference results for asynchronous inference.","S3FailurePath":"","S3OutputPath":"The Amazon S3 location to upload inference responses to."}},"AWS::SageMaker::EndpointConfig.CaptureContentTypeHeader":{"attributes":{},"description":"Specifies the JSON and CSV content types of the data that the endpoint captures.","properties":{"CsvContentTypes":"A list of the CSV content types of the data that the endpoint captures. For the endpoint to capture the data, you must also specify the content type when you invoke the endpoint.","JsonContentTypes":"A list of the JSON content types of the data that the endpoint captures. For the endpoint to capture the data, you must also specify the content type when you invoke the endpoint."}},"AWS::SageMaker::EndpointConfig.CaptureOption":{"attributes":{},"description":"Specifies whether the endpoint captures input data or output data.","properties":{"CaptureMode":"Specifies whether the endpoint captures input data or output data."}},"AWS::SageMaker::EndpointConfig.ClarifyExplainerConfig":{"attributes":{},"description":"","properties":{"EnableExplanations":"","InferenceConfig":"","ShapConfig":""}},"AWS::SageMaker::EndpointConfig.ClarifyFeatureType":{"attributes":{},"description":"","properties":{}},"AWS::SageMaker::EndpointConfig.ClarifyHeader":{"attributes":{},"description":"","properties":{}},"AWS::SageMaker::EndpointConfig.ClarifyInferenceConfig":{"attributes":{},"description":"","properties":{"ContentTemplate":"","FeatureHeaders":"","FeatureTypes":"","FeaturesAttribute":"","LabelAttribute":"","LabelHeaders":"","LabelIndex":"","MaxPayloadInMB":"","MaxRecordCount":"","ProbabilityAttribute":"","ProbabilityIndex":""}},"AWS::SageMaker::EndpointConfig.ClarifyShapBaselineConfig":{"attributes":{},"description":"","properties":{"MimeType":"","ShapBaseline":"","ShapBaselineUri":""}},"AWS::SageMaker::EndpointConfig.ClarifyShapConfig":{"attributes":{},"description":"","properties":{"NumberOfSamples":"","Seed":"","ShapBaselineConfig":"","TextConfig":"","UseLogit":""}},"AWS::SageMaker::EndpointConfig.ClarifyTextConfig":{"attributes":{},"description":"","properties":{"Granularity":"","Language":""}},"AWS::SageMaker::EndpointConfig.DataCaptureConfig":{"attributes":{},"description":"Specifies the configuration of your endpoint for model monitor data capture.","properties":{"CaptureContentTypeHeader":"A list of the JSON and CSV content type that the endpoint captures.","CaptureOptions":"Specifies whether the endpoint captures input data to your model, output data from your model, or both.","DestinationS3Uri":"The S3 bucket where model monitor stores captured data.","EnableCapture":"Set to `True` to enable data capture.","InitialSamplingPercentage":"The percentage of data to capture.","KmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt the captured data at rest using Amazon S3 server-side encryption. The KmsKeyId can be any of the following formats: Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab Key ARN: arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab Alias name: alias/ExampleAlias Alias name ARN: arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias If you don\'t provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role\'s account. For more information, see KMS-Managed Encryption Keys (https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html) in the Amazon Simple Storage Service Developer Guide. The KMS key policy must grant permission to the IAM role that you specify in your CreateModel (https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html) request. For more information, see Using Key Policies in AWS KMS (http://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) in the AWS Key Management Service Developer Guide."}},"AWS::SageMaker::EndpointConfig.ExplainerConfig":{"attributes":{},"description":"","properties":{"ClarifyExplainerConfig":""}},"AWS::SageMaker::EndpointConfig.ProductionVariant":{"attributes":{},"description":"Specifies a model that you want to host and the resources to deploy for hosting it. If you are deploying multiple models, tell Amazon SageMaker how to distribute traffic among the models by specifying the `InitialVariantWeight` objects.","properties":{"AcceleratorType":"The size of the Elastic Inference (EI) instance to use for the production variant. EI instances provide on-demand GPU computing for inference. For more information, see [Using Elastic Inference in Amazon SageMaker](https://docs.aws.amazon.com/sagemaker/latest/dg/ei.html) . For more information, see [Using Elastic Inference in Amazon SageMaker](https://docs.aws.amazon.com/sagemaker/latest/dg/ei.html) .","ContainerStartupHealthCheckTimeoutInSeconds":"","EnableSSMAccess":"","InitialInstanceCount":"Number of instances to launch initially.","InitialVariantWeight":"Determines initial traffic distribution among all of the models that you specify in the endpoint configuration. The traffic to a production variant is determined by the ratio of the `VariantWeight` to the sum of all `VariantWeight` values across all ProductionVariants. If unspecified, it defaults to 1.0.","InstanceType":"The ML compute instance type.","ModelDataDownloadTimeoutInSeconds":"","ModelName":"The name of the model that you want to host. This is the name that you specified when creating the model.","ServerlessConfig":"The serverless configuration for an endpoint. Specifies a serverless endpoint configuration instead of an instance-based endpoint configuration.","VariantName":"The name of the production variant.","VolumeSizeInGB":""}},"AWS::SageMaker::EndpointConfig.ServerlessConfig":{"attributes":{},"description":"Specifies the serverless configuration for an endpoint variant.","properties":{"MaxConcurrency":"The maximum number of concurrent invocations your serverless endpoint can process.","MemorySizeInMB":"The memory size of your serverless endpoint. Valid values are in 1 GB increments: 1024 MB, 2048 MB, 3072 MB, 4096 MB, 5120 MB, or 6144 MB.","ProvisionedConcurrency":""}},"AWS::SageMaker::FeatureGroup":{"attributes":{"Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the `FeatureGroupName` of the feature group."},"description":"Create a new `FeatureGroup` . A `FeatureGroup` is a group of `Features` defined in the `FeatureStore` to describe a `Record` .\\n\\nThe `FeatureGroup` defines the schema and features contained in the FeatureGroup. A `FeatureGroup` definition is composed of a list of `Features` , a `RecordIdentifierFeatureName` , an `EventTimeFeatureName` and configurations for its `OnlineStore` and `OfflineStore` . Check [AWS service quotas](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html) to see the `FeatureGroup` s quota for your AWS account.\\n\\n> You must include at least one of `OnlineStoreConfig` and `OfflineStoreConfig` to create a `FeatureGroup` .","properties":{"Description":"A free form description of a `FeatureGroup` .","EventTimeFeatureName":"The name of the feature that stores the `EventTime` of a Record in a `FeatureGroup` .\\n\\nA `EventTime` is point in time when a new event occurs that corresponds to the creation or update of a `Record` in `FeatureGroup` . All `Records` in the `FeatureGroup` must have a corresponding `EventTime` .","FeatureDefinitions":"A list of `Feature` s. Each `Feature` must include a `FeatureName` and a `FeatureType` .\\n\\nValid `FeatureType` s are `Integral` , `Fractional` and `String` .\\n\\n`FeatureName` s cannot be any of the following: `is_deleted` , `write_time` , `api_invocation_time` .\\n\\nYou can create up to 2,500 `FeatureDefinition` s per `FeatureGroup` .","FeatureGroupName":"The name of the `FeatureGroup` .","OfflineStoreConfig":"The configuration of an `OfflineStore` .","OnlineStoreConfig":"The configuration of an `OnlineStore` .","RecordIdentifierFeatureName":"The name of the `Feature` whose value uniquely identifies a `Record` defined in the `FeatureGroup` `FeatureDefinitions` .","RoleArn":"The Amazon Resource Name (ARN) of the IAM execution role used to create the feature group.","Tags":"Tags used to define a `FeatureGroup` ."}},"AWS::SageMaker::FeatureGroup.DataCatalogConfig":{"attributes":{},"description":"The meta data of the Glue table which serves as data catalog for the `OfflineStore` .","properties":{"Catalog":"The name of the Glue table catalog.","Database":"The name of the Glue table database.","TableName":"The name of the Glue table."}},"AWS::SageMaker::FeatureGroup.FeatureDefinition":{"attributes":{},"description":"A list of features. You must include `FeatureName` and `FeatureType` . Valid feature `FeatureType` s are `Integral` , `Fractional` and `String` .","properties":{"FeatureName":"The name of a feature. The type must be a string. `FeatureName` cannot be any of the following: `is_deleted` , `write_time` , `api_invocation_time` .","FeatureType":"The value type of a feature. Valid values are Integral, Fractional, or String."}},"AWS::SageMaker::FeatureGroup.OfflineStoreConfig":{"attributes":{},"description":"The configuration of an `OfflineStore` .\\n\\nProvide an `OfflineStoreConfig` in a request to `CreateFeatureGroup` to create an `OfflineStore` .\\n\\nTo encrypt an `OfflineStore` using at rest data encryption, specify AWS Key Management Service (KMS) key ID, or `KMSKeyId` , in `S3StorageConfig` .","properties":{"DataCatalogConfig":"The meta data of the Glue table that is autogenerated when an `OfflineStore` is created.","DisableGlueTableCreation":"Set to `True` to disable the automatic creation of an AWS Glue table when configuring an `OfflineStore` . If set to `False` , Feature Store will name the `OfflineStore` Glue table following [Athena\'s naming recommendations](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html) .\\n\\nThe default value is `False` .","S3StorageConfig":"The Amazon Simple Storage (Amazon S3) location of `OfflineStore` .","TableFormat":""}},"AWS::SageMaker::FeatureGroup.OnlineStoreConfig":{"attributes":{},"description":"Use this to specify the AWS Key Management Service (KMS) Key ID, or `KMSKeyId` , for at rest data encryption. You can turn `OnlineStore` on or off by specifying the `EnableOnlineStore` flag at General Assembly.\\n\\nThe default value is `False` .","properties":{"EnableOnlineStore":"Turn `OnlineStore` off by specifying `False` for the `EnableOnlineStore` flag. Turn `OnlineStore` on by specifying `True` for the `EnableOnlineStore` flag.\\n\\nThe default value is `False` .","SecurityConfig":"Use to specify KMS Key ID ( `KMSKeyId` ) for at-rest encryption of your `OnlineStore` ."}},"AWS::SageMaker::FeatureGroup.OnlineStoreSecurityConfig":{"attributes":{},"description":"The security configuration for `OnlineStore` .","properties":{"KmsKeyId":"The AWS Key Management Service (KMS) key ARN that SageMaker Feature Store uses to encrypt the Amazon S3 objects at rest using Amazon S3 server-side encryption.\\n\\nThe caller (either user or IAM role) of `CreateFeatureGroup` must have below permissions to the `OnlineStore` `KmsKeyId` :\\n\\n- `\\"kms:Encrypt\\"`\\n- `\\"kms:Decrypt\\"`\\n- `\\"kms:DescribeKey\\"`\\n- `\\"kms:CreateGrant\\"`\\n- `\\"kms:RetireGrant\\"`\\n- `\\"kms:ReEncryptFrom\\"`\\n- `\\"kms:ReEncryptTo\\"`\\n- `\\"kms:GenerateDataKey\\"`\\n- `\\"kms:ListAliases\\"`\\n- `\\"kms:ListGrants\\"`\\n- `\\"kms:RevokeGrant\\"`\\n\\nThe caller (either user or IAM role) to all DataPlane operations ( `PutRecord` , `GetRecord` , `DeleteRecord` ) must have the following permissions to the `KmsKeyId` :\\n\\n- `\\"kms:Decrypt\\"`"}},"AWS::SageMaker::FeatureGroup.S3StorageConfig":{"attributes":{},"description":"The Amazon Simple Storage (Amazon S3) location and and security configuration for `OfflineStore` .","properties":{"KmsKeyId":"The AWS Key Management Service (KMS) key ARN of the key used to encrypt any objects written into the `OfflineStore` S3 location.\\n\\nThe IAM `roleARN` that is passed as a parameter to `CreateFeatureGroup` must have below permissions to the `KmsKeyId` :\\n\\n- `\\"kms:GenerateDataKey\\"`","S3Uri":"The S3 URI, or location in Amazon S3, of `OfflineStore` .\\n\\nS3 URIs have a format similar to the following: `s3://example-bucket/prefix/` ."}},"AWS::SageMaker::Image":{"attributes":{"ImageArn":"The Amazon Resource Name (ARN) of the image.\\n\\n*Type* : String\\n\\n*Length Constraints* : Maximum length of 256.\\n\\n*Pattern* : `^arn:aws(-[\\\\w]+)*:sagemaker:.+:[0-9]{12}:image/[a-z0-9]([-.]?[a-z0-9])*$`","Ref":"`Ref` returns the ImageArn."},"description":"Creates a custom SageMaker image. A SageMaker image is a set of image versions. Each image version represents a container image stored in Amazon Elastic Container Registry (ECR). For more information, see [Bring your own SageMaker image](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-byoi.html) .","properties":{"ImageDescription":"The description of the image.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 512.\\n\\n*Pattern* : `.*`","ImageDisplayName":"The display name of the image.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 128.\\n\\n*Pattern* : `^\\\\S(.*\\\\S)?$`","ImageName":"The name of the Image. Must be unique by region in your account.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 63.\\n\\n*Pattern* : `^[a-zA-Z0-9]([-.]?[a-zA-Z0-9]){0,62}$`","ImageRoleArn":"The Amazon Resource Name (ARN) of an IAM role that enables Amazon SageMaker to perform tasks on your behalf.\\n\\n*Length Constraints* : Minimum length of 20. Maximum length of 2048.\\n\\n*Pattern* : `^arn:aws[a-z\\\\-]*:iam::\\\\d{12}:role/?[a-zA-Z_0-9+=,.@\\\\-_/]+$`","Tags":"A list of key-value pairs to apply to this resource.\\n\\n*Array Members* : Minimum number of 0 items. Maximum number of 50 items."}},"AWS::SageMaker::ImageVersion":{"attributes":{"ContainerImage":"The URI of the container image version referenced by ImageVersion.","ImageArn":"The Amazon Resource Name (ARN) of the parent Image.","ImageVersionArn":"The Amazon Resource Name (ARN) of the image version.\\n\\n*Type* : String\\n\\n*Length Constraints* : Maximum length of 256.\\n\\n*Pattern* : `^arn:aws(-[\\\\w]+)*:sagemaker:.+:[0-9]{12}:image-version/[a-z0-9]([-.]?[a-z0-9])*/[0-9]+$`","Ref":"`Ref` returns the ImageVersionArn.","Version":"The version of the image."},"description":"Creates a version of the SageMaker image specified by `ImageName` . The version represents the Amazon Container Registry (ECR) container image specified by `BaseImage` .\\n\\n> You can use the `DependsOn` attribute to specify that the creation of a specific resource follows another. You can use it for the following use cases. For more information, see [`DependsOn` attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) .\\n> \\n> 1. `DependsOn` can be used to establish a parent/child relationship between `ImageVersion` and `Image` where the `ImageVersion` `DependsOn` the `Image` .\\n> \\n> 2. `DependsOn` can be used to establish order among `ImageVersion` s within the same `Image` namespace. For example, if ImageVersionB `DependsOn` ImageVersionA and both share the same parent `Image` , then ImageVersionA is version N and ImageVersionB is N+1.","properties":{"BaseImage":"The container image that the SageMaker image version is based on.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 255.\\n\\n*Pattern* : `.*`","ImageName":"The name of the parent image.\\n\\n*Length Constraints* : Minimum length of 1. Maximum length of 63.\\n\\n*Pattern* : `^[a-zA-Z0-9]([-.]?[a-zA-Z0-9]){0,62}$`"}},"AWS::SageMaker::InferenceExperiment":{"attributes":{"Arn":"","CreationTime":"","EndpointMetadata":"","EndpointMetadata.EndpointConfigName":"","EndpointMetadata.EndpointName":"","EndpointMetadata.EndpointStatus":"","LastModifiedTime":"","Ref":"","Status":""},"description":"Creates an inference experiment using the configurations specified in the request.\\n\\nUse this API to setup and schedule an experiment to compare model variants on a Amazon SageMaker inference endpoint. For more information about inference experiments, see [Shadow tests](https://docs.aws.amazon.com/sagemaker/latest/dg/shadow-tests.html) .\\n\\nAmazon SageMaker begins your experiment at the scheduled time and routes traffic to your endpoint\'s model variants based on your specified configuration.\\n\\nWhile the experiment is in progress or after it has concluded, you can view metrics that compare your model variants. For more information, see [View, monitor, and edit shadow tests](https://docs.aws.amazon.com/sagemaker/latest/dg/shadow-tests-view-monitor-edit.html) .","properties":{"DataStorageConfig":"The Amazon S3 location and configuration for storing inference request and response data.","Description":"The description of the inference experiment.","DesiredState":"The desired state of the experiment after stopping. The possible states are the following:\\n\\n- `Completed` : The experiment completed successfully\\n- `Cancelled` : The experiment was canceled","EndpointName":"The name of the endpoint.","KmsKey":"The AWS Key Management Service key that Amazon SageMaker uses to encrypt captured data at rest using Amazon S3 server-side encryption.","ModelVariants":"An array of `ModelVariantConfigSummary` objects. There is one for each variant in the inference experiment. Each `ModelVariantConfigSummary` object in the array describes the infrastructure configuration for deploying the corresponding variant.","Name":"The name of the inference experiment.","RoleArn":"The ARN of the IAM role that Amazon SageMaker can assume to access model artifacts and container images, and manage Amazon SageMaker Inference endpoints for model deployment.","Schedule":"The duration for which the inference experiment ran or will run.\\n\\nThe maximum duration that you can set for an inference experiment is 30 days.","ShadowModeConfig":"The configuration of `ShadowMode` inference experiment type, which shows the production variant that takes all the inference requests, and the shadow variant to which Amazon SageMaker replicates a percentage of the inference requests. For the shadow variant it also shows the percentage of requests that Amazon SageMaker replicates.","StatusReason":"The error message for the inference experiment status result.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","Type":"The type of the inference experiment."}},"AWS::SageMaker::InferenceExperiment.CaptureContentTypeHeader":{"attributes":{},"description":"Configuration specifying how to treat different headers. If no headers are specified SageMaker will by default base64 encode when capturing the data.","properties":{"CsvContentTypes":"The list of all content type headers that SageMaker will treat as CSV and capture accordingly.","JsonContentTypes":"The list of all content type headers that SageMaker will treat as JSON and capture accordingly."}},"AWS::SageMaker::InferenceExperiment.DataStorageConfig":{"attributes":{},"description":"The Amazon S3 location and configuration for storing inference request and response data.\\n\\nThis is an optional parameter that you can use for data capture. For more information, see [Capture data](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-data-capture.html) .","properties":{"ContentType":"Configuration specifying how to treat different headers. If no headers are specified SageMaker will by default base64 encode when capturing the data.","Destination":"The Amazon S3 bucket where the inference request and response data is stored.","KmsKey":"The AWS Key Management Service key that Amazon SageMaker uses to encrypt captured data at rest using Amazon S3 server-side encryption."}},"AWS::SageMaker::InferenceExperiment.EndpointMetadata":{"attributes":{},"description":"The metadata of the endpoint.","properties":{"EndpointConfigName":"The name of the endpoint configuration.","EndpointName":"The name of the endpoint.","EndpointStatus":"The status of the endpoint. For possible values of the status of an endpoint, see [](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-endpointmetadata.html#cfn-sagemaker-inferenceexperiment-endpointmetadata-endpointstatus) ."}},"AWS::SageMaker::InferenceExperiment.InferenceExperimentSchedule":{"attributes":{},"description":"The start and end times of an inference experiment.\\n\\nThe maximum duration that you can set for an inference experiment is 30 days.","properties":{"EndTime":"The timestamp at which the inference experiment ended or will end.","StartTime":"The timestamp at which the inference experiment started or will start."}},"AWS::SageMaker::InferenceExperiment.ModelInfrastructureConfig":{"attributes":{},"description":"The configuration for the infrastructure that the model will be deployed to.","properties":{"InfrastructureType":"The inference option to which to deploy your model. Possible values are the following:\\n\\n- `RealTime` : Deploy to real-time inference.","RealTimeInferenceConfig":"The infrastructure configuration for deploying the model to real-time inference."}},"AWS::SageMaker::InferenceExperiment.ModelVariantConfig":{"attributes":{},"description":"Contains information about the deployment options of a model.","properties":{"InfrastructureConfig":"The configuration for the infrastructure that the model will be deployed to.","ModelName":"The name of the Amazon SageMaker Model entity.","VariantName":"The name of the variant."}},"AWS::SageMaker::InferenceExperiment.RealTimeInferenceConfig":{"attributes":{},"description":"The infrastructure configuration for deploying the model to a real-time inference endpoint.","properties":{"InstanceCount":"The number of instances of the type specified by `InstanceType` .","InstanceType":"The instance type the model is deployed to."}},"AWS::SageMaker::InferenceExperiment.ShadowModeConfig":{"attributes":{},"description":"The configuration of `ShadowMode` inference experiment type, which specifies a production variant to take all the inference requests, and a shadow variant to which Amazon SageMaker replicates a percentage of the inference requests. For the shadow variant it also specifies the percentage of requests that Amazon SageMaker replicates.","properties":{"ShadowModelVariants":"List of shadow variant configurations.","SourceModelVariantName":"The name of the production variant, which takes all the inference requests."}},"AWS::SageMaker::InferenceExperiment.ShadowModelVariantConfig":{"attributes":{},"description":"The name and sampling percentage of a shadow variant.","properties":{"SamplingPercentage":"The percentage of inference requests that Amazon SageMaker replicates from the production variant to the shadow variant.","ShadowModelVariantName":"The name of the shadow variant."}},"AWS::SageMaker::Model":{"attributes":{"ModelName":"The name of the model, such as `MyModel` .","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the model, such as `arn:aws:sagemaker:us-west-2:012345678901:model/mymodel` .\\n\\nWhen you pass the logical ID of an `AWS::SageMaker::Model` resource to the intrinsic `Ref` function, the function returns the Amazon Resource Name (ARN) of the model, such as `arn:aws:sagemaker:us-west-2:012345678901:model/mymodel` ."},"description":"The `AWS::SageMaker::Model` resource to create a model to host at an Amazon SageMaker endpoint. For more information, see [Deploying a Model on Amazon SageMaker Hosting Services](https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-hosting.html) in the *Amazon SageMaker Developer Guide* .","properties":{"Containers":"Specifies the containers in the inference pipeline.","EnableNetworkIsolation":"Isolates the model container. No inbound or outbound network calls can be made to or from the model container.","ExecutionRoleArn":"The Amazon Resource Name (ARN) of the IAM role that SageMaker can assume to access model artifacts and docker image for deployment on ML compute instances or for batch transform jobs. Deploying on ML compute instances is part of model hosting. For more information, see [SageMaker Roles](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html) .\\n\\n> To be able to pass this role to SageMaker, the caller of this API must have the `iam:PassRole` permission.","InferenceExecutionConfig":"Specifies details of how containers in a multi-container endpoint are called.","ModelName":"The name of the new model.","PrimaryContainer":"The location of the primary docker image containing inference code, associated artifacts, and custom environment map that the inference code uses when the model is deployed for predictions.","Tags":"A list of key-value pairs to apply to this resource.\\n\\nFor more information, see [Resource Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) and [Using Cost Allocation Tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html#allocation-what) in the *AWS Billing and Cost Management User Guide* .","VpcConfig":"A [VpcConfig](https://docs.aws.amazon.com/sagemaker/latest/dg/API_VpcConfig.html) object that specifies the VPC that you want your model to connect to. Control access to and from your model container by configuring the VPC. `VpcConfig` is used in hosting services and in batch transform. For more information, see [Protect Endpoints by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html) and [Protect Data in Batch Transform Jobs by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/batch-vpc.html) ."}},"AWS::SageMaker::Model.ContainerDefinition":{"attributes":{},"description":"Describes the container, as part of model definition.","properties":{"ContainerHostname":"This parameter is ignored for models that contain only a `PrimaryContainer` .\\n\\nWhen a `ContainerDefinition` is part of an inference pipeline, the value of the parameter uniquely identifies the container for the purposes of logging and metrics. For information, see [Use Logs and Metrics to Monitor an Inference Pipeline](https://docs.aws.amazon.com/sagemaker/latest/dg/inference-pipeline-logs-metrics.html) . If you don\'t specify a value for this parameter for a `ContainerDefinition` that is part of an inference pipeline, a unique name is automatically assigned based on the position of the `ContainerDefinition` in the pipeline. If you specify a value for the `ContainerHostName` for any `ContainerDefinition` that is part of an inference pipeline, you must specify a value for the `ContainerHostName` parameter of every `ContainerDefinition` in that pipeline.","Environment":"The environment variables to set in the Docker container. Each key and value in the `Environment` string to string map can have length of up to 1024. We support up to 16 entries in the map.","Image":"The path where inference code is stored. This can be either in Amazon EC2 Container Registry or in a Docker registry that is accessible from the same VPC that you configure for your endpoint. If you are using your own custom algorithm instead of an algorithm provided by SageMaker, the inference code must meet SageMaker requirements. SageMaker supports both `registry/repository[:tag]` and `registry/repository[@digest]` image path formats. For more information, see [Using Your Own Algorithms with Amazon SageMaker](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html) .\\n\\n> The model artifacts in an Amazon S3 bucket and the Docker image for inference container in Amazon EC2 Container Registry must be in the same region as the model or endpoint you are creating.","ImageConfig":"Specifies whether the model container is in Amazon ECR or a private Docker registry accessible from your Amazon Virtual Private Cloud (VPC). For information about storing containers in a private Docker registry, see [Use a Private Docker Registry for Real-Time Inference Containers](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-containers-inference-private.html) .\\n\\n> The model artifacts in an Amazon S3 bucket and the Docker image for inference container in Amazon EC2 Container Registry must be in the same region as the model or endpoint you are creating.","InferenceSpecificationName":"The inference specification name in the model package version.","Mode":"Whether the container hosts a single model or multiple models.","ModelDataUrl":"The S3 path where the model artifacts, which result from model training, are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix). The S3 path is required for SageMaker built-in algorithms, but not if you use your own algorithms. For more information on built-in algorithms, see [Common Parameters](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html) .\\n\\n> The model artifacts must be in an S3 bucket that is in the same region as the model or endpoint you are creating. \\n\\nIf you provide a value for this parameter, SageMaker uses AWS Security Token Service to download model artifacts from the S3 path you provide. AWS STS is activated in your AWS account by default. If you previously deactivated AWS STS for a region, you need to reactivate AWS STS for that region. For more information, see [Activating and Deactivating AWS STS in an AWS Region](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) in the *AWS Identity and Access Management User Guide* .\\n\\n> If you use a built-in algorithm to create a model, SageMaker requires that you provide a S3 path to the model artifacts in `ModelDataUrl` .","ModelPackageName":"The name or Amazon Resource Name (ARN) of the model package to use to create the model.","MultiModelConfig":"Specifies additional configuration for multi-model endpoints."}},"AWS::SageMaker::Model.ImageConfig":{"attributes":{},"description":"Specifies whether the model container is in Amazon ECR or a private Docker registry accessible from your Amazon Virtual Private Cloud (VPC).","properties":{"RepositoryAccessMode":"Set this to one of the following values:\\n\\n- `Platform` - The model image is hosted in Amazon ECR.\\n- `Vpc` - The model image is hosted in a private Docker registry in your VPC.","RepositoryAuthConfig":"(Optional) Specifies an authentication configuration for the private docker registry where your model image is hosted. Specify a value for this property only if you specified `Vpc` as the value for the `RepositoryAccessMode` field, and the private Docker registry where the model image is hosted requires authentication."}},"AWS::SageMaker::Model.InferenceExecutionConfig":{"attributes":{},"description":"Specifies details about how containers in a multi-container endpoint are run.","properties":{"Mode":"How containers in a multi-container are run. The following values are valid.\\n\\n- `Serial` - Containers run as a serial pipeline.\\n- `Direct` - Only the individual container that you specify is run."}},"AWS::SageMaker::Model.MultiModelConfig":{"attributes":{},"description":"Specifies additional configuration for hosting multi-model endpoints.","properties":{"ModelCacheSetting":"Whether to cache models for a multi-model endpoint. By default, multi-model endpoints cache models so that a model does not have to be loaded into memory each time it is invoked. Some use cases do not benefit from model caching. For example, if an endpoint hosts a large number of models that are each invoked infrequently, the endpoint might perform better if you disable model caching. To disable model caching, set the value of this parameter to Disabled."}},"AWS::SageMaker::Model.RepositoryAuthConfig":{"attributes":{},"description":"Specifies an authentication configuration for the private docker registry where your model image is hosted. Specify a value for this property only if you specified `Vpc` as the value for the `RepositoryAccessMode` field of the `ImageConfig` object that you passed to a call to `CreateModel` and the private Docker registry where the model image is hosted requires authentication.","properties":{"RepositoryCredentialsProviderArn":"The Amazon Resource Name (ARN) of an AWS Lambda function that provides credentials to authenticate to the private Docker registry where your model image is hosted. For information about how to create an AWS Lambda function, see [Create a Lambda function with the console](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html) in the *AWS Lambda Developer Guide* ."}},"AWS::SageMaker::Model.VpcConfig":{"attributes":{},"description":"Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see [Protect Endpoints by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html) and [Protect Training Jobs by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html) .","properties":{"SecurityGroupIds":"The VPC security group IDs, in the form sg-xxxxxxxx. Specify the security groups for the VPC that is specified in the `Subnets` field.","Subnets":"The ID of the subnets in the VPC to which you want to connect your training job or model. For information about the availability of specific instance types, see [Supported Instance Types and Availability Zones](https://docs.aws.amazon.com/sagemaker/latest/dg/instance-types-az.html) ."}},"AWS::SageMaker::ModelBiasJobDefinition":{"attributes":{"CreationTime":"The time when the job definition was created.","JobDefinitionArn":"The Amazon Resource Name (ARN) of the job definition.","Ref":""},"description":"Creates the definition for a model bias job.","properties":{"EndpointName":"","JobDefinitionName":"The name of the bias job definition. The name must be unique within an AWS Region in the AWS account.","JobResources":"Identifies the resources to deploy for a monitoring job.","ModelBiasAppSpecification":"Configures the model bias job to run a specified Docker container image.","ModelBiasBaselineConfig":"The baseline configuration for a model bias job.","ModelBiasJobInput":"Inputs for the model bias job.","ModelBiasJobOutputConfig":"The output configuration for monitoring jobs.","NetworkConfig":"Networking options for a model bias job.","RoleArn":"The Amazon Resource Name (ARN) of an IAM role that Amazon SageMaker can assume to perform tasks on your behalf.","StoppingCondition":"A time limit for how long the monitoring job is allowed to run before stopping.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::SageMaker::ModelBiasJobDefinition.BatchTransformInput":{"attributes":{},"description":"","properties":{"DataCapturedDestinationS3Uri":"","DatasetFormat":"","EndTimeOffset":"","FeaturesAttribute":"","InferenceAttribute":"","LocalPath":"","ProbabilityAttribute":"","ProbabilityThresholdAttribute":"","S3DataDistributionType":"","S3InputMode":"","StartTimeOffset":""}},"AWS::SageMaker::ModelBiasJobDefinition.ClusterConfig":{"attributes":{},"description":"The configuration for the cluster resources used to run the processing job.","properties":{"InstanceCount":"The number of ML compute instances to use in the model monitoring job. For distributed processing jobs, specify a value greater than 1. The default value is 1.","InstanceType":"The ML compute instance type for the processing job.","VolumeKmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the model monitoring job.","VolumeSizeInGB":"The size of the ML storage volume, in gigabytes, that you want to provision. You must specify sufficient ML storage for your scenario."}},"AWS::SageMaker::ModelBiasJobDefinition.ConstraintsResource":{"attributes":{},"description":"The constraints resource for a monitoring job.","properties":{"S3Uri":"The Amazon S3 URI for the constraints resource."}},"AWS::SageMaker::ModelBiasJobDefinition.Csv":{"attributes":{},"description":"","properties":{"Header":""}},"AWS::SageMaker::ModelBiasJobDefinition.DatasetFormat":{"attributes":{},"description":"","properties":{"Csv":"","Json":"","Parquet":""}},"AWS::SageMaker::ModelBiasJobDefinition.EndpointInput":{"attributes":{},"description":"Input object for the endpoint","properties":{"EndTimeOffset":"If specified, monitoring jobs substract this time from the end time. For information about using offsets for scheduling monitoring jobs, see [Schedule Model Quality Monitoring Jobs](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html) .","EndpointName":"An endpoint in customer\'s account which has enabled `DataCaptureConfig` enabled.","FeaturesAttribute":"The attributes of the input data that are the input features.","InferenceAttribute":"The attribute of the input data that represents the ground truth label.","LocalPath":"Path to the filesystem where the endpoint data is available to the container.","ProbabilityAttribute":"In a classification problem, the attribute that represents the class probability.","ProbabilityThresholdAttribute":"The threshold for the class probability to be evaluated as a positive result.","S3DataDistributionType":"Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to `FullyReplicated`","S3InputMode":"Whether the `Pipe` or `File` is used as the input mode for transferring data for the monitoring job. `Pipe` mode is recommended for large datasets. `File` mode is useful for small files that fit in memory. Defaults to `File` .","StartTimeOffset":"If specified, monitoring jobs substract this time from the start time. For information about using offsets for scheduling monitoring jobs, see [Schedule Model Quality Monitoring Jobs](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html) ."}},"AWS::SageMaker::ModelBiasJobDefinition.Json":{"attributes":{},"description":"","properties":{"Line":""}},"AWS::SageMaker::ModelBiasJobDefinition.ModelBiasAppSpecification":{"attributes":{},"description":"Docker container image configuration object for the model bias job.","properties":{"ConfigUri":"JSON formatted S3 file that defines bias parameters. For more information on this JSON configuration file, see [Configure bias parameters](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-config-json-monitor-bias-parameters.html) .","Environment":"Sets the environment variables in the Docker container.","ImageUri":"The container image to be run by the model bias job."}},"AWS::SageMaker::ModelBiasJobDefinition.ModelBiasBaselineConfig":{"attributes":{},"description":"The configuration for a baseline model bias job.","properties":{"BaseliningJobName":"The name of the baseline model bias job.","ConstraintsResource":"The constraints resource for a monitoring job."}},"AWS::SageMaker::ModelBiasJobDefinition.ModelBiasJobInput":{"attributes":{},"description":"Inputs for the model bias job.","properties":{"BatchTransformInput":"","EndpointInput":"Input object for the endpoint","GroundTruthS3Input":"Location of ground truth labels to use in model bias job."}},"AWS::SageMaker::ModelBiasJobDefinition.MonitoringGroundTruthS3Input":{"attributes":{},"description":"The ground truth labels for the dataset used for the monitoring job.","properties":{"S3Uri":"The address of the Amazon S3 location of the ground truth labels."}},"AWS::SageMaker::ModelBiasJobDefinition.MonitoringOutput":{"attributes":{},"description":"The output object for a monitoring job.","properties":{"S3Output":"The Amazon S3 storage location where the results of a monitoring job are saved."}},"AWS::SageMaker::ModelBiasJobDefinition.MonitoringOutputConfig":{"attributes":{},"description":"The output configuration for monitoring jobs.","properties":{"KmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption.","MonitoringOutputs":"Monitoring outputs for monitoring jobs. This is where the output of the periodic monitoring jobs is uploaded."}},"AWS::SageMaker::ModelBiasJobDefinition.MonitoringResources":{"attributes":{},"description":"Identifies the resources to deploy for a monitoring job.","properties":{"ClusterConfig":"The configuration for the cluster resources used to run the processing job."}},"AWS::SageMaker::ModelBiasJobDefinition.NetworkConfig":{"attributes":{},"description":"Networking options for a job, such as network traffic encryption between containers, whether to allow inbound and outbound network calls to and from containers, and the VPC subnets and security groups to use for VPC-enabled jobs.","properties":{"EnableInterContainerTrafficEncryption":"Whether to encrypt all communications between distributed processing jobs. Choose `True` to encrypt communications. Encryption provides greater security for distributed processing jobs, but the processing might take longer.","EnableNetworkIsolation":"Whether to allow inbound and outbound network calls to and from the containers used for the processing job.","VpcConfig":"Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC."}},"AWS::SageMaker::ModelBiasJobDefinition.S3Output":{"attributes":{},"description":"The Amazon S3 storage location where the results of a monitoring job are saved.","properties":{"LocalPath":"The local path to the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job. `LocalPath` is an absolute path for the output data.","S3UploadMode":"Whether to upload the results of the monitoring job continuously or after the job completes.","S3Uri":"A URI that identifies the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job."}},"AWS::SageMaker::ModelBiasJobDefinition.StoppingCondition":{"attributes":{},"description":"Specifies a limit to how long a model training job or model compilation job can run. It also specifies how long a managed spot training job has to complete. When the job reaches the time limit, SageMaker ends the training or compilation job. Use this API to cap model training costs.\\n\\nTo stop a training job, SageMaker sends the algorithm the `SIGTERM` signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts, so the results of training are not lost.\\n\\nThe training algorithms provided by SageMaker automatically save the intermediate results of a model training job when possible. This attempt to save artifacts is only a best effort case as model might not be in a state from which it can be saved. For example, if training has just started, the model might not be ready to save. When saved, this intermediate data is a valid model artifact. You can use it to create a model with `CreateModel` .\\n\\n> The Neural Topic Model (NTM) currently does not support saving intermediate model artifacts. When training NTMs, make sure that the maximum runtime is sufficient for the training job to complete.","properties":{"MaxRuntimeInSeconds":"The maximum length of time, in seconds, that a training or compilation job can run before it is stopped.\\n\\nFor compilation jobs, if the job does not complete during this time, a `TimeOut` error is generated. We recommend starting with 900 seconds and increasing as necessary based on your model.\\n\\nFor all other jobs, if the job does not complete during this time, SageMaker ends the job. When `RetryStrategy` is specified in the job request, `MaxRuntimeInSeconds` specifies the maximum time for all of the attempts in total, not each individual attempt. The default value is 1 day. The maximum value is 28 days.\\n\\nThe maximum time that a `TrainingJob` can run in total, including any time spent publishing metrics or archiving and uploading models after it has been stopped, is 30 days."}},"AWS::SageMaker::ModelBiasJobDefinition.VpcConfig":{"attributes":{},"description":"Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see [Protect Endpoints by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html) and [Protect Training Jobs by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html) .","properties":{"SecurityGroupIds":"The VPC security group IDs, in the form sg-xxxxxxxx. Specify the security groups for the VPC that is specified in the `Subnets` field.","Subnets":"The ID of the subnets in the VPC to which you want to connect your training job or model. For information about the availability of specific instance types, see [Supported Instance Types and Availability Zones](https://docs.aws.amazon.com/sagemaker/latest/dg/instance-types-az.html) ."}},"AWS::SageMaker::ModelCard":{"attributes":{"CreatedBy.DomainId":"","CreatedBy.UserProfileArn":"","CreationTime":"","LastModifiedBy.DomainId":"","LastModifiedBy.UserProfileArn":"","ModelCardArn":"The Amazon Resource Number (ARN) of the model card. For example, `arn:aws:sagemaker:us-west-2:012345678901:modelcard/examplemodelcard` .","ModelCardProcessingStatus":"","Ref":"`Ref` returns the model card name.\\n\\nFor more information about using the Ref function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates an Amazon SageMaker Model Card.\\n\\nFor information about how to use model cards, see [Amazon SageMaker Model Card](https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards.html) .","properties":{"Content":"The content of the model card. Content uses the [model card JSON schema](https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards.html#model-cards-json-schema) .","CreatedBy":"Information about the user who created or modified one or more of the following:\\n\\n- Experiment\\n- Trial\\n- Trial component\\n- Lineage group\\n- Project\\n- Model Card","LastModifiedBy":"","ModelCardName":"The unique name of the model card.","ModelCardStatus":"The approval status of the model card within your organization. Different organizations might have different criteria for model card review and approval.\\n\\n- `Draft` : The model card is a work in progress.\\n- `PendingReview` : The model card is pending review.\\n- `Approved` : The model card is approved.\\n- `Archived` : The model card is archived. No more updates should be made to the model card, but it can still be exported.","SecurityConfig":"The security configuration used to protect model card data.","Tags":"Key-value pairs used to manage metadata for the model card."}},"AWS::SageMaker::ModelCard.AdditionalInformation":{"attributes":{},"description":"Additional information about the model.","properties":{"CaveatsAndRecommendations":"Caveats and recommendations for those who might use this model in their applications.","CustomDetails":"Any additional information to document about the model.","EthicalConsiderations":"Any ethical considerations documented by the model card author."}},"AWS::SageMaker::ModelCard.BusinessDetails":{"attributes":{},"description":"Information about how the model supports business goals.","properties":{"BusinessProblem":"The specific business problem that the model is trying to solve.","BusinessStakeholders":"The relevant stakeholders for the model.","LineOfBusiness":"The broader business need that the model is serving."}},"AWS::SageMaker::ModelCard.Container":{"attributes":{},"description":"","properties":{"Image":"","ModelDataUrl":"","NearestModelName":""}},"AWS::SageMaker::ModelCard.Content":{"attributes":{},"description":"The content of the model card. It follows the [model card json schema](https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards.html#model-cards-json-schema) .","properties":{"AdditionalInformation":"Additional information about the model.","BusinessDetails":"Information about how the model supports business goals.","EvaluationDetails":"An overview about the model\'s evaluation.","IntendedUses":"The intended usage of the model.","ModelOverview":"An overview about the model","ModelPackageDetails":"","TrainingDetails":"An overview about model training."}},"AWS::SageMaker::ModelCard.EvaluationDetail":{"attributes":{},"description":"The evaluation details of the model.","properties":{"Datasets":"The location of the datasets used to evaluate the model.","EvaluationJobArn":"The Amazon Resource Name (ARN) of the evaluation job.","EvaluationObservation":"Any observations made during the model evaluation.","Metadata":"Additional attributes associated with the evaluation results.","MetricGroups":"An evaluation Metric Group object.","Name":"The evaluation job name."}},"AWS::SageMaker::ModelCard.Function":{"attributes":{},"description":"Function details.","properties":{"Condition":"An optional description of any conditions of your objective function metric.","Facet":"The metric of the model\'s objective function. For example, *loss* or *rmse* . The following list shows examples of the values that you can specify for the metric:\\n\\n- `ACCURACY`\\n- `AUC`\\n- `LOSS`\\n- `MAE`\\n- `RMSE`","Function":"The optimization direction of the model\'s objective function. You must specify one of the following values:\\n\\n- `Maximize`\\n- `Minimize`"}},"AWS::SageMaker::ModelCard.InferenceEnvironment":{"attributes":{},"description":"An overview of a model\'s inference environment.","properties":{"ContainerImage":"The container used to run the inference environment."}},"AWS::SageMaker::ModelCard.InferenceSpecification":{"attributes":{},"description":"","properties":{"Containers":""}},"AWS::SageMaker::ModelCard.IntendedUses":{"attributes":{},"description":"The intended uses of a model.","properties":{"ExplanationsForRiskRating":"An explanation of why your organization categorizes the model with its risk rating.","FactorsAffectingModelEfficiency":"Factors affecting model efficacy.","IntendedUses":"The intended use cases for the model.","PurposeOfModel":"The general purpose of the model.","RiskRating":"Your organization\'s risk rating. You can specify one the following values as the risk rating:\\n\\n- High\\n- Medium\\n- Low\\n- Unknown"}},"AWS::SageMaker::ModelCard.MetricDataItems":{"attributes":{},"description":"Metric data. The `type` determines the data types that you specify for `value` , `XAxisName` and `YAxisName` . For information about specifying values for metrics, see [model card JSON schema](https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards.html#model-cards-json-schema) .","properties":{"Name":"The names of the metrics.","Notes":"Any notes to add to the metric.","Type":"You must specify one of the following data types:\\n\\n- Bar Chart `bar_char`\\n- Boolean `boolean`\\n- Linear Graph `linear_graph`\\n- Matrix `matrix`\\n- Number `number`\\n- String `string`","Value":"The datatype of the metric. The metric\'s *value* must be compatible with the metric\'s *type* .","XAxisName":"The name of the x axis.","YAxisName":"The name of the y axis."}},"AWS::SageMaker::ModelCard.MetricGroup":{"attributes":{},"description":"A group of metric data that you use to initialize a metric group object.","properties":{"MetricData":"A list of metric objects. The `MetricDataItems` list can have one of the following values:\\n\\n- `bar_chart_metric`\\n- `matrix_metric`\\n- `simple_metric`\\n- `linear_graph_metric`\\n\\nFor more information about the metric schema, see the definition section of the [model card JSON schema](https://docs.aws.amazon.com/sagemaker/latest/dg/model-cards.html#model-cards-json-schema) .","Name":"The metric group name."}},"AWS::SageMaker::ModelCard.ModelOverview":{"attributes":{},"description":"An overview about the model.","properties":{"AlgorithmType":"The algorithm used to solve the problem.","InferenceEnvironment":"An overview about model inference.","ModelArtifact":"The location of the model artifact.","ModelCreator":"The creator of the model.","ModelDescription":"A description of the model.","ModelId":"The SageMaker Model ARN or non- SageMaker Model ID.","ModelName":"The name of the model.","ModelOwner":"The owner of the model.","ModelVersion":"The version of the model.","ProblemType":"The problem being solved with the model."}},"AWS::SageMaker::ModelCard.ModelPackageCreator":{"attributes":{},"description":"","properties":{"UserProfileName":""}},"AWS::SageMaker::ModelCard.ModelPackageDetails":{"attributes":{},"description":"","properties":{"ApprovalDescription":"","CreatedBy":"","Domain":"","InferenceSpecification":"","ModelApprovalStatus":"","ModelPackageArn":"","ModelPackageDescription":"","ModelPackageGroupName":"","ModelPackageName":"","ModelPackageStatus":"","ModelPackageVersion":"","SourceAlgorithms":"","Task":""}},"AWS::SageMaker::ModelCard.ObjectiveFunction":{"attributes":{},"description":"The function that is optimized during model training.","properties":{"Function":"A function object that details optimization direction, metric, and additional descriptions.","Notes":"Notes about the object function, including other considerations for possible objective functions."}},"AWS::SageMaker::ModelCard.SecurityConfig":{"attributes":{},"description":"The security configuration used to protect model card data.","properties":{"KmsKeyId":"A AWS Key Management Service [key ID](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id) used to encrypt a model card."}},"AWS::SageMaker::ModelCard.SourceAlgorithm":{"attributes":{},"description":"","properties":{"AlgorithmName":"","ModelDataUrl":""}},"AWS::SageMaker::ModelCard.TrainingDetails":{"attributes":{},"description":"The training details of the model","properties":{"ObjectiveFunction":"The function that is optimized during model training.","TrainingJobDetails":"Details about any associated training jobs.","TrainingObservations":"Any observations about training."}},"AWS::SageMaker::ModelCard.TrainingEnvironment":{"attributes":{},"description":"SageMaker training image.","properties":{"ContainerImage":"SageMaker inference image URI."}},"AWS::SageMaker::ModelCard.TrainingHyperParameter":{"attributes":{},"description":"A hyper parameter that was configured in training the model.","properties":{"Name":"The name of the hyper parameter.","Value":"The value specified for the hyper parameter."}},"AWS::SageMaker::ModelCard.TrainingJobDetails":{"attributes":{},"description":"The overview of a training job.","properties":{"HyperParameters":"The hyper parameters used in the training job.","TrainingArn":"The SageMaker training job Amazon Resource Name (ARN)","TrainingDatasets":"The location of the datasets used to train the model.","TrainingEnvironment":"The SageMaker training job image URI.","TrainingMetrics":"The SageMaker training job results.","UserProvidedHyperParameters":"Additional hyper parameters that you\'ve specified when training the model.","UserProvidedTrainingMetrics":"Custom training job results."}},"AWS::SageMaker::ModelCard.TrainingMetric":{"attributes":{},"description":"A result from a SageMaker training job.","properties":{"Name":"The name of the result from the SageMaker training job.","Notes":"Any additional notes describing the result of the training job.","Value":"The value of a result from the SageMaker training job."}},"AWS::SageMaker::ModelCard.UserContext":{"attributes":{},"description":"Information about the user who created or modified an experiment, trial, trial component, lineage group, project, or model card.","properties":{"DomainId":"The domain associated with the user.","UserProfileArn":"The Amazon Resource Name (ARN) of the user\'s profile.","UserProfileName":"The name of the user\'s profile."}},"AWS::SageMaker::ModelExplainabilityJobDefinition":{"attributes":{"CreationTime":"The time when the job definition was created.","JobDefinitionArn":"The Amazon Resource Name (ARN) of the job definition.","Ref":""},"description":"Creates the definition for a model explainability job.","properties":{"EndpointName":"","JobDefinitionName":"The name of the model explainability job definition. The name must be unique within an AWS Region in the AWS account.","JobResources":"Identifies the resources to deploy for a monitoring job.","ModelExplainabilityAppSpecification":"Configures the model explainability job to run a specified Docker container image.","ModelExplainabilityBaselineConfig":"The baseline configuration for a model explainability job.","ModelExplainabilityJobInput":"Inputs for the model explainability job.","ModelExplainabilityJobOutputConfig":"The output configuration for monitoring jobs.","NetworkConfig":"Networking options for a model explainability job.","RoleArn":"The Amazon Resource Name (ARN) of an IAM role that Amazon SageMaker can assume to perform tasks on your behalf.","StoppingCondition":"A time limit for how long the monitoring job is allowed to run before stopping.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.BatchTransformInput":{"attributes":{},"description":"","properties":{"DataCapturedDestinationS3Uri":"","DatasetFormat":"","FeaturesAttribute":"","InferenceAttribute":"","LocalPath":"","ProbabilityAttribute":"","S3DataDistributionType":"","S3InputMode":""}},"AWS::SageMaker::ModelExplainabilityJobDefinition.ClusterConfig":{"attributes":{},"description":"The configuration for the cluster resources used to run the processing job.","properties":{"InstanceCount":"The number of ML compute instances to use in the model monitoring job. For distributed processing jobs, specify a value greater than 1. The default value is 1.","InstanceType":"The ML compute instance type for the processing job.","VolumeKmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the model monitoring job.","VolumeSizeInGB":"The size of the ML storage volume, in gigabytes, that you want to provision. You must specify sufficient ML storage for your scenario."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.ConstraintsResource":{"attributes":{},"description":"Input object for the endpoint","properties":{"S3Uri":"The Amazon S3 URI for the constraints resource."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.Csv":{"attributes":{},"description":"","properties":{"Header":""}},"AWS::SageMaker::ModelExplainabilityJobDefinition.DatasetFormat":{"attributes":{},"description":"","properties":{"Csv":"","Json":"","Parquet":""}},"AWS::SageMaker::ModelExplainabilityJobDefinition.EndpointInput":{"attributes":{},"description":"Input object for the endpoint","properties":{"EndpointName":"An endpoint in customer\'s account which has enabled `DataCaptureConfig` enabled.","FeaturesAttribute":"The attributes of the input data that are the input features.","InferenceAttribute":"The attribute of the input data that represents the ground truth label.","LocalPath":"Path to the filesystem where the endpoint data is available to the container.","ProbabilityAttribute":"In a classification problem, the attribute that represents the class probability.","S3DataDistributionType":"Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to `FullyReplicated`","S3InputMode":"Whether the `Pipe` or `File` is used as the input mode for transferring data for the monitoring job. `Pipe` mode is recommended for large datasets. `File` mode is useful for small files that fit in memory. Defaults to `File` ."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.Json":{"attributes":{},"description":"","properties":{"Line":""}},"AWS::SageMaker::ModelExplainabilityJobDefinition.ModelExplainabilityAppSpecification":{"attributes":{},"description":"Docker container image configuration object for the model explainability job.","properties":{"ConfigUri":"JSON formatted S3 file that defines explainability parameters. For more information on this JSON configuration file, see [Configure model explainability parameters](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-config-json-monitor-model-explainability-parameters.html) .","Environment":"Sets the environment variables in the Docker container.","ImageUri":"The container image to be run by the model explainability job."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.ModelExplainabilityBaselineConfig":{"attributes":{},"description":"The configuration for a baseline model explainability job.","properties":{"BaseliningJobName":"The name of the baseline model explainability job.","ConstraintsResource":"The constraints resource for a model explainability job."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.ModelExplainabilityJobInput":{"attributes":{},"description":"Inputs for the model explainability job.","properties":{"BatchTransformInput":"","EndpointInput":""}},"AWS::SageMaker::ModelExplainabilityJobDefinition.MonitoringOutput":{"attributes":{},"description":"The output object for a monitoring job.","properties":{"S3Output":"The Amazon S3 storage location where the results of a monitoring job are saved."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.MonitoringOutputConfig":{"attributes":{},"description":"The output configuration for monitoring jobs.","properties":{"KmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption.","MonitoringOutputs":"Monitoring outputs for monitoring jobs. This is where the output of the periodic monitoring jobs is uploaded."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.MonitoringResources":{"attributes":{},"description":"Identifies the resources to deploy for a monitoring job.","properties":{"ClusterConfig":"The configuration for the cluster resources used to run the processing job."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.NetworkConfig":{"attributes":{},"description":"Networking options for a job, such as network traffic encryption between containers, whether to allow inbound and outbound network calls to and from containers, and the VPC subnets and security groups to use for VPC-enabled jobs.","properties":{"EnableInterContainerTrafficEncryption":"Whether to encrypt all communications between distributed processing jobs. Choose `True` to encrypt communications. Encryption provides greater security for distributed processing jobs, but the processing might take longer.","EnableNetworkIsolation":"Whether to allow inbound and outbound network calls to and from the containers used for the processing job.","VpcConfig":"Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.S3Output":{"attributes":{},"description":"The Amazon S3 storage location where the results of a monitoring job are saved.","properties":{"LocalPath":"The local path to the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job. LocalPath is an absolute path for the output data.","S3UploadMode":"Whether to upload the results of the monitoring job continuously or after the job completes.","S3Uri":"A URI that identifies the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.StoppingCondition":{"attributes":{},"description":"Specifies a limit to how long a model training job or model compilation job can run. It also specifies how long a managed spot training job has to complete. When the job reaches the time limit, SageMaker ends the training or compilation job. Use this API to cap model training costs.\\n\\nTo stop a training job, SageMaker sends the algorithm the `SIGTERM` signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts, so the results of training are not lost.\\n\\nThe training algorithms provided by SageMaker automatically save the intermediate results of a model training job when possible. This attempt to save artifacts is only a best effort case as model might not be in a state from which it can be saved. For example, if training has just started, the model might not be ready to save. When saved, this intermediate data is a valid model artifact. You can use it to create a model with `CreateModel` .\\n\\n> The Neural Topic Model (NTM) currently does not support saving intermediate model artifacts. When training NTMs, make sure that the maximum runtime is sufficient for the training job to complete.","properties":{"MaxRuntimeInSeconds":"The maximum length of time, in seconds, that a training or compilation job can run before it is stopped.\\n\\nFor compilation jobs, if the job does not complete during this time, a `TimeOut` error is generated. We recommend starting with 900 seconds and increasing as necessary based on your model.\\n\\nFor all other jobs, if the job does not complete during this time, SageMaker ends the job. When `RetryStrategy` is specified in the job request, `MaxRuntimeInSeconds` specifies the maximum time for all of the attempts in total, not each individual attempt. The default value is 1 day. The maximum value is 28 days.\\n\\nThe maximum time that a `TrainingJob` can run in total, including any time spent publishing metrics or archiving and uploading models after it has been stopped, is 30 days."}},"AWS::SageMaker::ModelExplainabilityJobDefinition.VpcConfig":{"attributes":{},"description":"Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see [Protect Endpoints by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html) and [Protect Training Jobs by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html) .","properties":{"SecurityGroupIds":"The VPC security group IDs, in the form sg-xxxxxxxx. Specify the security groups for the VPC that is specified in the `Subnets` field.","Subnets":"The ID of the subnets in the VPC to which you want to connect your training job or model. For information about the availability of specific instance types, see [Supported Instance Types and Availability Zones](https://docs.aws.amazon.com/sagemaker/latest/dg/instance-types-az.html) ."}},"AWS::SageMaker::ModelPackage":{"attributes":{"CreationTime":"The time that the model package was created.","ModelPackageArn":"The Amazon Resource Name (ARN) of the model package.","ModelPackageStatus":"The status of the model package. This can be one of the following values.\\n\\n- `PENDING` - The model package creation is pending.\\n- `IN_PROGRESS` - The model package is in the process of being created.\\n- `COMPLETED` - The model package was successfully created.\\n- `FAILED` - The model package creation failed.\\n- `DELETING` - The model package is in the process of being deleted.","Ref":""},"description":"A versioned model that can be deployed for SageMaker inference.","properties":{"AdditionalInferenceSpecifications":"An array of additional Inference Specification objects.","AdditionalInferenceSpecificationsToAdd":"An array of additional Inference Specification objects to be added to the existing array. The total number of additional Inference Specification objects cannot exceed 15. Each additional Inference Specification object specifies artifacts based on this model package that can be used on inference endpoints. Generally used with SageMaker Neo to store the compiled artifacts.","ApprovalDescription":"A description provided when the model approval is set.","CertifyForMarketplace":"Whether the model package is to be certified to be listed on AWS Marketplace. For information about listing model packages on AWS Marketplace, see [List Your Algorithm or Model Package on AWS Marketplace](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-mkt-list.html) .","ClientToken":"A unique token that guarantees that the call to this API is idempotent.","CustomerMetadataProperties":"The metadata properties for the model package.","Domain":"The machine learning domain of your model package and its components. Common machine learning domains include computer vision and natural language processing.","DriftCheckBaselines":"Represents the drift check baselines that can be used when the model monitor is set using the model package.","InferenceSpecification":"Defines how to perform inference generation after a training job is run.","LastModifiedTime":"The last time the model package was modified.","MetadataProperties":"Metadata properties of the tracking entity, trial, or trial component.","ModelApprovalStatus":"The approval status of the model. This can be one of the following values.\\n\\n- `APPROVED` - The model is approved\\n- `REJECTED` - The model is rejected.\\n- `PENDING_MANUAL_APPROVAL` - The model is waiting for manual approval.","ModelMetrics":"Metrics for the model.","ModelPackageDescription":"The description of the model package.","ModelPackageGroupName":"The model group to which the model belongs.","ModelPackageName":"The name of the model.","ModelPackageStatusDetails":"Specifies the validation and image scan statuses of the model package.","ModelPackageVersion":"The version number of a versioned model.","SamplePayloadUrl":"The Amazon Simple Storage Service path where the sample payload are stored. This path must point to a single gzip compressed tar archive (.tar.gz suffix).","SourceAlgorithmSpecification":"A list of algorithms that were used to create a model package.","Tags":"A list of the tags associated with the model package. For more information, see [Tagging AWS resources](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) in the *AWS General Reference Guide* .","Task":"The machine learning task your model package accomplishes. Common machine learning tasks include object detection and image classification.","ValidationSpecification":"Specifies batch transform jobs that SageMaker runs to validate your model package."}},"AWS::SageMaker::ModelPackage.AdditionalInferenceSpecificationDefinition":{"attributes":{},"description":"A structure of additional Inference Specification. Additional Inference Specification specifies details about inference jobs that can be run with models based on this model package","properties":{"Containers":"The Amazon ECR registry path of the Docker image that contains the inference code.","Description":"A description of the additional Inference specification","Name":"A unique name to identify the additional inference specification. The name must be unique within the list of your additional inference specifications for a particular model package.","SupportedContentTypes":"The supported MIME types for the input data.","SupportedRealtimeInferenceInstanceTypes":"A list of the instance types that are used to generate inferences in real-time.","SupportedResponseMIMETypes":"The supported MIME types for the output data.","SupportedTransformInstanceTypes":"A list of the instance types on which a transformation job can be run or on which an endpoint can be deployed."}},"AWS::SageMaker::ModelPackage.Bias":{"attributes":{},"description":"Contains bias metrics for a model.","properties":{"PostTrainingReport":"The post-training bias report for a model.","PreTrainingReport":"The pre-training bias report for a model.","Report":"The bias report for a model"}},"AWS::SageMaker::ModelPackage.DataSource":{"attributes":{},"description":"Describes the location of the channel data.","properties":{"S3DataSource":"The S3 location of the data source that is associated with a channel."}},"AWS::SageMaker::ModelPackage.DriftCheckBaselines":{"attributes":{},"description":"Represents the drift check baselines that can be used when the model monitor is set using the model package.","properties":{"Bias":"Represents the drift check bias baselines that can be used when the model monitor is set using the model package.","Explainability":"Represents the drift check explainability baselines that can be used when the model monitor is set using the model package.","ModelDataQuality":"Represents the drift check model data quality baselines that can be used when the model monitor is set using the model package.","ModelQuality":"Represents the drift check model quality baselines that can be used when the model monitor is set using the model package."}},"AWS::SageMaker::ModelPackage.DriftCheckBias":{"attributes":{},"description":"Represents the drift check bias baselines that can be used when the model monitor is set using the model package.","properties":{"ConfigFile":"The bias config file for a model.","PostTrainingConstraints":"The post-training constraints.","PreTrainingConstraints":"The pre-training constraints."}},"AWS::SageMaker::ModelPackage.DriftCheckExplainability":{"attributes":{},"description":"Represents the drift check explainability baselines that can be used when the model monitor is set using the model package.","properties":{"ConfigFile":"The explainability config file for the model.","Constraints":"The drift check explainability constraints."}},"AWS::SageMaker::ModelPackage.DriftCheckModelDataQuality":{"attributes":{},"description":"Represents the drift check data quality baselines that can be used when the model monitor is set using the model package.","properties":{"Constraints":"The drift check model data quality constraints.","Statistics":"The drift check model data quality statistics."}},"AWS::SageMaker::ModelPackage.DriftCheckModelQuality":{"attributes":{},"description":"Represents the drift check model quality baselines that can be used when the model monitor is set using the model package.","properties":{"Constraints":"The drift check model quality constraints.","Statistics":"The drift check model quality statistics."}},"AWS::SageMaker::ModelPackage.Explainability":{"attributes":{},"description":"Contains explainability metrics for a model.","properties":{"Report":"The explainability report for a model."}},"AWS::SageMaker::ModelPackage.FileSource":{"attributes":{},"description":"Contains details regarding the file source.","properties":{"ContentDigest":"The digest of the file source.","ContentType":"The type of content stored in the file source.","S3Uri":"The Amazon S3 URI for the file source."}},"AWS::SageMaker::ModelPackage.InferenceSpecification":{"attributes":{},"description":"Defines how to perform inference generation after a training job is run.","properties":{"Containers":"The Amazon ECR registry path of the Docker image that contains the inference code.","SupportedContentTypes":"The supported MIME types for the input data.","SupportedRealtimeInferenceInstanceTypes":"A list of the instance types that are used to generate inferences in real-time.\\n\\nThis parameter is required for unversioned models, and optional for versioned models.","SupportedResponseMIMETypes":"The supported MIME types for the output data.","SupportedTransformInstanceTypes":"A list of the instance types on which a transformation job can be run or on which an endpoint can be deployed.\\n\\nThis parameter is required for unversioned models, and optional for versioned models."}},"AWS::SageMaker::ModelPackage.MetadataProperties":{"attributes":{},"description":"Metadata properties of the tracking entity, trial, or trial component.","properties":{"CommitId":"The commit ID.","GeneratedBy":"The entity this entity was generated by.","ProjectId":"The project ID.","Repository":"The repository."}},"AWS::SageMaker::ModelPackage.MetricsSource":{"attributes":{},"description":"Details about the metrics source.","properties":{"ContentDigest":"The hash key used for the metrics source.","ContentType":"The metric source content type.","S3Uri":"The S3 URI for the metrics source."}},"AWS::SageMaker::ModelPackage.ModelDataQuality":{"attributes":{},"description":"Data quality constraints and statistics for a model.","properties":{"Constraints":"Data quality constraints for a model.","Statistics":"Data quality statistics for a model."}},"AWS::SageMaker::ModelPackage.ModelInput":{"attributes":{},"description":"Input object for the model.","properties":{"DataInputConfig":"The input configuration object for the model."}},"AWS::SageMaker::ModelPackage.ModelMetrics":{"attributes":{},"description":"Contains metrics captured from a model.","properties":{"Bias":"Metrics that measure bais in a model.","Explainability":"Metrics that help explain a model.","ModelDataQuality":"Metrics that measure the quality of the input data for a model.","ModelQuality":"Metrics that measure the quality of a model."}},"AWS::SageMaker::ModelPackage.ModelPackageContainerDefinition":{"attributes":{},"description":"Describes the Docker container for the model package.","properties":{"ContainerHostname":"The DNS host name for the Docker container.","Environment":"The environment variables to set in the Docker container. Each key and value in the `Environment` string to string map can have length of up to 1024. We support up to 16 entries in the map.","Framework":"The machine learning framework of the model package container image.","FrameworkVersion":"The framework version of the Model Package Container Image.","Image":"The Amazon EC2 Container Registry (Amazon ECR) path where inference code is stored.\\n\\nIf you are using your own custom algorithm instead of an algorithm provided by SageMaker, the inference code must meet SageMaker requirements. SageMaker supports both `registry/repository[:tag]` and `registry/repository[@digest]` image path formats. For more information, see [Using Your Own Algorithms with Amazon SageMaker](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html) .","ImageDigest":"An MD5 hash of the training algorithm that identifies the Docker image used for training.","ModelDataUrl":"The Amazon S3 path where the model artifacts, which result from model training, are stored. This path must point to a single `gzip` compressed tar archive ( `.tar.gz` suffix).\\n\\n> The model artifacts must be in an S3 bucket that is in the same region as the model package.","ModelInput":"A structure with Model Input details.","NearestModelName":"The name of a pre-trained machine learning benchmarked by Amazon SageMaker Inference Recommender model that matches your model. You can find a list of benchmarked models by calling `ListModelMetadata` ."}},"AWS::SageMaker::ModelPackage.ModelPackageStatusDetails":{"attributes":{},"description":"Specifies the validation and image scan statuses of the model package.","properties":{"ValidationStatuses":"The validation status of the model package."}},"AWS::SageMaker::ModelPackage.ModelPackageStatusItem":{"attributes":{},"description":"Represents the overall status of a model package.","properties":{"FailureReason":"if the overall status is `Failed` , the reason for the failure.","Name":"The name of the model package for which the overall status is being reported.","Status":"The current status."}},"AWS::SageMaker::ModelPackage.ModelQuality":{"attributes":{},"description":"Model quality statistics and constraints.","properties":{"Constraints":"Model quality constraints.","Statistics":"Model quality statistics."}},"AWS::SageMaker::ModelPackage.S3DataSource":{"attributes":{},"description":"Describes the S3 data source.\\n\\nYour input bucket must be in the same AWS region as your training job.","properties":{"S3DataType":"If you choose `S3Prefix` , `S3Uri` identifies a key name prefix. SageMaker uses all objects that match the specified key name prefix for model training.\\n\\nIf you choose `ManifestFile` , `S3Uri` identifies an object that is a manifest file containing a list of object keys that you want SageMaker to use for model training.\\n\\nIf you choose `AugmentedManifestFile` , S3Uri identifies an object that is an augmented manifest file in JSON lines format. This file contains the data you want to use for model training. `AugmentedManifestFile` can only be used if the Channel\'s input mode is `Pipe` .","S3Uri":"Depending on the value specified for the `S3DataType` , identifies either a key name prefix or a manifest. For example:\\n\\n- A key name prefix might look like this: `s3://bucketname/exampleprefix`\\n- A manifest might look like this: `s3://bucketname/example.manifest`\\n\\nA manifest is an S3 object which is a JSON file consisting of an array of elements. The first element is a prefix which is followed by one or more suffixes. SageMaker appends the suffix elements to the prefix to get a full set of `S3Uri` . Note that the prefix must be a valid non-empty `S3Uri` that precludes users from specifying a manifest whose individual `S3Uri` is sourced from different S3 buckets.\\n\\nThe following code example shows a valid manifest format:\\n\\n`[ {\\"prefix\\": \\"s3://customer_bucket/some/prefix/\\"},`\\n\\n`\\"relative/path/to/custdata-1\\",`\\n\\n`\\"relative/path/custdata-2\\",`\\n\\n`...`\\n\\n`\\"relative/path/custdata-N\\"`\\n\\n`]`\\n\\nThis JSON is equivalent to the following `S3Uri` list:\\n\\n`s3://customer_bucket/some/prefix/relative/path/to/custdata-1`\\n\\n`s3://customer_bucket/some/prefix/relative/path/custdata-2`\\n\\n`...`\\n\\n`s3://customer_bucket/some/prefix/relative/path/custdata-N`\\n\\nThe complete set of `S3Uri` in this manifest is the input data for the channel for this data source. The object that each `S3Uri` points to must be readable by the IAM role that SageMaker uses to perform tasks on your behalf.\\n\\nYour input bucket must be located in same AWS region as your training job."}},"AWS::SageMaker::ModelPackage.SourceAlgorithm":{"attributes":{},"description":"Specifies an algorithm that was used to create the model package. The algorithm must be either an algorithm resource in your SageMaker account or an algorithm in AWS Marketplace that you are subscribed to.","properties":{"AlgorithmName":"The name of an algorithm that was used to create the model package. The algorithm must be either an algorithm resource in your SageMaker account or an algorithm in AWS Marketplace that you are subscribed to.","ModelDataUrl":"The Amazon S3 path where the model artifacts, which result from model training, are stored. This path must point to a single `gzip` compressed tar archive ( `.tar.gz` suffix).\\n\\n> The model artifacts must be in an S3 bucket that is in the same AWS region as the algorithm."}},"AWS::SageMaker::ModelPackage.SourceAlgorithmSpecification":{"attributes":{},"description":"A list of algorithms that were used to create a model package.","properties":{"SourceAlgorithms":"A list of the algorithms that were used to create a model package."}},"AWS::SageMaker::ModelPackage.TransformInput":{"attributes":{},"description":"Describes the input source of a transform job and the way the transform job consumes it.","properties":{"CompressionType":"If your transform data is compressed, specify the compression type. Amazon SageMaker automatically decompresses the data for the transform job accordingly. The default value is `None` .","ContentType":"The multipurpose internet mail extension (MIME) type of the data. Amazon SageMaker uses the MIME type with each http call to transfer data to the transform job.","DataSource":"Describes the location of the channel data, which is, the S3 location of the input data that the model can consume.","SplitType":"The method to use to split the transform job\'s data files into smaller batches. Splitting is necessary when the total size of each object is too large to fit in a single request. You can also use data splitting to improve performance by processing multiple concurrent mini-batches. The default value for `SplitType` is `None` , which indicates that input data files are not split, and request payloads contain the entire contents of an input object. Set the value of this parameter to `Line` to split records on a newline character boundary. `SplitType` also supports a number of record-oriented binary data formats. Currently, the supported record formats are:\\n\\n- RecordIO\\n- TFRecord\\n\\nWhen splitting is enabled, the size of a mini-batch depends on the values of the `BatchStrategy` and `MaxPayloadInMB` parameters. When the value of `BatchStrategy` is `MultiRecord` , Amazon SageMaker sends the maximum number of records in each request, up to the `MaxPayloadInMB` limit. If the value of `BatchStrategy` is `SingleRecord` , Amazon SageMaker sends individual records in each request.\\n\\n> Some data formats represent a record as a binary payload wrapped with extra padding bytes. When splitting is applied to a binary data format, padding is removed if the value of `BatchStrategy` is set to `SingleRecord` . Padding is not removed if the value of `BatchStrategy` is set to `MultiRecord` .\\n> \\n> For more information about `RecordIO` , see [Create a Dataset Using RecordIO](https://docs.aws.amazon.com/https://mxnet.apache.org/api/faq/recordio) in the MXNet documentation. For more information about `TFRecord` , see [Consuming TFRecord data](https://docs.aws.amazon.com/https://www.tensorflow.org/guide/data#consuming_tfrecord_data) in the TensorFlow documentation."}},"AWS::SageMaker::ModelPackage.TransformJobDefinition":{"attributes":{},"description":"Defines the input needed to run a transform job using the inference specification specified in the algorithm.","properties":{"BatchStrategy":"A string that determines the number of records included in a single mini-batch.\\n\\n`SingleRecord` means only one record is used per mini-batch. `MultiRecord` means a mini-batch is set to contain as many records that can fit within the `MaxPayloadInMB` limit.","Environment":"The environment variables to set in the Docker container. We support up to 16 key and values entries in the map.","MaxConcurrentTransforms":"The maximum number of parallel requests that can be sent to each instance in a transform job. The default value is 1.","MaxPayloadInMB":"The maximum payload size allowed, in MB. A payload is the data portion of a record (without metadata).","TransformInput":"A description of the input source and the way the transform job consumes it.","TransformOutput":"Identifies the Amazon S3 location where you want Amazon SageMaker to save the results from the transform job.","TransformResources":"Identifies the ML compute instances for the transform job."}},"AWS::SageMaker::ModelPackage.TransformOutput":{"attributes":{},"description":"Describes the results of a transform job.","properties":{"Accept":"The MIME type used to specify the output data. Amazon SageMaker uses the MIME type with each http call to transfer data from the transform job.","AssembleWith":"Defines how to assemble the results of the transform job as a single S3 object. Choose a format that is most convenient to you. To concatenate the results in binary format, specify `None` . To add a newline character at the end of every transformed record, specify `Line` .","KmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption. The `KmsKeyId` can be any of the following formats:\\n\\n- Key ID: `1234abcd-12ab-34cd-56ef-1234567890ab`\\n- Key ARN: `arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab`\\n- Alias name: `alias/ExampleAlias`\\n- Alias name ARN: `arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias`\\n\\nIf you don\'t provide a KMS key ID, Amazon SageMaker uses the default KMS key for Amazon S3 for your role\'s account. For more information, see [KMS-Managed Encryption Keys](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html) in the *Amazon Simple Storage Service Developer Guide.*\\n\\nThe KMS key policy must grant permission to the IAM role that you specify in your [CreateModel](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html) request. For more information, see [Using Key Policies in AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) in the *AWS Key Management Service Developer Guide* .","S3OutputPath":"The Amazon S3 path where you want Amazon SageMaker to store the results of the transform job. For example, `s3://bucket-name/key-name-prefix` .\\n\\nFor every S3 object used as input for the transform job, batch transform stores the transformed data with an . `out` suffix in a corresponding subfolder in the location in the output prefix. For example, for the input data stored at `s3://bucket-name/input-name-prefix/dataset01/data.csv` , batch transform stores the transformed data at `s3://bucket-name/output-name-prefix/input-name-prefix/data.csv.out` . Batch transform doesn\'t upload partially processed objects. For an input S3 object that contains multiple records, it creates an . `out` file only if the transform job succeeds on the entire file. When the input contains multiple S3 objects, the batch transform job processes the listed S3 objects and uploads only the output for successfully processed objects. If any object fails in the transform job batch transform marks the job as failed to prompt investigation."}},"AWS::SageMaker::ModelPackage.TransformResources":{"attributes":{},"description":"Describes the resources, including ML instance types and ML instance count, to use for transform job.","properties":{"InstanceCount":"The number of ML compute instances to use in the transform job. The default value is `1` , and the maximum is `100` . For distributed transform jobs, specify a value greater than `1` .","InstanceType":"The ML compute instance type for the transform job. If you are using built-in algorithms to transform moderately sized datasets, we recommend using ml.m4.xlarge or `ml.m5.large` instance types.","VolumeKmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt model data on the storage volume attached to the ML compute instance(s) that run the batch transform job.\\n\\n> Certain Nitro-based instances include local storage, dependent on the instance type. Local storage volumes are encrypted using a hardware module on the instance. You can\'t request a `VolumeKmsKeyId` when using an instance type with local storage.\\n> \\n> For a list of instance types that support local instance storage, see [Instance Store Volumes](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-volumes) .\\n> \\n> For more information about local instance storage encryption, see [SSD Instance Store Volumes](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html) . \\n\\nThe `VolumeKmsKeyId` can be any of the following formats:\\n\\n- Key ID: `1234abcd-12ab-34cd-56ef-1234567890ab`\\n- Key ARN: `arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab`\\n- Alias name: `alias/ExampleAlias`\\n- Alias name ARN: `arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias`"}},"AWS::SageMaker::ModelPackage.ValidationProfile":{"attributes":{},"description":"Contains data, such as the inputs and targeted instance types that are used in the process of validating the model package.\\n\\nThe data provided in the validation profile is made available to your buyers on AWS Marketplace.","properties":{"ProfileName":"The name of the profile for the model package.","TransformJobDefinition":"The `TransformJobDefinition` object that describes the transform job used for the validation of the model package."}},"AWS::SageMaker::ModelPackage.ValidationSpecification":{"attributes":{},"description":"Specifies batch transform jobs that SageMaker runs to validate your model package.","properties":{"ValidationProfiles":"An array of `ModelPackageValidationProfile` objects, each of which specifies a batch transform job that SageMaker runs to validate your model package.","ValidationRole":"The IAM roles to be used for the validation of the model package."}},"AWS::SageMaker::ModelPackageGroup":{"attributes":{"CreationTime":"The time when the model group was created.","ModelPackageGroupArn":"The Amazon Resource Name (ARN) of the model group.","ModelPackageGroupStatus":"The status of the model group.","Ref":""},"description":"A group of versioned models in the model registry.","properties":{"ModelPackageGroupDescription":"The description for the model group.","ModelPackageGroupName":"The name of the model group.","ModelPackageGroupPolicy":"A resouce policy to control access to a model group. For information about resoure policies, see [Identity-based policies and resource-based policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html) in the *AWS Identity and Access Management User Guide.* .","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::SageMaker::ModelQualityJobDefinition":{"attributes":{"CreationTime":"The time when the job definition was created.","JobDefinitionArn":"The Amazon Resource Name (ARN) of the job definition.","Ref":""},"description":"Creates a definition for a job that monitors model quality and drift. For information about model monitor, see [Amazon SageMaker Model Monitor](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor.html) .","properties":{"EndpointName":"","JobDefinitionName":"The name of the monitoring job definition.","JobResources":"Identifies the resources to deploy for a monitoring job.","ModelQualityAppSpecification":"Container image configuration object for the monitoring job.","ModelQualityBaselineConfig":"Specifies the constraints and baselines for the monitoring job.","ModelQualityJobInput":"A list of the inputs that are monitored. Currently endpoints are supported.","ModelQualityJobOutputConfig":"The output configuration for monitoring jobs.","NetworkConfig":"Specifies the network configuration for the monitoring job.","RoleArn":"The Amazon Resource Name (ARN) of an IAM role that Amazon SageMaker can assume to perform tasks on your behalf.","StoppingCondition":"A time limit for how long the monitoring job is allowed to run before stopping.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::SageMaker::ModelQualityJobDefinition.BatchTransformInput":{"attributes":{},"description":"","properties":{"DataCapturedDestinationS3Uri":"","DatasetFormat":"","EndTimeOffset":"","InferenceAttribute":"","LocalPath":"","ProbabilityAttribute":"","ProbabilityThresholdAttribute":"","S3DataDistributionType":"","S3InputMode":"","StartTimeOffset":""}},"AWS::SageMaker::ModelQualityJobDefinition.ClusterConfig":{"attributes":{},"description":"The configuration for the cluster of resources used to run the processing job.","properties":{"InstanceCount":"The number of ML compute instances to use in the model monitoring job. For distributed processing jobs, specify a value greater than 1. The default value is 1.","InstanceType":"The ML compute instance type for the processing job.","VolumeKmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the model monitoring job.","VolumeSizeInGB":"The size of the ML storage volume, in gigabytes, that you want to provision. You must specify sufficient ML storage for your scenario."}},"AWS::SageMaker::ModelQualityJobDefinition.ConstraintsResource":{"attributes":{},"description":"The constraints resource for a monitoring job.","properties":{"S3Uri":"The Amazon S3 URI for the constraints resource."}},"AWS::SageMaker::ModelQualityJobDefinition.Csv":{"attributes":{},"description":"","properties":{"Header":""}},"AWS::SageMaker::ModelQualityJobDefinition.DatasetFormat":{"attributes":{},"description":"","properties":{"Csv":"","Json":"","Parquet":""}},"AWS::SageMaker::ModelQualityJobDefinition.EndpointInput":{"attributes":{},"description":"Input object for the endpoint","properties":{"EndTimeOffset":"If specified, monitoring jobs substract this time from the end time. For information about using offsets for scheduling monitoring jobs, see [Schedule Model Quality Monitoring Jobs](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html) .","EndpointName":"An endpoint in customer\'s account which has enabled `DataCaptureConfig` enabled.","InferenceAttribute":"The attribute of the input data that represents the ground truth label.","LocalPath":"Path to the filesystem where the endpoint data is available to the container.","ProbabilityAttribute":"In a classification problem, the attribute that represents the class probability.","ProbabilityThresholdAttribute":"The threshold for the class probability to be evaluated as a positive result.","S3DataDistributionType":"Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to `FullyReplicated`","S3InputMode":"Whether the `Pipe` or `File` is used as the input mode for transferring data for the monitoring job. `Pipe` mode is recommended for large datasets. `File` mode is useful for small files that fit in memory. Defaults to `File` .","StartTimeOffset":"If specified, monitoring jobs substract this time from the start time. For information about using offsets for scheduling monitoring jobs, see [Schedule Model Quality Monitoring Jobs](https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor-model-quality-schedule.html) ."}},"AWS::SageMaker::ModelQualityJobDefinition.Json":{"attributes":{},"description":"","properties":{"Line":""}},"AWS::SageMaker::ModelQualityJobDefinition.ModelQualityAppSpecification":{"attributes":{},"description":"Container image configuration object for the monitoring job.","properties":{"ContainerArguments":"An array of arguments for the container used to run the monitoring job.","ContainerEntrypoint":"Specifies the entrypoint for a container that the monitoring job runs.","Environment":"Sets the environment variables in the container that the monitoring job runs.","ImageUri":"The address of the container image that the monitoring job runs.","PostAnalyticsProcessorSourceUri":"An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.","ProblemType":"The machine learning problem type of the model that the monitoring job monitors.","RecordPreprocessorSourceUri":"An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers."}},"AWS::SageMaker::ModelQualityJobDefinition.ModelQualityBaselineConfig":{"attributes":{},"description":"Configuration for monitoring constraints and monitoring statistics. These baseline resources are compared against the results of the current job from the series of jobs scheduled to collect data periodically.","properties":{"BaseliningJobName":"The name of the job that performs baselining for the monitoring job.","ConstraintsResource":"The constraints resource for a monitoring job."}},"AWS::SageMaker::ModelQualityJobDefinition.ModelQualityJobInput":{"attributes":{},"description":"The input for the model quality monitoring job. Currently endponts are supported for input for model quality monitoring jobs.","properties":{"BatchTransformInput":"","EndpointInput":"Input object for the endpoint","GroundTruthS3Input":"The ground truth label provided for the model."}},"AWS::SageMaker::ModelQualityJobDefinition.MonitoringGroundTruthS3Input":{"attributes":{},"description":"The ground truth labels for the dataset used for the monitoring job.","properties":{"S3Uri":"The address of the Amazon S3 location of the ground truth labels."}},"AWS::SageMaker::ModelQualityJobDefinition.MonitoringOutput":{"attributes":{},"description":"The output object for a monitoring job.","properties":{"S3Output":"The Amazon S3 storage location where the results of a monitoring job are saved."}},"AWS::SageMaker::ModelQualityJobDefinition.MonitoringOutputConfig":{"attributes":{},"description":"The output configuration for monitoring jobs.","properties":{"KmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption.","MonitoringOutputs":"Monitoring outputs for monitoring jobs. This is where the output of the periodic monitoring jobs is uploaded."}},"AWS::SageMaker::ModelQualityJobDefinition.MonitoringResources":{"attributes":{},"description":"Identifies the resources to deploy for a monitoring job.","properties":{"ClusterConfig":"The configuration for the cluster resources used to run the processing job."}},"AWS::SageMaker::ModelQualityJobDefinition.NetworkConfig":{"attributes":{},"description":"Networking options for a job, such as network traffic encryption between containers, whether to allow inbound and outbound network calls to and from containers, and the VPC subnets and security groups to use for VPC-enabled jobs.","properties":{"EnableInterContainerTrafficEncryption":"Whether to encrypt all communications between distributed processing jobs. Choose `True` to encrypt communications. Encryption provides greater security for distributed processing jobs, but the processing might take longer.","EnableNetworkIsolation":"Whether to allow inbound and outbound network calls to and from the containers used for the processing job.","VpcConfig":"Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC."}},"AWS::SageMaker::ModelQualityJobDefinition.S3Output":{"attributes":{},"description":"The Amazon S3 storage location where the results of a monitoring job are saved.","properties":{"LocalPath":"The local path to the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job. LocalPath is an absolute path for the output data.","S3UploadMode":"Whether to upload the results of the monitoring job continuously or after the job completes.","S3Uri":"A URI that identifies the Amazon S3 storage location where Amazon SageMaker saves the results of a monitoring job."}},"AWS::SageMaker::ModelQualityJobDefinition.StoppingCondition":{"attributes":{},"description":"Specifies a limit to how long a model training job or model compilation job can run. It also specifies how long a managed spot training job has to complete. When the job reaches the time limit, SageMaker ends the training or compilation job. Use this API to cap model training costs.\\n\\nTo stop a training job, SageMaker sends the algorithm the `SIGTERM` signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts, so the results of training are not lost.\\n\\nThe training algorithms provided by SageMaker automatically save the intermediate results of a model training job when possible. This attempt to save artifacts is only a best effort case as model might not be in a state from which it can be saved. For example, if training has just started, the model might not be ready to save. When saved, this intermediate data is a valid model artifact. You can use it to create a model with `CreateModel` .\\n\\n> The Neural Topic Model (NTM) currently does not support saving intermediate model artifacts. When training NTMs, make sure that the maximum runtime is sufficient for the training job to complete.","properties":{"MaxRuntimeInSeconds":"The maximum length of time, in seconds, that a training or compilation job can run before it is stopped.\\n\\nFor compilation jobs, if the job does not complete during this time, a `TimeOut` error is generated. We recommend starting with 900 seconds and increasing as necessary based on your model.\\n\\nFor all other jobs, if the job does not complete during this time, SageMaker ends the job. When `RetryStrategy` is specified in the job request, `MaxRuntimeInSeconds` specifies the maximum time for all of the attempts in total, not each individual attempt. The default value is 1 day. The maximum value is 28 days.\\n\\nThe maximum time that a `TrainingJob` can run in total, including any time spent publishing metrics or archiving and uploading models after it has been stopped, is 30 days."}},"AWS::SageMaker::ModelQualityJobDefinition.VpcConfig":{"attributes":{},"description":"Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see [Protect Endpoints by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html) and [Protect Training Jobs by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html) .","properties":{"SecurityGroupIds":"The VPC security group IDs, in the form sg-xxxxxxxx. Specify the security groups for the VPC that is specified in the `Subnets` field.","Subnets":"The ID of the subnets in the VPC to which you want to connect your training job or model. For information about the availability of specific instance types, see [Supported Instance Types and Availability Zones](https://docs.aws.amazon.com/sagemaker/latest/dg/instance-types-az.html) ."}},"AWS::SageMaker::MonitoringSchedule":{"attributes":{"CreationTime":"The time when the monitoring schedule was created.","LastModifiedTime":"The last time that the monitoring schedule was modified.","MonitoringScheduleArn":"The Amazon Resource Name (ARN) of the monitoring schedule.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the monitoring schedule."},"description":"The `AWS::SageMaker::MonitoringSchedule` resource is an Amazon SageMaker resource type that regularly starts SageMaker processing Jobs to monitor the data captured for a SageMaker endpoint.","properties":{"EndpointName":"The name of the endpoint using the monitoring schedule.","FailureReason":"Contains the reason a monitoring job failed, if it failed.","LastMonitoringExecutionSummary":"Describes metadata on the last execution to run, if there was one.","MonitoringScheduleConfig":"The configuration object that specifies the monitoring schedule and defines the monitoring job.","MonitoringScheduleName":"The name of the monitoring schedule.","MonitoringScheduleStatus":"The status of the monitoring schedule.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::SageMaker::MonitoringSchedule.BaselineConfig":{"attributes":{},"description":"Baseline configuration used to validate that the data conforms to the specified constraints and statistics.","properties":{"ConstraintsResource":"The Amazon S3 URI for the constraints resource.","StatisticsResource":"The baseline statistics file in Amazon S3 that the current monitoring job should be validated against."}},"AWS::SageMaker::MonitoringSchedule.BatchTransformInput":{"attributes":{},"description":"","properties":{"DataCapturedDestinationS3Uri":"","DatasetFormat":"","LocalPath":"","S3DataDistributionType":"","S3InputMode":""}},"AWS::SageMaker::MonitoringSchedule.ClusterConfig":{"attributes":{},"description":"Configuration for the cluster used to run model monitoring jobs.","properties":{"InstanceCount":"The number of ML compute instances to use in the model monitoring job. For distributed processing jobs, specify a value greater than 1. The default value is 1.","InstanceType":"The ML compute instance type for the processing job.","VolumeKmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt data on the storage volume attached to the ML compute instance(s) that run the model monitoring job.","VolumeSizeInGB":"The size of the ML storage volume, in gigabytes, that you want to provision. You must specify sufficient ML storage for your scenario."}},"AWS::SageMaker::MonitoringSchedule.ConstraintsResource":{"attributes":{},"description":"The Amazon S3 URI for the constraints resource.","properties":{"S3Uri":"The Amazon S3 URI for the constraints resource."}},"AWS::SageMaker::MonitoringSchedule.Csv":{"attributes":{},"description":"","properties":{"Header":""}},"AWS::SageMaker::MonitoringSchedule.DatasetFormat":{"attributes":{},"description":"","properties":{"Csv":"","Json":"","Parquet":""}},"AWS::SageMaker::MonitoringSchedule.EndpointInput":{"attributes":{},"description":"Input object for the endpoint","properties":{"EndpointName":"An endpoint in customer\'s account which has enabled `DataCaptureConfig` enabled.","LocalPath":"Path to the filesystem where the endpoint data is available to the container.","S3DataDistributionType":"Whether input data distributed in Amazon S3 is fully replicated or sharded by an S3 key. Defaults to `FullyReplicated`","S3InputMode":"Whether the `Pipe` or `File` is used as the input mode for transferring data for the monitoring job. `Pipe` mode is recommended for large datasets. `File` mode is useful for small files that fit in memory. Defaults to `File` ."}},"AWS::SageMaker::MonitoringSchedule.Json":{"attributes":{},"description":"","properties":{"Line":""}},"AWS::SageMaker::MonitoringSchedule.MonitoringAppSpecification":{"attributes":{},"description":"Container image configuration object for the monitoring job.","properties":{"ContainerArguments":"An array of arguments for the container used to run the monitoring job.","ContainerEntrypoint":"Specifies the entrypoint for a container used to run the monitoring job.","ImageUri":"The container image to be run by the monitoring job.","PostAnalyticsProcessorSourceUri":"An Amazon S3 URI to a script that is called after analysis has been performed. Applicable only for the built-in (first party) containers.","RecordPreprocessorSourceUri":"An Amazon S3 URI to a script that is called per row prior to running analysis. It can base64 decode the payload and convert it into a flatted json so that the built-in container can use the converted data. Applicable only for the built-in (first party) containers."}},"AWS::SageMaker::MonitoringSchedule.MonitoringExecutionSummary":{"attributes":{},"description":"Summary of information about the last monitoring job to run.","properties":{"CreationTime":"The time at which the monitoring job was created.","EndpointName":"The name of the endpoint used to run the monitoring job.","FailureReason":"Contains the reason a monitoring job failed, if it failed.","LastModifiedTime":"A timestamp that indicates the last time the monitoring job was modified.","MonitoringExecutionStatus":"The status of the monitoring job.","MonitoringScheduleName":"The name of the monitoring schedule.","ProcessingJobArn":"The Amazon Resource Name (ARN) of the monitoring job.","ScheduledTime":"The time the monitoring job was scheduled."}},"AWS::SageMaker::MonitoringSchedule.MonitoringInput":{"attributes":{},"description":"The inputs for a monitoring job.","properties":{"BatchTransformInput":"","EndpointInput":"The endpoint for a monitoring job."}},"AWS::SageMaker::MonitoringSchedule.MonitoringJobDefinition":{"attributes":{},"description":"Defines the monitoring job.","properties":{"BaselineConfig":"Baseline configuration used to validate that the data conforms to the specified constraints and statistics","Environment":"Sets the environment variables in the Docker container.","MonitoringAppSpecification":"Configures the monitoring job to run a specified Docker container image.","MonitoringInputs":"The array of inputs for the monitoring job. Currently we support monitoring an Amazon SageMaker Endpoint.","MonitoringOutputConfig":"The array of outputs from the monitoring job to be uploaded to Amazon Simple Storage Service (Amazon S3).","MonitoringResources":"Identifies the resources, ML compute instances, and ML storage volumes to deploy for a monitoring job. In distributed processing, you specify more than one instance.","NetworkConfig":"Specifies networking options for an monitoring job.","RoleArn":"The Amazon Resource Name (ARN) of an IAM role that Amazon SageMaker can assume to perform tasks on your behalf.","StoppingCondition":"Specifies a time limit for how long the monitoring job is allowed to run."}},"AWS::SageMaker::MonitoringSchedule.MonitoringOutput":{"attributes":{},"description":"The output object for a monitoring job.","properties":{"S3Output":"The Amazon S3 storage location where the results of a monitoring job are saved."}},"AWS::SageMaker::MonitoringSchedule.MonitoringOutputConfig":{"attributes":{},"description":"The output configuration for monitoring jobs.","properties":{"KmsKeyId":"The AWS Key Management Service ( AWS KMS) key that Amazon SageMaker uses to encrypt the model artifacts at rest using Amazon S3 server-side encryption.","MonitoringOutputs":"Monitoring outputs for monitoring jobs. This is where the output of the periodic monitoring jobs is uploaded."}},"AWS::SageMaker::MonitoringSchedule.MonitoringResources":{"attributes":{},"description":"Identifies the resources to deploy for a monitoring job.","properties":{"ClusterConfig":"The configuration for the cluster resources used to run the processing job."}},"AWS::SageMaker::MonitoringSchedule.MonitoringScheduleConfig":{"attributes":{},"description":"Configures the monitoring schedule and defines the monitoring job.","properties":{"MonitoringJobDefinition":"Defines the monitoring job.","MonitoringJobDefinitionName":"The name of the monitoring job definition to schedule.","MonitoringType":"The type of the monitoring job definition to schedule.","ScheduleConfig":"Configures the monitoring schedule."}},"AWS::SageMaker::MonitoringSchedule.NetworkConfig":{"attributes":{},"description":"Networking options for a job, such as network traffic encryption between containers, whether to allow inbound and outbound network calls to and from containers, and the VPC subnets and security groups to use for VPC-enabled jobs.","properties":{"EnableInterContainerTrafficEncryption":"Whether to encrypt all communications between distributed processing jobs. Choose `True` to encrypt communications. Encryption provides greater security for distributed processing jobs, but the processing might take longer.","EnableNetworkIsolation":"Whether to allow inbound and outbound network calls to and from the containers used for the processing job.","VpcConfig":"Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see [Protect Endpoints by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html) and [Protect Training Jobs by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html) ."}},"AWS::SageMaker::MonitoringSchedule.S3Output":{"attributes":{},"description":"Information about where and how you want to store the results of a monitoring job.","properties":{"LocalPath":"The local path to the S3 storage location where SageMaker saves the results of a monitoring job. LocalPath is an absolute path for the output data.","S3UploadMode":"Whether to upload the results of the monitoring job continuously or after the job completes.","S3Uri":"A URI that identifies the S3 storage location where SageMaker saves the results of a monitoring job."}},"AWS::SageMaker::MonitoringSchedule.ScheduleConfig":{"attributes":{},"description":"Configuration details about the monitoring schedule.","properties":{"ScheduleExpression":"A cron expression that describes details about the monitoring schedule.\\n\\nCurrently the only supported cron expressions are:\\n\\n- If you want to set the job to start every hour, please use the following:\\n\\n`Hourly: cron(0 * ? * * *)`\\n- If you want to start the job daily:\\n\\n`cron(0 [00-23] ? * * *)`\\n\\nFor example, the following are valid cron expressions:\\n\\n- Daily at noon UTC: `cron(0 12 ? * * *)`\\n- Daily at midnight UTC: `cron(0 0 ? * * *)`\\n\\nTo support running every 6, 12 hours, the following are also supported:\\n\\n`cron(0 [00-23]/[01-24] ? * * *)`\\n\\nFor example, the following are valid cron expressions:\\n\\n- Every 12 hours, starting at 5pm UTC: `cron(0 17/12 ? * * *)`\\n- Every two hours starting at midnight: `cron(0 0/2 ? * * *)`\\n\\n> - Even though the cron expression is set to start at 5PM UTC, note that there could be a delay of 0-20 minutes from the actual requested time to run the execution.\\n> - We recommend that if you would like a daily schedule, you do not provide this parameter. Amazon SageMaker will pick a time for running every day."}},"AWS::SageMaker::MonitoringSchedule.StatisticsResource":{"attributes":{},"description":"The baseline statistics file in Amazon S3 that the current monitoring job should be validated against.","properties":{"S3Uri":"The S3 URI for the statistics resource."}},"AWS::SageMaker::MonitoringSchedule.StoppingCondition":{"attributes":{},"description":"Specifies a limit to how long a model training job or model compilation job can run. It also specifies how long a managed spot training job has to complete. When the job reaches the time limit, SageMaker ends the training or compilation job. Use this API to cap model training costs.\\n\\nTo stop a training job, SageMaker sends the algorithm the `SIGTERM` signal, which delays job termination for 120 seconds. Algorithms can use this 120-second window to save the model artifacts, so the results of training are not lost.\\n\\nThe training algorithms provided by SageMaker automatically save the intermediate results of a model training job when possible. This attempt to save artifacts is only a best effort case as model might not be in a state from which it can be saved. For example, if training has just started, the model might not be ready to save. When saved, this intermediate data is a valid model artifact. You can use it to create a model with `CreateModel` .\\n\\n> The Neural Topic Model (NTM) currently does not support saving intermediate model artifacts. When training NTMs, make sure that the maximum runtime is sufficient for the training job to complete.","properties":{"MaxRuntimeInSeconds":"The maximum length of time, in seconds, that a training or compilation job can run before it is stopped.\\n\\nFor compilation jobs, if the job does not complete during this time, a `TimeOut` error is generated. We recommend starting with 900 seconds and increasing as necessary based on your model.\\n\\nFor all other jobs, if the job does not complete during this time, SageMaker ends the job. When `RetryStrategy` is specified in the job request, `MaxRuntimeInSeconds` specifies the maximum time for all of the attempts in total, not each individual attempt. The default value is 1 day. The maximum value is 28 days.\\n\\nThe maximum time that a `TrainingJob` can run in total, including any time spent publishing metrics or archiving and uploading models after it has been stopped, is 30 days."}},"AWS::SageMaker::MonitoringSchedule.VpcConfig":{"attributes":{},"description":"Specifies a VPC that your training jobs and hosted models have access to. Control access to and from your training and model containers by configuring the VPC. For more information, see [Protect Endpoints by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html) and [Protect Training Jobs by Using an Amazon Virtual Private Cloud](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html) .","properties":{"SecurityGroupIds":"The VPC security group IDs, in the form sg-xxxxxxxx. Specify the security groups for the VPC that is specified in the `Subnets` field.","Subnets":"The ID of the subnets in the VPC to which you want to connect your training job or model. For information about the availability of specific instance types, see [Supported Instance Types and Availability Zones](https://docs.aws.amazon.com/sagemaker/latest/dg/instance-types-az.html) ."}},"AWS::SageMaker::NotebookInstance":{"attributes":{"NotebookInstanceName":"The name of the notebook instance, such as `MyNotebookInstance` .","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the notebook instance, such as `arn:aws:sagemaker:us-west-2:012345678901:notebook-instance/mynotebookinstance` ."},"description":"The `AWS::SageMaker::NotebookInstance` resource creates an Amazon SageMaker notebook instance. A notebook instance is a machine learning (ML) compute instance running on a Jupyter notebook. For more information, see [Use Notebook Instances](https://docs.aws.amazon.com/sagemaker/latest/dg/nbi.html) .","properties":{"AcceleratorTypes":"A list of Amazon Elastic Inference (EI) instance types to associate with the notebook instance. Currently, only one instance type can be associated with a notebook instance. For more information, see [Using Elastic Inference in Amazon SageMaker](https://docs.aws.amazon.com/sagemaker/latest/dg/ei.html) .\\n\\n*Valid Values:* `ml.eia1.medium | ml.eia1.large | ml.eia1.xlarge | ml.eia2.medium | ml.eia2.large | ml.eia2.xlarge` .","AdditionalCodeRepositories":"An array of up to three Git repositories associated with the notebook instance. These can be either the names of Git repositories stored as resources in your account, or the URL of Git repositories in [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) or in any other Git repository. These repositories are cloned at the same level as the default repository of your notebook instance. For more information, see [Associating Git Repositories with SageMaker Notebook Instances](https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html) .","DefaultCodeRepository":"The Git repository associated with the notebook instance as its default code repository. This can be either the name of a Git repository stored as a resource in your account, or the URL of a Git repository in [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) or in any other Git repository. When you open a notebook instance, it opens in the directory that contains this repository. For more information, see [Associating Git Repositories with SageMaker Notebook Instances](https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-git-repo.html) .","DirectInternetAccess":"Sets whether SageMaker provides internet access to the notebook instance. If you set this to `Disabled` this notebook instance is able to access resources only in your VPC, and is not be able to connect to SageMaker training and endpoint services unless you configure a NAT Gateway in your VPC.\\n\\nFor more information, see [Notebook Instances Are Internet-Enabled by Default](https://docs.aws.amazon.com/sagemaker/latest/dg/appendix-additional-considerations.html#appendix-notebook-and-internet-access) . You can set the value of this parameter to `Disabled` only if you set a value for the `SubnetId` parameter.","InstanceMetadataServiceConfiguration":"Information on the IMDS configuration of the notebook instance","InstanceType":"The type of ML compute instance to launch for the notebook instance.\\n\\n> Expect some interruption of service if this parameter is changed as CloudFormation stops a notebook instance and starts it up again to update it.","KmsKeyId":"The Amazon Resource Name (ARN) of a AWS Key Management Service key that SageMaker uses to encrypt data on the storage volume attached to your notebook instance. The KMS key you provide must be enabled. For information, see [Enabling and Disabling Keys](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html) in the *AWS Key Management Service Developer Guide* .","LifecycleConfigName":"The name of a lifecycle configuration to associate with the notebook instance. For information about lifecycle configurations, see [Customize a Notebook Instance](https://docs.aws.amazon.com/sagemaker/latest/dg/notebook-lifecycle-config.html) in the *Amazon SageMaker Developer Guide* .","NotebookInstanceName":"The name of the new notebook instance.","PlatformIdentifier":"The platform identifier of the notebook instance runtime environment.","RoleArn":"When you send any requests to AWS resources from the notebook instance, SageMaker assumes this role to perform tasks on your behalf. You must grant this role necessary permissions so SageMaker can perform these tasks. The policy must allow the SageMaker service principal (sagemaker.amazonaws.com) permissions to assume this role. For more information, see [SageMaker Roles](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html) .\\n\\n> To be able to pass this role to SageMaker, the caller of this API must have the `iam:PassRole` permission.","RootAccess":"Whether root access is enabled or disabled for users of the notebook instance. The default value is `Enabled` .\\n\\n> Lifecycle configurations need root access to be able to set up a notebook instance. Because of this, lifecycle configurations associated with a notebook instance always run with root access even if you disable root access for users.","SecurityGroupIds":"The VPC security group IDs, in the form sg-xxxxxxxx. The security groups must be for the same VPC as specified in the subnet.","SubnetId":"The ID of the subnet in a VPC to which you would like to have a connectivity from your ML compute instance.","Tags":"A list of key-value pairs to apply to this resource.\\n\\nFor more information, see [Resource Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) and [Using Cost Allocation Tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html#allocation-what) .\\n\\nYou can add tags later by using the `CreateTags` API.","VolumeSizeInGB":"The size, in GB, of the ML storage volume to attach to the notebook instance. The default value is 5 GB.\\n\\n> Expect some interruption of service if this parameter is changed as CloudFormation stops a notebook instance and starts it up again to update it."}},"AWS::SageMaker::NotebookInstance.InstanceMetadataServiceConfiguration":{"attributes":{},"description":"Information on the IMDS configuration of the notebook instance","properties":{"MinimumInstanceMetadataServiceVersion":"Indicates the minimum IMDS version that the notebook instance supports. When passed as part of `CreateNotebookInstance` , if no value is selected, then it defaults to IMDSv1. This means that both IMDSv1 and IMDSv2 are supported. If passed as part of `UpdateNotebookInstance` , there is no default."}},"AWS::SageMaker::NotebookInstanceLifecycleConfig":{"attributes":{"NotebookInstanceLifecycleConfigName":"The name of the lifecycle configuration, such as `MyLifecycleConfig` .","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the endpoint configuration, such as `arn:aws:sagemaker:us-west-2:012345678901:notebook-instance-lifecycle-config/mylifecycleconfig`"},"description":"The `AWS::SageMaker::NotebookInstanceLifecycleConfig` resource creates shell scripts that run when you create and/or start a notebook instance. For information about notebook instance lifecycle configurations, see [Customize a Notebook Instance](https://docs.aws.amazon.com/sagemaker/latest/dg/notebook-lifecycle-config.html) in the *Amazon SageMaker Developer Guide* .","properties":{"NotebookInstanceLifecycleConfigName":"The name of the lifecycle configuration.","OnCreate":"A shell script that runs only once, when you create a notebook instance. The shell script must be a base64-encoded string.","OnStart":"A shell script that runs every time you start a notebook instance, including when you create the notebook instance. The shell script must be a base64-encoded string."}},"AWS::SageMaker::NotebookInstanceLifecycleConfig.NotebookInstanceLifecycleHook":{"attributes":{},"description":"Specifies the notebook instance lifecycle configuration script. Each lifecycle configuration script has a limit of 16384 characters.","properties":{"Content":"A base64-encoded string that contains a shell script for a notebook instance lifecycle configuration."}},"AWS::SageMaker::Pipeline":{"attributes":{"Ref":"`Ref` returns the PipelineName of the pipeline."},"description":"The `AWS::SageMaker::Pipeline` resource creates shell scripts that run when you create and/or start a SageMaker Pipeline. For information about SageMaker Pipelines, see [SageMaker Pipelines](https://docs.aws.amazon.com/sagemaker/latest/dg/pipelines.html) in the *Amazon SageMaker Developer Guide* .","properties":{"ParallelismConfiguration":"","PipelineDefinition":"The definition of the pipeline. This can be either a JSON string or an Amazon S3 location.","PipelineDescription":"The description of the pipeline.","PipelineDisplayName":"The display name of the pipeline.","PipelineName":"The name of the pipeline.","RoleArn":"The Amazon Resource Name (ARN) of the IAM role used to execute the pipeline.","Tags":"The tags of the pipeline."}},"AWS::SageMaker::Pipeline.ParallelismConfiguration":{"attributes":{},"description":"Configuration that controls the parallelism of the pipeline. By default, the parallelism configuration specified applies to all executions of the pipeline unless overridden.","properties":{"MaxParallelExecutionSteps":"The max number of steps that can be executed in parallel."}},"AWS::SageMaker::Pipeline.PipelineDefinition":{"attributes":{},"description":"","properties":{"PipelineDefinitionBody":"","PipelineDefinitionS3Location":""}},"AWS::SageMaker::Pipeline.S3Location":{"attributes":{},"description":"","properties":{"Bucket":"","ETag":"","Key":"","Version":""}},"AWS::SageMaker::Project":{"attributes":{"CreationTime":"The time that the project was created.","ProjectArn":"The Amazon Resource Name (ARN) of the project.","ProjectId":"The ID of the project. This ID is prepended to all entities associated with this project.","ProjectStatus":"The status of the project.","Ref":""},"description":"Creates a machine learning (ML) project that can contain one or more templates that set up an ML pipeline from training to deploying an approved model.","properties":{"ProjectDescription":"The description of the project.","ProjectName":"The name of the project.","ServiceCatalogProvisionedProductDetails":"","ServiceCatalogProvisioningDetails":"The product ID and provisioning artifact ID to provision a service catalog. For information, see [What is AWS Service Catalog](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html) .","Tags":"A list of key-value pairs to apply to this resource.\\n\\nFor more information, see [Resource Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) and [Using Cost Allocation Tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html#allocation-what) in the *AWS Billing and Cost Management User Guide* ."}},"AWS::SageMaker::Project.ProvisioningParameter":{"attributes":{},"description":"A key value pair used when you provision a project as a service catalog product. For information, see [What is AWS Service Catalog](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html) .","properties":{"Key":"The key that identifies a provisioning parameter.","Value":"The value of the provisioning parameter."}},"AWS::SageMaker::Project.ServiceCatalogProvisionedProductDetails":{"attributes":{},"description":"Details of a provisioned service catalog product. For information about service catalog, see [What is AWS Service Catalog](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html) .","properties":{"ProvisionedProductId":"The ID of the provisioned product.","ProvisionedProductStatusMessage":"The current status of the product.\\n\\n- `AVAILABLE` - Stable state, ready to perform any operation. The most recent operation succeeded and completed.\\n- `UNDER_CHANGE` - Transitive state. Operations performed might not have valid results. Wait for an AVAILABLE status before performing operations.\\n- `TAINTED` - Stable state, ready to perform any operation. The stack has completed the requested operation but is not exactly what was requested. For example, a request to update to a new version failed and the stack rolled back to the current version.\\n- `ERROR` - An unexpected error occurred. The provisioned product exists but the stack is not running. For example, CloudFormation received a parameter value that was not valid and could not launch the stack.\\n- `PLAN_IN_PROGRESS` - Transitive state. The plan operations were performed to provision a new product, but resources have not yet been created. After reviewing the list of resources to be created, execute the plan. Wait for an AVAILABLE status before performing operations."}},"AWS::SageMaker::Project.ServiceCatalogProvisioningDetails":{"attributes":{},"description":"Details that you specify to provision a service catalog product. For information about service catalog, see [What is AWS Service Catalog](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html) .","properties":{"PathId":"The path identifier of the product. This value is optional if the product has a default path, and required if the product has more than one path.","ProductId":"The ID of the product to provision.","ProvisioningArtifactId":"The ID of the provisioning artifact.","ProvisioningParameters":"A list of key value pairs that you specify when you provision a product."}},"AWS::SageMaker::Space":{"attributes":{"Ref":"","SpaceArn":"The space\'s Amazon Resource Name (ARN)."},"description":"Creates a space used for real time collaboration in a Domain.","properties":{"DomainId":"The ID of the associated Domain.","SpaceName":"The name of the space.","SpaceSettings":"A collection of space settings.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::SageMaker::Space.CustomImage":{"attributes":{},"description":"A custom SageMaker image. For more information, see [Bring your own SageMaker image](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-byoi.html) .","properties":{"AppImageConfigName":"The name of the AppImageConfig.","ImageName":"The name of the CustomImage. Must be unique to your account.","ImageVersionNumber":"The version number of the CustomImage."}},"AWS::SageMaker::Space.JupyterServerAppSettings":{"attributes":{},"description":"The JupyterServer app settings.","properties":{"DefaultResourceSpec":"The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the JupyterServer app. If you use the `LifecycleConfigArns` parameter, then this parameter is also required."}},"AWS::SageMaker::Space.KernelGatewayAppSettings":{"attributes":{},"description":"The KernelGateway app settings.","properties":{"CustomImages":"A list of custom SageMaker images that are configured to run as a KernelGateway app.","DefaultResourceSpec":"The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the KernelGateway app.\\n\\n> The Amazon SageMaker Studio UI does not use the default instance type value set here. The default instance type set here is used when Apps are created using the AWS Command Line Interface or AWS CloudFormation and the instance type parameter value is not passed."}},"AWS::SageMaker::Space.ResourceSpec":{"attributes":{},"description":"Specifies the ARN\'s of a SageMaker image and SageMaker image version, and the instance type that the version runs on.","properties":{"InstanceType":"The instance type that the image version runs on.\\n\\n> *JupyterServer apps* only support the `system` value.\\n> \\n> For *KernelGateway apps* , the `system` value is translated to `ml.t3.medium` . KernelGateway apps also support all other values for available instance types.","SageMakerImageArn":"The ARN of the SageMaker image that the image version belongs to.","SageMakerImageVersionArn":"The ARN of the image version created on the instance."}},"AWS::SageMaker::Space.SpaceSettings":{"attributes":{},"description":"A collection of space settings.","properties":{"JupyterServerAppSettings":"The JupyterServer app settings.","KernelGatewayAppSettings":"The KernelGateway app settings."}},"AWS::SageMaker::UserProfile":{"attributes":{"Ref":"`Ref` returns the Domain ID and the user profile name, such as `d-xxxxxxxxxxxx` and `my-user-profile` , respectively.","UserProfileArn":"The Amazon Resource Name (ARN) of the user profile, such as `arn:aws:sagemaker:us-west-2:account-id:user-profile/my-user-profile` ."},"description":"Creates a user profile. A user profile represents a single user within a domain, and is the main way to reference a \\"person\\" for the purposes of sharing, reporting, and other user-oriented features. This entity is created when a user onboards to Amazon SageMaker Studio. If an administrator invites a person by email or imports them from IAM Identity Center , a user profile is automatically created. A user profile is the primary holder of settings for an individual user and has a reference to the user\'s private Amazon Elastic File System (EFS) home directory.\\n\\n> If you\'re using IAM Identity Center authentication, a user in IAM Identity Center , or a group in IAM Identity Center containing that user, must be assigned to the Amazon SageMaker Studio application from the IAM Identity Center Console to create a user profile. For more information about application assignment, see [Assign user access](https://docs.aws.amazon.com/singlesignon/latest/userguide/assignuserstoapp.html) . After assignment is complete, a user profile can be created for that user in IAM Identity Center with AWS CloudFormation.","properties":{"DomainId":"The domain ID.","SingleSignOnUserIdentifier":"A specifier for the type of value specified in SingleSignOnUserValue. Currently, the only supported value is \\"UserName\\". If the Domain\'s AuthMode is IAM Identity Center , this field is required. If the Domain\'s AuthMode is not IAM Identity Center , this field cannot be specified.","SingleSignOnUserValue":"The username of the associated AWS Single Sign-On User for this UserProfile. If the Domain\'s AuthMode is IAM Identity Center , this field is required, and must match a valid username of a user in your directory. If the Domain\'s AuthMode is not IAM Identity Center , this field cannot be specified.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nTags that you specify for the User Profile are also added to all apps that the User Profile launches.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) .","UserProfileName":"The user profile name.","UserSettings":"A collection of settings that apply to users of Amazon SageMaker Studio."}},"AWS::SageMaker::UserProfile.CustomImage":{"attributes":{},"description":"A custom SageMaker image. For more information, see [Bring your own SageMaker image](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-byoi.html) .","properties":{"AppImageConfigName":"The name of the AppImageConfig.","ImageName":"The name of the CustomImage. Must be unique to your account.","ImageVersionNumber":"The version number of the CustomImage."}},"AWS::SageMaker::UserProfile.JupyterServerAppSettings":{"attributes":{},"description":"The JupyterServer app settings.","properties":{"DefaultResourceSpec":"The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the JupyterServer app."}},"AWS::SageMaker::UserProfile.KernelGatewayAppSettings":{"attributes":{},"description":"The KernelGateway app settings.","properties":{"CustomImages":"A list of custom SageMaker images that are configured to run as a KernelGateway app.","DefaultResourceSpec":"The default instance type and the Amazon Resource Name (ARN) of the default SageMaker image used by the KernelGateway app.\\n\\n> The Amazon SageMaker Studio UI does not use the default instance type value set here. The default instance type set here is used when Apps are created using the AWS Command Line Interface or AWS CloudFormation and the instance type parameter value is not passed."}},"AWS::SageMaker::UserProfile.RStudioServerProAppSettings":{"attributes":{},"description":"A collection of settings that configure user interaction with the `RStudioServerPro` app.","properties":{"AccessStatus":"Indicates whether the current user has access to the `RStudioServerPro` app.","UserGroup":"The level of permissions that the user has within the `RStudioServerPro` app. This value defaults to `User`. The `Admin` value allows the user access to the RStudio Administrative Dashboard."}},"AWS::SageMaker::UserProfile.ResourceSpec":{"attributes":{},"description":"Specifies the ARN\'s of a SageMaker image and SageMaker image version, and the instance type that the version runs on.","properties":{"InstanceType":"The instance type that the image version runs on.\\n\\n> *JupyterServer apps* only support the `system` value.\\n> \\n> For *KernelGateway apps* , the `system` value is translated to `ml.t3.medium` . KernelGateway apps also support all other values for available instance types.","SageMakerImageArn":"The ARN of the SageMaker image that the image version belongs to.","SageMakerImageVersionArn":"The ARN of the image version created on the instance."}},"AWS::SageMaker::UserProfile.SharingSettings":{"attributes":{},"description":"Specifies options when sharing an Amazon SageMaker Studio notebook. These settings are specified as part of `DefaultUserSettings` when the [CreateDomain](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateDomain.html) API is called, and as part of `UserSettings` when the [CreateUserProfile](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateUserProfile.html) API is called.","properties":{"NotebookOutputOption":"Whether to include the notebook cell output when sharing the notebook. The default is `Disabled` .","S3KmsKeyId":"When `NotebookOutputOption` is `Allowed` , the AWS Key Management Service (KMS) encryption key ID used to encrypt the notebook cell output in the Amazon S3 bucket.","S3OutputPath":"When `NotebookOutputOption` is `Allowed` , the Amazon S3 bucket used to store the shared notebook snapshots."}},"AWS::SageMaker::UserProfile.UserSettings":{"attributes":{},"description":"A collection of settings that apply to users of Amazon SageMaker Studio. These settings are specified when the [CreateUserProfile](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateUserProfile.html) API is called, and as `DefaultUserSettings` when the [CreateDomain](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateDomain.html) API is called.\\n\\n`SecurityGroups` is aggregated when specified in both calls. For all other settings in `UserSettings` , the values specified in `CreateUserProfile` take precedence over those specified in `CreateDomain` .","properties":{"ExecutionRole":"The execution role for the user.","JupyterServerAppSettings":"The Jupyter server\'s app settings.","KernelGatewayAppSettings":"The kernel gateway app settings.","RStudioServerProAppSettings":"A collection of settings that configure user interaction with the `RStudioServerPro` app.","SecurityGroups":"The security groups for the Amazon Virtual Private Cloud (VPC) that Studio uses for communication.\\n\\nOptional when the `CreateDomain.AppNetworkAccessType` parameter is set to `PublicInternetOnly` .\\n\\nRequired when the `CreateDomain.AppNetworkAccessType` parameter is set to `VpcOnly` , unless specified as part of the `DefaultUserSettings` for the domain.\\n\\nAmazon SageMaker adds a security group to allow NFS traffic from SageMaker Studio. Therefore, the number of security groups that you can specify is one less than the maximum number shown.","SharingSettings":"Specifies options for sharing SageMaker Studio notebooks."}},"AWS::SageMaker::Workteam":{"attributes":{"Ref":"","WorkteamName":"The name of the work team."},"description":"Creates a new work team for labeling your data. A work team is defined by one or more Amazon Cognito user pools. You must first create the user pools before you can create a work team.\\n\\nYou cannot create more than 25 work teams in an account and region.","properties":{"Description":"A description of the work team.","MemberDefinitions":"A list of `MemberDefinition` objects that contains objects that identify the workers that make up the work team.\\n\\nWorkforces can be created using Amazon Cognito or your own OIDC Identity Provider (IdP). For private workforces created using Amazon Cognito use `CognitoMemberDefinition` . For workforces created using your own OIDC identity provider (IdP) use `OidcMemberDefinition` .","NotificationConfiguration":"Configures SNS notifications of available or expiring work items for work teams.","Tags":"An array of key-value pairs.","WorkforceName":"","WorkteamName":"The name of the work team."}},"AWS::SageMaker::Workteam.CognitoMemberDefinition":{"attributes":{},"description":"Identifies a Amazon Cognito user group. A user group can be used in on or more work teams.","properties":{"CognitoClientId":"An identifier for an application client. You must create the app client ID using Amazon Cognito.","CognitoUserGroup":"An identifier for a user group.","CognitoUserPool":"An identifier for a user pool. The user pool must be in the same region as the service that you are calling."}},"AWS::SageMaker::Workteam.MemberDefinition":{"attributes":{},"description":"Defines an Amazon Cognito or your own OIDC IdP user group that is part of a work team.","properties":{"CognitoMemberDefinition":"The Amazon Cognito user group that is part of the work team.","OidcMemberDefinition":"A list user groups that exist in your OIDC Identity Provider (IdP). One to ten groups can be used to create a single private work team. When you add a user group to the list of `Groups` , you can add that user group to one or more private work teams. If you add a user group to a private work team, all workers in that user group are added to the work team."}},"AWS::SageMaker::Workteam.NotificationConfiguration":{"attributes":{},"description":"Configures Amazon SNS notifications of available or expiring work items for work teams.","properties":{"NotificationTopicArn":"The ARN for the Amazon SNS topic to which notifications should be published."}},"AWS::SageMaker::Workteam.OidcMemberDefinition":{"attributes":{},"description":"A list of user groups that exist in your OIDC Identity Provider (IdP). One to ten groups can be used to create a single private work team. When you add a user group to the list of `Groups` , you can add that user group to one or more private work teams. If you add a user group to a private work team, all workers in that user group are added to the work team.","properties":{"OidcGroups":""}},"AWS::Scheduler::Schedule":{"attributes":{"Arn":"The Amazon Resource Name (ARN) for the Amazon EventBridge Scheduler schedule.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the `Name` attribute of theschedule."},"description":"A *schedule* is the main resource you create, configure, and manage using Amazon EventBridge Scheduler.\\n\\nEvery schedule has a *schedule expression* that determines when, and with what frequency, the schedule runs. EventBridge Scheduler supports three types of schedules: rate, cron, and one-time schedules. For more information about different schedule types, see [Schedule types](https://docs.aws.amazon.com/scheduler/latest/UserGuide/schedule-types.html) in the *EventBridge Scheduler User Guide* .\\n\\nWhen you create a schedule, you configure a target for the schedule to invoke. A target is an API operation that EventBridge Scheduler calls on your behalf every time your schedule runs. EventBridge Scheduler supports two types of targets: *templated* targets invoke common API operations across a core groups of services, and customizeable *universal* targets that you can use to call more than 6,000 operations across over 270 services. For more information about configuring targets, see [Managing targets](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets.html) in the *EventBridge Scheduler User Guide* .\\n\\nFor more information about managing schedules, changing the schedule state, setting up flexible time windows, and configuring a dead-letter queue for a schedule, see [Managing a schedule](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-schedule.html) in the *EventBridge Scheduler User Guide* .","properties":{"Description":"The description you specify for the schedule.","EndDate":"The date, in UTC, before which the schedule can invoke its target. Depending on the schedule\'s recurrence expression, invocations might stop on, or before, the `EndDate` you specify.\\nEventBridge Scheduler ignores `EndDate` for one-time schedules.","FlexibleTimeWindow":"Allows you to configure a time window during which EventBridge Scheduler invokes the schedule.","GroupName":"The name of the schedule group associated with this schedule.","KmsKeyArn":"The Amazon Resource Name (ARN) for the customer managed KMS key that EventBridge Scheduler will use to encrypt and decrypt your data.","Name":"The name of the schedule.","ScheduleExpression":"The expression that defines when the schedule runs. The following formats are supported.\\n\\n- `at` expression - `at(yyyy-mm-ddThh:mm:ss)`\\n- `rate` expression - `rate(value unit)`\\n- `cron` expression - `cron(fields)`\\n\\nYou can use `at` expressions to create one-time schedules that invoke a target once, at the time and in the time zone, that you specify. You can use `rate` and `cron` expressions to create recurring schedules. Rate-based schedules are useful when you want to invoke a target at regular intervals, such as every 15 minutes or every five days. Cron-based schedules are useful when you want to invoke a target periodically at a specific time, such as at 8:00 am (UTC+0) every 1st day of the month.\\n\\nA `cron` expression consists of six fields separated by white spaces: `(minutes hours day_of_month month day_of_week year)` .\\n\\nA `rate` expression consists of a *value* as a positive integer, and a *unit* with the following options: `minute` | `minutes` | `hour` | `hours` | `day` | `days`\\n\\nFor more information and examples, see [Schedule types on EventBridge Scheduler](https://docs.aws.amazon.com/scheduler/latest/UserGuide/schedule-types.html) in the *EventBridge Scheduler User Guide* .","ScheduleExpressionTimezone":"The timezone in which the scheduling expression is evaluated.","StartDate":"The date, in UTC, after which the schedule can begin invoking its target. Depending on the schedule\'s recurrence expression, invocations might occur on, or after, the `StartDate` you specify.\\nEventBridge Scheduler ignores `StartDate` for one-time schedules.","State":"Specifies whether the schedule is enabled or disabled.\\n\\n*Allowed Values* : `ENABLED` | `DISABLED`","Target":"The schedule\'s target details."}},"AWS::Scheduler::Schedule.AwsVpcConfiguration":{"attributes":{},"description":"This structure specifies the VPC subnets and security groups for the task, and whether a public IP address is to be used. This structure is relevant only for ECS tasks that use the awsvpc network mode.","properties":{"AssignPublicIp":"Specifies whether the task\'s elastic network interface receives a public IP address. You can specify `ENABLED` only when `LaunchType` in `EcsParameters` is set to `FARGATE` .","SecurityGroups":"Specifies the security groups associated with the task. These security groups must all be in the same VPC. You can specify as many as five security groups. If you do not specify a security group, the default security group for the VPC is used.","Subnets":"Specifies the subnets associated with the task. These subnets must all be in the same VPC. You can specify as many as 16 subnets."}},"AWS::Scheduler::Schedule.CapacityProviderStrategyItem":{"attributes":{},"description":"The details of a capacity provider strategy.","properties":{"Base":"The base value designates how many tasks, at a minimum, to run on the specified capacity provider. Only one capacity provider in a capacity provider strategy can have a base defined. If no value is specified, the default value of `0` is used.","CapacityProvider":"The short name of the capacity provider.","Weight":"The weight value designates the relative percentage of the total number of tasks launched that should use the specified capacity provider. The weight value is taken into consideration after the base value, if defined, is satisfied."}},"AWS::Scheduler::Schedule.DeadLetterConfig":{"attributes":{},"description":"An object that contains information about an Amazon SQS queue that EventBridge Scheduler uses as a dead-letter queue for your schedule. If specified, EventBridge Scheduler delivers failed events that could not be successfully delivered to a target to the queue.","properties":{"Arn":"The Amazon Resource Name (ARN) of the SQS queue specified as the destination for the dead-letter queue."}},"AWS::Scheduler::Schedule.EcsParameters":{"attributes":{},"description":"The templated target type for the Amazon ECS [`RunTask`](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html) API operation.","properties":{"CapacityProviderStrategy":"The capacity provider strategy to use for the task.","EnableECSManagedTags":"Specifies whether to enable Amazon ECS managed tags for the task. For more information, see [Tagging Your Amazon ECS Resources](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html) in the *Amazon ECS Developer Guide* .","EnableExecuteCommand":"Whether or not to enable the execute command functionality for the containers in this task. If true, this enables execute command functionality on all containers in the task.","Group":"Specifies an Amazon ECS task group for the task. The maximum length is 255 characters.","LaunchType":"Specifies the launch type on which your task is running. The launch type that you specify here must match one of the launch type (compatibilities) of the target task. The `FARGATE` value is supported only in the Regions where Fargate with Amazon ECS is supported. For more information, see [AWS Fargate on Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html) in the *Amazon ECS Developer Guide* .","NetworkConfiguration":"This structure specifies the network configuration for an ECS task.","PlacementConstraints":"An array of placement constraint objects to use for the task. You can specify up to 10 constraints per task (including constraints in the task definition and those specified at runtime).","PlacementStrategy":"The task placement strategy for a task or service.","PlatformVersion":"Specifies the platform version for the task. Specify only the numeric portion of the platform version, such as `1.1.0` .","PropagateTags":"Specifies whether to propagate the tags from the task definition to the task. If no value is specified, the tags are not propagated. Tags can only be propagated to the task during task creation. To add tags to a task after task creation, use the Amazon ECS [`TagResource`](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TagResource.html) API action.","ReferenceId":"The reference ID to use for the task.","Tags":"The metadata that you apply to the task to help you categorize and organize them. Each tag consists of a key and an optional value, both of which you define. For more information, see [`RunTask`](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html) in the *Amazon ECS API Reference* .","TaskCount":"The number of tasks to create based on `TaskDefinition` . The default is `1` .","TaskDefinitionArn":"The Amazon Resource Name (ARN) of the task definition to use if the event target is an Amazon ECS task."}},"AWS::Scheduler::Schedule.EventBridgeParameters":{"attributes":{},"description":"The templated target type for the EventBridge [`PutEvents`](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html) API operation.","properties":{"DetailType":"A free-form string, with a maximum of 128 characters, used to decide what fields to expect in the event detail.","Source":"The source of the event."}},"AWS::Scheduler::Schedule.FlexibleTimeWindow":{"attributes":{},"description":"Allows you to configure a time window during which EventBridge Scheduler invokes the schedule.","properties":{"MaximumWindowInMinutes":"The maximum time window during which a schedule can be invoked.\\n\\n*Minimum* : `1`\\n\\n*Maximum* : `1440`","Mode":"Determines whether the schedule is invoked within a flexible time window.\\n\\n*Allowed Values* : `OFF` | `FLEXIBLE`"}},"AWS::Scheduler::Schedule.KinesisParameters":{"attributes":{},"description":"The templated target type for the Amazon Kinesis [`PutRecord`](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html) API operation.","properties":{"PartitionKey":"Specifies the shard to which EventBridge Scheduler sends the event. For more information, see [Amazon Kinesis Data Streams terminology and concepts](https://docs.aws.amazon.com/streams/latest/dev/key-concepts.html) in the *Amazon Kinesis Streams Developer Guide* ."}},"AWS::Scheduler::Schedule.NetworkConfiguration":{"attributes":{},"description":"Specifies the network configuration for an ECS task.","properties":{"AwsvpcConfiguration":"Specifies the Amazon VPC subnets and security groups for the task, and whether a public IP address is to be used. This structure is relevant only for ECS tasks that use the awsvpc network mode."}},"AWS::Scheduler::Schedule.PlacementConstraint":{"attributes":{},"description":"An object representing a constraint on task placement.","properties":{"Expression":"A cluster query language expression to apply to the constraint. You cannot specify an expression if the constraint type is `distinctInstance` . For more information, see [Cluster query language](https://docs.aws.amazon.com/latest/developerguide/cluster-query-language.html) in the *Amazon ECS Developer Guide* .","Type":"The type of constraint. Use `distinctInstance` to ensure that each task in a particular group is running on a different container instance. Use `memberOf` to restrict the selection to a group of valid candidates."}},"AWS::Scheduler::Schedule.PlacementStrategy":{"attributes":{},"description":"The task placement strategy for a task or service.","properties":{"Field":"The field to apply the placement strategy against. For the spread placement strategy, valid values are `instanceId` (or `instanceId` , which has the same effect), or any platform or custom attribute that is applied to a container instance, such as `attribute:ecs.availability-zone` . For the binpack placement strategy, valid values are `cpu` and `memory` . For the random placement strategy, this field is not used.","Type":"The type of placement strategy. The random placement strategy randomly places tasks on available candidates. The spread placement strategy spreads placement across available candidates evenly based on the field parameter. The binpack strategy places tasks on available candidates that have the least available amount of the resource that is specified with the field parameter. For example, if you binpack on memory, a task is placed on the instance with the least amount of remaining memory (but still enough to run the task)."}},"AWS::Scheduler::Schedule.RetryPolicy":{"attributes":{},"description":"A `RetryPolicy` object that includes information about the retry policy settings, including the maximum age of an event, and the maximum number of times EventBridge Scheduler will try to deliver the event to a target.","properties":{"MaximumEventAgeInSeconds":"The maximum amount of time, in seconds, to continue to make retry attempts.","MaximumRetryAttempts":"The maximum number of retry attempts to make before the request fails. Retry attempts with exponential backoff continue until either the maximum number of attempts is made or until the duration of the `MaximumEventAgeInSeconds` is reached."}},"AWS::Scheduler::Schedule.SageMakerPipelineParameter":{"attributes":{},"description":"The name and value pair of a parameter to use to start execution of a SageMaker Model Building Pipeline.","properties":{"Name":"Name of parameter to start execution of a SageMaker Model Building Pipeline.","Value":"Value of parameter to start execution of a SageMaker Model Building Pipeline."}},"AWS::Scheduler::Schedule.SageMakerPipelineParameters":{"attributes":{},"description":"The templated target type for the Amazon SageMaker [`StartPipelineExecution`](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_StartPipelineExecution.html) API operation.","properties":{"PipelineParameterList":"List of parameter names and values to use when executing the SageMaker Model Building Pipeline."}},"AWS::Scheduler::Schedule.SqsParameters":{"attributes":{},"description":"The templated target type for the Amazon SQS [`SendMessage`](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html) API operation. Contains the message group ID to use when the target is a FIFO queue. If you specify an Amazon SQS FIFO queue as a target, the queue must have content-based deduplication enabled. For more information, see [Using the Amazon SQS message deduplication ID](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagededuplicationid-property.html) in the *Amazon SQS Developer Guide* .","properties":{"MessageGroupId":"The FIFO message group ID to use as the target."}},"AWS::Scheduler::Schedule.Target":{"attributes":{},"description":"The schedule\'s target. EventBridge Scheduler supports templated target that invoke common API operations, as well as universal targets that you can customize to invoke over 6,000 API operations across more than 270 services. You can only specify one templated or universal target for a schedule.","properties":{"Arn":"The Amazon Resource Name (ARN) of the target.","DeadLetterConfig":"An object that contains information about an Amazon SQS queue that EventBridge Scheduler uses as a dead-letter queue for your schedule. If specified, EventBridge Scheduler delivers failed events that could not be successfully delivered to a target to the queue.","EcsParameters":"The templated target type for the Amazon ECS [`RunTask`](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html) API operation.","EventBridgeParameters":"The templated target type for the EventBridge [`PutEvents`](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html) API operation.","Input":"The text, or well-formed JSON, passed to the target. If you are configuring a templated Lambda , AWS Step Functions , or Amazon EventBridge target, the input must be a well-formed JSON. For all other target types, a JSON is not required. If you do not specify anything for this field, Amazon EventBridge Scheduler delivers a default notification to the target.","KinesisParameters":"The templated target type for the Amazon Kinesis [`PutRecord`](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html) API operation.","RetryPolicy":"A `RetryPolicy` object that includes information about the retry policy settings, including the maximum age of an event, and the maximum number of times EventBridge Scheduler will try to deliver the event to a target.","RoleArn":"The Amazon Resource Name (ARN) of the IAM role that EventBridge Scheduler will use for this target when the schedule is invoked.","SageMakerPipelineParameters":"The templated target type for the Amazon SageMaker [`StartPipelineExecution`](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_StartPipelineExecution.html) API operation.","SqsParameters":"The templated target type for the Amazon SQS [`SendMessage`](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html) API operation. Contains the message group ID to use when the target is a FIFO queue. If you specify an Amazon SQS FIFO queue as a target, the queue must have content-based deduplication enabled. For more information, see [Using the Amazon SQS message deduplication ID](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagededuplicationid-property.html) in the *Amazon SQS Developer Guide* ."}},"AWS::Scheduler::ScheduleGroup":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the schedule group.","CreationDate":"The date and time at which the schedule group was created.","LastModificationDate":"The time at which the schedule group was last modified.","Ref":"When you pass the logical ID of this resource to the intrinsic `Ref` function, `Ref` returns the `Name` attribute of the schedule group.","State":"Specifies the state of the schedule group.\\n\\n*Allowed Values* : `ACTIVE` | `DELETING`"},"description":"A *schedule group* is an Amazon EventBridge Scheduler resource you use to organize your schedules.\\n\\nYour AWS account comes with a `default` scheduler group. You associate a new schedule with the `default` group or with schedule groups that you create and manage. You can create up to [500 schedule groups](https://docs.aws.amazon.com/scheduler/latest/UserGuide/scheduler-quotas.html) in your AWS account. With EventBridge Scheduler, you apply [tags](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) to schedule groups, not to individual schedules to organize your resources.\\n\\nFor more information about managing schedule groups, see [Managing a schedule group](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-schedule-group.html) in the *EventBridge Scheduler User Guide* .","properties":{"Name":"The name of the schedule group.","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::SecretsManager::ResourcePolicy":{"attributes":{"Ref":"When you pass the logical ID of an `AWS::SecretsManager::ResourcePolicy` resource to the intrinsic `Ref` function, the function returns the ARN of the configured secret, such as:\\n\\n`arn:aws:secretsmanager: *us-west-2* : *123456789012* :secret: *my-path/my-secret-name* - *1a2b3c*`\\n\\nThis enables you to reference a secret you created in one part of the stack template from within the definition of another resource later, in the same template. You would typically use this with the [AWS::SecretsManager::SecretTargetAttachment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secrettargetattachment.html) resource type.\\n\\nFor more information about using the Ref function, see [Ref](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Attaches a resource-based permission policy to a secret. A resource-based policy is optional. For more information, see [Authentication and access control for Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access.html)\\n\\nFor information about attaching a policy in the console, see [Attach a permissions policy to a secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_resource-based-policies.html) .\\n\\n*Required permissions:* `secretsmanager:PutResourcePolicy` . For more information, see [IAM policy actions for Secrets Manager](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awssecretsmanager.html#awssecretsmanager-actions-as-permissions) and [Authentication and access control in Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access.html) .","properties":{"BlockPublicPolicy":"Specifies whether to block resource-based policies that allow broad access to the secret. By default, Secrets Manager blocks policies that allow broad access, for example those that use a wildcard for the principal.","ResourcePolicy":"A JSON-formatted string for an AWS resource-based policy. For example policies, see [Permissions policy examples](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_examples.html) .","SecretId":"The ARN or name of the secret to attach the resource-based policy.\\n\\nFor an ARN, we recommend that you specify a complete ARN rather than a partial ARN."}},"AWS::SecretsManager::RotationSchedule":{"attributes":{"Ref":"When you pass the logical ID of an `AWS::SecretsManager::RotationSchedule` resource to the intrinsic `Ref` function, the function returns the ARN of the secret being configured, such as:\\n\\n*arn:aws:secretsmanager: us-west-2* : *123456789012* :secret: *my-path/my-secret-name* - *1a2b3c*\\n\\nYou can use the ARN to reference a secret you create in one part of the stack template from within the definition of another resource later, in the same template. You typically do this when you define the [AWS::SecretsManager::SecretTargetAttachment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secrettargetattachment.html) resource type.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Sets the rotation schedule and Lambda rotation function for a secret. For more information, see [How rotation works](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_how.html) .\\n\\nFor Amazon RDS master user credentials, see [AWS::RDS::DBCluster MasterUserSecret](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-masterusersecret.html) .\\n\\nFor the rotation function, you have two options:\\n\\n- You can create a new rotation function based on one of the [Secrets Manager rotation function templates](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html) by using `HostedRotationLambda` .\\n- You can choose an existing rotation function by using `RotationLambdaARN` .\\n\\nFor database secrets, if you define both the secret and the database or service in the AWS CloudFormation template, then you need to define the [AWS::SecretsManager::SecretTargetAttachment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secrettargetattachment.html) resource to populate the secret with the connection details of the database or service before you attempt to configure rotation.","properties":{"HostedRotationLambda":"Creates a new Lambda rotation function based on one of the [Secrets Manager rotation function templates](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html) . To use a rotation function that already exists, specify `RotationLambdaARN` instead.\\n\\nFor Amazon RDS master user credentials, see [AWS::RDS::DBCluster MasterUserSecret](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-masterusersecret.html) .","RotateImmediatelyOnUpdate":"Specifies whether to rotate the secret immediately or wait until the next scheduled rotation window. The rotation schedule is defined in `RotationRules` .\\n\\nIf you don\'t immediately rotate the secret, Secrets Manager tests the rotation configuration by running the [`testSecret` step](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_how.html) of the Lambda rotation function. The test creates an `AWSPENDING` version of the secret and then removes it.\\n\\nIf you don\'t specify this value, then by default, Secrets Manager rotates the secret immediately.\\n\\nRotation is an asynchronous process. For more information, see [How rotation works](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_how.html) .","RotationLambdaARN":"The ARN of an existing Lambda rotation function. To specify a rotation function that is also defined in this template, use the [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) function.\\n\\nFor Amazon RDS master user credentials, see [AWS::RDS::DBCluster MasterUserSecret](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-masterusersecret.html) .\\n\\nTo create a new rotation function based on one of the [Secrets Manager rotation function templates](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html) , specify `HostedRotationLambda` instead.","RotationRules":"A structure that defines the rotation configuration for this secret.","SecretId":"The ARN or name of the secret to rotate.\\n\\nTo reference a secret also created in this template, use the [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) function with the secret\'s logical ID."}},"AWS::SecretsManager::RotationSchedule.HostedRotationLambda":{"attributes":{},"description":"Creates a new Lambda rotation function based on one of the [Secrets Manager rotation function templates](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html) .\\n\\nYou must specify `Transform: AWS::SecretsManager-2020-07-23` at the beginning of the CloudFormation template.\\n\\nFor Amazon RDS master user credentials, see [AWS::RDS::DBCluster MasterUserSecret](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-masterusersecret.html) .","properties":{"ExcludeCharacters":"A string of the characters that you don\'t want in the password.","KmsKeyArn":"The ARN of the KMS key that Secrets Manager uses to encrypt the secret. If you don\'t specify this value, then Secrets Manager uses the key `aws/secretsmanager` . If `aws/secretsmanager` doesn\'t yet exist, then Secrets Manager creates it for you automatically the first time it encrypts the secret value.","MasterSecretArn":"The ARN of the secret that contains superuser credentials, if you use the [Alternating users rotation strategy](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets_strategies.html#rotating-secrets-two-users) . CloudFormation grants the execution role for the Lambda rotation function `GetSecretValue` permission to the secret in this property. For more information, see [Lambda rotation function execution role permissions for Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets-required-permissions-function.html) .\\n\\nYou must create the superuser secret before you can set this property.\\n\\nYou must also include the superuser secret ARN as a key in the JSON of the rotating secret so that the Lambda rotation function can find it. CloudFormation does not hardcode secret ARNs in the Lambda rotation function, so you can use the function to rotate multiple secrets. For more information, see [JSON structure of Secrets Manager secrets](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_secret_json_structure.html) .\\n\\nYou can specify `MasterSecretArn` or `SuperuserSecretArn` but not both. They represent the same superuser secret.","MasterSecretKmsKeyArn":"The ARN of the KMS key that Secrets Manager used to encrypt the superuser secret, if you use the [alternating users strategy](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets_strategies.html#rotating-secrets-two-users) and the superuser secret is encrypted with a customer managed key. You don\'t need to specify this property if the superuser secret is encrypted using the key `aws/secretsmanager` . CloudFormation grants the execution role for the Lambda rotation function `Decrypt` , `DescribeKey` , and `GenerateDataKey` permission to the key in this property. For more information, see [Lambda rotation function execution role permissions for Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets-required-permissions-function.html) .\\n\\nYou can specify `MasterSecretKmsKeyArn` or `SuperuserSecretKmsKeyArn` but not both. They represent the same superuser secret KMS key .","RotationLambdaName":"The name of the Lambda rotation function.","RotationType":"The rotation template to base the rotation function on, one of the following:\\n\\n- `MySQLSingleUser` to use the template [SecretsManagerRDSMySQLRotationSingleUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-mysql-singleuser) .\\n- `MySQLMultiUser` to use the template [SecretsManagerRDSMySQLRotationMultiUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-mysql-multiuser) .\\n- `PostgreSQLSingleUser` to use the template [SecretsManagerRDSPostgreSQLRotationSingleUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-postgre-singleuser)\\n- `PostgreSQLMultiUser` to use the template [SecretsManagerRDSPostgreSQLRotationMultiUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-postgre-multiuser) .\\n- `OracleSingleUser` to use the template [SecretsManagerRDSOracleRotationSingleUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-oracle-singleuser) .\\n- `OracleMultiUser` to use the template [SecretsManagerRDSOracleRotationMultiUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-oracle-multiuser) .\\n- `MariaDBSingleUser` to use the template [SecretsManagerRDSMariaDBRotationSingleUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-mariadb-singleuser) .\\n- `MariaDBMultiUser` to use the template [SecretsManagerRDSMariaDBRotationMultiUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-mariadb-multiuser) .\\n- `SQLServerSingleUser` to use the template [SecretsManagerRDSSQLServerRotationSingleUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-sqlserver-singleuser) .\\n- `SQLServerMultiUser` to use the template [SecretsManagerRDSSQLServerRotationMultiUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-sqlserver-multiuser) .\\n- `RedshiftSingleUser` to use the template [SecretsManagerRedshiftRotationSingleUsr](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-redshift-singleuser) .\\n- `RedshiftMultiUser` to use the template [SecretsManagerRedshiftRotationMultiUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-redshift-multiuser) .\\n- `MongoDBSingleUser` to use the template [SecretsManagerMongoDBRotationSingleUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-mongodb-singleuser) .\\n- `MongoDBMultiUser` to use the template [SecretsManagerMongoDBRotationMultiUser](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_available-rotation-templates.html#sar-template-mongodb-multiuser) .","Runtime":"By default, CloudFormation deploys Python 3.9 binaries for the rotation function. To use a different version of Python, you must do the following two steps:\\n\\n- Deploy the matching version Python binaries with your rotation function.\\n- Set the version number in this field. For example, for Python 3.7, enter *python3.7*\\n\\nIf you only do one of the steps, your rotation function will be incompatible with the binaries. For more information, see [Why did my Lambda rotation function fail with a \\"pg module not found\\" error](https://docs.aws.amazon.com/https://repost.aws/knowledge-center/secrets-manager-lambda-rotation) .","SuperuserSecretArn":"The ARN of the secret that contains superuser credentials, if you use the [Alternating users rotation strategy](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets_strategies.html#rotating-secrets-two-users) . CloudFormation grants the execution role for the Lambda rotation function `GetSecretValue` permission to the secret in this property. For more information, see [Lambda rotation function execution role permissions for Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets-required-permissions-function.html) .\\n\\nYou must create the superuser secret before you can set this property.\\n\\nYou must also include the superuser secret ARN as a key in the JSON of the rotating secret so that the Lambda rotation function can find it. CloudFormation does not hardcode secret ARNs in the Lambda rotation function, so you can use the function to rotate multiple secrets. For more information, see [JSON structure of Secrets Manager secrets](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_secret_json_structure.html) .\\n\\nYou can specify `MasterSecretArn` or `SuperuserSecretArn` but not both. They represent the same superuser secret.","SuperuserSecretKmsKeyArn":"The ARN of the KMS key that Secrets Manager used to encrypt the superuser secret, if you use the [alternating users strategy](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets_strategies.html#rotating-secrets-two-users) and the superuser secret is encrypted with a customer managed key. You don\'t need to specify this property if the superuser secret is encrypted using the key `aws/secretsmanager` . CloudFormation grants the execution role for the Lambda rotation function `Decrypt` , `DescribeKey` , and `GenerateDataKey` permission to the key in this property. For more information, see [Lambda rotation function execution role permissions for Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets-required-permissions-function.html) .\\n\\nYou can specify `MasterSecretKmsKeyArn` or `SuperuserSecretKmsKeyArn` but not both. They represent the same superuser secret KMS key .","VpcSecurityGroupIds":"A comma-separated list of security group IDs applied to the target database.\\n\\nThe template applies the same security groups as on the Lambda rotation function that is created as part of this stack.","VpcSubnetIds":"A comma separated list of VPC subnet IDs of the target database network. The Lambda rotation function is in the same subnet group."}},"AWS::SecretsManager::RotationSchedule.RotationRules":{"attributes":{},"description":"The rotation schedule and window. We recommend you use `ScheduleExpression` to set a cron or rate expression for the schedule and `Duration` to set the length of the rotation window.","properties":{"AutomaticallyAfterDays":"The number of days between automatic scheduled rotations of the secret. You can use this value to check that your secret meets your compliance guidelines for how often secrets must be rotated.\\n\\nIn `DescribeSecret` and `ListSecrets` , this value is calculated from the rotation schedule after every successful rotation. In `RotateSecret` , you can set the rotation schedule in `RotationRules` with `AutomaticallyAfterDays` or `ScheduleExpression` , but not both.","Duration":"The length of the rotation window in hours, for example `3h` for a three hour window. Secrets Manager rotates your secret at any time during this window. The window must not extend into the next rotation window or the next UTC day. The window starts according to the `ScheduleExpression` . If you don\'t specify a `Duration` , for a `ScheduleExpression` in hours, the window automatically closes after one hour. For a `ScheduleExpression` in days, the window automatically closes at the end of the UTC day. For more information, including examples, see [Schedule expressions in Secrets Manager rotation](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_schedule.html) in the *Secrets Manager Users Guide* .","ScheduleExpression":"A `cron()` or `rate()` expression that defines the schedule for rotating your secret. Secrets Manager rotation schedules use UTC time zone. Secrets Manager rotates your secret any time during a rotation window.\\n\\nSecrets Manager `rate()` expressions represent the interval in hours or days that you want to rotate your secret, for example `rate(12 hours)` or `rate(10 days)` . You can rotate a secret as often as every four hours. If you use a `rate()` expression, the rotation window starts at midnight. For a rate in hours, the default rotation window closes after one hour. For a rate in days, the default rotation window closes at the end of the day. You can set the `Duration` to change the rotation window. The rotation window must not extend into the next UTC day or into the next rotation window.\\n\\nYou can use a `cron()` expression to create a rotation schedule that is more detailed than a rotation interval. For more information, including examples, see [Schedule expressions in Secrets Manager rotation](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_schedule.html) in the *Secrets Manager Users Guide* . For a cron expression that represents a schedule in hours, the default rotation window closes after one hour. For a cron expression that represents a schedule in days, the default rotation window closes at the end of the day. You can set the `Duration` to change the rotation window. The rotation window must not extend into the next UTC day or into the next rotation window."}},"AWS::SecretsManager::Secret":{"attributes":{"Id":"The ARN of the secret.","Ref":"When you pass the logical ID of an `AWS::SecretsManager::Secret` resource to the intrinsic `Ref` function, the function returns the ARN of the secret configured such as:\\n\\n`arn:aws:secretsmanager:us-west-2:123456789012:secret:my-path/my-secret-name-1a2b3c`\\n\\nIf you know the ARN of a secret, you can reference a secret you created in one part of the stack template from within the definition of another resource in the same template. You typically use the `Ref` function with the [AWS::SecretsManager::SecretTargetAttachment](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secrettargetattachment.html) resource type to get references to both the secret and its associated database.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Creates a new secret. A *secret* can be a password, a set of credentials such as a user name and password, an OAuth token, or other secret information that you store in an encrypted form in Secrets Manager.\\n\\nFor Amazon RDS master user credentials, see [AWS::RDS::DBCluster MasterUserSecret](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-masterusersecret.html) .\\n\\nTo retrieve a secret in a CloudFormation template, use a *dynamic reference* . For more information, see [Retrieve a secret in an AWS CloudFormation resource](https://docs.aws.amazon.com/secretsmanager/latest/userguide/cfn-example_reference-secret.html) .\\n\\nA common scenario is to first create a secret with `GenerateSecretString` , which generates a password, and then use a dynamic reference to retrieve the username and password from the secret to use as credentials for a new database. See the example *Creating a Redshift cluster and a secret for the admin credentials* .\\n\\nFor information about creating a secret in the console, see [Create a secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) . For information about creating a secret using the CLI or SDK, see [CreateSecret](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_CreateSecret.html) .\\n\\nFor information about retrieving a secret in code, see [Retrieve secrets from Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets.html) .","properties":{"Description":"The description of the secret.","GenerateSecretString":"A structure that specifies how to generate a password to encrypt and store in the secret. To include a specific string in the secret, use `SecretString` instead. If you omit both `GenerateSecretString` and `SecretString` , you create an empty secret. When you make a change to this property, a new secret version is created.\\n\\nWe recommend that you specify the maximum length and include every character type that the system you are generating a password for can support.","KmsKeyId":"The ARN, key ID, or alias of the AWS KMS key that Secrets Manager uses to encrypt the secret value in the secret. An alias is always prefixed by `alias/` , for example `alias/aws/secretsmanager` . For more information, see [About aliases](https://docs.aws.amazon.com/kms/latest/developerguide/alias-about.html) .\\n\\nTo use a AWS KMS key in a different account, use the key ARN or the alias ARN.\\n\\nIf you don\'t specify this value, then Secrets Manager uses the key `aws/secretsmanager` . If that key doesn\'t yet exist, then Secrets Manager creates it for you automatically the first time it encrypts the secret value.\\n\\nIf the secret is in a different AWS account from the credentials calling the API, then you can\'t use `aws/secretsmanager` to encrypt the secret, and you must create and use a customer managed AWS KMS key.","Name":"The name of the new secret.\\n\\nThe secret name can contain ASCII letters, numbers, and the following characters: /_+=.@-\\n\\nDo not end your secret name with a hyphen followed by six characters. If you do so, you risk confusion and unexpected results when searching for a secret by partial ARN. Secrets Manager automatically adds a hyphen and six random characters after the secret name at the end of the ARN.","ReplicaRegions":"A custom type that specifies a `Region` and the `KmsKeyId` for a replica secret.","SecretString":"The text to encrypt and store in the secret. We recommend you use a JSON structure of key/value pairs for your secret value. To generate a random password, use `GenerateSecretString` instead. If you omit both `GenerateSecretString` and `SecretString` , you create an empty secret. When you make a change to this property, a new secret version is created.","Tags":"A list of tags to attach to the secret. Each tag is a key and value pair of strings in a JSON text string, for example:\\n\\n`[{\\"Key\\":\\"CostCenter\\",\\"Value\\":\\"12345\\"},{\\"Key\\":\\"environment\\",\\"Value\\":\\"production\\"}]`\\n\\nSecrets Manager tag key names are case sensitive. A tag with the key \\"ABC\\" is a different tag from one with key \\"abc\\".\\n\\nIf you check tags in permissions policies as part of your security strategy, then adding or removing a tag can change permissions. If the completion of this operation would result in you losing your permissions for this secret, then Secrets Manager blocks the operation and returns an `Access Denied` error. For more information, see [Control access to secrets using tags](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_examples.html#tag-secrets-abac) and [Limit access to identities with tags that match secrets\' tags](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_examples.html#auth-and-access_tags2) .\\n\\nFor information about how to format a JSON parameter for the various command line tool environments, see [Using JSON for Parameters](https://docs.aws.amazon.com/cli/latest/userguide/cli-using-param.html#cli-using-param-json) . If your command-line tool or SDK requires quotation marks around the parameter, you should use single quotes to avoid confusion with the double quotes required in the JSON text.\\n\\nThe following restrictions apply to tags:\\n\\n- Maximum number of tags per secret: 50\\n- Maximum key length: 127 Unicode characters in UTF-8\\n- Maximum value length: 255 Unicode characters in UTF-8\\n- Tag keys and values are case sensitive.\\n- Do not use the `aws:` prefix in your tag names or values because AWS reserves it for AWS use. You can\'t edit or delete tag names or values with this prefix. Tags with this prefix do not count against your tags per secret limit.\\n- If you use your tagging schema across multiple services and resources, other services might have restrictions on allowed characters. Generally allowed characters: letters, spaces, and numbers representable in UTF-8, plus the following special characters: + - = . _ : / @."}},"AWS::SecretsManager::Secret.GenerateSecretString":{"attributes":{},"description":"Generates a random password. We recommend that you specify the maximum length and include every character type that the system you are generating a password for can support.\\n\\n*Required permissions:* `secretsmanager:GetRandomPassword` . For more information, see [IAM policy actions for Secrets Manager](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awssecretsmanager.html#awssecretsmanager-actions-as-permissions) and [Authentication and access control in Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access.html) .","properties":{"ExcludeCharacters":"A string of the characters that you don\'t want in the password.","ExcludeLowercase":"Specifies whether to exclude lowercase letters from the password. If you don\'t include this switch, the password can contain lowercase letters.","ExcludeNumbers":"Specifies whether to exclude numbers from the password. If you don\'t include this switch, the password can contain numbers.","ExcludePunctuation":"Specifies whether to exclude the following punctuation characters from the password: `! \\" # $ % & \' ( ) * + , - . / : ; < = > ? @ [ \\\\ ] ^ _ ` { | } ~` . If you don\'t include this switch, the password can contain punctuation.","ExcludeUppercase":"Specifies whether to exclude uppercase letters from the password. If you don\'t include this switch, the password can contain uppercase letters.","GenerateStringKey":"The JSON key name for the key/value pair, where the value is the generated password. This pair is added to the JSON structure specified by the `SecretStringTemplate` parameter. If you specify this parameter, then you must also specify `SecretStringTemplate` .","IncludeSpace":"Specifies whether to include the space character. If you include this switch, the password can contain space characters.","PasswordLength":"The length of the password. If you don\'t include this parameter, the default length is 32 characters.","RequireEachIncludedType":"Specifies whether to include at least one upper and lowercase letter, one number, and one punctuation. If you don\'t include this switch, the password contains at least one of every character type.","SecretStringTemplate":"A template that the generated string must match. When you make a change to this property, a new secret version is created."}},"AWS::SecretsManager::Secret.ReplicaRegion":{"attributes":{},"description":"Specifies a `Region` and the `KmsKeyId` for a replica secret.","properties":{"KmsKeyId":"The ARN, key ID, or alias of the KMS key to encrypt the secret. If you don\'t include this field, Secrets Manager uses `aws/secretsmanager` .","Region":"(Optional) A string that represents a `Region` , for example \\"us-east-1\\"."}},"AWS::SecretsManager::SecretTargetAttachment":{"attributes":{"Ref":"When you pass the logical ID of an `AWS::SecretsManager::SecretTargetAttachment` resource to the intrinsic `Ref` function, the function returns the ARN of the secret, such as:\\n\\n`arn:aws:secretsmanager:us-west-2:123456789012:secret:my-path/my-secret-name-1a2b3c`\\n\\nYou can use the ARN to reference a secret you created in one part of the stack template from within the definition of another resource from a different part of the same template.\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"The `AWS::SecretsManager::SecretTargetAttachment` resource completes the final link between a Secrets Manager secret and the associated database by adding the database connection information to the secret JSON. If you want to turn on automatic rotation for a database credential secret, the secret must contain the database connection information. For more information, see [JSON structure of Secrets Manager database credential secrets](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_secret_json_structure.html) .\\n\\nFor Amazon RDS master user credentials, see [AWS::RDS::DBCluster MasterUserSecret](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-masterusersecret.html) .","properties":{"SecretId":"The ARN or name of the secret. To reference a secret also created in this template, use the see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) function with the secret\'s logical ID.","TargetId":"The ID of the database or cluster.","TargetType":"A string that defines the type of service or database associated with the secret. This value instructs Secrets Manager how to update the secret with the details of the service or database. This value must be one of the following:\\n\\n- AWS::RDS::DBInstance\\n- AWS::RDS::DBCluster\\n- AWS::Redshift::Cluster\\n- AWS::DocDB::DBInstance\\n- AWS::DocDB::DBCluster"}},"AWS::SecurityHub::AutomationRule":{"attributes":{"CreatedAt":"A timestamp that indicates when the rule was created.\\n\\nUses the `date-time` format specified in [RFC 3339 section 5.6, Internet Date/Time Format](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc3339#section-5.6) . The value cannot contain spaces. For example, `2020-03-22T13:22:13.933Z` .","CreatedBy":"The principal that created the rule. For example, `arn:aws:sts::123456789012:assumed-role/Developer-Role/JaneDoe` .","Ref":"`Ref` returns `RuleArn` . For example, `arn:aws:securityhub:us-east-1:123456789012:automation-rule/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111` .","RuleArn":"The Amazon Resource Name (ARN) of the automation rule that you create. For example, `arn:aws:securityhub:us-east-1:123456789012:automation-rule/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111` .","UpdatedAt":"A timestamp that indicates when the rule was most recently updated.\\n\\nUses the `date-time` format specified in [RFC 3339 section 5.6, Internet Date/Time Format](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc3339#section-5.6) . The value cannot contain spaces. For example, `2020-03-22T13:22:13.933Z` ."},"description":"The `AWS::SecurityHub::AutomationRule` resource specifies an automation rule based on input parameters. For more information, see [Automation rules](https://docs.aws.amazon.com/securityhub/latest/userguide/automation-rules.html) in the *AWS Security Hub User Guide* .","properties":{"Actions":"One or more actions to update finding fields if a finding matches the defined criteria of the rule.","Criteria":"A set of [AWS Security Finding Format](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format.html) finding field attributes and corresponding expected values that Security Hub uses to filter findings. If a rule is enabled and a finding matches the conditions specified in this parameter, Security Hub applies the rule action to the finding.","Description":"A description of the rule.","IsTerminal":"Specifies whether a rule is the last to be applied with respect to a finding that matches the rule criteria. This is useful when a finding matches the criteria for multiple rules, and each rule has different actions. If the value of this field is set to `true` for a rule, Security Hub applies the rule action to a finding that matches the rule criteria and doesn\'t evaluate other rules for the finding. The default value of this field is `false` .","RuleName":"The name of the rule.","RuleOrder":"An integer ranging from 1 to 1000 that represents the order in which the rule action is applied to findings. Security Hub applies rules with lower values for this parameter first.","RuleStatus":"Whether the rule is active after it is created. If this parameter is equal to `ENABLED` , Security Hub applies the rule to findings and finding updates after the rule is created.","Tags":"User-defined tags that help you label the purpose of a rule."}},"AWS::SecurityHub::AutomationRule.AutomationRulesAction":{"attributes":{},"description":"One or more actions to update finding fields if a finding matches the defined criteria of the rule.","properties":{"FindingFieldsUpdate":"Specifies that the automation rule action is an update to a finding field.","Type":"Specifies that the rule action should update the `Types` finding field. The `Types` finding field classifies findings in the format of namespace/category/classifier. For more information, see [Types taxonomy for ASFF](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format-type-taxonomy.html) in the *AWS Security Hub User Guide* ."}},"AWS::SecurityHub::AutomationRule.AutomationRulesFindingFieldsUpdate":{"attributes":{},"description":"Identifies the finding fields that the automation rule action updates when a finding matches the defined criteria.","properties":{"Confidence":"The rule action updates the `Confidence` field of a finding.","Criticality":"The rule action updates the `Criticality` field of a finding.","Note":"The rule action will update the `Note` field of a finding.","RelatedFindings":"The rule action will update the `RelatedFindings` field of a finding.","Severity":"The rule action will update the `Severity` field of a finding.","Types":"The rule action updates the `Types` field of a finding.","UserDefinedFields":"The rule action updates the `UserDefinedFields` field of a finding.","VerificationState":"The rule action updates the `VerificationState` field of a finding.","Workflow":"The rule action will update the `Workflow` field of a finding."}},"AWS::SecurityHub::AutomationRule.AutomationRulesFindingFilters":{"attributes":{},"description":"The criteria that determine which findings a rule applies to.","properties":{"AwsAccountId":"The AWS account ID in which a finding was generated.","CompanyName":"The name of the company for the product that generated the finding. For control-based findings, the company is AWS .","ComplianceAssociatedStandardsId":"The unique identifier of a standard in which a control is enabled. This field consists of the resource portion of the Amazon Resource Name (ARN) returned for a standard in the [DescribeStandards](https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_DescribeStandards.html) API response.","ComplianceSecurityControlId":"The security control ID for which a finding was generated. Security control IDs are the same across standards.","ComplianceStatus":"The result of a security check. This field is only used for findings generated from controls.","Confidence":"The likelihood that a finding accurately identifies the behavior or issue that it was intended to identify. `Confidence` is scored on a 0–100 basis using a ratio scale. A value of `0` means 0 percent confidence, and a value of `100` means 100 percent confidence. For example, a data exfiltration detection based on a statistical deviation of network traffic has low confidence because an actual exfiltration hasn\'t been verified. For more information, see [Confidence](https://docs.aws.amazon.com/securityhub/latest/userguide/asff-top-level-attributes.html#asff-confidence) in the *AWS Security Hub User Guide* .","CreatedAt":"A timestamp that indicates when this finding record was created.\\n\\nUses the `date-time` format specified in [RFC 3339 section 5.6, Internet Date/Time Format](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc3339#section-5.6) . The value cannot contain spaces. For example, `2020-03-22T13:22:13.933Z` .","Criticality":"The level of importance that is assigned to the resources that are associated with a finding. `Criticality` is scored on a 0–100 basis, using a ratio scale that supports only full integers. A score of `0` means that the underlying resources have no criticality, and a score of `100` is reserved for the most critical resources. For more information, see [Criticality](https://docs.aws.amazon.com/securityhub/latest/userguide/asff-top-level-attributes.html#asff-criticality) in the *AWS Security Hub User Guide* .","Description":"A finding\'s description.","FirstObservedAt":"A timestamp that indicates when the potential security issue captured by a finding was first observed by the security findings product.\\n\\nUses the `date-time` format specified in [RFC 3339 section 5.6, Internet Date/Time Format](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc3339#section-5.6) . The value cannot contain spaces. For example, `2020-03-22T13:22:13.933Z` .","GeneratorId":"The identifier for the solution-specific component that generated a finding.","Id":"The product-specific identifier for a finding.","LastObservedAt":"A timestamp that indicates when the potential security issue captured by a finding was most recently observed by the security findings product.\\n\\nUses the `date-time` format specified in [RFC 3339 section 5.6, Internet Date/Time Format](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc3339#section-5.6) . The value cannot contain spaces. For example, `2020-03-22T13:22:13.933Z` .","NoteText":"The text of a user-defined note that\'s added to a finding.","NoteUpdatedAt":"The timestamp of when the note was updated. Uses the date-time format specified in [RFC 3339 section 5.6, Internet Date/Time Format](https://docs.aws.amazon.com/https://www.rfc-editor.org/rfc/rfc3339#section-5.6) . The value cannot contain spaces. For example, `2020-03-22T13:22:13.933Z` .","NoteUpdatedBy":"The principal that created a note.","ProductArn":"The Amazon Resource Name (ARN) for a third-party product that generated a finding in Security Hub.","ProductName":"Provides the name of the product that generated the finding. For control-based findings, the product name is Security Hub.","RecordState":"Provides the current state of a finding.","RelatedFindingsId":"The product-generated identifier for a related finding.","RelatedFindingsProductArn":"The ARN for the product that generated a related finding.","ResourceDetailsOther":"Custom fields and values about the resource that a finding pertains to.","ResourceId":"The identifier for the given resource type. For AWS resources that are identified by Amazon Resource Names (ARNs), this is the ARN. For AWS resources that lack ARNs, this is the identifier as defined by the AWS service that created the resource. For non- AWS resources, this is a unique identifier that is associated with the resource.","ResourcePartition":"The partition in which the resource that the finding pertains to is located. A partition is a group of AWS Regions . Each AWS account is scoped to one partition.","ResourceRegion":"The AWS Region where the resource that a finding pertains to is located.","ResourceTags":"A list of AWS tags associated with a resource at the time the finding was processed.","ResourceType":"A finding\'s title.","SeverityLabel":"The severity value of the finding.","SourceUrl":"Provides a URL that links to a page about the current finding in the finding product.","Title":"A finding\'s title.","Type":"One or more finding types in the format of namespace/category/classifier that classify a finding. For a list of namespaces, classifiers, and categories, see [Types taxonomy for ASFF](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format-type-taxonomy.html) in the *AWS Security Hub User Guide* .","UpdatedAt":"A timestamp that indicates when the finding record was most recently updated.\\n\\nUses the `date-time` format specified in [RFC 3339 section 5.6, Internet Date/Time Format](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc3339#section-5.6) . The value cannot contain spaces. For example, `2020-03-22T13:22:13.933Z` .","UserDefinedFields":"A list of user-defined name and value string pairs added to a finding.","VerificationState":"Provides the veracity of a finding.","WorkflowStatus":"Provides information about the status of the investigation into a finding."}},"AWS::SecurityHub::AutomationRule.DateFilter":{"attributes":{},"description":"A date filter for querying findings.","properties":{"DateRange":"A date range for the date filter.","End":"A timestamp that provides the end date for the date filter.\\n\\nA correctly formatted example is `2020-05-21T20:16:34.724Z` . The value cannot contain spaces, and date and time should be separated by `T` . For more information, see [RFC 3339 section 5.6, Internet Date/Time Format](https://docs.aws.amazon.com/https://www.rfc-editor.org/rfc/rfc3339#section-5.6) .","Start":"A timestamp that provides the start date for the date filter.\\n\\nA correctly formatted example is `2020-05-21T20:16:34.724Z` . The value cannot contain spaces, and date and time should be separated by `T` . For more information, see [RFC 3339 section 5.6, Internet Date/Time Format](https://docs.aws.amazon.com/https://www.rfc-editor.org/rfc/rfc3339#section-5.6) ."}},"AWS::SecurityHub::AutomationRule.DateRange":{"attributes":{},"description":"A date range for the date filter.","properties":{"Unit":"A date range unit for the date filter.","Value":"A date range value for the date filter."}},"AWS::SecurityHub::AutomationRule.MapFilter":{"attributes":{},"description":"A map filter for querying findings. Each map filter provides the field to check, the value to look for, and the comparison operator.","properties":{"Comparison":"The condition to apply to the key value when querying for findings with a map filter.\\n\\nTo search for values that exactly match the filter value, use `EQUALS` . For example, for the `ResourceTags` field, the filter `Department EQUALS Security` matches findings that have the value `Security` for the tag `Department` .\\n\\nTo search for values other than the filter value, use `NOT_EQUALS` . For example, for the `ResourceTags` field, the filter `Department NOT_EQUALS Finance` matches findings that do not have the value `Finance` for the tag `Department` .\\n\\n`EQUALS` filters on the same field are joined by `OR` . A finding matches if it matches any one of those filters.\\n\\n`NOT_EQUALS` filters on the same field are joined by `AND` . A finding matches only if it matches all of those filters.\\n\\nYou cannot have both an `EQUALS` filter and a `NOT_EQUALS` filter on the same field.","Key":"The key of the map filter. For example, for `ResourceTags` , `Key` identifies the name of the tag. For `UserDefinedFields` , `Key` is the name of the field.","Value":"The value for the key in the map filter. Filter values are case sensitive. For example, one of the values for a tag called `Department` might be `Security` . If you provide `security` as the filter value, then there is no match."}},"AWS::SecurityHub::AutomationRule.NoteUpdate":{"attributes":{},"description":"The updated note.","properties":{"Text":"The updated note text.","UpdatedBy":"The principal that updated the note."}},"AWS::SecurityHub::AutomationRule.NumberFilter":{"attributes":{},"description":"A number filter for querying findings.","properties":{"Eq":"The equal-to condition to be applied to a single field when querying for findings.","Gte":"The greater-than-equal condition to be applied to a single field when querying for findings.","Lte":"The less-than-equal condition to be applied to a single field when querying for findings."}},"AWS::SecurityHub::AutomationRule.RelatedFinding":{"attributes":{},"description":"Provides details about a list of findings that the current finding relates to.","properties":{"Id":"The product-generated identifier for a related finding.","ProductArn":"The Amazon Resource Name (ARN) for the product that generated a related finding."}},"AWS::SecurityHub::AutomationRule.SeverityUpdate":{"attributes":{},"description":"Updates to the severity information for a finding.","properties":{"Label":"The severity value of the finding. The allowed values are the following.\\n\\n- `INFORMATIONAL` - No issue was found.\\n- `LOW` - The issue does not require action on its own.\\n- `MEDIUM` - The issue must be addressed but not urgently.\\n- `HIGH` - The issue must be addressed as a priority.\\n- `CRITICAL` - The issue must be remediated immediately to avoid it escalating.","Normalized":"The normalized severity for the finding. This attribute is to be deprecated in favor of `Label` .\\n\\nIf you provide `Normalized` and do not provide `Label` , `Label` is set automatically as follows.\\n\\n- 0 - `INFORMATIONAL`\\n- 1–39 - `LOW`\\n- 40–69 - `MEDIUM`\\n- 70–89 - `HIGH`\\n- 90–100 - `CRITICAL`","Product":"The native severity as defined by the AWS service or integrated partner product that generated the finding."}},"AWS::SecurityHub::AutomationRule.StringFilter":{"attributes":{},"description":"A string filter for querying findings.","properties":{"Comparison":"The condition to apply to a string value when querying for findings. To search for values that contain the filter criteria value, use one of the following comparison operators:\\n\\n- To search for values that exactly match the filter value, use `EQUALS` .\\n\\nFor example, the filter `ResourceType EQUALS AwsEc2SecurityGroup` only matches findings that have a resource type of `AwsEc2SecurityGroup` .\\n- To search for values that start with the filter value, use `PREFIX` .\\n\\nFor example, the filter `ResourceType PREFIX AwsIam` matches findings that have a resource type that starts with `AwsIam` . Findings with a resource type of `AwsIamPolicy` , `AwsIamRole` , or `AwsIamUser` would all match.\\n\\n`EQUALS` and `PREFIX` filters on the same field are joined by `OR` . A finding matches if it matches any one of those filters.\\n\\nTo search for values that do not contain the filter criteria value, use one of the following comparison operators:\\n\\n- To search for values that do not exactly match the filter value, use `NOT_EQUALS` .\\n\\nFor example, the filter `ResourceType NOT_EQUALS AwsIamPolicy` matches findings that have a resource type other than `AwsIamPolicy` .\\n- To search for values that do not start with the filter value, use `PREFIX_NOT_EQUALS` .\\n\\nFor example, the filter `ResourceType PREFIX_NOT_EQUALS AwsIam` matches findings that have a resource type that does not start with `AwsIam` . Findings with a resource type of `AwsIamPolicy` , `AwsIamRole` , or `AwsIamUser` would all be excluded from the results.\\n\\n`NOT_EQUALS` and `PREFIX_NOT_EQUALS` filters on the same field are joined by `AND` . A finding matches only if it matches all of those filters.\\n\\nFor filters on the same field, you cannot provide both an `EQUALS` filter and a `NOT_EQUALS` or `PREFIX_NOT_EQUALS` filter. Combining filters in this way always returns an error, even if the provided filter values would return valid results.\\n\\nYou can combine `PREFIX` filters with `NOT_EQUALS` or `PREFIX_NOT_EQUALS` filters for the same field. Security Hub first processes the `PREFIX` filters, then the `NOT_EQUALS` or `PREFIX_NOT_EQUALS` filters.\\n\\nFor example, for the following filter, Security Hub first identifies findings that have resource types that start with either `AwsIAM` or `AwsEc2` . It then excludes findings that have a resource type of `AwsIamPolicy` and findings that have a resource type of `AwsEc2NetworkInterface` .\\n\\n- `ResourceType PREFIX AwsIam`\\n- `ResourceType PREFIX AwsEc2`\\n- `ResourceType NOT_EQUALS AwsIamPolicy`\\n- `ResourceType NOT_EQUALS AwsEc2NetworkInterface`","Value":"The string filter value. Filter values are case sensitive. For example, the product name for control-based findings is `Security Hub` . If you provide `security hub` as the filter text, then there is no match."}},"AWS::SecurityHub::AutomationRule.WorkflowUpdate":{"attributes":{},"description":"Used to update information about the investigation into the finding.","properties":{"Status":"The status of the investigation into the finding. The workflow status is specific to an individual finding. It does not affect the generation of new findings. For example, setting the workflow status to `SUPPRESSED` or `RESOLVED` does not prevent a new finding for the same issue.\\n\\nThe allowed values are the following.\\n\\n- `NEW` - The initial state of a finding, before it is reviewed.\\n\\nSecurity Hub also resets `WorkFlowStatus` from `NOTIFIED` or `RESOLVED` to `NEW` in the following cases:\\n\\n- The record state changes from `ARCHIVED` to `ACTIVE` .\\n- The compliance status changes from `PASSED` to either `WARNING` , `FAILED` , or `NOT_AVAILABLE` .\\n- `NOTIFIED` - Indicates that you notified the resource owner about the security issue. Used when the initial reviewer is not the resource owner, and needs intervention from the resource owner.\\n- `RESOLVED` - The finding was reviewed and remediated and is now considered resolved.\\n- `SUPPRESSED` - Indicates that you reviewed the finding and do not believe that any action is needed. The finding is no longer updated."}},"AWS::SecurityHub::Hub":{"attributes":{"Ref":"`Ref` returns the `HubArn` for the hub resource created, such as `arn:aws:securityhub:us-east-1:123456789012:hub/default` ."},"description":"The `AWS::SecurityHub::Hub` resource specifies the enablement of the AWS Security Hub service in your AWS account . The service is enabled in the current AWS Region or the specified Region. You create a separate `Hub` resource in each Region in which you want to enable Security Hub .\\n\\nWhen you use this resource to enable Security Hub , default security standards are enabled. To disable default standards, set the `EnableDefaultStandards` property to `false` . You can use the [`AWS::SecurityHub::Standard`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-standard.html) resource to enable additional standards.\\n\\nWhen you use this resource to enable Security Hub , new controls are automatically enabled for your enabled standards. To disable automatic enablement of new controls, set the `AutoEnableControls` property to `false` .\\n\\nYou must create an `AWS::SecurityHub::Hub` resource for an account before you can create other types of Security Hub resources for the account through AWS CloudFormation . Use a [DependsOn attribute](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html) , such as `\\"DependsOn\\": \\"Hub\\"` , to ensure that you\'ve created an `AWS::SecurityHub::Hub` resource before creating other Security Hub resources for an account.","properties":{"AutoEnableControls":"Whether to automatically enable new controls when they are added to standards that are enabled.\\n\\nBy default, this is set to `true` , and new controls are enabled automatically. To not automatically enable new controls, set this to `false` .","ControlFindingGenerator":"Specifies whether an account has consolidated control findings turned on or off. If the value for this field is set to `SECURITY_CONTROL` , Security Hub generates a single finding for a control check even when the check applies to multiple enabled standards.\\n\\nIf the value for this field is set to `STANDARD_CONTROL` , Security Hub generates separate findings for a control check when the check applies to multiple enabled standards.\\n\\nThe value for this field in a member account matches the value in the administrator account. For accounts that aren\'t part of an organization, the default value of this field is `SECURITY_CONTROL` if you enabled Security Hub on or after February 23, 2023.","EnableDefaultStandards":"Whether to enable the security standards that Security Hub has designated as automatically enabled. If you don\'t provide a value for `EnableDefaultStandards` , it is set to `true` , and the designated standards are automatically enabled in each AWS Region where you enable Security Hub . If you don\'t want to enable the designated standards, set `EnableDefaultStandards` to `false` .\\n\\nCurrently, the automatically enabled standards are the Center for Internet Security (CIS) AWS Foundations Benchmark v1.2.0 and AWS Foundational Security Best Practices (FSBP).","Tags":"An array of key-value pairs to apply to this resource.\\n\\nFor more information, see [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html) ."}},"AWS::SecurityHub::Standard":{"attributes":{"Ref":"`Ref` returns `StandardsSubscriptionArn` for the standard that you enable, such as `arn:aws:securityhub:us-east-1:123456789012:subscription/aws-foundational-security-best-practices/v/1.0.0` .","StandardsSubscriptionArn":"The ARN of a resource that represents your subscription to a supported standard."},"description":"The `AWS::SecurityHub::Standard` resource specifies the enablement of a security standard. The standard is identified by the `StandardsArn` property. To view a list of Security Hub standards and their Amazon Resource Names (ARNs), use the [`DescribeStandards`](https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_DescribeStandards.html) API operation.\\n\\nYou must create a separate `AWS::SecurityHub::Standard` resource for each standard that you want to enable.\\n\\nFor more information about Security Hub standards, see [Security Hub standards reference](https://docs.aws.amazon.com/securityhub/latest/userguide/standards-reference.html) in the *AWS Security Hub User Guide* .","properties":{"DisabledStandardsControls":"Specifies which controls are to be disabled in a standard.","StandardsArn":"The ARN of the standard that you want to enable. To view a list of available Security Hub standards and their ARNs, use the [`DescribeStandards`](https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_DescribeStandards.html) API operation."}},"AWS::SecurityHub::Standard.StandardsControl":{"attributes":{},"description":"Provides details about an individual security control. For a list of Security Hub controls, see [Security Hub controls reference](https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-controls-reference.html) in the *AWS Security Hub User Guide* .","properties":{"Reason":"A user-defined reason for changing a control\'s enablement status in a specified standard. If you are disabling a control, then this property is required.","StandardsControlArn":"The Amazon Resource Name (ARN) of the control."}},"AWS::ServiceCatalog::AcceptedPortfolioShare":{"attributes":{"Ref":"`Ref` returns a unique identifier."},"description":"Accepts an offer to share the specified portfolio.","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","PortfolioId":"The portfolio identifier."}},"AWS::ServiceCatalog::CloudFormationProduct":{"attributes":{"ProductName":"The name of the product.","ProvisioningArtifactIds":"The IDs of the provisioning artifacts.","ProvisioningArtifactNames":"The names of the provisioning artifacts.","Ref":"`Ref` returns the ID of the provisioning artifact, such as `pa-3mc34fbybfmgp` ."},"description":"Specifies a product.","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","Description":"The description of the product.","Distributor":"The distributor of the product.","Name":"The name of the product.","Owner":"The owner of the product.","ProductType":"The type of product.","ProvisioningArtifactParameters":"The configuration of the provisioning artifact (also known as a version).","ReplaceProvisioningArtifacts":"This property is turned off by default. If turned off, you can update provisioning artifacts or product attributes (such as description, distributor, name, owner, and more) and the associated provisioning artifacts will retain the same unique identifier. Provisioning artifacts are matched within the CloudFormationProduct resource, and only those that have been updated will be changed. Provisioning artifacts are matched by a combinaton of provisioning artifact template URL and name.\\n\\nIf turned on, provisioning artifacts will be given a new unique identifier when you update the product or provisioning artifacts.","SourceConnection":"A top level `ProductViewDetail` response containing details about the product’s connection. AWS Service Catalog returns this field for the `CreateProduct` , `UpdateProduct` , `DescribeProductAsAdmin` , and `SearchProductAsAdmin` APIs. This response contains the same fields as the `ConnectionParameters` request, with the addition of the `LastSync` response.","SupportDescription":"The support information about the product.","SupportEmail":"The contact email for product support.","SupportUrl":"The contact URL for product support.\\n\\n`^https?:\\\\/\\\\//` / is the pattern used to validate SupportUrl.","Tags":"One or more tags."}},"AWS::ServiceCatalog::CloudFormationProduct.CodeStarParameters":{"attributes":{},"description":"The subtype containing details about the Codestar connection `Type` .","properties":{"ArtifactPath":"The absolute path wehre the artifact resides within the repo and branch, formatted as \\"folder/file.json.\\"","Branch":"The specific branch where the artifact resides.","ConnectionArn":"The CodeStar ARN, which is the connection between AWS Service Catalog and the external repository.","Repository":"The specific repository where the product’s artifact-to-be-synced resides, formatted as \\"Account/Repo.\\""}},"AWS::ServiceCatalog::CloudFormationProduct.ConnectionParameters":{"attributes":{},"description":"Provides connection details.","properties":{"CodeStar":"Provides `ConnectionType` details."}},"AWS::ServiceCatalog::CloudFormationProduct.ProvisioningArtifactProperties":{"attributes":{},"description":"Information about a provisioning artifact (also known as a version) for a product.","properties":{"Description":"The description of the provisioning artifact, including how it differs from the previous provisioning artifact.","DisableTemplateValidation":"If set to true, AWS Service Catalog stops validating the specified provisioning artifact even if it is invalid.","Info":"Specify the template source with one of the following options, but not both. Keys accepted: [ `LoadTemplateFromURL` , `ImportFromPhysicalId` ]\\n\\nThe URL of the AWS CloudFormation template in Amazon S3 in JSON format. Specify the URL in JSON format as follows:\\n\\n`\\"LoadTemplateFromURL\\": \\"https://s3.amazonaws.com/cf-templates-ozkq9d3hgiq2-us-east-1/...\\"`\\n\\n`ImportFromPhysicalId` : The physical id of the resource that contains the template. Currently only supports AWS CloudFormation stack arn. Specify the physical id in JSON format as follows: `ImportFromPhysicalId: “arn:aws:cloudformation:[us-east-1]:[accountId]:stack/[StackName]/[resourceId]`","Name":"The name of the provisioning artifact (for example, v1 v2beta). No spaces are allowed.","Type":"The type of provisioning artifact.\\n\\n- `CLOUD_FORMATION_TEMPLATE` - AWS CloudFormation template\\n- `MARKETPLACE_AMI` - AWS Marketplace AMI\\n- `MARKETPLACE_CAR` - AWS Marketplace Clusters and AWS Resources\\n- `TERRAFORM_OPEN_SOURCE` - Terraform open source configuration file"}},"AWS::ServiceCatalog::CloudFormationProduct.SourceConnection":{"attributes":{},"description":"A top level `ProductViewDetail` response containing details about the product’s connection. AWS Service Catalog returns this field for the `CreateProduct` , `UpdateProduct` , `DescribeProductAsAdmin` , and `SearchProductAsAdmin` APIs. This response contains the same fields as the `ConnectionParameters` request, with the addition of the `LastSync` response.","properties":{"ConnectionParameters":"The connection details based on the connection `Type` .","Type":"The only supported `SourceConnection` type is Codestar."}},"AWS::ServiceCatalog::CloudFormationProvisionedProduct":{"attributes":{"CloudformationStackArn":"The Amazon Resource Name (ARN) of the CloudFormation stack, such as `arn:aws:cloudformation:eu-west-1:123456789012:stack/SC-499278721343-pp-hfyszaotincww/8f3df460-346a-11e8-9444-503abe701c29` .","Outputs":"The output of the product you are provisioning. For example, the DNS of an EC2 instance.","ProvisionedProductId":"The ID of the provisioned product.","RecordId":"The ID of the record, such as `rec-rjeatvy434trk` .","Ref":"`Ref` returns the provisioned product ID, such as `pp-hfyszaotincww` ."},"description":"Provisions the specified product.\\n\\nA provisioned product is a resourced instance of a product. For example, provisioning a product based on a AWS CloudFormation template launches a AWS CloudFormation stack and its underlying resources. You can check the status of this request using [DescribeRecord](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_DescribeRecord.html) .\\n\\nIf the request contains a tag key with an empty list of values, there is a tag conflict for that key. Do not include conflicted keys as tags, or this causes the error \\"Parameter validation failed: Missing required parameter in Tags[ *N* ]: *Value* \\".","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","NotificationArns":"Passed to AWS CloudFormation . The SNS topic ARNs to which to publish stack-related events.","PathId":"The path identifier of the product. This value is optional if the product has a default path, and required if the product has more than one path. To list the paths for a product, use [ListLaunchPaths](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_ListLaunchPaths.html) .\\n\\n> You must provide the name or ID, but not both.","PathName":"The name of the path. This value is optional if the product has a default path, and required if the product has more than one path. To list the paths for a product, use [ListLaunchPaths](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_ListLaunchPaths.html) .\\n\\n> You must provide the name or ID, but not both.","ProductId":"The product identifier.\\n\\n> You must specify either the ID or the name of the product, but not both.","ProductName":"The name of the Service Catalog product.\\n\\nEach time a stack is created or updated, if `ProductName` is provided it will successfully resolve to `ProductId` as long as only one product exists in the account or Region with that `ProductName` .\\n\\n> You must specify either the name or the ID of the product, but not both.","ProvisionedProductName":"A user-friendly name for the provisioned product. This value must be unique for the AWS account and cannot be updated after the product is provisioned.","ProvisioningArtifactId":"The identifier of the provisioning artifact (also known as a version).\\n\\n> You must specify either the ID or the name of the provisioning artifact, but not both.","ProvisioningArtifactName":"The name of the provisioning artifact (also known as a version) for the product. This name must be unique for the product.\\n\\n> You must specify either the name or the ID of the provisioning artifact, but not both. You must also specify either the name or the ID of the product, but not both.","ProvisioningParameters":"Parameters specified by the administrator that are required for provisioning the product.","ProvisioningPreferences":"StackSet preferences that are required for provisioning the product or updating a provisioned product.","Tags":"One or more tags.\\n\\n> Requires the provisioned product to have an [ResourceUpdateConstraint](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-resourceupdateconstraint.html) resource with `TagUpdatesOnProvisionedProduct` set to `ALLOWED` to allow tag updates. If `RESOURCE_UPDATE` constraint is not present, tags updates are ignored."}},"AWS::ServiceCatalog::CloudFormationProvisionedProduct.ProvisioningParameter":{"attributes":{},"description":"Information about a parameter used to provision a product.","properties":{"Key":"The parameter key.","Value":"The parameter value."}},"AWS::ServiceCatalog::CloudFormationProvisionedProduct.ProvisioningPreferences":{"attributes":{},"description":"The user-defined preferences that will be applied when updating a provisioned product. Not all preferences are applicable to all provisioned product type\\n\\nOne or more AWS accounts that will have access to the provisioned product.\\n\\nApplicable only to a `CFN_STACKSET` provisioned product type.\\n\\nThe AWS accounts specified should be within the list of accounts in the `STACKSET` constraint. To get the list of accounts in the `STACKSET` constraint, use the `DescribeProvisioningParameters` operation.\\n\\nIf no values are specified, the default value is all accounts from the `STACKSET` constraint.","properties":{"StackSetAccounts":"One or more AWS accounts where the provisioned product will be available.\\n\\nApplicable only to a `CFN_STACKSET` provisioned product type.\\n\\nThe specified accounts should be within the list of accounts from the `STACKSET` constraint. To get the list of accounts in the `STACKSET` constraint, use the `DescribeProvisioningParameters` operation.\\n\\nIf no values are specified, the default value is all acounts from the `STACKSET` constraint.","StackSetFailureToleranceCount":"The number of accounts, per Region, for which this operation can fail before AWS Service Catalog stops the operation in that Region. If the operation is stopped in a Region, AWS Service Catalog doesn\'t attempt the operation in any subsequent Regions.\\n\\nApplicable only to a `CFN_STACKSET` provisioned product type.\\n\\nConditional: You must specify either `StackSetFailureToleranceCount` or `StackSetFailureTolerancePercentage` , but not both.\\n\\nThe default value is `0` if no value is specified.","StackSetFailureTolerancePercentage":"The percentage of accounts, per Region, for which this stack operation can fail before AWS Service Catalog stops the operation in that Region. If the operation is stopped in a Region, AWS Service Catalog doesn\'t attempt the operation in any subsequent Regions.\\n\\nWhen calculating the number of accounts based on the specified percentage, AWS Service Catalog rounds down to the next whole number.\\n\\nApplicable only to a `CFN_STACKSET` provisioned product type.\\n\\nConditional: You must specify either `StackSetFailureToleranceCount` or `StackSetFailureTolerancePercentage` , but not both.","StackSetMaxConcurrencyCount":"The maximum number of accounts in which to perform this operation at one time. This is dependent on the value of `StackSetFailureToleranceCount` . `StackSetMaxConcurrentCount` is at most one more than the `StackSetFailureToleranceCount` .\\n\\nNote that this setting lets you specify the maximum for operations. For large deployments, under certain circumstances the actual number of accounts acted upon concurrently may be lower due to service throttling.\\n\\nApplicable only to a `CFN_STACKSET` provisioned product type.\\n\\nConditional: You must specify either `StackSetMaxConcurrentCount` or `StackSetMaxConcurrentPercentage` , but not both.","StackSetMaxConcurrencyPercentage":"The maximum percentage of accounts in which to perform this operation at one time.\\n\\nWhen calculating the number of accounts based on the specified percentage, AWS Service Catalog rounds down to the next whole number. This is true except in cases where rounding down would result is zero. In this case, AWS Service Catalog sets the number as `1` instead.\\n\\nNote that this setting lets you specify the maximum for operations. For large deployments, under certain circumstances the actual number of accounts acted upon concurrently may be lower due to service throttling.\\n\\nApplicable only to a `CFN_STACKSET` provisioned product type.\\n\\nConditional: You must specify either `StackSetMaxConcurrentCount` or `StackSetMaxConcurrentPercentage` , but not both.","StackSetOperationType":"Determines what action AWS Service Catalog performs to a stack set or a stack instance represented by the provisioned product. The default value is `UPDATE` if nothing is specified.\\n\\nApplicable only to a `CFN_STACKSET` provisioned product type.\\n\\n- **CREATE** - Creates a new stack instance in the stack set represented by the provisioned product. In this case, only new stack instances are created based on accounts and Regions; if new ProductId or ProvisioningArtifactID are passed, they will be ignored.\\n- **UPDATE** - Updates the stack set represented by the provisioned product and also its stack instances.\\n- **DELETE** - Deletes a stack instance in the stack set represented by the provisioned product.","StackSetRegions":"One or more AWS Regions where the provisioned product will be available.\\n\\nApplicable only to a `CFN_STACKSET` provisioned product type.\\n\\nThe specified Regions should be within the list of Regions from the `STACKSET` constraint. To get the list of Regions in the `STACKSET` constraint, use the `DescribeProvisioningParameters` operation.\\n\\nIf no values are specified, the default value is all Regions from the `STACKSET` constraint."}},"AWS::ServiceCatalog::LaunchNotificationConstraint":{"attributes":{"Ref":"`Ref` returns the identifier of the constraint."},"description":"Specifies a notification constraint.","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","Description":"The description of the constraint.","NotificationArns":"The notification ARNs.","PortfolioId":"The portfolio identifier.","ProductId":"The product identifier."}},"AWS::ServiceCatalog::LaunchRoleConstraint":{"attributes":{"Ref":"`Ref` returns identifier of the constraint."},"description":"Specifies a launch constraint.","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","Description":"The description of the constraint.","LocalRoleName":"You are required to specify either the `RoleArn` or the `LocalRoleName` but can\'t use both.\\n\\nIf you specify the `LocalRoleName` property, when an account uses the launch constraint, the IAM role with that name in the account will be used. This allows launch-role constraints to be account-agnostic so the administrator can create fewer resources per shared account.\\n\\nThe given role name must exist in the account used to create the launch constraint and the account of the user who launches a product with this launch constraint.","PortfolioId":"The portfolio identifier.","ProductId":"The product identifier.","RoleArn":"The ARN of the launch role.\\n\\nYou are required to specify `RoleArn` or `LocalRoleName` but can\'t use both."}},"AWS::ServiceCatalog::LaunchTemplateConstraint":{"attributes":{"Ref":"`Ref` returns the identifier of the constraint."},"description":"Specifies a template constraint.","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","Description":"The description of the constraint.","PortfolioId":"The portfolio identifier.","ProductId":"The product identifier.","Rules":"The constraint rules."}},"AWS::ServiceCatalog::Portfolio":{"attributes":{"PortfolioName":"The name of the portfolio.","Ref":"`Ref` returns the portfolio identifier."},"description":"Specifies a portfolio.","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","Description":"The description of the portfolio.","DisplayName":"The name to use for display purposes.","ProviderName":"The name of the portfolio provider.","Tags":"One or more tags."}},"AWS::ServiceCatalog::PortfolioPrincipalAssociation":{"attributes":{"Ref":"`Ref` returns a unique identifier for the association."},"description":"Associates the specified principal ARN with the specified portfolio.","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","PortfolioId":"The portfolio identifier.","PrincipalARN":"The ARN of the principal ( IAM user, role, or group).","PrincipalType":"The principal type. The supported value is `IAM` .\\n\\n*Allowed Values* : `IAM`"}},"AWS::ServiceCatalog::PortfolioProductAssociation":{"attributes":{"Ref":"`Ref` returns a unique identifier for the association."},"description":"Associates the specified product with the specified portfolio.\\n\\nA delegated admin is authorized to invoke this command.","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","PortfolioId":"The portfolio identifier.","ProductId":"The product identifier.","SourcePortfolioId":"The identifier of the source portfolio."}},"AWS::ServiceCatalog::PortfolioShare":{"attributes":{"Ref":"`Ref` returns the identifier of the portfolio share."},"description":"Shares the specified portfolio with the specified account.","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","AccountId":"The AWS account ID. For example, `123456789012` .","PortfolioId":"The portfolio identifier.","ShareTagOptions":"Indicates whether TagOptions sharing is enabled or disabled for the portfolio share."}},"AWS::ServiceCatalog::ResourceUpdateConstraint":{"attributes":{"Ref":"`Ref` returns the identifier of the constraint."},"description":"Specifies a `RESOURCE_UPDATE` constraint.","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","Description":"The description of the constraint.","PortfolioId":"The portfolio identifier.","ProductId":"The product identifier.","TagUpdateOnProvisionedProduct":"If set to `ALLOWED` , lets users change tags in a [CloudFormationProvisionedProduct](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html) resource.\\n\\nIf set to `NOT_ALLOWED` , prevents users from changing tags in a [CloudFormationProvisionedProduct](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html) resource."}},"AWS::ServiceCatalog::ServiceAction":{"attributes":{"Id":"The self-service action identifier. For example, `act-fs7abcd89wxyz` .","Ref":""},"description":"Creates a self-service action.","properties":{"AcceptLanguage":"The language code.\\n\\n- `en` - English (default)\\n- `jp` - Japanese\\n- `zh` - Chinese","Definition":"A map that defines the self-service action.","DefinitionType":"The self-service action definition type. For example, `SSM_AUTOMATION` .","Description":"The self-service action description.","Name":"The self-service action name."}},"AWS::ServiceCatalog::ServiceAction.DefinitionParameter":{"attributes":{},"description":"The list of parameters in JSON format. For example: `[{\\\\\\"Name\\\\\\":\\\\\\"InstanceId\\\\\\",\\\\\\"Type\\\\\\":\\\\\\"TARGET\\\\\\"}] or [{\\\\\\"Name\\\\\\":\\\\\\"InstanceId\\\\\\",\\\\\\"Type\\\\\\":\\\\\\"TEXT_VALUE\\\\\\"}]` .","properties":{"Key":"The parameter key.","Value":"The value of the parameter."}},"AWS::ServiceCatalog::ServiceActionAssociation":{"attributes":{"Ref":""},"description":"A self-service action association consisting of the Action ID, the Product ID, and the Provisioning Artifact ID.","properties":{"ProductId":"The product identifier. For example, `prod-abcdzk7xy33qa` .","ProvisioningArtifactId":"The identifier of the provisioning artifact. For example, `pa-4abcdjnxjj6ne` .","ServiceActionId":"The self-service action identifier. For example, `act-fs7abcd89wxyz` ."}},"AWS::ServiceCatalog::StackSetConstraint":{"attributes":{"Ref":"`Ref` returns the identifier of the constraint."},"description":"Specifies a StackSet constraint.","properties":{"AcceptLanguage":"The language code.\\n\\n- `jp` - Japanese\\n- `zh` - Chinese","AccountList":"One or more AWS accounts that will have access to the provisioned product.","AdminRole":"AdminRole ARN","Description":"The description of the constraint.","ExecutionRole":"ExecutionRole name","PortfolioId":"The portfolio identifier.","ProductId":"The product identifier.","RegionList":"One or more AWS Regions where the provisioned product will be available.\\n\\nApplicable only to a `CFN_STACKSET` provisioned product type.\\n\\nThe specified Regions should be within the list of Regions from the `STACKSET` constraint. To get the list of Regions in the `STACKSET` constraint, use the `DescribeProvisioningParameters` operation.\\n\\nIf no values are specified, the default value is all Regions from the `STACKSET` constraint.","StackInstanceControl":"Permission to create, update, and delete stack instances. Choose from ALLOWED and NOT_ALLOWED."}},"AWS::ServiceCatalog::TagOption":{"attributes":{"Ref":"`Ref` returns the TagOption identifier."},"description":"Specifies a TagOption. A TagOption is a key-value pair managed by AWS Service Catalog that serves as a template for creating an AWS tag.","properties":{"Active":"The TagOption active state.","Key":"The TagOption key.","Value":"The TagOption value."}},"AWS::ServiceCatalog::TagOptionAssociation":{"attributes":{"Ref":"`Ref` returns an identifier for the association."},"description":"Associate the specified TagOption with the specified portfolio or product.","properties":{"ResourceId":"The resource identifier.","TagOptionId":"The TagOption identifier."}},"AWS::ServiceCatalogAppRegistry::Application":{"attributes":{"Arn":"The Amazon resource name (ARN) that specifies the application across services.","Id":"The identifier of the application.","Ref":"`Ref` returns the Id."},"description":"Represents a AWS Service Catalog AppRegistry application that is the top-level node in a hierarchy of related cloud resource abstractions.","properties":{"Description":"The description of the application.","Name":"The name of the application. The name must be unique in the region in which you are creating the application.","Tags":"Key-value pairs you can use to associate with the application."}},"AWS::ServiceCatalogAppRegistry::AttributeGroup":{"attributes":{"Arn":"The Amazon resource name (ARN) that specifies the attribute group across services.","Id":"The globally unique attribute group identifier of the attribute group.","Ref":"`Ref` returns the id."},"description":"Creates a new attribute group as a container for user-defined attributes. This feature enables users to have full control over their cloud application\'s metadata in a rich machine-readable format to facilitate integration with automated workflows and third-party tools.","properties":{"Attributes":"A nested object in a JSON or YAML template that supports arbitrary definitions. Represents the attributes in an attribute group that describes an application and its components.","Description":"The description of the attribute group that the user provides.","Name":"The name of the attribute group.","Tags":"Key-value pairs you can use to associate with the attribute group."}},"AWS::ServiceCatalogAppRegistry::AttributeGroupAssociation":{"attributes":{"ApplicationArn":"The Amazon resource name (ARN) of the application that was augmented with attributes.","AttributeGroupArn":"The Amazon resource name (ARN) of the attribute group that contains the application\'s new attributes.","Id":"The Id of the Association.","Ref":"`Ref` returns the Id."},"description":"Associates an attribute group with an application to augment the application\'s metadata with the group\'s attributes. This feature enables applications to be described with user-defined details that are machine-readable, such as third-party integrations.","properties":{"Application":"The name or ID of the application.","AttributeGroup":"The name or ID of the attribute group that holds the attributes to describe the application."}},"AWS::ServiceCatalogAppRegistry::ResourceAssociation":{"attributes":{"ApplicationArn":"The Amazon resource name (ARN) that specifies the application.","Id":"The Id of the Association.","Ref":"`Ref` returns the id.","ResourceArn":"The Amazon resource name (ARN) that specifies the resource."},"description":"Associates a resource with an application. Both the resource and the application can be specified either by ID or name.","properties":{"Application":"The name or ID of the application.","Resource":"The name or ID of the resource of which the application will be associated.","ResourceType":"The type of resource of which the application will be associated."}},"AWS::ServiceDiscovery::HttpNamespace":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the namespace, such as `arn:aws:service-discovery:us-east-1:123456789012:http-namespace/http-namespace-a1bzhi` .","Id":"The ID of the namespace.","Ref":"`Ref` returns the `Id` for the namespace, such as `ns-e4anhexample0004` ."},"description":"The `HttpNamespace` resource is an AWS Cloud Map resource type that contains information about an HTTP namespace. Service instances that you register using an HTTP namespace can be discovered using a `DiscoverInstances` request but can\'t be discovered using DNS.\\n\\nFor the current quota on the number of namespaces that you can create using the same AWS account, see [AWS Cloud Map quotas](https://docs.aws.amazon.com/cloud-map/latest/dg/cloud-map-limits.html) in the ** .","properties":{"Description":"A description for the namespace.","Name":"The name that you want to assign to this namespace.","Tags":"The tags for the namespace. Each tag consists of a key and an optional value, both of which you define. Tag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters."}},"AWS::ServiceDiscovery::Instance":{"attributes":{"Ref":"`Ref` returns the value of `Id` for the instance, such as `i-abcd1234` ."},"description":"A complex type that contains information about an instance that AWS Cloud Map creates when you submit a `RegisterInstance` request.","properties":{"InstanceAttributes":"A string map that contains the following information for the service that you specify in `ServiceId` :\\n\\n- The attributes that apply to the records that are defined in the service.\\n- For each attribute, the applicable value.\\n\\nSupported attribute keys include the following:\\n\\n- **AWS_ALIAS_DNS_NAME** - If you want AWS Cloud Map to create a Route 53 alias record that routes traffic to an Elastic Load Balancing load balancer, specify the DNS name that is associated with the load balancer. For information about how to get the DNS name, see [AliasTarget->DNSName](https://docs.aws.amazon.com/Route53/latest/APIReference/API_AliasTarget.html#Route53-Type-AliasTarget-DNSName) in the *Route 53 API Reference* .\\n\\nNote the following:\\n\\n- The configuration for the service that is specified by `ServiceId` must include settings for an `A` record, an `AAAA` record, or both.\\n- In the service that is specified by `ServiceId` , the value of `RoutingPolicy` must be `WEIGHTED` .\\n- If the service that is specified by `ServiceId` includes `HealthCheckConfig` settings, AWS Cloud Map will create the health check, but it won\'t associate the health check with the alias record.\\n- Auto naming currently doesn\'t support creating alias records that route traffic to AWS resources other than ELB load balancers.\\n- If you specify a value for `AWS_ALIAS_DNS_NAME` , don\'t specify values for any of the `AWS_INSTANCE` attributes.\\n- **AWS_EC2_INSTANCE_ID** - *HTTP namespaces only.* The Amazon EC2 instance ID for the instance. The `AWS_INSTANCE_IPV4` attribute contains the primary private IPv4 address. When creating resources with a type of [AWS::ServiceDiscovery::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-instance.html) , if the `AWS_EC2_INSTANCE_ID` attribute is specified, the only other attribute that can be specified is `AWS_INIT_HEALTH_STATUS` . After the resource has been created, the `AWS_INSTANCE_IPV4` attribute contains the primary private IPv4 address.\\n- **AWS_INIT_HEALTH_STATUS** - If the service configuration includes `HealthCheckCustomConfig` , when creating resources with a type of [AWS::ServiceDiscovery::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-instance.html) you can optionally use `AWS_INIT_HEALTH_STATUS` to specify the initial status of the custom health check, `HEALTHY` or `UNHEALTHY` . If you don\'t specify a value for `AWS_INIT_HEALTH_STATUS` , the initial status is `HEALTHY` . This attribute can only be used when creating resources and will not be seen on existing resources.\\n- **AWS_INSTANCE_CNAME** - If the service configuration includes a `CNAME` record, the domain name that you want Route 53 to return in response to DNS queries, for example, `example.com` .\\n\\nThis value is required if the service specified by `ServiceId` includes settings for an `CNAME` record.\\n- **AWS_INSTANCE_IPV4** - If the service configuration includes an `A` record, the IPv4 address that you want Route 53 to return in response to DNS queries, for example, `192.0.2.44` .\\n\\nThis value is required if the service specified by `ServiceId` includes settings for an `A` record. If the service includes settings for an `SRV` record, you must specify a value for `AWS_INSTANCE_IPV4` , `AWS_INSTANCE_IPV6` , or both.\\n- **AWS_INSTANCE_IPV6** - If the service configuration includes an `AAAA` record, the IPv6 address that you want Route 53 to return in response to DNS queries, for example, `2001:0db8:85a3:0000:0000:abcd:0001:2345` .\\n\\nThis value is required if the service specified by `ServiceId` includes settings for an `AAAA` record. If the service includes settings for an `SRV` record, you must specify a value for `AWS_INSTANCE_IPV4` , `AWS_INSTANCE_IPV6` , or both.\\n- **AWS_INSTANCE_PORT** - If the service includes an `SRV` record, the value that you want Route 53 to return for the port.\\n\\nIf the service includes `HealthCheckConfig` , the port on the endpoint that you want Route 53 to send requests to.\\n\\nThis value is required if you specified settings for an `SRV` record or a Route 53 health check when you created the service.","InstanceId":"An identifier that you want to associate with the instance. Note the following:\\n\\n- If the service that\'s specified by `ServiceId` includes settings for an `SRV` record, the value of `InstanceId` is automatically included as part of the value for the `SRV` record. For more information, see [DnsRecord > Type](https://docs.aws.amazon.com/cloud-map/latest/api/API_DnsRecord.html#cloudmap-Type-DnsRecord-Type) .\\n- You can use this value to update an existing instance.\\n- To register a new instance, you must specify a value that\'s unique among instances that you register by using the same service.\\n- If you specify an existing `InstanceId` and `ServiceId` , AWS Cloud Map updates the existing DNS records, if any. If there\'s also an existing health check, AWS Cloud Map deletes the old health check and creates a new one.\\n\\n> The health check isn\'t deleted immediately, so it will still appear for a while if you submit a `ListHealthChecks` request, for example.\\n\\n> Do not include sensitive information in `InstanceId` if the namespace is discoverable by public DNS queries and any `Type` member of `DnsRecord` for the service contains `SRV` because the `InstanceId` is discoverable by public DNS queries.","ServiceId":"The ID of the service that you want to use for settings for the instance."}},"AWS::ServiceDiscovery::PrivateDnsNamespace":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the private namespace.","HostedZoneId":"The ID for the Route 53 hosted zone that AWS Cloud Map creates when you create a namespace.","Id":"The ID of the private namespace.","Ref":"`Ref` returns the value of `Id` for the namespace, such as `ns-e4anhexample0004` ."},"description":"Creates a private namespace based on DNS, which is visible only inside a specified Amazon VPC. The namespace defines your service naming scheme. For example, if you name your namespace `example.com` and name your service `backend` , the resulting DNS name for the service is `backend.example.com` . Service instances that are registered using a private DNS namespace can be discovered using either a `DiscoverInstances` request or using DNS. For the current quota on the number of namespaces that you can create using the same AWS account , see [AWS Cloud Map quotas](https://docs.aws.amazon.com/cloud-map/latest/dg/cloud-map-limits.html) in the *AWS Cloud Map Developer Guide* .","properties":{"Description":"A description for the namespace.","Name":"The name that you want to assign to this namespace. When you create a private DNS namespace, AWS Cloud Map automatically creates an Amazon Route 53 private hosted zone that has the same name as the namespace.","Properties":"Properties for the private DNS namespace.","Tags":"The tags for the namespace. Each tag consists of a key and an optional value, both of which you define. Tag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters.","Vpc":"The ID of the Amazon VPC that you want to associate the namespace with."}},"AWS::ServiceDiscovery::PrivateDnsNamespace.PrivateDnsPropertiesMutable":{"attributes":{},"description":"DNS properties for the private DNS namespace.","properties":{"SOA":"Fields for the Start of Authority (SOA) record for the hosted zone for the private DNS namespace."}},"AWS::ServiceDiscovery::PrivateDnsNamespace.Properties":{"attributes":{},"description":"Properties for the private DNS namespace.","properties":{"DnsProperties":"DNS properties for the private DNS namespace."}},"AWS::ServiceDiscovery::PrivateDnsNamespace.SOA":{"attributes":{},"description":"Start of Authority (SOA) properties for a public or private DNS namespace.","properties":{"TTL":"The time to live (TTL) for purposes of negative caching."}},"AWS::ServiceDiscovery::PublicDnsNamespace":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the public namespace.","HostedZoneId":"The ID for the Route 53 hosted zone that AWS Cloud Map creates when you create a namespace.","Id":"The ID of the public namespace.","Ref":"`Ref` returns the value of `Id` for the namespace, such as `ns-e4anhexample0004` ."},"description":"Creates a public namespace based on DNS, which is visible on the internet. The namespace defines your service naming scheme. For example, if you name your namespace `example.com` and name your service `backend` , the resulting DNS name for the service is `backend.example.com` . You can discover instances that were registered with a public DNS namespace by using either a `DiscoverInstances` request or using DNS. For the current quota on the number of namespaces that you can create using the same AWS account , see [AWS Cloud Map quotas](https://docs.aws.amazon.com/cloud-map/latest/dg/cloud-map-limits.html) in the *AWS Cloud Map Developer Guide* .\\n\\n> The `CreatePublicDnsNamespace` API operation is not supported in the AWS GovCloud (US) Regions.","properties":{"Description":"A description for the namespace.","Name":"The name that you want to assign to this namespace.\\n\\n> Do not include sensitive information in the name. The name is publicly available using DNS queries.","Properties":"Properties for the public DNS namespace.","Tags":"The tags for the namespace. Each tag consists of a key and an optional value, both of which you define. Tag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters."}},"AWS::ServiceDiscovery::PublicDnsNamespace.Properties":{"attributes":{},"description":"Properties for the public DNS namespace.","properties":{"DnsProperties":"DNS properties for the public DNS namespace."}},"AWS::ServiceDiscovery::PublicDnsNamespace.PublicDnsPropertiesMutable":{"attributes":{},"description":"DNS properties for the public DNS namespace.","properties":{"SOA":"Start of Authority (SOA) record for the hosted zone for the public DNS namespace."}},"AWS::ServiceDiscovery::PublicDnsNamespace.SOA":{"attributes":{},"description":"Start of Authority (SOA) properties for a public or private DNS namespace.","properties":{"TTL":"The time to live (TTL) for purposes of negative caching."}},"AWS::ServiceDiscovery::Service":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the service.","Id":"The ID of the service.","Name":"The name that you assigned to the service.","Ref":"`Ref` returns the value of `Id` for the service, such as `srv-e4anhexample0004` ."},"description":"A complex type that contains information about a service, which defines the configuration of the following entities:\\n\\n- For public and private DNS namespaces, one of the following combinations of DNS records in Amazon Route 53:\\n\\n- A\\n- AAAA\\n- A and AAAA\\n- SRV\\n- CNAME\\n- Optionally, a health check","properties":{"Description":"The description of the service.","DnsConfig":"A complex type that contains information about the Route 53 DNS records that you want AWS Cloud Map to create when you register an instance.\\n\\n> The record types of a service can only be changed by deleting the service and recreating it with a new `Dnsconfig` .","HealthCheckConfig":"*Public DNS and HTTP namespaces only.* A complex type that contains settings for an optional health check. If you specify settings for a health check, AWS Cloud Map associates the health check with the records that you specify in `DnsConfig` .\\n\\nFor information about the charges for health checks, see [Amazon Route 53 Pricing](https://docs.aws.amazon.com/route53/pricing/) .","HealthCheckCustomConfig":"A complex type that contains information about an optional custom health check.\\n\\n> If you specify a health check configuration, you can specify either `HealthCheckCustomConfig` or `HealthCheckConfig` but not both.","Name":"The name of the service.","NamespaceId":"The ID of the namespace that was used to create the service.\\n\\n> You must specify a value for `NamespaceId` either for the service properties or for [DnsConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-dnsconfig.html) . Don\'t specify a value in both places.","Tags":"The tags for the service. Each tag consists of a key and an optional value, both of which you define. Tag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters.","Type":"If present, specifies that the service instances are only discoverable using the `DiscoverInstances` API operation. No DNS records is registered for the service instances. The only valid value is `HTTP` ."}},"AWS::ServiceDiscovery::Service.DnsConfig":{"attributes":{},"description":"A complex type that contains information about the Amazon Route 53 DNS records that you want AWS Cloud Map to create when you register an instance.\\n\\n> The record types of a service can only be changed by deleting the service and recreating it with a new `Dnsconfig` .","properties":{"DnsRecords":"An array that contains one `DnsRecord` object for each Route 53 DNS record that you want AWS Cloud Map to create when you register an instance.","NamespaceId":"The ID of the namespace to use for DNS configuration.\\n\\n> You must specify a value for `NamespaceId` either for `DnsConfig` or for the [service properties](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-service.html) . Don\'t specify a value in both places.","RoutingPolicy":"The routing policy that you want to apply to all Route 53 DNS records that AWS Cloud Map creates when you register an instance and specify this service.\\n\\n> If you want to use this service to register instances that create alias records, specify `WEIGHTED` for the routing policy. \\n\\nYou can specify the following values:\\n\\n- **MULTIVALUE** - If you define a health check for the service and the health check is healthy, Route 53 returns the applicable value for up to eight instances.\\n\\nFor example, suppose that the service includes configurations for one `A` record and a health check. You use the service to register 10 instances. Route 53 responds to DNS queries with IP addresses for up to eight healthy instances. If fewer than eight instances are healthy, Route 53 responds to every DNS query with the IP addresses for all of the healthy instances.\\n\\nIf you don\'t define a health check for the service, Route 53 assumes that all instances are healthy and returns the values for up to eight instances.\\n\\nFor more information about the multivalue routing policy, see [Multivalue Answer Routing](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html#routing-policy-multivalue) in the *Route 53 Developer Guide* .\\n- **WEIGHTED** - Route 53 returns the applicable value from one randomly selected instance from among the instances that you registered using the same service. Currently, all records have the same weight, so you can\'t route more or less traffic to any instances.\\n\\nFor example, suppose that the service includes configurations for one `A` record and a health check. You use the service to register 10 instances. Route 53 responds to DNS queries with the IP address for one randomly selected instance from among the healthy instances. If no instances are healthy, Route 53 responds to DNS queries as if all of the instances were healthy.\\n\\nIf you don\'t define a health check for the service, Route 53 assumes that all instances are healthy and returns the applicable value for one randomly selected instance.\\n\\nFor more information about the weighted routing policy, see [Weighted Routing](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html#routing-policy-weighted) in the *Route 53 Developer Guide* ."}},"AWS::ServiceDiscovery::Service.DnsRecord":{"attributes":{},"description":"A complex type that contains information about the Route 53 DNS records that you want AWS Cloud Map to create when you register an instance.","properties":{"TTL":"The amount of time, in seconds, that you want DNS resolvers to cache the settings for this record.\\n\\n> Alias records don\'t include a TTL because Route 53 uses the TTL for the AWS resource that an alias record routes traffic to. If you include the `AWS_ALIAS_DNS_NAME` attribute when you submit a [RegisterInstance](https://docs.aws.amazon.com/cloud-map/latest/api/API_RegisterInstance.html) request, the `TTL` value is ignored. Always specify a TTL for the service; you can use a service to register instances that create either alias or non-alias records.","Type":"The type of the resource, which indicates the type of value that Route 53 returns in response to DNS queries. You can specify values for `Type` in the following combinations:\\n\\n- `A`\\n- `AAAA`\\n- `A` and `AAAA`\\n- `SRV`\\n- `CNAME`\\n\\nIf you want AWS Cloud Map to create a Route 53 alias record when you register an instance, specify `A` or `AAAA` for `Type` .\\n\\nYou specify other settings, such as the IP address for `A` and `AAAA` records, when you register an instance. For more information, see [RegisterInstance](https://docs.aws.amazon.com/cloud-map/latest/api/API_RegisterInstance.html) .\\n\\nThe following values are supported:\\n\\n- **A** - Route 53 returns the IP address of the resource in IPv4 format, such as 192.0.2.44.\\n- **AAAA** - Route 53 returns the IP address of the resource in IPv6 format, such as 2001:0db8:85a3:0000:0000:abcd:0001:2345.\\n- **CNAME** - Route 53 returns the domain name of the resource, such as www.example.com. Note the following:\\n\\n- You specify the domain name that you want to route traffic to when you register an instance. For more information, see [Attributes](https://docs.aws.amazon.com/cloud-map/latest/api/API_RegisterInstance.html#cloudmap-RegisterInstance-request-Attributes) in the topic [RegisterInstance](https://docs.aws.amazon.com/cloud-map/latest/api/API_RegisterInstance.html) .\\n- You must specify `WEIGHTED` for the value of `RoutingPolicy` .\\n- You can\'t specify both `CNAME` for `Type` and settings for `HealthCheckConfig` . If you do, the request will fail with an `InvalidInput` error.\\n- **SRV** - Route 53 returns the value for an `SRV` record. The value for an `SRV` record uses the following values:\\n\\n`priority weight port service-hostname`\\n\\nNote the following about the values:\\n\\n- The values of `priority` and `weight` are both set to `1` and can\'t be changed.\\n- The value of `port` comes from the value that you specify for the `AWS_INSTANCE_PORT` attribute when you submit a [RegisterInstance](https://docs.aws.amazon.com/cloud-map/latest/api/API_RegisterInstance.html) request.\\n- The value of `service-hostname` is a concatenation of the following values:\\n\\n- The value that you specify for `InstanceId` when you register an instance.\\n- The name of the service.\\n- The name of the namespace.\\n\\nFor example, if the value of `InstanceId` is `test` , the name of the service is `backend` , and the name of the namespace is `example.com` , the value of `service-hostname` is:\\n\\n`test.backend.example.com`\\n\\nIf you specify settings for an `SRV` record and if you specify values for `AWS_INSTANCE_IPV4` , `AWS_INSTANCE_IPV6` , or both in the `RegisterInstance` request, AWS Cloud Map automatically creates `A` and/or `AAAA` records that have the same name as the value of `service-hostname` in the `SRV` record. You can ignore these records."}},"AWS::ServiceDiscovery::Service.HealthCheckConfig":{"attributes":{},"description":"*Public DNS and HTTP namespaces only.* A complex type that contains settings for an optional health check. If you specify settings for a health check, AWS Cloud Map associates the health check with the records that you specify in `DnsConfig` .\\n\\n> If you specify a health check configuration, you can specify either `HealthCheckCustomConfig` or `HealthCheckConfig` but not both. \\n\\nHealth checks are basic Route 53 health checks that monitor an AWS endpoint. For information about pricing for health checks, see [Amazon Route 53 Pricing](https://docs.aws.amazon.com/route53/pricing/) .\\n\\nNote the following about configuring health checks.\\n\\n- **A and AAAA records** - If `DnsConfig` includes configurations for both `A` and `AAAA` records, AWS Cloud Map creates a health check that uses the IPv4 address to check the health of the resource. If the endpoint tthat\'s specified by the IPv4 address is unhealthy, Route 53 considers both the `A` and `AAAA` records to be unhealthy.\\n- **CNAME records** - You can\'t specify settings for `HealthCheckConfig` when the `DNSConfig` includes `CNAME` for the value of `Type` . If you do, the `CreateService` request will fail with an `InvalidInput` error.\\n- **Request interval** - A Route 53 health checker in each health-checking AWS Region sends a health check request to an endpoint every 30 seconds. On average, your endpoint receives a health check request about every two seconds. However, health checkers don\'t coordinate with one another. Therefore, you might sometimes see several requests in one second that\'s followed by a few seconds with no health checks at all.\\n- **Health checking regions** - Health checkers perform checks from all Route 53 health-checking Regions. For a list of the current Regions, see [Regions](https://docs.aws.amazon.com/Route53/latest/APIReference/API_HealthCheckConfig.html#Route53-Type-HealthCheckConfig-Regions) .\\n- **Alias records** - When you register an instance, if you include the `AWS_ALIAS_DNS_NAME` attribute, AWS Cloud Map creates a Route 53 alias record. Note the following:\\n\\n- Route 53 automatically sets `EvaluateTargetHealth` to true for alias records. When `EvaluateTargetHealth` is true, the alias record inherits the health of the referenced AWS resource. such as an ELB load balancer. For more information, see [EvaluateTargetHealth](https://docs.aws.amazon.com/Route53/latest/APIReference/API_AliasTarget.html#Route53-Type-AliasTarget-EvaluateTargetHealth) .\\n- If you include `HealthCheckConfig` and then use the service to register an instance that creates an alias record, Route 53 doesn\'t create the health check.\\n- **Charges for health checks** - Health checks are basic Route 53 health checks that monitor an AWS endpoint. For information about pricing for health checks, see [Amazon Route 53 Pricing](https://docs.aws.amazon.com/route53/pricing/) .","properties":{"FailureThreshold":"The number of consecutive health checks that an endpoint must pass or fail for Route 53 to change the current status of the endpoint from unhealthy to healthy or the other way around. For more information, see [How Route 53 Determines Whether an Endpoint Is Healthy](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html) in the *Route 53 Developer Guide* .","ResourcePath":"The path that you want Route 53 to request when performing health checks. The path can be any value that your endpoint returns an HTTP status code of a 2xx or 3xx format for when the endpoint is healthy. An example file is `/docs/route53-health-check.html` . Route 53 automatically adds the DNS name for the service. If you don\'t specify a value for `ResourcePath` , the default value is `/` .\\n\\nIf you specify `TCP` for `Type` , you must *not* specify a value for `ResourcePath` .","Type":"The type of health check that you want to create, which indicates how Route 53 determines whether an endpoint is healthy.\\n\\n> You can\'t change the value of `Type` after you create a health check. \\n\\nYou can create the following types of health checks:\\n\\n- *HTTP* : Route 53 tries to establish a TCP connection. If successful, Route 53 submits an HTTP request and waits for an HTTP status code of 200 or greater and less than 400.\\n- *HTTPS* : Route 53 tries to establish a TCP connection. If successful, Route 53 submits an HTTPS request and waits for an HTTP status code of 200 or greater and less than 400.\\n\\n> If you specify HTTPS for the value of `Type` , the endpoint must support TLS v1.0 or later.\\n- *TCP* : Route 53 tries to establish a TCP connection.\\n\\nIf you specify `TCP` for `Type` , don\'t specify a value for `ResourcePath` .\\n\\nFor more information, see [How Route 53 Determines Whether an Endpoint Is Healthy](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html) in the *Route 53 Developer Guide* ."}},"AWS::ServiceDiscovery::Service.HealthCheckCustomConfig":{"attributes":{},"description":"A complex type that contains information about an optional custom health check. A custom health check, which requires that you use a third-party health checker to evaluate the health of your resources, is useful in the following circumstances:\\n\\n- You can\'t use a health check that\'s defined by `HealthCheckConfig` because the resource isn\'t available over the internet. For example, you can use a custom health check when the instance is in an Amazon VPC. (To check the health of resources in a VPC, the health checker must also be in the VPC.)\\n- You want to use a third-party health checker regardless of where your resources are located.\\n\\n> If you specify a health check configuration, you can specify either `HealthCheckCustomConfig` or `HealthCheckConfig` but not both. \\n\\nTo change the status of a custom health check, submit an `UpdateInstanceCustomHealthStatus` request. AWS Cloud Map doesn\'t monitor the status of the resource, it just keeps a record of the status specified in the most recent `UpdateInstanceCustomHealthStatus` request.\\n\\nHere\'s how custom health checks work:\\n\\n- You create a service.\\n- You register an instance.\\n- You configure a third-party health checker to monitor the resource that\'s associated with the new instance.\\n\\n> AWS Cloud Map doesn\'t check the health of the resource directly.\\n- The third-party health-checker determines that the resource is unhealthy and notifies your application.\\n- Your application submits an `UpdateInstanceCustomHealthStatus` request.\\n- AWS Cloud Map waits for 30 seconds.\\n- If another `UpdateInstanceCustomHealthStatus` request doesn\'t arrive during that time to change the status back to healthy, AWS Cloud Map stops routing traffic to the resource.","properties":{"FailureThreshold":"> This parameter is no longer supported and is always set to 1. AWS Cloud Map waits for approximately 30 seconds after receiving an `UpdateInstanceCustomHealthStatus` request before changing the status of the service instance. \\n\\nThe number of 30-second intervals that you want AWS Cloud Map to wait after receiving an `UpdateInstanceCustomHealthStatus` request before it changes the health status of a service instance.\\n\\nSending a second or subsequent `UpdateInstanceCustomHealthStatus` request with the same value before 30 seconds has passed doesn\'t accelerate the change. AWS Cloud Map still waits `30` seconds after the first request to make the change."}},"AWS::Shield::DRTAccess":{"attributes":{"AccountId":"The ID of the account that submitted the template.","Ref":"`Ref` returns the ID of the account that submitted the template."},"description":"Provides permissions for the AWS Shield Advanced Shield response team (SRT) to access your account and your resource protections, to help you mitigate potential distributed denial of service (DDoS) attacks.\\n\\n> To configure this resource through AWS CloudFormation , you must be subscribed to AWS Shield Advanced . You can subscribe through the [Shield Advanced console](https://docs.aws.amazon.com/wafv2/shieldv2#/) and through the APIs. For more information, see [Subscribe to AWS Shield Advanced](https://docs.aws.amazon.com/waf/latest/developerguide/enable-ddos-prem.html) . \\n\\nSee example templates for Shield Advanced in AWS CloudFormation at [aws-samples/aws-shield-advanced-examples](https://docs.aws.amazon.com/https://github.com/aws-samples/aws-shield-advanced-examples) .","properties":{"LogBucketList":"Authorizes the Shield Response Team (SRT) to access the specified Amazon S3 bucket containing log data such as Application Load Balancer access logs, CloudFront logs, or logs from third party sources. You can associate up to 10 Amazon S3 buckets with your subscription.\\n\\nUse this to share information with the SRT that\'s not available in AWS WAF logs.\\n\\nTo use the services of the SRT, you must be subscribed to the [Business Support plan](https://docs.aws.amazon.com/premiumsupport/business-support/) or the [Enterprise Support plan](https://docs.aws.amazon.com/premiumsupport/enterprise-support/) .","RoleArn":"Authorizes the Shield Response Team (SRT) using the specified role, to access your AWS account to assist with DDoS attack mitigation during potential attacks. This enables the SRT to inspect your AWS WAF configuration and logs and to create or update AWS WAF rules and web ACLs.\\n\\nYou can associate only one `RoleArn` with your subscription. If you submit this update for an account that already has an associated role, the new `RoleArn` will replace the existing `RoleArn` .\\n\\nThis change requires the following:\\n\\n- You must be subscribed to the [Business Support plan](https://docs.aws.amazon.com/premiumsupport/business-support/) or the [Enterprise Support plan](https://docs.aws.amazon.com/premiumsupport/enterprise-support/) .\\n- You must have the `iam:PassRole` permission. For more information, see [Granting a user permissions to pass a role to an AWS service](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html) .\\n- The `AWSShieldDRTAccessPolicy` managed policy must be attached to the role that you specify in the request. You can access this policy in the IAM console at [AWSShieldDRTAccessPolicy](https://docs.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/service-role/AWSShieldDRTAccessPolicy) . For information, see [Adding and removing IAM identity permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html) .\\n- The role must trust the service principal `drt.shield.amazonaws.com` . For information, see [IAM JSON policy elements: Principal](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html) .\\n\\nThe SRT will have access only to your AWS WAF and Shield resources. By submitting this request, you provide permissions to the SRT to inspect your AWS WAF and Shield configuration and logs, and to create and update AWS WAF rules and web ACLs on your behalf. The SRT takes these actions only if explicitly authorized by you."}},"AWS::Shield::ProactiveEngagement":{"attributes":{"AccountId":"The ID of the account that submitted the template.","Ref":"`Ref` returns the ID of the account that submitted the template."},"description":"Authorizes the Shield Response Team (SRT) to use email and phone to notify contacts about escalations to the SRT and to initiate proactive customer support.\\n\\nTo enable proactive engagement, you must be subscribed to the [Business Support plan](https://docs.aws.amazon.com/premiumsupport/business-support/) or the [Enterprise Support plan](https://docs.aws.amazon.com/premiumsupport/enterprise-support/) .\\n\\n> To configure this resource through AWS CloudFormation , you must be subscribed to AWS Shield Advanced . You can subscribe through the [Shield Advanced console](https://docs.aws.amazon.com/wafv2/shieldv2#/) and through the APIs. For more information, see [Subscribe to AWS Shield Advanced](https://docs.aws.amazon.com/waf/latest/developerguide/enable-ddos-prem.html) . \\n\\nSee example templates for Shield Advanced in AWS CloudFormation at [aws-samples/aws-shield-advanced-examples](https://docs.aws.amazon.com/https://github.com/aws-samples/aws-shield-advanced-examples) .","properties":{"EmergencyContactList":"The list of email addresses and phone numbers that the Shield Response Team (SRT) can use to contact you for escalations to the SRT and to initiate proactive customer support, plus any relevant notes.\\n\\nTo enable proactive engagement, the contact list must include at least one phone number.\\n\\nIf you provide more than one contact, in the notes, indicate the circumstances under which each contact should be used. Include primary and secondary contact designations, and provide the hours of availability and time zones for each contact.\\n\\nExample contact notes:\\n\\n- This is a hotline that\'s staffed 24x7x365. Please work with the responding analyst and they will get the appropriate person on the call.\\n- Please contact the secondary phone number if the hotline doesn\'t respond within 5 minutes.","ProactiveEngagementStatus":"Specifies whether proactive engagement is enabled or disabled.\\n\\nValid values:\\n\\n`ENABLED` - The Shield Response Team (SRT) will use email and phone to notify contacts about escalations to the SRT and to initiate proactive customer support.\\n\\n`DISABLED` - The SRT will not proactively notify contacts about escalations or to initiate proactive customer support."}},"AWS::Shield::ProactiveEngagement.EmergencyContact":{"attributes":{},"description":"Contact information that the SRT can use to contact you if you have proactive engagement enabled, for escalations to the SRT and to initiate proactive customer support.","properties":{"ContactNotes":"Additional notes regarding the contact.","EmailAddress":"The email address for the contact.","PhoneNumber":"The phone number for the contact."}},"AWS::Shield::Protection":{"attributes":{"ProtectionArn":"The ARN (Amazon Resource Name) of the new protection.","ProtectionId":"The ID of the new protection.","Ref":"`Ref` returns the ARN (Amazon Resource Name) of the protection."},"description":"Enables AWS Shield Advanced for a specific AWS resource. The resource can be an Amazon CloudFront distribution, Amazon Route 53 hosted zone, AWS Global Accelerator standard accelerator, Elastic IP Address, Application Load Balancer, or a Classic Load Balancer. You can protect Amazon EC2 instances and Network Load Balancers by association with protected Amazon EC2 Elastic IP addresses.\\n\\nUse this to add protection to a single resource at a time. You can add protection to multiple resources at once through the [Shield Advanced console](https://docs.aws.amazon.com/wafv2/shieldv2#/) . For more information see [Getting Started with AWS Shield Advanced](https://docs.aws.amazon.com/waf/latest/developerguide/getting-started-ddos.html) and [Managing resource protections in AWS Shield Advanced](https://docs.aws.amazon.com/waf/latest/developerguide/ddos-manage-protected-resources.html) .\\n\\n> To configure this resource through AWS CloudFormation , you must be subscribed to AWS Shield Advanced . You can subscribe through the [Shield Advanced console](https://docs.aws.amazon.com/wafv2/shieldv2#/) and through the APIs. For more information, see [Subscribe to AWS Shield Advanced](https://docs.aws.amazon.com/waf/latest/developerguide/enable-ddos-prem.html) . \\n\\nSee example templates for Shield Advanced in AWS CloudFormation at [aws-samples/aws-shield-advanced-examples](https://docs.aws.amazon.com/https://github.com/aws-samples/aws-shield-advanced-examples) .","properties":{"ApplicationLayerAutomaticResponseConfiguration":"The automatic application layer DDoS mitigation settings for the protection. This configuration determines whether Shield Advanced automatically manages rules in the web ACL in order to respond to application layer events that Shield Advanced determines to be DDoS attacks.","HealthCheckArns":"The ARN (Amazon Resource Name) of the health check to associate with the protection. Health-based detection provides improved responsiveness and accuracy in attack detection and mitigation.\\n\\nYou can use this option with any resource type except for Route 53 hosted zones.\\n\\nFor more information, see [Configuring health-based detection using health checks](https://docs.aws.amazon.com/waf/latest/developerguide/ddos-advanced-health-checks.html) in the *AWS Shield Advanced Developer Guide* .","Name":"The name of the protection. For example, `My CloudFront distributions` .\\n\\n> If you change the name of an existing protection, Shield Advanced deletes the protection and replaces it with a new one. While this is happening, the protection isn\'t available on the AWS resource.","ResourceArn":"The ARN (Amazon Resource Name) of the AWS resource that is protected.","Tags":"Key:value pairs associated with an AWS resource. The key:value pair can be anything you define. Typically, the tag key represents a category (such as \\"environment\\") and the tag value represents a specific value within that category (such as \\"test,\\" \\"development,\\" or \\"production\\"). You can add up to 50 tags to each AWS resource."}},"AWS::Shield::Protection.Action":{"attributes":{},"description":"Specifies the action setting that Shield Advanced should use in the AWS WAF rules that it creates on behalf of the protected resource in response to DDoS attacks. You specify this as part of the configuration for the automatic application layer DDoS mitigation feature, when you enable or update automatic mitigation. Shield Advanced creates the AWS WAF rules in a Shield Advanced-managed rule group, inside the web ACL that you have associated with the resource.","properties":{"Block":"Specifies that Shield Advanced should configure its AWS WAF rules with the AWS WAF `Block` action.\\n\\nYou must specify exactly one action, either `Block` or `Count` .\\n\\nExample JSON: `{ \\"Block\\": {} }`\\n\\nExample YAML: `Block: {}`","Count":"Specifies that Shield Advanced should configure its AWS WAF rules with the AWS WAF `Count` action.\\n\\nYou must specify exactly one action, either `Block` or `Count` .\\n\\nExample JSON: `{ \\"Count\\": {} }`\\n\\nExample YAML: `Count: {}`"}},"AWS::Shield::Protection.ApplicationLayerAutomaticResponseConfiguration":{"attributes":{},"description":"The automatic application layer DDoS mitigation settings for a `Protection` . This configuration determines whether Shield Advanced automatically manages rules in the web ACL in order to respond to application layer events that Shield Advanced determines to be DDoS attacks.","properties":{"Action":"Specifies the action setting that Shield Advanced should use in the AWS WAF rules that it creates on behalf of the protected resource in response to DDoS attacks. You specify this as part of the configuration for the automatic application layer DDoS mitigation feature, when you enable or update automatic mitigation. Shield Advanced creates the AWS WAF rules in a Shield Advanced-managed rule group, inside the web ACL that you have associated with the resource.","Status":"Indicates whether automatic application layer DDoS mitigation is enabled for the protection."}},"AWS::Shield::ProtectionGroup":{"attributes":{"ProtectionGroupArn":"The ARN (Amazon Resource Name) of the new protection group.","Ref":"`Ref` returns the ARN (Amazon Resource Name) of the protection group."},"description":"Creates a grouping of protected resources so they can be handled as a collective. This resource grouping improves the accuracy of detection and reduces false positives.\\n\\n> To configure this resource through AWS CloudFormation , you must be subscribed to AWS Shield Advanced . You can subscribe through the [Shield Advanced console](https://docs.aws.amazon.com/wafv2/shieldv2#/) and through the APIs. For more information, see [Subscribe to AWS Shield Advanced](https://docs.aws.amazon.com/waf/latest/developerguide/enable-ddos-prem.html) . \\n\\nSee example templates for Shield Advanced in AWS CloudFormation at [aws-samples/aws-shield-advanced-examples](https://docs.aws.amazon.com/https://github.com/aws-samples/aws-shield-advanced-examples) .","properties":{"Aggregation":"Defines how AWS Shield combines resource data for the group in order to detect, mitigate, and report events.\\n\\n- Sum - Use the total traffic across the group. This is a good choice for most cases. Examples include Elastic IP addresses for EC2 instances that scale manually or automatically.\\n- Mean - Use the average of the traffic across the group. This is a good choice for resources that share traffic uniformly. Examples include accelerators and load balancers.\\n- Max - Use the highest traffic from each resource. This is useful for resources that don\'t share traffic and for resources that share that traffic in a non-uniform way. Examples include Amazon CloudFront distributions and origin resources for CloudFront distributions.","Members":"The ARNs (Amazon Resource Names) of the resources to include in the protection group. You must set this when you set `Pattern` to `ARBITRARY` and you must not set it for any other `Pattern` setting.","Pattern":"The criteria to use to choose the protected resources for inclusion in the group. You can include all resources that have protections, provide a list of resource ARNs (Amazon Resource Names), or include all resources of a specified resource type.","ProtectionGroupId":"The name of the protection group. You use this to identify the protection group in lists and to manage the protection group, for example to update, delete, or describe it.","ResourceType":"The resource type to include in the protection group. All protected resources of this type are included in the protection group. You must set this when you set `Pattern` to `BY_RESOURCE_TYPE` and you must not set it for any other `Pattern` setting.","Tags":"Key:value pairs associated with an AWS resource. The key:value pair can be anything you define. Typically, the tag key represents a category (such as \\"environment\\") and the tag value represents a specific value within that category (such as \\"test,\\" \\"development,\\" or \\"production\\"). You can add up to 50 tags to each AWS resource."}},"AWS::Signer::ProfilePermission":{"attributes":{"Ref":"The StatementId and ProfileName in the form StatementId|ProfileName"},"description":"Adds cross-account permissions to a signing profile.","properties":{"Action":"The AWS Signer action permitted as part of cross-account permissions.","Principal":"The AWS principal receiving cross-account permissions. This may be an IAM role or another AWS account ID.","ProfileName":"The human-readable name of the signing profile.","ProfileVersion":"The version of the signing profile.","StatementId":"A unique identifier for the cross-account permission statement."}},"AWS::Signer::SigningProfile":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the signing profile created.","ProfileName":"The name of the signing profile created.","ProfileVersion":"The version of the signing profile created.","ProfileVersionArn":"The signing profile ARN, including the profile version.","Ref":"The signing profile ARN."},"description":"Creates a signing profile. A signing profile is a code-signing template that can be used to carry out a pre-defined signing job.","properties":{"PlatformId":"The ID of a platform that is available for use by a signing profile.","SignatureValidityPeriod":"The validity period override for any signature generated using this signing profile. If unspecified, the default is 135 months.","Tags":"A list of tags associated with the signing profile."}},"AWS::Signer::SigningProfile.SignatureValidityPeriod":{"attributes":{},"description":"The validity period for the signing job.","properties":{"Type":"The time unit for signature validity: DAYS | MONTHS | YEARS.","Value":"The numerical value of the time unit for signature validity."}},"AWS::SimSpaceWeaver::Simulation":{"attributes":{"DescribePayload":"The JSON blob that the [DescribeSimulation](https://docs.aws.amazon.com/simspaceweaver/latest/APIReference/API_DescribeSimulation.html) action returns.","Ref":"`Ref` returns the name of the `Simulation` . For example, `MyTestSimulation_22-12-15_12_00_00` ."},"description":"Use the `AWS::SimSpaceWeaver::Simulation` resource to specify a simulation that AWS CloudFormation starts in the AWS Cloud , in your AWS account . In the resource properties section of your template, provide the name of an existing IAM role configured with the proper permissions, and the name of an existing Amazon S3 bucket. Your account must have permissions to read the Amazon S3 bucket. The Amazon S3 bucket must contain a valid schema. The schema must refer to simulation assets that are already uploaded to the AWS Cloud . For more information, see the [detailed tutorial](https://docs.aws.amazon.com/simspaceweaver/latest/userguide/getting-started_detailed.html) in the *AWS SimSpace Weaver User Guide* .\\n\\nSpecify a `SnapshotS3Location` to start a simulation from a snapshot instead of from a schema. When you start a simulation from a snapshot, SimSpace Weaver initializes the entity data in the State Fabric with data saved in the snapshot, starts the spatial and service apps that were running when the snapshot was created, and restores the clock to the appropriate tick. Your app zip files must be in the same location in Amazon S3 as they were in for the original simulation. You must start any custom apps separately. For more information about snapshots, see [Snapshots](https://docs.aws.amazon.com/simspaceweaver/latest/userguide/working-with_snapshots.html) in the *AWS SimSpace Weaver User Guide* .","properties":{"MaximumDuration":"The maximum running time of the simulation, specified as a number of minutes (m or M), hours (h or H), or days (d or D). The simulation stops when it reaches this limit. The maximum value is `14D` , or its equivalent in the other units. The default value is `14D` . A value equivalent to `0` makes the simulation immediately transition to `STOPPING` as soon as it reaches `STARTED` .","Name":"The name of the simulation.","RoleArn":"The Amazon Resource Name (ARN) of the AWS Identity and Access Management ( IAM ) role that the simulation assumes to perform actions. For more information about ARNs, see [Amazon Resource Names (ARNs)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) in the *AWS General Reference* . For more information about IAM roles, see [IAM roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) in the *AWS Identity and Access Management User Guide* .","SchemaS3Location":"The location of the simulation schema in Amazon Simple Storage Service ( Amazon S3 ). For more information about Amazon S3 , see the [*Amazon Simple Storage Service User Guide*](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) .\\n\\nProvide a `SchemaS3Location` to start your simulation from a schema.\\n\\nIf you provide a `SchemaS3Location` then you can\'t provide a `SnapshotS3Location` .","SnapshotS3Location":"The location of the snapshot in Amazon Simple Storage Service ( Amazon S3 ). For more information about Amazon S3 , see the [*Amazon Simple Storage Service User Guide*](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) .\\n\\nProvide a `SnapshotS3Location` to start your simulation from a snapshot.\\n\\nIf you provide a `SnapshotS3Location` then you can\'t provide a `SchemaS3Location` ."}},"AWS::SimSpaceWeaver::Simulation.S3Location":{"attributes":{},"description":"A location in Amazon Simple Storage Service ( Amazon S3 ) where SimSpace Weaver stores simulation data, such as your app .zip files and schema file. For more information about Amazon S3 , see the [*Amazon Simple Storage Service User Guide*](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) .","properties":{"BucketName":"The name of an Amazon S3 bucket. For more information about buckets, see [Creating, configuring, and working with Amazon S3 buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html) in the *Amazon Simple Storage Service User Guide* .","ObjectKey":"The key name of an object in Amazon S3 . For more information about Amazon S3 objects and object keys, see [Uploading, downloading, and working with objects in Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/uploading-downloading-objects.html) in the *Amazon Simple Storage Service User Guide* ."}},"AWS::StepFunctions::Activity":{"attributes":{"Arn":"Returns the ARN of the resource.","Name":"Returns the name of the activity. For example:\\n\\n`{ \\"Fn::GetAtt\\": [\\"MyActivity\\", \\"Name\\"] }`\\n\\nReturns a value similar to the following:\\n\\n`myActivity`\\n\\nFor more information about using `Fn::GetAtt` , see [Fn::GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html) .","Ref":"When you provide the logical ID of this resource to the `Ref` intrinsic function, `Ref` returns the ARN of the created activity. For example:\\n\\n`{ \\"Ref\\": \\"MyActivity\\" }`\\n\\nReturns a value similar to the following:\\n\\n`arn:aws:states:us-east-1:111122223333:activity:myActivity`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"An activity is a task that you write in any programming language and host on any machine that has access to AWS Step Functions . Activities must poll Step Functions using the `GetActivityTask` API action and respond using `SendTask*` API actions. This function lets Step Functions know the existence of your activity and returns an identifier for use in a state machine and when polling from the activity.\\n\\nFor information about creating an activity, see [Creating an Activity State Machine](https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-creating-activity-state-machine.html) in the *AWS Step Functions Developer Guide* and [CreateActivity](https://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateActivity.html) in the *AWS Step Functions API Reference* .","properties":{"Name":"The name of the activity.\\n\\nA name must *not* contain:\\n\\n- white space\\n- brackets `< > { } [ ]`\\n- wildcard characters `? *`\\n- special characters `\\" # % \\\\ ^ | ~ ` $ & , ; : /`\\n- control characters ( `U+0000-001F` , `U+007F-009F` )\\n\\nTo enable logging with CloudWatch Logs, the name should only contain 0-9, A-Z, a-z, - and _.","Tags":"The list of tags to add to a resource.\\n\\nTags may only contain Unicode letters, digits, white space, or these symbols: `_ . : / = + - @` ."}},"AWS::StepFunctions::Activity.TagsEntry":{"attributes":{},"description":"The `TagsEntry` property specifies *tags* to identify an activity.","properties":{"Key":"The `key` for a key-value pair in a tag entry.","Value":"The `value` for a key-value pair in a tag entry."}},"AWS::StepFunctions::StateMachine":{"attributes":{"Arn":"Returns the ARN of the resource.","Name":"Returns the name of the state machine. For example:\\n\\n`{ \\"Fn::GetAtt\\": [\\"MyStateMachine\\", \\"Name\\"] }`\\n\\nReturns the name of your state machine:\\n\\n`HelloWorld-StateMachine`\\n\\nIf you did not specify the name it will be similar to the following:\\n\\n`MyStateMachine-1234abcdefgh`\\n\\nFor more information about using `Fn::GetAtt` , see [Fn::GetAtt](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html) .","Ref":"When you provide the logical ID of this resource to the Ref intrinsic function, Ref returns the ARN of the created state machine. For example:\\n\\n`{ \\"Ref\\": \\"MyStateMachine\\" }`\\n\\nReturns a value similar to the following:\\n\\n`arn:aws:states:us-east-1:111122223333:stateMachine:HelloWorld-StateMachine`\\n\\nFor more information about using the `Ref` function, see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) .","StateMachineRevisionId":"Identifier for a state machine revision, which is an immutable, read-only snapshot of a state machine’s definition and configuration."},"description":"Provisions a state machine. A state machine consists of a collection of states that can do work ( `Task` states), determine to which states to transition next ( `Choice` states), stop an execution with an error ( `Fail` states), and so on. State machines are specified using a JSON-based, structured language.","properties":{"Definition":"The Amazon States Language definition of the state machine. The state machine definition must be in JSON or YAML, and the format of the object must match the format of your CloudFormation template file. See [Amazon States Language](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-amazon-states-language.html) .","DefinitionS3Location":"The name of the S3 bucket where the state machine definition is stored. The state machine definition must be a JSON or YAML file.","DefinitionString":"The Amazon States Language definition of the state machine. The state machine definition must be in JSON. See [Amazon States Language](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-amazon-states-language.html) .","DefinitionSubstitutions":"A map (string to string) that specifies the mappings for placeholder variables in the state machine definition. This enables the customer to inject values obtained at runtime, for example from intrinsic functions, in the state machine definition. Variables can be template parameter names, resource logical IDs, resource attributes, or a variable in a key-value map.\\n\\nSubstitutions must follow the syntax: `${key_name}` or `${variable_1,variable_2,...}` .","LoggingConfiguration":"Defines what execution history events are logged and where they are logged.\\n\\n> By default, the `level` is set to `OFF` . For more information see [Log Levels](https://docs.aws.amazon.com/step-functions/latest/dg/cloudwatch-log-level.html) in the AWS Step Functions User Guide.","RoleArn":"The Amazon Resource Name (ARN) of the IAM role to use for this state machine.","StateMachineName":"The name of the state machine.\\n\\nA name must *not* contain:\\n\\n- white space\\n- brackets `< > { } [ ]`\\n- wildcard characters `? *`\\n- special characters `\\" # % \\\\ ^ | ~ ` $ & , ; : /`\\n- control characters ( `U+0000-001F` , `U+007F-009F` )\\n\\n> If you specify a name, you cannot perform updates that require replacement of this resource. You can perform updates that require no or some interruption. If you must replace the resource, specify a new name.","StateMachineType":"Determines whether a `STANDARD` or `EXPRESS` state machine is created. The default is `STANDARD` . You cannot update the `type` of a state machine once it has been created. For more information on `STANDARD` and `EXPRESS` workflows, see [Standard Versus Express Workflows](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html) in the AWS Step Functions Developer Guide.","Tags":"The list of tags to add to a resource.\\n\\nTags may only contain Unicode letters, digits, white space, or these symbols: `_ . : / = + - @` .","TracingConfiguration":"Selects whether or not the state machine\'s AWS X-Ray tracing is enabled."}},"AWS::StepFunctions::StateMachine.CloudWatchLogsLogGroup":{"attributes":{},"description":"Defines a CloudWatch log group.\\n\\n> For more information see [Standard Versus Express Workflows](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html) in the AWS Step Functions Developer Guide.","properties":{"LogGroupArn":"The ARN of the the CloudWatch log group to which you want your logs emitted to. The ARN must end with `:*`"}},"AWS::StepFunctions::StateMachine.LogDestination":{"attributes":{},"description":"Defines a destination for `LoggingConfiguration` .\\n\\n> For more information on logging with `EXPRESS` workflows, see [Logging Express Workflows Using CloudWatch Logs](https://docs.aws.amazon.com/step-functions/latest/dg/cw-logs.html) .","properties":{"CloudWatchLogsLogGroup":"An object describing a CloudWatch log group. For more information, see [AWS::Logs::LogGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html) in the AWS CloudFormation User Guide."}},"AWS::StepFunctions::StateMachine.LoggingConfiguration":{"attributes":{},"description":"Defines what execution history events are logged and where they are logged.\\n\\nStep Functions provides the log levels — `OFF` , `ALL` , `ERROR` , and `FATAL` . No event types log when set to `OFF` and all event types do when set to `ALL` .\\n\\n> By default, the `level` is set to `OFF` . For more information see [Log Levels](https://docs.aws.amazon.com/step-functions/latest/dg/cloudwatch-log-level.html) in the AWS Step Functions User Guide.","properties":{"Destinations":"An array of objects that describes where your execution history events will be logged. Limited to size 1. Required, if your log level is not set to `OFF` .","IncludeExecutionData":"Determines whether execution data is included in your log. When set to `false` , data is excluded.","Level":"Defines which category of execution history events are logged."}},"AWS::StepFunctions::StateMachine.S3Location":{"attributes":{},"description":"Defines the S3 bucket location where a state machine definition is stored. The state machine definition must be a JSON or YAML file.","properties":{"Bucket":"The name of the S3 bucket where the state machine definition JSON or YAML file is stored.","Key":"The name of the state machine definition file (Amazon S3 object name).","Version":"For versioning-enabled buckets, a specific version of the state machine definition."}},"AWS::StepFunctions::StateMachine.TagsEntry":{"attributes":{},"description":"The `TagsEntry` property specifies *tags* to identify a state machine.","properties":{"Key":"The `key` for a key-value pair in a tag entry.","Value":"The `value` for a key-value pair in a tag entry."}},"AWS::StepFunctions::StateMachine.TracingConfiguration":{"attributes":{},"description":"Selects whether or not the state machine\'s AWS X-Ray tracing is enabled. To configure your state machine to send trace data to X-Ray, set `Enabled` to `true` .","properties":{"Enabled":"When set to `true` , X-Ray tracing is enabled."}},"AWS::StepFunctions::StateMachineAlias":{"attributes":{"Arn":"Returns the ARN of the state machine alias. For example, `arn:aws:states:us-east-1:123456789012:stateMachine:myStateMachine:PROD` .","Ref":"When you provide the logical ID of this resource to the `Ref` intrinsic function, `Ref` returns the ARN of the created state machine alias. For example,\\n\\n`{ \\"Ref\\": \\"PROD\\" }` \\n\\nReturns the ARN of the created state machine alias as shown in the following example.\\n\\n`arn:aws:states:us-east-1:123456789012:stateMachine:myStateMachine:PROD`\\n\\nFor more information about using `Ref` , see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Represents a state machine [alias](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-state-machine-alias.html) . An alias routes traffic to one or two versions of the same state machine.\\n\\nYou can create up to 100 aliases for each state machine.","properties":{"DeploymentPreference":"The settings that enable gradual state machine deployments. These settings include [Alarms](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html#cfn-stepfunctions-statemachinealias-deploymentpreference-alarms) , [Interval](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html#cfn-stepfunctions-statemachinealias-deploymentpreference-interval) , [Percentage](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html#cfn-stepfunctions-statemachinealias-deploymentpreference-percentage) , [StateMachineVersionArn](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html#cfn-stepfunctions-statemachinealias-deploymentpreference-statemachineversionarn) , and [Type](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html#cfn-stepfunctions-statemachinealias-deploymentpreference-type) .\\n\\nCloudFormation automatically shifts traffic from the version an alias currently points to, to a new state machine version that you specify.\\n\\n> `RoutingConfiguration` and `DeploymentPreference` are mutually exclusive properties. You must define only one of these properties. \\n\\nBased on the type of deployment you want to perform, you can specify one of the following settings:\\n\\n- `LINEAR` - Shifts traffic to the new version in equal increments with an equal number of seconds between each increment.\\n\\nFor example, if you specify the increment percent as `20` with an interval of `600` seconds, this deployment increases traffic by 20 percent every 600 seconds until the new version receives 100 percent of the traffic. This deployment immediately rolls back the new version if any Amazon CloudWatch alarms are triggered.\\n- `ALL_AT_ONCE` - Shifts 100 percent of traffic to the new version immediately. CloudFormation monitors the new version and rolls it back automatically to the previous version if any CloudWatch alarms are triggered.\\n- `CANARY` - Shifts traffic in two increments.\\n\\nIn the first increment, a small percentage of traffic, for example, 10 percent is shifted to the new version. In the second increment, before a specified time interval in seconds gets over, the remaining traffic is shifted to the new version. The shift to the new version for the remaining traffic takes place only if no CloudWatch alarms are triggered during the specified time interval.","Description":"An optional description of the state machine alias.","Name":"The name of the state machine alias. If you don\'t provide a name, it uses an automatically generated name based on the logical ID.","RoutingConfiguration":"The routing configuration of an alias. Routing configuration splits [StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html) requests between one or two versions of the same state machine.\\n\\nUse `RoutingConfiguration` if you want to explicitly set the alias [weights](https://docs.aws.amazon.com/step-functions/latest/apireference/API_RoutingConfigurationListItem.html#StepFunctions-Type-RoutingConfigurationListItem-weight) . Weight is the percentage of traffic you want to route to a state machine version.\\n\\n> `RoutingConfiguration` and `DeploymentPreference` are mutually exclusive properties. You must define only one of these properties."}},"AWS::StepFunctions::StateMachineAlias.DeploymentPreference":{"attributes":{},"description":"Enables gradual state machine deployments. CloudFormation automatically shifts traffic from the version the alias currently points to, to a new state machine version that you specify.","properties":{"Alarms":"A list of Amazon CloudWatch alarms to be monitored during the deployment. The deployment fails and rolls back if any of these alarms go into the `ALARM` state.","Interval":"The time in minutes between each traffic shifting increment.","Percentage":"The percentage of traffic to shift to the new version in each increment.","StateMachineVersionArn":"The Amazon Resource Name (ARN) of the [`AWS::StepFunctions::StateMachineVersion`](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachineversion.html) resource that will be the final version to which the alias points to when the traffic shifting is complete.\\n\\nWhile performing gradual deployments, you can only provide a single state machine version ARN. To explicitly set version weights in a CloudFormation template, use `RoutingConfiguration` instead.","Type":"The type of deployment you want to perform. You can specify one of the following types:\\n\\n- `LINEAR` - Shifts traffic to the new version in equal increments with an equal number of seconds between each increment.\\n\\nFor example, if you specify the increment percent as `20` with an interval of `600` seconds, this deployment increases traffic by 20 percent every 600 seconds until the new version receives 100 percent of the traffic. This deployment immediately rolls back the new version if any CloudWatch alarms are triggered.\\n- `ALL_AT_ONCE` - Shifts 100 percent of traffic to the new version immediately. CloudFormation monitors the new version and rolls it back automatically to the previous version if any CloudWatch alarms are triggered.\\n- `CANARY` - Shifts traffic in two increments.\\n\\nIn the first increment, a small percentage of traffic, for example, 10 percent is shifted to the new version. In the second increment, before a specified time interval in seconds gets over, the remaining traffic is shifted to the new version. The shift to the new version for the remaining traffic takes place only if no CloudWatch alarms are triggered during the specified time interval."}},"AWS::StepFunctions::StateMachineAlias.RoutingConfigurationVersion":{"attributes":{},"description":"The state machine version to which you want to route the execution traffic.","properties":{"StateMachineVersionArn":"The Amazon Resource Name (ARN) that identifies one or two state machine versions defined in the routing configuration.\\n\\nIf you specify the ARN of a second version, it must belong to the same state machine as the first version.","Weight":"The percentage of traffic you want to route to the state machine version. The sum of the weights in the routing configuration must be equal to 100."}},"AWS::StepFunctions::StateMachineVersion":{"attributes":{"Arn":"Returns the ARN of the state machine version. For example, `arn:aws:states:us-east-1:123456789012:stateMachine:myStateMachine:1` .","Ref":"When you provide the logical ID of this resource to the `Ref` intrinsic function, `Ref` returns the ARN of the published state machine version. For example, `arn:aws:states:us-east-1:123456789012:stateMachine:myStateMachine:1.`\\n\\nFor more information about using `Ref` , see [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) ."},"description":"Represents a state machine [version](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-state-machine-version.html) . A published version uses the latest state machine [*revision*](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-state-machine-version.html) . A revision is an immutable, read-only snapshot of a state machine’s definition and configuration.\\n\\nYou can publish up to 1000 versions for each state machine.\\n\\n> Before you delete a version, make sure that version\'s ARN isn\'t being referenced in any long-running workflows or application code outside of the stack.","properties":{"Description":"An optional description of the state machine version.","StateMachineArn":"The Amazon Resource Name (ARN) of the state machine.","StateMachineRevisionId":"Identifier for a state machine revision, which is an immutable, read-only snapshot of a state machine’s definition and configuration.\\n\\nOnly publish the state machine version if the current state machine\'s revision ID matches the specified ID. Use this option to avoid publishing a version if the state machine has changed since you last updated it.\\n\\nTo specify the initial state machine revision, set the value as `INITIAL` ."}},"AWS::SupportApp::AccountAlias":{"attributes":{"AccountAliasResourceId":"The `AccountAlias` resource type has an attribute `AccountAliasResourceId` . You can use this attribute to identify the resource.\\n\\nThe `AccountAliasResourceId` will be `AccountAlias_for_accountId` . In this example, `AccountAlias_for_` is the prefix and `accountId` is your AWS account number, such as `AccountAlias_for_123456789012` ."},"description":"You can use the `AWS::SupportApp::AccountAlias` resource to specify your AWS account when you configure the AWS Support App in Slack. Your alias name appears on the AWS Support App page in the Support Center Console and in messages from the AWS Support App. You can use this alias to identify the account you\'ve configured with the AWS Support App .\\n\\nFor more information, see [AWS Support App in Slack](https://docs.aws.amazon.com/awssupport/latest/user/aws-support-app-for-slack.html) in the *AWS Support User Guide* .","properties":{"AccountAlias":"An alias or short name for an AWS account ."}},"AWS::SupportApp::SlackChannelConfiguration":{"attributes":{},"description":"You can use the `AWS::SupportApp::SlackChannelConfiguration` resource to specify your AWS account when you configure the AWS Support App . This resource includes the following information:\\n\\n- The Slack channel name and ID\\n- The team ID in Slack\\n- The Amazon Resource Name (ARN) of the AWS Identity and Access Management ( IAM ) role\\n- Whether you want the AWS Support App to notify you when your support cases are created, updated, resolved, or reopened\\n- The case severity that you want to get notified for\\n\\nFor more information, see the following topics in the *AWS Support User Guide* :\\n\\n- [AWS Support App in Slack](https://docs.aws.amazon.com/awssupport/latest/user/aws-support-app-for-slack.html)\\n- [Creating AWS Support App in Slack resources with AWS CloudFormation](https://docs.aws.amazon.com/awssupport/latest/user/creating-resources-with-cloudformation.html)","properties":{"ChannelId":"The channel ID in Slack. This ID identifies a channel within a Slack workspace.","ChannelName":"The channel name in Slack. This is the channel where you invite the AWS Support App .","ChannelRoleArn":"The Amazon Resource Name (ARN) of the IAM role for this Slack channel configuration. The AWS Support App uses this role to perform AWS Support and Service Quotas actions on your behalf.","NotifyOnAddCorrespondenceToCase":"Whether to get notified when a correspondence is added to your support cases.","NotifyOnCaseSeverity":"The case severity for your support cases that you want to receive notifications. You can specify `none` , `all` , or `high` .","NotifyOnCreateOrReopenCase":"Whether to get notified when your support cases are created or reopened","NotifyOnResolveCase":"Whether to get notified when your support cases are resolved.","TeamId":"The team ID in Slack. This ID uniquely identifies a Slack workspace."}},"AWS::SupportApp::SlackWorkspaceConfiguration":{"attributes":{"Ref":"`Ref` returns the ID of the Slack workspace, such as `T012ABCDEFG` .\\n\\nFor the AWS Support App Slack workspace configuration, `Ref` returns the value of the Slack workspace ID."},"description":"You can use the `AWS::SupportApp::SlackWorkspaceConfiguration` resource to specify your Slack workspace configuration. This resource configures your AWS account so that you can use the specified Slack workspace in the AWS Support App . This resource includes the following information:\\n\\n- The team ID for the Slack workspace\\n- The version ID of the resource to use with AWS CloudFormation\\n\\nFor more information, see the following topics in the *AWS Support User Guide* :\\n\\n- [AWS Support App in Slack](https://docs.aws.amazon.com/awssupport/latest/user/aws-support-app-for-slack.html)\\n- [Creating AWS Support App in Slack resources with AWS CloudFormation](https://docs.aws.amazon.com/awssupport/latest/user/creating-resources-with-cloudformation.html)","properties":{"TeamId":"The team ID in Slack. This ID uniquely identifies a Slack workspace, such as `T012ABCDEFG` .","VersionId":"An identifier used to update an existing Slack workspace configuration in AWS CloudFormation , such as `100` ."}},"AWS::Synthetics::Canary":{"attributes":{"Code.SourceLocationArn":"`Ref` returns the ARN of the Lambda layer where Synthetics stores the canary script code.","Id":"The ID of the canary.","Ref":"`Ref` returns the name of the canary, such as `MyCanary` .","State":"The state of the canary. For example, `RUNNING` ."},"description":"Creates or updates a canary. Canaries are scripts that monitor your endpoints and APIs from the outside-in. Canaries help you check the availability and latency of your web services and troubleshoot anomalies by investigating load time data, screenshots of the UI, logs, and metrics. You can set up a canary to run continuously or just once.\\n\\nTo create canaries, you must have the `CloudWatchSyntheticsFullAccess` policy. If you are creating a new IAM role for the canary, you also need the the `iam:CreateRole` , `iam:CreatePolicy` and `iam:AttachRolePolicy` permissions. For more information, see [Necessary Roles and Permissions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Roles) .\\n\\nDo not include secrets or proprietary information in your canary names. The canary name makes up part of the Amazon Resource Name (ARN) for the canary, and the ARN is included in outbound calls over the internet. For more information, see [Security Considerations for Synthetics Canaries](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/servicelens_canaries_security.html) .","properties":{"ArtifactConfig":"A structure that contains the configuration for canary artifacts, including the encryption-at-rest settings for artifacts that the canary uploads to Amazon S3.","ArtifactS3Location":"The location in Amazon S3 where Synthetics stores artifacts from the runs of this canary. Artifacts include the log file, screenshots, and HAR files. Specify the full location path, including `s3://` at the beginning of the path.","Code":"Use this structure to input your script code for the canary. This structure contains the Lambda handler with the location where the canary should start running the script. If the script is stored in an S3 bucket, the bucket name, key, and version are also included. If the script is passed into the canary directly, the script code is contained in the value of `Script` .","ExecutionRoleArn":"The ARN of the IAM role to be used to run the canary. This role must already exist, and must include `lambda.amazonaws.com` as a principal in the trust policy. The role must also have the following permissions:\\n\\n- `s3:PutObject`\\n- `s3:GetBucketLocation`\\n- `s3:ListAllMyBuckets`\\n- `cloudwatch:PutMetricData`\\n- `logs:CreateLogGroup`\\n- `logs:CreateLogStream`\\n- `logs:PutLogEvents`","FailureRetentionPeriod":"The number of days to retain data about failed runs of this canary. If you omit this field, the default of 31 days is used. The valid range is 1 to 455 days.","Name":"The name for this canary. Be sure to give it a descriptive name that distinguishes it from other canaries in your account.\\n\\nDo not include secrets or proprietary information in your canary names. The canary name makes up part of the canary ARN, and the ARN is included in outbound calls over the internet. For more information, see [Security Considerations for Synthetics Canaries](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/servicelens_canaries_security.html) .","RunConfig":"A structure that contains input information for a canary run. If you omit this structure, the frequency of the canary is used as canary\'s timeout value, up to a maximum of 900 seconds.","RuntimeVersion":"Specifies the runtime version to use for the canary. For more information about runtime versions, see [Canary Runtime Versions](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Library.html) .","Schedule":"A structure that contains information about how often the canary is to run, and when these runs are to stop.","StartCanaryAfterCreation":"Specify TRUE to have the canary start making runs immediately after it is created.\\n\\nA canary that you create using CloudFormation can\'t be used to monitor the CloudFormation stack that creates the canary or to roll back that stack if there is a failure.","SuccessRetentionPeriod":"The number of days to retain data about successful runs of this canary. If you omit this field, the default of 31 days is used. The valid range is 1 to 455 days.","Tags":"The list of key-value pairs that are associated with the canary.","VPCConfig":"If this canary is to test an endpoint in a VPC, this structure contains information about the subnet and security groups of the VPC endpoint. For more information, see [Running a Canary in a VPC](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_VPC.html) .","VisualReference":"If this canary performs visual monitoring by comparing screenshots, this structure contains the ID of the canary run to use as the baseline for screenshots, and the coordinates of any parts of the screen to ignore during the visual monitoring comparison."}},"AWS::Synthetics::Canary.ArtifactConfig":{"attributes":{},"description":"A structure that contains the configuration for canary artifacts, including the encryption-at-rest settings for artifacts that the canary uploads to Amazon S3 .","properties":{"S3Encryption":"A structure that contains the configuration of the encryption-at-rest settings for artifacts that the canary uploads to Amazon S3 . Artifact encryption functionality is available only for canaries that use Synthetics runtime version syn-nodejs-puppeteer-3.3 or later. For more information, see [Encrypting canary artifacts](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_artifact_encryption.html) ."}},"AWS::Synthetics::Canary.BaseScreenshot":{"attributes":{},"description":"A structure representing a screenshot that is used as a baseline during visual monitoring comparisons made by the canary.","properties":{"IgnoreCoordinates":"Coordinates that define the part of a screen to ignore during screenshot comparisons. To obtain the coordinates to use here, use the CloudWatch console to draw the boundaries on the screen. For more information, see [Edit or delete a canary](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/synthetics_canaries_deletion.html) .","ScreenshotName":"The name of the screenshot. This is generated the first time the canary is run after the `UpdateCanary` operation that specified for this canary to perform visual monitoring."}},"AWS::Synthetics::Canary.Code":{"attributes":{},"description":"Use this structure to input your script code for the canary. This structure contains the Lambda handler with the location where the canary should start running the script. If the script is stored in an S3 bucket, the bucket name, key, and version are also included. If the script is passed into the canary directly, the script code is contained in the value of `Script` .","properties":{"Handler":"The entry point to use for the source code when running the canary. For canaries that use the `syn-python-selenium-1.0` runtime or a `syn-nodejs.puppeteer` runtime earlier than `syn-nodejs.puppeteer-3.4` , the handler must be specified as `*fileName* .handler` . For `syn-python-selenium-1.1` , `syn-nodejs.puppeteer-3.4` , and later runtimes, the handler can be specified as `*fileName* . *functionName*` , or you can specify a folder where canary scripts reside as `*folder* / *fileName* . *functionName*` .","S3Bucket":"If your canary script is located in S3, specify the bucket name here. The bucket must already exist.","S3Key":"The S3 key of your script. For more information, see [Working with Amazon S3 Objects](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingObjects.html) .","S3ObjectVersion":"The S3 version ID of your script.","Script":"If you input your canary script directly into the canary instead of referring to an S3 location, the value of this parameter is the script in plain text. It can be up to 5 MB.","SourceLocationArn":"The ARN of the Lambda layer where Synthetics stores the canary script code."}},"AWS::Synthetics::Canary.RunConfig":{"attributes":{},"description":"A structure that contains input information for a canary run. This structure is required.","properties":{"ActiveTracing":"Specifies whether this canary is to use active AWS X-Ray tracing when it runs. Active tracing enables this canary run to be displayed in the ServiceLens and X-Ray service maps even if the canary does not hit an endpoint that has X-Ray tracing enabled. Using X-Ray tracing incurs charges. For more information, see [Canaries and X-Ray tracing](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_tracing.html) .\\n\\nYou can enable active tracing only for canaries that use version `syn-nodejs-2.0` or later for their canary runtime.","EnvironmentVariables":"Specifies the keys and values to use for any environment variables used in the canary script. Use the following format:\\n\\n{ \\"key1\\" : \\"value1\\", \\"key2\\" : \\"value2\\", ...}\\n\\nKeys must start with a letter and be at least two characters. The total size of your environment variables cannot exceed 4 KB. You can\'t specify any Lambda reserved environment variables as the keys for your environment variables. For more information about reserved keys, see [Runtime environment variables](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime) .","MemoryInMB":"The maximum amount of memory that the canary can use while running. This value must be a multiple of 64. The range is 960 to 3008.","TimeoutInSeconds":"How long the canary is allowed to run before it must stop. You can\'t set this time to be longer than the frequency of the runs of this canary.\\n\\nIf you omit this field, the frequency of the canary is used as this value, up to a maximum of 900 seconds."}},"AWS::Synthetics::Canary.S3Encryption":{"attributes":{},"description":"A structure that contains the configuration of the encryption-at-rest settings for artifacts that the canary uploads to Amazon S3 . Artifact encryption functionality is available only for canaries that use Synthetics runtime version syn-nodejs-puppeteer-3.3 or later. For more information, see [Encrypting canary artifacts](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_artifact_encryption.html) .","properties":{"EncryptionMode":"The encryption method to use for artifacts created by this canary. Specify `SSE_S3` to use server-side encryption (SSE) with an Amazon S3-managed key. Specify `SSE-KMS` to use server-side encryption with a customer-managed AWS KMS key.\\n\\nIf you omit this parameter, an AWS -managed AWS KMS key is used.","KmsKeyArn":"The ARN of the customer-managed AWS KMS key to use, if you specify `SSE-KMS` for `EncryptionMode`"}},"AWS::Synthetics::Canary.Schedule":{"attributes":{},"description":"This structure specifies how often a canary is to make runs and the date and time when it should stop making runs.","properties":{"DurationInSeconds":"How long, in seconds, for the canary to continue making regular runs according to the schedule in the `Expression` value. If you specify 0, the canary continues making runs until you stop it. If you omit this field, the default of 0 is used.","Expression":"A `rate` expression or a `cron` expression that defines how often the canary is to run.\\n\\nFor a rate expression, The syntax is `rate( *number unit* )` . *unit* can be `minute` , `minutes` , or `hour` .\\n\\nFor example, `rate(1 minute)` runs the canary once a minute, `rate(10 minutes)` runs it once every 10 minutes, and `rate(1 hour)` runs it once every hour. You can specify a frequency between `rate(1 minute)` and `rate(1 hour)` .\\n\\nSpecifying `rate(0 minute)` or `rate(0 hour)` is a special value that causes the canary to run only once when it is started.\\n\\nUse `cron( *expression* )` to specify a cron expression. You can\'t schedule a canary to wait for more than a year before running. For information about the syntax for cron expressions, see [Scheduling canary runs using cron](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_cron.html) ."}},"AWS::Synthetics::Canary.VPCConfig":{"attributes":{},"description":"If this canary is to test an endpoint in a VPC, this structure contains information about the subnet and security groups of the VPC endpoint. For more information, see [Running a Canary in a VPC](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_VPC.html) .","properties":{"SecurityGroupIds":"The IDs of the security groups for this canary.","SubnetIds":"The IDs of the subnets where this canary is to run.","VpcId":"The ID of the VPC where this canary is to run."}},"AWS::Synthetics::Canary.VisualReference":{"attributes":{},"description":"Defines the screenshots to use as the baseline for comparisons during visual monitoring comparisons during future runs of this canary. If you omit this parameter, no changes are made to any baseline screenshots that the canary might be using already.\\n\\nVisual monitoring is supported only on canaries running the *syn-puppeteer-node-3.2* runtime or later. For more information, see [Visual monitoring](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Library_SyntheticsLogger_VisualTesting.html) and [Visual monitoring blueprint](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Blueprints_VisualTesting.html)","properties":{"BaseCanaryRunId":"Specifies which canary run to use the screenshots from as the baseline for future visual monitoring with this canary. Valid values are `nextrun` to use the screenshots from the next run after this update is made, `lastrun` to use the screenshots from the most recent run before this update was made, or the value of `Id` in the [CanaryRun](https://docs.aws.amazon.com/AmazonSynthetics/latest/APIReference/API_CanaryRun.html) from any past run of this canary.","BaseScreenshots":"An array of screenshots that are used as the baseline for comparisons during visual monitoring."}},"AWS::Synthetics::Group":{"attributes":{"Id":"The Id of the group.","Ref":"`Ref` returns the name of the group."},"description":"Creates or updates a group which you can use to associate canaries with each other, including cross-Region canaries. Using groups can help you with managing and automating your canaries, and you can also view aggregated run results and statistics for all canaries in a group.\\n\\nGroups are global resources. When you create a group, it is replicated across all AWS Regions, and you can add canaries from any Region to it, and view it in any Region. Although the group ARN format reflects the Region name where it was created, a group is not constrained to any Region. This means that you can put canaries from multiple Regions into the same group, and then use that group to view and manage all of those canaries in a single view.\\n\\nEach group can contain as many as 10 canaries. You can have as many as 20 groups in your account. Any single canary can be a member of up to 10 groups.","properties":{"Name":"A name for the group. It can include any Unicode characters.\\n\\nThe names for all groups in your account, across all Regions, must be unique.","ResourceArns":"The ARNs of the canaries that you want to associate with this group.","Tags":"The list of key-value pairs that are associated with the group."}},"AWS::SystemsManagerSAP::Application":{"attributes":{"Arn":"The Amazon Resource Name of the SAP application.","Ref":""},"description":"An SAP application registered with AWS Systems Manager for SAP.","properties":{"ApplicationId":"The ID of the application.","ApplicationType":"The type of the application.","Credentials":"The credentials of the SAP application.","Instances":"The Amazon EC2 instances on which your SAP application is running.","SapInstanceNumber":"The SAP instance number of the application.","Sid":"The System ID of the application.","Tags":"The tags on the application."}},"AWS::SystemsManagerSAP::Application.Credential":{"attributes":{},"description":"The credentials of your SAP application.","properties":{"CredentialType":"The type of the application credentials.","DatabaseName":"The name of the SAP HANA database.","SecretId":"The secret ID created in AWS Secrets Manager to store the credentials of the SAP application."}},"AWS::Timestream::Database":{"attributes":{"Arn":"The `arn` of the database.","Ref":"`Ref` returns the database name `DATABASE_NAME` ."},"description":"Creates a new Timestream database. If the AWS KMS key is not specified, the database will be encrypted with a Timestream managed AWS KMS key located in your account. Refer to [AWS managed AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) for more info. [Service quotas apply](https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html) . See [code sample](https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.create-db.html) for details.","properties":{"DatabaseName":"The name of the Timestream database.\\n\\n*Length Constraints* : Minimum length of 3 bytes. Maximum length of 256 bytes.","KmsKeyId":"The identifier of the AWS KMS key used to encrypt the data stored in the database.","Tags":"The tags to add to the database."}},"AWS::Timestream::ScheduledQuery":{"attributes":{"Arn":"The `ARN` of the scheduled query.","Ref":"`Ref` returns the scheduled query ARN.","SQErrorReportConfiguration":"The scheduled query error reporting configuration.","SQKmsKeyId":"The KMS key used to encrypt the query resource, if a customer managed KMS key was provided.","SQName":"The scheduled query name.","SQNotificationConfiguration":"The scheduled query notification configuration.","SQQueryString":"The scheduled query string..","SQScheduleConfiguration":"The scheduled query schedule configuration.","SQScheduledQueryExecutionRoleArn":"The ARN of the IAM role that will be used by Timestream to run the query.","SQTargetConfiguration":"The configuration for query output."},"description":"Create a scheduled query that will be run on your behalf at the configured schedule. Timestream assumes the execution role provided as part of the `ScheduledQueryExecutionRoleArn` parameter to run the query. You can use the `NotificationConfiguration` parameter to configure notification for your scheduled query operations.","properties":{"ClientToken":"Using a ClientToken makes the call to CreateScheduledQuery idempotent, in other words, making the same request repeatedly will produce the same result. Making multiple identical CreateScheduledQuery requests has the same effect as making a single request.\\n\\n- If CreateScheduledQuery is called without a `ClientToken` , the Query SDK generates a `ClientToken` on your behalf.\\n- After 8 hours, any request with the same `ClientToken` is treated as a new request.","ErrorReportConfiguration":"Configuration for error reporting. Error reports will be generated when a problem is encountered when writing the query results.","KmsKeyId":"The Amazon KMS key used to encrypt the scheduled query resource, at-rest. If the Amazon KMS key is not specified, the scheduled query resource will be encrypted with a Timestream owned Amazon KMS key. To specify a KMS key, use the key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix the name with *alias/*\\n\\nIf ErrorReportConfiguration uses `SSE_KMS` as encryption type, the same KmsKeyId is used to encrypt the error report at rest.","NotificationConfiguration":"Notification configuration for the scheduled query. A notification is sent by Timestream when a query run finishes, when the state is updated or when you delete it.","QueryString":"The query string to run. Parameter names can be specified in the query string `@` character followed by an identifier. The named Parameter `@scheduled_runtime` is reserved and can be used in the query to get the time at which the query is scheduled to run.\\n\\nThe timestamp calculated according to the ScheduleConfiguration parameter, will be the value of `@scheduled_runtime` paramater for each query run. For example, consider an instance of a scheduled query executing on 2021-12-01 00:00:00. For this instance, the `@scheduled_runtime` parameter is initialized to the timestamp 2021-12-01 00:00:00 when invoking the query.","ScheduleConfiguration":"Schedule configuration.","ScheduledQueryExecutionRoleArn":"The ARN for the IAM role that Timestream will assume when running the scheduled query.","ScheduledQueryName":"A name for the query. Scheduled query names must be unique within each Region.","Tags":"A list of key-value pairs to label the scheduled query.","TargetConfiguration":"Scheduled query target store configuration."}},"AWS::Timestream::ScheduledQuery.DimensionMapping":{"attributes":{},"description":"This type is used to map column(s) from the query result to a dimension in the destination table.","properties":{"DimensionValueType":"Type for the dimension: VARCHAR","Name":"Column name from query result."}},"AWS::Timestream::ScheduledQuery.ErrorReportConfiguration":{"attributes":{},"description":"Configuration required for error reporting.","properties":{"S3Configuration":"The S3 configuration for the error reports."}},"AWS::Timestream::ScheduledQuery.MixedMeasureMapping":{"attributes":{},"description":"MixedMeasureMappings are mappings that can be used to ingest data into a mixture of narrow and multi measures in the derived table.","properties":{"MeasureName":"Refers to the value of measure_name in a result row. This field is required if MeasureNameColumn is provided.","MeasureValueType":"Type of the value that is to be read from sourceColumn. If the mapping is for MULTI, use MeasureValueType.MULTI.","MultiMeasureAttributeMappings":"Required when measureValueType is MULTI. Attribute mappings for MULTI value measures.","SourceColumn":"This field refers to the source column from which measure-value is to be read for result materialization.","TargetMeasureName":"Target measure name to be used. If not provided, the target measure name by default would be measure-name if provided, or sourceColumn otherwise."}},"AWS::Timestream::ScheduledQuery.MultiMeasureAttributeMapping":{"attributes":{},"description":"Attribute mapping for MULTI value measures.","properties":{"MeasureValueType":"Type of the attribute to be read from the source column.","SourceColumn":"Source column from where the attribute value is to be read.","TargetMultiMeasureAttributeName":"Custom name to be used for attribute name in derived table. If not provided, source column name would be used."}},"AWS::Timestream::ScheduledQuery.MultiMeasureMappings":{"attributes":{},"description":"Only one of MixedMeasureMappings or MultiMeasureMappings is to be provided. MultiMeasureMappings can be used to ingest data as multi measures in the derived table.","properties":{"MultiMeasureAttributeMappings":"Required. Attribute mappings to be used for mapping query results to ingest data for multi-measure attributes.","TargetMultiMeasureName":"The name of the target multi-measure name in the derived table. This input is required when measureNameColumn is not provided. If MeasureNameColumn is provided, then value from that column will be used as multi-measure name."}},"AWS::Timestream::ScheduledQuery.NotificationConfiguration":{"attributes":{},"description":"Notification configuration for a scheduled query. A notification is sent by Timestream when a scheduled query is created, its state is updated or when it is deleted.","properties":{"SnsConfiguration":"Details on SNS configuration."}},"AWS::Timestream::ScheduledQuery.S3Configuration":{"attributes":{},"description":"Details on S3 location for error reports that result from running a query.","properties":{"BucketName":"Name of the S3 bucket under which error reports will be created.","EncryptionOption":"Encryption at rest options for the error reports. If no encryption option is specified, Timestream will choose SSE_S3 as default.","ObjectKeyPrefix":"Prefix for the error report key. Timestream by default adds the following prefix to the error report path."}},"AWS::Timestream::ScheduledQuery.ScheduleConfiguration":{"attributes":{},"description":"Configuration of the schedule of the query.","properties":{"ScheduleExpression":"An expression that denotes when to trigger the scheduled query run. This can be a cron expression or a rate expression."}},"AWS::Timestream::ScheduledQuery.SnsConfiguration":{"attributes":{},"description":"Details on SNS that are required to send the notification.","properties":{"TopicArn":"SNS topic ARN that the scheduled query status notifications will be sent to."}},"AWS::Timestream::ScheduledQuery.TargetConfiguration":{"attributes":{},"description":"Configuration used for writing the output of a query.","properties":{"TimestreamConfiguration":"Configuration needed to write data into the Timestream database and table."}},"AWS::Timestream::ScheduledQuery.TimestreamConfiguration":{"attributes":{},"description":"Configuration to write data into Timestream database and table. This configuration allows the user to map the query result select columns into the destination table columns.","properties":{"DatabaseName":"Name of Timestream database to which the query result will be written.","DimensionMappings":"This is to allow mapping column(s) from the query result to the dimension in the destination table.","MeasureNameColumn":"Name of the measure column. Also see `MultiMeasureMappings` and `MixedMeasureMappings` for how measure name properties on those relate to `MeasureNameColumn` .","MixedMeasureMappings":"Specifies how to map measures to multi-measure records.","MultiMeasureMappings":"Multi-measure mappings.","TableName":"Name of Timestream table that the query result will be written to. The table should be within the same database that is provided in Timestream configuration.","TimeColumn":"Column from query result that should be used as the time column in destination table. Column type for this should be TIMESTAMP."}},"AWS::Timestream::Table":{"attributes":{"Arn":"The `arn` of the table.","Name":"The name of the table.","Ref":"`Ref` returns the table name `TABLE_NAME` in the form `DATABASE_NAME|TABLE_NAME` . `DATABASE_NAME` is the name of the Timestream database that the table is contained in."},"description":"The CreateTable operation adds a new table to an existing database in your account. In an AWS account, table names must be at least unique within each Region if they are in the same database. You may have identical table names in the same Region if the tables are in separate databases. While creating the table, you must specify the table name, database name, and the retention properties. [Service quotas apply](https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html) . See [code sample](https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.create-table.html) for details.","properties":{"DatabaseName":"The name of the Timestream database that contains this table.\\n\\n*Length Constraints* : Minimum length of 3 bytes. Maximum length of 256 bytes.","MagneticStoreWriteProperties":"Contains properties to set on the table when enabling magnetic store writes.\\n\\nThis object has the following attributes:\\n\\n- *EnableMagneticStoreWrites* : A `boolean` flag to enable magnetic store writes.\\n- *MagneticStoreRejectedDataLocation* : The location to write error reports for records rejected, asynchronously, during magnetic store writes. Only `S3Configuration` objects are allowed. The `S3Configuration` object has the following attributes:\\n\\n- *BucketName* : The name of the S3 bucket.\\n- *EncryptionOption* : The encryption option for the S3 location. Valid values are S3 server-side encryption with an S3 managed key ( `SSE_S3` ) or AWS managed key ( `SSE_KMS` ).\\n- *KmsKeyId* : The AWS KMS key ID to use when encrypting with an AWS managed key.\\n- *ObjectKeyPrefix* : The prefix to use option for the objects stored in S3.\\n\\nBoth `BucketName` and `EncryptionOption` are *required* when `S3Configuration` is specified. If you specify `SSE_KMS` as your `EncryptionOption` then `KmsKeyId` is *required* .\\n\\n`EnableMagneticStoreWrites` attribute is *required* when `MagneticStoreWriteProperties` is specified. `MagneticStoreRejectedDataLocation` attribute is *required* when `EnableMagneticStoreWrites` is set to `true` .\\n\\nSee the following examples:\\n\\n*JSON*\\n\\n```json\\n{ \\"Type\\" : AWS::Timestream::Table\\", \\"Properties\\":{ \\"DatabaseName\\":\\"TestDatabase\\", \\"TableName\\":\\"TestTable\\", \\"MagneticStoreWriteProperties\\":{ \\"EnableMagneticStoreWrites\\":true, \\"MagneticStoreRejectedDataLocation\\":{ \\"S3Configuration\\":{ \\"BucketName\\":\\"testbucket\\", \\"EncryptionOption\\":\\"SSE_KMS\\", \\"KmsKeyId\\":\\"1234abcd-12ab-34cd-56ef-1234567890ab\\", \\"ObjectKeyPrefix\\":\\"prefix\\" } } } }\\n}\\n```\\n\\n*YAML*\\n\\n```\\nType: AWS::Timestream::Table\\nDependsOn: TestDatabase\\nProperties: TableName: \\"TestTable\\" DatabaseName: \\"TestDatabase\\" MagneticStoreWriteProperties: EnableMagneticStoreWrites: true MagneticStoreRejectedDataLocation: S3Configuration: BucketName: \\"testbucket\\" EncryptionOption: \\"SSE_KMS\\" KmsKeyId: \\"1234abcd-12ab-34cd-56ef-1234567890ab\\" ObjectKeyPrefix: \\"prefix\\"\\n```","RetentionProperties":"The retention duration for the memory store and magnetic store. This object has the following attributes:\\n\\n- *MemoryStoreRetentionPeriodInHours* : Retention duration for memory store, in hours.\\n- *MagneticStoreRetentionPeriodInDays* : Retention duration for magnetic store, in days.\\n\\nBoth attributes are of type `string` . Both attributes are *required* when `RetentionProperties` is specified.\\n\\nSee the following examples:\\n\\n*JSON*\\n\\n`{ \\"Type\\" : AWS::Timestream::Table\\", \\"Properties\\" : { \\"DatabaseName\\" : \\"TestDatabase\\", \\"TableName\\" : \\"TestTable\\", \\"RetentionProperties\\" : { \\"MemoryStoreRetentionPeriodInHours\\": \\"24\\", \\"MagneticStoreRetentionPeriodInDays\\": \\"7\\" } } }` \\n\\n*YAML*\\n\\n```\\nType: AWS::Timestream::Table\\nDependsOn: TestDatabase\\nProperties: TableName: \\"TestTable\\" DatabaseName: \\"TestDatabase\\" RetentionProperties: MemoryStoreRetentionPeriodInHours: \\"24\\" MagneticStoreRetentionPeriodInDays: \\"7\\"\\n```","TableName":"The name of the Timestream table.\\n\\n*Length Constraints* : Minimum length of 3 bytes. Maximum length of 256 bytes.","Tags":"The tags to add to the table"}},"AWS::Timestream::Table.MagneticStoreRejectedDataLocation":{"attributes":{},"description":"The location to write error reports for records rejected, asynchronously, during magnetic store writes.","properties":{"S3Configuration":"Configuration of an S3 location to write error reports for records rejected, asynchronously, during magnetic store writes."}},"AWS::Timestream::Table.MagneticStoreWriteProperties":{"attributes":{},"description":"The set of properties on a table for configuring magnetic store writes.","properties":{"EnableMagneticStoreWrites":"A flag to enable magnetic store writes.","MagneticStoreRejectedDataLocation":"The location to write error reports for records rejected asynchronously during magnetic store writes."}},"AWS::Timestream::Table.RetentionProperties":{"attributes":{},"description":"Retention properties contain the duration for which your time-series data must be stored in the magnetic store and the memory store.","properties":{"MagneticStoreRetentionPeriodInDays":"The duration for which data must be stored in the magnetic store.","MemoryStoreRetentionPeriodInHours":"The duration for which data must be stored in the memory store."}},"AWS::Timestream::Table.S3Configuration":{"attributes":{},"description":"The configuration that specifies an S3 location.","properties":{"BucketName":"The bucket name of the customer S3 bucket.","EncryptionOption":"The encryption option for the customer S3 location. Options are S3 server-side encryption with an S3 managed key or AWS managed key.","KmsKeyId":"The AWS KMS key ID for the customer S3 location when encrypting with an AWS managed key.","ObjectKeyPrefix":"The object key preview for the customer S3 location."}},"AWS::Transfer::Agreement":{"attributes":{"AgreementId":"The unique identifier for the AS2 agreement, returned after the API call succeeds.","Ref":""},"description":"Creates an agreement. An agreement is a bilateral trading partner agreement, or partnership, between an AWS Transfer Family server and an AS2 process. The agreement defines the file and message transfer relationship between the server and the AS2 process. To define an agreement, Transfer Family combines a server, local profile, partner profile, certificate, and other attributes.\\n\\nThe partner is identified with the `PartnerProfileId` , and the AS2 process is identified with the `LocalProfileId` .","properties":{"AccessRole":"With AS2, you can send files by calling `StartFileTransfer` and specifying the file paths in the request parameter, `SendFilePaths` . We use the file’s parent directory (for example, for `--send-file-paths /bucket/dir/file.txt` , parent directory is `/bucket/dir/` ) to temporarily store a processed AS2 message file, store the MDN when we receive them from the partner, and write a final JSON file containing relevant metadata of the transmission. So, the `AccessRole` needs to provide read and write access to the parent directory of the file location used in the `StartFileTransfer` request. Additionally, you need to provide read and write access to the parent directory of the files that you intend to send with `StartFileTransfer` .\\n\\nIf you are using Basic authentication for your AS2 connector, the access role requires the `secretsmanager:GetSecretValue` permission for the secret. If the secret is encrypted using a customer-managed key instead of the AWS managed key in Secrets Manager, then the role also needs the `kms:Decrypt` permission for that key.","BaseDirectory":"The landing directory (folder) for files that are transferred by using the AS2 protocol.","Description":"The name or short description that\'s used to identify the agreement.","LocalProfileId":"A unique identifier for the AS2 local profile.","PartnerProfileId":"A unique identifier for the partner profile used in the agreement.","ServerId":"A system-assigned unique identifier for a server instance. This identifier indicates the specific server that the agreement uses.","Status":"The current status of the agreement, either `ACTIVE` or `INACTIVE` .","Tags":"Key-value pairs that can be used to group and search for agreements."}},"AWS::Transfer::Certificate":{"attributes":{"Arn":"The unique Amazon Resource Name (ARN) for the certificate.","CertificateId":"An array of identifiers for the imported certificates. You use this identifier for working with profiles and partner profiles.","NotAfterDate":"The final date that the certificate is valid.","NotBeforeDate":"The earliest date that the certificate is valid.","Ref":"`Ref` returns the `certificateId` , such as `cert-1c698edce1654f869` .","Serial":"The serial number for the certificate.","Status":"The certificate can be either `ACTIVE` , `PENDING_ROTATION` , or `INACTIVE` . `PENDING_ROTATION` means that this certificate will replace the current certificate when it expires.","Type":"If a private key has been specified for the certificate, its type is `CERTIFICATE_WITH_PRIVATE_KEY` . If there is no private key, the type is `CERTIFICATE` ."},"description":"Imports the signing and encryption certificates that you need to create local (AS2) profiles and partner profiles.","properties":{"ActiveDate":"An optional date that specifies when the certificate becomes active.","Certificate":"The file name for the certificate.","CertificateChain":"The list of certificates that make up the chain for the certificate.","Description":"The name or description that\'s used to identity the certificate.","InactiveDate":"An optional date that specifies when the certificate becomes inactive.","PrivateKey":"The file that contains the private key for the certificate that\'s being imported.","Tags":"Key-value pairs that can be used to group and search for certificates.","Usage":"Specifies whether this certificate is used for signing or encryption."}},"AWS::Transfer::Connector":{"attributes":{"Ref":""},"description":"Creates the connector, which captures the parameters for an outbound connection for the AS2 protocol. The connector is required for sending files to an externally hosted AS2 server. For more details about connectors, see [Create AS2 connectors](https://docs.aws.amazon.com/transfer/latest/userguide/create-b2b-server.html#configure-as2-connector) .","properties":{"AccessRole":"With AS2, you can send files by calling `StartFileTransfer` and specifying the file paths in the request parameter, `SendFilePaths` . We use the file’s parent directory (for example, for `--send-file-paths /bucket/dir/file.txt` , parent directory is `/bucket/dir/` ) to temporarily store a processed AS2 message file, store the MDN when we receive them from the partner, and write a final JSON file containing relevant metadata of the transmission. So, the `AccessRole` needs to provide read and write access to the parent directory of the file location used in the `StartFileTransfer` request. Additionally, you need to provide read and write access to the parent directory of the files that you intend to send with `StartFileTransfer` .\\n\\nIf you are using Basic authentication for your AS2 connector, the access role requires the `secretsmanager:GetSecretValue` permission for the secret. If the secret is encrypted using a customer-managed key instead of the AWS managed key in Secrets Manager, then the role also needs the `kms:Decrypt` permission for that key.","As2Config":"A structure that contains the parameters for a connector object.","LoggingRole":"The Amazon Resource Name (ARN) of the AWS Identity and Access Management (IAM) role that allows a connector to turn on CloudWatch logging for Amazon S3 events. When set, you can view connector activity in your CloudWatch logs.","Tags":"Key-value pairs that can be used to group and search for connectors.","Url":"The URL of the partner\'s AS2 endpoint."}},"AWS::Transfer::Connector.As2Config":{"attributes":{},"description":"A structure that contains the parameters for a connector object.","properties":{"Compression":"Specifies whether the AS2 file is compressed.","EncryptionAlgorithm":"The algorithm that is used to encrypt the file.\\n\\n> You can only specify `NONE` if the URL for your connector uses HTTPS. This ensures that no traffic is sent in clear text.","LocalProfileId":"A unique identifier for the AS2 local profile.","MdnResponse":"Used for outbound requests (from an AWS Transfer Family server to a partner AS2 server) to determine whether the partner response for transfers is synchronous or asynchronous. Specify either of the following values:\\n\\n- `SYNC` : The system expects a synchronous MDN response, confirming that the file was transferred successfully (or not).\\n- `NONE` : Specifies that no MDN response is required.","MdnSigningAlgorithm":"The signing algorithm for the MDN response.\\n\\n> If set to DEFAULT (or not set at all), the value for `SigningAlgorithm` is used.","MessageSubject":"Used as the `Subject` HTTP header attribute in AS2 messages that are being sent with the connector.","PartnerProfileId":"A unique identifier for the partner profile for the connector.","SigningAlgorithm":"The algorithm that is used to sign the AS2 messages sent with the connector."}},"AWS::Transfer::Profile":{"attributes":{"Arn":"The Amazon Resource Name associated with the profile, in the form `arn:aws:transfer:region:account-id:profile/profile-id/` .","ProfileId":"The unique identifier for the AS2 profile, returned after the API call succeeds.","Ref":""},"description":"Creates the local or partner profile to use for AS2 transfers.","properties":{"As2Id":"The `As2Id` is the *AS2-name* , as defined in the [RFC 4130](https://docs.aws.amazon.com/https://datatracker.ietf.org/doc/html/rfc4130) . For inbound transfers, this is the `AS2-From` header for the AS2 messages sent from the partner. For outbound connectors, this is the `AS2-To` header for the AS2 messages sent to the partner using the `StartFileTransfer` API operation. This ID cannot include spaces.","CertificateIds":"An array of identifiers for the imported certificates. You use this identifier for working with profiles and partner profiles.","ProfileType":"Indicates whether to list only `LOCAL` type profiles or only `PARTNER` type profiles. If not supplied in the request, the command lists all types of profiles.","Tags":"Key-value pairs that can be used to group and search for profiles."}},"AWS::Transfer::Server":{"attributes":{"Arn":"The Amazon Resource Name associated with the server, in the form `arn:aws:transfer:region: *account-id* :server/ *server-id* /` .\\n\\nAn example of a server ARN is: `arn:aws:transfer:us-east-1:123456789012:server/s-01234567890abcdef` .","Ref":"`Ref` returns the server ARN, such as `arn:aws:transfer:us-east-1:123456789012:server/s-01234567890abcdef` .","ServerId":"The service-assigned ID of the server that is created.\\n\\nAn example `ServerId` is `s-01234567890abcdef` ."},"description":"Instantiates an auto-scaling virtual server based on the selected file transfer protocol in AWS . When you make updates to your file transfer protocol-enabled server or when you work with users, use the service-generated `ServerId` property that is assigned to the newly created server.","properties":{"Certificate":"The Amazon Resource Name (ARN) of the AWS Certificate Manager (ACM) certificate. Required when `Protocols` is set to `FTPS` .\\n\\nTo request a new public certificate, see [Request a public certificate](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html) in the *AWS Certificate Manager User Guide* .\\n\\nTo import an existing certificate into ACM, see [Importing certificates into ACM](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html) in the *AWS Certificate Manager User Guide* .\\n\\nTo request a private certificate to use FTPS through private IP addresses, see [Request a private certificate](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-private.html) in the *AWS Certificate Manager User Guide* .\\n\\nCertificates with the following cryptographic algorithms and key sizes are supported:\\n\\n- 2048-bit RSA (RSA_2048)\\n- 4096-bit RSA (RSA_4096)\\n- Elliptic Prime Curve 256 bit (EC_prime256v1)\\n- Elliptic Prime Curve 384 bit (EC_secp384r1)\\n- Elliptic Prime Curve 521 bit (EC_secp521r1)\\n\\n> The certificate must be a valid SSL/TLS X.509 version 3 certificate with FQDN or IP address specified and information about the issuer.","Domain":"Specifies the domain of the storage system that is used for file transfers.","EndpointDetails":"The virtual private cloud (VPC) endpoint settings that are configured for your server. When you host your endpoint within your VPC, you can make your endpoint accessible only to resources within your VPC, or you can attach Elastic IP addresses and make your endpoint accessible to clients over the internet. Your VPC\'s default security groups are automatically assigned to your endpoint.","EndpointType":"The type of endpoint that you want your server to use. You can choose to make your server\'s endpoint publicly accessible (PUBLIC) or host it inside your VPC. With an endpoint that is hosted in a VPC, you can restrict access to your server and resources only within your VPC or choose to make it internet facing by attaching Elastic IP addresses directly to it.","IdentityProviderDetails":"Required when `IdentityProviderType` is set to `AWS_DIRECTORY_SERVICE` , `AWS _LAMBDA` or `API_GATEWAY` . Accepts an array containing all of the information required to use a directory in `AWS_DIRECTORY_SERVICE` or invoke a customer-supplied authentication API, including the API Gateway URL. Not required when `IdentityProviderType` is set to `SERVICE_MANAGED` .","IdentityProviderType":"The mode of authentication for a server. The default value is `SERVICE_MANAGED` , which allows you to store and access user credentials within the AWS Transfer Family service.\\n\\nUse `AWS_DIRECTORY_SERVICE` to provide access to Active Directory groups in AWS Directory Service for Microsoft Active Directory or Microsoft Active Directory in your on-premises environment or in AWS using AD Connector. This option also requires you to provide a Directory ID by using the `IdentityProviderDetails` parameter.\\n\\nUse the `API_GATEWAY` value to integrate with an identity provider of your choosing. The `API_GATEWAY` setting requires you to provide an Amazon API Gateway endpoint URL to call for authentication by using the `IdentityProviderDetails` parameter.\\n\\nUse the `AWS_LAMBDA` value to directly use an AWS Lambda function as your identity provider. If you choose this value, you must specify the ARN for the Lambda function in the `Function` parameter for the `IdentityProviderDetails` data type.","LoggingRole":"The Amazon Resource Name (ARN) of the AWS Identity and Access Management (IAM) role that allows a server to turn on Amazon CloudWatch logging for Amazon S3 or Amazon EFSevents. When set, you can view user activity in your CloudWatch logs.","PostAuthenticationLoginBanner":"Specifies a string to display when users connect to a server. This string is displayed after the user authenticates.\\n\\n> The SFTP protocol does not support post-authentication display banners.","PreAuthenticationLoginBanner":"Specifies a string to display when users connect to a server. This string is displayed before the user authenticates. For example, the following banner displays details about using the system:\\n\\n`This system is for the use of authorized users only. Individuals using this computer system without authority, or in excess of their authority, are subject to having all of their activities on this system monitored and recorded by system personnel.`","ProtocolDetails":"The protocol settings that are configured for your server.\\n\\n- To indicate passive mode (for FTP and FTPS protocols), use the `PassiveIp` parameter. Enter a single dotted-quad IPv4 address, such as the external IP address of a firewall, router, or load balancer.\\n- To ignore the error that is generated when the client attempts to use the `SETSTAT` command on a file that you are uploading to an Amazon S3 bucket, use the `SetStatOption` parameter. To have the AWS Transfer Family server ignore the `SETSTAT` command and upload files without needing to make any changes to your SFTP client, set the value to `ENABLE_NO_OP` . If you set the `SetStatOption` parameter to `ENABLE_NO_OP` , Transfer Family generates a log entry to Amazon CloudWatch Logs, so that you can determine when the client is making a `SETSTAT` call.\\n- To determine whether your AWS Transfer Family server resumes recent, negotiated sessions through a unique session ID, use the `TlsSessionResumptionMode` parameter.\\n- `As2Transports` indicates the transport method for the AS2 messages. Currently, only HTTP is supported.\\n\\nThe `Protocols` parameter is an array of strings.\\n\\n*Allowed values* : One or more of `SFTP` , `FTPS` , `FTP` , `AS2`","Protocols":"Specifies the file transfer protocol or protocols over which your file transfer protocol client can connect to your server\'s endpoint. The available protocols are:\\n\\n- `SFTP` (Secure Shell (SSH) File Transfer Protocol): File transfer over SSH\\n- `FTPS` (File Transfer Protocol Secure): File transfer with TLS encryption\\n- `FTP` (File Transfer Protocol): Unencrypted file transfer\\n- `AS2` (Applicability Statement 2): used for transporting structured business-to-business data\\n\\n> - If you select `FTPS` , you must choose a certificate stored in AWS Certificate Manager (ACM) which is used to identify your server when clients connect to it over FTPS.\\n> - If `Protocol` includes either `FTP` or `FTPS` , then the `EndpointType` must be `VPC` and the `IdentityProviderType` must be either `AWS_DIRECTORY_SERVICE` , `AWS_LAMBDA` , or `API_GATEWAY` .\\n> - If `Protocol` includes `FTP` , then `AddressAllocationIds` cannot be associated.\\n> - If `Protocol` is set only to `SFTP` , the `EndpointType` can be set to `PUBLIC` and the `IdentityProviderType` can be set any of the supported identity types: `SERVICE_MANAGED` , `AWS_DIRECTORY_SERVICE` , `AWS_LAMBDA` , or `API_GATEWAY` .\\n> - If `Protocol` includes `AS2` , then the `EndpointType` must be `VPC` , and domain must be Amazon S3. \\n\\nThe `Protocols` parameter is an array of strings.\\n\\n*Allowed values* : One or more of `SFTP` , `FTPS` , `FTP` , `AS2`","SecurityPolicyName":"Specifies the name of the security policy that is attached to the server.","StructuredLogDestinations":"Specifies the log groups to which your server logs are sent.\\n\\nTo specify a log group, you must provide the ARN for an existing log group. In this case, the format of the log group is as follows:\\n\\n`arn:aws:logs:region-name:amazon-account-id:log-group:log-group-name:*`\\n\\nFor example, `arn:aws:logs:us-east-1:111122223333:log-group:mytestgroup:*`\\n\\nIf you have previously specified a log group for a server, you can clear it, and in effect turn off structured logging, by providing an empty value for this parameter in an `update-server` call. For example:\\n\\n`update-server --server-id s-1234567890abcdef0 --structured-log-destinations`","Tags":"Key-value pairs that can be used to group and search for servers.","WorkflowDetails":"Specifies the workflow ID for the workflow to assign and the execution role that\'s used for executing the workflow.\\n\\nIn addition to a workflow to execute when a file is uploaded completely, `WorkflowDetails` can also contain a workflow ID (and execution role) for a workflow to execute on partial upload. A partial upload occurs when a file is open when the session disconnects."}},"AWS::Transfer::Server.As2Transport":{"attributes":{},"description":"Indicates the transport method for the AS2 messages. Currently, only HTTP is supported.\\n\\nThe `As2Transports` parameter is an array of `As2Transport` strings.\\n\\n*Required* : No\\n\\n*Type* : String\\n\\n*Allowed values* : `HTTP`\\n\\nUpdate requires: [No interruption](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)","properties":{}},"AWS::Transfer::Server.EndpointDetails":{"attributes":{},"description":"The virtual private cloud (VPC) endpoint settings that are configured for your server. When you host your endpoint within your VPC, you can make your endpoint accessible only to resources within your VPC, or you can attach Elastic IP addresses and make your endpoint accessible to clients over the internet. Your VPC\'s default security groups are automatically assigned to your endpoint.","properties":{"AddressAllocationIds":"A list of address allocation IDs that are required to attach an Elastic IP address to your server\'s endpoint.\\n\\n> This property can only be set when `EndpointType` is set to `VPC` and it is only valid in the `UpdateServer` API.","SecurityGroupIds":"A list of security groups IDs that are available to attach to your server\'s endpoint.\\n\\n> This property can only be set when `EndpointType` is set to `VPC` .\\n> \\n> You can edit the `SecurityGroupIds` property in the [UpdateServer](https://docs.aws.amazon.com/transfer/latest/userguide/API_UpdateServer.html) API only if you are changing the `EndpointType` from `PUBLIC` or `VPC_ENDPOINT` to `VPC` . To change security groups associated with your server\'s VPC endpoint after creation, use the Amazon EC2 [ModifyVpcEndpoint](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVpcEndpoint.html) API.","SubnetIds":"A list of subnet IDs that are required to host your server endpoint in your VPC.\\n\\n> This property can only be set when `EndpointType` is set to `VPC` .","VpcEndpointId":"The ID of the VPC endpoint.\\n\\n> This property can only be set when `EndpointType` is set to `VPC_ENDPOINT` .","VpcId":"The VPC ID of the virtual private cloud in which the server\'s endpoint will be hosted.\\n\\n> This property can only be set when `EndpointType` is set to `VPC` ."}},"AWS::Transfer::Server.IdentityProviderDetails":{"attributes":{},"description":"Required when `IdentityProviderType` is set to `AWS_DIRECTORY_SERVICE` , `AWS _LAMBDA` or `API_GATEWAY` . Accepts an array containing all of the information required to use a directory in `AWS_DIRECTORY_SERVICE` or invoke a customer-supplied authentication API, including the API Gateway URL. Not required when `IdentityProviderType` is set to `SERVICE_MANAGED` .","properties":{"DirectoryId":"The identifier of the AWS Directory Service directory that you want to stop sharing.","Function":"The ARN for a Lambda function to use for the Identity provider.","InvocationRole":"This parameter is only applicable if your `IdentityProviderType` is `API_GATEWAY` . Provides the type of `InvocationRole` used to authenticate the user account.","SftpAuthenticationMethods":"For SFTP-enabled servers, and for custom identity providers *only* , you can specify whether to authenticate using a password, SSH key pair, or both.\\n\\n- `PASSWORD` - users must provide their password to connect.\\n- `PUBLIC_KEY` - users must provide their private key to connect.\\n- `PUBLIC_KEY_OR_PASSWORD` - users can authenticate with either their password or their key. This is the default value.\\n- `PUBLIC_KEY_AND_PASSWORD` - users must provide both their private key and their password to connect. The server checks the key first, and then if the key is valid, the system prompts for a password. If the private key provided does not match the public key that is stored, authentication fails.","Url":"Provides the location of the service endpoint used to authenticate users."}},"AWS::Transfer::Server.Protocol":{"attributes":{},"description":"Specifies the file transfer protocol or protocols over which your file transfer protocol client can connect to your server\'s endpoint. The available protocols are:\\n\\n- `SFTP` (Secure Shell (SSH) File Transfer Protocol): File transfer over SSH\\n- `FTPS` (File Transfer Protocol Secure): File transfer with TLS encryption\\n- `FTP` (File Transfer Protocol): Unencrypted file transfer\\n- `AS2` (Applicability Statement 2): used for transporting structured business-to-business data\\n\\n> - If you select `FTPS` , you must choose a certificate stored in AWS Certificate Manager (ACM) which is used to identify your server when clients connect to it over FTPS.\\n> - If `Protocol` includes either `FTP` or `FTPS` , then the `EndpointType` must be `VPC` and the `IdentityProviderType` must be either `AWS_DIRECTORY_SERVICE` , `AWS_LAMBDA` , or `API_GATEWAY` .\\n> - If `Protocol` includes `FTP` , then `AddressAllocationIds` cannot be associated.\\n> - If `Protocol` is set only to `SFTP` , the `EndpointType` can be set to `PUBLIC` and the `IdentityProviderType` can be set any of the supported identity types: `SERVICE_MANAGED` , `AWS_DIRECTORY_SERVICE` , `AWS_LAMBDA` , or `API_GATEWAY` .\\n> - If `Protocol` includes `AS2` , then the `EndpointType` must be `VPC` , and domain must be Amazon S3. \\n\\nThe `Protocols` parameter is an array of `Protocol` strings.\\n\\n*Required* : No\\n\\n*Type* : String\\n\\n*Allowed values* : One or more of `SFTP` , `FTPS` , `FTP` , `AS2`\\n\\nUpdate requires: [No interruption](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)","properties":{}},"AWS::Transfer::Server.ProtocolDetails":{"attributes":{},"description":"The protocol settings that are configured for your server.","properties":{"As2Transports":"List of `As2Transport` objects.","PassiveIp":"Indicates passive mode, for FTP and FTPS protocols. Enter a single IPv4 address, such as the public IP address of a firewall, router, or load balancer. For example:\\n\\n`aws transfer update-server --protocol-details PassiveIp=0.0.0.0`\\n\\nReplace `0.0.0.0` in the example above with the actual IP address you want to use.\\n\\n> If you change the `PassiveIp` value, you must stop and then restart your Transfer Family server for the change to take effect. For details on using passive mode (PASV) in a NAT environment, see [Configuring your FTPS server behind a firewall or NAT with AWS Transfer Family](https://docs.aws.amazon.com/storage/configuring-your-ftps-server-behind-a-firewall-or-nat-with-aws-transfer-family/) . \\n\\n*Special values*\\n\\nThe `AUTO` and `0.0.0.0` are special values for the `PassiveIp` parameter. The value `PassiveIp=AUTO` is assigned by default to FTP and FTPS type servers. In this case, the server automatically responds with one of the endpoint IPs within the PASV response. `PassiveIp=0.0.0.0` has a more unique application for its usage. For example, if you have a High Availability (HA) Network Load Balancer (NLB) environment, where you have 3 subnets, you can only specify a single IP address using the `PassiveIp` parameter. This reduces the effectiveness of having High Availability. In this case, you can specify `PassiveIp=0.0.0.0` . This tells the client to use the same IP address as the Control connection and utilize all AZs for their connections. Note, however, that not all FTP clients support the `PassiveIp=0.0.0.0` response. FileZilla and WinSCP do support it. If you are using other clients, check to see if your client supports the `PassiveIp=0.0.0.0` response.","SetStatOption":"Use the `SetStatOption` to ignore the error that is generated when the client attempts to use `SETSTAT` on a file you are uploading to an S3 bucket.\\n\\nSome SFTP file transfer clients can attempt to change the attributes of remote files, including timestamp and permissions, using commands, such as `SETSTAT` when uploading the file. However, these commands are not compatible with object storage systems, such as Amazon S3. Due to this incompatibility, file uploads from these clients can result in errors even when the file is otherwise successfully uploaded.\\n\\nSet the value to `ENABLE_NO_OP` to have the Transfer Family server ignore the `SETSTAT` command, and upload files without needing to make any changes to your SFTP client. While the `SetStatOption` `ENABLE_NO_OP` setting ignores the error, it does generate a log entry in Amazon CloudWatch Logs, so you can determine when the client is making a `SETSTAT` call.\\n\\n> If you want to preserve the original timestamp for your file, and modify other file attributes using `SETSTAT` , you can use Amazon EFS as backend storage with Transfer Family.","TlsSessionResumptionMode":"A property used with Transfer Family servers that use the FTPS protocol. TLS Session Resumption provides a mechanism to resume or share a negotiated secret key between the control and data connection for an FTPS session. `TlsSessionResumptionMode` determines whether or not the server resumes recent, negotiated sessions through a unique session ID. This property is available during `CreateServer` and `UpdateServer` calls. If a `TlsSessionResumptionMode` value is not specified during `CreateServer` , it is set to `ENFORCED` by default.\\n\\n- `DISABLED` : the server does not process TLS session resumption client requests and creates a new TLS session for each request.\\n- `ENABLED` : the server processes and accepts clients that are performing TLS session resumption. The server doesn\'t reject client data connections that do not perform the TLS session resumption client processing.\\n- `ENFORCED` : the server processes and accepts clients that are performing TLS session resumption. The server rejects client data connections that do not perform the TLS session resumption client processing. Before you set the value to `ENFORCED` , test your clients.\\n\\n> Not all FTPS clients perform TLS session resumption. So, if you choose to enforce TLS session resumption, you prevent any connections from FTPS clients that don\'t perform the protocol negotiation. To determine whether or not you can use the `ENFORCED` value, you need to test your clients."}},"AWS::Transfer::Server.StructuredLogDestination":{"attributes":{},"description":"Specifies a log group to which your server logs are sent.","properties":{}},"AWS::Transfer::Server.WorkflowDetail":{"attributes":{},"description":"Specifies the workflow ID for the workflow to assign and the execution role that\'s used for executing the workflow.\\n\\nIn addition to a workflow to execute when a file is uploaded completely, `WorkflowDetails` can also contain a workflow ID (and execution role) for a workflow to execute on partial upload. A partial upload occurs when a file is open when the session disconnects.","properties":{"ExecutionRole":"Includes the necessary permissions for S3, EFS, and Lambda operations that Transfer can assume, so that all workflow steps can operate on the required resources","WorkflowId":"A unique identifier for the workflow."}},"AWS::Transfer::Server.WorkflowDetails":{"attributes":{},"description":"Container for the `WorkflowDetail` data type. It is used by actions that trigger a workflow to begin execution.","properties":{"OnPartialUpload":"A trigger that starts a workflow if a file is only partially uploaded. You can attach a workflow to a server that executes whenever there is a partial upload.\\n\\nA *partial upload* occurs when a file is open when the session disconnects.","OnUpload":"A trigger that starts a workflow: the workflow begins to execute after a file is uploaded.\\n\\nTo remove an associated workflow from a server, you can provide an empty `OnUpload` object, as in the following example.\\n\\n`aws transfer update-server --server-id s-01234567890abcdef --workflow-details \'{\\"OnUpload\\":[]}\'`"}},"AWS::Transfer::User":{"attributes":{"Arn":"The Amazon Resource Name associated with the user, in the form `arn:aws:transfer:region: *account-id* :user/ *server-id* / *username*` .\\n\\nAn example of a user ARN is: `arn:aws:transfer:us-east-1:123456789012:user/user1` .","Ref":"`Ref` returns the username, such as `transfer_user` .","ServerId":"The ID of the server to which the user is attached.\\n\\nAn example `ServerId` is `s-01234567890abcdef` .","UserName":"A unique string that identifies a Transfer Family user account associated with a server.\\n\\nAn example `UserName` is `transfer-user-1` ."},"description":"The `AWS::Transfer::User` resource creates a user and associates them with an existing server. You can only create and associate users with servers that have the `IdentityProviderType` set to `SERVICE_MANAGED` . Using parameters for `CreateUser` , you can specify the user name, set the home directory, store the user\'s public key, and assign the user\'s AWS Identity and Access Management (IAM) role. You can also optionally add a session policy, and assign metadata with tags that can be used to group and search for users.","properties":{"HomeDirectory":"The landing directory (folder) for a user when they log in to the server using the client.\\n\\nA `HomeDirectory` example is `/bucket_name/home/mydirectory` .","HomeDirectoryMappings":"Logical directory mappings that specify what Amazon S3 paths and keys should be visible to your user and how you want to make them visible. You will need to specify the \\" `Entry` \\" and \\" `Target` \\" pair, where `Entry` shows how the path is made visible and `Target` is the actual Amazon S3 path. If you only specify a target, it will be displayed as is. You will need to also make sure that your IAM role provides access to paths in `Target` . The following is an example.\\n\\n`\'[ { \\"Entry\\": \\"/\\", \\"Target\\": \\"/bucket3/customized-reports/\\" } ]\'`\\n\\nIn most cases, you can use this value instead of the session policy to lock your user down to the designated home directory (\\"chroot\\"). To do this, you can set `Entry` to \'/\' and set `Target` to the HomeDirectory parameter value.\\n\\n> If the target of a logical directory entry does not exist in Amazon S3, the entry will be ignored. As a workaround, you can use the Amazon S3 API to create 0 byte objects as place holders for your directory. If using the CLI, use the `s3api` call instead of `s3` so you can use the put-object operation. For example, you use the following: `AWS s3api put-object --bucket bucketname --key path/to/folder/` . Make sure that the end of the key name ends in a \'/\' for it to be considered a folder.","HomeDirectoryType":"The type of landing directory (folder) that you want your users\' home directory to be when they log in to the server. If you set it to `PATH` , the user will see the absolute Amazon S3 bucket or EFS paths as is in their file transfer protocol clients. If you set it `LOGICAL` , you need to provide mappings in the `HomeDirectoryMappings` for how you want to make Amazon S3 or Amazon EFS paths visible to your users.","Policy":"A session policy for your user so you can use the same IAM role across multiple users. This policy restricts user access to portions of their Amazon S3 bucket. Variables that you can use inside this policy include `${Transfer:UserName}` , `${Transfer:HomeDirectory}` , and `${Transfer:HomeBucket}` .\\n\\n> For session policies, AWS Transfer Family stores the policy as a JSON blob, instead of the Amazon Resource Name (ARN) of the policy. You save the policy as a JSON blob and pass it in the `Policy` argument.\\n> \\n> For an example of a session policy, see [Example session policy](https://docs.aws.amazon.com/transfer/latest/userguide/session-policy.html) .\\n> \\n> For more information, see [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) in the *AWS Security Token Service API Reference* .","PosixProfile":"Specifies the full POSIX identity, including user ID ( `Uid` ), group ID ( `Gid` ), and any secondary groups IDs ( `SecondaryGids` ), that controls your users\' access to your Amazon Elastic File System (Amazon EFS) file systems. The POSIX permissions that are set on files and directories in your file system determine the level of access your users get when transferring files into and out of your Amazon EFS file systems.","Role":"The Amazon Resource Name (ARN) of the AWS Identity and Access Management (IAM) role that controls your users\' access to your Amazon S3 bucket or Amazon EFS file system. The policies attached to this role determine the level of access that you want to provide your users when transferring files into and out of your Amazon S3 bucket or Amazon EFS file system. The IAM role should also contain a trust relationship that allows the server to access your resources when servicing your users\' transfer requests.","ServerId":"A system-assigned unique identifier for a server instance. This is the specific server that you added your user to.","SshPublicKeys":"Specifies the public key portion of the Secure Shell (SSH) keys stored for the described user.","Tags":"Key-value pairs that can be used to group and search for users. Tags are metadata attached to users for any purpose.","UserName":"A unique string that identifies a user and is associated with a `ServerId` . This user name must be a minimum of 3 and a maximum of 100 characters long. The following are valid characters: a-z, A-Z, 0-9, underscore \'_\', hyphen \'-\', period \'.\', and at sign \'@\'. The user name can\'t start with a hyphen, period, or at sign."}},"AWS::Transfer::User.HomeDirectoryMapEntry":{"attributes":{},"description":"Represents an object that contains entries and targets for `HomeDirectoryMappings` .","properties":{"Entry":"Represents an entry for `HomeDirectoryMappings` .","Target":"Represents the map target that is used in a `HomeDirectorymapEntry` ."}},"AWS::Transfer::User.PosixProfile":{"attributes":{},"description":"The full POSIX identity, including user ID ( `Uid` ), group ID ( `Gid` ), and any secondary groups IDs ( `SecondaryGids` ), that controls your users\' access to your Amazon EFS file systems. The POSIX permissions that are set on files and directories in your file system determine the level of access your users get when transferring files into and out of your Amazon EFS file systems.","properties":{"Gid":"The POSIX group ID used for all EFS operations by this user.","SecondaryGids":"The secondary POSIX group IDs used for all EFS operations by this user.","Uid":"The POSIX user ID used for all EFS operations by this user."}},"AWS::Transfer::User.SshPublicKey":{"attributes":{},"description":"Provides information about the public Secure Shell (SSH) key that is associated with a Transfer Family user account for the specific file transfer protocol-enabled server (as identified by `ServerId` ). The information returned includes the date the key was imported, the public key contents, and the public key ID. A user can store more than one SSH public key associated with their user name on a specific server.\\n\\n*SshPublicKeyBody*\\n\\nSpecifies the content of the SSH public key as specified by the `PublicKeyId` .\\n\\nAWS Transfer Family accepts RSA, ECDSA, and ED25519 keys.\\n\\nType: String\\n\\nLength Constraints: Maximum length of 2048.\\n\\nRequired: Yes","properties":{}},"AWS::Transfer::Workflow":{"attributes":{"Ref":"","WorkflowId":"A unique identifier for a workflow."},"description":"Allows you to create a workflow with specified steps and step details the workflow invokes after file transfer completes. After creating a workflow, you can associate the workflow created with any transfer servers by specifying the `workflow-details` field in `CreateServer` and `UpdateServer` operations.","properties":{"Description":"Specifies the text description for the workflow.","OnExceptionSteps":"Specifies the steps (actions) to take if errors are encountered during execution of the workflow.","Steps":"Specifies the details for the steps that are in the specified workflow.","Tags":"Key-value pairs that can be used to group and search for workflows. Tags are metadata attached to workflows for any purpose."}},"AWS::Transfer::Workflow.CopyStepDetails":{"attributes":{},"description":"Details for a step that performs a file copy.\\n\\nConsists of the following values:\\n\\n- A description\\n- An Amazon S3 location for the destination of the file copy.\\n- A flag that indicates whether to overwrite an existing file of the same name. The default is `FALSE` .","properties":{"DestinationFileLocation":"Specifies the location for the file being copied. Use `${Transfer:UserName}` or `${Transfer:UploadDate}` in this field to parametrize the destination prefix by username or uploaded date.\\n\\n- Set the value of `DestinationFileLocation` to `${Transfer:UserName}` to copy uploaded files to an Amazon S3 bucket that is prefixed with the name of the Transfer Family user that uploaded the file.\\n- Set the value of `DestinationFileLocation` to `${Transfer:UploadDate}` to copy uploaded files to an Amazon S3 bucket that is prefixed with the date of the upload.\\n\\n> The system resolves `UploadDate` to a date format of *YYYY-MM-DD* , based on the date the file is uploaded in UTC.","Name":"The name of the step, used as an identifier.","OverwriteExisting":"A flag that indicates whether to overwrite an existing file of the same name. The default is `FALSE` .\\n\\nIf the workflow is processing a file that has the same name as an existing file, the behavior is as follows:\\n\\n- If `OverwriteExisting` is `TRUE` , the existing file is replaced with the file being processed.\\n- If `OverwriteExisting` is `FALSE` , nothing happens, and the workflow processing stops.","SourceFileLocation":"Specifies which file to use as input to the workflow step: either the output from the previous step, or the originally uploaded file for the workflow.\\n\\n- To use the previous file as the input, enter `${previous.file}` . In this case, this workflow step uses the output file from the previous workflow step as input. This is the default value.\\n- To use the originally uploaded file location as input for this step, enter `${original.file}` ."}},"AWS::Transfer::Workflow.CustomStepDetails":{"attributes":{},"description":"Details for a step that invokes an AWS Lambda function.\\n\\nConsists of the Lambda function\'s name, target, and timeout (in seconds).","properties":{"Name":"The name of the step, used as an identifier.","SourceFileLocation":"Specifies which file to use as input to the workflow step: either the output from the previous step, or the originally uploaded file for the workflow.\\n\\n- To use the previous file as the input, enter `${previous.file}` . In this case, this workflow step uses the output file from the previous workflow step as input. This is the default value.\\n- To use the originally uploaded file location as input for this step, enter `${original.file}` .","Target":"The ARN for the Lambda function that is being called.","TimeoutSeconds":"Timeout, in seconds, for the step."}},"AWS::Transfer::Workflow.DecryptStepDetails":{"attributes":{},"description":"Details for a step that decrypts an encrypted file.\\n\\nConsists of the following values:\\n\\n- A descriptive name\\n- An Amazon S3 or Amazon Elastic File System (Amazon EFS) location for the source file to decrypt.\\n- An S3 or Amazon EFS location for the destination of the file decryption.\\n- A flag that indicates whether to overwrite an existing file of the same name. The default is `FALSE` .\\n- The type of encryption that\'s used. Currently, only PGP encryption is supported.","properties":{"DestinationFileLocation":"Specifies the location for the file being decrypted. Use `${Transfer:UserName}` or `${Transfer:UploadDate}` in this field to parametrize the destination prefix by username or uploaded date.\\n\\n- Set the value of `DestinationFileLocation` to `${Transfer:UserName}` to decrypt uploaded files to an Amazon S3 bucket that is prefixed with the name of the Transfer Family user that uploaded the file.\\n- Set the value of `DestinationFileLocation` to `${Transfer:UploadDate}` to decrypt uploaded files to an Amazon S3 bucket that is prefixed with the date of the upload.\\n\\n> The system resolves `UploadDate` to a date format of *YYYY-MM-DD* , based on the date the file is uploaded in UTC.","Name":"The name of the step, used as an identifier.","OverwriteExisting":"A flag that indicates whether to overwrite an existing file of the same name. The default is `FALSE` .\\n\\nIf the workflow is processing a file that has the same name as an existing file, the behavior is as follows:\\n\\n- If `OverwriteExisting` is `TRUE` , the existing file is replaced with the file being processed.\\n- If `OverwriteExisting` is `FALSE` , nothing happens, and the workflow processing stops.","SourceFileLocation":"Specifies which file to use as input to the workflow step: either the output from the previous step, or the originally uploaded file for the workflow.\\n\\n- To use the previous file as the input, enter `${previous.file}` . In this case, this workflow step uses the output file from the previous workflow step as input. This is the default value.\\n- To use the originally uploaded file location as input for this step, enter `${original.file}` .","Type":"The type of encryption used. Currently, this value must be `PGP` ."}},"AWS::Transfer::Workflow.DeleteStepDetails":{"attributes":{},"description":"An object that contains the name and file location for a file being deleted by a workflow.","properties":{"Name":"The name of the step, used as an identifier.","SourceFileLocation":"Specifies which file to use as input to the workflow step: either the output from the previous step, or the originally uploaded file for the workflow.\\n\\n- To use the previous file as the input, enter `${previous.file}` . In this case, this workflow step uses the output file from the previous workflow step as input. This is the default value.\\n- To use the originally uploaded file location as input for this step, enter `${original.file}` ."}},"AWS::Transfer::Workflow.EfsInputFileLocation":{"attributes":{},"description":"Specifies the Amazon EFS identifier and the path for the file being used.","properties":{"FileSystemId":"The identifier of the file system, assigned by Amazon EFS.","Path":"The pathname for the folder being used by a workflow."}},"AWS::Transfer::Workflow.InputFileLocation":{"attributes":{},"description":"Specifies the location for the file that\'s being processed.","properties":{"EfsFileLocation":"Specifies the details for the Amazon Elastic File System (Amazon EFS) file that\'s being decrypted.","S3FileLocation":"Specifies the details for the Amazon S3 file that\'s being copied or decrypted."}},"AWS::Transfer::Workflow.S3FileLocation":{"attributes":{},"description":"Specifies the S3 details for the file being used, such as bucket, ETag, and so forth.","properties":{"S3FileLocation":"Specifies the details for the file location for the file that\'s being used in the workflow. Only applicable if you are using Amazon S3 storage."}},"AWS::Transfer::Workflow.S3InputFileLocation":{"attributes":{},"description":"Specifies the details for the Amazon S3 location for an input file to a workflow.","properties":{"Bucket":"Specifies the S3 bucket for the customer input file.","Key":"The name assigned to the file when it was created in Amazon S3. You use the object key to retrieve the object."}},"AWS::Transfer::Workflow.S3Tag":{"attributes":{},"description":"Specifies the key-value pair that are assigned to a file during the execution of a Tagging step.","properties":{"Key":"The name assigned to the tag that you create.","Value":"The value that corresponds to the key."}},"AWS::Transfer::Workflow.TagStepDetails":{"attributes":{},"description":"Details for a step that creates one or more tags.\\n\\nYou specify one or more tags. Each tag contains a key-value pair.","properties":{"Name":"The name of the step, used as an identifier.","SourceFileLocation":"Specifies which file to use as input to the workflow step: either the output from the previous step, or the originally uploaded file for the workflow.\\n\\n- To use the previous file as the input, enter `${previous.file}` . In this case, this workflow step uses the output file from the previous workflow step as input. This is the default value.\\n- To use the originally uploaded file location as input for this step, enter `${original.file}` .","Tags":"Array that contains from 1 to 10 key/value pairs."}},"AWS::Transfer::Workflow.WorkflowStep":{"attributes":{},"description":"The basic building block of a workflow.","properties":{"CopyStepDetails":"Details for a step that performs a file copy.\\n\\nConsists of the following values:\\n\\n- A description\\n- An Amazon S3 location for the destination of the file copy.\\n- A flag that indicates whether to overwrite an existing file of the same name. The default is `FALSE` .","CustomStepDetails":"Details for a step that invokes an AWS Lambda function.\\n\\nConsists of the Lambda function\'s name, target, and timeout (in seconds).","DecryptStepDetails":"Details for a step that decrypts an encrypted file.\\n\\nConsists of the following values:\\n\\n- A descriptive name\\n- An Amazon S3 or Amazon Elastic File System (Amazon EFS) location for the source file to decrypt.\\n- An S3 or Amazon EFS location for the destination of the file decryption.\\n- A flag that indicates whether to overwrite an existing file of the same name. The default is `FALSE` .\\n- The type of encryption that\'s used. Currently, only PGP encryption is supported.","DeleteStepDetails":"Details for a step that deletes the file.","TagStepDetails":"Details for a step that creates one or more tags.\\n\\nYou specify one or more tags. Each tag contains a key-value pair.","Type":"Currently, the following step types are supported.\\n\\n- *`COPY`* - Copy the file to another location.\\n- *`CUSTOM`* - Perform a custom step with an AWS Lambda function target.\\n- *`DECRYPT`* - Decrypt a file that was encrypted before it was uploaded.\\n- *`DELETE`* - Delete the file.\\n- *`TAG`* - Add a tag to the file."}},"AWS::VerifiedPermissions::IdentitySource":{"attributes":{"Details":"A structure that contains information about the configuration of the identity source.","Details.ClientIds":"The application client IDs associated with the specified Amazon Cognito user pool that are enabled for this identity source.","Details.DiscoveryUrl":"The well-known URL that points to this user pool\'s OIDC discovery endpoint. This is a URL string in the following format. This URL replaces the placeholders for both the AWS Region and the user pool identifier with those appropriate for this user pool.\\n\\n`https://cognito-idp..amazonaws.com//.well-known/openid-configuration`","Details.OpenIdIssuer":"A string that identifies the type of OIDC service represented by this identity source. At this time, the only valid value is `cognito` .","Details.UserPoolArn":"The [Amazon Resource Name (ARN)](https://docs.aws.amazon.com//general/latest/gr/aws-arns-and-namespaces.html) of the Amazon Cognito user pool whose identities are accessible to this Verified Permissions policy store.","IdentitySourceId":"The unique ID of the new or updated identity store.","Ref":"`Ref` returns the unique id of the new identity source. For example:\\n\\n`{ \\"Ref\\": \\"ISEXAMPLEabcdefg111111\\" }`"},"description":"Creates or updates a reference to Amazon Cognito as an external identity provider.\\n\\nIf you are creating a new identity source, then you must specify a `Configuration` . If you are updating an existing identity source, then you must specify an `UpdateConfiguration` .\\n\\nAfter you create an identity source, you can use the identities provided by the IdP as proxies for the principal in authorization queries that use the [IsAuthorizedWithToken](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorizedWithToken.html) operation. These identities take the form of tokens that contain claims about the user, such as IDs, attributes and group memberships. Amazon Cognito provides both identity tokens and access tokens, and Verified Permissions can use either or both. Any combination of identity and access tokens results in the same Cedar principal. Verified Permissions automatically translates the information about the identities into the standard Cedar attributes that can be evaluated by your policies. Because the Amazon Cognito identity and access tokens can contain different information, the tokens you choose to use determine the attributes that are available to access in the Cedar principal from your policies.\\n\\nAmazon Cognito Identity is not available in all of the same AWS Regions as Amazon Verified Permissions . Because of this, the `AWS::VerifiedPermissions::IdentitySource` type is not available to create from AWS CloudFormation in Regions where Amazon Cognito Identity is not currently available. Users can still create `AWS::VerifiedPermissions::IdentitySource` in those Regions, but only from the AWS CLI , Amazon Verified Permissions SDK, or from the AWS console.\\n\\n> To reference a user from this identity source in your Cedar policies, use the following syntax.\\n> \\n> *IdentityType::\\"|*\\n> \\n> Where `IdentityType` is the string that you provide to the `PrincipalEntityType` parameter for this operation. The `CognitoUserPoolId` and `CognitoClientId` are defined by the Amazon Cognito user pool.","properties":{"Configuration":"Contains configuration information used when creating or updating an identity source.\\n\\n> At this time, the only valid member of this structure is a Amazon Cognito user pool configuration.\\n> \\n> You must specify a `userPoolArn` , and optionally, a `ClientId` .","PolicyStoreId":"Specifies the ID of the policy store in which you want to store this identity source. Only policies and requests made using this policy store can reference identities from the identity provider configured in the new identity source.","PrincipalEntityType":"Specifies the namespace and data type of the principals generated for identities authenticated by the new identity source."}},"AWS::VerifiedPermissions::IdentitySource.CognitoUserPoolConfiguration":{"attributes":{},"description":"A structure that contains configuration information used when creating or updating an identity source that represents a connection to an Amazon Cognito user pool used as an identity provider for Verified Permissions .","properties":{"ClientIds":"The unique application client IDs that are associated with the specified Amazon Cognito user pool.\\n\\nExample: `\\"ClientIds\\": [\\"&ExampleCogClientId;\\"]`","UserPoolArn":"The [Amazon Resource Name (ARN)](https://docs.aws.amazon.com//general/latest/gr/aws-arns-and-namespaces.html) of the Amazon Cognito user pool that contains the identities to be authorized."}},"AWS::VerifiedPermissions::IdentitySource.IdentitySourceConfiguration":{"attributes":{},"description":"A structure that contains configuration information used when creating or updating a new identity source.\\n\\n> At this time, the only valid member of this structure is a Amazon Cognito user pool configuration.\\n> \\n> You must specify a `userPoolArn` , and optionally, a `ClientId` .","properties":{"CognitoUserPoolConfiguration":"A structure that contains configuration information used when creating or updating an identity source that represents a connection to an Amazon Cognito user pool used as an identity provider for Verified Permissions ."}},"AWS::VerifiedPermissions::IdentitySource.IdentitySourceDetails":{"attributes":{},"description":"A structure that contains configuration of the identity source.","properties":{"ClientIds":"The application client IDs associated with the specified Amazon Cognito user pool that are enabled for this identity source.","DiscoveryUrl":"The well-known URL that points to this user pool\'s OIDC discovery endpoint. This is a URL string in the following format. This URL replaces the placeholders for both the AWS Region and the user pool identifier with those appropriate for this user pool.\\n\\n`https://cognito-idp. ** .amazonaws.com/ ** /.well-known/openid-configuration`","OpenIdIssuer":"A string that identifies the type of OIDC service represented by this identity source.\\n\\nAt this time, the only valid value is `cognito` .","UserPoolArn":"The [Amazon Resource Name (ARN)](https://docs.aws.amazon.com//general/latest/gr/aws-arns-and-namespaces.html) of the Amazon Cognito user pool whose identities are accessible to this Verified Permissions policy store."}},"AWS::VerifiedPermissions::Policy":{"attributes":{"PolicyId":"The unique ID of the new or updated policy.","PolicyType":"The type of the policy. This is one of the following values:\\n\\n- Static\\n- TemplateLinked","Ref":"`Ref` returns the unique id of the new or updated policy. For example:\\n\\n`{ \\"Ref\\": \\"SPEXAMPLEabcdefg111111\\" }`"},"description":"Creates or updates a Cedar policy and saves it in the specified policy store. You can create either a static policy or a policy linked to a policy template.\\n\\nYou can directly update only static policies. To update a template-linked policy, you must update it\'s linked policy template instead.\\n\\n- To create a static policy, in the `Definition` include a `Static` element that includes the Cedar policy text in the `Statement` element.\\n- To create a policy that is dynamically linked to a policy template, in the `Definition` include a `Templatelinked` element that specifies the policy template ID and the principal and resource to associate with this policy. If the policy template is ever updated, any policies linked to the policy template automatically use the updated template.\\n\\n> If the policy store has validation enabled, then creating a policy causes it to be validated against the schema in the policy store. If the policy doesn\'t pass validation, the operation fails and the policy isn\'t stored.","properties":{"Definition":"Specifies the policy type and content to use for the new or updated policy. The definition structure must include either a `Static` or a `TemplateLinked` element.","PolicyStoreId":"Specifies the `PolicyStoreId` of the policy store you want to store the policy in."}},"AWS::VerifiedPermissions::Policy.EntityIdentifier":{"attributes":{},"description":"Contains the identifier of an entity in a policy, including its ID and type.","properties":{"EntityId":"The identifier of an entity.\\n\\n`\\"entityId\\":\\" *identifier* \\"`","EntityType":"The type of an entity.\\n\\nExample: `\\"entityType\\":\\" *typeName* \\"`"}},"AWS::VerifiedPermissions::Policy.PolicyDefinition":{"attributes":{},"description":"A structure that defines a Cedar policy. It includes the policy type, a description, and a policy body. This is a top level data type used to create a policy.\\n\\nThis data type is used as a request parameter for the [CreatePolicy](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_CreatePolicy.html) operation. This structure must always have either an `Static` or a `TemplateLinked` element.","properties":{"Static":"A structure that describes a static policy. An static policy doesn\'t use a template or allow placeholders for entities.","TemplateLinked":"A structure that describes a policy that was instantiated from a template. The template can specify placeholders for `principal` and `resource` . When you use [CreatePolicy](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_CreatePolicy.html) to create a policy from a template, you specify the exact principal and resource to use for the instantiated policy."}},"AWS::VerifiedPermissions::Policy.StaticPolicyDefinition":{"attributes":{},"description":"A structure that defines a static policy.","properties":{"Description":"The description of the static policy.","Statement":"The policy content of the static policy, written in the Cedar policy language."}},"AWS::VerifiedPermissions::Policy.TemplateLinkedPolicyDefinition":{"attributes":{},"description":"A structure that describes a policy created by instantiating a policy template.\\n\\n> You can\'t directly update a template-linked policy. You must update the associated policy template instead.","properties":{"PolicyTemplateId":"The unique identifier of the policy template used to create this policy.","Principal":"The principal associated with this template-linked policy. Verified Permissions substitutes this principal for the `?principal` placeholder in the policy template when it evaluates an authorization request.","Resource":"The resource associated with this template-linked policy. Verified Permissions substitutes this resource for the `?resource` placeholder in the policy template when it evaluates an authorization request."}},"AWS::VerifiedPermissions::PolicyStore":{"attributes":{"Arn":"The [Amazon Resource Name (ARN)](https://docs.aws.amazon.com//general/latest/gr/aws-arns-and-namespaces.html) of the new or updated policy store.","PolicyStoreId":"The unique ID of the new or updated policy store.","Ref":"`Ref` returns the unique id of the new or updated policy store. For example:\\n\\n`{ \\"Ref\\": \\"PSEXAMPLEabcdefg111111\\" }`"},"description":"Creates a policy store. A policy store is a container for policy resources. You can create a separate policy store for each of your applications.","properties":{"Schema":"Creates or updates the policy schema in a policy store. Cedar can use the schema to validate any Cedar policies and policy templates submitted to the policy store. Any changes to the schema validate only policies and templates submitted after the schema change. Existing policies and templates are not re-evaluated against the changed schema. If you later update a policy, then it is evaluated against the new schema at that time.","ValidationSettings":"Specifies the validation setting for this policy store.\\n\\nCurrently, the only valid and required value is `Mode` .\\n\\n> We recommend that you turn on `STRICT` mode only after you define a schema. If a schema doesn\'t exist, then `STRICT` mode causes any policy to fail validation, and Verified Permissions rejects the policy. You can turn off validation by using the [UpdatePolicyStore](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_UpdatePolicyStore) . Then, when you have a schema defined, use [UpdatePolicyStore](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_UpdatePolicyStore) again to turn validation back on."}},"AWS::VerifiedPermissions::PolicyStore.SchemaDefinition":{"attributes":{},"description":"Contains a list of principal types, resource types, and actions that can be specified in policies stored in the same policy store. If the validation mode for the policy store is set to `STRICT` , then policies that can\'t be validated by this schema are rejected by Verified Permissions and can\'t be stored in the policy store.","properties":{"CedarJson":"A JSON string representation of the schema supported by applications that use this policy store. For more information, see [Policy store schema](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/schema.html) in the *Amazon Verified Permissions User Guide* ."}},"AWS::VerifiedPermissions::PolicyStore.ValidationSettings":{"attributes":{},"description":"A structure that contains Cedar policy validation settings for the policy store. The validation mode determines which validation failures that Cedar considers serious enough to block acceptance of a new or edited static policy or policy template.","properties":{"Mode":"The validation mode currently configured for this policy store. The valid values are:\\n\\n- *OFF* – Neither Verified Permissions nor Cedar perform any validation on policies. No validation errors are reported by either service.\\n- *STRICT* – Requires a schema to be present in the policy store. Cedar performs validation on all submitted new or updated static policies and policy templates. Any that fail validation are rejected and Cedar doesn\'t store them in the policy store.\\n\\n> If `Mode=STRICT` and the policy store doesn\'t contain a schema, Verified Permissions rejects all static policies and policy templates because there is no schema to validate against.\\n> \\n> To submit a static policy or policy template without a schema, you must turn off validation."}},"AWS::VerifiedPermissions::PolicyTemplate":{"attributes":{"PolicyTemplateId":"The unique identifier of the new or modified policy template.","Ref":"`Ref` returns the unique id of the new or updated policy template. For example:\\n\\n`{ \\"Ref\\": \\"PTEXAMPLEabcdefg111111\\" }`"},"description":"Creates a policy template. A template can use placeholders for the principal and resource. A template must be instantiated into a policy by associating it with specific principals and resources to use for the placeholders. That instantiated policy can then be considered in authorization decisions. The instantiated policy works identically to any other policy, except that it is dynamically linked to the template. If the template changes, then any policies that are linked to that template are immediately updated as well.","properties":{"Description":"The description to attach to the new or updated policy template.","PolicyStoreId":"The unique identifier of the policy store that contains the template.","Statement":"Specifies the content that you want to use for the new policy template, written in the Cedar policy language."}},"AWS::VoiceID::Domain":{"attributes":{"DomainId":"The identifier of the domain.","Ref":"`Ref` returns the `DomainId` of the domain."},"description":"Creates a domain that contains all Amazon Connect Voice ID data, such as speakers, fraudsters, customer audio, and voiceprints. Every domain is created with a default watchlist that fraudsters can be a part of.","properties":{"Description":"The description of the domain.","Name":"The name for the domain.","ServerSideEncryptionConfiguration":"The server-side encryption configuration containing the KMS key identifier you want Voice ID to use to encrypt your data.","Tags":"The tags used to organize, track, or control access for this resource."}},"AWS::VoiceID::Domain.ServerSideEncryptionConfiguration":{"attributes":{},"description":"The configuration containing information about the customer managed key used for encrypting customer data.","properties":{"KmsKeyId":"The identifier of the KMS key to use to encrypt data stored by Voice ID. Voice ID doesn\'t support asymmetric customer managed keys ."}},"AWS::VpcLattice::AccessLogSubscription":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the access log subscription.","Id":"The ID of the access log subscription.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the access log subscription.","ResourceArn":"The Amazon Resource Name (ARN) of the access log subscription.","ResourceId":"The ID of the service network or service."},"description":"Enables access logs to be sent to Amazon CloudWatch, Amazon S3, and Amazon Kinesis Data Firehose. The service network owner can use the access logs to audit the services in the network. The service network owner will only see access logs from clients and services that are associated with their service network. Access log entries represent traffic originated from VPCs associated with that network. For more information, see [Access logs](https://docs.aws.amazon.com/vpc-lattice/latest/ug/monitoring-access-logs.html) in the *Amazon VPC Lattice User Guide* .","properties":{"DestinationArn":"The Amazon Resource Name (ARN) of the destination. The supported destination types are CloudWatch Log groups, Kinesis Data Firehose delivery streams, and Amazon S3 buckets.","ResourceIdentifier":"The ID or Amazon Resource Name (ARN) of the service network or service.","Tags":"The tags for the access log subscription."}},"AWS::VpcLattice::AuthPolicy":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the auth policy.","State":"The state of the auth policy. The auth policy is only active when the auth type is set to `AWS _IAM` . If you provide a policy, then authentication and authorization decisions are made based on this policy and the client\'s IAM policy. If the auth type is `NONE` , then any auth policy you provide will remain inactive."},"description":"Creates or updates the auth policy. The policy string in JSON must not contain newlines or blank lines.","properties":{"Policy":"The auth policy.","ResourceIdentifier":"The ID or Amazon Resource Name (ARN) of the service network or service for which the policy is created."}},"AWS::VpcLattice::Listener":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the listener.","Id":"The ID of the listener.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the listener.","ServiceArn":"The Amazon Resource Name (ARN) of the service.","ServiceId":"The ID of the service."},"description":"Creates a listener for a service. Before you start using your Amazon VPC Lattice service, you must add one or more listeners. A listener is a process that checks for connection requests to your services. For more information, see [Listeners](https://docs.aws.amazon.com/vpc-lattice/latest/ug/listeners.html) in the *Amazon VPC Lattice User Guide* .","properties":{"DefaultAction":"The action for the default rule. Each listener has a default rule. Each rule consists of a priority, one or more actions, and one or more conditions. The default rule is the rule that\'s used if no other rules match. Each rule must include exactly one of the following types of actions: `forward` or `fixed-response` , and it must be the last action to be performed.","Name":"The name of the listener. A listener name must be unique within a service. The valid characters are a-z, 0-9, and hyphens (-). You can\'t use a hyphen as the first or last character, or immediately after another hyphen.\\n\\nIf you don\'t specify a name, CloudFormation generates one. However, if you specify a name, and later want to replace the resource, you must specify a new name.","Port":"The listener port. You can specify a value from `1` to `65535` . For HTTP, the default is `80` . For HTTPS, the default is `443` .","Protocol":"The listener protocol HTTP or HTTPS.","ServiceIdentifier":"The ID or Amazon Resource Name (ARN) of the service.","Tags":"The tags for the listener."}},"AWS::VpcLattice::Listener.DefaultAction":{"attributes":{},"description":"The action for the default rule. Each listener has a default rule. Each rule consists of a priority, one or more actions, and one or more conditions. The default rule is the rule that\'s used if no other rules match. Each rule must include exactly one of the following types of actions: `forward` or `fixed-response` , and it must be the last action to be performed.","properties":{"FixedResponse":"Information about an action that returns a custom HTTP response.","Forward":"Describes a forward action. You can use forward actions to route requests to one or more target groups."}},"AWS::VpcLattice::Listener.FixedResponse":{"attributes":{},"description":"Information about an action that returns a custom HTTP response.","properties":{"StatusCode":"The HTTP response code."}},"AWS::VpcLattice::Listener.Forward":{"attributes":{},"description":"The forward action. Traffic that matches the rule is forwarded to the specified target groups.","properties":{"TargetGroups":"The target groups. Traffic matching the rule is forwarded to the specified target groups. With forward actions, you can assign a weight that controls the prioritization and selection of each target group. This means that requests are distributed to individual target groups based on their weights. For example, if two target groups have the same weight, each target group receives half of the traffic.\\n\\nThe default value is 1. This means that if only one target group is provided, there is no need to set the weight; 100% of traffic will go to that target group."}},"AWS::VpcLattice::Listener.WeightedTargetGroup":{"attributes":{},"description":"Describes the weight of a target group.","properties":{"TargetGroupIdentifier":"The ID of the target group.","Weight":"Only required if you specify multiple target groups for a forward action. The \\"weight\\" determines how requests are distributed to the target group. For example, if you specify two target groups, each with a weight of 10, each target group receives half the requests. If you specify two target groups, one with a weight of 10 and the other with a weight of 20, the target group with a weight of 20 receives twice as many requests as the other target group. If there\'s only one target group specified, then the default value is 100."}},"AWS::VpcLattice::ResourcePolicy":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the resource policy."},"description":"Retrieves information about the resource policy. The resource policy is an IAM policy created on behalf of the resource owner when they share a resource.","properties":{"Policy":"The Amazon Resource Name (ARN) of the service network or service.","ResourceArn":"An IAM policy."}},"AWS::VpcLattice::Rule":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the rule.","Id":"The ID of the listener.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the rule."},"description":"Creates a listener rule. Each listener has a default rule for checking connection requests, but you can define additional rules. Each rule consists of a priority, one or more actions, and one or more conditions. For more information, see [Listener rules](https://docs.aws.amazon.com/vpc-lattice/latest/ug/listeners.html#listener-rules) in the *Amazon VPC Lattice User Guide* .","properties":{"Action":"Describes the action for a rule. Each rule must include exactly one of the following types of actions: `forward` or `fixed-response` , and it must be the last action to be performed.","ListenerIdentifier":"The ID or Amazon Resource Name (ARN) of the listener.","Match":"The rule match.","Name":"The name of the rule. The name must be unique within the listener. The valid characters are a-z, 0-9, and hyphens (-). You can\'t use a hyphen as the first or last character, or immediately after another hyphen.\\n\\nIf you don\'t specify a name, CloudFormation generates one. However, if you specify a name, and later want to replace the resource, you must specify a new name.","Priority":"The priority assigned to the rule. Each rule for a specific listener must have a unique priority. The lower the priority number the higher the priority.","ServiceIdentifier":"The ID or Amazon Resource Name (ARN) of the service.","Tags":"The tags for the rule."}},"AWS::VpcLattice::Rule.Action":{"attributes":{},"description":"Describes the action for a rule. Each rule must include exactly one of the following types of actions: `forward` or `fixed-response` , and it must be the last action to be performed.","properties":{"FixedResponse":"Describes the rule action that returns a custom HTTP response.","Forward":"The forward action. Traffic that matches the rule is forwarded to the specified target groups."}},"AWS::VpcLattice::Rule.FixedResponse":{"attributes":{},"description":"Information about an action that returns a custom HTTP response.","properties":{"StatusCode":"The HTTP response code."}},"AWS::VpcLattice::Rule.Forward":{"attributes":{},"description":"The forward action. Traffic that matches the rule is forwarded to the specified target groups.","properties":{"TargetGroups":"The target groups. Traffic matching the rule is forwarded to the specified target groups. With forward actions, you can assign a weight that controls the prioritization and selection of each target group. This means that requests are distributed to individual target groups based on their weights. For example, if two target groups have the same weight, each target group receives half of the traffic.\\n\\nThe default value is 1. This means that if only one target group is provided, there is no need to set the weight; 100% of traffic will go to that target group."}},"AWS::VpcLattice::Rule.HeaderMatch":{"attributes":{},"description":"Describes the constraints for a header match. Matches incoming requests with rule based on request header value before applying rule action.","properties":{"CaseSensitive":"Indicates whether the match is case sensitive. Defaults to false.","Match":"The header match type.","Name":"The name of the header."}},"AWS::VpcLattice::Rule.HeaderMatchType":{"attributes":{},"description":"Describes a header match type. Only one can be provided.","properties":{"Contains":"Specifies a contains type match.","Exact":"Specifies an exact type match.","Prefix":"Specifies a prefix type match. Matches the value with the prefix."}},"AWS::VpcLattice::Rule.HttpMatch":{"attributes":{},"description":"Describes criteria that can be applied to incoming requests.","properties":{"HeaderMatches":"The header matches. Matches incoming requests with rule based on request header value before applying rule action.","Method":"The HTTP method type.","PathMatch":"The path match."}},"AWS::VpcLattice::Rule.Match":{"attributes":{},"description":"Describes a rule match.","properties":{"HttpMatch":"The HTTP criteria that a rule must match."}},"AWS::VpcLattice::Rule.PathMatch":{"attributes":{},"description":"Describes the conditions that can be applied when matching a path for incoming requests.","properties":{"CaseSensitive":"Indicates whether the match is case sensitive. Defaults to false.","Match":"The type of path match."}},"AWS::VpcLattice::Rule.PathMatchType":{"attributes":{},"description":"Describes a path match type. Each rule can include only one of the following types of paths.","properties":{"Exact":"An exact match of the path.","Prefix":"A prefix match of the path."}},"AWS::VpcLattice::Rule.WeightedTargetGroup":{"attributes":{},"description":"Describes the weight of a target group.","properties":{"TargetGroupIdentifier":"The ID of the target group.","Weight":"Only required if you specify multiple target groups for a forward action. The \\"weight\\" determines how requests are distributed to the target group. For example, if you specify two target groups, each with a weight of 10, each target group receives half the requests. If you specify two target groups, one with a weight of 10 and the other with a weight of 20, the target group with a weight of 20 receives twice as many requests as the other target group. If there\'s only one target group specified, then the default value is 100."}},"AWS::VpcLattice::Service":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the service.","CreatedAt":"The date and time that the service was created, specified in ISO-8601 format.","DnsEntry.DomainName":"The domain name of the service.","DnsEntry.HostedZoneId":"The ID of the hosted zone.","Id":"The ID of the service.","LastUpdatedAt":"The date and time that the service was last updated, specified in ISO-8601 format.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the service.","Status":"The status of the service."},"description":"Creates a service. A service is any software application that can run on instances containers, or serverless functions within an account or virtual private cloud (VPC).\\n\\nFor more information, see [Services](https://docs.aws.amazon.com/vpc-lattice/latest/ug/services.html) in the *Amazon VPC Lattice User Guide* .","properties":{"AuthType":"The type of IAM policy.\\n\\n- `NONE` : The resource does not use an IAM policy. This is the default.\\n- `AWS_IAM` : The resource uses an IAM policy. When this type is used, auth is enabled and an auth policy is required.","CertificateArn":"The Amazon Resource Name (ARN) of the certificate.","CustomDomainName":"The custom domain name of the service.","DnsEntry":"","Name":"The name of the service. The name must be unique within the account. The valid characters are a-z, 0-9, and hyphens (-). You can\'t use a hyphen as the first or last character, or immediately after another hyphen.\\n\\nIf you don\'t specify a name, CloudFormation generates one. However, if you specify a name, and later want to replace the resource, you must specify a new name.","Tags":"The tags for the service."}},"AWS::VpcLattice::Service.DnsEntry":{"attributes":{},"description":"Describes the DNS information of a service.","properties":{"DomainName":"The domain name of the service.","HostedZoneId":"The ID of the hosted zone."}},"AWS::VpcLattice::ServiceNetwork":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the service network.","CreatedAt":"The date and time that the service network was created, specified in ISO-8601 format.","Id":"The ID of the service network.","LastUpdatedAt":"The date and time of the last update, specified in ISO-8601 format.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the service network."},"description":"Creates a service network. A service network is a logical boundary for a collection of services. You can associate services and VPCs with a service network.\\n\\nFor more information, see [Service networks](https://docs.aws.amazon.com/vpc-lattice/latest/ug/service-networks.html) in the *Amazon VPC Lattice User Guide* .","properties":{"AuthType":"The type of IAM policy.\\n\\n- `NONE` : The resource does not use an IAM policy. This is the default.\\n- `AWS_IAM` : The resource uses an IAM policy. When this type is used, auth is enabled and an auth policy is required.","Name":"The name of the service network. The name must be unique to the account. The valid characters are a-z, 0-9, and hyphens (-). You can\'t use a hyphen as the first or last character, or immediately after another hyphen.\\n\\nIf you don\'t specify a name, CloudFormation generates one. However, if you specify a name, and later want to replace the resource, you must specify a new name.","Tags":"The tags for the service network."}},"AWS::VpcLattice::ServiceNetworkServiceAssociation":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the association between the service network and the service.","CreatedAt":"The date and time that the association was created, specified in ISO-8601 format.","DnsEntry.DomainName":"The domain name of the service.","DnsEntry.HostedZoneId":"The ID of the hosted zone.","Id":"The ID of the of the association between the service network and the service.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the association.","ServiceArn":"The Amazon Resource Name (ARN) of the service.","ServiceId":"The ID of the service.","ServiceName":"The name of the service.","ServiceNetworkArn":"The Amazon Resource Name (ARN) of the service network","ServiceNetworkId":"The ID of the service network.","ServiceNetworkName":"The name of the service network.","Status":"The status of the association between the service network and the service."},"description":"Associates a service with a service network.\\n\\nYou can\'t use this operation if the service and service network are already associated or if there is a disassociation or deletion in progress. If the association fails, you can retry the operation by deleting the association and recreating it.\\n\\nYou cannot associate a service and service network that are shared with a caller. The caller must own either the service or the service network.\\n\\nAs a result of this operation, the association is created in the service network account and the association owner account.","properties":{"DnsEntry":"","ServiceIdentifier":"The ID or Amazon Resource Name (ARN) of the service.","ServiceNetworkIdentifier":"The ID or Amazon Resource Name (ARN) of the service network. You must use the ARN if the resources specified in the operation are in different accounts.","Tags":"The tags for the association."}},"AWS::VpcLattice::ServiceNetworkServiceAssociation.DnsEntry":{"attributes":{},"description":"DNS information about the service.","properties":{"DomainName":"The domain name of the service.","HostedZoneId":"The ID of the hosted zone."}},"AWS::VpcLattice::ServiceNetworkVpcAssociation":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the association between the service network and the VPC.","CreatedAt":"The date and time that the association was created, specified in ISO-8601 format.","Id":"The ID of the specified association between the service network and the VPC.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the association.","ServiceNetworkArn":"The Amazon Resource Name (ARN) of the service network.","ServiceNetworkId":"The ID of the service network.","ServiceNetworkName":"The name of the service network.","Status":"The status of the association.","VpcId":"The ID of the VPC."},"description":"Associates a VPC with a service network. When you associate a VPC with the service network, it enables all the resources within that VPC to be clients and communicate with other services in the service network. For more information, see [Manage VPC associations](https://docs.aws.amazon.com/vpc-lattice/latest/ug/service-network-associations.html#service-network-vpc-associations) in the *Amazon VPC Lattice User Guide* .\\n\\nYou can\'t use this operation if there is a disassociation in progress. If the association fails, retry by deleting the association and recreating it.\\n\\nAs a result of this operation, the association gets created in the service network account and the VPC owner account.\\n\\nIf you add a security group to the service network and VPC association, the association must continue to always have at least one security group. You can add or edit security groups at any time. However, to remove all security groups, you must first delete the association and recreate it without security groups.","properties":{"SecurityGroupIds":"The IDs of the security groups. Security groups aren\'t added by default. You can add a security group to apply network level controls to control which resources in a VPC are allowed to access the service network and its services. For more information, see [Control traffic to resources using security groups](https://docs.aws.amazon.com//vpc/latest/userguide/VPC_SecurityGroups.html) in the *Amazon VPC User Guide* .","ServiceNetworkIdentifier":"The ID or Amazon Resource Name (ARN) of the service network. You must use the ARN when the resources specified in the operation are in different accounts.","Tags":"The tags for the association.","VpcIdentifier":"The ID of the VPC."}},"AWS::VpcLattice::TargetGroup":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the target group.","CreatedAt":"The date and time that the target group was created, specified in ISO-8601 format.","Id":"The ID of the target group.","LastUpdatedAt":"The date and time that the target group was last updated, specified in ISO-8601 format.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the target group.","Status":"The operation\'s status. You can retry the operation if the status is `CREATE_FAILED` . However, if you retry it while the status is `CREATE_IN_PROGRESS` , there is no change in the status."},"description":"Creates a target group. A target group is a collection of targets, or compute resources, that run your application or service. A target group can only be used by a single service.\\n\\nFor more information, see [Target groups](https://docs.aws.amazon.com/vpc-lattice/latest/ug/target-groups.html) in the *Amazon VPC Lattice User Guide* .","properties":{"Config":"The target group configuration. If `type` is set to `LAMBDA` , this parameter doesn\'t apply.","Name":"The name of the target group. The name must be unique within the account. The valid characters are a-z, 0-9, and hyphens (-). You can\'t use a hyphen as the first or last character, or immediately after another hyphen.\\n\\nIf you don\'t specify a name, CloudFormation generates one. However, if you specify a name, and later want to replace the resource, you must specify a new name.","Tags":"The tags for the target group.","Targets":"Describes a target.","Type":"The type of target group."}},"AWS::VpcLattice::TargetGroup.HealthCheckConfig":{"attributes":{},"description":"The health check configuration of a target group. Health check configurations aren\'t used for `LAMBDA` and `ALB` target groups.","properties":{"Enabled":"Indicates whether health checking is enabled.","HealthCheckIntervalSeconds":"The approximate amount of time, in seconds, between health checks of an individual target. The range is 5–300 seconds. The default is 30 seconds.","HealthCheckTimeoutSeconds":"The amount of time, in seconds, to wait before reporting a target as unhealthy. The range is 1–120 seconds. The default is 5 seconds.","HealthyThresholdCount":"The number of consecutive successful health checks required before considering an unhealthy target healthy. The range is 2–10. The default is 5.","Matcher":"The codes to use when checking for a successful response from a target. These are called *Success codes* in the console.","Path":"The destination for health checks on the targets. If the protocol version is `HTTP/1.1` or `HTTP/2` , specify a valid URI (for example, `/path?query` ). The default path is `/` . Health checks are not supported if the protocol version is `gRPC` , however, you can choose `HTTP/1.1` or `HTTP/2` and specify a valid URI.","Port":"The port used when performing health checks on targets. The default setting is the port that a target receives traffic on.","Protocol":"The protocol used when performing health checks on targets. The possible protocols are `HTTP` and `HTTPS` . The default is `HTTP` .","ProtocolVersion":"The protocol version used when performing health checks on targets. The possible protocol versions are `HTTP1` and `HTTP2` .","UnhealthyThresholdCount":"The number of consecutive failed health checks required before considering a target unhealthy. The range is 2–10. The default is 2."}},"AWS::VpcLattice::TargetGroup.Matcher":{"attributes":{},"description":"The codes to use when checking for a successful response from a target for health checks.","properties":{"HttpCode":"The HTTP code to use when checking for a successful response from a target."}},"AWS::VpcLattice::TargetGroup.Target":{"attributes":{},"description":"Describes a target.","properties":{"Id":"The ID of the target. If the target type of the target group is `INSTANCE` , this is an instance ID. If the target type is `IP` , this is an IP address. If the target type is `LAMBDA` , this is the ARN of the Lambda function. If the target type is `ALB` , this is the ARN of the Application Load Balancer.","Port":"The port on which the target is listening. For HTTP, the default is `80` . For HTTPS, the default is `443` ."}},"AWS::VpcLattice::TargetGroup.TargetGroupConfig":{"attributes":{},"description":"Describes the configuration of a target group. Lambda functions don\'t support target group configuration.","properties":{"HealthCheck":"The health check configuration.","IpAddressType":"The type of IP address used for the target group. The possible values are `ipv4` and `ipv6` . This is an optional parameter. If not specified, the IP address type defaults to `ipv4` .","Port":"The port on which the targets are listening. For HTTP, the default is `80` . For HTTPS, the default is `443`","Protocol":"The protocol to use for routing traffic to the targets. Default is the protocol of a target group.","ProtocolVersion":"The protocol version. Default value is `HTTP1` .","VpcIdentifier":"The ID of the VPC."}},"AWS::WAF::ByteMatchSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nThe `AWS::WAF::ByteMatchSet` resource creates an AWS WAF `ByteMatchSet` that identifies a part of a web request that you want to inspect.","properties":{"ByteMatchTuples":"Specifies the bytes (typically a string that corresponds with ASCII characters) that you want AWS WAF to search for in web requests, the location in requests that you want AWS WAF to search, and other settings.","Name":"The name of the `ByteMatchSet` . You can\'t change `Name` after you create a `ByteMatchSet` ."}},"AWS::WAF::ByteMatchSet.ByteMatchTuple":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nThe bytes (typically a string that corresponds with ASCII characters) that you want AWS WAF to search for in web requests, the location in requests that you want AWS WAF to search, and other settings.","properties":{"FieldToMatch":"The part of a web request that you want to inspect, such as a specified header or a query string.","PositionalConstraint":"Within the portion of a web request that you want to search (for example, in the query string, if any), specify where you want AWS WAF to search. Valid values include the following:\\n\\n*CONTAINS*\\n\\nThe specified part of the web request must include the value of `TargetString` , but the location doesn\'t matter.\\n\\n*CONTAINS_WORD*\\n\\nThe specified part of the web request must include the value of `TargetString` , and `TargetString` must contain only alphanumeric characters or underscore (A-Z, a-z, 0-9, or _). In addition, `TargetString` must be a word, which means one of the following:\\n\\n- `TargetString` exactly matches the value of the specified part of the web request, such as the value of a header.\\n- `TargetString` is at the beginning of the specified part of the web request and is followed by a character other than an alphanumeric character or underscore (_), for example, `BadBot;` .\\n- `TargetString` is at the end of the specified part of the web request and is preceded by a character other than an alphanumeric character or underscore (_), for example, `;BadBot` .\\n- `TargetString` is in the middle of the specified part of the web request and is preceded and followed by characters other than alphanumeric characters or underscore (_), for example, `-BadBot;` .\\n\\n*EXACTLY*\\n\\nThe value of the specified part of the web request must exactly match the value of `TargetString` .\\n\\n*STARTS_WITH*\\n\\nThe value of `TargetString` must appear at the beginning of the specified part of the web request.\\n\\n*ENDS_WITH*\\n\\nThe value of `TargetString` must appear at the end of the specified part of the web request.","TargetString":"The value that you want AWS WAF to search for. AWS WAF searches for the specified string in the part of web requests that you specified in `FieldToMatch` . The maximum length of the value is 50 bytes.\\n\\nYou must specify this property or the `TargetStringBase64` property.\\n\\nValid values depend on the values that you specified for `FieldToMatch` :\\n\\n- `HEADER` : The value that you want AWS WAF to search for in the request header that you specified in `FieldToMatch` , for example, the value of the `User-Agent` or `Referer` header.\\n- `METHOD` : The HTTP method, which indicates the type of operation specified in the request. Amazon CloudFront supports the following methods: `DELETE` , `GET` , `HEAD` , `OPTIONS` , `PATCH` , `POST` , and `PUT` .\\n- `QUERY_STRING` : The value that you want AWS WAF to search for in the query string, which is the part of a URL that appears after a `?` character.\\n- `URI` : The value that you want AWS WAF to search for in the part of a URL that identifies a resource, for example, `/images/daily-ad.jpg` .\\n- `BODY` : The part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form. The request body immediately follows the request headers. Note that only the first `8192` bytes of the request body are forwarded to AWS WAF for inspection. To allow or block requests based on the length of the body, you can create a size constraint set.\\n- `SINGLE_QUERY_ARG` : The parameter in the query string that you will inspect, such as *UserName* or *SalesRegion* . The maximum length for `SINGLE_QUERY_ARG` is 30 characters.\\n- `ALL_QUERY_ARGS` : Similar to `SINGLE_QUERY_ARG` , but instead of inspecting a single parameter, AWS WAF inspects all parameters within the query string for the value or regex pattern that you specify in `TargetString` .\\n\\nIf `TargetString` includes alphabetic characters A-Z and a-z, note that the value is case sensitive.","TargetStringBase64":"The base64-encoded value that AWS WAF searches for. AWS CloudFormation sends this value to AWS WAF without encoding it.\\n\\nYou must specify this property or the `TargetString` property.\\n\\nAWS WAF searches for this value in a specific part of web requests, which you define in the `FieldToMatch` property.\\n\\nValid values depend on the Type value in the `FieldToMatch` property. For example, for a `METHOD` type, you must specify HTTP methods such as `DELETE, GET, HEAD, OPTIONS, PATCH, POST` , and `PUT` .","TextTransformation":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass AWS WAF . If you specify a transformation, AWS WAF performs the transformation on `FieldToMatch` before inspecting it for a match.\\n\\nYou can only specify a single type of TextTransformation.\\n\\n*CMD_LINE*\\n\\nWhen you\'re concerned that attackers are injecting an operating system command line command and using unusual formatting to disguise some or all of the command, use this option to perform the following transformations:\\n\\n- Delete the following characters: \\\\ \\" \' ^\\n- Delete spaces before the following characters: / (\\n- Replace the following characters with a space: , ;\\n- Replace multiple spaces with one space\\n- Convert uppercase letters (A-Z) to lowercase (a-z)\\n\\n*COMPRESS_WHITE_SPACE*\\n\\nUse this option to replace the following characters with a space character (decimal 32):\\n\\n- \\\\f, formfeed, decimal 12\\n- \\\\t, tab, decimal 9\\n- \\\\n, newline, decimal 10\\n- \\\\r, carriage return, decimal 13\\n- \\\\v, vertical tab, decimal 11\\n- non-breaking space, decimal 160\\n\\n`COMPRESS_WHITE_SPACE` also replaces multiple spaces with one space.\\n\\n*HTML_ENTITY_DECODE*\\n\\nUse this option to replace HTML-encoded characters with unencoded characters. `HTML_ENTITY_DECODE` performs the following operations:\\n\\n- Replaces `(ampersand)quot;` with `\\"`\\n- Replaces `(ampersand)nbsp;` with a non-breaking space, decimal 160\\n- Replaces `(ampersand)lt;` with a \\"less than\\" symbol\\n- Replaces `(ampersand)gt;` with `>`\\n- Replaces characters that are represented in hexadecimal format, `(ampersand)#xhhhh;` , with the corresponding characters\\n- Replaces characters that are represented in decimal format, `(ampersand)#nnnn;` , with the corresponding characters\\n\\n*LOWERCASE*\\n\\nUse this option to convert uppercase letters (A-Z) to lowercase (a-z).\\n\\n*URL_DECODE*\\n\\nUse this option to decode a URL-encoded value.\\n\\n*NONE*\\n\\nSpecify `NONE` if you don\'t want to perform any text transformations."}},"AWS::WAF::ByteMatchSet.FieldToMatch":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nSpecifies where in a web request to look for `TargetString` .","properties":{"Data":"When the value of `Type` is `HEADER` , enter the name of the header that you want AWS WAF to search, for example, `User-Agent` or `Referer` . The name of the header is not case sensitive.\\n\\nWhen the value of `Type` is `SINGLE_QUERY_ARG` , enter the name of the parameter that you want AWS WAF to search, for example, `UserName` or `SalesRegion` . The parameter name is not case sensitive.\\n\\nIf the value of `Type` is any other value, omit `Data` .","Type":"The part of the web request that you want AWS WAF to search for a specified string. Parts of a request that you can search include the following:\\n\\n- `HEADER` : A specified request header, for example, the value of the `User-Agent` or `Referer` header. If you choose `HEADER` for the type, specify the name of the header in `Data` .\\n- `METHOD` : The HTTP method, which indicated the type of operation that the request is asking the origin to perform. Amazon CloudFront supports the following methods: `DELETE` , `GET` , `HEAD` , `OPTIONS` , `PATCH` , `POST` , and `PUT` .\\n- `QUERY_STRING` : A query string, which is the part of a URL that appears after a `?` character, if any.\\n- `URI` : The part of a web request that identifies a resource, for example, `/images/daily-ad.jpg` .\\n- `BODY` : The part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form. The request body immediately follows the request headers. Note that only the first `8192` bytes of the request body are forwarded to AWS WAF for inspection. To allow or block requests based on the length of the body, you can create a size constraint set.\\n- `SINGLE_QUERY_ARG` : The parameter in the query string that you will inspect, such as *UserName* or *SalesRegion* . The maximum length for `SINGLE_QUERY_ARG` is 30 characters.\\n- `ALL_QUERY_ARGS` : Similar to `SINGLE_QUERY_ARG` , but rather than inspecting a single parameter, AWS WAF will inspect all parameters within the query for the value or regex pattern that you specify in `TargetString` ."}},"AWS::WAF::IPSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nContains one or more IP addresses or blocks of IP addresses specified in Classless Inter-Domain Routing (CIDR) notation. AWS WAF supports IPv4 address ranges: /8 and any range between /16 through /32. AWS WAF supports IPv6 address ranges: /24, /32, /48, /56, /64, and /128.\\n\\nTo specify an individual IP address, you specify the four-part IP address followed by a `/32` , for example, 192.0.2.0/32. To block a range of IP addresses, you can specify /8 or any range between /16 through /32 (for IPv4) or /24, /32, /48, /56, /64, or /128 (for IPv6). For more information about CIDR notation, see the Wikipedia entry [Classless Inter-Domain Routing](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) .","properties":{"IPSetDescriptors":"The IP address type ( `IPV4` or `IPV6` ) and the IP address range (in CIDR notation) that web requests originate from. If the `WebACL` is associated with an Amazon CloudFront distribution and the viewer did not use an HTTP proxy or a load balancer to send the request, this is the value of the c-ip field in the CloudFront access logs.","Name":"The name of the `IPSet` . You can\'t change the name of an `IPSet` after you create it."}},"AWS::WAF::IPSet.IPSetDescriptor":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nSpecifies the IP address type ( `IPV4` or `IPV6` ) and the IP address range (in CIDR format) that web requests originate from.","properties":{"Type":"Specify `IPV4` or `IPV6` .","Value":"Specify an IPv4 address by using CIDR notation. For example:\\n\\n- To configure AWS WAF to allow, block, or count requests that originated from the IP address 192.0.2.44, specify `192.0.2.44/32` .\\n- To configure AWS WAF to allow, block, or count requests that originated from IP addresses from 192.0.2.0 to 192.0.2.255, specify `192.0.2.0/24` .\\n\\nFor more information about CIDR notation, see the Wikipedia entry [Classless Inter-Domain Routing](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) .\\n\\nSpecify an IPv6 address by using CIDR notation. For example:\\n\\n- To configure AWS WAF to allow, block, or count requests that originated from the IP address 1111:0000:0000:0000:0000:0000:0000:0111, specify `1111:0000:0000:0000:0000:0000:0000:0111/128` .\\n- To configure AWS WAF to allow, block, or count requests that originated from IP addresses 1111:0000:0000:0000:0000:0000:0000:0000 to 1111:0000:0000:0000:ffff:ffff:ffff:ffff, specify `1111:0000:0000:0000:0000:0000:0000:0000/64` ."}},"AWS::WAF::Rule":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nA combination of `ByteMatchSet` , `IPSet` , and/or `SqlInjectionMatchSet` objects that identify the web requests that you want to allow, block, or count. For example, you might create a `Rule` that includes the following predicates:\\n\\n- An `IPSet` that causes AWS WAF to search for web requests that originate from the IP address `192.0.2.44`\\n- A `ByteMatchSet` that causes AWS WAF to search for web requests for which the value of the `User-Agent` header is `BadBot` .\\n\\nTo match the settings in this `Rule` , a request must originate from `192.0.2.44` AND include a `User-Agent` header for which the value is `BadBot` .","properties":{"MetricName":"The name of the metrics for this `Rule` . The name can contain only alphanumeric characters (A-Z, a-z, 0-9), with maximum length 128 and minimum length one. It can\'t contain whitespace or metric names reserved for AWS WAF , including \\"All\\" and \\"Default_Action.\\" You can\'t change `MetricName` after you create the `Rule` .","Name":"The friendly name or description for the `Rule` . You can\'t change the name of a `Rule` after you create it.","Predicates":"The `Predicates` object contains one `Predicate` element for each `ByteMatchSet` , `IPSet` , or `SqlInjectionMatchSet` object that you want to include in a `Rule` ."}},"AWS::WAF::Rule.Predicate":{"attributes":{},"description":"Specifies the `ByteMatchSet` , `IPSet` , `SqlInjectionMatchSet` , `XssMatchSet` , `RegexMatchSet` , `GeoMatchSet` , and `SizeConstraintSet` objects that you want to add to a `Rule` and, for each object, indicates whether you want to negate the settings, for example, requests that do NOT originate from the IP address 192.0.2.44.","properties":{"DataId":"A unique identifier for a predicate in a `Rule` , such as `ByteMatchSetId` or `IPSetId` . The ID is returned by the corresponding `Create` or `List` command.","Negated":"Set `Negated` to `False` if you want AWS WAF to allow, block, or count requests based on the settings in the specified `ByteMatchSet` , `IPSet` , `SqlInjectionMatchSet` , `XssMatchSet` , `RegexMatchSet` , `GeoMatchSet` , or `SizeConstraintSet` . For example, if an `IPSet` includes the IP address `192.0.2.44` , AWS WAF will allow or block requests based on that IP address.\\n\\nSet `Negated` to `True` if you want AWS WAF to allow or block a request based on the negation of the settings in the `ByteMatchSet` , `IPSet` , `SqlInjectionMatchSet` , `XssMatchSet` , `RegexMatchSet` , `GeoMatchSet` , or `SizeConstraintSet` . For example, if an `IPSet` includes the IP address `192.0.2.44` , AWS WAF will allow, block, or count requests based on all IP addresses *except* `192.0.2.44` .","Type":"The type of predicate in a `Rule` , such as `ByteMatch` or `IPSet` ."}},"AWS::WAF::SizeConstraintSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nA complex type that contains `SizeConstraint` objects, which specify the parts of web requests that you want AWS WAF to inspect the size of. If a `SizeConstraintSet` contains more than one `SizeConstraint` object, a request only needs to match one constraint to be considered a match.","properties":{"Name":"The name, if any, of the `SizeConstraintSet` .","SizeConstraints":"The size constraint and the part of the web request to check."}},"AWS::WAF::SizeConstraintSet.FieldToMatch":{"attributes":{},"description":"The part of a web request that you want to inspect, such as a specified header or a query string.","properties":{"Data":"When the value of `Type` is `HEADER` , enter the name of the header that you want AWS WAF to search, for example, `User-Agent` or `Referer` . The name of the header is not case sensitive.\\n\\nWhen the value of `Type` is `SINGLE_QUERY_ARG` , enter the name of the parameter that you want AWS WAF to search, for example, `UserName` or `SalesRegion` . The parameter name is not case sensitive.\\n\\nIf the value of `Type` is any other value, omit `Data` .","Type":"The part of the web request that you want AWS WAF to search for a specified string. Parts of a request that you can search include the following:\\n\\n- `HEADER` : A specified request header, for example, the value of the `User-Agent` or `Referer` header. If you choose `HEADER` for the type, specify the name of the header in `Data` .\\n- `METHOD` : The HTTP method, which indicated the type of operation that the request is asking the origin to perform. Amazon CloudFront supports the following methods: `DELETE` , `GET` , `HEAD` , `OPTIONS` , `PATCH` , `POST` , and `PUT` .\\n- `QUERY_STRING` : A query string, which is the part of a URL that appears after a `?` character, if any.\\n- `URI` : The part of a web request that identifies a resource, for example, `/images/daily-ad.jpg` .\\n- `BODY` : The part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form. The request body immediately follows the request headers. Note that only the first `8192` bytes of the request body are forwarded to AWS WAF for inspection. To allow or block requests based on the length of the body, you can create a size constraint set.\\n- `SINGLE_QUERY_ARG` : The parameter in the query string that you will inspect, such as *UserName* or *SalesRegion* . The maximum length for `SINGLE_QUERY_ARG` is 30 characters.\\n- `ALL_QUERY_ARGS` : Similar to `SINGLE_QUERY_ARG` , but rather than inspecting a single parameter, AWS WAF will inspect all parameters within the query for the value or regex pattern that you specify in `TargetString` ."}},"AWS::WAF::SizeConstraintSet.SizeConstraint":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nSpecifies a constraint on the size of a part of the web request. AWS WAF uses the `Size` , `ComparisonOperator` , and `FieldToMatch` to build an expression in the form of \\" `Size` `ComparisonOperator` size in bytes of `FieldToMatch` \\". If that expression is true, the `SizeConstraint` is considered to match.","properties":{"ComparisonOperator":"The type of comparison you want AWS WAF to perform. AWS WAF uses this in combination with the provided `Size` and `FieldToMatch` to build an expression in the form of \\" `Size` `ComparisonOperator` size in bytes of `FieldToMatch` \\". If that expression is true, the `SizeConstraint` is considered to match.\\n\\n*EQ* : Used to test if the `Size` is equal to the size of the `FieldToMatch`\\n\\n*NE* : Used to test if the `Size` is not equal to the size of the `FieldToMatch`\\n\\n*LE* : Used to test if the `Size` is less than or equal to the size of the `FieldToMatch`\\n\\n*LT* : Used to test if the `Size` is strictly less than the size of the `FieldToMatch`\\n\\n*GE* : Used to test if the `Size` is greater than or equal to the size of the `FieldToMatch`\\n\\n*GT* : Used to test if the `Size` is strictly greater than the size of the `FieldToMatch`","FieldToMatch":"The part of a web request that you want to inspect, such as a specified header or a query string.","Size":"The size in bytes that you want AWS WAF to compare against the size of the specified `FieldToMatch` . AWS WAF uses this in combination with `ComparisonOperator` and `FieldToMatch` to build an expression in the form of \\" `Size` `ComparisonOperator` size in bytes of `FieldToMatch` \\". If that expression is true, the `SizeConstraint` is considered to match.\\n\\nValid values for size are 0 - 21474836480 bytes (0 - 20 GB).\\n\\nIf you specify `URI` for the value of `Type` , the / in the URI path that you specify counts as one character. For example, the URI `/logo.jpg` is nine characters long.","TextTransformation":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass AWS WAF . If you specify a transformation, AWS WAF performs the transformation on `FieldToMatch` before inspecting it for a match.\\n\\nYou can only specify a single type of TextTransformation.\\n\\nNote that if you choose `BODY` for the value of `Type` , you must choose `NONE` for `TextTransformation` because Amazon CloudFront forwards only the first 8192 bytes for inspection.\\n\\n*NONE*\\n\\nSpecify `NONE` if you don\'t want to perform any text transformations.\\n\\n*CMD_LINE*\\n\\nWhen you\'re concerned that attackers are injecting an operating system command line command and using unusual formatting to disguise some or all of the command, use this option to perform the following transformations:\\n\\n- Delete the following characters: \\\\ \\" \' ^\\n- Delete spaces before the following characters: / (\\n- Replace the following characters with a space: , ;\\n- Replace multiple spaces with one space\\n- Convert uppercase letters (A-Z) to lowercase (a-z)\\n\\n*COMPRESS_WHITE_SPACE*\\n\\nUse this option to replace the following characters with a space character (decimal 32):\\n\\n- \\\\f, formfeed, decimal 12\\n- \\\\t, tab, decimal 9\\n- \\\\n, newline, decimal 10\\n- \\\\r, carriage return, decimal 13\\n- \\\\v, vertical tab, decimal 11\\n- non-breaking space, decimal 160\\n\\n`COMPRESS_WHITE_SPACE` also replaces multiple spaces with one space.\\n\\n*HTML_ENTITY_DECODE*\\n\\nUse this option to replace HTML-encoded characters with unencoded characters. `HTML_ENTITY_DECODE` performs the following operations:\\n\\n- Replaces `(ampersand)quot;` with `\\"`\\n- Replaces `(ampersand)nbsp;` with a non-breaking space, decimal 160\\n- Replaces `(ampersand)lt;` with a \\"less than\\" symbol\\n- Replaces `(ampersand)gt;` with `>`\\n- Replaces characters that are represented in hexadecimal format, `(ampersand)#xhhhh;` , with the corresponding characters\\n- Replaces characters that are represented in decimal format, `(ampersand)#nnnn;` , with the corresponding characters\\n\\n*LOWERCASE*\\n\\nUse this option to convert uppercase letters (A-Z) to lowercase (a-z).\\n\\n*URL_DECODE*\\n\\nUse this option to decode a URL-encoded value."}},"AWS::WAF::SqlInjectionMatchSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nA complex type that contains `SqlInjectionMatchTuple` objects, which specify the parts of web requests that you want AWS WAF to inspect for snippets of malicious SQL code and, if you want AWS WAF to inspect a header, the name of the header. If a `SqlInjectionMatchSet` contains more than one `SqlInjectionMatchTuple` object, a request needs to include snippets of SQL code in only one of the specified parts of the request to be considered a match.","properties":{"Name":"The name, if any, of the `SqlInjectionMatchSet` .","SqlInjectionMatchTuples":"Specifies the parts of web requests that you want to inspect for snippets of malicious SQL code."}},"AWS::WAF::SqlInjectionMatchSet.FieldToMatch":{"attributes":{},"description":"The part of a web request that you want to inspect, such as a specified header or a query string.","properties":{"Data":"When the value of `Type` is `HEADER` , enter the name of the header that you want AWS WAF to search, for example, `User-Agent` or `Referer` . The name of the header is not case sensitive.\\n\\nWhen the value of `Type` is `SINGLE_QUERY_ARG` , enter the name of the parameter that you want AWS WAF to search, for example, `UserName` or `SalesRegion` . The parameter name is not case sensitive.\\n\\nIf the value of `Type` is any other value, omit `Data` .","Type":"The part of the web request that you want AWS WAF to search for a specified string. Parts of a request that you can search include the following:\\n\\n- `HEADER` : A specified request header, for example, the value of the `User-Agent` or `Referer` header. If you choose `HEADER` for the type, specify the name of the header in `Data` .\\n- `METHOD` : The HTTP method, which indicated the type of operation that the request is asking the origin to perform. Amazon CloudFront supports the following methods: `DELETE` , `GET` , `HEAD` , `OPTIONS` , `PATCH` , `POST` , and `PUT` .\\n- `QUERY_STRING` : A query string, which is the part of a URL that appears after a `?` character, if any.\\n- `URI` : The part of a web request that identifies a resource, for example, `/images/daily-ad.jpg` .\\n- `BODY` : The part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form. The request body immediately follows the request headers. Note that only the first `8192` bytes of the request body are forwarded to AWS WAF for inspection. To allow or block requests based on the length of the body, you can create a size constraint set.\\n- `SINGLE_QUERY_ARG` : The parameter in the query string that you will inspect, such as *UserName* or *SalesRegion* . The maximum length for `SINGLE_QUERY_ARG` is 30 characters.\\n- `ALL_QUERY_ARGS` : Similar to `SINGLE_QUERY_ARG` , but rather than inspecting a single parameter, AWS WAF will inspect all parameters within the query for the value or regex pattern that you specify in `TargetString` ."}},"AWS::WAF::SqlInjectionMatchSet.SqlInjectionMatchTuple":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nSpecifies the part of a web request that you want AWS WAF to inspect for snippets of malicious SQL code and, if you want AWS WAF to inspect a header, the name of the header.","properties":{"FieldToMatch":"The part of a web request that you want to inspect, such as a specified header or a query string.","TextTransformation":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass AWS WAF . If you specify a transformation, AWS WAF performs the transformation on `FieldToMatch` before inspecting it for a match.\\n\\nYou can only specify a single type of TextTransformation.\\n\\n*CMD_LINE*\\n\\nWhen you\'re concerned that attackers are injecting an operating system command line command and using unusual formatting to disguise some or all of the command, use this option to perform the following transformations:\\n\\n- Delete the following characters: \\\\ \\" \' ^\\n- Delete spaces before the following characters: / (\\n- Replace the following characters with a space: , ;\\n- Replace multiple spaces with one space\\n- Convert uppercase letters (A-Z) to lowercase (a-z)\\n\\n*COMPRESS_WHITE_SPACE*\\n\\nUse this option to replace the following characters with a space character (decimal 32):\\n\\n- \\\\f, formfeed, decimal 12\\n- \\\\t, tab, decimal 9\\n- \\\\n, newline, decimal 10\\n- \\\\r, carriage return, decimal 13\\n- \\\\v, vertical tab, decimal 11\\n- non-breaking space, decimal 160\\n\\n`COMPRESS_WHITE_SPACE` also replaces multiple spaces with one space.\\n\\n*HTML_ENTITY_DECODE*\\n\\nUse this option to replace HTML-encoded characters with unencoded characters. `HTML_ENTITY_DECODE` performs the following operations:\\n\\n- Replaces `(ampersand)quot;` with `\\"`\\n- Replaces `(ampersand)nbsp;` with a non-breaking space, decimal 160\\n- Replaces `(ampersand)lt;` with a \\"less than\\" symbol\\n- Replaces `(ampersand)gt;` with `>`\\n- Replaces characters that are represented in hexadecimal format, `(ampersand)#xhhhh;` , with the corresponding characters\\n- Replaces characters that are represented in decimal format, `(ampersand)#nnnn;` , with the corresponding characters\\n\\n*LOWERCASE*\\n\\nUse this option to convert uppercase letters (A-Z) to lowercase (a-z).\\n\\n*URL_DECODE*\\n\\nUse this option to decode a URL-encoded value.\\n\\n*NONE*\\n\\nSpecify `NONE` if you don\'t want to perform any text transformations."}},"AWS::WAF::WebACL":{"attributes":{"Ref":"`Ref` returns the resource name, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nContains the `Rules` that identify the requests that you want to allow, block, or count. In a `WebACL` , you also specify a default action ( `ALLOW` or `BLOCK` ), and the action for each `Rule` that you add to a `WebACL` , for example, block requests from specified IP addresses or block requests from specified referrers. You also associate the `WebACL` with a Amazon CloudFront distribution to identify the requests that you want AWS WAF to filter. If you add more than one `Rule` to a `WebACL` , a request needs to match only one of the specifications to be allowed, blocked, or counted.","properties":{"DefaultAction":"The action to perform if none of the `Rules` contained in the `WebACL` match. The action is specified by the `WafAction` object.","MetricName":"The name of the metrics for this `WebACL` . The name can contain only alphanumeric characters (A-Z, a-z, 0-9), with maximum length 128 and minimum length one. It can\'t contain whitespace or metric names reserved for AWS WAF , including \\"All\\" and \\"Default_Action.\\" You can\'t change `MetricName` after you create the `WebACL` .","Name":"A friendly name or description of the `WebACL` . You can\'t change the name of a `WebACL` after you create it.","Rules":"An array that contains the action for each `Rule` in a `WebACL` , the priority of the `Rule` , and the ID of the `Rule` ."}},"AWS::WAF::WebACL.ActivatedRule":{"attributes":{},"description":"The `ActivatedRule` object in an `UpdateWebACL` request specifies a `Rule` that you want to insert or delete, the priority of the `Rule` in the `WebACL` , and the action that you want AWS WAF to take when a web request matches the `Rule` ( `ALLOW` , `BLOCK` , or `COUNT` ).\\n\\nTo specify whether to insert or delete a `Rule` , use the `Action` parameter in the `WebACLUpdate` data type.","properties":{"Action":"Specifies the action that Amazon CloudFront or AWS WAF takes when a web request matches the conditions in the `Rule` . Valid values for `Action` include the following:\\n\\n- `ALLOW` : CloudFront responds with the requested object.\\n- `BLOCK` : CloudFront responds with an HTTP 403 (Forbidden) status code.\\n- `COUNT` : AWS WAF increments a counter of requests that match the conditions in the rule and then continues to inspect the web request based on the remaining rules in the web ACL.\\n\\n`ActivatedRule|OverrideAction` applies only when updating or adding a `RuleGroup` to a `WebACL` . In this case, you do not use `ActivatedRule|Action` . For all other update requests, `ActivatedRule|Action` is used instead of `ActivatedRule|OverrideAction` .","Priority":"Specifies the order in which the `Rules` in a `WebACL` are evaluated. Rules with a lower value for `Priority` are evaluated before `Rules` with a higher value. The value must be a unique integer. If you add multiple `Rules` to a `WebACL` , the values don\'t need to be consecutive.","RuleId":"The `RuleId` for a `Rule` . You use `RuleId` to get more information about a `Rule` , update a `Rule` , insert a `Rule` into a `WebACL` or delete a one from a `WebACL` , or delete a `Rule` from AWS WAF .\\n\\n`RuleId` is returned by `CreateRule` and by `ListRules` ."}},"AWS::WAF::WebACL.WafAction":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nFor the action that is associated with a rule in a `WebACL` , specifies the action that you want AWS WAF to perform when a web request matches all of the conditions in a rule. For the default action in a `WebACL` , specifies the action that you want AWS WAF to take when a web request doesn\'t match all of the conditions in any of the rules in a `WebACL` .","properties":{"Type":"Specifies how you want AWS WAF to respond to requests that match the settings in a `Rule` . Valid settings include the following:\\n\\n- `ALLOW` : AWS WAF allows requests\\n- `BLOCK` : AWS WAF blocks requests\\n- `COUNT` : AWS WAF increments a counter of the requests that match all of the conditions in the rule. AWS WAF then continues to inspect the web request based on the remaining rules in the web ACL. You can\'t specify `COUNT` for the default action for a `WebACL` ."}},"AWS::WAF::XssMatchSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nA complex type that contains `XssMatchTuple` objects, which specify the parts of web requests that you want AWS WAF to inspect for cross-site scripting attacks and, if you want AWS WAF to inspect a header, the name of the header. If a `XssMatchSet` contains more than one `XssMatchTuple` object, a request needs to include cross-site scripting attacks in only one of the specified parts of the request to be considered a match.","properties":{"Name":"The name, if any, of the `XssMatchSet` .","XssMatchTuples":"Specifies the parts of web requests that you want to inspect for cross-site scripting attacks."}},"AWS::WAF::XssMatchSet.FieldToMatch":{"attributes":{},"description":"The part of a web request that you want to inspect, such as a specified header or a query string.","properties":{"Data":"When the value of `Type` is `HEADER` , enter the name of the header that you want AWS WAF to search, for example, `User-Agent` or `Referer` . The name of the header is not case sensitive.\\n\\nWhen the value of `Type` is `SINGLE_QUERY_ARG` , enter the name of the parameter that you want AWS WAF to search, for example, `UserName` or `SalesRegion` . The parameter name is not case sensitive.\\n\\nIf the value of `Type` is any other value, omit `Data` .","Type":"The part of the web request that you want AWS WAF to search for a specified string. Parts of a request that you can search include the following:\\n\\n- `HEADER` : A specified request header, for example, the value of the `User-Agent` or `Referer` header. If you choose `HEADER` for the type, specify the name of the header in `Data` .\\n- `METHOD` : The HTTP method, which indicated the type of operation that the request is asking the origin to perform. Amazon CloudFront supports the following methods: `DELETE` , `GET` , `HEAD` , `OPTIONS` , `PATCH` , `POST` , and `PUT` .\\n- `QUERY_STRING` : A query string, which is the part of a URL that appears after a `?` character, if any.\\n- `URI` : The part of a web request that identifies a resource, for example, `/images/daily-ad.jpg` .\\n- `BODY` : The part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form. The request body immediately follows the request headers. Note that only the first `8192` bytes of the request body are forwarded to AWS WAF for inspection. To allow or block requests based on the length of the body, you can create a size constraint set.\\n- `SINGLE_QUERY_ARG` : The parameter in the query string that you will inspect, such as *UserName* or *SalesRegion* . The maximum length for `SINGLE_QUERY_ARG` is 30 characters.\\n- `ALL_QUERY_ARGS` : Similar to `SINGLE_QUERY_ARG` , but rather than inspecting a single parameter, AWS WAF will inspect all parameters within the query for the value or regex pattern that you specify in `TargetString` ."}},"AWS::WAF::XssMatchSet.XssMatchTuple":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nSpecifies the part of a web request that you want AWS WAF to inspect for cross-site scripting attacks and, if you want AWS WAF to inspect a header, the name of the header.","properties":{"FieldToMatch":"The part of a web request that you want to inspect, such as a specified header or a query string.","TextTransformation":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass AWS WAF . If you specify a transformation, AWS WAF performs the transformation on `FieldToMatch` before inspecting it for a match.\\n\\nYou can only specify a single type of TextTransformation.\\n\\n*CMD_LINE*\\n\\nWhen you\'re concerned that attackers are injecting an operating system command line command and using unusual formatting to disguise some or all of the command, use this option to perform the following transformations:\\n\\n- Delete the following characters: \\\\ \\" \' ^\\n- Delete spaces before the following characters: / (\\n- Replace the following characters with a space: , ;\\n- Replace multiple spaces with one space\\n- Convert uppercase letters (A-Z) to lowercase (a-z)\\n\\n*COMPRESS_WHITE_SPACE*\\n\\nUse this option to replace the following characters with a space character (decimal 32):\\n\\n- \\\\f, formfeed, decimal 12\\n- \\\\t, tab, decimal 9\\n- \\\\n, newline, decimal 10\\n- \\\\r, carriage return, decimal 13\\n- \\\\v, vertical tab, decimal 11\\n- non-breaking space, decimal 160\\n\\n`COMPRESS_WHITE_SPACE` also replaces multiple spaces with one space.\\n\\n*HTML_ENTITY_DECODE*\\n\\nUse this option to replace HTML-encoded characters with unencoded characters. `HTML_ENTITY_DECODE` performs the following operations:\\n\\n- Replaces `(ampersand)quot;` with `\\"`\\n- Replaces `(ampersand)nbsp;` with a non-breaking space, decimal 160\\n- Replaces `(ampersand)lt;` with a \\"less than\\" symbol\\n- Replaces `(ampersand)gt;` with `>`\\n- Replaces characters that are represented in hexadecimal format, `(ampersand)#xhhhh;` , with the corresponding characters\\n- Replaces characters that are represented in decimal format, `(ampersand)#nnnn;` , with the corresponding characters\\n\\n*LOWERCASE*\\n\\nUse this option to convert uppercase letters (A-Z) to lowercase (a-z).\\n\\n*URL_DECODE*\\n\\nUse this option to decode a URL-encoded value.\\n\\n*NONE*\\n\\nSpecify `NONE` if you don\'t want to perform any text transformations."}},"AWS::WAFRegional::ByteMatchSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nThe `AWS::WAFRegional::ByteMatchSet` resource creates an AWS WAF `ByteMatchSet` that identifies a part of a web request that you want to inspect.","properties":{"ByteMatchTuples":"Specifies the bytes (typically a string that corresponds with ASCII characters) that you want AWS WAF to search for in web requests, the location in requests that you want AWS WAF to search, and other settings.","Name":"A friendly name or description of the `ByteMatchSet` . You can\'t change `Name` after you create a `ByteMatchSet` ."}},"AWS::WAFRegional::ByteMatchSet.ByteMatchTuple":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nThe bytes (typically a string that corresponds with ASCII characters) that you want AWS WAF to search for in web requests, the location in requests that you want AWS WAF to search, and other settings.","properties":{"FieldToMatch":"The part of a web request that you want AWS WAF to inspect, such as a specific header or a query string.","PositionalConstraint":"Within the portion of a web request that you want to search (for example, in the query string, if any), specify where you want AWS WAF to search. Valid values include the following:\\n\\n*CONTAINS*\\n\\nThe specified part of the web request must include the value of `TargetString` , but the location doesn\'t matter.\\n\\n*CONTAINS_WORD*\\n\\nThe specified part of the web request must include the value of `TargetString` , and `TargetString` must contain only alphanumeric characters or underscore (A-Z, a-z, 0-9, or _). In addition, `TargetString` must be a word, which means one of the following:\\n\\n- `TargetString` exactly matches the value of the specified part of the web request, such as the value of a header.\\n- `TargetString` is at the beginning of the specified part of the web request and is followed by a character other than an alphanumeric character or underscore (_), for example, `BadBot;` .\\n- `TargetString` is at the end of the specified part of the web request and is preceded by a character other than an alphanumeric character or underscore (_), for example, `;BadBot` .\\n- `TargetString` is in the middle of the specified part of the web request and is preceded and followed by characters other than alphanumeric characters or underscore (_), for example, `-BadBot;` .\\n\\n*EXACTLY*\\n\\nThe value of the specified part of the web request must exactly match the value of `TargetString` .\\n\\n*STARTS_WITH*\\n\\nThe value of `TargetString` must appear at the beginning of the specified part of the web request.\\n\\n*ENDS_WITH*\\n\\nThe value of `TargetString` must appear at the end of the specified part of the web request.","TargetString":"The value that you want AWS WAF to search for. AWS WAF searches for the specified string in the part of web requests that you specified in `FieldToMatch` . The maximum length of the value is 50 bytes.\\n\\nYou must specify this property or the `TargetStringBase64` property.\\n\\nValid values depend on the values that you specified for `FieldToMatch` :\\n\\n- `HEADER` : The value that you want AWS WAF to search for in the request header that you specified in `FieldToMatch` , for example, the value of the `User-Agent` or `Referer` header.\\n- `METHOD` : The HTTP method, which indicates the type of operation specified in the request.\\n- `QUERY_STRING` : The value that you want AWS WAF to search for in the query string, which is the part of a URL that appears after a `?` character.\\n- `URI` : The value that you want AWS WAF to search for in the part of a URL that identifies a resource, for example, `/images/daily-ad.jpg` .\\n- `BODY` : The part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form. The request body immediately follows the request headers. Note that only the first `8192` bytes of the request body are forwarded to AWS WAF for inspection. To allow or block requests based on the length of the body, you can create a size constraint set.\\n- `SINGLE_QUERY_ARG` : The parameter in the query string that you will inspect, such as *UserName* or *SalesRegion* . The maximum length for `SINGLE_QUERY_ARG` is 30 characters.\\n- `ALL_QUERY_ARGS` : Similar to `SINGLE_QUERY_ARG` , but instead of inspecting a single parameter, AWS WAF inspects all parameters within the query string for the value or regex pattern that you specify in `TargetString` .\\n\\nIf `TargetString` includes alphabetic characters A-Z and a-z, note that the value is case sensitive.","TargetStringBase64":"The base64-encoded value that AWS WAF searches for. AWS CloudFormation sends this value to AWS WAF without encoding it.\\n\\nYou must specify this property or the `TargetString` property.\\n\\nAWS WAF searches for this value in a specific part of web requests, which you define in the `FieldToMatch` property.\\n\\nValid values depend on the Type value in the `FieldToMatch` property. For example, for a `METHOD` type, you must specify HTTP methods such as `DELETE, GET, HEAD, OPTIONS, PATCH, POST` , and `PUT` .","TextTransformation":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass AWS WAF . If you specify a transformation, AWS WAF performs the transformation on `FieldToMatch` before inspecting it for a match.\\n\\nYou can only specify a single type of TextTransformation.\\n\\n*CMD_LINE*\\n\\nWhen you\'re concerned that attackers are injecting an operating system command line command and using unusual formatting to disguise some or all of the command, use this option to perform the following transformations:\\n\\n- Delete the following characters: \\\\ \\" \' ^\\n- Delete spaces before the following characters: / (\\n- Replace the following characters with a space: , ;\\n- Replace multiple spaces with one space\\n- Convert uppercase letters (A-Z) to lowercase (a-z)\\n\\n*COMPRESS_WHITE_SPACE*\\n\\nUse this option to replace the following characters with a space character (decimal 32):\\n\\n- \\\\f, formfeed, decimal 12\\n- \\\\t, tab, decimal 9\\n- \\\\n, newline, decimal 10\\n- \\\\r, carriage return, decimal 13\\n- \\\\v, vertical tab, decimal 11\\n- non-breaking space, decimal 160\\n\\n`COMPRESS_WHITE_SPACE` also replaces multiple spaces with one space.\\n\\n*HTML_ENTITY_DECODE*\\n\\nUse this option to replace HTML-encoded characters with unencoded characters. `HTML_ENTITY_DECODE` performs the following operations:\\n\\n- Replaces `(ampersand)quot;` with `\\"`\\n- Replaces `(ampersand)nbsp;` with a non-breaking space, decimal 160\\n- Replaces `(ampersand)lt;` with a \\"less than\\" symbol\\n- Replaces `(ampersand)gt;` with `>`\\n- Replaces characters that are represented in hexadecimal format, `(ampersand)#xhhhh;` , with the corresponding characters\\n- Replaces characters that are represented in decimal format, `(ampersand)#nnnn;` , with the corresponding characters\\n\\n*LOWERCASE*\\n\\nUse this option to convert uppercase letters (A-Z) to lowercase (a-z).\\n\\n*URL_DECODE*\\n\\nUse this option to decode a URL-encoded value.\\n\\n*NONE*\\n\\nSpecify `NONE` if you don\'t want to perform any text transformations."}},"AWS::WAFRegional::ByteMatchSet.FieldToMatch":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nSpecifies where in a web request to look for `TargetString` .","properties":{"Data":"When the value of `Type` is `HEADER` , enter the name of the header that you want AWS WAF to search, for example, `User-Agent` or `Referer` . The name of the header is not case sensitive.\\n\\nWhen the value of `Type` is `SINGLE_QUERY_ARG` , enter the name of the parameter that you want AWS WAF to search, for example, `UserName` or `SalesRegion` . The parameter name is not case sensitive.\\n\\nIf the value of `Type` is any other value, omit `Data` .","Type":"The part of the web request that you want AWS WAF to search for a specified string. Parts of a request that you can search include the following:\\n\\n- `HEADER` : A specified request header, for example, the value of the `User-Agent` or `Referer` header. If you choose `HEADER` for the type, specify the name of the header in `Data` .\\n- `METHOD` : The HTTP method, which indicated the type of operation that the request is asking the origin to perform.\\n- `QUERY_STRING` : A query string, which is the part of a URL that appears after a `?` character, if any.\\n- `URI` : The part of a web request that identifies a resource, for example, `/images/daily-ad.jpg` .\\n- `BODY` : The part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form. The request body immediately follows the request headers. Note that only the first `8192` bytes of the request body are forwarded to AWS WAF for inspection. To allow or block requests based on the length of the body, you can create a size constraint set.\\n- `SINGLE_QUERY_ARG` : The parameter in the query string that you will inspect, such as *UserName* or *SalesRegion* . The maximum length for `SINGLE_QUERY_ARG` is 30 characters.\\n- `ALL_QUERY_ARGS` : Similar to `SINGLE_QUERY_ARG` , but rather than inspecting a single parameter, AWS WAF will inspect all parameters within the query for the value or regex pattern that you specify in `TargetString` ."}},"AWS::WAFRegional::GeoMatchSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nContains one or more countries that AWS WAF will search for.","properties":{"GeoMatchConstraints":"An array of `GeoMatchConstraint` objects, which contain the country that you want AWS WAF to search for.","Name":"A friendly name or description of the `GeoMatchSet` . You can\'t change the name of an `GeoMatchSet` after you create it."}},"AWS::WAFRegional::GeoMatchSet.GeoMatchConstraint":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nThe country from which web requests originate that you want AWS WAF to search for.","properties":{"Type":"The type of geographical area you want AWS WAF to search for. Currently `Country` is the only valid value.","Value":"The country that you want AWS WAF to search for."}},"AWS::WAFRegional::IPSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nContains one or more IP addresses or blocks of IP addresses specified in Classless Inter-Domain Routing (CIDR) notation. AWS WAF supports IPv4 address ranges: /8 and any range between /16 through /32. AWS WAF supports IPv6 address ranges: /24, /32, /48, /56, /64, and /128.\\n\\nTo specify an individual IP address, you specify the four-part IP address followed by a `/32` , for example, 192.0.2.0/32. To block a range of IP addresses, you can specify /8 or any range between /16 through /32 (for IPv4) or /24, /32, /48, /56, /64, or /128 (for IPv6). For more information about CIDR notation, see the Wikipedia entry [Classless Inter-Domain Routing](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) .","properties":{"IPSetDescriptors":"The IP address type ( `IPV4` or `IPV6` ) and the IP address range (in CIDR notation) that web requests originate from.","Name":"A friendly name or description of the `IPSet` . You can\'t change the name of an `IPSet` after you create it."}},"AWS::WAFRegional::IPSet.IPSetDescriptor":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nSpecifies the IP address type ( `IPV4` or `IPV6` ) and the IP address range (in CIDR format) that web requests originate from.","properties":{"Type":"Specify `IPV4` or `IPV6` .","Value":"Specify an IPv4 address by using CIDR notation. For example:\\n\\n- To configure AWS WAF to allow, block, or count requests that originated from the IP address 192.0.2.44, specify `192.0.2.44/32` .\\n- To configure AWS WAF to allow, block, or count requests that originated from IP addresses from 192.0.2.0 to 192.0.2.255, specify `192.0.2.0/24` .\\n\\nFor more information about CIDR notation, see the Wikipedia entry [Classless Inter-Domain Routing](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) .\\n\\nSpecify an IPv6 address by using CIDR notation. For example:\\n\\n- To configure AWS WAF to allow, block, or count requests that originated from the IP address 1111:0000:0000:0000:0000:0000:0000:0111, specify `1111:0000:0000:0000:0000:0000:0000:0111/128` .\\n- To configure AWS WAF to allow, block, or count requests that originated from IP addresses 1111:0000:0000:0000:0000:0000:0000:0000 to 1111:0000:0000:0000:ffff:ffff:ffff:ffff, specify `1111:0000:0000:0000:0000:0000:0000:0000/64` ."}},"AWS::WAFRegional::RateBasedRule":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nA `RateBasedRule` is identical to a regular `Rule` , with one addition: a `RateBasedRule` counts the number of requests that arrive from a specified IP address every five minutes. For example, based on recent requests that you\'ve seen from an attacker, you might create a `RateBasedRule` that includes the following conditions:\\n\\n- The requests come from 192.0.2.44.\\n- They contain the value `BadBot` in the `User-Agent` header.\\n\\nIn the rule, you also define the rate limit as 15,000.\\n\\nRequests that meet both of these conditions and exceed 15,000 requests every five minutes trigger the rule\'s action (block or count), which is defined in the web ACL.\\n\\nNote you can only create rate-based rules using an AWS CloudFormation template. To add the rate-based rules created through AWS CloudFormation to a web ACL, use the AWS WAF console, API, or command line interface (CLI). For more information, see [UpdateWebACL](https://docs.aws.amazon.com/waf/latest/APIReference/API_regional_UpdateWebACL.html) .","properties":{"MatchPredicates":"The `Predicates` object contains one `Predicate` element for each `ByteMatchSet` , `IPSet` , or `SqlInjectionMatchSet>` object that you want to include in a `RateBasedRule` .","MetricName":"A name for the metrics for a `RateBasedRule` . The name can contain only alphanumeric characters (A-Z, a-z, 0-9), with maximum length 128 and minimum length one. It can\'t contain whitespace or metric names reserved for AWS WAF , including \\"All\\" and \\"Default_Action.\\" You can\'t change the name of the metric after you create the `RateBasedRule` .","Name":"A friendly name or description for a `RateBasedRule` . You can\'t change the name of a `RateBasedRule` after you create it.","RateKey":"The field that AWS WAF uses to determine if requests are likely arriving from single source and thus subject to rate monitoring. The only valid value for `RateKey` is `IP` . `IP` indicates that requests arriving from the same IP address are subject to the `RateLimit` that is specified in the `RateBasedRule` .","RateLimit":"The maximum number of requests, which have an identical value in the field specified by the `RateKey` , allowed in a five-minute period. If the number of requests exceeds the `RateLimit` and the other predicates specified in the rule are also met, AWS WAF triggers the action that is specified for this rule."}},"AWS::WAFRegional::RateBasedRule.Predicate":{"attributes":{},"description":"Specifies the `ByteMatchSet` , `IPSet` , `SqlInjectionMatchSet` , `XssMatchSet` , `RegexMatchSet` , `GeoMatchSet` , and `SizeConstraintSet` objects that you want to add to a `Rule` and, for each object, indicates whether you want to negate the settings, for example, requests that do NOT originate from the IP address 192.0.2.44.","properties":{"DataId":"A unique identifier for a predicate in a `Rule` , such as `ByteMatchSetId` or `IPSetId` . The ID is returned by the corresponding `Create` or `List` command.","Negated":"Set `Negated` to `False` if you want AWS WAF to allow, block, or count requests based on the settings in the specified `ByteMatchSet` , `IPSet` , `SqlInjectionMatchSet` , `XssMatchSet` , `RegexMatchSet` , `GeoMatchSet` , or `SizeConstraintSet` . For example, if an `IPSet` includes the IP address `192.0.2.44` , AWS WAF will allow or block requests based on that IP address.\\n\\nSet `Negated` to `True` if you want AWS WAF to allow or block a request based on the negation of the settings in the `ByteMatchSet` , `IPSet` , `SqlInjectionMatchSet` , `XssMatchSet` , `RegexMatchSet` , `GeoMatchSet` , or `SizeConstraintSet` >. For example, if an `IPSet` includes the IP address `192.0.2.44` , AWS WAF will allow, block, or count requests based on all IP addresses *except* `192.0.2.44` .","Type":"The type of predicate in a `Rule` , such as `ByteMatch` or `IPSet` ."}},"AWS::WAFRegional::RegexPatternSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"The `RegexPatternSet` specifies the regular expression (regex) pattern that you want AWS WAF to search for, such as `B[a@]dB[o0]t` . You can then configure AWS WAF to reject those requests.\\n\\nNote that you can only create regex pattern sets using a AWS CloudFormation template. To add the regex pattern sets created through AWS CloudFormation to a RegexMatchSet, use the AWS WAF console, API, or command line interface (CLI). For more information, see [UpdateRegexMatchSet](https://docs.aws.amazon.com/waf/latest/APIReference/API_regional_UpdateRegexMatchSet.html) .","properties":{"Name":"A friendly name or description of the `RegexPatternSet` . You can\'t change `Name` after you create a `RegexPatternSet` .","RegexPatternStrings":"Specifies the regular expression (regex) patterns that you want AWS WAF to search for, such as `B[a@]dB[o0]t` ."}},"AWS::WAFRegional::Rule":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nA combination of `ByteMatchSet` , `IPSet` , and/or `SqlInjectionMatchSet` objects that identify the web requests that you want to allow, block, or count. For example, you might create a `Rule` that includes the following predicates:\\n\\n- An `IPSet` that causes AWS WAF to search for web requests that originate from the IP address `192.0.2.44`\\n- A `ByteMatchSet` that causes AWS WAF to search for web requests for which the value of the `User-Agent` header is `BadBot` .\\n\\nTo match the settings in this `Rule` , a request must originate from `192.0.2.44` AND include a `User-Agent` header for which the value is `BadBot` .","properties":{"MetricName":"A name for the metrics for this `Rule` . The name can contain only alphanumeric characters (A-Z, a-z, 0-9), with maximum length 128 and minimum length one. It can\'t contain whitespace or metric names reserved for AWS WAF, including \\"All\\" and \\"Default_Action.\\" You can\'t change `MetricName` after you create the `Rule` .","Name":"The friendly name or description for the `Rule` . You can\'t change the name of a `Rule` after you create it.","Predicates":"The `Predicates` object contains one `Predicate` element for each `ByteMatchSet` , `IPSet` , or `SqlInjectionMatchSet` object that you want to include in a `Rule` ."}},"AWS::WAFRegional::Rule.Predicate":{"attributes":{},"description":"Specifies the `ByteMatchSet` , `IPSet` , `SqlInjectionMatchSet` , `XssMatchSet` , `RegexMatchSet` , `GeoMatchSet` , and `SizeConstraintSet` objects that you want to add to a `Rule` and, for each object, indicates whether you want to negate the settings, for example, requests that do NOT originate from the IP address 192.0.2.44.","properties":{"DataId":"A unique identifier for a predicate in a `Rule` , such as `ByteMatchSetId` or `IPSetId` . The ID is returned by the corresponding `Create` or `List` command.","Negated":"Set `Negated` to `False` if you want AWS WAF to allow, block, or count requests based on the settings in the specified `ByteMatchSet` , `IPSet` , `SqlInjectionMatchSet` , `XssMatchSet` , `RegexMatchSet` , `GeoMatchSet` , or `SizeConstraintSet` . For example, if an `IPSet` includes the IP address `192.0.2.44` , AWS WAF will allow or block requests based on that IP address.\\n\\nSet `Negated` to `True` if you want AWS WAF to allow or block a request based on the negation of the settings in the `ByteMatchSet` , `IPSet` , `SqlInjectionMatchSet` , `XssMatchSet` , `RegexMatchSet` , `GeoMatchSet` , or `SizeConstraintSet` . For example, if an `IPSet` includes the IP address `192.0.2.44` , AWS WAF will allow, block, or count requests based on all IP addresses *except* `192.0.2.44` .","Type":"The type of predicate in a `Rule` , such as `ByteMatch` or `IPSet` ."}},"AWS::WAFRegional::SizeConstraintSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nA complex type that contains `SizeConstraint` objects, which specify the parts of web requests that you want AWS WAF to inspect the size of. If a `SizeConstraintSet` contains more than one `SizeConstraint` object, a request only needs to match one constraint to be considered a match.","properties":{"Name":"The name, if any, of the `SizeConstraintSet` .","SizeConstraints":"The size constraint and the part of the web request to check."}},"AWS::WAFRegional::SizeConstraintSet.FieldToMatch":{"attributes":{},"description":"The part of a web request that you want AWS WAF to inspect, such as a specific header or a query string.","properties":{"Data":"When the value of `Type` is `HEADER` , enter the name of the header that you want AWS WAF to search, for example, `User-Agent` or `Referer` . The name of the header is not case sensitive.\\n\\nWhen the value of `Type` is `SINGLE_QUERY_ARG` , enter the name of the parameter that you want AWS WAF to search, for example, `UserName` or `SalesRegion` . The parameter name is not case sensitive.\\n\\nIf the value of `Type` is any other value, omit `Data` .","Type":"The part of the web request that you want AWS WAF to search for a specified string. Parts of a request that you can search include the following:\\n\\n- `HEADER` : A specified request header, for example, the value of the `User-Agent` or `Referer` header. If you choose `HEADER` for the type, specify the name of the header in `Data` .\\n- `METHOD` : The HTTP method, which indicates the type of operation that the request is asking the origin to perform.\\n- `QUERY_STRING` : A query string, which is the part of a URL that appears after a `?` character, if any.\\n- `URI` : The part of a web request that identifies a resource, for example, `/images/daily-ad.jpg` .\\n- `BODY` : The part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form. The request body immediately follows the request headers. Note that only the first `8192` bytes of the request body are forwarded to AWS WAF for inspection. To allow or block requests based on the length of the body, you can create a size constraint set.\\n- `SINGLE_QUERY_ARG` : The parameter in the query string that you will inspect, such as *UserName* or *SalesRegion* . The maximum length for `SINGLE_QUERY_ARG` is 30 characters.\\n- `ALL_QUERY_ARGS` : Similar to `SINGLE_QUERY_ARG` , but rather than inspecting a single parameter, AWS WAF will inspect all parameters within the query for the value or regex pattern that you specify in `TargetString` ."}},"AWS::WAFRegional::SizeConstraintSet.SizeConstraint":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nSpecifies a constraint on the size of a part of the web request. AWS WAF uses the `Size` , `ComparisonOperator` , and `FieldToMatch` to build an expression in the form of \\" `Size` `ComparisonOperator` size in bytes of `FieldToMatch` \\". If that expression is true, the `SizeConstraint` is considered to match.","properties":{"ComparisonOperator":"The type of comparison you want AWS WAF to perform. AWS WAF uses this in combination with the provided `Size` and `FieldToMatch` to build an expression in the form of \\" `Size` `ComparisonOperator` size in bytes of `FieldToMatch` \\". If that expression is true, the `SizeConstraint` is considered to match.\\n\\n*EQ* : Used to test if the `Size` is equal to the size of the `FieldToMatch`\\n\\n*NE* : Used to test if the `Size` is not equal to the size of the `FieldToMatch`\\n\\n*LE* : Used to test if the `Size` is less than or equal to the size of the `FieldToMatch`\\n\\n*LT* : Used to test if the `Size` is strictly less than the size of the `FieldToMatch`\\n\\n*GE* : Used to test if the `Size` is greater than or equal to the size of the `FieldToMatch`\\n\\n*GT* : Used to test if the `Size` is strictly greater than the size of the `FieldToMatch`","FieldToMatch":"The part of a web request that you want AWS WAF to inspect, such as a specific header or a query string.","Size":"The size in bytes that you want AWS WAF to compare against the size of the specified `FieldToMatch` . AWS WAF uses this in combination with `ComparisonOperator` and `FieldToMatch` to build an expression in the form of \\" `Size` `ComparisonOperator` size in bytes of `FieldToMatch` \\". If that expression is true, the `SizeConstraint` is considered to match.\\n\\nValid values for size are 0 - 21474836480 bytes (0 - 20 GB).\\n\\nIf you specify `URI` for the value of `Type` , the / in the URI path that you specify counts as one character. For example, the URI `/logo.jpg` is nine characters long.","TextTransformation":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass AWS WAF . If you specify a transformation, AWS WAF performs the transformation on `FieldToMatch` before inspecting a request for a match.\\n\\nYou can only specify a single type of TextTransformation.\\n\\nNote that if you choose `BODY` for the value of `Type` , you must choose `NONE` for `TextTransformation` because the API Gateway API or Application Load Balancer forward only the first 8192 bytes for inspection.\\n\\n*NONE*\\n\\nSpecify `NONE` if you don\'t want to perform any text transformations.\\n\\n*CMD_LINE*\\n\\nWhen you\'re concerned that attackers are injecting an operating system command line command and using unusual formatting to disguise some or all of the command, use this option to perform the following transformations:\\n\\n- Delete the following characters: \\\\ \\" \' ^\\n- Delete spaces before the following characters: / (\\n- Replace the following characters with a space: , ;\\n- Replace multiple spaces with one space\\n- Convert uppercase letters (A-Z) to lowercase (a-z)\\n\\n*COMPRESS_WHITE_SPACE*\\n\\nUse this option to replace the following characters with a space character (decimal 32):\\n\\n- \\\\f, formfeed, decimal 12\\n- \\\\t, tab, decimal 9\\n- \\\\n, newline, decimal 10\\n- \\\\r, carriage return, decimal 13\\n- \\\\v, vertical tab, decimal 11\\n- non-breaking space, decimal 160\\n\\n`COMPRESS_WHITE_SPACE` also replaces multiple spaces with one space.\\n\\n*HTML_ENTITY_DECODE*\\n\\nUse this option to replace HTML-encoded characters with unencoded characters. `HTML_ENTITY_DECODE` performs the following operations:\\n\\n- Replaces `(ampersand)quot;` with `\\"`\\n- Replaces `(ampersand)nbsp;` with a non-breaking space, decimal 160\\n- Replaces `(ampersand)lt;` with a \\"less than\\" symbol\\n- Replaces `(ampersand)gt;` with `>`\\n- Replaces characters that are represented in hexadecimal format, `(ampersand)#xhhhh;` , with the corresponding characters\\n- Replaces characters that are represented in decimal format, `(ampersand)#nnnn;` , with the corresponding characters\\n\\n*LOWERCASE*\\n\\nUse this option to convert uppercase letters (A-Z) to lowercase (a-z).\\n\\n*URL_DECODE*\\n\\nUse this option to decode a URL-encoded value."}},"AWS::WAFRegional::SqlInjectionMatchSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nA complex type that contains `SqlInjectionMatchTuple` objects, which specify the parts of web requests that you want AWS WAF to inspect for snippets of malicious SQL code and, if you want AWS WAF to inspect a header, the name of the header. If a `SqlInjectionMatchSet` contains more than one `SqlInjectionMatchTuple` object, a request needs to include snippets of SQL code in only one of the specified parts of the request to be considered a match.","properties":{"Name":"The name, if any, of the `SqlInjectionMatchSet` .","SqlInjectionMatchTuples":"Specifies the parts of web requests that you want to inspect for snippets of malicious SQL code."}},"AWS::WAFRegional::SqlInjectionMatchSet.FieldToMatch":{"attributes":{},"description":"The part of a web request that you want AWS WAF to inspect, such as a specific header or a query string.","properties":{"Data":"When the value of `Type` is `HEADER` , enter the name of the header that you want AWS WAF to search, for example, `User-Agent` or `Referer` . The name of the header is not case sensitive.\\n\\nWhen the value of `Type` is `SINGLE_QUERY_ARG` , enter the name of the parameter that you want AWS WAF to search, for example, `UserName` or `SalesRegion` . The parameter name is not case sensitive.\\n\\nIf the value of `Type` is any other value, omit `Data` .","Type":"The part of the web request that you want AWS WAF to search for a specified string. Parts of a request that you can search include the following:\\n\\n- `HEADER` : A specified request header, for example, the value of the `User-Agent` or `Referer` header. If you choose `HEADER` for the type, specify the name of the header in `Data` .\\n- `METHOD` : The HTTP method, which indicates the type of operation that the request is asking the origin to perform.\\n- `QUERY_STRING` : A query string, which is the part of a URL that appears after a `?` character, if any.\\n- `URI` : The part of a web request that identifies a resource, for example, `/images/daily-ad.jpg` .\\n- `BODY` : The part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form. The request body immediately follows the request headers. Note that only the first `8192` bytes of the request body are forwarded to AWS WAF for inspection. To allow or block requests based on the length of the body, you can create a size constraint set.\\n- `SINGLE_QUERY_ARG` : The parameter in the query string that you will inspect, such as *UserName* or *SalesRegion* . The maximum length for `SINGLE_QUERY_ARG` is 30 characters.\\n- `ALL_QUERY_ARGS` : Similar to `SINGLE_QUERY_ARG` , but rather than inspecting a single parameter, AWS WAF will inspect all parameters within the query for the value or regex pattern that you specify in `TargetString` ."}},"AWS::WAFRegional::SqlInjectionMatchSet.SqlInjectionMatchTuple":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nSpecifies the part of a web request that you want AWS WAF to inspect for snippets of malicious SQL code and, if you want AWS WAF to inspect a header, the name of the header.","properties":{"FieldToMatch":"The part of a web request that you want AWS WAF to inspect, such as a specific header or a query string.","TextTransformation":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass AWS WAF . If you specify a transformation, AWS WAF performs the transformation on `FieldToMatch` before inspecting it for a match.\\n\\nYou can only specify a single type of TextTransformation.\\n\\n*CMD_LINE*\\n\\nWhen you\'re concerned that attackers are injecting an operating system command line command and using unusual formatting to disguise some or all of the command, use this option to perform the following transformations:\\n\\n- Delete the following characters: \\\\ \\" \' ^\\n- Delete spaces before the following characters: / (\\n- Replace the following characters with a space: , ;\\n- Replace multiple spaces with one space\\n- Convert uppercase letters (A-Z) to lowercase (a-z)\\n\\n*COMPRESS_WHITE_SPACE*\\n\\nUse this option to replace the following characters with a space character (decimal 32):\\n\\n- \\\\f, formfeed, decimal 12\\n- \\\\t, tab, decimal 9\\n- \\\\n, newline, decimal 10\\n- \\\\r, carriage return, decimal 13\\n- \\\\v, vertical tab, decimal 11\\n- non-breaking space, decimal 160\\n\\n`COMPRESS_WHITE_SPACE` also replaces multiple spaces with one space.\\n\\n*HTML_ENTITY_DECODE*\\n\\nUse this option to replace HTML-encoded characters with unencoded characters. `HTML_ENTITY_DECODE` performs the following operations:\\n\\n- Replaces `(ampersand)quot;` with `\\"`\\n- Replaces `(ampersand)nbsp;` with a non-breaking space, decimal 160\\n- Replaces `(ampersand)lt;` with a \\"less than\\" symbol\\n- Replaces `(ampersand)gt;` with `>`\\n- Replaces characters that are represented in hexadecimal format, `(ampersand)#xhhhh;` , with the corresponding characters\\n- Replaces characters that are represented in decimal format, `(ampersand)#nnnn;` , with the corresponding characters\\n\\n*LOWERCASE*\\n\\nUse this option to convert uppercase letters (A-Z) to lowercase (a-z).\\n\\n*URL_DECODE*\\n\\nUse this option to decode a URL-encoded value.\\n\\n*NONE*\\n\\nSpecify `NONE` if you don\'t want to perform any text transformations."}},"AWS::WAFRegional::WebACL":{"attributes":{"Ref":"`Ref` returns the resource name, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nContains the `Rules` that identify the requests that you want to allow, block, or count. In a `WebACL` , you also specify a default action ( `ALLOW` or `BLOCK` ), and the action for each `Rule` that you add to a `WebACL` , for example, block requests from specified IP addresses or block requests from specified referrers. If you add more than one `Rule` to a `WebACL` , a request needs to match only one of the specifications to be allowed, blocked, or counted.\\n\\nTo identify the requests that you want AWS WAF to filter, you associate the `WebACL` with an API Gateway API or an Application Load Balancer.","properties":{"DefaultAction":"The action to perform if none of the `Rules` contained in the `WebACL` match. The action is specified by the `WafAction` object.","MetricName":"A name for the metrics for this `WebACL` . The name can contain only alphanumeric characters (A-Z, a-z, 0-9), with maximum length 128 and minimum length one. It can\'t contain whitespace or metric names reserved for AWS WAF, including \\"All\\" and \\"Default_Action.\\" You can\'t change `MetricName` after you create the `WebACL` .","Name":"A friendly name or description of the `WebACL` . You can\'t change the name of a `WebACL` after you create it.","Rules":"An array that contains the action for each `Rule` in a `WebACL` , the priority of the `Rule` , and the ID of the `Rule` ."}},"AWS::WAFRegional::WebACL.Action":{"attributes":{},"description":"Specifies the action AWS WAF takes when a web request matches or doesn\'t match all rule conditions.","properties":{"Type":"For actions that are associated with a rule, the action that AWS WAF takes when a web request matches all conditions in a rule.\\n\\nFor the default action of a web access control list (ACL), the action that AWS WAF takes when a web request doesn\'t match all conditions in any rule.\\n\\nValid settings include the following:\\n\\n- `ALLOW` : AWS WAF allows requests\\n- `BLOCK` : AWS WAF blocks requests\\n- `COUNT` : AWS WAF increments a counter of the requests that match all of the conditions in the rule. AWS WAF then continues to inspect the web request based on the remaining rules in the web ACL. You can\'t specify `COUNT` for the default action for a WebACL."}},"AWS::WAFRegional::WebACL.Rule":{"attributes":{},"description":"A combination of `ByteMatchSet` , `IPSet` , and/or `SqlInjectionMatchSet` objects that identify the web requests that you want to allow, block, or count. For example, you might create a `Rule` that includes the following predicates:\\n\\n- An `IPSet` that causes AWS WAF to search for web requests that originate from the IP address `192.0.2.44`\\n- A `ByteMatchSet` that causes AWS WAF to search for web requests for which the value of the `User-Agent` header is `BadBot` .\\n\\nTo match the settings in this `Rule` , a request must originate from `192.0.2.44` AND include a `User-Agent` header for which the value is `BadBot` .","properties":{"Action":"The action that AWS WAF takes when a web request matches all conditions in the rule, such as allow, block, or count the request.","Priority":"The order in which AWS WAF evaluates the rules in a web ACL. AWS WAF evaluates rules with a lower value before rules with a higher value. The value must be a unique integer. If you have multiple rules in a web ACL, the priority numbers do not need to be consecutive.","RuleId":"The ID of an AWS WAF Regional rule to associate with a web ACL."}},"AWS::WAFRegional::WebACLAssociation":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nThe AWS::WAFRegional::WebACLAssociation resource associates an AWS WAF Regional web access control group (ACL) with a resource.","properties":{"ResourceArn":"The Amazon Resource Name (ARN) of the resource to protect with the web ACL.","WebACLId":"A unique identifier (ID) for the web ACL."}},"AWS::WAFRegional::XssMatchSet":{"attributes":{"Ref":"`Ref` returns the resource physical ID, such as 1234a1a-a1b1-12a1-abcd-a123b123456."},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nA complex type that contains `XssMatchTuple` objects, which specify the parts of web requests that you want AWS WAF to inspect for cross-site scripting attacks and, if you want AWS WAF to inspect a header, the name of the header. If a `XssMatchSet` contains more than one `XssMatchTuple` object, a request needs to include cross-site scripting attacks in only one of the specified parts of the request to be considered a match.","properties":{"Name":"The name, if any, of the `XssMatchSet` .","XssMatchTuples":"Specifies the parts of web requests that you want to inspect for cross-site scripting attacks."}},"AWS::WAFRegional::XssMatchSet.FieldToMatch":{"attributes":{},"description":"The part of a web request that you want AWS WAF to inspect, such as a specific header or a query string.","properties":{"Data":"When the value of `Type` is `HEADER` , enter the name of the header that you want AWS WAF to search, for example, `User-Agent` or `Referer` . The name of the header is not case sensitive.\\n\\nWhen the value of `Type` is `SINGLE_QUERY_ARG` , enter the name of the parameter that you want AWS WAF to search, for example, `UserName` or `SalesRegion` . The parameter name is not case sensitive.\\n\\nIf the value of `Type` is any other value, omit `Data` .","Type":"The part of the web request that you want AWS WAF to search for a specified string. Parts of a request that you can search include the following:\\n\\n- `HEADER` : A specified request header, for example, the value of the `User-Agent` or `Referer` header. If you choose `HEADER` for the type, specify the name of the header in `Data` .\\n- `METHOD` : The HTTP method, which indicates the type of operation that the request is asking the origin to perform.\\n- `QUERY_STRING` : A query string, which is the part of a URL that appears after a `?` character, if any.\\n- `URI` : The part of a web request that identifies a resource, for example, `/images/daily-ad.jpg` .\\n- `BODY` : The part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form. The request body immediately follows the request headers. Note that only the first `8192` bytes of the request body are forwarded to AWS WAF for inspection. To allow or block requests based on the length of the body, you can create a size constraint set.\\n- `SINGLE_QUERY_ARG` : The parameter in the query string that you will inspect, such as *UserName* or *SalesRegion* . The maximum length for `SINGLE_QUERY_ARG` is 30 characters.\\n- `ALL_QUERY_ARGS` : Similar to `SINGLE_QUERY_ARG` , but rather than inspecting a single parameter, AWS WAF will inspect all parameters within the query for the value or regex pattern that you specify in `TargetString` ."}},"AWS::WAFRegional::XssMatchSet.XssMatchTuple":{"attributes":{},"description":"> This is *AWS WAF Classic* documentation. For more information, see [AWS WAF Classic](https://docs.aws.amazon.com/waf/latest/developerguide/classic-waf-chapter.html) in the developer guide.\\n> \\n> *For the latest version of AWS WAF* , use the AWS WAF V2 API and see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . With the latest version, AWS WAF has a single set of endpoints for regional and global use. \\n\\nSpecifies the part of a web request that you want AWS WAF to inspect for cross-site scripting attacks and, if you want AWS WAF to inspect a header, the name of the header.","properties":{"FieldToMatch":"The part of a web request that you want AWS WAF to inspect, such as a specified header or a query string.","TextTransformation":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass AWS WAF . If you specify a transformation, AWS WAF performs the transformation on `FieldToMatch` before inspecting it for a match.\\n\\nYou can only specify a single type of TextTransformation.\\n\\n*CMD_LINE*\\n\\nWhen you\'re concerned that attackers are injecting an operating system command line command and using unusual formatting to disguise some or all of the command, use this option to perform the following transformations:\\n\\n- Delete the following characters: \\\\ \\" \' ^\\n- Delete spaces before the following characters: / (\\n- Replace the following characters with a space: , ;\\n- Replace multiple spaces with one space\\n- Convert uppercase letters (A-Z) to lowercase (a-z)\\n\\n*COMPRESS_WHITE_SPACE*\\n\\nUse this option to replace the following characters with a space character (decimal 32):\\n\\n- \\\\f, formfeed, decimal 12\\n- \\\\t, tab, decimal 9\\n- \\\\n, newline, decimal 10\\n- \\\\r, carriage return, decimal 13\\n- \\\\v, vertical tab, decimal 11\\n- non-breaking space, decimal 160\\n\\n`COMPRESS_WHITE_SPACE` also replaces multiple spaces with one space.\\n\\n*HTML_ENTITY_DECODE*\\n\\nUse this option to replace HTML-encoded characters with unencoded characters. `HTML_ENTITY_DECODE` performs the following operations:\\n\\n- Replaces `(ampersand)quot;` with `\\"`\\n- Replaces `(ampersand)nbsp;` with a non-breaking space, decimal 160\\n- Replaces `(ampersand)lt;` with a \\"less than\\" symbol\\n- Replaces `(ampersand)gt;` with `>`\\n- Replaces characters that are represented in hexadecimal format, `(ampersand)#xhhhh;` , with the corresponding characters\\n- Replaces characters that are represented in decimal format, `(ampersand)#nnnn;` , with the corresponding characters\\n\\n*LOWERCASE*\\n\\nUse this option to convert uppercase letters (A-Z) to lowercase (a-z).\\n\\n*URL_DECODE*\\n\\nUse this option to decode a URL-encoded value.\\n\\n*NONE*\\n\\nSpecify `NONE` if you don\'t want to perform any text transformations."}},"AWS::WAFv2::IPSet":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the IP set.","Id":"The ID of the IP set.","Ref":"The `Ref` for the resource, containing the resource name, physical ID, and scope, formatted as follows: `name|id|scope` .\\n\\nFor example: `my-webacl-name|1234a1a-a1b1-12a1-abcd-a123b123456|REGIONAL` ."},"description":"> This is the latest version of *AWS WAF* , named AWS WAF V2, released in November, 2019. For information, including how to migrate your AWS WAF resources from the prior release, see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . \\n\\nUse an `IPSet` to identify web requests that originate from specific IP addresses or ranges of IP addresses. For example, if you\'re receiving a lot of requests from a ranges of IP addresses, you can configure AWS WAF to block them using an IP set that lists those IP addresses.\\n\\nYou use an IP set by providing its Amazon Resource Name (ARN) to the rule statement `IPSetReferenceStatement` , when you add a rule to a rule group or web ACL.","properties":{"Addresses":"Contains an array of strings that specifies zero or more IP addresses or blocks of IP addresses. All addresses must be specified using Classless Inter-Domain Routing (CIDR) notation. AWS WAF supports all IPv4 and IPv6 CIDR ranges except for `/0` .\\n\\nExample address strings:\\n\\n- To configure AWS WAF to allow, block, or count requests that originated from the IP address 192.0.2.44, specify `192.0.2.44/32` .\\n- To configure AWS WAF to allow, block, or count requests that originated from IP addresses from 192.0.2.0 to 192.0.2.255, specify `192.0.2.0/24` .\\n- To configure AWS WAF to allow, block, or count requests that originated from the IP address 1111:0000:0000:0000:0000:0000:0000:0111, specify `1111:0000:0000:0000:0000:0000:0000:0111/128` .\\n- To configure AWS WAF to allow, block, or count requests that originated from IP addresses 1111:0000:0000:0000:0000:0000:0000:0000 to 1111:0000:0000:0000:ffff:ffff:ffff:ffff, specify `1111:0000:0000:0000:0000:0000:0000:0000/64` .\\n\\nFor more information about CIDR notation, see the Wikipedia entry [Classless Inter-Domain Routing](https://docs.aws.amazon.com/https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) .\\n\\nExample JSON `Addresses` specifications:\\n\\n- Empty array: `\\"Addresses\\": []`\\n- Array with one address: `\\"Addresses\\": [\\"192.0.2.44/32\\"]`\\n- Array with three addresses: `\\"Addresses\\": [\\"192.0.2.44/32\\", \\"192.0.2.0/24\\", \\"192.0.0.0/16\\"]`\\n- INVALID specification: `\\"Addresses\\": [\\"\\"]` INVALID","Description":"A description of the IP set that helps with identification.","IPAddressVersion":"The version of the IP addresses, either `IPV4` or `IPV6` .","Name":"The name of the IP set. You cannot change the name of an `IPSet` after you create it.","Scope":"Specifies whether this is for an Amazon CloudFront distribution or for a regional application. A regional application can be an Application Load Balancer (ALB), an Amazon API Gateway REST API, an AWS AppSync GraphQL API, an Amazon Cognito user pool, an AWS App Runner service, or an AWS Verified Access instance. Valid Values are `CLOUDFRONT` and `REGIONAL` .\\n\\n> For `CLOUDFRONT` , you must create your WAFv2 resources in the US East (N. Virginia) Region, `us-east-1` .","Tags":"Key:value pairs associated with an AWS resource. The key:value pair can be anything you define. Typically, the tag key represents a category (such as \\"environment\\") and the tag value represents a specific value within that category (such as \\"test,\\" \\"development,\\" or \\"production\\"). You can add up to 50 tags to each AWS resource.\\n\\n> To modify tags on existing resources, use the AWS WAF APIs or command line interface. With AWS CloudFormation , you can only add tags to AWS WAF resources during resource creation."}},"AWS::WAFv2::LoggingConfiguration":{"attributes":{"ManagedByFirewallManager":"Indicates whether the logging configuration was created by AWS Firewall Manager , as part of an AWS WAF policy configuration. If true, only Firewall Manager can modify or delete the configuration.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the web ACL."},"description":"Defines an association between logging destinations and a web ACL resource, for logging from AWS WAF . As part of the association, you can specify parts of the standard logging fields to keep out of the logs and you can specify filters so that you log only a subset of the logging records.\\n\\n> You can define one logging destination per web ACL. \\n\\nYou can access information about the traffic that AWS WAF inspects using the following steps:\\n\\n- Create your logging destination. You can use an Amazon CloudWatch Logs log group, an Amazon Simple Storage Service (Amazon S3) bucket, or an Amazon Kinesis Data Firehose.\\n\\nThe name that you give the destination must start with `aws-waf-logs-` . Depending on the type of destination, you might need to configure additional settings or permissions.\\n\\nFor configuration requirements and pricing information for each destination type, see [Logging web ACL traffic](https://docs.aws.amazon.com/waf/latest/developerguide/logging.html) in the *AWS WAF Developer Guide* .\\n- Associate your logging destination to your web ACL using a `PutLoggingConfiguration` request.\\n\\nWhen you successfully enable logging using a `PutLoggingConfiguration` request, AWS WAF creates an additional role or policy that is required to write logs to the logging destination. For an Amazon CloudWatch Logs log group, AWS WAF creates a resource policy on the log group. For an Amazon S3 bucket, AWS WAF creates a bucket policy. For an Amazon Kinesis Data Firehose, AWS WAF creates a service-linked role.\\n\\nFor additional information about web ACL logging, see [Logging web ACL traffic information](https://docs.aws.amazon.com/waf/latest/developerguide/logging.html) in the *AWS WAF Developer Guide* .","properties":{"LogDestinationConfigs":"The logging destination configuration that you want to associate with the web ACL.\\n\\n> You can associate one logging destination to a web ACL.","LoggingFilter":"Filtering that specifies which web requests are kept in the logs and which are dropped. You can filter on the rule action and on the web request labels that were applied by matching rules during web ACL evaluation.","RedactedFields":"The parts of the request that you want to keep out of the logs.\\n\\nFor example, if you redact the `SingleHeader` field, the `HEADER` field in the logs will be `REDACTED` for all rules that use the `SingleHeader` `FieldToMatch` setting.\\n\\nRedaction applies only to the component that\'s specified in the rule\'s `FieldToMatch` setting, so the `SingleHeader` redaction doesn\'t apply to rules that use the `Headers` `FieldToMatch` .\\n\\n> You can specify only the following fields for redaction: `UriPath` , `QueryString` , `SingleHeader` , and `Method` .","ResourceArn":"The Amazon Resource Name (ARN) of the web ACL that you want to associate with `LogDestinationConfigs` ."}},"AWS::WAFv2::LoggingConfiguration.ActionCondition":{"attributes":{},"description":"A single action condition for a condition in a logging filter.","properties":{"Action":"The action setting that a log record must contain in order to meet the condition. This is the action that AWS WAF applied to the web request.\\n\\nFor rule groups, this is either the configured rule action setting, or if you\'ve applied a rule action override to the rule, it\'s the override action. The value `EXCLUDED_AS_COUNT` matches on excluded rules and also on rules that have a rule action override of Count."}},"AWS::WAFv2::LoggingConfiguration.Condition":{"attributes":{},"description":"A single match condition for a log filter.","properties":{"ActionCondition":"A single action condition. This is the action setting that a log record must contain in order to meet the condition.","LabelNameCondition":"A single label name condition. This is the fully qualified label name that a log record must contain in order to meet the condition. Fully qualified labels have a prefix, optional namespaces, and label name. The prefix identifies the rule group or web ACL context of the rule that added the label."}},"AWS::WAFv2::LoggingConfiguration.FieldToMatch":{"attributes":{},"description":"The parts of the request that you want to keep out of the logs. This is used in the logging configuration `RedactedFields` specification.\\n\\nExample JSON for a `QueryString` field to match:\\n\\n`\\"FieldToMatch\\": { \\"QueryString\\": {} }`\\n\\nExample JSON for a `Method` field to match specification:\\n\\n`\\"FieldToMatch\\": { \\"Method\\": { \\"Name\\": \\"DELETE\\" } }`","properties":{"JsonBody":"Redact the request body JSON.","Method":"Redact the indicated HTTP method. The method indicates the type of operation that the request is asking the origin to perform.","QueryString":"Redact the query string. This is the part of a URL that appears after a `?` character, if any.","SingleHeader":"Redact a single header. Provide the name of the header to inspect, for example, `User-Agent` or `Referer` . This setting isn\'t case sensitive.\\n\\nExample JSON: `\\"SingleHeader\\": { \\"Name\\": \\"haystack\\" }`","UriPath":"Redact the request URI path. This is the part of the web request that identifies a resource, for example, `/images/daily-ad.jpg` ."}},"AWS::WAFv2::LoggingConfiguration.Filter":{"attributes":{},"description":"A single logging filter, used in `LoggingFilter` .","properties":{"Behavior":"How to handle logs that satisfy the filter\'s conditions and requirement.","Conditions":"Match conditions for the filter.","Requirement":"Logic to apply to the filtering conditions. You can specify that, in order to satisfy the filter, a log must match all conditions or must match at least one condition."}},"AWS::WAFv2::LoggingConfiguration.JsonBody":{"attributes":{},"description":"Inspect the body of the web request as JSON. The body immediately follows the request headers.\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nUse the specifications in this object to indicate which parts of the JSON body to inspect using the rule\'s inspection criteria. AWS WAF inspects only the parts of the JSON that result from the matches that you indicate.\\n\\nExample JSON: `\\"JsonBody\\": { \\"MatchPattern\\": { \\"All\\": {} }, \\"MatchScope\\": \\"ALL\\" }`","properties":{"InvalidFallbackBehavior":"What AWS WAF should do if it fails to completely parse the JSON body. The options are the following:\\n\\n- `EVALUATE_AS_STRING` - Inspect the body as plain text. AWS WAF applies the text transformations and inspection criteria that you defined for the JSON inspection to the body text string.\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement.\\n\\nIf you don\'t provide this setting, AWS WAF parses and evaluates the content only up to the first parsing failure that it encounters.\\n\\nAWS WAF does its best to parse the entire JSON body, but might be forced to stop for reasons such as invalid characters, duplicate keys, truncation, and any content whose root node isn\'t an object or an array.\\n\\nAWS WAF parses the JSON in the following examples as two valid key, value pairs:\\n\\n- Missing comma: `{\\"key1\\":\\"value1\\"\\"key2\\":\\"value2\\"}`\\n- Missing colon: `{\\"key1\\":\\"value1\\",\\"key2\\"\\"value2\\"}`\\n- Extra colons: `{\\"key1\\"::\\"value1\\",\\"key2\\"\\"value2\\"}`","MatchPattern":"The patterns to look for in the JSON body. AWS WAF inspects the results of these pattern matches against the rule inspection criteria.","MatchScope":"The parts of the JSON to match against using the `MatchPattern` . If you specify `All` , AWS WAF matches against keys and values."}},"AWS::WAFv2::LoggingConfiguration.LabelNameCondition":{"attributes":{},"description":"A single label name condition for a condition in a logging filter.","properties":{"LabelName":"The label name that a log record must contain in order to meet the condition. This must be a fully qualified label name. Fully qualified labels have a prefix, optional namespaces, and label name. The prefix identifies the rule group or web ACL context of the rule that added the label."}},"AWS::WAFv2::LoggingConfiguration.LoggingFilter":{"attributes":{},"description":"Filtering that specifies which web requests are kept in the logs and which are dropped, defined for a web ACL\'s `LoggingConfiguration` .\\n\\nYou can filter on the rule action and on the web request labels that were applied by matching rules during web ACL evaluation.","properties":{"DefaultBehavior":"Default handling for logs that don\'t match any of the specified filtering conditions.","Filters":"The filters that you want to apply to the logs."}},"AWS::WAFv2::LoggingConfiguration.MatchPattern":{"attributes":{},"description":"The patterns to look for in the JSON body. AWS WAF inspects the results of these pattern matches against the rule inspection criteria.","properties":{"All":"Match all of the elements.\\n\\nYou must specify either this setting or the `IncludedPaths` setting, but not both.","IncludedPaths":"Match only the specified include paths.\\n\\nProvide the include paths using JSON Pointer syntax. For example, `\\"IncludedPaths\\": [\\"/dogs/0/name\\", \\"/dogs/1/name\\"]` . For information about this syntax, see the Internet Engineering Task Force (IETF) documentation [JavaScript Object Notation (JSON) Pointer](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc6901) .\\n\\nYou must specify either this setting or the `All` setting, but not both.\\n\\n> Don\'t use this option to include all paths. Instead, use the `All` setting."}},"AWS::WAFv2::LoggingConfiguration.SingleHeader":{"attributes":{},"description":"Inspect one of the headers in the web request, identified by name, for example, `User-Agent` or `Referer` . The name isn\'t case sensitive.\\n\\nYou can filter and inspect all headers with the `FieldToMatch` setting `Headers` .\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nExample JSON: `\\"SingleHeader\\": { \\"Name\\": \\"haystack\\" }`","properties":{"Name":"The name of the query header to inspect."}},"AWS::WAFv2::RegexPatternSet":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the regex pattern set.","Id":"The ID of the regex pattern set.","Ref":"The `Ref` for the resource, containing the resource name, physical ID, and scope, formatted as follows: `name|id|scope` .\\n\\nFor example: `my-webacl-name|1234a1a-a1b1-12a1-abcd-a123b123456|REGIONAL` ."},"description":"> This is the latest version of *AWS WAF* , named AWS WAF V2, released in November, 2019. For information, including how to migrate your AWS WAF resources from the prior release, see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . \\n\\nUse an `RegexPatternSet` to have AWS WAF inspect a web request component for a specific set of regular expression patterns.\\n\\nYou use a regex pattern set by providing its Amazon Resource Name (ARN) to the rule statement `RegexPatternSetReferenceStatement` , when you add a rule to a rule group or web ACL.","properties":{"Description":"A description of the set that helps with identification.","Name":"The name of the set. You cannot change the name after you create the set.","RegularExpressionList":"The regular expression patterns in the set.","Scope":"Specifies whether this is for an Amazon CloudFront distribution or for a regional application. A regional application can be an Application Load Balancer (ALB), an Amazon API Gateway REST API, an AWS AppSync GraphQL API, an Amazon Cognito user pool, an AWS App Runner service, or an AWS Verified Access instance. Valid Values are `CLOUDFRONT` and `REGIONAL` .\\n\\n> For `CLOUDFRONT` , you must create your WAFv2 resources in the US East (N. Virginia) Region, `us-east-1` .","Tags":"Key:value pairs associated with an AWS resource. The key:value pair can be anything you define. Typically, the tag key represents a category (such as \\"environment\\") and the tag value represents a specific value within that category (such as \\"test,\\" \\"development,\\" or \\"production\\"). You can add up to 50 tags to each AWS resource.\\n\\n> To modify tags on existing resources, use the AWS WAF APIs or command line interface. With AWS CloudFormation , you can only add tags to AWS WAF resources during resource creation."}},"AWS::WAFv2::RuleGroup":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the rule group.","Id":"The ID of the rule group.","LabelNamespace":"The label namespace prefix for this rule group. All labels added by rules in this rule group have this prefix.\\n\\nThe syntax for the label namespace prefix for a rule group is the following: `awswaf::rule group::`\\n\\nWhen a rule with a label matches a web request, AWS WAF adds the fully qualified label to the request. A fully qualified label is made up of the label namespace from the rule group or web ACL where the rule is defined and the label from the rule, separated by a colon.","Ref":"The `Ref` for the resource, containing the resource name, physical ID, and scope, formatted as follows: `name|id|scope` .\\n\\nFor example: `my-webacl-name|1234a1a-a1b1-12a1-abcd-a123b123456|REGIONAL` ."},"description":"> This is the latest version of *AWS WAF* , named AWS WAF V2, released in November, 2019. For information, including how to migrate your AWS WAF resources from the prior release, see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . \\n\\nUse an `RuleGroup` to define a collection of rules for inspecting and controlling web requests. You use a rule group in an `WebACL` by providing its Amazon Resource Name (ARN) to the rule statement `RuleGroupReferenceStatement` , when you add rules to the web ACL.\\n\\nWhen you create a rule group, you define an immutable capacity limit. If you update a rule group, you must stay within the capacity. This allows others to reuse the rule group with confidence in its capacity requirements.","properties":{"AvailableLabels":"The labels that one or more rules in this rule group add to matching web requests. These labels are defined in the `RuleLabels` for a `Rule` .","Capacity":"The web ACL capacity units (WCUs) required for this rule group.\\n\\nWhen you create your own rule group, you define this, and you cannot change it after creation. When you add or modify the rules in a rule group, AWS WAF enforces this limit.\\n\\nAWS WAF uses WCUs to calculate and control the operating resources that are used to run your rules, rule groups, and web ACLs. AWS WAF calculates capacity differently for each rule type, to reflect the relative cost of each rule. Simple rules that cost little to run use fewer WCUs than more complex rules that use more processing power. Rule group capacity is fixed at creation, which helps users plan their web ACL WCU usage when they use a rule group. The WCU limit for web ACLs is 1,500.","ConsumedLabels":"The labels that one or more rules in this rule group match against in label match statements. These labels are defined in a `LabelMatchStatement` specification, in the `Statement` definition of a rule.","CustomResponseBodies":"A map of custom response keys and content bodies. When you create a rule with a block action, you can send a custom response to the web request. You define these for the rule group, and then use them in the rules that you define in the rule group.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* .\\n\\nFor information about the limits on count and size for custom request and response settings, see [AWS WAF quotas](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html) in the *AWS WAF Developer Guide* .","Description":"A description of the rule group that helps with identification.","Name":"The name of the rule group. You cannot change the name of a rule group after you create it.","Rules":"The rule statements used to identify the web requests that you want to allow, block, or count. Each rule includes one top-level statement that AWS WAF uses to identify matching web requests, and parameters that govern how AWS WAF handles them.","Scope":"Specifies whether this is for an Amazon CloudFront distribution or for a regional application. A regional application can be an Application Load Balancer (ALB), an Amazon API Gateway REST API, an AWS AppSync GraphQL API, an Amazon Cognito user pool, an AWS App Runner service, or an AWS Verified Access instance. Valid Values are `CLOUDFRONT` and `REGIONAL` .\\n\\n> For `CLOUDFRONT` , you must create your WAFv2 resources in the US East (N. Virginia) Region, `us-east-1` .","Tags":"Key:value pairs associated with an AWS resource. The key:value pair can be anything you define. Typically, the tag key represents a category (such as \\"environment\\") and the tag value represents a specific value within that category (such as \\"test,\\" \\"development,\\" or \\"production\\"). You can add up to 50 tags to each AWS resource.\\n\\n> To modify tags on existing resources, use the AWS WAF APIs or command line interface. With AWS CloudFormation , you can only add tags to AWS WAF resources during resource creation.","VisibilityConfig":"Defines and enables Amazon CloudWatch metrics and web request sample collection."}},"AWS::WAFv2::RuleGroup.AllowAction":{"attributes":{},"description":"Specifies that AWS WAF should allow the request and optionally defines additional custom handling for the request.\\n\\nThis is used in the context of other settings, for example to specify values for `RuleAction` and web ACL `DefaultAction` .","properties":{"CustomRequestHandling":"Defines custom handling for the web request.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::RuleGroup.AndStatement":{"attributes":{},"description":"A logical rule statement used to combine other rule statements with AND logic. You provide more than one `Statement` within the `AndStatement` .","properties":{"Statements":"The statements to combine with AND logic. You can use any statements that can be nested."}},"AWS::WAFv2::RuleGroup.BlockAction":{"attributes":{},"description":"Specifies that AWS WAF should block the request and optionally defines additional custom handling for the response to the web request.\\n\\nThis is used in the context of other settings, for example to specify values for `RuleAction` and web ACL `DefaultAction` .","properties":{"CustomResponse":"Defines a custom response for the web request.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::RuleGroup.Body":{"attributes":{},"description":"Inspect the body of the web request. The body immediately follows the request headers.\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.","properties":{"OversizeHandling":"What AWS WAF should do if the body is larger than AWS WAF can inspect. AWS WAF does not support inspecting the entire contents of the web request body if the body exceeds the limit for the resource type. If the body is larger than the limit, the underlying host service only forwards the contents that are below the limit to AWS WAF for inspection.\\n\\nThe default limit is 8 KB (8,192 kilobytes) for regional resources and 16 KB (16,384 kilobytes) for CloudFront distributions. For CloudFront distributions, you can increase the limit in the web ACL `AssociationConfig` , for additional processing fees.\\n\\nThe options for oversize handling are the following:\\n\\n- `CONTINUE` - Inspect the available body contents normally, according to the rule inspection criteria.\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement.\\n\\nYou can combine the `MATCH` or `NO_MATCH` settings for oversize handling with your rule and web ACL action settings, so that you block any request whose body is over the limit.\\n\\nDefault: `CONTINUE`"}},"AWS::WAFv2::RuleGroup.ByteMatchStatement":{"attributes":{},"description":"A rule statement that defines a string match search for AWS WAF to apply to web requests. The byte match statement provides the bytes to search for, the location in requests that you want AWS WAF to search, and other settings. The bytes to search for are typically a string that corresponds with ASCII characters. In the AWS WAF console and the developer guide, this is called a string match statement.","properties":{"FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","PositionalConstraint":"The area within the portion of the web request that you want AWS WAF to search for `SearchString` . Valid values include the following:\\n\\n*CONTAINS*\\n\\nThe specified part of the web request must include the value of `SearchString` , but the location doesn\'t matter.\\n\\n*CONTAINS_WORD*\\n\\nThe specified part of the web request must include the value of `SearchString` , and `SearchString` must contain only alphanumeric characters or underscore (A-Z, a-z, 0-9, or _). In addition, `SearchString` must be a word, which means that both of the following are true:\\n\\n- `SearchString` is at the beginning of the specified part of the web request or is preceded by a character other than an alphanumeric character or underscore (_). Examples include the value of a header and `;BadBot` .\\n- `SearchString` is at the end of the specified part of the web request or is followed by a character other than an alphanumeric character or underscore (_), for example, `BadBot;` and `-BadBot;` .\\n\\n*EXACTLY*\\n\\nThe value of the specified part of the web request must exactly match the value of `SearchString` .\\n\\n*STARTS_WITH*\\n\\nThe value of `SearchString` must appear at the beginning of the specified part of the web request.\\n\\n*ENDS_WITH*\\n\\nThe value of `SearchString` must appear at the end of the specified part of the web request.","SearchString":"A string value that you want AWS WAF to search for. AWS WAF searches only in the part of web requests that you designate for inspection in `FieldToMatch` . The maximum length of the value is 200 bytes. For alphabetic characters A-Z and a-z, the value is case sensitive.\\n\\nDon\'t encode this string. Provide the value that you want AWS WAF to search for. AWS CloudFormation automatically base64 encodes the value for you.\\n\\nFor example, suppose the value of `Type` is `HEADER` and the value of `Data` is `User-Agent` . If you want to search the `User-Agent` header for the value `BadBot` , you provide the string `BadBot` in the value of `SearchString` .\\n\\nYou must specify either `SearchString` or `SearchStringBase64` in a `ByteMatchStatement` .","SearchStringBase64":"String to search for in a web request component, base64-encoded. If you don\'t want to encode the string, specify the unencoded value in `SearchString` instead.\\n\\nYou must specify either `SearchString` or `SearchStringBase64` in a `ByteMatchStatement` .","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::RuleGroup.CaptchaAction":{"attributes":{},"description":"Specifies that AWS WAF should run a `CAPTCHA` check against the request:\\n\\n- If the request includes a valid, unexpired `CAPTCHA` token, AWS WAF applies any custom request handling and labels that you\'ve configured and then allows the web request inspection to proceed to the next rule, similar to a `CountAction` .\\n- If the request doesn\'t include a valid, unexpired token, AWS WAF discontinues the web ACL evaluation of the request and blocks it from going to its intended destination.\\n\\nAWS WAF generates a response that it sends back to the client, which includes the following:\\n\\n- The header `x-amzn-waf-action` with a value of `captcha` .\\n- The HTTP status code `405 Method Not Allowed` .\\n- If the request contains an `Accept` header with a value of `text/html` , the response includes a `CAPTCHA` JavaScript page interstitial.\\n\\nYou can configure the expiration time in the `CaptchaConfig` `ImmunityTimeProperty` setting at the rule and web ACL level. The rule setting overrides the web ACL setting.\\n\\nThis action option is available for rules. It isn\'t available for web ACL default actions.","properties":{"CustomRequestHandling":"Defines custom handling for the web request, used when the `CAPTCHA` inspection determines that the request\'s token is valid and unexpired.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::RuleGroup.CaptchaConfig":{"attributes":{},"description":"Specifies how AWS WAF should handle `CAPTCHA` evaluations. This is available at the web ACL level and in each rule.","properties":{"ImmunityTimeProperty":"Determines how long a `CAPTCHA` timestamp in the token remains valid after the client successfully solves a `CAPTCHA` puzzle."}},"AWS::WAFv2::RuleGroup.ChallengeAction":{"attributes":{},"description":"Specifies that AWS WAF should run a `Challenge` check against the request to verify that the request is coming from a legitimate client session:\\n\\n- If the request includes a valid, unexpired challenge token, AWS WAF applies any custom request handling and labels that you\'ve configured and then allows the web request inspection to proceed to the next rule, similar to a `CountAction` .\\n- If the request doesn\'t include a valid, unexpired challenge token, AWS WAF discontinues the web ACL evaluation of the request and blocks it from going to its intended destination.\\n\\nAWS WAF then generates a challenge response that it sends back to the client, which includes the following:\\n\\n- The header `x-amzn-waf-action` with a value of `challenge` .\\n- The HTTP status code `202 Request Accepted` .\\n- If the request contains an `Accept` header with a value of `text/html` , the response includes a JavaScript page interstitial with a challenge script.\\n\\nChallenges run silent browser interrogations in the background, and don\'t generally affect the end user experience.\\n\\nA challenge enforces token acquisition using an interstitial JavaScript challenge that inspects the client session for legitimate behavior. The challenge blocks bots or at least increases the cost of operating sophisticated bots.\\n\\nAfter the client session successfully responds to the challenge, it receives a new token from AWS WAF , which the challenge script uses to resubmit the original request.\\n\\nYou can configure the expiration time in the `ChallengeConfig` `ImmunityTimeProperty` setting at the rule and web ACL level. The rule setting overrides the web ACL setting.\\n\\nThis action option is available for rules. It isn\'t available for web ACL default actions.","properties":{"CustomRequestHandling":"Defines custom handling for the web request, used when the challenge inspection determines that the request\'s token is valid and unexpired.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::RuleGroup.ChallengeConfig":{"attributes":{},"description":"Specifies how AWS WAF should handle `Challenge` evaluations. This is available at the web ACL level and in each rule.","properties":{"ImmunityTimeProperty":"Determines how long a challenge timestamp in the token remains valid after the client successfully responds to a challenge."}},"AWS::WAFv2::RuleGroup.CookieMatchPattern":{"attributes":{},"description":"The filter to use to identify the subset of cookies to inspect in a web request.\\n\\nYou must specify exactly one setting: either `All` , `IncludedCookies` , or `ExcludedCookies` .\\n\\nExample JSON: `\\"MatchPattern\\": { \\"IncludedCookies\\": [ \\"session-id-time\\", \\"session-id\\" ] }`","properties":{"All":"Inspect all cookies.","ExcludedCookies":"Inspect only the cookies whose keys don\'t match any of the strings specified here.","IncludedCookies":"Inspect only the cookies that have a key that matches one of the strings specified here."}},"AWS::WAFv2::RuleGroup.Cookies":{"attributes":{},"description":"Inspect the cookies in the web request. You can specify the parts of the cookies to inspect and you can narrow the set of cookies to inspect by including or excluding specific keys.\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nExample JSON: `\\"Cookies\\": { \\"MatchPattern\\": { \\"All\\": {} }, \\"MatchScope\\": \\"KEY\\", \\"OversizeHandling\\": \\"MATCH\\" }`","properties":{"MatchPattern":"The filter to use to identify the subset of cookies to inspect in a web request.\\n\\nYou must specify exactly one setting: either `All` , `IncludedCookies` , or `ExcludedCookies` .\\n\\nExample JSON: `\\"MatchPattern\\": { \\"IncludedCookies\\": [ \\"session-id-time\\", \\"session-id\\" ] }`","MatchScope":"The parts of the cookies to inspect with the rule inspection criteria. If you specify `All` , AWS WAF inspects both keys and values.","OversizeHandling":"What AWS WAF should do if the cookies of the request are more numerous or larger than AWS WAF can inspect. AWS WAF does not support inspecting the entire contents of request cookies when they exceed 8 KB (8192 bytes) or 200 total cookies. The underlying host service forwards a maximum of 200 cookies and at most 8 KB of cookie contents to AWS WAF .\\n\\nThe options for oversize handling are the following:\\n\\n- `CONTINUE` - Inspect the available cookies normally, according to the rule inspection criteria.\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement."}},"AWS::WAFv2::RuleGroup.CountAction":{"attributes":{},"description":"Specifies that AWS WAF should count the request. Optionally defines additional custom handling for the request.\\n\\nThis is used in the context of other settings, for example to specify values for `RuleAction` and web ACL `DefaultAction` .","properties":{"CustomRequestHandling":"Defines custom handling for the web request.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::RuleGroup.CustomHTTPHeader":{"attributes":{},"description":"A custom header for custom request and response handling. This is used in `CustomResponse` and `CustomRequestHandling`","properties":{"Name":"The name of the custom header.\\n\\nFor custom request header insertion, when AWS WAF inserts the header into the request, it prefixes this name `x-amzn-waf-` , to avoid confusion with the headers that are already in the request. For example, for the header name `sample` , AWS WAF inserts the header `x-amzn-waf-sample` .","Value":"The value of the custom header."}},"AWS::WAFv2::RuleGroup.CustomRequestHandling":{"attributes":{},"description":"Custom request handling behavior that inserts custom headers into a web request. You can add custom request handling for AWS WAF to use when the rule action doesn\'t block the request. For example, `CaptchaAction` for requests with valid t okens, and `AllowAction` .\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* .","properties":{"InsertHeaders":"The HTTP headers to insert into the request. Duplicate header names are not allowed.\\n\\nFor information about the limits on count and size for custom request and response settings, see [AWS WAF quotas](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::RuleGroup.CustomResponse":{"attributes":{},"description":"A custom response to send to the client. You can define a custom response for rule actions and default web ACL actions that are set to `Block` .\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) .","properties":{"CustomResponseBodyKey":"References the response body that you want AWS WAF to return to the web request client. You can define a custom response for a rule action or a default web ACL action that is set to block. To do this, you first define the response body key and value in the `CustomResponseBodies` setting for the `WebACL` or `RuleGroup` where you want to use it. Then, in the rule action or web ACL default action `BlockAction` setting, you reference the response body using this key.","ResponseCode":"The HTTP status code to return to the client.\\n\\nFor a list of status codes that you can use in your custom responses, see [Supported status codes for custom response](https://docs.aws.amazon.com/waf/latest/developerguide/customizing-the-response-status-codes.html) in the *AWS WAF Developer Guide* .","ResponseHeaders":"The HTTP headers to use in the response. Duplicate header names are not allowed.\\n\\nFor information about the limits on count and size for custom request and response settings, see [AWS WAF quotas](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::RuleGroup.CustomResponseBody":{"attributes":{},"description":"The response body to use in a custom response to a web request. This is referenced by key from `CustomResponse` `CustomResponseBodyKey` .","properties":{"Content":"The payload of the custom response.\\n\\nYou can use JSON escape strings in JSON content. To do this, you must specify JSON content in the `ContentType` setting.\\n\\nFor information about the limits on count and size for custom request and response settings, see [AWS WAF quotas](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html) in the *AWS WAF Developer Guide* .","ContentType":"The type of content in the payload that you are defining in the `Content` string."}},"AWS::WAFv2::RuleGroup.FieldToMatch":{"attributes":{},"description":"The part of the web request that you want AWS WAF to inspect. Include the single `FieldToMatch` type that you want to inspect, with additional specifications as needed, according to the type. You specify a single request component in `FieldToMatch` for each rule statement that requires it. To inspect more than one component of the web request, create a separate rule statement for each component.\\n\\nExample JSON for a `QueryString` field to match:\\n\\n`\\"FieldToMatch\\": { \\"QueryString\\": {} }`\\n\\nExample JSON for a `Method` field to match specification:\\n\\n`\\"FieldToMatch\\": { \\"Method\\": { \\"Name\\": \\"DELETE\\" } }`","properties":{"AllQueryArguments":"Inspect all query arguments.","Body":"Inspect the request body as plain text. The request body immediately follows the request headers. This is the part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form.\\n\\nA limited amount of the request body is forwarded to AWS WAF for inspection by the underlying host service. For regional resources, the limit is 8 KB (8,192 kilobytes) and for CloudFront distributions, the limit is 16 KB (16,384 kilobytes). For CloudFront distributions, you can increase the limit in the web ACL\'s `AssociationConfig` , for additional processing fees.\\n\\nFor information about how to handle oversized request bodies, see the `Body` object configuration.","Cookies":"Inspect the request cookies. You must configure scope and pattern matching filters in the `Cookies` object, to define the set of cookies and the parts of the cookies that AWS WAF inspects.\\n\\nOnly the first 8 KB (8192 bytes) of a request\'s cookies and only the first 200 cookies are forwarded to AWS WAF for inspection by the underlying host service. You must configure how to handle any oversize cookie content in the `Cookies` object. AWS WAF applies the pattern matching filters to the cookies that it receives from the underlying host service.","Headers":"Inspect the request headers. You must configure scope and pattern matching filters in the `Headers` object, to define the set of headers to and the parts of the headers that AWS WAF inspects.\\n\\nOnly the first 8 KB (8192 bytes) of a request\'s headers and only the first 200 headers are forwarded to AWS WAF for inspection by the underlying host service. You must configure how to handle any oversize header content in the `Headers` object. AWS WAF applies the pattern matching filters to the headers that it receives from the underlying host service.","JsonBody":"Inspect the request body as JSON. The request body immediately follows the request headers. This is the part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form.\\n\\nA limited amount of the request body is forwarded to AWS WAF for inspection by the underlying host service. For regional resources, the limit is 8 KB (8,192 kilobytes) and for CloudFront distributions, the limit is 16 KB (16,384 kilobytes). For CloudFront distributions, you can increase the limit in the web ACL\'s `AssociationConfig` , for additional processing fees.\\n\\nFor information about how to handle oversized request bodies, see the `JsonBody` object configuration.","Method":"Inspect the HTTP method. The method indicates the type of operation that the request is asking the origin to perform.","QueryString":"Inspect the query string. This is the part of a URL that appears after a `?` character, if any.","SingleHeader":"Inspect a single header. Provide the name of the header to inspect, for example, `User-Agent` or `Referer` . This setting isn\'t case sensitive.\\n\\nExample JSON: `\\"SingleHeader\\": { \\"Name\\": \\"haystack\\" }`\\n\\nAlternately, you can filter and inspect all headers with the `Headers` `FieldToMatch` setting.","SingleQueryArgument":"Inspect a single query argument. Provide the name of the query argument to inspect, such as *UserName* or *SalesRegion* . The name can be up to 30 characters long and isn\'t case sensitive.\\n\\nExample JSON: `\\"SingleQueryArgument\\": { \\"Name\\": \\"myArgument\\" }`","UriPath":"Inspect the request URI path. This is the part of the web request that identifies a resource, for example, `/images/daily-ad.jpg` ."}},"AWS::WAFv2::RuleGroup.ForwardedIPConfiguration":{"attributes":{},"description":"The configuration for inspecting IP addresses in an HTTP header that you specify, instead of using the IP address that\'s reported by the web request origin. Commonly, this is the X-Forwarded-For (XFF) header, but you can specify any header name.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all. \\n\\nThis configuration is used for `GeoMatchStatement` and `RateBasedStatement` . For `IPSetReferenceStatement` , use `IPSetForwardedIPConfig` instead.\\n\\nAWS WAF only evaluates the first IP address found in the specified HTTP header.","properties":{"FallbackBehavior":"The match status to assign to the web request if the request doesn\'t have a valid IP address in the specified position.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all. \\n\\nYou can specify the following fallback behaviors:\\n\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement.","HeaderName":"The name of the HTTP header to use for the IP address. For example, to use the X-Forwarded-For (XFF) header, set this to `X-Forwarded-For` .\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all."}},"AWS::WAFv2::RuleGroup.GeoMatchStatement":{"attributes":{},"description":"A rule statement that labels web requests by country and region and that matches against web requests based on country code. A geo match rule labels every request that it inspects regardless of whether it finds a match.\\n\\n- To manage requests only by country, you can use this statement by itself and specify the countries that you want to match against in the `CountryCodes` array.\\n- Otherwise, configure your geo match rule with Count action so that it only labels requests. Then, add one or more label match rules to run after the geo match rule and configure them to match against the geographic labels and handle the requests as needed.\\n\\nAWS WAF labels requests using the alpha-2 country and region codes from the International Organization for Standardization (ISO) 3166 standard. AWS WAF determines the codes using either the IP address in the web request origin or, if you specify it, the address in the geo match `ForwardedIPConfig` .\\n\\nIf you use the web request origin, the label formats are `awswaf:clientip:geo:region:-` and `awswaf:clientip:geo:country:` .\\n\\nIf you use a forwarded IP address, the label formats are `awswaf:forwardedip:geo:region:-` and `awswaf:forwardedip:geo:country:` .\\n\\nFor additional details, see [Geographic match rule statement](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-type-geo-match.html) in the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) .","properties":{"CountryCodes":"An array of two-character country codes that you want to match against, for example, `[ \\"US\\", \\"CN\\" ]` , from the alpha-2 country ISO codes of the ISO 3166 international standard.\\n\\nWhen you use a geo match statement just for the region and country labels that it adds to requests, you still have to supply a country code for the rule to evaluate. In this case, you configure the rule to only count matching requests, but it will still generate logging and count metrics for any matches. You can reduce the logging and metrics that the rule produces by specifying a country that\'s unlikely to be a source of traffic to your site.","ForwardedIPConfig":"The configuration for inspecting IP addresses in an HTTP header that you specify, instead of using the IP address that\'s reported by the web request origin. Commonly, this is the X-Forwarded-For (XFF) header, but you can specify any header name.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all."}},"AWS::WAFv2::RuleGroup.HeaderMatchPattern":{"attributes":{},"description":"The filter to use to identify the subset of headers to inspect in a web request.\\n\\nYou must specify exactly one setting: either `All` , `IncludedHeaders` , or `ExcludedHeaders` .\\n\\nExample JSON: `\\"MatchPattern\\": { \\"ExcludedHeaders\\": [ \\"KeyToExclude1\\", \\"KeyToExclude2\\" ] }`","properties":{"All":"Inspect all headers.","ExcludedHeaders":"Inspect only the headers whose keys don\'t match any of the strings specified here.","IncludedHeaders":"Inspect only the headers that have a key that matches one of the strings specified here."}},"AWS::WAFv2::RuleGroup.Headers":{"attributes":{},"description":"Inspect all headers in the web request. You can specify the parts of the headers to inspect and you can narrow the set of headers to inspect by including or excluding specific keys.\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nIf you want to inspect just the value of a single header, use the `SingleHeader` `FieldToMatch` setting instead.\\n\\nExample JSON: `\\"Headers\\": { \\"MatchPattern\\": { \\"All\\": {} }, \\"MatchScope\\": \\"KEY\\", \\"OversizeHandling\\": \\"MATCH\\" }`","properties":{"MatchPattern":"The filter to use to identify the subset of headers to inspect in a web request.\\n\\nYou must specify exactly one setting: either `All` , `IncludedHeaders` , or `ExcludedHeaders` .\\n\\nExample JSON: `\\"MatchPattern\\": { \\"ExcludedHeaders\\": [ \\"KeyToExclude1\\", \\"KeyToExclude2\\" ] }`","MatchScope":"The parts of the headers to match with the rule inspection criteria. If you specify `All` , AWS WAF inspects both keys and values.","OversizeHandling":"What AWS WAF should do if the headers of the request are more numerous or larger than AWS WAF can inspect. AWS WAF does not support inspecting the entire contents of request headers when they exceed 8 KB (8192 bytes) or 200 total headers. The underlying host service forwards a maximum of 200 headers and at most 8 KB of header contents to AWS WAF .\\n\\nThe options for oversize handling are the following:\\n\\n- `CONTINUE` - Inspect the available headers normally, according to the rule inspection criteria.\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement."}},"AWS::WAFv2::RuleGroup.IPSetForwardedIPConfiguration":{"attributes":{},"description":"The configuration for inspecting IP addresses in an HTTP header that you specify, instead of using the IP address that\'s reported by the web request origin. Commonly, this is the X-Forwarded-For (XFF) header, but you can specify any header name.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all. \\n\\nThis configuration is used only for `IPSetReferenceStatement` . For `GeoMatchStatement` and `RateBasedStatement` , use `ForwardedIPConfig` instead.","properties":{"FallbackBehavior":"The match status to assign to the web request if the request doesn\'t have a valid IP address in the specified position.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all. \\n\\nYou can specify the following fallback behaviors:\\n\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement.","HeaderName":"The name of the HTTP header to use for the IP address. For example, to use the X-Forwarded-For (XFF) header, set this to `X-Forwarded-For` .\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all.","Position":"The position in the header to search for the IP address. The header can contain IP addresses of the original client and also of proxies. For example, the header value could be `10.1.1.1, 127.0.0.0, 10.10.10.10` where the first IP address identifies the original client and the rest identify proxies that the request went through.\\n\\nThe options for this setting are the following:\\n\\n- FIRST - Inspect the first IP address in the list of IP addresses in the header. This is usually the client\'s original IP.\\n- LAST - Inspect the last IP address in the list of IP addresses in the header.\\n- ANY - Inspect all IP addresses in the header for a match. If the header contains more than 10 IP addresses, AWS WAF inspects the last 10."}},"AWS::WAFv2::RuleGroup.IPSetReferenceStatement":{"attributes":{},"description":"A rule statement used to detect web requests coming from particular IP addresses or address ranges. To use this, create an `IPSet` that specifies the addresses you want to detect, then use the ARN of that set in this statement.\\n\\nEach IP set rule statement references an IP set. You create and maintain the set independent of your rules. This allows you to use the single set in multiple rules. When you update the referenced set, AWS WAF automatically updates all rules that reference it.","properties":{"Arn":"The Amazon Resource Name (ARN) of the `IPSet` that this statement references.","IPSetForwardedIPConfig":"The configuration for inspecting IP addresses in an HTTP header that you specify, instead of using the IP address that\'s reported by the web request origin. Commonly, this is the X-Forwarded-For (XFF) header, but you can specify any header name.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all."}},"AWS::WAFv2::RuleGroup.ImmunityTimeProperty":{"attributes":{},"description":"Used for CAPTCHA and challenge token settings. Determines how long a `CAPTCHA` or challenge timestamp remains valid after AWS WAF updates it for a successful `CAPTCHA` or challenge response.","properties":{"ImmunityTime":"The amount of time, in seconds, that a `CAPTCHA` or challenge timestamp is considered valid by AWS WAF . The default setting is 300.\\n\\nFor the Challenge action, the minimum setting is 300."}},"AWS::WAFv2::RuleGroup.JsonBody":{"attributes":{},"description":"Inspect the body of the web request as JSON. The body immediately follows the request headers.\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nUse the specifications in this object to indicate which parts of the JSON body to inspect using the rule\'s inspection criteria. AWS WAF inspects only the parts of the JSON that result from the matches that you indicate.\\n\\nExample JSON: `\\"JsonBody\\": { \\"MatchPattern\\": { \\"All\\": {} }, \\"MatchScope\\": \\"ALL\\" }`","properties":{"InvalidFallbackBehavior":"What AWS WAF should do if it fails to completely parse the JSON body. The options are the following:\\n\\n- `EVALUATE_AS_STRING` - Inspect the body as plain text. AWS WAF applies the text transformations and inspection criteria that you defined for the JSON inspection to the body text string.\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement.\\n\\nIf you don\'t provide this setting, AWS WAF parses and evaluates the content only up to the first parsing failure that it encounters.\\n\\nAWS WAF does its best to parse the entire JSON body, but might be forced to stop for reasons such as invalid characters, duplicate keys, truncation, and any content whose root node isn\'t an object or an array.\\n\\nAWS WAF parses the JSON in the following examples as two valid key, value pairs:\\n\\n- Missing comma: `{\\"key1\\":\\"value1\\"\\"key2\\":\\"value2\\"}`\\n- Missing colon: `{\\"key1\\":\\"value1\\",\\"key2\\"\\"value2\\"}`\\n- Extra colons: `{\\"key1\\"::\\"value1\\",\\"key2\\"\\"value2\\"}`","MatchPattern":"The patterns to look for in the JSON body. AWS WAF inspects the results of these pattern matches against the rule inspection criteria.","MatchScope":"The parts of the JSON to match against using the `MatchPattern` . If you specify `All` , AWS WAF matches against keys and values.","OversizeHandling":"What AWS WAF should do if the body is larger than AWS WAF can inspect. AWS WAF does not support inspecting the entire contents of the web request body if the body exceeds the limit for the resource type. If the body is larger than the limit, the underlying host service only forwards the contents that are below the limit to AWS WAF for inspection.\\n\\nThe default limit is 8 KB (8,192 kilobytes) for regional resources and 16 KB (16,384 kilobytes) for CloudFront distributions. For CloudFront distributions, you can increase the limit in the web ACL `AssociationConfig` , for additional processing fees.\\n\\nThe options for oversize handling are the following:\\n\\n- `CONTINUE` - Inspect the available body contents normally, according to the rule inspection criteria.\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement.\\n\\nYou can combine the `MATCH` or `NO_MATCH` settings for oversize handling with your rule and web ACL action settings, so that you block any request whose body is over the limit.\\n\\nDefault: `CONTINUE`"}},"AWS::WAFv2::RuleGroup.JsonMatchPattern":{"attributes":{},"description":"The patterns to look for in the JSON body. AWS WAF inspects the results of these pattern matches against the rule inspection criteria. This is used with the `FieldToMatch` option `JsonBody` .","properties":{"All":"Match all of the elements. See also `MatchScope` in the `JsonBody` `FieldToMatch` specification.\\n\\nYou must specify either this setting or the `IncludedPaths` setting, but not both.","IncludedPaths":"Match only the specified include paths. See also `MatchScope` in the `JsonBody` `FieldToMatch` specification.\\n\\nProvide the include paths using JSON Pointer syntax. For example, `\\"IncludedPaths\\": [\\"/dogs/0/name\\", \\"/dogs/1/name\\"]` . For information about this syntax, see the Internet Engineering Task Force (IETF) documentation [JavaScript Object Notation (JSON) Pointer](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc6901) .\\n\\nYou must specify either this setting or the `All` setting, but not both.\\n\\n> Don\'t use this option to include all paths. Instead, use the `All` setting."}},"AWS::WAFv2::RuleGroup.Label":{"attributes":{},"description":"A single label container. This is used as an element of a label array in `RuleLabels` inside a rule.","properties":{"Name":"The label string."}},"AWS::WAFv2::RuleGroup.LabelMatchStatement":{"attributes":{},"description":"A rule statement to match against labels that have been added to the web request by rules that have already run in the web ACL.\\n\\nThe label match statement provides the label or namespace string to search for. The label string can represent a part or all of the fully qualified label name that had been added to the web request. Fully qualified labels have a prefix, optional namespaces, and label name. The prefix identifies the rule group or web ACL context of the rule that added the label. If you do not provide the fully qualified name in your label match string, AWS WAF performs the search for labels that were added in the same context as the label match statement.","properties":{"Key":"The string to match against. The setting you provide for this depends on the match statement\'s `Scope` setting:\\n\\n- If the `Scope` indicates `LABEL` , then this specification must include the name and can include any number of preceding namespace specifications and prefix up to providing the fully qualified label name.\\n- If the `Scope` indicates `NAMESPACE` , then this specification can include any number of contiguous namespace strings, and can include the entire label namespace prefix from the rule group or web ACL where the label originates.\\n\\nLabels are case sensitive and components of a label must be separated by colon, for example `NS1:NS2:name` .","Scope":"Specify whether you want to match using the label name or just the namespace."}},"AWS::WAFv2::RuleGroup.LabelSummary":{"attributes":{},"description":"List of labels used by one or more of the rules of a `RuleGroup` . This summary object is used for the following rule group lists:\\n\\n- `AvailableLabels` - Labels that rules add to matching requests. These labels are defined in the `RuleLabels` for a rule.\\n- `ConsumedLabels` - Labels that rules match against. These labels are defined in a `LabelMatchStatement` specification, in the `Statement` definition of a rule.","properties":{"Name":"An individual label specification."}},"AWS::WAFv2::RuleGroup.NotStatement":{"attributes":{},"description":"A logical rule statement used to negate the results of another rule statement. You provide one `Statement` within the `NotStatement` .","properties":{"Statement":"The statement to negate. You can use any statement that can be nested."}},"AWS::WAFv2::RuleGroup.OrStatement":{"attributes":{},"description":"A logical rule statement used to combine other rule statements with OR logic. You provide more than one `Statement` within the `OrStatement` .","properties":{"Statements":"The statements to combine with OR logic. You can use any statements that can be nested."}},"AWS::WAFv2::RuleGroup.RateBasedStatement":{"attributes":{},"description":"A rate-based rule tracks the rate of requests for each originating IP address, and triggers the rule action when the rate exceeds a limit that you specify on the number of requests in any 5-minute time span. You can use this to put a temporary block on requests from an IP address that is sending excessive requests.\\n\\nAWS WAF tracks and manages web requests separately for each instance of a rate-based rule that you use. For example, if you provide the same rate-based rule settings in two web ACLs, each of the two rule statements represents a separate instance of the rate-based rule and gets its own tracking and management by AWS WAF . If you define a rate-based rule inside a rule group, and then use that rule group in multiple places, each use creates a separate instance of the rate-based rule that gets its own tracking and management by AWS WAF .\\n\\nWhen the rule action triggers, AWS WAF blocks additional requests from the IP address until the request rate falls below the limit.\\n\\nYou can optionally nest another statement inside the rate-based statement, to narrow the scope of the rule so that it only counts requests that match the nested statement. For example, based on recent requests that you have seen from an attacker, you might create a rate-based rule with a nested AND rule statement that contains the following nested statements:\\n\\n- An IP match statement with an IP set that specifies the address 192.0.2.44.\\n- A string match statement that searches in the User-Agent header for the string BadBot.\\n\\nIn this rate-based rule, you also define a rate limit. For this example, the rate limit is 1,000. Requests that meet the criteria of both of the nested statements are counted. If the count exceeds 1,000 requests per five minutes, the rule action triggers. Requests that do not meet the criteria of both of the nested statements are not counted towards the rate limit and are not affected by this rule.\\n\\nYou cannot nest a `RateBasedStatement` inside another statement, for example inside a `NotStatement` or `OrStatement` . You can define a `RateBasedStatement` inside a web ACL and inside a rule group.","properties":{"AggregateKeyType":"Setting that indicates how to aggregate the request counts. The options are the following:\\n\\n- `IP` - Aggregate the request counts on the IP address from the web request origin.\\n- `FORWARDED_IP` - Aggregate the request counts on the first IP address in an HTTP header. If you use this, configure the `ForwardedIPConfig` , to specify the header to use.\\n\\n> You can only use the `IP` and `FORWARDED_IP` key types.","ForwardedIPConfig":"The configuration for inspecting IP addresses in an HTTP header that you specify, instead of using the IP address that\'s reported by the web request origin. Commonly, this is the X-Forwarded-For (XFF) header, but you can specify any header name.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all. \\n\\nThis is required if you specify a forwarded IP in the rule\'s aggregate key settings.","Limit":"The limit on requests per 5-minute period for a single originating IP address. If the statement includes a `ScopeDownStatement` , this limit is applied only to the requests that match the statement.","ScopeDownStatement":"An optional nested statement that narrows the scope of the web requests that are evaluated by the rate-based statement. Requests are only tracked by the rate-based statement if they match the scope-down statement. You can use any nestable statement in the scope-down statement, and you can nest statements at any level, the same as you can for a rule statement."}},"AWS::WAFv2::RuleGroup.RegexMatchStatement":{"attributes":{},"description":"A rule statement used to search web request components for a match against a single regular expression.","properties":{"FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","RegexString":"The string representing the regular expression.","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::RuleGroup.RegexPatternSetReferenceStatement":{"attributes":{},"description":"A rule statement used to search web request components for matches with regular expressions. To use this, create a `RegexPatternSet` that specifies the expressions that you want to detect, then use the ARN of that set in this statement. A web request matches the pattern set rule statement if the request component matches any of the patterns in the set.\\n\\nEach regex pattern set rule statement references a regex pattern set. You create and maintain the set independent of your rules. This allows you to use the single set in multiple rules. When you update the referenced set, AWS WAF automatically updates all rules that reference it.","properties":{"Arn":"The Amazon Resource Name (ARN) of the `RegexPatternSet` that this statement references.","FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::RuleGroup.Rule":{"attributes":{},"description":"A single rule, which you can use in a `WebACL` or `RuleGroup` to identify web requests that you want to allow, block, or count. Each rule includes one top-level `Statement` that AWS WAF uses to identify matching web requests, and parameters that govern how AWS WAF handles them.","properties":{"Action":"The action that AWS WAF should take on a web request when it matches the rule statement. Settings at the web ACL level can override the rule action setting.","CaptchaConfig":"Specifies how AWS WAF should handle `CAPTCHA` evaluations. If you don\'t specify this, AWS WAF uses the `CAPTCHA` configuration that\'s defined for the web ACL.","ChallengeConfig":"Specifies how AWS WAF should handle `Challenge` evaluations. If you don\'t specify this, AWS WAF uses the challenge configuration that\'s defined for the web ACL.","Name":"The name of the rule. You can\'t change the name of a `Rule` after you create it.","Priority":"If you define more than one `Rule` in a `WebACL` , AWS WAF evaluates each request against the `Rules` in order based on the value of `Priority` . AWS WAF processes rules with lower priority first. The priorities don\'t need to be consecutive, but they must all be different.","RuleLabels":"Labels to apply to web requests that match the rule match statement. AWS WAF applies fully qualified labels to matching web requests. A fully qualified label is the concatenation of a label namespace and a rule label. The rule\'s rule group or web ACL defines the label namespace.\\n\\nRules that run after this rule in the web ACL can match against these labels using a `LabelMatchStatement` .\\n\\nFor each label, provide a case-sensitive string containing optional namespaces and a label name, according to the following guidelines:\\n\\n- Separate each component of the label with a colon.\\n- Each namespace or name can have up to 128 characters.\\n- You can specify up to 5 namespaces in a label.\\n- Don\'t use the following reserved words in your label specification: `aws` , `waf` , `managed` , `rulegroup` , `webacl` , `regexpatternset` , or `ipset` .\\n\\nFor example, `myLabelName` or `nameSpace1:nameSpace2:myLabelName` .","Statement":"The AWS WAF processing statement for the rule, for example `ByteMatchStatement` or `SizeConstraintStatement` .","VisibilityConfig":"Defines and enables Amazon CloudWatch metrics and web request sample collection."}},"AWS::WAFv2::RuleGroup.RuleAction":{"attributes":{},"description":"The action that AWS WAF should take on a web request when it matches a rule\'s statement. Settings at the web ACL level can override the rule action setting.","properties":{"Allow":"Instructs AWS WAF to allow the web request.","Block":"Instructs AWS WAF to block the web request.","Captcha":"Specifies that AWS WAF should run a `CAPTCHA` check against the request:\\n\\n- If the request includes a valid, unexpired `CAPTCHA` token, AWS WAF allows the web request inspection to proceed to the next rule, similar to a `CountAction` .\\n- If the request doesn\'t include a valid, unexpired `CAPTCHA` token, AWS WAF discontinues the web ACL evaluation of the request and blocks it from going to its intended destination.\\n\\nAWS WAF generates a response that it sends back to the client, which includes the following:\\n\\n- The header `x-amzn-waf-action` with a value of `captcha` .\\n- The HTTP status code `405 Method Not Allowed` .\\n- If the request contains an `Accept` header with a value of `text/html` , the response includes a `CAPTCHA` challenge.\\n\\nYou can configure the expiration time in the `CaptchaConfig` `ImmunityTimeProperty` setting at the rule and web ACL level. The rule setting overrides the web ACL setting.\\n\\nThis action option is available for rules. It isn\'t available for web ACL default actions.","Challenge":"Instructs AWS WAF to run a `Challenge` check against the web request.","Count":"Instructs AWS WAF to count the web request and then continue evaluating the request using the remaining rules in the web ACL."}},"AWS::WAFv2::RuleGroup.SingleHeader":{"attributes":{},"description":"Inspect one of the headers in the web request, identified by name, for example, `User-Agent` or `Referer` . The name isn\'t case sensitive.\\n\\nYou can filter and inspect all headers with the `FieldToMatch` setting `Headers` .\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nExample JSON: `\\"SingleHeader\\": { \\"Name\\": \\"haystack\\" }`","properties":{"Name":"The name of the query header to inspect."}},"AWS::WAFv2::RuleGroup.SingleQueryArgument":{"attributes":{},"description":"Inspect one query argument in the web request, identified by name, for example *UserName* or *SalesRegion* . The name isn\'t case sensitive.\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nExample JSON: `\\"SingleQueryArgument\\": { \\"Name\\": \\"myArgument\\" }`","properties":{"Name":"The name of the query argument to inspect."}},"AWS::WAFv2::RuleGroup.SizeConstraintStatement":{"attributes":{},"description":"A rule statement that compares a number of bytes against the size of a request component, using a comparison operator, such as greater than (>) or less than (<). For example, you can use a size constraint statement to look for query strings that are longer than 100 bytes.\\n\\nIf you configure AWS WAF to inspect the request body, AWS WAF inspects only the number of bytes of the body up to the limit for the web ACL. By default, for regional web ACLs, this limit is 8 KB (8,192 kilobytes) and for CloudFront web ACLs, this limit is 16 KB (16,384 kilobytes). For CloudFront web ACLs, you can increase the limit in the web ACL `AssociationConfig` , for additional fees. If you know that the request body for your web requests should never exceed the inspection limit, you could use a size constraint statement to block requests that have a larger request body size.\\n\\nIf you choose URI for the value of Part of the request to filter on, the slash (/) in the URI counts as one character. For example, the URI `/logo.jpg` is nine characters long.","properties":{"ComparisonOperator":"The operator to use to compare the request part to the size setting.","FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","Size":"The size, in byte, to compare to the request part, after any transformations.","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::RuleGroup.SqliMatchStatement":{"attributes":{},"description":"A rule statement that inspects for malicious SQL code. Attackers insert malicious SQL code into web requests to do things like modify your database or extract data from it.","properties":{"FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","SensitivityLevel":"The sensitivity that you want AWS WAF to use to inspect for SQL injection attacks.\\n\\n`HIGH` detects more attacks, but might generate more false positives, especially if your web requests frequently contain unusual strings. For information about identifying and mitigating false positives, see [Testing and tuning](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-testing.html) in the *AWS WAF Developer Guide* .\\n\\n`LOW` is generally a better choice for resources that already have other protections against SQL injection attacks or that have a low tolerance for false positives.\\n\\nDefault: `LOW`","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::RuleGroup.Statement":{"attributes":{},"description":"The processing guidance for a rule, used by AWS WAF to determine whether a web request matches the rule.","properties":{"AndStatement":"A logical rule statement used to combine other rule statements with AND logic. You provide more than one `Statement` within the `AndStatement` .","ByteMatchStatement":"A rule statement that defines a string match search for AWS WAF to apply to web requests. The byte match statement provides the bytes to search for, the location in requests that you want AWS WAF to search, and other settings. The bytes to search for are typically a string that corresponds with ASCII characters. In the AWS WAF console and the developer guide, this is called a string match statement.","GeoMatchStatement":"A rule statement that labels web requests by country and region and that matches against web requests based on country code. A geo match rule labels every request that it inspects regardless of whether it finds a match.\\n\\n- To manage requests only by country, you can use this statement by itself and specify the countries that you want to match against in the `CountryCodes` array.\\n- Otherwise, configure your geo match rule with Count action so that it only labels requests. Then, add one or more label match rules to run after the geo match rule and configure them to match against the geographic labels and handle the requests as needed.\\n\\nAWS WAF labels requests using the alpha-2 country and region codes from the International Organization for Standardization (ISO) 3166 standard. AWS WAF determines the codes using either the IP address in the web request origin or, if you specify it, the address in the geo match `ForwardedIPConfig` .\\n\\nIf you use the web request origin, the label formats are `awswaf:clientip:geo:region:-` and `awswaf:clientip:geo:country:` .\\n\\nIf you use a forwarded IP address, the label formats are `awswaf:forwardedip:geo:region:-` and `awswaf:forwardedip:geo:country:` .\\n\\nFor additional details, see [Geographic match rule statement](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-type-geo-match.html) in the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) .","IPSetReferenceStatement":"A rule statement used to detect web requests coming from particular IP addresses or address ranges. To use this, create an `IPSet` that specifies the addresses you want to detect, then use the ARN of that set in this statement.\\n\\nEach IP set rule statement references an IP set. You create and maintain the set independent of your rules. This allows you to use the single set in multiple rules. When you update the referenced set, AWS WAF automatically updates all rules that reference it.","LabelMatchStatement":"A rule statement to match against labels that have been added to the web request by rules that have already run in the web ACL.\\n\\nThe label match statement provides the label or namespace string to search for. The label string can represent a part or all of the fully qualified label name that had been added to the web request. Fully qualified labels have a prefix, optional namespaces, and label name. The prefix identifies the rule group or web ACL context of the rule that added the label. If you do not provide the fully qualified name in your label match string, AWS WAF performs the search for labels that were added in the same context as the label match statement.","NotStatement":"A logical rule statement used to negate the results of another rule statement. You provide one `Statement` within the `NotStatement` .","OrStatement":"A logical rule statement used to combine other rule statements with OR logic. You provide more than one `Statement` within the `OrStatement` .","RateBasedStatement":"A rate-based rule tracks the rate of requests for each originating IP address, and triggers the rule action when the rate exceeds a limit that you specify on the number of requests in any 5-minute time span. You can use this to put a temporary block on requests from an IP address that is sending excessive requests.\\n\\nAWS WAF tracks and manages web requests separately for each instance of a rate-based rule that you use. For example, if you provide the same rate-based rule settings in two web ACLs, each of the two rule statements represents a separate instance of the rate-based rule and gets its own tracking and management by AWS WAF . If you define a rate-based rule inside a rule group, and then use that rule group in multiple places, each use creates a separate instance of the rate-based rule that gets its own tracking and management by AWS WAF .\\n\\nWhen the rule action triggers, AWS WAF blocks additional requests from the IP address until the request rate falls below the limit.\\n\\nYou can optionally nest another statement inside the rate-based statement, to narrow the scope of the rule so that it only counts requests that match the nested statement. For example, based on recent requests that you have seen from an attacker, you might create a rate-based rule with a nested AND rule statement that contains the following nested statements:\\n\\n- An IP match statement with an IP set that specifies the address 192.0.2.44.\\n- A string match statement that searches in the User-Agent header for the string BadBot.\\n\\nIn this rate-based rule, you also define a rate limit. For this example, the rate limit is 1,000. Requests that meet the criteria of both of the nested statements are counted. If the count exceeds 1,000 requests per five minutes, the rule action triggers. Requests that do not meet the criteria of both of the nested statements are not counted towards the rate limit and are not affected by this rule.\\n\\nYou cannot nest a `RateBasedStatement` inside another statement, for example inside a `NotStatement` or `OrStatement` . You can define a `RateBasedStatement` inside a web ACL and inside a rule group.","RegexMatchStatement":"A rule statement used to search web request components for a match against a single regular expression.","RegexPatternSetReferenceStatement":"A rule statement used to search web request components for matches with regular expressions. To use this, create a `RegexPatternSet` that specifies the expressions that you want to detect, then use the ARN of that set in this statement. A web request matches the pattern set rule statement if the request component matches any of the patterns in the set.\\n\\nEach regex pattern set rule statement references a regex pattern set. You create and maintain the set independent of your rules. This allows you to use the single set in multiple rules. When you update the referenced set, AWS WAF automatically updates all rules that reference it.","SizeConstraintStatement":"A rule statement that compares a number of bytes against the size of a request component, using a comparison operator, such as greater than (>) or less than (<). For example, you can use a size constraint statement to look for query strings that are longer than 100 bytes.\\n\\nIf you configure AWS WAF to inspect the request body, AWS WAF inspects only the number of bytes of the body up to the limit for the web ACL. By default, for regional web ACLs, this limit is 8 KB (8,192 kilobytes) and for CloudFront web ACLs, this limit is 16 KB (16,384 kilobytes). For CloudFront web ACLs, you can increase the limit in the web ACL `AssociationConfig` , for additional fees. If you know that the request body for your web requests should never exceed the inspection limit, you could use a size constraint statement to block requests that have a larger request body size.\\n\\nIf you choose URI for the value of Part of the request to filter on, the slash (/) in the URI counts as one character. For example, the URI `/logo.jpg` is nine characters long.","SqliMatchStatement":"A rule statement that inspects for malicious SQL code. Attackers insert malicious SQL code into web requests to do things like modify your database or extract data from it.","XssMatchStatement":"A rule statement that inspects for cross-site scripting (XSS) attacks. In XSS attacks, the attacker uses vulnerabilities in a benign website as a vehicle to inject malicious client-site scripts into other legitimate web browsers."}},"AWS::WAFv2::RuleGroup.TextTransformation":{"attributes":{},"description":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection.","properties":{"Priority":"Sets the relative processing order for multiple transformations. AWS WAF processes all transformations, from lowest priority to highest, before inspecting the transformed content. The priorities don\'t need to be consecutive, but they must all be different.","Type":"You can specify the following transformation types:\\n\\n*BASE64_DECODE* - Decode a `Base64` -encoded string.\\n\\n*BASE64_DECODE_EXT* - Decode a `Base64` -encoded string, but use a forgiving implementation that ignores characters that aren\'t valid.\\n\\n*CMD_LINE* - Command-line transformations. These are helpful in reducing effectiveness of attackers who inject an operating system command-line command and use unusual formatting to disguise some or all of the command.\\n\\n- Delete the following characters: `\\\\ \\" \' ^`\\n- Delete spaces before the following characters: `/ (`\\n- Replace the following characters with a space: `, ;`\\n- Replace multiple spaces with one space\\n- Convert uppercase letters (A-Z) to lowercase (a-z)\\n\\n*COMPRESS_WHITE_SPACE* - Replace these characters with a space character (decimal 32):\\n\\n- `\\\\f` , formfeed, decimal 12\\n- `\\\\t` , tab, decimal 9\\n- `\\\\n` , newline, decimal 10\\n- `\\\\r` , carriage return, decimal 13\\n- `\\\\v` , vertical tab, decimal 11\\n- Non-breaking space, decimal 160\\n\\n`COMPRESS_WHITE_SPACE` also replaces multiple spaces with one space.\\n\\n*CSS_DECODE* - Decode characters that were encoded using CSS 2.x escape rules `syndata.html#characters` . This function uses up to two bytes in the decoding process, so it can help to uncover ASCII characters that were encoded using CSS encoding that wouldn’t typically be encoded. It\'s also useful in countering evasion, which is a combination of a backslash and non-hexadecimal characters. For example, `ja\\\\vascript` for javascript.\\n\\n*ESCAPE_SEQ_DECODE* - Decode the following ANSI C escape sequences: `\\\\a` , `\\\\b` , `\\\\f` , `\\\\n` , `\\\\r` , `\\\\t` , `\\\\v` , `\\\\\\\\` , `\\\\?` , `\\\\\'` , `\\\\\\"` , `\\\\xHH` (hexadecimal), `\\\\0OOO` (octal). Encodings that aren\'t valid remain in the output.\\n\\n*HEX_DECODE* - Decode a string of hexadecimal characters into a binary.\\n\\n*HTML_ENTITY_DECODE* - Replace HTML-encoded characters with unencoded characters. `HTML_ENTITY_DECODE` performs these operations:\\n\\n- Replaces `(ampersand)quot;` with `\\"`\\n- Replaces `(ampersand)nbsp;` with a non-breaking space, decimal 160\\n- Replaces `(ampersand)lt;` with a \\"less than\\" symbol\\n- Replaces `(ampersand)gt;` with `>`\\n- Replaces characters that are represented in hexadecimal format, `(ampersand)#xhhhh;` , with the corresponding characters\\n- Replaces characters that are represented in decimal format, `(ampersand)#nnnn;` , with the corresponding characters\\n\\n*JS_DECODE* - Decode JavaScript escape sequences. If a `\\\\` `u` `HHHH` code is in the full-width ASCII code range of `FF01-FF5E` , then the higher byte is used to detect and adjust the lower byte. If not, only the lower byte is used and the higher byte is zeroed, causing a possible loss of information.\\n\\n*LOWERCASE* - Convert uppercase letters (A-Z) to lowercase (a-z).\\n\\n*MD5* - Calculate an MD5 hash from the data in the input. The computed hash is in a raw binary form.\\n\\n*NONE* - Specify `NONE` if you don\'t want any text transformations.\\n\\n*NORMALIZE_PATH* - Remove multiple slashes, directory self-references, and directory back-references that are not at the beginning of the input from an input string.\\n\\n*NORMALIZE_PATH_WIN* - This is the same as `NORMALIZE_PATH` , but first converts backslash characters to forward slashes.\\n\\n*REMOVE_NULLS* - Remove all `NULL` bytes from the input.\\n\\n*REPLACE_COMMENTS* - Replace each occurrence of a C-style comment ( `/* ... */` ) with a single space. Multiple consecutive occurrences are not compressed. Unterminated comments are also replaced with a space (ASCII 0x20). However, a standalone termination of a comment ( `*/` ) is not acted upon.\\n\\n*REPLACE_NULLS* - Replace NULL bytes in the input with space characters (ASCII `0x20` ).\\n\\n*SQL_HEX_DECODE* - Decode SQL hex data. Example ( `0x414243` ) will be decoded to ( `ABC` ).\\n\\n*URL_DECODE* - Decode a URL-encoded value.\\n\\n*URL_DECODE_UNI* - Like `URL_DECODE` , but with support for Microsoft-specific `%u` encoding. If the code is in the full-width ASCII code range of `FF01-FF5E` , the higher byte is used to detect and adjust the lower byte. Otherwise, only the lower byte is used and the higher byte is zeroed.\\n\\n*UTF8_TO_UNICODE* - Convert all UTF-8 character sequences to Unicode. This helps input normalization, and minimizing false-positives and false-negatives for non-English languages."}},"AWS::WAFv2::RuleGroup.VisibilityConfig":{"attributes":{},"description":"Defines and enables Amazon CloudWatch metrics and web request sample collection.","properties":{"CloudWatchMetricsEnabled":"Indicates whether the associated resource sends metrics to Amazon CloudWatch. For the list of available metrics, see [AWS WAF Metrics](https://docs.aws.amazon.com/waf/latest/developerguide/monitoring-cloudwatch.html#waf-metrics) in the *AWS WAF Developer Guide* .\\n\\nFor web ACLs, the metrics are for web requests that have the web ACL default action applied. AWS WAF applies the default action to web requests that pass the inspection of all rules in the web ACL without being either allowed or blocked. For more information,\\nsee [The web ACL default action](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-default-action.html) in the *AWS WAF Developer Guide* .","MetricName":"A name of the Amazon CloudWatch metric dimension. The name can contain only the characters: A-Z, a-z, 0-9, - (hyphen), and _ (underscore). The name can be from one to 128 characters long. It can\'t contain whitespace or metric names that are reserved for AWS WAF , for example `All` and `Default_Action` .","SampledRequestsEnabled":"Indicates whether AWS WAF should store a sampling of the web requests that match the rules. You can view the sampled requests through the AWS WAF console."}},"AWS::WAFv2::RuleGroup.XssMatchStatement":{"attributes":{},"description":"A rule statement that inspects for cross-site scripting (XSS) attacks. In XSS attacks, the attacker uses vulnerabilities in a benign website as a vehicle to inject malicious client-site scripts into other legitimate web browsers.","properties":{"FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::WebACL":{"attributes":{"Arn":"The Amazon Resource Name (ARN) of the web ACL.","Capacity":"The web ACL capacity units (WCUs) currently being used by this web ACL.\\n\\nAWS WAF uses WCUs to calculate and control the operating resources that are used to run your rules, rule groups, and web ACLs. AWS WAF calculates capacity differently for each rule type, to reflect the relative cost of each rule. Simple rules that cost little to run use fewer WCUs than more complex rules that use more processing power. Rule group capacity is fixed at creation, which helps users plan their web ACL WCU usage when they use a rule group. The WCU limit for web ACLs is 1,500.","Id":"The ID of the web ACL.","LabelNamespace":"The label namespace prefix for this web ACL. All labels added by rules in this web ACL have this prefix.\\n\\nThe syntax for the label namespace prefix for a web ACL is the following: `awswaf::webacl::`\\n\\nWhen a rule with a label matches a web request, AWS WAF adds the fully qualified label to the request. A fully qualified label is made up of the label namespace from the rule group or web ACL where the rule is defined and the label from the rule, separated by a colon.","Ref":"The `Ref` for the resource, containing the resource name, physical ID, and scope, formatted as follows: `name|id|scope` .\\n\\nFor example: `my-webacl-name|1234a1a-a1b1-12a1-abcd-a123b123456|REGIONAL` ."},"description":"> This is the latest version of *AWS WAF* , named AWS WAF V2, released in November, 2019. For information, including how to migrate your AWS WAF resources from the prior release, see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . \\n\\nUse an `WebACL` to define a collection of rules to use to inspect and control web requests. Each rule has an action defined (allow, block, or count) for requests that match the statement of the rule. In the web ACL, you specify a default action to take (allow, block) for any request that doesn\'t match any of the rules. The rules in a web ACL can contain rule statements that you define explicitly and rule statements that reference rule groups and managed rule groups. You can associate a web ACL with one or more AWS resources to protect. The resources can be an Amazon CloudFront distribution, an Amazon API Gateway REST API, an Application Load Balancer , an AWS AppSync GraphQL API , an Amazon Cognito user pool, an AWS App Runner service, or an AWS Verified Access instance.","properties":{"AssociationConfig":"Specifies custom configurations for the associations between the web ACL and protected resources.\\n\\nUse this to customize the maximum size of the request body that your protected CloudFront distributions forward to AWS WAF for inspection. The default is 16 KB (16,384 kilobytes).\\n\\n> You are charged additional fees when your protected resources forward body sizes that are larger than the default. For more information, see [AWS WAF Pricing](https://docs.aws.amazon.com/waf/pricing/) .","CaptchaConfig":"Specifies how AWS WAF should handle `CAPTCHA` evaluations for rules that don\'t have their own `CaptchaConfig` settings. If you don\'t specify this, AWS WAF uses its default settings for `CaptchaConfig` .","ChallengeConfig":"Specifies how AWS WAF should handle challenge evaluations for rules that don\'t have their own `ChallengeConfig` settings. If you don\'t specify this, AWS WAF uses its default settings for `ChallengeConfig` .","CustomResponseBodies":"A map of custom response keys and content bodies. When you create a rule with a block action, you can send a custom response to the web request. You define these for the web ACL, and then use them in the rules and default actions that you define in the web ACL.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* .\\n\\nFor information about the limits on count and size for custom request and response settings, see [AWS WAF quotas](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html) in the *AWS WAF Developer Guide* .","DefaultAction":"The action to perform if none of the `Rules` contained in the `WebACL` match.","Description":"A description of the web ACL that helps with identification.","Name":"The name of the web ACL. You cannot change the name of a web ACL after you create it.","Rules":"The rule statements used to identify the web requests that you want to allow, block, or count. Each rule includes one top-level statement that AWS WAF uses to identify matching web requests, and parameters that govern how AWS WAF handles them.","Scope":"Specifies whether this is for an Amazon CloudFront distribution or for a regional application. A regional application can be an Application Load Balancer (ALB), an Amazon API Gateway REST API, an AWS AppSync GraphQL API, an Amazon Cognito user pool, an AWS App Runner service, or an AWS Verified Access instance. Valid Values are `CLOUDFRONT` and `REGIONAL` .\\n\\n> For `CLOUDFRONT` , you must create your WAFv2 resources in the US East (N. Virginia) Region, `us-east-1` . \\n\\nFor information about how to define the association of the web ACL with your resource, see `WebACLAssociation` .","Tags":"Key:value pairs associated with an AWS resource. The key:value pair can be anything you define. Typically, the tag key represents a category (such as \\"environment\\") and the tag value represents a specific value within that category (such as \\"test,\\" \\"development,\\" or \\"production\\"). You can add up to 50 tags to each AWS resource.\\n\\n> To modify tags on existing resources, use the AWS WAF APIs or command line interface. With AWS CloudFormation , you can only add tags to AWS WAF resources during resource creation.","TokenDomains":"Specifies the domains that AWS WAF should accept in a web request token. This enables the use of tokens across multiple protected websites. When AWS WAF provides a token, it uses the domain of the AWS resource that the web ACL is protecting. If you don\'t specify a list of token domains, AWS WAF accepts tokens only for the domain of the protected resource. With a token domain list, AWS WAF accepts the resource\'s host domain plus all domains in the token domain list, including their prefixed subdomains.","VisibilityConfig":"Defines and enables Amazon CloudWatch metrics and web request sample collection."}},"AWS::WAFv2::WebACL.AWSManagedRulesATPRuleSet":{"attributes":{},"description":"Details for your use of the account takeover prevention managed rule group, `AWSManagedRulesATPRuleSet` . This configuration is used in `ManagedRuleGroupConfig` .","properties":{"LoginPath":"The path of the login endpoint for your application. For example, for the URL `https://example.com/web/login` , you would provide the path `/web/login` .\\n\\nThe rule group inspects only HTTP `POST` requests to your specified login endpoint.","RequestInspection":"The criteria for inspecting login requests, used by the ATP rule group to validate credentials usage.","ResponseInspection":"The criteria for inspecting responses to login requests, used by the ATP rule group to track login failure rates.\\n\\nThe ATP rule group evaluates the responses that your protected resources send back to client login attempts, keeping count of successful and failed attempts from each IP address and client session. Using this information, the rule group labels and mitigates requests from client sessions and IP addresses that submit too many failed login attempts in a short amount of time.\\n\\n> Response inspection is available only in web ACLs that protect Amazon CloudFront distributions."}},"AWS::WAFv2::WebACL.AWSManagedRulesBotControlRuleSet":{"attributes":{},"description":"Details for your use of the Bot Control managed rule group, used in `ManagedRuleGroupConfig` .","properties":{"InspectionLevel":"The inspection level to use for the Bot Control rule group. The common level is the least expensive. The targeted level includes all common level rules and adds rules with more advanced inspection criteria. For details, see [AWS WAF Bot Control rule group](https://docs.aws.amazon.com/waf/latest/developerguide/aws-managed-rule-groups-bot.html) ."}},"AWS::WAFv2::WebACL.AllowAction":{"attributes":{},"description":"Specifies that AWS WAF should allow the request and optionally defines additional custom handling for the request.\\n\\nThis is used in the context of other settings, for example to specify values for a rule action or a web ACL default action.","properties":{"CustomRequestHandling":"Defines custom handling for the web request.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::WebACL.AndStatement":{"attributes":{},"description":"A logical rule statement used to combine other rule statements with AND logic. You provide more than one `Statement` within the `AndStatement` .","properties":{"Statements":"The statements to combine with AND logic. You can use any statements that can be nested."}},"AWS::WAFv2::WebACL.AssociationConfig":{"attributes":{},"description":"Specifies custom configurations for the associations between the web ACL and protected resources.\\n\\nUse this to customize the maximum size of the request body that your protected CloudFront distributions forward to AWS WAF for inspection. The default is 16 KB (16,384 kilobytes).\\n\\n> You are charged additional fees when your protected resources forward body sizes that are larger than the default. For more information, see [AWS WAF Pricing](https://docs.aws.amazon.com/waf/pricing/) .","properties":{"RequestBody":"Customizes the maximum size of the request body that your protected CloudFront distributions forward to AWS WAF for inspection. The default size is 16 KB (16,384 kilobytes).\\n\\n> You are charged additional fees when your protected resources forward body sizes that are larger than the default. For more information, see [AWS WAF Pricing](https://docs.aws.amazon.com/waf/pricing/) ."}},"AWS::WAFv2::WebACL.BlockAction":{"attributes":{},"description":"Specifies that AWS WAF should block the request and optionally defines additional custom handling for the response to the web request.\\n\\nThis is used in the context of other settings, for example to specify values for a rule action or a web ACL default action.","properties":{"CustomResponse":"Defines a custom response for the web request.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::WebACL.Body":{"attributes":{},"description":"Inspect the body of the web request. The body immediately follows the request headers.\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.","properties":{"OversizeHandling":"What AWS WAF should do if the body is larger than AWS WAF can inspect. AWS WAF does not support inspecting the entire contents of the web request body if the body exceeds the limit for the resource type. If the body is larger than the limit, the underlying host service only forwards the contents that are below the limit to AWS WAF for inspection.\\n\\nThe default limit is 8 KB (8,192 kilobytes) for regional resources and 16 KB (16,384 kilobytes) for CloudFront distributions. For CloudFront distributions, you can increase the limit in the web ACL `AssociationConfig` , for additional processing fees.\\n\\nThe options for oversize handling are the following:\\n\\n- `CONTINUE` - Inspect the available body contents normally, according to the rule inspection criteria.\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement.\\n\\nYou can combine the `MATCH` or `NO_MATCH` settings for oversize handling with your rule and web ACL action settings, so that you block any request whose body is over the limit.\\n\\nDefault: `CONTINUE`"}},"AWS::WAFv2::WebACL.ByteMatchStatement":{"attributes":{},"description":"A rule statement that defines a string match search for AWS WAF to apply to web requests. The byte match statement provides the bytes to search for, the location in requests that you want AWS WAF to search, and other settings. The bytes to search for are typically a string that corresponds with ASCII characters. In the AWS WAF console and the developer guide, this is called a string match statement.","properties":{"FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","PositionalConstraint":"The area within the portion of the web request that you want AWS WAF to search for `SearchString` . Valid values include the following:\\n\\n*CONTAINS*\\n\\nThe specified part of the web request must include the value of `SearchString` , but the location doesn\'t matter.\\n\\n*CONTAINS_WORD*\\n\\nThe specified part of the web request must include the value of `SearchString` , and `SearchString` must contain only alphanumeric characters or underscore (A-Z, a-z, 0-9, or _). In addition, `SearchString` must be a word, which means that both of the following are true:\\n\\n- `SearchString` is at the beginning of the specified part of the web request or is preceded by a character other than an alphanumeric character or underscore (_). Examples include the value of a header and `;BadBot` .\\n- `SearchString` is at the end of the specified part of the web request or is followed by a character other than an alphanumeric character or underscore (_), for example, `BadBot;` and `-BadBot;` .\\n\\n*EXACTLY*\\n\\nThe value of the specified part of the web request must exactly match the value of `SearchString` .\\n\\n*STARTS_WITH*\\n\\nThe value of `SearchString` must appear at the beginning of the specified part of the web request.\\n\\n*ENDS_WITH*\\n\\nThe value of `SearchString` must appear at the end of the specified part of the web request.","SearchString":"A string value that you want AWS WAF to search for. AWS WAF searches only in the part of web requests that you designate for inspection in `FieldToMatch` . The maximum length of the value is 200 bytes. For alphabetic characters A-Z and a-z, the value is case sensitive.\\n\\nDon\'t encode this string. Provide the value that you want AWS WAF to search for. AWS CloudFormation automatically base64 encodes the value for you.\\n\\nFor example, suppose the value of `Type` is `HEADER` and the value of `Data` is `User-Agent` . If you want to search the `User-Agent` header for the value `BadBot` , you provide the string `BadBot` in the value of `SearchString` .\\n\\nYou must specify either `SearchString` or `SearchStringBase64` in a `ByteMatchStatement` .","SearchStringBase64":"String to search for in a web request component, base64-encoded. If you don\'t want to encode the string, specify the unencoded value in `SearchString` instead.\\n\\nYou must specify either `SearchString` or `SearchStringBase64` in a `ByteMatchStatement` .","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::WebACL.CaptchaAction":{"attributes":{},"description":"Specifies that AWS WAF should run a `CAPTCHA` check against the request:\\n\\n- If the request includes a valid, unexpired `CAPTCHA` token, AWS WAF allows the web request inspection to proceed to the next rule, similar to a `CountAction` .\\n- If the request doesn\'t include a valid, unexpired `CAPTCHA` token, AWS WAF discontinues the web ACL evaluation of the request and blocks it from going to its intended destination.\\n\\nAWS WAF generates a response that it sends back to the client, which includes the following:\\n\\n- The header `x-amzn-waf-action` with a value of `captcha` .\\n- The HTTP status code `405 Method Not Allowed` .\\n- If the request contains an `Accept` header with a value of `text/html` , the response includes a `CAPTCHA` challenge.\\n\\nYou can configure the expiration time in the `CaptchaConfig` `ImmunityTimeProperty` setting at the rule and web ACL level. The rule setting overrides the web ACL setting.\\n\\nThis action option is available for rules. It isn\'t available for web ACL default actions.","properties":{"CustomRequestHandling":"Defines custom handling for the web request, used when the `CAPTCHA` inspection determines that the request\'s token is valid and unexpired.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::WebACL.CaptchaConfig":{"attributes":{},"description":"Specifies how AWS WAF should handle `CAPTCHA` evaluations for rules that don\'t have their own `CaptchaConfig` settings. If you don\'t specify this, AWS WAF uses its default settings for `CaptchaConfig` .","properties":{"ImmunityTimeProperty":"Determines how long a `CAPTCHA` timestamp in the token remains valid after the client successfully solves a `CAPTCHA` puzzle."}},"AWS::WAFv2::WebACL.ChallengeAction":{"attributes":{},"description":"Specifies that AWS WAF should run a `Challenge` check against the request to verify that the request is coming from a legitimate client session:\\n\\n- If the request includes a valid, unexpired challenge token, AWS WAF applies any custom request handling and labels that you\'ve configured and then allows the web request inspection to proceed to the next rule, similar to a `CountAction` .\\n- If the request doesn\'t include a valid, unexpired challenge token, AWS WAF discontinues the web ACL evaluation of the request and blocks it from going to its intended destination.\\n\\nAWS WAF then generates a challenge response that it sends back to the client, which includes the following:\\n\\n- The header `x-amzn-waf-action` with a value of `challenge` .\\n- The HTTP status code `202 Request Accepted` .\\n- If the request contains an `Accept` header with a value of `text/html` , the response includes a JavaScript page interstitial with a challenge script.\\n\\nChallenges run silent browser interrogations in the background, and don\'t generally affect the end user experience.\\n\\nA challenge enforces token acquisition using an interstitial JavaScript challenge that inspects the client session for legitimate behavior. The challenge blocks bots or at least increases the cost of operating sophisticated bots.\\n\\nAfter the client session successfully responds to the challenge, it receives a new token from AWS WAF , which the challenge script uses to resubmit the original request.\\n\\nYou can configure the expiration time in the `ChallengeConfig` `ImmunityTimeProperty` setting at the rule and web ACL level. The rule setting overrides the web ACL setting.\\n\\nThis action option is available for rules. It isn\'t available for web ACL default actions.","properties":{"CustomRequestHandling":"Defines custom handling for the web request, used when the challenge inspection determines that the request\'s token is valid and unexpired.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) ."}},"AWS::WAFv2::WebACL.ChallengeConfig":{"attributes":{},"description":"Specifies how AWS WAF should handle `Challenge` evaluations. This is available at the web ACL level and in each rule.","properties":{"ImmunityTimeProperty":"Determines how long a challenge timestamp in the token remains valid after the client successfully responds to a challenge."}},"AWS::WAFv2::WebACL.CookieMatchPattern":{"attributes":{},"description":"The filter to use to identify the subset of cookies to inspect in a web request.\\n\\nYou must specify exactly one setting: either `All` , `IncludedCookies` , or `ExcludedCookies` .\\n\\nExample JSON: `\\"MatchPattern\\": { \\"IncludedCookies\\": [ \\"session-id-time\\", \\"session-id\\" ] }`","properties":{"All":"Inspect all cookies.","ExcludedCookies":"Inspect only the cookies whose keys don\'t match any of the strings specified here.","IncludedCookies":"Inspect only the cookies that have a key that matches one of the strings specified here."}},"AWS::WAFv2::WebACL.Cookies":{"attributes":{},"description":"Inspect the cookies in the web request. You can specify the parts of the cookies to inspect and you can narrow the set of cookies to inspect by including or excluding specific keys.\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nExample JSON: `\\"Cookies\\": { \\"MatchPattern\\": { \\"All\\": {} }, \\"MatchScope\\": \\"KEY\\", \\"OversizeHandling\\": \\"MATCH\\" }`","properties":{"MatchPattern":"The filter to use to identify the subset of cookies to inspect in a web request.\\n\\nYou must specify exactly one setting: either `All` , `IncludedCookies` , or `ExcludedCookies` .\\n\\nExample JSON: `\\"MatchPattern\\": { \\"IncludedCookies\\": [ \\"session-id-time\\", \\"session-id\\" ] }`","MatchScope":"The parts of the cookies to inspect with the rule inspection criteria. If you specify `All` , AWS WAF inspects both keys and values.","OversizeHandling":"What AWS WAF should do if the cookies of the request are more numerous or larger than AWS WAF can inspect. AWS WAF does not support inspecting the entire contents of request cookies when they exceed 8 KB (8192 bytes) or 200 total cookies. The underlying host service forwards a maximum of 200 cookies and at most 8 KB of cookie contents to AWS WAF .\\n\\nThe options for oversize handling are the following:\\n\\n- `CONTINUE` - Inspect the available cookies normally, according to the rule inspection criteria.\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement."}},"AWS::WAFv2::WebACL.CountAction":{"attributes":{},"description":"Specifies that AWS WAF should count the request. Optionally defines additional custom handling for the request.\\n\\nThis is used in the context of other settings, for example to specify values for a rule action or a web ACL default action.","properties":{"CustomRequestHandling":"Defines custom handling for the web request.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::WebACL.CustomHTTPHeader":{"attributes":{},"description":"A custom header for custom request and response handling. This is used in `CustomResponse` and `CustomRequestHandling` .","properties":{"Name":"The name of the custom header.\\n\\nFor custom request header insertion, when AWS WAF inserts the header into the request, it prefixes this name `x-amzn-waf-` , to avoid confusion with the headers that are already in the request. For example, for the header name `sample` , AWS WAF inserts the header `x-amzn-waf-sample` .","Value":"The value of the custom header."}},"AWS::WAFv2::WebACL.CustomRequestHandling":{"attributes":{},"description":"Custom request handling behavior that inserts custom headers into a web request. You can add custom request handling for AWS WAF to use when the rule action doesn\'t block the request. For example, `CaptchaAction` for requests with valid t okens, and `AllowAction` .\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the *AWS WAF Developer Guide* .","properties":{"InsertHeaders":"The HTTP headers to insert into the request. Duplicate header names are not allowed.\\n\\nFor information about the limits on count and size for custom request and response settings, see [AWS WAF quotas](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::WebACL.CustomResponse":{"attributes":{},"description":"A custom response to send to the client. You can define a custom response for rule actions and default web ACL actions that are set to the block action.\\n\\nFor information about customizing web requests and responses, see [Customizing web requests and responses in AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html) in the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) .","properties":{"CustomResponseBodyKey":"References the response body that you want AWS WAF to return to the web request client. You can define a custom response for a rule action or a default web ACL action that is set to block. To do this, you first define the response body key and value in the `CustomResponseBodies` setting for the `WebACL` or `RuleGroup` where you want to use it. Then, in the rule action or web ACL default action `BlockAction` setting, you reference the response body using this key.","ResponseCode":"The HTTP status code to return to the client.\\n\\nFor a list of status codes that you can use in your custom responses, see [Supported status codes for custom response](https://docs.aws.amazon.com/waf/latest/developerguide/customizing-the-response-status-codes.html) in the *AWS WAF Developer Guide* .","ResponseHeaders":"The HTTP headers to use in the response. Duplicate header names are not allowed.\\n\\nFor information about the limits on count and size for custom request and response settings, see [AWS WAF quotas](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html) in the *AWS WAF Developer Guide* ."}},"AWS::WAFv2::WebACL.CustomResponseBody":{"attributes":{},"description":"The response body to use in a custom response to a web request. This is referenced by key from `CustomResponse` `CustomResponseBodyKey` .","properties":{"Content":"The payload of the custom response.\\n\\nYou can use JSON escape strings in JSON content. To do this, you must specify JSON content in the `ContentType` setting.\\n\\nFor information about the limits on count and size for custom request and response settings, see [AWS WAF quotas](https://docs.aws.amazon.com/waf/latest/developerguide/limits.html) in the *AWS WAF Developer Guide* .","ContentType":"The type of content in the payload that you are defining in the `Content` string."}},"AWS::WAFv2::WebACL.DefaultAction":{"attributes":{},"description":"In a `WebACL` , this is the action that you want AWS WAF to perform when a web request doesn\'t match any of the rules in the `WebACL` . The default action must be a terminating action.","properties":{"Allow":"Specifies that AWS WAF should allow requests by default.","Block":"Specifies that AWS WAF should block requests by default."}},"AWS::WAFv2::WebACL.ExcludedRule":{"attributes":{},"description":"Specifies a single rule in a rule group whose action you want to override to `Count` .\\n\\n> Instead of this option, use `RuleActionOverrides` . It accepts any valid action setting, including `Count` .","properties":{"Name":"The name of the rule whose action you want to override to `Count` ."}},"AWS::WAFv2::WebACL.FieldIdentifier":{"attributes":{},"description":"The identifier of the username or password field, used in the `ManagedRuleGroupConfig` settings.","properties":{"Identifier":"The name of the username or password field, used in the `ManagedRuleGroupConfig` settings.\\n\\nWhen the `PayloadType` is `JSON` , the identifier must be in JSON pointer syntax. For example `/form/username` . For information about the JSON Pointer syntax, see the Internet Engineering Task Force (IETF) documentation [JavaScript Object Notation (JSON) Pointer](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc6901) .\\n\\nWhen the `PayloadType` is `FORM_ENCODED` , use the HTML form names. For example, `username` ."}},"AWS::WAFv2::WebACL.FieldToMatch":{"attributes":{},"description":"The part of the web request that you want AWS WAF to inspect. Include the single `FieldToMatch` type that you want to inspect, with additional specifications as needed, according to the type. You specify a single request component in `FieldToMatch` for each rule statement that requires it. To inspect more than one component of the web request, create a separate rule statement for each component.\\n\\nExample JSON for a `QueryString` field to match:\\n\\n`\\"FieldToMatch\\": { \\"QueryString\\": {} }`\\n\\nExample JSON for a `Method` field to match specification:\\n\\n`\\"FieldToMatch\\": { \\"Method\\": { \\"Name\\": \\"DELETE\\" } }`","properties":{"AllQueryArguments":"Inspect all query arguments.","Body":"Inspect the request body as plain text. The request body immediately follows the request headers. This is the part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form.\\n\\nA limited amount of the request body is forwarded to AWS WAF for inspection by the underlying host service. For regional resources, the limit is 8 KB (8,192 kilobytes) and for CloudFront distributions, the limit is 16 KB (16,384 kilobytes). For CloudFront distributions, you can increase the limit in the web ACL\'s `AssociationConfig` , for additional processing fees.\\n\\nFor information about how to handle oversized request bodies, see the `Body` object configuration.","Cookies":"Inspect the request cookies. You must configure scope and pattern matching filters in the `Cookies` object, to define the set of cookies and the parts of the cookies that AWS WAF inspects.\\n\\nOnly the first 8 KB (8192 bytes) of a request\'s cookies and only the first 200 cookies are forwarded to AWS WAF for inspection by the underlying host service. You must configure how to handle any oversize cookie content in the `Cookies` object. AWS WAF applies the pattern matching filters to the cookies that it receives from the underlying host service.","Headers":"Inspect the request headers. You must configure scope and pattern matching filters in the `Headers` object, to define the set of headers to and the parts of the headers that AWS WAF inspects.\\n\\nOnly the first 8 KB (8192 bytes) of a request\'s headers and only the first 200 headers are forwarded to AWS WAF for inspection by the underlying host service. You must configure how to handle any oversize header content in the `Headers` object. AWS WAF applies the pattern matching filters to the headers that it receives from the underlying host service.","JsonBody":"Inspect the request body as JSON. The request body immediately follows the request headers. This is the part of a request that contains any additional data that you want to send to your web server as the HTTP request body, such as data from a form.\\n\\nA limited amount of the request body is forwarded to AWS WAF for inspection by the underlying host service. For regional resources, the limit is 8 KB (8,192 kilobytes) and for CloudFront distributions, the limit is 16 KB (16,384 kilobytes). For CloudFront distributions, you can increase the limit in the web ACL\'s `AssociationConfig` , for additional processing fees.\\n\\nFor information about how to handle oversized request bodies, see the `JsonBody` object configuration.","Method":"Inspect the HTTP method. The method indicates the type of operation that the request is asking the origin to perform.","QueryString":"Inspect the query string. This is the part of a URL that appears after a `?` character, if any.","SingleHeader":"Inspect a single header. Provide the name of the header to inspect, for example, `User-Agent` or `Referer` . This setting isn\'t case sensitive.\\n\\nExample JSON: `\\"SingleHeader\\": { \\"Name\\": \\"haystack\\" }`\\n\\nAlternately, you can filter and inspect all headers with the `Headers` `FieldToMatch` setting.","SingleQueryArgument":"Inspect a single query argument. Provide the name of the query argument to inspect, such as *UserName* or *SalesRegion* . The name can be up to 30 characters long and isn\'t case sensitive.\\n\\nExample JSON: `\\"SingleQueryArgument\\": { \\"Name\\": \\"myArgument\\" }`","UriPath":"Inspect the request URI path. This is the part of the web request that identifies a resource, for example, `/images/daily-ad.jpg` ."}},"AWS::WAFv2::WebACL.ForwardedIPConfiguration":{"attributes":{},"description":"The configuration for inspecting IP addresses in an HTTP header that you specify, instead of using the IP address that\'s reported by the web request origin. Commonly, this is the X-Forwarded-For (XFF) header, but you can specify any header name.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all. \\n\\nThis configuration is used for `GeoMatchStatement` and `RateBasedStatement` . For `IPSetReferenceStatement` , use `IPSetForwardedIPConfig` instead.\\n\\nAWS WAF only evaluates the first IP address found in the specified HTTP header.","properties":{"FallbackBehavior":"The match status to assign to the web request if the request doesn\'t have a valid IP address in the specified position.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all. \\n\\nYou can specify the following fallback behaviors:\\n\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement.","HeaderName":"The name of the HTTP header to use for the IP address. For example, to use the X-Forwarded-For (XFF) header, set this to `X-Forwarded-For` .\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all."}},"AWS::WAFv2::WebACL.GeoMatchStatement":{"attributes":{},"description":"A rule statement that labels web requests by country and region and that matches against web requests based on country code. A geo match rule labels every request that it inspects regardless of whether it finds a match.\\n\\n- To manage requests only by country, you can use this statement by itself and specify the countries that you want to match against in the `CountryCodes` array.\\n- Otherwise, configure your geo match rule with Count action so that it only labels requests. Then, add one or more label match rules to run after the geo match rule and configure them to match against the geographic labels and handle the requests as needed.\\n\\nAWS WAF labels requests using the alpha-2 country and region codes from the International Organization for Standardization (ISO) 3166 standard. AWS WAF determines the codes using either the IP address in the web request origin or, if you specify it, the address in the geo match `ForwardedIPConfig` .\\n\\nIf you use the web request origin, the label formats are `awswaf:clientip:geo:region:-` and `awswaf:clientip:geo:country:` .\\n\\nIf you use a forwarded IP address, the label formats are `awswaf:forwardedip:geo:region:-` and `awswaf:forwardedip:geo:country:` .\\n\\nFor additional details, see [Geographic match rule statement](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-type-geo-match.html) in the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) .","properties":{"CountryCodes":"An array of two-character country codes that you want to match against, for example, `[ \\"US\\", \\"CN\\" ]` , from the alpha-2 country ISO codes of the ISO 3166 international standard.\\n\\nWhen you use a geo match statement just for the region and country labels that it adds to requests, you still have to supply a country code for the rule to evaluate. In this case, you configure the rule to only count matching requests, but it will still generate logging and count metrics for any matches. You can reduce the logging and metrics that the rule produces by specifying a country that\'s unlikely to be a source of traffic to your site.","ForwardedIPConfig":"The configuration for inspecting IP addresses in an HTTP header that you specify, instead of using the IP address that\'s reported by the web request origin. Commonly, this is the X-Forwarded-For (XFF) header, but you can specify any header name.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all."}},"AWS::WAFv2::WebACL.HeaderMatchPattern":{"attributes":{},"description":"The filter to use to identify the subset of headers to inspect in a web request.\\n\\nYou must specify exactly one setting: either `All` , `IncludedHeaders` , or `ExcludedHeaders` .\\n\\nExample JSON: `\\"MatchPattern\\": { \\"ExcludedHeaders\\": [ \\"KeyToExclude1\\", \\"KeyToExclude2\\" ] }`","properties":{"All":"Inspect all headers.","ExcludedHeaders":"Inspect only the headers whose keys don\'t match any of the strings specified here.","IncludedHeaders":"Inspect only the headers that have a key that matches one of the strings specified here."}},"AWS::WAFv2::WebACL.Headers":{"attributes":{},"description":"Inspect all headers in the web request. You can specify the parts of the headers to inspect and you can narrow the set of headers to inspect by including or excluding specific keys.\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nIf you want to inspect just the value of a single header, use the `SingleHeader` `FieldToMatch` setting instead.\\n\\nExample JSON: `\\"Headers\\": { \\"MatchPattern\\": { \\"All\\": {} }, \\"MatchScope\\": \\"KEY\\", \\"OversizeHandling\\": \\"MATCH\\" }`","properties":{"MatchPattern":"The filter to use to identify the subset of headers to inspect in a web request.\\n\\nYou must specify exactly one setting: either `All` , `IncludedHeaders` , or `ExcludedHeaders` .\\n\\nExample JSON: `\\"MatchPattern\\": { \\"ExcludedHeaders\\": [ \\"KeyToExclude1\\", \\"KeyToExclude2\\" ] }`","MatchScope":"The parts of the headers to match with the rule inspection criteria. If you specify `All` , AWS WAF inspects both keys and values.","OversizeHandling":"What AWS WAF should do if the headers of the request are more numerous or larger than AWS WAF can inspect. AWS WAF does not support inspecting the entire contents of request headers when they exceed 8 KB (8192 bytes) or 200 total headers. The underlying host service forwards a maximum of 200 headers and at most 8 KB of header contents to AWS WAF .\\n\\nThe options for oversize handling are the following:\\n\\n- `CONTINUE` - Inspect the available headers normally, according to the rule inspection criteria.\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement."}},"AWS::WAFv2::WebACL.IPSetForwardedIPConfiguration":{"attributes":{},"description":"The configuration for inspecting IP addresses in an HTTP header that you specify, instead of using the IP address that\'s reported by the web request origin. Commonly, this is the X-Forwarded-For (XFF) header, but you can specify any header name.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all. \\n\\nThis configuration is used only for `IPSetReferenceStatement` . For `GeoMatchStatement` and `RateBasedStatement` , use `ForwardedIPConfig` instead.","properties":{"FallbackBehavior":"The match status to assign to the web request if the request doesn\'t have a valid IP address in the specified position.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all. \\n\\nYou can specify the following fallback behaviors:\\n\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement.","HeaderName":"The name of the HTTP header to use for the IP address. For example, to use the X-Forwarded-For (XFF) header, set this to `X-Forwarded-For` .\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all.","Position":"The position in the header to search for the IP address. The header can contain IP addresses of the original client and also of proxies. For example, the header value could be `10.1.1.1, 127.0.0.0, 10.10.10.10` where the first IP address identifies the original client and the rest identify proxies that the request went through.\\n\\nThe options for this setting are the following:\\n\\n- FIRST - Inspect the first IP address in the list of IP addresses in the header. This is usually the client\'s original IP.\\n- LAST - Inspect the last IP address in the list of IP addresses in the header.\\n- ANY - Inspect all IP addresses in the header for a match. If the header contains more than 10 IP addresses, AWS WAF inspects the last 10."}},"AWS::WAFv2::WebACL.IPSetReferenceStatement":{"attributes":{},"description":"A rule statement used to detect web requests coming from particular IP addresses or address ranges. To use this, create an `IPSet` that specifies the addresses you want to detect, then use the ARN of that set in this statement.\\n\\nEach IP set rule statement references an IP set. You create and maintain the set independent of your rules. This allows you to use the single set in multiple rules. When you update the referenced set, AWS WAF automatically updates all rules that reference it.","properties":{"Arn":"The Amazon Resource Name (ARN) of the `IPSet` that this statement references.","IPSetForwardedIPConfig":"The configuration for inspecting IP addresses in an HTTP header that you specify, instead of using the IP address that\'s reported by the web request origin. Commonly, this is the X-Forwarded-For (XFF) header, but you can specify any header name.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all."}},"AWS::WAFv2::WebACL.ImmunityTimeProperty":{"attributes":{},"description":"Used for CAPTCHA and challenge token settings. Determines how long a `CAPTCHA` or challenge timestamp remains valid after AWS WAF updates it for a successful `CAPTCHA` or challenge response.","properties":{"ImmunityTime":"The amount of time, in seconds, that a `CAPTCHA` or challenge timestamp is considered valid by AWS WAF . The default setting is 300.\\n\\nFor the Challenge action, the minimum setting is 300."}},"AWS::WAFv2::WebACL.JsonBody":{"attributes":{},"description":"Inspect the body of the web request as JSON. The body immediately follows the request headers.\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nUse the specifications in this object to indicate which parts of the JSON body to inspect using the rule\'s inspection criteria. AWS WAF inspects only the parts of the JSON that result from the matches that you indicate.\\n\\nExample JSON: `\\"JsonBody\\": { \\"MatchPattern\\": { \\"All\\": {} }, \\"MatchScope\\": \\"ALL\\" }`","properties":{"InvalidFallbackBehavior":"What AWS WAF should do if it fails to completely parse the JSON body. The options are the following:\\n\\n- `EVALUATE_AS_STRING` - Inspect the body as plain text. AWS WAF applies the text transformations and inspection criteria that you defined for the JSON inspection to the body text string.\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement.\\n\\nIf you don\'t provide this setting, AWS WAF parses and evaluates the content only up to the first parsing failure that it encounters.\\n\\nAWS WAF does its best to parse the entire JSON body, but might be forced to stop for reasons such as invalid characters, duplicate keys, truncation, and any content whose root node isn\'t an object or an array.\\n\\nAWS WAF parses the JSON in the following examples as two valid key, value pairs:\\n\\n- Missing comma: `{\\"key1\\":\\"value1\\"\\"key2\\":\\"value2\\"}`\\n- Missing colon: `{\\"key1\\":\\"value1\\",\\"key2\\"\\"value2\\"}`\\n- Extra colons: `{\\"key1\\"::\\"value1\\",\\"key2\\"\\"value2\\"}`","MatchPattern":"The patterns to look for in the JSON body. AWS WAF inspects the results of these pattern matches against the rule inspection criteria.","MatchScope":"The parts of the JSON to match against using the `MatchPattern` . If you specify `All` , AWS WAF matches against keys and values.","OversizeHandling":"What AWS WAF should do if the body is larger than AWS WAF can inspect. AWS WAF does not support inspecting the entire contents of the web request body if the body exceeds the limit for the resource type. If the body is larger than the limit, the underlying host service only forwards the contents that are below the limit to AWS WAF for inspection.\\n\\nThe default limit is 8 KB (8,192 kilobytes) for regional resources and 16 KB (16,384 kilobytes) for CloudFront distributions. For CloudFront distributions, you can increase the limit in the web ACL `AssociationConfig` , for additional processing fees.\\n\\nThe options for oversize handling are the following:\\n\\n- `CONTINUE` - Inspect the available body contents normally, according to the rule inspection criteria.\\n- `MATCH` - Treat the web request as matching the rule statement. AWS WAF applies the rule action to the request.\\n- `NO_MATCH` - Treat the web request as not matching the rule statement.\\n\\nYou can combine the `MATCH` or `NO_MATCH` settings for oversize handling with your rule and web ACL action settings, so that you block any request whose body is over the limit.\\n\\nDefault: `CONTINUE`"}},"AWS::WAFv2::WebACL.JsonMatchPattern":{"attributes":{},"description":"The patterns to look for in the JSON body. AWS WAF inspects the results of these pattern matches against the rule inspection criteria. This is used with the `FieldToMatch` option `JsonBody` .","properties":{"All":"Match all of the elements. See also `MatchScope` in the `JsonBody` `FieldToMatch` specification.\\n\\nYou must specify either this setting or the `IncludedPaths` setting, but not both.","IncludedPaths":"Match only the specified include paths. See also `MatchScope` in the `JsonBody` `FieldToMatch` specification.\\n\\nProvide the include paths using JSON Pointer syntax. For example, `\\"IncludedPaths\\": [\\"/dogs/0/name\\", \\"/dogs/1/name\\"]` . For information about this syntax, see the Internet Engineering Task Force (IETF) documentation [JavaScript Object Notation (JSON) Pointer](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc6901) .\\n\\nYou must specify either this setting or the `All` setting, but not both.\\n\\n> Don\'t use this option to include all paths. Instead, use the `All` setting."}},"AWS::WAFv2::WebACL.Label":{"attributes":{},"description":"A single label container. This is used as an element of a label array in `RuleLabels` inside a rule.","properties":{"Name":"The label string."}},"AWS::WAFv2::WebACL.LabelMatchStatement":{"attributes":{},"description":"A rule statement to match against labels that have been added to the web request by rules that have already run in the web ACL.\\n\\nThe label match statement provides the label or namespace string to search for. The label string can represent a part or all of the fully qualified label name that had been added to the web request. Fully qualified labels have a prefix, optional namespaces, and label name. The prefix identifies the rule group or web ACL context of the rule that added the label. If you do not provide the fully qualified name in your label match string, AWS WAF performs the search for labels that were added in the same context as the label match statement.","properties":{"Key":"The string to match against. The setting you provide for this depends on the match statement\'s `Scope` setting:\\n\\n- If the `Scope` indicates `LABEL` , then this specification must include the name and can include any number of preceding namespace specifications and prefix up to providing the fully qualified label name.\\n- If the `Scope` indicates `NAMESPACE` , then this specification can include any number of contiguous namespace strings, and can include the entire label namespace prefix from the rule group or web ACL where the label originates.\\n\\nLabels are case sensitive and components of a label must be separated by colon, for example `NS1:NS2:name` .","Scope":"Specify whether you want to match using the label name or just the namespace."}},"AWS::WAFv2::WebACL.ManagedRuleGroupConfig":{"attributes":{},"description":"Additional information that\'s used by a managed rule group. Many managed rule groups don\'t require this.\\n\\nUse the `AWSManagedRulesBotControlRuleSet` configuration object to configure the protection level that you want the Bot Control rule group to use.","properties":{"AWSManagedRulesATPRuleSet":"Additional configuration for using the account takeover prevention (ATP) managed rule group, `AWSManagedRulesATPRuleSet` . Use this to provide login request information to the rule group. For web ACLs that protect CloudFront distributions, use this to also provide the information about how your distribution responds to login requests.\\n\\nThis configuration replaces the individual configuration fields in `ManagedRuleGroupConfig` and provides additional feature configuration.\\n\\nFor information about using the ATP managed rule group, see [AWS WAF Fraud Control account takeover prevention (ATP) rule group](https://docs.aws.amazon.com/waf/latest/developerguide/aws-managed-rule-groups-atp.html) and [AWS WAF Fraud Control account takeover prevention (ATP)](https://docs.aws.amazon.com/waf/latest/developerguide/waf-atp.html) in the *AWS WAF Developer Guide* .","AWSManagedRulesBotControlRuleSet":"Additional configuration for using the Bot Control managed rule group. Use this to specify the inspection level that you want to use. For information about using the Bot Control managed rule group, see [AWS WAF Bot Control rule group](https://docs.aws.amazon.com/waf/latest/developerguide/aws-managed-rule-groups-bot.html) and [AWS WAF Bot Control](https://docs.aws.amazon.com/waf/latest/developerguide/waf-bot-control.html) in the *AWS WAF Developer Guide* .","LoginPath":"> Instead of this setting, provide your configuration under `AWSManagedRulesATPRuleSet` .","PasswordField":"> Instead of this setting, provide your configuration under `AWSManagedRulesATPRuleSet` `RequestInspection` .","PayloadType":"> Instead of this setting, provide your configuration under `AWSManagedRulesATPRuleSet` `RequestInspection` .","UsernameField":"> Instead of this setting, provide your configuration under `AWSManagedRulesATPRuleSet` `RequestInspection` ."}},"AWS::WAFv2::WebACL.ManagedRuleGroupStatement":{"attributes":{},"description":"A rule statement used to run the rules that are defined in a managed rule group. To use this, provide the vendor name and the name of the rule group in this statement.\\n\\nYou cannot nest a `ManagedRuleGroupStatement` , for example for use inside a `NotStatement` or `OrStatement` . It can only be referenced as a top-level statement within a rule.","properties":{"ExcludedRules":"Rules in the referenced rule group whose actions are set to `Count` .\\n\\n> Instead of this option, use `RuleActionOverrides` . It accepts any valid action setting, including `Count` .","ManagedRuleGroupConfigs":"Additional information that\'s used by a managed rule group. Many managed rule groups don\'t require this.\\n\\nUse the `AWSManagedRulesATPRuleSet` configuration object for the account takeover prevention managed rule group, to provide information such as the sign-in page of your application and the type of content to accept or reject from the client.\\n\\nUse the `AWSManagedRulesBotControlRuleSet` configuration object to configure the protection level that you want the Bot Control rule group to use.","Name":"The name of the managed rule group. You use this, along with the vendor name, to identify the rule group.","RuleActionOverrides":"Action settings to use in the place of the rule actions that are configured inside the rule group. You specify one override for each rule whose action you want to change.\\n\\nYou can use overrides for testing, for example you can override all of rule actions to `Count` and then monitor the resulting count metrics to understand how the rule group would handle your web traffic. You can also permanently override some or all actions, to modify how the rule group manages your web traffic.","ScopeDownStatement":"An optional nested statement that narrows the scope of the web requests that are evaluated by the managed rule group. Requests are only evaluated by the rule group if they match the scope-down statement. You can use any nestable `Statement` in the scope-down statement, and you can nest statements at any level, the same as you can for a rule statement.","VendorName":"The name of the managed rule group vendor. You use this, along with the rule group name, to identify a rule group.","Version":"The version of the managed rule group to use. If you specify this, the version setting is fixed until you change it. If you don\'t specify this, AWS WAF uses the vendor\'s default version, and then keeps the version at the vendor\'s default when the vendor updates the managed rule group settings."}},"AWS::WAFv2::WebACL.NotStatement":{"attributes":{},"description":"A logical rule statement used to negate the results of another rule statement. You provide one `Statement` within the `NotStatement` .","properties":{"Statement":"The statement to negate. You can use any statement that can be nested."}},"AWS::WAFv2::WebACL.OrStatement":{"attributes":{},"description":"A logical rule statement used to combine other rule statements with OR logic. You provide more than one `Statement` within the `OrStatement` .","properties":{"Statements":"The statements to combine with OR logic. You can use any statements that can be nested."}},"AWS::WAFv2::WebACL.OverrideAction":{"attributes":{},"description":"The action to use in the place of the action that results from the rule group evaluation. Set the override action to none to leave the result of the rule group alone. Set it to count to override the result to count only.\\n\\nYou can only use this for rule statements that reference a rule group, like `RuleGroupReferenceStatement` and `ManagedRuleGroupStatement` .\\n\\n> This option is usually set to none. It does not affect how the rules in the rule group are evaluated. If you want the rules in the rule group to only count matches, do not use this and instead use the rule action override option, with `Count` action, in your rule group reference statement settings.","properties":{"Count":"Override the rule group evaluation result to count only.\\n\\n> This option is usually set to none. It does not affect how the rules in the rule group are evaluated. If you want the rules in the rule group to only count matches, do not use this and instead use the rule action override option, with `Count` action, in your rule group reference statement settings.","None":"Don\'t override the rule group evaluation result. This is the most common setting."}},"AWS::WAFv2::WebACL.RateBasedStatement":{"attributes":{},"description":"A rate-based rule tracks the rate of requests for each originating IP address, and triggers the rule action when the rate exceeds a limit that you specify on the number of requests in any 5-minute time span. You can use this to put a temporary block on requests from an IP address that is sending excessive requests.\\n\\nAWS WAF tracks and manages web requests separately for each instance of a rate-based rule that you use. For example, if you provide the same rate-based rule settings in two web ACLs, each of the two rule statements represents a separate instance of the rate-based rule and gets its own tracking and management by AWS WAF . If you define a rate-based rule inside a rule group, and then use that rule group in multiple places, each use creates a separate instance of the rate-based rule that gets its own tracking and management by AWS WAF .\\n\\nWhen the rule action triggers, AWS WAF blocks additional requests from the IP address until the request rate falls below the limit.\\n\\nYou can optionally nest another statement inside the rate-based statement, to narrow the scope of the rule so that it only counts requests that match the nested statement. For example, based on recent requests that you have seen from an attacker, you might create a rate-based rule with a nested AND rule statement that contains the following nested statements:\\n\\n- An IP match statement with an IP set that specifies the address 192.0.2.44.\\n- A string match statement that searches in the User-Agent header for the string BadBot.\\n\\nIn this rate-based rule, you also define a rate limit. For this example, the rate limit is 1,000. Requests that meet the criteria of both of the nested statements are counted. If the count exceeds 1,000 requests per five minutes, the rule action triggers. Requests that do not meet the criteria of both of the nested statements are not counted towards the rate limit and are not affected by this rule.\\n\\nYou cannot nest a `RateBasedStatement` inside another statement, for example inside a `NotStatement` or `OrStatement` . You can define a `RateBasedStatement` inside a web ACL and inside a rule group.","properties":{"AggregateKeyType":"Setting that indicates how to aggregate the request counts. The options are the following:\\n\\n- `IP` - Aggregate the request counts on the IP address from the web request origin.\\n- `FORWARDED_IP` - Aggregate the request counts on the first IP address in an HTTP header. If you use this, configure the `ForwardedIPConfig` , to specify the header to use.\\n\\n> You can only use the `IP` and `FORWARDED_IP` key types.","ForwardedIPConfig":"The configuration for inspecting IP addresses in an HTTP header that you specify, instead of using the IP address that\'s reported by the web request origin. Commonly, this is the X-Forwarded-For (XFF) header, but you can specify any header name.\\n\\n> If the specified header isn\'t present in the request, AWS WAF doesn\'t apply the rule to the web request at all. \\n\\nThis is required if you specify a forwarded IP in the rule\'s aggregate key settings.","Limit":"The limit on requests per 5-minute period for a single originating IP address. If the statement includes a `ScopeDownStatement` , this limit is applied only to the requests that match the statement.","ScopeDownStatement":"An optional nested statement that narrows the scope of the web requests that are evaluated by the rate-based statement. Requests are only tracked by the rate-based statement if they match the scope-down statement. You can use any nestable `Statement` in the scope-down statement, and you can nest statements at any level, the same as you can for a rule statement."}},"AWS::WAFv2::WebACL.RegexMatchStatement":{"attributes":{},"description":"A rule statement used to search web request components for a match against a single regular expression.","properties":{"FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","RegexString":"The string representing the regular expression.","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::WebACL.RegexPatternSetReferenceStatement":{"attributes":{},"description":"A rule statement used to search web request components for matches with regular expressions. To use this, create a `RegexPatternSet` that specifies the expressions that you want to detect, then use that set in this statement. A web request matches the pattern set rule statement if the request component matches any of the patterns in the set.\\n\\nEach regex pattern set rule statement references a regex pattern set. You create and maintain the set independent of your rules. This allows you to use the single set in multiple rules. When you update the referenced set, AWS WAF automatically updates all rules that reference it.","properties":{"Arn":"The Amazon Resource Name (ARN) of the `RegexPatternSet` that this statement references.","FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::WebACL.RequestBodyAssociatedResourceTypeConfig":{"attributes":{},"description":"Customizes the maximum size of the request body that your protected CloudFront distributions forward to AWS WAF for inspection. The default size is 16 KB (16,384 kilobytes).\\n\\n> You are charged additional fees when your protected resources forward body sizes that are larger than the default. For more information, see [AWS WAF Pricing](https://docs.aws.amazon.com/waf/pricing/) . \\n\\nThis is used in the `AssociationConfig` of the web ACL.","properties":{"DefaultSizeInspectionLimit":"Specifies the maximum size of the web request body component that an associated CloudFront distribution should send to AWS WAF for inspection. This applies to statements in the web ACL that inspect the body or JSON body.\\n\\nDefault: `16 KB (16,384 kilobytes)`"}},"AWS::WAFv2::WebACL.RequestInspection":{"attributes":{},"description":"The criteria for inspecting login requests, used by the ATP rule group to validate credentials usage.\\n\\nThis is part of the `AWSManagedRulesATPRuleSet` configuration in `ManagedRuleGroupConfig` .\\n\\nIn these settings, you specify how your application accepts login attempts by providing the request payload type and the names of the fields within the request body where the username and password are provided.","properties":{"PasswordField":"The name of the field in the request payload that contains your customer\'s password.\\n\\nHow you specify this depends on the request inspection payload type.\\n\\n- For JSON payloads, specify the field name in JSON pointer syntax. For information about the JSON Pointer syntax, see the Internet Engineering Task Force (IETF) documentation [JavaScript Object Notation (JSON) Pointer](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc6901) .\\n\\nFor example, for the JSON payload `{ \\"form\\": { \\"password\\": \\"THE_PASSWORD\\" } }` , the password field specification is `/form/password` .\\n- For form encoded payload types, use the HTML form names.\\n\\nFor example, for an HTML form with the input element named `password1` , the password field specification is `password1` .","PayloadType":"The payload type for your login endpoint, either JSON or form encoded.","UsernameField":"The name of the field in the request payload that contains your customer\'s username.\\n\\nHow you specify this depends on the request inspection payload type.\\n\\n- For JSON payloads, specify the field name in JSON pointer syntax. For information about the JSON Pointer syntax, see the Internet Engineering Task Force (IETF) documentation [JavaScript Object Notation (JSON) Pointer](https://docs.aws.amazon.com/https://tools.ietf.org/html/rfc6901) .\\n\\nFor example, for the JSON payload `{ \\"form\\": { \\"username\\": \\"THE_USERNAME\\" } }` , the username field specification is `/form/username` .\\n- For form encoded payload types, use the HTML form names.\\n\\nFor example, for an HTML form with the input element named `username1` , the username field specification is `username1`"}},"AWS::WAFv2::WebACL.ResponseInspection":{"attributes":{},"description":"The criteria for inspecting responses to login requests, used by the ATP rule group to track login failure rates.\\n\\nThe ATP rule group evaluates the responses that your protected resources send back to client login attempts, keeping count of successful and failed attempts from each IP address and client session. Using this information, the rule group labels and mitigates requests from client sessions and IP addresses that submit too many failed login attempts in a short amount of time.\\n\\n> Response inspection is available only in web ACLs that protect Amazon CloudFront distributions. \\n\\nThis is part of the `AWSManagedRulesATPRuleSet` configuration in `ManagedRuleGroupConfig` .\\n\\nEnable login response inspection by configuring exactly one component of the response to inspect. You can\'t configure more than one. If you don\'t configure any of the response inspection options, response inspection is disabled.","properties":{"BodyContains":"Configures inspection of the response body. AWS WAF can inspect the first 65,536 bytes (64 KB) of the response body.","Header":"Configures inspection of the response header.","Json":"Configures inspection of the response JSON. AWS WAF can inspect the first 65,536 bytes (64 KB) of the response JSON.","StatusCode":"Configures inspection of the response status code."}},"AWS::WAFv2::WebACL.ResponseInspectionBodyContains":{"attributes":{},"description":"Configures inspection of the response body. AWS WAF can inspect the first 65,536 bytes (64 KB) of the response body. This is part of the `ResponseInspection` configuration for `AWSManagedRulesATPRuleSet` .\\n\\n> Response inspection is available only in web ACLs that protect Amazon CloudFront distributions.","properties":{"FailureStrings":"Strings in the body of the response that indicate a failed login attempt. To be counted as a failed login, the string can be anywhere in the body and must be an exact match, including case. Each string must be unique among the success and failure strings.\\n\\nJSON example: `\\"FailureStrings\\": [ \\"Login failed\\" ]`","SuccessStrings":"Strings in the body of the response that indicate a successful login attempt. To be counted as a successful login, the string can be anywhere in the body and must be an exact match, including case. Each string must be unique among the success and failure strings.\\n\\nJSON example: `\\"SuccessStrings\\": [ \\"Login successful\\", \\"Welcome to our site!\\" ]`"}},"AWS::WAFv2::WebACL.ResponseInspectionHeader":{"attributes":{},"description":"Configures inspection of the response header. This is part of the `ResponseInspection` configuration for `AWSManagedRulesATPRuleSet` .\\n\\n> Response inspection is available only in web ACLs that protect Amazon CloudFront distributions.","properties":{"FailureValues":"Values in the response header with the specified name that indicate a failed login attempt. To be counted as a failed login, the value must be an exact match, including case. Each value must be unique among the success and failure values.\\n\\nJSON example: `\\"FailureValues\\": [ \\"LoginFailed\\", \\"Failed login\\" ]`","Name":"The name of the header to match against. The name must be an exact match, including case.\\n\\nJSON example: `\\"Name\\": [ \\"LoginResult\\" ]`","SuccessValues":"Values in the response header with the specified name that indicate a successful login attempt. To be counted as a successful login, the value must be an exact match, including case. Each value must be unique among the success and failure values.\\n\\nJSON example: `\\"SuccessValues\\": [ \\"LoginPassed\\", \\"Successful login\\" ]`"}},"AWS::WAFv2::WebACL.ResponseInspectionJson":{"attributes":{},"description":"Configures inspection of the response JSON. AWS WAF can inspect the first 65,536 bytes (64 KB) of the response JSON. This is part of the `ResponseInspection` configuration for `AWSManagedRulesATPRuleSet` .\\n\\n> Response inspection is available only in web ACLs that protect Amazon CloudFront distributions.","properties":{"FailureValues":"Values for the specified identifier in the response JSON that indicate a failed login attempt. To be counted as a failed login, the value must be an exact match, including case. Each value must be unique among the success and failure values.\\n\\nJSON example: `\\"FailureValues\\": [ \\"False\\", \\"Failed\\" ]`","Identifier":"The identifier for the value to match against in the JSON. The identifier must be an exact match, including case.\\n\\nJSON example: `\\"Identifier\\": [ \\"/login/success\\" ]`","SuccessValues":"Values for the specified identifier in the response JSON that indicate a successful login attempt. To be counted as a successful login, the value must be an exact match, including case. Each value must be unique among the success and failure values.\\n\\nJSON example: `\\"SuccessValues\\": [ \\"True\\", \\"Succeeded\\" ]`"}},"AWS::WAFv2::WebACL.ResponseInspectionStatusCode":{"attributes":{},"description":"Configures inspection of the response status code. This is part of the `ResponseInspection` configuration for `AWSManagedRulesATPRuleSet` .\\n\\n> Response inspection is available only in web ACLs that protect Amazon CloudFront distributions.","properties":{"FailureCodes":"Status codes in the response that indicate a failed login attempt. To be counted as a failed login, the response status code must match one of these. Each code must be unique among the success and failure status codes.\\n\\nJSON example: `\\"FailureCodes\\": [ 400, 404 ]`","SuccessCodes":"Status codes in the response that indicate a successful login attempt. To be counted as a successful login, the response status code must match one of these. Each code must be unique among the success and failure status codes.\\n\\nJSON example: `\\"SuccessCodes\\": [ 200, 201 ]`"}},"AWS::WAFv2::WebACL.Rule":{"attributes":{},"description":"A single rule, which you can use in a `WebACL` or `RuleGroup` to identify web requests that you want to allow, block, or count. Each rule includes one top-level `Statement` that AWS WAF uses to identify matching web requests, and parameters that govern how AWS WAF handles them.","properties":{"Action":"The action that AWS WAF should take on a web request when it matches the rule\'s statement. Settings at the web ACL level can override the rule action setting.\\n\\nThis is used only for rules whose statements don\'t reference a rule group. Rule statements that reference a rule group are `RuleGroupReferenceStatement` and `ManagedRuleGroupStatement` .\\n\\nYou must set either this `Action` setting or the rule\'s `OverrideAction` , but not both:\\n\\n- If the rule statement doesn\'t reference a rule group, you must set this rule action setting and you must not set the rule\'s override action setting.\\n- If the rule statement references a rule group, you must not set this action setting, because the actions are already set on the rules inside the rule group. You must set the rule\'s override action setting to indicate specifically whether to override the actions that are set on the rules in the rule group.","CaptchaConfig":"Specifies how AWS WAF should handle `CAPTCHA` evaluations. If you don\'t specify this, AWS WAF uses the `CAPTCHA` configuration that\'s defined for the web ACL.","ChallengeConfig":"Specifies how AWS WAF should handle `Challenge` evaluations. If you don\'t specify this, AWS WAF uses the challenge configuration that\'s defined for the web ACL.","Name":"The name of the rule. You can\'t change the name of a `Rule` after you create it.","OverrideAction":"The override action to apply to the rules in a rule group, instead of the individual rule action settings. This is used only for rules whose statements reference a rule group. Rule statements that reference a rule group are `RuleGroupReferenceStatement` and `ManagedRuleGroupStatement` .\\n\\nSet the override action to none to leave the rule group rule actions in effect. Set it to count to only count matches, regardless of the rule action settings.\\n\\nYou must set either this `OverrideAction` setting or the `Action` setting, but not both:\\n\\n- If the rule statement references a rule group, you must set this override action setting and you must not set the rule\'s action setting.\\n- If the rule statement doesn\'t reference a rule group, you must set the rule action setting and you must not set the rule\'s override action setting.","Priority":"If you define more than one `Rule` in a `WebACL` , AWS WAF evaluates each request against the `Rules` in order based on the value of `Priority` . AWS WAF processes rules with lower priority first. The priorities don\'t need to be consecutive, but they must all be different.","RuleLabels":"Labels to apply to web requests that match the rule match statement. AWS WAF applies fully qualified labels to matching web requests. A fully qualified label is the concatenation of a label namespace and a rule label. The rule\'s rule group or web ACL defines the label namespace.\\n\\nRules that run after this rule in the web ACL can match against these labels using a `LabelMatchStatement` .\\n\\nFor each label, provide a case-sensitive string containing optional namespaces and a label name, according to the following guidelines:\\n\\n- Separate each component of the label with a colon.\\n- Each namespace or name can have up to 128 characters.\\n- You can specify up to 5 namespaces in a label.\\n- Don\'t use the following reserved words in your label specification: `aws` , `waf` , `managed` , `rulegroup` , `webacl` , `regexpatternset` , or `ipset` .\\n\\nFor example, `myLabelName` or `nameSpace1:nameSpace2:myLabelName` .","Statement":"The AWS WAF processing statement for the rule, for example `ByteMatchStatement` or `SizeConstraintStatement` .","VisibilityConfig":"Defines and enables Amazon CloudWatch metrics and web request sample collection."}},"AWS::WAFv2::WebACL.RuleAction":{"attributes":{},"description":"The action that AWS WAF should take on a web request when it matches a rule\'s statement. Settings at the web ACL level can override the rule action setting.","properties":{"Allow":"Instructs AWS WAF to allow the web request.","Block":"Instructs AWS WAF to block the web request.","Captcha":"Specifies that AWS WAF should run a `CAPTCHA` check against the request:\\n\\n- If the request includes a valid, unexpired `CAPTCHA` token, AWS WAF allows the web request inspection to proceed to the next rule, similar to a `CountAction` .\\n- If the request doesn\'t include a valid, unexpired `CAPTCHA` token, AWS WAF discontinues the web ACL evaluation of the request and blocks it from going to its intended destination.\\n\\nAWS WAF generates a response that it sends back to the client, which includes the following:\\n\\n- The header `x-amzn-waf-action` with a value of `captcha` .\\n- The HTTP status code `405 Method Not Allowed` .\\n- If the request contains an `Accept` header with a value of `text/html` , the response includes a `CAPTCHA` challenge.\\n\\nYou can configure the expiration time in the `CaptchaConfig` `ImmunityTimeProperty` setting at the rule and web ACL level. The rule setting overrides the web ACL setting.\\n\\nThis action option is available for rules. It isn\'t available for web ACL default actions.","Challenge":"Instructs AWS WAF to run a `Challenge` check against the web request.","Count":"Instructs AWS WAF to count the web request and then continue evaluating the request using the remaining rules in the web ACL."}},"AWS::WAFv2::WebACL.RuleActionOverride":{"attributes":{},"description":"Action setting to use in the place of a rule action that is configured inside the rule group. You specify one override for each rule whose action you want to change.\\n\\nYou can use overrides for testing, for example you can override all of rule actions to `Count` and then monitor the resulting count metrics to understand how the rule group would handle your web traffic. You can also permanently override some or all actions, to modify how the rule group manages your web traffic.","properties":{"ActionToUse":"The override action to use, in place of the configured action of the rule in the rule group.","Name":"The name of the rule to override."}},"AWS::WAFv2::WebACL.RuleGroupReferenceStatement":{"attributes":{},"description":"A rule statement used to run the rules that are defined in a `RuleGroup` . To use this, create a rule group with your rules, then provide the ARN of the rule group in this statement.\\n\\nYou cannot nest a `RuleGroupReferenceStatement` , for example for use inside a `NotStatement` or `OrStatement` . You can only use a rule group reference statement at the top level inside a web ACL.","properties":{"Arn":"The Amazon Resource Name (ARN) of the entity.","ExcludedRules":"Rules in the referenced rule group whose actions are set to `Count` .\\n\\n> Instead of this option, use `RuleActionOverrides` . It accepts any valid action setting, including `Count` .","RuleActionOverrides":"Action settings to use in the place of the rule actions that are configured inside the rule group. You specify one override for each rule whose action you want to change.\\n\\nYou can use overrides for testing, for example you can override all of rule actions to `Count` and then monitor the resulting count metrics to understand how the rule group would handle your web traffic. You can also permanently override some or all actions, to modify how the rule group manages your web traffic."}},"AWS::WAFv2::WebACL.SingleHeader":{"attributes":{},"description":"Inspect one of the headers in the web request, identified by name, for example, `User-Agent` or `Referer` . The name isn\'t case sensitive.\\n\\nYou can filter and inspect all headers with the `FieldToMatch` setting `Headers` .\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nExample JSON: `\\"SingleHeader\\": { \\"Name\\": \\"haystack\\" }`","properties":{"Name":"The name of the query header to inspect."}},"AWS::WAFv2::WebACL.SingleQueryArgument":{"attributes":{},"description":"Inspect one query argument in the web request, identified by name, for example *UserName* or *SalesRegion* . The name isn\'t case sensitive.\\n\\nThis is used to indicate the web request component to inspect, in the `FieldToMatch` specification.\\n\\nExample JSON: `\\"SingleQueryArgument\\": { \\"Name\\": \\"myArgument\\" }`","properties":{"Name":"The name of the query argument to inspect."}},"AWS::WAFv2::WebACL.SizeConstraintStatement":{"attributes":{},"description":"A rule statement that compares a number of bytes against the size of a request component, using a comparison operator, such as greater than (>) or less than (<). For example, you can use a size constraint statement to look for query strings that are longer than 100 bytes.\\n\\nIf you configure AWS WAF to inspect the request body, AWS WAF inspects only the number of bytes of the body up to the limit for the web ACL. By default, for regional web ACLs, this limit is 8 KB (8,192 kilobytes) and for CloudFront web ACLs, this limit is 16 KB (16,384 kilobytes). For CloudFront web ACLs, you can increase the limit in the web ACL `AssociationConfig` , for additional fees. If you know that the request body for your web requests should never exceed the inspection limit, you could use a size constraint statement to block requests that have a larger request body size.\\n\\nIf you choose URI for the value of Part of the request to filter on, the slash (/) in the URI counts as one character. For example, the URI `/logo.jpg` is nine characters long.","properties":{"ComparisonOperator":"The operator to use to compare the request part to the size setting.","FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","Size":"The size, in byte, to compare to the request part, after any transformations.","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::WebACL.SqliMatchStatement":{"attributes":{},"description":"A rule statement that inspects for malicious SQL code. Attackers insert malicious SQL code into web requests to do things like modify your database or extract data from it.","properties":{"FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","SensitivityLevel":"The sensitivity that you want AWS WAF to use to inspect for SQL injection attacks.\\n\\n`HIGH` detects more attacks, but might generate more false positives, especially if your web requests frequently contain unusual strings. For information about identifying and mitigating false positives, see [Testing and tuning](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-testing.html) in the *AWS WAF Developer Guide* .\\n\\n`LOW` is generally a better choice for resources that already have other protections against SQL injection attacks or that have a low tolerance for false positives.\\n\\nDefault: `LOW`","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::WebACL.Statement":{"attributes":{},"description":"The processing guidance for a rule, used by AWS WAF to determine whether a web request matches the rule.","properties":{"AndStatement":"A logical rule statement used to combine other rule statements with AND logic. You provide more than one `Statement` within the `AndStatement` .","ByteMatchStatement":"A rule statement that defines a string match search for AWS WAF to apply to web requests. The byte match statement provides the bytes to search for, the location in requests that you want AWS WAF to search, and other settings. The bytes to search for are typically a string that corresponds with ASCII characters. In the AWS WAF console and the developer guide, this is called a string match statement.","GeoMatchStatement":"A rule statement that labels web requests by country and region and that matches against web requests based on country code. A geo match rule labels every request that it inspects regardless of whether it finds a match.\\n\\n- To manage requests only by country, you can use this statement by itself and specify the countries that you want to match against in the `CountryCodes` array.\\n- Otherwise, configure your geo match rule with Count action so that it only labels requests. Then, add one or more label match rules to run after the geo match rule and configure them to match against the geographic labels and handle the requests as needed.\\n\\nAWS WAF labels requests using the alpha-2 country and region codes from the International Organization for Standardization (ISO) 3166 standard. AWS WAF determines the codes using either the IP address in the web request origin or, if you specify it, the address in the geo match `ForwardedIPConfig` .\\n\\nIf you use the web request origin, the label formats are `awswaf:clientip:geo:region:-` and `awswaf:clientip:geo:country:` .\\n\\nIf you use a forwarded IP address, the label formats are `awswaf:forwardedip:geo:region:-` and `awswaf:forwardedip:geo:country:` .\\n\\nFor additional details, see [Geographic match rule statement](https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-type-geo-match.html) in the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) .","IPSetReferenceStatement":"A rule statement used to detect web requests coming from particular IP addresses or address ranges. To use this, create an `IPSet` that specifies the addresses you want to detect, then use the ARN of that set in this statement.\\n\\nEach IP set rule statement references an IP set. You create and maintain the set independent of your rules. This allows you to use the single set in multiple rules. When you update the referenced set, AWS WAF automatically updates all rules that reference it.","LabelMatchStatement":"A rule statement to match against labels that have been added to the web request by rules that have already run in the web ACL.\\n\\nThe label match statement provides the label or namespace string to search for. The label string can represent a part or all of the fully qualified label name that had been added to the web request. Fully qualified labels have a prefix, optional namespaces, and label name. The prefix identifies the rule group or web ACL context of the rule that added the label. If you do not provide the fully qualified name in your label match string, AWS WAF performs the search for labels that were added in the same context as the label match statement.","ManagedRuleGroupStatement":"A rule statement used to run the rules that are defined in a managed rule group. To use this, provide the vendor name and the name of the rule group in this statement.\\n\\nYou cannot nest a `ManagedRuleGroupStatement` , for example for use inside a `NotStatement` or `OrStatement` . It can only be referenced as a top-level statement within a rule.","NotStatement":"A logical rule statement used to negate the results of another rule statement. You provide one `Statement` within the `NotStatement` .","OrStatement":"A logical rule statement used to combine other rule statements with OR logic. You provide more than one `Statement` within the `OrStatement` .","RateBasedStatement":"A rate-based rule tracks the rate of requests for each originating IP address, and triggers the rule action when the rate exceeds a limit that you specify on the number of requests in any 5-minute time span. You can use this to put a temporary block on requests from an IP address that is sending excessive requests.\\n\\nAWS WAF tracks and manages web requests separately for each instance of a rate-based rule that you use. For example, if you provide the same rate-based rule settings in two web ACLs, each of the two rule statements represents a separate instance of the rate-based rule and gets its own tracking and management by AWS WAF . If you define a rate-based rule inside a rule group, and then use that rule group in multiple places, each use creates a separate instance of the rate-based rule that gets its own tracking and management by AWS WAF .\\n\\nWhen the rule action triggers, AWS WAF blocks additional requests from the IP address until the request rate falls below the limit.\\n\\nYou can optionally nest another statement inside the rate-based statement, to narrow the scope of the rule so that it only counts requests that match the nested statement. For example, based on recent requests that you have seen from an attacker, you might create a rate-based rule with a nested AND rule statement that contains the following nested statements:\\n\\n- An IP match statement with an IP set that specifies the address 192.0.2.44.\\n- A string match statement that searches in the User-Agent header for the string BadBot.\\n\\nIn this rate-based rule, you also define a rate limit. For this example, the rate limit is 1,000. Requests that meet the criteria of both of the nested statements are counted. If the count exceeds 1,000 requests per five minutes, the rule action triggers. Requests that do not meet the criteria of both of the nested statements are not counted towards the rate limit and are not affected by this rule.\\n\\nYou cannot nest a `RateBasedStatement` inside another statement, for example inside a `NotStatement` or `OrStatement` . You can define a `RateBasedStatement` inside a web ACL and inside a rule group.","RegexMatchStatement":"A rule statement used to search web request components for a match against a single regular expression.","RegexPatternSetReferenceStatement":"A rule statement used to search web request components for matches with regular expressions. To use this, create a `RegexPatternSet` that specifies the expressions that you want to detect, then use the ARN of that set in this statement. A web request matches the pattern set rule statement if the request component matches any of the patterns in the set.\\n\\nEach regex pattern set rule statement references a regex pattern set. You create and maintain the set independent of your rules. This allows you to use the single set in multiple rules. When you update the referenced set, AWS WAF automatically updates all rules that reference it.","RuleGroupReferenceStatement":"A rule statement used to run the rules that are defined in a `RuleGroup` . To use this, create a rule group with your rules, then provide the ARN of the rule group in this statement.\\n\\nYou cannot nest a `RuleGroupReferenceStatement` , for example for use inside a `NotStatement` or `OrStatement` . You can only use a rule group reference statement at the top level inside a web ACL.","SizeConstraintStatement":"A rule statement that compares a number of bytes against the size of a request component, using a comparison operator, such as greater than (>) or less than (<). For example, you can use a size constraint statement to look for query strings that are longer than 100 bytes.\\n\\nIf you configure AWS WAF to inspect the request body, AWS WAF inspects only the number of bytes of the body up to the limit for the web ACL. By default, for regional web ACLs, this limit is 8 KB (8,192 kilobytes) and for CloudFront web ACLs, this limit is 16 KB (16,384 kilobytes). For CloudFront web ACLs, you can increase the limit in the web ACL `AssociationConfig` , for additional fees. If you know that the request body for your web requests should never exceed the inspection limit, you could use a size constraint statement to block requests that have a larger request body size.\\n\\nIf you choose URI for the value of Part of the request to filter on, the slash (/) in the URI counts as one character. For example, the URI `/logo.jpg` is nine characters long.","SqliMatchStatement":"A rule statement that inspects for malicious SQL code. Attackers insert malicious SQL code into web requests to do things like modify your database or extract data from it.","XssMatchStatement":"A rule statement that inspects for cross-site scripting (XSS) attacks. In XSS attacks, the attacker uses vulnerabilities in a benign website as a vehicle to inject malicious client-site scripts into other legitimate web browsers."}},"AWS::WAFv2::WebACL.TextTransformation":{"attributes":{},"description":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection.","properties":{"Priority":"Sets the relative processing order for multiple transformations. AWS WAF processes all transformations, from lowest priority to highest, before inspecting the transformed content. The priorities don\'t need to be consecutive, but they must all be different.","Type":"You can specify the following transformation types:\\n\\n*BASE64_DECODE* - Decode a `Base64` -encoded string.\\n\\n*BASE64_DECODE_EXT* - Decode a `Base64` -encoded string, but use a forgiving implementation that ignores characters that aren\'t valid.\\n\\n*CMD_LINE* - Command-line transformations. These are helpful in reducing effectiveness of attackers who inject an operating system command-line command and use unusual formatting to disguise some or all of the command.\\n\\n- Delete the following characters: `\\\\ \\" \' ^`\\n- Delete spaces before the following characters: `/ (`\\n- Replace the following characters with a space: `, ;`\\n- Replace multiple spaces with one space\\n- Convert uppercase letters (A-Z) to lowercase (a-z)\\n\\n*COMPRESS_WHITE_SPACE* - Replace these characters with a space character (decimal 32):\\n\\n- `\\\\f` , formfeed, decimal 12\\n- `\\\\t` , tab, decimal 9\\n- `\\\\n` , newline, decimal 10\\n- `\\\\r` , carriage return, decimal 13\\n- `\\\\v` , vertical tab, decimal 11\\n- Non-breaking space, decimal 160\\n\\n`COMPRESS_WHITE_SPACE` also replaces multiple spaces with one space.\\n\\n*CSS_DECODE* - Decode characters that were encoded using CSS 2.x escape rules `syndata.html#characters` . This function uses up to two bytes in the decoding process, so it can help to uncover ASCII characters that were encoded using CSS encoding that wouldn’t typically be encoded. It\'s also useful in countering evasion, which is a combination of a backslash and non-hexadecimal characters. For example, `ja\\\\vascript` for javascript.\\n\\n*ESCAPE_SEQ_DECODE* - Decode the following ANSI C escape sequences: `\\\\a` , `\\\\b` , `\\\\f` , `\\\\n` , `\\\\r` , `\\\\t` , `\\\\v` , `\\\\\\\\` , `\\\\?` , `\\\\\'` , `\\\\\\"` , `\\\\xHH` (hexadecimal), `\\\\0OOO` (octal). Encodings that aren\'t valid remain in the output.\\n\\n*HEX_DECODE* - Decode a string of hexadecimal characters into a binary.\\n\\n*HTML_ENTITY_DECODE* - Replace HTML-encoded characters with unencoded characters. `HTML_ENTITY_DECODE` performs these operations:\\n\\n- Replaces `(ampersand)quot;` with `\\"`\\n- Replaces `(ampersand)nbsp;` with a non-breaking space, decimal 160\\n- Replaces `(ampersand)lt;` with a \\"less than\\" symbol\\n- Replaces `(ampersand)gt;` with `>`\\n- Replaces characters that are represented in hexadecimal format, `(ampersand)#xhhhh;` , with the corresponding characters\\n- Replaces characters that are represented in decimal format, `(ampersand)#nnnn;` , with the corresponding characters\\n\\n*JS_DECODE* - Decode JavaScript escape sequences. If a `\\\\` `u` `HHHH` code is in the full-width ASCII code range of `FF01-FF5E` , then the higher byte is used to detect and adjust the lower byte. If not, only the lower byte is used and the higher byte is zeroed, causing a possible loss of information.\\n\\n*LOWERCASE* - Convert uppercase letters (A-Z) to lowercase (a-z).\\n\\n*MD5* - Calculate an MD5 hash from the data in the input. The computed hash is in a raw binary form.\\n\\n*NONE* - Specify `NONE` if you don\'t want any text transformations.\\n\\n*NORMALIZE_PATH* - Remove multiple slashes, directory self-references, and directory back-references that are not at the beginning of the input from an input string.\\n\\n*NORMALIZE_PATH_WIN* - This is the same as `NORMALIZE_PATH` , but first converts backslash characters to forward slashes.\\n\\n*REMOVE_NULLS* - Remove all `NULL` bytes from the input.\\n\\n*REPLACE_COMMENTS* - Replace each occurrence of a C-style comment ( `/* ... */` ) with a single space. Multiple consecutive occurrences are not compressed. Unterminated comments are also replaced with a space (ASCII 0x20). However, a standalone termination of a comment ( `*/` ) is not acted upon.\\n\\n*REPLACE_NULLS* - Replace NULL bytes in the input with space characters (ASCII `0x20` ).\\n\\n*SQL_HEX_DECODE* - Decode SQL hex data. Example ( `0x414243` ) will be decoded to ( `ABC` ).\\n\\n*URL_DECODE* - Decode a URL-encoded value.\\n\\n*URL_DECODE_UNI* - Like `URL_DECODE` , but with support for Microsoft-specific `%u` encoding. If the code is in the full-width ASCII code range of `FF01-FF5E` , the higher byte is used to detect and adjust the lower byte. Otherwise, only the lower byte is used and the higher byte is zeroed.\\n\\n*UTF8_TO_UNICODE* - Convert all UTF-8 character sequences to Unicode. This helps input normalization, and minimizing false-positives and false-negatives for non-English languages."}},"AWS::WAFv2::WebACL.VisibilityConfig":{"attributes":{},"description":"Defines and enables Amazon CloudWatch metrics and web request sample collection.","properties":{"CloudWatchMetricsEnabled":"Indicates whether the associated resource sends metrics to Amazon CloudWatch. For the list of available metrics, see [AWS WAF Metrics](https://docs.aws.amazon.com/waf/latest/developerguide/monitoring-cloudwatch.html#waf-metrics) in the *AWS WAF Developer Guide* .\\n\\nFor web ACLs, the metrics are for web requests that have the web ACL default action applied. AWS WAF applies the default action to web requests that pass the inspection of all rules in the web ACL without being either allowed or blocked. For more information,\\nsee [The web ACL default action](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-default-action.html) in the *AWS WAF Developer Guide* .","MetricName":"A name of the Amazon CloudWatch metric dimension. The name can contain only the characters: A-Z, a-z, 0-9, - (hyphen), and _ (underscore). The name can be from one to 128 characters long. It can\'t contain whitespace or metric names that are reserved for AWS WAF , for example `All` and `Default_Action` .","SampledRequestsEnabled":"Indicates whether AWS WAF should store a sampling of the web requests that match the rules. You can view the sampled requests through the AWS WAF console."}},"AWS::WAFv2::WebACL.XssMatchStatement":{"attributes":{},"description":"A rule statement that inspects for cross-site scripting (XSS) attacks. In XSS attacks, the attacker uses vulnerabilities in a benign website as a vehicle to inject malicious client-site scripts into other legitimate web browsers.","properties":{"FieldToMatch":"The part of the web request that you want AWS WAF to inspect.","TextTransformations":"Text transformations eliminate some of the unusual formatting that attackers use in web requests in an effort to bypass detection. If you specify one or more transformations in a rule statement, AWS WAF performs all transformations on the content of the request component identified by `FieldToMatch` , starting from the lowest priority setting, before inspecting the content for a match."}},"AWS::WAFv2::WebACLAssociation":{"attributes":{"Ref":"The `Ref` for the resource, containing the resource name, physical ID, and scope, formatted as follows: `name|id|scope` .\\n\\nFor example: `my-webacl-name|1234a1a-a1b1-12a1-abcd-a123b123456|REGIONAL` ."},"description":"> This is the latest version of *AWS WAF* , named AWS WAF V2, released in November, 2019. For information, including how to migrate your AWS WAF resources from the prior release, see the [AWS WAF Developer Guide](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) . \\n\\nUse a web ACL association to define an association between a web ACL and a regional application resource, to protect the resource. A regional application can be an Application Load Balancer (ALB), an Amazon API Gateway REST API, an AWS AppSync GraphQL API, an Amazon Cognito user pool, an AWS App Runner service, or an AWS Verified Access instance.\\n\\nFor Amazon CloudFront , don\'t use this resource. Instead, use your CloudFront distribution configuration. To associate a web ACL with a distribution, provide the Amazon Resource Name (ARN) of the `WebACL` to your CloudFront distribution configuration. To disassociate a web ACL, provide an empty ARN. For information, see [AWS::CloudFront::Distribution](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-distribution.html) .\\n\\nWhen you create a web ACL or make changes to a web ACL or web ACL components, like rules and rule groups, AWS WAF propagates the changes everywhere that the web ACL and its components are stored and used. Your changes are applied within seconds, but there might be a brief period of inconsistency when the changes have arrived in some places and not in others. So, for example, if you change a rule action setting, the action might be the old action in one area and the new action in another area. Or if you add an IP address to an IP set used in a blocking rule, the new address might briefly be blocked in one area while still allowed in another. This temporary inconsistency can occur when you first associate a web ACL with an AWS resource and when you change a web ACL that is already associated with a resource. Generally, any inconsistencies of this type last only a few seconds.","properties":{"ResourceArn":"The Amazon Resource Name (ARN) of the resource to associate with the web ACL.\\n\\nThe ARN must be in one of the following formats:\\n\\n- For an Application Load Balancer: `arn: *partition* :elasticloadbalancing: *region* : *account-id* :loadbalancer/app/ *load-balancer-name* / *load-balancer-id*`\\n- For an Amazon API Gateway REST API: `arn: *partition* :apigateway: *region* ::/restapis/ *api-id* /stages/ *stage-name*`\\n- For an AWS AppSync GraphQL API: `arn: *partition* :appsync: *region* : *account-id* :apis/ *GraphQLApiId*`\\n- For an Amazon Cognito user pool: `arn: *partition* :cognito-idp: *region* : *account-id* :userpool/ *user-pool-id*`\\n- For an AWS App Runner service: `arn: *partition* :apprunner: *region* : *account-id* :service/ *apprunner-service-name* / *apprunner-service-id*`\\n- For an AWS Verified Access instance: `arn: *partition* :ec2: *region* : *account-id* :verified-access-instance/ *instance-id*`","WebACLArn":"The Amazon Resource Name (ARN) of the web ACL that you want to associate with the resource."}},"AWS::Wisdom::Assistant":{"attributes":{"AssistantArn":"The Amazon Resource Name (ARN) of the assistant.","AssistantId":"The ID of the Wisdom assistant.","Ref":"`Ref` returns the assistant ID."},"description":"Specifies an Amazon Connect Wisdom assistant.","properties":{"Description":"The description of the assistant.","Name":"The name of the assistant.","ServerSideEncryptionConfiguration":"The KMS key used for encryption.","Tags":"The tags used to organize, track, or control access for this resource.","Type":"The type of assistant."}},"AWS::Wisdom::Assistant.ServerSideEncryptionConfiguration":{"attributes":{},"description":"The KMS key used for encryption.","properties":{"KmsKeyId":"The KMS key . For information about valid ID values, see [Key identifiers (KeyId)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id) in the *AWS Key Management Service Developer Guide* ."}},"AWS::Wisdom::AssistantAssociation":{"attributes":{"AssistantArn":"The Amazon Resource Name (ARN) of the Wisdom assistant.","AssistantAssociationArn":"The Amazon Resource Name (ARN) of the assistant association.","AssistantAssociationId":"The ID of the association.","Ref":"`Ref` returns the association ID."},"description":"Specifies an association between an Amazon Connect Wisdom assistant and another resource. Currently, the only supported association is with a knowledge base. An assistant can have only a single association.","properties":{"AssistantId":"The identifier of the Wisdom assistant.","Association":"The identifier of the associated resource.","AssociationType":"The type of association.","Tags":"The tags used to organize, track, or control access for this resource."}},"AWS::Wisdom::AssistantAssociation.AssociationData":{"attributes":{},"description":"A union type that currently has a single argument, which is the knowledge base ID.","properties":{"KnowledgeBaseId":"The identifier of the knowledge base."}},"AWS::Wisdom::KnowledgeBase":{"attributes":{"KnowledgeBaseArn":"The Amazon Resource Name (ARN) of the knowledge base.","KnowledgeBaseId":"The ID of the knowledge base.","Ref":"`Ref` returns the knowledge base ID."},"description":"Specifies a knowledge base.","properties":{"Description":"The description.","KnowledgeBaseType":"The type of knowledge base. Only CUSTOM knowledge bases allow you to upload your own content. EXTERNAL knowledge bases support integrations with third-party systems whose content is synchronized automatically.","Name":"The name of the knowledge base.","RenderingConfiguration":"Information about how to render the content.","ServerSideEncryptionConfiguration":"The KMS key used for encryption.","SourceConfiguration":"The source of the knowledge base content. Only set this argument for EXTERNAL knowledge bases.","Tags":"The tags used to organize, track, or control access for this resource."}},"AWS::Wisdom::KnowledgeBase.AppIntegrationsConfiguration":{"attributes":{},"description":"Configuration information for Amazon AppIntegrations to automatically ingest content.","properties":{"AppIntegrationArn":"The Amazon Resource Name (ARN) of the AppIntegrations DataIntegration to use for ingesting content.\\n\\n- For [Salesforce](https://docs.aws.amazon.com/https://developer.salesforce.com/docs/atlas.en-us.knowledge_dev.meta/knowledge_dev/sforce_api_objects_knowledge__kav.htm) , your AppIntegrations DataIntegration must have an ObjectConfiguration if objectFields is not provided, including at least `Id` , `ArticleNumber` , `VersionNumber` , `Title` , `PublishStatus` , and `IsDeleted` as source fields.\\n- For [ServiceNow](https://docs.aws.amazon.com/https://developer.servicenow.com/dev.do#!/reference/api/rome/rest/knowledge-management-api) , your AppIntegrations DataIntegration must have an ObjectConfiguration if objectFields is not provided, including at least `number` , `short_description` , `sys_mod_count` , `workflow_state` , and `active` as source fields.\\n- For [Zendesk](https://docs.aws.amazon.com/https://developer.zendesk.com/api-reference/help_center/help-center-api/articles/) , your AppIntegrations DataIntegration must have an ObjectConfiguration if `objectFields` is not provided, including at least `id` , `title` , `updated_at` , and `draft` as source fields.\\n- For [SharePoint](https://docs.aws.amazon.com/https://learn.microsoft.com/en-us/sharepoint/dev/sp-add-ins/sharepoint-net-server-csom-jsom-and-rest-api-index) , your AppIntegrations DataIntegration must have a FileConfiguration, including only file extensions that are among `docx` , `pdf` , `html` , `htm` , and `txt` .","ObjectFields":"The fields from the source that are made available to your agents in Wisdom. Optional if ObjectConfiguration is included in the provided DataIntegration.\\n\\n- For [Salesforce](https://docs.aws.amazon.com/https://developer.salesforce.com/docs/atlas.en-us.knowledge_dev.meta/knowledge_dev/sforce_api_objects_knowledge__kav.htm) , you must include at least `Id` , `ArticleNumber` , `VersionNumber` , `Title` , `PublishStatus` , and `IsDeleted` .\\n- For [ServiceNow](https://docs.aws.amazon.com/https://developer.servicenow.com/dev.do#!/reference/api/rome/rest/knowledge-management-api) , you must include at least `number` , `short_description` , `sys_mod_count` , `workflow_state` , and `active` .\\n- For [Zendesk](https://docs.aws.amazon.com/https://developer.zendesk.com/api-reference/help_center/help-center-api/articles/) , you must include at least `id` , `title` , `updated_at` , and `draft` .\\n\\nMake sure to include additional fields. These fields are indexed and used to source recommendations."}},"AWS::Wisdom::KnowledgeBase.RenderingConfiguration":{"attributes":{},"description":"Information about how to render the content.","properties":{"TemplateUri":"A URI template containing exactly one variable in `${variableName}` format. This can only be set for `EXTERNAL` knowledge bases. For Salesforce, ServiceNow, and Zendesk, the variable must be one of the following:\\n\\n- Salesforce: `Id` , `ArticleNumber` , `VersionNumber` , `Title` , `PublishStatus` , or `IsDeleted`\\n- ServiceNow: `number` , `short_description` , `sys_mod_count` , `workflow_state` , or `active`\\n- Zendesk: `id` , `title` , `updated_at` , or `draft`\\n\\nThe variable is replaced with the actual value for a piece of content when calling [GetContent](https://docs.aws.amazon.com/wisdom/latest/APIReference/API_GetContent.html) ."}},"AWS::Wisdom::KnowledgeBase.ServerSideEncryptionConfiguration":{"attributes":{},"description":"The KMS key used for encryption.","properties":{"KmsKeyId":"The KMS key . For information about valid ID values, see [Key identifiers (KeyId)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id) in the *AWS Key Management Service Developer Guide* ."}},"AWS::Wisdom::KnowledgeBase.SourceConfiguration":{"attributes":{},"description":"Configuration information about the external data source.","properties":{"AppIntegrations":"Configuration information for Amazon AppIntegrations to automatically ingest content."}},"AWS::WorkSpaces::ConnectionAlias":{"attributes":{"AliasId":"The identifier of the connection alias, returned as a string.","Associations":"","ConnectionAliasState":"The current state of the connection alias, returned as a string.","Ref":"`Ref` returns the resource name."},"description":"The `AWS::WorkSpaces::ConnectionAlias` resource specifies a connection alias. Connection aliases are used for cross-Region redirection. For more information, see [Cross-Region Redirection for Amazon WorkSpaces](https://docs.aws.amazon.com/workspaces/latest/adminguide/cross-region-redirection.html) .","properties":{"ConnectionString":"The connection string specified for the connection alias. The connection string must be in the form of a fully qualified domain name (FQDN), such as `www.example.com` .","Tags":"The tags to associate with the connection alias."}},"AWS::WorkSpaces::ConnectionAlias.ConnectionAliasAssociation":{"attributes":{},"description":"","properties":{"AssociatedAccountId":"","AssociationStatus":"","ConnectionIdentifier":"","ResourceId":""}},"AWS::WorkSpaces::Workspace":{"attributes":{"Ref":"`Ref` returns the resource name."},"description":"The `AWS::WorkSpaces::Workspace` resource specifies a WorkSpace.\\n\\nUpdates are not supported for the `BundleId` , `RootVolumeEncryptionEnabled` , `UserVolumeEncryptionEnabled` , or `VolumeEncryptionKey` properties. To update these properties, you must also update a property that triggers a replacement, such as the `UserName` property.","properties":{"BundleId":"The identifier of the bundle for the WorkSpace.","DirectoryId":"The identifier of the AWS Directory Service directory for the WorkSpace.","RootVolumeEncryptionEnabled":"Indicates whether the data stored on the root volume is encrypted.","Tags":"The tags for the WorkSpace.","UserName":"The user name of the user for the WorkSpace. This user name must exist in the AWS Directory Service directory for the WorkSpace.","UserVolumeEncryptionEnabled":"Indicates whether the data stored on the user volume is encrypted.","VolumeEncryptionKey":"The ARN of the symmetric AWS KMS key used to encrypt data stored on your WorkSpace. Amazon WorkSpaces does not support asymmetric KMS keys.","WorkspaceProperties":"The WorkSpace properties."}},"AWS::WorkSpaces::Workspace.WorkspaceProperties":{"attributes":{},"description":"Information about a WorkSpace.","properties":{"ComputeTypeName":"The compute type. For more information, see [Amazon WorkSpaces Bundles](https://docs.aws.amazon.com/workspaces/details/#Amazon_WorkSpaces_Bundles) .","RootVolumeSizeGib":"The size of the root volume. For important information about how to modify the size of the root and user volumes, see [Modify a WorkSpace](https://docs.aws.amazon.com/workspaces/latest/adminguide/modify-workspaces.html) .","RunningMode":"The running mode. For more information, see [Manage the WorkSpace Running Mode](https://docs.aws.amazon.com/workspaces/latest/adminguide/running-mode.html) .\\n\\n> The `MANUAL` value is only supported by Amazon WorkSpaces Core. Contact your account team to be allow-listed to use this value. For more information, see [Amazon WorkSpaces Core](https://docs.aws.amazon.com/workspaces/core/) .","RunningModeAutoStopTimeoutInMinutes":"The time after a user logs off when WorkSpaces are automatically stopped. Configured in 60-minute intervals.","UserVolumeSizeGib":"The size of the user storage. For important information about how to modify the size of the root and user volumes, see [Modify a WorkSpace](https://docs.aws.amazon.com/workspaces/latest/adminguide/modify-workspaces.html) ."}},"AWS::XRay::Group":{"attributes":{"GroupARN":"The group ARN that was created or updated.","Ref":"`Ref` returns the Amazon Resource Name (ARN) of the group."},"description":"Use the `AWS::XRay::Group` resource to specify a group with a name and a filter expression. Groups enable the collection of traces that match the filter expression, can be used to filter service graphs and traces, and to supply Amazon CloudWatch metrics.","properties":{"FilterExpression":"The filter expression defining the parameters to include traces.","GroupName":"The unique case-sensitive name of the group.","InsightsConfiguration":"The structure containing configurations related to insights.\\n\\n- The InsightsEnabled boolean can be set to true to enable insights for the group or false to disable insights for the group.\\n- The NotificationsEnabled boolean can be set to true to enable insights notifications through Amazon EventBridge for the group.","Tags":"An array of key-value pairs to apply to this resource."}},"AWS::XRay::Group.InsightsConfiguration":{"attributes":{},"description":"The structure containing configurations related to insights.","properties":{"InsightsEnabled":"Set the InsightsEnabled value to true to enable insights or false to disable insights.","NotificationsEnabled":"Set the NotificationsEnabled value to true to enable insights notifications. Notifications can only be enabled on a group with InsightsEnabled set to true."}},"AWS::XRay::ResourcePolicy":{"attributes":{"Ref":"`Ref` returns the policy name."},"description":"Use `AWS::XRay::ResourcePolicy` to specify an X-Ray resource-based policy, which grants one or more AWS services and accounts permissions to access X-Ray . Each resource-based policy is associated with a specific AWS account.","properties":{"BypassPolicyLockoutCheck":"A flag to indicate whether to bypass the resource-based policy lockout safety check.","PolicyDocument":"The resource-based policy document, which can be up to 5kb in size.","PolicyName":"The name of the resource-based policy. Must be unique within a specific AWS account."}},"AWS::XRay::SamplingRule":{"attributes":{"Ref":"`Ref` returns the Amazon Resource Name (ARN) of the sampling rule.","RuleARN":"The sampling rule ARN that was created or updated."},"description":"Use the `AWS::XRay::SamplingRule` resource to specify a sampling rule, which controls sampling behavior for instrumented applications. Include a `SamplingRule` entity to create or update a sampling rule.\\n\\n> `SamplingRule.Version` can only be set when creating a sampling rule. Updating the version will cause the update to fail. \\n\\nServices retrieve rules with [GetSamplingRules](https://docs.aws.amazon.com//xray/latest/api/API_GetSamplingRules.html) , and evaluate each rule in ascending order of *priority* for each request. If a rule matches, the service records a trace, borrowing it from the reservoir size. After 10 seconds, the service reports back to X-Ray with [GetSamplingTargets](https://docs.aws.amazon.com//xray/latest/api/API_GetSamplingTargets.html) to get updated versions of each in-use rule. The updated rule contains a trace quota that the service can use instead of borrowing from the reservoir.","properties":{"SamplingRule":"The sampling rule to be created or updated.","Tags":"An array of key-value pairs to apply to this resource."}},"AWS::XRay::SamplingRule.SamplingRule":{"attributes":{},"description":"A sampling rule that services use to decide whether to instrument a request. Rule fields can match properties of the service, or properties of a request. The service can ignore rules that don\'t match its properties.","properties":{"Attributes":"Matches attributes derived from the request.\\n\\n*Map Entries:* Maximum number of 5 items.\\n\\n*Key Length Constraints:* Minimum length of 1. Maximum length of 32.\\n\\n*Value Length Constraints:* Minimum length of 1. Maximum length of 32.","FixedRate":"The percentage of matching requests to instrument, after the reservoir is exhausted.","HTTPMethod":"Matches the HTTP method of a request.","Host":"Matches the hostname from a request URL.","Priority":"The priority of the sampling rule.","ReservoirSize":"A fixed number of matching requests to instrument per second, prior to applying the fixed rate. The reservoir is not used directly by services, but applies to all services using the rule collectively.","ResourceARN":"Matches the ARN of the AWS resource on which the service runs.","RuleARN":"The ARN of the sampling rule. Specify a rule by either name or ARN, but not both.\\n\\n> Specifying a sampling rule by name is recommended, as specifying by ARN will be deprecated in future.","RuleName":"The name of the sampling rule. Specify a rule by either name or ARN, but not both.","ServiceName":"Matches the `name` that the service uses to identify itself in segments.","ServiceType":"Matches the `origin` that the service uses to identify its type in segments.","URLPath":"Matches the path from a request URL.","Version":"The version of the sampling rule. `Version` can only be set when creating a new sampling rule."}},"Alexa::ASK::Skill":{"attributes":{"Ref":"`Ref` returns the skill ID, such as amzn1.ask.skill.a3103cee-c48c-40a0-a2c9-251141888863."},"description":"The `Alexa::ASK::Skill` resource creates an Alexa skill that enables customers to access new abilities. For more information about developing a skill, see the .","properties":{"AuthenticationConfiguration":"Login with Amazon (LWA) configuration used to authenticate with the Alexa service. Only Login with Amazon clients created through the are supported. The client ID, client secret, and refresh token are required.","SkillPackage":"Configuration for the skill package that contains the components of the Alexa skill. Skill packages are retrieved from an Amazon S3 bucket and key and used to create and update the skill. For more information about the skill package format, see the .","VendorId":"The vendor ID associated with the Amazon developer account that will host the skill. Details for retrieving the vendor ID are in . The provided LWA credentials must be linked to the developer account associated with this vendor ID."}},"Alexa::ASK::Skill.AuthenticationConfiguration":{"attributes":{},"description":"The `AuthenticationConfiguration` property type specifies the Login with Amazon (LWA) configuration used to authenticate with the Alexa service. Only Login with Amazon security profiles created through the are supported for authentication. A client ID, client secret, and refresh token are required. You can generate a client ID and client secret by creating a new on the Amazon Developer Portal or you can retrieve them from an existing profile. You can then retrieve the refresh token using the Alexa Skills Kit CLI. For instructions, see in the .\\n\\n`AuthenticationConfiguration` is a property of the `Alexa::ASK::Skill` resource.","properties":{"ClientId":"Client ID from Login with Amazon (LWA).","ClientSecret":"Client secret from Login with Amazon (LWA).","RefreshToken":"Refresh token from Login with Amazon (LWA). This token is secret."}},"Alexa::ASK::Skill.Overrides":{"attributes":{},"description":"The `Overrides` property type provides overrides to the skill package to apply when creating or updating the skill. Values provided here do not modify the contents of the original skill package. Currently, only overriding values inside of the skill manifest component of the package is supported.\\n\\n`Overrides` is a property of the `Alexa::ASK::Skill SkillPackage` property type.","properties":{"Manifest":"Overrides to apply to the skill manifest inside of the skill package. The skill manifest contains metadata about the skill. For more information, see ."}},"Alexa::ASK::Skill.SkillPackage":{"attributes":{},"description":"The `SkillPackage` property type contains configuration details for the skill package that contains the components of the Alexa skill. Skill packages are retrieved from an Amazon S3 bucket and key and used to create and update the skill. More details about the skill package format are located in the .\\n\\n`SkillPackage` is a property of the `Alexa::ASK::Skill` resource.","properties":{"Overrides":"Overrides to the skill package to apply when creating or updating the skill. Values provided here do not modify the contents of the original skill package. Currently, only overriding values inside of the skill manifest component of the package is supported.","S3Bucket":"The name of the Amazon S3 bucket where the .zip file that contains the skill package is stored.","S3BucketRole":"ARN of the IAM role that grants the Alexa service ( `alexa-appkit.amazon.com` ) permission to access the bucket and retrieve the skill package. This property is optional. If you do not provide it, the bucket must be publicly accessible or configured with a policy that allows this access. Otherwise, AWS CloudFormation cannot create the skill.","S3Key":"The location and name of the skill package .zip file.","S3ObjectVersion":"If you have S3 versioning enabled, the version ID of the skill package.zip file."}}}}'); +/* eslint-disable object-property-newline */ + + +const decodeText = __nccwpck_require__(84619) + +const RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g + +const EncodedLookup = { + '%00': '\x00', '%01': '\x01', '%02': '\x02', '%03': '\x03', '%04': '\x04', + '%05': '\x05', '%06': '\x06', '%07': '\x07', '%08': '\x08', '%09': '\x09', + '%0a': '\x0a', '%0A': '\x0a', '%0b': '\x0b', '%0B': '\x0b', '%0c': '\x0c', + '%0C': '\x0c', '%0d': '\x0d', '%0D': '\x0d', '%0e': '\x0e', '%0E': '\x0e', + '%0f': '\x0f', '%0F': '\x0f', '%10': '\x10', '%11': '\x11', '%12': '\x12', + '%13': '\x13', '%14': '\x14', '%15': '\x15', '%16': '\x16', '%17': '\x17', + '%18': '\x18', '%19': '\x19', '%1a': '\x1a', '%1A': '\x1a', '%1b': '\x1b', + '%1B': '\x1b', '%1c': '\x1c', '%1C': '\x1c', '%1d': '\x1d', '%1D': '\x1d', + '%1e': '\x1e', '%1E': '\x1e', '%1f': '\x1f', '%1F': '\x1f', '%20': '\x20', + '%21': '\x21', '%22': '\x22', '%23': '\x23', '%24': '\x24', '%25': '\x25', + '%26': '\x26', '%27': '\x27', '%28': '\x28', '%29': '\x29', '%2a': '\x2a', + '%2A': '\x2a', '%2b': '\x2b', '%2B': '\x2b', '%2c': '\x2c', '%2C': '\x2c', + '%2d': '\x2d', '%2D': '\x2d', '%2e': '\x2e', '%2E': '\x2e', '%2f': '\x2f', + '%2F': '\x2f', '%30': '\x30', '%31': '\x31', '%32': '\x32', '%33': '\x33', + '%34': '\x34', '%35': '\x35', '%36': '\x36', '%37': '\x37', '%38': '\x38', + '%39': '\x39', '%3a': '\x3a', '%3A': '\x3a', '%3b': '\x3b', '%3B': '\x3b', + '%3c': '\x3c', '%3C': '\x3c', '%3d': '\x3d', '%3D': '\x3d', '%3e': '\x3e', + '%3E': '\x3e', '%3f': '\x3f', '%3F': '\x3f', '%40': '\x40', '%41': '\x41', + '%42': '\x42', '%43': '\x43', '%44': '\x44', '%45': '\x45', '%46': '\x46', + '%47': '\x47', '%48': '\x48', '%49': '\x49', '%4a': '\x4a', '%4A': '\x4a', + '%4b': '\x4b', '%4B': '\x4b', '%4c': '\x4c', '%4C': '\x4c', '%4d': '\x4d', + '%4D': '\x4d', '%4e': '\x4e', '%4E': '\x4e', '%4f': '\x4f', '%4F': '\x4f', + '%50': '\x50', '%51': '\x51', '%52': '\x52', '%53': '\x53', '%54': '\x54', + '%55': '\x55', '%56': '\x56', '%57': '\x57', '%58': '\x58', '%59': '\x59', + '%5a': '\x5a', '%5A': '\x5a', '%5b': '\x5b', '%5B': '\x5b', '%5c': '\x5c', + '%5C': '\x5c', '%5d': '\x5d', '%5D': '\x5d', '%5e': '\x5e', '%5E': '\x5e', + '%5f': '\x5f', '%5F': '\x5f', '%60': '\x60', '%61': '\x61', '%62': '\x62', + '%63': '\x63', '%64': '\x64', '%65': '\x65', '%66': '\x66', '%67': '\x67', + '%68': '\x68', '%69': '\x69', '%6a': '\x6a', '%6A': '\x6a', '%6b': '\x6b', + '%6B': '\x6b', '%6c': '\x6c', '%6C': '\x6c', '%6d': '\x6d', '%6D': '\x6d', + '%6e': '\x6e', '%6E': '\x6e', '%6f': '\x6f', '%6F': '\x6f', '%70': '\x70', + '%71': '\x71', '%72': '\x72', '%73': '\x73', '%74': '\x74', '%75': '\x75', + '%76': '\x76', '%77': '\x77', '%78': '\x78', '%79': '\x79', '%7a': '\x7a', + '%7A': '\x7a', '%7b': '\x7b', '%7B': '\x7b', '%7c': '\x7c', '%7C': '\x7c', + '%7d': '\x7d', '%7D': '\x7d', '%7e': '\x7e', '%7E': '\x7e', '%7f': '\x7f', + '%7F': '\x7f', '%80': '\x80', '%81': '\x81', '%82': '\x82', '%83': '\x83', + '%84': '\x84', '%85': '\x85', '%86': '\x86', '%87': '\x87', '%88': '\x88', + '%89': '\x89', '%8a': '\x8a', '%8A': '\x8a', '%8b': '\x8b', '%8B': '\x8b', + '%8c': '\x8c', '%8C': '\x8c', '%8d': '\x8d', '%8D': '\x8d', '%8e': '\x8e', + '%8E': '\x8e', '%8f': '\x8f', '%8F': '\x8f', '%90': '\x90', '%91': '\x91', + '%92': '\x92', '%93': '\x93', '%94': '\x94', '%95': '\x95', '%96': '\x96', + '%97': '\x97', '%98': '\x98', '%99': '\x99', '%9a': '\x9a', '%9A': '\x9a', + '%9b': '\x9b', '%9B': '\x9b', '%9c': '\x9c', '%9C': '\x9c', '%9d': '\x9d', + '%9D': '\x9d', '%9e': '\x9e', '%9E': '\x9e', '%9f': '\x9f', '%9F': '\x9f', + '%a0': '\xa0', '%A0': '\xa0', '%a1': '\xa1', '%A1': '\xa1', '%a2': '\xa2', + '%A2': '\xa2', '%a3': '\xa3', '%A3': '\xa3', '%a4': '\xa4', '%A4': '\xa4', + '%a5': '\xa5', '%A5': '\xa5', '%a6': '\xa6', '%A6': '\xa6', '%a7': '\xa7', + '%A7': '\xa7', '%a8': '\xa8', '%A8': '\xa8', '%a9': '\xa9', '%A9': '\xa9', + '%aa': '\xaa', '%Aa': '\xaa', '%aA': '\xaa', '%AA': '\xaa', '%ab': '\xab', + '%Ab': '\xab', '%aB': '\xab', '%AB': '\xab', '%ac': '\xac', '%Ac': '\xac', + '%aC': '\xac', '%AC': '\xac', '%ad': '\xad', '%Ad': '\xad', '%aD': '\xad', + '%AD': '\xad', '%ae': '\xae', '%Ae': '\xae', '%aE': '\xae', '%AE': '\xae', + '%af': '\xaf', '%Af': '\xaf', '%aF': '\xaf', '%AF': '\xaf', '%b0': '\xb0', + '%B0': '\xb0', '%b1': '\xb1', '%B1': '\xb1', '%b2': '\xb2', '%B2': '\xb2', + '%b3': '\xb3', '%B3': '\xb3', '%b4': '\xb4', '%B4': '\xb4', '%b5': '\xb5', + '%B5': '\xb5', '%b6': '\xb6', '%B6': '\xb6', '%b7': '\xb7', '%B7': '\xb7', + '%b8': '\xb8', '%B8': '\xb8', '%b9': '\xb9', '%B9': '\xb9', '%ba': '\xba', + '%Ba': '\xba', '%bA': '\xba', '%BA': '\xba', '%bb': '\xbb', '%Bb': '\xbb', + '%bB': '\xbb', '%BB': '\xbb', '%bc': '\xbc', '%Bc': '\xbc', '%bC': '\xbc', + '%BC': '\xbc', '%bd': '\xbd', '%Bd': '\xbd', '%bD': '\xbd', '%BD': '\xbd', + '%be': '\xbe', '%Be': '\xbe', '%bE': '\xbe', '%BE': '\xbe', '%bf': '\xbf', + '%Bf': '\xbf', '%bF': '\xbf', '%BF': '\xbf', '%c0': '\xc0', '%C0': '\xc0', + '%c1': '\xc1', '%C1': '\xc1', '%c2': '\xc2', '%C2': '\xc2', '%c3': '\xc3', + '%C3': '\xc3', '%c4': '\xc4', '%C4': '\xc4', '%c5': '\xc5', '%C5': '\xc5', + '%c6': '\xc6', '%C6': '\xc6', '%c7': '\xc7', '%C7': '\xc7', '%c8': '\xc8', + '%C8': '\xc8', '%c9': '\xc9', '%C9': '\xc9', '%ca': '\xca', '%Ca': '\xca', + '%cA': '\xca', '%CA': '\xca', '%cb': '\xcb', '%Cb': '\xcb', '%cB': '\xcb', + '%CB': '\xcb', '%cc': '\xcc', '%Cc': '\xcc', '%cC': '\xcc', '%CC': '\xcc', + '%cd': '\xcd', '%Cd': '\xcd', '%cD': '\xcd', '%CD': '\xcd', '%ce': '\xce', + '%Ce': '\xce', '%cE': '\xce', '%CE': '\xce', '%cf': '\xcf', '%Cf': '\xcf', + '%cF': '\xcf', '%CF': '\xcf', '%d0': '\xd0', '%D0': '\xd0', '%d1': '\xd1', + '%D1': '\xd1', '%d2': '\xd2', '%D2': '\xd2', '%d3': '\xd3', '%D3': '\xd3', + '%d4': '\xd4', '%D4': '\xd4', '%d5': '\xd5', '%D5': '\xd5', '%d6': '\xd6', + '%D6': '\xd6', '%d7': '\xd7', '%D7': '\xd7', '%d8': '\xd8', '%D8': '\xd8', + '%d9': '\xd9', '%D9': '\xd9', '%da': '\xda', '%Da': '\xda', '%dA': '\xda', + '%DA': '\xda', '%db': '\xdb', '%Db': '\xdb', '%dB': '\xdb', '%DB': '\xdb', + '%dc': '\xdc', '%Dc': '\xdc', '%dC': '\xdc', '%DC': '\xdc', '%dd': '\xdd', + '%Dd': '\xdd', '%dD': '\xdd', '%DD': '\xdd', '%de': '\xde', '%De': '\xde', + '%dE': '\xde', '%DE': '\xde', '%df': '\xdf', '%Df': '\xdf', '%dF': '\xdf', + '%DF': '\xdf', '%e0': '\xe0', '%E0': '\xe0', '%e1': '\xe1', '%E1': '\xe1', + '%e2': '\xe2', '%E2': '\xe2', '%e3': '\xe3', '%E3': '\xe3', '%e4': '\xe4', + '%E4': '\xe4', '%e5': '\xe5', '%E5': '\xe5', '%e6': '\xe6', '%E6': '\xe6', + '%e7': '\xe7', '%E7': '\xe7', '%e8': '\xe8', '%E8': '\xe8', '%e9': '\xe9', + '%E9': '\xe9', '%ea': '\xea', '%Ea': '\xea', '%eA': '\xea', '%EA': '\xea', + '%eb': '\xeb', '%Eb': '\xeb', '%eB': '\xeb', '%EB': '\xeb', '%ec': '\xec', + '%Ec': '\xec', '%eC': '\xec', '%EC': '\xec', '%ed': '\xed', '%Ed': '\xed', + '%eD': '\xed', '%ED': '\xed', '%ee': '\xee', '%Ee': '\xee', '%eE': '\xee', + '%EE': '\xee', '%ef': '\xef', '%Ef': '\xef', '%eF': '\xef', '%EF': '\xef', + '%f0': '\xf0', '%F0': '\xf0', '%f1': '\xf1', '%F1': '\xf1', '%f2': '\xf2', + '%F2': '\xf2', '%f3': '\xf3', '%F3': '\xf3', '%f4': '\xf4', '%F4': '\xf4', + '%f5': '\xf5', '%F5': '\xf5', '%f6': '\xf6', '%F6': '\xf6', '%f7': '\xf7', + '%F7': '\xf7', '%f8': '\xf8', '%F8': '\xf8', '%f9': '\xf9', '%F9': '\xf9', + '%fa': '\xfa', '%Fa': '\xfa', '%fA': '\xfa', '%FA': '\xfa', '%fb': '\xfb', + '%Fb': '\xfb', '%fB': '\xfb', '%FB': '\xfb', '%fc': '\xfc', '%Fc': '\xfc', + '%fC': '\xfc', '%FC': '\xfc', '%fd': '\xfd', '%Fd': '\xfd', '%fD': '\xfd', + '%FD': '\xfd', '%fe': '\xfe', '%Fe': '\xfe', '%fE': '\xfe', '%FE': '\xfe', + '%ff': '\xff', '%Ff': '\xff', '%fF': '\xff', '%FF': '\xff' +} + +function encodedReplacer (match) { + return EncodedLookup[match] +} + +const STATE_KEY = 0 +const STATE_VALUE = 1 +const STATE_CHARSET = 2 +const STATE_LANG = 3 -/***/ }), +function parseParams (str) { + const res = [] + let state = STATE_KEY + let charset = '' + let inquote = false + let escaping = false + let p = 0 + let tmp = '' + const len = str.length -/***/ 21507: -/***/ ((module) => { + for (var i = 0; i < len; ++i) { // eslint-disable-line no-var + const char = str[i] + if (char === '\\' && inquote) { + if (escaping) { escaping = false } else { + escaping = true + continue + } + } else if (char === '"') { + if (!escaping) { + if (inquote) { + inquote = false + state = STATE_KEY + } else { inquote = true } + continue + } else { escaping = false } + } else { + if (escaping && inquote) { tmp += '\\' } + escaping = false + if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") { + if (state === STATE_CHARSET) { + state = STATE_LANG + charset = tmp.substring(1) + } else { state = STATE_VALUE } + tmp = '' + continue + } else if (state === STATE_KEY && + (char === '*' || char === '=') && + res.length) { + state = char === '*' + ? STATE_CHARSET + : STATE_VALUE + res[p] = [tmp, undefined] + tmp = '' + continue + } else if (!inquote && char === ';') { + state = STATE_KEY + if (charset) { + if (tmp.length) { + tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), + 'binary', + charset) + } + charset = '' + } else if (tmp.length) { + tmp = decodeText(tmp, 'binary', 'utf8') + } + if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp } + tmp = '' + ++p + continue + } else if (!inquote && (char === ' ' || char === '\t')) { continue } + } + tmp += char + } + if (charset && tmp.length) { + tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), + 'binary', + charset) + } else if (tmp) { + tmp = decodeText(tmp, 'binary', 'utf8') + } -"use strict"; -module.exports = JSON.parse('{"StatefulResources":{"ResourceTypes":{"AWS::Backup::BackupVault":{},"AWS::CloudFormation::Stack":{},"AWS::Cognito::UserPool":{},"AWS::DocDB::DBCluster":{},"AWS::DocDB::DBInstance":{},"AWS::DynamoDB::GlobalTable":{},"AWS::DynamoDB::Table":{},"AWS::EC2::Volume":{},"AWS::EFS::FileSystem":{},"AWS::EMR::Cluster":{},"AWS::ElastiCache::CacheCluster":{},"AWS::ElastiCache::ReplicationGroup":{},"AWS::Elasticsearch::Domain":{},"AWS::FSx::FileSystem":{},"AWS::KMS::Key":{},"AWS::Logs::LogGroup":{},"AWS::Neptune::DBCluster":{},"AWS::Neptune::DBInstance":{},"AWS::OpenSearchService::Domain":{},"AWS::Organizations::Account":{},"AWS::QLDB::Ledger":{},"AWS::RDS::DBCluster":{},"AWS::RDS::DBInstance":{},"AWS::Redshift::Cluster":{},"AWS::S3::Bucket":{"DeleteRequiresEmptyResource":true},"AWS::SDB::Domain":{},"AWS::SQS::Queue":{},"AWS::SecretsManager::Secret":{}}}}'); + if (res[p] === undefined) { + if (tmp) { res[p] = tmp } + } else { res[p][1] = tmp } -/***/ }), + return res +} -/***/ 14081: -/***/ ((module) => { +module.exports = parseParams -"use strict"; -module.exports = JSON.parse('{"DeletedPropertyTypes":{"AWS::LakeFormation::DataLakeSettings.Permissions":true,"AWS::QuickSight::Analysis.ColorsConfiguration":true,"AWS::QuickSight::Analysis.CustomColor":true,"AWS::QuickSight::Dashboard.ColorsConfiguration":true,"AWS::QuickSight::Dashboard.CustomColor":true,"AWS::QuickSight::Template.ColorsConfiguration":true,"AWS::QuickSight::Template.CustomColor":true,"AWS::SageMaker::ModelPackage.UserContext":true},"Fingerprint":"c422907bec2d2256eef50e5e107eaf40","PropertyTypes":{"AWS::ACMPCA::Certificate.ApiPassthrough":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-apipassthrough.html","Properties":{"Extensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-apipassthrough.html#cfn-acmpca-certificate-apipassthrough-extensions","Required":false,"Type":"Extensions","UpdateType":"Immutable"},"Subject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-apipassthrough.html#cfn-acmpca-certificate-apipassthrough-subject","Required":false,"Type":"Subject","UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.CustomAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customattribute.html","Properties":{"ObjectIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customattribute.html#cfn-acmpca-certificate-customattribute-objectidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customattribute.html#cfn-acmpca-certificate-customattribute-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.CustomExtension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customextension.html","Properties":{"Critical":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customextension.html#cfn-acmpca-certificate-customextension-critical","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ObjectIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customextension.html#cfn-acmpca-certificate-customextension-objectidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customextension.html#cfn-acmpca-certificate-customextension-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.EdiPartyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-edipartyname.html","Properties":{"NameAssigner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-edipartyname.html#cfn-acmpca-certificate-edipartyname-nameassigner","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PartyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-edipartyname.html#cfn-acmpca-certificate-edipartyname-partyname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.ExtendedKeyUsage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-extendedkeyusage.html","Properties":{"ExtendedKeyUsageObjectIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-extendedkeyusage.html#cfn-acmpca-certificate-extendedkeyusage-extendedkeyusageobjectidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ExtendedKeyUsageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-extendedkeyusage.html#cfn-acmpca-certificate-extendedkeyusage-extendedkeyusagetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.Extensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-extensions.html","Properties":{"CertificatePolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-extensions.html#cfn-acmpca-certificate-extensions-certificatepolicies","DuplicatesAllowed":true,"ItemType":"PolicyInformation","Required":false,"Type":"List","UpdateType":"Immutable"},"CustomExtensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-extensions.html#cfn-acmpca-certificate-extensions-customextensions","DuplicatesAllowed":true,"ItemType":"CustomExtension","Required":false,"Type":"List","UpdateType":"Immutable"},"ExtendedKeyUsage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-extensions.html#cfn-acmpca-certificate-extensions-extendedkeyusage","DuplicatesAllowed":true,"ItemType":"ExtendedKeyUsage","Required":false,"Type":"List","UpdateType":"Immutable"},"KeyUsage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-extensions.html#cfn-acmpca-certificate-extensions-keyusage","Required":false,"Type":"KeyUsage","UpdateType":"Immutable"},"SubjectAlternativeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-extensions.html#cfn-acmpca-certificate-extensions-subjectalternativenames","DuplicatesAllowed":true,"ItemType":"GeneralName","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.GeneralName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-generalname.html","Properties":{"DirectoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-generalname.html#cfn-acmpca-certificate-generalname-directoryname","Required":false,"Type":"Subject","UpdateType":"Immutable"},"DnsName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-generalname.html#cfn-acmpca-certificate-generalname-dnsname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EdiPartyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-generalname.html#cfn-acmpca-certificate-generalname-edipartyname","Required":false,"Type":"EdiPartyName","UpdateType":"Immutable"},"IpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-generalname.html#cfn-acmpca-certificate-generalname-ipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OtherName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-generalname.html#cfn-acmpca-certificate-generalname-othername","Required":false,"Type":"OtherName","UpdateType":"Immutable"},"RegisteredId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-generalname.html#cfn-acmpca-certificate-generalname-registeredid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Rfc822Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-generalname.html#cfn-acmpca-certificate-generalname-rfc822name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"UniformResourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-generalname.html#cfn-acmpca-certificate-generalname-uniformresourceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.KeyUsage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-keyusage.html","Properties":{"CRLSign":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-keyusage.html#cfn-acmpca-certificate-keyusage-crlsign","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DataEncipherment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-keyusage.html#cfn-acmpca-certificate-keyusage-dataencipherment","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DecipherOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-keyusage.html#cfn-acmpca-certificate-keyusage-decipheronly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DigitalSignature":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-keyusage.html#cfn-acmpca-certificate-keyusage-digitalsignature","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"EncipherOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-keyusage.html#cfn-acmpca-certificate-keyusage-encipheronly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"KeyAgreement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-keyusage.html#cfn-acmpca-certificate-keyusage-keyagreement","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"KeyCertSign":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-keyusage.html#cfn-acmpca-certificate-keyusage-keycertsign","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"KeyEncipherment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-keyusage.html#cfn-acmpca-certificate-keyusage-keyencipherment","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"NonRepudiation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-keyusage.html#cfn-acmpca-certificate-keyusage-nonrepudiation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.OtherName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-othername.html","Properties":{"TypeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-othername.html#cfn-acmpca-certificate-othername-typeid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-othername.html#cfn-acmpca-certificate-othername-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.PolicyInformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-policyinformation.html","Properties":{"CertPolicyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-policyinformation.html#cfn-acmpca-certificate-policyinformation-certpolicyid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PolicyQualifiers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-policyinformation.html#cfn-acmpca-certificate-policyinformation-policyqualifiers","DuplicatesAllowed":true,"ItemType":"PolicyQualifierInfo","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.PolicyQualifierInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-policyqualifierinfo.html","Properties":{"PolicyQualifierId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-policyqualifierinfo.html#cfn-acmpca-certificate-policyqualifierinfo-policyqualifierid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Qualifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-policyqualifierinfo.html#cfn-acmpca-certificate-policyqualifierinfo-qualifier","Required":true,"Type":"Qualifier","UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.Qualifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-qualifier.html","Properties":{"CpsUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-qualifier.html#cfn-acmpca-certificate-qualifier-cpsuri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.Subject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html","Properties":{"CommonName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-commonname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Country":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-country","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CustomAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-customattributes","DuplicatesAllowed":true,"ItemType":"CustomAttribute","Required":false,"Type":"List","UpdateType":"Immutable"},"DistinguishedNameQualifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-distinguishednamequalifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GenerationQualifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-generationqualifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GivenName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-givenname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Initials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-initials","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Locality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-locality","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Organization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-organization","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OrganizationalUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-organizationalunit","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Pseudonym":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-pseudonym","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SerialNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-serialnumber","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-state","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Surname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-surname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-title","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ACMPCA::Certificate.Validity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-validity.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-validity.html#cfn-acmpca-certificate-validity-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-validity.html#cfn-acmpca-certificate-validity-value","PrimitiveType":"Double","Required":true,"UpdateType":"Immutable"}}},"AWS::ACMPCA::CertificateAuthority.AccessDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-accessdescription.html","Properties":{"AccessLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-accessdescription.html#cfn-acmpca-certificateauthority-accessdescription-accesslocation","Required":true,"Type":"GeneralName","UpdateType":"Immutable"},"AccessMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-accessdescription.html#cfn-acmpca-certificateauthority-accessdescription-accessmethod","Required":true,"Type":"AccessMethod","UpdateType":"Immutable"}}},"AWS::ACMPCA::CertificateAuthority.AccessMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-accessmethod.html","Properties":{"AccessMethodType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-accessmethod.html#cfn-acmpca-certificateauthority-accessmethod-accessmethodtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CustomObjectIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-accessmethod.html#cfn-acmpca-certificateauthority-accessmethod-customobjectidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ACMPCA::CertificateAuthority.CrlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-crlconfiguration.html","Properties":{"CustomCname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-crlconfiguration.html#cfn-acmpca-certificateauthority-crlconfiguration-customcname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-crlconfiguration.html#cfn-acmpca-certificateauthority-crlconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExpirationInDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-crlconfiguration.html#cfn-acmpca-certificateauthority-crlconfiguration-expirationindays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"S3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-crlconfiguration.html#cfn-acmpca-certificateauthority-crlconfiguration-s3bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3ObjectAcl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-crlconfiguration.html#cfn-acmpca-certificateauthority-crlconfiguration-s3objectacl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ACMPCA::CertificateAuthority.CsrExtensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-csrextensions.html","Properties":{"KeyUsage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-csrextensions.html#cfn-acmpca-certificateauthority-csrextensions-keyusage","Required":false,"Type":"KeyUsage","UpdateType":"Immutable"},"SubjectInformationAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-csrextensions.html#cfn-acmpca-certificateauthority-csrextensions-subjectinformationaccess","DuplicatesAllowed":true,"ItemType":"AccessDescription","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::ACMPCA::CertificateAuthority.CustomAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-customattribute.html","Properties":{"ObjectIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-customattribute.html#cfn-acmpca-certificateauthority-customattribute-objectidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-customattribute.html#cfn-acmpca-certificateauthority-customattribute-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ACMPCA::CertificateAuthority.EdiPartyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-edipartyname.html","Properties":{"NameAssigner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-edipartyname.html#cfn-acmpca-certificateauthority-edipartyname-nameassigner","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PartyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-edipartyname.html#cfn-acmpca-certificateauthority-edipartyname-partyname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ACMPCA::CertificateAuthority.GeneralName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-generalname.html","Properties":{"DirectoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-generalname.html#cfn-acmpca-certificateauthority-generalname-directoryname","Required":false,"Type":"Subject","UpdateType":"Immutable"},"DnsName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-generalname.html#cfn-acmpca-certificateauthority-generalname-dnsname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EdiPartyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-generalname.html#cfn-acmpca-certificateauthority-generalname-edipartyname","Required":false,"Type":"EdiPartyName","UpdateType":"Immutable"},"IpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-generalname.html#cfn-acmpca-certificateauthority-generalname-ipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OtherName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-generalname.html#cfn-acmpca-certificateauthority-generalname-othername","Required":false,"Type":"OtherName","UpdateType":"Immutable"},"RegisteredId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-generalname.html#cfn-acmpca-certificateauthority-generalname-registeredid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Rfc822Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-generalname.html#cfn-acmpca-certificateauthority-generalname-rfc822name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"UniformResourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-generalname.html#cfn-acmpca-certificateauthority-generalname-uniformresourceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ACMPCA::CertificateAuthority.KeyUsage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-keyusage.html","Properties":{"CRLSign":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-keyusage.html#cfn-acmpca-certificateauthority-keyusage-crlsign","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DataEncipherment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-keyusage.html#cfn-acmpca-certificateauthority-keyusage-dataencipherment","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DecipherOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-keyusage.html#cfn-acmpca-certificateauthority-keyusage-decipheronly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DigitalSignature":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-keyusage.html#cfn-acmpca-certificateauthority-keyusage-digitalsignature","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"EncipherOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-keyusage.html#cfn-acmpca-certificateauthority-keyusage-encipheronly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"KeyAgreement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-keyusage.html#cfn-acmpca-certificateauthority-keyusage-keyagreement","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"KeyCertSign":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-keyusage.html#cfn-acmpca-certificateauthority-keyusage-keycertsign","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"KeyEncipherment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-keyusage.html#cfn-acmpca-certificateauthority-keyusage-keyencipherment","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"NonRepudiation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-keyusage.html#cfn-acmpca-certificateauthority-keyusage-nonrepudiation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::ACMPCA::CertificateAuthority.OcspConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-ocspconfiguration.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-ocspconfiguration.html#cfn-acmpca-certificateauthority-ocspconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"OcspCustomCname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-ocspconfiguration.html#cfn-acmpca-certificateauthority-ocspconfiguration-ocspcustomcname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ACMPCA::CertificateAuthority.OtherName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-othername.html","Properties":{"TypeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-othername.html#cfn-acmpca-certificateauthority-othername-typeid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-othername.html#cfn-acmpca-certificateauthority-othername-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ACMPCA::CertificateAuthority.RevocationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-revocationconfiguration.html","Properties":{"CrlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-revocationconfiguration.html#cfn-acmpca-certificateauthority-revocationconfiguration-crlconfiguration","Required":false,"Type":"CrlConfiguration","UpdateType":"Mutable"},"OcspConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-revocationconfiguration.html#cfn-acmpca-certificateauthority-revocationconfiguration-ocspconfiguration","Required":false,"Type":"OcspConfiguration","UpdateType":"Mutable"}}},"AWS::ACMPCA::CertificateAuthority.Subject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html","Properties":{"CommonName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-commonname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Country":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-country","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CustomAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-customattributes","DuplicatesAllowed":true,"ItemType":"CustomAttribute","Required":false,"Type":"List","UpdateType":"Immutable"},"DistinguishedNameQualifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-distinguishednamequalifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GenerationQualifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-generationqualifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GivenName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-givenname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Initials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-initials","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Locality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-locality","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Organization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-organization","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OrganizationalUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-organizationalunit","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Pseudonym":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-pseudonym","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SerialNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-serialnumber","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-state","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Surname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-surname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-title","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::APS::Workspace.LoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-aps-workspace-loggingconfiguration.html","Properties":{"LogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-aps-workspace-loggingconfiguration.html#cfn-aps-workspace-loggingconfiguration-loggrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AccessAnalyzer::Analyzer.ArchiveRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-accessanalyzer-analyzer-archiverule.html","Properties":{"Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-accessanalyzer-analyzer-archiverule.html#cfn-accessanalyzer-analyzer-archiverule-filter","DuplicatesAllowed":true,"ItemType":"Filter","Required":true,"Type":"List","UpdateType":"Mutable"},"RuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-accessanalyzer-analyzer-archiverule.html#cfn-accessanalyzer-analyzer-archiverule-rulename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AccessAnalyzer::Analyzer.Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-accessanalyzer-analyzer-filter.html","Properties":{"Contains":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-accessanalyzer-analyzer-filter.html#cfn-accessanalyzer-analyzer-filter-contains","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Eq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-accessanalyzer-analyzer-filter.html#cfn-accessanalyzer-analyzer-filter-eq","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Exists":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-accessanalyzer-analyzer-filter.html#cfn-accessanalyzer-analyzer-filter-exists","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Neq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-accessanalyzer-analyzer-filter.html#cfn-accessanalyzer-analyzer-filter-neq","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Property":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-accessanalyzer-analyzer-filter.html#cfn-accessanalyzer-analyzer-filter-property","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AmazonMQ::Broker.ConfigurationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-configurationid.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-configurationid.html#cfn-amazonmq-broker-configurationid-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Revision":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-configurationid.html#cfn-amazonmq-broker-configurationid-revision","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AmazonMQ::Broker.EncryptionOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-encryptionoptions.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-encryptionoptions.html#cfn-amazonmq-broker-encryptionoptions-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UseAwsOwnedKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-encryptionoptions.html#cfn-amazonmq-broker-encryptionoptions-useawsownedkey","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::AmazonMQ::Broker.LdapServerMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html","Properties":{"Hosts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html#cfn-amazonmq-broker-ldapservermetadata-hosts","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"RoleBase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html#cfn-amazonmq-broker-ldapservermetadata-rolebase","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html#cfn-amazonmq-broker-ldapservermetadata-rolename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleSearchMatching":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html#cfn-amazonmq-broker-ldapservermetadata-rolesearchmatching","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleSearchSubtree":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html#cfn-amazonmq-broker-ldapservermetadata-rolesearchsubtree","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ServiceAccountPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html#cfn-amazonmq-broker-ldapservermetadata-serviceaccountpassword","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServiceAccountUsername":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html#cfn-amazonmq-broker-ldapservermetadata-serviceaccountusername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UserBase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html#cfn-amazonmq-broker-ldapservermetadata-userbase","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UserRoleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html#cfn-amazonmq-broker-ldapservermetadata-userrolename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserSearchMatching":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html#cfn-amazonmq-broker-ldapservermetadata-usersearchmatching","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UserSearchSubtree":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-ldapservermetadata.html#cfn-amazonmq-broker-ldapservermetadata-usersearchsubtree","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::AmazonMQ::Broker.LogList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-loglist.html","Properties":{"Audit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-loglist.html#cfn-amazonmq-broker-loglist-audit","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"General":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-loglist.html#cfn-amazonmq-broker-loglist-general","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::AmazonMQ::Broker.MaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-maintenancewindow.html","Properties":{"DayOfWeek":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-maintenancewindow.html#cfn-amazonmq-broker-maintenancewindow-dayofweek","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeOfDay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-maintenancewindow.html#cfn-amazonmq-broker-maintenancewindow-timeofday","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-maintenancewindow.html#cfn-amazonmq-broker-maintenancewindow-timezone","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AmazonMQ::Broker.TagsEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-tagsentry.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-tagsentry.html#cfn-amazonmq-broker-tagsentry-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-tagsentry.html#cfn-amazonmq-broker-tagsentry-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AmazonMQ::Broker.User":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-user.html","Properties":{"ConsoleAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-user.html#cfn-amazonmq-broker-user-consoleaccess","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-user.html#cfn-amazonmq-broker-user-groups","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-user.html#cfn-amazonmq-broker-user-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-broker-user.html#cfn-amazonmq-broker-user-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AmazonMQ::Configuration.TagsEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-configuration-tagsentry.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-configuration-tagsentry.html#cfn-amazonmq-configuration-tagsentry-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-configuration-tagsentry.html#cfn-amazonmq-configuration-tagsentry-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AmazonMQ::ConfigurationAssociation.ConfigurationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-configurationassociation-configurationid.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-configurationassociation-configurationid.html#cfn-amazonmq-configurationassociation-configurationid-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Revision":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amazonmq-configurationassociation-configurationid.html#cfn-amazonmq-configurationassociation-configurationid-revision","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Amplify::App.AutoBranchCreationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html","Properties":{"AutoBranchCreationPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html#cfn-amplify-app-autobranchcreationconfig-autobranchcreationpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"BasicAuthConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html#cfn-amplify-app-autobranchcreationconfig-basicauthconfig","Required":false,"Type":"BasicAuthConfig","UpdateType":"Mutable"},"BuildSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html#cfn-amplify-app-autobranchcreationconfig-buildspec","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableAutoBranchCreation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html#cfn-amplify-app-autobranchcreationconfig-enableautobranchcreation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableAutoBuild":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html#cfn-amplify-app-autobranchcreationconfig-enableautobuild","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnablePerformanceMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html#cfn-amplify-app-autobranchcreationconfig-enableperformancemode","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnablePullRequestPreview":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html#cfn-amplify-app-autobranchcreationconfig-enablepullrequestpreview","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnvironmentVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html#cfn-amplify-app-autobranchcreationconfig-environmentvariables","DuplicatesAllowed":true,"ItemType":"EnvironmentVariable","Required":false,"Type":"List","UpdateType":"Mutable"},"Framework":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html#cfn-amplify-app-autobranchcreationconfig-framework","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PullRequestEnvironmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html#cfn-amplify-app-autobranchcreationconfig-pullrequestenvironmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Stage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-autobranchcreationconfig.html#cfn-amplify-app-autobranchcreationconfig-stage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Amplify::App.BasicAuthConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-basicauthconfig.html","Properties":{"EnableBasicAuth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-basicauthconfig.html#cfn-amplify-app-basicauthconfig-enablebasicauth","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-basicauthconfig.html#cfn-amplify-app-basicauthconfig-password","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-basicauthconfig.html#cfn-amplify-app-basicauthconfig-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Amplify::App.CustomRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-customrule.html","Properties":{"Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-customrule.html#cfn-amplify-app-customrule-condition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-customrule.html#cfn-amplify-app-customrule-source","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-customrule.html#cfn-amplify-app-customrule-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-customrule.html#cfn-amplify-app-customrule-target","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Amplify::App.EnvironmentVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-environmentvariable.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-environmentvariable.html#cfn-amplify-app-environmentvariable-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-app-environmentvariable.html#cfn-amplify-app-environmentvariable-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Amplify::Branch.BasicAuthConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-branch-basicauthconfig.html","Properties":{"EnableBasicAuth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-branch-basicauthconfig.html#cfn-amplify-branch-basicauthconfig-enablebasicauth","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-branch-basicauthconfig.html#cfn-amplify-branch-basicauthconfig-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-branch-basicauthconfig.html#cfn-amplify-branch-basicauthconfig-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Amplify::Branch.EnvironmentVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-branch-environmentvariable.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-branch-environmentvariable.html#cfn-amplify-branch-environmentvariable-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-branch-environmentvariable.html#cfn-amplify-branch-environmentvariable-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Amplify::Domain.SubDomainSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-domain-subdomainsetting.html","Properties":{"BranchName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-domain-subdomainsetting.html#cfn-amplify-domain-subdomainsetting-branchname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplify-domain-subdomainsetting.html#cfn-amplify-domain-subdomainsetting-prefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.ActionParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html","Properties":{"Anchor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-anchor","Required":false,"Type":"ComponentProperty","UpdateType":"Mutable"},"Fields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-fields","ItemType":"ComponentProperty","Required":false,"Type":"Map","UpdateType":"Mutable"},"Global":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-global","Required":false,"Type":"ComponentProperty","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-id","Required":false,"Type":"ComponentProperty","UpdateType":"Mutable"},"Model":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-model","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-state","Required":false,"Type":"MutationActionSetStateParameter","UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-target","Required":false,"Type":"ComponentProperty","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-type","Required":false,"Type":"ComponentProperty","UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-url","Required":false,"Type":"ComponentProperty","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.ComponentBindingPropertiesValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalue.html","Properties":{"BindingProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalue.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalue-bindingproperties","Required":false,"Type":"ComponentBindingPropertiesValueProperties","UpdateType":"Mutable"},"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalue.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalue-defaultvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalue.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalue-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.ComponentBindingPropertiesValueProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-bucket","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-defaultvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-field","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Model":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-model","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Predicates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-predicates","DuplicatesAllowed":true,"ItemType":"Predicate","Required":false,"Type":"List","UpdateType":"Mutable"},"UserAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-userattribute","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.ComponentChild":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html","Properties":{"Children":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html#cfn-amplifyuibuilder-component-componentchild-children","DuplicatesAllowed":true,"ItemType":"ComponentChild","Required":false,"Type":"List","UpdateType":"Mutable"},"ComponentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html#cfn-amplifyuibuilder-component-componentchild-componenttype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Events":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html#cfn-amplifyuibuilder-component-componentchild-events","ItemType":"ComponentEvent","Required":false,"Type":"Map","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html#cfn-amplifyuibuilder-component-componentchild-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Properties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html#cfn-amplifyuibuilder-component-componentchild-properties","ItemType":"ComponentProperty","Required":true,"Type":"Map","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.ComponentConditionProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html","Properties":{"Else":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-else","Required":false,"Type":"ComponentProperty","UpdateType":"Mutable"},"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-field","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Operand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-operand","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OperandType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-operandtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Operator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-operator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Property":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-property","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Then":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-then","Required":false,"Type":"ComponentProperty","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.ComponentDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentdataconfiguration.html","Properties":{"Identifiers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentdataconfiguration.html#cfn-amplifyuibuilder-component-componentdataconfiguration-identifiers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Model":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentdataconfiguration.html#cfn-amplifyuibuilder-component-componentdataconfiguration-model","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Predicate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentdataconfiguration.html#cfn-amplifyuibuilder-component-componentdataconfiguration-predicate","Required":false,"Type":"Predicate","UpdateType":"Mutable"},"Sort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentdataconfiguration.html#cfn-amplifyuibuilder-component-componentdataconfiguration-sort","DuplicatesAllowed":true,"ItemType":"SortProperty","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.ComponentEvent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentevent.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentevent.html#cfn-amplifyuibuilder-component-componentevent-action","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentevent.html#cfn-amplifyuibuilder-component-componentevent-parameters","Required":false,"Type":"ActionParameters","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.ComponentProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html","Properties":{"BindingProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-bindingproperties","Required":false,"Type":"ComponentPropertyBindingProperties","UpdateType":"Mutable"},"Bindings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-bindings","ItemType":"FormBindingElement","Required":false,"Type":"Map","UpdateType":"Mutable"},"CollectionBindingProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-collectionbindingproperties","Required":false,"Type":"ComponentPropertyBindingProperties","UpdateType":"Mutable"},"ComponentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-componentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Concat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-concat","DuplicatesAllowed":true,"ItemType":"ComponentProperty","Required":false,"Type":"List","UpdateType":"Mutable"},"Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-condition","Required":false,"Type":"ComponentConditionProperty","UpdateType":"Mutable"},"Configured":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-configured","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-defaultvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Event":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-event","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImportedValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-importedvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Model":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-model","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Property":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-property","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-userattribute","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.ComponentPropertyBindingProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentpropertybindingproperties.html","Properties":{"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentpropertybindingproperties.html#cfn-amplifyuibuilder-component-componentpropertybindingproperties-field","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Property":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentpropertybindingproperties.html#cfn-amplifyuibuilder-component-componentpropertybindingproperties-property","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.ComponentVariant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentvariant.html","Properties":{"Overrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentvariant.html#cfn-amplifyuibuilder-component-componentvariant-overrides","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"VariantValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentvariant.html#cfn-amplifyuibuilder-component-componentvariant-variantvalues","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.FormBindingElement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-formbindingelement.html","Properties":{"Element":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-formbindingelement.html#cfn-amplifyuibuilder-component-formbindingelement-element","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Property":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-formbindingelement.html#cfn-amplifyuibuilder-component-formbindingelement-property","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.MutationActionSetStateParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-mutationactionsetstateparameter.html","Properties":{"ComponentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-mutationactionsetstateparameter.html#cfn-amplifyuibuilder-component-mutationactionsetstateparameter-componentname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Property":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-mutationactionsetstateparameter.html#cfn-amplifyuibuilder-component-mutationactionsetstateparameter-property","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Set":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-mutationactionsetstateparameter.html#cfn-amplifyuibuilder-component-mutationactionsetstateparameter-set","Required":true,"Type":"ComponentProperty","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.Predicate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html","Properties":{"And":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html#cfn-amplifyuibuilder-component-predicate-and","DuplicatesAllowed":true,"ItemType":"Predicate","Required":false,"Type":"List","UpdateType":"Mutable"},"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html#cfn-amplifyuibuilder-component-predicate-field","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Operand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html#cfn-amplifyuibuilder-component-predicate-operand","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Operator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html#cfn-amplifyuibuilder-component-predicate-operator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Or":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html#cfn-amplifyuibuilder-component-predicate-or","DuplicatesAllowed":true,"ItemType":"Predicate","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component.SortProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-sortproperty.html","Properties":{"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-sortproperty.html#cfn-amplifyuibuilder-component-sortproperty-direction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-sortproperty.html#cfn-amplifyuibuilder-component-sortproperty-field","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.FieldConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldconfig.html","Properties":{"Excluded":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldconfig.html#cfn-amplifyuibuilder-form-fieldconfig-excluded","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InputType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldconfig.html#cfn-amplifyuibuilder-form-fieldconfig-inputtype","Required":false,"Type":"FieldInputConfig","UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldconfig.html#cfn-amplifyuibuilder-form-fieldconfig-label","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldconfig.html#cfn-amplifyuibuilder-form-fieldconfig-position","Required":false,"Type":"FieldPosition","UpdateType":"Mutable"},"Validations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldconfig.html#cfn-amplifyuibuilder-form-fieldconfig-validations","DuplicatesAllowed":true,"ItemType":"FieldValidationConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.FieldInputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html","Properties":{"DefaultChecked":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-defaultchecked","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DefaultCountryCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-defaultcountrycode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-defaultvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DescriptiveText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-descriptivetext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FileUploaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-fileuploaderconfig","Required":false,"Type":"FileUploaderFieldConfig","UpdateType":"Mutable"},"IsArray":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-isarray","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-maxvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MinValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-minvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Placeholder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-placeholder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReadOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-readonly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Required":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-required","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Step":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-step","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldinputconfig.html#cfn-amplifyuibuilder-form-fieldinputconfig-valuemappings","Required":false,"Type":"ValueMappings","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.FieldPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldposition.html","Properties":{"Below":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldposition.html#cfn-amplifyuibuilder-form-fieldposition-below","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Fixed":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldposition.html#cfn-amplifyuibuilder-form-fieldposition-fixed","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RightOf":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldposition.html#cfn-amplifyuibuilder-form-fieldposition-rightof","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.FieldValidationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldvalidationconfiguration.html","Properties":{"NumValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldvalidationconfiguration.html#cfn-amplifyuibuilder-form-fieldvalidationconfiguration-numvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"},"StrValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldvalidationconfiguration.html#cfn-amplifyuibuilder-form-fieldvalidationconfiguration-strvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldvalidationconfiguration.html#cfn-amplifyuibuilder-form-fieldvalidationconfiguration-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValidationMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fieldvalidationconfiguration.html#cfn-amplifyuibuilder-form-fieldvalidationconfiguration-validationmessage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.FileUploaderFieldConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fileuploaderfieldconfig.html","Properties":{"AcceptedFileTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fileuploaderfieldconfig.html#cfn-amplifyuibuilder-form-fileuploaderfieldconfig-acceptedfiletypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"AccessLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fileuploaderfieldconfig.html#cfn-amplifyuibuilder-form-fileuploaderfieldconfig-accesslevel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IsResumable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fileuploaderfieldconfig.html#cfn-amplifyuibuilder-form-fileuploaderfieldconfig-isresumable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxFileCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fileuploaderfieldconfig.html#cfn-amplifyuibuilder-form-fileuploaderfieldconfig-maxfilecount","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaxSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fileuploaderfieldconfig.html#cfn-amplifyuibuilder-form-fileuploaderfieldconfig-maxsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ShowThumbnails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-fileuploaderfieldconfig.html#cfn-amplifyuibuilder-form-fileuploaderfieldconfig-showthumbnails","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.FormButton":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formbutton.html","Properties":{"Children":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formbutton.html#cfn-amplifyuibuilder-form-formbutton-children","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Excluded":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formbutton.html#cfn-amplifyuibuilder-form-formbutton-excluded","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formbutton.html#cfn-amplifyuibuilder-form-formbutton-position","Required":false,"Type":"FieldPosition","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.FormCTA":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formcta.html","Properties":{"Cancel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formcta.html#cfn-amplifyuibuilder-form-formcta-cancel","Required":false,"Type":"FormButton","UpdateType":"Mutable"},"Clear":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formcta.html#cfn-amplifyuibuilder-form-formcta-clear","Required":false,"Type":"FormButton","UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formcta.html#cfn-amplifyuibuilder-form-formcta-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Submit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formcta.html#cfn-amplifyuibuilder-form-formcta-submit","Required":false,"Type":"FormButton","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.FormDataTypeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formdatatypeconfig.html","Properties":{"DataSourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formdatatypeconfig.html#cfn-amplifyuibuilder-form-formdatatypeconfig-datasourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataTypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formdatatypeconfig.html#cfn-amplifyuibuilder-form-formdatatypeconfig-datatypename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.FormInputValueProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-forminputvalueproperty.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-forminputvalueproperty.html#cfn-amplifyuibuilder-form-forminputvalueproperty-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.FormStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formstyle.html","Properties":{"HorizontalGap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formstyle.html#cfn-amplifyuibuilder-form-formstyle-horizontalgap","Required":false,"Type":"FormStyleConfig","UpdateType":"Mutable"},"OuterPadding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formstyle.html#cfn-amplifyuibuilder-form-formstyle-outerpadding","Required":false,"Type":"FormStyleConfig","UpdateType":"Mutable"},"VerticalGap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formstyle.html#cfn-amplifyuibuilder-form-formstyle-verticalgap","Required":false,"Type":"FormStyleConfig","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.FormStyleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formstyleconfig.html","Properties":{"TokenReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formstyleconfig.html#cfn-amplifyuibuilder-form-formstyleconfig-tokenreference","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-formstyleconfig.html#cfn-amplifyuibuilder-form-formstyleconfig-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.SectionalElement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-sectionalelement.html","Properties":{"Excluded":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-sectionalelement.html#cfn-amplifyuibuilder-form-sectionalelement-excluded","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Level":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-sectionalelement.html#cfn-amplifyuibuilder-form-sectionalelement-level","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Orientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-sectionalelement.html#cfn-amplifyuibuilder-form-sectionalelement-orientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-sectionalelement.html#cfn-amplifyuibuilder-form-sectionalelement-position","Required":false,"Type":"FieldPosition","UpdateType":"Mutable"},"Text":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-sectionalelement.html#cfn-amplifyuibuilder-form-sectionalelement-text","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-sectionalelement.html#cfn-amplifyuibuilder-form-sectionalelement-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.ValueMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-valuemapping.html","Properties":{"DisplayValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-valuemapping.html#cfn-amplifyuibuilder-form-valuemapping-displayvalue","Required":false,"Type":"FormInputValueProperty","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-valuemapping.html#cfn-amplifyuibuilder-form-valuemapping-value","Required":true,"Type":"FormInputValueProperty","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form.ValueMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-valuemappings.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-form-valuemappings.html#cfn-amplifyuibuilder-form-valuemappings-values","DuplicatesAllowed":true,"ItemType":"ValueMapping","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Theme.ThemeValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalue.html","Properties":{"Children":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalue.html#cfn-amplifyuibuilder-theme-themevalue-children","DuplicatesAllowed":true,"ItemType":"ThemeValues","Required":false,"Type":"List","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalue.html#cfn-amplifyuibuilder-theme-themevalue-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Theme.ThemeValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalues.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalues.html#cfn-amplifyuibuilder-theme-themevalues-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalues.html#cfn-amplifyuibuilder-theme-themevalues-value","Required":false,"Type":"ThemeValue","UpdateType":"Mutable"}}},"AWS::ApiGateway::ApiKey.StageKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-apikey-stagekey.html","Properties":{"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-apikey-stagekey.html#cfn-apigateway-apikey-stagekey-restapiid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-apikey-stagekey.html#cfn-apigateway-apikey-stagekey-stagename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Deployment.AccessLogSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-accesslogsetting.html","Properties":{"DestinationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-accesslogsetting.html#cfn-apigateway-deployment-accesslogsetting-destinationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-accesslogsetting.html#cfn-apigateway-deployment-accesslogsetting-format","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Deployment.CanarySetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-canarysetting.html","Properties":{"PercentTraffic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-canarysetting.html#cfn-apigateway-deployment-canarysetting-percenttraffic","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"StageVariableOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-canarysetting.html#cfn-apigateway-deployment-canarysetting-stagevariableoverrides","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"UseStageCache":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-canarysetting.html#cfn-apigateway-deployment-canarysetting-usestagecache","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Deployment.DeploymentCanarySettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-deploymentcanarysettings.html","Properties":{"PercentTraffic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-deploymentcanarysettings.html#cfn-apigateway-deployment-deploymentcanarysettings-percenttraffic","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"StageVariableOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-deploymentcanarysettings.html#cfn-apigateway-deployment-deploymentcanarysettings-stagevariableoverrides","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"UseStageCache":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-deploymentcanarysettings.html#cfn-apigateway-deployment-deploymentcanarysettings-usestagecache","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::ApiGateway::Deployment.MethodSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html","Properties":{"CacheDataEncrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-cachedataencrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CacheTtlInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-cachettlinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CachingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-cachingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DataTraceEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-datatraceenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HttpMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-httpmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoggingLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-logginglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-metricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ResourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-resourcepath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThrottlingBurstLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-throttlingburstlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ThrottlingRateLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-throttlingratelimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Deployment.StageDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html","Properties":{"AccessLogSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-accesslogsetting","Required":false,"Type":"AccessLogSetting","UpdateType":"Mutable"},"CacheClusterEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-cacheclusterenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CacheClusterSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-cacheclustersize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CacheDataEncrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-cachedataencrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CacheTtlInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-cachettlinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CachingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-cachingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CanarySetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-canarysetting","Required":false,"Type":"CanarySetting","UpdateType":"Mutable"},"ClientCertificateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-clientcertificateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataTraceEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-datatraceenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentationVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-documentationversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoggingLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-logginglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MethodSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-methodsettings","DuplicatesAllowed":false,"ItemType":"MethodSetting","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-metricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ThrottlingBurstLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-throttlingburstlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ThrottlingRateLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-throttlingratelimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TracingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-tracingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Variables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-variables","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::ApiGateway::DocumentationPart.Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-documentationpart-location.html","Properties":{"Method":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-documentationpart-location.html#cfn-apigateway-documentationpart-location-method","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-documentationpart-location.html#cfn-apigateway-documentationpart-location-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-documentationpart-location.html#cfn-apigateway-documentationpart-location-path","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-documentationpart-location.html#cfn-apigateway-documentationpart-location-statuscode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-documentationpart-location.html#cfn-apigateway-documentationpart-location-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ApiGateway::DomainName.EndpointConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-domainname-endpointconfiguration.html","Properties":{"Types":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-domainname-endpointconfiguration.html#cfn-apigateway-domainname-endpointconfiguration-types","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApiGateway::DomainName.MutualTlsAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-domainname-mutualtlsauthentication.html","Properties":{"TruststoreUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-domainname-mutualtlsauthentication.html#cfn-apigateway-domainname-mutualtlsauthentication-truststoreuri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TruststoreVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-domainname-mutualtlsauthentication.html#cfn-apigateway-domainname-mutualtlsauthentication-truststoreversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Method.Integration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html","Properties":{"CacheKeyParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-cachekeyparameters","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CacheNamespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-cachenamespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-connectionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-connectiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContentHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-contenthandling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Credentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-credentials","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegrationHttpMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-integrationhttpmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegrationResponses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-integrationresponses","DuplicatesAllowed":false,"ItemType":"IntegrationResponse","Required":false,"Type":"List","UpdateType":"Mutable"},"PassthroughBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-passthroughbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RequestParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-requestparameters","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"RequestTemplates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-requesttemplates","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"TimeoutInMillis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-timeoutinmillis","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration.html#cfn-apigateway-method-integration-uri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Method.IntegrationResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration-integrationresponse.html","Properties":{"ContentHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration-integrationresponse.html#cfn-apigateway-method-integrationresponse-contenthandling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration-integrationresponse.html#cfn-apigateway-method-integration-integrationresponse-responseparameters","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"ResponseTemplates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration-integrationresponse.html#cfn-apigateway-method-integration-integrationresponse-responsetemplates","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"SelectionPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration-integrationresponse.html#cfn-apigateway-method-integration-integrationresponse-selectionpattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-integration-integrationresponse.html#cfn-apigateway-method-integration-integrationresponse-statuscode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Method.MethodResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-methodresponse.html","Properties":{"ResponseModels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-methodresponse.html#cfn-apigateway-method-methodresponse-responsemodels","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"ResponseParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-methodresponse.html#cfn-apigateway-method-methodresponse-responseparameters","DuplicatesAllowed":false,"PrimitiveItemType":"Boolean","Required":false,"Type":"Map","UpdateType":"Mutable"},"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-method-methodresponse.html#cfn-apigateway-method-methodresponse-statuscode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApiGateway::RestApi.EndpointConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-restapi-endpointconfiguration.html","Properties":{"Types":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-restapi-endpointconfiguration.html#cfn-apigateway-restapi-endpointconfiguration-types","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcEndpointIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-restapi-endpointconfiguration.html#cfn-apigateway-restapi-endpointconfiguration-vpcendpointids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApiGateway::RestApi.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-restapi-s3location.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-restapi-s3location.html#cfn-apigateway-restapi-s3location-bucket","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ETag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-restapi-s3location.html#cfn-apigateway-restapi-s3location-etag","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-restapi-s3location.html#cfn-apigateway-restapi-s3location-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-restapi-s3location.html#cfn-apigateway-restapi-s3location-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Stage.AccessLogSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-accesslogsetting.html","Properties":{"DestinationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-accesslogsetting.html#cfn-apigateway-stage-accesslogsetting-destinationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-accesslogsetting.html#cfn-apigateway-stage-accesslogsetting-format","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Stage.CanarySetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-canarysetting.html","Properties":{"DeploymentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-canarysetting.html#cfn-apigateway-stage-canarysetting-deploymentid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PercentTraffic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-canarysetting.html#cfn-apigateway-stage-canarysetting-percenttraffic","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"StageVariableOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-canarysetting.html#cfn-apigateway-stage-canarysetting-stagevariableoverrides","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"UseStageCache":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-canarysetting.html#cfn-apigateway-stage-canarysetting-usestagecache","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Stage.MethodSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html","Properties":{"CacheDataEncrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-cachedataencrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CacheTtlInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-cachettlinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CachingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-cachingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DataTraceEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-datatraceenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HttpMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-httpmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoggingLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-logginglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-metricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ResourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-resourcepath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThrottlingBurstLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-throttlingburstlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ThrottlingRateLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-throttlingratelimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::UsagePlan.ApiStage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-usageplan-apistage.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-usageplan-apistage.html#cfn-apigateway-usageplan-apistage-apiid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Stage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-usageplan-apistage.html#cfn-apigateway-usageplan-apistage-stage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Throttle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-usageplan-apistage.html#cfn-apigateway-usageplan-apistage-throttle","ItemType":"ThrottleSettings","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::ApiGateway::UsagePlan.QuotaSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-usageplan-quotasettings.html","Properties":{"Limit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-usageplan-quotasettings.html#cfn-apigateway-usageplan-quotasettings-limit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Offset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-usageplan-quotasettings.html#cfn-apigateway-usageplan-quotasettings-offset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Period":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-usageplan-quotasettings.html#cfn-apigateway-usageplan-quotasettings-period","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::UsagePlan.ThrottleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-usageplan-throttlesettings.html","Properties":{"BurstLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-usageplan-throttlesettings.html#cfn-apigateway-usageplan-throttlesettings-burstlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RateLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-usageplan-throttlesettings.html#cfn-apigateway-usageplan-throttlesettings-ratelimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Api.BodyS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-bodys3location.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-bodys3location.html#cfn-apigatewayv2-api-bodys3location-bucket","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Etag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-bodys3location.html#cfn-apigatewayv2-api-bodys3location-etag","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-bodys3location.html#cfn-apigatewayv2-api-bodys3location-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-bodys3location.html#cfn-apigatewayv2-api-bodys3location-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Api.Cors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-cors.html","Properties":{"AllowCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-cors.html#cfn-apigatewayv2-api-cors-allowcredentials","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AllowHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-cors.html#cfn-apigatewayv2-api-cors-allowheaders","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AllowMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-cors.html#cfn-apigatewayv2-api-cors-allowmethods","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AllowOrigins":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-cors.html#cfn-apigatewayv2-api-cors-alloworigins","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ExposeHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-cors.html#cfn-apigatewayv2-api-cors-exposeheaders","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MaxAge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-api-cors.html#cfn-apigatewayv2-api-cors-maxage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides.AccessLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-accesslogsettings.html","Properties":{"DestinationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-accesslogsettings.html#cfn-apigatewayv2-apigatewaymanagedoverrides-accesslogsettings-destinationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-accesslogsettings.html#cfn-apigatewayv2-apigatewaymanagedoverrides-accesslogsettings-format","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides.IntegrationOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-integrationoverrides.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-integrationoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-integrationoverrides-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegrationMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-integrationoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-integrationoverrides-integrationmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PayloadFormatVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-integrationoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-integrationoverrides-payloadformatversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeoutInMillis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-integrationoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-integrationoverrides-timeoutinmillis","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides.RouteOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routeoverrides.html","Properties":{"AuthorizationScopes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routeoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-routeoverrides-authorizationscopes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AuthorizationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routeoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-routeoverrides-authorizationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthorizerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routeoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-routeoverrides-authorizerid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OperationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routeoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-routeoverrides-operationname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routeoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-routeoverrides-target","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides.RouteSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routesettings.html","Properties":{"DataTraceEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routesettings.html#cfn-apigatewayv2-apigatewaymanagedoverrides-routesettings-datatraceenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DetailedMetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routesettings.html#cfn-apigatewayv2-apigatewaymanagedoverrides-routesettings-detailedmetricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LoggingLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routesettings.html#cfn-apigatewayv2-apigatewaymanagedoverrides-routesettings-logginglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThrottlingBurstLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routesettings.html#cfn-apigatewayv2-apigatewaymanagedoverrides-routesettings-throttlingburstlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ThrottlingRateLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-routesettings.html#cfn-apigatewayv2-apigatewaymanagedoverrides-routesettings-throttlingratelimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides.StageOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-stageoverrides.html","Properties":{"AccessLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-stageoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-stageoverrides-accesslogsettings","Required":false,"Type":"AccessLogSettings","UpdateType":"Mutable"},"AutoDeploy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-stageoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-stageoverrides-autodeploy","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DefaultRouteSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-stageoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-stageoverrides-defaultroutesettings","Required":false,"Type":"RouteSettings","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-stageoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-stageoverrides-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RouteSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-stageoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-stageoverrides-routesettings","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"StageVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-apigatewaymanagedoverrides-stageoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-stageoverrides-stagevariables","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Authorizer.JWTConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-authorizer-jwtconfiguration.html","Properties":{"Audience":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-authorizer-jwtconfiguration.html#cfn-apigatewayv2-authorizer-jwtconfiguration-audience","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Issuer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-authorizer-jwtconfiguration.html#cfn-apigatewayv2-authorizer-jwtconfiguration-issuer","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::DomainName.DomainNameConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-domainnameconfiguration.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-domainnameconfiguration.html#cfn-apigatewayv2-domainname-domainnameconfiguration-certificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CertificateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-domainnameconfiguration.html#cfn-apigatewayv2-domainname-domainnameconfiguration-certificatename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-domainnameconfiguration.html#cfn-apigatewayv2-domainname-domainnameconfiguration-endpointtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OwnershipVerificationCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-domainnameconfiguration.html#cfn-apigatewayv2-domainname-domainnameconfiguration-ownershipverificationcertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-domainnameconfiguration.html#cfn-apigatewayv2-domainname-domainnameconfiguration-securitypolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::DomainName.MutualTlsAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-mutualtlsauthentication.html","Properties":{"TruststoreUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-mutualtlsauthentication.html#cfn-apigatewayv2-domainname-mutualtlsauthentication-truststoreuri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TruststoreVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-mutualtlsauthentication.html#cfn-apigatewayv2-domainname-mutualtlsauthentication-truststoreversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Integration.ResponseParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-integration-responseparameter.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-integration-responseparameter.html#cfn-apigatewayv2-integration-responseparameter-destination","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-integration-responseparameter.html#cfn-apigatewayv2-integration-responseparameter-source","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Integration.ResponseParameterList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-integration-responseparameterlist.html","Properties":{"ResponseParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-integration-responseparameterlist.html#cfn-apigatewayv2-integration-responseparameterlist-responseparameters","ItemType":"ResponseParameter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Integration.TlsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-integration-tlsconfig.html","Properties":{"ServerNameToVerify":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-integration-tlsconfig.html#cfn-apigatewayv2-integration-tlsconfig-servernametoverify","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Route.ParameterConstraints":{"Properties":{"Required":{"PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::RouteResponse.ParameterConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-routeresponse-parameterconstraints.html","Properties":{"Required":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-routeresponse-parameterconstraints.html#cfn-apigatewayv2-routeresponse-parameterconstraints-required","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Stage.AccessLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-accesslogsettings.html","Properties":{"DestinationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-accesslogsettings.html#cfn-apigatewayv2-stage-accesslogsettings-destinationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-accesslogsettings.html#cfn-apigatewayv2-stage-accesslogsettings-format","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Stage.RouteSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html","Properties":{"DataTraceEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-datatraceenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DetailedMetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-detailedmetricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LoggingLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-logginglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThrottlingBurstLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-throttlingburstlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ThrottlingRateLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-throttlingratelimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::AppConfig::Application.Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-application-tags.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-application-tags.html#cfn-appconfig-application-tags-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-application-tags.html#cfn-appconfig-application-tags-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppConfig::ConfigurationProfile.Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-configurationprofile-tags.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-configurationprofile-tags.html#cfn-appconfig-configurationprofile-tags-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-configurationprofile-tags.html#cfn-appconfig-configurationprofile-tags-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppConfig::ConfigurationProfile.Validators":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-configurationprofile-validators.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-configurationprofile-validators.html#cfn-appconfig-configurationprofile-validators-content","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-configurationprofile-validators.html#cfn-appconfig-configurationprofile-validators-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppConfig::Deployment.Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-deployment-tags.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-deployment-tags.html#cfn-appconfig-deployment-tags-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-deployment-tags.html#cfn-appconfig-deployment-tags-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppConfig::DeploymentStrategy.Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-deploymentstrategy-tags.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-deploymentstrategy-tags.html#cfn-appconfig-deploymentstrategy-tags-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-deploymentstrategy-tags.html#cfn-appconfig-deploymentstrategy-tags-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppConfig::Environment.Monitors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-environment-monitors.html","Properties":{"AlarmArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-environment-monitors.html#cfn-appconfig-environment-monitors-alarmarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlarmRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-environment-monitors.html#cfn-appconfig-environment-monitors-alarmrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppConfig::Environment.Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-environment-tags.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-environment-tags.html#cfn-appconfig-environment-tags-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-environment-tags.html#cfn-appconfig-environment-tags-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppConfig::Extension.Parameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-extension-parameter.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-extension-parameter.html#cfn-appconfig-extension-parameter-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Required":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appconfig-extension-parameter.html#cfn-appconfig-extension-parameter-required","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Connector.ConnectorProvisioningConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connector-connectorprovisioningconfig.html","Properties":{"Lambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connector-connectorprovisioningconfig.html#cfn-appflow-connector-connectorprovisioningconfig-lambda","Required":false,"Type":"LambdaConnectorProvisioningConfig","UpdateType":"Mutable"}}},"AWS::AppFlow::Connector.LambdaConnectorProvisioningConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connector-lambdaconnectorprovisioningconfig.html","Properties":{"LambdaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connector-lambdaconnectorprovisioningconfig.html#cfn-appflow-connector-lambdaconnectorprovisioningconfig-lambdaarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.AmplitudeConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-amplitudeconnectorprofilecredentials.html","Properties":{"ApiKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-amplitudeconnectorprofilecredentials.html#cfn-appflow-connectorprofile-amplitudeconnectorprofilecredentials-apikey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecretKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-amplitudeconnectorprofilecredentials.html#cfn-appflow-connectorprofile-amplitudeconnectorprofilecredentials-secretkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.ApiKeyCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-apikeycredentials.html","Properties":{"ApiKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-apikeycredentials.html#cfn-appflow-connectorprofile-apikeycredentials-apikey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ApiSecretKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-apikeycredentials.html#cfn-appflow-connectorprofile-apikeycredentials-apisecretkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.BasicAuthCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-basicauthcredentials.html","Properties":{"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-basicauthcredentials.html#cfn-appflow-connectorprofile-basicauthcredentials-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-basicauthcredentials.html#cfn-appflow-connectorprofile-basicauthcredentials-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.ConnectorOAuthRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectoroauthrequest.html","Properties":{"AuthCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectoroauthrequest.html#cfn-appflow-connectorprofile-connectoroauthrequest-authcode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RedirectUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectoroauthrequest.html#cfn-appflow-connectorprofile-connectoroauthrequest-redirecturi","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.ConnectorProfileConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileconfig.html","Properties":{"ConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileconfig.html#cfn-appflow-connectorprofile-connectorprofileconfig-connectorprofilecredentials","Required":false,"Type":"ConnectorProfileCredentials","UpdateType":"Mutable"},"ConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileconfig.html#cfn-appflow-connectorprofile-connectorprofileconfig-connectorprofileproperties","Required":false,"Type":"ConnectorProfileProperties","UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.ConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html","Properties":{"Amplitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-amplitude","Required":false,"Type":"AmplitudeConnectorProfileCredentials","UpdateType":"Mutable"},"CustomConnector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-customconnector","Required":false,"Type":"CustomConnectorProfileCredentials","UpdateType":"Mutable"},"Datadog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-datadog","Required":false,"Type":"DatadogConnectorProfileCredentials","UpdateType":"Mutable"},"Dynatrace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-dynatrace","Required":false,"Type":"DynatraceConnectorProfileCredentials","UpdateType":"Mutable"},"GoogleAnalytics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-googleanalytics","Required":false,"Type":"GoogleAnalyticsConnectorProfileCredentials","UpdateType":"Mutable"},"InforNexus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-infornexus","Required":false,"Type":"InforNexusConnectorProfileCredentials","UpdateType":"Mutable"},"Marketo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-marketo","Required":false,"Type":"MarketoConnectorProfileCredentials","UpdateType":"Mutable"},"Pardot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-pardot","Required":false,"Type":"PardotConnectorProfileCredentials","UpdateType":"Mutable"},"Redshift":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-redshift","Required":false,"Type":"RedshiftConnectorProfileCredentials","UpdateType":"Mutable"},"SAPOData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-sapodata","Required":false,"Type":"SAPODataConnectorProfileCredentials","UpdateType":"Mutable"},"Salesforce":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-salesforce","Required":false,"Type":"SalesforceConnectorProfileCredentials","UpdateType":"Mutable"},"ServiceNow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-servicenow","Required":false,"Type":"ServiceNowConnectorProfileCredentials","UpdateType":"Mutable"},"Singular":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-singular","Required":false,"Type":"SingularConnectorProfileCredentials","UpdateType":"Mutable"},"Slack":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-slack","Required":false,"Type":"SlackConnectorProfileCredentials","UpdateType":"Mutable"},"Snowflake":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-snowflake","Required":false,"Type":"SnowflakeConnectorProfileCredentials","UpdateType":"Mutable"},"Trendmicro":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-trendmicro","Required":false,"Type":"TrendmicroConnectorProfileCredentials","UpdateType":"Mutable"},"Veeva":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-veeva","Required":false,"Type":"VeevaConnectorProfileCredentials","UpdateType":"Mutable"},"Zendesk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-zendesk","Required":false,"Type":"ZendeskConnectorProfileCredentials","UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.ConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html","Properties":{"CustomConnector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-customconnector","Required":false,"Type":"CustomConnectorProfileProperties","UpdateType":"Mutable"},"Datadog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-datadog","Required":false,"Type":"DatadogConnectorProfileProperties","UpdateType":"Mutable"},"Dynatrace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-dynatrace","Required":false,"Type":"DynatraceConnectorProfileProperties","UpdateType":"Mutable"},"InforNexus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-infornexus","Required":false,"Type":"InforNexusConnectorProfileProperties","UpdateType":"Mutable"},"Marketo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-marketo","Required":false,"Type":"MarketoConnectorProfileProperties","UpdateType":"Mutable"},"Pardot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-pardot","Required":false,"Type":"PardotConnectorProfileProperties","UpdateType":"Mutable"},"Redshift":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-redshift","Required":false,"Type":"RedshiftConnectorProfileProperties","UpdateType":"Mutable"},"SAPOData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-sapodata","Required":false,"Type":"SAPODataConnectorProfileProperties","UpdateType":"Mutable"},"Salesforce":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-salesforce","Required":false,"Type":"SalesforceConnectorProfileProperties","UpdateType":"Mutable"},"ServiceNow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-servicenow","Required":false,"Type":"ServiceNowConnectorProfileProperties","UpdateType":"Mutable"},"Slack":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-slack","Required":false,"Type":"SlackConnectorProfileProperties","UpdateType":"Mutable"},"Snowflake":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-snowflake","Required":false,"Type":"SnowflakeConnectorProfileProperties","UpdateType":"Mutable"},"Veeva":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-veeva","Required":false,"Type":"VeevaConnectorProfileProperties","UpdateType":"Mutable"},"Zendesk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-zendesk","Required":false,"Type":"ZendeskConnectorProfileProperties","UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.CustomAuthCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customauthcredentials.html","Properties":{"CredentialsMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customauthcredentials.html#cfn-appflow-connectorprofile-customauthcredentials-credentialsmap","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"CustomAuthenticationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customauthcredentials.html#cfn-appflow-connectorprofile-customauthcredentials-customauthenticationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.CustomConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customconnectorprofilecredentials.html","Properties":{"ApiKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customconnectorprofilecredentials.html#cfn-appflow-connectorprofile-customconnectorprofilecredentials-apikey","Required":false,"Type":"ApiKeyCredentials","UpdateType":"Mutable"},"AuthenticationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customconnectorprofilecredentials.html#cfn-appflow-connectorprofile-customconnectorprofilecredentials-authenticationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Basic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customconnectorprofilecredentials.html#cfn-appflow-connectorprofile-customconnectorprofilecredentials-basic","Required":false,"Type":"BasicAuthCredentials","UpdateType":"Mutable"},"Custom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customconnectorprofilecredentials.html#cfn-appflow-connectorprofile-customconnectorprofilecredentials-custom","Required":false,"Type":"CustomAuthCredentials","UpdateType":"Mutable"},"Oauth2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customconnectorprofilecredentials.html#cfn-appflow-connectorprofile-customconnectorprofilecredentials-oauth2","Required":false,"Type":"OAuth2Credentials","UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.CustomConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customconnectorprofileproperties.html","Properties":{"OAuth2Properties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customconnectorprofileproperties.html#cfn-appflow-connectorprofile-customconnectorprofileproperties-oauth2properties","Required":false,"Type":"OAuth2Properties","UpdateType":"Mutable"},"ProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-customconnectorprofileproperties.html#cfn-appflow-connectorprofile-customconnectorprofileproperties-profileproperties","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.DatadogConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-datadogconnectorprofilecredentials.html","Properties":{"ApiKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-datadogconnectorprofilecredentials.html#cfn-appflow-connectorprofile-datadogconnectorprofilecredentials-apikey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ApplicationKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-datadogconnectorprofilecredentials.html#cfn-appflow-connectorprofile-datadogconnectorprofilecredentials-applicationkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.DatadogConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-datadogconnectorprofileproperties.html","Properties":{"InstanceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-datadogconnectorprofileproperties.html#cfn-appflow-connectorprofile-datadogconnectorprofileproperties-instanceurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.DynatraceConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-dynatraceconnectorprofilecredentials.html","Properties":{"ApiToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-dynatraceconnectorprofilecredentials.html#cfn-appflow-connectorprofile-dynatraceconnectorprofilecredentials-apitoken","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.DynatraceConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-dynatraceconnectorprofileproperties.html","Properties":{"InstanceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-dynatraceconnectorprofileproperties.html#cfn-appflow-connectorprofile-dynatraceconnectorprofileproperties-instanceurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.GoogleAnalyticsConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-googleanalyticsconnectorprofilecredentials.html","Properties":{"AccessToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-googleanalyticsconnectorprofilecredentials.html#cfn-appflow-connectorprofile-googleanalyticsconnectorprofilecredentials-accesstoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-googleanalyticsconnectorprofilecredentials.html#cfn-appflow-connectorprofile-googleanalyticsconnectorprofilecredentials-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-googleanalyticsconnectorprofilecredentials.html#cfn-appflow-connectorprofile-googleanalyticsconnectorprofilecredentials-clientsecret","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConnectorOAuthRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-googleanalyticsconnectorprofilecredentials.html#cfn-appflow-connectorprofile-googleanalyticsconnectorprofilecredentials-connectoroauthrequest","Required":false,"Type":"ConnectorOAuthRequest","UpdateType":"Mutable"},"RefreshToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-googleanalyticsconnectorprofilecredentials.html#cfn-appflow-connectorprofile-googleanalyticsconnectorprofilecredentials-refreshtoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.InforNexusConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-infornexusconnectorprofilecredentials.html","Properties":{"AccessKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-infornexusconnectorprofilecredentials.html#cfn-appflow-connectorprofile-infornexusconnectorprofilecredentials-accesskeyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Datakey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-infornexusconnectorprofilecredentials.html#cfn-appflow-connectorprofile-infornexusconnectorprofilecredentials-datakey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecretAccessKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-infornexusconnectorprofilecredentials.html#cfn-appflow-connectorprofile-infornexusconnectorprofilecredentials-secretaccesskey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UserId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-infornexusconnectorprofilecredentials.html#cfn-appflow-connectorprofile-infornexusconnectorprofilecredentials-userid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.InforNexusConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-infornexusconnectorprofileproperties.html","Properties":{"InstanceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-infornexusconnectorprofileproperties.html#cfn-appflow-connectorprofile-infornexusconnectorprofileproperties-instanceurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.MarketoConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-marketoconnectorprofilecredentials.html","Properties":{"AccessToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-marketoconnectorprofilecredentials.html#cfn-appflow-connectorprofile-marketoconnectorprofilecredentials-accesstoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-marketoconnectorprofilecredentials.html#cfn-appflow-connectorprofile-marketoconnectorprofilecredentials-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-marketoconnectorprofilecredentials.html#cfn-appflow-connectorprofile-marketoconnectorprofilecredentials-clientsecret","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConnectorOAuthRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-marketoconnectorprofilecredentials.html#cfn-appflow-connectorprofile-marketoconnectorprofilecredentials-connectoroauthrequest","Required":false,"Type":"ConnectorOAuthRequest","UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.MarketoConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-marketoconnectorprofileproperties.html","Properties":{"InstanceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-marketoconnectorprofileproperties.html#cfn-appflow-connectorprofile-marketoconnectorprofileproperties-instanceurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.OAuth2Credentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauth2credentials.html","Properties":{"AccessToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauth2credentials.html#cfn-appflow-connectorprofile-oauth2credentials-accesstoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauth2credentials.html#cfn-appflow-connectorprofile-oauth2credentials-clientid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauth2credentials.html#cfn-appflow-connectorprofile-oauth2credentials-clientsecret","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OAuthRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauth2credentials.html#cfn-appflow-connectorprofile-oauth2credentials-oauthrequest","Required":false,"Type":"ConnectorOAuthRequest","UpdateType":"Mutable"},"RefreshToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauth2credentials.html#cfn-appflow-connectorprofile-oauth2credentials-refreshtoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.OAuth2Properties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauth2properties.html","Properties":{"OAuth2GrantType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauth2properties.html#cfn-appflow-connectorprofile-oauth2properties-oauth2granttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauth2properties.html#cfn-appflow-connectorprofile-oauth2properties-tokenurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenUrlCustomProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauth2properties.html#cfn-appflow-connectorprofile-oauth2properties-tokenurlcustomproperties","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.OAuthCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthcredentials.html","Properties":{"AccessToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthcredentials.html#cfn-appflow-connectorprofile-oauthcredentials-accesstoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthcredentials.html#cfn-appflow-connectorprofile-oauthcredentials-clientid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthcredentials.html#cfn-appflow-connectorprofile-oauthcredentials-clientsecret","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectorOAuthRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthcredentials.html#cfn-appflow-connectorprofile-oauthcredentials-connectoroauthrequest","Required":false,"Type":"ConnectorOAuthRequest","UpdateType":"Mutable"},"RefreshToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthcredentials.html#cfn-appflow-connectorprofile-oauthcredentials-refreshtoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.OAuthProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthproperties.html","Properties":{"AuthCodeUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthproperties.html#cfn-appflow-connectorprofile-oauthproperties-authcodeurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OAuthScopes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthproperties.html#cfn-appflow-connectorprofile-oauthproperties-oauthscopes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TokenUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthproperties.html#cfn-appflow-connectorprofile-oauthproperties-tokenurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.PardotConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-pardotconnectorprofilecredentials.html","Properties":{"AccessToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-pardotconnectorprofilecredentials.html#cfn-appflow-connectorprofile-pardotconnectorprofilecredentials-accesstoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientCredentialsArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-pardotconnectorprofilecredentials.html#cfn-appflow-connectorprofile-pardotconnectorprofilecredentials-clientcredentialsarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectorOAuthRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-pardotconnectorprofilecredentials.html#cfn-appflow-connectorprofile-pardotconnectorprofilecredentials-connectoroauthrequest","Required":false,"Type":"ConnectorOAuthRequest","UpdateType":"Mutable"},"RefreshToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-pardotconnectorprofilecredentials.html#cfn-appflow-connectorprofile-pardotconnectorprofilecredentials-refreshtoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.PardotConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-pardotconnectorprofileproperties.html","Properties":{"BusinessUnitId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-pardotconnectorprofileproperties.html#cfn-appflow-connectorprofile-pardotconnectorprofileproperties-businessunitid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InstanceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-pardotconnectorprofileproperties.html#cfn-appflow-connectorprofile-pardotconnectorprofileproperties-instanceurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IsSandboxEnvironment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-pardotconnectorprofileproperties.html#cfn-appflow-connectorprofile-pardotconnectorprofileproperties-issandboxenvironment","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.RedshiftConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofilecredentials.html","Properties":{"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofilecredentials.html#cfn-appflow-connectorprofile-redshiftconnectorprofilecredentials-password","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofilecredentials.html#cfn-appflow-connectorprofile-redshiftconnectorprofilecredentials-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.RedshiftConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofileproperties.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofileproperties.html#cfn-appflow-connectorprofile-redshiftconnectorprofileproperties-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofileproperties.html#cfn-appflow-connectorprofile-redshiftconnectorprofileproperties-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofileproperties.html#cfn-appflow-connectorprofile-redshiftconnectorprofileproperties-clusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataApiRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofileproperties.html#cfn-appflow-connectorprofile-redshiftconnectorprofileproperties-dataapirolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofileproperties.html#cfn-appflow-connectorprofile-redshiftconnectorprofileproperties-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofileproperties.html#cfn-appflow-connectorprofile-redshiftconnectorprofileproperties-databaseurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IsRedshiftServerless":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofileproperties.html#cfn-appflow-connectorprofile-redshiftconnectorprofileproperties-isredshiftserverless","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofileproperties.html#cfn-appflow-connectorprofile-redshiftconnectorprofileproperties-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"WorkgroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofileproperties.html#cfn-appflow-connectorprofile-redshiftconnectorprofileproperties-workgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.SAPODataConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofilecredentials.html","Properties":{"BasicAuthCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofilecredentials.html#cfn-appflow-connectorprofile-sapodataconnectorprofilecredentials-basicauthcredentials","Required":false,"Type":"BasicAuthCredentials","UpdateType":"Mutable"},"OAuthCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofilecredentials.html#cfn-appflow-connectorprofile-sapodataconnectorprofilecredentials-oauthcredentials","Required":false,"Type":"OAuthCredentials","UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.SAPODataConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html","Properties":{"ApplicationHostUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-applicationhosturl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ApplicationServicePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-applicationservicepath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-clientnumber","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisableSSO":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-disablesso","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LogonLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-logonlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OAuthProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-oauthproperties","Required":false,"Type":"OAuthProperties","UpdateType":"Mutable"},"PortNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-portnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PrivateLinkServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-privatelinkservicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.SalesforceConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofilecredentials.html","Properties":{"AccessToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofilecredentials.html#cfn-appflow-connectorprofile-salesforceconnectorprofilecredentials-accesstoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientCredentialsArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofilecredentials.html#cfn-appflow-connectorprofile-salesforceconnectorprofilecredentials-clientcredentialsarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectorOAuthRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofilecredentials.html#cfn-appflow-connectorprofile-salesforceconnectorprofilecredentials-connectoroauthrequest","Required":false,"Type":"ConnectorOAuthRequest","UpdateType":"Mutable"},"JwtToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofilecredentials.html#cfn-appflow-connectorprofile-salesforceconnectorprofilecredentials-jwttoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OAuth2GrantType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofilecredentials.html#cfn-appflow-connectorprofile-salesforceconnectorprofilecredentials-oauth2granttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RefreshToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofilecredentials.html#cfn-appflow-connectorprofile-salesforceconnectorprofilecredentials-refreshtoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.SalesforceConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofileproperties.html","Properties":{"InstanceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofileproperties.html#cfn-appflow-connectorprofile-salesforceconnectorprofileproperties-instanceurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"isSandboxEnvironment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofileproperties.html#cfn-appflow-connectorprofile-salesforceconnectorprofileproperties-issandboxenvironment","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"usePrivateLinkForMetadataAndAuthorization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofileproperties.html#cfn-appflow-connectorprofile-salesforceconnectorprofileproperties-useprivatelinkformetadataandauthorization","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.ServiceNowConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-servicenowconnectorprofilecredentials.html","Properties":{"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-servicenowconnectorprofilecredentials.html#cfn-appflow-connectorprofile-servicenowconnectorprofilecredentials-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-servicenowconnectorprofilecredentials.html#cfn-appflow-connectorprofile-servicenowconnectorprofilecredentials-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.ServiceNowConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-servicenowconnectorprofileproperties.html","Properties":{"InstanceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-servicenowconnectorprofileproperties.html#cfn-appflow-connectorprofile-servicenowconnectorprofileproperties-instanceurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.SingularConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-singularconnectorprofilecredentials.html","Properties":{"ApiKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-singularconnectorprofilecredentials.html#cfn-appflow-connectorprofile-singularconnectorprofilecredentials-apikey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.SlackConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-slackconnectorprofilecredentials.html","Properties":{"AccessToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-slackconnectorprofilecredentials.html#cfn-appflow-connectorprofile-slackconnectorprofilecredentials-accesstoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-slackconnectorprofilecredentials.html#cfn-appflow-connectorprofile-slackconnectorprofilecredentials-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-slackconnectorprofilecredentials.html#cfn-appflow-connectorprofile-slackconnectorprofilecredentials-clientsecret","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConnectorOAuthRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-slackconnectorprofilecredentials.html#cfn-appflow-connectorprofile-slackconnectorprofilecredentials-connectoroauthrequest","Required":false,"Type":"ConnectorOAuthRequest","UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.SlackConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-slackconnectorprofileproperties.html","Properties":{"InstanceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-slackconnectorprofileproperties.html#cfn-appflow-connectorprofile-slackconnectorprofileproperties-instanceurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.SnowflakeConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-snowflakeconnectorprofilecredentials.html","Properties":{"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-snowflakeconnectorprofilecredentials.html#cfn-appflow-connectorprofile-snowflakeconnectorprofilecredentials-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-snowflakeconnectorprofilecredentials.html#cfn-appflow-connectorprofile-snowflakeconnectorprofilecredentials-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.SnowflakeConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-snowflakeconnectorprofileproperties.html","Properties":{"AccountName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-snowflakeconnectorprofileproperties.html#cfn-appflow-connectorprofile-snowflakeconnectorprofileproperties-accountname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-snowflakeconnectorprofileproperties.html#cfn-appflow-connectorprofile-snowflakeconnectorprofileproperties-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-snowflakeconnectorprofileproperties.html#cfn-appflow-connectorprofile-snowflakeconnectorprofileproperties-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivateLinkServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-snowflakeconnectorprofileproperties.html#cfn-appflow-connectorprofile-snowflakeconnectorprofileproperties-privatelinkservicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-snowflakeconnectorprofileproperties.html#cfn-appflow-connectorprofile-snowflakeconnectorprofileproperties-region","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Stage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-snowflakeconnectorprofileproperties.html#cfn-appflow-connectorprofile-snowflakeconnectorprofileproperties-stage","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Warehouse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-snowflakeconnectorprofileproperties.html#cfn-appflow-connectorprofile-snowflakeconnectorprofileproperties-warehouse","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.TrendmicroConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-trendmicroconnectorprofilecredentials.html","Properties":{"ApiSecretKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-trendmicroconnectorprofilecredentials.html#cfn-appflow-connectorprofile-trendmicroconnectorprofilecredentials-apisecretkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.VeevaConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-veevaconnectorprofilecredentials.html","Properties":{"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-veevaconnectorprofilecredentials.html#cfn-appflow-connectorprofile-veevaconnectorprofilecredentials-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-veevaconnectorprofilecredentials.html#cfn-appflow-connectorprofile-veevaconnectorprofilecredentials-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.VeevaConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-veevaconnectorprofileproperties.html","Properties":{"InstanceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-veevaconnectorprofileproperties.html#cfn-appflow-connectorprofile-veevaconnectorprofileproperties-instanceurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.ZendeskConnectorProfileCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-zendeskconnectorprofilecredentials.html","Properties":{"AccessToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-zendeskconnectorprofilecredentials.html#cfn-appflow-connectorprofile-zendeskconnectorprofilecredentials-accesstoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-zendeskconnectorprofilecredentials.html#cfn-appflow-connectorprofile-zendeskconnectorprofilecredentials-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-zendeskconnectorprofilecredentials.html#cfn-appflow-connectorprofile-zendeskconnectorprofilecredentials-clientsecret","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConnectorOAuthRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-zendeskconnectorprofilecredentials.html#cfn-appflow-connectorprofile-zendeskconnectorprofilecredentials-connectoroauthrequest","Required":false,"Type":"ConnectorOAuthRequest","UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile.ZendeskConnectorProfileProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-zendeskconnectorprofileproperties.html","Properties":{"InstanceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-zendeskconnectorprofileproperties.html#cfn-appflow-connectorprofile-zendeskconnectorprofileproperties-instanceurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.AggregationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-aggregationconfig.html","Properties":{"AggregationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-aggregationconfig.html#cfn-appflow-flow-aggregationconfig-aggregationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetFileSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-aggregationconfig.html#cfn-appflow-flow-aggregationconfig-targetfilesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.AmplitudeSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-amplitudesourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-amplitudesourceproperties.html#cfn-appflow-flow-amplitudesourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.ConnectorOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html","Properties":{"Amplitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-amplitude","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomConnector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-customconnector","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Datadog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-datadog","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Dynatrace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-dynatrace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GoogleAnalytics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-googleanalytics","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InforNexus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-infornexus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Marketo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-marketo","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Pardot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-pardot","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-s3","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SAPOData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-sapodata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Salesforce":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-salesforce","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServiceNow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-servicenow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Singular":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-singular","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Slack":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-slack","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Trendmicro":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-trendmicro","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Veeva":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-veeva","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Zendesk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-zendesk","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.CustomConnectorDestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-customconnectordestinationproperties.html","Properties":{"CustomProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-customconnectordestinationproperties.html#cfn-appflow-flow-customconnectordestinationproperties-customproperties","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"EntityName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-customconnectordestinationproperties.html#cfn-appflow-flow-customconnectordestinationproperties-entityname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ErrorHandlingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-customconnectordestinationproperties.html#cfn-appflow-flow-customconnectordestinationproperties-errorhandlingconfig","Required":false,"Type":"ErrorHandlingConfig","UpdateType":"Mutable"},"IdFieldNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-customconnectordestinationproperties.html#cfn-appflow-flow-customconnectordestinationproperties-idfieldnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"WriteOperationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-customconnectordestinationproperties.html#cfn-appflow-flow-customconnectordestinationproperties-writeoperationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.CustomConnectorSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-customconnectorsourceproperties.html","Properties":{"CustomProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-customconnectorsourceproperties.html#cfn-appflow-flow-customconnectorsourceproperties-customproperties","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"DataTransferApi":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-customconnectorsourceproperties.html#cfn-appflow-flow-customconnectorsourceproperties-datatransferapi","Required":false,"Type":"DataTransferApi","UpdateType":"Mutable"},"EntityName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-customconnectorsourceproperties.html#cfn-appflow-flow-customconnectorsourceproperties-entityname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.DataTransferApi":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-datatransferapi.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-datatransferapi.html#cfn-appflow-flow-datatransferapi-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-datatransferapi.html#cfn-appflow-flow-datatransferapi-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.DatadogSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-datadogsourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-datadogsourceproperties.html#cfn-appflow-flow-datadogsourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.DestinationConnectorProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html","Properties":{"CustomConnector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-customconnector","Required":false,"Type":"CustomConnectorDestinationProperties","UpdateType":"Mutable"},"EventBridge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-eventbridge","Required":false,"Type":"EventBridgeDestinationProperties","UpdateType":"Mutable"},"LookoutMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-lookoutmetrics","Required":false,"Type":"LookoutMetricsDestinationProperties","UpdateType":"Mutable"},"Marketo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-marketo","Required":false,"Type":"MarketoDestinationProperties","UpdateType":"Mutable"},"Redshift":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-redshift","Required":false,"Type":"RedshiftDestinationProperties","UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-s3","Required":false,"Type":"S3DestinationProperties","UpdateType":"Mutable"},"SAPOData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-sapodata","Required":false,"Type":"SAPODataDestinationProperties","UpdateType":"Mutable"},"Salesforce":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-salesforce","Required":false,"Type":"SalesforceDestinationProperties","UpdateType":"Mutable"},"Snowflake":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-snowflake","Required":false,"Type":"SnowflakeDestinationProperties","UpdateType":"Mutable"},"Upsolver":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-upsolver","Required":false,"Type":"UpsolverDestinationProperties","UpdateType":"Mutable"},"Zendesk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-zendesk","Required":false,"Type":"ZendeskDestinationProperties","UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.DestinationFlowConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationflowconfig.html","Properties":{"ApiVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationflowconfig.html#cfn-appflow-flow-destinationflowconfig-apiversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectorProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationflowconfig.html#cfn-appflow-flow-destinationflowconfig-connectorprofilename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectorType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationflowconfig.html#cfn-appflow-flow-destinationflowconfig-connectortype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DestinationConnectorProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationflowconfig.html#cfn-appflow-flow-destinationflowconfig-destinationconnectorproperties","Required":true,"Type":"DestinationConnectorProperties","UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.DynatraceSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-dynatracesourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-dynatracesourceproperties.html#cfn-appflow-flow-dynatracesourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.ErrorHandlingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-errorhandlingconfig.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-errorhandlingconfig.html#cfn-appflow-flow-errorhandlingconfig-bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-errorhandlingconfig.html#cfn-appflow-flow-errorhandlingconfig-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FailOnFirstError":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-errorhandlingconfig.html#cfn-appflow-flow-errorhandlingconfig-failonfirsterror","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.EventBridgeDestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-eventbridgedestinationproperties.html","Properties":{"ErrorHandlingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-eventbridgedestinationproperties.html#cfn-appflow-flow-eventbridgedestinationproperties-errorhandlingconfig","Required":false,"Type":"ErrorHandlingConfig","UpdateType":"Mutable"},"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-eventbridgedestinationproperties.html#cfn-appflow-flow-eventbridgedestinationproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.GlueDataCatalog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-gluedatacatalog.html","Properties":{"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-gluedatacatalog.html#cfn-appflow-flow-gluedatacatalog-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-gluedatacatalog.html#cfn-appflow-flow-gluedatacatalog-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TablePrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-gluedatacatalog.html#cfn-appflow-flow-gluedatacatalog-tableprefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.GoogleAnalyticsSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-googleanalyticssourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-googleanalyticssourceproperties.html#cfn-appflow-flow-googleanalyticssourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.IncrementalPullConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-incrementalpullconfig.html","Properties":{"DatetimeTypeFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-incrementalpullconfig.html#cfn-appflow-flow-incrementalpullconfig-datetimetypefieldname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.InforNexusSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-infornexussourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-infornexussourceproperties.html#cfn-appflow-flow-infornexussourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.LookoutMetricsDestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-lookoutmetricsdestinationproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-lookoutmetricsdestinationproperties.html#cfn-appflow-flow-lookoutmetricsdestinationproperties-object","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.MarketoDestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-marketodestinationproperties.html","Properties":{"ErrorHandlingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-marketodestinationproperties.html#cfn-appflow-flow-marketodestinationproperties-errorhandlingconfig","Required":false,"Type":"ErrorHandlingConfig","UpdateType":"Mutable"},"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-marketodestinationproperties.html#cfn-appflow-flow-marketodestinationproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.MarketoSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-marketosourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-marketosourceproperties.html#cfn-appflow-flow-marketosourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.MetadataCatalogConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-metadatacatalogconfig.html","Properties":{"GlueDataCatalog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-metadatacatalogconfig.html#cfn-appflow-flow-metadatacatalogconfig-gluedatacatalog","Required":false,"Type":"GlueDataCatalog","UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.PardotSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-pardotsourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-pardotsourceproperties.html#cfn-appflow-flow-pardotsourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.PrefixConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-prefixconfig.html","Properties":{"PathPrefixHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-prefixconfig.html#cfn-appflow-flow-prefixconfig-pathprefixhierarchy","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PrefixFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-prefixconfig.html#cfn-appflow-flow-prefixconfig-prefixformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrefixType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-prefixconfig.html#cfn-appflow-flow-prefixconfig-prefixtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.RedshiftDestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-redshiftdestinationproperties.html","Properties":{"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-redshiftdestinationproperties.html#cfn-appflow-flow-redshiftdestinationproperties-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ErrorHandlingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-redshiftdestinationproperties.html#cfn-appflow-flow-redshiftdestinationproperties-errorhandlingconfig","Required":false,"Type":"ErrorHandlingConfig","UpdateType":"Mutable"},"IntermediateBucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-redshiftdestinationproperties.html#cfn-appflow-flow-redshiftdestinationproperties-intermediatebucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-redshiftdestinationproperties.html#cfn-appflow-flow-redshiftdestinationproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.S3DestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3destinationproperties.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3destinationproperties.html#cfn-appflow-flow-s3destinationproperties-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3destinationproperties.html#cfn-appflow-flow-s3destinationproperties-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3OutputFormatConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3destinationproperties.html#cfn-appflow-flow-s3destinationproperties-s3outputformatconfig","Required":false,"Type":"S3OutputFormatConfig","UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.S3InputFormatConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3inputformatconfig.html","Properties":{"S3InputFileType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3inputformatconfig.html#cfn-appflow-flow-s3inputformatconfig-s3inputfiletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.S3OutputFormatConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3outputformatconfig.html","Properties":{"AggregationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3outputformatconfig.html#cfn-appflow-flow-s3outputformatconfig-aggregationconfig","Required":false,"Type":"AggregationConfig","UpdateType":"Mutable"},"FileType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3outputformatconfig.html#cfn-appflow-flow-s3outputformatconfig-filetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrefixConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3outputformatconfig.html#cfn-appflow-flow-s3outputformatconfig-prefixconfig","Required":false,"Type":"PrefixConfig","UpdateType":"Mutable"},"PreserveSourceDataTyping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3outputformatconfig.html#cfn-appflow-flow-s3outputformatconfig-preservesourcedatatyping","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.S3SourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3sourceproperties.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3sourceproperties.html#cfn-appflow-flow-s3sourceproperties-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3sourceproperties.html#cfn-appflow-flow-s3sourceproperties-bucketprefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3InputFormatConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3sourceproperties.html#cfn-appflow-flow-s3sourceproperties-s3inputformatconfig","Required":false,"Type":"S3InputFormatConfig","UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.SAPODataDestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html","Properties":{"ErrorHandlingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html#cfn-appflow-flow-sapodatadestinationproperties-errorhandlingconfig","Required":false,"Type":"ErrorHandlingConfig","UpdateType":"Mutable"},"IdFieldNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html#cfn-appflow-flow-sapodatadestinationproperties-idfieldnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ObjectPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html#cfn-appflow-flow-sapodatadestinationproperties-objectpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SuccessResponseHandlingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html#cfn-appflow-flow-sapodatadestinationproperties-successresponsehandlingconfig","Required":false,"Type":"SuccessResponseHandlingConfig","UpdateType":"Mutable"},"WriteOperationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html#cfn-appflow-flow-sapodatadestinationproperties-writeoperationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.SAPODataSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatasourceproperties.html","Properties":{"ObjectPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatasourceproperties.html#cfn-appflow-flow-sapodatasourceproperties-objectpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.SalesforceDestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-salesforcedestinationproperties.html","Properties":{"DataTransferApi":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-salesforcedestinationproperties.html#cfn-appflow-flow-salesforcedestinationproperties-datatransferapi","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ErrorHandlingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-salesforcedestinationproperties.html#cfn-appflow-flow-salesforcedestinationproperties-errorhandlingconfig","Required":false,"Type":"ErrorHandlingConfig","UpdateType":"Mutable"},"IdFieldNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-salesforcedestinationproperties.html#cfn-appflow-flow-salesforcedestinationproperties-idfieldnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-salesforcedestinationproperties.html#cfn-appflow-flow-salesforcedestinationproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"WriteOperationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-salesforcedestinationproperties.html#cfn-appflow-flow-salesforcedestinationproperties-writeoperationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.SalesforceSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-salesforcesourceproperties.html","Properties":{"DataTransferApi":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-salesforcesourceproperties.html#cfn-appflow-flow-salesforcesourceproperties-datatransferapi","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableDynamicFieldUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-salesforcesourceproperties.html#cfn-appflow-flow-salesforcesourceproperties-enabledynamicfieldupdate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeDeletedRecords":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-salesforcesourceproperties.html#cfn-appflow-flow-salesforcesourceproperties-includedeletedrecords","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-salesforcesourceproperties.html#cfn-appflow-flow-salesforcesourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.ScheduledTriggerProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-scheduledtriggerproperties.html","Properties":{"DataPullMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-scheduledtriggerproperties.html#cfn-appflow-flow-scheduledtriggerproperties-datapullmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FirstExecutionFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-scheduledtriggerproperties.html#cfn-appflow-flow-scheduledtriggerproperties-firstexecutionfrom","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"FlowErrorDeactivationThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-scheduledtriggerproperties.html#cfn-appflow-flow-scheduledtriggerproperties-flowerrordeactivationthreshold","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ScheduleEndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-scheduledtriggerproperties.html#cfn-appflow-flow-scheduledtriggerproperties-scheduleendtime","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-scheduledtriggerproperties.html#cfn-appflow-flow-scheduledtriggerproperties-scheduleexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScheduleOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-scheduledtriggerproperties.html#cfn-appflow-flow-scheduledtriggerproperties-scheduleoffset","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ScheduleStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-scheduledtriggerproperties.html#cfn-appflow-flow-scheduledtriggerproperties-schedulestarttime","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TimeZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-scheduledtriggerproperties.html#cfn-appflow-flow-scheduledtriggerproperties-timezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.ServiceNowSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-servicenowsourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-servicenowsourceproperties.html#cfn-appflow-flow-servicenowsourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.SingularSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-singularsourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-singularsourceproperties.html#cfn-appflow-flow-singularsourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.SlackSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-slacksourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-slacksourceproperties.html#cfn-appflow-flow-slacksourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.SnowflakeDestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-snowflakedestinationproperties.html","Properties":{"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-snowflakedestinationproperties.html#cfn-appflow-flow-snowflakedestinationproperties-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ErrorHandlingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-snowflakedestinationproperties.html#cfn-appflow-flow-snowflakedestinationproperties-errorhandlingconfig","Required":false,"Type":"ErrorHandlingConfig","UpdateType":"Mutable"},"IntermediateBucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-snowflakedestinationproperties.html#cfn-appflow-flow-snowflakedestinationproperties-intermediatebucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-snowflakedestinationproperties.html#cfn-appflow-flow-snowflakedestinationproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.SourceConnectorProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html","Properties":{"Amplitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-amplitude","Required":false,"Type":"AmplitudeSourceProperties","UpdateType":"Mutable"},"CustomConnector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-customconnector","Required":false,"Type":"CustomConnectorSourceProperties","UpdateType":"Mutable"},"Datadog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-datadog","Required":false,"Type":"DatadogSourceProperties","UpdateType":"Mutable"},"Dynatrace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-dynatrace","Required":false,"Type":"DynatraceSourceProperties","UpdateType":"Mutable"},"GoogleAnalytics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-googleanalytics","Required":false,"Type":"GoogleAnalyticsSourceProperties","UpdateType":"Mutable"},"InforNexus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-infornexus","Required":false,"Type":"InforNexusSourceProperties","UpdateType":"Mutable"},"Marketo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-marketo","Required":false,"Type":"MarketoSourceProperties","UpdateType":"Mutable"},"Pardot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-pardot","Required":false,"Type":"PardotSourceProperties","UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-s3","Required":false,"Type":"S3SourceProperties","UpdateType":"Mutable"},"SAPOData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-sapodata","Required":false,"Type":"SAPODataSourceProperties","UpdateType":"Mutable"},"Salesforce":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-salesforce","Required":false,"Type":"SalesforceSourceProperties","UpdateType":"Mutable"},"ServiceNow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-servicenow","Required":false,"Type":"ServiceNowSourceProperties","UpdateType":"Mutable"},"Singular":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-singular","Required":false,"Type":"SingularSourceProperties","UpdateType":"Mutable"},"Slack":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-slack","Required":false,"Type":"SlackSourceProperties","UpdateType":"Mutable"},"Trendmicro":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-trendmicro","Required":false,"Type":"TrendmicroSourceProperties","UpdateType":"Mutable"},"Veeva":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-veeva","Required":false,"Type":"VeevaSourceProperties","UpdateType":"Mutable"},"Zendesk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-zendesk","Required":false,"Type":"ZendeskSourceProperties","UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.SourceFlowConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceflowconfig.html","Properties":{"ApiVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceflowconfig.html#cfn-appflow-flow-sourceflowconfig-apiversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectorProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceflowconfig.html#cfn-appflow-flow-sourceflowconfig-connectorprofilename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectorType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceflowconfig.html#cfn-appflow-flow-sourceflowconfig-connectortype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncrementalPullConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceflowconfig.html#cfn-appflow-flow-sourceflowconfig-incrementalpullconfig","Required":false,"Type":"IncrementalPullConfig","UpdateType":"Mutable"},"SourceConnectorProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceflowconfig.html#cfn-appflow-flow-sourceflowconfig-sourceconnectorproperties","Required":true,"Type":"SourceConnectorProperties","UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.SuccessResponseHandlingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-successresponsehandlingconfig.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-successresponsehandlingconfig.html#cfn-appflow-flow-successresponsehandlingconfig-bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-successresponsehandlingconfig.html#cfn-appflow-flow-successresponsehandlingconfig-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.Task":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-task.html","Properties":{"ConnectorOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-task.html#cfn-appflow-flow-task-connectoroperator","Required":false,"Type":"ConnectorOperator","UpdateType":"Mutable"},"DestinationField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-task.html#cfn-appflow-flow-task-destinationfield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-task.html#cfn-appflow-flow-task-sourcefields","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"TaskProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-task.html#cfn-appflow-flow-task-taskproperties","DuplicatesAllowed":true,"ItemType":"TaskPropertiesObject","Required":false,"Type":"List","UpdateType":"Mutable"},"TaskType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-task.html#cfn-appflow-flow-task-tasktype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.TaskPropertiesObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-taskpropertiesobject.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-taskpropertiesobject.html#cfn-appflow-flow-taskpropertiesobject-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-taskpropertiesobject.html#cfn-appflow-flow-taskpropertiesobject-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.TrendmicroSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-trendmicrosourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-trendmicrosourceproperties.html#cfn-appflow-flow-trendmicrosourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.TriggerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-triggerconfig.html","Properties":{"TriggerProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-triggerconfig.html#cfn-appflow-flow-triggerconfig-triggerproperties","Required":false,"Type":"ScheduledTriggerProperties","UpdateType":"Mutable"},"TriggerType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-triggerconfig.html#cfn-appflow-flow-triggerconfig-triggertype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.UpsolverDestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-upsolverdestinationproperties.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-upsolverdestinationproperties.html#cfn-appflow-flow-upsolverdestinationproperties-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-upsolverdestinationproperties.html#cfn-appflow-flow-upsolverdestinationproperties-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3OutputFormatConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-upsolverdestinationproperties.html#cfn-appflow-flow-upsolverdestinationproperties-s3outputformatconfig","Required":true,"Type":"UpsolverS3OutputFormatConfig","UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.UpsolverS3OutputFormatConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-upsolvers3outputformatconfig.html","Properties":{"AggregationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-upsolvers3outputformatconfig.html#cfn-appflow-flow-upsolvers3outputformatconfig-aggregationconfig","Required":false,"Type":"AggregationConfig","UpdateType":"Mutable"},"FileType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-upsolvers3outputformatconfig.html#cfn-appflow-flow-upsolvers3outputformatconfig-filetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrefixConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-upsolvers3outputformatconfig.html#cfn-appflow-flow-upsolvers3outputformatconfig-prefixconfig","Required":true,"Type":"PrefixConfig","UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.VeevaSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html","Properties":{"DocumentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html#cfn-appflow-flow-veevasourceproperties-documenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IncludeAllVersions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html#cfn-appflow-flow-veevasourceproperties-includeallversions","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeRenditions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html#cfn-appflow-flow-veevasourceproperties-includerenditions","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeSourceFiles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html#cfn-appflow-flow-veevasourceproperties-includesourcefiles","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html#cfn-appflow-flow-veevasourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.ZendeskDestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-zendeskdestinationproperties.html","Properties":{"ErrorHandlingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-zendeskdestinationproperties.html#cfn-appflow-flow-zendeskdestinationproperties-errorhandlingconfig","Required":false,"Type":"ErrorHandlingConfig","UpdateType":"Mutable"},"IdFieldNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-zendeskdestinationproperties.html#cfn-appflow-flow-zendeskdestinationproperties-idfieldnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-zendeskdestinationproperties.html#cfn-appflow-flow-zendeskdestinationproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"WriteOperationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-zendeskdestinationproperties.html#cfn-appflow-flow-zendeskdestinationproperties-writeoperationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow.ZendeskSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-zendesksourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-zendesksourceproperties.html#cfn-appflow-flow-zendesksourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppIntegrations::DataIntegration.FileConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-fileconfiguration.html","Properties":{"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-fileconfiguration.html#cfn-appintegrations-dataintegration-fileconfiguration-filters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Folders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-fileconfiguration.html#cfn-appintegrations-dataintegration-fileconfiguration-folders","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppIntegrations::DataIntegration.ScheduleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-scheduleconfig.html","Properties":{"FirstExecutionFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-scheduleconfig.html#cfn-appintegrations-dataintegration-scheduleconfig-firstexecutionfrom","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-scheduleconfig.html#cfn-appintegrations-dataintegration-scheduleconfig-object","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-scheduleconfig.html#cfn-appintegrations-dataintegration-scheduleconfig-scheduleexpression","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppIntegrations::EventIntegration.EventFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-eventintegration-eventfilter.html","Properties":{"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-eventintegration-eventfilter.html#cfn-appintegrations-eventintegration-eventfilter-source","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppMesh::GatewayRoute.GatewayRouteHostnameMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutehostnamematch.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutehostnamematch.html#cfn-appmesh-gatewayroute-gatewayroutehostnamematch-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutehostnamematch.html#cfn-appmesh-gatewayroute-gatewayroutehostnamematch-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.GatewayRouteHostnameRewrite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutehostnamerewrite.html","Properties":{"DefaultTargetHostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutehostnamerewrite.html#cfn-appmesh-gatewayroute-gatewayroutehostnamerewrite-defaulttargethostname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.GatewayRouteMetadataMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html#cfn-appmesh-gatewayroute-gatewayroutemetadatamatch-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html#cfn-appmesh-gatewayroute-gatewayroutemetadatamatch-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html#cfn-appmesh-gatewayroute-gatewayroutemetadatamatch-range","Required":false,"Type":"GatewayRouteRangeMatch","UpdateType":"Mutable"},"Regex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html#cfn-appmesh-gatewayroute-gatewayroutemetadatamatch-regex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutemetadatamatch.html#cfn-appmesh-gatewayroute-gatewayroutemetadatamatch-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.GatewayRouteRangeMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayrouterangematch.html","Properties":{"End":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayrouterangematch.html#cfn-appmesh-gatewayroute-gatewayrouterangematch-end","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Start":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayrouterangematch.html#cfn-appmesh-gatewayroute-gatewayrouterangematch-start","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.GatewayRouteSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutespec.html","Properties":{"GrpcRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutespec.html#cfn-appmesh-gatewayroute-gatewayroutespec-grpcroute","Required":false,"Type":"GrpcGatewayRoute","UpdateType":"Mutable"},"Http2Route":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutespec.html#cfn-appmesh-gatewayroute-gatewayroutespec-http2route","Required":false,"Type":"HttpGatewayRoute","UpdateType":"Mutable"},"HttpRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutespec.html#cfn-appmesh-gatewayroute-gatewayroutespec-httproute","Required":false,"Type":"HttpGatewayRoute","UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutespec.html#cfn-appmesh-gatewayroute-gatewayroutespec-priority","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.GatewayRouteTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutetarget.html","Properties":{"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutetarget.html#cfn-appmesh-gatewayroute-gatewayroutetarget-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VirtualService":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutetarget.html#cfn-appmesh-gatewayroute-gatewayroutetarget-virtualservice","Required":true,"Type":"GatewayRouteVirtualService","UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.GatewayRouteVirtualService":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutevirtualservice.html","Properties":{"VirtualServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutevirtualservice.html#cfn-appmesh-gatewayroute-gatewayroutevirtualservice-virtualservicename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.GrpcGatewayRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroute.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroute.html#cfn-appmesh-gatewayroute-grpcgatewayroute-action","Required":true,"Type":"GrpcGatewayRouteAction","UpdateType":"Mutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroute.html#cfn-appmesh-gatewayroute-grpcgatewayroute-match","Required":true,"Type":"GrpcGatewayRouteMatch","UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.GrpcGatewayRouteAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayrouteaction.html","Properties":{"Rewrite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayrouteaction.html#cfn-appmesh-gatewayroute-grpcgatewayrouteaction-rewrite","Required":false,"Type":"GrpcGatewayRouteRewrite","UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayrouteaction.html#cfn-appmesh-gatewayroute-grpcgatewayrouteaction-target","Required":true,"Type":"GatewayRouteTarget","UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.GrpcGatewayRouteMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutematch.html","Properties":{"Hostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutematch.html#cfn-appmesh-gatewayroute-grpcgatewayroutematch-hostname","Required":false,"Type":"GatewayRouteHostnameMatch","UpdateType":"Mutable"},"Metadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutematch.html#cfn-appmesh-gatewayroute-grpcgatewayroutematch-metadata","ItemType":"GrpcGatewayRouteMetadata","Required":false,"Type":"List","UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutematch.html#cfn-appmesh-gatewayroute-grpcgatewayroutematch-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutematch.html#cfn-appmesh-gatewayroute-grpcgatewayroutematch-servicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.GrpcGatewayRouteMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutemetadata.html","Properties":{"Invert":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutemetadata.html#cfn-appmesh-gatewayroute-grpcgatewayroutemetadata-invert","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutemetadata.html#cfn-appmesh-gatewayroute-grpcgatewayroutemetadata-match","Required":false,"Type":"GatewayRouteMetadataMatch","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayroutemetadata.html#cfn-appmesh-gatewayroute-grpcgatewayroutemetadata-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.GrpcGatewayRouteRewrite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayrouterewrite.html","Properties":{"Hostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-grpcgatewayrouterewrite.html#cfn-appmesh-gatewayroute-grpcgatewayrouterewrite-hostname","Required":false,"Type":"GatewayRouteHostnameRewrite","UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.HttpGatewayRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroute.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroute.html#cfn-appmesh-gatewayroute-httpgatewayroute-action","Required":true,"Type":"HttpGatewayRouteAction","UpdateType":"Mutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroute.html#cfn-appmesh-gatewayroute-httpgatewayroute-match","Required":true,"Type":"HttpGatewayRouteMatch","UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.HttpGatewayRouteAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteaction.html","Properties":{"Rewrite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteaction.html#cfn-appmesh-gatewayroute-httpgatewayrouteaction-rewrite","Required":false,"Type":"HttpGatewayRouteRewrite","UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteaction.html#cfn-appmesh-gatewayroute-httpgatewayrouteaction-target","Required":true,"Type":"GatewayRouteTarget","UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.HttpGatewayRouteHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheader.html","Properties":{"Invert":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheader.html#cfn-appmesh-gatewayroute-httpgatewayrouteheader-invert","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheader.html#cfn-appmesh-gatewayroute-httpgatewayrouteheader-match","Required":false,"Type":"HttpGatewayRouteHeaderMatch","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheader.html#cfn-appmesh-gatewayroute-httpgatewayrouteheader-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.HttpGatewayRouteHeaderMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html#cfn-appmesh-gatewayroute-httpgatewayrouteheadermatch-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html#cfn-appmesh-gatewayroute-httpgatewayrouteheadermatch-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html#cfn-appmesh-gatewayroute-httpgatewayrouteheadermatch-range","Required":false,"Type":"GatewayRouteRangeMatch","UpdateType":"Mutable"},"Regex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html#cfn-appmesh-gatewayroute-httpgatewayrouteheadermatch-regex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteheadermatch.html#cfn-appmesh-gatewayroute-httpgatewayrouteheadermatch-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.HttpGatewayRouteMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html","Properties":{"Headers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-headers","ItemType":"HttpGatewayRouteHeader","Required":false,"Type":"List","UpdateType":"Mutable"},"Hostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-hostname","Required":false,"Type":"GatewayRouteHostnameMatch","UpdateType":"Mutable"},"Method":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-method","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-path","Required":false,"Type":"HttpPathMatch","UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"QueryParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutematch.html#cfn-appmesh-gatewayroute-httpgatewayroutematch-queryparameters","ItemType":"QueryParameter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.HttpGatewayRoutePathRewrite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutepathrewrite.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayroutepathrewrite.html#cfn-appmesh-gatewayroute-httpgatewayroutepathrewrite-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.HttpGatewayRoutePrefixRewrite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteprefixrewrite.html","Properties":{"DefaultPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteprefixrewrite.html#cfn-appmesh-gatewayroute-httpgatewayrouteprefixrewrite-defaultprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouteprefixrewrite.html#cfn-appmesh-gatewayroute-httpgatewayrouteprefixrewrite-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.HttpGatewayRouteRewrite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouterewrite.html","Properties":{"Hostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouterewrite.html#cfn-appmesh-gatewayroute-httpgatewayrouterewrite-hostname","Required":false,"Type":"GatewayRouteHostnameRewrite","UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouterewrite.html#cfn-appmesh-gatewayroute-httpgatewayrouterewrite-path","Required":false,"Type":"HttpGatewayRoutePathRewrite","UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpgatewayrouterewrite.html#cfn-appmesh-gatewayroute-httpgatewayrouterewrite-prefix","Required":false,"Type":"HttpGatewayRoutePrefixRewrite","UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.HttpPathMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httppathmatch.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httppathmatch.html#cfn-appmesh-gatewayroute-httppathmatch-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Regex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httppathmatch.html#cfn-appmesh-gatewayroute-httppathmatch-regex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.HttpQueryParameterMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpqueryparametermatch.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-httpqueryparametermatch.html#cfn-appmesh-gatewayroute-httpqueryparametermatch-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute.QueryParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-queryparameter.html","Properties":{"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-queryparameter.html#cfn-appmesh-gatewayroute-queryparameter-match","Required":false,"Type":"HttpQueryParameterMatch","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-queryparameter.html#cfn-appmesh-gatewayroute-queryparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::Mesh.EgressFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-egressfilter.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-egressfilter.html#cfn-appmesh-mesh-egressfilter-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::Mesh.MeshServiceDiscovery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshservicediscovery.html","Properties":{"IpPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshservicediscovery.html#cfn-appmesh-mesh-meshservicediscovery-ippreference","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::Mesh.MeshSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshspec.html","Properties":{"EgressFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshspec.html#cfn-appmesh-mesh-meshspec-egressfilter","Required":false,"Type":"EgressFilter","UpdateType":"Mutable"},"ServiceDiscovery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshspec.html#cfn-appmesh-mesh-meshspec-servicediscovery","Required":false,"Type":"MeshServiceDiscovery","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.Duration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-duration.html","Properties":{"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-duration.html#cfn-appmesh-route-duration-unit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-duration.html#cfn-appmesh-route-duration-value","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.GrpcRetryPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html","Properties":{"GrpcRetryEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html#cfn-appmesh-route-grpcretrypolicy-grpcretryevents","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"HttpRetryEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html#cfn-appmesh-route-grpcretrypolicy-httpretryevents","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MaxRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html#cfn-appmesh-route-grpcretrypolicy-maxretries","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"PerRetryTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html#cfn-appmesh-route-grpcretrypolicy-perretrytimeout","Required":true,"Type":"Duration","UpdateType":"Mutable"},"TcpRetryEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcretrypolicy.html#cfn-appmesh-route-grpcretrypolicy-tcpretryevents","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.GrpcRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroute.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroute.html#cfn-appmesh-route-grpcroute-action","Required":true,"Type":"GrpcRouteAction","UpdateType":"Mutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroute.html#cfn-appmesh-route-grpcroute-match","Required":true,"Type":"GrpcRouteMatch","UpdateType":"Mutable"},"RetryPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroute.html#cfn-appmesh-route-grpcroute-retrypolicy","Required":false,"Type":"GrpcRetryPolicy","UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroute.html#cfn-appmesh-route-grpcroute-timeout","Required":false,"Type":"GrpcTimeout","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.GrpcRouteAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcrouteaction.html","Properties":{"WeightedTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcrouteaction.html#cfn-appmesh-route-grpcrouteaction-weightedtargets","ItemType":"WeightedTarget","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.GrpcRouteMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutematch.html","Properties":{"Metadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutematch.html#cfn-appmesh-route-grpcroutematch-metadata","ItemType":"GrpcRouteMetadata","Required":false,"Type":"List","UpdateType":"Mutable"},"MethodName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutematch.html#cfn-appmesh-route-grpcroutematch-methodname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutematch.html#cfn-appmesh-route-grpcroutematch-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutematch.html#cfn-appmesh-route-grpcroutematch-servicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.GrpcRouteMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadata.html","Properties":{"Invert":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadata.html#cfn-appmesh-route-grpcroutemetadata-invert","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadata.html#cfn-appmesh-route-grpcroutemetadata-match","Required":false,"Type":"GrpcRouteMetadataMatchMethod","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadata.html#cfn-appmesh-route-grpcroutemetadata-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.GrpcRouteMetadataMatchMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html#cfn-appmesh-route-grpcroutemetadatamatchmethod-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html#cfn-appmesh-route-grpcroutemetadatamatchmethod-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html#cfn-appmesh-route-grpcroutemetadatamatchmethod-range","Required":false,"Type":"MatchRange","UpdateType":"Mutable"},"Regex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html#cfn-appmesh-route-grpcroutemetadatamatchmethod-regex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpcroutemetadatamatchmethod.html#cfn-appmesh-route-grpcroutemetadatamatchmethod-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.GrpcTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpctimeout.html","Properties":{"Idle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpctimeout.html#cfn-appmesh-route-grpctimeout-idle","Required":false,"Type":"Duration","UpdateType":"Mutable"},"PerRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-grpctimeout.html#cfn-appmesh-route-grpctimeout-perrequest","Required":false,"Type":"Duration","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.HeaderMatchMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html#cfn-appmesh-route-headermatchmethod-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html#cfn-appmesh-route-headermatchmethod-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html#cfn-appmesh-route-headermatchmethod-range","Required":false,"Type":"MatchRange","UpdateType":"Mutable"},"Regex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html#cfn-appmesh-route-headermatchmethod-regex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-headermatchmethod.html#cfn-appmesh-route-headermatchmethod-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.HttpPathMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httppathmatch.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httppathmatch.html#cfn-appmesh-route-httppathmatch-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Regex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httppathmatch.html#cfn-appmesh-route-httppathmatch-regex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.HttpQueryParameterMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpqueryparametermatch.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpqueryparametermatch.html#cfn-appmesh-route-httpqueryparametermatch-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.HttpRetryPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpretrypolicy.html","Properties":{"HttpRetryEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpretrypolicy.html#cfn-appmesh-route-httpretrypolicy-httpretryevents","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MaxRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpretrypolicy.html#cfn-appmesh-route-httpretrypolicy-maxretries","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"PerRetryTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpretrypolicy.html#cfn-appmesh-route-httpretrypolicy-perretrytimeout","Required":true,"Type":"Duration","UpdateType":"Mutable"},"TcpRetryEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httpretrypolicy.html#cfn-appmesh-route-httpretrypolicy-tcpretryevents","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.HttpRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproute.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproute.html#cfn-appmesh-route-httproute-action","Required":true,"Type":"HttpRouteAction","UpdateType":"Mutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproute.html#cfn-appmesh-route-httproute-match","Required":true,"Type":"HttpRouteMatch","UpdateType":"Mutable"},"RetryPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproute.html#cfn-appmesh-route-httproute-retrypolicy","Required":false,"Type":"HttpRetryPolicy","UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproute.html#cfn-appmesh-route-httproute-timeout","Required":false,"Type":"HttpTimeout","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.HttpRouteAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteaction.html","Properties":{"WeightedTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteaction.html#cfn-appmesh-route-httprouteaction-weightedtargets","ItemType":"WeightedTarget","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.HttpRouteHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteheader.html","Properties":{"Invert":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteheader.html#cfn-appmesh-route-httprouteheader-invert","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteheader.html#cfn-appmesh-route-httprouteheader-match","Required":false,"Type":"HeaderMatchMethod","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httprouteheader.html#cfn-appmesh-route-httprouteheader-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.HttpRouteMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html","Properties":{"Headers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-headers","ItemType":"HttpRouteHeader","Required":false,"Type":"List","UpdateType":"Mutable"},"Method":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-method","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-path","Required":false,"Type":"HttpPathMatch","UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"QueryParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-queryparameters","ItemType":"QueryParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Scheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httproutematch.html#cfn-appmesh-route-httproutematch-scheme","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.HttpTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httptimeout.html","Properties":{"Idle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httptimeout.html#cfn-appmesh-route-httptimeout-idle","Required":false,"Type":"Duration","UpdateType":"Mutable"},"PerRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-httptimeout.html#cfn-appmesh-route-httptimeout-perrequest","Required":false,"Type":"Duration","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.MatchRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-matchrange.html","Properties":{"End":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-matchrange.html#cfn-appmesh-route-matchrange-end","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Start":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-matchrange.html#cfn-appmesh-route-matchrange-start","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.QueryParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-queryparameter.html","Properties":{"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-queryparameter.html#cfn-appmesh-route-queryparameter-match","Required":false,"Type":"HttpQueryParameterMatch","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-queryparameter.html#cfn-appmesh-route-queryparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.RouteSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html","Properties":{"GrpcRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html#cfn-appmesh-route-routespec-grpcroute","Required":false,"Type":"GrpcRoute","UpdateType":"Mutable"},"Http2Route":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html#cfn-appmesh-route-routespec-http2route","Required":false,"Type":"HttpRoute","UpdateType":"Mutable"},"HttpRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html#cfn-appmesh-route-routespec-httproute","Required":false,"Type":"HttpRoute","UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html#cfn-appmesh-route-routespec-priority","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TcpRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-routespec.html#cfn-appmesh-route-routespec-tcproute","Required":false,"Type":"TcpRoute","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.TcpRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproute.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproute.html#cfn-appmesh-route-tcproute-action","Required":true,"Type":"TcpRouteAction","UpdateType":"Mutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproute.html#cfn-appmesh-route-tcproute-match","Required":false,"Type":"TcpRouteMatch","UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproute.html#cfn-appmesh-route-tcproute-timeout","Required":false,"Type":"TcpTimeout","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.TcpRouteAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcprouteaction.html","Properties":{"WeightedTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcprouteaction.html#cfn-appmesh-route-tcprouteaction-weightedtargets","ItemType":"WeightedTarget","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.TcpRouteMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproutematch.html","Properties":{"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcproutematch.html#cfn-appmesh-route-tcproutematch-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::Route.TcpTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcptimeout.html","Properties":{"Idle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-tcptimeout.html#cfn-appmesh-route-tcptimeout-idle","Required":false,"Type":"Duration","UpdateType":"Mutable"}}},"AWS::AppMesh::Route.WeightedTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-weightedtarget.html","Properties":{"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-weightedtarget.html#cfn-appmesh-route-weightedtarget-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VirtualNode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-weightedtarget.html#cfn-appmesh-route-weightedtarget-virtualnode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-route-weightedtarget.html#cfn-appmesh-route-weightedtarget-weight","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.JsonFormatRef":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-jsonformatref.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-jsonformatref.html#cfn-appmesh-virtualgateway-jsonformatref-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-jsonformatref.html#cfn-appmesh-virtualgateway-jsonformatref-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.LoggingFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-loggingformat.html","Properties":{"Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-loggingformat.html#cfn-appmesh-virtualgateway-loggingformat-json","ItemType":"JsonFormatRef","Required":false,"Type":"List","UpdateType":"Mutable"},"Text":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-loggingformat.html#cfn-appmesh-virtualgateway-loggingformat-text","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.SubjectAlternativeNameMatchers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-subjectalternativenamematchers.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-subjectalternativenamematchers.html#cfn-appmesh-virtualgateway-subjectalternativenamematchers-exact","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.SubjectAlternativeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-subjectalternativenames.html","Properties":{"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-subjectalternativenames.html#cfn-appmesh-virtualgateway-subjectalternativenames-match","Required":true,"Type":"SubjectAlternativeNameMatchers","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayAccessLog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayaccesslog.html","Properties":{"File":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayaccesslog.html#cfn-appmesh-virtualgateway-virtualgatewayaccesslog-file","Required":false,"Type":"VirtualGatewayFileAccessLog","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayBackendDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaybackenddefaults.html","Properties":{"ClientPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaybackenddefaults.html#cfn-appmesh-virtualgateway-virtualgatewaybackenddefaults-clientpolicy","Required":false,"Type":"VirtualGatewayClientPolicy","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayClientPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicy.html","Properties":{"TLS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayclientpolicy-tls","Required":false,"Type":"VirtualGatewayClientPolicyTls","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayClientPolicyTls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicytls.html","Properties":{"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicytls.html#cfn-appmesh-virtualgateway-virtualgatewayclientpolicytls-certificate","Required":false,"Type":"VirtualGatewayClientTlsCertificate","UpdateType":"Mutable"},"Enforce":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicytls.html#cfn-appmesh-virtualgateway-virtualgatewayclientpolicytls-enforce","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Ports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicytls.html#cfn-appmesh-virtualgateway-virtualgatewayclientpolicytls-ports","PrimitiveItemType":"Integer","Required":false,"Type":"List","UpdateType":"Mutable"},"Validation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclientpolicytls.html#cfn-appmesh-virtualgateway-virtualgatewayclientpolicytls-validation","Required":true,"Type":"VirtualGatewayTlsValidationContext","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayClientTlsCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclienttlscertificate.html","Properties":{"File":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclienttlscertificate.html#cfn-appmesh-virtualgateway-virtualgatewayclienttlscertificate-file","Required":false,"Type":"VirtualGatewayListenerTlsFileCertificate","UpdateType":"Mutable"},"SDS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayclienttlscertificate.html#cfn-appmesh-virtualgateway-virtualgatewayclienttlscertificate-sds","Required":false,"Type":"VirtualGatewayListenerTlsSdsCertificate","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayConnectionPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayconnectionpool.html","Properties":{"GRPC":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayconnectionpool-grpc","Required":false,"Type":"VirtualGatewayGrpcConnectionPool","UpdateType":"Mutable"},"HTTP":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayconnectionpool-http","Required":false,"Type":"VirtualGatewayHttpConnectionPool","UpdateType":"Mutable"},"HTTP2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayconnectionpool-http2","Required":false,"Type":"VirtualGatewayHttp2ConnectionPool","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayFileAccessLog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayfileaccesslog.html","Properties":{"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayfileaccesslog.html#cfn-appmesh-virtualgateway-virtualgatewayfileaccesslog-format","Required":false,"Type":"LoggingFormat","UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayfileaccesslog.html#cfn-appmesh-virtualgateway-virtualgatewayfileaccesslog-path","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayGrpcConnectionPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaygrpcconnectionpool.html","Properties":{"MaxRequests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaygrpcconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewaygrpcconnectionpool-maxrequests","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayHealthCheckPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html","Properties":{"HealthyThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-healthythreshold","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"IntervalMillis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-intervalmillis","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeoutMillis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-timeoutmillis","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"UnhealthyThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy.html#cfn-appmesh-virtualgateway-virtualgatewayhealthcheckpolicy-unhealthythreshold","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayHttp2ConnectionPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhttp2connectionpool.html","Properties":{"MaxRequests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhttp2connectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayhttp2connectionpool-maxrequests","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayHttpConnectionPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhttpconnectionpool.html","Properties":{"MaxConnections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhttpconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayhttpconnectionpool-maxconnections","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MaxPendingRequests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayhttpconnectionpool.html#cfn-appmesh-virtualgateway-virtualgatewayhttpconnectionpool-maxpendingrequests","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListener":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistener.html","Properties":{"ConnectionPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistener.html#cfn-appmesh-virtualgateway-virtualgatewaylistener-connectionpool","Required":false,"Type":"VirtualGatewayConnectionPool","UpdateType":"Mutable"},"HealthCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistener.html#cfn-appmesh-virtualgateway-virtualgatewaylistener-healthcheck","Required":false,"Type":"VirtualGatewayHealthCheckPolicy","UpdateType":"Mutable"},"PortMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistener.html#cfn-appmesh-virtualgateway-virtualgatewaylistener-portmapping","Required":true,"Type":"VirtualGatewayPortMapping","UpdateType":"Mutable"},"TLS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistener.html#cfn-appmesh-virtualgateway-virtualgatewaylistener-tls","Required":false,"Type":"VirtualGatewayListenerTls","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertls.html","Properties":{"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertls.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertls-certificate","Required":true,"Type":"VirtualGatewayListenerTlsCertificate","UpdateType":"Mutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertls.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertls-mode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Validation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertls.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertls-validation","Required":false,"Type":"VirtualGatewayListenerTlsValidationContext","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsAcmCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsacmcertificate.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsacmcertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsacmcertificate-certificatearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlscertificate.html","Properties":{"ACM":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlscertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlscertificate-acm","Required":false,"Type":"VirtualGatewayListenerTlsAcmCertificate","UpdateType":"Mutable"},"File":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlscertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlscertificate-file","Required":false,"Type":"VirtualGatewayListenerTlsFileCertificate","UpdateType":"Mutable"},"SDS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlscertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlscertificate-sds","Required":false,"Type":"VirtualGatewayListenerTlsSdsCertificate","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsFileCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsfilecertificate.html","Properties":{"CertificateChain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsfilecertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsfilecertificate-certificatechain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsfilecertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsfilecertificate-privatekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsSdsCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlssdscertificate.html","Properties":{"SecretName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlssdscertificate.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlssdscertificate-secretname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsValidationContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontext.html","Properties":{"SubjectAlternativeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontext.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontext-subjectalternativenames","Required":false,"Type":"SubjectAlternativeNames","UpdateType":"Mutable"},"Trust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontext.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontext-trust","Required":true,"Type":"VirtualGatewayListenerTlsValidationContextTrust","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayListenerTlsValidationContextTrust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontexttrust.html","Properties":{"File":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontexttrust.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontexttrust-file","Required":false,"Type":"VirtualGatewayTlsValidationContextFileTrust","UpdateType":"Mutable"},"SDS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontexttrust.html#cfn-appmesh-virtualgateway-virtualgatewaylistenertlsvalidationcontexttrust-sds","Required":false,"Type":"VirtualGatewayTlsValidationContextSdsTrust","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayLogging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylogging.html","Properties":{"AccessLog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaylogging.html#cfn-appmesh-virtualgateway-virtualgatewaylogging-accesslog","Required":false,"Type":"VirtualGatewayAccessLog","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayPortMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayportmapping.html","Properties":{"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayportmapping.html#cfn-appmesh-virtualgateway-virtualgatewayportmapping-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayportmapping.html#cfn-appmesh-virtualgateway-virtualgatewayportmapping-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewaySpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayspec.html","Properties":{"BackendDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayspec.html#cfn-appmesh-virtualgateway-virtualgatewayspec-backenddefaults","Required":false,"Type":"VirtualGatewayBackendDefaults","UpdateType":"Mutable"},"Listeners":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayspec.html#cfn-appmesh-virtualgateway-virtualgatewayspec-listeners","ItemType":"VirtualGatewayListener","Required":true,"Type":"List","UpdateType":"Mutable"},"Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewayspec.html#cfn-appmesh-virtualgateway-virtualgatewayspec-logging","Required":false,"Type":"VirtualGatewayLogging","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontext.html","Properties":{"SubjectAlternativeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontext.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontext-subjectalternativenames","Required":false,"Type":"SubjectAlternativeNames","UpdateType":"Mutable"},"Trust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontext.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontext-trust","Required":true,"Type":"VirtualGatewayTlsValidationContextTrust","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextAcmTrust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextacmtrust.html","Properties":{"CertificateAuthorityArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextacmtrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextacmtrust-certificateauthorityarns","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextFileTrust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextfiletrust.html","Properties":{"CertificateChain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextfiletrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextfiletrust-certificatechain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextSdsTrust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextsdstrust.html","Properties":{"SecretName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextsdstrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontextsdstrust-secretname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualGateway.VirtualGatewayTlsValidationContextTrust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust.html","Properties":{"ACM":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust-acm","Required":false,"Type":"VirtualGatewayTlsValidationContextAcmTrust","UpdateType":"Mutable"},"File":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust-file","Required":false,"Type":"VirtualGatewayTlsValidationContextFileTrust","UpdateType":"Mutable"},"SDS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust.html#cfn-appmesh-virtualgateway-virtualgatewaytlsvalidationcontexttrust-sds","Required":false,"Type":"VirtualGatewayTlsValidationContextSdsTrust","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.AccessLog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-accesslog.html","Properties":{"File":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-accesslog.html#cfn-appmesh-virtualnode-accesslog-file","Required":false,"Type":"FileAccessLog","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.AwsCloudMapInstanceAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapinstanceattribute.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapinstanceattribute.html#cfn-appmesh-virtualnode-awscloudmapinstanceattribute-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapinstanceattribute.html#cfn-appmesh-virtualnode-awscloudmapinstanceattribute-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.AwsCloudMapServiceDiscovery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapservicediscovery.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapservicediscovery.html#cfn-appmesh-virtualnode-awscloudmapservicediscovery-attributes","ItemType":"AwsCloudMapInstanceAttribute","Required":false,"Type":"List","UpdateType":"Mutable"},"IpPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapservicediscovery.html#cfn-appmesh-virtualnode-awscloudmapservicediscovery-ippreference","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NamespaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapservicediscovery.html#cfn-appmesh-virtualnode-awscloudmapservicediscovery-namespacename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-awscloudmapservicediscovery.html#cfn-appmesh-virtualnode-awscloudmapservicediscovery-servicename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.Backend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-backend.html","Properties":{"VirtualService":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-backend.html#cfn-appmesh-virtualnode-backend-virtualservice","Required":false,"Type":"VirtualServiceBackend","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.BackendDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-backenddefaults.html","Properties":{"ClientPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-backenddefaults.html#cfn-appmesh-virtualnode-backenddefaults-clientpolicy","Required":false,"Type":"ClientPolicy","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ClientPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicy.html","Properties":{"TLS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicy.html#cfn-appmesh-virtualnode-clientpolicy-tls","Required":false,"Type":"ClientPolicyTls","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ClientPolicyTls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicytls.html","Properties":{"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicytls.html#cfn-appmesh-virtualnode-clientpolicytls-certificate","Required":false,"Type":"ClientTlsCertificate","UpdateType":"Mutable"},"Enforce":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicytls.html#cfn-appmesh-virtualnode-clientpolicytls-enforce","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Ports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicytls.html#cfn-appmesh-virtualnode-clientpolicytls-ports","PrimitiveItemType":"Integer","Required":false,"Type":"List","UpdateType":"Mutable"},"Validation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clientpolicytls.html#cfn-appmesh-virtualnode-clientpolicytls-validation","Required":true,"Type":"TlsValidationContext","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ClientTlsCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clienttlscertificate.html","Properties":{"File":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clienttlscertificate.html#cfn-appmesh-virtualnode-clienttlscertificate-file","Required":false,"Type":"ListenerTlsFileCertificate","UpdateType":"Mutable"},"SDS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-clienttlscertificate.html#cfn-appmesh-virtualnode-clienttlscertificate-sds","Required":false,"Type":"ListenerTlsSdsCertificate","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.DnsServiceDiscovery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-dnsservicediscovery.html","Properties":{"Hostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-dnsservicediscovery.html#cfn-appmesh-virtualnode-dnsservicediscovery-hostname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IpPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-dnsservicediscovery.html#cfn-appmesh-virtualnode-dnsservicediscovery-ippreference","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-dnsservicediscovery.html#cfn-appmesh-virtualnode-dnsservicediscovery-responsetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.Duration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-duration.html","Properties":{"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-duration.html#cfn-appmesh-virtualnode-duration-unit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-duration.html#cfn-appmesh-virtualnode-duration-value","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.FileAccessLog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-fileaccesslog.html","Properties":{"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-fileaccesslog.html#cfn-appmesh-virtualnode-fileaccesslog-format","Required":false,"Type":"LoggingFormat","UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-fileaccesslog.html#cfn-appmesh-virtualnode-fileaccesslog-path","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.GrpcTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-grpctimeout.html","Properties":{"Idle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-grpctimeout.html#cfn-appmesh-virtualnode-grpctimeout-idle","Required":false,"Type":"Duration","UpdateType":"Mutable"},"PerRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-grpctimeout.html#cfn-appmesh-virtualnode-grpctimeout-perrequest","Required":false,"Type":"Duration","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.HealthCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html","Properties":{"HealthyThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-healthythreshold","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"IntervalMillis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-intervalmillis","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeoutMillis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-timeoutmillis","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"UnhealthyThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-healthcheck.html#cfn-appmesh-virtualnode-healthcheck-unhealthythreshold","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.HttpTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-httptimeout.html","Properties":{"Idle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-httptimeout.html#cfn-appmesh-virtualnode-httptimeout-idle","Required":false,"Type":"Duration","UpdateType":"Mutable"},"PerRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-httptimeout.html#cfn-appmesh-virtualnode-httptimeout-perrequest","Required":false,"Type":"Duration","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.JsonFormatRef":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-jsonformatref.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-jsonformatref.html#cfn-appmesh-virtualnode-jsonformatref-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-jsonformatref.html#cfn-appmesh-virtualnode-jsonformatref-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.Listener":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html","Properties":{"ConnectionPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-connectionpool","Required":false,"Type":"VirtualNodeConnectionPool","UpdateType":"Mutable"},"HealthCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-healthcheck","Required":false,"Type":"HealthCheck","UpdateType":"Mutable"},"OutlierDetection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-outlierdetection","Required":false,"Type":"OutlierDetection","UpdateType":"Mutable"},"PortMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-portmapping","Required":true,"Type":"PortMapping","UpdateType":"Mutable"},"TLS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-tls","Required":false,"Type":"ListenerTls","UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listener.html#cfn-appmesh-virtualnode-listener-timeout","Required":false,"Type":"ListenerTimeout","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ListenerTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertimeout.html","Properties":{"GRPC":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertimeout.html#cfn-appmesh-virtualnode-listenertimeout-grpc","Required":false,"Type":"GrpcTimeout","UpdateType":"Mutable"},"HTTP":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertimeout.html#cfn-appmesh-virtualnode-listenertimeout-http","Required":false,"Type":"HttpTimeout","UpdateType":"Mutable"},"HTTP2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertimeout.html#cfn-appmesh-virtualnode-listenertimeout-http2","Required":false,"Type":"HttpTimeout","UpdateType":"Mutable"},"TCP":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertimeout.html#cfn-appmesh-virtualnode-listenertimeout-tcp","Required":false,"Type":"TcpTimeout","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ListenerTls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertls.html","Properties":{"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertls.html#cfn-appmesh-virtualnode-listenertls-certificate","Required":true,"Type":"ListenerTlsCertificate","UpdateType":"Mutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertls.html#cfn-appmesh-virtualnode-listenertls-mode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Validation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertls.html#cfn-appmesh-virtualnode-listenertls-validation","Required":false,"Type":"ListenerTlsValidationContext","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ListenerTlsAcmCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsacmcertificate.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsacmcertificate.html#cfn-appmesh-virtualnode-listenertlsacmcertificate-certificatearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ListenerTlsCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlscertificate.html","Properties":{"ACM":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlscertificate.html#cfn-appmesh-virtualnode-listenertlscertificate-acm","Required":false,"Type":"ListenerTlsAcmCertificate","UpdateType":"Mutable"},"File":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlscertificate.html#cfn-appmesh-virtualnode-listenertlscertificate-file","Required":false,"Type":"ListenerTlsFileCertificate","UpdateType":"Mutable"},"SDS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlscertificate.html#cfn-appmesh-virtualnode-listenertlscertificate-sds","Required":false,"Type":"ListenerTlsSdsCertificate","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ListenerTlsFileCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsfilecertificate.html","Properties":{"CertificateChain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsfilecertificate.html#cfn-appmesh-virtualnode-listenertlsfilecertificate-certificatechain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsfilecertificate.html#cfn-appmesh-virtualnode-listenertlsfilecertificate-privatekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ListenerTlsSdsCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlssdscertificate.html","Properties":{"SecretName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlssdscertificate.html#cfn-appmesh-virtualnode-listenertlssdscertificate-secretname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ListenerTlsValidationContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontext.html","Properties":{"SubjectAlternativeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontext.html#cfn-appmesh-virtualnode-listenertlsvalidationcontext-subjectalternativenames","Required":false,"Type":"SubjectAlternativeNames","UpdateType":"Mutable"},"Trust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontext.html#cfn-appmesh-virtualnode-listenertlsvalidationcontext-trust","Required":true,"Type":"ListenerTlsValidationContextTrust","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ListenerTlsValidationContextTrust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontexttrust.html","Properties":{"File":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontexttrust.html#cfn-appmesh-virtualnode-listenertlsvalidationcontexttrust-file","Required":false,"Type":"TlsValidationContextFileTrust","UpdateType":"Mutable"},"SDS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-listenertlsvalidationcontexttrust.html#cfn-appmesh-virtualnode-listenertlsvalidationcontexttrust-sds","Required":false,"Type":"TlsValidationContextSdsTrust","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-logging.html","Properties":{"AccessLog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-logging.html#cfn-appmesh-virtualnode-logging-accesslog","Required":false,"Type":"AccessLog","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.LoggingFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-loggingformat.html","Properties":{"Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-loggingformat.html#cfn-appmesh-virtualnode-loggingformat-json","ItemType":"JsonFormatRef","Required":false,"Type":"List","UpdateType":"Mutable"},"Text":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-loggingformat.html#cfn-appmesh-virtualnode-loggingformat-text","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.OutlierDetection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-outlierdetection.html","Properties":{"BaseEjectionDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-outlierdetection.html#cfn-appmesh-virtualnode-outlierdetection-baseejectionduration","Required":true,"Type":"Duration","UpdateType":"Mutable"},"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-outlierdetection.html#cfn-appmesh-virtualnode-outlierdetection-interval","Required":true,"Type":"Duration","UpdateType":"Mutable"},"MaxEjectionPercent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-outlierdetection.html#cfn-appmesh-virtualnode-outlierdetection-maxejectionpercent","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MaxServerErrors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-outlierdetection.html#cfn-appmesh-virtualnode-outlierdetection-maxservererrors","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.PortMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-portmapping.html","Properties":{"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-portmapping.html#cfn-appmesh-virtualnode-portmapping-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-portmapping.html#cfn-appmesh-virtualnode-portmapping-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.ServiceDiscovery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-servicediscovery.html","Properties":{"AWSCloudMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-servicediscovery.html#cfn-appmesh-virtualnode-servicediscovery-awscloudmap","Required":false,"Type":"AwsCloudMapServiceDiscovery","UpdateType":"Mutable"},"DNS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-servicediscovery.html#cfn-appmesh-virtualnode-servicediscovery-dns","Required":false,"Type":"DnsServiceDiscovery","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.SubjectAlternativeNameMatchers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-subjectalternativenamematchers.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-subjectalternativenamematchers.html#cfn-appmesh-virtualnode-subjectalternativenamematchers-exact","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.SubjectAlternativeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-subjectalternativenames.html","Properties":{"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-subjectalternativenames.html#cfn-appmesh-virtualnode-subjectalternativenames-match","Required":true,"Type":"SubjectAlternativeNameMatchers","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.TcpTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tcptimeout.html","Properties":{"Idle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tcptimeout.html#cfn-appmesh-virtualnode-tcptimeout-idle","Required":false,"Type":"Duration","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.TlsValidationContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontext.html","Properties":{"SubjectAlternativeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontext.html#cfn-appmesh-virtualnode-tlsvalidationcontext-subjectalternativenames","Required":false,"Type":"SubjectAlternativeNames","UpdateType":"Mutable"},"Trust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontext.html#cfn-appmesh-virtualnode-tlsvalidationcontext-trust","Required":true,"Type":"TlsValidationContextTrust","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.TlsValidationContextAcmTrust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextacmtrust.html","Properties":{"CertificateAuthorityArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextacmtrust.html#cfn-appmesh-virtualnode-tlsvalidationcontextacmtrust-certificateauthorityarns","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.TlsValidationContextFileTrust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextfiletrust.html","Properties":{"CertificateChain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextfiletrust.html#cfn-appmesh-virtualnode-tlsvalidationcontextfiletrust-certificatechain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.TlsValidationContextSdsTrust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextsdstrust.html","Properties":{"SecretName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontextsdstrust.html#cfn-appmesh-virtualnode-tlsvalidationcontextsdstrust-secretname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.TlsValidationContextTrust":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontexttrust.html","Properties":{"ACM":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontexttrust.html#cfn-appmesh-virtualnode-tlsvalidationcontexttrust-acm","Required":false,"Type":"TlsValidationContextAcmTrust","UpdateType":"Mutable"},"File":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontexttrust.html#cfn-appmesh-virtualnode-tlsvalidationcontexttrust-file","Required":false,"Type":"TlsValidationContextFileTrust","UpdateType":"Mutable"},"SDS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-tlsvalidationcontexttrust.html#cfn-appmesh-virtualnode-tlsvalidationcontexttrust-sds","Required":false,"Type":"TlsValidationContextSdsTrust","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.VirtualNodeConnectionPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodeconnectionpool.html","Properties":{"GRPC":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodeconnectionpool.html#cfn-appmesh-virtualnode-virtualnodeconnectionpool-grpc","Required":false,"Type":"VirtualNodeGrpcConnectionPool","UpdateType":"Mutable"},"HTTP":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodeconnectionpool.html#cfn-appmesh-virtualnode-virtualnodeconnectionpool-http","Required":false,"Type":"VirtualNodeHttpConnectionPool","UpdateType":"Mutable"},"HTTP2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodeconnectionpool.html#cfn-appmesh-virtualnode-virtualnodeconnectionpool-http2","Required":false,"Type":"VirtualNodeHttp2ConnectionPool","UpdateType":"Mutable"},"TCP":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodeconnectionpool.html#cfn-appmesh-virtualnode-virtualnodeconnectionpool-tcp","Required":false,"Type":"VirtualNodeTcpConnectionPool","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.VirtualNodeGrpcConnectionPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodegrpcconnectionpool.html","Properties":{"MaxRequests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodegrpcconnectionpool.html#cfn-appmesh-virtualnode-virtualnodegrpcconnectionpool-maxrequests","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.VirtualNodeHttp2ConnectionPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodehttp2connectionpool.html","Properties":{"MaxRequests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodehttp2connectionpool.html#cfn-appmesh-virtualnode-virtualnodehttp2connectionpool-maxrequests","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.VirtualNodeHttpConnectionPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodehttpconnectionpool.html","Properties":{"MaxConnections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodehttpconnectionpool.html#cfn-appmesh-virtualnode-virtualnodehttpconnectionpool-maxconnections","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MaxPendingRequests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodehttpconnectionpool.html#cfn-appmesh-virtualnode-virtualnodehttpconnectionpool-maxpendingrequests","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.VirtualNodeSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html","Properties":{"BackendDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html#cfn-appmesh-virtualnode-virtualnodespec-backenddefaults","Required":false,"Type":"BackendDefaults","UpdateType":"Mutable"},"Backends":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html#cfn-appmesh-virtualnode-virtualnodespec-backends","ItemType":"Backend","Required":false,"Type":"List","UpdateType":"Mutable"},"Listeners":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html#cfn-appmesh-virtualnode-virtualnodespec-listeners","ItemType":"Listener","Required":false,"Type":"List","UpdateType":"Mutable"},"Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html#cfn-appmesh-virtualnode-virtualnodespec-logging","Required":false,"Type":"Logging","UpdateType":"Mutable"},"ServiceDiscovery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodespec.html#cfn-appmesh-virtualnode-virtualnodespec-servicediscovery","Required":false,"Type":"ServiceDiscovery","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.VirtualNodeTcpConnectionPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodetcpconnectionpool.html","Properties":{"MaxConnections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualnodetcpconnectionpool.html#cfn-appmesh-virtualnode-virtualnodetcpconnectionpool-maxconnections","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualNode.VirtualServiceBackend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualservicebackend.html","Properties":{"ClientPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualservicebackend.html#cfn-appmesh-virtualnode-virtualservicebackend-clientpolicy","Required":false,"Type":"ClientPolicy","UpdateType":"Mutable"},"VirtualServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualnode-virtualservicebackend.html#cfn-appmesh-virtualnode-virtualservicebackend-virtualservicename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualRouter.PortMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-portmapping.html","Properties":{"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-portmapping.html#cfn-appmesh-virtualrouter-portmapping-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-portmapping.html#cfn-appmesh-virtualrouter-portmapping-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualRouter.VirtualRouterListener":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-virtualrouterlistener.html","Properties":{"PortMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-virtualrouterlistener.html#cfn-appmesh-virtualrouter-virtualrouterlistener-portmapping","Required":true,"Type":"PortMapping","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualRouter.VirtualRouterSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-virtualrouterspec.html","Properties":{"Listeners":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualrouter-virtualrouterspec.html#cfn-appmesh-virtualrouter-virtualrouterspec-listeners","ItemType":"VirtualRouterListener","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualService.VirtualNodeServiceProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualnodeserviceprovider.html","Properties":{"VirtualNodeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualnodeserviceprovider.html#cfn-appmesh-virtualservice-virtualnodeserviceprovider-virtualnodename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualService.VirtualRouterServiceProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualrouterserviceprovider.html","Properties":{"VirtualRouterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualrouterserviceprovider.html#cfn-appmesh-virtualservice-virtualrouterserviceprovider-virtualroutername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualService.VirtualServiceProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualserviceprovider.html","Properties":{"VirtualNode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualserviceprovider.html#cfn-appmesh-virtualservice-virtualserviceprovider-virtualnode","Required":false,"Type":"VirtualNodeServiceProvider","UpdateType":"Mutable"},"VirtualRouter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualserviceprovider.html#cfn-appmesh-virtualservice-virtualserviceprovider-virtualrouter","Required":false,"Type":"VirtualRouterServiceProvider","UpdateType":"Mutable"}}},"AWS::AppMesh::VirtualService.VirtualServiceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualservicespec.html","Properties":{"Provider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-virtualservice-virtualservicespec.html#cfn-appmesh-virtualservice-virtualservicespec-provider","Required":false,"Type":"VirtualServiceProvider","UpdateType":"Mutable"}}},"AWS::AppRunner::ObservabilityConfiguration.TraceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-observabilityconfiguration-traceconfiguration.html","Properties":{"Vendor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-observabilityconfiguration-traceconfiguration.html#cfn-apprunner-observabilityconfiguration-traceconfiguration-vendor","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppRunner::Service.AuthenticationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-authenticationconfiguration.html","Properties":{"AccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-authenticationconfiguration.html#cfn-apprunner-service-authenticationconfiguration-accessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-authenticationconfiguration.html#cfn-apprunner-service-authenticationconfiguration-connectionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.CodeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-codeconfiguration.html","Properties":{"CodeConfigurationValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-codeconfiguration.html#cfn-apprunner-service-codeconfiguration-codeconfigurationvalues","Required":false,"Type":"CodeConfigurationValues","UpdateType":"Mutable"},"ConfigurationSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-codeconfiguration.html#cfn-apprunner-service-codeconfiguration-configurationsource","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.CodeConfigurationValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-codeconfigurationvalues.html","Properties":{"BuildCommand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-codeconfigurationvalues.html#cfn-apprunner-service-codeconfigurationvalues-buildcommand","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-codeconfigurationvalues.html#cfn-apprunner-service-codeconfigurationvalues-port","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Runtime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-codeconfigurationvalues.html#cfn-apprunner-service-codeconfigurationvalues-runtime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RuntimeEnvironmentSecrets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-codeconfigurationvalues.html#cfn-apprunner-service-codeconfigurationvalues-runtimeenvironmentsecrets","DuplicatesAllowed":true,"ItemType":"KeyValuePair","Required":false,"Type":"List","UpdateType":"Mutable"},"RuntimeEnvironmentVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-codeconfigurationvalues.html#cfn-apprunner-service-codeconfigurationvalues-runtimeenvironmentvariables","DuplicatesAllowed":true,"ItemType":"KeyValuePair","Required":false,"Type":"List","UpdateType":"Mutable"},"StartCommand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-codeconfigurationvalues.html#cfn-apprunner-service-codeconfigurationvalues-startcommand","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.CodeRepository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-coderepository.html","Properties":{"CodeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-coderepository.html#cfn-apprunner-service-coderepository-codeconfiguration","Required":false,"Type":"CodeConfiguration","UpdateType":"Mutable"},"RepositoryUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-coderepository.html#cfn-apprunner-service-coderepository-repositoryurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceCodeVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-coderepository.html#cfn-apprunner-service-coderepository-sourcecodeversion","Required":true,"Type":"SourceCodeVersion","UpdateType":"Mutable"}}},"AWS::AppRunner::Service.EgressConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-egressconfiguration.html","Properties":{"EgressType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-egressconfiguration.html#cfn-apprunner-service-egressconfiguration-egresstype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpcConnectorArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-egressconfiguration.html#cfn-apprunner-service-egressconfiguration-vpcconnectorarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-encryptionconfiguration.html","Properties":{"KmsKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-encryptionconfiguration.html#cfn-apprunner-service-encryptionconfiguration-kmskey","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppRunner::Service.HealthCheckConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-healthcheckconfiguration.html","Properties":{"HealthyThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-healthcheckconfiguration.html#cfn-apprunner-service-healthcheckconfiguration-healthythreshold","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-healthcheckconfiguration.html#cfn-apprunner-service-healthcheckconfiguration-interval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-healthcheckconfiguration.html#cfn-apprunner-service-healthcheckconfiguration-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-healthcheckconfiguration.html#cfn-apprunner-service-healthcheckconfiguration-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-healthcheckconfiguration.html#cfn-apprunner-service-healthcheckconfiguration-timeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UnhealthyThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-healthcheckconfiguration.html#cfn-apprunner-service-healthcheckconfiguration-unhealthythreshold","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.ImageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-imageconfiguration.html","Properties":{"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-imageconfiguration.html#cfn-apprunner-service-imageconfiguration-port","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RuntimeEnvironmentSecrets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-imageconfiguration.html#cfn-apprunner-service-imageconfiguration-runtimeenvironmentsecrets","DuplicatesAllowed":true,"ItemType":"KeyValuePair","Required":false,"Type":"List","UpdateType":"Mutable"},"RuntimeEnvironmentVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-imageconfiguration.html#cfn-apprunner-service-imageconfiguration-runtimeenvironmentvariables","DuplicatesAllowed":true,"ItemType":"KeyValuePair","Required":false,"Type":"List","UpdateType":"Mutable"},"StartCommand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-imageconfiguration.html#cfn-apprunner-service-imageconfiguration-startcommand","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.ImageRepository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-imagerepository.html","Properties":{"ImageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-imagerepository.html#cfn-apprunner-service-imagerepository-imageconfiguration","Required":false,"Type":"ImageConfiguration","UpdateType":"Mutable"},"ImageIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-imagerepository.html#cfn-apprunner-service-imagerepository-imageidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ImageRepositoryType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-imagerepository.html#cfn-apprunner-service-imagerepository-imagerepositorytype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.IngressConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-ingressconfiguration.html","Properties":{"IsPubliclyAccessible":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-ingressconfiguration.html#cfn-apprunner-service-ingressconfiguration-ispubliclyaccessible","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.InstanceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-instanceconfiguration.html","Properties":{"Cpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-instanceconfiguration.html#cfn-apprunner-service-instanceconfiguration-cpu","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-instanceconfiguration.html#cfn-apprunner-service-instanceconfiguration-instancerolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Memory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-instanceconfiguration.html#cfn-apprunner-service-instanceconfiguration-memory","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.KeyValuePair":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-keyvaluepair.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-keyvaluepair.html#cfn-apprunner-service-keyvaluepair-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-keyvaluepair.html#cfn-apprunner-service-keyvaluepair-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-networkconfiguration.html","Properties":{"EgressConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-networkconfiguration.html#cfn-apprunner-service-networkconfiguration-egressconfiguration","Required":false,"Type":"EgressConfiguration","UpdateType":"Mutable"},"IngressConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-networkconfiguration.html#cfn-apprunner-service-networkconfiguration-ingressconfiguration","Required":false,"Type":"IngressConfiguration","UpdateType":"Mutable"}}},"AWS::AppRunner::Service.ServiceObservabilityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-serviceobservabilityconfiguration.html","Properties":{"ObservabilityConfigurationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-serviceobservabilityconfiguration.html#cfn-apprunner-service-serviceobservabilityconfiguration-observabilityconfigurationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ObservabilityEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-serviceobservabilityconfiguration.html#cfn-apprunner-service-serviceobservabilityconfiguration-observabilityenabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.SourceCodeVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-sourcecodeversion.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-sourcecodeversion.html#cfn-apprunner-service-sourcecodeversion-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-sourcecodeversion.html#cfn-apprunner-service-sourcecodeversion-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppRunner::Service.SourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-sourceconfiguration.html","Properties":{"AuthenticationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-sourceconfiguration.html#cfn-apprunner-service-sourceconfiguration-authenticationconfiguration","Required":false,"Type":"AuthenticationConfiguration","UpdateType":"Mutable"},"AutoDeploymentsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-sourceconfiguration.html#cfn-apprunner-service-sourceconfiguration-autodeploymentsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CodeRepository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-sourceconfiguration.html#cfn-apprunner-service-sourceconfiguration-coderepository","Required":false,"Type":"CodeRepository","UpdateType":"Mutable"},"ImageRepository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-sourceconfiguration.html#cfn-apprunner-service-sourceconfiguration-imagerepository","Required":false,"Type":"ImageRepository","UpdateType":"Mutable"}}},"AWS::AppRunner::VpcIngressConnection.IngressVpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-vpcingressconnection-ingressvpcconfiguration.html","Properties":{"VpcEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-vpcingressconnection-ingressvpcconfiguration.html#cfn-apprunner-vpcingressconnection-ingressvpcconfiguration-vpcendpointid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-vpcingressconnection-ingressvpcconfiguration.html#cfn-apprunner-vpcingressconnection-ingressvpcconfiguration-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppStream::AppBlock.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-s3location.html","Properties":{"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-s3location.html#cfn-appstream-appblock-s3location-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-s3location.html#cfn-appstream-appblock-s3location-s3key","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::AppStream::AppBlock.ScriptDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html","Properties":{"ExecutableParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-executableparameters","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ExecutablePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-executablepath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ScriptS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-scripts3location","Required":true,"Type":"S3Location","UpdateType":"Immutable"},"TimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-timeoutinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::AppStream::AppBlockBuilder.AccessEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-accessendpoint.html","Properties":{"EndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-accessendpoint.html#cfn-appstream-appblockbuilder-accessendpoint-endpointtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-accessendpoint.html#cfn-appstream-appblockbuilder-accessendpoint-vpceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppStream::AppBlockBuilder.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-vpcconfig.html#cfn-appstream-appblockbuilder-vpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblockbuilder-vpcconfig.html#cfn-appstream-appblockbuilder-vpcconfig-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppStream::Application.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-application-s3location.html","Properties":{"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-application-s3location.html#cfn-appstream-application-s3location-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-application-s3location.html#cfn-appstream-application-s3location-s3key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppStream::DirectoryConfig.CertificateBasedAuthProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-certificatebasedauthproperties.html","Properties":{"CertificateAuthorityArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-certificatebasedauthproperties.html#cfn-appstream-directoryconfig-certificatebasedauthproperties-certificateauthorityarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-certificatebasedauthproperties.html#cfn-appstream-directoryconfig-certificatebasedauthproperties-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppStream::DirectoryConfig.ServiceAccountCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-serviceaccountcredentials.html","Properties":{"AccountName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-serviceaccountcredentials.html#cfn-appstream-directoryconfig-serviceaccountcredentials-accountname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AccountPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-directoryconfig-serviceaccountcredentials.html#cfn-appstream-directoryconfig-serviceaccountcredentials-accountpassword","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppStream::Entitlement.Attribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-entitlement-attribute.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-entitlement-attribute.html#cfn-appstream-entitlement-attribute-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-entitlement-attribute.html#cfn-appstream-entitlement-attribute-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppStream::Fleet.ComputeCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-computecapacity.html","Properties":{"DesiredInstances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-computecapacity.html#cfn-appstream-fleet-computecapacity-desiredinstances","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AppStream::Fleet.DomainJoinInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-domainjoininfo.html","Properties":{"DirectoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-domainjoininfo.html#cfn-appstream-fleet-domainjoininfo-directoryname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OrganizationalUnitDistinguishedName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-domainjoininfo.html#cfn-appstream-fleet-domainjoininfo-organizationalunitdistinguishedname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppStream::Fleet.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-s3location.html","Properties":{"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-s3location.html#cfn-appstream-fleet-s3location-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-s3location.html#cfn-appstream-fleet-s3location-s3key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppStream::Fleet.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-vpcconfig.html#cfn-appstream-fleet-vpcconfig-securitygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-fleet-vpcconfig.html#cfn-appstream-fleet-vpcconfig-subnetids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppStream::ImageBuilder.AccessEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-accessendpoint.html","Properties":{"EndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-accessendpoint.html#cfn-appstream-imagebuilder-accessendpoint-endpointtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-accessendpoint.html#cfn-appstream-imagebuilder-accessendpoint-vpceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppStream::ImageBuilder.DomainJoinInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-domainjoininfo.html","Properties":{"DirectoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-domainjoininfo.html#cfn-appstream-imagebuilder-domainjoininfo-directoryname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OrganizationalUnitDistinguishedName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-domainjoininfo.html#cfn-appstream-imagebuilder-domainjoininfo-organizationalunitdistinguishedname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppStream::ImageBuilder.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-vpcconfig.html#cfn-appstream-imagebuilder-vpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-imagebuilder-vpcconfig.html#cfn-appstream-imagebuilder-vpcconfig-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppStream::Stack.AccessEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-accessendpoint.html","Properties":{"EndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-accessendpoint.html#cfn-appstream-stack-accessendpoint-endpointtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-accessendpoint.html#cfn-appstream-stack-accessendpoint-vpceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppStream::Stack.ApplicationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-applicationsettings.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-applicationsettings.html#cfn-appstream-stack-applicationsettings-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"SettingsGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-applicationsettings.html#cfn-appstream-stack-applicationsettings-settingsgroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppStream::Stack.StorageConnector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-storageconnector.html","Properties":{"ConnectorType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-storageconnector.html#cfn-appstream-stack-storageconnector-connectortype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Domains":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-storageconnector.html#cfn-appstream-stack-storageconnector-domains","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-storageconnector.html#cfn-appstream-stack-storageconnector-resourceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppStream::Stack.StreamingExperienceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-streamingexperiencesettings.html","Properties":{"PreferredProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-streamingexperiencesettings.html#cfn-appstream-stack-streamingexperiencesettings-preferredprotocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppStream::Stack.UserSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-usersetting.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-usersetting.html#cfn-appstream-stack-usersetting-action","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Permission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-stack-usersetting.html#cfn-appstream-stack-usersetting-permission","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::DataSource.AuthorizationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-authorizationconfig.html","Properties":{"AuthorizationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-authorizationconfig.html#cfn-appsync-datasource-authorizationconfig-authorizationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AwsIamConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-authorizationconfig.html#cfn-appsync-datasource-authorizationconfig-awsiamconfig","Required":false,"Type":"AwsIamConfig","UpdateType":"Mutable"}}},"AWS::AppSync::DataSource.AwsIamConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-awsiamconfig.html","Properties":{"SigningRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-awsiamconfig.html#cfn-appsync-datasource-awsiamconfig-signingregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SigningServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-awsiamconfig.html#cfn-appsync-datasource-awsiamconfig-signingservicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::DataSource.DeltaSyncConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-deltasyncconfig.html","Properties":{"BaseTableTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-deltasyncconfig.html#cfn-appsync-datasource-deltasyncconfig-basetablettl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DeltaSyncTableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-deltasyncconfig.html#cfn-appsync-datasource-deltasyncconfig-deltasynctablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DeltaSyncTableTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-deltasyncconfig.html#cfn-appsync-datasource-deltasyncconfig-deltasynctablettl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::DataSource.DynamoDBConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-dynamodbconfig.html","Properties":{"AwsRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-dynamodbconfig.html#cfn-appsync-datasource-dynamodbconfig-awsregion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DeltaSyncConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-dynamodbconfig.html#cfn-appsync-datasource-dynamodbconfig-deltasyncconfig","Required":false,"Type":"DeltaSyncConfig","UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-dynamodbconfig.html#cfn-appsync-datasource-dynamodbconfig-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UseCallerCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-dynamodbconfig.html#cfn-appsync-datasource-dynamodbconfig-usecallercredentials","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Versioned":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-dynamodbconfig.html#cfn-appsync-datasource-dynamodbconfig-versioned","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::DataSource.ElasticsearchConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-elasticsearchconfig.html","Properties":{"AwsRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-elasticsearchconfig.html#cfn-appsync-datasource-elasticsearchconfig-awsregion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-elasticsearchconfig.html#cfn-appsync-datasource-elasticsearchconfig-endpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::DataSource.EventBridgeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-eventbridgeconfig.html","Properties":{"EventBusArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-eventbridgeconfig.html#cfn-appsync-datasource-eventbridgeconfig-eventbusarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::DataSource.HttpConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-httpconfig.html","Properties":{"AuthorizationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-httpconfig.html#cfn-appsync-datasource-httpconfig-authorizationconfig","Required":false,"Type":"AuthorizationConfig","UpdateType":"Mutable"},"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-httpconfig.html#cfn-appsync-datasource-httpconfig-endpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::DataSource.LambdaConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-lambdaconfig.html","Properties":{"LambdaFunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-lambdaconfig.html#cfn-appsync-datasource-lambdaconfig-lambdafunctionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::DataSource.OpenSearchServiceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-opensearchserviceconfig.html","Properties":{"AwsRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-opensearchserviceconfig.html#cfn-appsync-datasource-opensearchserviceconfig-awsregion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-opensearchserviceconfig.html#cfn-appsync-datasource-opensearchserviceconfig-endpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::DataSource.RdsHttpEndpointConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-rdshttpendpointconfig.html","Properties":{"AwsRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-rdshttpendpointconfig.html#cfn-appsync-datasource-rdshttpendpointconfig-awsregion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AwsSecretStoreArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-rdshttpendpointconfig.html#cfn-appsync-datasource-rdshttpendpointconfig-awssecretstorearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-rdshttpendpointconfig.html#cfn-appsync-datasource-rdshttpendpointconfig-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DbClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-rdshttpendpointconfig.html#cfn-appsync-datasource-rdshttpendpointconfig-dbclusteridentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-rdshttpendpointconfig.html#cfn-appsync-datasource-rdshttpendpointconfig-schema","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::DataSource.RelationalDatabaseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-relationaldatabaseconfig.html","Properties":{"RdsHttpEndpointConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-relationaldatabaseconfig.html#cfn-appsync-datasource-relationaldatabaseconfig-rdshttpendpointconfig","Required":false,"Type":"RdsHttpEndpointConfig","UpdateType":"Mutable"},"RelationalDatabaseSourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-relationaldatabaseconfig.html#cfn-appsync-datasource-relationaldatabaseconfig-relationaldatabasesourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::FunctionConfiguration.AppSyncRuntime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-appsyncruntime.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-appsyncruntime.html#cfn-appsync-functionconfiguration-appsyncruntime-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RuntimeVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-appsyncruntime.html#cfn-appsync-functionconfiguration-appsyncruntime-runtimeversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::FunctionConfiguration.LambdaConflictHandlerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-lambdaconflicthandlerconfig.html","Properties":{"LambdaConflictHandlerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-lambdaconflicthandlerconfig.html#cfn-appsync-functionconfiguration-lambdaconflicthandlerconfig-lambdaconflicthandlerarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::FunctionConfiguration.SyncConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-syncconfig.html","Properties":{"ConflictDetection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-syncconfig.html#cfn-appsync-functionconfiguration-syncconfig-conflictdetection","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConflictHandler":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-syncconfig.html#cfn-appsync-functionconfiguration-syncconfig-conflicthandler","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LambdaConflictHandlerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-functionconfiguration-syncconfig.html#cfn-appsync-functionconfiguration-syncconfig-lambdaconflicthandlerconfig","Required":false,"Type":"LambdaConflictHandlerConfig","UpdateType":"Mutable"}}},"AWS::AppSync::GraphQLApi.AdditionalAuthenticationProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-additionalauthenticationprovider.html","Properties":{"AuthenticationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-additionalauthenticationprovider.html#cfn-appsync-graphqlapi-additionalauthenticationprovider-authenticationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LambdaAuthorizerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-additionalauthenticationprovider.html#cfn-appsync-graphqlapi-additionalauthenticationprovider-lambdaauthorizerconfig","Required":false,"Type":"LambdaAuthorizerConfig","UpdateType":"Mutable"},"OpenIDConnectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-additionalauthenticationprovider.html#cfn-appsync-graphqlapi-additionalauthenticationprovider-openidconnectconfig","Required":false,"Type":"OpenIDConnectConfig","UpdateType":"Mutable"},"UserPoolConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-additionalauthenticationprovider.html#cfn-appsync-graphqlapi-additionalauthenticationprovider-userpoolconfig","Required":false,"Type":"CognitoUserPoolConfig","UpdateType":"Mutable"}}},"AWS::AppSync::GraphQLApi.CognitoUserPoolConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-cognitouserpoolconfig.html","Properties":{"AppIdClientRegex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-cognitouserpoolconfig.html#cfn-appsync-graphqlapi-cognitouserpoolconfig-appidclientregex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AwsRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-cognitouserpoolconfig.html#cfn-appsync-graphqlapi-cognitouserpoolconfig-awsregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-cognitouserpoolconfig.html#cfn-appsync-graphqlapi-cognitouserpoolconfig-userpoolid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::GraphQLApi.LambdaAuthorizerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-lambdaauthorizerconfig.html","Properties":{"AuthorizerResultTtlInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-lambdaauthorizerconfig.html#cfn-appsync-graphqlapi-lambdaauthorizerconfig-authorizerresultttlinseconds","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"AuthorizerUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-lambdaauthorizerconfig.html#cfn-appsync-graphqlapi-lambdaauthorizerconfig-authorizeruri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdentityValidationExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-lambdaauthorizerconfig.html#cfn-appsync-graphqlapi-lambdaauthorizerconfig-identityvalidationexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::GraphQLApi.LogConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-logconfig.html","Properties":{"CloudWatchLogsRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-logconfig.html#cfn-appsync-graphqlapi-logconfig-cloudwatchlogsrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExcludeVerboseContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-logconfig.html#cfn-appsync-graphqlapi-logconfig-excludeverbosecontent","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"FieldLogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-logconfig.html#cfn-appsync-graphqlapi-logconfig-fieldloglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::GraphQLApi.OpenIDConnectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-openidconnectconfig.html","Properties":{"AuthTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-openidconnectconfig.html#cfn-appsync-graphqlapi-openidconnectconfig-authttl","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-openidconnectconfig.html#cfn-appsync-graphqlapi-openidconnectconfig-clientid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IatTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-openidconnectconfig.html#cfn-appsync-graphqlapi-openidconnectconfig-iatttl","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Issuer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-openidconnectconfig.html#cfn-appsync-graphqlapi-openidconnectconfig-issuer","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::GraphQLApi.UserPoolConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-userpoolconfig.html","Properties":{"AppIdClientRegex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-userpoolconfig.html#cfn-appsync-graphqlapi-userpoolconfig-appidclientregex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AwsRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-userpoolconfig.html#cfn-appsync-graphqlapi-userpoolconfig-awsregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-userpoolconfig.html#cfn-appsync-graphqlapi-userpoolconfig-defaultaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-userpoolconfig.html#cfn-appsync-graphqlapi-userpoolconfig-userpoolid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::Resolver.AppSyncRuntime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-appsyncruntime.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-appsyncruntime.html#cfn-appsync-resolver-appsyncruntime-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RuntimeVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-appsyncruntime.html#cfn-appsync-resolver-appsyncruntime-runtimeversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::Resolver.CachingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-cachingconfig.html","Properties":{"CachingKeys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-cachingconfig.html#cfn-appsync-resolver-cachingconfig-cachingkeys","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Ttl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-cachingconfig.html#cfn-appsync-resolver-cachingconfig-ttl","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::Resolver.LambdaConflictHandlerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-lambdaconflicthandlerconfig.html","Properties":{"LambdaConflictHandlerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-lambdaconflicthandlerconfig.html#cfn-appsync-resolver-lambdaconflicthandlerconfig-lambdaconflicthandlerarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::Resolver.PipelineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-pipelineconfig.html","Properties":{"Functions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-pipelineconfig.html#cfn-appsync-resolver-pipelineconfig-functions","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppSync::Resolver.SyncConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-syncconfig.html","Properties":{"ConflictDetection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-syncconfig.html#cfn-appsync-resolver-syncconfig-conflictdetection","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConflictHandler":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-syncconfig.html#cfn-appsync-resolver-syncconfig-conflicthandler","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LambdaConflictHandlerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-resolver-syncconfig.html#cfn-appsync-resolver-syncconfig-lambdaconflicthandlerconfig","Required":false,"Type":"LambdaConflictHandlerConfig","UpdateType":"Mutable"}}},"AWS::AppSync::SourceApiAssociation.SourceApiAssociationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-sourceapiassociation-sourceapiassociationconfig.html","Properties":{"MergeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-sourceapiassociation-sourceapiassociationconfig.html#cfn-appsync-sourceapiassociation-sourceapiassociationconfig-mergetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApplicationAutoScaling::ScalableTarget.ScalableTargetAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scalabletargetaction.html","Properties":{"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scalabletargetaction.html#cfn-applicationautoscaling-scalabletarget-scalabletargetaction-maxcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scalabletargetaction.html#cfn-applicationautoscaling-scalabletarget-scalabletargetaction-mincapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ApplicationAutoScaling::ScalableTarget.ScheduledAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scheduledaction.html","Properties":{"EndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scheduledaction.html#cfn-applicationautoscaling-scalabletarget-scheduledaction-endtime","PrimitiveType":"Timestamp","Required":false,"UpdateType":"Mutable"},"ScalableTargetAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scheduledaction.html#cfn-applicationautoscaling-scalabletarget-scheduledaction-scalabletargetaction","Required":false,"Type":"ScalableTargetAction","UpdateType":"Mutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scheduledaction.html#cfn-applicationautoscaling-scalabletarget-scheduledaction-schedule","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScheduledActionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scheduledaction.html#cfn-applicationautoscaling-scalabletarget-scheduledaction-scheduledactionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scheduledaction.html#cfn-applicationautoscaling-scalabletarget-scheduledaction-starttime","PrimitiveType":"Timestamp","Required":false,"UpdateType":"Mutable"},"Timezone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-scheduledaction.html#cfn-applicationautoscaling-scalabletarget-scheduledaction-timezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApplicationAutoScaling::ScalableTarget.SuspendedState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-suspendedstate.html","Properties":{"DynamicScalingInSuspended":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-suspendedstate.html#cfn-applicationautoscaling-scalabletarget-suspendedstate-dynamicscalinginsuspended","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DynamicScalingOutSuspended":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-suspendedstate.html#cfn-applicationautoscaling-scalabletarget-suspendedstate-dynamicscalingoutsuspended","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ScheduledScalingSuspended":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalabletarget-suspendedstate.html#cfn-applicationautoscaling-scalabletarget-suspendedstate-scheduledscalingsuspended","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::ApplicationAutoScaling::ScalingPolicy.CustomizedMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-customizedmetricspecification.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-customizedmetricspecification.html#cfn-applicationautoscaling-scalingpolicy-customizedmetricspecification-dimensions","DuplicatesAllowed":false,"ItemType":"MetricDimension","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-customizedmetricspecification.html#cfn-applicationautoscaling-scalingpolicy-customizedmetricspecification-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-customizedmetricspecification.html#cfn-applicationautoscaling-scalingpolicy-customizedmetricspecification-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Statistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-customizedmetricspecification.html#cfn-applicationautoscaling-scalingpolicy-customizedmetricspecification-statistic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-customizedmetricspecification.html#cfn-applicationautoscaling-scalingpolicy-customizedmetricspecification-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApplicationAutoScaling::ScalingPolicy.MetricDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-metricdimension.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-metricdimension.html#cfn-applicationautoscaling-scalingpolicy-metricdimension-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-metricdimension.html#cfn-applicationautoscaling-scalingpolicy-metricdimension-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApplicationAutoScaling::ScalingPolicy.PredefinedMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-predefinedmetricspecification.html","Properties":{"PredefinedMetricType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-predefinedmetricspecification.html#cfn-applicationautoscaling-scalingpolicy-predefinedmetricspecification-predefinedmetrictype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-predefinedmetricspecification.html#cfn-applicationautoscaling-scalingpolicy-predefinedmetricspecification-resourcelabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApplicationAutoScaling::ScalingPolicy.StepAdjustment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-stepadjustment.html","Properties":{"MetricIntervalLowerBound":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-stepadjustment.html#cfn-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-stepadjustment-metricintervallowerbound","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MetricIntervalUpperBound":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-stepadjustment.html#cfn-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-stepadjustment-metricintervalupperbound","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ScalingAdjustment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-stepadjustment.html#cfn-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-stepadjustment-scalingadjustment","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::ApplicationAutoScaling::ScalingPolicy.StepScalingPolicyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration.html","Properties":{"AdjustmentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration.html#cfn-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-adjustmenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Cooldown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration.html#cfn-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-cooldown","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MetricAggregationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration.html#cfn-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-metricaggregationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MinAdjustmentMagnitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration.html#cfn-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-minadjustmentmagnitude","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StepAdjustments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration.html#cfn-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration-stepadjustments","DuplicatesAllowed":false,"ItemType":"StepAdjustment","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApplicationAutoScaling::ScalingPolicy.TargetTrackingScalingPolicyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration.html","Properties":{"CustomizedMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration.html#cfn-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration-customizedmetricspecification","Required":false,"Type":"CustomizedMetricSpecification","UpdateType":"Mutable"},"DisableScaleIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration.html#cfn-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration-disablescalein","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PredefinedMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration.html#cfn-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration-predefinedmetricspecification","Required":false,"Type":"PredefinedMetricSpecification","UpdateType":"Mutable"},"ScaleInCooldown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration.html#cfn-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration-scaleincooldown","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ScaleOutCooldown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration.html#cfn-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration-scaleoutcooldown","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TargetValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration.html#cfn-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration-targetvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.Alarm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-alarm.html","Properties":{"AlarmName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-alarm.html#cfn-applicationinsights-application-alarm-alarmname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Severity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-alarm.html#cfn-applicationinsights-application-alarm-severity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.AlarmMetric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-alarmmetric.html","Properties":{"AlarmMetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-alarmmetric.html#cfn-applicationinsights-application-alarmmetric-alarmmetricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.ComponentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-componentconfiguration.html","Properties":{"ConfigurationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-componentconfiguration.html#cfn-applicationinsights-application-componentconfiguration-configurationdetails","Required":false,"Type":"ConfigurationDetails","UpdateType":"Mutable"},"SubComponentTypeConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-componentconfiguration.html#cfn-applicationinsights-application-componentconfiguration-subcomponenttypeconfigurations","DuplicatesAllowed":true,"ItemType":"SubComponentTypeConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.ComponentMonitoringSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-componentmonitoringsetting.html","Properties":{"ComponentARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-componentmonitoringsetting.html#cfn-applicationinsights-application-componentmonitoringsetting-componentarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ComponentConfigurationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-componentmonitoringsetting.html#cfn-applicationinsights-application-componentmonitoringsetting-componentconfigurationmode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ComponentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-componentmonitoringsetting.html#cfn-applicationinsights-application-componentmonitoringsetting-componentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomComponentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-componentmonitoringsetting.html#cfn-applicationinsights-application-componentmonitoringsetting-customcomponentconfiguration","Required":false,"Type":"ComponentConfiguration","UpdateType":"Mutable"},"DefaultOverwriteComponentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-componentmonitoringsetting.html#cfn-applicationinsights-application-componentmonitoringsetting-defaultoverwritecomponentconfiguration","Required":false,"Type":"ComponentConfiguration","UpdateType":"Mutable"},"Tier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-componentmonitoringsetting.html#cfn-applicationinsights-application-componentmonitoringsetting-tier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.ConfigurationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-configurationdetails.html","Properties":{"AlarmMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-configurationdetails.html#cfn-applicationinsights-application-configurationdetails-alarmmetrics","DuplicatesAllowed":true,"ItemType":"AlarmMetric","Required":false,"Type":"List","UpdateType":"Mutable"},"Alarms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-configurationdetails.html#cfn-applicationinsights-application-configurationdetails-alarms","DuplicatesAllowed":true,"ItemType":"Alarm","Required":false,"Type":"List","UpdateType":"Mutable"},"HAClusterPrometheusExporter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-configurationdetails.html#cfn-applicationinsights-application-configurationdetails-haclusterprometheusexporter","Required":false,"Type":"HAClusterPrometheusExporter","UpdateType":"Mutable"},"HANAPrometheusExporter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-configurationdetails.html#cfn-applicationinsights-application-configurationdetails-hanaprometheusexporter","Required":false,"Type":"HANAPrometheusExporter","UpdateType":"Mutable"},"JMXPrometheusExporter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-configurationdetails.html#cfn-applicationinsights-application-configurationdetails-jmxprometheusexporter","Required":false,"Type":"JMXPrometheusExporter","UpdateType":"Mutable"},"Logs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-configurationdetails.html#cfn-applicationinsights-application-configurationdetails-logs","DuplicatesAllowed":true,"ItemType":"Log","Required":false,"Type":"List","UpdateType":"Mutable"},"WindowsEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-configurationdetails.html#cfn-applicationinsights-application-configurationdetails-windowsevents","DuplicatesAllowed":true,"ItemType":"WindowsEvent","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.CustomComponent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-customcomponent.html","Properties":{"ComponentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-customcomponent.html#cfn-applicationinsights-application-customcomponent-componentname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-customcomponent.html#cfn-applicationinsights-application-customcomponent-resourcelist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.HAClusterPrometheusExporter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-haclusterprometheusexporter.html","Properties":{"PrometheusPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-haclusterprometheusexporter.html#cfn-applicationinsights-application-haclusterprometheusexporter-prometheusport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.HANAPrometheusExporter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html","Properties":{"AgreeToInstallHANADBClient":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html#cfn-applicationinsights-application-hanaprometheusexporter-agreetoinstallhanadbclient","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"HANAPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html#cfn-applicationinsights-application-hanaprometheusexporter-hanaport","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HANASID":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html#cfn-applicationinsights-application-hanaprometheusexporter-hanasid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HANASecretName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html#cfn-applicationinsights-application-hanaprometheusexporter-hanasecretname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PrometheusPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html#cfn-applicationinsights-application-hanaprometheusexporter-prometheusport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.JMXPrometheusExporter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-jmxprometheusexporter.html","Properties":{"HostPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-jmxprometheusexporter.html#cfn-applicationinsights-application-jmxprometheusexporter-hostport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JMXURL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-jmxprometheusexporter.html#cfn-applicationinsights-application-jmxprometheusexporter-jmxurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrometheusPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-jmxprometheusexporter.html#cfn-applicationinsights-application-jmxprometheusexporter-prometheusport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.Log":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-log.html","Properties":{"Encoding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-log.html#cfn-applicationinsights-application-log-encoding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-log.html#cfn-applicationinsights-application-log-loggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-log.html#cfn-applicationinsights-application-log-logpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-log.html#cfn-applicationinsights-application-log-logtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PatternSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-log.html#cfn-applicationinsights-application-log-patternset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.LogPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-logpattern.html","Properties":{"Pattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-logpattern.html#cfn-applicationinsights-application-logpattern-pattern","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PatternName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-logpattern.html#cfn-applicationinsights-application-logpattern-patternname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Rank":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-logpattern.html#cfn-applicationinsights-application-logpattern-rank","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.LogPatternSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-logpatternset.html","Properties":{"LogPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-logpatternset.html#cfn-applicationinsights-application-logpatternset-logpatterns","DuplicatesAllowed":true,"ItemType":"LogPattern","Required":true,"Type":"List","UpdateType":"Mutable"},"PatternSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-logpatternset.html#cfn-applicationinsights-application-logpatternset-patternsetname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.SubComponentConfigurationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-subcomponentconfigurationdetails.html","Properties":{"AlarmMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-subcomponentconfigurationdetails.html#cfn-applicationinsights-application-subcomponentconfigurationdetails-alarmmetrics","DuplicatesAllowed":true,"ItemType":"AlarmMetric","Required":false,"Type":"List","UpdateType":"Mutable"},"Logs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-subcomponentconfigurationdetails.html#cfn-applicationinsights-application-subcomponentconfigurationdetails-logs","DuplicatesAllowed":true,"ItemType":"Log","Required":false,"Type":"List","UpdateType":"Mutable"},"WindowsEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-subcomponentconfigurationdetails.html#cfn-applicationinsights-application-subcomponentconfigurationdetails-windowsevents","DuplicatesAllowed":true,"ItemType":"WindowsEvent","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.SubComponentTypeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-subcomponenttypeconfiguration.html","Properties":{"SubComponentConfigurationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-subcomponenttypeconfiguration.html#cfn-applicationinsights-application-subcomponenttypeconfiguration-subcomponentconfigurationdetails","Required":true,"Type":"SubComponentConfigurationDetails","UpdateType":"Mutable"},"SubComponentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-subcomponenttypeconfiguration.html#cfn-applicationinsights-application-subcomponenttypeconfiguration-subcomponenttype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application.WindowsEvent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-windowsevent.html","Properties":{"EventLevels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-windowsevent.html#cfn-applicationinsights-application-windowsevent-eventlevels","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"EventName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-windowsevent.html#cfn-applicationinsights-application-windowsevent-eventname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-windowsevent.html#cfn-applicationinsights-application-windowsevent-loggroupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PatternSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-windowsevent.html#cfn-applicationinsights-application-windowsevent-patternset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Athena::CapacityReservation.CapacityAssignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-capacityreservation-capacityassignment.html","Properties":{"WorkgroupNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-capacityreservation-capacityassignment.html#cfn-athena-capacityreservation-capacityassignment-workgroupnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Athena::CapacityReservation.CapacityAssignmentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-capacityreservation-capacityassignmentconfiguration.html","Properties":{"CapacityAssignments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-capacityreservation-capacityassignmentconfiguration.html#cfn-athena-capacityreservation-capacityassignmentconfiguration-capacityassignments","DuplicatesAllowed":true,"ItemType":"CapacityAssignment","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Athena::WorkGroup.AclConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-aclconfiguration.html","Properties":{"S3AclOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-aclconfiguration.html#cfn-athena-workgroup-aclconfiguration-s3acloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Athena::WorkGroup.CustomerContentEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-customercontentencryptionconfiguration.html","Properties":{"KmsKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-customercontentencryptionconfiguration.html#cfn-athena-workgroup-customercontentencryptionconfiguration-kmskey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Athena::WorkGroup.EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-encryptionconfiguration.html","Properties":{"EncryptionOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-encryptionconfiguration.html#cfn-athena-workgroup-encryptionconfiguration-encryptionoption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KmsKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-encryptionconfiguration.html#cfn-athena-workgroup-encryptionconfiguration-kmskey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Athena::WorkGroup.EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-engineversion.html","Properties":{"EffectiveEngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-engineversion.html#cfn-athena-workgroup-engineversion-effectiveengineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectedEngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-engineversion.html#cfn-athena-workgroup-engineversion-selectedengineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Athena::WorkGroup.ResultConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-resultconfiguration.html","Properties":{"AclConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-resultconfiguration.html#cfn-athena-workgroup-resultconfiguration-aclconfiguration","Required":false,"Type":"AclConfiguration","UpdateType":"Mutable"},"EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-resultconfiguration.html#cfn-athena-workgroup-resultconfiguration-encryptionconfiguration","Required":false,"Type":"EncryptionConfiguration","UpdateType":"Mutable"},"ExpectedBucketOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-resultconfiguration.html#cfn-athena-workgroup-resultconfiguration-expectedbucketowner","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutputLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-resultconfiguration.html#cfn-athena-workgroup-resultconfiguration-outputlocation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Athena::WorkGroup.WorkGroupConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-workgroupconfiguration.html","Properties":{"AdditionalConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-workgroupconfiguration.html#cfn-athena-workgroup-workgroupconfiguration-additionalconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BytesScannedCutoffPerQuery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-workgroupconfiguration.html#cfn-athena-workgroup-workgroupconfiguration-bytesscannedcutoffperquery","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CustomerContentEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-workgroupconfiguration.html#cfn-athena-workgroup-workgroupconfiguration-customercontentencryptionconfiguration","Required":false,"Type":"CustomerContentEncryptionConfiguration","UpdateType":"Mutable"},"EnforceWorkGroupConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-workgroupconfiguration.html#cfn-athena-workgroup-workgroupconfiguration-enforceworkgroupconfiguration","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-workgroupconfiguration.html#cfn-athena-workgroup-workgroupconfiguration-engineversion","Required":false,"Type":"EngineVersion","UpdateType":"Mutable"},"ExecutionRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-workgroupconfiguration.html#cfn-athena-workgroup-workgroupconfiguration-executionrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PublishCloudWatchMetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-workgroupconfiguration.html#cfn-athena-workgroup-workgroupconfiguration-publishcloudwatchmetricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RequesterPaysEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-workgroupconfiguration.html#cfn-athena-workgroup-workgroupconfiguration-requesterpaysenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ResultConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-athena-workgroup-workgroupconfiguration.html#cfn-athena-workgroup-workgroupconfiguration-resultconfiguration","Required":false,"Type":"ResultConfiguration","UpdateType":"Mutable"}}},"AWS::AuditManager::Assessment.AWSAccount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-awsaccount.html","Properties":{"EmailAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-awsaccount.html#cfn-auditmanager-assessment-awsaccount-emailaddress","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-awsaccount.html#cfn-auditmanager-assessment-awsaccount-id","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-awsaccount.html#cfn-auditmanager-assessment-awsaccount-name","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"}}},"AWS::AuditManager::Assessment.AWSService":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-awsservice.html","Properties":{"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-awsservice.html#cfn-auditmanager-assessment-awsservice-servicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AuditManager::Assessment.AssessmentReportsDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-assessmentreportsdestination.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-assessmentreportsdestination.html#cfn-auditmanager-assessment-assessmentreportsdestination-destination","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-assessmentreportsdestination.html#cfn-auditmanager-assessment-assessmentreportsdestination-destinationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AuditManager::Assessment.Delegation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html","Properties":{"AssessmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html#cfn-auditmanager-assessment-delegation-assessmentid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AssessmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html#cfn-auditmanager-assessment-delegation-assessmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html#cfn-auditmanager-assessment-delegation-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ControlSetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html#cfn-auditmanager-assessment-delegation-controlsetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html#cfn-auditmanager-assessment-delegation-createdby","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreationTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html#cfn-auditmanager-assessment-delegation-creationtime","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html#cfn-auditmanager-assessment-delegation-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LastUpdated":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html#cfn-auditmanager-assessment-delegation-lastupdated","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html#cfn-auditmanager-assessment-delegation-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html#cfn-auditmanager-assessment-delegation-roletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-delegation.html#cfn-auditmanager-assessment-delegation-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AuditManager::Assessment.Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-role.html","Properties":{"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-role.html#cfn-auditmanager-assessment-role-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-role.html#cfn-auditmanager-assessment-role-roletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AuditManager::Assessment.Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-scope.html","Properties":{"AwsAccounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-scope.html#cfn-auditmanager-assessment-scope-awsaccounts","DuplicatesAllowed":true,"ItemType":"AWSAccount","Required":false,"Type":"List","UpdateType":"Mutable"},"AwsServices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-auditmanager-assessment-scope.html#cfn-auditmanager-assessment-scope-awsservices","DuplicatesAllowed":true,"ItemType":"AWSService","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.AcceleratorCountRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratorcountrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratorcountrequest.html#cfn-autoscaling-autoscalinggroup-acceleratorcountrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratorcountrequest.html#cfn-autoscaling-autoscalinggroup-acceleratorcountrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.AcceleratorTotalMemoryMiBRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratortotalmemorymibrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratortotalmemorymibrequest.html#cfn-autoscaling-autoscalinggroup-acceleratortotalmemorymibrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratortotalmemorymibrequest.html#cfn-autoscaling-autoscalinggroup-acceleratortotalmemorymibrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.BaselineEbsBandwidthMbpsRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-baselineebsbandwidthmbpsrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-baselineebsbandwidthmbpsrequest.html#cfn-autoscaling-autoscalinggroup-baselineebsbandwidthmbpsrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-baselineebsbandwidthmbpsrequest.html#cfn-autoscaling-autoscalinggroup-baselineebsbandwidthmbpsrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.InstanceRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html","Properties":{"AcceleratorCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-acceleratorcount","Required":false,"Type":"AcceleratorCountRequest","UpdateType":"Mutable"},"AcceleratorManufacturers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-acceleratormanufacturers","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AcceleratorNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-acceleratornames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AcceleratorTotalMemoryMiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-acceleratortotalmemorymib","Required":false,"Type":"AcceleratorTotalMemoryMiBRequest","UpdateType":"Mutable"},"AcceleratorTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-acceleratortypes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AllowedInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-allowedinstancetypes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"BareMetal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-baremetal","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BaselineEbsBandwidthMbps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-baselineebsbandwidthmbps","Required":false,"Type":"BaselineEbsBandwidthMbpsRequest","UpdateType":"Mutable"},"BurstablePerformance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-burstableperformance","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CpuManufacturers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-cpumanufacturers","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ExcludedInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-excludedinstancetypes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"InstanceGenerations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-instancegenerations","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"LocalStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-localstorage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LocalStorageTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-localstoragetypes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MemoryGiBPerVCpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-memorygibpervcpu","Required":false,"Type":"MemoryGiBPerVCpuRequest","UpdateType":"Mutable"},"MemoryMiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-memorymib","Required":false,"Type":"MemoryMiBRequest","UpdateType":"Mutable"},"NetworkBandwidthGbps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-networkbandwidthgbps","Required":false,"Type":"NetworkBandwidthGbpsRequest","UpdateType":"Mutable"},"NetworkInterfaceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-networkinterfacecount","Required":false,"Type":"NetworkInterfaceCountRequest","UpdateType":"Mutable"},"OnDemandMaxPricePercentageOverLowestPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-ondemandmaxpricepercentageoverlowestprice","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RequireHibernateSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-requirehibernatesupport","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SpotMaxPricePercentageOverLowestPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-spotmaxpricepercentageoverlowestprice","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TotalLocalStorageGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-totallocalstoragegb","Required":false,"Type":"TotalLocalStorageGBRequest","UpdateType":"Mutable"},"VCpuCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-vcpucount","Required":false,"Type":"VCpuCountRequest","UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.InstancesDistribution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html","Properties":{"OnDemandAllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-ondemandallocationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OnDemandBaseCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-ondemandbasecapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OnDemandPercentageAboveBaseCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-ondemandpercentageabovebasecapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SpotAllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-spotallocationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SpotInstancePools":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-spotinstancepools","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SpotMaxPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-spotmaxprice","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.LaunchTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplate.html","Properties":{"LaunchTemplateSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplate.html#cfn-as-group-launchtemplate","Required":true,"Type":"LaunchTemplateSpecification","UpdateType":"Mutable"},"Overrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplate.html#cfn-as-mixedinstancespolicy-overrides","DuplicatesAllowed":false,"ItemType":"LaunchTemplateOverrides","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.LaunchTemplateOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html","Properties":{"InstanceRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-as-mixedinstancespolicy-instancerequirements","Required":false,"Type":"InstanceRequirements","UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-autoscaling-autoscalinggroup-launchtemplateoverrides-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchTemplateSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-autoscaling-autoscalinggroup-launchtemplateoverrides-launchtemplatespecification","Required":false,"Type":"LaunchTemplateSpecification","UpdateType":"Mutable"},"WeightedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-autoscaling-autoscalinggroup-launchtemplateoverrides-weightedcapacity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.LaunchTemplateSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html","Properties":{"LaunchTemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html#cfn-autoscaling-autoscalinggroup-launchtemplatespecification-launchtemplateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchTemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html#cfn-autoscaling-autoscalinggroup-launchtemplatespecification-launchtemplatename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html#cfn-autoscaling-autoscalinggroup-launchtemplatespecification-version","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.LifecycleHookSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html","Properties":{"DefaultResult":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-defaultresult","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HeartbeatTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-heartbeattimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"LifecycleHookName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-lifecyclehookname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LifecycleTransition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-lifecycletransition","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NotificationMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-notificationmetadata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NotificationTargetARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-notificationtargetarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.MemoryGiBPerVCpuRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorygibpervcpurequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorygibpervcpurequest.html#cfn-autoscaling-autoscalinggroup-memorygibpervcpurequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorygibpervcpurequest.html#cfn-autoscaling-autoscalinggroup-memorygibpervcpurequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.MemoryMiBRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorymibrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorymibrequest.html#cfn-autoscaling-autoscalinggroup-memorymibrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorymibrequest.html#cfn-autoscaling-autoscalinggroup-memorymibrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.MetricsCollection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-metricscollection.html","Properties":{"Granularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-metricscollection.html#cfn-as-metricscollection-granularity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Metrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-metricscollection.html#cfn-as-metricscollection-metrics","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.MixedInstancesPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-group-mixedinstancespolicy.html","Properties":{"InstancesDistribution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-group-mixedinstancespolicy.html#cfn-as-mixedinstancespolicy-instancesdistribution","Required":false,"Type":"InstancesDistribution","UpdateType":"Mutable"},"LaunchTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-group-mixedinstancespolicy.html#cfn-as-mixedinstancespolicy-launchtemplate","Required":true,"Type":"LaunchTemplate","UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.NetworkBandwidthGbpsRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-networkbandwidthgbpsrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-networkbandwidthgbpsrequest.html#cfn-autoscaling-autoscalinggroup-networkbandwidthgbpsrequest-max","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-networkbandwidthgbpsrequest.html#cfn-autoscaling-autoscalinggroup-networkbandwidthgbpsrequest-min","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.NetworkInterfaceCountRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-networkinterfacecountrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-networkinterfacecountrequest.html#cfn-autoscaling-autoscalinggroup-networkinterfacecountrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-networkinterfacecountrequest.html#cfn-autoscaling-autoscalinggroup-networkinterfacecountrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.NotificationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-notificationconfigurations.html","Properties":{"NotificationTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-notificationconfigurations.html#cfn-as-group-notificationconfigurations-notificationtypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TopicARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-notificationconfigurations.html#cfn-autoscaling-autoscalinggroup-notificationconfigurations-topicarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.TagProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html#cfn-as-tags-Key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PropagateAtLaunch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html#cfn-as-tags-PropagateAtLaunch","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html#cfn-as-tags-Value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.TotalLocalStorageGBRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-totallocalstoragegbrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-totallocalstoragegbrequest.html#cfn-autoscaling-autoscalinggroup-totallocalstoragegbrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-totallocalstoragegbrequest.html#cfn-autoscaling-autoscalinggroup-totallocalstoragegbrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup.VCpuCountRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-vcpucountrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-vcpucountrequest.html#cfn-autoscaling-autoscalinggroup-vcpucountrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-vcpucountrequest.html#cfn-autoscaling-autoscalinggroup-vcpucountrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::LaunchConfiguration.BlockDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html","Properties":{"DeleteOnTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-deleteontermination","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-encrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SnapshotId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-snapshotid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Throughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-throughput","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"VolumeSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-volumesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::AutoScaling::LaunchConfiguration.BlockDeviceMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevicemapping.html","Properties":{"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevicemapping.html#cfn-autoscaling-launchconfiguration-blockdevicemapping-devicename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Ebs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevicemapping.html#cfn-autoscaling-launchconfiguration-blockdevicemapping-ebs","Required":false,"Type":"BlockDevice","UpdateType":"Immutable"},"NoDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevicemapping.html#cfn-autoscaling-launchconfiguration-blockdevicemapping-nodevice","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"VirtualName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevicemapping.html#cfn-autoscaling-launchconfiguration-blockdevicemapping-virtualname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::AutoScaling::LaunchConfiguration.MetadataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-metadataoptions.html","Properties":{"HttpEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-metadataoptions.html#cfn-autoscaling-launchconfiguration-metadataoptions-httpendpoint","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"HttpPutResponseHopLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-metadataoptions.html#cfn-autoscaling-launchconfiguration-metadataoptions-httpputresponsehoplimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"HttpTokens":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-metadataoptions.html#cfn-autoscaling-launchconfiguration-metadataoptions-httptokens","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::AutoScaling::ScalingPolicy.CustomizedMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-dimensions","DuplicatesAllowed":false,"ItemType":"MetricDimension","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Statistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-statistic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metric.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metric.html#cfn-autoscaling-scalingpolicy-metric-dimensions","DuplicatesAllowed":false,"ItemType":"MetricDimension","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metric.html#cfn-autoscaling-scalingpolicy-metric-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metric.html#cfn-autoscaling-scalingpolicy-metric-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.MetricDataQuery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html#cfn-autoscaling-scalingpolicy-metricdataquery-expression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html#cfn-autoscaling-scalingpolicy-metricdataquery-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html#cfn-autoscaling-scalingpolicy-metricdataquery-label","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricStat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html#cfn-autoscaling-scalingpolicy-metricdataquery-metricstat","Required":false,"Type":"MetricStat","UpdateType":"Mutable"},"ReturnData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html#cfn-autoscaling-scalingpolicy-metricdataquery-returndata","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.MetricDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdimension.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdimension.html#cfn-autoscaling-scalingpolicy-metricdimension-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdimension.html#cfn-autoscaling-scalingpolicy-metricdimension-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.MetricStat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricstat.html","Properties":{"Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricstat.html#cfn-autoscaling-scalingpolicy-metricstat-metric","Required":true,"Type":"Metric","UpdateType":"Mutable"},"Stat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricstat.html#cfn-autoscaling-scalingpolicy-metricstat-stat","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricstat.html#cfn-autoscaling-scalingpolicy-metricstat-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.PredefinedMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predefinedmetricspecification.html","Properties":{"PredefinedMetricType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predefinedmetricspecification.html#cfn-autoscaling-scalingpolicy-predefinedmetricspecification-predefinedmetrictype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predefinedmetricspecification.html#cfn-autoscaling-scalingpolicy-predefinedmetricspecification-resourcelabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html","Properties":{"MaxCapacityBreachBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration-maxcapacitybreachbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxCapacityBuffer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration-maxcapacitybuffer","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MetricSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration-metricspecifications","DuplicatesAllowed":false,"ItemType":"PredictiveScalingMetricSpecification","Required":true,"Type":"List","UpdateType":"Mutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration-mode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SchedulingBufferTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration-schedulingbuffertime","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingCustomizedCapacityMetric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedcapacitymetric.html","Properties":{"MetricDataQueries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedcapacitymetric.html#cfn-autoscaling-scalingpolicy-predictivescalingcustomizedcapacitymetric-metricdataqueries","DuplicatesAllowed":false,"ItemType":"MetricDataQuery","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingCustomizedLoadMetric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedloadmetric.html","Properties":{"MetricDataQueries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedloadmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingcustomizedloadmetric-metricdataqueries","DuplicatesAllowed":false,"ItemType":"MetricDataQuery","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingCustomizedScalingMetric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedscalingmetric.html","Properties":{"MetricDataQueries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedscalingmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingcustomizedscalingmetric-metricdataqueries","DuplicatesAllowed":false,"ItemType":"MetricDataQuery","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html","Properties":{"CustomizedCapacityMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-customizedcapacitymetricspecification","Required":false,"Type":"PredictiveScalingCustomizedCapacityMetric","UpdateType":"Mutable"},"CustomizedLoadMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-customizedloadmetricspecification","Required":false,"Type":"PredictiveScalingCustomizedLoadMetric","UpdateType":"Mutable"},"CustomizedScalingMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-customizedscalingmetricspecification","Required":false,"Type":"PredictiveScalingCustomizedScalingMetric","UpdateType":"Mutable"},"PredefinedLoadMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-predefinedloadmetricspecification","Required":false,"Type":"PredictiveScalingPredefinedLoadMetric","UpdateType":"Mutable"},"PredefinedMetricPairSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-predefinedmetricpairspecification","Required":false,"Type":"PredictiveScalingPredefinedMetricPair","UpdateType":"Mutable"},"PredefinedScalingMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-predefinedscalingmetricspecification","Required":false,"Type":"PredictiveScalingPredefinedScalingMetric","UpdateType":"Mutable"},"TargetValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-targetvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingPredefinedLoadMetric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedloadmetric.html","Properties":{"PredefinedMetricType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedloadmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedloadmetric-predefinedmetrictype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedloadmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedloadmetric-resourcelabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingPredefinedMetricPair":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedmetricpair.html","Properties":{"PredefinedMetricType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedmetricpair.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedmetricpair-predefinedmetrictype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedmetricpair.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedmetricpair-resourcelabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.PredictiveScalingPredefinedScalingMetric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedscalingmetric.html","Properties":{"PredefinedMetricType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedscalingmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedscalingmetric-predefinedmetrictype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedscalingmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedscalingmetric-resourcelabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.StepAdjustment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-stepadjustment.html","Properties":{"MetricIntervalLowerBound":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-stepadjustment.html#cfn-autoscaling-scalingpolicy-stepadjustment-metricintervallowerbound","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MetricIntervalUpperBound":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-stepadjustment.html#cfn-autoscaling-scalingpolicy-stepadjustment-metricintervalupperbound","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ScalingAdjustment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-stepadjustment.html#cfn-autoscaling-scalingpolicy-stepadjustment-scalingadjustment","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy.TargetTrackingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-targettrackingconfiguration.html","Properties":{"CustomizedMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-targettrackingconfiguration.html#cfn-autoscaling-scalingpolicy-targettrackingconfiguration-customizedmetricspecification","Required":false,"Type":"CustomizedMetricSpecification","UpdateType":"Mutable"},"DisableScaleIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-targettrackingconfiguration.html#cfn-autoscaling-scalingpolicy-targettrackingconfiguration-disablescalein","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PredefinedMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-targettrackingconfiguration.html#cfn-autoscaling-scalingpolicy-targettrackingconfiguration-predefinedmetricspecification","Required":false,"Type":"PredefinedMetricSpecification","UpdateType":"Mutable"},"TargetValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-targettrackingconfiguration.html#cfn-autoscaling-scalingpolicy-targettrackingconfiguration-targetvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::AutoScaling::WarmPool.InstanceReusePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-warmpool-instancereusepolicy.html","Properties":{"ReuseOnScaleIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-warmpool-instancereusepolicy.html#cfn-autoscaling-warmpool-instancereusepolicy-reuseonscalein","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScalingPlans::ScalingPlan.ApplicationSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-applicationsource.html","Properties":{"CloudFormationStackARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-applicationsource.html#cfn-autoscalingplans-scalingplan-applicationsource-cloudformationstackarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-applicationsource.html#cfn-autoscalingplans-scalingplan-applicationsource-tagfilters","ItemType":"TagFilter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AutoScalingPlans::ScalingPlan.CustomizedLoadMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedloadmetricspecification.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedloadmetricspecification.html#cfn-autoscalingplans-scalingplan-customizedloadmetricspecification-dimensions","ItemType":"MetricDimension","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedloadmetricspecification.html#cfn-autoscalingplans-scalingplan-customizedloadmetricspecification-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedloadmetricspecification.html#cfn-autoscalingplans-scalingplan-customizedloadmetricspecification-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Statistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedloadmetricspecification.html#cfn-autoscalingplans-scalingplan-customizedloadmetricspecification-statistic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedloadmetricspecification.html#cfn-autoscalingplans-scalingplan-customizedloadmetricspecification-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScalingPlans::ScalingPlan.CustomizedScalingMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedscalingmetricspecification.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedscalingmetricspecification.html#cfn-autoscalingplans-scalingplan-customizedscalingmetricspecification-dimensions","ItemType":"MetricDimension","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedscalingmetricspecification.html#cfn-autoscalingplans-scalingplan-customizedscalingmetricspecification-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedscalingmetricspecification.html#cfn-autoscalingplans-scalingplan-customizedscalingmetricspecification-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Statistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedscalingmetricspecification.html#cfn-autoscalingplans-scalingplan-customizedscalingmetricspecification-statistic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-customizedscalingmetricspecification.html#cfn-autoscalingplans-scalingplan-customizedscalingmetricspecification-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScalingPlans::ScalingPlan.MetricDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-metricdimension.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-metricdimension.html#cfn-autoscalingplans-scalingplan-metricdimension-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-metricdimension.html#cfn-autoscalingplans-scalingplan-metricdimension-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AutoScalingPlans::ScalingPlan.PredefinedLoadMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-predefinedloadmetricspecification.html","Properties":{"PredefinedLoadMetricType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-predefinedloadmetricspecification.html#cfn-autoscalingplans-scalingplan-predefinedloadmetricspecification-predefinedloadmetrictype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-predefinedloadmetricspecification.html#cfn-autoscalingplans-scalingplan-predefinedloadmetricspecification-resourcelabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScalingPlans::ScalingPlan.PredefinedScalingMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-predefinedscalingmetricspecification.html","Properties":{"PredefinedScalingMetricType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-predefinedscalingmetricspecification.html#cfn-autoscalingplans-scalingplan-predefinedscalingmetricspecification-predefinedscalingmetrictype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-predefinedscalingmetricspecification.html#cfn-autoscalingplans-scalingplan-predefinedscalingmetricspecification-resourcelabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScalingPlans::ScalingPlan.ScalingInstruction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html","Properties":{"CustomizedLoadMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-customizedloadmetricspecification","Required":false,"Type":"CustomizedLoadMetricSpecification","UpdateType":"Mutable"},"DisableDynamicScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-disabledynamicscaling","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-maxcapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MinCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-mincapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"PredefinedLoadMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-predefinedloadmetricspecification","Required":false,"Type":"PredefinedLoadMetricSpecification","UpdateType":"Mutable"},"PredictiveScalingMaxCapacityBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-predictivescalingmaxcapacitybehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PredictiveScalingMaxCapacityBuffer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-predictivescalingmaxcapacitybuffer","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PredictiveScalingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-predictivescalingmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-resourceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScalableDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-scalabledimension","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScalingPolicyUpdateBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-scalingpolicyupdatebehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduledActionBufferTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-scheduledactionbuffertime","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ServiceNamespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-servicenamespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetTrackingConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-scalinginstruction.html#cfn-autoscalingplans-scalingplan-scalinginstruction-targettrackingconfigurations","ItemType":"TargetTrackingConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AutoScalingPlans::ScalingPlan.TagFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-tagfilter.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-tagfilter.html#cfn-autoscalingplans-scalingplan-tagfilter-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-tagfilter.html#cfn-autoscalingplans-scalingplan-tagfilter-values","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AutoScalingPlans::ScalingPlan.TargetTrackingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-targettrackingconfiguration.html","Properties":{"CustomizedScalingMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-targettrackingconfiguration.html#cfn-autoscalingplans-scalingplan-targettrackingconfiguration-customizedscalingmetricspecification","Required":false,"Type":"CustomizedScalingMetricSpecification","UpdateType":"Mutable"},"DisableScaleIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-targettrackingconfiguration.html#cfn-autoscalingplans-scalingplan-targettrackingconfiguration-disablescalein","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EstimatedInstanceWarmup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-targettrackingconfiguration.html#cfn-autoscalingplans-scalingplan-targettrackingconfiguration-estimatedinstancewarmup","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PredefinedScalingMetricSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-targettrackingconfiguration.html#cfn-autoscalingplans-scalingplan-targettrackingconfiguration-predefinedscalingmetricspecification","Required":false,"Type":"PredefinedScalingMetricSpecification","UpdateType":"Mutable"},"ScaleInCooldown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-targettrackingconfiguration.html#cfn-autoscalingplans-scalingplan-targettrackingconfiguration-scaleincooldown","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ScaleOutCooldown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-targettrackingconfiguration.html#cfn-autoscalingplans-scalingplan-targettrackingconfiguration-scaleoutcooldown","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TargetValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscalingplans-scalingplan-targettrackingconfiguration.html#cfn-autoscalingplans-scalingplan-targettrackingconfiguration-targetvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::Backup::BackupPlan.AdvancedBackupSettingResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-advancedbackupsettingresourcetype.html","Properties":{"BackupOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-advancedbackupsettingresourcetype.html#cfn-backup-backupplan-advancedbackupsettingresourcetype-backupoptions","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-advancedbackupsettingresourcetype.html#cfn-backup-backupplan-advancedbackupsettingresourcetype-resourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Backup::BackupPlan.BackupPlanResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupplanresourcetype.html","Properties":{"AdvancedBackupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupplanresourcetype.html#cfn-backup-backupplan-backupplanresourcetype-advancedbackupsettings","DuplicatesAllowed":true,"ItemType":"AdvancedBackupSettingResourceType","Required":false,"Type":"List","UpdateType":"Mutable"},"BackupPlanName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupplanresourcetype.html#cfn-backup-backupplan-backupplanresourcetype-backupplanname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BackupPlanRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupplanresourcetype.html#cfn-backup-backupplan-backupplanresourcetype-backupplanrule","DuplicatesAllowed":true,"ItemType":"BackupRuleResourceType","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Backup::BackupPlan.BackupRuleResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupruleresourcetype.html","Properties":{"CompletionWindowMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupruleresourcetype.html#cfn-backup-backupplan-backupruleresourcetype-completionwindowminutes","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"CopyActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupruleresourcetype.html#cfn-backup-backupplan-backupruleresourcetype-copyactions","DuplicatesAllowed":true,"ItemType":"CopyActionResourceType","Required":false,"Type":"List","UpdateType":"Mutable"},"EnableContinuousBackup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupruleresourcetype.html#cfn-backup-backupplan-backupruleresourcetype-enablecontinuousbackup","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Lifecycle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupruleresourcetype.html#cfn-backup-backupplan-backupruleresourcetype-lifecycle","Required":false,"Type":"LifecycleResourceType","UpdateType":"Mutable"},"RecoveryPointTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupruleresourcetype.html#cfn-backup-backupplan-backupruleresourcetype-recoverypointtags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"RuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupruleresourcetype.html#cfn-backup-backupplan-backupruleresourcetype-rulename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupruleresourcetype.html#cfn-backup-backupplan-backupruleresourcetype-scheduleexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartWindowMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupruleresourcetype.html#cfn-backup-backupplan-backupruleresourcetype-startwindowminutes","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TargetBackupVault":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-backupruleresourcetype.html#cfn-backup-backupplan-backupruleresourcetype-targetbackupvault","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Backup::BackupPlan.CopyActionResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-copyactionresourcetype.html","Properties":{"DestinationBackupVaultArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-copyactionresourcetype.html#cfn-backup-backupplan-copyactionresourcetype-destinationbackupvaultarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Lifecycle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-copyactionresourcetype.html#cfn-backup-backupplan-copyactionresourcetype-lifecycle","Required":false,"Type":"LifecycleResourceType","UpdateType":"Mutable"}}},"AWS::Backup::BackupPlan.LifecycleResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-lifecycleresourcetype.html","Properties":{"DeleteAfterDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-lifecycleresourcetype.html#cfn-backup-backupplan-lifecycleresourcetype-deleteafterdays","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MoveToColdStorageAfterDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupplan-lifecycleresourcetype.html#cfn-backup-backupplan-lifecycleresourcetype-movetocoldstorageafterdays","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::Backup::BackupSelection.BackupSelectionResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html","Properties":{"Conditions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html#cfn-backup-backupselection-backupselectionresourcetype-conditions","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"IamRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html#cfn-backup-backupselection-backupselectionresourcetype-iamrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ListOfTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html#cfn-backup-backupselection-backupselectionresourcetype-listoftags","DuplicatesAllowed":true,"ItemType":"ConditionResourceType","Required":false,"Type":"List","UpdateType":"Immutable"},"NotResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html#cfn-backup-backupselection-backupselectionresourcetype-notresources","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html#cfn-backup-backupselection-backupselectionresourcetype-resources","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SelectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html#cfn-backup-backupselection-backupselectionresourcetype-selectionname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Backup::BackupSelection.ConditionParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditionparameter.html","Properties":{"ConditionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditionparameter.html#cfn-backup-backupselection-conditionparameter-conditionkey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConditionValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditionparameter.html#cfn-backup-backupselection-conditionparameter-conditionvalue","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Backup::BackupSelection.ConditionResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditionresourcetype.html","Properties":{"ConditionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditionresourcetype.html#cfn-backup-backupselection-conditionresourcetype-conditionkey","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConditionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditionresourcetype.html#cfn-backup-backupselection-conditionresourcetype-conditiontype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConditionValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditionresourcetype.html#cfn-backup-backupselection-conditionresourcetype-conditionvalue","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Backup::BackupSelection.Conditions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditions.html","Properties":{"StringEquals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditions.html#cfn-backup-backupselection-conditions-stringequals","DuplicatesAllowed":true,"ItemType":"ConditionParameter","Required":false,"Type":"List","UpdateType":"Immutable"},"StringLike":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditions.html#cfn-backup-backupselection-conditions-stringlike","DuplicatesAllowed":true,"ItemType":"ConditionParameter","Required":false,"Type":"List","UpdateType":"Immutable"},"StringNotEquals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditions.html#cfn-backup-backupselection-conditions-stringnotequals","DuplicatesAllowed":true,"ItemType":"ConditionParameter","Required":false,"Type":"List","UpdateType":"Immutable"},"StringNotLike":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-conditions.html#cfn-backup-backupselection-conditions-stringnotlike","DuplicatesAllowed":true,"ItemType":"ConditionParameter","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Backup::BackupVault.LockConfigurationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-lockconfigurationtype.html","Properties":{"ChangeableForDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-lockconfigurationtype.html#cfn-backup-backupvault-lockconfigurationtype-changeablefordays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxRetentionDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-lockconfigurationtype.html#cfn-backup-backupvault-lockconfigurationtype-maxretentiondays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinRetentionDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-lockconfigurationtype.html#cfn-backup-backupvault-lockconfigurationtype-minretentiondays","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Backup::BackupVault.NotificationObjectType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-notificationobjecttype.html","Properties":{"BackupVaultEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-notificationobjecttype.html#cfn-backup-backupvault-notificationobjecttype-backupvaultevents","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SNSTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-notificationobjecttype.html#cfn-backup-backupvault-notificationobjecttype-snstopicarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Backup::Framework.ControlInputParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-controlinputparameter.html","Properties":{"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-controlinputparameter.html#cfn-backup-framework-controlinputparameter-parametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-controlinputparameter.html#cfn-backup-framework-controlinputparameter-parametervalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Backup::Framework.ControlScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-controlscope.html","Properties":{"ComplianceResourceIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-controlscope.html#cfn-backup-framework-controlscope-complianceresourceids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ComplianceResourceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-controlscope.html#cfn-backup-framework-controlscope-complianceresourcetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-controlscope.html#cfn-backup-framework-controlscope-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Backup::Framework.FrameworkControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-frameworkcontrol.html","Properties":{"ControlInputParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-frameworkcontrol.html#cfn-backup-framework-frameworkcontrol-controlinputparameters","DuplicatesAllowed":false,"ItemType":"ControlInputParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"ControlName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-frameworkcontrol.html#cfn-backup-framework-frameworkcontrol-controlname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ControlScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-frameworkcontrol.html#cfn-backup-framework-frameworkcontrol-controlscope","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Backup::ReportPlan.ReportDeliveryChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-reportplan-reportdeliverychannel.html","Properties":{"Formats":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-reportplan-reportdeliverychannel.html#cfn-backup-reportplan-reportdeliverychannel-formats","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"S3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-reportplan-reportdeliverychannel.html#cfn-backup-reportplan-reportdeliverychannel-s3bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-reportplan-reportdeliverychannel.html#cfn-backup-reportplan-reportdeliverychannel-s3keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Backup::ReportPlan.ReportSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-reportplan-reportsetting.html","Properties":{"Accounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-reportplan-reportsetting.html#cfn-backup-reportplan-reportsetting-accounts","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"FrameworkArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-reportplan-reportsetting.html#cfn-backup-reportplan-reportsetting-frameworkarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OrganizationUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-reportplan-reportsetting.html#cfn-backup-reportplan-reportsetting-organizationunits","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Regions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-reportplan-reportsetting.html#cfn-backup-reportplan-reportsetting-regions","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ReportTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-reportplan-reportsetting.html#cfn-backup-reportplan-reportsetting-reporttemplate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Batch::ComputeEnvironment.ComputeResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html","Properties":{"AllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-allocationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"BidPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-bidpercentage","PrimitiveType":"Integer","Required":false,"UpdateType":"Conditional"},"DesiredvCpus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-desiredvcpus","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Ec2Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-ec2configuration","DuplicatesAllowed":true,"ItemType":"Ec2ConfigurationObject","Required":false,"Type":"List","UpdateType":"Conditional"},"Ec2KeyPair":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-ec2keypair","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"ImageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-imageid","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"InstanceRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-instancerole","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"InstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-instancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Conditional"},"LaunchTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-launchtemplate","Required":false,"Type":"LaunchTemplateSpecification","UpdateType":"Conditional"},"MaxvCpus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-maxvcpus","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MinvCpus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-minvcpus","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PlacementGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-placementgroup","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Conditional"},"SpotIamFleetRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-spotiamfleetrole","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Conditional"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Conditional"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-type","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"},"UpdateToLatestImageVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-updatetolatestimageversion","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::ComputeEnvironment.Ec2ConfigurationObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-ec2configurationobject.html","Properties":{"ImageIdOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-ec2configurationobject.html#cfn-batch-computeenvironment-ec2configurationobject-imageidoverride","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"ImageKubernetesVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-ec2configurationobject.html#cfn-batch-computeenvironment-ec2configurationobject-imagekubernetesversion","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"ImageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-ec2configurationobject.html#cfn-batch-computeenvironment-ec2configurationobject-imagetype","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"}}},"AWS::Batch::ComputeEnvironment.EksConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-eksconfiguration.html","Properties":{"EksClusterArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-eksconfiguration.html#cfn-batch-computeenvironment-eksconfiguration-eksclusterarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KubernetesNamespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-eksconfiguration.html#cfn-batch-computeenvironment-eksconfiguration-kubernetesnamespace","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Batch::ComputeEnvironment.LaunchTemplateSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-launchtemplatespecification.html","Properties":{"LaunchTemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-launchtemplatespecification.html#cfn-batch-computeenvironment-launchtemplatespecification-launchtemplateid","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"LaunchTemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-launchtemplatespecification.html#cfn-batch-computeenvironment-launchtemplatespecification-launchtemplatename","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-launchtemplatespecification.html#cfn-batch-computeenvironment-launchtemplatespecification-version","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"}}},"AWS::Batch::ComputeEnvironment.UpdatePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-updatepolicy.html","Properties":{"JobExecutionTimeoutMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-updatepolicy.html#cfn-batch-computeenvironment-updatepolicy-jobexecutiontimeoutminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TerminateJobsOnUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-updatepolicy.html#cfn-batch-computeenvironment-updatepolicy-terminatejobsonupdate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.AuthorizationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-authorizationconfig.html","Properties":{"AccessPointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-authorizationconfig.html#cfn-batch-jobdefinition-authorizationconfig-accesspointid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Iam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-authorizationconfig.html#cfn-batch-jobdefinition-authorizationconfig-iam","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.ContainerProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html","Properties":{"Command":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-command","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-environment","ItemType":"Environment","Required":false,"Type":"List","UpdateType":"Mutable"},"EphemeralStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-ephemeralstorage","Required":false,"Type":"EphemeralStorage","UpdateType":"Mutable"},"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-executionrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FargatePlatformConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-fargateplatformconfiguration","Required":false,"Type":"FargatePlatformConfiguration","UpdateType":"Mutable"},"Image":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-image","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JobRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-jobrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LinuxParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-linuxparameters","Required":false,"Type":"LinuxParameters","UpdateType":"Mutable"},"LogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-logconfiguration","Required":false,"Type":"LogConfiguration","UpdateType":"Mutable"},"Memory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-memory","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MountPoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-mountpoints","ItemType":"MountPoints","Required":false,"Type":"List","UpdateType":"Mutable"},"NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-networkconfiguration","Required":false,"Type":"NetworkConfiguration","UpdateType":"Mutable"},"Privileged":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-privileged","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ReadonlyRootFilesystem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-readonlyrootfilesystem","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ResourceRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-resourcerequirements","ItemType":"ResourceRequirement","Required":false,"Type":"List","UpdateType":"Mutable"},"Secrets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-secrets","ItemType":"Secret","Required":false,"Type":"List","UpdateType":"Mutable"},"Ulimits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-ulimits","ItemType":"Ulimit","Required":false,"Type":"List","UpdateType":"Mutable"},"User":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-user","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Vcpus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-vcpus","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Volumes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties.html#cfn-batch-jobdefinition-containerproperties-volumes","ItemType":"Volumes","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.Device":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-device.html","Properties":{"ContainerPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-device.html#cfn-batch-jobdefinition-device-containerpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-device.html#cfn-batch-jobdefinition-device-hostpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-device.html#cfn-batch-jobdefinition-device-permissions","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.EfsVolumeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-efsvolumeconfiguration.html","Properties":{"AuthorizationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-efsvolumeconfiguration.html#cfn-batch-jobdefinition-efsvolumeconfiguration-authorizationconfig","Required":false,"Type":"AuthorizationConfig","UpdateType":"Mutable"},"FileSystemId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-efsvolumeconfiguration.html#cfn-batch-jobdefinition-efsvolumeconfiguration-filesystemid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RootDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-efsvolumeconfiguration.html#cfn-batch-jobdefinition-efsvolumeconfiguration-rootdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TransitEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-efsvolumeconfiguration.html#cfn-batch-jobdefinition-efsvolumeconfiguration-transitencryption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TransitEncryptionPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-efsvolumeconfiguration.html#cfn-batch-jobdefinition-efsvolumeconfiguration-transitencryptionport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.EksContainer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainer.html","Properties":{"Args":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainer.html#cfn-batch-jobdefinition-ekscontainer-args","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Command":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainer.html#cfn-batch-jobdefinition-ekscontainer-command","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Env":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainer.html#cfn-batch-jobdefinition-ekscontainer-env","ItemType":"EksContainerEnvironmentVariable","Required":false,"Type":"List","UpdateType":"Mutable"},"Image":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainer.html#cfn-batch-jobdefinition-ekscontainer-image","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ImagePullPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainer.html#cfn-batch-jobdefinition-ekscontainer-imagepullpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainer.html#cfn-batch-jobdefinition-ekscontainer-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainer.html#cfn-batch-jobdefinition-ekscontainer-resources","Required":false,"Type":"Resources","UpdateType":"Mutable"},"SecurityContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainer.html#cfn-batch-jobdefinition-ekscontainer-securitycontext","Required":false,"Type":"SecurityContext","UpdateType":"Mutable"},"VolumeMounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainer.html#cfn-batch-jobdefinition-ekscontainer-volumemounts","ItemType":"EksContainerVolumeMount","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.EksContainerEnvironmentVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainerenvironmentvariable.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainerenvironmentvariable.html#cfn-batch-jobdefinition-ekscontainerenvironmentvariable-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainerenvironmentvariable.html#cfn-batch-jobdefinition-ekscontainerenvironmentvariable-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.EksContainerVolumeMount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainervolumemount.html","Properties":{"MountPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainervolumemount.html#cfn-batch-jobdefinition-ekscontainervolumemount-mountpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainervolumemount.html#cfn-batch-jobdefinition-ekscontainervolumemount-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReadOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainervolumemount.html#cfn-batch-jobdefinition-ekscontainervolumemount-readonly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.EksProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-eksproperties.html","Properties":{"PodProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-eksproperties.html#cfn-batch-jobdefinition-eksproperties-podproperties","Required":false,"Type":"PodProperties","UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.EksSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekssecret.html","Properties":{"Optional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekssecret.html#cfn-batch-jobdefinition-ekssecret-optional","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SecretName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekssecret.html#cfn-batch-jobdefinition-ekssecret-secretname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.EksVolume":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-eksvolume.html","Properties":{"EmptyDir":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-eksvolume.html#cfn-batch-jobdefinition-eksvolume-emptydir","Required":false,"Type":"EmptyDir","UpdateType":"Mutable"},"HostPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-eksvolume.html#cfn-batch-jobdefinition-eksvolume-hostpath","Required":false,"Type":"HostPath","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-eksvolume.html#cfn-batch-jobdefinition-eksvolume-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Secret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-eksvolume.html#cfn-batch-jobdefinition-eksvolume-secret","Required":false,"Type":"EksSecret","UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.EmptyDir":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-eksemptydir.html","Properties":{"Medium":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-eksemptydir.html#cfn-batch-jobdefinition-eksemptydir-medium","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SizeLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-eksemptydir.html#cfn-batch-jobdefinition-eksemptydir-sizelimit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-environment.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-environment.html#cfn-batch-jobdefinition-environment-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-environment.html#cfn-batch-jobdefinition-environment-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.EphemeralStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-ephemeralstorage.html","Properties":{"SizeInGiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-ephemeralstorage.html#cfn-batch-jobdefinition-containerproperties-ephemeralstorage-sizeingib","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.EvaluateOnExit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-evaluateonexit.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-evaluateonexit.html#cfn-batch-jobdefinition-evaluateonexit-action","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OnExitCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-evaluateonexit.html#cfn-batch-jobdefinition-evaluateonexit-onexitcode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OnReason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-evaluateonexit.html#cfn-batch-jobdefinition-evaluateonexit-onreason","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OnStatusReason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-evaluateonexit.html#cfn-batch-jobdefinition-evaluateonexit-onstatusreason","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.FargatePlatformConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-fargateplatformconfiguration.html","Properties":{"PlatformVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-fargateplatformconfiguration.html#cfn-batch-jobdefinition-containerproperties-fargateplatformconfiguration-platformversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.HostPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekshostpath.html","Properties":{"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekshostpath.html#cfn-batch-jobdefinition-ekshostpath-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.LinuxParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-linuxparameters.html","Properties":{"Devices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-linuxparameters.html#cfn-batch-jobdefinition-containerproperties-linuxparameters-devices","ItemType":"Device","Required":false,"Type":"List","UpdateType":"Mutable"},"InitProcessEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-linuxparameters.html#cfn-batch-jobdefinition-containerproperties-linuxparameters-initprocessenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxSwap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-linuxparameters.html#cfn-batch-jobdefinition-containerproperties-linuxparameters-maxswap","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SharedMemorySize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-linuxparameters.html#cfn-batch-jobdefinition-containerproperties-linuxparameters-sharedmemorysize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Swappiness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-linuxparameters.html#cfn-batch-jobdefinition-containerproperties-linuxparameters-swappiness","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Tmpfs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-linuxparameters.html#cfn-batch-jobdefinition-containerproperties-linuxparameters-tmpfs","ItemType":"Tmpfs","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.LogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-logconfiguration.html","Properties":{"LogDriver":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-logconfiguration.html#cfn-batch-jobdefinition-containerproperties-logconfiguration-logdriver","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-logconfiguration.html#cfn-batch-jobdefinition-containerproperties-logconfiguration-options","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SecretOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-logconfiguration.html#cfn-batch-jobdefinition-containerproperties-logconfiguration-secretoptions","ItemType":"Secret","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.Metadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-podproperties-metadata.html","Properties":{"Labels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-podproperties-metadata.html#cfn-batch-jobdefinition-podproperties-metadata-labels","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.MountPoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-mountpoints.html","Properties":{"ContainerPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-mountpoints.html#cfn-batch-jobdefinition-mountpoints-containerpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReadOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-mountpoints.html#cfn-batch-jobdefinition-mountpoints-readonly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SourceVolume":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-mountpoints.html#cfn-batch-jobdefinition-mountpoints-sourcevolume","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-networkconfiguration.html","Properties":{"AssignPublicIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-containerproperties-networkconfiguration.html#cfn-batch-jobdefinition-containerproperties-networkconfiguration-assignpublicip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.NodeProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-nodeproperties.html","Properties":{"MainNode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-nodeproperties.html#cfn-batch-jobdefinition-nodeproperties-mainnode","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"NodeRangeProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-nodeproperties.html#cfn-batch-jobdefinition-nodeproperties-noderangeproperties","ItemType":"NodeRangeProperty","Required":true,"Type":"List","UpdateType":"Mutable"},"NumNodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-nodeproperties.html#cfn-batch-jobdefinition-nodeproperties-numnodes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.NodeRangeProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-noderangeproperty.html","Properties":{"Container":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-noderangeproperty.html#cfn-batch-jobdefinition-noderangeproperty-container","Required":false,"Type":"ContainerProperties","UpdateType":"Mutable"},"TargetNodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-noderangeproperty.html#cfn-batch-jobdefinition-noderangeproperty-targetnodes","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.PodProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-podproperties.html","Properties":{"Containers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-podproperties.html#cfn-batch-jobdefinition-podproperties-containers","ItemType":"EksContainer","Required":false,"Type":"List","UpdateType":"Mutable"},"DnsPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-podproperties.html#cfn-batch-jobdefinition-podproperties-dnspolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostNetwork":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-podproperties.html#cfn-batch-jobdefinition-podproperties-hostnetwork","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Metadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-podproperties.html#cfn-batch-jobdefinition-podproperties-metadata","Required":false,"Type":"Metadata","UpdateType":"Mutable"},"ServiceAccountName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-podproperties.html#cfn-batch-jobdefinition-podproperties-serviceaccountname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Volumes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-podproperties.html#cfn-batch-jobdefinition-podproperties-volumes","ItemType":"EksVolume","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.ResourceRequirement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-resourcerequirement.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-resourcerequirement.html#cfn-batch-jobdefinition-resourcerequirement-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-resourcerequirement.html#cfn-batch-jobdefinition-resourcerequirement-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainerresourcerequirements.html","Properties":{"Limits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainerresourcerequirements.html#cfn-batch-jobdefinition-ekscontainerresourcerequirements-limits","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Requests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainerresourcerequirements.html#cfn-batch-jobdefinition-ekscontainerresourcerequirements-requests","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.RetryStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-retrystrategy.html","Properties":{"Attempts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-retrystrategy.html#cfn-batch-jobdefinition-retrystrategy-attempts","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"EvaluateOnExit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-retrystrategy.html#cfn-batch-jobdefinition-retrystrategy-evaluateonexit","ItemType":"EvaluateOnExit","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.Secret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-secret.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-secret.html#cfn-batch-jobdefinition-secret-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-secret.html#cfn-batch-jobdefinition-secret-valuefrom","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.SecurityContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainersecuritycontext.html","Properties":{"Privileged":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainersecuritycontext.html#cfn-batch-jobdefinition-ekscontainersecuritycontext-privileged","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ReadOnlyRootFilesystem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainersecuritycontext.html#cfn-batch-jobdefinition-ekscontainersecuritycontext-readonlyrootfilesystem","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RunAsGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainersecuritycontext.html#cfn-batch-jobdefinition-ekscontainersecuritycontext-runasgroup","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RunAsNonRoot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainersecuritycontext.html#cfn-batch-jobdefinition-ekscontainersecuritycontext-runasnonroot","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RunAsUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ekscontainersecuritycontext.html#cfn-batch-jobdefinition-ekscontainersecuritycontext-runasuser","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-timeout.html","Properties":{"AttemptDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-timeout.html#cfn-batch-jobdefinition-timeout-attemptdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.Tmpfs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-tmpfs.html","Properties":{"ContainerPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-tmpfs.html#cfn-batch-jobdefinition-tmpfs-containerpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-tmpfs.html#cfn-batch-jobdefinition-tmpfs-mountoptions","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-tmpfs.html#cfn-batch-jobdefinition-tmpfs-size","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.Ulimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ulimit.html","Properties":{"HardLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ulimit.html#cfn-batch-jobdefinition-ulimit-hardlimit","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ulimit.html#cfn-batch-jobdefinition-ulimit-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SoftLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-ulimit.html#cfn-batch-jobdefinition-ulimit-softlimit","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.Volumes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-volumes.html","Properties":{"EfsVolumeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-volumes.html#cfn-batch-jobdefinition-volumes-efsvolumeconfiguration","Required":false,"Type":"EfsVolumeConfiguration","UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-volumes.html#cfn-batch-jobdefinition-volumes-host","Required":false,"Type":"VolumesHost","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-volumes.html#cfn-batch-jobdefinition-volumes-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition.VolumesHost":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-volumeshost.html","Properties":{"SourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobdefinition-volumeshost.html#cfn-batch-jobdefinition-volumeshost-sourcepath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::JobQueue.ComputeEnvironmentOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobqueue-computeenvironmentorder.html","Properties":{"ComputeEnvironment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobqueue-computeenvironmentorder.html#cfn-batch-jobqueue-computeenvironmentorder-computeenvironment","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Order":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-jobqueue-computeenvironmentorder.html#cfn-batch-jobqueue-computeenvironmentorder-order","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Batch::SchedulingPolicy.FairsharePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-fairsharepolicy.html","Properties":{"ComputeReservation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-fairsharepolicy.html#cfn-batch-schedulingpolicy-fairsharepolicy-computereservation","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ShareDecaySeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-fairsharepolicy.html#cfn-batch-schedulingpolicy-fairsharepolicy-sharedecayseconds","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ShareDistribution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-fairsharepolicy.html#cfn-batch-schedulingpolicy-fairsharepolicy-sharedistribution","DuplicatesAllowed":true,"ItemType":"ShareAttributes","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Batch::SchedulingPolicy.ShareAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-shareattributes.html","Properties":{"ShareIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-shareattributes.html#cfn-batch-schedulingpolicy-shareattributes-shareidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WeightFactor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-shareattributes.html#cfn-batch-schedulingpolicy-shareattributes-weightfactor","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::BillingConductor::BillingGroup.AccountGrouping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-billinggroup-accountgrouping.html","Properties":{"LinkedAccountIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-billinggroup-accountgrouping.html#cfn-billingconductor-billinggroup-accountgrouping-linkedaccountids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::BillingConductor::BillingGroup.ComputationPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-billinggroup-computationpreference.html","Properties":{"PricingPlanArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-billinggroup-computationpreference.html#cfn-billingconductor-billinggroup-computationpreference-pricingplanarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::BillingConductor::CustomLineItem.BillingPeriodRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-billingperiodrange.html","Properties":{"ExclusiveEndBillingPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-billingperiodrange.html#cfn-billingconductor-customlineitem-billingperiodrange-exclusiveendbillingperiod","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InclusiveStartBillingPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-billingperiodrange.html#cfn-billingconductor-customlineitem-billingperiodrange-inclusivestartbillingperiod","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::BillingConductor::CustomLineItem.CustomLineItemChargeDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemchargedetails.html","Properties":{"Flat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemchargedetails.html#cfn-billingconductor-customlineitem-customlineitemchargedetails-flat","Required":false,"Type":"CustomLineItemFlatChargeDetails","UpdateType":"Mutable"},"Percentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemchargedetails.html#cfn-billingconductor-customlineitem-customlineitemchargedetails-percentage","Required":false,"Type":"CustomLineItemPercentageChargeDetails","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemchargedetails.html#cfn-billingconductor-customlineitem-customlineitemchargedetails-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::BillingConductor::CustomLineItem.CustomLineItemFlatChargeDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemflatchargedetails.html","Properties":{"ChargeValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemflatchargedetails.html#cfn-billingconductor-customlineitem-customlineitemflatchargedetails-chargevalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::BillingConductor::CustomLineItem.CustomLineItemPercentageChargeDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitempercentagechargedetails.html","Properties":{"ChildAssociatedResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitempercentagechargedetails.html#cfn-billingconductor-customlineitem-customlineitempercentagechargedetails-childassociatedresources","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PercentageValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitempercentagechargedetails.html#cfn-billingconductor-customlineitem-customlineitempercentagechargedetails-percentagevalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::BillingConductor::PricingRule.FreeTier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-pricingrule-freetier.html","Properties":{"Activated":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-pricingrule-freetier.html#cfn-billingconductor-pricingrule-freetier-activated","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::BillingConductor::PricingRule.Tiering":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-pricingrule-tiering.html","Properties":{"FreeTier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-pricingrule-tiering.html#cfn-billingconductor-pricingrule-tiering-freetier","Required":false,"Type":"FreeTier","UpdateType":"Mutable"}}},"AWS::Budgets::Budget.AutoAdjustData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-autoadjustdata.html","Properties":{"AutoAdjustType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-autoadjustdata.html#cfn-budgets-budget-autoadjustdata-autoadjusttype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HistoricalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-autoadjustdata.html#cfn-budgets-budget-autoadjustdata-historicaloptions","Required":false,"Type":"HistoricalOptions","UpdateType":"Mutable"}}},"AWS::Budgets::Budget.BudgetData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-budgetdata.html","Properties":{"AutoAdjustData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-budgetdata.html#cfn-budgets-budget-budgetdata-autoadjustdata","Required":false,"Type":"AutoAdjustData","UpdateType":"Immutable"},"BudgetLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-budgetdata.html#cfn-budgets-budget-budgetdata-budgetlimit","Required":false,"Type":"Spend","UpdateType":"Mutable"},"BudgetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-budgetdata.html#cfn-budgets-budget-budgetdata-budgetname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BudgetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-budgetdata.html#cfn-budgets-budget-budgetdata-budgettype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CostFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-budgetdata.html#cfn-budgets-budget-budgetdata-costfilters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"CostTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-budgetdata.html#cfn-budgets-budget-budgetdata-costtypes","Required":false,"Type":"CostTypes","UpdateType":"Mutable"},"PlannedBudgetLimits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-budgetdata.html#cfn-budgets-budget-budgetdata-plannedbudgetlimits","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"TimePeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-budgetdata.html#cfn-budgets-budget-budgetdata-timeperiod","Required":false,"Type":"TimePeriod","UpdateType":"Mutable"},"TimeUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-budgetdata.html#cfn-budgets-budget-budgetdata-timeunit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Budgets::Budget.CostTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html","Properties":{"IncludeCredit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html#cfn-budgets-budget-costtypes-includecredit","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeDiscount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html#cfn-budgets-budget-costtypes-includediscount","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeOtherSubscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html#cfn-budgets-budget-costtypes-includeothersubscription","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeRecurring":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html#cfn-budgets-budget-costtypes-includerecurring","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeRefund":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html#cfn-budgets-budget-costtypes-includerefund","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeSubscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html#cfn-budgets-budget-costtypes-includesubscription","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html#cfn-budgets-budget-costtypes-includesupport","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeTax":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html#cfn-budgets-budget-costtypes-includetax","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeUpfront":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html#cfn-budgets-budget-costtypes-includeupfront","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UseAmortized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html#cfn-budgets-budget-costtypes-useamortized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UseBlended":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-costtypes.html#cfn-budgets-budget-costtypes-useblended","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Budgets::Budget.HistoricalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-historicaloptions.html","Properties":{"BudgetAdjustmentPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-historicaloptions.html#cfn-budgets-budget-historicaloptions-budgetadjustmentperiod","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Budgets::Budget.Notification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-notification.html","Properties":{"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-notification.html#cfn-budgets-budget-notification-comparisonoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NotificationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-notification.html#cfn-budgets-budget-notification-notificationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-notification.html#cfn-budgets-budget-notification-threshold","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"ThresholdType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-notification.html#cfn-budgets-budget-notification-thresholdtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Budgets::Budget.NotificationWithSubscribers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-notificationwithsubscribers.html","Properties":{"Notification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-notificationwithsubscribers.html#cfn-budgets-budget-notificationwithsubscribers-notification","Required":true,"Type":"Notification","UpdateType":"Mutable"},"Subscribers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-notificationwithsubscribers.html#cfn-budgets-budget-notificationwithsubscribers-subscribers","ItemType":"Subscriber","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Budgets::Budget.Spend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-spend.html","Properties":{"Amount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-spend.html#cfn-budgets-budget-spend-amount","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-spend.html#cfn-budgets-budget-spend-unit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Budgets::Budget.Subscriber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-subscriber.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-subscriber.html#cfn-budgets-budget-subscriber-address","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SubscriptionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-subscriber.html#cfn-budgets-budget-subscriber-subscriptiontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Budgets::Budget.TimePeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-timeperiod.html","Properties":{"End":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-timeperiod.html#cfn-budgets-budget-timeperiod-end","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Start":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budget-timeperiod.html#cfn-budgets-budget-timeperiod-start","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Budgets::BudgetsAction.ActionThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-actionthreshold.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-actionthreshold.html#cfn-budgets-budgetsaction-actionthreshold-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-actionthreshold.html#cfn-budgets-budgetsaction-actionthreshold-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::Budgets::BudgetsAction.Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-definition.html","Properties":{"IamActionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-definition.html#cfn-budgets-budgetsaction-definition-iamactiondefinition","Required":false,"Type":"IamActionDefinition","UpdateType":"Mutable"},"ScpActionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-definition.html#cfn-budgets-budgetsaction-definition-scpactiondefinition","Required":false,"Type":"ScpActionDefinition","UpdateType":"Mutable"},"SsmActionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-definition.html#cfn-budgets-budgetsaction-definition-ssmactiondefinition","Required":false,"Type":"SsmActionDefinition","UpdateType":"Mutable"}}},"AWS::Budgets::BudgetsAction.IamActionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-iamactiondefinition.html","Properties":{"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-iamactiondefinition.html#cfn-budgets-budgetsaction-iamactiondefinition-groups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PolicyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-iamactiondefinition.html#cfn-budgets-budgetsaction-iamactiondefinition-policyarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Roles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-iamactiondefinition.html#cfn-budgets-budgetsaction-iamactiondefinition-roles","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Users":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-iamactiondefinition.html#cfn-budgets-budgetsaction-iamactiondefinition-users","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Budgets::BudgetsAction.ScpActionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-scpactiondefinition.html","Properties":{"PolicyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-scpactiondefinition.html#cfn-budgets-budgetsaction-scpactiondefinition-policyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-scpactiondefinition.html#cfn-budgets-budgetsaction-scpactiondefinition-targetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Budgets::BudgetsAction.SsmActionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-ssmactiondefinition.html","Properties":{"InstanceIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-ssmactiondefinition.html#cfn-budgets-budgetsaction-ssmactiondefinition-instanceids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-ssmactiondefinition.html#cfn-budgets-budgetsaction-ssmactiondefinition-region","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Subtype":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-ssmactiondefinition.html#cfn-budgets-budgetsaction-ssmactiondefinition-subtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Budgets::BudgetsAction.Subscriber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-subscriber.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-subscriber.html#cfn-budgets-budgetsaction-subscriber-address","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-budgets-budgetsaction-subscriber.html#cfn-budgets-budgetsaction-subscriber-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CE::AnomalyMonitor.ResourceTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ce-anomalymonitor-resourcetag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ce-anomalymonitor-resourcetag.html#cfn-ce-anomalymonitor-resourcetag-key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ce-anomalymonitor-resourcetag.html#cfn-ce-anomalymonitor-resourcetag-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CE::AnomalySubscription.ResourceTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ce-anomalysubscription-resourcetag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ce-anomalysubscription-resourcetag.html#cfn-ce-anomalysubscription-resourcetag-key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ce-anomalysubscription-resourcetag.html#cfn-ce-anomalysubscription-resourcetag-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CE::AnomalySubscription.Subscriber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ce-anomalysubscription-subscriber.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ce-anomalysubscription-subscriber.html#cfn-ce-anomalysubscription-subscriber-address","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ce-anomalysubscription-subscriber.html#cfn-ce-anomalysubscription-subscriber-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ce-anomalysubscription-subscriber.html#cfn-ce-anomalysubscription-subscriber-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Cassandra::Keyspace.ReplicationSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-keyspace-replicationspecification.html","Properties":{"RegionList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-keyspace-replicationspecification.html#cfn-cassandra-keyspace-replicationspecification-regionlist","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ReplicationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-keyspace-replicationspecification.html#cfn-cassandra-keyspace-replicationspecification-replicationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Cassandra::Table.BillingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-billingmode.html","Properties":{"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-billingmode.html#cfn-cassandra-table-billingmode-mode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProvisionedThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-billingmode.html#cfn-cassandra-table-billingmode-provisionedthroughput","Required":false,"Type":"ProvisionedThroughput","UpdateType":"Mutable"}}},"AWS::Cassandra::Table.ClusteringKeyColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-clusteringkeycolumn.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-clusteringkeycolumn.html#cfn-cassandra-table-clusteringkeycolumn-column","Required":true,"Type":"Column","UpdateType":"Immutable"},"OrderBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-clusteringkeycolumn.html#cfn-cassandra-table-clusteringkeycolumn-orderby","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Cassandra::Table.Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-column.html","Properties":{"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-column.html#cfn-cassandra-table-column-columnname","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"},"ColumnType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-column.html#cfn-cassandra-table-column-columntype","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"}}},"AWS::Cassandra::Table.EncryptionSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-encryptionspecification.html","Properties":{"EncryptionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-encryptionspecification.html#cfn-cassandra-table-encryptionspecification-encryptiontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KmsKeyIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-encryptionspecification.html#cfn-cassandra-table-encryptionspecification-kmskeyidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cassandra::Table.ProvisionedThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-provisionedthroughput.html","Properties":{"ReadCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-provisionedthroughput.html#cfn-cassandra-table-provisionedthroughput-readcapacityunits","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"WriteCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-provisionedthroughput.html#cfn-cassandra-table-provisionedthroughput-writecapacityunits","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::CertificateManager::Account.ExpiryEventsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-certificatemanager-account-expiryeventsconfiguration.html","Properties":{"DaysBeforeExpiry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-certificatemanager-account-expiryeventsconfiguration.html#cfn-certificatemanager-account-expiryeventsconfiguration-daysbeforeexpiry","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::CertificateManager::Certificate.DomainValidationOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-certificatemanager-certificate-domainvalidationoption.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-certificatemanager-certificate-domainvalidationoption.html#cfn-certificatemanager-certificate-domainvalidationoptions-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HostedZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-certificatemanager-certificate-domainvalidationoption.html#cfn-certificatemanager-certificate-domainvalidationoption-hostedzoneid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValidationDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-certificatemanager-certificate-domainvalidationoption.html#cfn-certificatemanager-certificate-domainvalidationoption-validationdomain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CleanRooms::Collaboration.DataEncryptionMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-collaboration-dataencryptionmetadata.html","Properties":{"AllowCleartext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-collaboration-dataencryptionmetadata.html#cfn-cleanrooms-collaboration-dataencryptionmetadata-allowcleartext","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"AllowDuplicates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-collaboration-dataencryptionmetadata.html#cfn-cleanrooms-collaboration-dataencryptionmetadata-allowduplicates","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"AllowJoinsOnColumnsWithDifferentNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-collaboration-dataencryptionmetadata.html#cfn-cleanrooms-collaboration-dataencryptionmetadata-allowjoinsoncolumnswithdifferentnames","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"PreserveNulls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-collaboration-dataencryptionmetadata.html#cfn-cleanrooms-collaboration-dataencryptionmetadata-preservenulls","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"}}},"AWS::CleanRooms::Collaboration.MemberSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-collaboration-memberspecification.html","Properties":{"AccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-collaboration-memberspecification.html#cfn-cleanrooms-collaboration-memberspecification-accountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-collaboration-memberspecification.html#cfn-cleanrooms-collaboration-memberspecification-displayname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MemberAbilities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-collaboration-memberspecification.html#cfn-cleanrooms-collaboration-memberspecification-memberabilities","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::CleanRooms::ConfiguredTable.AggregateColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-aggregatecolumn.html","Properties":{"ColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-aggregatecolumn.html#cfn-cleanrooms-configuredtable-aggregatecolumn-columnnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Function":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-aggregatecolumn.html#cfn-cleanrooms-configuredtable-aggregatecolumn-function","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CleanRooms::ConfiguredTable.AggregationConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-aggregationconstraint.html","Properties":{"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-aggregationconstraint.html#cfn-cleanrooms-configuredtable-aggregationconstraint-columnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Minimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-aggregationconstraint.html#cfn-cleanrooms-configuredtable-aggregationconstraint-minimum","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-aggregationconstraint.html#cfn-cleanrooms-configuredtable-aggregationconstraint-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CleanRooms::ConfiguredTable.AnalysisRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisrule.html","Properties":{"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisrule.html#cfn-cleanrooms-configuredtable-analysisrule-policy","Required":true,"Type":"ConfiguredTableAnalysisRulePolicy","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisrule.html#cfn-cleanrooms-configuredtable-analysisrule-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CleanRooms::ConfiguredTable.AnalysisRuleAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisruleaggregation.html","Properties":{"AggregateColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisruleaggregation.html#cfn-cleanrooms-configuredtable-analysisruleaggregation-aggregatecolumns","DuplicatesAllowed":true,"ItemType":"AggregateColumn","Required":true,"Type":"List","UpdateType":"Mutable"},"AllowedJoinOperators":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisruleaggregation.html#cfn-cleanrooms-configuredtable-analysisruleaggregation-allowedjoinoperators","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DimensionColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisruleaggregation.html#cfn-cleanrooms-configuredtable-analysisruleaggregation-dimensioncolumns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"JoinColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisruleaggregation.html#cfn-cleanrooms-configuredtable-analysisruleaggregation-joincolumns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"JoinRequired":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisruleaggregation.html#cfn-cleanrooms-configuredtable-analysisruleaggregation-joinrequired","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutputConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisruleaggregation.html#cfn-cleanrooms-configuredtable-analysisruleaggregation-outputconstraints","DuplicatesAllowed":true,"ItemType":"AggregationConstraint","Required":true,"Type":"List","UpdateType":"Mutable"},"ScalarFunctions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisruleaggregation.html#cfn-cleanrooms-configuredtable-analysisruleaggregation-scalarfunctions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CleanRooms::ConfiguredTable.AnalysisRuleList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisrulelist.html","Properties":{"AllowedJoinOperators":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisrulelist.html#cfn-cleanrooms-configuredtable-analysisrulelist-allowedjoinoperators","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"JoinColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisrulelist.html#cfn-cleanrooms-configuredtable-analysisrulelist-joincolumns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"ListColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-analysisrulelist.html#cfn-cleanrooms-configuredtable-analysisrulelist-listcolumns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CleanRooms::ConfiguredTable.ConfiguredTableAnalysisRulePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-configuredtableanalysisrulepolicy.html","Properties":{"V1":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-configuredtableanalysisrulepolicy.html#cfn-cleanrooms-configuredtable-configuredtableanalysisrulepolicy-v1","Required":true,"Type":"ConfiguredTableAnalysisRulePolicyV1","UpdateType":"Mutable"}}},"AWS::CleanRooms::ConfiguredTable.ConfiguredTableAnalysisRulePolicyV1":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-configuredtableanalysisrulepolicyv1.html","Properties":{"Aggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-configuredtableanalysisrulepolicyv1.html#cfn-cleanrooms-configuredtable-configuredtableanalysisrulepolicyv1-aggregation","Required":false,"Type":"AnalysisRuleAggregation","UpdateType":"Mutable"},"List":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-configuredtableanalysisrulepolicyv1.html#cfn-cleanrooms-configuredtable-configuredtableanalysisrulepolicyv1-list","Required":false,"Type":"AnalysisRuleList","UpdateType":"Mutable"}}},"AWS::CleanRooms::ConfiguredTable.GlueTableReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-gluetablereference.html","Properties":{"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-gluetablereference.html#cfn-cleanrooms-configuredtable-gluetablereference-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-gluetablereference.html#cfn-cleanrooms-configuredtable-gluetablereference-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CleanRooms::ConfiguredTable.TableReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-tablereference.html","Properties":{"Glue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cleanrooms-configuredtable-tablereference.html#cfn-cleanrooms-configuredtable-tablereference-glue","Required":true,"Type":"GlueTableReference","UpdateType":"Immutable"}}},"AWS::Cloud9::EnvironmentEC2.Repository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloud9-environmentec2-repository.html","Properties":{"PathComponent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloud9-environmentec2-repository.html#cfn-cloud9-environmentec2-repository-pathcomponent","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RepositoryUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloud9-environmentec2-repository.html#cfn-cloud9-environmentec2-repository-repositoryurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFormation::HookVersion.LoggingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-hookversion-loggingconfig.html","Properties":{"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-hookversion-loggingconfig.html#cfn-cloudformation-hookversion-loggingconfig-loggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LogRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-hookversion-loggingconfig.html#cfn-cloudformation-hookversion-loggingconfig-logrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CloudFormation::ResourceVersion.LoggingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-resourceversion-loggingconfig.html","Properties":{"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-resourceversion-loggingconfig.html#cfn-cloudformation-resourceversion-loggingconfig-loggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LogRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-resourceversion-loggingconfig.html#cfn-cloudformation-resourceversion-loggingconfig-logrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CloudFormation::StackSet.AutoDeployment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-autodeployment.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-autodeployment.html#cfn-cloudformation-stackset-autodeployment-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RetainStacksOnAccountRemoval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-autodeployment.html#cfn-cloudformation-stackset-autodeployment-retainstacksonaccountremoval","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFormation::StackSet.DeploymentTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-deploymenttargets.html","Properties":{"AccountFilterType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-deploymenttargets.html#cfn-cloudformation-stackset-deploymenttargets-accountfiltertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Accounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-deploymenttargets.html#cfn-cloudformation-stackset-deploymenttargets-accounts","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OrganizationalUnitIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-deploymenttargets.html#cfn-cloudformation-stackset-deploymenttargets-organizationalunitids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFormation::StackSet.ManagedExecution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-managedexecution.html","Properties":{"Active":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-managedexecution.html#cfn-cloudformation-stackset-managedexecution-active","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFormation::StackSet.OperationPreferences":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-operationpreferences.html","Properties":{"FailureToleranceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-operationpreferences.html#cfn-cloudformation-stackset-operationpreferences-failuretolerancecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FailureTolerancePercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-operationpreferences.html#cfn-cloudformation-stackset-operationpreferences-failuretolerancepercentage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxConcurrentCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-operationpreferences.html#cfn-cloudformation-stackset-operationpreferences-maxconcurrentcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxConcurrentPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-operationpreferences.html#cfn-cloudformation-stackset-operationpreferences-maxconcurrentpercentage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RegionConcurrencyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-operationpreferences.html#cfn-cloudformation-stackset-operationpreferences-regionconcurrencytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RegionOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-operationpreferences.html#cfn-cloudformation-stackset-operationpreferences-regionorder","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFormation::StackSet.Parameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-parameter.html","Properties":{"ParameterKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-parameter.html#cfn-cloudformation-stackset-parameter-parameterkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-parameter.html#cfn-cloudformation-stackset-parameter-parametervalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFormation::StackSet.StackInstances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-stackinstances.html","Properties":{"DeploymentTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-stackinstances.html#cfn-cloudformation-stackset-stackinstances-deploymenttargets","Required":true,"Type":"DeploymentTargets","UpdateType":"Mutable"},"ParameterOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-stackinstances.html#cfn-cloudformation-stackset-stackinstances-parameteroverrides","DuplicatesAllowed":false,"ItemType":"Parameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Regions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-stackset-stackinstances.html#cfn-cloudformation-stackset-stackinstances-regions","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFormation::TypeActivation.LoggingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-typeactivation-loggingconfig.html","Properties":{"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-typeactivation-loggingconfig.html#cfn-cloudformation-typeactivation-loggingconfig-loggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LogRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-typeactivation-loggingconfig.html#cfn-cloudformation-typeactivation-loggingconfig-logrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CloudFront::CachePolicy.CachePolicyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-cachepolicyconfig.html","Properties":{"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-cachepolicyconfig.html#cfn-cloudfront-cachepolicy-cachepolicyconfig-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-cachepolicyconfig.html#cfn-cloudfront-cachepolicy-cachepolicyconfig-defaultttl","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"MaxTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-cachepolicyconfig.html#cfn-cloudfront-cachepolicy-cachepolicyconfig-maxttl","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"MinTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-cachepolicyconfig.html#cfn-cloudfront-cachepolicy-cachepolicyconfig-minttl","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-cachepolicyconfig.html#cfn-cloudfront-cachepolicy-cachepolicyconfig-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParametersInCacheKeyAndForwardedToOrigin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-cachepolicyconfig.html#cfn-cloudfront-cachepolicy-cachepolicyconfig-parametersincachekeyandforwardedtoorigin","Required":true,"Type":"ParametersInCacheKeyAndForwardedToOrigin","UpdateType":"Mutable"}}},"AWS::CloudFront::CachePolicy.CookiesConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-cookiesconfig.html","Properties":{"CookieBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-cookiesconfig.html#cfn-cloudfront-cachepolicy-cookiesconfig-cookiebehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Cookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-cookiesconfig.html#cfn-cloudfront-cachepolicy-cookiesconfig-cookies","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::CachePolicy.HeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-headersconfig.html","Properties":{"HeaderBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-headersconfig.html#cfn-cloudfront-cachepolicy-headersconfig-headerbehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Headers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-headersconfig.html#cfn-cloudfront-cachepolicy-headersconfig-headers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::CachePolicy.ParametersInCacheKeyAndForwardedToOrigin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-parametersincachekeyandforwardedtoorigin.html","Properties":{"CookiesConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-parametersincachekeyandforwardedtoorigin.html#cfn-cloudfront-cachepolicy-parametersincachekeyandforwardedtoorigin-cookiesconfig","Required":true,"Type":"CookiesConfig","UpdateType":"Mutable"},"EnableAcceptEncodingBrotli":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-parametersincachekeyandforwardedtoorigin.html#cfn-cloudfront-cachepolicy-parametersincachekeyandforwardedtoorigin-enableacceptencodingbrotli","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableAcceptEncodingGzip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-parametersincachekeyandforwardedtoorigin.html#cfn-cloudfront-cachepolicy-parametersincachekeyandforwardedtoorigin-enableacceptencodinggzip","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"HeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-parametersincachekeyandforwardedtoorigin.html#cfn-cloudfront-cachepolicy-parametersincachekeyandforwardedtoorigin-headersconfig","Required":true,"Type":"HeadersConfig","UpdateType":"Mutable"},"QueryStringsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-parametersincachekeyandforwardedtoorigin.html#cfn-cloudfront-cachepolicy-parametersincachekeyandforwardedtoorigin-querystringsconfig","Required":true,"Type":"QueryStringsConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::CachePolicy.QueryStringsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-querystringsconfig.html","Properties":{"QueryStringBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-querystringsconfig.html#cfn-cloudfront-cachepolicy-querystringsconfig-querystringbehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"QueryStrings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cachepolicy-querystringsconfig.html#cfn-cloudfront-cachepolicy-querystringsconfig-querystrings","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::CloudFrontOriginAccessIdentity.CloudFrontOriginAccessIdentityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cloudfrontoriginaccessidentity-cloudfrontoriginaccessidentityconfig.html","Properties":{"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-cloudfrontoriginaccessidentity-cloudfrontoriginaccessidentityconfig.html#cfn-cloudfront-cloudfrontoriginaccessidentity-cloudfrontoriginaccessidentityconfig-comment","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ContinuousDeploymentPolicy.ContinuousDeploymentPolicyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-continuousdeploymentpolicyconfig.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-continuousdeploymentpolicyconfig.html#cfn-cloudfront-continuousdeploymentpolicy-continuousdeploymentpolicyconfig-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"StagingDistributionDnsNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-continuousdeploymentpolicyconfig.html#cfn-cloudfront-continuousdeploymentpolicy-continuousdeploymentpolicyconfig-stagingdistributiondnsnames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"TrafficConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-continuousdeploymentpolicyconfig.html#cfn-cloudfront-continuousdeploymentpolicy-continuousdeploymentpolicyconfig-trafficconfig","Required":false,"Type":"TrafficConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::ContinuousDeploymentPolicy.SessionStickinessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-sessionstickinessconfig.html","Properties":{"IdleTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-sessionstickinessconfig.html#cfn-cloudfront-continuousdeploymentpolicy-sessionstickinessconfig-idlettl","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MaximumTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-sessionstickinessconfig.html#cfn-cloudfront-continuousdeploymentpolicy-sessionstickinessconfig-maximumttl","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ContinuousDeploymentPolicy.SingleHeaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-singleheaderconfig.html","Properties":{"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-singleheaderconfig.html#cfn-cloudfront-continuousdeploymentpolicy-singleheaderconfig-header","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-singleheaderconfig.html#cfn-cloudfront-continuousdeploymentpolicy-singleheaderconfig-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ContinuousDeploymentPolicy.SingleWeightConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-singleweightconfig.html","Properties":{"SessionStickinessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-singleweightconfig.html#cfn-cloudfront-continuousdeploymentpolicy-singleweightconfig-sessionstickinessconfig","Required":false,"Type":"SessionStickinessConfig","UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-singleweightconfig.html#cfn-cloudfront-continuousdeploymentpolicy-singleweightconfig-weight","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ContinuousDeploymentPolicy.TrafficConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-trafficconfig.html","Properties":{"SingleHeaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-trafficconfig.html#cfn-cloudfront-continuousdeploymentpolicy-trafficconfig-singleheaderconfig","Required":false,"Type":"SingleHeaderConfig","UpdateType":"Mutable"},"SingleWeightConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-trafficconfig.html#cfn-cloudfront-continuousdeploymentpolicy-trafficconfig-singleweightconfig","Required":false,"Type":"SingleWeightConfig","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-continuousdeploymentpolicy-trafficconfig.html#cfn-cloudfront-continuousdeploymentpolicy-trafficconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.CacheBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html","Properties":{"AllowedMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-allowedmethods","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CachePolicyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-cachepolicyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CachedMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-cachedmethods","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Compress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-compress","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DefaultTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-defaultttl","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"FieldLevelEncryptionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-fieldlevelencryptionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ForwardedValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-forwardedvalues","Required":false,"Type":"ForwardedValues","UpdateType":"Mutable"},"FunctionAssociations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-functionassociations","DuplicatesAllowed":true,"ItemType":"FunctionAssociation","Required":false,"Type":"List","UpdateType":"Mutable"},"LambdaFunctionAssociations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-lambdafunctionassociations","DuplicatesAllowed":true,"ItemType":"LambdaFunctionAssociation","Required":false,"Type":"List","UpdateType":"Mutable"},"MaxTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-maxttl","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MinTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-minttl","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"OriginRequestPolicyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-originrequestpolicyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PathPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-pathpattern","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RealtimeLogConfigArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-realtimelogconfigarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseHeadersPolicyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-responseheaderspolicyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SmoothStreaming":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-smoothstreaming","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TargetOriginId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-targetoriginid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TrustedKeyGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-trustedkeygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TrustedSigners":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-trustedsigners","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ViewerProtocolPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-viewerprotocolpolicy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.Cookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cookies.html","Properties":{"Forward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cookies.html#cfn-cloudfront-distribution-cookies-forward","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"WhitelistedNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cookies.html#cfn-cloudfront-distribution-cookies-whitelistednames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.CustomErrorResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customerrorresponse.html","Properties":{"ErrorCachingMinTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customerrorresponse.html#cfn-cloudfront-distribution-customerrorresponse-errorcachingminttl","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ErrorCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customerrorresponse.html#cfn-cloudfront-distribution-customerrorresponse-errorcode","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ResponseCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customerrorresponse.html#cfn-cloudfront-distribution-customerrorresponse-responsecode","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ResponsePagePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customerrorresponse.html#cfn-cloudfront-distribution-customerrorresponse-responsepagepath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.CustomOriginConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customoriginconfig.html","Properties":{"HTTPPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customoriginconfig.html#cfn-cloudfront-distribution-customoriginconfig-httpport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HTTPSPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customoriginconfig.html#cfn-cloudfront-distribution-customoriginconfig-httpsport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OriginKeepaliveTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customoriginconfig.html#cfn-cloudfront-distribution-customoriginconfig-originkeepalivetimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OriginProtocolPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customoriginconfig.html#cfn-cloudfront-distribution-customoriginconfig-originprotocolpolicy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OriginReadTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customoriginconfig.html#cfn-cloudfront-distribution-customoriginconfig-originreadtimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OriginSSLProtocols":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customoriginconfig.html#cfn-cloudfront-distribution-customoriginconfig-originsslprotocols","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.DefaultCacheBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html","Properties":{"AllowedMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-allowedmethods","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CachePolicyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-cachepolicyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CachedMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-cachedmethods","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Compress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-compress","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DefaultTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-defaultttl","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"FieldLevelEncryptionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-fieldlevelencryptionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ForwardedValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-forwardedvalues","Required":false,"Type":"ForwardedValues","UpdateType":"Mutable"},"FunctionAssociations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-functionassociations","DuplicatesAllowed":true,"ItemType":"FunctionAssociation","Required":false,"Type":"List","UpdateType":"Mutable"},"LambdaFunctionAssociations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-lambdafunctionassociations","DuplicatesAllowed":true,"ItemType":"LambdaFunctionAssociation","Required":false,"Type":"List","UpdateType":"Mutable"},"MaxTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-maxttl","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MinTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-minttl","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"OriginRequestPolicyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-originrequestpolicyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RealtimeLogConfigArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-realtimelogconfigarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseHeadersPolicyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-responseheaderspolicyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SmoothStreaming":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-smoothstreaming","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TargetOriginId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-targetoriginid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TrustedKeyGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-trustedkeygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TrustedSigners":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-trustedsigners","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ViewerProtocolPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-viewerprotocolpolicy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.DistributionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html","Properties":{"Aliases":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-aliases","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CNAMEs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-cnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CacheBehaviors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-cachebehaviors","DuplicatesAllowed":true,"ItemType":"CacheBehavior","Required":false,"Type":"List","UpdateType":"Mutable"},"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContinuousDeploymentPolicyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-continuousdeploymentpolicyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomErrorResponses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-customerrorresponses","DuplicatesAllowed":true,"ItemType":"CustomErrorResponse","Required":false,"Type":"List","UpdateType":"Mutable"},"CustomOrigin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-customorigin","Required":false,"Type":"LegacyCustomOrigin","UpdateType":"Mutable"},"DefaultCacheBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-defaultcachebehavior","Required":true,"Type":"DefaultCacheBehavior","UpdateType":"Mutable"},"DefaultRootObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-defaultrootobject","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"HttpVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-httpversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IPV6Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-ipv6enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-logging","Required":false,"Type":"Logging","UpdateType":"Mutable"},"OriginGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-origingroups","Required":false,"Type":"OriginGroups","UpdateType":"Mutable"},"Origins":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-origins","DuplicatesAllowed":true,"ItemType":"Origin","Required":false,"Type":"List","UpdateType":"Mutable"},"PriceClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-priceclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Restrictions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-restrictions","Required":false,"Type":"Restrictions","UpdateType":"Mutable"},"S3Origin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-s3origin","Required":false,"Type":"LegacyS3Origin","UpdateType":"Mutable"},"Staging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-staging","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ViewerCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-viewercertificate","Required":false,"Type":"ViewerCertificate","UpdateType":"Mutable"},"WebACLId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html#cfn-cloudfront-distribution-distributionconfig-webaclid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.ForwardedValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-forwardedvalues.html","Properties":{"Cookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-forwardedvalues.html#cfn-cloudfront-distribution-forwardedvalues-cookies","Required":false,"Type":"Cookies","UpdateType":"Mutable"},"Headers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-forwardedvalues.html#cfn-cloudfront-distribution-forwardedvalues-headers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"QueryString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-forwardedvalues.html#cfn-cloudfront-distribution-forwardedvalues-querystring","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"QueryStringCacheKeys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-forwardedvalues.html#cfn-cloudfront-distribution-forwardedvalues-querystringcachekeys","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.FunctionAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-functionassociation.html","Properties":{"EventType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-functionassociation.html#cfn-cloudfront-distribution-functionassociation-eventtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FunctionARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-functionassociation.html#cfn-cloudfront-distribution-functionassociation-functionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.GeoRestriction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-georestriction.html","Properties":{"Locations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-georestriction.html#cfn-cloudfront-distribution-georestriction-locations","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RestrictionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-georestriction.html#cfn-cloudfront-distribution-georestriction-restrictiontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.LambdaFunctionAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-lambdafunctionassociation.html","Properties":{"EventType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-lambdafunctionassociation.html#cfn-cloudfront-distribution-lambdafunctionassociation-eventtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IncludeBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-lambdafunctionassociation.html#cfn-cloudfront-distribution-lambdafunctionassociation-includebody","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LambdaFunctionARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-lambdafunctionassociation.html#cfn-cloudfront-distribution-lambdafunctionassociation-lambdafunctionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.LegacyCustomOrigin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-legacycustomorigin.html","Properties":{"DNSName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-legacycustomorigin.html#cfn-cloudfront-distribution-legacycustomorigin-dnsname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HTTPPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-legacycustomorigin.html#cfn-cloudfront-distribution-legacycustomorigin-httpport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HTTPSPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-legacycustomorigin.html#cfn-cloudfront-distribution-legacycustomorigin-httpsport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OriginProtocolPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-legacycustomorigin.html#cfn-cloudfront-distribution-legacycustomorigin-originprotocolpolicy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OriginSSLProtocols":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-legacycustomorigin.html#cfn-cloudfront-distribution-legacycustomorigin-originsslprotocols","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.LegacyS3Origin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-legacys3origin.html","Properties":{"DNSName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-legacys3origin.html#cfn-cloudfront-distribution-legacys3origin-dnsname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OriginAccessIdentity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-legacys3origin.html#cfn-cloudfront-distribution-legacys3origin-originaccessidentity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-logging.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-logging.html#cfn-cloudfront-distribution-logging-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncludeCookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-logging.html#cfn-cloudfront-distribution-logging-includecookies","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-logging.html#cfn-cloudfront-distribution-logging-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.Origin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html","Properties":{"ConnectionAttempts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-connectionattempts","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ConnectionTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-connectiontimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CustomOriginConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-customoriginconfig","Required":false,"Type":"CustomOriginConfig","UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OriginAccessControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-originaccesscontrolid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OriginCustomHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-origincustomheaders","DuplicatesAllowed":true,"ItemType":"OriginCustomHeader","Required":false,"Type":"List","UpdateType":"Mutable"},"OriginPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-originpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OriginShield":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-originshield","Required":false,"Type":"OriginShield","UpdateType":"Mutable"},"S3OriginConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origin.html#cfn-cloudfront-distribution-origin-s3originconfig","Required":false,"Type":"S3OriginConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.OriginCustomHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origincustomheader.html","Properties":{"HeaderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origincustomheader.html#cfn-cloudfront-distribution-origincustomheader-headername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HeaderValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origincustomheader.html#cfn-cloudfront-distribution-origincustomheader-headervalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.OriginGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroup.html","Properties":{"FailoverCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroup.html#cfn-cloudfront-distribution-origingroup-failovercriteria","Required":true,"Type":"OriginGroupFailoverCriteria","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroup.html#cfn-cloudfront-distribution-origingroup-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Members":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroup.html#cfn-cloudfront-distribution-origingroup-members","Required":true,"Type":"OriginGroupMembers","UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.OriginGroupFailoverCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroupfailovercriteria.html","Properties":{"StatusCodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroupfailovercriteria.html#cfn-cloudfront-distribution-origingroupfailovercriteria-statuscodes","Required":true,"Type":"StatusCodes","UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.OriginGroupMember":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroupmember.html","Properties":{"OriginId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroupmember.html#cfn-cloudfront-distribution-origingroupmember-originid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.OriginGroupMembers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroupmembers.html","Properties":{"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroupmembers.html#cfn-cloudfront-distribution-origingroupmembers-items","DuplicatesAllowed":true,"ItemType":"OriginGroupMember","Required":true,"Type":"List","UpdateType":"Mutable"},"Quantity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroupmembers.html#cfn-cloudfront-distribution-origingroupmembers-quantity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.OriginGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroups.html","Properties":{"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroups.html#cfn-cloudfront-distribution-origingroups-items","DuplicatesAllowed":true,"ItemType":"OriginGroup","Required":false,"Type":"List","UpdateType":"Mutable"},"Quantity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-origingroups.html#cfn-cloudfront-distribution-origingroups-quantity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.OriginShield":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-originshield.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-originshield.html#cfn-cloudfront-distribution-originshield-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"OriginShieldRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-originshield.html#cfn-cloudfront-distribution-originshield-originshieldregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.Restrictions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-restrictions.html","Properties":{"GeoRestriction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-restrictions.html#cfn-cloudfront-distribution-restrictions-georestriction","Required":true,"Type":"GeoRestriction","UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.S3OriginConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-s3originconfig.html","Properties":{"OriginAccessIdentity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-s3originconfig.html#cfn-cloudfront-distribution-s3originconfig-originaccessidentity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.StatusCodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-statuscodes.html","Properties":{"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-statuscodes.html#cfn-cloudfront-distribution-statuscodes-items","DuplicatesAllowed":true,"PrimitiveItemType":"Integer","Required":true,"Type":"List","UpdateType":"Mutable"},"Quantity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-statuscodes.html#cfn-cloudfront-distribution-statuscodes-quantity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution.ViewerCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-viewercertificate.html","Properties":{"AcmCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-viewercertificate.html#cfn-cloudfront-distribution-viewercertificate-acmcertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CloudFrontDefaultCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-viewercertificate.html#cfn-cloudfront-distribution-viewercertificate-cloudfrontdefaultcertificate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IamCertificateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-viewercertificate.html#cfn-cloudfront-distribution-viewercertificate-iamcertificateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MinimumProtocolVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-viewercertificate.html#cfn-cloudfront-distribution-viewercertificate-minimumprotocolversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SslSupportMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-viewercertificate.html#cfn-cloudfront-distribution-viewercertificate-sslsupportmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::Function.FunctionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-function-functionconfig.html","Properties":{"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-function-functionconfig.html#cfn-cloudfront-function-functionconfig-comment","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Runtime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-function-functionconfig.html#cfn-cloudfront-function-functionconfig-runtime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::Function.FunctionMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-function-functionmetadata.html","Properties":{"FunctionARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-function-functionmetadata.html#cfn-cloudfront-function-functionmetadata-functionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::KeyGroup.KeyGroupConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-keygroup-keygroupconfig.html","Properties":{"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-keygroup-keygroupconfig.html#cfn-cloudfront-keygroup-keygroupconfig-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-keygroup-keygroupconfig.html#cfn-cloudfront-keygroup-keygroupconfig-items","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-keygroup-keygroupconfig.html#cfn-cloudfront-keygroup-keygroupconfig-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::MonitoringSubscription.MonitoringSubscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-monitoringsubscription-monitoringsubscription.html","Properties":{"RealtimeMetricsSubscriptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-monitoringsubscription-monitoringsubscription.html#cfn-cloudfront-monitoringsubscription-monitoringsubscription-realtimemetricssubscriptionconfig","Required":false,"Type":"RealtimeMetricsSubscriptionConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::MonitoringSubscription.RealtimeMetricsSubscriptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-monitoringsubscription-realtimemetricssubscriptionconfig.html","Properties":{"RealtimeMetricsSubscriptionStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-monitoringsubscription-realtimemetricssubscriptionconfig.html#cfn-cloudfront-monitoringsubscription-realtimemetricssubscriptionconfig-realtimemetricssubscriptionstatus","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::OriginAccessControl.OriginAccessControlConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originaccesscontrol-originaccesscontrolconfig.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originaccesscontrol-originaccesscontrolconfig.html#cfn-cloudfront-originaccesscontrol-originaccesscontrolconfig-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originaccesscontrol-originaccesscontrolconfig.html#cfn-cloudfront-originaccesscontrol-originaccesscontrolconfig-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OriginAccessControlOriginType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originaccesscontrol-originaccesscontrolconfig.html#cfn-cloudfront-originaccesscontrol-originaccesscontrolconfig-originaccesscontrolorigintype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SigningBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originaccesscontrol-originaccesscontrolconfig.html#cfn-cloudfront-originaccesscontrol-originaccesscontrolconfig-signingbehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SigningProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originaccesscontrol-originaccesscontrolconfig.html#cfn-cloudfront-originaccesscontrol-originaccesscontrolconfig-signingprotocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::OriginRequestPolicy.CookiesConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-cookiesconfig.html","Properties":{"CookieBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-cookiesconfig.html#cfn-cloudfront-originrequestpolicy-cookiesconfig-cookiebehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Cookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-cookiesconfig.html#cfn-cloudfront-originrequestpolicy-cookiesconfig-cookies","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::OriginRequestPolicy.HeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-headersconfig.html","Properties":{"HeaderBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-headersconfig.html#cfn-cloudfront-originrequestpolicy-headersconfig-headerbehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Headers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-headersconfig.html#cfn-cloudfront-originrequestpolicy-headersconfig-headers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::OriginRequestPolicy.OriginRequestPolicyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-originrequestpolicyconfig.html","Properties":{"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-originrequestpolicyconfig.html#cfn-cloudfront-originrequestpolicy-originrequestpolicyconfig-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CookiesConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-originrequestpolicyconfig.html#cfn-cloudfront-originrequestpolicy-originrequestpolicyconfig-cookiesconfig","Required":true,"Type":"CookiesConfig","UpdateType":"Mutable"},"HeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-originrequestpolicyconfig.html#cfn-cloudfront-originrequestpolicy-originrequestpolicyconfig-headersconfig","Required":true,"Type":"HeadersConfig","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-originrequestpolicyconfig.html#cfn-cloudfront-originrequestpolicy-originrequestpolicyconfig-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"QueryStringsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-originrequestpolicyconfig.html#cfn-cloudfront-originrequestpolicy-originrequestpolicyconfig-querystringsconfig","Required":true,"Type":"QueryStringsConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::OriginRequestPolicy.QueryStringsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-querystringsconfig.html","Properties":{"QueryStringBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-querystringsconfig.html#cfn-cloudfront-originrequestpolicy-querystringsconfig-querystringbehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"QueryStrings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-originrequestpolicy-querystringsconfig.html#cfn-cloudfront-originrequestpolicy-querystringsconfig-querystrings","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::PublicKey.PublicKeyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-publickey-publickeyconfig.html","Properties":{"CallerReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-publickey-publickeyconfig.html#cfn-cloudfront-publickey-publickeyconfig-callerreference","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-publickey-publickeyconfig.html#cfn-cloudfront-publickey-publickeyconfig-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncodedKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-publickey-publickeyconfig.html#cfn-cloudfront-publickey-publickeyconfig-encodedkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-publickey-publickeyconfig.html#cfn-cloudfront-publickey-publickeyconfig-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::RealtimeLogConfig.EndPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-realtimelogconfig-endpoint.html","Properties":{"KinesisStreamConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-realtimelogconfig-endpoint.html#cfn-cloudfront-realtimelogconfig-endpoint-kinesisstreamconfig","Required":true,"Type":"KinesisStreamConfig","UpdateType":"Mutable"},"StreamType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-realtimelogconfig-endpoint.html#cfn-cloudfront-realtimelogconfig-endpoint-streamtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::RealtimeLogConfig.KinesisStreamConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-realtimelogconfig-kinesisstreamconfig.html","Properties":{"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-realtimelogconfig-kinesisstreamconfig.html#cfn-cloudfront-realtimelogconfig-kinesisstreamconfig-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StreamArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-realtimelogconfig-kinesisstreamconfig.html#cfn-cloudfront-realtimelogconfig-kinesisstreamconfig-streamarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.AccessControlAllowHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolallowheaders.html","Properties":{"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolallowheaders.html#cfn-cloudfront-responseheaderspolicy-accesscontrolallowheaders-items","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.AccessControlAllowMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolallowmethods.html","Properties":{"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolallowmethods.html#cfn-cloudfront-responseheaderspolicy-accesscontrolallowmethods-items","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.AccessControlAllowOrigins":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolalloworigins.html","Properties":{"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolalloworigins.html#cfn-cloudfront-responseheaderspolicy-accesscontrolalloworigins-items","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.AccessControlExposeHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolexposeheaders.html","Properties":{"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolexposeheaders.html#cfn-cloudfront-responseheaderspolicy-accesscontrolexposeheaders-items","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.ContentSecurityPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-contentsecuritypolicy.html","Properties":{"ContentSecurityPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-contentsecuritypolicy.html#cfn-cloudfront-responseheaderspolicy-contentsecuritypolicy-contentsecuritypolicy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Override":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-contentsecuritypolicy.html#cfn-cloudfront-responseheaderspolicy-contentsecuritypolicy-override","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.ContentTypeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-contenttypeoptions.html","Properties":{"Override":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-contenttypeoptions.html#cfn-cloudfront-responseheaderspolicy-contenttypeoptions-override","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.CorsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html","Properties":{"AccessControlAllowCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolallowcredentials","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"AccessControlAllowHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolallowheaders","Required":true,"Type":"AccessControlAllowHeaders","UpdateType":"Mutable"},"AccessControlAllowMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolallowmethods","Required":true,"Type":"AccessControlAllowMethods","UpdateType":"Mutable"},"AccessControlAllowOrigins":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolalloworigins","Required":true,"Type":"AccessControlAllowOrigins","UpdateType":"Mutable"},"AccessControlExposeHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolexposeheaders","Required":false,"Type":"AccessControlExposeHeaders","UpdateType":"Mutable"},"AccessControlMaxAgeSec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolmaxagesec","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OriginOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-originoverride","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.CustomHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheader.html","Properties":{"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheader.html#cfn-cloudfront-responseheaderspolicy-customheader-header","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Override":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheader.html#cfn-cloudfront-responseheaderspolicy-customheader-override","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheader.html#cfn-cloudfront-responseheaderspolicy-customheader-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.CustomHeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheadersconfig.html","Properties":{"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheadersconfig.html#cfn-cloudfront-responseheaderspolicy-customheadersconfig-items","DuplicatesAllowed":true,"ItemType":"CustomHeader","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.FrameOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-frameoptions.html","Properties":{"FrameOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-frameoptions.html#cfn-cloudfront-responseheaderspolicy-frameoptions-frameoption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Override":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-frameoptions.html#cfn-cloudfront-responseheaderspolicy-frameoptions-override","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.ReferrerPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-referrerpolicy.html","Properties":{"Override":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-referrerpolicy.html#cfn-cloudfront-responseheaderspolicy-referrerpolicy-override","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"ReferrerPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-referrerpolicy.html#cfn-cloudfront-responseheaderspolicy-referrerpolicy-referrerpolicy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.RemoveHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-removeheader.html","Properties":{"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-removeheader.html#cfn-cloudfront-responseheaderspolicy-removeheader-header","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.RemoveHeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-removeheadersconfig.html","Properties":{"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-removeheadersconfig.html#cfn-cloudfront-responseheaderspolicy-removeheadersconfig-items","DuplicatesAllowed":false,"ItemType":"RemoveHeader","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.ResponseHeadersPolicyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html","Properties":{"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CorsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-corsconfig","Required":false,"Type":"CorsConfig","UpdateType":"Mutable"},"CustomHeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-customheadersconfig","Required":false,"Type":"CustomHeadersConfig","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RemoveHeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-removeheadersconfig","Required":false,"Type":"RemoveHeadersConfig","UpdateType":"Mutable"},"SecurityHeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-securityheadersconfig","Required":false,"Type":"SecurityHeadersConfig","UpdateType":"Mutable"},"ServerTimingHeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-servertimingheadersconfig","Required":false,"Type":"ServerTimingHeadersConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.SecurityHeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html","Properties":{"ContentSecurityPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-contentsecuritypolicy","Required":false,"Type":"ContentSecurityPolicy","UpdateType":"Mutable"},"ContentTypeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-contenttypeoptions","Required":false,"Type":"ContentTypeOptions","UpdateType":"Mutable"},"FrameOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-frameoptions","Required":false,"Type":"FrameOptions","UpdateType":"Mutable"},"ReferrerPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-referrerpolicy","Required":false,"Type":"ReferrerPolicy","UpdateType":"Mutable"},"StrictTransportSecurity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-stricttransportsecurity","Required":false,"Type":"StrictTransportSecurity","UpdateType":"Mutable"},"XSSProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-xssprotection","Required":false,"Type":"XSSProtection","UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.ServerTimingHeadersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-servertimingheadersconfig.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-servertimingheadersconfig.html#cfn-cloudfront-responseheaderspolicy-servertimingheadersconfig-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"SamplingRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-servertimingheadersconfig.html#cfn-cloudfront-responseheaderspolicy-servertimingheadersconfig-samplingrate","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.StrictTransportSecurity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-stricttransportsecurity.html","Properties":{"AccessControlMaxAgeSec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-stricttransportsecurity.html#cfn-cloudfront-responseheaderspolicy-stricttransportsecurity-accesscontrolmaxagesec","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"IncludeSubdomains":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-stricttransportsecurity.html#cfn-cloudfront-responseheaderspolicy-stricttransportsecurity-includesubdomains","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Override":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-stricttransportsecurity.html#cfn-cloudfront-responseheaderspolicy-stricttransportsecurity-override","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Preload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-stricttransportsecurity.html#cfn-cloudfront-responseheaderspolicy-stricttransportsecurity-preload","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy.XSSProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-xssprotection.html","Properties":{"ModeBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-xssprotection.html#cfn-cloudfront-responseheaderspolicy-xssprotection-modeblock","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Override":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-xssprotection.html#cfn-cloudfront-responseheaderspolicy-xssprotection-override","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Protection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-xssprotection.html#cfn-cloudfront-responseheaderspolicy-xssprotection-protection","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"ReportUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-xssprotection.html#cfn-cloudfront-responseheaderspolicy-xssprotection-reporturi","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFront::StreamingDistribution.Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-logging.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-logging.html#cfn-cloudfront-streamingdistribution-logging-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-logging.html#cfn-cloudfront-streamingdistribution-logging-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-logging.html#cfn-cloudfront-streamingdistribution-logging-prefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::StreamingDistribution.S3Origin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-s3origin.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-s3origin.html#cfn-cloudfront-streamingdistribution-s3origin-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OriginAccessIdentity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-s3origin.html#cfn-cloudfront-streamingdistribution-s3origin-originaccessidentity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::StreamingDistribution.StreamingDistributionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-streamingdistributionconfig.html","Properties":{"Aliases":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-streamingdistributionconfig.html#cfn-cloudfront-streamingdistribution-streamingdistributionconfig-aliases","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-streamingdistributionconfig.html#cfn-cloudfront-streamingdistribution-streamingdistributionconfig-comment","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-streamingdistributionconfig.html#cfn-cloudfront-streamingdistribution-streamingdistributionconfig-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-streamingdistributionconfig.html#cfn-cloudfront-streamingdistribution-streamingdistributionconfig-logging","Required":false,"Type":"Logging","UpdateType":"Mutable"},"PriceClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-streamingdistributionconfig.html#cfn-cloudfront-streamingdistribution-streamingdistributionconfig-priceclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Origin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-streamingdistributionconfig.html#cfn-cloudfront-streamingdistribution-streamingdistributionconfig-s3origin","Required":true,"Type":"S3Origin","UpdateType":"Mutable"},"TrustedSigners":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-streamingdistributionconfig.html#cfn-cloudfront-streamingdistribution-streamingdistributionconfig-trustedsigners","Required":true,"Type":"TrustedSigners","UpdateType":"Mutable"}}},"AWS::CloudFront::StreamingDistribution.TrustedSigners":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-trustedsigners.html","Properties":{"AwsAccountNumbers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-trustedsigners.html#cfn-cloudfront-streamingdistribution-trustedsigners-awsaccountnumbers","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-streamingdistribution-trustedsigners.html#cfn-cloudfront-streamingdistribution-trustedsigners-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudTrail::Channel.Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-channel-destination.html","Properties":{"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-channel-destination.html#cfn-cloudtrail-channel-destination-location","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-channel-destination.html#cfn-cloudtrail-channel-destination-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudTrail::EventDataStore.AdvancedEventSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedeventselector.html","Properties":{"FieldSelectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedeventselector.html#cfn-cloudtrail-eventdatastore-advancedeventselector-fieldselectors","DuplicatesAllowed":false,"ItemType":"AdvancedFieldSelector","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedeventselector.html#cfn-cloudtrail-eventdatastore-advancedeventselector-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudTrail::EventDataStore.AdvancedFieldSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedfieldselector.html","Properties":{"EndsWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedfieldselector.html#cfn-cloudtrail-eventdatastore-advancedfieldselector-endswith","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Equals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedfieldselector.html#cfn-cloudtrail-eventdatastore-advancedfieldselector-equals","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedfieldselector.html#cfn-cloudtrail-eventdatastore-advancedfieldselector-field","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NotEndsWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedfieldselector.html#cfn-cloudtrail-eventdatastore-advancedfieldselector-notendswith","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"NotEquals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedfieldselector.html#cfn-cloudtrail-eventdatastore-advancedfieldselector-notequals","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"NotStartsWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedfieldselector.html#cfn-cloudtrail-eventdatastore-advancedfieldselector-notstartswith","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"StartsWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-eventdatastore-advancedfieldselector.html#cfn-cloudtrail-eventdatastore-advancedfieldselector-startswith","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudTrail::Trail.AdvancedEventSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedeventselector.html","Properties":{"FieldSelectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedeventselector.html#cfn-cloudtrail-trail-advancedeventselector-fieldselectors","DuplicatesAllowed":false,"ItemType":"AdvancedFieldSelector","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedeventselector.html#cfn-cloudtrail-trail-advancedeventselector-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudTrail::Trail.AdvancedFieldSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedfieldselector.html","Properties":{"EndsWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedfieldselector.html#cfn-cloudtrail-trail-advancedfieldselector-endswith","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Equals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedfieldselector.html#cfn-cloudtrail-trail-advancedfieldselector-equals","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedfieldselector.html#cfn-cloudtrail-trail-advancedfieldselector-field","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NotEndsWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedfieldselector.html#cfn-cloudtrail-trail-advancedfieldselector-notendswith","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"NotEquals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedfieldselector.html#cfn-cloudtrail-trail-advancedfieldselector-notequals","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"NotStartsWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedfieldselector.html#cfn-cloudtrail-trail-advancedfieldselector-notstartswith","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"StartsWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-advancedfieldselector.html#cfn-cloudtrail-trail-advancedfieldselector-startswith","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudTrail::Trail.DataResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-dataresource.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-dataresource.html#cfn-cloudtrail-trail-dataresource-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-dataresource.html#cfn-cloudtrail-trail-dataresource-values","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudTrail::Trail.EventSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-eventselector.html","Properties":{"DataResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-eventselector.html#cfn-cloudtrail-trail-eventselector-dataresources","DuplicatesAllowed":false,"ItemType":"DataResource","Required":false,"Type":"List","UpdateType":"Mutable"},"ExcludeManagementEventSources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-eventselector.html#cfn-cloudtrail-trail-eventselector-excludemanagementeventsources","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludeManagementEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-eventselector.html#cfn-cloudtrail-trail-eventselector-includemanagementevents","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ReadWriteType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-eventselector.html#cfn-cloudtrail-trail-eventselector-readwritetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudTrail::Trail.InsightSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-insightselector.html","Properties":{"InsightType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-insightselector.html#cfn-cloudtrail-trail-insightselector-insighttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudWatch::Alarm.Dimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cw-dimension.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cw-dimension.html#cfn-cloudwatch-alarm-dimension-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cw-dimension.html#cfn-cloudwatch-alarm-dimension-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudWatch::Alarm.Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metric.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metric.html#cfn-cloudwatch-alarm-metric-dimensions","DuplicatesAllowed":true,"ItemType":"Dimension","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metric.html#cfn-cloudwatch-alarm-metric-metricname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metric.html#cfn-cloudwatch-alarm-metric-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudWatch::Alarm.MetricDataQuery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html","Properties":{"AccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-accountid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-expression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-label","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricStat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-metricstat","Required":false,"Type":"MetricStat","UpdateType":"Mutable"},"Period":{"PrimitiveType":"Integer","UpdateType":"Mutable"},"ReturnData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-returndata","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudWatch::Alarm.MetricStat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html","Properties":{"Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-metric","Required":true,"Type":"Metric","UpdateType":"Mutable"},"Period":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-period","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Stat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-stat","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudWatch::AnomalyDetector.Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-configuration.html","Properties":{"ExcludedTimeRanges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-configuration.html#cfn-cloudwatch-anomalydetector-configuration-excludedtimeranges","ItemType":"Range","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricTimeZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-configuration.html#cfn-cloudwatch-anomalydetector-configuration-metrictimezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudWatch::AnomalyDetector.Dimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-dimension.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-dimension.html#cfn-cloudwatch-anomalydetector-dimension-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-dimension.html#cfn-cloudwatch-anomalydetector-dimension-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CloudWatch::AnomalyDetector.Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html#cfn-cloudwatch-anomalydetector-metric-dimensions","ItemType":"Dimension","Required":false,"Type":"List","UpdateType":"Immutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html#cfn-cloudwatch-anomalydetector-metric-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html#cfn-cloudwatch-anomalydetector-metric-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CloudWatch::AnomalyDetector.MetricDataQueries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataqueries.html","ItemType":"MetricDataQuery","Required":false,"Type":"List","UpdateType":"Immutable"},"AWS::CloudWatch::AnomalyDetector.MetricDataQuery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html","Properties":{"AccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-accountid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-expression","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-label","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricStat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-metricstat","Required":false,"Type":"MetricStat","UpdateType":"Immutable"},"Period":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-period","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ReturnData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-returndata","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudWatch::AnomalyDetector.MetricMathAnomalyDetector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricmathanomalydetector.html","Properties":{"MetricDataQueries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricmathanomalydetector.html#cfn-cloudwatch-anomalydetector-metricmathanomalydetector-metricdataqueries","ItemType":"MetricDataQuery","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::CloudWatch::AnomalyDetector.MetricStat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html","Properties":{"Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-metric","Required":true,"Type":"Metric","UpdateType":"Immutable"},"Period":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-period","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"Stat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-stat","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-unit","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CloudWatch::AnomalyDetector.Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-range.html","Properties":{"EndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-range.html#cfn-cloudwatch-anomalydetector-range-endtime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-range.html#cfn-cloudwatch-anomalydetector-range-starttime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudWatch::AnomalyDetector.SingleMetricAnomalyDetector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-dimensions","ItemType":"Dimension","Required":false,"Type":"List","UpdateType":"Immutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-metricname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Stat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-stat","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CloudWatch::InsightRule.Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-insightrule-tags.html","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"AWS::CloudWatch::MetricStream.MetricStreamFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamfilter.html","Properties":{"MetricNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamfilter.html#cfn-cloudwatch-metricstream-metricstreamfilter-metricnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamfilter.html#cfn-cloudwatch-metricstream-metricstreamfilter-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudWatch::MetricStream.MetricStreamStatisticsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsconfiguration.html","Properties":{"AdditionalStatistics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsconfiguration.html#cfn-cloudwatch-metricstream-metricstreamstatisticsconfiguration-additionalstatistics","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"IncludeMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsconfiguration.html#cfn-cloudwatch-metricstream-metricstreamstatisticsconfiguration-includemetrics","DuplicatesAllowed":false,"ItemType":"MetricStreamStatisticsMetric","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudWatch::MetricStream.MetricStreamStatisticsMetric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsmetric.html","Properties":{"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsmetric.html#cfn-cloudwatch-metricstream-metricstreamstatisticsmetric-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-metricstream-metricstreamstatisticsmetric.html#cfn-cloudwatch-metricstream-metricstreamstatisticsmetric-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.Artifacts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-artifacts.html","Properties":{"ArtifactIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-artifacts.html#cfn-codebuild-project-artifacts-artifactidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionDisabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-artifacts.html#cfn-codebuild-project-artifacts-encryptiondisabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-artifacts.html#cfn-codebuild-project-artifacts-location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-artifacts.html#cfn-codebuild-project-artifacts-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NamespaceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-artifacts.html#cfn-codebuild-project-artifacts-namespacetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OverrideArtifactName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-artifacts.html#cfn-codebuild-project-artifacts-overrideartifactname","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Packaging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-artifacts.html#cfn-codebuild-project-artifacts-packaging","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-artifacts.html#cfn-codebuild-project-artifacts-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-artifacts.html#cfn-codebuild-project-artifacts-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.BatchRestrictions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-batchrestrictions.html","Properties":{"ComputeTypesAllowed":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-batchrestrictions.html#cfn-codebuild-project-batchrestrictions-computetypesallowed","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MaximumBuildsAllowed":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-batchrestrictions.html#cfn-codebuild-project-batchrestrictions-maximumbuildsallowed","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.BuildStatusConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-buildstatusconfig.html","Properties":{"Context":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-buildstatusconfig.html#cfn-codebuild-project-buildstatusconfig-context","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-buildstatusconfig.html#cfn-codebuild-project-buildstatusconfig-targeturl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.CloudWatchLogsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-cloudwatchlogsconfig.html","Properties":{"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-cloudwatchlogsconfig.html#cfn-codebuild-project-cloudwatchlogsconfig-groupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-cloudwatchlogsconfig.html#cfn-codebuild-project-cloudwatchlogsconfig-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-cloudwatchlogsconfig.html#cfn-codebuild-project-cloudwatchlogsconfig-streamname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environment.html","Properties":{"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environment.html#cfn-codebuild-project-environment-certificate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ComputeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environment.html#cfn-codebuild-project-environment-computetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EnvironmentVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environment.html#cfn-codebuild-project-environment-environmentvariables","ItemType":"EnvironmentVariable","Required":false,"Type":"List","UpdateType":"Mutable"},"Image":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environment.html#cfn-codebuild-project-environment-image","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ImagePullCredentialsType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environment.html#cfn-codebuild-project-environment-imagepullcredentialstype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivilegedMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environment.html#cfn-codebuild-project-environment-privilegedmode","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RegistryCredential":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environment.html#cfn-codebuild-project-environment-registrycredential","Required":false,"Type":"RegistryCredential","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environment.html#cfn-codebuild-project-environment-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.EnvironmentVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environmentvariable.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environmentvariable.html#cfn-codebuild-project-environmentvariable-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environmentvariable.html#cfn-codebuild-project-environmentvariable-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-environmentvariable.html#cfn-codebuild-project-environmentvariable-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.FilterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-filtergroup.html","ItemType":"WebhookFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"AWS::CodeBuild::Project.GitSubmodulesConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-gitsubmodulesconfig.html","Properties":{"FetchSubmodules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-gitsubmodulesconfig.html#cfn-codebuild-project-gitsubmodulesconfig-fetchsubmodules","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.LogsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-logsconfig.html","Properties":{"CloudWatchLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-logsconfig.html#cfn-codebuild-project-logsconfig-cloudwatchlogs","Required":false,"Type":"CloudWatchLogsConfig","UpdateType":"Mutable"},"S3Logs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-logsconfig.html#cfn-codebuild-project-logsconfig-s3logs","Required":false,"Type":"S3LogsConfig","UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.ProjectBuildBatchConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectbuildbatchconfig.html","Properties":{"BatchReportMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectbuildbatchconfig.html#cfn-codebuild-project-projectbuildbatchconfig-batchreportmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CombineArtifacts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectbuildbatchconfig.html#cfn-codebuild-project-projectbuildbatchconfig-combineartifacts","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Restrictions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectbuildbatchconfig.html#cfn-codebuild-project-projectbuildbatchconfig-restrictions","Required":false,"Type":"BatchRestrictions","UpdateType":"Mutable"},"ServiceRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectbuildbatchconfig.html#cfn-codebuild-project-projectbuildbatchconfig-servicerole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeoutInMins":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectbuildbatchconfig.html#cfn-codebuild-project-projectbuildbatchconfig-timeoutinmins","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.ProjectCache":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectcache.html","Properties":{"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectcache.html#cfn-codebuild-project-projectcache-location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Modes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectcache.html#cfn-codebuild-project-projectcache-modes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectcache.html#cfn-codebuild-project-projectcache-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.ProjectFileSystemLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectfilesystemlocation.html","Properties":{"Identifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectfilesystemlocation.html#cfn-codebuild-project-projectfilesystemlocation-identifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectfilesystemlocation.html#cfn-codebuild-project-projectfilesystemlocation-location","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectfilesystemlocation.html#cfn-codebuild-project-projectfilesystemlocation-mountoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MountPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectfilesystemlocation.html#cfn-codebuild-project-projectfilesystemlocation-mountpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectfilesystemlocation.html#cfn-codebuild-project-projectfilesystemlocation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.ProjectSourceVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectsourceversion.html","Properties":{"SourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectsourceversion.html#cfn-codebuild-project-projectsourceversion-sourceidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectsourceversion.html#cfn-codebuild-project-projectsourceversion-sourceversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.ProjectTriggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projecttriggers.html","Properties":{"BuildType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projecttriggers.html#cfn-codebuild-project-projecttriggers-buildtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilterGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projecttriggers.html#cfn-codebuild-project-projecttriggers-filtergroups","ItemType":"FilterGroup","Required":false,"Type":"List","UpdateType":"Mutable"},"Webhook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projecttriggers.html#cfn-codebuild-project-projecttriggers-webhook","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.RegistryCredential":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-registrycredential.html","Properties":{"Credential":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-registrycredential.html#cfn-codebuild-project-registrycredential-credential","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CredentialProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-registrycredential.html#cfn-codebuild-project-registrycredential-credentialprovider","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.S3LogsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-s3logsconfig.html","Properties":{"EncryptionDisabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-s3logsconfig.html#cfn-codebuild-project-s3logsconfig-encryptiondisabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-s3logsconfig.html#cfn-codebuild-project-s3logsconfig-location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-s3logsconfig.html#cfn-codebuild-project-s3logsconfig-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html","Properties":{"Auth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-auth","Required":false,"Type":"SourceAuth","UpdateType":"Mutable"},"BuildSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-buildspec","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BuildStatusConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-buildstatusconfig","Required":false,"Type":"BuildStatusConfig","UpdateType":"Mutable"},"GitCloneDepth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-gitclonedepth","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"GitSubmodulesConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-gitsubmodulesconfig","Required":false,"Type":"GitSubmodulesConfig","UpdateType":"Mutable"},"InsecureSsl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-insecuressl","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReportBuildStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-reportbuildstatus","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-sourceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-source.html#cfn-codebuild-project-source-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.SourceAuth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-sourceauth.html","Properties":{"Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-sourceauth.html#cfn-codebuild-project-sourceauth-resource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-sourceauth.html#cfn-codebuild-project-sourceauth-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-vpcconfig.html#cfn-codebuild-project-vpcconfig-securitygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-vpcconfig.html#cfn-codebuild-project-vpcconfig-subnets","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-vpcconfig.html#cfn-codebuild-project-vpcconfig-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeBuild::Project.WebhookFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-webhookfilter.html","Properties":{"ExcludeMatchedPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-webhookfilter.html#cfn-codebuild-project-webhookfilter-excludematchedpattern","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Pattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-webhookfilter.html#cfn-codebuild-project-webhookfilter-pattern","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-webhookfilter.html#cfn-codebuild-project-webhookfilter-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeBuild::ReportGroup.ReportExportConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-reportgroup-reportexportconfig.html","Properties":{"ExportConfigType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-reportgroup-reportexportconfig.html#cfn-codebuild-reportgroup-reportexportconfig-exportconfigtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-reportgroup-reportexportconfig.html#cfn-codebuild-reportgroup-reportexportconfig-s3destination","Required":false,"Type":"S3ReportExportConfig","UpdateType":"Mutable"}}},"AWS::CodeBuild::ReportGroup.S3ReportExportConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-reportgroup-s3reportexportconfig.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-reportgroup-s3reportexportconfig.html#cfn-codebuild-reportgroup-s3reportexportconfig-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BucketOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-reportgroup-s3reportexportconfig.html#cfn-codebuild-reportgroup-s3reportexportconfig-bucketowner","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionDisabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-reportgroup-s3reportexportconfig.html#cfn-codebuild-reportgroup-s3reportexportconfig-encryptiondisabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EncryptionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-reportgroup-s3reportexportconfig.html#cfn-codebuild-reportgroup-s3reportexportconfig-encryptionkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Packaging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-reportgroup-s3reportexportconfig.html#cfn-codebuild-reportgroup-s3reportexportconfig-packaging","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-reportgroup-s3reportexportconfig.html#cfn-codebuild-reportgroup-s3reportexportconfig-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeCommit::Repository.Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-code.html","Properties":{"BranchName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-code.html#cfn-codecommit-repository-code-branchname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-code.html#cfn-codecommit-repository-code-s3","Required":true,"Type":"S3","UpdateType":"Mutable"}}},"AWS::CodeCommit::Repository.RepositoryTrigger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-repositorytrigger.html","Properties":{"Branches":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-repositorytrigger.html#cfn-codecommit-repository-repositorytrigger-branches","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CustomData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-repositorytrigger.html#cfn-codecommit-repository-repositorytrigger-customdata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-repositorytrigger.html#cfn-codecommit-repository-repositorytrigger-destinationarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Events":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-repositorytrigger.html#cfn-codecommit-repository-repositorytrigger-events","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-repositorytrigger.html#cfn-codecommit-repository-repositorytrigger-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeCommit::Repository.S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-s3.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-s3.html#cfn-codecommit-repository-s3-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-s3.html#cfn-codecommit-repository-s3-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codecommit-repository-s3.html#cfn-codecommit-repository-s3-objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentConfig.MinimumHealthyHosts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-minimumhealthyhosts.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-minimumhealthyhosts.html#cfn-codedeploy-deploymentconfig-minimumhealthyhosts-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-minimumhealthyhosts.html#cfn-codedeploy-deploymentconfig-minimumhealthyhosts-value","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::CodeDeploy::DeploymentConfig.TimeBasedCanary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-timebasedcanary.html","Properties":{"CanaryInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-timebasedcanary.html#cfn-codedeploy-deploymentconfig-timebasedcanary-canaryinterval","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"CanaryPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-timebasedcanary.html#cfn-codedeploy-deploymentconfig-timebasedcanary-canarypercentage","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::CodeDeploy::DeploymentConfig.TimeBasedLinear":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-timebasedlinear.html","Properties":{"LinearInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-timebasedlinear.html#cfn-codedeploy-deploymentconfig-timebasedlinear-linearinterval","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"LinearPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-timebasedlinear.html#cfn-codedeploy-deploymentconfig-timebasedlinear-linearpercentage","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::CodeDeploy::DeploymentConfig.TrafficRoutingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-trafficroutingconfig.html","Properties":{"TimeBasedCanary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-trafficroutingconfig.html#cfn-codedeploy-deploymentconfig-trafficroutingconfig-timebasedcanary","Required":false,"Type":"TimeBasedCanary","UpdateType":"Immutable"},"TimeBasedLinear":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-trafficroutingconfig.html#cfn-codedeploy-deploymentconfig-trafficroutingconfig-timebasedlinear","Required":false,"Type":"TimeBasedLinear","UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentconfig-trafficroutingconfig.html#cfn-codedeploy-deploymentconfig-trafficroutingconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CodeDeploy::DeploymentGroup.Alarm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-alarm.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-alarm.html#cfn-codedeploy-deploymentgroup-alarm-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.AlarmConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-alarmconfiguration.html","Properties":{"Alarms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-alarmconfiguration.html#cfn-codedeploy-deploymentgroup-alarmconfiguration-alarms","DuplicatesAllowed":false,"ItemType":"Alarm","Required":false,"Type":"List","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-alarmconfiguration.html#cfn-codedeploy-deploymentgroup-alarmconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IgnorePollAlarmFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-alarmconfiguration.html#cfn-codedeploy-deploymentgroup-alarmconfiguration-ignorepollalarmfailure","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.AutoRollbackConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-autorollbackconfiguration.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-autorollbackconfiguration.html#cfn-codedeploy-deploymentgroup-autorollbackconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Events":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-autorollbackconfiguration.html#cfn-codedeploy-deploymentgroup-autorollbackconfiguration-events","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.BlueGreenDeploymentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-bluegreendeploymentconfiguration.html","Properties":{"DeploymentReadyOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-bluegreendeploymentconfiguration.html#cfn-codedeploy-deploymentgroup-bluegreendeploymentconfiguration-deploymentreadyoption","Required":false,"Type":"DeploymentReadyOption","UpdateType":"Mutable"},"GreenFleetProvisioningOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-bluegreendeploymentconfiguration.html#cfn-codedeploy-deploymentgroup-bluegreendeploymentconfiguration-greenfleetprovisioningoption","Required":false,"Type":"GreenFleetProvisioningOption","UpdateType":"Mutable"},"TerminateBlueInstancesOnDeploymentSuccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-bluegreendeploymentconfiguration.html#cfn-codedeploy-deploymentgroup-bluegreendeploymentconfiguration-terminateblueinstancesondeploymentsuccess","Required":false,"Type":"BlueInstanceTerminationOption","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.BlueInstanceTerminationOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-blueinstanceterminationoption.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-blueinstanceterminationoption.html#cfn-codedeploy-deploymentgroup-bluegreendeploymentconfiguration-blueinstanceterminationoption-action","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TerminationWaitTimeInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-blueinstanceterminationoption.html#cfn-codedeploy-deploymentgroup-bluegreendeploymentconfiguration-blueinstanceterminationoption-terminationwaittimeinminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.Deployment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment.html#cfn-properties-codedeploy-deploymentgroup-deployment-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IgnoreApplicationStopFailures":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment.html#cfn-properties-codedeploy-deploymentgroup-deployment-ignoreapplicationstopfailures","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Revision":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment.html#cfn-properties-codedeploy-deploymentgroup-deployment-revision","Required":true,"Type":"RevisionLocation","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.DeploymentReadyOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deploymentreadyoption.html","Properties":{"ActionOnTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deploymentreadyoption.html#cfn-codedeploy-deploymentgroup-bluegreendeploymentconfiguration-deploymentreadyoption-actionontimeout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WaitTimeInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deploymentreadyoption.html#cfn-codedeploy-deploymentgroup-bluegreendeploymentconfiguration-deploymentreadyoption-waittimeinminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.DeploymentStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deploymentstyle.html","Properties":{"DeploymentOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deploymentstyle.html#cfn-codedeploy-deploymentgroup-deploymentstyle-deploymentoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeploymentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deploymentstyle.html#cfn-codedeploy-deploymentgroup-deploymentstyle-deploymenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.EC2TagFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-ec2tagfilter.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-ec2tagfilter.html#cfn-codedeploy-deploymentgroup-ec2tagfilter-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-ec2tagfilter.html#cfn-codedeploy-deploymentgroup-ec2tagfilter-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-ec2tagfilter.html#cfn-codedeploy-deploymentgroup-ec2tagfilter-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.EC2TagSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-ec2tagset.html","Properties":{"Ec2TagSetList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-ec2tagset.html#cfn-codedeploy-deploymentgroup-ec2tagset-ec2tagsetlist","DuplicatesAllowed":false,"ItemType":"EC2TagSetListObject","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.EC2TagSetListObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-ec2tagsetlistobject.html","Properties":{"Ec2TagGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-ec2tagsetlistobject.html#cfn-codedeploy-deploymentgroup-ec2tagsetlistobject-ec2taggroup","DuplicatesAllowed":false,"ItemType":"EC2TagFilter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.ECSService":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-ecsservice.html","Properties":{"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-ecsservice.html#cfn-codedeploy-deploymentgroup-ecsservice-clustername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-ecsservice.html#cfn-codedeploy-deploymentgroup-ecsservice-servicename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.ELBInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-elbinfo.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-elbinfo.html#cfn-codedeploy-deploymentgroup-elbinfo-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.GitHubLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision-githublocation.html","Properties":{"CommitId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision-githublocation.html#cfn-properties-codedeploy-deploymentgroup-deployment-revision-githublocation-commitid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Repository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision-githublocation.html#cfn-properties-codedeploy-deploymentgroup-deployment-revision-githublocation-repository","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.GreenFleetProvisioningOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-greenfleetprovisioningoption.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-greenfleetprovisioningoption.html#cfn-codedeploy-deploymentgroup-bluegreendeploymentconfiguration-greenfleetprovisioningoption-action","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.LoadBalancerInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-loadbalancerinfo.html","Properties":{"ElbInfoList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-loadbalancerinfo.html#cfn-codedeploy-deploymentgroup-loadbalancerinfo-elbinfolist","DuplicatesAllowed":false,"ItemType":"ELBInfo","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetGroupInfoList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-loadbalancerinfo.html#cfn-codedeploy-deploymentgroup-loadbalancerinfo-targetgroupinfolist","DuplicatesAllowed":false,"ItemType":"TargetGroupInfo","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetGroupPairInfoList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-loadbalancerinfo.html#cfn-codedeploy-deploymentgroup-loadbalancerinfo-targetgrouppairinfolist","DuplicatesAllowed":false,"ItemType":"TargetGroupPairInfo","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.OnPremisesTagSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-onpremisestagset.html","Properties":{"OnPremisesTagSetList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-onpremisestagset.html#cfn-codedeploy-deploymentgroup-onpremisestagset-onpremisestagsetlist","DuplicatesAllowed":false,"ItemType":"OnPremisesTagSetListObject","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.OnPremisesTagSetListObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-onpremisestagsetlistobject.html","Properties":{"OnPremisesTagGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-onpremisestagsetlistobject.html#cfn-codedeploy-deploymentgroup-onpremisestagsetlistobject-onpremisestaggroup","DuplicatesAllowed":false,"ItemType":"TagFilter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.RevisionLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision.html","Properties":{"GitHubLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision.html#cfn-properties-codedeploy-deploymentgroup-deployment-revision-githublocation","Required":false,"Type":"GitHubLocation","UpdateType":"Mutable"},"RevisionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision.html#cfn-properties-codedeploy-deploymentgroup-deployment-revision-revisiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision.html#cfn-properties-codedeploy-deploymentgroup-deployment-revision-s3location","Required":false,"Type":"S3Location","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision-s3location.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision-s3location.html#cfn-properties-codedeploy-deploymentgroup-deployment-revision-s3location-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BundleType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision-s3location.html#cfn-properties-codedeploy-deploymentgroup-deployment-revision-s3location-bundletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ETag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision-s3location.html#cfn-properties-codedeploy-deploymentgroup-deployment-revision-s3location-etag","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision-s3location.html#cfn-properties-codedeploy-deploymentgroup-deployment-revision-s3location-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-deployment-revision-s3location.html#cfn-properties-codedeploy-deploymentgroup-deployment-revision-s3location-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.TagFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-tagfilter.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-tagfilter.html#cfn-codedeploy-deploymentgroup-tagfilter-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-tagfilter.html#cfn-codedeploy-deploymentgroup-tagfilter-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-tagfilter.html#cfn-codedeploy-deploymentgroup-tagfilter-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.TargetGroupInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-targetgroupinfo.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-targetgroupinfo.html#cfn-codedeploy-deploymentgroup-targetgroupinfo-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.TargetGroupPairInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-targetgrouppairinfo.html","Properties":{"ProdTrafficRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-targetgrouppairinfo.html#cfn-codedeploy-deploymentgroup-targetgrouppairinfo-prodtrafficroute","Required":false,"Type":"TrafficRoute","UpdateType":"Mutable"},"TargetGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-targetgrouppairinfo.html#cfn-codedeploy-deploymentgroup-targetgrouppairinfo-targetgroups","DuplicatesAllowed":false,"ItemType":"TargetGroupInfo","Required":false,"Type":"List","UpdateType":"Mutable"},"TestTrafficRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-targetgrouppairinfo.html#cfn-codedeploy-deploymentgroup-targetgrouppairinfo-testtrafficroute","Required":false,"Type":"TrafficRoute","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.TrafficRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-trafficroute.html","Properties":{"ListenerArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-trafficroute.html#cfn-codedeploy-deploymentgroup-trafficroute-listenerarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentGroup.TriggerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-triggerconfig.html","Properties":{"TriggerEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-triggerconfig.html#cfn-codedeploy-deploymentgroup-triggerconfig-triggerevents","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TriggerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-triggerconfig.html#cfn-codedeploy-deploymentgroup-triggerconfig-triggername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TriggerTargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-triggerconfig.html#cfn-codedeploy-deploymentgroup-triggerconfig-triggertargetarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeGuruProfiler::ProfilingGroup.AgentPermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codeguruprofiler-profilinggroup-agentpermissions.html","Properties":{"Principals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codeguruprofiler-profilinggroup-agentpermissions.html#cfn-codeguruprofiler-profilinggroup-agentpermissions-principals","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeGuruProfiler::ProfilingGroup.Channel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codeguruprofiler-profilinggroup-channel.html","Properties":{"channelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codeguruprofiler-profilinggroup-channel.html#cfn-codeguruprofiler-profilinggroup-channel-channelid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"channelUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codeguruprofiler-profilinggroup-channel.html#cfn-codeguruprofiler-profilinggroup-channel-channeluri","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodePipeline::CustomActionType.ArtifactDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-artifactdetails.html","Properties":{"MaximumCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-artifactdetails.html#cfn-codepipeline-customactiontype-artifactdetails-maximumcount","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"MinimumCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-artifactdetails.html#cfn-codepipeline-customactiontype-artifactdetails-minimumcount","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::CodePipeline::CustomActionType.ConfigurationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-key","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Queryable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-queryable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Required":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-required","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"Secret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-secret","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CodePipeline::CustomActionType.Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-settings.html","Properties":{"EntityUrlTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-settings.html#cfn-codepipeline-customactiontype-settings-entityurltemplate","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ExecutionUrlTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-settings.html#cfn-codepipeline-customactiontype-settings-executionurltemplate","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RevisionUrlTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-settings.html#cfn-codepipeline-customactiontype-settings-revisionurltemplate","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ThirdPartyConfigurationUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-settings.html#cfn-codepipeline-customactiontype-settings-thirdpartyconfigurationurl","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CodePipeline::Pipeline.ActionDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html","Properties":{"ActionTypeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-actiontypeid","Required":true,"Type":"ActionTypeId","UpdateType":"Mutable"},"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-configuration","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"InputArtifacts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-inputartifacts","DuplicatesAllowed":false,"ItemType":"InputArtifact","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-actiondeclaration-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutputArtifacts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-outputartifacts","DuplicatesAllowed":false,"ItemType":"OutputArtifact","Required":false,"Type":"List","UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-region","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RunOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-runorder","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::CodePipeline::Pipeline.ActionTypeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-actiontypeid.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-actiontypeid.html#cfn-codepipeline-pipeline-stages-actions-actiontypeid-category","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Owner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-actiontypeid.html#cfn-codepipeline-pipeline-stages-actions-actiontypeid-owner","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Provider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-actiontypeid.html#cfn-codepipeline-pipeline-stages-actions-actiontypeid-provider","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-actiontypeid.html#cfn-codepipeline-pipeline-stages-actions-actiontypeid-version","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodePipeline::Pipeline.ArtifactStore":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore.html","Properties":{"EncryptionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore.html#cfn-codepipeline-pipeline-artifactstore-encryptionkey","Required":false,"Type":"EncryptionKey","UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore.html#cfn-codepipeline-pipeline-artifactstore-location","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore.html#cfn-codepipeline-pipeline-artifactstore-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodePipeline::Pipeline.ArtifactStoreMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstoremap.html","Properties":{"ArtifactStore":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstoremap.html#cfn-codepipeline-pipeline-artifactstoremap-artifactstore","Required":true,"Type":"ArtifactStore","UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstoremap.html#cfn-codepipeline-pipeline-artifactstoremap-region","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodePipeline::Pipeline.BlockerDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-blockers.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-blockers.html#cfn-codepipeline-pipeline-stages-blockers-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-blockers.html#cfn-codepipeline-pipeline-stages-blockers-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodePipeline::Pipeline.EncryptionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore-encryptionkey.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore-encryptionkey.html#cfn-codepipeline-pipeline-artifactstore-encryptionkey-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore-encryptionkey.html#cfn-codepipeline-pipeline-artifactstore-encryptionkey-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodePipeline::Pipeline.InputArtifact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-inputartifacts.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-inputartifacts.html#cfn-codepipeline-pipeline-stages-actions-inputartifacts-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodePipeline::Pipeline.OutputArtifact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-outputartifacts.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-outputartifacts.html#cfn-codepipeline-pipeline-stages-actions-outputartifacts-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodePipeline::Pipeline.StageDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages.html#cfn-codepipeline-pipeline-stages-actions","DuplicatesAllowed":false,"ItemType":"ActionDeclaration","Required":true,"Type":"List","UpdateType":"Mutable"},"Blockers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages.html#cfn-codepipeline-pipeline-stages-blockers","DuplicatesAllowed":false,"ItemType":"BlockerDeclaration","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages.html#cfn-codepipeline-pipeline-stages-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodePipeline::Pipeline.StageTransition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-disableinboundstagetransitions.html","Properties":{"Reason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-disableinboundstagetransitions.html#cfn-codepipeline-pipeline-disableinboundstagetransitions-reason","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-disableinboundstagetransitions.html#cfn-codepipeline-pipeline-disableinboundstagetransitions-stagename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodePipeline::Webhook.WebhookAuthConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookauthconfiguration.html","Properties":{"AllowedIPRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookauthconfiguration.html#cfn-codepipeline-webhook-webhookauthconfiguration-allowediprange","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookauthconfiguration.html#cfn-codepipeline-webhook-webhookauthconfiguration-secrettoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodePipeline::Webhook.WebhookFilterRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookfilterrule.html","Properties":{"JsonPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookfilterrule.html#cfn-codepipeline-webhook-webhookfilterrule-jsonpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MatchEquals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookfilterrule.html#cfn-codepipeline-webhook-webhookfilterrule-matchequals","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeStar::GitHubRepository.Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codestar-githubrepository-code.html","Properties":{"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codestar-githubrepository-code.html#cfn-codestar-githubrepository-code-s3","Required":true,"Type":"S3","UpdateType":"Mutable"}}},"AWS::CodeStar::GitHubRepository.S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codestar-githubrepository-s3.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codestar-githubrepository-s3.html#cfn-codestar-githubrepository-s3-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codestar-githubrepository-s3.html#cfn-codestar-githubrepository-s3-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codestar-githubrepository-s3.html#cfn-codestar-githubrepository-s3-objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeStarNotifications::NotificationRule.Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codestarnotifications-notificationrule-target.html","Properties":{"TargetAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codestarnotifications-notificationrule-target.html#cfn-codestarnotifications-notificationrule-target-targetaddress","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codestarnotifications-notificationrule-target.html#cfn-codestarnotifications-notificationrule-target-targettype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Cognito::IdentityPool.CognitoIdentityProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypool-cognitoidentityprovider.html","Properties":{"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypool-cognitoidentityprovider.html#cfn-cognito-identitypool-cognitoidentityprovider-clientid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProviderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypool-cognitoidentityprovider.html#cfn-cognito-identitypool-cognitoidentityprovider-providername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerSideTokenCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypool-cognitoidentityprovider.html#cfn-cognito-identitypool-cognitoidentityprovider-serversidetokencheck","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::IdentityPool.CognitoStreams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypool-cognitostreams.html","Properties":{"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypool-cognitostreams.html#cfn-cognito-identitypool-cognitostreams-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypool-cognitostreams.html#cfn-cognito-identitypool-cognitostreams-streamname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StreamingStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypool-cognitostreams.html#cfn-cognito-identitypool-cognitostreams-streamingstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::IdentityPool.PushSync":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypool-pushsync.html","Properties":{"ApplicationArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypool-pushsync.html#cfn-cognito-identitypool-pushsync-applicationarns","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypool-pushsync.html#cfn-cognito-identitypool-pushsync-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::IdentityPoolRoleAttachment.MappingRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-mappingrule.html","Properties":{"Claim":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-mappingrule.html#cfn-cognito-identitypoolroleattachment-mappingrule-claim","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MatchType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-mappingrule.html#cfn-cognito-identitypoolroleattachment-mappingrule-matchtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-mappingrule.html#cfn-cognito-identitypoolroleattachment-mappingrule-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-mappingrule.html#cfn-cognito-identitypoolroleattachment-mappingrule-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Cognito::IdentityPoolRoleAttachment.RoleMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-rolemapping.html","Properties":{"AmbiguousRoleResolution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-rolemapping.html#cfn-cognito-identitypoolroleattachment-rolemapping-ambiguousroleresolution","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdentityProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-rolemapping.html#cfn-cognito-identitypoolroleattachment-rolemapping-identityprovider","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RulesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-rolemapping.html#cfn-cognito-identitypoolroleattachment-rolemapping-rulesconfiguration","Required":false,"Type":"RulesConfigurationType","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-rolemapping.html#cfn-cognito-identitypoolroleattachment-rolemapping-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Cognito::IdentityPoolRoleAttachment.RulesConfigurationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-rulesconfigurationtype.html","Properties":{"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-identitypoolroleattachment-rulesconfigurationtype.html#cfn-cognito-identitypoolroleattachment-rulesconfigurationtype-rules","ItemType":"MappingRule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.AccountRecoverySetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-accountrecoverysetting.html","Properties":{"RecoveryMechanisms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-accountrecoverysetting.html#cfn-cognito-userpool-accountrecoverysetting-recoverymechanisms","ItemType":"RecoveryOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.AdminCreateUserConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-admincreateuserconfig.html","Properties":{"AllowAdminCreateUserOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-admincreateuserconfig.html#cfn-cognito-userpool-admincreateuserconfig-allowadmincreateuseronly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InviteMessageTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-admincreateuserconfig.html#cfn-cognito-userpool-admincreateuserconfig-invitemessagetemplate","Required":false,"Type":"InviteMessageTemplate","UpdateType":"Mutable"},"UnusedAccountValidityDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-admincreateuserconfig.html#cfn-cognito-userpool-admincreateuserconfig-unusedaccountvaliditydays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.CustomEmailSender":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-customemailsender.html","Properties":{"LambdaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-customemailsender.html#cfn-cognito-userpool-customemailsender-lambdaarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LambdaVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-customemailsender.html#cfn-cognito-userpool-customemailsender-lambdaversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.CustomSMSSender":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-customsmssender.html","Properties":{"LambdaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-customsmssender.html#cfn-cognito-userpool-customsmssender-lambdaarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LambdaVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-customsmssender.html#cfn-cognito-userpool-customsmssender-lambdaversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.DeviceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-deviceconfiguration.html","Properties":{"ChallengeRequiredOnNewDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-deviceconfiguration.html#cfn-cognito-userpool-deviceconfiguration-challengerequiredonnewdevice","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DeviceOnlyRememberedOnUserPrompt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-deviceconfiguration.html#cfn-cognito-userpool-deviceconfiguration-deviceonlyrememberedonuserprompt","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.EmailConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-emailconfiguration.html","Properties":{"ConfigurationSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-emailconfiguration.html#cfn-cognito-userpool-emailconfiguration-configurationset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EmailSendingAccount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-emailconfiguration.html#cfn-cognito-userpool-emailconfiguration-emailsendingaccount","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"From":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-emailconfiguration.html#cfn-cognito-userpool-emailconfiguration-from","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReplyToEmailAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-emailconfiguration.html#cfn-cognito-userpool-emailconfiguration-replytoemailaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-emailconfiguration.html#cfn-cognito-userpool-emailconfiguration-sourcearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.InviteMessageTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-invitemessagetemplate.html","Properties":{"EmailMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-invitemessagetemplate.html#cfn-cognito-userpool-invitemessagetemplate-emailmessage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EmailSubject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-invitemessagetemplate.html#cfn-cognito-userpool-invitemessagetemplate-emailsubject","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SMSMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-invitemessagetemplate.html#cfn-cognito-userpool-invitemessagetemplate-smsmessage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.LambdaConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html","Properties":{"CreateAuthChallenge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-createauthchallenge","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomEmailSender":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-customemailsender","Required":false,"Type":"CustomEmailSender","UpdateType":"Mutable"},"CustomMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-custommessage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomSMSSender":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-customsmssender","Required":false,"Type":"CustomSMSSender","UpdateType":"Mutable"},"DefineAuthChallenge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-defineauthchallenge","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KMSKeyID":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PostAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-postauthentication","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PostConfirmation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-postconfirmation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-preauthentication","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreSignUp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-presignup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreTokenGeneration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-pretokengeneration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserMigration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-usermigration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerifyAuthChallengeResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-lambdaconfig.html#cfn-cognito-userpool-lambdaconfig-verifyauthchallengeresponse","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.NumberAttributeConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-numberattributeconstraints.html","Properties":{"MaxValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-numberattributeconstraints.html#cfn-cognito-userpool-numberattributeconstraints-maxvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MinValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-numberattributeconstraints.html#cfn-cognito-userpool-numberattributeconstraints-minvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.PasswordPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-passwordpolicy.html","Properties":{"MinimumLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-passwordpolicy.html#cfn-cognito-userpool-passwordpolicy-minimumlength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RequireLowercase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-passwordpolicy.html#cfn-cognito-userpool-passwordpolicy-requirelowercase","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RequireNumbers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-passwordpolicy.html#cfn-cognito-userpool-passwordpolicy-requirenumbers","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RequireSymbols":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-passwordpolicy.html#cfn-cognito-userpool-passwordpolicy-requiresymbols","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RequireUppercase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-passwordpolicy.html#cfn-cognito-userpool-passwordpolicy-requireuppercase","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TemporaryPasswordValidityDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-passwordpolicy.html#cfn-cognito-userpool-passwordpolicy-temporarypasswordvaliditydays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.Policies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-policies.html","Properties":{"PasswordPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-policies.html#cfn-cognito-userpool-policies-passwordpolicy","Required":false,"Type":"PasswordPolicy","UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.RecoveryOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-recoveryoption.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-recoveryoption.html#cfn-cognito-userpool-recoveryoption-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-recoveryoption.html#cfn-cognito-userpool-recoveryoption-priority","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.SchemaAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-schemaattribute.html","Properties":{"AttributeDataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-schemaattribute.html#cfn-cognito-userpool-schemaattribute-attributedatatype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeveloperOnlyAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-schemaattribute.html#cfn-cognito-userpool-schemaattribute-developeronlyattribute","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Mutable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-schemaattribute.html#cfn-cognito-userpool-schemaattribute-mutable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-schemaattribute.html#cfn-cognito-userpool-schemaattribute-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumberAttributeConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-schemaattribute.html#cfn-cognito-userpool-schemaattribute-numberattributeconstraints","Required":false,"Type":"NumberAttributeConstraints","UpdateType":"Mutable"},"Required":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-schemaattribute.html#cfn-cognito-userpool-schemaattribute-required","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"StringAttributeConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-schemaattribute.html#cfn-cognito-userpool-schemaattribute-stringattributeconstraints","Required":false,"Type":"StringAttributeConstraints","UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.SmsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-smsconfiguration.html","Properties":{"ExternalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-smsconfiguration.html#cfn-cognito-userpool-smsconfiguration-externalid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnsCallerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-smsconfiguration.html#cfn-cognito-userpool-smsconfiguration-snscallerarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnsRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-smsconfiguration.html#cfn-cognito-userpool-smsconfiguration-snsregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.StringAttributeConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-stringattributeconstraints.html","Properties":{"MaxLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-stringattributeconstraints.html#cfn-cognito-userpool-stringattributeconstraints-maxlength","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MinLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-stringattributeconstraints.html#cfn-cognito-userpool-stringattributeconstraints-minlength","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.UserAttributeUpdateSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-userattributeupdatesettings.html","Properties":{"AttributesRequireVerificationBeforeUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-userattributeupdatesettings.html#cfn-cognito-userpool-userattributeupdatesettings-attributesrequireverificationbeforeupdate","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.UserPoolAddOns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-userpooladdons.html","Properties":{"AdvancedSecurityMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-userpooladdons.html#cfn-cognito-userpool-userpooladdons-advancedsecuritymode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.UsernameConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-usernameconfiguration.html","Properties":{"CaseSensitive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-usernameconfiguration.html#cfn-cognito-userpool-usernameconfiguration-casesensitive","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool.VerificationMessageTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-verificationmessagetemplate.html","Properties":{"DefaultEmailOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-verificationmessagetemplate.html#cfn-cognito-userpool-verificationmessagetemplate-defaultemailoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EmailMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-verificationmessagetemplate.html#cfn-cognito-userpool-verificationmessagetemplate-emailmessage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EmailMessageByLink":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-verificationmessagetemplate.html#cfn-cognito-userpool-verificationmessagetemplate-emailmessagebylink","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EmailSubject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-verificationmessagetemplate.html#cfn-cognito-userpool-verificationmessagetemplate-emailsubject","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EmailSubjectByLink":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-verificationmessagetemplate.html#cfn-cognito-userpool-verificationmessagetemplate-emailsubjectbylink","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SmsMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-verificationmessagetemplate.html#cfn-cognito-userpool-verificationmessagetemplate-smsmessage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolClient.AnalyticsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolclient-analyticsconfiguration.html","Properties":{"ApplicationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolclient-analyticsconfiguration.html#cfn-cognito-userpoolclient-analyticsconfiguration-applicationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolclient-analyticsconfiguration.html#cfn-cognito-userpoolclient-analyticsconfiguration-applicationid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExternalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolclient-analyticsconfiguration.html#cfn-cognito-userpoolclient-analyticsconfiguration-externalid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolclient-analyticsconfiguration.html#cfn-cognito-userpoolclient-analyticsconfiguration-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserDataShared":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolclient-analyticsconfiguration.html#cfn-cognito-userpoolclient-analyticsconfiguration-userdatashared","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolClient.TokenValidityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolclient-tokenvalidityunits.html","Properties":{"AccessToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolclient-tokenvalidityunits.html#cfn-cognito-userpoolclient-tokenvalidityunits-accesstoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolclient-tokenvalidityunits.html#cfn-cognito-userpoolclient-tokenvalidityunits-idtoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RefreshToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolclient-tokenvalidityunits.html#cfn-cognito-userpoolclient-tokenvalidityunits-refreshtoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolDomain.CustomDomainConfigType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpooldomain-customdomainconfigtype.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpooldomain-customdomainconfigtype.html#cfn-cognito-userpooldomain-customdomainconfigtype-certificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolResourceServer.ResourceServerScopeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolresourceserver-resourceserverscopetype.html","Properties":{"ScopeDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolresourceserver-resourceserverscopetype.html#cfn-cognito-userpoolresourceserver-resourceserverscopetype-scopedescription","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScopeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolresourceserver-resourceserverscopetype.html#cfn-cognito-userpoolresourceserver-resourceserverscopetype-scopename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.AccountTakeoverActionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-accounttakeoveractiontype.html","Properties":{"EventAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-accounttakeoveractiontype.html#cfn-cognito-userpoolriskconfigurationattachment-accounttakeoveractiontype-eventaction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Notify":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-accounttakeoveractiontype.html#cfn-cognito-userpoolriskconfigurationattachment-accounttakeoveractiontype-notify","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.AccountTakeoverActionsType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-accounttakeoveractionstype.html","Properties":{"HighAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-accounttakeoveractionstype.html#cfn-cognito-userpoolriskconfigurationattachment-accounttakeoveractionstype-highaction","Required":false,"Type":"AccountTakeoverActionType","UpdateType":"Mutable"},"LowAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-accounttakeoveractionstype.html#cfn-cognito-userpoolriskconfigurationattachment-accounttakeoveractionstype-lowaction","Required":false,"Type":"AccountTakeoverActionType","UpdateType":"Mutable"},"MediumAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-accounttakeoveractionstype.html#cfn-cognito-userpoolriskconfigurationattachment-accounttakeoveractionstype-mediumaction","Required":false,"Type":"AccountTakeoverActionType","UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.AccountTakeoverRiskConfigurationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-accounttakeoverriskconfigurationtype.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-accounttakeoverriskconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-accounttakeoverriskconfigurationtype-actions","Required":true,"Type":"AccountTakeoverActionsType","UpdateType":"Mutable"},"NotifyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-accounttakeoverriskconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-accounttakeoverriskconfigurationtype-notifyconfiguration","Required":false,"Type":"NotifyConfigurationType","UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.CompromisedCredentialsActionsType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-compromisedcredentialsactionstype.html","Properties":{"EventAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-compromisedcredentialsactionstype.html#cfn-cognito-userpoolriskconfigurationattachment-compromisedcredentialsactionstype-eventaction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.CompromisedCredentialsRiskConfigurationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-compromisedcredentialsriskconfigurationtype.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-compromisedcredentialsriskconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-compromisedcredentialsriskconfigurationtype-actions","Required":true,"Type":"CompromisedCredentialsActionsType","UpdateType":"Mutable"},"EventFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-compromisedcredentialsriskconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-compromisedcredentialsriskconfigurationtype-eventfilter","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.NotifyConfigurationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype.html","Properties":{"BlockEmail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype-blockemail","Required":false,"Type":"NotifyEmailType","UpdateType":"Mutable"},"From":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype-from","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MfaEmail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype-mfaemail","Required":false,"Type":"NotifyEmailType","UpdateType":"Mutable"},"NoActionEmail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype-noactionemail","Required":false,"Type":"NotifyEmailType","UpdateType":"Mutable"},"ReplyTo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype-replyto","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-notifyconfigurationtype-sourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.NotifyEmailType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-notifyemailtype.html","Properties":{"HtmlBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-notifyemailtype.html#cfn-cognito-userpoolriskconfigurationattachment-notifyemailtype-htmlbody","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Subject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-notifyemailtype.html#cfn-cognito-userpoolriskconfigurationattachment-notifyemailtype-subject","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TextBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-notifyemailtype.html#cfn-cognito-userpoolriskconfigurationattachment-notifyemailtype-textbody","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolRiskConfigurationAttachment.RiskExceptionConfigurationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-riskexceptionconfigurationtype.html","Properties":{"BlockedIPRangeList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-riskexceptionconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-riskexceptionconfigurationtype-blockediprangelist","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SkippedIPRangeList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpoolriskconfigurationattachment-riskexceptionconfigurationtype.html#cfn-cognito-userpoolriskconfigurationattachment-riskexceptionconfigurationtype-skippediprangelist","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolUser.AttributeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpooluser-attributetype.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpooluser-attributetype.html#cfn-cognito-userpooluser-attributetype-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpooluser-attributetype.html#cfn-cognito-userpooluser-attributetype-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Comprehend::DocumentClassifier.AugmentedManifestsListItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-augmentedmanifestslistitem.html","Properties":{"AttributeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-augmentedmanifestslistitem.html#cfn-comprehend-documentclassifier-augmentedmanifestslistitem-attributenames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-augmentedmanifestslistitem.html#cfn-comprehend-documentclassifier-augmentedmanifestslistitem-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Split":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-augmentedmanifestslistitem.html#cfn-comprehend-documentclassifier-augmentedmanifestslistitem-split","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Comprehend::DocumentClassifier.DocumentClassifierDocuments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierdocuments.html","Properties":{"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierdocuments.html#cfn-comprehend-documentclassifier-documentclassifierdocuments-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TestS3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierdocuments.html#cfn-comprehend-documentclassifier-documentclassifierdocuments-tests3uri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Comprehend::DocumentClassifier.DocumentClassifierInputDataConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierinputdataconfig.html","Properties":{"AugmentedManifests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierinputdataconfig.html#cfn-comprehend-documentclassifier-documentclassifierinputdataconfig-augmentedmanifests","DuplicatesAllowed":false,"ItemType":"AugmentedManifestsListItem","Required":false,"Type":"List","UpdateType":"Immutable"},"DataFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierinputdataconfig.html#cfn-comprehend-documentclassifier-documentclassifierinputdataconfig-dataformat","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DocumentReaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierinputdataconfig.html#cfn-comprehend-documentclassifier-documentclassifierinputdataconfig-documentreaderconfig","Required":false,"Type":"DocumentReaderConfig","UpdateType":"Immutable"},"DocumentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierinputdataconfig.html#cfn-comprehend-documentclassifier-documentclassifierinputdataconfig-documenttype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Documents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierinputdataconfig.html#cfn-comprehend-documentclassifier-documentclassifierinputdataconfig-documents","Required":false,"Type":"DocumentClassifierDocuments","UpdateType":"Immutable"},"LabelDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierinputdataconfig.html#cfn-comprehend-documentclassifier-documentclassifierinputdataconfig-labeldelimiter","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierinputdataconfig.html#cfn-comprehend-documentclassifier-documentclassifierinputdataconfig-s3uri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TestS3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifierinputdataconfig.html#cfn-comprehend-documentclassifier-documentclassifierinputdataconfig-tests3uri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Comprehend::DocumentClassifier.DocumentClassifierOutputDataConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifieroutputdataconfig.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifieroutputdataconfig.html#cfn-comprehend-documentclassifier-documentclassifieroutputdataconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentclassifieroutputdataconfig.html#cfn-comprehend-documentclassifier-documentclassifieroutputdataconfig-s3uri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Comprehend::DocumentClassifier.DocumentReaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentreaderconfig.html","Properties":{"DocumentReadAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentreaderconfig.html#cfn-comprehend-documentclassifier-documentreaderconfig-documentreadaction","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DocumentReadMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentreaderconfig.html#cfn-comprehend-documentclassifier-documentreaderconfig-documentreadmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FeatureTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-documentreaderconfig.html#cfn-comprehend-documentclassifier-documentreaderconfig-featuretypes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Comprehend::DocumentClassifier.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-vpcconfig.html#cfn-comprehend-documentclassifier-vpcconfig-securitygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-documentclassifier-vpcconfig.html#cfn-comprehend-documentclassifier-vpcconfig-subnets","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Comprehend::Flywheel.DataSecurityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-datasecurityconfig.html","Properties":{"DataLakeKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-datasecurityconfig.html#cfn-comprehend-flywheel-datasecurityconfig-datalakekmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-datasecurityconfig.html#cfn-comprehend-flywheel-datasecurityconfig-modelkmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VolumeKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-datasecurityconfig.html#cfn-comprehend-flywheel-datasecurityconfig-volumekmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-datasecurityconfig.html#cfn-comprehend-flywheel-datasecurityconfig-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Mutable"}}},"AWS::Comprehend::Flywheel.DocumentClassificationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-documentclassificationconfig.html","Properties":{"Labels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-documentclassificationconfig.html#cfn-comprehend-flywheel-documentclassificationconfig-labels","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-documentclassificationconfig.html#cfn-comprehend-flywheel-documentclassificationconfig-mode","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Comprehend::Flywheel.EntityRecognitionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-entityrecognitionconfig.html","Properties":{"EntityTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-entityrecognitionconfig.html#cfn-comprehend-flywheel-entityrecognitionconfig-entitytypes","DuplicatesAllowed":false,"ItemType":"EntityTypesListItem","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Comprehend::Flywheel.EntityTypesListItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-entitytypeslistitem.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-entitytypeslistitem.html#cfn-comprehend-flywheel-entitytypeslistitem-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Comprehend::Flywheel.TaskConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-taskconfig.html","Properties":{"DocumentClassificationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-taskconfig.html#cfn-comprehend-flywheel-taskconfig-documentclassificationconfig","Required":false,"Type":"DocumentClassificationConfig","UpdateType":"Immutable"},"EntityRecognitionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-taskconfig.html#cfn-comprehend-flywheel-taskconfig-entityrecognitionconfig","Required":false,"Type":"EntityRecognitionConfig","UpdateType":"Immutable"},"LanguageCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-taskconfig.html#cfn-comprehend-flywheel-taskconfig-languagecode","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Comprehend::Flywheel.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-vpcconfig.html#cfn-comprehend-flywheel-vpcconfig-securitygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-comprehend-flywheel-vpcconfig.html#cfn-comprehend-flywheel-vpcconfig-subnets","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Config::ConfigRule.CustomPolicyDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-custompolicydetails.html","Properties":{"EnableDebugLogDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-custompolicydetails.html#cfn-config-configrule-custompolicydetails-enabledebuglogdelivery","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PolicyRuntime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-custompolicydetails.html#cfn-config-configrule-custompolicydetails-policyruntime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PolicyText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-custompolicydetails.html#cfn-config-configrule-custompolicydetails-policytext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::ConfigRule.Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-scope.html","Properties":{"ComplianceResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-scope.html#cfn-config-configrule-scope-complianceresourceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ComplianceResourceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-scope.html#cfn-config-configrule-scope-complianceresourcetypes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TagKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-scope.html#cfn-config-configrule-scope-tagkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-scope.html#cfn-config-configrule-scope-tagvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::ConfigRule.Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-source.html","Properties":{"CustomPolicyDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-source.html#cfn-config-configrule-source-custompolicydetails","Required":false,"Type":"CustomPolicyDetails","UpdateType":"Mutable"},"Owner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-source.html#cfn-config-configrule-source-owner","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-source.html#cfn-config-configrule-source-sourcedetails","DuplicatesAllowed":false,"ItemType":"SourceDetail","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-source.html#cfn-config-configrule-source-sourceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::ConfigRule.SourceDetail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-source-sourcedetails.html","Properties":{"EventSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-source-sourcedetails.html#cfn-config-configrule-source-sourcedetail-eventsource","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MaximumExecutionFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-source-sourcedetails.html#cfn-config-configrule-sourcedetail-maximumexecutionfrequency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MessageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configrule-source-sourcedetails.html#cfn-config-configrule-source-sourcedetail-messagetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Config::ConfigurationAggregator.AccountAggregationSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationaggregator-accountaggregationsource.html","Properties":{"AccountIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationaggregator-accountaggregationsource.html#cfn-config-configurationaggregator-accountaggregationsource-accountids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"AllAwsRegions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationaggregator-accountaggregationsource.html#cfn-config-configurationaggregator-accountaggregationsource-allawsregions","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AwsRegions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationaggregator-accountaggregationsource.html#cfn-config-configurationaggregator-accountaggregationsource-awsregions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Config::ConfigurationAggregator.OrganizationAggregationSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationaggregator-organizationaggregationsource.html","Properties":{"AllAwsRegions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationaggregator-organizationaggregationsource.html#cfn-config-configurationaggregator-organizationaggregationsource-allawsregions","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AwsRegions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationaggregator-organizationaggregationsource.html#cfn-config-configurationaggregator-organizationaggregationsource-awsregions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationaggregator-organizationaggregationsource.html#cfn-config-configurationaggregator-organizationaggregationsource-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Config::ConfigurationRecorder.RecordingGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationrecorder-recordinggroup.html","Properties":{"AllSupported":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationrecorder-recordinggroup.html#cfn-config-configurationrecorder-recordinggroup-allsupported","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeGlobalResourceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationrecorder-recordinggroup.html#cfn-config-configurationrecorder-recordinggroup-includeglobalresourcetypes","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ResourceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-configurationrecorder-recordinggroup.html#cfn-config-configurationrecorder-recordinggroup-resourcetypes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Config::ConformancePack.ConformancePackInputParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-conformancepack-conformancepackinputparameter.html","Properties":{"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-conformancepack-conformancepackinputparameter.html#cfn-config-conformancepack-conformancepackinputparameter-parametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-conformancepack-conformancepackinputparameter.html#cfn-config-conformancepack-conformancepackinputparameter-parametervalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Config::ConformancePack.TemplateSSMDocumentDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-conformancepack-templatessmdocumentdetails.html","Properties":{"DocumentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-conformancepack-templatessmdocumentdetails.html#cfn-config-conformancepack-templatessmdocumentdetails-documentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-conformancepack-templatessmdocumentdetails.html#cfn-config-conformancepack-templatessmdocumentdetails-documentversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::DeliveryChannel.ConfigSnapshotDeliveryProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-deliverychannel-configsnapshotdeliveryproperties.html","Properties":{"DeliveryFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-deliverychannel-configsnapshotdeliveryproperties.html#cfn-config-deliverychannel-configsnapshotdeliveryproperties-deliveryfrequency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::OrganizationConfigRule.OrganizationCustomPolicyRuleMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html","Properties":{"DebugLogDeliveryAccounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata-debuglogdeliveryaccounts","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata-inputparameters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaximumExecutionFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata-maximumexecutionfrequency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OrganizationConfigRuleTriggerTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata-organizationconfigruletriggertypes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PolicyText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata-policytext","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceIdScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata-resourceidscope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceTypesScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata-resourcetypesscope","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Runtime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata-runtime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TagKeyScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata-tagkeyscope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagValueScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustompolicyrulemetadata.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata-tagvaluescope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::OrganizationConfigRule.OrganizationCustomRuleMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomrulemetadata.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomrulemetadata.html#cfn-config-organizationconfigrule-organizationcustomrulemetadata-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomrulemetadata.html#cfn-config-organizationconfigrule-organizationcustomrulemetadata-inputparameters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LambdaFunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomrulemetadata.html#cfn-config-organizationconfigrule-organizationcustomrulemetadata-lambdafunctionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MaximumExecutionFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomrulemetadata.html#cfn-config-organizationconfigrule-organizationcustomrulemetadata-maximumexecutionfrequency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OrganizationConfigRuleTriggerTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomrulemetadata.html#cfn-config-organizationconfigrule-organizationcustomrulemetadata-organizationconfigruletriggertypes","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"ResourceIdScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomrulemetadata.html#cfn-config-organizationconfigrule-organizationcustomrulemetadata-resourceidscope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceTypesScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomrulemetadata.html#cfn-config-organizationconfigrule-organizationcustomrulemetadata-resourcetypesscope","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TagKeyScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomrulemetadata.html#cfn-config-organizationconfigrule-organizationcustomrulemetadata-tagkeyscope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagValueScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomrulemetadata.html#cfn-config-organizationconfigrule-organizationcustomrulemetadata-tagvaluescope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::OrganizationConfigRule.OrganizationManagedRuleMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationmanagedrulemetadata.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationmanagedrulemetadata.html#cfn-config-organizationconfigrule-organizationmanagedrulemetadata-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationmanagedrulemetadata.html#cfn-config-organizationconfigrule-organizationmanagedrulemetadata-inputparameters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaximumExecutionFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationmanagedrulemetadata.html#cfn-config-organizationconfigrule-organizationmanagedrulemetadata-maximumexecutionfrequency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceIdScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationmanagedrulemetadata.html#cfn-config-organizationconfigrule-organizationmanagedrulemetadata-resourceidscope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceTypesScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationmanagedrulemetadata.html#cfn-config-organizationconfigrule-organizationmanagedrulemetadata-resourcetypesscope","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RuleIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationmanagedrulemetadata.html#cfn-config-organizationconfigrule-organizationmanagedrulemetadata-ruleidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TagKeyScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationmanagedrulemetadata.html#cfn-config-organizationconfigrule-organizationmanagedrulemetadata-tagkeyscope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagValueScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationmanagedrulemetadata.html#cfn-config-organizationconfigrule-organizationmanagedrulemetadata-tagvaluescope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::OrganizationConformancePack.ConformancePackInputParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconformancepack-conformancepackinputparameter.html","Properties":{"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconformancepack-conformancepackinputparameter.html#cfn-config-organizationconformancepack-conformancepackinputparameter-parametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconformancepack-conformancepackinputparameter.html#cfn-config-organizationconformancepack-conformancepackinputparameter-parametervalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Config::RemediationConfiguration.ExecutionControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-executioncontrols.html","Properties":{"SsmControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-executioncontrols.html#cfn-config-remediationconfiguration-executioncontrols-ssmcontrols","Required":false,"Type":"SsmControls","UpdateType":"Mutable"}}},"AWS::Config::RemediationConfiguration.RemediationParameterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-remediationparametervalue.html","Properties":{"ResourceValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-remediationparametervalue.html#cfn-config-remediationconfiguration-remediationparametervalue-resourcevalue","Required":false,"Type":"ResourceValue","UpdateType":"Mutable"},"StaticValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-remediationparametervalue.html#cfn-config-remediationconfiguration-remediationparametervalue-staticvalue","Required":false,"Type":"StaticValue","UpdateType":"Mutable"}}},"AWS::Config::RemediationConfiguration.ResourceValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-resourcevalue.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-resourcevalue.html#cfn-config-remediationconfiguration-resourcevalue-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::RemediationConfiguration.SsmControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-ssmcontrols.html","Properties":{"ConcurrentExecutionRatePercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-ssmcontrols.html#cfn-config-remediationconfiguration-ssmcontrols-concurrentexecutionratepercentage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ErrorPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-ssmcontrols.html#cfn-config-remediationconfiguration-ssmcontrols-errorpercentage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::RemediationConfiguration.StaticValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-staticvalue.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-remediationconfiguration-staticvalue.html#cfn-config-remediationconfiguration-staticvalue-values","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormBaseItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformbaseitem.html","Properties":{"Section":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformbaseitem.html#cfn-connect-evaluationform-evaluationformbaseitem-section","Required":true,"Type":"EvaluationFormSection","UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformitem.html","Properties":{"Question":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformitem.html#cfn-connect-evaluationform-evaluationformitem-question","Required":false,"Type":"EvaluationFormQuestion","UpdateType":"Mutable"},"Section":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformitem.html#cfn-connect-evaluationform-evaluationformitem-section","Required":false,"Type":"EvaluationFormSection","UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormNumericQuestionAutomation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionautomation.html","Properties":{"PropertyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionautomation.html#cfn-connect-evaluationform-evaluationformnumericquestionautomation-propertyvalue","Required":true,"Type":"NumericQuestionPropertyValueAutomation","UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormNumericQuestionOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionoption.html","Properties":{"AutomaticFail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionoption.html#cfn-connect-evaluationform-evaluationformnumericquestionoption-automaticfail","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionoption.html#cfn-connect-evaluationform-evaluationformnumericquestionoption-maxvalue","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MinValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionoption.html#cfn-connect-evaluationform-evaluationformnumericquestionoption-minvalue","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Score":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionoption.html#cfn-connect-evaluationform-evaluationformnumericquestionoption-score","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormNumericQuestionProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionproperties.html","Properties":{"Automation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionproperties.html#cfn-connect-evaluationform-evaluationformnumericquestionproperties-automation","Required":false,"Type":"EvaluationFormNumericQuestionAutomation","UpdateType":"Mutable"},"MaxValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionproperties.html#cfn-connect-evaluationform-evaluationformnumericquestionproperties-maxvalue","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MinValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionproperties.html#cfn-connect-evaluationform-evaluationformnumericquestionproperties-minvalue","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformnumericquestionproperties.html#cfn-connect-evaluationform-evaluationformnumericquestionproperties-options","DuplicatesAllowed":true,"ItemType":"EvaluationFormNumericQuestionOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormQuestion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformquestion.html","Properties":{"Instructions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformquestion.html#cfn-connect-evaluationform-evaluationformquestion-instructions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NotApplicableEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformquestion.html#cfn-connect-evaluationform-evaluationformquestion-notapplicableenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"QuestionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformquestion.html#cfn-connect-evaluationform-evaluationformquestion-questiontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"QuestionTypeProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformquestion.html#cfn-connect-evaluationform-evaluationformquestion-questiontypeproperties","Required":false,"Type":"EvaluationFormQuestionTypeProperties","UpdateType":"Mutable"},"RefId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformquestion.html#cfn-connect-evaluationform-evaluationformquestion-refid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformquestion.html#cfn-connect-evaluationform-evaluationformquestion-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformquestion.html#cfn-connect-evaluationform-evaluationformquestion-weight","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormQuestionTypeProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformquestiontypeproperties.html","Properties":{"Numeric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformquestiontypeproperties.html#cfn-connect-evaluationform-evaluationformquestiontypeproperties-numeric","Required":false,"Type":"EvaluationFormNumericQuestionProperties","UpdateType":"Mutable"},"SingleSelect":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformquestiontypeproperties.html#cfn-connect-evaluationform-evaluationformquestiontypeproperties-singleselect","Required":false,"Type":"EvaluationFormSingleSelectQuestionProperties","UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormSection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsection.html","Properties":{"Instructions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsection.html#cfn-connect-evaluationform-evaluationformsection-instructions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsection.html#cfn-connect-evaluationform-evaluationformsection-items","DuplicatesAllowed":true,"ItemType":"EvaluationFormItem","Required":false,"Type":"List","UpdateType":"Mutable"},"RefId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsection.html#cfn-connect-evaluationform-evaluationformsection-refid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsection.html#cfn-connect-evaluationform-evaluationformsection-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsection.html#cfn-connect-evaluationform-evaluationformsection-weight","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionAutomation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionautomation.html","Properties":{"DefaultOptionRefId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionautomation.html#cfn-connect-evaluationform-evaluationformsingleselectquestionautomation-defaultoptionrefid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionautomation.html#cfn-connect-evaluationform-evaluationformsingleselectquestionautomation-options","DuplicatesAllowed":true,"ItemType":"EvaluationFormSingleSelectQuestionAutomationOption","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionAutomationOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionautomationoption.html","Properties":{"RuleCategory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionautomationoption.html#cfn-connect-evaluationform-evaluationformsingleselectquestionautomationoption-rulecategory","Required":true,"Type":"SingleSelectQuestionRuleCategoryAutomation","UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionoption.html","Properties":{"AutomaticFail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionoption.html#cfn-connect-evaluationform-evaluationformsingleselectquestionoption-automaticfail","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RefId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionoption.html#cfn-connect-evaluationform-evaluationformsingleselectquestionoption-refid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Score":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionoption.html#cfn-connect-evaluationform-evaluationformsingleselectquestionoption-score","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Text":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionoption.html#cfn-connect-evaluationform-evaluationformsingleselectquestionoption-text","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.EvaluationFormSingleSelectQuestionProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionproperties.html","Properties":{"Automation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionproperties.html#cfn-connect-evaluationform-evaluationformsingleselectquestionproperties-automation","Required":false,"Type":"EvaluationFormSingleSelectQuestionAutomation","UpdateType":"Mutable"},"DisplayAs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionproperties.html#cfn-connect-evaluationform-evaluationformsingleselectquestionproperties-displayas","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-evaluationformsingleselectquestionproperties.html#cfn-connect-evaluationform-evaluationformsingleselectquestionproperties-options","DuplicatesAllowed":true,"ItemType":"EvaluationFormSingleSelectQuestionOption","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.NumericQuestionPropertyValueAutomation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-numericquestionpropertyvalueautomation.html","Properties":{"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-numericquestionpropertyvalueautomation.html#cfn-connect-evaluationform-numericquestionpropertyvalueautomation-label","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.ScoringStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-scoringstrategy.html","Properties":{"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-scoringstrategy.html#cfn-connect-evaluationform-scoringstrategy-mode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-scoringstrategy.html#cfn-connect-evaluationform-scoringstrategy-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm.SingleSelectQuestionRuleCategoryAutomation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-singleselectquestionrulecategoryautomation.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-singleselectquestionrulecategoryautomation.html#cfn-connect-evaluationform-singleselectquestionrulecategoryautomation-category","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-singleselectquestionrulecategoryautomation.html#cfn-connect-evaluationform-singleselectquestionrulecategoryautomation-condition","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OptionRefId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-evaluationform-singleselectquestionrulecategoryautomation.html#cfn-connect-evaluationform-singleselectquestionrulecategoryautomation-optionrefid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::HoursOfOperation.HoursOfOperationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationconfig.html","Properties":{"Day":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationconfig.html#cfn-connect-hoursofoperation-hoursofoperationconfig-day","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationconfig.html#cfn-connect-hoursofoperation-hoursofoperationconfig-endtime","Required":true,"Type":"HoursOfOperationTimeSlice","UpdateType":"Mutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationconfig.html#cfn-connect-hoursofoperation-hoursofoperationconfig-starttime","Required":true,"Type":"HoursOfOperationTimeSlice","UpdateType":"Mutable"}}},"AWS::Connect::HoursOfOperation.HoursOfOperationTimeSlice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationtimeslice.html","Properties":{"Hours":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationtimeslice.html#cfn-connect-hoursofoperation-hoursofoperationtimeslice-hours","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Minutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationtimeslice.html#cfn-connect-hoursofoperation-hoursofoperationtimeslice-minutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::Instance.Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instance-attributes.html","Properties":{"AutoResolveBestVoices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instance-attributes.html#cfn-connect-instance-attributes-autoresolvebestvoices","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ContactLens":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instance-attributes.html#cfn-connect-instance-attributes-contactlens","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ContactflowLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instance-attributes.html#cfn-connect-instance-attributes-contactflowlogs","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EarlyMedia":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instance-attributes.html#cfn-connect-instance-attributes-earlymedia","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InboundCalls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instance-attributes.html#cfn-connect-instance-attributes-inboundcalls","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"OutboundCalls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instance-attributes.html#cfn-connect-instance-attributes-outboundcalls","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"UseCustomTTSVoices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instance-attributes.html#cfn-connect-instance-attributes-usecustomttsvoices","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Connect::InstanceStorageConfig.EncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-encryptionconfig.html","Properties":{"EncryptionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-encryptionconfig.html#cfn-connect-instancestorageconfig-encryptionconfig-encryptiontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-encryptionconfig.html#cfn-connect-instancestorageconfig-encryptionconfig-keyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::InstanceStorageConfig.KinesisFirehoseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-kinesisfirehoseconfig.html","Properties":{"FirehoseArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-kinesisfirehoseconfig.html#cfn-connect-instancestorageconfig-kinesisfirehoseconfig-firehosearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::InstanceStorageConfig.KinesisStreamConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-kinesisstreamconfig.html","Properties":{"StreamArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-kinesisstreamconfig.html#cfn-connect-instancestorageconfig-kinesisstreamconfig-streamarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::InstanceStorageConfig.KinesisVideoStreamConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-kinesisvideostreamconfig.html","Properties":{"EncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-kinesisvideostreamconfig.html#cfn-connect-instancestorageconfig-kinesisvideostreamconfig-encryptionconfig","Required":false,"Type":"EncryptionConfig","UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-kinesisvideostreamconfig.html#cfn-connect-instancestorageconfig-kinesisvideostreamconfig-prefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RetentionPeriodHours":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-kinesisvideostreamconfig.html#cfn-connect-instancestorageconfig-kinesisvideostreamconfig-retentionperiodhours","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::InstanceStorageConfig.S3Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-s3config.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-s3config.html#cfn-connect-instancestorageconfig-s3config-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-s3config.html#cfn-connect-instancestorageconfig-s3config-bucketprefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-instancestorageconfig-s3config.html#cfn-connect-instancestorageconfig-s3config-encryptionconfig","Required":false,"Type":"EncryptionConfig","UpdateType":"Mutable"}}},"AWS::Connect::QuickConnect.PhoneNumberQuickConnectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-phonenumberquickconnectconfig.html","Properties":{"PhoneNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-phonenumberquickconnectconfig.html#cfn-connect-quickconnect-phonenumberquickconnectconfig-phonenumber","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::QuickConnect.QueueQuickConnectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-queuequickconnectconfig.html","Properties":{"ContactFlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-queuequickconnectconfig.html#cfn-connect-quickconnect-queuequickconnectconfig-contactflowarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"QueueArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-queuequickconnectconfig.html#cfn-connect-quickconnect-queuequickconnectconfig-queuearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::QuickConnect.QuickConnectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-quickconnectconfig.html","Properties":{"PhoneConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-quickconnectconfig.html#cfn-connect-quickconnect-quickconnectconfig-phoneconfig","Required":false,"Type":"PhoneNumberQuickConnectConfig","UpdateType":"Mutable"},"QueueConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-quickconnectconfig.html#cfn-connect-quickconnect-quickconnectconfig-queueconfig","Required":false,"Type":"QueueQuickConnectConfig","UpdateType":"Mutable"},"QuickConnectType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-quickconnectconfig.html#cfn-connect-quickconnect-quickconnectconfig-quickconnecttype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UserConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-quickconnectconfig.html#cfn-connect-quickconnect-quickconnectconfig-userconfig","Required":false,"Type":"UserQuickConnectConfig","UpdateType":"Mutable"}}},"AWS::Connect::QuickConnect.UserQuickConnectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-userquickconnectconfig.html","Properties":{"ContactFlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-userquickconnectconfig.html#cfn-connect-quickconnect-userquickconnectconfig-contactflowarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UserArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-quickconnect-userquickconnectconfig.html#cfn-connect-quickconnect-userquickconnectconfig-userarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::Rule.Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-actions.html","Properties":{"AssignContactCategoryActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-actions.html#cfn-connect-rule-actions-assigncontactcategoryactions","DuplicatesAllowed":false,"PrimitiveItemType":"Json","Required":false,"Type":"List","UpdateType":"Mutable"},"EventBridgeActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-actions.html#cfn-connect-rule-actions-eventbridgeactions","DuplicatesAllowed":false,"ItemType":"EventBridgeAction","Required":false,"Type":"List","UpdateType":"Mutable"},"SendNotificationActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-actions.html#cfn-connect-rule-actions-sendnotificationactions","DuplicatesAllowed":false,"ItemType":"SendNotificationAction","Required":false,"Type":"List","UpdateType":"Mutable"},"TaskActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-actions.html#cfn-connect-rule-actions-taskactions","DuplicatesAllowed":false,"ItemType":"TaskAction","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Connect::Rule.EventBridgeAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-eventbridgeaction.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-eventbridgeaction.html#cfn-connect-rule-eventbridgeaction-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::Rule.NotificationRecipientType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-notificationrecipienttype.html","Properties":{"UserArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-notificationrecipienttype.html#cfn-connect-rule-notificationrecipienttype-userarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"UserTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-notificationrecipienttype.html#cfn-connect-rule-notificationrecipienttype-usertags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::Connect::Rule.Reference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-reference.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-reference.html#cfn-connect-rule-reference-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-reference.html#cfn-connect-rule-reference-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::Rule.RuleTriggerEventSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-ruletriggereventsource.html","Properties":{"EventSourceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-ruletriggereventsource.html#cfn-connect-rule-ruletriggereventsource-eventsourcename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IntegrationAssociationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-ruletriggereventsource.html#cfn-connect-rule-ruletriggereventsource-integrationassociationarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Connect::Rule.SendNotificationAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-sendnotificationaction.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-sendnotificationaction.html#cfn-connect-rule-sendnotificationaction-content","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-sendnotificationaction.html#cfn-connect-rule-sendnotificationaction-contenttype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DeliveryMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-sendnotificationaction.html#cfn-connect-rule-sendnotificationaction-deliverymethod","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Recipient":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-sendnotificationaction.html#cfn-connect-rule-sendnotificationaction-recipient","Required":true,"Type":"NotificationRecipientType","UpdateType":"Mutable"},"Subject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-sendnotificationaction.html#cfn-connect-rule-sendnotificationaction-subject","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Connect::Rule.TaskAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-taskaction.html","Properties":{"ContactFlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-taskaction.html#cfn-connect-rule-taskaction-contactflowarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-taskaction.html#cfn-connect-rule-taskaction-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-taskaction.html#cfn-connect-rule-taskaction-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"References":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-rule-taskaction.html#cfn-connect-rule-taskaction-references","ItemType":"Reference","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::Connect::TaskTemplate.Constraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-constraints.html","Properties":{"InvisibleFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-constraints.html#cfn-connect-tasktemplate-constraints-invisiblefields","DuplicatesAllowed":true,"ItemType":"InvisibleFieldInfo","Required":false,"Type":"List","UpdateType":"Mutable"},"ReadOnlyFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-constraints.html#cfn-connect-tasktemplate-constraints-readonlyfields","DuplicatesAllowed":true,"ItemType":"ReadOnlyFieldInfo","Required":false,"Type":"List","UpdateType":"Mutable"},"RequiredFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-constraints.html#cfn-connect-tasktemplate-constraints-requiredfields","DuplicatesAllowed":true,"ItemType":"RequiredFieldInfo","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Connect::TaskTemplate.DefaultFieldValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-defaultfieldvalue.html","Properties":{"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-defaultfieldvalue.html#cfn-connect-tasktemplate-defaultfieldvalue-defaultvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-defaultfieldvalue.html#cfn-connect-tasktemplate-defaultfieldvalue-id","Required":true,"Type":"FieldIdentifier","UpdateType":"Mutable"}}},"AWS::Connect::TaskTemplate.Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-field.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-field.html#cfn-connect-tasktemplate-field-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-field.html#cfn-connect-tasktemplate-field-id","Required":true,"Type":"FieldIdentifier","UpdateType":"Mutable"},"SingleSelectOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-field.html#cfn-connect-tasktemplate-field-singleselectoptions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-field.html#cfn-connect-tasktemplate-field-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::TaskTemplate.FieldIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-fieldidentifier.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-fieldidentifier.html#cfn-connect-tasktemplate-fieldidentifier-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::TaskTemplate.InvisibleFieldInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-invisiblefieldinfo.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-invisiblefieldinfo.html#cfn-connect-tasktemplate-invisiblefieldinfo-id","Required":true,"Type":"FieldIdentifier","UpdateType":"Mutable"}}},"AWS::Connect::TaskTemplate.ReadOnlyFieldInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-readonlyfieldinfo.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-readonlyfieldinfo.html#cfn-connect-tasktemplate-readonlyfieldinfo-id","Required":true,"Type":"FieldIdentifier","UpdateType":"Mutable"}}},"AWS::Connect::TaskTemplate.RequiredFieldInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-requiredfieldinfo.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-tasktemplate-requiredfieldinfo.html#cfn-connect-tasktemplate-requiredfieldinfo-id","Required":true,"Type":"FieldIdentifier","UpdateType":"Mutable"}}},"AWS::Connect::User.UserIdentityInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-useridentityinfo.html","Properties":{"Email":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-useridentityinfo.html#cfn-connect-user-useridentityinfo-email","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FirstName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-useridentityinfo.html#cfn-connect-user-useridentityinfo-firstname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LastName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-useridentityinfo.html#cfn-connect-user-useridentityinfo-lastname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Mobile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-useridentityinfo.html#cfn-connect-user-useridentityinfo-mobile","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecondaryEmail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-useridentityinfo.html#cfn-connect-user-useridentityinfo-secondaryemail","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Connect::User.UserPhoneConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-userphoneconfig.html","Properties":{"AfterContactWorkTimeLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-userphoneconfig.html#cfn-connect-user-userphoneconfig-aftercontactworktimelimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AutoAccept":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-userphoneconfig.html#cfn-connect-user-userphoneconfig-autoaccept","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DeskPhoneNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-userphoneconfig.html#cfn-connect-user-userphoneconfig-deskphonenumber","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PhoneType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-userphoneconfig.html#cfn-connect-user-userphoneconfig-phonetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ConnectCampaigns::Campaign.AnswerMachineDetectionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-answermachinedetectionconfig.html","Properties":{"EnableAnswerMachineDetection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-answermachinedetectionconfig.html#cfn-connectcampaigns-campaign-answermachinedetectionconfig-enableanswermachinedetection","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::ConnectCampaigns::Campaign.DialerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-dialerconfig.html","Properties":{"PredictiveDialerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-dialerconfig.html#cfn-connectcampaigns-campaign-dialerconfig-predictivedialerconfig","Required":false,"Type":"PredictiveDialerConfig","UpdateType":"Mutable"},"ProgressiveDialerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-dialerconfig.html#cfn-connectcampaigns-campaign-dialerconfig-progressivedialerconfig","Required":false,"Type":"ProgressiveDialerConfig","UpdateType":"Mutable"}}},"AWS::ConnectCampaigns::Campaign.OutboundCallConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-outboundcallconfig.html","Properties":{"AnswerMachineDetectionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-outboundcallconfig.html#cfn-connectcampaigns-campaign-outboundcallconfig-answermachinedetectionconfig","Required":false,"Type":"AnswerMachineDetectionConfig","UpdateType":"Mutable"},"ConnectContactFlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-outboundcallconfig.html#cfn-connectcampaigns-campaign-outboundcallconfig-connectcontactflowarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConnectQueueArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-outboundcallconfig.html#cfn-connectcampaigns-campaign-outboundcallconfig-connectqueuearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConnectSourcePhoneNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-outboundcallconfig.html#cfn-connectcampaigns-campaign-outboundcallconfig-connectsourcephonenumber","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ConnectCampaigns::Campaign.PredictiveDialerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-predictivedialerconfig.html","Properties":{"BandwidthAllocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-predictivedialerconfig.html#cfn-connectcampaigns-campaign-predictivedialerconfig-bandwidthallocation","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::ConnectCampaigns::Campaign.ProgressiveDialerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-progressivedialerconfig.html","Properties":{"BandwidthAllocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connectcampaigns-campaign-progressivedialerconfig.html#cfn-connectcampaigns-campaign-progressivedialerconfig-bandwidthallocation","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::CalculatedAttributeDefinition.AttributeDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-attributedetails.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-attributedetails.html#cfn-customerprofiles-calculatedattributedefinition-attributedetails-attributes","DuplicatesAllowed":false,"ItemType":"AttributeItem","Required":true,"Type":"List","UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-attributedetails.html#cfn-customerprofiles-calculatedattributedefinition-attributedetails-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::CalculatedAttributeDefinition.AttributeItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-attributeitem.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-attributeitem.html#cfn-customerprofiles-calculatedattributedefinition-attributeitem-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::CalculatedAttributeDefinition.Conditions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-conditions.html","Properties":{"ObjectCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-conditions.html#cfn-customerprofiles-calculatedattributedefinition-conditions-objectcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-conditions.html#cfn-customerprofiles-calculatedattributedefinition-conditions-range","Required":false,"Type":"Range","UpdateType":"Mutable"},"Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-conditions.html#cfn-customerprofiles-calculatedattributedefinition-conditions-threshold","Required":false,"Type":"Threshold","UpdateType":"Mutable"}}},"AWS::CustomerProfiles::CalculatedAttributeDefinition.Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-range.html","Properties":{"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-range.html#cfn-customerprofiles-calculatedattributedefinition-range-unit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-range.html#cfn-customerprofiles-calculatedattributedefinition-range-value","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::CalculatedAttributeDefinition.Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-threshold.html","Properties":{"Operator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-threshold.html#cfn-customerprofiles-calculatedattributedefinition-threshold-operator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-calculatedattributedefinition-threshold.html#cfn-customerprofiles-calculatedattributedefinition-threshold-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::EventStream.DestinationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-eventstream-destinationdetails.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-eventstream-destinationdetails.html#cfn-customerprofiles-eventstream-destinationdetails-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-eventstream-destinationdetails.html#cfn-customerprofiles-eventstream-destinationdetails-uri","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.ConnectorOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-connectoroperator.html","Properties":{"Marketo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-connectoroperator.html#cfn-customerprofiles-integration-connectoroperator-marketo","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-connectoroperator.html#cfn-customerprofiles-integration-connectoroperator-s3","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Salesforce":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-connectoroperator.html#cfn-customerprofiles-integration-connectoroperator-salesforce","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServiceNow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-connectoroperator.html#cfn-customerprofiles-integration-connectoroperator-servicenow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Zendesk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-connectoroperator.html#cfn-customerprofiles-integration-connectoroperator-zendesk","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.FlowDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-flowdefinition.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-flowdefinition.html#cfn-customerprofiles-integration-flowdefinition-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FlowName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-flowdefinition.html#cfn-customerprofiles-integration-flowdefinition-flowname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KmsArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-flowdefinition.html#cfn-customerprofiles-integration-flowdefinition-kmsarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFlowConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-flowdefinition.html#cfn-customerprofiles-integration-flowdefinition-sourceflowconfig","Required":true,"Type":"SourceFlowConfig","UpdateType":"Mutable"},"Tasks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-flowdefinition.html#cfn-customerprofiles-integration-flowdefinition-tasks","DuplicatesAllowed":true,"ItemType":"Task","Required":true,"Type":"List","UpdateType":"Mutable"},"TriggerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-flowdefinition.html#cfn-customerprofiles-integration-flowdefinition-triggerconfig","Required":true,"Type":"TriggerConfig","UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.IncrementalPullConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-incrementalpullconfig.html","Properties":{"DatetimeTypeFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-incrementalpullconfig.html#cfn-customerprofiles-integration-incrementalpullconfig-datetimetypefieldname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.MarketoSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-marketosourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-marketosourceproperties.html#cfn-customerprofiles-integration-marketosourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.ObjectTypeMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-objecttypemapping.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-objecttypemapping.html#cfn-customerprofiles-integration-objecttypemapping-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-objecttypemapping.html#cfn-customerprofiles-integration-objecttypemapping-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.S3SourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-s3sourceproperties.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-s3sourceproperties.html#cfn-customerprofiles-integration-s3sourceproperties-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-s3sourceproperties.html#cfn-customerprofiles-integration-s3sourceproperties-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.SalesforceSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-salesforcesourceproperties.html","Properties":{"EnableDynamicFieldUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-salesforcesourceproperties.html#cfn-customerprofiles-integration-salesforcesourceproperties-enabledynamicfieldupdate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeDeletedRecords":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-salesforcesourceproperties.html#cfn-customerprofiles-integration-salesforcesourceproperties-includedeletedrecords","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-salesforcesourceproperties.html#cfn-customerprofiles-integration-salesforcesourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.ScheduledTriggerProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-scheduledtriggerproperties.html","Properties":{"DataPullMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-scheduledtriggerproperties.html#cfn-customerprofiles-integration-scheduledtriggerproperties-datapullmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FirstExecutionFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-scheduledtriggerproperties.html#cfn-customerprofiles-integration-scheduledtriggerproperties-firstexecutionfrom","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ScheduleEndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-scheduledtriggerproperties.html#cfn-customerprofiles-integration-scheduledtriggerproperties-scheduleendtime","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-scheduledtriggerproperties.html#cfn-customerprofiles-integration-scheduledtriggerproperties-scheduleexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScheduleOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-scheduledtriggerproperties.html#cfn-customerprofiles-integration-scheduledtriggerproperties-scheduleoffset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ScheduleStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-scheduledtriggerproperties.html#cfn-customerprofiles-integration-scheduledtriggerproperties-schedulestarttime","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Timezone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-scheduledtriggerproperties.html#cfn-customerprofiles-integration-scheduledtriggerproperties-timezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.ServiceNowSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-servicenowsourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-servicenowsourceproperties.html#cfn-customerprofiles-integration-servicenowsourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.SourceConnectorProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-sourceconnectorproperties.html","Properties":{"Marketo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-sourceconnectorproperties.html#cfn-customerprofiles-integration-sourceconnectorproperties-marketo","Required":false,"Type":"MarketoSourceProperties","UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-sourceconnectorproperties.html#cfn-customerprofiles-integration-sourceconnectorproperties-s3","Required":false,"Type":"S3SourceProperties","UpdateType":"Mutable"},"Salesforce":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-sourceconnectorproperties.html#cfn-customerprofiles-integration-sourceconnectorproperties-salesforce","Required":false,"Type":"SalesforceSourceProperties","UpdateType":"Mutable"},"ServiceNow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-sourceconnectorproperties.html#cfn-customerprofiles-integration-sourceconnectorproperties-servicenow","Required":false,"Type":"ServiceNowSourceProperties","UpdateType":"Mutable"},"Zendesk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-sourceconnectorproperties.html#cfn-customerprofiles-integration-sourceconnectorproperties-zendesk","Required":false,"Type":"ZendeskSourceProperties","UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.SourceFlowConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-sourceflowconfig.html","Properties":{"ConnectorProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-sourceflowconfig.html#cfn-customerprofiles-integration-sourceflowconfig-connectorprofilename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectorType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-sourceflowconfig.html#cfn-customerprofiles-integration-sourceflowconfig-connectortype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncrementalPullConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-sourceflowconfig.html#cfn-customerprofiles-integration-sourceflowconfig-incrementalpullconfig","Required":false,"Type":"IncrementalPullConfig","UpdateType":"Mutable"},"SourceConnectorProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-sourceflowconfig.html#cfn-customerprofiles-integration-sourceflowconfig-sourceconnectorproperties","Required":true,"Type":"SourceConnectorProperties","UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.Task":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-task.html","Properties":{"ConnectorOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-task.html#cfn-customerprofiles-integration-task-connectoroperator","Required":false,"Type":"ConnectorOperator","UpdateType":"Mutable"},"DestinationField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-task.html#cfn-customerprofiles-integration-task-destinationfield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-task.html#cfn-customerprofiles-integration-task-sourcefields","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"TaskProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-task.html#cfn-customerprofiles-integration-task-taskproperties","DuplicatesAllowed":true,"ItemType":"TaskPropertiesMap","Required":false,"Type":"List","UpdateType":"Mutable"},"TaskType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-task.html#cfn-customerprofiles-integration-task-tasktype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.TaskPropertiesMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-taskpropertiesmap.html","Properties":{"OperatorPropertyKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-taskpropertiesmap.html#cfn-customerprofiles-integration-taskpropertiesmap-operatorpropertykey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Property":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-taskpropertiesmap.html#cfn-customerprofiles-integration-taskpropertiesmap-property","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.TriggerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-triggerconfig.html","Properties":{"TriggerProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-triggerconfig.html#cfn-customerprofiles-integration-triggerconfig-triggerproperties","Required":false,"Type":"TriggerProperties","UpdateType":"Mutable"},"TriggerType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-triggerconfig.html#cfn-customerprofiles-integration-triggerconfig-triggertype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.TriggerProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-triggerproperties.html","Properties":{"Scheduled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-triggerproperties.html#cfn-customerprofiles-integration-triggerproperties-scheduled","Required":false,"Type":"ScheduledTriggerProperties","UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Integration.ZendeskSourceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-zendesksourceproperties.html","Properties":{"Object":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-zendesksourceproperties.html#cfn-customerprofiles-integration-zendesksourceproperties-object","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::ObjectType.FieldMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-fieldmap.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-fieldmap.html#cfn-customerprofiles-objecttype-fieldmap-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ObjectTypeField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-fieldmap.html#cfn-customerprofiles-objecttype-fieldmap-objecttypefield","Required":false,"Type":"ObjectTypeField","UpdateType":"Mutable"}}},"AWS::CustomerProfiles::ObjectType.KeyMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-keymap.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-keymap.html#cfn-customerprofiles-objecttype-keymap-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ObjectTypeKeyList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-keymap.html#cfn-customerprofiles-objecttype-keymap-objecttypekeylist","DuplicatesAllowed":true,"ItemType":"ObjectTypeKey","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CustomerProfiles::ObjectType.ObjectTypeField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-objecttypefield.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-objecttypefield.html#cfn-customerprofiles-objecttype-objecttypefield-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-objecttypefield.html#cfn-customerprofiles-objecttype-objecttypefield-source","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-objecttypefield.html#cfn-customerprofiles-objecttype-objecttypefield-target","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CustomerProfiles::ObjectType.ObjectTypeKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-objecttypekey.html","Properties":{"FieldNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-objecttypekey.html#cfn-customerprofiles-objecttype-objecttypekey-fieldnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"StandardIdentifiers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-objecttype-objecttypekey.html#cfn-customerprofiles-objecttype-objecttypekey-standardidentifiers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DAX::Cluster.SSESpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dax-cluster-ssespecification.html","Properties":{"SSEEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dax-cluster-ssespecification.html#cfn-dax-cluster-ssespecification-sseenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-action.html","Properties":{"CrossRegionCopy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-action.html#cfn-dlm-lifecyclepolicy-action-crossregioncopy","ItemType":"CrossRegionCopyAction","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-action.html#cfn-dlm-lifecyclepolicy-action-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.ArchiveRetainRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-archiveretainrule.html","Properties":{"RetentionArchiveTier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-archiveretainrule.html#cfn-dlm-lifecyclepolicy-archiveretainrule-retentionarchivetier","Required":true,"Type":"RetentionArchiveTier","UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.ArchiveRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-archiverule.html","Properties":{"RetainRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-archiverule.html#cfn-dlm-lifecyclepolicy-archiverule-retainrule","Required":true,"Type":"ArchiveRetainRule","UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.CreateRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-createrule.html","Properties":{"CronExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-createrule.html#cfn-dlm-lifecyclepolicy-createrule-cronexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-createrule.html#cfn-dlm-lifecyclepolicy-createrule-interval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IntervalUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-createrule.html#cfn-dlm-lifecyclepolicy-createrule-intervalunit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-createrule.html#cfn-dlm-lifecyclepolicy-createrule-location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Times":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-createrule.html#cfn-dlm-lifecyclepolicy-createrule-times","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.CrossRegionCopyAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyaction.html","Properties":{"EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyaction.html#cfn-dlm-lifecyclepolicy-crossregioncopyaction-encryptionconfiguration","Required":true,"Type":"EncryptionConfiguration","UpdateType":"Mutable"},"RetainRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyaction.html#cfn-dlm-lifecyclepolicy-crossregioncopyaction-retainrule","Required":false,"Type":"CrossRegionCopyRetainRule","UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyaction.html#cfn-dlm-lifecyclepolicy-crossregioncopyaction-target","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.CrossRegionCopyDeprecateRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopydeprecaterule.html","Properties":{"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopydeprecaterule.html#cfn-dlm-lifecyclepolicy-crossregioncopydeprecaterule-interval","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"IntervalUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopydeprecaterule.html#cfn-dlm-lifecyclepolicy-crossregioncopydeprecaterule-intervalunit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.CrossRegionCopyRetainRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyretainrule.html","Properties":{"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyretainrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyretainrule-interval","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"IntervalUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyretainrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyretainrule-intervalunit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.CrossRegionCopyRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html","Properties":{"CmkArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyrule-cmkarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CopyTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyrule-copytags","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DeprecateRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyrule-deprecaterule","Required":false,"Type":"CrossRegionCopyDeprecateRule","UpdateType":"Mutable"},"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyrule-encrypted","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"RetainRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyrule-retainrule","Required":false,"Type":"CrossRegionCopyRetainRule","UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyrule-target","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyrule-targetregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.DeprecateRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-deprecaterule.html","Properties":{"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-deprecaterule.html#cfn-dlm-lifecyclepolicy-deprecaterule-count","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-deprecaterule.html#cfn-dlm-lifecyclepolicy-deprecaterule-interval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IntervalUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-deprecaterule.html#cfn-dlm-lifecyclepolicy-deprecaterule-intervalunit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-encryptionconfiguration.html","Properties":{"CmkArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-encryptionconfiguration.html#cfn-dlm-lifecyclepolicy-encryptionconfiguration-cmkarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-encryptionconfiguration.html#cfn-dlm-lifecyclepolicy-encryptionconfiguration-encrypted","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.EventParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-eventparameters.html","Properties":{"DescriptionRegex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-eventparameters.html#cfn-dlm-lifecyclepolicy-eventparameters-descriptionregex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-eventparameters.html#cfn-dlm-lifecyclepolicy-eventparameters-eventtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SnapshotOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-eventparameters.html#cfn-dlm-lifecyclepolicy-eventparameters-snapshotowner","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.EventSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-eventsource.html","Properties":{"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-eventsource.html#cfn-dlm-lifecyclepolicy-eventsource-parameters","Required":false,"Type":"EventParameters","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-eventsource.html#cfn-dlm-lifecyclepolicy-eventsource-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.FastRestoreRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-fastrestorerule.html","Properties":{"AvailabilityZones":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-fastrestorerule.html#cfn-dlm-lifecyclepolicy-fastrestorerule-availabilityzones","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-fastrestorerule.html#cfn-dlm-lifecyclepolicy-fastrestorerule-count","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-fastrestorerule.html#cfn-dlm-lifecyclepolicy-fastrestorerule-interval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IntervalUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-fastrestorerule.html#cfn-dlm-lifecyclepolicy-fastrestorerule-intervalunit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-parameters.html","Properties":{"ExcludeBootVolume":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-parameters.html#cfn-dlm-lifecyclepolicy-parameters-excludebootvolume","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExcludeDataVolumeTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-parameters.html#cfn-dlm-lifecyclepolicy-parameters-excludedatavolumetags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"NoReboot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-parameters.html#cfn-dlm-lifecyclepolicy-parameters-noreboot","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.PolicyDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-policydetails.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-policydetails.html#cfn-dlm-lifecyclepolicy-policydetails-actions","ItemType":"Action","Required":false,"Type":"List","UpdateType":"Mutable"},"EventSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-policydetails.html#cfn-dlm-lifecyclepolicy-policydetails-eventsource","Required":false,"Type":"EventSource","UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-policydetails.html#cfn-dlm-lifecyclepolicy-policydetails-parameters","Required":false,"Type":"Parameters","UpdateType":"Mutable"},"PolicyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-policydetails.html#cfn-dlm-lifecyclepolicy-policydetails-policytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceLocations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-policydetails.html#cfn-dlm-lifecyclepolicy-policydetails-resourcelocations","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-policydetails.html#cfn-dlm-lifecyclepolicy-policydetails-resourcetypes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Schedules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-policydetails.html#cfn-dlm-lifecyclepolicy-policydetails-schedules","ItemType":"Schedule","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-policydetails.html#cfn-dlm-lifecyclepolicy-policydetails-targettags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.RetainRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-retainrule.html","Properties":{"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-retainrule.html#cfn-dlm-lifecyclepolicy-retainrule-count","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-retainrule.html#cfn-dlm-lifecyclepolicy-retainrule-interval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IntervalUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-retainrule.html#cfn-dlm-lifecyclepolicy-retainrule-intervalunit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.RetentionArchiveTier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-retentionarchivetier.html","Properties":{"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-retentionarchivetier.html#cfn-dlm-lifecyclepolicy-retentionarchivetier-count","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-retentionarchivetier.html#cfn-dlm-lifecyclepolicy-retentionarchivetier-interval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IntervalUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-retentionarchivetier.html#cfn-dlm-lifecyclepolicy-retentionarchivetier-intervalunit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html","Properties":{"ArchiveRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-archiverule","Required":false,"Type":"ArchiveRule","UpdateType":"Mutable"},"CopyTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-copytags","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CreateRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-createrule","Required":false,"Type":"CreateRule","UpdateType":"Mutable"},"CrossRegionCopyRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-crossregioncopyrules","ItemType":"CrossRegionCopyRule","Required":false,"Type":"List","UpdateType":"Mutable"},"DeprecateRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-deprecaterule","Required":false,"Type":"DeprecateRule","UpdateType":"Mutable"},"FastRestoreRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-fastrestorerule","Required":false,"Type":"FastRestoreRule","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RetainRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-retainrule","Required":false,"Type":"RetainRule","UpdateType":"Mutable"},"ShareRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-sharerules","ItemType":"ShareRule","Required":false,"Type":"List","UpdateType":"Mutable"},"TagsToAdd":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-tagstoadd","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VariableTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-variabletags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy.ShareRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-sharerule.html","Properties":{"TargetAccounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-sharerule.html#cfn-dlm-lifecyclepolicy-sharerule-targetaccounts","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"UnshareInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-sharerule.html#cfn-dlm-lifecyclepolicy-sharerule-unshareinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UnshareIntervalUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-sharerule.html#cfn-dlm-lifecyclepolicy-sharerule-unshareintervalunit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.DocDbSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-docdbsettings.html","Properties":{"DocsToInvestigate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-docdbsettings.html#cfn-dms-endpoint-docdbsettings-docstoinvestigate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ExtractDocId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-docdbsettings.html#cfn-dms-endpoint-docdbsettings-extractdocid","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NestingLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-docdbsettings.html#cfn-dms-endpoint-docdbsettings-nestinglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-docdbsettings.html#cfn-dms-endpoint-docdbsettings-secretsmanageraccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerSecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-docdbsettings.html#cfn-dms-endpoint-docdbsettings-secretsmanagersecretid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.DynamoDbSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-dynamodbsettings.html","Properties":{"ServiceAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-dynamodbsettings.html#cfn-dms-endpoint-dynamodbsettings-serviceaccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.ElasticsearchSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-elasticsearchsettings.html","Properties":{"EndpointUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-elasticsearchsettings.html#cfn-dms-endpoint-elasticsearchsettings-endpointuri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ErrorRetryDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-elasticsearchsettings.html#cfn-dms-endpoint-elasticsearchsettings-errorretryduration","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FullLoadErrorPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-elasticsearchsettings.html#cfn-dms-endpoint-elasticsearchsettings-fullloaderrorpercentage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ServiceAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-elasticsearchsettings.html#cfn-dms-endpoint-elasticsearchsettings-serviceaccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.GcpMySQLSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html","Properties":{"AfterConnectScript":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-afterconnectscript","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CleanSourceMetadataOnMismatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-cleansourcemetadataonmismatch","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventsPollInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-eventspollinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxFileSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-maxfilesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ParallelLoadThreads":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-parallelloadthreads","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-password","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SecretsManagerAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-secretsmanageraccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerSecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-secretsmanagersecretid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-servername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerTimezone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-servertimezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.IbmDb2Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html","Properties":{"CurrentLsn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-currentlsn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxKBytesPerRead":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-maxkbytesperread","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SecretsManagerAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-secretsmanageraccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerSecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-secretsmanagersecretid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SetDataCaptureChanges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-setdatacapturechanges","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.KafkaSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html","Properties":{"Broker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-broker","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IncludeControlDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-includecontroldetails","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeNullAndEmpty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-includenullandempty","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludePartitionValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-includepartitionvalue","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeTableAlterOperations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-includetablealteroperations","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeTransactionDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-includetransactiondetails","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MessageFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-messageformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MessageMaxBytes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-messagemaxbytes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NoHexPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-nohexprefix","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PartitionIncludeSchemaTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-partitionincludeschematable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SaslPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-saslpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SaslUserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-saslusername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-securityprotocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SslCaCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-sslcacertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SslClientCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-sslclientcertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SslClientKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-sslclientkeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SslClientKeyPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-sslclientkeypassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Topic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-topic","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.KinesisSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html","Properties":{"IncludeControlDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-includecontroldetails","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeNullAndEmpty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-includenullandempty","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludePartitionValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-includepartitionvalue","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeTableAlterOperations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-includetablealteroperations","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeTransactionDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-includetransactiondetails","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MessageFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-messageformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NoHexPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-nohexprefix","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PartitionIncludeSchemaTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-partitionincludeschematable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ServiceAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-serviceaccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StreamArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-streamarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.MicrosoftSqlServerSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html","Properties":{"BcpPacketSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-bcppacketsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ControlTablesFileGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-controltablesfilegroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"QuerySingleAlwaysOnNode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-querysinglealwaysonnode","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ReadBackupOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-readbackuponly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SafeguardPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-safeguardpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-secretsmanageraccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerSecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-secretsmanagersecretid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UseBcpFullLoad":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-usebcpfullload","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UseThirdPartyBackupDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-usethirdpartybackupdevice","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.MongoDbSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html","Properties":{"AuthMechanism":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-authmechanism","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-authsource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-authtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocsToInvestigate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-docstoinvestigate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExtractDocId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-extractdocid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NestingLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-nestinglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-password","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SecretsManagerAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-secretsmanageraccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerSecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-secretsmanagersecretid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-servername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mongodbsettings.html#cfn-dms-endpoint-mongodbsettings-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.MySqlSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html","Properties":{"AfterConnectScript":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-afterconnectscript","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CleanSourceMetadataOnMismatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-cleansourcemetadataonmismatch","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EventsPollInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-eventspollinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxFileSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-maxfilesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ParallelLoadThreads":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-parallelloadthreads","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SecretsManagerAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-secretsmanageraccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerSecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-secretsmanagersecretid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerTimezone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-servertimezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetDbType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-targetdbtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.NeptuneSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-neptunesettings.html","Properties":{"ErrorRetryDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-neptunesettings.html#cfn-dms-endpoint-neptunesettings-errorretryduration","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IamAuthEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-neptunesettings.html#cfn-dms-endpoint-neptunesettings-iamauthenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxFileSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-neptunesettings.html#cfn-dms-endpoint-neptunesettings-maxfilesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxRetryCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-neptunesettings.html#cfn-dms-endpoint-neptunesettings-maxretrycount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"S3BucketFolder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-neptunesettings.html#cfn-dms-endpoint-neptunesettings-s3bucketfolder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-neptunesettings.html#cfn-dms-endpoint-neptunesettings-s3bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServiceAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-neptunesettings.html#cfn-dms-endpoint-neptunesettings-serviceaccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.OracleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html","Properties":{"AccessAlternateDirectly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-accessalternatedirectly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AddSupplementalLogging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-addsupplementallogging","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AdditionalArchivedLogDestId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-additionalarchivedlogdestid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AllowSelectNestedTables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-allowselectnestedtables","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ArchivedLogDestId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-archivedlogdestid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ArchivedLogsOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-archivedlogsonly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AsmPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-asmpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AsmServer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-asmserver","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AsmUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-asmuser","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CharLengthSemantics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-charlengthsemantics","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DirectPathNoLog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-directpathnolog","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DirectPathParallelLoad":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-directpathparallelload","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableHomogenousTablespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-enablehomogenoustablespace","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExtraArchivedLogDestIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-extraarchivedlogdestids","PrimitiveItemType":"Integer","Required":false,"Type":"List","UpdateType":"Mutable"},"FailTasksOnLobTruncation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-failtasksonlobtruncation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NumberDatatypeScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-numberdatatypescale","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OraclePathPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-oraclepathprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParallelAsmReadThreads":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-parallelasmreadthreads","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ReadAheadBlocks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-readaheadblocks","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ReadTableSpaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-readtablespacename","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ReplacePathPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-replacepathprefix","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RetryInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-retryinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SecretsManagerAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-secretsmanageraccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerOracleAsmAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-secretsmanageroracleasmaccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerOracleAsmSecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-secretsmanageroracleasmsecretid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerSecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-secretsmanagersecretid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityDbEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-securitydbencryption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityDbEncryptionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-securitydbencryptionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SpatialDataOptionToGeoJsonFunctionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-spatialdataoptiontogeojsonfunctionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StandbyDelayTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-standbydelaytime","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UseAlternateFolderForOnline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-usealternatefolderforonline","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UseBFile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-usebfile","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UseDirectPathFullLoad":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-usedirectpathfullload","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UseLogminerReader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-uselogminerreader","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UsePathPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-usepathprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.PostgreSqlSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html","Properties":{"AfterConnectScript":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-afterconnectscript","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CaptureDdls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-captureddls","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DdlArtifactsSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-ddlartifactsschema","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExecuteTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-executetimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FailTasksOnLobTruncation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-failtasksonlobtruncation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HeartbeatEnable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-heartbeatenable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HeartbeatFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-heartbeatfrequency","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HeartbeatSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-heartbeatschema","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MapBooleanAsBoolean":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-mapbooleanasboolean","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxFileSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-maxfilesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PluginName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-pluginname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-secretsmanageraccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerSecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-secretsmanagersecretid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SlotName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-slotname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.RedisSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html","Properties":{"AuthPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-authpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-authtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthUserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-authusername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-port","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ServerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-servername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SslCaCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-sslcacertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SslSecurityProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-sslsecurityprotocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.RedshiftSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html","Properties":{"AcceptAnyDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-acceptanydate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AfterConnectScript":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-afterconnectscript","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BucketFolder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-bucketfolder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CaseSensitiveNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-casesensitivenames","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CompUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-compupdate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ConnectionTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-connectiontimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DateFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-dateformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EmptyAsNull":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-emptyasnull","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EncryptionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-encryptionmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExplicitIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-explicitids","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"FileTransferUploadStreams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-filetransferuploadstreams","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"LoadTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-loadtimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MapBooleanAsBoolean":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-mapbooleanasboolean","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxFileSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-maxfilesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RemoveQuotes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-removequotes","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ReplaceChars":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-replacechars","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReplaceInvalidChars":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-replaceinvalidchars","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-secretsmanageraccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerSecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-secretsmanagersecretid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerSideEncryptionKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-serversideencryptionkmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServiceAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-serviceaccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-timeformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TrimBlanks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-trimblanks","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TruncateColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-truncatecolumns","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"WriteBufferSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-writebuffersize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.S3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html","Properties":{"AddColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-addcolumnname","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"BucketFolder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-bucketfolder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CannedAclForObjects":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cannedaclforobjects","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CdcInsertsAndUpdates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cdcinsertsandupdates","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CdcInsertsOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cdcinsertsonly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CdcMaxBatchInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cdcmaxbatchinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CdcMinFileSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cdcminfilesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CdcPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cdcpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CompressionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-compressiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CsvDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-csvdelimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CsvNoSupValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-csvnosupvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CsvNullValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-csvnullvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CsvRowDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-csvrowdelimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-dataformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataPageSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-datapagesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DatePartitionDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-datepartitiondelimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatePartitionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-datepartitionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DatePartitionSequence":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-datepartitionsequence","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatePartitionTimezone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-datepartitiontimezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DictPageSizeLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-dictpagesizelimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"EnableStatistics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-enablestatistics","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EncodingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-encodingtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-encryptionmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExternalTableDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-externaltabledefinition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IgnoreHeaderRows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-ignoreheaderrows","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IncludeOpForFullLoad":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-includeopforfullload","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxFileSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-maxfilesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ParquetTimestampInMillisecond":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-parquettimestampinmillisecond","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ParquetVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-parquetversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreserveTransactions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-preservetransactions","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Rfc4180":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-rfc4180","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RowGroupLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-rowgrouplength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ServerSideEncryptionKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-serversideencryptionkmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServiceAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-serviceaccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimestampColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-timestampcolumnname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UseCsvNoSupValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-usecsvnosupvalue","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UseTaskStartTimeForFullLoadTimestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-usetaskstarttimeforfullloadtimestamp","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::Endpoint.SybaseSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-sybasesettings.html","Properties":{"SecretsManagerAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-sybasesettings.html#cfn-dms-endpoint-sybasesettings-secretsmanageraccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretsManagerSecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-sybasesettings.html#cfn-dms-endpoint-sybasesettings-secretsmanagersecretid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.CsvOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-csvoptions.html","Properties":{"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-csvoptions.html#cfn-databrew-dataset-csvoptions-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HeaderRow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-csvoptions.html#cfn-databrew-dataset-csvoptions-headerrow","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.DataCatalogInputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datacataloginputdefinition.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datacataloginputdefinition.html#cfn-databrew-dataset-datacataloginputdefinition-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datacataloginputdefinition.html#cfn-databrew-dataset-datacataloginputdefinition-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datacataloginputdefinition.html#cfn-databrew-dataset-datacataloginputdefinition-tablename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TempDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datacataloginputdefinition.html#cfn-databrew-dataset-datacataloginputdefinition-tempdirectory","Required":false,"Type":"S3Location","UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.DatabaseInputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-databaseinputdefinition.html","Properties":{"DatabaseTableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-databaseinputdefinition.html#cfn-databrew-dataset-databaseinputdefinition-databasetablename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlueConnectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-databaseinputdefinition.html#cfn-databrew-dataset-databaseinputdefinition-glueconnectionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"QueryString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-databaseinputdefinition.html#cfn-databrew-dataset-databaseinputdefinition-querystring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TempDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-databaseinputdefinition.html#cfn-databrew-dataset-databaseinputdefinition-tempdirectory","Required":false,"Type":"S3Location","UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.DatasetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datasetparameter.html","Properties":{"CreateColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datasetparameter.html#cfn-databrew-dataset-datasetparameter-createcolumn","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DatetimeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datasetparameter.html#cfn-databrew-dataset-datasetparameter-datetimeoptions","Required":false,"Type":"DatetimeOptions","UpdateType":"Mutable"},"Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datasetparameter.html#cfn-databrew-dataset-datasetparameter-filter","Required":false,"Type":"FilterExpression","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datasetparameter.html#cfn-databrew-dataset-datasetparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datasetparameter.html#cfn-databrew-dataset-datasetparameter-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.DatetimeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datetimeoptions.html","Properties":{"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datetimeoptions.html#cfn-databrew-dataset-datetimeoptions-format","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LocaleCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datetimeoptions.html#cfn-databrew-dataset-datetimeoptions-localecode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimezoneOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-datetimeoptions.html#cfn-databrew-dataset-datetimeoptions-timezoneoffset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.ExcelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-exceloptions.html","Properties":{"HeaderRow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-exceloptions.html#cfn-databrew-dataset-exceloptions-headerrow","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SheetIndexes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-exceloptions.html#cfn-databrew-dataset-exceloptions-sheetindexes","DuplicatesAllowed":true,"PrimitiveItemType":"Integer","Required":false,"Type":"List","UpdateType":"Mutable"},"SheetNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-exceloptions.html#cfn-databrew-dataset-exceloptions-sheetnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.FilesLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-fileslimit.html","Properties":{"MaxFiles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-fileslimit.html#cfn-databrew-dataset-fileslimit-maxfiles","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Order":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-fileslimit.html#cfn-databrew-dataset-fileslimit-order","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OrderedBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-fileslimit.html#cfn-databrew-dataset-fileslimit-orderedby","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.FilterExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-filterexpression.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-filterexpression.html#cfn-databrew-dataset-filterexpression-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValuesMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-filterexpression.html#cfn-databrew-dataset-filterexpression-valuesmap","DuplicatesAllowed":true,"ItemType":"FilterValue","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.FilterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-filtervalue.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-filtervalue.html#cfn-databrew-dataset-filtervalue-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-filtervalue.html#cfn-databrew-dataset-filtervalue-valuereference","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.FormatOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-formatoptions.html","Properties":{"Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-formatoptions.html#cfn-databrew-dataset-formatoptions-csv","Required":false,"Type":"CsvOptions","UpdateType":"Mutable"},"Excel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-formatoptions.html#cfn-databrew-dataset-formatoptions-excel","Required":false,"Type":"ExcelOptions","UpdateType":"Mutable"},"Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-formatoptions.html#cfn-databrew-dataset-formatoptions-json","Required":false,"Type":"JsonOptions","UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-input.html","Properties":{"DataCatalogInputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-input.html#cfn-databrew-dataset-input-datacataloginputdefinition","Required":false,"Type":"DataCatalogInputDefinition","UpdateType":"Mutable"},"DatabaseInputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-input.html#cfn-databrew-dataset-input-databaseinputdefinition","Required":false,"Type":"DatabaseInputDefinition","UpdateType":"Mutable"},"Metadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-input.html#cfn-databrew-dataset-input-metadata","Required":false,"Type":"Metadata","UpdateType":"Mutable"},"S3InputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-input.html#cfn-databrew-dataset-input-s3inputdefinition","Required":false,"Type":"S3Location","UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.JsonOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-jsonoptions.html","Properties":{"MultiLine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-jsonoptions.html#cfn-databrew-dataset-jsonoptions-multiline","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.Metadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-metadata.html","Properties":{"SourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-metadata.html#cfn-databrew-dataset-metadata-sourcearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.PathOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-pathoptions.html","Properties":{"FilesLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-pathoptions.html#cfn-databrew-dataset-pathoptions-fileslimit","Required":false,"Type":"FilesLimit","UpdateType":"Mutable"},"LastModifiedDateCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-pathoptions.html#cfn-databrew-dataset-pathoptions-lastmodifieddatecondition","Required":false,"Type":"FilterExpression","UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-pathoptions.html#cfn-databrew-dataset-pathoptions-parameters","DuplicatesAllowed":true,"ItemType":"PathParameter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.PathParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-pathparameter.html","Properties":{"DatasetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-pathparameter.html#cfn-databrew-dataset-pathparameter-datasetparameter","Required":true,"Type":"DatasetParameter","UpdateType":"Mutable"},"PathParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-pathparameter.html#cfn-databrew-dataset-pathparameter-pathparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-s3location.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-s3location.html#cfn-databrew-dataset-s3location-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-s3location.html#cfn-databrew-dataset-s3location-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Job.AllowedStatistics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-allowedstatistics.html","Properties":{"Statistics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-allowedstatistics.html#cfn-databrew-job-allowedstatistics-statistics","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataBrew::Job.ColumnSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnselector.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnselector.html#cfn-databrew-job-columnselector-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Regex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnselector.html#cfn-databrew-job-columnselector-regex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Job.ColumnStatisticsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnstatisticsconfiguration.html","Properties":{"Selectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnstatisticsconfiguration.html#cfn-databrew-job-columnstatisticsconfiguration-selectors","DuplicatesAllowed":true,"ItemType":"ColumnSelector","Required":false,"Type":"List","UpdateType":"Mutable"},"Statistics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnstatisticsconfiguration.html#cfn-databrew-job-columnstatisticsconfiguration-statistics","Required":true,"Type":"StatisticsConfiguration","UpdateType":"Mutable"}}},"AWS::DataBrew::Job.CsvOutputOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-csvoutputoptions.html","Properties":{"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-csvoutputoptions.html#cfn-databrew-job-csvoutputoptions-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Job.DataCatalogOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatabaseOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-databaseoptions","Required":false,"Type":"DatabaseTableOutputOptions","UpdateType":"Mutable"},"Overwrite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-overwrite","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"S3Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-s3options","Required":false,"Type":"S3TableOutputOptions","UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataBrew::Job.DatabaseOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databaseoutput.html","Properties":{"DatabaseOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databaseoutput.html#cfn-databrew-job-databaseoutput-databaseoptions","Required":true,"Type":"DatabaseTableOutputOptions","UpdateType":"Mutable"},"DatabaseOutputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databaseoutput.html#cfn-databrew-job-databaseoutput-databaseoutputmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlueConnectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databaseoutput.html#cfn-databrew-job-databaseoutput-glueconnectionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataBrew::Job.DatabaseTableOutputOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databasetableoutputoptions.html","Properties":{"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databasetableoutputoptions.html#cfn-databrew-job-databasetableoutputoptions-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TempDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databasetableoutputoptions.html#cfn-databrew-job-databasetableoutputoptions-tempdirectory","Required":false,"Type":"S3Location","UpdateType":"Mutable"}}},"AWS::DataBrew::Job.EntityDetectorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-entitydetectorconfiguration.html","Properties":{"AllowedStatistics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-entitydetectorconfiguration.html#cfn-databrew-job-entitydetectorconfiguration-allowedstatistics","Required":false,"Type":"AllowedStatistics","UpdateType":"Mutable"},"EntityTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-entitydetectorconfiguration.html#cfn-databrew-job-entitydetectorconfiguration-entitytypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataBrew::Job.JobSample":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-jobsample.html","Properties":{"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-jobsample.html#cfn-databrew-job-jobsample-mode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-jobsample.html#cfn-databrew-job-jobsample-size","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Job.Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-output.html","Properties":{"CompressionFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-output.html#cfn-databrew-job-output-compressionformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-output.html#cfn-databrew-job-output-format","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FormatOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-output.html#cfn-databrew-job-output-formatoptions","Required":false,"Type":"OutputFormatOptions","UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-output.html#cfn-databrew-job-output-location","Required":true,"Type":"S3Location","UpdateType":"Mutable"},"MaxOutputFiles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-output.html#cfn-databrew-job-output-maxoutputfiles","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Overwrite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-output.html#cfn-databrew-job-output-overwrite","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PartitionColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-output.html#cfn-databrew-job-output-partitioncolumns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataBrew::Job.OutputFormatOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-outputformatoptions.html","Properties":{"Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-outputformatoptions.html#cfn-databrew-job-outputformatoptions-csv","Required":false,"Type":"CsvOutputOptions","UpdateType":"Mutable"}}},"AWS::DataBrew::Job.OutputLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-outputlocation.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-outputlocation.html#cfn-databrew-job-outputlocation-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BucketOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-outputlocation.html#cfn-databrew-job-outputlocation-bucketowner","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-outputlocation.html#cfn-databrew-job-outputlocation-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Job.ProfileConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-profileconfiguration.html","Properties":{"ColumnStatisticsConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-profileconfiguration.html#cfn-databrew-job-profileconfiguration-columnstatisticsconfigurations","DuplicatesAllowed":true,"ItemType":"ColumnStatisticsConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"DatasetStatisticsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-profileconfiguration.html#cfn-databrew-job-profileconfiguration-datasetstatisticsconfiguration","Required":false,"Type":"StatisticsConfiguration","UpdateType":"Mutable"},"EntityDetectorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-profileconfiguration.html#cfn-databrew-job-profileconfiguration-entitydetectorconfiguration","Required":false,"Type":"EntityDetectorConfiguration","UpdateType":"Mutable"},"ProfileColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-profileconfiguration.html#cfn-databrew-job-profileconfiguration-profilecolumns","DuplicatesAllowed":true,"ItemType":"ColumnSelector","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataBrew::Job.Recipe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-recipe.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-recipe.html#cfn-databrew-job-recipe-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-recipe.html#cfn-databrew-job-recipe-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Job.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3location.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3location.html#cfn-databrew-job-s3location-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BucketOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3location.html#cfn-databrew-job-s3location-bucketowner","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3location.html#cfn-databrew-job-s3location-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Job.S3TableOutputOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3tableoutputoptions.html","Properties":{"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3tableoutputoptions.html#cfn-databrew-job-s3tableoutputoptions-location","Required":true,"Type":"S3Location","UpdateType":"Mutable"}}},"AWS::DataBrew::Job.StatisticOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticoverride.html","Properties":{"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticoverride.html#cfn-databrew-job-statisticoverride-parameters","PrimitiveItemType":"String","Required":true,"Type":"Map","UpdateType":"Mutable"},"Statistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticoverride.html#cfn-databrew-job-statisticoverride-statistic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataBrew::Job.StatisticsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticsconfiguration.html","Properties":{"IncludedStatistics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticsconfiguration.html#cfn-databrew-job-statisticsconfiguration-includedstatistics","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Overrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticsconfiguration.html#cfn-databrew-job-statisticsconfiguration-overrides","DuplicatesAllowed":true,"ItemType":"StatisticOverride","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataBrew::Job.ValidationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-validationconfiguration.html","Properties":{"RulesetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-validationconfiguration.html#cfn-databrew-job-validationconfiguration-rulesetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValidationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-validationconfiguration.html#cfn-databrew-job-validationconfiguration-validationmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Project.Sample":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-project-sample.html","Properties":{"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-project-sample.html#cfn-databrew-project-sample-size","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-project-sample.html#cfn-databrew-project-sample-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataBrew::Recipe.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-action.html","Properties":{"Operation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-action.html#cfn-databrew-recipe-action-operation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-action.html#cfn-databrew-recipe-action-parameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::DataBrew::Recipe.ConditionExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-conditionexpression.html","Properties":{"Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-conditionexpression.html#cfn-databrew-recipe-conditionexpression-condition","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-conditionexpression.html#cfn-databrew-recipe-conditionexpression-targetcolumn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-conditionexpression.html#cfn-databrew-recipe-conditionexpression-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Recipe.DataCatalogInputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-datacataloginputdefinition.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-datacataloginputdefinition.html#cfn-databrew-recipe-datacataloginputdefinition-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-datacataloginputdefinition.html#cfn-databrew-recipe-datacataloginputdefinition-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-datacataloginputdefinition.html#cfn-databrew-recipe-datacataloginputdefinition-tablename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TempDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-datacataloginputdefinition.html#cfn-databrew-recipe-datacataloginputdefinition-tempdirectory","Required":false,"Type":"S3Location","UpdateType":"Mutable"}}},"AWS::DataBrew::Recipe.Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-input.html","Properties":{"DataCatalogInputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-input.html#cfn-databrew-recipe-input-datacataloginputdefinition","Required":false,"Type":"DataCatalogInputDefinition","UpdateType":"Mutable"},"S3InputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-input.html#cfn-databrew-recipe-input-s3inputdefinition","Required":false,"Type":"S3Location","UpdateType":"Mutable"}}},"AWS::DataBrew::Recipe.RecipeParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html","Properties":{"AggregateFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-aggregatefunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Base":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-base","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CaseStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-casestatement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CategoryMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-categorymap","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CharsToRemove":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-charstoremove","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CollapseConsecutiveWhitespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-collapseconsecutivewhitespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColumnDataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-columndatatype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColumnRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-columnrange","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-count","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomCharacters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-customcharacters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomStopWords":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-customstopwords","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-customvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatasetsColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-datasetscolumns","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DateAddValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-dateaddvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DateTimeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-datetimeformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DateTimeParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-datetimeparameters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeleteOtherRows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-deleteotherrows","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EndPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-endpattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EndPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-endposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EndValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-endvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExpandContractions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-expandcontractions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Exponent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-exponent","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FalseString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-falsestring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GroupByAggFunctionOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-groupbyaggfunctionoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GroupByColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-groupbycolumns","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HiddenColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-hiddencolumns","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IgnoreCase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-ignorecase","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IncludeInSplit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-includeinsplit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-input","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-interval","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IsText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-istext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JoinKeys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-joinkeys","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JoinType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-jointype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LeftColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-leftcolumns","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Limit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-limit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LowerBound":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-lowerbound","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MapType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-maptype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-modetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MultiLine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-multiline","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NumRows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-numrows","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumRowsAfter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-numrowsafter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumRowsBefore":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-numrowsbefore","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OrderByColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-orderbycolumn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OrderByColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-orderbycolumns","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Other":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-other","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Pattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-pattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PatternOption1":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-patternoption1","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PatternOption2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-patternoption2","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PatternOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-patternoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Period":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-period","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveAllPunctuation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removeallpunctuation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveAllQuotes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removeallquotes","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveAllWhitespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removeallwhitespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveCustomCharacters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removecustomcharacters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveCustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removecustomvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveLeadingAndTrailingPunctuation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removeleadingandtrailingpunctuation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveLeadingAndTrailingQuotes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removeleadingandtrailingquotes","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveLeadingAndTrailingWhitespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removeleadingandtrailingwhitespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveLetters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removeletters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveNumbers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removenumbers","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveSourceColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removesourcecolumn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveSpecialCharacters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-removespecialcharacters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RightColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-rightcolumns","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SampleSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-samplesize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SampleType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-sampletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecondInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-secondinput","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecondaryInputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-secondaryinputs","DuplicatesAllowed":true,"ItemType":"SecondaryInput","Required":false,"Type":"List","UpdateType":"Mutable"},"SheetIndexes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-sheetindexes","DuplicatesAllowed":true,"PrimitiveItemType":"Integer","Required":false,"Type":"List","UpdateType":"Mutable"},"SheetNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-sheetnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-sourcecolumn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceColumn1":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-sourcecolumn1","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceColumn2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-sourcecolumn2","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-sourcecolumns","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartColumnIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-startcolumnindex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-startpattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-startposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-startvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StemmingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-stemmingmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StepCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-stepcount","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StepIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-stepindex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StopWordsMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-stopwordsmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Strategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-strategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-targetcolumn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-targetcolumnnames","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetDateFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-targetdateformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-targetindex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-timezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenizerPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-tokenizerpattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TrueString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-truestring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UdfLang":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-udflang","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Units":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-units","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UnpivotColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-unpivotcolumn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UpperBound":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-upperbound","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UseNewDataFrame":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-usenewdataframe","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value1":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-value1","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-value2","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-valuecolumn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ViewFrame":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipeparameters.html#cfn-databrew-recipe-recipeparameters-viewframe","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Recipe.RecipeStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipestep.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipestep.html#cfn-databrew-recipe-recipestep-action","Required":true,"Type":"Action","UpdateType":"Mutable"},"ConditionExpressions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-recipestep.html#cfn-databrew-recipe-recipestep-conditionexpressions","DuplicatesAllowed":true,"ItemType":"ConditionExpression","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataBrew::Recipe.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-s3location.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-s3location.html#cfn-databrew-recipe-s3location-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-s3location.html#cfn-databrew-recipe-s3location-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Recipe.SecondaryInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-secondaryinput.html","Properties":{"DataCatalogInputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-secondaryinput.html#cfn-databrew-recipe-secondaryinput-datacataloginputdefinition","Required":false,"Type":"DataCatalogInputDefinition","UpdateType":"Mutable"},"S3InputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-recipe-secondaryinput.html#cfn-databrew-recipe-secondaryinput-s3inputdefinition","Required":false,"Type":"S3Location","UpdateType":"Mutable"}}},"AWS::DataBrew::Ruleset.ColumnSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-columnselector.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-columnselector.html#cfn-databrew-ruleset-columnselector-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Regex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-columnselector.html#cfn-databrew-ruleset-columnselector-regex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Ruleset.Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html","Properties":{"CheckExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-checkexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ColumnSelectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-columnselectors","DuplicatesAllowed":true,"ItemType":"ColumnSelector","Required":false,"Type":"List","UpdateType":"Mutable"},"Disabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-disabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SubstitutionMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-substitutionmap","DuplicatesAllowed":true,"ItemType":"SubstitutionValue","Required":false,"Type":"List","UpdateType":"Mutable"},"Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-threshold","Required":false,"Type":"Threshold","UpdateType":"Mutable"}}},"AWS::DataBrew::Ruleset.SubstitutionValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-substitutionvalue.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-substitutionvalue.html#cfn-databrew-ruleset-substitutionvalue-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-substitutionvalue.html#cfn-databrew-ruleset-substitutionvalue-valuereference","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataBrew::Ruleset.Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-threshold.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-threshold.html#cfn-databrew-ruleset-threshold-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-threshold.html#cfn-databrew-ruleset-threshold-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-threshold.html#cfn-databrew-ruleset-threshold-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::DataPipeline::Pipeline.Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-field.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-field.html#cfn-datapipeline-pipeline-field-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RefValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-field.html#cfn-datapipeline-pipeline-field-refvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StringValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-field.html#cfn-datapipeline-pipeline-field-stringvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataPipeline::Pipeline.ParameterAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parameterattribute.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parameterattribute.html#cfn-datapipeline-pipeline-parameterattribute-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StringValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parameterattribute.html#cfn-datapipeline-pipeline-parameterattribute-stringvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataPipeline::Pipeline.ParameterObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parameterobject.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parameterobject.html#cfn-datapipeline-pipeline-parameterobject-attributes","DuplicatesAllowed":true,"ItemType":"ParameterAttribute","Required":true,"Type":"List","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parameterobject.html#cfn-datapipeline-pipeline-parameterobject-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataPipeline::Pipeline.ParameterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parametervalue.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parametervalue.html#cfn-datapipeline-pipeline-parametervalue-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StringValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-parametervalue.html#cfn-datapipeline-pipeline-parametervalue-stringvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataPipeline::Pipeline.PipelineObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelineobject.html","Properties":{"Fields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelineobject.html#cfn-datapipeline-pipeline-pipelineobject-fields","DuplicatesAllowed":true,"ItemType":"Field","Required":true,"Type":"List","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelineobject.html#cfn-datapipeline-pipeline-pipelineobject-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelineobject.html#cfn-datapipeline-pipeline-pipelineobject-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataPipeline::Pipeline.PipelineTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelinetag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelinetag.html#cfn-datapipeline-pipeline-pipelinetag-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datapipeline-pipeline-pipelinetag.html#cfn-datapipeline-pipeline-pipelinetag-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataSync::LocationEFS.Ec2Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationefs-ec2config.html","Properties":{"SecurityGroupArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationefs-ec2config.html#cfn-datasync-locationefs-ec2config-securitygrouparns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"SubnetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationefs-ec2config.html#cfn-datasync-locationefs-ec2config-subnetarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::DataSync::LocationFSxONTAP.NFS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-nfs.html","Properties":{"MountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-nfs.html#cfn-datasync-locationfsxontap-nfs-mountoptions","Required":true,"Type":"NfsMountOptions","UpdateType":"Immutable"}}},"AWS::DataSync::LocationFSxONTAP.NfsMountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-nfsmountoptions.html","Properties":{"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-nfsmountoptions.html#cfn-datasync-locationfsxontap-nfsmountoptions-version","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::DataSync::LocationFSxONTAP.Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-protocol.html","Properties":{"NFS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-protocol.html#cfn-datasync-locationfsxontap-protocol-nfs","Required":false,"Type":"NFS","UpdateType":"Immutable"},"SMB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-protocol.html#cfn-datasync-locationfsxontap-protocol-smb","Required":false,"Type":"SMB","UpdateType":"Immutable"}}},"AWS::DataSync::LocationFSxONTAP.SMB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-smb.html","Properties":{"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-smb.html#cfn-datasync-locationfsxontap-smb-domain","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-smb.html#cfn-datasync-locationfsxontap-smb-mountoptions","Required":true,"Type":"SmbMountOptions","UpdateType":"Immutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-smb.html#cfn-datasync-locationfsxontap-smb-password","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"User":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-smb.html#cfn-datasync-locationfsxontap-smb-user","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::DataSync::LocationFSxONTAP.SmbMountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-smbmountoptions.html","Properties":{"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxontap-smbmountoptions.html#cfn-datasync-locationfsxontap-smbmountoptions-version","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::DataSync::LocationFSxOpenZFS.MountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-mountoptions.html","Properties":{"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-mountoptions.html#cfn-datasync-locationfsxopenzfs-mountoptions-version","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::DataSync::LocationFSxOpenZFS.NFS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-nfs.html","Properties":{"MountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-nfs.html#cfn-datasync-locationfsxopenzfs-nfs-mountoptions","Required":true,"Type":"MountOptions","UpdateType":"Immutable"}}},"AWS::DataSync::LocationFSxOpenZFS.Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-protocol.html","Properties":{"NFS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-protocol.html#cfn-datasync-locationfsxopenzfs-protocol-nfs","Required":false,"Type":"NFS","UpdateType":"Immutable"}}},"AWS::DataSync::LocationHDFS.NameNode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-namenode.html","Properties":{"Hostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-namenode.html#cfn-datasync-locationhdfs-namenode-hostname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-namenode.html#cfn-datasync-locationhdfs-namenode-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::DataSync::LocationHDFS.QopConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-qopconfiguration.html","Properties":{"DataTransferProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-qopconfiguration.html#cfn-datasync-locationhdfs-qopconfiguration-datatransferprotection","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RpcProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-qopconfiguration.html#cfn-datasync-locationhdfs-qopconfiguration-rpcprotection","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataSync::LocationNFS.MountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationnfs-mountoptions.html","Properties":{"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationnfs-mountoptions.html#cfn-datasync-locationnfs-mountoptions-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataSync::LocationNFS.OnPremConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationnfs-onpremconfig.html","Properties":{"AgentArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationnfs-onpremconfig.html#cfn-datasync-locationnfs-onpremconfig-agentarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataSync::LocationS3.S3Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locations3-s3config.html","Properties":{"BucketAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locations3-s3config.html#cfn-datasync-locations3-s3config-bucketaccessrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::DataSync::LocationSMB.MountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationsmb-mountoptions.html","Properties":{"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationsmb-mountoptions.html#cfn-datasync-locationsmb-mountoptions-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataSync::StorageSystem.ServerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-storagesystem-serverconfiguration.html","Properties":{"ServerHostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-storagesystem-serverconfiguration.html#cfn-datasync-storagesystem-serverconfiguration-serverhostname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-storagesystem-serverconfiguration.html#cfn-datasync-storagesystem-serverconfiguration-serverport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::DataSync::StorageSystem.ServerCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-storagesystem-servercredentials.html","Properties":{"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-storagesystem-servercredentials.html#cfn-datasync-storagesystem-servercredentials-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-storagesystem-servercredentials.html#cfn-datasync-storagesystem-servercredentials-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataSync::Task.FilterRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-filterrule.html","Properties":{"FilterType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-filterrule.html#cfn-datasync-task-filterrule-filtertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-filterrule.html#cfn-datasync-task-filterrule-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataSync::Task.Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html","Properties":{"Atime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-atime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BytesPerSecond":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-bytespersecond","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Gid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-gid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-loglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Mtime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-mtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ObjectTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-objecttags","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OverwriteMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-overwritemode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PosixPermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-posixpermissions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreserveDeletedFiles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-preservedeletedfiles","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreserveDevices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-preservedevices","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityDescriptorCopyFlags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-securitydescriptorcopyflags","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TaskQueueing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-taskqueueing","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TransferMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-transfermode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Uid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-uid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerifyMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-verifymode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataSync::Task.TaskSchedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-taskschedule.html","Properties":{"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-taskschedule.html#cfn-datasync-task-taskschedule-scheduleexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DevOpsGuru::NotificationChannel.NotificationChannelConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-notificationchannel-notificationchannelconfig.html","Properties":{"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-notificationchannel-notificationchannelconfig.html#cfn-devopsguru-notificationchannel-notificationchannelconfig-filters","Required":false,"Type":"NotificationFilterConfig","UpdateType":"Immutable"},"Sns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-notificationchannel-notificationchannelconfig.html#cfn-devopsguru-notificationchannel-notificationchannelconfig-sns","Required":false,"Type":"SnsChannelConfig","UpdateType":"Immutable"}}},"AWS::DevOpsGuru::NotificationChannel.NotificationFilterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-notificationchannel-notificationfilterconfig.html","Properties":{"MessageTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-notificationchannel-notificationfilterconfig.html#cfn-devopsguru-notificationchannel-notificationfilterconfig-messagetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Severities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-notificationchannel-notificationfilterconfig.html#cfn-devopsguru-notificationchannel-notificationfilterconfig-severities","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::DevOpsGuru::NotificationChannel.SnsChannelConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-notificationchannel-snschannelconfig.html","Properties":{"TopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-notificationchannel-snschannelconfig.html#cfn-devopsguru-notificationchannel-snschannelconfig-topicarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::DevOpsGuru::ResourceCollection.CloudFormationCollectionFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-cloudformationcollectionfilter.html","Properties":{"StackNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-cloudformationcollectionfilter.html#cfn-devopsguru-resourcecollection-cloudformationcollectionfilter-stacknames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DevOpsGuru::ResourceCollection.ResourceCollectionFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-resourcecollectionfilter.html","Properties":{"CloudFormation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-resourcecollectionfilter.html#cfn-devopsguru-resourcecollection-resourcecollectionfilter-cloudformation","Required":false,"Type":"CloudFormationCollectionFilter","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-resourcecollectionfilter.html#cfn-devopsguru-resourcecollection-resourcecollectionfilter-tags","DuplicatesAllowed":true,"ItemType":"TagCollection","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DevOpsGuru::ResourceCollection.TagCollection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-tagcollection.html","Properties":{"AppBoundaryKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-tagcollection.html#cfn-devopsguru-resourcecollection-tagcollection-appboundarykey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-tagcollection.html#cfn-devopsguru-resourcecollection-tagcollection-tagvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DeviceFarm::DevicePool.Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-devicepool-rule.html","Properties":{"Attribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-devicepool-rule.html#cfn-devicefarm-devicepool-rule-attribute","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Operator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-devicepool-rule.html#cfn-devicefarm-devicepool-rule-operator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-devicepool-rule.html#cfn-devicefarm-devicepool-rule-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DeviceFarm::Project.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-project-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-project-vpcconfig.html#cfn-devicefarm-project-vpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-project-vpcconfig.html#cfn-devicefarm-project-vpcconfig-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-project-vpcconfig.html#cfn-devicefarm-project-vpcconfig-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DeviceFarm::TestGridProject.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-testgridproject-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-testgridproject-vpcconfig.html#cfn-devicefarm-testgridproject-vpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-testgridproject-vpcconfig.html#cfn-devicefarm-testgridproject-vpcconfig-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devicefarm-testgridproject-vpcconfig.html#cfn-devicefarm-testgridproject-vpcconfig-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DirectoryService::MicrosoftAD.VpcSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-directoryservice-microsoftad-vpcsettings.html","Properties":{"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-directoryservice-microsoftad-vpcsettings.html#cfn-directoryservice-microsoftad-vpcsettings-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-directoryservice-microsoftad-vpcsettings.html#cfn-directoryservice-microsoftad-vpcsettings-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DirectoryService::SimpleAD.VpcSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-directoryservice-simplead-vpcsettings.html","Properties":{"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-directoryservice-simplead-vpcsettings.html#cfn-directoryservice-simplead-vpcsettings-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-directoryservice-simplead-vpcsettings.html#cfn-directoryservice-simplead-vpcsettings-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::DynamoDB::GlobalTable.AttributeDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-attributedefinition.html","Properties":{"AttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-attributedefinition.html#cfn-dynamodb-globaltable-attributedefinition-attributename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AttributeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-attributedefinition.html#cfn-dynamodb-globaltable-attributedefinition-attributetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.CapacityAutoScalingSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-capacityautoscalingsettings.html","Properties":{"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-capacityautoscalingsettings.html#cfn-dynamodb-globaltable-capacityautoscalingsettings-maxcapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MinCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-capacityautoscalingsettings.html#cfn-dynamodb-globaltable-capacityautoscalingsettings-mincapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"SeedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-capacityautoscalingsettings.html#cfn-dynamodb-globaltable-capacityautoscalingsettings-seedcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TargetTrackingScalingPolicyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-capacityautoscalingsettings.html#cfn-dynamodb-globaltable-capacityautoscalingsettings-targettrackingscalingpolicyconfiguration","Required":true,"Type":"TargetTrackingScalingPolicyConfiguration","UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.ContributorInsightsSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-contributorinsightsspecification.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-contributorinsightsspecification.html#cfn-dynamodb-globaltable-contributorinsightsspecification-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.GlobalSecondaryIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-globalsecondaryindex.html","Properties":{"IndexName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-globalsecondaryindex.html#cfn-dynamodb-globaltable-globalsecondaryindex-indexname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KeySchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-globalsecondaryindex.html#cfn-dynamodb-globaltable-globalsecondaryindex-keyschema","DuplicatesAllowed":false,"ItemType":"KeySchema","Required":true,"Type":"List","UpdateType":"Mutable"},"Projection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-globalsecondaryindex.html#cfn-dynamodb-globaltable-globalsecondaryindex-projection","Required":true,"Type":"Projection","UpdateType":"Mutable"},"WriteProvisionedThroughputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-globalsecondaryindex.html#cfn-dynamodb-globaltable-globalsecondaryindex-writeprovisionedthroughputsettings","Required":false,"Type":"WriteProvisionedThroughputSettings","UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.KeySchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-keyschema.html","Properties":{"AttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-keyschema.html#cfn-dynamodb-globaltable-keyschema-attributename","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"},"KeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-keyschema.html#cfn-dynamodb-globaltable-keyschema-keytype","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"}}},"AWS::DynamoDB::GlobalTable.KinesisStreamSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-kinesisstreamspecification.html","Properties":{"StreamArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-kinesisstreamspecification.html#cfn-dynamodb-globaltable-kinesisstreamspecification-streamarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.LocalSecondaryIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-localsecondaryindex.html","Properties":{"IndexName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-localsecondaryindex.html#cfn-dynamodb-globaltable-localsecondaryindex-indexname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KeySchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-localsecondaryindex.html#cfn-dynamodb-globaltable-localsecondaryindex-keyschema","DuplicatesAllowed":false,"ItemType":"KeySchema","Required":true,"Type":"List","UpdateType":"Immutable"},"Projection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-localsecondaryindex.html#cfn-dynamodb-globaltable-localsecondaryindex-projection","Required":true,"Type":"Projection","UpdateType":"Immutable"}}},"AWS::DynamoDB::GlobalTable.PointInTimeRecoverySpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-pointintimerecoveryspecification.html","Properties":{"PointInTimeRecoveryEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-pointintimerecoveryspecification.html#cfn-dynamodb-globaltable-pointintimerecoveryspecification-pointintimerecoveryenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.Projection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-projection.html","Properties":{"NonKeyAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-projection.html#cfn-dynamodb-globaltable-projection-nonkeyattributes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Conditional"},"ProjectionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-projection.html#cfn-dynamodb-globaltable-projection-projectiontype","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"}}},"AWS::DynamoDB::GlobalTable.ReadProvisionedThroughputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-readprovisionedthroughputsettings.html","Properties":{"ReadCapacityAutoScalingSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-readprovisionedthroughputsettings.html#cfn-dynamodb-globaltable-readprovisionedthroughputsettings-readcapacityautoscalingsettings","Required":false,"Type":"CapacityAutoScalingSettings","UpdateType":"Mutable"},"ReadCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-readprovisionedthroughputsettings.html#cfn-dynamodb-globaltable-readprovisionedthroughputsettings-readcapacityunits","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.ReplicaGlobalSecondaryIndexSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaglobalsecondaryindexspecification.html","Properties":{"ContributorInsightsSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaglobalsecondaryindexspecification.html#cfn-dynamodb-globaltable-replicaglobalsecondaryindexspecification-contributorinsightsspecification","Required":false,"Type":"ContributorInsightsSpecification","UpdateType":"Mutable"},"IndexName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaglobalsecondaryindexspecification.html#cfn-dynamodb-globaltable-replicaglobalsecondaryindexspecification-indexname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ReadProvisionedThroughputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaglobalsecondaryindexspecification.html#cfn-dynamodb-globaltable-replicaglobalsecondaryindexspecification-readprovisionedthroughputsettings","Required":false,"Type":"ReadProvisionedThroughputSettings","UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.ReplicaSSESpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicassespecification.html","Properties":{"KMSMasterKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicassespecification.html#cfn-dynamodb-globaltable-replicassespecification-kmsmasterkeyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.ReplicaSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html","Properties":{"ContributorInsightsSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-contributorinsightsspecification","Required":false,"Type":"ContributorInsightsSpecification","UpdateType":"Mutable"},"DeletionProtectionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-deletionprotectionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"GlobalSecondaryIndexes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-globalsecondaryindexes","DuplicatesAllowed":false,"ItemType":"ReplicaGlobalSecondaryIndexSpecification","Required":false,"Type":"List","UpdateType":"Mutable"},"KinesisStreamSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-kinesisstreamspecification","Required":false,"Type":"KinesisStreamSpecification","UpdateType":"Mutable"},"PointInTimeRecoverySpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-pointintimerecoveryspecification","Required":false,"Type":"PointInTimeRecoverySpecification","UpdateType":"Mutable"},"ReadProvisionedThroughputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-readprovisionedthroughputsettings","Required":false,"Type":"ReadProvisionedThroughputSettings","UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-region","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SSESpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-ssespecification","Required":false,"Type":"ReplicaSSESpecification","UpdateType":"Mutable"},"TableClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-tableclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.SSESpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-ssespecification.html","Properties":{"SSEEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-ssespecification.html#cfn-dynamodb-globaltable-ssespecification-sseenabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"SSEType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-ssespecification.html#cfn-dynamodb-globaltable-ssespecification-ssetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.StreamSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-streamspecification.html","Properties":{"StreamViewType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-streamspecification.html#cfn-dynamodb-globaltable-streamspecification-streamviewtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.TargetTrackingScalingPolicyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-targettrackingscalingpolicyconfiguration.html","Properties":{"DisableScaleIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-targettrackingscalingpolicyconfiguration.html#cfn-dynamodb-globaltable-targettrackingscalingpolicyconfiguration-disablescalein","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ScaleInCooldown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-targettrackingscalingpolicyconfiguration.html#cfn-dynamodb-globaltable-targettrackingscalingpolicyconfiguration-scaleincooldown","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ScaleOutCooldown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-targettrackingscalingpolicyconfiguration.html#cfn-dynamodb-globaltable-targettrackingscalingpolicyconfiguration-scaleoutcooldown","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TargetValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-targettrackingscalingpolicyconfiguration.html#cfn-dynamodb-globaltable-targettrackingscalingpolicyconfiguration-targetvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.TimeToLiveSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-timetolivespecification.html","Properties":{"AttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-timetolivespecification.html#cfn-dynamodb-globaltable-timetolivespecification-attributename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-timetolivespecification.html#cfn-dynamodb-globaltable-timetolivespecification-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable.WriteProvisionedThroughputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-writeprovisionedthroughputsettings.html","Properties":{"WriteCapacityAutoScalingSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-writeprovisionedthroughputsettings.html#cfn-dynamodb-globaltable-writeprovisionedthroughputsettings-writecapacityautoscalingsettings","Required":false,"Type":"CapacityAutoScalingSettings","UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.AttributeDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-attributedefinition.html","Properties":{"AttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-attributedefinition.html#cfn-dynamodb-table-attributedefinition-attributename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AttributeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-attributedefinition.html#cfn-dynamodb-table-attributedefinition-attributetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.ContributorInsightsSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-contributorinsightsspecification.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-contributorinsightsspecification.html#cfn-dynamodb-table-contributorinsightsspecification-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-csv.html","Properties":{"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-csv.html#cfn-dynamodb-table-csv-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"HeaderList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-csv.html#cfn-dynamodb-table-csv-headerlist","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::DynamoDB::Table.GlobalSecondaryIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-globalsecondaryindex.html","Properties":{"ContributorInsightsSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-globalsecondaryindex.html#cfn-dynamodb-table-globalsecondaryindex-contributorinsightsspecification","Required":false,"Type":"ContributorInsightsSpecification","UpdateType":"Mutable"},"IndexName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-globalsecondaryindex.html#cfn-dynamodb-table-globalsecondaryindex-indexname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KeySchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-globalsecondaryindex.html#cfn-dynamodb-table-globalsecondaryindex-keyschema","DuplicatesAllowed":false,"ItemType":"KeySchema","Required":true,"Type":"List","UpdateType":"Mutable"},"Projection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-globalsecondaryindex.html#cfn-dynamodb-table-globalsecondaryindex-projection","Required":true,"Type":"Projection","UpdateType":"Mutable"},"ProvisionedThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-globalsecondaryindex.html#cfn-dynamodb-table-globalsecondaryindex-provisionedthroughput","Required":false,"Type":"ProvisionedThroughput","UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.ImportSourceSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-importsourcespecification.html","Properties":{"InputCompressionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-importsourcespecification.html#cfn-dynamodb-table-importsourcespecification-inputcompressiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InputFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-importsourcespecification.html#cfn-dynamodb-table-importsourcespecification-inputformat","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InputFormatOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-importsourcespecification.html#cfn-dynamodb-table-importsourcespecification-inputformatoptions","Required":false,"Type":"InputFormatOptions","UpdateType":"Immutable"},"S3BucketSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-importsourcespecification.html#cfn-dynamodb-table-importsourcespecification-s3bucketsource","Required":true,"Type":"S3BucketSource","UpdateType":"Immutable"}}},"AWS::DynamoDB::Table.InputFormatOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-inputformatoptions.html","Properties":{"Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-inputformatoptions.html#cfn-dynamodb-table-inputformatoptions-csv","Required":false,"Type":"Csv","UpdateType":"Immutable"}}},"AWS::DynamoDB::Table.KeySchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-keyschema.html","Properties":{"AttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-keyschema.html#cfn-dynamodb-table-keyschema-attributename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-keyschema.html#cfn-dynamodb-table-keyschema-keytype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.KinesisStreamSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-kinesisstreamspecification.html","Properties":{"StreamArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-kinesisstreamspecification.html#cfn-dynamodb-table-kinesisstreamspecification-streamarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.LocalSecondaryIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-localsecondaryindex.html","Properties":{"IndexName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-localsecondaryindex.html#cfn-dynamodb-table-localsecondaryindex-indexname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KeySchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-localsecondaryindex.html#cfn-dynamodb-table-localsecondaryindex-keyschema","DuplicatesAllowed":false,"ItemType":"KeySchema","Required":true,"Type":"List","UpdateType":"Mutable"},"Projection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-localsecondaryindex.html#cfn-dynamodb-table-localsecondaryindex-projection","Required":true,"Type":"Projection","UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.PointInTimeRecoverySpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-pointintimerecoveryspecification.html","Properties":{"PointInTimeRecoveryEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-pointintimerecoveryspecification.html#cfn-dynamodb-table-pointintimerecoveryspecification-pointintimerecoveryenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.Projection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-projection.html","Properties":{"NonKeyAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-projection.html#cfn-dynamodb-table-projection-nonkeyattributes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ProjectionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-projection.html#cfn-dynamodb-table-projection-projectiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.ProvisionedThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-provisionedthroughput.html","Properties":{"ReadCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-provisionedthroughput.html#cfn-dynamodb-table-provisionedthroughput-readcapacityunits","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"WriteCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-provisionedthroughput.html#cfn-dynamodb-table-provisionedthroughput-writecapacityunits","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.S3BucketSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-s3bucketsource.html","Properties":{"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-s3bucketsource.html#cfn-dynamodb-table-s3bucketsource-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3BucketOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-s3bucketsource.html#cfn-dynamodb-table-s3bucketsource-s3bucketowner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-s3bucketsource.html#cfn-dynamodb-table-s3bucketsource-s3keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::DynamoDB::Table.SSESpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-ssespecification.html","Properties":{"KMSMasterKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-ssespecification.html#cfn-dynamodb-table-ssespecification-kmsmasterkeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SSEEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-ssespecification.html#cfn-dynamodb-table-ssespecification-sseenabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"SSEType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-ssespecification.html#cfn-dynamodb-table-ssespecification-ssetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.StreamSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-streamspecification.html","Properties":{"StreamViewType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-streamspecification.html#cfn-dynamodb-table-streamspecification-streamviewtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DynamoDB::Table.TimeToLiveSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-timetolivespecification.html","Properties":{"AttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-timetolivespecification.html#cfn-dynamodb-table-timetolivespecification-attributename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-timetolivespecification.html#cfn-dynamodb-table-timetolivespecification-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::CapacityReservation.TagSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservation-tagspecification.html","Properties":{"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservation-tagspecification.html#cfn-ec2-capacityreservation-tagspecification-resourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservation-tagspecification.html#cfn-ec2-capacityreservation-tagspecification-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::CapacityReservationFleet.InstanceTypeSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AvailabilityZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-availabilityzoneid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EbsOptimized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-ebsoptimized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"InstancePlatform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-instanceplatform","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-priority","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-weight","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::CapacityReservationFleet.TagSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-tagspecification.html","Properties":{"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-tagspecification.html#cfn-ec2-capacityreservationfleet-tagspecification-resourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-tagspecification.html#cfn-ec2-capacityreservationfleet-tagspecification-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::ClientVpnEndpoint.CertificateAuthenticationRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-certificateauthenticationrequest.html","Properties":{"ClientRootCertificateChainArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-certificateauthenticationrequest.html#cfn-ec2-clientvpnendpoint-certificateauthenticationrequest-clientrootcertificatechainarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::ClientVpnEndpoint.ClientAuthenticationRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html","Properties":{"ActiveDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-activedirectory","Required":false,"Type":"DirectoryServiceAuthenticationRequest","UpdateType":"Mutable"},"FederatedAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-federatedauthentication","Required":false,"Type":"FederatedAuthenticationRequest","UpdateType":"Mutable"},"MutualAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-mutualauthentication","Required":false,"Type":"CertificateAuthenticationRequest","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::ClientVpnEndpoint.ClientConnectOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientconnectoptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientconnectoptions.html#cfn-ec2-clientvpnendpoint-clientconnectoptions-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"LambdaFunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientconnectoptions.html#cfn-ec2-clientvpnendpoint-clientconnectoptions-lambdafunctionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::ClientVpnEndpoint.ClientLoginBannerOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientloginbanneroptions.html","Properties":{"BannerText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientloginbanneroptions.html#cfn-ec2-clientvpnendpoint-clientloginbanneroptions-bannertext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientloginbanneroptions.html#cfn-ec2-clientvpnendpoint-clientloginbanneroptions-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::ClientVpnEndpoint.ConnectionLogOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html","Properties":{"CloudwatchLogGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html#cfn-ec2-clientvpnendpoint-connectionlogoptions-cloudwatchloggroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CloudwatchLogStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html#cfn-ec2-clientvpnendpoint-connectionlogoptions-cloudwatchlogstream","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html#cfn-ec2-clientvpnendpoint-connectionlogoptions-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::ClientVpnEndpoint.DirectoryServiceAuthenticationRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-directoryserviceauthenticationrequest.html","Properties":{"DirectoryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-directoryserviceauthenticationrequest.html#cfn-ec2-clientvpnendpoint-directoryserviceauthenticationrequest-directoryid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::ClientVpnEndpoint.FederatedAuthenticationRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-federatedauthenticationrequest.html","Properties":{"SAMLProviderArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-federatedauthenticationrequest.html#cfn-ec2-clientvpnendpoint-federatedauthenticationrequest-samlproviderarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelfServiceSAMLProviderArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-federatedauthenticationrequest.html#cfn-ec2-clientvpnendpoint-federatedauthenticationrequest-selfservicesamlproviderarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::ClientVpnEndpoint.TagSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-tagspecification.html","Properties":{"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-tagspecification.html#cfn-ec2-clientvpnendpoint-tagspecification-resourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-tagspecification.html#cfn-ec2-clientvpnendpoint-tagspecification-tags","ItemType":"Tag","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::EC2Fleet.AcceleratorCountRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratorcountrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratorcountrequest.html#cfn-ec2-ec2fleet-acceleratorcountrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratorcountrequest.html#cfn-ec2-ec2fleet-acceleratorcountrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.AcceleratorTotalMemoryMiBRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratortotalmemorymibrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratortotalmemorymibrequest.html#cfn-ec2-ec2fleet-acceleratortotalmemorymibrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratortotalmemorymibrequest.html#cfn-ec2-ec2fleet-acceleratortotalmemorymibrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.BaselineEbsBandwidthMbpsRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-baselineebsbandwidthmbpsrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-baselineebsbandwidthmbpsrequest.html#cfn-ec2-ec2fleet-baselineebsbandwidthmbpsrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-baselineebsbandwidthmbpsrequest.html#cfn-ec2-ec2fleet-baselineebsbandwidthmbpsrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.CapacityRebalance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityrebalance.html","Properties":{"ReplacementStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityrebalance.html#cfn-ec2-ec2fleet-capacityrebalance-replacementstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TerminationDelay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityrebalance.html#cfn-ec2-ec2fleet-capacityrebalance-terminationdelay","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.CapacityReservationOptionsRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityreservationoptionsrequest.html","Properties":{"UsageStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityreservationoptionsrequest.html#cfn-ec2-ec2fleet-capacityreservationoptionsrequest-usagestrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.FleetLaunchTemplateConfigRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateconfigrequest.html","Properties":{"LaunchTemplateSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateconfigrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateconfigrequest-launchtemplatespecification","Required":false,"Type":"FleetLaunchTemplateSpecificationRequest","UpdateType":"Immutable"},"Overrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateconfigrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateconfigrequest-overrides","DuplicatesAllowed":true,"ItemType":"FleetLaunchTemplateOverridesRequest","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.FleetLaunchTemplateOverridesRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-instancerequirements","Required":false,"Type":"InstanceRequirementsRequest","UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MaxPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-maxprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-placement","Required":false,"Type":"Placement","UpdateType":"Immutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-priority","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"WeightedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-weightedcapacity","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.FleetLaunchTemplateSpecificationRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html","Properties":{"LaunchTemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest-launchtemplateid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LaunchTemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest-launchtemplatename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest-version","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.InstanceRequirementsRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html","Properties":{"AcceleratorCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-acceleratorcount","Required":false,"Type":"AcceleratorCountRequest","UpdateType":"Immutable"},"AcceleratorManufacturers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-acceleratormanufacturers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AcceleratorNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-acceleratornames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AcceleratorTotalMemoryMiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-acceleratortotalmemorymib","Required":false,"Type":"AcceleratorTotalMemoryMiBRequest","UpdateType":"Immutable"},"AcceleratorTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-acceleratortypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AllowedInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-allowedinstancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"BareMetal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-baremetal","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BaselineEbsBandwidthMbps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-baselineebsbandwidthmbps","Required":false,"Type":"BaselineEbsBandwidthMbpsRequest","UpdateType":"Immutable"},"BurstablePerformance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-burstableperformance","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CpuManufacturers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-cpumanufacturers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ExcludedInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-excludedinstancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"InstanceGenerations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-instancegenerations","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"LocalStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-localstorage","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LocalStorageTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-localstoragetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"MemoryGiBPerVCpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-memorygibpervcpu","Required":false,"Type":"MemoryGiBPerVCpuRequest","UpdateType":"Immutable"},"MemoryMiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-memorymib","Required":false,"Type":"MemoryMiBRequest","UpdateType":"Immutable"},"NetworkBandwidthGbps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-networkbandwidthgbps","Required":false,"Type":"NetworkBandwidthGbpsRequest","UpdateType":"Immutable"},"NetworkInterfaceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-networkinterfacecount","Required":false,"Type":"NetworkInterfaceCountRequest","UpdateType":"Immutable"},"OnDemandMaxPricePercentageOverLowestPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-ondemandmaxpricepercentageoverlowestprice","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"RequireHibernateSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-requirehibernatesupport","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"SpotMaxPricePercentageOverLowestPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-spotmaxpricepercentageoverlowestprice","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"TotalLocalStorageGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-totallocalstoragegb","Required":false,"Type":"TotalLocalStorageGBRequest","UpdateType":"Immutable"},"VCpuCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-vcpucount","Required":false,"Type":"VCpuCountRangeRequest","UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.MaintenanceStrategies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-maintenancestrategies.html","Properties":{"CapacityRebalance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-maintenancestrategies.html#cfn-ec2-ec2fleet-maintenancestrategies-capacityrebalance","Required":false,"Type":"CapacityRebalance","UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.MemoryGiBPerVCpuRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorygibpervcpurequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorygibpervcpurequest.html#cfn-ec2-ec2fleet-memorygibpervcpurequest-max","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorygibpervcpurequest.html#cfn-ec2-ec2fleet-memorygibpervcpurequest-min","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.MemoryMiBRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorymibrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorymibrequest.html#cfn-ec2-ec2fleet-memorymibrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorymibrequest.html#cfn-ec2-ec2fleet-memorymibrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.NetworkBandwidthGbpsRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-networkbandwidthgbpsrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-networkbandwidthgbpsrequest.html#cfn-ec2-ec2fleet-networkbandwidthgbpsrequest-max","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-networkbandwidthgbpsrequest.html#cfn-ec2-ec2fleet-networkbandwidthgbpsrequest-min","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.NetworkInterfaceCountRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-networkinterfacecountrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-networkinterfacecountrequest.html#cfn-ec2-ec2fleet-networkinterfacecountrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-networkinterfacecountrequest.html#cfn-ec2-ec2fleet-networkinterfacecountrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.OnDemandOptionsRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html","Properties":{"AllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-allocationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CapacityReservationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-capacityreservationoptions","Required":false,"Type":"CapacityReservationOptionsRequest","UpdateType":"Immutable"},"MaxTotalPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-maxtotalprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MinTargetCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-mintargetcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SingleAvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-singleavailabilityzone","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"SingleInstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-singleinstancetype","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html","Properties":{"Affinity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-affinity","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-groupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"HostId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-hostid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"HostResourceGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-hostresourcegrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PartitionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-partitionnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SpreadDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-spreaddomain","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tenancy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-tenancy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.SpotOptionsRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html","Properties":{"AllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-allocationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceInterruptionBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-instanceinterruptionbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstancePoolsToUseCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-instancepoolstousecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MaintenanceStrategies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-maintenancestrategies","Required":false,"Type":"MaintenanceStrategies","UpdateType":"Immutable"},"MaxTotalPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-maxtotalprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MinTargetCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-mintargetcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SingleAvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-singleavailabilityzone","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"SingleInstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-singleinstancetype","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.TagSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-tagspecification.html","Properties":{"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-tagspecification.html#cfn-ec2-ec2fleet-tagspecification-resourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-tagspecification.html#cfn-ec2-ec2fleet-tagspecification-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.TargetCapacitySpecificationRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html","Properties":{"DefaultTargetCapacityType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-defaulttargetcapacitytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OnDemandTargetCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-ondemandtargetcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SpotTargetCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-spottargetcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TargetCapacityUnitType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-targetcapacityunittype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TotalTargetCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-totaltargetcapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::EC2Fleet.TotalLocalStorageGBRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-totallocalstoragegbrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-totallocalstoragegbrequest.html#cfn-ec2-ec2fleet-totallocalstoragegbrequest-max","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-totallocalstoragegbrequest.html#cfn-ec2-ec2fleet-totallocalstoragegbrequest-min","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EC2Fleet.VCpuCountRangeRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-vcpucountrangerequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-vcpucountrangerequest.html#cfn-ec2-ec2fleet-vcpucountrangerequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-vcpucountrangerequest.html#cfn-ec2-ec2fleet-vcpucountrangerequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::FlowLog.DestinationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-flowlog-destinationoptions.html","Properties":{"FileFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-flowlog-destinationoptions.html#cfn-ec2-flowlog-destinationoptions-fileformat","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"HiveCompatiblePartitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-flowlog-destinationoptions.html#cfn-ec2-flowlog-destinationoptions-hivecompatiblepartitions","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"PerHourPartition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-flowlog-destinationoptions.html#cfn-ec2-flowlog-destinationoptions-perhourpartition","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::IPAM.IpamOperatingRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ipam-ipamoperatingregion.html","Properties":{"RegionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ipam-ipamoperatingregion.html#cfn-ec2-ipam-ipamoperatingregion-regionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::IPAMPool.ProvisionedCidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ipampool-provisionedcidr.html","Properties":{"Cidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ipampool-provisionedcidr.html#cfn-ec2-ipampool-provisionedcidr-cidr","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::IPAMResourceDiscovery.IpamOperatingRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ipamresourcediscovery-ipamoperatingregion.html","Properties":{"RegionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ipamresourcediscovery-ipamoperatingregion.html#cfn-ec2-ipamresourcediscovery-ipamoperatingregion-regionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.AssociationParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations-associationparameters.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations-associationparameters.html#cfn-ec2-instance-ssmassociations-associationparameters-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations-associationparameters.html#cfn-ec2-instance-ssmassociations-associationparameters-value","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::Instance.BlockDeviceMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html","Properties":{"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-devicename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Ebs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-ebs","Required":false,"Type":"Ebs","UpdateType":"Mutable"},"NoDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-nodevice","Required":false,"Type":"NoDevice","UpdateType":"Mutable"},"VirtualName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-virtualname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.CpuOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-cpuoptions.html","Properties":{"CoreCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-cpuoptions.html#cfn-ec2-instance-cpuoptions-corecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ThreadsPerCore":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-cpuoptions.html#cfn-ec2-instance-cpuoptions-threadspercore","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.CreditSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-creditspecification.html","Properties":{"CPUCredits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-creditspecification.html#cfn-ec2-instance-creditspecification-cpucredits","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.Ebs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html","Properties":{"DeleteOnTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-deleteontermination","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-encrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-instance-ebs-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SnapshotId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-snapshotid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VolumeSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-volumesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.ElasticGpuSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticgpuspecification.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticgpuspecification.html#cfn-ec2-instance-elasticgpuspecification-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.ElasticInferenceAccelerator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticinferenceaccelerator.html","Properties":{"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticinferenceaccelerator.html#cfn-ec2-instance-elasticinferenceaccelerator-count","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticinferenceaccelerator.html#cfn-ec2-instance-elasticinferenceaccelerator-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.EnclaveOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-enclaveoptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-enclaveoptions.html#cfn-ec2-instance-enclaveoptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.HibernationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-hibernationoptions.html","Properties":{"Configured":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-hibernationoptions.html#cfn-ec2-instance-hibernationoptions-configured","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.InstanceIpv6Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-instanceipv6address.html","Properties":{"Ipv6Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-instanceipv6address.html#cfn-ec2-instance-instanceipv6address-ipv6address","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.LaunchTemplateSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html","Properties":{"LaunchTemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html#cfn-ec2-instance-launchtemplatespecification-launchtemplateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchTemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html#cfn-ec2-instance-launchtemplatespecification-launchtemplatename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html#cfn-ec2-instance-launchtemplatespecification-version","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.LicenseSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-licensespecification.html","Properties":{"LicenseConfigurationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-licensespecification.html#cfn-ec2-instance-licensespecification-licenseconfigurationarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.NetworkInterface":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html","Properties":{"AssociateCarrierIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#cfn-ec2-instance-networkinterface-associatecarrieripaddress","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AssociatePublicIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-associatepubip","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DeleteOnTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-delete","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-deviceindex","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"GroupSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-groupset","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Ipv6AddressCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#cfn-ec2-instance-networkinterface-ipv6addresscount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Ipv6Addresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#cfn-ec2-instance-networkinterface-ipv6addresses","DuplicatesAllowed":true,"ItemType":"InstanceIpv6Address","Required":false,"Type":"List","UpdateType":"Mutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-network-iface","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-privateipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivateIpAddresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-privateipaddresses","DuplicatesAllowed":true,"ItemType":"PrivateIpAddressSpecification","Required":false,"Type":"List","UpdateType":"Mutable"},"SecondaryPrivateIpAddressCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-secondprivateip","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.NoDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-nodevice.html","Properties":{}},"AWS::EC2::Instance.PrivateDnsNameOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-privatednsnameoptions.html","Properties":{"EnableResourceNameDnsAAAARecord":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-privatednsnameoptions.html#cfn-ec2-instance-privatednsnameoptions-enableresourcenamednsaaaarecord","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableResourceNameDnsARecord":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-privatednsnameoptions.html#cfn-ec2-instance-privatednsnameoptions-enableresourcenamednsarecord","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HostnameType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-privatednsnameoptions.html#cfn-ec2-instance-privatednsnameoptions-hostnametype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.PrivateIpAddressSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html","Properties":{"Primary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html#cfn-ec2-networkinterface-privateipspecification-primary","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html#cfn-ec2-networkinterface-privateipspecification-privateipaddress","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.SsmAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations.html","Properties":{"AssociationParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations.html#cfn-ec2-instance-ssmassociations-associationparameters","DuplicatesAllowed":true,"ItemType":"AssociationParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"DocumentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations.html#cfn-ec2-instance-ssmassociations-documentname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::Instance.Volume":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-mount-point.html","Properties":{"Device":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-mount-point.html#cfn-ec2-mountpoint-device","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VolumeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-mount-point.html#cfn-ec2-mountpoint-volumeid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.AcceleratorCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratorcount.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratorcount.html#cfn-ec2-launchtemplate-acceleratorcount-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratorcount.html#cfn-ec2-launchtemplate-acceleratorcount-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.AcceleratorTotalMemoryMiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratortotalmemorymib.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratortotalmemorymib.html#cfn-ec2-launchtemplate-acceleratortotalmemorymib-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratortotalmemorymib.html#cfn-ec2-launchtemplate-acceleratortotalmemorymib-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.BaselineEbsBandwidthMbps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-baselineebsbandwidthmbps.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-baselineebsbandwidthmbps.html#cfn-ec2-launchtemplate-baselineebsbandwidthmbps-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-baselineebsbandwidthmbps.html#cfn-ec2-launchtemplate-baselineebsbandwidthmbps-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.BlockDeviceMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html","Properties":{"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-devicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ebs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs","Required":false,"Type":"Ebs","UpdateType":"Mutable"},"NoDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-nodevice","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VirtualName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-virtualname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.CapacityReservationSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationspecification.html","Properties":{"CapacityReservationPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationspecification.html#cfn-ec2-launchtemplate-capacityreservationspecification-capacityreservationpreference","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CapacityReservationTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationspecification.html#cfn-ec2-launchtemplate-capacityreservationspecification-capacityreservationtarget","Required":false,"Type":"CapacityReservationTarget","UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.CapacityReservationTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationtarget.html","Properties":{"CapacityReservationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationtarget.html#cfn-ec2-launchtemplate-capacityreservationtarget-capacityreservationid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CapacityReservationResourceGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationtarget.html#cfn-ec2-launchtemplate-capacityreservationtarget-capacityreservationresourcegrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.CpuOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-cpuoptions.html","Properties":{"AmdSevSnp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-cpuoptions.html#cfn-ec2-launchtemplate-cpuoptions-amdsevsnp","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CoreCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-cpuoptions.html#cfn-ec2-launchtemplate-cpuoptions-corecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ThreadsPerCore":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-cpuoptions.html#cfn-ec2-launchtemplate-cpuoptions-threadspercore","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.CreditSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-creditspecification.html","Properties":{"CpuCredits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-creditspecification.html#cfn-ec2-launchtemplate-creditspecification-cpucredits","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.Ebs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ebs.html","Properties":{"DeleteOnTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ebs.html#cfn-ec2-launchtemplate-ebs-deleteontermination","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ebs.html#cfn-ec2-launchtemplate-ebs-encrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ebs.html#cfn-ec2-launchtemplate-ebs-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ebs.html#cfn-ec2-launchtemplate-ebs-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnapshotId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ebs.html#cfn-ec2-launchtemplate-ebs-snapshotid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Throughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ebs.html#cfn-ec2-launchtemplate-ebs-throughput","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VolumeSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ebs.html#cfn-ec2-launchtemplate-ebs-volumesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ebs.html#cfn-ec2-launchtemplate-ebs-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.ElasticGpuSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-elasticgpuspecification.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-elasticgpuspecification.html#cfn-ec2-launchtemplate-elasticgpuspecification-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.EnclaveOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-enclaveoptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-enclaveoptions.html#cfn-ec2-launchtemplate-enclaveoptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.HibernationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-hibernationoptions.html","Properties":{"Configured":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-hibernationoptions.html#cfn-ec2-launchtemplate-hibernationoptions-configured","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.IamInstanceProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-iaminstanceprofile.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-iaminstanceprofile.html#cfn-ec2-launchtemplate-iaminstanceprofile-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-iaminstanceprofile.html#cfn-ec2-launchtemplate-iaminstanceprofile-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.InstanceMarketOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancemarketoptions.html","Properties":{"MarketType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancemarketoptions.html#cfn-ec2-launchtemplate-instancemarketoptions-markettype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SpotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancemarketoptions.html#cfn-ec2-launchtemplate-instancemarketoptions-spotoptions","Required":false,"Type":"SpotOptions","UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.InstanceRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html","Properties":{"AcceleratorCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-acceleratorcount","Required":false,"Type":"AcceleratorCount","UpdateType":"Mutable"},"AcceleratorManufacturers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-acceleratormanufacturers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AcceleratorNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-acceleratornames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AcceleratorTotalMemoryMiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-acceleratortotalmemorymib","Required":false,"Type":"AcceleratorTotalMemoryMiB","UpdateType":"Mutable"},"AcceleratorTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-acceleratortypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AllowedInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-allowedinstancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"BareMetal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-baremetal","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BaselineEbsBandwidthMbps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-baselineebsbandwidthmbps","Required":false,"Type":"BaselineEbsBandwidthMbps","UpdateType":"Mutable"},"BurstablePerformance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-burstableperformance","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CpuManufacturers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-cpumanufacturers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ExcludedInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-excludedinstancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"InstanceGenerations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-instancegenerations","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"LocalStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-localstorage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LocalStorageTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-localstoragetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MemoryGiBPerVCpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-memorygibpervcpu","Required":false,"Type":"MemoryGiBPerVCpu","UpdateType":"Mutable"},"MemoryMiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-memorymib","Required":false,"Type":"MemoryMiB","UpdateType":"Mutable"},"NetworkBandwidthGbps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-networkbandwidthgbps","Required":false,"Type":"NetworkBandwidthGbps","UpdateType":"Mutable"},"NetworkInterfaceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-networkinterfacecount","Required":false,"Type":"NetworkInterfaceCount","UpdateType":"Mutable"},"OnDemandMaxPricePercentageOverLowestPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-ondemandmaxpricepercentageoverlowestprice","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RequireHibernateSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-requirehibernatesupport","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SpotMaxPricePercentageOverLowestPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-spotmaxpricepercentageoverlowestprice","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TotalLocalStorageGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-totallocalstoragegb","Required":false,"Type":"TotalLocalStorageGB","UpdateType":"Mutable"},"VCpuCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-instancerequirements.html#cfn-ec2-launchtemplate-instancerequirements-vcpucount","Required":false,"Type":"VCpuCount","UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.Ipv4PrefixSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv4prefixspecification.html","Properties":{"Ipv4Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv4prefixspecification.html#cfn-ec2-launchtemplate-ipv4prefixspecification-ipv4prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.Ipv6Add":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv6add.html","Properties":{"Ipv6Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv6add.html#cfn-ec2-launchtemplate-ipv6add-ipv6address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.Ipv6PrefixSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv6prefixspecification.html","Properties":{"Ipv6Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv6prefixspecification.html#cfn-ec2-launchtemplate-ipv6prefixspecification-ipv6prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.LaunchTemplateData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html","Properties":{"BlockDeviceMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-blockdevicemappings","DuplicatesAllowed":true,"ItemType":"BlockDeviceMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"CapacityReservationSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification","Required":false,"Type":"CapacityReservationSpecification","UpdateType":"Mutable"},"CpuOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-cpuoptions","Required":false,"Type":"CpuOptions","UpdateType":"Mutable"},"CreditSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-creditspecification","Required":false,"Type":"CreditSpecification","UpdateType":"Mutable"},"DisableApiStop":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-disableapistop","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DisableApiTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-disableapitermination","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EbsOptimized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-ebsoptimized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ElasticGpuSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-elasticgpuspecifications","DuplicatesAllowed":true,"ItemType":"ElasticGpuSpecification","Required":false,"Type":"List","UpdateType":"Mutable"},"ElasticInferenceAccelerators":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-elasticinferenceaccelerators","DuplicatesAllowed":true,"ItemType":"LaunchTemplateElasticInferenceAccelerator","Required":false,"Type":"List","UpdateType":"Mutable"},"EnclaveOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-enclaveoptions","Required":false,"Type":"EnclaveOptions","UpdateType":"Mutable"},"HibernationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-hibernationoptions","Required":false,"Type":"HibernationOptions","UpdateType":"Mutable"},"IamInstanceProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile","Required":false,"Type":"IamInstanceProfile","UpdateType":"Mutable"},"ImageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-imageid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceInitiatedShutdownBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instanceinitiatedshutdownbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceMarketOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions","Required":false,"Type":"InstanceMarketOptions","UpdateType":"Mutable"},"InstanceRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements","Required":false,"Type":"InstanceRequirements","UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KernelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-kernelid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-keyname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LicenseSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-licensespecifications","DuplicatesAllowed":true,"ItemType":"LicenseSpecification","Required":false,"Type":"List","UpdateType":"Mutable"},"MaintenanceOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-maintenanceoptions","Required":false,"Type":"MaintenanceOptions","UpdateType":"Mutable"},"MetadataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions","Required":false,"Type":"MetadataOptions","UpdateType":"Mutable"},"Monitoring":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-monitoring","Required":false,"Type":"Monitoring","UpdateType":"Mutable"},"NetworkInterfaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-networkinterfaces","DuplicatesAllowed":true,"ItemType":"NetworkInterface","Required":false,"Type":"List","UpdateType":"Mutable"},"Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-placement","Required":false,"Type":"Placement","UpdateType":"Mutable"},"PrivateDnsNameOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-privatednsnameoptions","Required":false,"Type":"PrivateDnsNameOptions","UpdateType":"Mutable"},"RamDiskId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-ramdiskid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TagSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-tagspecifications","DuplicatesAllowed":true,"ItemType":"TagSpecification","Required":false,"Type":"List","UpdateType":"Mutable"},"UserData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-userdata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.LaunchTemplateElasticInferenceAccelerator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator.html","Properties":{"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator.html#cfn-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator-count","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator.html#cfn-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.LaunchTemplateTagSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatetagspecification.html","Properties":{"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatetagspecification.html#cfn-ec2-launchtemplate-launchtemplatetagspecification-resourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatetagspecification.html#cfn-ec2-launchtemplate-launchtemplatetagspecification-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.LicenseSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-licensespecification.html","Properties":{"LicenseConfigurationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-licensespecification.html#cfn-ec2-launchtemplate-licensespecification-licenseconfigurationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.MaintenanceOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-maintenanceoptions.html","Properties":{"AutoRecovery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-maintenanceoptions.html#cfn-ec2-launchtemplate-maintenanceoptions-autorecovery","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.MemoryGiBPerVCpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorygibpervcpu.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorygibpervcpu.html#cfn-ec2-launchtemplate-memorygibpervcpu-max","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorygibpervcpu.html#cfn-ec2-launchtemplate-memorygibpervcpu-min","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.MemoryMiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorymib.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorymib.html#cfn-ec2-launchtemplate-memorymib-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorymib.html#cfn-ec2-launchtemplate-memorymib-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.MetadataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html","Properties":{"HttpEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html#cfn-ec2-launchtemplate-metadataoptions-httpendpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HttpProtocolIpv6":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html#cfn-ec2-launchtemplate-metadataoptions-httpprotocolipv6","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HttpPutResponseHopLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html#cfn-ec2-launchtemplate-metadataoptions-httpputresponsehoplimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HttpTokens":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html#cfn-ec2-launchtemplate-metadataoptions-httptokens","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceMetadataTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html#cfn-ec2-launchtemplate-metadataoptions-instancemetadatatags","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.Monitoring":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-monitoring.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-monitoring.html#cfn-ec2-launchtemplate-monitoring-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.NetworkBandwidthGbps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkbandwidthgbps.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkbandwidthgbps.html#cfn-ec2-launchtemplate-networkbandwidthgbps-max","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkbandwidthgbps.html#cfn-ec2-launchtemplate-networkbandwidthgbps-min","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.NetworkInterface":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html","Properties":{"AssociateCarrierIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-associatecarrieripaddress","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AssociatePublicIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-associatepublicipaddress","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DeleteOnTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-deleteontermination","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-deviceindex","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-groups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"InterfaceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-interfacetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ipv4PrefixCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv4prefixcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Ipv4Prefixes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv4prefixes","DuplicatesAllowed":true,"ItemType":"Ipv4PrefixSpecification","Required":false,"Type":"List","UpdateType":"Mutable"},"Ipv6AddressCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv6addresscount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Ipv6Addresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv6addresses","DuplicatesAllowed":true,"ItemType":"Ipv6Add","Required":false,"Type":"List","UpdateType":"Mutable"},"Ipv6PrefixCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv6prefixcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Ipv6Prefixes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv6prefixes","DuplicatesAllowed":true,"ItemType":"Ipv6PrefixSpecification","Required":false,"Type":"List","UpdateType":"Mutable"},"NetworkCardIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-networkcardindex","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-networkinterfaceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-privateipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivateIpAddresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-privateipaddresses","DuplicatesAllowed":true,"ItemType":"PrivateIpAdd","Required":false,"Type":"List","UpdateType":"Mutable"},"SecondaryPrivateIpAddressCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-secondaryprivateipaddresscount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.NetworkInterfaceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterfacecount.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterfacecount.html#cfn-ec2-launchtemplate-networkinterfacecount-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterfacecount.html#cfn-ec2-launchtemplate-networkinterfacecount-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-placement.html","Properties":{"Affinity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-placement.html#cfn-ec2-launchtemplate-placement-affinity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-placement.html#cfn-ec2-launchtemplate-placement-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-placement.html#cfn-ec2-launchtemplate-placement-groupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-placement.html#cfn-ec2-launchtemplate-placement-groupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-placement.html#cfn-ec2-launchtemplate-placement-hostid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostResourceGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-placement.html#cfn-ec2-launchtemplate-placement-hostresourcegrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PartitionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-placement.html#cfn-ec2-launchtemplate-placement-partitionnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SpreadDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-placement.html#cfn-ec2-launchtemplate-placement-spreaddomain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tenancy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-placement.html#cfn-ec2-launchtemplate-placement-tenancy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.PrivateDnsNameOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privatednsnameoptions.html","Properties":{"EnableResourceNameDnsAAAARecord":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privatednsnameoptions.html#cfn-ec2-launchtemplate-privatednsnameoptions-enableresourcenamednsaaaarecord","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableResourceNameDnsARecord":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privatednsnameoptions.html#cfn-ec2-launchtemplate-privatednsnameoptions-enableresourcenamednsarecord","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HostnameType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privatednsnameoptions.html#cfn-ec2-launchtemplate-privatednsnameoptions-hostnametype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.PrivateIpAdd":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privateipadd.html","Properties":{"Primary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privateipadd.html#cfn-ec2-launchtemplate-privateipadd-primary","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privateipadd.html#cfn-ec2-launchtemplate-privateipadd-privateipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.SpotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-spotoptions.html","Properties":{"BlockDurationMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-spotoptions.html#cfn-ec2-launchtemplate-spotoptions-blockdurationminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"InstanceInterruptionBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-spotoptions.html#cfn-ec2-launchtemplate-spotoptions-instanceinterruptionbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-spotoptions.html#cfn-ec2-launchtemplate-spotoptions-maxprice","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SpotInstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-spotoptions.html#cfn-ec2-launchtemplate-spotoptions-spotinstancetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValidUntil":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-spotoptions.html#cfn-ec2-launchtemplate-spotoptions-validuntil","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.TagSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-tagspecification.html","Properties":{"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-tagspecification.html#cfn-ec2-launchtemplate-tagspecification-resourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-tagspecification.html#cfn-ec2-launchtemplate-tagspecification-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.TotalLocalStorageGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-totallocalstoragegb.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-totallocalstoragegb.html#cfn-ec2-launchtemplate-totallocalstoragegb-max","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-totallocalstoragegb.html#cfn-ec2-launchtemplate-totallocalstoragegb-min","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LaunchTemplate.VCpuCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-vcpucount.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-vcpucount.html#cfn-ec2-launchtemplate-vcpucount-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-vcpucount.html#cfn-ec2-launchtemplate-vcpucount-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkAclEntry.Icmp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-icmp.html","Properties":{"Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-icmp.html#cfn-ec2-networkaclentry-icmp-code","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-icmp.html#cfn-ec2-networkaclentry-icmp-type","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkAclEntry.PortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-portrange.html","Properties":{"From":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-portrange.html#cfn-ec2-networkaclentry-portrange-from","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"To":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-portrange.html#cfn-ec2-networkaclentry-portrange-to","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAccessScope.AccessScopePathRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-accessscopepathrequest.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-accessscopepathrequest.html#cfn-ec2-networkinsightsaccessscope-accessscopepathrequest-destination","Required":false,"Type":"PathStatementRequest","UpdateType":"Immutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-accessscopepathrequest.html#cfn-ec2-networkinsightsaccessscope-accessscopepathrequest-source","Required":false,"Type":"PathStatementRequest","UpdateType":"Immutable"},"ThroughResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-accessscopepathrequest.html#cfn-ec2-networkinsightsaccessscope-accessscopepathrequest-throughresources","DuplicatesAllowed":true,"ItemType":"ThroughResourcesStatementRequest","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::NetworkInsightsAccessScope.PacketHeaderStatementRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html","Properties":{"DestinationAddresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-destinationaddresses","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"DestinationPorts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-destinationports","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"DestinationPrefixLists":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-destinationprefixlists","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Protocols":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-protocols","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SourceAddresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-sourceaddresses","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SourcePorts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-sourceports","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SourcePrefixLists":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-sourceprefixlists","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::NetworkInsightsAccessScope.PathStatementRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-pathstatementrequest.html","Properties":{"PacketHeaderStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-pathstatementrequest.html#cfn-ec2-networkinsightsaccessscope-pathstatementrequest-packetheaderstatement","Required":false,"Type":"PacketHeaderStatementRequest","UpdateType":"Immutable"},"ResourceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-pathstatementrequest.html#cfn-ec2-networkinsightsaccessscope-pathstatementrequest-resourcestatement","Required":false,"Type":"ResourceStatementRequest","UpdateType":"Immutable"}}},"AWS::EC2::NetworkInsightsAccessScope.ResourceStatementRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-resourcestatementrequest.html","Properties":{"ResourceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-resourcestatementrequest.html#cfn-ec2-networkinsightsaccessscope-resourcestatementrequest-resourcetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-resourcestatementrequest.html#cfn-ec2-networkinsightsaccessscope-resourcestatementrequest-resources","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::NetworkInsightsAccessScope.ThroughResourcesStatementRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-throughresourcesstatementrequest.html","Properties":{"ResourceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-throughresourcesstatementrequest.html#cfn-ec2-networkinsightsaccessscope-throughresourcesstatementrequest-resourcestatement","Required":false,"Type":"ResourceStatementRequest","UpdateType":"Immutable"}}},"AWS::EC2::NetworkInsightsAnalysis.AdditionalDetail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-additionaldetail.html","Properties":{"AdditionalDetailType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-additionaldetail.html#cfn-ec2-networkinsightsanalysis-additionaldetail-additionaldetailtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Component":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-additionaldetail.html#cfn-ec2-networkinsightsanalysis-additionaldetail-component","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"LoadBalancers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-additionaldetail.html#cfn-ec2-networkinsightsanalysis-additionaldetail-loadbalancers","DuplicatesAllowed":true,"ItemType":"AnalysisComponent","Required":false,"Type":"List","UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-additionaldetail.html#cfn-ec2-networkinsightsanalysis-additionaldetail-servicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.AlternatePathHint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-alternatepathhint.html","Properties":{"ComponentArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-alternatepathhint.html#cfn-ec2-networkinsightsanalysis-alternatepathhint-componentarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ComponentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-alternatepathhint.html#cfn-ec2-networkinsightsanalysis-alternatepathhint-componentid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisAclRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisaclrule.html","Properties":{"Cidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisaclrule.html#cfn-ec2-networkinsightsanalysis-analysisaclrule-cidr","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Egress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisaclrule.html#cfn-ec2-networkinsightsanalysis-analysisaclrule-egress","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisaclrule.html#cfn-ec2-networkinsightsanalysis-analysisaclrule-portrange","Required":false,"Type":"PortRange","UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisaclrule.html#cfn-ec2-networkinsightsanalysis-analysisaclrule-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RuleAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisaclrule.html#cfn-ec2-networkinsightsanalysis-analysisaclrule-ruleaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RuleNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisaclrule.html#cfn-ec2-networkinsightsanalysis-analysisaclrule-rulenumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisComponent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysiscomponent.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysiscomponent.html#cfn-ec2-networkinsightsanalysis-analysiscomponent-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysiscomponent.html#cfn-ec2-networkinsightsanalysis-analysiscomponent-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisLoadBalancerListener":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisloadbalancerlistener.html","Properties":{"InstancePort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisloadbalancerlistener.html#cfn-ec2-networkinsightsanalysis-analysisloadbalancerlistener-instanceport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"LoadBalancerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisloadbalancerlistener.html#cfn-ec2-networkinsightsanalysis-analysisloadbalancerlistener-loadbalancerport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisLoadBalancerTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisloadbalancertarget.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisloadbalancertarget.html#cfn-ec2-networkinsightsanalysis-analysisloadbalancertarget-address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisloadbalancertarget.html#cfn-ec2-networkinsightsanalysis-analysisloadbalancertarget-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Instance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisloadbalancertarget.html#cfn-ec2-networkinsightsanalysis-analysisloadbalancertarget-instance","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisloadbalancertarget.html#cfn-ec2-networkinsightsanalysis-analysisloadbalancertarget-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisPacketHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysispacketheader.html","Properties":{"DestinationAddresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysispacketheader.html#cfn-ec2-networkinsightsanalysis-analysispacketheader-destinationaddresses","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DestinationPortRanges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysispacketheader.html#cfn-ec2-networkinsightsanalysis-analysispacketheader-destinationportranges","DuplicatesAllowed":true,"ItemType":"PortRange","Required":false,"Type":"List","UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysispacketheader.html#cfn-ec2-networkinsightsanalysis-analysispacketheader-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceAddresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysispacketheader.html#cfn-ec2-networkinsightsanalysis-analysispacketheader-sourceaddresses","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SourcePortRanges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysispacketheader.html#cfn-ec2-networkinsightsanalysis-analysispacketheader-sourceportranges","DuplicatesAllowed":true,"ItemType":"PortRange","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisRouteTableRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html","Properties":{"NatGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html#cfn-ec2-networkinsightsanalysis-analysisroutetableroute-natgatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html#cfn-ec2-networkinsightsanalysis-analysisroutetableroute-networkinterfaceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Origin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html#cfn-ec2-networkinsightsanalysis-analysisroutetableroute-origin","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html#cfn-ec2-networkinsightsanalysis-analysisroutetableroute-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TransitGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html#cfn-ec2-networkinsightsanalysis-analysisroutetableroute-transitgatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcPeeringConnectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html#cfn-ec2-networkinsightsanalysis-analysisroutetableroute-vpcpeeringconnectionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"destinationCidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html#cfn-ec2-networkinsightsanalysis-analysisroutetableroute-destinationcidr","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"destinationPrefixListId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html#cfn-ec2-networkinsightsanalysis-analysisroutetableroute-destinationprefixlistid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"egressOnlyInternetGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html#cfn-ec2-networkinsightsanalysis-analysisroutetableroute-egressonlyinternetgatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"gatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html#cfn-ec2-networkinsightsanalysis-analysisroutetableroute-gatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"instanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysisroutetableroute.html#cfn-ec2-networkinsightsanalysis-analysisroutetableroute-instanceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.AnalysisSecurityGroupRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysissecuritygrouprule.html","Properties":{"Cidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysissecuritygrouprule.html#cfn-ec2-networkinsightsanalysis-analysissecuritygrouprule-cidr","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysissecuritygrouprule.html#cfn-ec2-networkinsightsanalysis-analysissecuritygrouprule-direction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysissecuritygrouprule.html#cfn-ec2-networkinsightsanalysis-analysissecuritygrouprule-portrange","Required":false,"Type":"PortRange","UpdateType":"Mutable"},"PrefixListId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysissecuritygrouprule.html#cfn-ec2-networkinsightsanalysis-analysissecuritygrouprule-prefixlistid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysissecuritygrouprule.html#cfn-ec2-networkinsightsanalysis-analysissecuritygrouprule-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-analysissecuritygrouprule.html#cfn-ec2-networkinsightsanalysis-analysissecuritygrouprule-securitygroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.Explanation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html","Properties":{"Acl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-acl","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"AclRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-aclrule","Required":false,"Type":"AnalysisAclRule","UpdateType":"Mutable"},"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Addresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-addresses","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AttachedTo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-attachedto","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"AvailabilityZones":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-availabilityzones","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Cidrs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-cidrs","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ClassicLoadBalancerListener":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-classicloadbalancerlistener","Required":false,"Type":"AnalysisLoadBalancerListener","UpdateType":"Mutable"},"Component":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-component","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"ComponentAccount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-componentaccount","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ComponentRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-componentregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomerGateway":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-customergateway","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-destination","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"DestinationVpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-destinationvpc","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-direction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ElasticLoadBalancerListener":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-elasticloadbalancerlistener","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"ExplanationCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-explanationcode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IngressRouteTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-ingressroutetable","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"InternetGateway":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-internetgateway","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"LoadBalancerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-loadbalancerarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoadBalancerListenerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-loadbalancerlistenerport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"LoadBalancerTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-loadbalancertarget","Required":false,"Type":"AnalysisLoadBalancerTarget","UpdateType":"Mutable"},"LoadBalancerTargetGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-loadbalancertargetgroup","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"LoadBalancerTargetGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-loadbalancertargetgroups","DuplicatesAllowed":true,"ItemType":"AnalysisComponent","Required":false,"Type":"List","UpdateType":"Mutable"},"LoadBalancerTargetPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-loadbalancertargetport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MissingComponent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-missingcomponent","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NatGateway":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-natgateway","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"NetworkInterface":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-networkinterface","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"PacketField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-packetfield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PortRanges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-portranges","DuplicatesAllowed":true,"ItemType":"PortRange","Required":false,"Type":"List","UpdateType":"Mutable"},"PrefixList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-prefixlist","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"Protocols":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-protocols","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RouteTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-routetable","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"RouteTableRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-routetableroute","Required":false,"Type":"AnalysisRouteTableRoute","UpdateType":"Mutable"},"SecurityGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-securitygroup","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"SecurityGroupRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-securitygrouprule","Required":false,"Type":"AnalysisSecurityGroupRule","UpdateType":"Mutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-securitygroups","DuplicatesAllowed":true,"ItemType":"AnalysisComponent","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceVpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-sourcevpc","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Subnet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-subnet","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"SubnetRouteTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-subnetroutetable","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"TransitGateway":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-transitgateway","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"TransitGatewayAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-transitgatewayattachment","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"TransitGatewayRouteTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-transitgatewayroutetable","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"TransitGatewayRouteTableRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-transitgatewayroutetableroute","Required":false,"Type":"TransitGatewayRouteTableRoute","UpdateType":"Mutable"},"Vpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-vpc","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"VpcPeeringConnection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-vpcpeeringconnection","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"VpnConnection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-vpnconnection","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"VpnGateway":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-vpngateway","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"vpcEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-explanation.html#cfn-ec2-networkinsightsanalysis-explanation-vpcendpoint","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.PathComponent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html","Properties":{"AclRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-aclrule","Required":false,"Type":"AnalysisAclRule","UpdateType":"Mutable"},"AdditionalDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-additionaldetails","DuplicatesAllowed":true,"ItemType":"AdditionalDetail","Required":false,"Type":"List","UpdateType":"Mutable"},"Component":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-component","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"DestinationVpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-destinationvpc","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"ElasticLoadBalancerListener":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-elasticloadbalancerlistener","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"Explanations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-explanations","DuplicatesAllowed":true,"ItemType":"Explanation","Required":false,"Type":"List","UpdateType":"Mutable"},"InboundHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-inboundheader","Required":false,"Type":"AnalysisPacketHeader","UpdateType":"Mutable"},"OutboundHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-outboundheader","Required":false,"Type":"AnalysisPacketHeader","UpdateType":"Mutable"},"RouteTableRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-routetableroute","Required":false,"Type":"AnalysisRouteTableRoute","UpdateType":"Mutable"},"SecurityGroupRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-securitygrouprule","Required":false,"Type":"AnalysisSecurityGroupRule","UpdateType":"Mutable"},"SequenceNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-sequencenumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-servicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceVpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-sourcevpc","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"Subnet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-subnet","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"TransitGateway":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-transitgateway","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"},"TransitGatewayRouteTableRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-transitgatewayroutetableroute","Required":false,"Type":"TransitGatewayRouteTableRoute","UpdateType":"Mutable"},"Vpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-pathcomponent.html#cfn-ec2-networkinsightsanalysis-pathcomponent-vpc","Required":false,"Type":"AnalysisComponent","UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.PortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-portrange.html","Properties":{"From":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-portrange.html#cfn-ec2-networkinsightsanalysis-portrange-from","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"To":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-portrange.html#cfn-ec2-networkinsightsanalysis-portrange-to","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis.TransitGatewayRouteTableRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-transitgatewayroutetableroute.html","Properties":{"AttachmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-transitgatewayroutetableroute.html#cfn-ec2-networkinsightsanalysis-transitgatewayroutetableroute-attachmentid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationCidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-transitgatewayroutetableroute.html#cfn-ec2-networkinsightsanalysis-transitgatewayroutetableroute-destinationcidr","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrefixListId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-transitgatewayroutetableroute.html#cfn-ec2-networkinsightsanalysis-transitgatewayroutetableroute-prefixlistid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-transitgatewayroutetableroute.html#cfn-ec2-networkinsightsanalysis-transitgatewayroutetableroute-resourceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-transitgatewayroutetableroute.html#cfn-ec2-networkinsightsanalysis-transitgatewayroutetableroute-resourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RouteOrigin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-transitgatewayroutetableroute.html#cfn-ec2-networkinsightsanalysis-transitgatewayroutetableroute-routeorigin","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsanalysis-transitgatewayroutetableroute.html#cfn-ec2-networkinsightsanalysis-transitgatewayroutetableroute-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsPath.FilterPortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightspath-filterportrange.html","Properties":{"FromPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightspath-filterportrange.html#cfn-ec2-networkinsightspath-filterportrange-fromport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ToPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightspath-filterportrange.html#cfn-ec2-networkinsightspath-filterportrange-toport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::NetworkInsightsPath.PathFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightspath-pathfilter.html","Properties":{"DestinationAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightspath-pathfilter.html#cfn-ec2-networkinsightspath-pathfilter-destinationaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DestinationPortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightspath-pathfilter.html#cfn-ec2-networkinsightspath-pathfilter-destinationportrange","Required":false,"Type":"FilterPortRange","UpdateType":"Immutable"},"SourceAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightspath-pathfilter.html#cfn-ec2-networkinsightspath-pathfilter-sourceaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourcePortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightspath-pathfilter.html#cfn-ec2-networkinsightspath-pathfilter-sourceportrange","Required":false,"Type":"FilterPortRange","UpdateType":"Immutable"}}},"AWS::EC2::NetworkInterface.InstanceIpv6Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinterface-instanceipv6address.html","Properties":{"Ipv6Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinterface-instanceipv6address.html#cfn-ec2-networkinterface-instanceipv6address-ipv6address","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInterface.PrivateIpAddressSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinterface-privateipaddressspecification.html","Properties":{"Primary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinterface-privateipaddressspecification.html#cfn-ec2-networkinterface-privateipaddressspecification-primary","PrimitiveType":"Boolean","Required":true,"UpdateType":"Conditional"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinterface-privateipaddressspecification.html#cfn-ec2-networkinterface-privateipaddressspecification-privateipaddress","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"}}},"AWS::EC2::PrefixList.Entry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-prefixlist-entry.html","Properties":{"Cidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-prefixlist-entry.html#cfn-ec2-prefixlist-entry-cidr","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-prefixlist-entry.html#cfn-ec2-prefixlist-entry-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::SecurityGroup.Egress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html","Properties":{"CidrIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-cidrip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CidrIpv6":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-cidripv6","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationPrefixListId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-destinationprefixlistid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationSecurityGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-destsecgroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FromPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-fromport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IpProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-ipprotocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ToPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-toport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::SecurityGroup.Ingress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html","Properties":{"CidrIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-cidrip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CidrIpv6":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-cidripv6","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FromPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-fromport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IpProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-ipprotocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourcePrefixListId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-securitygroup-ingress-sourceprefixlistid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceSecurityGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-sourcesecuritygroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceSecurityGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-sourcesecuritygroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceSecurityGroupOwnerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-sourcesecuritygroupownerid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ToPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html#cfn-ec2-security-group-rule-toport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::SpotFleet.AcceleratorCountRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratorcountrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratorcountrequest.html#cfn-ec2-spotfleet-acceleratorcountrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratorcountrequest.html#cfn-ec2-spotfleet-acceleratorcountrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.AcceleratorTotalMemoryMiBRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratortotalmemorymibrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratortotalmemorymibrequest.html#cfn-ec2-spotfleet-acceleratortotalmemorymibrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratortotalmemorymibrequest.html#cfn-ec2-spotfleet-acceleratortotalmemorymibrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.BaselineEbsBandwidthMbpsRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-baselineebsbandwidthmbpsrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-baselineebsbandwidthmbpsrequest.html#cfn-ec2-spotfleet-baselineebsbandwidthmbpsrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-baselineebsbandwidthmbpsrequest.html#cfn-ec2-spotfleet-baselineebsbandwidthmbpsrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.BlockDeviceMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-blockdevicemapping.html","Properties":{"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-blockdevicemapping.html#cfn-ec2-spotfleet-blockdevicemapping-devicename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Ebs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-blockdevicemapping.html#cfn-ec2-spotfleet-blockdevicemapping-ebs","Required":false,"Type":"EbsBlockDevice","UpdateType":"Immutable"},"NoDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-blockdevicemapping.html#cfn-ec2-spotfleet-blockdevicemapping-nodevice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VirtualName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-blockdevicemapping.html#cfn-ec2-spotfleet-blockdevicemapping-virtualname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.ClassicLoadBalancer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-classicloadbalancer.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-classicloadbalancer.html#cfn-ec2-spotfleet-classicloadbalancer-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.ClassicLoadBalancersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-classicloadbalancersconfig.html","Properties":{"ClassicLoadBalancers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-classicloadbalancersconfig.html#cfn-ec2-spotfleet-classicloadbalancersconfig-classicloadbalancers","DuplicatesAllowed":false,"ItemType":"ClassicLoadBalancer","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.EbsBlockDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-ebsblockdevice.html","Properties":{"DeleteOnTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-ebsblockdevice.html#cfn-ec2-spotfleet-ebsblockdevice-deleteontermination","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-ebsblockdevice.html#cfn-ec2-spotfleet-ebsblockdevice-encrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-ebsblockdevice.html#cfn-ec2-spotfleet-ebsblockdevice-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SnapshotId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-ebsblockdevice.html#cfn-ec2-spotfleet-ebsblockdevice-snapshotid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VolumeSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-ebsblockdevice.html#cfn-ec2-spotfleet-ebsblockdevice-volumesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-ebsblockdevice.html#cfn-ec2-spotfleet-ebsblockdevice-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.FleetLaunchTemplateSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-fleetlaunchtemplatespecification.html","Properties":{"LaunchTemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-fleetlaunchtemplatespecification.html#cfn-ec2-spotfleet-fleetlaunchtemplatespecification-launchtemplateid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LaunchTemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-fleetlaunchtemplatespecification.html#cfn-ec2-spotfleet-fleetlaunchtemplatespecification-launchtemplatename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-fleetlaunchtemplatespecification.html#cfn-ec2-spotfleet-fleetlaunchtemplatespecification-version","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.GroupIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-groupidentifier.html","Properties":{"GroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-groupidentifier.html#cfn-ec2-spotfleet-groupidentifier-groupid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.IamInstanceProfileSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-iaminstanceprofilespecification.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-iaminstanceprofilespecification.html#cfn-ec2-spotfleet-iaminstanceprofilespecification-arn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.InstanceIpv6Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instanceipv6address.html","Properties":{"Ipv6Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instanceipv6address.html#cfn-ec2-spotfleet-instanceipv6address-ipv6address","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.InstanceNetworkInterfaceSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html","Properties":{"AssociatePublicIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html#cfn-ec2-spotfleet-instancenetworkinterfacespecification-associatepublicipaddress","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DeleteOnTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html#cfn-ec2-spotfleet-instancenetworkinterfacespecification-deleteontermination","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html#cfn-ec2-spotfleet-instancenetworkinterfacespecification-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeviceIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html#cfn-ec2-spotfleet-instancenetworkinterfacespecification-deviceindex","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html#cfn-ec2-spotfleet-instancenetworkinterfacespecification-groups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Ipv6AddressCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html#cfn-ec2-spotfleet-instancenetworkinterfacespecification-ipv6addresscount","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Ipv6Addresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html#cfn-ec2-spotfleet-instancenetworkinterfacespecification-ipv6addresses","DuplicatesAllowed":false,"ItemType":"InstanceIpv6Address","Required":false,"Type":"List","UpdateType":"Immutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html#cfn-ec2-spotfleet-instancenetworkinterfacespecification-networkinterfaceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PrivateIpAddresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html#cfn-ec2-spotfleet-instancenetworkinterfacespecification-privateipaddresses","DuplicatesAllowed":false,"ItemType":"PrivateIpAddressSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"SecondaryPrivateIpAddressCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html#cfn-ec2-spotfleet-instancenetworkinterfacespecification-secondaryprivateipaddresscount","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancenetworkinterfacespecification.html#cfn-ec2-spotfleet-instancenetworkinterfacespecification-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.InstanceRequirementsRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html","Properties":{"AcceleratorCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-acceleratorcount","Required":false,"Type":"AcceleratorCountRequest","UpdateType":"Immutable"},"AcceleratorManufacturers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-acceleratormanufacturers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AcceleratorNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-acceleratornames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AcceleratorTotalMemoryMiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-acceleratortotalmemorymib","Required":false,"Type":"AcceleratorTotalMemoryMiBRequest","UpdateType":"Immutable"},"AcceleratorTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-acceleratortypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AllowedInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-allowedinstancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"BareMetal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-baremetal","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BaselineEbsBandwidthMbps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-baselineebsbandwidthmbps","Required":false,"Type":"BaselineEbsBandwidthMbpsRequest","UpdateType":"Immutable"},"BurstablePerformance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-burstableperformance","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CpuManufacturers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-cpumanufacturers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ExcludedInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-excludedinstancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"InstanceGenerations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-instancegenerations","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"LocalStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-localstorage","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LocalStorageTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-localstoragetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"MemoryGiBPerVCpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-memorygibpervcpu","Required":false,"Type":"MemoryGiBPerVCpuRequest","UpdateType":"Immutable"},"MemoryMiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-memorymib","Required":false,"Type":"MemoryMiBRequest","UpdateType":"Immutable"},"NetworkBandwidthGbps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-networkbandwidthgbps","Required":false,"Type":"NetworkBandwidthGbpsRequest","UpdateType":"Immutable"},"NetworkInterfaceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-networkinterfacecount","Required":false,"Type":"NetworkInterfaceCountRequest","UpdateType":"Immutable"},"OnDemandMaxPricePercentageOverLowestPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-ondemandmaxpricepercentageoverlowestprice","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"RequireHibernateSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-requirehibernatesupport","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"SpotMaxPricePercentageOverLowestPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-spotmaxpricepercentageoverlowestprice","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"TotalLocalStorageGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-totallocalstoragegb","Required":false,"Type":"TotalLocalStorageGBRequest","UpdateType":"Immutable"},"VCpuCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-vcpucount","Required":false,"Type":"VCpuCountRangeRequest","UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.LaunchTemplateConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateconfig.html","Properties":{"LaunchTemplateSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateconfig.html#cfn-ec2-spotfleet-launchtemplateconfig-launchtemplatespecification","Required":false,"Type":"FleetLaunchTemplateSpecification","UpdateType":"Immutable"},"Overrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateconfig.html#cfn-ec2-spotfleet-launchtemplateconfig-overrides","DuplicatesAllowed":false,"ItemType":"LaunchTemplateOverrides","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.LaunchTemplateOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html#cfn-ec2-spotfleet-launchtemplateoverrides-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html#cfn-ec2-spotfleet-launchtemplateoverrides-instancerequirements","Required":false,"Type":"InstanceRequirementsRequest","UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html#cfn-ec2-spotfleet-launchtemplateoverrides-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html#cfn-ec2-spotfleet-launchtemplateoverrides-priority","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"SpotPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html#cfn-ec2-spotfleet-launchtemplateoverrides-spotprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html#cfn-ec2-spotfleet-launchtemplateoverrides-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"WeightedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html#cfn-ec2-spotfleet-launchtemplateoverrides-weightedcapacity","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.LoadBalancersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-loadbalancersconfig.html","Properties":{"ClassicLoadBalancersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-loadbalancersconfig.html#cfn-ec2-spotfleet-loadbalancersconfig-classicloadbalancersconfig","Required":false,"Type":"ClassicLoadBalancersConfig","UpdateType":"Immutable"},"TargetGroupsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-loadbalancersconfig.html#cfn-ec2-spotfleet-loadbalancersconfig-targetgroupsconfig","Required":false,"Type":"TargetGroupsConfig","UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.MemoryGiBPerVCpuRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorygibpervcpurequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorygibpervcpurequest.html#cfn-ec2-spotfleet-memorygibpervcpurequest-max","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorygibpervcpurequest.html#cfn-ec2-spotfleet-memorygibpervcpurequest-min","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.MemoryMiBRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorymibrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorymibrequest.html#cfn-ec2-spotfleet-memorymibrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorymibrequest.html#cfn-ec2-spotfleet-memorymibrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.NetworkBandwidthGbpsRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-networkbandwidthgbpsrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-networkbandwidthgbpsrequest.html#cfn-ec2-spotfleet-networkbandwidthgbpsrequest-max","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-networkbandwidthgbpsrequest.html#cfn-ec2-spotfleet-networkbandwidthgbpsrequest-min","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.NetworkInterfaceCountRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-networkinterfacecountrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-networkinterfacecountrequest.html#cfn-ec2-spotfleet-networkinterfacecountrequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-networkinterfacecountrequest.html#cfn-ec2-spotfleet-networkinterfacecountrequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.PrivateIpAddressSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-privateipaddressspecification.html","Properties":{"Primary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-privateipaddressspecification.html#cfn-ec2-spotfleet-privateipaddressspecification-primary","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-privateipaddressspecification.html#cfn-ec2-spotfleet-privateipaddressspecification-privateipaddress","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.SpotCapacityRebalance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotcapacityrebalance.html","Properties":{"ReplacementStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotcapacityrebalance.html#cfn-ec2-spotfleet-spotcapacityrebalance-replacementstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TerminationDelay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotcapacityrebalance.html#cfn-ec2-spotfleet-spotcapacityrebalance-terminationdelay","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.SpotFleetLaunchSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html","Properties":{"BlockDeviceMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-blockdevicemappings","DuplicatesAllowed":false,"ItemType":"BlockDeviceMapping","Required":false,"Type":"List","UpdateType":"Immutable"},"EbsOptimized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-ebsoptimized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"IamInstanceProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-iaminstanceprofile","Required":false,"Type":"IamInstanceProfileSpecification","UpdateType":"Immutable"},"ImageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-imageid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InstanceRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-instancerequirements","Required":false,"Type":"InstanceRequirementsRequest","UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KernelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-kernelid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KeyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-keyname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Monitoring":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-monitoring","Required":false,"Type":"SpotFleetMonitoring","UpdateType":"Immutable"},"NetworkInterfaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-networkinterfaces","DuplicatesAllowed":false,"ItemType":"InstanceNetworkInterfaceSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-placement","Required":false,"Type":"SpotPlacement","UpdateType":"Immutable"},"RamdiskId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-ramdiskid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-securitygroups","DuplicatesAllowed":false,"ItemType":"GroupIdentifier","Required":false,"Type":"List","UpdateType":"Immutable"},"SpotPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-spotprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TagSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-tagspecifications","DuplicatesAllowed":false,"ItemType":"SpotFleetTagSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"UserData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-userdata","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"WeightedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-weightedcapacity","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.SpotFleetMonitoring":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetmonitoring.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetmonitoring.html#cfn-ec2-spotfleet-spotfleetmonitoring-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.SpotFleetRequestConfigData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html","Properties":{"AllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-allocationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Context":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-context","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExcessCapacityTerminationPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-excesscapacityterminationpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IamFleetRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-iamfleetrole","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InstanceInterruptionBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-instanceinterruptionbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstancePoolsToUseCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-instancepoolstousecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"LaunchSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-launchspecifications","DuplicatesAllowed":false,"ItemType":"SpotFleetLaunchSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"LaunchTemplateConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-launchtemplateconfigs","DuplicatesAllowed":false,"ItemType":"LaunchTemplateConfig","Required":false,"Type":"List","UpdateType":"Immutable"},"LoadBalancersConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-loadbalancersconfig","Required":false,"Type":"LoadBalancersConfig","UpdateType":"Immutable"},"OnDemandAllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-ondemandallocationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OnDemandMaxTotalPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-ondemandmaxtotalprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OnDemandTargetCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-ondemandtargetcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ReplaceUnhealthyInstances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-replaceunhealthyinstances","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"SpotMaintenanceStrategies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-spotmaintenancestrategies","Required":false,"Type":"SpotMaintenanceStrategies","UpdateType":"Immutable"},"SpotMaxTotalPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-spotmaxtotalprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SpotPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-spotprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TagSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-tagspecifications","DuplicatesAllowed":false,"ItemType":"SpotFleetTagSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"TargetCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-targetcapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"TargetCapacityUnitType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-targetcapacityunittype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TerminateInstancesWithExpiration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-terminateinstanceswithexpiration","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ValidFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-validfrom","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ValidUntil":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-validuntil","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.SpotFleetTagSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleettagspecification.html","Properties":{"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleettagspecification.html#cfn-ec2-spotfleet-spotfleettagspecification-resourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleettagspecification.html#cfn-ec2-spotfleet-spotfleettagspecification-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.SpotMaintenanceStrategies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotmaintenancestrategies.html","Properties":{"CapacityRebalance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotmaintenancestrategies.html#cfn-ec2-spotfleet-spotmaintenancestrategies-capacityrebalance","Required":false,"Type":"SpotCapacityRebalance","UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.SpotPlacement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotplacement.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotplacement.html#cfn-ec2-spotfleet-spotplacement-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotplacement.html#cfn-ec2-spotfleet-spotplacement-groupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tenancy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotplacement.html#cfn-ec2-spotfleet-spotplacement-tenancy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.TargetGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-targetgroup.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-targetgroup.html#cfn-ec2-spotfleet-targetgroup-arn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.TargetGroupsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-targetgroupsconfig.html","Properties":{"TargetGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-targetgroupsconfig.html#cfn-ec2-spotfleet-targetgroupsconfig-targetgroups","DuplicatesAllowed":false,"ItemType":"TargetGroup","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.TotalLocalStorageGBRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-totallocalstoragegbrequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-totallocalstoragegbrequest.html#cfn-ec2-spotfleet-totallocalstoragegbrequest-max","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-totallocalstoragegbrequest.html#cfn-ec2-spotfleet-totallocalstoragegbrequest-min","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SpotFleet.VCpuCountRangeRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-vcpucountrangerequest.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-vcpucountrangerequest.html#cfn-ec2-spotfleet-vcpucountrangerequest-max","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-vcpucountrangerequest.html#cfn-ec2-spotfleet-vcpucountrangerequest-min","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::Subnet.PrivateDnsNameOptionsOnLaunch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-subnet-privatednsnameoptionsonlaunch.html","Properties":{"EnableResourceNameDnsAAAARecord":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-subnet-privatednsnameoptionsonlaunch.html#cfn-ec2-subnet-privatednsnameoptionsonlaunch-enableresourcenamednsaaaarecord","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableResourceNameDnsARecord":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-subnet-privatednsnameoptionsonlaunch.html#cfn-ec2-subnet-privatednsnameoptionsonlaunch-enableresourcenamednsarecord","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HostnameType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-subnet-privatednsnameoptionsonlaunch.html#cfn-ec2-subnet-privatednsnameoptionsonlaunch-hostnametype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::TrafficMirrorFilterRule.TrafficMirrorPortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-trafficmirrorfilterrule-trafficmirrorportrange.html","Properties":{"FromPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-trafficmirrorfilterrule-trafficmirrorportrange.html#cfn-ec2-trafficmirrorfilterrule-trafficmirrorportrange-fromport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ToPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-trafficmirrorfilterrule-trafficmirrorportrange.html#cfn-ec2-trafficmirrorfilterrule-trafficmirrorportrange-toport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::TransitGatewayAttachment.Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewayattachment-options.html","Properties":{"ApplianceModeSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewayattachment-options.html#cfn-ec2-transitgatewayattachment-options-appliancemodesupport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DnsSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewayattachment-options.html#cfn-ec2-transitgatewayattachment-options-dnssupport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ipv6Support":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewayattachment-options.html#cfn-ec2-transitgatewayattachment-options-ipv6support","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::TransitGatewayConnect.TransitGatewayConnectOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewayconnect-transitgatewayconnectoptions.html","Properties":{"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewayconnect-transitgatewayconnectoptions.html#cfn-ec2-transitgatewayconnect-transitgatewayconnectoptions-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayMulticastDomain.Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewaymulticastdomain-options.html","Properties":{"AutoAcceptSharedAssociations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewaymulticastdomain-options.html#cfn-ec2-transitgatewaymulticastdomain-options-autoacceptsharedassociations","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Igmpv2Support":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewaymulticastdomain-options.html#cfn-ec2-transitgatewaymulticastdomain-options-igmpv2support","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StaticSourcesSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewaymulticastdomain-options.html#cfn-ec2-transitgatewaymulticastdomain-options-staticsourcessupport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::TransitGatewayPeeringAttachment.PeeringAttachmentStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewaypeeringattachment-peeringattachmentstatus.html","Properties":{"Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewaypeeringattachment-peeringattachmentstatus.html#cfn-ec2-transitgatewaypeeringattachment-peeringattachmentstatus-code","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewaypeeringattachment-peeringattachmentstatus.html#cfn-ec2-transitgatewaypeeringattachment-peeringattachmentstatus-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::TransitGatewayVpcAttachment.Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewayvpcattachment-options.html","Properties":{"ApplianceModeSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewayvpcattachment-options.html#cfn-ec2-transitgatewayvpcattachment-options-appliancemodesupport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DnsSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewayvpcattachment-options.html#cfn-ec2-transitgatewayvpcattachment-options-dnssupport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ipv6Support":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-transitgatewayvpcattachment-options.html#cfn-ec2-transitgatewayvpcattachment-options-ipv6support","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::VPNConnection.VpnTunnelOptionsSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-vpnconnection-vpntunneloptionsspecification.html","Properties":{"PreSharedKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-vpnconnection-vpntunneloptionsspecification.html#cfn-ec2-vpnconnection-vpntunneloptionsspecification-presharedkey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TunnelInsideCidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-vpnconnection-vpntunneloptionsspecification.html#cfn-ec2-vpnconnection-vpntunneloptionsspecification-tunnelinsidecidr","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::VerifiedAccessEndpoint.LoadBalancerOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessendpoint-loadbalanceroptions.html","Properties":{"LoadBalancerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessendpoint-loadbalanceroptions.html#cfn-ec2-verifiedaccessendpoint-loadbalanceroptions-loadbalancerarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessendpoint-loadbalanceroptions.html#cfn-ec2-verifiedaccessendpoint-loadbalanceroptions-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessendpoint-loadbalanceroptions.html#cfn-ec2-verifiedaccessendpoint-loadbalanceroptions-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessendpoint-loadbalanceroptions.html#cfn-ec2-verifiedaccessendpoint-loadbalanceroptions-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::VerifiedAccessEndpoint.NetworkInterfaceOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessendpoint-networkinterfaceoptions.html","Properties":{"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessendpoint-networkinterfaceoptions.html#cfn-ec2-verifiedaccessendpoint-networkinterfaceoptions-networkinterfaceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessendpoint-networkinterfaceoptions.html#cfn-ec2-verifiedaccessendpoint-networkinterfaceoptions-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessendpoint-networkinterfaceoptions.html#cfn-ec2-verifiedaccessendpoint-networkinterfaceoptions-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::VerifiedAccessInstance.CloudWatchLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-cloudwatchlogs.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-cloudwatchlogs.html#cfn-ec2-verifiedaccessinstance-cloudwatchlogs-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LogGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-cloudwatchlogs.html#cfn-ec2-verifiedaccessinstance-cloudwatchlogs-loggroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::VerifiedAccessInstance.KinesisDataFirehose":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-kinesisdatafirehose.html","Properties":{"DeliveryStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-kinesisdatafirehose.html#cfn-ec2-verifiedaccessinstance-kinesisdatafirehose-deliverystream","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-kinesisdatafirehose.html#cfn-ec2-verifiedaccessinstance-kinesisdatafirehose-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::VerifiedAccessInstance.S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-s3.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-s3.html#cfn-ec2-verifiedaccessinstance-s3-bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BucketOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-s3.html#cfn-ec2-verifiedaccessinstance-s3-bucketowner","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-s3.html#cfn-ec2-verifiedaccessinstance-s3-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-s3.html#cfn-ec2-verifiedaccessinstance-s3-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::VerifiedAccessInstance.VerifiedAccessLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesslogs.html","Properties":{"CloudWatchLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesslogs.html#cfn-ec2-verifiedaccessinstance-verifiedaccesslogs-cloudwatchlogs","Required":false,"Type":"CloudWatchLogs","UpdateType":"Mutable"},"IncludeTrustContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesslogs.html#cfn-ec2-verifiedaccessinstance-verifiedaccesslogs-includetrustcontext","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"KinesisDataFirehose":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesslogs.html#cfn-ec2-verifiedaccessinstance-verifiedaccesslogs-kinesisdatafirehose","Required":false,"Type":"KinesisDataFirehose","UpdateType":"Mutable"},"LogVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesslogs.html#cfn-ec2-verifiedaccessinstance-verifiedaccesslogs-logversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesslogs.html#cfn-ec2-verifiedaccessinstance-verifiedaccesslogs-s3","Required":false,"Type":"S3","UpdateType":"Mutable"}}},"AWS::EC2::VerifiedAccessInstance.VerifiedAccessTrustProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesstrustprovider.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccessinstance-verifiedaccesstrustprovider-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceTrustProviderType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccessinstance-verifiedaccesstrustprovider-devicetrustprovidertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TrustProviderType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccessinstance-verifiedaccesstrustprovider-trustprovidertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserTrustProviderType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccessinstance-verifiedaccesstrustprovider-usertrustprovidertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerifiedAccessTrustProviderId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccessinstance-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccessinstance-verifiedaccesstrustprovider-verifiedaccesstrustproviderid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::VerifiedAccessTrustProvider.DeviceOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-deviceoptions.html","Properties":{"TenantId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-deviceoptions.html#cfn-ec2-verifiedaccesstrustprovider-deviceoptions-tenantid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::VerifiedAccessTrustProvider.OidcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-oidcoptions.html","Properties":{"AuthorizationEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-oidcoptions.html#cfn-ec2-verifiedaccesstrustprovider-oidcoptions-authorizationendpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-oidcoptions.html#cfn-ec2-verifiedaccesstrustprovider-oidcoptions-clientid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-oidcoptions.html#cfn-ec2-verifiedaccesstrustprovider-oidcoptions-clientsecret","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Issuer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-oidcoptions.html#cfn-ec2-verifiedaccesstrustprovider-oidcoptions-issuer","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-oidcoptions.html#cfn-ec2-verifiedaccesstrustprovider-oidcoptions-scope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-oidcoptions.html#cfn-ec2-verifiedaccesstrustprovider-oidcoptions-tokenendpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserInfoEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-verifiedaccesstrustprovider-oidcoptions.html#cfn-ec2-verifiedaccesstrustprovider-oidcoptions-userinfoendpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ECR::PublicRepository.RepositoryCatalogData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-publicrepository-repositorycatalogdata.html","Properties":{"AboutText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-publicrepository-repositorycatalogdata.html#cfn-ecr-publicrepository-repositorycatalogdata-abouttext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Architectures":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-publicrepository-repositorycatalogdata.html#cfn-ecr-publicrepository-repositorycatalogdata-architectures","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OperatingSystems":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-publicrepository-repositorycatalogdata.html#cfn-ecr-publicrepository-repositorycatalogdata-operatingsystems","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RepositoryDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-publicrepository-repositorycatalogdata.html#cfn-ecr-publicrepository-repositorycatalogdata-repositorydescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UsageText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-publicrepository-repositorycatalogdata.html#cfn-ecr-publicrepository-repositorycatalogdata-usagetext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ECR::ReplicationConfiguration.ReplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-replicationconfiguration.html","Properties":{"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-replicationconfiguration.html#cfn-ecr-replicationconfiguration-replicationconfiguration-rules","DuplicatesAllowed":true,"ItemType":"ReplicationRule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::ECR::ReplicationConfiguration.ReplicationDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-replicationdestination.html","Properties":{"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-replicationdestination.html#cfn-ecr-replicationconfiguration-replicationdestination-region","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RegistryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-replicationdestination.html#cfn-ecr-replicationconfiguration-replicationdestination-registryid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ECR::ReplicationConfiguration.ReplicationRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-replicationrule.html","Properties":{"Destinations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-replicationrule.html#cfn-ecr-replicationconfiguration-replicationrule-destinations","DuplicatesAllowed":true,"ItemType":"ReplicationDestination","Required":true,"Type":"List","UpdateType":"Mutable"},"RepositoryFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-replicationrule.html#cfn-ecr-replicationconfiguration-replicationrule-repositoryfilters","DuplicatesAllowed":true,"ItemType":"RepositoryFilter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ECR::ReplicationConfiguration.RepositoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-repositoryfilter.html","Properties":{"Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-repositoryfilter.html#cfn-ecr-replicationconfiguration-repositoryfilter-filter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FilterType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-repositoryfilter.html#cfn-ecr-replicationconfiguration-repositoryfilter-filtertype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ECR::Repository.EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-repository-encryptionconfiguration.html","Properties":{"EncryptionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-repository-encryptionconfiguration.html#cfn-ecr-repository-encryptionconfiguration-encryptiontype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KmsKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-repository-encryptionconfiguration.html#cfn-ecr-repository-encryptionconfiguration-kmskey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECR::Repository.ImageScanningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-repository-imagescanningconfiguration.html","Properties":{"ScanOnPush":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-repository-imagescanningconfiguration.html#cfn-ecr-repository-imagescanningconfiguration-scanonpush","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::ECR::Repository.LifecyclePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-repository-lifecyclepolicy.html","Properties":{"LifecyclePolicyText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-repository-lifecyclepolicy.html#cfn-ecr-repository-lifecyclepolicy-lifecyclepolicytext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RegistryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-repository-lifecyclepolicy.html#cfn-ecr-repository-lifecyclepolicy-registryid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::CapacityProvider.AutoScalingGroupProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-capacityprovider-autoscalinggroupprovider.html","Properties":{"AutoScalingGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-capacityprovider-autoscalinggroupprovider.html#cfn-ecs-capacityprovider-autoscalinggroupprovider-autoscalinggrouparn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ManagedScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-capacityprovider-autoscalinggroupprovider.html#cfn-ecs-capacityprovider-autoscalinggroupprovider-managedscaling","Required":false,"Type":"ManagedScaling","UpdateType":"Mutable"},"ManagedTerminationProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-capacityprovider-autoscalinggroupprovider.html#cfn-ecs-capacityprovider-autoscalinggroupprovider-managedterminationprotection","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::CapacityProvider.ManagedScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-capacityprovider-managedscaling.html","Properties":{"InstanceWarmupPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-capacityprovider-managedscaling.html#cfn-ecs-capacityprovider-managedscaling-instancewarmupperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumScalingStepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-capacityprovider-managedscaling.html#cfn-ecs-capacityprovider-managedscaling-maximumscalingstepsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinimumScalingStepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-capacityprovider-managedscaling.html#cfn-ecs-capacityprovider-managedscaling-minimumscalingstepsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-capacityprovider-managedscaling.html#cfn-ecs-capacityprovider-managedscaling-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-capacityprovider-managedscaling.html#cfn-ecs-capacityprovider-managedscaling-targetcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::Cluster.CapacityProviderStrategyItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-capacityproviderstrategyitem.html","Properties":{"Base":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-capacityproviderstrategyitem.html#cfn-ecs-cluster-capacityproviderstrategyitem-base","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CapacityProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-capacityproviderstrategyitem.html#cfn-ecs-cluster-capacityproviderstrategyitem-capacityprovider","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-capacityproviderstrategyitem.html#cfn-ecs-cluster-capacityproviderstrategyitem-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::Cluster.ClusterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-clusterconfiguration.html","Properties":{"ExecuteCommandConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-clusterconfiguration.html#cfn-ecs-cluster-clusterconfiguration-executecommandconfiguration","Required":false,"Type":"ExecuteCommandConfiguration","UpdateType":"Mutable"}}},"AWS::ECS::Cluster.ClusterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-clustersettings.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-clustersettings.html#cfn-ecs-cluster-clustersettings-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-clustersettings.html#cfn-ecs-cluster-clustersettings-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::Cluster.ExecuteCommandConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-executecommandconfiguration.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-executecommandconfiguration.html#cfn-ecs-cluster-executecommandconfiguration-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-executecommandconfiguration.html#cfn-ecs-cluster-executecommandconfiguration-logconfiguration","Required":false,"Type":"ExecuteCommandLogConfiguration","UpdateType":"Mutable"},"Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-executecommandconfiguration.html#cfn-ecs-cluster-executecommandconfiguration-logging","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::Cluster.ExecuteCommandLogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-executecommandlogconfiguration.html","Properties":{"CloudWatchEncryptionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-executecommandlogconfiguration.html#cfn-ecs-cluster-executecommandlogconfiguration-cloudwatchencryptionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CloudWatchLogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-executecommandlogconfiguration.html#cfn-ecs-cluster-executecommandlogconfiguration-cloudwatchloggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-executecommandlogconfiguration.html#cfn-ecs-cluster-executecommandlogconfiguration-s3bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3EncryptionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-executecommandlogconfiguration.html#cfn-ecs-cluster-executecommandlogconfiguration-s3encryptionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"S3KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-executecommandlogconfiguration.html#cfn-ecs-cluster-executecommandlogconfiguration-s3keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::Cluster.ServiceConnectDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-serviceconnectdefaults.html","Properties":{"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-cluster-serviceconnectdefaults.html#cfn-ecs-cluster-serviceconnectdefaults-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::ClusterCapacityProviderAssociations.CapacityProviderStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-clustercapacityproviderassociations-capacityproviderstrategy.html","Properties":{"Base":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-clustercapacityproviderassociations-capacityproviderstrategy.html#cfn-ecs-clustercapacityproviderassociations-capacityproviderstrategy-base","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CapacityProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-clustercapacityproviderassociations-capacityproviderstrategy.html#cfn-ecs-clustercapacityproviderassociations-capacityproviderstrategy-capacityprovider","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-clustercapacityproviderassociations-capacityproviderstrategy.html#cfn-ecs-clustercapacityproviderassociations-capacityproviderstrategy-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::Service.AwsVpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-awsvpcconfiguration.html","Properties":{"AssignPublicIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-awsvpcconfiguration.html#cfn-ecs-service-awsvpcconfiguration-assignpublicip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-awsvpcconfiguration.html#cfn-ecs-service-awsvpcconfiguration-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-awsvpcconfiguration.html#cfn-ecs-service-awsvpcconfiguration-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::ECS::Service.CapacityProviderStrategyItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-capacityproviderstrategyitem.html","Properties":{"Base":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-capacityproviderstrategyitem.html#cfn-ecs-service-capacityproviderstrategyitem-base","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CapacityProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-capacityproviderstrategyitem.html#cfn-ecs-service-capacityproviderstrategyitem-capacityprovider","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-capacityproviderstrategyitem.html#cfn-ecs-service-capacityproviderstrategyitem-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::Service.DeploymentAlarms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentalarms.html","Properties":{"AlarmNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentalarms.html#cfn-ecs-service-deploymentalarms-alarmnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Enable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentalarms.html#cfn-ecs-service-deploymentalarms-enable","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Rollback":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentalarms.html#cfn-ecs-service-deploymentalarms-rollback","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::ECS::Service.DeploymentCircuitBreaker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentcircuitbreaker.html","Properties":{"Enable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentcircuitbreaker.html#cfn-ecs-service-deploymentcircuitbreaker-enable","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Rollback":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentcircuitbreaker.html#cfn-ecs-service-deploymentcircuitbreaker-rollback","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::ECS::Service.DeploymentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentconfiguration.html","Properties":{"Alarms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentconfiguration.html#cfn-ecs-service-deploymentconfiguration-alarms","Required":false,"Type":"DeploymentAlarms","UpdateType":"Mutable"},"DeploymentCircuitBreaker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentconfiguration.html#cfn-ecs-service-deploymentconfiguration-deploymentcircuitbreaker","Required":false,"Type":"DeploymentCircuitBreaker","UpdateType":"Mutable"},"MaximumPercent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentconfiguration.html#cfn-ecs-service-deploymentconfiguration-maximumpercent","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinimumHealthyPercent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentconfiguration.html#cfn-ecs-service-deploymentconfiguration-minimumhealthypercent","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::Service.DeploymentController":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentcontroller.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-deploymentcontroller.html#cfn-ecs-service-deploymentcontroller-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::Service.LoadBalancer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-loadbalancer.html","Properties":{"ContainerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-loadbalancer.html#cfn-ecs-service-loadbalancer-containername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContainerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-loadbalancer.html#cfn-ecs-service-loadbalancer-containerport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"LoadBalancerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-loadbalancer.html#cfn-ecs-service-loadbalancer-loadbalancername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-loadbalancer.html#cfn-ecs-service-loadbalancer-targetgrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::Service.LogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-logconfiguration.html","Properties":{"LogDriver":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-logconfiguration.html#cfn-ecs-service-logconfiguration-logdriver","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-logconfiguration.html#cfn-ecs-service-logconfiguration-options","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"SecretOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-logconfiguration.html#cfn-ecs-service-logconfiguration-secretoptions","DuplicatesAllowed":true,"ItemType":"Secret","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ECS::Service.NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-networkconfiguration.html","Properties":{"AwsvpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-networkconfiguration.html#cfn-ecs-service-networkconfiguration-awsvpcconfiguration","Required":false,"Type":"AwsVpcConfiguration","UpdateType":"Mutable"}}},"AWS::ECS::Service.PlacementConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-placementconstraint.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-placementconstraint.html#cfn-ecs-service-placementconstraint-expression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-placementconstraint.html#cfn-ecs-service-placementconstraint-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ECS::Service.PlacementStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-placementstrategy.html","Properties":{"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-placementstrategy.html#cfn-ecs-service-placementstrategy-field","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-placementstrategy.html#cfn-ecs-service-placementstrategy-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ECS::Service.Secret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-secret.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-secret.html#cfn-ecs-service-secret-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-secret.html#cfn-ecs-service-secret-valuefrom","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ECS::Service.ServiceConnectClientAlias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectclientalias.html","Properties":{"DnsName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectclientalias.html#cfn-ecs-service-serviceconnectclientalias-dnsname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectclientalias.html#cfn-ecs-service-serviceconnectclientalias-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::ECS::Service.ServiceConnectConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectconfiguration.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectconfiguration.html#cfn-ecs-service-serviceconnectconfiguration-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"LogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectconfiguration.html#cfn-ecs-service-serviceconnectconfiguration-logconfiguration","Required":false,"Type":"LogConfiguration","UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectconfiguration.html#cfn-ecs-service-serviceconnectconfiguration-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Services":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectconfiguration.html#cfn-ecs-service-serviceconnectconfiguration-services","DuplicatesAllowed":true,"ItemType":"ServiceConnectService","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ECS::Service.ServiceConnectService":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectservice.html","Properties":{"ClientAliases":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectservice.html#cfn-ecs-service-serviceconnectservice-clientaliases","DuplicatesAllowed":true,"ItemType":"ServiceConnectClientAlias","Required":false,"Type":"List","UpdateType":"Mutable"},"DiscoveryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectservice.html#cfn-ecs-service-serviceconnectservice-discoveryname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IngressPortOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectservice.html#cfn-ecs-service-serviceconnectservice-ingressportoverride","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PortName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceconnectservice.html#cfn-ecs-service-serviceconnectservice-portname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ECS::Service.ServiceRegistry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceregistry.html","Properties":{"ContainerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceregistry.html#cfn-ecs-service-serviceregistry-containername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContainerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceregistry.html#cfn-ecs-service-serviceregistry-containerport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceregistry.html#cfn-ecs-service-serviceregistry-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RegistryArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceregistry.html#cfn-ecs-service-serviceregistry-registryarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::TaskDefinition.AuthorizationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-authorizationconfig.html","Properties":{"AccessPointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-authorizationconfig.html#cfn-ecs-taskdefinition-authorizationconfig-accesspointid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IAM":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-authorizationconfig.html#cfn-ecs-taskdefinition-authorizationconfig-iam","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.ContainerDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html","Properties":{"Command":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-command","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Cpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-cpu","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"DependsOn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-dependson","DuplicatesAllowed":true,"ItemType":"ContainerDependency","Required":false,"Type":"List","UpdateType":"Immutable"},"DisableNetworking":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-disablenetworking","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DnsSearchDomains":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-dnssearchdomains","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"DnsServers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-dnsservers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"DockerLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-dockerlabels","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"DockerSecurityOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-dockersecurityoptions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"EntryPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-entrypoint","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-environment","DuplicatesAllowed":false,"ItemType":"KeyValuePair","Required":false,"Type":"List","UpdateType":"Immutable"},"EnvironmentFiles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-environmentfiles","DuplicatesAllowed":true,"ItemType":"EnvironmentFile","Required":false,"Type":"List","UpdateType":"Immutable"},"Essential":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-essential","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ExtraHosts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-extrahosts","DuplicatesAllowed":true,"ItemType":"HostEntry","Required":false,"Type":"List","UpdateType":"Immutable"},"FirelensConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-firelensconfiguration","Required":false,"Type":"FirelensConfiguration","UpdateType":"Immutable"},"HealthCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-healthcheck","Required":false,"Type":"HealthCheck","UpdateType":"Immutable"},"Hostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-hostname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Image":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-image","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Interactive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-interactive","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Links":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-links","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"LinuxParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-linuxparameters","Required":false,"Type":"LinuxParameters","UpdateType":"Immutable"},"LogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-logconfiguration","Required":false,"Type":"LogConfiguration","UpdateType":"Immutable"},"Memory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-memory","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MemoryReservation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-memoryreservation","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MountPoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-mountpoints","DuplicatesAllowed":false,"ItemType":"MountPoint","Required":false,"Type":"List","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PortMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-portmappings","DuplicatesAllowed":false,"ItemType":"PortMapping","Required":false,"Type":"List","UpdateType":"Immutable"},"Privileged":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-privileged","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"PseudoTerminal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-pseudoterminal","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ReadonlyRootFilesystem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-readonlyrootfilesystem","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"RepositoryCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-repositorycredentials","Required":false,"Type":"RepositoryCredentials","UpdateType":"Immutable"},"ResourceRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-resourcerequirements","DuplicatesAllowed":true,"ItemType":"ResourceRequirement","Required":false,"Type":"List","UpdateType":"Immutable"},"Secrets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-secrets","DuplicatesAllowed":true,"ItemType":"Secret","Required":false,"Type":"List","UpdateType":"Immutable"},"StartTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-starttimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"StopTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-stoptimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SystemControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-systemcontrols","DuplicatesAllowed":true,"ItemType":"SystemControl","Required":false,"Type":"List","UpdateType":"Immutable"},"Ulimits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-ulimits","DuplicatesAllowed":true,"ItemType":"Ulimit","Required":false,"Type":"List","UpdateType":"Immutable"},"User":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-user","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VolumesFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-volumesfrom","DuplicatesAllowed":false,"ItemType":"VolumeFrom","Required":false,"Type":"List","UpdateType":"Immutable"},"WorkingDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-workingdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.ContainerDependency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdependency.html","Properties":{"Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdependency.html#cfn-ecs-taskdefinition-containerdependency-condition","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ContainerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdependency.html#cfn-ecs-taskdefinition-containerdependency-containername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.Device":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-device.html","Properties":{"ContainerPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-device.html#cfn-ecs-taskdefinition-device-containerpath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"HostPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-device.html#cfn-ecs-taskdefinition-device-hostpath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-device.html#cfn-ecs-taskdefinition-device-permissions","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.DockerVolumeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-dockervolumeconfiguration.html","Properties":{"Autoprovision":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-dockervolumeconfiguration.html#cfn-ecs-taskdefinition-dockervolumeconfiguration-autoprovision","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Driver":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-dockervolumeconfiguration.html#cfn-ecs-taskdefinition-dockervolumeconfiguration-driver","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DriverOpts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-dockervolumeconfiguration.html#cfn-ecs-taskdefinition-dockervolumeconfiguration-driveropts","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Labels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-dockervolumeconfiguration.html#cfn-ecs-taskdefinition-dockervolumeconfiguration-labels","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-dockervolumeconfiguration.html#cfn-ecs-taskdefinition-dockervolumeconfiguration-scope","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.EFSVolumeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-efsvolumeconfiguration.html","Properties":{"AuthorizationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-efsvolumeconfiguration.html#cfn-ecs-taskdefinition-efsvolumeconfiguration-authorizationconfig","Required":false,"Type":"AuthorizationConfig","UpdateType":"Immutable"},"FilesystemId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-efsvolumeconfiguration.html#cfn-ecs-taskdefinition-efsvolumeconfiguration-filesystemid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RootDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-efsvolumeconfiguration.html#cfn-ecs-taskdefinition-efsvolumeconfiguration-rootdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TransitEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-efsvolumeconfiguration.html#cfn-ecs-taskdefinition-efsvolumeconfiguration-transitencryption","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TransitEncryptionPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-efsvolumeconfiguration.html#cfn-ecs-taskdefinition-efsvolumeconfiguration-transitencryptionport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.EnvironmentFile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-environmentfile.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-environmentfile.html#cfn-ecs-taskdefinition-environmentfile-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-environmentfile.html#cfn-ecs-taskdefinition-environmentfile-value","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.EphemeralStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-ephemeralstorage.html","Properties":{"SizeInGiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-ephemeralstorage.html#cfn-ecs-taskdefinition-ephemeralstorage-sizeingib","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.FirelensConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-firelensconfiguration.html","Properties":{"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-firelensconfiguration.html#cfn-ecs-taskdefinition-firelensconfiguration-options","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-firelensconfiguration.html#cfn-ecs-taskdefinition-firelensconfiguration-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.HealthCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-healthcheck.html","Properties":{"Command":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-healthcheck.html#cfn-ecs-taskdefinition-healthcheck-command","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-healthcheck.html#cfn-ecs-taskdefinition-healthcheck-interval","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Retries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-healthcheck.html#cfn-ecs-taskdefinition-healthcheck-retries","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"StartPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-healthcheck.html#cfn-ecs-taskdefinition-healthcheck-startperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-healthcheck.html#cfn-ecs-taskdefinition-healthcheck-timeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.HostEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-hostentry.html","Properties":{"Hostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-hostentry.html#cfn-ecs-taskdefinition-hostentry-hostname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-hostentry.html#cfn-ecs-taskdefinition-hostentry-ipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.HostVolumeProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-hostvolumeproperties.html","Properties":{"SourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-hostvolumeproperties.html#cfn-ecs-taskdefinition-hostvolumeproperties-sourcepath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.InferenceAccelerator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-inferenceaccelerator.html","Properties":{"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-inferenceaccelerator.html#cfn-ecs-taskdefinition-inferenceaccelerator-devicename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeviceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-inferenceaccelerator.html#cfn-ecs-taskdefinition-inferenceaccelerator-devicetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.KernelCapabilities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-kernelcapabilities.html","Properties":{"Add":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-kernelcapabilities.html#cfn-ecs-taskdefinition-kernelcapabilities-add","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Drop":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-kernelcapabilities.html#cfn-ecs-taskdefinition-kernelcapabilities-drop","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.KeyValuePair":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-keyvaluepair.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-keyvaluepair.html#cfn-ecs-taskdefinition-keyvaluepair-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-keyvaluepair.html#cfn-ecs-taskdefinition-keyvaluepair-value","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.LinuxParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-linuxparameters.html","Properties":{"Capabilities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-linuxparameters.html#cfn-ecs-taskdefinition-linuxparameters-capabilities","Required":false,"Type":"KernelCapabilities","UpdateType":"Immutable"},"Devices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-linuxparameters.html#cfn-ecs-taskdefinition-linuxparameters-devices","DuplicatesAllowed":true,"ItemType":"Device","Required":false,"Type":"List","UpdateType":"Immutable"},"InitProcessEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-linuxparameters.html#cfn-ecs-taskdefinition-linuxparameters-initprocessenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"MaxSwap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-linuxparameters.html#cfn-ecs-taskdefinition-linuxparameters-maxswap","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SharedMemorySize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-linuxparameters.html#cfn-ecs-taskdefinition-linuxparameters-sharedmemorysize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Swappiness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-linuxparameters.html#cfn-ecs-taskdefinition-linuxparameters-swappiness","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Tmpfs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-linuxparameters.html#cfn-ecs-taskdefinition-linuxparameters-tmpfs","DuplicatesAllowed":true,"ItemType":"Tmpfs","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.LogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-logconfiguration.html","Properties":{"LogDriver":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-logconfiguration.html#cfn-ecs-taskdefinition-logconfiguration-logdriver","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinitions-logconfiguration.html#cfn-ecs-taskdefinition-containerdefinition-logconfiguration-options","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"SecretOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-logconfiguration.html#cfn-ecs-taskdefinition-logconfiguration-secretoptions","DuplicatesAllowed":true,"ItemType":"Secret","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.MountPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-mountpoint.html","Properties":{"ContainerPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-mountpoint.html#cfn-ecs-taskdefinition-mountpoint-containerpath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ReadOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-mountpoint.html#cfn-ecs-taskdefinition-mountpoint-readonly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"SourceVolume":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-mountpoint.html#cfn-ecs-taskdefinition-mountpoint-sourcevolume","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.PortMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-portmapping.html","Properties":{"AppProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-appprotocol","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ContainerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ContainerPortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerportrange","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"HostPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-hostport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.ProxyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-proxyconfiguration.html","Properties":{"ContainerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-proxyconfiguration.html#cfn-ecs-taskdefinition-proxyconfiguration-containername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProxyConfigurationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-proxyconfiguration.html#cfn-ecs-taskdefinition-proxyconfiguration-proxyconfigurationproperties","DuplicatesAllowed":false,"ItemType":"KeyValuePair","Required":false,"Type":"List","UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-proxyconfiguration.html#cfn-ecs-taskdefinition-proxyconfiguration-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.RepositoryCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-repositorycredentials.html","Properties":{"CredentialsParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-repositorycredentials.html#cfn-ecs-taskdefinition-repositorycredentials-credentialsparameter","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.ResourceRequirement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-resourcerequirement.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-resourcerequirement.html#cfn-ecs-taskdefinition-resourcerequirement-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-resourcerequirement.html#cfn-ecs-taskdefinition-resourcerequirement-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.RuntimePlatform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-runtimeplatform.html","Properties":{"CpuArchitecture":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-runtimeplatform.html#cfn-ecs-taskdefinition-runtimeplatform-cpuarchitecture","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OperatingSystemFamily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-runtimeplatform.html#cfn-ecs-taskdefinition-runtimeplatform-operatingsystemfamily","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.Secret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-secret.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-secret.html#cfn-ecs-taskdefinition-secret-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ValueFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-secret.html#cfn-ecs-taskdefinition-secret-valuefrom","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.SystemControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-systemcontrol.html","Properties":{"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-systemcontrol.html#cfn-ecs-taskdefinition-systemcontrol-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-systemcontrol.html#cfn-ecs-taskdefinition-systemcontrol-value","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.TaskDefinitionPlacementConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-taskdefinitionplacementconstraint.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-taskdefinitionplacementconstraint.html#cfn-ecs-taskdefinition-taskdefinitionplacementconstraint-expression","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-taskdefinitionplacementconstraint.html#cfn-ecs-taskdefinition-taskdefinitionplacementconstraint-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.Tmpfs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-tmpfs.html","Properties":{"ContainerPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-tmpfs.html#cfn-ecs-taskdefinition-tmpfs-containerpath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-tmpfs.html#cfn-ecs-taskdefinition-tmpfs-mountoptions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-tmpfs.html#cfn-ecs-taskdefinition-tmpfs-size","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.Ulimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-ulimit.html","Properties":{"HardLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-ulimit.html#cfn-ecs-taskdefinition-ulimit-hardlimit","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-ulimit.html#cfn-ecs-taskdefinition-ulimit-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SoftLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-ulimit.html#cfn-ecs-taskdefinition-ulimit-softlimit","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.Volume":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-volume.html","Properties":{"DockerVolumeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-volume.html#cfn-ecs-taskdefinition-volume-dockervolumeconfiguration","Required":false,"Type":"DockerVolumeConfiguration","UpdateType":"Immutable"},"EFSVolumeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-volume.html#cfn-ecs-taskdefinition-volume-efsvolumeconfiguration","Required":false,"Type":"EFSVolumeConfiguration","UpdateType":"Immutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-volume.html#cfn-ecs-taskdefinition-volume-host","Required":false,"Type":"HostVolumeProperties","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-volume.html#cfn-ecs-taskdefinition-volume-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskDefinition.VolumeFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-volumefrom.html","Properties":{"ReadOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-volumefrom.html#cfn-ecs-taskdefinition-volumefrom-readonly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"SourceContainer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-volumefrom.html#cfn-ecs-taskdefinition-volumefrom-sourcecontainer","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskSet.AwsVpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-awsvpcconfiguration.html","Properties":{"AssignPublicIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-awsvpcconfiguration.html#cfn-ecs-taskset-awsvpcconfiguration-assignpublicip","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-awsvpcconfiguration.html#cfn-ecs-taskset-awsvpcconfiguration-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-awsvpcconfiguration.html#cfn-ecs-taskset-awsvpcconfiguration-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::ECS::TaskSet.LoadBalancer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-loadbalancer.html","Properties":{"ContainerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-loadbalancer.html#cfn-ecs-taskset-loadbalancer-containername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ContainerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-loadbalancer.html#cfn-ecs-taskset-loadbalancer-containerport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"LoadBalancerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-loadbalancer.html#cfn-ecs-taskset-loadbalancer-loadbalancername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TargetGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-loadbalancer.html#cfn-ecs-taskset-loadbalancer-targetgrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECS::TaskSet.NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-networkconfiguration.html","Properties":{"AwsVpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-networkconfiguration.html#cfn-ecs-taskset-networkconfiguration-awsvpcconfiguration","Required":false,"Type":"AwsVpcConfiguration","UpdateType":"Immutable"}}},"AWS::ECS::TaskSet.Scale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-scale.html","Properties":{"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-scale.html#cfn-ecs-taskset-scale-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-scale.html#cfn-ecs-taskset-scale-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::TaskSet.ServiceRegistry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-serviceregistry.html","Properties":{"ContainerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-serviceregistry.html#cfn-ecs-taskset-serviceregistry-containername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ContainerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-serviceregistry.html#cfn-ecs-taskset-serviceregistry-containerport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-serviceregistry.html#cfn-ecs-taskset-serviceregistry-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"RegistryArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskset-serviceregistry.html#cfn-ecs-taskset-serviceregistry-registryarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EFS::AccessPoint.AccessPointTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-accesspointtag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-accesspointtag.html#cfn-efs-accesspoint-accesspointtag-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-accesspointtag.html#cfn-efs-accesspoint-accesspointtag-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EFS::AccessPoint.CreationInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-creationinfo.html","Properties":{"OwnerGid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-creationinfo.html#cfn-efs-accesspoint-creationinfo-ownergid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OwnerUid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-creationinfo.html#cfn-efs-accesspoint-creationinfo-owneruid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-creationinfo.html#cfn-efs-accesspoint-creationinfo-permissions","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EFS::AccessPoint.PosixUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-posixuser.html","Properties":{"Gid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-posixuser.html#cfn-efs-accesspoint-posixuser-gid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SecondaryGids":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-posixuser.html#cfn-efs-accesspoint-posixuser-secondarygids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Uid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-posixuser.html#cfn-efs-accesspoint-posixuser-uid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EFS::AccessPoint.RootDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-rootdirectory.html","Properties":{"CreationInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-rootdirectory.html#cfn-efs-accesspoint-rootdirectory-creationinfo","Required":false,"Type":"CreationInfo","UpdateType":"Immutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-accesspoint-rootdirectory.html#cfn-efs-accesspoint-rootdirectory-path","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EFS::FileSystem.BackupPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-filesystem-backuppolicy.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-filesystem-backuppolicy.html#cfn-efs-filesystem-backuppolicy-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EFS::FileSystem.ElasticFileSystemTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-filesystem-elasticfilesystemtag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-filesystem-elasticfilesystemtag.html#cfn-efs-filesystem-elasticfilesystemtag-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-filesystem-elasticfilesystemtag.html#cfn-efs-filesystem-elasticfilesystemtag-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EFS::FileSystem.LifecyclePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-filesystem-lifecyclepolicy.html","Properties":{"TransitionToIA":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-filesystem-lifecyclepolicy.html#cfn-efs-filesystem-lifecyclepolicy-transitiontoia","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TransitionToPrimaryStorageClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-filesystem-lifecyclepolicy.html#cfn-efs-filesystem-lifecyclepolicy-transitiontoprimarystorageclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EKS::Cluster.ClusterLogging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-clusterlogging.html","Properties":{"EnabledTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-clusterlogging.html#cfn-eks-cluster-clusterlogging-enabledtypes","DuplicatesAllowed":true,"ItemType":"LoggingTypeConfig","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EKS::Cluster.ControlPlanePlacement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-controlplaneplacement.html","Properties":{"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-controlplaneplacement.html#cfn-eks-cluster-controlplaneplacement-groupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EKS::Cluster.EncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-encryptionconfig.html","Properties":{"Provider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-encryptionconfig.html#cfn-eks-cluster-encryptionconfig-provider","Required":false,"Type":"Provider","UpdateType":"Immutable"},"Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-encryptionconfig.html#cfn-eks-cluster-encryptionconfig-resources","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EKS::Cluster.KubernetesNetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-kubernetesnetworkconfig.html","Properties":{"IpFamily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-kubernetesnetworkconfig.html#cfn-eks-cluster-kubernetesnetworkconfig-ipfamily","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServiceIpv4Cidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-kubernetesnetworkconfig.html#cfn-eks-cluster-kubernetesnetworkconfig-serviceipv4cidr","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServiceIpv6Cidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-kubernetesnetworkconfig.html#cfn-eks-cluster-kubernetesnetworkconfig-serviceipv6cidr","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EKS::Cluster.Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-logging.html","Properties":{"ClusterLogging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-logging.html#cfn-eks-cluster-logging-clusterlogging","Required":false,"Type":"ClusterLogging","UpdateType":"Mutable"}}},"AWS::EKS::Cluster.LoggingTypeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-loggingtypeconfig.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-loggingtypeconfig.html#cfn-eks-cluster-loggingtypeconfig-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EKS::Cluster.OutpostConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-outpostconfig.html","Properties":{"ControlPlaneInstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-outpostconfig.html#cfn-eks-cluster-outpostconfig-controlplaneinstancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ControlPlanePlacement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-outpostconfig.html#cfn-eks-cluster-outpostconfig-controlplaneplacement","Required":false,"Type":"ControlPlanePlacement","UpdateType":"Immutable"},"OutpostArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-outpostconfig.html#cfn-eks-cluster-outpostconfig-outpostarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::EKS::Cluster.Provider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-provider.html","Properties":{"KeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-provider.html#cfn-eks-cluster-provider-keyarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EKS::Cluster.ResourcesVpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html","Properties":{"EndpointPrivateAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-endpointprivateaccess","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EndpointPublicAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-endpointpublicaccess","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PublicAccessCidrs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-publicaccesscidrs","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::EKS::FargateProfile.Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-fargateprofile-label.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-fargateprofile-label.html#cfn-eks-fargateprofile-label-key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-fargateprofile-label.html#cfn-eks-fargateprofile-label-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EKS::FargateProfile.Selector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-fargateprofile-selector.html","Properties":{"Labels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-fargateprofile-selector.html#cfn-eks-fargateprofile-selector-labels","DuplicatesAllowed":true,"ItemType":"Label","Required":false,"Type":"List","UpdateType":"Immutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-fargateprofile-selector.html#cfn-eks-fargateprofile-selector-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EKS::IdentityProviderConfig.OidcIdentityProviderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html","Properties":{"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"GroupsClaim":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-groupsclaim","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GroupsPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-groupsprefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IssuerUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-issuerurl","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RequiredClaims":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-requiredclaims","DuplicatesAllowed":false,"ItemType":"RequiredClaim","Required":false,"Type":"List","UpdateType":"Immutable"},"UsernameClaim":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-usernameclaim","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"UsernamePrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-usernameprefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EKS::IdentityProviderConfig.RequiredClaim":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-requiredclaim.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-requiredclaim.html#cfn-eks-identityproviderconfig-requiredclaim-key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-requiredclaim.html#cfn-eks-identityproviderconfig-requiredclaim-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EKS::Nodegroup.LaunchTemplateSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-launchtemplatespecification.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-launchtemplatespecification.html#cfn-eks-nodegroup-launchtemplatespecification-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-launchtemplatespecification.html#cfn-eks-nodegroup-launchtemplatespecification-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-launchtemplatespecification.html#cfn-eks-nodegroup-launchtemplatespecification-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EKS::Nodegroup.RemoteAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-remoteaccess.html","Properties":{"Ec2SshKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-remoteaccess.html#cfn-eks-nodegroup-remoteaccess-ec2sshkey","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SourceSecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-remoteaccess.html#cfn-eks-nodegroup-remoteaccess-sourcesecuritygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EKS::Nodegroup.ScalingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-scalingconfig.html","Properties":{"DesiredSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-scalingconfig.html#cfn-eks-nodegroup-scalingconfig-desiredsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-scalingconfig.html#cfn-eks-nodegroup-scalingconfig-maxsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-scalingconfig.html#cfn-eks-nodegroup-scalingconfig-minsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EKS::Nodegroup.Taint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-taint.html","Properties":{"Effect":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-taint.html#cfn-eks-nodegroup-taint-effect","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-taint.html#cfn-eks-nodegroup-taint-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-taint.html#cfn-eks-nodegroup-taint-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EKS::Nodegroup.UpdateConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-updateconfig.html","Properties":{"MaxUnavailable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-updateconfig.html#cfn-eks-nodegroup-updateconfig-maxunavailable","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaxUnavailablePercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-updateconfig.html#cfn-eks-nodegroup-updateconfig-maxunavailablepercentage","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.Application":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-application.html","Properties":{"AdditionalInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-application.html#cfn-elasticmapreduce-cluster-application-additionalinfo","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Args":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-application.html#cfn-elasticmapreduce-cluster-application-args","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-application.html#cfn-elasticmapreduce-cluster-application-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-application.html#cfn-elasticmapreduce-cluster-application-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.AutoScalingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-autoscalingpolicy.html","Properties":{"Constraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-autoscalingpolicy.html#cfn-elasticmapreduce-cluster-autoscalingpolicy-constraints","Required":true,"Type":"ScalingConstraints","UpdateType":"Mutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-autoscalingpolicy.html#cfn-elasticmapreduce-cluster-autoscalingpolicy-rules","DuplicatesAllowed":false,"ItemType":"ScalingRule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::EMR::Cluster.AutoTerminationPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-autoterminationpolicy.html","Properties":{"IdleTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-autoterminationpolicy.html#cfn-elasticmapreduce-cluster-autoterminationpolicy-idletimeout","PrimitiveType":"Long","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.BootstrapActionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-bootstrapactionconfig.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-bootstrapactionconfig.html#cfn-elasticmapreduce-cluster-bootstrapactionconfig-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScriptBootstrapAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-bootstrapactionconfig.html#cfn-elasticmapreduce-cluster-bootstrapactionconfig-scriptbootstrapaction","Required":true,"Type":"ScriptBootstrapActionConfig","UpdateType":"Mutable"}}},"AWS::EMR::Cluster.CloudWatchAlarmDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-cloudwatchalarmdefinition.html","Properties":{"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-cluster-cloudwatchalarmdefinition-comparisonoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-cluster-cloudwatchalarmdefinition-dimensions","DuplicatesAllowed":false,"ItemType":"MetricDimension","Required":false,"Type":"List","UpdateType":"Mutable"},"EvaluationPeriods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-cluster-cloudwatchalarmdefinition-evaluationperiods","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-cluster-cloudwatchalarmdefinition-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-cluster-cloudwatchalarmdefinition-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Period":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-cluster-cloudwatchalarmdefinition-period","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Statistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-cluster-cloudwatchalarmdefinition-statistic","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-cluster-cloudwatchalarmdefinition-threshold","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-cluster-cloudwatchalarmdefinition-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.ComputeLimits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html","Properties":{"MaximumCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html#cfn-elasticmapreduce-cluster-computelimits-maximumcapacityunits","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MaximumCoreCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html#cfn-elasticmapreduce-cluster-computelimits-maximumcorecapacityunits","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumOnDemandCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html#cfn-elasticmapreduce-cluster-computelimits-maximumondemandcapacityunits","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinimumCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html#cfn-elasticmapreduce-cluster-computelimits-minimumcapacityunits","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"UnitType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-computelimits.html#cfn-elasticmapreduce-cluster-computelimits-unittype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-configuration.html","Properties":{"Classification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-configuration.html#cfn-elasticmapreduce-cluster-configuration-classification","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConfigurationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-configuration.html#cfn-elasticmapreduce-cluster-configuration-configurationproperties","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Configurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-configuration.html#cfn-elasticmapreduce-cluster-configuration-configurations","DuplicatesAllowed":false,"ItemType":"Configuration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EMR::Cluster.EbsBlockDeviceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-ebsblockdeviceconfig.html","Properties":{"VolumeSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-ebsblockdeviceconfig.html#cfn-elasticmapreduce-cluster-ebsblockdeviceconfig-volumespecification","Required":true,"Type":"VolumeSpecification","UpdateType":"Mutable"},"VolumesPerInstance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-ebsblockdeviceconfig.html#cfn-elasticmapreduce-cluster-ebsblockdeviceconfig-volumesperinstance","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.EbsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-ebsconfiguration.html","Properties":{"EbsBlockDeviceConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-ebsconfiguration.html#cfn-elasticmapreduce-cluster-ebsconfiguration-ebsblockdeviceconfigs","DuplicatesAllowed":false,"ItemType":"EbsBlockDeviceConfig","Required":false,"Type":"List","UpdateType":"Mutable"},"EbsOptimized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-ebsconfiguration.html#cfn-elasticmapreduce-cluster-ebsconfiguration-ebsoptimized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.HadoopJarStepConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-hadoopjarstepconfig.html","Properties":{"Args":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-hadoopjarstepconfig.html#cfn-elasticmapreduce-cluster-hadoopjarstepconfig-args","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Jar":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-hadoopjarstepconfig.html#cfn-elasticmapreduce-cluster-hadoopjarstepconfig-jar","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MainClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-hadoopjarstepconfig.html#cfn-elasticmapreduce-cluster-hadoopjarstepconfig-mainclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StepProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-hadoopjarstepconfig.html#cfn-elasticmapreduce-cluster-hadoopjarstepconfig-stepproperties","DuplicatesAllowed":false,"ItemType":"KeyValue","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EMR::Cluster.InstanceFleetConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetconfig.html","Properties":{"InstanceTypeConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetconfig.html#cfn-elasticmapreduce-cluster-instancefleetconfig-instancetypeconfigs","DuplicatesAllowed":false,"ItemType":"InstanceTypeConfig","Required":false,"Type":"List","UpdateType":"Immutable"},"LaunchSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetconfig.html#cfn-elasticmapreduce-cluster-instancefleetconfig-launchspecifications","Required":false,"Type":"InstanceFleetProvisioningSpecifications","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetconfig.html#cfn-elasticmapreduce-cluster-instancefleetconfig-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TargetOnDemandCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetconfig.html#cfn-elasticmapreduce-cluster-instancefleetconfig-targetondemandcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TargetSpotCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetconfig.html#cfn-elasticmapreduce-cluster-instancefleetconfig-targetspotcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.InstanceFleetProvisioningSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetprovisioningspecifications.html","Properties":{"OnDemandSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetprovisioningspecifications.html#cfn-elasticmapreduce-cluster-instancefleetprovisioningspecifications-ondemandspecification","Required":false,"Type":"OnDemandProvisioningSpecification","UpdateType":"Mutable"},"SpotSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancefleetprovisioningspecifications.html#cfn-elasticmapreduce-cluster-instancefleetprovisioningspecifications-spotspecification","Required":false,"Type":"SpotProvisioningSpecification","UpdateType":"Mutable"}}},"AWS::EMR::Cluster.InstanceGroupConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html","Properties":{"AutoScalingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html#cfn-elasticmapreduce-cluster-instancegroupconfig-autoscalingpolicy","Required":false,"Type":"AutoScalingPolicy","UpdateType":"Mutable"},"BidPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html#cfn-elasticmapreduce-cluster-instancegroupconfig-bidprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Configurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html#cfn-elasticmapreduce-cluster-instancegroupconfig-configurations","DuplicatesAllowed":false,"ItemType":"Configuration","Required":false,"Type":"List","UpdateType":"Immutable"},"CustomAmiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html#cfn-elasticmapreduce-cluster-instancegroupconfig-customamiid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EbsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html#cfn-elasticmapreduce-cluster-instancegroupconfig-ebsconfiguration","Required":false,"Type":"EbsConfiguration","UpdateType":"Immutable"},"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html#cfn-elasticmapreduce-cluster-instancegroupconfig-instancecount","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html#cfn-elasticmapreduce-cluster-instancegroupconfig-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Market":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html#cfn-elasticmapreduce-cluster-instancegroupconfig-market","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html#cfn-elasticmapreduce-cluster-instancegroupconfig-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EMR::Cluster.InstanceTypeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancetypeconfig.html","Properties":{"BidPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancetypeconfig.html#cfn-elasticmapreduce-cluster-instancetypeconfig-bidprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BidPriceAsPercentageOfOnDemandPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancetypeconfig.html#cfn-elasticmapreduce-cluster-instancetypeconfig-bidpriceaspercentageofondemandprice","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Configurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancetypeconfig.html#cfn-elasticmapreduce-cluster-instancetypeconfig-configurations","DuplicatesAllowed":false,"ItemType":"Configuration","Required":false,"Type":"List","UpdateType":"Immutable"},"CustomAmiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancetypeconfig.html#cfn-elasticmapreduce-cluster-instancetypeconfig-customamiid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EbsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancetypeconfig.html#cfn-elasticmapreduce-cluster-instancetypeconfig-ebsconfiguration","Required":false,"Type":"EbsConfiguration","UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancetypeconfig.html#cfn-elasticmapreduce-cluster-instancetypeconfig-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WeightedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancetypeconfig.html#cfn-elasticmapreduce-cluster-instancetypeconfig-weightedcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EMR::Cluster.JobFlowInstancesConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html","Properties":{"AdditionalMasterSecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-additionalmastersecuritygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AdditionalSlaveSecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-additionalslavesecuritygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"CoreInstanceFleet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-coreinstancefleet","Required":false,"Type":"InstanceFleetConfig","UpdateType":"Immutable"},"CoreInstanceGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-coreinstancegroup","Required":false,"Type":"InstanceGroupConfig","UpdateType":"Immutable"},"Ec2KeyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-ec2keyname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Ec2SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-ec2subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Ec2SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-ec2subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"EmrManagedMasterSecurityGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-emrmanagedmastersecuritygroup","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EmrManagedSlaveSecurityGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-emrmanagedslavesecuritygroup","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"HadoopVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-hadoopversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KeepJobFlowAliveWhenNoSteps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-keepjobflowalivewhennosteps","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"MasterInstanceFleet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-masterinstancefleet","Required":false,"Type":"InstanceFleetConfig","UpdateType":"Immutable"},"MasterInstanceGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-masterinstancegroup","Required":false,"Type":"InstanceGroupConfig","UpdateType":"Immutable"},"Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-placement","Required":false,"Type":"PlacementType","UpdateType":"Immutable"},"ServiceAccessSecurityGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-serviceaccesssecuritygroup","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TaskInstanceFleets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-taskinstancefleets","DuplicatesAllowed":false,"ItemType":"InstanceFleetConfig","Required":false,"Type":"List","UpdateType":"Conditional"},"TaskInstanceGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-taskinstancegroups","DuplicatesAllowed":false,"ItemType":"InstanceGroupConfig","Required":false,"Type":"List","UpdateType":"Conditional"},"TerminationProtected":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-jobflowinstancesconfig.html#cfn-elasticmapreduce-cluster-jobflowinstancesconfig-terminationprotected","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.KerberosAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-kerberosattributes.html","Properties":{"ADDomainJoinPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-kerberosattributes.html#cfn-elasticmapreduce-cluster-kerberosattributes-addomainjoinpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ADDomainJoinUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-kerberosattributes.html#cfn-elasticmapreduce-cluster-kerberosattributes-addomainjoinuser","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CrossRealmTrustPrincipalPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-kerberosattributes.html#cfn-elasticmapreduce-cluster-kerberosattributes-crossrealmtrustprincipalpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KdcAdminPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-kerberosattributes.html#cfn-elasticmapreduce-cluster-kerberosattributes-kdcadminpassword","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Realm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-kerberosattributes.html#cfn-elasticmapreduce-cluster-kerberosattributes-realm","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.KeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-keyvalue.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-keyvalue.html#cfn-elasticmapreduce-cluster-keyvalue-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-keyvalue.html#cfn-elasticmapreduce-cluster-keyvalue-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.ManagedScalingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-managedscalingpolicy.html","Properties":{"ComputeLimits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-managedscalingpolicy.html#cfn-elasticmapreduce-cluster-managedscalingpolicy-computelimits","Required":false,"Type":"ComputeLimits","UpdateType":"Mutable"}}},"AWS::EMR::Cluster.MetricDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-metricdimension.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-metricdimension.html#cfn-elasticmapreduce-cluster-metricdimension-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-metricdimension.html#cfn-elasticmapreduce-cluster-metricdimension-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.OnDemandProvisioningSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-ondemandprovisioningspecification.html","Properties":{"AllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-ondemandprovisioningspecification.html#cfn-elasticmapreduce-cluster-ondemandprovisioningspecification-allocationstrategy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.PlacementType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-placementtype.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-placementtype.html#cfn-elasticmapreduce-cluster-placementtype-availabilityzone","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EMR::Cluster.ScalingAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingaction.html","Properties":{"Market":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingaction.html#cfn-elasticmapreduce-cluster-scalingaction-market","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SimpleScalingPolicyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingaction.html#cfn-elasticmapreduce-cluster-scalingaction-simplescalingpolicyconfiguration","Required":true,"Type":"SimpleScalingPolicyConfiguration","UpdateType":"Mutable"}}},"AWS::EMR::Cluster.ScalingConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingconstraints.html","Properties":{"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingconstraints.html#cfn-elasticmapreduce-cluster-scalingconstraints-maxcapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MinCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingconstraints.html#cfn-elasticmapreduce-cluster-scalingconstraints-mincapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.ScalingRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingrule.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingrule.html#cfn-elasticmapreduce-cluster-scalingrule-action","Required":true,"Type":"ScalingAction","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingrule.html#cfn-elasticmapreduce-cluster-scalingrule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingrule.html#cfn-elasticmapreduce-cluster-scalingrule-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Trigger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingrule.html#cfn-elasticmapreduce-cluster-scalingrule-trigger","Required":true,"Type":"ScalingTrigger","UpdateType":"Mutable"}}},"AWS::EMR::Cluster.ScalingTrigger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingtrigger.html","Properties":{"CloudWatchAlarmDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scalingtrigger.html#cfn-elasticmapreduce-cluster-scalingtrigger-cloudwatchalarmdefinition","Required":true,"Type":"CloudWatchAlarmDefinition","UpdateType":"Mutable"}}},"AWS::EMR::Cluster.ScriptBootstrapActionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scriptbootstrapactionconfig.html","Properties":{"Args":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scriptbootstrapactionconfig.html#cfn-elasticmapreduce-cluster-scriptbootstrapactionconfig-args","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-scriptbootstrapactionconfig.html#cfn-elasticmapreduce-cluster-scriptbootstrapactionconfig-path","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.SimpleScalingPolicyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-simplescalingpolicyconfiguration.html","Properties":{"AdjustmentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-simplescalingpolicyconfiguration.html#cfn-elasticmapreduce-cluster-simplescalingpolicyconfiguration-adjustmenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CoolDown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-simplescalingpolicyconfiguration.html#cfn-elasticmapreduce-cluster-simplescalingpolicyconfiguration-cooldown","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ScalingAdjustment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-simplescalingpolicyconfiguration.html#cfn-elasticmapreduce-cluster-simplescalingpolicyconfiguration-scalingadjustment","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.SpotProvisioningSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-spotprovisioningspecification.html","Properties":{"AllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-spotprovisioningspecification.html#cfn-elasticmapreduce-cluster-spotprovisioningspecification-allocationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BlockDurationMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-spotprovisioningspecification.html#cfn-elasticmapreduce-cluster-spotprovisioningspecification-blockdurationminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TimeoutAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-spotprovisioningspecification.html#cfn-elasticmapreduce-cluster-spotprovisioningspecification-timeoutaction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeoutDurationMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-spotprovisioningspecification.html#cfn-elasticmapreduce-cluster-spotprovisioningspecification-timeoutdurationminutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.StepConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-stepconfig.html","Properties":{"ActionOnFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-stepconfig.html#cfn-elasticmapreduce-cluster-stepconfig-actiononfailure","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HadoopJarStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-stepconfig.html#cfn-elasticmapreduce-cluster-stepconfig-hadoopjarstep","Required":true,"Type":"HadoopJarStepConfig","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-stepconfig.html#cfn-elasticmapreduce-cluster-stepconfig-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster.VolumeSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-volumespecification.html","Properties":{"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-volumespecification.html#cfn-elasticmapreduce-cluster-volumespecification-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SizeInGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-volumespecification.html#cfn-elasticmapreduce-cluster-volumespecification-sizeingb","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-volumespecification.html#cfn-elasticmapreduce-cluster-volumespecification-volumetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::InstanceFleetConfig.Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-configuration.html","Properties":{"Classification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-configuration.html#cfn-elasticmapreduce-instancefleetconfig-configuration-classification","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConfigurationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-configuration.html#cfn-elasticmapreduce-instancefleetconfig-configuration-configurationproperties","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Configurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-configuration.html#cfn-elasticmapreduce-instancefleetconfig-configuration-configurations","DuplicatesAllowed":false,"ItemType":"Configuration","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EMR::InstanceFleetConfig.EbsBlockDeviceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-ebsblockdeviceconfig.html","Properties":{"VolumeSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-ebsblockdeviceconfig.html#cfn-elasticmapreduce-instancefleetconfig-ebsblockdeviceconfig-volumespecification","Required":true,"Type":"VolumeSpecification","UpdateType":"Immutable"},"VolumesPerInstance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-ebsblockdeviceconfig.html#cfn-elasticmapreduce-instancefleetconfig-ebsblockdeviceconfig-volumesperinstance","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EMR::InstanceFleetConfig.EbsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-ebsconfiguration.html","Properties":{"EbsBlockDeviceConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-ebsconfiguration.html#cfn-elasticmapreduce-instancefleetconfig-ebsconfiguration-ebsblockdeviceconfigs","DuplicatesAllowed":false,"ItemType":"EbsBlockDeviceConfig","Required":false,"Type":"List","UpdateType":"Immutable"},"EbsOptimized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-ebsconfiguration.html#cfn-elasticmapreduce-instancefleetconfig-ebsconfiguration-ebsoptimized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::EMR::InstanceFleetConfig.InstanceFleetProvisioningSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancefleetprovisioningspecifications.html","Properties":{"OnDemandSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancefleetprovisioningspecifications.html#cfn-elasticmapreduce-instancefleetconfig-instancefleetprovisioningspecifications-ondemandspecification","Required":false,"Type":"OnDemandProvisioningSpecification","UpdateType":"Mutable"},"SpotSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancefleetprovisioningspecifications.html#cfn-elasticmapreduce-instancefleetconfig-instancefleetprovisioningspecifications-spotspecification","Required":false,"Type":"SpotProvisioningSpecification","UpdateType":"Mutable"}}},"AWS::EMR::InstanceFleetConfig.InstanceTypeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancetypeconfig.html","Properties":{"BidPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancetypeconfig.html#cfn-elasticmapreduce-instancefleetconfig-instancetypeconfig-bidprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BidPriceAsPercentageOfOnDemandPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancetypeconfig.html#cfn-elasticmapreduce-instancefleetconfig-instancetypeconfig-bidpriceaspercentageofondemandprice","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Configurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancetypeconfig.html#cfn-elasticmapreduce-instancefleetconfig-instancetypeconfig-configurations","DuplicatesAllowed":false,"ItemType":"Configuration","Required":false,"Type":"List","UpdateType":"Immutable"},"CustomAmiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancetypeconfig.html#cfn-elasticmapreduce-instancefleetconfig-instancetypeconfig-customamiid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EbsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancetypeconfig.html#cfn-elasticmapreduce-instancefleetconfig-instancetypeconfig-ebsconfiguration","Required":false,"Type":"EbsConfiguration","UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancetypeconfig.html#cfn-elasticmapreduce-instancefleetconfig-instancetypeconfig-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WeightedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancetypeconfig.html#cfn-elasticmapreduce-instancefleetconfig-instancetypeconfig-weightedcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EMR::InstanceFleetConfig.OnDemandProvisioningSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-ondemandprovisioningspecification.html","Properties":{"AllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-ondemandprovisioningspecification.html#cfn-elasticmapreduce-instancefleetconfig-ondemandprovisioningspecification-allocationstrategy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::InstanceFleetConfig.SpotProvisioningSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html","Properties":{"AllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html#cfn-elasticmapreduce-instancefleetconfig-spotprovisioningspecification-allocationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BlockDurationMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html#cfn-elasticmapreduce-instancefleetconfig-spotprovisioningspecification-blockdurationminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TimeoutAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html#cfn-elasticmapreduce-instancefleetconfig-spotprovisioningspecification-timeoutaction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeoutDurationMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-spotprovisioningspecification.html#cfn-elasticmapreduce-instancefleetconfig-spotprovisioningspecification-timeoutdurationminutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::InstanceFleetConfig.VolumeSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-volumespecification.html","Properties":{"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-volumespecification.html#cfn-elasticmapreduce-instancefleetconfig-volumespecification-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SizeInGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-volumespecification.html#cfn-elasticmapreduce-instancefleetconfig-volumespecification-sizeingb","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-volumespecification.html#cfn-elasticmapreduce-instancefleetconfig-volumespecification-volumetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EMR::InstanceGroupConfig.AutoScalingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-autoscalingpolicy.html","Properties":{"Constraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-autoscalingpolicy.html#cfn-elasticmapreduce-instancegroupconfig-autoscalingpolicy-constraints","Required":true,"Type":"ScalingConstraints","UpdateType":"Mutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-autoscalingpolicy.html#cfn-elasticmapreduce-instancegroupconfig-autoscalingpolicy-rules","DuplicatesAllowed":false,"ItemType":"ScalingRule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::EMR::InstanceGroupConfig.CloudWatchAlarmDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition.html","Properties":{"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition-comparisonoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition-dimensions","DuplicatesAllowed":false,"ItemType":"MetricDimension","Required":false,"Type":"List","UpdateType":"Mutable"},"EvaluationPeriods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition-evaluationperiods","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Period":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition-period","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Statistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition-statistic","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition-threshold","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition.html#cfn-elasticmapreduce-instancegroupconfig-cloudwatchalarmdefinition-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::InstanceGroupConfig.Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-cluster-configuration.html","Properties":{"Classification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-cluster-configuration.html#cfn-emr-cluster-configuration-classification","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConfigurationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-cluster-configuration.html#cfn-emr-cluster-configuration-configurationproperties","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Configurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-cluster-configuration.html#cfn-emr-cluster-configuration-configurations","DuplicatesAllowed":false,"ItemType":"Configuration","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EMR::InstanceGroupConfig.EbsBlockDeviceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-ebsconfiguration-ebsblockdeviceconfig.html","Properties":{"VolumeSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-ebsconfiguration-ebsblockdeviceconfig.html#cfn-emr-ebsconfiguration-ebsblockdeviceconfig-volumespecification","Required":true,"Type":"VolumeSpecification","UpdateType":"Mutable"},"VolumesPerInstance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-ebsconfiguration-ebsblockdeviceconfig.html#cfn-emr-ebsconfiguration-ebsblockdeviceconfig-volumesperinstance","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::InstanceGroupConfig.EbsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-ebsconfiguration.html","Properties":{"EbsBlockDeviceConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-ebsconfiguration.html#cfn-emr-ebsconfiguration-ebsblockdeviceconfigs","DuplicatesAllowed":false,"ItemType":"EbsBlockDeviceConfig","Required":false,"Type":"List","UpdateType":"Mutable"},"EbsOptimized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-ebsconfiguration.html#cfn-emr-ebsconfiguration-ebsoptimized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::InstanceGroupConfig.MetricDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-metricdimension.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-metricdimension.html#cfn-elasticmapreduce-instancegroupconfig-metricdimension-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-metricdimension.html#cfn-elasticmapreduce-instancegroupconfig-metricdimension-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::InstanceGroupConfig.ScalingAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingaction.html","Properties":{"Market":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingaction.html#cfn-elasticmapreduce-instancegroupconfig-scalingaction-market","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SimpleScalingPolicyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingaction.html#cfn-elasticmapreduce-instancegroupconfig-scalingaction-simplescalingpolicyconfiguration","Required":true,"Type":"SimpleScalingPolicyConfiguration","UpdateType":"Mutable"}}},"AWS::EMR::InstanceGroupConfig.ScalingConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingconstraints.html","Properties":{"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingconstraints.html#cfn-elasticmapreduce-instancegroupconfig-scalingconstraints-maxcapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MinCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingconstraints.html#cfn-elasticmapreduce-instancegroupconfig-scalingconstraints-mincapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::InstanceGroupConfig.ScalingRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingrule.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingrule.html#cfn-elasticmapreduce-instancegroupconfig-scalingrule-action","Required":true,"Type":"ScalingAction","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingrule.html#cfn-elasticmapreduce-instancegroupconfig-scalingrule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingrule.html#cfn-elasticmapreduce-instancegroupconfig-scalingrule-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Trigger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingrule.html#cfn-elasticmapreduce-instancegroupconfig-scalingrule-trigger","Required":true,"Type":"ScalingTrigger","UpdateType":"Mutable"}}},"AWS::EMR::InstanceGroupConfig.ScalingTrigger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingtrigger.html","Properties":{"CloudWatchAlarmDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-scalingtrigger.html#cfn-elasticmapreduce-instancegroupconfig-scalingtrigger-cloudwatchalarmdefinition","Required":true,"Type":"CloudWatchAlarmDefinition","UpdateType":"Mutable"}}},"AWS::EMR::InstanceGroupConfig.SimpleScalingPolicyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-simplescalingpolicyconfiguration.html","Properties":{"AdjustmentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-simplescalingpolicyconfiguration.html#cfn-elasticmapreduce-instancegroupconfig-simplescalingpolicyconfiguration-adjustmenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CoolDown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-simplescalingpolicyconfiguration.html#cfn-elasticmapreduce-instancegroupconfig-simplescalingpolicyconfiguration-cooldown","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ScalingAdjustment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancegroupconfig-simplescalingpolicyconfiguration.html#cfn-elasticmapreduce-instancegroupconfig-simplescalingpolicyconfiguration-scalingadjustment","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::InstanceGroupConfig.VolumeSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-ebsconfiguration-ebsblockdeviceconfig-volumespecification.html","Properties":{"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-ebsconfiguration-ebsblockdeviceconfig-volumespecification.html#cfn-emr-ebsconfiguration-ebsblockdeviceconfig-volumespecification-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SizeInGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-ebsconfiguration-ebsblockdeviceconfig-volumespecification.html#cfn-emr-ebsconfiguration-ebsblockdeviceconfig-volumespecification-sizeingb","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emr-ebsconfiguration-ebsblockdeviceconfig-volumespecification.html#cfn-emr-ebsconfiguration-ebsblockdeviceconfig-volumespecification-volumetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMR::Step.HadoopJarStepConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-step-hadoopjarstepconfig.html","Properties":{"Args":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-step-hadoopjarstepconfig.html#cfn-elasticmapreduce-step-hadoopjarstepconfig-args","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Jar":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-step-hadoopjarstepconfig.html#cfn-elasticmapreduce-step-hadoopjarstepconfig-jar","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MainClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-step-hadoopjarstepconfig.html#cfn-elasticmapreduce-step-hadoopjarstepconfig-mainclass","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StepProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-step-hadoopjarstepconfig.html#cfn-elasticmapreduce-step-hadoopjarstepconfig-stepproperties","DuplicatesAllowed":false,"ItemType":"KeyValue","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EMR::Step.KeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-step-keyvalue.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-step-keyvalue.html#cfn-elasticmapreduce-step-keyvalue-key","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-step-keyvalue.html#cfn-elasticmapreduce-step-keyvalue-value","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EMRContainers::VirtualCluster.ContainerInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerinfo.html","Properties":{"EksInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerinfo.html#cfn-emrcontainers-virtualcluster-containerinfo-eksinfo","Required":true,"Type":"EksInfo","UpdateType":"Immutable"}}},"AWS::EMRContainers::VirtualCluster.ContainerProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerprovider.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerprovider.html#cfn-emrcontainers-virtualcluster-containerprovider-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Info":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerprovider.html#cfn-emrcontainers-virtualcluster-containerprovider-info","Required":true,"Type":"ContainerInfo","UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-containerprovider.html#cfn-emrcontainers-virtualcluster-containerprovider-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EMRContainers::VirtualCluster.EksInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-eksinfo.html","Properties":{"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrcontainers-virtualcluster-eksinfo.html#cfn-emrcontainers-virtualcluster-eksinfo-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EMRServerless::Application.AutoStartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-autostartconfiguration.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-autostartconfiguration.html#cfn-emrserverless-application-autostartconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::EMRServerless::Application.AutoStopConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-autostopconfiguration.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-autostopconfiguration.html#cfn-emrserverless-application-autostopconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IdleTimeoutMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-autostopconfiguration.html#cfn-emrserverless-application-autostopconfiguration-idletimeoutminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EMRServerless::Application.ImageConfigurationInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-imageconfigurationinput.html","Properties":{"ImageUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-imageconfigurationinput.html#cfn-emrserverless-application-imageconfigurationinput-imageuri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EMRServerless::Application.InitialCapacityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-initialcapacityconfig.html","Properties":{"WorkerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-initialcapacityconfig.html#cfn-emrserverless-application-initialcapacityconfig-workerconfiguration","Required":true,"Type":"WorkerConfiguration","UpdateType":"Mutable"},"WorkerCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-initialcapacityconfig.html#cfn-emrserverless-application-initialcapacityconfig-workercount","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::EMRServerless::Application.InitialCapacityConfigKeyValuePair":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-initialcapacityconfigkeyvaluepair.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-initialcapacityconfigkeyvaluepair.html#cfn-emrserverless-application-initialcapacityconfigkeyvaluepair-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-initialcapacityconfigkeyvaluepair.html#cfn-emrserverless-application-initialcapacityconfigkeyvaluepair-value","Required":true,"Type":"InitialCapacityConfig","UpdateType":"Mutable"}}},"AWS::EMRServerless::Application.MaximumAllowedResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-maximumallowedresources.html","Properties":{"Cpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-maximumallowedresources.html#cfn-emrserverless-application-maximumallowedresources-cpu","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Disk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-maximumallowedresources.html#cfn-emrserverless-application-maximumallowedresources-disk","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Memory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-maximumallowedresources.html#cfn-emrserverless-application-maximumallowedresources-memory","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMRServerless::Application.NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-networkconfiguration.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-networkconfiguration.html#cfn-emrserverless-application-networkconfiguration-securitygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-networkconfiguration.html#cfn-emrserverless-application-networkconfiguration-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EMRServerless::Application.WorkerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-workerconfiguration.html","Properties":{"Cpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-workerconfiguration.html#cfn-emrserverless-application-workerconfiguration-cpu","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Disk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-workerconfiguration.html#cfn-emrserverless-application-workerconfiguration-disk","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Memory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-workerconfiguration.html#cfn-emrserverless-application-workerconfiguration-memory","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EMRServerless::Application.WorkerTypeSpecificationInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-workertypespecificationinput.html","Properties":{"ImageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-emrserverless-application-workertypespecificationinput.html#cfn-emrserverless-application-workertypespecificationinput-imageconfiguration","Required":false,"Type":"ImageConfigurationInput","UpdateType":"Mutable"}}},"AWS::ElastiCache::CacheCluster.CloudWatchLogsDestinationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-cloudwatchlogsdestinationdetails.html","Properties":{"LogGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-cloudwatchlogsdestinationdetails.html#cfn-elasticache-cachecluster-cloudwatchlogsdestinationdetails-loggroup","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElastiCache::CacheCluster.DestinationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-destinationdetails.html","Properties":{"CloudWatchLogsDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-destinationdetails.html#cfn-elasticache-cachecluster-destinationdetails-cloudwatchlogsdetails","Required":false,"Type":"CloudWatchLogsDestinationDetails","UpdateType":"Mutable"},"KinesisFirehoseDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-destinationdetails.html#cfn-elasticache-cachecluster-destinationdetails-kinesisfirehosedetails","Required":false,"Type":"KinesisFirehoseDestinationDetails","UpdateType":"Mutable"}}},"AWS::ElastiCache::CacheCluster.KinesisFirehoseDestinationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-kinesisfirehosedestinationdetails.html","Properties":{"DeliveryStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-kinesisfirehosedestinationdetails.html#cfn-elasticache-cachecluster-kinesisfirehosedestinationdetails-deliverystream","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElastiCache::CacheCluster.LogDeliveryConfigurationRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html","Properties":{"DestinationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html#cfn-elasticache-cachecluster-logdeliveryconfigurationrequest-destinationdetails","Required":true,"Type":"DestinationDetails","UpdateType":"Mutable"},"DestinationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html#cfn-elasticache-cachecluster-logdeliveryconfigurationrequest-destinationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html#cfn-elasticache-cachecluster-logdeliveryconfigurationrequest-logformat","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html#cfn-elasticache-cachecluster-logdeliveryconfigurationrequest-logtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElastiCache::GlobalReplicationGroup.GlobalReplicationGroupMember":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-globalreplicationgroupmember.html","Properties":{"ReplicationGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-globalreplicationgroupmember.html#cfn-elasticache-globalreplicationgroup-globalreplicationgroupmember-replicationgroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReplicationGroupRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-globalreplicationgroupmember.html#cfn-elasticache-globalreplicationgroup-globalreplicationgroupmember-replicationgroupregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-globalreplicationgroupmember.html#cfn-elasticache-globalreplicationgroup-globalreplicationgroupmember-role","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElastiCache::GlobalReplicationGroup.RegionalConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-regionalconfiguration.html","Properties":{"ReplicationGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-regionalconfiguration.html#cfn-elasticache-globalreplicationgroup-regionalconfiguration-replicationgroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReplicationGroupRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-regionalconfiguration.html#cfn-elasticache-globalreplicationgroup-regionalconfiguration-replicationgroupregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReshardingConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-regionalconfiguration.html#cfn-elasticache-globalreplicationgroup-regionalconfiguration-reshardingconfigurations","DuplicatesAllowed":false,"ItemType":"ReshardingConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElastiCache::GlobalReplicationGroup.ReshardingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-reshardingconfiguration.html","Properties":{"NodeGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-reshardingconfiguration.html#cfn-elasticache-globalreplicationgroup-reshardingconfiguration-nodegroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreferredAvailabilityZones":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-globalreplicationgroup-reshardingconfiguration.html#cfn-elasticache-globalreplicationgroup-reshardingconfiguration-preferredavailabilityzones","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElastiCache::ReplicationGroup.CloudWatchLogsDestinationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-cloudwatchlogsdestinationdetails.html","Properties":{"LogGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-cloudwatchlogsdestinationdetails.html#cfn-elasticache-replicationgroup-cloudwatchlogsdestinationdetails-loggroup","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElastiCache::ReplicationGroup.DestinationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-destinationdetails.html","Properties":{"CloudWatchLogsDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-destinationdetails.html#cfn-elasticache-replicationgroup-destinationdetails-cloudwatchlogsdetails","Required":false,"Type":"CloudWatchLogsDestinationDetails","UpdateType":"Mutable"},"KinesisFirehoseDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-destinationdetails.html#cfn-elasticache-replicationgroup-destinationdetails-kinesisfirehosedetails","Required":false,"Type":"KinesisFirehoseDestinationDetails","UpdateType":"Mutable"}}},"AWS::ElastiCache::ReplicationGroup.KinesisFirehoseDestinationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-kinesisfirehosedestinationdetails.html","Properties":{"DeliveryStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-kinesisfirehosedestinationdetails.html#cfn-elasticache-replicationgroup-kinesisfirehosedestinationdetails-deliverystream","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElastiCache::ReplicationGroup.LogDeliveryConfigurationRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html","Properties":{"DestinationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html#cfn-elasticache-replicationgroup-logdeliveryconfigurationrequest-destinationdetails","Required":true,"Type":"DestinationDetails","UpdateType":"Mutable"},"DestinationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html#cfn-elasticache-replicationgroup-logdeliveryconfigurationrequest-destinationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html#cfn-elasticache-replicationgroup-logdeliveryconfigurationrequest-logformat","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html#cfn-elasticache-replicationgroup-logdeliveryconfigurationrequest-logtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElastiCache::ReplicationGroup.NodeGroupConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html","Properties":{"NodeGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html#cfn-elasticache-replicationgroup-nodegroupconfiguration-nodegroupid","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"PrimaryAvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html#cfn-elasticache-replicationgroup-nodegroupconfiguration-primaryavailabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ReplicaAvailabilityZones":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html#cfn-elasticache-replicationgroup-nodegroupconfiguration-replicaavailabilityzones","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ReplicaCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html#cfn-elasticache-replicationgroup-nodegroupconfiguration-replicacount","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Slots":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-nodegroupconfiguration.html#cfn-elasticache-replicationgroup-nodegroupconfiguration-slots","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ElastiCache::User.AuthenticationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-user-authenticationmode.html","Properties":{"Passwords":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-user-authenticationmode.html#cfn-elasticache-user-authenticationmode-passwords","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-user-authenticationmode.html#cfn-elasticache-user-authenticationmode-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticBeanstalk::Application.ApplicationResourceLifecycleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-applicationresourcelifecycleconfig.html","Properties":{"ServiceRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-applicationresourcelifecycleconfig.html#cfn-elasticbeanstalk-application-applicationresourcelifecycleconfig-servicerole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VersionLifecycleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-applicationresourcelifecycleconfig.html#cfn-elasticbeanstalk-application-applicationresourcelifecycleconfig-versionlifecycleconfig","Required":false,"Type":"ApplicationVersionLifecycleConfig","UpdateType":"Mutable"}}},"AWS::ElasticBeanstalk::Application.ApplicationVersionLifecycleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-applicationversionlifecycleconfig.html","Properties":{"MaxAgeRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-applicationversionlifecycleconfig.html#cfn-elasticbeanstalk-application-applicationversionlifecycleconfig-maxagerule","Required":false,"Type":"MaxAgeRule","UpdateType":"Mutable"},"MaxCountRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-applicationversionlifecycleconfig.html#cfn-elasticbeanstalk-application-applicationversionlifecycleconfig-maxcountrule","Required":false,"Type":"MaxCountRule","UpdateType":"Mutable"}}},"AWS::ElasticBeanstalk::Application.MaxAgeRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-maxagerule.html","Properties":{"DeleteSourceFromS3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-maxagerule.html#cfn-elasticbeanstalk-application-maxagerule-deletesourcefroms3","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-maxagerule.html#cfn-elasticbeanstalk-application-maxagerule-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxAgeInDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-maxagerule.html#cfn-elasticbeanstalk-application-maxagerule-maxageindays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticBeanstalk::Application.MaxCountRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-maxcountrule.html","Properties":{"DeleteSourceFromS3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-maxcountrule.html#cfn-elasticbeanstalk-application-maxcountrule-deletesourcefroms3","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-maxcountrule.html#cfn-elasticbeanstalk-application-maxcountrule-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-application-maxcountrule.html#cfn-elasticbeanstalk-application-maxcountrule-maxcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticBeanstalk::ApplicationVersion.SourceBundle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-applicationversion-sourcebundle.html","Properties":{"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-applicationversion-sourcebundle.html#cfn-elasticbeanstalk-applicationversion-sourcebundle-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-applicationversion-sourcebundle.html#cfn-elasticbeanstalk-applicationversion-sourcebundle-s3key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ElasticBeanstalk::ConfigurationTemplate.ConfigurationOptionSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-configurationtemplate-configurationoptionsetting.html","Properties":{"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-configurationtemplate-configurationoptionsetting.html#cfn-elasticbeanstalk-configurationtemplate-configurationoptionsetting-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OptionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-configurationtemplate-configurationoptionsetting.html#cfn-elasticbeanstalk-configurationtemplate-configurationoptionsetting-optionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-configurationtemplate-configurationoptionsetting.html#cfn-elasticbeanstalk-configurationtemplate-configurationoptionsetting-resourcename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-configurationtemplate-configurationoptionsetting.html#cfn-elasticbeanstalk-configurationtemplate-configurationoptionsetting-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticBeanstalk::ConfigurationTemplate.SourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-configurationtemplate-sourceconfiguration.html","Properties":{"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-configurationtemplate-sourceconfiguration.html#cfn-elasticbeanstalk-configurationtemplate-sourceconfiguration-applicationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-configurationtemplate-sourceconfiguration.html#cfn-elasticbeanstalk-configurationtemplate-sourceconfiguration-templatename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ElasticBeanstalk::Environment.OptionSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-environment-optionsetting.html","Properties":{"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-environment-optionsetting.html#cfn-elasticbeanstalk-environment-optionsetting-namespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OptionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-environment-optionsetting.html#cfn-elasticbeanstalk-environment-optionsetting-optionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-environment-optionsetting.html#cfn-elasticbeanstalk-environment-optionsetting-resourcename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-environment-optionsetting.html#cfn-elasticbeanstalk-environment-optionsetting-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticBeanstalk::Environment.Tier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-environment-tier.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-environment-tier.html#cfn-elasticbeanstalk-environment-tier-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-environment-tier.html#cfn-elasticbeanstalk-environment-tier-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticbeanstalk-environment-tier.html#cfn-elasticbeanstalk-environment-tier-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancing::LoadBalancer.AccessLoggingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-accessloggingpolicy.html","Properties":{"EmitInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-accessloggingpolicy.html#cfn-elb-accessloggingpolicy-emitinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-accessloggingpolicy.html#cfn-elb-accessloggingpolicy-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"S3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-accessloggingpolicy.html#cfn-elb-accessloggingpolicy-s3bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-accessloggingpolicy.html#cfn-elb-accessloggingpolicy-s3bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancing::LoadBalancer.AppCookieStickinessPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-AppCookieStickinessPolicy.html","Properties":{"CookieName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-AppCookieStickinessPolicy.html#cfn-elb-appcookiestickinesspolicy-cookiename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-AppCookieStickinessPolicy.html#cfn-elb-appcookiestickinesspolicy-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancing::LoadBalancer.ConnectionDrainingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-connectiondrainingpolicy.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-connectiondrainingpolicy.html#cfn-elb-connectiondrainingpolicy-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-connectiondrainingpolicy.html#cfn-elb-connectiondrainingpolicy-timeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancing::LoadBalancer.ConnectionSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-connectionsettings.html","Properties":{"IdleTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-connectionsettings.html#cfn-elb-connectionsettings-idletimeout","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancing::LoadBalancer.HealthCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-health-check.html","Properties":{"HealthyThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-health-check.html#cfn-elb-healthcheck-healthythreshold","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-health-check.html#cfn-elb-healthcheck-interval","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-health-check.html#cfn-elb-healthcheck-target","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-health-check.html#cfn-elb-healthcheck-timeout","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UnhealthyThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-health-check.html#cfn-elb-healthcheck-unhealthythreshold","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancing::LoadBalancer.LBCookieStickinessPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-LBCookieStickinessPolicy.html","Properties":{"CookieExpirationPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-LBCookieStickinessPolicy.html#cfn-elb-lbcookiestickinesspolicy-cookieexpirationperiod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-LBCookieStickinessPolicy.html#cfn-elb-lbcookiestickinesspolicy-policyname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancing::LoadBalancer.Listeners":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-listener.html","Properties":{"InstancePort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-listener.html#cfn-ec2-elb-listener-instanceport","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InstanceProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-listener.html#cfn-ec2-elb-listener-instanceprotocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoadBalancerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-listener.html#cfn-ec2-elb-listener-loadbalancerport","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PolicyNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-listener.html#cfn-ec2-elb-listener-policynames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-listener.html#cfn-ec2-elb-listener-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SSLCertificateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-listener.html#cfn-ec2-elb-listener-sslcertificateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancing::LoadBalancer.Policies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-policy.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-policy.html#cfn-ec2-elb-policy-attributes","DuplicatesAllowed":false,"PrimitiveItemType":"Json","Required":true,"Type":"List","UpdateType":"Mutable"},"InstancePorts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-policy.html#cfn-ec2-elb-policy-instanceports","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"LoadBalancerPorts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-policy.html#cfn-ec2-elb-policy-loadbalancerports","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-policy.html#cfn-ec2-elb-policy-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PolicyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-policy.html#cfn-ec2-elb-policy-policytype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::Listener.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-action.html","Properties":{"AuthenticateCognitoConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-action.html#cfn-elasticloadbalancingv2-listener-action-authenticatecognitoconfig","Required":false,"Type":"AuthenticateCognitoConfig","UpdateType":"Mutable"},"AuthenticateOidcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-action.html#cfn-elasticloadbalancingv2-listener-action-authenticateoidcconfig","Required":false,"Type":"AuthenticateOidcConfig","UpdateType":"Mutable"},"FixedResponseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-action.html#cfn-elasticloadbalancingv2-listener-action-fixedresponseconfig","Required":false,"Type":"FixedResponseConfig","UpdateType":"Mutable"},"ForwardConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-action.html#cfn-elasticloadbalancingv2-listener-action-forwardconfig","Required":false,"Type":"ForwardConfig","UpdateType":"Mutable"},"Order":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-action.html#cfn-elasticloadbalancingv2-listener-action-order","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RedirectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-action.html#cfn-elasticloadbalancingv2-listener-action-redirectconfig","Required":false,"Type":"RedirectConfig","UpdateType":"Mutable"},"TargetGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-action.html#cfn-elasticloadbalancingv2-listener-action-targetgrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-action.html#cfn-elasticloadbalancingv2-listener-action-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::Listener.AuthenticateCognitoConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticatecognitoconfig.html","Properties":{"AuthenticationRequestExtraParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listener-authenticatecognitoconfig-authenticationrequestextraparams","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"OnUnauthenticatedRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listener-authenticatecognitoconfig-onunauthenticatedrequest","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listener-authenticatecognitoconfig-scope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionCookieName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listener-authenticatecognitoconfig-sessioncookiename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listener-authenticatecognitoconfig-sessiontimeout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserPoolArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listener-authenticatecognitoconfig-userpoolarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UserPoolClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listener-authenticatecognitoconfig-userpoolclientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UserPoolDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listener-authenticatecognitoconfig-userpooldomain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::Listener.AuthenticateOidcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html","Properties":{"AuthenticationRequestExtraParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-authenticationrequestextraparams","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"AuthorizationEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-authorizationendpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-clientsecret","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Issuer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-issuer","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OnUnauthenticatedRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-onunauthenticatedrequest","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-scope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionCookieName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-sessioncookiename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-sessiontimeout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-tokenendpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UseExistingClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-useexistingclientsecret","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UserInfoEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listener-authenticateoidcconfig-userinfoendpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::Listener.Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-certificate.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-certificate.html#cfn-elasticloadbalancingv2-listener-certificate-certificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::Listener.FixedResponseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-fixedresponseconfig.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-fixedresponseconfig.html#cfn-elasticloadbalancingv2-listener-fixedresponseconfig-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MessageBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-fixedresponseconfig.html#cfn-elasticloadbalancingv2-listener-fixedresponseconfig-messagebody","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-fixedresponseconfig.html#cfn-elasticloadbalancingv2-listener-fixedresponseconfig-statuscode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::Listener.ForwardConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-forwardconfig.html","Properties":{"TargetGroupStickinessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-forwardconfig.html#cfn-elasticloadbalancingv2-listener-forwardconfig-targetgroupstickinessconfig","Required":false,"Type":"TargetGroupStickinessConfig","UpdateType":"Mutable"},"TargetGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-forwardconfig.html#cfn-elasticloadbalancingv2-listener-forwardconfig-targetgroups","DuplicatesAllowed":false,"ItemType":"TargetGroupTuple","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::Listener.RedirectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-redirectconfig.html","Properties":{"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-redirectconfig.html#cfn-elasticloadbalancingv2-listener-redirectconfig-host","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-redirectconfig.html#cfn-elasticloadbalancingv2-listener-redirectconfig-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-redirectconfig.html#cfn-elasticloadbalancingv2-listener-redirectconfig-port","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-redirectconfig.html#cfn-elasticloadbalancingv2-listener-redirectconfig-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Query":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-redirectconfig.html#cfn-elasticloadbalancingv2-listener-redirectconfig-query","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-redirectconfig.html#cfn-elasticloadbalancingv2-listener-redirectconfig-statuscode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::Listener.TargetGroupStickinessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-targetgroupstickinessconfig.html","Properties":{"DurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-targetgroupstickinessconfig.html#cfn-elasticloadbalancingv2-listener-targetgroupstickinessconfig-durationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-targetgroupstickinessconfig.html#cfn-elasticloadbalancingv2-listener-targetgroupstickinessconfig-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::Listener.TargetGroupTuple":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-targetgrouptuple.html","Properties":{"TargetGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-targetgrouptuple.html#cfn-elasticloadbalancingv2-listener-targetgrouptuple-targetgrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-targetgrouptuple.html#cfn-elasticloadbalancingv2-listener-targetgrouptuple-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerCertificate.Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-certificates.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listener-certificates.html#cfn-elasticloadbalancingv2-listener-certificates-certificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-action.html","Properties":{"AuthenticateCognitoConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-action.html#cfn-elasticloadbalancingv2-listenerrule-action-authenticatecognitoconfig","Required":false,"Type":"AuthenticateCognitoConfig","UpdateType":"Mutable"},"AuthenticateOidcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-action.html#cfn-elasticloadbalancingv2-listenerrule-action-authenticateoidcconfig","Required":false,"Type":"AuthenticateOidcConfig","UpdateType":"Mutable"},"FixedResponseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-action.html#cfn-elasticloadbalancingv2-listenerrule-action-fixedresponseconfig","Required":false,"Type":"FixedResponseConfig","UpdateType":"Mutable"},"ForwardConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-action.html#cfn-elasticloadbalancingv2-listenerrule-action-forwardconfig","Required":false,"Type":"ForwardConfig","UpdateType":"Mutable"},"Order":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-action.html#cfn-elasticloadbalancingv2-listenerrule-action-order","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RedirectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-action.html#cfn-elasticloadbalancingv2-listenerrule-action-redirectconfig","Required":false,"Type":"RedirectConfig","UpdateType":"Mutable"},"TargetGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-action.html#cfn-elasticloadbalancingv2-listenerrule-action-targetgrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-action.html#cfn-elasticloadbalancingv2-listenerrule-action-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.AuthenticateCognitoConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig.html","Properties":{"AuthenticationRequestExtraParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig-authenticationrequestextraparams","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"OnUnauthenticatedRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig-onunauthenticatedrequest","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig-scope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionCookieName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig-sessioncookiename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig-sessiontimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UserPoolArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig-userpoolarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UserPoolClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig-userpoolclientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UserPoolDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticatecognitoconfig-userpooldomain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.AuthenticateOidcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html","Properties":{"AuthenticationRequestExtraParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-authenticationrequestextraparams","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"AuthorizationEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-authorizationendpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-clientsecret","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Issuer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-issuer","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OnUnauthenticatedRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-onunauthenticatedrequest","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-scope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionCookieName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-sessioncookiename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-sessiontimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TokenEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-tokenendpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UseExistingClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-useexistingclientsecret","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UserInfoEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-authenticateoidcconfig.html#cfn-elasticloadbalancingv2-listenerrule-authenticateoidcconfig-userinfoendpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.FixedResponseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-fixedresponseconfig.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-fixedresponseconfig.html#cfn-elasticloadbalancingv2-listenerrule-fixedresponseconfig-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MessageBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-fixedresponseconfig.html#cfn-elasticloadbalancingv2-listenerrule-fixedresponseconfig-messagebody","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-fixedresponseconfig.html#cfn-elasticloadbalancingv2-listenerrule-fixedresponseconfig-statuscode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.ForwardConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-forwardconfig.html","Properties":{"TargetGroupStickinessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-forwardconfig.html#cfn-elasticloadbalancingv2-listenerrule-forwardconfig-targetgroupstickinessconfig","Required":false,"Type":"TargetGroupStickinessConfig","UpdateType":"Mutable"},"TargetGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-forwardconfig.html#cfn-elasticloadbalancingv2-listenerrule-forwardconfig-targetgroups","DuplicatesAllowed":false,"ItemType":"TargetGroupTuple","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.HostHeaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-hostheaderconfig.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-hostheaderconfig.html#cfn-elasticloadbalancingv2-listenerrule-hostheaderconfig-values","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.HttpHeaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-httpheaderconfig.html","Properties":{"HttpHeaderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-httpheaderconfig.html#cfn-elasticloadbalancingv2-listenerrule-httpheaderconfig-httpheadername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-httpheaderconfig.html#cfn-elasticloadbalancingv2-listenerrule-httpheaderconfig-values","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.HttpRequestMethodConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-httprequestmethodconfig.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-httprequestmethodconfig.html#cfn-elasticloadbalancingv2-listenerrule-httprequestmethodconfig-values","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.PathPatternConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-pathpatternconfig.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-pathpatternconfig.html#cfn-elasticloadbalancingv2-listenerrule-pathpatternconfig-values","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.QueryStringConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-querystringconfig.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-querystringconfig.html#cfn-elasticloadbalancingv2-listenerrule-querystringconfig-values","DuplicatesAllowed":false,"ItemType":"QueryStringKeyValue","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.QueryStringKeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-querystringkeyvalue.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-querystringkeyvalue.html#cfn-elasticloadbalancingv2-listenerrule-querystringkeyvalue-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-querystringkeyvalue.html#cfn-elasticloadbalancingv2-listenerrule-querystringkeyvalue-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.RedirectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-redirectconfig.html","Properties":{"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-redirectconfig.html#cfn-elasticloadbalancingv2-listenerrule-redirectconfig-host","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-redirectconfig.html#cfn-elasticloadbalancingv2-listenerrule-redirectconfig-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-redirectconfig.html#cfn-elasticloadbalancingv2-listenerrule-redirectconfig-port","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-redirectconfig.html#cfn-elasticloadbalancingv2-listenerrule-redirectconfig-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Query":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-redirectconfig.html#cfn-elasticloadbalancingv2-listenerrule-redirectconfig-query","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-redirectconfig.html#cfn-elasticloadbalancingv2-listenerrule-redirectconfig-statuscode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.RuleCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-rulecondition.html","Properties":{"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-rulecondition.html#cfn-elasticloadbalancingv2-listenerrule-rulecondition-field","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostHeaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-rulecondition.html#cfn-elasticloadbalancingv2-listenerrule-rulecondition-hostheaderconfig","Required":false,"Type":"HostHeaderConfig","UpdateType":"Mutable"},"HttpHeaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-rulecondition.html#cfn-elasticloadbalancingv2-listenerrule-rulecondition-httpheaderconfig","Required":false,"Type":"HttpHeaderConfig","UpdateType":"Mutable"},"HttpRequestMethodConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-rulecondition.html#cfn-elasticloadbalancingv2-listenerrule-rulecondition-httprequestmethodconfig","Required":false,"Type":"HttpRequestMethodConfig","UpdateType":"Mutable"},"PathPatternConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-rulecondition.html#cfn-elasticloadbalancingv2-listenerrule-rulecondition-pathpatternconfig","Required":false,"Type":"PathPatternConfig","UpdateType":"Mutable"},"QueryStringConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-rulecondition.html#cfn-elasticloadbalancingv2-listenerrule-rulecondition-querystringconfig","Required":false,"Type":"QueryStringConfig","UpdateType":"Mutable"},"SourceIpConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-rulecondition.html#cfn-elasticloadbalancingv2-listenerrule-rulecondition-sourceipconfig","Required":false,"Type":"SourceIpConfig","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-rulecondition.html#cfn-elasticloadbalancingv2-listenerrule-rulecondition-values","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.SourceIpConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-sourceipconfig.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-sourceipconfig.html#cfn-elasticloadbalancingv2-listenerrule-sourceipconfig-values","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.TargetGroupStickinessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-targetgroupstickinessconfig.html","Properties":{"DurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-targetgroupstickinessconfig.html#cfn-elasticloadbalancingv2-listenerrule-targetgroupstickinessconfig-durationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-targetgroupstickinessconfig.html#cfn-elasticloadbalancingv2-listenerrule-targetgroupstickinessconfig-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule.TargetGroupTuple":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-targetgrouptuple.html","Properties":{"TargetGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-targetgrouptuple.html#cfn-elasticloadbalancingv2-listenerrule-targetgrouptuple-targetgrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-listenerrule-targetgrouptuple.html#cfn-elasticloadbalancingv2-listenerrule-targetgrouptuple-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::LoadBalancer.LoadBalancerAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-loadbalancerattributes.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-loadbalancerattributes.html#cfn-elasticloadbalancingv2-loadbalancer-loadbalancerattributes-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-loadbalancerattributes.html#cfn-elasticloadbalancingv2-loadbalancer-loadbalancerattributes-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::LoadBalancer.SubnetMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-subnetmapping.html","Properties":{"AllocationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-subnetmapping.html#cfn-elasticloadbalancingv2-loadbalancer-subnetmapping-allocationid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IPv6Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-subnetmapping.html#cfn-elasticloadbalancingv2-loadbalancer-subnetmapping-ipv6address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivateIPv4Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-subnetmapping.html#cfn-elasticloadbalancingv2-loadbalancer-subnetmapping-privateipv4address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-loadbalancer-subnetmapping.html#cfn-elasticloadbalancingv2-loadbalancer-subnetmapping-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::TargetGroup.Matcher":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-matcher.html","Properties":{"GrpcCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-matcher.html#cfn-elasticloadbalancingv2-targetgroup-matcher-grpccode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HttpCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-matcher.html#cfn-elasticloadbalancingv2-targetgroup-matcher-httpcode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::TargetGroup.TargetDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-targetdescription.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-targetdescription.html#cfn-elasticloadbalancingv2-targetgroup-targetdescription-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-targetdescription.html#cfn-elasticloadbalancingv2-targetgroup-targetdescription-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-targetdescription.html#cfn-elasticloadbalancingv2-targetgroup-targetdescription-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::TargetGroup.TargetGroupAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-targetgroupattribute.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-targetgroupattribute.html#cfn-elasticloadbalancingv2-targetgroup-targetgroupattribute-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticloadbalancingv2-targetgroup-targetgroupattribute.html#cfn-elasticloadbalancingv2-targetgroup-targetgroupattribute-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Elasticsearch::Domain.AdvancedSecurityOptionsInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-advancedsecurityoptionsinput.html","Properties":{"AnonymousAuthEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-advancedsecurityoptionsinput.html#cfn-elasticsearch-domain-advancedsecurityoptionsinput-anonymousauthenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-advancedsecurityoptionsinput.html#cfn-elasticsearch-domain-advancedsecurityoptionsinput-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"InternalUserDatabaseEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-advancedsecurityoptionsinput.html#cfn-elasticsearch-domain-advancedsecurityoptionsinput-internaluserdatabaseenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MasterUserOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-advancedsecurityoptionsinput.html#cfn-elasticsearch-domain-advancedsecurityoptionsinput-masteruseroptions","Required":false,"Type":"MasterUserOptions","UpdateType":"Mutable"}}},"AWS::Elasticsearch::Domain.CognitoOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-cognitooptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-cognitooptions.html#cfn-elasticsearch-domain-cognitooptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IdentityPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-cognitooptions.html#cfn-elasticsearch-domain-cognitooptions-identitypoolid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-cognitooptions.html#cfn-elasticsearch-domain-cognitooptions-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-cognitooptions.html#cfn-elasticsearch-domain-cognitooptions-userpoolid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Elasticsearch::Domain.ColdStorageOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-coldstorageoptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-coldstorageoptions.html#cfn-elasticsearch-domain-coldstorageoptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Elasticsearch::Domain.DomainEndpointOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html","Properties":{"CustomEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html#cfn-elasticsearch-domain-domainendpointoptions-customendpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomEndpointCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html#cfn-elasticsearch-domain-domainendpointoptions-customendpointcertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomEndpointEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html#cfn-elasticsearch-domain-domainendpointoptions-customendpointenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnforceHTTPS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html#cfn-elasticsearch-domain-domainendpointoptions-enforcehttps","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TLSSecurityPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html#cfn-elasticsearch-domain-domainendpointoptions-tlssecuritypolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Elasticsearch::Domain.EBSOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-ebsoptions.html","Properties":{"EBSEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-ebsoptions.html#cfn-elasticsearch-domain-ebsoptions-ebsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-ebsoptions.html#cfn-elasticsearch-domain-ebsoptions-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VolumeSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-ebsoptions.html#cfn-elasticsearch-domain-ebsoptions-volumesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-ebsoptions.html#cfn-elasticsearch-domain-ebsoptions-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Elasticsearch::Domain.ElasticsearchClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html","Properties":{"ColdStorageOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-coldstorageoptions","Required":false,"Type":"ColdStorageOptions","UpdateType":"Mutable"},"DedicatedMasterCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-dedicatedmastercount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DedicatedMasterEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-dedicatedmasterenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DedicatedMasterType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-dedicatedmastertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-instancecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-instnacetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WarmCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-warmcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"WarmEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-warmenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"WarmType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-warmtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ZoneAwarenessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-zoneawarenessconfig","Required":false,"Type":"ZoneAwarenessConfig","UpdateType":"Mutable"},"ZoneAwarenessEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-zoneawarenessenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Elasticsearch::Domain.EncryptionAtRestOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-encryptionatrestoptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-encryptionatrestoptions.html#cfn-elasticsearch-domain-encryptionatrestoptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Conditional"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-encryptionatrestoptions.html#cfn-elasticsearch-domain-encryptionatrestoptions-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Elasticsearch::Domain.LogPublishingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-logpublishingoption.html","Properties":{"CloudWatchLogsLogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-logpublishingoption.html#cfn-elasticsearch-domain-logpublishingoption-cloudwatchlogsloggrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-logpublishingoption.html#cfn-elasticsearch-domain-logpublishingoption-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Elasticsearch::Domain.MasterUserOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-masteruseroptions.html","Properties":{"MasterUserARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-masteruseroptions.html#cfn-elasticsearch-domain-masteruseroptions-masteruserarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterUserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-masteruseroptions.html#cfn-elasticsearch-domain-masteruseroptions-masterusername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-masteruseroptions.html#cfn-elasticsearch-domain-masteruseroptions-masteruserpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Elasticsearch::Domain.NodeToNodeEncryptionOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-nodetonodeencryptionoptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-nodetonodeencryptionoptions.html#cfn-elasticsearch-domain-nodetonodeencryptionoptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Conditional"}}},"AWS::Elasticsearch::Domain.SnapshotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-snapshotoptions.html","Properties":{"AutomatedSnapshotStartHour":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-snapshotoptions.html#cfn-elasticsearch-domain-snapshotoptions-automatedsnapshotstarthour","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Elasticsearch::Domain.VPCOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-vpcoptions.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-vpcoptions.html#cfn-elasticsearch-domain-vpcoptions-securitygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-vpcoptions.html#cfn-elasticsearch-domain-vpcoptions-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Elasticsearch::Domain.ZoneAwarenessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-zoneawarenessconfig.html","Properties":{"AvailabilityZoneCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-zoneawarenessconfig.html#cfn-elasticsearch-domain-zoneawarenessconfig-availabilityzonecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EventSchemas::Discoverer.TagsEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eventschemas-discoverer-tagsentry.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eventschemas-discoverer-tagsentry.html#cfn-eventschemas-discoverer-tagsentry-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eventschemas-discoverer-tagsentry.html#cfn-eventschemas-discoverer-tagsentry-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EventSchemas::Registry.TagsEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eventschemas-registry-tagsentry.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eventschemas-registry-tagsentry.html#cfn-eventschemas-registry-tagsentry-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eventschemas-registry-tagsentry.html#cfn-eventschemas-registry-tagsentry-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EventSchemas::Schema.TagsEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eventschemas-schema-tagsentry.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eventschemas-schema-tagsentry.html#cfn-eventschemas-schema-tagsentry-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eventschemas-schema-tagsentry.html#cfn-eventschemas-schema-tagsentry-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Connection.ApiKeyAuthParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-apikeyauthparameters.html","Properties":{"ApiKeyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-apikeyauthparameters.html#cfn-events-connection-apikeyauthparameters-apikeyname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ApiKeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-apikeyauthparameters.html#cfn-events-connection-apikeyauthparameters-apikeyvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Connection.AuthParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-authparameters.html","Properties":{"ApiKeyAuthParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-authparameters.html#cfn-events-connection-authparameters-apikeyauthparameters","Required":false,"Type":"ApiKeyAuthParameters","UpdateType":"Mutable"},"BasicAuthParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-authparameters.html#cfn-events-connection-authparameters-basicauthparameters","Required":false,"Type":"BasicAuthParameters","UpdateType":"Mutable"},"InvocationHttpParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-authparameters.html#cfn-events-connection-authparameters-invocationhttpparameters","Required":false,"Type":"ConnectionHttpParameters","UpdateType":"Mutable"},"OAuthParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-authparameters.html#cfn-events-connection-authparameters-oauthparameters","Required":false,"Type":"OAuthParameters","UpdateType":"Mutable"}}},"AWS::Events::Connection.BasicAuthParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-basicauthparameters.html","Properties":{"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-basicauthparameters.html#cfn-events-connection-basicauthparameters-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-basicauthparameters.html#cfn-events-connection-basicauthparameters-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Connection.ClientParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-clientparameters.html","Properties":{"ClientID":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-clientparameters.html#cfn-events-connection-clientparameters-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-clientparameters.html#cfn-events-connection-clientparameters-clientsecret","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Connection.ConnectionHttpParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-connectionhttpparameters.html","Properties":{"BodyParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-connectionhttpparameters.html#cfn-events-connection-connectionhttpparameters-bodyparameters","DuplicatesAllowed":true,"ItemType":"Parameter","Required":false,"Type":"List","UpdateType":"Mutable"},"HeaderParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-connectionhttpparameters.html#cfn-events-connection-connectionhttpparameters-headerparameters","DuplicatesAllowed":true,"ItemType":"Parameter","Required":false,"Type":"List","UpdateType":"Mutable"},"QueryStringParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-connectionhttpparameters.html#cfn-events-connection-connectionhttpparameters-querystringparameters","DuplicatesAllowed":true,"ItemType":"Parameter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Events::Connection.OAuthParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-oauthparameters.html","Properties":{"AuthorizationEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-oauthparameters.html#cfn-events-connection-oauthparameters-authorizationendpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-oauthparameters.html#cfn-events-connection-oauthparameters-clientparameters","Required":true,"Type":"ClientParameters","UpdateType":"Mutable"},"HttpMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-oauthparameters.html#cfn-events-connection-oauthparameters-httpmethod","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OAuthHttpParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-oauthparameters.html#cfn-events-connection-oauthparameters-oauthhttpparameters","Required":false,"Type":"ConnectionHttpParameters","UpdateType":"Mutable"}}},"AWS::Events::Connection.Parameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-parameter.html","Properties":{"IsValueSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-parameter.html#cfn-events-connection-parameter-isvaluesecret","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-parameter.html#cfn-events-connection-parameter-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-parameter.html#cfn-events-connection-parameter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Endpoint.EndpointEventBus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-endpointeventbus.html","Properties":{"EventBusArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-endpointeventbus.html#cfn-events-endpoint-endpointeventbus-eventbusarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Endpoint.FailoverConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-failoverconfig.html","Properties":{"Primary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-failoverconfig.html#cfn-events-endpoint-failoverconfig-primary","Required":true,"Type":"Primary","UpdateType":"Mutable"},"Secondary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-failoverconfig.html#cfn-events-endpoint-failoverconfig-secondary","Required":true,"Type":"Secondary","UpdateType":"Mutable"}}},"AWS::Events::Endpoint.Primary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-primary.html","Properties":{"HealthCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-primary.html#cfn-events-endpoint-primary-healthcheck","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Endpoint.ReplicationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-replicationconfig.html","Properties":{"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-replicationconfig.html#cfn-events-endpoint-replicationconfig-state","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Endpoint.RoutingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-routingconfig.html","Properties":{"FailoverConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-routingconfig.html#cfn-events-endpoint-routingconfig-failoverconfig","Required":true,"Type":"FailoverConfig","UpdateType":"Mutable"}}},"AWS::Events::Endpoint.Secondary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-secondary.html","Properties":{"Route":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-secondary.html#cfn-events-endpoint-secondary-route","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::EventBus.TagEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbus-tagentry.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbus-tagentry.html#cfn-events-eventbus-tagentry-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbus-tagentry.html#cfn-events-eventbus-tagentry-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::EventBusPolicy.Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html#cfn-events-eventbuspolicy-condition-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html#cfn-events-eventbuspolicy-condition-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html#cfn-events-eventbuspolicy-condition-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Events::Rule.AwsVpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html","Properties":{"AssignPublicIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html#cfn-events-rule-awsvpcconfiguration-assignpublicip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html#cfn-events-rule-awsvpcconfiguration-securitygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html#cfn-events-rule-awsvpcconfiguration-subnets","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Events::Rule.BatchArrayProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batcharrayproperties.html","Properties":{"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batcharrayproperties.html#cfn-events-rule-batcharrayproperties-size","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Events::Rule.BatchParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html","Properties":{"ArrayProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-arrayproperties","Required":false,"Type":"BatchArrayProperties","UpdateType":"Mutable"},"JobDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-jobdefinition","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"JobName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-jobname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RetryStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-retrystrategy","Required":false,"Type":"BatchRetryStrategy","UpdateType":"Mutable"}}},"AWS::Events::Rule.BatchRetryStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchretrystrategy.html","Properties":{"Attempts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchretrystrategy.html#cfn-events-rule-batchretrystrategy-attempts","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Events::Rule.CapacityProviderStrategyItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-capacityproviderstrategyitem.html","Properties":{"Base":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-capacityproviderstrategyitem.html#cfn-events-rule-capacityproviderstrategyitem-base","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CapacityProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-capacityproviderstrategyitem.html#cfn-events-rule-capacityproviderstrategyitem-capacityprovider","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-capacityproviderstrategyitem.html#cfn-events-rule-capacityproviderstrategyitem-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Events::Rule.DeadLetterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-deadletterconfig.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-deadletterconfig.html#cfn-events-rule-deadletterconfig-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Events::Rule.EcsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html","Properties":{"CapacityProviderStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-capacityproviderstrategy","DuplicatesAllowed":false,"ItemType":"CapacityProviderStrategyItem","Required":false,"Type":"List","UpdateType":"Mutable"},"EnableECSManagedTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-enableecsmanagedtags","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableExecuteCommand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-enableexecutecommand","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Group":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-group","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-launchtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-networkconfiguration","Required":false,"Type":"NetworkConfiguration","UpdateType":"Mutable"},"PlacementConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-placementconstraints","DuplicatesAllowed":false,"ItemType":"PlacementConstraint","Required":false,"Type":"List","UpdateType":"Mutable"},"PlacementStrategies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-placementstrategies","DuplicatesAllowed":false,"ItemType":"PlacementStrategy","Required":false,"Type":"List","UpdateType":"Mutable"},"PlatformVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-platformversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropagateTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-propagatetags","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReferenceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-referenceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-taglist","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TaskCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-taskcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TaskDefinitionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-taskdefinitionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Rule.HttpParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-httpparameters.html","Properties":{"HeaderParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-httpparameters.html#cfn-events-rule-httpparameters-headerparameters","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"PathParameterValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-httpparameters.html#cfn-events-rule-httpparameters-pathparametervalues","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"QueryStringParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-httpparameters.html#cfn-events-rule-httpparameters-querystringparameters","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::Events::Rule.InputTransformer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-inputtransformer.html","Properties":{"InputPathsMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-inputtransformer.html#cfn-events-rule-inputtransformer-inputpathsmap","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"InputTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-inputtransformer.html#cfn-events-rule-inputtransformer-inputtemplate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Rule.KinesisParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-kinesisparameters.html","Properties":{"PartitionKeyPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-kinesisparameters.html#cfn-events-rule-kinesisparameters-partitionkeypath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Rule.NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-networkconfiguration.html","Properties":{"AwsVpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-networkconfiguration.html#cfn-events-rule-networkconfiguration-awsvpcconfiguration","Required":false,"Type":"AwsVpcConfiguration","UpdateType":"Mutable"}}},"AWS::Events::Rule.PlacementConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementconstraint.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementconstraint.html#cfn-events-rule-placementconstraint-expression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementconstraint.html#cfn-events-rule-placementconstraint-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Events::Rule.PlacementStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementstrategy.html","Properties":{"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementstrategy.html#cfn-events-rule-placementstrategy-field","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementstrategy.html#cfn-events-rule-placementstrategy-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Events::Rule.RedshiftDataParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DbUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-dbuser","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretManagerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-secretmanagerarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Sql":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-sql","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StatementName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-statementname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WithEvent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html#cfn-events-rule-redshiftdataparameters-withevent","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Events::Rule.RetryPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-retrypolicy.html","Properties":{"MaximumEventAgeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-retrypolicy.html#cfn-events-rule-retrypolicy-maximumeventageinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumRetryAttempts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-retrypolicy.html#cfn-events-rule-retrypolicy-maximumretryattempts","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Events::Rule.RunCommandParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-runcommandparameters.html","Properties":{"RunCommandTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-runcommandparameters.html#cfn-events-rule-runcommandparameters-runcommandtargets","DuplicatesAllowed":false,"ItemType":"RunCommandTarget","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Events::Rule.RunCommandTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-runcommandtarget.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-runcommandtarget.html#cfn-events-rule-runcommandtarget-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-runcommandtarget.html#cfn-events-rule-runcommandtarget-values","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Events::Rule.SageMakerPipelineParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sagemakerpipelineparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sagemakerpipelineparameter.html#cfn-events-rule-sagemakerpipelineparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sagemakerpipelineparameter.html#cfn-events-rule-sagemakerpipelineparameter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Rule.SageMakerPipelineParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sagemakerpipelineparameters.html","Properties":{"PipelineParameterList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sagemakerpipelineparameters.html#cfn-events-rule-sagemakerpipelineparameters-pipelineparameterlist","DuplicatesAllowed":false,"ItemType":"SageMakerPipelineParameter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Events::Rule.SqsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sqsparameters.html","Properties":{"MessageGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sqsparameters.html#cfn-events-rule-sqsparameters-messagegroupid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::Rule.Tag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-tag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-tag.html#cfn-events-rule-tag-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-tag.html#cfn-events-rule-tag-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Events::Rule.Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BatchParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-batchparameters","Required":false,"Type":"BatchParameters","UpdateType":"Mutable"},"DeadLetterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-deadletterconfig","Required":false,"Type":"DeadLetterConfig","UpdateType":"Mutable"},"EcsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-ecsparameters","Required":false,"Type":"EcsParameters","UpdateType":"Mutable"},"HttpParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-httpparameters","Required":false,"Type":"HttpParameters","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-input","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-inputpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputTransformer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-inputtransformer","Required":false,"Type":"InputTransformer","UpdateType":"Mutable"},"KinesisParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-kinesisparameters","Required":false,"Type":"KinesisParameters","UpdateType":"Mutable"},"RedshiftDataParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-redshiftdataparameters","Required":false,"Type":"RedshiftDataParameters","UpdateType":"Mutable"},"RetryPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-retrypolicy","Required":false,"Type":"RetryPolicy","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RunCommandParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-runcommandparameters","Required":false,"Type":"RunCommandParameters","UpdateType":"Mutable"},"SageMakerPipelineParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-sagemakerpipelineparameters","Required":false,"Type":"SageMakerPipelineParameters","UpdateType":"Mutable"},"SqsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-sqsparameters","Required":false,"Type":"SqsParameters","UpdateType":"Mutable"}}},"AWS::Evidently::Experiment.MetricGoalObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html","Properties":{"DesiredChange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-desiredchange","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EntityIdKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-entityidkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EventPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-eventpattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UnitLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-unitlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-valuekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Evidently::Experiment.OnlineAbConfigObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-onlineabconfigobject.html","Properties":{"ControlTreatmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-onlineabconfigobject.html#cfn-evidently-experiment-onlineabconfigobject-controltreatmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TreatmentWeights":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-onlineabconfigobject.html#cfn-evidently-experiment-onlineabconfigobject-treatmentweights","DuplicatesAllowed":false,"ItemType":"TreatmentToWeight","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Evidently::Experiment.RunningStatusObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-runningstatusobject.html","Properties":{"AnalysisCompleteTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-runningstatusobject.html#cfn-evidently-experiment-runningstatusobject-analysiscompletetime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DesiredState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-runningstatusobject.html#cfn-evidently-experiment-runningstatusobject-desiredstate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Reason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-runningstatusobject.html#cfn-evidently-experiment-runningstatusobject-reason","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-runningstatusobject.html#cfn-evidently-experiment-runningstatusobject-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Evidently::Experiment.TreatmentObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmentobject.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmentobject.html#cfn-evidently-experiment-treatmentobject-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Feature":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmentobject.html#cfn-evidently-experiment-treatmentobject-feature","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TreatmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmentobject.html#cfn-evidently-experiment-treatmentobject-treatmentname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Variation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmentobject.html#cfn-evidently-experiment-treatmentobject-variation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Evidently::Experiment.TreatmentToWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmenttoweight.html","Properties":{"SplitWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmenttoweight.html#cfn-evidently-experiment-treatmenttoweight-splitweight","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Treatment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmenttoweight.html#cfn-evidently-experiment-treatmenttoweight-treatment","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Evidently::Feature.EntityOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-entityoverride.html","Properties":{"EntityId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-entityoverride.html#cfn-evidently-feature-entityoverride-entityid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Variation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-entityoverride.html#cfn-evidently-feature-entityoverride-variation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Evidently::Feature.VariationObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html","Properties":{"BooleanValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html#cfn-evidently-feature-variationobject-booleanvalue","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DoubleValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html#cfn-evidently-feature-variationobject-doublevalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"LongValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html#cfn-evidently-feature-variationobject-longvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"StringValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html#cfn-evidently-feature-variationobject-stringvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VariationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html#cfn-evidently-feature-variationobject-variationname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Evidently::Launch.ExecutionStatusObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-executionstatusobject.html","Properties":{"DesiredState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-executionstatusobject.html#cfn-evidently-launch-executionstatusobject-desiredstate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Reason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-executionstatusobject.html#cfn-evidently-launch-executionstatusobject-reason","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-executionstatusobject.html#cfn-evidently-launch-executionstatusobject-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Evidently::Launch.GroupToWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-grouptoweight.html","Properties":{"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-grouptoweight.html#cfn-evidently-launch-grouptoweight-groupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SplitWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-grouptoweight.html#cfn-evidently-launch-grouptoweight-splitweight","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Evidently::Launch.LaunchGroupObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-launchgroupobject.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-launchgroupobject.html#cfn-evidently-launch-launchgroupobject-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Feature":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-launchgroupobject.html#cfn-evidently-launch-launchgroupobject-feature","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-launchgroupobject.html#cfn-evidently-launch-launchgroupobject-groupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Variation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-launchgroupobject.html#cfn-evidently-launch-launchgroupobject-variation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Evidently::Launch.MetricDefinitionObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html","Properties":{"EntityIdKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html#cfn-evidently-launch-metricdefinitionobject-entityidkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EventPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html#cfn-evidently-launch-metricdefinitionobject-eventpattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html#cfn-evidently-launch-metricdefinitionobject-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UnitLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html#cfn-evidently-launch-metricdefinitionobject-unitlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html#cfn-evidently-launch-metricdefinitionobject-valuekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Evidently::Launch.SegmentOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-segmentoverride.html","Properties":{"EvaluationOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-segmentoverride.html#cfn-evidently-launch-segmentoverride-evaluationorder","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Segment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-segmentoverride.html#cfn-evidently-launch-segmentoverride-segment","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weights":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-segmentoverride.html#cfn-evidently-launch-segmentoverride-weights","DuplicatesAllowed":false,"ItemType":"GroupToWeight","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Evidently::Launch.StepConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-stepconfig.html","Properties":{"GroupWeights":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-stepconfig.html#cfn-evidently-launch-stepconfig-groupweights","DuplicatesAllowed":false,"ItemType":"GroupToWeight","Required":true,"Type":"List","UpdateType":"Mutable"},"SegmentOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-stepconfig.html#cfn-evidently-launch-stepconfig-segmentoverrides","DuplicatesAllowed":false,"ItemType":"SegmentOverride","Required":false,"Type":"List","UpdateType":"Mutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-stepconfig.html#cfn-evidently-launch-stepconfig-starttime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Evidently::Project.AppConfigResourceObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-appconfigresourceobject.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-appconfigresourceobject.html#cfn-evidently-project-appconfigresourceobject-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EnvironmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-appconfigresourceobject.html#cfn-evidently-project-appconfigresourceobject-environmentid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Evidently::Project.DataDeliveryObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-datadeliveryobject.html","Properties":{"LogGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-datadeliveryobject.html#cfn-evidently-project-datadeliveryobject-loggroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-datadeliveryobject.html#cfn-evidently-project-datadeliveryobject-s3","Required":false,"Type":"S3Destination","UpdateType":"Mutable"}}},"AWS::Evidently::Project.S3Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-s3destination.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-s3destination.html#cfn-evidently-project-s3destination-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-s3destination.html#cfn-evidently-project-s3destination-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FIS::ExperimentTemplate.CloudWatchLogsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-cloudwatchlogsconfiguration.html","Properties":{"LogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-cloudwatchlogsconfiguration.html#cfn-fis-experimenttemplate-cloudwatchlogsconfiguration-loggrouparn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::FIS::ExperimentTemplate.ExperimentTemplateAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplateaction.html","Properties":{"ActionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplateaction.html#cfn-fis-experimenttemplate-experimenttemplateaction-actionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplateaction.html#cfn-fis-experimenttemplate-experimenttemplateaction-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplateaction.html#cfn-fis-experimenttemplate-experimenttemplateaction-parameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"StartAfter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplateaction.html#cfn-fis-experimenttemplate-experimenttemplateaction-startafter","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplateaction.html#cfn-fis-experimenttemplate-experimenttemplateaction-targets","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::FIS::ExperimentTemplate.ExperimentTemplateLogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatelogconfiguration.html","Properties":{"CloudWatchLogsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatelogconfiguration.html#cfn-fis-experimenttemplate-experimenttemplatelogconfiguration-cloudwatchlogsconfiguration","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"LogSchemaVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatelogconfiguration.html#cfn-fis-experimenttemplate-experimenttemplatelogconfiguration-logschemaversion","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatelogconfiguration.html#cfn-fis-experimenttemplate-experimenttemplatelogconfiguration-s3configuration","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::FIS::ExperimentTemplate.ExperimentTemplateStopCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatestopcondition.html","Properties":{"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatestopcondition.html#cfn-fis-experimenttemplate-experimenttemplatestopcondition-source","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatestopcondition.html#cfn-fis-experimenttemplate-experimenttemplatestopcondition-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FIS::ExperimentTemplate.ExperimentTemplateTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetarget.html","Properties":{"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetarget.html#cfn-fis-experimenttemplate-experimenttemplatetarget-filters","DuplicatesAllowed":true,"ItemType":"ExperimentTemplateTargetFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetarget.html#cfn-fis-experimenttemplate-experimenttemplatetarget-parameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"ResourceArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetarget.html#cfn-fis-experimenttemplate-experimenttemplatetarget-resourcearns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetarget.html#cfn-fis-experimenttemplate-experimenttemplatetarget-resourcetags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetarget.html#cfn-fis-experimenttemplate-experimenttemplatetarget-resourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetarget.html#cfn-fis-experimenttemplate-experimenttemplatetarget-selectionmode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::FIS::ExperimentTemplate.ExperimentTemplateTargetFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetargetfilter.html","Properties":{"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetargetfilter.html#cfn-fis-experimenttemplate-experimenttemplatetargetfilter-path","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetargetfilter.html#cfn-fis-experimenttemplate-experimenttemplatetargetfilter-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::FIS::ExperimentTemplate.S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-s3configuration.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-s3configuration.html#cfn-fis-experimenttemplate-s3configuration-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-s3configuration.html#cfn-fis-experimenttemplate-s3configuration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FMS::Policy.IEMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-iemap.html","Properties":{"ACCOUNT":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-iemap.html#cfn-fms-policy-iemap-account","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ORGUNIT":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-iemap.html#cfn-fms-policy-iemap-orgunit","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FMS::Policy.NetworkFirewallPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html","Properties":{"FirewallDeploymentModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-networkfirewallpolicy.html#cfn-fms-policy-networkfirewallpolicy-firewalldeploymentmodel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::FMS::Policy.PolicyOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-policyoption.html","Properties":{"NetworkFirewallPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-policyoption.html#cfn-fms-policy-policyoption-networkfirewallpolicy","Required":false,"Type":"NetworkFirewallPolicy","UpdateType":"Mutable"},"ThirdPartyFirewallPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-policyoption.html#cfn-fms-policy-policyoption-thirdpartyfirewallpolicy","Required":false,"Type":"ThirdPartyFirewallPolicy","UpdateType":"Mutable"}}},"AWS::FMS::Policy.PolicyTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-policytag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-policytag.html#cfn-fms-policy-policytag-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-policytag.html#cfn-fms-policy-policytag-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::FMS::Policy.ResourceTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-resourcetag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-resourcetag.html#cfn-fms-policy-resourcetag-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-resourcetag.html#cfn-fms-policy-resourcetag-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FMS::Policy.SecurityServicePolicyData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-securityservicepolicydata.html","Properties":{"ManagedServiceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-securityservicepolicydata.html#cfn-fms-policy-securityservicepolicydata-managedservicedata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PolicyOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-securityservicepolicydata.html#cfn-fms-policy-securityservicepolicydata-policyoption","Required":false,"Type":"PolicyOption","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-securityservicepolicydata.html#cfn-fms-policy-securityservicepolicydata-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::FMS::Policy.ThirdPartyFirewallPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-thirdpartyfirewallpolicy.html","Properties":{"FirewallDeploymentModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fms-policy-thirdpartyfirewallpolicy.html#cfn-fms-policy-thirdpartyfirewallpolicy-firewalldeploymentmodel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::FSx::DataRepositoryAssociation.AutoExportPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-datarepositoryassociation-autoexportpolicy.html","Properties":{"Events":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-datarepositoryassociation-autoexportpolicy.html#cfn-fsx-datarepositoryassociation-autoexportpolicy-events","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::FSx::DataRepositoryAssociation.AutoImportPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-datarepositoryassociation-autoimportpolicy.html","Properties":{"Events":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-datarepositoryassociation-autoimportpolicy.html#cfn-fsx-datarepositoryassociation-autoimportpolicy-events","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::FSx::DataRepositoryAssociation.S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-datarepositoryassociation-s3.html","Properties":{"AutoExportPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-datarepositoryassociation-s3.html#cfn-fsx-datarepositoryassociation-s3-autoexportpolicy","Required":false,"Type":"AutoExportPolicy","UpdateType":"Mutable"},"AutoImportPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-datarepositoryassociation-s3.html#cfn-fsx-datarepositoryassociation-s3-autoimportpolicy","Required":false,"Type":"AutoImportPolicy","UpdateType":"Mutable"}}},"AWS::FSx::FileSystem.AuditLogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-auditlogconfiguration.html","Properties":{"AuditLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-auditlogconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-auditlogconfiguration-auditlogdestination","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FileAccessAuditLogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-auditlogconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-auditlogconfiguration-fileaccessauditloglevel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FileShareAccessAuditLogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-auditlogconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-auditlogconfiguration-fileshareaccessauditloglevel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::FSx::FileSystem.ClientConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations.html","Properties":{"Clients":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations-clients","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations-options","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::FSx::FileSystem.DiskIopsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration.html","Properties":{"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration-mode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::FSx::FileSystem.LustreConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html","Properties":{"AutoImportPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-autoimportpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AutomaticBackupRetentionDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-automaticbackupretentiondays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CopyTagsToBackups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-copytagstobackups","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DailyAutomaticBackupStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-dailyautomaticbackupstarttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataCompressionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-datacompressiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeploymentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-deploymenttype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DriveCacheType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-drivecachetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ExportPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-exportpath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ImportPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-importpath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ImportedFileChunkSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-importedfilechunksize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"PerUnitStorageThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-perunitstoragethroughput","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"WeeklyMaintenanceStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-weeklymaintenancestarttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FSx::FileSystem.NfsExports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports.html","Properties":{"ClientConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations","ItemType":"ClientConfigurations","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::FSx::FileSystem.OntapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html","Properties":{"AutomaticBackupRetentionDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-automaticbackupretentiondays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DailyAutomaticBackupStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-dailyautomaticbackupstarttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeploymentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-deploymenttype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DiskIopsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-diskiopsconfiguration","Required":false,"Type":"DiskIopsConfiguration","UpdateType":"Mutable"},"EndpointIpAddressRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-endpointipaddressrange","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FsxAdminPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-fsxadminpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreferredSubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-preferredsubnetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RouteTableIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-routetableids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ThroughputCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-throughputcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"WeeklyMaintenanceStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-weeklymaintenancestarttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FSx::FileSystem.OpenZFSConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html","Properties":{"AutomaticBackupRetentionDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-automaticbackupretentiondays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CopyTagsToBackups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-copytagstobackups","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CopyTagsToVolumes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-copytagstovolumes","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DailyAutomaticBackupStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-dailyautomaticbackupstarttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeploymentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-deploymenttype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DiskIopsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration","Required":false,"Type":"DiskIopsConfiguration","UpdateType":"Immutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-options","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RootVolumeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration","Required":false,"Type":"RootVolumeConfiguration","UpdateType":"Mutable"},"ThroughputCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-throughputcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"WeeklyMaintenanceStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-weeklymaintenancestarttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FSx::FileSystem.RootVolumeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html","Properties":{"CopyTagsToSnapshots":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-copytagstosnapshots","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DataCompressionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-datacompressiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NfsExports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports","ItemType":"NfsExports","Required":false,"Type":"List","UpdateType":"Immutable"},"ReadOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-readonly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"RecordSizeKiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-recordsizekib","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"UserAndGroupQuotas":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas","ItemType":"UserAndGroupQuotas","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::FSx::FileSystem.SelfManagedActiveDirectoryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html","Properties":{"DnsIps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-dnsips","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-domainname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FileSystemAdministratorsGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-filesystemadministratorsgroup","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OrganizationalUnitDistinguishedName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-organizationalunitdistinguishedname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-password","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FSx::FileSystem.UserAndGroupQuotas":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas-id","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"StorageCapacityQuotaGiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas-storagecapacityquotagib","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::FSx::FileSystem.WindowsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html","Properties":{"ActiveDirectoryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-activedirectoryid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Aliases":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-aliases","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AuditLogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-auditlogconfiguration","Required":false,"Type":"AuditLogConfiguration","UpdateType":"Mutable"},"AutomaticBackupRetentionDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-automaticbackupretentiondays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CopyTagsToBackups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-copytagstobackups","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DailyAutomaticBackupStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-dailyautomaticbackupstarttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeploymentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-deploymenttype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PreferredSubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-preferredsubnetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SelfManagedActiveDirectoryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration","Required":false,"Type":"SelfManagedActiveDirectoryConfiguration","UpdateType":"Mutable"},"ThroughputCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-throughputcapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"WeeklyMaintenanceStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-weeklymaintenancestarttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FSx::StorageVirtualMachine.ActiveDirectoryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration.html","Properties":{"NetBiosName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-netbiosname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelfManagedActiveDirectoryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration","Required":false,"Type":"SelfManagedActiveDirectoryConfiguration","UpdateType":"Mutable"}}},"AWS::FSx::StorageVirtualMachine.SelfManagedActiveDirectoryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html","Properties":{"DnsIps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-dnsips","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-domainname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FileSystemAdministratorsGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-filesystemadministratorsgroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OrganizationalUnitDistinguishedName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-organizationalunitdistinguishedname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-password","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FSx::Volume.ClientConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations.html","Properties":{"Clients":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations.html#cfn-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations-clients","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations.html#cfn-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations-options","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::FSx::Volume.NfsExports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-nfsexports.html","Properties":{"ClientConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-nfsexports.html#cfn-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations","ItemType":"ClientConfigurations","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::FSx::Volume.OntapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html","Properties":{"CopyTagsToBackups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-copytagstobackups","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JunctionPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-junctionpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OntapVolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-ontapvolumetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-securitystyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SizeInMegabytes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-sizeinmegabytes","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SnapshotPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-snapshotpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StorageEfficiencyEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-storageefficiencyenabled","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StorageVirtualMachineId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-storagevirtualmachineid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TieringPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-tieringpolicy","Required":false,"Type":"TieringPolicy","UpdateType":"Mutable"}}},"AWS::FSx::Volume.OpenZFSConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html","Properties":{"CopyTagsToSnapshots":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-copytagstosnapshots","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DataCompressionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-datacompressiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NfsExports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-nfsexports","ItemType":"NfsExports","Required":false,"Type":"List","UpdateType":"Mutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-options","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OriginSnapshot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-originsnapshot","Required":false,"Type":"OriginSnapshot","UpdateType":"Immutable"},"ParentVolumeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-parentvolumeid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ReadOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-readonly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RecordSizeKiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-recordsizekib","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StorageCapacityQuotaGiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-storagecapacityquotagib","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StorageCapacityReservationGiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-storagecapacityreservationgib","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UserAndGroupQuotas":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-userandgroupquotas","ItemType":"UserAndGroupQuotas","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FSx::Volume.OriginSnapshot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-originsnapshot.html","Properties":{"CopyStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-originsnapshot.html#cfn-fsx-volume-openzfsconfiguration-originsnapshot-copystrategy","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SnapshotARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-originsnapshot.html#cfn-fsx-volume-openzfsconfiguration-originsnapshot-snapshotarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::FSx::Volume.TieringPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration-tieringpolicy.html","Properties":{"CoolingPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration-tieringpolicy.html#cfn-fsx-volume-ontapconfiguration-tieringpolicy-coolingperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration-tieringpolicy.html#cfn-fsx-volume-ontapconfiguration-tieringpolicy-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FSx::Volume.UserAndGroupQuotas":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-userandgroupquotas.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-userandgroupquotas.html#cfn-fsx-volume-openzfsconfiguration-userandgroupquotas-id","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"StorageCapacityQuotaGiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-userandgroupquotas.html#cfn-fsx-volume-openzfsconfiguration-userandgroupquotas-storagecapacityquotagib","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-userandgroupquotas.html#cfn-fsx-volume-openzfsconfiguration-userandgroupquotas-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::FinSpace::Environment.AttributeMapItems":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-attributemapitems.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-attributemapitems.html#cfn-finspace-environment-attributemapitems-key","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-attributemapitems.html#cfn-finspace-environment-attributemapitems-value","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::FinSpace::Environment.FederationParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-federationparameters.html","Properties":{"ApplicationCallBackURL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-federationparameters.html#cfn-finspace-environment-federationparameters-applicationcallbackurl","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AttributeMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-federationparameters.html#cfn-finspace-environment-federationparameters-attributemap","DuplicatesAllowed":true,"ItemType":"AttributeMapItems","Required":false,"Type":"List","UpdateType":"Immutable"},"FederationProviderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-federationparameters.html#cfn-finspace-environment-federationparameters-federationprovidername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FederationURN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-federationparameters.html#cfn-finspace-environment-federationparameters-federationurn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SamlMetadataDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-federationparameters.html#cfn-finspace-environment-federationparameters-samlmetadatadocument","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SamlMetadataURL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-federationparameters.html#cfn-finspace-environment-federationparameters-samlmetadataurl","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::FinSpace::Environment.SuperuserParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-superuserparameters.html","Properties":{"EmailAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-superuserparameters.html#cfn-finspace-environment-superuserparameters-emailaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FirstName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-superuserparameters.html#cfn-finspace-environment-superuserparameters-firstname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LastName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-superuserparameters.html#cfn-finspace-environment-superuserparameters-lastname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Forecast::Dataset.AttributesItems":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-forecast-dataset-attributesitems.html","Properties":{"AttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-forecast-dataset-attributesitems.html#cfn-forecast-dataset-attributesitems-attributename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AttributeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-forecast-dataset-attributesitems.html#cfn-forecast-dataset-attributesitems-attributetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Forecast::Dataset.EncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-forecast-dataset-encryptionconfig.html","Properties":{"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-forecast-dataset-encryptionconfig.html#cfn-forecast-dataset-encryptionconfig-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-forecast-dataset-encryptionconfig.html#cfn-forecast-dataset-encryptionconfig-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Forecast::Dataset.Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-forecast-dataset-schema.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-forecast-dataset-schema.html#cfn-forecast-dataset-schema-attributes","DuplicatesAllowed":true,"ItemType":"AttributesItems","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Forecast::Dataset.TagsItems":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-forecast-dataset-tagsitems.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-forecast-dataset-tagsitems.html#cfn-forecast-dataset-tagsitems-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-forecast-dataset-tagsitems.html#cfn-forecast-dataset-tagsitems-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::FraudDetector::Detector.EntityType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-entitytype.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-entitytype.html#cfn-frauddetector-detector-entitytype-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-entitytype.html#cfn-frauddetector-detector-entitytype-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-entitytype.html#cfn-frauddetector-detector-entitytype-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Inline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-entitytype.html#cfn-frauddetector-detector-entitytype-inline","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LastUpdatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-entitytype.html#cfn-frauddetector-detector-entitytype-lastupdatedtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-entitytype.html#cfn-frauddetector-detector-entitytype-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-entitytype.html#cfn-frauddetector-detector-entitytype-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::Detector.EventType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventtype.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventtype.html#cfn-frauddetector-detector-eventtype-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventtype.html#cfn-frauddetector-detector-eventtype-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventtype.html#cfn-frauddetector-detector-eventtype-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EntityTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventtype.html#cfn-frauddetector-detector-eventtype-entitytypes","DuplicatesAllowed":true,"ItemType":"EntityType","Required":false,"Type":"List","UpdateType":"Mutable"},"EventVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventtype.html#cfn-frauddetector-detector-eventtype-eventvariables","DuplicatesAllowed":true,"ItemType":"EventVariable","Required":false,"Type":"List","UpdateType":"Mutable"},"Inline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventtype.html#cfn-frauddetector-detector-eventtype-inline","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Labels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventtype.html#cfn-frauddetector-detector-eventtype-labels","DuplicatesAllowed":true,"ItemType":"Label","Required":false,"Type":"List","UpdateType":"Mutable"},"LastUpdatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventtype.html#cfn-frauddetector-detector-eventtype-lastupdatedtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventtype.html#cfn-frauddetector-detector-eventtype-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventtype.html#cfn-frauddetector-detector-eventtype-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::Detector.EventVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html#cfn-frauddetector-detector-eventvariable-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html#cfn-frauddetector-detector-eventvariable-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html#cfn-frauddetector-detector-eventvariable-datasource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html#cfn-frauddetector-detector-eventvariable-datatype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html#cfn-frauddetector-detector-eventvariable-defaultvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html#cfn-frauddetector-detector-eventvariable-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Inline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html#cfn-frauddetector-detector-eventvariable-inline","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LastUpdatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html#cfn-frauddetector-detector-eventvariable-lastupdatedtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html#cfn-frauddetector-detector-eventvariable-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html#cfn-frauddetector-detector-eventvariable-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VariableType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-eventvariable.html#cfn-frauddetector-detector-eventvariable-variabletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FraudDetector::Detector.Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-label.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-label.html#cfn-frauddetector-detector-label-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-label.html#cfn-frauddetector-detector-label-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-label.html#cfn-frauddetector-detector-label-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Inline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-label.html#cfn-frauddetector-detector-label-inline","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LastUpdatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-label.html#cfn-frauddetector-detector-label-lastupdatedtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-label.html#cfn-frauddetector-detector-label-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-label.html#cfn-frauddetector-detector-label-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::Detector.Model":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-model.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-model.html#cfn-frauddetector-detector-model-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FraudDetector::Detector.Outcome":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-outcome.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-outcome.html#cfn-frauddetector-detector-outcome-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-outcome.html#cfn-frauddetector-detector-outcome-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-outcome.html#cfn-frauddetector-detector-outcome-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Inline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-outcome.html#cfn-frauddetector-detector-outcome-inline","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LastUpdatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-outcome.html#cfn-frauddetector-detector-outcome-lastupdatedtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-outcome.html#cfn-frauddetector-detector-outcome-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-outcome.html#cfn-frauddetector-detector-outcome-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::Detector.Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html#cfn-frauddetector-detector-rule-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html#cfn-frauddetector-detector-rule-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html#cfn-frauddetector-detector-rule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DetectorId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html#cfn-frauddetector-detector-rule-detectorid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html#cfn-frauddetector-detector-rule-expression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Language":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html#cfn-frauddetector-detector-rule-language","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LastUpdatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html#cfn-frauddetector-detector-rule-lastupdatedtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Outcomes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html#cfn-frauddetector-detector-rule-outcomes","DuplicatesAllowed":true,"ItemType":"Outcome","Required":false,"Type":"List","UpdateType":"Mutable"},"RuleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html#cfn-frauddetector-detector-rule-ruleid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RuleVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html#cfn-frauddetector-detector-rule-ruleversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-detector-rule.html#cfn-frauddetector-detector-rule-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::EventType.EntityType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-entitytype.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-entitytype.html#cfn-frauddetector-eventtype-entitytype-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-entitytype.html#cfn-frauddetector-eventtype-entitytype-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-entitytype.html#cfn-frauddetector-eventtype-entitytype-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Inline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-entitytype.html#cfn-frauddetector-eventtype-entitytype-inline","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LastUpdatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-entitytype.html#cfn-frauddetector-eventtype-entitytype-lastupdatedtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-entitytype.html#cfn-frauddetector-eventtype-entitytype-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-entitytype.html#cfn-frauddetector-eventtype-entitytype-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::EventType.EventVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html#cfn-frauddetector-eventtype-eventvariable-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html#cfn-frauddetector-eventtype-eventvariable-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html#cfn-frauddetector-eventtype-eventvariable-datasource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html#cfn-frauddetector-eventtype-eventvariable-datatype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html#cfn-frauddetector-eventtype-eventvariable-defaultvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html#cfn-frauddetector-eventtype-eventvariable-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Inline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html#cfn-frauddetector-eventtype-eventvariable-inline","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LastUpdatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html#cfn-frauddetector-eventtype-eventvariable-lastupdatedtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html#cfn-frauddetector-eventtype-eventvariable-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html#cfn-frauddetector-eventtype-eventvariable-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VariableType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-eventvariable.html#cfn-frauddetector-eventtype-eventvariable-variabletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FraudDetector::EventType.Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-label.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-label.html#cfn-frauddetector-eventtype-label-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-label.html#cfn-frauddetector-eventtype-label-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-label.html#cfn-frauddetector-eventtype-label-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Inline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-label.html#cfn-frauddetector-eventtype-label-inline","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LastUpdatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-label.html#cfn-frauddetector-eventtype-label-lastupdatedtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-label.html#cfn-frauddetector-eventtype-label-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-frauddetector-eventtype-label.html#cfn-frauddetector-eventtype-label-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GameLift::Alias.RoutingStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-alias-routingstrategy.html","Properties":{"FleetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-alias-routingstrategy.html#cfn-gamelift-alias-routingstrategy-fleetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-alias-routingstrategy.html#cfn-gamelift-alias-routingstrategy-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-alias-routingstrategy.html#cfn-gamelift-alias-routingstrategy-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::GameLift::Build.StorageLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-build-storagelocation.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-build-storagelocation.html#cfn-gamelift-build-storagelocation-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-build-storagelocation.html#cfn-gamelift-build-storagelocation-key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-build-storagelocation.html#cfn-gamelift-build-storagelocation-objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-build-storagelocation.html#cfn-gamelift-build-storagelocation-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::GameLift::Fleet.AnywhereConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-anywhereconfiguration.html","Properties":{"Cost":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-anywhereconfiguration.html#cfn-gamelift-fleet-anywhereconfiguration-cost","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::GameLift::Fleet.CertificateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-certificateconfiguration.html","Properties":{"CertificateType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-certificateconfiguration.html#cfn-gamelift-fleet-certificateconfiguration-certificatetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::GameLift::Fleet.IpPermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-ippermission.html","Properties":{"FromPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-ippermission.html#cfn-gamelift-fleet-ippermission-fromport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"IpRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-ippermission.html#cfn-gamelift-fleet-ippermission-iprange","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-ippermission.html#cfn-gamelift-fleet-ippermission-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ToPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-ippermission.html#cfn-gamelift-fleet-ippermission-toport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::GameLift::Fleet.LocationCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-locationcapacity.html","Properties":{"DesiredEC2Instances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-locationcapacity.html#cfn-gamelift-fleet-locationcapacity-desiredec2instances","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MaxSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-locationcapacity.html#cfn-gamelift-fleet-locationcapacity-maxsize","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MinSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-locationcapacity.html#cfn-gamelift-fleet-locationcapacity-minsize","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::GameLift::Fleet.LocationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-locationconfiguration.html","Properties":{"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-locationconfiguration.html#cfn-gamelift-fleet-locationconfiguration-location","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LocationCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-locationconfiguration.html#cfn-gamelift-fleet-locationconfiguration-locationcapacity","Required":false,"Type":"LocationCapacity","UpdateType":"Mutable"}}},"AWS::GameLift::Fleet.ResourceCreationLimitPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-resourcecreationlimitpolicy.html","Properties":{"NewGameSessionsPerCreator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-resourcecreationlimitpolicy.html#cfn-gamelift-fleet-resourcecreationlimitpolicy-newgamesessionspercreator","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PolicyPeriodInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-resourcecreationlimitpolicy.html#cfn-gamelift-fleet-resourcecreationlimitpolicy-policyperiodinminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::GameLift::Fleet.RuntimeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-runtimeconfiguration.html","Properties":{"GameSessionActivationTimeoutSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-runtimeconfiguration.html#cfn-gamelift-fleet-runtimeconfiguration-gamesessionactivationtimeoutseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxConcurrentGameSessionActivations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-runtimeconfiguration.html#cfn-gamelift-fleet-runtimeconfiguration-maxconcurrentgamesessionactivations","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ServerProcesses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-runtimeconfiguration.html#cfn-gamelift-fleet-runtimeconfiguration-serverprocesses","DuplicatesAllowed":true,"ItemType":"ServerProcess","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GameLift::Fleet.ServerProcess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-serverprocess.html","Properties":{"ConcurrentExecutions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-serverprocess.html#cfn-gamelift-fleet-serverprocess-concurrentexecutions","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"LaunchPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-serverprocess.html#cfn-gamelift-fleet-serverprocess-launchpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-fleet-serverprocess.html#cfn-gamelift-fleet-serverprocess-parameters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GameLift::GameServerGroup.AutoScalingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-autoscalingpolicy.html","Properties":{"EstimatedInstanceWarmup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-autoscalingpolicy.html#cfn-gamelift-gameservergroup-autoscalingpolicy-estimatedinstancewarmup","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TargetTrackingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-autoscalingpolicy.html#cfn-gamelift-gameservergroup-autoscalingpolicy-targettrackingconfiguration","Required":true,"Type":"TargetTrackingConfiguration","UpdateType":"Mutable"}}},"AWS::GameLift::GameServerGroup.InstanceDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-instancedefinition.html","Properties":{"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-instancedefinition.html#cfn-gamelift-gameservergroup-instancedefinition-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"WeightedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-instancedefinition.html#cfn-gamelift-gameservergroup-instancedefinition-weightedcapacity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GameLift::GameServerGroup.LaunchTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-launchtemplate.html","Properties":{"LaunchTemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-launchtemplate.html#cfn-gamelift-gameservergroup-launchtemplate-launchtemplateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchTemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-launchtemplate.html#cfn-gamelift-gameservergroup-launchtemplate-launchtemplatename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-launchtemplate.html#cfn-gamelift-gameservergroup-launchtemplate-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GameLift::GameServerGroup.TargetTrackingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-targettrackingconfiguration.html","Properties":{"TargetValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gameservergroup-targettrackingconfiguration.html#cfn-gamelift-gameservergroup-targettrackingconfiguration-targetvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::GameLift::GameSessionQueue.Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gamesessionqueue-destination.html","Properties":{"DestinationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gamesessionqueue-destination.html#cfn-gamelift-gamesessionqueue-destination-destinationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GameLift::GameSessionQueue.FilterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gamesessionqueue-filterconfiguration.html","Properties":{"AllowedLocations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gamesessionqueue-filterconfiguration.html#cfn-gamelift-gamesessionqueue-filterconfiguration-allowedlocations","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GameLift::GameSessionQueue.PlayerLatencyPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gamesessionqueue-playerlatencypolicy.html","Properties":{"MaximumIndividualPlayerLatencyMilliseconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gamesessionqueue-playerlatencypolicy.html#cfn-gamelift-gamesessionqueue-playerlatencypolicy-maximumindividualplayerlatencymilliseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PolicyDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gamesessionqueue-playerlatencypolicy.html#cfn-gamelift-gamesessionqueue-playerlatencypolicy-policydurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::GameLift::GameSessionQueue.PriorityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gamesessionqueue-priorityconfiguration.html","Properties":{"LocationOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gamesessionqueue-priorityconfiguration.html#cfn-gamelift-gamesessionqueue-priorityconfiguration-locationorder","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PriorityOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-gamesessionqueue-priorityconfiguration.html#cfn-gamelift-gamesessionqueue-priorityconfiguration-priorityorder","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GameLift::MatchmakingConfiguration.GameProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-matchmakingconfiguration-gameproperty.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-matchmakingconfiguration-gameproperty.html#cfn-gamelift-matchmakingconfiguration-gameproperty-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-matchmakingconfiguration-gameproperty.html#cfn-gamelift-matchmakingconfiguration-gameproperty-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::GameLift::Script.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-script-s3location.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-script-s3location.html#cfn-gamelift-script-s3location-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-script-s3location.html#cfn-gamelift-script-s3location-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-script-s3location.html#cfn-gamelift-script-s3location-objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-gamelift-script-s3location.html#cfn-gamelift-script-s3location-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::GlobalAccelerator::EndpointGroup.EndpointConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-endpointgroup-endpointconfiguration.html","Properties":{"ClientIPPreservationEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-endpointgroup-endpointconfiguration.html#cfn-globalaccelerator-endpointgroup-endpointconfiguration-clientippreservationenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-endpointgroup-endpointconfiguration.html#cfn-globalaccelerator-endpointgroup-endpointconfiguration-endpointid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-endpointgroup-endpointconfiguration.html#cfn-globalaccelerator-endpointgroup-endpointconfiguration-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::GlobalAccelerator::EndpointGroup.PortOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-endpointgroup-portoverride.html","Properties":{"EndpointPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-endpointgroup-portoverride.html#cfn-globalaccelerator-endpointgroup-portoverride-endpointport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ListenerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-endpointgroup-portoverride.html#cfn-globalaccelerator-endpointgroup-portoverride-listenerport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::GlobalAccelerator::Listener.PortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-listener-portrange.html","Properties":{"FromPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-listener-portrange.html#cfn-globalaccelerator-listener-portrange-fromport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ToPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-globalaccelerator-listener-portrange.html#cfn-globalaccelerator-listener-portrange-toport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Glue::Classifier.CsvClassifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-csvclassifier.html","Properties":{"AllowSingleColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-csvclassifier.html#cfn-glue-classifier-csvclassifier-allowsinglecolumn","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ContainsHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-csvclassifier.html#cfn-glue-classifier-csvclassifier-containsheader","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-csvclassifier.html#cfn-glue-classifier-csvclassifier-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisableValueTrimming":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-csvclassifier.html#cfn-glue-classifier-csvclassifier-disablevaluetrimming","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-csvclassifier.html#cfn-glue-classifier-csvclassifier-header","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-csvclassifier.html#cfn-glue-classifier-csvclassifier-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"QuoteSymbol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-csvclassifier.html#cfn-glue-classifier-csvclassifier-quotesymbol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Classifier.GrokClassifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-grokclassifier.html","Properties":{"Classification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-grokclassifier.html#cfn-glue-classifier-grokclassifier-classification","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CustomPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-grokclassifier.html#cfn-glue-classifier-grokclassifier-custompatterns","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GrokPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-grokclassifier.html#cfn-glue-classifier-grokclassifier-grokpattern","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-grokclassifier.html#cfn-glue-classifier-grokclassifier-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Glue::Classifier.JsonClassifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-jsonclassifier.html","Properties":{"JsonPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-jsonclassifier.html#cfn-glue-classifier-jsonclassifier-jsonpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-jsonclassifier.html#cfn-glue-classifier-jsonclassifier-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Glue::Classifier.XMLClassifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-xmlclassifier.html","Properties":{"Classification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-xmlclassifier.html#cfn-glue-classifier-xmlclassifier-classification","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-xmlclassifier.html#cfn-glue-classifier-xmlclassifier-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RowTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-classifier-xmlclassifier.html#cfn-glue-classifier-xmlclassifier-rowtag","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Glue::Connection.ConnectionInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-connectioninput.html","Properties":{"ConnectionProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-connectioninput.html#cfn-glue-connection-connectioninput-connectionproperties","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ConnectionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-connectioninput.html#cfn-glue-connection-connectioninput-connectiontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-connectioninput.html#cfn-glue-connection-connectioninput-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MatchCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-connectioninput.html#cfn-glue-connection-connectioninput-matchcriteria","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-connectioninput.html#cfn-glue-connection-connectioninput-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PhysicalConnectionRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-connectioninput.html#cfn-glue-connection-connectioninput-physicalconnectionrequirements","Required":false,"Type":"PhysicalConnectionRequirements","UpdateType":"Mutable"}}},"AWS::Glue::Connection.PhysicalConnectionRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-physicalconnectionrequirements.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-physicalconnectionrequirements.html#cfn-glue-connection-physicalconnectionrequirements-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroupIdList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-physicalconnectionrequirements.html#cfn-glue-connection-physicalconnectionrequirements-securitygroupidlist","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-physicalconnectionrequirements.html#cfn-glue-connection-physicalconnectionrequirements-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Crawler.CatalogTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-catalogtarget.html","Properties":{"ConnectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-catalogtarget.html#cfn-glue-crawler-catalogtarget-connectionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-catalogtarget.html#cfn-glue-crawler-catalogtarget-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DlqEventQueueArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-catalogtarget.html#cfn-glue-crawler-catalogtarget-dlqeventqueuearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventQueueArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-catalogtarget.html#cfn-glue-crawler-catalogtarget-eventqueuearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-catalogtarget.html#cfn-glue-crawler-catalogtarget-tables","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Glue::Crawler.DeltaTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-deltatarget.html","Properties":{"ConnectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-deltatarget.html#cfn-glue-crawler-deltatarget-connectionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreateNativeDeltaTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-deltatarget.html#cfn-glue-crawler-deltatarget-createnativedeltatable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DeltaTables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-deltatarget.html#cfn-glue-crawler-deltatarget-deltatables","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"WriteManifest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-deltatarget.html#cfn-glue-crawler-deltatarget-writemanifest","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Crawler.DynamoDBTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-dynamodbtarget.html","Properties":{"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-dynamodbtarget.html#cfn-glue-crawler-dynamodbtarget-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Crawler.JdbcTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-jdbctarget.html","Properties":{"ConnectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-jdbctarget.html#cfn-glue-crawler-jdbctarget-connectionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Exclusions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-jdbctarget.html#cfn-glue-crawler-jdbctarget-exclusions","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-jdbctarget.html#cfn-glue-crawler-jdbctarget-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Crawler.MongoDBTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-mongodbtarget.html","Properties":{"ConnectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-mongodbtarget.html#cfn-glue-crawler-mongodbtarget-connectionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-mongodbtarget.html#cfn-glue-crawler-mongodbtarget-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Crawler.RecrawlPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-recrawlpolicy.html","Properties":{"RecrawlBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-recrawlpolicy.html#cfn-glue-crawler-recrawlpolicy-recrawlbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Crawler.S3Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html","Properties":{"ConnectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html#cfn-glue-crawler-s3target-connectionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DlqEventQueueArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html#cfn-glue-crawler-s3target-dlqeventqueuearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventQueueArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html#cfn-glue-crawler-s3target-eventqueuearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Exclusions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html#cfn-glue-crawler-s3target-exclusions","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html#cfn-glue-crawler-s3target-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SampleSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html#cfn-glue-crawler-s3target-samplesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Crawler.Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-schedule.html","Properties":{"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-schedule.html#cfn-glue-crawler-schedule-scheduleexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Crawler.SchemaChangePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-schemachangepolicy.html","Properties":{"DeleteBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-schemachangepolicy.html#cfn-glue-crawler-schemachangepolicy-deletebehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UpdateBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-schemachangepolicy.html#cfn-glue-crawler-schemachangepolicy-updatebehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Crawler.Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-targets.html","Properties":{"CatalogTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-targets.html#cfn-glue-crawler-targets-catalogtargets","ItemType":"CatalogTarget","Required":false,"Type":"List","UpdateType":"Mutable"},"DeltaTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-targets.html#cfn-glue-crawler-targets-deltatargets","ItemType":"DeltaTarget","Required":false,"Type":"List","UpdateType":"Mutable"},"DynamoDBTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-targets.html#cfn-glue-crawler-targets-dynamodbtargets","ItemType":"DynamoDBTarget","Required":false,"Type":"List","UpdateType":"Mutable"},"JdbcTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-targets.html#cfn-glue-crawler-targets-jdbctargets","ItemType":"JdbcTarget","Required":false,"Type":"List","UpdateType":"Mutable"},"MongoDBTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-targets.html#cfn-glue-crawler-targets-mongodbtargets","ItemType":"MongoDBTarget","Required":false,"Type":"List","UpdateType":"Mutable"},"S3Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-targets.html#cfn-glue-crawler-targets-s3targets","ItemType":"S3Target","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Glue::DataCatalogEncryptionSettings.ConnectionPasswordEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-datacatalogencryptionsettings-connectionpasswordencryption.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-datacatalogencryptionsettings-connectionpasswordencryption.html#cfn-glue-datacatalogencryptionsettings-connectionpasswordencryption-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReturnConnectionPasswordEncrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-datacatalogencryptionsettings-connectionpasswordencryption.html#cfn-glue-datacatalogencryptionsettings-connectionpasswordencryption-returnconnectionpasswordencrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::DataCatalogEncryptionSettings.DataCatalogEncryptionSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-datacatalogencryptionsettings-datacatalogencryptionsettings.html","Properties":{"ConnectionPasswordEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-datacatalogencryptionsettings-datacatalogencryptionsettings.html#cfn-glue-datacatalogencryptionsettings-datacatalogencryptionsettings-connectionpasswordencryption","Required":false,"Type":"ConnectionPasswordEncryption","UpdateType":"Mutable"},"EncryptionAtRest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-datacatalogencryptionsettings-datacatalogencryptionsettings.html#cfn-glue-datacatalogencryptionsettings-datacatalogencryptionsettings-encryptionatrest","Required":false,"Type":"EncryptionAtRest","UpdateType":"Mutable"}}},"AWS::Glue::DataCatalogEncryptionSettings.EncryptionAtRest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-datacatalogencryptionsettings-encryptionatrest.html","Properties":{"CatalogEncryptionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-datacatalogencryptionsettings-encryptionatrest.html#cfn-glue-datacatalogencryptionsettings-encryptionatrest-catalogencryptionmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SseAwsKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-datacatalogencryptionsettings-encryptionatrest.html#cfn-glue-datacatalogencryptionsettings-encryptionatrest-sseawskmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::DataQualityRuleset.DataQualityTargetTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-dataqualityruleset-dataqualitytargettable.html","Properties":{"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-dataqualityruleset-dataqualitytargettable.html#cfn-glue-dataqualityruleset-dataqualitytargettable-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-dataqualityruleset-dataqualitytargettable.html#cfn-glue-dataqualityruleset-dataqualitytargettable-tablename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Database.DataLakePrincipal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-datalakeprincipal.html","Properties":{"DataLakePrincipalIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-datalakeprincipal.html#cfn-glue-database-datalakeprincipal-datalakeprincipalidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Database.DatabaseIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseidentifier.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseidentifier.html#cfn-glue-database-databaseidentifier-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseidentifier.html#cfn-glue-database-databaseidentifier-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Database.DatabaseInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput.html","Properties":{"CreateTableDefaultPermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput.html#cfn-glue-database-databaseinput-createtabledefaultpermissions","ItemType":"PrincipalPrivileges","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput.html#cfn-glue-database-databaseinput-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FederatedDatabase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput.html#cfn-glue-database-databaseinput-federateddatabase","Required":false,"Type":"FederatedDatabase","UpdateType":"Mutable"},"LocationUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput.html#cfn-glue-database-databaseinput-locationuri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput.html#cfn-glue-database-databaseinput-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput.html#cfn-glue-database-databaseinput-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TargetDatabase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput.html#cfn-glue-database-databaseinput-targetdatabase","Required":false,"Type":"DatabaseIdentifier","UpdateType":"Mutable"}}},"AWS::Glue::Database.FederatedDatabase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput-federateddatabase.html","Properties":{"ConnectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput-federateddatabase.html#cfn-glue-database-databaseinput-federateddatabase-connectionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Identifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput-federateddatabase.html#cfn-glue-database-databaseinput-federateddatabase-identifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Database.PrincipalPrivileges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-principalprivileges.html","Properties":{"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-principalprivileges.html#cfn-glue-database-principalprivileges-permissions","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-principalprivileges.html#cfn-glue-database-principalprivileges-principal","Required":false,"Type":"DataLakePrincipal","UpdateType":"Mutable"}}},"AWS::Glue::Job.ConnectionsList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-job-connectionslist.html","Properties":{"Connections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-job-connectionslist.html#cfn-glue-job-connectionslist-connections","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Glue::Job.ExecutionProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-job-executionproperty.html","Properties":{"MaxConcurrentRuns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-job-executionproperty.html#cfn-glue-job-executionproperty-maxconcurrentruns","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Job.JobCommand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-job-jobcommand.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-job-jobcommand.html#cfn-glue-job-jobcommand-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PythonVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-job-jobcommand.html#cfn-glue-job-jobcommand-pythonversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Runtime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-job-jobcommand.html#cfn-glue-job-jobcommand-runtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScriptLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-job-jobcommand.html#cfn-glue-job-jobcommand-scriptlocation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Job.NotificationProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-job-notificationproperty.html","Properties":{"NotifyDelayAfter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-job-notificationproperty.html#cfn-glue-job-notificationproperty-notifydelayafter","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::MLTransform.FindMatchesParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformparameters-findmatchesparameters.html","Properties":{"AccuracyCostTradeoff":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformparameters-findmatchesparameters.html#cfn-glue-mltransform-transformparameters-findmatchesparameters-accuracycosttradeoff","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"EnforceProvidedLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformparameters-findmatchesparameters.html#cfn-glue-mltransform-transformparameters-findmatchesparameters-enforceprovidedlabels","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PrecisionRecallTradeoff":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformparameters-findmatchesparameters.html#cfn-glue-mltransform-transformparameters-findmatchesparameters-precisionrecalltradeoff","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PrimaryKeyColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformparameters-findmatchesparameters.html#cfn-glue-mltransform-transformparameters-findmatchesparameters-primarykeycolumnname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Glue::MLTransform.GlueTables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-inputrecordtables-gluetables.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-inputrecordtables-gluetables.html#cfn-glue-mltransform-inputrecordtables-gluetables-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-inputrecordtables-gluetables.html#cfn-glue-mltransform-inputrecordtables-gluetables-connectionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-inputrecordtables-gluetables.html#cfn-glue-mltransform-inputrecordtables-gluetables-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-inputrecordtables-gluetables.html#cfn-glue-mltransform-inputrecordtables-gluetables-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Glue::MLTransform.InputRecordTables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-inputrecordtables.html","Properties":{"GlueTables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-inputrecordtables.html#cfn-glue-mltransform-inputrecordtables-gluetables","ItemType":"GlueTables","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Glue::MLTransform.MLUserDataEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformencryption-mluserdataencryption.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformencryption-mluserdataencryption.html#cfn-glue-mltransform-transformencryption-mluserdataencryption-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MLUserDataEncryptionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformencryption-mluserdataencryption.html#cfn-glue-mltransform-transformencryption-mluserdataencryption-mluserdataencryptionmode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Glue::MLTransform.TransformEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformencryption.html","Properties":{"MLUserDataEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformencryption.html#cfn-glue-mltransform-transformencryption-mluserdataencryption","Required":false,"Type":"MLUserDataEncryption","UpdateType":"Mutable"},"TaskRunSecurityConfigurationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformencryption.html#cfn-glue-mltransform-transformencryption-taskrunsecurityconfigurationname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::MLTransform.TransformParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformparameters.html","Properties":{"FindMatchesParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformparameters.html#cfn-glue-mltransform-transformparameters-findmatchesparameters","Required":false,"Type":"FindMatchesParameters","UpdateType":"Mutable"},"TransformType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-mltransform-transformparameters.html#cfn-glue-mltransform-transformparameters-transformtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Glue::Partition.Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-column.html","Properties":{"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-column.html#cfn-glue-partition-column-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-column.html#cfn-glue-partition-column-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-column.html#cfn-glue-partition-column-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Partition.Order":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-order.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-order.html#cfn-glue-partition-order-column","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SortOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-order.html#cfn-glue-partition-order-sortorder","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Partition.PartitionInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-partitioninput.html","Properties":{"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-partitioninput.html#cfn-glue-partition-partitioninput-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"StorageDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-partitioninput.html#cfn-glue-partition-partitioninput-storagedescriptor","Required":false,"Type":"StorageDescriptor","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-partitioninput.html#cfn-glue-partition-partitioninput-values","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Glue::Partition.SchemaId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemaid.html","Properties":{"RegistryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemaid.html#cfn-glue-partition-schemaid-registryname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SchemaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemaid.html#cfn-glue-partition-schemaid-schemaarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SchemaName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemaid.html#cfn-glue-partition-schemaid-schemaname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Partition.SchemaReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemareference.html","Properties":{"SchemaId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemareference.html#cfn-glue-partition-schemareference-schemaid","Required":false,"Type":"SchemaId","UpdateType":"Mutable"},"SchemaVersionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemareference.html#cfn-glue-partition-schemareference-schemaversionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SchemaVersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemareference.html#cfn-glue-partition-schemareference-schemaversionnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Partition.SerdeInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-serdeinfo.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-serdeinfo.html#cfn-glue-partition-serdeinfo-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-serdeinfo.html#cfn-glue-partition-serdeinfo-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SerializationLibrary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-serdeinfo.html#cfn-glue-partition-serdeinfo-serializationlibrary","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Partition.SkewedInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-skewedinfo.html","Properties":{"SkewedColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-skewedinfo.html#cfn-glue-partition-skewedinfo-skewedcolumnnames","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SkewedColumnValueLocationMaps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-skewedinfo.html#cfn-glue-partition-skewedinfo-skewedcolumnvaluelocationmaps","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SkewedColumnValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-skewedinfo.html#cfn-glue-partition-skewedinfo-skewedcolumnvalues","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Glue::Partition.StorageDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html","Properties":{"BucketColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-bucketcolumns","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-columns","ItemType":"Column","Required":false,"Type":"List","UpdateType":"Mutable"},"Compressed":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-compressed","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InputFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-inputformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumberOfBuckets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-numberofbuckets","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OutputFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-outputformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SchemaReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-schemareference","Required":false,"Type":"SchemaReference","UpdateType":"Mutable"},"SerdeInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-serdeinfo","Required":false,"Type":"SerdeInfo","UpdateType":"Mutable"},"SkewedInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-skewedinfo","Required":false,"Type":"SkewedInfo","UpdateType":"Mutable"},"SortColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-sortcolumns","ItemType":"Order","Required":false,"Type":"List","UpdateType":"Mutable"},"StoredAsSubDirectories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-storagedescriptor.html#cfn-glue-partition-storagedescriptor-storedassubdirectories","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Schema.Registry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-schema-registry.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-schema-registry.html#cfn-glue-schema-registry-arn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-schema-registry.html#cfn-glue-schema-registry-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Glue::Schema.SchemaVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-schema-schemaversion.html","Properties":{"IsLatest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-schema-schemaversion.html#cfn-glue-schema-schemaversion-islatest","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"VersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-schema-schemaversion.html#cfn-glue-schema-schemaversion-versionnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::SchemaVersion.Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-schemaversion-schema.html","Properties":{"RegistryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-schemaversion-schema.html#cfn-glue-schemaversion-schema-registryname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SchemaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-schemaversion-schema.html#cfn-glue-schemaversion-schema-schemaarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SchemaName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-schemaversion-schema.html#cfn-glue-schemaversion-schema-schemaname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Glue::SecurityConfiguration.CloudWatchEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-cloudwatchencryption.html","Properties":{"CloudWatchEncryptionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-cloudwatchencryption.html#cfn-glue-securityconfiguration-cloudwatchencryption-cloudwatchencryptionmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-cloudwatchencryption.html#cfn-glue-securityconfiguration-cloudwatchencryption-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::SecurityConfiguration.EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-encryptionconfiguration.html","Properties":{"CloudWatchEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-encryptionconfiguration.html#cfn-glue-securityconfiguration-encryptionconfiguration-cloudwatchencryption","Required":false,"Type":"CloudWatchEncryption","UpdateType":"Mutable"},"JobBookmarksEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-encryptionconfiguration.html#cfn-glue-securityconfiguration-encryptionconfiguration-jobbookmarksencryption","Required":false,"Type":"JobBookmarksEncryption","UpdateType":"Mutable"},"S3Encryptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-encryptionconfiguration.html#cfn-glue-securityconfiguration-encryptionconfiguration-s3encryptions","Required":false,"Type":"S3Encryptions","UpdateType":"Mutable"}}},"AWS::Glue::SecurityConfiguration.JobBookmarksEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-jobbookmarksencryption.html","Properties":{"JobBookmarksEncryptionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-jobbookmarksencryption.html#cfn-glue-securityconfiguration-jobbookmarksencryption-jobbookmarksencryptionmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-jobbookmarksencryption.html#cfn-glue-securityconfiguration-jobbookmarksencryption-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::SecurityConfiguration.S3Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-s3encryption.html","Properties":{"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-s3encryption.html#cfn-glue-securityconfiguration-s3encryption-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3EncryptionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-s3encryption.html#cfn-glue-securityconfiguration-s3encryption-s3encryptionmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::SecurityConfiguration.S3Encryptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-securityconfiguration-s3encryptions.html","ItemType":"S3Encryption","Required":false,"Type":"List","UpdateType":"Mutable"},"AWS::Glue::Table.Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-column.html","Properties":{"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-column.html#cfn-glue-table-column-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-column.html#cfn-glue-table-column-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-column.html#cfn-glue-table-column-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Table.Order":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-order.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-order.html#cfn-glue-table-order-column","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SortOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-order.html#cfn-glue-table-order-sortorder","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Glue::Table.SchemaId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemaid.html","Properties":{"RegistryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemaid.html#cfn-glue-table-schemaid-registryname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SchemaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemaid.html#cfn-glue-table-schemaid-schemaarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SchemaName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemaid.html#cfn-glue-table-schemaid-schemaname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Table.SchemaReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemareference.html","Properties":{"SchemaId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemareference.html#cfn-glue-table-schemareference-schemaid","Required":false,"Type":"SchemaId","UpdateType":"Mutable"},"SchemaVersionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemareference.html#cfn-glue-table-schemareference-schemaversionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SchemaVersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemareference.html#cfn-glue-table-schemareference-schemaversionnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Table.SerdeInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-serdeinfo.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-serdeinfo.html#cfn-glue-table-serdeinfo-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-serdeinfo.html#cfn-glue-table-serdeinfo-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SerializationLibrary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-serdeinfo.html#cfn-glue-table-serdeinfo-serializationlibrary","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Table.SkewedInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-skewedinfo.html","Properties":{"SkewedColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-skewedinfo.html#cfn-glue-table-skewedinfo-skewedcolumnnames","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SkewedColumnValueLocationMaps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-skewedinfo.html#cfn-glue-table-skewedinfo-skewedcolumnvaluelocationmaps","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SkewedColumnValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-skewedinfo.html#cfn-glue-table-skewedinfo-skewedcolumnvalues","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Glue::Table.StorageDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html","Properties":{"BucketColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-bucketcolumns","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-columns","ItemType":"Column","Required":false,"Type":"List","UpdateType":"Mutable"},"Compressed":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-compressed","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InputFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-inputformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumberOfBuckets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-numberofbuckets","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OutputFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-outputformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SchemaReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-schemareference","Required":false,"Type":"SchemaReference","UpdateType":"Mutable"},"SerdeInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-serdeinfo","Required":false,"Type":"SerdeInfo","UpdateType":"Mutable"},"SkewedInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-skewedinfo","Required":false,"Type":"SkewedInfo","UpdateType":"Mutable"},"SortColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-sortcolumns","ItemType":"Order","Required":false,"Type":"List","UpdateType":"Mutable"},"StoredAsSubDirectories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-storagedescriptor.html#cfn-glue-table-storagedescriptor-storedassubdirectories","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Table.TableIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableidentifier.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableidentifier.html#cfn-glue-table-tableidentifier-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableidentifier.html#cfn-glue-table-tableidentifier-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableidentifier.html#cfn-glue-table-tableidentifier-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Table.TableInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Owner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-owner","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"PartitionKeys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-partitionkeys","ItemType":"Column","Required":false,"Type":"List","UpdateType":"Mutable"},"Retention":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-retention","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StorageDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-storagedescriptor","Required":false,"Type":"StorageDescriptor","UpdateType":"Mutable"},"TableType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-tabletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-targettable","Required":false,"Type":"TableIdentifier","UpdateType":"Mutable"},"ViewExpandedText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-viewexpandedtext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ViewOriginalText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-vieworiginaltext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Trigger.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-action.html","Properties":{"Arguments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-action.html#cfn-glue-trigger-action-arguments","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"CrawlerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-action.html#cfn-glue-trigger-action-crawlername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JobName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-action.html#cfn-glue-trigger-action-jobname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NotificationProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-action.html#cfn-glue-trigger-action-notificationproperty","Required":false,"Type":"NotificationProperty","UpdateType":"Mutable"},"SecurityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-action.html#cfn-glue-trigger-action-securityconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-action.html#cfn-glue-trigger-action-timeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Trigger.Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-condition.html","Properties":{"CrawlState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-condition.html#cfn-glue-trigger-condition-crawlstate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CrawlerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-condition.html#cfn-glue-trigger-condition-crawlername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JobName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-condition.html#cfn-glue-trigger-condition-jobname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogicalOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-condition.html#cfn-glue-trigger-condition-logicaloperator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-condition.html#cfn-glue-trigger-condition-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Trigger.EventBatchingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-eventbatchingcondition.html","Properties":{"BatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-eventbatchingcondition.html#cfn-glue-trigger-eventbatchingcondition-batchsize","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"BatchWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-eventbatchingcondition.html#cfn-glue-trigger-eventbatchingcondition-batchwindow","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Trigger.NotificationProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-notificationproperty.html","Properties":{"NotifyDelayAfter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-notificationproperty.html#cfn-glue-trigger-notificationproperty-notifydelayafter","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Trigger.Predicate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-predicate.html","Properties":{"Conditions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-predicate.html#cfn-glue-trigger-predicate-conditions","ItemType":"Condition","Required":false,"Type":"List","UpdateType":"Mutable"},"Logical":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-trigger-predicate.html#cfn-glue-trigger-predicate-logical","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Grafana::Workspace.AssertionAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-assertionattributes.html","Properties":{"Email":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-assertionattributes.html#cfn-grafana-workspace-assertionattributes-email","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-assertionattributes.html#cfn-grafana-workspace-assertionattributes-groups","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Login":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-assertionattributes.html#cfn-grafana-workspace-assertionattributes-login","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-assertionattributes.html#cfn-grafana-workspace-assertionattributes-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Org":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-assertionattributes.html#cfn-grafana-workspace-assertionattributes-org","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-assertionattributes.html#cfn-grafana-workspace-assertionattributes-role","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Grafana::Workspace.IdpMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-idpmetadata.html","Properties":{"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-idpmetadata.html#cfn-grafana-workspace-idpmetadata-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Xml":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-idpmetadata.html#cfn-grafana-workspace-idpmetadata-xml","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Grafana::Workspace.NetworkAccessControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-networkaccesscontrol.html","Properties":{"PrefixListIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-networkaccesscontrol.html#cfn-grafana-workspace-networkaccesscontrol-prefixlistids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VpceIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-networkaccesscontrol.html#cfn-grafana-workspace-networkaccesscontrol-vpceids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Grafana::Workspace.RoleValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-rolevalues.html","Properties":{"Admin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-rolevalues.html#cfn-grafana-workspace-rolevalues-admin","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Editor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-rolevalues.html#cfn-grafana-workspace-rolevalues-editor","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Grafana::Workspace.SamlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-samlconfiguration.html","Properties":{"AllowedOrganizations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-samlconfiguration.html#cfn-grafana-workspace-samlconfiguration-allowedorganizations","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AssertionAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-samlconfiguration.html#cfn-grafana-workspace-samlconfiguration-assertionattributes","Required":false,"Type":"AssertionAttributes","UpdateType":"Mutable"},"IdpMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-samlconfiguration.html#cfn-grafana-workspace-samlconfiguration-idpmetadata","Required":true,"Type":"IdpMetadata","UpdateType":"Mutable"},"LoginValidityDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-samlconfiguration.html#cfn-grafana-workspace-samlconfiguration-loginvalidityduration","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"RoleValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-samlconfiguration.html#cfn-grafana-workspace-samlconfiguration-rolevalues","Required":false,"Type":"RoleValues","UpdateType":"Mutable"}}},"AWS::Grafana::Workspace.VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-vpcconfiguration.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-vpcconfiguration.html#cfn-grafana-workspace-vpcconfiguration-securitygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-grafana-workspace-vpcconfiguration.html#cfn-grafana-workspace-vpcconfiguration-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Greengrass::ConnectorDefinition.Connector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connector.html","Properties":{"ConnectorArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connector.html#cfn-greengrass-connectordefinition-connector-connectorarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connector.html#cfn-greengrass-connectordefinition-connector-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connector.html#cfn-greengrass-connectordefinition-connector-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::ConnectorDefinition.ConnectorDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connectordefinitionversion.html","Properties":{"Connectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinition-connectordefinitionversion.html#cfn-greengrass-connectordefinition-connectordefinitionversion-connectors","ItemType":"Connector","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::ConnectorDefinitionVersion.Connector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinitionversion-connector.html","Properties":{"ConnectorArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinitionversion-connector.html#cfn-greengrass-connectordefinitionversion-connector-connectorarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinitionversion-connector.html#cfn-greengrass-connectordefinitionversion-connector-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-connectordefinitionversion-connector.html#cfn-greengrass-connectordefinitionversion-connector-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::CoreDefinition.Core":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html#cfn-greengrass-coredefinition-core-certificatearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html#cfn-greengrass-coredefinition-core-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SyncShadow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html#cfn-greengrass-coredefinition-core-syncshadow","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ThingArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-core.html#cfn-greengrass-coredefinition-core-thingarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::CoreDefinition.CoreDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-coredefinitionversion.html","Properties":{"Cores":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinition-coredefinitionversion.html#cfn-greengrass-coredefinition-coredefinitionversion-cores","ItemType":"Core","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::CoreDefinitionVersion.Core":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinitionversion-core.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinitionversion-core.html#cfn-greengrass-coredefinitionversion-core-certificatearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinitionversion-core.html#cfn-greengrass-coredefinitionversion-core-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SyncShadow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinitionversion-core.html#cfn-greengrass-coredefinitionversion-core-syncshadow","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ThingArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-coredefinitionversion-core.html#cfn-greengrass-coredefinitionversion-core-thingarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::DeviceDefinition.Device":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html#cfn-greengrass-devicedefinition-device-certificatearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html#cfn-greengrass-devicedefinition-device-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SyncShadow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html#cfn-greengrass-devicedefinition-device-syncshadow","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ThingArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-device.html#cfn-greengrass-devicedefinition-device-thingarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::DeviceDefinition.DeviceDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-devicedefinitionversion.html","Properties":{"Devices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinition-devicedefinitionversion.html#cfn-greengrass-devicedefinition-devicedefinitionversion-devices","ItemType":"Device","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::DeviceDefinitionVersion.Device":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinitionversion-device.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinitionversion-device.html#cfn-greengrass-devicedefinitionversion-device-certificatearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinitionversion-device.html#cfn-greengrass-devicedefinitionversion-device-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SyncShadow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinitionversion-device.html#cfn-greengrass-devicedefinitionversion-device-syncshadow","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ThingArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-devicedefinitionversion-device.html#cfn-greengrass-devicedefinitionversion-device-thingarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinition.DefaultConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-defaultconfig.html","Properties":{"Execution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-defaultconfig.html#cfn-greengrass-functiondefinition-defaultconfig-execution","Required":true,"Type":"Execution","UpdateType":"Mutable"}}},"AWS::Greengrass::FunctionDefinition.Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html","Properties":{"AccessSysfs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html#cfn-greengrass-functiondefinition-environment-accesssysfs","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Execution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html#cfn-greengrass-functiondefinition-environment-execution","Required":false,"Type":"Execution","UpdateType":"Immutable"},"ResourceAccessPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html#cfn-greengrass-functiondefinition-environment-resourceaccesspolicies","ItemType":"ResourceAccessPolicy","Required":false,"Type":"List","UpdateType":"Immutable"},"Variables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-environment.html#cfn-greengrass-functiondefinition-environment-variables","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinition.Execution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-execution.html","Properties":{"IsolationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-execution.html#cfn-greengrass-functiondefinition-execution-isolationmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RunAs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-execution.html#cfn-greengrass-functiondefinition-execution-runas","Required":false,"Type":"RunAs","UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinition.Function":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-function.html","Properties":{"FunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-function.html#cfn-greengrass-functiondefinition-function-functionarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FunctionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-function.html#cfn-greengrass-functiondefinition-function-functionconfiguration","Required":true,"Type":"FunctionConfiguration","UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-function.html#cfn-greengrass-functiondefinition-function-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinition.FunctionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html","Properties":{"EncodingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-encodingtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-environment","Required":false,"Type":"Environment","UpdateType":"Immutable"},"ExecArgs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-execargs","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Executable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-executable","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MemorySize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-memorysize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Pinned":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-pinned","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functionconfiguration.html#cfn-greengrass-functiondefinition-functionconfiguration-timeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinition.FunctionDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functiondefinitionversion.html","Properties":{"DefaultConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functiondefinitionversion.html#cfn-greengrass-functiondefinition-functiondefinitionversion-defaultconfig","Required":false,"Type":"DefaultConfig","UpdateType":"Immutable"},"Functions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-functiondefinitionversion.html#cfn-greengrass-functiondefinition-functiondefinitionversion-functions","ItemType":"Function","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinition.ResourceAccessPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-resourceaccesspolicy.html","Properties":{"Permission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-resourceaccesspolicy.html#cfn-greengrass-functiondefinition-resourceaccesspolicy-permission","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-resourceaccesspolicy.html#cfn-greengrass-functiondefinition-resourceaccesspolicy-resourceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinition.RunAs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-runas.html","Properties":{"Gid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-runas.html#cfn-greengrass-functiondefinition-runas-gid","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Uid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinition-runas.html#cfn-greengrass-functiondefinition-runas-uid","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinitionVersion.DefaultConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-defaultconfig.html","Properties":{"Execution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-defaultconfig.html#cfn-greengrass-functiondefinitionversion-defaultconfig-execution","Required":true,"Type":"Execution","UpdateType":"Mutable"}}},"AWS::Greengrass::FunctionDefinitionVersion.Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html","Properties":{"AccessSysfs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html#cfn-greengrass-functiondefinitionversion-environment-accesssysfs","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Execution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html#cfn-greengrass-functiondefinitionversion-environment-execution","Required":false,"Type":"Execution","UpdateType":"Immutable"},"ResourceAccessPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html#cfn-greengrass-functiondefinitionversion-environment-resourceaccesspolicies","ItemType":"ResourceAccessPolicy","Required":false,"Type":"List","UpdateType":"Immutable"},"Variables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-environment.html#cfn-greengrass-functiondefinitionversion-environment-variables","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinitionVersion.Execution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-execution.html","Properties":{"IsolationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-execution.html#cfn-greengrass-functiondefinitionversion-execution-isolationmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RunAs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-execution.html#cfn-greengrass-functiondefinitionversion-execution-runas","Required":false,"Type":"RunAs","UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinitionVersion.Function":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-function.html","Properties":{"FunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-function.html#cfn-greengrass-functiondefinitionversion-function-functionarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FunctionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-function.html#cfn-greengrass-functiondefinitionversion-function-functionconfiguration","Required":true,"Type":"FunctionConfiguration","UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-function.html#cfn-greengrass-functiondefinitionversion-function-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinitionVersion.FunctionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html","Properties":{"EncodingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-encodingtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-environment","Required":false,"Type":"Environment","UpdateType":"Immutable"},"ExecArgs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-execargs","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Executable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-executable","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MemorySize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-memorysize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Pinned":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-pinned","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-functionconfiguration.html#cfn-greengrass-functiondefinitionversion-functionconfiguration-timeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinitionVersion.ResourceAccessPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-resourceaccesspolicy.html","Properties":{"Permission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-resourceaccesspolicy.html#cfn-greengrass-functiondefinitionversion-resourceaccesspolicy-permission","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-resourceaccesspolicy.html#cfn-greengrass-functiondefinitionversion-resourceaccesspolicy-resourceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinitionVersion.RunAs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-runas.html","Properties":{"Gid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-runas.html#cfn-greengrass-functiondefinitionversion-runas-gid","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Uid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-functiondefinitionversion-runas.html#cfn-greengrass-functiondefinitionversion-runas-uid","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::Group.GroupVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html","Properties":{"ConnectorDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-connectordefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CoreDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-coredefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeviceDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-devicedefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FunctionDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-functiondefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LoggerDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-loggerdefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourceDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-resourcedefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubscriptionDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-group-groupversion.html#cfn-greengrass-group-groupversion-subscriptiondefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::LoggerDefinition.Logger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html","Properties":{"Component":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html#cfn-greengrass-loggerdefinition-logger-component","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html#cfn-greengrass-loggerdefinition-logger-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Level":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html#cfn-greengrass-loggerdefinition-logger-level","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Space":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html#cfn-greengrass-loggerdefinition-logger-space","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-logger.html#cfn-greengrass-loggerdefinition-logger-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::LoggerDefinition.LoggerDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-loggerdefinitionversion.html","Properties":{"Loggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinition-loggerdefinitionversion.html#cfn-greengrass-loggerdefinition-loggerdefinitionversion-loggers","ItemType":"Logger","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::LoggerDefinitionVersion.Logger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html","Properties":{"Component":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html#cfn-greengrass-loggerdefinitionversion-logger-component","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html#cfn-greengrass-loggerdefinitionversion-logger-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Level":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html#cfn-greengrass-loggerdefinitionversion-logger-level","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Space":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html#cfn-greengrass-loggerdefinitionversion-logger-space","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-loggerdefinitionversion-logger.html#cfn-greengrass-loggerdefinitionversion-logger-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinition.GroupOwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-groupownersetting.html","Properties":{"AutoAddGroupOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-groupownersetting.html#cfn-greengrass-resourcedefinition-groupownersetting-autoaddgroupowner","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"GroupOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-groupownersetting.html#cfn-greengrass-resourcedefinition-groupownersetting-groupowner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinition.LocalDeviceResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-localdeviceresourcedata.html","Properties":{"GroupOwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-localdeviceresourcedata.html#cfn-greengrass-resourcedefinition-localdeviceresourcedata-groupownersetting","Required":false,"Type":"GroupOwnerSetting","UpdateType":"Immutable"},"SourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-localdeviceresourcedata.html#cfn-greengrass-resourcedefinition-localdeviceresourcedata-sourcepath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinition.LocalVolumeResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-localvolumeresourcedata.html","Properties":{"DestinationPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-localvolumeresourcedata.html#cfn-greengrass-resourcedefinition-localvolumeresourcedata-destinationpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"GroupOwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-localvolumeresourcedata.html#cfn-greengrass-resourcedefinition-localvolumeresourcedata-groupownersetting","Required":false,"Type":"GroupOwnerSetting","UpdateType":"Immutable"},"SourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-localvolumeresourcedata.html#cfn-greengrass-resourcedefinition-localvolumeresourcedata-sourcepath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinition.ResourceDataContainer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedatacontainer.html","Properties":{"LocalDeviceResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedatacontainer.html#cfn-greengrass-resourcedefinition-resourcedatacontainer-localdeviceresourcedata","Required":false,"Type":"LocalDeviceResourceData","UpdateType":"Immutable"},"LocalVolumeResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedatacontainer.html#cfn-greengrass-resourcedefinition-resourcedatacontainer-localvolumeresourcedata","Required":false,"Type":"LocalVolumeResourceData","UpdateType":"Immutable"},"S3MachineLearningModelResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedatacontainer.html#cfn-greengrass-resourcedefinition-resourcedatacontainer-s3machinelearningmodelresourcedata","Required":false,"Type":"S3MachineLearningModelResourceData","UpdateType":"Immutable"},"SageMakerMachineLearningModelResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedatacontainer.html#cfn-greengrass-resourcedefinition-resourcedatacontainer-sagemakermachinelearningmodelresourcedata","Required":false,"Type":"SageMakerMachineLearningModelResourceData","UpdateType":"Immutable"},"SecretsManagerSecretResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedatacontainer.html#cfn-greengrass-resourcedefinition-resourcedatacontainer-secretsmanagersecretresourcedata","Required":false,"Type":"SecretsManagerSecretResourceData","UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinition.ResourceDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedefinitionversion.html","Properties":{"Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedefinitionversion.html#cfn-greengrass-resourcedefinition-resourcedefinitionversion-resources","ItemType":"ResourceInstance","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinition.ResourceDownloadOwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedownloadownersetting.html","Properties":{"GroupOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedownloadownersetting.html#cfn-greengrass-resourcedefinition-resourcedownloadownersetting-groupowner","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"GroupPermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourcedownloadownersetting.html#cfn-greengrass-resourcedefinition-resourcedownloadownersetting-grouppermission","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinition.ResourceInstance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourceinstance.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourceinstance.html#cfn-greengrass-resourcedefinition-resourceinstance-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourceinstance.html#cfn-greengrass-resourcedefinition-resourceinstance-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceDataContainer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-resourceinstance.html#cfn-greengrass-resourcedefinition-resourceinstance-resourcedatacontainer","Required":true,"Type":"ResourceDataContainer","UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinition.S3MachineLearningModelResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-s3machinelearningmodelresourcedata.html","Properties":{"DestinationPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-s3machinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinition-s3machinelearningmodelresourcedata-destinationpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-s3machinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinition-s3machinelearningmodelresourcedata-ownersetting","Required":false,"Type":"ResourceDownloadOwnerSetting","UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-s3machinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinition-s3machinelearningmodelresourcedata-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinition.SageMakerMachineLearningModelResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-sagemakermachinelearningmodelresourcedata.html","Properties":{"DestinationPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-sagemakermachinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinition-sagemakermachinelearningmodelresourcedata-destinationpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-sagemakermachinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinition-sagemakermachinelearningmodelresourcedata-ownersetting","Required":false,"Type":"ResourceDownloadOwnerSetting","UpdateType":"Immutable"},"SageMakerJobArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-sagemakermachinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinition-sagemakermachinelearningmodelresourcedata-sagemakerjobarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinition.SecretsManagerSecretResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-secretsmanagersecretresourcedata.html","Properties":{"ARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-secretsmanagersecretresourcedata.html#cfn-greengrass-resourcedefinition-secretsmanagersecretresourcedata-arn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AdditionalStagingLabelsToDownload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinition-secretsmanagersecretresourcedata.html#cfn-greengrass-resourcedefinition-secretsmanagersecretresourcedata-additionalstaginglabelstodownload","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinitionVersion.GroupOwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-groupownersetting.html","Properties":{"AutoAddGroupOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-groupownersetting.html#cfn-greengrass-resourcedefinitionversion-groupownersetting-autoaddgroupowner","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"GroupOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-groupownersetting.html#cfn-greengrass-resourcedefinitionversion-groupownersetting-groupowner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinitionVersion.LocalDeviceResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localdeviceresourcedata.html","Properties":{"GroupOwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localdeviceresourcedata.html#cfn-greengrass-resourcedefinitionversion-localdeviceresourcedata-groupownersetting","Required":false,"Type":"GroupOwnerSetting","UpdateType":"Immutable"},"SourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localdeviceresourcedata.html#cfn-greengrass-resourcedefinitionversion-localdeviceresourcedata-sourcepath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinitionVersion.LocalVolumeResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localvolumeresourcedata.html","Properties":{"DestinationPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localvolumeresourcedata.html#cfn-greengrass-resourcedefinitionversion-localvolumeresourcedata-destinationpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"GroupOwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localvolumeresourcedata.html#cfn-greengrass-resourcedefinitionversion-localvolumeresourcedata-groupownersetting","Required":false,"Type":"GroupOwnerSetting","UpdateType":"Immutable"},"SourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-localvolumeresourcedata.html#cfn-greengrass-resourcedefinitionversion-localvolumeresourcedata-sourcepath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinitionVersion.ResourceDataContainer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html","Properties":{"LocalDeviceResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html#cfn-greengrass-resourcedefinitionversion-resourcedatacontainer-localdeviceresourcedata","Required":false,"Type":"LocalDeviceResourceData","UpdateType":"Immutable"},"LocalVolumeResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html#cfn-greengrass-resourcedefinitionversion-resourcedatacontainer-localvolumeresourcedata","Required":false,"Type":"LocalVolumeResourceData","UpdateType":"Immutable"},"S3MachineLearningModelResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html#cfn-greengrass-resourcedefinitionversion-resourcedatacontainer-s3machinelearningmodelresourcedata","Required":false,"Type":"S3MachineLearningModelResourceData","UpdateType":"Immutable"},"SageMakerMachineLearningModelResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html#cfn-greengrass-resourcedefinitionversion-resourcedatacontainer-sagemakermachinelearningmodelresourcedata","Required":false,"Type":"SageMakerMachineLearningModelResourceData","UpdateType":"Immutable"},"SecretsManagerSecretResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedatacontainer.html#cfn-greengrass-resourcedefinitionversion-resourcedatacontainer-secretsmanagersecretresourcedata","Required":false,"Type":"SecretsManagerSecretResourceData","UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinitionVersion.ResourceDownloadOwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedownloadownersetting.html","Properties":{"GroupOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedownloadownersetting.html#cfn-greengrass-resourcedefinitionversion-resourcedownloadownersetting-groupowner","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"GroupPermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourcedownloadownersetting.html#cfn-greengrass-resourcedefinitionversion-resourcedownloadownersetting-grouppermission","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinitionVersion.ResourceInstance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html#cfn-greengrass-resourcedefinitionversion-resourceinstance-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html#cfn-greengrass-resourcedefinitionversion-resourceinstance-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceDataContainer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-resourceinstance.html#cfn-greengrass-resourcedefinitionversion-resourceinstance-resourcedatacontainer","Required":true,"Type":"ResourceDataContainer","UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinitionVersion.S3MachineLearningModelResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata.html","Properties":{"DestinationPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata-destinationpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata-ownersetting","Required":false,"Type":"ResourceDownloadOwnerSetting","UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinitionversion-s3machinelearningmodelresourcedata-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinitionVersion.SageMakerMachineLearningModelResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata.html","Properties":{"DestinationPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata-destinationpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OwnerSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata-ownersetting","Required":false,"Type":"ResourceDownloadOwnerSetting","UpdateType":"Immutable"},"SageMakerJobArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata.html#cfn-greengrass-resourcedefinitionversion-sagemakermachinelearningmodelresourcedata-sagemakerjobarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinitionVersion.SecretsManagerSecretResourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-secretsmanagersecretresourcedata.html","Properties":{"ARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-secretsmanagersecretresourcedata.html#cfn-greengrass-resourcedefinitionversion-secretsmanagersecretresourcedata-arn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AdditionalStagingLabelsToDownload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-resourcedefinitionversion-secretsmanagersecretresourcedata.html#cfn-greengrass-resourcedefinitionversion-secretsmanagersecretresourcedata-additionalstaginglabelstodownload","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::SubscriptionDefinition.Subscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html#cfn-greengrass-subscriptiondefinition-subscription-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html#cfn-greengrass-subscriptiondefinition-subscription-source","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Subject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html#cfn-greengrass-subscriptiondefinition-subscription-subject","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscription.html#cfn-greengrass-subscriptiondefinition-subscription-target","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Greengrass::SubscriptionDefinition.SubscriptionDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscriptiondefinitionversion.html","Properties":{"Subscriptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinition-subscriptiondefinitionversion.html#cfn-greengrass-subscriptiondefinition-subscriptiondefinitionversion-subscriptions","ItemType":"Subscription","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::SubscriptionDefinitionVersion.Subscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinitionversion-subscription.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinitionversion-subscription.html#cfn-greengrass-subscriptiondefinitionversion-subscription-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinitionversion-subscription.html#cfn-greengrass-subscriptiondefinitionversion-subscription-source","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Subject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinitionversion-subscription.html#cfn-greengrass-subscriptiondefinitionversion-subscription-subject","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrass-subscriptiondefinitionversion-subscription.html#cfn-greengrass-subscriptiondefinitionversion-subscription-target","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::ComponentVersion.ComponentDependencyRequirement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-componentdependencyrequirement.html","Properties":{"DependencyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-componentdependencyrequirement.html#cfn-greengrassv2-componentversion-componentdependencyrequirement-dependencytype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VersionRequirement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-componentdependencyrequirement.html#cfn-greengrassv2-componentversion-componentdependencyrequirement-versionrequirement","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::ComponentVersion.ComponentPlatform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-componentplatform.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-componentplatform.html#cfn-greengrassv2-componentversion-componentplatform-attributes","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-componentplatform.html#cfn-greengrassv2-componentversion-componentplatform-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::ComponentVersion.LambdaContainerParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdacontainerparams.html","Properties":{"Devices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdacontainerparams.html#cfn-greengrassv2-componentversion-lambdacontainerparams-devices","DuplicatesAllowed":true,"ItemType":"LambdaDeviceMount","Required":false,"Type":"List","UpdateType":"Immutable"},"MemorySizeInKB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdacontainerparams.html#cfn-greengrassv2-componentversion-lambdacontainerparams-memorysizeinkb","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MountROSysfs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdacontainerparams.html#cfn-greengrassv2-componentversion-lambdacontainerparams-mountrosysfs","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Volumes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdacontainerparams.html#cfn-greengrassv2-componentversion-lambdacontainerparams-volumes","DuplicatesAllowed":true,"ItemType":"LambdaVolumeMount","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::GreengrassV2::ComponentVersion.LambdaDeviceMount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdadevicemount.html","Properties":{"AddGroupOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdadevicemount.html#cfn-greengrassv2-componentversion-lambdadevicemount-addgroupowner","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdadevicemount.html#cfn-greengrassv2-componentversion-lambdadevicemount-path","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Permission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdadevicemount.html#cfn-greengrassv2-componentversion-lambdadevicemount-permission","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::ComponentVersion.LambdaEventSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaeventsource.html","Properties":{"Topic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaeventsource.html#cfn-greengrassv2-componentversion-lambdaeventsource-topic","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaeventsource.html#cfn-greengrassv2-componentversion-lambdaeventsource-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::ComponentVersion.LambdaExecutionParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html","Properties":{"EnvironmentVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html#cfn-greengrassv2-componentversion-lambdaexecutionparameters-environmentvariables","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"EventSources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html#cfn-greengrassv2-componentversion-lambdaexecutionparameters-eventsources","DuplicatesAllowed":true,"ItemType":"LambdaEventSource","Required":false,"Type":"List","UpdateType":"Immutable"},"ExecArgs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html#cfn-greengrassv2-componentversion-lambdaexecutionparameters-execargs","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"InputPayloadEncodingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html#cfn-greengrassv2-componentversion-lambdaexecutionparameters-inputpayloadencodingtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LinuxProcessParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html#cfn-greengrassv2-componentversion-lambdaexecutionparameters-linuxprocessparams","Required":false,"Type":"LambdaLinuxProcessParams","UpdateType":"Immutable"},"MaxIdleTimeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html#cfn-greengrassv2-componentversion-lambdaexecutionparameters-maxidletimeinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MaxInstancesCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html#cfn-greengrassv2-componentversion-lambdaexecutionparameters-maxinstancescount","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MaxQueueSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html#cfn-greengrassv2-componentversion-lambdaexecutionparameters-maxqueuesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Pinned":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html#cfn-greengrassv2-componentversion-lambdaexecutionparameters-pinned","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"StatusTimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html#cfn-greengrassv2-componentversion-lambdaexecutionparameters-statustimeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"TimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdaexecutionparameters.html#cfn-greengrassv2-componentversion-lambdaexecutionparameters-timeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::ComponentVersion.LambdaFunctionRecipeSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdafunctionrecipesource.html","Properties":{"ComponentDependencies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdafunctionrecipesource.html#cfn-greengrassv2-componentversion-lambdafunctionrecipesource-componentdependencies","ItemType":"ComponentDependencyRequirement","Required":false,"Type":"Map","UpdateType":"Immutable"},"ComponentLambdaParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdafunctionrecipesource.html#cfn-greengrassv2-componentversion-lambdafunctionrecipesource-componentlambdaparameters","Required":false,"Type":"LambdaExecutionParameters","UpdateType":"Immutable"},"ComponentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdafunctionrecipesource.html#cfn-greengrassv2-componentversion-lambdafunctionrecipesource-componentname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ComponentPlatforms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdafunctionrecipesource.html#cfn-greengrassv2-componentversion-lambdafunctionrecipesource-componentplatforms","DuplicatesAllowed":true,"ItemType":"ComponentPlatform","Required":false,"Type":"List","UpdateType":"Immutable"},"ComponentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdafunctionrecipesource.html#cfn-greengrassv2-componentversion-lambdafunctionrecipesource-componentversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LambdaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdafunctionrecipesource.html#cfn-greengrassv2-componentversion-lambdafunctionrecipesource-lambdaarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::ComponentVersion.LambdaLinuxProcessParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdalinuxprocessparams.html","Properties":{"ContainerParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdalinuxprocessparams.html#cfn-greengrassv2-componentversion-lambdalinuxprocessparams-containerparams","Required":false,"Type":"LambdaContainerParams","UpdateType":"Immutable"},"IsolationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdalinuxprocessparams.html#cfn-greengrassv2-componentversion-lambdalinuxprocessparams-isolationmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::ComponentVersion.LambdaVolumeMount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdavolumemount.html","Properties":{"AddGroupOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdavolumemount.html#cfn-greengrassv2-componentversion-lambdavolumemount-addgroupowner","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DestinationPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdavolumemount.html#cfn-greengrassv2-componentversion-lambdavolumemount-destinationpath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Permission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdavolumemount.html#cfn-greengrassv2-componentversion-lambdavolumemount-permission","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-componentversion-lambdavolumemount.html#cfn-greengrassv2-componentversion-lambdavolumemount-sourcepath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.ComponentConfigurationUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentconfigurationupdate.html","Properties":{"Merge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentconfigurationupdate.html#cfn-greengrassv2-deployment-componentconfigurationupdate-merge","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Reset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentconfigurationupdate.html#cfn-greengrassv2-deployment-componentconfigurationupdate-reset","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.ComponentDeploymentSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentdeploymentspecification.html","Properties":{"ComponentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentdeploymentspecification.html#cfn-greengrassv2-deployment-componentdeploymentspecification-componentversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConfigurationUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentdeploymentspecification.html#cfn-greengrassv2-deployment-componentdeploymentspecification-configurationupdate","Required":false,"Type":"ComponentConfigurationUpdate","UpdateType":"Immutable"},"RunWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentdeploymentspecification.html#cfn-greengrassv2-deployment-componentdeploymentspecification-runwith","Required":false,"Type":"ComponentRunWith","UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.ComponentRunWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentrunwith.html","Properties":{"PosixUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentrunwith.html#cfn-greengrassv2-deployment-componentrunwith-posixuser","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SystemResourceLimits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentrunwith.html#cfn-greengrassv2-deployment-componentrunwith-systemresourcelimits","Required":false,"Type":"SystemResourceLimits","UpdateType":"Immutable"},"WindowsUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-componentrunwith.html#cfn-greengrassv2-deployment-componentrunwith-windowsuser","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.DeploymentComponentUpdatePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentcomponentupdatepolicy.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentcomponentupdatepolicy.html#cfn-greengrassv2-deployment-deploymentcomponentupdatepolicy-action","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentcomponentupdatepolicy.html#cfn-greengrassv2-deployment-deploymentcomponentupdatepolicy-timeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.DeploymentConfigurationValidationPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentconfigurationvalidationpolicy.html","Properties":{"TimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentconfigurationvalidationpolicy.html#cfn-greengrassv2-deployment-deploymentconfigurationvalidationpolicy-timeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.DeploymentIoTJobConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentiotjobconfiguration.html","Properties":{"AbortConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentiotjobconfiguration.html#cfn-greengrassv2-deployment-deploymentiotjobconfiguration-abortconfig","Required":false,"Type":"IoTJobAbortConfig","UpdateType":"Immutable"},"JobExecutionsRolloutConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentiotjobconfiguration.html#cfn-greengrassv2-deployment-deploymentiotjobconfiguration-jobexecutionsrolloutconfig","Required":false,"Type":"IoTJobExecutionsRolloutConfig","UpdateType":"Immutable"},"TimeoutConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentiotjobconfiguration.html#cfn-greengrassv2-deployment-deploymentiotjobconfiguration-timeoutconfig","Required":false,"Type":"IoTJobTimeoutConfig","UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.DeploymentPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentpolicies.html","Properties":{"ComponentUpdatePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentpolicies.html#cfn-greengrassv2-deployment-deploymentpolicies-componentupdatepolicy","Required":false,"Type":"DeploymentComponentUpdatePolicy","UpdateType":"Immutable"},"ConfigurationValidationPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentpolicies.html#cfn-greengrassv2-deployment-deploymentpolicies-configurationvalidationpolicy","Required":false,"Type":"DeploymentConfigurationValidationPolicy","UpdateType":"Immutable"},"FailureHandlingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-deploymentpolicies.html#cfn-greengrassv2-deployment-deploymentpolicies-failurehandlingpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.IoTJobAbortConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobabortconfig.html","Properties":{"CriteriaList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobabortconfig.html#cfn-greengrassv2-deployment-iotjobabortconfig-criterialist","DuplicatesAllowed":true,"ItemType":"IoTJobAbortCriteria","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.IoTJobAbortCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobabortcriteria.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobabortcriteria.html#cfn-greengrassv2-deployment-iotjobabortcriteria-action","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FailureType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobabortcriteria.html#cfn-greengrassv2-deployment-iotjobabortcriteria-failuretype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MinNumberOfExecutedThings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobabortcriteria.html#cfn-greengrassv2-deployment-iotjobabortcriteria-minnumberofexecutedthings","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"ThresholdPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobabortcriteria.html#cfn-greengrassv2-deployment-iotjobabortcriteria-thresholdpercentage","PrimitiveType":"Double","Required":true,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.IoTJobExecutionsRolloutConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobexecutionsrolloutconfig.html","Properties":{"ExponentialRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobexecutionsrolloutconfig.html#cfn-greengrassv2-deployment-iotjobexecutionsrolloutconfig-exponentialrate","Required":false,"Type":"IoTJobExponentialRolloutRate","UpdateType":"Immutable"},"MaximumPerMinute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobexecutionsrolloutconfig.html#cfn-greengrassv2-deployment-iotjobexecutionsrolloutconfig-maximumperminute","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.IoTJobExponentialRolloutRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobexponentialrolloutrate.html","Properties":{"BaseRatePerMinute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobexponentialrolloutrate.html#cfn-greengrassv2-deployment-iotjobexponentialrolloutrate-baserateperminute","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"IncrementFactor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobexponentialrolloutrate.html#cfn-greengrassv2-deployment-iotjobexponentialrolloutrate-incrementfactor","PrimitiveType":"Double","Required":true,"UpdateType":"Immutable"},"RateIncreaseCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobexponentialrolloutrate.html#cfn-greengrassv2-deployment-iotjobexponentialrolloutrate-rateincreasecriteria","Required":true,"Type":"IoTJobRateIncreaseCriteria","UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.IoTJobRateIncreaseCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobrateincreasecriteria.html","PrimitiveType":"Json"},"AWS::GreengrassV2::Deployment.IoTJobTimeoutConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobtimeoutconfig.html","Properties":{"InProgressTimeoutInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-iotjobtimeoutconfig.html#cfn-greengrassv2-deployment-iotjobtimeoutconfig-inprogresstimeoutinminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::GreengrassV2::Deployment.SystemResourceLimits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-systemresourcelimits.html","Properties":{"Cpus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-systemresourcelimits.html#cfn-greengrassv2-deployment-systemresourcelimits-cpus","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Memory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-greengrassv2-deployment-systemresourcelimits.html#cfn-greengrassv2-deployment-systemresourcelimits-memory","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::GroundStation::Config.AntennaDownlinkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-antennadownlinkconfig.html","Properties":{"SpectrumConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-antennadownlinkconfig.html#cfn-groundstation-config-antennadownlinkconfig-spectrumconfig","Required":false,"Type":"SpectrumConfig","UpdateType":"Mutable"}}},"AWS::GroundStation::Config.AntennaDownlinkDemodDecodeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-antennadownlinkdemoddecodeconfig.html","Properties":{"DecodeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-antennadownlinkdemoddecodeconfig.html#cfn-groundstation-config-antennadownlinkdemoddecodeconfig-decodeconfig","Required":false,"Type":"DecodeConfig","UpdateType":"Mutable"},"DemodulationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-antennadownlinkdemoddecodeconfig.html#cfn-groundstation-config-antennadownlinkdemoddecodeconfig-demodulationconfig","Required":false,"Type":"DemodulationConfig","UpdateType":"Mutable"},"SpectrumConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-antennadownlinkdemoddecodeconfig.html#cfn-groundstation-config-antennadownlinkdemoddecodeconfig-spectrumconfig","Required":false,"Type":"SpectrumConfig","UpdateType":"Mutable"}}},"AWS::GroundStation::Config.AntennaUplinkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-antennauplinkconfig.html","Properties":{"SpectrumConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-antennauplinkconfig.html#cfn-groundstation-config-antennauplinkconfig-spectrumconfig","Required":false,"Type":"UplinkSpectrumConfig","UpdateType":"Mutable"},"TargetEirp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-antennauplinkconfig.html#cfn-groundstation-config-antennauplinkconfig-targeteirp","Required":false,"Type":"Eirp","UpdateType":"Mutable"},"TransmitDisabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-antennauplinkconfig.html#cfn-groundstation-config-antennauplinkconfig-transmitdisabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::Config.ConfigData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-configdata.html","Properties":{"AntennaDownlinkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-configdata.html#cfn-groundstation-config-configdata-antennadownlinkconfig","Required":false,"Type":"AntennaDownlinkConfig","UpdateType":"Mutable"},"AntennaDownlinkDemodDecodeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-configdata.html#cfn-groundstation-config-configdata-antennadownlinkdemoddecodeconfig","Required":false,"Type":"AntennaDownlinkDemodDecodeConfig","UpdateType":"Mutable"},"AntennaUplinkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-configdata.html#cfn-groundstation-config-configdata-antennauplinkconfig","Required":false,"Type":"AntennaUplinkConfig","UpdateType":"Mutable"},"DataflowEndpointConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-configdata.html#cfn-groundstation-config-configdata-dataflowendpointconfig","Required":false,"Type":"DataflowEndpointConfig","UpdateType":"Mutable"},"S3RecordingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-configdata.html#cfn-groundstation-config-configdata-s3recordingconfig","Required":false,"Type":"S3RecordingConfig","UpdateType":"Mutable"},"TrackingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-configdata.html#cfn-groundstation-config-configdata-trackingconfig","Required":false,"Type":"TrackingConfig","UpdateType":"Mutable"},"UplinkEchoConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-configdata.html#cfn-groundstation-config-configdata-uplinkechoconfig","Required":false,"Type":"UplinkEchoConfig","UpdateType":"Mutable"}}},"AWS::GroundStation::Config.DataflowEndpointConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-dataflowendpointconfig.html","Properties":{"DataflowEndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-dataflowendpointconfig.html#cfn-groundstation-config-dataflowendpointconfig-dataflowendpointname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataflowEndpointRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-dataflowendpointconfig.html#cfn-groundstation-config-dataflowendpointconfig-dataflowendpointregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::Config.DecodeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-decodeconfig.html","Properties":{"UnvalidatedJSON":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-decodeconfig.html#cfn-groundstation-config-decodeconfig-unvalidatedjson","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::Config.DemodulationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-demodulationconfig.html","Properties":{"UnvalidatedJSON":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-demodulationconfig.html#cfn-groundstation-config-demodulationconfig-unvalidatedjson","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::Config.Eirp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-eirp.html","Properties":{"Units":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-eirp.html#cfn-groundstation-config-eirp-units","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-eirp.html#cfn-groundstation-config-eirp-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::Config.Frequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-frequency.html","Properties":{"Units":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-frequency.html#cfn-groundstation-config-frequency-units","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-frequency.html#cfn-groundstation-config-frequency-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::Config.FrequencyBandwidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-frequencybandwidth.html","Properties":{"Units":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-frequencybandwidth.html#cfn-groundstation-config-frequencybandwidth-units","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-frequencybandwidth.html#cfn-groundstation-config-frequencybandwidth-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::Config.S3RecordingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-s3recordingconfig.html","Properties":{"BucketArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-s3recordingconfig.html#cfn-groundstation-config-s3recordingconfig-bucketarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-s3recordingconfig.html#cfn-groundstation-config-s3recordingconfig-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-s3recordingconfig.html#cfn-groundstation-config-s3recordingconfig-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::Config.SpectrumConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-spectrumconfig.html","Properties":{"Bandwidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-spectrumconfig.html#cfn-groundstation-config-spectrumconfig-bandwidth","Required":false,"Type":"FrequencyBandwidth","UpdateType":"Mutable"},"CenterFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-spectrumconfig.html#cfn-groundstation-config-spectrumconfig-centerfrequency","Required":false,"Type":"Frequency","UpdateType":"Mutable"},"Polarization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-spectrumconfig.html#cfn-groundstation-config-spectrumconfig-polarization","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::Config.TrackingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-trackingconfig.html","Properties":{"Autotrack":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-trackingconfig.html#cfn-groundstation-config-trackingconfig-autotrack","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::Config.UplinkEchoConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-uplinkechoconfig.html","Properties":{"AntennaUplinkConfigArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-uplinkechoconfig.html#cfn-groundstation-config-uplinkechoconfig-antennauplinkconfigarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-uplinkechoconfig.html#cfn-groundstation-config-uplinkechoconfig-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::Config.UplinkSpectrumConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-uplinkspectrumconfig.html","Properties":{"CenterFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-uplinkspectrumconfig.html#cfn-groundstation-config-uplinkspectrumconfig-centerfrequency","Required":false,"Type":"Frequency","UpdateType":"Mutable"},"Polarization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-config-uplinkspectrumconfig.html#cfn-groundstation-config-uplinkspectrumconfig-polarization","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::DataflowEndpointGroup.AwsGroundStationAgentEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-awsgroundstationagentendpoint.html","Properties":{"AgentStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-awsgroundstationagentendpoint.html#cfn-groundstation-dataflowendpointgroup-awsgroundstationagentendpoint-agentstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuditResults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-awsgroundstationagentendpoint.html#cfn-groundstation-dataflowendpointgroup-awsgroundstationagentendpoint-auditresults","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EgressAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-awsgroundstationagentendpoint.html#cfn-groundstation-dataflowendpointgroup-awsgroundstationagentendpoint-egressaddress","Required":false,"Type":"ConnectionDetails","UpdateType":"Mutable"},"IngressAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-awsgroundstationagentendpoint.html#cfn-groundstation-dataflowendpointgroup-awsgroundstationagentendpoint-ingressaddress","Required":false,"Type":"RangedConnectionDetails","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-awsgroundstationagentendpoint.html#cfn-groundstation-dataflowendpointgroup-awsgroundstationagentendpoint-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::DataflowEndpointGroup.ConnectionDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-connectiondetails.html","Properties":{"Mtu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-connectiondetails.html#cfn-groundstation-dataflowendpointgroup-connectiondetails-mtu","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SocketAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-connectiondetails.html#cfn-groundstation-dataflowendpointgroup-connectiondetails-socketaddress","Required":false,"Type":"SocketAddress","UpdateType":"Mutable"}}},"AWS::GroundStation::DataflowEndpointGroup.DataflowEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-dataflowendpoint.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-dataflowendpoint.html#cfn-groundstation-dataflowendpointgroup-dataflowendpoint-address","Required":false,"Type":"SocketAddress","UpdateType":"Mutable"},"Mtu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-dataflowendpoint.html#cfn-groundstation-dataflowendpointgroup-dataflowendpoint-mtu","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-dataflowendpoint.html#cfn-groundstation-dataflowendpointgroup-dataflowendpoint-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::DataflowEndpointGroup.EndpointDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-endpointdetails.html","Properties":{"AwsGroundStationAgentEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-endpointdetails.html#cfn-groundstation-dataflowendpointgroup-endpointdetails-awsgroundstationagentendpoint","Required":false,"Type":"AwsGroundStationAgentEndpoint","UpdateType":"Mutable"},"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-endpointdetails.html#cfn-groundstation-dataflowendpointgroup-endpointdetails-endpoint","Required":false,"Type":"DataflowEndpoint","UpdateType":"Mutable"},"SecurityDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-endpointdetails.html#cfn-groundstation-dataflowendpointgroup-endpointdetails-securitydetails","Required":false,"Type":"SecurityDetails","UpdateType":"Mutable"}}},"AWS::GroundStation::DataflowEndpointGroup.IntegerRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-integerrange.html","Properties":{"Maximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-integerrange.html#cfn-groundstation-dataflowendpointgroup-integerrange-maximum","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Minimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-integerrange.html#cfn-groundstation-dataflowendpointgroup-integerrange-minimum","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::DataflowEndpointGroup.RangedConnectionDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-rangedconnectiondetails.html","Properties":{"Mtu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-rangedconnectiondetails.html#cfn-groundstation-dataflowendpointgroup-rangedconnectiondetails-mtu","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SocketAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-rangedconnectiondetails.html#cfn-groundstation-dataflowendpointgroup-rangedconnectiondetails-socketaddress","Required":false,"Type":"RangedSocketAddress","UpdateType":"Mutable"}}},"AWS::GroundStation::DataflowEndpointGroup.RangedSocketAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-rangedsocketaddress.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-rangedsocketaddress.html#cfn-groundstation-dataflowendpointgroup-rangedsocketaddress-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-rangedsocketaddress.html#cfn-groundstation-dataflowendpointgroup-rangedsocketaddress-portrange","Required":false,"Type":"IntegerRange","UpdateType":"Mutable"}}},"AWS::GroundStation::DataflowEndpointGroup.SecurityDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-securitydetails.html","Properties":{"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-securitydetails.html#cfn-groundstation-dataflowendpointgroup-securitydetails-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-securitydetails.html#cfn-groundstation-dataflowendpointgroup-securitydetails-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-securitydetails.html#cfn-groundstation-dataflowendpointgroup-securitydetails-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GroundStation::DataflowEndpointGroup.SocketAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-socketaddress.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-socketaddress.html#cfn-groundstation-dataflowendpointgroup-socketaddress-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-dataflowendpointgroup-socketaddress.html#cfn-groundstation-dataflowendpointgroup-socketaddress-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::MissionProfile.DataflowEdge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-missionprofile-dataflowedge.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-missionprofile-dataflowedge.html#cfn-groundstation-missionprofile-dataflowedge-destination","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-missionprofile-dataflowedge.html#cfn-groundstation-missionprofile-dataflowedge-source","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GroundStation::MissionProfile.StreamsKmsKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-missionprofile-streamskmskey.html","Properties":{"KmsAliasArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-missionprofile-streamskmskey.html#cfn-groundstation-missionprofile-streamskmskey-kmsaliasarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-groundstation-missionprofile-streamskmskey.html#cfn-groundstation-missionprofile-streamskmskey-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GuardDuty::Detector.CFNDataSourceConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfndatasourceconfigurations.html","Properties":{"Kubernetes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfndatasourceconfigurations.html#cfn-guardduty-detector-cfndatasourceconfigurations-kubernetes","Required":false,"Type":"CFNKubernetesConfiguration","UpdateType":"Mutable"},"MalwareProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfndatasourceconfigurations.html#cfn-guardduty-detector-cfndatasourceconfigurations-malwareprotection","Required":false,"Type":"CFNMalwareProtectionConfiguration","UpdateType":"Mutable"},"S3Logs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfndatasourceconfigurations.html#cfn-guardduty-detector-cfndatasourceconfigurations-s3logs","Required":false,"Type":"CFNS3LogsConfiguration","UpdateType":"Mutable"}}},"AWS::GuardDuty::Detector.CFNKubernetesAuditLogsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnkubernetesauditlogsconfiguration.html","Properties":{"Enable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnkubernetesauditlogsconfiguration.html#cfn-guardduty-detector-cfnkubernetesauditlogsconfiguration-enable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::GuardDuty::Detector.CFNKubernetesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnkubernetesconfiguration.html","Properties":{"AuditLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnkubernetesconfiguration.html#cfn-guardduty-detector-cfnkubernetesconfiguration-auditlogs","Required":false,"Type":"CFNKubernetesAuditLogsConfiguration","UpdateType":"Mutable"}}},"AWS::GuardDuty::Detector.CFNMalwareProtectionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnmalwareprotectionconfiguration.html","Properties":{"ScanEc2InstanceWithFindings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnmalwareprotectionconfiguration.html#cfn-guardduty-detector-cfnmalwareprotectionconfiguration-scanec2instancewithfindings","Required":false,"Type":"CFNScanEc2InstanceWithFindingsConfiguration","UpdateType":"Mutable"}}},"AWS::GuardDuty::Detector.CFNS3LogsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfns3logsconfiguration.html","Properties":{"Enable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfns3logsconfiguration.html#cfn-guardduty-detector-cfns3logsconfiguration-enable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::GuardDuty::Detector.CFNScanEc2InstanceWithFindingsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnscanec2instancewithfindingsconfiguration.html","Properties":{"EbsVolumes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnscanec2instancewithfindingsconfiguration.html#cfn-guardduty-detector-cfnscanec2instancewithfindingsconfiguration-ebsvolumes","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::GuardDuty::Detector.FeatureAdditionalConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-featureadditionalconfiguration.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-featureadditionalconfiguration.html#cfn-guardduty-detector-featureadditionalconfiguration-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-featureadditionalconfiguration.html#cfn-guardduty-detector-featureadditionalconfiguration-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GuardDuty::Detector.FeatureConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-featureconfigurations.html","Properties":{"AdditionalConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-featureconfigurations.html#cfn-guardduty-detector-featureconfigurations-additionalconfiguration","ItemType":"FeatureAdditionalConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-featureconfigurations.html#cfn-guardduty-detector-featureconfigurations-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-featureconfigurations.html#cfn-guardduty-detector-featureconfigurations-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GuardDuty::Filter.Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html","Properties":{"Eq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-eq","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Equals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-equals","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"GreaterThan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-greaterthan","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"GreaterThanOrEqual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-greaterthanorequal","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Gt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-gt","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Gte":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-gte","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"LessThan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-lessthan","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"LessThanOrEqual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-lessthanorequal","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Lt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-lt","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Lte":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-lte","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Neq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-neq","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"NotEquals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-condition.html#cfn-guardduty-filter-condition-notequals","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GuardDuty::Filter.FindingCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-findingcriteria.html","Properties":{"Criterion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-findingcriteria.html#cfn-guardduty-filter-findingcriteria-criterion","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ItemType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-filter-findingcriteria.html#cfn-guardduty-filter-findingcriteria-itemtype","Required":false,"Type":"Condition","UpdateType":"Mutable"}}},"AWS::HealthLake::FHIRDatastore.CreatedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-createdat.html","Properties":{"Nanos":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-createdat.html#cfn-healthlake-fhirdatastore-createdat-nanos","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Seconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-createdat.html#cfn-healthlake-fhirdatastore-createdat-seconds","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::HealthLake::FHIRDatastore.IdentityProviderConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-identityproviderconfiguration.html","Properties":{"AuthorizationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-identityproviderconfiguration.html#cfn-healthlake-fhirdatastore-identityproviderconfiguration-authorizationstrategy","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FineGrainedAuthorizationEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-identityproviderconfiguration.html#cfn-healthlake-fhirdatastore-identityproviderconfiguration-finegrainedauthorizationenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"IdpLambdaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-identityproviderconfiguration.html#cfn-healthlake-fhirdatastore-identityproviderconfiguration-idplambdaarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Metadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-identityproviderconfiguration.html#cfn-healthlake-fhirdatastore-identityproviderconfiguration-metadata","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::HealthLake::FHIRDatastore.KmsEncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-kmsencryptionconfig.html","Properties":{"CmkType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-kmsencryptionconfig.html#cfn-healthlake-fhirdatastore-kmsencryptionconfig-cmktype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-kmsencryptionconfig.html#cfn-healthlake-fhirdatastore-kmsencryptionconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::HealthLake::FHIRDatastore.PreloadDataConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-preloaddataconfig.html","Properties":{"PreloadDataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-preloaddataconfig.html#cfn-healthlake-fhirdatastore-preloaddataconfig-preloaddatatype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::HealthLake::FHIRDatastore.SseConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-sseconfiguration.html","Properties":{"KmsEncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-sseconfiguration.html#cfn-healthlake-fhirdatastore-sseconfiguration-kmsencryptionconfig","Required":true,"Type":"KmsEncryptionConfig","UpdateType":"Immutable"}}},"AWS::IAM::Group.Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html","Properties":{"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policydocument","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IAM::Role.Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html","Properties":{"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policydocument","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IAM::User.LoginProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user-loginprofile.html","Properties":{"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user-loginprofile.html#cfn-iam-user-loginprofile-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PasswordResetRequired":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user-loginprofile.html#cfn-iam-user-loginprofile-passwordresetrequired","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IAM::User.Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html","Properties":{"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policydocument","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html#cfn-iam-policies-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IVS::RecordingConfiguration.DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-destinationconfiguration.html","Properties":{"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-destinationconfiguration.html#cfn-ivs-recordingconfiguration-destinationconfiguration-s3","Required":true,"Type":"S3DestinationConfiguration","UpdateType":"Immutable"}}},"AWS::IVS::RecordingConfiguration.S3DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-s3destinationconfiguration.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-s3destinationconfiguration.html#cfn-ivs-recordingconfiguration-s3destinationconfiguration-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IVS::RecordingConfiguration.ThumbnailConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-thumbnailconfiguration.html","Properties":{"RecordingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-thumbnailconfiguration.html#cfn-ivs-recordingconfiguration-thumbnailconfiguration-recordingmode","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TargetIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-thumbnailconfiguration.html#cfn-ivs-recordingconfiguration-thumbnailconfiguration-targetintervalseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::IVSChat::LoggingConfiguration.CloudWatchLogsDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-loggingconfiguration-cloudwatchlogsdestinationconfiguration.html","Properties":{"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-loggingconfiguration-cloudwatchlogsdestinationconfiguration.html#cfn-ivschat-loggingconfiguration-cloudwatchlogsdestinationconfiguration-loggroupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IVSChat::LoggingConfiguration.DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-loggingconfiguration-destinationconfiguration.html","Properties":{"CloudWatchLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-loggingconfiguration-destinationconfiguration.html#cfn-ivschat-loggingconfiguration-destinationconfiguration-cloudwatchlogs","Required":false,"Type":"CloudWatchLogsDestinationConfiguration","UpdateType":"Mutable"},"Firehose":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-loggingconfiguration-destinationconfiguration.html#cfn-ivschat-loggingconfiguration-destinationconfiguration-firehose","Required":false,"Type":"FirehoseDestinationConfiguration","UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-loggingconfiguration-destinationconfiguration.html#cfn-ivschat-loggingconfiguration-destinationconfiguration-s3","Required":false,"Type":"S3DestinationConfiguration","UpdateType":"Mutable"}}},"AWS::IVSChat::LoggingConfiguration.FirehoseDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-loggingconfiguration-firehosedestinationconfiguration.html","Properties":{"DeliveryStreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-loggingconfiguration-firehosedestinationconfiguration.html#cfn-ivschat-loggingconfiguration-firehosedestinationconfiguration-deliverystreamname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IVSChat::LoggingConfiguration.S3DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-loggingconfiguration-s3destinationconfiguration.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-loggingconfiguration-s3destinationconfiguration.html#cfn-ivschat-loggingconfiguration-s3destinationconfiguration-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IVSChat::Room.MessageReviewHandler":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-room-messagereviewhandler.html","Properties":{"FallbackResult":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-room-messagereviewhandler.html#cfn-ivschat-room-messagereviewhandler-fallbackresult","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivschat-room-messagereviewhandler.html#cfn-ivschat-room-messagereviewhandler-uri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IdentityStore::GroupMembership.MemberId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-identitystore-groupmembership-memberid.html","Properties":{"UserId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-identitystore-groupmembership-memberid.html#cfn-identitystore-groupmembership-memberid-userid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::ContainerRecipe.ComponentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-componentconfiguration.html","Properties":{"ComponentArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-componentconfiguration.html#cfn-imagebuilder-containerrecipe-componentconfiguration-componentarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-componentconfiguration.html#cfn-imagebuilder-containerrecipe-componentconfiguration-parameters","DuplicatesAllowed":true,"ItemType":"ComponentParameter","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::ImageBuilder::ContainerRecipe.ComponentParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-componentparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-componentparameter.html#cfn-imagebuilder-containerrecipe-componentparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-componentparameter.html#cfn-imagebuilder-containerrecipe-componentparameter-value","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::ImageBuilder::ContainerRecipe.EbsInstanceBlockDeviceSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification.html","Properties":{"DeleteOnTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification-deleteontermination","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification-encrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SnapshotId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification-snapshotid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Throughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification-throughput","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"VolumeSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification-volumesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::ContainerRecipe.InstanceBlockDeviceMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-instanceblockdevicemapping.html","Properties":{"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-instanceblockdevicemapping.html#cfn-imagebuilder-containerrecipe-instanceblockdevicemapping-devicename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Ebs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-instanceblockdevicemapping.html#cfn-imagebuilder-containerrecipe-instanceblockdevicemapping-ebs","Required":false,"Type":"EbsInstanceBlockDeviceSpecification","UpdateType":"Immutable"},"NoDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-instanceblockdevicemapping.html#cfn-imagebuilder-containerrecipe-instanceblockdevicemapping-nodevice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VirtualName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-instanceblockdevicemapping.html#cfn-imagebuilder-containerrecipe-instanceblockdevicemapping-virtualname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::ContainerRecipe.InstanceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-instanceconfiguration.html","Properties":{"BlockDeviceMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-instanceconfiguration.html#cfn-imagebuilder-containerrecipe-instanceconfiguration-blockdevicemappings","DuplicatesAllowed":true,"ItemType":"InstanceBlockDeviceMapping","Required":false,"Type":"List","UpdateType":"Immutable"},"Image":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-instanceconfiguration.html#cfn-imagebuilder-containerrecipe-instanceconfiguration-image","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::ContainerRecipe.TargetContainerRepository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-targetcontainerrepository.html","Properties":{"RepositoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-targetcontainerrepository.html#cfn-imagebuilder-containerrecipe-targetcontainerrepository-repositoryname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Service":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-targetcontainerrepository.html#cfn-imagebuilder-containerrecipe-targetcontainerrepository-service","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::DistributionConfiguration.AmiDistributionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-amidistributionconfiguration.html","Properties":{"AmiTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-amidistributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-amidistributionconfiguration-amitags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-amidistributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-amidistributionconfiguration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-amidistributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-amidistributionconfiguration-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchPermissionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-amidistributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-amidistributionconfiguration-launchpermissionconfiguration","Required":false,"Type":"LaunchPermissionConfiguration","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-amidistributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-amidistributionconfiguration-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetAccountIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-amidistributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-amidistributionconfiguration-targetaccountids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ImageBuilder::DistributionConfiguration.ContainerDistributionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-containerdistributionconfiguration.html","Properties":{"ContainerTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-containerdistributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-containerdistributionconfiguration-containertags","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-containerdistributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-containerdistributionconfiguration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetRepository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-containerdistributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-containerdistributionconfiguration-targetrepository","Required":false,"Type":"TargetContainerRepository","UpdateType":"Mutable"}}},"AWS::ImageBuilder::DistributionConfiguration.Distribution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-distribution.html","Properties":{"AmiDistributionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-distribution.html#cfn-imagebuilder-distributionconfiguration-distribution-amidistributionconfiguration","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ContainerDistributionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-distribution.html#cfn-imagebuilder-distributionconfiguration-distribution-containerdistributionconfiguration","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"FastLaunchConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-distribution.html#cfn-imagebuilder-distributionconfiguration-distribution-fastlaunchconfigurations","DuplicatesAllowed":true,"ItemType":"FastLaunchConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"LaunchTemplateConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-distribution.html#cfn-imagebuilder-distributionconfiguration-distribution-launchtemplateconfigurations","DuplicatesAllowed":true,"ItemType":"LaunchTemplateConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"LicenseConfigurationArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-distribution.html#cfn-imagebuilder-distributionconfiguration-distribution-licenseconfigurationarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-distribution.html#cfn-imagebuilder-distributionconfiguration-distribution-region","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::DistributionConfiguration.FastLaunchConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchconfiguration.html","Properties":{"AccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchconfiguration.html#cfn-imagebuilder-distributionconfiguration-fastlaunchconfiguration-accountid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchconfiguration.html#cfn-imagebuilder-distributionconfiguration-fastlaunchconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LaunchTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchconfiguration.html#cfn-imagebuilder-distributionconfiguration-fastlaunchconfiguration-launchtemplate","Required":false,"Type":"FastLaunchLaunchTemplateSpecification","UpdateType":"Mutable"},"MaxParallelLaunches":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchconfiguration.html#cfn-imagebuilder-distributionconfiguration-fastlaunchconfiguration-maxparallellaunches","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SnapshotConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchconfiguration.html#cfn-imagebuilder-distributionconfiguration-fastlaunchconfiguration-snapshotconfiguration","Required":false,"Type":"FastLaunchSnapshotConfiguration","UpdateType":"Mutable"}}},"AWS::ImageBuilder::DistributionConfiguration.FastLaunchLaunchTemplateSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchlaunchtemplatespecification.html","Properties":{"LaunchTemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchlaunchtemplatespecification.html#cfn-imagebuilder-distributionconfiguration-fastlaunchlaunchtemplatespecification-launchtemplateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchTemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchlaunchtemplatespecification.html#cfn-imagebuilder-distributionconfiguration-fastlaunchlaunchtemplatespecification-launchtemplatename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchTemplateVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchlaunchtemplatespecification.html#cfn-imagebuilder-distributionconfiguration-fastlaunchlaunchtemplatespecification-launchtemplateversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::DistributionConfiguration.FastLaunchSnapshotConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchsnapshotconfiguration.html","Properties":{"TargetResourceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-fastlaunchsnapshotconfiguration.html#cfn-imagebuilder-distributionconfiguration-fastlaunchsnapshotconfiguration-targetresourcecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::DistributionConfiguration.LaunchPermissionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-launchpermissionconfiguration.html","Properties":{"OrganizationArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-launchpermissionconfiguration.html#cfn-imagebuilder-distributionconfiguration-launchpermissionconfiguration-organizationarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OrganizationalUnitArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-launchpermissionconfiguration.html#cfn-imagebuilder-distributionconfiguration-launchpermissionconfiguration-organizationalunitarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"UserGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-launchpermissionconfiguration.html#cfn-imagebuilder-distributionconfiguration-launchpermissionconfiguration-usergroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"UserIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-launchpermissionconfiguration.html#cfn-imagebuilder-distributionconfiguration-launchpermissionconfiguration-userids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ImageBuilder::DistributionConfiguration.LaunchTemplateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-launchtemplateconfiguration.html","Properties":{"AccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-launchtemplateconfiguration.html#cfn-imagebuilder-distributionconfiguration-launchtemplateconfiguration-accountid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchTemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-launchtemplateconfiguration.html#cfn-imagebuilder-distributionconfiguration-launchtemplateconfiguration-launchtemplateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SetDefaultVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-launchtemplateconfiguration.html#cfn-imagebuilder-distributionconfiguration-launchtemplateconfiguration-setdefaultversion","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::DistributionConfiguration.TargetContainerRepository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-targetcontainerrepository.html","Properties":{"RepositoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-targetcontainerrepository.html#cfn-imagebuilder-distributionconfiguration-targetcontainerrepository-repositoryname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Service":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-distributionconfiguration-targetcontainerrepository.html#cfn-imagebuilder-distributionconfiguration-targetcontainerrepository-service","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::Image.EcrConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-image-ecrconfiguration.html","Properties":{"ContainerTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-image-ecrconfiguration.html#cfn-imagebuilder-image-ecrconfiguration-containertags","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"RepositoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-image-ecrconfiguration.html#cfn-imagebuilder-image-ecrconfiguration-repositoryname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::Image.ImageScanningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-image-imagescanningconfiguration.html","Properties":{"EcrConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-image-imagescanningconfiguration.html#cfn-imagebuilder-image-imagescanningconfiguration-ecrconfiguration","Required":false,"Type":"EcrConfiguration","UpdateType":"Immutable"},"ImageScanningEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-image-imagescanningconfiguration.html#cfn-imagebuilder-image-imagescanningconfiguration-imagescanningenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::Image.ImageTestsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-image-imagetestsconfiguration.html","Properties":{"ImageTestsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-image-imagetestsconfiguration.html#cfn-imagebuilder-image-imagetestsconfiguration-imagetestsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"TimeoutMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-image-imagetestsconfiguration.html#cfn-imagebuilder-image-imagetestsconfiguration-timeoutminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::ImagePipeline.EcrConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-ecrconfiguration.html","Properties":{"ContainerTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-ecrconfiguration.html#cfn-imagebuilder-imagepipeline-ecrconfiguration-containertags","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RepositoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-ecrconfiguration.html#cfn-imagebuilder-imagepipeline-ecrconfiguration-repositoryname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::ImagePipeline.ImageScanningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-imagescanningconfiguration.html","Properties":{"EcrConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-imagescanningconfiguration.html#cfn-imagebuilder-imagepipeline-imagescanningconfiguration-ecrconfiguration","Required":false,"Type":"EcrConfiguration","UpdateType":"Mutable"},"ImageScanningEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-imagescanningconfiguration.html#cfn-imagebuilder-imagepipeline-imagescanningconfiguration-imagescanningenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::ImagePipeline.ImageTestsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-imagetestsconfiguration.html","Properties":{"ImageTestsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-imagetestsconfiguration.html#cfn-imagebuilder-imagepipeline-imagetestsconfiguration-imagetestsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TimeoutMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-imagetestsconfiguration.html#cfn-imagebuilder-imagepipeline-imagetestsconfiguration-timeoutminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::ImagePipeline.Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-schedule.html","Properties":{"PipelineExecutionStartCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-schedule.html#cfn-imagebuilder-imagepipeline-schedule-pipelineexecutionstartcondition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagepipeline-schedule.html#cfn-imagebuilder-imagepipeline-schedule-scheduleexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::ImageRecipe.AdditionalInstanceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-additionalinstanceconfiguration.html","Properties":{"SystemsManagerAgent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-additionalinstanceconfiguration.html#cfn-imagebuilder-imagerecipe-additionalinstanceconfiguration-systemsmanageragent","Required":false,"Type":"SystemsManagerAgent","UpdateType":"Mutable"},"UserDataOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-additionalinstanceconfiguration.html#cfn-imagebuilder-imagerecipe-additionalinstanceconfiguration-userdataoverride","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::ImageRecipe.ComponentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentconfiguration.html","Properties":{"ComponentArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentconfiguration.html#cfn-imagebuilder-imagerecipe-componentconfiguration-componentarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentconfiguration.html#cfn-imagebuilder-imagerecipe-componentconfiguration-parameters","DuplicatesAllowed":true,"ItemType":"ComponentParameter","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::ImageBuilder::ImageRecipe.ComponentParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentparameter.html#cfn-imagebuilder-imagerecipe-componentparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentparameter.html#cfn-imagebuilder-imagerecipe-componentparameter-value","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::ImageBuilder::ImageRecipe.EbsInstanceBlockDeviceSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification.html","Properties":{"DeleteOnTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification-deleteontermination","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification-encrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SnapshotId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification-snapshotid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Throughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification-throughput","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"VolumeSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification-volumesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::ImageRecipe.InstanceBlockDeviceMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-instanceblockdevicemapping.html","Properties":{"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-instanceblockdevicemapping.html#cfn-imagebuilder-imagerecipe-instanceblockdevicemapping-devicename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Ebs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-instanceblockdevicemapping.html#cfn-imagebuilder-imagerecipe-instanceblockdevicemapping-ebs","Required":false,"Type":"EbsInstanceBlockDeviceSpecification","UpdateType":"Immutable"},"NoDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-instanceblockdevicemapping.html#cfn-imagebuilder-imagerecipe-instanceblockdevicemapping-nodevice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VirtualName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-instanceblockdevicemapping.html#cfn-imagebuilder-imagerecipe-instanceblockdevicemapping-virtualname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::ImageRecipe.SystemsManagerAgent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-systemsmanageragent.html","Properties":{"UninstallAfterBuild":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-systemsmanageragent.html#cfn-imagebuilder-imagerecipe-systemsmanageragent-uninstallafterbuild","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::InfrastructureConfiguration.InstanceMetadataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-instancemetadataoptions.html","Properties":{"HttpPutResponseHopLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-instancemetadataoptions.html#cfn-imagebuilder-infrastructureconfiguration-instancemetadataoptions-httpputresponsehoplimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HttpTokens":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-instancemetadataoptions.html#cfn-imagebuilder-infrastructureconfiguration-instancemetadataoptions-httptokens","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ImageBuilder::InfrastructureConfiguration.Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-logging.html","Properties":{"S3Logs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-logging.html#cfn-imagebuilder-infrastructureconfiguration-logging-s3logs","Required":false,"Type":"S3Logs","UpdateType":"Mutable"}}},"AWS::ImageBuilder::InfrastructureConfiguration.S3Logs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-s3logs.html","Properties":{"S3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-s3logs.html#cfn-imagebuilder-infrastructureconfiguration-s3logs-s3bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-s3logs.html#cfn-imagebuilder-infrastructureconfiguration-s3logs-s3keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::InspectorV2::Filter.DateFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-datefilter.html","Properties":{"EndInclusive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-datefilter.html#cfn-inspectorv2-filter-datefilter-endinclusive","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StartInclusive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-datefilter.html#cfn-inspectorv2-filter-datefilter-startinclusive","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::InspectorV2::Filter.FilterCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html","Properties":{"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-awsaccountid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ComponentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-componentid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ComponentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-componenttype","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Ec2InstanceImageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ec2instanceimageid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Ec2InstanceSubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ec2instancesubnetid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Ec2InstanceVpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ec2instancevpcid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"EcrImageArchitecture":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimagearchitecture","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"EcrImageHash":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimagehash","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"EcrImagePushedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimagepushedat","DuplicatesAllowed":true,"ItemType":"DateFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"EcrImageRegistry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimageregistry","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"EcrImageRepositoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimagerepositoryname","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"EcrImageTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimagetags","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"FindingArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-findingarn","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"FindingStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-findingstatus","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"FindingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-findingtype","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"FirstObservedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-firstobservedat","DuplicatesAllowed":true,"ItemType":"DateFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"InspectorScore":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-inspectorscore","DuplicatesAllowed":true,"ItemType":"NumberFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"LastObservedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-lastobservedat","DuplicatesAllowed":true,"ItemType":"DateFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"NetworkProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-networkprotocol","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"PortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-portrange","DuplicatesAllowed":true,"ItemType":"PortRangeFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"RelatedVulnerabilities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-relatedvulnerabilities","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-resourceid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-resourcetags","DuplicatesAllowed":true,"ItemType":"MapFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-resourcetype","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Severity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-severity","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-title","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"UpdatedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-updatedat","DuplicatesAllowed":true,"ItemType":"DateFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"VendorSeverity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-vendorseverity","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"VulnerabilityId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-vulnerabilityid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"VulnerabilitySource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-vulnerabilitysource","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"VulnerablePackages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-vulnerablepackages","DuplicatesAllowed":true,"ItemType":"PackageFilter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::InspectorV2::Filter.MapFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-mapfilter.html","Properties":{"Comparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-mapfilter.html#cfn-inspectorv2-filter-mapfilter-comparison","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-mapfilter.html#cfn-inspectorv2-filter-mapfilter-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-mapfilter.html#cfn-inspectorv2-filter-mapfilter-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::InspectorV2::Filter.NumberFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-numberfilter.html","Properties":{"LowerInclusive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-numberfilter.html#cfn-inspectorv2-filter-numberfilter-lowerinclusive","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"UpperInclusive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-numberfilter.html#cfn-inspectorv2-filter-numberfilter-upperinclusive","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::InspectorV2::Filter.PackageFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html","Properties":{"Architecture":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-architecture","Required":false,"Type":"StringFilter","UpdateType":"Mutable"},"Epoch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-epoch","Required":false,"Type":"NumberFilter","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-name","Required":false,"Type":"StringFilter","UpdateType":"Mutable"},"Release":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-release","Required":false,"Type":"StringFilter","UpdateType":"Mutable"},"SourceLayerHash":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-sourcelayerhash","Required":false,"Type":"StringFilter","UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-version","Required":false,"Type":"StringFilter","UpdateType":"Mutable"}}},"AWS::InspectorV2::Filter.PortRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-portrangefilter.html","Properties":{"BeginInclusive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-portrangefilter.html#cfn-inspectorv2-filter-portrangefilter-begininclusive","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"EndInclusive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-portrangefilter.html#cfn-inspectorv2-filter-portrangefilter-endinclusive","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::InspectorV2::Filter.StringFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-stringfilter.html","Properties":{"Comparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-stringfilter.html#cfn-inspectorv2-filter-stringfilter-comparison","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-stringfilter.html#cfn-inspectorv2-filter-stringfilter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::InternetMonitor::Monitor.HealthEventsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-internetmonitor-monitor-healtheventsconfig.html","Properties":{"AvailabilityScoreThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-internetmonitor-monitor-healtheventsconfig.html#cfn-internetmonitor-monitor-healtheventsconfig-availabilityscorethreshold","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PerformanceScoreThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-internetmonitor-monitor-healtheventsconfig.html#cfn-internetmonitor-monitor-healtheventsconfig-performancescorethreshold","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::InternetMonitor::Monitor.InternetMeasurementsLogDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-internetmonitor-monitor-internetmeasurementslogdelivery.html","Properties":{"S3Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-internetmonitor-monitor-internetmeasurementslogdelivery.html#cfn-internetmonitor-monitor-internetmeasurementslogdelivery-s3config","Required":false,"Type":"S3Config","UpdateType":"Mutable"}}},"AWS::InternetMonitor::Monitor.S3Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-internetmonitor-monitor-s3config.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-internetmonitor-monitor-s3config.html#cfn-internetmonitor-monitor-s3config-bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-internetmonitor-monitor-s3config.html#cfn-internetmonitor-monitor-s3config-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogDeliveryStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-internetmonitor-monitor-s3config.html#cfn-internetmonitor-monitor-s3config-logdeliverystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT1Click::Project.DeviceTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-devicetemplate.html","Properties":{"CallbackOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-devicetemplate.html#cfn-iot1click-project-devicetemplate-callbackoverrides","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"DeviceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-devicetemplate.html#cfn-iot1click-project-devicetemplate-devicetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT1Click::Project.PlacementTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-placementtemplate.html","Properties":{"DefaultAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-placementtemplate.html#cfn-iot1click-project-placementtemplate-defaultattributes","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"DeviceTemplates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot1click-project-placementtemplate.html#cfn-iot1click-project-placementtemplate-devicetemplates","ItemType":"DeviceTemplate","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::IoT::AccountAuditConfiguration.AuditCheckConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfiguration.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfiguration.html#cfn-iot-accountauditconfiguration-auditcheckconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::AccountAuditConfiguration.AuditCheckConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html","Properties":{"AuthenticatedCognitoRoleOverlyPermissiveCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-authenticatedcognitoroleoverlypermissivecheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"CaCertificateExpiringCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-cacertificateexpiringcheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"CaCertificateKeyQualityCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-cacertificatekeyqualitycheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"ConflictingClientIdsCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-conflictingclientidscheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"DeviceCertificateExpiringCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-devicecertificateexpiringcheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"DeviceCertificateKeyQualityCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-devicecertificatekeyqualitycheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"DeviceCertificateSharedCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-devicecertificatesharedcheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"IntermediateCaRevokedForActiveDeviceCertificatesCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-intermediatecarevokedforactivedevicecertificatescheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"IoTPolicyPotentialMisConfigurationCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-iotpolicypotentialmisconfigurationcheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"IotPolicyOverlyPermissiveCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-iotpolicyoverlypermissivecheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"IotRoleAliasAllowsAccessToUnusedServicesCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-iotrolealiasallowsaccesstounusedservicescheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"IotRoleAliasOverlyPermissiveCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-iotrolealiasoverlypermissivecheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"LoggingDisabledCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-loggingdisabledcheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"RevokedCaCertificateStillActiveCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-revokedcacertificatestillactivecheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"RevokedDeviceCertificateStillActiveCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-revokeddevicecertificatestillactivecheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"},"UnauthenticatedCognitoRoleOverlyPermissiveCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditcheckconfigurations.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations-unauthenticatedcognitoroleoverlypermissivecheck","Required":false,"Type":"AuditCheckConfiguration","UpdateType":"Mutable"}}},"AWS::IoT::AccountAuditConfiguration.AuditNotificationTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditnotificationtarget.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditnotificationtarget.html#cfn-iot-accountauditconfiguration-auditnotificationtarget-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditnotificationtarget.html#cfn-iot-accountauditconfiguration-auditnotificationtarget-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditnotificationtarget.html#cfn-iot-accountauditconfiguration-auditnotificationtarget-targetarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::AccountAuditConfiguration.AuditNotificationTargetConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditnotificationtargetconfigurations.html","Properties":{"Sns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-accountauditconfiguration-auditnotificationtargetconfigurations.html#cfn-iot-accountauditconfiguration-auditnotificationtargetconfigurations-sns","Required":false,"Type":"AuditNotificationTarget","UpdateType":"Mutable"}}},"AWS::IoT::BillingGroup.BillingGroupProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-billinggroup-billinggroupproperties.html","Properties":{"BillingGroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-billinggroup-billinggroupproperties.html#cfn-iot-billinggroup-billinggroupproperties-billinggroupdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::CACertificate.RegistrationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-cacertificate-registrationconfig.html","Properties":{"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-cacertificate-registrationconfig.html#cfn-iot-cacertificate-registrationconfig-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-cacertificate-registrationconfig.html#cfn-iot-cacertificate-registrationconfig-templatebody","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-cacertificate-registrationconfig.html#cfn-iot-cacertificate-registrationconfig-templatename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::DomainConfiguration.AuthorizerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-authorizerconfig.html","Properties":{"AllowAuthorizerOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-authorizerconfig.html#cfn-iot-domainconfiguration-authorizerconfig-allowauthorizeroverride","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DefaultAuthorizerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-authorizerconfig.html#cfn-iot-domainconfiguration-authorizerconfig-defaultauthorizername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::DomainConfiguration.ServerCertificateSummary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-servercertificatesummary.html","Properties":{"ServerCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-servercertificatesummary.html#cfn-iot-domainconfiguration-servercertificatesummary-servercertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerCertificateStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-servercertificatesummary.html#cfn-iot-domainconfiguration-servercertificatesummary-servercertificatestatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerCertificateStatusDetail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-servercertificatesummary.html#cfn-iot-domainconfiguration-servercertificatesummary-servercertificatestatusdetail","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::DomainConfiguration.TlsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-tlsconfig.html","Properties":{"SecurityPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-domainconfiguration-tlsconfig.html#cfn-iot-domainconfiguration-tlsconfig-securitypolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::FleetMetric.AggregationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-fleetmetric-aggregationtype.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-fleetmetric-aggregationtype.html#cfn-iot-fleetmetric-aggregationtype-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-fleetmetric-aggregationtype.html#cfn-iot-fleetmetric-aggregationtype-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::JobTemplate.AbortConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-abortconfig.html","Properties":{"CriteriaList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-abortconfig.html#cfn-iot-jobtemplate-abortconfig-criterialist","DuplicatesAllowed":true,"ItemType":"AbortCriteria","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::IoT::JobTemplate.AbortCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-abortcriteria.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-abortcriteria.html#cfn-iot-jobtemplate-abortcriteria-action","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FailureType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-abortcriteria.html#cfn-iot-jobtemplate-abortcriteria-failuretype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MinNumberOfExecutedThings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-abortcriteria.html#cfn-iot-jobtemplate-abortcriteria-minnumberofexecutedthings","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"ThresholdPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-abortcriteria.html#cfn-iot-jobtemplate-abortcriteria-thresholdpercentage","PrimitiveType":"Double","Required":true,"UpdateType":"Immutable"}}},"AWS::IoT::JobTemplate.ExponentialRolloutRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-exponentialrolloutrate.html","Properties":{"BaseRatePerMinute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-exponentialrolloutrate.html#cfn-iot-jobtemplate-exponentialrolloutrate-baserateperminute","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"IncrementFactor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-exponentialrolloutrate.html#cfn-iot-jobtemplate-exponentialrolloutrate-incrementfactor","PrimitiveType":"Double","Required":true,"UpdateType":"Immutable"},"RateIncreaseCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-exponentialrolloutrate.html#cfn-iot-jobtemplate-exponentialrolloutrate-rateincreasecriteria","Required":true,"Type":"RateIncreaseCriteria","UpdateType":"Immutable"}}},"AWS::IoT::JobTemplate.JobExecutionsRetryConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-jobexecutionsretryconfig.html","Properties":{"RetryCriteriaList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-jobexecutionsretryconfig.html#cfn-iot-jobtemplate-jobexecutionsretryconfig-retrycriterialist","DuplicatesAllowed":true,"ItemType":"RetryCriteria","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::JobTemplate.JobExecutionsRolloutConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-jobexecutionsrolloutconfig.html","Properties":{"ExponentialRolloutRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-jobexecutionsrolloutconfig.html#cfn-iot-jobtemplate-jobexecutionsrolloutconfig-exponentialrolloutrate","Required":false,"Type":"ExponentialRolloutRate","UpdateType":"Immutable"},"MaximumPerMinute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-jobexecutionsrolloutconfig.html#cfn-iot-jobtemplate-jobexecutionsrolloutconfig-maximumperminute","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::IoT::JobTemplate.MaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-maintenancewindow.html","Properties":{"DurationInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-maintenancewindow.html#cfn-iot-jobtemplate-maintenancewindow-durationinminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-maintenancewindow.html#cfn-iot-jobtemplate-maintenancewindow-starttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::JobTemplate.PresignedUrlConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-presignedurlconfig.html","Properties":{"ExpiresInSec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-presignedurlconfig.html#cfn-iot-jobtemplate-presignedurlconfig-expiresinsec","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-presignedurlconfig.html#cfn-iot-jobtemplate-presignedurlconfig-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoT::JobTemplate.RateIncreaseCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-rateincreasecriteria.html","Properties":{"NumberOfNotifiedThings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-rateincreasecriteria.html#cfn-iot-jobtemplate-rateincreasecriteria-numberofnotifiedthings","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"NumberOfSucceededThings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-rateincreasecriteria.html#cfn-iot-jobtemplate-rateincreasecriteria-numberofsucceededthings","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::IoT::JobTemplate.RetryCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-retrycriteria.html","Properties":{"FailureType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-retrycriteria.html#cfn-iot-jobtemplate-retrycriteria-failuretype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumberOfRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-retrycriteria.html#cfn-iot-jobtemplate-retrycriteria-numberofretries","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::JobTemplate.TimeoutConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-timeoutconfig.html","Properties":{"InProgressTimeoutInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-jobtemplate-timeoutconfig.html#cfn-iot-jobtemplate-timeoutconfig-inprogresstimeoutinminutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::IoT::MitigationAction.ActionParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-actionparams.html","Properties":{"AddThingsToThingGroupParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-actionparams.html#cfn-iot-mitigationaction-actionparams-addthingstothinggroupparams","Required":false,"Type":"AddThingsToThingGroupParams","UpdateType":"Mutable"},"EnableIoTLoggingParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-actionparams.html#cfn-iot-mitigationaction-actionparams-enableiotloggingparams","Required":false,"Type":"EnableIoTLoggingParams","UpdateType":"Mutable"},"PublishFindingToSnsParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-actionparams.html#cfn-iot-mitigationaction-actionparams-publishfindingtosnsparams","Required":false,"Type":"PublishFindingToSnsParams","UpdateType":"Mutable"},"ReplaceDefaultPolicyVersionParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-actionparams.html#cfn-iot-mitigationaction-actionparams-replacedefaultpolicyversionparams","Required":false,"Type":"ReplaceDefaultPolicyVersionParams","UpdateType":"Mutable"},"UpdateCACertificateParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-actionparams.html#cfn-iot-mitigationaction-actionparams-updatecacertificateparams","Required":false,"Type":"UpdateCACertificateParams","UpdateType":"Mutable"},"UpdateDeviceCertificateParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-actionparams.html#cfn-iot-mitigationaction-actionparams-updatedevicecertificateparams","Required":false,"Type":"UpdateDeviceCertificateParams","UpdateType":"Mutable"}}},"AWS::IoT::MitigationAction.AddThingsToThingGroupParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-addthingstothinggroupparams.html","Properties":{"OverrideDynamicGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-addthingstothinggroupparams.html#cfn-iot-mitigationaction-addthingstothinggroupparams-overridedynamicgroups","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ThingGroupNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-addthingstothinggroupparams.html#cfn-iot-mitigationaction-addthingstothinggroupparams-thinggroupnames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::MitigationAction.EnableIoTLoggingParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-enableiotloggingparams.html","Properties":{"LogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-enableiotloggingparams.html#cfn-iot-mitigationaction-enableiotloggingparams-loglevel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArnForLogging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-enableiotloggingparams.html#cfn-iot-mitigationaction-enableiotloggingparams-rolearnforlogging","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::MitigationAction.PublishFindingToSnsParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-publishfindingtosnsparams.html","Properties":{"TopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-publishfindingtosnsparams.html#cfn-iot-mitigationaction-publishfindingtosnsparams-topicarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::MitigationAction.ReplaceDefaultPolicyVersionParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-replacedefaultpolicyversionparams.html","Properties":{"TemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-replacedefaultpolicyversionparams.html#cfn-iot-mitigationaction-replacedefaultpolicyversionparams-templatename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::MitigationAction.UpdateCACertificateParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-updatecacertificateparams.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-updatecacertificateparams.html#cfn-iot-mitigationaction-updatecacertificateparams-action","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::MitigationAction.UpdateDeviceCertificateParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-updatedevicecertificateparams.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-mitigationaction-updatedevicecertificateparams.html#cfn-iot-mitigationaction-updatedevicecertificateparams-action","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::ProvisioningTemplate.ProvisioningHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-provisioningtemplate-provisioninghook.html","Properties":{"PayloadVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-provisioningtemplate-provisioninghook.html#cfn-iot-provisioningtemplate-provisioninghook-payloadversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-provisioningtemplate-provisioninghook.html#cfn-iot-provisioningtemplate-provisioninghook-targetarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::SecurityProfile.AlertTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-alerttarget.html","Properties":{"AlertTargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-alerttarget.html#cfn-iot-securityprofile-alerttarget-alerttargetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-alerttarget.html#cfn-iot-securityprofile-alerttarget-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::SecurityProfile.Behavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behavior.html","Properties":{"Criteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behavior.html#cfn-iot-securityprofile-behavior-criteria","Required":false,"Type":"BehaviorCriteria","UpdateType":"Mutable"},"Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behavior.html#cfn-iot-securityprofile-behavior-metric","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behavior.html#cfn-iot-securityprofile-behavior-metricdimension","Required":false,"Type":"MetricDimension","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behavior.html#cfn-iot-securityprofile-behavior-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SuppressAlerts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behavior.html#cfn-iot-securityprofile-behavior-suppressalerts","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::SecurityProfile.BehaviorCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behaviorcriteria.html","Properties":{"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behaviorcriteria.html#cfn-iot-securityprofile-behaviorcriteria-comparisonoperator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConsecutiveDatapointsToAlarm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behaviorcriteria.html#cfn-iot-securityprofile-behaviorcriteria-consecutivedatapointstoalarm","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ConsecutiveDatapointsToClear":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behaviorcriteria.html#cfn-iot-securityprofile-behaviorcriteria-consecutivedatapointstoclear","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behaviorcriteria.html#cfn-iot-securityprofile-behaviorcriteria-durationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MlDetectionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behaviorcriteria.html#cfn-iot-securityprofile-behaviorcriteria-mldetectionconfig","Required":false,"Type":"MachineLearningDetectionConfig","UpdateType":"Mutable"},"StatisticalThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behaviorcriteria.html#cfn-iot-securityprofile-behaviorcriteria-statisticalthreshold","Required":false,"Type":"StatisticalThreshold","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-behaviorcriteria.html#cfn-iot-securityprofile-behaviorcriteria-value","Required":false,"Type":"MetricValue","UpdateType":"Mutable"}}},"AWS::IoT::SecurityProfile.MachineLearningDetectionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-machinelearningdetectionconfig.html","Properties":{"ConfidenceLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-machinelearningdetectionconfig.html#cfn-iot-securityprofile-machinelearningdetectionconfig-confidencelevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::SecurityProfile.MetricDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metricdimension.html","Properties":{"DimensionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metricdimension.html#cfn-iot-securityprofile-metricdimension-dimensionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Operator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metricdimension.html#cfn-iot-securityprofile-metricdimension-operator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::SecurityProfile.MetricToRetain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metrictoretain.html","Properties":{"Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metrictoretain.html#cfn-iot-securityprofile-metrictoretain-metric","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MetricDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metrictoretain.html#cfn-iot-securityprofile-metrictoretain-metricdimension","Required":false,"Type":"MetricDimension","UpdateType":"Mutable"}}},"AWS::IoT::SecurityProfile.MetricValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metricvalue.html","Properties":{"Cidrs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metricvalue.html#cfn-iot-securityprofile-metricvalue-cidrs","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metricvalue.html#cfn-iot-securityprofile-metricvalue-count","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Number":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metricvalue.html#cfn-iot-securityprofile-metricvalue-number","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Numbers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metricvalue.html#cfn-iot-securityprofile-metricvalue-numbers","DuplicatesAllowed":false,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"},"Ports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metricvalue.html#cfn-iot-securityprofile-metricvalue-ports","DuplicatesAllowed":false,"PrimitiveItemType":"Integer","Required":false,"Type":"List","UpdateType":"Mutable"},"Strings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-metricvalue.html#cfn-iot-securityprofile-metricvalue-strings","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::SecurityProfile.StatisticalThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-statisticalthreshold.html","Properties":{"Statistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-securityprofile-statisticalthreshold.html#cfn-iot-securityprofile-statisticalthreshold-statistic","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::Thing.AttributePayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thing-attributepayload.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thing-attributepayload.html#cfn-iot-thing-attributepayload-attributes","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::IoT::ThingGroup.AttributePayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thinggroup-attributepayload.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thinggroup-attributepayload.html#cfn-iot-thinggroup-attributepayload-attributes","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::IoT::ThingGroup.ThingGroupProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thinggroup-thinggroupproperties.html","Properties":{"AttributePayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thinggroup-thinggroupproperties.html#cfn-iot-thinggroup-thinggroupproperties-attributepayload","Required":false,"Type":"AttributePayload","UpdateType":"Mutable"},"ThingGroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thinggroup-thinggroupproperties.html#cfn-iot-thinggroup-thinggroupproperties-thinggroupdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::ThingType.ThingTypeProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thingtype-thingtypeproperties.html","Properties":{"SearchableAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thingtype-thingtypeproperties.html#cfn-iot-thingtype-thingtypeproperties-searchableattributes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ThingTypeDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-thingtype-thingtypeproperties.html#cfn-iot-thingtype-thingtypeproperties-thingtypedescription","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IoT::TopicRule.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html","Properties":{"CloudwatchAlarm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-cloudwatchalarm","Required":false,"Type":"CloudwatchAlarmAction","UpdateType":"Mutable"},"CloudwatchLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-cloudwatchlogs","Required":false,"Type":"CloudwatchLogsAction","UpdateType":"Mutable"},"CloudwatchMetric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-cloudwatchmetric","Required":false,"Type":"CloudwatchMetricAction","UpdateType":"Mutable"},"DynamoDB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-dynamodb","Required":false,"Type":"DynamoDBAction","UpdateType":"Mutable"},"DynamoDBv2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-dynamodbv2","Required":false,"Type":"DynamoDBv2Action","UpdateType":"Mutable"},"Elasticsearch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-elasticsearch","Required":false,"Type":"ElasticsearchAction","UpdateType":"Mutable"},"Firehose":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-firehose","Required":false,"Type":"FirehoseAction","UpdateType":"Mutable"},"Http":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-http","Required":false,"Type":"HttpAction","UpdateType":"Mutable"},"IotAnalytics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-iotanalytics","Required":false,"Type":"IotAnalyticsAction","UpdateType":"Mutable"},"IotEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-iotevents","Required":false,"Type":"IotEventsAction","UpdateType":"Mutable"},"IotSiteWise":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-iotsitewise","Required":false,"Type":"IotSiteWiseAction","UpdateType":"Mutable"},"Kafka":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-kafka","Required":false,"Type":"KafkaAction","UpdateType":"Mutable"},"Kinesis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-kinesis","Required":false,"Type":"KinesisAction","UpdateType":"Mutable"},"Lambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-lambda","Required":false,"Type":"LambdaAction","UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-location","Required":false,"Type":"LocationAction","UpdateType":"Mutable"},"OpenSearch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-opensearch","Required":false,"Type":"OpenSearchAction","UpdateType":"Mutable"},"Republish":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-republish","Required":false,"Type":"RepublishAction","UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-s3","Required":false,"Type":"S3Action","UpdateType":"Mutable"},"Sns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-sns","Required":false,"Type":"SnsAction","UpdateType":"Mutable"},"Sqs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-sqs","Required":false,"Type":"SqsAction","UpdateType":"Mutable"},"StepFunctions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-stepfunctions","Required":false,"Type":"StepFunctionsAction","UpdateType":"Mutable"},"Timestream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-timestream","Required":false,"Type":"TimestreamAction","UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.AssetPropertyTimestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertytimestamp.html","Properties":{"OffsetInNanos":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertytimestamp.html#cfn-iot-topicrule-assetpropertytimestamp-offsetinnanos","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertytimestamp.html#cfn-iot-topicrule-assetpropertytimestamp-timeinseconds","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.AssetPropertyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertyvalue.html","Properties":{"Quality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertyvalue.html#cfn-iot-topicrule-assetpropertyvalue-quality","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Timestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertyvalue.html#cfn-iot-topicrule-assetpropertyvalue-timestamp","Required":true,"Type":"AssetPropertyTimestamp","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertyvalue.html#cfn-iot-topicrule-assetpropertyvalue-value","Required":true,"Type":"AssetPropertyVariant","UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.AssetPropertyVariant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertyvariant.html","Properties":{"BooleanValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertyvariant.html#cfn-iot-topicrule-assetpropertyvariant-booleanvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DoubleValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertyvariant.html#cfn-iot-topicrule-assetpropertyvariant-doublevalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegerValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertyvariant.html#cfn-iot-topicrule-assetpropertyvariant-integervalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StringValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-assetpropertyvariant.html#cfn-iot-topicrule-assetpropertyvariant-stringvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.CloudwatchAlarmAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchalarmaction.html","Properties":{"AlarmName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchalarmaction.html#cfn-iot-topicrule-cloudwatchalarmaction-alarmname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchalarmaction.html#cfn-iot-topicrule-cloudwatchalarmaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StateReason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchalarmaction.html#cfn-iot-topicrule-cloudwatchalarmaction-statereason","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StateValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchalarmaction.html#cfn-iot-topicrule-cloudwatchalarmaction-statevalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.CloudwatchLogsAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchlogsaction.html","Properties":{"BatchMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchlogsaction.html#cfn-iot-topicrule-cloudwatchlogsaction-batchmode","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchlogsaction.html#cfn-iot-topicrule-cloudwatchlogsaction-loggroupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchlogsaction.html#cfn-iot-topicrule-cloudwatchlogsaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.CloudwatchMetricAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchmetricaction.html","Properties":{"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchmetricaction.html#cfn-iot-topicrule-cloudwatchmetricaction-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MetricNamespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchmetricaction.html#cfn-iot-topicrule-cloudwatchmetricaction-metricnamespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MetricTimestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchmetricaction.html#cfn-iot-topicrule-cloudwatchmetricaction-metrictimestamp","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchmetricaction.html#cfn-iot-topicrule-cloudwatchmetricaction-metricunit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MetricValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchmetricaction.html#cfn-iot-topicrule-cloudwatchmetricaction-metricvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-cloudwatchmetricaction.html#cfn-iot-topicrule-cloudwatchmetricaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.DynamoDBAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbaction.html","Properties":{"HashKeyField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbaction.html#cfn-iot-topicrule-dynamodbaction-hashkeyfield","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HashKeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbaction.html#cfn-iot-topicrule-dynamodbaction-hashkeytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HashKeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbaction.html#cfn-iot-topicrule-dynamodbaction-hashkeyvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PayloadField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbaction.html#cfn-iot-topicrule-dynamodbaction-payloadfield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RangeKeyField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbaction.html#cfn-iot-topicrule-dynamodbaction-rangekeyfield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RangeKeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbaction.html#cfn-iot-topicrule-dynamodbaction-rangekeytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RangeKeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbaction.html#cfn-iot-topicrule-dynamodbaction-rangekeyvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbaction.html#cfn-iot-topicrule-dynamodbaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbaction.html#cfn-iot-topicrule-dynamodbaction-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.DynamoDBv2Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbv2action.html","Properties":{"PutItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbv2action.html#cfn-iot-topicrule-dynamodbv2action-putitem","Required":false,"Type":"PutItemInput","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-dynamodbv2action.html#cfn-iot-topicrule-dynamodbv2action-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.ElasticsearchAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-elasticsearchaction.html","Properties":{"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-elasticsearchaction.html#cfn-iot-topicrule-elasticsearchaction-endpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-elasticsearchaction.html#cfn-iot-topicrule-elasticsearchaction-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Index":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-elasticsearchaction.html#cfn-iot-topicrule-elasticsearchaction-index","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-elasticsearchaction.html#cfn-iot-topicrule-elasticsearchaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-elasticsearchaction.html#cfn-iot-topicrule-elasticsearchaction-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.FirehoseAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-firehoseaction.html","Properties":{"BatchMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-firehoseaction.html#cfn-iot-topicrule-firehoseaction-batchmode","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DeliveryStreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-firehoseaction.html#cfn-iot-topicrule-firehoseaction-deliverystreamname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-firehoseaction.html#cfn-iot-topicrule-firehoseaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Separator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-firehoseaction.html#cfn-iot-topicrule-firehoseaction-separator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.HttpAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-httpaction.html","Properties":{"Auth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-httpaction.html#cfn-iot-topicrule-httpaction-auth","Required":false,"Type":"HttpAuthorization","UpdateType":"Mutable"},"ConfirmationUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-httpaction.html#cfn-iot-topicrule-httpaction-confirmationurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Headers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-httpaction.html#cfn-iot-topicrule-httpaction-headers","DuplicatesAllowed":false,"ItemType":"HttpActionHeader","Required":false,"Type":"List","UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-httpaction.html#cfn-iot-topicrule-httpaction-url","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.HttpActionHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-httpactionheader.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-httpactionheader.html#cfn-iot-topicrule-httpactionheader-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-httpactionheader.html#cfn-iot-topicrule-httpactionheader-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.HttpAuthorization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-httpauthorization.html","Properties":{"Sigv4":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-httpauthorization.html#cfn-iot-topicrule-httpauthorization-sigv4","Required":false,"Type":"SigV4Authorization","UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.IotAnalyticsAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-iotanalyticsaction.html","Properties":{"BatchMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-iotanalyticsaction.html#cfn-iot-topicrule-iotanalyticsaction-batchmode","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ChannelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-iotanalyticsaction.html#cfn-iot-topicrule-iotanalyticsaction-channelname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-iotanalyticsaction.html#cfn-iot-topicrule-iotanalyticsaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.IotEventsAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-ioteventsaction.html","Properties":{"BatchMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-ioteventsaction.html#cfn-iot-topicrule-ioteventsaction-batchmode","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InputName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-ioteventsaction.html#cfn-iot-topicrule-ioteventsaction-inputname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MessageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-ioteventsaction.html#cfn-iot-topicrule-ioteventsaction-messageid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-ioteventsaction.html#cfn-iot-topicrule-ioteventsaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.IotSiteWiseAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-iotsitewiseaction.html","Properties":{"PutAssetPropertyValueEntries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-iotsitewiseaction.html#cfn-iot-topicrule-iotsitewiseaction-putassetpropertyvalueentries","DuplicatesAllowed":false,"ItemType":"PutAssetPropertyValueEntry","Required":true,"Type":"List","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-iotsitewiseaction.html#cfn-iot-topicrule-iotsitewiseaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.KafkaAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-kafkaaction.html","Properties":{"ClientProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-kafkaaction.html#cfn-iot-topicrule-kafkaaction-clientproperties","PrimitiveItemType":"String","Required":true,"Type":"Map","UpdateType":"Mutable"},"DestinationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-kafkaaction.html#cfn-iot-topicrule-kafkaaction-destinationarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-kafkaaction.html#cfn-iot-topicrule-kafkaaction-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Partition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-kafkaaction.html#cfn-iot-topicrule-kafkaaction-partition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Topic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-kafkaaction.html#cfn-iot-topicrule-kafkaaction-topic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.KinesisAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-kinesisaction.html","Properties":{"PartitionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-kinesisaction.html#cfn-iot-topicrule-kinesisaction-partitionkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-kinesisaction.html#cfn-iot-topicrule-kinesisaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-kinesisaction.html#cfn-iot-topicrule-kinesisaction-streamname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.LambdaAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-lambdaaction.html","Properties":{"FunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-lambdaaction.html#cfn-iot-topicrule-lambdaaction-functionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.LocationAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-locationaction.html","Properties":{"DeviceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-locationaction.html#cfn-iot-topicrule-locationaction-deviceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Latitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-locationaction.html#cfn-iot-topicrule-locationaction-latitude","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Longitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-locationaction.html#cfn-iot-topicrule-locationaction-longitude","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-locationaction.html#cfn-iot-topicrule-locationaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Timestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-locationaction.html#cfn-iot-topicrule-locationaction-timestamp","Required":false,"Type":"Timestamp","UpdateType":"Mutable"},"TrackerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-locationaction.html#cfn-iot-topicrule-locationaction-trackername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.OpenSearchAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html","Properties":{"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html#cfn-iot-topicrule-opensearchaction-endpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html#cfn-iot-topicrule-opensearchaction-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Index":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html#cfn-iot-topicrule-opensearchaction-index","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html#cfn-iot-topicrule-opensearchaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html#cfn-iot-topicrule-opensearchaction-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.PutAssetPropertyValueEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-putassetpropertyvalueentry.html","Properties":{"AssetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-putassetpropertyvalueentry.html#cfn-iot-topicrule-putassetpropertyvalueentry-assetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EntryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-putassetpropertyvalueentry.html#cfn-iot-topicrule-putassetpropertyvalueentry-entryid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyAlias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-putassetpropertyvalueentry.html#cfn-iot-topicrule-putassetpropertyvalueentry-propertyalias","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-putassetpropertyvalueentry.html#cfn-iot-topicrule-putassetpropertyvalueentry-propertyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-putassetpropertyvalueentry.html#cfn-iot-topicrule-putassetpropertyvalueentry-propertyvalues","DuplicatesAllowed":false,"ItemType":"AssetPropertyValue","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.PutItemInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-putiteminput.html","Properties":{"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-putiteminput.html#cfn-iot-topicrule-putiteminput-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.RepublishAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishaction.html","Properties":{"Headers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishaction.html#cfn-iot-topicrule-republishaction-headers","Required":false,"Type":"RepublishActionHeaders","UpdateType":"Mutable"},"Qos":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishaction.html#cfn-iot-topicrule-republishaction-qos","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishaction.html#cfn-iot-topicrule-republishaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Topic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishaction.html#cfn-iot-topicrule-republishaction-topic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.RepublishActionHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishactionheaders.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishactionheaders.html#cfn-iot-topicrule-republishactionheaders-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CorrelationData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishactionheaders.html#cfn-iot-topicrule-republishactionheaders-correlationdata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MessageExpiry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishactionheaders.html#cfn-iot-topicrule-republishactionheaders-messageexpiry","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PayloadFormatIndicator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishactionheaders.html#cfn-iot-topicrule-republishactionheaders-payloadformatindicator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseTopic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishactionheaders.html#cfn-iot-topicrule-republishactionheaders-responsetopic","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-republishactionheaders.html#cfn-iot-topicrule-republishactionheaders-userproperties","DuplicatesAllowed":true,"ItemType":"UserProperty","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.S3Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-s3action.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-s3action.html#cfn-iot-topicrule-s3action-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CannedAcl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-s3action.html#cfn-iot-topicrule-s3action-cannedacl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-s3action.html#cfn-iot-topicrule-s3action-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-s3action.html#cfn-iot-topicrule-s3action-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.SigV4Authorization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-sigv4authorization.html","Properties":{"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-sigv4authorization.html#cfn-iot-topicrule-sigv4authorization-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-sigv4authorization.html#cfn-iot-topicrule-sigv4authorization-servicename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SigningRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-sigv4authorization.html#cfn-iot-topicrule-sigv4authorization-signingregion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.SnsAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-snsaction.html","Properties":{"MessageFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-snsaction.html#cfn-iot-topicrule-snsaction-messageformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-snsaction.html#cfn-iot-topicrule-snsaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-snsaction.html#cfn-iot-topicrule-snsaction-targetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.SqsAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-sqsaction.html","Properties":{"QueueUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-sqsaction.html#cfn-iot-topicrule-sqsaction-queueurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-sqsaction.html#cfn-iot-topicrule-sqsaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UseBase64":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-sqsaction.html#cfn-iot-topicrule-sqsaction-usebase64","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.StepFunctionsAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-stepfunctionsaction.html","Properties":{"ExecutionNamePrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-stepfunctionsaction.html#cfn-iot-topicrule-stepfunctionsaction-executionnameprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-stepfunctionsaction.html#cfn-iot-topicrule-stepfunctionsaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StateMachineName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-stepfunctionsaction.html#cfn-iot-topicrule-stepfunctionsaction-statemachinename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.Timestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestamp.html","Properties":{"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestamp.html#cfn-iot-topicrule-timestamp-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestamp.html#cfn-iot-topicrule-timestamp-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.TimestreamAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamaction.html","Properties":{"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamaction.html#cfn-iot-topicrule-timestreamaction-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamaction.html#cfn-iot-topicrule-timestreamaction-dimensions","DuplicatesAllowed":true,"ItemType":"TimestreamDimension","Required":true,"Type":"List","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamaction.html#cfn-iot-topicrule-timestreamaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamaction.html#cfn-iot-topicrule-timestreamaction-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Timestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamaction.html#cfn-iot-topicrule-timestreamaction-timestamp","Required":false,"Type":"TimestreamTimestamp","UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.TimestreamDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamdimension.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamdimension.html#cfn-iot-topicrule-timestreamdimension-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamdimension.html#cfn-iot-topicrule-timestreamdimension-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.TimestreamTimestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamtimestamp.html","Properties":{"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamtimestamp.html#cfn-iot-topicrule-timestreamtimestamp-unit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-timestreamtimestamp.html#cfn-iot-topicrule-timestreamtimestamp-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.TopicRulePayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-topicrulepayload.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-topicrulepayload.html#cfn-iot-topicrule-topicrulepayload-actions","DuplicatesAllowed":true,"ItemType":"Action","Required":true,"Type":"List","UpdateType":"Mutable"},"AwsIotSqlVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-topicrulepayload.html#cfn-iot-topicrule-topicrulepayload-awsiotsqlversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-topicrulepayload.html#cfn-iot-topicrule-topicrulepayload-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ErrorAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-topicrulepayload.html#cfn-iot-topicrule-topicrulepayload-erroraction","Required":false,"Type":"Action","UpdateType":"Mutable"},"RuleDisabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-topicrulepayload.html#cfn-iot-topicrule-topicrulepayload-ruledisabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Sql":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-topicrulepayload.html#cfn-iot-topicrule-topicrulepayload-sql","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRule.UserProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-userproperty.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-userproperty.html#cfn-iot-topicrule-userproperty-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-userproperty.html#cfn-iot-topicrule-userproperty-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::TopicRuleDestination.HttpUrlDestinationSummary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicruledestination-httpurldestinationsummary.html","Properties":{"ConfirmationUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicruledestination-httpurldestinationsummary.html#cfn-iot-topicruledestination-httpurldestinationsummary-confirmationurl","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IoT::TopicRuleDestination.VpcDestinationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicruledestination-vpcdestinationproperties.html","Properties":{"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicruledestination-vpcdestinationproperties.html#cfn-iot-topicruledestination-vpcdestinationproperties-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicruledestination-vpcdestinationproperties.html#cfn-iot-topicruledestination-vpcdestinationproperties-securitygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicruledestination-vpcdestinationproperties.html#cfn-iot-topicruledestination-vpcdestinationproperties-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicruledestination-vpcdestinationproperties.html#cfn-iot-topicruledestination-vpcdestinationproperties-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IoTAnalytics::Channel.ChannelStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-channel-channelstorage.html","Properties":{"CustomerManagedS3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-channel-channelstorage.html#cfn-iotanalytics-channel-channelstorage-customermanageds3","Required":false,"Type":"CustomerManagedS3","UpdateType":"Mutable"},"ServiceManagedS3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-channel-channelstorage.html#cfn-iotanalytics-channel-channelstorage-servicemanageds3","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Channel.CustomerManagedS3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-channel-customermanageds3.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-channel-customermanageds3.html#cfn-iotanalytics-channel-customermanageds3-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-channel-customermanageds3.html#cfn-iotanalytics-channel-customermanageds3-keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-channel-customermanageds3.html#cfn-iotanalytics-channel-customermanageds3-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Channel.RetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-channel-retentionperiod.html","Properties":{"NumberOfDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-channel-retentionperiod.html#cfn-iotanalytics-channel-retentionperiod-numberofdays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Unlimited":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-channel-retentionperiod.html#cfn-iotanalytics-channel-retentionperiod-unlimited","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-action.html","Properties":{"ActionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-action.html#cfn-iotanalytics-dataset-action-actionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ContainerAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-action.html#cfn-iotanalytics-dataset-action-containeraction","Required":false,"Type":"ContainerAction","UpdateType":"Mutable"},"QueryAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-action.html#cfn-iotanalytics-dataset-action-queryaction","Required":false,"Type":"QueryAction","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.ContainerAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-containeraction.html","Properties":{"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-containeraction.html#cfn-iotanalytics-dataset-containeraction-executionrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Image":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-containeraction.html#cfn-iotanalytics-dataset-containeraction-image","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-containeraction.html#cfn-iotanalytics-dataset-containeraction-resourceconfiguration","Required":true,"Type":"ResourceConfiguration","UpdateType":"Mutable"},"Variables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-containeraction.html#cfn-iotanalytics-dataset-containeraction-variables","DuplicatesAllowed":true,"ItemType":"Variable","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.DatasetContentDeliveryRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-datasetcontentdeliveryrule.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-datasetcontentdeliveryrule.html#cfn-iotanalytics-dataset-datasetcontentdeliveryrule-destination","Required":true,"Type":"DatasetContentDeliveryRuleDestination","UpdateType":"Mutable"},"EntryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-datasetcontentdeliveryrule.html#cfn-iotanalytics-dataset-datasetcontentdeliveryrule-entryname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.DatasetContentDeliveryRuleDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-datasetcontentdeliveryruledestination.html","Properties":{"IotEventsDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-datasetcontentdeliveryruledestination.html#cfn-iotanalytics-dataset-datasetcontentdeliveryruledestination-ioteventsdestinationconfiguration","Required":false,"Type":"IotEventsDestinationConfiguration","UpdateType":"Mutable"},"S3DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-datasetcontentdeliveryruledestination.html#cfn-iotanalytics-dataset-datasetcontentdeliveryruledestination-s3destinationconfiguration","Required":false,"Type":"S3DestinationConfiguration","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.DatasetContentVersionValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-datasetcontentversionvalue.html","Properties":{"DatasetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-datasetcontentversionvalue.html#cfn-iotanalytics-dataset-datasetcontentversionvalue-datasetname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.DeltaTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-deltatime.html","Properties":{"OffsetSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-deltatime.html#cfn-iotanalytics-dataset-deltatime-offsetseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"TimeExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-deltatime.html#cfn-iotanalytics-dataset-deltatime-timeexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.DeltaTimeSessionWindowConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-deltatimesessionwindowconfiguration.html","Properties":{"TimeoutInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-deltatimesessionwindowconfiguration.html#cfn-iotanalytics-dataset-deltatimesessionwindowconfiguration-timeoutinminutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-filter.html","Properties":{"DeltaTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-filter.html#cfn-iotanalytics-dataset-filter-deltatime","Required":false,"Type":"DeltaTime","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.GlueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-glueconfiguration.html","Properties":{"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-glueconfiguration.html#cfn-iotanalytics-dataset-glueconfiguration-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-glueconfiguration.html#cfn-iotanalytics-dataset-glueconfiguration-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.IotEventsDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-ioteventsdestinationconfiguration.html","Properties":{"InputName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-ioteventsdestinationconfiguration.html#cfn-iotanalytics-dataset-ioteventsdestinationconfiguration-inputname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-ioteventsdestinationconfiguration.html#cfn-iotanalytics-dataset-ioteventsdestinationconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.LateDataRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-latedatarule.html","Properties":{"RuleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-latedatarule.html#cfn-iotanalytics-dataset-latedatarule-ruleconfiguration","Required":true,"Type":"LateDataRuleConfiguration","UpdateType":"Mutable"},"RuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-latedatarule.html#cfn-iotanalytics-dataset-latedatarule-rulename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.LateDataRuleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-latedataruleconfiguration.html","Properties":{"DeltaTimeSessionWindowConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-latedataruleconfiguration.html#cfn-iotanalytics-dataset-latedataruleconfiguration-deltatimesessionwindowconfiguration","Required":false,"Type":"DeltaTimeSessionWindowConfiguration","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.OutputFileUriValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-outputfileurivalue.html","Properties":{"FileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-outputfileurivalue.html#cfn-iotanalytics-dataset-outputfileurivalue-filename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.QueryAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-queryaction.html","Properties":{"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-queryaction.html#cfn-iotanalytics-dataset-queryaction-filters","DuplicatesAllowed":true,"ItemType":"Filter","Required":false,"Type":"List","UpdateType":"Mutable"},"SqlQuery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-queryaction.html#cfn-iotanalytics-dataset-queryaction-sqlquery","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.ResourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-resourceconfiguration.html","Properties":{"ComputeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-resourceconfiguration.html#cfn-iotanalytics-dataset-resourceconfiguration-computetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VolumeSizeInGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-resourceconfiguration.html#cfn-iotanalytics-dataset-resourceconfiguration-volumesizeingb","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.RetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-retentionperiod.html","Properties":{"NumberOfDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-retentionperiod.html#cfn-iotanalytics-dataset-retentionperiod-numberofdays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Unlimited":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-retentionperiod.html#cfn-iotanalytics-dataset-retentionperiod-unlimited","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.S3DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-s3destinationconfiguration.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-s3destinationconfiguration.html#cfn-iotanalytics-dataset-s3destinationconfiguration-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"GlueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-s3destinationconfiguration.html#cfn-iotanalytics-dataset-s3destinationconfiguration-glueconfiguration","Required":false,"Type":"GlueConfiguration","UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-s3destinationconfiguration.html#cfn-iotanalytics-dataset-s3destinationconfiguration-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-s3destinationconfiguration.html#cfn-iotanalytics-dataset-s3destinationconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-schedule.html","Properties":{"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-schedule.html#cfn-iotanalytics-dataset-schedule-scheduleexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.Trigger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-trigger.html","Properties":{"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-trigger.html#cfn-iotanalytics-dataset-trigger-schedule","Required":false,"Type":"Schedule","UpdateType":"Mutable"},"TriggeringDataset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-trigger.html#cfn-iotanalytics-dataset-trigger-triggeringdataset","Required":false,"Type":"TriggeringDataset","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.TriggeringDataset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-triggeringdataset.html","Properties":{"DatasetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-triggeringdataset.html#cfn-iotanalytics-dataset-triggeringdataset-datasetname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.Variable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-variable.html","Properties":{"DatasetContentVersionValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-variable.html#cfn-iotanalytics-dataset-variable-datasetcontentversionvalue","Required":false,"Type":"DatasetContentVersionValue","UpdateType":"Mutable"},"DoubleValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-variable.html#cfn-iotanalytics-dataset-variable-doublevalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"OutputFileUriValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-variable.html#cfn-iotanalytics-dataset-variable-outputfileurivalue","Required":false,"Type":"OutputFileUriValue","UpdateType":"Mutable"},"StringValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-variable.html#cfn-iotanalytics-dataset-variable-stringvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VariableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-variable.html#cfn-iotanalytics-dataset-variable-variablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset.VersioningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-versioningconfiguration.html","Properties":{"MaxVersions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-versioningconfiguration.html#cfn-iotanalytics-dataset-versioningconfiguration-maxversions","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Unlimited":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-versioningconfiguration.html#cfn-iotanalytics-dataset-versioningconfiguration-unlimited","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-column.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-column.html#cfn-iotanalytics-datastore-column-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-column.html#cfn-iotanalytics-datastore-column-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.CustomerManagedS3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-customermanageds3.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-customermanageds3.html#cfn-iotanalytics-datastore-customermanageds3-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-customermanageds3.html#cfn-iotanalytics-datastore-customermanageds3-keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-customermanageds3.html#cfn-iotanalytics-datastore-customermanageds3-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.CustomerManagedS3Storage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-customermanageds3storage.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-customermanageds3storage.html#cfn-iotanalytics-datastore-customermanageds3storage-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-customermanageds3storage.html#cfn-iotanalytics-datastore-customermanageds3storage-keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.DatastorePartition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorepartition.html","Properties":{"Partition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorepartition.html#cfn-iotanalytics-datastore-datastorepartition-partition","Required":false,"Type":"Partition","UpdateType":"Mutable"},"TimestampPartition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorepartition.html#cfn-iotanalytics-datastore-datastorepartition-timestamppartition","Required":false,"Type":"TimestampPartition","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.DatastorePartitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorepartitions.html","Properties":{"Partitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorepartitions.html#cfn-iotanalytics-datastore-datastorepartitions-partitions","DuplicatesAllowed":true,"ItemType":"DatastorePartition","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.DatastoreStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorestorage.html","Properties":{"CustomerManagedS3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorestorage.html#cfn-iotanalytics-datastore-datastorestorage-customermanageds3","Required":false,"Type":"CustomerManagedS3","UpdateType":"Mutable"},"IotSiteWiseMultiLayerStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorestorage.html#cfn-iotanalytics-datastore-datastorestorage-iotsitewisemultilayerstorage","Required":false,"Type":"IotSiteWiseMultiLayerStorage","UpdateType":"Mutable"},"ServiceManagedS3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorestorage.html#cfn-iotanalytics-datastore-datastorestorage-servicemanageds3","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.FileFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-fileformatconfiguration.html","Properties":{"JsonConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-fileformatconfiguration.html#cfn-iotanalytics-datastore-fileformatconfiguration-jsonconfiguration","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ParquetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-fileformatconfiguration.html#cfn-iotanalytics-datastore-fileformatconfiguration-parquetconfiguration","Required":false,"Type":"ParquetConfiguration","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.IotSiteWiseMultiLayerStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-iotsitewisemultilayerstorage.html","Properties":{"CustomerManagedS3Storage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-iotsitewisemultilayerstorage.html#cfn-iotanalytics-datastore-iotsitewisemultilayerstorage-customermanageds3storage","Required":false,"Type":"CustomerManagedS3Storage","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.ParquetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-parquetconfiguration.html","Properties":{"SchemaDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-parquetconfiguration.html#cfn-iotanalytics-datastore-parquetconfiguration-schemadefinition","Required":false,"Type":"SchemaDefinition","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.Partition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-partition.html","Properties":{"AttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-partition.html#cfn-iotanalytics-datastore-partition-attributename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.RetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-retentionperiod.html","Properties":{"NumberOfDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-retentionperiod.html#cfn-iotanalytics-datastore-retentionperiod-numberofdays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Unlimited":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-retentionperiod.html#cfn-iotanalytics-datastore-retentionperiod-unlimited","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.SchemaDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-schemadefinition.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-schemadefinition.html#cfn-iotanalytics-datastore-schemadefinition-columns","DuplicatesAllowed":true,"ItemType":"Column","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore.TimestampPartition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-timestamppartition.html","Properties":{"AttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-timestamppartition.html#cfn-iotanalytics-datastore-timestamppartition-attributename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimestampFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-timestamppartition.html#cfn-iotanalytics-datastore-timestamppartition-timestampformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline.Activity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-activity.html","Properties":{"AddAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-activity.html#cfn-iotanalytics-pipeline-activity-addattributes","Required":false,"Type":"AddAttributes","UpdateType":"Mutable"},"Channel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-activity.html#cfn-iotanalytics-pipeline-activity-channel","Required":false,"Type":"Channel","UpdateType":"Mutable"},"Datastore":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-activity.html#cfn-iotanalytics-pipeline-activity-datastore","Required":false,"Type":"Datastore","UpdateType":"Mutable"},"DeviceRegistryEnrich":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-activity.html#cfn-iotanalytics-pipeline-activity-deviceregistryenrich","Required":false,"Type":"DeviceRegistryEnrich","UpdateType":"Mutable"},"DeviceShadowEnrich":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-activity.html#cfn-iotanalytics-pipeline-activity-deviceshadowenrich","Required":false,"Type":"DeviceShadowEnrich","UpdateType":"Mutable"},"Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-activity.html#cfn-iotanalytics-pipeline-activity-filter","Required":false,"Type":"Filter","UpdateType":"Mutable"},"Lambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-activity.html#cfn-iotanalytics-pipeline-activity-lambda","Required":false,"Type":"Lambda","UpdateType":"Mutable"},"Math":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-activity.html#cfn-iotanalytics-pipeline-activity-math","Required":false,"Type":"Math","UpdateType":"Mutable"},"RemoveAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-activity.html#cfn-iotanalytics-pipeline-activity-removeattributes","Required":false,"Type":"RemoveAttributes","UpdateType":"Mutable"},"SelectAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-activity.html#cfn-iotanalytics-pipeline-activity-selectattributes","Required":false,"Type":"SelectAttributes","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline.AddAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-addattributes.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-addattributes.html#cfn-iotanalytics-pipeline-addattributes-attributes","PrimitiveItemType":"String","Required":true,"Type":"Map","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-addattributes.html#cfn-iotanalytics-pipeline-addattributes-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Next":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-addattributes.html#cfn-iotanalytics-pipeline-addattributes-next","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline.Channel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-channel.html","Properties":{"ChannelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-channel.html#cfn-iotanalytics-pipeline-channel-channelname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-channel.html#cfn-iotanalytics-pipeline-channel-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Next":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-channel.html#cfn-iotanalytics-pipeline-channel-next","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline.Datastore":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-datastore.html","Properties":{"DatastoreName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-datastore.html#cfn-iotanalytics-pipeline-datastore-datastorename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-datastore.html#cfn-iotanalytics-pipeline-datastore-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline.DeviceRegistryEnrich":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceregistryenrich.html","Properties":{"Attribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceregistryenrich.html#cfn-iotanalytics-pipeline-deviceregistryenrich-attribute","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceregistryenrich.html#cfn-iotanalytics-pipeline-deviceregistryenrich-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Next":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceregistryenrich.html#cfn-iotanalytics-pipeline-deviceregistryenrich-next","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceregistryenrich.html#cfn-iotanalytics-pipeline-deviceregistryenrich-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ThingName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceregistryenrich.html#cfn-iotanalytics-pipeline-deviceregistryenrich-thingname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline.DeviceShadowEnrich":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceshadowenrich.html","Properties":{"Attribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceshadowenrich.html#cfn-iotanalytics-pipeline-deviceshadowenrich-attribute","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceshadowenrich.html#cfn-iotanalytics-pipeline-deviceshadowenrich-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Next":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceshadowenrich.html#cfn-iotanalytics-pipeline-deviceshadowenrich-next","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceshadowenrich.html#cfn-iotanalytics-pipeline-deviceshadowenrich-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ThingName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceshadowenrich.html#cfn-iotanalytics-pipeline-deviceshadowenrich-thingname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline.Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-filter.html","Properties":{"Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-filter.html#cfn-iotanalytics-pipeline-filter-filter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-filter.html#cfn-iotanalytics-pipeline-filter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Next":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-filter.html#cfn-iotanalytics-pipeline-filter-next","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline.Lambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-lambda.html","Properties":{"BatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-lambda.html#cfn-iotanalytics-pipeline-lambda-batchsize","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"LambdaName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-lambda.html#cfn-iotanalytics-pipeline-lambda-lambdaname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-lambda.html#cfn-iotanalytics-pipeline-lambda-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Next":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-lambda.html#cfn-iotanalytics-pipeline-lambda-next","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline.Math":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-math.html","Properties":{"Attribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-math.html#cfn-iotanalytics-pipeline-math-attribute","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Math":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-math.html#cfn-iotanalytics-pipeline-math-math","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-math.html#cfn-iotanalytics-pipeline-math-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Next":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-math.html#cfn-iotanalytics-pipeline-math-next","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline.RemoveAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-removeattributes.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-removeattributes.html#cfn-iotanalytics-pipeline-removeattributes-attributes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-removeattributes.html#cfn-iotanalytics-pipeline-removeattributes-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Next":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-removeattributes.html#cfn-iotanalytics-pipeline-removeattributes-next","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline.SelectAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-selectattributes.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-selectattributes.html#cfn-iotanalytics-pipeline-selectattributes-attributes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-selectattributes.html#cfn-iotanalytics-pipeline-selectattributes-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Next":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-selectattributes.html#cfn-iotanalytics-pipeline-selectattributes-next","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTCoreDeviceAdvisor::SuiteDefinition.DeviceUnderTest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotcoredeviceadvisor-suitedefinition-deviceundertest.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotcoredeviceadvisor-suitedefinition-deviceundertest.html#cfn-iotcoredeviceadvisor-suitedefinition-deviceundertest-certificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThingArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotcoredeviceadvisor-suitedefinition-deviceundertest.html#cfn-iotcoredeviceadvisor-suitedefinition-deviceundertest-thingarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTCoreDeviceAdvisor::SuiteDefinition.SuiteDefinitionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration.html","Properties":{"DevicePermissionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration.html#cfn-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration-devicepermissionrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Devices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration.html#cfn-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration-devices","DuplicatesAllowed":true,"ItemType":"DeviceUnderTest","Required":false,"Type":"List","UpdateType":"Mutable"},"IntendedForQualification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration.html#cfn-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration-intendedforqualification","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RootGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration.html#cfn-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration-rootgroup","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SuiteDefinitionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration.html#cfn-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration-suitedefinitionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.AcknowledgeFlow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-acknowledgeflow.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-acknowledgeflow.html#cfn-iotevents-alarmmodel-acknowledgeflow-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.AlarmAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html","Properties":{"DynamoDB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-dynamodb","Required":false,"Type":"DynamoDB","UpdateType":"Mutable"},"DynamoDBv2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-dynamodbv2","Required":false,"Type":"DynamoDBv2","UpdateType":"Mutable"},"Firehose":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-firehose","Required":false,"Type":"Firehose","UpdateType":"Mutable"},"IotEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-iotevents","Required":false,"Type":"IotEvents","UpdateType":"Mutable"},"IotSiteWise":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-iotsitewise","Required":false,"Type":"IotSiteWise","UpdateType":"Mutable"},"IotTopicPublish":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-iottopicpublish","Required":false,"Type":"IotTopicPublish","UpdateType":"Mutable"},"Lambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-lambda","Required":false,"Type":"Lambda","UpdateType":"Mutable"},"Sns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-sns","Required":false,"Type":"Sns","UpdateType":"Mutable"},"Sqs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-sqs","Required":false,"Type":"Sqs","UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.AlarmCapabilities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmcapabilities.html","Properties":{"AcknowledgeFlow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmcapabilities.html#cfn-iotevents-alarmmodel-alarmcapabilities-acknowledgeflow","Required":false,"Type":"AcknowledgeFlow","UpdateType":"Mutable"},"InitializationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmcapabilities.html#cfn-iotevents-alarmmodel-alarmcapabilities-initializationconfiguration","Required":false,"Type":"InitializationConfiguration","UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.AlarmEventActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmeventactions.html","Properties":{"AlarmActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmeventactions.html#cfn-iotevents-alarmmodel-alarmeventactions-alarmactions","DuplicatesAllowed":true,"ItemType":"AlarmAction","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.AlarmRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmrule.html","Properties":{"SimpleRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmrule.html#cfn-iotevents-alarmmodel-alarmrule-simplerule","Required":false,"Type":"SimpleRule","UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.AssetPropertyTimestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertytimestamp.html","Properties":{"OffsetInNanos":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertytimestamp.html#cfn-iotevents-alarmmodel-assetpropertytimestamp-offsetinnanos","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertytimestamp.html#cfn-iotevents-alarmmodel-assetpropertytimestamp-timeinseconds","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.AssetPropertyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvalue.html","Properties":{"Quality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvalue.html#cfn-iotevents-alarmmodel-assetpropertyvalue-quality","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Timestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvalue.html#cfn-iotevents-alarmmodel-assetpropertyvalue-timestamp","Required":false,"Type":"AssetPropertyTimestamp","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvalue.html#cfn-iotevents-alarmmodel-assetpropertyvalue-value","Required":true,"Type":"AssetPropertyVariant","UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.AssetPropertyVariant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvariant.html","Properties":{"BooleanValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvariant.html#cfn-iotevents-alarmmodel-assetpropertyvariant-booleanvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DoubleValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvariant.html#cfn-iotevents-alarmmodel-assetpropertyvariant-doublevalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegerValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvariant.html#cfn-iotevents-alarmmodel-assetpropertyvariant-integervalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StringValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvariant.html#cfn-iotevents-alarmmodel-assetpropertyvariant-stringvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.DynamoDB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html","Properties":{"HashKeyField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-hashkeyfield","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HashKeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-hashkeytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HashKeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-hashkeyvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Operation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-operation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"},"PayloadField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-payloadfield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RangeKeyField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-rangekeyfield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RangeKeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-rangekeytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RangeKeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-rangekeyvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.DynamoDBv2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodbv2.html","Properties":{"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodbv2.html#cfn-iotevents-alarmmodel-dynamodbv2-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodbv2.html#cfn-iotevents-alarmmodel-dynamodbv2-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.Firehose":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-firehose.html","Properties":{"DeliveryStreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-firehose.html#cfn-iotevents-alarmmodel-firehose-deliverystreamname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-firehose.html#cfn-iotevents-alarmmodel-firehose-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"},"Separator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-firehose.html#cfn-iotevents-alarmmodel-firehose-separator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.InitializationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-initializationconfiguration.html","Properties":{"DisabledOnInitialization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-initializationconfiguration.html#cfn-iotevents-alarmmodel-initializationconfiguration-disabledoninitialization","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.IotEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotevents.html","Properties":{"InputName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotevents.html#cfn-iotevents-alarmmodel-iotevents-inputname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotevents.html#cfn-iotevents-alarmmodel-iotevents-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.IotSiteWise":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html","Properties":{"AssetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html#cfn-iotevents-alarmmodel-iotsitewise-assetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EntryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html#cfn-iotevents-alarmmodel-iotsitewise-entryid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyAlias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html#cfn-iotevents-alarmmodel-iotsitewise-propertyalias","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html#cfn-iotevents-alarmmodel-iotsitewise-propertyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html#cfn-iotevents-alarmmodel-iotsitewise-propertyvalue","Required":false,"Type":"AssetPropertyValue","UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.IotTopicPublish":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iottopicpublish.html","Properties":{"MqttTopic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iottopicpublish.html#cfn-iotevents-alarmmodel-iottopicpublish-mqtttopic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iottopicpublish.html#cfn-iotevents-alarmmodel-iottopicpublish-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.Lambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-lambda.html","Properties":{"FunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-lambda.html#cfn-iotevents-alarmmodel-lambda-functionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-lambda.html#cfn-iotevents-alarmmodel-lambda-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-payload.html","Properties":{"ContentExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-payload.html#cfn-iotevents-alarmmodel-payload-contentexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-payload.html#cfn-iotevents-alarmmodel-payload-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.SimpleRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-simplerule.html","Properties":{"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-simplerule.html#cfn-iotevents-alarmmodel-simplerule-comparisonoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InputProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-simplerule.html#cfn-iotevents-alarmmodel-simplerule-inputproperty","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-simplerule.html#cfn-iotevents-alarmmodel-simplerule-threshold","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.Sns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sns.html","Properties":{"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sns.html#cfn-iotevents-alarmmodel-sns-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"},"TargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sns.html#cfn-iotevents-alarmmodel-sns-targetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel.Sqs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sqs.html","Properties":{"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sqs.html#cfn-iotevents-alarmmodel-sqs-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"},"QueueUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sqs.html#cfn-iotevents-alarmmodel-sqs-queueurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UseBase64":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sqs.html#cfn-iotevents-alarmmodel-sqs-usebase64","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html","Properties":{"ClearTimer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-cleartimer","Required":false,"Type":"ClearTimer","UpdateType":"Mutable"},"DynamoDB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-dynamodb","Required":false,"Type":"DynamoDB","UpdateType":"Mutable"},"DynamoDBv2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-dynamodbv2","Required":false,"Type":"DynamoDBv2","UpdateType":"Mutable"},"Firehose":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-firehose","Required":false,"Type":"Firehose","UpdateType":"Mutable"},"IotEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-iotevents","Required":false,"Type":"IotEvents","UpdateType":"Mutable"},"IotSiteWise":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-iotsitewise","Required":false,"Type":"IotSiteWise","UpdateType":"Mutable"},"IotTopicPublish":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-iottopicpublish","Required":false,"Type":"IotTopicPublish","UpdateType":"Mutable"},"Lambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-lambda","Required":false,"Type":"Lambda","UpdateType":"Mutable"},"ResetTimer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-resettimer","Required":false,"Type":"ResetTimer","UpdateType":"Mutable"},"SetTimer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-settimer","Required":false,"Type":"SetTimer","UpdateType":"Mutable"},"SetVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-setvariable","Required":false,"Type":"SetVariable","UpdateType":"Mutable"},"Sns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-sns","Required":false,"Type":"Sns","UpdateType":"Mutable"},"Sqs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-action.html#cfn-iotevents-detectormodel-action-sqs","Required":false,"Type":"Sqs","UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.AssetPropertyTimestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertytimestamp.html","Properties":{"OffsetInNanos":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertytimestamp.html#cfn-iotevents-detectormodel-assetpropertytimestamp-offsetinnanos","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertytimestamp.html#cfn-iotevents-detectormodel-assetpropertytimestamp-timeinseconds","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.AssetPropertyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertyvalue.html","Properties":{"Quality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertyvalue.html#cfn-iotevents-detectormodel-assetpropertyvalue-quality","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Timestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertyvalue.html#cfn-iotevents-detectormodel-assetpropertyvalue-timestamp","Required":false,"Type":"AssetPropertyTimestamp","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertyvalue.html#cfn-iotevents-detectormodel-assetpropertyvalue-value","Required":true,"Type":"AssetPropertyVariant","UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.AssetPropertyVariant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertyvariant.html","Properties":{"BooleanValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertyvariant.html#cfn-iotevents-detectormodel-assetpropertyvariant-booleanvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DoubleValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertyvariant.html#cfn-iotevents-detectormodel-assetpropertyvariant-doublevalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegerValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertyvariant.html#cfn-iotevents-detectormodel-assetpropertyvariant-integervalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StringValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-assetpropertyvariant.html#cfn-iotevents-detectormodel-assetpropertyvariant-stringvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.ClearTimer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-cleartimer.html","Properties":{"TimerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-cleartimer.html#cfn-iotevents-detectormodel-cleartimer-timername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.DetectorModelDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-detectormodeldefinition.html","Properties":{"InitialStateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-detectormodeldefinition.html#cfn-iotevents-detectormodel-detectormodeldefinition-initialstatename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"States":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-detectormodeldefinition.html#cfn-iotevents-detectormodel-detectormodeldefinition-states","DuplicatesAllowed":true,"ItemType":"State","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.DynamoDB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodb.html","Properties":{"HashKeyField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodb.html#cfn-iotevents-detectormodel-dynamodb-hashkeyfield","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HashKeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodb.html#cfn-iotevents-detectormodel-dynamodb-hashkeytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HashKeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodb.html#cfn-iotevents-detectormodel-dynamodb-hashkeyvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Operation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodb.html#cfn-iotevents-detectormodel-dynamodb-operation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodb.html#cfn-iotevents-detectormodel-dynamodb-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"},"PayloadField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodb.html#cfn-iotevents-detectormodel-dynamodb-payloadfield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RangeKeyField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodb.html#cfn-iotevents-detectormodel-dynamodb-rangekeyfield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RangeKeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodb.html#cfn-iotevents-detectormodel-dynamodb-rangekeytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RangeKeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodb.html#cfn-iotevents-detectormodel-dynamodb-rangekeyvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodb.html#cfn-iotevents-detectormodel-dynamodb-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.DynamoDBv2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodbv2.html","Properties":{"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodbv2.html#cfn-iotevents-detectormodel-dynamodbv2-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-dynamodbv2.html#cfn-iotevents-detectormodel-dynamodbv2-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.Event":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-event.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-event.html#cfn-iotevents-detectormodel-event-actions","DuplicatesAllowed":true,"ItemType":"Action","Required":false,"Type":"List","UpdateType":"Mutable"},"Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-event.html#cfn-iotevents-detectormodel-event-condition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-event.html#cfn-iotevents-detectormodel-event-eventname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.Firehose":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-firehose.html","Properties":{"DeliveryStreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-firehose.html#cfn-iotevents-detectormodel-firehose-deliverystreamname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-firehose.html#cfn-iotevents-detectormodel-firehose-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"},"Separator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-firehose.html#cfn-iotevents-detectormodel-firehose-separator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.IotEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iotevents.html","Properties":{"InputName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iotevents.html#cfn-iotevents-detectormodel-iotevents-inputname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iotevents.html#cfn-iotevents-detectormodel-iotevents-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.IotSiteWise":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iotsitewise.html","Properties":{"AssetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iotsitewise.html#cfn-iotevents-detectormodel-iotsitewise-assetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EntryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iotsitewise.html#cfn-iotevents-detectormodel-iotsitewise-entryid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyAlias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iotsitewise.html#cfn-iotevents-detectormodel-iotsitewise-propertyalias","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iotsitewise.html#cfn-iotevents-detectormodel-iotsitewise-propertyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iotsitewise.html#cfn-iotevents-detectormodel-iotsitewise-propertyvalue","Required":true,"Type":"AssetPropertyValue","UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.IotTopicPublish":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iottopicpublish.html","Properties":{"MqttTopic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iottopicpublish.html#cfn-iotevents-detectormodel-iottopicpublish-mqtttopic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-iottopicpublish.html#cfn-iotevents-detectormodel-iottopicpublish-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.Lambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-lambda.html","Properties":{"FunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-lambda.html#cfn-iotevents-detectormodel-lambda-functionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-lambda.html#cfn-iotevents-detectormodel-lambda-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.OnEnter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-onenter.html","Properties":{"Events":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-onenter.html#cfn-iotevents-detectormodel-onenter-events","DuplicatesAllowed":true,"ItemType":"Event","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.OnExit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-onexit.html","Properties":{"Events":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-onexit.html#cfn-iotevents-detectormodel-onexit-events","DuplicatesAllowed":true,"ItemType":"Event","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.OnInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-oninput.html","Properties":{"Events":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-oninput.html#cfn-iotevents-detectormodel-oninput-events","DuplicatesAllowed":true,"ItemType":"Event","Required":false,"Type":"List","UpdateType":"Mutable"},"TransitionEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-oninput.html#cfn-iotevents-detectormodel-oninput-transitionevents","DuplicatesAllowed":true,"ItemType":"TransitionEvent","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-payload.html","Properties":{"ContentExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-payload.html#cfn-iotevents-detectormodel-payload-contentexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-payload.html#cfn-iotevents-detectormodel-payload-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.ResetTimer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-resettimer.html","Properties":{"TimerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-resettimer.html#cfn-iotevents-detectormodel-resettimer-timername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.SetTimer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-settimer.html","Properties":{"DurationExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-settimer.html#cfn-iotevents-detectormodel-settimer-durationexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Seconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-settimer.html#cfn-iotevents-detectormodel-settimer-seconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TimerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-settimer.html#cfn-iotevents-detectormodel-settimer-timername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.SetVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-setvariable.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-setvariable.html#cfn-iotevents-detectormodel-setvariable-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VariableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-setvariable.html#cfn-iotevents-detectormodel-setvariable-variablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.Sns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-sns.html","Properties":{"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-sns.html#cfn-iotevents-detectormodel-sns-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"},"TargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-sns.html#cfn-iotevents-detectormodel-sns-targetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.Sqs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-sqs.html","Properties":{"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-sqs.html#cfn-iotevents-detectormodel-sqs-payload","Required":false,"Type":"Payload","UpdateType":"Mutable"},"QueueUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-sqs.html#cfn-iotevents-detectormodel-sqs-queueurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UseBase64":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-sqs.html#cfn-iotevents-detectormodel-sqs-usebase64","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-state.html","Properties":{"OnEnter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-state.html#cfn-iotevents-detectormodel-state-onenter","Required":false,"Type":"OnEnter","UpdateType":"Mutable"},"OnExit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-state.html#cfn-iotevents-detectormodel-state-onexit","Required":false,"Type":"OnExit","UpdateType":"Mutable"},"OnInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-state.html#cfn-iotevents-detectormodel-state-oninput","Required":false,"Type":"OnInput","UpdateType":"Mutable"},"StateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-state.html#cfn-iotevents-detectormodel-state-statename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel.TransitionEvent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-transitionevent.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-transitionevent.html#cfn-iotevents-detectormodel-transitionevent-actions","DuplicatesAllowed":true,"ItemType":"Action","Required":false,"Type":"List","UpdateType":"Mutable"},"Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-transitionevent.html#cfn-iotevents-detectormodel-transitionevent-condition","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EventName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-transitionevent.html#cfn-iotevents-detectormodel-transitionevent-eventname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NextState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-detectormodel-transitionevent.html#cfn-iotevents-detectormodel-transitionevent-nextstate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::Input.Attribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-input-attribute.html","Properties":{"JsonPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-input-attribute.html#cfn-iotevents-input-attribute-jsonpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTEvents::Input.InputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-input-inputdefinition.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-input-inputdefinition.html#cfn-iotevents-input-inputdefinition-attributes","DuplicatesAllowed":false,"ItemType":"Attribute","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTFleetWise::Campaign.CollectionScheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-collectionscheme.html","Properties":{"ConditionBasedCollectionScheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-collectionscheme.html#cfn-iotfleetwise-campaign-collectionscheme-conditionbasedcollectionscheme","Required":false,"Type":"ConditionBasedCollectionScheme","UpdateType":"Immutable"},"TimeBasedCollectionScheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-collectionscheme.html#cfn-iotfleetwise-campaign-collectionscheme-timebasedcollectionscheme","Required":false,"Type":"TimeBasedCollectionScheme","UpdateType":"Immutable"}}},"AWS::IoTFleetWise::Campaign.ConditionBasedCollectionScheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-conditionbasedcollectionscheme.html","Properties":{"ConditionLanguageVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-conditionbasedcollectionscheme.html#cfn-iotfleetwise-campaign-conditionbasedcollectionscheme-conditionlanguageversion","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-conditionbasedcollectionscheme.html#cfn-iotfleetwise-campaign-conditionbasedcollectionscheme-expression","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MinimumTriggerIntervalMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-conditionbasedcollectionscheme.html#cfn-iotfleetwise-campaign-conditionbasedcollectionscheme-minimumtriggerintervalms","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"TriggerMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-conditionbasedcollectionscheme.html#cfn-iotfleetwise-campaign-conditionbasedcollectionscheme-triggermode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IoTFleetWise::Campaign.DataDestinationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-datadestinationconfig.html","Properties":{"S3Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-datadestinationconfig.html#cfn-iotfleetwise-campaign-datadestinationconfig-s3config","Required":false,"Type":"S3Config","UpdateType":"Mutable"},"TimestreamConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-datadestinationconfig.html#cfn-iotfleetwise-campaign-datadestinationconfig-timestreamconfig","Required":false,"Type":"TimestreamConfig","UpdateType":"Mutable"}}},"AWS::IoTFleetWise::Campaign.S3Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-s3config.html","Properties":{"BucketArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-s3config.html#cfn-iotfleetwise-campaign-s3config-bucketarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-s3config.html#cfn-iotfleetwise-campaign-s3config-dataformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-s3config.html#cfn-iotfleetwise-campaign-s3config-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StorageCompressionFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-s3config.html#cfn-iotfleetwise-campaign-s3config-storagecompressionformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::Campaign.SignalInformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-signalinformation.html","Properties":{"MaxSampleCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-signalinformation.html#cfn-iotfleetwise-campaign-signalinformation-maxsamplecount","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MinimumSamplingIntervalMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-signalinformation.html#cfn-iotfleetwise-campaign-signalinformation-minimumsamplingintervalms","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-signalinformation.html#cfn-iotfleetwise-campaign-signalinformation-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::Campaign.TimeBasedCollectionScheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-timebasedcollectionscheme.html","Properties":{"PeriodMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-timebasedcollectionscheme.html#cfn-iotfleetwise-campaign-timebasedcollectionscheme-periodms","PrimitiveType":"Double","Required":true,"UpdateType":"Immutable"}}},"AWS::IoTFleetWise::Campaign.TimestreamConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-timestreamconfig.html","Properties":{"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-timestreamconfig.html#cfn-iotfleetwise-campaign-timestreamconfig-executionrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimestreamTableArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-campaign-timestreamconfig.html#cfn-iotfleetwise-campaign-timestreamconfig-timestreamtablearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::DecoderManifest.CanInterface":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-caninterface.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-caninterface.html#cfn-iotfleetwise-decodermanifest-caninterface-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProtocolName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-caninterface.html#cfn-iotfleetwise-decodermanifest-caninterface-protocolname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProtocolVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-caninterface.html#cfn-iotfleetwise-decodermanifest-caninterface-protocolversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::DecoderManifest.CanSignal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-cansignal.html","Properties":{"Factor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-cansignal.html#cfn-iotfleetwise-decodermanifest-cansignal-factor","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IsBigEndian":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-cansignal.html#cfn-iotfleetwise-decodermanifest-cansignal-isbigendian","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IsSigned":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-cansignal.html#cfn-iotfleetwise-decodermanifest-cansignal-issigned","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Length":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-cansignal.html#cfn-iotfleetwise-decodermanifest-cansignal-length","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MessageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-cansignal.html#cfn-iotfleetwise-decodermanifest-cansignal-messageid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-cansignal.html#cfn-iotfleetwise-decodermanifest-cansignal-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Offset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-cansignal.html#cfn-iotfleetwise-decodermanifest-cansignal-offset","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StartBit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-cansignal.html#cfn-iotfleetwise-decodermanifest-cansignal-startbit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::DecoderManifest.NetworkInterfacesItems":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-networkinterfacesitems.html","Properties":{"CanInterface":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-networkinterfacesitems.html#cfn-iotfleetwise-decodermanifest-networkinterfacesitems-caninterface","Required":false,"Type":"CanInterface","UpdateType":"Mutable"},"InterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-networkinterfacesitems.html#cfn-iotfleetwise-decodermanifest-networkinterfacesitems-interfaceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObdInterface":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-networkinterfacesitems.html#cfn-iotfleetwise-decodermanifest-networkinterfacesitems-obdinterface","Required":false,"Type":"ObdInterface","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-networkinterfacesitems.html#cfn-iotfleetwise-decodermanifest-networkinterfacesitems-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::DecoderManifest.ObdInterface":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdinterface.html","Properties":{"DtcRequestIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdinterface.html#cfn-iotfleetwise-decodermanifest-obdinterface-dtcrequestintervalseconds","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HasTransmissionEcu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdinterface.html#cfn-iotfleetwise-decodermanifest-obdinterface-hastransmissionecu","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdinterface.html#cfn-iotfleetwise-decodermanifest-obdinterface-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObdStandard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdinterface.html#cfn-iotfleetwise-decodermanifest-obdinterface-obdstandard","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PidRequestIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdinterface.html#cfn-iotfleetwise-decodermanifest-obdinterface-pidrequestintervalseconds","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RequestMessageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdinterface.html#cfn-iotfleetwise-decodermanifest-obdinterface-requestmessageid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UseExtendedIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdinterface.html#cfn-iotfleetwise-decodermanifest-obdinterface-useextendedids","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::DecoderManifest.ObdSignal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdsignal.html","Properties":{"BitMaskLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdsignal.html#cfn-iotfleetwise-decodermanifest-obdsignal-bitmasklength","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BitRightShift":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdsignal.html#cfn-iotfleetwise-decodermanifest-obdsignal-bitrightshift","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ByteLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdsignal.html#cfn-iotfleetwise-decodermanifest-obdsignal-bytelength","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Offset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdsignal.html#cfn-iotfleetwise-decodermanifest-obdsignal-offset","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Pid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdsignal.html#cfn-iotfleetwise-decodermanifest-obdsignal-pid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PidResponseLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdsignal.html#cfn-iotfleetwise-decodermanifest-obdsignal-pidresponselength","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Scaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdsignal.html#cfn-iotfleetwise-decodermanifest-obdsignal-scaling","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServiceMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdsignal.html#cfn-iotfleetwise-decodermanifest-obdsignal-servicemode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StartByte":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-obdsignal.html#cfn-iotfleetwise-decodermanifest-obdsignal-startbyte","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::DecoderManifest.SignalDecodersItems":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-signaldecodersitems.html","Properties":{"CanSignal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-signaldecodersitems.html#cfn-iotfleetwise-decodermanifest-signaldecodersitems-cansignal","Required":false,"Type":"CanSignal","UpdateType":"Mutable"},"FullyQualifiedName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-signaldecodersitems.html#cfn-iotfleetwise-decodermanifest-signaldecodersitems-fullyqualifiedname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-signaldecodersitems.html#cfn-iotfleetwise-decodermanifest-signaldecodersitems-interfaceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObdSignal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-signaldecodersitems.html#cfn-iotfleetwise-decodermanifest-signaldecodersitems-obdsignal","Required":false,"Type":"ObdSignal","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-decodermanifest-signaldecodersitems.html#cfn-iotfleetwise-decodermanifest-signaldecodersitems-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::SignalCatalog.Actuator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-actuator.html","Properties":{"AllowedValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-actuator.html#cfn-iotfleetwise-signalcatalog-actuator-allowedvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AssignedValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-actuator.html#cfn-iotfleetwise-signalcatalog-actuator-assignedvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-actuator.html#cfn-iotfleetwise-signalcatalog-actuator-datatype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-actuator.html#cfn-iotfleetwise-signalcatalog-actuator-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FullyQualifiedName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-actuator.html#cfn-iotfleetwise-signalcatalog-actuator-fullyqualifiedname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-actuator.html#cfn-iotfleetwise-signalcatalog-actuator-max","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-actuator.html#cfn-iotfleetwise-signalcatalog-actuator-min","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-actuator.html#cfn-iotfleetwise-signalcatalog-actuator-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::SignalCatalog.Attribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-attribute.html","Properties":{"AllowedValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-attribute.html#cfn-iotfleetwise-signalcatalog-attribute-allowedvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AssignedValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-attribute.html#cfn-iotfleetwise-signalcatalog-attribute-assignedvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-attribute.html#cfn-iotfleetwise-signalcatalog-attribute-datatype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-attribute.html#cfn-iotfleetwise-signalcatalog-attribute-defaultvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-attribute.html#cfn-iotfleetwise-signalcatalog-attribute-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FullyQualifiedName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-attribute.html#cfn-iotfleetwise-signalcatalog-attribute-fullyqualifiedname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-attribute.html#cfn-iotfleetwise-signalcatalog-attribute-max","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-attribute.html#cfn-iotfleetwise-signalcatalog-attribute-min","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-attribute.html#cfn-iotfleetwise-signalcatalog-attribute-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::SignalCatalog.Branch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-branch.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-branch.html#cfn-iotfleetwise-signalcatalog-branch-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FullyQualifiedName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-branch.html#cfn-iotfleetwise-signalcatalog-branch-fullyqualifiedname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::SignalCatalog.Node":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-node.html","Properties":{"Actuator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-node.html#cfn-iotfleetwise-signalcatalog-node-actuator","Required":false,"Type":"Actuator","UpdateType":"Mutable"},"Attribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-node.html#cfn-iotfleetwise-signalcatalog-node-attribute","Required":false,"Type":"Attribute","UpdateType":"Mutable"},"Branch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-node.html#cfn-iotfleetwise-signalcatalog-node-branch","Required":false,"Type":"Branch","UpdateType":"Mutable"},"Sensor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-node.html#cfn-iotfleetwise-signalcatalog-node-sensor","Required":false,"Type":"Sensor","UpdateType":"Mutable"}}},"AWS::IoTFleetWise::SignalCatalog.NodeCounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-nodecounts.html","Properties":{"TotalActuators":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-nodecounts.html#cfn-iotfleetwise-signalcatalog-nodecounts-totalactuators","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TotalAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-nodecounts.html#cfn-iotfleetwise-signalcatalog-nodecounts-totalattributes","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TotalBranches":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-nodecounts.html#cfn-iotfleetwise-signalcatalog-nodecounts-totalbranches","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TotalNodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-nodecounts.html#cfn-iotfleetwise-signalcatalog-nodecounts-totalnodes","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TotalSensors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-nodecounts.html#cfn-iotfleetwise-signalcatalog-nodecounts-totalsensors","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTFleetWise::SignalCatalog.Sensor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-sensor.html","Properties":{"AllowedValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-sensor.html#cfn-iotfleetwise-signalcatalog-sensor-allowedvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-sensor.html#cfn-iotfleetwise-signalcatalog-sensor-datatype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-sensor.html#cfn-iotfleetwise-signalcatalog-sensor-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FullyQualifiedName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-sensor.html#cfn-iotfleetwise-signalcatalog-sensor-fullyqualifiedname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-sensor.html#cfn-iotfleetwise-signalcatalog-sensor-max","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-sensor.html#cfn-iotfleetwise-signalcatalog-sensor-min","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotfleetwise-signalcatalog-sensor.html#cfn-iotfleetwise-signalcatalog-sensor-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AccessPolicy.AccessPolicyIdentity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-accesspolicyidentity.html","Properties":{"IamRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-accesspolicyidentity.html#cfn-iotsitewise-accesspolicy-accesspolicyidentity-iamrole","Required":false,"Type":"IamRole","UpdateType":"Mutable"},"IamUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-accesspolicyidentity.html#cfn-iotsitewise-accesspolicy-accesspolicyidentity-iamuser","Required":false,"Type":"IamUser","UpdateType":"Mutable"},"User":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-accesspolicyidentity.html#cfn-iotsitewise-accesspolicy-accesspolicyidentity-user","Required":false,"Type":"User","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AccessPolicy.AccessPolicyResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-accesspolicyresource.html","Properties":{"Portal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-accesspolicyresource.html#cfn-iotsitewise-accesspolicy-accesspolicyresource-portal","Required":false,"Type":"Portal","UpdateType":"Mutable"},"Project":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-accesspolicyresource.html#cfn-iotsitewise-accesspolicy-accesspolicyresource-project","Required":false,"Type":"Project","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AccessPolicy.IamRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-iamrole.html","Properties":{"arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-iamrole.html#cfn-iotsitewise-accesspolicy-iamrole-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AccessPolicy.IamUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-iamuser.html","Properties":{"arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-iamuser.html#cfn-iotsitewise-accesspolicy-iamuser-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AccessPolicy.Portal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-portal.html","Properties":{"id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-portal.html#cfn-iotsitewise-accesspolicy-portal-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AccessPolicy.Project":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-project.html","Properties":{"id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-project.html#cfn-iotsitewise-accesspolicy-project-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AccessPolicy.User":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-user.html","Properties":{"id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-accesspolicy-user.html#cfn-iotsitewise-accesspolicy-user-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::Asset.AssetHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assethierarchy.html","Properties":{"ChildAssetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assethierarchy.html#cfn-iotsitewise-asset-assethierarchy-childassetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogicalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assethierarchy.html#cfn-iotsitewise-asset-assethierarchy-logicalid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::Asset.AssetProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assetproperty.html","Properties":{"Alias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assetproperty.html#cfn-iotsitewise-asset-assetproperty-alias","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogicalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assetproperty.html#cfn-iotsitewise-asset-assetproperty-logicalid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NotificationState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assetproperty.html#cfn-iotsitewise-asset-assetproperty-notificationstate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-asset-assetproperty.html#cfn-iotsitewise-asset-assetproperty-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel.AssetModelCompositeModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelcompositemodel.html","Properties":{"CompositeModelProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelcompositemodel.html#cfn-iotsitewise-assetmodel-assetmodelcompositemodel-compositemodelproperties","DuplicatesAllowed":true,"ItemType":"AssetModelProperty","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelcompositemodel.html#cfn-iotsitewise-assetmodel-assetmodelcompositemodel-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelcompositemodel.html#cfn-iotsitewise-assetmodel-assetmodelcompositemodel-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelcompositemodel.html#cfn-iotsitewise-assetmodel-assetmodelcompositemodel-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel.AssetModelHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelhierarchy.html","Properties":{"ChildAssetModelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelhierarchy.html#cfn-iotsitewise-assetmodel-assetmodelhierarchy-childassetmodelid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogicalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelhierarchy.html#cfn-iotsitewise-assetmodel-assetmodelhierarchy-logicalid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelhierarchy.html#cfn-iotsitewise-assetmodel-assetmodelhierarchy-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel.AssetModelProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html","Properties":{"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html#cfn-iotsitewise-assetmodel-assetmodelproperty-datatype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataTypeSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html#cfn-iotsitewise-assetmodel-assetmodelproperty-datatypespec","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogicalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html#cfn-iotsitewise-assetmodel-assetmodelproperty-logicalid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html#cfn-iotsitewise-assetmodel-assetmodelproperty-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html#cfn-iotsitewise-assetmodel-assetmodelproperty-type","Required":true,"Type":"PropertyType","UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-assetmodelproperty.html#cfn-iotsitewise-assetmodel-assetmodelproperty-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel.Attribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-attribute.html","Properties":{"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-attribute.html#cfn-iotsitewise-assetmodel-attribute-defaultvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel.ExpressionVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-expressionvariable.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-expressionvariable.html#cfn-iotsitewise-assetmodel-expressionvariable-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-expressionvariable.html#cfn-iotsitewise-assetmodel-expressionvariable-value","Required":true,"Type":"VariableValue","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel.Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metric.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metric.html#cfn-iotsitewise-assetmodel-metric-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Variables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metric.html#cfn-iotsitewise-assetmodel-metric-variables","DuplicatesAllowed":true,"ItemType":"ExpressionVariable","Required":true,"Type":"List","UpdateType":"Mutable"},"Window":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metric.html#cfn-iotsitewise-assetmodel-metric-window","Required":true,"Type":"MetricWindow","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel.MetricWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metricwindow.html","Properties":{"Tumbling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-metricwindow.html#cfn-iotsitewise-assetmodel-metricwindow-tumbling","Required":false,"Type":"TumblingWindow","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel.PropertyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-propertytype.html","Properties":{"Attribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-propertytype.html#cfn-iotsitewise-assetmodel-propertytype-attribute","Required":false,"Type":"Attribute","UpdateType":"Mutable"},"Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-propertytype.html#cfn-iotsitewise-assetmodel-propertytype-metric","Required":false,"Type":"Metric","UpdateType":"Mutable"},"Transform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-propertytype.html#cfn-iotsitewise-assetmodel-propertytype-transform","Required":false,"Type":"Transform","UpdateType":"Mutable"},"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-propertytype.html#cfn-iotsitewise-assetmodel-propertytype-typename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel.Transform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-transform.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-transform.html#cfn-iotsitewise-assetmodel-transform-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Variables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-transform.html#cfn-iotsitewise-assetmodel-transform-variables","DuplicatesAllowed":true,"ItemType":"ExpressionVariable","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel.TumblingWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-tumblingwindow.html","Properties":{"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-tumblingwindow.html#cfn-iotsitewise-assetmodel-tumblingwindow-interval","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Offset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-tumblingwindow.html#cfn-iotsitewise-assetmodel-tumblingwindow-offset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel.VariableValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-variablevalue.html","Properties":{"HierarchyLogicalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-variablevalue.html#cfn-iotsitewise-assetmodel-variablevalue-hierarchylogicalid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyLogicalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-variablevalue.html#cfn-iotsitewise-assetmodel-variablevalue-propertylogicalid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::Gateway.GatewayCapabilitySummary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewaycapabilitysummary.html","Properties":{"CapabilityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewaycapabilitysummary.html#cfn-iotsitewise-gateway-gatewaycapabilitysummary-capabilityconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CapabilityNamespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewaycapabilitysummary.html#cfn-iotsitewise-gateway-gatewaycapabilitysummary-capabilitynamespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTSiteWise::Gateway.GatewayPlatform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewayplatform.html","Properties":{"Greengrass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewayplatform.html#cfn-iotsitewise-gateway-gatewayplatform-greengrass","Required":false,"Type":"Greengrass","UpdateType":"Immutable"},"GreengrassV2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewayplatform.html#cfn-iotsitewise-gateway-gatewayplatform-greengrassv2","Required":false,"Type":"GreengrassV2","UpdateType":"Immutable"}}},"AWS::IoTSiteWise::Gateway.Greengrass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-greengrass.html","Properties":{"GroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-greengrass.html#cfn-iotsitewise-gateway-greengrass-grouparn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoTSiteWise::Gateway.GreengrassV2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-greengrassv2.html","Properties":{"CoreDeviceThingName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-greengrassv2.html#cfn-iotsitewise-gateway-greengrassv2-coredevicethingname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoTSiteWise::Portal.Alarms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-portal-alarms.html","Properties":{"AlarmRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-portal-alarms.html#cfn-iotsitewise-portal-alarms-alarmrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NotificationLambdaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-portal-alarms.html#cfn-iotsitewise-portal-alarms-notificationlambdaarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTThingsGraph::FlowTemplate.DefinitionDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotthingsgraph-flowtemplate-definitiondocument.html","Properties":{"Language":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotthingsgraph-flowtemplate-definitiondocument.html#cfn-iotthingsgraph-flowtemplate-definitiondocument-language","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Text":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotthingsgraph-flowtemplate-definitiondocument.html#cfn-iotthingsgraph-flowtemplate-definitiondocument-text","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType.DataConnector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-dataconnector.html","Properties":{"IsNative":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-dataconnector.html#cfn-iottwinmaker-componenttype-dataconnector-isnative","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Lambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-dataconnector.html#cfn-iottwinmaker-componenttype-dataconnector-lambda","Required":false,"Type":"LambdaFunction","UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType.DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datatype.html","Properties":{"AllowedValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datatype.html#cfn-iottwinmaker-componenttype-datatype-allowedvalues","DuplicatesAllowed":true,"ItemType":"DataValue","Required":false,"Type":"List","UpdateType":"Mutable"},"NestedType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datatype.html#cfn-iottwinmaker-componenttype-datatype-nestedtype","Required":false,"Type":"DataType","UpdateType":"Mutable"},"Relationship":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datatype.html#cfn-iottwinmaker-componenttype-datatype-relationship","Required":false,"Type":"Relationship","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datatype.html#cfn-iottwinmaker-componenttype-datatype-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UnitOfMeasure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datatype.html#cfn-iottwinmaker-componenttype-datatype-unitofmeasure","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType.DataValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datavalue.html","Properties":{"BooleanValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datavalue.html#cfn-iottwinmaker-componenttype-datavalue-booleanvalue","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DoubleValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datavalue.html#cfn-iottwinmaker-componenttype-datavalue-doublevalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datavalue.html#cfn-iottwinmaker-componenttype-datavalue-expression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegerValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datavalue.html#cfn-iottwinmaker-componenttype-datavalue-integervalue","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ListValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datavalue.html#cfn-iottwinmaker-componenttype-datavalue-listvalue","DuplicatesAllowed":true,"ItemType":"DataValue","Required":false,"Type":"List","UpdateType":"Mutable"},"LongValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datavalue.html#cfn-iottwinmaker-componenttype-datavalue-longvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MapValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datavalue.html#cfn-iottwinmaker-componenttype-datavalue-mapvalue","ItemType":"DataValue","Required":false,"Type":"Map","UpdateType":"Mutable"},"RelationshipValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datavalue.html#cfn-iottwinmaker-componenttype-datavalue-relationshipvalue","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"StringValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-datavalue.html#cfn-iottwinmaker-componenttype-datavalue-stringvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType.Error":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-error.html","Properties":{"Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-error.html#cfn-iottwinmaker-componenttype-error-code","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-error.html#cfn-iottwinmaker-componenttype-error-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType.Function":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-function.html","Properties":{"ImplementedBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-function.html#cfn-iottwinmaker-componenttype-function-implementedby","Required":false,"Type":"DataConnector","UpdateType":"Mutable"},"RequiredProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-function.html#cfn-iottwinmaker-componenttype-function-requiredproperties","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-function.html#cfn-iottwinmaker-componenttype-function-scope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType.LambdaFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-lambdafunction.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-lambdafunction.html#cfn-iottwinmaker-componenttype-lambdafunction-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType.PropertyDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-propertydefinition.html","Properties":{"Configurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-propertydefinition.html#cfn-iottwinmaker-componenttype-propertydefinition-configurations","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-propertydefinition.html#cfn-iottwinmaker-componenttype-propertydefinition-datatype","Required":false,"Type":"DataType","UpdateType":"Mutable"},"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-propertydefinition.html#cfn-iottwinmaker-componenttype-propertydefinition-defaultvalue","Required":false,"Type":"DataValue","UpdateType":"Mutable"},"IsExternalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-propertydefinition.html#cfn-iottwinmaker-componenttype-propertydefinition-isexternalid","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsRequiredInEntity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-propertydefinition.html#cfn-iottwinmaker-componenttype-propertydefinition-isrequiredinentity","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsStoredExternally":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-propertydefinition.html#cfn-iottwinmaker-componenttype-propertydefinition-isstoredexternally","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsTimeSeries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-propertydefinition.html#cfn-iottwinmaker-componenttype-propertydefinition-istimeseries","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType.PropertyGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-propertygroup.html","Properties":{"GroupType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-propertygroup.html#cfn-iottwinmaker-componenttype-propertygroup-grouptype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-propertygroup.html#cfn-iottwinmaker-componenttype-propertygroup-propertynames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType.Relationship":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-relationship.html","Properties":{"RelationshipType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-relationship.html#cfn-iottwinmaker-componenttype-relationship-relationshiptype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetComponentTypeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-relationship.html#cfn-iottwinmaker-componenttype-relationship-targetcomponenttypeid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType.RelationshipValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-relationshipvalue.html","Properties":{"TargetComponentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-relationshipvalue.html#cfn-iottwinmaker-componenttype-relationshipvalue-targetcomponentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetEntityId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-relationshipvalue.html#cfn-iottwinmaker-componenttype-relationshipvalue-targetentityid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType.Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-status.html","Properties":{"Error":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-status.html#cfn-iottwinmaker-componenttype-status-error","Required":false,"Type":"Error","UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-componenttype-status.html#cfn-iottwinmaker-componenttype-status-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::Entity.Component":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-component.html","Properties":{"ComponentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-component.html#cfn-iottwinmaker-entity-component-componentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ComponentTypeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-component.html#cfn-iottwinmaker-entity-component-componenttypeid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefinedIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-component.html#cfn-iottwinmaker-entity-component-definedin","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-component.html#cfn-iottwinmaker-entity-component-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Properties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-component.html#cfn-iottwinmaker-entity-component-properties","ItemType":"Property","Required":false,"Type":"Map","UpdateType":"Mutable"},"PropertyGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-component.html#cfn-iottwinmaker-entity-component-propertygroups","ItemType":"PropertyGroup","Required":false,"Type":"Map","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-component.html#cfn-iottwinmaker-entity-component-status","Required":false,"Type":"Status","UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::Entity.DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datatype.html","Properties":{"AllowedValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datatype.html#cfn-iottwinmaker-entity-datatype-allowedvalues","DuplicatesAllowed":true,"ItemType":"DataValue","Required":false,"Type":"List","UpdateType":"Mutable"},"NestedType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datatype.html#cfn-iottwinmaker-entity-datatype-nestedtype","Required":false,"Type":"DataType","UpdateType":"Mutable"},"Relationship":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datatype.html#cfn-iottwinmaker-entity-datatype-relationship","Required":false,"Type":"Relationship","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datatype.html#cfn-iottwinmaker-entity-datatype-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UnitOfMeasure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datatype.html#cfn-iottwinmaker-entity-datatype-unitofmeasure","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::Entity.DataValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datavalue.html","Properties":{"BooleanValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datavalue.html#cfn-iottwinmaker-entity-datavalue-booleanvalue","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DoubleValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datavalue.html#cfn-iottwinmaker-entity-datavalue-doublevalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datavalue.html#cfn-iottwinmaker-entity-datavalue-expression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegerValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datavalue.html#cfn-iottwinmaker-entity-datavalue-integervalue","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ListValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datavalue.html#cfn-iottwinmaker-entity-datavalue-listvalue","DuplicatesAllowed":true,"ItemType":"DataValue","Required":false,"Type":"List","UpdateType":"Mutable"},"LongValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datavalue.html#cfn-iottwinmaker-entity-datavalue-longvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MapValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datavalue.html#cfn-iottwinmaker-entity-datavalue-mapvalue","ItemType":"DataValue","Required":false,"Type":"Map","UpdateType":"Mutable"},"RelationshipValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datavalue.html#cfn-iottwinmaker-entity-datavalue-relationshipvalue","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"StringValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-datavalue.html#cfn-iottwinmaker-entity-datavalue-stringvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::Entity.Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-definition.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-definition.html#cfn-iottwinmaker-entity-definition-configuration","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-definition.html#cfn-iottwinmaker-entity-definition-datatype","Required":false,"Type":"DataType","UpdateType":"Mutable"},"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-definition.html#cfn-iottwinmaker-entity-definition-defaultvalue","Required":false,"Type":"DataValue","UpdateType":"Mutable"},"IsExternalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-definition.html#cfn-iottwinmaker-entity-definition-isexternalid","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsFinal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-definition.html#cfn-iottwinmaker-entity-definition-isfinal","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsImported":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-definition.html#cfn-iottwinmaker-entity-definition-isimported","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsInherited":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-definition.html#cfn-iottwinmaker-entity-definition-isinherited","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsRequiredInEntity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-definition.html#cfn-iottwinmaker-entity-definition-isrequiredinentity","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsStoredExternally":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-definition.html#cfn-iottwinmaker-entity-definition-isstoredexternally","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsTimeSeries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-definition.html#cfn-iottwinmaker-entity-definition-istimeseries","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::Entity.Error":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-error.html","Properties":{"Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-error.html#cfn-iottwinmaker-entity-error-code","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-error.html#cfn-iottwinmaker-entity-error-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::Entity.Property":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-property.html","Properties":{"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-property.html#cfn-iottwinmaker-entity-property-definition","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-property.html#cfn-iottwinmaker-entity-property-value","Required":false,"Type":"DataValue","UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::Entity.PropertyGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-propertygroup.html","Properties":{"GroupType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-propertygroup.html#cfn-iottwinmaker-entity-propertygroup-grouptype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-propertygroup.html#cfn-iottwinmaker-entity-propertygroup-propertynames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::Entity.Relationship":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-relationship.html","Properties":{"RelationshipType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-relationship.html#cfn-iottwinmaker-entity-relationship-relationshiptype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetComponentTypeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-relationship.html#cfn-iottwinmaker-entity-relationship-targetcomponenttypeid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::Entity.RelationshipValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-relationshipvalue.html","Properties":{"TargetComponentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-relationshipvalue.html#cfn-iottwinmaker-entity-relationshipvalue-targetcomponentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetEntityId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-relationshipvalue.html#cfn-iottwinmaker-entity-relationshipvalue-targetentityid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::Entity.Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-status.html","Properties":{"Error":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-status.html#cfn-iottwinmaker-entity-status-error","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iottwinmaker-entity-status.html#cfn-iottwinmaker-entity-status-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTWireless::DeviceProfile.LoRaWANDeviceProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html","Properties":{"ClassBTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-classbtimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ClassCTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-classctimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FactoryPresetFreqsList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-factorypresetfreqslist","DuplicatesAllowed":true,"PrimitiveItemType":"Integer","Required":false,"Type":"List","UpdateType":"Mutable"},"MacVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-macversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxDutyCycle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-maxdutycycle","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxEirp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-maxeirp","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PingSlotDr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-pingslotdr","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PingSlotFreq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-pingslotfreq","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PingSlotPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-pingslotperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RegParamsRevision":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-regparamsrevision","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RfRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-rfregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RxDataRate2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-rxdatarate2","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RxDelay1":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-rxdelay1","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RxDrOffset1":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-rxdroffset1","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RxFreq2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-rxfreq2","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Supports32BitFCnt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-supports32bitfcnt","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SupportsClassB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-supportsclassb","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SupportsClassC":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-supportsclassc","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SupportsJoin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-deviceprofile-lorawandeviceprofile.html#cfn-iotwireless-deviceprofile-lorawandeviceprofile-supportsjoin","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTWireless::FuotaTask.LoRaWAN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-fuotatask-lorawan.html","Properties":{"RfRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-fuotatask-lorawan.html#cfn-iotwireless-fuotatask-lorawan-rfregion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-fuotatask-lorawan.html#cfn-iotwireless-fuotatask-lorawan-starttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTWireless::MulticastGroup.LoRaWAN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-multicastgroup-lorawan.html","Properties":{"DlClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-multicastgroup-lorawan.html#cfn-iotwireless-multicastgroup-lorawan-dlclass","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NumberOfDevicesInGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-multicastgroup-lorawan.html#cfn-iotwireless-multicastgroup-lorawan-numberofdevicesingroup","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NumberOfDevicesRequested":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-multicastgroup-lorawan.html#cfn-iotwireless-multicastgroup-lorawan-numberofdevicesrequested","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RfRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-multicastgroup-lorawan.html#cfn-iotwireless-multicastgroup-lorawan-rfregion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTWireless::NetworkAnalyzerConfiguration.TraceContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-networkanalyzerconfiguration-tracecontent.html","Properties":{"LogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-networkanalyzerconfiguration-tracecontent.html#cfn-iotwireless-networkanalyzerconfiguration-tracecontent-loglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WirelessDeviceFrameInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-networkanalyzerconfiguration-tracecontent.html#cfn-iotwireless-networkanalyzerconfiguration-tracecontent-wirelessdeviceframeinfo","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTWireless::PartnerAccount.SidewalkAccountInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-partneraccount-sidewalkaccountinfo.html","Properties":{"AppServerPrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-partneraccount-sidewalkaccountinfo.html#cfn-iotwireless-partneraccount-sidewalkaccountinfo-appserverprivatekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTWireless::PartnerAccount.SidewalkAccountInfoWithFingerprint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-partneraccount-sidewalkaccountinfowithfingerprint.html","Properties":{"AmazonId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-partneraccount-sidewalkaccountinfowithfingerprint.html#cfn-iotwireless-partneraccount-sidewalkaccountinfowithfingerprint-amazonid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-partneraccount-sidewalkaccountinfowithfingerprint.html#cfn-iotwireless-partneraccount-sidewalkaccountinfowithfingerprint-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Fingerprint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-partneraccount-sidewalkaccountinfowithfingerprint.html#cfn-iotwireless-partneraccount-sidewalkaccountinfowithfingerprint-fingerprint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTWireless::PartnerAccount.SidewalkUpdateAccount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-partneraccount-sidewalkupdateaccount.html","Properties":{"AppServerPrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-partneraccount-sidewalkupdateaccount.html#cfn-iotwireless-partneraccount-sidewalkupdateaccount-appserverprivatekey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTWireless::ServiceProfile.LoRaWANServiceProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html","Properties":{"AddGwMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-addgwmetadata","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ChannelMask":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-channelmask","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DevStatusReqFreq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-devstatusreqfreq","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DlBucketSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-dlbucketsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DlRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-dlrate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DlRatePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-dlratepolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DrMax":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-drmax","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DrMin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-drmin","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HrAllowed":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-hrallowed","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MinGwDiversity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-mingwdiversity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NwkGeoLoc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-nwkgeoloc","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PrAllowed":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-prallowed","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RaAllowed":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-raallowed","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ReportDevStatusBattery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-reportdevstatusbattery","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ReportDevStatusMargin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-reportdevstatusmargin","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TargetPer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-targetper","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UlBucketSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-ulbucketsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UlRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-ulrate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UlRatePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-serviceprofile-lorawanserviceprofile.html#cfn-iotwireless-serviceprofile-lorawanserviceprofile-ulratepolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTWireless::TaskDefinition.LoRaWANGatewayVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawangatewayversion.html","Properties":{"Model":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawangatewayversion.html#cfn-iotwireless-taskdefinition-lorawangatewayversion-model","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PackageVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawangatewayversion.html#cfn-iotwireless-taskdefinition-lorawangatewayversion-packageversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Station":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawangatewayversion.html#cfn-iotwireless-taskdefinition-lorawangatewayversion-station","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTWireless::TaskDefinition.LoRaWANUpdateGatewayTaskCreate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawanupdategatewaytaskcreate.html","Properties":{"CurrentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawanupdategatewaytaskcreate.html#cfn-iotwireless-taskdefinition-lorawanupdategatewaytaskcreate-currentversion","Required":false,"Type":"LoRaWANGatewayVersion","UpdateType":"Mutable"},"SigKeyCrc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawanupdategatewaytaskcreate.html#cfn-iotwireless-taskdefinition-lorawanupdategatewaytaskcreate-sigkeycrc","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UpdateSignature":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawanupdategatewaytaskcreate.html#cfn-iotwireless-taskdefinition-lorawanupdategatewaytaskcreate-updatesignature","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UpdateVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawanupdategatewaytaskcreate.html#cfn-iotwireless-taskdefinition-lorawanupdategatewaytaskcreate-updateversion","Required":false,"Type":"LoRaWANGatewayVersion","UpdateType":"Mutable"}}},"AWS::IoTWireless::TaskDefinition.LoRaWANUpdateGatewayTaskEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawanupdategatewaytaskentry.html","Properties":{"CurrentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawanupdategatewaytaskentry.html#cfn-iotwireless-taskdefinition-lorawanupdategatewaytaskentry-currentversion","Required":false,"Type":"LoRaWANGatewayVersion","UpdateType":"Mutable"},"UpdateVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-lorawanupdategatewaytaskentry.html#cfn-iotwireless-taskdefinition-lorawanupdategatewaytaskentry-updateversion","Required":false,"Type":"LoRaWANGatewayVersion","UpdateType":"Mutable"}}},"AWS::IoTWireless::TaskDefinition.UpdateWirelessGatewayTaskCreate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-updatewirelessgatewaytaskcreate.html","Properties":{"LoRaWAN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-updatewirelessgatewaytaskcreate.html#cfn-iotwireless-taskdefinition-updatewirelessgatewaytaskcreate-lorawan","Required":false,"Type":"LoRaWANUpdateGatewayTaskCreate","UpdateType":"Mutable"},"UpdateDataRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-updatewirelessgatewaytaskcreate.html#cfn-iotwireless-taskdefinition-updatewirelessgatewaytaskcreate-updatedatarole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UpdateDataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-taskdefinition-updatewirelessgatewaytaskcreate.html#cfn-iotwireless-taskdefinition-updatewirelessgatewaytaskcreate-updatedatasource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessDevice.AbpV10x":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-abpv10x.html","Properties":{"DevAddr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-abpv10x.html#cfn-iotwireless-wirelessdevice-abpv10x-devaddr","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SessionKeys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-abpv10x.html#cfn-iotwireless-wirelessdevice-abpv10x-sessionkeys","Required":true,"Type":"SessionKeysAbpV10x","UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessDevice.AbpV11":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-abpv11.html","Properties":{"DevAddr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-abpv11.html#cfn-iotwireless-wirelessdevice-abpv11-devaddr","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SessionKeys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-abpv11.html#cfn-iotwireless-wirelessdevice-abpv11-sessionkeys","Required":true,"Type":"SessionKeysAbpV11","UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessDevice.LoRaWANDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-lorawandevice.html","Properties":{"AbpV10x":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-lorawandevice.html#cfn-iotwireless-wirelessdevice-lorawandevice-abpv10x","Required":false,"Type":"AbpV10x","UpdateType":"Mutable"},"AbpV11":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-lorawandevice.html#cfn-iotwireless-wirelessdevice-lorawandevice-abpv11","Required":false,"Type":"AbpV11","UpdateType":"Mutable"},"DevEui":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-lorawandevice.html#cfn-iotwireless-wirelessdevice-lorawandevice-deveui","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceProfileId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-lorawandevice.html#cfn-iotwireless-wirelessdevice-lorawandevice-deviceprofileid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OtaaV10x":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-lorawandevice.html#cfn-iotwireless-wirelessdevice-lorawandevice-otaav10x","Required":false,"Type":"OtaaV10x","UpdateType":"Mutable"},"OtaaV11":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-lorawandevice.html#cfn-iotwireless-wirelessdevice-lorawandevice-otaav11","Required":false,"Type":"OtaaV11","UpdateType":"Mutable"},"ServiceProfileId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-lorawandevice.html#cfn-iotwireless-wirelessdevice-lorawandevice-serviceprofileid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessDevice.OtaaV10x":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-otaav10x.html","Properties":{"AppEui":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-otaav10x.html#cfn-iotwireless-wirelessdevice-otaav10x-appeui","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AppKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-otaav10x.html#cfn-iotwireless-wirelessdevice-otaav10x-appkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessDevice.OtaaV11":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-otaav11.html","Properties":{"AppKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-otaav11.html#cfn-iotwireless-wirelessdevice-otaav11-appkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"JoinEui":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-otaav11.html#cfn-iotwireless-wirelessdevice-otaav11-joineui","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NwkKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-otaav11.html#cfn-iotwireless-wirelessdevice-otaav11-nwkkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessDevice.SessionKeysAbpV10x":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-sessionkeysabpv10x.html","Properties":{"AppSKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-sessionkeysabpv10x.html#cfn-iotwireless-wirelessdevice-sessionkeysabpv10x-appskey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NwkSKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-sessionkeysabpv10x.html#cfn-iotwireless-wirelessdevice-sessionkeysabpv10x-nwkskey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessDevice.SessionKeysAbpV11":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-sessionkeysabpv11.html","Properties":{"AppSKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-sessionkeysabpv11.html#cfn-iotwireless-wirelessdevice-sessionkeysabpv11-appskey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FNwkSIntKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-sessionkeysabpv11.html#cfn-iotwireless-wirelessdevice-sessionkeysabpv11-fnwksintkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NwkSEncKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-sessionkeysabpv11.html#cfn-iotwireless-wirelessdevice-sessionkeysabpv11-nwksenckey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SNwkSIntKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdevice-sessionkeysabpv11.html#cfn-iotwireless-wirelessdevice-sessionkeysabpv11-snwksintkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessDeviceImportTask.Sidewalk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdeviceimporttask-sidewalk.html","Properties":{"DeviceCreationFile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdeviceimporttask-sidewalk.html#cfn-iotwireless-wirelessdeviceimporttask-sidewalk-devicecreationfile","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceCreationFileList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdeviceimporttask-sidewalk.html#cfn-iotwireless-wirelessdeviceimporttask-sidewalk-devicecreationfilelist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdeviceimporttask-sidewalk.html#cfn-iotwireless-wirelessdeviceimporttask-sidewalk-role","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SidewalkManufacturingSn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessdeviceimporttask-sidewalk.html#cfn-iotwireless-wirelessdeviceimporttask-sidewalk-sidewalkmanufacturingsn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessGateway.LoRaWANGateway":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessgateway-lorawangateway.html","Properties":{"GatewayEui":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessgateway-lorawangateway.html#cfn-iotwireless-wirelessgateway-lorawangateway-gatewayeui","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RfRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-wirelessgateway-lorawangateway.html#cfn-iotwireless-wirelessgateway-lorawangateway-rfregion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KafkaConnect::Connector.ApacheKafkaCluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-apachekafkacluster.html","Properties":{"BootstrapServers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-apachekafkacluster.html#cfn-kafkaconnect-connector-apachekafkacluster-bootstrapservers","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Vpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-apachekafkacluster.html#cfn-kafkaconnect-connector-apachekafkacluster-vpc","Required":true,"Type":"Vpc","UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.AutoScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html","Properties":{"MaxWorkerCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html#cfn-kafkaconnect-connector-autoscaling-maxworkercount","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"McuCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html#cfn-kafkaconnect-connector-autoscaling-mcucount","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MinWorkerCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html#cfn-kafkaconnect-connector-autoscaling-minworkercount","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ScaleInPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html#cfn-kafkaconnect-connector-autoscaling-scaleinpolicy","Required":true,"Type":"ScaleInPolicy","UpdateType":"Mutable"},"ScaleOutPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html#cfn-kafkaconnect-connector-autoscaling-scaleoutpolicy","Required":true,"Type":"ScaleOutPolicy","UpdateType":"Mutable"}}},"AWS::KafkaConnect::Connector.Capacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-capacity.html","Properties":{"AutoScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-capacity.html#cfn-kafkaconnect-connector-capacity-autoscaling","Required":false,"Type":"AutoScaling","UpdateType":"Mutable"},"ProvisionedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-capacity.html#cfn-kafkaconnect-connector-capacity-provisionedcapacity","Required":false,"Type":"ProvisionedCapacity","UpdateType":"Mutable"}}},"AWS::KafkaConnect::Connector.CloudWatchLogsLogDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-cloudwatchlogslogdelivery.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-cloudwatchlogslogdelivery.html#cfn-kafkaconnect-connector-cloudwatchlogslogdelivery-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"LogGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-cloudwatchlogslogdelivery.html#cfn-kafkaconnect-connector-cloudwatchlogslogdelivery-loggroup","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.CustomPlugin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-customplugin.html","Properties":{"CustomPluginArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-customplugin.html#cfn-kafkaconnect-connector-customplugin-custompluginarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Revision":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-customplugin.html#cfn-kafkaconnect-connector-customplugin-revision","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.FirehoseLogDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-firehoselogdelivery.html","Properties":{"DeliveryStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-firehoselogdelivery.html#cfn-kafkaconnect-connector-firehoselogdelivery-deliverystream","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-firehoselogdelivery.html#cfn-kafkaconnect-connector-firehoselogdelivery-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.KafkaCluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkacluster.html","Properties":{"ApacheKafkaCluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkacluster.html#cfn-kafkaconnect-connector-kafkacluster-apachekafkacluster","Required":true,"Type":"ApacheKafkaCluster","UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.KafkaClusterClientAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkaclusterclientauthentication.html","Properties":{"AuthenticationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkaclusterclientauthentication.html#cfn-kafkaconnect-connector-kafkaclusterclientauthentication-authenticationtype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.KafkaClusterEncryptionInTransit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkaclusterencryptionintransit.html","Properties":{"EncryptionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkaclusterencryptionintransit.html#cfn-kafkaconnect-connector-kafkaclusterencryptionintransit-encryptiontype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.LogDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-logdelivery.html","Properties":{"WorkerLogDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-logdelivery.html#cfn-kafkaconnect-connector-logdelivery-workerlogdelivery","Required":true,"Type":"WorkerLogDelivery","UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.Plugin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-plugin.html","Properties":{"CustomPlugin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-plugin.html#cfn-kafkaconnect-connector-plugin-customplugin","Required":true,"Type":"CustomPlugin","UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.ProvisionedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-provisionedcapacity.html","Properties":{"McuCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-provisionedcapacity.html#cfn-kafkaconnect-connector-provisionedcapacity-mcucount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"WorkerCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-provisionedcapacity.html#cfn-kafkaconnect-connector-provisionedcapacity-workercount","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::KafkaConnect::Connector.S3LogDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-s3logdelivery.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-s3logdelivery.html#cfn-kafkaconnect-connector-s3logdelivery-bucket","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-s3logdelivery.html#cfn-kafkaconnect-connector-s3logdelivery-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-s3logdelivery.html#cfn-kafkaconnect-connector-s3logdelivery-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.ScaleInPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-scaleinpolicy.html","Properties":{"CpuUtilizationPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-scaleinpolicy.html#cfn-kafkaconnect-connector-scaleinpolicy-cpuutilizationpercentage","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::KafkaConnect::Connector.ScaleOutPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-scaleoutpolicy.html","Properties":{"CpuUtilizationPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-scaleoutpolicy.html#cfn-kafkaconnect-connector-scaleoutpolicy-cpuutilizationpercentage","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::KafkaConnect::Connector.Vpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-vpc.html","Properties":{"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-vpc.html#cfn-kafkaconnect-connector-vpc-securitygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-vpc.html#cfn-kafkaconnect-connector-vpc-subnets","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.WorkerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerconfiguration.html","Properties":{"Revision":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerconfiguration.html#cfn-kafkaconnect-connector-workerconfiguration-revision","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"WorkerConfigurationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerconfiguration.html#cfn-kafkaconnect-connector-workerconfiguration-workerconfigurationarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::KafkaConnect::Connector.WorkerLogDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerlogdelivery.html","Properties":{"CloudWatchLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerlogdelivery.html#cfn-kafkaconnect-connector-workerlogdelivery-cloudwatchlogs","Required":false,"Type":"CloudWatchLogsLogDelivery","UpdateType":"Immutable"},"Firehose":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerlogdelivery.html#cfn-kafkaconnect-connector-workerlogdelivery-firehose","Required":false,"Type":"FirehoseLogDelivery","UpdateType":"Immutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerlogdelivery.html#cfn-kafkaconnect-connector-workerlogdelivery-s3","Required":false,"Type":"S3LogDelivery","UpdateType":"Immutable"}}},"AWS::Kendra::DataSource.AccessControlListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-accesscontrollistconfiguration.html","Properties":{"KeyPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-accesscontrollistconfiguration.html#cfn-kendra-datasource-accesscontrollistconfiguration-keypath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.AclConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-aclconfiguration.html","Properties":{"AllowedGroupsColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-aclconfiguration.html#cfn-kendra-datasource-aclconfiguration-allowedgroupscolumnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ColumnConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html","Properties":{"ChangeDetectingColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html#cfn-kendra-datasource-columnconfiguration-changedetectingcolumns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"DocumentDataColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html#cfn-kendra-datasource-columnconfiguration-documentdatacolumnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DocumentIdColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html#cfn-kendra-datasource-columnconfiguration-documentidcolumnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DocumentTitleColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html#cfn-kendra-datasource-columnconfiguration-documenttitlecolumnname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html#cfn-kendra-datasource-columnconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ConfluenceAttachmentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmentconfiguration.html","Properties":{"AttachmentFieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmentconfiguration.html#cfn-kendra-datasource-confluenceattachmentconfiguration-attachmentfieldmappings","DuplicatesAllowed":true,"ItemType":"ConfluenceAttachmentToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"CrawlAttachments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmentconfiguration.html#cfn-kendra-datasource-confluenceattachmentconfiguration-crawlattachments","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ConfluenceAttachmentToIndexFieldMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmenttoindexfieldmapping.html","Properties":{"DataSourceFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmenttoindexfieldmapping.html#cfn-kendra-datasource-confluenceattachmenttoindexfieldmapping-datasourcefieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DateFieldFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmenttoindexfieldmapping.html#cfn-kendra-datasource-confluenceattachmenttoindexfieldmapping-datefieldformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmenttoindexfieldmapping.html#cfn-kendra-datasource-confluenceattachmenttoindexfieldmapping-indexfieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ConfluenceBlogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogconfiguration.html","Properties":{"BlogFieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogconfiguration.html#cfn-kendra-datasource-confluenceblogconfiguration-blogfieldmappings","DuplicatesAllowed":true,"ItemType":"ConfluenceBlogToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ConfluenceBlogToIndexFieldMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogtoindexfieldmapping.html","Properties":{"DataSourceFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogtoindexfieldmapping.html#cfn-kendra-datasource-confluenceblogtoindexfieldmapping-datasourcefieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DateFieldFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogtoindexfieldmapping.html#cfn-kendra-datasource-confluenceblogtoindexfieldmapping-datefieldformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogtoindexfieldmapping.html#cfn-kendra-datasource-confluenceblogtoindexfieldmapping-indexfieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ConfluenceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html","Properties":{"AttachmentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-attachmentconfiguration","Required":false,"Type":"ConfluenceAttachmentConfiguration","UpdateType":"Mutable"},"BlogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-blogconfiguration","Required":false,"Type":"ConfluenceBlogConfiguration","UpdateType":"Mutable"},"ExclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-exclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"InclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-inclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-pageconfiguration","Required":false,"Type":"ConfluencePageConfiguration","UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-secretarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServerUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-serverurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SpaceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-spaceconfiguration","Required":false,"Type":"ConfluenceSpaceConfiguration","UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-version","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-vpcconfiguration","Required":false,"Type":"DataSourceVpcConfiguration","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ConfluencePageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepageconfiguration.html","Properties":{"PageFieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepageconfiguration.html#cfn-kendra-datasource-confluencepageconfiguration-pagefieldmappings","DuplicatesAllowed":true,"ItemType":"ConfluencePageToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ConfluencePageToIndexFieldMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepagetoindexfieldmapping.html","Properties":{"DataSourceFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepagetoindexfieldmapping.html#cfn-kendra-datasource-confluencepagetoindexfieldmapping-datasourcefieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DateFieldFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepagetoindexfieldmapping.html#cfn-kendra-datasource-confluencepagetoindexfieldmapping-datefieldformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepagetoindexfieldmapping.html#cfn-kendra-datasource-confluencepagetoindexfieldmapping-indexfieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ConfluenceSpaceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html","Properties":{"CrawlArchivedSpaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html#cfn-kendra-datasource-confluencespaceconfiguration-crawlarchivedspaces","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CrawlPersonalSpaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html#cfn-kendra-datasource-confluencespaceconfiguration-crawlpersonalspaces","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExcludeSpaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html#cfn-kendra-datasource-confluencespaceconfiguration-excludespaces","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludeSpaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html#cfn-kendra-datasource-confluencespaceconfiguration-includespaces","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SpaceFieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html#cfn-kendra-datasource-confluencespaceconfiguration-spacefieldmappings","DuplicatesAllowed":true,"ItemType":"ConfluenceSpaceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ConfluenceSpaceToIndexFieldMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespacetoindexfieldmapping.html","Properties":{"DataSourceFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespacetoindexfieldmapping.html#cfn-kendra-datasource-confluencespacetoindexfieldmapping-datasourcefieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DateFieldFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespacetoindexfieldmapping.html#cfn-kendra-datasource-confluencespacetoindexfieldmapping-datefieldformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespacetoindexfieldmapping.html#cfn-kendra-datasource-confluencespacetoindexfieldmapping-indexfieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ConnectionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html","Properties":{"DatabaseHost":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html#cfn-kendra-datasource-connectionconfiguration-databasehost","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html#cfn-kendra-datasource-connectionconfiguration-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatabasePort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html#cfn-kendra-datasource-connectionconfiguration-databaseport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html#cfn-kendra-datasource-connectionconfiguration-secretarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html#cfn-kendra-datasource-connectionconfiguration-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.CustomDocumentEnrichmentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-customdocumentenrichmentconfiguration.html","Properties":{"InlineConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-customdocumentenrichmentconfiguration.html#cfn-kendra-datasource-customdocumentenrichmentconfiguration-inlineconfigurations","DuplicatesAllowed":true,"ItemType":"InlineCustomDocumentEnrichmentConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"PostExtractionHookConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-customdocumentenrichmentconfiguration.html#cfn-kendra-datasource-customdocumentenrichmentconfiguration-postextractionhookconfiguration","Required":false,"Type":"HookConfiguration","UpdateType":"Mutable"},"PreExtractionHookConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-customdocumentenrichmentconfiguration.html#cfn-kendra-datasource-customdocumentenrichmentconfiguration-preextractionhookconfiguration","Required":false,"Type":"HookConfiguration","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-customdocumentenrichmentconfiguration.html#cfn-kendra-datasource-customdocumentenrichmentconfiguration-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.DataSourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html","Properties":{"ConfluenceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-confluenceconfiguration","Required":false,"Type":"ConfluenceConfiguration","UpdateType":"Mutable"},"DatabaseConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-databaseconfiguration","Required":false,"Type":"DatabaseConfiguration","UpdateType":"Mutable"},"GoogleDriveConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-googledriveconfiguration","Required":false,"Type":"GoogleDriveConfiguration","UpdateType":"Mutable"},"OneDriveConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-onedriveconfiguration","Required":false,"Type":"OneDriveConfiguration","UpdateType":"Mutable"},"S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-s3configuration","Required":false,"Type":"S3DataSourceConfiguration","UpdateType":"Mutable"},"SalesforceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-salesforceconfiguration","Required":false,"Type":"SalesforceConfiguration","UpdateType":"Mutable"},"ServiceNowConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-servicenowconfiguration","Required":false,"Type":"ServiceNowConfiguration","UpdateType":"Mutable"},"SharePointConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-sharepointconfiguration","Required":false,"Type":"SharePointConfiguration","UpdateType":"Mutable"},"WebCrawlerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-webcrawlerconfiguration","Required":false,"Type":"WebCrawlerConfiguration","UpdateType":"Mutable"},"WorkDocsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-workdocsconfiguration","Required":false,"Type":"WorkDocsConfiguration","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.DataSourceToIndexFieldMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcetoindexfieldmapping.html","Properties":{"DataSourceFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcetoindexfieldmapping.html#cfn-kendra-datasource-datasourcetoindexfieldmapping-datasourcefieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DateFieldFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcetoindexfieldmapping.html#cfn-kendra-datasource-datasourcetoindexfieldmapping-datefieldformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcetoindexfieldmapping.html#cfn-kendra-datasource-datasourcetoindexfieldmapping-indexfieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.DataSourceVpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcevpcconfiguration.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcevpcconfiguration.html#cfn-kendra-datasource-datasourcevpcconfiguration-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcevpcconfiguration.html#cfn-kendra-datasource-datasourcevpcconfiguration-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.DatabaseConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html","Properties":{"AclConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-aclconfiguration","Required":false,"Type":"AclConfiguration","UpdateType":"Mutable"},"ColumnConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-columnconfiguration","Required":true,"Type":"ColumnConfiguration","UpdateType":"Mutable"},"ConnectionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-connectionconfiguration","Required":true,"Type":"ConnectionConfiguration","UpdateType":"Mutable"},"DatabaseEngineType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-databaseenginetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SqlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-sqlconfiguration","Required":false,"Type":"SqlConfiguration","UpdateType":"Mutable"},"VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-vpcconfiguration","Required":false,"Type":"DataSourceVpcConfiguration","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.DocumentAttributeCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributecondition.html","Properties":{"ConditionDocumentAttributeKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributecondition.html#cfn-kendra-datasource-documentattributecondition-conditiondocumentattributekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConditionOnValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributecondition.html#cfn-kendra-datasource-documentattributecondition-conditiononvalue","Required":false,"Type":"DocumentAttributeValue","UpdateType":"Mutable"},"Operator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributecondition.html#cfn-kendra-datasource-documentattributecondition-operator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.DocumentAttributeTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributetarget.html","Properties":{"TargetDocumentAttributeKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributetarget.html#cfn-kendra-datasource-documentattributetarget-targetdocumentattributekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetDocumentAttributeValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributetarget.html#cfn-kendra-datasource-documentattributetarget-targetdocumentattributevalue","Required":false,"Type":"DocumentAttributeValue","UpdateType":"Mutable"},"TargetDocumentAttributeValueDeletion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributetarget.html#cfn-kendra-datasource-documentattributetarget-targetdocumentattributevaluedeletion","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.DocumentAttributeValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributevalue.html","Properties":{"DateValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributevalue.html#cfn-kendra-datasource-documentattributevalue-datevalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LongValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributevalue.html#cfn-kendra-datasource-documentattributevalue-longvalue","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StringListValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributevalue.html#cfn-kendra-datasource-documentattributevalue-stringlistvalue","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"StringValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributevalue.html#cfn-kendra-datasource-documentattributevalue-stringvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.DocumentsMetadataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentsmetadataconfiguration.html","Properties":{"S3Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentsmetadataconfiguration.html#cfn-kendra-datasource-documentsmetadataconfiguration-s3prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.GoogleDriveConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html","Properties":{"ExcludeMimeTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-excludemimetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ExcludeSharedDrives":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-excludeshareddrives","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ExcludeUserAccounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-excludeuseraccounts","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ExclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-exclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"InclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-inclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-secretarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.HookConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-hookconfiguration.html","Properties":{"InvocationCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-hookconfiguration.html#cfn-kendra-datasource-hookconfiguration-invocationcondition","Required":false,"Type":"DocumentAttributeCondition","UpdateType":"Mutable"},"LambdaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-hookconfiguration.html#cfn-kendra-datasource-hookconfiguration-lambdaarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-hookconfiguration.html#cfn-kendra-datasource-hookconfiguration-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.InlineCustomDocumentEnrichmentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-inlinecustomdocumentenrichmentconfiguration.html","Properties":{"Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-inlinecustomdocumentenrichmentconfiguration.html#cfn-kendra-datasource-inlinecustomdocumentenrichmentconfiguration-condition","Required":false,"Type":"DocumentAttributeCondition","UpdateType":"Mutable"},"DocumentContentDeletion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-inlinecustomdocumentenrichmentconfiguration.html#cfn-kendra-datasource-inlinecustomdocumentenrichmentconfiguration-documentcontentdeletion","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-inlinecustomdocumentenrichmentconfiguration.html#cfn-kendra-datasource-inlinecustomdocumentenrichmentconfiguration-target","Required":false,"Type":"DocumentAttributeTarget","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.OneDriveConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html","Properties":{"DisableLocalGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-disablelocalgroups","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-exclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"InclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-inclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OneDriveUsers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-onedriveusers","Required":true,"Type":"OneDriveUsers","UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-secretarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TenantDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-tenantdomain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.OneDriveUsers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveusers.html","Properties":{"OneDriveUserList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveusers.html#cfn-kendra-datasource-onedriveusers-onedriveuserlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OneDriveUserS3Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveusers.html#cfn-kendra-datasource-onedriveusers-onedriveusers3path","Required":false,"Type":"S3Path","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ProxyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-proxyconfiguration.html","Properties":{"Credentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-proxyconfiguration.html#cfn-kendra-datasource-proxyconfiguration-credentials","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-proxyconfiguration.html#cfn-kendra-datasource-proxyconfiguration-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-proxyconfiguration.html#cfn-kendra-datasource-proxyconfiguration-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.S3DataSourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html","Properties":{"AccessControlListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-accesscontrollistconfiguration","Required":false,"Type":"AccessControlListConfiguration","UpdateType":"Mutable"},"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DocumentsMetadataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-documentsmetadataconfiguration","Required":false,"Type":"DocumentsMetadataConfiguration","UpdateType":"Mutable"},"ExclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-exclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"InclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-inclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"InclusionPrefixes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-inclusionprefixes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.S3Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3path.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3path.html#cfn-kendra-datasource-s3path-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3path.html#cfn-kendra-datasource-s3path-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.SalesforceChatterFeedConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcechatterfeedconfiguration.html","Properties":{"DocumentDataFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcechatterfeedconfiguration.html#cfn-kendra-datasource-salesforcechatterfeedconfiguration-documentdatafieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DocumentTitleFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcechatterfeedconfiguration.html#cfn-kendra-datasource-salesforcechatterfeedconfiguration-documenttitlefieldname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcechatterfeedconfiguration.html#cfn-kendra-datasource-salesforcechatterfeedconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludeFilterTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcechatterfeedconfiguration.html#cfn-kendra-datasource-salesforcechatterfeedconfiguration-includefiltertypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.SalesforceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html","Properties":{"ChatterFeedConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-chatterfeedconfiguration","Required":false,"Type":"SalesforceChatterFeedConfiguration","UpdateType":"Mutable"},"CrawlAttachments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-crawlattachments","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExcludeAttachmentFilePatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-excludeattachmentfilepatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludeAttachmentFilePatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-includeattachmentfilepatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"KnowledgeArticleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-knowledgearticleconfiguration","Required":false,"Type":"SalesforceKnowledgeArticleConfiguration","UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-secretarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServerUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-serverurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StandardObjectAttachmentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-standardobjectattachmentconfiguration","Required":false,"Type":"SalesforceStandardObjectAttachmentConfiguration","UpdateType":"Mutable"},"StandardObjectConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-standardobjectconfigurations","DuplicatesAllowed":true,"ItemType":"SalesforceStandardObjectConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.SalesforceCustomKnowledgeArticleTypeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration.html","Properties":{"DocumentDataFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration-documentdatafieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DocumentTitleFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration-documenttitlefieldname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.SalesforceKnowledgeArticleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceknowledgearticleconfiguration.html","Properties":{"CustomKnowledgeArticleTypeConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceknowledgearticleconfiguration.html#cfn-kendra-datasource-salesforceknowledgearticleconfiguration-customknowledgearticletypeconfigurations","DuplicatesAllowed":true,"ItemType":"SalesforceCustomKnowledgeArticleTypeConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludedStates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceknowledgearticleconfiguration.html#cfn-kendra-datasource-salesforceknowledgearticleconfiguration-includedstates","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"StandardKnowledgeArticleTypeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceknowledgearticleconfiguration.html#cfn-kendra-datasource-salesforceknowledgearticleconfiguration-standardknowledgearticletypeconfiguration","Required":false,"Type":"SalesforceStandardKnowledgeArticleTypeConfiguration","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.SalesforceStandardKnowledgeArticleTypeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration.html","Properties":{"DocumentDataFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration-documentdatafieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DocumentTitleFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration-documenttitlefieldname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.SalesforceStandardObjectAttachmentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectattachmentconfiguration.html","Properties":{"DocumentTitleFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectattachmentconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectattachmentconfiguration-documenttitlefieldname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectattachmentconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectattachmentconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.SalesforceStandardObjectConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectconfiguration.html","Properties":{"DocumentDataFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectconfiguration-documentdatafieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DocumentTitleFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectconfiguration-documenttitlefieldname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ServiceNowConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html","Properties":{"AuthenticationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-authenticationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-hosturl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KnowledgeArticleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-knowledgearticleconfiguration","Required":false,"Type":"ServiceNowKnowledgeArticleConfiguration","UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-secretarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServiceCatalogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-servicecatalogconfiguration","Required":false,"Type":"ServiceNowServiceCatalogConfiguration","UpdateType":"Mutable"},"ServiceNowBuildVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-servicenowbuildversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ServiceNowKnowledgeArticleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html","Properties":{"CrawlAttachments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-crawlattachments","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DocumentDataFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-documentdatafieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DocumentTitleFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-documenttitlefieldname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExcludeAttachmentFilePatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-excludeattachmentfilepatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"FilterQuery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-filterquery","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IncludeAttachmentFilePatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-includeattachmentfilepatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.ServiceNowServiceCatalogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html","Properties":{"CrawlAttachments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-crawlattachments","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DocumentDataFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-documentdatafieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DocumentTitleFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-documenttitlefieldname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExcludeAttachmentFilePatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-excludeattachmentfilepatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludeAttachmentFilePatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-includeattachmentfilepatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.SharePointConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html","Properties":{"CrawlAttachments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-crawlattachments","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DisableLocalGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-disablelocalgroups","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DocumentTitleFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-documenttitlefieldname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-exclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"InclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-inclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-secretarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SharePointVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-sharepointversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SslCertificateS3Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-sslcertificates3path","Required":false,"Type":"S3Path","UpdateType":"Mutable"},"Urls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-urls","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"UseChangeLog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-usechangelog","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-vpcconfiguration","Required":false,"Type":"DataSourceVpcConfiguration","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.SqlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sqlconfiguration.html","Properties":{"QueryIdentifiersEnclosingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sqlconfiguration.html#cfn-kendra-datasource-sqlconfiguration-queryidentifiersenclosingoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.WebCrawlerAuthenticationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerauthenticationconfiguration.html","Properties":{"BasicAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerauthenticationconfiguration.html#cfn-kendra-datasource-webcrawlerauthenticationconfiguration-basicauthentication","DuplicatesAllowed":true,"ItemType":"WebCrawlerBasicAuthentication","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.WebCrawlerBasicAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerbasicauthentication.html","Properties":{"Credentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerbasicauthentication.html#cfn-kendra-datasource-webcrawlerbasicauthentication-credentials","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerbasicauthentication.html#cfn-kendra-datasource-webcrawlerbasicauthentication-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerbasicauthentication.html#cfn-kendra-datasource-webcrawlerbasicauthentication-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.WebCrawlerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html","Properties":{"AuthenticationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-authenticationconfiguration","Required":false,"Type":"WebCrawlerAuthenticationConfiguration","UpdateType":"Mutable"},"CrawlDepth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-crawldepth","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxContentSizePerPageInMegaBytes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-maxcontentsizeperpageinmegabytes","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaxLinksPerPage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-maxlinksperpage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxUrlsPerMinuteCrawlRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-maxurlsperminutecrawlrate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ProxyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-proxyconfiguration","Required":false,"Type":"ProxyConfiguration","UpdateType":"Mutable"},"UrlExclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-urlexclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"UrlInclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-urlinclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Urls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-urls","Required":true,"Type":"WebCrawlerUrls","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.WebCrawlerSeedUrlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerseedurlconfiguration.html","Properties":{"SeedUrls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerseedurlconfiguration.html#cfn-kendra-datasource-webcrawlerseedurlconfiguration-seedurls","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"WebCrawlerMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerseedurlconfiguration.html#cfn-kendra-datasource-webcrawlerseedurlconfiguration-webcrawlermode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.WebCrawlerSiteMapsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlersitemapsconfiguration.html","Properties":{"SiteMaps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlersitemapsconfiguration.html#cfn-kendra-datasource-webcrawlersitemapsconfiguration-sitemaps","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.WebCrawlerUrls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerurls.html","Properties":{"SeedUrlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerurls.html#cfn-kendra-datasource-webcrawlerurls-seedurlconfiguration","Required":false,"Type":"WebCrawlerSeedUrlConfiguration","UpdateType":"Mutable"},"SiteMapsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerurls.html#cfn-kendra-datasource-webcrawlerurls-sitemapsconfiguration","Required":false,"Type":"WebCrawlerSiteMapsConfiguration","UpdateType":"Mutable"}}},"AWS::Kendra::DataSource.WorkDocsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html","Properties":{"CrawlComments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-crawlcomments","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-exclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"FieldMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-fieldmappings","DuplicatesAllowed":true,"ItemType":"DataSourceToIndexFieldMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"InclusionPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-inclusionpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OrganizationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-organizationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UseChangeLog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-usechangelog","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Kendra::Faq.S3Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-faq-s3path.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-faq-s3path.html#cfn-kendra-faq-s3path-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-faq-s3path.html#cfn-kendra-faq-s3path-key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Kendra::Index.CapacityUnitsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-capacityunitsconfiguration.html","Properties":{"QueryCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-capacityunitsconfiguration.html#cfn-kendra-index-capacityunitsconfiguration-querycapacityunits","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"StorageCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-capacityunitsconfiguration.html#cfn-kendra-index-capacityunitsconfiguration-storagecapacityunits","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::Index.DocumentMetadataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-documentmetadataconfiguration.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-documentmetadataconfiguration.html#cfn-kendra-index-documentmetadataconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Relevance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-documentmetadataconfiguration.html#cfn-kendra-index-documentmetadataconfiguration-relevance","Required":false,"Type":"Relevance","UpdateType":"Mutable"},"Search":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-documentmetadataconfiguration.html#cfn-kendra-index-documentmetadataconfiguration-search","Required":false,"Type":"Search","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-documentmetadataconfiguration.html#cfn-kendra-index-documentmetadataconfiguration-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::Index.JsonTokenTypeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jsontokentypeconfiguration.html","Properties":{"GroupAttributeField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jsontokentypeconfiguration.html#cfn-kendra-index-jsontokentypeconfiguration-groupattributefield","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UserNameAttributeField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jsontokentypeconfiguration.html#cfn-kendra-index-jsontokentypeconfiguration-usernameattributefield","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kendra::Index.JwtTokenTypeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html","Properties":{"ClaimRegex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-claimregex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GroupAttributeField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-groupattributefield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Issuer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-issuer","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-keylocation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecretManagerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-secretmanagerarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"URL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserNameAttributeField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-usernameattributefield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Kendra::Index.Relevance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html","Properties":{"Duration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html#cfn-kendra-index-relevance-duration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Freshness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html#cfn-kendra-index-relevance-freshness","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Importance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html#cfn-kendra-index-relevance-importance","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RankOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html#cfn-kendra-index-relevance-rankorder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueImportanceItems":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html#cfn-kendra-index-relevance-valueimportanceitems","DuplicatesAllowed":true,"ItemType":"ValueImportanceItem","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::Index.Search":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-search.html","Properties":{"Displayable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-search.html#cfn-kendra-index-search-displayable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Facetable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-search.html#cfn-kendra-index-search-facetable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Searchable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-search.html#cfn-kendra-index-search-searchable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Sortable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-search.html#cfn-kendra-index-search-sortable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Kendra::Index.ServerSideEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-serversideencryptionconfiguration.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-serversideencryptionconfiguration.html#cfn-kendra-index-serversideencryptionconfiguration-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Kendra::Index.UserTokenConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-usertokenconfiguration.html","Properties":{"JsonTokenTypeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-usertokenconfiguration.html#cfn-kendra-index-usertokenconfiguration-jsontokentypeconfiguration","Required":false,"Type":"JsonTokenTypeConfiguration","UpdateType":"Mutable"},"JwtTokenTypeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-usertokenconfiguration.html#cfn-kendra-index-usertokenconfiguration-jwttokentypeconfiguration","Required":false,"Type":"JwtTokenTypeConfiguration","UpdateType":"Mutable"}}},"AWS::Kendra::Index.ValueImportanceItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-valueimportanceitem.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-valueimportanceitem.html#cfn-kendra-index-valueimportanceitem-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-valueimportanceitem.html#cfn-kendra-index-valueimportanceitem-value","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KendraRanking::ExecutionPlan.CapacityUnitsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendraranking-executionplan-capacityunitsconfiguration.html","Properties":{"RescoreCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendraranking-executionplan-capacityunitsconfiguration.html#cfn-kendraranking-executionplan-capacityunitsconfiguration-rescorecapacityunits","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Kinesis::Stream.StreamEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesis-stream-streamencryption.html","Properties":{"EncryptionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesis-stream-streamencryption.html#cfn-kinesis-stream-streamencryption-encryptiontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesis-stream-streamencryption.html#cfn-kinesis-stream-streamencryption-keyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Kinesis::Stream.StreamModeDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesis-stream-streammodedetails.html","Properties":{"StreamMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesis-stream-streammodedetails.html#cfn-kinesis-stream-streammodedetails-streammode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.CSVMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-csvmappingparameters.html","Properties":{"RecordColumnDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-csvmappingparameters.html#cfn-kinesisanalytics-application-csvmappingparameters-recordcolumndelimiter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RecordRowDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-csvmappingparameters.html#cfn-kinesisanalytics-application-csvmappingparameters-recordrowdelimiter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-input.html","Properties":{"InputParallelism":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-input.html#cfn-kinesisanalytics-application-input-inputparallelism","Required":false,"Type":"InputParallelism","UpdateType":"Mutable"},"InputProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-input.html#cfn-kinesisanalytics-application-input-inputprocessingconfiguration","Required":false,"Type":"InputProcessingConfiguration","UpdateType":"Mutable"},"InputSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-input.html#cfn-kinesisanalytics-application-input-inputschema","Required":true,"Type":"InputSchema","UpdateType":"Mutable"},"KinesisFirehoseInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-input.html#cfn-kinesisanalytics-application-input-kinesisfirehoseinput","Required":false,"Type":"KinesisFirehoseInput","UpdateType":"Mutable"},"KinesisStreamsInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-input.html#cfn-kinesisanalytics-application-input-kinesisstreamsinput","Required":false,"Type":"KinesisStreamsInput","UpdateType":"Mutable"},"NamePrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-input.html#cfn-kinesisanalytics-application-input-nameprefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.InputLambdaProcessor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputlambdaprocessor.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputlambdaprocessor.html#cfn-kinesisanalytics-application-inputlambdaprocessor-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputlambdaprocessor.html#cfn-kinesisanalytics-application-inputlambdaprocessor-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.InputParallelism":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputparallelism.html","Properties":{"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputparallelism.html#cfn-kinesisanalytics-application-inputparallelism-count","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.InputProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputprocessingconfiguration.html","Properties":{"InputLambdaProcessor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputprocessingconfiguration.html#cfn-kinesisanalytics-application-inputprocessingconfiguration-inputlambdaprocessor","Required":false,"Type":"InputLambdaProcessor","UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.InputSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputschema.html","Properties":{"RecordColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputschema.html#cfn-kinesisanalytics-application-inputschema-recordcolumns","ItemType":"RecordColumn","Required":true,"Type":"List","UpdateType":"Mutable"},"RecordEncoding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputschema.html#cfn-kinesisanalytics-application-inputschema-recordencoding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RecordFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-inputschema.html#cfn-kinesisanalytics-application-inputschema-recordformat","Required":true,"Type":"RecordFormat","UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.JSONMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-jsonmappingparameters.html","Properties":{"RecordRowPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-jsonmappingparameters.html#cfn-kinesisanalytics-application-jsonmappingparameters-recordrowpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.KinesisFirehoseInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-kinesisfirehoseinput.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-kinesisfirehoseinput.html#cfn-kinesisanalytics-application-kinesisfirehoseinput-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-kinesisfirehoseinput.html#cfn-kinesisanalytics-application-kinesisfirehoseinput-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.KinesisStreamsInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-kinesisstreamsinput.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-kinesisstreamsinput.html#cfn-kinesisanalytics-application-kinesisstreamsinput-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-kinesisstreamsinput.html#cfn-kinesisanalytics-application-kinesisstreamsinput-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.MappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-mappingparameters.html","Properties":{"CSVMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-mappingparameters.html#cfn-kinesisanalytics-application-mappingparameters-csvmappingparameters","Required":false,"Type":"CSVMappingParameters","UpdateType":"Mutable"},"JSONMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-mappingparameters.html#cfn-kinesisanalytics-application-mappingparameters-jsonmappingparameters","Required":false,"Type":"JSONMappingParameters","UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.RecordColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-recordcolumn.html","Properties":{"Mapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-recordcolumn.html#cfn-kinesisanalytics-application-recordcolumn-mapping","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-recordcolumn.html#cfn-kinesisanalytics-application-recordcolumn-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SqlType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-recordcolumn.html#cfn-kinesisanalytics-application-recordcolumn-sqltype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::Application.RecordFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-recordformat.html","Properties":{"MappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-recordformat.html#cfn-kinesisanalytics-application-recordformat-mappingparameters","Required":false,"Type":"MappingParameters","UpdateType":"Mutable"},"RecordFormatType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-application-recordformat.html#cfn-kinesisanalytics-application-recordformat-recordformattype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationOutput.DestinationSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-destinationschema.html","Properties":{"RecordFormatType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-destinationschema.html#cfn-kinesisanalytics-applicationoutput-destinationschema-recordformattype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationOutput.KinesisFirehoseOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-kinesisfirehoseoutput.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-kinesisfirehoseoutput.html#cfn-kinesisanalytics-applicationoutput-kinesisfirehoseoutput-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-kinesisfirehoseoutput.html#cfn-kinesisanalytics-applicationoutput-kinesisfirehoseoutput-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationOutput.KinesisStreamsOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-kinesisstreamsoutput.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-kinesisstreamsoutput.html#cfn-kinesisanalytics-applicationoutput-kinesisstreamsoutput-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-kinesisstreamsoutput.html#cfn-kinesisanalytics-applicationoutput-kinesisstreamsoutput-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationOutput.LambdaOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-lambdaoutput.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-lambdaoutput.html#cfn-kinesisanalytics-applicationoutput-lambdaoutput-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-lambdaoutput.html#cfn-kinesisanalytics-applicationoutput-lambdaoutput-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationOutput.Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-output.html","Properties":{"DestinationSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-output.html#cfn-kinesisanalytics-applicationoutput-output-destinationschema","Required":true,"Type":"DestinationSchema","UpdateType":"Mutable"},"KinesisFirehoseOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-output.html#cfn-kinesisanalytics-applicationoutput-output-kinesisfirehoseoutput","Required":false,"Type":"KinesisFirehoseOutput","UpdateType":"Mutable"},"KinesisStreamsOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-output.html#cfn-kinesisanalytics-applicationoutput-output-kinesisstreamsoutput","Required":false,"Type":"KinesisStreamsOutput","UpdateType":"Mutable"},"LambdaOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-output.html#cfn-kinesisanalytics-applicationoutput-output-lambdaoutput","Required":false,"Type":"LambdaOutput","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationoutput-output.html#cfn-kinesisanalytics-applicationoutput-output-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.CSVMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-csvmappingparameters.html","Properties":{"RecordColumnDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-csvmappingparameters.html#cfn-kinesisanalytics-applicationreferencedatasource-csvmappingparameters-recordcolumndelimiter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RecordRowDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-csvmappingparameters.html#cfn-kinesisanalytics-applicationreferencedatasource-csvmappingparameters-recordrowdelimiter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.JSONMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-jsonmappingparameters.html","Properties":{"RecordRowPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-jsonmappingparameters.html#cfn-kinesisanalytics-applicationreferencedatasource-jsonmappingparameters-recordrowpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.MappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-mappingparameters.html","Properties":{"CSVMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-mappingparameters.html#cfn-kinesisanalytics-applicationreferencedatasource-mappingparameters-csvmappingparameters","Required":false,"Type":"CSVMappingParameters","UpdateType":"Mutable"},"JSONMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-mappingparameters.html#cfn-kinesisanalytics-applicationreferencedatasource-mappingparameters-jsonmappingparameters","Required":false,"Type":"JSONMappingParameters","UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.RecordColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-recordcolumn.html","Properties":{"Mapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-recordcolumn.html#cfn-kinesisanalytics-applicationreferencedatasource-recordcolumn-mapping","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-recordcolumn.html#cfn-kinesisanalytics-applicationreferencedatasource-recordcolumn-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SqlType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-recordcolumn.html#cfn-kinesisanalytics-applicationreferencedatasource-recordcolumn-sqltype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.RecordFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-recordformat.html","Properties":{"MappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-recordformat.html#cfn-kinesisanalytics-applicationreferencedatasource-recordformat-mappingparameters","Required":false,"Type":"MappingParameters","UpdateType":"Mutable"},"RecordFormatType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-recordformat.html#cfn-kinesisanalytics-applicationreferencedatasource-recordformat-recordformattype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.ReferenceDataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-referencedatasource.html","Properties":{"ReferenceSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-referencedatasource.html#cfn-kinesisanalytics-applicationreferencedatasource-referencedatasource-referenceschema","Required":true,"Type":"ReferenceSchema","UpdateType":"Mutable"},"S3ReferenceDataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-referencedatasource.html#cfn-kinesisanalytics-applicationreferencedatasource-referencedatasource-s3referencedatasource","Required":false,"Type":"S3ReferenceDataSource","UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-referencedatasource.html#cfn-kinesisanalytics-applicationreferencedatasource-referencedatasource-tablename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.ReferenceSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-referenceschema.html","Properties":{"RecordColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-referenceschema.html#cfn-kinesisanalytics-applicationreferencedatasource-referenceschema-recordcolumns","ItemType":"RecordColumn","Required":true,"Type":"List","UpdateType":"Mutable"},"RecordEncoding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-referenceschema.html#cfn-kinesisanalytics-applicationreferencedatasource-referenceschema-recordencoding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RecordFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-referenceschema.html#cfn-kinesisanalytics-applicationreferencedatasource-referenceschema-recordformat","Required":true,"Type":"RecordFormat","UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource.S3ReferenceDataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-s3referencedatasource.html","Properties":{"BucketARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-s3referencedatasource.html#cfn-kinesisanalytics-applicationreferencedatasource-s3referencedatasource-bucketarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FileKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-s3referencedatasource.html#cfn-kinesisanalytics-applicationreferencedatasource-s3referencedatasource-filekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ReferenceRoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalytics-applicationreferencedatasource-s3referencedatasource.html#cfn-kinesisanalytics-applicationreferencedatasource-s3referencedatasource-referencerolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.ApplicationCodeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationcodeconfiguration.html","Properties":{"CodeContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationcodeconfiguration.html#cfn-kinesisanalyticsv2-application-applicationcodeconfiguration-codecontent","Required":true,"Type":"CodeContent","UpdateType":"Mutable"},"CodeContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationcodeconfiguration.html#cfn-kinesisanalyticsv2-application-applicationcodeconfiguration-codecontenttype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.ApplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html","Properties":{"ApplicationCodeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-applicationcodeconfiguration","Required":false,"Type":"ApplicationCodeConfiguration","UpdateType":"Mutable"},"ApplicationSnapshotConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-applicationsnapshotconfiguration","Required":false,"Type":"ApplicationSnapshotConfiguration","UpdateType":"Mutable"},"EnvironmentProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-environmentproperties","Required":false,"Type":"EnvironmentProperties","UpdateType":"Mutable"},"FlinkApplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-flinkapplicationconfiguration","Required":false,"Type":"FlinkApplicationConfiguration","UpdateType":"Mutable"},"SqlApplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-sqlapplicationconfiguration","Required":false,"Type":"SqlApplicationConfiguration","UpdateType":"Mutable"},"VpcConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-vpcconfigurations","DuplicatesAllowed":true,"ItemType":"VpcConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"ZeppelinApplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-zeppelinapplicationconfiguration","Required":false,"Type":"ZeppelinApplicationConfiguration","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.ApplicationMaintenanceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationmaintenanceconfiguration.html","Properties":{"ApplicationMaintenanceWindowStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationmaintenanceconfiguration.html#cfn-kinesisanalyticsv2-application-applicationmaintenanceconfiguration-applicationmaintenancewindowstarttime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.ApplicationRestoreConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationrestoreconfiguration.html","Properties":{"ApplicationRestoreType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationrestoreconfiguration.html#cfn-kinesisanalyticsv2-application-applicationrestoreconfiguration-applicationrestoretype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SnapshotName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationrestoreconfiguration.html#cfn-kinesisanalyticsv2-application-applicationrestoreconfiguration-snapshotname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.ApplicationSnapshotConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationsnapshotconfiguration.html","Properties":{"SnapshotsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationsnapshotconfiguration.html#cfn-kinesisanalyticsv2-application-applicationsnapshotconfiguration-snapshotsenabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.CSVMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-csvmappingparameters.html","Properties":{"RecordColumnDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-csvmappingparameters.html#cfn-kinesisanalyticsv2-application-csvmappingparameters-recordcolumndelimiter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RecordRowDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-csvmappingparameters.html#cfn-kinesisanalyticsv2-application-csvmappingparameters-recordrowdelimiter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.CatalogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-catalogconfiguration.html","Properties":{"GlueDataCatalogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-catalogconfiguration.html#cfn-kinesisanalyticsv2-application-catalogconfiguration-gluedatacatalogconfiguration","Required":false,"Type":"GlueDataCatalogConfiguration","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.CheckpointConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-checkpointconfiguration.html","Properties":{"CheckpointInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-checkpointconfiguration.html#cfn-kinesisanalyticsv2-application-checkpointconfiguration-checkpointinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CheckpointingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-checkpointconfiguration.html#cfn-kinesisanalyticsv2-application-checkpointconfiguration-checkpointingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ConfigurationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-checkpointconfiguration.html#cfn-kinesisanalyticsv2-application-checkpointconfiguration-configurationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MinPauseBetweenCheckpoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-checkpointconfiguration.html#cfn-kinesisanalyticsv2-application-checkpointconfiguration-minpausebetweencheckpoints","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.CodeContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-codecontent.html","Properties":{"S3ContentLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-codecontent.html#cfn-kinesisanalyticsv2-application-codecontent-s3contentlocation","Required":false,"Type":"S3ContentLocation","UpdateType":"Mutable"},"TextContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-codecontent.html#cfn-kinesisanalyticsv2-application-codecontent-textcontent","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ZipFileContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-codecontent.html#cfn-kinesisanalyticsv2-application-codecontent-zipfilecontent","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.CustomArtifactConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-customartifactconfiguration.html","Properties":{"ArtifactType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-customartifactconfiguration.html#cfn-kinesisanalyticsv2-application-customartifactconfiguration-artifacttype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MavenReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-customartifactconfiguration.html#cfn-kinesisanalyticsv2-application-customartifactconfiguration-mavenreference","Required":false,"Type":"MavenReference","UpdateType":"Mutable"},"S3ContentLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-customartifactconfiguration.html#cfn-kinesisanalyticsv2-application-customartifactconfiguration-s3contentlocation","Required":false,"Type":"S3ContentLocation","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.DeployAsApplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-deployasapplicationconfiguration.html","Properties":{"S3ContentLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-deployasapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-deployasapplicationconfiguration-s3contentlocation","Required":true,"Type":"S3ContentBaseLocation","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.EnvironmentProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-environmentproperties.html","Properties":{"PropertyGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-environmentproperties.html#cfn-kinesisanalyticsv2-application-environmentproperties-propertygroups","DuplicatesAllowed":true,"ItemType":"PropertyGroup","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.FlinkApplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-flinkapplicationconfiguration.html","Properties":{"CheckpointConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-flinkapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-flinkapplicationconfiguration-checkpointconfiguration","Required":false,"Type":"CheckpointConfiguration","UpdateType":"Mutable"},"MonitoringConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-flinkapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-flinkapplicationconfiguration-monitoringconfiguration","Required":false,"Type":"MonitoringConfiguration","UpdateType":"Mutable"},"ParallelismConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-flinkapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-flinkapplicationconfiguration-parallelismconfiguration","Required":false,"Type":"ParallelismConfiguration","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.FlinkRunConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-flinkrunconfiguration.html","Properties":{"AllowNonRestoredState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-flinkrunconfiguration.html#cfn-kinesisanalyticsv2-application-flinkrunconfiguration-allownonrestoredstate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.GlueDataCatalogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-gluedatacatalogconfiguration.html","Properties":{"DatabaseARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-gluedatacatalogconfiguration.html#cfn-kinesisanalyticsv2-application-gluedatacatalogconfiguration-databasearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html","Properties":{"InputParallelism":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-inputparallelism","Required":false,"Type":"InputParallelism","UpdateType":"Mutable"},"InputProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-inputprocessingconfiguration","Required":false,"Type":"InputProcessingConfiguration","UpdateType":"Mutable"},"InputSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-inputschema","Required":true,"Type":"InputSchema","UpdateType":"Mutable"},"KinesisFirehoseInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-kinesisfirehoseinput","Required":false,"Type":"KinesisFirehoseInput","UpdateType":"Mutable"},"KinesisStreamsInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-kinesisstreamsinput","Required":false,"Type":"KinesisStreamsInput","UpdateType":"Mutable"},"NamePrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-nameprefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.InputLambdaProcessor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputlambdaprocessor.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputlambdaprocessor.html#cfn-kinesisanalyticsv2-application-inputlambdaprocessor-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.InputParallelism":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputparallelism.html","Properties":{"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputparallelism.html#cfn-kinesisanalyticsv2-application-inputparallelism-count","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.InputProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputprocessingconfiguration.html","Properties":{"InputLambdaProcessor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputprocessingconfiguration.html#cfn-kinesisanalyticsv2-application-inputprocessingconfiguration-inputlambdaprocessor","Required":false,"Type":"InputLambdaProcessor","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.InputSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputschema.html","Properties":{"RecordColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputschema.html#cfn-kinesisanalyticsv2-application-inputschema-recordcolumns","DuplicatesAllowed":true,"ItemType":"RecordColumn","Required":true,"Type":"List","UpdateType":"Mutable"},"RecordEncoding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputschema.html#cfn-kinesisanalyticsv2-application-inputschema-recordencoding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RecordFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputschema.html#cfn-kinesisanalyticsv2-application-inputschema-recordformat","Required":true,"Type":"RecordFormat","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.JSONMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-jsonmappingparameters.html","Properties":{"RecordRowPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-jsonmappingparameters.html#cfn-kinesisanalyticsv2-application-jsonmappingparameters-recordrowpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.KinesisFirehoseInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-kinesisfirehoseinput.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-kinesisfirehoseinput.html#cfn-kinesisanalyticsv2-application-kinesisfirehoseinput-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.KinesisStreamsInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-kinesisstreamsinput.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-kinesisstreamsinput.html#cfn-kinesisanalyticsv2-application-kinesisstreamsinput-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.MappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mappingparameters.html","Properties":{"CSVMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mappingparameters.html#cfn-kinesisanalyticsv2-application-mappingparameters-csvmappingparameters","Required":false,"Type":"CSVMappingParameters","UpdateType":"Mutable"},"JSONMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mappingparameters.html#cfn-kinesisanalyticsv2-application-mappingparameters-jsonmappingparameters","Required":false,"Type":"JSONMappingParameters","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.MavenReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mavenreference.html","Properties":{"ArtifactId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mavenreference.html#cfn-kinesisanalyticsv2-application-mavenreference-artifactid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"GroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mavenreference.html#cfn-kinesisanalyticsv2-application-mavenreference-groupid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mavenreference.html#cfn-kinesisanalyticsv2-application-mavenreference-version","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.MonitoringConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-monitoringconfiguration.html","Properties":{"ConfigurationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-monitoringconfiguration.html#cfn-kinesisanalyticsv2-application-monitoringconfiguration-configurationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-monitoringconfiguration.html#cfn-kinesisanalyticsv2-application-monitoringconfiguration-loglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricsLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-monitoringconfiguration.html#cfn-kinesisanalyticsv2-application-monitoringconfiguration-metricslevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.ParallelismConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-parallelismconfiguration.html","Properties":{"AutoScalingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-parallelismconfiguration.html#cfn-kinesisanalyticsv2-application-parallelismconfiguration-autoscalingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ConfigurationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-parallelismconfiguration.html#cfn-kinesisanalyticsv2-application-parallelismconfiguration-configurationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Parallelism":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-parallelismconfiguration.html#cfn-kinesisanalyticsv2-application-parallelismconfiguration-parallelism","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ParallelismPerKPU":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-parallelismconfiguration.html#cfn-kinesisanalyticsv2-application-parallelismconfiguration-parallelismperkpu","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.PropertyGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-propertygroup.html","Properties":{"PropertyGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-propertygroup.html#cfn-kinesisanalyticsv2-application-propertygroup-propertygroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-propertygroup.html#cfn-kinesisanalyticsv2-application-propertygroup-propertymap","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.RecordColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordcolumn.html","Properties":{"Mapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordcolumn.html#cfn-kinesisanalyticsv2-application-recordcolumn-mapping","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordcolumn.html#cfn-kinesisanalyticsv2-application-recordcolumn-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SqlType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordcolumn.html#cfn-kinesisanalyticsv2-application-recordcolumn-sqltype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.RecordFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordformat.html","Properties":{"MappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordformat.html#cfn-kinesisanalyticsv2-application-recordformat-mappingparameters","Required":false,"Type":"MappingParameters","UpdateType":"Mutable"},"RecordFormatType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordformat.html#cfn-kinesisanalyticsv2-application-recordformat-recordformattype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.RunConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-runconfiguration.html","Properties":{"ApplicationRestoreConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-runconfiguration.html#cfn-kinesisanalyticsv2-application-runconfiguration-applicationrestoreconfiguration","Required":false,"Type":"ApplicationRestoreConfiguration","UpdateType":"Mutable"},"FlinkRunConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-runconfiguration.html#cfn-kinesisanalyticsv2-application-runconfiguration-flinkrunconfiguration","Required":false,"Type":"FlinkRunConfiguration","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.S3ContentBaseLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentbaselocation.html","Properties":{"BasePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentbaselocation.html#cfn-kinesisanalyticsv2-application-s3contentbaselocation-basepath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BucketARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentbaselocation.html#cfn-kinesisanalyticsv2-application-s3contentbaselocation-bucketarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.S3ContentLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentlocation.html","Properties":{"BucketARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentlocation.html#cfn-kinesisanalyticsv2-application-s3contentlocation-bucketarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FileKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentlocation.html#cfn-kinesisanalyticsv2-application-s3contentlocation-filekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentlocation.html#cfn-kinesisanalyticsv2-application-s3contentlocation-objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.SqlApplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-sqlapplicationconfiguration.html","Properties":{"Inputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-sqlapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-sqlapplicationconfiguration-inputs","DuplicatesAllowed":true,"ItemType":"Input","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-vpcconfiguration.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-vpcconfiguration.html#cfn-kinesisanalyticsv2-application-vpcconfiguration-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-vpcconfiguration.html#cfn-kinesisanalyticsv2-application-vpcconfiguration-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.ZeppelinApplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinapplicationconfiguration.html","Properties":{"CatalogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-zeppelinapplicationconfiguration-catalogconfiguration","Required":false,"Type":"CatalogConfiguration","UpdateType":"Mutable"},"CustomArtifactsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-zeppelinapplicationconfiguration-customartifactsconfiguration","DuplicatesAllowed":true,"ItemType":"CustomArtifactConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"DeployAsApplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-zeppelinapplicationconfiguration-deployasapplicationconfiguration","Required":false,"Type":"DeployAsApplicationConfiguration","UpdateType":"Mutable"},"MonitoringConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-zeppelinapplicationconfiguration-monitoringconfiguration","Required":false,"Type":"ZeppelinMonitoringConfiguration","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application.ZeppelinMonitoringConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinmonitoringconfiguration.html","Properties":{"LogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinmonitoringconfiguration.html#cfn-kinesisanalyticsv2-application-zeppelinmonitoringconfiguration-loglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption.CloudWatchLoggingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationcloudwatchloggingoption-cloudwatchloggingoption.html","Properties":{"LogStreamARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationcloudwatchloggingoption-cloudwatchloggingoption.html#cfn-kinesisanalyticsv2-applicationcloudwatchloggingoption-cloudwatchloggingoption-logstreamarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationOutput.DestinationSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-destinationschema.html","Properties":{"RecordFormatType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-destinationschema.html#cfn-kinesisanalyticsv2-applicationoutput-destinationschema-recordformattype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationOutput.KinesisFirehoseOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-kinesisfirehoseoutput.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-kinesisfirehoseoutput.html#cfn-kinesisanalyticsv2-applicationoutput-kinesisfirehoseoutput-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationOutput.KinesisStreamsOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-kinesisstreamsoutput.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-kinesisstreamsoutput.html#cfn-kinesisanalyticsv2-applicationoutput-kinesisstreamsoutput-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationOutput.LambdaOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-lambdaoutput.html","Properties":{"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-lambdaoutput.html#cfn-kinesisanalyticsv2-applicationoutput-lambdaoutput-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationOutput.Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html","Properties":{"DestinationSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html#cfn-kinesisanalyticsv2-applicationoutput-output-destinationschema","Required":true,"Type":"DestinationSchema","UpdateType":"Mutable"},"KinesisFirehoseOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html#cfn-kinesisanalyticsv2-applicationoutput-output-kinesisfirehoseoutput","Required":false,"Type":"KinesisFirehoseOutput","UpdateType":"Mutable"},"KinesisStreamsOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html#cfn-kinesisanalyticsv2-applicationoutput-output-kinesisstreamsoutput","Required":false,"Type":"KinesisStreamsOutput","UpdateType":"Mutable"},"LambdaOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html#cfn-kinesisanalyticsv2-applicationoutput-output-lambdaoutput","Required":false,"Type":"LambdaOutput","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html#cfn-kinesisanalyticsv2-applicationoutput-output-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.CSVMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-csvmappingparameters.html","Properties":{"RecordColumnDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-csvmappingparameters.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-csvmappingparameters-recordcolumndelimiter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RecordRowDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-csvmappingparameters.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-csvmappingparameters-recordrowdelimiter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.JSONMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-jsonmappingparameters.html","Properties":{"RecordRowPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-jsonmappingparameters.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-jsonmappingparameters-recordrowpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.MappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-mappingparameters.html","Properties":{"CSVMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-mappingparameters.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-mappingparameters-csvmappingparameters","Required":false,"Type":"CSVMappingParameters","UpdateType":"Mutable"},"JSONMappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-mappingparameters.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-mappingparameters-jsonmappingparameters","Required":false,"Type":"JSONMappingParameters","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.RecordColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn.html","Properties":{"Mapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn-mapping","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SqlType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn-sqltype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.RecordFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordformat.html","Properties":{"MappingParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordformat.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-recordformat-mappingparameters","Required":false,"Type":"MappingParameters","UpdateType":"Mutable"},"RecordFormatType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordformat.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-recordformat-recordformattype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.ReferenceDataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource.html","Properties":{"ReferenceSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource-referenceschema","Required":true,"Type":"ReferenceSchema","UpdateType":"Mutable"},"S3ReferenceDataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource-s3referencedatasource","Required":false,"Type":"S3ReferenceDataSource","UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource-tablename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.ReferenceSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referenceschema.html","Properties":{"RecordColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referenceschema.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referenceschema-recordcolumns","ItemType":"RecordColumn","Required":true,"Type":"List","UpdateType":"Mutable"},"RecordEncoding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referenceschema.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referenceschema-recordencoding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RecordFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referenceschema.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referenceschema-recordformat","Required":true,"Type":"RecordFormat","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.S3ReferenceDataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-s3referencedatasource.html","Properties":{"BucketARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-s3referencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-s3referencedatasource-bucketarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FileKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-s3referencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-s3referencedatasource-filekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.AmazonOpenSearchServerlessBufferingHints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessbufferinghints.html","Properties":{"IntervalInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessbufferinghints.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessbufferinghints-intervalinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SizeInMBs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessbufferinghints.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessbufferinghints-sizeinmbs","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.AmazonOpenSearchServerlessDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration.html","Properties":{"BufferingHints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration-bufferinghints","Required":false,"Type":"AmazonOpenSearchServerlessBufferingHints","UpdateType":"Mutable"},"CloudWatchLoggingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration-cloudwatchloggingoptions","Required":false,"Type":"CloudWatchLoggingOptions","UpdateType":"Mutable"},"CollectionEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration-collectionendpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration-indexname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration-processingconfiguration","Required":false,"Type":"ProcessingConfiguration","UpdateType":"Mutable"},"RetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration-retryoptions","Required":false,"Type":"AmazonOpenSearchServerlessRetryOptions","UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3BackupMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration-s3backupmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration-s3configuration","Required":true,"Type":"S3DestinationConfiguration","UpdateType":"Mutable"},"VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration-vpcconfiguration","Required":false,"Type":"VpcConfiguration","UpdateType":"Immutable"}}},"AWS::KinesisFirehose::DeliveryStream.AmazonOpenSearchServerlessRetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessretryoptions.html","Properties":{"DurationInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserverlessretryoptions.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessretryoptions-durationinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.AmazonopensearchserviceBufferingHints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicebufferinghints.html","Properties":{"IntervalInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicebufferinghints.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicebufferinghints-intervalinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SizeInMBs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicebufferinghints.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicebufferinghints-sizeinmbs","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.AmazonopensearchserviceDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html","Properties":{"BufferingHints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-bufferinghints","Required":false,"Type":"AmazonopensearchserviceBufferingHints","UpdateType":"Mutable"},"CloudWatchLoggingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-cloudwatchloggingoptions","Required":false,"Type":"CloudWatchLoggingOptions","UpdateType":"Mutable"},"ClusterEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-clusterendpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentIdOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-documentidoptions","Required":false,"Type":"DocumentIdOptions","UpdateType":"Mutable"},"DomainARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-domainarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-indexname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IndexRotationPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-indexrotationperiod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-processingconfiguration","Required":false,"Type":"ProcessingConfiguration","UpdateType":"Mutable"},"RetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-retryoptions","Required":false,"Type":"AmazonopensearchserviceRetryOptions","UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3BackupMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-s3backupmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-s3configuration","Required":true,"Type":"S3DestinationConfiguration","UpdateType":"Mutable"},"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-typename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-vpcconfiguration","Required":false,"Type":"VpcConfiguration","UpdateType":"Immutable"}}},"AWS::KinesisFirehose::DeliveryStream.AmazonopensearchserviceRetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserviceretryoptions.html","Properties":{"DurationInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserviceretryoptions.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserviceretryoptions-durationinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.BufferingHints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-bufferinghints.html","Properties":{"IntervalInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-bufferinghints.html#cfn-kinesisfirehose-deliverystream-bufferinghints-intervalinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SizeInMBs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-bufferinghints.html#cfn-kinesisfirehose-deliverystream-bufferinghints-sizeinmbs","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.CloudWatchLoggingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-cloudwatchloggingoptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-cloudwatchloggingoptions.html#cfn-kinesisfirehose-deliverystream-cloudwatchloggingoptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-cloudwatchloggingoptions.html#cfn-kinesisfirehose-deliverystream-cloudwatchloggingoptions-loggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogStreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-cloudwatchloggingoptions.html#cfn-kinesisfirehose-deliverystream-cloudwatchloggingoptions-logstreamname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.CopyCommand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-copycommand.html","Properties":{"CopyOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-copycommand.html#cfn-kinesisfirehose-deliverystream-copycommand-copyoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataTableColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-copycommand.html#cfn-kinesisfirehose-deliverystream-copycommand-datatablecolumns","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataTableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-copycommand.html#cfn-kinesisfirehose-deliverystream-copycommand-datatablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.DataFormatConversionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-dataformatconversionconfiguration.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-dataformatconversionconfiguration.html#cfn-kinesisfirehose-deliverystream-dataformatconversionconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InputFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-dataformatconversionconfiguration.html#cfn-kinesisfirehose-deliverystream-dataformatconversionconfiguration-inputformatconfiguration","Required":false,"Type":"InputFormatConfiguration","UpdateType":"Mutable"},"OutputFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-dataformatconversionconfiguration.html#cfn-kinesisfirehose-deliverystream-dataformatconversionconfiguration-outputformatconfiguration","Required":false,"Type":"OutputFormatConfiguration","UpdateType":"Mutable"},"SchemaConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-dataformatconversionconfiguration.html#cfn-kinesisfirehose-deliverystream-dataformatconversionconfiguration-schemaconfiguration","Required":false,"Type":"SchemaConfiguration","UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.DeliveryStreamEncryptionConfigurationInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput.html","Properties":{"KeyARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput.html#cfn-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput-keyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput.html#cfn-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput-keytype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.Deserializer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-deserializer.html","Properties":{"HiveJsonSerDe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-deserializer.html#cfn-kinesisfirehose-deliverystream-deserializer-hivejsonserde","Required":false,"Type":"HiveJsonSerDe","UpdateType":"Mutable"},"OpenXJsonSerDe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-deserializer.html#cfn-kinesisfirehose-deliverystream-deserializer-openxjsonserde","Required":false,"Type":"OpenXJsonSerDe","UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.DocumentIdOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-documentidoptions.html","Properties":{"DefaultDocumentIdFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-documentidoptions.html#cfn-kinesisfirehose-deliverystream-documentidoptions-defaultdocumentidformat","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.DynamicPartitioningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-dynamicpartitioningconfiguration.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-dynamicpartitioningconfiguration.html#cfn-kinesisfirehose-deliverystream-dynamicpartitioningconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-dynamicpartitioningconfiguration.html#cfn-kinesisfirehose-deliverystream-dynamicpartitioningconfiguration-retryoptions","Required":false,"Type":"RetryOptions","UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.ElasticsearchBufferingHints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchbufferinghints.html","Properties":{"IntervalInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchbufferinghints.html#cfn-kinesisfirehose-deliverystream-elasticsearchbufferinghints-intervalinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SizeInMBs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchbufferinghints.html#cfn-kinesisfirehose-deliverystream-elasticsearchbufferinghints-sizeinmbs","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.ElasticsearchDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html","Properties":{"BufferingHints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-bufferinghints","Required":false,"Type":"ElasticsearchBufferingHints","UpdateType":"Mutable"},"CloudWatchLoggingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-cloudwatchloggingoptions","Required":false,"Type":"CloudWatchLoggingOptions","UpdateType":"Mutable"},"ClusterEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-clusterendpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentIdOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-documentidoptions","Required":false,"Type":"DocumentIdOptions","UpdateType":"Mutable"},"DomainARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-domainarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-indexname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IndexRotationPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-indexrotationperiod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-processingconfiguration","Required":false,"Type":"ProcessingConfiguration","UpdateType":"Mutable"},"RetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-retryoptions","Required":false,"Type":"ElasticsearchRetryOptions","UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3BackupMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-s3backupmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-s3configuration","Required":true,"Type":"S3DestinationConfiguration","UpdateType":"Mutable"},"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-typename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration-vpcconfiguration","Required":false,"Type":"VpcConfiguration","UpdateType":"Immutable"}}},"AWS::KinesisFirehose::DeliveryStream.ElasticsearchRetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchretryoptions.html","Properties":{"DurationInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchretryoptions.html#cfn-kinesisfirehose-deliverystream-elasticsearchretryoptions-durationinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-encryptionconfiguration.html","Properties":{"KMSEncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-encryptionconfiguration.html#cfn-kinesisfirehose-deliverystream-encryptionconfiguration-kmsencryptionconfig","Required":false,"Type":"KMSEncryptionConfig","UpdateType":"Mutable"},"NoEncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-encryptionconfiguration.html#cfn-kinesisfirehose-deliverystream-encryptionconfiguration-noencryptionconfig","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.ExtendedS3DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html","Properties":{"BucketARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-bucketarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BufferingHints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-bufferinghints","Required":false,"Type":"BufferingHints","UpdateType":"Mutable"},"CloudWatchLoggingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-cloudwatchloggingoptions","Required":false,"Type":"CloudWatchLoggingOptions","UpdateType":"Mutable"},"CompressionFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-compressionformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataFormatConversionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-dataformatconversionconfiguration","Required":false,"Type":"DataFormatConversionConfiguration","UpdateType":"Mutable"},"DynamicPartitioningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-dynamicpartitioningconfiguration","Required":false,"Type":"DynamicPartitioningConfiguration","UpdateType":"Mutable"},"EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-encryptionconfiguration","Required":false,"Type":"EncryptionConfiguration","UpdateType":"Mutable"},"ErrorOutputPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-erroroutputprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-processingconfiguration","Required":false,"Type":"ProcessingConfiguration","UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3BackupConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-s3backupconfiguration","Required":false,"Type":"S3DestinationConfiguration","UpdateType":"Mutable"},"S3BackupMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-s3backupmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.HiveJsonSerDe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-hivejsonserde.html","Properties":{"TimestampFormats":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-hivejsonserde.html#cfn-kinesisfirehose-deliverystream-hivejsonserde-timestampformats","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.HttpEndpointCommonAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointcommonattribute.html","Properties":{"AttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointcommonattribute.html#cfn-kinesisfirehose-deliverystream-httpendpointcommonattribute-attributename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AttributeValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointcommonattribute.html#cfn-kinesisfirehose-deliverystream-httpendpointcommonattribute-attributevalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.HttpEndpointConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointconfiguration.html","Properties":{"AccessKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointconfiguration-accesskey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointconfiguration-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointconfiguration-url","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.HttpEndpointDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration.html","Properties":{"BufferingHints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration-bufferinghints","Required":false,"Type":"BufferingHints","UpdateType":"Mutable"},"CloudWatchLoggingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration-cloudwatchloggingoptions","Required":false,"Type":"CloudWatchLoggingOptions","UpdateType":"Mutable"},"EndpointConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration-endpointconfiguration","Required":true,"Type":"HttpEndpointConfiguration","UpdateType":"Mutable"},"ProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration-processingconfiguration","Required":false,"Type":"ProcessingConfiguration","UpdateType":"Mutable"},"RequestConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration-requestconfiguration","Required":false,"Type":"HttpEndpointRequestConfiguration","UpdateType":"Mutable"},"RetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration-retryoptions","Required":false,"Type":"RetryOptions","UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3BackupMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration-s3backupmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration-s3configuration","Required":true,"Type":"S3DestinationConfiguration","UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.HttpEndpointRequestConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointrequestconfiguration.html","Properties":{"CommonAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointrequestconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointrequestconfiguration-commonattributes","DuplicatesAllowed":false,"ItemType":"HttpEndpointCommonAttribute","Required":false,"Type":"List","UpdateType":"Mutable"},"ContentEncoding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-httpendpointrequestconfiguration.html#cfn-kinesisfirehose-deliverystream-httpendpointrequestconfiguration-contentencoding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.InputFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-inputformatconfiguration.html","Properties":{"Deserializer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-inputformatconfiguration.html#cfn-kinesisfirehose-deliverystream-inputformatconfiguration-deserializer","Required":false,"Type":"Deserializer","UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.KMSEncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-kmsencryptionconfig.html","Properties":{"AWSKMSKeyARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-kmsencryptionconfig.html#cfn-kinesisfirehose-deliverystream-kmsencryptionconfig-awskmskeyarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.KinesisStreamSourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration.html","Properties":{"KinesisStreamARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration.html#cfn-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration-kinesisstreamarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration.html#cfn-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::KinesisFirehose::DeliveryStream.OpenXJsonSerDe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-openxjsonserde.html","Properties":{"CaseInsensitive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-openxjsonserde.html#cfn-kinesisfirehose-deliverystream-openxjsonserde-caseinsensitive","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ColumnToJsonKeyMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-openxjsonserde.html#cfn-kinesisfirehose-deliverystream-openxjsonserde-columntojsonkeymappings","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"ConvertDotsInJsonKeysToUnderscores":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-openxjsonserde.html#cfn-kinesisfirehose-deliverystream-openxjsonserde-convertdotsinjsonkeystounderscores","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.OrcSerDe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-orcserde.html","Properties":{"BlockSizeBytes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-orcserde.html#cfn-kinesisfirehose-deliverystream-orcserde-blocksizebytes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"BloomFilterColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-orcserde.html#cfn-kinesisfirehose-deliverystream-orcserde-bloomfiltercolumns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"BloomFilterFalsePositiveProbability":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-orcserde.html#cfn-kinesisfirehose-deliverystream-orcserde-bloomfilterfalsepositiveprobability","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Compression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-orcserde.html#cfn-kinesisfirehose-deliverystream-orcserde-compression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DictionaryKeyThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-orcserde.html#cfn-kinesisfirehose-deliverystream-orcserde-dictionarykeythreshold","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"EnablePadding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-orcserde.html#cfn-kinesisfirehose-deliverystream-orcserde-enablepadding","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"FormatVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-orcserde.html#cfn-kinesisfirehose-deliverystream-orcserde-formatversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PaddingTolerance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-orcserde.html#cfn-kinesisfirehose-deliverystream-orcserde-paddingtolerance","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"RowIndexStride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-orcserde.html#cfn-kinesisfirehose-deliverystream-orcserde-rowindexstride","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StripeSizeBytes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-orcserde.html#cfn-kinesisfirehose-deliverystream-orcserde-stripesizebytes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.OutputFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-outputformatconfiguration.html","Properties":{"Serializer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-outputformatconfiguration.html#cfn-kinesisfirehose-deliverystream-outputformatconfiguration-serializer","Required":false,"Type":"Serializer","UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.ParquetSerDe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-parquetserde.html","Properties":{"BlockSizeBytes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-parquetserde.html#cfn-kinesisfirehose-deliverystream-parquetserde-blocksizebytes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Compression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-parquetserde.html#cfn-kinesisfirehose-deliverystream-parquetserde-compression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableDictionaryCompression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-parquetserde.html#cfn-kinesisfirehose-deliverystream-parquetserde-enabledictionarycompression","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxPaddingBytes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-parquetserde.html#cfn-kinesisfirehose-deliverystream-parquetserde-maxpaddingbytes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PageSizeBytes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-parquetserde.html#cfn-kinesisfirehose-deliverystream-parquetserde-pagesizebytes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"WriterVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-parquetserde.html#cfn-kinesisfirehose-deliverystream-parquetserde-writerversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.ProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-processingconfiguration.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-processingconfiguration.html#cfn-kinesisfirehose-deliverystream-processingconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Processors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-processingconfiguration.html#cfn-kinesisfirehose-deliverystream-processingconfiguration-processors","DuplicatesAllowed":false,"ItemType":"Processor","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.Processor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-processor.html","Properties":{"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-processor.html#cfn-kinesisfirehose-deliverystream-processor-parameters","DuplicatesAllowed":false,"ItemType":"ProcessorParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-processor.html#cfn-kinesisfirehose-deliverystream-processor-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.ProcessorParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-processorparameter.html","Properties":{"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-processorparameter.html#cfn-kinesisfirehose-deliverystream-processorparameter-parametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-processorparameter.html#cfn-kinesisfirehose-deliverystream-processorparameter-parametervalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.RedshiftDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html","Properties":{"CloudWatchLoggingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration-cloudwatchloggingoptions","Required":false,"Type":"CloudWatchLoggingOptions","UpdateType":"Mutable"},"ClusterJDBCURL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration-clusterjdbcurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CopyCommand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration-copycommand","Required":true,"Type":"CopyCommand","UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration-processingconfiguration","Required":false,"Type":"ProcessingConfiguration","UpdateType":"Mutable"},"RetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration-retryoptions","Required":false,"Type":"RedshiftRetryOptions","UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3BackupConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration-s3backupconfiguration","Required":false,"Type":"S3DestinationConfiguration","UpdateType":"Mutable"},"S3BackupMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration-s3backupmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration-s3configuration","Required":true,"Type":"S3DestinationConfiguration","UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.RedshiftRetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftretryoptions.html","Properties":{"DurationInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-redshiftretryoptions.html#cfn-kinesisfirehose-deliverystream-redshiftretryoptions-durationinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.RetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-retryoptions.html","Properties":{"DurationInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-retryoptions.html#cfn-kinesisfirehose-deliverystream-retryoptions-durationinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.S3DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-s3destinationconfiguration.html","Properties":{"BucketARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-s3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-s3destinationconfiguration-bucketarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BufferingHints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-s3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-s3destinationconfiguration-bufferinghints","Required":false,"Type":"BufferingHints","UpdateType":"Mutable"},"CloudWatchLoggingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-s3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-s3destinationconfiguration-cloudwatchloggingoptions","Required":false,"Type":"CloudWatchLoggingOptions","UpdateType":"Mutable"},"CompressionFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-s3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-s3destinationconfiguration-compressionformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-s3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-s3destinationconfiguration-encryptionconfiguration","Required":false,"Type":"EncryptionConfiguration","UpdateType":"Mutable"},"ErrorOutputPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-s3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-s3destinationconfiguration-erroroutputprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-s3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-s3destinationconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-s3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-s3destinationconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.SchemaConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-schemaconfiguration.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-schemaconfiguration.html#cfn-kinesisfirehose-deliverystream-schemaconfiguration-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-schemaconfiguration.html#cfn-kinesisfirehose-deliverystream-schemaconfiguration-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-schemaconfiguration.html#cfn-kinesisfirehose-deliverystream-schemaconfiguration-region","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-schemaconfiguration.html#cfn-kinesisfirehose-deliverystream-schemaconfiguration-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-schemaconfiguration.html#cfn-kinesisfirehose-deliverystream-schemaconfiguration-tablename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VersionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-schemaconfiguration.html#cfn-kinesisfirehose-deliverystream-schemaconfiguration-versionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.Serializer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-serializer.html","Properties":{"OrcSerDe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-serializer.html#cfn-kinesisfirehose-deliverystream-serializer-orcserde","Required":false,"Type":"OrcSerDe","UpdateType":"Mutable"},"ParquetSerDe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-serializer.html#cfn-kinesisfirehose-deliverystream-serializer-parquetserde","Required":false,"Type":"ParquetSerDe","UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.SplunkDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkdestinationconfiguration.html","Properties":{"CloudWatchLoggingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-splunkdestinationconfiguration-cloudwatchloggingoptions","Required":false,"Type":"CloudWatchLoggingOptions","UpdateType":"Mutable"},"HECAcknowledgmentTimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-splunkdestinationconfiguration-hecacknowledgmenttimeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HECEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-splunkdestinationconfiguration-hecendpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HECEndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-splunkdestinationconfiguration-hecendpointtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HECToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-splunkdestinationconfiguration-hectoken","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProcessingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-splunkdestinationconfiguration-processingconfiguration","Required":false,"Type":"ProcessingConfiguration","UpdateType":"Mutable"},"RetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-splunkdestinationconfiguration-retryoptions","Required":false,"Type":"SplunkRetryOptions","UpdateType":"Mutable"},"S3BackupMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-splunkdestinationconfiguration-s3backupmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkdestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-splunkdestinationconfiguration-s3configuration","Required":true,"Type":"S3DestinationConfiguration","UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.SplunkRetryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkretryoptions.html","Properties":{"DurationInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-splunkretryoptions.html#cfn-kinesisfirehose-deliverystream-splunkretryoptions-durationinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream.VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-vpcconfiguration.html","Properties":{"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-vpcconfiguration.html#cfn-kinesisfirehose-deliverystream-vpcconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-vpcconfiguration.html#cfn-kinesisfirehose-deliverystream-vpcconfiguration-securitygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-vpcconfiguration.html#cfn-kinesisfirehose-deliverystream-vpcconfiguration-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::LakeFormation::DataCellsFilter.ColumnWildcard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datacellsfilter-columnwildcard.html","Properties":{"ExcludedColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datacellsfilter-columnwildcard.html#cfn-lakeformation-datacellsfilter-columnwildcard-excludedcolumnnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::LakeFormation::DataCellsFilter.RowFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datacellsfilter-rowfilter.html","Properties":{"AllRowsWildcard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datacellsfilter-rowfilter.html#cfn-lakeformation-datacellsfilter-rowfilter-allrowswildcard","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"FilterExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datacellsfilter-rowfilter.html#cfn-lakeformation-datacellsfilter-rowfilter-filterexpression","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::LakeFormation::DataLakeSettings.Admins":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datalakesettings-admins.html","ItemType":"DataLakePrincipal","Required":false,"Type":"List","UpdateType":"Mutable"},"AWS::LakeFormation::DataLakeSettings.CreateDatabaseDefaultPermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datalakesettings-createdatabasedefaultpermissions.html","ItemType":"PrincipalPermissions","Required":false,"Type":"List","UpdateType":"Mutable"},"AWS::LakeFormation::DataLakeSettings.CreateTableDefaultPermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datalakesettings-createtabledefaultpermissions.html","ItemType":"PrincipalPermissions","Required":false,"Type":"List","UpdateType":"Mutable"},"AWS::LakeFormation::DataLakeSettings.DataLakePrincipal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datalakesettings-datalakeprincipal.html","Properties":{"DataLakePrincipalIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datalakesettings-datalakeprincipal.html#cfn-lakeformation-datalakesettings-datalakeprincipal-datalakeprincipalidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::LakeFormation::DataLakeSettings.ExternalDataFilteringAllowList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datalakesettings-externaldatafilteringallowlist.html","ItemType":"DataLakePrincipal","Required":false,"Type":"List","UpdateType":"Mutable"},"AWS::LakeFormation::DataLakeSettings.PrincipalPermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datalakesettings-principalpermissions.html","Properties":{"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datalakesettings-principalpermissions.html#cfn-lakeformation-datalakesettings-principalpermissions-permissions","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-datalakesettings-principalpermissions.html#cfn-lakeformation-datalakesettings-principalpermissions-principal","Required":true,"Type":"DataLakePrincipal","UpdateType":"Mutable"}}},"AWS::LakeFormation::Permissions.ColumnWildcard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-columnwildcard.html","Properties":{"ExcludedColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-columnwildcard.html#cfn-lakeformation-permissions-columnwildcard-excludedcolumnnames","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::LakeFormation::Permissions.DataLakePrincipal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-datalakeprincipal.html","Properties":{"DataLakePrincipalIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-datalakeprincipal.html#cfn-lakeformation-permissions-datalakeprincipal-datalakeprincipalidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LakeFormation::Permissions.DataLocationResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-datalocationresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-datalocationresource.html#cfn-lakeformation-permissions-datalocationresource-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-datalocationresource.html#cfn-lakeformation-permissions-datalocationresource-s3resource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LakeFormation::Permissions.DatabaseResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-databaseresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-databaseresource.html#cfn-lakeformation-permissions-databaseresource-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-databaseresource.html#cfn-lakeformation-permissions-databaseresource-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LakeFormation::Permissions.Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-resource.html","Properties":{"DataLocationResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-resource.html#cfn-lakeformation-permissions-resource-datalocationresource","Required":false,"Type":"DataLocationResource","UpdateType":"Mutable"},"DatabaseResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-resource.html#cfn-lakeformation-permissions-resource-databaseresource","Required":false,"Type":"DatabaseResource","UpdateType":"Mutable"},"TableResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-resource.html#cfn-lakeformation-permissions-resource-tableresource","Required":false,"Type":"TableResource","UpdateType":"Mutable"},"TableWithColumnsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-resource.html#cfn-lakeformation-permissions-resource-tablewithcolumnsresource","Required":false,"Type":"TableWithColumnsResource","UpdateType":"Mutable"}}},"AWS::LakeFormation::Permissions.TableResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tableresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tableresource.html#cfn-lakeformation-permissions-tableresource-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tableresource.html#cfn-lakeformation-permissions-tableresource-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tableresource.html#cfn-lakeformation-permissions-tableresource-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TableWildcard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tableresource.html#cfn-lakeformation-permissions-tableresource-tablewildcard","Required":false,"Type":"TableWildcard","UpdateType":"Mutable"}}},"AWS::LakeFormation::Permissions.TableWildcard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tablewildcard.html","Properties":{}},"AWS::LakeFormation::Permissions.TableWithColumnsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tablewithcolumnsresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tablewithcolumnsresource.html#cfn-lakeformation-permissions-tablewithcolumnsresource-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tablewithcolumnsresource.html#cfn-lakeformation-permissions-tablewithcolumnsresource-columnnames","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ColumnWildcard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tablewithcolumnsresource.html#cfn-lakeformation-permissions-tablewithcolumnsresource-columnwildcard","Required":false,"Type":"ColumnWildcard","UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tablewithcolumnsresource.html#cfn-lakeformation-permissions-tablewithcolumnsresource-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-permissions-tablewithcolumnsresource.html#cfn-lakeformation-permissions-tablewithcolumnsresource-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LakeFormation::PrincipalPermissions.ColumnWildcard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-columnwildcard.html","Properties":{"ExcludedColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-columnwildcard.html#cfn-lakeformation-principalpermissions-columnwildcard-excludedcolumnnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::LakeFormation::PrincipalPermissions.DataCellsFilterResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-datacellsfilterresource.html","Properties":{"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-datacellsfilterresource.html#cfn-lakeformation-principalpermissions-datacellsfilterresource-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-datacellsfilterresource.html#cfn-lakeformation-principalpermissions-datacellsfilterresource-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TableCatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-datacellsfilterresource.html#cfn-lakeformation-principalpermissions-datacellsfilterresource-tablecatalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-datacellsfilterresource.html#cfn-lakeformation-principalpermissions-datacellsfilterresource-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::LakeFormation::PrincipalPermissions.DataLakePrincipal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-datalakeprincipal.html","Properties":{"DataLakePrincipalIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-datalakeprincipal.html#cfn-lakeformation-principalpermissions-datalakeprincipal-datalakeprincipalidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::LakeFormation::PrincipalPermissions.DataLocationResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-datalocationresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-datalocationresource.html#cfn-lakeformation-principalpermissions-datalocationresource-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-datalocationresource.html#cfn-lakeformation-principalpermissions-datalocationresource-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::LakeFormation::PrincipalPermissions.DatabaseResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-databaseresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-databaseresource.html#cfn-lakeformation-principalpermissions-databaseresource-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-databaseresource.html#cfn-lakeformation-principalpermissions-databaseresource-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::LakeFormation::PrincipalPermissions.LFTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-lftag.html","Properties":{"TagKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-lftag.html#cfn-lakeformation-principalpermissions-lftag-tagkey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TagValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-lftag.html#cfn-lakeformation-principalpermissions-lftag-tagvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::LakeFormation::PrincipalPermissions.LFTagKeyResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-lftagkeyresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-lftagkeyresource.html#cfn-lakeformation-principalpermissions-lftagkeyresource-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TagKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-lftagkeyresource.html#cfn-lakeformation-principalpermissions-lftagkeyresource-tagkey","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TagValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-lftagkeyresource.html#cfn-lakeformation-principalpermissions-lftagkeyresource-tagvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::LakeFormation::PrincipalPermissions.LFTagPolicyResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-lftagpolicyresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-lftagpolicyresource.html#cfn-lakeformation-principalpermissions-lftagpolicyresource-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-lftagpolicyresource.html#cfn-lakeformation-principalpermissions-lftagpolicyresource-expression","DuplicatesAllowed":true,"ItemType":"LFTag","Required":true,"Type":"List","UpdateType":"Immutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-lftagpolicyresource.html#cfn-lakeformation-principalpermissions-lftagpolicyresource-resourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::LakeFormation::PrincipalPermissions.Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-resource.html","Properties":{"Catalog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-resource.html#cfn-lakeformation-principalpermissions-resource-catalog","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"DataCellsFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-resource.html#cfn-lakeformation-principalpermissions-resource-datacellsfilter","Required":false,"Type":"DataCellsFilterResource","UpdateType":"Immutable"},"DataLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-resource.html#cfn-lakeformation-principalpermissions-resource-datalocation","Required":false,"Type":"DataLocationResource","UpdateType":"Immutable"},"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-resource.html#cfn-lakeformation-principalpermissions-resource-database","Required":false,"Type":"DatabaseResource","UpdateType":"Immutable"},"LFTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-resource.html#cfn-lakeformation-principalpermissions-resource-lftag","Required":false,"Type":"LFTagKeyResource","UpdateType":"Immutable"},"LFTagPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-resource.html#cfn-lakeformation-principalpermissions-resource-lftagpolicy","Required":false,"Type":"LFTagPolicyResource","UpdateType":"Immutable"},"Table":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-resource.html#cfn-lakeformation-principalpermissions-resource-table","Required":false,"Type":"TableResource","UpdateType":"Immutable"},"TableWithColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-resource.html#cfn-lakeformation-principalpermissions-resource-tablewithcolumns","Required":false,"Type":"TableWithColumnsResource","UpdateType":"Immutable"}}},"AWS::LakeFormation::PrincipalPermissions.TableResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-tableresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-tableresource.html#cfn-lakeformation-principalpermissions-tableresource-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-tableresource.html#cfn-lakeformation-principalpermissions-tableresource-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-tableresource.html#cfn-lakeformation-principalpermissions-tableresource-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TableWildcard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-tableresource.html#cfn-lakeformation-principalpermissions-tableresource-tablewildcard","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"}}},"AWS::LakeFormation::PrincipalPermissions.TableWithColumnsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-tablewithcolumnsresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-tablewithcolumnsresource.html#cfn-lakeformation-principalpermissions-tablewithcolumnsresource-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-tablewithcolumnsresource.html#cfn-lakeformation-principalpermissions-tablewithcolumnsresource-columnnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ColumnWildcard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-tablewithcolumnsresource.html#cfn-lakeformation-principalpermissions-tablewithcolumnsresource-columnwildcard","Required":false,"Type":"ColumnWildcard","UpdateType":"Immutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-tablewithcolumnsresource.html#cfn-lakeformation-principalpermissions-tablewithcolumnsresource-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-principalpermissions-tablewithcolumnsresource.html#cfn-lakeformation-principalpermissions-tablewithcolumnsresource-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::LakeFormation::TagAssociation.DatabaseResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-databaseresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-databaseresource.html#cfn-lakeformation-tagassociation-databaseresource-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-databaseresource.html#cfn-lakeformation-tagassociation-databaseresource-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::LakeFormation::TagAssociation.LFTagPair":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-lftagpair.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-lftagpair.html#cfn-lakeformation-tagassociation-lftagpair-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TagKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-lftagpair.html#cfn-lakeformation-tagassociation-lftagpair-tagkey","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TagValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-lftagpair.html#cfn-lakeformation-tagassociation-lftagpair-tagvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::LakeFormation::TagAssociation.Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-resource.html","Properties":{"Catalog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-resource.html#cfn-lakeformation-tagassociation-resource-catalog","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-resource.html#cfn-lakeformation-tagassociation-resource-database","Required":false,"Type":"DatabaseResource","UpdateType":"Immutable"},"Table":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-resource.html#cfn-lakeformation-tagassociation-resource-table","Required":false,"Type":"TableResource","UpdateType":"Immutable"},"TableWithColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-resource.html#cfn-lakeformation-tagassociation-resource-tablewithcolumns","Required":false,"Type":"TableWithColumnsResource","UpdateType":"Immutable"}}},"AWS::LakeFormation::TagAssociation.TableResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-tableresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-tableresource.html#cfn-lakeformation-tagassociation-tableresource-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-tableresource.html#cfn-lakeformation-tagassociation-tableresource-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-tableresource.html#cfn-lakeformation-tagassociation-tableresource-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TableWildcard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-tableresource.html#cfn-lakeformation-tagassociation-tableresource-tablewildcard","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"}}},"AWS::LakeFormation::TagAssociation.TableWithColumnsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-tablewithcolumnsresource.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-tablewithcolumnsresource.html#cfn-lakeformation-tagassociation-tablewithcolumnsresource-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-tablewithcolumnsresource.html#cfn-lakeformation-tagassociation-tablewithcolumnsresource-columnnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-tablewithcolumnsresource.html#cfn-lakeformation-tagassociation-tablewithcolumnsresource-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lakeformation-tagassociation-tablewithcolumnsresource.html#cfn-lakeformation-tagassociation-tablewithcolumnsresource-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Lambda::Alias.AliasRoutingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-alias-aliasroutingconfiguration.html","Properties":{"AdditionalVersionWeights":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-alias-aliasroutingconfiguration.html#cfn-lambda-alias-aliasroutingconfiguration-additionalversionweights","DuplicatesAllowed":false,"ItemType":"VersionWeight","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lambda::Alias.ProvisionedConcurrencyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-alias-provisionedconcurrencyconfiguration.html","Properties":{"ProvisionedConcurrentExecutions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-alias-provisionedconcurrencyconfiguration.html#cfn-lambda-alias-provisionedconcurrencyconfiguration-provisionedconcurrentexecutions","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Lambda::Alias.VersionWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-alias-versionweight.html","Properties":{"FunctionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-alias-versionweight.html#cfn-lambda-alias-versionweight-functionversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FunctionWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-alias-versionweight.html#cfn-lambda-alias-versionweight-functionweight","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::Lambda::CodeSigningConfig.AllowedPublishers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-codesigningconfig-allowedpublishers.html","Properties":{"SigningProfileVersionArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-codesigningconfig-allowedpublishers.html#cfn-lambda-codesigningconfig-allowedpublishers-signingprofileversionarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lambda::CodeSigningConfig.CodeSigningPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-codesigningconfig-codesigningpolicies.html","Properties":{"UntrustedArtifactOnDeployment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-codesigningconfig-codesigningpolicies.html#cfn-lambda-codesigningconfig-codesigningpolicies-untrustedartifactondeployment","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lambda::EventInvokeConfig.DestinationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventinvokeconfig-destinationconfig.html","Properties":{"OnFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventinvokeconfig-destinationconfig.html#cfn-lambda-eventinvokeconfig-destinationconfig-onfailure","Required":false,"Type":"OnFailure","UpdateType":"Mutable"},"OnSuccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventinvokeconfig-destinationconfig.html#cfn-lambda-eventinvokeconfig-destinationconfig-onsuccess","Required":false,"Type":"OnSuccess","UpdateType":"Mutable"}}},"AWS::Lambda::EventInvokeConfig.OnFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventinvokeconfig-destinationconfig-onfailure.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventinvokeconfig-destinationconfig-onfailure.html#cfn-lambda-eventinvokeconfig-destinationconfig-onfailure-destination","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lambda::EventInvokeConfig.OnSuccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventinvokeconfig-destinationconfig-onsuccess.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventinvokeconfig-destinationconfig-onsuccess.html#cfn-lambda-eventinvokeconfig-destinationconfig-onsuccess-destination","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lambda::EventSourceMapping.AmazonManagedKafkaEventSourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-amazonmanagedkafkaeventsourceconfig.html","Properties":{"ConsumerGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-amazonmanagedkafkaeventsourceconfig.html#cfn-lambda-eventsourcemapping-amazonmanagedkafkaeventsourceconfig-consumergroupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Lambda::EventSourceMapping.DestinationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-destinationconfig.html","Properties":{"OnFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-destinationconfig.html#cfn-lambda-eventsourcemapping-destinationconfig-onfailure","Required":false,"Type":"OnFailure","UpdateType":"Mutable"}}},"AWS::Lambda::EventSourceMapping.DocumentDBEventSourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-documentdbeventsourceconfig.html","Properties":{"CollectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-documentdbeventsourceconfig.html#cfn-lambda-eventsourcemapping-documentdbeventsourceconfig-collectionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-documentdbeventsourceconfig.html#cfn-lambda-eventsourcemapping-documentdbeventsourceconfig-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FullDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-documentdbeventsourceconfig.html#cfn-lambda-eventsourcemapping-documentdbeventsourceconfig-fulldocument","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::EventSourceMapping.Endpoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-endpoints.html","Properties":{"KafkaBootstrapServers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-endpoints.html#cfn-lambda-eventsourcemapping-endpoints-kafkabootstrapservers","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Lambda::EventSourceMapping.Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-filter.html","Properties":{"Pattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-filter.html#cfn-lambda-eventsourcemapping-filter-pattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::EventSourceMapping.FilterCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-filtercriteria.html","Properties":{"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-filtercriteria.html#cfn-lambda-eventsourcemapping-filtercriteria-filters","DuplicatesAllowed":false,"ItemType":"Filter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lambda::EventSourceMapping.OnFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-onfailure.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-onfailure.html#cfn-lambda-eventsourcemapping-onfailure-destination","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::EventSourceMapping.ScalingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-scalingconfig.html","Properties":{"MaximumConcurrency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-scalingconfig.html#cfn-lambda-eventsourcemapping-scalingconfig-maximumconcurrency","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::EventSourceMapping.SelfManagedEventSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-selfmanagedeventsource.html","Properties":{"Endpoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-selfmanagedeventsource.html#cfn-lambda-eventsourcemapping-selfmanagedeventsource-endpoints","Required":false,"Type":"Endpoints","UpdateType":"Immutable"}}},"AWS::Lambda::EventSourceMapping.SelfManagedKafkaEventSourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-selfmanagedkafkaeventsourceconfig.html","Properties":{"ConsumerGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-selfmanagedkafkaeventsourceconfig.html#cfn-lambda-eventsourcemapping-selfmanagedkafkaeventsourceconfig-consumergroupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Lambda::EventSourceMapping.SourceAccessConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-sourceaccessconfiguration.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-sourceaccessconfiguration.html#cfn-lambda-eventsourcemapping-sourceaccessconfiguration-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"URI":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-sourceaccessconfiguration.html#cfn-lambda-eventsourcemapping-sourceaccessconfiguration-uri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::Function.Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html","Properties":{"ImageUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#cfn-lambda-function-code-imageuri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#cfn-lambda-function-code-s3bucket","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#cfn-lambda-function-code-s3key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#cfn-lambda-function-code-s3objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ZipFile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#cfn-lambda-function-code-zipfile","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::Function.DeadLetterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-deadletterconfig.html","Properties":{"TargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-deadletterconfig.html#cfn-lambda-function-deadletterconfig-targetarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::Function.Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-environment.html","Properties":{"Variables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-environment.html#cfn-lambda-function-environment-variables","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::Lambda::Function.EphemeralStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-ephemeralstorage.html","Properties":{"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-ephemeralstorage.html#cfn-lambda-function-ephemeralstorage-size","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Lambda::Function.FileSystemConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-filesystemconfig.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-filesystemconfig.html#cfn-lambda-function-filesystemconfig-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LocalMountPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-filesystemconfig.html#cfn-lambda-function-filesystemconfig-localmountpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lambda::Function.ImageConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-imageconfig.html","Properties":{"Command":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-imageconfig.html#cfn-lambda-function-imageconfig-command","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"EntryPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-imageconfig.html#cfn-lambda-function-imageconfig-entrypoint","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"WorkingDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-imageconfig.html#cfn-lambda-function-imageconfig-workingdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::Function.RuntimeManagementConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-runtimemanagementconfig.html","Properties":{"RuntimeVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-runtimemanagementconfig.html#cfn-lambda-function-runtimemanagementconfig-runtimeversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UpdateRuntimeOn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-runtimemanagementconfig.html#cfn-lambda-function-runtimemanagementconfig-updateruntimeon","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lambda::Function.SnapStart":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-snapstart.html","Properties":{"ApplyOn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-snapstart.html#cfn-lambda-function-snapstart-applyon","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lambda::Function.SnapStartResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-snapstartresponse.html","Properties":{"ApplyOn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-snapstartresponse.html#cfn-lambda-function-snapstartresponse-applyon","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OptimizationStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-snapstartresponse.html#cfn-lambda-function-snapstartresponse-optimizationstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::Function.TracingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-tracingconfig.html","Properties":{"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-tracingconfig.html#cfn-lambda-function-tracingconfig-mode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::Function.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-vpcconfig.html#cfn-lambda-function-vpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-vpcconfig.html#cfn-lambda-function-vpcconfig-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lambda::LayerVersion.Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-layerversion-content.html","Properties":{"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-layerversion-content.html#cfn-lambda-layerversion-content-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-layerversion-content.html#cfn-lambda-layerversion-content-s3key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-layerversion-content.html#cfn-lambda-layerversion-content-s3objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Lambda::Url.Cors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html","Properties":{"AllowCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-allowcredentials","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AllowHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-allowheaders","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AllowMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-allowmethods","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AllowOrigins":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-alloworigins","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ExposeHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-exposeheaders","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MaxAge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-maxage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::Version.ProvisionedConcurrencyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-version-provisionedconcurrencyconfiguration.html","Properties":{"ProvisionedConcurrentExecutions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-version-provisionedconcurrencyconfiguration.html#cfn-lambda-version-provisionedconcurrencyconfiguration-provisionedconcurrentexecutions","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.AdvancedRecognitionSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-advancedrecognitionsetting.html","Properties":{"AudioRecognitionStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-advancedrecognitionsetting.html#cfn-lex-bot-advancedrecognitionsetting-audiorecognitionstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.AllowedInputTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-allowedinputtypes.html","Properties":{"AllowAudioInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-allowedinputtypes.html#cfn-lex-bot-allowedinputtypes-allowaudioinput","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"AllowDTMFInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-allowedinputtypes.html#cfn-lex-bot-allowedinputtypes-allowdtmfinput","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.AudioAndDTMFInputSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audioanddtmfinputspecification.html","Properties":{"AudioSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audioanddtmfinputspecification.html#cfn-lex-bot-audioanddtmfinputspecification-audiospecification","Required":false,"Type":"AudioSpecification","UpdateType":"Mutable"},"DTMFSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audioanddtmfinputspecification.html#cfn-lex-bot-audioanddtmfinputspecification-dtmfspecification","Required":false,"Type":"DTMFSpecification","UpdateType":"Mutable"},"StartTimeoutMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audioanddtmfinputspecification.html#cfn-lex-bot-audioanddtmfinputspecification-starttimeoutms","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.AudioLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiologdestination.html","Properties":{"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiologdestination.html#cfn-lex-bot-audiologdestination-s3bucket","Required":true,"Type":"S3BucketLogDestination","UpdateType":"Mutable"}}},"AWS::Lex::Bot.AudioLogSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiologsetting.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiologsetting.html#cfn-lex-bot-audiologsetting-destination","Required":true,"Type":"AudioLogDestination","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiologsetting.html#cfn-lex-bot-audiologsetting-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.AudioSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiospecification.html","Properties":{"EndTimeoutMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiospecification.html#cfn-lex-bot-audiospecification-endtimeoutms","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MaxLengthMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiospecification.html#cfn-lex-bot-audiospecification-maxlengthms","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.BotAliasLocaleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettings.html","Properties":{"CodeHookSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettings.html#cfn-lex-bot-botaliaslocalesettings-codehookspecification","Required":false,"Type":"CodeHookSpecification","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettings.html#cfn-lex-bot-botaliaslocalesettings-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.BotAliasLocaleSettingsItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettingsitem.html","Properties":{"BotAliasLocaleSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettingsitem.html#cfn-lex-bot-botaliaslocalesettingsitem-botaliaslocalesetting","Required":true,"Type":"BotAliasLocaleSettings","UpdateType":"Mutable"},"LocaleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettingsitem.html#cfn-lex-bot-botaliaslocalesettingsitem-localeid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.BotLocale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html","Properties":{"CustomVocabulary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-customvocabulary","Required":false,"Type":"CustomVocabulary","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Intents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-intents","DuplicatesAllowed":false,"ItemType":"Intent","Required":false,"Type":"List","UpdateType":"Mutable"},"LocaleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-localeid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NluConfidenceThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-nluconfidencethreshold","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"SlotTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-slottypes","DuplicatesAllowed":false,"ItemType":"SlotType","Required":false,"Type":"List","UpdateType":"Mutable"},"VoiceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-voicesettings","Required":false,"Type":"VoiceSettings","UpdateType":"Mutable"}}},"AWS::Lex::Bot.Button":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-button.html","Properties":{"Text":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-button.html#cfn-lex-bot-button-text","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-button.html#cfn-lex-bot-button-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.CloudWatchLogGroupLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-cloudwatchloggrouplogdestination.html","Properties":{"CloudWatchLogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-cloudwatchloggrouplogdestination.html#cfn-lex-bot-cloudwatchloggrouplogdestination-cloudwatchloggrouparn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-cloudwatchloggrouplogdestination.html#cfn-lex-bot-cloudwatchloggrouplogdestination-logprefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.CodeHookSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-codehookspecification.html","Properties":{"LambdaCodeHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-codehookspecification.html#cfn-lex-bot-codehookspecification-lambdacodehook","Required":true,"Type":"LambdaCodeHook","UpdateType":"Mutable"}}},"AWS::Lex::Bot.Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-condition.html","Properties":{"ExpressionString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-condition.html#cfn-lex-bot-condition-expressionstring","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.ConditionalBranch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conditionalbranch.html","Properties":{"Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conditionalbranch.html#cfn-lex-bot-conditionalbranch-condition","Required":true,"Type":"Condition","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conditionalbranch.html#cfn-lex-bot-conditionalbranch-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conditionalbranch.html#cfn-lex-bot-conditionalbranch-nextstep","Required":true,"Type":"DialogState","UpdateType":"Mutable"},"Response":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conditionalbranch.html#cfn-lex-bot-conditionalbranch-response","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"}}},"AWS::Lex::Bot.ConditionalSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conditionalspecification.html","Properties":{"ConditionalBranches":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conditionalspecification.html#cfn-lex-bot-conditionalspecification-conditionalbranches","DuplicatesAllowed":true,"ItemType":"ConditionalBranch","Required":true,"Type":"List","UpdateType":"Mutable"},"DefaultBranch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conditionalspecification.html#cfn-lex-bot-conditionalspecification-defaultbranch","Required":true,"Type":"DefaultConditionalBranch","UpdateType":"Mutable"},"IsActive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conditionalspecification.html#cfn-lex-bot-conditionalspecification-isactive","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.ConversationLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conversationlogsettings.html","Properties":{"AudioLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conversationlogsettings.html#cfn-lex-bot-conversationlogsettings-audiologsettings","DuplicatesAllowed":false,"ItemType":"AudioLogSetting","Required":false,"Type":"List","UpdateType":"Mutable"},"TextLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conversationlogsettings.html#cfn-lex-bot-conversationlogsettings-textlogsettings","DuplicatesAllowed":false,"ItemType":"TextLogSetting","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.CustomPayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-custompayload.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-custompayload.html#cfn-lex-bot-custompayload-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.CustomVocabulary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-customvocabulary.html","Properties":{"CustomVocabularyItems":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-customvocabulary.html#cfn-lex-bot-customvocabulary-customvocabularyitems","DuplicatesAllowed":false,"ItemType":"CustomVocabularyItem","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.CustomVocabularyItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-customvocabularyitem.html","Properties":{"DisplayAs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-customvocabularyitem.html#cfn-lex-bot-customvocabularyitem-displayas","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Phrase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-customvocabularyitem.html#cfn-lex-bot-customvocabularyitem-phrase","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-customvocabularyitem.html#cfn-lex-bot-customvocabularyitem-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.DTMFSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dtmfspecification.html","Properties":{"DeletionCharacter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dtmfspecification.html#cfn-lex-bot-dtmfspecification-deletioncharacter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EndCharacter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dtmfspecification.html#cfn-lex-bot-dtmfspecification-endcharacter","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EndTimeoutMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dtmfspecification.html#cfn-lex-bot-dtmfspecification-endtimeoutms","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MaxLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dtmfspecification.html#cfn-lex-bot-dtmfspecification-maxlength","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.DataPrivacy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dataprivacy.html","Properties":{"ChildDirected":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dataprivacy.html#cfn-lex-bot-dataprivacy-childdirected","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.DefaultConditionalBranch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-defaultconditionalbranch.html","Properties":{"NextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-defaultconditionalbranch.html#cfn-lex-bot-defaultconditionalbranch-nextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"Response":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-defaultconditionalbranch.html#cfn-lex-bot-defaultconditionalbranch-response","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"}}},"AWS::Lex::Bot.DialogAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogaction.html","Properties":{"SlotToElicit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogaction.html#cfn-lex-bot-dialogaction-slottoelicit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SuppressNextMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogaction.html#cfn-lex-bot-dialogaction-suppressnextmessage","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogaction.html#cfn-lex-bot-dialogaction-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.DialogCodeHookInvocationSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogcodehookinvocationsetting.html","Properties":{"EnableCodeHookInvocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogcodehookinvocationsetting.html#cfn-lex-bot-dialogcodehookinvocationsetting-enablecodehookinvocation","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"InvocationLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogcodehookinvocationsetting.html#cfn-lex-bot-dialogcodehookinvocationsetting-invocationlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IsActive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogcodehookinvocationsetting.html#cfn-lex-bot-dialogcodehookinvocationsetting-isactive","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"PostCodeHookSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogcodehookinvocationsetting.html#cfn-lex-bot-dialogcodehookinvocationsetting-postcodehookspecification","Required":true,"Type":"PostDialogCodeHookInvocationSpecification","UpdateType":"Mutable"}}},"AWS::Lex::Bot.DialogCodeHookSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogcodehooksetting.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogcodehooksetting.html#cfn-lex-bot-dialogcodehooksetting-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.DialogState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogstate.html","Properties":{"DialogAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogstate.html#cfn-lex-bot-dialogstate-dialogaction","Required":false,"Type":"DialogAction","UpdateType":"Mutable"},"Intent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogstate.html#cfn-lex-bot-dialogstate-intent","Required":false,"Type":"IntentOverride","UpdateType":"Mutable"},"SessionAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogstate.html#cfn-lex-bot-dialogstate-sessionattributes","DuplicatesAllowed":true,"ItemType":"SessionAttribute","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.ElicitationCodeHookInvocationSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-elicitationcodehookinvocationsetting.html","Properties":{"EnableCodeHookInvocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-elicitationcodehookinvocationsetting.html#cfn-lex-bot-elicitationcodehookinvocationsetting-enablecodehookinvocation","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"InvocationLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-elicitationcodehookinvocationsetting.html#cfn-lex-bot-elicitationcodehookinvocationsetting-invocationlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.ExternalSourceSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-externalsourcesetting.html","Properties":{"GrammarSlotTypeSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-externalsourcesetting.html#cfn-lex-bot-externalsourcesetting-grammarslottypesetting","Required":false,"Type":"GrammarSlotTypeSetting","UpdateType":"Mutable"}}},"AWS::Lex::Bot.FulfillmentCodeHookSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentcodehooksetting.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentcodehooksetting.html#cfn-lex-bot-fulfillmentcodehooksetting-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"FulfillmentUpdatesSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentcodehooksetting.html#cfn-lex-bot-fulfillmentcodehooksetting-fulfillmentupdatesspecification","Required":false,"Type":"FulfillmentUpdatesSpecification","UpdateType":"Mutable"},"IsActive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentcodehooksetting.html#cfn-lex-bot-fulfillmentcodehooksetting-isactive","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PostFulfillmentStatusSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentcodehooksetting.html#cfn-lex-bot-fulfillmentcodehooksetting-postfulfillmentstatusspecification","Required":false,"Type":"PostFulfillmentStatusSpecification","UpdateType":"Mutable"}}},"AWS::Lex::Bot.FulfillmentStartResponseSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentstartresponsespecification.html","Properties":{"AllowInterrupt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentstartresponsespecification.html#cfn-lex-bot-fulfillmentstartresponsespecification-allowinterrupt","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DelayInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentstartresponsespecification.html#cfn-lex-bot-fulfillmentstartresponsespecification-delayinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MessageGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentstartresponsespecification.html#cfn-lex-bot-fulfillmentstartresponsespecification-messagegroups","DuplicatesAllowed":true,"ItemType":"MessageGroup","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.FulfillmentUpdateResponseSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdateresponsespecification.html","Properties":{"AllowInterrupt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdateresponsespecification.html#cfn-lex-bot-fulfillmentupdateresponsespecification-allowinterrupt","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"FrequencyInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdateresponsespecification.html#cfn-lex-bot-fulfillmentupdateresponsespecification-frequencyinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MessageGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdateresponsespecification.html#cfn-lex-bot-fulfillmentupdateresponsespecification-messagegroups","DuplicatesAllowed":true,"ItemType":"MessageGroup","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.FulfillmentUpdatesSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdatesspecification.html","Properties":{"Active":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdatesspecification.html#cfn-lex-bot-fulfillmentupdatesspecification-active","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"StartResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdatesspecification.html#cfn-lex-bot-fulfillmentupdatesspecification-startresponse","Required":false,"Type":"FulfillmentStartResponseSpecification","UpdateType":"Mutable"},"TimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdatesspecification.html#cfn-lex-bot-fulfillmentupdatesspecification-timeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UpdateResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdatesspecification.html#cfn-lex-bot-fulfillmentupdatesspecification-updateresponse","Required":false,"Type":"FulfillmentUpdateResponseSpecification","UpdateType":"Mutable"}}},"AWS::Lex::Bot.GrammarSlotTypeSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesetting.html","Properties":{"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesetting.html#cfn-lex-bot-grammarslottypesetting-source","Required":false,"Type":"GrammarSlotTypeSource","UpdateType":"Mutable"}}},"AWS::Lex::Bot.GrammarSlotTypeSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesource.html","Properties":{"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesource.html#cfn-lex-bot-grammarslottypesource-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesource.html#cfn-lex-bot-grammarslottypesource-s3bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3ObjectKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesource.html#cfn-lex-bot-grammarslottypesource-s3objectkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.ImageResponseCard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-imageresponsecard.html","Properties":{"Buttons":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-imageresponsecard.html#cfn-lex-bot-imageresponsecard-buttons","DuplicatesAllowed":true,"ItemType":"Button","Required":false,"Type":"List","UpdateType":"Mutable"},"ImageUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-imageresponsecard.html#cfn-lex-bot-imageresponsecard-imageurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-imageresponsecard.html#cfn-lex-bot-imageresponsecard-subtitle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-imageresponsecard.html#cfn-lex-bot-imageresponsecard-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.InitialResponseSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-initialresponsesetting.html","Properties":{"CodeHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-initialresponsesetting.html#cfn-lex-bot-initialresponsesetting-codehook","Required":false,"Type":"DialogCodeHookInvocationSetting","UpdateType":"Mutable"},"Conditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-initialresponsesetting.html#cfn-lex-bot-initialresponsesetting-conditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"InitialResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-initialresponsesetting.html#cfn-lex-bot-initialresponsesetting-initialresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"},"NextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-initialresponsesetting.html#cfn-lex-bot-initialresponsesetting-nextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"}}},"AWS::Lex::Bot.InputContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-inputcontext.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-inputcontext.html#cfn-lex-bot-inputcontext-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.Intent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DialogCodeHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-dialogcodehook","Required":false,"Type":"DialogCodeHookSetting","UpdateType":"Mutable"},"FulfillmentCodeHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-fulfillmentcodehook","Required":false,"Type":"FulfillmentCodeHookSetting","UpdateType":"Mutable"},"InitialResponseSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-initialresponsesetting","Required":false,"Type":"InitialResponseSetting","UpdateType":"Mutable"},"InputContexts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-inputcontexts","DuplicatesAllowed":true,"ItemType":"InputContext","Required":false,"Type":"List","UpdateType":"Mutable"},"IntentClosingSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-intentclosingsetting","Required":false,"Type":"IntentClosingSetting","UpdateType":"Mutable"},"IntentConfirmationSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-intentconfirmationsetting","Required":false,"Type":"IntentConfirmationSetting","UpdateType":"Mutable"},"KendraConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-kendraconfiguration","Required":false,"Type":"KendraConfiguration","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OutputContexts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-outputcontexts","DuplicatesAllowed":true,"ItemType":"OutputContext","Required":false,"Type":"List","UpdateType":"Mutable"},"ParentIntentSignature":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-parentintentsignature","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SampleUtterances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-sampleutterances","DuplicatesAllowed":true,"ItemType":"SampleUtterance","Required":false,"Type":"List","UpdateType":"Mutable"},"SlotPriorities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-slotpriorities","DuplicatesAllowed":true,"ItemType":"SlotPriority","Required":false,"Type":"List","UpdateType":"Mutable"},"Slots":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intent.html#cfn-lex-bot-intent-slots","DuplicatesAllowed":false,"ItemType":"Slot","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.IntentClosingSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentclosingsetting.html","Properties":{"ClosingResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentclosingsetting.html#cfn-lex-bot-intentclosingsetting-closingresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"},"Conditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentclosingsetting.html#cfn-lex-bot-intentclosingsetting-conditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"IsActive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentclosingsetting.html#cfn-lex-bot-intentclosingsetting-isactive","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentclosingsetting.html#cfn-lex-bot-intentclosingsetting-nextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"}}},"AWS::Lex::Bot.IntentConfirmationSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html","Properties":{"CodeHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-codehook","Required":false,"Type":"DialogCodeHookInvocationSetting","UpdateType":"Mutable"},"ConfirmationConditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-confirmationconditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"ConfirmationNextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-confirmationnextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"ConfirmationResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-confirmationresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"},"DeclinationConditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-declinationconditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"DeclinationNextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-declinationnextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"DeclinationResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-declinationresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"},"ElicitationCodeHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-elicitationcodehook","Required":false,"Type":"ElicitationCodeHookInvocationSetting","UpdateType":"Mutable"},"FailureConditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-failureconditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"FailureNextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-failurenextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"FailureResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-failureresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"},"IsActive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-isactive","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PromptSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentconfirmationsetting.html#cfn-lex-bot-intentconfirmationsetting-promptspecification","Required":true,"Type":"PromptSpecification","UpdateType":"Mutable"}}},"AWS::Lex::Bot.IntentOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentoverride.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentoverride.html#cfn-lex-bot-intentoverride-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Slots":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-intentoverride.html#cfn-lex-bot-intentoverride-slots","DuplicatesAllowed":true,"ItemType":"SlotValueOverrideMap","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.KendraConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-kendraconfiguration.html","Properties":{"KendraIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-kendraconfiguration.html#cfn-lex-bot-kendraconfiguration-kendraindex","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"QueryFilterString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-kendraconfiguration.html#cfn-lex-bot-kendraconfiguration-queryfilterstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"QueryFilterStringEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-kendraconfiguration.html#cfn-lex-bot-kendraconfiguration-queryfilterstringenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.LambdaCodeHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-lambdacodehook.html","Properties":{"CodeHookInterfaceVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-lambdacodehook.html#cfn-lex-bot-lambdacodehook-codehookinterfaceversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LambdaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-lambdacodehook.html#cfn-lex-bot-lambdacodehook-lambdaarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-message.html","Properties":{"CustomPayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-message.html#cfn-lex-bot-message-custompayload","Required":false,"Type":"CustomPayload","UpdateType":"Mutable"},"ImageResponseCard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-message.html#cfn-lex-bot-message-imageresponsecard","Required":false,"Type":"ImageResponseCard","UpdateType":"Mutable"},"PlainTextMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-message.html#cfn-lex-bot-message-plaintextmessage","Required":false,"Type":"PlainTextMessage","UpdateType":"Mutable"},"SSMLMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-message.html#cfn-lex-bot-message-ssmlmessage","Required":false,"Type":"SSMLMessage","UpdateType":"Mutable"}}},"AWS::Lex::Bot.MessageGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-messagegroup.html","Properties":{"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-messagegroup.html#cfn-lex-bot-messagegroup-message","Required":true,"Type":"Message","UpdateType":"Mutable"},"Variations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-messagegroup.html#cfn-lex-bot-messagegroup-variations","DuplicatesAllowed":true,"ItemType":"Message","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.MultipleValuesSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-multiplevaluessetting.html","Properties":{"AllowMultipleValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-multiplevaluessetting.html#cfn-lex-bot-multiplevaluessetting-allowmultiplevalues","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.ObfuscationSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-obfuscationsetting.html","Properties":{"ObfuscationSettingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-obfuscationsetting.html#cfn-lex-bot-obfuscationsetting-obfuscationsettingtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.OutputContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-outputcontext.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-outputcontext.html#cfn-lex-bot-outputcontext-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeToLiveInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-outputcontext.html#cfn-lex-bot-outputcontext-timetoliveinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"TurnsToLive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-outputcontext.html#cfn-lex-bot-outputcontext-turnstolive","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.PlainTextMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-plaintextmessage.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-plaintextmessage.html#cfn-lex-bot-plaintextmessage-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.PostDialogCodeHookInvocationSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postdialogcodehookinvocationspecification.html","Properties":{"FailureConditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postdialogcodehookinvocationspecification.html#cfn-lex-bot-postdialogcodehookinvocationspecification-failureconditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"FailureNextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postdialogcodehookinvocationspecification.html#cfn-lex-bot-postdialogcodehookinvocationspecification-failurenextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"FailureResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postdialogcodehookinvocationspecification.html#cfn-lex-bot-postdialogcodehookinvocationspecification-failureresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"},"SuccessConditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postdialogcodehookinvocationspecification.html#cfn-lex-bot-postdialogcodehookinvocationspecification-successconditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"SuccessNextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postdialogcodehookinvocationspecification.html#cfn-lex-bot-postdialogcodehookinvocationspecification-successnextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"SuccessResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postdialogcodehookinvocationspecification.html#cfn-lex-bot-postdialogcodehookinvocationspecification-successresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"},"TimeoutConditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postdialogcodehookinvocationspecification.html#cfn-lex-bot-postdialogcodehookinvocationspecification-timeoutconditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"TimeoutNextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postdialogcodehookinvocationspecification.html#cfn-lex-bot-postdialogcodehookinvocationspecification-timeoutnextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"TimeoutResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postdialogcodehookinvocationspecification.html#cfn-lex-bot-postdialogcodehookinvocationspecification-timeoutresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"}}},"AWS::Lex::Bot.PostFulfillmentStatusSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postfulfillmentstatusspecification.html","Properties":{"FailureConditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postfulfillmentstatusspecification.html#cfn-lex-bot-postfulfillmentstatusspecification-failureconditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"FailureNextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postfulfillmentstatusspecification.html#cfn-lex-bot-postfulfillmentstatusspecification-failurenextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"FailureResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postfulfillmentstatusspecification.html#cfn-lex-bot-postfulfillmentstatusspecification-failureresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"},"SuccessConditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postfulfillmentstatusspecification.html#cfn-lex-bot-postfulfillmentstatusspecification-successconditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"SuccessNextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postfulfillmentstatusspecification.html#cfn-lex-bot-postfulfillmentstatusspecification-successnextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"SuccessResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postfulfillmentstatusspecification.html#cfn-lex-bot-postfulfillmentstatusspecification-successresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"},"TimeoutConditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postfulfillmentstatusspecification.html#cfn-lex-bot-postfulfillmentstatusspecification-timeoutconditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"TimeoutNextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postfulfillmentstatusspecification.html#cfn-lex-bot-postfulfillmentstatusspecification-timeoutnextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"TimeoutResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-postfulfillmentstatusspecification.html#cfn-lex-bot-postfulfillmentstatusspecification-timeoutresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"}}},"AWS::Lex::Bot.PromptAttemptSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptattemptspecification.html","Properties":{"AllowInterrupt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptattemptspecification.html#cfn-lex-bot-promptattemptspecification-allowinterrupt","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AllowedInputTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptattemptspecification.html#cfn-lex-bot-promptattemptspecification-allowedinputtypes","Required":true,"Type":"AllowedInputTypes","UpdateType":"Mutable"},"AudioAndDTMFInputSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptattemptspecification.html#cfn-lex-bot-promptattemptspecification-audioanddtmfinputspecification","Required":false,"Type":"AudioAndDTMFInputSpecification","UpdateType":"Mutable"},"TextInputSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptattemptspecification.html#cfn-lex-bot-promptattemptspecification-textinputspecification","Required":false,"Type":"TextInputSpecification","UpdateType":"Mutable"}}},"AWS::Lex::Bot.PromptSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptspecification.html","Properties":{"AllowInterrupt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptspecification.html#cfn-lex-bot-promptspecification-allowinterrupt","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptspecification.html#cfn-lex-bot-promptspecification-maxretries","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MessageGroupsList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptspecification.html#cfn-lex-bot-promptspecification-messagegroupslist","DuplicatesAllowed":true,"ItemType":"MessageGroup","Required":true,"Type":"List","UpdateType":"Mutable"},"MessageSelectionStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptspecification.html#cfn-lex-bot-promptspecification-messageselectionstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PromptAttemptsSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-promptspecification.html#cfn-lex-bot-promptspecification-promptattemptsspecification","ItemType":"PromptAttemptSpecification","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::Lex::Bot.ResponseSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-responsespecification.html","Properties":{"AllowInterrupt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-responsespecification.html#cfn-lex-bot-responsespecification-allowinterrupt","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MessageGroupsList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-responsespecification.html#cfn-lex-bot-responsespecification-messagegroupslist","DuplicatesAllowed":true,"ItemType":"MessageGroup","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.S3BucketLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-s3bucketlogdestination.html","Properties":{"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-s3bucketlogdestination.html#cfn-lex-bot-s3bucketlogdestination-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-s3bucketlogdestination.html#cfn-lex-bot-s3bucketlogdestination-logprefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3BucketArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-s3bucketlogdestination.html#cfn-lex-bot-s3bucketlogdestination-s3bucketarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-s3location.html","Properties":{"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-s3location.html#cfn-lex-bot-s3location-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3ObjectKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-s3location.html#cfn-lex-bot-s3location-s3objectkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-s3location.html#cfn-lex-bot-s3location-s3objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.SSMLMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-ssmlmessage.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-ssmlmessage.html#cfn-lex-bot-ssmlmessage-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.SampleUtterance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-sampleutterance.html","Properties":{"Utterance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-sampleutterance.html#cfn-lex-bot-sampleutterance-utterance","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.SampleValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-samplevalue.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-samplevalue.html#cfn-lex-bot-samplevalue-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.SentimentAnalysisSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-sentimentanalysissettings.html","Properties":{"DetectSentiment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-sentimentanalysissettings.html#cfn-lex-bot-sentimentanalysissettings-detectsentiment","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.SessionAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-sessionattribute.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-sessionattribute.html#cfn-lex-bot-sessionattribute-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-sessionattribute.html#cfn-lex-bot-sessionattribute-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.Slot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slot.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slot.html#cfn-lex-bot-slot-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MultipleValuesSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slot.html#cfn-lex-bot-slot-multiplevaluessetting","Required":false,"Type":"MultipleValuesSetting","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slot.html#cfn-lex-bot-slot-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObfuscationSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slot.html#cfn-lex-bot-slot-obfuscationsetting","Required":false,"Type":"ObfuscationSetting","UpdateType":"Mutable"},"SlotTypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slot.html#cfn-lex-bot-slot-slottypename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueElicitationSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slot.html#cfn-lex-bot-slot-valueelicitationsetting","Required":true,"Type":"SlotValueElicitationSetting","UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotCaptureSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotcapturesetting.html","Properties":{"CaptureConditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotcapturesetting.html#cfn-lex-bot-slotcapturesetting-captureconditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"CaptureNextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotcapturesetting.html#cfn-lex-bot-slotcapturesetting-capturenextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"CaptureResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotcapturesetting.html#cfn-lex-bot-slotcapturesetting-captureresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"},"CodeHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotcapturesetting.html#cfn-lex-bot-slotcapturesetting-codehook","Required":false,"Type":"DialogCodeHookInvocationSetting","UpdateType":"Mutable"},"ElicitationCodeHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotcapturesetting.html#cfn-lex-bot-slotcapturesetting-elicitationcodehook","Required":false,"Type":"ElicitationCodeHookInvocationSetting","UpdateType":"Mutable"},"FailureConditional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotcapturesetting.html#cfn-lex-bot-slotcapturesetting-failureconditional","Required":false,"Type":"ConditionalSpecification","UpdateType":"Mutable"},"FailureNextStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotcapturesetting.html#cfn-lex-bot-slotcapturesetting-failurenextstep","Required":false,"Type":"DialogState","UpdateType":"Mutable"},"FailureResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotcapturesetting.html#cfn-lex-bot-slotcapturesetting-failureresponse","Required":false,"Type":"ResponseSpecification","UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotDefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotdefaultvalue.html","Properties":{"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotdefaultvalue.html#cfn-lex-bot-slotdefaultvalue-defaultvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotDefaultValueSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotdefaultvaluespecification.html","Properties":{"DefaultValueList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotdefaultvaluespecification.html#cfn-lex-bot-slotdefaultvaluespecification-defaultvaluelist","DuplicatesAllowed":true,"ItemType":"SlotDefaultValue","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotPriority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotpriority.html","Properties":{"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotpriority.html#cfn-lex-bot-slotpriority-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"SlotName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotpriority.html#cfn-lex-bot-slotpriority-slotname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slottype.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slottype.html#cfn-lex-bot-slottype-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExternalSourceSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slottype.html#cfn-lex-bot-slottype-externalsourcesetting","Required":false,"Type":"ExternalSourceSetting","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slottype.html#cfn-lex-bot-slottype-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParentSlotTypeSignature":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slottype.html#cfn-lex-bot-slottype-parentslottypesignature","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SlotTypeValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slottype.html#cfn-lex-bot-slottype-slottypevalues","DuplicatesAllowed":true,"ItemType":"SlotTypeValue","Required":false,"Type":"List","UpdateType":"Mutable"},"ValueSelectionSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slottype.html#cfn-lex-bot-slottype-valueselectionsetting","Required":false,"Type":"SlotValueSelectionSetting","UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotTypeValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slottypevalue.html","Properties":{"SampleValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slottypevalue.html#cfn-lex-bot-slottypevalue-samplevalue","Required":true,"Type":"SampleValue","UpdateType":"Mutable"},"Synonyms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slottypevalue.html#cfn-lex-bot-slottypevalue-synonyms","DuplicatesAllowed":true,"ItemType":"SampleValue","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalue.html","Properties":{"InterpretedValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalue.html#cfn-lex-bot-slotvalue-interpretedvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotValueElicitationSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueelicitationsetting.html","Properties":{"DefaultValueSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueelicitationsetting.html#cfn-lex-bot-slotvalueelicitationsetting-defaultvaluespecification","Required":false,"Type":"SlotDefaultValueSpecification","UpdateType":"Mutable"},"PromptSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueelicitationsetting.html#cfn-lex-bot-slotvalueelicitationsetting-promptspecification","Required":false,"Type":"PromptSpecification","UpdateType":"Mutable"},"SampleUtterances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueelicitationsetting.html#cfn-lex-bot-slotvalueelicitationsetting-sampleutterances","DuplicatesAllowed":true,"ItemType":"SampleUtterance","Required":false,"Type":"List","UpdateType":"Mutable"},"SlotCaptureSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueelicitationsetting.html#cfn-lex-bot-slotvalueelicitationsetting-slotcapturesetting","Required":false,"Type":"SlotCaptureSetting","UpdateType":"Mutable"},"SlotConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueelicitationsetting.html#cfn-lex-bot-slotvalueelicitationsetting-slotconstraint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"WaitAndContinueSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueelicitationsetting.html#cfn-lex-bot-slotvalueelicitationsetting-waitandcontinuespecification","Required":false,"Type":"WaitAndContinueSpecification","UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotValueOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueoverride.html","Properties":{"Shape":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueoverride.html#cfn-lex-bot-slotvalueoverride-shape","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueoverride.html#cfn-lex-bot-slotvalueoverride-value","Required":false,"Type":"SlotValue","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueoverride.html#cfn-lex-bot-slotvalueoverride-values","DuplicatesAllowed":true,"ItemType":"SlotValueOverride","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotValueOverrideMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueoverridemap.html","Properties":{"SlotName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueoverridemap.html#cfn-lex-bot-slotvalueoverridemap-slotname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SlotValueOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueoverridemap.html#cfn-lex-bot-slotvalueoverridemap-slotvalueoverride","Required":false,"Type":"SlotValueOverride","UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotValueRegexFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueregexfilter.html","Properties":{"Pattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueregexfilter.html#cfn-lex-bot-slotvalueregexfilter-pattern","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.SlotValueSelectionSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueselectionsetting.html","Properties":{"AdvancedRecognitionSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueselectionsetting.html#cfn-lex-bot-slotvalueselectionsetting-advancedrecognitionsetting","Required":false,"Type":"AdvancedRecognitionSetting","UpdateType":"Mutable"},"RegexFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueselectionsetting.html#cfn-lex-bot-slotvalueselectionsetting-regexfilter","Required":false,"Type":"SlotValueRegexFilter","UpdateType":"Mutable"},"ResolutionStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-slotvalueselectionsetting.html#cfn-lex-bot-slotvalueselectionsetting-resolutionstrategy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.StillWaitingResponseSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-stillwaitingresponsespecification.html","Properties":{"AllowInterrupt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-stillwaitingresponsespecification.html#cfn-lex-bot-stillwaitingresponsespecification-allowinterrupt","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"FrequencyInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-stillwaitingresponsespecification.html#cfn-lex-bot-stillwaitingresponsespecification-frequencyinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MessageGroupsList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-stillwaitingresponsespecification.html#cfn-lex-bot-stillwaitingresponsespecification-messagegroupslist","DuplicatesAllowed":true,"ItemType":"MessageGroup","Required":true,"Type":"List","UpdateType":"Mutable"},"TimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-stillwaitingresponsespecification.html#cfn-lex-bot-stillwaitingresponsespecification-timeoutinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.TestBotAliasSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-testbotaliassettings.html","Properties":{"BotAliasLocaleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-testbotaliassettings.html#cfn-lex-bot-testbotaliassettings-botaliaslocalesettings","DuplicatesAllowed":false,"ItemType":"BotAliasLocaleSettingsItem","Required":false,"Type":"List","UpdateType":"Mutable"},"ConversationLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-testbotaliassettings.html#cfn-lex-bot-testbotaliassettings-conversationlogsettings","Required":false,"Type":"ConversationLogSettings","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-testbotaliassettings.html#cfn-lex-bot-testbotaliassettings-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SentimentAnalysisSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-testbotaliassettings.html#cfn-lex-bot-testbotaliassettings-sentimentanalysissettings","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.TextInputSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-textinputspecification.html","Properties":{"StartTimeoutMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-textinputspecification.html#cfn-lex-bot-textinputspecification-starttimeoutms","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.TextLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-textlogdestination.html","Properties":{"CloudWatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-textlogdestination.html#cfn-lex-bot-textlogdestination-cloudwatch","Required":true,"Type":"CloudWatchLogGroupLogDestination","UpdateType":"Mutable"}}},"AWS::Lex::Bot.TextLogSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-textlogsetting.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-textlogsetting.html#cfn-lex-bot-textlogsetting-destination","Required":true,"Type":"TextLogDestination","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-textlogsetting.html#cfn-lex-bot-textlogsetting-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.VoiceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-voicesettings.html","Properties":{"Engine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-voicesettings.html#cfn-lex-bot-voicesettings-engine","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VoiceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-voicesettings.html#cfn-lex-bot-voicesettings-voiceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::Bot.WaitAndContinueSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-waitandcontinuespecification.html","Properties":{"ContinueResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-waitandcontinuespecification.html#cfn-lex-bot-waitandcontinuespecification-continueresponse","Required":true,"Type":"ResponseSpecification","UpdateType":"Mutable"},"IsActive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-waitandcontinuespecification.html#cfn-lex-bot-waitandcontinuespecification-isactive","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"StillWaitingResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-waitandcontinuespecification.html#cfn-lex-bot-waitandcontinuespecification-stillwaitingresponse","Required":false,"Type":"StillWaitingResponseSpecification","UpdateType":"Mutable"},"WaitingResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-waitandcontinuespecification.html#cfn-lex-bot-waitandcontinuespecification-waitingresponse","Required":true,"Type":"ResponseSpecification","UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.AudioLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-audiologdestination.html","Properties":{"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-audiologdestination.html#cfn-lex-botalias-audiologdestination-s3bucket","Required":true,"Type":"S3BucketLogDestination","UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.AudioLogSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-audiologsetting.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-audiologsetting.html#cfn-lex-botalias-audiologsetting-destination","Required":true,"Type":"AudioLogDestination","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-audiologsetting.html#cfn-lex-botalias-audiologsetting-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.BotAliasLocaleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-botaliaslocalesettings.html","Properties":{"CodeHookSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-botaliaslocalesettings.html#cfn-lex-botalias-botaliaslocalesettings-codehookspecification","Required":false,"Type":"CodeHookSpecification","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-botaliaslocalesettings.html#cfn-lex-botalias-botaliaslocalesettings-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.BotAliasLocaleSettingsItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-botaliaslocalesettingsitem.html","Properties":{"BotAliasLocaleSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-botaliaslocalesettingsitem.html#cfn-lex-botalias-botaliaslocalesettingsitem-botaliaslocalesetting","Required":true,"Type":"BotAliasLocaleSettings","UpdateType":"Mutable"},"LocaleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-botaliaslocalesettingsitem.html#cfn-lex-botalias-botaliaslocalesettingsitem-localeid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.CloudWatchLogGroupLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-cloudwatchloggrouplogdestination.html","Properties":{"CloudWatchLogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-cloudwatchloggrouplogdestination.html#cfn-lex-botalias-cloudwatchloggrouplogdestination-cloudwatchloggrouparn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-cloudwatchloggrouplogdestination.html#cfn-lex-botalias-cloudwatchloggrouplogdestination-logprefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.CodeHookSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-codehookspecification.html","Properties":{"LambdaCodeHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-codehookspecification.html#cfn-lex-botalias-codehookspecification-lambdacodehook","Required":true,"Type":"LambdaCodeHook","UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.ConversationLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-conversationlogsettings.html","Properties":{"AudioLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-conversationlogsettings.html#cfn-lex-botalias-conversationlogsettings-audiologsettings","DuplicatesAllowed":false,"ItemType":"AudioLogSetting","Required":false,"Type":"List","UpdateType":"Mutable"},"TextLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-conversationlogsettings.html#cfn-lex-botalias-conversationlogsettings-textlogsettings","DuplicatesAllowed":false,"ItemType":"TextLogSetting","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.LambdaCodeHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-lambdacodehook.html","Properties":{"CodeHookInterfaceVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-lambdacodehook.html#cfn-lex-botalias-lambdacodehook-codehookinterfaceversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LambdaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-lambdacodehook.html#cfn-lex-botalias-lambdacodehook-lambdaarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.S3BucketLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-s3bucketlogdestination.html","Properties":{"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-s3bucketlogdestination.html#cfn-lex-botalias-s3bucketlogdestination-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-s3bucketlogdestination.html#cfn-lex-botalias-s3bucketlogdestination-logprefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3BucketArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-s3bucketlogdestination.html#cfn-lex-botalias-s3bucketlogdestination-s3bucketarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.SentimentAnalysisSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-sentimentanalysissettings.html","Properties":{"DetectSentiment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-sentimentanalysissettings.html#cfn-lex-botalias-sentimentanalysissettings-detectsentiment","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.TextLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-textlogdestination.html","Properties":{"CloudWatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-textlogdestination.html#cfn-lex-botalias-textlogdestination-cloudwatch","Required":true,"Type":"CloudWatchLogGroupLogDestination","UpdateType":"Mutable"}}},"AWS::Lex::BotAlias.TextLogSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-textlogsetting.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-textlogsetting.html#cfn-lex-botalias-textlogsetting-destination","Required":true,"Type":"TextLogDestination","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botalias-textlogsetting.html#cfn-lex-botalias-textlogsetting-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::BotVersion.BotVersionLocaleDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botversion-botversionlocaledetails.html","Properties":{"SourceBotVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botversion-botversionlocaledetails.html#cfn-lex-botversion-botversionlocaledetails-sourcebotversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lex::BotVersion.BotVersionLocaleSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botversion-botversionlocalespecification.html","Properties":{"BotVersionLocaleDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botversion-botversionlocalespecification.html#cfn-lex-botversion-botversionlocalespecification-botversionlocaledetails","Required":true,"Type":"BotVersionLocaleDetails","UpdateType":"Mutable"},"LocaleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-botversion-botversionlocalespecification.html#cfn-lex-botversion-botversionlocalespecification-localeid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::LicenseManager::License.BorrowConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-borrowconfiguration.html","Properties":{"AllowEarlyCheckIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-borrowconfiguration.html#cfn-licensemanager-license-borrowconfiguration-allowearlycheckin","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"MaxTimeToLiveInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-borrowconfiguration.html#cfn-licensemanager-license-borrowconfiguration-maxtimetoliveinminutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::LicenseManager::License.ConsumptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-consumptionconfiguration.html","Properties":{"BorrowConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-consumptionconfiguration.html#cfn-licensemanager-license-consumptionconfiguration-borrowconfiguration","Required":false,"Type":"BorrowConfiguration","UpdateType":"Mutable"},"ProvisionalConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-consumptionconfiguration.html#cfn-licensemanager-license-consumptionconfiguration-provisionalconfiguration","Required":false,"Type":"ProvisionalConfiguration","UpdateType":"Mutable"},"RenewType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-consumptionconfiguration.html#cfn-licensemanager-license-consumptionconfiguration-renewtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LicenseManager::License.Entitlement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-entitlement.html","Properties":{"AllowCheckIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-entitlement.html#cfn-licensemanager-license-entitlement-allowcheckin","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-entitlement.html#cfn-licensemanager-license-entitlement-maxcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-entitlement.html#cfn-licensemanager-license-entitlement-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Overage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-entitlement.html#cfn-licensemanager-license-entitlement-overage","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-entitlement.html#cfn-licensemanager-license-entitlement-unit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-entitlement.html#cfn-licensemanager-license-entitlement-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LicenseManager::License.IssuerData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-issuerdata.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-issuerdata.html#cfn-licensemanager-license-issuerdata-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SignKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-issuerdata.html#cfn-licensemanager-license-issuerdata-signkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LicenseManager::License.Metadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-metadata.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-metadata.html#cfn-licensemanager-license-metadata-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-metadata.html#cfn-licensemanager-license-metadata-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::LicenseManager::License.ProvisionalConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-provisionalconfiguration.html","Properties":{"MaxTimeToLiveInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-provisionalconfiguration.html#cfn-licensemanager-license-provisionalconfiguration-maxtimetoliveinminutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::LicenseManager::License.ValidityDateFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-validitydateformat.html","Properties":{"Begin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-validitydateformat.html#cfn-licensemanager-license-validitydateformat-begin","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"End":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-licensemanager-license-validitydateformat.html#cfn-licensemanager-license-validitydateformat-end","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Lightsail::Bucket.AccessRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-bucket-accessrules.html","Properties":{"AllowPublicOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-bucket-accessrules.html#cfn-lightsail-bucket-accessrules-allowpublicoverrides","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"GetObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-bucket-accessrules.html#cfn-lightsail-bucket-accessrules-getobject","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Container.Container":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-container.html","Properties":{"Command":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-container.html#cfn-lightsail-container-container-command","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ContainerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-container.html#cfn-lightsail-container-container-containername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-container.html#cfn-lightsail-container-container-environment","DuplicatesAllowed":false,"ItemType":"EnvironmentVariable","Required":false,"Type":"List","UpdateType":"Mutable"},"Image":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-container.html#cfn-lightsail-container-container-image","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-container.html#cfn-lightsail-container-container-ports","DuplicatesAllowed":false,"ItemType":"PortInfo","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lightsail::Container.ContainerServiceDeployment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-containerservicedeployment.html","Properties":{"Containers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-containerservicedeployment.html#cfn-lightsail-container-containerservicedeployment-containers","DuplicatesAllowed":false,"ItemType":"Container","Required":false,"Type":"List","UpdateType":"Mutable"},"PublicEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-containerservicedeployment.html#cfn-lightsail-container-containerservicedeployment-publicendpoint","Required":false,"Type":"PublicEndpoint","UpdateType":"Mutable"}}},"AWS::Lightsail::Container.EnvironmentVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-environmentvariable.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-environmentvariable.html#cfn-lightsail-container-environmentvariable-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Variable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-environmentvariable.html#cfn-lightsail-container-environmentvariable-variable","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Container.HealthCheckConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-healthcheckconfig.html","Properties":{"HealthyThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-healthcheckconfig.html#cfn-lightsail-container-healthcheckconfig-healthythreshold","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-healthcheckconfig.html#cfn-lightsail-container-healthcheckconfig-intervalseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-healthcheckconfig.html#cfn-lightsail-container-healthcheckconfig-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SuccessCodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-healthcheckconfig.html#cfn-lightsail-container-healthcheckconfig-successcodes","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeoutSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-healthcheckconfig.html#cfn-lightsail-container-healthcheckconfig-timeoutseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UnhealthyThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-healthcheckconfig.html#cfn-lightsail-container-healthcheckconfig-unhealthythreshold","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Container.PortInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-portinfo.html","Properties":{"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-portinfo.html#cfn-lightsail-container-portinfo-port","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-portinfo.html#cfn-lightsail-container-portinfo-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Container.PublicDomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-publicdomainname.html","Properties":{"CertificateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-publicdomainname.html#cfn-lightsail-container-publicdomainname-certificatename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-publicdomainname.html#cfn-lightsail-container-publicdomainname-domainnames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lightsail::Container.PublicEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-publicendpoint.html","Properties":{"ContainerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-publicendpoint.html#cfn-lightsail-container-publicendpoint-containername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContainerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-publicendpoint.html#cfn-lightsail-container-publicendpoint-containerport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HealthCheckConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-container-publicendpoint.html#cfn-lightsail-container-publicendpoint-healthcheckconfig","Required":false,"Type":"HealthCheckConfig","UpdateType":"Mutable"}}},"AWS::Lightsail::Database.RelationalDatabaseParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-database-relationaldatabaseparameter.html","Properties":{"AllowedValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-database-relationaldatabaseparameter.html#cfn-lightsail-database-relationaldatabaseparameter-allowedvalues","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ApplyMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-database-relationaldatabaseparameter.html#cfn-lightsail-database-relationaldatabaseparameter-applymethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ApplyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-database-relationaldatabaseparameter.html#cfn-lightsail-database-relationaldatabaseparameter-applytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-database-relationaldatabaseparameter.html#cfn-lightsail-database-relationaldatabaseparameter-datatype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-database-relationaldatabaseparameter.html#cfn-lightsail-database-relationaldatabaseparameter-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IsModifiable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-database-relationaldatabaseparameter.html#cfn-lightsail-database-relationaldatabaseparameter-ismodifiable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-database-relationaldatabaseparameter.html#cfn-lightsail-database-relationaldatabaseparameter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-database-relationaldatabaseparameter.html#cfn-lightsail-database-relationaldatabaseparameter-parametervalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Disk.AddOn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-disk-addon.html","Properties":{"AddOnType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-disk-addon.html#cfn-lightsail-disk-addon-addontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AutoSnapshotAddOnRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-disk-addon.html#cfn-lightsail-disk-addon-autosnapshotaddonrequest","Required":false,"Type":"AutoSnapshotAddOn","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-disk-addon.html#cfn-lightsail-disk-addon-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Disk.AutoSnapshotAddOn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-disk-autosnapshotaddon.html","Properties":{"SnapshotTimeOfDay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-disk-autosnapshotaddon.html#cfn-lightsail-disk-autosnapshotaddon-snapshottimeofday","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Disk.Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-disk-location.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-disk-location.html#cfn-lightsail-disk-location-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RegionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-disk-location.html#cfn-lightsail-disk-location-regionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Distribution.CacheBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachebehavior.html","Properties":{"Behavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachebehavior.html#cfn-lightsail-distribution-cachebehavior-behavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Distribution.CacheBehaviorPerPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachebehaviorperpath.html","Properties":{"Behavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachebehaviorperpath.html#cfn-lightsail-distribution-cachebehaviorperpath-behavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachebehaviorperpath.html#cfn-lightsail-distribution-cachebehaviorperpath-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Distribution.CacheSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html","Properties":{"AllowedHTTPMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html#cfn-lightsail-distribution-cachesettings-allowedhttpmethods","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CachedHTTPMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html#cfn-lightsail-distribution-cachesettings-cachedhttpmethods","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html#cfn-lightsail-distribution-cachesettings-defaultttl","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ForwardedCookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html#cfn-lightsail-distribution-cachesettings-forwardedcookies","Required":false,"Type":"CookieObject","UpdateType":"Mutable"},"ForwardedHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html#cfn-lightsail-distribution-cachesettings-forwardedheaders","Required":false,"Type":"HeaderObject","UpdateType":"Mutable"},"ForwardedQueryStrings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html#cfn-lightsail-distribution-cachesettings-forwardedquerystrings","Required":false,"Type":"QueryStringObject","UpdateType":"Mutable"},"MaximumTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html#cfn-lightsail-distribution-cachesettings-maximumttl","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinimumTTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cachesettings.html#cfn-lightsail-distribution-cachesettings-minimumttl","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Distribution.CookieObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cookieobject.html","Properties":{"CookiesAllowList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cookieobject.html#cfn-lightsail-distribution-cookieobject-cookiesallowlist","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Option":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-cookieobject.html#cfn-lightsail-distribution-cookieobject-option","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Distribution.HeaderObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-headerobject.html","Properties":{"HeadersAllowList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-headerobject.html#cfn-lightsail-distribution-headerobject-headersallowlist","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Option":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-headerobject.html#cfn-lightsail-distribution-headerobject-option","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Distribution.InputOrigin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-inputorigin.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-inputorigin.html#cfn-lightsail-distribution-inputorigin-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProtocolPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-inputorigin.html#cfn-lightsail-distribution-inputorigin-protocolpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RegionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-inputorigin.html#cfn-lightsail-distribution-inputorigin-regionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Distribution.QueryStringObject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-querystringobject.html","Properties":{"Option":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-querystringobject.html#cfn-lightsail-distribution-querystringobject-option","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"QueryStringsAllowList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-distribution-querystringobject.html#cfn-lightsail-distribution-querystringobject-querystringsallowlist","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lightsail::Instance.AddOn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-addon.html","Properties":{"AddOnType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-addon.html#cfn-lightsail-instance-addon-addontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AutoSnapshotAddOnRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-addon.html#cfn-lightsail-instance-addon-autosnapshotaddonrequest","Required":false,"Type":"AutoSnapshotAddOn","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-addon.html#cfn-lightsail-instance-addon-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Instance.AutoSnapshotAddOn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-autosnapshotaddon.html","Properties":{"SnapshotTimeOfDay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-autosnapshotaddon.html#cfn-lightsail-instance-autosnapshotaddon-snapshottimeofday","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Instance.Disk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-disk.html","Properties":{"AttachedTo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-disk.html#cfn-lightsail-instance-disk-attachedto","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AttachmentState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-disk.html#cfn-lightsail-instance-disk-attachmentstate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DiskName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-disk.html#cfn-lightsail-instance-disk-diskname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IOPS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-disk.html#cfn-lightsail-instance-disk-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IsSystemDisk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-disk.html#cfn-lightsail-instance-disk-issystemdisk","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-disk.html#cfn-lightsail-instance-disk-path","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SizeInGb":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-disk.html#cfn-lightsail-instance-disk-sizeingb","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Instance.Hardware":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-hardware.html","Properties":{"CpuCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-hardware.html#cfn-lightsail-instance-hardware-cpucount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Disks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-hardware.html#cfn-lightsail-instance-hardware-disks","DuplicatesAllowed":false,"ItemType":"Disk","Required":false,"Type":"List","UpdateType":"Mutable"},"RamSizeInGb":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-hardware.html#cfn-lightsail-instance-hardware-ramsizeingb","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Instance.Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-location.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-location.html#cfn-lightsail-instance-location-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RegionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-location.html#cfn-lightsail-instance-location-regionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Instance.MonthlyTransfer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-monthlytransfer.html","Properties":{"GbPerMonthAllocated":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-monthlytransfer.html#cfn-lightsail-instance-monthlytransfer-gbpermonthallocated","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Instance.Networking":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-networking.html","Properties":{"MonthlyTransfer":{"PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Ports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-networking.html#cfn-lightsail-instance-networking-ports","DuplicatesAllowed":false,"ItemType":"Port","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lightsail::Instance.Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-port.html","Properties":{"AccessDirection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-port.html#cfn-lightsail-instance-port-accessdirection","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AccessFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-port.html#cfn-lightsail-instance-port-accessfrom","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AccessType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-port.html#cfn-lightsail-instance-port-accesstype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CidrListAliases":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-port.html#cfn-lightsail-instance-port-cidrlistaliases","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Cidrs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-port.html#cfn-lightsail-instance-port-cidrs","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CommonName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-port.html#cfn-lightsail-instance-port-commonname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FromPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-port.html#cfn-lightsail-instance-port-fromport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Ipv6Cidrs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-port.html#cfn-lightsail-instance-port-ipv6cidrs","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-port.html#cfn-lightsail-instance-port-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ToPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-port.html#cfn-lightsail-instance-port-toport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Instance.State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-state.html","Properties":{"Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-state.html#cfn-lightsail-instance-state-code","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lightsail-instance-state.html#cfn-lightsail-instance-state-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Location::Map.MapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-location-map-mapconfiguration.html","Properties":{"Style":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-location-map-mapconfiguration.html#cfn-location-map-mapconfiguration-style","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Location::PlaceIndex.DataSourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-location-placeindex-datasourceconfiguration.html","Properties":{"IntendedUse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-location-placeindex-datasourceconfiguration.html#cfn-location-placeindex-datasourceconfiguration-intendeduse","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Logs::MetricFilter.Dimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-logs-metricfilter-dimension.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-logs-metricfilter-dimension.html#cfn-logs-metricfilter-dimension-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-logs-metricfilter-dimension.html#cfn-logs-metricfilter-dimension-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Logs::MetricFilter.MetricTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-logs-metricfilter-metrictransformation.html","Properties":{"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-logs-metricfilter-metrictransformation.html#cfn-logs-metricfilter-metrictransformation-defaultvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-logs-metricfilter-metrictransformation.html#cfn-logs-metricfilter-metrictransformation-dimensions","DuplicatesAllowed":false,"ItemType":"Dimension","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-logs-metricfilter-metrictransformation.html#cfn-logs-metricfilter-metrictransformation-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MetricNamespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-logs-metricfilter-metrictransformation.html#cfn-logs-metricfilter-metrictransformation-metricnamespace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MetricValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-logs-metricfilter-metrictransformation.html#cfn-logs-metricfilter-metrictransformation-metricvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-logs-metricfilter-metrictransformation.html#cfn-logs-metricfilter-metrictransformation-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LookoutEquipment::InferenceScheduler.DataInputConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-datainputconfiguration.html","Properties":{"InferenceInputNameConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-datainputconfiguration.html#cfn-lookoutequipment-inferencescheduler-datainputconfiguration-inferenceinputnameconfiguration","Required":false,"Type":"InputNameConfiguration","UpdateType":"Mutable"},"InputTimeZoneOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-datainputconfiguration.html#cfn-lookoutequipment-inferencescheduler-datainputconfiguration-inputtimezoneoffset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3InputConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-datainputconfiguration.html#cfn-lookoutequipment-inferencescheduler-datainputconfiguration-s3inputconfiguration","Required":true,"Type":"S3InputConfiguration","UpdateType":"Mutable"}}},"AWS::LookoutEquipment::InferenceScheduler.DataOutputConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-dataoutputconfiguration.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-dataoutputconfiguration.html#cfn-lookoutequipment-inferencescheduler-dataoutputconfiguration-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3OutputConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-dataoutputconfiguration.html#cfn-lookoutequipment-inferencescheduler-dataoutputconfiguration-s3outputconfiguration","Required":true,"Type":"S3OutputConfiguration","UpdateType":"Mutable"}}},"AWS::LookoutEquipment::InferenceScheduler.InputNameConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-inputnameconfiguration.html","Properties":{"ComponentTimestampDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-inputnameconfiguration.html#cfn-lookoutequipment-inferencescheduler-inputnameconfiguration-componenttimestampdelimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimestampFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-inputnameconfiguration.html#cfn-lookoutequipment-inferencescheduler-inputnameconfiguration-timestampformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LookoutEquipment::InferenceScheduler.S3InputConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-s3inputconfiguration.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-s3inputconfiguration.html#cfn-lookoutequipment-inferencescheduler-s3inputconfiguration-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-s3inputconfiguration.html#cfn-lookoutequipment-inferencescheduler-s3inputconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LookoutEquipment::InferenceScheduler.S3OutputConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-s3outputconfiguration.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-s3outputconfiguration.html#cfn-lookoutequipment-inferencescheduler-s3outputconfiguration-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutequipment-inferencescheduler-s3outputconfiguration.html#cfn-lookoutequipment-inferencescheduler-s3outputconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LookoutMetrics::Alert.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-alert-action.html","Properties":{"LambdaConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-alert-action.html#cfn-lookoutmetrics-alert-action-lambdaconfiguration","Required":false,"Type":"LambdaConfiguration","UpdateType":"Immutable"},"SNSConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-alert-action.html#cfn-lookoutmetrics-alert-action-snsconfiguration","Required":false,"Type":"SNSConfiguration","UpdateType":"Immutable"}}},"AWS::LookoutMetrics::Alert.LambdaConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-alert-lambdaconfiguration.html","Properties":{"LambdaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-alert-lambdaconfiguration.html#cfn-lookoutmetrics-alert-lambdaconfiguration-lambdaarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-alert-lambdaconfiguration.html#cfn-lookoutmetrics-alert-lambdaconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::LookoutMetrics::Alert.SNSConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-alert-snsconfiguration.html","Properties":{"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-alert-snsconfiguration.html#cfn-lookoutmetrics-alert-snsconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SnsTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-alert-snsconfiguration.html#cfn-lookoutmetrics-alert-snsconfiguration-snstopicarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::LookoutMetrics::AnomalyDetector.AnomalyDetectorConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-anomalydetectorconfig.html","Properties":{"AnomalyDetectorFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-anomalydetectorconfig.html#cfn-lookoutmetrics-anomalydetector-anomalydetectorconfig-anomalydetectorfrequency","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.AppFlowConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-appflowconfig.html","Properties":{"FlowName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-appflowconfig.html#cfn-lookoutmetrics-anomalydetector-appflowconfig-flowname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-appflowconfig.html#cfn-lookoutmetrics-anomalydetector-appflowconfig-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.CloudwatchConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-cloudwatchconfig.html","Properties":{"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-cloudwatchconfig.html#cfn-lookoutmetrics-anomalydetector-cloudwatchconfig-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.CsvFormatDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-csvformatdescriptor.html","Properties":{"Charset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-csvformatdescriptor.html#cfn-lookoutmetrics-anomalydetector-csvformatdescriptor-charset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContainsHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-csvformatdescriptor.html#cfn-lookoutmetrics-anomalydetector-csvformatdescriptor-containsheader","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-csvformatdescriptor.html#cfn-lookoutmetrics-anomalydetector-csvformatdescriptor-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FileCompression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-csvformatdescriptor.html#cfn-lookoutmetrics-anomalydetector-csvformatdescriptor-filecompression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HeaderList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-csvformatdescriptor.html#cfn-lookoutmetrics-anomalydetector-csvformatdescriptor-headerlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"QuoteSymbol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-csvformatdescriptor.html#cfn-lookoutmetrics-anomalydetector-csvformatdescriptor-quotesymbol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.FileFormatDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-fileformatdescriptor.html","Properties":{"CsvFormatDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-fileformatdescriptor.html#cfn-lookoutmetrics-anomalydetector-fileformatdescriptor-csvformatdescriptor","Required":false,"Type":"CsvFormatDescriptor","UpdateType":"Mutable"},"JsonFormatDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-fileformatdescriptor.html#cfn-lookoutmetrics-anomalydetector-fileformatdescriptor-jsonformatdescriptor","Required":false,"Type":"JsonFormatDescriptor","UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.JsonFormatDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-jsonformatdescriptor.html","Properties":{"Charset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-jsonformatdescriptor.html#cfn-lookoutmetrics-anomalydetector-jsonformatdescriptor-charset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FileCompression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-jsonformatdescriptor.html#cfn-lookoutmetrics-anomalydetector-jsonformatdescriptor-filecompression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metric.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metric.html#cfn-lookoutmetrics-anomalydetector-metric-aggregationfunction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metric.html#cfn-lookoutmetrics-anomalydetector-metric-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metric.html#cfn-lookoutmetrics-anomalydetector-metric-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.MetricSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricset.html","Properties":{"DimensionList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricset.html#cfn-lookoutmetrics-anomalydetector-metricset-dimensionlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricset.html#cfn-lookoutmetrics-anomalydetector-metricset-metriclist","DuplicatesAllowed":true,"ItemType":"Metric","Required":true,"Type":"List","UpdateType":"Mutable"},"MetricSetDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricset.html#cfn-lookoutmetrics-anomalydetector-metricset-metricsetdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricSetFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricset.html#cfn-lookoutmetrics-anomalydetector-metricset-metricsetfrequency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricset.html#cfn-lookoutmetrics-anomalydetector-metricset-metricsetname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MetricSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricset.html#cfn-lookoutmetrics-anomalydetector-metricset-metricsource","Required":true,"Type":"MetricSource","UpdateType":"Mutable"},"Offset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricset.html#cfn-lookoutmetrics-anomalydetector-metricset-offset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TimestampColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricset.html#cfn-lookoutmetrics-anomalydetector-metricset-timestampcolumn","Required":false,"Type":"TimestampColumn","UpdateType":"Mutable"},"Timezone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricset.html#cfn-lookoutmetrics-anomalydetector-metricset-timezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.MetricSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricsource.html","Properties":{"AppFlowConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricsource.html#cfn-lookoutmetrics-anomalydetector-metricsource-appflowconfig","Required":false,"Type":"AppFlowConfig","UpdateType":"Mutable"},"CloudwatchConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricsource.html#cfn-lookoutmetrics-anomalydetector-metricsource-cloudwatchconfig","Required":false,"Type":"CloudwatchConfig","UpdateType":"Mutable"},"RDSSourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricsource.html#cfn-lookoutmetrics-anomalydetector-metricsource-rdssourceconfig","Required":false,"Type":"RDSSourceConfig","UpdateType":"Mutable"},"RedshiftSourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricsource.html#cfn-lookoutmetrics-anomalydetector-metricsource-redshiftsourceconfig","Required":false,"Type":"RedshiftSourceConfig","UpdateType":"Mutable"},"S3SourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-metricsource.html#cfn-lookoutmetrics-anomalydetector-metricsource-s3sourceconfig","Required":false,"Type":"S3SourceConfig","UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.RDSSourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-rdssourceconfig.html","Properties":{"DBInstanceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-rdssourceconfig.html#cfn-lookoutmetrics-anomalydetector-rdssourceconfig-dbinstanceidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatabaseHost":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-rdssourceconfig.html#cfn-lookoutmetrics-anomalydetector-rdssourceconfig-databasehost","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-rdssourceconfig.html#cfn-lookoutmetrics-anomalydetector-rdssourceconfig-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatabasePort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-rdssourceconfig.html#cfn-lookoutmetrics-anomalydetector-rdssourceconfig-databaseport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-rdssourceconfig.html#cfn-lookoutmetrics-anomalydetector-rdssourceconfig-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecretManagerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-rdssourceconfig.html#cfn-lookoutmetrics-anomalydetector-rdssourceconfig-secretmanagerarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-rdssourceconfig.html#cfn-lookoutmetrics-anomalydetector-rdssourceconfig-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-rdssourceconfig.html#cfn-lookoutmetrics-anomalydetector-rdssourceconfig-vpcconfiguration","Required":true,"Type":"VpcConfiguration","UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.RedshiftSourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-redshiftsourceconfig.html","Properties":{"ClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-redshiftsourceconfig.html#cfn-lookoutmetrics-anomalydetector-redshiftsourceconfig-clusteridentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatabaseHost":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-redshiftsourceconfig.html#cfn-lookoutmetrics-anomalydetector-redshiftsourceconfig-databasehost","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-redshiftsourceconfig.html#cfn-lookoutmetrics-anomalydetector-redshiftsourceconfig-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatabasePort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-redshiftsourceconfig.html#cfn-lookoutmetrics-anomalydetector-redshiftsourceconfig-databaseport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-redshiftsourceconfig.html#cfn-lookoutmetrics-anomalydetector-redshiftsourceconfig-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecretManagerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-redshiftsourceconfig.html#cfn-lookoutmetrics-anomalydetector-redshiftsourceconfig-secretmanagerarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-redshiftsourceconfig.html#cfn-lookoutmetrics-anomalydetector-redshiftsourceconfig-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-redshiftsourceconfig.html#cfn-lookoutmetrics-anomalydetector-redshiftsourceconfig-vpcconfiguration","Required":true,"Type":"VpcConfiguration","UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.S3SourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-s3sourceconfig.html","Properties":{"FileFormatDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-s3sourceconfig.html#cfn-lookoutmetrics-anomalydetector-s3sourceconfig-fileformatdescriptor","Required":true,"Type":"FileFormatDescriptor","UpdateType":"Mutable"},"HistoricalDataPathList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-s3sourceconfig.html#cfn-lookoutmetrics-anomalydetector-s3sourceconfig-historicaldatapathlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-s3sourceconfig.html#cfn-lookoutmetrics-anomalydetector-s3sourceconfig-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TemplatedPathList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-s3sourceconfig.html#cfn-lookoutmetrics-anomalydetector-s3sourceconfig-templatedpathlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.TimestampColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-timestampcolumn.html","Properties":{"ColumnFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-timestampcolumn.html#cfn-lookoutmetrics-anomalydetector-timestampcolumn-columnformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-timestampcolumn.html#cfn-lookoutmetrics-anomalydetector-timestampcolumn-columnname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LookoutMetrics::AnomalyDetector.VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-vpcconfiguration.html","Properties":{"SecurityGroupIdList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-vpcconfiguration.html#cfn-lookoutmetrics-anomalydetector-vpcconfiguration-securitygroupidlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SubnetIdList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lookoutmetrics-anomalydetector-vpcconfiguration.html#cfn-lookoutmetrics-anomalydetector-vpcconfiguration-subnetidlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::M2::Application.Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-application-definition.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-application-definition.html#cfn-m2-application-definition-content","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-application-definition.html#cfn-m2-application-definition-s3location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::M2::Environment.EfsStorageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-environment-efsstorageconfiguration.html","Properties":{"FileSystemId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-environment-efsstorageconfiguration.html#cfn-m2-environment-efsstorageconfiguration-filesystemid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MountPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-environment-efsstorageconfiguration.html#cfn-m2-environment-efsstorageconfiguration-mountpoint","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::M2::Environment.FsxStorageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-environment-fsxstorageconfiguration.html","Properties":{"FileSystemId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-environment-fsxstorageconfiguration.html#cfn-m2-environment-fsxstorageconfiguration-filesystemid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MountPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-environment-fsxstorageconfiguration.html#cfn-m2-environment-fsxstorageconfiguration-mountpoint","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::M2::Environment.HighAvailabilityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-environment-highavailabilityconfig.html","Properties":{"DesiredCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-environment-highavailabilityconfig.html#cfn-m2-environment-highavailabilityconfig-desiredcapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::M2::Environment.StorageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-environment-storageconfiguration.html","Properties":{"Efs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-environment-storageconfiguration.html#cfn-m2-environment-storageconfiguration-efs","Required":false,"Type":"EfsStorageConfiguration","UpdateType":"Immutable"},"Fsx":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-m2-environment-storageconfiguration.html#cfn-m2-environment-storageconfiguration-fsx","Required":false,"Type":"FsxStorageConfiguration","UpdateType":"Immutable"}}},"AWS::MSK::Cluster.BrokerLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-brokerlogs.html","Properties":{"CloudWatchLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-brokerlogs.html#cfn-msk-cluster-brokerlogs-cloudwatchlogs","Required":false,"Type":"CloudWatchLogs","UpdateType":"Mutable"},"Firehose":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-brokerlogs.html#cfn-msk-cluster-brokerlogs-firehose","Required":false,"Type":"Firehose","UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-brokerlogs.html#cfn-msk-cluster-brokerlogs-s3","Required":false,"Type":"S3","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.BrokerNodeGroupInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-brokernodegroupinfo.html","Properties":{"BrokerAZDistribution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-brokernodegroupinfo.html#cfn-msk-cluster-brokernodegroupinfo-brokerazdistribution","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ClientSubnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-brokernodegroupinfo.html#cfn-msk-cluster-brokernodegroupinfo-clientsubnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"ConnectivityInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-brokernodegroupinfo.html#cfn-msk-cluster-brokernodegroupinfo-connectivityinfo","Required":false,"Type":"ConnectivityInfo","UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-brokernodegroupinfo.html#cfn-msk-cluster-brokernodegroupinfo-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-brokernodegroupinfo.html#cfn-msk-cluster-brokernodegroupinfo-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"StorageInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-brokernodegroupinfo.html#cfn-msk-cluster-brokernodegroupinfo-storageinfo","Required":false,"Type":"StorageInfo","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.ClientAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-clientauthentication.html","Properties":{"Sasl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-clientauthentication.html#cfn-msk-cluster-clientauthentication-sasl","Required":false,"Type":"Sasl","UpdateType":"Mutable"},"Tls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-clientauthentication.html#cfn-msk-cluster-clientauthentication-tls","Required":false,"Type":"Tls","UpdateType":"Mutable"},"Unauthenticated":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-clientauthentication.html#cfn-msk-cluster-clientauthentication-unauthenticated","Required":false,"Type":"Unauthenticated","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.CloudWatchLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-cloudwatchlogs.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-cloudwatchlogs.html#cfn-msk-cluster-cloudwatchlogs-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"LogGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-cloudwatchlogs.html#cfn-msk-cluster-cloudwatchlogs-loggroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.ConfigurationInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-configurationinfo.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-configurationinfo.html#cfn-msk-cluster-configurationinfo-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Revision":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-configurationinfo.html#cfn-msk-cluster-configurationinfo-revision","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.ConnectivityInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-connectivityinfo.html","Properties":{"PublicAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-connectivityinfo.html#cfn-msk-cluster-connectivityinfo-publicaccess","Required":false,"Type":"PublicAccess","UpdateType":"Mutable"},"VpcConnectivity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-connectivityinfo.html#cfn-msk-cluster-connectivityinfo-vpcconnectivity","Required":false,"Type":"VpcConnectivity","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.EBSStorageInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-ebsstorageinfo.html","Properties":{"ProvisionedThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-ebsstorageinfo.html#cfn-msk-cluster-ebsstorageinfo-provisionedthroughput","Required":false,"Type":"ProvisionedThroughput","UpdateType":"Mutable"},"VolumeSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-ebsstorageinfo.html#cfn-msk-cluster-ebsstorageinfo-volumesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.EncryptionAtRest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-encryptionatrest.html","Properties":{"DataVolumeKMSKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-encryptionatrest.html#cfn-msk-cluster-encryptionatrest-datavolumekmskeyid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::MSK::Cluster.EncryptionInTransit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-encryptionintransit.html","Properties":{"ClientBroker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-encryptionintransit.html#cfn-msk-cluster-encryptionintransit-clientbroker","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InCluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-encryptionintransit.html#cfn-msk-cluster-encryptionintransit-incluster","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::MSK::Cluster.EncryptionInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-encryptioninfo.html","Properties":{"EncryptionAtRest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-encryptioninfo.html#cfn-msk-cluster-encryptioninfo-encryptionatrest","Required":false,"Type":"EncryptionAtRest","UpdateType":"Immutable"},"EncryptionInTransit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-encryptioninfo.html#cfn-msk-cluster-encryptioninfo-encryptionintransit","Required":false,"Type":"EncryptionInTransit","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.Firehose":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-firehose.html","Properties":{"DeliveryStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-firehose.html#cfn-msk-cluster-firehose-deliverystream","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-firehose.html#cfn-msk-cluster-firehose-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.Iam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-iam.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-iam.html#cfn-msk-cluster-iam-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.JmxExporter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-jmxexporter.html","Properties":{"EnabledInBroker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-jmxexporter.html#cfn-msk-cluster-jmxexporter-enabledinbroker","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.LoggingInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-logginginfo.html","Properties":{"BrokerLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-logginginfo.html#cfn-msk-cluster-logginginfo-brokerlogs","Required":true,"Type":"BrokerLogs","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.NodeExporter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-nodeexporter.html","Properties":{"EnabledInBroker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-nodeexporter.html#cfn-msk-cluster-nodeexporter-enabledinbroker","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.OpenMonitoring":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-openmonitoring.html","Properties":{"Prometheus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-openmonitoring.html#cfn-msk-cluster-openmonitoring-prometheus","Required":true,"Type":"Prometheus","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.Prometheus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-prometheus.html","Properties":{"JmxExporter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-prometheus.html#cfn-msk-cluster-prometheus-jmxexporter","Required":false,"Type":"JmxExporter","UpdateType":"Mutable"},"NodeExporter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-prometheus.html#cfn-msk-cluster-prometheus-nodeexporter","Required":false,"Type":"NodeExporter","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.ProvisionedThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-provisionedthroughput.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-provisionedthroughput.html#cfn-msk-cluster-provisionedthroughput-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"VolumeThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-provisionedthroughput.html#cfn-msk-cluster-provisionedthroughput-volumethroughput","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.PublicAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-publicaccess.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-publicaccess.html#cfn-msk-cluster-publicaccess-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-s3.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-s3.html#cfn-msk-cluster-s3-bucket","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-s3.html#cfn-msk-cluster-s3-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-s3.html#cfn-msk-cluster-s3-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.Sasl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-sasl.html","Properties":{"Iam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-sasl.html#cfn-msk-cluster-sasl-iam","Required":false,"Type":"Iam","UpdateType":"Mutable"},"Scram":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-sasl.html#cfn-msk-cluster-sasl-scram","Required":false,"Type":"Scram","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.Scram":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-scram.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-scram.html#cfn-msk-cluster-scram-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.StorageInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-storageinfo.html","Properties":{"EBSStorageInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-storageinfo.html#cfn-msk-cluster-storageinfo-ebsstorageinfo","Required":false,"Type":"EBSStorageInfo","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.Tls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-tls.html","Properties":{"CertificateAuthorityArnList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-tls.html#cfn-msk-cluster-tls-certificateauthorityarnlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-tls.html#cfn-msk-cluster-tls-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.Unauthenticated":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-unauthenticated.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-unauthenticated.html#cfn-msk-cluster-unauthenticated-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.VpcConnectivity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivity.html","Properties":{"ClientAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivity.html#cfn-msk-cluster-vpcconnectivity-clientauthentication","Required":false,"Type":"VpcConnectivityClientAuthentication","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.VpcConnectivityClientAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivityclientauthentication.html","Properties":{"Sasl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivityclientauthentication.html#cfn-msk-cluster-vpcconnectivityclientauthentication-sasl","Required":false,"Type":"VpcConnectivitySasl","UpdateType":"Mutable"},"Tls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivityclientauthentication.html#cfn-msk-cluster-vpcconnectivityclientauthentication-tls","Required":false,"Type":"VpcConnectivityTls","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.VpcConnectivityIam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivityiam.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivityiam.html#cfn-msk-cluster-vpcconnectivityiam-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.VpcConnectivitySasl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivitysasl.html","Properties":{"Iam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivitysasl.html#cfn-msk-cluster-vpcconnectivitysasl-iam","Required":false,"Type":"VpcConnectivityIam","UpdateType":"Mutable"},"Scram":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivitysasl.html#cfn-msk-cluster-vpcconnectivitysasl-scram","Required":false,"Type":"VpcConnectivityScram","UpdateType":"Mutable"}}},"AWS::MSK::Cluster.VpcConnectivityScram":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivityscram.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivityscram.html#cfn-msk-cluster-vpcconnectivityscram-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::MSK::Cluster.VpcConnectivityTls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivitytls.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-cluster-vpcconnectivitytls.html#cfn-msk-cluster-vpcconnectivitytls-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::MSK::ServerlessCluster.ClientAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-serverlesscluster-clientauthentication.html","Properties":{"Sasl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-serverlesscluster-clientauthentication.html#cfn-msk-serverlesscluster-clientauthentication-sasl","Required":true,"Type":"Sasl","UpdateType":"Immutable"}}},"AWS::MSK::ServerlessCluster.Iam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-serverlesscluster-iam.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-serverlesscluster-iam.html#cfn-msk-serverlesscluster-iam-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"}}},"AWS::MSK::ServerlessCluster.Sasl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-serverlesscluster-sasl.html","Properties":{"Iam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-serverlesscluster-sasl.html#cfn-msk-serverlesscluster-sasl-iam","Required":true,"Type":"Iam","UpdateType":"Immutable"}}},"AWS::MSK::ServerlessCluster.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-serverlesscluster-vpcconfig.html","Properties":{"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-serverlesscluster-vpcconfig.html#cfn-msk-serverlesscluster-vpcconfig-securitygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-msk-serverlesscluster-vpcconfig.html#cfn-msk-serverlesscluster-vpcconfig-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::MWAA::Environment.LoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-loggingconfiguration.html","Properties":{"DagProcessingLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-loggingconfiguration.html#cfn-mwaa-environment-loggingconfiguration-dagprocessinglogs","Required":false,"Type":"ModuleLoggingConfiguration","UpdateType":"Mutable"},"SchedulerLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-loggingconfiguration.html#cfn-mwaa-environment-loggingconfiguration-schedulerlogs","Required":false,"Type":"ModuleLoggingConfiguration","UpdateType":"Mutable"},"TaskLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-loggingconfiguration.html#cfn-mwaa-environment-loggingconfiguration-tasklogs","Required":false,"Type":"ModuleLoggingConfiguration","UpdateType":"Mutable"},"WebserverLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-loggingconfiguration.html#cfn-mwaa-environment-loggingconfiguration-webserverlogs","Required":false,"Type":"ModuleLoggingConfiguration","UpdateType":"Mutable"},"WorkerLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-loggingconfiguration.html#cfn-mwaa-environment-loggingconfiguration-workerlogs","Required":false,"Type":"ModuleLoggingConfiguration","UpdateType":"Mutable"}}},"AWS::MWAA::Environment.ModuleLoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-moduleloggingconfiguration.html","Properties":{"CloudWatchLogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-moduleloggingconfiguration.html#cfn-mwaa-environment-moduleloggingconfiguration-cloudwatchloggrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-moduleloggingconfiguration.html#cfn-mwaa-environment-moduleloggingconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-moduleloggingconfiguration.html#cfn-mwaa-environment-moduleloggingconfiguration-loglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MWAA::Environment.NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-networkconfiguration.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-networkconfiguration.html#cfn-mwaa-environment-networkconfiguration-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mwaa-environment-networkconfiguration.html#cfn-mwaa-environment-networkconfiguration-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Macie::AllowList.Criteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-allowlist-criteria.html","Properties":{"Regex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-allowlist-criteria.html#cfn-macie-allowlist-criteria-regex","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3WordsList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-allowlist-criteria.html#cfn-macie-allowlist-criteria-s3wordslist","Required":false,"Type":"S3WordsList","UpdateType":"Mutable"}}},"AWS::Macie::AllowList.S3WordsList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-allowlist-s3wordslist.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-allowlist-s3wordslist.html#cfn-macie-allowlist-s3wordslist-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObjectKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-allowlist-s3wordslist.html#cfn-macie-allowlist-s3wordslist-objectkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Macie::FindingsFilter.CriterionAdditionalProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-findingsfilter-criterionadditionalproperties.html","Properties":{"eq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-findingsfilter-criterionadditionalproperties.html#cfn-macie-findingsfilter-criterionadditionalproperties-eq","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"gt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-findingsfilter-criterionadditionalproperties.html#cfn-macie-findingsfilter-criterionadditionalproperties-gt","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"gte":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-findingsfilter-criterionadditionalproperties.html#cfn-macie-findingsfilter-criterionadditionalproperties-gte","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"lt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-findingsfilter-criterionadditionalproperties.html#cfn-macie-findingsfilter-criterionadditionalproperties-lt","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"lte":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-findingsfilter-criterionadditionalproperties.html#cfn-macie-findingsfilter-criterionadditionalproperties-lte","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"neq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-findingsfilter-criterionadditionalproperties.html#cfn-macie-findingsfilter-criterionadditionalproperties-neq","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Macie::FindingsFilter.FindingCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-findingsfilter-findingcriteria.html","Properties":{"Criterion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-macie-findingsfilter-findingcriteria.html#cfn-macie-findingsfilter-findingcriteria-criterion","ItemType":"CriterionAdditionalProperties","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Member.ApprovalThresholdPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-approvalthresholdpolicy.html","Properties":{"ProposalDurationInHours":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-approvalthresholdpolicy.html#cfn-managedblockchain-member-approvalthresholdpolicy-proposaldurationinhours","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ThresholdComparator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-approvalthresholdpolicy.html#cfn-managedblockchain-member-approvalthresholdpolicy-thresholdcomparator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThresholdPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-approvalthresholdpolicy.html#cfn-managedblockchain-member-approvalthresholdpolicy-thresholdpercentage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Member.MemberConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-memberconfiguration.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-memberconfiguration.html#cfn-managedblockchain-member-memberconfiguration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MemberFrameworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-memberconfiguration.html#cfn-managedblockchain-member-memberconfiguration-memberframeworkconfiguration","Required":false,"Type":"MemberFrameworkConfiguration","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-memberconfiguration.html#cfn-managedblockchain-member-memberconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Member.MemberFabricConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-memberfabricconfiguration.html","Properties":{"AdminPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-memberfabricconfiguration.html#cfn-managedblockchain-member-memberfabricconfiguration-adminpassword","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AdminUsername":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-memberfabricconfiguration.html#cfn-managedblockchain-member-memberfabricconfiguration-adminusername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Member.MemberFrameworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-memberframeworkconfiguration.html","Properties":{"MemberFabricConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-memberframeworkconfiguration.html#cfn-managedblockchain-member-memberframeworkconfiguration-memberfabricconfiguration","Required":false,"Type":"MemberFabricConfiguration","UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Member.NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-networkconfiguration.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-networkconfiguration.html#cfn-managedblockchain-member-networkconfiguration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Framework":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-networkconfiguration.html#cfn-managedblockchain-member-networkconfiguration-framework","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FrameworkVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-networkconfiguration.html#cfn-managedblockchain-member-networkconfiguration-frameworkversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-networkconfiguration.html#cfn-managedblockchain-member-networkconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NetworkFrameworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-networkconfiguration.html#cfn-managedblockchain-member-networkconfiguration-networkframeworkconfiguration","Required":false,"Type":"NetworkFrameworkConfiguration","UpdateType":"Mutable"},"VotingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-networkconfiguration.html#cfn-managedblockchain-member-networkconfiguration-votingpolicy","Required":true,"Type":"VotingPolicy","UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Member.NetworkFabricConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-networkfabricconfiguration.html","Properties":{"Edition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-networkfabricconfiguration.html#cfn-managedblockchain-member-networkfabricconfiguration-edition","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Member.NetworkFrameworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-networkframeworkconfiguration.html","Properties":{"NetworkFabricConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-networkframeworkconfiguration.html#cfn-managedblockchain-member-networkframeworkconfiguration-networkfabricconfiguration","Required":false,"Type":"NetworkFabricConfiguration","UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Member.VotingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-votingpolicy.html","Properties":{"ApprovalThresholdPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-member-votingpolicy.html#cfn-managedblockchain-member-votingpolicy-approvalthresholdpolicy","Required":false,"Type":"ApprovalThresholdPolicy","UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Node.NodeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-node-nodeconfiguration.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-node-nodeconfiguration.html#cfn-managedblockchain-node-nodeconfiguration-availabilityzone","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-managedblockchain-node-nodeconfiguration.html#cfn-managedblockchain-node-nodeconfiguration-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Bridge.BridgeFlowSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgeflowsource.html","Properties":{"FlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgeflowsource.html#cfn-mediaconnect-bridge-bridgeflowsource-flowarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FlowVpcInterfaceAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgeflowsource.html#cfn-mediaconnect-bridge-bridgeflowsource-flowvpcinterfaceattachment","Required":false,"Type":"VpcInterfaceAttachment","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgeflowsource.html#cfn-mediaconnect-bridge-bridgeflowsource-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Bridge.BridgeNetworkOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworkoutput.html","Properties":{"IpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworkoutput.html#cfn-mediaconnect-bridge-bridgenetworkoutput-ipaddress","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworkoutput.html#cfn-mediaconnect-bridge-bridgenetworkoutput-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NetworkName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworkoutput.html#cfn-mediaconnect-bridge-bridgenetworkoutput-networkname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworkoutput.html#cfn-mediaconnect-bridge-bridgenetworkoutput-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworkoutput.html#cfn-mediaconnect-bridge-bridgenetworkoutput-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Ttl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworkoutput.html#cfn-mediaconnect-bridge-bridgenetworkoutput-ttl","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Bridge.BridgeNetworkSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworksource.html","Properties":{"MulticastIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworksource.html#cfn-mediaconnect-bridge-bridgenetworksource-multicastip","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworksource.html#cfn-mediaconnect-bridge-bridgenetworksource-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NetworkName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworksource.html#cfn-mediaconnect-bridge-bridgenetworksource-networkname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworksource.html#cfn-mediaconnect-bridge-bridgenetworksource-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgenetworksource.html#cfn-mediaconnect-bridge-bridgenetworksource-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Bridge.BridgeOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgeoutput.html","Properties":{"NetworkOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgeoutput.html#cfn-mediaconnect-bridge-bridgeoutput-networkoutput","Required":false,"Type":"BridgeNetworkOutput","UpdateType":"Mutable"}}},"AWS::MediaConnect::Bridge.BridgeSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgesource.html","Properties":{"FlowSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgesource.html#cfn-mediaconnect-bridge-bridgesource-flowsource","Required":false,"Type":"BridgeFlowSource","UpdateType":"Mutable"},"NetworkSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-bridgesource.html#cfn-mediaconnect-bridge-bridgesource-networksource","Required":false,"Type":"BridgeNetworkSource","UpdateType":"Mutable"}}},"AWS::MediaConnect::Bridge.EgressGatewayBridge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-egressgatewaybridge.html","Properties":{"MaxBitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-egressgatewaybridge.html#cfn-mediaconnect-bridge-egressgatewaybridge-maxbitrate","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Bridge.FailoverConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-failoverconfig.html","Properties":{"FailoverMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-failoverconfig.html#cfn-mediaconnect-bridge-failoverconfig-failovermode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourcePriority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-failoverconfig.html#cfn-mediaconnect-bridge-failoverconfig-sourcepriority","Required":false,"Type":"SourcePriority","UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-failoverconfig.html#cfn-mediaconnect-bridge-failoverconfig-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Bridge.IngressGatewayBridge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-ingressgatewaybridge.html","Properties":{"MaxBitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-ingressgatewaybridge.html#cfn-mediaconnect-bridge-ingressgatewaybridge-maxbitrate","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MaxOutputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-ingressgatewaybridge.html#cfn-mediaconnect-bridge-ingressgatewaybridge-maxoutputs","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Bridge.SourcePriority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-sourcepriority.html","Properties":{"PrimarySource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-sourcepriority.html#cfn-mediaconnect-bridge-sourcepriority-primarysource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Bridge.VpcInterfaceAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-vpcinterfaceattachment.html","Properties":{"VpcInterfaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridge-vpcinterfaceattachment.html#cfn-mediaconnect-bridge-vpcinterfaceattachment-vpcinterfacename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::BridgeOutput.BridgeNetworkOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgeoutput-bridgenetworkoutput.html","Properties":{"IpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgeoutput-bridgenetworkoutput.html#cfn-mediaconnect-bridgeoutput-bridgenetworkoutput-ipaddress","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NetworkName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgeoutput-bridgenetworkoutput.html#cfn-mediaconnect-bridgeoutput-bridgenetworkoutput-networkname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgeoutput-bridgenetworkoutput.html#cfn-mediaconnect-bridgeoutput-bridgenetworkoutput-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgeoutput-bridgenetworkoutput.html#cfn-mediaconnect-bridgeoutput-bridgenetworkoutput-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Ttl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgeoutput-bridgenetworkoutput.html#cfn-mediaconnect-bridgeoutput-bridgenetworkoutput-ttl","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConnect::BridgeSource.BridgeFlowSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-bridgeflowsource.html","Properties":{"FlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-bridgeflowsource.html#cfn-mediaconnect-bridgesource-bridgeflowsource-flowarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FlowVpcInterfaceAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-bridgeflowsource.html#cfn-mediaconnect-bridgesource-bridgeflowsource-flowvpcinterfaceattachment","Required":false,"Type":"VpcInterfaceAttachment","UpdateType":"Mutable"}}},"AWS::MediaConnect::BridgeSource.BridgeNetworkSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-bridgenetworksource.html","Properties":{"MulticastIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-bridgenetworksource.html#cfn-mediaconnect-bridgesource-bridgenetworksource-multicastip","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NetworkName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-bridgenetworksource.html#cfn-mediaconnect-bridgesource-bridgenetworksource-networkname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-bridgenetworksource.html#cfn-mediaconnect-bridgesource-bridgenetworksource-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-bridgenetworksource.html#cfn-mediaconnect-bridgesource-bridgenetworksource-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConnect::BridgeSource.VpcInterfaceAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-vpcinterfaceattachment.html","Properties":{"VpcInterfaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-bridgesource-vpcinterfaceattachment.html#cfn-mediaconnect-bridgesource-vpcinterfaceattachment-vpcinterfacename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Flow.Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-encryption.html","Properties":{"Algorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-encryption.html#cfn-mediaconnect-flow-encryption-algorithm","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConstantInitializationVector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-encryption.html#cfn-mediaconnect-flow-encryption-constantinitializationvector","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-encryption.html#cfn-mediaconnect-flow-encryption-deviceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-encryption.html#cfn-mediaconnect-flow-encryption-keytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-encryption.html#cfn-mediaconnect-flow-encryption-region","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-encryption.html#cfn-mediaconnect-flow-encryption-resourceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-encryption.html#cfn-mediaconnect-flow-encryption-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-encryption.html#cfn-mediaconnect-flow-encryption-secretarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-encryption.html#cfn-mediaconnect-flow-encryption-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Flow.FailoverConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-failoverconfig.html","Properties":{"FailoverMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-failoverconfig.html#cfn-mediaconnect-flow-failoverconfig-failovermode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RecoveryWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-failoverconfig.html#cfn-mediaconnect-flow-failoverconfig-recoverywindow","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SourcePriority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-failoverconfig.html#cfn-mediaconnect-flow-failoverconfig-sourcepriority","Required":false,"Type":"SourcePriority","UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-failoverconfig.html#cfn-mediaconnect-flow-failoverconfig-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Flow.GatewayBridgeSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-gatewaybridgesource.html","Properties":{"BridgeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-gatewaybridgesource.html#cfn-mediaconnect-flow-gatewaybridgesource-bridgearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpcInterfaceAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-gatewaybridgesource.html#cfn-mediaconnect-flow-gatewaybridgesource-vpcinterfaceattachment","Required":false,"Type":"VpcInterfaceAttachment","UpdateType":"Mutable"}}},"AWS::MediaConnect::Flow.Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html","Properties":{"Decryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-decryption","Required":false,"Type":"Encryption","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EntitlementArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-entitlementarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GatewayBridgeSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-gatewaybridgesource","Required":false,"Type":"GatewayBridgeSource","UpdateType":"Mutable"},"IngestIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-ingestip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IngestPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-ingestport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxBitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-maxbitrate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxLatency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-maxlatency","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinLatency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-minlatency","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SenderControlPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-sendercontrolport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SenderIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-senderipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-sourcearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceIngestPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-sourceingestport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceListenerAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-sourcelisteneraddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceListenerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-sourcelistenerport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StreamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-streamid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcInterfaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-vpcinterfacename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WhitelistCidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-source.html#cfn-mediaconnect-flow-source-whitelistcidr","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Flow.SourcePriority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-sourcepriority.html","Properties":{"PrimarySource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-sourcepriority.html#cfn-mediaconnect-flow-sourcepriority-primarysource","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Flow.VpcInterfaceAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-vpcinterfaceattachment.html","Properties":{"VpcInterfaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flow-vpcinterfaceattachment.html#cfn-mediaconnect-flow-vpcinterfaceattachment-vpcinterfacename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::FlowEntitlement.Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowentitlement-encryption.html","Properties":{"Algorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowentitlement-encryption.html#cfn-mediaconnect-flowentitlement-encryption-algorithm","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConstantInitializationVector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowentitlement-encryption.html#cfn-mediaconnect-flowentitlement-encryption-constantinitializationvector","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowentitlement-encryption.html#cfn-mediaconnect-flowentitlement-encryption-deviceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowentitlement-encryption.html#cfn-mediaconnect-flowentitlement-encryption-keytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowentitlement-encryption.html#cfn-mediaconnect-flowentitlement-encryption-region","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowentitlement-encryption.html#cfn-mediaconnect-flowentitlement-encryption-resourceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowentitlement-encryption.html#cfn-mediaconnect-flowentitlement-encryption-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowentitlement-encryption.html#cfn-mediaconnect-flowentitlement-encryption-secretarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowentitlement-encryption.html#cfn-mediaconnect-flowentitlement-encryption-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::FlowOutput.Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowoutput-encryption.html","Properties":{"Algorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowoutput-encryption.html#cfn-mediaconnect-flowoutput-encryption-algorithm","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowoutput-encryption.html#cfn-mediaconnect-flowoutput-encryption-keytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowoutput-encryption.html#cfn-mediaconnect-flowoutput-encryption-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowoutput-encryption.html#cfn-mediaconnect-flowoutput-encryption-secretarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConnect::FlowOutput.VpcInterfaceAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowoutput-vpcinterfaceattachment.html","Properties":{"VpcInterfaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowoutput-vpcinterfaceattachment.html#cfn-mediaconnect-flowoutput-vpcinterfaceattachment-vpcinterfacename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::FlowSource.Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-encryption.html","Properties":{"Algorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-encryption.html#cfn-mediaconnect-flowsource-encryption-algorithm","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConstantInitializationVector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-encryption.html#cfn-mediaconnect-flowsource-encryption-constantinitializationvector","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-encryption.html#cfn-mediaconnect-flowsource-encryption-deviceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-encryption.html#cfn-mediaconnect-flowsource-encryption-keytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-encryption.html#cfn-mediaconnect-flowsource-encryption-region","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-encryption.html#cfn-mediaconnect-flowsource-encryption-resourceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-encryption.html#cfn-mediaconnect-flowsource-encryption-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-encryption.html#cfn-mediaconnect-flowsource-encryption-secretarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-encryption.html#cfn-mediaconnect-flowsource-encryption-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::FlowSource.GatewayBridgeSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-gatewaybridgesource.html","Properties":{"BridgeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-gatewaybridgesource.html#cfn-mediaconnect-flowsource-gatewaybridgesource-bridgearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpcInterfaceAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-gatewaybridgesource.html#cfn-mediaconnect-flowsource-gatewaybridgesource-vpcinterfaceattachment","Required":false,"Type":"VpcInterfaceAttachment","UpdateType":"Mutable"}}},"AWS::MediaConnect::FlowSource.VpcInterfaceAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-vpcinterfaceattachment.html","Properties":{"VpcInterfaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-flowsource-vpcinterfaceattachment.html#cfn-mediaconnect-flowsource-vpcinterfaceattachment-vpcinterfacename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Gateway.GatewayNetwork":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-gateway-gatewaynetwork.html","Properties":{"CidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-gateway-gatewaynetwork.html#cfn-mediaconnect-gateway-gatewaynetwork-cidrblock","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconnect-gateway-gatewaynetwork.html#cfn-mediaconnect-gateway-gatewaynetwork-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::MediaConvert::JobTemplate.AccelerationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconvert-jobtemplate-accelerationsettings.html","Properties":{"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconvert-jobtemplate-accelerationsettings.html#cfn-mediaconvert-jobtemplate-accelerationsettings-mode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConvert::JobTemplate.HopDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconvert-jobtemplate-hopdestination.html","Properties":{"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconvert-jobtemplate-hopdestination.html#cfn-mediaconvert-jobtemplate-hopdestination-priority","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Queue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconvert-jobtemplate-hopdestination.html#cfn-mediaconvert-jobtemplate-hopdestination-queue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WaitMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediaconvert-jobtemplate-hopdestination.html#cfn-mediaconvert-jobtemplate-hopdestination-waitminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AacSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aacsettings.html","Properties":{"Bitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aacsettings.html#cfn-medialive-channel-aacsettings-bitrate","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"CodingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aacsettings.html#cfn-medialive-channel-aacsettings-codingmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aacsettings.html#cfn-medialive-channel-aacsettings-inputtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Profile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aacsettings.html#cfn-medialive-channel-aacsettings-profile","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RateControlMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aacsettings.html#cfn-medialive-channel-aacsettings-ratecontrolmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RawFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aacsettings.html#cfn-medialive-channel-aacsettings-rawformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SampleRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aacsettings.html#cfn-medialive-channel-aacsettings-samplerate","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Spec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aacsettings.html#cfn-medialive-channel-aacsettings-spec","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VbrQuality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aacsettings.html#cfn-medialive-channel-aacsettings-vbrquality","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Ac3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ac3settings.html","Properties":{"Bitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ac3settings.html#cfn-medialive-channel-ac3settings-bitrate","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"BitstreamMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ac3settings.html#cfn-medialive-channel-ac3settings-bitstreammode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CodingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ac3settings.html#cfn-medialive-channel-ac3settings-codingmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Dialnorm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ac3settings.html#cfn-medialive-channel-ac3settings-dialnorm","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DrcProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ac3settings.html#cfn-medialive-channel-ac3settings-drcprofile","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LfeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ac3settings.html#cfn-medialive-channel-ac3settings-lfefilter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetadataControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ac3settings.html#cfn-medialive-channel-ac3settings-metadatacontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AncillarySourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ancillarysourcesettings.html","Properties":{"SourceAncillaryChannelNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ancillarysourcesettings.html#cfn-medialive-channel-ancillarysourcesettings-sourceancillarychannelnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.ArchiveCdnSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archivecdnsettings.html","Properties":{"ArchiveS3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archivecdnsettings.html#cfn-medialive-channel-archivecdnsettings-archives3settings","Required":false,"Type":"ArchiveS3Settings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.ArchiveContainerSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archivecontainersettings.html","Properties":{"M2tsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archivecontainersettings.html#cfn-medialive-channel-archivecontainersettings-m2tssettings","Required":false,"Type":"M2tsSettings","UpdateType":"Mutable"},"RawSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archivecontainersettings.html#cfn-medialive-channel-archivecontainersettings-rawsettings","Required":false,"Type":"RawSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.ArchiveGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archivegroupsettings.html","Properties":{"ArchiveCdnSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archivegroupsettings.html#cfn-medialive-channel-archivegroupsettings-archivecdnsettings","Required":false,"Type":"ArchiveCdnSettings","UpdateType":"Mutable"},"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archivegroupsettings.html#cfn-medialive-channel-archivegroupsettings-destination","Required":false,"Type":"OutputLocationRef","UpdateType":"Mutable"},"RolloverInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archivegroupsettings.html#cfn-medialive-channel-archivegroupsettings-rolloverinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.ArchiveOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archiveoutputsettings.html","Properties":{"ContainerSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archiveoutputsettings.html#cfn-medialive-channel-archiveoutputsettings-containersettings","Required":false,"Type":"ArchiveContainerSettings","UpdateType":"Mutable"},"Extension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archiveoutputsettings.html#cfn-medialive-channel-archiveoutputsettings-extension","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NameModifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archiveoutputsettings.html#cfn-medialive-channel-archiveoutputsettings-namemodifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.ArchiveS3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archives3settings.html","Properties":{"CannedAcl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-archives3settings.html#cfn-medialive-channel-archives3settings-cannedacl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AribDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aribdestinationsettings.html","Properties":{}},"AWS::MediaLive::Channel.AribSourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-aribsourcesettings.html","Properties":{}},"AWS::MediaLive::Channel.AudioChannelMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiochannelmapping.html","Properties":{"InputChannelLevels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiochannelmapping.html#cfn-medialive-channel-audiochannelmapping-inputchannellevels","ItemType":"InputChannelLevel","Required":false,"Type":"List","UpdateType":"Mutable"},"OutputChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiochannelmapping.html#cfn-medialive-channel-audiochannelmapping-outputchannel","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioCodecSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiocodecsettings.html","Properties":{"AacSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiocodecsettings.html#cfn-medialive-channel-audiocodecsettings-aacsettings","Required":false,"Type":"AacSettings","UpdateType":"Mutable"},"Ac3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiocodecsettings.html#cfn-medialive-channel-audiocodecsettings-ac3settings","Required":false,"Type":"Ac3Settings","UpdateType":"Mutable"},"Eac3AtmosSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiocodecsettings.html#cfn-medialive-channel-audiocodecsettings-eac3atmossettings","Required":false,"Type":"Eac3AtmosSettings","UpdateType":"Mutable"},"Eac3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiocodecsettings.html#cfn-medialive-channel-audiocodecsettings-eac3settings","Required":false,"Type":"Eac3Settings","UpdateType":"Mutable"},"Mp2Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiocodecsettings.html#cfn-medialive-channel-audiocodecsettings-mp2settings","Required":false,"Type":"Mp2Settings","UpdateType":"Mutable"},"PassThroughSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiocodecsettings.html#cfn-medialive-channel-audiocodecsettings-passthroughsettings","Required":false,"Type":"PassThroughSettings","UpdateType":"Mutable"},"WavSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiocodecsettings.html#cfn-medialive-channel-audiocodecsettings-wavsettings","Required":false,"Type":"WavSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html","Properties":{"AudioNormalizationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html#cfn-medialive-channel-audiodescription-audionormalizationsettings","Required":false,"Type":"AudioNormalizationSettings","UpdateType":"Mutable"},"AudioSelectorName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html#cfn-medialive-channel-audiodescription-audioselectorname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AudioType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html#cfn-medialive-channel-audiodescription-audiotype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AudioTypeControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html#cfn-medialive-channel-audiodescription-audiotypecontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AudioWatermarkingSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html#cfn-medialive-channel-audiodescription-audiowatermarkingsettings","Required":false,"Type":"AudioWatermarkSettings","UpdateType":"Mutable"},"CodecSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html#cfn-medialive-channel-audiodescription-codecsettings","Required":false,"Type":"AudioCodecSettings","UpdateType":"Mutable"},"LanguageCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html#cfn-medialive-channel-audiodescription-languagecode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LanguageCodeControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html#cfn-medialive-channel-audiodescription-languagecodecontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html#cfn-medialive-channel-audiodescription-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemixSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html#cfn-medialive-channel-audiodescription-remixsettings","Required":false,"Type":"RemixSettings","UpdateType":"Mutable"},"StreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodescription.html#cfn-medialive-channel-audiodescription-streamname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioDolbyEDecode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodolbyedecode.html","Properties":{"ProgramSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiodolbyedecode.html#cfn-medialive-channel-audiodolbyedecode-programselection","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioHlsRenditionSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiohlsrenditionselection.html","Properties":{"GroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiohlsrenditionselection.html#cfn-medialive-channel-audiohlsrenditionselection-groupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiohlsrenditionselection.html#cfn-medialive-channel-audiohlsrenditionselection-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioLanguageSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiolanguageselection.html","Properties":{"LanguageCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiolanguageselection.html#cfn-medialive-channel-audiolanguageselection-languagecode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LanguageSelectionPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiolanguageselection.html#cfn-medialive-channel-audiolanguageselection-languageselectionpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioNormalizationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audionormalizationsettings.html","Properties":{"Algorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audionormalizationsettings.html#cfn-medialive-channel-audionormalizationsettings-algorithm","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlgorithmControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audionormalizationsettings.html#cfn-medialive-channel-audionormalizationsettings-algorithmcontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetLkfs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audionormalizationsettings.html#cfn-medialive-channel-audionormalizationsettings-targetlkfs","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioOnlyHlsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioonlyhlssettings.html","Properties":{"AudioGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioonlyhlssettings.html#cfn-medialive-channel-audioonlyhlssettings-audiogroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AudioOnlyImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioonlyhlssettings.html#cfn-medialive-channel-audioonlyhlssettings-audioonlyimage","Required":false,"Type":"InputLocation","UpdateType":"Mutable"},"AudioTrackType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioonlyhlssettings.html#cfn-medialive-channel-audioonlyhlssettings-audiotracktype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SegmentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioonlyhlssettings.html#cfn-medialive-channel-audioonlyhlssettings-segmenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioPidSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiopidselection.html","Properties":{"Pid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiopidselection.html#cfn-medialive-channel-audiopidselection-pid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioselector.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioselector.html#cfn-medialive-channel-audioselector-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectorSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioselector.html#cfn-medialive-channel-audioselector-selectorsettings","Required":false,"Type":"AudioSelectorSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioSelectorSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioselectorsettings.html","Properties":{"AudioHlsRenditionSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioselectorsettings.html#cfn-medialive-channel-audioselectorsettings-audiohlsrenditionselection","Required":false,"Type":"AudioHlsRenditionSelection","UpdateType":"Mutable"},"AudioLanguageSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioselectorsettings.html#cfn-medialive-channel-audioselectorsettings-audiolanguageselection","Required":false,"Type":"AudioLanguageSelection","UpdateType":"Mutable"},"AudioPidSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioselectorsettings.html#cfn-medialive-channel-audioselectorsettings-audiopidselection","Required":false,"Type":"AudioPidSelection","UpdateType":"Mutable"},"AudioTrackSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audioselectorsettings.html#cfn-medialive-channel-audioselectorsettings-audiotrackselection","Required":false,"Type":"AudioTrackSelection","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioSilenceFailoverSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiosilencefailoversettings.html","Properties":{"AudioSelectorName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiosilencefailoversettings.html#cfn-medialive-channel-audiosilencefailoversettings-audioselectorname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AudioSilenceThresholdMsec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiosilencefailoversettings.html#cfn-medialive-channel-audiosilencefailoversettings-audiosilencethresholdmsec","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioTrack":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiotrack.html","Properties":{"Track":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiotrack.html#cfn-medialive-channel-audiotrack-track","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioTrackSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiotrackselection.html","Properties":{"DolbyEDecode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiotrackselection.html#cfn-medialive-channel-audiotrackselection-dolbyedecode","Required":false,"Type":"AudioDolbyEDecode","UpdateType":"Mutable"},"Tracks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiotrackselection.html#cfn-medialive-channel-audiotrackselection-tracks","ItemType":"AudioTrack","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AudioWatermarkSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiowatermarksettings.html","Properties":{"NielsenWatermarksSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-audiowatermarksettings.html#cfn-medialive-channel-audiowatermarksettings-nielsenwatermarkssettings","Required":false,"Type":"NielsenWatermarksSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AutomaticInputFailoverSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-automaticinputfailoversettings.html","Properties":{"ErrorClearTimeMsec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-automaticinputfailoversettings.html#cfn-medialive-channel-automaticinputfailoversettings-errorcleartimemsec","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FailoverConditions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-automaticinputfailoversettings.html#cfn-medialive-channel-automaticinputfailoversettings-failoverconditions","ItemType":"FailoverCondition","Required":false,"Type":"List","UpdateType":"Mutable"},"InputPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-automaticinputfailoversettings.html#cfn-medialive-channel-automaticinputfailoversettings-inputpreference","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecondaryInputId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-automaticinputfailoversettings.html#cfn-medialive-channel-automaticinputfailoversettings-secondaryinputid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AvailBlanking":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-availblanking.html","Properties":{"AvailBlankingImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-availblanking.html#cfn-medialive-channel-availblanking-availblankingimage","Required":false,"Type":"InputLocation","UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-availblanking.html#cfn-medialive-channel-availblanking-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AvailConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-availconfiguration.html","Properties":{"AvailSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-availconfiguration.html#cfn-medialive-channel-availconfiguration-availsettings","Required":false,"Type":"AvailSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.AvailSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-availsettings.html","Properties":{"Esam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-availsettings.html#cfn-medialive-channel-availsettings-esam","Required":false,"Type":"Esam","UpdateType":"Mutable"},"Scte35SpliceInsert":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-availsettings.html#cfn-medialive-channel-availsettings-scte35spliceinsert","Required":false,"Type":"Scte35SpliceInsert","UpdateType":"Mutable"},"Scte35TimeSignalApos":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-availsettings.html#cfn-medialive-channel-availsettings-scte35timesignalapos","Required":false,"Type":"Scte35TimeSignalApos","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.BlackoutSlate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-blackoutslate.html","Properties":{"BlackoutSlateImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-blackoutslate.html#cfn-medialive-channel-blackoutslate-blackoutslateimage","Required":false,"Type":"InputLocation","UpdateType":"Mutable"},"NetworkEndBlackout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-blackoutslate.html#cfn-medialive-channel-blackoutslate-networkendblackout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkEndBlackoutImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-blackoutslate.html#cfn-medialive-channel-blackoutslate-networkendblackoutimage","Required":false,"Type":"InputLocation","UpdateType":"Mutable"},"NetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-blackoutslate.html#cfn-medialive-channel-blackoutslate-networkid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-blackoutslate.html#cfn-medialive-channel-blackoutslate-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.BurnInDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html","Properties":{"Alignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-alignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BackgroundOpacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-backgroundopacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Font":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-font","Required":false,"Type":"InputLocation","UpdateType":"Mutable"},"FontColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-fontcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontOpacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-fontopacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FontResolution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-fontresolution","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FontSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-fontsize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutlineColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-outlinecolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutlineSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-outlinesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ShadowColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-shadowcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ShadowOpacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-shadowopacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ShadowXOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-shadowxoffset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ShadowYOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-shadowyoffset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TeletextGridControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-teletextgridcontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"XPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-xposition","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"YPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-burnindestinationsettings.html#cfn-medialive-channel-burnindestinationsettings-yposition","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.CaptionDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondescription.html","Properties":{"Accessibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondescription.html#cfn-medialive-channel-captiondescription-accessibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CaptionSelectorName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondescription.html#cfn-medialive-channel-captiondescription-captionselectorname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondescription.html#cfn-medialive-channel-captiondescription-destinationsettings","Required":false,"Type":"CaptionDestinationSettings","UpdateType":"Mutable"},"LanguageCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondescription.html#cfn-medialive-channel-captiondescription-languagecode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LanguageDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondescription.html#cfn-medialive-channel-captiondescription-languagedescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondescription.html#cfn-medialive-channel-captiondescription-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.CaptionDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html","Properties":{"AribDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-aribdestinationsettings","Required":false,"Type":"AribDestinationSettings","UpdateType":"Mutable"},"BurnInDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-burnindestinationsettings","Required":false,"Type":"BurnInDestinationSettings","UpdateType":"Mutable"},"DvbSubDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-dvbsubdestinationsettings","Required":false,"Type":"DvbSubDestinationSettings","UpdateType":"Mutable"},"EbuTtDDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-ebuttddestinationsettings","Required":false,"Type":"EbuTtDDestinationSettings","UpdateType":"Mutable"},"EmbeddedDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-embeddeddestinationsettings","Required":false,"Type":"EmbeddedDestinationSettings","UpdateType":"Mutable"},"EmbeddedPlusScte20DestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-embeddedplusscte20destinationsettings","Required":false,"Type":"EmbeddedPlusScte20DestinationSettings","UpdateType":"Mutable"},"RtmpCaptionInfoDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-rtmpcaptioninfodestinationsettings","Required":false,"Type":"RtmpCaptionInfoDestinationSettings","UpdateType":"Mutable"},"Scte20PlusEmbeddedDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-scte20plusembeddeddestinationsettings","Required":false,"Type":"Scte20PlusEmbeddedDestinationSettings","UpdateType":"Mutable"},"Scte27DestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-scte27destinationsettings","Required":false,"Type":"Scte27DestinationSettings","UpdateType":"Mutable"},"SmpteTtDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-smptettdestinationsettings","Required":false,"Type":"SmpteTtDestinationSettings","UpdateType":"Mutable"},"TeletextDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-teletextdestinationsettings","Required":false,"Type":"TeletextDestinationSettings","UpdateType":"Mutable"},"TtmlDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-ttmldestinationsettings","Required":false,"Type":"TtmlDestinationSettings","UpdateType":"Mutable"},"WebvttDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captiondestinationsettings.html#cfn-medialive-channel-captiondestinationsettings-webvttdestinationsettings","Required":false,"Type":"WebvttDestinationSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.CaptionLanguageMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionlanguagemapping.html","Properties":{"CaptionChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionlanguagemapping.html#cfn-medialive-channel-captionlanguagemapping-captionchannel","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"LanguageCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionlanguagemapping.html#cfn-medialive-channel-captionlanguagemapping-languagecode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LanguageDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionlanguagemapping.html#cfn-medialive-channel-captionlanguagemapping-languagedescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.CaptionRectangle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionrectangle.html","Properties":{"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionrectangle.html#cfn-medialive-channel-captionrectangle-height","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"LeftOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionrectangle.html#cfn-medialive-channel-captionrectangle-leftoffset","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TopOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionrectangle.html#cfn-medialive-channel-captionrectangle-topoffset","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionrectangle.html#cfn-medialive-channel-captionrectangle-width","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.CaptionSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselector.html","Properties":{"LanguageCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselector.html#cfn-medialive-channel-captionselector-languagecode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselector.html#cfn-medialive-channel-captionselector-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectorSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselector.html#cfn-medialive-channel-captionselector-selectorsettings","Required":false,"Type":"CaptionSelectorSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.CaptionSelectorSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselectorsettings.html","Properties":{"AncillarySourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselectorsettings.html#cfn-medialive-channel-captionselectorsettings-ancillarysourcesettings","Required":false,"Type":"AncillarySourceSettings","UpdateType":"Mutable"},"AribSourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselectorsettings.html#cfn-medialive-channel-captionselectorsettings-aribsourcesettings","Required":false,"Type":"AribSourceSettings","UpdateType":"Mutable"},"DvbSubSourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselectorsettings.html#cfn-medialive-channel-captionselectorsettings-dvbsubsourcesettings","Required":false,"Type":"DvbSubSourceSettings","UpdateType":"Mutable"},"EmbeddedSourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselectorsettings.html#cfn-medialive-channel-captionselectorsettings-embeddedsourcesettings","Required":false,"Type":"EmbeddedSourceSettings","UpdateType":"Mutable"},"Scte20SourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselectorsettings.html#cfn-medialive-channel-captionselectorsettings-scte20sourcesettings","Required":false,"Type":"Scte20SourceSettings","UpdateType":"Mutable"},"Scte27SourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselectorsettings.html#cfn-medialive-channel-captionselectorsettings-scte27sourcesettings","Required":false,"Type":"Scte27SourceSettings","UpdateType":"Mutable"},"TeletextSourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-captionselectorsettings.html#cfn-medialive-channel-captionselectorsettings-teletextsourcesettings","Required":false,"Type":"TeletextSourceSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.CdiInputSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-cdiinputspecification.html","Properties":{"Resolution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-cdiinputspecification.html#cfn-medialive-channel-cdiinputspecification-resolution","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.ColorSpacePassthroughSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-colorspacepassthroughsettings.html","Properties":{}},"AWS::MediaLive::Channel.DolbyVision81Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dolbyvision81settings.html","Properties":{}},"AWS::MediaLive::Channel.DvbNitSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbnitsettings.html","Properties":{"NetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbnitsettings.html#cfn-medialive-channel-dvbnitsettings-networkid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NetworkName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbnitsettings.html#cfn-medialive-channel-dvbnitsettings-networkname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RepInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbnitsettings.html#cfn-medialive-channel-dvbnitsettings-repinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.DvbSdtSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsdtsettings.html","Properties":{"OutputSdt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsdtsettings.html#cfn-medialive-channel-dvbsdtsettings-outputsdt","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RepInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsdtsettings.html#cfn-medialive-channel-dvbsdtsettings-repinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsdtsettings.html#cfn-medialive-channel-dvbsdtsettings-servicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServiceProviderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsdtsettings.html#cfn-medialive-channel-dvbsdtsettings-serviceprovidername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.DvbSubDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html","Properties":{"Alignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-alignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BackgroundOpacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-backgroundopacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Font":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-font","Required":false,"Type":"InputLocation","UpdateType":"Mutable"},"FontColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-fontcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontOpacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-fontopacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FontResolution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-fontresolution","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FontSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-fontsize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutlineColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-outlinecolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutlineSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-outlinesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ShadowColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-shadowcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ShadowOpacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-shadowopacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ShadowXOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-shadowxoffset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ShadowYOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-shadowyoffset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TeletextGridControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-teletextgridcontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"XPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-xposition","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"YPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubdestinationsettings.html#cfn-medialive-channel-dvbsubdestinationsettings-yposition","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.DvbSubSourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubsourcesettings.html","Properties":{"OcrLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubsourcesettings.html#cfn-medialive-channel-dvbsubsourcesettings-ocrlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Pid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbsubsourcesettings.html#cfn-medialive-channel-dvbsubsourcesettings-pid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.DvbTdtSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbtdtsettings.html","Properties":{"RepInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-dvbtdtsettings.html#cfn-medialive-channel-dvbtdtsettings-repinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Eac3AtmosSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3atmossettings.html","Properties":{"Bitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3atmossettings.html#cfn-medialive-channel-eac3atmossettings-bitrate","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"CodingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3atmossettings.html#cfn-medialive-channel-eac3atmossettings-codingmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Dialnorm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3atmossettings.html#cfn-medialive-channel-eac3atmossettings-dialnorm","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DrcLine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3atmossettings.html#cfn-medialive-channel-eac3atmossettings-drcline","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DrcRf":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3atmossettings.html#cfn-medialive-channel-eac3atmossettings-drcrf","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HeightTrim":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3atmossettings.html#cfn-medialive-channel-eac3atmossettings-heighttrim","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"SurroundTrim":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3atmossettings.html#cfn-medialive-channel-eac3atmossettings-surroundtrim","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Eac3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html","Properties":{"AttenuationControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-attenuationcontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Bitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-bitrate","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"BitstreamMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-bitstreammode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CodingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-codingmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DcFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-dcfilter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Dialnorm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-dialnorm","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DrcLine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-drcline","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DrcRf":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-drcrf","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LfeControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-lfecontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LfeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-lfefilter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoRoCenterMixLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-lorocentermixlevel","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"LoRoSurroundMixLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-lorosurroundmixlevel","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"LtRtCenterMixLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-ltrtcentermixlevel","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"LtRtSurroundMixLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-ltrtsurroundmixlevel","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MetadataControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-metadatacontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PassthroughControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-passthroughcontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PhaseControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-phasecontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StereoDownmix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-stereodownmix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SurroundExMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-surroundexmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SurroundMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-eac3settings.html#cfn-medialive-channel-eac3settings-surroundmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.EbuTtDDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ebuttddestinationsettings.html","Properties":{"CopyrightHolder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ebuttddestinationsettings.html#cfn-medialive-channel-ebuttddestinationsettings-copyrightholder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FillLineGap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ebuttddestinationsettings.html#cfn-medialive-channel-ebuttddestinationsettings-filllinegap","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontFamily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ebuttddestinationsettings.html#cfn-medialive-channel-ebuttddestinationsettings-fontfamily","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StyleControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ebuttddestinationsettings.html#cfn-medialive-channel-ebuttddestinationsettings-stylecontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.EmbeddedDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-embeddeddestinationsettings.html","Properties":{}},"AWS::MediaLive::Channel.EmbeddedPlusScte20DestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-embeddedplusscte20destinationsettings.html","Properties":{}},"AWS::MediaLive::Channel.EmbeddedSourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-embeddedsourcesettings.html","Properties":{"Convert608To708":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-embeddedsourcesettings.html#cfn-medialive-channel-embeddedsourcesettings-convert608to708","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scte20Detection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-embeddedsourcesettings.html#cfn-medialive-channel-embeddedsourcesettings-scte20detection","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Source608ChannelNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-embeddedsourcesettings.html#cfn-medialive-channel-embeddedsourcesettings-source608channelnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Source608TrackNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-embeddedsourcesettings.html#cfn-medialive-channel-embeddedsourcesettings-source608tracknumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.EncoderSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html","Properties":{"AudioDescriptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-audiodescriptions","ItemType":"AudioDescription","Required":false,"Type":"List","UpdateType":"Mutable"},"AvailBlanking":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-availblanking","Required":false,"Type":"AvailBlanking","UpdateType":"Mutable"},"AvailConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-availconfiguration","Required":false,"Type":"AvailConfiguration","UpdateType":"Mutable"},"BlackoutSlate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-blackoutslate","Required":false,"Type":"BlackoutSlate","UpdateType":"Mutable"},"CaptionDescriptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-captiondescriptions","ItemType":"CaptionDescription","Required":false,"Type":"List","UpdateType":"Mutable"},"FeatureActivations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-featureactivations","Required":false,"Type":"FeatureActivations","UpdateType":"Mutable"},"GlobalConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-globalconfiguration","Required":false,"Type":"GlobalConfiguration","UpdateType":"Mutable"},"MotionGraphicsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-motiongraphicsconfiguration","Required":false,"Type":"MotionGraphicsConfiguration","UpdateType":"Mutable"},"NielsenConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-nielsenconfiguration","Required":false,"Type":"NielsenConfiguration","UpdateType":"Mutable"},"OutputGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-outputgroups","ItemType":"OutputGroup","Required":false,"Type":"List","UpdateType":"Mutable"},"TimecodeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-timecodeconfig","Required":false,"Type":"TimecodeConfig","UpdateType":"Mutable"},"VideoDescriptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-encodersettings.html#cfn-medialive-channel-encodersettings-videodescriptions","ItemType":"VideoDescription","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Esam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-esam.html","Properties":{"AcquisitionPointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-esam.html#cfn-medialive-channel-esam-acquisitionpointid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AdAvailOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-esam.html#cfn-medialive-channel-esam-adavailoffset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PasswordParam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-esam.html#cfn-medialive-channel-esam-passwordparam","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PoisEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-esam.html#cfn-medialive-channel-esam-poisendpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-esam.html#cfn-medialive-channel-esam-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ZoneIdentity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-esam.html#cfn-medialive-channel-esam-zoneidentity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.FailoverCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-failovercondition.html","Properties":{"FailoverConditionSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-failovercondition.html#cfn-medialive-channel-failovercondition-failoverconditionsettings","Required":false,"Type":"FailoverConditionSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.FailoverConditionSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-failoverconditionsettings.html","Properties":{"AudioSilenceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-failoverconditionsettings.html#cfn-medialive-channel-failoverconditionsettings-audiosilencesettings","Required":false,"Type":"AudioSilenceFailoverSettings","UpdateType":"Mutable"},"InputLossSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-failoverconditionsettings.html#cfn-medialive-channel-failoverconditionsettings-inputlosssettings","Required":false,"Type":"InputLossFailoverSettings","UpdateType":"Mutable"},"VideoBlackSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-failoverconditionsettings.html#cfn-medialive-channel-failoverconditionsettings-videoblacksettings","Required":false,"Type":"VideoBlackFailoverSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.FeatureActivations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-featureactivations.html","Properties":{"InputPrepareScheduleActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-featureactivations.html#cfn-medialive-channel-featureactivations-inputpreparescheduleactions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.FecOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-fecoutputsettings.html","Properties":{"ColumnDepth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-fecoutputsettings.html#cfn-medialive-channel-fecoutputsettings-columndepth","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IncludeFec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-fecoutputsettings.html#cfn-medialive-channel-fecoutputsettings-includefec","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RowLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-fecoutputsettings.html#cfn-medialive-channel-fecoutputsettings-rowlength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Fmp4HlsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-fmp4hlssettings.html","Properties":{"AudioRenditionSets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-fmp4hlssettings.html#cfn-medialive-channel-fmp4hlssettings-audiorenditionsets","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NielsenId3Behavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-fmp4hlssettings.html#cfn-medialive-channel-fmp4hlssettings-nielsenid3behavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimedMetadataBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-fmp4hlssettings.html#cfn-medialive-channel-fmp4hlssettings-timedmetadatabehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.FrameCaptureCdnSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecapturecdnsettings.html","Properties":{"FrameCaptureS3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecapturecdnsettings.html#cfn-medialive-channel-framecapturecdnsettings-framecaptures3settings","Required":false,"Type":"FrameCaptureS3Settings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.FrameCaptureGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecapturegroupsettings.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecapturegroupsettings.html#cfn-medialive-channel-framecapturegroupsettings-destination","Required":false,"Type":"OutputLocationRef","UpdateType":"Mutable"},"FrameCaptureCdnSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecapturegroupsettings.html#cfn-medialive-channel-framecapturegroupsettings-framecapturecdnsettings","Required":false,"Type":"FrameCaptureCdnSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.FrameCaptureHlsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecapturehlssettings.html","Properties":{}},"AWS::MediaLive::Channel.FrameCaptureOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecaptureoutputsettings.html","Properties":{"NameModifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecaptureoutputsettings.html#cfn-medialive-channel-framecaptureoutputsettings-namemodifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.FrameCaptureS3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecaptures3settings.html","Properties":{"CannedAcl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecaptures3settings.html#cfn-medialive-channel-framecaptures3settings-cannedacl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.FrameCaptureSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecapturesettings.html","Properties":{"CaptureInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecapturesettings.html#cfn-medialive-channel-framecapturesettings-captureinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CaptureIntervalUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecapturesettings.html#cfn-medialive-channel-framecapturesettings-captureintervalunits","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimecodeBurninSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-framecapturesettings.html#cfn-medialive-channel-framecapturesettings-timecodeburninsettings","Required":false,"Type":"TimecodeBurninSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.GlobalConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-globalconfiguration.html","Properties":{"InitialAudioGain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-globalconfiguration.html#cfn-medialive-channel-globalconfiguration-initialaudiogain","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"InputEndAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-globalconfiguration.html#cfn-medialive-channel-globalconfiguration-inputendaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputLossBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-globalconfiguration.html#cfn-medialive-channel-globalconfiguration-inputlossbehavior","Required":false,"Type":"InputLossBehavior","UpdateType":"Mutable"},"OutputLockingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-globalconfiguration.html#cfn-medialive-channel-globalconfiguration-outputlockingmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutputTimingSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-globalconfiguration.html#cfn-medialive-channel-globalconfiguration-outputtimingsource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SupportLowFramerateInputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-globalconfiguration.html#cfn-medialive-channel-globalconfiguration-supportlowframerateinputs","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.H264ColorSpaceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264colorspacesettings.html","Properties":{"ColorSpacePassthroughSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264colorspacesettings.html#cfn-medialive-channel-h264colorspacesettings-colorspacepassthroughsettings","Required":false,"Type":"ColorSpacePassthroughSettings","UpdateType":"Mutable"},"Rec601Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264colorspacesettings.html#cfn-medialive-channel-h264colorspacesettings-rec601settings","Required":false,"Type":"Rec601Settings","UpdateType":"Mutable"},"Rec709Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264colorspacesettings.html#cfn-medialive-channel-h264colorspacesettings-rec709settings","Required":false,"Type":"Rec709Settings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.H264FilterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264filtersettings.html","Properties":{"TemporalFilterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264filtersettings.html#cfn-medialive-channel-h264filtersettings-temporalfiltersettings","Required":false,"Type":"TemporalFilterSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.H264Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html","Properties":{"AdaptiveQuantization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-adaptivequantization","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AfdSignaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-afdsignaling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Bitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-bitrate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"BufFillPct":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-buffillpct","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"BufSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-bufsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ColorMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-colormetadata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColorSpaceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-colorspacesettings","Required":false,"Type":"H264ColorSpaceSettings","UpdateType":"Mutable"},"EntropyEncoding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-entropyencoding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-filtersettings","Required":false,"Type":"H264FilterSettings","UpdateType":"Mutable"},"FixedAfd":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-fixedafd","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FlickerAq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-flickeraq","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ForceFieldPictures":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-forcefieldpictures","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FramerateControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-frameratecontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FramerateDenominator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-frameratedenominator","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FramerateNumerator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-frameratenumerator","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"GopBReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-gopbreference","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GopClosedCadence":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-gopclosedcadence","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"GopNumBFrames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-gopnumbframes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"GopSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-gopsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"GopSizeUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-gopsizeunits","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Level":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-level","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LookAheadRateControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-lookaheadratecontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxBitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-maxbitrate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinIInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-miniinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NumRefFrames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-numrefframes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ParControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-parcontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParDenominator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-pardenominator","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ParNumerator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-parnumerator","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Profile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-profile","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"QualityLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-qualitylevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"QvbrQualityLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-qvbrqualitylevel","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RateControlMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-ratecontrolmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScanType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-scantype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SceneChangeDetect":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-scenechangedetect","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Slices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-slices","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Softness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-softness","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SpatialAq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-spatialaq","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubgopLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-subgoplength","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Syntax":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-syntax","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemporalAq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-temporalaq","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimecodeBurninSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-timecodeburninsettings","Required":false,"Type":"TimecodeBurninSettings","UpdateType":"Mutable"},"TimecodeInsertion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h264settings.html#cfn-medialive-channel-h264settings-timecodeinsertion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.H265ColorSpaceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265colorspacesettings.html","Properties":{"ColorSpacePassthroughSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265colorspacesettings.html#cfn-medialive-channel-h265colorspacesettings-colorspacepassthroughsettings","Required":false,"Type":"ColorSpacePassthroughSettings","UpdateType":"Mutable"},"DolbyVision81Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265colorspacesettings.html#cfn-medialive-channel-h265colorspacesettings-dolbyvision81settings","Required":false,"Type":"DolbyVision81Settings","UpdateType":"Mutable"},"Hdr10Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265colorspacesettings.html#cfn-medialive-channel-h265colorspacesettings-hdr10settings","Required":false,"Type":"Hdr10Settings","UpdateType":"Mutable"},"Rec601Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265colorspacesettings.html#cfn-medialive-channel-h265colorspacesettings-rec601settings","Required":false,"Type":"Rec601Settings","UpdateType":"Mutable"},"Rec709Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265colorspacesettings.html#cfn-medialive-channel-h265colorspacesettings-rec709settings","Required":false,"Type":"Rec709Settings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.H265FilterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265filtersettings.html","Properties":{"TemporalFilterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265filtersettings.html#cfn-medialive-channel-h265filtersettings-temporalfiltersettings","Required":false,"Type":"TemporalFilterSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.H265Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html","Properties":{"AdaptiveQuantization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-adaptivequantization","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AfdSignaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-afdsignaling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlternativeTransferFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-alternativetransferfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Bitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-bitrate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"BufSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-bufsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ColorMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-colormetadata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColorSpaceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-colorspacesettings","Required":false,"Type":"H265ColorSpaceSettings","UpdateType":"Mutable"},"FilterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-filtersettings","Required":false,"Type":"H265FilterSettings","UpdateType":"Mutable"},"FixedAfd":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-fixedafd","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FlickerAq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-flickeraq","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FramerateDenominator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-frameratedenominator","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FramerateNumerator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-frameratenumerator","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"GopClosedCadence":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-gopclosedcadence","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"GopSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-gopsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"GopSizeUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-gopsizeunits","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Level":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-level","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LookAheadRateControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-lookaheadratecontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxBitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-maxbitrate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinIInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-miniinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ParDenominator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-pardenominator","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ParNumerator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-parnumerator","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Profile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-profile","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"QvbrQualityLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-qvbrqualitylevel","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RateControlMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-ratecontrolmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScanType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-scantype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SceneChangeDetect":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-scenechangedetect","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Slices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-slices","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Tier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-tier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimecodeBurninSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-timecodeburninsettings","Required":false,"Type":"TimecodeBurninSettings","UpdateType":"Mutable"},"TimecodeInsertion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-h265settings.html#cfn-medialive-channel-h265settings-timecodeinsertion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Hdr10Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hdr10settings.html","Properties":{"MaxCll":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hdr10settings.html#cfn-medialive-channel-hdr10settings-maxcll","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxFall":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hdr10settings.html#cfn-medialive-channel-hdr10settings-maxfall","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.HlsAkamaiSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsakamaisettings.html","Properties":{"ConnectionRetryInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsakamaisettings.html#cfn-medialive-channel-hlsakamaisettings-connectionretryinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FilecacheDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsakamaisettings.html#cfn-medialive-channel-hlsakamaisettings-filecacheduration","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HttpTransferMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsakamaisettings.html#cfn-medialive-channel-hlsakamaisettings-httptransfermode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsakamaisettings.html#cfn-medialive-channel-hlsakamaisettings-numretries","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RestartDelay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsakamaisettings.html#cfn-medialive-channel-hlsakamaisettings-restartdelay","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Salt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsakamaisettings.html#cfn-medialive-channel-hlsakamaisettings-salt","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Token":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsakamaisettings.html#cfn-medialive-channel-hlsakamaisettings-token","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.HlsBasicPutSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsbasicputsettings.html","Properties":{"ConnectionRetryInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsbasicputsettings.html#cfn-medialive-channel-hlsbasicputsettings-connectionretryinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FilecacheDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsbasicputsettings.html#cfn-medialive-channel-hlsbasicputsettings-filecacheduration","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NumRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsbasicputsettings.html#cfn-medialive-channel-hlsbasicputsettings-numretries","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RestartDelay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsbasicputsettings.html#cfn-medialive-channel-hlsbasicputsettings-restartdelay","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.HlsCdnSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlscdnsettings.html","Properties":{"HlsAkamaiSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlscdnsettings.html#cfn-medialive-channel-hlscdnsettings-hlsakamaisettings","Required":false,"Type":"HlsAkamaiSettings","UpdateType":"Mutable"},"HlsBasicPutSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlscdnsettings.html#cfn-medialive-channel-hlscdnsettings-hlsbasicputsettings","Required":false,"Type":"HlsBasicPutSettings","UpdateType":"Mutable"},"HlsMediaStoreSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlscdnsettings.html#cfn-medialive-channel-hlscdnsettings-hlsmediastoresettings","Required":false,"Type":"HlsMediaStoreSettings","UpdateType":"Mutable"},"HlsS3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlscdnsettings.html#cfn-medialive-channel-hlscdnsettings-hlss3settings","Required":false,"Type":"HlsS3Settings","UpdateType":"Mutable"},"HlsWebdavSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlscdnsettings.html#cfn-medialive-channel-hlscdnsettings-hlswebdavsettings","Required":false,"Type":"HlsWebdavSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.HlsGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html","Properties":{"AdMarkers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-admarkers","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"BaseUrlContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-baseurlcontent","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BaseUrlContent1":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-baseurlcontent1","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BaseUrlManifest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-baseurlmanifest","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BaseUrlManifest1":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-baseurlmanifest1","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CaptionLanguageMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-captionlanguagemappings","ItemType":"CaptionLanguageMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"CaptionLanguageSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-captionlanguagesetting","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientCache":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-clientcache","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CodecSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-codecspecification","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConstantIv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-constantiv","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-destination","Required":false,"Type":"OutputLocationRef","UpdateType":"Mutable"},"DirectoryStructure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-directorystructure","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DiscontinuityTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-discontinuitytags","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-encryptiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HlsCdnSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-hlscdnsettings","Required":false,"Type":"HlsCdnSettings","UpdateType":"Mutable"},"HlsId3SegmentTagging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-hlsid3segmenttagging","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IFrameOnlyPlaylists":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-iframeonlyplaylists","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IncompleteSegmentBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-incompletesegmentbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexNSegments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-indexnsegments","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"InputLossAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-inputlossaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IvInManifest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-ivinmanifest","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IvSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-ivsource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeepSegments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-keepsegments","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"KeyFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-keyformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyFormatVersions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-keyformatversions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyProviderSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-keyprovidersettings","Required":false,"Type":"KeyProviderSettings","UpdateType":"Mutable"},"ManifestCompression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-manifestcompression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ManifestDurationFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-manifestdurationformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MinSegmentLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-minsegmentlength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-mode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutputSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-outputselection","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProgramDateTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-programdatetime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProgramDateTimeClock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-programdatetimeclock","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProgramDateTimePeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-programdatetimeperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RedundantManifest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-redundantmanifest","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SegmentLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-segmentlength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SegmentationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-segmentationmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SegmentsPerSubdirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-segmentspersubdirectory","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StreamInfResolution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-streaminfresolution","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimedMetadataId3Frame":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-timedmetadataid3frame","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimedMetadataId3Period":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-timedmetadataid3period","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TimestampDeltaMilliseconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-timestampdeltamilliseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TsFileMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsgroupsettings.html#cfn-medialive-channel-hlsgroupsettings-tsfilemode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.HlsInputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsinputsettings.html","Properties":{"Bandwidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsinputsettings.html#cfn-medialive-channel-hlsinputsettings-bandwidth","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"BufferSegments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsinputsettings.html#cfn-medialive-channel-hlsinputsettings-buffersegments","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Retries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsinputsettings.html#cfn-medialive-channel-hlsinputsettings-retries","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RetryInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsinputsettings.html#cfn-medialive-channel-hlsinputsettings-retryinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Scte35Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsinputsettings.html#cfn-medialive-channel-hlsinputsettings-scte35source","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.HlsMediaStoreSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsmediastoresettings.html","Properties":{"ConnectionRetryInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsmediastoresettings.html#cfn-medialive-channel-hlsmediastoresettings-connectionretryinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FilecacheDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsmediastoresettings.html#cfn-medialive-channel-hlsmediastoresettings-filecacheduration","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MediaStoreStorageClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsmediastoresettings.html#cfn-medialive-channel-hlsmediastoresettings-mediastorestorageclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsmediastoresettings.html#cfn-medialive-channel-hlsmediastoresettings-numretries","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RestartDelay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsmediastoresettings.html#cfn-medialive-channel-hlsmediastoresettings-restartdelay","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.HlsOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsoutputsettings.html","Properties":{"H265PackagingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsoutputsettings.html#cfn-medialive-channel-hlsoutputsettings-h265packagingtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HlsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsoutputsettings.html#cfn-medialive-channel-hlsoutputsettings-hlssettings","Required":false,"Type":"HlsSettings","UpdateType":"Mutable"},"NameModifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsoutputsettings.html#cfn-medialive-channel-hlsoutputsettings-namemodifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SegmentModifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlsoutputsettings.html#cfn-medialive-channel-hlsoutputsettings-segmentmodifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.HlsS3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlss3settings.html","Properties":{"CannedAcl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlss3settings.html#cfn-medialive-channel-hlss3settings-cannedacl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.HlsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlssettings.html","Properties":{"AudioOnlyHlsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlssettings.html#cfn-medialive-channel-hlssettings-audioonlyhlssettings","Required":false,"Type":"AudioOnlyHlsSettings","UpdateType":"Mutable"},"Fmp4HlsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlssettings.html#cfn-medialive-channel-hlssettings-fmp4hlssettings","Required":false,"Type":"Fmp4HlsSettings","UpdateType":"Mutable"},"FrameCaptureHlsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlssettings.html#cfn-medialive-channel-hlssettings-framecapturehlssettings","Required":false,"Type":"FrameCaptureHlsSettings","UpdateType":"Mutable"},"StandardHlsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlssettings.html#cfn-medialive-channel-hlssettings-standardhlssettings","Required":false,"Type":"StandardHlsSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.HlsWebdavSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlswebdavsettings.html","Properties":{"ConnectionRetryInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlswebdavsettings.html#cfn-medialive-channel-hlswebdavsettings-connectionretryinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FilecacheDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlswebdavsettings.html#cfn-medialive-channel-hlswebdavsettings-filecacheduration","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HttpTransferMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlswebdavsettings.html#cfn-medialive-channel-hlswebdavsettings-httptransfermode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlswebdavsettings.html#cfn-medialive-channel-hlswebdavsettings-numretries","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RestartDelay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-hlswebdavsettings.html#cfn-medialive-channel-hlswebdavsettings-restartdelay","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.HtmlMotionGraphicsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-htmlmotiongraphicssettings.html","Properties":{}},"AWS::MediaLive::Channel.InputAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputattachment.html","Properties":{"AutomaticInputFailoverSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputattachment.html#cfn-medialive-channel-inputattachment-automaticinputfailoversettings","Required":false,"Type":"AutomaticInputFailoverSettings","UpdateType":"Mutable"},"InputAttachmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputattachment.html#cfn-medialive-channel-inputattachment-inputattachmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputattachment.html#cfn-medialive-channel-inputattachment-inputid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputattachment.html#cfn-medialive-channel-inputattachment-inputsettings","Required":false,"Type":"InputSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.InputChannelLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputchannellevel.html","Properties":{"Gain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputchannellevel.html#cfn-medialive-channel-inputchannellevel-gain","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"InputChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputchannellevel.html#cfn-medialive-channel-inputchannellevel-inputchannel","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.InputLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlocation.html","Properties":{"PasswordParam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlocation.html#cfn-medialive-channel-inputlocation-passwordparam","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlocation.html#cfn-medialive-channel-inputlocation-uri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlocation.html#cfn-medialive-channel-inputlocation-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.InputLossBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlossbehavior.html","Properties":{"BlackFrameMsec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlossbehavior.html#cfn-medialive-channel-inputlossbehavior-blackframemsec","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"InputLossImageColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlossbehavior.html#cfn-medialive-channel-inputlossbehavior-inputlossimagecolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputLossImageSlate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlossbehavior.html#cfn-medialive-channel-inputlossbehavior-inputlossimageslate","Required":false,"Type":"InputLocation","UpdateType":"Mutable"},"InputLossImageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlossbehavior.html#cfn-medialive-channel-inputlossbehavior-inputlossimagetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RepeatFrameMsec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlossbehavior.html#cfn-medialive-channel-inputlossbehavior-repeatframemsec","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.InputLossFailoverSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlossfailoversettings.html","Properties":{"InputLossThresholdMsec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputlossfailoversettings.html#cfn-medialive-channel-inputlossfailoversettings-inputlossthresholdmsec","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.InputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html","Properties":{"AudioSelectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html#cfn-medialive-channel-inputsettings-audioselectors","ItemType":"AudioSelector","Required":false,"Type":"List","UpdateType":"Mutable"},"CaptionSelectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html#cfn-medialive-channel-inputsettings-captionselectors","ItemType":"CaptionSelector","Required":false,"Type":"List","UpdateType":"Mutable"},"DeblockFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html#cfn-medialive-channel-inputsettings-deblockfilter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DenoiseFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html#cfn-medialive-channel-inputsettings-denoisefilter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilterStrength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html#cfn-medialive-channel-inputsettings-filterstrength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"InputFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html#cfn-medialive-channel-inputsettings-inputfilter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkInputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html#cfn-medialive-channel-inputsettings-networkinputsettings","Required":false,"Type":"NetworkInputSettings","UpdateType":"Mutable"},"Scte35Pid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html#cfn-medialive-channel-inputsettings-scte35pid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Smpte2038DataPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html#cfn-medialive-channel-inputsettings-smpte2038datapreference","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceEndBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html#cfn-medialive-channel-inputsettings-sourceendbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VideoSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputsettings.html#cfn-medialive-channel-inputsettings-videoselector","Required":false,"Type":"VideoSelector","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.InputSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputspecification.html","Properties":{"Codec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputspecification.html#cfn-medialive-channel-inputspecification-codec","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaximumBitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputspecification.html#cfn-medialive-channel-inputspecification-maximumbitrate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Resolution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-inputspecification.html#cfn-medialive-channel-inputspecification-resolution","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.KeyProviderSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-keyprovidersettings.html","Properties":{"StaticKeySettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-keyprovidersettings.html#cfn-medialive-channel-keyprovidersettings-statickeysettings","Required":false,"Type":"StaticKeySettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.M2tsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html","Properties":{"AbsentInputAudioBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-absentinputaudiobehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Arib":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-arib","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AribCaptionsPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-aribcaptionspid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AribCaptionsPidControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-aribcaptionspidcontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AudioBufferModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-audiobuffermodel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AudioFramesPerPes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-audioframesperpes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AudioPids":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-audiopids","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AudioStreamType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-audiostreamtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Bitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-bitrate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"BufferModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-buffermodel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CcDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-ccdescriptor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DvbNitSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-dvbnitsettings","Required":false,"Type":"DvbNitSettings","UpdateType":"Mutable"},"DvbSdtSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-dvbsdtsettings","Required":false,"Type":"DvbSdtSettings","UpdateType":"Mutable"},"DvbSubPids":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-dvbsubpids","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DvbTdtSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-dvbtdtsettings","Required":false,"Type":"DvbTdtSettings","UpdateType":"Mutable"},"DvbTeletextPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-dvbteletextpid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ebif":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-ebif","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EbpAudioInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-ebpaudiointerval","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EbpLookaheadMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-ebplookaheadms","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"EbpPlacement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-ebpplacement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EcmPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-ecmpid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EsRateInPes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-esrateinpes","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EtvPlatformPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-etvplatformpid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EtvSignalPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-etvsignalpid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FragmentTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-fragmenttime","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Klv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-klv","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KlvDataPids":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-klvdatapids","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NielsenId3Behavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-nielsenid3behavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NullPacketBitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-nullpacketbitrate","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PatInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-patinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PcrControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-pcrcontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PcrPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-pcrperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PcrPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-pcrpid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PmtInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-pmtinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PmtPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-pmtpid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProgramNum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-programnum","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RateMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-ratemode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scte27Pids":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-scte27pids","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scte35Control":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-scte35control","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scte35Pid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-scte35pid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scte35PrerollPullupMilliseconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-scte35prerollpullupmilliseconds","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"SegmentationMarkers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-segmentationmarkers","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SegmentationStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-segmentationstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SegmentationTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-segmentationtime","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TimedMetadataBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-timedmetadatabehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimedMetadataPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-timedmetadatapid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TransportStreamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-transportstreamid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VideoPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m2tssettings.html#cfn-medialive-channel-m2tssettings-videopid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.M3u8Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html","Properties":{"AudioFramesPerPes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-audioframesperpes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AudioPids":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-audiopids","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EcmPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-ecmpid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NielsenId3Behavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-nielsenid3behavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PatInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-patinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PcrControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-pcrcontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PcrPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-pcrperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PcrPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-pcrpid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PmtInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-pmtinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PmtPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-pmtpid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProgramNum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-programnum","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Scte35Behavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-scte35behavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scte35Pid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-scte35pid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimedMetadataBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-timedmetadatabehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimedMetadataPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-timedmetadatapid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TransportStreamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-transportstreamid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VideoPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-m3u8settings.html#cfn-medialive-channel-m3u8settings-videopid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.MaintenanceCreateSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-maintenancecreatesettings.html","Properties":{"MaintenanceDay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-maintenancecreatesettings.html#cfn-medialive-channel-maintenancecreatesettings-maintenanceday","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaintenanceStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-maintenancecreatesettings.html#cfn-medialive-channel-maintenancecreatesettings-maintenancestarttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.MaintenanceUpdateSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-maintenanceupdatesettings.html","Properties":{"MaintenanceDay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-maintenanceupdatesettings.html#cfn-medialive-channel-maintenanceupdatesettings-maintenanceday","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaintenanceScheduledDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-maintenanceupdatesettings.html#cfn-medialive-channel-maintenanceupdatesettings-maintenancescheduleddate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaintenanceStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-maintenanceupdatesettings.html#cfn-medialive-channel-maintenanceupdatesettings-maintenancestarttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.MediaPackageGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mediapackagegroupsettings.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mediapackagegroupsettings.html#cfn-medialive-channel-mediapackagegroupsettings-destination","Required":false,"Type":"OutputLocationRef","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.MediaPackageOutputDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mediapackageoutputdestinationsettings.html","Properties":{"ChannelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mediapackageoutputdestinationsettings.html#cfn-medialive-channel-mediapackageoutputdestinationsettings-channelid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.MediaPackageOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mediapackageoutputsettings.html","Properties":{}},"AWS::MediaLive::Channel.MotionGraphicsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-motiongraphicsconfiguration.html","Properties":{"MotionGraphicsInsertion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-motiongraphicsconfiguration.html#cfn-medialive-channel-motiongraphicsconfiguration-motiongraphicsinsertion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MotionGraphicsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-motiongraphicsconfiguration.html#cfn-medialive-channel-motiongraphicsconfiguration-motiongraphicssettings","Required":false,"Type":"MotionGraphicsSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.MotionGraphicsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-motiongraphicssettings.html","Properties":{"HtmlMotionGraphicsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-motiongraphicssettings.html#cfn-medialive-channel-motiongraphicssettings-htmlmotiongraphicssettings","Required":false,"Type":"HtmlMotionGraphicsSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Mp2Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mp2settings.html","Properties":{"Bitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mp2settings.html#cfn-medialive-channel-mp2settings-bitrate","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"CodingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mp2settings.html#cfn-medialive-channel-mp2settings-codingmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SampleRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mp2settings.html#cfn-medialive-channel-mp2settings-samplerate","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Mpeg2FilterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2filtersettings.html","Properties":{"TemporalFilterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2filtersettings.html#cfn-medialive-channel-mpeg2filtersettings-temporalfiltersettings","Required":false,"Type":"TemporalFilterSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Mpeg2Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html","Properties":{"AdaptiveQuantization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-adaptivequantization","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AfdSignaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-afdsignaling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColorMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-colormetadata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColorSpace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-colorspace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayAspectRatio":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-displayaspectratio","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-filtersettings","Required":false,"Type":"Mpeg2FilterSettings","UpdateType":"Mutable"},"FixedAfd":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-fixedafd","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FramerateDenominator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-frameratedenominator","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FramerateNumerator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-frameratenumerator","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"GopClosedCadence":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-gopclosedcadence","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"GopNumBFrames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-gopnumbframes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"GopSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-gopsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"GopSizeUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-gopsizeunits","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScanType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-scantype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubgopLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-subgoplength","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimecodeBurninSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-timecodeburninsettings","Required":false,"Type":"TimecodeBurninSettings","UpdateType":"Mutable"},"TimecodeInsertion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mpeg2settings.html#cfn-medialive-channel-mpeg2settings-timecodeinsertion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.MsSmoothGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html","Properties":{"AcquisitionPointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-acquisitionpointid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AudioOnlyTimecodeControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-audioonlytimecodecontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CertificateMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-certificatemode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectionRetryInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-connectionretryinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-destination","Required":false,"Type":"OutputLocationRef","UpdateType":"Mutable"},"EventId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-eventid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventIdMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-eventidmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventStopBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-eventstopbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilecacheDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-filecacheduration","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FragmentLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-fragmentlength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"InputLossAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-inputlossaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-numretries","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RestartDelay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-restartdelay","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SegmentationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-segmentationmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SendDelayMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-senddelayms","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SparseTrackType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-sparsetracktype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StreamManifestBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-streammanifestbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimestampOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-timestampoffset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimestampOffsetMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothgroupsettings.html#cfn-medialive-channel-mssmoothgroupsettings-timestampoffsetmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.MsSmoothOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothoutputsettings.html","Properties":{"H265PackagingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothoutputsettings.html#cfn-medialive-channel-mssmoothoutputsettings-h265packagingtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NameModifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-mssmoothoutputsettings.html#cfn-medialive-channel-mssmoothoutputsettings-namemodifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.MultiplexGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-multiplexgroupsettings.html","Properties":{}},"AWS::MediaLive::Channel.MultiplexOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-multiplexoutputsettings.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-multiplexoutputsettings.html#cfn-medialive-channel-multiplexoutputsettings-destination","Required":false,"Type":"OutputLocationRef","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.MultiplexProgramChannelDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-multiplexprogramchanneldestinationsettings.html","Properties":{"MultiplexId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-multiplexprogramchanneldestinationsettings.html#cfn-medialive-channel-multiplexprogramchanneldestinationsettings-multiplexid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProgramName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-multiplexprogramchanneldestinationsettings.html#cfn-medialive-channel-multiplexprogramchanneldestinationsettings-programname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.NetworkInputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-networkinputsettings.html","Properties":{"HlsInputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-networkinputsettings.html#cfn-medialive-channel-networkinputsettings-hlsinputsettings","Required":false,"Type":"HlsInputSettings","UpdateType":"Mutable"},"ServerValidation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-networkinputsettings.html#cfn-medialive-channel-networkinputsettings-servervalidation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.NielsenCBET":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsencbet.html","Properties":{"CbetCheckDigitString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsencbet.html#cfn-medialive-channel-nielsencbet-cbetcheckdigitstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CbetStepaside":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsencbet.html#cfn-medialive-channel-nielsencbet-cbetstepaside","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Csid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsencbet.html#cfn-medialive-channel-nielsencbet-csid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.NielsenConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsenconfiguration.html","Properties":{"DistributorId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsenconfiguration.html#cfn-medialive-channel-nielsenconfiguration-distributorid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NielsenPcmToId3Tagging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsenconfiguration.html#cfn-medialive-channel-nielsenconfiguration-nielsenpcmtoid3tagging","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.NielsenNaesIiNw":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsennaesiinw.html","Properties":{"CheckDigitString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsennaesiinw.html#cfn-medialive-channel-nielsennaesiinw-checkdigitstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Sid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsennaesiinw.html#cfn-medialive-channel-nielsennaesiinw-sid","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Timezone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsennaesiinw.html#cfn-medialive-channel-nielsennaesiinw-timezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.NielsenWatermarksSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsenwatermarkssettings.html","Properties":{"NielsenCbetSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsenwatermarkssettings.html#cfn-medialive-channel-nielsenwatermarkssettings-nielsencbetsettings","Required":false,"Type":"NielsenCBET","UpdateType":"Mutable"},"NielsenDistributionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsenwatermarkssettings.html#cfn-medialive-channel-nielsenwatermarkssettings-nielsendistributiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NielsenNaesIiNwSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-nielsenwatermarkssettings.html#cfn-medialive-channel-nielsenwatermarkssettings-nielsennaesiinwsettings","Required":false,"Type":"NielsenNaesIiNw","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-output.html","Properties":{"AudioDescriptionNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-output.html#cfn-medialive-channel-output-audiodescriptionnames","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CaptionDescriptionNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-output.html#cfn-medialive-channel-output-captiondescriptionnames","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OutputName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-output.html#cfn-medialive-channel-output-outputname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-output.html#cfn-medialive-channel-output-outputsettings","Required":false,"Type":"OutputSettings","UpdateType":"Mutable"},"VideoDescriptionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-output.html#cfn-medialive-channel-output-videodescriptionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.OutputDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputdestination.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputdestination.html#cfn-medialive-channel-outputdestination-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MediaPackageSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputdestination.html#cfn-medialive-channel-outputdestination-mediapackagesettings","ItemType":"MediaPackageOutputDestinationSettings","Required":false,"Type":"List","UpdateType":"Mutable"},"MultiplexSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputdestination.html#cfn-medialive-channel-outputdestination-multiplexsettings","Required":false,"Type":"MultiplexProgramChannelDestinationSettings","UpdateType":"Mutable"},"Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputdestination.html#cfn-medialive-channel-outputdestination-settings","ItemType":"OutputDestinationSettings","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.OutputDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputdestinationsettings.html","Properties":{"PasswordParam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputdestinationsettings.html#cfn-medialive-channel-outputdestinationsettings-passwordparam","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputdestinationsettings.html#cfn-medialive-channel-outputdestinationsettings-streamname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputdestinationsettings.html#cfn-medialive-channel-outputdestinationsettings-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputdestinationsettings.html#cfn-medialive-channel-outputdestinationsettings-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.OutputGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroup.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroup.html#cfn-medialive-channel-outputgroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutputGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroup.html#cfn-medialive-channel-outputgroup-outputgroupsettings","Required":false,"Type":"OutputGroupSettings","UpdateType":"Mutable"},"Outputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroup.html#cfn-medialive-channel-outputgroup-outputs","ItemType":"Output","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.OutputGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroupsettings.html","Properties":{"ArchiveGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroupsettings.html#cfn-medialive-channel-outputgroupsettings-archivegroupsettings","Required":false,"Type":"ArchiveGroupSettings","UpdateType":"Mutable"},"FrameCaptureGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroupsettings.html#cfn-medialive-channel-outputgroupsettings-framecapturegroupsettings","Required":false,"Type":"FrameCaptureGroupSettings","UpdateType":"Mutable"},"HlsGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroupsettings.html#cfn-medialive-channel-outputgroupsettings-hlsgroupsettings","Required":false,"Type":"HlsGroupSettings","UpdateType":"Mutable"},"MediaPackageGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroupsettings.html#cfn-medialive-channel-outputgroupsettings-mediapackagegroupsettings","Required":false,"Type":"MediaPackageGroupSettings","UpdateType":"Mutable"},"MsSmoothGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroupsettings.html#cfn-medialive-channel-outputgroupsettings-mssmoothgroupsettings","Required":false,"Type":"MsSmoothGroupSettings","UpdateType":"Mutable"},"MultiplexGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroupsettings.html#cfn-medialive-channel-outputgroupsettings-multiplexgroupsettings","Required":false,"Type":"MultiplexGroupSettings","UpdateType":"Mutable"},"RtmpGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroupsettings.html#cfn-medialive-channel-outputgroupsettings-rtmpgroupsettings","Required":false,"Type":"RtmpGroupSettings","UpdateType":"Mutable"},"UdpGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputgroupsettings.html#cfn-medialive-channel-outputgroupsettings-udpgroupsettings","Required":false,"Type":"UdpGroupSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.OutputLocationRef":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputlocationref.html","Properties":{"DestinationRefId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputlocationref.html#cfn-medialive-channel-outputlocationref-destinationrefid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.OutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputsettings.html","Properties":{"ArchiveOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputsettings.html#cfn-medialive-channel-outputsettings-archiveoutputsettings","Required":false,"Type":"ArchiveOutputSettings","UpdateType":"Mutable"},"FrameCaptureOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputsettings.html#cfn-medialive-channel-outputsettings-framecaptureoutputsettings","Required":false,"Type":"FrameCaptureOutputSettings","UpdateType":"Mutable"},"HlsOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputsettings.html#cfn-medialive-channel-outputsettings-hlsoutputsettings","Required":false,"Type":"HlsOutputSettings","UpdateType":"Mutable"},"MediaPackageOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputsettings.html#cfn-medialive-channel-outputsettings-mediapackageoutputsettings","Required":false,"Type":"MediaPackageOutputSettings","UpdateType":"Mutable"},"MsSmoothOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputsettings.html#cfn-medialive-channel-outputsettings-mssmoothoutputsettings","Required":false,"Type":"MsSmoothOutputSettings","UpdateType":"Mutable"},"MultiplexOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputsettings.html#cfn-medialive-channel-outputsettings-multiplexoutputsettings","Required":false,"Type":"MultiplexOutputSettings","UpdateType":"Mutable"},"RtmpOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputsettings.html#cfn-medialive-channel-outputsettings-rtmpoutputsettings","Required":false,"Type":"RtmpOutputSettings","UpdateType":"Mutable"},"UdpOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-outputsettings.html#cfn-medialive-channel-outputsettings-udpoutputsettings","Required":false,"Type":"UdpOutputSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.PassThroughSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-passthroughsettings.html","Properties":{}},"AWS::MediaLive::Channel.RawSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rawsettings.html","Properties":{}},"AWS::MediaLive::Channel.Rec601Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rec601settings.html","Properties":{}},"AWS::MediaLive::Channel.Rec709Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rec709settings.html","Properties":{}},"AWS::MediaLive::Channel.RemixSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-remixsettings.html","Properties":{"ChannelMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-remixsettings.html#cfn-medialive-channel-remixsettings-channelmappings","ItemType":"AudioChannelMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"ChannelsIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-remixsettings.html#cfn-medialive-channel-remixsettings-channelsin","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ChannelsOut":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-remixsettings.html#cfn-medialive-channel-remixsettings-channelsout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.RtmpCaptionInfoDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpcaptioninfodestinationsettings.html","Properties":{}},"AWS::MediaLive::Channel.RtmpGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpgroupsettings.html","Properties":{"AdMarkers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpgroupsettings.html#cfn-medialive-channel-rtmpgroupsettings-admarkers","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AuthenticationScheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpgroupsettings.html#cfn-medialive-channel-rtmpgroupsettings-authenticationscheme","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CacheFullBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpgroupsettings.html#cfn-medialive-channel-rtmpgroupsettings-cachefullbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CacheLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpgroupsettings.html#cfn-medialive-channel-rtmpgroupsettings-cachelength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CaptionData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpgroupsettings.html#cfn-medialive-channel-rtmpgroupsettings-captiondata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputLossAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpgroupsettings.html#cfn-medialive-channel-rtmpgroupsettings-inputlossaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RestartDelay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpgroupsettings.html#cfn-medialive-channel-rtmpgroupsettings-restartdelay","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.RtmpOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpoutputsettings.html","Properties":{"CertificateMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpoutputsettings.html#cfn-medialive-channel-rtmpoutputsettings-certificatemode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectionRetryInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpoutputsettings.html#cfn-medialive-channel-rtmpoutputsettings-connectionretryinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpoutputsettings.html#cfn-medialive-channel-rtmpoutputsettings-destination","Required":false,"Type":"OutputLocationRef","UpdateType":"Mutable"},"NumRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-rtmpoutputsettings.html#cfn-medialive-channel-rtmpoutputsettings-numretries","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Scte20PlusEmbeddedDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte20plusembeddeddestinationsettings.html","Properties":{}},"AWS::MediaLive::Channel.Scte20SourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte20sourcesettings.html","Properties":{"Convert608To708":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte20sourcesettings.html#cfn-medialive-channel-scte20sourcesettings-convert608to708","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Source608ChannelNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte20sourcesettings.html#cfn-medialive-channel-scte20sourcesettings-source608channelnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Scte27DestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte27destinationsettings.html","Properties":{}},"AWS::MediaLive::Channel.Scte27SourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte27sourcesettings.html","Properties":{"OcrLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte27sourcesettings.html#cfn-medialive-channel-scte27sourcesettings-ocrlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Pid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte27sourcesettings.html#cfn-medialive-channel-scte27sourcesettings-pid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Scte35SpliceInsert":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte35spliceinsert.html","Properties":{"AdAvailOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte35spliceinsert.html#cfn-medialive-channel-scte35spliceinsert-adavailoffset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NoRegionalBlackoutFlag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte35spliceinsert.html#cfn-medialive-channel-scte35spliceinsert-noregionalblackoutflag","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WebDeliveryAllowedFlag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte35spliceinsert.html#cfn-medialive-channel-scte35spliceinsert-webdeliveryallowedflag","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.Scte35TimeSignalApos":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte35timesignalapos.html","Properties":{"AdAvailOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte35timesignalapos.html#cfn-medialive-channel-scte35timesignalapos-adavailoffset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NoRegionalBlackoutFlag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte35timesignalapos.html#cfn-medialive-channel-scte35timesignalapos-noregionalblackoutflag","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WebDeliveryAllowedFlag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-scte35timesignalapos.html#cfn-medialive-channel-scte35timesignalapos-webdeliveryallowedflag","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.SmpteTtDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-smptettdestinationsettings.html","Properties":{}},"AWS::MediaLive::Channel.StandardHlsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-standardhlssettings.html","Properties":{"AudioRenditionSets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-standardhlssettings.html#cfn-medialive-channel-standardhlssettings-audiorenditionsets","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"M3u8Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-standardhlssettings.html#cfn-medialive-channel-standardhlssettings-m3u8settings","Required":false,"Type":"M3u8Settings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.StaticKeySettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-statickeysettings.html","Properties":{"KeyProviderServer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-statickeysettings.html#cfn-medialive-channel-statickeysettings-keyproviderserver","Required":false,"Type":"InputLocation","UpdateType":"Mutable"},"StaticKeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-statickeysettings.html#cfn-medialive-channel-statickeysettings-statickeyvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.TeletextDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-teletextdestinationsettings.html","Properties":{}},"AWS::MediaLive::Channel.TeletextSourceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-teletextsourcesettings.html","Properties":{"OutputRectangle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-teletextsourcesettings.html#cfn-medialive-channel-teletextsourcesettings-outputrectangle","Required":false,"Type":"CaptionRectangle","UpdateType":"Mutable"},"PageNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-teletextsourcesettings.html#cfn-medialive-channel-teletextsourcesettings-pagenumber","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.TemporalFilterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-temporalfiltersettings.html","Properties":{"PostFilterSharpening":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-temporalfiltersettings.html#cfn-medialive-channel-temporalfiltersettings-postfiltersharpening","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Strength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-temporalfiltersettings.html#cfn-medialive-channel-temporalfiltersettings-strength","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.TimecodeBurninSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-timecodeburninsettings.html","Properties":{"FontSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-timecodeburninsettings.html#cfn-medialive-channel-timecodeburninsettings-fontsize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-timecodeburninsettings.html#cfn-medialive-channel-timecodeburninsettings-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-timecodeburninsettings.html#cfn-medialive-channel-timecodeburninsettings-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.TimecodeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-timecodeconfig.html","Properties":{"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-timecodeconfig.html#cfn-medialive-channel-timecodeconfig-source","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SyncThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-timecodeconfig.html#cfn-medialive-channel-timecodeconfig-syncthreshold","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.TtmlDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ttmldestinationsettings.html","Properties":{"StyleControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-ttmldestinationsettings.html#cfn-medialive-channel-ttmldestinationsettings-stylecontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.UdpContainerSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-udpcontainersettings.html","Properties":{"M2tsSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-udpcontainersettings.html#cfn-medialive-channel-udpcontainersettings-m2tssettings","Required":false,"Type":"M2tsSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.UdpGroupSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-udpgroupsettings.html","Properties":{"InputLossAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-udpgroupsettings.html#cfn-medialive-channel-udpgroupsettings-inputlossaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimedMetadataId3Frame":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-udpgroupsettings.html#cfn-medialive-channel-udpgroupsettings-timedmetadataid3frame","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimedMetadataId3Period":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-udpgroupsettings.html#cfn-medialive-channel-udpgroupsettings-timedmetadataid3period","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.UdpOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-udpoutputsettings.html","Properties":{"BufferMsec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-udpoutputsettings.html#cfn-medialive-channel-udpoutputsettings-buffermsec","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ContainerSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-udpoutputsettings.html#cfn-medialive-channel-udpoutputsettings-containersettings","Required":false,"Type":"UdpContainerSettings","UpdateType":"Mutable"},"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-udpoutputsettings.html#cfn-medialive-channel-udpoutputsettings-destination","Required":false,"Type":"OutputLocationRef","UpdateType":"Mutable"},"FecOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-udpoutputsettings.html#cfn-medialive-channel-udpoutputsettings-fecoutputsettings","Required":false,"Type":"FecOutputSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.VideoBlackFailoverSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoblackfailoversettings.html","Properties":{"BlackDetectThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoblackfailoversettings.html#cfn-medialive-channel-videoblackfailoversettings-blackdetectthreshold","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"VideoBlackThresholdMsec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoblackfailoversettings.html#cfn-medialive-channel-videoblackfailoversettings-videoblackthresholdmsec","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.VideoCodecSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videocodecsettings.html","Properties":{"FrameCaptureSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videocodecsettings.html#cfn-medialive-channel-videocodecsettings-framecapturesettings","Required":false,"Type":"FrameCaptureSettings","UpdateType":"Mutable"},"H264Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videocodecsettings.html#cfn-medialive-channel-videocodecsettings-h264settings","Required":false,"Type":"H264Settings","UpdateType":"Mutable"},"H265Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videocodecsettings.html#cfn-medialive-channel-videocodecsettings-h265settings","Required":false,"Type":"H265Settings","UpdateType":"Mutable"},"Mpeg2Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videocodecsettings.html#cfn-medialive-channel-videocodecsettings-mpeg2settings","Required":false,"Type":"Mpeg2Settings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.VideoDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videodescription.html","Properties":{"CodecSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videodescription.html#cfn-medialive-channel-videodescription-codecsettings","Required":false,"Type":"VideoCodecSettings","UpdateType":"Mutable"},"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videodescription.html#cfn-medialive-channel-videodescription-height","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videodescription.html#cfn-medialive-channel-videodescription-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RespondToAfd":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videodescription.html#cfn-medialive-channel-videodescription-respondtoafd","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScalingBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videodescription.html#cfn-medialive-channel-videodescription-scalingbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Sharpness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videodescription.html#cfn-medialive-channel-videodescription-sharpness","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videodescription.html#cfn-medialive-channel-videodescription-width","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.VideoSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselector.html","Properties":{"ColorSpace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselector.html#cfn-medialive-channel-videoselector-colorspace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColorSpaceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselector.html#cfn-medialive-channel-videoselector-colorspacesettings","Required":false,"Type":"VideoSelectorColorSpaceSettings","UpdateType":"Mutable"},"ColorSpaceUsage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselector.html#cfn-medialive-channel-videoselector-colorspaceusage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectorSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselector.html#cfn-medialive-channel-videoselector-selectorsettings","Required":false,"Type":"VideoSelectorSettings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.VideoSelectorColorSpaceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselectorcolorspacesettings.html","Properties":{"Hdr10Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselectorcolorspacesettings.html#cfn-medialive-channel-videoselectorcolorspacesettings-hdr10settings","Required":false,"Type":"Hdr10Settings","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.VideoSelectorPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselectorpid.html","Properties":{"Pid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselectorpid.html#cfn-medialive-channel-videoselectorpid-pid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.VideoSelectorProgramId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselectorprogramid.html","Properties":{"ProgramId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselectorprogramid.html#cfn-medialive-channel-videoselectorprogramid-programid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.VideoSelectorSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselectorsettings.html","Properties":{"VideoSelectorPid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselectorsettings.html#cfn-medialive-channel-videoselectorsettings-videoselectorpid","Required":false,"Type":"VideoSelectorPid","UpdateType":"Mutable"},"VideoSelectorProgramId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-videoselectorsettings.html#cfn-medialive-channel-videoselectorsettings-videoselectorprogramid","Required":false,"Type":"VideoSelectorProgramId","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.VpcOutputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-vpcoutputsettings.html","Properties":{"PublicAddressAllocationIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-vpcoutputsettings.html#cfn-medialive-channel-vpcoutputsettings-publicaddressallocationids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-vpcoutputsettings.html#cfn-medialive-channel-vpcoutputsettings-securitygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-vpcoutputsettings.html#cfn-medialive-channel-vpcoutputsettings-subnetids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.WavSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-wavsettings.html","Properties":{"BitDepth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-wavsettings.html#cfn-medialive-channel-wavsettings-bitdepth","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"CodingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-wavsettings.html#cfn-medialive-channel-wavsettings-codingmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SampleRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-wavsettings.html#cfn-medialive-channel-wavsettings-samplerate","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel.WebvttDestinationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-webvttdestinationsettings.html","Properties":{"StyleControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-channel-webvttdestinationsettings.html#cfn-medialive-channel-webvttdestinationsettings-stylecontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Input.InputDestinationRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputdestinationrequest.html","Properties":{"StreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputdestinationrequest.html#cfn-medialive-input-inputdestinationrequest-streamname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Input.InputDeviceRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputdevicerequest.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputdevicerequest.html#cfn-medialive-input-inputdevicerequest-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Input.InputDeviceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputdevicesettings.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputdevicesettings.html#cfn-medialive-input-inputdevicesettings-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Input.InputSourceRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputsourcerequest.html","Properties":{"PasswordParam":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputsourcerequest.html#cfn-medialive-input-inputsourcerequest-passwordparam","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputsourcerequest.html#cfn-medialive-input-inputsourcerequest-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputsourcerequest.html#cfn-medialive-input-inputsourcerequest-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Input.InputVpcRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputvpcrequest.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputvpcrequest.html#cfn-medialive-input-inputvpcrequest-securitygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-inputvpcrequest.html#cfn-medialive-input-inputvpcrequest-subnetids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaLive::Input.MediaConnectFlowRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-mediaconnectflowrequest.html","Properties":{"FlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-input-mediaconnectflowrequest.html#cfn-medialive-input-mediaconnectflowrequest-flowarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::InputSecurityGroup.InputWhitelistRuleCidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-inputsecuritygroup-inputwhitelistrulecidr.html","Properties":{"Cidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-medialive-inputsecuritygroup-inputwhitelistrulecidr.html#cfn-medialive-inputsecuritygroup-inputwhitelistrulecidr-cidr","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaPackage::Asset.EgressEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-asset-egressendpoint.html","Properties":{"PackagingConfigurationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-asset-egressendpoint.html#cfn-mediapackage-asset-egressendpoint-packagingconfigurationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-asset-egressendpoint.html#cfn-mediapackage-asset-egressendpoint-url","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaPackage::Channel.HlsIngest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-hlsingest.html","Properties":{"ingestEndpoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-hlsingest.html#cfn-mediapackage-channel-hlsingest-ingestendpoints","DuplicatesAllowed":true,"ItemType":"IngestEndpoint","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaPackage::Channel.IngestEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-ingestendpoint.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-ingestendpoint.html#cfn-mediapackage-channel-ingestendpoint-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-ingestendpoint.html#cfn-mediapackage-channel-ingestendpoint-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-ingestendpoint.html#cfn-mediapackage-channel-ingestendpoint-url","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-ingestendpoint.html#cfn-mediapackage-channel-ingestendpoint-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaPackage::Channel.LogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-logconfiguration.html","Properties":{"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-channel-logconfiguration.html#cfn-mediapackage-channel-logconfiguration-loggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.Authorization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-authorization.html","Properties":{"CdnIdentifierSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-authorization.html#cfn-mediapackage-originendpoint-authorization-cdnidentifiersecret","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecretsRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-authorization.html#cfn-mediapackage-originendpoint-authorization-secretsrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.CmafEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafencryption.html","Properties":{"ConstantInitializationVector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafencryption.html#cfn-mediapackage-originendpoint-cmafencryption-constantinitializationvector","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafencryption.html#cfn-mediapackage-originendpoint-cmafencryption-encryptionmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyRotationIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafencryption.html#cfn-mediapackage-originendpoint-cmafencryption-keyrotationintervalseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SpekeKeyProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafencryption.html#cfn-mediapackage-originendpoint-cmafencryption-spekekeyprovider","Required":true,"Type":"SpekeKeyProvider","UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.CmafPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html","Properties":{"Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html#cfn-mediapackage-originendpoint-cmafpackage-encryption","Required":false,"Type":"CmafEncryption","UpdateType":"Mutable"},"HlsManifests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html#cfn-mediapackage-originendpoint-cmafpackage-hlsmanifests","DuplicatesAllowed":true,"ItemType":"HlsManifest","Required":false,"Type":"List","UpdateType":"Mutable"},"SegmentDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html#cfn-mediapackage-originendpoint-cmafpackage-segmentdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SegmentPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html#cfn-mediapackage-originendpoint-cmafpackage-segmentprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StreamSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-cmafpackage.html#cfn-mediapackage-originendpoint-cmafpackage-streamselection","Required":false,"Type":"StreamSelection","UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.DashEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashencryption.html","Properties":{"KeyRotationIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashencryption.html#cfn-mediapackage-originendpoint-dashencryption-keyrotationintervalseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SpekeKeyProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashencryption.html#cfn-mediapackage-originendpoint-dashencryption-spekekeyprovider","Required":true,"Type":"SpekeKeyProvider","UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.DashPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html","Properties":{"AdTriggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-adtriggers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AdsOnDeliveryRestrictions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-adsondeliveryrestrictions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-encryption","Required":false,"Type":"DashEncryption","UpdateType":"Mutable"},"IncludeIframeOnlyStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-includeiframeonlystream","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ManifestLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-manifestlayout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ManifestWindowSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-manifestwindowseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinBufferTimeSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-minbuffertimeseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinUpdatePeriodSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-minupdateperiodseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PeriodTriggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-periodtriggers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Profile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-profile","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SegmentDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-segmentdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SegmentTemplateFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-segmenttemplateformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StreamSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-streamselection","Required":false,"Type":"StreamSelection","UpdateType":"Mutable"},"SuggestedPresentationDelaySeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-suggestedpresentationdelayseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UtcTiming":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-utctiming","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UtcTimingUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-dashpackage.html#cfn-mediapackage-originendpoint-dashpackage-utctiminguri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.EncryptionContractConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-encryptioncontractconfiguration.html","Properties":{}},"AWS::MediaPackage::OriginEndpoint.HlsEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html","Properties":{"ConstantInitializationVector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html#cfn-mediapackage-originendpoint-hlsencryption-constantinitializationvector","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html#cfn-mediapackage-originendpoint-hlsencryption-encryptionmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyRotationIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html#cfn-mediapackage-originendpoint-hlsencryption-keyrotationintervalseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RepeatExtXKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html#cfn-mediapackage-originendpoint-hlsencryption-repeatextxkey","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SpekeKeyProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsencryption.html#cfn-mediapackage-originendpoint-hlsencryption-spekekeyprovider","Required":true,"Type":"SpekeKeyProvider","UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.HlsManifest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html","Properties":{"AdMarkers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-admarkers","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AdTriggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-adtriggers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AdsOnDeliveryRestrictions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-adsondeliveryrestrictions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncludeIframeOnlyStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-includeiframeonlystream","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ManifestName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-manifestname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PlaylistType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-playlisttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PlaylistWindowSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-playlistwindowseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ProgramDateTimeIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-programdatetimeintervalseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlsmanifest.html#cfn-mediapackage-originendpoint-hlsmanifest-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.HlsPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html","Properties":{"AdMarkers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-admarkers","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AdTriggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-adtriggers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AdsOnDeliveryRestrictions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-adsondeliveryrestrictions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-encryption","Required":false,"Type":"HlsEncryption","UpdateType":"Mutable"},"IncludeDvbSubtitles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-includedvbsubtitles","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeIframeOnlyStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-includeiframeonlystream","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PlaylistType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-playlisttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PlaylistWindowSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-playlistwindowseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ProgramDateTimeIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-programdatetimeintervalseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SegmentDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-segmentdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StreamSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-streamselection","Required":false,"Type":"StreamSelection","UpdateType":"Mutable"},"UseAudioRenditionGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-hlspackage.html#cfn-mediapackage-originendpoint-hlspackage-useaudiorenditiongroup","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.MssEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-mssencryption.html","Properties":{"SpekeKeyProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-mssencryption.html#cfn-mediapackage-originendpoint-mssencryption-spekekeyprovider","Required":true,"Type":"SpekeKeyProvider","UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.MssPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-msspackage.html","Properties":{"Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-msspackage.html#cfn-mediapackage-originendpoint-msspackage-encryption","Required":false,"Type":"MssEncryption","UpdateType":"Mutable"},"ManifestWindowSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-msspackage.html#cfn-mediapackage-originendpoint-msspackage-manifestwindowseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SegmentDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-msspackage.html#cfn-mediapackage-originendpoint-msspackage-segmentdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StreamSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-msspackage.html#cfn-mediapackage-originendpoint-msspackage-streamselection","Required":false,"Type":"StreamSelection","UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.SpekeKeyProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html#cfn-mediapackage-originendpoint-spekekeyprovider-certificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionContractConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html#cfn-mediapackage-originendpoint-spekekeyprovider-encryptioncontractconfiguration","Required":false,"Type":"EncryptionContractConfiguration","UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html#cfn-mediapackage-originendpoint-spekekeyprovider-resourceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html#cfn-mediapackage-originendpoint-spekekeyprovider-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SystemIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html#cfn-mediapackage-originendpoint-spekekeyprovider-systemids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-spekekeyprovider.html#cfn-mediapackage-originendpoint-spekekeyprovider-url","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaPackage::OriginEndpoint.StreamSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-streamselection.html","Properties":{"MaxVideoBitsPerSecond":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-streamselection.html#cfn-mediapackage-originendpoint-streamselection-maxvideobitspersecond","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinVideoBitsPerSecond":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-streamselection.html#cfn-mediapackage-originendpoint-streamselection-minvideobitspersecond","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StreamOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-originendpoint-streamselection.html#cfn-mediapackage-originendpoint-streamselection-streamorder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.CmafEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafencryption.html","Properties":{"SpekeKeyProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafencryption.html#cfn-mediapackage-packagingconfiguration-cmafencryption-spekekeyprovider","Required":true,"Type":"SpekeKeyProvider","UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.CmafPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafpackage.html","Properties":{"Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafpackage.html#cfn-mediapackage-packagingconfiguration-cmafpackage-encryption","Required":false,"Type":"CmafEncryption","UpdateType":"Mutable"},"HlsManifests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafpackage.html#cfn-mediapackage-packagingconfiguration-cmafpackage-hlsmanifests","DuplicatesAllowed":true,"ItemType":"HlsManifest","Required":true,"Type":"List","UpdateType":"Mutable"},"IncludeEncoderConfigurationInSegments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafpackage.html#cfn-mediapackage-packagingconfiguration-cmafpackage-includeencoderconfigurationinsegments","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SegmentDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-cmafpackage.html#cfn-mediapackage-packagingconfiguration-cmafpackage-segmentdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.DashEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashencryption.html","Properties":{"SpekeKeyProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashencryption.html#cfn-mediapackage-packagingconfiguration-dashencryption-spekekeyprovider","Required":true,"Type":"SpekeKeyProvider","UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.DashManifest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html","Properties":{"ManifestLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html#cfn-mediapackage-packagingconfiguration-dashmanifest-manifestlayout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ManifestName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html#cfn-mediapackage-packagingconfiguration-dashmanifest-manifestname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MinBufferTimeSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html#cfn-mediapackage-packagingconfiguration-dashmanifest-minbuffertimeseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Profile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html#cfn-mediapackage-packagingconfiguration-dashmanifest-profile","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScteMarkersSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html#cfn-mediapackage-packagingconfiguration-dashmanifest-sctemarkerssource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StreamSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashmanifest.html#cfn-mediapackage-packagingconfiguration-dashmanifest-streamselection","Required":false,"Type":"StreamSelection","UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.DashPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html","Properties":{"DashManifests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-dashmanifests","DuplicatesAllowed":true,"ItemType":"DashManifest","Required":true,"Type":"List","UpdateType":"Mutable"},"Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-encryption","Required":false,"Type":"DashEncryption","UpdateType":"Mutable"},"IncludeEncoderConfigurationInSegments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-includeencoderconfigurationinsegments","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeIframeOnlyStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-includeiframeonlystream","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PeriodTriggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-periodtriggers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SegmentDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-segmentdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SegmentTemplateFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-dashpackage.html#cfn-mediapackage-packagingconfiguration-dashpackage-segmenttemplateformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.EncryptionContractConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-encryptioncontractconfiguration.html","Properties":{}},"AWS::MediaPackage::PackagingConfiguration.HlsEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsencryption.html","Properties":{"ConstantInitializationVector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsencryption.html#cfn-mediapackage-packagingconfiguration-hlsencryption-constantinitializationvector","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsencryption.html#cfn-mediapackage-packagingconfiguration-hlsencryption-encryptionmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SpekeKeyProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsencryption.html#cfn-mediapackage-packagingconfiguration-hlsencryption-spekekeyprovider","Required":true,"Type":"SpekeKeyProvider","UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.HlsManifest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html","Properties":{"AdMarkers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-admarkers","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IncludeIframeOnlyStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-includeiframeonlystream","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ManifestName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-manifestname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProgramDateTimeIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-programdatetimeintervalseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RepeatExtXKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-repeatextxkey","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"StreamSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlsmanifest.html#cfn-mediapackage-packagingconfiguration-hlsmanifest-streamselection","Required":false,"Type":"StreamSelection","UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.HlsPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlspackage.html","Properties":{"Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlspackage.html#cfn-mediapackage-packagingconfiguration-hlspackage-encryption","Required":false,"Type":"HlsEncryption","UpdateType":"Mutable"},"HlsManifests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlspackage.html#cfn-mediapackage-packagingconfiguration-hlspackage-hlsmanifests","DuplicatesAllowed":true,"ItemType":"HlsManifest","Required":true,"Type":"List","UpdateType":"Mutable"},"IncludeDvbSubtitles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlspackage.html#cfn-mediapackage-packagingconfiguration-hlspackage-includedvbsubtitles","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SegmentDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlspackage.html#cfn-mediapackage-packagingconfiguration-hlspackage-segmentdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UseAudioRenditionGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-hlspackage.html#cfn-mediapackage-packagingconfiguration-hlspackage-useaudiorenditiongroup","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.MssEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-mssencryption.html","Properties":{"SpekeKeyProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-mssencryption.html#cfn-mediapackage-packagingconfiguration-mssencryption-spekekeyprovider","Required":true,"Type":"SpekeKeyProvider","UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.MssManifest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-mssmanifest.html","Properties":{"ManifestName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-mssmanifest.html#cfn-mediapackage-packagingconfiguration-mssmanifest-manifestname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StreamSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-mssmanifest.html#cfn-mediapackage-packagingconfiguration-mssmanifest-streamselection","Required":false,"Type":"StreamSelection","UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.MssPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-msspackage.html","Properties":{"Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-msspackage.html#cfn-mediapackage-packagingconfiguration-msspackage-encryption","Required":false,"Type":"MssEncryption","UpdateType":"Mutable"},"MssManifests":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-msspackage.html#cfn-mediapackage-packagingconfiguration-msspackage-mssmanifests","DuplicatesAllowed":true,"ItemType":"MssManifest","Required":true,"Type":"List","UpdateType":"Mutable"},"SegmentDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-msspackage.html#cfn-mediapackage-packagingconfiguration-msspackage-segmentdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.SpekeKeyProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-spekekeyprovider.html","Properties":{"EncryptionContractConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-spekekeyprovider.html#cfn-mediapackage-packagingconfiguration-spekekeyprovider-encryptioncontractconfiguration","Required":false,"Type":"EncryptionContractConfiguration","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-spekekeyprovider.html#cfn-mediapackage-packagingconfiguration-spekekeyprovider-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SystemIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-spekekeyprovider.html#cfn-mediapackage-packagingconfiguration-spekekeyprovider-systemids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-spekekeyprovider.html#cfn-mediapackage-packagingconfiguration-spekekeyprovider-url","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration.StreamSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-streamselection.html","Properties":{"MaxVideoBitsPerSecond":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-streamselection.html#cfn-mediapackage-packagingconfiguration-streamselection-maxvideobitspersecond","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinVideoBitsPerSecond":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-streamselection.html#cfn-mediapackage-packagingconfiguration-streamselection-minvideobitspersecond","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StreamOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packagingconfiguration-streamselection.html#cfn-mediapackage-packagingconfiguration-streamselection-streamorder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingGroup.Authorization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packaginggroup-authorization.html","Properties":{"CdnIdentifierSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packaginggroup-authorization.html#cfn-mediapackage-packaginggroup-authorization-cdnidentifiersecret","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecretsRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packaginggroup-authorization.html#cfn-mediapackage-packaginggroup-authorization-secretsrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingGroup.LogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packaginggroup-logconfiguration.html","Properties":{"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediapackage-packaginggroup-logconfiguration.html#cfn-mediapackage-packaginggroup-logconfiguration-loggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaStore::Container.CorsRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-corsrule.html","Properties":{"AllowedHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-corsrule.html#cfn-mediastore-container-corsrule-allowedheaders","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AllowedMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-corsrule.html#cfn-mediastore-container-corsrule-allowedmethods","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AllowedOrigins":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-corsrule.html#cfn-mediastore-container-corsrule-allowedorigins","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ExposeHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-corsrule.html#cfn-mediastore-container-corsrule-exposeheaders","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MaxAgeSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-corsrule.html#cfn-mediastore-container-corsrule-maxageseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaStore::Container.MetricPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-metricpolicy.html","Properties":{"ContainerLevelMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-metricpolicy.html#cfn-mediastore-container-metricpolicy-containerlevelmetrics","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MetricPolicyRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-metricpolicy.html#cfn-mediastore-container-metricpolicy-metricpolicyrules","ItemType":"MetricPolicyRule","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaStore::Container.MetricPolicyRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-metricpolicyrule.html","Properties":{"ObjectGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-metricpolicyrule.html#cfn-mediastore-container-metricpolicyrule-objectgroup","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObjectGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediastore-container-metricpolicyrule.html#cfn-mediastore-container-metricpolicyrule-objectgroupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaTailor::PlaybackConfiguration.AdMarkerPassthrough":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-admarkerpassthrough.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-admarkerpassthrough.html#cfn-mediatailor-playbackconfiguration-admarkerpassthrough-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaTailor::PlaybackConfiguration.AvailSuppression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-availsuppression.html","Properties":{"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-availsuppression.html#cfn-mediatailor-playbackconfiguration-availsuppression-mode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-availsuppression.html#cfn-mediatailor-playbackconfiguration-availsuppression-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaTailor::PlaybackConfiguration.Bumper":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-bumper.html","Properties":{"EndUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-bumper.html#cfn-mediatailor-playbackconfiguration-bumper-endurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-bumper.html#cfn-mediatailor-playbackconfiguration-bumper-starturl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaTailor::PlaybackConfiguration.CdnConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-cdnconfiguration.html","Properties":{"AdSegmentUrlPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-cdnconfiguration.html#cfn-mediatailor-playbackconfiguration-cdnconfiguration-adsegmenturlprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContentSegmentUrlPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-cdnconfiguration.html#cfn-mediatailor-playbackconfiguration-cdnconfiguration-contentsegmenturlprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaTailor::PlaybackConfiguration.DashConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-dashconfiguration.html","Properties":{"ManifestEndpointPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-dashconfiguration.html#cfn-mediatailor-playbackconfiguration-dashconfiguration-manifestendpointprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MpdLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-dashconfiguration.html#cfn-mediatailor-playbackconfiguration-dashconfiguration-mpdlocation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OriginManifestType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-dashconfiguration.html#cfn-mediatailor-playbackconfiguration-dashconfiguration-originmanifesttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaTailor::PlaybackConfiguration.HlsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-hlsconfiguration.html","Properties":{"ManifestEndpointPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-hlsconfiguration.html#cfn-mediatailor-playbackconfiguration-hlsconfiguration-manifestendpointprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaTailor::PlaybackConfiguration.LivePreRollConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-liveprerollconfiguration.html","Properties":{"AdDecisionServerUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-liveprerollconfiguration.html#cfn-mediatailor-playbackconfiguration-liveprerollconfiguration-addecisionserverurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-liveprerollconfiguration.html#cfn-mediatailor-playbackconfiguration-liveprerollconfiguration-maxdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaTailor::PlaybackConfiguration.ManifestProcessingRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-manifestprocessingrules.html","Properties":{"AdMarkerPassthrough":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-mediatailor-playbackconfiguration-manifestprocessingrules.html#cfn-mediatailor-playbackconfiguration-manifestprocessingrules-admarkerpassthrough","Required":false,"Type":"AdMarkerPassthrough","UpdateType":"Mutable"}}},"AWS::MemoryDB::Cluster.Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-memorydb-cluster-endpoint.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-memorydb-cluster-endpoint.html#cfn-memorydb-cluster-endpoint-address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-memorydb-cluster-endpoint.html#cfn-memorydb-cluster-endpoint-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::MemoryDB::User.AuthenticationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-memorydb-user-authenticationmode.html","Properties":{"Passwords":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-memorydb-user-authenticationmode.html#cfn-memorydb-user-authenticationmode-passwords","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-memorydb-user-authenticationmode.html#cfn-memorydb-user-authenticationmode-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Neptune::DBCluster.DBClusterRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-neptune-dbcluster-dbclusterrole.html","Properties":{"FeatureName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-neptune-dbcluster-dbclusterrole.html#cfn-neptune-dbcluster-dbclusterrole-featurename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-neptune-dbcluster-dbclusterrole.html#cfn-neptune-dbcluster-dbclusterrole-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Neptune::DBCluster.ServerlessScalingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-neptune-dbcluster-serverlessscalingconfiguration.html","Properties":{"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-neptune-dbcluster-serverlessscalingconfiguration.html#cfn-neptune-dbcluster-serverlessscalingconfiguration-maxcapacity","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"MinCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-neptune-dbcluster-serverlessscalingconfiguration.html#cfn-neptune-dbcluster-serverlessscalingconfiguration-mincapacity","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::Firewall.SubnetMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewall-subnetmapping.html","Properties":{"IPAddressType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewall-subnetmapping.html#cfn-networkfirewall-firewall-subnetmapping-ipaddresstype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewall-subnetmapping.html#cfn-networkfirewall-firewall-subnetmapping-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::FirewallPolicy.ActionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-actiondefinition.html","Properties":{"PublishMetricAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-actiondefinition.html#cfn-networkfirewall-firewallpolicy-actiondefinition-publishmetricaction","Required":false,"Type":"PublishMetricAction","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::FirewallPolicy.CustomAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-customaction.html","Properties":{"ActionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-customaction.html#cfn-networkfirewall-firewallpolicy-customaction-actiondefinition","Required":true,"Type":"ActionDefinition","UpdateType":"Mutable"},"ActionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-customaction.html#cfn-networkfirewall-firewallpolicy-customaction-actionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::FirewallPolicy.Dimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-dimension.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-dimension.html#cfn-networkfirewall-firewallpolicy-dimension-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::FirewallPolicy.FirewallPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-firewallpolicy.html","Properties":{"PolicyVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-firewallpolicy-policyvariables","Required":false,"Type":"PolicyVariables","UpdateType":"Mutable"},"StatefulDefaultActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-firewallpolicy-statefuldefaultactions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"StatefulEngineOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-firewallpolicy-statefulengineoptions","Required":false,"Type":"StatefulEngineOptions","UpdateType":"Mutable"},"StatefulRuleGroupReferences":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-firewallpolicy-statefulrulegroupreferences","DuplicatesAllowed":true,"ItemType":"StatefulRuleGroupReference","Required":false,"Type":"List","UpdateType":"Mutable"},"StatelessCustomActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-firewallpolicy-statelesscustomactions","DuplicatesAllowed":true,"ItemType":"CustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"StatelessDefaultActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-firewallpolicy-statelessdefaultactions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"StatelessFragmentDefaultActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-firewallpolicy-statelessfragmentdefaultactions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"StatelessRuleGroupReferences":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-firewallpolicy-statelessrulegroupreferences","DuplicatesAllowed":true,"ItemType":"StatelessRuleGroupReference","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::FirewallPolicy.IPSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-ipset.html","Properties":{"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-ipset.html#cfn-networkfirewall-firewallpolicy-ipset-definition","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::FirewallPolicy.PolicyVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-policyvariables.html","Properties":{"RuleVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-policyvariables.html#cfn-networkfirewall-firewallpolicy-policyvariables-rulevariables","ItemType":"IPSet","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::FirewallPolicy.PublishMetricAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-publishmetricaction.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-publishmetricaction.html#cfn-networkfirewall-firewallpolicy-publishmetricaction-dimensions","DuplicatesAllowed":true,"ItemType":"Dimension","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::FirewallPolicy.StatefulEngineOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statefulengineoptions.html","Properties":{"RuleOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statefulengineoptions.html#cfn-networkfirewall-firewallpolicy-statefulengineoptions-ruleorder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StreamExceptionPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statefulengineoptions.html#cfn-networkfirewall-firewallpolicy-statefulengineoptions-streamexceptionpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::FirewallPolicy.StatefulRuleGroupOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statefulrulegroupoverride.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statefulrulegroupoverride.html#cfn-networkfirewall-firewallpolicy-statefulrulegroupoverride-action","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::FirewallPolicy.StatefulRuleGroupReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statefulrulegroupreference.html","Properties":{"Override":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statefulrulegroupreference.html#cfn-networkfirewall-firewallpolicy-statefulrulegroupreference-override","Required":false,"Type":"StatefulRuleGroupOverride","UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statefulrulegroupreference.html#cfn-networkfirewall-firewallpolicy-statefulrulegroupreference-priority","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statefulrulegroupreference.html#cfn-networkfirewall-firewallpolicy-statefulrulegroupreference-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::FirewallPolicy.StatelessRuleGroupReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statelessrulegroupreference.html","Properties":{"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statelessrulegroupreference.html#cfn-networkfirewall-firewallpolicy-statelessrulegroupreference-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-firewallpolicy-statelessrulegroupreference.html#cfn-networkfirewall-firewallpolicy-statelessrulegroupreference-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::LoggingConfiguration.LogDestinationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-loggingconfiguration-logdestinationconfig.html","Properties":{"LogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-loggingconfiguration-logdestinationconfig.html#cfn-networkfirewall-loggingconfiguration-logdestinationconfig-logdestination","PrimitiveItemType":"String","Required":true,"Type":"Map","UpdateType":"Mutable"},"LogDestinationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-loggingconfiguration-logdestinationconfig.html#cfn-networkfirewall-loggingconfiguration-logdestinationconfig-logdestinationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-loggingconfiguration-logdestinationconfig.html#cfn-networkfirewall-loggingconfiguration-logdestinationconfig-logtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::LoggingConfiguration.LoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-loggingconfiguration-loggingconfiguration.html","Properties":{"LogDestinationConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-loggingconfiguration-loggingconfiguration.html#cfn-networkfirewall-loggingconfiguration-loggingconfiguration-logdestinationconfigs","DuplicatesAllowed":true,"ItemType":"LogDestinationConfig","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.ActionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-actiondefinition.html","Properties":{"PublishMetricAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-actiondefinition.html#cfn-networkfirewall-rulegroup-actiondefinition-publishmetricaction","Required":false,"Type":"PublishMetricAction","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-address.html","Properties":{"AddressDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-address.html#cfn-networkfirewall-rulegroup-address-addressdefinition","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.CustomAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-customaction.html","Properties":{"ActionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-customaction.html#cfn-networkfirewall-rulegroup-customaction-actiondefinition","Required":true,"Type":"ActionDefinition","UpdateType":"Mutable"},"ActionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-customaction.html#cfn-networkfirewall-rulegroup-customaction-actionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.Dimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-dimension.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-dimension.html#cfn-networkfirewall-rulegroup-dimension-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-header.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-header.html#cfn-networkfirewall-rulegroup-header-destination","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DestinationPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-header.html#cfn-networkfirewall-rulegroup-header-destinationport","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-header.html#cfn-networkfirewall-rulegroup-header-direction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-header.html#cfn-networkfirewall-rulegroup-header-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-header.html#cfn-networkfirewall-rulegroup-header-source","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourcePort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-header.html#cfn-networkfirewall-rulegroup-header-sourceport","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.IPSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ipset.html","Properties":{"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ipset.html#cfn-networkfirewall-rulegroup-ipset-definition","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.IPSetReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ipsetreference.html","Properties":{"ReferenceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ipsetreference.html#cfn-networkfirewall-rulegroup-ipsetreference-referencearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.MatchAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-matchattributes.html","Properties":{"DestinationPorts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-matchattributes.html#cfn-networkfirewall-rulegroup-matchattributes-destinationports","DuplicatesAllowed":true,"ItemType":"PortRange","Required":false,"Type":"List","UpdateType":"Mutable"},"Destinations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-matchattributes.html#cfn-networkfirewall-rulegroup-matchattributes-destinations","DuplicatesAllowed":true,"ItemType":"Address","Required":false,"Type":"List","UpdateType":"Mutable"},"Protocols":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-matchattributes.html#cfn-networkfirewall-rulegroup-matchattributes-protocols","DuplicatesAllowed":true,"PrimitiveItemType":"Integer","Required":false,"Type":"List","UpdateType":"Mutable"},"SourcePorts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-matchattributes.html#cfn-networkfirewall-rulegroup-matchattributes-sourceports","DuplicatesAllowed":true,"ItemType":"PortRange","Required":false,"Type":"List","UpdateType":"Mutable"},"Sources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-matchattributes.html#cfn-networkfirewall-rulegroup-matchattributes-sources","DuplicatesAllowed":true,"ItemType":"Address","Required":false,"Type":"List","UpdateType":"Mutable"},"TCPFlags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-matchattributes.html#cfn-networkfirewall-rulegroup-matchattributes-tcpflags","DuplicatesAllowed":true,"ItemType":"TCPFlagField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.PortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-portrange.html","Properties":{"FromPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-portrange.html#cfn-networkfirewall-rulegroup-portrange-fromport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ToPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-portrange.html#cfn-networkfirewall-rulegroup-portrange-toport","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.PortSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-portset.html","Properties":{"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-portset.html#cfn-networkfirewall-rulegroup-portset-definition","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.PublishMetricAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-publishmetricaction.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-publishmetricaction.html#cfn-networkfirewall-rulegroup-publishmetricaction-dimensions","DuplicatesAllowed":true,"ItemType":"Dimension","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.ReferenceSets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-referencesets.html","Properties":{"IPSetReferences":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-referencesets.html#cfn-networkfirewall-rulegroup-referencesets-ipsetreferences","ItemType":"IPSetReference","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.RuleDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ruledefinition.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ruledefinition.html#cfn-networkfirewall-rulegroup-ruledefinition-actions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"MatchAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ruledefinition.html#cfn-networkfirewall-rulegroup-ruledefinition-matchattributes","Required":true,"Type":"MatchAttributes","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.RuleGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulegroup.html","Properties":{"ReferenceSets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulegroup.html#cfn-networkfirewall-rulegroup-rulegroup-referencesets","Required":false,"Type":"ReferenceSets","UpdateType":"Mutable"},"RuleVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulegroup.html#cfn-networkfirewall-rulegroup-rulegroup-rulevariables","Required":false,"Type":"RuleVariables","UpdateType":"Mutable"},"RulesSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulegroup.html#cfn-networkfirewall-rulegroup-rulegroup-rulessource","Required":true,"Type":"RulesSource","UpdateType":"Mutable"},"StatefulRuleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulegroup.html#cfn-networkfirewall-rulegroup-rulegroup-statefulruleoptions","Required":false,"Type":"StatefulRuleOptions","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.RuleOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ruleoption.html","Properties":{"Keyword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ruleoption.html#cfn-networkfirewall-rulegroup-ruleoption-keyword","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-ruleoption.html#cfn-networkfirewall-rulegroup-ruleoption-settings","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.RuleVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulevariables.html","Properties":{"IPSets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulevariables.html#cfn-networkfirewall-rulegroup-rulevariables-ipsets","ItemType":"IPSet","Required":false,"Type":"Map","UpdateType":"Mutable"},"PortSets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulevariables.html#cfn-networkfirewall-rulegroup-rulevariables-portsets","ItemType":"PortSet","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.RulesSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulessource.html","Properties":{"RulesSourceList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulessource.html#cfn-networkfirewall-rulegroup-rulessource-rulessourcelist","Required":false,"Type":"RulesSourceList","UpdateType":"Mutable"},"RulesString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulessource.html#cfn-networkfirewall-rulegroup-rulessource-rulesstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StatefulRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulessource.html#cfn-networkfirewall-rulegroup-rulessource-statefulrules","DuplicatesAllowed":true,"ItemType":"StatefulRule","Required":false,"Type":"List","UpdateType":"Mutable"},"StatelessRulesAndCustomActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulessource.html#cfn-networkfirewall-rulegroup-rulessource-statelessrulesandcustomactions","Required":false,"Type":"StatelessRulesAndCustomActions","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.RulesSourceList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulessourcelist.html","Properties":{"GeneratedRulesType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulessourcelist.html#cfn-networkfirewall-rulegroup-rulessourcelist-generatedrulestype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulessourcelist.html#cfn-networkfirewall-rulegroup-rulessourcelist-targettypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-rulessourcelist.html#cfn-networkfirewall-rulegroup-rulessourcelist-targets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.StatefulRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statefulrule.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statefulrule.html#cfn-networkfirewall-rulegroup-statefulrule-action","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statefulrule.html#cfn-networkfirewall-rulegroup-statefulrule-header","Required":true,"Type":"Header","UpdateType":"Mutable"},"RuleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statefulrule.html#cfn-networkfirewall-rulegroup-statefulrule-ruleoptions","DuplicatesAllowed":true,"ItemType":"RuleOption","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.StatefulRuleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statefulruleoptions.html","Properties":{"RuleOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statefulruleoptions.html#cfn-networkfirewall-rulegroup-statefulruleoptions-ruleorder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.StatelessRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statelessrule.html","Properties":{"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statelessrule.html#cfn-networkfirewall-rulegroup-statelessrule-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"RuleDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statelessrule.html#cfn-networkfirewall-rulegroup-statelessrule-ruledefinition","Required":true,"Type":"RuleDefinition","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.StatelessRulesAndCustomActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statelessrulesandcustomactions.html","Properties":{"CustomActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statelessrulesandcustomactions.html#cfn-networkfirewall-rulegroup-statelessrulesandcustomactions-customactions","DuplicatesAllowed":true,"ItemType":"CustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"StatelessRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-statelessrulesandcustomactions.html#cfn-networkfirewall-rulegroup-statelessrulesandcustomactions-statelessrules","DuplicatesAllowed":true,"ItemType":"StatelessRule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup.TCPFlagField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-tcpflagfield.html","Properties":{"Flags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-tcpflagfield.html#cfn-networkfirewall-rulegroup-tcpflagfield-flags","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Masks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkfirewall-rulegroup-tcpflagfield.html#cfn-networkfirewall-rulegroup-tcpflagfield-masks","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkManager::ConnectAttachment.ConnectAttachmentOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectattachment-connectattachmentoptions.html","Properties":{"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectattachment-connectattachmentoptions.html#cfn-networkmanager-connectattachment-connectattachmentoptions-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::NetworkManager::ConnectAttachment.ProposedSegmentChange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectattachment-proposedsegmentchange.html","Properties":{"AttachmentPolicyRuleNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectattachment-proposedsegmentchange.html#cfn-networkmanager-connectattachment-proposedsegmentchange-attachmentpolicyrulenumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SegmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectattachment-proposedsegmentchange.html#cfn-networkmanager-connectattachment-proposedsegmentchange-segmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectattachment-proposedsegmentchange.html#cfn-networkmanager-connectattachment-proposedsegmentchange-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkManager::ConnectPeer.BgpOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-bgpoptions.html","Properties":{"PeerAsn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-bgpoptions.html#cfn-networkmanager-connectpeer-bgpoptions-peerasn","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::NetworkManager::ConnectPeer.ConnectPeerBgpConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-connectpeerbgpconfiguration.html","Properties":{"CoreNetworkAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-connectpeerbgpconfiguration.html#cfn-networkmanager-connectpeer-connectpeerbgpconfiguration-corenetworkaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CoreNetworkAsn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-connectpeerbgpconfiguration.html#cfn-networkmanager-connectpeer-connectpeerbgpconfiguration-corenetworkasn","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PeerAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-connectpeerbgpconfiguration.html#cfn-networkmanager-connectpeer-connectpeerbgpconfiguration-peeraddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PeerAsn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-connectpeerbgpconfiguration.html#cfn-networkmanager-connectpeer-connectpeerbgpconfiguration-peerasn","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkManager::ConnectPeer.ConnectPeerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-connectpeerconfiguration.html","Properties":{"BgpConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-connectpeerconfiguration.html#cfn-networkmanager-connectpeer-connectpeerconfiguration-bgpconfigurations","DuplicatesAllowed":true,"ItemType":"ConnectPeerBgpConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"CoreNetworkAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-connectpeerconfiguration.html#cfn-networkmanager-connectpeer-connectpeerconfiguration-corenetworkaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InsideCidrBlocks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-connectpeerconfiguration.html#cfn-networkmanager-connectpeer-connectpeerconfiguration-insidecidrblocks","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PeerAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-connectpeerconfiguration.html#cfn-networkmanager-connectpeer-connectpeerconfiguration-peeraddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-connectpeer-connectpeerconfiguration.html#cfn-networkmanager-connectpeer-connectpeerconfiguration-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkManager::CoreNetwork.CoreNetworkEdge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-corenetwork-corenetworkedge.html","Properties":{"Asn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-corenetwork-corenetworkedge.html#cfn-networkmanager-corenetwork-corenetworkedge-asn","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"EdgeLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-corenetwork-corenetworkedge.html#cfn-networkmanager-corenetwork-corenetworkedge-edgelocation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InsideCidrBlocks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-corenetwork-corenetworkedge.html#cfn-networkmanager-corenetwork-corenetworkedge-insidecidrblocks","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkManager::CoreNetwork.CoreNetworkSegment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-corenetwork-corenetworksegment.html","Properties":{"EdgeLocations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-corenetwork-corenetworksegment.html#cfn-networkmanager-corenetwork-corenetworksegment-edgelocations","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-corenetwork-corenetworksegment.html#cfn-networkmanager-corenetwork-corenetworksegment-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SharedSegments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-corenetwork-corenetworksegment.html#cfn-networkmanager-corenetwork-corenetworksegment-sharedsegments","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkManager::Device.AWSLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-device-awslocation.html","Properties":{"SubnetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-device-awslocation.html#cfn-networkmanager-device-awslocation-subnetarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Zone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-device-awslocation.html#cfn-networkmanager-device-awslocation-zone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkManager::Device.Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-device-location.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-device-location.html#cfn-networkmanager-device-location-address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Latitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-device-location.html#cfn-networkmanager-device-location-latitude","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Longitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-device-location.html#cfn-networkmanager-device-location-longitude","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkManager::Link.Bandwidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-link-bandwidth.html","Properties":{"DownloadSpeed":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-link-bandwidth.html#cfn-networkmanager-link-bandwidth-downloadspeed","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UploadSpeed":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-link-bandwidth.html#cfn-networkmanager-link-bandwidth-uploadspeed","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkManager::Site.Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-site-location.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-site-location.html#cfn-networkmanager-site-location-address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Latitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-site-location.html#cfn-networkmanager-site-location-latitude","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Longitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-site-location.html#cfn-networkmanager-site-location-longitude","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkManager::SiteToSiteVpnAttachment.ProposedSegmentChange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-sitetositevpnattachment-proposedsegmentchange.html","Properties":{"AttachmentPolicyRuleNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-sitetositevpnattachment-proposedsegmentchange.html#cfn-networkmanager-sitetositevpnattachment-proposedsegmentchange-attachmentpolicyrulenumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SegmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-sitetositevpnattachment-proposedsegmentchange.html#cfn-networkmanager-sitetositevpnattachment-proposedsegmentchange-segmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-sitetositevpnattachment-proposedsegmentchange.html#cfn-networkmanager-sitetositevpnattachment-proposedsegmentchange-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkManager::TransitGatewayRouteTableAttachment.ProposedSegmentChange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-transitgatewayroutetableattachment-proposedsegmentchange.html","Properties":{"AttachmentPolicyRuleNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-transitgatewayroutetableattachment-proposedsegmentchange.html#cfn-networkmanager-transitgatewayroutetableattachment-proposedsegmentchange-attachmentpolicyrulenumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SegmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-transitgatewayroutetableattachment-proposedsegmentchange.html#cfn-networkmanager-transitgatewayroutetableattachment-proposedsegmentchange-segmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-transitgatewayroutetableattachment-proposedsegmentchange.html#cfn-networkmanager-transitgatewayroutetableattachment-proposedsegmentchange-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkManager::VpcAttachment.ProposedSegmentChange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-vpcattachment-proposedsegmentchange.html","Properties":{"AttachmentPolicyRuleNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-vpcattachment-proposedsegmentchange.html#cfn-networkmanager-vpcattachment-proposedsegmentchange-attachmentpolicyrulenumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SegmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-vpcattachment-proposedsegmentchange.html#cfn-networkmanager-vpcattachment-proposedsegmentchange-segmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-vpcattachment-proposedsegmentchange.html#cfn-networkmanager-vpcattachment-proposedsegmentchange-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkManager::VpcAttachment.VpcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-vpcattachment-vpcoptions.html","Properties":{"ApplianceModeSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-vpcattachment-vpcoptions.html#cfn-networkmanager-vpcattachment-vpcoptions-appliancemodesupport","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Ipv6Support":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-networkmanager-vpcattachment-vpcoptions.html#cfn-networkmanager-vpcattachment-vpcoptions-ipv6support","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::LaunchProfile.StreamConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfiguration.html","Properties":{"AutomaticTerminationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfiguration.html#cfn-nimblestudio-launchprofile-streamconfiguration-automaticterminationmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClipboardMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfiguration.html#cfn-nimblestudio-launchprofile-streamconfiguration-clipboardmode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Ec2InstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfiguration.html#cfn-nimblestudio-launchprofile-streamconfiguration-ec2instancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"MaxSessionLengthInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfiguration.html#cfn-nimblestudio-launchprofile-streamconfiguration-maxsessionlengthinminutes","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaxStoppedSessionLengthInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfiguration.html#cfn-nimblestudio-launchprofile-streamconfiguration-maxstoppedsessionlengthinminutes","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"SessionBackup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfiguration.html#cfn-nimblestudio-launchprofile-streamconfiguration-sessionbackup","Required":false,"Type":"StreamConfigurationSessionBackup","UpdateType":"Mutable"},"SessionPersistenceMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfiguration.html#cfn-nimblestudio-launchprofile-streamconfiguration-sessionpersistencemode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfiguration.html#cfn-nimblestudio-launchprofile-streamconfiguration-sessionstorage","Required":false,"Type":"StreamConfigurationSessionStorage","UpdateType":"Mutable"},"StreamingImageIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfiguration.html#cfn-nimblestudio-launchprofile-streamconfiguration-streamingimageids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"VolumeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfiguration.html#cfn-nimblestudio-launchprofile-streamconfiguration-volumeconfiguration","Required":false,"Type":"VolumeConfiguration","UpdateType":"Mutable"}}},"AWS::NimbleStudio::LaunchProfile.StreamConfigurationSessionBackup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfigurationsessionbackup.html","Properties":{"MaxBackupsToRetain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfigurationsessionbackup.html#cfn-nimblestudio-launchprofile-streamconfigurationsessionbackup-maxbackupstoretain","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfigurationsessionbackup.html#cfn-nimblestudio-launchprofile-streamconfigurationsessionbackup-mode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::LaunchProfile.StreamConfigurationSessionStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfigurationsessionstorage.html","Properties":{"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfigurationsessionstorage.html#cfn-nimblestudio-launchprofile-streamconfigurationsessionstorage-mode","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Root":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamconfigurationsessionstorage.html#cfn-nimblestudio-launchprofile-streamconfigurationsessionstorage-root","Required":false,"Type":"StreamingSessionStorageRoot","UpdateType":"Mutable"}}},"AWS::NimbleStudio::LaunchProfile.StreamingSessionStorageRoot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamingsessionstorageroot.html","Properties":{"Linux":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamingsessionstorageroot.html#cfn-nimblestudio-launchprofile-streamingsessionstorageroot-linux","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Windows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-streamingsessionstorageroot.html#cfn-nimblestudio-launchprofile-streamingsessionstorageroot-windows","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::LaunchProfile.VolumeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-volumeconfiguration.html","Properties":{"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-volumeconfiguration.html#cfn-nimblestudio-launchprofile-volumeconfiguration-iops","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-volumeconfiguration.html#cfn-nimblestudio-launchprofile-volumeconfiguration-size","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Throughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-launchprofile-volumeconfiguration.html#cfn-nimblestudio-launchprofile-volumeconfiguration-throughput","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::StreamingImage.StreamingImageEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-streamingimage-streamingimageencryptionconfiguration.html","Properties":{"KeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-streamingimage-streamingimageencryptionconfiguration.html#cfn-nimblestudio-streamingimage-streamingimageencryptionconfiguration-keyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-streamingimage-streamingimageencryptionconfiguration.html#cfn-nimblestudio-streamingimage-streamingimageencryptionconfiguration-keytype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::Studio.StudioEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studio-studioencryptionconfiguration.html","Properties":{"KeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studio-studioencryptionconfiguration.html#cfn-nimblestudio-studio-studioencryptionconfiguration-keyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studio-studioencryptionconfiguration.html#cfn-nimblestudio-studio-studioencryptionconfiguration-keytype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::StudioComponent.ActiveDirectoryComputerAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-activedirectorycomputerattribute.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-activedirectorycomputerattribute.html#cfn-nimblestudio-studiocomponent-activedirectorycomputerattribute-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-activedirectorycomputerattribute.html#cfn-nimblestudio-studiocomponent-activedirectorycomputerattribute-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::StudioComponent.ActiveDirectoryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-activedirectoryconfiguration.html","Properties":{"ComputerAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-activedirectoryconfiguration.html#cfn-nimblestudio-studiocomponent-activedirectoryconfiguration-computerattributes","ItemType":"ActiveDirectoryComputerAttribute","Required":false,"Type":"List","UpdateType":"Mutable"},"DirectoryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-activedirectoryconfiguration.html#cfn-nimblestudio-studiocomponent-activedirectoryconfiguration-directoryid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OrganizationalUnitDistinguishedName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-activedirectoryconfiguration.html#cfn-nimblestudio-studiocomponent-activedirectoryconfiguration-organizationalunitdistinguishedname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::StudioComponent.ComputeFarmConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-computefarmconfiguration.html","Properties":{"ActiveDirectoryUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-computefarmconfiguration.html#cfn-nimblestudio-studiocomponent-computefarmconfiguration-activedirectoryuser","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-computefarmconfiguration.html#cfn-nimblestudio-studiocomponent-computefarmconfiguration-endpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::StudioComponent.LicenseServiceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-licenseserviceconfiguration.html","Properties":{"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-licenseserviceconfiguration.html#cfn-nimblestudio-studiocomponent-licenseserviceconfiguration-endpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::StudioComponent.ScriptParameterKeyValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-scriptparameterkeyvalue.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-scriptparameterkeyvalue.html#cfn-nimblestudio-studiocomponent-scriptparameterkeyvalue-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-scriptparameterkeyvalue.html#cfn-nimblestudio-studiocomponent-scriptparameterkeyvalue-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::StudioComponent.SharedFileSystemConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-sharedfilesystemconfiguration.html","Properties":{"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-sharedfilesystemconfiguration.html#cfn-nimblestudio-studiocomponent-sharedfilesystemconfiguration-endpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FileSystemId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-sharedfilesystemconfiguration.html#cfn-nimblestudio-studiocomponent-sharedfilesystemconfiguration-filesystemid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LinuxMountPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-sharedfilesystemconfiguration.html#cfn-nimblestudio-studiocomponent-sharedfilesystemconfiguration-linuxmountpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ShareName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-sharedfilesystemconfiguration.html#cfn-nimblestudio-studiocomponent-sharedfilesystemconfiguration-sharename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WindowsMountDrive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-sharedfilesystemconfiguration.html#cfn-nimblestudio-studiocomponent-sharedfilesystemconfiguration-windowsmountdrive","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::StudioComponent.StudioComponentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-studiocomponentconfiguration.html","Properties":{"ActiveDirectoryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-studiocomponentconfiguration.html#cfn-nimblestudio-studiocomponent-studiocomponentconfiguration-activedirectoryconfiguration","Required":false,"Type":"ActiveDirectoryConfiguration","UpdateType":"Mutable"},"ComputeFarmConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-studiocomponentconfiguration.html#cfn-nimblestudio-studiocomponent-studiocomponentconfiguration-computefarmconfiguration","Required":false,"Type":"ComputeFarmConfiguration","UpdateType":"Mutable"},"LicenseServiceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-studiocomponentconfiguration.html#cfn-nimblestudio-studiocomponent-studiocomponentconfiguration-licenseserviceconfiguration","Required":false,"Type":"LicenseServiceConfiguration","UpdateType":"Mutable"},"SharedFileSystemConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-studiocomponentconfiguration.html#cfn-nimblestudio-studiocomponent-studiocomponentconfiguration-sharedfilesystemconfiguration","Required":false,"Type":"SharedFileSystemConfiguration","UpdateType":"Mutable"}}},"AWS::NimbleStudio::StudioComponent.StudioComponentInitializationScript":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-studiocomponentinitializationscript.html","Properties":{"LaunchProfileProtocolVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-studiocomponentinitializationscript.html#cfn-nimblestudio-studiocomponent-studiocomponentinitializationscript-launchprofileprotocolversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Platform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-studiocomponentinitializationscript.html#cfn-nimblestudio-studiocomponent-studiocomponentinitializationscript-platform","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RunContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-studiocomponentinitializationscript.html#cfn-nimblestudio-studiocomponent-studiocomponentinitializationscript-runcontext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Script":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-nimblestudio-studiocomponent-studiocomponentinitializationscript.html#cfn-nimblestudio-studiocomponent-studiocomponentinitializationscript-script","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OSIS::Pipeline.CloudWatchLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-cloudwatchlogdestination.html","Properties":{"LogGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-cloudwatchlogdestination.html#cfn-osis-pipeline-cloudwatchlogdestination-loggroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OSIS::Pipeline.LogPublishingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-logpublishingoptions.html","Properties":{"CloudWatchLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-logpublishingoptions.html#cfn-osis-pipeline-logpublishingoptions-cloudwatchlogdestination","Required":false,"Type":"CloudWatchLogDestination","UpdateType":"Mutable"},"IsLoggingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-logpublishingoptions.html#cfn-osis-pipeline-logpublishingoptions-isloggingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::OSIS::Pipeline.VpcEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-vpcendpoint.html","Properties":{"VpcEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-vpcendpoint.html#cfn-osis-pipeline-vpcendpoint-vpcendpointid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-vpcendpoint.html#cfn-osis-pipeline-vpcendpoint-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-vpcendpoint.html#cfn-osis-pipeline-vpcendpoint-vpcoptions","Required":false,"Type":"VpcOptions","UpdateType":"Mutable"}}},"AWS::OSIS::Pipeline.VpcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-vpcoptions.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-vpcoptions.html#cfn-osis-pipeline-vpcoptions-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-osis-pipeline-vpcoptions.html#cfn-osis-pipeline-vpcoptions-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Omics::AnnotationStore.ReferenceItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-annotationstore-referenceitem.html","Properties":{"ReferenceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-annotationstore-referenceitem.html#cfn-omics-annotationstore-referenceitem-referencearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Omics::AnnotationStore.SseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-annotationstore-sseconfig.html","Properties":{"KeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-annotationstore-sseconfig.html#cfn-omics-annotationstore-sseconfig-keyarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-annotationstore-sseconfig.html#cfn-omics-annotationstore-sseconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Omics::AnnotationStore.StoreOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-annotationstore-storeoptions.html","Properties":{"TsvStoreOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-annotationstore-storeoptions.html#cfn-omics-annotationstore-storeoptions-tsvstoreoptions","Required":true,"Type":"TsvStoreOptions","UpdateType":"Immutable"}}},"AWS::Omics::AnnotationStore.TsvStoreOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-annotationstore-tsvstoreoptions.html","Properties":{"AnnotationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-annotationstore-tsvstoreoptions.html#cfn-omics-annotationstore-tsvstoreoptions-annotationtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FormatToHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-annotationstore-tsvstoreoptions.html#cfn-omics-annotationstore-tsvstoreoptions-formattoheader","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-annotationstore-tsvstoreoptions.html#cfn-omics-annotationstore-tsvstoreoptions-schema","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"}}},"AWS::Omics::ReferenceStore.SseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-referencestore-sseconfig.html","Properties":{"KeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-referencestore-sseconfig.html#cfn-omics-referencestore-sseconfig-keyarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-referencestore-sseconfig.html#cfn-omics-referencestore-sseconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Omics::SequenceStore.SseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-sequencestore-sseconfig.html","Properties":{"KeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-sequencestore-sseconfig.html#cfn-omics-sequencestore-sseconfig-keyarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-sequencestore-sseconfig.html#cfn-omics-sequencestore-sseconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Omics::VariantStore.ReferenceItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-variantstore-referenceitem.html","Properties":{"ReferenceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-variantstore-referenceitem.html#cfn-omics-variantstore-referenceitem-referencearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Omics::VariantStore.SseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-variantstore-sseconfig.html","Properties":{"KeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-variantstore-sseconfig.html#cfn-omics-variantstore-sseconfig-keyarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-variantstore-sseconfig.html#cfn-omics-variantstore-sseconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Omics::Workflow.WorkflowParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-workflow-workflowparameter.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-workflow-workflowparameter.html#cfn-omics-workflow-workflowparameter-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Optional":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-omics-workflow-workflowparameter.html#cfn-omics-workflow-workflowparameter-optional","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::OpenSearchServerless::SecurityConfig.SamlConfigOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchserverless-securityconfig-samlconfigoptions.html","Properties":{"GroupAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchserverless-securityconfig-samlconfigoptions.html#cfn-opensearchserverless-securityconfig-samlconfigoptions-groupattribute","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Metadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchserverless-securityconfig-samlconfigoptions.html#cfn-opensearchserverless-securityconfig-samlconfigoptions-metadata","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SessionTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchserverless-securityconfig-samlconfigoptions.html#cfn-opensearchserverless-securityconfig-samlconfigoptions-sessiontimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UserAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchserverless-securityconfig-samlconfigoptions.html#cfn-opensearchserverless-securityconfig-samlconfigoptions-userattribute","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.AdvancedSecurityOptionsInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html","Properties":{"AnonymousAuthDisableDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html#cfn-opensearchservice-domain-advancedsecurityoptionsinput-anonymousauthdisabledate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AnonymousAuthEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html#cfn-opensearchservice-domain-advancedsecurityoptionsinput-anonymousauthenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html#cfn-opensearchservice-domain-advancedsecurityoptionsinput-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InternalUserDatabaseEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html#cfn-opensearchservice-domain-advancedsecurityoptionsinput-internaluserdatabaseenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MasterUserOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html#cfn-opensearchservice-domain-advancedsecurityoptionsinput-masteruseroptions","Required":false,"Type":"MasterUserOptions","UpdateType":"Mutable"},"SAMLOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-advancedsecurityoptionsinput.html#cfn-opensearchservice-domain-advancedsecurityoptionsinput-samloptions","Required":false,"Type":"SAMLOptions","UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html","Properties":{"DedicatedMasterCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html#cfn-opensearchservice-domain-clusterconfig-dedicatedmastercount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DedicatedMasterEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html#cfn-opensearchservice-domain-clusterconfig-dedicatedmasterenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DedicatedMasterType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html#cfn-opensearchservice-domain-clusterconfig-dedicatedmastertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html#cfn-opensearchservice-domain-clusterconfig-instancecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html#cfn-opensearchservice-domain-clusterconfig-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MultiAZWithStandbyEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html#cfn-opensearchservice-domain-clusterconfig-multiazwithstandbyenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"WarmCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html#cfn-opensearchservice-domain-clusterconfig-warmcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"WarmEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html#cfn-opensearchservice-domain-clusterconfig-warmenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"WarmType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html#cfn-opensearchservice-domain-clusterconfig-warmtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ZoneAwarenessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html#cfn-opensearchservice-domain-clusterconfig-zoneawarenessconfig","Required":false,"Type":"ZoneAwarenessConfig","UpdateType":"Mutable"},"ZoneAwarenessEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-clusterconfig.html#cfn-opensearchservice-domain-clusterconfig-zoneawarenessenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.CognitoOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-cognitooptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-cognitooptions.html#cfn-opensearchservice-domain-cognitooptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IdentityPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-cognitooptions.html#cfn-opensearchservice-domain-cognitooptions-identitypoolid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-cognitooptions.html#cfn-opensearchservice-domain-cognitooptions-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-cognitooptions.html#cfn-opensearchservice-domain-cognitooptions-userpoolid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.DomainEndpointOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-domainendpointoptions.html","Properties":{"CustomEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-domainendpointoptions.html#cfn-opensearchservice-domain-domainendpointoptions-customendpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomEndpointCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-domainendpointoptions.html#cfn-opensearchservice-domain-domainendpointoptions-customendpointcertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomEndpointEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-domainendpointoptions.html#cfn-opensearchservice-domain-domainendpointoptions-customendpointenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnforceHTTPS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-domainendpointoptions.html#cfn-opensearchservice-domain-domainendpointoptions-enforcehttps","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TLSSecurityPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-domainendpointoptions.html#cfn-opensearchservice-domain-domainendpointoptions-tlssecuritypolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.EBSOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-ebsoptions.html","Properties":{"EBSEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-ebsoptions.html#cfn-opensearchservice-domain-ebsoptions-ebsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-ebsoptions.html#cfn-opensearchservice-domain-ebsoptions-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Throughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-ebsoptions.html#cfn-opensearchservice-domain-ebsoptions-throughput","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VolumeSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-ebsoptions.html#cfn-opensearchservice-domain-ebsoptions-volumesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-ebsoptions.html#cfn-opensearchservice-domain-ebsoptions-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.EncryptionAtRestOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-encryptionatrestoptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-encryptionatrestoptions.html#cfn-opensearchservice-domain-encryptionatrestoptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-encryptionatrestoptions.html#cfn-opensearchservice-domain-encryptionatrestoptions-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.Idp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-idp.html","Properties":{"EntityId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-idp.html#cfn-opensearchservice-domain-idp-entityid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MetadataContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-idp.html#cfn-opensearchservice-domain-idp-metadatacontent","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.LogPublishingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-logpublishingoption.html","Properties":{"CloudWatchLogsLogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-logpublishingoption.html#cfn-opensearchservice-domain-logpublishingoption-cloudwatchlogsloggrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-logpublishingoption.html#cfn-opensearchservice-domain-logpublishingoption-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.MasterUserOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-masteruseroptions.html","Properties":{"MasterUserARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-masteruseroptions.html#cfn-opensearchservice-domain-masteruseroptions-masteruserarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterUserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-masteruseroptions.html#cfn-opensearchservice-domain-masteruseroptions-masterusername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-masteruseroptions.html#cfn-opensearchservice-domain-masteruseroptions-masteruserpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.NodeToNodeEncryptionOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-nodetonodeencryptionoptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-nodetonodeencryptionoptions.html#cfn-opensearchservice-domain-nodetonodeencryptionoptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.OffPeakWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-offpeakwindow.html","Properties":{"WindowStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-offpeakwindow.html#cfn-opensearchservice-domain-offpeakwindow-windowstarttime","Required":false,"Type":"WindowStartTime","UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.OffPeakWindowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-offpeakwindowoptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-offpeakwindowoptions.html#cfn-opensearchservice-domain-offpeakwindowoptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"OffPeakWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-offpeakwindowoptions.html#cfn-opensearchservice-domain-offpeakwindowoptions-offpeakwindow","Required":false,"Type":"OffPeakWindow","UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.SAMLOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-samloptions.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-samloptions.html#cfn-opensearchservice-domain-samloptions-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Idp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-samloptions.html#cfn-opensearchservice-domain-samloptions-idp","Required":false,"Type":"Idp","UpdateType":"Mutable"},"MasterBackendRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-samloptions.html#cfn-opensearchservice-domain-samloptions-masterbackendrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterUserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-samloptions.html#cfn-opensearchservice-domain-samloptions-masterusername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RolesKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-samloptions.html#cfn-opensearchservice-domain-samloptions-roleskey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionTimeoutMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-samloptions.html#cfn-opensearchservice-domain-samloptions-sessiontimeoutminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SubjectKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-samloptions.html#cfn-opensearchservice-domain-samloptions-subjectkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.ServiceSoftwareOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-servicesoftwareoptions.html","Properties":{"AutomatedUpdateDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-servicesoftwareoptions.html#cfn-opensearchservice-domain-servicesoftwareoptions-automatedupdatedate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Cancellable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-servicesoftwareoptions.html#cfn-opensearchservice-domain-servicesoftwareoptions-cancellable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CurrentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-servicesoftwareoptions.html#cfn-opensearchservice-domain-servicesoftwareoptions-currentversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-servicesoftwareoptions.html#cfn-opensearchservice-domain-servicesoftwareoptions-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NewVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-servicesoftwareoptions.html#cfn-opensearchservice-domain-servicesoftwareoptions-newversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OptionalDeployment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-servicesoftwareoptions.html#cfn-opensearchservice-domain-servicesoftwareoptions-optionaldeployment","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UpdateAvailable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-servicesoftwareoptions.html#cfn-opensearchservice-domain-servicesoftwareoptions-updateavailable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UpdateStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-servicesoftwareoptions.html#cfn-opensearchservice-domain-servicesoftwareoptions-updatestatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.SnapshotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-snapshotoptions.html","Properties":{"AutomatedSnapshotStartHour":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-snapshotoptions.html#cfn-opensearchservice-domain-snapshotoptions-automatedsnapshotstarthour","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.SoftwareUpdateOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-softwareupdateoptions.html","Properties":{"AutoSoftwareUpdateEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-softwareupdateoptions.html#cfn-opensearchservice-domain-softwareupdateoptions-autosoftwareupdateenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.VPCOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-vpcoptions.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-vpcoptions.html#cfn-opensearchservice-domain-vpcoptions-securitygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-vpcoptions.html#cfn-opensearchservice-domain-vpcoptions-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.WindowStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-windowstarttime.html","Properties":{"Hours":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-windowstarttime.html#cfn-opensearchservice-domain-windowstarttime-hours","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Minutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-windowstarttime.html#cfn-opensearchservice-domain-windowstarttime-minutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::OpenSearchService::Domain.ZoneAwarenessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-zoneawarenessconfig.html","Properties":{"AvailabilityZoneCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opensearchservice-domain-zoneawarenessconfig.html#cfn-opensearchservice-domain-zoneawarenessconfig-availabilityzonecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::App.DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-datasource.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-datasource.html#cfn-opsworks-app-datasource-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-datasource.html#cfn-opsworks-app-datasource-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-datasource.html#cfn-opsworks-app-datasource-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::App.EnvironmentVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-environment.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-environment.html#cfn-opsworks-app-environment-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Secure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-environment.html#cfn-opsworks-app-environment-secure","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-environment.html#value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::OpsWorks::App.Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html","Properties":{"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-pw","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Revision":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-revision","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SshKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-sshkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::App.SslConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-sslconfiguration.html","Properties":{"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-sslconfiguration.html#cfn-opsworks-app-sslconfig-certificate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Chain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-sslconfiguration.html#cfn-opsworks-app-sslconfig-chain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-app-sslconfiguration.html#cfn-opsworks-app-sslconfig-privatekey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Instance.BlockDeviceMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-blockdevicemapping.html","Properties":{"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-blockdevicemapping.html#cfn-opsworks-instance-blockdevicemapping-devicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ebs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-blockdevicemapping.html#cfn-opsworks-instance-blockdevicemapping-ebs","Required":false,"Type":"EbsBlockDevice","UpdateType":"Mutable"},"NoDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-blockdevicemapping.html#cfn-opsworks-instance-blockdevicemapping-nodevice","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VirtualName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-blockdevicemapping.html#cfn-opsworks-instance-blockdevicemapping-virtualname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Instance.EbsBlockDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-ebsblockdevice.html","Properties":{"DeleteOnTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-ebsblockdevice.html#cfn-opsworks-instance-ebsblockdevice-deleteontermination","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-ebsblockdevice.html#cfn-opsworks-instance-ebsblockdevice-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SnapshotId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-ebsblockdevice.html#cfn-opsworks-instance-ebsblockdevice-snapshotid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VolumeSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-ebsblockdevice.html#cfn-opsworks-instance-ebsblockdevice-volumesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-ebsblockdevice.html#cfn-opsworks-instance-ebsblockdevice-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Instance.TimeBasedAutoScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-timebasedautoscaling.html","Properties":{"Friday":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-timebasedautoscaling.html#cfn-opsworks-instance-timebasedautoscaling-friday","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Monday":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-timebasedautoscaling.html#cfn-opsworks-instance-timebasedautoscaling-monday","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Saturday":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-timebasedautoscaling.html#cfn-opsworks-instance-timebasedautoscaling-saturday","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Sunday":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-timebasedautoscaling.html#cfn-opsworks-instance-timebasedautoscaling-sunday","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Thursday":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-timebasedautoscaling.html#cfn-opsworks-instance-timebasedautoscaling-thursday","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Tuesday":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-timebasedautoscaling.html#cfn-opsworks-instance-timebasedautoscaling-tuesday","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Wednesday":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-instance-timebasedautoscaling.html#cfn-opsworks-instance-timebasedautoscaling-wednesday","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::OpsWorks::Layer.AutoScalingThresholds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-loadbasedautoscaling-autoscalingthresholds.html","Properties":{"CpuThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-loadbasedautoscaling-autoscalingthresholds.html#cfn-opsworks-layer-loadbasedautoscaling-autoscalingthresholds-cputhreshold","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"IgnoreMetricsTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-loadbasedautoscaling-autoscalingthresholds.html#cfn-opsworks-layer-loadbasedautoscaling-autoscalingthresholds-ignoremetricstime","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-loadbasedautoscaling-autoscalingthresholds.html#cfn-opsworks-layer-loadbasedautoscaling-autoscalingthresholds-instancecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"LoadThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-loadbasedautoscaling-autoscalingthresholds.html#cfn-opsworks-layer-loadbasedautoscaling-autoscalingthresholds-loadthreshold","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MemoryThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-loadbasedautoscaling-autoscalingthresholds.html#cfn-opsworks-layer-loadbasedautoscaling-autoscalingthresholds-memorythreshold","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ThresholdsWaitTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-loadbasedautoscaling-autoscalingthresholds.html#cfn-opsworks-layer-loadbasedautoscaling-autoscalingthresholds-thresholdwaittime","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Layer.LifecycleEventConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-lifecycleeventconfiguration.html","Properties":{"ShutdownEventConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-lifecycleeventconfiguration.html#cfn-opsworks-layer-lifecycleconfiguration-shutdowneventconfiguration","Required":false,"Type":"ShutdownEventConfiguration","UpdateType":"Mutable"}}},"AWS::OpsWorks::Layer.LoadBasedAutoScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-loadbasedautoscaling.html","Properties":{"DownScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-loadbasedautoscaling.html#cfn-opsworks-layer-loadbasedautoscaling-downscaling","Required":false,"Type":"AutoScalingThresholds","UpdateType":"Mutable"},"Enable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-loadbasedautoscaling.html#cfn-opsworks-layer-loadbasedautoscaling-enable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UpScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-loadbasedautoscaling.html#cfn-opsworks-layer-loadbasedautoscaling-upscaling","Required":false,"Type":"AutoScalingThresholds","UpdateType":"Mutable"}}},"AWS::OpsWorks::Layer.Recipes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-recipes.html","Properties":{"Configure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-recipes.html#cfn-opsworks-layer-customrecipes-configure","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Deploy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-recipes.html#cfn-opsworks-layer-customrecipes-deploy","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Setup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-recipes.html#cfn-opsworks-layer-customrecipes-setup","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Shutdown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-recipes.html#cfn-opsworks-layer-customrecipes-shutdown","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Undeploy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-recipes.html#cfn-opsworks-layer-customrecipes-undeploy","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::OpsWorks::Layer.ShutdownEventConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-lifecycleeventconfiguration-shutdowneventconfiguration.html","Properties":{"DelayUntilElbConnectionsDrained":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-lifecycleeventconfiguration-shutdowneventconfiguration.html#cfn-opsworks-layer-lifecycleconfiguration-shutdowneventconfiguration-delayuntilelbconnectionsdrained","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExecutionTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-lifecycleeventconfiguration-shutdowneventconfiguration.html#cfn-opsworks-layer-lifecycleconfiguration-shutdowneventconfiguration-executiontimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Layer.VolumeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-volumeconfiguration.html","Properties":{"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-volumeconfiguration.html#cfn-opsworks-layer-volumeconfiguration-encrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-volumeconfiguration.html#cfn-opsworks-layer-volconfig-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MountPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-volumeconfiguration.html#cfn-opsworks-layer-volconfig-mountpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumberOfDisks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-volumeconfiguration.html#cfn-opsworks-layer-volconfig-numberofdisks","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RaidLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-volumeconfiguration.html#cfn-opsworks-layer-volconfig-raidlevel","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-volumeconfiguration.html#cfn-opsworks-layer-volconfig-size","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-layer-volumeconfiguration.html#cfn-opsworks-layer-volconfig-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Stack.ChefConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-chefconfiguration.html","Properties":{"BerkshelfVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-chefconfiguration.html#cfn-opsworks-chefconfiguration-berkshelfversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ManageBerkshelf":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-chefconfiguration.html#cfn-opsworks-chefconfiguration-berkshelfversion","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Stack.ElasticIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-elasticip.html","Properties":{"Ip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-elasticip.html#cfn-opsworks-stack-elasticip-ip","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-elasticip.html#cfn-opsworks-stack-elasticip-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Stack.RdsDbInstance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-rdsdbinstance.html","Properties":{"DbPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-rdsdbinstance.html#cfn-opsworks-stack-rdsdbinstance-dbpassword","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DbUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-rdsdbinstance.html#cfn-opsworks-stack-rdsdbinstance-dbuser","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RdsDbInstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-rdsdbinstance.html#cfn-opsworks-stack-rdsdbinstance-rdsdbinstancearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Stack.Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html","Properties":{"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-password","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Revision":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-revision","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SshKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-sshkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-source.html#cfn-opsworks-custcookbooksource-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Stack.StackConfigurationManager":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-stackconfigmanager.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-stackconfigmanager.html#cfn-opsworks-configmanager-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworks-stack-stackconfigmanager.html#cfn-opsworks-configmanager-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorksCM::Server.EngineAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworkscm-server-engineattribute.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworkscm-server-engineattribute.html#cfn-opsworkscm-server-engineattribute-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-opsworkscm-server-engineattribute.html#cfn-opsworkscm-server-engineattribute-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Panorama::ApplicationInstance.ManifestOverridesPayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-panorama-applicationinstance-manifestoverridespayload.html","Properties":{"PayloadData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-panorama-applicationinstance-manifestoverridespayload.html#cfn-panorama-applicationinstance-manifestoverridespayload-payloaddata","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Panorama::ApplicationInstance.ManifestPayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-panorama-applicationinstance-manifestpayload.html","Properties":{"PayloadData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-panorama-applicationinstance-manifestpayload.html#cfn-panorama-applicationinstance-manifestpayload-payloaddata","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Panorama::Package.StorageLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-panorama-package-storagelocation.html","Properties":{"BinaryPrefixLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-panorama-package-storagelocation.html#cfn-panorama-package-storagelocation-binaryprefixlocation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-panorama-package-storagelocation.html#cfn-panorama-package-storagelocation-bucket","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GeneratedPrefixLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-panorama-package-storagelocation.html#cfn-panorama-package-storagelocation-generatedprefixlocation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ManifestPrefixLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-panorama-package-storagelocation.html#cfn-panorama-package-storagelocation-manifestprefixlocation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RepoPrefixLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-panorama-package-storagelocation.html#cfn-panorama-package-storagelocation-repoprefixlocation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Personalize::Dataset.DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-dataset-datasource.html","Properties":{"DataLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-dataset-datasource.html#cfn-personalize-dataset-datasource-datalocation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Personalize::Dataset.DatasetImportJob":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-dataset-datasetimportjob.html","Properties":{"DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-dataset-datasetimportjob.html#cfn-personalize-dataset-datasetimportjob-datasource","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"DatasetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-dataset-datasetimportjob.html#cfn-personalize-dataset-datasetimportjob-datasetarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatasetImportJobArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-dataset-datasetimportjob.html#cfn-personalize-dataset-datasetimportjob-datasetimportjobarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JobName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-dataset-datasetimportjob.html#cfn-personalize-dataset-datasetimportjob-jobname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-dataset-datasetimportjob.html#cfn-personalize-dataset-datasetimportjob-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Personalize::Solution.AlgorithmHyperParameterRanges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-algorithmhyperparameterranges.html","Properties":{"CategoricalHyperParameterRanges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-algorithmhyperparameterranges.html#cfn-personalize-solution-algorithmhyperparameterranges-categoricalhyperparameterranges","DuplicatesAllowed":true,"ItemType":"CategoricalHyperParameterRange","Required":false,"Type":"List","UpdateType":"Immutable"},"ContinuousHyperParameterRanges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-algorithmhyperparameterranges.html#cfn-personalize-solution-algorithmhyperparameterranges-continuoushyperparameterranges","DuplicatesAllowed":true,"ItemType":"ContinuousHyperParameterRange","Required":false,"Type":"List","UpdateType":"Immutable"},"IntegerHyperParameterRanges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-algorithmhyperparameterranges.html#cfn-personalize-solution-algorithmhyperparameterranges-integerhyperparameterranges","DuplicatesAllowed":true,"ItemType":"IntegerHyperParameterRange","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Personalize::Solution.AutoMLConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-automlconfig.html","Properties":{"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-automlconfig.html#cfn-personalize-solution-automlconfig-metricname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RecipeList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-automlconfig.html#cfn-personalize-solution-automlconfig-recipelist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Personalize::Solution.CategoricalHyperParameterRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-categoricalhyperparameterrange.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-categoricalhyperparameterrange.html#cfn-personalize-solution-categoricalhyperparameterrange-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-categoricalhyperparameterrange.html#cfn-personalize-solution-categoricalhyperparameterrange-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Personalize::Solution.ContinuousHyperParameterRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-continuoushyperparameterrange.html","Properties":{"MaxValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-continuoushyperparameterrange.html#cfn-personalize-solution-continuoushyperparameterrange-maxvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"MinValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-continuoushyperparameterrange.html#cfn-personalize-solution-continuoushyperparameterrange-minvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-continuoushyperparameterrange.html#cfn-personalize-solution-continuoushyperparameterrange-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Personalize::Solution.HpoConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-hpoconfig.html","Properties":{"AlgorithmHyperParameterRanges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-hpoconfig.html#cfn-personalize-solution-hpoconfig-algorithmhyperparameterranges","Required":false,"Type":"AlgorithmHyperParameterRanges","UpdateType":"Immutable"},"HpoObjective":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-hpoconfig.html#cfn-personalize-solution-hpoconfig-hpoobjective","Required":false,"Type":"HpoObjective","UpdateType":"Immutable"},"HpoResourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-hpoconfig.html#cfn-personalize-solution-hpoconfig-hporesourceconfig","Required":false,"Type":"HpoResourceConfig","UpdateType":"Immutable"}}},"AWS::Personalize::Solution.HpoObjective":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-hpoobjective.html","Properties":{"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-hpoobjective.html#cfn-personalize-solution-hpoobjective-metricname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MetricRegex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-hpoobjective.html#cfn-personalize-solution-hpoobjective-metricregex","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-hpoobjective.html#cfn-personalize-solution-hpoobjective-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Personalize::Solution.HpoResourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-hporesourceconfig.html","Properties":{"MaxNumberOfTrainingJobs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-hporesourceconfig.html#cfn-personalize-solution-hporesourceconfig-maxnumberoftrainingjobs","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MaxParallelTrainingJobs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-hporesourceconfig.html#cfn-personalize-solution-hporesourceconfig-maxparalleltrainingjobs","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Personalize::Solution.IntegerHyperParameterRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-integerhyperparameterrange.html","Properties":{"MaxValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-integerhyperparameterrange.html#cfn-personalize-solution-integerhyperparameterrange-maxvalue","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MinValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-integerhyperparameterrange.html#cfn-personalize-solution-integerhyperparameterrange-minvalue","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-integerhyperparameterrange.html#cfn-personalize-solution-integerhyperparameterrange-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Personalize::Solution.SolutionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-solutionconfig.html","Properties":{"AlgorithmHyperParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-solutionconfig.html#cfn-personalize-solution-solutionconfig-algorithmhyperparameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"AutoMLConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-solutionconfig.html#cfn-personalize-solution-solutionconfig-automlconfig","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"EventValueThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-solutionconfig.html#cfn-personalize-solution-solutionconfig-eventvaluethreshold","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FeatureTransformationParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-solutionconfig.html#cfn-personalize-solution-solutionconfig-featuretransformationparameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"HpoConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-personalize-solution-solutionconfig.html#cfn-personalize-solution-solutionconfig-hpoconfig","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"}}},"AWS::Pinpoint::ApplicationSettings.CampaignHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-campaignhook.html","Properties":{"LambdaFunctionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-campaignhook.html#cfn-pinpoint-applicationsettings-campaignhook-lambdafunctionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-campaignhook.html#cfn-pinpoint-applicationsettings-campaignhook-mode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WebUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-campaignhook.html#cfn-pinpoint-applicationsettings-campaignhook-weburl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::ApplicationSettings.Limits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-limits.html","Properties":{"Daily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-limits.html#cfn-pinpoint-applicationsettings-limits-daily","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-limits.html#cfn-pinpoint-applicationsettings-limits-maximumduration","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MessagesPerSecond":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-limits.html#cfn-pinpoint-applicationsettings-limits-messagespersecond","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Total":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-limits.html#cfn-pinpoint-applicationsettings-limits-total","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::ApplicationSettings.QuietTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-quiettime.html","Properties":{"End":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-quiettime.html#cfn-pinpoint-applicationsettings-quiettime-end","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Start":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-applicationsettings-quiettime.html#cfn-pinpoint-applicationsettings-quiettime-start","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.AttributeDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-attributedimension.html","Properties":{"AttributeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-attributedimension.html#cfn-pinpoint-campaign-attributedimension-attributetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-attributedimension.html#cfn-pinpoint-campaign-attributedimension-values","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.CampaignCustomMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaigncustommessage.html","Properties":{"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaigncustommessage.html#cfn-pinpoint-campaign-campaigncustommessage-data","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.CampaignEmailMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignemailmessage.html","Properties":{"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignemailmessage.html#cfn-pinpoint-campaign-campaignemailmessage-body","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FromAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignemailmessage.html#cfn-pinpoint-campaign-campaignemailmessage-fromaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HtmlBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignemailmessage.html#cfn-pinpoint-campaign-campaignemailmessage-htmlbody","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignemailmessage.html#cfn-pinpoint-campaign-campaignemailmessage-title","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.CampaignEventFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaigneventfilter.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaigneventfilter.html#cfn-pinpoint-campaign-campaigneventfilter-dimensions","Required":false,"Type":"EventDimensions","UpdateType":"Mutable"},"FilterType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaigneventfilter.html#cfn-pinpoint-campaign-campaigneventfilter-filtertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.CampaignHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignhook.html","Properties":{"LambdaFunctionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignhook.html#cfn-pinpoint-campaign-campaignhook-lambdafunctionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignhook.html#cfn-pinpoint-campaign-campaignhook-mode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WebUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignhook.html#cfn-pinpoint-campaign-campaignhook-weburl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.CampaignInAppMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaigninappmessage.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaigninappmessage.html#cfn-pinpoint-campaign-campaigninappmessage-content","ItemType":"InAppMessageContent","Required":false,"Type":"List","UpdateType":"Mutable"},"CustomConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaigninappmessage.html#cfn-pinpoint-campaign-campaigninappmessage-customconfig","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Layout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaigninappmessage.html#cfn-pinpoint-campaign-campaigninappmessage-layout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.CampaignSmsMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignsmsmessage.html","Properties":{"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignsmsmessage.html#cfn-pinpoint-campaign-campaignsmsmessage-body","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EntityId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignsmsmessage.html#cfn-pinpoint-campaign-campaignsmsmessage-entityid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MessageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignsmsmessage.html#cfn-pinpoint-campaign-campaignsmsmessage-messagetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OriginationNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignsmsmessage.html#cfn-pinpoint-campaign-campaignsmsmessage-originationnumber","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SenderId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignsmsmessage.html#cfn-pinpoint-campaign-campaignsmsmessage-senderid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-campaignsmsmessage.html#cfn-pinpoint-campaign-campaignsmsmessage-templateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.CustomDeliveryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-customdeliveryconfiguration.html","Properties":{"DeliveryUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-customdeliveryconfiguration.html#cfn-pinpoint-campaign-customdeliveryconfiguration-deliveryuri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EndpointTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-customdeliveryconfiguration.html#cfn-pinpoint-campaign-customdeliveryconfiguration-endpointtypes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.DefaultButtonConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-defaultbuttonconfiguration.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-defaultbuttonconfiguration.html#cfn-pinpoint-campaign-defaultbuttonconfiguration-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderRadius":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-defaultbuttonconfiguration.html#cfn-pinpoint-campaign-defaultbuttonconfiguration-borderradius","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ButtonAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-defaultbuttonconfiguration.html#cfn-pinpoint-campaign-defaultbuttonconfiguration-buttonaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Link":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-defaultbuttonconfiguration.html#cfn-pinpoint-campaign-defaultbuttonconfiguration-link","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Text":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-defaultbuttonconfiguration.html#cfn-pinpoint-campaign-defaultbuttonconfiguration-text","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-defaultbuttonconfiguration.html#cfn-pinpoint-campaign-defaultbuttonconfiguration-textcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.EventDimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-eventdimensions.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-eventdimensions.html#cfn-pinpoint-campaign-eventdimensions-attributes","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"EventType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-eventdimensions.html#cfn-pinpoint-campaign-eventdimensions-eventtype","Required":false,"Type":"SetDimension","UpdateType":"Mutable"},"Metrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-eventdimensions.html#cfn-pinpoint-campaign-eventdimensions-metrics","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.InAppMessageBodyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagebodyconfig.html","Properties":{"Alignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagebodyconfig.html#cfn-pinpoint-campaign-inappmessagebodyconfig-alignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagebodyconfig.html#cfn-pinpoint-campaign-inappmessagebodyconfig-body","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagebodyconfig.html#cfn-pinpoint-campaign-inappmessagebodyconfig-textcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.InAppMessageButton":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagebutton.html","Properties":{"Android":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagebutton.html#cfn-pinpoint-campaign-inappmessagebutton-android","Required":false,"Type":"OverrideButtonConfiguration","UpdateType":"Mutable"},"DefaultConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagebutton.html#cfn-pinpoint-campaign-inappmessagebutton-defaultconfig","Required":false,"Type":"DefaultButtonConfiguration","UpdateType":"Mutable"},"IOS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagebutton.html#cfn-pinpoint-campaign-inappmessagebutton-ios","Required":false,"Type":"OverrideButtonConfiguration","UpdateType":"Mutable"},"Web":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagebutton.html#cfn-pinpoint-campaign-inappmessagebutton-web","Required":false,"Type":"OverrideButtonConfiguration","UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.InAppMessageContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagecontent.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagecontent.html#cfn-pinpoint-campaign-inappmessagecontent-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BodyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagecontent.html#cfn-pinpoint-campaign-inappmessagecontent-bodyconfig","Required":false,"Type":"InAppMessageBodyConfig","UpdateType":"Mutable"},"HeaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagecontent.html#cfn-pinpoint-campaign-inappmessagecontent-headerconfig","Required":false,"Type":"InAppMessageHeaderConfig","UpdateType":"Mutable"},"ImageUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagecontent.html#cfn-pinpoint-campaign-inappmessagecontent-imageurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrimaryBtn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagecontent.html#cfn-pinpoint-campaign-inappmessagecontent-primarybtn","Required":false,"Type":"InAppMessageButton","UpdateType":"Mutable"},"SecondaryBtn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessagecontent.html#cfn-pinpoint-campaign-inappmessagecontent-secondarybtn","Required":false,"Type":"InAppMessageButton","UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.InAppMessageHeaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessageheaderconfig.html","Properties":{"Alignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessageheaderconfig.html#cfn-pinpoint-campaign-inappmessageheaderconfig-alignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessageheaderconfig.html#cfn-pinpoint-campaign-inappmessageheaderconfig-header","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-inappmessageheaderconfig.html#cfn-pinpoint-campaign-inappmessageheaderconfig-textcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.Limits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-limits.html","Properties":{"Daily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-limits.html#cfn-pinpoint-campaign-limits-daily","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-limits.html#cfn-pinpoint-campaign-limits-maximumduration","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MessagesPerSecond":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-limits.html#cfn-pinpoint-campaign-limits-messagespersecond","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Session":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-limits.html#cfn-pinpoint-campaign-limits-session","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Total":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-limits.html#cfn-pinpoint-campaign-limits-total","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-action","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-body","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageIconUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-imageiconurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageSmallIconUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-imagesmalliconurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-imageurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JsonBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-jsonbody","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MediaUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-mediaurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RawContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-rawcontent","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SilentPush":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-silentpush","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TimeToLive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-timetolive","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-title","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-message.html#cfn-pinpoint-campaign-message-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.MessageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-messageconfiguration.html","Properties":{"ADMMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-messageconfiguration.html#cfn-pinpoint-campaign-messageconfiguration-admmessage","Required":false,"Type":"Message","UpdateType":"Mutable"},"APNSMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-messageconfiguration.html#cfn-pinpoint-campaign-messageconfiguration-apnsmessage","Required":false,"Type":"Message","UpdateType":"Mutable"},"BaiduMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-messageconfiguration.html#cfn-pinpoint-campaign-messageconfiguration-baidumessage","Required":false,"Type":"Message","UpdateType":"Mutable"},"CustomMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-messageconfiguration.html#cfn-pinpoint-campaign-messageconfiguration-custommessage","Required":false,"Type":"CampaignCustomMessage","UpdateType":"Mutable"},"DefaultMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-messageconfiguration.html#cfn-pinpoint-campaign-messageconfiguration-defaultmessage","Required":false,"Type":"Message","UpdateType":"Mutable"},"EmailMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-messageconfiguration.html#cfn-pinpoint-campaign-messageconfiguration-emailmessage","Required":false,"Type":"CampaignEmailMessage","UpdateType":"Mutable"},"GCMMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-messageconfiguration.html#cfn-pinpoint-campaign-messageconfiguration-gcmmessage","Required":false,"Type":"Message","UpdateType":"Mutable"},"InAppMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-messageconfiguration.html#cfn-pinpoint-campaign-messageconfiguration-inappmessage","Required":false,"Type":"CampaignInAppMessage","UpdateType":"Mutable"},"SMSMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-messageconfiguration.html#cfn-pinpoint-campaign-messageconfiguration-smsmessage","Required":false,"Type":"CampaignSmsMessage","UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.MetricDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-metricdimension.html","Properties":{"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-metricdimension.html#cfn-pinpoint-campaign-metricdimension-comparisonoperator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-metricdimension.html#cfn-pinpoint-campaign-metricdimension-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.OverrideButtonConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-overridebuttonconfiguration.html","Properties":{"ButtonAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-overridebuttonconfiguration.html#cfn-pinpoint-campaign-overridebuttonconfiguration-buttonaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Link":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-overridebuttonconfiguration.html#cfn-pinpoint-campaign-overridebuttonconfiguration-link","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.QuietTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-schedule-quiettime.html","Properties":{"End":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-schedule-quiettime.html#cfn-pinpoint-campaign-schedule-quiettime-end","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Start":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-schedule-quiettime.html#cfn-pinpoint-campaign-schedule-quiettime-start","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-schedule.html","Properties":{"EndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-schedule.html#cfn-pinpoint-campaign-schedule-endtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-schedule.html#cfn-pinpoint-campaign-schedule-eventfilter","Required":false,"Type":"CampaignEventFilter","UpdateType":"Mutable"},"Frequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-schedule.html#cfn-pinpoint-campaign-schedule-frequency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IsLocalTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-schedule.html#cfn-pinpoint-campaign-schedule-islocaltime","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"QuietTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-schedule.html#cfn-pinpoint-campaign-schedule-quiettime","Required":false,"Type":"QuietTime","UpdateType":"Mutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-schedule.html#cfn-pinpoint-campaign-schedule-starttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-schedule.html#cfn-pinpoint-campaign-schedule-timezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.SetDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-setdimension.html","Properties":{"DimensionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-setdimension.html#cfn-pinpoint-campaign-setdimension-dimensiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-setdimension.html#cfn-pinpoint-campaign-setdimension-values","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.Template":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-template.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-template.html#cfn-pinpoint-campaign-template-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-template.html#cfn-pinpoint-campaign-template-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.TemplateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-templateconfiguration.html","Properties":{"EmailTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-templateconfiguration.html#cfn-pinpoint-campaign-templateconfiguration-emailtemplate","Required":false,"Type":"Template","UpdateType":"Mutable"},"PushTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-templateconfiguration.html#cfn-pinpoint-campaign-templateconfiguration-pushtemplate","Required":false,"Type":"Template","UpdateType":"Mutable"},"SMSTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-templateconfiguration.html#cfn-pinpoint-campaign-templateconfiguration-smstemplate","Required":false,"Type":"Template","UpdateType":"Mutable"},"VoiceTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-templateconfiguration.html#cfn-pinpoint-campaign-templateconfiguration-voicetemplate","Required":false,"Type":"Template","UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign.WriteTreatmentResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-writetreatmentresource.html","Properties":{"CustomDeliveryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-writetreatmentresource.html#cfn-pinpoint-campaign-writetreatmentresource-customdeliveryconfiguration","Required":false,"Type":"CustomDeliveryConfiguration","UpdateType":"Mutable"},"MessageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-writetreatmentresource.html#cfn-pinpoint-campaign-writetreatmentresource-messageconfiguration","Required":false,"Type":"MessageConfiguration","UpdateType":"Mutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-writetreatmentresource.html#cfn-pinpoint-campaign-writetreatmentresource-schedule","Required":false,"Type":"Schedule","UpdateType":"Mutable"},"SizePercent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-writetreatmentresource.html#cfn-pinpoint-campaign-writetreatmentresource-sizepercent","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TemplateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-writetreatmentresource.html#cfn-pinpoint-campaign-writetreatmentresource-templateconfiguration","Required":false,"Type":"TemplateConfiguration","UpdateType":"Mutable"},"TreatmentDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-writetreatmentresource.html#cfn-pinpoint-campaign-writetreatmentresource-treatmentdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TreatmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-campaign-writetreatmentresource.html#cfn-pinpoint-campaign-writetreatmentresource-treatmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::InAppTemplate.BodyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-bodyconfig.html","Properties":{"Alignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-bodyconfig.html#cfn-pinpoint-inapptemplate-bodyconfig-alignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-bodyconfig.html#cfn-pinpoint-inapptemplate-bodyconfig-body","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-bodyconfig.html#cfn-pinpoint-inapptemplate-bodyconfig-textcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::InAppTemplate.ButtonConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-buttonconfig.html","Properties":{"Android":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-buttonconfig.html#cfn-pinpoint-inapptemplate-buttonconfig-android","Required":false,"Type":"OverrideButtonConfiguration","UpdateType":"Mutable"},"DefaultConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-buttonconfig.html#cfn-pinpoint-inapptemplate-buttonconfig-defaultconfig","Required":false,"Type":"DefaultButtonConfiguration","UpdateType":"Mutable"},"IOS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-buttonconfig.html#cfn-pinpoint-inapptemplate-buttonconfig-ios","Required":false,"Type":"OverrideButtonConfiguration","UpdateType":"Mutable"},"Web":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-buttonconfig.html#cfn-pinpoint-inapptemplate-buttonconfig-web","Required":false,"Type":"OverrideButtonConfiguration","UpdateType":"Mutable"}}},"AWS::Pinpoint::InAppTemplate.DefaultButtonConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-defaultbuttonconfiguration.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-defaultbuttonconfiguration.html#cfn-pinpoint-inapptemplate-defaultbuttonconfiguration-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderRadius":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-defaultbuttonconfiguration.html#cfn-pinpoint-inapptemplate-defaultbuttonconfiguration-borderradius","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ButtonAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-defaultbuttonconfiguration.html#cfn-pinpoint-inapptemplate-defaultbuttonconfiguration-buttonaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Link":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-defaultbuttonconfiguration.html#cfn-pinpoint-inapptemplate-defaultbuttonconfiguration-link","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Text":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-defaultbuttonconfiguration.html#cfn-pinpoint-inapptemplate-defaultbuttonconfiguration-text","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-defaultbuttonconfiguration.html#cfn-pinpoint-inapptemplate-defaultbuttonconfiguration-textcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::InAppTemplate.HeaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-headerconfig.html","Properties":{"Alignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-headerconfig.html#cfn-pinpoint-inapptemplate-headerconfig-alignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-headerconfig.html#cfn-pinpoint-inapptemplate-headerconfig-header","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-headerconfig.html#cfn-pinpoint-inapptemplate-headerconfig-textcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::InAppTemplate.InAppMessageContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-inappmessagecontent.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-inappmessagecontent.html#cfn-pinpoint-inapptemplate-inappmessagecontent-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BodyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-inappmessagecontent.html#cfn-pinpoint-inapptemplate-inappmessagecontent-bodyconfig","Required":false,"Type":"BodyConfig","UpdateType":"Mutable"},"HeaderConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-inappmessagecontent.html#cfn-pinpoint-inapptemplate-inappmessagecontent-headerconfig","Required":false,"Type":"HeaderConfig","UpdateType":"Mutable"},"ImageUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-inappmessagecontent.html#cfn-pinpoint-inapptemplate-inappmessagecontent-imageurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrimaryBtn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-inappmessagecontent.html#cfn-pinpoint-inapptemplate-inappmessagecontent-primarybtn","Required":false,"Type":"ButtonConfig","UpdateType":"Mutable"},"SecondaryBtn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-inappmessagecontent.html#cfn-pinpoint-inapptemplate-inappmessagecontent-secondarybtn","Required":false,"Type":"ButtonConfig","UpdateType":"Mutable"}}},"AWS::Pinpoint::InAppTemplate.OverrideButtonConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-overridebuttonconfiguration.html","Properties":{"ButtonAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-overridebuttonconfiguration.html#cfn-pinpoint-inapptemplate-overridebuttonconfiguration-buttonaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Link":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-inapptemplate-overridebuttonconfiguration.html#cfn-pinpoint-inapptemplate-overridebuttonconfiguration-link","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::PushTemplate.APNSPushNotificationTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-apnspushnotificationtemplate.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-apnspushnotificationtemplate.html#cfn-pinpoint-pushtemplate-apnspushnotificationtemplate-action","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-apnspushnotificationtemplate.html#cfn-pinpoint-pushtemplate-apnspushnotificationtemplate-body","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MediaUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-apnspushnotificationtemplate.html#cfn-pinpoint-pushtemplate-apnspushnotificationtemplate-mediaurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Sound":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-apnspushnotificationtemplate.html#cfn-pinpoint-pushtemplate-apnspushnotificationtemplate-sound","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-apnspushnotificationtemplate.html#cfn-pinpoint-pushtemplate-apnspushnotificationtemplate-title","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-apnspushnotificationtemplate.html#cfn-pinpoint-pushtemplate-apnspushnotificationtemplate-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::PushTemplate.AndroidPushNotificationTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-androidpushnotificationtemplate.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-androidpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-androidpushnotificationtemplate-action","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-androidpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-androidpushnotificationtemplate-body","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageIconUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-androidpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-androidpushnotificationtemplate-imageiconurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-androidpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-androidpushnotificationtemplate-imageurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SmallImageIconUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-androidpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-androidpushnotificationtemplate-smallimageiconurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Sound":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-androidpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-androidpushnotificationtemplate-sound","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-androidpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-androidpushnotificationtemplate-title","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-androidpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-androidpushnotificationtemplate-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::PushTemplate.DefaultPushNotificationTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-defaultpushnotificationtemplate.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-defaultpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-defaultpushnotificationtemplate-action","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-defaultpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-defaultpushnotificationtemplate-body","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Sound":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-defaultpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-defaultpushnotificationtemplate-sound","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-defaultpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-defaultpushnotificationtemplate-title","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-pushtemplate-defaultpushnotificationtemplate.html#cfn-pinpoint-pushtemplate-defaultpushnotificationtemplate-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.AttributeDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-attributedimension.html","Properties":{"AttributeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-attributedimension.html#cfn-pinpoint-segment-attributedimension-attributetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-attributedimension.html#cfn-pinpoint-segment-attributedimension-values","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.Behavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-behavior.html","Properties":{"Recency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-behavior.html#cfn-pinpoint-segment-segmentdimensions-behavior-recency","Required":false,"Type":"Recency","UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.Coordinates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-location-gpspoint-coordinates.html","Properties":{"Latitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-location-gpspoint-coordinates.html#cfn-pinpoint-segment-segmentdimensions-location-gpspoint-coordinates-latitude","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Longitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-location-gpspoint-coordinates.html#cfn-pinpoint-segment-segmentdimensions-location-gpspoint-coordinates-longitude","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.Demographic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-demographic.html","Properties":{"AppVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-demographic.html#cfn-pinpoint-segment-segmentdimensions-demographic-appversion","Required":false,"Type":"SetDimension","UpdateType":"Mutable"},"Channel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-demographic.html#cfn-pinpoint-segment-segmentdimensions-demographic-channel","Required":false,"Type":"SetDimension","UpdateType":"Mutable"},"DeviceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-demographic.html#cfn-pinpoint-segment-segmentdimensions-demographic-devicetype","Required":false,"Type":"SetDimension","UpdateType":"Mutable"},"Make":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-demographic.html#cfn-pinpoint-segment-segmentdimensions-demographic-make","Required":false,"Type":"SetDimension","UpdateType":"Mutable"},"Model":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-demographic.html#cfn-pinpoint-segment-segmentdimensions-demographic-model","Required":false,"Type":"SetDimension","UpdateType":"Mutable"},"Platform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-demographic.html#cfn-pinpoint-segment-segmentdimensions-demographic-platform","Required":false,"Type":"SetDimension","UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.GPSPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-location-gpspoint.html","Properties":{"Coordinates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-location-gpspoint.html#cfn-pinpoint-segment-segmentdimensions-location-gpspoint-coordinates","Required":true,"Type":"Coordinates","UpdateType":"Mutable"},"RangeInKilometers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-location-gpspoint.html#cfn-pinpoint-segment-segmentdimensions-location-gpspoint-rangeinkilometers","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentgroups-groups.html","Properties":{"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentgroups-groups.html#cfn-pinpoint-segment-segmentgroups-groups-dimensions","ItemType":"SegmentDimensions","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceSegments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentgroups-groups.html#cfn-pinpoint-segment-segmentgroups-groups-sourcesegments","ItemType":"SourceSegments","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentgroups-groups.html#cfn-pinpoint-segment-segmentgroups-groups-sourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentgroups-groups.html#cfn-pinpoint-segment-segmentgroups-groups-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-location.html","Properties":{"Country":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-location.html#cfn-pinpoint-segment-segmentdimensions-location-country","Required":false,"Type":"SetDimension","UpdateType":"Mutable"},"GPSPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-location.html#cfn-pinpoint-segment-segmentdimensions-location-gpspoint","Required":false,"Type":"GPSPoint","UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.Recency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-behavior-recency.html","Properties":{"Duration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-behavior-recency.html#cfn-pinpoint-segment-segmentdimensions-behavior-recency-duration","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RecencyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions-behavior-recency.html#cfn-pinpoint-segment-segmentdimensions-behavior-recency-recencytype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.SegmentDimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions.html#cfn-pinpoint-segment-segmentdimensions-attributes","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Behavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions.html#cfn-pinpoint-segment-segmentdimensions-behavior","Required":false,"Type":"Behavior","UpdateType":"Mutable"},"Demographic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions.html#cfn-pinpoint-segment-segmentdimensions-demographic","Required":false,"Type":"Demographic","UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions.html#cfn-pinpoint-segment-segmentdimensions-location","Required":false,"Type":"Location","UpdateType":"Mutable"},"Metrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions.html#cfn-pinpoint-segment-segmentdimensions-metrics","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"UserAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentdimensions.html#cfn-pinpoint-segment-segmentdimensions-userattributes","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.SegmentGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentgroups.html","Properties":{"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentgroups.html#cfn-pinpoint-segment-segmentgroups-groups","ItemType":"Groups","Required":false,"Type":"List","UpdateType":"Mutable"},"Include":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentgroups.html#cfn-pinpoint-segment-segmentgroups-include","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.SetDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-setdimension.html","Properties":{"DimensionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-setdimension.html#cfn-pinpoint-segment-setdimension-dimensiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-setdimension.html#cfn-pinpoint-segment-setdimension-values","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment.SourceSegments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentgroups-groups-sourcesegments.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentgroups-groups-sourcesegments.html#cfn-pinpoint-segment-segmentgroups-groups-sourcesegments-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpoint-segment-segmentgroups-groups-sourcesegments.html#cfn-pinpoint-segment-segmentgroups-groups-sourcesegments-version","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSet.DeliveryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationset-deliveryoptions.html","Properties":{"SendingPoolName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationset-deliveryoptions.html#cfn-pinpointemail-configurationset-deliveryoptions-sendingpoolname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSet.ReputationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationset-reputationoptions.html","Properties":{"ReputationMetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationset-reputationoptions.html#cfn-pinpointemail-configurationset-reputationoptions-reputationmetricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSet.SendingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationset-sendingoptions.html","Properties":{"SendingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationset-sendingoptions.html#cfn-pinpointemail-configurationset-sendingoptions-sendingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSet.Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationset-tags.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationset-tags.html#cfn-pinpointemail-configurationset-tags-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationset-tags.html#cfn-pinpointemail-configurationset-tags-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSet.TrackingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationset-trackingoptions.html","Properties":{"CustomRedirectDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationset-trackingoptions.html#cfn-pinpointemail-configurationset-trackingoptions-customredirectdomain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSetEventDestination.CloudWatchDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-cloudwatchdestination.html","Properties":{"DimensionConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-cloudwatchdestination.html#cfn-pinpointemail-configurationseteventdestination-cloudwatchdestination-dimensionconfigurations","ItemType":"DimensionConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSetEventDestination.DimensionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-dimensionconfiguration.html","Properties":{"DefaultDimensionValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-dimensionconfiguration.html#cfn-pinpointemail-configurationseteventdestination-dimensionconfiguration-defaultdimensionvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DimensionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-dimensionconfiguration.html#cfn-pinpointemail-configurationseteventdestination-dimensionconfiguration-dimensionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DimensionValueSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-dimensionconfiguration.html#cfn-pinpointemail-configurationseteventdestination-dimensionconfiguration-dimensionvaluesource","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSetEventDestination.EventDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-eventdestination.html","Properties":{"CloudWatchDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-eventdestination.html#cfn-pinpointemail-configurationseteventdestination-eventdestination-cloudwatchdestination","Required":false,"Type":"CloudWatchDestination","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-eventdestination.html#cfn-pinpointemail-configurationseteventdestination-eventdestination-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"KinesisFirehoseDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-eventdestination.html#cfn-pinpointemail-configurationseteventdestination-eventdestination-kinesisfirehosedestination","Required":false,"Type":"KinesisFirehoseDestination","UpdateType":"Mutable"},"MatchingEventTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-eventdestination.html#cfn-pinpointemail-configurationseteventdestination-eventdestination-matchingeventtypes","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"PinpointDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-eventdestination.html#cfn-pinpointemail-configurationseteventdestination-eventdestination-pinpointdestination","Required":false,"Type":"PinpointDestination","UpdateType":"Mutable"},"SnsDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-eventdestination.html#cfn-pinpointemail-configurationseteventdestination-eventdestination-snsdestination","Required":false,"Type":"SnsDestination","UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSetEventDestination.KinesisFirehoseDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-kinesisfirehosedestination.html","Properties":{"DeliveryStreamArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-kinesisfirehosedestination.html#cfn-pinpointemail-configurationseteventdestination-kinesisfirehosedestination-deliverystreamarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IamRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-kinesisfirehosedestination.html#cfn-pinpointemail-configurationseteventdestination-kinesisfirehosedestination-iamrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSetEventDestination.PinpointDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-pinpointdestination.html","Properties":{"ApplicationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-pinpointdestination.html#cfn-pinpointemail-configurationseteventdestination-pinpointdestination-applicationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSetEventDestination.SnsDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-snsdestination.html","Properties":{"TopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-configurationseteventdestination-snsdestination.html#cfn-pinpointemail-configurationseteventdestination-snsdestination-topicarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::DedicatedIpPool.Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-dedicatedippool-tags.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-dedicatedippool-tags.html#cfn-pinpointemail-dedicatedippool-tags-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-dedicatedippool-tags.html#cfn-pinpointemail-dedicatedippool-tags-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::Identity.MailFromAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-identity-mailfromattributes.html","Properties":{"BehaviorOnMxFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-identity-mailfromattributes.html#cfn-pinpointemail-identity-mailfromattributes-behavioronmxfailure","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MailFromDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-identity-mailfromattributes.html#cfn-pinpointemail-identity-mailfromattributes-mailfromdomain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::Identity.Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-identity-tags.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-identity-tags.html#cfn-pinpointemail-identity-tags-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pinpointemail-identity-tags.html#cfn-pinpointemail-identity-tags-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.AwsVpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-awsvpcconfiguration.html","Properties":{"AssignPublicIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-awsvpcconfiguration.html#cfn-pipes-pipe-awsvpcconfiguration-assignpublicip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-awsvpcconfiguration.html#cfn-pipes-pipe-awsvpcconfiguration-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-awsvpcconfiguration.html#cfn-pipes-pipe-awsvpcconfiguration-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.BatchArrayProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batcharrayproperties.html","Properties":{"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batcharrayproperties.html#cfn-pipes-pipe-batcharrayproperties-size","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.BatchContainerOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchcontaineroverrides.html","Properties":{"Command":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchcontaineroverrides.html#cfn-pipes-pipe-batchcontaineroverrides-command","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchcontaineroverrides.html#cfn-pipes-pipe-batchcontaineroverrides-environment","DuplicatesAllowed":true,"ItemType":"BatchEnvironmentVariable","Required":false,"Type":"List","UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchcontaineroverrides.html#cfn-pipes-pipe-batchcontaineroverrides-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchcontaineroverrides.html#cfn-pipes-pipe-batchcontaineroverrides-resourcerequirements","DuplicatesAllowed":true,"ItemType":"BatchResourceRequirement","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.BatchEnvironmentVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchenvironmentvariable.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchenvironmentvariable.html#cfn-pipes-pipe-batchenvironmentvariable-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchenvironmentvariable.html#cfn-pipes-pipe-batchenvironmentvariable-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.BatchJobDependency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchjobdependency.html","Properties":{"JobId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchjobdependency.html#cfn-pipes-pipe-batchjobdependency-jobid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchjobdependency.html#cfn-pipes-pipe-batchjobdependency-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.BatchResourceRequirement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchresourcerequirement.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchresourcerequirement.html#cfn-pipes-pipe-batchresourcerequirement-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchresourcerequirement.html#cfn-pipes-pipe-batchresourcerequirement-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.BatchRetryStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchretrystrategy.html","Properties":{"Attempts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-batchretrystrategy.html#cfn-pipes-pipe-batchretrystrategy-attempts","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.CapacityProviderStrategyItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-capacityproviderstrategyitem.html","Properties":{"Base":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-capacityproviderstrategyitem.html#cfn-pipes-pipe-capacityproviderstrategyitem-base","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CapacityProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-capacityproviderstrategyitem.html#cfn-pipes-pipe-capacityproviderstrategyitem-capacityprovider","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-capacityproviderstrategyitem.html#cfn-pipes-pipe-capacityproviderstrategyitem-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.DeadLetterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-deadletterconfig.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-deadletterconfig.html#cfn-pipes-pipe-deadletterconfig-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.EcsContainerOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecscontaineroverride.html","Properties":{"Command":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecscontaineroverride.html#cfn-pipes-pipe-ecscontaineroverride-command","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Cpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecscontaineroverride.html#cfn-pipes-pipe-ecscontaineroverride-cpu","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecscontaineroverride.html#cfn-pipes-pipe-ecscontaineroverride-environment","DuplicatesAllowed":true,"ItemType":"EcsEnvironmentVariable","Required":false,"Type":"List","UpdateType":"Mutable"},"EnvironmentFiles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecscontaineroverride.html#cfn-pipes-pipe-ecscontaineroverride-environmentfiles","DuplicatesAllowed":true,"ItemType":"EcsEnvironmentFile","Required":false,"Type":"List","UpdateType":"Mutable"},"Memory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecscontaineroverride.html#cfn-pipes-pipe-ecscontaineroverride-memory","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MemoryReservation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecscontaineroverride.html#cfn-pipes-pipe-ecscontaineroverride-memoryreservation","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecscontaineroverride.html#cfn-pipes-pipe-ecscontaineroverride-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceRequirements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecscontaineroverride.html#cfn-pipes-pipe-ecscontaineroverride-resourcerequirements","DuplicatesAllowed":true,"ItemType":"EcsResourceRequirement","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.EcsEnvironmentFile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsenvironmentfile.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsenvironmentfile.html#cfn-pipes-pipe-ecsenvironmentfile-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsenvironmentfile.html#cfn-pipes-pipe-ecsenvironmentfile-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.EcsEnvironmentVariable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsenvironmentvariable.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsenvironmentvariable.html#cfn-pipes-pipe-ecsenvironmentvariable-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsenvironmentvariable.html#cfn-pipes-pipe-ecsenvironmentvariable-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.EcsEphemeralStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsephemeralstorage.html","Properties":{"SizeInGiB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsephemeralstorage.html#cfn-pipes-pipe-ecsephemeralstorage-sizeingib","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.EcsInferenceAcceleratorOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsinferenceacceleratoroverride.html","Properties":{"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsinferenceacceleratoroverride.html#cfn-pipes-pipe-ecsinferenceacceleratoroverride-devicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsinferenceacceleratoroverride.html#cfn-pipes-pipe-ecsinferenceacceleratoroverride-devicetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.EcsResourceRequirement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsresourcerequirement.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsresourcerequirement.html#cfn-pipes-pipe-ecsresourcerequirement-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecsresourcerequirement.html#cfn-pipes-pipe-ecsresourcerequirement-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.EcsTaskOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecstaskoverride.html","Properties":{"ContainerOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecstaskoverride.html#cfn-pipes-pipe-ecstaskoverride-containeroverrides","DuplicatesAllowed":true,"ItemType":"EcsContainerOverride","Required":false,"Type":"List","UpdateType":"Mutable"},"Cpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecstaskoverride.html#cfn-pipes-pipe-ecstaskoverride-cpu","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EphemeralStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecstaskoverride.html#cfn-pipes-pipe-ecstaskoverride-ephemeralstorage","Required":false,"Type":"EcsEphemeralStorage","UpdateType":"Mutable"},"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecstaskoverride.html#cfn-pipes-pipe-ecstaskoverride-executionrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InferenceAcceleratorOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecstaskoverride.html#cfn-pipes-pipe-ecstaskoverride-inferenceacceleratoroverrides","DuplicatesAllowed":true,"ItemType":"EcsInferenceAcceleratorOverride","Required":false,"Type":"List","UpdateType":"Mutable"},"Memory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecstaskoverride.html#cfn-pipes-pipe-ecstaskoverride-memory","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TaskRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-ecstaskoverride.html#cfn-pipes-pipe-ecstaskoverride-taskrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-filter.html","Properties":{"Pattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-filter.html#cfn-pipes-pipe-filter-pattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.FilterCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-filtercriteria.html","Properties":{"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-filtercriteria.html#cfn-pipes-pipe-filtercriteria-filters","DuplicatesAllowed":true,"ItemType":"Filter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.MQBrokerAccessCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-mqbrokeraccesscredentials.html","Properties":{"BasicAuth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-mqbrokeraccesscredentials.html#cfn-pipes-pipe-mqbrokeraccesscredentials-basicauth","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.MSKAccessCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-mskaccesscredentials.html","Properties":{"ClientCertificateTlsAuth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-mskaccesscredentials.html#cfn-pipes-pipe-mskaccesscredentials-clientcertificatetlsauth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SaslScram512Auth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-mskaccesscredentials.html#cfn-pipes-pipe-mskaccesscredentials-saslscram512auth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-networkconfiguration.html","Properties":{"AwsvpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-networkconfiguration.html#cfn-pipes-pipe-networkconfiguration-awsvpcconfiguration","Required":false,"Type":"AwsVpcConfiguration","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeEnrichmentHttpParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipeenrichmenthttpparameters.html","Properties":{"HeaderParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipeenrichmenthttpparameters.html#cfn-pipes-pipe-pipeenrichmenthttpparameters-headerparameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"PathParameterValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipeenrichmenthttpparameters.html#cfn-pipes-pipe-pipeenrichmenthttpparameters-pathparametervalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"QueryStringParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipeenrichmenthttpparameters.html#cfn-pipes-pipe-pipeenrichmenthttpparameters-querystringparameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeEnrichmentParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipeenrichmentparameters.html","Properties":{"HttpParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipeenrichmentparameters.html#cfn-pipes-pipe-pipeenrichmentparameters-httpparameters","Required":false,"Type":"PipeEnrichmentHttpParameters","UpdateType":"Mutable"},"InputTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipeenrichmentparameters.html#cfn-pipes-pipe-pipeenrichmentparameters-inputtemplate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeSourceActiveMQBrokerParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceactivemqbrokerparameters.html","Properties":{"BatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceactivemqbrokerparameters.html#cfn-pipes-pipe-pipesourceactivemqbrokerparameters-batchsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Credentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceactivemqbrokerparameters.html#cfn-pipes-pipe-pipesourceactivemqbrokerparameters-credentials","Required":true,"Type":"MQBrokerAccessCredentials","UpdateType":"Mutable"},"MaximumBatchingWindowInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceactivemqbrokerparameters.html#cfn-pipes-pipe-pipesourceactivemqbrokerparameters-maximumbatchingwindowinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"QueueName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceactivemqbrokerparameters.html#cfn-pipes-pipe-pipesourceactivemqbrokerparameters-queuename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Pipes::Pipe.PipeSourceDynamoDBStreamParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcedynamodbstreamparameters.html","Properties":{"BatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcedynamodbstreamparameters.html#cfn-pipes-pipe-pipesourcedynamodbstreamparameters-batchsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DeadLetterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcedynamodbstreamparameters.html#cfn-pipes-pipe-pipesourcedynamodbstreamparameters-deadletterconfig","Required":false,"Type":"DeadLetterConfig","UpdateType":"Mutable"},"MaximumBatchingWindowInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcedynamodbstreamparameters.html#cfn-pipes-pipe-pipesourcedynamodbstreamparameters-maximumbatchingwindowinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumRecordAgeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcedynamodbstreamparameters.html#cfn-pipes-pipe-pipesourcedynamodbstreamparameters-maximumrecordageinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumRetryAttempts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcedynamodbstreamparameters.html#cfn-pipes-pipe-pipesourcedynamodbstreamparameters-maximumretryattempts","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OnPartialBatchItemFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcedynamodbstreamparameters.html#cfn-pipes-pipe-pipesourcedynamodbstreamparameters-onpartialbatchitemfailure","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParallelizationFactor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcedynamodbstreamparameters.html#cfn-pipes-pipe-pipesourcedynamodbstreamparameters-parallelizationfactor","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StartingPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcedynamodbstreamparameters.html#cfn-pipes-pipe-pipesourcedynamodbstreamparameters-startingposition","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Pipes::Pipe.PipeSourceKinesisStreamParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcekinesisstreamparameters.html","Properties":{"BatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcekinesisstreamparameters.html#cfn-pipes-pipe-pipesourcekinesisstreamparameters-batchsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DeadLetterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcekinesisstreamparameters.html#cfn-pipes-pipe-pipesourcekinesisstreamparameters-deadletterconfig","Required":false,"Type":"DeadLetterConfig","UpdateType":"Mutable"},"MaximumBatchingWindowInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcekinesisstreamparameters.html#cfn-pipes-pipe-pipesourcekinesisstreamparameters-maximumbatchingwindowinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumRecordAgeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcekinesisstreamparameters.html#cfn-pipes-pipe-pipesourcekinesisstreamparameters-maximumrecordageinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumRetryAttempts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcekinesisstreamparameters.html#cfn-pipes-pipe-pipesourcekinesisstreamparameters-maximumretryattempts","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OnPartialBatchItemFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcekinesisstreamparameters.html#cfn-pipes-pipe-pipesourcekinesisstreamparameters-onpartialbatchitemfailure","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParallelizationFactor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcekinesisstreamparameters.html#cfn-pipes-pipe-pipesourcekinesisstreamparameters-parallelizationfactor","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StartingPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcekinesisstreamparameters.html#cfn-pipes-pipe-pipesourcekinesisstreamparameters-startingposition","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StartingPositionTimestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcekinesisstreamparameters.html#cfn-pipes-pipe-pipesourcekinesisstreamparameters-startingpositiontimestamp","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Pipes::Pipe.PipeSourceManagedStreamingKafkaParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcemanagedstreamingkafkaparameters.html","Properties":{"BatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcemanagedstreamingkafkaparameters.html#cfn-pipes-pipe-pipesourcemanagedstreamingkafkaparameters-batchsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ConsumerGroupID":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcemanagedstreamingkafkaparameters.html#cfn-pipes-pipe-pipesourcemanagedstreamingkafkaparameters-consumergroupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Credentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcemanagedstreamingkafkaparameters.html#cfn-pipes-pipe-pipesourcemanagedstreamingkafkaparameters-credentials","Required":false,"Type":"MSKAccessCredentials","UpdateType":"Mutable"},"MaximumBatchingWindowInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcemanagedstreamingkafkaparameters.html#cfn-pipes-pipe-pipesourcemanagedstreamingkafkaparameters-maximumbatchingwindowinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StartingPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcemanagedstreamingkafkaparameters.html#cfn-pipes-pipe-pipesourcemanagedstreamingkafkaparameters-startingposition","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TopicName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcemanagedstreamingkafkaparameters.html#cfn-pipes-pipe-pipesourcemanagedstreamingkafkaparameters-topicname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Pipes::Pipe.PipeSourceParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceparameters.html","Properties":{"ActiveMQBrokerParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceparameters.html#cfn-pipes-pipe-pipesourceparameters-activemqbrokerparameters","Required":false,"Type":"PipeSourceActiveMQBrokerParameters","UpdateType":"Mutable"},"DynamoDBStreamParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceparameters.html#cfn-pipes-pipe-pipesourceparameters-dynamodbstreamparameters","Required":false,"Type":"PipeSourceDynamoDBStreamParameters","UpdateType":"Mutable"},"FilterCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceparameters.html#cfn-pipes-pipe-pipesourceparameters-filtercriteria","Required":false,"Type":"FilterCriteria","UpdateType":"Mutable"},"KinesisStreamParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceparameters.html#cfn-pipes-pipe-pipesourceparameters-kinesisstreamparameters","Required":false,"Type":"PipeSourceKinesisStreamParameters","UpdateType":"Mutable"},"ManagedStreamingKafkaParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceparameters.html#cfn-pipes-pipe-pipesourceparameters-managedstreamingkafkaparameters","Required":false,"Type":"PipeSourceManagedStreamingKafkaParameters","UpdateType":"Mutable"},"RabbitMQBrokerParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceparameters.html#cfn-pipes-pipe-pipesourceparameters-rabbitmqbrokerparameters","Required":false,"Type":"PipeSourceRabbitMQBrokerParameters","UpdateType":"Mutable"},"SelfManagedKafkaParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceparameters.html#cfn-pipes-pipe-pipesourceparameters-selfmanagedkafkaparameters","Required":false,"Type":"PipeSourceSelfManagedKafkaParameters","UpdateType":"Mutable"},"SqsQueueParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceparameters.html#cfn-pipes-pipe-pipesourceparameters-sqsqueueparameters","Required":false,"Type":"PipeSourceSqsQueueParameters","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeSourceRabbitMQBrokerParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcerabbitmqbrokerparameters.html","Properties":{"BatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcerabbitmqbrokerparameters.html#cfn-pipes-pipe-pipesourcerabbitmqbrokerparameters-batchsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Credentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcerabbitmqbrokerparameters.html#cfn-pipes-pipe-pipesourcerabbitmqbrokerparameters-credentials","Required":true,"Type":"MQBrokerAccessCredentials","UpdateType":"Mutable"},"MaximumBatchingWindowInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcerabbitmqbrokerparameters.html#cfn-pipes-pipe-pipesourcerabbitmqbrokerparameters-maximumbatchingwindowinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"QueueName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcerabbitmqbrokerparameters.html#cfn-pipes-pipe-pipesourcerabbitmqbrokerparameters-queuename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VirtualHost":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcerabbitmqbrokerparameters.html#cfn-pipes-pipe-pipesourcerabbitmqbrokerparameters-virtualhost","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Pipes::Pipe.PipeSourceSelfManagedKafkaParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceselfmanagedkafkaparameters.html","Properties":{"AdditionalBootstrapServers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceselfmanagedkafkaparameters.html#cfn-pipes-pipe-pipesourceselfmanagedkafkaparameters-additionalbootstrapservers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"BatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceselfmanagedkafkaparameters.html#cfn-pipes-pipe-pipesourceselfmanagedkafkaparameters-batchsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ConsumerGroupID":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceselfmanagedkafkaparameters.html#cfn-pipes-pipe-pipesourceselfmanagedkafkaparameters-consumergroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Credentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceselfmanagedkafkaparameters.html#cfn-pipes-pipe-pipesourceselfmanagedkafkaparameters-credentials","Required":false,"Type":"SelfManagedKafkaAccessConfigurationCredentials","UpdateType":"Mutable"},"MaximumBatchingWindowInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceselfmanagedkafkaparameters.html#cfn-pipes-pipe-pipesourceselfmanagedkafkaparameters-maximumbatchingwindowinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ServerRootCaCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceselfmanagedkafkaparameters.html#cfn-pipes-pipe-pipesourceselfmanagedkafkaparameters-serverrootcacertificate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartingPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceselfmanagedkafkaparameters.html#cfn-pipes-pipe-pipesourceselfmanagedkafkaparameters-startingposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TopicName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceselfmanagedkafkaparameters.html#cfn-pipes-pipe-pipesourceselfmanagedkafkaparameters-topicname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Vpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourceselfmanagedkafkaparameters.html#cfn-pipes-pipe-pipesourceselfmanagedkafkaparameters-vpc","Required":false,"Type":"SelfManagedKafkaAccessConfigurationVpc","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeSourceSqsQueueParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcesqsqueueparameters.html","Properties":{"BatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcesqsqueueparameters.html#cfn-pipes-pipe-pipesourcesqsqueueparameters-batchsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumBatchingWindowInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipesourcesqsqueueparameters.html#cfn-pipes-pipe-pipesourcesqsqueueparameters-maximumbatchingwindowinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetBatchJobParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetbatchjobparameters.html","Properties":{"ArrayProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetbatchjobparameters.html#cfn-pipes-pipe-pipetargetbatchjobparameters-arrayproperties","Required":false,"Type":"BatchArrayProperties","UpdateType":"Mutable"},"ContainerOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetbatchjobparameters.html#cfn-pipes-pipe-pipetargetbatchjobparameters-containeroverrides","Required":false,"Type":"BatchContainerOverrides","UpdateType":"Mutable"},"DependsOn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetbatchjobparameters.html#cfn-pipes-pipe-pipetargetbatchjobparameters-dependson","DuplicatesAllowed":true,"ItemType":"BatchJobDependency","Required":false,"Type":"List","UpdateType":"Mutable"},"JobDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetbatchjobparameters.html#cfn-pipes-pipe-pipetargetbatchjobparameters-jobdefinition","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"JobName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetbatchjobparameters.html#cfn-pipes-pipe-pipetargetbatchjobparameters-jobname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetbatchjobparameters.html#cfn-pipes-pipe-pipetargetbatchjobparameters-parameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"RetryStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetbatchjobparameters.html#cfn-pipes-pipe-pipetargetbatchjobparameters-retrystrategy","Required":false,"Type":"BatchRetryStrategy","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetCloudWatchLogsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetcloudwatchlogsparameters.html","Properties":{"LogStreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetcloudwatchlogsparameters.html#cfn-pipes-pipe-pipetargetcloudwatchlogsparameters-logstreamname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Timestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetcloudwatchlogsparameters.html#cfn-pipes-pipe-pipetargetcloudwatchlogsparameters-timestamp","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetEcsTaskParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html","Properties":{"CapacityProviderStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-capacityproviderstrategy","DuplicatesAllowed":true,"ItemType":"CapacityProviderStrategyItem","Required":false,"Type":"List","UpdateType":"Mutable"},"EnableECSManagedTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-enableecsmanagedtags","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableExecuteCommand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-enableexecutecommand","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Group":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-group","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-launchtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-networkconfiguration","Required":false,"Type":"NetworkConfiguration","UpdateType":"Mutable"},"Overrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-overrides","Required":false,"Type":"EcsTaskOverride","UpdateType":"Mutable"},"PlacementConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-placementconstraints","DuplicatesAllowed":true,"ItemType":"PlacementConstraint","Required":false,"Type":"List","UpdateType":"Mutable"},"PlacementStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-placementstrategy","DuplicatesAllowed":true,"ItemType":"PlacementStrategy","Required":false,"Type":"List","UpdateType":"Mutable"},"PlatformVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-platformversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropagateTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-propagatetags","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReferenceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-referenceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TaskCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-taskcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TaskDefinitionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetecstaskparameters.html#cfn-pipes-pipe-pipetargetecstaskparameters-taskdefinitionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetEventBridgeEventBusParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargeteventbridgeeventbusparameters.html","Properties":{"DetailType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargeteventbridgeeventbusparameters.html#cfn-pipes-pipe-pipetargeteventbridgeeventbusparameters-detailtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargeteventbridgeeventbusparameters.html#cfn-pipes-pipe-pipetargeteventbridgeeventbusparameters-endpointid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargeteventbridgeeventbusparameters.html#cfn-pipes-pipe-pipetargeteventbridgeeventbusparameters-resources","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargeteventbridgeeventbusparameters.html#cfn-pipes-pipe-pipetargeteventbridgeeventbusparameters-source","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargeteventbridgeeventbusparameters.html#cfn-pipes-pipe-pipetargeteventbridgeeventbusparameters-time","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetHttpParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargethttpparameters.html","Properties":{"HeaderParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargethttpparameters.html#cfn-pipes-pipe-pipetargethttpparameters-headerparameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"PathParameterValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargethttpparameters.html#cfn-pipes-pipe-pipetargethttpparameters-pathparametervalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"QueryStringParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargethttpparameters.html#cfn-pipes-pipe-pipetargethttpparameters-querystringparameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetKinesisStreamParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetkinesisstreamparameters.html","Properties":{"PartitionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetkinesisstreamparameters.html#cfn-pipes-pipe-pipetargetkinesisstreamparameters-partitionkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetLambdaFunctionParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetlambdafunctionparameters.html","Properties":{"InvocationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetlambdafunctionparameters.html#cfn-pipes-pipe-pipetargetlambdafunctionparameters-invocationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html","Properties":{"BatchJobParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-batchjobparameters","Required":false,"Type":"PipeTargetBatchJobParameters","UpdateType":"Mutable"},"CloudWatchLogsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-cloudwatchlogsparameters","Required":false,"Type":"PipeTargetCloudWatchLogsParameters","UpdateType":"Mutable"},"EcsTaskParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-ecstaskparameters","Required":false,"Type":"PipeTargetEcsTaskParameters","UpdateType":"Mutable"},"EventBridgeEventBusParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-eventbridgeeventbusparameters","Required":false,"Type":"PipeTargetEventBridgeEventBusParameters","UpdateType":"Mutable"},"HttpParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-httpparameters","Required":false,"Type":"PipeTargetHttpParameters","UpdateType":"Mutable"},"InputTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-inputtemplate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KinesisStreamParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-kinesisstreamparameters","Required":false,"Type":"PipeTargetKinesisStreamParameters","UpdateType":"Mutable"},"LambdaFunctionParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-lambdafunctionparameters","Required":false,"Type":"PipeTargetLambdaFunctionParameters","UpdateType":"Mutable"},"RedshiftDataParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-redshiftdataparameters","Required":false,"Type":"PipeTargetRedshiftDataParameters","UpdateType":"Mutable"},"SageMakerPipelineParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-sagemakerpipelineparameters","Required":false,"Type":"PipeTargetSageMakerPipelineParameters","UpdateType":"Mutable"},"SqsQueueParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-sqsqueueparameters","Required":false,"Type":"PipeTargetSqsQueueParameters","UpdateType":"Mutable"},"StepFunctionStateMachineParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetparameters.html#cfn-pipes-pipe-pipetargetparameters-stepfunctionstatemachineparameters","Required":false,"Type":"PipeTargetStateMachineParameters","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetRedshiftDataParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetredshiftdataparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetredshiftdataparameters.html#cfn-pipes-pipe-pipetargetredshiftdataparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DbUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetredshiftdataparameters.html#cfn-pipes-pipe-pipetargetredshiftdataparameters-dbuser","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretManagerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetredshiftdataparameters.html#cfn-pipes-pipe-pipetargetredshiftdataparameters-secretmanagerarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Sqls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetredshiftdataparameters.html#cfn-pipes-pipe-pipetargetredshiftdataparameters-sqls","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"StatementName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetredshiftdataparameters.html#cfn-pipes-pipe-pipetargetredshiftdataparameters-statementname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WithEvent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetredshiftdataparameters.html#cfn-pipes-pipe-pipetargetredshiftdataparameters-withevent","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetSageMakerPipelineParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetsagemakerpipelineparameters.html","Properties":{"PipelineParameterList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetsagemakerpipelineparameters.html#cfn-pipes-pipe-pipetargetsagemakerpipelineparameters-pipelineparameterlist","DuplicatesAllowed":true,"ItemType":"SageMakerPipelineParameter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetSqsQueueParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetsqsqueueparameters.html","Properties":{"MessageDeduplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetsqsqueueparameters.html#cfn-pipes-pipe-pipetargetsqsqueueparameters-messagededuplicationid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MessageGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetsqsqueueparameters.html#cfn-pipes-pipe-pipetargetsqsqueueparameters-messagegroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PipeTargetStateMachineParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetstatemachineparameters.html","Properties":{"InvocationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-pipetargetstatemachineparameters.html#cfn-pipes-pipe-pipetargetstatemachineparameters-invocationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PlacementConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-placementconstraint.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-placementconstraint.html#cfn-pipes-pipe-placementconstraint-expression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-placementconstraint.html#cfn-pipes-pipe-placementconstraint-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.PlacementStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-placementstrategy.html","Properties":{"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-placementstrategy.html#cfn-pipes-pipe-placementstrategy-field","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-placementstrategy.html#cfn-pipes-pipe-placementstrategy-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.SageMakerPipelineParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-sagemakerpipelineparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-sagemakerpipelineparameter.html#cfn-pipes-pipe-sagemakerpipelineparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-sagemakerpipelineparameter.html#cfn-pipes-pipe-sagemakerpipelineparameter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.SelfManagedKafkaAccessConfigurationCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-selfmanagedkafkaaccessconfigurationcredentials.html","Properties":{"BasicAuth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-selfmanagedkafkaaccessconfigurationcredentials.html#cfn-pipes-pipe-selfmanagedkafkaaccessconfigurationcredentials-basicauth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientCertificateTlsAuth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-selfmanagedkafkaaccessconfigurationcredentials.html#cfn-pipes-pipe-selfmanagedkafkaaccessconfigurationcredentials-clientcertificatetlsauth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SaslScram256Auth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-selfmanagedkafkaaccessconfigurationcredentials.html#cfn-pipes-pipe-selfmanagedkafkaaccessconfigurationcredentials-saslscram256auth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SaslScram512Auth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-selfmanagedkafkaaccessconfigurationcredentials.html#cfn-pipes-pipe-selfmanagedkafkaaccessconfigurationcredentials-saslscram512auth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pipes::Pipe.SelfManagedKafkaAccessConfigurationVpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-selfmanagedkafkaaccessconfigurationvpc.html","Properties":{"SecurityGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-selfmanagedkafkaaccessconfigurationvpc.html#cfn-pipes-pipe-selfmanagedkafkaaccessconfigurationvpc-securitygroup","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-pipes-pipe-selfmanagedkafkaaccessconfigurationvpc.html#cfn-pipes-pipe-selfmanagedkafkaaccessconfigurationvpc-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QLDB::Stream.KinesisConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-qldb-stream-kinesisconfiguration.html","Properties":{"AggregationEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-qldb-stream-kinesisconfiguration.html#cfn-qldb-stream-kinesisconfiguration-aggregationenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"StreamArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-qldb-stream-kinesisconfiguration.html#cfn-qldb-stream-kinesisconfiguration-streamarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::QuickSight::Analysis.AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-aggregationfunction.html","Properties":{"CategoricalAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-aggregationfunction.html#cfn-quicksight-analysis-aggregationfunction-categoricalaggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DateAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-aggregationfunction.html#cfn-quicksight-analysis-aggregationfunction-dateaggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumericalAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-aggregationfunction.html#cfn-quicksight-analysis-aggregationfunction-numericalaggregationfunction","Required":false,"Type":"NumericalAggregationFunction","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AggregationSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-aggregationsortconfiguration.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-aggregationsortconfiguration.html#cfn-quicksight-analysis-aggregationsortconfiguration-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-aggregationsortconfiguration.html#cfn-quicksight-analysis-aggregationsortconfiguration-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"SortDirection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-aggregationsortconfiguration.html#cfn-quicksight-analysis-aggregationsortconfiguration-sortdirection","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysisdefaults.html","Properties":{"DefaultNewSheetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysisdefaults.html#cfn-quicksight-analysis-analysisdefaults-defaultnewsheetconfiguration","Required":true,"Type":"DefaultNewSheetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AnalysisDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysisdefinition.html","Properties":{"AnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysisdefinition.html#cfn-quicksight-analysis-analysisdefinition-analysisdefaults","Required":false,"Type":"AnalysisDefaults","UpdateType":"Mutable"},"CalculatedFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysisdefinition.html#cfn-quicksight-analysis-analysisdefinition-calculatedfields","DuplicatesAllowed":true,"ItemType":"CalculatedField","Required":false,"Type":"List","UpdateType":"Mutable"},"ColumnConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysisdefinition.html#cfn-quicksight-analysis-analysisdefinition-columnconfigurations","DuplicatesAllowed":true,"ItemType":"ColumnConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"DataSetIdentifierDeclarations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysisdefinition.html#cfn-quicksight-analysis-analysisdefinition-datasetidentifierdeclarations","DuplicatesAllowed":true,"ItemType":"DataSetIdentifierDeclaration","Required":true,"Type":"List","UpdateType":"Mutable"},"FilterGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysisdefinition.html#cfn-quicksight-analysis-analysisdefinition-filtergroups","DuplicatesAllowed":true,"ItemType":"FilterGroup","Required":false,"Type":"List","UpdateType":"Mutable"},"ParameterDeclarations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysisdefinition.html#cfn-quicksight-analysis-analysisdefinition-parameterdeclarations","DuplicatesAllowed":true,"ItemType":"ParameterDeclaration","Required":false,"Type":"List","UpdateType":"Mutable"},"Sheets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysisdefinition.html#cfn-quicksight-analysis-analysisdefinition-sheets","DuplicatesAllowed":true,"ItemType":"SheetDefinition","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AnalysisError":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysiserror.html","Properties":{"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysiserror.html#cfn-quicksight-analysis-analysiserror-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysiserror.html#cfn-quicksight-analysis-analysiserror-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ViolatedEntities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysiserror.html#cfn-quicksight-analysis-analysiserror-violatedentities","DuplicatesAllowed":true,"ItemType":"Entity","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AnalysisSourceEntity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysissourceentity.html","Properties":{"SourceTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysissourceentity.html#cfn-quicksight-analysis-analysissourceentity-sourcetemplate","Required":false,"Type":"AnalysisSourceTemplate","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AnalysisSourceTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysissourcetemplate.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysissourcetemplate.html#cfn-quicksight-analysis-analysissourcetemplate-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetReferences":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-analysissourcetemplate.html#cfn-quicksight-analysis-analysissourcetemplate-datasetreferences","DuplicatesAllowed":true,"ItemType":"DataSetReference","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AnchorDateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-anchordateconfiguration.html","Properties":{"AnchorOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-anchordateconfiguration.html#cfn-quicksight-analysis-anchordateconfiguration-anchoroption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-anchordateconfiguration.html#cfn-quicksight-analysis-anchordateconfiguration-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ArcAxisConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-arcaxisconfiguration.html","Properties":{"Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-arcaxisconfiguration.html#cfn-quicksight-analysis-arcaxisconfiguration-range","Required":false,"Type":"ArcAxisDisplayRange","UpdateType":"Mutable"},"ReserveRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-arcaxisconfiguration.html#cfn-quicksight-analysis-arcaxisconfiguration-reserverange","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ArcAxisDisplayRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-arcaxisdisplayrange.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-arcaxisdisplayrange.html#cfn-quicksight-analysis-arcaxisdisplayrange-max","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-arcaxisdisplayrange.html#cfn-quicksight-analysis-arcaxisdisplayrange-min","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ArcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-arcconfiguration.html","Properties":{"ArcAngle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-arcconfiguration.html#cfn-quicksight-analysis-arcconfiguration-arcangle","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ArcThickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-arcconfiguration.html#cfn-quicksight-analysis-arcconfiguration-arcthickness","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ArcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-arcoptions.html","Properties":{"ArcThickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-arcoptions.html#cfn-quicksight-analysis-arcoptions-arcthickness","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AxisDataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdataoptions.html","Properties":{"DateAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdataoptions.html#cfn-quicksight-analysis-axisdataoptions-dateaxisoptions","Required":false,"Type":"DateAxisOptions","UpdateType":"Mutable"},"NumericAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdataoptions.html#cfn-quicksight-analysis-axisdataoptions-numericaxisoptions","Required":false,"Type":"NumericAxisOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AxisDisplayMinMaxRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayminmaxrange.html","Properties":{"Maximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayminmaxrange.html#cfn-quicksight-analysis-axisdisplayminmaxrange-maximum","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Minimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayminmaxrange.html#cfn-quicksight-analysis-axisdisplayminmaxrange-minimum","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayoptions.html","Properties":{"AxisLineVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayoptions.html#cfn-quicksight-analysis-axisdisplayoptions-axislinevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AxisOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayoptions.html#cfn-quicksight-analysis-axisdisplayoptions-axisoffset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayoptions.html#cfn-quicksight-analysis-axisdisplayoptions-dataoptions","Required":false,"Type":"AxisDataOptions","UpdateType":"Mutable"},"GridLineVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayoptions.html#cfn-quicksight-analysis-axisdisplayoptions-gridlinevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScrollbarOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayoptions.html#cfn-quicksight-analysis-axisdisplayoptions-scrollbaroptions","Required":false,"Type":"ScrollBarOptions","UpdateType":"Mutable"},"TickLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayoptions.html#cfn-quicksight-analysis-axisdisplayoptions-ticklabeloptions","Required":false,"Type":"AxisTickLabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AxisDisplayRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayrange.html","Properties":{"DataDriven":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayrange.html#cfn-quicksight-analysis-axisdisplayrange-datadriven","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"MinMax":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisdisplayrange.html#cfn-quicksight-analysis-axisdisplayrange-minmax","Required":false,"Type":"AxisDisplayMinMaxRange","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislabeloptions.html","Properties":{"ApplyTo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislabeloptions.html#cfn-quicksight-analysis-axislabeloptions-applyto","Required":false,"Type":"AxisLabelReferenceOptions","UpdateType":"Mutable"},"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislabeloptions.html#cfn-quicksight-analysis-axislabeloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislabeloptions.html#cfn-quicksight-analysis-axislabeloptions-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AxisLabelReferenceOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislabelreferenceoptions.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislabelreferenceoptions.html#cfn-quicksight-analysis-axislabelreferenceoptions-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislabelreferenceoptions.html#cfn-quicksight-analysis-axislabelreferenceoptions-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AxisLinearScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislinearscale.html","Properties":{"StepCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislinearscale.html#cfn-quicksight-analysis-axislinearscale-stepcount","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"StepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislinearscale.html#cfn-quicksight-analysis-axislinearscale-stepsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AxisLogarithmicScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislogarithmicscale.html","Properties":{"Base":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axislogarithmicscale.html#cfn-quicksight-analysis-axislogarithmicscale-base","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AxisScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisscale.html","Properties":{"Linear":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisscale.html#cfn-quicksight-analysis-axisscale-linear","Required":false,"Type":"AxisLinearScale","UpdateType":"Mutable"},"Logarithmic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisscale.html#cfn-quicksight-analysis-axisscale-logarithmic","Required":false,"Type":"AxisLogarithmicScale","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.AxisTickLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisticklabeloptions.html","Properties":{"LabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisticklabeloptions.html#cfn-quicksight-analysis-axisticklabeloptions-labeloptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"},"RotationAngle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-axisticklabeloptions.html#cfn-quicksight-analysis-axisticklabeloptions-rotationangle","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartaggregatedfieldwells.html#cfn-quicksight-analysis-barchartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartaggregatedfieldwells.html#cfn-quicksight-analysis-barchartaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartaggregatedfieldwells.html#cfn-quicksight-analysis-barchartaggregatedfieldwells-smallmultiples","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartaggregatedfieldwells.html#cfn-quicksight-analysis-barchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BarChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html","Properties":{"BarsArrangement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-barsarrangement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ContributionAnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-contributionanalysisdefaults","DuplicatesAllowed":true,"ItemType":"ContributionAnalysisDefault","Required":false,"Type":"List","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-fieldwells","Required":false,"Type":"BarChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"Orientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-orientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-smallmultiplesoptions","Required":false,"Type":"SmallMultiplesOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-sortconfiguration","Required":false,"Type":"BarChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"ValueAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-valueaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"ValueLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-valuelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartconfiguration.html#cfn-quicksight-analysis-barchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BarChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartfieldwells.html","Properties":{"BarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartfieldwells.html#cfn-quicksight-analysis-barchartfieldwells-barchartaggregatedfieldwells","Required":false,"Type":"BarChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BarChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartsortconfiguration.html#cfn-quicksight-analysis-barchartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartsortconfiguration.html#cfn-quicksight-analysis-barchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartsortconfiguration.html#cfn-quicksight-analysis-barchartsortconfiguration-coloritemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"ColorSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartsortconfiguration.html#cfn-quicksight-analysis-barchartsortconfiguration-colorsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartsortconfiguration.html#cfn-quicksight-analysis-barchartsortconfiguration-smallmultipleslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartsortconfiguration.html#cfn-quicksight-analysis-barchartsortconfiguration-smallmultiplessort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartvisual.html#cfn-quicksight-analysis-barchartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartvisual.html#cfn-quicksight-analysis-barchartvisual-chartconfiguration","Required":false,"Type":"BarChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartvisual.html#cfn-quicksight-analysis-barchartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartvisual.html#cfn-quicksight-analysis-barchartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartvisual.html#cfn-quicksight-analysis-barchartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-barchartvisual.html#cfn-quicksight-analysis-barchartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BinCountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-bincountoptions.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-bincountoptions.html#cfn-quicksight-analysis-bincountoptions-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BinWidthOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-binwidthoptions.html","Properties":{"BinCountLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-binwidthoptions.html#cfn-quicksight-analysis-binwidthoptions-bincountlimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-binwidthoptions.html#cfn-quicksight-analysis-binwidthoptions-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BodySectionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-bodysectionconfiguration.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-bodysectionconfiguration.html#cfn-quicksight-analysis-bodysectionconfiguration-content","Required":true,"Type":"BodySectionContent","UpdateType":"Mutable"},"PageBreakConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-bodysectionconfiguration.html#cfn-quicksight-analysis-bodysectionconfiguration-pagebreakconfiguration","Required":false,"Type":"SectionPageBreakConfiguration","UpdateType":"Mutable"},"SectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-bodysectionconfiguration.html#cfn-quicksight-analysis-bodysectionconfiguration-sectionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Style":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-bodysectionconfiguration.html#cfn-quicksight-analysis-bodysectionconfiguration-style","Required":false,"Type":"SectionStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BodySectionContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-bodysectioncontent.html","Properties":{"Layout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-bodysectioncontent.html#cfn-quicksight-analysis-bodysectioncontent-layout","Required":false,"Type":"SectionLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BoxPlotAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotaggregatedfieldwells.html","Properties":{"GroupBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotaggregatedfieldwells.html#cfn-quicksight-analysis-boxplotaggregatedfieldwells-groupby","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotaggregatedfieldwells.html#cfn-quicksight-analysis-boxplotaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BoxPlotChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html","Properties":{"BoxPlotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html#cfn-quicksight-analysis-boxplotchartconfiguration-boxplotoptions","Required":false,"Type":"BoxPlotOptions","UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html#cfn-quicksight-analysis-boxplotchartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html#cfn-quicksight-analysis-boxplotchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html#cfn-quicksight-analysis-boxplotchartconfiguration-fieldwells","Required":false,"Type":"BoxPlotFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html#cfn-quicksight-analysis-boxplotchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html#cfn-quicksight-analysis-boxplotchartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html#cfn-quicksight-analysis-boxplotchartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html#cfn-quicksight-analysis-boxplotchartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html#cfn-quicksight-analysis-boxplotchartconfiguration-sortconfiguration","Required":false,"Type":"BoxPlotSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html#cfn-quicksight-analysis-boxplotchartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotchartconfiguration.html#cfn-quicksight-analysis-boxplotchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BoxPlotFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotfieldwells.html","Properties":{"BoxPlotAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotfieldwells.html#cfn-quicksight-analysis-boxplotfieldwells-boxplotaggregatedfieldwells","Required":false,"Type":"BoxPlotAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BoxPlotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotoptions.html","Properties":{"AllDataPointsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotoptions.html#cfn-quicksight-analysis-boxplotoptions-alldatapointsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutlierVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotoptions.html#cfn-quicksight-analysis-boxplotoptions-outliervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotoptions.html#cfn-quicksight-analysis-boxplotoptions-styleoptions","Required":false,"Type":"BoxPlotStyleOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BoxPlotSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotsortconfiguration.html","Properties":{"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotsortconfiguration.html#cfn-quicksight-analysis-boxplotsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"PaginationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotsortconfiguration.html#cfn-quicksight-analysis-boxplotsortconfiguration-paginationconfiguration","Required":false,"Type":"PaginationConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BoxPlotStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotstyleoptions.html","Properties":{"FillStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotstyleoptions.html#cfn-quicksight-analysis-boxplotstyleoptions-fillstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.BoxPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotvisual.html#cfn-quicksight-analysis-boxplotvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotvisual.html#cfn-quicksight-analysis-boxplotvisual-chartconfiguration","Required":false,"Type":"BoxPlotChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotvisual.html#cfn-quicksight-analysis-boxplotvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotvisual.html#cfn-quicksight-analysis-boxplotvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotvisual.html#cfn-quicksight-analysis-boxplotvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-boxplotvisual.html#cfn-quicksight-analysis-boxplotvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CalculatedField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-calculatedfield.html","Properties":{"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-calculatedfield.html#cfn-quicksight-analysis-calculatedfield-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-calculatedfield.html#cfn-quicksight-analysis-calculatedfield-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-calculatedfield.html#cfn-quicksight-analysis-calculatedfield-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CalculatedMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-calculatedmeasurefield.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-calculatedmeasurefield.html#cfn-quicksight-analysis-calculatedmeasurefield-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-calculatedmeasurefield.html#cfn-quicksight-analysis-calculatedmeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-cascadingcontrolconfiguration.html","Properties":{"SourceControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-cascadingcontrolconfiguration.html#cfn-quicksight-analysis-cascadingcontrolconfiguration-sourcecontrols","DuplicatesAllowed":true,"ItemType":"CascadingControlSource","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CascadingControlSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-cascadingcontrolsource.html","Properties":{"ColumnToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-cascadingcontrolsource.html#cfn-quicksight-analysis-cascadingcontrolsource-columntomatch","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"SourceSheetControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-cascadingcontrolsource.html#cfn-quicksight-analysis-cascadingcontrolsource-sourcesheetcontrolid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CategoricalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoricaldimensionfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoricaldimensionfield.html#cfn-quicksight-analysis-categoricaldimensionfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoricaldimensionfield.html#cfn-quicksight-analysis-categoricaldimensionfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoricaldimensionfield.html#cfn-quicksight-analysis-categoricaldimensionfield-formatconfiguration","Required":false,"Type":"StringFormatConfiguration","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoricaldimensionfield.html#cfn-quicksight-analysis-categoricaldimensionfield-hierarchyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CategoricalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoricalmeasurefield.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoricalmeasurefield.html#cfn-quicksight-analysis-categoricalmeasurefield-aggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoricalmeasurefield.html#cfn-quicksight-analysis-categoricalmeasurefield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoricalmeasurefield.html#cfn-quicksight-analysis-categoricalmeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoricalmeasurefield.html#cfn-quicksight-analysis-categoricalmeasurefield-formatconfiguration","Required":false,"Type":"StringFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CategoryDrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categorydrilldownfilter.html","Properties":{"CategoryValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categorydrilldownfilter.html#cfn-quicksight-analysis-categorydrilldownfilter-categoryvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categorydrilldownfilter.html#cfn-quicksight-analysis-categorydrilldownfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CategoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoryfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoryfilter.html#cfn-quicksight-analysis-categoryfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoryfilter.html#cfn-quicksight-analysis-categoryfilter-configuration","Required":true,"Type":"CategoryFilterConfiguration","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoryfilter.html#cfn-quicksight-analysis-categoryfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CategoryFilterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoryfilterconfiguration.html","Properties":{"CustomFilterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoryfilterconfiguration.html#cfn-quicksight-analysis-categoryfilterconfiguration-customfilterconfiguration","Required":false,"Type":"CustomFilterConfiguration","UpdateType":"Mutable"},"CustomFilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoryfilterconfiguration.html#cfn-quicksight-analysis-categoryfilterconfiguration-customfilterlistconfiguration","Required":false,"Type":"CustomFilterListConfiguration","UpdateType":"Mutable"},"FilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-categoryfilterconfiguration.html#cfn-quicksight-analysis-categoryfilterconfiguration-filterlistconfiguration","Required":false,"Type":"FilterListConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ChartAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-chartaxislabeloptions.html","Properties":{"AxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-chartaxislabeloptions.html#cfn-quicksight-analysis-chartaxislabeloptions-axislabeloptions","DuplicatesAllowed":true,"ItemType":"AxisLabelOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"SortIconVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-chartaxislabeloptions.html#cfn-quicksight-analysis-chartaxislabeloptions-sorticonvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-chartaxislabeloptions.html#cfn-quicksight-analysis-chartaxislabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-clustermarker.html","Properties":{"SimpleClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-clustermarker.html#cfn-quicksight-analysis-clustermarker-simpleclustermarker","Required":false,"Type":"SimpleClusterMarker","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ClusterMarkerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-clustermarkerconfiguration.html","Properties":{"ClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-clustermarkerconfiguration.html#cfn-quicksight-analysis-clustermarkerconfiguration-clustermarker","Required":false,"Type":"ClusterMarker","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-colorscale.html","Properties":{"ColorFillType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-colorscale.html#cfn-quicksight-analysis-colorscale-colorfilltype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-colorscale.html#cfn-quicksight-analysis-colorscale-colors","DuplicatesAllowed":true,"ItemType":"DataColor","Required":true,"Type":"List","UpdateType":"Mutable"},"NullValueColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-colorscale.html#cfn-quicksight-analysis-colorscale-nullvaluecolor","Required":false,"Type":"DataColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ColumnConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnconfiguration.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnconfiguration.html#cfn-quicksight-analysis-columnconfiguration-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnconfiguration.html#cfn-quicksight-analysis-columnconfiguration-formatconfiguration","Required":false,"Type":"FormatConfiguration","UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnconfiguration.html#cfn-quicksight-analysis-columnconfiguration-role","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ColumnHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnhierarchy.html","Properties":{"DateTimeHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnhierarchy.html#cfn-quicksight-analysis-columnhierarchy-datetimehierarchy","Required":false,"Type":"DateTimeHierarchy","UpdateType":"Mutable"},"ExplicitHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnhierarchy.html#cfn-quicksight-analysis-columnhierarchy-explicithierarchy","Required":false,"Type":"ExplicitHierarchy","UpdateType":"Mutable"},"PredefinedHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnhierarchy.html#cfn-quicksight-analysis-columnhierarchy-predefinedhierarchy","Required":false,"Type":"PredefinedHierarchy","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ColumnIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnidentifier.html","Properties":{"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnidentifier.html#cfn-quicksight-analysis-columnidentifier-columnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnidentifier.html#cfn-quicksight-analysis-columnidentifier-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ColumnSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnsort.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnsort.html#cfn-quicksight-analysis-columnsort-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnsort.html#cfn-quicksight-analysis-columnsort-direction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SortBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columnsort.html#cfn-quicksight-analysis-columnsort-sortby","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ColumnTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columntooltipitem.html","Properties":{"Aggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columntooltipitem.html#cfn-quicksight-analysis-columntooltipitem-aggregation","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columntooltipitem.html#cfn-quicksight-analysis-columntooltipitem-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columntooltipitem.html#cfn-quicksight-analysis-columntooltipitem-label","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-columntooltipitem.html#cfn-quicksight-analysis-columntooltipitem-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ComboChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartaggregatedfieldwells.html","Properties":{"BarValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartaggregatedfieldwells.html#cfn-quicksight-analysis-combochartaggregatedfieldwells-barvalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartaggregatedfieldwells.html#cfn-quicksight-analysis-combochartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartaggregatedfieldwells.html#cfn-quicksight-analysis-combochartaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"LineValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartaggregatedfieldwells.html#cfn-quicksight-analysis-combochartaggregatedfieldwells-linevalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ComboChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html","Properties":{"BarDataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-bardatalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"BarsArrangement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-barsarrangement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-fieldwells","Required":false,"Type":"ComboChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"LineDataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-linedatalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SecondaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-secondaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"SecondaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-secondaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-sortconfiguration","Required":false,"Type":"ComboChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartconfiguration.html#cfn-quicksight-analysis-combochartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ComboChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartfieldwells.html","Properties":{"ComboChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartfieldwells.html#cfn-quicksight-analysis-combochartfieldwells-combochartaggregatedfieldwells","Required":false,"Type":"ComboChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ComboChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartsortconfiguration.html#cfn-quicksight-analysis-combochartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartsortconfiguration.html#cfn-quicksight-analysis-combochartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartsortconfiguration.html#cfn-quicksight-analysis-combochartsortconfiguration-coloritemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"ColorSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartsortconfiguration.html#cfn-quicksight-analysis-combochartsortconfiguration-colorsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ComboChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartvisual.html#cfn-quicksight-analysis-combochartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartvisual.html#cfn-quicksight-analysis-combochartvisual-chartconfiguration","Required":false,"Type":"ComboChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartvisual.html#cfn-quicksight-analysis-combochartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartvisual.html#cfn-quicksight-analysis-combochartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartvisual.html#cfn-quicksight-analysis-combochartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-combochartvisual.html#cfn-quicksight-analysis-combochartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ComparisonConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-comparisonconfiguration.html","Properties":{"ComparisonFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-comparisonconfiguration.html#cfn-quicksight-analysis-comparisonconfiguration-comparisonformat","Required":false,"Type":"ComparisonFormatConfiguration","UpdateType":"Mutable"},"ComparisonMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-comparisonconfiguration.html#cfn-quicksight-analysis-comparisonconfiguration-comparisonmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ComparisonFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-comparisonformatconfiguration.html","Properties":{"NumberDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-comparisonformatconfiguration.html#cfn-quicksight-analysis-comparisonformatconfiguration-numberdisplayformatconfiguration","Required":false,"Type":"NumberDisplayFormatConfiguration","UpdateType":"Mutable"},"PercentageDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-comparisonformatconfiguration.html#cfn-quicksight-analysis-comparisonformatconfiguration-percentagedisplayformatconfiguration","Required":false,"Type":"PercentageDisplayFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.Computation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-computation.html","Properties":{"Forecast":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-computation.html#cfn-quicksight-analysis-computation-forecast","Required":false,"Type":"ForecastComputation","UpdateType":"Mutable"},"GrowthRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-computation.html#cfn-quicksight-analysis-computation-growthrate","Required":false,"Type":"GrowthRateComputation","UpdateType":"Mutable"},"MaximumMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-computation.html#cfn-quicksight-analysis-computation-maximumminimum","Required":false,"Type":"MaximumMinimumComputation","UpdateType":"Mutable"},"MetricComparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-computation.html#cfn-quicksight-analysis-computation-metriccomparison","Required":false,"Type":"MetricComparisonComputation","UpdateType":"Mutable"},"PeriodOverPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-computation.html#cfn-quicksight-analysis-computation-periodoverperiod","Required":false,"Type":"PeriodOverPeriodComputation","UpdateType":"Mutable"},"PeriodToDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-computation.html#cfn-quicksight-analysis-computation-periodtodate","Required":false,"Type":"PeriodToDateComputation","UpdateType":"Mutable"},"TopBottomMovers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-computation.html#cfn-quicksight-analysis-computation-topbottommovers","Required":false,"Type":"TopBottomMoversComputation","UpdateType":"Mutable"},"TopBottomRanked":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-computation.html#cfn-quicksight-analysis-computation-topbottomranked","Required":false,"Type":"TopBottomRankedComputation","UpdateType":"Mutable"},"TotalAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-computation.html#cfn-quicksight-analysis-computation-totalaggregation","Required":false,"Type":"TotalAggregationComputation","UpdateType":"Mutable"},"UniqueValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-computation.html#cfn-quicksight-analysis-computation-uniquevalues","Required":false,"Type":"UniqueValuesComputation","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ConditionalFormattingColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingcolor.html","Properties":{"Gradient":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingcolor.html#cfn-quicksight-analysis-conditionalformattingcolor-gradient","Required":false,"Type":"ConditionalFormattingGradientColor","UpdateType":"Mutable"},"Solid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingcolor.html#cfn-quicksight-analysis-conditionalformattingcolor-solid","Required":false,"Type":"ConditionalFormattingSolidColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ConditionalFormattingCustomIconCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingcustomiconcondition.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingcustomiconcondition.html#cfn-quicksight-analysis-conditionalformattingcustomiconcondition-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingcustomiconcondition.html#cfn-quicksight-analysis-conditionalformattingcustomiconcondition-displayconfiguration","Required":false,"Type":"ConditionalFormattingIconDisplayConfiguration","UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingcustomiconcondition.html#cfn-quicksight-analysis-conditionalformattingcustomiconcondition-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IconOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingcustomiconcondition.html#cfn-quicksight-analysis-conditionalformattingcustomiconcondition-iconoptions","Required":true,"Type":"ConditionalFormattingCustomIconOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ConditionalFormattingCustomIconOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingcustomiconoptions.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingcustomiconoptions.html#cfn-quicksight-analysis-conditionalformattingcustomiconoptions-icon","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UnicodeIcon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingcustomiconoptions.html#cfn-quicksight-analysis-conditionalformattingcustomiconoptions-unicodeicon","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ConditionalFormattingGradientColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattinggradientcolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattinggradientcolor.html#cfn-quicksight-analysis-conditionalformattinggradientcolor-color","Required":true,"Type":"GradientColor","UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattinggradientcolor.html#cfn-quicksight-analysis-conditionalformattinggradientcolor-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ConditionalFormattingIcon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingicon.html","Properties":{"CustomCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingicon.html#cfn-quicksight-analysis-conditionalformattingicon-customcondition","Required":false,"Type":"ConditionalFormattingCustomIconCondition","UpdateType":"Mutable"},"IconSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingicon.html#cfn-quicksight-analysis-conditionalformattingicon-iconset","Required":false,"Type":"ConditionalFormattingIconSet","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ConditionalFormattingIconDisplayConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingicondisplayconfiguration.html","Properties":{"IconDisplayOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingicondisplayconfiguration.html#cfn-quicksight-analysis-conditionalformattingicondisplayconfiguration-icondisplayoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ConditionalFormattingIconSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingiconset.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingiconset.html#cfn-quicksight-analysis-conditionalformattingiconset-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IconSetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingiconset.html#cfn-quicksight-analysis-conditionalformattingiconset-iconsettype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ConditionalFormattingSolidColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingsolidcolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingsolidcolor.html#cfn-quicksight-analysis-conditionalformattingsolidcolor-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-conditionalformattingsolidcolor.html#cfn-quicksight-analysis-conditionalformattingsolidcolor-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ContributionAnalysisDefault":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-contributionanalysisdefault.html","Properties":{"ContributorDimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-contributionanalysisdefault.html#cfn-quicksight-analysis-contributionanalysisdefault-contributordimensions","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":true,"Type":"List","UpdateType":"Mutable"},"MeasureFieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-contributionanalysisdefault.html#cfn-quicksight-analysis-contributionanalysisdefault-measurefieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CurrencyDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-currencydisplayformatconfiguration.html","Properties":{"DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-currencydisplayformatconfiguration.html#cfn-quicksight-analysis-currencydisplayformatconfiguration-decimalplacesconfiguration","Required":false,"Type":"DecimalPlacesConfiguration","UpdateType":"Mutable"},"NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-currencydisplayformatconfiguration.html#cfn-quicksight-analysis-currencydisplayformatconfiguration-negativevalueconfiguration","Required":false,"Type":"NegativeValueConfiguration","UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-currencydisplayformatconfiguration.html#cfn-quicksight-analysis-currencydisplayformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumberScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-currencydisplayformatconfiguration.html#cfn-quicksight-analysis-currencydisplayformatconfiguration-numberscale","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-currencydisplayformatconfiguration.html#cfn-quicksight-analysis-currencydisplayformatconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-currencydisplayformatconfiguration.html#cfn-quicksight-analysis-currencydisplayformatconfiguration-separatorconfiguration","Required":false,"Type":"NumericSeparatorConfiguration","UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-currencydisplayformatconfiguration.html#cfn-quicksight-analysis-currencydisplayformatconfiguration-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Symbol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-currencydisplayformatconfiguration.html#cfn-quicksight-analysis-currencydisplayformatconfiguration-symbol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CustomActionFilterOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customactionfilteroperation.html","Properties":{"SelectedFieldsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customactionfilteroperation.html#cfn-quicksight-analysis-customactionfilteroperation-selectedfieldsconfiguration","Required":true,"Type":"FilterOperationSelectedFieldsConfiguration","UpdateType":"Mutable"},"TargetVisualsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customactionfilteroperation.html#cfn-quicksight-analysis-customactionfilteroperation-targetvisualsconfiguration","Required":true,"Type":"FilterOperationTargetVisualsConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CustomActionNavigationOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customactionnavigationoperation.html","Properties":{"LocalNavigationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customactionnavigationoperation.html#cfn-quicksight-analysis-customactionnavigationoperation-localnavigationconfiguration","Required":false,"Type":"LocalNavigationConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CustomActionSetParametersOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customactionsetparametersoperation.html","Properties":{"ParameterValueConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customactionsetparametersoperation.html#cfn-quicksight-analysis-customactionsetparametersoperation-parametervalueconfigurations","DuplicatesAllowed":true,"ItemType":"SetParameterValueConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CustomActionURLOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customactionurloperation.html","Properties":{"URLTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customactionurloperation.html#cfn-quicksight-analysis-customactionurloperation-urltarget","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"URLTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customactionurloperation.html#cfn-quicksight-analysis-customactionurloperation-urltemplate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CustomContentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customcontentconfiguration.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customcontentconfiguration.html#cfn-quicksight-analysis-customcontentconfiguration-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContentUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customcontentconfiguration.html#cfn-quicksight-analysis-customcontentconfiguration-contenturl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customcontentconfiguration.html#cfn-quicksight-analysis-customcontentconfiguration-imagescaling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CustomContentVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customcontentvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customcontentvisual.html#cfn-quicksight-analysis-customcontentvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customcontentvisual.html#cfn-quicksight-analysis-customcontentvisual-chartconfiguration","Required":false,"Type":"CustomContentConfiguration","UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customcontentvisual.html#cfn-quicksight-analysis-customcontentvisual-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customcontentvisual.html#cfn-quicksight-analysis-customcontentvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customcontentvisual.html#cfn-quicksight-analysis-customcontentvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customcontentvisual.html#cfn-quicksight-analysis-customcontentvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CustomFilterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customfilterconfiguration.html","Properties":{"CategoryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customfilterconfiguration.html#cfn-quicksight-analysis-customfilterconfiguration-categoryvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customfilterconfiguration.html#cfn-quicksight-analysis-customfilterconfiguration-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customfilterconfiguration.html#cfn-quicksight-analysis-customfilterconfiguration-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customfilterconfiguration.html#cfn-quicksight-analysis-customfilterconfiguration-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customfilterconfiguration.html#cfn-quicksight-analysis-customfilterconfiguration-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CustomFilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customfilterlistconfiguration.html","Properties":{"CategoryValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customfilterlistconfiguration.html#cfn-quicksight-analysis-customfilterlistconfiguration-categoryvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customfilterlistconfiguration.html#cfn-quicksight-analysis-customfilterlistconfiguration-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customfilterlistconfiguration.html#cfn-quicksight-analysis-customfilterlistconfiguration-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customfilterlistconfiguration.html#cfn-quicksight-analysis-customfilterlistconfiguration-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CustomNarrativeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customnarrativeoptions.html","Properties":{"Narrative":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customnarrativeoptions.html#cfn-quicksight-analysis-customnarrativeoptions-narrative","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CustomParameterValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customparametervalues.html","Properties":{"DateTimeValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customparametervalues.html#cfn-quicksight-analysis-customparametervalues-datetimevalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DecimalValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customparametervalues.html#cfn-quicksight-analysis-customparametervalues-decimalvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"},"IntegerValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customparametervalues.html#cfn-quicksight-analysis-customparametervalues-integervalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"},"StringValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customparametervalues.html#cfn-quicksight-analysis-customparametervalues-stringvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.CustomValuesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customvaluesconfiguration.html","Properties":{"CustomValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customvaluesconfiguration.html#cfn-quicksight-analysis-customvaluesconfiguration-customvalues","Required":true,"Type":"CustomParameterValues","UpdateType":"Mutable"},"IncludeNullValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-customvaluesconfiguration.html#cfn-quicksight-analysis-customvaluesconfiguration-includenullvalue","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DataBarsOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-databarsoptions.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-databarsoptions.html#cfn-quicksight-analysis-databarsoptions-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NegativeColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-databarsoptions.html#cfn-quicksight-analysis-databarsoptions-negativecolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PositiveColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-databarsoptions.html#cfn-quicksight-analysis-databarsoptions-positivecolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DataColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datacolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datacolor.html#cfn-quicksight-analysis-datacolor-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datacolor.html#cfn-quicksight-analysis-datacolor-datavalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DataFieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datafieldseriesitem.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datafieldseriesitem.html#cfn-quicksight-analysis-datafieldseriesitem-axisbinding","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datafieldseriesitem.html#cfn-quicksight-analysis-datafieldseriesitem-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datafieldseriesitem.html#cfn-quicksight-analysis-datafieldseriesitem-fieldvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datafieldseriesitem.html#cfn-quicksight-analysis-datafieldseriesitem-settings","Required":false,"Type":"LineChartSeriesSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DataLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeloptions.html","Properties":{"CategoryLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeloptions.html#cfn-quicksight-analysis-datalabeloptions-categorylabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataLabelTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeloptions.html#cfn-quicksight-analysis-datalabeloptions-datalabeltypes","DuplicatesAllowed":true,"ItemType":"DataLabelType","Required":false,"Type":"List","UpdateType":"Mutable"},"LabelColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeloptions.html#cfn-quicksight-analysis-datalabeloptions-labelcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeloptions.html#cfn-quicksight-analysis-datalabeloptions-labelcontent","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeloptions.html#cfn-quicksight-analysis-datalabeloptions-labelfontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"MeasureLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeloptions.html#cfn-quicksight-analysis-datalabeloptions-measurelabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Overlap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeloptions.html#cfn-quicksight-analysis-datalabeloptions-overlap","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeloptions.html#cfn-quicksight-analysis-datalabeloptions-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeloptions.html#cfn-quicksight-analysis-datalabeloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeloptions.html#cfn-quicksight-analysis-datalabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DataLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeltype.html","Properties":{"DataPathLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeltype.html#cfn-quicksight-analysis-datalabeltype-datapathlabeltype","Required":false,"Type":"DataPathLabelType","UpdateType":"Mutable"},"FieldLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeltype.html#cfn-quicksight-analysis-datalabeltype-fieldlabeltype","Required":false,"Type":"FieldLabelType","UpdateType":"Mutable"},"MaximumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeltype.html#cfn-quicksight-analysis-datalabeltype-maximumlabeltype","Required":false,"Type":"MaximumLabelType","UpdateType":"Mutable"},"MinimumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeltype.html#cfn-quicksight-analysis-datalabeltype-minimumlabeltype","Required":false,"Type":"MinimumLabelType","UpdateType":"Mutable"},"RangeEndsLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datalabeltype.html#cfn-quicksight-analysis-datalabeltype-rangeendslabeltype","Required":false,"Type":"RangeEndsLabelType","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DataPathColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathcolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathcolor.html#cfn-quicksight-analysis-datapathcolor-color","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Element":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathcolor.html#cfn-quicksight-analysis-datapathcolor-element","Required":true,"Type":"DataPathValue","UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathcolor.html#cfn-quicksight-analysis-datapathcolor-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DataPathLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathlabeltype.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathlabeltype.html#cfn-quicksight-analysis-datapathlabeltype-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathlabeltype.html#cfn-quicksight-analysis-datapathlabeltype-fieldvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathlabeltype.html#cfn-quicksight-analysis-datapathlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DataPathSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathsort.html","Properties":{"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathsort.html#cfn-quicksight-analysis-datapathsort-direction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SortPaths":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathsort.html#cfn-quicksight-analysis-datapathsort-sortpaths","DuplicatesAllowed":true,"ItemType":"DataPathValue","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DataPathValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathvalue.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathvalue.html#cfn-quicksight-analysis-datapathvalue-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datapathvalue.html#cfn-quicksight-analysis-datapathvalue-fieldvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DataSetIdentifierDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datasetidentifierdeclaration.html","Properties":{"DataSetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datasetidentifierdeclaration.html#cfn-quicksight-analysis-datasetidentifierdeclaration-datasetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Identifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datasetidentifierdeclaration.html#cfn-quicksight-analysis-datasetidentifierdeclaration-identifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DataSetReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datasetreference.html","Properties":{"DataSetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datasetreference.html#cfn-quicksight-analysis-datasetreference-datasetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetPlaceholder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datasetreference.html#cfn-quicksight-analysis-datasetreference-datasetplaceholder","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DateAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dateaxisoptions.html","Properties":{"MissingDateVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dateaxisoptions.html#cfn-quicksight-analysis-dateaxisoptions-missingdatevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DateDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datedimensionfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datedimensionfield.html#cfn-quicksight-analysis-datedimensionfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"DateGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datedimensionfield.html#cfn-quicksight-analysis-datedimensionfield-dategranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datedimensionfield.html#cfn-quicksight-analysis-datedimensionfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datedimensionfield.html#cfn-quicksight-analysis-datedimensionfield-formatconfiguration","Required":false,"Type":"DateTimeFormatConfiguration","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datedimensionfield.html#cfn-quicksight-analysis-datedimensionfield-hierarchyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DateMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datemeasurefield.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datemeasurefield.html#cfn-quicksight-analysis-datemeasurefield-aggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datemeasurefield.html#cfn-quicksight-analysis-datemeasurefield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datemeasurefield.html#cfn-quicksight-analysis-datemeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datemeasurefield.html#cfn-quicksight-analysis-datemeasurefield-formatconfiguration","Required":false,"Type":"DateTimeFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DateTimeDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimedefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimedefaultvalues.html#cfn-quicksight-analysis-datetimedefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"RollingDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimedefaultvalues.html#cfn-quicksight-analysis-datetimedefaultvalues-rollingdate","Required":false,"Type":"RollingDateConfiguration","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimedefaultvalues.html#cfn-quicksight-analysis-datetimedefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DateTimeFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeformatconfiguration.html","Properties":{"DateTimeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeformatconfiguration.html#cfn-quicksight-analysis-datetimeformatconfiguration-datetimeformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeformatconfiguration.html#cfn-quicksight-analysis-datetimeformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumericFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeformatconfiguration.html#cfn-quicksight-analysis-datetimeformatconfiguration-numericformatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DateTimeHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimehierarchy.html","Properties":{"DrillDownFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimehierarchy.html#cfn-quicksight-analysis-datetimehierarchy-drilldownfilters","DuplicatesAllowed":true,"ItemType":"DrillDownFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimehierarchy.html#cfn-quicksight-analysis-datetimehierarchy-hierarchyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DateTimeParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeparameter.html#cfn-quicksight-analysis-datetimeparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeparameter.html#cfn-quicksight-analysis-datetimeparameter-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DateTimeParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeparameterdeclaration.html#cfn-quicksight-analysis-datetimeparameterdeclaration-defaultvalues","Required":false,"Type":"DateTimeDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeparameterdeclaration.html#cfn-quicksight-analysis-datetimeparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeparameterdeclaration.html#cfn-quicksight-analysis-datetimeparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeparameterdeclaration.html#cfn-quicksight-analysis-datetimeparameterdeclaration-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimeparameterdeclaration.html#cfn-quicksight-analysis-datetimeparameterdeclaration-valuewhenunset","Required":false,"Type":"DateTimeValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DateTimePickerControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimepickercontroldisplayoptions.html","Properties":{"DateTimeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimepickercontroldisplayoptions.html#cfn-quicksight-analysis-datetimepickercontroldisplayoptions-datetimeformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimepickercontroldisplayoptions.html#cfn-quicksight-analysis-datetimepickercontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DateTimeValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimevaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimevaluewhenunsetconfiguration.html#cfn-quicksight-analysis-datetimevaluewhenunsetconfiguration-customvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-datetimevaluewhenunsetconfiguration.html#cfn-quicksight-analysis-datetimevaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DecimalDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimaldefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimaldefaultvalues.html#cfn-quicksight-analysis-decimaldefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimaldefaultvalues.html#cfn-quicksight-analysis-decimaldefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DecimalParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalparameter.html#cfn-quicksight-analysis-decimalparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalparameter.html#cfn-quicksight-analysis-decimalparameter-values","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DecimalParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalparameterdeclaration.html#cfn-quicksight-analysis-decimalparameterdeclaration-defaultvalues","Required":false,"Type":"DecimalDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalparameterdeclaration.html#cfn-quicksight-analysis-decimalparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalparameterdeclaration.html#cfn-quicksight-analysis-decimalparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalparameterdeclaration.html#cfn-quicksight-analysis-decimalparameterdeclaration-parametervaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalparameterdeclaration.html#cfn-quicksight-analysis-decimalparameterdeclaration-valuewhenunset","Required":false,"Type":"DecimalValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalplacesconfiguration.html","Properties":{"DecimalPlaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalplacesconfiguration.html#cfn-quicksight-analysis-decimalplacesconfiguration-decimalplaces","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DecimalValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalvaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalvaluewhenunsetconfiguration.html#cfn-quicksight-analysis-decimalvaluewhenunsetconfiguration-customvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-decimalvaluewhenunsetconfiguration.html#cfn-quicksight-analysis-decimalvaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DefaultFreeFormLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultfreeformlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultfreeformlayoutconfiguration.html#cfn-quicksight-analysis-defaultfreeformlayoutconfiguration-canvassizeoptions","Required":true,"Type":"FreeFormLayoutCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DefaultGridLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultgridlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultgridlayoutconfiguration.html#cfn-quicksight-analysis-defaultgridlayoutconfiguration-canvassizeoptions","Required":true,"Type":"GridLayoutCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DefaultInteractiveLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultinteractivelayoutconfiguration.html","Properties":{"FreeForm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultinteractivelayoutconfiguration.html#cfn-quicksight-analysis-defaultinteractivelayoutconfiguration-freeform","Required":false,"Type":"DefaultFreeFormLayoutConfiguration","UpdateType":"Mutable"},"Grid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultinteractivelayoutconfiguration.html#cfn-quicksight-analysis-defaultinteractivelayoutconfiguration-grid","Required":false,"Type":"DefaultGridLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DefaultNewSheetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultnewsheetconfiguration.html","Properties":{"InteractiveLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultnewsheetconfiguration.html#cfn-quicksight-analysis-defaultnewsheetconfiguration-interactivelayoutconfiguration","Required":false,"Type":"DefaultInteractiveLayoutConfiguration","UpdateType":"Mutable"},"PaginatedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultnewsheetconfiguration.html#cfn-quicksight-analysis-defaultnewsheetconfiguration-paginatedlayoutconfiguration","Required":false,"Type":"DefaultPaginatedLayoutConfiguration","UpdateType":"Mutable"},"SheetContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultnewsheetconfiguration.html#cfn-quicksight-analysis-defaultnewsheetconfiguration-sheetcontenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DefaultPaginatedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultpaginatedlayoutconfiguration.html","Properties":{"SectionBased":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultpaginatedlayoutconfiguration.html#cfn-quicksight-analysis-defaultpaginatedlayoutconfiguration-sectionbased","Required":false,"Type":"DefaultSectionBasedLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DefaultSectionBasedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultsectionbasedlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-defaultsectionbasedlayoutconfiguration.html#cfn-quicksight-analysis-defaultsectionbasedlayoutconfiguration-canvassizeoptions","Required":true,"Type":"SectionBasedLayoutCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DestinationParameterValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-destinationparametervalueconfiguration.html","Properties":{"CustomValuesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-destinationparametervalueconfiguration.html#cfn-quicksight-analysis-destinationparametervalueconfiguration-customvaluesconfiguration","Required":false,"Type":"CustomValuesConfiguration","UpdateType":"Mutable"},"SelectAllValueOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-destinationparametervalueconfiguration.html#cfn-quicksight-analysis-destinationparametervalueconfiguration-selectallvalueoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-destinationparametervalueconfiguration.html#cfn-quicksight-analysis-destinationparametervalueconfiguration-sourcecolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"SourceField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-destinationparametervalueconfiguration.html#cfn-quicksight-analysis-destinationparametervalueconfiguration-sourcefield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-destinationparametervalueconfiguration.html#cfn-quicksight-analysis-destinationparametervalueconfiguration-sourceparametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dimensionfield.html","Properties":{"CategoricalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dimensionfield.html#cfn-quicksight-analysis-dimensionfield-categoricaldimensionfield","Required":false,"Type":"CategoricalDimensionField","UpdateType":"Mutable"},"DateDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dimensionfield.html#cfn-quicksight-analysis-dimensionfield-datedimensionfield","Required":false,"Type":"DateDimensionField","UpdateType":"Mutable"},"NumericalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dimensionfield.html#cfn-quicksight-analysis-dimensionfield-numericaldimensionfield","Required":false,"Type":"NumericalDimensionField","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DonutCenterOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-donutcenteroptions.html","Properties":{"LabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-donutcenteroptions.html#cfn-quicksight-analysis-donutcenteroptions-labelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DonutOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-donutoptions.html","Properties":{"ArcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-donutoptions.html#cfn-quicksight-analysis-donutoptions-arcoptions","Required":false,"Type":"ArcOptions","UpdateType":"Mutable"},"DonutCenterOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-donutoptions.html#cfn-quicksight-analysis-donutoptions-donutcenteroptions","Required":false,"Type":"DonutCenterOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-drilldownfilter.html","Properties":{"CategoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-drilldownfilter.html#cfn-quicksight-analysis-drilldownfilter-categoryfilter","Required":false,"Type":"CategoryDrillDownFilter","UpdateType":"Mutable"},"NumericEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-drilldownfilter.html#cfn-quicksight-analysis-drilldownfilter-numericequalityfilter","Required":false,"Type":"NumericEqualityDrillDownFilter","UpdateType":"Mutable"},"TimeRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-drilldownfilter.html#cfn-quicksight-analysis-drilldownfilter-timerangefilter","Required":false,"Type":"TimeRangeDrillDownFilter","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DropDownControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dropdowncontroldisplayoptions.html","Properties":{"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dropdowncontroldisplayoptions.html#cfn-quicksight-analysis-dropdowncontroldisplayoptions-selectalloptions","Required":false,"Type":"ListControlSelectAllOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dropdowncontroldisplayoptions.html#cfn-quicksight-analysis-dropdowncontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.DynamicDefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dynamicdefaultvalue.html","Properties":{"DefaultValueColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dynamicdefaultvalue.html#cfn-quicksight-analysis-dynamicdefaultvalue-defaultvaluecolumn","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"GroupNameColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dynamicdefaultvalue.html#cfn-quicksight-analysis-dynamicdefaultvalue-groupnamecolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"UserNameColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-dynamicdefaultvalue.html#cfn-quicksight-analysis-dynamicdefaultvalue-usernamecolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.EmptyVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-emptyvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-emptyvisual.html#cfn-quicksight-analysis-emptyvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-emptyvisual.html#cfn-quicksight-analysis-emptyvisual-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-emptyvisual.html#cfn-quicksight-analysis-emptyvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.Entity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-entity.html","Properties":{"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-entity.html#cfn-quicksight-analysis-entity-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ExcludePeriodConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-excludeperiodconfiguration.html","Properties":{"Amount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-excludeperiodconfiguration.html#cfn-quicksight-analysis-excludeperiodconfiguration-amount","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Granularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-excludeperiodconfiguration.html#cfn-quicksight-analysis-excludeperiodconfiguration-granularity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-excludeperiodconfiguration.html#cfn-quicksight-analysis-excludeperiodconfiguration-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ExplicitHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-explicithierarchy.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-explicithierarchy.html#cfn-quicksight-analysis-explicithierarchy-columns","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":true,"Type":"List","UpdateType":"Mutable"},"DrillDownFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-explicithierarchy.html#cfn-quicksight-analysis-explicithierarchy-drilldownfilters","DuplicatesAllowed":true,"ItemType":"DrillDownFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-explicithierarchy.html#cfn-quicksight-analysis-explicithierarchy-hierarchyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FieldBasedTooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldbasedtooltip.html","Properties":{"AggregationVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldbasedtooltip.html#cfn-quicksight-analysis-fieldbasedtooltip-aggregationvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TooltipFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldbasedtooltip.html#cfn-quicksight-analysis-fieldbasedtooltip-tooltipfields","DuplicatesAllowed":true,"ItemType":"TooltipItem","Required":false,"Type":"List","UpdateType":"Mutable"},"TooltipTitleType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldbasedtooltip.html#cfn-quicksight-analysis-fieldbasedtooltip-tooltiptitletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FieldLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldlabeltype.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldlabeltype.html#cfn-quicksight-analysis-fieldlabeltype-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldlabeltype.html#cfn-quicksight-analysis-fieldlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldseriesitem.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldseriesitem.html#cfn-quicksight-analysis-fieldseriesitem-axisbinding","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldseriesitem.html#cfn-quicksight-analysis-fieldseriesitem-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldseriesitem.html#cfn-quicksight-analysis-fieldseriesitem-settings","Required":false,"Type":"LineChartSeriesSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FieldSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldsort.html","Properties":{"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldsort.html#cfn-quicksight-analysis-fieldsort-direction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldsort.html#cfn-quicksight-analysis-fieldsort-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FieldSortOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldsortoptions.html","Properties":{"ColumnSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldsortoptions.html#cfn-quicksight-analysis-fieldsortoptions-columnsort","Required":false,"Type":"ColumnSort","UpdateType":"Mutable"},"FieldSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldsortoptions.html#cfn-quicksight-analysis-fieldsortoptions-fieldsort","Required":false,"Type":"FieldSort","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FieldTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldtooltipitem.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldtooltipitem.html#cfn-quicksight-analysis-fieldtooltipitem-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldtooltipitem.html#cfn-quicksight-analysis-fieldtooltipitem-label","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fieldtooltipitem.html#cfn-quicksight-analysis-fieldtooltipitem-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilledMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapaggregatedfieldwells.html","Properties":{"Geospatial":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapaggregatedfieldwells.html#cfn-quicksight-analysis-filledmapaggregatedfieldwells-geospatial","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapaggregatedfieldwells.html#cfn-quicksight-analysis-filledmapaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilledMapConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapconditionalformatting.html#cfn-quicksight-analysis-filledmapconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"FilledMapConditionalFormattingOption","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilledMapConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapconditionalformattingoption.html","Properties":{"Shape":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapconditionalformattingoption.html#cfn-quicksight-analysis-filledmapconditionalformattingoption-shape","Required":true,"Type":"FilledMapShapeConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilledMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapconfiguration.html","Properties":{"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapconfiguration.html#cfn-quicksight-analysis-filledmapconfiguration-fieldwells","Required":false,"Type":"FilledMapFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapconfiguration.html#cfn-quicksight-analysis-filledmapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"MapStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapconfiguration.html#cfn-quicksight-analysis-filledmapconfiguration-mapstyleoptions","Required":false,"Type":"GeospatialMapStyleOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapconfiguration.html#cfn-quicksight-analysis-filledmapconfiguration-sortconfiguration","Required":false,"Type":"FilledMapSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapconfiguration.html#cfn-quicksight-analysis-filledmapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"WindowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapconfiguration.html#cfn-quicksight-analysis-filledmapconfiguration-windowoptions","Required":false,"Type":"GeospatialWindowOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilledMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapfieldwells.html","Properties":{"FilledMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapfieldwells.html#cfn-quicksight-analysis-filledmapfieldwells-filledmapaggregatedfieldwells","Required":false,"Type":"FilledMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilledMapShapeConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapshapeconditionalformatting.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapshapeconditionalformatting.html#cfn-quicksight-analysis-filledmapshapeconditionalformatting-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapshapeconditionalformatting.html#cfn-quicksight-analysis-filledmapshapeconditionalformatting-format","Required":false,"Type":"ShapeConditionalFormat","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilledMapSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapsortconfiguration.html","Properties":{"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapsortconfiguration.html#cfn-quicksight-analysis-filledmapsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilledMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapvisual.html#cfn-quicksight-analysis-filledmapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapvisual.html#cfn-quicksight-analysis-filledmapvisual-chartconfiguration","Required":false,"Type":"FilledMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapvisual.html#cfn-quicksight-analysis-filledmapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapvisual.html#cfn-quicksight-analysis-filledmapvisual-conditionalformatting","Required":false,"Type":"FilledMapConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapvisual.html#cfn-quicksight-analysis-filledmapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapvisual.html#cfn-quicksight-analysis-filledmapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filledmapvisual.html#cfn-quicksight-analysis-filledmapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filter.html","Properties":{"CategoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filter.html#cfn-quicksight-analysis-filter-categoryfilter","Required":false,"Type":"CategoryFilter","UpdateType":"Mutable"},"NumericEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filter.html#cfn-quicksight-analysis-filter-numericequalityfilter","Required":false,"Type":"NumericEqualityFilter","UpdateType":"Mutable"},"NumericRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filter.html#cfn-quicksight-analysis-filter-numericrangefilter","Required":false,"Type":"NumericRangeFilter","UpdateType":"Mutable"},"RelativeDatesFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filter.html#cfn-quicksight-analysis-filter-relativedatesfilter","Required":false,"Type":"RelativeDatesFilter","UpdateType":"Mutable"},"TimeEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filter.html#cfn-quicksight-analysis-filter-timeequalityfilter","Required":false,"Type":"TimeEqualityFilter","UpdateType":"Mutable"},"TimeRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filter.html#cfn-quicksight-analysis-filter-timerangefilter","Required":false,"Type":"TimeRangeFilter","UpdateType":"Mutable"},"TopBottomFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filter.html#cfn-quicksight-analysis-filter-topbottomfilter","Required":false,"Type":"TopBottomFilter","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtercontrol.html","Properties":{"DateTimePicker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtercontrol.html#cfn-quicksight-analysis-filtercontrol-datetimepicker","Required":false,"Type":"FilterDateTimePickerControl","UpdateType":"Mutable"},"Dropdown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtercontrol.html#cfn-quicksight-analysis-filtercontrol-dropdown","Required":false,"Type":"FilterDropDownControl","UpdateType":"Mutable"},"List":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtercontrol.html#cfn-quicksight-analysis-filtercontrol-list","Required":false,"Type":"FilterListControl","UpdateType":"Mutable"},"RelativeDateTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtercontrol.html#cfn-quicksight-analysis-filtercontrol-relativedatetime","Required":false,"Type":"FilterRelativeDateTimeControl","UpdateType":"Mutable"},"Slider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtercontrol.html#cfn-quicksight-analysis-filtercontrol-slider","Required":false,"Type":"FilterSliderControl","UpdateType":"Mutable"},"TextArea":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtercontrol.html#cfn-quicksight-analysis-filtercontrol-textarea","Required":false,"Type":"FilterTextAreaControl","UpdateType":"Mutable"},"TextField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtercontrol.html#cfn-quicksight-analysis-filtercontrol-textfield","Required":false,"Type":"FilterTextFieldControl","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterDateTimePickerControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdatetimepickercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdatetimepickercontrol.html#cfn-quicksight-analysis-filterdatetimepickercontrol-displayoptions","Required":false,"Type":"DateTimePickerControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdatetimepickercontrol.html#cfn-quicksight-analysis-filterdatetimepickercontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdatetimepickercontrol.html#cfn-quicksight-analysis-filterdatetimepickercontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdatetimepickercontrol.html#cfn-quicksight-analysis-filterdatetimepickercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdatetimepickercontrol.html#cfn-quicksight-analysis-filterdatetimepickercontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterDropDownControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdropdowncontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdropdowncontrol.html#cfn-quicksight-analysis-filterdropdowncontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdropdowncontrol.html#cfn-quicksight-analysis-filterdropdowncontrol-displayoptions","Required":false,"Type":"DropDownControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdropdowncontrol.html#cfn-quicksight-analysis-filterdropdowncontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdropdowncontrol.html#cfn-quicksight-analysis-filterdropdowncontrol-selectablevalues","Required":false,"Type":"FilterSelectableValues","UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdropdowncontrol.html#cfn-quicksight-analysis-filterdropdowncontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdropdowncontrol.html#cfn-quicksight-analysis-filterdropdowncontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterdropdowncontrol.html#cfn-quicksight-analysis-filterdropdowncontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtergroup.html","Properties":{"CrossDataset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtergroup.html#cfn-quicksight-analysis-filtergroup-crossdataset","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FilterGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtergroup.html#cfn-quicksight-analysis-filtergroup-filtergroupid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtergroup.html#cfn-quicksight-analysis-filtergroup-filters","DuplicatesAllowed":true,"ItemType":"Filter","Required":true,"Type":"List","UpdateType":"Mutable"},"ScopeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtergroup.html#cfn-quicksight-analysis-filtergroup-scopeconfiguration","Required":true,"Type":"FilterScopeConfiguration","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtergroup.html#cfn-quicksight-analysis-filtergroup-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistconfiguration.html","Properties":{"CategoryValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistconfiguration.html#cfn-quicksight-analysis-filterlistconfiguration-categoryvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistconfiguration.html#cfn-quicksight-analysis-filterlistconfiguration-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistconfiguration.html#cfn-quicksight-analysis-filterlistconfiguration-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterListControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistcontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistcontrol.html#cfn-quicksight-analysis-filterlistcontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistcontrol.html#cfn-quicksight-analysis-filterlistcontrol-displayoptions","Required":false,"Type":"ListControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistcontrol.html#cfn-quicksight-analysis-filterlistcontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistcontrol.html#cfn-quicksight-analysis-filterlistcontrol-selectablevalues","Required":false,"Type":"FilterSelectableValues","UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistcontrol.html#cfn-quicksight-analysis-filterlistcontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistcontrol.html#cfn-quicksight-analysis-filterlistcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterlistcontrol.html#cfn-quicksight-analysis-filterlistcontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterOperationSelectedFieldsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filteroperationselectedfieldsconfiguration.html","Properties":{"SelectedColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filteroperationselectedfieldsconfiguration.html#cfn-quicksight-analysis-filteroperationselectedfieldsconfiguration-selectedcolumns","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filteroperationselectedfieldsconfiguration.html#cfn-quicksight-analysis-filteroperationselectedfieldsconfiguration-selectedfieldoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectedFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filteroperationselectedfieldsconfiguration.html#cfn-quicksight-analysis-filteroperationselectedfieldsconfiguration-selectedfields","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterOperationTargetVisualsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filteroperationtargetvisualsconfiguration.html","Properties":{"SameSheetTargetVisualConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filteroperationtargetvisualsconfiguration.html#cfn-quicksight-analysis-filteroperationtargetvisualsconfiguration-samesheettargetvisualconfiguration","Required":false,"Type":"SameSheetTargetVisualConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterRelativeDateTimeControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterrelativedatetimecontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterrelativedatetimecontrol.html#cfn-quicksight-analysis-filterrelativedatetimecontrol-displayoptions","Required":false,"Type":"RelativeDateTimeControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterrelativedatetimecontrol.html#cfn-quicksight-analysis-filterrelativedatetimecontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterrelativedatetimecontrol.html#cfn-quicksight-analysis-filterrelativedatetimecontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterrelativedatetimecontrol.html#cfn-quicksight-analysis-filterrelativedatetimecontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterScopeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterscopeconfiguration.html","Properties":{"SelectedSheets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterscopeconfiguration.html#cfn-quicksight-analysis-filterscopeconfiguration-selectedsheets","Required":false,"Type":"SelectedSheetsFilterScopeConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterSelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterselectablevalues.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterselectablevalues.html#cfn-quicksight-analysis-filterselectablevalues-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterSliderControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterslidercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterslidercontrol.html#cfn-quicksight-analysis-filterslidercontrol-displayoptions","Required":false,"Type":"SliderControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterslidercontrol.html#cfn-quicksight-analysis-filterslidercontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MaximumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterslidercontrol.html#cfn-quicksight-analysis-filterslidercontrol-maximumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"MinimumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterslidercontrol.html#cfn-quicksight-analysis-filterslidercontrol-minimumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterslidercontrol.html#cfn-quicksight-analysis-filterslidercontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterslidercontrol.html#cfn-quicksight-analysis-filterslidercontrol-stepsize","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterslidercontrol.html#cfn-quicksight-analysis-filterslidercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filterslidercontrol.html#cfn-quicksight-analysis-filterslidercontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterTextAreaControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtertextareacontrol.html","Properties":{"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtertextareacontrol.html#cfn-quicksight-analysis-filtertextareacontrol-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtertextareacontrol.html#cfn-quicksight-analysis-filtertextareacontrol-displayoptions","Required":false,"Type":"TextAreaControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtertextareacontrol.html#cfn-quicksight-analysis-filtertextareacontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtertextareacontrol.html#cfn-quicksight-analysis-filtertextareacontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtertextareacontrol.html#cfn-quicksight-analysis-filtertextareacontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FilterTextFieldControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtertextfieldcontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtertextfieldcontrol.html#cfn-quicksight-analysis-filtertextfieldcontrol-displayoptions","Required":false,"Type":"TextFieldControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtertextfieldcontrol.html#cfn-quicksight-analysis-filtertextfieldcontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtertextfieldcontrol.html#cfn-quicksight-analysis-filtertextfieldcontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-filtertextfieldcontrol.html#cfn-quicksight-analysis-filtertextfieldcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fontconfiguration.html","Properties":{"FontColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fontconfiguration.html#cfn-quicksight-analysis-fontconfiguration-fontcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontDecoration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fontconfiguration.html#cfn-quicksight-analysis-fontconfiguration-fontdecoration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fontconfiguration.html#cfn-quicksight-analysis-fontconfiguration-fontsize","Required":false,"Type":"FontSize","UpdateType":"Mutable"},"FontStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fontconfiguration.html#cfn-quicksight-analysis-fontconfiguration-fontstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fontconfiguration.html#cfn-quicksight-analysis-fontconfiguration-fontweight","Required":false,"Type":"FontWeight","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FontSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fontsize.html","Properties":{"Relative":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fontsize.html#cfn-quicksight-analysis-fontsize-relative","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FontWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fontweight.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-fontweight.html#cfn-quicksight-analysis-fontweight-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ForecastComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html#cfn-quicksight-analysis-forecastcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CustomSeasonalityValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html#cfn-quicksight-analysis-forecastcomputation-customseasonalityvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"LowerBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html#cfn-quicksight-analysis-forecastcomputation-lowerboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html#cfn-quicksight-analysis-forecastcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PeriodsBackward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html#cfn-quicksight-analysis-forecastcomputation-periodsbackward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PeriodsForward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html#cfn-quicksight-analysis-forecastcomputation-periodsforward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PredictionInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html#cfn-quicksight-analysis-forecastcomputation-predictioninterval","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Seasonality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html#cfn-quicksight-analysis-forecastcomputation-seasonality","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html#cfn-quicksight-analysis-forecastcomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"UpperBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html#cfn-quicksight-analysis-forecastcomputation-upperboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastcomputation.html#cfn-quicksight-analysis-forecastcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ForecastConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastconfiguration.html","Properties":{"ForecastProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastconfiguration.html#cfn-quicksight-analysis-forecastconfiguration-forecastproperties","Required":false,"Type":"TimeBasedForecastProperties","UpdateType":"Mutable"},"Scenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastconfiguration.html#cfn-quicksight-analysis-forecastconfiguration-scenario","Required":false,"Type":"ForecastScenario","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ForecastScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastscenario.html","Properties":{"WhatIfPointScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastscenario.html#cfn-quicksight-analysis-forecastscenario-whatifpointscenario","Required":false,"Type":"WhatIfPointScenario","UpdateType":"Mutable"},"WhatIfRangeScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-forecastscenario.html#cfn-quicksight-analysis-forecastscenario-whatifrangescenario","Required":false,"Type":"WhatIfRangeScenario","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-formatconfiguration.html","Properties":{"DateTimeFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-formatconfiguration.html#cfn-quicksight-analysis-formatconfiguration-datetimeformatconfiguration","Required":false,"Type":"DateTimeFormatConfiguration","UpdateType":"Mutable"},"NumberFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-formatconfiguration.html#cfn-quicksight-analysis-formatconfiguration-numberformatconfiguration","Required":false,"Type":"NumberFormatConfiguration","UpdateType":"Mutable"},"StringFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-formatconfiguration.html#cfn-quicksight-analysis-formatconfiguration-stringformatconfiguration","Required":false,"Type":"StringFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FreeFormLayoutCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutcanvassizeoptions.html","Properties":{"ScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutcanvassizeoptions.html#cfn-quicksight-analysis-freeformlayoutcanvassizeoptions-screencanvassizeoptions","Required":false,"Type":"FreeFormLayoutScreenCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FreeFormLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutconfiguration.html#cfn-quicksight-analysis-freeformlayoutconfiguration-canvassizeoptions","Required":false,"Type":"FreeFormLayoutCanvasSizeOptions","UpdateType":"Mutable"},"Elements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutconfiguration.html#cfn-quicksight-analysis-freeformlayoutconfiguration-elements","DuplicatesAllowed":true,"ItemType":"FreeFormLayoutElement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FreeFormLayoutElement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html","Properties":{"BackgroundStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-backgroundstyle","Required":false,"Type":"FreeFormLayoutElementBackgroundStyle","UpdateType":"Mutable"},"BorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-borderstyle","Required":false,"Type":"FreeFormLayoutElementBorderStyle","UpdateType":"Mutable"},"ElementId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-elementid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ElementType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-elementtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-height","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LoadingAnimation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-loadinganimation","Required":false,"Type":"LoadingAnimation","UpdateType":"Mutable"},"RenderingRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-renderingrules","DuplicatesAllowed":true,"ItemType":"SheetElementRenderingRule","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedBorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-selectedborderstyle","Required":false,"Type":"FreeFormLayoutElementBorderStyle","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-width","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"XAxisLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-xaxislocation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"YAxisLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelement.html#cfn-quicksight-analysis-freeformlayoutelement-yaxislocation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FreeFormLayoutElementBackgroundStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelementbackgroundstyle.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelementbackgroundstyle.html#cfn-quicksight-analysis-freeformlayoutelementbackgroundstyle-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelementbackgroundstyle.html#cfn-quicksight-analysis-freeformlayoutelementbackgroundstyle-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FreeFormLayoutElementBorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelementborderstyle.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelementborderstyle.html#cfn-quicksight-analysis-freeformlayoutelementborderstyle-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutelementborderstyle.html#cfn-quicksight-analysis-freeformlayoutelementborderstyle-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FreeFormLayoutScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutscreencanvassizeoptions.html","Properties":{"OptimizedViewPortWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformlayoutscreencanvassizeoptions.html#cfn-quicksight-analysis-freeformlayoutscreencanvassizeoptions-optimizedviewportwidth","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FreeFormSectionLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformsectionlayoutconfiguration.html","Properties":{"Elements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-freeformsectionlayoutconfiguration.html#cfn-quicksight-analysis-freeformsectionlayoutconfiguration-elements","DuplicatesAllowed":true,"ItemType":"FreeFormLayoutElement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FunnelChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartaggregatedfieldwells.html#cfn-quicksight-analysis-funnelchartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartaggregatedfieldwells.html#cfn-quicksight-analysis-funnelchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FunnelChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartconfiguration.html","Properties":{"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartconfiguration.html#cfn-quicksight-analysis-funnelchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"DataLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartconfiguration.html#cfn-quicksight-analysis-funnelchartconfiguration-datalabeloptions","Required":false,"Type":"FunnelChartDataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartconfiguration.html#cfn-quicksight-analysis-funnelchartconfiguration-fieldwells","Required":false,"Type":"FunnelChartFieldWells","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartconfiguration.html#cfn-quicksight-analysis-funnelchartconfiguration-sortconfiguration","Required":false,"Type":"FunnelChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartconfiguration.html#cfn-quicksight-analysis-funnelchartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"ValueLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartconfiguration.html#cfn-quicksight-analysis-funnelchartconfiguration-valuelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartconfiguration.html#cfn-quicksight-analysis-funnelchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FunnelChartDataLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartdatalabeloptions.html","Properties":{"CategoryLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartdatalabeloptions.html#cfn-quicksight-analysis-funnelchartdatalabeloptions-categorylabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartdatalabeloptions.html#cfn-quicksight-analysis-funnelchartdatalabeloptions-labelcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartdatalabeloptions.html#cfn-quicksight-analysis-funnelchartdatalabeloptions-labelfontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"MeasureDataLabelStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartdatalabeloptions.html#cfn-quicksight-analysis-funnelchartdatalabeloptions-measuredatalabelstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MeasureLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartdatalabeloptions.html#cfn-quicksight-analysis-funnelchartdatalabeloptions-measurelabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartdatalabeloptions.html#cfn-quicksight-analysis-funnelchartdatalabeloptions-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartdatalabeloptions.html#cfn-quicksight-analysis-funnelchartdatalabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FunnelChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartfieldwells.html","Properties":{"FunnelChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartfieldwells.html#cfn-quicksight-analysis-funnelchartfieldwells-funnelchartaggregatedfieldwells","Required":false,"Type":"FunnelChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FunnelChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartsortconfiguration.html#cfn-quicksight-analysis-funnelchartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartsortconfiguration.html#cfn-quicksight-analysis-funnelchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.FunnelChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartvisual.html#cfn-quicksight-analysis-funnelchartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartvisual.html#cfn-quicksight-analysis-funnelchartvisual-chartconfiguration","Required":false,"Type":"FunnelChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartvisual.html#cfn-quicksight-analysis-funnelchartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartvisual.html#cfn-quicksight-analysis-funnelchartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartvisual.html#cfn-quicksight-analysis-funnelchartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-funnelchartvisual.html#cfn-quicksight-analysis-funnelchartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GaugeChartArcConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartarcconditionalformatting.html","Properties":{"ForegroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartarcconditionalformatting.html#cfn-quicksight-analysis-gaugechartarcconditionalformatting-foregroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GaugeChartConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartconditionalformatting.html#cfn-quicksight-analysis-gaugechartconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"GaugeChartConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GaugeChartConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartconditionalformattingoption.html","Properties":{"Arc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartconditionalformattingoption.html#cfn-quicksight-analysis-gaugechartconditionalformattingoption-arc","Required":false,"Type":"GaugeChartArcConditionalFormatting","UpdateType":"Mutable"},"PrimaryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartconditionalformattingoption.html#cfn-quicksight-analysis-gaugechartconditionalformattingoption-primaryvalue","Required":false,"Type":"GaugeChartPrimaryValueConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GaugeChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartconfiguration.html","Properties":{"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartconfiguration.html#cfn-quicksight-analysis-gaugechartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartconfiguration.html#cfn-quicksight-analysis-gaugechartconfiguration-fieldwells","Required":false,"Type":"GaugeChartFieldWells","UpdateType":"Mutable"},"GaugeChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartconfiguration.html#cfn-quicksight-analysis-gaugechartconfiguration-gaugechartoptions","Required":false,"Type":"GaugeChartOptions","UpdateType":"Mutable"},"TooltipOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartconfiguration.html#cfn-quicksight-analysis-gaugechartconfiguration-tooltipoptions","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartconfiguration.html#cfn-quicksight-analysis-gaugechartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GaugeChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartfieldwells.html","Properties":{"TargetValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartfieldwells.html#cfn-quicksight-analysis-gaugechartfieldwells-targetvalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartfieldwells.html#cfn-quicksight-analysis-gaugechartfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GaugeChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartoptions.html","Properties":{"Arc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartoptions.html#cfn-quicksight-analysis-gaugechartoptions-arc","Required":false,"Type":"ArcConfiguration","UpdateType":"Mutable"},"ArcAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartoptions.html#cfn-quicksight-analysis-gaugechartoptions-arcaxis","Required":false,"Type":"ArcAxisConfiguration","UpdateType":"Mutable"},"Comparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartoptions.html#cfn-quicksight-analysis-gaugechartoptions-comparison","Required":false,"Type":"ComparisonConfiguration","UpdateType":"Mutable"},"PrimaryValueDisplayType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartoptions.html#cfn-quicksight-analysis-gaugechartoptions-primaryvaluedisplaytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrimaryValueFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartoptions.html#cfn-quicksight-analysis-gaugechartoptions-primaryvaluefontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GaugeChartPrimaryValueConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartprimaryvalueconditionalformatting.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartprimaryvalueconditionalformatting.html#cfn-quicksight-analysis-gaugechartprimaryvalueconditionalformatting-icon","Required":false,"Type":"ConditionalFormattingIcon","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartprimaryvalueconditionalformatting.html#cfn-quicksight-analysis-gaugechartprimaryvalueconditionalformatting-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GaugeChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartvisual.html#cfn-quicksight-analysis-gaugechartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartvisual.html#cfn-quicksight-analysis-gaugechartvisual-chartconfiguration","Required":false,"Type":"GaugeChartConfiguration","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartvisual.html#cfn-quicksight-analysis-gaugechartvisual-conditionalformatting","Required":false,"Type":"GaugeChartConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartvisual.html#cfn-quicksight-analysis-gaugechartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartvisual.html#cfn-quicksight-analysis-gaugechartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gaugechartvisual.html#cfn-quicksight-analysis-gaugechartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GeospatialCoordinateBounds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialcoordinatebounds.html","Properties":{"East":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialcoordinatebounds.html#cfn-quicksight-analysis-geospatialcoordinatebounds-east","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"North":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialcoordinatebounds.html#cfn-quicksight-analysis-geospatialcoordinatebounds-north","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"South":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialcoordinatebounds.html#cfn-quicksight-analysis-geospatialcoordinatebounds-south","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"West":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialcoordinatebounds.html#cfn-quicksight-analysis-geospatialcoordinatebounds-west","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GeospatialHeatmapColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialheatmapcolorscale.html","Properties":{"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialheatmapcolorscale.html#cfn-quicksight-analysis-geospatialheatmapcolorscale-colors","DuplicatesAllowed":true,"ItemType":"GeospatialHeatmapDataColor","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GeospatialHeatmapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialheatmapconfiguration.html","Properties":{"HeatmapColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialheatmapconfiguration.html#cfn-quicksight-analysis-geospatialheatmapconfiguration-heatmapcolor","Required":false,"Type":"GeospatialHeatmapColorScale","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GeospatialHeatmapDataColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialheatmapdatacolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialheatmapdatacolor.html#cfn-quicksight-analysis-geospatialheatmapdatacolor-color","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GeospatialMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapaggregatedfieldwells.html","Properties":{"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapaggregatedfieldwells.html#cfn-quicksight-analysis-geospatialmapaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Geospatial":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapaggregatedfieldwells.html#cfn-quicksight-analysis-geospatialmapaggregatedfieldwells-geospatial","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapaggregatedfieldwells.html#cfn-quicksight-analysis-geospatialmapaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GeospatialMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapconfiguration.html","Properties":{"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapconfiguration.html#cfn-quicksight-analysis-geospatialmapconfiguration-fieldwells","Required":false,"Type":"GeospatialMapFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapconfiguration.html#cfn-quicksight-analysis-geospatialmapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"MapStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapconfiguration.html#cfn-quicksight-analysis-geospatialmapconfiguration-mapstyleoptions","Required":false,"Type":"GeospatialMapStyleOptions","UpdateType":"Mutable"},"PointStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapconfiguration.html#cfn-quicksight-analysis-geospatialmapconfiguration-pointstyleoptions","Required":false,"Type":"GeospatialPointStyleOptions","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapconfiguration.html#cfn-quicksight-analysis-geospatialmapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapconfiguration.html#cfn-quicksight-analysis-geospatialmapconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"WindowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapconfiguration.html#cfn-quicksight-analysis-geospatialmapconfiguration-windowoptions","Required":false,"Type":"GeospatialWindowOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GeospatialMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapfieldwells.html","Properties":{"GeospatialMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapfieldwells.html#cfn-quicksight-analysis-geospatialmapfieldwells-geospatialmapaggregatedfieldwells","Required":false,"Type":"GeospatialMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GeospatialMapStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapstyleoptions.html","Properties":{"BaseMapStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapstyleoptions.html#cfn-quicksight-analysis-geospatialmapstyleoptions-basemapstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GeospatialMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapvisual.html#cfn-quicksight-analysis-geospatialmapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapvisual.html#cfn-quicksight-analysis-geospatialmapvisual-chartconfiguration","Required":false,"Type":"GeospatialMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapvisual.html#cfn-quicksight-analysis-geospatialmapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapvisual.html#cfn-quicksight-analysis-geospatialmapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapvisual.html#cfn-quicksight-analysis-geospatialmapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialmapvisual.html#cfn-quicksight-analysis-geospatialmapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GeospatialPointStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialpointstyleoptions.html","Properties":{"ClusterMarkerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialpointstyleoptions.html#cfn-quicksight-analysis-geospatialpointstyleoptions-clustermarkerconfiguration","Required":false,"Type":"ClusterMarkerConfiguration","UpdateType":"Mutable"},"HeatmapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialpointstyleoptions.html#cfn-quicksight-analysis-geospatialpointstyleoptions-heatmapconfiguration","Required":false,"Type":"GeospatialHeatmapConfiguration","UpdateType":"Mutable"},"SelectedPointStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialpointstyleoptions.html#cfn-quicksight-analysis-geospatialpointstyleoptions-selectedpointstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GeospatialWindowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialwindowoptions.html","Properties":{"Bounds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialwindowoptions.html#cfn-quicksight-analysis-geospatialwindowoptions-bounds","Required":false,"Type":"GeospatialCoordinateBounds","UpdateType":"Mutable"},"MapZoomMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-geospatialwindowoptions.html#cfn-quicksight-analysis-geospatialwindowoptions-mapzoommode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GlobalTableBorderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-globaltableborderoptions.html","Properties":{"SideSpecificBorder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-globaltableborderoptions.html#cfn-quicksight-analysis-globaltableborderoptions-sidespecificborder","Required":false,"Type":"TableSideBorderOptions","UpdateType":"Mutable"},"UniformBorder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-globaltableborderoptions.html#cfn-quicksight-analysis-globaltableborderoptions-uniformborder","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GradientColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gradientcolor.html","Properties":{"Stops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gradientcolor.html#cfn-quicksight-analysis-gradientcolor-stops","DuplicatesAllowed":true,"ItemType":"GradientStop","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GradientStop":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gradientstop.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gradientstop.html#cfn-quicksight-analysis-gradientstop-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gradientstop.html#cfn-quicksight-analysis-gradientstop-datavalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"GradientOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gradientstop.html#cfn-quicksight-analysis-gradientstop-gradientoffset","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GridLayoutCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutcanvassizeoptions.html","Properties":{"ScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutcanvassizeoptions.html#cfn-quicksight-analysis-gridlayoutcanvassizeoptions-screencanvassizeoptions","Required":false,"Type":"GridLayoutScreenCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GridLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutconfiguration.html#cfn-quicksight-analysis-gridlayoutconfiguration-canvassizeoptions","Required":false,"Type":"GridLayoutCanvasSizeOptions","UpdateType":"Mutable"},"Elements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutconfiguration.html#cfn-quicksight-analysis-gridlayoutconfiguration-elements","DuplicatesAllowed":true,"ItemType":"GridLayoutElement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GridLayoutElement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutelement.html","Properties":{"ColumnIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutelement.html#cfn-quicksight-analysis-gridlayoutelement-columnindex","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ColumnSpan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutelement.html#cfn-quicksight-analysis-gridlayoutelement-columnspan","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"ElementId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutelement.html#cfn-quicksight-analysis-gridlayoutelement-elementid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ElementType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutelement.html#cfn-quicksight-analysis-gridlayoutelement-elementtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RowIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutelement.html#cfn-quicksight-analysis-gridlayoutelement-rowindex","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"RowSpan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutelement.html#cfn-quicksight-analysis-gridlayoutelement-rowspan","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GridLayoutScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutscreencanvassizeoptions.html","Properties":{"OptimizedViewPortWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutscreencanvassizeoptions.html#cfn-quicksight-analysis-gridlayoutscreencanvassizeoptions-optimizedviewportwidth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResizeOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-gridlayoutscreencanvassizeoptions.html#cfn-quicksight-analysis-gridlayoutscreencanvassizeoptions-resizeoption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.GrowthRateComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-growthratecomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-growthratecomputation.html#cfn-quicksight-analysis-growthratecomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-growthratecomputation.html#cfn-quicksight-analysis-growthratecomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PeriodSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-growthratecomputation.html#cfn-quicksight-analysis-growthratecomputation-periodsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-growthratecomputation.html#cfn-quicksight-analysis-growthratecomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-growthratecomputation.html#cfn-quicksight-analysis-growthratecomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.HeaderFooterSectionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-headerfootersectionconfiguration.html","Properties":{"Layout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-headerfootersectionconfiguration.html#cfn-quicksight-analysis-headerfootersectionconfiguration-layout","Required":true,"Type":"SectionLayoutConfiguration","UpdateType":"Mutable"},"SectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-headerfootersectionconfiguration.html#cfn-quicksight-analysis-headerfootersectionconfiguration-sectionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Style":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-headerfootersectionconfiguration.html#cfn-quicksight-analysis-headerfootersectionconfiguration-style","Required":false,"Type":"SectionStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.HeatMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapaggregatedfieldwells.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapaggregatedfieldwells.html#cfn-quicksight-analysis-heatmapaggregatedfieldwells-columns","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Rows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapaggregatedfieldwells.html#cfn-quicksight-analysis-heatmapaggregatedfieldwells-rows","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapaggregatedfieldwells.html#cfn-quicksight-analysis-heatmapaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.HeatMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapconfiguration.html","Properties":{"ColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapconfiguration.html#cfn-quicksight-analysis-heatmapconfiguration-colorscale","Required":false,"Type":"ColorScale","UpdateType":"Mutable"},"ColumnLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapconfiguration.html#cfn-quicksight-analysis-heatmapconfiguration-columnlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapconfiguration.html#cfn-quicksight-analysis-heatmapconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapconfiguration.html#cfn-quicksight-analysis-heatmapconfiguration-fieldwells","Required":false,"Type":"HeatMapFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapconfiguration.html#cfn-quicksight-analysis-heatmapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"RowLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapconfiguration.html#cfn-quicksight-analysis-heatmapconfiguration-rowlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapconfiguration.html#cfn-quicksight-analysis-heatmapconfiguration-sortconfiguration","Required":false,"Type":"HeatMapSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapconfiguration.html#cfn-quicksight-analysis-heatmapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.HeatMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapfieldwells.html","Properties":{"HeatMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapfieldwells.html#cfn-quicksight-analysis-heatmapfieldwells-heatmapaggregatedfieldwells","Required":false,"Type":"HeatMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.HeatMapSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapsortconfiguration.html","Properties":{"HeatMapColumnItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapsortconfiguration.html#cfn-quicksight-analysis-heatmapsortconfiguration-heatmapcolumnitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"HeatMapColumnSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapsortconfiguration.html#cfn-quicksight-analysis-heatmapsortconfiguration-heatmapcolumnsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"HeatMapRowItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapsortconfiguration.html#cfn-quicksight-analysis-heatmapsortconfiguration-heatmaprowitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"HeatMapRowSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapsortconfiguration.html#cfn-quicksight-analysis-heatmapsortconfiguration-heatmaprowsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.HeatMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapvisual.html#cfn-quicksight-analysis-heatmapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapvisual.html#cfn-quicksight-analysis-heatmapvisual-chartconfiguration","Required":false,"Type":"HeatMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapvisual.html#cfn-quicksight-analysis-heatmapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapvisual.html#cfn-quicksight-analysis-heatmapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapvisual.html#cfn-quicksight-analysis-heatmapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-heatmapvisual.html#cfn-quicksight-analysis-heatmapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.HistogramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramaggregatedfieldwells.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramaggregatedfieldwells.html#cfn-quicksight-analysis-histogramaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.HistogramBinOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogrambinoptions.html","Properties":{"BinCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogrambinoptions.html#cfn-quicksight-analysis-histogrambinoptions-bincount","Required":false,"Type":"BinCountOptions","UpdateType":"Mutable"},"BinWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogrambinoptions.html#cfn-quicksight-analysis-histogrambinoptions-binwidth","Required":false,"Type":"BinWidthOptions","UpdateType":"Mutable"},"SelectedBinType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogrambinoptions.html#cfn-quicksight-analysis-histogrambinoptions-selectedbintype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogrambinoptions.html#cfn-quicksight-analysis-histogrambinoptions-startvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.HistogramConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramconfiguration.html","Properties":{"BinOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramconfiguration.html#cfn-quicksight-analysis-histogramconfiguration-binoptions","Required":false,"Type":"HistogramBinOptions","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramconfiguration.html#cfn-quicksight-analysis-histogramconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramconfiguration.html#cfn-quicksight-analysis-histogramconfiguration-fieldwells","Required":false,"Type":"HistogramFieldWells","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramconfiguration.html#cfn-quicksight-analysis-histogramconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramconfiguration.html#cfn-quicksight-analysis-histogramconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"XAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramconfiguration.html#cfn-quicksight-analysis-histogramconfiguration-xaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"XAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramconfiguration.html#cfn-quicksight-analysis-histogramconfiguration-xaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"YAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramconfiguration.html#cfn-quicksight-analysis-histogramconfiguration-yaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.HistogramFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramfieldwells.html","Properties":{"HistogramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramfieldwells.html#cfn-quicksight-analysis-histogramfieldwells-histogramaggregatedfieldwells","Required":false,"Type":"HistogramAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.HistogramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramvisual.html#cfn-quicksight-analysis-histogramvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramvisual.html#cfn-quicksight-analysis-histogramvisual-chartconfiguration","Required":false,"Type":"HistogramConfiguration","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramvisual.html#cfn-quicksight-analysis-histogramvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramvisual.html#cfn-quicksight-analysis-histogramvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-histogramvisual.html#cfn-quicksight-analysis-histogramvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.InsightConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-insightconfiguration.html","Properties":{"Computations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-insightconfiguration.html#cfn-quicksight-analysis-insightconfiguration-computations","DuplicatesAllowed":true,"ItemType":"Computation","Required":false,"Type":"List","UpdateType":"Mutable"},"CustomNarrative":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-insightconfiguration.html#cfn-quicksight-analysis-insightconfiguration-customnarrative","Required":false,"Type":"CustomNarrativeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.InsightVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-insightvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-insightvisual.html#cfn-quicksight-analysis-insightvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-insightvisual.html#cfn-quicksight-analysis-insightvisual-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InsightConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-insightvisual.html#cfn-quicksight-analysis-insightvisual-insightconfiguration","Required":false,"Type":"InsightConfiguration","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-insightvisual.html#cfn-quicksight-analysis-insightvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-insightvisual.html#cfn-quicksight-analysis-insightvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-insightvisual.html#cfn-quicksight-analysis-insightvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.IntegerDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerdefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerdefaultvalues.html#cfn-quicksight-analysis-integerdefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerdefaultvalues.html#cfn-quicksight-analysis-integerdefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.IntegerParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerparameter.html#cfn-quicksight-analysis-integerparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerparameter.html#cfn-quicksight-analysis-integerparameter-values","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.IntegerParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerparameterdeclaration.html#cfn-quicksight-analysis-integerparameterdeclaration-defaultvalues","Required":false,"Type":"IntegerDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerparameterdeclaration.html#cfn-quicksight-analysis-integerparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerparameterdeclaration.html#cfn-quicksight-analysis-integerparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerparameterdeclaration.html#cfn-quicksight-analysis-integerparameterdeclaration-parametervaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integerparameterdeclaration.html#cfn-quicksight-analysis-integerparameterdeclaration-valuewhenunset","Required":false,"Type":"IntegerValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.IntegerValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integervaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integervaluewhenunsetconfiguration.html#cfn-quicksight-analysis-integervaluewhenunsetconfiguration-customvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-integervaluewhenunsetconfiguration.html#cfn-quicksight-analysis-integervaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-itemslimitconfiguration.html","Properties":{"ItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-itemslimitconfiguration.html#cfn-quicksight-analysis-itemslimitconfiguration-itemslimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"OtherCategories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-itemslimitconfiguration.html#cfn-quicksight-analysis-itemslimitconfiguration-othercategories","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.KPIConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiconditionalformatting.html#cfn-quicksight-analysis-kpiconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"KPIConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.KPIConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiconditionalformattingoption.html","Properties":{"PrimaryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiconditionalformattingoption.html#cfn-quicksight-analysis-kpiconditionalformattingoption-primaryvalue","Required":false,"Type":"KPIPrimaryValueConditionalFormatting","UpdateType":"Mutable"},"ProgressBar":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiconditionalformattingoption.html#cfn-quicksight-analysis-kpiconditionalformattingoption-progressbar","Required":false,"Type":"KPIProgressBarConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.KPIConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiconfiguration.html","Properties":{"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiconfiguration.html#cfn-quicksight-analysis-kpiconfiguration-fieldwells","Required":false,"Type":"KPIFieldWells","UpdateType":"Mutable"},"KPIOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiconfiguration.html#cfn-quicksight-analysis-kpiconfiguration-kpioptions","Required":false,"Type":"KPIOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiconfiguration.html#cfn-quicksight-analysis-kpiconfiguration-sortconfiguration","Required":false,"Type":"KPISortConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.KPIFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpifieldwells.html","Properties":{"TargetValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpifieldwells.html#cfn-quicksight-analysis-kpifieldwells-targetvalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"TrendGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpifieldwells.html#cfn-quicksight-analysis-kpifieldwells-trendgroups","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpifieldwells.html#cfn-quicksight-analysis-kpifieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.KPIOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpioptions.html","Properties":{"Comparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpioptions.html#cfn-quicksight-analysis-kpioptions-comparison","Required":false,"Type":"ComparisonConfiguration","UpdateType":"Mutable"},"PrimaryValueDisplayType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpioptions.html#cfn-quicksight-analysis-kpioptions-primaryvaluedisplaytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrimaryValueFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpioptions.html#cfn-quicksight-analysis-kpioptions-primaryvaluefontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"ProgressBar":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpioptions.html#cfn-quicksight-analysis-kpioptions-progressbar","Required":false,"Type":"ProgressBarOptions","UpdateType":"Mutable"},"SecondaryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpioptions.html#cfn-quicksight-analysis-kpioptions-secondaryvalue","Required":false,"Type":"SecondaryValueOptions","UpdateType":"Mutable"},"SecondaryValueFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpioptions.html#cfn-quicksight-analysis-kpioptions-secondaryvaluefontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"TrendArrows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpioptions.html#cfn-quicksight-analysis-kpioptions-trendarrows","Required":false,"Type":"TrendArrowOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.KPIPrimaryValueConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiprimaryvalueconditionalformatting.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiprimaryvalueconditionalformatting.html#cfn-quicksight-analysis-kpiprimaryvalueconditionalformatting-icon","Required":false,"Type":"ConditionalFormattingIcon","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiprimaryvalueconditionalformatting.html#cfn-quicksight-analysis-kpiprimaryvalueconditionalformatting-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.KPIProgressBarConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiprogressbarconditionalformatting.html","Properties":{"ForegroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpiprogressbarconditionalformatting.html#cfn-quicksight-analysis-kpiprogressbarconditionalformatting-foregroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.KPISortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpisortconfiguration.html","Properties":{"TrendGroupSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpisortconfiguration.html#cfn-quicksight-analysis-kpisortconfiguration-trendgroupsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.KPIVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpivisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpivisual.html#cfn-quicksight-analysis-kpivisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpivisual.html#cfn-quicksight-analysis-kpivisual-chartconfiguration","Required":false,"Type":"KPIConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpivisual.html#cfn-quicksight-analysis-kpivisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpivisual.html#cfn-quicksight-analysis-kpivisual-conditionalformatting","Required":false,"Type":"KPIConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpivisual.html#cfn-quicksight-analysis-kpivisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpivisual.html#cfn-quicksight-analysis-kpivisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-kpivisual.html#cfn-quicksight-analysis-kpivisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-labeloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-labeloptions.html#cfn-quicksight-analysis-labeloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-labeloptions.html#cfn-quicksight-analysis-labeloptions-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-labeloptions.html#cfn-quicksight-analysis-labeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.Layout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-layout.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-layout.html#cfn-quicksight-analysis-layout-configuration","Required":true,"Type":"LayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-layoutconfiguration.html","Properties":{"FreeFormLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-layoutconfiguration.html#cfn-quicksight-analysis-layoutconfiguration-freeformlayout","Required":false,"Type":"FreeFormLayoutConfiguration","UpdateType":"Mutable"},"GridLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-layoutconfiguration.html#cfn-quicksight-analysis-layoutconfiguration-gridlayout","Required":false,"Type":"GridLayoutConfiguration","UpdateType":"Mutable"},"SectionBasedLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-layoutconfiguration.html#cfn-quicksight-analysis-layoutconfiguration-sectionbasedlayout","Required":false,"Type":"SectionBasedLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LegendOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-legendoptions.html","Properties":{"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-legendoptions.html#cfn-quicksight-analysis-legendoptions-height","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-legendoptions.html#cfn-quicksight-analysis-legendoptions-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-legendoptions.html#cfn-quicksight-analysis-legendoptions-title","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-legendoptions.html#cfn-quicksight-analysis-legendoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-legendoptions.html#cfn-quicksight-analysis-legendoptions-width","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LineChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartaggregatedfieldwells.html#cfn-quicksight-analysis-linechartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartaggregatedfieldwells.html#cfn-quicksight-analysis-linechartaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartaggregatedfieldwells.html#cfn-quicksight-analysis-linechartaggregatedfieldwells-smallmultiples","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartaggregatedfieldwells.html#cfn-quicksight-analysis-linechartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LineChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html","Properties":{"ContributionAnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-contributionanalysisdefaults","DuplicatesAllowed":true,"ItemType":"ContributionAnalysisDefault","Required":false,"Type":"List","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"DefaultSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-defaultseriessettings","Required":false,"Type":"LineChartDefaultSeriesSettings","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-fieldwells","Required":false,"Type":"LineChartFieldWells","UpdateType":"Mutable"},"ForecastConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-forecastconfigurations","DuplicatesAllowed":true,"ItemType":"ForecastConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"LineSeriesAxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SecondaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-secondaryyaxisdisplayoptions","Required":false,"Type":"LineSeriesAxisDisplayOptions","UpdateType":"Mutable"},"SecondaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-secondaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"Series":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-series","DuplicatesAllowed":true,"ItemType":"SeriesItem","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-smallmultiplesoptions","Required":false,"Type":"SmallMultiplesOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-sortconfiguration","Required":false,"Type":"LineChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"XAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-xaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"XAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartconfiguration.html#cfn-quicksight-analysis-linechartconfiguration-xaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LineChartDefaultSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartdefaultseriessettings.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartdefaultseriessettings.html#cfn-quicksight-analysis-linechartdefaultseriessettings-axisbinding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartdefaultseriessettings.html#cfn-quicksight-analysis-linechartdefaultseriessettings-linestylesettings","Required":false,"Type":"LineChartLineStyleSettings","UpdateType":"Mutable"},"MarkerStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartdefaultseriessettings.html#cfn-quicksight-analysis-linechartdefaultseriessettings-markerstylesettings","Required":false,"Type":"LineChartMarkerStyleSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LineChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartfieldwells.html","Properties":{"LineChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartfieldwells.html#cfn-quicksight-analysis-linechartfieldwells-linechartaggregatedfieldwells","Required":false,"Type":"LineChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LineChartLineStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartlinestylesettings.html","Properties":{"LineInterpolation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartlinestylesettings.html#cfn-quicksight-analysis-linechartlinestylesettings-lineinterpolation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartlinestylesettings.html#cfn-quicksight-analysis-linechartlinestylesettings-linestyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartlinestylesettings.html#cfn-quicksight-analysis-linechartlinestylesettings-linevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartlinestylesettings.html#cfn-quicksight-analysis-linechartlinestylesettings-linewidth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LineChartMarkerStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartmarkerstylesettings.html","Properties":{"MarkerColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartmarkerstylesettings.html#cfn-quicksight-analysis-linechartmarkerstylesettings-markercolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MarkerShape":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartmarkerstylesettings.html#cfn-quicksight-analysis-linechartmarkerstylesettings-markershape","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MarkerSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartmarkerstylesettings.html#cfn-quicksight-analysis-linechartmarkerstylesettings-markersize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MarkerVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartmarkerstylesettings.html#cfn-quicksight-analysis-linechartmarkerstylesettings-markervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LineChartSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartseriessettings.html","Properties":{"LineStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartseriessettings.html#cfn-quicksight-analysis-linechartseriessettings-linestylesettings","Required":false,"Type":"LineChartLineStyleSettings","UpdateType":"Mutable"},"MarkerStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartseriessettings.html#cfn-quicksight-analysis-linechartseriessettings-markerstylesettings","Required":false,"Type":"LineChartMarkerStyleSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LineChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartsortconfiguration.html","Properties":{"CategoryItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartsortconfiguration.html#cfn-quicksight-analysis-linechartsortconfiguration-categoryitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartsortconfiguration.html#cfn-quicksight-analysis-linechartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartsortconfiguration.html#cfn-quicksight-analysis-linechartsortconfiguration-coloritemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartsortconfiguration.html#cfn-quicksight-analysis-linechartsortconfiguration-smallmultipleslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartsortconfiguration.html#cfn-quicksight-analysis-linechartsortconfiguration-smallmultiplessort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LineChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartvisual.html#cfn-quicksight-analysis-linechartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartvisual.html#cfn-quicksight-analysis-linechartvisual-chartconfiguration","Required":false,"Type":"LineChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartvisual.html#cfn-quicksight-analysis-linechartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartvisual.html#cfn-quicksight-analysis-linechartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartvisual.html#cfn-quicksight-analysis-linechartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-linechartvisual.html#cfn-quicksight-analysis-linechartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LineSeriesAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-lineseriesaxisdisplayoptions.html","Properties":{"AxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-lineseriesaxisdisplayoptions.html#cfn-quicksight-analysis-lineseriesaxisdisplayoptions-axisoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"MissingDataConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-lineseriesaxisdisplayoptions.html#cfn-quicksight-analysis-lineseriesaxisdisplayoptions-missingdataconfigurations","DuplicatesAllowed":true,"ItemType":"MissingDataConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ListControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-listcontroldisplayoptions.html","Properties":{"SearchOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-listcontroldisplayoptions.html#cfn-quicksight-analysis-listcontroldisplayoptions-searchoptions","Required":false,"Type":"ListControlSearchOptions","UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-listcontroldisplayoptions.html#cfn-quicksight-analysis-listcontroldisplayoptions-selectalloptions","Required":false,"Type":"ListControlSelectAllOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-listcontroldisplayoptions.html#cfn-quicksight-analysis-listcontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ListControlSearchOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-listcontrolsearchoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-listcontrolsearchoptions.html#cfn-quicksight-analysis-listcontrolsearchoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ListControlSelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-listcontrolselectalloptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-listcontrolselectalloptions.html#cfn-quicksight-analysis-listcontrolselectalloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LoadingAnimation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-loadinganimation.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-loadinganimation.html#cfn-quicksight-analysis-loadinganimation-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LocalNavigationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-localnavigationconfiguration.html","Properties":{"TargetSheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-localnavigationconfiguration.html#cfn-quicksight-analysis-localnavigationconfiguration-targetsheetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.LongFormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-longformattext.html","Properties":{"PlainText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-longformattext.html#cfn-quicksight-analysis-longformattext-plaintext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RichText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-longformattext.html#cfn-quicksight-analysis-longformattext-richtext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.MappedDataSetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-mappeddatasetparameter.html","Properties":{"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-mappeddatasetparameter.html#cfn-quicksight-analysis-mappeddatasetparameter-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-mappeddatasetparameter.html#cfn-quicksight-analysis-mappeddatasetparameter-datasetparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.MaximumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-maximumlabeltype.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-maximumlabeltype.html#cfn-quicksight-analysis-maximumlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.MaximumMinimumComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-maximumminimumcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-maximumminimumcomputation.html#cfn-quicksight-analysis-maximumminimumcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-maximumminimumcomputation.html#cfn-quicksight-analysis-maximumminimumcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-maximumminimumcomputation.html#cfn-quicksight-analysis-maximumminimumcomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-maximumminimumcomputation.html#cfn-quicksight-analysis-maximumminimumcomputation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-maximumminimumcomputation.html#cfn-quicksight-analysis-maximumminimumcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.MeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-measurefield.html","Properties":{"CalculatedMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-measurefield.html#cfn-quicksight-analysis-measurefield-calculatedmeasurefield","Required":false,"Type":"CalculatedMeasureField","UpdateType":"Mutable"},"CategoricalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-measurefield.html#cfn-quicksight-analysis-measurefield-categoricalmeasurefield","Required":false,"Type":"CategoricalMeasureField","UpdateType":"Mutable"},"DateMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-measurefield.html#cfn-quicksight-analysis-measurefield-datemeasurefield","Required":false,"Type":"DateMeasureField","UpdateType":"Mutable"},"NumericalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-measurefield.html#cfn-quicksight-analysis-measurefield-numericalmeasurefield","Required":false,"Type":"NumericalMeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.MetricComparisonComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-metriccomparisoncomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-metriccomparisoncomputation.html#cfn-quicksight-analysis-metriccomparisoncomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FromValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-metriccomparisoncomputation.html#cfn-quicksight-analysis-metriccomparisoncomputation-fromvalue","Required":true,"Type":"MeasureField","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-metriccomparisoncomputation.html#cfn-quicksight-analysis-metriccomparisoncomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-metriccomparisoncomputation.html#cfn-quicksight-analysis-metriccomparisoncomputation-targetvalue","Required":true,"Type":"MeasureField","UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-metriccomparisoncomputation.html#cfn-quicksight-analysis-metriccomparisoncomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.MinimumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-minimumlabeltype.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-minimumlabeltype.html#cfn-quicksight-analysis-minimumlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.MissingDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-missingdataconfiguration.html","Properties":{"TreatmentOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-missingdataconfiguration.html#cfn-quicksight-analysis-missingdataconfiguration-treatmentoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-negativevalueconfiguration.html","Properties":{"DisplayMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-negativevalueconfiguration.html#cfn-quicksight-analysis-negativevalueconfiguration-displaymode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-nullvalueformatconfiguration.html","Properties":{"NullString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-nullvalueformatconfiguration.html#cfn-quicksight-analysis-nullvalueformatconfiguration-nullstring","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumberDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numberdisplayformatconfiguration.html","Properties":{"DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numberdisplayformatconfiguration.html#cfn-quicksight-analysis-numberdisplayformatconfiguration-decimalplacesconfiguration","Required":false,"Type":"DecimalPlacesConfiguration","UpdateType":"Mutable"},"NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numberdisplayformatconfiguration.html#cfn-quicksight-analysis-numberdisplayformatconfiguration-negativevalueconfiguration","Required":false,"Type":"NegativeValueConfiguration","UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numberdisplayformatconfiguration.html#cfn-quicksight-analysis-numberdisplayformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumberScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numberdisplayformatconfiguration.html#cfn-quicksight-analysis-numberdisplayformatconfiguration-numberscale","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numberdisplayformatconfiguration.html#cfn-quicksight-analysis-numberdisplayformatconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numberdisplayformatconfiguration.html#cfn-quicksight-analysis-numberdisplayformatconfiguration-separatorconfiguration","Required":false,"Type":"NumericSeparatorConfiguration","UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numberdisplayformatconfiguration.html#cfn-quicksight-analysis-numberdisplayformatconfiguration-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumberFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numberformatconfiguration.html","Properties":{"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numberformatconfiguration.html#cfn-quicksight-analysis-numberformatconfiguration-formatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumericAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericaxisoptions.html","Properties":{"Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericaxisoptions.html#cfn-quicksight-analysis-numericaxisoptions-range","Required":false,"Type":"AxisDisplayRange","UpdateType":"Mutable"},"Scale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericaxisoptions.html#cfn-quicksight-analysis-numericaxisoptions-scale","Required":false,"Type":"AxisScale","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumericEqualityDrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalitydrilldownfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalitydrilldownfilter.html#cfn-quicksight-analysis-numericequalitydrilldownfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalitydrilldownfilter.html#cfn-quicksight-analysis-numericequalitydrilldownfilter-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumericEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalityfilter.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalityfilter.html#cfn-quicksight-analysis-numericequalityfilter-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalityfilter.html#cfn-quicksight-analysis-numericequalityfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalityfilter.html#cfn-quicksight-analysis-numericequalityfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalityfilter.html#cfn-quicksight-analysis-numericequalityfilter-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalityfilter.html#cfn-quicksight-analysis-numericequalityfilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalityfilter.html#cfn-quicksight-analysis-numericequalityfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalityfilter.html#cfn-quicksight-analysis-numericequalityfilter-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericequalityfilter.html#cfn-quicksight-analysis-numericequalityfilter-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumericFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericformatconfiguration.html","Properties":{"CurrencyDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericformatconfiguration.html#cfn-quicksight-analysis-numericformatconfiguration-currencydisplayformatconfiguration","Required":false,"Type":"CurrencyDisplayFormatConfiguration","UpdateType":"Mutable"},"NumberDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericformatconfiguration.html#cfn-quicksight-analysis-numericformatconfiguration-numberdisplayformatconfiguration","Required":false,"Type":"NumberDisplayFormatConfiguration","UpdateType":"Mutable"},"PercentageDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericformatconfiguration.html#cfn-quicksight-analysis-numericformatconfiguration-percentagedisplayformatconfiguration","Required":false,"Type":"PercentageDisplayFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumericRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefilter.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefilter.html#cfn-quicksight-analysis-numericrangefilter-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefilter.html#cfn-quicksight-analysis-numericrangefilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefilter.html#cfn-quicksight-analysis-numericrangefilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncludeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefilter.html#cfn-quicksight-analysis-numericrangefilter-includemaximum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefilter.html#cfn-quicksight-analysis-numericrangefilter-includeminimum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefilter.html#cfn-quicksight-analysis-numericrangefilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RangeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefilter.html#cfn-quicksight-analysis-numericrangefilter-rangemaximum","Required":false,"Type":"NumericRangeFilterValue","UpdateType":"Mutable"},"RangeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefilter.html#cfn-quicksight-analysis-numericrangefilter-rangeminimum","Required":false,"Type":"NumericRangeFilterValue","UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefilter.html#cfn-quicksight-analysis-numericrangefilter-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumericRangeFilterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefiltervalue.html","Properties":{"Parameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefiltervalue.html#cfn-quicksight-analysis-numericrangefiltervalue-parameter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StaticValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericrangefiltervalue.html#cfn-quicksight-analysis-numericrangefiltervalue-staticvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumericSeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericseparatorconfiguration.html","Properties":{"DecimalSeparator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericseparatorconfiguration.html#cfn-quicksight-analysis-numericseparatorconfiguration-decimalseparator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThousandsSeparator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericseparatorconfiguration.html#cfn-quicksight-analysis-numericseparatorconfiguration-thousandsseparator","Required":false,"Type":"ThousandSeparatorOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumericalAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericalaggregationfunction.html","Properties":{"PercentileAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericalaggregationfunction.html#cfn-quicksight-analysis-numericalaggregationfunction-percentileaggregation","Required":false,"Type":"PercentileAggregation","UpdateType":"Mutable"},"SimpleNumericalAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericalaggregationfunction.html#cfn-quicksight-analysis-numericalaggregationfunction-simplenumericalaggregation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumericalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericaldimensionfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericaldimensionfield.html#cfn-quicksight-analysis-numericaldimensionfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericaldimensionfield.html#cfn-quicksight-analysis-numericaldimensionfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericaldimensionfield.html#cfn-quicksight-analysis-numericaldimensionfield-formatconfiguration","Required":false,"Type":"NumberFormatConfiguration","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericaldimensionfield.html#cfn-quicksight-analysis-numericaldimensionfield-hierarchyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.NumericalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericalmeasurefield.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericalmeasurefield.html#cfn-quicksight-analysis-numericalmeasurefield-aggregationfunction","Required":false,"Type":"NumericalAggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericalmeasurefield.html#cfn-quicksight-analysis-numericalmeasurefield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericalmeasurefield.html#cfn-quicksight-analysis-numericalmeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-numericalmeasurefield.html#cfn-quicksight-analysis-numericalmeasurefield-formatconfiguration","Required":false,"Type":"NumberFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PaginationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-paginationconfiguration.html","Properties":{"PageNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-paginationconfiguration.html#cfn-quicksight-analysis-paginationconfiguration-pagenumber","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"PageSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-paginationconfiguration.html#cfn-quicksight-analysis-paginationconfiguration-pagesize","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PanelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-panelconfiguration.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-panelconfiguration.html#cfn-quicksight-analysis-panelconfiguration-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BackgroundVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-panelconfiguration.html#cfn-quicksight-analysis-panelconfiguration-backgroundvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-panelconfiguration.html#cfn-quicksight-analysis-panelconfiguration-bordercolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-panelconfiguration.html#cfn-quicksight-analysis-panelconfiguration-borderstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderThickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-panelconfiguration.html#cfn-quicksight-analysis-panelconfiguration-borderthickness","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-panelconfiguration.html#cfn-quicksight-analysis-panelconfiguration-bordervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GutterSpacing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-panelconfiguration.html#cfn-quicksight-analysis-panelconfiguration-gutterspacing","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GutterVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-panelconfiguration.html#cfn-quicksight-analysis-panelconfiguration-guttervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-panelconfiguration.html#cfn-quicksight-analysis-panelconfiguration-title","Required":false,"Type":"PanelTitleOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PanelTitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-paneltitleoptions.html","Properties":{"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-paneltitleoptions.html#cfn-quicksight-analysis-paneltitleoptions-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"HorizontalTextAlignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-paneltitleoptions.html#cfn-quicksight-analysis-paneltitleoptions-horizontaltextalignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-paneltitleoptions.html#cfn-quicksight-analysis-paneltitleoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ParameterControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametercontrol.html","Properties":{"DateTimePicker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametercontrol.html#cfn-quicksight-analysis-parametercontrol-datetimepicker","Required":false,"Type":"ParameterDateTimePickerControl","UpdateType":"Mutable"},"Dropdown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametercontrol.html#cfn-quicksight-analysis-parametercontrol-dropdown","Required":false,"Type":"ParameterDropDownControl","UpdateType":"Mutable"},"List":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametercontrol.html#cfn-quicksight-analysis-parametercontrol-list","Required":false,"Type":"ParameterListControl","UpdateType":"Mutable"},"Slider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametercontrol.html#cfn-quicksight-analysis-parametercontrol-slider","Required":false,"Type":"ParameterSliderControl","UpdateType":"Mutable"},"TextArea":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametercontrol.html#cfn-quicksight-analysis-parametercontrol-textarea","Required":false,"Type":"ParameterTextAreaControl","UpdateType":"Mutable"},"TextField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametercontrol.html#cfn-quicksight-analysis-parametercontrol-textfield","Required":false,"Type":"ParameterTextFieldControl","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ParameterDateTimePickerControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdatetimepickercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdatetimepickercontrol.html#cfn-quicksight-analysis-parameterdatetimepickercontrol-displayoptions","Required":false,"Type":"DateTimePickerControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdatetimepickercontrol.html#cfn-quicksight-analysis-parameterdatetimepickercontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdatetimepickercontrol.html#cfn-quicksight-analysis-parameterdatetimepickercontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdatetimepickercontrol.html#cfn-quicksight-analysis-parameterdatetimepickercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdeclaration.html","Properties":{"DateTimeParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdeclaration.html#cfn-quicksight-analysis-parameterdeclaration-datetimeparameterdeclaration","Required":false,"Type":"DateTimeParameterDeclaration","UpdateType":"Mutable"},"DecimalParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdeclaration.html#cfn-quicksight-analysis-parameterdeclaration-decimalparameterdeclaration","Required":false,"Type":"DecimalParameterDeclaration","UpdateType":"Mutable"},"IntegerParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdeclaration.html#cfn-quicksight-analysis-parameterdeclaration-integerparameterdeclaration","Required":false,"Type":"IntegerParameterDeclaration","UpdateType":"Mutable"},"StringParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdeclaration.html#cfn-quicksight-analysis-parameterdeclaration-stringparameterdeclaration","Required":false,"Type":"StringParameterDeclaration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ParameterDropDownControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdropdowncontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdropdowncontrol.html#cfn-quicksight-analysis-parameterdropdowncontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdropdowncontrol.html#cfn-quicksight-analysis-parameterdropdowncontrol-displayoptions","Required":false,"Type":"DropDownControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdropdowncontrol.html#cfn-quicksight-analysis-parameterdropdowncontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdropdowncontrol.html#cfn-quicksight-analysis-parameterdropdowncontrol-selectablevalues","Required":false,"Type":"ParameterSelectableValues","UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdropdowncontrol.html#cfn-quicksight-analysis-parameterdropdowncontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdropdowncontrol.html#cfn-quicksight-analysis-parameterdropdowncontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterdropdowncontrol.html#cfn-quicksight-analysis-parameterdropdowncontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ParameterListControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterlistcontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterlistcontrol.html#cfn-quicksight-analysis-parameterlistcontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterlistcontrol.html#cfn-quicksight-analysis-parameterlistcontrol-displayoptions","Required":false,"Type":"ListControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterlistcontrol.html#cfn-quicksight-analysis-parameterlistcontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterlistcontrol.html#cfn-quicksight-analysis-parameterlistcontrol-selectablevalues","Required":false,"Type":"ParameterSelectableValues","UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterlistcontrol.html#cfn-quicksight-analysis-parameterlistcontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterlistcontrol.html#cfn-quicksight-analysis-parameterlistcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterlistcontrol.html#cfn-quicksight-analysis-parameterlistcontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ParameterSelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterselectablevalues.html","Properties":{"LinkToDataSetColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterselectablevalues.html#cfn-quicksight-analysis-parameterselectablevalues-linktodatasetcolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterselectablevalues.html#cfn-quicksight-analysis-parameterselectablevalues-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ParameterSliderControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterslidercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterslidercontrol.html#cfn-quicksight-analysis-parameterslidercontrol-displayoptions","Required":false,"Type":"SliderControlDisplayOptions","UpdateType":"Mutable"},"MaximumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterslidercontrol.html#cfn-quicksight-analysis-parameterslidercontrol-maximumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"MinimumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterslidercontrol.html#cfn-quicksight-analysis-parameterslidercontrol-minimumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterslidercontrol.html#cfn-quicksight-analysis-parameterslidercontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterslidercontrol.html#cfn-quicksight-analysis-parameterslidercontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterslidercontrol.html#cfn-quicksight-analysis-parameterslidercontrol-stepsize","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameterslidercontrol.html#cfn-quicksight-analysis-parameterslidercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ParameterTextAreaControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametertextareacontrol.html","Properties":{"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametertextareacontrol.html#cfn-quicksight-analysis-parametertextareacontrol-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametertextareacontrol.html#cfn-quicksight-analysis-parametertextareacontrol-displayoptions","Required":false,"Type":"TextAreaControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametertextareacontrol.html#cfn-quicksight-analysis-parametertextareacontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametertextareacontrol.html#cfn-quicksight-analysis-parametertextareacontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametertextareacontrol.html#cfn-quicksight-analysis-parametertextareacontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ParameterTextFieldControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametertextfieldcontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametertextfieldcontrol.html#cfn-quicksight-analysis-parametertextfieldcontrol-displayoptions","Required":false,"Type":"TextFieldControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametertextfieldcontrol.html#cfn-quicksight-analysis-parametertextfieldcontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametertextfieldcontrol.html#cfn-quicksight-analysis-parametertextfieldcontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parametertextfieldcontrol.html#cfn-quicksight-analysis-parametertextfieldcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameters.html","Properties":{"DateTimeParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameters.html#cfn-quicksight-analysis-parameters-datetimeparameters","DuplicatesAllowed":true,"ItemType":"DateTimeParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"DecimalParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameters.html#cfn-quicksight-analysis-parameters-decimalparameters","DuplicatesAllowed":true,"ItemType":"DecimalParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"IntegerParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameters.html#cfn-quicksight-analysis-parameters-integerparameters","DuplicatesAllowed":true,"ItemType":"IntegerParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"StringParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-parameters.html#cfn-quicksight-analysis-parameters-stringparameters","DuplicatesAllowed":true,"ItemType":"StringParameter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PercentVisibleRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentvisiblerange.html","Properties":{"From":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentvisiblerange.html#cfn-quicksight-analysis-percentvisiblerange-from","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"To":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentvisiblerange.html#cfn-quicksight-analysis-percentvisiblerange-to","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PercentageDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentagedisplayformatconfiguration.html","Properties":{"DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentagedisplayformatconfiguration.html#cfn-quicksight-analysis-percentagedisplayformatconfiguration-decimalplacesconfiguration","Required":false,"Type":"DecimalPlacesConfiguration","UpdateType":"Mutable"},"NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentagedisplayformatconfiguration.html#cfn-quicksight-analysis-percentagedisplayformatconfiguration-negativevalueconfiguration","Required":false,"Type":"NegativeValueConfiguration","UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentagedisplayformatconfiguration.html#cfn-quicksight-analysis-percentagedisplayformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentagedisplayformatconfiguration.html#cfn-quicksight-analysis-percentagedisplayformatconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentagedisplayformatconfiguration.html#cfn-quicksight-analysis-percentagedisplayformatconfiguration-separatorconfiguration","Required":false,"Type":"NumericSeparatorConfiguration","UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentagedisplayformatconfiguration.html#cfn-quicksight-analysis-percentagedisplayformatconfiguration-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PercentileAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentileaggregation.html","Properties":{"PercentileValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-percentileaggregation.html#cfn-quicksight-analysis-percentileaggregation-percentilevalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PeriodOverPeriodComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-periodoverperiodcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-periodoverperiodcomputation.html#cfn-quicksight-analysis-periodoverperiodcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-periodoverperiodcomputation.html#cfn-quicksight-analysis-periodoverperiodcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-periodoverperiodcomputation.html#cfn-quicksight-analysis-periodoverperiodcomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-periodoverperiodcomputation.html#cfn-quicksight-analysis-periodoverperiodcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PeriodToDateComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-periodtodatecomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-periodtodatecomputation.html#cfn-quicksight-analysis-periodtodatecomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-periodtodatecomputation.html#cfn-quicksight-analysis-periodtodatecomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PeriodTimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-periodtodatecomputation.html#cfn-quicksight-analysis-periodtodatecomputation-periodtimegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-periodtodatecomputation.html#cfn-quicksight-analysis-periodtodatecomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-periodtodatecomputation.html#cfn-quicksight-analysis-periodtodatecomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PieChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartaggregatedfieldwells.html#cfn-quicksight-analysis-piechartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartaggregatedfieldwells.html#cfn-quicksight-analysis-piechartaggregatedfieldwells-smallmultiples","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartaggregatedfieldwells.html#cfn-quicksight-analysis-piechartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PieChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html","Properties":{"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html#cfn-quicksight-analysis-piechartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ContributionAnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html#cfn-quicksight-analysis-piechartconfiguration-contributionanalysisdefaults","DuplicatesAllowed":true,"ItemType":"ContributionAnalysisDefault","Required":false,"Type":"List","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html#cfn-quicksight-analysis-piechartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"DonutOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html#cfn-quicksight-analysis-piechartconfiguration-donutoptions","Required":false,"Type":"DonutOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html#cfn-quicksight-analysis-piechartconfiguration-fieldwells","Required":false,"Type":"PieChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html#cfn-quicksight-analysis-piechartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html#cfn-quicksight-analysis-piechartconfiguration-smallmultiplesoptions","Required":false,"Type":"SmallMultiplesOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html#cfn-quicksight-analysis-piechartconfiguration-sortconfiguration","Required":false,"Type":"PieChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html#cfn-quicksight-analysis-piechartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"ValueLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html#cfn-quicksight-analysis-piechartconfiguration-valuelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartconfiguration.html#cfn-quicksight-analysis-piechartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PieChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartfieldwells.html","Properties":{"PieChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartfieldwells.html#cfn-quicksight-analysis-piechartfieldwells-piechartaggregatedfieldwells","Required":false,"Type":"PieChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PieChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartsortconfiguration.html#cfn-quicksight-analysis-piechartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartsortconfiguration.html#cfn-quicksight-analysis-piechartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartsortconfiguration.html#cfn-quicksight-analysis-piechartsortconfiguration-smallmultipleslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartsortconfiguration.html#cfn-quicksight-analysis-piechartsortconfiguration-smallmultiplessort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PieChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartvisual.html#cfn-quicksight-analysis-piechartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartvisual.html#cfn-quicksight-analysis-piechartvisual-chartconfiguration","Required":false,"Type":"PieChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartvisual.html#cfn-quicksight-analysis-piechartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartvisual.html#cfn-quicksight-analysis-piechartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartvisual.html#cfn-quicksight-analysis-piechartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-piechartvisual.html#cfn-quicksight-analysis-piechartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotFieldSortOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivotfieldsortoptions.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivotfieldsortoptions.html#cfn-quicksight-analysis-pivotfieldsortoptions-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SortBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivotfieldsortoptions.html#cfn-quicksight-analysis-pivotfieldsortoptions-sortby","Required":true,"Type":"PivotTableSortBy","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableaggregatedfieldwells.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableaggregatedfieldwells.html#cfn-quicksight-analysis-pivottableaggregatedfieldwells-columns","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Rows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableaggregatedfieldwells.html#cfn-quicksight-analysis-pivottableaggregatedfieldwells-rows","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableaggregatedfieldwells.html#cfn-quicksight-analysis-pivottableaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableCellConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablecellconditionalformatting.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablecellconditionalformatting.html#cfn-quicksight-analysis-pivottablecellconditionalformatting-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablecellconditionalformatting.html#cfn-quicksight-analysis-pivottablecellconditionalformatting-scope","Required":false,"Type":"PivotTableConditionalFormattingScope","UpdateType":"Mutable"},"Scopes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablecellconditionalformatting.html#cfn-quicksight-analysis-pivottablecellconditionalformatting-scopes","DuplicatesAllowed":true,"ItemType":"PivotTableConditionalFormattingScope","Required":false,"Type":"List","UpdateType":"Mutable"},"TextFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablecellconditionalformatting.html#cfn-quicksight-analysis-pivottablecellconditionalformatting-textformat","Required":false,"Type":"TextConditionalFormat","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconditionalformatting.html#cfn-quicksight-analysis-pivottableconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"PivotTableConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconditionalformattingoption.html","Properties":{"Cell":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconditionalformattingoption.html#cfn-quicksight-analysis-pivottableconditionalformattingoption-cell","Required":false,"Type":"PivotTableCellConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableConditionalFormattingScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconditionalformattingscope.html","Properties":{"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconditionalformattingscope.html#cfn-quicksight-analysis-pivottableconditionalformattingscope-role","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconfiguration.html","Properties":{"FieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconfiguration.html#cfn-quicksight-analysis-pivottableconfiguration-fieldoptions","Required":false,"Type":"PivotTableFieldOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconfiguration.html#cfn-quicksight-analysis-pivottableconfiguration-fieldwells","Required":false,"Type":"PivotTableFieldWells","UpdateType":"Mutable"},"PaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconfiguration.html#cfn-quicksight-analysis-pivottableconfiguration-paginatedreportoptions","Required":false,"Type":"PivotTablePaginatedReportOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconfiguration.html#cfn-quicksight-analysis-pivottableconfiguration-sortconfiguration","Required":false,"Type":"PivotTableSortConfiguration","UpdateType":"Mutable"},"TableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconfiguration.html#cfn-quicksight-analysis-pivottableconfiguration-tableoptions","Required":false,"Type":"PivotTableOptions","UpdateType":"Mutable"},"TotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableconfiguration.html#cfn-quicksight-analysis-pivottableconfiguration-totaloptions","Required":false,"Type":"PivotTableTotalOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableDataPathOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottabledatapathoption.html","Properties":{"DataPathList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottabledatapathoption.html#cfn-quicksight-analysis-pivottabledatapathoption-datapathlist","DuplicatesAllowed":true,"ItemType":"DataPathValue","Required":true,"Type":"List","UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottabledatapathoption.html#cfn-quicksight-analysis-pivottabledatapathoption-width","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableFieldCollapseStateOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldcollapsestateoption.html","Properties":{"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldcollapsestateoption.html#cfn-quicksight-analysis-pivottablefieldcollapsestateoption-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldcollapsestateoption.html#cfn-quicksight-analysis-pivottablefieldcollapsestateoption-target","Required":true,"Type":"PivotTableFieldCollapseStateTarget","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableFieldCollapseStateTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldcollapsestatetarget.html","Properties":{"FieldDataPathValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldcollapsestatetarget.html#cfn-quicksight-analysis-pivottablefieldcollapsestatetarget-fielddatapathvalues","DuplicatesAllowed":true,"ItemType":"DataPathValue","Required":false,"Type":"List","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldcollapsestatetarget.html#cfn-quicksight-analysis-pivottablefieldcollapsestatetarget-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableFieldOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldoption.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldoption.html#cfn-quicksight-analysis-pivottablefieldoption-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldoption.html#cfn-quicksight-analysis-pivottablefieldoption-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldoption.html#cfn-quicksight-analysis-pivottablefieldoption-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldoptions.html","Properties":{"CollapseStateOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldoptions.html#cfn-quicksight-analysis-pivottablefieldoptions-collapsestateoptions","DuplicatesAllowed":true,"ItemType":"PivotTableFieldCollapseStateOption","Required":false,"Type":"List","UpdateType":"Mutable"},"DataPathOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldoptions.html#cfn-quicksight-analysis-pivottablefieldoptions-datapathoptions","DuplicatesAllowed":true,"ItemType":"PivotTableDataPathOption","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldoptions.html#cfn-quicksight-analysis-pivottablefieldoptions-selectedfieldoptions","DuplicatesAllowed":true,"ItemType":"PivotTableFieldOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableFieldSubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldsubtotaloptions.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldsubtotaloptions.html#cfn-quicksight-analysis-pivottablefieldsubtotaloptions-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldwells.html","Properties":{"PivotTableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablefieldwells.html#cfn-quicksight-analysis-pivottablefieldwells-pivottableaggregatedfieldwells","Required":false,"Type":"PivotTableAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableoptions.html","Properties":{"CellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableoptions.html#cfn-quicksight-analysis-pivottableoptions-cellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"CollapsedRowDimensionsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableoptions.html#cfn-quicksight-analysis-pivottableoptions-collapsedrowdimensionsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColumnHeaderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableoptions.html#cfn-quicksight-analysis-pivottableoptions-columnheaderstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"ColumnNamesVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableoptions.html#cfn-quicksight-analysis-pivottableoptions-columnnamesvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricPlacement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableoptions.html#cfn-quicksight-analysis-pivottableoptions-metricplacement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RowAlternateColorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableoptions.html#cfn-quicksight-analysis-pivottableoptions-rowalternatecoloroptions","Required":false,"Type":"RowAlternateColorOptions","UpdateType":"Mutable"},"RowFieldNamesStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableoptions.html#cfn-quicksight-analysis-pivottableoptions-rowfieldnamesstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"RowHeaderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableoptions.html#cfn-quicksight-analysis-pivottableoptions-rowheaderstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"SingleMetricVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableoptions.html#cfn-quicksight-analysis-pivottableoptions-singlemetricvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ToggleButtonsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottableoptions.html#cfn-quicksight-analysis-pivottableoptions-togglebuttonsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTablePaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablepaginatedreportoptions.html","Properties":{"OverflowColumnHeaderVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablepaginatedreportoptions.html#cfn-quicksight-analysis-pivottablepaginatedreportoptions-overflowcolumnheadervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerticalOverflowVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablepaginatedreportoptions.html#cfn-quicksight-analysis-pivottablepaginatedreportoptions-verticaloverflowvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableSortBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablesortby.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablesortby.html#cfn-quicksight-analysis-pivottablesortby-column","Required":false,"Type":"ColumnSort","UpdateType":"Mutable"},"DataPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablesortby.html#cfn-quicksight-analysis-pivottablesortby-datapath","Required":false,"Type":"DataPathSort","UpdateType":"Mutable"},"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablesortby.html#cfn-quicksight-analysis-pivottablesortby-field","Required":false,"Type":"FieldSort","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablesortconfiguration.html","Properties":{"FieldSortOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablesortconfiguration.html#cfn-quicksight-analysis-pivottablesortconfiguration-fieldsortoptions","DuplicatesAllowed":true,"ItemType":"PivotFieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottabletotaloptions.html","Properties":{"ColumnSubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottabletotaloptions.html#cfn-quicksight-analysis-pivottabletotaloptions-columnsubtotaloptions","Required":false,"Type":"SubtotalOptions","UpdateType":"Mutable"},"ColumnTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottabletotaloptions.html#cfn-quicksight-analysis-pivottabletotaloptions-columntotaloptions","Required":false,"Type":"PivotTotalOptions","UpdateType":"Mutable"},"RowSubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottabletotaloptions.html#cfn-quicksight-analysis-pivottabletotaloptions-rowsubtotaloptions","Required":false,"Type":"SubtotalOptions","UpdateType":"Mutable"},"RowTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottabletotaloptions.html#cfn-quicksight-analysis-pivottabletotaloptions-rowtotaloptions","Required":false,"Type":"PivotTotalOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablevisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablevisual.html#cfn-quicksight-analysis-pivottablevisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablevisual.html#cfn-quicksight-analysis-pivottablevisual-chartconfiguration","Required":false,"Type":"PivotTableConfiguration","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablevisual.html#cfn-quicksight-analysis-pivottablevisual-conditionalformatting","Required":false,"Type":"PivotTableConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablevisual.html#cfn-quicksight-analysis-pivottablevisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablevisual.html#cfn-quicksight-analysis-pivottablevisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottablevisual.html#cfn-quicksight-analysis-pivottablevisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PivotTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottotaloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottotaloptions.html#cfn-quicksight-analysis-pivottotaloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricHeaderCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottotaloptions.html#cfn-quicksight-analysis-pivottotaloptions-metricheadercellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottotaloptions.html#cfn-quicksight-analysis-pivottotaloptions-placement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScrollStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottotaloptions.html#cfn-quicksight-analysis-pivottotaloptions-scrollstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TotalCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottotaloptions.html#cfn-quicksight-analysis-pivottotaloptions-totalcellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottotaloptions.html#cfn-quicksight-analysis-pivottotaloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-pivottotaloptions.html#cfn-quicksight-analysis-pivottotaloptions-valuecellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.PredefinedHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-predefinedhierarchy.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-predefinedhierarchy.html#cfn-quicksight-analysis-predefinedhierarchy-columns","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":true,"Type":"List","UpdateType":"Mutable"},"DrillDownFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-predefinedhierarchy.html#cfn-quicksight-analysis-predefinedhierarchy-drilldownfilters","DuplicatesAllowed":true,"ItemType":"DrillDownFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-predefinedhierarchy.html#cfn-quicksight-analysis-predefinedhierarchy-hierarchyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ProgressBarOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-progressbaroptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-progressbaroptions.html#cfn-quicksight-analysis-progressbaroptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RadarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartaggregatedfieldwells.html#cfn-quicksight-analysis-radarchartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartaggregatedfieldwells.html#cfn-quicksight-analysis-radarchartaggregatedfieldwells-color","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartaggregatedfieldwells.html#cfn-quicksight-analysis-radarchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RadarChartAreaStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartareastylesettings.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartareastylesettings.html#cfn-quicksight-analysis-radarchartareastylesettings-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RadarChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html","Properties":{"AlternateBandColorsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-alternatebandcolorsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlternateBandEvenColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-alternatebandevencolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlternateBandOddColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-alternatebandoddcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AxesRangeScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-axesrangescale","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BaseSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-baseseriessettings","Required":false,"Type":"RadarChartSeriesSettings","UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-coloraxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-fieldwells","Required":false,"Type":"RadarChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"Shape":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-shape","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-sortconfiguration","Required":false,"Type":"RadarChartSortConfiguration","UpdateType":"Mutable"},"StartAngle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-startangle","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartconfiguration.html#cfn-quicksight-analysis-radarchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RadarChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartfieldwells.html","Properties":{"RadarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartfieldwells.html#cfn-quicksight-analysis-radarchartfieldwells-radarchartaggregatedfieldwells","Required":false,"Type":"RadarChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RadarChartSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartseriessettings.html","Properties":{"AreaStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartseriessettings.html#cfn-quicksight-analysis-radarchartseriessettings-areastylesettings","Required":false,"Type":"RadarChartAreaStyleSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RadarChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartsortconfiguration.html#cfn-quicksight-analysis-radarchartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartsortconfiguration.html#cfn-quicksight-analysis-radarchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartsortconfiguration.html#cfn-quicksight-analysis-radarchartsortconfiguration-coloritemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"ColorSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartsortconfiguration.html#cfn-quicksight-analysis-radarchartsortconfiguration-colorsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RadarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartvisual.html#cfn-quicksight-analysis-radarchartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartvisual.html#cfn-quicksight-analysis-radarchartvisual-chartconfiguration","Required":false,"Type":"RadarChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartvisual.html#cfn-quicksight-analysis-radarchartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartvisual.html#cfn-quicksight-analysis-radarchartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartvisual.html#cfn-quicksight-analysis-radarchartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-radarchartvisual.html#cfn-quicksight-analysis-radarchartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RangeEndsLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-rangeendslabeltype.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-rangeendslabeltype.html#cfn-quicksight-analysis-rangeendslabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ReferenceLine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referenceline.html","Properties":{"DataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referenceline.html#cfn-quicksight-analysis-referenceline-dataconfiguration","Required":true,"Type":"ReferenceLineDataConfiguration","UpdateType":"Mutable"},"LabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referenceline.html#cfn-quicksight-analysis-referenceline-labelconfiguration","Required":false,"Type":"ReferenceLineLabelConfiguration","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referenceline.html#cfn-quicksight-analysis-referenceline-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StyleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referenceline.html#cfn-quicksight-analysis-referenceline-styleconfiguration","Required":false,"Type":"ReferenceLineStyleConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ReferenceLineCustomLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinecustomlabelconfiguration.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinecustomlabelconfiguration.html#cfn-quicksight-analysis-referencelinecustomlabelconfiguration-customlabel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ReferenceLineDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinedataconfiguration.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinedataconfiguration.html#cfn-quicksight-analysis-referencelinedataconfiguration-axisbinding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DynamicConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinedataconfiguration.html#cfn-quicksight-analysis-referencelinedataconfiguration-dynamicconfiguration","Required":false,"Type":"ReferenceLineDynamicDataConfiguration","UpdateType":"Mutable"},"StaticConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinedataconfiguration.html#cfn-quicksight-analysis-referencelinedataconfiguration-staticconfiguration","Required":false,"Type":"ReferenceLineStaticDataConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ReferenceLineDynamicDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinedynamicdataconfiguration.html","Properties":{"Calculation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinedynamicdataconfiguration.html#cfn-quicksight-analysis-referencelinedynamicdataconfiguration-calculation","Required":true,"Type":"NumericalAggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinedynamicdataconfiguration.html#cfn-quicksight-analysis-referencelinedynamicdataconfiguration-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"MeasureAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinedynamicdataconfiguration.html#cfn-quicksight-analysis-referencelinedynamicdataconfiguration-measureaggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ReferenceLineLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinelabelconfiguration.html","Properties":{"CustomLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinelabelconfiguration.html#cfn-quicksight-analysis-referencelinelabelconfiguration-customlabelconfiguration","Required":false,"Type":"ReferenceLineCustomLabelConfiguration","UpdateType":"Mutable"},"FontColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinelabelconfiguration.html#cfn-quicksight-analysis-referencelinelabelconfiguration-fontcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinelabelconfiguration.html#cfn-quicksight-analysis-referencelinelabelconfiguration-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"HorizontalPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinelabelconfiguration.html#cfn-quicksight-analysis-referencelinelabelconfiguration-horizontalposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinelabelconfiguration.html#cfn-quicksight-analysis-referencelinelabelconfiguration-valuelabelconfiguration","Required":false,"Type":"ReferenceLineValueLabelConfiguration","UpdateType":"Mutable"},"VerticalPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinelabelconfiguration.html#cfn-quicksight-analysis-referencelinelabelconfiguration-verticalposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ReferenceLineStaticDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinestaticdataconfiguration.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinestaticdataconfiguration.html#cfn-quicksight-analysis-referencelinestaticdataconfiguration-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ReferenceLineStyleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinestyleconfiguration.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinestyleconfiguration.html#cfn-quicksight-analysis-referencelinestyleconfiguration-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Pattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinestyleconfiguration.html#cfn-quicksight-analysis-referencelinestyleconfiguration-pattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ReferenceLineValueLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinevaluelabelconfiguration.html","Properties":{"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinevaluelabelconfiguration.html#cfn-quicksight-analysis-referencelinevaluelabelconfiguration-formatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"},"RelativePosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-referencelinevaluelabelconfiguration.html#cfn-quicksight-analysis-referencelinevaluelabelconfiguration-relativeposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RelativeDateTimeControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatetimecontroldisplayoptions.html","Properties":{"DateTimeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatetimecontroldisplayoptions.html#cfn-quicksight-analysis-relativedatetimecontroldisplayoptions-datetimeformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatetimecontroldisplayoptions.html#cfn-quicksight-analysis-relativedatetimecontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RelativeDatesFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatesfilter.html","Properties":{"AnchorDateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatesfilter.html#cfn-quicksight-analysis-relativedatesfilter-anchordateconfiguration","Required":true,"Type":"AnchorDateConfiguration","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatesfilter.html#cfn-quicksight-analysis-relativedatesfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"ExcludePeriodConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatesfilter.html#cfn-quicksight-analysis-relativedatesfilter-excludeperiodconfiguration","Required":false,"Type":"ExcludePeriodConfiguration","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatesfilter.html#cfn-quicksight-analysis-relativedatesfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MinimumGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatesfilter.html#cfn-quicksight-analysis-relativedatesfilter-minimumgranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatesfilter.html#cfn-quicksight-analysis-relativedatesfilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatesfilter.html#cfn-quicksight-analysis-relativedatesfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RelativeDateType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatesfilter.html#cfn-quicksight-analysis-relativedatesfilter-relativedatetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RelativeDateValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatesfilter.html#cfn-quicksight-analysis-relativedatesfilter-relativedatevalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-relativedatesfilter.html#cfn-quicksight-analysis-relativedatesfilter-timegranularity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ResourcePermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-resourcepermission.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-resourcepermission.html#cfn-quicksight-analysis-resourcepermission-actions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-resourcepermission.html#cfn-quicksight-analysis-resourcepermission-principal","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-resourcepermission.html#cfn-quicksight-analysis-resourcepermission-resource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RollingDateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-rollingdateconfiguration.html","Properties":{"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-rollingdateconfiguration.html#cfn-quicksight-analysis-rollingdateconfiguration-datasetidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-rollingdateconfiguration.html#cfn-quicksight-analysis-rollingdateconfiguration-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.RowAlternateColorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-rowalternatecoloroptions.html","Properties":{"RowAlternateColors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-rowalternatecoloroptions.html#cfn-quicksight-analysis-rowalternatecoloroptions-rowalternatecolors","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-rowalternatecoloroptions.html#cfn-quicksight-analysis-rowalternatecoloroptions-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SameSheetTargetVisualConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-samesheettargetvisualconfiguration.html","Properties":{"TargetVisualOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-samesheettargetvisualconfiguration.html#cfn-quicksight-analysis-samesheettargetvisualconfiguration-targetvisualoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetVisuals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-samesheettargetvisualconfiguration.html#cfn-quicksight-analysis-samesheettargetvisualconfiguration-targetvisuals","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SankeyDiagramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramaggregatedfieldwells.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramaggregatedfieldwells.html#cfn-quicksight-analysis-sankeydiagramaggregatedfieldwells-destination","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramaggregatedfieldwells.html#cfn-quicksight-analysis-sankeydiagramaggregatedfieldwells-source","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramaggregatedfieldwells.html#cfn-quicksight-analysis-sankeydiagramaggregatedfieldwells-weight","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SankeyDiagramChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramchartconfiguration.html","Properties":{"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramchartconfiguration.html#cfn-quicksight-analysis-sankeydiagramchartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramchartconfiguration.html#cfn-quicksight-analysis-sankeydiagramchartconfiguration-fieldwells","Required":false,"Type":"SankeyDiagramFieldWells","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramchartconfiguration.html#cfn-quicksight-analysis-sankeydiagramchartconfiguration-sortconfiguration","Required":false,"Type":"SankeyDiagramSortConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SankeyDiagramFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramfieldwells.html","Properties":{"SankeyDiagramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramfieldwells.html#cfn-quicksight-analysis-sankeydiagramfieldwells-sankeydiagramaggregatedfieldwells","Required":false,"Type":"SankeyDiagramAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SankeyDiagramSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramsortconfiguration.html","Properties":{"DestinationItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramsortconfiguration.html#cfn-quicksight-analysis-sankeydiagramsortconfiguration-destinationitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SourceItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramsortconfiguration.html#cfn-quicksight-analysis-sankeydiagramsortconfiguration-sourceitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"WeightSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramsortconfiguration.html#cfn-quicksight-analysis-sankeydiagramsortconfiguration-weightsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SankeyDiagramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramvisual.html#cfn-quicksight-analysis-sankeydiagramvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramvisual.html#cfn-quicksight-analysis-sankeydiagramvisual-chartconfiguration","Required":false,"Type":"SankeyDiagramChartConfiguration","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramvisual.html#cfn-quicksight-analysis-sankeydiagramvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramvisual.html#cfn-quicksight-analysis-sankeydiagramvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sankeydiagramvisual.html#cfn-quicksight-analysis-sankeydiagramvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ScatterPlotCategoricallyAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotcategoricallyaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-analysis-scatterplotcategoricallyaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-analysis-scatterplotcategoricallyaggregatedfieldwells-label","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-analysis-scatterplotcategoricallyaggregatedfieldwells-size","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"XAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-analysis-scatterplotcategoricallyaggregatedfieldwells-xaxis","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"YAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-analysis-scatterplotcategoricallyaggregatedfieldwells-yaxis","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ScatterPlotConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotconfiguration.html","Properties":{"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotconfiguration.html#cfn-quicksight-analysis-scatterplotconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotconfiguration.html#cfn-quicksight-analysis-scatterplotconfiguration-fieldwells","Required":false,"Type":"ScatterPlotFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotconfiguration.html#cfn-quicksight-analysis-scatterplotconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotconfiguration.html#cfn-quicksight-analysis-scatterplotconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotconfiguration.html#cfn-quicksight-analysis-scatterplotconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"XAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotconfiguration.html#cfn-quicksight-analysis-scatterplotconfiguration-xaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"XAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotconfiguration.html#cfn-quicksight-analysis-scatterplotconfiguration-xaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"YAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotconfiguration.html#cfn-quicksight-analysis-scatterplotconfiguration-yaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"YAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotconfiguration.html#cfn-quicksight-analysis-scatterplotconfiguration-yaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ScatterPlotFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotfieldwells.html","Properties":{"ScatterPlotCategoricallyAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotfieldwells.html#cfn-quicksight-analysis-scatterplotfieldwells-scatterplotcategoricallyaggregatedfieldwells","Required":false,"Type":"ScatterPlotCategoricallyAggregatedFieldWells","UpdateType":"Mutable"},"ScatterPlotUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotfieldwells.html#cfn-quicksight-analysis-scatterplotfieldwells-scatterplotunaggregatedfieldwells","Required":false,"Type":"ScatterPlotUnaggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ScatterPlotUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotunaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotunaggregatedfieldwells.html#cfn-quicksight-analysis-scatterplotunaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotunaggregatedfieldwells.html#cfn-quicksight-analysis-scatterplotunaggregatedfieldwells-label","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotunaggregatedfieldwells.html#cfn-quicksight-analysis-scatterplotunaggregatedfieldwells-size","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"XAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotunaggregatedfieldwells.html#cfn-quicksight-analysis-scatterplotunaggregatedfieldwells-xaxis","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"YAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotunaggregatedfieldwells.html#cfn-quicksight-analysis-scatterplotunaggregatedfieldwells-yaxis","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ScatterPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotvisual.html#cfn-quicksight-analysis-scatterplotvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotvisual.html#cfn-quicksight-analysis-scatterplotvisual-chartconfiguration","Required":false,"Type":"ScatterPlotConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotvisual.html#cfn-quicksight-analysis-scatterplotvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotvisual.html#cfn-quicksight-analysis-scatterplotvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotvisual.html#cfn-quicksight-analysis-scatterplotvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scatterplotvisual.html#cfn-quicksight-analysis-scatterplotvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ScrollBarOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scrollbaroptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scrollbaroptions.html#cfn-quicksight-analysis-scrollbaroptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VisibleRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-scrollbaroptions.html#cfn-quicksight-analysis-scrollbaroptions-visiblerange","Required":false,"Type":"VisibleRangeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SecondaryValueOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-secondaryvalueoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-secondaryvalueoptions.html#cfn-quicksight-analysis-secondaryvalueoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SectionAfterPageBreak":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionafterpagebreak.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionafterpagebreak.html#cfn-quicksight-analysis-sectionafterpagebreak-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SectionBasedLayoutCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionbasedlayoutcanvassizeoptions.html","Properties":{"PaperCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionbasedlayoutcanvassizeoptions.html#cfn-quicksight-analysis-sectionbasedlayoutcanvassizeoptions-papercanvassizeoptions","Required":false,"Type":"SectionBasedLayoutPaperCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SectionBasedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionbasedlayoutconfiguration.html","Properties":{"BodySections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionbasedlayoutconfiguration.html#cfn-quicksight-analysis-sectionbasedlayoutconfiguration-bodysections","DuplicatesAllowed":true,"ItemType":"BodySectionConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"},"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionbasedlayoutconfiguration.html#cfn-quicksight-analysis-sectionbasedlayoutconfiguration-canvassizeoptions","Required":true,"Type":"SectionBasedLayoutCanvasSizeOptions","UpdateType":"Mutable"},"FooterSections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionbasedlayoutconfiguration.html#cfn-quicksight-analysis-sectionbasedlayoutconfiguration-footersections","DuplicatesAllowed":true,"ItemType":"HeaderFooterSectionConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"},"HeaderSections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionbasedlayoutconfiguration.html#cfn-quicksight-analysis-sectionbasedlayoutconfiguration-headersections","DuplicatesAllowed":true,"ItemType":"HeaderFooterSectionConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SectionBasedLayoutPaperCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionbasedlayoutpapercanvassizeoptions.html","Properties":{"PaperMargin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionbasedlayoutpapercanvassizeoptions.html#cfn-quicksight-analysis-sectionbasedlayoutpapercanvassizeoptions-papermargin","Required":false,"Type":"Spacing","UpdateType":"Mutable"},"PaperOrientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionbasedlayoutpapercanvassizeoptions.html#cfn-quicksight-analysis-sectionbasedlayoutpapercanvassizeoptions-paperorientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PaperSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionbasedlayoutpapercanvassizeoptions.html#cfn-quicksight-analysis-sectionbasedlayoutpapercanvassizeoptions-papersize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SectionLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionlayoutconfiguration.html","Properties":{"FreeFormLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionlayoutconfiguration.html#cfn-quicksight-analysis-sectionlayoutconfiguration-freeformlayout","Required":true,"Type":"FreeFormSectionLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SectionPageBreakConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionpagebreakconfiguration.html","Properties":{"After":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionpagebreakconfiguration.html#cfn-quicksight-analysis-sectionpagebreakconfiguration-after","Required":false,"Type":"SectionAfterPageBreak","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SectionStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionstyle.html","Properties":{"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionstyle.html#cfn-quicksight-analysis-sectionstyle-height","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Padding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sectionstyle.html#cfn-quicksight-analysis-sectionstyle-padding","Required":false,"Type":"Spacing","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SelectedSheetsFilterScopeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-selectedsheetsfilterscopeconfiguration.html","Properties":{"SheetVisualScopingConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-selectedsheetsfilterscopeconfiguration.html#cfn-quicksight-analysis-selectedsheetsfilterscopeconfiguration-sheetvisualscopingconfigurations","DuplicatesAllowed":true,"ItemType":"SheetVisualScopingConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-seriesitem.html","Properties":{"DataFieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-seriesitem.html#cfn-quicksight-analysis-seriesitem-datafieldseriesitem","Required":false,"Type":"DataFieldSeriesItem","UpdateType":"Mutable"},"FieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-seriesitem.html#cfn-quicksight-analysis-seriesitem-fieldseriesitem","Required":false,"Type":"FieldSeriesItem","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SetParameterValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-setparametervalueconfiguration.html","Properties":{"DestinationParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-setparametervalueconfiguration.html#cfn-quicksight-analysis-setparametervalueconfiguration-destinationparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-setparametervalueconfiguration.html#cfn-quicksight-analysis-setparametervalueconfiguration-value","Required":true,"Type":"DestinationParameterValueConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ShapeConditionalFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-shapeconditionalformat.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-shapeconditionalformat.html#cfn-quicksight-analysis-shapeconditionalformat-backgroundcolor","Required":true,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.Sheet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheet.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheet.html#cfn-quicksight-analysis-sheet-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheet.html#cfn-quicksight-analysis-sheet-sheetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SheetControlLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetcontrollayout.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetcontrollayout.html#cfn-quicksight-analysis-sheetcontrollayout-configuration","Required":true,"Type":"SheetControlLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SheetControlLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetcontrollayoutconfiguration.html","Properties":{"GridLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetcontrollayoutconfiguration.html#cfn-quicksight-analysis-sheetcontrollayoutconfiguration-gridlayout","Required":false,"Type":"GridLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SheetDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html#cfn-quicksight-analysis-sheetdefinition-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html#cfn-quicksight-analysis-sheetdefinition-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilterControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html#cfn-quicksight-analysis-sheetdefinition-filtercontrols","DuplicatesAllowed":true,"ItemType":"FilterControl","Required":false,"Type":"List","UpdateType":"Mutable"},"Layouts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html#cfn-quicksight-analysis-sheetdefinition-layouts","DuplicatesAllowed":true,"ItemType":"Layout","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html#cfn-quicksight-analysis-sheetdefinition-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html#cfn-quicksight-analysis-sheetdefinition-parametercontrols","DuplicatesAllowed":true,"ItemType":"ParameterControl","Required":false,"Type":"List","UpdateType":"Mutable"},"SheetControlLayouts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html#cfn-quicksight-analysis-sheetdefinition-sheetcontrollayouts","DuplicatesAllowed":true,"ItemType":"SheetControlLayout","Required":false,"Type":"List","UpdateType":"Mutable"},"SheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html#cfn-quicksight-analysis-sheetdefinition-sheetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TextBoxes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html#cfn-quicksight-analysis-sheetdefinition-textboxes","DuplicatesAllowed":true,"ItemType":"SheetTextBox","Required":false,"Type":"List","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html#cfn-quicksight-analysis-sheetdefinition-title","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visuals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetdefinition.html#cfn-quicksight-analysis-sheetdefinition-visuals","DuplicatesAllowed":true,"ItemType":"Visual","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SheetElementConfigurationOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetelementconfigurationoverrides.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetelementconfigurationoverrides.html#cfn-quicksight-analysis-sheetelementconfigurationoverrides-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SheetElementRenderingRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetelementrenderingrule.html","Properties":{"ConfigurationOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetelementrenderingrule.html#cfn-quicksight-analysis-sheetelementrenderingrule-configurationoverrides","Required":true,"Type":"SheetElementConfigurationOverrides","UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetelementrenderingrule.html#cfn-quicksight-analysis-sheetelementrenderingrule-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SheetTextBox":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheettextbox.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheettextbox.html#cfn-quicksight-analysis-sheettextbox-content","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SheetTextBoxId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheettextbox.html#cfn-quicksight-analysis-sheettextbox-sheettextboxid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SheetVisualScopingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetvisualscopingconfiguration.html","Properties":{"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetvisualscopingconfiguration.html#cfn-quicksight-analysis-sheetvisualscopingconfiguration-scope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetvisualscopingconfiguration.html#cfn-quicksight-analysis-sheetvisualscopingconfiguration-sheetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VisualIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-sheetvisualscopingconfiguration.html#cfn-quicksight-analysis-sheetvisualscopingconfiguration-visualids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ShortFormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-shortformattext.html","Properties":{"PlainText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-shortformattext.html#cfn-quicksight-analysis-shortformattext-plaintext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RichText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-shortformattext.html#cfn-quicksight-analysis-shortformattext-richtext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SimpleClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-simpleclustermarker.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-simpleclustermarker.html#cfn-quicksight-analysis-simpleclustermarker-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SliderControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-slidercontroldisplayoptions.html","Properties":{"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-slidercontroldisplayoptions.html#cfn-quicksight-analysis-slidercontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-smallmultiplesoptions.html","Properties":{"MaxVisibleColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-smallmultiplesoptions.html#cfn-quicksight-analysis-smallmultiplesoptions-maxvisiblecolumns","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaxVisibleRows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-smallmultiplesoptions.html#cfn-quicksight-analysis-smallmultiplesoptions-maxvisiblerows","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PanelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-smallmultiplesoptions.html#cfn-quicksight-analysis-smallmultiplesoptions-panelconfiguration","Required":false,"Type":"PanelConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.Spacing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-spacing.html","Properties":{"Bottom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-spacing.html#cfn-quicksight-analysis-spacing-bottom","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Left":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-spacing.html#cfn-quicksight-analysis-spacing-left","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Right":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-spacing.html#cfn-quicksight-analysis-spacing-right","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Top":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-spacing.html#cfn-quicksight-analysis-spacing-top","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.StringDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringdefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringdefaultvalues.html#cfn-quicksight-analysis-stringdefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringdefaultvalues.html#cfn-quicksight-analysis-stringdefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.StringFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringformatconfiguration.html","Properties":{"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringformatconfiguration.html#cfn-quicksight-analysis-stringformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumericFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringformatconfiguration.html#cfn-quicksight-analysis-stringformatconfiguration-numericformatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.StringParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringparameter.html#cfn-quicksight-analysis-stringparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringparameter.html#cfn-quicksight-analysis-stringparameter-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.StringParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringparameterdeclaration.html#cfn-quicksight-analysis-stringparameterdeclaration-defaultvalues","Required":false,"Type":"StringDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringparameterdeclaration.html#cfn-quicksight-analysis-stringparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringparameterdeclaration.html#cfn-quicksight-analysis-stringparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringparameterdeclaration.html#cfn-quicksight-analysis-stringparameterdeclaration-parametervaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringparameterdeclaration.html#cfn-quicksight-analysis-stringparameterdeclaration-valuewhenunset","Required":false,"Type":"StringValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.StringValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringvaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringvaluewhenunsetconfiguration.html#cfn-quicksight-analysis-stringvaluewhenunsetconfiguration-customvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-stringvaluewhenunsetconfiguration.html#cfn-quicksight-analysis-stringvaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.SubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-subtotaloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-subtotaloptions.html#cfn-quicksight-analysis-subtotaloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-subtotaloptions.html#cfn-quicksight-analysis-subtotaloptions-fieldlevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldLevelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-subtotaloptions.html#cfn-quicksight-analysis-subtotaloptions-fieldleveloptions","DuplicatesAllowed":true,"ItemType":"PivotTableFieldSubtotalOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricHeaderCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-subtotaloptions.html#cfn-quicksight-analysis-subtotaloptions-metricheadercellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-subtotaloptions.html#cfn-quicksight-analysis-subtotaloptions-totalcellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-subtotaloptions.html#cfn-quicksight-analysis-subtotaloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-subtotaloptions.html#cfn-quicksight-analysis-subtotaloptions-valuecellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableaggregatedfieldwells.html","Properties":{"GroupBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableaggregatedfieldwells.html#cfn-quicksight-analysis-tableaggregatedfieldwells-groupby","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableaggregatedfieldwells.html#cfn-quicksight-analysis-tableaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableBorderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableborderoptions.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableborderoptions.html#cfn-quicksight-analysis-tableborderoptions-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Style":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableborderoptions.html#cfn-quicksight-analysis-tableborderoptions-style","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Thickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableborderoptions.html#cfn-quicksight-analysis-tableborderoptions-thickness","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableCellConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellconditionalformatting.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellconditionalformatting.html#cfn-quicksight-analysis-tablecellconditionalformatting-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TextFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellconditionalformatting.html#cfn-quicksight-analysis-tablecellconditionalformatting-textformat","Required":false,"Type":"TextConditionalFormat","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableCellImageSizingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellimagesizingconfiguration.html","Properties":{"TableCellImageScalingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellimagesizingconfiguration.html#cfn-quicksight-analysis-tablecellimagesizingconfiguration-tablecellimagescalingconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellstyle.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellstyle.html#cfn-quicksight-analysis-tablecellstyle-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Border":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellstyle.html#cfn-quicksight-analysis-tablecellstyle-border","Required":false,"Type":"GlobalTableBorderOptions","UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellstyle.html#cfn-quicksight-analysis-tablecellstyle-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellstyle.html#cfn-quicksight-analysis-tablecellstyle-height","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"HorizontalTextAlignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellstyle.html#cfn-quicksight-analysis-tablecellstyle-horizontaltextalignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextWrap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellstyle.html#cfn-quicksight-analysis-tablecellstyle-textwrap","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerticalTextAlignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellstyle.html#cfn-quicksight-analysis-tablecellstyle-verticaltextalignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablecellstyle.html#cfn-quicksight-analysis-tablecellstyle-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconditionalformatting.html#cfn-quicksight-analysis-tableconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"TableConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconditionalformattingoption.html","Properties":{"Cell":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconditionalformattingoption.html#cfn-quicksight-analysis-tableconditionalformattingoption-cell","Required":false,"Type":"TableCellConditionalFormatting","UpdateType":"Mutable"},"Row":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconditionalformattingoption.html#cfn-quicksight-analysis-tableconditionalformattingoption-row","Required":false,"Type":"TableRowConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconfiguration.html","Properties":{"FieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconfiguration.html#cfn-quicksight-analysis-tableconfiguration-fieldoptions","Required":false,"Type":"TableFieldOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconfiguration.html#cfn-quicksight-analysis-tableconfiguration-fieldwells","Required":false,"Type":"TableFieldWells","UpdateType":"Mutable"},"PaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconfiguration.html#cfn-quicksight-analysis-tableconfiguration-paginatedreportoptions","Required":false,"Type":"TablePaginatedReportOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconfiguration.html#cfn-quicksight-analysis-tableconfiguration-sortconfiguration","Required":false,"Type":"TableSortConfiguration","UpdateType":"Mutable"},"TableInlineVisualizations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconfiguration.html#cfn-quicksight-analysis-tableconfiguration-tableinlinevisualizations","DuplicatesAllowed":true,"ItemType":"TableInlineVisualization","Required":false,"Type":"List","UpdateType":"Mutable"},"TableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconfiguration.html#cfn-quicksight-analysis-tableconfiguration-tableoptions","Required":false,"Type":"TableOptions","UpdateType":"Mutable"},"TotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableconfiguration.html#cfn-quicksight-analysis-tableconfiguration-totaloptions","Required":false,"Type":"TotalOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableFieldCustomIconContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldcustomiconcontent.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldcustomiconcontent.html#cfn-quicksight-analysis-tablefieldcustomiconcontent-icon","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableFieldCustomTextContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldcustomtextcontent.html","Properties":{"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldcustomtextcontent.html#cfn-quicksight-analysis-tablefieldcustomtextcontent-fontconfiguration","Required":true,"Type":"FontConfiguration","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldcustomtextcontent.html#cfn-quicksight-analysis-tablefieldcustomtextcontent-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableFieldImageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldimageconfiguration.html","Properties":{"SizingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldimageconfiguration.html#cfn-quicksight-analysis-tablefieldimageconfiguration-sizingoptions","Required":false,"Type":"TableCellImageSizingConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableFieldLinkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldlinkconfiguration.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldlinkconfiguration.html#cfn-quicksight-analysis-tablefieldlinkconfiguration-content","Required":true,"Type":"TableFieldLinkContentConfiguration","UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldlinkconfiguration.html#cfn-quicksight-analysis-tablefieldlinkconfiguration-target","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableFieldLinkContentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldlinkcontentconfiguration.html","Properties":{"CustomIconContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldlinkcontentconfiguration.html#cfn-quicksight-analysis-tablefieldlinkcontentconfiguration-customiconcontent","Required":false,"Type":"TableFieldCustomIconContent","UpdateType":"Mutable"},"CustomTextContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldlinkcontentconfiguration.html#cfn-quicksight-analysis-tablefieldlinkcontentconfiguration-customtextcontent","Required":false,"Type":"TableFieldCustomTextContent","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableFieldOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldoption.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldoption.html#cfn-quicksight-analysis-tablefieldoption-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldoption.html#cfn-quicksight-analysis-tablefieldoption-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"URLStyling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldoption.html#cfn-quicksight-analysis-tablefieldoption-urlstyling","Required":false,"Type":"TableFieldURLConfiguration","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldoption.html#cfn-quicksight-analysis-tablefieldoption-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldoption.html#cfn-quicksight-analysis-tablefieldoption-width","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldoptions.html","Properties":{"Order":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldoptions.html#cfn-quicksight-analysis-tablefieldoptions-order","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldoptions.html#cfn-quicksight-analysis-tablefieldoptions-selectedfieldoptions","DuplicatesAllowed":true,"ItemType":"TableFieldOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableFieldURLConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldurlconfiguration.html","Properties":{"ImageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldurlconfiguration.html#cfn-quicksight-analysis-tablefieldurlconfiguration-imageconfiguration","Required":false,"Type":"TableFieldImageConfiguration","UpdateType":"Mutable"},"LinkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldurlconfiguration.html#cfn-quicksight-analysis-tablefieldurlconfiguration-linkconfiguration","Required":false,"Type":"TableFieldLinkConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldwells.html","Properties":{"TableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldwells.html#cfn-quicksight-analysis-tablefieldwells-tableaggregatedfieldwells","Required":false,"Type":"TableAggregatedFieldWells","UpdateType":"Mutable"},"TableUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablefieldwells.html#cfn-quicksight-analysis-tablefieldwells-tableunaggregatedfieldwells","Required":false,"Type":"TableUnaggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableInlineVisualization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableinlinevisualization.html","Properties":{"DataBars":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableinlinevisualization.html#cfn-quicksight-analysis-tableinlinevisualization-databars","Required":false,"Type":"DataBarsOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableoptions.html","Properties":{"CellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableoptions.html#cfn-quicksight-analysis-tableoptions-cellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"HeaderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableoptions.html#cfn-quicksight-analysis-tableoptions-headerstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"Orientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableoptions.html#cfn-quicksight-analysis-tableoptions-orientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RowAlternateColorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableoptions.html#cfn-quicksight-analysis-tableoptions-rowalternatecoloroptions","Required":false,"Type":"RowAlternateColorOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TablePaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablepaginatedreportoptions.html","Properties":{"OverflowColumnHeaderVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablepaginatedreportoptions.html#cfn-quicksight-analysis-tablepaginatedreportoptions-overflowcolumnheadervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerticalOverflowVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablepaginatedreportoptions.html#cfn-quicksight-analysis-tablepaginatedreportoptions-verticaloverflowvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableRowConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablerowconditionalformatting.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablerowconditionalformatting.html#cfn-quicksight-analysis-tablerowconditionalformatting-backgroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablerowconditionalformatting.html#cfn-quicksight-analysis-tablerowconditionalformatting-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableSideBorderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablesideborderoptions.html","Properties":{"Bottom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablesideborderoptions.html#cfn-quicksight-analysis-tablesideborderoptions-bottom","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"InnerHorizontal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablesideborderoptions.html#cfn-quicksight-analysis-tablesideborderoptions-innerhorizontal","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"InnerVertical":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablesideborderoptions.html#cfn-quicksight-analysis-tablesideborderoptions-innervertical","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"Left":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablesideborderoptions.html#cfn-quicksight-analysis-tablesideborderoptions-left","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"Right":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablesideborderoptions.html#cfn-quicksight-analysis-tablesideborderoptions-right","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"Top":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablesideborderoptions.html#cfn-quicksight-analysis-tablesideborderoptions-top","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablesortconfiguration.html","Properties":{"PaginationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablesortconfiguration.html#cfn-quicksight-analysis-tablesortconfiguration-paginationconfiguration","Required":false,"Type":"PaginationConfiguration","UpdateType":"Mutable"},"RowSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablesortconfiguration.html#cfn-quicksight-analysis-tablesortconfiguration-rowsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableunaggregatedfieldwells.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tableunaggregatedfieldwells.html#cfn-quicksight-analysis-tableunaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"UnaggregatedField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablevisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablevisual.html#cfn-quicksight-analysis-tablevisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablevisual.html#cfn-quicksight-analysis-tablevisual-chartconfiguration","Required":false,"Type":"TableConfiguration","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablevisual.html#cfn-quicksight-analysis-tablevisual-conditionalformatting","Required":false,"Type":"TableConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablevisual.html#cfn-quicksight-analysis-tablevisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablevisual.html#cfn-quicksight-analysis-tablevisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tablevisual.html#cfn-quicksight-analysis-tablevisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TextAreaControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textareacontroldisplayoptions.html","Properties":{"PlaceholderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textareacontroldisplayoptions.html#cfn-quicksight-analysis-textareacontroldisplayoptions-placeholderoptions","Required":false,"Type":"TextControlPlaceholderOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textareacontroldisplayoptions.html#cfn-quicksight-analysis-textareacontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TextConditionalFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textconditionalformat.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textconditionalformat.html#cfn-quicksight-analysis-textconditionalformat-backgroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"},"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textconditionalformat.html#cfn-quicksight-analysis-textconditionalformat-icon","Required":false,"Type":"ConditionalFormattingIcon","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textconditionalformat.html#cfn-quicksight-analysis-textconditionalformat-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TextControlPlaceholderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textcontrolplaceholderoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textcontrolplaceholderoptions.html#cfn-quicksight-analysis-textcontrolplaceholderoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TextFieldControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textfieldcontroldisplayoptions.html","Properties":{"PlaceholderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textfieldcontroldisplayoptions.html#cfn-quicksight-analysis-textfieldcontroldisplayoptions-placeholderoptions","Required":false,"Type":"TextControlPlaceholderOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-textfieldcontroldisplayoptions.html#cfn-quicksight-analysis-textfieldcontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.ThousandSeparatorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-thousandseparatoroptions.html","Properties":{"Symbol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-thousandseparatoroptions.html#cfn-quicksight-analysis-thousandseparatoroptions-symbol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-thousandseparatoroptions.html#cfn-quicksight-analysis-thousandseparatoroptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TimeBasedForecastProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timebasedforecastproperties.html","Properties":{"LowerBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timebasedforecastproperties.html#cfn-quicksight-analysis-timebasedforecastproperties-lowerboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PeriodsBackward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timebasedforecastproperties.html#cfn-quicksight-analysis-timebasedforecastproperties-periodsbackward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PeriodsForward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timebasedforecastproperties.html#cfn-quicksight-analysis-timebasedforecastproperties-periodsforward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PredictionInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timebasedforecastproperties.html#cfn-quicksight-analysis-timebasedforecastproperties-predictioninterval","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Seasonality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timebasedforecastproperties.html#cfn-quicksight-analysis-timebasedforecastproperties-seasonality","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"UpperBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timebasedforecastproperties.html#cfn-quicksight-analysis-timebasedforecastproperties-upperboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TimeEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timeequalityfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timeequalityfilter.html#cfn-quicksight-analysis-timeequalityfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timeequalityfilter.html#cfn-quicksight-analysis-timeequalityfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timeequalityfilter.html#cfn-quicksight-analysis-timeequalityfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timeequalityfilter.html#cfn-quicksight-analysis-timeequalityfilter-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timeequalityfilter.html#cfn-quicksight-analysis-timeequalityfilter-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TimeRangeDrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangedrilldownfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangedrilldownfilter.html#cfn-quicksight-analysis-timerangedrilldownfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"RangeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangedrilldownfilter.html#cfn-quicksight-analysis-timerangedrilldownfilter-rangemaximum","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RangeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangedrilldownfilter.html#cfn-quicksight-analysis-timerangedrilldownfilter-rangeminimum","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangedrilldownfilter.html#cfn-quicksight-analysis-timerangedrilldownfilter-timegranularity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TimeRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefilter.html#cfn-quicksight-analysis-timerangefilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"ExcludePeriodConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefilter.html#cfn-quicksight-analysis-timerangefilter-excludeperiodconfiguration","Required":false,"Type":"ExcludePeriodConfiguration","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefilter.html#cfn-quicksight-analysis-timerangefilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncludeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefilter.html#cfn-quicksight-analysis-timerangefilter-includemaximum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefilter.html#cfn-quicksight-analysis-timerangefilter-includeminimum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefilter.html#cfn-quicksight-analysis-timerangefilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RangeMaximumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefilter.html#cfn-quicksight-analysis-timerangefilter-rangemaximumvalue","Required":false,"Type":"TimeRangeFilterValue","UpdateType":"Mutable"},"RangeMinimumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefilter.html#cfn-quicksight-analysis-timerangefilter-rangeminimumvalue","Required":false,"Type":"TimeRangeFilterValue","UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefilter.html#cfn-quicksight-analysis-timerangefilter-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TimeRangeFilterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefiltervalue.html","Properties":{"Parameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefiltervalue.html#cfn-quicksight-analysis-timerangefiltervalue-parameter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RollingDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefiltervalue.html#cfn-quicksight-analysis-timerangefiltervalue-rollingdate","Required":false,"Type":"RollingDateConfiguration","UpdateType":"Mutable"},"StaticValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-timerangefiltervalue.html#cfn-quicksight-analysis-timerangefiltervalue-staticvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tooltipitem.html","Properties":{"ColumnTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tooltipitem.html#cfn-quicksight-analysis-tooltipitem-columntooltipitem","Required":false,"Type":"ColumnTooltipItem","UpdateType":"Mutable"},"FieldTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tooltipitem.html#cfn-quicksight-analysis-tooltipitem-fieldtooltipitem","Required":false,"Type":"FieldTooltipItem","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TooltipOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tooltipoptions.html","Properties":{"FieldBasedTooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tooltipoptions.html#cfn-quicksight-analysis-tooltipoptions-fieldbasedtooltip","Required":false,"Type":"FieldBasedTooltip","UpdateType":"Mutable"},"SelectedTooltipType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tooltipoptions.html#cfn-quicksight-analysis-tooltipoptions-selectedtooltiptype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TooltipVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-tooltipoptions.html#cfn-quicksight-analysis-tooltipoptions-tooltipvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TopBottomFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomfilter.html","Properties":{"AggregationSortConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomfilter.html#cfn-quicksight-analysis-topbottomfilter-aggregationsortconfigurations","DuplicatesAllowed":true,"ItemType":"AggregationSortConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomfilter.html#cfn-quicksight-analysis-topbottomfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomfilter.html#cfn-quicksight-analysis-topbottomfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Limit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomfilter.html#cfn-quicksight-analysis-topbottomfilter-limit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomfilter.html#cfn-quicksight-analysis-topbottomfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomfilter.html#cfn-quicksight-analysis-topbottomfilter-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TopBottomMoversComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottommoverscomputation.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottommoverscomputation.html#cfn-quicksight-analysis-topbottommoverscomputation-category","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottommoverscomputation.html#cfn-quicksight-analysis-topbottommoverscomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MoverSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottommoverscomputation.html#cfn-quicksight-analysis-topbottommoverscomputation-moversize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottommoverscomputation.html#cfn-quicksight-analysis-topbottommoverscomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SortOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottommoverscomputation.html#cfn-quicksight-analysis-topbottommoverscomputation-sortorder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottommoverscomputation.html#cfn-quicksight-analysis-topbottommoverscomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottommoverscomputation.html#cfn-quicksight-analysis-topbottommoverscomputation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottommoverscomputation.html#cfn-quicksight-analysis-topbottommoverscomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TopBottomRankedComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomrankedcomputation.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomrankedcomputation.html#cfn-quicksight-analysis-topbottomrankedcomputation-category","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomrankedcomputation.html#cfn-quicksight-analysis-topbottomrankedcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomrankedcomputation.html#cfn-quicksight-analysis-topbottomrankedcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResultSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomrankedcomputation.html#cfn-quicksight-analysis-topbottomrankedcomputation-resultsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomrankedcomputation.html#cfn-quicksight-analysis-topbottomrankedcomputation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-topbottomrankedcomputation.html#cfn-quicksight-analysis-topbottomrankedcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TotalAggregationComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-totalaggregationcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-totalaggregationcomputation.html#cfn-quicksight-analysis-totalaggregationcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-totalaggregationcomputation.html#cfn-quicksight-analysis-totalaggregationcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-totalaggregationcomputation.html#cfn-quicksight-analysis-totalaggregationcomputation-value","Required":true,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-totaloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-totaloptions.html#cfn-quicksight-analysis-totaloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-totaloptions.html#cfn-quicksight-analysis-totaloptions-placement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScrollStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-totaloptions.html#cfn-quicksight-analysis-totaloptions-scrollstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TotalCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-totaloptions.html#cfn-quicksight-analysis-totaloptions-totalcellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-totaloptions.html#cfn-quicksight-analysis-totaloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TreeMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapaggregatedfieldwells.html","Properties":{"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapaggregatedfieldwells.html#cfn-quicksight-analysis-treemapaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapaggregatedfieldwells.html#cfn-quicksight-analysis-treemapaggregatedfieldwells-groups","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Sizes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapaggregatedfieldwells.html#cfn-quicksight-analysis-treemapaggregatedfieldwells-sizes","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TreeMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapconfiguration.html","Properties":{"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapconfiguration.html#cfn-quicksight-analysis-treemapconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapconfiguration.html#cfn-quicksight-analysis-treemapconfiguration-colorscale","Required":false,"Type":"ColorScale","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapconfiguration.html#cfn-quicksight-analysis-treemapconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapconfiguration.html#cfn-quicksight-analysis-treemapconfiguration-fieldwells","Required":false,"Type":"TreeMapFieldWells","UpdateType":"Mutable"},"GroupLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapconfiguration.html#cfn-quicksight-analysis-treemapconfiguration-grouplabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapconfiguration.html#cfn-quicksight-analysis-treemapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"SizeLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapconfiguration.html#cfn-quicksight-analysis-treemapconfiguration-sizelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapconfiguration.html#cfn-quicksight-analysis-treemapconfiguration-sortconfiguration","Required":false,"Type":"TreeMapSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapconfiguration.html#cfn-quicksight-analysis-treemapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TreeMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapfieldwells.html","Properties":{"TreeMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapfieldwells.html#cfn-quicksight-analysis-treemapfieldwells-treemapaggregatedfieldwells","Required":false,"Type":"TreeMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TreeMapSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapsortconfiguration.html","Properties":{"TreeMapGroupItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapsortconfiguration.html#cfn-quicksight-analysis-treemapsortconfiguration-treemapgroupitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"TreeMapSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapsortconfiguration.html#cfn-quicksight-analysis-treemapsortconfiguration-treemapsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TreeMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapvisual.html#cfn-quicksight-analysis-treemapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapvisual.html#cfn-quicksight-analysis-treemapvisual-chartconfiguration","Required":false,"Type":"TreeMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapvisual.html#cfn-quicksight-analysis-treemapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapvisual.html#cfn-quicksight-analysis-treemapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapvisual.html#cfn-quicksight-analysis-treemapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-treemapvisual.html#cfn-quicksight-analysis-treemapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.TrendArrowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-trendarrowoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-trendarrowoptions.html#cfn-quicksight-analysis-trendarrowoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.UnaggregatedField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-unaggregatedfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-unaggregatedfield.html#cfn-quicksight-analysis-unaggregatedfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-unaggregatedfield.html#cfn-quicksight-analysis-unaggregatedfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-unaggregatedfield.html#cfn-quicksight-analysis-unaggregatedfield-formatconfiguration","Required":false,"Type":"FormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.UniqueValuesComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-uniquevaluescomputation.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-uniquevaluescomputation.html#cfn-quicksight-analysis-uniquevaluescomputation-category","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-uniquevaluescomputation.html#cfn-quicksight-analysis-uniquevaluescomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-uniquevaluescomputation.html#cfn-quicksight-analysis-uniquevaluescomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.VisibleRangeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visiblerangeoptions.html","Properties":{"PercentRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visiblerangeoptions.html#cfn-quicksight-analysis-visiblerangeoptions-percentrange","Required":false,"Type":"PercentVisibleRange","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.Visual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html","Properties":{"BarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-barchartvisual","Required":false,"Type":"BarChartVisual","UpdateType":"Mutable"},"BoxPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-boxplotvisual","Required":false,"Type":"BoxPlotVisual","UpdateType":"Mutable"},"ComboChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-combochartvisual","Required":false,"Type":"ComboChartVisual","UpdateType":"Mutable"},"CustomContentVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-customcontentvisual","Required":false,"Type":"CustomContentVisual","UpdateType":"Mutable"},"EmptyVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-emptyvisual","Required":false,"Type":"EmptyVisual","UpdateType":"Mutable"},"FilledMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-filledmapvisual","Required":false,"Type":"FilledMapVisual","UpdateType":"Mutable"},"FunnelChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-funnelchartvisual","Required":false,"Type":"FunnelChartVisual","UpdateType":"Mutable"},"GaugeChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-gaugechartvisual","Required":false,"Type":"GaugeChartVisual","UpdateType":"Mutable"},"GeospatialMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-geospatialmapvisual","Required":false,"Type":"GeospatialMapVisual","UpdateType":"Mutable"},"HeatMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-heatmapvisual","Required":false,"Type":"HeatMapVisual","UpdateType":"Mutable"},"HistogramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-histogramvisual","Required":false,"Type":"HistogramVisual","UpdateType":"Mutable"},"InsightVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-insightvisual","Required":false,"Type":"InsightVisual","UpdateType":"Mutable"},"KPIVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-kpivisual","Required":false,"Type":"KPIVisual","UpdateType":"Mutable"},"LineChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-linechartvisual","Required":false,"Type":"LineChartVisual","UpdateType":"Mutable"},"PieChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-piechartvisual","Required":false,"Type":"PieChartVisual","UpdateType":"Mutable"},"PivotTableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-pivottablevisual","Required":false,"Type":"PivotTableVisual","UpdateType":"Mutable"},"RadarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-radarchartvisual","Required":false,"Type":"RadarChartVisual","UpdateType":"Mutable"},"SankeyDiagramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-sankeydiagramvisual","Required":false,"Type":"SankeyDiagramVisual","UpdateType":"Mutable"},"ScatterPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-scatterplotvisual","Required":false,"Type":"ScatterPlotVisual","UpdateType":"Mutable"},"TableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-tablevisual","Required":false,"Type":"TableVisual","UpdateType":"Mutable"},"TreeMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-treemapvisual","Required":false,"Type":"TreeMapVisual","UpdateType":"Mutable"},"WaterfallVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-waterfallvisual","Required":false,"Type":"WaterfallVisual","UpdateType":"Mutable"},"WordCloudVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visual.html#cfn-quicksight-analysis-visual-wordcloudvisual","Required":false,"Type":"WordCloudVisual","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.VisualCustomAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualcustomaction.html","Properties":{"ActionOperations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualcustomaction.html#cfn-quicksight-analysis-visualcustomaction-actionoperations","DuplicatesAllowed":true,"ItemType":"VisualCustomActionOperation","Required":true,"Type":"List","UpdateType":"Mutable"},"CustomActionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualcustomaction.html#cfn-quicksight-analysis-visualcustomaction-customactionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualcustomaction.html#cfn-quicksight-analysis-visualcustomaction-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualcustomaction.html#cfn-quicksight-analysis-visualcustomaction-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Trigger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualcustomaction.html#cfn-quicksight-analysis-visualcustomaction-trigger","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.VisualCustomActionOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualcustomactionoperation.html","Properties":{"FilterOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualcustomactionoperation.html#cfn-quicksight-analysis-visualcustomactionoperation-filteroperation","Required":false,"Type":"CustomActionFilterOperation","UpdateType":"Mutable"},"NavigationOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualcustomactionoperation.html#cfn-quicksight-analysis-visualcustomactionoperation-navigationoperation","Required":false,"Type":"CustomActionNavigationOperation","UpdateType":"Mutable"},"SetParametersOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualcustomactionoperation.html#cfn-quicksight-analysis-visualcustomactionoperation-setparametersoperation","Required":false,"Type":"CustomActionSetParametersOperation","UpdateType":"Mutable"},"URLOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualcustomactionoperation.html#cfn-quicksight-analysis-visualcustomactionoperation-urloperation","Required":false,"Type":"CustomActionURLOperation","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualpalette.html","Properties":{"ChartColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualpalette.html#cfn-quicksight-analysis-visualpalette-chartcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColorMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualpalette.html#cfn-quicksight-analysis-visualpalette-colormap","DuplicatesAllowed":true,"ItemType":"DataPathColor","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.VisualSubtitleLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualsubtitlelabeloptions.html","Properties":{"FormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualsubtitlelabeloptions.html#cfn-quicksight-analysis-visualsubtitlelabeloptions-formattext","Required":false,"Type":"LongFormatText","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualsubtitlelabeloptions.html#cfn-quicksight-analysis-visualsubtitlelabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.VisualTitleLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualtitlelabeloptions.html","Properties":{"FormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualtitlelabeloptions.html#cfn-quicksight-analysis-visualtitlelabeloptions-formattext","Required":false,"Type":"ShortFormatText","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-visualtitlelabeloptions.html#cfn-quicksight-analysis-visualtitlelabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WaterfallChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartaggregatedfieldwells.html","Properties":{"Breakdowns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartaggregatedfieldwells.html#cfn-quicksight-analysis-waterfallchartaggregatedfieldwells-breakdowns","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Categories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartaggregatedfieldwells.html#cfn-quicksight-analysis-waterfallchartaggregatedfieldwells-categories","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartaggregatedfieldwells.html#cfn-quicksight-analysis-waterfallchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WaterfallChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartconfiguration.html","Properties":{"CategoryAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartconfiguration.html#cfn-quicksight-analysis-waterfallchartconfiguration-categoryaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartconfiguration.html#cfn-quicksight-analysis-waterfallchartconfiguration-categoryaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartconfiguration.html#cfn-quicksight-analysis-waterfallchartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartconfiguration.html#cfn-quicksight-analysis-waterfallchartconfiguration-fieldwells","Required":false,"Type":"WaterfallChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartconfiguration.html#cfn-quicksight-analysis-waterfallchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartconfiguration.html#cfn-quicksight-analysis-waterfallchartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartconfiguration.html#cfn-quicksight-analysis-waterfallchartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartconfiguration.html#cfn-quicksight-analysis-waterfallchartconfiguration-sortconfiguration","Required":false,"Type":"WaterfallChartSortConfiguration","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartconfiguration.html#cfn-quicksight-analysis-waterfallchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"WaterfallChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartconfiguration.html#cfn-quicksight-analysis-waterfallchartconfiguration-waterfallchartoptions","Required":false,"Type":"WaterfallChartOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WaterfallChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartfieldwells.html","Properties":{"WaterfallChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartfieldwells.html#cfn-quicksight-analysis-waterfallchartfieldwells-waterfallchartaggregatedfieldwells","Required":false,"Type":"WaterfallChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WaterfallChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartoptions.html","Properties":{"TotalBarLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartoptions.html#cfn-quicksight-analysis-waterfallchartoptions-totalbarlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WaterfallChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartsortconfiguration.html","Properties":{"BreakdownItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartsortconfiguration.html#cfn-quicksight-analysis-waterfallchartsortconfiguration-breakdownitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallchartsortconfiguration.html#cfn-quicksight-analysis-waterfallchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WaterfallVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallvisual.html#cfn-quicksight-analysis-waterfallvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallvisual.html#cfn-quicksight-analysis-waterfallvisual-chartconfiguration","Required":false,"Type":"WaterfallChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallvisual.html#cfn-quicksight-analysis-waterfallvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallvisual.html#cfn-quicksight-analysis-waterfallvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallvisual.html#cfn-quicksight-analysis-waterfallvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-waterfallvisual.html#cfn-quicksight-analysis-waterfallvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WhatIfPointScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-whatifpointscenario.html","Properties":{"Date":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-whatifpointscenario.html#cfn-quicksight-analysis-whatifpointscenario-date","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-whatifpointscenario.html#cfn-quicksight-analysis-whatifpointscenario-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WhatIfRangeScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-whatifrangescenario.html","Properties":{"EndDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-whatifrangescenario.html#cfn-quicksight-analysis-whatifrangescenario-enddate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StartDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-whatifrangescenario.html#cfn-quicksight-analysis-whatifrangescenario-startdate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-whatifrangescenario.html#cfn-quicksight-analysis-whatifrangescenario-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WordCloudAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudaggregatedfieldwells.html","Properties":{"GroupBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudaggregatedfieldwells.html#cfn-quicksight-analysis-wordcloudaggregatedfieldwells-groupby","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudaggregatedfieldwells.html#cfn-quicksight-analysis-wordcloudaggregatedfieldwells-size","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WordCloudChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudchartconfiguration.html","Properties":{"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudchartconfiguration.html#cfn-quicksight-analysis-wordcloudchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudchartconfiguration.html#cfn-quicksight-analysis-wordcloudchartconfiguration-fieldwells","Required":false,"Type":"WordCloudFieldWells","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudchartconfiguration.html#cfn-quicksight-analysis-wordcloudchartconfiguration-sortconfiguration","Required":false,"Type":"WordCloudSortConfiguration","UpdateType":"Mutable"},"WordCloudOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudchartconfiguration.html#cfn-quicksight-analysis-wordcloudchartconfiguration-wordcloudoptions","Required":false,"Type":"WordCloudOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WordCloudFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudfieldwells.html","Properties":{"WordCloudAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudfieldwells.html#cfn-quicksight-analysis-wordcloudfieldwells-wordcloudaggregatedfieldwells","Required":false,"Type":"WordCloudAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WordCloudOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudoptions.html","Properties":{"CloudLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudoptions.html#cfn-quicksight-analysis-wordcloudoptions-cloudlayout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaximumStringLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudoptions.html#cfn-quicksight-analysis-wordcloudoptions-maximumstringlength","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"WordCasing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudoptions.html#cfn-quicksight-analysis-wordcloudoptions-wordcasing","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WordOrientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudoptions.html#cfn-quicksight-analysis-wordcloudoptions-wordorientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WordPadding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudoptions.html#cfn-quicksight-analysis-wordcloudoptions-wordpadding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WordScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudoptions.html#cfn-quicksight-analysis-wordcloudoptions-wordscaling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WordCloudSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudsortconfiguration.html#cfn-quicksight-analysis-wordcloudsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudsortconfiguration.html#cfn-quicksight-analysis-wordcloudsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis.WordCloudVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudvisual.html#cfn-quicksight-analysis-wordcloudvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudvisual.html#cfn-quicksight-analysis-wordcloudvisual-chartconfiguration","Required":false,"Type":"WordCloudChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudvisual.html#cfn-quicksight-analysis-wordcloudvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudvisual.html#cfn-quicksight-analysis-wordcloudvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudvisual.html#cfn-quicksight-analysis-wordcloudvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-analysis-wordcloudvisual.html#cfn-quicksight-analysis-wordcloudvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AdHocFilteringOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-adhocfilteringoption.html","Properties":{"AvailabilityStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-adhocfilteringoption.html#cfn-quicksight-dashboard-adhocfilteringoption-availabilitystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-aggregationfunction.html","Properties":{"CategoricalAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-aggregationfunction.html#cfn-quicksight-dashboard-aggregationfunction-categoricalaggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DateAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-aggregationfunction.html#cfn-quicksight-dashboard-aggregationfunction-dateaggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumericalAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-aggregationfunction.html#cfn-quicksight-dashboard-aggregationfunction-numericalaggregationfunction","Required":false,"Type":"NumericalAggregationFunction","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AggregationSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-aggregationsortconfiguration.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-aggregationsortconfiguration.html#cfn-quicksight-dashboard-aggregationsortconfiguration-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-aggregationsortconfiguration.html#cfn-quicksight-dashboard-aggregationsortconfiguration-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"SortDirection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-aggregationsortconfiguration.html#cfn-quicksight-dashboard-aggregationsortconfiguration-sortdirection","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-analysisdefaults.html","Properties":{"DefaultNewSheetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-analysisdefaults.html#cfn-quicksight-dashboard-analysisdefaults-defaultnewsheetconfiguration","Required":true,"Type":"DefaultNewSheetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AnchorDateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-anchordateconfiguration.html","Properties":{"AnchorOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-anchordateconfiguration.html#cfn-quicksight-dashboard-anchordateconfiguration-anchoroption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-anchordateconfiguration.html#cfn-quicksight-dashboard-anchordateconfiguration-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ArcAxisConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-arcaxisconfiguration.html","Properties":{"Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-arcaxisconfiguration.html#cfn-quicksight-dashboard-arcaxisconfiguration-range","Required":false,"Type":"ArcAxisDisplayRange","UpdateType":"Mutable"},"ReserveRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-arcaxisconfiguration.html#cfn-quicksight-dashboard-arcaxisconfiguration-reserverange","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ArcAxisDisplayRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-arcaxisdisplayrange.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-arcaxisdisplayrange.html#cfn-quicksight-dashboard-arcaxisdisplayrange-max","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-arcaxisdisplayrange.html#cfn-quicksight-dashboard-arcaxisdisplayrange-min","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ArcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-arcconfiguration.html","Properties":{"ArcAngle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-arcconfiguration.html#cfn-quicksight-dashboard-arcconfiguration-arcangle","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ArcThickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-arcconfiguration.html#cfn-quicksight-dashboard-arcconfiguration-arcthickness","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ArcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-arcoptions.html","Properties":{"ArcThickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-arcoptions.html#cfn-quicksight-dashboard-arcoptions-arcthickness","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AxisDataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdataoptions.html","Properties":{"DateAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdataoptions.html#cfn-quicksight-dashboard-axisdataoptions-dateaxisoptions","Required":false,"Type":"DateAxisOptions","UpdateType":"Mutable"},"NumericAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdataoptions.html#cfn-quicksight-dashboard-axisdataoptions-numericaxisoptions","Required":false,"Type":"NumericAxisOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AxisDisplayMinMaxRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayminmaxrange.html","Properties":{"Maximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayminmaxrange.html#cfn-quicksight-dashboard-axisdisplayminmaxrange-maximum","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Minimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayminmaxrange.html#cfn-quicksight-dashboard-axisdisplayminmaxrange-minimum","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayoptions.html","Properties":{"AxisLineVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayoptions.html#cfn-quicksight-dashboard-axisdisplayoptions-axislinevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AxisOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayoptions.html#cfn-quicksight-dashboard-axisdisplayoptions-axisoffset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayoptions.html#cfn-quicksight-dashboard-axisdisplayoptions-dataoptions","Required":false,"Type":"AxisDataOptions","UpdateType":"Mutable"},"GridLineVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayoptions.html#cfn-quicksight-dashboard-axisdisplayoptions-gridlinevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScrollbarOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayoptions.html#cfn-quicksight-dashboard-axisdisplayoptions-scrollbaroptions","Required":false,"Type":"ScrollBarOptions","UpdateType":"Mutable"},"TickLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayoptions.html#cfn-quicksight-dashboard-axisdisplayoptions-ticklabeloptions","Required":false,"Type":"AxisTickLabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AxisDisplayRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayrange.html","Properties":{"DataDriven":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayrange.html#cfn-quicksight-dashboard-axisdisplayrange-datadriven","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"MinMax":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisdisplayrange.html#cfn-quicksight-dashboard-axisdisplayrange-minmax","Required":false,"Type":"AxisDisplayMinMaxRange","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislabeloptions.html","Properties":{"ApplyTo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislabeloptions.html#cfn-quicksight-dashboard-axislabeloptions-applyto","Required":false,"Type":"AxisLabelReferenceOptions","UpdateType":"Mutable"},"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislabeloptions.html#cfn-quicksight-dashboard-axislabeloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislabeloptions.html#cfn-quicksight-dashboard-axislabeloptions-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AxisLabelReferenceOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislabelreferenceoptions.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislabelreferenceoptions.html#cfn-quicksight-dashboard-axislabelreferenceoptions-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislabelreferenceoptions.html#cfn-quicksight-dashboard-axislabelreferenceoptions-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AxisLinearScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislinearscale.html","Properties":{"StepCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislinearscale.html#cfn-quicksight-dashboard-axislinearscale-stepcount","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"StepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislinearscale.html#cfn-quicksight-dashboard-axislinearscale-stepsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AxisLogarithmicScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislogarithmicscale.html","Properties":{"Base":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axislogarithmicscale.html#cfn-quicksight-dashboard-axislogarithmicscale-base","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AxisScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisscale.html","Properties":{"Linear":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisscale.html#cfn-quicksight-dashboard-axisscale-linear","Required":false,"Type":"AxisLinearScale","UpdateType":"Mutable"},"Logarithmic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisscale.html#cfn-quicksight-dashboard-axisscale-logarithmic","Required":false,"Type":"AxisLogarithmicScale","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.AxisTickLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisticklabeloptions.html","Properties":{"LabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisticklabeloptions.html#cfn-quicksight-dashboard-axisticklabeloptions-labeloptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"},"RotationAngle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-axisticklabeloptions.html#cfn-quicksight-dashboard-axisticklabeloptions-rotationangle","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartaggregatedfieldwells.html#cfn-quicksight-dashboard-barchartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartaggregatedfieldwells.html#cfn-quicksight-dashboard-barchartaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartaggregatedfieldwells.html#cfn-quicksight-dashboard-barchartaggregatedfieldwells-smallmultiples","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartaggregatedfieldwells.html#cfn-quicksight-dashboard-barchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BarChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html","Properties":{"BarsArrangement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-barsarrangement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ContributionAnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-contributionanalysisdefaults","DuplicatesAllowed":true,"ItemType":"ContributionAnalysisDefault","Required":false,"Type":"List","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-fieldwells","Required":false,"Type":"BarChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"Orientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-orientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-smallmultiplesoptions","Required":false,"Type":"SmallMultiplesOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-sortconfiguration","Required":false,"Type":"BarChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"ValueAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-valueaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"ValueLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-valuelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartconfiguration.html#cfn-quicksight-dashboard-barchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BarChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartfieldwells.html","Properties":{"BarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartfieldwells.html#cfn-quicksight-dashboard-barchartfieldwells-barchartaggregatedfieldwells","Required":false,"Type":"BarChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BarChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartsortconfiguration.html#cfn-quicksight-dashboard-barchartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartsortconfiguration.html#cfn-quicksight-dashboard-barchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartsortconfiguration.html#cfn-quicksight-dashboard-barchartsortconfiguration-coloritemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"ColorSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartsortconfiguration.html#cfn-quicksight-dashboard-barchartsortconfiguration-colorsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartsortconfiguration.html#cfn-quicksight-dashboard-barchartsortconfiguration-smallmultipleslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartsortconfiguration.html#cfn-quicksight-dashboard-barchartsortconfiguration-smallmultiplessort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartvisual.html#cfn-quicksight-dashboard-barchartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartvisual.html#cfn-quicksight-dashboard-barchartvisual-chartconfiguration","Required":false,"Type":"BarChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartvisual.html#cfn-quicksight-dashboard-barchartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartvisual.html#cfn-quicksight-dashboard-barchartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartvisual.html#cfn-quicksight-dashboard-barchartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-barchartvisual.html#cfn-quicksight-dashboard-barchartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BinCountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-bincountoptions.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-bincountoptions.html#cfn-quicksight-dashboard-bincountoptions-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BinWidthOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-binwidthoptions.html","Properties":{"BinCountLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-binwidthoptions.html#cfn-quicksight-dashboard-binwidthoptions-bincountlimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-binwidthoptions.html#cfn-quicksight-dashboard-binwidthoptions-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BodySectionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-bodysectionconfiguration.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-bodysectionconfiguration.html#cfn-quicksight-dashboard-bodysectionconfiguration-content","Required":true,"Type":"BodySectionContent","UpdateType":"Mutable"},"PageBreakConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-bodysectionconfiguration.html#cfn-quicksight-dashboard-bodysectionconfiguration-pagebreakconfiguration","Required":false,"Type":"SectionPageBreakConfiguration","UpdateType":"Mutable"},"SectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-bodysectionconfiguration.html#cfn-quicksight-dashboard-bodysectionconfiguration-sectionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Style":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-bodysectionconfiguration.html#cfn-quicksight-dashboard-bodysectionconfiguration-style","Required":false,"Type":"SectionStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BodySectionContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-bodysectioncontent.html","Properties":{"Layout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-bodysectioncontent.html#cfn-quicksight-dashboard-bodysectioncontent-layout","Required":false,"Type":"SectionLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BoxPlotAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotaggregatedfieldwells.html","Properties":{"GroupBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotaggregatedfieldwells.html#cfn-quicksight-dashboard-boxplotaggregatedfieldwells-groupby","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotaggregatedfieldwells.html#cfn-quicksight-dashboard-boxplotaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BoxPlotChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html","Properties":{"BoxPlotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html#cfn-quicksight-dashboard-boxplotchartconfiguration-boxplotoptions","Required":false,"Type":"BoxPlotOptions","UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html#cfn-quicksight-dashboard-boxplotchartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html#cfn-quicksight-dashboard-boxplotchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html#cfn-quicksight-dashboard-boxplotchartconfiguration-fieldwells","Required":false,"Type":"BoxPlotFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html#cfn-quicksight-dashboard-boxplotchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html#cfn-quicksight-dashboard-boxplotchartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html#cfn-quicksight-dashboard-boxplotchartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html#cfn-quicksight-dashboard-boxplotchartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html#cfn-quicksight-dashboard-boxplotchartconfiguration-sortconfiguration","Required":false,"Type":"BoxPlotSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html#cfn-quicksight-dashboard-boxplotchartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotchartconfiguration.html#cfn-quicksight-dashboard-boxplotchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BoxPlotFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotfieldwells.html","Properties":{"BoxPlotAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotfieldwells.html#cfn-quicksight-dashboard-boxplotfieldwells-boxplotaggregatedfieldwells","Required":false,"Type":"BoxPlotAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BoxPlotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotoptions.html","Properties":{"AllDataPointsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotoptions.html#cfn-quicksight-dashboard-boxplotoptions-alldatapointsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutlierVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotoptions.html#cfn-quicksight-dashboard-boxplotoptions-outliervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotoptions.html#cfn-quicksight-dashboard-boxplotoptions-styleoptions","Required":false,"Type":"BoxPlotStyleOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BoxPlotSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotsortconfiguration.html","Properties":{"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotsortconfiguration.html#cfn-quicksight-dashboard-boxplotsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"PaginationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotsortconfiguration.html#cfn-quicksight-dashboard-boxplotsortconfiguration-paginationconfiguration","Required":false,"Type":"PaginationConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BoxPlotStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotstyleoptions.html","Properties":{"FillStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotstyleoptions.html#cfn-quicksight-dashboard-boxplotstyleoptions-fillstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.BoxPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotvisual.html#cfn-quicksight-dashboard-boxplotvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotvisual.html#cfn-quicksight-dashboard-boxplotvisual-chartconfiguration","Required":false,"Type":"BoxPlotChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotvisual.html#cfn-quicksight-dashboard-boxplotvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotvisual.html#cfn-quicksight-dashboard-boxplotvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotvisual.html#cfn-quicksight-dashboard-boxplotvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-boxplotvisual.html#cfn-quicksight-dashboard-boxplotvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CalculatedField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-calculatedfield.html","Properties":{"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-calculatedfield.html#cfn-quicksight-dashboard-calculatedfield-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-calculatedfield.html#cfn-quicksight-dashboard-calculatedfield-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-calculatedfield.html#cfn-quicksight-dashboard-calculatedfield-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CalculatedMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-calculatedmeasurefield.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-calculatedmeasurefield.html#cfn-quicksight-dashboard-calculatedmeasurefield-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-calculatedmeasurefield.html#cfn-quicksight-dashboard-calculatedmeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-cascadingcontrolconfiguration.html","Properties":{"SourceControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-cascadingcontrolconfiguration.html#cfn-quicksight-dashboard-cascadingcontrolconfiguration-sourcecontrols","DuplicatesAllowed":true,"ItemType":"CascadingControlSource","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CascadingControlSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-cascadingcontrolsource.html","Properties":{"ColumnToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-cascadingcontrolsource.html#cfn-quicksight-dashboard-cascadingcontrolsource-columntomatch","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"SourceSheetControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-cascadingcontrolsource.html#cfn-quicksight-dashboard-cascadingcontrolsource-sourcesheetcontrolid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CategoricalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoricaldimensionfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoricaldimensionfield.html#cfn-quicksight-dashboard-categoricaldimensionfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoricaldimensionfield.html#cfn-quicksight-dashboard-categoricaldimensionfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoricaldimensionfield.html#cfn-quicksight-dashboard-categoricaldimensionfield-formatconfiguration","Required":false,"Type":"StringFormatConfiguration","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoricaldimensionfield.html#cfn-quicksight-dashboard-categoricaldimensionfield-hierarchyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CategoricalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoricalmeasurefield.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoricalmeasurefield.html#cfn-quicksight-dashboard-categoricalmeasurefield-aggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoricalmeasurefield.html#cfn-quicksight-dashboard-categoricalmeasurefield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoricalmeasurefield.html#cfn-quicksight-dashboard-categoricalmeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoricalmeasurefield.html#cfn-quicksight-dashboard-categoricalmeasurefield-formatconfiguration","Required":false,"Type":"StringFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CategoryDrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categorydrilldownfilter.html","Properties":{"CategoryValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categorydrilldownfilter.html#cfn-quicksight-dashboard-categorydrilldownfilter-categoryvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categorydrilldownfilter.html#cfn-quicksight-dashboard-categorydrilldownfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CategoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoryfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoryfilter.html#cfn-quicksight-dashboard-categoryfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoryfilter.html#cfn-quicksight-dashboard-categoryfilter-configuration","Required":true,"Type":"CategoryFilterConfiguration","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoryfilter.html#cfn-quicksight-dashboard-categoryfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CategoryFilterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoryfilterconfiguration.html","Properties":{"CustomFilterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoryfilterconfiguration.html#cfn-quicksight-dashboard-categoryfilterconfiguration-customfilterconfiguration","Required":false,"Type":"CustomFilterConfiguration","UpdateType":"Mutable"},"CustomFilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoryfilterconfiguration.html#cfn-quicksight-dashboard-categoryfilterconfiguration-customfilterlistconfiguration","Required":false,"Type":"CustomFilterListConfiguration","UpdateType":"Mutable"},"FilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-categoryfilterconfiguration.html#cfn-quicksight-dashboard-categoryfilterconfiguration-filterlistconfiguration","Required":false,"Type":"FilterListConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ChartAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-chartaxislabeloptions.html","Properties":{"AxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-chartaxislabeloptions.html#cfn-quicksight-dashboard-chartaxislabeloptions-axislabeloptions","DuplicatesAllowed":true,"ItemType":"AxisLabelOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"SortIconVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-chartaxislabeloptions.html#cfn-quicksight-dashboard-chartaxislabeloptions-sorticonvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-chartaxislabeloptions.html#cfn-quicksight-dashboard-chartaxislabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-clustermarker.html","Properties":{"SimpleClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-clustermarker.html#cfn-quicksight-dashboard-clustermarker-simpleclustermarker","Required":false,"Type":"SimpleClusterMarker","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ClusterMarkerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-clustermarkerconfiguration.html","Properties":{"ClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-clustermarkerconfiguration.html#cfn-quicksight-dashboard-clustermarkerconfiguration-clustermarker","Required":false,"Type":"ClusterMarker","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-colorscale.html","Properties":{"ColorFillType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-colorscale.html#cfn-quicksight-dashboard-colorscale-colorfilltype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-colorscale.html#cfn-quicksight-dashboard-colorscale-colors","DuplicatesAllowed":true,"ItemType":"DataColor","Required":true,"Type":"List","UpdateType":"Mutable"},"NullValueColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-colorscale.html#cfn-quicksight-dashboard-colorscale-nullvaluecolor","Required":false,"Type":"DataColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ColumnConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnconfiguration.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnconfiguration.html#cfn-quicksight-dashboard-columnconfiguration-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnconfiguration.html#cfn-quicksight-dashboard-columnconfiguration-formatconfiguration","Required":false,"Type":"FormatConfiguration","UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnconfiguration.html#cfn-quicksight-dashboard-columnconfiguration-role","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ColumnHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnhierarchy.html","Properties":{"DateTimeHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnhierarchy.html#cfn-quicksight-dashboard-columnhierarchy-datetimehierarchy","Required":false,"Type":"DateTimeHierarchy","UpdateType":"Mutable"},"ExplicitHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnhierarchy.html#cfn-quicksight-dashboard-columnhierarchy-explicithierarchy","Required":false,"Type":"ExplicitHierarchy","UpdateType":"Mutable"},"PredefinedHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnhierarchy.html#cfn-quicksight-dashboard-columnhierarchy-predefinedhierarchy","Required":false,"Type":"PredefinedHierarchy","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ColumnIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnidentifier.html","Properties":{"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnidentifier.html#cfn-quicksight-dashboard-columnidentifier-columnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnidentifier.html#cfn-quicksight-dashboard-columnidentifier-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ColumnSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnsort.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnsort.html#cfn-quicksight-dashboard-columnsort-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnsort.html#cfn-quicksight-dashboard-columnsort-direction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SortBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columnsort.html#cfn-quicksight-dashboard-columnsort-sortby","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ColumnTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columntooltipitem.html","Properties":{"Aggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columntooltipitem.html#cfn-quicksight-dashboard-columntooltipitem-aggregation","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columntooltipitem.html#cfn-quicksight-dashboard-columntooltipitem-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columntooltipitem.html#cfn-quicksight-dashboard-columntooltipitem-label","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-columntooltipitem.html#cfn-quicksight-dashboard-columntooltipitem-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ComboChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartaggregatedfieldwells.html","Properties":{"BarValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartaggregatedfieldwells.html#cfn-quicksight-dashboard-combochartaggregatedfieldwells-barvalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartaggregatedfieldwells.html#cfn-quicksight-dashboard-combochartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartaggregatedfieldwells.html#cfn-quicksight-dashboard-combochartaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"LineValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartaggregatedfieldwells.html#cfn-quicksight-dashboard-combochartaggregatedfieldwells-linevalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ComboChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html","Properties":{"BarDataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-bardatalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"BarsArrangement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-barsarrangement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-fieldwells","Required":false,"Type":"ComboChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"LineDataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-linedatalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SecondaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-secondaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"SecondaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-secondaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-sortconfiguration","Required":false,"Type":"ComboChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartconfiguration.html#cfn-quicksight-dashboard-combochartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ComboChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartfieldwells.html","Properties":{"ComboChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartfieldwells.html#cfn-quicksight-dashboard-combochartfieldwells-combochartaggregatedfieldwells","Required":false,"Type":"ComboChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ComboChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartsortconfiguration.html#cfn-quicksight-dashboard-combochartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartsortconfiguration.html#cfn-quicksight-dashboard-combochartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartsortconfiguration.html#cfn-quicksight-dashboard-combochartsortconfiguration-coloritemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"ColorSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartsortconfiguration.html#cfn-quicksight-dashboard-combochartsortconfiguration-colorsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ComboChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartvisual.html#cfn-quicksight-dashboard-combochartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartvisual.html#cfn-quicksight-dashboard-combochartvisual-chartconfiguration","Required":false,"Type":"ComboChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartvisual.html#cfn-quicksight-dashboard-combochartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartvisual.html#cfn-quicksight-dashboard-combochartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartvisual.html#cfn-quicksight-dashboard-combochartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-combochartvisual.html#cfn-quicksight-dashboard-combochartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ComparisonConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-comparisonconfiguration.html","Properties":{"ComparisonFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-comparisonconfiguration.html#cfn-quicksight-dashboard-comparisonconfiguration-comparisonformat","Required":false,"Type":"ComparisonFormatConfiguration","UpdateType":"Mutable"},"ComparisonMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-comparisonconfiguration.html#cfn-quicksight-dashboard-comparisonconfiguration-comparisonmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ComparisonFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-comparisonformatconfiguration.html","Properties":{"NumberDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-comparisonformatconfiguration.html#cfn-quicksight-dashboard-comparisonformatconfiguration-numberdisplayformatconfiguration","Required":false,"Type":"NumberDisplayFormatConfiguration","UpdateType":"Mutable"},"PercentageDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-comparisonformatconfiguration.html#cfn-quicksight-dashboard-comparisonformatconfiguration-percentagedisplayformatconfiguration","Required":false,"Type":"PercentageDisplayFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.Computation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-computation.html","Properties":{"Forecast":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-computation.html#cfn-quicksight-dashboard-computation-forecast","Required":false,"Type":"ForecastComputation","UpdateType":"Mutable"},"GrowthRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-computation.html#cfn-quicksight-dashboard-computation-growthrate","Required":false,"Type":"GrowthRateComputation","UpdateType":"Mutable"},"MaximumMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-computation.html#cfn-quicksight-dashboard-computation-maximumminimum","Required":false,"Type":"MaximumMinimumComputation","UpdateType":"Mutable"},"MetricComparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-computation.html#cfn-quicksight-dashboard-computation-metriccomparison","Required":false,"Type":"MetricComparisonComputation","UpdateType":"Mutable"},"PeriodOverPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-computation.html#cfn-quicksight-dashboard-computation-periodoverperiod","Required":false,"Type":"PeriodOverPeriodComputation","UpdateType":"Mutable"},"PeriodToDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-computation.html#cfn-quicksight-dashboard-computation-periodtodate","Required":false,"Type":"PeriodToDateComputation","UpdateType":"Mutable"},"TopBottomMovers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-computation.html#cfn-quicksight-dashboard-computation-topbottommovers","Required":false,"Type":"TopBottomMoversComputation","UpdateType":"Mutable"},"TopBottomRanked":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-computation.html#cfn-quicksight-dashboard-computation-topbottomranked","Required":false,"Type":"TopBottomRankedComputation","UpdateType":"Mutable"},"TotalAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-computation.html#cfn-quicksight-dashboard-computation-totalaggregation","Required":false,"Type":"TotalAggregationComputation","UpdateType":"Mutable"},"UniqueValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-computation.html#cfn-quicksight-dashboard-computation-uniquevalues","Required":false,"Type":"UniqueValuesComputation","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ConditionalFormattingColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingcolor.html","Properties":{"Gradient":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingcolor.html#cfn-quicksight-dashboard-conditionalformattingcolor-gradient","Required":false,"Type":"ConditionalFormattingGradientColor","UpdateType":"Mutable"},"Solid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingcolor.html#cfn-quicksight-dashboard-conditionalformattingcolor-solid","Required":false,"Type":"ConditionalFormattingSolidColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ConditionalFormattingCustomIconCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingcustomiconcondition.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingcustomiconcondition.html#cfn-quicksight-dashboard-conditionalformattingcustomiconcondition-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingcustomiconcondition.html#cfn-quicksight-dashboard-conditionalformattingcustomiconcondition-displayconfiguration","Required":false,"Type":"ConditionalFormattingIconDisplayConfiguration","UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingcustomiconcondition.html#cfn-quicksight-dashboard-conditionalformattingcustomiconcondition-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IconOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingcustomiconcondition.html#cfn-quicksight-dashboard-conditionalformattingcustomiconcondition-iconoptions","Required":true,"Type":"ConditionalFormattingCustomIconOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ConditionalFormattingCustomIconOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingcustomiconoptions.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingcustomiconoptions.html#cfn-quicksight-dashboard-conditionalformattingcustomiconoptions-icon","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UnicodeIcon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingcustomiconoptions.html#cfn-quicksight-dashboard-conditionalformattingcustomiconoptions-unicodeicon","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ConditionalFormattingGradientColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattinggradientcolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattinggradientcolor.html#cfn-quicksight-dashboard-conditionalformattinggradientcolor-color","Required":true,"Type":"GradientColor","UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattinggradientcolor.html#cfn-quicksight-dashboard-conditionalformattinggradientcolor-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ConditionalFormattingIcon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingicon.html","Properties":{"CustomCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingicon.html#cfn-quicksight-dashboard-conditionalformattingicon-customcondition","Required":false,"Type":"ConditionalFormattingCustomIconCondition","UpdateType":"Mutable"},"IconSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingicon.html#cfn-quicksight-dashboard-conditionalformattingicon-iconset","Required":false,"Type":"ConditionalFormattingIconSet","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ConditionalFormattingIconDisplayConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingicondisplayconfiguration.html","Properties":{"IconDisplayOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingicondisplayconfiguration.html#cfn-quicksight-dashboard-conditionalformattingicondisplayconfiguration-icondisplayoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ConditionalFormattingIconSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingiconset.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingiconset.html#cfn-quicksight-dashboard-conditionalformattingiconset-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IconSetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingiconset.html#cfn-quicksight-dashboard-conditionalformattingiconset-iconsettype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ConditionalFormattingSolidColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingsolidcolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingsolidcolor.html#cfn-quicksight-dashboard-conditionalformattingsolidcolor-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-conditionalformattingsolidcolor.html#cfn-quicksight-dashboard-conditionalformattingsolidcolor-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ContributionAnalysisDefault":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-contributionanalysisdefault.html","Properties":{"ContributorDimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-contributionanalysisdefault.html#cfn-quicksight-dashboard-contributionanalysisdefault-contributordimensions","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":true,"Type":"List","UpdateType":"Mutable"},"MeasureFieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-contributionanalysisdefault.html#cfn-quicksight-dashboard-contributionanalysisdefault-measurefieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CurrencyDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-currencydisplayformatconfiguration.html","Properties":{"DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-currencydisplayformatconfiguration.html#cfn-quicksight-dashboard-currencydisplayformatconfiguration-decimalplacesconfiguration","Required":false,"Type":"DecimalPlacesConfiguration","UpdateType":"Mutable"},"NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-currencydisplayformatconfiguration.html#cfn-quicksight-dashboard-currencydisplayformatconfiguration-negativevalueconfiguration","Required":false,"Type":"NegativeValueConfiguration","UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-currencydisplayformatconfiguration.html#cfn-quicksight-dashboard-currencydisplayformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumberScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-currencydisplayformatconfiguration.html#cfn-quicksight-dashboard-currencydisplayformatconfiguration-numberscale","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-currencydisplayformatconfiguration.html#cfn-quicksight-dashboard-currencydisplayformatconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-currencydisplayformatconfiguration.html#cfn-quicksight-dashboard-currencydisplayformatconfiguration-separatorconfiguration","Required":false,"Type":"NumericSeparatorConfiguration","UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-currencydisplayformatconfiguration.html#cfn-quicksight-dashboard-currencydisplayformatconfiguration-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Symbol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-currencydisplayformatconfiguration.html#cfn-quicksight-dashboard-currencydisplayformatconfiguration-symbol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CustomActionFilterOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customactionfilteroperation.html","Properties":{"SelectedFieldsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customactionfilteroperation.html#cfn-quicksight-dashboard-customactionfilteroperation-selectedfieldsconfiguration","Required":true,"Type":"FilterOperationSelectedFieldsConfiguration","UpdateType":"Mutable"},"TargetVisualsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customactionfilteroperation.html#cfn-quicksight-dashboard-customactionfilteroperation-targetvisualsconfiguration","Required":true,"Type":"FilterOperationTargetVisualsConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CustomActionNavigationOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customactionnavigationoperation.html","Properties":{"LocalNavigationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customactionnavigationoperation.html#cfn-quicksight-dashboard-customactionnavigationoperation-localnavigationconfiguration","Required":false,"Type":"LocalNavigationConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CustomActionSetParametersOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customactionsetparametersoperation.html","Properties":{"ParameterValueConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customactionsetparametersoperation.html#cfn-quicksight-dashboard-customactionsetparametersoperation-parametervalueconfigurations","DuplicatesAllowed":true,"ItemType":"SetParameterValueConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CustomActionURLOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customactionurloperation.html","Properties":{"URLTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customactionurloperation.html#cfn-quicksight-dashboard-customactionurloperation-urltarget","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"URLTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customactionurloperation.html#cfn-quicksight-dashboard-customactionurloperation-urltemplate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CustomContentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customcontentconfiguration.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customcontentconfiguration.html#cfn-quicksight-dashboard-customcontentconfiguration-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContentUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customcontentconfiguration.html#cfn-quicksight-dashboard-customcontentconfiguration-contenturl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customcontentconfiguration.html#cfn-quicksight-dashboard-customcontentconfiguration-imagescaling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CustomContentVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customcontentvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customcontentvisual.html#cfn-quicksight-dashboard-customcontentvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customcontentvisual.html#cfn-quicksight-dashboard-customcontentvisual-chartconfiguration","Required":false,"Type":"CustomContentConfiguration","UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customcontentvisual.html#cfn-quicksight-dashboard-customcontentvisual-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customcontentvisual.html#cfn-quicksight-dashboard-customcontentvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customcontentvisual.html#cfn-quicksight-dashboard-customcontentvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customcontentvisual.html#cfn-quicksight-dashboard-customcontentvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CustomFilterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customfilterconfiguration.html","Properties":{"CategoryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customfilterconfiguration.html#cfn-quicksight-dashboard-customfilterconfiguration-categoryvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customfilterconfiguration.html#cfn-quicksight-dashboard-customfilterconfiguration-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customfilterconfiguration.html#cfn-quicksight-dashboard-customfilterconfiguration-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customfilterconfiguration.html#cfn-quicksight-dashboard-customfilterconfiguration-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customfilterconfiguration.html#cfn-quicksight-dashboard-customfilterconfiguration-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CustomFilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customfilterlistconfiguration.html","Properties":{"CategoryValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customfilterlistconfiguration.html#cfn-quicksight-dashboard-customfilterlistconfiguration-categoryvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customfilterlistconfiguration.html#cfn-quicksight-dashboard-customfilterlistconfiguration-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customfilterlistconfiguration.html#cfn-quicksight-dashboard-customfilterlistconfiguration-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customfilterlistconfiguration.html#cfn-quicksight-dashboard-customfilterlistconfiguration-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CustomNarrativeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customnarrativeoptions.html","Properties":{"Narrative":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customnarrativeoptions.html#cfn-quicksight-dashboard-customnarrativeoptions-narrative","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CustomParameterValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customparametervalues.html","Properties":{"DateTimeValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customparametervalues.html#cfn-quicksight-dashboard-customparametervalues-datetimevalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DecimalValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customparametervalues.html#cfn-quicksight-dashboard-customparametervalues-decimalvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"},"IntegerValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customparametervalues.html#cfn-quicksight-dashboard-customparametervalues-integervalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"},"StringValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customparametervalues.html#cfn-quicksight-dashboard-customparametervalues-stringvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.CustomValuesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customvaluesconfiguration.html","Properties":{"CustomValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customvaluesconfiguration.html#cfn-quicksight-dashboard-customvaluesconfiguration-customvalues","Required":true,"Type":"CustomParameterValues","UpdateType":"Mutable"},"IncludeNullValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-customvaluesconfiguration.html#cfn-quicksight-dashboard-customvaluesconfiguration-includenullvalue","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DashboardError":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboarderror.html","Properties":{"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboarderror.html#cfn-quicksight-dashboard-dashboarderror-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboarderror.html#cfn-quicksight-dashboard-dashboarderror-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ViolatedEntities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboarderror.html#cfn-quicksight-dashboard-dashboarderror-violatedentities","DuplicatesAllowed":true,"ItemType":"Entity","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DashboardPublishOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html","Properties":{"AdHocFilteringOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html#cfn-quicksight-dashboard-dashboardpublishoptions-adhocfilteringoption","Required":false,"Type":"AdHocFilteringOption","UpdateType":"Mutable"},"DataPointDrillUpDownOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html#cfn-quicksight-dashboard-dashboardpublishoptions-datapointdrillupdownoption","Required":false,"Type":"DataPointDrillUpDownOption","UpdateType":"Mutable"},"DataPointMenuLabelOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html#cfn-quicksight-dashboard-dashboardpublishoptions-datapointmenulabeloption","Required":false,"Type":"DataPointMenuLabelOption","UpdateType":"Mutable"},"DataPointTooltipOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html#cfn-quicksight-dashboard-dashboardpublishoptions-datapointtooltipoption","Required":false,"Type":"DataPointTooltipOption","UpdateType":"Mutable"},"ExportToCSVOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html#cfn-quicksight-dashboard-dashboardpublishoptions-exporttocsvoption","Required":false,"Type":"ExportToCSVOption","UpdateType":"Mutable"},"ExportWithHiddenFieldsOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html#cfn-quicksight-dashboard-dashboardpublishoptions-exportwithhiddenfieldsoption","Required":false,"Type":"ExportWithHiddenFieldsOption","UpdateType":"Mutable"},"SheetControlsOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html#cfn-quicksight-dashboard-dashboardpublishoptions-sheetcontrolsoption","Required":false,"Type":"SheetControlsOption","UpdateType":"Mutable"},"SheetLayoutElementMaximizationOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html#cfn-quicksight-dashboard-dashboardpublishoptions-sheetlayoutelementmaximizationoption","Required":false,"Type":"SheetLayoutElementMaximizationOption","UpdateType":"Mutable"},"VisualAxisSortOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html#cfn-quicksight-dashboard-dashboardpublishoptions-visualaxissortoption","Required":false,"Type":"VisualAxisSortOption","UpdateType":"Mutable"},"VisualMenuOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html#cfn-quicksight-dashboard-dashboardpublishoptions-visualmenuoption","Required":false,"Type":"VisualMenuOption","UpdateType":"Mutable"},"VisualPublishOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardpublishoptions.html#cfn-quicksight-dashboard-dashboardpublishoptions-visualpublishoptions","Required":false,"Type":"DashboardVisualPublishOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DashboardSourceEntity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardsourceentity.html","Properties":{"SourceTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardsourceentity.html#cfn-quicksight-dashboard-dashboardsourceentity-sourcetemplate","Required":false,"Type":"DashboardSourceTemplate","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DashboardSourceTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardsourcetemplate.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardsourcetemplate.html#cfn-quicksight-dashboard-dashboardsourcetemplate-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetReferences":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardsourcetemplate.html#cfn-quicksight-dashboard-dashboardsourcetemplate-datasetreferences","DuplicatesAllowed":true,"ItemType":"DataSetReference","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DashboardVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversion.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversion.html#cfn-quicksight-dashboard-dashboardversion-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversion.html#cfn-quicksight-dashboard-dashboardversion-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataSetArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversion.html#cfn-quicksight-dashboard-dashboardversion-datasetarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversion.html#cfn-quicksight-dashboard-dashboardversion-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Errors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversion.html#cfn-quicksight-dashboard-dashboardversion-errors","DuplicatesAllowed":true,"ItemType":"DashboardError","Required":false,"Type":"List","UpdateType":"Mutable"},"Sheets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversion.html#cfn-quicksight-dashboard-dashboardversion-sheets","DuplicatesAllowed":true,"ItemType":"Sheet","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceEntityArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversion.html#cfn-quicksight-dashboard-dashboardversion-sourceentityarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversion.html#cfn-quicksight-dashboard-dashboardversion-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThemeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversion.html#cfn-quicksight-dashboard-dashboardversion-themearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversion.html#cfn-quicksight-dashboard-dashboardversion-versionnumber","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DashboardVersionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversiondefinition.html","Properties":{"AnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversiondefinition.html#cfn-quicksight-dashboard-dashboardversiondefinition-analysisdefaults","Required":false,"Type":"AnalysisDefaults","UpdateType":"Mutable"},"CalculatedFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversiondefinition.html#cfn-quicksight-dashboard-dashboardversiondefinition-calculatedfields","DuplicatesAllowed":true,"ItemType":"CalculatedField","Required":false,"Type":"List","UpdateType":"Mutable"},"ColumnConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversiondefinition.html#cfn-quicksight-dashboard-dashboardversiondefinition-columnconfigurations","DuplicatesAllowed":true,"ItemType":"ColumnConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"DataSetIdentifierDeclarations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversiondefinition.html#cfn-quicksight-dashboard-dashboardversiondefinition-datasetidentifierdeclarations","DuplicatesAllowed":true,"ItemType":"DataSetIdentifierDeclaration","Required":true,"Type":"List","UpdateType":"Mutable"},"FilterGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversiondefinition.html#cfn-quicksight-dashboard-dashboardversiondefinition-filtergroups","DuplicatesAllowed":true,"ItemType":"FilterGroup","Required":false,"Type":"List","UpdateType":"Mutable"},"ParameterDeclarations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversiondefinition.html#cfn-quicksight-dashboard-dashboardversiondefinition-parameterdeclarations","DuplicatesAllowed":true,"ItemType":"ParameterDeclaration","Required":false,"Type":"List","UpdateType":"Mutable"},"Sheets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardversiondefinition.html#cfn-quicksight-dashboard-dashboardversiondefinition-sheets","DuplicatesAllowed":true,"ItemType":"SheetDefinition","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DashboardVisualPublishOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardvisualpublishoptions.html","Properties":{"ExportHiddenFieldsOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dashboardvisualpublishoptions.html#cfn-quicksight-dashboard-dashboardvisualpublishoptions-exporthiddenfieldsoption","Required":false,"Type":"ExportHiddenFieldsOption","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataBarsOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-databarsoptions.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-databarsoptions.html#cfn-quicksight-dashboard-databarsoptions-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NegativeColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-databarsoptions.html#cfn-quicksight-dashboard-databarsoptions-negativecolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PositiveColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-databarsoptions.html#cfn-quicksight-dashboard-databarsoptions-positivecolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datacolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datacolor.html#cfn-quicksight-dashboard-datacolor-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datacolor.html#cfn-quicksight-dashboard-datacolor-datavalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataFieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datafieldseriesitem.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datafieldseriesitem.html#cfn-quicksight-dashboard-datafieldseriesitem-axisbinding","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datafieldseriesitem.html#cfn-quicksight-dashboard-datafieldseriesitem-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datafieldseriesitem.html#cfn-quicksight-dashboard-datafieldseriesitem-fieldvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datafieldseriesitem.html#cfn-quicksight-dashboard-datafieldseriesitem-settings","Required":false,"Type":"LineChartSeriesSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeloptions.html","Properties":{"CategoryLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeloptions.html#cfn-quicksight-dashboard-datalabeloptions-categorylabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataLabelTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeloptions.html#cfn-quicksight-dashboard-datalabeloptions-datalabeltypes","DuplicatesAllowed":true,"ItemType":"DataLabelType","Required":false,"Type":"List","UpdateType":"Mutable"},"LabelColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeloptions.html#cfn-quicksight-dashboard-datalabeloptions-labelcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeloptions.html#cfn-quicksight-dashboard-datalabeloptions-labelcontent","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeloptions.html#cfn-quicksight-dashboard-datalabeloptions-labelfontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"MeasureLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeloptions.html#cfn-quicksight-dashboard-datalabeloptions-measurelabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Overlap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeloptions.html#cfn-quicksight-dashboard-datalabeloptions-overlap","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeloptions.html#cfn-quicksight-dashboard-datalabeloptions-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeloptions.html#cfn-quicksight-dashboard-datalabeloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeloptions.html#cfn-quicksight-dashboard-datalabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeltype.html","Properties":{"DataPathLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeltype.html#cfn-quicksight-dashboard-datalabeltype-datapathlabeltype","Required":false,"Type":"DataPathLabelType","UpdateType":"Mutable"},"FieldLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeltype.html#cfn-quicksight-dashboard-datalabeltype-fieldlabeltype","Required":false,"Type":"FieldLabelType","UpdateType":"Mutable"},"MaximumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeltype.html#cfn-quicksight-dashboard-datalabeltype-maximumlabeltype","Required":false,"Type":"MaximumLabelType","UpdateType":"Mutable"},"MinimumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeltype.html#cfn-quicksight-dashboard-datalabeltype-minimumlabeltype","Required":false,"Type":"MinimumLabelType","UpdateType":"Mutable"},"RangeEndsLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datalabeltype.html#cfn-quicksight-dashboard-datalabeltype-rangeendslabeltype","Required":false,"Type":"RangeEndsLabelType","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataPathColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathcolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathcolor.html#cfn-quicksight-dashboard-datapathcolor-color","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Element":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathcolor.html#cfn-quicksight-dashboard-datapathcolor-element","Required":true,"Type":"DataPathValue","UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathcolor.html#cfn-quicksight-dashboard-datapathcolor-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataPathLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathlabeltype.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathlabeltype.html#cfn-quicksight-dashboard-datapathlabeltype-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathlabeltype.html#cfn-quicksight-dashboard-datapathlabeltype-fieldvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathlabeltype.html#cfn-quicksight-dashboard-datapathlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataPathSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathsort.html","Properties":{"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathsort.html#cfn-quicksight-dashboard-datapathsort-direction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SortPaths":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathsort.html#cfn-quicksight-dashboard-datapathsort-sortpaths","DuplicatesAllowed":true,"ItemType":"DataPathValue","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataPathValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathvalue.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathvalue.html#cfn-quicksight-dashboard-datapathvalue-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapathvalue.html#cfn-quicksight-dashboard-datapathvalue-fieldvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataPointDrillUpDownOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapointdrillupdownoption.html","Properties":{"AvailabilityStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapointdrillupdownoption.html#cfn-quicksight-dashboard-datapointdrillupdownoption-availabilitystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataPointMenuLabelOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapointmenulabeloption.html","Properties":{"AvailabilityStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapointmenulabeloption.html#cfn-quicksight-dashboard-datapointmenulabeloption-availabilitystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataPointTooltipOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapointtooltipoption.html","Properties":{"AvailabilityStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datapointtooltipoption.html#cfn-quicksight-dashboard-datapointtooltipoption-availabilitystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataSetIdentifierDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datasetidentifierdeclaration.html","Properties":{"DataSetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datasetidentifierdeclaration.html#cfn-quicksight-dashboard-datasetidentifierdeclaration-datasetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Identifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datasetidentifierdeclaration.html#cfn-quicksight-dashboard-datasetidentifierdeclaration-identifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DataSetReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datasetreference.html","Properties":{"DataSetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datasetreference.html#cfn-quicksight-dashboard-datasetreference-datasetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetPlaceholder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datasetreference.html#cfn-quicksight-dashboard-datasetreference-datasetplaceholder","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DateAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dateaxisoptions.html","Properties":{"MissingDateVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dateaxisoptions.html#cfn-quicksight-dashboard-dateaxisoptions-missingdatevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DateDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datedimensionfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datedimensionfield.html#cfn-quicksight-dashboard-datedimensionfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"DateGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datedimensionfield.html#cfn-quicksight-dashboard-datedimensionfield-dategranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datedimensionfield.html#cfn-quicksight-dashboard-datedimensionfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datedimensionfield.html#cfn-quicksight-dashboard-datedimensionfield-formatconfiguration","Required":false,"Type":"DateTimeFormatConfiguration","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datedimensionfield.html#cfn-quicksight-dashboard-datedimensionfield-hierarchyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DateMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datemeasurefield.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datemeasurefield.html#cfn-quicksight-dashboard-datemeasurefield-aggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datemeasurefield.html#cfn-quicksight-dashboard-datemeasurefield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datemeasurefield.html#cfn-quicksight-dashboard-datemeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datemeasurefield.html#cfn-quicksight-dashboard-datemeasurefield-formatconfiguration","Required":false,"Type":"DateTimeFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DateTimeDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimedefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimedefaultvalues.html#cfn-quicksight-dashboard-datetimedefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"RollingDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimedefaultvalues.html#cfn-quicksight-dashboard-datetimedefaultvalues-rollingdate","Required":false,"Type":"RollingDateConfiguration","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimedefaultvalues.html#cfn-quicksight-dashboard-datetimedefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DateTimeFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeformatconfiguration.html","Properties":{"DateTimeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeformatconfiguration.html#cfn-quicksight-dashboard-datetimeformatconfiguration-datetimeformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeformatconfiguration.html#cfn-quicksight-dashboard-datetimeformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumericFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeformatconfiguration.html#cfn-quicksight-dashboard-datetimeformatconfiguration-numericformatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DateTimeHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimehierarchy.html","Properties":{"DrillDownFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimehierarchy.html#cfn-quicksight-dashboard-datetimehierarchy-drilldownfilters","DuplicatesAllowed":true,"ItemType":"DrillDownFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimehierarchy.html#cfn-quicksight-dashboard-datetimehierarchy-hierarchyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DateTimeParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeparameter.html#cfn-quicksight-dashboard-datetimeparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeparameter.html#cfn-quicksight-dashboard-datetimeparameter-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DateTimeParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeparameterdeclaration.html#cfn-quicksight-dashboard-datetimeparameterdeclaration-defaultvalues","Required":false,"Type":"DateTimeDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeparameterdeclaration.html#cfn-quicksight-dashboard-datetimeparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeparameterdeclaration.html#cfn-quicksight-dashboard-datetimeparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeparameterdeclaration.html#cfn-quicksight-dashboard-datetimeparameterdeclaration-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimeparameterdeclaration.html#cfn-quicksight-dashboard-datetimeparameterdeclaration-valuewhenunset","Required":false,"Type":"DateTimeValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DateTimePickerControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimepickercontroldisplayoptions.html","Properties":{"DateTimeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimepickercontroldisplayoptions.html#cfn-quicksight-dashboard-datetimepickercontroldisplayoptions-datetimeformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimepickercontroldisplayoptions.html#cfn-quicksight-dashboard-datetimepickercontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DateTimeValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimevaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimevaluewhenunsetconfiguration.html#cfn-quicksight-dashboard-datetimevaluewhenunsetconfiguration-customvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-datetimevaluewhenunsetconfiguration.html#cfn-quicksight-dashboard-datetimevaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DecimalDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimaldefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimaldefaultvalues.html#cfn-quicksight-dashboard-decimaldefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimaldefaultvalues.html#cfn-quicksight-dashboard-decimaldefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DecimalParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalparameter.html#cfn-quicksight-dashboard-decimalparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalparameter.html#cfn-quicksight-dashboard-decimalparameter-values","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DecimalParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalparameterdeclaration.html#cfn-quicksight-dashboard-decimalparameterdeclaration-defaultvalues","Required":false,"Type":"DecimalDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalparameterdeclaration.html#cfn-quicksight-dashboard-decimalparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalparameterdeclaration.html#cfn-quicksight-dashboard-decimalparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalparameterdeclaration.html#cfn-quicksight-dashboard-decimalparameterdeclaration-parametervaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalparameterdeclaration.html#cfn-quicksight-dashboard-decimalparameterdeclaration-valuewhenunset","Required":false,"Type":"DecimalValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalplacesconfiguration.html","Properties":{"DecimalPlaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalplacesconfiguration.html#cfn-quicksight-dashboard-decimalplacesconfiguration-decimalplaces","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DecimalValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalvaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalvaluewhenunsetconfiguration.html#cfn-quicksight-dashboard-decimalvaluewhenunsetconfiguration-customvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-decimalvaluewhenunsetconfiguration.html#cfn-quicksight-dashboard-decimalvaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DefaultFreeFormLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultfreeformlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultfreeformlayoutconfiguration.html#cfn-quicksight-dashboard-defaultfreeformlayoutconfiguration-canvassizeoptions","Required":true,"Type":"FreeFormLayoutCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DefaultGridLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultgridlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultgridlayoutconfiguration.html#cfn-quicksight-dashboard-defaultgridlayoutconfiguration-canvassizeoptions","Required":true,"Type":"GridLayoutCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DefaultInteractiveLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultinteractivelayoutconfiguration.html","Properties":{"FreeForm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultinteractivelayoutconfiguration.html#cfn-quicksight-dashboard-defaultinteractivelayoutconfiguration-freeform","Required":false,"Type":"DefaultFreeFormLayoutConfiguration","UpdateType":"Mutable"},"Grid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultinteractivelayoutconfiguration.html#cfn-quicksight-dashboard-defaultinteractivelayoutconfiguration-grid","Required":false,"Type":"DefaultGridLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DefaultNewSheetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultnewsheetconfiguration.html","Properties":{"InteractiveLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultnewsheetconfiguration.html#cfn-quicksight-dashboard-defaultnewsheetconfiguration-interactivelayoutconfiguration","Required":false,"Type":"DefaultInteractiveLayoutConfiguration","UpdateType":"Mutable"},"PaginatedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultnewsheetconfiguration.html#cfn-quicksight-dashboard-defaultnewsheetconfiguration-paginatedlayoutconfiguration","Required":false,"Type":"DefaultPaginatedLayoutConfiguration","UpdateType":"Mutable"},"SheetContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultnewsheetconfiguration.html#cfn-quicksight-dashboard-defaultnewsheetconfiguration-sheetcontenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DefaultPaginatedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultpaginatedlayoutconfiguration.html","Properties":{"SectionBased":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultpaginatedlayoutconfiguration.html#cfn-quicksight-dashboard-defaultpaginatedlayoutconfiguration-sectionbased","Required":false,"Type":"DefaultSectionBasedLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DefaultSectionBasedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultsectionbasedlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-defaultsectionbasedlayoutconfiguration.html#cfn-quicksight-dashboard-defaultsectionbasedlayoutconfiguration-canvassizeoptions","Required":true,"Type":"SectionBasedLayoutCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DestinationParameterValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-destinationparametervalueconfiguration.html","Properties":{"CustomValuesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-destinationparametervalueconfiguration.html#cfn-quicksight-dashboard-destinationparametervalueconfiguration-customvaluesconfiguration","Required":false,"Type":"CustomValuesConfiguration","UpdateType":"Mutable"},"SelectAllValueOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-destinationparametervalueconfiguration.html#cfn-quicksight-dashboard-destinationparametervalueconfiguration-selectallvalueoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-destinationparametervalueconfiguration.html#cfn-quicksight-dashboard-destinationparametervalueconfiguration-sourcecolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"SourceField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-destinationparametervalueconfiguration.html#cfn-quicksight-dashboard-destinationparametervalueconfiguration-sourcefield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-destinationparametervalueconfiguration.html#cfn-quicksight-dashboard-destinationparametervalueconfiguration-sourceparametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dimensionfield.html","Properties":{"CategoricalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dimensionfield.html#cfn-quicksight-dashboard-dimensionfield-categoricaldimensionfield","Required":false,"Type":"CategoricalDimensionField","UpdateType":"Mutable"},"DateDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dimensionfield.html#cfn-quicksight-dashboard-dimensionfield-datedimensionfield","Required":false,"Type":"DateDimensionField","UpdateType":"Mutable"},"NumericalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dimensionfield.html#cfn-quicksight-dashboard-dimensionfield-numericaldimensionfield","Required":false,"Type":"NumericalDimensionField","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DonutCenterOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-donutcenteroptions.html","Properties":{"LabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-donutcenteroptions.html#cfn-quicksight-dashboard-donutcenteroptions-labelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DonutOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-donutoptions.html","Properties":{"ArcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-donutoptions.html#cfn-quicksight-dashboard-donutoptions-arcoptions","Required":false,"Type":"ArcOptions","UpdateType":"Mutable"},"DonutCenterOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-donutoptions.html#cfn-quicksight-dashboard-donutoptions-donutcenteroptions","Required":false,"Type":"DonutCenterOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-drilldownfilter.html","Properties":{"CategoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-drilldownfilter.html#cfn-quicksight-dashboard-drilldownfilter-categoryfilter","Required":false,"Type":"CategoryDrillDownFilter","UpdateType":"Mutable"},"NumericEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-drilldownfilter.html#cfn-quicksight-dashboard-drilldownfilter-numericequalityfilter","Required":false,"Type":"NumericEqualityDrillDownFilter","UpdateType":"Mutable"},"TimeRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-drilldownfilter.html#cfn-quicksight-dashboard-drilldownfilter-timerangefilter","Required":false,"Type":"TimeRangeDrillDownFilter","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DropDownControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dropdowncontroldisplayoptions.html","Properties":{"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dropdowncontroldisplayoptions.html#cfn-quicksight-dashboard-dropdowncontroldisplayoptions-selectalloptions","Required":false,"Type":"ListControlSelectAllOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dropdowncontroldisplayoptions.html#cfn-quicksight-dashboard-dropdowncontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.DynamicDefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dynamicdefaultvalue.html","Properties":{"DefaultValueColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dynamicdefaultvalue.html#cfn-quicksight-dashboard-dynamicdefaultvalue-defaultvaluecolumn","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"GroupNameColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dynamicdefaultvalue.html#cfn-quicksight-dashboard-dynamicdefaultvalue-groupnamecolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"UserNameColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-dynamicdefaultvalue.html#cfn-quicksight-dashboard-dynamicdefaultvalue-usernamecolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.EmptyVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-emptyvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-emptyvisual.html#cfn-quicksight-dashboard-emptyvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-emptyvisual.html#cfn-quicksight-dashboard-emptyvisual-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-emptyvisual.html#cfn-quicksight-dashboard-emptyvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.Entity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-entity.html","Properties":{"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-entity.html#cfn-quicksight-dashboard-entity-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ExcludePeriodConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-excludeperiodconfiguration.html","Properties":{"Amount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-excludeperiodconfiguration.html#cfn-quicksight-dashboard-excludeperiodconfiguration-amount","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Granularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-excludeperiodconfiguration.html#cfn-quicksight-dashboard-excludeperiodconfiguration-granularity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-excludeperiodconfiguration.html#cfn-quicksight-dashboard-excludeperiodconfiguration-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ExplicitHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-explicithierarchy.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-explicithierarchy.html#cfn-quicksight-dashboard-explicithierarchy-columns","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":true,"Type":"List","UpdateType":"Mutable"},"DrillDownFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-explicithierarchy.html#cfn-quicksight-dashboard-explicithierarchy-drilldownfilters","DuplicatesAllowed":true,"ItemType":"DrillDownFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-explicithierarchy.html#cfn-quicksight-dashboard-explicithierarchy-hierarchyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ExportHiddenFieldsOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-exporthiddenfieldsoption.html","Properties":{"AvailabilityStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-exporthiddenfieldsoption.html#cfn-quicksight-dashboard-exporthiddenfieldsoption-availabilitystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ExportToCSVOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-exporttocsvoption.html","Properties":{"AvailabilityStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-exporttocsvoption.html#cfn-quicksight-dashboard-exporttocsvoption-availabilitystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ExportWithHiddenFieldsOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-exportwithhiddenfieldsoption.html","Properties":{"AvailabilityStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-exportwithhiddenfieldsoption.html#cfn-quicksight-dashboard-exportwithhiddenfieldsoption-availabilitystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FieldBasedTooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldbasedtooltip.html","Properties":{"AggregationVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldbasedtooltip.html#cfn-quicksight-dashboard-fieldbasedtooltip-aggregationvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TooltipFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldbasedtooltip.html#cfn-quicksight-dashboard-fieldbasedtooltip-tooltipfields","DuplicatesAllowed":true,"ItemType":"TooltipItem","Required":false,"Type":"List","UpdateType":"Mutable"},"TooltipTitleType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldbasedtooltip.html#cfn-quicksight-dashboard-fieldbasedtooltip-tooltiptitletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FieldLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldlabeltype.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldlabeltype.html#cfn-quicksight-dashboard-fieldlabeltype-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldlabeltype.html#cfn-quicksight-dashboard-fieldlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldseriesitem.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldseriesitem.html#cfn-quicksight-dashboard-fieldseriesitem-axisbinding","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldseriesitem.html#cfn-quicksight-dashboard-fieldseriesitem-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldseriesitem.html#cfn-quicksight-dashboard-fieldseriesitem-settings","Required":false,"Type":"LineChartSeriesSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FieldSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldsort.html","Properties":{"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldsort.html#cfn-quicksight-dashboard-fieldsort-direction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldsort.html#cfn-quicksight-dashboard-fieldsort-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FieldSortOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldsortoptions.html","Properties":{"ColumnSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldsortoptions.html#cfn-quicksight-dashboard-fieldsortoptions-columnsort","Required":false,"Type":"ColumnSort","UpdateType":"Mutable"},"FieldSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldsortoptions.html#cfn-quicksight-dashboard-fieldsortoptions-fieldsort","Required":false,"Type":"FieldSort","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FieldTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldtooltipitem.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldtooltipitem.html#cfn-quicksight-dashboard-fieldtooltipitem-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldtooltipitem.html#cfn-quicksight-dashboard-fieldtooltipitem-label","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fieldtooltipitem.html#cfn-quicksight-dashboard-fieldtooltipitem-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilledMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapaggregatedfieldwells.html","Properties":{"Geospatial":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapaggregatedfieldwells.html#cfn-quicksight-dashboard-filledmapaggregatedfieldwells-geospatial","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapaggregatedfieldwells.html#cfn-quicksight-dashboard-filledmapaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilledMapConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapconditionalformatting.html#cfn-quicksight-dashboard-filledmapconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"FilledMapConditionalFormattingOption","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilledMapConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapconditionalformattingoption.html","Properties":{"Shape":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapconditionalformattingoption.html#cfn-quicksight-dashboard-filledmapconditionalformattingoption-shape","Required":true,"Type":"FilledMapShapeConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilledMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapconfiguration.html","Properties":{"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapconfiguration.html#cfn-quicksight-dashboard-filledmapconfiguration-fieldwells","Required":false,"Type":"FilledMapFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapconfiguration.html#cfn-quicksight-dashboard-filledmapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"MapStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapconfiguration.html#cfn-quicksight-dashboard-filledmapconfiguration-mapstyleoptions","Required":false,"Type":"GeospatialMapStyleOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapconfiguration.html#cfn-quicksight-dashboard-filledmapconfiguration-sortconfiguration","Required":false,"Type":"FilledMapSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapconfiguration.html#cfn-quicksight-dashboard-filledmapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"WindowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapconfiguration.html#cfn-quicksight-dashboard-filledmapconfiguration-windowoptions","Required":false,"Type":"GeospatialWindowOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilledMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapfieldwells.html","Properties":{"FilledMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapfieldwells.html#cfn-quicksight-dashboard-filledmapfieldwells-filledmapaggregatedfieldwells","Required":false,"Type":"FilledMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilledMapShapeConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapshapeconditionalformatting.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapshapeconditionalformatting.html#cfn-quicksight-dashboard-filledmapshapeconditionalformatting-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapshapeconditionalformatting.html#cfn-quicksight-dashboard-filledmapshapeconditionalformatting-format","Required":false,"Type":"ShapeConditionalFormat","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilledMapSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapsortconfiguration.html","Properties":{"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapsortconfiguration.html#cfn-quicksight-dashboard-filledmapsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilledMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapvisual.html#cfn-quicksight-dashboard-filledmapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapvisual.html#cfn-quicksight-dashboard-filledmapvisual-chartconfiguration","Required":false,"Type":"FilledMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapvisual.html#cfn-quicksight-dashboard-filledmapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapvisual.html#cfn-quicksight-dashboard-filledmapvisual-conditionalformatting","Required":false,"Type":"FilledMapConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapvisual.html#cfn-quicksight-dashboard-filledmapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapvisual.html#cfn-quicksight-dashboard-filledmapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filledmapvisual.html#cfn-quicksight-dashboard-filledmapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filter.html","Properties":{"CategoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filter.html#cfn-quicksight-dashboard-filter-categoryfilter","Required":false,"Type":"CategoryFilter","UpdateType":"Mutable"},"NumericEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filter.html#cfn-quicksight-dashboard-filter-numericequalityfilter","Required":false,"Type":"NumericEqualityFilter","UpdateType":"Mutable"},"NumericRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filter.html#cfn-quicksight-dashboard-filter-numericrangefilter","Required":false,"Type":"NumericRangeFilter","UpdateType":"Mutable"},"RelativeDatesFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filter.html#cfn-quicksight-dashboard-filter-relativedatesfilter","Required":false,"Type":"RelativeDatesFilter","UpdateType":"Mutable"},"TimeEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filter.html#cfn-quicksight-dashboard-filter-timeequalityfilter","Required":false,"Type":"TimeEqualityFilter","UpdateType":"Mutable"},"TimeRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filter.html#cfn-quicksight-dashboard-filter-timerangefilter","Required":false,"Type":"TimeRangeFilter","UpdateType":"Mutable"},"TopBottomFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filter.html#cfn-quicksight-dashboard-filter-topbottomfilter","Required":false,"Type":"TopBottomFilter","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtercontrol.html","Properties":{"DateTimePicker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtercontrol.html#cfn-quicksight-dashboard-filtercontrol-datetimepicker","Required":false,"Type":"FilterDateTimePickerControl","UpdateType":"Mutable"},"Dropdown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtercontrol.html#cfn-quicksight-dashboard-filtercontrol-dropdown","Required":false,"Type":"FilterDropDownControl","UpdateType":"Mutable"},"List":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtercontrol.html#cfn-quicksight-dashboard-filtercontrol-list","Required":false,"Type":"FilterListControl","UpdateType":"Mutable"},"RelativeDateTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtercontrol.html#cfn-quicksight-dashboard-filtercontrol-relativedatetime","Required":false,"Type":"FilterRelativeDateTimeControl","UpdateType":"Mutable"},"Slider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtercontrol.html#cfn-quicksight-dashboard-filtercontrol-slider","Required":false,"Type":"FilterSliderControl","UpdateType":"Mutable"},"TextArea":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtercontrol.html#cfn-quicksight-dashboard-filtercontrol-textarea","Required":false,"Type":"FilterTextAreaControl","UpdateType":"Mutable"},"TextField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtercontrol.html#cfn-quicksight-dashboard-filtercontrol-textfield","Required":false,"Type":"FilterTextFieldControl","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterDateTimePickerControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdatetimepickercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdatetimepickercontrol.html#cfn-quicksight-dashboard-filterdatetimepickercontrol-displayoptions","Required":false,"Type":"DateTimePickerControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdatetimepickercontrol.html#cfn-quicksight-dashboard-filterdatetimepickercontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdatetimepickercontrol.html#cfn-quicksight-dashboard-filterdatetimepickercontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdatetimepickercontrol.html#cfn-quicksight-dashboard-filterdatetimepickercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdatetimepickercontrol.html#cfn-quicksight-dashboard-filterdatetimepickercontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterDropDownControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdropdowncontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdropdowncontrol.html#cfn-quicksight-dashboard-filterdropdowncontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdropdowncontrol.html#cfn-quicksight-dashboard-filterdropdowncontrol-displayoptions","Required":false,"Type":"DropDownControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdropdowncontrol.html#cfn-quicksight-dashboard-filterdropdowncontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdropdowncontrol.html#cfn-quicksight-dashboard-filterdropdowncontrol-selectablevalues","Required":false,"Type":"FilterSelectableValues","UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdropdowncontrol.html#cfn-quicksight-dashboard-filterdropdowncontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdropdowncontrol.html#cfn-quicksight-dashboard-filterdropdowncontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterdropdowncontrol.html#cfn-quicksight-dashboard-filterdropdowncontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtergroup.html","Properties":{"CrossDataset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtergroup.html#cfn-quicksight-dashboard-filtergroup-crossdataset","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FilterGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtergroup.html#cfn-quicksight-dashboard-filtergroup-filtergroupid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtergroup.html#cfn-quicksight-dashboard-filtergroup-filters","DuplicatesAllowed":true,"ItemType":"Filter","Required":true,"Type":"List","UpdateType":"Mutable"},"ScopeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtergroup.html#cfn-quicksight-dashboard-filtergroup-scopeconfiguration","Required":true,"Type":"FilterScopeConfiguration","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtergroup.html#cfn-quicksight-dashboard-filtergroup-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistconfiguration.html","Properties":{"CategoryValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistconfiguration.html#cfn-quicksight-dashboard-filterlistconfiguration-categoryvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistconfiguration.html#cfn-quicksight-dashboard-filterlistconfiguration-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistconfiguration.html#cfn-quicksight-dashboard-filterlistconfiguration-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterListControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistcontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistcontrol.html#cfn-quicksight-dashboard-filterlistcontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistcontrol.html#cfn-quicksight-dashboard-filterlistcontrol-displayoptions","Required":false,"Type":"ListControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistcontrol.html#cfn-quicksight-dashboard-filterlistcontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistcontrol.html#cfn-quicksight-dashboard-filterlistcontrol-selectablevalues","Required":false,"Type":"FilterSelectableValues","UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistcontrol.html#cfn-quicksight-dashboard-filterlistcontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistcontrol.html#cfn-quicksight-dashboard-filterlistcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterlistcontrol.html#cfn-quicksight-dashboard-filterlistcontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterOperationSelectedFieldsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filteroperationselectedfieldsconfiguration.html","Properties":{"SelectedColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filteroperationselectedfieldsconfiguration.html#cfn-quicksight-dashboard-filteroperationselectedfieldsconfiguration-selectedcolumns","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filteroperationselectedfieldsconfiguration.html#cfn-quicksight-dashboard-filteroperationselectedfieldsconfiguration-selectedfieldoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectedFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filteroperationselectedfieldsconfiguration.html#cfn-quicksight-dashboard-filteroperationselectedfieldsconfiguration-selectedfields","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterOperationTargetVisualsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filteroperationtargetvisualsconfiguration.html","Properties":{"SameSheetTargetVisualConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filteroperationtargetvisualsconfiguration.html#cfn-quicksight-dashboard-filteroperationtargetvisualsconfiguration-samesheettargetvisualconfiguration","Required":false,"Type":"SameSheetTargetVisualConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterRelativeDateTimeControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterrelativedatetimecontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterrelativedatetimecontrol.html#cfn-quicksight-dashboard-filterrelativedatetimecontrol-displayoptions","Required":false,"Type":"RelativeDateTimeControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterrelativedatetimecontrol.html#cfn-quicksight-dashboard-filterrelativedatetimecontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterrelativedatetimecontrol.html#cfn-quicksight-dashboard-filterrelativedatetimecontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterrelativedatetimecontrol.html#cfn-quicksight-dashboard-filterrelativedatetimecontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterScopeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterscopeconfiguration.html","Properties":{"SelectedSheets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterscopeconfiguration.html#cfn-quicksight-dashboard-filterscopeconfiguration-selectedsheets","Required":false,"Type":"SelectedSheetsFilterScopeConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterSelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterselectablevalues.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterselectablevalues.html#cfn-quicksight-dashboard-filterselectablevalues-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterSliderControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterslidercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterslidercontrol.html#cfn-quicksight-dashboard-filterslidercontrol-displayoptions","Required":false,"Type":"SliderControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterslidercontrol.html#cfn-quicksight-dashboard-filterslidercontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MaximumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterslidercontrol.html#cfn-quicksight-dashboard-filterslidercontrol-maximumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"MinimumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterslidercontrol.html#cfn-quicksight-dashboard-filterslidercontrol-minimumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterslidercontrol.html#cfn-quicksight-dashboard-filterslidercontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterslidercontrol.html#cfn-quicksight-dashboard-filterslidercontrol-stepsize","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterslidercontrol.html#cfn-quicksight-dashboard-filterslidercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filterslidercontrol.html#cfn-quicksight-dashboard-filterslidercontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterTextAreaControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtertextareacontrol.html","Properties":{"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtertextareacontrol.html#cfn-quicksight-dashboard-filtertextareacontrol-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtertextareacontrol.html#cfn-quicksight-dashboard-filtertextareacontrol-displayoptions","Required":false,"Type":"TextAreaControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtertextareacontrol.html#cfn-quicksight-dashboard-filtertextareacontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtertextareacontrol.html#cfn-quicksight-dashboard-filtertextareacontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtertextareacontrol.html#cfn-quicksight-dashboard-filtertextareacontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FilterTextFieldControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtertextfieldcontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtertextfieldcontrol.html#cfn-quicksight-dashboard-filtertextfieldcontrol-displayoptions","Required":false,"Type":"TextFieldControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtertextfieldcontrol.html#cfn-quicksight-dashboard-filtertextfieldcontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtertextfieldcontrol.html#cfn-quicksight-dashboard-filtertextfieldcontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-filtertextfieldcontrol.html#cfn-quicksight-dashboard-filtertextfieldcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fontconfiguration.html","Properties":{"FontColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fontconfiguration.html#cfn-quicksight-dashboard-fontconfiguration-fontcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontDecoration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fontconfiguration.html#cfn-quicksight-dashboard-fontconfiguration-fontdecoration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fontconfiguration.html#cfn-quicksight-dashboard-fontconfiguration-fontsize","Required":false,"Type":"FontSize","UpdateType":"Mutable"},"FontStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fontconfiguration.html#cfn-quicksight-dashboard-fontconfiguration-fontstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fontconfiguration.html#cfn-quicksight-dashboard-fontconfiguration-fontweight","Required":false,"Type":"FontWeight","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FontSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fontsize.html","Properties":{"Relative":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fontsize.html#cfn-quicksight-dashboard-fontsize-relative","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FontWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fontweight.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-fontweight.html#cfn-quicksight-dashboard-fontweight-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ForecastComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html#cfn-quicksight-dashboard-forecastcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CustomSeasonalityValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html#cfn-quicksight-dashboard-forecastcomputation-customseasonalityvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"LowerBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html#cfn-quicksight-dashboard-forecastcomputation-lowerboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html#cfn-quicksight-dashboard-forecastcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PeriodsBackward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html#cfn-quicksight-dashboard-forecastcomputation-periodsbackward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PeriodsForward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html#cfn-quicksight-dashboard-forecastcomputation-periodsforward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PredictionInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html#cfn-quicksight-dashboard-forecastcomputation-predictioninterval","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Seasonality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html#cfn-quicksight-dashboard-forecastcomputation-seasonality","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html#cfn-quicksight-dashboard-forecastcomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"UpperBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html#cfn-quicksight-dashboard-forecastcomputation-upperboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastcomputation.html#cfn-quicksight-dashboard-forecastcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ForecastConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastconfiguration.html","Properties":{"ForecastProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastconfiguration.html#cfn-quicksight-dashboard-forecastconfiguration-forecastproperties","Required":false,"Type":"TimeBasedForecastProperties","UpdateType":"Mutable"},"Scenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastconfiguration.html#cfn-quicksight-dashboard-forecastconfiguration-scenario","Required":false,"Type":"ForecastScenario","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ForecastScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastscenario.html","Properties":{"WhatIfPointScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastscenario.html#cfn-quicksight-dashboard-forecastscenario-whatifpointscenario","Required":false,"Type":"WhatIfPointScenario","UpdateType":"Mutable"},"WhatIfRangeScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-forecastscenario.html#cfn-quicksight-dashboard-forecastscenario-whatifrangescenario","Required":false,"Type":"WhatIfRangeScenario","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-formatconfiguration.html","Properties":{"DateTimeFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-formatconfiguration.html#cfn-quicksight-dashboard-formatconfiguration-datetimeformatconfiguration","Required":false,"Type":"DateTimeFormatConfiguration","UpdateType":"Mutable"},"NumberFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-formatconfiguration.html#cfn-quicksight-dashboard-formatconfiguration-numberformatconfiguration","Required":false,"Type":"NumberFormatConfiguration","UpdateType":"Mutable"},"StringFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-formatconfiguration.html#cfn-quicksight-dashboard-formatconfiguration-stringformatconfiguration","Required":false,"Type":"StringFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FreeFormLayoutCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutcanvassizeoptions.html","Properties":{"ScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutcanvassizeoptions.html#cfn-quicksight-dashboard-freeformlayoutcanvassizeoptions-screencanvassizeoptions","Required":false,"Type":"FreeFormLayoutScreenCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FreeFormLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutconfiguration.html#cfn-quicksight-dashboard-freeformlayoutconfiguration-canvassizeoptions","Required":false,"Type":"FreeFormLayoutCanvasSizeOptions","UpdateType":"Mutable"},"Elements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutconfiguration.html#cfn-quicksight-dashboard-freeformlayoutconfiguration-elements","DuplicatesAllowed":true,"ItemType":"FreeFormLayoutElement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FreeFormLayoutElement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html","Properties":{"BackgroundStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-backgroundstyle","Required":false,"Type":"FreeFormLayoutElementBackgroundStyle","UpdateType":"Mutable"},"BorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-borderstyle","Required":false,"Type":"FreeFormLayoutElementBorderStyle","UpdateType":"Mutable"},"ElementId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-elementid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ElementType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-elementtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-height","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LoadingAnimation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-loadinganimation","Required":false,"Type":"LoadingAnimation","UpdateType":"Mutable"},"RenderingRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-renderingrules","DuplicatesAllowed":true,"ItemType":"SheetElementRenderingRule","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedBorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-selectedborderstyle","Required":false,"Type":"FreeFormLayoutElementBorderStyle","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-width","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"XAxisLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-xaxislocation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"YAxisLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelement.html#cfn-quicksight-dashboard-freeformlayoutelement-yaxislocation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FreeFormLayoutElementBackgroundStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelementbackgroundstyle.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelementbackgroundstyle.html#cfn-quicksight-dashboard-freeformlayoutelementbackgroundstyle-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelementbackgroundstyle.html#cfn-quicksight-dashboard-freeformlayoutelementbackgroundstyle-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FreeFormLayoutElementBorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelementborderstyle.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelementborderstyle.html#cfn-quicksight-dashboard-freeformlayoutelementborderstyle-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutelementborderstyle.html#cfn-quicksight-dashboard-freeformlayoutelementborderstyle-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FreeFormLayoutScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutscreencanvassizeoptions.html","Properties":{"OptimizedViewPortWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformlayoutscreencanvassizeoptions.html#cfn-quicksight-dashboard-freeformlayoutscreencanvassizeoptions-optimizedviewportwidth","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FreeFormSectionLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformsectionlayoutconfiguration.html","Properties":{"Elements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-freeformsectionlayoutconfiguration.html#cfn-quicksight-dashboard-freeformsectionlayoutconfiguration-elements","DuplicatesAllowed":true,"ItemType":"FreeFormLayoutElement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FunnelChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartaggregatedfieldwells.html#cfn-quicksight-dashboard-funnelchartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartaggregatedfieldwells.html#cfn-quicksight-dashboard-funnelchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FunnelChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartconfiguration.html","Properties":{"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartconfiguration.html#cfn-quicksight-dashboard-funnelchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"DataLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartconfiguration.html#cfn-quicksight-dashboard-funnelchartconfiguration-datalabeloptions","Required":false,"Type":"FunnelChartDataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartconfiguration.html#cfn-quicksight-dashboard-funnelchartconfiguration-fieldwells","Required":false,"Type":"FunnelChartFieldWells","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartconfiguration.html#cfn-quicksight-dashboard-funnelchartconfiguration-sortconfiguration","Required":false,"Type":"FunnelChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartconfiguration.html#cfn-quicksight-dashboard-funnelchartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"ValueLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartconfiguration.html#cfn-quicksight-dashboard-funnelchartconfiguration-valuelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartconfiguration.html#cfn-quicksight-dashboard-funnelchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FunnelChartDataLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartdatalabeloptions.html","Properties":{"CategoryLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartdatalabeloptions.html#cfn-quicksight-dashboard-funnelchartdatalabeloptions-categorylabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartdatalabeloptions.html#cfn-quicksight-dashboard-funnelchartdatalabeloptions-labelcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartdatalabeloptions.html#cfn-quicksight-dashboard-funnelchartdatalabeloptions-labelfontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"MeasureDataLabelStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartdatalabeloptions.html#cfn-quicksight-dashboard-funnelchartdatalabeloptions-measuredatalabelstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MeasureLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartdatalabeloptions.html#cfn-quicksight-dashboard-funnelchartdatalabeloptions-measurelabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartdatalabeloptions.html#cfn-quicksight-dashboard-funnelchartdatalabeloptions-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartdatalabeloptions.html#cfn-quicksight-dashboard-funnelchartdatalabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FunnelChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartfieldwells.html","Properties":{"FunnelChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartfieldwells.html#cfn-quicksight-dashboard-funnelchartfieldwells-funnelchartaggregatedfieldwells","Required":false,"Type":"FunnelChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FunnelChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartsortconfiguration.html#cfn-quicksight-dashboard-funnelchartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartsortconfiguration.html#cfn-quicksight-dashboard-funnelchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.FunnelChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartvisual.html#cfn-quicksight-dashboard-funnelchartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartvisual.html#cfn-quicksight-dashboard-funnelchartvisual-chartconfiguration","Required":false,"Type":"FunnelChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartvisual.html#cfn-quicksight-dashboard-funnelchartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartvisual.html#cfn-quicksight-dashboard-funnelchartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartvisual.html#cfn-quicksight-dashboard-funnelchartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-funnelchartvisual.html#cfn-quicksight-dashboard-funnelchartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GaugeChartArcConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartarcconditionalformatting.html","Properties":{"ForegroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartarcconditionalformatting.html#cfn-quicksight-dashboard-gaugechartarcconditionalformatting-foregroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GaugeChartConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartconditionalformatting.html#cfn-quicksight-dashboard-gaugechartconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"GaugeChartConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GaugeChartConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartconditionalformattingoption.html","Properties":{"Arc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartconditionalformattingoption.html#cfn-quicksight-dashboard-gaugechartconditionalformattingoption-arc","Required":false,"Type":"GaugeChartArcConditionalFormatting","UpdateType":"Mutable"},"PrimaryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartconditionalformattingoption.html#cfn-quicksight-dashboard-gaugechartconditionalformattingoption-primaryvalue","Required":false,"Type":"GaugeChartPrimaryValueConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GaugeChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartconfiguration.html","Properties":{"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartconfiguration.html#cfn-quicksight-dashboard-gaugechartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartconfiguration.html#cfn-quicksight-dashboard-gaugechartconfiguration-fieldwells","Required":false,"Type":"GaugeChartFieldWells","UpdateType":"Mutable"},"GaugeChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartconfiguration.html#cfn-quicksight-dashboard-gaugechartconfiguration-gaugechartoptions","Required":false,"Type":"GaugeChartOptions","UpdateType":"Mutable"},"TooltipOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartconfiguration.html#cfn-quicksight-dashboard-gaugechartconfiguration-tooltipoptions","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartconfiguration.html#cfn-quicksight-dashboard-gaugechartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GaugeChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartfieldwells.html","Properties":{"TargetValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartfieldwells.html#cfn-quicksight-dashboard-gaugechartfieldwells-targetvalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartfieldwells.html#cfn-quicksight-dashboard-gaugechartfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GaugeChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartoptions.html","Properties":{"Arc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartoptions.html#cfn-quicksight-dashboard-gaugechartoptions-arc","Required":false,"Type":"ArcConfiguration","UpdateType":"Mutable"},"ArcAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartoptions.html#cfn-quicksight-dashboard-gaugechartoptions-arcaxis","Required":false,"Type":"ArcAxisConfiguration","UpdateType":"Mutable"},"Comparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartoptions.html#cfn-quicksight-dashboard-gaugechartoptions-comparison","Required":false,"Type":"ComparisonConfiguration","UpdateType":"Mutable"},"PrimaryValueDisplayType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartoptions.html#cfn-quicksight-dashboard-gaugechartoptions-primaryvaluedisplaytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrimaryValueFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartoptions.html#cfn-quicksight-dashboard-gaugechartoptions-primaryvaluefontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GaugeChartPrimaryValueConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartprimaryvalueconditionalformatting.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartprimaryvalueconditionalformatting.html#cfn-quicksight-dashboard-gaugechartprimaryvalueconditionalformatting-icon","Required":false,"Type":"ConditionalFormattingIcon","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartprimaryvalueconditionalformatting.html#cfn-quicksight-dashboard-gaugechartprimaryvalueconditionalformatting-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GaugeChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartvisual.html#cfn-quicksight-dashboard-gaugechartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartvisual.html#cfn-quicksight-dashboard-gaugechartvisual-chartconfiguration","Required":false,"Type":"GaugeChartConfiguration","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartvisual.html#cfn-quicksight-dashboard-gaugechartvisual-conditionalformatting","Required":false,"Type":"GaugeChartConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartvisual.html#cfn-quicksight-dashboard-gaugechartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartvisual.html#cfn-quicksight-dashboard-gaugechartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gaugechartvisual.html#cfn-quicksight-dashboard-gaugechartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GeospatialCoordinateBounds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialcoordinatebounds.html","Properties":{"East":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialcoordinatebounds.html#cfn-quicksight-dashboard-geospatialcoordinatebounds-east","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"North":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialcoordinatebounds.html#cfn-quicksight-dashboard-geospatialcoordinatebounds-north","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"South":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialcoordinatebounds.html#cfn-quicksight-dashboard-geospatialcoordinatebounds-south","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"West":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialcoordinatebounds.html#cfn-quicksight-dashboard-geospatialcoordinatebounds-west","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GeospatialHeatmapColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialheatmapcolorscale.html","Properties":{"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialheatmapcolorscale.html#cfn-quicksight-dashboard-geospatialheatmapcolorscale-colors","DuplicatesAllowed":true,"ItemType":"GeospatialHeatmapDataColor","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GeospatialHeatmapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialheatmapconfiguration.html","Properties":{"HeatmapColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialheatmapconfiguration.html#cfn-quicksight-dashboard-geospatialheatmapconfiguration-heatmapcolor","Required":false,"Type":"GeospatialHeatmapColorScale","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GeospatialHeatmapDataColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialheatmapdatacolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialheatmapdatacolor.html#cfn-quicksight-dashboard-geospatialheatmapdatacolor-color","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GeospatialMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapaggregatedfieldwells.html","Properties":{"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapaggregatedfieldwells.html#cfn-quicksight-dashboard-geospatialmapaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Geospatial":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapaggregatedfieldwells.html#cfn-quicksight-dashboard-geospatialmapaggregatedfieldwells-geospatial","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapaggregatedfieldwells.html#cfn-quicksight-dashboard-geospatialmapaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GeospatialMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapconfiguration.html","Properties":{"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapconfiguration.html#cfn-quicksight-dashboard-geospatialmapconfiguration-fieldwells","Required":false,"Type":"GeospatialMapFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapconfiguration.html#cfn-quicksight-dashboard-geospatialmapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"MapStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapconfiguration.html#cfn-quicksight-dashboard-geospatialmapconfiguration-mapstyleoptions","Required":false,"Type":"GeospatialMapStyleOptions","UpdateType":"Mutable"},"PointStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapconfiguration.html#cfn-quicksight-dashboard-geospatialmapconfiguration-pointstyleoptions","Required":false,"Type":"GeospatialPointStyleOptions","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapconfiguration.html#cfn-quicksight-dashboard-geospatialmapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapconfiguration.html#cfn-quicksight-dashboard-geospatialmapconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"WindowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapconfiguration.html#cfn-quicksight-dashboard-geospatialmapconfiguration-windowoptions","Required":false,"Type":"GeospatialWindowOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GeospatialMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapfieldwells.html","Properties":{"GeospatialMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapfieldwells.html#cfn-quicksight-dashboard-geospatialmapfieldwells-geospatialmapaggregatedfieldwells","Required":false,"Type":"GeospatialMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GeospatialMapStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapstyleoptions.html","Properties":{"BaseMapStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapstyleoptions.html#cfn-quicksight-dashboard-geospatialmapstyleoptions-basemapstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GeospatialMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapvisual.html#cfn-quicksight-dashboard-geospatialmapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapvisual.html#cfn-quicksight-dashboard-geospatialmapvisual-chartconfiguration","Required":false,"Type":"GeospatialMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapvisual.html#cfn-quicksight-dashboard-geospatialmapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapvisual.html#cfn-quicksight-dashboard-geospatialmapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapvisual.html#cfn-quicksight-dashboard-geospatialmapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialmapvisual.html#cfn-quicksight-dashboard-geospatialmapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GeospatialPointStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialpointstyleoptions.html","Properties":{"ClusterMarkerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialpointstyleoptions.html#cfn-quicksight-dashboard-geospatialpointstyleoptions-clustermarkerconfiguration","Required":false,"Type":"ClusterMarkerConfiguration","UpdateType":"Mutable"},"HeatmapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialpointstyleoptions.html#cfn-quicksight-dashboard-geospatialpointstyleoptions-heatmapconfiguration","Required":false,"Type":"GeospatialHeatmapConfiguration","UpdateType":"Mutable"},"SelectedPointStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialpointstyleoptions.html#cfn-quicksight-dashboard-geospatialpointstyleoptions-selectedpointstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GeospatialWindowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialwindowoptions.html","Properties":{"Bounds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialwindowoptions.html#cfn-quicksight-dashboard-geospatialwindowoptions-bounds","Required":false,"Type":"GeospatialCoordinateBounds","UpdateType":"Mutable"},"MapZoomMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-geospatialwindowoptions.html#cfn-quicksight-dashboard-geospatialwindowoptions-mapzoommode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GlobalTableBorderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-globaltableborderoptions.html","Properties":{"SideSpecificBorder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-globaltableborderoptions.html#cfn-quicksight-dashboard-globaltableborderoptions-sidespecificborder","Required":false,"Type":"TableSideBorderOptions","UpdateType":"Mutable"},"UniformBorder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-globaltableborderoptions.html#cfn-quicksight-dashboard-globaltableborderoptions-uniformborder","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GradientColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gradientcolor.html","Properties":{"Stops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gradientcolor.html#cfn-quicksight-dashboard-gradientcolor-stops","DuplicatesAllowed":true,"ItemType":"GradientStop","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GradientStop":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gradientstop.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gradientstop.html#cfn-quicksight-dashboard-gradientstop-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gradientstop.html#cfn-quicksight-dashboard-gradientstop-datavalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"GradientOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gradientstop.html#cfn-quicksight-dashboard-gradientstop-gradientoffset","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GridLayoutCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutcanvassizeoptions.html","Properties":{"ScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutcanvassizeoptions.html#cfn-quicksight-dashboard-gridlayoutcanvassizeoptions-screencanvassizeoptions","Required":false,"Type":"GridLayoutScreenCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GridLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutconfiguration.html#cfn-quicksight-dashboard-gridlayoutconfiguration-canvassizeoptions","Required":false,"Type":"GridLayoutCanvasSizeOptions","UpdateType":"Mutable"},"Elements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutconfiguration.html#cfn-quicksight-dashboard-gridlayoutconfiguration-elements","DuplicatesAllowed":true,"ItemType":"GridLayoutElement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GridLayoutElement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutelement.html","Properties":{"ColumnIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutelement.html#cfn-quicksight-dashboard-gridlayoutelement-columnindex","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ColumnSpan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutelement.html#cfn-quicksight-dashboard-gridlayoutelement-columnspan","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"ElementId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutelement.html#cfn-quicksight-dashboard-gridlayoutelement-elementid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ElementType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutelement.html#cfn-quicksight-dashboard-gridlayoutelement-elementtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RowIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutelement.html#cfn-quicksight-dashboard-gridlayoutelement-rowindex","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"RowSpan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutelement.html#cfn-quicksight-dashboard-gridlayoutelement-rowspan","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GridLayoutScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutscreencanvassizeoptions.html","Properties":{"OptimizedViewPortWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutscreencanvassizeoptions.html#cfn-quicksight-dashboard-gridlayoutscreencanvassizeoptions-optimizedviewportwidth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResizeOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-gridlayoutscreencanvassizeoptions.html#cfn-quicksight-dashboard-gridlayoutscreencanvassizeoptions-resizeoption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.GrowthRateComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-growthratecomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-growthratecomputation.html#cfn-quicksight-dashboard-growthratecomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-growthratecomputation.html#cfn-quicksight-dashboard-growthratecomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PeriodSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-growthratecomputation.html#cfn-quicksight-dashboard-growthratecomputation-periodsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-growthratecomputation.html#cfn-quicksight-dashboard-growthratecomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-growthratecomputation.html#cfn-quicksight-dashboard-growthratecomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.HeaderFooterSectionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-headerfootersectionconfiguration.html","Properties":{"Layout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-headerfootersectionconfiguration.html#cfn-quicksight-dashboard-headerfootersectionconfiguration-layout","Required":true,"Type":"SectionLayoutConfiguration","UpdateType":"Mutable"},"SectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-headerfootersectionconfiguration.html#cfn-quicksight-dashboard-headerfootersectionconfiguration-sectionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Style":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-headerfootersectionconfiguration.html#cfn-quicksight-dashboard-headerfootersectionconfiguration-style","Required":false,"Type":"SectionStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.HeatMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapaggregatedfieldwells.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapaggregatedfieldwells.html#cfn-quicksight-dashboard-heatmapaggregatedfieldwells-columns","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Rows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapaggregatedfieldwells.html#cfn-quicksight-dashboard-heatmapaggregatedfieldwells-rows","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapaggregatedfieldwells.html#cfn-quicksight-dashboard-heatmapaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.HeatMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapconfiguration.html","Properties":{"ColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapconfiguration.html#cfn-quicksight-dashboard-heatmapconfiguration-colorscale","Required":false,"Type":"ColorScale","UpdateType":"Mutable"},"ColumnLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapconfiguration.html#cfn-quicksight-dashboard-heatmapconfiguration-columnlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapconfiguration.html#cfn-quicksight-dashboard-heatmapconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapconfiguration.html#cfn-quicksight-dashboard-heatmapconfiguration-fieldwells","Required":false,"Type":"HeatMapFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapconfiguration.html#cfn-quicksight-dashboard-heatmapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"RowLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapconfiguration.html#cfn-quicksight-dashboard-heatmapconfiguration-rowlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapconfiguration.html#cfn-quicksight-dashboard-heatmapconfiguration-sortconfiguration","Required":false,"Type":"HeatMapSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapconfiguration.html#cfn-quicksight-dashboard-heatmapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.HeatMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapfieldwells.html","Properties":{"HeatMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapfieldwells.html#cfn-quicksight-dashboard-heatmapfieldwells-heatmapaggregatedfieldwells","Required":false,"Type":"HeatMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.HeatMapSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapsortconfiguration.html","Properties":{"HeatMapColumnItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapsortconfiguration.html#cfn-quicksight-dashboard-heatmapsortconfiguration-heatmapcolumnitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"HeatMapColumnSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapsortconfiguration.html#cfn-quicksight-dashboard-heatmapsortconfiguration-heatmapcolumnsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"HeatMapRowItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapsortconfiguration.html#cfn-quicksight-dashboard-heatmapsortconfiguration-heatmaprowitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"HeatMapRowSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapsortconfiguration.html#cfn-quicksight-dashboard-heatmapsortconfiguration-heatmaprowsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.HeatMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapvisual.html#cfn-quicksight-dashboard-heatmapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapvisual.html#cfn-quicksight-dashboard-heatmapvisual-chartconfiguration","Required":false,"Type":"HeatMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapvisual.html#cfn-quicksight-dashboard-heatmapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapvisual.html#cfn-quicksight-dashboard-heatmapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapvisual.html#cfn-quicksight-dashboard-heatmapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-heatmapvisual.html#cfn-quicksight-dashboard-heatmapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.HistogramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramaggregatedfieldwells.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramaggregatedfieldwells.html#cfn-quicksight-dashboard-histogramaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.HistogramBinOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogrambinoptions.html","Properties":{"BinCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogrambinoptions.html#cfn-quicksight-dashboard-histogrambinoptions-bincount","Required":false,"Type":"BinCountOptions","UpdateType":"Mutable"},"BinWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogrambinoptions.html#cfn-quicksight-dashboard-histogrambinoptions-binwidth","Required":false,"Type":"BinWidthOptions","UpdateType":"Mutable"},"SelectedBinType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogrambinoptions.html#cfn-quicksight-dashboard-histogrambinoptions-selectedbintype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogrambinoptions.html#cfn-quicksight-dashboard-histogrambinoptions-startvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.HistogramConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramconfiguration.html","Properties":{"BinOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramconfiguration.html#cfn-quicksight-dashboard-histogramconfiguration-binoptions","Required":false,"Type":"HistogramBinOptions","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramconfiguration.html#cfn-quicksight-dashboard-histogramconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramconfiguration.html#cfn-quicksight-dashboard-histogramconfiguration-fieldwells","Required":false,"Type":"HistogramFieldWells","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramconfiguration.html#cfn-quicksight-dashboard-histogramconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramconfiguration.html#cfn-quicksight-dashboard-histogramconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"XAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramconfiguration.html#cfn-quicksight-dashboard-histogramconfiguration-xaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"XAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramconfiguration.html#cfn-quicksight-dashboard-histogramconfiguration-xaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"YAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramconfiguration.html#cfn-quicksight-dashboard-histogramconfiguration-yaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.HistogramFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramfieldwells.html","Properties":{"HistogramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramfieldwells.html#cfn-quicksight-dashboard-histogramfieldwells-histogramaggregatedfieldwells","Required":false,"Type":"HistogramAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.HistogramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramvisual.html#cfn-quicksight-dashboard-histogramvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramvisual.html#cfn-quicksight-dashboard-histogramvisual-chartconfiguration","Required":false,"Type":"HistogramConfiguration","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramvisual.html#cfn-quicksight-dashboard-histogramvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramvisual.html#cfn-quicksight-dashboard-histogramvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-histogramvisual.html#cfn-quicksight-dashboard-histogramvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.InsightConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-insightconfiguration.html","Properties":{"Computations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-insightconfiguration.html#cfn-quicksight-dashboard-insightconfiguration-computations","DuplicatesAllowed":true,"ItemType":"Computation","Required":false,"Type":"List","UpdateType":"Mutable"},"CustomNarrative":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-insightconfiguration.html#cfn-quicksight-dashboard-insightconfiguration-customnarrative","Required":false,"Type":"CustomNarrativeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.InsightVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-insightvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-insightvisual.html#cfn-quicksight-dashboard-insightvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-insightvisual.html#cfn-quicksight-dashboard-insightvisual-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InsightConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-insightvisual.html#cfn-quicksight-dashboard-insightvisual-insightconfiguration","Required":false,"Type":"InsightConfiguration","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-insightvisual.html#cfn-quicksight-dashboard-insightvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-insightvisual.html#cfn-quicksight-dashboard-insightvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-insightvisual.html#cfn-quicksight-dashboard-insightvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.IntegerDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerdefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerdefaultvalues.html#cfn-quicksight-dashboard-integerdefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerdefaultvalues.html#cfn-quicksight-dashboard-integerdefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.IntegerParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerparameter.html#cfn-quicksight-dashboard-integerparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerparameter.html#cfn-quicksight-dashboard-integerparameter-values","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.IntegerParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerparameterdeclaration.html#cfn-quicksight-dashboard-integerparameterdeclaration-defaultvalues","Required":false,"Type":"IntegerDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerparameterdeclaration.html#cfn-quicksight-dashboard-integerparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerparameterdeclaration.html#cfn-quicksight-dashboard-integerparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerparameterdeclaration.html#cfn-quicksight-dashboard-integerparameterdeclaration-parametervaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integerparameterdeclaration.html#cfn-quicksight-dashboard-integerparameterdeclaration-valuewhenunset","Required":false,"Type":"IntegerValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.IntegerValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integervaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integervaluewhenunsetconfiguration.html#cfn-quicksight-dashboard-integervaluewhenunsetconfiguration-customvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-integervaluewhenunsetconfiguration.html#cfn-quicksight-dashboard-integervaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-itemslimitconfiguration.html","Properties":{"ItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-itemslimitconfiguration.html#cfn-quicksight-dashboard-itemslimitconfiguration-itemslimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"OtherCategories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-itemslimitconfiguration.html#cfn-quicksight-dashboard-itemslimitconfiguration-othercategories","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.KPIConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiconditionalformatting.html#cfn-quicksight-dashboard-kpiconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"KPIConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.KPIConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiconditionalformattingoption.html","Properties":{"PrimaryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiconditionalformattingoption.html#cfn-quicksight-dashboard-kpiconditionalformattingoption-primaryvalue","Required":false,"Type":"KPIPrimaryValueConditionalFormatting","UpdateType":"Mutable"},"ProgressBar":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiconditionalformattingoption.html#cfn-quicksight-dashboard-kpiconditionalformattingoption-progressbar","Required":false,"Type":"KPIProgressBarConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.KPIConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiconfiguration.html","Properties":{"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiconfiguration.html#cfn-quicksight-dashboard-kpiconfiguration-fieldwells","Required":false,"Type":"KPIFieldWells","UpdateType":"Mutable"},"KPIOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiconfiguration.html#cfn-quicksight-dashboard-kpiconfiguration-kpioptions","Required":false,"Type":"KPIOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiconfiguration.html#cfn-quicksight-dashboard-kpiconfiguration-sortconfiguration","Required":false,"Type":"KPISortConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.KPIFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpifieldwells.html","Properties":{"TargetValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpifieldwells.html#cfn-quicksight-dashboard-kpifieldwells-targetvalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"TrendGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpifieldwells.html#cfn-quicksight-dashboard-kpifieldwells-trendgroups","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpifieldwells.html#cfn-quicksight-dashboard-kpifieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.KPIOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpioptions.html","Properties":{"Comparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpioptions.html#cfn-quicksight-dashboard-kpioptions-comparison","Required":false,"Type":"ComparisonConfiguration","UpdateType":"Mutable"},"PrimaryValueDisplayType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpioptions.html#cfn-quicksight-dashboard-kpioptions-primaryvaluedisplaytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrimaryValueFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpioptions.html#cfn-quicksight-dashboard-kpioptions-primaryvaluefontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"ProgressBar":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpioptions.html#cfn-quicksight-dashboard-kpioptions-progressbar","Required":false,"Type":"ProgressBarOptions","UpdateType":"Mutable"},"SecondaryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpioptions.html#cfn-quicksight-dashboard-kpioptions-secondaryvalue","Required":false,"Type":"SecondaryValueOptions","UpdateType":"Mutable"},"SecondaryValueFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpioptions.html#cfn-quicksight-dashboard-kpioptions-secondaryvaluefontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"TrendArrows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpioptions.html#cfn-quicksight-dashboard-kpioptions-trendarrows","Required":false,"Type":"TrendArrowOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.KPIPrimaryValueConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiprimaryvalueconditionalformatting.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiprimaryvalueconditionalformatting.html#cfn-quicksight-dashboard-kpiprimaryvalueconditionalformatting-icon","Required":false,"Type":"ConditionalFormattingIcon","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiprimaryvalueconditionalformatting.html#cfn-quicksight-dashboard-kpiprimaryvalueconditionalformatting-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.KPIProgressBarConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiprogressbarconditionalformatting.html","Properties":{"ForegroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpiprogressbarconditionalformatting.html#cfn-quicksight-dashboard-kpiprogressbarconditionalformatting-foregroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.KPISortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpisortconfiguration.html","Properties":{"TrendGroupSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpisortconfiguration.html#cfn-quicksight-dashboard-kpisortconfiguration-trendgroupsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.KPIVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpivisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpivisual.html#cfn-quicksight-dashboard-kpivisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpivisual.html#cfn-quicksight-dashboard-kpivisual-chartconfiguration","Required":false,"Type":"KPIConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpivisual.html#cfn-quicksight-dashboard-kpivisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpivisual.html#cfn-quicksight-dashboard-kpivisual-conditionalformatting","Required":false,"Type":"KPIConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpivisual.html#cfn-quicksight-dashboard-kpivisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpivisual.html#cfn-quicksight-dashboard-kpivisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-kpivisual.html#cfn-quicksight-dashboard-kpivisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-labeloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-labeloptions.html#cfn-quicksight-dashboard-labeloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-labeloptions.html#cfn-quicksight-dashboard-labeloptions-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-labeloptions.html#cfn-quicksight-dashboard-labeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.Layout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-layout.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-layout.html#cfn-quicksight-dashboard-layout-configuration","Required":true,"Type":"LayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-layoutconfiguration.html","Properties":{"FreeFormLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-layoutconfiguration.html#cfn-quicksight-dashboard-layoutconfiguration-freeformlayout","Required":false,"Type":"FreeFormLayoutConfiguration","UpdateType":"Mutable"},"GridLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-layoutconfiguration.html#cfn-quicksight-dashboard-layoutconfiguration-gridlayout","Required":false,"Type":"GridLayoutConfiguration","UpdateType":"Mutable"},"SectionBasedLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-layoutconfiguration.html#cfn-quicksight-dashboard-layoutconfiguration-sectionbasedlayout","Required":false,"Type":"SectionBasedLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LegendOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-legendoptions.html","Properties":{"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-legendoptions.html#cfn-quicksight-dashboard-legendoptions-height","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-legendoptions.html#cfn-quicksight-dashboard-legendoptions-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-legendoptions.html#cfn-quicksight-dashboard-legendoptions-title","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-legendoptions.html#cfn-quicksight-dashboard-legendoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-legendoptions.html#cfn-quicksight-dashboard-legendoptions-width","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LineChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartaggregatedfieldwells.html#cfn-quicksight-dashboard-linechartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartaggregatedfieldwells.html#cfn-quicksight-dashboard-linechartaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartaggregatedfieldwells.html#cfn-quicksight-dashboard-linechartaggregatedfieldwells-smallmultiples","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartaggregatedfieldwells.html#cfn-quicksight-dashboard-linechartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LineChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html","Properties":{"ContributionAnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-contributionanalysisdefaults","DuplicatesAllowed":true,"ItemType":"ContributionAnalysisDefault","Required":false,"Type":"List","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"DefaultSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-defaultseriessettings","Required":false,"Type":"LineChartDefaultSeriesSettings","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-fieldwells","Required":false,"Type":"LineChartFieldWells","UpdateType":"Mutable"},"ForecastConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-forecastconfigurations","DuplicatesAllowed":true,"ItemType":"ForecastConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"LineSeriesAxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SecondaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-secondaryyaxisdisplayoptions","Required":false,"Type":"LineSeriesAxisDisplayOptions","UpdateType":"Mutable"},"SecondaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-secondaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"Series":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-series","DuplicatesAllowed":true,"ItemType":"SeriesItem","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-smallmultiplesoptions","Required":false,"Type":"SmallMultiplesOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-sortconfiguration","Required":false,"Type":"LineChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"XAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-xaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"XAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartconfiguration.html#cfn-quicksight-dashboard-linechartconfiguration-xaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LineChartDefaultSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartdefaultseriessettings.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartdefaultseriessettings.html#cfn-quicksight-dashboard-linechartdefaultseriessettings-axisbinding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartdefaultseriessettings.html#cfn-quicksight-dashboard-linechartdefaultseriessettings-linestylesettings","Required":false,"Type":"LineChartLineStyleSettings","UpdateType":"Mutable"},"MarkerStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartdefaultseriessettings.html#cfn-quicksight-dashboard-linechartdefaultseriessettings-markerstylesettings","Required":false,"Type":"LineChartMarkerStyleSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LineChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartfieldwells.html","Properties":{"LineChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartfieldwells.html#cfn-quicksight-dashboard-linechartfieldwells-linechartaggregatedfieldwells","Required":false,"Type":"LineChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LineChartLineStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartlinestylesettings.html","Properties":{"LineInterpolation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartlinestylesettings.html#cfn-quicksight-dashboard-linechartlinestylesettings-lineinterpolation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartlinestylesettings.html#cfn-quicksight-dashboard-linechartlinestylesettings-linestyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartlinestylesettings.html#cfn-quicksight-dashboard-linechartlinestylesettings-linevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartlinestylesettings.html#cfn-quicksight-dashboard-linechartlinestylesettings-linewidth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LineChartMarkerStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartmarkerstylesettings.html","Properties":{"MarkerColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartmarkerstylesettings.html#cfn-quicksight-dashboard-linechartmarkerstylesettings-markercolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MarkerShape":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartmarkerstylesettings.html#cfn-quicksight-dashboard-linechartmarkerstylesettings-markershape","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MarkerSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartmarkerstylesettings.html#cfn-quicksight-dashboard-linechartmarkerstylesettings-markersize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MarkerVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartmarkerstylesettings.html#cfn-quicksight-dashboard-linechartmarkerstylesettings-markervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LineChartSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartseriessettings.html","Properties":{"LineStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartseriessettings.html#cfn-quicksight-dashboard-linechartseriessettings-linestylesettings","Required":false,"Type":"LineChartLineStyleSettings","UpdateType":"Mutable"},"MarkerStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartseriessettings.html#cfn-quicksight-dashboard-linechartseriessettings-markerstylesettings","Required":false,"Type":"LineChartMarkerStyleSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LineChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartsortconfiguration.html","Properties":{"CategoryItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartsortconfiguration.html#cfn-quicksight-dashboard-linechartsortconfiguration-categoryitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartsortconfiguration.html#cfn-quicksight-dashboard-linechartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartsortconfiguration.html#cfn-quicksight-dashboard-linechartsortconfiguration-coloritemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartsortconfiguration.html#cfn-quicksight-dashboard-linechartsortconfiguration-smallmultipleslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartsortconfiguration.html#cfn-quicksight-dashboard-linechartsortconfiguration-smallmultiplessort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LineChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartvisual.html#cfn-quicksight-dashboard-linechartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartvisual.html#cfn-quicksight-dashboard-linechartvisual-chartconfiguration","Required":false,"Type":"LineChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartvisual.html#cfn-quicksight-dashboard-linechartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartvisual.html#cfn-quicksight-dashboard-linechartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartvisual.html#cfn-quicksight-dashboard-linechartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-linechartvisual.html#cfn-quicksight-dashboard-linechartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LineSeriesAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-lineseriesaxisdisplayoptions.html","Properties":{"AxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-lineseriesaxisdisplayoptions.html#cfn-quicksight-dashboard-lineseriesaxisdisplayoptions-axisoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"MissingDataConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-lineseriesaxisdisplayoptions.html#cfn-quicksight-dashboard-lineseriesaxisdisplayoptions-missingdataconfigurations","DuplicatesAllowed":true,"ItemType":"MissingDataConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ListControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-listcontroldisplayoptions.html","Properties":{"SearchOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-listcontroldisplayoptions.html#cfn-quicksight-dashboard-listcontroldisplayoptions-searchoptions","Required":false,"Type":"ListControlSearchOptions","UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-listcontroldisplayoptions.html#cfn-quicksight-dashboard-listcontroldisplayoptions-selectalloptions","Required":false,"Type":"ListControlSelectAllOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-listcontroldisplayoptions.html#cfn-quicksight-dashboard-listcontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ListControlSearchOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-listcontrolsearchoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-listcontrolsearchoptions.html#cfn-quicksight-dashboard-listcontrolsearchoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ListControlSelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-listcontrolselectalloptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-listcontrolselectalloptions.html#cfn-quicksight-dashboard-listcontrolselectalloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LoadingAnimation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-loadinganimation.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-loadinganimation.html#cfn-quicksight-dashboard-loadinganimation-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LocalNavigationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-localnavigationconfiguration.html","Properties":{"TargetSheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-localnavigationconfiguration.html#cfn-quicksight-dashboard-localnavigationconfiguration-targetsheetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.LongFormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-longformattext.html","Properties":{"PlainText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-longformattext.html#cfn-quicksight-dashboard-longformattext-plaintext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RichText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-longformattext.html#cfn-quicksight-dashboard-longformattext-richtext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.MappedDataSetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-mappeddatasetparameter.html","Properties":{"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-mappeddatasetparameter.html#cfn-quicksight-dashboard-mappeddatasetparameter-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-mappeddatasetparameter.html#cfn-quicksight-dashboard-mappeddatasetparameter-datasetparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.MaximumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-maximumlabeltype.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-maximumlabeltype.html#cfn-quicksight-dashboard-maximumlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.MaximumMinimumComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-maximumminimumcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-maximumminimumcomputation.html#cfn-quicksight-dashboard-maximumminimumcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-maximumminimumcomputation.html#cfn-quicksight-dashboard-maximumminimumcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-maximumminimumcomputation.html#cfn-quicksight-dashboard-maximumminimumcomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-maximumminimumcomputation.html#cfn-quicksight-dashboard-maximumminimumcomputation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-maximumminimumcomputation.html#cfn-quicksight-dashboard-maximumminimumcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.MeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-measurefield.html","Properties":{"CalculatedMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-measurefield.html#cfn-quicksight-dashboard-measurefield-calculatedmeasurefield","Required":false,"Type":"CalculatedMeasureField","UpdateType":"Mutable"},"CategoricalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-measurefield.html#cfn-quicksight-dashboard-measurefield-categoricalmeasurefield","Required":false,"Type":"CategoricalMeasureField","UpdateType":"Mutable"},"DateMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-measurefield.html#cfn-quicksight-dashboard-measurefield-datemeasurefield","Required":false,"Type":"DateMeasureField","UpdateType":"Mutable"},"NumericalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-measurefield.html#cfn-quicksight-dashboard-measurefield-numericalmeasurefield","Required":false,"Type":"NumericalMeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.MetricComparisonComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-metriccomparisoncomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-metriccomparisoncomputation.html#cfn-quicksight-dashboard-metriccomparisoncomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FromValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-metriccomparisoncomputation.html#cfn-quicksight-dashboard-metriccomparisoncomputation-fromvalue","Required":true,"Type":"MeasureField","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-metriccomparisoncomputation.html#cfn-quicksight-dashboard-metriccomparisoncomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-metriccomparisoncomputation.html#cfn-quicksight-dashboard-metriccomparisoncomputation-targetvalue","Required":true,"Type":"MeasureField","UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-metriccomparisoncomputation.html#cfn-quicksight-dashboard-metriccomparisoncomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.MinimumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-minimumlabeltype.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-minimumlabeltype.html#cfn-quicksight-dashboard-minimumlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.MissingDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-missingdataconfiguration.html","Properties":{"TreatmentOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-missingdataconfiguration.html#cfn-quicksight-dashboard-missingdataconfiguration-treatmentoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-negativevalueconfiguration.html","Properties":{"DisplayMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-negativevalueconfiguration.html#cfn-quicksight-dashboard-negativevalueconfiguration-displaymode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-nullvalueformatconfiguration.html","Properties":{"NullString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-nullvalueformatconfiguration.html#cfn-quicksight-dashboard-nullvalueformatconfiguration-nullstring","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumberDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numberdisplayformatconfiguration.html","Properties":{"DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numberdisplayformatconfiguration.html#cfn-quicksight-dashboard-numberdisplayformatconfiguration-decimalplacesconfiguration","Required":false,"Type":"DecimalPlacesConfiguration","UpdateType":"Mutable"},"NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numberdisplayformatconfiguration.html#cfn-quicksight-dashboard-numberdisplayformatconfiguration-negativevalueconfiguration","Required":false,"Type":"NegativeValueConfiguration","UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numberdisplayformatconfiguration.html#cfn-quicksight-dashboard-numberdisplayformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumberScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numberdisplayformatconfiguration.html#cfn-quicksight-dashboard-numberdisplayformatconfiguration-numberscale","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numberdisplayformatconfiguration.html#cfn-quicksight-dashboard-numberdisplayformatconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numberdisplayformatconfiguration.html#cfn-quicksight-dashboard-numberdisplayformatconfiguration-separatorconfiguration","Required":false,"Type":"NumericSeparatorConfiguration","UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numberdisplayformatconfiguration.html#cfn-quicksight-dashboard-numberdisplayformatconfiguration-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumberFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numberformatconfiguration.html","Properties":{"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numberformatconfiguration.html#cfn-quicksight-dashboard-numberformatconfiguration-formatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumericAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericaxisoptions.html","Properties":{"Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericaxisoptions.html#cfn-quicksight-dashboard-numericaxisoptions-range","Required":false,"Type":"AxisDisplayRange","UpdateType":"Mutable"},"Scale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericaxisoptions.html#cfn-quicksight-dashboard-numericaxisoptions-scale","Required":false,"Type":"AxisScale","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumericEqualityDrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalitydrilldownfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalitydrilldownfilter.html#cfn-quicksight-dashboard-numericequalitydrilldownfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalitydrilldownfilter.html#cfn-quicksight-dashboard-numericequalitydrilldownfilter-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumericEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalityfilter.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalityfilter.html#cfn-quicksight-dashboard-numericequalityfilter-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalityfilter.html#cfn-quicksight-dashboard-numericequalityfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalityfilter.html#cfn-quicksight-dashboard-numericequalityfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalityfilter.html#cfn-quicksight-dashboard-numericequalityfilter-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalityfilter.html#cfn-quicksight-dashboard-numericequalityfilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalityfilter.html#cfn-quicksight-dashboard-numericequalityfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalityfilter.html#cfn-quicksight-dashboard-numericequalityfilter-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericequalityfilter.html#cfn-quicksight-dashboard-numericequalityfilter-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumericFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericformatconfiguration.html","Properties":{"CurrencyDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericformatconfiguration.html#cfn-quicksight-dashboard-numericformatconfiguration-currencydisplayformatconfiguration","Required":false,"Type":"CurrencyDisplayFormatConfiguration","UpdateType":"Mutable"},"NumberDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericformatconfiguration.html#cfn-quicksight-dashboard-numericformatconfiguration-numberdisplayformatconfiguration","Required":false,"Type":"NumberDisplayFormatConfiguration","UpdateType":"Mutable"},"PercentageDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericformatconfiguration.html#cfn-quicksight-dashboard-numericformatconfiguration-percentagedisplayformatconfiguration","Required":false,"Type":"PercentageDisplayFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumericRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefilter.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefilter.html#cfn-quicksight-dashboard-numericrangefilter-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefilter.html#cfn-quicksight-dashboard-numericrangefilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefilter.html#cfn-quicksight-dashboard-numericrangefilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncludeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefilter.html#cfn-quicksight-dashboard-numericrangefilter-includemaximum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefilter.html#cfn-quicksight-dashboard-numericrangefilter-includeminimum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefilter.html#cfn-quicksight-dashboard-numericrangefilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RangeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefilter.html#cfn-quicksight-dashboard-numericrangefilter-rangemaximum","Required":false,"Type":"NumericRangeFilterValue","UpdateType":"Mutable"},"RangeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefilter.html#cfn-quicksight-dashboard-numericrangefilter-rangeminimum","Required":false,"Type":"NumericRangeFilterValue","UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefilter.html#cfn-quicksight-dashboard-numericrangefilter-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumericRangeFilterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefiltervalue.html","Properties":{"Parameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefiltervalue.html#cfn-quicksight-dashboard-numericrangefiltervalue-parameter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StaticValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericrangefiltervalue.html#cfn-quicksight-dashboard-numericrangefiltervalue-staticvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumericSeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericseparatorconfiguration.html","Properties":{"DecimalSeparator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericseparatorconfiguration.html#cfn-quicksight-dashboard-numericseparatorconfiguration-decimalseparator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThousandsSeparator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericseparatorconfiguration.html#cfn-quicksight-dashboard-numericseparatorconfiguration-thousandsseparator","Required":false,"Type":"ThousandSeparatorOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumericalAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericalaggregationfunction.html","Properties":{"PercentileAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericalaggregationfunction.html#cfn-quicksight-dashboard-numericalaggregationfunction-percentileaggregation","Required":false,"Type":"PercentileAggregation","UpdateType":"Mutable"},"SimpleNumericalAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericalaggregationfunction.html#cfn-quicksight-dashboard-numericalaggregationfunction-simplenumericalaggregation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumericalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericaldimensionfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericaldimensionfield.html#cfn-quicksight-dashboard-numericaldimensionfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericaldimensionfield.html#cfn-quicksight-dashboard-numericaldimensionfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericaldimensionfield.html#cfn-quicksight-dashboard-numericaldimensionfield-formatconfiguration","Required":false,"Type":"NumberFormatConfiguration","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericaldimensionfield.html#cfn-quicksight-dashboard-numericaldimensionfield-hierarchyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.NumericalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericalmeasurefield.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericalmeasurefield.html#cfn-quicksight-dashboard-numericalmeasurefield-aggregationfunction","Required":false,"Type":"NumericalAggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericalmeasurefield.html#cfn-quicksight-dashboard-numericalmeasurefield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericalmeasurefield.html#cfn-quicksight-dashboard-numericalmeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-numericalmeasurefield.html#cfn-quicksight-dashboard-numericalmeasurefield-formatconfiguration","Required":false,"Type":"NumberFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PaginationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-paginationconfiguration.html","Properties":{"PageNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-paginationconfiguration.html#cfn-quicksight-dashboard-paginationconfiguration-pagenumber","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"PageSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-paginationconfiguration.html#cfn-quicksight-dashboard-paginationconfiguration-pagesize","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PanelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-panelconfiguration.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-panelconfiguration.html#cfn-quicksight-dashboard-panelconfiguration-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BackgroundVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-panelconfiguration.html#cfn-quicksight-dashboard-panelconfiguration-backgroundvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-panelconfiguration.html#cfn-quicksight-dashboard-panelconfiguration-bordercolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-panelconfiguration.html#cfn-quicksight-dashboard-panelconfiguration-borderstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderThickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-panelconfiguration.html#cfn-quicksight-dashboard-panelconfiguration-borderthickness","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-panelconfiguration.html#cfn-quicksight-dashboard-panelconfiguration-bordervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GutterSpacing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-panelconfiguration.html#cfn-quicksight-dashboard-panelconfiguration-gutterspacing","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GutterVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-panelconfiguration.html#cfn-quicksight-dashboard-panelconfiguration-guttervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-panelconfiguration.html#cfn-quicksight-dashboard-panelconfiguration-title","Required":false,"Type":"PanelTitleOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PanelTitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-paneltitleoptions.html","Properties":{"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-paneltitleoptions.html#cfn-quicksight-dashboard-paneltitleoptions-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"HorizontalTextAlignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-paneltitleoptions.html#cfn-quicksight-dashboard-paneltitleoptions-horizontaltextalignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-paneltitleoptions.html#cfn-quicksight-dashboard-paneltitleoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ParameterControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametercontrol.html","Properties":{"DateTimePicker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametercontrol.html#cfn-quicksight-dashboard-parametercontrol-datetimepicker","Required":false,"Type":"ParameterDateTimePickerControl","UpdateType":"Mutable"},"Dropdown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametercontrol.html#cfn-quicksight-dashboard-parametercontrol-dropdown","Required":false,"Type":"ParameterDropDownControl","UpdateType":"Mutable"},"List":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametercontrol.html#cfn-quicksight-dashboard-parametercontrol-list","Required":false,"Type":"ParameterListControl","UpdateType":"Mutable"},"Slider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametercontrol.html#cfn-quicksight-dashboard-parametercontrol-slider","Required":false,"Type":"ParameterSliderControl","UpdateType":"Mutable"},"TextArea":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametercontrol.html#cfn-quicksight-dashboard-parametercontrol-textarea","Required":false,"Type":"ParameterTextAreaControl","UpdateType":"Mutable"},"TextField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametercontrol.html#cfn-quicksight-dashboard-parametercontrol-textfield","Required":false,"Type":"ParameterTextFieldControl","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ParameterDateTimePickerControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdatetimepickercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdatetimepickercontrol.html#cfn-quicksight-dashboard-parameterdatetimepickercontrol-displayoptions","Required":false,"Type":"DateTimePickerControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdatetimepickercontrol.html#cfn-quicksight-dashboard-parameterdatetimepickercontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdatetimepickercontrol.html#cfn-quicksight-dashboard-parameterdatetimepickercontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdatetimepickercontrol.html#cfn-quicksight-dashboard-parameterdatetimepickercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdeclaration.html","Properties":{"DateTimeParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdeclaration.html#cfn-quicksight-dashboard-parameterdeclaration-datetimeparameterdeclaration","Required":false,"Type":"DateTimeParameterDeclaration","UpdateType":"Mutable"},"DecimalParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdeclaration.html#cfn-quicksight-dashboard-parameterdeclaration-decimalparameterdeclaration","Required":false,"Type":"DecimalParameterDeclaration","UpdateType":"Mutable"},"IntegerParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdeclaration.html#cfn-quicksight-dashboard-parameterdeclaration-integerparameterdeclaration","Required":false,"Type":"IntegerParameterDeclaration","UpdateType":"Mutable"},"StringParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdeclaration.html#cfn-quicksight-dashboard-parameterdeclaration-stringparameterdeclaration","Required":false,"Type":"StringParameterDeclaration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ParameterDropDownControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdropdowncontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdropdowncontrol.html#cfn-quicksight-dashboard-parameterdropdowncontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdropdowncontrol.html#cfn-quicksight-dashboard-parameterdropdowncontrol-displayoptions","Required":false,"Type":"DropDownControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdropdowncontrol.html#cfn-quicksight-dashboard-parameterdropdowncontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdropdowncontrol.html#cfn-quicksight-dashboard-parameterdropdowncontrol-selectablevalues","Required":false,"Type":"ParameterSelectableValues","UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdropdowncontrol.html#cfn-quicksight-dashboard-parameterdropdowncontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdropdowncontrol.html#cfn-quicksight-dashboard-parameterdropdowncontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterdropdowncontrol.html#cfn-quicksight-dashboard-parameterdropdowncontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ParameterListControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterlistcontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterlistcontrol.html#cfn-quicksight-dashboard-parameterlistcontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterlistcontrol.html#cfn-quicksight-dashboard-parameterlistcontrol-displayoptions","Required":false,"Type":"ListControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterlistcontrol.html#cfn-quicksight-dashboard-parameterlistcontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterlistcontrol.html#cfn-quicksight-dashboard-parameterlistcontrol-selectablevalues","Required":false,"Type":"ParameterSelectableValues","UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterlistcontrol.html#cfn-quicksight-dashboard-parameterlistcontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterlistcontrol.html#cfn-quicksight-dashboard-parameterlistcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterlistcontrol.html#cfn-quicksight-dashboard-parameterlistcontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ParameterSelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterselectablevalues.html","Properties":{"LinkToDataSetColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterselectablevalues.html#cfn-quicksight-dashboard-parameterselectablevalues-linktodatasetcolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterselectablevalues.html#cfn-quicksight-dashboard-parameterselectablevalues-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ParameterSliderControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterslidercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterslidercontrol.html#cfn-quicksight-dashboard-parameterslidercontrol-displayoptions","Required":false,"Type":"SliderControlDisplayOptions","UpdateType":"Mutable"},"MaximumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterslidercontrol.html#cfn-quicksight-dashboard-parameterslidercontrol-maximumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"MinimumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterslidercontrol.html#cfn-quicksight-dashboard-parameterslidercontrol-minimumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterslidercontrol.html#cfn-quicksight-dashboard-parameterslidercontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterslidercontrol.html#cfn-quicksight-dashboard-parameterslidercontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterslidercontrol.html#cfn-quicksight-dashboard-parameterslidercontrol-stepsize","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameterslidercontrol.html#cfn-quicksight-dashboard-parameterslidercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ParameterTextAreaControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametertextareacontrol.html","Properties":{"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametertextareacontrol.html#cfn-quicksight-dashboard-parametertextareacontrol-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametertextareacontrol.html#cfn-quicksight-dashboard-parametertextareacontrol-displayoptions","Required":false,"Type":"TextAreaControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametertextareacontrol.html#cfn-quicksight-dashboard-parametertextareacontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametertextareacontrol.html#cfn-quicksight-dashboard-parametertextareacontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametertextareacontrol.html#cfn-quicksight-dashboard-parametertextareacontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ParameterTextFieldControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametertextfieldcontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametertextfieldcontrol.html#cfn-quicksight-dashboard-parametertextfieldcontrol-displayoptions","Required":false,"Type":"TextFieldControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametertextfieldcontrol.html#cfn-quicksight-dashboard-parametertextfieldcontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametertextfieldcontrol.html#cfn-quicksight-dashboard-parametertextfieldcontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parametertextfieldcontrol.html#cfn-quicksight-dashboard-parametertextfieldcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameters.html","Properties":{"DateTimeParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameters.html#cfn-quicksight-dashboard-parameters-datetimeparameters","DuplicatesAllowed":true,"ItemType":"DateTimeParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"DecimalParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameters.html#cfn-quicksight-dashboard-parameters-decimalparameters","DuplicatesAllowed":true,"ItemType":"DecimalParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"IntegerParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameters.html#cfn-quicksight-dashboard-parameters-integerparameters","DuplicatesAllowed":true,"ItemType":"IntegerParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"StringParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-parameters.html#cfn-quicksight-dashboard-parameters-stringparameters","DuplicatesAllowed":true,"ItemType":"StringParameter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PercentVisibleRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentvisiblerange.html","Properties":{"From":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentvisiblerange.html#cfn-quicksight-dashboard-percentvisiblerange-from","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"To":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentvisiblerange.html#cfn-quicksight-dashboard-percentvisiblerange-to","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PercentageDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentagedisplayformatconfiguration.html","Properties":{"DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentagedisplayformatconfiguration.html#cfn-quicksight-dashboard-percentagedisplayformatconfiguration-decimalplacesconfiguration","Required":false,"Type":"DecimalPlacesConfiguration","UpdateType":"Mutable"},"NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentagedisplayformatconfiguration.html#cfn-quicksight-dashboard-percentagedisplayformatconfiguration-negativevalueconfiguration","Required":false,"Type":"NegativeValueConfiguration","UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentagedisplayformatconfiguration.html#cfn-quicksight-dashboard-percentagedisplayformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentagedisplayformatconfiguration.html#cfn-quicksight-dashboard-percentagedisplayformatconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentagedisplayformatconfiguration.html#cfn-quicksight-dashboard-percentagedisplayformatconfiguration-separatorconfiguration","Required":false,"Type":"NumericSeparatorConfiguration","UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentagedisplayformatconfiguration.html#cfn-quicksight-dashboard-percentagedisplayformatconfiguration-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PercentileAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentileaggregation.html","Properties":{"PercentileValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-percentileaggregation.html#cfn-quicksight-dashboard-percentileaggregation-percentilevalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PeriodOverPeriodComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-periodoverperiodcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-periodoverperiodcomputation.html#cfn-quicksight-dashboard-periodoverperiodcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-periodoverperiodcomputation.html#cfn-quicksight-dashboard-periodoverperiodcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-periodoverperiodcomputation.html#cfn-quicksight-dashboard-periodoverperiodcomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-periodoverperiodcomputation.html#cfn-quicksight-dashboard-periodoverperiodcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PeriodToDateComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-periodtodatecomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-periodtodatecomputation.html#cfn-quicksight-dashboard-periodtodatecomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-periodtodatecomputation.html#cfn-quicksight-dashboard-periodtodatecomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PeriodTimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-periodtodatecomputation.html#cfn-quicksight-dashboard-periodtodatecomputation-periodtimegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-periodtodatecomputation.html#cfn-quicksight-dashboard-periodtodatecomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-periodtodatecomputation.html#cfn-quicksight-dashboard-periodtodatecomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PieChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartaggregatedfieldwells.html#cfn-quicksight-dashboard-piechartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartaggregatedfieldwells.html#cfn-quicksight-dashboard-piechartaggregatedfieldwells-smallmultiples","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartaggregatedfieldwells.html#cfn-quicksight-dashboard-piechartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PieChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html","Properties":{"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html#cfn-quicksight-dashboard-piechartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ContributionAnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html#cfn-quicksight-dashboard-piechartconfiguration-contributionanalysisdefaults","DuplicatesAllowed":true,"ItemType":"ContributionAnalysisDefault","Required":false,"Type":"List","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html#cfn-quicksight-dashboard-piechartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"DonutOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html#cfn-quicksight-dashboard-piechartconfiguration-donutoptions","Required":false,"Type":"DonutOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html#cfn-quicksight-dashboard-piechartconfiguration-fieldwells","Required":false,"Type":"PieChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html#cfn-quicksight-dashboard-piechartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html#cfn-quicksight-dashboard-piechartconfiguration-smallmultiplesoptions","Required":false,"Type":"SmallMultiplesOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html#cfn-quicksight-dashboard-piechartconfiguration-sortconfiguration","Required":false,"Type":"PieChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html#cfn-quicksight-dashboard-piechartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"ValueLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html#cfn-quicksight-dashboard-piechartconfiguration-valuelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartconfiguration.html#cfn-quicksight-dashboard-piechartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PieChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartfieldwells.html","Properties":{"PieChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartfieldwells.html#cfn-quicksight-dashboard-piechartfieldwells-piechartaggregatedfieldwells","Required":false,"Type":"PieChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PieChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartsortconfiguration.html#cfn-quicksight-dashboard-piechartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartsortconfiguration.html#cfn-quicksight-dashboard-piechartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartsortconfiguration.html#cfn-quicksight-dashboard-piechartsortconfiguration-smallmultipleslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartsortconfiguration.html#cfn-quicksight-dashboard-piechartsortconfiguration-smallmultiplessort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PieChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartvisual.html#cfn-quicksight-dashboard-piechartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartvisual.html#cfn-quicksight-dashboard-piechartvisual-chartconfiguration","Required":false,"Type":"PieChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartvisual.html#cfn-quicksight-dashboard-piechartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartvisual.html#cfn-quicksight-dashboard-piechartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartvisual.html#cfn-quicksight-dashboard-piechartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-piechartvisual.html#cfn-quicksight-dashboard-piechartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotFieldSortOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivotfieldsortoptions.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivotfieldsortoptions.html#cfn-quicksight-dashboard-pivotfieldsortoptions-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SortBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivotfieldsortoptions.html#cfn-quicksight-dashboard-pivotfieldsortoptions-sortby","Required":true,"Type":"PivotTableSortBy","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableaggregatedfieldwells.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableaggregatedfieldwells.html#cfn-quicksight-dashboard-pivottableaggregatedfieldwells-columns","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Rows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableaggregatedfieldwells.html#cfn-quicksight-dashboard-pivottableaggregatedfieldwells-rows","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableaggregatedfieldwells.html#cfn-quicksight-dashboard-pivottableaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableCellConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablecellconditionalformatting.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablecellconditionalformatting.html#cfn-quicksight-dashboard-pivottablecellconditionalformatting-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablecellconditionalformatting.html#cfn-quicksight-dashboard-pivottablecellconditionalformatting-scope","Required":false,"Type":"PivotTableConditionalFormattingScope","UpdateType":"Mutable"},"Scopes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablecellconditionalformatting.html#cfn-quicksight-dashboard-pivottablecellconditionalformatting-scopes","DuplicatesAllowed":true,"ItemType":"PivotTableConditionalFormattingScope","Required":false,"Type":"List","UpdateType":"Mutable"},"TextFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablecellconditionalformatting.html#cfn-quicksight-dashboard-pivottablecellconditionalformatting-textformat","Required":false,"Type":"TextConditionalFormat","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconditionalformatting.html#cfn-quicksight-dashboard-pivottableconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"PivotTableConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconditionalformattingoption.html","Properties":{"Cell":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconditionalformattingoption.html#cfn-quicksight-dashboard-pivottableconditionalformattingoption-cell","Required":false,"Type":"PivotTableCellConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableConditionalFormattingScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconditionalformattingscope.html","Properties":{"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconditionalformattingscope.html#cfn-quicksight-dashboard-pivottableconditionalformattingscope-role","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconfiguration.html","Properties":{"FieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconfiguration.html#cfn-quicksight-dashboard-pivottableconfiguration-fieldoptions","Required":false,"Type":"PivotTableFieldOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconfiguration.html#cfn-quicksight-dashboard-pivottableconfiguration-fieldwells","Required":false,"Type":"PivotTableFieldWells","UpdateType":"Mutable"},"PaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconfiguration.html#cfn-quicksight-dashboard-pivottableconfiguration-paginatedreportoptions","Required":false,"Type":"PivotTablePaginatedReportOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconfiguration.html#cfn-quicksight-dashboard-pivottableconfiguration-sortconfiguration","Required":false,"Type":"PivotTableSortConfiguration","UpdateType":"Mutable"},"TableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconfiguration.html#cfn-quicksight-dashboard-pivottableconfiguration-tableoptions","Required":false,"Type":"PivotTableOptions","UpdateType":"Mutable"},"TotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableconfiguration.html#cfn-quicksight-dashboard-pivottableconfiguration-totaloptions","Required":false,"Type":"PivotTableTotalOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableDataPathOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottabledatapathoption.html","Properties":{"DataPathList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottabledatapathoption.html#cfn-quicksight-dashboard-pivottabledatapathoption-datapathlist","DuplicatesAllowed":true,"ItemType":"DataPathValue","Required":true,"Type":"List","UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottabledatapathoption.html#cfn-quicksight-dashboard-pivottabledatapathoption-width","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableFieldCollapseStateOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldcollapsestateoption.html","Properties":{"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldcollapsestateoption.html#cfn-quicksight-dashboard-pivottablefieldcollapsestateoption-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldcollapsestateoption.html#cfn-quicksight-dashboard-pivottablefieldcollapsestateoption-target","Required":true,"Type":"PivotTableFieldCollapseStateTarget","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableFieldCollapseStateTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldcollapsestatetarget.html","Properties":{"FieldDataPathValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldcollapsestatetarget.html#cfn-quicksight-dashboard-pivottablefieldcollapsestatetarget-fielddatapathvalues","DuplicatesAllowed":true,"ItemType":"DataPathValue","Required":false,"Type":"List","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldcollapsestatetarget.html#cfn-quicksight-dashboard-pivottablefieldcollapsestatetarget-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableFieldOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldoption.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldoption.html#cfn-quicksight-dashboard-pivottablefieldoption-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldoption.html#cfn-quicksight-dashboard-pivottablefieldoption-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldoption.html#cfn-quicksight-dashboard-pivottablefieldoption-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldoptions.html","Properties":{"CollapseStateOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldoptions.html#cfn-quicksight-dashboard-pivottablefieldoptions-collapsestateoptions","DuplicatesAllowed":true,"ItemType":"PivotTableFieldCollapseStateOption","Required":false,"Type":"List","UpdateType":"Mutable"},"DataPathOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldoptions.html#cfn-quicksight-dashboard-pivottablefieldoptions-datapathoptions","DuplicatesAllowed":true,"ItemType":"PivotTableDataPathOption","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldoptions.html#cfn-quicksight-dashboard-pivottablefieldoptions-selectedfieldoptions","DuplicatesAllowed":true,"ItemType":"PivotTableFieldOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableFieldSubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldsubtotaloptions.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldsubtotaloptions.html#cfn-quicksight-dashboard-pivottablefieldsubtotaloptions-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldwells.html","Properties":{"PivotTableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablefieldwells.html#cfn-quicksight-dashboard-pivottablefieldwells-pivottableaggregatedfieldwells","Required":false,"Type":"PivotTableAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableoptions.html","Properties":{"CellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableoptions.html#cfn-quicksight-dashboard-pivottableoptions-cellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"CollapsedRowDimensionsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableoptions.html#cfn-quicksight-dashboard-pivottableoptions-collapsedrowdimensionsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColumnHeaderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableoptions.html#cfn-quicksight-dashboard-pivottableoptions-columnheaderstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"ColumnNamesVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableoptions.html#cfn-quicksight-dashboard-pivottableoptions-columnnamesvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricPlacement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableoptions.html#cfn-quicksight-dashboard-pivottableoptions-metricplacement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RowAlternateColorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableoptions.html#cfn-quicksight-dashboard-pivottableoptions-rowalternatecoloroptions","Required":false,"Type":"RowAlternateColorOptions","UpdateType":"Mutable"},"RowFieldNamesStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableoptions.html#cfn-quicksight-dashboard-pivottableoptions-rowfieldnamesstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"RowHeaderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableoptions.html#cfn-quicksight-dashboard-pivottableoptions-rowheaderstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"SingleMetricVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableoptions.html#cfn-quicksight-dashboard-pivottableoptions-singlemetricvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ToggleButtonsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottableoptions.html#cfn-quicksight-dashboard-pivottableoptions-togglebuttonsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTablePaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablepaginatedreportoptions.html","Properties":{"OverflowColumnHeaderVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablepaginatedreportoptions.html#cfn-quicksight-dashboard-pivottablepaginatedreportoptions-overflowcolumnheadervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerticalOverflowVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablepaginatedreportoptions.html#cfn-quicksight-dashboard-pivottablepaginatedreportoptions-verticaloverflowvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableSortBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablesortby.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablesortby.html#cfn-quicksight-dashboard-pivottablesortby-column","Required":false,"Type":"ColumnSort","UpdateType":"Mutable"},"DataPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablesortby.html#cfn-quicksight-dashboard-pivottablesortby-datapath","Required":false,"Type":"DataPathSort","UpdateType":"Mutable"},"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablesortby.html#cfn-quicksight-dashboard-pivottablesortby-field","Required":false,"Type":"FieldSort","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablesortconfiguration.html","Properties":{"FieldSortOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablesortconfiguration.html#cfn-quicksight-dashboard-pivottablesortconfiguration-fieldsortoptions","DuplicatesAllowed":true,"ItemType":"PivotFieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottabletotaloptions.html","Properties":{"ColumnSubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottabletotaloptions.html#cfn-quicksight-dashboard-pivottabletotaloptions-columnsubtotaloptions","Required":false,"Type":"SubtotalOptions","UpdateType":"Mutable"},"ColumnTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottabletotaloptions.html#cfn-quicksight-dashboard-pivottabletotaloptions-columntotaloptions","Required":false,"Type":"PivotTotalOptions","UpdateType":"Mutable"},"RowSubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottabletotaloptions.html#cfn-quicksight-dashboard-pivottabletotaloptions-rowsubtotaloptions","Required":false,"Type":"SubtotalOptions","UpdateType":"Mutable"},"RowTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottabletotaloptions.html#cfn-quicksight-dashboard-pivottabletotaloptions-rowtotaloptions","Required":false,"Type":"PivotTotalOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablevisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablevisual.html#cfn-quicksight-dashboard-pivottablevisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablevisual.html#cfn-quicksight-dashboard-pivottablevisual-chartconfiguration","Required":false,"Type":"PivotTableConfiguration","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablevisual.html#cfn-quicksight-dashboard-pivottablevisual-conditionalformatting","Required":false,"Type":"PivotTableConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablevisual.html#cfn-quicksight-dashboard-pivottablevisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablevisual.html#cfn-quicksight-dashboard-pivottablevisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottablevisual.html#cfn-quicksight-dashboard-pivottablevisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PivotTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottotaloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottotaloptions.html#cfn-quicksight-dashboard-pivottotaloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricHeaderCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottotaloptions.html#cfn-quicksight-dashboard-pivottotaloptions-metricheadercellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottotaloptions.html#cfn-quicksight-dashboard-pivottotaloptions-placement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScrollStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottotaloptions.html#cfn-quicksight-dashboard-pivottotaloptions-scrollstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TotalCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottotaloptions.html#cfn-quicksight-dashboard-pivottotaloptions-totalcellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottotaloptions.html#cfn-quicksight-dashboard-pivottotaloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-pivottotaloptions.html#cfn-quicksight-dashboard-pivottotaloptions-valuecellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.PredefinedHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-predefinedhierarchy.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-predefinedhierarchy.html#cfn-quicksight-dashboard-predefinedhierarchy-columns","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":true,"Type":"List","UpdateType":"Mutable"},"DrillDownFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-predefinedhierarchy.html#cfn-quicksight-dashboard-predefinedhierarchy-drilldownfilters","DuplicatesAllowed":true,"ItemType":"DrillDownFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-predefinedhierarchy.html#cfn-quicksight-dashboard-predefinedhierarchy-hierarchyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ProgressBarOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-progressbaroptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-progressbaroptions.html#cfn-quicksight-dashboard-progressbaroptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RadarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartaggregatedfieldwells.html#cfn-quicksight-dashboard-radarchartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartaggregatedfieldwells.html#cfn-quicksight-dashboard-radarchartaggregatedfieldwells-color","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartaggregatedfieldwells.html#cfn-quicksight-dashboard-radarchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RadarChartAreaStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartareastylesettings.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartareastylesettings.html#cfn-quicksight-dashboard-radarchartareastylesettings-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RadarChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html","Properties":{"AlternateBandColorsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-alternatebandcolorsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlternateBandEvenColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-alternatebandevencolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlternateBandOddColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-alternatebandoddcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AxesRangeScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-axesrangescale","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BaseSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-baseseriessettings","Required":false,"Type":"RadarChartSeriesSettings","UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-coloraxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-fieldwells","Required":false,"Type":"RadarChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"Shape":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-shape","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-sortconfiguration","Required":false,"Type":"RadarChartSortConfiguration","UpdateType":"Mutable"},"StartAngle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-startangle","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartconfiguration.html#cfn-quicksight-dashboard-radarchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RadarChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartfieldwells.html","Properties":{"RadarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartfieldwells.html#cfn-quicksight-dashboard-radarchartfieldwells-radarchartaggregatedfieldwells","Required":false,"Type":"RadarChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RadarChartSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartseriessettings.html","Properties":{"AreaStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartseriessettings.html#cfn-quicksight-dashboard-radarchartseriessettings-areastylesettings","Required":false,"Type":"RadarChartAreaStyleSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RadarChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartsortconfiguration.html#cfn-quicksight-dashboard-radarchartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartsortconfiguration.html#cfn-quicksight-dashboard-radarchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartsortconfiguration.html#cfn-quicksight-dashboard-radarchartsortconfiguration-coloritemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"ColorSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartsortconfiguration.html#cfn-quicksight-dashboard-radarchartsortconfiguration-colorsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RadarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartvisual.html#cfn-quicksight-dashboard-radarchartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartvisual.html#cfn-quicksight-dashboard-radarchartvisual-chartconfiguration","Required":false,"Type":"RadarChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartvisual.html#cfn-quicksight-dashboard-radarchartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartvisual.html#cfn-quicksight-dashboard-radarchartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartvisual.html#cfn-quicksight-dashboard-radarchartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-radarchartvisual.html#cfn-quicksight-dashboard-radarchartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RangeEndsLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-rangeendslabeltype.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-rangeendslabeltype.html#cfn-quicksight-dashboard-rangeendslabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ReferenceLine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referenceline.html","Properties":{"DataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referenceline.html#cfn-quicksight-dashboard-referenceline-dataconfiguration","Required":true,"Type":"ReferenceLineDataConfiguration","UpdateType":"Mutable"},"LabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referenceline.html#cfn-quicksight-dashboard-referenceline-labelconfiguration","Required":false,"Type":"ReferenceLineLabelConfiguration","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referenceline.html#cfn-quicksight-dashboard-referenceline-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StyleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referenceline.html#cfn-quicksight-dashboard-referenceline-styleconfiguration","Required":false,"Type":"ReferenceLineStyleConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ReferenceLineCustomLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinecustomlabelconfiguration.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinecustomlabelconfiguration.html#cfn-quicksight-dashboard-referencelinecustomlabelconfiguration-customlabel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ReferenceLineDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinedataconfiguration.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinedataconfiguration.html#cfn-quicksight-dashboard-referencelinedataconfiguration-axisbinding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DynamicConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinedataconfiguration.html#cfn-quicksight-dashboard-referencelinedataconfiguration-dynamicconfiguration","Required":false,"Type":"ReferenceLineDynamicDataConfiguration","UpdateType":"Mutable"},"StaticConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinedataconfiguration.html#cfn-quicksight-dashboard-referencelinedataconfiguration-staticconfiguration","Required":false,"Type":"ReferenceLineStaticDataConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ReferenceLineDynamicDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinedynamicdataconfiguration.html","Properties":{"Calculation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinedynamicdataconfiguration.html#cfn-quicksight-dashboard-referencelinedynamicdataconfiguration-calculation","Required":true,"Type":"NumericalAggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinedynamicdataconfiguration.html#cfn-quicksight-dashboard-referencelinedynamicdataconfiguration-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"MeasureAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinedynamicdataconfiguration.html#cfn-quicksight-dashboard-referencelinedynamicdataconfiguration-measureaggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ReferenceLineLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinelabelconfiguration.html","Properties":{"CustomLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinelabelconfiguration.html#cfn-quicksight-dashboard-referencelinelabelconfiguration-customlabelconfiguration","Required":false,"Type":"ReferenceLineCustomLabelConfiguration","UpdateType":"Mutable"},"FontColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinelabelconfiguration.html#cfn-quicksight-dashboard-referencelinelabelconfiguration-fontcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinelabelconfiguration.html#cfn-quicksight-dashboard-referencelinelabelconfiguration-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"HorizontalPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinelabelconfiguration.html#cfn-quicksight-dashboard-referencelinelabelconfiguration-horizontalposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinelabelconfiguration.html#cfn-quicksight-dashboard-referencelinelabelconfiguration-valuelabelconfiguration","Required":false,"Type":"ReferenceLineValueLabelConfiguration","UpdateType":"Mutable"},"VerticalPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinelabelconfiguration.html#cfn-quicksight-dashboard-referencelinelabelconfiguration-verticalposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ReferenceLineStaticDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinestaticdataconfiguration.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinestaticdataconfiguration.html#cfn-quicksight-dashboard-referencelinestaticdataconfiguration-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ReferenceLineStyleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinestyleconfiguration.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinestyleconfiguration.html#cfn-quicksight-dashboard-referencelinestyleconfiguration-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Pattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinestyleconfiguration.html#cfn-quicksight-dashboard-referencelinestyleconfiguration-pattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ReferenceLineValueLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinevaluelabelconfiguration.html","Properties":{"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinevaluelabelconfiguration.html#cfn-quicksight-dashboard-referencelinevaluelabelconfiguration-formatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"},"RelativePosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-referencelinevaluelabelconfiguration.html#cfn-quicksight-dashboard-referencelinevaluelabelconfiguration-relativeposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RelativeDateTimeControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatetimecontroldisplayoptions.html","Properties":{"DateTimeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatetimecontroldisplayoptions.html#cfn-quicksight-dashboard-relativedatetimecontroldisplayoptions-datetimeformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatetimecontroldisplayoptions.html#cfn-quicksight-dashboard-relativedatetimecontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RelativeDatesFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatesfilter.html","Properties":{"AnchorDateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatesfilter.html#cfn-quicksight-dashboard-relativedatesfilter-anchordateconfiguration","Required":true,"Type":"AnchorDateConfiguration","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatesfilter.html#cfn-quicksight-dashboard-relativedatesfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"ExcludePeriodConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatesfilter.html#cfn-quicksight-dashboard-relativedatesfilter-excludeperiodconfiguration","Required":false,"Type":"ExcludePeriodConfiguration","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatesfilter.html#cfn-quicksight-dashboard-relativedatesfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MinimumGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatesfilter.html#cfn-quicksight-dashboard-relativedatesfilter-minimumgranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatesfilter.html#cfn-quicksight-dashboard-relativedatesfilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatesfilter.html#cfn-quicksight-dashboard-relativedatesfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RelativeDateType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatesfilter.html#cfn-quicksight-dashboard-relativedatesfilter-relativedatetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RelativeDateValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatesfilter.html#cfn-quicksight-dashboard-relativedatesfilter-relativedatevalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-relativedatesfilter.html#cfn-quicksight-dashboard-relativedatesfilter-timegranularity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ResourcePermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-resourcepermission.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-resourcepermission.html#cfn-quicksight-dashboard-resourcepermission-actions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-resourcepermission.html#cfn-quicksight-dashboard-resourcepermission-principal","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-resourcepermission.html#cfn-quicksight-dashboard-resourcepermission-resource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RollingDateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-rollingdateconfiguration.html","Properties":{"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-rollingdateconfiguration.html#cfn-quicksight-dashboard-rollingdateconfiguration-datasetidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-rollingdateconfiguration.html#cfn-quicksight-dashboard-rollingdateconfiguration-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.RowAlternateColorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-rowalternatecoloroptions.html","Properties":{"RowAlternateColors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-rowalternatecoloroptions.html#cfn-quicksight-dashboard-rowalternatecoloroptions-rowalternatecolors","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-rowalternatecoloroptions.html#cfn-quicksight-dashboard-rowalternatecoloroptions-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SameSheetTargetVisualConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-samesheettargetvisualconfiguration.html","Properties":{"TargetVisualOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-samesheettargetvisualconfiguration.html#cfn-quicksight-dashboard-samesheettargetvisualconfiguration-targetvisualoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetVisuals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-samesheettargetvisualconfiguration.html#cfn-quicksight-dashboard-samesheettargetvisualconfiguration-targetvisuals","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SankeyDiagramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramaggregatedfieldwells.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramaggregatedfieldwells.html#cfn-quicksight-dashboard-sankeydiagramaggregatedfieldwells-destination","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramaggregatedfieldwells.html#cfn-quicksight-dashboard-sankeydiagramaggregatedfieldwells-source","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramaggregatedfieldwells.html#cfn-quicksight-dashboard-sankeydiagramaggregatedfieldwells-weight","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SankeyDiagramChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramchartconfiguration.html","Properties":{"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramchartconfiguration.html#cfn-quicksight-dashboard-sankeydiagramchartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramchartconfiguration.html#cfn-quicksight-dashboard-sankeydiagramchartconfiguration-fieldwells","Required":false,"Type":"SankeyDiagramFieldWells","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramchartconfiguration.html#cfn-quicksight-dashboard-sankeydiagramchartconfiguration-sortconfiguration","Required":false,"Type":"SankeyDiagramSortConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SankeyDiagramFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramfieldwells.html","Properties":{"SankeyDiagramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramfieldwells.html#cfn-quicksight-dashboard-sankeydiagramfieldwells-sankeydiagramaggregatedfieldwells","Required":false,"Type":"SankeyDiagramAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SankeyDiagramSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramsortconfiguration.html","Properties":{"DestinationItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramsortconfiguration.html#cfn-quicksight-dashboard-sankeydiagramsortconfiguration-destinationitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SourceItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramsortconfiguration.html#cfn-quicksight-dashboard-sankeydiagramsortconfiguration-sourceitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"WeightSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramsortconfiguration.html#cfn-quicksight-dashboard-sankeydiagramsortconfiguration-weightsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SankeyDiagramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramvisual.html#cfn-quicksight-dashboard-sankeydiagramvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramvisual.html#cfn-quicksight-dashboard-sankeydiagramvisual-chartconfiguration","Required":false,"Type":"SankeyDiagramChartConfiguration","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramvisual.html#cfn-quicksight-dashboard-sankeydiagramvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramvisual.html#cfn-quicksight-dashboard-sankeydiagramvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sankeydiagramvisual.html#cfn-quicksight-dashboard-sankeydiagramvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ScatterPlotCategoricallyAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotcategoricallyaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-dashboard-scatterplotcategoricallyaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-dashboard-scatterplotcategoricallyaggregatedfieldwells-label","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-dashboard-scatterplotcategoricallyaggregatedfieldwells-size","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"XAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-dashboard-scatterplotcategoricallyaggregatedfieldwells-xaxis","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"YAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-dashboard-scatterplotcategoricallyaggregatedfieldwells-yaxis","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ScatterPlotConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotconfiguration.html","Properties":{"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotconfiguration.html#cfn-quicksight-dashboard-scatterplotconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotconfiguration.html#cfn-quicksight-dashboard-scatterplotconfiguration-fieldwells","Required":false,"Type":"ScatterPlotFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotconfiguration.html#cfn-quicksight-dashboard-scatterplotconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotconfiguration.html#cfn-quicksight-dashboard-scatterplotconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotconfiguration.html#cfn-quicksight-dashboard-scatterplotconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"XAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotconfiguration.html#cfn-quicksight-dashboard-scatterplotconfiguration-xaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"XAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotconfiguration.html#cfn-quicksight-dashboard-scatterplotconfiguration-xaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"YAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotconfiguration.html#cfn-quicksight-dashboard-scatterplotconfiguration-yaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"YAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotconfiguration.html#cfn-quicksight-dashboard-scatterplotconfiguration-yaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ScatterPlotFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotfieldwells.html","Properties":{"ScatterPlotCategoricallyAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotfieldwells.html#cfn-quicksight-dashboard-scatterplotfieldwells-scatterplotcategoricallyaggregatedfieldwells","Required":false,"Type":"ScatterPlotCategoricallyAggregatedFieldWells","UpdateType":"Mutable"},"ScatterPlotUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotfieldwells.html#cfn-quicksight-dashboard-scatterplotfieldwells-scatterplotunaggregatedfieldwells","Required":false,"Type":"ScatterPlotUnaggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ScatterPlotUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotunaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotunaggregatedfieldwells.html#cfn-quicksight-dashboard-scatterplotunaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotunaggregatedfieldwells.html#cfn-quicksight-dashboard-scatterplotunaggregatedfieldwells-label","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotunaggregatedfieldwells.html#cfn-quicksight-dashboard-scatterplotunaggregatedfieldwells-size","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"XAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotunaggregatedfieldwells.html#cfn-quicksight-dashboard-scatterplotunaggregatedfieldwells-xaxis","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"YAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotunaggregatedfieldwells.html#cfn-quicksight-dashboard-scatterplotunaggregatedfieldwells-yaxis","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ScatterPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotvisual.html#cfn-quicksight-dashboard-scatterplotvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotvisual.html#cfn-quicksight-dashboard-scatterplotvisual-chartconfiguration","Required":false,"Type":"ScatterPlotConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotvisual.html#cfn-quicksight-dashboard-scatterplotvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotvisual.html#cfn-quicksight-dashboard-scatterplotvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotvisual.html#cfn-quicksight-dashboard-scatterplotvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scatterplotvisual.html#cfn-quicksight-dashboard-scatterplotvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ScrollBarOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scrollbaroptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scrollbaroptions.html#cfn-quicksight-dashboard-scrollbaroptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VisibleRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-scrollbaroptions.html#cfn-quicksight-dashboard-scrollbaroptions-visiblerange","Required":false,"Type":"VisibleRangeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SecondaryValueOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-secondaryvalueoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-secondaryvalueoptions.html#cfn-quicksight-dashboard-secondaryvalueoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SectionAfterPageBreak":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionafterpagebreak.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionafterpagebreak.html#cfn-quicksight-dashboard-sectionafterpagebreak-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SectionBasedLayoutCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionbasedlayoutcanvassizeoptions.html","Properties":{"PaperCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionbasedlayoutcanvassizeoptions.html#cfn-quicksight-dashboard-sectionbasedlayoutcanvassizeoptions-papercanvassizeoptions","Required":false,"Type":"SectionBasedLayoutPaperCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SectionBasedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionbasedlayoutconfiguration.html","Properties":{"BodySections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionbasedlayoutconfiguration.html#cfn-quicksight-dashboard-sectionbasedlayoutconfiguration-bodysections","DuplicatesAllowed":true,"ItemType":"BodySectionConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"},"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionbasedlayoutconfiguration.html#cfn-quicksight-dashboard-sectionbasedlayoutconfiguration-canvassizeoptions","Required":true,"Type":"SectionBasedLayoutCanvasSizeOptions","UpdateType":"Mutable"},"FooterSections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionbasedlayoutconfiguration.html#cfn-quicksight-dashboard-sectionbasedlayoutconfiguration-footersections","DuplicatesAllowed":true,"ItemType":"HeaderFooterSectionConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"},"HeaderSections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionbasedlayoutconfiguration.html#cfn-quicksight-dashboard-sectionbasedlayoutconfiguration-headersections","DuplicatesAllowed":true,"ItemType":"HeaderFooterSectionConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SectionBasedLayoutPaperCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionbasedlayoutpapercanvassizeoptions.html","Properties":{"PaperMargin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionbasedlayoutpapercanvassizeoptions.html#cfn-quicksight-dashboard-sectionbasedlayoutpapercanvassizeoptions-papermargin","Required":false,"Type":"Spacing","UpdateType":"Mutable"},"PaperOrientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionbasedlayoutpapercanvassizeoptions.html#cfn-quicksight-dashboard-sectionbasedlayoutpapercanvassizeoptions-paperorientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PaperSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionbasedlayoutpapercanvassizeoptions.html#cfn-quicksight-dashboard-sectionbasedlayoutpapercanvassizeoptions-papersize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SectionLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionlayoutconfiguration.html","Properties":{"FreeFormLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionlayoutconfiguration.html#cfn-quicksight-dashboard-sectionlayoutconfiguration-freeformlayout","Required":true,"Type":"FreeFormSectionLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SectionPageBreakConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionpagebreakconfiguration.html","Properties":{"After":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionpagebreakconfiguration.html#cfn-quicksight-dashboard-sectionpagebreakconfiguration-after","Required":false,"Type":"SectionAfterPageBreak","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SectionStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionstyle.html","Properties":{"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionstyle.html#cfn-quicksight-dashboard-sectionstyle-height","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Padding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sectionstyle.html#cfn-quicksight-dashboard-sectionstyle-padding","Required":false,"Type":"Spacing","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SelectedSheetsFilterScopeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-selectedsheetsfilterscopeconfiguration.html","Properties":{"SheetVisualScopingConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-selectedsheetsfilterscopeconfiguration.html#cfn-quicksight-dashboard-selectedsheetsfilterscopeconfiguration-sheetvisualscopingconfigurations","DuplicatesAllowed":true,"ItemType":"SheetVisualScopingConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-seriesitem.html","Properties":{"DataFieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-seriesitem.html#cfn-quicksight-dashboard-seriesitem-datafieldseriesitem","Required":false,"Type":"DataFieldSeriesItem","UpdateType":"Mutable"},"FieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-seriesitem.html#cfn-quicksight-dashboard-seriesitem-fieldseriesitem","Required":false,"Type":"FieldSeriesItem","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SetParameterValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-setparametervalueconfiguration.html","Properties":{"DestinationParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-setparametervalueconfiguration.html#cfn-quicksight-dashboard-setparametervalueconfiguration-destinationparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-setparametervalueconfiguration.html#cfn-quicksight-dashboard-setparametervalueconfiguration-value","Required":true,"Type":"DestinationParameterValueConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ShapeConditionalFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-shapeconditionalformat.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-shapeconditionalformat.html#cfn-quicksight-dashboard-shapeconditionalformat-backgroundcolor","Required":true,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.Sheet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheet.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheet.html#cfn-quicksight-dashboard-sheet-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheet.html#cfn-quicksight-dashboard-sheet-sheetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SheetControlLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetcontrollayout.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetcontrollayout.html#cfn-quicksight-dashboard-sheetcontrollayout-configuration","Required":true,"Type":"SheetControlLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SheetControlLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetcontrollayoutconfiguration.html","Properties":{"GridLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetcontrollayoutconfiguration.html#cfn-quicksight-dashboard-sheetcontrollayoutconfiguration-gridlayout","Required":false,"Type":"GridLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SheetControlsOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetcontrolsoption.html","Properties":{"VisibilityState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetcontrolsoption.html#cfn-quicksight-dashboard-sheetcontrolsoption-visibilitystate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SheetDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html#cfn-quicksight-dashboard-sheetdefinition-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html#cfn-quicksight-dashboard-sheetdefinition-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilterControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html#cfn-quicksight-dashboard-sheetdefinition-filtercontrols","DuplicatesAllowed":true,"ItemType":"FilterControl","Required":false,"Type":"List","UpdateType":"Mutable"},"Layouts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html#cfn-quicksight-dashboard-sheetdefinition-layouts","DuplicatesAllowed":true,"ItemType":"Layout","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html#cfn-quicksight-dashboard-sheetdefinition-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html#cfn-quicksight-dashboard-sheetdefinition-parametercontrols","DuplicatesAllowed":true,"ItemType":"ParameterControl","Required":false,"Type":"List","UpdateType":"Mutable"},"SheetControlLayouts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html#cfn-quicksight-dashboard-sheetdefinition-sheetcontrollayouts","DuplicatesAllowed":true,"ItemType":"SheetControlLayout","Required":false,"Type":"List","UpdateType":"Mutable"},"SheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html#cfn-quicksight-dashboard-sheetdefinition-sheetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TextBoxes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html#cfn-quicksight-dashboard-sheetdefinition-textboxes","DuplicatesAllowed":true,"ItemType":"SheetTextBox","Required":false,"Type":"List","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html#cfn-quicksight-dashboard-sheetdefinition-title","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visuals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetdefinition.html#cfn-quicksight-dashboard-sheetdefinition-visuals","DuplicatesAllowed":true,"ItemType":"Visual","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SheetElementConfigurationOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetelementconfigurationoverrides.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetelementconfigurationoverrides.html#cfn-quicksight-dashboard-sheetelementconfigurationoverrides-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SheetElementRenderingRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetelementrenderingrule.html","Properties":{"ConfigurationOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetelementrenderingrule.html#cfn-quicksight-dashboard-sheetelementrenderingrule-configurationoverrides","Required":true,"Type":"SheetElementConfigurationOverrides","UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetelementrenderingrule.html#cfn-quicksight-dashboard-sheetelementrenderingrule-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SheetLayoutElementMaximizationOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetlayoutelementmaximizationoption.html","Properties":{"AvailabilityStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetlayoutelementmaximizationoption.html#cfn-quicksight-dashboard-sheetlayoutelementmaximizationoption-availabilitystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SheetTextBox":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheettextbox.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheettextbox.html#cfn-quicksight-dashboard-sheettextbox-content","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SheetTextBoxId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheettextbox.html#cfn-quicksight-dashboard-sheettextbox-sheettextboxid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SheetVisualScopingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetvisualscopingconfiguration.html","Properties":{"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetvisualscopingconfiguration.html#cfn-quicksight-dashboard-sheetvisualscopingconfiguration-scope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetvisualscopingconfiguration.html#cfn-quicksight-dashboard-sheetvisualscopingconfiguration-sheetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VisualIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-sheetvisualscopingconfiguration.html#cfn-quicksight-dashboard-sheetvisualscopingconfiguration-visualids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ShortFormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-shortformattext.html","Properties":{"PlainText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-shortformattext.html#cfn-quicksight-dashboard-shortformattext-plaintext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RichText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-shortformattext.html#cfn-quicksight-dashboard-shortformattext-richtext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SimpleClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-simpleclustermarker.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-simpleclustermarker.html#cfn-quicksight-dashboard-simpleclustermarker-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SliderControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-slidercontroldisplayoptions.html","Properties":{"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-slidercontroldisplayoptions.html#cfn-quicksight-dashboard-slidercontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-smallmultiplesoptions.html","Properties":{"MaxVisibleColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-smallmultiplesoptions.html#cfn-quicksight-dashboard-smallmultiplesoptions-maxvisiblecolumns","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaxVisibleRows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-smallmultiplesoptions.html#cfn-quicksight-dashboard-smallmultiplesoptions-maxvisiblerows","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PanelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-smallmultiplesoptions.html#cfn-quicksight-dashboard-smallmultiplesoptions-panelconfiguration","Required":false,"Type":"PanelConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.Spacing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-spacing.html","Properties":{"Bottom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-spacing.html#cfn-quicksight-dashboard-spacing-bottom","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Left":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-spacing.html#cfn-quicksight-dashboard-spacing-left","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Right":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-spacing.html#cfn-quicksight-dashboard-spacing-right","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Top":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-spacing.html#cfn-quicksight-dashboard-spacing-top","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.StringDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringdefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringdefaultvalues.html#cfn-quicksight-dashboard-stringdefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringdefaultvalues.html#cfn-quicksight-dashboard-stringdefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.StringFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringformatconfiguration.html","Properties":{"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringformatconfiguration.html#cfn-quicksight-dashboard-stringformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumericFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringformatconfiguration.html#cfn-quicksight-dashboard-stringformatconfiguration-numericformatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.StringParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringparameter.html#cfn-quicksight-dashboard-stringparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringparameter.html#cfn-quicksight-dashboard-stringparameter-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.StringParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringparameterdeclaration.html#cfn-quicksight-dashboard-stringparameterdeclaration-defaultvalues","Required":false,"Type":"StringDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringparameterdeclaration.html#cfn-quicksight-dashboard-stringparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringparameterdeclaration.html#cfn-quicksight-dashboard-stringparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringparameterdeclaration.html#cfn-quicksight-dashboard-stringparameterdeclaration-parametervaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringparameterdeclaration.html#cfn-quicksight-dashboard-stringparameterdeclaration-valuewhenunset","Required":false,"Type":"StringValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.StringValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringvaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringvaluewhenunsetconfiguration.html#cfn-quicksight-dashboard-stringvaluewhenunsetconfiguration-customvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-stringvaluewhenunsetconfiguration.html#cfn-quicksight-dashboard-stringvaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.SubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-subtotaloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-subtotaloptions.html#cfn-quicksight-dashboard-subtotaloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-subtotaloptions.html#cfn-quicksight-dashboard-subtotaloptions-fieldlevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldLevelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-subtotaloptions.html#cfn-quicksight-dashboard-subtotaloptions-fieldleveloptions","DuplicatesAllowed":true,"ItemType":"PivotTableFieldSubtotalOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricHeaderCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-subtotaloptions.html#cfn-quicksight-dashboard-subtotaloptions-metricheadercellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-subtotaloptions.html#cfn-quicksight-dashboard-subtotaloptions-totalcellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-subtotaloptions.html#cfn-quicksight-dashboard-subtotaloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-subtotaloptions.html#cfn-quicksight-dashboard-subtotaloptions-valuecellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableaggregatedfieldwells.html","Properties":{"GroupBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableaggregatedfieldwells.html#cfn-quicksight-dashboard-tableaggregatedfieldwells-groupby","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableaggregatedfieldwells.html#cfn-quicksight-dashboard-tableaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableBorderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableborderoptions.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableborderoptions.html#cfn-quicksight-dashboard-tableborderoptions-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Style":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableborderoptions.html#cfn-quicksight-dashboard-tableborderoptions-style","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Thickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableborderoptions.html#cfn-quicksight-dashboard-tableborderoptions-thickness","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableCellConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellconditionalformatting.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellconditionalformatting.html#cfn-quicksight-dashboard-tablecellconditionalformatting-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TextFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellconditionalformatting.html#cfn-quicksight-dashboard-tablecellconditionalformatting-textformat","Required":false,"Type":"TextConditionalFormat","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableCellImageSizingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellimagesizingconfiguration.html","Properties":{"TableCellImageScalingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellimagesizingconfiguration.html#cfn-quicksight-dashboard-tablecellimagesizingconfiguration-tablecellimagescalingconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellstyle.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellstyle.html#cfn-quicksight-dashboard-tablecellstyle-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Border":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellstyle.html#cfn-quicksight-dashboard-tablecellstyle-border","Required":false,"Type":"GlobalTableBorderOptions","UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellstyle.html#cfn-quicksight-dashboard-tablecellstyle-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellstyle.html#cfn-quicksight-dashboard-tablecellstyle-height","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"HorizontalTextAlignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellstyle.html#cfn-quicksight-dashboard-tablecellstyle-horizontaltextalignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextWrap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellstyle.html#cfn-quicksight-dashboard-tablecellstyle-textwrap","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerticalTextAlignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellstyle.html#cfn-quicksight-dashboard-tablecellstyle-verticaltextalignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablecellstyle.html#cfn-quicksight-dashboard-tablecellstyle-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconditionalformatting.html#cfn-quicksight-dashboard-tableconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"TableConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconditionalformattingoption.html","Properties":{"Cell":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconditionalformattingoption.html#cfn-quicksight-dashboard-tableconditionalformattingoption-cell","Required":false,"Type":"TableCellConditionalFormatting","UpdateType":"Mutable"},"Row":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconditionalformattingoption.html#cfn-quicksight-dashboard-tableconditionalformattingoption-row","Required":false,"Type":"TableRowConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconfiguration.html","Properties":{"FieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconfiguration.html#cfn-quicksight-dashboard-tableconfiguration-fieldoptions","Required":false,"Type":"TableFieldOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconfiguration.html#cfn-quicksight-dashboard-tableconfiguration-fieldwells","Required":false,"Type":"TableFieldWells","UpdateType":"Mutable"},"PaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconfiguration.html#cfn-quicksight-dashboard-tableconfiguration-paginatedreportoptions","Required":false,"Type":"TablePaginatedReportOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconfiguration.html#cfn-quicksight-dashboard-tableconfiguration-sortconfiguration","Required":false,"Type":"TableSortConfiguration","UpdateType":"Mutable"},"TableInlineVisualizations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconfiguration.html#cfn-quicksight-dashboard-tableconfiguration-tableinlinevisualizations","DuplicatesAllowed":true,"ItemType":"TableInlineVisualization","Required":false,"Type":"List","UpdateType":"Mutable"},"TableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconfiguration.html#cfn-quicksight-dashboard-tableconfiguration-tableoptions","Required":false,"Type":"TableOptions","UpdateType":"Mutable"},"TotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableconfiguration.html#cfn-quicksight-dashboard-tableconfiguration-totaloptions","Required":false,"Type":"TotalOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableFieldCustomIconContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldcustomiconcontent.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldcustomiconcontent.html#cfn-quicksight-dashboard-tablefieldcustomiconcontent-icon","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableFieldCustomTextContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldcustomtextcontent.html","Properties":{"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldcustomtextcontent.html#cfn-quicksight-dashboard-tablefieldcustomtextcontent-fontconfiguration","Required":true,"Type":"FontConfiguration","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldcustomtextcontent.html#cfn-quicksight-dashboard-tablefieldcustomtextcontent-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableFieldImageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldimageconfiguration.html","Properties":{"SizingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldimageconfiguration.html#cfn-quicksight-dashboard-tablefieldimageconfiguration-sizingoptions","Required":false,"Type":"TableCellImageSizingConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableFieldLinkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldlinkconfiguration.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldlinkconfiguration.html#cfn-quicksight-dashboard-tablefieldlinkconfiguration-content","Required":true,"Type":"TableFieldLinkContentConfiguration","UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldlinkconfiguration.html#cfn-quicksight-dashboard-tablefieldlinkconfiguration-target","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableFieldLinkContentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldlinkcontentconfiguration.html","Properties":{"CustomIconContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldlinkcontentconfiguration.html#cfn-quicksight-dashboard-tablefieldlinkcontentconfiguration-customiconcontent","Required":false,"Type":"TableFieldCustomIconContent","UpdateType":"Mutable"},"CustomTextContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldlinkcontentconfiguration.html#cfn-quicksight-dashboard-tablefieldlinkcontentconfiguration-customtextcontent","Required":false,"Type":"TableFieldCustomTextContent","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableFieldOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldoption.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldoption.html#cfn-quicksight-dashboard-tablefieldoption-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldoption.html#cfn-quicksight-dashboard-tablefieldoption-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"URLStyling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldoption.html#cfn-quicksight-dashboard-tablefieldoption-urlstyling","Required":false,"Type":"TableFieldURLConfiguration","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldoption.html#cfn-quicksight-dashboard-tablefieldoption-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldoption.html#cfn-quicksight-dashboard-tablefieldoption-width","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldoptions.html","Properties":{"Order":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldoptions.html#cfn-quicksight-dashboard-tablefieldoptions-order","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldoptions.html#cfn-quicksight-dashboard-tablefieldoptions-selectedfieldoptions","DuplicatesAllowed":true,"ItemType":"TableFieldOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableFieldURLConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldurlconfiguration.html","Properties":{"ImageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldurlconfiguration.html#cfn-quicksight-dashboard-tablefieldurlconfiguration-imageconfiguration","Required":false,"Type":"TableFieldImageConfiguration","UpdateType":"Mutable"},"LinkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldurlconfiguration.html#cfn-quicksight-dashboard-tablefieldurlconfiguration-linkconfiguration","Required":false,"Type":"TableFieldLinkConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldwells.html","Properties":{"TableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldwells.html#cfn-quicksight-dashboard-tablefieldwells-tableaggregatedfieldwells","Required":false,"Type":"TableAggregatedFieldWells","UpdateType":"Mutable"},"TableUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablefieldwells.html#cfn-quicksight-dashboard-tablefieldwells-tableunaggregatedfieldwells","Required":false,"Type":"TableUnaggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableInlineVisualization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableinlinevisualization.html","Properties":{"DataBars":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableinlinevisualization.html#cfn-quicksight-dashboard-tableinlinevisualization-databars","Required":false,"Type":"DataBarsOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableoptions.html","Properties":{"CellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableoptions.html#cfn-quicksight-dashboard-tableoptions-cellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"HeaderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableoptions.html#cfn-quicksight-dashboard-tableoptions-headerstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"Orientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableoptions.html#cfn-quicksight-dashboard-tableoptions-orientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RowAlternateColorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableoptions.html#cfn-quicksight-dashboard-tableoptions-rowalternatecoloroptions","Required":false,"Type":"RowAlternateColorOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TablePaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablepaginatedreportoptions.html","Properties":{"OverflowColumnHeaderVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablepaginatedreportoptions.html#cfn-quicksight-dashboard-tablepaginatedreportoptions-overflowcolumnheadervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerticalOverflowVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablepaginatedreportoptions.html#cfn-quicksight-dashboard-tablepaginatedreportoptions-verticaloverflowvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableRowConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablerowconditionalformatting.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablerowconditionalformatting.html#cfn-quicksight-dashboard-tablerowconditionalformatting-backgroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablerowconditionalformatting.html#cfn-quicksight-dashboard-tablerowconditionalformatting-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableSideBorderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablesideborderoptions.html","Properties":{"Bottom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablesideborderoptions.html#cfn-quicksight-dashboard-tablesideborderoptions-bottom","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"InnerHorizontal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablesideborderoptions.html#cfn-quicksight-dashboard-tablesideborderoptions-innerhorizontal","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"InnerVertical":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablesideborderoptions.html#cfn-quicksight-dashboard-tablesideborderoptions-innervertical","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"Left":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablesideborderoptions.html#cfn-quicksight-dashboard-tablesideborderoptions-left","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"Right":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablesideborderoptions.html#cfn-quicksight-dashboard-tablesideborderoptions-right","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"Top":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablesideborderoptions.html#cfn-quicksight-dashboard-tablesideborderoptions-top","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablesortconfiguration.html","Properties":{"PaginationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablesortconfiguration.html#cfn-quicksight-dashboard-tablesortconfiguration-paginationconfiguration","Required":false,"Type":"PaginationConfiguration","UpdateType":"Mutable"},"RowSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablesortconfiguration.html#cfn-quicksight-dashboard-tablesortconfiguration-rowsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableunaggregatedfieldwells.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tableunaggregatedfieldwells.html#cfn-quicksight-dashboard-tableunaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"UnaggregatedField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablevisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablevisual.html#cfn-quicksight-dashboard-tablevisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablevisual.html#cfn-quicksight-dashboard-tablevisual-chartconfiguration","Required":false,"Type":"TableConfiguration","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablevisual.html#cfn-quicksight-dashboard-tablevisual-conditionalformatting","Required":false,"Type":"TableConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablevisual.html#cfn-quicksight-dashboard-tablevisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablevisual.html#cfn-quicksight-dashboard-tablevisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tablevisual.html#cfn-quicksight-dashboard-tablevisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TextAreaControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textareacontroldisplayoptions.html","Properties":{"PlaceholderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textareacontroldisplayoptions.html#cfn-quicksight-dashboard-textareacontroldisplayoptions-placeholderoptions","Required":false,"Type":"TextControlPlaceholderOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textareacontroldisplayoptions.html#cfn-quicksight-dashboard-textareacontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TextConditionalFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textconditionalformat.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textconditionalformat.html#cfn-quicksight-dashboard-textconditionalformat-backgroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"},"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textconditionalformat.html#cfn-quicksight-dashboard-textconditionalformat-icon","Required":false,"Type":"ConditionalFormattingIcon","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textconditionalformat.html#cfn-quicksight-dashboard-textconditionalformat-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TextControlPlaceholderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textcontrolplaceholderoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textcontrolplaceholderoptions.html#cfn-quicksight-dashboard-textcontrolplaceholderoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TextFieldControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textfieldcontroldisplayoptions.html","Properties":{"PlaceholderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textfieldcontroldisplayoptions.html#cfn-quicksight-dashboard-textfieldcontroldisplayoptions-placeholderoptions","Required":false,"Type":"TextControlPlaceholderOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-textfieldcontroldisplayoptions.html#cfn-quicksight-dashboard-textfieldcontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.ThousandSeparatorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-thousandseparatoroptions.html","Properties":{"Symbol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-thousandseparatoroptions.html#cfn-quicksight-dashboard-thousandseparatoroptions-symbol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-thousandseparatoroptions.html#cfn-quicksight-dashboard-thousandseparatoroptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TimeBasedForecastProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timebasedforecastproperties.html","Properties":{"LowerBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timebasedforecastproperties.html#cfn-quicksight-dashboard-timebasedforecastproperties-lowerboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PeriodsBackward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timebasedforecastproperties.html#cfn-quicksight-dashboard-timebasedforecastproperties-periodsbackward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PeriodsForward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timebasedforecastproperties.html#cfn-quicksight-dashboard-timebasedforecastproperties-periodsforward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PredictionInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timebasedforecastproperties.html#cfn-quicksight-dashboard-timebasedforecastproperties-predictioninterval","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Seasonality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timebasedforecastproperties.html#cfn-quicksight-dashboard-timebasedforecastproperties-seasonality","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"UpperBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timebasedforecastproperties.html#cfn-quicksight-dashboard-timebasedforecastproperties-upperboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TimeEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timeequalityfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timeequalityfilter.html#cfn-quicksight-dashboard-timeequalityfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timeequalityfilter.html#cfn-quicksight-dashboard-timeequalityfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timeequalityfilter.html#cfn-quicksight-dashboard-timeequalityfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timeequalityfilter.html#cfn-quicksight-dashboard-timeequalityfilter-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timeequalityfilter.html#cfn-quicksight-dashboard-timeequalityfilter-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TimeRangeDrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangedrilldownfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangedrilldownfilter.html#cfn-quicksight-dashboard-timerangedrilldownfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"RangeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangedrilldownfilter.html#cfn-quicksight-dashboard-timerangedrilldownfilter-rangemaximum","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RangeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangedrilldownfilter.html#cfn-quicksight-dashboard-timerangedrilldownfilter-rangeminimum","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangedrilldownfilter.html#cfn-quicksight-dashboard-timerangedrilldownfilter-timegranularity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TimeRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefilter.html#cfn-quicksight-dashboard-timerangefilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"ExcludePeriodConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefilter.html#cfn-quicksight-dashboard-timerangefilter-excludeperiodconfiguration","Required":false,"Type":"ExcludePeriodConfiguration","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefilter.html#cfn-quicksight-dashboard-timerangefilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncludeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefilter.html#cfn-quicksight-dashboard-timerangefilter-includemaximum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefilter.html#cfn-quicksight-dashboard-timerangefilter-includeminimum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefilter.html#cfn-quicksight-dashboard-timerangefilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RangeMaximumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefilter.html#cfn-quicksight-dashboard-timerangefilter-rangemaximumvalue","Required":false,"Type":"TimeRangeFilterValue","UpdateType":"Mutable"},"RangeMinimumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefilter.html#cfn-quicksight-dashboard-timerangefilter-rangeminimumvalue","Required":false,"Type":"TimeRangeFilterValue","UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefilter.html#cfn-quicksight-dashboard-timerangefilter-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TimeRangeFilterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefiltervalue.html","Properties":{"Parameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefiltervalue.html#cfn-quicksight-dashboard-timerangefiltervalue-parameter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RollingDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefiltervalue.html#cfn-quicksight-dashboard-timerangefiltervalue-rollingdate","Required":false,"Type":"RollingDateConfiguration","UpdateType":"Mutable"},"StaticValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-timerangefiltervalue.html#cfn-quicksight-dashboard-timerangefiltervalue-staticvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tooltipitem.html","Properties":{"ColumnTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tooltipitem.html#cfn-quicksight-dashboard-tooltipitem-columntooltipitem","Required":false,"Type":"ColumnTooltipItem","UpdateType":"Mutable"},"FieldTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tooltipitem.html#cfn-quicksight-dashboard-tooltipitem-fieldtooltipitem","Required":false,"Type":"FieldTooltipItem","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TooltipOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tooltipoptions.html","Properties":{"FieldBasedTooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tooltipoptions.html#cfn-quicksight-dashboard-tooltipoptions-fieldbasedtooltip","Required":false,"Type":"FieldBasedTooltip","UpdateType":"Mutable"},"SelectedTooltipType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tooltipoptions.html#cfn-quicksight-dashboard-tooltipoptions-selectedtooltiptype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TooltipVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-tooltipoptions.html#cfn-quicksight-dashboard-tooltipoptions-tooltipvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TopBottomFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomfilter.html","Properties":{"AggregationSortConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomfilter.html#cfn-quicksight-dashboard-topbottomfilter-aggregationsortconfigurations","DuplicatesAllowed":true,"ItemType":"AggregationSortConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomfilter.html#cfn-quicksight-dashboard-topbottomfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomfilter.html#cfn-quicksight-dashboard-topbottomfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Limit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomfilter.html#cfn-quicksight-dashboard-topbottomfilter-limit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomfilter.html#cfn-quicksight-dashboard-topbottomfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomfilter.html#cfn-quicksight-dashboard-topbottomfilter-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TopBottomMoversComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottommoverscomputation.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottommoverscomputation.html#cfn-quicksight-dashboard-topbottommoverscomputation-category","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottommoverscomputation.html#cfn-quicksight-dashboard-topbottommoverscomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MoverSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottommoverscomputation.html#cfn-quicksight-dashboard-topbottommoverscomputation-moversize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottommoverscomputation.html#cfn-quicksight-dashboard-topbottommoverscomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SortOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottommoverscomputation.html#cfn-quicksight-dashboard-topbottommoverscomputation-sortorder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottommoverscomputation.html#cfn-quicksight-dashboard-topbottommoverscomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottommoverscomputation.html#cfn-quicksight-dashboard-topbottommoverscomputation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottommoverscomputation.html#cfn-quicksight-dashboard-topbottommoverscomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TopBottomRankedComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomrankedcomputation.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomrankedcomputation.html#cfn-quicksight-dashboard-topbottomrankedcomputation-category","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomrankedcomputation.html#cfn-quicksight-dashboard-topbottomrankedcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomrankedcomputation.html#cfn-quicksight-dashboard-topbottomrankedcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResultSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomrankedcomputation.html#cfn-quicksight-dashboard-topbottomrankedcomputation-resultsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomrankedcomputation.html#cfn-quicksight-dashboard-topbottomrankedcomputation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-topbottomrankedcomputation.html#cfn-quicksight-dashboard-topbottomrankedcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TotalAggregationComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-totalaggregationcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-totalaggregationcomputation.html#cfn-quicksight-dashboard-totalaggregationcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-totalaggregationcomputation.html#cfn-quicksight-dashboard-totalaggregationcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-totalaggregationcomputation.html#cfn-quicksight-dashboard-totalaggregationcomputation-value","Required":true,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-totaloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-totaloptions.html#cfn-quicksight-dashboard-totaloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-totaloptions.html#cfn-quicksight-dashboard-totaloptions-placement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScrollStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-totaloptions.html#cfn-quicksight-dashboard-totaloptions-scrollstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TotalCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-totaloptions.html#cfn-quicksight-dashboard-totaloptions-totalcellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-totaloptions.html#cfn-quicksight-dashboard-totaloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TreeMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapaggregatedfieldwells.html","Properties":{"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapaggregatedfieldwells.html#cfn-quicksight-dashboard-treemapaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapaggregatedfieldwells.html#cfn-quicksight-dashboard-treemapaggregatedfieldwells-groups","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Sizes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapaggregatedfieldwells.html#cfn-quicksight-dashboard-treemapaggregatedfieldwells-sizes","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TreeMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapconfiguration.html","Properties":{"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapconfiguration.html#cfn-quicksight-dashboard-treemapconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapconfiguration.html#cfn-quicksight-dashboard-treemapconfiguration-colorscale","Required":false,"Type":"ColorScale","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapconfiguration.html#cfn-quicksight-dashboard-treemapconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapconfiguration.html#cfn-quicksight-dashboard-treemapconfiguration-fieldwells","Required":false,"Type":"TreeMapFieldWells","UpdateType":"Mutable"},"GroupLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapconfiguration.html#cfn-quicksight-dashboard-treemapconfiguration-grouplabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapconfiguration.html#cfn-quicksight-dashboard-treemapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"SizeLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapconfiguration.html#cfn-quicksight-dashboard-treemapconfiguration-sizelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapconfiguration.html#cfn-quicksight-dashboard-treemapconfiguration-sortconfiguration","Required":false,"Type":"TreeMapSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapconfiguration.html#cfn-quicksight-dashboard-treemapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TreeMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapfieldwells.html","Properties":{"TreeMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapfieldwells.html#cfn-quicksight-dashboard-treemapfieldwells-treemapaggregatedfieldwells","Required":false,"Type":"TreeMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TreeMapSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapsortconfiguration.html","Properties":{"TreeMapGroupItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapsortconfiguration.html#cfn-quicksight-dashboard-treemapsortconfiguration-treemapgroupitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"TreeMapSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapsortconfiguration.html#cfn-quicksight-dashboard-treemapsortconfiguration-treemapsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TreeMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapvisual.html#cfn-quicksight-dashboard-treemapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapvisual.html#cfn-quicksight-dashboard-treemapvisual-chartconfiguration","Required":false,"Type":"TreeMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapvisual.html#cfn-quicksight-dashboard-treemapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapvisual.html#cfn-quicksight-dashboard-treemapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapvisual.html#cfn-quicksight-dashboard-treemapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-treemapvisual.html#cfn-quicksight-dashboard-treemapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.TrendArrowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-trendarrowoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-trendarrowoptions.html#cfn-quicksight-dashboard-trendarrowoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.UnaggregatedField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-unaggregatedfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-unaggregatedfield.html#cfn-quicksight-dashboard-unaggregatedfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-unaggregatedfield.html#cfn-quicksight-dashboard-unaggregatedfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-unaggregatedfield.html#cfn-quicksight-dashboard-unaggregatedfield-formatconfiguration","Required":false,"Type":"FormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.UniqueValuesComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-uniquevaluescomputation.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-uniquevaluescomputation.html#cfn-quicksight-dashboard-uniquevaluescomputation-category","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-uniquevaluescomputation.html#cfn-quicksight-dashboard-uniquevaluescomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-uniquevaluescomputation.html#cfn-quicksight-dashboard-uniquevaluescomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.VisibleRangeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visiblerangeoptions.html","Properties":{"PercentRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visiblerangeoptions.html#cfn-quicksight-dashboard-visiblerangeoptions-percentrange","Required":false,"Type":"PercentVisibleRange","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.Visual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html","Properties":{"BarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-barchartvisual","Required":false,"Type":"BarChartVisual","UpdateType":"Mutable"},"BoxPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-boxplotvisual","Required":false,"Type":"BoxPlotVisual","UpdateType":"Mutable"},"ComboChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-combochartvisual","Required":false,"Type":"ComboChartVisual","UpdateType":"Mutable"},"CustomContentVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-customcontentvisual","Required":false,"Type":"CustomContentVisual","UpdateType":"Mutable"},"EmptyVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-emptyvisual","Required":false,"Type":"EmptyVisual","UpdateType":"Mutable"},"FilledMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-filledmapvisual","Required":false,"Type":"FilledMapVisual","UpdateType":"Mutable"},"FunnelChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-funnelchartvisual","Required":false,"Type":"FunnelChartVisual","UpdateType":"Mutable"},"GaugeChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-gaugechartvisual","Required":false,"Type":"GaugeChartVisual","UpdateType":"Mutable"},"GeospatialMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-geospatialmapvisual","Required":false,"Type":"GeospatialMapVisual","UpdateType":"Mutable"},"HeatMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-heatmapvisual","Required":false,"Type":"HeatMapVisual","UpdateType":"Mutable"},"HistogramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-histogramvisual","Required":false,"Type":"HistogramVisual","UpdateType":"Mutable"},"InsightVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-insightvisual","Required":false,"Type":"InsightVisual","UpdateType":"Mutable"},"KPIVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-kpivisual","Required":false,"Type":"KPIVisual","UpdateType":"Mutable"},"LineChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-linechartvisual","Required":false,"Type":"LineChartVisual","UpdateType":"Mutable"},"PieChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-piechartvisual","Required":false,"Type":"PieChartVisual","UpdateType":"Mutable"},"PivotTableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-pivottablevisual","Required":false,"Type":"PivotTableVisual","UpdateType":"Mutable"},"RadarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-radarchartvisual","Required":false,"Type":"RadarChartVisual","UpdateType":"Mutable"},"SankeyDiagramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-sankeydiagramvisual","Required":false,"Type":"SankeyDiagramVisual","UpdateType":"Mutable"},"ScatterPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-scatterplotvisual","Required":false,"Type":"ScatterPlotVisual","UpdateType":"Mutable"},"TableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-tablevisual","Required":false,"Type":"TableVisual","UpdateType":"Mutable"},"TreeMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-treemapvisual","Required":false,"Type":"TreeMapVisual","UpdateType":"Mutable"},"WaterfallVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-waterfallvisual","Required":false,"Type":"WaterfallVisual","UpdateType":"Mutable"},"WordCloudVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visual.html#cfn-quicksight-dashboard-visual-wordcloudvisual","Required":false,"Type":"WordCloudVisual","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.VisualAxisSortOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualaxissortoption.html","Properties":{"AvailabilityStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualaxissortoption.html#cfn-quicksight-dashboard-visualaxissortoption-availabilitystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.VisualCustomAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualcustomaction.html","Properties":{"ActionOperations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualcustomaction.html#cfn-quicksight-dashboard-visualcustomaction-actionoperations","DuplicatesAllowed":true,"ItemType":"VisualCustomActionOperation","Required":true,"Type":"List","UpdateType":"Mutable"},"CustomActionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualcustomaction.html#cfn-quicksight-dashboard-visualcustomaction-customactionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualcustomaction.html#cfn-quicksight-dashboard-visualcustomaction-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualcustomaction.html#cfn-quicksight-dashboard-visualcustomaction-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Trigger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualcustomaction.html#cfn-quicksight-dashboard-visualcustomaction-trigger","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.VisualCustomActionOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualcustomactionoperation.html","Properties":{"FilterOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualcustomactionoperation.html#cfn-quicksight-dashboard-visualcustomactionoperation-filteroperation","Required":false,"Type":"CustomActionFilterOperation","UpdateType":"Mutable"},"NavigationOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualcustomactionoperation.html#cfn-quicksight-dashboard-visualcustomactionoperation-navigationoperation","Required":false,"Type":"CustomActionNavigationOperation","UpdateType":"Mutable"},"SetParametersOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualcustomactionoperation.html#cfn-quicksight-dashboard-visualcustomactionoperation-setparametersoperation","Required":false,"Type":"CustomActionSetParametersOperation","UpdateType":"Mutable"},"URLOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualcustomactionoperation.html#cfn-quicksight-dashboard-visualcustomactionoperation-urloperation","Required":false,"Type":"CustomActionURLOperation","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.VisualMenuOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualmenuoption.html","Properties":{"AvailabilityStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualmenuoption.html#cfn-quicksight-dashboard-visualmenuoption-availabilitystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualpalette.html","Properties":{"ChartColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualpalette.html#cfn-quicksight-dashboard-visualpalette-chartcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColorMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualpalette.html#cfn-quicksight-dashboard-visualpalette-colormap","DuplicatesAllowed":true,"ItemType":"DataPathColor","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.VisualSubtitleLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualsubtitlelabeloptions.html","Properties":{"FormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualsubtitlelabeloptions.html#cfn-quicksight-dashboard-visualsubtitlelabeloptions-formattext","Required":false,"Type":"LongFormatText","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualsubtitlelabeloptions.html#cfn-quicksight-dashboard-visualsubtitlelabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.VisualTitleLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualtitlelabeloptions.html","Properties":{"FormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualtitlelabeloptions.html#cfn-quicksight-dashboard-visualtitlelabeloptions-formattext","Required":false,"Type":"ShortFormatText","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-visualtitlelabeloptions.html#cfn-quicksight-dashboard-visualtitlelabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WaterfallChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartaggregatedfieldwells.html","Properties":{"Breakdowns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartaggregatedfieldwells.html#cfn-quicksight-dashboard-waterfallchartaggregatedfieldwells-breakdowns","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Categories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartaggregatedfieldwells.html#cfn-quicksight-dashboard-waterfallchartaggregatedfieldwells-categories","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartaggregatedfieldwells.html#cfn-quicksight-dashboard-waterfallchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WaterfallChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartconfiguration.html","Properties":{"CategoryAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartconfiguration.html#cfn-quicksight-dashboard-waterfallchartconfiguration-categoryaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartconfiguration.html#cfn-quicksight-dashboard-waterfallchartconfiguration-categoryaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartconfiguration.html#cfn-quicksight-dashboard-waterfallchartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartconfiguration.html#cfn-quicksight-dashboard-waterfallchartconfiguration-fieldwells","Required":false,"Type":"WaterfallChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartconfiguration.html#cfn-quicksight-dashboard-waterfallchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartconfiguration.html#cfn-quicksight-dashboard-waterfallchartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartconfiguration.html#cfn-quicksight-dashboard-waterfallchartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartconfiguration.html#cfn-quicksight-dashboard-waterfallchartconfiguration-sortconfiguration","Required":false,"Type":"WaterfallChartSortConfiguration","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartconfiguration.html#cfn-quicksight-dashboard-waterfallchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"WaterfallChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartconfiguration.html#cfn-quicksight-dashboard-waterfallchartconfiguration-waterfallchartoptions","Required":false,"Type":"WaterfallChartOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WaterfallChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartfieldwells.html","Properties":{"WaterfallChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartfieldwells.html#cfn-quicksight-dashboard-waterfallchartfieldwells-waterfallchartaggregatedfieldwells","Required":false,"Type":"WaterfallChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WaterfallChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartoptions.html","Properties":{"TotalBarLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartoptions.html#cfn-quicksight-dashboard-waterfallchartoptions-totalbarlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WaterfallChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartsortconfiguration.html","Properties":{"BreakdownItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartsortconfiguration.html#cfn-quicksight-dashboard-waterfallchartsortconfiguration-breakdownitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallchartsortconfiguration.html#cfn-quicksight-dashboard-waterfallchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WaterfallVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallvisual.html#cfn-quicksight-dashboard-waterfallvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallvisual.html#cfn-quicksight-dashboard-waterfallvisual-chartconfiguration","Required":false,"Type":"WaterfallChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallvisual.html#cfn-quicksight-dashboard-waterfallvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallvisual.html#cfn-quicksight-dashboard-waterfallvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallvisual.html#cfn-quicksight-dashboard-waterfallvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-waterfallvisual.html#cfn-quicksight-dashboard-waterfallvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WhatIfPointScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-whatifpointscenario.html","Properties":{"Date":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-whatifpointscenario.html#cfn-quicksight-dashboard-whatifpointscenario-date","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-whatifpointscenario.html#cfn-quicksight-dashboard-whatifpointscenario-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WhatIfRangeScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-whatifrangescenario.html","Properties":{"EndDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-whatifrangescenario.html#cfn-quicksight-dashboard-whatifrangescenario-enddate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StartDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-whatifrangescenario.html#cfn-quicksight-dashboard-whatifrangescenario-startdate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-whatifrangescenario.html#cfn-quicksight-dashboard-whatifrangescenario-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WordCloudAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudaggregatedfieldwells.html","Properties":{"GroupBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudaggregatedfieldwells.html#cfn-quicksight-dashboard-wordcloudaggregatedfieldwells-groupby","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudaggregatedfieldwells.html#cfn-quicksight-dashboard-wordcloudaggregatedfieldwells-size","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WordCloudChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudchartconfiguration.html","Properties":{"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudchartconfiguration.html#cfn-quicksight-dashboard-wordcloudchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudchartconfiguration.html#cfn-quicksight-dashboard-wordcloudchartconfiguration-fieldwells","Required":false,"Type":"WordCloudFieldWells","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudchartconfiguration.html#cfn-quicksight-dashboard-wordcloudchartconfiguration-sortconfiguration","Required":false,"Type":"WordCloudSortConfiguration","UpdateType":"Mutable"},"WordCloudOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudchartconfiguration.html#cfn-quicksight-dashboard-wordcloudchartconfiguration-wordcloudoptions","Required":false,"Type":"WordCloudOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WordCloudFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudfieldwells.html","Properties":{"WordCloudAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudfieldwells.html#cfn-quicksight-dashboard-wordcloudfieldwells-wordcloudaggregatedfieldwells","Required":false,"Type":"WordCloudAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WordCloudOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudoptions.html","Properties":{"CloudLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudoptions.html#cfn-quicksight-dashboard-wordcloudoptions-cloudlayout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaximumStringLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudoptions.html#cfn-quicksight-dashboard-wordcloudoptions-maximumstringlength","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"WordCasing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudoptions.html#cfn-quicksight-dashboard-wordcloudoptions-wordcasing","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WordOrientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudoptions.html#cfn-quicksight-dashboard-wordcloudoptions-wordorientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WordPadding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudoptions.html#cfn-quicksight-dashboard-wordcloudoptions-wordpadding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WordScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudoptions.html#cfn-quicksight-dashboard-wordcloudoptions-wordscaling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WordCloudSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudsortconfiguration.html#cfn-quicksight-dashboard-wordcloudsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudsortconfiguration.html#cfn-quicksight-dashboard-wordcloudsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard.WordCloudVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudvisual.html#cfn-quicksight-dashboard-wordcloudvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudvisual.html#cfn-quicksight-dashboard-wordcloudvisual-chartconfiguration","Required":false,"Type":"WordCloudChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudvisual.html#cfn-quicksight-dashboard-wordcloudvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudvisual.html#cfn-quicksight-dashboard-wordcloudvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudvisual.html#cfn-quicksight-dashboard-wordcloudvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dashboard-wordcloudvisual.html#cfn-quicksight-dashboard-wordcloudvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.CalculatedColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-calculatedcolumn.html","Properties":{"ColumnId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-calculatedcolumn.html#cfn-quicksight-dataset-calculatedcolumn-columnid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-calculatedcolumn.html#cfn-quicksight-dataset-calculatedcolumn-columnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-calculatedcolumn.html#cfn-quicksight-dataset-calculatedcolumn-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.CastColumnTypeOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-castcolumntypeoperation.html","Properties":{"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-castcolumntypeoperation.html#cfn-quicksight-dataset-castcolumntypeoperation-columnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-castcolumntypeoperation.html#cfn-quicksight-dataset-castcolumntypeoperation-format","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NewColumnType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-castcolumntypeoperation.html#cfn-quicksight-dataset-castcolumntypeoperation-newcolumntype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.ColumnDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-columndescription.html","Properties":{"Text":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-columndescription.html#cfn-quicksight-dataset-columndescription-text","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.ColumnGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-columngroup.html","Properties":{"GeoSpatialColumnGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-columngroup.html#cfn-quicksight-dataset-columngroup-geospatialcolumngroup","Required":false,"Type":"GeoSpatialColumnGroup","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.ColumnLevelPermissionRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-columnlevelpermissionrule.html","Properties":{"ColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-columnlevelpermissionrule.html#cfn-quicksight-dataset-columnlevelpermissionrule-columnnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Principals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-columnlevelpermissionrule.html#cfn-quicksight-dataset-columnlevelpermissionrule-principals","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.ColumnTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-columntag.html","Properties":{"ColumnDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-columntag.html#cfn-quicksight-dataset-columntag-columndescription","Required":false,"Type":"ColumnDescription","UpdateType":"Mutable"},"ColumnGeographicRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-columntag.html#cfn-quicksight-dataset-columntag-columngeographicrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.CreateColumnsOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-createcolumnsoperation.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-createcolumnsoperation.html#cfn-quicksight-dataset-createcolumnsoperation-columns","DuplicatesAllowed":true,"ItemType":"CalculatedColumn","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.CustomSql":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-customsql.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-customsql.html#cfn-quicksight-dataset-customsql-columns","DuplicatesAllowed":true,"ItemType":"InputColumn","Required":true,"Type":"List","UpdateType":"Mutable"},"DataSourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-customsql.html#cfn-quicksight-dataset-customsql-datasourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-customsql.html#cfn-quicksight-dataset-customsql-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SqlQuery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-customsql.html#cfn-quicksight-dataset-customsql-sqlquery","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.DataSetRefreshProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetrefreshproperties.html","Properties":{"RefreshConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetrefreshproperties.html#cfn-quicksight-dataset-datasetrefreshproperties-refreshconfiguration","Required":false,"Type":"RefreshConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.DataSetUsageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetusageconfiguration.html","Properties":{"DisableUseAsDirectQuerySource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetusageconfiguration.html#cfn-quicksight-dataset-datasetusageconfiguration-disableuseasdirectquerysource","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DisableUseAsImportedSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetusageconfiguration.html#cfn-quicksight-dataset-datasetusageconfiguration-disableuseasimportedsource","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.DatasetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetparameter.html","Properties":{"DateTimeDatasetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetparameter.html#cfn-quicksight-dataset-datasetparameter-datetimedatasetparameter","Required":false,"Type":"DateTimeDatasetParameter","UpdateType":"Mutable"},"DecimalDatasetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetparameter.html#cfn-quicksight-dataset-datasetparameter-decimaldatasetparameter","Required":false,"Type":"DecimalDatasetParameter","UpdateType":"Mutable"},"IntegerDatasetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetparameter.html#cfn-quicksight-dataset-datasetparameter-integerdatasetparameter","Required":false,"Type":"IntegerDatasetParameter","UpdateType":"Mutable"},"StringDatasetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datasetparameter.html#cfn-quicksight-dataset-datasetparameter-stringdatasetparameter","Required":false,"Type":"StringDatasetParameter","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.DateTimeDatasetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datetimedatasetparameter.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datetimedatasetparameter.html#cfn-quicksight-dataset-datetimedatasetparameter-defaultvalues","Required":false,"Type":"DateTimeDatasetParameterDefaultValues","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datetimedatasetparameter.html#cfn-quicksight-dataset-datetimedatasetparameter-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datetimedatasetparameter.html#cfn-quicksight-dataset-datetimedatasetparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datetimedatasetparameter.html#cfn-quicksight-dataset-datetimedatasetparameter-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datetimedatasetparameter.html#cfn-quicksight-dataset-datetimedatasetparameter-valuetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.DateTimeDatasetParameterDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datetimedatasetparameterdefaultvalues.html","Properties":{"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-datetimedatasetparameterdefaultvalues.html#cfn-quicksight-dataset-datetimedatasetparameterdefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.DecimalDatasetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-decimaldatasetparameter.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-decimaldatasetparameter.html#cfn-quicksight-dataset-decimaldatasetparameter-defaultvalues","Required":false,"Type":"DecimalDatasetParameterDefaultValues","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-decimaldatasetparameter.html#cfn-quicksight-dataset-decimaldatasetparameter-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-decimaldatasetparameter.html#cfn-quicksight-dataset-decimaldatasetparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-decimaldatasetparameter.html#cfn-quicksight-dataset-decimaldatasetparameter-valuetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.DecimalDatasetParameterDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-decimaldatasetparameterdefaultvalues.html","Properties":{"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-decimaldatasetparameterdefaultvalues.html#cfn-quicksight-dataset-decimaldatasetparameterdefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.FieldFolder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-fieldfolder.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-fieldfolder.html#cfn-quicksight-dataset-fieldfolder-columns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-fieldfolder.html#cfn-quicksight-dataset-fieldfolder-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.FilterOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-filteroperation.html","Properties":{"ConditionExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-filteroperation.html#cfn-quicksight-dataset-filteroperation-conditionexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.GeoSpatialColumnGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-geospatialcolumngroup.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-geospatialcolumngroup.html#cfn-quicksight-dataset-geospatialcolumngroup-columns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"CountryCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-geospatialcolumngroup.html#cfn-quicksight-dataset-geospatialcolumngroup-countrycode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-geospatialcolumngroup.html#cfn-quicksight-dataset-geospatialcolumngroup-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.IncrementalRefresh":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-incrementalrefresh.html","Properties":{"LookbackWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-incrementalrefresh.html#cfn-quicksight-dataset-incrementalrefresh-lookbackwindow","Required":false,"Type":"LookbackWindow","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.IngestionWaitPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-ingestionwaitpolicy.html","Properties":{"IngestionWaitTimeInHours":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-ingestionwaitpolicy.html#cfn-quicksight-dataset-ingestionwaitpolicy-ingestionwaittimeinhours","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"WaitForSpiceIngestion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-ingestionwaitpolicy.html#cfn-quicksight-dataset-ingestionwaitpolicy-waitforspiceingestion","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.InputColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-inputcolumn.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-inputcolumn.html#cfn-quicksight-dataset-inputcolumn-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-inputcolumn.html#cfn-quicksight-dataset-inputcolumn-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.IntegerDatasetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-integerdatasetparameter.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-integerdatasetparameter.html#cfn-quicksight-dataset-integerdatasetparameter-defaultvalues","Required":false,"Type":"IntegerDatasetParameterDefaultValues","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-integerdatasetparameter.html#cfn-quicksight-dataset-integerdatasetparameter-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-integerdatasetparameter.html#cfn-quicksight-dataset-integerdatasetparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-integerdatasetparameter.html#cfn-quicksight-dataset-integerdatasetparameter-valuetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.IntegerDatasetParameterDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-integerdatasetparameterdefaultvalues.html","Properties":{"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-integerdatasetparameterdefaultvalues.html#cfn-quicksight-dataset-integerdatasetparameterdefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.JoinInstruction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-joininstruction.html","Properties":{"LeftJoinKeyProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-joininstruction.html#cfn-quicksight-dataset-joininstruction-leftjoinkeyproperties","Required":false,"Type":"JoinKeyProperties","UpdateType":"Mutable"},"LeftOperand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-joininstruction.html#cfn-quicksight-dataset-joininstruction-leftoperand","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OnClause":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-joininstruction.html#cfn-quicksight-dataset-joininstruction-onclause","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RightJoinKeyProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-joininstruction.html#cfn-quicksight-dataset-joininstruction-rightjoinkeyproperties","Required":false,"Type":"JoinKeyProperties","UpdateType":"Mutable"},"RightOperand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-joininstruction.html#cfn-quicksight-dataset-joininstruction-rightoperand","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-joininstruction.html#cfn-quicksight-dataset-joininstruction-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.JoinKeyProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-joinkeyproperties.html","Properties":{"UniqueKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-joinkeyproperties.html#cfn-quicksight-dataset-joinkeyproperties-uniquekey","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.LogicalTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-logicaltable.html","Properties":{"Alias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-logicaltable.html#cfn-quicksight-dataset-logicaltable-alias","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataTransforms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-logicaltable.html#cfn-quicksight-dataset-logicaltable-datatransforms","DuplicatesAllowed":true,"ItemType":"TransformOperation","Required":false,"Type":"List","UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-logicaltable.html#cfn-quicksight-dataset-logicaltable-source","Required":true,"Type":"LogicalTableSource","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.LogicalTableSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-logicaltablesource.html","Properties":{"DataSetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-logicaltablesource.html#cfn-quicksight-dataset-logicaltablesource-datasetarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JoinInstruction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-logicaltablesource.html#cfn-quicksight-dataset-logicaltablesource-joininstruction","Required":false,"Type":"JoinInstruction","UpdateType":"Mutable"},"PhysicalTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-logicaltablesource.html#cfn-quicksight-dataset-logicaltablesource-physicaltableid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.LookbackWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-lookbackwindow.html","Properties":{"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-lookbackwindow.html#cfn-quicksight-dataset-lookbackwindow-columnname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-lookbackwindow.html#cfn-quicksight-dataset-lookbackwindow-size","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"SizeUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-lookbackwindow.html#cfn-quicksight-dataset-lookbackwindow-sizeunit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.NewDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-newdefaultvalues.html","Properties":{"DateTimeStaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-newdefaultvalues.html#cfn-quicksight-dataset-newdefaultvalues-datetimestaticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DecimalStaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-newdefaultvalues.html#cfn-quicksight-dataset-newdefaultvalues-decimalstaticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"},"IntegerStaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-newdefaultvalues.html#cfn-quicksight-dataset-newdefaultvalues-integerstaticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"},"StringStaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-newdefaultvalues.html#cfn-quicksight-dataset-newdefaultvalues-stringstaticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.OutputColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-outputcolumn.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-outputcolumn.html#cfn-quicksight-dataset-outputcolumn-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-outputcolumn.html#cfn-quicksight-dataset-outputcolumn-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-outputcolumn.html#cfn-quicksight-dataset-outputcolumn-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.OverrideDatasetParameterOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-overridedatasetparameteroperation.html","Properties":{"NewDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-overridedatasetparameteroperation.html#cfn-quicksight-dataset-overridedatasetparameteroperation-newdefaultvalues","Required":false,"Type":"NewDefaultValues","UpdateType":"Mutable"},"NewParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-overridedatasetparameteroperation.html#cfn-quicksight-dataset-overridedatasetparameteroperation-newparametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-overridedatasetparameteroperation.html#cfn-quicksight-dataset-overridedatasetparameteroperation-parametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.PhysicalTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-physicaltable.html","Properties":{"CustomSql":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-physicaltable.html#cfn-quicksight-dataset-physicaltable-customsql","Required":false,"Type":"CustomSql","UpdateType":"Mutable"},"RelationalTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-physicaltable.html#cfn-quicksight-dataset-physicaltable-relationaltable","Required":false,"Type":"RelationalTable","UpdateType":"Mutable"},"S3Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-physicaltable.html#cfn-quicksight-dataset-physicaltable-s3source","Required":false,"Type":"S3Source","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.ProjectOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-projectoperation.html","Properties":{"ProjectedColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-projectoperation.html#cfn-quicksight-dataset-projectoperation-projectedcolumns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.RefreshConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-refreshconfiguration.html","Properties":{"IncrementalRefresh":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-refreshconfiguration.html#cfn-quicksight-dataset-refreshconfiguration-incrementalrefresh","Required":false,"Type":"IncrementalRefresh","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.RelationalTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-relationaltable.html","Properties":{"Catalog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-relationaltable.html#cfn-quicksight-dataset-relationaltable-catalog","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataSourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-relationaltable.html#cfn-quicksight-dataset-relationaltable-datasourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InputColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-relationaltable.html#cfn-quicksight-dataset-relationaltable-inputcolumns","DuplicatesAllowed":true,"ItemType":"InputColumn","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-relationaltable.html#cfn-quicksight-dataset-relationaltable-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-relationaltable.html#cfn-quicksight-dataset-relationaltable-schema","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.RenameColumnOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-renamecolumnoperation.html","Properties":{"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-renamecolumnoperation.html#cfn-quicksight-dataset-renamecolumnoperation-columnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NewColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-renamecolumnoperation.html#cfn-quicksight-dataset-renamecolumnoperation-newcolumnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.ResourcePermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-resourcepermission.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-resourcepermission.html#cfn-quicksight-dataset-resourcepermission-actions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-resourcepermission.html#cfn-quicksight-dataset-resourcepermission-principal","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.RowLevelPermissionDataSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiondataset.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiondataset.html#cfn-quicksight-dataset-rowlevelpermissiondataset-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiondataset.html#cfn-quicksight-dataset-rowlevelpermissiondataset-formatversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiondataset.html#cfn-quicksight-dataset-rowlevelpermissiondataset-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PermissionPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiondataset.html#cfn-quicksight-dataset-rowlevelpermissiondataset-permissionpolicy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiondataset.html#cfn-quicksight-dataset-rowlevelpermissiondataset-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.RowLevelPermissionTagConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiontagconfiguration.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiontagconfiguration.html#cfn-quicksight-dataset-rowlevelpermissiontagconfiguration-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagRuleConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiontagconfiguration.html#cfn-quicksight-dataset-rowlevelpermissiontagconfiguration-tagruleconfigurations","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TagRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiontagconfiguration.html#cfn-quicksight-dataset-rowlevelpermissiontagconfiguration-tagrules","DuplicatesAllowed":true,"ItemType":"RowLevelPermissionTagRule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.RowLevelPermissionTagRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiontagrule.html","Properties":{"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiontagrule.html#cfn-quicksight-dataset-rowlevelpermissiontagrule-columnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MatchAllValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiontagrule.html#cfn-quicksight-dataset-rowlevelpermissiontagrule-matchallvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiontagrule.html#cfn-quicksight-dataset-rowlevelpermissiontagrule-tagkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TagMultiValueDelimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-rowlevelpermissiontagrule.html#cfn-quicksight-dataset-rowlevelpermissiontagrule-tagmultivaluedelimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.S3Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-s3source.html","Properties":{"DataSourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-s3source.html#cfn-quicksight-dataset-s3source-datasourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InputColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-s3source.html#cfn-quicksight-dataset-s3source-inputcolumns","DuplicatesAllowed":true,"ItemType":"InputColumn","Required":true,"Type":"List","UpdateType":"Mutable"},"UploadSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-s3source.html#cfn-quicksight-dataset-s3source-uploadsettings","Required":false,"Type":"UploadSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.StringDatasetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-stringdatasetparameter.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-stringdatasetparameter.html#cfn-quicksight-dataset-stringdatasetparameter-defaultvalues","Required":false,"Type":"StringDatasetParameterDefaultValues","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-stringdatasetparameter.html#cfn-quicksight-dataset-stringdatasetparameter-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-stringdatasetparameter.html#cfn-quicksight-dataset-stringdatasetparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-stringdatasetparameter.html#cfn-quicksight-dataset-stringdatasetparameter-valuetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.StringDatasetParameterDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-stringdatasetparameterdefaultvalues.html","Properties":{"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-stringdatasetparameterdefaultvalues.html#cfn-quicksight-dataset-stringdatasetparameterdefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.TagColumnOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-tagcolumnoperation.html","Properties":{"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-tagcolumnoperation.html#cfn-quicksight-dataset-tagcolumnoperation-columnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-tagcolumnoperation.html#cfn-quicksight-dataset-tagcolumnoperation-tags","DuplicatesAllowed":true,"ItemType":"ColumnTag","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.TransformOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-transformoperation.html","Properties":{"CastColumnTypeOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-transformoperation.html#cfn-quicksight-dataset-transformoperation-castcolumntypeoperation","Required":false,"Type":"CastColumnTypeOperation","UpdateType":"Mutable"},"CreateColumnsOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-transformoperation.html#cfn-quicksight-dataset-transformoperation-createcolumnsoperation","Required":false,"Type":"CreateColumnsOperation","UpdateType":"Mutable"},"FilterOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-transformoperation.html#cfn-quicksight-dataset-transformoperation-filteroperation","Required":false,"Type":"FilterOperation","UpdateType":"Mutable"},"OverrideDatasetParameterOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-transformoperation.html#cfn-quicksight-dataset-transformoperation-overridedatasetparameteroperation","Required":false,"Type":"OverrideDatasetParameterOperation","UpdateType":"Mutable"},"ProjectOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-transformoperation.html#cfn-quicksight-dataset-transformoperation-projectoperation","Required":false,"Type":"ProjectOperation","UpdateType":"Mutable"},"RenameColumnOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-transformoperation.html#cfn-quicksight-dataset-transformoperation-renamecolumnoperation","Required":false,"Type":"RenameColumnOperation","UpdateType":"Mutable"},"TagColumnOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-transformoperation.html#cfn-quicksight-dataset-transformoperation-tagcolumnoperation","Required":false,"Type":"TagColumnOperation","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet.UploadSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-uploadsettings.html","Properties":{"ContainsHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-uploadsettings.html#cfn-quicksight-dataset-uploadsettings-containsheader","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-uploadsettings.html#cfn-quicksight-dataset-uploadsettings-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-uploadsettings.html#cfn-quicksight-dataset-uploadsettings-format","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartFromRow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-uploadsettings.html#cfn-quicksight-dataset-uploadsettings-startfromrow","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TextQualifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-dataset-uploadsettings.html#cfn-quicksight-dataset-uploadsettings-textqualifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.AmazonElasticsearchParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-amazonelasticsearchparameters.html","Properties":{"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-amazonelasticsearchparameters.html#cfn-quicksight-datasource-amazonelasticsearchparameters-domain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.AmazonOpenSearchParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-amazonopensearchparameters.html","Properties":{"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-amazonopensearchparameters.html#cfn-quicksight-datasource-amazonopensearchparameters-domain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.AthenaParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-athenaparameters.html","Properties":{"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-athenaparameters.html#cfn-quicksight-datasource-athenaparameters-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WorkGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-athenaparameters.html#cfn-quicksight-datasource-athenaparameters-workgroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.AuroraParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-auroraparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-auroraparameters.html#cfn-quicksight-datasource-auroraparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-auroraparameters.html#cfn-quicksight-datasource-auroraparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-auroraparameters.html#cfn-quicksight-datasource-auroraparameters-port","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.AuroraPostgreSqlParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-aurorapostgresqlparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-aurorapostgresqlparameters.html#cfn-quicksight-datasource-aurorapostgresqlparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-aurorapostgresqlparameters.html#cfn-quicksight-datasource-aurorapostgresqlparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-aurorapostgresqlparameters.html#cfn-quicksight-datasource-aurorapostgresqlparameters-port","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.CredentialPair":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-credentialpair.html","Properties":{"AlternateDataSourceParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-credentialpair.html#cfn-quicksight-datasource-credentialpair-alternatedatasourceparameters","DuplicatesAllowed":true,"ItemType":"DataSourceParameters","Required":false,"Type":"List","UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-credentialpair.html#cfn-quicksight-datasource-credentialpair-password","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-credentialpair.html#cfn-quicksight-datasource-credentialpair-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.DataSourceCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourcecredentials.html","Properties":{"CopySourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourcecredentials.html#cfn-quicksight-datasource-datasourcecredentials-copysourcearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CredentialPair":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourcecredentials.html#cfn-quicksight-datasource-datasourcecredentials-credentialpair","Required":false,"Type":"CredentialPair","UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourcecredentials.html#cfn-quicksight-datasource-datasourcecredentials-secretarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.DataSourceErrorInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceerrorinfo.html","Properties":{"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceerrorinfo.html#cfn-quicksight-datasource-datasourceerrorinfo-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceerrorinfo.html#cfn-quicksight-datasource-datasourceerrorinfo-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.DataSourceParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html","Properties":{"AmazonElasticsearchParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-amazonelasticsearchparameters","Required":false,"Type":"AmazonElasticsearchParameters","UpdateType":"Mutable"},"AmazonOpenSearchParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-amazonopensearchparameters","Required":false,"Type":"AmazonOpenSearchParameters","UpdateType":"Mutable"},"AthenaParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-athenaparameters","Required":false,"Type":"AthenaParameters","UpdateType":"Mutable"},"AuroraParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-auroraparameters","Required":false,"Type":"AuroraParameters","UpdateType":"Mutable"},"AuroraPostgreSqlParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-aurorapostgresqlparameters","Required":false,"Type":"AuroraPostgreSqlParameters","UpdateType":"Mutable"},"DatabricksParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-databricksparameters","Required":false,"Type":"DatabricksParameters","UpdateType":"Mutable"},"MariaDbParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-mariadbparameters","Required":false,"Type":"MariaDbParameters","UpdateType":"Mutable"},"MySqlParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-mysqlparameters","Required":false,"Type":"MySqlParameters","UpdateType":"Mutable"},"OracleParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-oracleparameters","Required":false,"Type":"OracleParameters","UpdateType":"Mutable"},"PostgreSqlParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-postgresqlparameters","Required":false,"Type":"PostgreSqlParameters","UpdateType":"Mutable"},"PrestoParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-prestoparameters","Required":false,"Type":"PrestoParameters","UpdateType":"Mutable"},"RdsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-rdsparameters","Required":false,"Type":"RdsParameters","UpdateType":"Mutable"},"RedshiftParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-redshiftparameters","Required":false,"Type":"RedshiftParameters","UpdateType":"Mutable"},"S3Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-s3parameters","Required":false,"Type":"S3Parameters","UpdateType":"Mutable"},"SnowflakeParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-snowflakeparameters","Required":false,"Type":"SnowflakeParameters","UpdateType":"Mutable"},"SparkParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-sparkparameters","Required":false,"Type":"SparkParameters","UpdateType":"Mutable"},"SqlServerParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-sqlserverparameters","Required":false,"Type":"SqlServerParameters","UpdateType":"Mutable"},"TeradataParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-datasourceparameters.html#cfn-quicksight-datasource-datasourceparameters-teradataparameters","Required":false,"Type":"TeradataParameters","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.DatabricksParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-databricksparameters.html","Properties":{"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-databricksparameters.html#cfn-quicksight-datasource-databricksparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-databricksparameters.html#cfn-quicksight-datasource-databricksparameters-port","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"SqlEndpointPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-databricksparameters.html#cfn-quicksight-datasource-databricksparameters-sqlendpointpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.ManifestFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-manifestfilelocation.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-manifestfilelocation.html#cfn-quicksight-datasource-manifestfilelocation-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-manifestfilelocation.html#cfn-quicksight-datasource-manifestfilelocation-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.MariaDbParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-mariadbparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-mariadbparameters.html#cfn-quicksight-datasource-mariadbparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-mariadbparameters.html#cfn-quicksight-datasource-mariadbparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-mariadbparameters.html#cfn-quicksight-datasource-mariadbparameters-port","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.MySqlParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-mysqlparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-mysqlparameters.html#cfn-quicksight-datasource-mysqlparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-mysqlparameters.html#cfn-quicksight-datasource-mysqlparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-mysqlparameters.html#cfn-quicksight-datasource-mysqlparameters-port","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.OracleParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-oracleparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-oracleparameters.html#cfn-quicksight-datasource-oracleparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-oracleparameters.html#cfn-quicksight-datasource-oracleparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-oracleparameters.html#cfn-quicksight-datasource-oracleparameters-port","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.PostgreSqlParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-postgresqlparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-postgresqlparameters.html#cfn-quicksight-datasource-postgresqlparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-postgresqlparameters.html#cfn-quicksight-datasource-postgresqlparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-postgresqlparameters.html#cfn-quicksight-datasource-postgresqlparameters-port","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.PrestoParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-prestoparameters.html","Properties":{"Catalog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-prestoparameters.html#cfn-quicksight-datasource-prestoparameters-catalog","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-prestoparameters.html#cfn-quicksight-datasource-prestoparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-prestoparameters.html#cfn-quicksight-datasource-prestoparameters-port","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.RdsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-rdsparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-rdsparameters.html#cfn-quicksight-datasource-rdsparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-rdsparameters.html#cfn-quicksight-datasource-rdsparameters-instanceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.RedshiftParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-redshiftparameters.html","Properties":{"ClusterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-redshiftparameters.html#cfn-quicksight-datasource-redshiftparameters-clusterid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-redshiftparameters.html#cfn-quicksight-datasource-redshiftparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-redshiftparameters.html#cfn-quicksight-datasource-redshiftparameters-host","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-redshiftparameters.html#cfn-quicksight-datasource-redshiftparameters-port","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.ResourcePermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-resourcepermission.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-resourcepermission.html#cfn-quicksight-datasource-resourcepermission-actions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-resourcepermission.html#cfn-quicksight-datasource-resourcepermission-principal","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.S3Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-s3parameters.html","Properties":{"ManifestFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-s3parameters.html#cfn-quicksight-datasource-s3parameters-manifestfilelocation","Required":true,"Type":"ManifestFileLocation","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-s3parameters.html#cfn-quicksight-datasource-s3parameters-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.SnowflakeParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-snowflakeparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-snowflakeparameters.html#cfn-quicksight-datasource-snowflakeparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-snowflakeparameters.html#cfn-quicksight-datasource-snowflakeparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Warehouse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-snowflakeparameters.html#cfn-quicksight-datasource-snowflakeparameters-warehouse","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.SparkParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-sparkparameters.html","Properties":{"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-sparkparameters.html#cfn-quicksight-datasource-sparkparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-sparkparameters.html#cfn-quicksight-datasource-sparkparameters-port","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.SqlServerParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-sqlserverparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-sqlserverparameters.html#cfn-quicksight-datasource-sqlserverparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-sqlserverparameters.html#cfn-quicksight-datasource-sqlserverparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-sqlserverparameters.html#cfn-quicksight-datasource-sqlserverparameters-port","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.SslProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-sslproperties.html","Properties":{"DisableSsl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-sslproperties.html#cfn-quicksight-datasource-sslproperties-disablessl","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.TeradataParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-teradataparameters.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-teradataparameters.html#cfn-quicksight-datasource-teradataparameters-database","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-teradataparameters.html#cfn-quicksight-datasource-teradataparameters-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-teradataparameters.html#cfn-quicksight-datasource-teradataparameters-port","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource.VpcConnectionProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-vpcconnectionproperties.html","Properties":{"VpcConnectionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-datasource-vpcconnectionproperties.html#cfn-quicksight-datasource-vpcconnectionproperties-vpcconnectionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::RefreshSchedule.RefreshOnDay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-refreshonday.html","Properties":{"DayOfMonth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-refreshonday.html#cfn-quicksight-refreshschedule-refreshonday-dayofmonth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DayOfWeek":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-refreshonday.html#cfn-quicksight-refreshschedule-refreshonday-dayofweek","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::RefreshSchedule.RefreshScheduleMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-refreshschedulemap.html","Properties":{"RefreshType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-refreshschedulemap.html#cfn-quicksight-refreshschedule-refreshschedulemap-refreshtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduleFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-refreshschedulemap.html#cfn-quicksight-refreshschedule-refreshschedulemap-schedulefrequency","Required":false,"Type":"ScheduleFrequency","UpdateType":"Mutable"},"ScheduleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-refreshschedulemap.html#cfn-quicksight-refreshschedule-refreshschedulemap-scheduleid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StartAfterDateTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-refreshschedulemap.html#cfn-quicksight-refreshschedule-refreshschedulemap-startafterdatetime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::RefreshSchedule.ScheduleFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-schedulefrequency.html","Properties":{"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-schedulefrequency.html#cfn-quicksight-refreshschedule-schedulefrequency-interval","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RefreshOnDay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-schedulefrequency.html#cfn-quicksight-refreshschedule-schedulefrequency-refreshonday","Required":false,"Type":"RefreshOnDay","UpdateType":"Mutable"},"TimeOfTheDay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-schedulefrequency.html#cfn-quicksight-refreshschedule-schedulefrequency-timeoftheday","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-refreshschedule-schedulefrequency.html#cfn-quicksight-refreshschedule-schedulefrequency-timezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-aggregationfunction.html","Properties":{"CategoricalAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-aggregationfunction.html#cfn-quicksight-template-aggregationfunction-categoricalaggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DateAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-aggregationfunction.html#cfn-quicksight-template-aggregationfunction-dateaggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumericalAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-aggregationfunction.html#cfn-quicksight-template-aggregationfunction-numericalaggregationfunction","Required":false,"Type":"NumericalAggregationFunction","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AggregationSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-aggregationsortconfiguration.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-aggregationsortconfiguration.html#cfn-quicksight-template-aggregationsortconfiguration-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-aggregationsortconfiguration.html#cfn-quicksight-template-aggregationsortconfiguration-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"SortDirection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-aggregationsortconfiguration.html#cfn-quicksight-template-aggregationsortconfiguration-sortdirection","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-analysisdefaults.html","Properties":{"DefaultNewSheetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-analysisdefaults.html#cfn-quicksight-template-analysisdefaults-defaultnewsheetconfiguration","Required":true,"Type":"DefaultNewSheetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AnchorDateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-anchordateconfiguration.html","Properties":{"AnchorOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-anchordateconfiguration.html#cfn-quicksight-template-anchordateconfiguration-anchoroption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-anchordateconfiguration.html#cfn-quicksight-template-anchordateconfiguration-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ArcAxisConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-arcaxisconfiguration.html","Properties":{"Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-arcaxisconfiguration.html#cfn-quicksight-template-arcaxisconfiguration-range","Required":false,"Type":"ArcAxisDisplayRange","UpdateType":"Mutable"},"ReserveRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-arcaxisconfiguration.html#cfn-quicksight-template-arcaxisconfiguration-reserverange","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ArcAxisDisplayRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-arcaxisdisplayrange.html","Properties":{"Max":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-arcaxisdisplayrange.html#cfn-quicksight-template-arcaxisdisplayrange-max","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Min":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-arcaxisdisplayrange.html#cfn-quicksight-template-arcaxisdisplayrange-min","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ArcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-arcconfiguration.html","Properties":{"ArcAngle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-arcconfiguration.html#cfn-quicksight-template-arcconfiguration-arcangle","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ArcThickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-arcconfiguration.html#cfn-quicksight-template-arcconfiguration-arcthickness","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ArcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-arcoptions.html","Properties":{"ArcThickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-arcoptions.html#cfn-quicksight-template-arcoptions-arcthickness","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AxisDataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdataoptions.html","Properties":{"DateAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdataoptions.html#cfn-quicksight-template-axisdataoptions-dateaxisoptions","Required":false,"Type":"DateAxisOptions","UpdateType":"Mutable"},"NumericAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdataoptions.html#cfn-quicksight-template-axisdataoptions-numericaxisoptions","Required":false,"Type":"NumericAxisOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AxisDisplayMinMaxRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayminmaxrange.html","Properties":{"Maximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayminmaxrange.html#cfn-quicksight-template-axisdisplayminmaxrange-maximum","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Minimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayminmaxrange.html#cfn-quicksight-template-axisdisplayminmaxrange-minimum","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayoptions.html","Properties":{"AxisLineVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayoptions.html#cfn-quicksight-template-axisdisplayoptions-axislinevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AxisOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayoptions.html#cfn-quicksight-template-axisdisplayoptions-axisoffset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayoptions.html#cfn-quicksight-template-axisdisplayoptions-dataoptions","Required":false,"Type":"AxisDataOptions","UpdateType":"Mutable"},"GridLineVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayoptions.html#cfn-quicksight-template-axisdisplayoptions-gridlinevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScrollbarOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayoptions.html#cfn-quicksight-template-axisdisplayoptions-scrollbaroptions","Required":false,"Type":"ScrollBarOptions","UpdateType":"Mutable"},"TickLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayoptions.html#cfn-quicksight-template-axisdisplayoptions-ticklabeloptions","Required":false,"Type":"AxisTickLabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AxisDisplayRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayrange.html","Properties":{"DataDriven":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayrange.html#cfn-quicksight-template-axisdisplayrange-datadriven","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"MinMax":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisdisplayrange.html#cfn-quicksight-template-axisdisplayrange-minmax","Required":false,"Type":"AxisDisplayMinMaxRange","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislabeloptions.html","Properties":{"ApplyTo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislabeloptions.html#cfn-quicksight-template-axislabeloptions-applyto","Required":false,"Type":"AxisLabelReferenceOptions","UpdateType":"Mutable"},"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislabeloptions.html#cfn-quicksight-template-axislabeloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislabeloptions.html#cfn-quicksight-template-axislabeloptions-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AxisLabelReferenceOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislabelreferenceoptions.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislabelreferenceoptions.html#cfn-quicksight-template-axislabelreferenceoptions-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislabelreferenceoptions.html#cfn-quicksight-template-axislabelreferenceoptions-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AxisLinearScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislinearscale.html","Properties":{"StepCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislinearscale.html#cfn-quicksight-template-axislinearscale-stepcount","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"StepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislinearscale.html#cfn-quicksight-template-axislinearscale-stepsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AxisLogarithmicScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislogarithmicscale.html","Properties":{"Base":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axislogarithmicscale.html#cfn-quicksight-template-axislogarithmicscale-base","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AxisScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisscale.html","Properties":{"Linear":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisscale.html#cfn-quicksight-template-axisscale-linear","Required":false,"Type":"AxisLinearScale","UpdateType":"Mutable"},"Logarithmic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisscale.html#cfn-quicksight-template-axisscale-logarithmic","Required":false,"Type":"AxisLogarithmicScale","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.AxisTickLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisticklabeloptions.html","Properties":{"LabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisticklabeloptions.html#cfn-quicksight-template-axisticklabeloptions-labeloptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"},"RotationAngle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-axisticklabeloptions.html#cfn-quicksight-template-axisticklabeloptions-rotationangle","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartaggregatedfieldwells.html#cfn-quicksight-template-barchartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartaggregatedfieldwells.html#cfn-quicksight-template-barchartaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartaggregatedfieldwells.html#cfn-quicksight-template-barchartaggregatedfieldwells-smallmultiples","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartaggregatedfieldwells.html#cfn-quicksight-template-barchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BarChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html","Properties":{"BarsArrangement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-barsarrangement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ContributionAnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-contributionanalysisdefaults","DuplicatesAllowed":true,"ItemType":"ContributionAnalysisDefault","Required":false,"Type":"List","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-fieldwells","Required":false,"Type":"BarChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"Orientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-orientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-smallmultiplesoptions","Required":false,"Type":"SmallMultiplesOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-sortconfiguration","Required":false,"Type":"BarChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"ValueAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-valueaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"ValueLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-valuelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartconfiguration.html#cfn-quicksight-template-barchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BarChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartfieldwells.html","Properties":{"BarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartfieldwells.html#cfn-quicksight-template-barchartfieldwells-barchartaggregatedfieldwells","Required":false,"Type":"BarChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BarChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartsortconfiguration.html#cfn-quicksight-template-barchartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartsortconfiguration.html#cfn-quicksight-template-barchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartsortconfiguration.html#cfn-quicksight-template-barchartsortconfiguration-coloritemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"ColorSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartsortconfiguration.html#cfn-quicksight-template-barchartsortconfiguration-colorsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartsortconfiguration.html#cfn-quicksight-template-barchartsortconfiguration-smallmultipleslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartsortconfiguration.html#cfn-quicksight-template-barchartsortconfiguration-smallmultiplessort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartvisual.html#cfn-quicksight-template-barchartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartvisual.html#cfn-quicksight-template-barchartvisual-chartconfiguration","Required":false,"Type":"BarChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartvisual.html#cfn-quicksight-template-barchartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartvisual.html#cfn-quicksight-template-barchartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartvisual.html#cfn-quicksight-template-barchartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-barchartvisual.html#cfn-quicksight-template-barchartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BinCountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-bincountoptions.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-bincountoptions.html#cfn-quicksight-template-bincountoptions-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BinWidthOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-binwidthoptions.html","Properties":{"BinCountLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-binwidthoptions.html#cfn-quicksight-template-binwidthoptions-bincountlimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-binwidthoptions.html#cfn-quicksight-template-binwidthoptions-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BodySectionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-bodysectionconfiguration.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-bodysectionconfiguration.html#cfn-quicksight-template-bodysectionconfiguration-content","Required":true,"Type":"BodySectionContent","UpdateType":"Mutable"},"PageBreakConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-bodysectionconfiguration.html#cfn-quicksight-template-bodysectionconfiguration-pagebreakconfiguration","Required":false,"Type":"SectionPageBreakConfiguration","UpdateType":"Mutable"},"SectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-bodysectionconfiguration.html#cfn-quicksight-template-bodysectionconfiguration-sectionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Style":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-bodysectionconfiguration.html#cfn-quicksight-template-bodysectionconfiguration-style","Required":false,"Type":"SectionStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BodySectionContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-bodysectioncontent.html","Properties":{"Layout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-bodysectioncontent.html#cfn-quicksight-template-bodysectioncontent-layout","Required":false,"Type":"SectionLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BoxPlotAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotaggregatedfieldwells.html","Properties":{"GroupBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotaggregatedfieldwells.html#cfn-quicksight-template-boxplotaggregatedfieldwells-groupby","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotaggregatedfieldwells.html#cfn-quicksight-template-boxplotaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BoxPlotChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html","Properties":{"BoxPlotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html#cfn-quicksight-template-boxplotchartconfiguration-boxplotoptions","Required":false,"Type":"BoxPlotOptions","UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html#cfn-quicksight-template-boxplotchartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html#cfn-quicksight-template-boxplotchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html#cfn-quicksight-template-boxplotchartconfiguration-fieldwells","Required":false,"Type":"BoxPlotFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html#cfn-quicksight-template-boxplotchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html#cfn-quicksight-template-boxplotchartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html#cfn-quicksight-template-boxplotchartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html#cfn-quicksight-template-boxplotchartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html#cfn-quicksight-template-boxplotchartconfiguration-sortconfiguration","Required":false,"Type":"BoxPlotSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html#cfn-quicksight-template-boxplotchartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotchartconfiguration.html#cfn-quicksight-template-boxplotchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BoxPlotFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotfieldwells.html","Properties":{"BoxPlotAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotfieldwells.html#cfn-quicksight-template-boxplotfieldwells-boxplotaggregatedfieldwells","Required":false,"Type":"BoxPlotAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BoxPlotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotoptions.html","Properties":{"AllDataPointsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotoptions.html#cfn-quicksight-template-boxplotoptions-alldatapointsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutlierVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotoptions.html#cfn-quicksight-template-boxplotoptions-outliervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotoptions.html#cfn-quicksight-template-boxplotoptions-styleoptions","Required":false,"Type":"BoxPlotStyleOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BoxPlotSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotsortconfiguration.html","Properties":{"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotsortconfiguration.html#cfn-quicksight-template-boxplotsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"PaginationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotsortconfiguration.html#cfn-quicksight-template-boxplotsortconfiguration-paginationconfiguration","Required":false,"Type":"PaginationConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BoxPlotStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotstyleoptions.html","Properties":{"FillStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotstyleoptions.html#cfn-quicksight-template-boxplotstyleoptions-fillstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.BoxPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotvisual.html#cfn-quicksight-template-boxplotvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotvisual.html#cfn-quicksight-template-boxplotvisual-chartconfiguration","Required":false,"Type":"BoxPlotChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotvisual.html#cfn-quicksight-template-boxplotvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotvisual.html#cfn-quicksight-template-boxplotvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotvisual.html#cfn-quicksight-template-boxplotvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-boxplotvisual.html#cfn-quicksight-template-boxplotvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CalculatedField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-calculatedfield.html","Properties":{"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-calculatedfield.html#cfn-quicksight-template-calculatedfield-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-calculatedfield.html#cfn-quicksight-template-calculatedfield-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-calculatedfield.html#cfn-quicksight-template-calculatedfield-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CalculatedMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-calculatedmeasurefield.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-calculatedmeasurefield.html#cfn-quicksight-template-calculatedmeasurefield-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-calculatedmeasurefield.html#cfn-quicksight-template-calculatedmeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-cascadingcontrolconfiguration.html","Properties":{"SourceControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-cascadingcontrolconfiguration.html#cfn-quicksight-template-cascadingcontrolconfiguration-sourcecontrols","DuplicatesAllowed":true,"ItemType":"CascadingControlSource","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CascadingControlSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-cascadingcontrolsource.html","Properties":{"ColumnToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-cascadingcontrolsource.html#cfn-quicksight-template-cascadingcontrolsource-columntomatch","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"SourceSheetControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-cascadingcontrolsource.html#cfn-quicksight-template-cascadingcontrolsource-sourcesheetcontrolid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CategoricalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoricaldimensionfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoricaldimensionfield.html#cfn-quicksight-template-categoricaldimensionfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoricaldimensionfield.html#cfn-quicksight-template-categoricaldimensionfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoricaldimensionfield.html#cfn-quicksight-template-categoricaldimensionfield-formatconfiguration","Required":false,"Type":"StringFormatConfiguration","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoricaldimensionfield.html#cfn-quicksight-template-categoricaldimensionfield-hierarchyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CategoricalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoricalmeasurefield.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoricalmeasurefield.html#cfn-quicksight-template-categoricalmeasurefield-aggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoricalmeasurefield.html#cfn-quicksight-template-categoricalmeasurefield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoricalmeasurefield.html#cfn-quicksight-template-categoricalmeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoricalmeasurefield.html#cfn-quicksight-template-categoricalmeasurefield-formatconfiguration","Required":false,"Type":"StringFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CategoryDrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categorydrilldownfilter.html","Properties":{"CategoryValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categorydrilldownfilter.html#cfn-quicksight-template-categorydrilldownfilter-categoryvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categorydrilldownfilter.html#cfn-quicksight-template-categorydrilldownfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CategoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoryfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoryfilter.html#cfn-quicksight-template-categoryfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoryfilter.html#cfn-quicksight-template-categoryfilter-configuration","Required":true,"Type":"CategoryFilterConfiguration","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoryfilter.html#cfn-quicksight-template-categoryfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CategoryFilterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoryfilterconfiguration.html","Properties":{"CustomFilterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoryfilterconfiguration.html#cfn-quicksight-template-categoryfilterconfiguration-customfilterconfiguration","Required":false,"Type":"CustomFilterConfiguration","UpdateType":"Mutable"},"CustomFilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoryfilterconfiguration.html#cfn-quicksight-template-categoryfilterconfiguration-customfilterlistconfiguration","Required":false,"Type":"CustomFilterListConfiguration","UpdateType":"Mutable"},"FilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-categoryfilterconfiguration.html#cfn-quicksight-template-categoryfilterconfiguration-filterlistconfiguration","Required":false,"Type":"FilterListConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ChartAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-chartaxislabeloptions.html","Properties":{"AxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-chartaxislabeloptions.html#cfn-quicksight-template-chartaxislabeloptions-axislabeloptions","DuplicatesAllowed":true,"ItemType":"AxisLabelOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"SortIconVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-chartaxislabeloptions.html#cfn-quicksight-template-chartaxislabeloptions-sorticonvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-chartaxislabeloptions.html#cfn-quicksight-template-chartaxislabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-clustermarker.html","Properties":{"SimpleClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-clustermarker.html#cfn-quicksight-template-clustermarker-simpleclustermarker","Required":false,"Type":"SimpleClusterMarker","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ClusterMarkerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-clustermarkerconfiguration.html","Properties":{"ClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-clustermarkerconfiguration.html#cfn-quicksight-template-clustermarkerconfiguration-clustermarker","Required":false,"Type":"ClusterMarker","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-colorscale.html","Properties":{"ColorFillType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-colorscale.html#cfn-quicksight-template-colorscale-colorfilltype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-colorscale.html#cfn-quicksight-template-colorscale-colors","DuplicatesAllowed":true,"ItemType":"DataColor","Required":true,"Type":"List","UpdateType":"Mutable"},"NullValueColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-colorscale.html#cfn-quicksight-template-colorscale-nullvaluecolor","Required":false,"Type":"DataColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ColumnConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnconfiguration.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnconfiguration.html#cfn-quicksight-template-columnconfiguration-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnconfiguration.html#cfn-quicksight-template-columnconfiguration-formatconfiguration","Required":false,"Type":"FormatConfiguration","UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnconfiguration.html#cfn-quicksight-template-columnconfiguration-role","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ColumnGroupColumnSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columngroupcolumnschema.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columngroupcolumnschema.html#cfn-quicksight-template-columngroupcolumnschema-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ColumnGroupSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columngroupschema.html","Properties":{"ColumnGroupColumnSchemaList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columngroupschema.html#cfn-quicksight-template-columngroupschema-columngroupcolumnschemalist","DuplicatesAllowed":true,"ItemType":"ColumnGroupColumnSchema","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columngroupschema.html#cfn-quicksight-template-columngroupschema-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ColumnHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnhierarchy.html","Properties":{"DateTimeHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnhierarchy.html#cfn-quicksight-template-columnhierarchy-datetimehierarchy","Required":false,"Type":"DateTimeHierarchy","UpdateType":"Mutable"},"ExplicitHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnhierarchy.html#cfn-quicksight-template-columnhierarchy-explicithierarchy","Required":false,"Type":"ExplicitHierarchy","UpdateType":"Mutable"},"PredefinedHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnhierarchy.html#cfn-quicksight-template-columnhierarchy-predefinedhierarchy","Required":false,"Type":"PredefinedHierarchy","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ColumnIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnidentifier.html","Properties":{"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnidentifier.html#cfn-quicksight-template-columnidentifier-columnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnidentifier.html#cfn-quicksight-template-columnidentifier-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ColumnSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnschema.html","Properties":{"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnschema.html#cfn-quicksight-template-columnschema-datatype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GeographicRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnschema.html#cfn-quicksight-template-columnschema-geographicrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnschema.html#cfn-quicksight-template-columnschema-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ColumnSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnsort.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnsort.html#cfn-quicksight-template-columnsort-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnsort.html#cfn-quicksight-template-columnsort-direction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SortBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columnsort.html#cfn-quicksight-template-columnsort-sortby","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ColumnTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columntooltipitem.html","Properties":{"Aggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columntooltipitem.html#cfn-quicksight-template-columntooltipitem-aggregation","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columntooltipitem.html#cfn-quicksight-template-columntooltipitem-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columntooltipitem.html#cfn-quicksight-template-columntooltipitem-label","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-columntooltipitem.html#cfn-quicksight-template-columntooltipitem-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ComboChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartaggregatedfieldwells.html","Properties":{"BarValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartaggregatedfieldwells.html#cfn-quicksight-template-combochartaggregatedfieldwells-barvalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartaggregatedfieldwells.html#cfn-quicksight-template-combochartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartaggregatedfieldwells.html#cfn-quicksight-template-combochartaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"LineValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartaggregatedfieldwells.html#cfn-quicksight-template-combochartaggregatedfieldwells-linevalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ComboChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html","Properties":{"BarDataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-bardatalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"BarsArrangement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-barsarrangement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-fieldwells","Required":false,"Type":"ComboChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"LineDataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-linedatalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SecondaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-secondaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"SecondaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-secondaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-sortconfiguration","Required":false,"Type":"ComboChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartconfiguration.html#cfn-quicksight-template-combochartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ComboChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartfieldwells.html","Properties":{"ComboChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartfieldwells.html#cfn-quicksight-template-combochartfieldwells-combochartaggregatedfieldwells","Required":false,"Type":"ComboChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ComboChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartsortconfiguration.html#cfn-quicksight-template-combochartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartsortconfiguration.html#cfn-quicksight-template-combochartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartsortconfiguration.html#cfn-quicksight-template-combochartsortconfiguration-coloritemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"ColorSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartsortconfiguration.html#cfn-quicksight-template-combochartsortconfiguration-colorsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ComboChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartvisual.html#cfn-quicksight-template-combochartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartvisual.html#cfn-quicksight-template-combochartvisual-chartconfiguration","Required":false,"Type":"ComboChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartvisual.html#cfn-quicksight-template-combochartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartvisual.html#cfn-quicksight-template-combochartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartvisual.html#cfn-quicksight-template-combochartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-combochartvisual.html#cfn-quicksight-template-combochartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ComparisonConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-comparisonconfiguration.html","Properties":{"ComparisonFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-comparisonconfiguration.html#cfn-quicksight-template-comparisonconfiguration-comparisonformat","Required":false,"Type":"ComparisonFormatConfiguration","UpdateType":"Mutable"},"ComparisonMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-comparisonconfiguration.html#cfn-quicksight-template-comparisonconfiguration-comparisonmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ComparisonFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-comparisonformatconfiguration.html","Properties":{"NumberDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-comparisonformatconfiguration.html#cfn-quicksight-template-comparisonformatconfiguration-numberdisplayformatconfiguration","Required":false,"Type":"NumberDisplayFormatConfiguration","UpdateType":"Mutable"},"PercentageDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-comparisonformatconfiguration.html#cfn-quicksight-template-comparisonformatconfiguration-percentagedisplayformatconfiguration","Required":false,"Type":"PercentageDisplayFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.Computation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-computation.html","Properties":{"Forecast":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-computation.html#cfn-quicksight-template-computation-forecast","Required":false,"Type":"ForecastComputation","UpdateType":"Mutable"},"GrowthRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-computation.html#cfn-quicksight-template-computation-growthrate","Required":false,"Type":"GrowthRateComputation","UpdateType":"Mutable"},"MaximumMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-computation.html#cfn-quicksight-template-computation-maximumminimum","Required":false,"Type":"MaximumMinimumComputation","UpdateType":"Mutable"},"MetricComparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-computation.html#cfn-quicksight-template-computation-metriccomparison","Required":false,"Type":"MetricComparisonComputation","UpdateType":"Mutable"},"PeriodOverPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-computation.html#cfn-quicksight-template-computation-periodoverperiod","Required":false,"Type":"PeriodOverPeriodComputation","UpdateType":"Mutable"},"PeriodToDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-computation.html#cfn-quicksight-template-computation-periodtodate","Required":false,"Type":"PeriodToDateComputation","UpdateType":"Mutable"},"TopBottomMovers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-computation.html#cfn-quicksight-template-computation-topbottommovers","Required":false,"Type":"TopBottomMoversComputation","UpdateType":"Mutable"},"TopBottomRanked":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-computation.html#cfn-quicksight-template-computation-topbottomranked","Required":false,"Type":"TopBottomRankedComputation","UpdateType":"Mutable"},"TotalAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-computation.html#cfn-quicksight-template-computation-totalaggregation","Required":false,"Type":"TotalAggregationComputation","UpdateType":"Mutable"},"UniqueValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-computation.html#cfn-quicksight-template-computation-uniquevalues","Required":false,"Type":"UniqueValuesComputation","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ConditionalFormattingColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingcolor.html","Properties":{"Gradient":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingcolor.html#cfn-quicksight-template-conditionalformattingcolor-gradient","Required":false,"Type":"ConditionalFormattingGradientColor","UpdateType":"Mutable"},"Solid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingcolor.html#cfn-quicksight-template-conditionalformattingcolor-solid","Required":false,"Type":"ConditionalFormattingSolidColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ConditionalFormattingCustomIconCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingcustomiconcondition.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingcustomiconcondition.html#cfn-quicksight-template-conditionalformattingcustomiconcondition-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingcustomiconcondition.html#cfn-quicksight-template-conditionalformattingcustomiconcondition-displayconfiguration","Required":false,"Type":"ConditionalFormattingIconDisplayConfiguration","UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingcustomiconcondition.html#cfn-quicksight-template-conditionalformattingcustomiconcondition-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IconOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingcustomiconcondition.html#cfn-quicksight-template-conditionalformattingcustomiconcondition-iconoptions","Required":true,"Type":"ConditionalFormattingCustomIconOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ConditionalFormattingCustomIconOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingcustomiconoptions.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingcustomiconoptions.html#cfn-quicksight-template-conditionalformattingcustomiconoptions-icon","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UnicodeIcon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingcustomiconoptions.html#cfn-quicksight-template-conditionalformattingcustomiconoptions-unicodeicon","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ConditionalFormattingGradientColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattinggradientcolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattinggradientcolor.html#cfn-quicksight-template-conditionalformattinggradientcolor-color","Required":true,"Type":"GradientColor","UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattinggradientcolor.html#cfn-quicksight-template-conditionalformattinggradientcolor-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ConditionalFormattingIcon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingicon.html","Properties":{"CustomCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingicon.html#cfn-quicksight-template-conditionalformattingicon-customcondition","Required":false,"Type":"ConditionalFormattingCustomIconCondition","UpdateType":"Mutable"},"IconSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingicon.html#cfn-quicksight-template-conditionalformattingicon-iconset","Required":false,"Type":"ConditionalFormattingIconSet","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ConditionalFormattingIconDisplayConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingicondisplayconfiguration.html","Properties":{"IconDisplayOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingicondisplayconfiguration.html#cfn-quicksight-template-conditionalformattingicondisplayconfiguration-icondisplayoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ConditionalFormattingIconSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingiconset.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingiconset.html#cfn-quicksight-template-conditionalformattingiconset-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IconSetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingiconset.html#cfn-quicksight-template-conditionalformattingiconset-iconsettype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ConditionalFormattingSolidColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingsolidcolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingsolidcolor.html#cfn-quicksight-template-conditionalformattingsolidcolor-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-conditionalformattingsolidcolor.html#cfn-quicksight-template-conditionalformattingsolidcolor-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ContributionAnalysisDefault":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-contributionanalysisdefault.html","Properties":{"ContributorDimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-contributionanalysisdefault.html#cfn-quicksight-template-contributionanalysisdefault-contributordimensions","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":true,"Type":"List","UpdateType":"Mutable"},"MeasureFieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-contributionanalysisdefault.html#cfn-quicksight-template-contributionanalysisdefault-measurefieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CurrencyDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-currencydisplayformatconfiguration.html","Properties":{"DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-currencydisplayformatconfiguration.html#cfn-quicksight-template-currencydisplayformatconfiguration-decimalplacesconfiguration","Required":false,"Type":"DecimalPlacesConfiguration","UpdateType":"Mutable"},"NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-currencydisplayformatconfiguration.html#cfn-quicksight-template-currencydisplayformatconfiguration-negativevalueconfiguration","Required":false,"Type":"NegativeValueConfiguration","UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-currencydisplayformatconfiguration.html#cfn-quicksight-template-currencydisplayformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumberScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-currencydisplayformatconfiguration.html#cfn-quicksight-template-currencydisplayformatconfiguration-numberscale","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-currencydisplayformatconfiguration.html#cfn-quicksight-template-currencydisplayformatconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-currencydisplayformatconfiguration.html#cfn-quicksight-template-currencydisplayformatconfiguration-separatorconfiguration","Required":false,"Type":"NumericSeparatorConfiguration","UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-currencydisplayformatconfiguration.html#cfn-quicksight-template-currencydisplayformatconfiguration-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Symbol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-currencydisplayformatconfiguration.html#cfn-quicksight-template-currencydisplayformatconfiguration-symbol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CustomActionFilterOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customactionfilteroperation.html","Properties":{"SelectedFieldsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customactionfilteroperation.html#cfn-quicksight-template-customactionfilteroperation-selectedfieldsconfiguration","Required":true,"Type":"FilterOperationSelectedFieldsConfiguration","UpdateType":"Mutable"},"TargetVisualsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customactionfilteroperation.html#cfn-quicksight-template-customactionfilteroperation-targetvisualsconfiguration","Required":true,"Type":"FilterOperationTargetVisualsConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CustomActionNavigationOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customactionnavigationoperation.html","Properties":{"LocalNavigationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customactionnavigationoperation.html#cfn-quicksight-template-customactionnavigationoperation-localnavigationconfiguration","Required":false,"Type":"LocalNavigationConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CustomActionSetParametersOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customactionsetparametersoperation.html","Properties":{"ParameterValueConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customactionsetparametersoperation.html#cfn-quicksight-template-customactionsetparametersoperation-parametervalueconfigurations","DuplicatesAllowed":true,"ItemType":"SetParameterValueConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CustomActionURLOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customactionurloperation.html","Properties":{"URLTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customactionurloperation.html#cfn-quicksight-template-customactionurloperation-urltarget","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"URLTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customactionurloperation.html#cfn-quicksight-template-customactionurloperation-urltemplate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CustomContentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcontentconfiguration.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcontentconfiguration.html#cfn-quicksight-template-customcontentconfiguration-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContentUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcontentconfiguration.html#cfn-quicksight-template-customcontentconfiguration-contenturl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcontentconfiguration.html#cfn-quicksight-template-customcontentconfiguration-imagescaling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CustomContentVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcontentvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcontentvisual.html#cfn-quicksight-template-customcontentvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcontentvisual.html#cfn-quicksight-template-customcontentvisual-chartconfiguration","Required":false,"Type":"CustomContentConfiguration","UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcontentvisual.html#cfn-quicksight-template-customcontentvisual-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcontentvisual.html#cfn-quicksight-template-customcontentvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcontentvisual.html#cfn-quicksight-template-customcontentvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customcontentvisual.html#cfn-quicksight-template-customcontentvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CustomFilterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customfilterconfiguration.html","Properties":{"CategoryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customfilterconfiguration.html#cfn-quicksight-template-customfilterconfiguration-categoryvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customfilterconfiguration.html#cfn-quicksight-template-customfilterconfiguration-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customfilterconfiguration.html#cfn-quicksight-template-customfilterconfiguration-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customfilterconfiguration.html#cfn-quicksight-template-customfilterconfiguration-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customfilterconfiguration.html#cfn-quicksight-template-customfilterconfiguration-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CustomFilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customfilterlistconfiguration.html","Properties":{"CategoryValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customfilterlistconfiguration.html#cfn-quicksight-template-customfilterlistconfiguration-categoryvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customfilterlistconfiguration.html#cfn-quicksight-template-customfilterlistconfiguration-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customfilterlistconfiguration.html#cfn-quicksight-template-customfilterlistconfiguration-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customfilterlistconfiguration.html#cfn-quicksight-template-customfilterlistconfiguration-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CustomNarrativeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customnarrativeoptions.html","Properties":{"Narrative":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customnarrativeoptions.html#cfn-quicksight-template-customnarrativeoptions-narrative","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CustomParameterValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customparametervalues.html","Properties":{"DateTimeValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customparametervalues.html#cfn-quicksight-template-customparametervalues-datetimevalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DecimalValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customparametervalues.html#cfn-quicksight-template-customparametervalues-decimalvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"},"IntegerValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customparametervalues.html#cfn-quicksight-template-customparametervalues-integervalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"},"StringValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customparametervalues.html#cfn-quicksight-template-customparametervalues-stringvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.CustomValuesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customvaluesconfiguration.html","Properties":{"CustomValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customvaluesconfiguration.html#cfn-quicksight-template-customvaluesconfiguration-customvalues","Required":true,"Type":"CustomParameterValues","UpdateType":"Mutable"},"IncludeNullValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-customvaluesconfiguration.html#cfn-quicksight-template-customvaluesconfiguration-includenullvalue","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataBarsOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-databarsoptions.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-databarsoptions.html#cfn-quicksight-template-databarsoptions-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NegativeColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-databarsoptions.html#cfn-quicksight-template-databarsoptions-negativecolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PositiveColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-databarsoptions.html#cfn-quicksight-template-databarsoptions-positivecolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datacolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datacolor.html#cfn-quicksight-template-datacolor-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datacolor.html#cfn-quicksight-template-datacolor-datavalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataFieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datafieldseriesitem.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datafieldseriesitem.html#cfn-quicksight-template-datafieldseriesitem-axisbinding","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datafieldseriesitem.html#cfn-quicksight-template-datafieldseriesitem-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datafieldseriesitem.html#cfn-quicksight-template-datafieldseriesitem-fieldvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datafieldseriesitem.html#cfn-quicksight-template-datafieldseriesitem-settings","Required":false,"Type":"LineChartSeriesSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeloptions.html","Properties":{"CategoryLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeloptions.html#cfn-quicksight-template-datalabeloptions-categorylabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataLabelTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeloptions.html#cfn-quicksight-template-datalabeloptions-datalabeltypes","DuplicatesAllowed":true,"ItemType":"DataLabelType","Required":false,"Type":"List","UpdateType":"Mutable"},"LabelColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeloptions.html#cfn-quicksight-template-datalabeloptions-labelcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeloptions.html#cfn-quicksight-template-datalabeloptions-labelcontent","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeloptions.html#cfn-quicksight-template-datalabeloptions-labelfontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"MeasureLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeloptions.html#cfn-quicksight-template-datalabeloptions-measurelabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Overlap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeloptions.html#cfn-quicksight-template-datalabeloptions-overlap","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeloptions.html#cfn-quicksight-template-datalabeloptions-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeloptions.html#cfn-quicksight-template-datalabeloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeloptions.html#cfn-quicksight-template-datalabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeltype.html","Properties":{"DataPathLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeltype.html#cfn-quicksight-template-datalabeltype-datapathlabeltype","Required":false,"Type":"DataPathLabelType","UpdateType":"Mutable"},"FieldLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeltype.html#cfn-quicksight-template-datalabeltype-fieldlabeltype","Required":false,"Type":"FieldLabelType","UpdateType":"Mutable"},"MaximumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeltype.html#cfn-quicksight-template-datalabeltype-maximumlabeltype","Required":false,"Type":"MaximumLabelType","UpdateType":"Mutable"},"MinimumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeltype.html#cfn-quicksight-template-datalabeltype-minimumlabeltype","Required":false,"Type":"MinimumLabelType","UpdateType":"Mutable"},"RangeEndsLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datalabeltype.html#cfn-quicksight-template-datalabeltype-rangeendslabeltype","Required":false,"Type":"RangeEndsLabelType","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataPathColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathcolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathcolor.html#cfn-quicksight-template-datapathcolor-color","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Element":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathcolor.html#cfn-quicksight-template-datapathcolor-element","Required":true,"Type":"DataPathValue","UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathcolor.html#cfn-quicksight-template-datapathcolor-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataPathLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathlabeltype.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathlabeltype.html#cfn-quicksight-template-datapathlabeltype-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathlabeltype.html#cfn-quicksight-template-datapathlabeltype-fieldvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathlabeltype.html#cfn-quicksight-template-datapathlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataPathSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathsort.html","Properties":{"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathsort.html#cfn-quicksight-template-datapathsort-direction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SortPaths":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathsort.html#cfn-quicksight-template-datapathsort-sortpaths","DuplicatesAllowed":true,"ItemType":"DataPathValue","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataPathValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathvalue.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathvalue.html#cfn-quicksight-template-datapathvalue-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datapathvalue.html#cfn-quicksight-template-datapathvalue-fieldvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataSetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datasetconfiguration.html","Properties":{"ColumnGroupSchemaList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datasetconfiguration.html#cfn-quicksight-template-datasetconfiguration-columngroupschemalist","DuplicatesAllowed":true,"ItemType":"ColumnGroupSchema","Required":false,"Type":"List","UpdateType":"Mutable"},"DataSetSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datasetconfiguration.html#cfn-quicksight-template-datasetconfiguration-datasetschema","Required":false,"Type":"DataSetSchema","UpdateType":"Mutable"},"Placeholder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datasetconfiguration.html#cfn-quicksight-template-datasetconfiguration-placeholder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataSetReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datasetreference.html","Properties":{"DataSetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datasetreference.html#cfn-quicksight-template-datasetreference-datasetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetPlaceholder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datasetreference.html#cfn-quicksight-template-datasetreference-datasetplaceholder","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DataSetSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datasetschema.html","Properties":{"ColumnSchemaList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datasetschema.html#cfn-quicksight-template-datasetschema-columnschemalist","DuplicatesAllowed":true,"ItemType":"ColumnSchema","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DateAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dateaxisoptions.html","Properties":{"MissingDateVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dateaxisoptions.html#cfn-quicksight-template-dateaxisoptions-missingdatevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DateDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datedimensionfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datedimensionfield.html#cfn-quicksight-template-datedimensionfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"DateGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datedimensionfield.html#cfn-quicksight-template-datedimensionfield-dategranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datedimensionfield.html#cfn-quicksight-template-datedimensionfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datedimensionfield.html#cfn-quicksight-template-datedimensionfield-formatconfiguration","Required":false,"Type":"DateTimeFormatConfiguration","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datedimensionfield.html#cfn-quicksight-template-datedimensionfield-hierarchyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DateMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datemeasurefield.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datemeasurefield.html#cfn-quicksight-template-datemeasurefield-aggregationfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datemeasurefield.html#cfn-quicksight-template-datemeasurefield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datemeasurefield.html#cfn-quicksight-template-datemeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datemeasurefield.html#cfn-quicksight-template-datemeasurefield-formatconfiguration","Required":false,"Type":"DateTimeFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DateTimeDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimedefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimedefaultvalues.html#cfn-quicksight-template-datetimedefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"RollingDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimedefaultvalues.html#cfn-quicksight-template-datetimedefaultvalues-rollingdate","Required":false,"Type":"RollingDateConfiguration","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimedefaultvalues.html#cfn-quicksight-template-datetimedefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DateTimeFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimeformatconfiguration.html","Properties":{"DateTimeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimeformatconfiguration.html#cfn-quicksight-template-datetimeformatconfiguration-datetimeformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimeformatconfiguration.html#cfn-quicksight-template-datetimeformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumericFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimeformatconfiguration.html#cfn-quicksight-template-datetimeformatconfiguration-numericformatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DateTimeHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimehierarchy.html","Properties":{"DrillDownFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimehierarchy.html#cfn-quicksight-template-datetimehierarchy-drilldownfilters","DuplicatesAllowed":true,"ItemType":"DrillDownFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimehierarchy.html#cfn-quicksight-template-datetimehierarchy-hierarchyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DateTimeParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimeparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimeparameterdeclaration.html#cfn-quicksight-template-datetimeparameterdeclaration-defaultvalues","Required":false,"Type":"DateTimeDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimeparameterdeclaration.html#cfn-quicksight-template-datetimeparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimeparameterdeclaration.html#cfn-quicksight-template-datetimeparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimeparameterdeclaration.html#cfn-quicksight-template-datetimeparameterdeclaration-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimeparameterdeclaration.html#cfn-quicksight-template-datetimeparameterdeclaration-valuewhenunset","Required":false,"Type":"DateTimeValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DateTimePickerControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimepickercontroldisplayoptions.html","Properties":{"DateTimeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimepickercontroldisplayoptions.html#cfn-quicksight-template-datetimepickercontroldisplayoptions-datetimeformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimepickercontroldisplayoptions.html#cfn-quicksight-template-datetimepickercontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DateTimeValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimevaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimevaluewhenunsetconfiguration.html#cfn-quicksight-template-datetimevaluewhenunsetconfiguration-customvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-datetimevaluewhenunsetconfiguration.html#cfn-quicksight-template-datetimevaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DecimalDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimaldefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimaldefaultvalues.html#cfn-quicksight-template-decimaldefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimaldefaultvalues.html#cfn-quicksight-template-decimaldefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DecimalParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimalparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimalparameterdeclaration.html#cfn-quicksight-template-decimalparameterdeclaration-defaultvalues","Required":false,"Type":"DecimalDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimalparameterdeclaration.html#cfn-quicksight-template-decimalparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimalparameterdeclaration.html#cfn-quicksight-template-decimalparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimalparameterdeclaration.html#cfn-quicksight-template-decimalparameterdeclaration-parametervaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimalparameterdeclaration.html#cfn-quicksight-template-decimalparameterdeclaration-valuewhenunset","Required":false,"Type":"DecimalValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimalplacesconfiguration.html","Properties":{"DecimalPlaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimalplacesconfiguration.html#cfn-quicksight-template-decimalplacesconfiguration-decimalplaces","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DecimalValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimalvaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimalvaluewhenunsetconfiguration.html#cfn-quicksight-template-decimalvaluewhenunsetconfiguration-customvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-decimalvaluewhenunsetconfiguration.html#cfn-quicksight-template-decimalvaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DefaultFreeFormLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultfreeformlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultfreeformlayoutconfiguration.html#cfn-quicksight-template-defaultfreeformlayoutconfiguration-canvassizeoptions","Required":true,"Type":"FreeFormLayoutCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DefaultGridLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultgridlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultgridlayoutconfiguration.html#cfn-quicksight-template-defaultgridlayoutconfiguration-canvassizeoptions","Required":true,"Type":"GridLayoutCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DefaultInteractiveLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultinteractivelayoutconfiguration.html","Properties":{"FreeForm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultinteractivelayoutconfiguration.html#cfn-quicksight-template-defaultinteractivelayoutconfiguration-freeform","Required":false,"Type":"DefaultFreeFormLayoutConfiguration","UpdateType":"Mutable"},"Grid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultinteractivelayoutconfiguration.html#cfn-quicksight-template-defaultinteractivelayoutconfiguration-grid","Required":false,"Type":"DefaultGridLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DefaultNewSheetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultnewsheetconfiguration.html","Properties":{"InteractiveLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultnewsheetconfiguration.html#cfn-quicksight-template-defaultnewsheetconfiguration-interactivelayoutconfiguration","Required":false,"Type":"DefaultInteractiveLayoutConfiguration","UpdateType":"Mutable"},"PaginatedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultnewsheetconfiguration.html#cfn-quicksight-template-defaultnewsheetconfiguration-paginatedlayoutconfiguration","Required":false,"Type":"DefaultPaginatedLayoutConfiguration","UpdateType":"Mutable"},"SheetContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultnewsheetconfiguration.html#cfn-quicksight-template-defaultnewsheetconfiguration-sheetcontenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DefaultPaginatedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultpaginatedlayoutconfiguration.html","Properties":{"SectionBased":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultpaginatedlayoutconfiguration.html#cfn-quicksight-template-defaultpaginatedlayoutconfiguration-sectionbased","Required":false,"Type":"DefaultSectionBasedLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DefaultSectionBasedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultsectionbasedlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-defaultsectionbasedlayoutconfiguration.html#cfn-quicksight-template-defaultsectionbasedlayoutconfiguration-canvassizeoptions","Required":true,"Type":"SectionBasedLayoutCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DestinationParameterValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-destinationparametervalueconfiguration.html","Properties":{"CustomValuesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-destinationparametervalueconfiguration.html#cfn-quicksight-template-destinationparametervalueconfiguration-customvaluesconfiguration","Required":false,"Type":"CustomValuesConfiguration","UpdateType":"Mutable"},"SelectAllValueOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-destinationparametervalueconfiguration.html#cfn-quicksight-template-destinationparametervalueconfiguration-selectallvalueoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-destinationparametervalueconfiguration.html#cfn-quicksight-template-destinationparametervalueconfiguration-sourcecolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"SourceField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-destinationparametervalueconfiguration.html#cfn-quicksight-template-destinationparametervalueconfiguration-sourcefield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-destinationparametervalueconfiguration.html#cfn-quicksight-template-destinationparametervalueconfiguration-sourceparametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dimensionfield.html","Properties":{"CategoricalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dimensionfield.html#cfn-quicksight-template-dimensionfield-categoricaldimensionfield","Required":false,"Type":"CategoricalDimensionField","UpdateType":"Mutable"},"DateDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dimensionfield.html#cfn-quicksight-template-dimensionfield-datedimensionfield","Required":false,"Type":"DateDimensionField","UpdateType":"Mutable"},"NumericalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dimensionfield.html#cfn-quicksight-template-dimensionfield-numericaldimensionfield","Required":false,"Type":"NumericalDimensionField","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DonutCenterOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-donutcenteroptions.html","Properties":{"LabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-donutcenteroptions.html#cfn-quicksight-template-donutcenteroptions-labelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DonutOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-donutoptions.html","Properties":{"ArcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-donutoptions.html#cfn-quicksight-template-donutoptions-arcoptions","Required":false,"Type":"ArcOptions","UpdateType":"Mutable"},"DonutCenterOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-donutoptions.html#cfn-quicksight-template-donutoptions-donutcenteroptions","Required":false,"Type":"DonutCenterOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-drilldownfilter.html","Properties":{"CategoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-drilldownfilter.html#cfn-quicksight-template-drilldownfilter-categoryfilter","Required":false,"Type":"CategoryDrillDownFilter","UpdateType":"Mutable"},"NumericEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-drilldownfilter.html#cfn-quicksight-template-drilldownfilter-numericequalityfilter","Required":false,"Type":"NumericEqualityDrillDownFilter","UpdateType":"Mutable"},"TimeRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-drilldownfilter.html#cfn-quicksight-template-drilldownfilter-timerangefilter","Required":false,"Type":"TimeRangeDrillDownFilter","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DropDownControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dropdowncontroldisplayoptions.html","Properties":{"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dropdowncontroldisplayoptions.html#cfn-quicksight-template-dropdowncontroldisplayoptions-selectalloptions","Required":false,"Type":"ListControlSelectAllOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dropdowncontroldisplayoptions.html#cfn-quicksight-template-dropdowncontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.DynamicDefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dynamicdefaultvalue.html","Properties":{"DefaultValueColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dynamicdefaultvalue.html#cfn-quicksight-template-dynamicdefaultvalue-defaultvaluecolumn","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"GroupNameColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dynamicdefaultvalue.html#cfn-quicksight-template-dynamicdefaultvalue-groupnamecolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"UserNameColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-dynamicdefaultvalue.html#cfn-quicksight-template-dynamicdefaultvalue-usernamecolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.EmptyVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-emptyvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-emptyvisual.html#cfn-quicksight-template-emptyvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-emptyvisual.html#cfn-quicksight-template-emptyvisual-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-emptyvisual.html#cfn-quicksight-template-emptyvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.Entity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-entity.html","Properties":{"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-entity.html#cfn-quicksight-template-entity-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ExcludePeriodConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-excludeperiodconfiguration.html","Properties":{"Amount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-excludeperiodconfiguration.html#cfn-quicksight-template-excludeperiodconfiguration-amount","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Granularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-excludeperiodconfiguration.html#cfn-quicksight-template-excludeperiodconfiguration-granularity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-excludeperiodconfiguration.html#cfn-quicksight-template-excludeperiodconfiguration-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ExplicitHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-explicithierarchy.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-explicithierarchy.html#cfn-quicksight-template-explicithierarchy-columns","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":true,"Type":"List","UpdateType":"Mutable"},"DrillDownFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-explicithierarchy.html#cfn-quicksight-template-explicithierarchy-drilldownfilters","DuplicatesAllowed":true,"ItemType":"DrillDownFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-explicithierarchy.html#cfn-quicksight-template-explicithierarchy-hierarchyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FieldBasedTooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldbasedtooltip.html","Properties":{"AggregationVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldbasedtooltip.html#cfn-quicksight-template-fieldbasedtooltip-aggregationvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TooltipFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldbasedtooltip.html#cfn-quicksight-template-fieldbasedtooltip-tooltipfields","DuplicatesAllowed":true,"ItemType":"TooltipItem","Required":false,"Type":"List","UpdateType":"Mutable"},"TooltipTitleType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldbasedtooltip.html#cfn-quicksight-template-fieldbasedtooltip-tooltiptitletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FieldLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldlabeltype.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldlabeltype.html#cfn-quicksight-template-fieldlabeltype-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldlabeltype.html#cfn-quicksight-template-fieldlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldseriesitem.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldseriesitem.html#cfn-quicksight-template-fieldseriesitem-axisbinding","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldseriesitem.html#cfn-quicksight-template-fieldseriesitem-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldseriesitem.html#cfn-quicksight-template-fieldseriesitem-settings","Required":false,"Type":"LineChartSeriesSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FieldSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldsort.html","Properties":{"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldsort.html#cfn-quicksight-template-fieldsort-direction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldsort.html#cfn-quicksight-template-fieldsort-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FieldSortOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldsortoptions.html","Properties":{"ColumnSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldsortoptions.html#cfn-quicksight-template-fieldsortoptions-columnsort","Required":false,"Type":"ColumnSort","UpdateType":"Mutable"},"FieldSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldsortoptions.html#cfn-quicksight-template-fieldsortoptions-fieldsort","Required":false,"Type":"FieldSort","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FieldTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldtooltipitem.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldtooltipitem.html#cfn-quicksight-template-fieldtooltipitem-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldtooltipitem.html#cfn-quicksight-template-fieldtooltipitem-label","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fieldtooltipitem.html#cfn-quicksight-template-fieldtooltipitem-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilledMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapaggregatedfieldwells.html","Properties":{"Geospatial":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapaggregatedfieldwells.html#cfn-quicksight-template-filledmapaggregatedfieldwells-geospatial","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapaggregatedfieldwells.html#cfn-quicksight-template-filledmapaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilledMapConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapconditionalformatting.html#cfn-quicksight-template-filledmapconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"FilledMapConditionalFormattingOption","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilledMapConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapconditionalformattingoption.html","Properties":{"Shape":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapconditionalformattingoption.html#cfn-quicksight-template-filledmapconditionalformattingoption-shape","Required":true,"Type":"FilledMapShapeConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilledMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapconfiguration.html","Properties":{"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapconfiguration.html#cfn-quicksight-template-filledmapconfiguration-fieldwells","Required":false,"Type":"FilledMapFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapconfiguration.html#cfn-quicksight-template-filledmapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"MapStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapconfiguration.html#cfn-quicksight-template-filledmapconfiguration-mapstyleoptions","Required":false,"Type":"GeospatialMapStyleOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapconfiguration.html#cfn-quicksight-template-filledmapconfiguration-sortconfiguration","Required":false,"Type":"FilledMapSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapconfiguration.html#cfn-quicksight-template-filledmapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"WindowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapconfiguration.html#cfn-quicksight-template-filledmapconfiguration-windowoptions","Required":false,"Type":"GeospatialWindowOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilledMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapfieldwells.html","Properties":{"FilledMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapfieldwells.html#cfn-quicksight-template-filledmapfieldwells-filledmapaggregatedfieldwells","Required":false,"Type":"FilledMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilledMapShapeConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapshapeconditionalformatting.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapshapeconditionalformatting.html#cfn-quicksight-template-filledmapshapeconditionalformatting-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapshapeconditionalformatting.html#cfn-quicksight-template-filledmapshapeconditionalformatting-format","Required":false,"Type":"ShapeConditionalFormat","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilledMapSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapsortconfiguration.html","Properties":{"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapsortconfiguration.html#cfn-quicksight-template-filledmapsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilledMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapvisual.html#cfn-quicksight-template-filledmapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapvisual.html#cfn-quicksight-template-filledmapvisual-chartconfiguration","Required":false,"Type":"FilledMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapvisual.html#cfn-quicksight-template-filledmapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapvisual.html#cfn-quicksight-template-filledmapvisual-conditionalformatting","Required":false,"Type":"FilledMapConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapvisual.html#cfn-quicksight-template-filledmapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapvisual.html#cfn-quicksight-template-filledmapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filledmapvisual.html#cfn-quicksight-template-filledmapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filter.html","Properties":{"CategoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filter.html#cfn-quicksight-template-filter-categoryfilter","Required":false,"Type":"CategoryFilter","UpdateType":"Mutable"},"NumericEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filter.html#cfn-quicksight-template-filter-numericequalityfilter","Required":false,"Type":"NumericEqualityFilter","UpdateType":"Mutable"},"NumericRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filter.html#cfn-quicksight-template-filter-numericrangefilter","Required":false,"Type":"NumericRangeFilter","UpdateType":"Mutable"},"RelativeDatesFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filter.html#cfn-quicksight-template-filter-relativedatesfilter","Required":false,"Type":"RelativeDatesFilter","UpdateType":"Mutable"},"TimeEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filter.html#cfn-quicksight-template-filter-timeequalityfilter","Required":false,"Type":"TimeEqualityFilter","UpdateType":"Mutable"},"TimeRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filter.html#cfn-quicksight-template-filter-timerangefilter","Required":false,"Type":"TimeRangeFilter","UpdateType":"Mutable"},"TopBottomFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filter.html#cfn-quicksight-template-filter-topbottomfilter","Required":false,"Type":"TopBottomFilter","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtercontrol.html","Properties":{"DateTimePicker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtercontrol.html#cfn-quicksight-template-filtercontrol-datetimepicker","Required":false,"Type":"FilterDateTimePickerControl","UpdateType":"Mutable"},"Dropdown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtercontrol.html#cfn-quicksight-template-filtercontrol-dropdown","Required":false,"Type":"FilterDropDownControl","UpdateType":"Mutable"},"List":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtercontrol.html#cfn-quicksight-template-filtercontrol-list","Required":false,"Type":"FilterListControl","UpdateType":"Mutable"},"RelativeDateTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtercontrol.html#cfn-quicksight-template-filtercontrol-relativedatetime","Required":false,"Type":"FilterRelativeDateTimeControl","UpdateType":"Mutable"},"Slider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtercontrol.html#cfn-quicksight-template-filtercontrol-slider","Required":false,"Type":"FilterSliderControl","UpdateType":"Mutable"},"TextArea":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtercontrol.html#cfn-quicksight-template-filtercontrol-textarea","Required":false,"Type":"FilterTextAreaControl","UpdateType":"Mutable"},"TextField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtercontrol.html#cfn-quicksight-template-filtercontrol-textfield","Required":false,"Type":"FilterTextFieldControl","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterDateTimePickerControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdatetimepickercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdatetimepickercontrol.html#cfn-quicksight-template-filterdatetimepickercontrol-displayoptions","Required":false,"Type":"DateTimePickerControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdatetimepickercontrol.html#cfn-quicksight-template-filterdatetimepickercontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdatetimepickercontrol.html#cfn-quicksight-template-filterdatetimepickercontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdatetimepickercontrol.html#cfn-quicksight-template-filterdatetimepickercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdatetimepickercontrol.html#cfn-quicksight-template-filterdatetimepickercontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterDropDownControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdropdowncontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdropdowncontrol.html#cfn-quicksight-template-filterdropdowncontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdropdowncontrol.html#cfn-quicksight-template-filterdropdowncontrol-displayoptions","Required":false,"Type":"DropDownControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdropdowncontrol.html#cfn-quicksight-template-filterdropdowncontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdropdowncontrol.html#cfn-quicksight-template-filterdropdowncontrol-selectablevalues","Required":false,"Type":"FilterSelectableValues","UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdropdowncontrol.html#cfn-quicksight-template-filterdropdowncontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdropdowncontrol.html#cfn-quicksight-template-filterdropdowncontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterdropdowncontrol.html#cfn-quicksight-template-filterdropdowncontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtergroup.html","Properties":{"CrossDataset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtergroup.html#cfn-quicksight-template-filtergroup-crossdataset","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FilterGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtergroup.html#cfn-quicksight-template-filtergroup-filtergroupid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtergroup.html#cfn-quicksight-template-filtergroup-filters","DuplicatesAllowed":true,"ItemType":"Filter","Required":true,"Type":"List","UpdateType":"Mutable"},"ScopeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtergroup.html#cfn-quicksight-template-filtergroup-scopeconfiguration","Required":true,"Type":"FilterScopeConfiguration","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtergroup.html#cfn-quicksight-template-filtergroup-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterListConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistconfiguration.html","Properties":{"CategoryValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistconfiguration.html#cfn-quicksight-template-filterlistconfiguration-categoryvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistconfiguration.html#cfn-quicksight-template-filterlistconfiguration-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistconfiguration.html#cfn-quicksight-template-filterlistconfiguration-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterListControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistcontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistcontrol.html#cfn-quicksight-template-filterlistcontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistcontrol.html#cfn-quicksight-template-filterlistcontrol-displayoptions","Required":false,"Type":"ListControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistcontrol.html#cfn-quicksight-template-filterlistcontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistcontrol.html#cfn-quicksight-template-filterlistcontrol-selectablevalues","Required":false,"Type":"FilterSelectableValues","UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistcontrol.html#cfn-quicksight-template-filterlistcontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistcontrol.html#cfn-quicksight-template-filterlistcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterlistcontrol.html#cfn-quicksight-template-filterlistcontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterOperationSelectedFieldsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filteroperationselectedfieldsconfiguration.html","Properties":{"SelectedColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filteroperationselectedfieldsconfiguration.html#cfn-quicksight-template-filteroperationselectedfieldsconfiguration-selectedcolumns","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filteroperationselectedfieldsconfiguration.html#cfn-quicksight-template-filteroperationselectedfieldsconfiguration-selectedfieldoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectedFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filteroperationselectedfieldsconfiguration.html#cfn-quicksight-template-filteroperationselectedfieldsconfiguration-selectedfields","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterOperationTargetVisualsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filteroperationtargetvisualsconfiguration.html","Properties":{"SameSheetTargetVisualConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filteroperationtargetvisualsconfiguration.html#cfn-quicksight-template-filteroperationtargetvisualsconfiguration-samesheettargetvisualconfiguration","Required":false,"Type":"SameSheetTargetVisualConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterRelativeDateTimeControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterrelativedatetimecontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterrelativedatetimecontrol.html#cfn-quicksight-template-filterrelativedatetimecontrol-displayoptions","Required":false,"Type":"RelativeDateTimeControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterrelativedatetimecontrol.html#cfn-quicksight-template-filterrelativedatetimecontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterrelativedatetimecontrol.html#cfn-quicksight-template-filterrelativedatetimecontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterrelativedatetimecontrol.html#cfn-quicksight-template-filterrelativedatetimecontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterScopeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterscopeconfiguration.html","Properties":{"SelectedSheets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterscopeconfiguration.html#cfn-quicksight-template-filterscopeconfiguration-selectedsheets","Required":false,"Type":"SelectedSheetsFilterScopeConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterSelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterselectablevalues.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterselectablevalues.html#cfn-quicksight-template-filterselectablevalues-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterSliderControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterslidercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterslidercontrol.html#cfn-quicksight-template-filterslidercontrol-displayoptions","Required":false,"Type":"SliderControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterslidercontrol.html#cfn-quicksight-template-filterslidercontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MaximumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterslidercontrol.html#cfn-quicksight-template-filterslidercontrol-maximumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"MinimumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterslidercontrol.html#cfn-quicksight-template-filterslidercontrol-minimumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterslidercontrol.html#cfn-quicksight-template-filterslidercontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterslidercontrol.html#cfn-quicksight-template-filterslidercontrol-stepsize","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterslidercontrol.html#cfn-quicksight-template-filterslidercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filterslidercontrol.html#cfn-quicksight-template-filterslidercontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterTextAreaControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtertextareacontrol.html","Properties":{"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtertextareacontrol.html#cfn-quicksight-template-filtertextareacontrol-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtertextareacontrol.html#cfn-quicksight-template-filtertextareacontrol-displayoptions","Required":false,"Type":"TextAreaControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtertextareacontrol.html#cfn-quicksight-template-filtertextareacontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtertextareacontrol.html#cfn-quicksight-template-filtertextareacontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtertextareacontrol.html#cfn-quicksight-template-filtertextareacontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FilterTextFieldControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtertextfieldcontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtertextfieldcontrol.html#cfn-quicksight-template-filtertextfieldcontrol-displayoptions","Required":false,"Type":"TextFieldControlDisplayOptions","UpdateType":"Mutable"},"FilterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtertextfieldcontrol.html#cfn-quicksight-template-filtertextfieldcontrol-filtercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtertextfieldcontrol.html#cfn-quicksight-template-filtertextfieldcontrol-sourcefilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-filtertextfieldcontrol.html#cfn-quicksight-template-filtertextfieldcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fontconfiguration.html","Properties":{"FontColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fontconfiguration.html#cfn-quicksight-template-fontconfiguration-fontcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontDecoration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fontconfiguration.html#cfn-quicksight-template-fontconfiguration-fontdecoration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fontconfiguration.html#cfn-quicksight-template-fontconfiguration-fontsize","Required":false,"Type":"FontSize","UpdateType":"Mutable"},"FontStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fontconfiguration.html#cfn-quicksight-template-fontconfiguration-fontstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fontconfiguration.html#cfn-quicksight-template-fontconfiguration-fontweight","Required":false,"Type":"FontWeight","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FontSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fontsize.html","Properties":{"Relative":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fontsize.html#cfn-quicksight-template-fontsize-relative","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FontWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fontweight.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-fontweight.html#cfn-quicksight-template-fontweight-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ForecastComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html#cfn-quicksight-template-forecastcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CustomSeasonalityValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html#cfn-quicksight-template-forecastcomputation-customseasonalityvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"LowerBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html#cfn-quicksight-template-forecastcomputation-lowerboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html#cfn-quicksight-template-forecastcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PeriodsBackward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html#cfn-quicksight-template-forecastcomputation-periodsbackward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PeriodsForward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html#cfn-quicksight-template-forecastcomputation-periodsforward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PredictionInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html#cfn-quicksight-template-forecastcomputation-predictioninterval","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Seasonality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html#cfn-quicksight-template-forecastcomputation-seasonality","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html#cfn-quicksight-template-forecastcomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"UpperBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html#cfn-quicksight-template-forecastcomputation-upperboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastcomputation.html#cfn-quicksight-template-forecastcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ForecastConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastconfiguration.html","Properties":{"ForecastProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastconfiguration.html#cfn-quicksight-template-forecastconfiguration-forecastproperties","Required":false,"Type":"TimeBasedForecastProperties","UpdateType":"Mutable"},"Scenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastconfiguration.html#cfn-quicksight-template-forecastconfiguration-scenario","Required":false,"Type":"ForecastScenario","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ForecastScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastscenario.html","Properties":{"WhatIfPointScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastscenario.html#cfn-quicksight-template-forecastscenario-whatifpointscenario","Required":false,"Type":"WhatIfPointScenario","UpdateType":"Mutable"},"WhatIfRangeScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-forecastscenario.html#cfn-quicksight-template-forecastscenario-whatifrangescenario","Required":false,"Type":"WhatIfRangeScenario","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-formatconfiguration.html","Properties":{"DateTimeFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-formatconfiguration.html#cfn-quicksight-template-formatconfiguration-datetimeformatconfiguration","Required":false,"Type":"DateTimeFormatConfiguration","UpdateType":"Mutable"},"NumberFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-formatconfiguration.html#cfn-quicksight-template-formatconfiguration-numberformatconfiguration","Required":false,"Type":"NumberFormatConfiguration","UpdateType":"Mutable"},"StringFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-formatconfiguration.html#cfn-quicksight-template-formatconfiguration-stringformatconfiguration","Required":false,"Type":"StringFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FreeFormLayoutCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutcanvassizeoptions.html","Properties":{"ScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutcanvassizeoptions.html#cfn-quicksight-template-freeformlayoutcanvassizeoptions-screencanvassizeoptions","Required":false,"Type":"FreeFormLayoutScreenCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FreeFormLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutconfiguration.html#cfn-quicksight-template-freeformlayoutconfiguration-canvassizeoptions","Required":false,"Type":"FreeFormLayoutCanvasSizeOptions","UpdateType":"Mutable"},"Elements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutconfiguration.html#cfn-quicksight-template-freeformlayoutconfiguration-elements","DuplicatesAllowed":true,"ItemType":"FreeFormLayoutElement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FreeFormLayoutElement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html","Properties":{"BackgroundStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-backgroundstyle","Required":false,"Type":"FreeFormLayoutElementBackgroundStyle","UpdateType":"Mutable"},"BorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-borderstyle","Required":false,"Type":"FreeFormLayoutElementBorderStyle","UpdateType":"Mutable"},"ElementId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-elementid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ElementType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-elementtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-height","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LoadingAnimation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-loadinganimation","Required":false,"Type":"LoadingAnimation","UpdateType":"Mutable"},"RenderingRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-renderingrules","DuplicatesAllowed":true,"ItemType":"SheetElementRenderingRule","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedBorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-selectedborderstyle","Required":false,"Type":"FreeFormLayoutElementBorderStyle","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-width","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"XAxisLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-xaxislocation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"YAxisLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelement.html#cfn-quicksight-template-freeformlayoutelement-yaxislocation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FreeFormLayoutElementBackgroundStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelementbackgroundstyle.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelementbackgroundstyle.html#cfn-quicksight-template-freeformlayoutelementbackgroundstyle-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelementbackgroundstyle.html#cfn-quicksight-template-freeformlayoutelementbackgroundstyle-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FreeFormLayoutElementBorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelementborderstyle.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelementborderstyle.html#cfn-quicksight-template-freeformlayoutelementborderstyle-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutelementborderstyle.html#cfn-quicksight-template-freeformlayoutelementborderstyle-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FreeFormLayoutScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutscreencanvassizeoptions.html","Properties":{"OptimizedViewPortWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformlayoutscreencanvassizeoptions.html#cfn-quicksight-template-freeformlayoutscreencanvassizeoptions-optimizedviewportwidth","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FreeFormSectionLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformsectionlayoutconfiguration.html","Properties":{"Elements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-freeformsectionlayoutconfiguration.html#cfn-quicksight-template-freeformsectionlayoutconfiguration-elements","DuplicatesAllowed":true,"ItemType":"FreeFormLayoutElement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FunnelChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartaggregatedfieldwells.html#cfn-quicksight-template-funnelchartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartaggregatedfieldwells.html#cfn-quicksight-template-funnelchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FunnelChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartconfiguration.html","Properties":{"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartconfiguration.html#cfn-quicksight-template-funnelchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"DataLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartconfiguration.html#cfn-quicksight-template-funnelchartconfiguration-datalabeloptions","Required":false,"Type":"FunnelChartDataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartconfiguration.html#cfn-quicksight-template-funnelchartconfiguration-fieldwells","Required":false,"Type":"FunnelChartFieldWells","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartconfiguration.html#cfn-quicksight-template-funnelchartconfiguration-sortconfiguration","Required":false,"Type":"FunnelChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartconfiguration.html#cfn-quicksight-template-funnelchartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"ValueLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartconfiguration.html#cfn-quicksight-template-funnelchartconfiguration-valuelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartconfiguration.html#cfn-quicksight-template-funnelchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FunnelChartDataLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartdatalabeloptions.html","Properties":{"CategoryLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartdatalabeloptions.html#cfn-quicksight-template-funnelchartdatalabeloptions-categorylabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartdatalabeloptions.html#cfn-quicksight-template-funnelchartdatalabeloptions-labelcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LabelFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartdatalabeloptions.html#cfn-quicksight-template-funnelchartdatalabeloptions-labelfontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"MeasureDataLabelStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartdatalabeloptions.html#cfn-quicksight-template-funnelchartdatalabeloptions-measuredatalabelstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MeasureLabelVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartdatalabeloptions.html#cfn-quicksight-template-funnelchartdatalabeloptions-measurelabelvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartdatalabeloptions.html#cfn-quicksight-template-funnelchartdatalabeloptions-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartdatalabeloptions.html#cfn-quicksight-template-funnelchartdatalabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FunnelChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartfieldwells.html","Properties":{"FunnelChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartfieldwells.html#cfn-quicksight-template-funnelchartfieldwells-funnelchartaggregatedfieldwells","Required":false,"Type":"FunnelChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FunnelChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartsortconfiguration.html#cfn-quicksight-template-funnelchartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartsortconfiguration.html#cfn-quicksight-template-funnelchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.FunnelChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartvisual.html#cfn-quicksight-template-funnelchartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartvisual.html#cfn-quicksight-template-funnelchartvisual-chartconfiguration","Required":false,"Type":"FunnelChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartvisual.html#cfn-quicksight-template-funnelchartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartvisual.html#cfn-quicksight-template-funnelchartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartvisual.html#cfn-quicksight-template-funnelchartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-funnelchartvisual.html#cfn-quicksight-template-funnelchartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GaugeChartArcConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartarcconditionalformatting.html","Properties":{"ForegroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartarcconditionalformatting.html#cfn-quicksight-template-gaugechartarcconditionalformatting-foregroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GaugeChartConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartconditionalformatting.html#cfn-quicksight-template-gaugechartconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"GaugeChartConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GaugeChartConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartconditionalformattingoption.html","Properties":{"Arc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartconditionalformattingoption.html#cfn-quicksight-template-gaugechartconditionalformattingoption-arc","Required":false,"Type":"GaugeChartArcConditionalFormatting","UpdateType":"Mutable"},"PrimaryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartconditionalformattingoption.html#cfn-quicksight-template-gaugechartconditionalformattingoption-primaryvalue","Required":false,"Type":"GaugeChartPrimaryValueConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GaugeChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartconfiguration.html","Properties":{"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartconfiguration.html#cfn-quicksight-template-gaugechartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartconfiguration.html#cfn-quicksight-template-gaugechartconfiguration-fieldwells","Required":false,"Type":"GaugeChartFieldWells","UpdateType":"Mutable"},"GaugeChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartconfiguration.html#cfn-quicksight-template-gaugechartconfiguration-gaugechartoptions","Required":false,"Type":"GaugeChartOptions","UpdateType":"Mutable"},"TooltipOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartconfiguration.html#cfn-quicksight-template-gaugechartconfiguration-tooltipoptions","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartconfiguration.html#cfn-quicksight-template-gaugechartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GaugeChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartfieldwells.html","Properties":{"TargetValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartfieldwells.html#cfn-quicksight-template-gaugechartfieldwells-targetvalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartfieldwells.html#cfn-quicksight-template-gaugechartfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GaugeChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartoptions.html","Properties":{"Arc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartoptions.html#cfn-quicksight-template-gaugechartoptions-arc","Required":false,"Type":"ArcConfiguration","UpdateType":"Mutable"},"ArcAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartoptions.html#cfn-quicksight-template-gaugechartoptions-arcaxis","Required":false,"Type":"ArcAxisConfiguration","UpdateType":"Mutable"},"Comparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartoptions.html#cfn-quicksight-template-gaugechartoptions-comparison","Required":false,"Type":"ComparisonConfiguration","UpdateType":"Mutable"},"PrimaryValueDisplayType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartoptions.html#cfn-quicksight-template-gaugechartoptions-primaryvaluedisplaytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrimaryValueFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartoptions.html#cfn-quicksight-template-gaugechartoptions-primaryvaluefontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GaugeChartPrimaryValueConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartprimaryvalueconditionalformatting.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartprimaryvalueconditionalformatting.html#cfn-quicksight-template-gaugechartprimaryvalueconditionalformatting-icon","Required":false,"Type":"ConditionalFormattingIcon","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartprimaryvalueconditionalformatting.html#cfn-quicksight-template-gaugechartprimaryvalueconditionalformatting-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GaugeChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartvisual.html#cfn-quicksight-template-gaugechartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartvisual.html#cfn-quicksight-template-gaugechartvisual-chartconfiguration","Required":false,"Type":"GaugeChartConfiguration","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartvisual.html#cfn-quicksight-template-gaugechartvisual-conditionalformatting","Required":false,"Type":"GaugeChartConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartvisual.html#cfn-quicksight-template-gaugechartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartvisual.html#cfn-quicksight-template-gaugechartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gaugechartvisual.html#cfn-quicksight-template-gaugechartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GeospatialCoordinateBounds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialcoordinatebounds.html","Properties":{"East":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialcoordinatebounds.html#cfn-quicksight-template-geospatialcoordinatebounds-east","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"North":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialcoordinatebounds.html#cfn-quicksight-template-geospatialcoordinatebounds-north","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"South":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialcoordinatebounds.html#cfn-quicksight-template-geospatialcoordinatebounds-south","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"West":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialcoordinatebounds.html#cfn-quicksight-template-geospatialcoordinatebounds-west","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GeospatialHeatmapColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialheatmapcolorscale.html","Properties":{"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialheatmapcolorscale.html#cfn-quicksight-template-geospatialheatmapcolorscale-colors","DuplicatesAllowed":true,"ItemType":"GeospatialHeatmapDataColor","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GeospatialHeatmapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialheatmapconfiguration.html","Properties":{"HeatmapColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialheatmapconfiguration.html#cfn-quicksight-template-geospatialheatmapconfiguration-heatmapcolor","Required":false,"Type":"GeospatialHeatmapColorScale","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GeospatialHeatmapDataColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialheatmapdatacolor.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialheatmapdatacolor.html#cfn-quicksight-template-geospatialheatmapdatacolor-color","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GeospatialMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapaggregatedfieldwells.html","Properties":{"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapaggregatedfieldwells.html#cfn-quicksight-template-geospatialmapaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Geospatial":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapaggregatedfieldwells.html#cfn-quicksight-template-geospatialmapaggregatedfieldwells-geospatial","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapaggregatedfieldwells.html#cfn-quicksight-template-geospatialmapaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GeospatialMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapconfiguration.html","Properties":{"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapconfiguration.html#cfn-quicksight-template-geospatialmapconfiguration-fieldwells","Required":false,"Type":"GeospatialMapFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapconfiguration.html#cfn-quicksight-template-geospatialmapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"MapStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapconfiguration.html#cfn-quicksight-template-geospatialmapconfiguration-mapstyleoptions","Required":false,"Type":"GeospatialMapStyleOptions","UpdateType":"Mutable"},"PointStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapconfiguration.html#cfn-quicksight-template-geospatialmapconfiguration-pointstyleoptions","Required":false,"Type":"GeospatialPointStyleOptions","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapconfiguration.html#cfn-quicksight-template-geospatialmapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapconfiguration.html#cfn-quicksight-template-geospatialmapconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"WindowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapconfiguration.html#cfn-quicksight-template-geospatialmapconfiguration-windowoptions","Required":false,"Type":"GeospatialWindowOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GeospatialMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapfieldwells.html","Properties":{"GeospatialMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapfieldwells.html#cfn-quicksight-template-geospatialmapfieldwells-geospatialmapaggregatedfieldwells","Required":false,"Type":"GeospatialMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GeospatialMapStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapstyleoptions.html","Properties":{"BaseMapStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapstyleoptions.html#cfn-quicksight-template-geospatialmapstyleoptions-basemapstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GeospatialMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapvisual.html#cfn-quicksight-template-geospatialmapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapvisual.html#cfn-quicksight-template-geospatialmapvisual-chartconfiguration","Required":false,"Type":"GeospatialMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapvisual.html#cfn-quicksight-template-geospatialmapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapvisual.html#cfn-quicksight-template-geospatialmapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapvisual.html#cfn-quicksight-template-geospatialmapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialmapvisual.html#cfn-quicksight-template-geospatialmapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GeospatialPointStyleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialpointstyleoptions.html","Properties":{"ClusterMarkerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialpointstyleoptions.html#cfn-quicksight-template-geospatialpointstyleoptions-clustermarkerconfiguration","Required":false,"Type":"ClusterMarkerConfiguration","UpdateType":"Mutable"},"HeatmapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialpointstyleoptions.html#cfn-quicksight-template-geospatialpointstyleoptions-heatmapconfiguration","Required":false,"Type":"GeospatialHeatmapConfiguration","UpdateType":"Mutable"},"SelectedPointStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialpointstyleoptions.html#cfn-quicksight-template-geospatialpointstyleoptions-selectedpointstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GeospatialWindowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialwindowoptions.html","Properties":{"Bounds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialwindowoptions.html#cfn-quicksight-template-geospatialwindowoptions-bounds","Required":false,"Type":"GeospatialCoordinateBounds","UpdateType":"Mutable"},"MapZoomMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-geospatialwindowoptions.html#cfn-quicksight-template-geospatialwindowoptions-mapzoommode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GlobalTableBorderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-globaltableborderoptions.html","Properties":{"SideSpecificBorder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-globaltableborderoptions.html#cfn-quicksight-template-globaltableborderoptions-sidespecificborder","Required":false,"Type":"TableSideBorderOptions","UpdateType":"Mutable"},"UniformBorder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-globaltableborderoptions.html#cfn-quicksight-template-globaltableborderoptions-uniformborder","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GradientColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gradientcolor.html","Properties":{"Stops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gradientcolor.html#cfn-quicksight-template-gradientcolor-stops","DuplicatesAllowed":true,"ItemType":"GradientStop","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GradientStop":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gradientstop.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gradientstop.html#cfn-quicksight-template-gradientstop-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gradientstop.html#cfn-quicksight-template-gradientstop-datavalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"GradientOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gradientstop.html#cfn-quicksight-template-gradientstop-gradientoffset","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GridLayoutCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutcanvassizeoptions.html","Properties":{"ScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutcanvassizeoptions.html#cfn-quicksight-template-gridlayoutcanvassizeoptions-screencanvassizeoptions","Required":false,"Type":"GridLayoutScreenCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GridLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutconfiguration.html","Properties":{"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutconfiguration.html#cfn-quicksight-template-gridlayoutconfiguration-canvassizeoptions","Required":false,"Type":"GridLayoutCanvasSizeOptions","UpdateType":"Mutable"},"Elements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutconfiguration.html#cfn-quicksight-template-gridlayoutconfiguration-elements","DuplicatesAllowed":true,"ItemType":"GridLayoutElement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GridLayoutElement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutelement.html","Properties":{"ColumnIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutelement.html#cfn-quicksight-template-gridlayoutelement-columnindex","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ColumnSpan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutelement.html#cfn-quicksight-template-gridlayoutelement-columnspan","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"ElementId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutelement.html#cfn-quicksight-template-gridlayoutelement-elementid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ElementType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutelement.html#cfn-quicksight-template-gridlayoutelement-elementtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RowIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutelement.html#cfn-quicksight-template-gridlayoutelement-rowindex","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"RowSpan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutelement.html#cfn-quicksight-template-gridlayoutelement-rowspan","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GridLayoutScreenCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutscreencanvassizeoptions.html","Properties":{"OptimizedViewPortWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutscreencanvassizeoptions.html#cfn-quicksight-template-gridlayoutscreencanvassizeoptions-optimizedviewportwidth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResizeOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-gridlayoutscreencanvassizeoptions.html#cfn-quicksight-template-gridlayoutscreencanvassizeoptions-resizeoption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.GrowthRateComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-growthratecomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-growthratecomputation.html#cfn-quicksight-template-growthratecomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-growthratecomputation.html#cfn-quicksight-template-growthratecomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PeriodSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-growthratecomputation.html#cfn-quicksight-template-growthratecomputation-periodsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-growthratecomputation.html#cfn-quicksight-template-growthratecomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-growthratecomputation.html#cfn-quicksight-template-growthratecomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.HeaderFooterSectionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-headerfootersectionconfiguration.html","Properties":{"Layout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-headerfootersectionconfiguration.html#cfn-quicksight-template-headerfootersectionconfiguration-layout","Required":true,"Type":"SectionLayoutConfiguration","UpdateType":"Mutable"},"SectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-headerfootersectionconfiguration.html#cfn-quicksight-template-headerfootersectionconfiguration-sectionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Style":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-headerfootersectionconfiguration.html#cfn-quicksight-template-headerfootersectionconfiguration-style","Required":false,"Type":"SectionStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.HeatMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapaggregatedfieldwells.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapaggregatedfieldwells.html#cfn-quicksight-template-heatmapaggregatedfieldwells-columns","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Rows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapaggregatedfieldwells.html#cfn-quicksight-template-heatmapaggregatedfieldwells-rows","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapaggregatedfieldwells.html#cfn-quicksight-template-heatmapaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.HeatMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapconfiguration.html","Properties":{"ColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapconfiguration.html#cfn-quicksight-template-heatmapconfiguration-colorscale","Required":false,"Type":"ColorScale","UpdateType":"Mutable"},"ColumnLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapconfiguration.html#cfn-quicksight-template-heatmapconfiguration-columnlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapconfiguration.html#cfn-quicksight-template-heatmapconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapconfiguration.html#cfn-quicksight-template-heatmapconfiguration-fieldwells","Required":false,"Type":"HeatMapFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapconfiguration.html#cfn-quicksight-template-heatmapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"RowLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapconfiguration.html#cfn-quicksight-template-heatmapconfiguration-rowlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapconfiguration.html#cfn-quicksight-template-heatmapconfiguration-sortconfiguration","Required":false,"Type":"HeatMapSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapconfiguration.html#cfn-quicksight-template-heatmapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.HeatMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapfieldwells.html","Properties":{"HeatMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapfieldwells.html#cfn-quicksight-template-heatmapfieldwells-heatmapaggregatedfieldwells","Required":false,"Type":"HeatMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.HeatMapSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapsortconfiguration.html","Properties":{"HeatMapColumnItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapsortconfiguration.html#cfn-quicksight-template-heatmapsortconfiguration-heatmapcolumnitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"HeatMapColumnSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapsortconfiguration.html#cfn-quicksight-template-heatmapsortconfiguration-heatmapcolumnsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"HeatMapRowItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapsortconfiguration.html#cfn-quicksight-template-heatmapsortconfiguration-heatmaprowitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"HeatMapRowSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapsortconfiguration.html#cfn-quicksight-template-heatmapsortconfiguration-heatmaprowsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.HeatMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapvisual.html#cfn-quicksight-template-heatmapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapvisual.html#cfn-quicksight-template-heatmapvisual-chartconfiguration","Required":false,"Type":"HeatMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapvisual.html#cfn-quicksight-template-heatmapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapvisual.html#cfn-quicksight-template-heatmapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapvisual.html#cfn-quicksight-template-heatmapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-heatmapvisual.html#cfn-quicksight-template-heatmapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.HistogramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramaggregatedfieldwells.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramaggregatedfieldwells.html#cfn-quicksight-template-histogramaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.HistogramBinOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogrambinoptions.html","Properties":{"BinCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogrambinoptions.html#cfn-quicksight-template-histogrambinoptions-bincount","Required":false,"Type":"BinCountOptions","UpdateType":"Mutable"},"BinWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogrambinoptions.html#cfn-quicksight-template-histogrambinoptions-binwidth","Required":false,"Type":"BinWidthOptions","UpdateType":"Mutable"},"SelectedBinType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogrambinoptions.html#cfn-quicksight-template-histogrambinoptions-selectedbintype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogrambinoptions.html#cfn-quicksight-template-histogrambinoptions-startvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.HistogramConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramconfiguration.html","Properties":{"BinOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramconfiguration.html#cfn-quicksight-template-histogramconfiguration-binoptions","Required":false,"Type":"HistogramBinOptions","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramconfiguration.html#cfn-quicksight-template-histogramconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramconfiguration.html#cfn-quicksight-template-histogramconfiguration-fieldwells","Required":false,"Type":"HistogramFieldWells","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramconfiguration.html#cfn-quicksight-template-histogramconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramconfiguration.html#cfn-quicksight-template-histogramconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"XAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramconfiguration.html#cfn-quicksight-template-histogramconfiguration-xaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"XAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramconfiguration.html#cfn-quicksight-template-histogramconfiguration-xaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"YAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramconfiguration.html#cfn-quicksight-template-histogramconfiguration-yaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.HistogramFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramfieldwells.html","Properties":{"HistogramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramfieldwells.html#cfn-quicksight-template-histogramfieldwells-histogramaggregatedfieldwells","Required":false,"Type":"HistogramAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.HistogramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramvisual.html#cfn-quicksight-template-histogramvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramvisual.html#cfn-quicksight-template-histogramvisual-chartconfiguration","Required":false,"Type":"HistogramConfiguration","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramvisual.html#cfn-quicksight-template-histogramvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramvisual.html#cfn-quicksight-template-histogramvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-histogramvisual.html#cfn-quicksight-template-histogramvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.InsightConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-insightconfiguration.html","Properties":{"Computations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-insightconfiguration.html#cfn-quicksight-template-insightconfiguration-computations","DuplicatesAllowed":true,"ItemType":"Computation","Required":false,"Type":"List","UpdateType":"Mutable"},"CustomNarrative":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-insightconfiguration.html#cfn-quicksight-template-insightconfiguration-customnarrative","Required":false,"Type":"CustomNarrativeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.InsightVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-insightvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-insightvisual.html#cfn-quicksight-template-insightvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-insightvisual.html#cfn-quicksight-template-insightvisual-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InsightConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-insightvisual.html#cfn-quicksight-template-insightvisual-insightconfiguration","Required":false,"Type":"InsightConfiguration","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-insightvisual.html#cfn-quicksight-template-insightvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-insightvisual.html#cfn-quicksight-template-insightvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-insightvisual.html#cfn-quicksight-template-insightvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.IntegerDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integerdefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integerdefaultvalues.html#cfn-quicksight-template-integerdefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integerdefaultvalues.html#cfn-quicksight-template-integerdefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.IntegerParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integerparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integerparameterdeclaration.html#cfn-quicksight-template-integerparameterdeclaration-defaultvalues","Required":false,"Type":"IntegerDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integerparameterdeclaration.html#cfn-quicksight-template-integerparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integerparameterdeclaration.html#cfn-quicksight-template-integerparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integerparameterdeclaration.html#cfn-quicksight-template-integerparameterdeclaration-parametervaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integerparameterdeclaration.html#cfn-quicksight-template-integerparameterdeclaration-valuewhenunset","Required":false,"Type":"IntegerValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.IntegerValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integervaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integervaluewhenunsetconfiguration.html#cfn-quicksight-template-integervaluewhenunsetconfiguration-customvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-integervaluewhenunsetconfiguration.html#cfn-quicksight-template-integervaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-itemslimitconfiguration.html","Properties":{"ItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-itemslimitconfiguration.html#cfn-quicksight-template-itemslimitconfiguration-itemslimit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"OtherCategories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-itemslimitconfiguration.html#cfn-quicksight-template-itemslimitconfiguration-othercategories","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.KPIConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiconditionalformatting.html#cfn-quicksight-template-kpiconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"KPIConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.KPIConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiconditionalformattingoption.html","Properties":{"PrimaryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiconditionalformattingoption.html#cfn-quicksight-template-kpiconditionalformattingoption-primaryvalue","Required":false,"Type":"KPIPrimaryValueConditionalFormatting","UpdateType":"Mutable"},"ProgressBar":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiconditionalformattingoption.html#cfn-quicksight-template-kpiconditionalformattingoption-progressbar","Required":false,"Type":"KPIProgressBarConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.KPIConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiconfiguration.html","Properties":{"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiconfiguration.html#cfn-quicksight-template-kpiconfiguration-fieldwells","Required":false,"Type":"KPIFieldWells","UpdateType":"Mutable"},"KPIOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiconfiguration.html#cfn-quicksight-template-kpiconfiguration-kpioptions","Required":false,"Type":"KPIOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiconfiguration.html#cfn-quicksight-template-kpiconfiguration-sortconfiguration","Required":false,"Type":"KPISortConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.KPIFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpifieldwells.html","Properties":{"TargetValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpifieldwells.html#cfn-quicksight-template-kpifieldwells-targetvalues","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"TrendGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpifieldwells.html#cfn-quicksight-template-kpifieldwells-trendgroups","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpifieldwells.html#cfn-quicksight-template-kpifieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.KPIOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpioptions.html","Properties":{"Comparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpioptions.html#cfn-quicksight-template-kpioptions-comparison","Required":false,"Type":"ComparisonConfiguration","UpdateType":"Mutable"},"PrimaryValueDisplayType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpioptions.html#cfn-quicksight-template-kpioptions-primaryvaluedisplaytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrimaryValueFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpioptions.html#cfn-quicksight-template-kpioptions-primaryvaluefontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"ProgressBar":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpioptions.html#cfn-quicksight-template-kpioptions-progressbar","Required":false,"Type":"ProgressBarOptions","UpdateType":"Mutable"},"SecondaryValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpioptions.html#cfn-quicksight-template-kpioptions-secondaryvalue","Required":false,"Type":"SecondaryValueOptions","UpdateType":"Mutable"},"SecondaryValueFontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpioptions.html#cfn-quicksight-template-kpioptions-secondaryvaluefontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"TrendArrows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpioptions.html#cfn-quicksight-template-kpioptions-trendarrows","Required":false,"Type":"TrendArrowOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.KPIPrimaryValueConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiprimaryvalueconditionalformatting.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiprimaryvalueconditionalformatting.html#cfn-quicksight-template-kpiprimaryvalueconditionalformatting-icon","Required":false,"Type":"ConditionalFormattingIcon","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiprimaryvalueconditionalformatting.html#cfn-quicksight-template-kpiprimaryvalueconditionalformatting-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.KPIProgressBarConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiprogressbarconditionalformatting.html","Properties":{"ForegroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpiprogressbarconditionalformatting.html#cfn-quicksight-template-kpiprogressbarconditionalformatting-foregroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.KPISortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpisortconfiguration.html","Properties":{"TrendGroupSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpisortconfiguration.html#cfn-quicksight-template-kpisortconfiguration-trendgroupsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.KPIVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpivisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpivisual.html#cfn-quicksight-template-kpivisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpivisual.html#cfn-quicksight-template-kpivisual-chartconfiguration","Required":false,"Type":"KPIConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpivisual.html#cfn-quicksight-template-kpivisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpivisual.html#cfn-quicksight-template-kpivisual-conditionalformatting","Required":false,"Type":"KPIConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpivisual.html#cfn-quicksight-template-kpivisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpivisual.html#cfn-quicksight-template-kpivisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-kpivisual.html#cfn-quicksight-template-kpivisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-labeloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-labeloptions.html#cfn-quicksight-template-labeloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-labeloptions.html#cfn-quicksight-template-labeloptions-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-labeloptions.html#cfn-quicksight-template-labeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.Layout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-layout.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-layout.html#cfn-quicksight-template-layout-configuration","Required":true,"Type":"LayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-layoutconfiguration.html","Properties":{"FreeFormLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-layoutconfiguration.html#cfn-quicksight-template-layoutconfiguration-freeformlayout","Required":false,"Type":"FreeFormLayoutConfiguration","UpdateType":"Mutable"},"GridLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-layoutconfiguration.html#cfn-quicksight-template-layoutconfiguration-gridlayout","Required":false,"Type":"GridLayoutConfiguration","UpdateType":"Mutable"},"SectionBasedLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-layoutconfiguration.html#cfn-quicksight-template-layoutconfiguration-sectionbasedlayout","Required":false,"Type":"SectionBasedLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LegendOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-legendoptions.html","Properties":{"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-legendoptions.html#cfn-quicksight-template-legendoptions-height","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-legendoptions.html#cfn-quicksight-template-legendoptions-position","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-legendoptions.html#cfn-quicksight-template-legendoptions-title","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-legendoptions.html#cfn-quicksight-template-legendoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-legendoptions.html#cfn-quicksight-template-legendoptions-width","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LineChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartaggregatedfieldwells.html#cfn-quicksight-template-linechartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartaggregatedfieldwells.html#cfn-quicksight-template-linechartaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartaggregatedfieldwells.html#cfn-quicksight-template-linechartaggregatedfieldwells-smallmultiples","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartaggregatedfieldwells.html#cfn-quicksight-template-linechartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LineChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html","Properties":{"ContributionAnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-contributionanalysisdefaults","DuplicatesAllowed":true,"ItemType":"ContributionAnalysisDefault","Required":false,"Type":"List","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"DefaultSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-defaultseriessettings","Required":false,"Type":"LineChartDefaultSeriesSettings","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-fieldwells","Required":false,"Type":"LineChartFieldWells","UpdateType":"Mutable"},"ForecastConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-forecastconfigurations","DuplicatesAllowed":true,"ItemType":"ForecastConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"LineSeriesAxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ReferenceLines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-referencelines","DuplicatesAllowed":true,"ItemType":"ReferenceLine","Required":false,"Type":"List","UpdateType":"Mutable"},"SecondaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-secondaryyaxisdisplayoptions","Required":false,"Type":"LineSeriesAxisDisplayOptions","UpdateType":"Mutable"},"SecondaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-secondaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"Series":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-series","DuplicatesAllowed":true,"ItemType":"SeriesItem","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-smallmultiplesoptions","Required":false,"Type":"SmallMultiplesOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-sortconfiguration","Required":false,"Type":"LineChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"XAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-xaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"XAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartconfiguration.html#cfn-quicksight-template-linechartconfiguration-xaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LineChartDefaultSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartdefaultseriessettings.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartdefaultseriessettings.html#cfn-quicksight-template-linechartdefaultseriessettings-axisbinding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartdefaultseriessettings.html#cfn-quicksight-template-linechartdefaultseriessettings-linestylesettings","Required":false,"Type":"LineChartLineStyleSettings","UpdateType":"Mutable"},"MarkerStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartdefaultseriessettings.html#cfn-quicksight-template-linechartdefaultseriessettings-markerstylesettings","Required":false,"Type":"LineChartMarkerStyleSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LineChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartfieldwells.html","Properties":{"LineChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartfieldwells.html#cfn-quicksight-template-linechartfieldwells-linechartaggregatedfieldwells","Required":false,"Type":"LineChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LineChartLineStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartlinestylesettings.html","Properties":{"LineInterpolation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartlinestylesettings.html#cfn-quicksight-template-linechartlinestylesettings-lineinterpolation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartlinestylesettings.html#cfn-quicksight-template-linechartlinestylesettings-linestyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartlinestylesettings.html#cfn-quicksight-template-linechartlinestylesettings-linevisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineWidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartlinestylesettings.html#cfn-quicksight-template-linechartlinestylesettings-linewidth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LineChartMarkerStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartmarkerstylesettings.html","Properties":{"MarkerColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartmarkerstylesettings.html#cfn-quicksight-template-linechartmarkerstylesettings-markercolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MarkerShape":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartmarkerstylesettings.html#cfn-quicksight-template-linechartmarkerstylesettings-markershape","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MarkerSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartmarkerstylesettings.html#cfn-quicksight-template-linechartmarkerstylesettings-markersize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MarkerVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartmarkerstylesettings.html#cfn-quicksight-template-linechartmarkerstylesettings-markervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LineChartSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartseriessettings.html","Properties":{"LineStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartseriessettings.html#cfn-quicksight-template-linechartseriessettings-linestylesettings","Required":false,"Type":"LineChartLineStyleSettings","UpdateType":"Mutable"},"MarkerStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartseriessettings.html#cfn-quicksight-template-linechartseriessettings-markerstylesettings","Required":false,"Type":"LineChartMarkerStyleSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LineChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartsortconfiguration.html","Properties":{"CategoryItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartsortconfiguration.html#cfn-quicksight-template-linechartsortconfiguration-categoryitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartsortconfiguration.html#cfn-quicksight-template-linechartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartsortconfiguration.html#cfn-quicksight-template-linechartsortconfiguration-coloritemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartsortconfiguration.html#cfn-quicksight-template-linechartsortconfiguration-smallmultipleslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartsortconfiguration.html#cfn-quicksight-template-linechartsortconfiguration-smallmultiplessort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LineChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartvisual.html#cfn-quicksight-template-linechartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartvisual.html#cfn-quicksight-template-linechartvisual-chartconfiguration","Required":false,"Type":"LineChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartvisual.html#cfn-quicksight-template-linechartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartvisual.html#cfn-quicksight-template-linechartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartvisual.html#cfn-quicksight-template-linechartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-linechartvisual.html#cfn-quicksight-template-linechartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LineSeriesAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-lineseriesaxisdisplayoptions.html","Properties":{"AxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-lineseriesaxisdisplayoptions.html#cfn-quicksight-template-lineseriesaxisdisplayoptions-axisoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"MissingDataConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-lineseriesaxisdisplayoptions.html#cfn-quicksight-template-lineseriesaxisdisplayoptions-missingdataconfigurations","DuplicatesAllowed":true,"ItemType":"MissingDataConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ListControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-listcontroldisplayoptions.html","Properties":{"SearchOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-listcontroldisplayoptions.html#cfn-quicksight-template-listcontroldisplayoptions-searchoptions","Required":false,"Type":"ListControlSearchOptions","UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-listcontroldisplayoptions.html#cfn-quicksight-template-listcontroldisplayoptions-selectalloptions","Required":false,"Type":"ListControlSelectAllOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-listcontroldisplayoptions.html#cfn-quicksight-template-listcontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ListControlSearchOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-listcontrolsearchoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-listcontrolsearchoptions.html#cfn-quicksight-template-listcontrolsearchoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ListControlSelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-listcontrolselectalloptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-listcontrolselectalloptions.html#cfn-quicksight-template-listcontrolselectalloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LoadingAnimation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-loadinganimation.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-loadinganimation.html#cfn-quicksight-template-loadinganimation-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LocalNavigationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-localnavigationconfiguration.html","Properties":{"TargetSheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-localnavigationconfiguration.html#cfn-quicksight-template-localnavigationconfiguration-targetsheetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.LongFormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-longformattext.html","Properties":{"PlainText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-longformattext.html#cfn-quicksight-template-longformattext-plaintext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RichText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-longformattext.html#cfn-quicksight-template-longformattext-richtext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.MappedDataSetParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-mappeddatasetparameter.html","Properties":{"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-mappeddatasetparameter.html#cfn-quicksight-template-mappeddatasetparameter-datasetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-mappeddatasetparameter.html#cfn-quicksight-template-mappeddatasetparameter-datasetparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.MaximumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-maximumlabeltype.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-maximumlabeltype.html#cfn-quicksight-template-maximumlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.MaximumMinimumComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-maximumminimumcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-maximumminimumcomputation.html#cfn-quicksight-template-maximumminimumcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-maximumminimumcomputation.html#cfn-quicksight-template-maximumminimumcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-maximumminimumcomputation.html#cfn-quicksight-template-maximumminimumcomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-maximumminimumcomputation.html#cfn-quicksight-template-maximumminimumcomputation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-maximumminimumcomputation.html#cfn-quicksight-template-maximumminimumcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.MeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-measurefield.html","Properties":{"CalculatedMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-measurefield.html#cfn-quicksight-template-measurefield-calculatedmeasurefield","Required":false,"Type":"CalculatedMeasureField","UpdateType":"Mutable"},"CategoricalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-measurefield.html#cfn-quicksight-template-measurefield-categoricalmeasurefield","Required":false,"Type":"CategoricalMeasureField","UpdateType":"Mutable"},"DateMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-measurefield.html#cfn-quicksight-template-measurefield-datemeasurefield","Required":false,"Type":"DateMeasureField","UpdateType":"Mutable"},"NumericalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-measurefield.html#cfn-quicksight-template-measurefield-numericalmeasurefield","Required":false,"Type":"NumericalMeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.MetricComparisonComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-metriccomparisoncomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-metriccomparisoncomputation.html#cfn-quicksight-template-metriccomparisoncomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FromValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-metriccomparisoncomputation.html#cfn-quicksight-template-metriccomparisoncomputation-fromvalue","Required":true,"Type":"MeasureField","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-metriccomparisoncomputation.html#cfn-quicksight-template-metriccomparisoncomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-metriccomparisoncomputation.html#cfn-quicksight-template-metriccomparisoncomputation-targetvalue","Required":true,"Type":"MeasureField","UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-metriccomparisoncomputation.html#cfn-quicksight-template-metriccomparisoncomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.MinimumLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-minimumlabeltype.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-minimumlabeltype.html#cfn-quicksight-template-minimumlabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.MissingDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-missingdataconfiguration.html","Properties":{"TreatmentOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-missingdataconfiguration.html#cfn-quicksight-template-missingdataconfiguration-treatmentoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-negativevalueconfiguration.html","Properties":{"DisplayMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-negativevalueconfiguration.html#cfn-quicksight-template-negativevalueconfiguration-displaymode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-nullvalueformatconfiguration.html","Properties":{"NullString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-nullvalueformatconfiguration.html#cfn-quicksight-template-nullvalueformatconfiguration-nullstring","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumberDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numberdisplayformatconfiguration.html","Properties":{"DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numberdisplayformatconfiguration.html#cfn-quicksight-template-numberdisplayformatconfiguration-decimalplacesconfiguration","Required":false,"Type":"DecimalPlacesConfiguration","UpdateType":"Mutable"},"NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numberdisplayformatconfiguration.html#cfn-quicksight-template-numberdisplayformatconfiguration-negativevalueconfiguration","Required":false,"Type":"NegativeValueConfiguration","UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numberdisplayformatconfiguration.html#cfn-quicksight-template-numberdisplayformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumberScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numberdisplayformatconfiguration.html#cfn-quicksight-template-numberdisplayformatconfiguration-numberscale","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numberdisplayformatconfiguration.html#cfn-quicksight-template-numberdisplayformatconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numberdisplayformatconfiguration.html#cfn-quicksight-template-numberdisplayformatconfiguration-separatorconfiguration","Required":false,"Type":"NumericSeparatorConfiguration","UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numberdisplayformatconfiguration.html#cfn-quicksight-template-numberdisplayformatconfiguration-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumberFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numberformatconfiguration.html","Properties":{"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numberformatconfiguration.html#cfn-quicksight-template-numberformatconfiguration-formatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumericAxisOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericaxisoptions.html","Properties":{"Range":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericaxisoptions.html#cfn-quicksight-template-numericaxisoptions-range","Required":false,"Type":"AxisDisplayRange","UpdateType":"Mutable"},"Scale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericaxisoptions.html#cfn-quicksight-template-numericaxisoptions-scale","Required":false,"Type":"AxisScale","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumericEqualityDrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalitydrilldownfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalitydrilldownfilter.html#cfn-quicksight-template-numericequalitydrilldownfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalitydrilldownfilter.html#cfn-quicksight-template-numericequalitydrilldownfilter-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumericEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalityfilter.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalityfilter.html#cfn-quicksight-template-numericequalityfilter-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalityfilter.html#cfn-quicksight-template-numericequalityfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalityfilter.html#cfn-quicksight-template-numericequalityfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MatchOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalityfilter.html#cfn-quicksight-template-numericequalityfilter-matchoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalityfilter.html#cfn-quicksight-template-numericequalityfilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalityfilter.html#cfn-quicksight-template-numericequalityfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalityfilter.html#cfn-quicksight-template-numericequalityfilter-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericequalityfilter.html#cfn-quicksight-template-numericequalityfilter-value","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumericFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericformatconfiguration.html","Properties":{"CurrencyDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericformatconfiguration.html#cfn-quicksight-template-numericformatconfiguration-currencydisplayformatconfiguration","Required":false,"Type":"CurrencyDisplayFormatConfiguration","UpdateType":"Mutable"},"NumberDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericformatconfiguration.html#cfn-quicksight-template-numericformatconfiguration-numberdisplayformatconfiguration","Required":false,"Type":"NumberDisplayFormatConfiguration","UpdateType":"Mutable"},"PercentageDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericformatconfiguration.html#cfn-quicksight-template-numericformatconfiguration-percentagedisplayformatconfiguration","Required":false,"Type":"PercentageDisplayFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumericRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefilter.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefilter.html#cfn-quicksight-template-numericrangefilter-aggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefilter.html#cfn-quicksight-template-numericrangefilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefilter.html#cfn-quicksight-template-numericrangefilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncludeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefilter.html#cfn-quicksight-template-numericrangefilter-includemaximum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefilter.html#cfn-quicksight-template-numericrangefilter-includeminimum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefilter.html#cfn-quicksight-template-numericrangefilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RangeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefilter.html#cfn-quicksight-template-numericrangefilter-rangemaximum","Required":false,"Type":"NumericRangeFilterValue","UpdateType":"Mutable"},"RangeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefilter.html#cfn-quicksight-template-numericrangefilter-rangeminimum","Required":false,"Type":"NumericRangeFilterValue","UpdateType":"Mutable"},"SelectAllOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefilter.html#cfn-quicksight-template-numericrangefilter-selectalloptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumericRangeFilterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefiltervalue.html","Properties":{"Parameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefiltervalue.html#cfn-quicksight-template-numericrangefiltervalue-parameter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StaticValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericrangefiltervalue.html#cfn-quicksight-template-numericrangefiltervalue-staticvalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumericSeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericseparatorconfiguration.html","Properties":{"DecimalSeparator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericseparatorconfiguration.html#cfn-quicksight-template-numericseparatorconfiguration-decimalseparator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThousandsSeparator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericseparatorconfiguration.html#cfn-quicksight-template-numericseparatorconfiguration-thousandsseparator","Required":false,"Type":"ThousandSeparatorOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumericalAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericalaggregationfunction.html","Properties":{"PercentileAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericalaggregationfunction.html#cfn-quicksight-template-numericalaggregationfunction-percentileaggregation","Required":false,"Type":"PercentileAggregation","UpdateType":"Mutable"},"SimpleNumericalAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericalaggregationfunction.html#cfn-quicksight-template-numericalaggregationfunction-simplenumericalaggregation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumericalDimensionField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericaldimensionfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericaldimensionfield.html#cfn-quicksight-template-numericaldimensionfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericaldimensionfield.html#cfn-quicksight-template-numericaldimensionfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericaldimensionfield.html#cfn-quicksight-template-numericaldimensionfield-formatconfiguration","Required":false,"Type":"NumberFormatConfiguration","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericaldimensionfield.html#cfn-quicksight-template-numericaldimensionfield-hierarchyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.NumericalMeasureField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericalmeasurefield.html","Properties":{"AggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericalmeasurefield.html#cfn-quicksight-template-numericalmeasurefield-aggregationfunction","Required":false,"Type":"NumericalAggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericalmeasurefield.html#cfn-quicksight-template-numericalmeasurefield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericalmeasurefield.html#cfn-quicksight-template-numericalmeasurefield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-numericalmeasurefield.html#cfn-quicksight-template-numericalmeasurefield-formatconfiguration","Required":false,"Type":"NumberFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PaginationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-paginationconfiguration.html","Properties":{"PageNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-paginationconfiguration.html#cfn-quicksight-template-paginationconfiguration-pagenumber","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"PageSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-paginationconfiguration.html#cfn-quicksight-template-paginationconfiguration-pagesize","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PanelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-panelconfiguration.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-panelconfiguration.html#cfn-quicksight-template-panelconfiguration-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BackgroundVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-panelconfiguration.html#cfn-quicksight-template-panelconfiguration-backgroundvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-panelconfiguration.html#cfn-quicksight-template-panelconfiguration-bordercolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-panelconfiguration.html#cfn-quicksight-template-panelconfiguration-borderstyle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderThickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-panelconfiguration.html#cfn-quicksight-template-panelconfiguration-borderthickness","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BorderVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-panelconfiguration.html#cfn-quicksight-template-panelconfiguration-bordervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GutterSpacing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-panelconfiguration.html#cfn-quicksight-template-panelconfiguration-gutterspacing","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GutterVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-panelconfiguration.html#cfn-quicksight-template-panelconfiguration-guttervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-panelconfiguration.html#cfn-quicksight-template-panelconfiguration-title","Required":false,"Type":"PanelTitleOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PanelTitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-paneltitleoptions.html","Properties":{"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-paneltitleoptions.html#cfn-quicksight-template-paneltitleoptions-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"HorizontalTextAlignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-paneltitleoptions.html#cfn-quicksight-template-paneltitleoptions-horizontaltextalignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-paneltitleoptions.html#cfn-quicksight-template-paneltitleoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ParameterControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametercontrol.html","Properties":{"DateTimePicker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametercontrol.html#cfn-quicksight-template-parametercontrol-datetimepicker","Required":false,"Type":"ParameterDateTimePickerControl","UpdateType":"Mutable"},"Dropdown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametercontrol.html#cfn-quicksight-template-parametercontrol-dropdown","Required":false,"Type":"ParameterDropDownControl","UpdateType":"Mutable"},"List":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametercontrol.html#cfn-quicksight-template-parametercontrol-list","Required":false,"Type":"ParameterListControl","UpdateType":"Mutable"},"Slider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametercontrol.html#cfn-quicksight-template-parametercontrol-slider","Required":false,"Type":"ParameterSliderControl","UpdateType":"Mutable"},"TextArea":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametercontrol.html#cfn-quicksight-template-parametercontrol-textarea","Required":false,"Type":"ParameterTextAreaControl","UpdateType":"Mutable"},"TextField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametercontrol.html#cfn-quicksight-template-parametercontrol-textfield","Required":false,"Type":"ParameterTextFieldControl","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ParameterDateTimePickerControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdatetimepickercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdatetimepickercontrol.html#cfn-quicksight-template-parameterdatetimepickercontrol-displayoptions","Required":false,"Type":"DateTimePickerControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdatetimepickercontrol.html#cfn-quicksight-template-parameterdatetimepickercontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdatetimepickercontrol.html#cfn-quicksight-template-parameterdatetimepickercontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdatetimepickercontrol.html#cfn-quicksight-template-parameterdatetimepickercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdeclaration.html","Properties":{"DateTimeParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdeclaration.html#cfn-quicksight-template-parameterdeclaration-datetimeparameterdeclaration","Required":false,"Type":"DateTimeParameterDeclaration","UpdateType":"Mutable"},"DecimalParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdeclaration.html#cfn-quicksight-template-parameterdeclaration-decimalparameterdeclaration","Required":false,"Type":"DecimalParameterDeclaration","UpdateType":"Mutable"},"IntegerParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdeclaration.html#cfn-quicksight-template-parameterdeclaration-integerparameterdeclaration","Required":false,"Type":"IntegerParameterDeclaration","UpdateType":"Mutable"},"StringParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdeclaration.html#cfn-quicksight-template-parameterdeclaration-stringparameterdeclaration","Required":false,"Type":"StringParameterDeclaration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ParameterDropDownControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdropdowncontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdropdowncontrol.html#cfn-quicksight-template-parameterdropdowncontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdropdowncontrol.html#cfn-quicksight-template-parameterdropdowncontrol-displayoptions","Required":false,"Type":"DropDownControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdropdowncontrol.html#cfn-quicksight-template-parameterdropdowncontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdropdowncontrol.html#cfn-quicksight-template-parameterdropdowncontrol-selectablevalues","Required":false,"Type":"ParameterSelectableValues","UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdropdowncontrol.html#cfn-quicksight-template-parameterdropdowncontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdropdowncontrol.html#cfn-quicksight-template-parameterdropdowncontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterdropdowncontrol.html#cfn-quicksight-template-parameterdropdowncontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ParameterListControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterlistcontrol.html","Properties":{"CascadingControlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterlistcontrol.html#cfn-quicksight-template-parameterlistcontrol-cascadingcontrolconfiguration","Required":false,"Type":"CascadingControlConfiguration","UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterlistcontrol.html#cfn-quicksight-template-parameterlistcontrol-displayoptions","Required":false,"Type":"ListControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterlistcontrol.html#cfn-quicksight-template-parameterlistcontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterlistcontrol.html#cfn-quicksight-template-parameterlistcontrol-selectablevalues","Required":false,"Type":"ParameterSelectableValues","UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterlistcontrol.html#cfn-quicksight-template-parameterlistcontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterlistcontrol.html#cfn-quicksight-template-parameterlistcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterlistcontrol.html#cfn-quicksight-template-parameterlistcontrol-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ParameterSelectableValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterselectablevalues.html","Properties":{"LinkToDataSetColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterselectablevalues.html#cfn-quicksight-template-parameterselectablevalues-linktodatasetcolumn","Required":false,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterselectablevalues.html#cfn-quicksight-template-parameterselectablevalues-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ParameterSliderControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterslidercontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterslidercontrol.html#cfn-quicksight-template-parameterslidercontrol-displayoptions","Required":false,"Type":"SliderControlDisplayOptions","UpdateType":"Mutable"},"MaximumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterslidercontrol.html#cfn-quicksight-template-parameterslidercontrol-maximumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"MinimumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterslidercontrol.html#cfn-quicksight-template-parameterslidercontrol-minimumvalue","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterslidercontrol.html#cfn-quicksight-template-parameterslidercontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterslidercontrol.html#cfn-quicksight-template-parameterslidercontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterslidercontrol.html#cfn-quicksight-template-parameterslidercontrol-stepsize","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parameterslidercontrol.html#cfn-quicksight-template-parameterslidercontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ParameterTextAreaControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametertextareacontrol.html","Properties":{"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametertextareacontrol.html#cfn-quicksight-template-parametertextareacontrol-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametertextareacontrol.html#cfn-quicksight-template-parametertextareacontrol-displayoptions","Required":false,"Type":"TextAreaControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametertextareacontrol.html#cfn-quicksight-template-parametertextareacontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametertextareacontrol.html#cfn-quicksight-template-parametertextareacontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametertextareacontrol.html#cfn-quicksight-template-parametertextareacontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ParameterTextFieldControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametertextfieldcontrol.html","Properties":{"DisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametertextfieldcontrol.html#cfn-quicksight-template-parametertextfieldcontrol-displayoptions","Required":false,"Type":"TextFieldControlDisplayOptions","UpdateType":"Mutable"},"ParameterControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametertextfieldcontrol.html#cfn-quicksight-template-parametertextfieldcontrol-parametercontrolid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametertextfieldcontrol.html#cfn-quicksight-template-parametertextfieldcontrol-sourceparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-parametertextfieldcontrol.html#cfn-quicksight-template-parametertextfieldcontrol-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PercentVisibleRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentvisiblerange.html","Properties":{"From":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentvisiblerange.html#cfn-quicksight-template-percentvisiblerange-from","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"To":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentvisiblerange.html#cfn-quicksight-template-percentvisiblerange-to","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PercentageDisplayFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentagedisplayformatconfiguration.html","Properties":{"DecimalPlacesConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentagedisplayformatconfiguration.html#cfn-quicksight-template-percentagedisplayformatconfiguration-decimalplacesconfiguration","Required":false,"Type":"DecimalPlacesConfiguration","UpdateType":"Mutable"},"NegativeValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentagedisplayformatconfiguration.html#cfn-quicksight-template-percentagedisplayformatconfiguration-negativevalueconfiguration","Required":false,"Type":"NegativeValueConfiguration","UpdateType":"Mutable"},"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentagedisplayformatconfiguration.html#cfn-quicksight-template-percentagedisplayformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentagedisplayformatconfiguration.html#cfn-quicksight-template-percentagedisplayformatconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SeparatorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentagedisplayformatconfiguration.html#cfn-quicksight-template-percentagedisplayformatconfiguration-separatorconfiguration","Required":false,"Type":"NumericSeparatorConfiguration","UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentagedisplayformatconfiguration.html#cfn-quicksight-template-percentagedisplayformatconfiguration-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PercentileAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentileaggregation.html","Properties":{"PercentileValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-percentileaggregation.html#cfn-quicksight-template-percentileaggregation-percentilevalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PeriodOverPeriodComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-periodoverperiodcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-periodoverperiodcomputation.html#cfn-quicksight-template-periodoverperiodcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-periodoverperiodcomputation.html#cfn-quicksight-template-periodoverperiodcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-periodoverperiodcomputation.html#cfn-quicksight-template-periodoverperiodcomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-periodoverperiodcomputation.html#cfn-quicksight-template-periodoverperiodcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PeriodToDateComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-periodtodatecomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-periodtodatecomputation.html#cfn-quicksight-template-periodtodatecomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-periodtodatecomputation.html#cfn-quicksight-template-periodtodatecomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PeriodTimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-periodtodatecomputation.html#cfn-quicksight-template-periodtodatecomputation-periodtimegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-periodtodatecomputation.html#cfn-quicksight-template-periodtodatecomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-periodtodatecomputation.html#cfn-quicksight-template-periodtodatecomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PieChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartaggregatedfieldwells.html#cfn-quicksight-template-piechartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartaggregatedfieldwells.html#cfn-quicksight-template-piechartaggregatedfieldwells-smallmultiples","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartaggregatedfieldwells.html#cfn-quicksight-template-piechartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PieChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html","Properties":{"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html#cfn-quicksight-template-piechartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ContributionAnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html#cfn-quicksight-template-piechartconfiguration-contributionanalysisdefaults","DuplicatesAllowed":true,"ItemType":"ContributionAnalysisDefault","Required":false,"Type":"List","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html#cfn-quicksight-template-piechartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"DonutOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html#cfn-quicksight-template-piechartconfiguration-donutoptions","Required":false,"Type":"DonutOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html#cfn-quicksight-template-piechartconfiguration-fieldwells","Required":false,"Type":"PieChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html#cfn-quicksight-template-piechartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html#cfn-quicksight-template-piechartconfiguration-smallmultiplesoptions","Required":false,"Type":"SmallMultiplesOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html#cfn-quicksight-template-piechartconfiguration-sortconfiguration","Required":false,"Type":"PieChartSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html#cfn-quicksight-template-piechartconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"ValueLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html#cfn-quicksight-template-piechartconfiguration-valuelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartconfiguration.html#cfn-quicksight-template-piechartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PieChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartfieldwells.html","Properties":{"PieChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartfieldwells.html#cfn-quicksight-template-piechartfieldwells-piechartaggregatedfieldwells","Required":false,"Type":"PieChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PieChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartsortconfiguration.html#cfn-quicksight-template-piechartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartsortconfiguration.html#cfn-quicksight-template-piechartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"SmallMultiplesLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartsortconfiguration.html#cfn-quicksight-template-piechartsortconfiguration-smallmultipleslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SmallMultiplesSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartsortconfiguration.html#cfn-quicksight-template-piechartsortconfiguration-smallmultiplessort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PieChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartvisual.html#cfn-quicksight-template-piechartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartvisual.html#cfn-quicksight-template-piechartvisual-chartconfiguration","Required":false,"Type":"PieChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartvisual.html#cfn-quicksight-template-piechartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartvisual.html#cfn-quicksight-template-piechartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartvisual.html#cfn-quicksight-template-piechartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-piechartvisual.html#cfn-quicksight-template-piechartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotFieldSortOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivotfieldsortoptions.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivotfieldsortoptions.html#cfn-quicksight-template-pivotfieldsortoptions-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SortBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivotfieldsortoptions.html#cfn-quicksight-template-pivotfieldsortoptions-sortby","Required":true,"Type":"PivotTableSortBy","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableaggregatedfieldwells.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableaggregatedfieldwells.html#cfn-quicksight-template-pivottableaggregatedfieldwells-columns","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Rows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableaggregatedfieldwells.html#cfn-quicksight-template-pivottableaggregatedfieldwells-rows","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableaggregatedfieldwells.html#cfn-quicksight-template-pivottableaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableCellConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablecellconditionalformatting.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablecellconditionalformatting.html#cfn-quicksight-template-pivottablecellconditionalformatting-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablecellconditionalformatting.html#cfn-quicksight-template-pivottablecellconditionalformatting-scope","Required":false,"Type":"PivotTableConditionalFormattingScope","UpdateType":"Mutable"},"Scopes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablecellconditionalformatting.html#cfn-quicksight-template-pivottablecellconditionalformatting-scopes","DuplicatesAllowed":true,"ItemType":"PivotTableConditionalFormattingScope","Required":false,"Type":"List","UpdateType":"Mutable"},"TextFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablecellconditionalformatting.html#cfn-quicksight-template-pivottablecellconditionalformatting-textformat","Required":false,"Type":"TextConditionalFormat","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconditionalformatting.html#cfn-quicksight-template-pivottableconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"PivotTableConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconditionalformattingoption.html","Properties":{"Cell":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconditionalformattingoption.html#cfn-quicksight-template-pivottableconditionalformattingoption-cell","Required":false,"Type":"PivotTableCellConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableConditionalFormattingScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconditionalformattingscope.html","Properties":{"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconditionalformattingscope.html#cfn-quicksight-template-pivottableconditionalformattingscope-role","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconfiguration.html","Properties":{"FieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconfiguration.html#cfn-quicksight-template-pivottableconfiguration-fieldoptions","Required":false,"Type":"PivotTableFieldOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconfiguration.html#cfn-quicksight-template-pivottableconfiguration-fieldwells","Required":false,"Type":"PivotTableFieldWells","UpdateType":"Mutable"},"PaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconfiguration.html#cfn-quicksight-template-pivottableconfiguration-paginatedreportoptions","Required":false,"Type":"PivotTablePaginatedReportOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconfiguration.html#cfn-quicksight-template-pivottableconfiguration-sortconfiguration","Required":false,"Type":"PivotTableSortConfiguration","UpdateType":"Mutable"},"TableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconfiguration.html#cfn-quicksight-template-pivottableconfiguration-tableoptions","Required":false,"Type":"PivotTableOptions","UpdateType":"Mutable"},"TotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableconfiguration.html#cfn-quicksight-template-pivottableconfiguration-totaloptions","Required":false,"Type":"PivotTableTotalOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableDataPathOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottabledatapathoption.html","Properties":{"DataPathList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottabledatapathoption.html#cfn-quicksight-template-pivottabledatapathoption-datapathlist","DuplicatesAllowed":true,"ItemType":"DataPathValue","Required":true,"Type":"List","UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottabledatapathoption.html#cfn-quicksight-template-pivottabledatapathoption-width","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableFieldCollapseStateOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldcollapsestateoption.html","Properties":{"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldcollapsestateoption.html#cfn-quicksight-template-pivottablefieldcollapsestateoption-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldcollapsestateoption.html#cfn-quicksight-template-pivottablefieldcollapsestateoption-target","Required":true,"Type":"PivotTableFieldCollapseStateTarget","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableFieldCollapseStateTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldcollapsestatetarget.html","Properties":{"FieldDataPathValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldcollapsestatetarget.html#cfn-quicksight-template-pivottablefieldcollapsestatetarget-fielddatapathvalues","DuplicatesAllowed":true,"ItemType":"DataPathValue","Required":false,"Type":"List","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldcollapsestatetarget.html#cfn-quicksight-template-pivottablefieldcollapsestatetarget-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableFieldOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldoption.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldoption.html#cfn-quicksight-template-pivottablefieldoption-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldoption.html#cfn-quicksight-template-pivottablefieldoption-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldoption.html#cfn-quicksight-template-pivottablefieldoption-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldoptions.html","Properties":{"CollapseStateOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldoptions.html#cfn-quicksight-template-pivottablefieldoptions-collapsestateoptions","DuplicatesAllowed":true,"ItemType":"PivotTableFieldCollapseStateOption","Required":false,"Type":"List","UpdateType":"Mutable"},"DataPathOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldoptions.html#cfn-quicksight-template-pivottablefieldoptions-datapathoptions","DuplicatesAllowed":true,"ItemType":"PivotTableDataPathOption","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldoptions.html#cfn-quicksight-template-pivottablefieldoptions-selectedfieldoptions","DuplicatesAllowed":true,"ItemType":"PivotTableFieldOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableFieldSubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldsubtotaloptions.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldsubtotaloptions.html#cfn-quicksight-template-pivottablefieldsubtotaloptions-fieldid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldwells.html","Properties":{"PivotTableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablefieldwells.html#cfn-quicksight-template-pivottablefieldwells-pivottableaggregatedfieldwells","Required":false,"Type":"PivotTableAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableoptions.html","Properties":{"CellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableoptions.html#cfn-quicksight-template-pivottableoptions-cellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"CollapsedRowDimensionsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableoptions.html#cfn-quicksight-template-pivottableoptions-collapsedrowdimensionsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColumnHeaderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableoptions.html#cfn-quicksight-template-pivottableoptions-columnheaderstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"ColumnNamesVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableoptions.html#cfn-quicksight-template-pivottableoptions-columnnamesvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricPlacement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableoptions.html#cfn-quicksight-template-pivottableoptions-metricplacement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RowAlternateColorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableoptions.html#cfn-quicksight-template-pivottableoptions-rowalternatecoloroptions","Required":false,"Type":"RowAlternateColorOptions","UpdateType":"Mutable"},"RowFieldNamesStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableoptions.html#cfn-quicksight-template-pivottableoptions-rowfieldnamesstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"RowHeaderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableoptions.html#cfn-quicksight-template-pivottableoptions-rowheaderstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"SingleMetricVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableoptions.html#cfn-quicksight-template-pivottableoptions-singlemetricvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ToggleButtonsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottableoptions.html#cfn-quicksight-template-pivottableoptions-togglebuttonsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTablePaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablepaginatedreportoptions.html","Properties":{"OverflowColumnHeaderVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablepaginatedreportoptions.html#cfn-quicksight-template-pivottablepaginatedreportoptions-overflowcolumnheadervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerticalOverflowVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablepaginatedreportoptions.html#cfn-quicksight-template-pivottablepaginatedreportoptions-verticaloverflowvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableSortBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablesortby.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablesortby.html#cfn-quicksight-template-pivottablesortby-column","Required":false,"Type":"ColumnSort","UpdateType":"Mutable"},"DataPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablesortby.html#cfn-quicksight-template-pivottablesortby-datapath","Required":false,"Type":"DataPathSort","UpdateType":"Mutable"},"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablesortby.html#cfn-quicksight-template-pivottablesortby-field","Required":false,"Type":"FieldSort","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablesortconfiguration.html","Properties":{"FieldSortOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablesortconfiguration.html#cfn-quicksight-template-pivottablesortconfiguration-fieldsortoptions","DuplicatesAllowed":true,"ItemType":"PivotFieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottabletotaloptions.html","Properties":{"ColumnSubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottabletotaloptions.html#cfn-quicksight-template-pivottabletotaloptions-columnsubtotaloptions","Required":false,"Type":"SubtotalOptions","UpdateType":"Mutable"},"ColumnTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottabletotaloptions.html#cfn-quicksight-template-pivottabletotaloptions-columntotaloptions","Required":false,"Type":"PivotTotalOptions","UpdateType":"Mutable"},"RowSubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottabletotaloptions.html#cfn-quicksight-template-pivottabletotaloptions-rowsubtotaloptions","Required":false,"Type":"SubtotalOptions","UpdateType":"Mutable"},"RowTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottabletotaloptions.html#cfn-quicksight-template-pivottabletotaloptions-rowtotaloptions","Required":false,"Type":"PivotTotalOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablevisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablevisual.html#cfn-quicksight-template-pivottablevisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablevisual.html#cfn-quicksight-template-pivottablevisual-chartconfiguration","Required":false,"Type":"PivotTableConfiguration","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablevisual.html#cfn-quicksight-template-pivottablevisual-conditionalformatting","Required":false,"Type":"PivotTableConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablevisual.html#cfn-quicksight-template-pivottablevisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablevisual.html#cfn-quicksight-template-pivottablevisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottablevisual.html#cfn-quicksight-template-pivottablevisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PivotTotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottotaloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottotaloptions.html#cfn-quicksight-template-pivottotaloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricHeaderCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottotaloptions.html#cfn-quicksight-template-pivottotaloptions-metricheadercellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottotaloptions.html#cfn-quicksight-template-pivottotaloptions-placement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScrollStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottotaloptions.html#cfn-quicksight-template-pivottotaloptions-scrollstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TotalCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottotaloptions.html#cfn-quicksight-template-pivottotaloptions-totalcellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottotaloptions.html#cfn-quicksight-template-pivottotaloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-pivottotaloptions.html#cfn-quicksight-template-pivottotaloptions-valuecellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.PredefinedHierarchy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-predefinedhierarchy.html","Properties":{"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-predefinedhierarchy.html#cfn-quicksight-template-predefinedhierarchy-columns","DuplicatesAllowed":true,"ItemType":"ColumnIdentifier","Required":true,"Type":"List","UpdateType":"Mutable"},"DrillDownFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-predefinedhierarchy.html#cfn-quicksight-template-predefinedhierarchy-drilldownfilters","DuplicatesAllowed":true,"ItemType":"DrillDownFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"HierarchyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-predefinedhierarchy.html#cfn-quicksight-template-predefinedhierarchy-hierarchyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ProgressBarOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-progressbaroptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-progressbaroptions.html#cfn-quicksight-template-progressbaroptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RadarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartaggregatedfieldwells.html#cfn-quicksight-template-radarchartaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartaggregatedfieldwells.html#cfn-quicksight-template-radarchartaggregatedfieldwells-color","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartaggregatedfieldwells.html#cfn-quicksight-template-radarchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RadarChartAreaStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartareastylesettings.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartareastylesettings.html#cfn-quicksight-template-radarchartareastylesettings-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RadarChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html","Properties":{"AlternateBandColorsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-alternatebandcolorsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlternateBandEvenColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-alternatebandevencolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlternateBandOddColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-alternatebandoddcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AxesRangeScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-axesrangescale","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BaseSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-baseseriessettings","Required":false,"Type":"RadarChartSeriesSettings","UpdateType":"Mutable"},"CategoryAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-categoryaxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-coloraxis","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-fieldwells","Required":false,"Type":"RadarChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"Shape":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-shape","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-sortconfiguration","Required":false,"Type":"RadarChartSortConfiguration","UpdateType":"Mutable"},"StartAngle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-startangle","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartconfiguration.html#cfn-quicksight-template-radarchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RadarChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartfieldwells.html","Properties":{"RadarChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartfieldwells.html#cfn-quicksight-template-radarchartfieldwells-radarchartaggregatedfieldwells","Required":false,"Type":"RadarChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RadarChartSeriesSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartseriessettings.html","Properties":{"AreaStyleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartseriessettings.html#cfn-quicksight-template-radarchartseriessettings-areastylesettings","Required":false,"Type":"RadarChartAreaStyleSettings","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RadarChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartsortconfiguration.html#cfn-quicksight-template-radarchartsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartsortconfiguration.html#cfn-quicksight-template-radarchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"ColorItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartsortconfiguration.html#cfn-quicksight-template-radarchartsortconfiguration-coloritemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"ColorSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartsortconfiguration.html#cfn-quicksight-template-radarchartsortconfiguration-colorsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RadarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartvisual.html#cfn-quicksight-template-radarchartvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartvisual.html#cfn-quicksight-template-radarchartvisual-chartconfiguration","Required":false,"Type":"RadarChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartvisual.html#cfn-quicksight-template-radarchartvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartvisual.html#cfn-quicksight-template-radarchartvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartvisual.html#cfn-quicksight-template-radarchartvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-radarchartvisual.html#cfn-quicksight-template-radarchartvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RangeEndsLabelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-rangeendslabeltype.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-rangeendslabeltype.html#cfn-quicksight-template-rangeendslabeltype-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ReferenceLine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referenceline.html","Properties":{"DataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referenceline.html#cfn-quicksight-template-referenceline-dataconfiguration","Required":true,"Type":"ReferenceLineDataConfiguration","UpdateType":"Mutable"},"LabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referenceline.html#cfn-quicksight-template-referenceline-labelconfiguration","Required":false,"Type":"ReferenceLineLabelConfiguration","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referenceline.html#cfn-quicksight-template-referenceline-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StyleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referenceline.html#cfn-quicksight-template-referenceline-styleconfiguration","Required":false,"Type":"ReferenceLineStyleConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ReferenceLineCustomLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinecustomlabelconfiguration.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinecustomlabelconfiguration.html#cfn-quicksight-template-referencelinecustomlabelconfiguration-customlabel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ReferenceLineDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinedataconfiguration.html","Properties":{"AxisBinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinedataconfiguration.html#cfn-quicksight-template-referencelinedataconfiguration-axisbinding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DynamicConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinedataconfiguration.html#cfn-quicksight-template-referencelinedataconfiguration-dynamicconfiguration","Required":false,"Type":"ReferenceLineDynamicDataConfiguration","UpdateType":"Mutable"},"StaticConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinedataconfiguration.html#cfn-quicksight-template-referencelinedataconfiguration-staticconfiguration","Required":false,"Type":"ReferenceLineStaticDataConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ReferenceLineDynamicDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinedynamicdataconfiguration.html","Properties":{"Calculation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinedynamicdataconfiguration.html#cfn-quicksight-template-referencelinedynamicdataconfiguration-calculation","Required":true,"Type":"NumericalAggregationFunction","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinedynamicdataconfiguration.html#cfn-quicksight-template-referencelinedynamicdataconfiguration-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"MeasureAggregationFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinedynamicdataconfiguration.html#cfn-quicksight-template-referencelinedynamicdataconfiguration-measureaggregationfunction","Required":false,"Type":"AggregationFunction","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ReferenceLineLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinelabelconfiguration.html","Properties":{"CustomLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinelabelconfiguration.html#cfn-quicksight-template-referencelinelabelconfiguration-customlabelconfiguration","Required":false,"Type":"ReferenceLineCustomLabelConfiguration","UpdateType":"Mutable"},"FontColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinelabelconfiguration.html#cfn-quicksight-template-referencelinelabelconfiguration-fontcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinelabelconfiguration.html#cfn-quicksight-template-referencelinelabelconfiguration-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"HorizontalPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinelabelconfiguration.html#cfn-quicksight-template-referencelinelabelconfiguration-horizontalposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinelabelconfiguration.html#cfn-quicksight-template-referencelinelabelconfiguration-valuelabelconfiguration","Required":false,"Type":"ReferenceLineValueLabelConfiguration","UpdateType":"Mutable"},"VerticalPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinelabelconfiguration.html#cfn-quicksight-template-referencelinelabelconfiguration-verticalposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ReferenceLineStaticDataConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinestaticdataconfiguration.html","Properties":{"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinestaticdataconfiguration.html#cfn-quicksight-template-referencelinestaticdataconfiguration-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ReferenceLineStyleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinestyleconfiguration.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinestyleconfiguration.html#cfn-quicksight-template-referencelinestyleconfiguration-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Pattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinestyleconfiguration.html#cfn-quicksight-template-referencelinestyleconfiguration-pattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ReferenceLineValueLabelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinevaluelabelconfiguration.html","Properties":{"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinevaluelabelconfiguration.html#cfn-quicksight-template-referencelinevaluelabelconfiguration-formatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"},"RelativePosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-referencelinevaluelabelconfiguration.html#cfn-quicksight-template-referencelinevaluelabelconfiguration-relativeposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RelativeDateTimeControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatetimecontroldisplayoptions.html","Properties":{"DateTimeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatetimecontroldisplayoptions.html#cfn-quicksight-template-relativedatetimecontroldisplayoptions-datetimeformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatetimecontroldisplayoptions.html#cfn-quicksight-template-relativedatetimecontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RelativeDatesFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatesfilter.html","Properties":{"AnchorDateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatesfilter.html#cfn-quicksight-template-relativedatesfilter-anchordateconfiguration","Required":true,"Type":"AnchorDateConfiguration","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatesfilter.html#cfn-quicksight-template-relativedatesfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"ExcludePeriodConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatesfilter.html#cfn-quicksight-template-relativedatesfilter-excludeperiodconfiguration","Required":false,"Type":"ExcludePeriodConfiguration","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatesfilter.html#cfn-quicksight-template-relativedatesfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MinimumGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatesfilter.html#cfn-quicksight-template-relativedatesfilter-minimumgranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatesfilter.html#cfn-quicksight-template-relativedatesfilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatesfilter.html#cfn-quicksight-template-relativedatesfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RelativeDateType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatesfilter.html#cfn-quicksight-template-relativedatesfilter-relativedatetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RelativeDateValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatesfilter.html#cfn-quicksight-template-relativedatesfilter-relativedatevalue","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-relativedatesfilter.html#cfn-quicksight-template-relativedatesfilter-timegranularity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ResourcePermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-resourcepermission.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-resourcepermission.html#cfn-quicksight-template-resourcepermission-actions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-resourcepermission.html#cfn-quicksight-template-resourcepermission-principal","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-resourcepermission.html#cfn-quicksight-template-resourcepermission-resource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RollingDateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-rollingdateconfiguration.html","Properties":{"DataSetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-rollingdateconfiguration.html#cfn-quicksight-template-rollingdateconfiguration-datasetidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-rollingdateconfiguration.html#cfn-quicksight-template-rollingdateconfiguration-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.RowAlternateColorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-rowalternatecoloroptions.html","Properties":{"RowAlternateColors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-rowalternatecoloroptions.html#cfn-quicksight-template-rowalternatecoloroptions-rowalternatecolors","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-rowalternatecoloroptions.html#cfn-quicksight-template-rowalternatecoloroptions-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SameSheetTargetVisualConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-samesheettargetvisualconfiguration.html","Properties":{"TargetVisualOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-samesheettargetvisualconfiguration.html#cfn-quicksight-template-samesheettargetvisualconfiguration-targetvisualoptions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetVisuals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-samesheettargetvisualconfiguration.html#cfn-quicksight-template-samesheettargetvisualconfiguration-targetvisuals","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SankeyDiagramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramaggregatedfieldwells.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramaggregatedfieldwells.html#cfn-quicksight-template-sankeydiagramaggregatedfieldwells-destination","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramaggregatedfieldwells.html#cfn-quicksight-template-sankeydiagramaggregatedfieldwells-source","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramaggregatedfieldwells.html#cfn-quicksight-template-sankeydiagramaggregatedfieldwells-weight","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SankeyDiagramChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramchartconfiguration.html","Properties":{"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramchartconfiguration.html#cfn-quicksight-template-sankeydiagramchartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramchartconfiguration.html#cfn-quicksight-template-sankeydiagramchartconfiguration-fieldwells","Required":false,"Type":"SankeyDiagramFieldWells","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramchartconfiguration.html#cfn-quicksight-template-sankeydiagramchartconfiguration-sortconfiguration","Required":false,"Type":"SankeyDiagramSortConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SankeyDiagramFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramfieldwells.html","Properties":{"SankeyDiagramAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramfieldwells.html#cfn-quicksight-template-sankeydiagramfieldwells-sankeydiagramaggregatedfieldwells","Required":false,"Type":"SankeyDiagramAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SankeyDiagramSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramsortconfiguration.html","Properties":{"DestinationItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramsortconfiguration.html#cfn-quicksight-template-sankeydiagramsortconfiguration-destinationitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"SourceItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramsortconfiguration.html#cfn-quicksight-template-sankeydiagramsortconfiguration-sourceitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"WeightSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramsortconfiguration.html#cfn-quicksight-template-sankeydiagramsortconfiguration-weightsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SankeyDiagramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramvisual.html#cfn-quicksight-template-sankeydiagramvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramvisual.html#cfn-quicksight-template-sankeydiagramvisual-chartconfiguration","Required":false,"Type":"SankeyDiagramChartConfiguration","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramvisual.html#cfn-quicksight-template-sankeydiagramvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramvisual.html#cfn-quicksight-template-sankeydiagramvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sankeydiagramvisual.html#cfn-quicksight-template-sankeydiagramvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ScatterPlotCategoricallyAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotcategoricallyaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-template-scatterplotcategoricallyaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-template-scatterplotcategoricallyaggregatedfieldwells-label","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-template-scatterplotcategoricallyaggregatedfieldwells-size","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"XAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-template-scatterplotcategoricallyaggregatedfieldwells-xaxis","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"YAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotcategoricallyaggregatedfieldwells.html#cfn-quicksight-template-scatterplotcategoricallyaggregatedfieldwells-yaxis","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ScatterPlotConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotconfiguration.html","Properties":{"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotconfiguration.html#cfn-quicksight-template-scatterplotconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotconfiguration.html#cfn-quicksight-template-scatterplotconfiguration-fieldwells","Required":false,"Type":"ScatterPlotFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotconfiguration.html#cfn-quicksight-template-scatterplotconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotconfiguration.html#cfn-quicksight-template-scatterplotconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotconfiguration.html#cfn-quicksight-template-scatterplotconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"XAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotconfiguration.html#cfn-quicksight-template-scatterplotconfiguration-xaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"XAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotconfiguration.html#cfn-quicksight-template-scatterplotconfiguration-xaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"YAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotconfiguration.html#cfn-quicksight-template-scatterplotconfiguration-yaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"YAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotconfiguration.html#cfn-quicksight-template-scatterplotconfiguration-yaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ScatterPlotFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotfieldwells.html","Properties":{"ScatterPlotCategoricallyAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotfieldwells.html#cfn-quicksight-template-scatterplotfieldwells-scatterplotcategoricallyaggregatedfieldwells","Required":false,"Type":"ScatterPlotCategoricallyAggregatedFieldWells","UpdateType":"Mutable"},"ScatterPlotUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotfieldwells.html#cfn-quicksight-template-scatterplotfieldwells-scatterplotunaggregatedfieldwells","Required":false,"Type":"ScatterPlotUnaggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ScatterPlotUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotunaggregatedfieldwells.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotunaggregatedfieldwells.html#cfn-quicksight-template-scatterplotunaggregatedfieldwells-category","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotunaggregatedfieldwells.html#cfn-quicksight-template-scatterplotunaggregatedfieldwells-label","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotunaggregatedfieldwells.html#cfn-quicksight-template-scatterplotunaggregatedfieldwells-size","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"XAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotunaggregatedfieldwells.html#cfn-quicksight-template-scatterplotunaggregatedfieldwells-xaxis","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"YAxis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotunaggregatedfieldwells.html#cfn-quicksight-template-scatterplotunaggregatedfieldwells-yaxis","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ScatterPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotvisual.html#cfn-quicksight-template-scatterplotvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotvisual.html#cfn-quicksight-template-scatterplotvisual-chartconfiguration","Required":false,"Type":"ScatterPlotConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotvisual.html#cfn-quicksight-template-scatterplotvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotvisual.html#cfn-quicksight-template-scatterplotvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotvisual.html#cfn-quicksight-template-scatterplotvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scatterplotvisual.html#cfn-quicksight-template-scatterplotvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ScrollBarOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scrollbaroptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scrollbaroptions.html#cfn-quicksight-template-scrollbaroptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VisibleRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-scrollbaroptions.html#cfn-quicksight-template-scrollbaroptions-visiblerange","Required":false,"Type":"VisibleRangeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SecondaryValueOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-secondaryvalueoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-secondaryvalueoptions.html#cfn-quicksight-template-secondaryvalueoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SectionAfterPageBreak":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionafterpagebreak.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionafterpagebreak.html#cfn-quicksight-template-sectionafterpagebreak-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SectionBasedLayoutCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionbasedlayoutcanvassizeoptions.html","Properties":{"PaperCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionbasedlayoutcanvassizeoptions.html#cfn-quicksight-template-sectionbasedlayoutcanvassizeoptions-papercanvassizeoptions","Required":false,"Type":"SectionBasedLayoutPaperCanvasSizeOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SectionBasedLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionbasedlayoutconfiguration.html","Properties":{"BodySections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionbasedlayoutconfiguration.html#cfn-quicksight-template-sectionbasedlayoutconfiguration-bodysections","DuplicatesAllowed":true,"ItemType":"BodySectionConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"},"CanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionbasedlayoutconfiguration.html#cfn-quicksight-template-sectionbasedlayoutconfiguration-canvassizeoptions","Required":true,"Type":"SectionBasedLayoutCanvasSizeOptions","UpdateType":"Mutable"},"FooterSections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionbasedlayoutconfiguration.html#cfn-quicksight-template-sectionbasedlayoutconfiguration-footersections","DuplicatesAllowed":true,"ItemType":"HeaderFooterSectionConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"},"HeaderSections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionbasedlayoutconfiguration.html#cfn-quicksight-template-sectionbasedlayoutconfiguration-headersections","DuplicatesAllowed":true,"ItemType":"HeaderFooterSectionConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SectionBasedLayoutPaperCanvasSizeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionbasedlayoutpapercanvassizeoptions.html","Properties":{"PaperMargin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionbasedlayoutpapercanvassizeoptions.html#cfn-quicksight-template-sectionbasedlayoutpapercanvassizeoptions-papermargin","Required":false,"Type":"Spacing","UpdateType":"Mutable"},"PaperOrientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionbasedlayoutpapercanvassizeoptions.html#cfn-quicksight-template-sectionbasedlayoutpapercanvassizeoptions-paperorientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PaperSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionbasedlayoutpapercanvassizeoptions.html#cfn-quicksight-template-sectionbasedlayoutpapercanvassizeoptions-papersize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SectionLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionlayoutconfiguration.html","Properties":{"FreeFormLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionlayoutconfiguration.html#cfn-quicksight-template-sectionlayoutconfiguration-freeformlayout","Required":true,"Type":"FreeFormSectionLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SectionPageBreakConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionpagebreakconfiguration.html","Properties":{"After":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionpagebreakconfiguration.html#cfn-quicksight-template-sectionpagebreakconfiguration-after","Required":false,"Type":"SectionAfterPageBreak","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SectionStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionstyle.html","Properties":{"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionstyle.html#cfn-quicksight-template-sectionstyle-height","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Padding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sectionstyle.html#cfn-quicksight-template-sectionstyle-padding","Required":false,"Type":"Spacing","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SelectedSheetsFilterScopeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-selectedsheetsfilterscopeconfiguration.html","Properties":{"SheetVisualScopingConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-selectedsheetsfilterscopeconfiguration.html#cfn-quicksight-template-selectedsheetsfilterscopeconfiguration-sheetvisualscopingconfigurations","DuplicatesAllowed":true,"ItemType":"SheetVisualScopingConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-seriesitem.html","Properties":{"DataFieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-seriesitem.html#cfn-quicksight-template-seriesitem-datafieldseriesitem","Required":false,"Type":"DataFieldSeriesItem","UpdateType":"Mutable"},"FieldSeriesItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-seriesitem.html#cfn-quicksight-template-seriesitem-fieldseriesitem","Required":false,"Type":"FieldSeriesItem","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SetParameterValueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-setparametervalueconfiguration.html","Properties":{"DestinationParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-setparametervalueconfiguration.html#cfn-quicksight-template-setparametervalueconfiguration-destinationparametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-setparametervalueconfiguration.html#cfn-quicksight-template-setparametervalueconfiguration-value","Required":true,"Type":"DestinationParameterValueConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ShapeConditionalFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-shapeconditionalformat.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-shapeconditionalformat.html#cfn-quicksight-template-shapeconditionalformat-backgroundcolor","Required":true,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.Sheet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheet.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheet.html#cfn-quicksight-template-sheet-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheet.html#cfn-quicksight-template-sheet-sheetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SheetControlLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetcontrollayout.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetcontrollayout.html#cfn-quicksight-template-sheetcontrollayout-configuration","Required":true,"Type":"SheetControlLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SheetControlLayoutConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetcontrollayoutconfiguration.html","Properties":{"GridLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetcontrollayoutconfiguration.html#cfn-quicksight-template-sheetcontrollayoutconfiguration-gridlayout","Required":false,"Type":"GridLayoutConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SheetDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html#cfn-quicksight-template-sheetdefinition-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html#cfn-quicksight-template-sheetdefinition-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilterControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html#cfn-quicksight-template-sheetdefinition-filtercontrols","DuplicatesAllowed":true,"ItemType":"FilterControl","Required":false,"Type":"List","UpdateType":"Mutable"},"Layouts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html#cfn-quicksight-template-sheetdefinition-layouts","DuplicatesAllowed":true,"ItemType":"Layout","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html#cfn-quicksight-template-sheetdefinition-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html#cfn-quicksight-template-sheetdefinition-parametercontrols","DuplicatesAllowed":true,"ItemType":"ParameterControl","Required":false,"Type":"List","UpdateType":"Mutable"},"SheetControlLayouts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html#cfn-quicksight-template-sheetdefinition-sheetcontrollayouts","DuplicatesAllowed":true,"ItemType":"SheetControlLayout","Required":false,"Type":"List","UpdateType":"Mutable"},"SheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html#cfn-quicksight-template-sheetdefinition-sheetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TextBoxes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html#cfn-quicksight-template-sheetdefinition-textboxes","DuplicatesAllowed":true,"ItemType":"SheetTextBox","Required":false,"Type":"List","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html#cfn-quicksight-template-sheetdefinition-title","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visuals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetdefinition.html#cfn-quicksight-template-sheetdefinition-visuals","DuplicatesAllowed":true,"ItemType":"Visual","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SheetElementConfigurationOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetelementconfigurationoverrides.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetelementconfigurationoverrides.html#cfn-quicksight-template-sheetelementconfigurationoverrides-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SheetElementRenderingRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetelementrenderingrule.html","Properties":{"ConfigurationOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetelementrenderingrule.html#cfn-quicksight-template-sheetelementrenderingrule-configurationoverrides","Required":true,"Type":"SheetElementConfigurationOverrides","UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetelementrenderingrule.html#cfn-quicksight-template-sheetelementrenderingrule-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SheetTextBox":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheettextbox.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheettextbox.html#cfn-quicksight-template-sheettextbox-content","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SheetTextBoxId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheettextbox.html#cfn-quicksight-template-sheettextbox-sheettextboxid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SheetVisualScopingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetvisualscopingconfiguration.html","Properties":{"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetvisualscopingconfiguration.html#cfn-quicksight-template-sheetvisualscopingconfiguration-scope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SheetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetvisualscopingconfiguration.html#cfn-quicksight-template-sheetvisualscopingconfiguration-sheetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VisualIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-sheetvisualscopingconfiguration.html#cfn-quicksight-template-sheetvisualscopingconfiguration-visualids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ShortFormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-shortformattext.html","Properties":{"PlainText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-shortformattext.html#cfn-quicksight-template-shortformattext-plaintext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RichText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-shortformattext.html#cfn-quicksight-template-shortformattext-richtext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SimpleClusterMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-simpleclustermarker.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-simpleclustermarker.html#cfn-quicksight-template-simpleclustermarker-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SliderControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-slidercontroldisplayoptions.html","Properties":{"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-slidercontroldisplayoptions.html#cfn-quicksight-template-slidercontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SmallMultiplesOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-smallmultiplesoptions.html","Properties":{"MaxVisibleColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-smallmultiplesoptions.html#cfn-quicksight-template-smallmultiplesoptions-maxvisiblecolumns","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaxVisibleRows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-smallmultiplesoptions.html#cfn-quicksight-template-smallmultiplesoptions-maxvisiblerows","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PanelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-smallmultiplesoptions.html#cfn-quicksight-template-smallmultiplesoptions-panelconfiguration","Required":false,"Type":"PanelConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.Spacing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-spacing.html","Properties":{"Bottom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-spacing.html#cfn-quicksight-template-spacing-bottom","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Left":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-spacing.html#cfn-quicksight-template-spacing-left","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Right":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-spacing.html#cfn-quicksight-template-spacing-right","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Top":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-spacing.html#cfn-quicksight-template-spacing-top","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.StringDefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringdefaultvalues.html","Properties":{"DynamicValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringdefaultvalues.html#cfn-quicksight-template-stringdefaultvalues-dynamicvalue","Required":false,"Type":"DynamicDefaultValue","UpdateType":"Mutable"},"StaticValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringdefaultvalues.html#cfn-quicksight-template-stringdefaultvalues-staticvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.StringFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringformatconfiguration.html","Properties":{"NullValueFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringformatconfiguration.html#cfn-quicksight-template-stringformatconfiguration-nullvalueformatconfiguration","Required":false,"Type":"NullValueFormatConfiguration","UpdateType":"Mutable"},"NumericFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringformatconfiguration.html#cfn-quicksight-template-stringformatconfiguration-numericformatconfiguration","Required":false,"Type":"NumericFormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.StringParameterDeclaration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringparameterdeclaration.html","Properties":{"DefaultValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringparameterdeclaration.html#cfn-quicksight-template-stringparameterdeclaration-defaultvalues","Required":false,"Type":"StringDefaultValues","UpdateType":"Mutable"},"MappedDataSetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringparameterdeclaration.html#cfn-quicksight-template-stringparameterdeclaration-mappeddatasetparameters","DuplicatesAllowed":true,"ItemType":"MappedDataSetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringparameterdeclaration.html#cfn-quicksight-template-stringparameterdeclaration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringparameterdeclaration.html#cfn-quicksight-template-stringparameterdeclaration-parametervaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ValueWhenUnset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringparameterdeclaration.html#cfn-quicksight-template-stringparameterdeclaration-valuewhenunset","Required":false,"Type":"StringValueWhenUnsetConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.StringValueWhenUnsetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringvaluewhenunsetconfiguration.html","Properties":{"CustomValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringvaluewhenunsetconfiguration.html#cfn-quicksight-template-stringvaluewhenunsetconfiguration-customvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueWhenUnsetOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-stringvaluewhenunsetconfiguration.html#cfn-quicksight-template-stringvaluewhenunsetconfiguration-valuewhenunsetoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.SubtotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-subtotaloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-subtotaloptions.html#cfn-quicksight-template-subtotaloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-subtotaloptions.html#cfn-quicksight-template-subtotaloptions-fieldlevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldLevelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-subtotaloptions.html#cfn-quicksight-template-subtotaloptions-fieldleveloptions","DuplicatesAllowed":true,"ItemType":"PivotTableFieldSubtotalOptions","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricHeaderCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-subtotaloptions.html#cfn-quicksight-template-subtotaloptions-metricheadercellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-subtotaloptions.html#cfn-quicksight-template-subtotaloptions-totalcellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-subtotaloptions.html#cfn-quicksight-template-subtotaloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-subtotaloptions.html#cfn-quicksight-template-subtotaloptions-valuecellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableaggregatedfieldwells.html","Properties":{"GroupBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableaggregatedfieldwells.html#cfn-quicksight-template-tableaggregatedfieldwells-groupby","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableaggregatedfieldwells.html#cfn-quicksight-template-tableaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableBorderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableborderoptions.html","Properties":{"Color":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableborderoptions.html#cfn-quicksight-template-tableborderoptions-color","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Style":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableborderoptions.html#cfn-quicksight-template-tableborderoptions-style","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Thickness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableborderoptions.html#cfn-quicksight-template-tableborderoptions-thickness","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableCellConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellconditionalformatting.html","Properties":{"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellconditionalformatting.html#cfn-quicksight-template-tablecellconditionalformatting-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TextFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellconditionalformatting.html#cfn-quicksight-template-tablecellconditionalformatting-textformat","Required":false,"Type":"TextConditionalFormat","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableCellImageSizingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellimagesizingconfiguration.html","Properties":{"TableCellImageScalingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellimagesizingconfiguration.html#cfn-quicksight-template-tablecellimagesizingconfiguration-tablecellimagescalingconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellstyle.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellstyle.html#cfn-quicksight-template-tablecellstyle-backgroundcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Border":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellstyle.html#cfn-quicksight-template-tablecellstyle-border","Required":false,"Type":"GlobalTableBorderOptions","UpdateType":"Mutable"},"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellstyle.html#cfn-quicksight-template-tablecellstyle-fontconfiguration","Required":false,"Type":"FontConfiguration","UpdateType":"Mutable"},"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellstyle.html#cfn-quicksight-template-tablecellstyle-height","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"HorizontalTextAlignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellstyle.html#cfn-quicksight-template-tablecellstyle-horizontaltextalignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextWrap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellstyle.html#cfn-quicksight-template-tablecellstyle-textwrap","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerticalTextAlignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellstyle.html#cfn-quicksight-template-tablecellstyle-verticaltextalignment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablecellstyle.html#cfn-quicksight-template-tablecellstyle-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconditionalformatting.html","Properties":{"ConditionalFormattingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconditionalformatting.html#cfn-quicksight-template-tableconditionalformatting-conditionalformattingoptions","DuplicatesAllowed":true,"ItemType":"TableConditionalFormattingOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableConditionalFormattingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconditionalformattingoption.html","Properties":{"Cell":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconditionalformattingoption.html#cfn-quicksight-template-tableconditionalformattingoption-cell","Required":false,"Type":"TableCellConditionalFormatting","UpdateType":"Mutable"},"Row":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconditionalformattingoption.html#cfn-quicksight-template-tableconditionalformattingoption-row","Required":false,"Type":"TableRowConditionalFormatting","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconfiguration.html","Properties":{"FieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconfiguration.html#cfn-quicksight-template-tableconfiguration-fieldoptions","Required":false,"Type":"TableFieldOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconfiguration.html#cfn-quicksight-template-tableconfiguration-fieldwells","Required":false,"Type":"TableFieldWells","UpdateType":"Mutable"},"PaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconfiguration.html#cfn-quicksight-template-tableconfiguration-paginatedreportoptions","Required":false,"Type":"TablePaginatedReportOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconfiguration.html#cfn-quicksight-template-tableconfiguration-sortconfiguration","Required":false,"Type":"TableSortConfiguration","UpdateType":"Mutable"},"TableInlineVisualizations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconfiguration.html#cfn-quicksight-template-tableconfiguration-tableinlinevisualizations","DuplicatesAllowed":true,"ItemType":"TableInlineVisualization","Required":false,"Type":"List","UpdateType":"Mutable"},"TableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconfiguration.html#cfn-quicksight-template-tableconfiguration-tableoptions","Required":false,"Type":"TableOptions","UpdateType":"Mutable"},"TotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableconfiguration.html#cfn-quicksight-template-tableconfiguration-totaloptions","Required":false,"Type":"TotalOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableFieldCustomIconContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldcustomiconcontent.html","Properties":{"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldcustomiconcontent.html#cfn-quicksight-template-tablefieldcustomiconcontent-icon","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableFieldCustomTextContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldcustomtextcontent.html","Properties":{"FontConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldcustomtextcontent.html#cfn-quicksight-template-tablefieldcustomtextcontent-fontconfiguration","Required":true,"Type":"FontConfiguration","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldcustomtextcontent.html#cfn-quicksight-template-tablefieldcustomtextcontent-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableFieldImageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldimageconfiguration.html","Properties":{"SizingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldimageconfiguration.html#cfn-quicksight-template-tablefieldimageconfiguration-sizingoptions","Required":false,"Type":"TableCellImageSizingConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableFieldLinkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldlinkconfiguration.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldlinkconfiguration.html#cfn-quicksight-template-tablefieldlinkconfiguration-content","Required":true,"Type":"TableFieldLinkContentConfiguration","UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldlinkconfiguration.html#cfn-quicksight-template-tablefieldlinkconfiguration-target","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableFieldLinkContentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldlinkcontentconfiguration.html","Properties":{"CustomIconContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldlinkcontentconfiguration.html#cfn-quicksight-template-tablefieldlinkcontentconfiguration-customiconcontent","Required":false,"Type":"TableFieldCustomIconContent","UpdateType":"Mutable"},"CustomTextContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldlinkcontentconfiguration.html#cfn-quicksight-template-tablefieldlinkcontentconfiguration-customtextcontent","Required":false,"Type":"TableFieldCustomTextContent","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableFieldOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldoption.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldoption.html#cfn-quicksight-template-tablefieldoption-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldoption.html#cfn-quicksight-template-tablefieldoption-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"URLStyling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldoption.html#cfn-quicksight-template-tablefieldoption-urlstyling","Required":false,"Type":"TableFieldURLConfiguration","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldoption.html#cfn-quicksight-template-tablefieldoption-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldoption.html#cfn-quicksight-template-tablefieldoption-width","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldoptions.html","Properties":{"Order":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldoptions.html#cfn-quicksight-template-tablefieldoptions-order","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SelectedFieldOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldoptions.html#cfn-quicksight-template-tablefieldoptions-selectedfieldoptions","DuplicatesAllowed":true,"ItemType":"TableFieldOption","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableFieldURLConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldurlconfiguration.html","Properties":{"ImageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldurlconfiguration.html#cfn-quicksight-template-tablefieldurlconfiguration-imageconfiguration","Required":false,"Type":"TableFieldImageConfiguration","UpdateType":"Mutable"},"LinkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldurlconfiguration.html#cfn-quicksight-template-tablefieldurlconfiguration-linkconfiguration","Required":false,"Type":"TableFieldLinkConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldwells.html","Properties":{"TableAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldwells.html#cfn-quicksight-template-tablefieldwells-tableaggregatedfieldwells","Required":false,"Type":"TableAggregatedFieldWells","UpdateType":"Mutable"},"TableUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablefieldwells.html#cfn-quicksight-template-tablefieldwells-tableunaggregatedfieldwells","Required":false,"Type":"TableUnaggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableInlineVisualization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableinlinevisualization.html","Properties":{"DataBars":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableinlinevisualization.html#cfn-quicksight-template-tableinlinevisualization-databars","Required":false,"Type":"DataBarsOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableoptions.html","Properties":{"CellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableoptions.html#cfn-quicksight-template-tableoptions-cellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"HeaderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableoptions.html#cfn-quicksight-template-tableoptions-headerstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"Orientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableoptions.html#cfn-quicksight-template-tableoptions-orientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RowAlternateColorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableoptions.html#cfn-quicksight-template-tableoptions-rowalternatecoloroptions","Required":false,"Type":"RowAlternateColorOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TablePaginatedReportOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablepaginatedreportoptions.html","Properties":{"OverflowColumnHeaderVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablepaginatedreportoptions.html#cfn-quicksight-template-tablepaginatedreportoptions-overflowcolumnheadervisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VerticalOverflowVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablepaginatedreportoptions.html#cfn-quicksight-template-tablepaginatedreportoptions-verticaloverflowvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableRowConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablerowconditionalformatting.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablerowconditionalformatting.html#cfn-quicksight-template-tablerowconditionalformatting-backgroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablerowconditionalformatting.html#cfn-quicksight-template-tablerowconditionalformatting-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableSideBorderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablesideborderoptions.html","Properties":{"Bottom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablesideborderoptions.html#cfn-quicksight-template-tablesideborderoptions-bottom","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"InnerHorizontal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablesideborderoptions.html#cfn-quicksight-template-tablesideborderoptions-innerhorizontal","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"InnerVertical":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablesideborderoptions.html#cfn-quicksight-template-tablesideborderoptions-innervertical","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"Left":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablesideborderoptions.html#cfn-quicksight-template-tablesideborderoptions-left","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"Right":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablesideborderoptions.html#cfn-quicksight-template-tablesideborderoptions-right","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"},"Top":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablesideborderoptions.html#cfn-quicksight-template-tablesideborderoptions-top","Required":false,"Type":"TableBorderOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablesortconfiguration.html","Properties":{"PaginationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablesortconfiguration.html#cfn-quicksight-template-tablesortconfiguration-paginationconfiguration","Required":false,"Type":"PaginationConfiguration","UpdateType":"Mutable"},"RowSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablesortconfiguration.html#cfn-quicksight-template-tablesortconfiguration-rowsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableUnaggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableunaggregatedfieldwells.html","Properties":{"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tableunaggregatedfieldwells.html#cfn-quicksight-template-tableunaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"UnaggregatedField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablevisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablevisual.html#cfn-quicksight-template-tablevisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablevisual.html#cfn-quicksight-template-tablevisual-chartconfiguration","Required":false,"Type":"TableConfiguration","UpdateType":"Mutable"},"ConditionalFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablevisual.html#cfn-quicksight-template-tablevisual-conditionalformatting","Required":false,"Type":"TableConditionalFormatting","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablevisual.html#cfn-quicksight-template-tablevisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablevisual.html#cfn-quicksight-template-tablevisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tablevisual.html#cfn-quicksight-template-tablevisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TemplateError":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateerror.html","Properties":{"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateerror.html#cfn-quicksight-template-templateerror-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateerror.html#cfn-quicksight-template-templateerror-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ViolatedEntities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateerror.html#cfn-quicksight-template-templateerror-violatedentities","DuplicatesAllowed":true,"ItemType":"Entity","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TemplateSourceAnalysis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templatesourceanalysis.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templatesourceanalysis.html#cfn-quicksight-template-templatesourceanalysis-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataSetReferences":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templatesourceanalysis.html#cfn-quicksight-template-templatesourceanalysis-datasetreferences","DuplicatesAllowed":true,"ItemType":"DataSetReference","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TemplateSourceEntity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templatesourceentity.html","Properties":{"SourceAnalysis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templatesourceentity.html#cfn-quicksight-template-templatesourceentity-sourceanalysis","Required":false,"Type":"TemplateSourceAnalysis","UpdateType":"Mutable"},"SourceTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templatesourceentity.html#cfn-quicksight-template-templatesourceentity-sourcetemplate","Required":false,"Type":"TemplateSourceTemplate","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TemplateSourceTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templatesourcetemplate.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templatesourcetemplate.html#cfn-quicksight-template-templatesourcetemplate-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TemplateVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversion.html","Properties":{"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversion.html#cfn-quicksight-template-templateversion-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataSetConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversion.html#cfn-quicksight-template-templateversion-datasetconfigurations","DuplicatesAllowed":true,"ItemType":"DataSetConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversion.html#cfn-quicksight-template-templateversion-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Errors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversion.html#cfn-quicksight-template-templateversion-errors","DuplicatesAllowed":true,"ItemType":"TemplateError","Required":false,"Type":"List","UpdateType":"Mutable"},"Sheets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversion.html#cfn-quicksight-template-templateversion-sheets","DuplicatesAllowed":true,"ItemType":"Sheet","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceEntityArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversion.html#cfn-quicksight-template-templateversion-sourceentityarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversion.html#cfn-quicksight-template-templateversion-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThemeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversion.html#cfn-quicksight-template-templateversion-themearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversion.html#cfn-quicksight-template-templateversion-versionnumber","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TemplateVersionDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversiondefinition.html","Properties":{"AnalysisDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversiondefinition.html#cfn-quicksight-template-templateversiondefinition-analysisdefaults","Required":false,"Type":"AnalysisDefaults","UpdateType":"Mutable"},"CalculatedFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversiondefinition.html#cfn-quicksight-template-templateversiondefinition-calculatedfields","DuplicatesAllowed":true,"ItemType":"CalculatedField","Required":false,"Type":"List","UpdateType":"Mutable"},"ColumnConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversiondefinition.html#cfn-quicksight-template-templateversiondefinition-columnconfigurations","DuplicatesAllowed":true,"ItemType":"ColumnConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"DataSetConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversiondefinition.html#cfn-quicksight-template-templateversiondefinition-datasetconfigurations","DuplicatesAllowed":true,"ItemType":"DataSetConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"},"FilterGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversiondefinition.html#cfn-quicksight-template-templateversiondefinition-filtergroups","DuplicatesAllowed":true,"ItemType":"FilterGroup","Required":false,"Type":"List","UpdateType":"Mutable"},"ParameterDeclarations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversiondefinition.html#cfn-quicksight-template-templateversiondefinition-parameterdeclarations","DuplicatesAllowed":true,"ItemType":"ParameterDeclaration","Required":false,"Type":"List","UpdateType":"Mutable"},"Sheets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-templateversiondefinition.html#cfn-quicksight-template-templateversiondefinition-sheets","DuplicatesAllowed":true,"ItemType":"SheetDefinition","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TextAreaControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textareacontroldisplayoptions.html","Properties":{"PlaceholderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textareacontroldisplayoptions.html#cfn-quicksight-template-textareacontroldisplayoptions-placeholderoptions","Required":false,"Type":"TextControlPlaceholderOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textareacontroldisplayoptions.html#cfn-quicksight-template-textareacontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TextConditionalFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textconditionalformat.html","Properties":{"BackgroundColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textconditionalformat.html#cfn-quicksight-template-textconditionalformat-backgroundcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"},"Icon":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textconditionalformat.html#cfn-quicksight-template-textconditionalformat-icon","Required":false,"Type":"ConditionalFormattingIcon","UpdateType":"Mutable"},"TextColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textconditionalformat.html#cfn-quicksight-template-textconditionalformat-textcolor","Required":false,"Type":"ConditionalFormattingColor","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TextControlPlaceholderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textcontrolplaceholderoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textcontrolplaceholderoptions.html#cfn-quicksight-template-textcontrolplaceholderoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TextFieldControlDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textfieldcontroldisplayoptions.html","Properties":{"PlaceholderOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textfieldcontroldisplayoptions.html#cfn-quicksight-template-textfieldcontroldisplayoptions-placeholderoptions","Required":false,"Type":"TextControlPlaceholderOptions","UpdateType":"Mutable"},"TitleOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-textfieldcontroldisplayoptions.html#cfn-quicksight-template-textfieldcontroldisplayoptions-titleoptions","Required":false,"Type":"LabelOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.ThousandSeparatorOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-thousandseparatoroptions.html","Properties":{"Symbol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-thousandseparatoroptions.html#cfn-quicksight-template-thousandseparatoroptions-symbol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-thousandseparatoroptions.html#cfn-quicksight-template-thousandseparatoroptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TimeBasedForecastProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timebasedforecastproperties.html","Properties":{"LowerBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timebasedforecastproperties.html#cfn-quicksight-template-timebasedforecastproperties-lowerboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PeriodsBackward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timebasedforecastproperties.html#cfn-quicksight-template-timebasedforecastproperties-periodsbackward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PeriodsForward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timebasedforecastproperties.html#cfn-quicksight-template-timebasedforecastproperties-periodsforward","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"PredictionInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timebasedforecastproperties.html#cfn-quicksight-template-timebasedforecastproperties-predictioninterval","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Seasonality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timebasedforecastproperties.html#cfn-quicksight-template-timebasedforecastproperties-seasonality","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"UpperBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timebasedforecastproperties.html#cfn-quicksight-template-timebasedforecastproperties-upperboundary","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TimeEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timeequalityfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timeequalityfilter.html#cfn-quicksight-template-timeequalityfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timeequalityfilter.html#cfn-quicksight-template-timeequalityfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timeequalityfilter.html#cfn-quicksight-template-timeequalityfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timeequalityfilter.html#cfn-quicksight-template-timeequalityfilter-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timeequalityfilter.html#cfn-quicksight-template-timeequalityfilter-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TimeRangeDrillDownFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangedrilldownfilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangedrilldownfilter.html#cfn-quicksight-template-timerangedrilldownfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"RangeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangedrilldownfilter.html#cfn-quicksight-template-timerangedrilldownfilter-rangemaximum","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RangeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangedrilldownfilter.html#cfn-quicksight-template-timerangedrilldownfilter-rangeminimum","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangedrilldownfilter.html#cfn-quicksight-template-timerangedrilldownfilter-timegranularity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TimeRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefilter.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefilter.html#cfn-quicksight-template-timerangefilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"ExcludePeriodConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefilter.html#cfn-quicksight-template-timerangefilter-excludeperiodconfiguration","Required":false,"Type":"ExcludePeriodConfiguration","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefilter.html#cfn-quicksight-template-timerangefilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncludeMaximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefilter.html#cfn-quicksight-template-timerangefilter-includemaximum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IncludeMinimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefilter.html#cfn-quicksight-template-timerangefilter-includeminimum","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NullOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefilter.html#cfn-quicksight-template-timerangefilter-nulloption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RangeMaximumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefilter.html#cfn-quicksight-template-timerangefilter-rangemaximumvalue","Required":false,"Type":"TimeRangeFilterValue","UpdateType":"Mutable"},"RangeMinimumValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefilter.html#cfn-quicksight-template-timerangefilter-rangeminimumvalue","Required":false,"Type":"TimeRangeFilterValue","UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefilter.html#cfn-quicksight-template-timerangefilter-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TimeRangeFilterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefiltervalue.html","Properties":{"Parameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefiltervalue.html#cfn-quicksight-template-timerangefiltervalue-parameter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RollingDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefiltervalue.html#cfn-quicksight-template-timerangefiltervalue-rollingdate","Required":false,"Type":"RollingDateConfiguration","UpdateType":"Mutable"},"StaticValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-timerangefiltervalue.html#cfn-quicksight-template-timerangefiltervalue-staticvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tooltipitem.html","Properties":{"ColumnTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tooltipitem.html#cfn-quicksight-template-tooltipitem-columntooltipitem","Required":false,"Type":"ColumnTooltipItem","UpdateType":"Mutable"},"FieldTooltipItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tooltipitem.html#cfn-quicksight-template-tooltipitem-fieldtooltipitem","Required":false,"Type":"FieldTooltipItem","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TooltipOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tooltipoptions.html","Properties":{"FieldBasedTooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tooltipoptions.html#cfn-quicksight-template-tooltipoptions-fieldbasedtooltip","Required":false,"Type":"FieldBasedTooltip","UpdateType":"Mutable"},"SelectedTooltipType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tooltipoptions.html#cfn-quicksight-template-tooltipoptions-selectedtooltiptype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TooltipVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-tooltipoptions.html#cfn-quicksight-template-tooltipoptions-tooltipvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TopBottomFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomfilter.html","Properties":{"AggregationSortConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomfilter.html#cfn-quicksight-template-topbottomfilter-aggregationsortconfigurations","DuplicatesAllowed":true,"ItemType":"AggregationSortConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"},"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomfilter.html#cfn-quicksight-template-topbottomfilter-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomfilter.html#cfn-quicksight-template-topbottomfilter-filterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Limit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomfilter.html#cfn-quicksight-template-topbottomfilter-limit","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomfilter.html#cfn-quicksight-template-topbottomfilter-parametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomfilter.html#cfn-quicksight-template-topbottomfilter-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TopBottomMoversComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottommoverscomputation.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottommoverscomputation.html#cfn-quicksight-template-topbottommoverscomputation-category","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottommoverscomputation.html#cfn-quicksight-template-topbottommoverscomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MoverSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottommoverscomputation.html#cfn-quicksight-template-topbottommoverscomputation-moversize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottommoverscomputation.html#cfn-quicksight-template-topbottommoverscomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SortOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottommoverscomputation.html#cfn-quicksight-template-topbottommoverscomputation-sortorder","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottommoverscomputation.html#cfn-quicksight-template-topbottommoverscomputation-time","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottommoverscomputation.html#cfn-quicksight-template-topbottommoverscomputation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottommoverscomputation.html#cfn-quicksight-template-topbottommoverscomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TopBottomRankedComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomrankedcomputation.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomrankedcomputation.html#cfn-quicksight-template-topbottomrankedcomputation-category","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomrankedcomputation.html#cfn-quicksight-template-topbottomrankedcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomrankedcomputation.html#cfn-quicksight-template-topbottomrankedcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResultSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomrankedcomputation.html#cfn-quicksight-template-topbottomrankedcomputation-resultsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomrankedcomputation.html#cfn-quicksight-template-topbottomrankedcomputation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-topbottomrankedcomputation.html#cfn-quicksight-template-topbottomrankedcomputation-value","Required":false,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TotalAggregationComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-totalaggregationcomputation.html","Properties":{"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-totalaggregationcomputation.html#cfn-quicksight-template-totalaggregationcomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-totalaggregationcomputation.html#cfn-quicksight-template-totalaggregationcomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-totalaggregationcomputation.html#cfn-quicksight-template-totalaggregationcomputation-value","Required":true,"Type":"MeasureField","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TotalOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-totaloptions.html","Properties":{"CustomLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-totaloptions.html#cfn-quicksight-template-totaloptions-customlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Placement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-totaloptions.html#cfn-quicksight-template-totaloptions-placement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScrollStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-totaloptions.html#cfn-quicksight-template-totaloptions-scrollstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TotalCellStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-totaloptions.html#cfn-quicksight-template-totaloptions-totalcellstyle","Required":false,"Type":"TableCellStyle","UpdateType":"Mutable"},"TotalsVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-totaloptions.html#cfn-quicksight-template-totaloptions-totalsvisibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TreeMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapaggregatedfieldwells.html","Properties":{"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapaggregatedfieldwells.html#cfn-quicksight-template-treemapaggregatedfieldwells-colors","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"},"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapaggregatedfieldwells.html#cfn-quicksight-template-treemapaggregatedfieldwells-groups","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Sizes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapaggregatedfieldwells.html#cfn-quicksight-template-treemapaggregatedfieldwells-sizes","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TreeMapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapconfiguration.html","Properties":{"ColorLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapconfiguration.html#cfn-quicksight-template-treemapconfiguration-colorlabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"ColorScale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapconfiguration.html#cfn-quicksight-template-treemapconfiguration-colorscale","Required":false,"Type":"ColorScale","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapconfiguration.html#cfn-quicksight-template-treemapconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapconfiguration.html#cfn-quicksight-template-treemapconfiguration-fieldwells","Required":false,"Type":"TreeMapFieldWells","UpdateType":"Mutable"},"GroupLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapconfiguration.html#cfn-quicksight-template-treemapconfiguration-grouplabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapconfiguration.html#cfn-quicksight-template-treemapconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"SizeLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapconfiguration.html#cfn-quicksight-template-treemapconfiguration-sizelabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapconfiguration.html#cfn-quicksight-template-treemapconfiguration-sortconfiguration","Required":false,"Type":"TreeMapSortConfiguration","UpdateType":"Mutable"},"Tooltip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapconfiguration.html#cfn-quicksight-template-treemapconfiguration-tooltip","Required":false,"Type":"TooltipOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TreeMapFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapfieldwells.html","Properties":{"TreeMapAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapfieldwells.html#cfn-quicksight-template-treemapfieldwells-treemapaggregatedfieldwells","Required":false,"Type":"TreeMapAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TreeMapSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapsortconfiguration.html","Properties":{"TreeMapGroupItemsLimitConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapsortconfiguration.html#cfn-quicksight-template-treemapsortconfiguration-treemapgroupitemslimitconfiguration","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"TreeMapSort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapsortconfiguration.html#cfn-quicksight-template-treemapsortconfiguration-treemapsort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TreeMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapvisual.html#cfn-quicksight-template-treemapvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapvisual.html#cfn-quicksight-template-treemapvisual-chartconfiguration","Required":false,"Type":"TreeMapConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapvisual.html#cfn-quicksight-template-treemapvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapvisual.html#cfn-quicksight-template-treemapvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapvisual.html#cfn-quicksight-template-treemapvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-treemapvisual.html#cfn-quicksight-template-treemapvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.TrendArrowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-trendarrowoptions.html","Properties":{"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-trendarrowoptions.html#cfn-quicksight-template-trendarrowoptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.UnaggregatedField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-unaggregatedfield.html","Properties":{"Column":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-unaggregatedfield.html#cfn-quicksight-template-unaggregatedfield-column","Required":true,"Type":"ColumnIdentifier","UpdateType":"Mutable"},"FieldId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-unaggregatedfield.html#cfn-quicksight-template-unaggregatedfield-fieldid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-unaggregatedfield.html#cfn-quicksight-template-unaggregatedfield-formatconfiguration","Required":false,"Type":"FormatConfiguration","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.UniqueValuesComputation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-uniquevaluescomputation.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-uniquevaluescomputation.html#cfn-quicksight-template-uniquevaluescomputation-category","Required":true,"Type":"DimensionField","UpdateType":"Mutable"},"ComputationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-uniquevaluescomputation.html#cfn-quicksight-template-uniquevaluescomputation-computationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-uniquevaluescomputation.html#cfn-quicksight-template-uniquevaluescomputation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.VisibleRangeOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visiblerangeoptions.html","Properties":{"PercentRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visiblerangeoptions.html#cfn-quicksight-template-visiblerangeoptions-percentrange","Required":false,"Type":"PercentVisibleRange","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.Visual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html","Properties":{"BarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-barchartvisual","Required":false,"Type":"BarChartVisual","UpdateType":"Mutable"},"BoxPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-boxplotvisual","Required":false,"Type":"BoxPlotVisual","UpdateType":"Mutable"},"ComboChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-combochartvisual","Required":false,"Type":"ComboChartVisual","UpdateType":"Mutable"},"CustomContentVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-customcontentvisual","Required":false,"Type":"CustomContentVisual","UpdateType":"Mutable"},"EmptyVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-emptyvisual","Required":false,"Type":"EmptyVisual","UpdateType":"Mutable"},"FilledMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-filledmapvisual","Required":false,"Type":"FilledMapVisual","UpdateType":"Mutable"},"FunnelChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-funnelchartvisual","Required":false,"Type":"FunnelChartVisual","UpdateType":"Mutable"},"GaugeChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-gaugechartvisual","Required":false,"Type":"GaugeChartVisual","UpdateType":"Mutable"},"GeospatialMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-geospatialmapvisual","Required":false,"Type":"GeospatialMapVisual","UpdateType":"Mutable"},"HeatMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-heatmapvisual","Required":false,"Type":"HeatMapVisual","UpdateType":"Mutable"},"HistogramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-histogramvisual","Required":false,"Type":"HistogramVisual","UpdateType":"Mutable"},"InsightVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-insightvisual","Required":false,"Type":"InsightVisual","UpdateType":"Mutable"},"KPIVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-kpivisual","Required":false,"Type":"KPIVisual","UpdateType":"Mutable"},"LineChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-linechartvisual","Required":false,"Type":"LineChartVisual","UpdateType":"Mutable"},"PieChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-piechartvisual","Required":false,"Type":"PieChartVisual","UpdateType":"Mutable"},"PivotTableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-pivottablevisual","Required":false,"Type":"PivotTableVisual","UpdateType":"Mutable"},"RadarChartVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-radarchartvisual","Required":false,"Type":"RadarChartVisual","UpdateType":"Mutable"},"SankeyDiagramVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-sankeydiagramvisual","Required":false,"Type":"SankeyDiagramVisual","UpdateType":"Mutable"},"ScatterPlotVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-scatterplotvisual","Required":false,"Type":"ScatterPlotVisual","UpdateType":"Mutable"},"TableVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-tablevisual","Required":false,"Type":"TableVisual","UpdateType":"Mutable"},"TreeMapVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-treemapvisual","Required":false,"Type":"TreeMapVisual","UpdateType":"Mutable"},"WaterfallVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-waterfallvisual","Required":false,"Type":"WaterfallVisual","UpdateType":"Mutable"},"WordCloudVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visual.html#cfn-quicksight-template-visual-wordcloudvisual","Required":false,"Type":"WordCloudVisual","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.VisualCustomAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualcustomaction.html","Properties":{"ActionOperations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualcustomaction.html#cfn-quicksight-template-visualcustomaction-actionoperations","DuplicatesAllowed":true,"ItemType":"VisualCustomActionOperation","Required":true,"Type":"List","UpdateType":"Mutable"},"CustomActionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualcustomaction.html#cfn-quicksight-template-visualcustomaction-customactionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualcustomaction.html#cfn-quicksight-template-visualcustomaction-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualcustomaction.html#cfn-quicksight-template-visualcustomaction-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Trigger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualcustomaction.html#cfn-quicksight-template-visualcustomaction-trigger","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.VisualCustomActionOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualcustomactionoperation.html","Properties":{"FilterOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualcustomactionoperation.html#cfn-quicksight-template-visualcustomactionoperation-filteroperation","Required":false,"Type":"CustomActionFilterOperation","UpdateType":"Mutable"},"NavigationOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualcustomactionoperation.html#cfn-quicksight-template-visualcustomactionoperation-navigationoperation","Required":false,"Type":"CustomActionNavigationOperation","UpdateType":"Mutable"},"SetParametersOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualcustomactionoperation.html#cfn-quicksight-template-visualcustomactionoperation-setparametersoperation","Required":false,"Type":"CustomActionSetParametersOperation","UpdateType":"Mutable"},"URLOperation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualcustomactionoperation.html#cfn-quicksight-template-visualcustomactionoperation-urloperation","Required":false,"Type":"CustomActionURLOperation","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualpalette.html","Properties":{"ChartColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualpalette.html#cfn-quicksight-template-visualpalette-chartcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColorMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualpalette.html#cfn-quicksight-template-visualpalette-colormap","DuplicatesAllowed":true,"ItemType":"DataPathColor","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.VisualSubtitleLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualsubtitlelabeloptions.html","Properties":{"FormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualsubtitlelabeloptions.html#cfn-quicksight-template-visualsubtitlelabeloptions-formattext","Required":false,"Type":"LongFormatText","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualsubtitlelabeloptions.html#cfn-quicksight-template-visualsubtitlelabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.VisualTitleLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualtitlelabeloptions.html","Properties":{"FormatText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualtitlelabeloptions.html#cfn-quicksight-template-visualtitlelabeloptions-formattext","Required":false,"Type":"ShortFormatText","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-visualtitlelabeloptions.html#cfn-quicksight-template-visualtitlelabeloptions-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WaterfallChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartaggregatedfieldwells.html","Properties":{"Breakdowns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartaggregatedfieldwells.html#cfn-quicksight-template-waterfallchartaggregatedfieldwells-breakdowns","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Categories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartaggregatedfieldwells.html#cfn-quicksight-template-waterfallchartaggregatedfieldwells-categories","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartaggregatedfieldwells.html#cfn-quicksight-template-waterfallchartaggregatedfieldwells-values","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WaterfallChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartconfiguration.html","Properties":{"CategoryAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartconfiguration.html#cfn-quicksight-template-waterfallchartconfiguration-categoryaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"CategoryAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartconfiguration.html#cfn-quicksight-template-waterfallchartconfiguration-categoryaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"DataLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartconfiguration.html#cfn-quicksight-template-waterfallchartconfiguration-datalabels","Required":false,"Type":"DataLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartconfiguration.html#cfn-quicksight-template-waterfallchartconfiguration-fieldwells","Required":false,"Type":"WaterfallChartFieldWells","UpdateType":"Mutable"},"Legend":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartconfiguration.html#cfn-quicksight-template-waterfallchartconfiguration-legend","Required":false,"Type":"LegendOptions","UpdateType":"Mutable"},"PrimaryYAxisDisplayOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartconfiguration.html#cfn-quicksight-template-waterfallchartconfiguration-primaryyaxisdisplayoptions","Required":false,"Type":"AxisDisplayOptions","UpdateType":"Mutable"},"PrimaryYAxisLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartconfiguration.html#cfn-quicksight-template-waterfallchartconfiguration-primaryyaxislabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartconfiguration.html#cfn-quicksight-template-waterfallchartconfiguration-sortconfiguration","Required":false,"Type":"WaterfallChartSortConfiguration","UpdateType":"Mutable"},"VisualPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartconfiguration.html#cfn-quicksight-template-waterfallchartconfiguration-visualpalette","Required":false,"Type":"VisualPalette","UpdateType":"Mutable"},"WaterfallChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartconfiguration.html#cfn-quicksight-template-waterfallchartconfiguration-waterfallchartoptions","Required":false,"Type":"WaterfallChartOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WaterfallChartFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartfieldwells.html","Properties":{"WaterfallChartAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartfieldwells.html#cfn-quicksight-template-waterfallchartfieldwells-waterfallchartaggregatedfieldwells","Required":false,"Type":"WaterfallChartAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WaterfallChartOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartoptions.html","Properties":{"TotalBarLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartoptions.html#cfn-quicksight-template-waterfallchartoptions-totalbarlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WaterfallChartSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartsortconfiguration.html","Properties":{"BreakdownItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartsortconfiguration.html#cfn-quicksight-template-waterfallchartsortconfiguration-breakdownitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallchartsortconfiguration.html#cfn-quicksight-template-waterfallchartsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WaterfallVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallvisual.html#cfn-quicksight-template-waterfallvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallvisual.html#cfn-quicksight-template-waterfallvisual-chartconfiguration","Required":false,"Type":"WaterfallChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallvisual.html#cfn-quicksight-template-waterfallvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallvisual.html#cfn-quicksight-template-waterfallvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallvisual.html#cfn-quicksight-template-waterfallvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-waterfallvisual.html#cfn-quicksight-template-waterfallvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WhatIfPointScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-whatifpointscenario.html","Properties":{"Date":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-whatifpointscenario.html#cfn-quicksight-template-whatifpointscenario-date","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-whatifpointscenario.html#cfn-quicksight-template-whatifpointscenario-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WhatIfRangeScenario":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-whatifrangescenario.html","Properties":{"EndDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-whatifrangescenario.html#cfn-quicksight-template-whatifrangescenario-enddate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StartDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-whatifrangescenario.html#cfn-quicksight-template-whatifrangescenario-startdate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-whatifrangescenario.html#cfn-quicksight-template-whatifrangescenario-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WordCloudAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudaggregatedfieldwells.html","Properties":{"GroupBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudaggregatedfieldwells.html#cfn-quicksight-template-wordcloudaggregatedfieldwells-groupby","DuplicatesAllowed":true,"ItemType":"DimensionField","Required":false,"Type":"List","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudaggregatedfieldwells.html#cfn-quicksight-template-wordcloudaggregatedfieldwells-size","DuplicatesAllowed":true,"ItemType":"MeasureField","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WordCloudChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudchartconfiguration.html","Properties":{"CategoryLabelOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudchartconfiguration.html#cfn-quicksight-template-wordcloudchartconfiguration-categorylabeloptions","Required":false,"Type":"ChartAxisLabelOptions","UpdateType":"Mutable"},"FieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudchartconfiguration.html#cfn-quicksight-template-wordcloudchartconfiguration-fieldwells","Required":false,"Type":"WordCloudFieldWells","UpdateType":"Mutable"},"SortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudchartconfiguration.html#cfn-quicksight-template-wordcloudchartconfiguration-sortconfiguration","Required":false,"Type":"WordCloudSortConfiguration","UpdateType":"Mutable"},"WordCloudOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudchartconfiguration.html#cfn-quicksight-template-wordcloudchartconfiguration-wordcloudoptions","Required":false,"Type":"WordCloudOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WordCloudFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudfieldwells.html","Properties":{"WordCloudAggregatedFieldWells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudfieldwells.html#cfn-quicksight-template-wordcloudfieldwells-wordcloudaggregatedfieldwells","Required":false,"Type":"WordCloudAggregatedFieldWells","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WordCloudOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudoptions.html","Properties":{"CloudLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudoptions.html#cfn-quicksight-template-wordcloudoptions-cloudlayout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaximumStringLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudoptions.html#cfn-quicksight-template-wordcloudoptions-maximumstringlength","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"WordCasing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudoptions.html#cfn-quicksight-template-wordcloudoptions-wordcasing","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WordOrientation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudoptions.html#cfn-quicksight-template-wordcloudoptions-wordorientation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WordPadding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudoptions.html#cfn-quicksight-template-wordcloudoptions-wordpadding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WordScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudoptions.html#cfn-quicksight-template-wordcloudoptions-wordscaling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WordCloudSortConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudsortconfiguration.html","Properties":{"CategoryItemsLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudsortconfiguration.html#cfn-quicksight-template-wordcloudsortconfiguration-categoryitemslimit","Required":false,"Type":"ItemsLimitConfiguration","UpdateType":"Mutable"},"CategorySort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudsortconfiguration.html#cfn-quicksight-template-wordcloudsortconfiguration-categorysort","DuplicatesAllowed":true,"ItemType":"FieldSortOptions","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Template.WordCloudVisual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudvisual.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudvisual.html#cfn-quicksight-template-wordcloudvisual-actions","DuplicatesAllowed":true,"ItemType":"VisualCustomAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ChartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudvisual.html#cfn-quicksight-template-wordcloudvisual-chartconfiguration","Required":false,"Type":"WordCloudChartConfiguration","UpdateType":"Mutable"},"ColumnHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudvisual.html#cfn-quicksight-template-wordcloudvisual-columnhierarchies","DuplicatesAllowed":true,"ItemType":"ColumnHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"Subtitle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudvisual.html#cfn-quicksight-template-wordcloudvisual-subtitle","Required":false,"Type":"VisualSubtitleLabelOptions","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudvisual.html#cfn-quicksight-template-wordcloudvisual-title","Required":false,"Type":"VisualTitleLabelOptions","UpdateType":"Mutable"},"VisualId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-template-wordcloudvisual.html#cfn-quicksight-template-wordcloudvisual-visualid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.BorderStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-borderstyle.html","Properties":{"Show":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-borderstyle.html#cfn-quicksight-theme-borderstyle-show","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.DataColorPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-datacolorpalette.html","Properties":{"Colors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-datacolorpalette.html#cfn-quicksight-theme-datacolorpalette-colors","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"EmptyFillColor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-datacolorpalette.html#cfn-quicksight-theme-datacolorpalette-emptyfillcolor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MinMaxGradient":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-datacolorpalette.html#cfn-quicksight-theme-datacolorpalette-minmaxgradient","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.Font":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-font.html","Properties":{"FontFamily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-font.html#cfn-quicksight-theme-font-fontfamily","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.GutterStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-gutterstyle.html","Properties":{"Show":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-gutterstyle.html#cfn-quicksight-theme-gutterstyle-show","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.MarginStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-marginstyle.html","Properties":{"Show":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-marginstyle.html#cfn-quicksight-theme-marginstyle-show","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.ResourcePermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-resourcepermission.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-resourcepermission.html#cfn-quicksight-theme-resourcepermission-actions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-resourcepermission.html#cfn-quicksight-theme-resourcepermission-principal","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-resourcepermission.html#cfn-quicksight-theme-resourcepermission-resource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.SheetStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-sheetstyle.html","Properties":{"Tile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-sheetstyle.html#cfn-quicksight-theme-sheetstyle-tile","Required":false,"Type":"TileStyle","UpdateType":"Mutable"},"TileLayout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-sheetstyle.html#cfn-quicksight-theme-sheetstyle-tilelayout","Required":false,"Type":"TileLayoutStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.ThemeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeconfiguration.html","Properties":{"DataColorPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeconfiguration.html#cfn-quicksight-theme-themeconfiguration-datacolorpalette","Required":false,"Type":"DataColorPalette","UpdateType":"Mutable"},"Sheet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeconfiguration.html#cfn-quicksight-theme-themeconfiguration-sheet","Required":false,"Type":"SheetStyle","UpdateType":"Mutable"},"Typography":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeconfiguration.html#cfn-quicksight-theme-themeconfiguration-typography","Required":false,"Type":"Typography","UpdateType":"Mutable"},"UIColorPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeconfiguration.html#cfn-quicksight-theme-themeconfiguration-uicolorpalette","Required":false,"Type":"UIColorPalette","UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.ThemeError":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeerror.html","Properties":{"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeerror.html#cfn-quicksight-theme-themeerror-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeerror.html#cfn-quicksight-theme-themeerror-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.ThemeVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeversion.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeversion.html#cfn-quicksight-theme-themeversion-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BaseThemeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeversion.html#cfn-quicksight-theme-themeversion-basethemeid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeversion.html#cfn-quicksight-theme-themeversion-configuration","Required":false,"Type":"ThemeConfiguration","UpdateType":"Mutable"},"CreatedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeversion.html#cfn-quicksight-theme-themeversion-createdtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeversion.html#cfn-quicksight-theme-themeversion-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Errors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeversion.html#cfn-quicksight-theme-themeversion-errors","DuplicatesAllowed":true,"ItemType":"ThemeError","Required":false,"Type":"List","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeversion.html#cfn-quicksight-theme-themeversion-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-themeversion.html#cfn-quicksight-theme-themeversion-versionnumber","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.TileLayoutStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-tilelayoutstyle.html","Properties":{"Gutter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-tilelayoutstyle.html#cfn-quicksight-theme-tilelayoutstyle-gutter","Required":false,"Type":"GutterStyle","UpdateType":"Mutable"},"Margin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-tilelayoutstyle.html#cfn-quicksight-theme-tilelayoutstyle-margin","Required":false,"Type":"MarginStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.TileStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-tilestyle.html","Properties":{"Border":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-tilestyle.html#cfn-quicksight-theme-tilestyle-border","Required":false,"Type":"BorderStyle","UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.Typography":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-typography.html","Properties":{"FontFamilies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-typography.html#cfn-quicksight-theme-typography-fontfamilies","DuplicatesAllowed":true,"ItemType":"Font","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Theme.UIColorPalette":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html","Properties":{"Accent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-accent","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AccentForeground":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-accentforeground","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Danger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-danger","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DangerForeground":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-dangerforeground","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Dimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-dimension","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DimensionForeground":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-dimensionforeground","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Measure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-measure","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MeasureForeground":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-measureforeground","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrimaryBackground":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-primarybackground","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrimaryForeground":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-primaryforeground","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecondaryBackground":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-secondarybackground","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecondaryForeground":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-secondaryforeground","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Success":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-success","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SuccessForeground":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-successforeground","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Warning":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-warning","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WarningForeground":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-theme-uicolorpalette.html#cfn-quicksight-theme-uicolorpalette-warningforeground","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.CellValueSynonym":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-cellvaluesynonym.html","Properties":{"CellValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-cellvaluesynonym.html#cfn-quicksight-topic-cellvaluesynonym-cellvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Synonyms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-cellvaluesynonym.html#cfn-quicksight-topic-cellvaluesynonym-synonyms","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.CollectiveConstant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-collectiveconstant.html","Properties":{"ValueList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-collectiveconstant.html#cfn-quicksight-topic-collectiveconstant-valuelist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.ComparativeOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-comparativeorder.html","Properties":{"SpecifedOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-comparativeorder.html#cfn-quicksight-topic-comparativeorder-specifedorder","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TreatUndefinedSpecifiedValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-comparativeorder.html#cfn-quicksight-topic-comparativeorder-treatundefinedspecifiedvalues","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UseOrdering":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-comparativeorder.html#cfn-quicksight-topic-comparativeorder-useordering","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.DataAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-dataaggregation.html","Properties":{"DatasetRowDateGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-dataaggregation.html#cfn-quicksight-topic-dataaggregation-datasetrowdategranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultDateColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-dataaggregation.html#cfn-quicksight-topic-dataaggregation-defaultdatecolumnname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.DatasetMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-datasetmetadata.html","Properties":{"CalculatedFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-datasetmetadata.html#cfn-quicksight-topic-datasetmetadata-calculatedfields","DuplicatesAllowed":true,"ItemType":"TopicCalculatedField","Required":false,"Type":"List","UpdateType":"Mutable"},"Columns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-datasetmetadata.html#cfn-quicksight-topic-datasetmetadata-columns","DuplicatesAllowed":true,"ItemType":"TopicColumn","Required":false,"Type":"List","UpdateType":"Mutable"},"DataAggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-datasetmetadata.html#cfn-quicksight-topic-datasetmetadata-dataaggregation","Required":false,"Type":"DataAggregation","UpdateType":"Mutable"},"DatasetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-datasetmetadata.html#cfn-quicksight-topic-datasetmetadata-datasetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatasetDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-datasetmetadata.html#cfn-quicksight-topic-datasetmetadata-datasetdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatasetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-datasetmetadata.html#cfn-quicksight-topic-datasetmetadata-datasetname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-datasetmetadata.html#cfn-quicksight-topic-datasetmetadata-filters","DuplicatesAllowed":true,"ItemType":"TopicFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"NamedEntities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-datasetmetadata.html#cfn-quicksight-topic-datasetmetadata-namedentities","DuplicatesAllowed":true,"ItemType":"TopicNamedEntity","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.DefaultFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-defaultformatting.html","Properties":{"DisplayFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-defaultformatting.html#cfn-quicksight-topic-defaultformatting-displayformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayFormatOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-defaultformatting.html#cfn-quicksight-topic-defaultformatting-displayformatoptions","Required":false,"Type":"DisplayFormatOptions","UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.DisplayFormatOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html","Properties":{"BlankCellFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-blankcellformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CurrencySymbol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-currencysymbol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DateFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-dateformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DecimalSeparator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-decimalseparator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FractionDigits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-fractiondigits","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"GroupingSeparator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-groupingseparator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NegativeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-negativeformat","Required":false,"Type":"NegativeFormat","UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UnitScaler":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-unitscaler","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UseBlankCellFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-useblankcellformat","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UseGrouping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-displayformatoptions.html#cfn-quicksight-topic-displayformatoptions-usegrouping","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.NamedEntityDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-namedentitydefinition.html","Properties":{"FieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-namedentitydefinition.html#cfn-quicksight-topic-namedentitydefinition-fieldname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-namedentitydefinition.html#cfn-quicksight-topic-namedentitydefinition-metric","Required":false,"Type":"NamedEntityDefinitionMetric","UpdateType":"Mutable"},"PropertyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-namedentitydefinition.html#cfn-quicksight-topic-namedentitydefinition-propertyname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-namedentitydefinition.html#cfn-quicksight-topic-namedentitydefinition-propertyrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropertyUsage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-namedentitydefinition.html#cfn-quicksight-topic-namedentitydefinition-propertyusage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.NamedEntityDefinitionMetric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-namedentitydefinitionmetric.html","Properties":{"Aggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-namedentitydefinitionmetric.html#cfn-quicksight-topic-namedentitydefinitionmetric-aggregation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AggregationFunctionParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-namedentitydefinitionmetric.html#cfn-quicksight-topic-namedentitydefinitionmetric-aggregationfunctionparameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.NegativeFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-negativeformat.html","Properties":{"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-negativeformat.html#cfn-quicksight-topic-negativeformat-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Suffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-negativeformat.html#cfn-quicksight-topic-negativeformat-suffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.RangeConstant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-rangeconstant.html","Properties":{"Maximum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-rangeconstant.html#cfn-quicksight-topic-rangeconstant-maximum","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Minimum":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-rangeconstant.html#cfn-quicksight-topic-rangeconstant-minimum","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.SemanticEntityType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semanticentitytype.html","Properties":{"SubTypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semanticentitytype.html#cfn-quicksight-topic-semanticentitytype-subtypename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semanticentitytype.html#cfn-quicksight-topic-semanticentitytype-typename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TypeParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semanticentitytype.html#cfn-quicksight-topic-semanticentitytype-typeparameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.SemanticType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semantictype.html","Properties":{"FalseyCellValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semantictype.html#cfn-quicksight-topic-semantictype-falseycellvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FalseyCellValueSynonyms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semantictype.html#cfn-quicksight-topic-semantictype-falseycellvaluesynonyms","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubTypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semantictype.html#cfn-quicksight-topic-semantictype-subtypename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TruthyCellValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semantictype.html#cfn-quicksight-topic-semantictype-truthycellvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TruthyCellValueSynonyms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semantictype.html#cfn-quicksight-topic-semantictype-truthycellvaluesynonyms","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semantictype.html#cfn-quicksight-topic-semantictype-typename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TypeParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-semantictype.html#cfn-quicksight-topic-semantictype-typeparameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicCalculatedField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html","Properties":{"Aggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-aggregation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AllowedAggregations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-allowedaggregations","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CalculatedFieldDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-calculatedfielddescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CalculatedFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-calculatedfieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CalculatedFieldSynonyms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-calculatedfieldsynonyms","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CellValueSynonyms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-cellvaluesynonyms","DuplicatesAllowed":true,"ItemType":"CellValueSynonym","Required":false,"Type":"List","UpdateType":"Mutable"},"ColumnDataRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-columndatarole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ComparativeOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-comparativeorder","Required":false,"Type":"ComparativeOrder","UpdateType":"Mutable"},"DefaultFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-defaultformatting","Required":false,"Type":"DefaultFormatting","UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IsIncludedInTopic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-isincludedintopic","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NeverAggregateInFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-neveraggregateinfilter","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NotAllowedAggregations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-notallowedaggregations","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SemanticType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-semantictype","Required":false,"Type":"SemanticType","UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccalculatedfield.html#cfn-quicksight-topic-topiccalculatedfield-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicCategoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccategoryfilter.html","Properties":{"CategoryFilterFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccategoryfilter.html#cfn-quicksight-topic-topiccategoryfilter-categoryfilterfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CategoryFilterType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccategoryfilter.html#cfn-quicksight-topic-topiccategoryfilter-categoryfiltertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Constant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccategoryfilter.html#cfn-quicksight-topic-topiccategoryfilter-constant","Required":false,"Type":"TopicCategoryFilterConstant","UpdateType":"Mutable"},"Inverse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccategoryfilter.html#cfn-quicksight-topic-topiccategoryfilter-inverse","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicCategoryFilterConstant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccategoryfilterconstant.html","Properties":{"CollectiveConstant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccategoryfilterconstant.html#cfn-quicksight-topic-topiccategoryfilterconstant-collectiveconstant","Required":false,"Type":"CollectiveConstant","UpdateType":"Mutable"},"ConstantType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccategoryfilterconstant.html#cfn-quicksight-topic-topiccategoryfilterconstant-constanttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SingularConstant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccategoryfilterconstant.html#cfn-quicksight-topic-topiccategoryfilterconstant-singularconstant","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html","Properties":{"Aggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-aggregation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AllowedAggregations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-allowedaggregations","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CellValueSynonyms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-cellvaluesynonyms","DuplicatesAllowed":true,"ItemType":"CellValueSynonym","Required":false,"Type":"List","UpdateType":"Mutable"},"ColumnDataRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-columndatarole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColumnDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-columndescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColumnFriendlyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-columnfriendlyname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ColumnName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-columnname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ColumnSynonyms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-columnsynonyms","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ComparativeOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-comparativeorder","Required":false,"Type":"ComparativeOrder","UpdateType":"Mutable"},"DefaultFormatting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-defaultformatting","Required":false,"Type":"DefaultFormatting","UpdateType":"Mutable"},"IsIncludedInTopic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-isincludedintopic","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NeverAggregateInFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-neveraggregateinfilter","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NotAllowedAggregations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-notallowedaggregations","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SemanticType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-semantictype","Required":false,"Type":"SemanticType","UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topiccolumn.html#cfn-quicksight-topic-topiccolumn-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicDateRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicdaterangefilter.html","Properties":{"Constant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicdaterangefilter.html#cfn-quicksight-topic-topicdaterangefilter-constant","Required":false,"Type":"TopicRangeFilterConstant","UpdateType":"Mutable"},"Inclusive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicdaterangefilter.html#cfn-quicksight-topic-topicdaterangefilter-inclusive","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html","Properties":{"CategoryFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html#cfn-quicksight-topic-topicfilter-categoryfilter","Required":false,"Type":"TopicCategoryFilter","UpdateType":"Mutable"},"DateRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html#cfn-quicksight-topic-topicfilter-daterangefilter","Required":false,"Type":"TopicDateRangeFilter","UpdateType":"Mutable"},"FilterClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html#cfn-quicksight-topic-topicfilter-filterclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilterDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html#cfn-quicksight-topic-topicfilter-filterdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html#cfn-quicksight-topic-topicfilter-filtername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FilterSynonyms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html#cfn-quicksight-topic-topicfilter-filtersynonyms","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"FilterType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html#cfn-quicksight-topic-topicfilter-filtertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumericEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html#cfn-quicksight-topic-topicfilter-numericequalityfilter","Required":false,"Type":"TopicNumericEqualityFilter","UpdateType":"Mutable"},"NumericRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html#cfn-quicksight-topic-topicfilter-numericrangefilter","Required":false,"Type":"TopicNumericRangeFilter","UpdateType":"Mutable"},"OperandFieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html#cfn-quicksight-topic-topicfilter-operandfieldname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RelativeDateFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicfilter.html#cfn-quicksight-topic-topicfilter-relativedatefilter","Required":false,"Type":"TopicRelativeDateFilter","UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicNamedEntity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnamedentity.html","Properties":{"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnamedentity.html#cfn-quicksight-topic-topicnamedentity-definition","DuplicatesAllowed":true,"ItemType":"NamedEntityDefinition","Required":false,"Type":"List","UpdateType":"Mutable"},"EntityDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnamedentity.html#cfn-quicksight-topic-topicnamedentity-entitydescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EntityName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnamedentity.html#cfn-quicksight-topic-topicnamedentity-entityname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EntitySynonyms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnamedentity.html#cfn-quicksight-topic-topicnamedentity-entitysynonyms","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SemanticEntityType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnamedentity.html#cfn-quicksight-topic-topicnamedentity-semanticentitytype","Required":false,"Type":"SemanticEntityType","UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicNumericEqualityFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnumericequalityfilter.html","Properties":{"Aggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnumericequalityfilter.html#cfn-quicksight-topic-topicnumericequalityfilter-aggregation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Constant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnumericequalityfilter.html#cfn-quicksight-topic-topicnumericequalityfilter-constant","Required":false,"Type":"TopicSingularFilterConstant","UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicNumericRangeFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnumericrangefilter.html","Properties":{"Aggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnumericrangefilter.html#cfn-quicksight-topic-topicnumericrangefilter-aggregation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Constant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnumericrangefilter.html#cfn-quicksight-topic-topicnumericrangefilter-constant","Required":false,"Type":"TopicRangeFilterConstant","UpdateType":"Mutable"},"Inclusive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicnumericrangefilter.html#cfn-quicksight-topic-topicnumericrangefilter-inclusive","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicRangeFilterConstant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicrangefilterconstant.html","Properties":{"ConstantType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicrangefilterconstant.html#cfn-quicksight-topic-topicrangefilterconstant-constanttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RangeConstant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicrangefilterconstant.html#cfn-quicksight-topic-topicrangefilterconstant-rangeconstant","Required":false,"Type":"RangeConstant","UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicRelativeDateFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicrelativedatefilter.html","Properties":{"Constant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicrelativedatefilter.html#cfn-quicksight-topic-topicrelativedatefilter-constant","Required":false,"Type":"TopicSingularFilterConstant","UpdateType":"Mutable"},"RelativeDateFilterFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicrelativedatefilter.html#cfn-quicksight-topic-topicrelativedatefilter-relativedatefilterfunction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeGranularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicrelativedatefilter.html#cfn-quicksight-topic-topicrelativedatefilter-timegranularity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic.TopicSingularFilterConstant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicsingularfilterconstant.html","Properties":{"ConstantType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicsingularfilterconstant.html#cfn-quicksight-topic-topicsingularfilterconstant-constanttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SingularConstant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-topic-topicsingularfilterconstant.html#cfn-quicksight-topic-topicsingularfilterconstant-singularconstant","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::VPCConnection.NetworkInterface":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-vpcconnection-networkinterface.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-vpcconnection-networkinterface.html#cfn-quicksight-vpcconnection-networkinterface-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ErrorMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-vpcconnection-networkinterface.html#cfn-quicksight-vpcconnection-networkinterface-errormessage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-vpcconnection-networkinterface.html#cfn-quicksight-vpcconnection-networkinterface-networkinterfaceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-vpcconnection-networkinterface.html#cfn-quicksight-vpcconnection-networkinterface-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-quicksight-vpcconnection-networkinterface.html#cfn-quicksight-vpcconnection-networkinterface-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBCluster.DBClusterRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-dbclusterrole.html","Properties":{"FeatureName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-dbclusterrole.html#cfn-rds-dbcluster-dbclusterrole-featurename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-dbclusterrole.html#cfn-rds-dbcluster-dbclusterrole-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::RDS::DBCluster.Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-endpoint.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-endpoint.html#cfn-rds-dbcluster-endpoint-address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-endpoint.html#cfn-rds-dbcluster-endpoint-port","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBCluster.MasterUserSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-masterusersecret.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-masterusersecret.html#cfn-rds-dbcluster-masterusersecret-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-masterusersecret.html#cfn-rds-dbcluster-masterusersecret-secretarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBCluster.ReadEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-readendpoint.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-readendpoint.html#cfn-rds-dbcluster-readendpoint-address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBCluster.ScalingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-scalingconfiguration.html","Properties":{"AutoPause":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-scalingconfiguration.html#cfn-rds-dbcluster-scalingconfiguration-autopause","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-scalingconfiguration.html#cfn-rds-dbcluster-scalingconfiguration-maxcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-scalingconfiguration.html#cfn-rds-dbcluster-scalingconfiguration-mincapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SecondsBeforeTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-scalingconfiguration.html#cfn-rds-dbcluster-scalingconfiguration-secondsbeforetimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SecondsUntilAutoPause":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-scalingconfiguration.html#cfn-rds-dbcluster-scalingconfiguration-secondsuntilautopause","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TimeoutAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-scalingconfiguration.html#cfn-rds-dbcluster-scalingconfiguration-timeoutaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBCluster.ServerlessV2ScalingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-serverlessv2scalingconfiguration.html","Properties":{"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-serverlessv2scalingconfiguration.html#cfn-rds-dbcluster-serverlessv2scalingconfiguration-maxcapacity","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MinCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-serverlessv2scalingconfiguration.html#cfn-rds-dbcluster-serverlessv2scalingconfiguration-mincapacity","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBInstance.CertificateDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-certificatedetails.html","Properties":{"CAIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-certificatedetails.html#cfn-rds-dbinstance-certificatedetails-caidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValidTill":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-certificatedetails.html#cfn-rds-dbinstance-certificatedetails-validtill","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBInstance.DBInstanceRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-dbinstancerole.html","Properties":{"FeatureName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-dbinstancerole.html#cfn-rds-dbinstance-dbinstancerole-featurename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-dbinstancerole.html#cfn-rds-dbinstance-dbinstancerole-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::RDS::DBInstance.Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-endpoint.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-endpoint.html#cfn-rds-dbinstance-endpoint-address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostedZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-endpoint.html#cfn-rds-dbinstance-endpoint-hostedzoneid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-endpoint.html#cfn-rds-dbinstance-endpoint-port","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBInstance.MasterUserSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-masterusersecret.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-masterusersecret.html#cfn-rds-dbinstance-masterusersecret-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-masterusersecret.html#cfn-rds-dbinstance-masterusersecret-secretarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBInstance.ProcessorFeature":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-processorfeature.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-processorfeature.html#cfn-rds-dbinstance-processorfeature-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbinstance-processorfeature.html#cfn-rds-dbinstance-processorfeature-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBProxy.AuthFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxy-authformat.html","Properties":{"AuthScheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxy-authformat.html#cfn-rds-dbproxy-authformat-authscheme","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientPasswordAuthType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxy-authformat.html#cfn-rds-dbproxy-authformat-clientpasswordauthtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxy-authformat.html#cfn-rds-dbproxy-authformat-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IAMAuth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxy-authformat.html#cfn-rds-dbproxy-authformat-iamauth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxy-authformat.html#cfn-rds-dbproxy-authformat-secretarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBProxy.TagFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxy-tagformat.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxy-tagformat.html#cfn-rds-dbproxy-tagformat-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxy-tagformat.html#cfn-rds-dbproxy-tagformat-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBProxyEndpoint.TagFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxyendpoint-tagformat.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxyendpoint-tagformat.html#cfn-rds-dbproxyendpoint-tagformat-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxyendpoint-tagformat.html#cfn-rds-dbproxyendpoint-tagformat-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBProxyTargetGroup.ConnectionPoolConfigurationInfoFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxytargetgroup-connectionpoolconfigurationinfoformat.html","Properties":{"ConnectionBorrowTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxytargetgroup-connectionpoolconfigurationinfoformat.html#cfn-rds-dbproxytargetgroup-connectionpoolconfigurationinfoformat-connectionborrowtimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"InitQuery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxytargetgroup-connectionpoolconfigurationinfoformat.html#cfn-rds-dbproxytargetgroup-connectionpoolconfigurationinfoformat-initquery","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxConnectionsPercent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxytargetgroup-connectionpoolconfigurationinfoformat.html#cfn-rds-dbproxytargetgroup-connectionpoolconfigurationinfoformat-maxconnectionspercent","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxIdleConnectionsPercent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxytargetgroup-connectionpoolconfigurationinfoformat.html#cfn-rds-dbproxytargetgroup-connectionpoolconfigurationinfoformat-maxidleconnectionspercent","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SessionPinningFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbproxytargetgroup-connectionpoolconfigurationinfoformat.html#cfn-rds-dbproxytargetgroup-connectionpoolconfigurationinfoformat-sessionpinningfilters","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RDS::DBSecurityGroup.Ingress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-security-group-rule.html","Properties":{"CIDRIP":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-security-group-rule.html#cfn-rds-securitygroup-cidrip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EC2SecurityGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-security-group-rule.html#cfn-rds-securitygroup-ec2securitygroupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EC2SecurityGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-security-group-rule.html#cfn-rds-securitygroup-ec2securitygroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EC2SecurityGroupOwnerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-security-group-rule.html#cfn-rds-securitygroup-ec2securitygroupownerid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::RDS::OptionGroup.OptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-optiongroup-optionconfiguration.html","Properties":{"DBSecurityGroupMemberships":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-optiongroup-optionconfiguration.html#cfn-rds-optiongroup-optionconfiguration-dbsecuritygroupmemberships","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OptionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-optiongroup-optionconfiguration.html#cfn-rds-optiongroup-optionconfiguration-optionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OptionSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-optiongroup-optionconfiguration.html#cfn-rds-optiongroup-optionconfiguration-optionsettings","DuplicatesAllowed":true,"ItemType":"OptionSetting","Required":false,"Type":"List","UpdateType":"Mutable"},"OptionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-optiongroup-optionconfiguration.html#cfn-rds-optiongroup-optionconfiguration-optionversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-optiongroup-optionconfiguration.html#cfn-rds-optiongroup-optionconfiguration-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VpcSecurityGroupMemberships":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-optiongroup-optionconfiguration.html#cfn-rds-optiongroup-optionconfiguration-vpcsecuritygroupmemberships","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RDS::OptionGroup.OptionSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-optiongroup-optionsetting.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-optiongroup-optionsetting.html#cfn-rds-optiongroup-optionsetting-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-optiongroup-optionsetting.html#cfn-rds-optiongroup-optionsetting-value","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RUM::AppMonitor.AppMonitorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-appmonitorconfiguration.html","Properties":{"AllowCookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-appmonitorconfiguration.html#cfn-rum-appmonitor-appmonitorconfiguration-allowcookies","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableXRay":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-appmonitorconfiguration.html#cfn-rum-appmonitor-appmonitorconfiguration-enablexray","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExcludedPages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-appmonitorconfiguration.html#cfn-rum-appmonitor-appmonitorconfiguration-excludedpages","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"FavoritePages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-appmonitorconfiguration.html#cfn-rum-appmonitor-appmonitorconfiguration-favoritepages","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"GuestRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-appmonitorconfiguration.html#cfn-rum-appmonitor-appmonitorconfiguration-guestrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdentityPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-appmonitorconfiguration.html#cfn-rum-appmonitor-appmonitorconfiguration-identitypoolid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IncludedPages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-appmonitorconfiguration.html#cfn-rum-appmonitor-appmonitorconfiguration-includedpages","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricDestinations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-appmonitorconfiguration.html#cfn-rum-appmonitor-appmonitorconfiguration-metricdestinations","DuplicatesAllowed":false,"ItemType":"MetricDestination","Required":false,"Type":"List","UpdateType":"Mutable"},"SessionSampleRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-appmonitorconfiguration.html#cfn-rum-appmonitor-appmonitorconfiguration-sessionsamplerate","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Telemetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-appmonitorconfiguration.html#cfn-rum-appmonitor-appmonitorconfiguration-telemetries","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RUM::AppMonitor.CustomEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-customevents.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-customevents.html#cfn-rum-appmonitor-customevents-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RUM::AppMonitor.MetricDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdefinition.html","Properties":{"DimensionKeys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdefinition.html#cfn-rum-appmonitor-metricdefinition-dimensionkeys","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"EventPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdefinition.html#cfn-rum-appmonitor-metricdefinition-eventpattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdefinition.html#cfn-rum-appmonitor-metricdefinition-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdefinition.html#cfn-rum-appmonitor-metricdefinition-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UnitLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdefinition.html#cfn-rum-appmonitor-metricdefinition-unitlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ValueKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdefinition.html#cfn-rum-appmonitor-metricdefinition-valuekey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RUM::AppMonitor.MetricDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdestination.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdestination.html#cfn-rum-appmonitor-metricdestination-destination","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DestinationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdestination.html#cfn-rum-appmonitor-metricdestination-destinationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IamRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdestination.html#cfn-rum-appmonitor-metricdestination-iamrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricDefinitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rum-appmonitor-metricdestination.html#cfn-rum-appmonitor-metricdestination-metricdefinitions","DuplicatesAllowed":false,"ItemType":"MetricDefinition","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Redshift::Cluster.Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-cluster-endpoint.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-cluster-endpoint.html#cfn-redshift-cluster-endpoint-address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-cluster-endpoint.html#cfn-redshift-cluster-endpoint-port","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Redshift::Cluster.LoggingProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-cluster-loggingproperties.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-cluster-loggingproperties.html#cfn-redshift-cluster-loggingproperties-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-cluster-loggingproperties.html#cfn-redshift-cluster-loggingproperties-s3keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Redshift::ClusterParameterGroup.Parameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-clusterparametergroup-parameter.html","Properties":{"ParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-clusterparametergroup-parameter.html#cfn-redshift-clusterparametergroup-parameter-parametername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParameterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-clusterparametergroup-parameter.html#cfn-redshift-clusterparametergroup-parameter-parametervalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Redshift::EndpointAccess.NetworkInterface":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-networkinterface.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-networkinterface.html#cfn-redshift-endpointaccess-networkinterface-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-networkinterface.html#cfn-redshift-endpointaccess-networkinterface-networkinterfaceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-networkinterface.html#cfn-redshift-endpointaccess-networkinterface-privateipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-networkinterface.html#cfn-redshift-endpointaccess-networkinterface-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Redshift::EndpointAccess.VpcEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-vpcendpoint.html","Properties":{"NetworkInterfaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-vpcendpoint.html#cfn-redshift-endpointaccess-vpcendpoint-networkinterfaces","DuplicatesAllowed":true,"ItemType":"NetworkInterface","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-vpcendpoint.html#cfn-redshift-endpointaccess-vpcendpoint-vpcendpointid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-vpcendpoint.html#cfn-redshift-endpointaccess-vpcendpoint-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Redshift::EndpointAccess.VpcSecurityGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-vpcsecuritygroup.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-vpcsecuritygroup.html#cfn-redshift-endpointaccess-vpcsecuritygroup-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcSecurityGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-endpointaccess-vpcsecuritygroup.html#cfn-redshift-endpointaccess-vpcsecuritygroup-vpcsecuritygroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Redshift::ScheduledAction.PauseClusterMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-pauseclustermessage.html","Properties":{"ClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-pauseclustermessage.html#cfn-redshift-scheduledaction-pauseclustermessage-clusteridentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Redshift::ScheduledAction.ResizeClusterMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-resizeclustermessage.html","Properties":{"Classic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-resizeclustermessage.html#cfn-redshift-scheduledaction-resizeclustermessage-classic","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-resizeclustermessage.html#cfn-redshift-scheduledaction-resizeclustermessage-clusteridentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClusterType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-resizeclustermessage.html#cfn-redshift-scheduledaction-resizeclustermessage-clustertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NodeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-resizeclustermessage.html#cfn-redshift-scheduledaction-resizeclustermessage-nodetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumberOfNodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-resizeclustermessage.html#cfn-redshift-scheduledaction-resizeclustermessage-numberofnodes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Redshift::ScheduledAction.ResumeClusterMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-resumeclustermessage.html","Properties":{"ClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-resumeclustermessage.html#cfn-redshift-scheduledaction-resumeclustermessage-clusteridentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Redshift::ScheduledAction.ScheduledActionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-scheduledactiontype.html","Properties":{"PauseCluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-scheduledactiontype.html#cfn-redshift-scheduledaction-scheduledactiontype-pausecluster","Required":false,"Type":"PauseClusterMessage","UpdateType":"Mutable"},"ResizeCluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-scheduledactiontype.html#cfn-redshift-scheduledaction-scheduledactiontype-resizecluster","Required":false,"Type":"ResizeClusterMessage","UpdateType":"Mutable"},"ResumeCluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshift-scheduledaction-scheduledactiontype.html#cfn-redshift-scheduledaction-scheduledactiontype-resumecluster","Required":false,"Type":"ResumeClusterMessage","UpdateType":"Mutable"}}},"AWS::RedshiftServerless::Namespace.Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html","Properties":{"AdminUsername":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html#cfn-redshiftserverless-namespace-namespace-adminusername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreationDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html#cfn-redshiftserverless-namespace-namespace-creationdate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DbName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html#cfn-redshiftserverless-namespace-namespace-dbname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultIamRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html#cfn-redshiftserverless-namespace-namespace-defaultiamrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IamRoles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html#cfn-redshiftserverless-namespace-namespace-iamroles","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html#cfn-redshiftserverless-namespace-namespace-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogExports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html#cfn-redshiftserverless-namespace-namespace-logexports","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"NamespaceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html#cfn-redshiftserverless-namespace-namespace-namespacearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NamespaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html#cfn-redshiftserverless-namespace-namespace-namespaceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NamespaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html#cfn-redshiftserverless-namespace-namespace-namespacename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-namespace-namespace.html#cfn-redshiftserverless-namespace-namespace-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RedshiftServerless::Workgroup.ConfigParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-configparameter.html","Properties":{"ParameterKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-configparameter.html#cfn-redshiftserverless-workgroup-configparameter-parameterkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-configparameter.html#cfn-redshiftserverless-workgroup-configparameter-parametervalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RedshiftServerless::Workgroup.Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-endpoint.html","Properties":{"Address":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-endpoint.html#cfn-redshiftserverless-workgroup-endpoint-address","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-endpoint.html#cfn-redshiftserverless-workgroup-endpoint-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VpcEndpoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-endpoint.html#cfn-redshiftserverless-workgroup-endpoint-vpcendpoints","DuplicatesAllowed":true,"ItemType":"VpcEndpoint","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RedshiftServerless::Workgroup.NetworkInterface":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-networkinterface.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-networkinterface.html#cfn-redshiftserverless-workgroup-networkinterface-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-networkinterface.html#cfn-redshiftserverless-workgroup-networkinterface-networkinterfaceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-networkinterface.html#cfn-redshiftserverless-workgroup-networkinterface-privateipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-networkinterface.html#cfn-redshiftserverless-workgroup-networkinterface-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RedshiftServerless::Workgroup.VpcEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-vpcendpoint.html","Properties":{"NetworkInterfaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-vpcendpoint.html#cfn-redshiftserverless-workgroup-vpcendpoint-networkinterfaces","DuplicatesAllowed":true,"ItemType":"NetworkInterface","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-vpcendpoint.html#cfn-redshiftserverless-workgroup-vpcendpoint-vpcendpointid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-vpcendpoint.html#cfn-redshiftserverless-workgroup-vpcendpoint-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RedshiftServerless::Workgroup.Workgroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html","Properties":{"BaseCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-basecapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ConfigParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-configparameters","DuplicatesAllowed":false,"ItemType":"ConfigParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"CreationDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-creationdate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-endpoint","Required":false,"Type":"Endpoint","UpdateType":"Mutable"},"EnhancedVpcRouting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-enhancedvpcrouting","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NamespaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-namespacename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PubliclyAccessible":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-publiclyaccessible","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"WorkgroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-workgrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WorkgroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-workgroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WorkgroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-redshiftserverless-workgroup-workgroup.html#cfn-redshiftserverless-workgroup-workgroup-workgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RefactorSpaces::Application.ApiGatewayProxyInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-application-apigatewayproxyinput.html","Properties":{"EndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-application-apigatewayproxyinput.html#cfn-refactorspaces-application-apigatewayproxyinput-endpointtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-application-apigatewayproxyinput.html#cfn-refactorspaces-application-apigatewayproxyinput-stagename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::RefactorSpaces::Route.DefaultRouteInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-route-defaultrouteinput.html","Properties":{"ActivationState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-route-defaultrouteinput.html#cfn-refactorspaces-route-defaultrouteinput-activationstate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::RefactorSpaces::Route.UriPathRouteInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-route-uripathrouteinput.html","Properties":{"ActivationState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-route-uripathrouteinput.html#cfn-refactorspaces-route-uripathrouteinput-activationstate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AppendSourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-route-uripathrouteinput.html#cfn-refactorspaces-route-uripathrouteinput-appendsourcepath","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"IncludeChildPaths":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-route-uripathrouteinput.html#cfn-refactorspaces-route-uripathrouteinput-includechildpaths","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Methods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-route-uripathrouteinput.html#cfn-refactorspaces-route-uripathrouteinput-methods","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-route-uripathrouteinput.html#cfn-refactorspaces-route-uripathrouteinput-sourcepath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::RefactorSpaces::Service.LambdaEndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-service-lambdaendpointinput.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-service-lambdaendpointinput.html#cfn-refactorspaces-service-lambdaendpointinput-arn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::RefactorSpaces::Service.UrlEndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-service-urlendpointinput.html","Properties":{"HealthUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-service-urlendpointinput.html#cfn-refactorspaces-service-urlendpointinput-healthurl","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-refactorspaces-service-urlendpointinput.html#cfn-refactorspaces-service-urlendpointinput-url","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Rekognition::StreamProcessor.BoundingBox":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-boundingbox.html","Properties":{"Height":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-boundingbox.html#cfn-rekognition-streamprocessor-boundingbox-height","PrimitiveType":"Double","Required":true,"UpdateType":"Immutable"},"Left":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-boundingbox.html#cfn-rekognition-streamprocessor-boundingbox-left","PrimitiveType":"Double","Required":true,"UpdateType":"Immutable"},"Top":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-boundingbox.html#cfn-rekognition-streamprocessor-boundingbox-top","PrimitiveType":"Double","Required":true,"UpdateType":"Immutable"},"Width":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-boundingbox.html#cfn-rekognition-streamprocessor-boundingbox-width","PrimitiveType":"Double","Required":true,"UpdateType":"Immutable"}}},"AWS::Rekognition::StreamProcessor.ConnectedHomeSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-connectedhomesettings.html","Properties":{"Labels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-connectedhomesettings.html#cfn-rekognition-streamprocessor-connectedhomesettings-labels","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"MinConfidence":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-connectedhomesettings.html#cfn-rekognition-streamprocessor-connectedhomesettings-minconfidence","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::Rekognition::StreamProcessor.DataSharingPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-datasharingpreference.html","Properties":{"OptIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-datasharingpreference.html#cfn-rekognition-streamprocessor-datasharingpreference-optin","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"}}},"AWS::Rekognition::StreamProcessor.FaceSearchSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-facesearchsettings.html","Properties":{"CollectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-facesearchsettings.html#cfn-rekognition-streamprocessor-facesearchsettings-collectionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FaceMatchThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-facesearchsettings.html#cfn-rekognition-streamprocessor-facesearchsettings-facematchthreshold","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::Rekognition::StreamProcessor.KinesisDataStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-kinesisdatastream.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-kinesisdatastream.html#cfn-rekognition-streamprocessor-kinesisdatastream-arn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Rekognition::StreamProcessor.KinesisVideoStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-kinesisvideostream.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-kinesisvideostream.html#cfn-rekognition-streamprocessor-kinesisvideostream-arn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Rekognition::StreamProcessor.NotificationChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-notificationchannel.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-notificationchannel.html#cfn-rekognition-streamprocessor-notificationchannel-arn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Rekognition::StreamProcessor.S3Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-s3destination.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-s3destination.html#cfn-rekognition-streamprocessor-s3destination-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ObjectKeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rekognition-streamprocessor-s3destination.html#cfn-rekognition-streamprocessor-s3destination-objectkeyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ResilienceHub::App.PhysicalResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-physicalresourceid.html","Properties":{"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-physicalresourceid.html#cfn-resiliencehub-app-physicalresourceid-awsaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AwsRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-physicalresourceid.html#cfn-resiliencehub-app-physicalresourceid-awsregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Identifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-physicalresourceid.html#cfn-resiliencehub-app-physicalresourceid-identifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-physicalresourceid.html#cfn-resiliencehub-app-physicalresourceid-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ResilienceHub::App.ResourceMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-resourcemapping.html","Properties":{"EksSourceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-resourcemapping.html#cfn-resiliencehub-app-resourcemapping-ekssourcename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogicalStackName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-resourcemapping.html#cfn-resiliencehub-app-resourcemapping-logicalstackname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MappingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-resourcemapping.html#cfn-resiliencehub-app-resourcemapping-mappingtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PhysicalResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-resourcemapping.html#cfn-resiliencehub-app-resourcemapping-physicalresourceid","Required":true,"Type":"PhysicalResourceId","UpdateType":"Mutable"},"ResourceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-resourcemapping.html#cfn-resiliencehub-app-resourcemapping-resourcename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TerraformSourceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-app-resourcemapping.html#cfn-resiliencehub-app-resourcemapping-terraformsourcename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ResilienceHub::ResiliencyPolicy.FailurePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-resiliencypolicy-failurepolicy.html","Properties":{"RpoInSecs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-resiliencypolicy-failurepolicy.html#cfn-resiliencehub-resiliencypolicy-failurepolicy-rpoinsecs","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"RtoInSecs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resiliencehub-resiliencypolicy-failurepolicy.html#cfn-resiliencehub-resiliencypolicy-failurepolicy-rtoinsecs","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::ResourceExplorer2::View.Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourceexplorer2-view-filters.html","Properties":{"FilterString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourceexplorer2-view-filters.html#cfn-resourceexplorer2-view-filters-filterstring","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ResourceExplorer2::View.IncludedProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourceexplorer2-view-includedproperty.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourceexplorer2-view-includedproperty.html#cfn-resourceexplorer2-view-includedproperty-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ResourceGroups::Group.ConfigurationItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-configurationitem.html","Properties":{"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-configurationitem.html#cfn-resourcegroups-group-configurationitem-parameters","DuplicatesAllowed":true,"ItemType":"ConfigurationParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-configurationitem.html#cfn-resourcegroups-group-configurationitem-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ResourceGroups::Group.ConfigurationParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-configurationparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-configurationparameter.html#cfn-resourcegroups-group-configurationparameter-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-configurationparameter.html#cfn-resourcegroups-group-configurationparameter-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ResourceGroups::Group.Query":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-query.html","Properties":{"ResourceTypeFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-query.html#cfn-resourcegroups-group-query-resourcetypefilters","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"StackIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-query.html#cfn-resourcegroups-group-query-stackidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-query.html#cfn-resourcegroups-group-query-tagfilters","DuplicatesAllowed":true,"ItemType":"TagFilter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ResourceGroups::Group.ResourceQuery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-resourcequery.html","Properties":{"Query":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-resourcequery.html#cfn-resourcegroups-group-resourcequery-query","Required":false,"Type":"Query","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-resourcequery.html#cfn-resourcegroups-group-resourcequery-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ResourceGroups::Group.TagFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-tagfilter.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-tagfilter.html#cfn-resourcegroups-group-tagfilter-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resourcegroups-group-tagfilter.html#cfn-resourcegroups-group-tagfilter-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RoboMaker::RobotApplication.RobotSoftwareSuite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-robotapplication-robotsoftwaresuite.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-robotapplication-robotsoftwaresuite.html#cfn-robomaker-robotapplication-robotsoftwaresuite-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-robotapplication-robotsoftwaresuite.html#cfn-robomaker-robotapplication-robotsoftwaresuite-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RoboMaker::RobotApplication.SourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-robotapplication-sourceconfig.html","Properties":{"Architecture":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-robotapplication-sourceconfig.html#cfn-robomaker-robotapplication-sourceconfig-architecture","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-robotapplication-sourceconfig.html#cfn-robomaker-robotapplication-sourceconfig-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-robotapplication-sourceconfig.html#cfn-robomaker-robotapplication-sourceconfig-s3key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::RoboMaker::SimulationApplication.RenderingEngine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-renderingengine.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-renderingengine.html#cfn-robomaker-simulationapplication-renderingengine-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-renderingengine.html#cfn-robomaker-simulationapplication-renderingengine-version","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::RoboMaker::SimulationApplication.RobotSoftwareSuite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-robotsoftwaresuite.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-robotsoftwaresuite.html#cfn-robomaker-simulationapplication-robotsoftwaresuite-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-robotsoftwaresuite.html#cfn-robomaker-simulationapplication-robotsoftwaresuite-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RoboMaker::SimulationApplication.SimulationSoftwareSuite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-simulationsoftwaresuite.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-simulationsoftwaresuite.html#cfn-robomaker-simulationapplication-simulationsoftwaresuite-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-simulationsoftwaresuite.html#cfn-robomaker-simulationapplication-simulationsoftwaresuite-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RoboMaker::SimulationApplication.SourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-sourceconfig.html","Properties":{"Architecture":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-sourceconfig.html#cfn-robomaker-simulationapplication-sourceconfig-architecture","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-sourceconfig.html#cfn-robomaker-simulationapplication-sourceconfig-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-robomaker-simulationapplication-sourceconfig.html#cfn-robomaker-simulationapplication-sourceconfig-s3key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::RolesAnywhere::TrustAnchor.Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rolesanywhere-trustanchor-source.html","Properties":{"SourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rolesanywhere-trustanchor-source.html#cfn-rolesanywhere-trustanchor-source-sourcedata","Required":false,"Type":"SourceData","UpdateType":"Mutable"},"SourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rolesanywhere-trustanchor-source.html#cfn-rolesanywhere-trustanchor-source-sourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RolesAnywhere::TrustAnchor.SourceData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rolesanywhere-trustanchor-sourcedata.html","Properties":{"AcmPcaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rolesanywhere-trustanchor-sourcedata.html#cfn-rolesanywhere-trustanchor-sourcedata-acmpcaarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"X509CertificateData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rolesanywhere-trustanchor-sourcedata.html#cfn-rolesanywhere-trustanchor-sourcedata-x509certificatedata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Route53::CidrCollection.Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-cidrcollection-location.html","Properties":{"CidrList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-cidrcollection-location.html#cfn-route53-cidrcollection-location-cidrlist","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"LocationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-cidrcollection-location.html#cfn-route53-cidrcollection-location-locationname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53::HealthCheck.AlarmIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-alarmidentifier.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-alarmidentifier.html#cfn-route53-healthcheck-alarmidentifier-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-alarmidentifier.html#cfn-route53-healthcheck-alarmidentifier-region","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53::HealthCheck.HealthCheckConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html","Properties":{"AlarmIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-alarmidentifier","Required":false,"Type":"AlarmIdentifier","UpdateType":"Mutable"},"ChildHealthChecks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-childhealthchecks","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"EnableSNI":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-enablesni","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"FailureThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-failurethreshold","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FullyQualifiedDomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-fullyqualifieddomainname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HealthThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-healththreshold","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IPAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-ipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InsufficientDataHealthStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-insufficientdatahealthstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Inverted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-inverted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MeasureLatency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-measurelatency","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Regions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-regions","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RequestInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-requestinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ResourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-resourcepath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoutingControlArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-routingcontrolarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SearchString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-searchstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthcheckconfig.html#cfn-route53-healthcheck-healthcheckconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Route53::HealthCheck.HealthCheckTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthchecktag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthchecktag.html#cfn-route53-healthcheck-healthchecktag-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-healthcheck-healthchecktag.html#cfn-route53-healthcheck-healthchecktag-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53::HostedZone.HostedZoneConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-hostedzone-hostedzoneconfig.html","Properties":{"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-hostedzone-hostedzoneconfig.html#cfn-route53-hostedzone-hostedzoneconfig-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Route53::HostedZone.HostedZoneTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-hostedzone-hostedzonetag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-hostedzone-hostedzonetag.html#cfn-route53-hostedzone-hostedzonetag-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-hostedzone-hostedzonetag.html#cfn-route53-hostedzone-hostedzonetag-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53::HostedZone.QueryLoggingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-hostedzone-queryloggingconfig.html","Properties":{"CloudWatchLogsLogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-hostedzone-queryloggingconfig.html#cfn-route53-hostedzone-queryloggingconfig-cloudwatchlogsloggrouparn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53::HostedZone.VPC":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-hostedzone-vpc.html","Properties":{"VPCId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-hostedzone-vpc.html#cfn-route53-hostedzone-vpc-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VPCRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-hostedzone-vpc.html#cfn-route53-hostedzone-vpc-vpcregion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53::RecordSet.AliasTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html","Properties":{"DNSName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-dnshostname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EvaluateTargetHealth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-evaluatetargethealth","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HostedZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-hostedzoneid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53::RecordSet.CidrRoutingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-cidrroutingconfig.html","Properties":{"CollectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-cidrroutingconfig.html#cfn-route53-cidrroutingconfig-collectionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LocationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-cidrroutingconfig.html#cfn-route53-cidrroutingconfig-locationname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53::RecordSet.GeoLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset-geolocation.html","Properties":{"ContinentCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset-geolocation.html#cfn-route53-recordset-geolocation-continentcode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CountryCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset-geolocation.html#cfn-route53-recordset-geolocation-countrycode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubdivisionCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset-geolocation.html#cfn-route53-recordset-geolocation-subdivisioncode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Route53::RecordSetGroup.AliasTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html","Properties":{"DNSName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-dnshostname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EvaluateTargetHealth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-evaluatetargethealth","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HostedZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-hostedzoneid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53::RecordSetGroup.CidrRoutingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-cidrroutingconfig.html","Properties":{"CollectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-cidrroutingconfig.html#cfn-route53-cidrroutingconfig-collectionid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LocationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-cidrroutingconfig.html#cfn-route53-cidrroutingconfig-locationname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53::RecordSetGroup.GeoLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset-geolocation.html","Properties":{"ContinentCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset-geolocation.html#cfn-route53-recordsetgroup-geolocation-continentcode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CountryCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset-geolocation.html#cfn-route53-recordset-geolocation-countrycode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubdivisionCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset-geolocation.html#cfn-route53-recordset-geolocation-subdivisioncode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Route53::RecordSetGroup.RecordSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html","Properties":{"AliasTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-aliastarget","Required":false,"Type":"AliasTarget","UpdateType":"Mutable"},"CidrRoutingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-cidrroutingconfig","Required":false,"Type":"CidrRoutingConfig","UpdateType":"Mutable"},"Failover":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-failover","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GeoLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-geolocation","Required":false,"Type":"GeoLocation","UpdateType":"Mutable"},"HealthCheckId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-healthcheckid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostedZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-hostedzoneid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostedZoneName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-hostedzonename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MultiValueAnswer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-multivalueanswer","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-region","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceRecords":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-resourcerecords","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-setidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-ttl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Route53RecoveryControl::Cluster.ClusterEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-cluster-clusterendpoint.html","Properties":{"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-cluster-clusterendpoint.html#cfn-route53recoverycontrol-cluster-clusterendpoint-endpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-cluster-clusterendpoint.html#cfn-route53recoverycontrol-cluster-clusterendpoint-region","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Route53RecoveryControl::SafetyRule.AssertionRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-safetyrule-assertionrule.html","Properties":{"AssertedControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-safetyrule-assertionrule.html#cfn-route53recoverycontrol-safetyrule-assertionrule-assertedcontrols","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"WaitPeriodMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-safetyrule-assertionrule.html#cfn-route53recoverycontrol-safetyrule-assertionrule-waitperiodms","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53RecoveryControl::SafetyRule.GatingRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-safetyrule-gatingrule.html","Properties":{"GatingControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-safetyrule-gatingrule.html#cfn-route53recoverycontrol-safetyrule-gatingrule-gatingcontrols","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"TargetControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-safetyrule-gatingrule.html#cfn-route53recoverycontrol-safetyrule-gatingrule-targetcontrols","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"WaitPeriodMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-safetyrule-gatingrule.html#cfn-route53recoverycontrol-safetyrule-gatingrule-waitperiodms","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53RecoveryControl::SafetyRule.RuleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-safetyrule-ruleconfig.html","Properties":{"Inverted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-safetyrule-ruleconfig.html#cfn-route53recoverycontrol-safetyrule-ruleconfig-inverted","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-safetyrule-ruleconfig.html#cfn-route53recoverycontrol-safetyrule-ruleconfig-threshold","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoverycontrol-safetyrule-ruleconfig.html#cfn-route53recoverycontrol-safetyrule-ruleconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Route53RecoveryReadiness::ResourceSet.DNSTargetResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-dnstargetresource.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-dnstargetresource.html#cfn-route53recoveryreadiness-resourceset-dnstargetresource-domainname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostedZoneArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-dnstargetresource.html#cfn-route53recoveryreadiness-resourceset-dnstargetresource-hostedzonearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RecordSetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-dnstargetresource.html#cfn-route53recoveryreadiness-resourceset-dnstargetresource-recordsetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RecordType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-dnstargetresource.html#cfn-route53recoveryreadiness-resourceset-dnstargetresource-recordtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-dnstargetresource.html#cfn-route53recoveryreadiness-resourceset-dnstargetresource-targetresource","Required":false,"Type":"TargetResource","UpdateType":"Mutable"}}},"AWS::Route53RecoveryReadiness::ResourceSet.NLBResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-nlbresource.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-nlbresource.html#cfn-route53recoveryreadiness-resourceset-nlbresource-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Route53RecoveryReadiness::ResourceSet.R53ResourceRecord":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-r53resourcerecord.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-r53resourcerecord.html#cfn-route53recoveryreadiness-resourceset-r53resourcerecord-domainname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RecordSetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-r53resourcerecord.html#cfn-route53recoveryreadiness-resourceset-r53resourcerecord-recordsetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Route53RecoveryReadiness::ResourceSet.Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-resource.html","Properties":{"ComponentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-resource.html#cfn-route53recoveryreadiness-resourceset-resource-componentid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DnsTargetResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-resource.html#cfn-route53recoveryreadiness-resourceset-resource-dnstargetresource","Required":false,"Type":"DNSTargetResource","UpdateType":"Mutable"},"ReadinessScopes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-resource.html#cfn-route53recoveryreadiness-resourceset-resource-readinessscopes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-resource.html#cfn-route53recoveryreadiness-resourceset-resource-resourcearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Route53RecoveryReadiness::ResourceSet.TargetResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-targetresource.html","Properties":{"NLBResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-targetresource.html#cfn-route53recoveryreadiness-resourceset-targetresource-nlbresource","Required":false,"Type":"NLBResource","UpdateType":"Mutable"},"R53Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53recoveryreadiness-resourceset-targetresource.html#cfn-route53recoveryreadiness-resourceset-targetresource-r53resource","Required":false,"Type":"R53ResourceRecord","UpdateType":"Mutable"}}},"AWS::Route53Resolver::FirewallRuleGroup.FirewallRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-firewallrulegroup-firewallrule.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-firewallrulegroup-firewallrule.html#cfn-route53resolver-firewallrulegroup-firewallrule-action","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BlockOverrideDnsType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-firewallrulegroup-firewallrule.html#cfn-route53resolver-firewallrulegroup-firewallrule-blockoverridednstype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BlockOverrideDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-firewallrulegroup-firewallrule.html#cfn-route53resolver-firewallrulegroup-firewallrule-blockoverridedomain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BlockOverrideTtl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-firewallrulegroup-firewallrule.html#cfn-route53resolver-firewallrulegroup-firewallrule-blockoverridettl","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"BlockResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-firewallrulegroup-firewallrule.html#cfn-route53resolver-firewallrulegroup-firewallrule-blockresponse","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FirewallDomainListId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-firewallrulegroup-firewallrule.html#cfn-route53resolver-firewallrulegroup-firewallrule-firewalldomainlistid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-firewallrulegroup-firewallrule.html#cfn-route53resolver-firewallrulegroup-firewallrule-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53Resolver::ResolverEndpoint.IpAddressRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-resolverendpoint-ipaddressrequest.html","Properties":{"Ip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-resolverendpoint-ipaddressrequest.html#cfn-route53resolver-resolverendpoint-ipaddressrequest-ip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ipv6":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-resolverendpoint-ipaddressrequest.html#cfn-route53resolver-resolverendpoint-ipaddressrequest-ipv6","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-resolverendpoint-ipaddressrequest.html#cfn-route53resolver-resolverendpoint-ipaddressrequest-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53Resolver::ResolverRule.TargetAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-resolverrule-targetaddress.html","Properties":{"Ip":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-resolverrule-targetaddress.html#cfn-route53resolver-resolverrule-targetaddress-ip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ipv6":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-resolverrule-targetaddress.html#cfn-route53resolver-resolverrule-targetaddress-ipv6","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53resolver-resolverrule-targetaddress.html#cfn-route53resolver-resolverrule-targetaddress-port","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::AccessPoint.PublicAccessBlockConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-accesspoint-publicaccessblockconfiguration.html","Properties":{"BlockPublicAcls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-accesspoint-publicaccessblockconfiguration.html#cfn-s3-accesspoint-publicaccessblockconfiguration-blockpublicacls","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"BlockPublicPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-accesspoint-publicaccessblockconfiguration.html#cfn-s3-accesspoint-publicaccessblockconfiguration-blockpublicpolicy","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IgnorePublicAcls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-accesspoint-publicaccessblockconfiguration.html#cfn-s3-accesspoint-publicaccessblockconfiguration-ignorepublicacls","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RestrictPublicBuckets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-accesspoint-publicaccessblockconfiguration.html#cfn-s3-accesspoint-publicaccessblockconfiguration-restrictpublicbuckets","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::AccessPoint.VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-accesspoint-vpcconfiguration.html","Properties":{"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-accesspoint-vpcconfiguration.html#cfn-s3-accesspoint-vpcconfiguration-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::S3::Bucket.AbortIncompleteMultipartUpload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-abortincompletemultipartupload.html","Properties":{"DaysAfterInitiation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-abortincompletemultipartupload.html#cfn-s3-bucket-abortincompletemultipartupload-daysafterinitiation","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.AccelerateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-accelerateconfiguration.html","Properties":{"AccelerationStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-accelerateconfiguration.html#cfn-s3-bucket-accelerateconfiguration-accelerationstatus","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.AccessControlTranslation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-accesscontroltranslation.html","Properties":{"Owner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-accesscontroltranslation.html#cfn-s3-bucket-accesscontroltranslation-owner","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.AnalyticsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-analyticsconfiguration.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-analyticsconfiguration.html#cfn-s3-bucket-analyticsconfiguration-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-analyticsconfiguration.html#cfn-s3-bucket-analyticsconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StorageClassAnalysis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-analyticsconfiguration.html#cfn-s3-bucket-analyticsconfiguration-storageclassanalysis","Required":true,"Type":"StorageClassAnalysis","UpdateType":"Mutable"},"TagFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-analyticsconfiguration.html#cfn-s3-bucket-analyticsconfiguration-tagfilters","DuplicatesAllowed":false,"ItemType":"TagFilter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.BucketEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-bucketencryption.html","Properties":{"ServerSideEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-bucketencryption.html#cfn-s3-bucket-bucketencryption-serversideencryptionconfiguration","DuplicatesAllowed":false,"ItemType":"ServerSideEncryptionRule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.CorsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors.html","Properties":{"CorsRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors.html#cfn-s3-bucket-cors-corsrule","DuplicatesAllowed":false,"ItemType":"CorsRule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.CorsRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html","Properties":{"AllowedHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-allowedheaders","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AllowedMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-allowedmethods","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"AllowedOrigins":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-allowedorigins","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"ExposedHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-exposedheaders","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxAge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-cors-corsrule.html#cfn-s3-bucket-cors-corsrule-maxage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.DataExport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-dataexport.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-dataexport.html#cfn-s3-bucket-dataexport-destination","Required":true,"Type":"Destination","UpdateType":"Mutable"},"OutputSchemaVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-dataexport.html#cfn-s3-bucket-dataexport-outputschemaversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.DefaultRetention":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-defaultretention.html","Properties":{"Days":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-defaultretention.html#cfn-s3-bucket-defaultretention-days","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-defaultretention.html#cfn-s3-bucket-defaultretention-mode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Years":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-defaultretention.html#cfn-s3-bucket-defaultretention-years","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.DeleteMarkerReplication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-deletemarkerreplication.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-deletemarkerreplication.html#cfn-s3-bucket-deletemarkerreplication-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-destination.html","Properties":{"BucketAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-destination.html#cfn-s3-bucket-destination-bucketaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BucketArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-destination.html#cfn-s3-bucket-destination-bucketarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-destination.html#cfn-s3-bucket-destination-format","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-destination.html#cfn-s3-bucket-destination-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-encryptionconfiguration.html","Properties":{"ReplicaKmsKeyID":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-encryptionconfiguration.html#cfn-s3-bucket-encryptionconfiguration-replicakmskeyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.EventBridgeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-eventbridgeconfig.html","Properties":{"EventBridgeEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-eventbridgeconfig.html#cfn-s3-bucket-eventbridgeconfiguration-eventbridgeenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.FilterRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key-rules.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key-rules.html#cfn-s3-bucket-notificationconfiguraiton-config-filter-s3key-rules-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key-rules.html#cfn-s3-bucket-notificationconfiguraiton-config-filter-s3key-rules-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.IntelligentTieringConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html#cfn-s3-bucket-intelligenttieringconfiguration-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html#cfn-s3-bucket-intelligenttieringconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html#cfn-s3-bucket-intelligenttieringconfiguration-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TagFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html#cfn-s3-bucket-intelligenttieringconfiguration-tagfilters","DuplicatesAllowed":false,"ItemType":"TagFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Tierings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-intelligenttieringconfiguration.html#cfn-s3-bucket-intelligenttieringconfiguration-tierings","DuplicatesAllowed":false,"ItemType":"Tiering","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.InventoryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-destination","Required":true,"Type":"Destination","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncludedObjectVersions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-includedobjectversions","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OptionalFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-optionalfields","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduleFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-inventoryconfiguration.html#cfn-s3-bucket-inventoryconfiguration-schedulefrequency","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.LambdaConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-lambdaconfig.html","Properties":{"Event":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-lambdaconfig.html#cfn-s3-bucket-notificationconfig-lambdaconfig-event","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-lambdaconfig.html#cfn-s3-bucket-notificationconfig-lambdaconfig-filter","Required":false,"Type":"NotificationFilter","UpdateType":"Mutable"},"Function":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-lambdaconfig.html#cfn-s3-bucket-notificationconfig-lambdaconfig-function","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.LifecycleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig.html","Properties":{"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig.html#cfn-s3-bucket-lifecycleconfig-rules","DuplicatesAllowed":false,"ItemType":"Rule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.LoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-loggingconfig.html","Properties":{"DestinationBucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-loggingconfig.html#cfn-s3-bucket-loggingconfig-destinationbucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogFilePrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-loggingconfig.html#cfn-s3-bucket-loggingconfig-logfileprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.Metrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metrics.html","Properties":{"EventThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metrics.html#cfn-s3-bucket-metrics-eventthreshold","Required":false,"Type":"ReplicationTimeValue","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metrics.html#cfn-s3-bucket-metrics-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.MetricsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metricsconfiguration.html","Properties":{"AccessPointArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metricsconfiguration.html#cfn-s3-bucket-metricsconfiguration-accesspointarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metricsconfiguration.html#cfn-s3-bucket-metricsconfiguration-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metricsconfiguration.html#cfn-s3-bucket-metricsconfiguration-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-metricsconfiguration.html#cfn-s3-bucket-metricsconfiguration-tagfilters","DuplicatesAllowed":false,"ItemType":"TagFilter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.NoncurrentVersionExpiration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-noncurrentversionexpiration.html","Properties":{"NewerNoncurrentVersions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-noncurrentversionexpiration.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversionexpiration-newernoncurrentversions","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NoncurrentDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-noncurrentversionexpiration.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversionexpiration-noncurrentdays","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.NoncurrentVersionTransition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition.html","Properties":{"NewerNoncurrentVersions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition-newernoncurrentversions","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StorageClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition-storageclass","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TransitionInDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition-transitionindays","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.NotificationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig.html","Properties":{"EventBridgeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig.html#cfn-s3-bucket-notificationconfig-eventbridgeconfig","Required":false,"Type":"EventBridgeConfiguration","UpdateType":"Mutable"},"LambdaConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig.html#cfn-s3-bucket-notificationconfig-lambdaconfig","DuplicatesAllowed":false,"ItemType":"LambdaConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"QueueConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig.html#cfn-s3-bucket-notificationconfig-queueconfig","DuplicatesAllowed":false,"ItemType":"QueueConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"TopicConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig.html#cfn-s3-bucket-notificationconfig-topicconfig","DuplicatesAllowed":false,"ItemType":"TopicConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.NotificationFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter.html","Properties":{"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter.html#cfn-s3-bucket-notificationconfiguraiton-config-filter-s3key","Required":true,"Type":"S3KeyFilter","UpdateType":"Mutable"}}},"AWS::S3::Bucket.ObjectLockConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-objectlockconfiguration.html","Properties":{"ObjectLockEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-objectlockconfiguration.html#cfn-s3-bucket-objectlockconfiguration-objectlockenabled","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-objectlockconfiguration.html#cfn-s3-bucket-objectlockconfiguration-rule","Required":false,"Type":"ObjectLockRule","UpdateType":"Mutable"}}},"AWS::S3::Bucket.ObjectLockRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-objectlockrule.html","Properties":{"DefaultRetention":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-objectlockrule.html#cfn-s3-bucket-objectlockrule-defaultretention","Required":false,"Type":"DefaultRetention","UpdateType":"Mutable"}}},"AWS::S3::Bucket.OwnershipControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ownershipcontrols.html","Properties":{"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ownershipcontrols.html#cfn-s3-bucket-ownershipcontrols-rules","DuplicatesAllowed":false,"ItemType":"OwnershipControlsRule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.OwnershipControlsRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ownershipcontrolsrule.html","Properties":{"ObjectOwnership":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ownershipcontrolsrule.html#cfn-s3-bucket-ownershipcontrolsrule-objectownership","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.PublicAccessBlockConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html","Properties":{"BlockPublicAcls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html#cfn-s3-bucket-publicaccessblockconfiguration-blockpublicacls","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"BlockPublicPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html#cfn-s3-bucket-publicaccessblockconfiguration-blockpublicpolicy","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IgnorePublicAcls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html#cfn-s3-bucket-publicaccessblockconfiguration-ignorepublicacls","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RestrictPublicBuckets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html#cfn-s3-bucket-publicaccessblockconfiguration-restrictpublicbuckets","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.QueueConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-queueconfig.html","Properties":{"Event":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-queueconfig.html#cfn-s3-bucket-notificationconfig-queueconfig-event","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-queueconfig.html#cfn-s3-bucket-notificationconfig-queueconfig-filter","Required":false,"Type":"NotificationFilter","UpdateType":"Mutable"},"Queue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-queueconfig.html#cfn-s3-bucket-notificationconfig-queueconfig-queue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.RedirectAllRequestsTo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-redirectallrequeststo.html","Properties":{"HostName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-redirectallrequeststo.html#cfn-s3-websiteconfiguration-redirectallrequeststo-hostname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-redirectallrequeststo.html#cfn-s3-websiteconfiguration-redirectallrequeststo-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.RedirectRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html","Properties":{"HostName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html#cfn-s3-websiteconfiguration-redirectrule-hostname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HttpRedirectCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html#cfn-s3-websiteconfiguration-redirectrule-httpredirectcode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html#cfn-s3-websiteconfiguration-redirectrule-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReplaceKeyPrefixWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html#cfn-s3-websiteconfiguration-redirectrule-replacekeyprefixwith","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReplaceKeyWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-redirectrule.html#cfn-s3-websiteconfiguration-redirectrule-replacekeywith","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.ReplicaModifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicamodifications.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicamodifications.html#cfn-s3-bucket-replicamodifications-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.ReplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration.html","Properties":{"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration.html#cfn-s3-bucket-replicationconfiguration-role","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration.html#cfn-s3-bucket-replicationconfiguration-rules","DuplicatesAllowed":false,"ItemType":"ReplicationRule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.ReplicationDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html","Properties":{"AccessControlTranslation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationdestination-accesscontroltranslation","Required":false,"Type":"AccessControlTranslation","UpdateType":"Mutable"},"Account":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationdestination-account","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationconfiguration-rules-destination-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationdestination-encryptionconfiguration","Required":false,"Type":"EncryptionConfiguration","UpdateType":"Mutable"},"Metrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationdestination-metrics","Required":false,"Type":"Metrics","UpdateType":"Mutable"},"ReplicationTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationdestination-replicationtime","Required":false,"Type":"ReplicationTime","UpdateType":"Mutable"},"StorageClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules-destination.html#cfn-s3-bucket-replicationconfiguration-rules-destination-storageclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.ReplicationRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html","Properties":{"DeleteMarkerReplication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationrule-deletemarkerreplication","Required":false,"Type":"DeleteMarkerReplication","UpdateType":"Mutable"},"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationconfiguration-rules-destination","Required":true,"Type":"ReplicationDestination","UpdateType":"Mutable"},"Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationrule-filter","Required":false,"Type":"ReplicationRuleFilter","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationconfiguration-rules-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationconfiguration-rules-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationrule-priority","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SourceSelectionCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationrule-sourceselectioncriteria","Required":false,"Type":"SourceSelectionCriteria","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationconfiguration-rules.html#cfn-s3-bucket-replicationconfiguration-rules-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.ReplicationRuleAndOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationruleandoperator.html","Properties":{"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationruleandoperator.html#cfn-s3-bucket-replicationruleandoperator-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationruleandoperator.html#cfn-s3-bucket-replicationruleandoperator-tagfilters","DuplicatesAllowed":false,"ItemType":"TagFilter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.ReplicationRuleFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationrulefilter.html","Properties":{"And":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationrulefilter.html#cfn-s3-bucket-replicationrulefilter-and","Required":false,"Type":"ReplicationRuleAndOperator","UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationrulefilter.html#cfn-s3-bucket-replicationrulefilter-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TagFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationrulefilter.html#cfn-s3-bucket-replicationrulefilter-tagfilter","Required":false,"Type":"TagFilter","UpdateType":"Mutable"}}},"AWS::S3::Bucket.ReplicationTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationtime.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationtime.html#cfn-s3-bucket-replicationtime-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Time":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationtime.html#cfn-s3-bucket-replicationtime-time","Required":true,"Type":"ReplicationTimeValue","UpdateType":"Mutable"}}},"AWS::S3::Bucket.ReplicationTimeValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationtimevalue.html","Properties":{"Minutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-replicationtimevalue.html#cfn-s3-bucket-replicationtimevalue-minutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.RoutingRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules.html","Properties":{"RedirectRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules.html#cfn-s3-websiteconfiguration-routingrules-redirectrule","Required":true,"Type":"RedirectRule","UpdateType":"Mutable"},"RoutingRuleCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules.html#cfn-s3-websiteconfiguration-routingrules-routingrulecondition","Required":false,"Type":"RoutingRuleCondition","UpdateType":"Mutable"}}},"AWS::S3::Bucket.RoutingRuleCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-routingrulecondition.html","Properties":{"HttpErrorCodeReturnedEquals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-routingrulecondition.html#cfn-s3-websiteconfiguration-routingrules-routingrulecondition-httperrorcodereturnedequals","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyPrefixEquals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration-routingrules-routingrulecondition.html#cfn-s3-websiteconfiguration-routingrules-routingrulecondition-keyprefixequals","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html","Properties":{"AbortIncompleteMultipartUpload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-rule-abortincompletemultipartupload","Required":false,"Type":"AbortIncompleteMultipartUpload","UpdateType":"Mutable"},"ExpirationDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-expirationdate","PrimitiveType":"Timestamp","Required":false,"UpdateType":"Mutable"},"ExpirationInDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-expirationindays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ExpiredObjectDeleteMarker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-rule-expiredobjectdeletemarker","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NoncurrentVersionExpiration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversionexpiration","Required":false,"Type":"NoncurrentVersionExpiration","UpdateType":"Mutable"},"NoncurrentVersionExpirationInDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversionexpirationindays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NoncurrentVersionTransition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversiontransition","Required":false,"Type":"NoncurrentVersionTransition","UpdateType":"Mutable"},"NoncurrentVersionTransitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-noncurrentversiontransitions","DuplicatesAllowed":false,"ItemType":"NoncurrentVersionTransition","Required":false,"Type":"List","UpdateType":"Mutable"},"ObjectSizeGreaterThan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-objectsizegreaterthan","PrimitiveType":"Long","Required":false,"UpdateType":"Mutable"},"ObjectSizeLessThan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-objectsizelessthan","PrimitiveType":"Long","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TagFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-rule-tagfilters","DuplicatesAllowed":false,"ItemType":"TagFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Transition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-transition","Required":false,"Type":"Transition","UpdateType":"Mutable"},"Transitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule.html#cfn-s3-bucket-lifecycleconfig-rule-transitions","DuplicatesAllowed":false,"ItemType":"Transition","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.S3KeyFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key.html","Properties":{"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key.html#cfn-s3-bucket-notificationconfiguraiton-config-filter-s3key-rules","DuplicatesAllowed":false,"ItemType":"FilterRule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::Bucket.ServerSideEncryptionByDefault":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionbydefault.html","Properties":{"KMSMasterKeyID":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionbydefault.html#cfn-s3-bucket-serversideencryptionbydefault-kmsmasterkeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SSEAlgorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionbydefault.html#cfn-s3-bucket-serversideencryptionbydefault-ssealgorithm","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.ServerSideEncryptionRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html","Properties":{"BucketKeyEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html#cfn-s3-bucket-serversideencryptionrule-bucketkeyenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ServerSideEncryptionByDefault":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html#cfn-s3-bucket-serversideencryptionrule-serversideencryptionbydefault","Required":false,"Type":"ServerSideEncryptionByDefault","UpdateType":"Mutable"}}},"AWS::S3::Bucket.SourceSelectionCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-sourceselectioncriteria.html","Properties":{"ReplicaModifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-sourceselectioncriteria.html#cfn-s3-bucket-sourceselectioncriteria-replicamodifications","Required":false,"Type":"ReplicaModifications","UpdateType":"Mutable"},"SseKmsEncryptedObjects":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-sourceselectioncriteria.html#cfn-s3-bucket-sourceselectioncriteria-ssekmsencryptedobjects","Required":false,"Type":"SseKmsEncryptedObjects","UpdateType":"Mutable"}}},"AWS::S3::Bucket.SseKmsEncryptedObjects":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ssekmsencryptedobjects.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-ssekmsencryptedobjects.html#cfn-s3-bucket-ssekmsencryptedobjects-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.StorageClassAnalysis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-storageclassanalysis.html","Properties":{"DataExport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-storageclassanalysis.html#cfn-s3-bucket-storageclassanalysis-dataexport","Required":false,"Type":"DataExport","UpdateType":"Mutable"}}},"AWS::S3::Bucket.TagFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tagfilter.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tagfilter.html#cfn-s3-bucket-tagfilter-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tagfilter.html#cfn-s3-bucket-tagfilter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.Tiering":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tiering.html","Properties":{"AccessTier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tiering.html#cfn-s3-bucket-tiering-accesstier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Days":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-tiering.html#cfn-s3-bucket-tiering-days","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.TopicConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-topicconfig.html","Properties":{"Event":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-topicconfig.html#cfn-s3-bucket-notificationconfig-topicconfig-event","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-topicconfig.html#cfn-s3-bucket-notificationconfig-topicconfig-filter","Required":false,"Type":"NotificationFilter","UpdateType":"Mutable"},"Topic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig-topicconfig.html#cfn-s3-bucket-notificationconfig-topicconfig-topic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.Transition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-transition.html","Properties":{"StorageClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-transition.html#cfn-s3-bucket-lifecycleconfig-rule-transition-storageclass","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TransitionDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-transition.html#cfn-s3-bucket-lifecycleconfig-rule-transition-transitiondate","PrimitiveType":"Timestamp","Required":false,"UpdateType":"Mutable"},"TransitionInDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-lifecycleconfig-rule-transition.html#cfn-s3-bucket-lifecycleconfig-rule-transition-transitionindays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.VersioningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-versioningconfig.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-versioningconfig.html#cfn-s3-bucket-versioningconfig-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::Bucket.WebsiteConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration.html","Properties":{"ErrorDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration.html#cfn-s3-websiteconfiguration-errordocument","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration.html#cfn-s3-websiteconfiguration-indexdocument","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RedirectAllRequestsTo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration.html#cfn-s3-websiteconfiguration-redirectallrequeststo","Required":false,"Type":"RedirectAllRequestsTo","UpdateType":"Mutable"},"RoutingRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-websiteconfiguration.html#cfn-s3-websiteconfiguration-routingrules","DuplicatesAllowed":false,"ItemType":"RoutingRule","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::MultiRegionAccessPoint.PublicAccessBlockConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspoint-publicaccessblockconfiguration.html","Properties":{"BlockPublicAcls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspoint-publicaccessblockconfiguration.html#cfn-s3-multiregionaccesspoint-publicaccessblockconfiguration-blockpublicacls","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"BlockPublicPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspoint-publicaccessblockconfiguration.html#cfn-s3-multiregionaccesspoint-publicaccessblockconfiguration-blockpublicpolicy","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"IgnorePublicAcls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspoint-publicaccessblockconfiguration.html#cfn-s3-multiregionaccesspoint-publicaccessblockconfiguration-ignorepublicacls","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"RestrictPublicBuckets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspoint-publicaccessblockconfiguration.html#cfn-s3-multiregionaccesspoint-publicaccessblockconfiguration-restrictpublicbuckets","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::S3::MultiRegionAccessPoint.Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspoint-region.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspoint-region.html#cfn-s3-multiregionaccesspoint-region-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BucketAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspoint-region.html#cfn-s3-multiregionaccesspoint-region-bucketaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::S3::MultiRegionAccessPointPolicy.PolicyStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspointpolicy-policystatus.html","Properties":{"IsPublic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-multiregionaccesspointpolicy-policystatus.html#cfn-s3-multiregionaccesspointpolicy-policystatus-ispublic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::StorageLens.AccountLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-accountlevel.html","Properties":{"ActivityMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-accountlevel.html#cfn-s3-storagelens-accountlevel-activitymetrics","Required":false,"Type":"ActivityMetrics","UpdateType":"Mutable"},"AdvancedCostOptimizationMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-accountlevel.html#cfn-s3-storagelens-accountlevel-advancedcostoptimizationmetrics","Required":false,"Type":"AdvancedCostOptimizationMetrics","UpdateType":"Mutable"},"AdvancedDataProtectionMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-accountlevel.html#cfn-s3-storagelens-accountlevel-advanceddataprotectionmetrics","Required":false,"Type":"AdvancedDataProtectionMetrics","UpdateType":"Mutable"},"BucketLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-accountlevel.html#cfn-s3-storagelens-accountlevel-bucketlevel","Required":true,"Type":"BucketLevel","UpdateType":"Mutable"},"DetailedStatusCodesMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-accountlevel.html#cfn-s3-storagelens-accountlevel-detailedstatuscodesmetrics","Required":false,"Type":"DetailedStatusCodesMetrics","UpdateType":"Mutable"}}},"AWS::S3::StorageLens.ActivityMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-activitymetrics.html","Properties":{"IsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-activitymetrics.html#cfn-s3-storagelens-activitymetrics-isenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::StorageLens.AdvancedCostOptimizationMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-advancedcostoptimizationmetrics.html","Properties":{"IsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-advancedcostoptimizationmetrics.html#cfn-s3-storagelens-advancedcostoptimizationmetrics-isenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::StorageLens.AdvancedDataProtectionMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-advanceddataprotectionmetrics.html","Properties":{"IsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-advanceddataprotectionmetrics.html#cfn-s3-storagelens-advanceddataprotectionmetrics-isenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::StorageLens.AwsOrg":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-awsorg.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-awsorg.html#cfn-s3-storagelens-awsorg-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::StorageLens.BucketLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-bucketlevel.html","Properties":{"ActivityMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-bucketlevel.html#cfn-s3-storagelens-bucketlevel-activitymetrics","Required":false,"Type":"ActivityMetrics","UpdateType":"Mutable"},"AdvancedCostOptimizationMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-bucketlevel.html#cfn-s3-storagelens-bucketlevel-advancedcostoptimizationmetrics","Required":false,"Type":"AdvancedCostOptimizationMetrics","UpdateType":"Mutable"},"AdvancedDataProtectionMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-bucketlevel.html#cfn-s3-storagelens-bucketlevel-advanceddataprotectionmetrics","Required":false,"Type":"AdvancedDataProtectionMetrics","UpdateType":"Mutable"},"DetailedStatusCodesMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-bucketlevel.html#cfn-s3-storagelens-bucketlevel-detailedstatuscodesmetrics","Required":false,"Type":"DetailedStatusCodesMetrics","UpdateType":"Mutable"},"PrefixLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-bucketlevel.html#cfn-s3-storagelens-bucketlevel-prefixlevel","Required":false,"Type":"PrefixLevel","UpdateType":"Mutable"}}},"AWS::S3::StorageLens.BucketsAndRegions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-bucketsandregions.html","Properties":{"Buckets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-bucketsandregions.html#cfn-s3-storagelens-bucketsandregions-buckets","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Regions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-bucketsandregions.html#cfn-s3-storagelens-bucketsandregions-regions","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3::StorageLens.CloudWatchMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-cloudwatchmetrics.html","Properties":{"IsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-cloudwatchmetrics.html#cfn-s3-storagelens-cloudwatchmetrics-isenabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::StorageLens.DataExport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-dataexport.html","Properties":{"CloudWatchMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-dataexport.html#cfn-s3-storagelens-dataexport-cloudwatchmetrics","Required":false,"Type":"CloudWatchMetrics","UpdateType":"Mutable"},"S3BucketDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-dataexport.html#cfn-s3-storagelens-dataexport-s3bucketdestination","Required":false,"Type":"S3BucketDestination","UpdateType":"Mutable"}}},"AWS::S3::StorageLens.DetailedStatusCodesMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-detailedstatuscodesmetrics.html","Properties":{"IsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-detailedstatuscodesmetrics.html#cfn-s3-storagelens-detailedstatuscodesmetrics-isenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::StorageLens.Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-encryption.html","Properties":{"SSEKMS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-encryption.html#cfn-s3-storagelens-encryption-ssekms","Required":false,"Type":"SSEKMS","UpdateType":"Mutable"},"SSES3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-encryption.html#cfn-s3-storagelens-encryption-sses3","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::StorageLens.PrefixLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-prefixlevel.html","Properties":{"StorageMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-prefixlevel.html#cfn-s3-storagelens-prefixlevel-storagemetrics","Required":true,"Type":"PrefixLevelStorageMetrics","UpdateType":"Mutable"}}},"AWS::S3::StorageLens.PrefixLevelStorageMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-prefixlevelstoragemetrics.html","Properties":{"IsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-prefixlevelstoragemetrics.html#cfn-s3-storagelens-prefixlevelstoragemetrics-isenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SelectionCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-prefixlevelstoragemetrics.html#cfn-s3-storagelens-prefixlevelstoragemetrics-selectioncriteria","Required":false,"Type":"SelectionCriteria","UpdateType":"Mutable"}}},"AWS::S3::StorageLens.S3BucketDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-s3bucketdestination.html","Properties":{"AccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-s3bucketdestination.html#cfn-s3-storagelens-s3bucketdestination-accountid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-s3bucketdestination.html#cfn-s3-storagelens-s3bucketdestination-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-s3bucketdestination.html#cfn-s3-storagelens-s3bucketdestination-encryption","Required":false,"Type":"Encryption","UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-s3bucketdestination.html#cfn-s3-storagelens-s3bucketdestination-format","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OutputSchemaVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-s3bucketdestination.html#cfn-s3-storagelens-s3bucketdestination-outputschemaversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-s3bucketdestination.html#cfn-s3-storagelens-s3bucketdestination-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::StorageLens.SSEKMS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-ssekms.html","Properties":{"KeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-ssekms.html#cfn-s3-storagelens-ssekms-keyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3::StorageLens.SelectionCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-selectioncriteria.html","Properties":{"Delimiter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-selectioncriteria.html#cfn-s3-storagelens-selectioncriteria-delimiter","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxDepth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-selectioncriteria.html#cfn-s3-storagelens-selectioncriteria-maxdepth","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinStorageBytesPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-selectioncriteria.html#cfn-s3-storagelens-selectioncriteria-minstoragebytespercentage","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::S3::StorageLens.StorageLensConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-storagelensconfiguration.html","Properties":{"AccountLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-storagelensconfiguration.html#cfn-s3-storagelens-storagelensconfiguration-accountlevel","Required":true,"Type":"AccountLevel","UpdateType":"Mutable"},"AwsOrg":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-storagelensconfiguration.html#cfn-s3-storagelens-storagelensconfiguration-awsorg","Required":false,"Type":"AwsOrg","UpdateType":"Mutable"},"DataExport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-storagelensconfiguration.html#cfn-s3-storagelens-storagelensconfiguration-dataexport","Required":false,"Type":"DataExport","UpdateType":"Mutable"},"Exclude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-storagelensconfiguration.html#cfn-s3-storagelens-storagelensconfiguration-exclude","Required":false,"Type":"BucketsAndRegions","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-storagelensconfiguration.html#cfn-s3-storagelens-storagelensconfiguration-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Include":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-storagelensconfiguration.html#cfn-s3-storagelens-storagelensconfiguration-include","Required":false,"Type":"BucketsAndRegions","UpdateType":"Mutable"},"IsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-storagelensconfiguration.html#cfn-s3-storagelens-storagelensconfiguration-isenabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"StorageLensArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-storagelens-storagelensconfiguration.html#cfn-s3-storagelens-storagelensconfiguration-storagelensarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3ObjectLambda::AccessPoint.Alias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-alias.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-alias.html#cfn-s3objectlambda-accesspoint-alias-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-alias.html#cfn-s3objectlambda-accesspoint-alias-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3ObjectLambda::AccessPoint.AwsLambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-awslambda.html","Properties":{"FunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-awslambda.html#cfn-s3objectlambda-accesspoint-awslambda-functionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FunctionPayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-awslambda.html#cfn-s3objectlambda-accesspoint-awslambda-functionpayload","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3ObjectLambda::AccessPoint.ContentTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-contenttransformation.html","Properties":{"AwsLambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-contenttransformation.html#cfn-s3objectlambda-accesspoint-contenttransformation-awslambda","Required":true,"Type":"AwsLambda","UpdateType":"Mutable"}}},"AWS::S3ObjectLambda::AccessPoint.ObjectLambdaConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-objectlambdaconfiguration.html","Properties":{"AllowedFeatures":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-objectlambdaconfiguration.html#cfn-s3objectlambda-accesspoint-objectlambdaconfiguration-allowedfeatures","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CloudWatchMetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-objectlambdaconfiguration.html#cfn-s3objectlambda-accesspoint-objectlambdaconfiguration-cloudwatchmetricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SupportingAccessPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-objectlambdaconfiguration.html#cfn-s3objectlambda-accesspoint-objectlambdaconfiguration-supportingaccesspoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TransformationConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-objectlambdaconfiguration.html#cfn-s3objectlambda-accesspoint-objectlambdaconfiguration-transformationconfigurations","DuplicatesAllowed":false,"ItemType":"TransformationConfiguration","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3ObjectLambda::AccessPoint.PolicyStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-policystatus.html","Properties":{"IsPublic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-policystatus.html#cfn-s3objectlambda-accesspoint-policystatus-ispublic","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::S3ObjectLambda::AccessPoint.PublicAccessBlockConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-publicaccessblockconfiguration.html","Properties":{"BlockPublicAcls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-publicaccessblockconfiguration.html#cfn-s3objectlambda-accesspoint-publicaccessblockconfiguration-blockpublicacls","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"BlockPublicPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-publicaccessblockconfiguration.html#cfn-s3objectlambda-accesspoint-publicaccessblockconfiguration-blockpublicpolicy","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IgnorePublicAcls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-publicaccessblockconfiguration.html#cfn-s3objectlambda-accesspoint-publicaccessblockconfiguration-ignorepublicacls","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RestrictPublicBuckets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-publicaccessblockconfiguration.html#cfn-s3objectlambda-accesspoint-publicaccessblockconfiguration-restrictpublicbuckets","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::S3ObjectLambda::AccessPoint.TransformationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-transformationconfiguration.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-transformationconfiguration.html#cfn-s3objectlambda-accesspoint-transformationconfiguration-actions","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"ContentTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3objectlambda-accesspoint-transformationconfiguration.html#cfn-s3objectlambda-accesspoint-transformationconfiguration-contenttransformation","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"}}},"AWS::S3Outposts::AccessPoint.VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-accesspoint-vpcconfiguration.html","Properties":{"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-accesspoint-vpcconfiguration.html#cfn-s3outposts-accesspoint-vpcconfiguration-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::S3Outposts::Bucket.AbortIncompleteMultipartUpload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-abortincompletemultipartupload.html","Properties":{"DaysAfterInitiation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-abortincompletemultipartupload.html#cfn-s3outposts-bucket-abortincompletemultipartupload-daysafterinitiation","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::S3Outposts::Bucket.Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-filter.html","Properties":{"AndOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-filter.html#cfn-s3outposts-bucket-filter-andoperator","Required":false,"Type":"FilterAndOperator","UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-filter.html#cfn-s3outposts-bucket-filter-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-filter.html#cfn-s3outposts-bucket-filter-tag","Required":false,"Type":"FilterTag","UpdateType":"Mutable"}}},"AWS::S3Outposts::Bucket.FilterAndOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-filterandoperator.html","Properties":{"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-filterandoperator.html#cfn-s3outposts-bucket-filterandoperator-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-filterandoperator.html#cfn-s3outposts-bucket-filterandoperator-tags","DuplicatesAllowed":false,"ItemType":"FilterTag","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3Outposts::Bucket.FilterTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-filtertag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-filtertag.html#cfn-s3outposts-bucket-filtertag-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-filtertag.html#cfn-s3outposts-bucket-filtertag-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3Outposts::Bucket.LifecycleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-lifecycleconfiguration.html","Properties":{"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-lifecycleconfiguration.html#cfn-s3outposts-bucket-lifecycleconfiguration-rules","DuplicatesAllowed":false,"ItemType":"Rule","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3Outposts::Bucket.Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-rule.html","Properties":{"AbortIncompleteMultipartUpload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-rule.html#cfn-s3outposts-bucket-rule-abortincompletemultipartupload","Required":false,"Type":"AbortIncompleteMultipartUpload","UpdateType":"Mutable"},"ExpirationDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-rule.html#cfn-s3outposts-bucket-rule-expirationdate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExpirationInDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-rule.html#cfn-s3outposts-bucket-rule-expirationindays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-rule.html#cfn-s3outposts-bucket-rule-filter","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-rule.html#cfn-s3outposts-bucket-rule-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-bucket-rule.html#cfn-s3outposts-bucket-rule-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::S3Outposts::Endpoint.FailedReason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-endpoint-failedreason.html","Properties":{"ErrorCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-endpoint-failedreason.html#cfn-s3outposts-endpoint-failedreason-errorcode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-endpoint-failedreason.html#cfn-s3outposts-endpoint-failedreason-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::S3Outposts::Endpoint.NetworkInterface":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-endpoint-networkinterface.html","Properties":{"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3outposts-endpoint-networkinterface.html#cfn-s3outposts-endpoint-networkinterface-networkinterfaceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSet.DashboardOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-dashboardoptions.html","Properties":{"EngagementMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-dashboardoptions.html#cfn-ses-configurationset-dashboardoptions-engagementmetrics","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSet.DeliveryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-deliveryoptions.html","Properties":{"SendingPoolName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-deliveryoptions.html#cfn-ses-configurationset-deliveryoptions-sendingpoolname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TlsPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-deliveryoptions.html#cfn-ses-configurationset-deliveryoptions-tlspolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSet.GuardianOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-guardianoptions.html","Properties":{"OptimizedSharedDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-guardianoptions.html#cfn-ses-configurationset-guardianoptions-optimizedshareddelivery","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSet.ReputationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-reputationoptions.html","Properties":{"ReputationMetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-reputationoptions.html#cfn-ses-configurationset-reputationoptions-reputationmetricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSet.SendingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-sendingoptions.html","Properties":{"SendingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-sendingoptions.html#cfn-ses-configurationset-sendingoptions-sendingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSet.SuppressionOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-suppressionoptions.html","Properties":{"SuppressedReasons":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-suppressionoptions.html#cfn-ses-configurationset-suppressionoptions-suppressedreasons","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSet.TrackingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-trackingoptions.html","Properties":{"CustomRedirectDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-trackingoptions.html#cfn-ses-configurationset-trackingoptions-customredirectdomain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSet.VdmOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-vdmoptions.html","Properties":{"DashboardOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-vdmoptions.html#cfn-ses-configurationset-vdmoptions-dashboardoptions","Required":false,"Type":"DashboardOptions","UpdateType":"Mutable"},"GuardianOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationset-vdmoptions.html#cfn-ses-configurationset-vdmoptions-guardianoptions","Required":false,"Type":"GuardianOptions","UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSetEventDestination.CloudWatchDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-cloudwatchdestination.html","Properties":{"DimensionConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-cloudwatchdestination.html#cfn-ses-configurationseteventdestination-cloudwatchdestination-dimensionconfigurations","DuplicatesAllowed":true,"ItemType":"DimensionConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSetEventDestination.DimensionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-dimensionconfiguration.html","Properties":{"DefaultDimensionValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-dimensionconfiguration.html#cfn-ses-configurationseteventdestination-dimensionconfiguration-defaultdimensionvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DimensionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-dimensionconfiguration.html#cfn-ses-configurationseteventdestination-dimensionconfiguration-dimensionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DimensionValueSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-dimensionconfiguration.html#cfn-ses-configurationseteventdestination-dimensionconfiguration-dimensionvaluesource","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSetEventDestination.EventDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-eventdestination.html","Properties":{"CloudWatchDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-eventdestination.html#cfn-ses-configurationseteventdestination-eventdestination-cloudwatchdestination","Required":false,"Type":"CloudWatchDestination","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-eventdestination.html#cfn-ses-configurationseteventdestination-eventdestination-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"KinesisFirehoseDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-eventdestination.html#cfn-ses-configurationseteventdestination-eventdestination-kinesisfirehosedestination","Required":false,"Type":"KinesisFirehoseDestination","UpdateType":"Mutable"},"MatchingEventTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-eventdestination.html#cfn-ses-configurationseteventdestination-eventdestination-matchingeventtypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-eventdestination.html#cfn-ses-configurationseteventdestination-eventdestination-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnsDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-eventdestination.html#cfn-ses-configurationseteventdestination-eventdestination-snsdestination","Required":false,"Type":"SnsDestination","UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSetEventDestination.KinesisFirehoseDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-kinesisfirehosedestination.html","Properties":{"DeliveryStreamARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-kinesisfirehosedestination.html#cfn-ses-configurationseteventdestination-kinesisfirehosedestination-deliverystreamarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IAMRoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-kinesisfirehosedestination.html#cfn-ses-configurationseteventdestination-kinesisfirehosedestination-iamrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSetEventDestination.SnsDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-snsdestination.html","Properties":{"TopicARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-configurationseteventdestination-snsdestination.html#cfn-ses-configurationseteventdestination-snsdestination-topicarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SES::ContactList.Topic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-contactlist-topic.html","Properties":{"DefaultSubscriptionStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-contactlist-topic.html#cfn-ses-contactlist-topic-defaultsubscriptionstatus","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-contactlist-topic.html#cfn-ses-contactlist-topic-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-contactlist-topic.html#cfn-ses-contactlist-topic-displayname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TopicName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-contactlist-topic.html#cfn-ses-contactlist-topic-topicname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SES::EmailIdentity.ConfigurationSetAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-configurationsetattributes.html","Properties":{"ConfigurationSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-configurationsetattributes.html#cfn-ses-emailidentity-configurationsetattributes-configurationsetname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::EmailIdentity.DkimAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-dkimattributes.html","Properties":{"SigningEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-dkimattributes.html#cfn-ses-emailidentity-dkimattributes-signingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::EmailIdentity.DkimSigningAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-dkimsigningattributes.html","Properties":{"DomainSigningPrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-dkimsigningattributes.html#cfn-ses-emailidentity-dkimsigningattributes-domainsigningprivatekey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainSigningSelector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-dkimsigningattributes.html#cfn-ses-emailidentity-dkimsigningattributes-domainsigningselector","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NextSigningKeyLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-dkimsigningattributes.html#cfn-ses-emailidentity-dkimsigningattributes-nextsigningkeylength","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::EmailIdentity.FeedbackAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-feedbackattributes.html","Properties":{"EmailForwardingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-feedbackattributes.html#cfn-ses-emailidentity-feedbackattributes-emailforwardingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::EmailIdentity.MailFromAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-mailfromattributes.html","Properties":{"BehaviorOnMxFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-mailfromattributes.html#cfn-ses-emailidentity-mailfromattributes-behavioronmxfailure","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MailFromDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-emailidentity-mailfromattributes.html#cfn-ses-emailidentity-mailfromattributes-mailfromdomain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ReceiptFilter.Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptfilter-filter.html","Properties":{"IpFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptfilter-filter.html#cfn-ses-receiptfilter-filter-ipfilter","Required":true,"Type":"IpFilter","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptfilter-filter.html#cfn-ses-receiptfilter-filter-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ReceiptFilter.IpFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptfilter-ipfilter.html","Properties":{"Cidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptfilter-ipfilter.html#cfn-ses-receiptfilter-ipfilter-cidr","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptfilter-ipfilter.html#cfn-ses-receiptfilter-ipfilter-policy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SES::ReceiptRule.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-action.html","Properties":{"AddHeaderAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-action.html#cfn-ses-receiptrule-action-addheaderaction","Required":false,"Type":"AddHeaderAction","UpdateType":"Mutable"},"BounceAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-action.html#cfn-ses-receiptrule-action-bounceaction","Required":false,"Type":"BounceAction","UpdateType":"Mutable"},"LambdaAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-action.html#cfn-ses-receiptrule-action-lambdaaction","Required":false,"Type":"LambdaAction","UpdateType":"Mutable"},"S3Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-action.html#cfn-ses-receiptrule-action-s3action","Required":false,"Type":"S3Action","UpdateType":"Mutable"},"SNSAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-action.html#cfn-ses-receiptrule-action-snsaction","Required":false,"Type":"SNSAction","UpdateType":"Mutable"},"StopAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-action.html#cfn-ses-receiptrule-action-stopaction","Required":false,"Type":"StopAction","UpdateType":"Mutable"},"WorkmailAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-action.html#cfn-ses-receiptrule-action-workmailaction","Required":false,"Type":"WorkmailAction","UpdateType":"Mutable"}}},"AWS::SES::ReceiptRule.AddHeaderAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-addheaderaction.html","Properties":{"HeaderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-addheaderaction.html#cfn-ses-receiptrule-addheaderaction-headername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HeaderValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-addheaderaction.html#cfn-ses-receiptrule-addheaderaction-headervalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SES::ReceiptRule.BounceAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-bounceaction.html","Properties":{"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-bounceaction.html#cfn-ses-receiptrule-bounceaction-message","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Sender":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-bounceaction.html#cfn-ses-receiptrule-bounceaction-sender","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SmtpReplyCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-bounceaction.html#cfn-ses-receiptrule-bounceaction-smtpreplycode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-bounceaction.html#cfn-ses-receiptrule-bounceaction-statuscode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-bounceaction.html#cfn-ses-receiptrule-bounceaction-topicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ReceiptRule.LambdaAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-lambdaaction.html","Properties":{"FunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-lambdaaction.html#cfn-ses-receiptrule-lambdaaction-functionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InvocationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-lambdaaction.html#cfn-ses-receiptrule-lambdaaction-invocationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-lambdaaction.html#cfn-ses-receiptrule-lambdaaction-topicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ReceiptRule.Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-rule.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-rule.html#cfn-ses-receiptrule-rule-actions","ItemType":"Action","Required":false,"Type":"List","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-rule.html#cfn-ses-receiptrule-rule-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-rule.html#cfn-ses-receiptrule-rule-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Recipients":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-rule.html#cfn-ses-receiptrule-rule-recipients","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ScanEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-rule.html#cfn-ses-receiptrule-rule-scanenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TlsPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-rule.html#cfn-ses-receiptrule-rule-tlspolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ReceiptRule.S3Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-s3action.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-s3action.html#cfn-ses-receiptrule-s3action-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-s3action.html#cfn-ses-receiptrule-s3action-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ObjectKeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-s3action.html#cfn-ses-receiptrule-s3action-objectkeyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-s3action.html#cfn-ses-receiptrule-s3action-topicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ReceiptRule.SNSAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-snsaction.html","Properties":{"Encoding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-snsaction.html#cfn-ses-receiptrule-snsaction-encoding","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-snsaction.html#cfn-ses-receiptrule-snsaction-topicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ReceiptRule.StopAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-stopaction.html","Properties":{"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-stopaction.html#cfn-ses-receiptrule-stopaction-scope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-stopaction.html#cfn-ses-receiptrule-stopaction-topicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ReceiptRule.WorkmailAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-workmailaction.html","Properties":{"OrganizationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-workmailaction.html#cfn-ses-receiptrule-workmailaction-organizationarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-receiptrule-workmailaction.html#cfn-ses-receiptrule-workmailaction-topicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::Template.Template":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-template-template.html","Properties":{"HtmlPart":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-template-template.html#cfn-ses-template-template-htmlpart","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubjectPart":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-template-template.html#cfn-ses-template-template-subjectpart","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-template-template.html#cfn-ses-template-template-templatename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TextPart":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-template-template.html#cfn-ses-template-template-textpart","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::VdmAttributes.DashboardAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-vdmattributes-dashboardattributes.html","Properties":{"EngagementMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-vdmattributes-dashboardattributes.html#cfn-ses-vdmattributes-dashboardattributes-engagementmetrics","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::VdmAttributes.GuardianAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-vdmattributes-guardianattributes.html","Properties":{"OptimizedSharedDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ses-vdmattributes-guardianattributes.html#cfn-ses-vdmattributes-guardianattributes-optimizedshareddelivery","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SNS::Topic.Subscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic-subscription.html","Properties":{"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic-subscription.html#cfn-sns-topic-subscription-endpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic-subscription.html#cfn-sns-topic-subscription-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSM::Association.InstanceAssociationOutputLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-association-instanceassociationoutputlocation.html","Properties":{"S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-association-instanceassociationoutputlocation.html#cfn-ssm-association-instanceassociationoutputlocation-s3location","Required":false,"Type":"S3OutputLocation","UpdateType":"Mutable"}}},"AWS::SSM::Association.S3OutputLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-association-s3outputlocation.html","Properties":{"OutputS3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-association-s3outputlocation.html#cfn-ssm-association-s3outputlocation-outputs3bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutputS3KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-association-s3outputlocation.html#cfn-ssm-association-s3outputlocation-outputs3keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutputS3Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-association-s3outputlocation.html#cfn-ssm-association-s3outputlocation-outputs3region","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSM::Association.Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-association-target.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-association-target.html#cfn-ssm-association-target-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-association-target.html#cfn-ssm-association-target-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSM::Document.AttachmentsSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-document-attachmentssource.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-document-attachmentssource.html#cfn-ssm-document-attachmentssource-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-document-attachmentssource.html#cfn-ssm-document-attachmentssource-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-document-attachmentssource.html#cfn-ssm-document-attachmentssource-values","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSM::Document.DocumentRequires":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-document-documentrequires.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-document-documentrequires.html#cfn-ssm-document-documentrequires-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-document-documentrequires.html#cfn-ssm-document-documentrequires-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindowTarget.Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtarget-targets.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtarget-targets.html#cfn-ssm-maintenancewindowtarget-targets-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtarget-targets.html#cfn-ssm-maintenancewindowtarget-targets-values","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindowTask.CloudWatchOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-cloudwatchoutputconfig.html","Properties":{"CloudWatchLogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-cloudwatchoutputconfig.html#cfn-ssm-maintenancewindowtask-cloudwatchoutputconfig-cloudwatchloggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CloudWatchOutputEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-cloudwatchoutputconfig.html#cfn-ssm-maintenancewindowtask-cloudwatchoutputconfig-cloudwatchoutputenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindowTask.LoggingInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-logginginfo.html","Properties":{"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-logginginfo.html#cfn-ssm-maintenancewindowtask-logginginfo-region","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-logginginfo.html#cfn-ssm-maintenancewindowtask-logginginfo-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-logginginfo.html#cfn-ssm-maintenancewindowtask-logginginfo-s3prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindowTask.MaintenanceWindowAutomationParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowautomationparameters.html","Properties":{"DocumentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowautomationparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowautomationparameters-documentversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowautomationparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowautomationparameters-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindowTask.MaintenanceWindowLambdaParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowlambdaparameters.html","Properties":{"ClientContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowlambdaparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowlambdaparameters-clientcontext","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Payload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowlambdaparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowlambdaparameters-payload","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Qualifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowlambdaparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowlambdaparameters-qualifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindowTask.MaintenanceWindowRunCommandParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html","Properties":{"CloudWatchOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowruncommandparameters-cloudwatchoutputconfig","Required":false,"Type":"CloudWatchOutputConfig","UpdateType":"Mutable"},"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowruncommandparameters-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentHash":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowruncommandparameters-documenthash","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentHashType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowruncommandparameters-documenthashtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowruncommandparameters-documentversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NotificationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowruncommandparameters-notificationconfig","Required":false,"Type":"NotificationConfig","UpdateType":"Mutable"},"OutputS3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowruncommandparameters-outputs3bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutputS3KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowruncommandparameters-outputs3keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowruncommandparameters-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ServiceRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowruncommandparameters-servicerolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeoutSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowruncommandparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowruncommandparameters-timeoutseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindowTask.MaintenanceWindowStepFunctionsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowstepfunctionsparameters.html","Properties":{"Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowstepfunctionsparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowstepfunctionsparameters-input","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-maintenancewindowstepfunctionsparameters.html#cfn-ssm-maintenancewindowtask-maintenancewindowstepfunctionsparameters-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindowTask.NotificationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-notificationconfig.html","Properties":{"NotificationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-notificationconfig.html#cfn-ssm-maintenancewindowtask-notificationconfig-notificationarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NotificationEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-notificationconfig.html#cfn-ssm-maintenancewindowtask-notificationconfig-notificationevents","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"NotificationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-notificationconfig.html#cfn-ssm-maintenancewindowtask-notificationconfig-notificationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindowTask.Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-target.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-target.html#cfn-ssm-maintenancewindowtask-target-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-target.html#cfn-ssm-maintenancewindowtask-target-values","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindowTask.TaskInvocationParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-taskinvocationparameters.html","Properties":{"MaintenanceWindowAutomationParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-taskinvocationparameters.html#cfn-ssm-maintenancewindowtask-taskinvocationparameters-maintenancewindowautomationparameters","Required":false,"Type":"MaintenanceWindowAutomationParameters","UpdateType":"Mutable"},"MaintenanceWindowLambdaParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-taskinvocationparameters.html#cfn-ssm-maintenancewindowtask-taskinvocationparameters-maintenancewindowlambdaparameters","Required":false,"Type":"MaintenanceWindowLambdaParameters","UpdateType":"Mutable"},"MaintenanceWindowRunCommandParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-taskinvocationparameters.html#cfn-ssm-maintenancewindowtask-taskinvocationparameters-maintenancewindowruncommandparameters","Required":false,"Type":"MaintenanceWindowRunCommandParameters","UpdateType":"Mutable"},"MaintenanceWindowStepFunctionsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-maintenancewindowtask-taskinvocationparameters.html#cfn-ssm-maintenancewindowtask-taskinvocationparameters-maintenancewindowstepfunctionsparameters","Required":false,"Type":"MaintenanceWindowStepFunctionsParameters","UpdateType":"Mutable"}}},"AWS::SSM::PatchBaseline.PatchFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-patchfilter.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-patchfilter.html#cfn-ssm-patchbaseline-patchfilter-key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-patchfilter.html#cfn-ssm-patchbaseline-patchfilter-values","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSM::PatchBaseline.PatchFilterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-patchfiltergroup.html","Properties":{"PatchFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-patchfiltergroup.html#cfn-ssm-patchbaseline-patchfiltergroup-patchfilters","ItemType":"PatchFilter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSM::PatchBaseline.PatchSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-patchsource.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-patchsource.html#cfn-ssm-patchbaseline-patchsource-configuration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-patchsource.html#cfn-ssm-patchbaseline-patchsource-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Products":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-patchsource.html#cfn-ssm-patchbaseline-patchsource-products","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSM::PatchBaseline.PatchStringDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-patchstringdate.html","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AWS::SSM::PatchBaseline.Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-rule.html","Properties":{"ApproveAfterDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-rule.html#cfn-ssm-patchbaseline-rule-approveafterdays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ApproveUntilDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-rule.html#cfn-ssm-patchbaseline-rule-approveuntildate","Required":false,"Type":"PatchStringDate","UpdateType":"Mutable"},"ComplianceLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-rule.html#cfn-ssm-patchbaseline-rule-compliancelevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableNonSecurity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-rule.html#cfn-ssm-patchbaseline-rule-enablenonsecurity","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PatchFilterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-rule.html#cfn-ssm-patchbaseline-rule-patchfiltergroup","Required":false,"Type":"PatchFilterGroup","UpdateType":"Mutable"}}},"AWS::SSM::PatchBaseline.RuleGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-rulegroup.html","Properties":{"PatchRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-patchbaseline-rulegroup.html#cfn-ssm-patchbaseline-rulegroup-patchrules","ItemType":"Rule","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSM::ResourceDataSync.AwsOrganizationsSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-awsorganizationssource.html","Properties":{"OrganizationSourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-awsorganizationssource.html#cfn-ssm-resourcedatasync-awsorganizationssource-organizationsourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OrganizationalUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-awsorganizationssource.html#cfn-ssm-resourcedatasync-awsorganizationssource-organizationalunits","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSM::ResourceDataSync.S3Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-s3destination.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-s3destination.html#cfn-ssm-resourcedatasync-s3destination-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-s3destination.html#cfn-ssm-resourcedatasync-s3destination-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BucketRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-s3destination.html#cfn-ssm-resourcedatasync-s3destination-bucketregion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KMSKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-s3destination.html#cfn-ssm-resourcedatasync-s3destination-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SyncFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-s3destination.html#cfn-ssm-resourcedatasync-s3destination-syncformat","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SSM::ResourceDataSync.SyncSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-syncsource.html","Properties":{"AwsOrganizationsSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-syncsource.html#cfn-ssm-resourcedatasync-syncsource-awsorganizationssource","Required":false,"Type":"AwsOrganizationsSource","UpdateType":"Mutable"},"IncludeFutureRegions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-syncsource.html#cfn-ssm-resourcedatasync-syncsource-includefutureregions","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SourceRegions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-syncsource.html#cfn-ssm-resourcedatasync-syncsource-sourceregions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssm-resourcedatasync-syncsource.html#cfn-ssm-resourcedatasync-syncsource-sourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMContacts::Contact.ChannelTargetInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-channeltargetinfo.html","Properties":{"ChannelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-channeltargetinfo.html#cfn-ssmcontacts-contact-channeltargetinfo-channelid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RetryIntervalInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-channeltargetinfo.html#cfn-ssmcontacts-contact-channeltargetinfo-retryintervalinminutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMContacts::Contact.ContactTargetInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-contacttargetinfo.html","Properties":{"ContactId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-contacttargetinfo.html#cfn-ssmcontacts-contact-contacttargetinfo-contactid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IsEssential":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-contacttargetinfo.html#cfn-ssmcontacts-contact-contacttargetinfo-isessential","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMContacts::Contact.Stage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-stage.html","Properties":{"DurationInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-stage.html#cfn-ssmcontacts-contact-stage-durationinminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RotationIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-stage.html#cfn-ssmcontacts-contact-stage-rotationids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-stage.html#cfn-ssmcontacts-contact-stage-targets","DuplicatesAllowed":true,"ItemType":"Targets","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSMContacts::Contact.Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-targets.html","Properties":{"ChannelTargetInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-targets.html#cfn-ssmcontacts-contact-targets-channeltargetinfo","Required":false,"Type":"ChannelTargetInfo","UpdateType":"Mutable"},"ContactTargetInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-contact-targets.html#cfn-ssmcontacts-contact-targets-contacttargetinfo","Required":false,"Type":"ContactTargetInfo","UpdateType":"Mutable"}}},"AWS::SSMContacts::Plan.ChannelTargetInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-channeltargetinfo.html","Properties":{"ChannelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-channeltargetinfo.html#cfn-ssmcontacts-plan-channeltargetinfo-channelid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RetryIntervalInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-channeltargetinfo.html#cfn-ssmcontacts-plan-channeltargetinfo-retryintervalinminutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMContacts::Plan.ContactTargetInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-contacttargetinfo.html","Properties":{"ContactId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-contacttargetinfo.html#cfn-ssmcontacts-plan-contacttargetinfo-contactid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IsEssential":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-contacttargetinfo.html#cfn-ssmcontacts-plan-contacttargetinfo-isessential","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMContacts::Plan.Stage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-stage.html","Properties":{"DurationInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-stage.html#cfn-ssmcontacts-plan-stage-durationinminutes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-stage.html#cfn-ssmcontacts-plan-stage-targets","DuplicatesAllowed":true,"ItemType":"Targets","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSMContacts::Plan.Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-targets.html","Properties":{"ChannelTargetInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-targets.html#cfn-ssmcontacts-plan-targets-channeltargetinfo","Required":false,"Type":"ChannelTargetInfo","UpdateType":"Mutable"},"ContactTargetInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-plan-targets.html#cfn-ssmcontacts-plan-targets-contacttargetinfo","Required":false,"Type":"ContactTargetInfo","UpdateType":"Mutable"}}},"AWS::SSMContacts::Rotation.CoverageTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-coveragetime.html","Properties":{"EndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-coveragetime.html#cfn-ssmcontacts-rotation-coveragetime-endtime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-coveragetime.html#cfn-ssmcontacts-rotation-coveragetime-starttime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMContacts::Rotation.MonthlySetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-monthlysetting.html","Properties":{"DayOfMonth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-monthlysetting.html#cfn-ssmcontacts-rotation-monthlysetting-dayofmonth","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"HandOffTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-monthlysetting.html#cfn-ssmcontacts-rotation-monthlysetting-handofftime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMContacts::Rotation.RecurrenceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-recurrencesettings.html","Properties":{"DailySettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-recurrencesettings.html#cfn-ssmcontacts-rotation-recurrencesettings-dailysettings","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MonthlySettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-recurrencesettings.html#cfn-ssmcontacts-rotation-recurrencesettings-monthlysettings","DuplicatesAllowed":true,"ItemType":"MonthlySetting","Required":false,"Type":"List","UpdateType":"Mutable"},"NumberOfOnCalls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-recurrencesettings.html#cfn-ssmcontacts-rotation-recurrencesettings-numberofoncalls","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"RecurrenceMultiplier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-recurrencesettings.html#cfn-ssmcontacts-rotation-recurrencesettings-recurrencemultiplier","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ShiftCoverages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-recurrencesettings.html#cfn-ssmcontacts-rotation-recurrencesettings-shiftcoverages","DuplicatesAllowed":true,"ItemType":"ShiftCoverage","Required":false,"Type":"List","UpdateType":"Mutable"},"WeeklySettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-recurrencesettings.html#cfn-ssmcontacts-rotation-recurrencesettings-weeklysettings","DuplicatesAllowed":true,"ItemType":"WeeklySetting","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSMContacts::Rotation.ShiftCoverage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-shiftcoverage.html","Properties":{"CoverageTimes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-shiftcoverage.html#cfn-ssmcontacts-rotation-shiftcoverage-coveragetimes","DuplicatesAllowed":true,"ItemType":"CoverageTime","Required":true,"Type":"List","UpdateType":"Mutable"},"DayOfWeek":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-shiftcoverage.html#cfn-ssmcontacts-rotation-shiftcoverage-dayofweek","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMContacts::Rotation.WeeklySetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-weeklysetting.html","Properties":{"DayOfWeek":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-weeklysetting.html#cfn-ssmcontacts-rotation-weeklysetting-dayofweek","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HandOffTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmcontacts-rotation-weeklysetting.html#cfn-ssmcontacts-rotation-weeklysetting-handofftime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMIncidents::ReplicationSet.RegionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-replicationset-regionconfiguration.html","Properties":{"SseKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-replicationset-regionconfiguration.html#cfn-ssmincidents-replicationset-regionconfiguration-ssekmskeyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMIncidents::ReplicationSet.ReplicationRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-replicationset-replicationregion.html","Properties":{"RegionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-replicationset-replicationregion.html#cfn-ssmincidents-replicationset-replicationregion-regionconfiguration","Required":false,"Type":"RegionConfiguration","UpdateType":"Mutable"},"RegionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-replicationset-replicationregion.html#cfn-ssmincidents-replicationset-replicationregion-regionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-action.html","Properties":{"SsmAutomation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-action.html#cfn-ssmincidents-responseplan-action-ssmautomation","Required":false,"Type":"SsmAutomation","UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan.ChatChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-chatchannel.html","Properties":{"ChatbotSns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-chatchannel.html#cfn-ssmincidents-responseplan-chatchannel-chatbotsns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan.DynamicSsmParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-dynamicssmparameter.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-dynamicssmparameter.html#cfn-ssmincidents-responseplan-dynamicssmparameter-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-dynamicssmparameter.html#cfn-ssmincidents-responseplan-dynamicssmparameter-value","Required":true,"Type":"DynamicSsmParameterValue","UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan.DynamicSsmParameterValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-dynamicssmparametervalue.html","Properties":{"Variable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-dynamicssmparametervalue.html#cfn-ssmincidents-responseplan-dynamicssmparametervalue-variable","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan.IncidentTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-incidenttemplate.html","Properties":{"DedupeString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-incidenttemplate.html#cfn-ssmincidents-responseplan-incidenttemplate-dedupestring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Impact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-incidenttemplate.html#cfn-ssmincidents-responseplan-incidenttemplate-impact","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"IncidentTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-incidenttemplate.html#cfn-ssmincidents-responseplan-incidenttemplate-incidenttags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"NotificationTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-incidenttemplate.html#cfn-ssmincidents-responseplan-incidenttemplate-notificationtargets","DuplicatesAllowed":true,"ItemType":"NotificationTargetItem","Required":false,"Type":"List","UpdateType":"Mutable"},"Summary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-incidenttemplate.html#cfn-ssmincidents-responseplan-incidenttemplate-summary","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-incidenttemplate.html#cfn-ssmincidents-responseplan-incidenttemplate-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan.Integration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-integration.html","Properties":{"PagerDutyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-integration.html#cfn-ssmincidents-responseplan-integration-pagerdutyconfiguration","Required":true,"Type":"PagerDutyConfiguration","UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan.NotificationTargetItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-notificationtargetitem.html","Properties":{"SnsTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-notificationtargetitem.html#cfn-ssmincidents-responseplan-notificationtargetitem-snstopicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan.PagerDutyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-pagerdutyconfiguration.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-pagerdutyconfiguration.html#cfn-ssmincidents-responseplan-pagerdutyconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PagerDutyIncidentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-pagerdutyconfiguration.html#cfn-ssmincidents-responseplan-pagerdutyconfiguration-pagerdutyincidentconfiguration","Required":true,"Type":"PagerDutyIncidentConfiguration","UpdateType":"Mutable"},"SecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-pagerdutyconfiguration.html#cfn-ssmincidents-responseplan-pagerdutyconfiguration-secretid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan.PagerDutyIncidentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-pagerdutyincidentconfiguration.html","Properties":{"ServiceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-pagerdutyincidentconfiguration.html#cfn-ssmincidents-responseplan-pagerdutyincidentconfiguration-serviceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan.SsmAutomation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-ssmautomation.html","Properties":{"DocumentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-ssmautomation.html#cfn-ssmincidents-responseplan-ssmautomation-documentname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DocumentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-ssmautomation.html#cfn-ssmincidents-responseplan-ssmautomation-documentversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DynamicParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-ssmautomation.html#cfn-ssmincidents-responseplan-ssmautomation-dynamicparameters","DuplicatesAllowed":false,"ItemType":"DynamicSsmParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-ssmautomation.html#cfn-ssmincidents-responseplan-ssmautomation-parameters","DuplicatesAllowed":false,"ItemType":"SsmParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-ssmautomation.html#cfn-ssmincidents-responseplan-ssmautomation-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetAccount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-ssmautomation.html#cfn-ssmincidents-responseplan-ssmautomation-targetaccount","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan.SsmParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-ssmparameter.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-ssmparameter.html#cfn-ssmincidents-responseplan-ssmparameter-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ssmincidents-responseplan-ssmparameter.html#cfn-ssmincidents-responseplan-ssmparameter-values","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSO::InstanceAccessControlAttributeConfiguration.AccessControlAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sso-instanceaccesscontrolattributeconfiguration-accesscontrolattribute.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sso-instanceaccesscontrolattributeconfiguration-accesscontrolattribute.html#cfn-sso-instanceaccesscontrolattributeconfiguration-accesscontrolattribute-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sso-instanceaccesscontrolattributeconfiguration-accesscontrolattribute.html#cfn-sso-instanceaccesscontrolattributeconfiguration-accesscontrolattribute-value","Required":true,"Type":"AccessControlAttributeValue","UpdateType":"Mutable"}}},"AWS::SSO::InstanceAccessControlAttributeConfiguration.AccessControlAttributeValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sso-instanceaccesscontrolattributeconfiguration-accesscontrolattributevalue.html","Properties":{"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sso-instanceaccesscontrolattributeconfiguration-accesscontrolattributevalue.html#cfn-sso-instanceaccesscontrolattributeconfiguration-accesscontrolattributevalue-source","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSO::PermissionSet.CustomerManagedPolicyReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sso-permissionset-customermanagedpolicyreference.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sso-permissionset-customermanagedpolicyreference.html#cfn-sso-permissionset-customermanagedpolicyreference-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sso-permissionset-customermanagedpolicyreference.html#cfn-sso-permissionset-customermanagedpolicyreference-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSO::PermissionSet.PermissionsBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sso-permissionset-permissionsboundary.html","Properties":{"CustomerManagedPolicyReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sso-permissionset-permissionsboundary.html#cfn-sso-permissionset-permissionsboundary-customermanagedpolicyreference","Required":false,"Type":"CustomerManagedPolicyReference","UpdateType":"Mutable"},"ManagedPolicyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sso-permissionset-permissionsboundary.html#cfn-sso-permissionset-permissionsboundary-managedpolicyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::App.ResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-app-resourcespec.html","Properties":{"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-app-resourcespec.html#cfn-sagemaker-app-resourcespec-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SageMakerImageArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-app-resourcespec.html#cfn-sagemaker-app-resourcespec-sagemakerimagearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SageMakerImageVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-app-resourcespec.html#cfn-sagemaker-app-resourcespec-sagemakerimageversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::AppImageConfig.FileSystemConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-appimageconfig-filesystemconfig.html","Properties":{"DefaultGid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-appimageconfig-filesystemconfig.html#cfn-sagemaker-appimageconfig-filesystemconfig-defaultgid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DefaultUid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-appimageconfig-filesystemconfig.html#cfn-sagemaker-appimageconfig-filesystemconfig-defaultuid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MountPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-appimageconfig-filesystemconfig.html#cfn-sagemaker-appimageconfig-filesystemconfig-mountpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::AppImageConfig.KernelGatewayImageConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-appimageconfig-kernelgatewayimageconfig.html","Properties":{"FileSystemConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-appimageconfig-kernelgatewayimageconfig.html#cfn-sagemaker-appimageconfig-kernelgatewayimageconfig-filesystemconfig","Required":false,"Type":"FileSystemConfig","UpdateType":"Mutable"},"KernelSpecs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-appimageconfig-kernelgatewayimageconfig.html#cfn-sagemaker-appimageconfig-kernelgatewayimageconfig-kernelspecs","DuplicatesAllowed":true,"ItemType":"KernelSpec","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::AppImageConfig.KernelSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-appimageconfig-kernelspec.html","Properties":{"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-appimageconfig-kernelspec.html#cfn-sagemaker-appimageconfig-kernelspec-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-appimageconfig-kernelspec.html#cfn-sagemaker-appimageconfig-kernelspec-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::CodeRepository.GitConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-coderepository-gitconfig.html","Properties":{"Branch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-coderepository-gitconfig.html#cfn-sagemaker-coderepository-gitconfig-branch","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RepositoryUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-coderepository-gitconfig.html#cfn-sagemaker-coderepository-gitconfig-repositoryurl","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-coderepository-gitconfig.html#cfn-sagemaker-coderepository-gitconfig-secretarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::DataQualityJobDefinition.BatchTransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-batchtransforminput.html","Properties":{"DataCapturedDestinationS3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-dataqualityjobdefinition-batchtransforminput-datacaptureddestinations3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatasetFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-dataqualityjobdefinition-batchtransforminput-datasetformat","Required":true,"Type":"DatasetFormat","UpdateType":"Immutable"},"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-dataqualityjobdefinition-batchtransforminput-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3DataDistributionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-dataqualityjobdefinition-batchtransforminput-s3datadistributiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3InputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-dataqualityjobdefinition-batchtransforminput-s3inputmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-clusterconfig.html","Properties":{"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-clusterconfig.html#cfn-sagemaker-dataqualityjobdefinition-clusterconfig-instancecount","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-clusterconfig.html#cfn-sagemaker-dataqualityjobdefinition-clusterconfig-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VolumeKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-clusterconfig.html#cfn-sagemaker-dataqualityjobdefinition-clusterconfig-volumekmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VolumeSizeInGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-clusterconfig.html#cfn-sagemaker-dataqualityjobdefinition-clusterconfig-volumesizeingb","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.ConstraintsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-constraintsresource.html","Properties":{"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-constraintsresource.html#cfn-sagemaker-dataqualityjobdefinition-constraintsresource-s3uri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-csv.html","Properties":{"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-csv.html#cfn-sagemaker-dataqualityjobdefinition-csv-header","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.DataQualityAppSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualityappspecification.html","Properties":{"ContainerArguments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualityappspecification.html#cfn-sagemaker-dataqualityjobdefinition-dataqualityappspecification-containerarguments","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ContainerEntrypoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualityappspecification.html#cfn-sagemaker-dataqualityjobdefinition-dataqualityappspecification-containerentrypoint","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualityappspecification.html#cfn-sagemaker-dataqualityjobdefinition-dataqualityappspecification-environment","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"ImageUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualityappspecification.html#cfn-sagemaker-dataqualityjobdefinition-dataqualityappspecification-imageuri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PostAnalyticsProcessorSourceUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualityappspecification.html#cfn-sagemaker-dataqualityjobdefinition-dataqualityappspecification-postanalyticsprocessorsourceuri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RecordPreprocessorSourceUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualityappspecification.html#cfn-sagemaker-dataqualityjobdefinition-dataqualityappspecification-recordpreprocessorsourceuri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.DataQualityBaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualitybaselineconfig.html","Properties":{"BaseliningJobName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualitybaselineconfig.html#cfn-sagemaker-dataqualityjobdefinition-dataqualitybaselineconfig-baseliningjobname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConstraintsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualitybaselineconfig.html#cfn-sagemaker-dataqualityjobdefinition-dataqualitybaselineconfig-constraintsresource","Required":false,"Type":"ConstraintsResource","UpdateType":"Immutable"},"StatisticsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualitybaselineconfig.html#cfn-sagemaker-dataqualityjobdefinition-dataqualitybaselineconfig-statisticsresource","Required":false,"Type":"StatisticsResource","UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.DataQualityJobInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualityjobinput.html","Properties":{"BatchTransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualityjobinput.html#cfn-sagemaker-dataqualityjobdefinition-dataqualityjobinput-batchtransforminput","Required":false,"Type":"BatchTransformInput","UpdateType":"Immutable"},"EndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-dataqualityjobinput.html#cfn-sagemaker-dataqualityjobdefinition-dataqualityjobinput-endpointinput","Required":false,"Type":"EndpointInput","UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.DatasetFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-datasetformat.html","Properties":{"Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-datasetformat.html#cfn-sagemaker-dataqualityjobdefinition-datasetformat-csv","Required":false,"Type":"Csv","UpdateType":"Immutable"},"Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-datasetformat.html#cfn-sagemaker-dataqualityjobdefinition-datasetformat-json","Required":false,"Type":"Json","UpdateType":"Immutable"},"Parquet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-datasetformat.html#cfn-sagemaker-dataqualityjobdefinition-datasetformat-parquet","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.EndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-endpointinput.html","Properties":{"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-endpointinput.html#cfn-sagemaker-dataqualityjobdefinition-endpointinput-endpointname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-endpointinput.html#cfn-sagemaker-dataqualityjobdefinition-endpointinput-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3DataDistributionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-endpointinput.html#cfn-sagemaker-dataqualityjobdefinition-endpointinput-s3datadistributiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3InputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-endpointinput.html#cfn-sagemaker-dataqualityjobdefinition-endpointinput-s3inputmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-json.html","Properties":{"Line":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-json.html#cfn-sagemaker-dataqualityjobdefinition-json-line","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.MonitoringOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-monitoringoutput.html","Properties":{"S3Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-monitoringoutput.html#cfn-sagemaker-dataqualityjobdefinition-monitoringoutput-s3output","Required":true,"Type":"S3Output","UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.MonitoringOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-monitoringoutputconfig.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-monitoringoutputconfig.html#cfn-sagemaker-dataqualityjobdefinition-monitoringoutputconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MonitoringOutputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-monitoringoutputconfig.html#cfn-sagemaker-dataqualityjobdefinition-monitoringoutputconfig-monitoringoutputs","DuplicatesAllowed":true,"ItemType":"MonitoringOutput","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.MonitoringResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-monitoringresources.html","Properties":{"ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-monitoringresources.html#cfn-sagemaker-dataqualityjobdefinition-monitoringresources-clusterconfig","Required":true,"Type":"ClusterConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.NetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-networkconfig.html","Properties":{"EnableInterContainerTrafficEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-networkconfig.html#cfn-sagemaker-dataqualityjobdefinition-networkconfig-enableintercontainertrafficencryption","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"EnableNetworkIsolation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-networkconfig.html#cfn-sagemaker-dataqualityjobdefinition-networkconfig-enablenetworkisolation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-networkconfig.html#cfn-sagemaker-dataqualityjobdefinition-networkconfig-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.S3Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-s3output.html","Properties":{"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-s3output.html#cfn-sagemaker-dataqualityjobdefinition-s3output-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3UploadMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-s3output.html#cfn-sagemaker-dataqualityjobdefinition-s3output-s3uploadmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-s3output.html#cfn-sagemaker-dataqualityjobdefinition-s3output-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.StatisticsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-statisticsresource.html","Properties":{"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-statisticsresource.html#cfn-sagemaker-dataqualityjobdefinition-statisticsresource-s3uri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.StoppingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-stoppingcondition.html","Properties":{"MaxRuntimeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-stoppingcondition.html#cfn-sagemaker-dataqualityjobdefinition-stoppingcondition-maxruntimeinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::DataQualityJobDefinition.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-vpcconfig.html#cfn-sagemaker-dataqualityjobdefinition-vpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-dataqualityjobdefinition-vpcconfig.html#cfn-sagemaker-dataqualityjobdefinition-vpcconfig-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::Device.Device":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-device-device.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-device-device.html#cfn-sagemaker-device-device-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-device-device.html#cfn-sagemaker-device-device-devicename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IotThingName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-device-device.html#cfn-sagemaker-device-device-iotthingname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::DeviceFleet.EdgeOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-devicefleet-edgeoutputconfig.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-devicefleet-edgeoutputconfig.html#cfn-sagemaker-devicefleet-edgeoutputconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3OutputLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-devicefleet-edgeoutputconfig.html#cfn-sagemaker-devicefleet-edgeoutputconfig-s3outputlocation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::Domain.CustomImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-customimage.html","Properties":{"AppImageConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-customimage.html#cfn-sagemaker-domain-customimage-appimageconfigname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ImageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-customimage.html#cfn-sagemaker-domain-customimage-imagename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ImageVersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-customimage.html#cfn-sagemaker-domain-customimage-imageversionnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::Domain.DefaultSpaceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-defaultspacesettings.html","Properties":{"ExecutionRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-defaultspacesettings.html#cfn-sagemaker-domain-defaultspacesettings-executionrole","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"JupyterServerAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-defaultspacesettings.html#cfn-sagemaker-domain-defaultspacesettings-jupyterserverappsettings","Required":false,"Type":"JupyterServerAppSettings","UpdateType":"Mutable"},"KernelGatewayAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-defaultspacesettings.html#cfn-sagemaker-domain-defaultspacesettings-kernelgatewayappsettings","Required":false,"Type":"KernelGatewayAppSettings","UpdateType":"Mutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-defaultspacesettings.html#cfn-sagemaker-domain-defaultspacesettings-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::Domain.DomainSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-domainsettings.html","Properties":{"RStudioServerProDomainSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-domainsettings.html#cfn-sagemaker-domain-domainsettings-rstudioserverprodomainsettings","Required":false,"Type":"RStudioServerProDomainSettings","UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-domainsettings.html#cfn-sagemaker-domain-domainsettings-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::Domain.JupyterServerAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-jupyterserverappsettings.html","Properties":{"DefaultResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-jupyterserverappsettings.html#cfn-sagemaker-domain-jupyterserverappsettings-defaultresourcespec","Required":false,"Type":"ResourceSpec","UpdateType":"Mutable"}}},"AWS::SageMaker::Domain.KernelGatewayAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-kernelgatewayappsettings.html","Properties":{"CustomImages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-kernelgatewayappsettings.html#cfn-sagemaker-domain-kernelgatewayappsettings-customimages","DuplicatesAllowed":true,"ItemType":"CustomImage","Required":false,"Type":"List","UpdateType":"Mutable"},"DefaultResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-kernelgatewayappsettings.html#cfn-sagemaker-domain-kernelgatewayappsettings-defaultresourcespec","Required":false,"Type":"ResourceSpec","UpdateType":"Mutable"}}},"AWS::SageMaker::Domain.RSessionAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-rsessionappsettings.html","Properties":{"CustomImages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-rsessionappsettings.html#cfn-sagemaker-domain-rsessionappsettings-customimages","DuplicatesAllowed":true,"ItemType":"CustomImage","Required":false,"Type":"List","UpdateType":"Mutable"},"DefaultResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-rsessionappsettings.html#cfn-sagemaker-domain-rsessionappsettings-defaultresourcespec","Required":false,"Type":"ResourceSpec","UpdateType":"Mutable"}}},"AWS::SageMaker::Domain.RStudioServerProAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-rstudioserverproappsettings.html","Properties":{"AccessStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-rstudioserverproappsettings.html#cfn-sagemaker-domain-rstudioserverproappsettings-accessstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-rstudioserverproappsettings.html#cfn-sagemaker-domain-rstudioserverproappsettings-usergroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::Domain.RStudioServerProDomainSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-rstudioserverprodomainsettings.html","Properties":{"DefaultResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-rstudioserverprodomainsettings.html#cfn-sagemaker-domain-rstudioserverprodomainsettings-defaultresourcespec","Required":false,"Type":"ResourceSpec","UpdateType":"Immutable"},"DomainExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-rstudioserverprodomainsettings.html#cfn-sagemaker-domain-rstudioserverprodomainsettings-domainexecutionrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RStudioConnectUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-rstudioserverprodomainsettings.html#cfn-sagemaker-domain-rstudioserverprodomainsettings-rstudioconnecturl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RStudioPackageManagerUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-rstudioserverprodomainsettings.html#cfn-sagemaker-domain-rstudioserverprodomainsettings-rstudiopackagemanagerurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::Domain.ResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-resourcespec.html","Properties":{"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-resourcespec.html#cfn-sagemaker-domain-resourcespec-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"LifecycleConfigArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-resourcespec.html#cfn-sagemaker-domain-resourcespec-lifecycleconfigarn","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"SageMakerImageArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-resourcespec.html#cfn-sagemaker-domain-resourcespec-sagemakerimagearn","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"SageMakerImageVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-resourcespec.html#cfn-sagemaker-domain-resourcespec-sagemakerimageversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"}}},"AWS::SageMaker::Domain.SharingSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-sharingsettings.html","Properties":{"NotebookOutputOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-sharingsettings.html#cfn-sagemaker-domain-sharingsettings-notebookoutputoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-sharingsettings.html#cfn-sagemaker-domain-sharingsettings-s3kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3OutputPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-sharingsettings.html#cfn-sagemaker-domain-sharingsettings-s3outputpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::Domain.UserSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-usersettings.html","Properties":{"ExecutionRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-usersettings.html#cfn-sagemaker-domain-usersettings-executionrole","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"JupyterServerAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-usersettings.html#cfn-sagemaker-domain-usersettings-jupyterserverappsettings","Required":false,"Type":"JupyterServerAppSettings","UpdateType":"Mutable"},"KernelGatewayAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-usersettings.html#cfn-sagemaker-domain-usersettings-kernelgatewayappsettings","Required":false,"Type":"KernelGatewayAppSettings","UpdateType":"Mutable"},"RSessionAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-usersettings.html#cfn-sagemaker-domain-usersettings-rsessionappsettings","Required":false,"Type":"RSessionAppSettings","UpdateType":"Mutable"},"RStudioServerProAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-usersettings.html#cfn-sagemaker-domain-usersettings-rstudioserverproappsettings","Required":false,"Type":"RStudioServerProAppSettings","UpdateType":"Mutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-usersettings.html#cfn-sagemaker-domain-usersettings-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SharingSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-domain-usersettings.html#cfn-sagemaker-domain-usersettings-sharingsettings","Required":false,"Type":"SharingSettings","UpdateType":"Mutable"}}},"AWS::SageMaker::Endpoint.Alarm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-alarm.html","Properties":{"AlarmName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-alarm.html#cfn-sagemaker-endpoint-alarm-alarmname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::Endpoint.AutoRollbackConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-autorollbackconfig.html","Properties":{"Alarms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-autorollbackconfig.html#cfn-sagemaker-endpoint-autorollbackconfig-alarms","ItemType":"Alarm","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::Endpoint.BlueGreenUpdatePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-bluegreenupdatepolicy.html","Properties":{"MaximumExecutionTimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-bluegreenupdatepolicy.html#cfn-sagemaker-endpoint-bluegreenupdatepolicy-maximumexecutiontimeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TerminationWaitInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-bluegreenupdatepolicy.html#cfn-sagemaker-endpoint-bluegreenupdatepolicy-terminationwaitinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TrafficRoutingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-bluegreenupdatepolicy.html#cfn-sagemaker-endpoint-bluegreenupdatepolicy-trafficroutingconfiguration","Required":true,"Type":"TrafficRoutingConfig","UpdateType":"Mutable"}}},"AWS::SageMaker::Endpoint.CapacitySize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-capacitysize.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-capacitysize.html#cfn-sagemaker-endpoint-capacitysize-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-capacitysize.html#cfn-sagemaker-endpoint-capacitysize-value","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::Endpoint.DeploymentConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-deploymentconfig.html","Properties":{"AutoRollbackConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-deploymentconfig.html#cfn-sagemaker-endpoint-deploymentconfig-autorollbackconfiguration","Required":false,"Type":"AutoRollbackConfig","UpdateType":"Mutable"},"BlueGreenUpdatePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-deploymentconfig.html#cfn-sagemaker-endpoint-deploymentconfig-bluegreenupdatepolicy","Required":true,"Type":"BlueGreenUpdatePolicy","UpdateType":"Mutable"}}},"AWS::SageMaker::Endpoint.TrafficRoutingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-trafficroutingconfig.html","Properties":{"CanarySize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-trafficroutingconfig.html#cfn-sagemaker-endpoint-trafficroutingconfig-canarysize","Required":false,"Type":"CapacitySize","UpdateType":"Mutable"},"LinearStepSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-trafficroutingconfig.html#cfn-sagemaker-endpoint-trafficroutingconfig-linearstepsize","Required":false,"Type":"CapacitySize","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-trafficroutingconfig.html#cfn-sagemaker-endpoint-trafficroutingconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"WaitIntervalInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-trafficroutingconfig.html#cfn-sagemaker-endpoint-trafficroutingconfig-waitintervalinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::Endpoint.VariantProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-variantproperty.html","Properties":{"VariantPropertyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpoint-variantproperty.html#cfn-sagemaker-endpoint-variantproperty-variantpropertytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::EndpointConfig.AsyncInferenceClientConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferenceclientconfig.html","Properties":{"MaxConcurrentInvocationsPerInstance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferenceclientconfig.html#cfn-sagemaker-endpointconfig-asyncinferenceclientconfig-maxconcurrentinvocationsperinstance","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.AsyncInferenceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferenceconfig.html","Properties":{"ClientConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferenceconfig.html#cfn-sagemaker-endpointconfig-asyncinferenceconfig-clientconfig","Required":false,"Type":"AsyncInferenceClientConfig","UpdateType":"Immutable"},"OutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferenceconfig.html#cfn-sagemaker-endpointconfig-asyncinferenceconfig-outputconfig","Required":true,"Type":"AsyncInferenceOutputConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.AsyncInferenceNotificationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferencenotificationconfig.html","Properties":{"ErrorTopic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferencenotificationconfig.html#cfn-sagemaker-endpointconfig-asyncinferencenotificationconfig-errortopic","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IncludeInferenceResponseIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferencenotificationconfig.html#cfn-sagemaker-endpointconfig-asyncinferencenotificationconfig-includeinferenceresponsein","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SuccessTopic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferencenotificationconfig.html#cfn-sagemaker-endpointconfig-asyncinferencenotificationconfig-successtopic","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.AsyncInferenceOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferenceoutputconfig.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferenceoutputconfig.html#cfn-sagemaker-endpointconfig-asyncinferenceoutputconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NotificationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferenceoutputconfig.html#cfn-sagemaker-endpointconfig-asyncinferenceoutputconfig-notificationconfig","Required":false,"Type":"AsyncInferenceNotificationConfig","UpdateType":"Immutable"},"S3FailurePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferenceoutputconfig.html#cfn-sagemaker-endpointconfig-asyncinferenceoutputconfig-s3failurepath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3OutputPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-asyncinferenceoutputconfig.html#cfn-sagemaker-endpointconfig-asyncinferenceoutputconfig-s3outputpath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.CaptureContentTypeHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-datacaptureconfig-capturecontenttypeheader.html","Properties":{"CsvContentTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-datacaptureconfig-capturecontenttypeheader.html#cfn-sagemaker-endpointconfig-datacaptureconfig-capturecontenttypeheader-csvcontenttypes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"JsonContentTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-datacaptureconfig-capturecontenttypeheader.html#cfn-sagemaker-endpointconfig-datacaptureconfig-capturecontenttypeheader-jsoncontenttypes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.CaptureOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-captureoption.html","Properties":{"CaptureMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-captureoption.html#cfn-sagemaker-endpointconfig-captureoption-capturemode","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.ClarifyExplainerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyexplainerconfig.html","Properties":{"EnableExplanations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyexplainerconfig.html#cfn-sagemaker-endpointconfig-clarifyexplainerconfig-enableexplanations","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InferenceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyexplainerconfig.html#cfn-sagemaker-endpointconfig-clarifyexplainerconfig-inferenceconfig","Required":false,"Type":"ClarifyInferenceConfig","UpdateType":"Immutable"},"ShapConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyexplainerconfig.html#cfn-sagemaker-endpointconfig-clarifyexplainerconfig-shapconfig","Required":true,"Type":"ClarifyShapConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.ClarifyFeatureType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyfeaturetype.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AWS::SageMaker::EndpointConfig.ClarifyHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyheader.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AWS::SageMaker::EndpointConfig.ClarifyInferenceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html","Properties":{"ContentTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html#cfn-sagemaker-endpointconfig-clarifyinferenceconfig-contenttemplate","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FeatureHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html#cfn-sagemaker-endpointconfig-clarifyinferenceconfig-featureheaders","ItemType":"ClarifyHeader","Required":false,"Type":"List","UpdateType":"Immutable"},"FeatureTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html#cfn-sagemaker-endpointconfig-clarifyinferenceconfig-featuretypes","ItemType":"ClarifyFeatureType","Required":false,"Type":"List","UpdateType":"Immutable"},"FeaturesAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html#cfn-sagemaker-endpointconfig-clarifyinferenceconfig-featuresattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LabelAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html#cfn-sagemaker-endpointconfig-clarifyinferenceconfig-labelattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LabelHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html#cfn-sagemaker-endpointconfig-clarifyinferenceconfig-labelheaders","ItemType":"ClarifyHeader","Required":false,"Type":"List","UpdateType":"Immutable"},"LabelIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html#cfn-sagemaker-endpointconfig-clarifyinferenceconfig-labelindex","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MaxPayloadInMB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html#cfn-sagemaker-endpointconfig-clarifyinferenceconfig-maxpayloadinmb","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MaxRecordCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html#cfn-sagemaker-endpointconfig-clarifyinferenceconfig-maxrecordcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ProbabilityAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html#cfn-sagemaker-endpointconfig-clarifyinferenceconfig-probabilityattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProbabilityIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyinferenceconfig.html#cfn-sagemaker-endpointconfig-clarifyinferenceconfig-probabilityindex","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.ClarifyShapBaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapbaselineconfig.html","Properties":{"MimeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapbaselineconfig.html#cfn-sagemaker-endpointconfig-clarifyshapbaselineconfig-mimetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ShapBaseline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapbaselineconfig.html#cfn-sagemaker-endpointconfig-clarifyshapbaselineconfig-shapbaseline","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ShapBaselineUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapbaselineconfig.html#cfn-sagemaker-endpointconfig-clarifyshapbaselineconfig-shapbaselineuri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.ClarifyShapConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapconfig.html","Properties":{"NumberOfSamples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapconfig.html#cfn-sagemaker-endpointconfig-clarifyshapconfig-numberofsamples","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Seed":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapconfig.html#cfn-sagemaker-endpointconfig-clarifyshapconfig-seed","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ShapBaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapconfig.html#cfn-sagemaker-endpointconfig-clarifyshapconfig-shapbaselineconfig","Required":true,"Type":"ClarifyShapBaselineConfig","UpdateType":"Immutable"},"TextConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapconfig.html#cfn-sagemaker-endpointconfig-clarifyshapconfig-textconfig","Required":false,"Type":"ClarifyTextConfig","UpdateType":"Immutable"},"UseLogit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifyshapconfig.html#cfn-sagemaker-endpointconfig-clarifyshapconfig-uselogit","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.ClarifyTextConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifytextconfig.html","Properties":{"Granularity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifytextconfig.html#cfn-sagemaker-endpointconfig-clarifytextconfig-granularity","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Language":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-clarifytextconfig.html#cfn-sagemaker-endpointconfig-clarifytextconfig-language","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.DataCaptureConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-datacaptureconfig.html","Properties":{"CaptureContentTypeHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-datacaptureconfig.html#cfn-sagemaker-endpointconfig-datacaptureconfig-capturecontenttypeheader","Required":false,"Type":"CaptureContentTypeHeader","UpdateType":"Immutable"},"CaptureOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-datacaptureconfig.html#cfn-sagemaker-endpointconfig-datacaptureconfig-captureoptions","ItemType":"CaptureOption","Required":true,"Type":"List","UpdateType":"Immutable"},"DestinationS3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-datacaptureconfig.html#cfn-sagemaker-endpointconfig-datacaptureconfig-destinations3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EnableCapture":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-datacaptureconfig.html#cfn-sagemaker-endpointconfig-datacaptureconfig-enablecapture","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"InitialSamplingPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-datacaptureconfig.html#cfn-sagemaker-endpointconfig-datacaptureconfig-initialsamplingpercentage","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-datacaptureconfig.html#cfn-sagemaker-endpointconfig-datacaptureconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.ExplainerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-explainerconfig.html","Properties":{"ClarifyExplainerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-explainerconfig.html#cfn-sagemaker-endpointconfig-explainerconfig-clarifyexplainerconfig","Required":false,"Type":"ClarifyExplainerConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.ProductionVariant":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html","Properties":{"AcceleratorType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html#cfn-sagemaker-endpointconfig-productionvariant-acceleratortype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ContainerStartupHealthCheckTimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html#cfn-sagemaker-endpointconfig-productionvariant-containerstartuphealthchecktimeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"EnableSSMAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html#cfn-sagemaker-endpointconfig-productionvariant-enablessmaccess","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"InitialInstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html#cfn-sagemaker-endpointconfig-productionvariant-initialinstancecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"InitialVariantWeight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html#cfn-sagemaker-endpointconfig-productionvariant-initialvariantweight","PrimitiveType":"Double","Required":true,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html#cfn-sagemaker-endpointconfig-productionvariant-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ModelDataDownloadTimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html#cfn-sagemaker-endpointconfig-productionvariant-modeldatadownloadtimeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ModelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html#cfn-sagemaker-endpointconfig-productionvariant-modelname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ServerlessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html#cfn-sagemaker-endpointconfig-productionvariant-serverlessconfig","Required":false,"Type":"ServerlessConfig","UpdateType":"Mutable"},"VariantName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html#cfn-sagemaker-endpointconfig-productionvariant-variantname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VolumeSizeInGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant.html#cfn-sagemaker-endpointconfig-productionvariant-volumesizeingb","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::EndpointConfig.ServerlessConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant-serverlessconfig.html","Properties":{"MaxConcurrency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant-serverlessconfig.html#cfn-sagemaker-endpointconfig-productionvariant-serverlessconfig-maxconcurrency","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"MemorySizeInMB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant-serverlessconfig.html#cfn-sagemaker-endpointconfig-productionvariant-serverlessconfig-memorysizeinmb","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"ProvisionedConcurrency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-endpointconfig-productionvariant-serverlessconfig.html#cfn-sagemaker-endpointconfig-productionvariant-serverlessconfig-provisionedconcurrency","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::FeatureGroup.DataCatalogConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-datacatalogconfig.html","Properties":{"Catalog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-datacatalogconfig.html#cfn-sagemaker-featuregroup-datacatalogconfig-catalog","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-datacatalogconfig.html#cfn-sagemaker-featuregroup-datacatalogconfig-database","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-datacatalogconfig.html#cfn-sagemaker-featuregroup-datacatalogconfig-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::FeatureGroup.FeatureDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-featuredefinition.html","Properties":{"FeatureName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-featuredefinition.html#cfn-sagemaker-featuregroup-featuredefinition-featurename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FeatureType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-featuredefinition.html#cfn-sagemaker-featuregroup-featuredefinition-featuretype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::FeatureGroup.OfflineStoreConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-offlinestoreconfig.html","Properties":{"DataCatalogConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-offlinestoreconfig.html#cfn-sagemaker-featuregroup-offlinestoreconfig-datacatalogconfig","Required":false,"Type":"DataCatalogConfig","UpdateType":"Immutable"},"DisableGlueTableCreation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-offlinestoreconfig.html#cfn-sagemaker-featuregroup-offlinestoreconfig-disablegluetablecreation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"S3StorageConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-offlinestoreconfig.html#cfn-sagemaker-featuregroup-offlinestoreconfig-s3storageconfig","Required":true,"Type":"S3StorageConfig","UpdateType":"Immutable"},"TableFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-offlinestoreconfig.html#cfn-sagemaker-featuregroup-offlinestoreconfig-tableformat","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::FeatureGroup.OnlineStoreConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-onlinestoreconfig.html","Properties":{"EnableOnlineStore":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-onlinestoreconfig.html#cfn-sagemaker-featuregroup-onlinestoreconfig-enableonlinestore","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"SecurityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-onlinestoreconfig.html#cfn-sagemaker-featuregroup-onlinestoreconfig-securityconfig","Required":false,"Type":"OnlineStoreSecurityConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::FeatureGroup.OnlineStoreSecurityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-onlinestoresecurityconfig.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-onlinestoresecurityconfig.html#cfn-sagemaker-featuregroup-onlinestoresecurityconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::FeatureGroup.S3StorageConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-s3storageconfig.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-s3storageconfig.html#cfn-sagemaker-featuregroup-s3storageconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-featuregroup-s3storageconfig.html#cfn-sagemaker-featuregroup-s3storageconfig-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::InferenceExperiment.CaptureContentTypeHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-capturecontenttypeheader.html","Properties":{"CsvContentTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-capturecontenttypeheader.html#cfn-sagemaker-inferenceexperiment-capturecontenttypeheader-csvcontenttypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"JsonContentTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-capturecontenttypeheader.html#cfn-sagemaker-inferenceexperiment-capturecontenttypeheader-jsoncontenttypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::InferenceExperiment.DataStorageConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-datastorageconfig.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-datastorageconfig.html#cfn-sagemaker-inferenceexperiment-datastorageconfig-contenttype","Required":false,"Type":"CaptureContentTypeHeader","UpdateType":"Mutable"},"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-datastorageconfig.html#cfn-sagemaker-inferenceexperiment-datastorageconfig-destination","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KmsKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-datastorageconfig.html#cfn-sagemaker-inferenceexperiment-datastorageconfig-kmskey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::InferenceExperiment.EndpointMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-endpointmetadata.html","Properties":{"EndpointConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-endpointmetadata.html#cfn-sagemaker-inferenceexperiment-endpointmetadata-endpointconfigname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-endpointmetadata.html#cfn-sagemaker-inferenceexperiment-endpointmetadata-endpointname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EndpointStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-endpointmetadata.html#cfn-sagemaker-inferenceexperiment-endpointmetadata-endpointstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::InferenceExperiment.InferenceExperimentSchedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-inferenceexperimentschedule.html","Properties":{"EndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-inferenceexperimentschedule.html#cfn-sagemaker-inferenceexperiment-inferenceexperimentschedule-endtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-inferenceexperimentschedule.html#cfn-sagemaker-inferenceexperiment-inferenceexperimentschedule-starttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::InferenceExperiment.ModelInfrastructureConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-modelinfrastructureconfig.html","Properties":{"InfrastructureType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-modelinfrastructureconfig.html#cfn-sagemaker-inferenceexperiment-modelinfrastructureconfig-infrastructuretype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RealTimeInferenceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-modelinfrastructureconfig.html#cfn-sagemaker-inferenceexperiment-modelinfrastructureconfig-realtimeinferenceconfig","Required":true,"Type":"RealTimeInferenceConfig","UpdateType":"Mutable"}}},"AWS::SageMaker::InferenceExperiment.ModelVariantConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-modelvariantconfig.html","Properties":{"InfrastructureConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-modelvariantconfig.html#cfn-sagemaker-inferenceexperiment-modelvariantconfig-infrastructureconfig","Required":true,"Type":"ModelInfrastructureConfig","UpdateType":"Mutable"},"ModelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-modelvariantconfig.html#cfn-sagemaker-inferenceexperiment-modelvariantconfig-modelname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VariantName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-modelvariantconfig.html#cfn-sagemaker-inferenceexperiment-modelvariantconfig-variantname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::InferenceExperiment.RealTimeInferenceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-realtimeinferenceconfig.html","Properties":{"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-realtimeinferenceconfig.html#cfn-sagemaker-inferenceexperiment-realtimeinferenceconfig-instancecount","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-realtimeinferenceconfig.html#cfn-sagemaker-inferenceexperiment-realtimeinferenceconfig-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::InferenceExperiment.ShadowModeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-shadowmodeconfig.html","Properties":{"ShadowModelVariants":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-shadowmodeconfig.html#cfn-sagemaker-inferenceexperiment-shadowmodeconfig-shadowmodelvariants","DuplicatesAllowed":true,"ItemType":"ShadowModelVariantConfig","Required":true,"Type":"List","UpdateType":"Mutable"},"SourceModelVariantName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-shadowmodeconfig.html#cfn-sagemaker-inferenceexperiment-shadowmodeconfig-sourcemodelvariantname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::InferenceExperiment.ShadowModelVariantConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-shadowmodelvariantconfig.html","Properties":{"SamplingPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-shadowmodelvariantconfig.html#cfn-sagemaker-inferenceexperiment-shadowmodelvariantconfig-samplingpercentage","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ShadowModelVariantName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-inferenceexperiment-shadowmodelvariantconfig.html#cfn-sagemaker-inferenceexperiment-shadowmodelvariantconfig-shadowmodelvariantname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::Model.ContainerDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html","Properties":{"ContainerHostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html#cfn-sagemaker-model-containerdefinition-containerhostname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html#cfn-sagemaker-model-containerdefinition-environment","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"Image":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html#cfn-sagemaker-model-containerdefinition-image","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ImageConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html#cfn-sagemaker-model-containerdefinition-imageconfig","Required":false,"Type":"ImageConfig","UpdateType":"Immutable"},"InferenceSpecificationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html#cfn-sagemaker-model-containerdefinition-inferencespecificationname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html#cfn-sagemaker-model-containerdefinition-mode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ModelDataUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html#cfn-sagemaker-model-containerdefinition-modeldataurl","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ModelPackageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html#cfn-sagemaker-model-containerdefinition-modelpackagename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MultiModelConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition.html#cfn-sagemaker-model-containerdefinition-multimodelconfig","Required":false,"Type":"MultiModelConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::Model.ImageConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition-imageconfig.html","Properties":{"RepositoryAccessMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition-imageconfig.html#cfn-sagemaker-model-containerdefinition-imageconfig-repositoryaccessmode","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RepositoryAuthConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition-imageconfig.html#cfn-sagemaker-model-containerdefinition-imageconfig-repositoryauthconfig","Required":false,"Type":"RepositoryAuthConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::Model.InferenceExecutionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-inferenceexecutionconfig.html","Properties":{"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-inferenceexecutionconfig.html#cfn-sagemaker-model-inferenceexecutionconfig-mode","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::Model.MultiModelConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition-multimodelconfig.html","Properties":{"ModelCacheSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition-multimodelconfig.html#cfn-sagemaker-model-containerdefinition-multimodelconfig-modelcachesetting","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::Model.RepositoryAuthConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition-imageconfig-repositoryauthconfig.html","Properties":{"RepositoryCredentialsProviderArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-containerdefinition-imageconfig-repositoryauthconfig.html#cfn-sagemaker-model-containerdefinition-imageconfig-repositoryauthconfig-repositorycredentialsproviderarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::Model.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-vpcconfig.html#cfn-sagemaker-model-vpcconfig-securitygroupids","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-model-vpcconfig.html#cfn-sagemaker-model-vpcconfig-subnets","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.BatchTransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html","Properties":{"DataCapturedDestinationS3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html#cfn-sagemaker-modelbiasjobdefinition-batchtransforminput-datacaptureddestinations3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatasetFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html#cfn-sagemaker-modelbiasjobdefinition-batchtransforminput-datasetformat","Required":true,"Type":"DatasetFormat","UpdateType":"Immutable"},"EndTimeOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html#cfn-sagemaker-modelbiasjobdefinition-batchtransforminput-endtimeoffset","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FeaturesAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html#cfn-sagemaker-modelbiasjobdefinition-batchtransforminput-featuresattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InferenceAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html#cfn-sagemaker-modelbiasjobdefinition-batchtransforminput-inferenceattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html#cfn-sagemaker-modelbiasjobdefinition-batchtransforminput-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProbabilityAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html#cfn-sagemaker-modelbiasjobdefinition-batchtransforminput-probabilityattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProbabilityThresholdAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html#cfn-sagemaker-modelbiasjobdefinition-batchtransforminput-probabilitythresholdattribute","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"S3DataDistributionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html#cfn-sagemaker-modelbiasjobdefinition-batchtransforminput-s3datadistributiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3InputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html#cfn-sagemaker-modelbiasjobdefinition-batchtransforminput-s3inputmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StartTimeOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-batchtransforminput.html#cfn-sagemaker-modelbiasjobdefinition-batchtransforminput-starttimeoffset","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-clusterconfig.html","Properties":{"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-clusterconfig.html#cfn-sagemaker-modelbiasjobdefinition-clusterconfig-instancecount","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-clusterconfig.html#cfn-sagemaker-modelbiasjobdefinition-clusterconfig-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VolumeKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-clusterconfig.html#cfn-sagemaker-modelbiasjobdefinition-clusterconfig-volumekmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VolumeSizeInGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-clusterconfig.html#cfn-sagemaker-modelbiasjobdefinition-clusterconfig-volumesizeingb","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.ConstraintsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-constraintsresource.html","Properties":{"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-constraintsresource.html#cfn-sagemaker-modelbiasjobdefinition-constraintsresource-s3uri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-csv.html","Properties":{"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-csv.html#cfn-sagemaker-modelbiasjobdefinition-csv-header","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.DatasetFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-datasetformat.html","Properties":{"Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-datasetformat.html#cfn-sagemaker-modelbiasjobdefinition-datasetformat-csv","Required":false,"Type":"Csv","UpdateType":"Immutable"},"Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-datasetformat.html#cfn-sagemaker-modelbiasjobdefinition-datasetformat-json","Required":false,"Type":"Json","UpdateType":"Immutable"},"Parquet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-datasetformat.html#cfn-sagemaker-modelbiasjobdefinition-datasetformat-parquet","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.EndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-endpointinput.html","Properties":{"EndTimeOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-endpointinput.html#cfn-sagemaker-modelbiasjobdefinition-endpointinput-endtimeoffset","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-endpointinput.html#cfn-sagemaker-modelbiasjobdefinition-endpointinput-endpointname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FeaturesAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-endpointinput.html#cfn-sagemaker-modelbiasjobdefinition-endpointinput-featuresattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InferenceAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-endpointinput.html#cfn-sagemaker-modelbiasjobdefinition-endpointinput-inferenceattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-endpointinput.html#cfn-sagemaker-modelbiasjobdefinition-endpointinput-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProbabilityAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-endpointinput.html#cfn-sagemaker-modelbiasjobdefinition-endpointinput-probabilityattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProbabilityThresholdAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-endpointinput.html#cfn-sagemaker-modelbiasjobdefinition-endpointinput-probabilitythresholdattribute","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"S3DataDistributionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-endpointinput.html#cfn-sagemaker-modelbiasjobdefinition-endpointinput-s3datadistributiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3InputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-endpointinput.html#cfn-sagemaker-modelbiasjobdefinition-endpointinput-s3inputmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StartTimeOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-endpointinput.html#cfn-sagemaker-modelbiasjobdefinition-endpointinput-starttimeoffset","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-json.html","Properties":{"Line":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-json.html#cfn-sagemaker-modelbiasjobdefinition-json-line","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.ModelBiasAppSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-modelbiasappspecification.html","Properties":{"ConfigUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-modelbiasappspecification.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasappspecification-configuri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-modelbiasappspecification.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasappspecification-environment","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"ImageUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-modelbiasappspecification.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasappspecification-imageuri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.ModelBiasBaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-modelbiasbaselineconfig.html","Properties":{"BaseliningJobName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-modelbiasbaselineconfig.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasbaselineconfig-baseliningjobname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConstraintsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-modelbiasbaselineconfig.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasbaselineconfig-constraintsresource","Required":false,"Type":"ConstraintsResource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.ModelBiasJobInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-modelbiasjobinput.html","Properties":{"BatchTransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-modelbiasjobinput.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasjobinput-batchtransforminput","Required":false,"Type":"BatchTransformInput","UpdateType":"Immutable"},"EndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-modelbiasjobinput.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasjobinput-endpointinput","Required":false,"Type":"EndpointInput","UpdateType":"Immutable"},"GroundTruthS3Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-modelbiasjobinput.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasjobinput-groundtruths3input","Required":true,"Type":"MonitoringGroundTruthS3Input","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.MonitoringGroundTruthS3Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-monitoringgroundtruths3input.html","Properties":{"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-monitoringgroundtruths3input.html#cfn-sagemaker-modelbiasjobdefinition-monitoringgroundtruths3input-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.MonitoringOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-monitoringoutput.html","Properties":{"S3Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-monitoringoutput.html#cfn-sagemaker-modelbiasjobdefinition-monitoringoutput-s3output","Required":true,"Type":"S3Output","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.MonitoringOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-monitoringoutputconfig.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-monitoringoutputconfig.html#cfn-sagemaker-modelbiasjobdefinition-monitoringoutputconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MonitoringOutputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-monitoringoutputconfig.html#cfn-sagemaker-modelbiasjobdefinition-monitoringoutputconfig-monitoringoutputs","DuplicatesAllowed":true,"ItemType":"MonitoringOutput","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.MonitoringResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-monitoringresources.html","Properties":{"ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-monitoringresources.html#cfn-sagemaker-modelbiasjobdefinition-monitoringresources-clusterconfig","Required":true,"Type":"ClusterConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.NetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-networkconfig.html","Properties":{"EnableInterContainerTrafficEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-networkconfig.html#cfn-sagemaker-modelbiasjobdefinition-networkconfig-enableintercontainertrafficencryption","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"EnableNetworkIsolation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-networkconfig.html#cfn-sagemaker-modelbiasjobdefinition-networkconfig-enablenetworkisolation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-networkconfig.html#cfn-sagemaker-modelbiasjobdefinition-networkconfig-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.S3Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-s3output.html","Properties":{"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-s3output.html#cfn-sagemaker-modelbiasjobdefinition-s3output-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3UploadMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-s3output.html#cfn-sagemaker-modelbiasjobdefinition-s3output-s3uploadmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-s3output.html#cfn-sagemaker-modelbiasjobdefinition-s3output-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.StoppingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-stoppingcondition.html","Properties":{"MaxRuntimeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-stoppingcondition.html#cfn-sagemaker-modelbiasjobdefinition-stoppingcondition-maxruntimeinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-vpcconfig.html#cfn-sagemaker-modelbiasjobdefinition-vpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelbiasjobdefinition-vpcconfig.html#cfn-sagemaker-modelbiasjobdefinition-vpcconfig-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelCard.AdditionalInformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-additionalinformation.html","Properties":{"CaveatsAndRecommendations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-additionalinformation.html#cfn-sagemaker-modelcard-additionalinformation-caveatsandrecommendations","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-additionalinformation.html#cfn-sagemaker-modelcard-additionalinformation-customdetails","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"EthicalConsiderations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-additionalinformation.html#cfn-sagemaker-modelcard-additionalinformation-ethicalconsiderations","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.BusinessDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-businessdetails.html","Properties":{"BusinessProblem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-businessdetails.html#cfn-sagemaker-modelcard-businessdetails-businessproblem","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BusinessStakeholders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-businessdetails.html#cfn-sagemaker-modelcard-businessdetails-businessstakeholders","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LineOfBusiness":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-businessdetails.html#cfn-sagemaker-modelcard-businessdetails-lineofbusiness","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.Container":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-container.html","Properties":{"Image":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-container.html#cfn-sagemaker-modelcard-container-image","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ModelDataUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-container.html#cfn-sagemaker-modelcard-container-modeldataurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NearestModelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-container.html#cfn-sagemaker-modelcard-container-nearestmodelname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-content.html","Properties":{"AdditionalInformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-content.html#cfn-sagemaker-modelcard-content-additionalinformation","Required":false,"Type":"AdditionalInformation","UpdateType":"Mutable"},"BusinessDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-content.html#cfn-sagemaker-modelcard-content-businessdetails","Required":false,"Type":"BusinessDetails","UpdateType":"Mutable"},"EvaluationDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-content.html#cfn-sagemaker-modelcard-content-evaluationdetails","DuplicatesAllowed":true,"ItemType":"EvaluationDetail","Required":false,"Type":"List","UpdateType":"Mutable"},"IntendedUses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-content.html#cfn-sagemaker-modelcard-content-intendeduses","Required":false,"Type":"IntendedUses","UpdateType":"Mutable"},"ModelOverview":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-content.html#cfn-sagemaker-modelcard-content-modeloverview","Required":false,"Type":"ModelOverview","UpdateType":"Mutable"},"ModelPackageDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-content.html#cfn-sagemaker-modelcard-content-modelpackagedetails","Required":false,"Type":"ModelPackageDetails","UpdateType":"Mutable"},"TrainingDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-content.html#cfn-sagemaker-modelcard-content-trainingdetails","Required":false,"Type":"TrainingDetails","UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.EvaluationDetail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-evaluationdetail.html","Properties":{"Datasets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-evaluationdetail.html#cfn-sagemaker-modelcard-evaluationdetail-datasets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"EvaluationJobArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-evaluationdetail.html#cfn-sagemaker-modelcard-evaluationdetail-evaluationjobarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EvaluationObservation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-evaluationdetail.html#cfn-sagemaker-modelcard-evaluationdetail-evaluationobservation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Metadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-evaluationdetail.html#cfn-sagemaker-modelcard-evaluationdetail-metadata","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"MetricGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-evaluationdetail.html#cfn-sagemaker-modelcard-evaluationdetail-metricgroups","DuplicatesAllowed":true,"ItemType":"MetricGroup","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-evaluationdetail.html#cfn-sagemaker-modelcard-evaluationdetail-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.Function":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-function.html","Properties":{"Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-function.html#cfn-sagemaker-modelcard-function-condition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Facet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-function.html#cfn-sagemaker-modelcard-function-facet","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Function":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-function.html#cfn-sagemaker-modelcard-function-function","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.InferenceEnvironment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-inferenceenvironment.html","Properties":{"ContainerImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-inferenceenvironment.html#cfn-sagemaker-modelcard-inferenceenvironment-containerimage","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.InferenceSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-inferencespecification.html","Properties":{"Containers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-inferencespecification.html#cfn-sagemaker-modelcard-inferencespecification-containers","DuplicatesAllowed":true,"ItemType":"Container","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.IntendedUses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-intendeduses.html","Properties":{"ExplanationsForRiskRating":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-intendeduses.html#cfn-sagemaker-modelcard-intendeduses-explanationsforriskrating","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FactorsAffectingModelEfficiency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-intendeduses.html#cfn-sagemaker-modelcard-intendeduses-factorsaffectingmodelefficiency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntendedUses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-intendeduses.html#cfn-sagemaker-modelcard-intendeduses-intendeduses","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PurposeOfModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-intendeduses.html#cfn-sagemaker-modelcard-intendeduses-purposeofmodel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RiskRating":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-intendeduses.html#cfn-sagemaker-modelcard-intendeduses-riskrating","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.MetricDataItems":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-metricdataitems.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-metricdataitems.html#cfn-sagemaker-modelcard-metricdataitems-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Notes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-metricdataitems.html#cfn-sagemaker-modelcard-metricdataitems-notes","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-metricdataitems.html#cfn-sagemaker-modelcard-metricdataitems-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-metricdataitems.html#cfn-sagemaker-modelcard-metricdataitems-value","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"XAxisName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-metricdataitems.html#cfn-sagemaker-modelcard-metricdataitems-xaxisname","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"YAxisName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-metricdataitems.html#cfn-sagemaker-modelcard-metricdataitems-yaxisname","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.MetricGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-metricgroup.html","Properties":{"MetricData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-metricgroup.html#cfn-sagemaker-modelcard-metricgroup-metricdata","DuplicatesAllowed":true,"ItemType":"MetricDataItems","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-metricgroup.html#cfn-sagemaker-modelcard-metricgroup-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.ModelOverview":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modeloverview.html","Properties":{"AlgorithmType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modeloverview.html#cfn-sagemaker-modelcard-modeloverview-algorithmtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InferenceEnvironment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modeloverview.html#cfn-sagemaker-modelcard-modeloverview-inferenceenvironment","Required":false,"Type":"InferenceEnvironment","UpdateType":"Mutable"},"ModelArtifact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modeloverview.html#cfn-sagemaker-modelcard-modeloverview-modelartifact","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ModelCreator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modeloverview.html#cfn-sagemaker-modelcard-modeloverview-modelcreator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modeloverview.html#cfn-sagemaker-modelcard-modeloverview-modeldescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modeloverview.html#cfn-sagemaker-modelcard-modeloverview-modelid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modeloverview.html#cfn-sagemaker-modelcard-modeloverview-modelname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modeloverview.html#cfn-sagemaker-modelcard-modeloverview-modelowner","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modeloverview.html#cfn-sagemaker-modelcard-modeloverview-modelversion","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ProblemType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modeloverview.html#cfn-sagemaker-modelcard-modeloverview-problemtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.ModelPackageCreator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagecreator.html","Properties":{"UserProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagecreator.html#cfn-sagemaker-modelcard-modelpackagecreator-userprofilename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.ModelPackageDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html","Properties":{"ApprovalDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-approvaldescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CreatedBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-createdby","Required":false,"Type":"ModelPackageCreator","UpdateType":"Mutable"},"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-domain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InferenceSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-inferencespecification","Required":false,"Type":"InferenceSpecification","UpdateType":"Mutable"},"ModelApprovalStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-modelapprovalstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelPackageArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-modelpackagearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelPackageDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-modelpackagedescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelPackageGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-modelpackagegroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelPackageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-modelpackagename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelPackageStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-modelpackagestatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelPackageVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-modelpackageversion","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"SourceAlgorithms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-sourcealgorithms","DuplicatesAllowed":true,"ItemType":"SourceAlgorithm","Required":false,"Type":"List","UpdateType":"Mutable"},"Task":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-modelpackagedetails.html#cfn-sagemaker-modelcard-modelpackagedetails-task","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.ObjectiveFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-objectivefunction.html","Properties":{"Function":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-objectivefunction.html#cfn-sagemaker-modelcard-objectivefunction-function","Required":false,"Type":"Function","UpdateType":"Mutable"},"Notes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-objectivefunction.html#cfn-sagemaker-modelcard-objectivefunction-notes","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.SecurityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-securityconfig.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-securityconfig.html#cfn-sagemaker-modelcard-securityconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelCard.SourceAlgorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-sourcealgorithm.html","Properties":{"AlgorithmName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-sourcealgorithm.html#cfn-sagemaker-modelcard-sourcealgorithm-algorithmname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ModelDataUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-sourcealgorithm.html#cfn-sagemaker-modelcard-sourcealgorithm-modeldataurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.TrainingDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingdetails.html","Properties":{"ObjectiveFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingdetails.html#cfn-sagemaker-modelcard-trainingdetails-objectivefunction","Required":false,"Type":"ObjectiveFunction","UpdateType":"Mutable"},"TrainingJobDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingdetails.html#cfn-sagemaker-modelcard-trainingdetails-trainingjobdetails","Required":false,"Type":"TrainingJobDetails","UpdateType":"Mutable"},"TrainingObservations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingdetails.html#cfn-sagemaker-modelcard-trainingdetails-trainingobservations","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.TrainingEnvironment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingenvironment.html","Properties":{"ContainerImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingenvironment.html#cfn-sagemaker-modelcard-trainingenvironment-containerimage","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.TrainingHyperParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-traininghyperparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-traininghyperparameter.html#cfn-sagemaker-modelcard-traininghyperparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-traininghyperparameter.html#cfn-sagemaker-modelcard-traininghyperparameter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.TrainingJobDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingjobdetails.html","Properties":{"HyperParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingjobdetails.html#cfn-sagemaker-modelcard-trainingjobdetails-hyperparameters","DuplicatesAllowed":true,"ItemType":"TrainingHyperParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"TrainingArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingjobdetails.html#cfn-sagemaker-modelcard-trainingjobdetails-trainingarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TrainingDatasets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingjobdetails.html#cfn-sagemaker-modelcard-trainingjobdetails-trainingdatasets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TrainingEnvironment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingjobdetails.html#cfn-sagemaker-modelcard-trainingjobdetails-trainingenvironment","Required":false,"Type":"TrainingEnvironment","UpdateType":"Mutable"},"TrainingMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingjobdetails.html#cfn-sagemaker-modelcard-trainingjobdetails-trainingmetrics","DuplicatesAllowed":true,"ItemType":"TrainingMetric","Required":false,"Type":"List","UpdateType":"Mutable"},"UserProvidedHyperParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingjobdetails.html#cfn-sagemaker-modelcard-trainingjobdetails-userprovidedhyperparameters","DuplicatesAllowed":true,"ItemType":"TrainingHyperParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"UserProvidedTrainingMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingjobdetails.html#cfn-sagemaker-modelcard-trainingjobdetails-userprovidedtrainingmetrics","DuplicatesAllowed":true,"ItemType":"TrainingMetric","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.TrainingMetric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingmetric.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingmetric.html#cfn-sagemaker-modelcard-trainingmetric-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Notes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingmetric.html#cfn-sagemaker-modelcard-trainingmetric-notes","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-trainingmetric.html#cfn-sagemaker-modelcard-trainingmetric-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelCard.UserContext":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-usercontext.html","Properties":{"DomainId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-usercontext.html#cfn-sagemaker-modelcard-usercontext-domainid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserProfileArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-usercontext.html#cfn-sagemaker-modelcard-usercontext-userprofilearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelcard-usercontext.html#cfn-sagemaker-modelcard-usercontext-userprofilename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.BatchTransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-batchtransforminput.html","Properties":{"DataCapturedDestinationS3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelexplainabilityjobdefinition-batchtransforminput-datacaptureddestinations3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatasetFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelexplainabilityjobdefinition-batchtransforminput-datasetformat","Required":true,"Type":"DatasetFormat","UpdateType":"Immutable"},"FeaturesAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelexplainabilityjobdefinition-batchtransforminput-featuresattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InferenceAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelexplainabilityjobdefinition-batchtransforminput-inferenceattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelexplainabilityjobdefinition-batchtransforminput-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProbabilityAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelexplainabilityjobdefinition-batchtransforminput-probabilityattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3DataDistributionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelexplainabilityjobdefinition-batchtransforminput-s3datadistributiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3InputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelexplainabilityjobdefinition-batchtransforminput-s3inputmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-clusterconfig.html","Properties":{"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-clusterconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-clusterconfig-instancecount","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-clusterconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-clusterconfig-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VolumeKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-clusterconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-clusterconfig-volumekmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VolumeSizeInGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-clusterconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-clusterconfig-volumesizeingb","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.ConstraintsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-constraintsresource.html","Properties":{"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-constraintsresource.html#cfn-sagemaker-modelexplainabilityjobdefinition-constraintsresource-s3uri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-csv.html","Properties":{"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-csv.html#cfn-sagemaker-modelexplainabilityjobdefinition-csv-header","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.DatasetFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-datasetformat.html","Properties":{"Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-datasetformat.html#cfn-sagemaker-modelexplainabilityjobdefinition-datasetformat-csv","Required":false,"Type":"Csv","UpdateType":"Immutable"},"Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-datasetformat.html#cfn-sagemaker-modelexplainabilityjobdefinition-datasetformat-json","Required":false,"Type":"Json","UpdateType":"Immutable"},"Parquet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-datasetformat.html#cfn-sagemaker-modelexplainabilityjobdefinition-datasetformat-parquet","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.EndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-endpointinput.html","Properties":{"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-endpointinput.html#cfn-sagemaker-modelexplainabilityjobdefinition-endpointinput-endpointname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FeaturesAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-endpointinput.html#cfn-sagemaker-modelexplainabilityjobdefinition-endpointinput-featuresattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InferenceAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-endpointinput.html#cfn-sagemaker-modelexplainabilityjobdefinition-endpointinput-inferenceattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-endpointinput.html#cfn-sagemaker-modelexplainabilityjobdefinition-endpointinput-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProbabilityAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-endpointinput.html#cfn-sagemaker-modelexplainabilityjobdefinition-endpointinput-probabilityattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3DataDistributionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-endpointinput.html#cfn-sagemaker-modelexplainabilityjobdefinition-endpointinput-s3datadistributiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3InputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-endpointinput.html#cfn-sagemaker-modelexplainabilityjobdefinition-endpointinput-s3inputmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-json.html","Properties":{"Line":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-json.html#cfn-sagemaker-modelexplainabilityjobdefinition-json-line","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.ModelExplainabilityAppSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityappspecification.html","Properties":{"ConfigUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityappspecification.html#cfn-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityappspecification-configuri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityappspecification.html#cfn-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityappspecification-environment","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"ImageUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityappspecification.html#cfn-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityappspecification-imageuri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.ModelExplainabilityBaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-modelexplainabilitybaselineconfig.html","Properties":{"BaseliningJobName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-modelexplainabilitybaselineconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-modelexplainabilitybaselineconfig-baseliningjobname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConstraintsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-modelexplainabilitybaselineconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-modelexplainabilitybaselineconfig-constraintsresource","Required":false,"Type":"ConstraintsResource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.ModelExplainabilityJobInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityjobinput.html","Properties":{"BatchTransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityjobinput.html#cfn-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityjobinput-batchtransforminput","Required":false,"Type":"BatchTransformInput","UpdateType":"Immutable"},"EndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityjobinput.html#cfn-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityjobinput-endpointinput","Required":false,"Type":"EndpointInput","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.MonitoringOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-monitoringoutput.html","Properties":{"S3Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-monitoringoutput.html#cfn-sagemaker-modelexplainabilityjobdefinition-monitoringoutput-s3output","Required":true,"Type":"S3Output","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.MonitoringOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-monitoringoutputconfig.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-monitoringoutputconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-monitoringoutputconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MonitoringOutputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-monitoringoutputconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-monitoringoutputconfig-monitoringoutputs","DuplicatesAllowed":true,"ItemType":"MonitoringOutput","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.MonitoringResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-monitoringresources.html","Properties":{"ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-monitoringresources.html#cfn-sagemaker-modelexplainabilityjobdefinition-monitoringresources-clusterconfig","Required":true,"Type":"ClusterConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.NetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-networkconfig.html","Properties":{"EnableInterContainerTrafficEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-networkconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-networkconfig-enableintercontainertrafficencryption","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"EnableNetworkIsolation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-networkconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-networkconfig-enablenetworkisolation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-networkconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-networkconfig-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.S3Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-s3output.html","Properties":{"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-s3output.html#cfn-sagemaker-modelexplainabilityjobdefinition-s3output-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3UploadMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-s3output.html#cfn-sagemaker-modelexplainabilityjobdefinition-s3output-s3uploadmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-s3output.html#cfn-sagemaker-modelexplainabilityjobdefinition-s3output-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.StoppingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-stoppingcondition.html","Properties":{"MaxRuntimeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-stoppingcondition.html#cfn-sagemaker-modelexplainabilityjobdefinition-stoppingcondition-maxruntimeinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-vpcconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-vpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelexplainabilityjobdefinition-vpcconfig.html#cfn-sagemaker-modelexplainabilityjobdefinition-vpcconfig-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.AdditionalInferenceSpecificationDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-additionalinferencespecificationdefinition.html","Properties":{"Containers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-additionalinferencespecificationdefinition.html#cfn-sagemaker-modelpackage-additionalinferencespecificationdefinition-containers","DuplicatesAllowed":true,"ItemType":"ModelPackageContainerDefinition","Required":true,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-additionalinferencespecificationdefinition.html#cfn-sagemaker-modelpackage-additionalinferencespecificationdefinition-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-additionalinferencespecificationdefinition.html#cfn-sagemaker-modelpackage-additionalinferencespecificationdefinition-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SupportedContentTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-additionalinferencespecificationdefinition.html#cfn-sagemaker-modelpackage-additionalinferencespecificationdefinition-supportedcontenttypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SupportedRealtimeInferenceInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-additionalinferencespecificationdefinition.html#cfn-sagemaker-modelpackage-additionalinferencespecificationdefinition-supportedrealtimeinferenceinstancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SupportedResponseMIMETypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-additionalinferencespecificationdefinition.html#cfn-sagemaker-modelpackage-additionalinferencespecificationdefinition-supportedresponsemimetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SupportedTransformInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-additionalinferencespecificationdefinition.html#cfn-sagemaker-modelpackage-additionalinferencespecificationdefinition-supportedtransforminstancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::ModelPackage.Bias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-bias.html","Properties":{"PostTrainingReport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-bias.html#cfn-sagemaker-modelpackage-bias-posttrainingreport","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"},"PreTrainingReport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-bias.html#cfn-sagemaker-modelpackage-bias-pretrainingreport","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"},"Report":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-bias.html#cfn-sagemaker-modelpackage-bias-report","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-datasource.html","Properties":{"S3DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-datasource.html#cfn-sagemaker-modelpackage-datasource-s3datasource","Required":true,"Type":"S3DataSource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.DriftCheckBaselines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckbaselines.html","Properties":{"Bias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckbaselines.html#cfn-sagemaker-modelpackage-driftcheckbaselines-bias","Required":false,"Type":"DriftCheckBias","UpdateType":"Immutable"},"Explainability":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckbaselines.html#cfn-sagemaker-modelpackage-driftcheckbaselines-explainability","Required":false,"Type":"DriftCheckExplainability","UpdateType":"Immutable"},"ModelDataQuality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckbaselines.html#cfn-sagemaker-modelpackage-driftcheckbaselines-modeldataquality","Required":false,"Type":"DriftCheckModelDataQuality","UpdateType":"Immutable"},"ModelQuality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckbaselines.html#cfn-sagemaker-modelpackage-driftcheckbaselines-modelquality","Required":false,"Type":"DriftCheckModelQuality","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.DriftCheckBias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckbias.html","Properties":{"ConfigFile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckbias.html#cfn-sagemaker-modelpackage-driftcheckbias-configfile","Required":false,"Type":"FileSource","UpdateType":"Immutable"},"PostTrainingConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckbias.html#cfn-sagemaker-modelpackage-driftcheckbias-posttrainingconstraints","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"},"PreTrainingConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckbias.html#cfn-sagemaker-modelpackage-driftcheckbias-pretrainingconstraints","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.DriftCheckExplainability":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckexplainability.html","Properties":{"ConfigFile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckexplainability.html#cfn-sagemaker-modelpackage-driftcheckexplainability-configfile","Required":false,"Type":"FileSource","UpdateType":"Immutable"},"Constraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckexplainability.html#cfn-sagemaker-modelpackage-driftcheckexplainability-constraints","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.DriftCheckModelDataQuality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckmodeldataquality.html","Properties":{"Constraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckmodeldataquality.html#cfn-sagemaker-modelpackage-driftcheckmodeldataquality-constraints","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"},"Statistics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckmodeldataquality.html#cfn-sagemaker-modelpackage-driftcheckmodeldataquality-statistics","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.DriftCheckModelQuality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckmodelquality.html","Properties":{"Constraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckmodelquality.html#cfn-sagemaker-modelpackage-driftcheckmodelquality-constraints","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"},"Statistics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-driftcheckmodelquality.html#cfn-sagemaker-modelpackage-driftcheckmodelquality-statistics","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.Explainability":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-explainability.html","Properties":{"Report":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-explainability.html#cfn-sagemaker-modelpackage-explainability-report","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.FileSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-filesource.html","Properties":{"ContentDigest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-filesource.html#cfn-sagemaker-modelpackage-filesource-contentdigest","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-filesource.html#cfn-sagemaker-modelpackage-filesource-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-filesource.html#cfn-sagemaker-modelpackage-filesource-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.InferenceSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-inferencespecification.html","Properties":{"Containers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-inferencespecification.html#cfn-sagemaker-modelpackage-inferencespecification-containers","DuplicatesAllowed":false,"ItemType":"ModelPackageContainerDefinition","Required":true,"Type":"List","UpdateType":"Immutable"},"SupportedContentTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-inferencespecification.html#cfn-sagemaker-modelpackage-inferencespecification-supportedcontenttypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"SupportedRealtimeInferenceInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-inferencespecification.html#cfn-sagemaker-modelpackage-inferencespecification-supportedrealtimeinferenceinstancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SupportedResponseMIMETypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-inferencespecification.html#cfn-sagemaker-modelpackage-inferencespecification-supportedresponsemimetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"SupportedTransformInstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-inferencespecification.html#cfn-sagemaker-modelpackage-inferencespecification-supportedtransforminstancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.MetadataProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-metadataproperties.html","Properties":{"CommitId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-metadataproperties.html#cfn-sagemaker-modelpackage-metadataproperties-commitid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GeneratedBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-metadataproperties.html#cfn-sagemaker-modelpackage-metadataproperties-generatedby","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProjectId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-metadataproperties.html#cfn-sagemaker-modelpackage-metadataproperties-projectid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Repository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-metadataproperties.html#cfn-sagemaker-modelpackage-metadataproperties-repository","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.MetricsSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-metricssource.html","Properties":{"ContentDigest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-metricssource.html#cfn-sagemaker-modelpackage-metricssource-contentdigest","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-metricssource.html#cfn-sagemaker-modelpackage-metricssource-contenttype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-metricssource.html#cfn-sagemaker-modelpackage-metricssource-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.ModelDataQuality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modeldataquality.html","Properties":{"Constraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modeldataquality.html#cfn-sagemaker-modelpackage-modeldataquality-constraints","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"},"Statistics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modeldataquality.html#cfn-sagemaker-modelpackage-modeldataquality-statistics","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.ModelInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelinput.html","Properties":{"DataInputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelinput.html#cfn-sagemaker-modelpackage-modelinput-datainputconfig","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"}}},"AWS::SageMaker::ModelPackage.ModelMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelmetrics.html","Properties":{"Bias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelmetrics.html#cfn-sagemaker-modelpackage-modelmetrics-bias","Required":false,"Type":"Bias","UpdateType":"Immutable"},"Explainability":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelmetrics.html#cfn-sagemaker-modelpackage-modelmetrics-explainability","Required":false,"Type":"Explainability","UpdateType":"Immutable"},"ModelDataQuality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelmetrics.html#cfn-sagemaker-modelpackage-modelmetrics-modeldataquality","Required":false,"Type":"ModelDataQuality","UpdateType":"Immutable"},"ModelQuality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelmetrics.html#cfn-sagemaker-modelpackage-modelmetrics-modelquality","Required":false,"Type":"ModelQuality","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.ModelPackageContainerDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html","Properties":{"ContainerHostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html#cfn-sagemaker-modelpackage-modelpackagecontainerdefinition-containerhostname","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html#cfn-sagemaker-modelpackage-modelpackagecontainerdefinition-environment","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Conditional"},"Framework":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html#cfn-sagemaker-modelpackage-modelpackagecontainerdefinition-framework","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"FrameworkVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html#cfn-sagemaker-modelpackage-modelpackagecontainerdefinition-frameworkversion","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Image":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html#cfn-sagemaker-modelpackage-modelpackagecontainerdefinition-image","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"},"ImageDigest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html#cfn-sagemaker-modelpackage-modelpackagecontainerdefinition-imagedigest","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"ModelDataUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html#cfn-sagemaker-modelpackage-modelpackagecontainerdefinition-modeldataurl","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"ModelInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html#cfn-sagemaker-modelpackage-modelpackagecontainerdefinition-modelinput","PrimitiveType":"Json","Required":false,"UpdateType":"Conditional"},"NearestModelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagecontainerdefinition.html#cfn-sagemaker-modelpackage-modelpackagecontainerdefinition-nearestmodelname","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"}}},"AWS::SageMaker::ModelPackage.ModelPackageStatusDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagestatusdetails.html","Properties":{"ValidationStatuses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagestatusdetails.html#cfn-sagemaker-modelpackage-modelpackagestatusdetails-validationstatuses","DuplicatesAllowed":true,"ItemType":"ModelPackageStatusItem","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::ModelPackage.ModelPackageStatusItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagestatusitem.html","Properties":{"FailureReason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagestatusitem.html#cfn-sagemaker-modelpackage-modelpackagestatusitem-failurereason","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagestatusitem.html#cfn-sagemaker-modelpackage-modelpackagestatusitem-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelpackagestatusitem.html#cfn-sagemaker-modelpackage-modelpackagestatusitem-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::ModelPackage.ModelQuality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelquality.html","Properties":{"Constraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelquality.html#cfn-sagemaker-modelpackage-modelquality-constraints","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"},"Statistics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-modelquality.html#cfn-sagemaker-modelpackage-modelquality-statistics","Required":false,"Type":"MetricsSource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.S3DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-s3datasource.html","Properties":{"S3DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-s3datasource.html#cfn-sagemaker-modelpackage-s3datasource-s3datatype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-s3datasource.html#cfn-sagemaker-modelpackage-s3datasource-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.SourceAlgorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-sourcealgorithm.html","Properties":{"AlgorithmName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-sourcealgorithm.html#cfn-sagemaker-modelpackage-sourcealgorithm-algorithmname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ModelDataUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-sourcealgorithm.html#cfn-sagemaker-modelpackage-sourcealgorithm-modeldataurl","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.SourceAlgorithmSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-sourcealgorithmspecification.html","Properties":{"SourceAlgorithms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-sourcealgorithmspecification.html#cfn-sagemaker-modelpackage-sourcealgorithmspecification-sourcealgorithms","DuplicatesAllowed":true,"ItemType":"SourceAlgorithm","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.TransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transforminput.html","Properties":{"CompressionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transforminput.html#cfn-sagemaker-modelpackage-transforminput-compressiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transforminput.html#cfn-sagemaker-modelpackage-transforminput-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transforminput.html#cfn-sagemaker-modelpackage-transforminput-datasource","Required":true,"Type":"DataSource","UpdateType":"Immutable"},"SplitType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transforminput.html#cfn-sagemaker-modelpackage-transforminput-splittype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.TransformJobDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformjobdefinition.html","Properties":{"BatchStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformjobdefinition.html#cfn-sagemaker-modelpackage-transformjobdefinition-batchstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformjobdefinition.html#cfn-sagemaker-modelpackage-transformjobdefinition-environment","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"MaxConcurrentTransforms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformjobdefinition.html#cfn-sagemaker-modelpackage-transformjobdefinition-maxconcurrenttransforms","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MaxPayloadInMB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformjobdefinition.html#cfn-sagemaker-modelpackage-transformjobdefinition-maxpayloadinmb","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"TransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformjobdefinition.html#cfn-sagemaker-modelpackage-transformjobdefinition-transforminput","Required":true,"Type":"TransformInput","UpdateType":"Immutable"},"TransformOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformjobdefinition.html#cfn-sagemaker-modelpackage-transformjobdefinition-transformoutput","Required":true,"Type":"TransformOutput","UpdateType":"Immutable"},"TransformResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformjobdefinition.html#cfn-sagemaker-modelpackage-transformjobdefinition-transformresources","Required":true,"Type":"TransformResources","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.TransformOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformoutput.html","Properties":{"Accept":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformoutput.html#cfn-sagemaker-modelpackage-transformoutput-accept","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AssembleWith":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformoutput.html#cfn-sagemaker-modelpackage-transformoutput-assemblewith","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformoutput.html#cfn-sagemaker-modelpackage-transformoutput-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3OutputPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformoutput.html#cfn-sagemaker-modelpackage-transformoutput-s3outputpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.TransformResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformresources.html","Properties":{"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformresources.html#cfn-sagemaker-modelpackage-transformresources-instancecount","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformresources.html#cfn-sagemaker-modelpackage-transformresources-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VolumeKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-transformresources.html#cfn-sagemaker-modelpackage-transformresources-volumekmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.ValidationProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-validationprofile.html","Properties":{"ProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-validationprofile.html#cfn-sagemaker-modelpackage-validationprofile-profilename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TransformJobDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-validationprofile.html#cfn-sagemaker-modelpackage-validationprofile-transformjobdefinition","Required":true,"Type":"TransformJobDefinition","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage.ValidationSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-validationspecification.html","Properties":{"ValidationProfiles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-validationspecification.html#cfn-sagemaker-modelpackage-validationspecification-validationprofiles","DuplicatesAllowed":true,"ItemType":"ValidationProfile","Required":true,"Type":"List","UpdateType":"Immutable"},"ValidationRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelpackage-validationspecification.html#cfn-sagemaker-modelpackage-validationspecification-validationrole","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.BatchTransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-batchtransforminput.html","Properties":{"DataCapturedDestinationS3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelqualityjobdefinition-batchtransforminput-datacaptureddestinations3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatasetFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelqualityjobdefinition-batchtransforminput-datasetformat","Required":true,"Type":"DatasetFormat","UpdateType":"Immutable"},"EndTimeOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelqualityjobdefinition-batchtransforminput-endtimeoffset","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InferenceAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelqualityjobdefinition-batchtransforminput-inferenceattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelqualityjobdefinition-batchtransforminput-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProbabilityAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelqualityjobdefinition-batchtransforminput-probabilityattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProbabilityThresholdAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelqualityjobdefinition-batchtransforminput-probabilitythresholdattribute","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"S3DataDistributionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelqualityjobdefinition-batchtransforminput-s3datadistributiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3InputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelqualityjobdefinition-batchtransforminput-s3inputmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StartTimeOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-batchtransforminput.html#cfn-sagemaker-modelqualityjobdefinition-batchtransforminput-starttimeoffset","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-clusterconfig.html","Properties":{"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-clusterconfig.html#cfn-sagemaker-modelqualityjobdefinition-clusterconfig-instancecount","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-clusterconfig.html#cfn-sagemaker-modelqualityjobdefinition-clusterconfig-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VolumeKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-clusterconfig.html#cfn-sagemaker-modelqualityjobdefinition-clusterconfig-volumekmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VolumeSizeInGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-clusterconfig.html#cfn-sagemaker-modelqualityjobdefinition-clusterconfig-volumesizeingb","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.ConstraintsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-constraintsresource.html","Properties":{"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-constraintsresource.html#cfn-sagemaker-modelqualityjobdefinition-constraintsresource-s3uri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-csv.html","Properties":{"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-csv.html#cfn-sagemaker-modelqualityjobdefinition-csv-header","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.DatasetFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-datasetformat.html","Properties":{"Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-datasetformat.html#cfn-sagemaker-modelqualityjobdefinition-datasetformat-csv","Required":false,"Type":"Csv","UpdateType":"Immutable"},"Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-datasetformat.html#cfn-sagemaker-modelqualityjobdefinition-datasetformat-json","Required":false,"Type":"Json","UpdateType":"Immutable"},"Parquet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-datasetformat.html#cfn-sagemaker-modelqualityjobdefinition-datasetformat-parquet","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.EndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-endpointinput.html","Properties":{"EndTimeOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-endpointinput.html#cfn-sagemaker-modelqualityjobdefinition-endpointinput-endtimeoffset","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-endpointinput.html#cfn-sagemaker-modelqualityjobdefinition-endpointinput-endpointname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InferenceAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-endpointinput.html#cfn-sagemaker-modelqualityjobdefinition-endpointinput-inferenceattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-endpointinput.html#cfn-sagemaker-modelqualityjobdefinition-endpointinput-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProbabilityAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-endpointinput.html#cfn-sagemaker-modelqualityjobdefinition-endpointinput-probabilityattribute","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProbabilityThresholdAttribute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-endpointinput.html#cfn-sagemaker-modelqualityjobdefinition-endpointinput-probabilitythresholdattribute","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"S3DataDistributionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-endpointinput.html#cfn-sagemaker-modelqualityjobdefinition-endpointinput-s3datadistributiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3InputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-endpointinput.html#cfn-sagemaker-modelqualityjobdefinition-endpointinput-s3inputmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StartTimeOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-endpointinput.html#cfn-sagemaker-modelqualityjobdefinition-endpointinput-starttimeoffset","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-json.html","Properties":{"Line":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-json.html#cfn-sagemaker-modelqualityjobdefinition-json-line","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.ModelQualityAppSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityappspecification.html","Properties":{"ContainerArguments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityappspecification.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityappspecification-containerarguments","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ContainerEntrypoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityappspecification.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityappspecification-containerentrypoint","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityappspecification.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityappspecification-environment","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"ImageUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityappspecification.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityappspecification-imageuri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PostAnalyticsProcessorSourceUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityappspecification.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityappspecification-postanalyticsprocessorsourceuri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProblemType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityappspecification.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityappspecification-problemtype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RecordPreprocessorSourceUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityappspecification.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityappspecification-recordpreprocessorsourceuri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.ModelQualityBaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualitybaselineconfig.html","Properties":{"BaseliningJobName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualitybaselineconfig.html#cfn-sagemaker-modelqualityjobdefinition-modelqualitybaselineconfig-baseliningjobname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConstraintsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualitybaselineconfig.html#cfn-sagemaker-modelqualityjobdefinition-modelqualitybaselineconfig-constraintsresource","Required":false,"Type":"ConstraintsResource","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.ModelQualityJobInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityjobinput.html","Properties":{"BatchTransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityjobinput.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityjobinput-batchtransforminput","Required":false,"Type":"BatchTransformInput","UpdateType":"Immutable"},"EndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityjobinput.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityjobinput-endpointinput","Required":false,"Type":"EndpointInput","UpdateType":"Immutable"},"GroundTruthS3Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-modelqualityjobinput.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityjobinput-groundtruths3input","Required":true,"Type":"MonitoringGroundTruthS3Input","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.MonitoringGroundTruthS3Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-monitoringgroundtruths3input.html","Properties":{"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-monitoringgroundtruths3input.html#cfn-sagemaker-modelqualityjobdefinition-monitoringgroundtruths3input-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.MonitoringOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-monitoringoutput.html","Properties":{"S3Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-monitoringoutput.html#cfn-sagemaker-modelqualityjobdefinition-monitoringoutput-s3output","Required":true,"Type":"S3Output","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.MonitoringOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-monitoringoutputconfig.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-monitoringoutputconfig.html#cfn-sagemaker-modelqualityjobdefinition-monitoringoutputconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MonitoringOutputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-monitoringoutputconfig.html#cfn-sagemaker-modelqualityjobdefinition-monitoringoutputconfig-monitoringoutputs","DuplicatesAllowed":true,"ItemType":"MonitoringOutput","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.MonitoringResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-monitoringresources.html","Properties":{"ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-monitoringresources.html#cfn-sagemaker-modelqualityjobdefinition-monitoringresources-clusterconfig","Required":true,"Type":"ClusterConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.NetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-networkconfig.html","Properties":{"EnableInterContainerTrafficEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-networkconfig.html#cfn-sagemaker-modelqualityjobdefinition-networkconfig-enableintercontainertrafficencryption","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"EnableNetworkIsolation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-networkconfig.html#cfn-sagemaker-modelqualityjobdefinition-networkconfig-enablenetworkisolation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-networkconfig.html#cfn-sagemaker-modelqualityjobdefinition-networkconfig-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.S3Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-s3output.html","Properties":{"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-s3output.html#cfn-sagemaker-modelqualityjobdefinition-s3output-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3UploadMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-s3output.html#cfn-sagemaker-modelqualityjobdefinition-s3output-s3uploadmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-s3output.html#cfn-sagemaker-modelqualityjobdefinition-s3output-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.StoppingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-stoppingcondition.html","Properties":{"MaxRuntimeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-stoppingcondition.html#cfn-sagemaker-modelqualityjobdefinition-stoppingcondition-maxruntimeinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::ModelQualityJobDefinition.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-vpcconfig.html#cfn-sagemaker-modelqualityjobdefinition-vpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-modelqualityjobdefinition-vpcconfig.html#cfn-sagemaker-modelqualityjobdefinition-vpcconfig-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::MonitoringSchedule.BaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-baselineconfig.html","Properties":{"ConstraintsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-baselineconfig.html#cfn-sagemaker-monitoringschedule-baselineconfig-constraintsresource","Required":false,"Type":"ConstraintsResource","UpdateType":"Mutable"},"StatisticsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-baselineconfig.html#cfn-sagemaker-monitoringschedule-baselineconfig-statisticsresource","Required":false,"Type":"StatisticsResource","UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.BatchTransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-batchtransforminput.html","Properties":{"DataCapturedDestinationS3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-batchtransforminput.html#cfn-sagemaker-monitoringschedule-batchtransforminput-datacaptureddestinations3uri","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatasetFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-batchtransforminput.html#cfn-sagemaker-monitoringschedule-batchtransforminput-datasetformat","Required":true,"Type":"DatasetFormat","UpdateType":"Mutable"},"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-batchtransforminput.html#cfn-sagemaker-monitoringschedule-batchtransforminput-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3DataDistributionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-batchtransforminput.html#cfn-sagemaker-monitoringschedule-batchtransforminput-s3datadistributiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3InputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-batchtransforminput.html#cfn-sagemaker-monitoringschedule-batchtransforminput-s3inputmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-clusterconfig.html","Properties":{"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-clusterconfig.html#cfn-sagemaker-monitoringschedule-clusterconfig-instancecount","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-clusterconfig.html#cfn-sagemaker-monitoringschedule-clusterconfig-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VolumeKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-clusterconfig.html#cfn-sagemaker-monitoringschedule-clusterconfig-volumekmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VolumeSizeInGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-clusterconfig.html#cfn-sagemaker-monitoringschedule-clusterconfig-volumesizeingb","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.ConstraintsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-constraintsresource.html","Properties":{"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-constraintsresource.html#cfn-sagemaker-monitoringschedule-constraintsresource-s3uri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-csv.html","Properties":{"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-csv.html#cfn-sagemaker-monitoringschedule-csv-header","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.DatasetFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-datasetformat.html","Properties":{"Csv":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-datasetformat.html#cfn-sagemaker-monitoringschedule-datasetformat-csv","Required":false,"Type":"Csv","UpdateType":"Mutable"},"Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-datasetformat.html#cfn-sagemaker-monitoringschedule-datasetformat-json","Required":false,"Type":"Json","UpdateType":"Mutable"},"Parquet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-datasetformat.html#cfn-sagemaker-monitoringschedule-datasetformat-parquet","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.EndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-endpointinput.html","Properties":{"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-endpointinput.html#cfn-sagemaker-monitoringschedule-endpointinput-endpointname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-endpointinput.html#cfn-sagemaker-monitoringschedule-endpointinput-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3DataDistributionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-endpointinput.html#cfn-sagemaker-monitoringschedule-endpointinput-s3datadistributiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3InputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-endpointinput.html#cfn-sagemaker-monitoringschedule-endpointinput-s3inputmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-json.html","Properties":{"Line":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-json.html#cfn-sagemaker-monitoringschedule-json-line","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.MonitoringAppSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringappspecification.html","Properties":{"ContainerArguments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringappspecification.html#cfn-sagemaker-monitoringschedule-monitoringappspecification-containerarguments","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ContainerEntrypoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringappspecification.html#cfn-sagemaker-monitoringschedule-monitoringappspecification-containerentrypoint","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ImageUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringappspecification.html#cfn-sagemaker-monitoringschedule-monitoringappspecification-imageuri","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PostAnalyticsProcessorSourceUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringappspecification.html#cfn-sagemaker-monitoringschedule-monitoringappspecification-postanalyticsprocessorsourceuri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RecordPreprocessorSourceUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringappspecification.html#cfn-sagemaker-monitoringschedule-monitoringappspecification-recordpreprocessorsourceuri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.MonitoringExecutionSummary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringexecutionsummary.html","Properties":{"CreationTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringexecutionsummary.html#cfn-sagemaker-monitoringschedule-monitoringexecutionsummary-creationtime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringexecutionsummary.html#cfn-sagemaker-monitoringschedule-monitoringexecutionsummary-endpointname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FailureReason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringexecutionsummary.html#cfn-sagemaker-monitoringschedule-monitoringexecutionsummary-failurereason","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LastModifiedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringexecutionsummary.html#cfn-sagemaker-monitoringschedule-monitoringexecutionsummary-lastmodifiedtime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MonitoringExecutionStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringexecutionsummary.html#cfn-sagemaker-monitoringschedule-monitoringexecutionsummary-monitoringexecutionstatus","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MonitoringScheduleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringexecutionsummary.html#cfn-sagemaker-monitoringschedule-monitoringexecutionsummary-monitoringschedulename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProcessingJobArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringexecutionsummary.html#cfn-sagemaker-monitoringschedule-monitoringexecutionsummary-processingjobarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduledTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringexecutionsummary.html#cfn-sagemaker-monitoringschedule-monitoringexecutionsummary-scheduledtime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.MonitoringInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringinput.html","Properties":{"BatchTransformInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringinput.html#cfn-sagemaker-monitoringschedule-monitoringinput-batchtransforminput","Required":false,"Type":"BatchTransformInput","UpdateType":"Mutable"},"EndpointInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringinput.html#cfn-sagemaker-monitoringschedule-monitoringinput-endpointinput","Required":false,"Type":"EndpointInput","UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.MonitoringJobDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringjobdefinition.html","Properties":{"BaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringjobdefinition.html#cfn-sagemaker-monitoringschedule-monitoringjobdefinition-baselineconfig","Required":false,"Type":"BaselineConfig","UpdateType":"Mutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringjobdefinition.html#cfn-sagemaker-monitoringschedule-monitoringjobdefinition-environment","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"MonitoringAppSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringjobdefinition.html#cfn-sagemaker-monitoringschedule-monitoringjobdefinition-monitoringappspecification","Required":true,"Type":"MonitoringAppSpecification","UpdateType":"Mutable"},"MonitoringInputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringjobdefinition.html#cfn-sagemaker-monitoringschedule-monitoringjobdefinition-monitoringinputs","DuplicatesAllowed":true,"ItemType":"MonitoringInput","Required":true,"Type":"List","UpdateType":"Mutable"},"MonitoringOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringjobdefinition.html#cfn-sagemaker-monitoringschedule-monitoringjobdefinition-monitoringoutputconfig","Required":true,"Type":"MonitoringOutputConfig","UpdateType":"Mutable"},"MonitoringResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringjobdefinition.html#cfn-sagemaker-monitoringschedule-monitoringjobdefinition-monitoringresources","Required":true,"Type":"MonitoringResources","UpdateType":"Mutable"},"NetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringjobdefinition.html#cfn-sagemaker-monitoringschedule-monitoringjobdefinition-networkconfig","Required":false,"Type":"NetworkConfig","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringjobdefinition.html#cfn-sagemaker-monitoringschedule-monitoringjobdefinition-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StoppingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringjobdefinition.html#cfn-sagemaker-monitoringschedule-monitoringjobdefinition-stoppingcondition","Required":false,"Type":"StoppingCondition","UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.MonitoringOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringoutput.html","Properties":{"S3Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringoutput.html#cfn-sagemaker-monitoringschedule-monitoringoutput-s3output","Required":true,"Type":"S3Output","UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.MonitoringOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringoutputconfig.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringoutputconfig.html#cfn-sagemaker-monitoringschedule-monitoringoutputconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MonitoringOutputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringoutputconfig.html#cfn-sagemaker-monitoringschedule-monitoringoutputconfig-monitoringoutputs","DuplicatesAllowed":true,"ItemType":"MonitoringOutput","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.MonitoringResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringresources.html","Properties":{"ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringresources.html#cfn-sagemaker-monitoringschedule-monitoringresources-clusterconfig","Required":true,"Type":"ClusterConfig","UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.MonitoringScheduleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringscheduleconfig.html","Properties":{"MonitoringJobDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringscheduleconfig.html#cfn-sagemaker-monitoringschedule-monitoringscheduleconfig-monitoringjobdefinition","Required":false,"Type":"MonitoringJobDefinition","UpdateType":"Mutable"},"MonitoringJobDefinitionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringscheduleconfig.html#cfn-sagemaker-monitoringschedule-monitoringscheduleconfig-monitoringjobdefinitionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MonitoringType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringscheduleconfig.html#cfn-sagemaker-monitoringschedule-monitoringscheduleconfig-monitoringtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-monitoringscheduleconfig.html#cfn-sagemaker-monitoringschedule-monitoringscheduleconfig-scheduleconfig","Required":false,"Type":"ScheduleConfig","UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.NetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-networkconfig.html","Properties":{"EnableInterContainerTrafficEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-networkconfig.html#cfn-sagemaker-monitoringschedule-networkconfig-enableintercontainertrafficencryption","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableNetworkIsolation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-networkconfig.html#cfn-sagemaker-monitoringschedule-networkconfig-enablenetworkisolation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-networkconfig.html#cfn-sagemaker-monitoringschedule-networkconfig-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.S3Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-s3output.html","Properties":{"LocalPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-s3output.html#cfn-sagemaker-monitoringschedule-s3output-localpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3UploadMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-s3output.html#cfn-sagemaker-monitoringschedule-s3output-s3uploadmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-s3output.html#cfn-sagemaker-monitoringschedule-s3output-s3uri","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.ScheduleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-scheduleconfig.html","Properties":{"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-scheduleconfig.html#cfn-sagemaker-monitoringschedule-scheduleconfig-scheduleexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.StatisticsResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-statisticsresource.html","Properties":{"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-statisticsresource.html#cfn-sagemaker-monitoringschedule-statisticsresource-s3uri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.StoppingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-stoppingcondition.html","Properties":{"MaxRuntimeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-stoppingcondition.html#cfn-sagemaker-monitoringschedule-stoppingcondition-maxruntimeinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::MonitoringSchedule.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-vpcconfig.html#cfn-sagemaker-monitoringschedule-vpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-monitoringschedule-vpcconfig.html#cfn-sagemaker-monitoringschedule-vpcconfig-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::NotebookInstance.InstanceMetadataServiceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-notebookinstance-instancemetadataserviceconfiguration.html","Properties":{"MinimumInstanceMetadataServiceVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-notebookinstance-instancemetadataserviceconfiguration.html#cfn-sagemaker-notebookinstance-instancemetadataserviceconfiguration-minimuminstancemetadataserviceversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::NotebookInstanceLifecycleConfig.NotebookInstanceLifecycleHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-notebookinstancelifecycleconfig-notebookinstancelifecyclehook.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-notebookinstancelifecycleconfig-notebookinstancelifecyclehook.html#cfn-sagemaker-notebookinstancelifecycleconfig-notebookinstancelifecyclehook-content","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::Pipeline.ParallelismConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-pipeline-parallelismconfiguration.html","Properties":{"MaxParallelExecutionSteps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-pipeline-parallelismconfiguration.html#cfn-sagemaker-pipeline-parallelismconfiguration-maxparallelexecutionsteps","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::Pipeline.PipelineDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-pipeline-pipelinedefinition.html","Properties":{"PipelineDefinitionBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-pipeline-pipelinedefinition.html#cfn-sagemaker-pipeline-pipelinedefinition-pipelinedefinitionbody","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PipelineDefinitionS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-pipeline-pipelinedefinition.html#cfn-sagemaker-pipeline-pipelinedefinition-pipelinedefinitions3location","Required":false,"Type":"S3Location","UpdateType":"Mutable"}}},"AWS::SageMaker::Pipeline.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-pipeline-s3location.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-pipeline-s3location.html#cfn-sagemaker-pipeline-s3location-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ETag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-pipeline-s3location.html#cfn-sagemaker-pipeline-s3location-etag","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-pipeline-s3location.html#cfn-sagemaker-pipeline-s3location-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-pipeline-s3location.html#cfn-sagemaker-pipeline-s3location-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::Project.ProvisioningParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-provisioningparameter.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-provisioningparameter.html#cfn-sagemaker-project-provisioningparameter-key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-provisioningparameter.html#cfn-sagemaker-project-provisioningparameter-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::Project.ServiceCatalogProvisionedProductDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-servicecatalogprovisionedproductdetails.html","Properties":{"ProvisionedProductId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-servicecatalogprovisionedproductdetails.html#cfn-sagemaker-project-servicecatalogprovisionedproductdetails-provisionedproductid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProvisionedProductStatusMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-servicecatalogprovisionedproductdetails.html#cfn-sagemaker-project-servicecatalogprovisionedproductdetails-provisionedproductstatusmessage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::Project.ServiceCatalogProvisioningDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-servicecatalogprovisioningdetails.html","Properties":{"PathId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-servicecatalogprovisioningdetails.html#cfn-sagemaker-project-servicecatalogprovisioningdetails-pathid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProductId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-servicecatalogprovisioningdetails.html#cfn-sagemaker-project-servicecatalogprovisioningdetails-productid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProvisioningArtifactId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-servicecatalogprovisioningdetails.html#cfn-sagemaker-project-servicecatalogprovisioningdetails-provisioningartifactid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProvisioningParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-project-servicecatalogprovisioningdetails.html#cfn-sagemaker-project-servicecatalogprovisioningdetails-provisioningparameters","DuplicatesAllowed":true,"ItemType":"ProvisioningParameter","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::Space.CustomImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-customimage.html","Properties":{"AppImageConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-customimage.html#cfn-sagemaker-space-customimage-appimageconfigname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ImageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-customimage.html#cfn-sagemaker-space-customimage-imagename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ImageVersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-customimage.html#cfn-sagemaker-space-customimage-imageversionnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::Space.JupyterServerAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-jupyterserverappsettings.html","Properties":{"DefaultResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-jupyterserverappsettings.html#cfn-sagemaker-space-jupyterserverappsettings-defaultresourcespec","Required":false,"Type":"ResourceSpec","UpdateType":"Mutable"}}},"AWS::SageMaker::Space.KernelGatewayAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-kernelgatewayappsettings.html","Properties":{"CustomImages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-kernelgatewayappsettings.html#cfn-sagemaker-space-kernelgatewayappsettings-customimages","DuplicatesAllowed":true,"ItemType":"CustomImage","Required":false,"Type":"List","UpdateType":"Mutable"},"DefaultResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-kernelgatewayappsettings.html#cfn-sagemaker-space-kernelgatewayappsettings-defaultresourcespec","Required":false,"Type":"ResourceSpec","UpdateType":"Mutable"}}},"AWS::SageMaker::Space.ResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-resourcespec.html","Properties":{"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-resourcespec.html#cfn-sagemaker-space-resourcespec-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SageMakerImageArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-resourcespec.html#cfn-sagemaker-space-resourcespec-sagemakerimagearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SageMakerImageVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-resourcespec.html#cfn-sagemaker-space-resourcespec-sagemakerimageversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::Space.SpaceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-spacesettings.html","Properties":{"JupyterServerAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-spacesettings.html#cfn-sagemaker-space-spacesettings-jupyterserverappsettings","Required":false,"Type":"JupyterServerAppSettings","UpdateType":"Mutable"},"KernelGatewayAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-space-spacesettings.html#cfn-sagemaker-space-spacesettings-kernelgatewayappsettings","Required":false,"Type":"KernelGatewayAppSettings","UpdateType":"Mutable"}}},"AWS::SageMaker::UserProfile.CustomImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-customimage.html","Properties":{"AppImageConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-customimage.html#cfn-sagemaker-userprofile-customimage-appimageconfigname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ImageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-customimage.html#cfn-sagemaker-userprofile-customimage-imagename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ImageVersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-customimage.html#cfn-sagemaker-userprofile-customimage-imageversionnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::UserProfile.JupyterServerAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-jupyterserverappsettings.html","Properties":{"DefaultResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-jupyterserverappsettings.html#cfn-sagemaker-userprofile-jupyterserverappsettings-defaultresourcespec","Required":false,"Type":"ResourceSpec","UpdateType":"Mutable"}}},"AWS::SageMaker::UserProfile.KernelGatewayAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-kernelgatewayappsettings.html","Properties":{"CustomImages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-kernelgatewayappsettings.html#cfn-sagemaker-userprofile-kernelgatewayappsettings-customimages","DuplicatesAllowed":true,"ItemType":"CustomImage","Required":false,"Type":"List","UpdateType":"Mutable"},"DefaultResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-kernelgatewayappsettings.html#cfn-sagemaker-userprofile-kernelgatewayappsettings-defaultresourcespec","Required":false,"Type":"ResourceSpec","UpdateType":"Mutable"}}},"AWS::SageMaker::UserProfile.RStudioServerProAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-rstudioserverproappsettings.html","Properties":{"AccessStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-rstudioserverproappsettings.html#cfn-sagemaker-userprofile-rstudioserverproappsettings-accessstatus","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"UserGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-rstudioserverproappsettings.html#cfn-sagemaker-userprofile-rstudioserverproappsettings-usergroup","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SageMaker::UserProfile.ResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-resourcespec.html","Properties":{"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-resourcespec.html#cfn-sagemaker-userprofile-resourcespec-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SageMakerImageArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-resourcespec.html#cfn-sagemaker-userprofile-resourcespec-sagemakerimagearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SageMakerImageVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-resourcespec.html#cfn-sagemaker-userprofile-resourcespec-sagemakerimageversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::UserProfile.SharingSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-sharingsettings.html","Properties":{"NotebookOutputOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-sharingsettings.html#cfn-sagemaker-userprofile-sharingsettings-notebookoutputoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-sharingsettings.html#cfn-sagemaker-userprofile-sharingsettings-s3kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3OutputPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-sharingsettings.html#cfn-sagemaker-userprofile-sharingsettings-s3outputpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::UserProfile.UserSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-usersettings.html","Properties":{"ExecutionRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-usersettings.html#cfn-sagemaker-userprofile-usersettings-executionrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JupyterServerAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-usersettings.html#cfn-sagemaker-userprofile-usersettings-jupyterserverappsettings","Required":false,"Type":"JupyterServerAppSettings","UpdateType":"Mutable"},"KernelGatewayAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-usersettings.html#cfn-sagemaker-userprofile-usersettings-kernelgatewayappsettings","Required":false,"Type":"KernelGatewayAppSettings","UpdateType":"Mutable"},"RStudioServerProAppSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-usersettings.html#cfn-sagemaker-userprofile-usersettings-rstudioserverproappsettings","Required":false,"Type":"RStudioServerProAppSettings","UpdateType":"Mutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-usersettings.html#cfn-sagemaker-userprofile-usersettings-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SharingSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-userprofile-usersettings.html#cfn-sagemaker-userprofile-usersettings-sharingsettings","Required":false,"Type":"SharingSettings","UpdateType":"Mutable"}}},"AWS::SageMaker::Workteam.CognitoMemberDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-workteam-cognitomemberdefinition.html","Properties":{"CognitoClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-workteam-cognitomemberdefinition.html#cfn-sagemaker-workteam-cognitomemberdefinition-cognitoclientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CognitoUserGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-workteam-cognitomemberdefinition.html#cfn-sagemaker-workteam-cognitomemberdefinition-cognitousergroup","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CognitoUserPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-workteam-cognitomemberdefinition.html#cfn-sagemaker-workteam-cognitomemberdefinition-cognitouserpool","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::Workteam.MemberDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-workteam-memberdefinition.html","Properties":{"CognitoMemberDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-workteam-memberdefinition.html#cfn-sagemaker-workteam-memberdefinition-cognitomemberdefinition","Required":false,"Type":"CognitoMemberDefinition","UpdateType":"Mutable"},"OidcMemberDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-workteam-memberdefinition.html#cfn-sagemaker-workteam-memberdefinition-oidcmemberdefinition","Required":false,"Type":"OidcMemberDefinition","UpdateType":"Mutable"}}},"AWS::SageMaker::Workteam.NotificationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-workteam-notificationconfiguration.html","Properties":{"NotificationTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-workteam-notificationconfiguration.html#cfn-sagemaker-workteam-notificationconfiguration-notificationtopicarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SageMaker::Workteam.OidcMemberDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-workteam-oidcmemberdefinition.html","Properties":{"OidcGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sagemaker-workteam-oidcmemberdefinition.html#cfn-sagemaker-workteam-oidcmemberdefinition-oidcgroups","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.AwsVpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-awsvpcconfiguration.html","Properties":{"AssignPublicIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-awsvpcconfiguration.html#cfn-scheduler-schedule-awsvpcconfiguration-assignpublicip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-awsvpcconfiguration.html#cfn-scheduler-schedule-awsvpcconfiguration-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-awsvpcconfiguration.html#cfn-scheduler-schedule-awsvpcconfiguration-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.CapacityProviderStrategyItem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-capacityproviderstrategyitem.html","Properties":{"Base":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-capacityproviderstrategyitem.html#cfn-scheduler-schedule-capacityproviderstrategyitem-base","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"CapacityProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-capacityproviderstrategyitem.html#cfn-scheduler-schedule-capacityproviderstrategyitem-capacityprovider","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-capacityproviderstrategyitem.html#cfn-scheduler-schedule-capacityproviderstrategyitem-weight","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.DeadLetterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-deadletterconfig.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-deadletterconfig.html#cfn-scheduler-schedule-deadletterconfig-arn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.EcsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html","Properties":{"CapacityProviderStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-capacityproviderstrategy","DuplicatesAllowed":true,"ItemType":"CapacityProviderStrategyItem","Required":false,"Type":"List","UpdateType":"Mutable"},"EnableECSManagedTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-enableecsmanagedtags","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableExecuteCommand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-enableexecutecommand","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Group":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-group","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-launchtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-networkconfiguration","Required":false,"Type":"NetworkConfiguration","UpdateType":"Mutable"},"PlacementConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-placementconstraints","DuplicatesAllowed":true,"ItemType":"PlacementConstraint","Required":false,"Type":"List","UpdateType":"Mutable"},"PlacementStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-placementstrategy","DuplicatesAllowed":true,"ItemType":"PlacementStrategy","Required":false,"Type":"List","UpdateType":"Mutable"},"PlatformVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-platformversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropagateTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-propagatetags","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReferenceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-referenceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TaskCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-taskcount","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"TaskDefinitionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-ecsparameters.html#cfn-scheduler-schedule-ecsparameters-taskdefinitionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.EventBridgeParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-eventbridgeparameters.html","Properties":{"DetailType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-eventbridgeparameters.html#cfn-scheduler-schedule-eventbridgeparameters-detailtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-eventbridgeparameters.html#cfn-scheduler-schedule-eventbridgeparameters-source","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.FlexibleTimeWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-flexibletimewindow.html","Properties":{"MaximumWindowInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-flexibletimewindow.html#cfn-scheduler-schedule-flexibletimewindow-maximumwindowinminutes","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-flexibletimewindow.html#cfn-scheduler-schedule-flexibletimewindow-mode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.KinesisParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-kinesisparameters.html","Properties":{"PartitionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-kinesisparameters.html#cfn-scheduler-schedule-kinesisparameters-partitionkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-networkconfiguration.html","Properties":{"AwsvpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-networkconfiguration.html#cfn-scheduler-schedule-networkconfiguration-awsvpcconfiguration","Required":false,"Type":"AwsVpcConfiguration","UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.PlacementConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-placementconstraint.html","Properties":{"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-placementconstraint.html#cfn-scheduler-schedule-placementconstraint-expression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-placementconstraint.html#cfn-scheduler-schedule-placementconstraint-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.PlacementStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-placementstrategy.html","Properties":{"Field":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-placementstrategy.html#cfn-scheduler-schedule-placementstrategy-field","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-placementstrategy.html#cfn-scheduler-schedule-placementstrategy-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.RetryPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-retrypolicy.html","Properties":{"MaximumEventAgeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-retrypolicy.html#cfn-scheduler-schedule-retrypolicy-maximumeventageinseconds","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaximumRetryAttempts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-retrypolicy.html#cfn-scheduler-schedule-retrypolicy-maximumretryattempts","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.SageMakerPipelineParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-sagemakerpipelineparameter.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-sagemakerpipelineparameter.html#cfn-scheduler-schedule-sagemakerpipelineparameter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-sagemakerpipelineparameter.html#cfn-scheduler-schedule-sagemakerpipelineparameter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.SageMakerPipelineParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-sagemakerpipelineparameters.html","Properties":{"PipelineParameterList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-sagemakerpipelineparameters.html#cfn-scheduler-schedule-sagemakerpipelineparameters-pipelineparameterlist","DuplicatesAllowed":true,"ItemType":"SageMakerPipelineParameter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.SqsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-sqsparameters.html","Properties":{"MessageGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-sqsparameters.html#cfn-scheduler-schedule-sqsparameters-messagegroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Scheduler::Schedule.Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-target.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-target.html#cfn-scheduler-schedule-target-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DeadLetterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-target.html#cfn-scheduler-schedule-target-deadletterconfig","Required":false,"Type":"DeadLetterConfig","UpdateType":"Mutable"},"EcsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-target.html#cfn-scheduler-schedule-target-ecsparameters","Required":false,"Type":"EcsParameters","UpdateType":"Mutable"},"EventBridgeParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-target.html#cfn-scheduler-schedule-target-eventbridgeparameters","Required":false,"Type":"EventBridgeParameters","UpdateType":"Mutable"},"Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-target.html#cfn-scheduler-schedule-target-input","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KinesisParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-target.html#cfn-scheduler-schedule-target-kinesisparameters","Required":false,"Type":"KinesisParameters","UpdateType":"Mutable"},"RetryPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-target.html#cfn-scheduler-schedule-target-retrypolicy","Required":false,"Type":"RetryPolicy","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-target.html#cfn-scheduler-schedule-target-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SageMakerPipelineParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-target.html#cfn-scheduler-schedule-target-sagemakerpipelineparameters","Required":false,"Type":"SageMakerPipelineParameters","UpdateType":"Mutable"},"SqsParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-scheduler-schedule-target.html#cfn-scheduler-schedule-target-sqsparameters","Required":false,"Type":"SqsParameters","UpdateType":"Mutable"}}},"AWS::SecretsManager::RotationSchedule.HostedRotationLambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html","Properties":{"ExcludeCharacters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-excludecharacters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterSecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-mastersecretarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterSecretKmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-mastersecretkmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RotationLambdaName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-rotationlambdaname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RotationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-rotationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Runtime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-runtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SuperuserSecretArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-superusersecretarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SuperuserSecretKmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-superusersecretkmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-vpcsecuritygroupids","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcSubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-vpcsubnetids","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SecretsManager::RotationSchedule.RotationRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-rotationrules.html","Properties":{"AutomaticallyAfterDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-rotationrules.html#cfn-secretsmanager-rotationschedule-rotationrules-automaticallyafterdays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Duration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-rotationrules.html#cfn-secretsmanager-rotationschedule-rotationrules-duration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-rotationschedule-rotationrules.html#cfn-secretsmanager-rotationschedule-rotationrules-scheduleexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SecretsManager::Secret.GenerateSecretString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-generatesecretstring.html","Properties":{"ExcludeCharacters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-generatesecretstring.html#cfn-secretsmanager-secret-generatesecretstring-excludecharacters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExcludeLowercase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-generatesecretstring.html#cfn-secretsmanager-secret-generatesecretstring-excludelowercase","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExcludeNumbers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-generatesecretstring.html#cfn-secretsmanager-secret-generatesecretstring-excludenumbers","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExcludePunctuation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-generatesecretstring.html#cfn-secretsmanager-secret-generatesecretstring-excludepunctuation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExcludeUppercase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-generatesecretstring.html#cfn-secretsmanager-secret-generatesecretstring-excludeuppercase","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"GenerateStringKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-generatesecretstring.html#cfn-secretsmanager-secret-generatesecretstring-generatestringkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IncludeSpace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-generatesecretstring.html#cfn-secretsmanager-secret-generatesecretstring-includespace","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PasswordLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-generatesecretstring.html#cfn-secretsmanager-secret-generatesecretstring-passwordlength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RequireEachIncludedType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-generatesecretstring.html#cfn-secretsmanager-secret-generatesecretstring-requireeachincludedtype","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SecretStringTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-generatesecretstring.html#cfn-secretsmanager-secret-generatesecretstring-secretstringtemplate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SecretsManager::Secret.ReplicaRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-replicaregion.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-replicaregion.html#cfn-secretsmanager-secret-replicaregion-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-secretsmanager-secret-replicaregion.html#cfn-secretsmanager-secret-replicaregion-region","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.AutomationRulesAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesaction.html","Properties":{"FindingFieldsUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesaction.html#cfn-securityhub-automationrule-automationrulesaction-findingfieldsupdate","Required":true,"Type":"AutomationRulesFindingFieldsUpdate","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesaction.html#cfn-securityhub-automationrule-automationrulesaction-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.AutomationRulesFindingFieldsUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfieldsupdate.html","Properties":{"Confidence":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfieldsupdate.html#cfn-securityhub-automationrule-automationrulesfindingfieldsupdate-confidence","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Criticality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfieldsupdate.html#cfn-securityhub-automationrule-automationrulesfindingfieldsupdate-criticality","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Note":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfieldsupdate.html#cfn-securityhub-automationrule-automationrulesfindingfieldsupdate-note","Required":false,"Type":"NoteUpdate","UpdateType":"Mutable"},"RelatedFindings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfieldsupdate.html#cfn-securityhub-automationrule-automationrulesfindingfieldsupdate-relatedfindings","DuplicatesAllowed":true,"ItemType":"RelatedFinding","Required":false,"Type":"List","UpdateType":"Mutable"},"Severity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfieldsupdate.html#cfn-securityhub-automationrule-automationrulesfindingfieldsupdate-severity","Required":false,"Type":"SeverityUpdate","UpdateType":"Mutable"},"Types":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfieldsupdate.html#cfn-securityhub-automationrule-automationrulesfindingfieldsupdate-types","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"UserDefinedFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfieldsupdate.html#cfn-securityhub-automationrule-automationrulesfindingfieldsupdate-userdefinedfields","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"VerificationState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfieldsupdate.html#cfn-securityhub-automationrule-automationrulesfindingfieldsupdate-verificationstate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Workflow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfieldsupdate.html#cfn-securityhub-automationrule-automationrulesfindingfieldsupdate-workflow","Required":false,"Type":"WorkflowUpdate","UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.AutomationRulesFindingFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html","Properties":{"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-awsaccountid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"CompanyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-companyname","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ComplianceAssociatedStandardsId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-complianceassociatedstandardsid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ComplianceSecurityControlId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-compliancesecuritycontrolid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ComplianceStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-compliancestatus","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Confidence":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-confidence","DuplicatesAllowed":true,"ItemType":"NumberFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"CreatedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-createdat","DuplicatesAllowed":true,"ItemType":"DateFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Criticality":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-criticality","DuplicatesAllowed":true,"ItemType":"NumberFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-description","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"FirstObservedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-firstobservedat","DuplicatesAllowed":true,"ItemType":"DateFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"GeneratorId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-generatorid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-id","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"LastObservedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-lastobservedat","DuplicatesAllowed":true,"ItemType":"DateFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"NoteText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-notetext","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"NoteUpdatedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-noteupdatedat","DuplicatesAllowed":true,"ItemType":"DateFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"NoteUpdatedBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-noteupdatedby","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ProductArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-productarn","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ProductName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-productname","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"RecordState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-recordstate","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"RelatedFindingsId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-relatedfindingsid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"RelatedFindingsProductArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-relatedfindingsproductarn","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceDetailsOther":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-resourcedetailsother","DuplicatesAllowed":true,"ItemType":"MapFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-resourceid","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourcePartition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-resourcepartition","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-resourceregion","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-resourcetags","DuplicatesAllowed":true,"ItemType":"MapFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-resourcetype","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"SeverityLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-severitylabel","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-sourceurl","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-title","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-type","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"UpdatedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-updatedat","DuplicatesAllowed":true,"ItemType":"DateFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"UserDefinedFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-userdefinedfields","DuplicatesAllowed":true,"ItemType":"MapFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"VerificationState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-verificationstate","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"WorkflowStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-automationrulesfindingfilters.html#cfn-securityhub-automationrule-automationrulesfindingfilters-workflowstatus","DuplicatesAllowed":true,"ItemType":"StringFilter","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.DateFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-datefilter.html","Properties":{"DateRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-datefilter.html#cfn-securityhub-automationrule-datefilter-daterange","Required":false,"Type":"DateRange","UpdateType":"Mutable"},"End":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-datefilter.html#cfn-securityhub-automationrule-datefilter-end","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Start":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-datefilter.html#cfn-securityhub-automationrule-datefilter-start","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.DateRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-daterange.html","Properties":{"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-daterange.html#cfn-securityhub-automationrule-daterange-unit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-daterange.html#cfn-securityhub-automationrule-daterange-value","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.MapFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-mapfilter.html","Properties":{"Comparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-mapfilter.html#cfn-securityhub-automationrule-mapfilter-comparison","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-mapfilter.html#cfn-securityhub-automationrule-mapfilter-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-mapfilter.html#cfn-securityhub-automationrule-mapfilter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.NoteUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-noteupdate.html","Properties":{"Text":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-noteupdate.html#cfn-securityhub-automationrule-noteupdate-text","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UpdatedBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-noteupdate.html#cfn-securityhub-automationrule-noteupdate-updatedby","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.NumberFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-numberfilter.html","Properties":{"Eq":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-numberfilter.html#cfn-securityhub-automationrule-numberfilter-eq","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Gte":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-numberfilter.html#cfn-securityhub-automationrule-numberfilter-gte","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Lte":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-numberfilter.html#cfn-securityhub-automationrule-numberfilter-lte","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.RelatedFinding":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-relatedfinding.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-relatedfinding.html#cfn-securityhub-automationrule-relatedfinding-id","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"ProductArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-relatedfinding.html#cfn-securityhub-automationrule-relatedfinding-productarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.SeverityUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-severityupdate.html","Properties":{"Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-severityupdate.html#cfn-securityhub-automationrule-severityupdate-label","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Normalized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-severityupdate.html#cfn-securityhub-automationrule-severityupdate-normalized","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Product":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-severityupdate.html#cfn-securityhub-automationrule-severityupdate-product","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.StringFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-stringfilter.html","Properties":{"Comparison":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-stringfilter.html#cfn-securityhub-automationrule-stringfilter-comparison","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-stringfilter.html#cfn-securityhub-automationrule-stringfilter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule.WorkflowUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-workflowupdate.html","Properties":{"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-automationrule-workflowupdate.html#cfn-securityhub-automationrule-workflowupdate-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SecurityHub::Standard.StandardsControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-standard-standardscontrol.html","Properties":{"Reason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-standard-standardscontrol.html#cfn-securityhub-standard-standardscontrol-reason","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StandardsControlArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-securityhub-standard-standardscontrol.html#cfn-securityhub-standard-standardscontrol-standardscontrolarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Serverless::Api.AccessLogSetting":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-accesslogsetting.html","Properties":{"DestinationArn":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-accesslogsetting.html#cfn-apigateway-stage-accesslogsetting-destinationarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Format":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-accesslogsetting.html#cfn-apigateway-stage-accesslogsetting-format","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Api.Auth":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api-auth-object","Properties":{"AddDefaultAuthorizerToCorsPreflight":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api-auth-object","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Authorizers":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api-auth-object","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"DefaultAuthorizer":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api-auth-object","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Api.CanarySetting":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-canarysetting.html","Properties":{"DeploymentId":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-canarysetting.html#cfn-apigateway-stage-canarysetting-deploymentid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PercentTraffic":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-canarysetting.html#cfn-apigateway-stage-canarysetting-percenttraffic","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"StageVariableOverrides":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-canarysetting.html#cfn-apigateway-stage-canarysetting-stagevariableoverrides","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"UseStageCache":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-canarysetting.html#cfn-apigateway-stage-canarysetting-usestagecache","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Api.CorsConfiguration":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration","Properties":{"AllowCredentials":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"AllowHeaders":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AllowMethods":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AllowOrigin":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MaxAge":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Api.DomainConfiguration":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-domainconfiguration.html","Properties":{"BasePath":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-domainconfiguration.html#sam-api-domainconfiguration-basepath","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"CertificateArn":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-domainconfiguration.html#sam-api-domainconfiguration-certificatearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DomainName":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-domainconfiguration.html#sam-api-domainconfiguration-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EndpointConfiguration":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-domainconfiguration.html#sam-api-domainconfiguration-endpointconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MutualTlsAuthentication":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-domainconfiguration.html#sam-api-domainconfiguration-mutualtlsauthentication","Required":false,"Type":"MutualTlsAuthentication","UpdateType":"Immutable"},"OwnershipVerificationCertificateArn":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-domainconfiguration.html#sam-api-domainconfiguration-ownershipverificationcertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Route53":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-domainconfiguration.html#sam-api-domainconfiguration-route53","Required":false,"Type":"Route53Configuration","UpdateType":"Immutable"},"SecurityPolicy":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-domainconfiguration.html#sam-api-domainconfiguration-securitypolicy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Api.EndpointConfiguration":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-endpointconfiguration.html","Properties":{"Type":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-endpointconfiguration.html#sam-api-endpointconfiguration-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VpcEndpointIds":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-endpointconfiguration.html#sam-api-endpointconfiguration-vpcendpointids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Serverless::Api.MutualTlsAuthentication":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-domainname-mutualtlsauthentication.html","Properties":{"TruststoreUri":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-domainname-mutualtlsauthentication.html#cfn-apigateway-domainname-mutualtlsauthentication-truststoreuri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TruststoreVersion":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-domainname-mutualtlsauthentication.html#cfn-apigateway-domainname-mutualtlsauthentication-truststoreversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Api.Route53Configuration":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-route53configuration.html","Properties":{"DistributedDomainName":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-route53configuration.html#sam-api-route53configuration-distributiondomainname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EvaluateTargetHealth":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-route53configuration.html#sam-api-route53configuration-evaluatetargethealth","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"HostedZoneId":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-route53configuration.html#sam-api-route53configuration-hostedzoneid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"HostedZoneName":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-route53configuration.html#sam-api-route53configuration-hostedzonename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IpV6":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-route53configuration.html#sam-api-route53configuration-ipv6","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Api.S3Location":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3-location-object","Properties":{"Bucket":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3-location-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Key":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3-location-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Version":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3-location-object","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Application.ApplicationLocation":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication","Properties":{"ApplicationId":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SemanticVersion":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.AlexaSkillEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#alexaskill","Properties":{"Variables":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#alexaskill","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::Serverless::Function.ApiEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","Properties":{"Auth":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","Required":false,"Type":"Auth","UpdateType":"Immutable"},"Method":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Path":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RequestModel":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","Required":false,"Type":"RequestModel","UpdateType":"Immutable"},"RequestParameters":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","InclusiveItemPattern":true,"InclusiveItemTypes":["RequestParameter"],"InclusivePrimitiveItemTypes":["String"],"Required":false,"Type":"List","UpdateType":"Immutable"},"RestApiId":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.Auth":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","Properties":{"ApiKeyRequired":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"AuthorizationScopes":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Authorizer":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourcePolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","Required":false,"Type":"AuthResourcePolicy","UpdateType":"Immutable"}}},"AWS::Serverless::Function.AuthResourcePolicy":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","Properties":{"AwsAccountBlacklist":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AwsAccountWhitelist":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"CustomStatements":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"Json","Required":false,"Type":"List","UpdateType":"Immutable"},"IntrinsicVpcBlacklist":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"IntrinsicVpcWhitelist":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"IntrinsicVpceBlacklist":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"IntrinsicVpceWhitelist":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"IpRangeBlacklist":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"IpRangeWhitelist":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SourceVpcBlacklist":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SourceVpcWhitelist":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#function-auth-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Serverless::Function.BucketSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"BucketName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.CloudWatchEventEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cloudwatchevent","Properties":{"Input":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cloudwatchevent","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InputPath":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cloudwatchevent","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Pattern":{"Documentation":"http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CloudWatchEventsandEventPatterns.html","PrimitiveType":"Json","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.CloudWatchLogsEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cloudwatchevent","Properties":{"FilterPattern":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cloudwatchlogs","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LogGroupName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#cloudwatchlogs","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.CognitoEvent":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#cognito","Properties":{"Trigger":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#cognito","PrimitiveItemTypes":["String"],"PrimitiveTypes":["String"],"Required":true},"UserPool":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#cognito","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.CollectionSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"CollectionId":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.DeadLetterQueue":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#deadletterqueue-object","Properties":{"TargetArn":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Type":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.DeploymentPreference":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/safe_lambda_deployments.rst","Properties":{"Alarms":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#deploymentpreference-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Enabled":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#deploymentpreference-object","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"Hooks":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#deploymentpreference-object","Required":false,"Type":"Hooks","UpdateType":"Immutable"},"Type":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#deploymentpreference-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.Destination":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#destination-config-object","Properties":{"Destination":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#destination-config-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Type":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#destination-config-object","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.DestinationConfig":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#destination-config-object","Properties":{"OnFailure":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#destination-config-object","Required":true,"Type":"Destination","UpdateType":"Immutable"}}},"AWS::Serverless::Function.DomainSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"DomainName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.DynamoDBEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#dynamodb","Properties":{"BatchSize":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#dynamodb","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"BisectBatchOnFunctionError":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#dynamodb","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DestinationConfig":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#dynamodb","Required":false,"Type":"DestinationConfig","UpdateType":"Immutable"},"Enabled":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#dynamodb","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"MaximumBatchingWindowInSeconds":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#dynamodb","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MaximumRecordAgeInSeconds":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#dynamodb","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MaximumRetryAttempts":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#dynamodb","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ParallelizationFactor":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#dynamodb","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"StartingPosition":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#dynamodb","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Stream":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#dynamodb","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.EmptySAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{}},"AWS::Serverless::Function.EventBridgeRuleEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#eventbridgerule","Properties":{"EventBusName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#eventbridgerule","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Input":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#eventbridgerule","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InputPath":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#eventbridgerule","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Pattern":{"Documentation":"https://docs.aws.amazon.com/eventbridge/latest/userguide/filtering-examples-structure.html","PrimitiveType":"Json","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.EventInvokeConfig":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#event-invoke-config-object","Properties":{"DestinationConfig":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#event-invoke-config-object","Required":false,"Type":"EventInvokeDestinationConfig","UpdateType":"Immutable"},"MaximumEventAgeInSeconds":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#event-invoke-config-object","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MaximumRetryAttempts":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#event-invoke-config-object","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.EventInvokeDestinationConfig":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#event-invoke-destination-config-object","Properties":{"OnFailure":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#event-invoke-destination-config-object","Required":true,"Type":"Destination","UpdateType":"Immutable"},"OnSuccess":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#event-invoke-destination-config-object","Required":true,"Type":"Destination","UpdateType":"Immutable"}}},"AWS::Serverless::Function.EventSource":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#event-source-object","Properties":{"Properties":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#event-source-types","Required":true,"Types":["S3Event","SNSEvent","SQSEvent","KinesisEvent","DynamoDBEvent","ApiEvent","ScheduleEvent","CloudWatchEventEvent","CloudWatchLogsEvent","IoTRuleEvent","AlexaSkillEvent","EventBridgeRuleEvent","HttpApiEvent","CognitoEvent"],"UpdateType":"Immutable"},"Type":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#event-source-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.FileSystemConfig":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-filesystemconfig.html#cfn-lambda-function-filesystemconfig-localmountpath","Properties":{"Arn":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-filesystemconfig.html#cfn-lambda-function-filesystemconfig-localmountpath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LocalMountPath":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-filesystemconfig.html#cfn-lambda-function-filesystemconfig-localmountpath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.FunctionEnvironment":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object","Properties":{"Variables":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object","PrimitiveItemType":"String","Required":true,"Type":"Map","UpdateType":"Immutable"}}},"AWS::Serverless::Function.FunctionSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"FunctionName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.Hooks":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/safe_lambda_deployments.rst","Properties":{"PostTraffic":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#deploymentpreference-object","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PreTraffic":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#deploymentpreference-object","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.HttpApiEvent":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#httpapi","Properties":{"ApiId":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#httpapi","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Auth":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-httpapi.html","Required":false,"Type":"HttpApiFunctionAuth","UpdateType":"Immutable"},"Method":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#httpapi","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Path":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#httpapi","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PayloadFormatVersion":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#httpapi","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RouteSettings":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-routesettings","Required":false,"Type":"RouteSettings","UpdateType":"Immutable"},"TimeoutInMillis":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#httpapi","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.HttpApiFunctionAuth":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-httpapifunctionauth.html","Properties":{"AuthorizationScopes":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-httpapifunctionauth.html","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Authorizer":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-httpapifunctionauth.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.IAMPolicyDocument":{"Documentation":"http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html","Properties":{"Statement":{"Documentation":"http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html","PrimitiveType":"Json","Required":true,"UpdateType":"Immutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.IdentitySAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"IdentityName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.ImageConfig":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-imageconfig.html","Properties":{"Command":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-imageconfig.html#cfn-lambda-function-imageconfig-command","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"EntryPoint":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-imageconfig.html#cfn-lambda-function-imageconfig-entrypoint","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"WorkingDirectory":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-imageconfig.html#cfn-lambda-function-imageconfig-workingdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.IoTRuleEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#iotrule","Properties":{"AwsIotSqlVersion":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#iotrule","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Sql":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#iotrule","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.KeySAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"KeyId":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.KinesisEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#kinesis","Properties":{"BatchSize":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#kinesis","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Enabled":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#kinesis","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"FunctionResponseTypes":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#kinesis","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"StartingPosition":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#kinesis","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Stream":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#kinesis","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.LogGroupSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"LogGroupName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.ParameterNameSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"ParameterName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.ProvisionedConcurrencyConfig":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#provisioned-concurrency-config-object","Properties":{"ProvisionedConcurrentExecutions":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#provisioned-concurrency-config-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.QueueSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"QueueName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.RequestModel":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-requestmodel.html","Properties":{"Model":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-requestmodel.html#sam-function-requestmodel-model","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Required":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-requestmodel.html#sam-function-requestmodel-required","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ValidateBody":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-requestmodel.html#sam-function-requestmodel-validatebody","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ValidateParameters":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-requestmodel.html#sam-function-requestmodel-validateparameters","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.RequestParameter":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-requestparameter.html","Properties":{"Caching":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-requestparameter.html#sam-function-requestparameter-caching","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Required":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-requestparameter.html#sam-function-requestparameter-required","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.RouteSettings":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html","Properties":{"DataTraceEnabled":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-datatraceenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DetailedMetricsEnabled":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-detailedmetricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"LoggingLevel":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-logginglevel","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ThrottlingBurstLimit":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-throttlingburstlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ThrottlingRateLimit":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-throttlingratelimit","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.S3Event":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3","Properties":{"Bucket":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Events":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3","PrimitiveItemTypes":["String"],"PrimitiveTypes":["String"],"Required":true,"UpdateType":"Immutable"},"Filter":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3","Required":false,"Type":"S3NotificationFilter","UpdateType":"Immutable"}}},"AWS::Serverless::Function.S3KeyFilter":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter.html","Properties":{"Rules":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter.html","ItemType":"S3KeyFilterRule","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Serverless::Function.S3KeyFilterRule":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key-rules.html","Properties":{"Name":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key-rules.html","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter-s3key-rules.html","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.S3Location":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3-location-object","Properties":{"Bucket":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Key":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Version":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.S3NotificationFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter.html","Properties":{"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfiguration-config-filter.html","Required":true,"Type":"S3KeyFilter","UpdateType":"Immutable"}}},"AWS::Serverless::Function.SAMPolicyTemplate":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"AMIDescribePolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"EmptySAMPT","UpdateType":"Immutable"},"AWSSecretsManagerGetSecretValuePolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"SecretArnSAMPT","UpdateType":"Immutable"},"CloudFormationDescribeStacksPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"EmptySAMPT","UpdateType":"Immutable"},"CloudWatchPutMetricPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"EmptySAMPT","UpdateType":"Immutable"},"DynamoDBCrudPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"TableSAMPT","UpdateType":"Immutable"},"DynamoDBReadPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"TableSAMPT","UpdateType":"Immutable"},"DynamoDBStreamReadPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"TableStreamSAMPT","UpdateType":"Immutable"},"DynamoDBWritePolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"TableSAMPT","UpdateType":"Immutable"},"EC2DescribePolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"EmptySAMPT","UpdateType":"Immutable"},"ElasticsearchHttpPostPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"DomainSAMPT","UpdateType":"Immutable"},"FilterLogEventsPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"LogGroupSAMPT","UpdateType":"Immutable"},"KMSDecryptPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"KeySAMPT","UpdateType":"Immutable"},"KinesisCrudPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"StreamSAMPT","UpdateType":"Immutable"},"KinesisStreamReadPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"StreamSAMPT","UpdateType":"Immutable"},"LambdaInvokePolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"FunctionSAMPT","UpdateType":"Immutable"},"RekognitionDetectOnlyPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"EmptySAMPT","UpdateType":"Immutable"},"RekognitionLabelsPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"EmptySAMPT","UpdateType":"Immutable"},"RekognitionNoDataAccessPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"CollectionSAMPT","UpdateType":"Immutable"},"RekognitionReadPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"CollectionSAMPT","UpdateType":"Immutable"},"RekognitionWriteOnlyAccessPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"CollectionSAMPT","UpdateType":"Immutable"},"S3CrudPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"BucketSAMPT","UpdateType":"Immutable"},"S3ReadPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"BucketSAMPT","UpdateType":"Immutable"},"S3WritePolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"BucketSAMPT","UpdateType":"Immutable"},"SESBulkTemplatedCrudPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"IdentitySAMPT","UpdateType":"Immutable"},"SESCrudPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"IdentitySAMPT","UpdateType":"Immutable"},"SESEmailTemplateCrudPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"EmptySAMPT","UpdateType":"Immutable"},"SESSendBouncePolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"IdentitySAMPT","UpdateType":"Immutable"},"SNSCrudPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"TopicSAMPT","UpdateType":"Immutable"},"SNSPublishMessagePolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"TopicSAMPT","UpdateType":"Immutable"},"SQSPollerPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"QueueSAMPT","UpdateType":"Immutable"},"SQSSendMessagePolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"QueueSAMPT","UpdateType":"Immutable"},"SSMParameterReadPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"ParameterNameSAMPT","UpdateType":"Immutable"},"StepFunctionsExecutionPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"StateMachineSAMPT","UpdateType":"Immutable"},"VPCAccessPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"EmptySAMPT","UpdateType":"Immutable"}}},"AWS::Serverless::Function.SNSEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#sns","Properties":{"Topic":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#sns","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.SQSEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#sqs","Properties":{"BatchSize":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#sqs","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Enabled":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#sqs","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Queue":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#sqs","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.ScheduleEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#schedule","Properties":{"Description":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#schedule","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Enabled":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#schedule","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Input":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#schedule","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#schedule","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Schedule":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#schedule","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.SecretArnSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"SecretArn":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.StateMachineSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"StateMachineName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.StreamSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"StreamName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.TableSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"TableName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.TableStreamSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"StreamName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TableName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.TopicSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"TopicName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Function.VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-vpcconfig.html","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-vpcconfig.html","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Serverless::HttpApi.AccessLogSetting":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-accesslogsetting.html","Properties":{"DestinationArn":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-accesslogsetting.html#cfn-apigateway-stage-accesslogsetting-destinationarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Format":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-accesslogsetting.html#cfn-apigateway-stage-accesslogsetting-format","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::HttpApi.CorsConfigurationObject":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration-object","Properties":{"AllowCredentials":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration-object","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"AllowHeaders":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AllowMethods":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AllowOrigins":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ExposeHeaders":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration-object","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"MaxAge":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#cors-configuration-object","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::HttpApi.HttpApiAuth":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-httpapi-httpapiauth.html","Properties":{"Authorizers":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-httpapi-httpapiauth.html#sam-httpapi-httpapiauth-defaultauthorizer","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"DefaultAuthorizer":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-httpapi-httpapiauth.html#sam-httpapi-httpapiauth-authorizers","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::HttpApi.HttpApiDomainConfiguration":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#domain-configuration-object","Properties":{"BasePath":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#domain-configuration-object","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CertificateArn":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#domain-configuration-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DomainName":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#domain-configuration-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EndpointConfiguration":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#domain-configuration-object","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MutualTlsAuthentication":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-httpapi-httpapidomainconfiguration.html#sam-httpapi-httpapidomainconfiguration-mutualtlsauthentication","Required":false,"Type":"MutualTlsAuthentication","UpdateType":"Immutable"},"Route53":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#domain-configuration-object","Required":false,"Type":"Route53Configuration","UpdateType":"Immutable"},"SecurityPolicy":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#domain-configuration-object","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::HttpApi.MutualTlsAuthentication":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-mutualtlsauthentication.html","Properties":{"TruststoreUri":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-mutualtlsauthentication.html#cfn-apigatewayv2-domainname-mutualtlsauthentication-truststoreuri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TruststoreVersion":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-mutualtlsauthentication.html#cfn-apigatewayv2-domainname-mutualtlsauthentication-truststoreversion","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::HttpApi.Route53Configuration":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-httpapi-route53configuration.html","Properties":{"DistributedDomainName":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-httpapi-route53configuration.html#sam-httpapi-route53configuration-distributiondomainname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EvaluateTargetHealth":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-httpapi-route53configuration.html#sam-httpapi-route53configuration-evaluatetargethealth","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"HostedZoneId":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-httpapi-route53configuration.html#sam-httpapi-route53configuration-hostedzoneid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"HostedZoneName":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-httpapi-route53configuration.html#sam-httpapi-route53configuration-hostedzonename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IpV6":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-httpapi-route53configuration.html#sam-httpapi-route53configuration-ipv6","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::HttpApi.RouteSettings":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html","Properties":{"DataTraceEnabled":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-datatraceenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DetailedMetricsEnabled":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-detailedmetricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"LoggingLevel":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-logginglevel","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ThrottlingBurstLimit":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-throttlingburstlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ThrottlingRateLimit":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-stage-routesettings.html#cfn-apigatewayv2-stage-routesettings-throttlingratelimit","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::HttpApi.S3Location":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3-location-object","Properties":{"Bucket":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3-location-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Key":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3-location-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Version":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3-location-object","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::LayerVersion.S3Location":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3-location-object","Properties":{"Bucket":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Key":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Version":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::SimpleTable.PrimaryKey":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#primary-key-object","Properties":{"Name":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#primary-key-object","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#primary-key-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::SimpleTable.ProvisionedThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-provisionedthroughput.html","Properties":{"ReadCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-provisionedthroughput.html","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"WriteCapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-provisionedthroughput.html","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::SimpleTable.SSESpecification":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-ssespecification.html","Properties":{"SSEEnabled":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-table-ssespecification.html","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.ApiEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","Properties":{"Method":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Path":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RestApiId":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.CloudWatchEventEvent":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-statemachine-cloudwatchevent.html","Properties":{"EventBusName":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-statemachine-cloudwatchevent.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Input":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-statemachine-cloudwatchevent.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InputPath":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-statemachine-cloudwatchevent.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Pattern":{"Documentation":"http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CloudWatchEventsandEventPatterns.html","PrimitiveType":"Json","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.CloudWatchLogsLogGroup":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-logdestination-cloudwatchlogsloggroup.html","Properties":{"LogGroupArn":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-logdestination-cloudwatchlogsloggroup.html","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.EventBridgeRuleEvent":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-statemachine-cloudwatchevent.html","Properties":{"EventBusName":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-statemachine-cloudwatchevent.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Input":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-statemachine-cloudwatchevent.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InputPath":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-statemachine-cloudwatchevent.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Pattern":{"Documentation":"http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CloudWatchEventsandEventPatterns.html","PrimitiveType":"Json","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.EventSource":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#event-source-object","Properties":{"Properties":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#event-source-types","Required":true,"Types":["CloudWatchEventEvent","EventBridgeRuleEvent","ScheduleEvent","ApiEvent"],"UpdateType":"Immutable"},"Type":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#event-source-object","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.FunctionSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"FunctionName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.IAMPolicyDocument":{"Documentation":"http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html","Properties":{"Statement":{"Documentation":"http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html","PrimitiveType":"Json","Required":true,"UpdateType":"Immutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.LogDestination":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-logdestination.html#cfn-stepfunctions-statemachine-logdestination-cloudwatchlogsloggroup","Properties":{"CloudWatchLogsLogGroup":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-logdestination.html#cfn-stepfunctions-statemachine-logdestination-cloudwatchlogsloggroup","Required":true,"Type":"CloudWatchLogsLogGroup","UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.LoggingConfiguration":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-loggingconfiguration.html","Properties":{"Destinations":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-loggingconfiguration.html","ItemType":"LogDestination","Required":true,"Type":"List","UpdateType":"Immutable"},"IncludeExecutionData":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-loggingconfiguration.html","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"Level":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-loggingconfiguration.html","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.S3Location":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3-location-object","Properties":{"Bucket":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Key":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Version":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.SAMPolicyTemplate":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"LambdaInvokePolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"FunctionSAMPT","UpdateType":"Immutable"},"StepFunctionsExecutionPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Type":"StateMachineSAMPT","UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.ScheduleEvent":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#schedule","Properties":{"Input":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#schedule","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Schedule":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#schedule","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.StateMachineSAMPT":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","Properties":{"StateMachineName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/docs/policy_templates.rst","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::StateMachine.TracingConfiguration":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api","Properties":{"Enabled":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-tracingconfiguration.html","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::ServiceCatalog::CloudFormationProduct.CodeStarParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-codestarparameters.html","Properties":{"ArtifactPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-codestarparameters.html#cfn-servicecatalog-cloudformationproduct-codestarparameters-artifactpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Branch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-codestarparameters.html#cfn-servicecatalog-cloudformationproduct-codestarparameters-branch","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConnectionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-codestarparameters.html#cfn-servicecatalog-cloudformationproduct-codestarparameters-connectionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Repository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-codestarparameters.html#cfn-servicecatalog-cloudformationproduct-codestarparameters-repository","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ServiceCatalog::CloudFormationProduct.ConnectionParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-sourceconnection-connectionparameters.html","Properties":{"CodeStar":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-sourceconnection-connectionparameters.html#cfn-servicecatalog-cloudformationproduct-sourceconnection-connectionparameters-codestar","Required":false,"Type":"CodeStarParameters","UpdateType":"Mutable"}}},"AWS::ServiceCatalog::CloudFormationProduct.ProvisioningArtifactProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-provisioningartifactproperties.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-provisioningartifactproperties.html#cfn-servicecatalog-cloudformationproduct-provisioningartifactproperties-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisableTemplateValidation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-provisioningartifactproperties.html#cfn-servicecatalog-cloudformationproduct-provisioningartifactproperties-disabletemplatevalidation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Info":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-provisioningartifactproperties.html#cfn-servicecatalog-cloudformationproduct-provisioningartifactproperties-info","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-provisioningartifactproperties.html#cfn-servicecatalog-cloudformationproduct-provisioningartifactproperties-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-provisioningartifactproperties.html#cfn-servicecatalog-cloudformationproduct-provisioningartifactproperties-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ServiceCatalog::CloudFormationProduct.SourceConnection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-sourceconnection.html","Properties":{"ConnectionParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-sourceconnection.html#cfn-servicecatalog-cloudformationproduct-sourceconnection-connectionparameters","Required":true,"Type":"ConnectionParameters","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationproduct-sourceconnection.html#cfn-servicecatalog-cloudformationproduct-sourceconnection-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ServiceCatalog::CloudFormationProvisionedProduct.ProvisioningParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationprovisionedproduct-provisioningparameter.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationprovisionedproduct-provisioningparameter.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningparameter-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationprovisionedproduct-provisioningparameter.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningparameter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ServiceCatalog::CloudFormationProvisionedProduct.ProvisioningPreferences":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences.html","Properties":{"StackSetAccounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences-stacksetaccounts","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"StackSetFailureToleranceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences-stacksetfailuretolerancecount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StackSetFailureTolerancePercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences-stacksetfailuretolerancepercentage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StackSetMaxConcurrencyCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences-stacksetmaxconcurrencycount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StackSetMaxConcurrencyPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences-stacksetmaxconcurrencypercentage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StackSetOperationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences-stacksetoperationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StackSetRegions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences-stacksetregions","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ServiceCatalog::ServiceAction.DefinitionParameter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-serviceaction-definitionparameter.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-serviceaction-definitionparameter.html#cfn-servicecatalog-serviceaction-definitionparameter-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicecatalog-serviceaction-definitionparameter.html#cfn-servicecatalog-serviceaction-definitionparameter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::PrivateDnsNamespace.PrivateDnsPropertiesMutable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-privatednsnamespace-privatednspropertiesmutable.html","Properties":{"SOA":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-privatednsnamespace-privatednspropertiesmutable.html#cfn-servicediscovery-privatednsnamespace-privatednspropertiesmutable-soa","Required":false,"Type":"SOA","UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::PrivateDnsNamespace.Properties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-privatednsnamespace-properties.html","Properties":{"DnsProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-privatednsnamespace-properties.html#cfn-servicediscovery-privatednsnamespace-properties-dnsproperties","Required":false,"Type":"PrivateDnsPropertiesMutable","UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::PrivateDnsNamespace.SOA":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-privatednsnamespace-soa.html","Properties":{"TTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-privatednsnamespace-soa.html#cfn-servicediscovery-privatednsnamespace-soa-ttl","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::PublicDnsNamespace.Properties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-publicdnsnamespace-properties.html","Properties":{"DnsProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-publicdnsnamespace-properties.html#cfn-servicediscovery-publicdnsnamespace-properties-dnsproperties","Required":false,"Type":"PublicDnsPropertiesMutable","UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::PublicDnsNamespace.PublicDnsPropertiesMutable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-publicdnsnamespace-publicdnspropertiesmutable.html","Properties":{"SOA":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-publicdnsnamespace-publicdnspropertiesmutable.html#cfn-servicediscovery-publicdnsnamespace-publicdnspropertiesmutable-soa","Required":false,"Type":"SOA","UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::PublicDnsNamespace.SOA":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-publicdnsnamespace-soa.html","Properties":{"TTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-publicdnsnamespace-soa.html#cfn-servicediscovery-publicdnsnamespace-soa-ttl","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::Service.DnsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-dnsconfig.html","Properties":{"DnsRecords":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-dnsconfig.html#cfn-servicediscovery-service-dnsconfig-dnsrecords","ItemType":"DnsRecord","Required":true,"Type":"List","UpdateType":"Mutable"},"NamespaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-dnsconfig.html#cfn-servicediscovery-service-dnsconfig-namespaceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RoutingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-dnsconfig.html#cfn-servicediscovery-service-dnsconfig-routingpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::Service.DnsRecord":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-dnsrecord.html","Properties":{"TTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-dnsrecord.html#cfn-servicediscovery-service-dnsrecord-ttl","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-dnsrecord.html#cfn-servicediscovery-service-dnsrecord-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::Service.HealthCheckConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-healthcheckconfig.html","Properties":{"FailureThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-healthcheckconfig.html#cfn-servicediscovery-service-healthcheckconfig-failurethreshold","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ResourcePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-healthcheckconfig.html#cfn-servicediscovery-service-healthcheckconfig-resourcepath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-healthcheckconfig.html#cfn-servicediscovery-service-healthcheckconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::Service.HealthCheckCustomConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-healthcheckcustomconfig.html","Properties":{"FailureThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-servicediscovery-service-healthcheckcustomconfig.html#cfn-servicediscovery-service-healthcheckcustomconfig-failurethreshold","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::Shield::ProactiveEngagement.EmergencyContact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-shield-proactiveengagement-emergencycontact.html","Properties":{"ContactNotes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-shield-proactiveengagement-emergencycontact.html#cfn-shield-proactiveengagement-emergencycontact-contactnotes","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EmailAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-shield-proactiveengagement-emergencycontact.html#cfn-shield-proactiveengagement-emergencycontact-emailaddress","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PhoneNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-shield-proactiveengagement-emergencycontact.html#cfn-shield-proactiveengagement-emergencycontact-phonenumber","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Shield::Protection.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-shield-protection-action.html","Properties":{"Block":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-shield-protection-action.html#cfn-shield-protection-action-block","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-shield-protection-action.html#cfn-shield-protection-action-count","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Shield::Protection.ApplicationLayerAutomaticResponseConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-shield-protection-applicationlayerautomaticresponseconfiguration.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-shield-protection-applicationlayerautomaticresponseconfiguration.html#cfn-shield-protection-applicationlayerautomaticresponseconfiguration-action","Required":true,"Type":"Action","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-shield-protection-applicationlayerautomaticresponseconfiguration.html#cfn-shield-protection-applicationlayerautomaticresponseconfiguration-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Signer::SigningProfile.SignatureValidityPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-signer-signingprofile-signaturevalidityperiod.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-signer-signingprofile-signaturevalidityperiod.html#cfn-signer-signingprofile-signaturevalidityperiod-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-signer-signingprofile-signaturevalidityperiod.html#cfn-signer-signingprofile-signaturevalidityperiod-value","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::SimSpaceWeaver::Simulation.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-simspaceweaver-simulation-s3location.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-simspaceweaver-simulation-s3location.html#cfn-simspaceweaver-simulation-s3location-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ObjectKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-simspaceweaver-simulation-s3location.html#cfn-simspaceweaver-simulation-s3location-objectkey","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::StepFunctions::Activity.TagsEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-activity-tagsentry.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-activity-tagsentry.html#cfn-stepfunctions-activity-tagsentry-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-activity-tagsentry.html#cfn-stepfunctions-activity-tagsentry-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::StepFunctions::StateMachine.CloudWatchLogsLogGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-cloudwatchlogsloggroup.html","Properties":{"LogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-cloudwatchlogsloggroup.html#cfn-stepfunctions-statemachine-cloudwatchlogsloggroup-loggrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::StepFunctions::StateMachine.LogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-logdestination.html","Properties":{"CloudWatchLogsLogGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-logdestination.html#cfn-stepfunctions-statemachine-logdestination-cloudwatchlogsloggroup","Required":false,"Type":"CloudWatchLogsLogGroup","UpdateType":"Mutable"}}},"AWS::StepFunctions::StateMachine.LoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-loggingconfiguration.html","Properties":{"Destinations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-loggingconfiguration.html#cfn-stepfunctions-statemachine-loggingconfiguration-destinations","DuplicatesAllowed":true,"ItemType":"LogDestination","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludeExecutionData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-loggingconfiguration.html#cfn-stepfunctions-statemachine-loggingconfiguration-includeexecutiondata","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Level":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-loggingconfiguration.html#cfn-stepfunctions-statemachine-loggingconfiguration-level","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::StepFunctions::StateMachine.S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-s3location.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-s3location.html#cfn-stepfunctions-statemachine-s3location-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-s3location.html#cfn-stepfunctions-statemachine-s3location-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-s3location.html#cfn-stepfunctions-statemachine-s3location-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::StepFunctions::StateMachine.TagsEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-tagsentry.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-tagsentry.html#cfn-stepfunctions-statemachine-tagsentry-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-tagsentry.html#cfn-stepfunctions-statemachine-tagsentry-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::StepFunctions::StateMachine.TracingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-tracingconfiguration.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachine-tracingconfiguration.html#cfn-stepfunctions-statemachine-tracingconfiguration-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::StepFunctions::StateMachineAlias.DeploymentPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html","Properties":{"Alarms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html#cfn-stepfunctions-statemachinealias-deploymentpreference-alarms","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Interval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html#cfn-stepfunctions-statemachinealias-deploymentpreference-interval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Percentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html#cfn-stepfunctions-statemachinealias-deploymentpreference-percentage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StateMachineVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html#cfn-stepfunctions-statemachinealias-deploymentpreference-statemachineversionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-deploymentpreference.html#cfn-stepfunctions-statemachinealias-deploymentpreference-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::StepFunctions::StateMachineAlias.RoutingConfigurationVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-routingconfigurationversion.html","Properties":{"StateMachineVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-routingconfigurationversion.html#cfn-stepfunctions-statemachinealias-routingconfigurationversion-statemachineversionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stepfunctions-statemachinealias-routingconfigurationversion.html#cfn-stepfunctions-statemachinealias-routingconfigurationversion-weight","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Synthetics::Canary.ArtifactConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-artifactconfig.html","Properties":{"S3Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-artifactconfig.html#cfn-synthetics-canary-artifactconfig-s3encryption","Required":false,"Type":"S3Encryption","UpdateType":"Mutable"}}},"AWS::Synthetics::Canary.BaseScreenshot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-basescreenshot.html","Properties":{"IgnoreCoordinates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-basescreenshot.html#cfn-synthetics-canary-basescreenshot-ignorecoordinates","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ScreenshotName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-basescreenshot.html#cfn-synthetics-canary-basescreenshot-screenshotname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Synthetics::Canary.Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-code.html","Properties":{"Handler":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-code.html#cfn-synthetics-canary-code-handler","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-code.html#cfn-synthetics-canary-code-s3bucket","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-code.html#cfn-synthetics-canary-code-s3key","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-code.html#cfn-synthetics-canary-code-s3objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Script":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-code.html#cfn-synthetics-canary-code-script","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceLocationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-code.html#cfn-synthetics-canary-code-sourcelocationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Synthetics::Canary.RunConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-runconfig.html","Properties":{"ActiveTracing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-runconfig.html#cfn-synthetics-canary-runconfig-activetracing","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnvironmentVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-runconfig.html#cfn-synthetics-canary-runconfig-environmentvariables","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"MemoryInMB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-runconfig.html#cfn-synthetics-canary-runconfig-memoryinmb","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-runconfig.html#cfn-synthetics-canary-runconfig-timeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Synthetics::Canary.S3Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-s3encryption.html","Properties":{"EncryptionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-s3encryption.html#cfn-synthetics-canary-s3encryption-encryptionmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-s3encryption.html#cfn-synthetics-canary-s3encryption-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Synthetics::Canary.Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-schedule.html","Properties":{"DurationInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-schedule.html#cfn-synthetics-canary-schedule-durationinseconds","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-schedule.html#cfn-synthetics-canary-schedule-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Synthetics::Canary.VPCConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-vpcconfig.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-vpcconfig.html#cfn-synthetics-canary-vpcconfig-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-vpcconfig.html#cfn-synthetics-canary-vpcconfig-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-vpcconfig.html#cfn-synthetics-canary-vpcconfig-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Synthetics::Canary.VisualReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-visualreference.html","Properties":{"BaseCanaryRunId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-visualreference.html#cfn-synthetics-canary-visualreference-basecanaryrunid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BaseScreenshots":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-synthetics-canary-visualreference.html#cfn-synthetics-canary-visualreference-basescreenshots","DuplicatesAllowed":true,"ItemType":"BaseScreenshot","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SystemsManagerSAP::Application.Credential":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-systemsmanagersap-application-credential.html","Properties":{"CredentialType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-systemsmanagersap-application-credential.html#cfn-systemsmanagersap-application-credential-credentialtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-systemsmanagersap-application-credential.html#cfn-systemsmanagersap-application-credential-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-systemsmanagersap-application-credential.html#cfn-systemsmanagersap-application-credential-secretid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Timestream::ScheduledQuery.DimensionMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-dimensionmapping.html","Properties":{"DimensionValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-dimensionmapping.html#cfn-timestream-scheduledquery-dimensionmapping-dimensionvaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-dimensionmapping.html#cfn-timestream-scheduledquery-dimensionmapping-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Timestream::ScheduledQuery.ErrorReportConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-errorreportconfiguration.html","Properties":{"S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-errorreportconfiguration.html#cfn-timestream-scheduledquery-errorreportconfiguration-s3configuration","Required":true,"Type":"S3Configuration","UpdateType":"Immutable"}}},"AWS::Timestream::ScheduledQuery.MixedMeasureMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-mixedmeasuremapping.html","Properties":{"MeasureName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-mixedmeasuremapping.html#cfn-timestream-scheduledquery-mixedmeasuremapping-measurename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MeasureValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-mixedmeasuremapping.html#cfn-timestream-scheduledquery-mixedmeasuremapping-measurevaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MultiMeasureAttributeMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-mixedmeasuremapping.html#cfn-timestream-scheduledquery-mixedmeasuremapping-multimeasureattributemappings","DuplicatesAllowed":true,"ItemType":"MultiMeasureAttributeMapping","Required":false,"Type":"List","UpdateType":"Immutable"},"SourceColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-mixedmeasuremapping.html#cfn-timestream-scheduledquery-mixedmeasuremapping-sourcecolumn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TargetMeasureName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-mixedmeasuremapping.html#cfn-timestream-scheduledquery-mixedmeasuremapping-targetmeasurename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Timestream::ScheduledQuery.MultiMeasureAttributeMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-multimeasureattributemapping.html","Properties":{"MeasureValueType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-multimeasureattributemapping.html#cfn-timestream-scheduledquery-multimeasureattributemapping-measurevaluetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SourceColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-multimeasureattributemapping.html#cfn-timestream-scheduledquery-multimeasureattributemapping-sourcecolumn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TargetMultiMeasureAttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-multimeasureattributemapping.html#cfn-timestream-scheduledquery-multimeasureattributemapping-targetmultimeasureattributename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Timestream::ScheduledQuery.MultiMeasureMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-multimeasuremappings.html","Properties":{"MultiMeasureAttributeMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-multimeasuremappings.html#cfn-timestream-scheduledquery-multimeasuremappings-multimeasureattributemappings","DuplicatesAllowed":true,"ItemType":"MultiMeasureAttributeMapping","Required":true,"Type":"List","UpdateType":"Immutable"},"TargetMultiMeasureName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-multimeasuremappings.html#cfn-timestream-scheduledquery-multimeasuremappings-targetmultimeasurename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Timestream::ScheduledQuery.NotificationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-notificationconfiguration.html","Properties":{"SnsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-notificationconfiguration.html#cfn-timestream-scheduledquery-notificationconfiguration-snsconfiguration","Required":true,"Type":"SnsConfiguration","UpdateType":"Immutable"}}},"AWS::Timestream::ScheduledQuery.S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-s3configuration.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-s3configuration.html#cfn-timestream-scheduledquery-s3configuration-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EncryptionOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-s3configuration.html#cfn-timestream-scheduledquery-s3configuration-encryptionoption","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ObjectKeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-s3configuration.html#cfn-timestream-scheduledquery-s3configuration-objectkeyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Timestream::ScheduledQuery.ScheduleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-scheduleconfiguration.html","Properties":{"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-scheduleconfiguration.html#cfn-timestream-scheduledquery-scheduleconfiguration-scheduleexpression","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Timestream::ScheduledQuery.SnsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-snsconfiguration.html","Properties":{"TopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-snsconfiguration.html#cfn-timestream-scheduledquery-snsconfiguration-topicarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Timestream::ScheduledQuery.TargetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-targetconfiguration.html","Properties":{"TimestreamConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-targetconfiguration.html#cfn-timestream-scheduledquery-targetconfiguration-timestreamconfiguration","Required":true,"Type":"TimestreamConfiguration","UpdateType":"Immutable"}}},"AWS::Timestream::ScheduledQuery.TimestreamConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-timestreamconfiguration.html","Properties":{"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-timestreamconfiguration.html#cfn-timestream-scheduledquery-timestreamconfiguration-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DimensionMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-timestreamconfiguration.html#cfn-timestream-scheduledquery-timestreamconfiguration-dimensionmappings","DuplicatesAllowed":true,"ItemType":"DimensionMapping","Required":true,"Type":"List","UpdateType":"Immutable"},"MeasureNameColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-timestreamconfiguration.html#cfn-timestream-scheduledquery-timestreamconfiguration-measurenamecolumn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MixedMeasureMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-timestreamconfiguration.html#cfn-timestream-scheduledquery-timestreamconfiguration-mixedmeasuremappings","DuplicatesAllowed":true,"ItemType":"MixedMeasureMapping","Required":false,"Type":"List","UpdateType":"Immutable"},"MultiMeasureMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-timestreamconfiguration.html#cfn-timestream-scheduledquery-timestreamconfiguration-multimeasuremappings","Required":false,"Type":"MultiMeasureMappings","UpdateType":"Immutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-timestreamconfiguration.html#cfn-timestream-scheduledquery-timestreamconfiguration-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TimeColumn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-scheduledquery-timestreamconfiguration.html#cfn-timestream-scheduledquery-timestreamconfiguration-timecolumn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Timestream::Table.MagneticStoreRejectedDataLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-magneticstorerejecteddatalocation.html","Properties":{"S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-magneticstorerejecteddatalocation.html#cfn-timestream-table-magneticstorerejecteddatalocation-s3configuration","Required":false,"Type":"S3Configuration","UpdateType":"Mutable"}}},"AWS::Timestream::Table.MagneticStoreWriteProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-magneticstorewriteproperties.html","Properties":{"EnableMagneticStoreWrites":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-magneticstorewriteproperties.html#cfn-timestream-table-magneticstorewriteproperties-enablemagneticstorewrites","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"MagneticStoreRejectedDataLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-magneticstorewriteproperties.html#cfn-timestream-table-magneticstorewriteproperties-magneticstorerejecteddatalocation","Required":false,"Type":"MagneticStoreRejectedDataLocation","UpdateType":"Mutable"}}},"AWS::Timestream::Table.RetentionProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-retentionproperties.html","Properties":{"MagneticStoreRetentionPeriodInDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-retentionproperties.html#cfn-timestream-table-retentionproperties-magneticstoreretentionperiodindays","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MemoryStoreRetentionPeriodInHours":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-retentionproperties.html#cfn-timestream-table-retentionproperties-memorystoreretentionperiodinhours","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Timestream::Table.S3Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-s3configuration.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-s3configuration.html#cfn-timestream-table-s3configuration-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EncryptionOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-s3configuration.html#cfn-timestream-table-s3configuration-encryptionoption","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-s3configuration.html#cfn-timestream-table-s3configuration-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ObjectKeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-timestream-table-s3configuration.html#cfn-timestream-table-s3configuration-objectkeyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Transfer::Connector.As2Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-connector-as2config.html","Properties":{"Compression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-connector-as2config.html#cfn-transfer-connector-as2config-compression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionAlgorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-connector-as2config.html#cfn-transfer-connector-as2config-encryptionalgorithm","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LocalProfileId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-connector-as2config.html#cfn-transfer-connector-as2config-localprofileid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MdnResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-connector-as2config.html#cfn-transfer-connector-as2config-mdnresponse","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MdnSigningAlgorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-connector-as2config.html#cfn-transfer-connector-as2config-mdnsigningalgorithm","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MessageSubject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-connector-as2config.html#cfn-transfer-connector-as2config-messagesubject","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PartnerProfileId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-connector-as2config.html#cfn-transfer-connector-as2config-partnerprofileid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SigningAlgorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-connector-as2config.html#cfn-transfer-connector-as2config-signingalgorithm","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Transfer::Server.As2Transport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-as2transport.html","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AWS::Transfer::Server.EndpointDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-endpointdetails.html","Properties":{"AddressAllocationIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-endpointdetails.html#cfn-transfer-server-endpointdetails-addressallocationids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Conditional"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-endpointdetails.html#cfn-transfer-server-endpointdetails-securitygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-endpointdetails.html#cfn-transfer-server-endpointdetails-subnetids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-endpointdetails.html#cfn-transfer-server-endpointdetails-vpcendpointid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-endpointdetails.html#cfn-transfer-server-endpointdetails-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Transfer::Server.IdentityProviderDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-identityproviderdetails.html","Properties":{"DirectoryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-identityproviderdetails.html#cfn-transfer-server-identityproviderdetails-directoryid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Function":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-identityproviderdetails.html#cfn-transfer-server-identityproviderdetails-function","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InvocationRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-identityproviderdetails.html#cfn-transfer-server-identityproviderdetails-invocationrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SftpAuthenticationMethods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-identityproviderdetails.html#cfn-transfer-server-identityproviderdetails-sftpauthenticationmethods","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-identityproviderdetails.html#cfn-transfer-server-identityproviderdetails-url","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Transfer::Server.Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-protocol.html","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AWS::Transfer::Server.ProtocolDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-protocoldetails.html","Properties":{"As2Transports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-protocoldetails.html#cfn-transfer-server-protocoldetails-as2transports","ItemType":"As2Transport","Required":false,"Type":"List","UpdateType":"Mutable"},"PassiveIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-protocoldetails.html#cfn-transfer-server-protocoldetails-passiveip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SetStatOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-protocoldetails.html#cfn-transfer-server-protocoldetails-setstatoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TlsSessionResumptionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-protocoldetails.html#cfn-transfer-server-protocoldetails-tlssessionresumptionmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Transfer::Server.StructuredLogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-structuredlogdestination.html","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AWS::Transfer::Server.WorkflowDetail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-workflowdetail.html","Properties":{"ExecutionRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-workflowdetail.html#cfn-transfer-server-workflowdetail-executionrole","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"WorkflowId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-workflowdetail.html#cfn-transfer-server-workflowdetail-workflowid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Transfer::Server.WorkflowDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-workflowdetails.html","Properties":{"OnPartialUpload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-workflowdetails.html#cfn-transfer-server-workflowdetails-onpartialupload","ItemType":"WorkflowDetail","Required":false,"Type":"List","UpdateType":"Mutable"},"OnUpload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-server-workflowdetails.html#cfn-transfer-server-workflowdetails-onupload","ItemType":"WorkflowDetail","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Transfer::User.HomeDirectoryMapEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-user-homedirectorymapentry.html","Properties":{"Entry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-user-homedirectorymapentry.html#cfn-transfer-user-homedirectorymapentry-entry","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-user-homedirectorymapentry.html#cfn-transfer-user-homedirectorymapentry-target","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Transfer::User.PosixProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-user-posixprofile.html","Properties":{"Gid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-user-posixprofile.html#cfn-transfer-user-posixprofile-gid","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"SecondaryGids":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-user-posixprofile.html#cfn-transfer-user-posixprofile-secondarygids","PrimitiveItemType":"Double","Required":false,"Type":"List","UpdateType":"Mutable"},"Uid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-user-posixprofile.html#cfn-transfer-user-posixprofile-uid","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::Transfer::User.SshPublicKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-user-sshpublickey.html","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AWS::Transfer::Workflow.CopyStepDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-copystepdetails.html","Properties":{"DestinationFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-copystepdetails.html#cfn-transfer-workflow-copystepdetails-destinationfilelocation","Required":false,"Type":"S3FileLocation","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-copystepdetails.html#cfn-transfer-workflow-copystepdetails-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OverwriteExisting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-copystepdetails.html#cfn-transfer-workflow-copystepdetails-overwriteexisting","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-copystepdetails.html#cfn-transfer-workflow-copystepdetails-sourcefilelocation","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Transfer::Workflow.CustomStepDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-customstepdetails.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-customstepdetails.html#cfn-transfer-workflow-customstepdetails-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-customstepdetails.html#cfn-transfer-workflow-customstepdetails-sourcefilelocation","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-customstepdetails.html#cfn-transfer-workflow-customstepdetails-target","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TimeoutSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-customstepdetails.html#cfn-transfer-workflow-customstepdetails-timeoutseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::Transfer::Workflow.DecryptStepDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-decryptstepdetails.html","Properties":{"DestinationFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-decryptstepdetails.html#cfn-transfer-workflow-decryptstepdetails-destinationfilelocation","Required":false,"Type":"InputFileLocation","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-decryptstepdetails.html#cfn-transfer-workflow-decryptstepdetails-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OverwriteExisting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-decryptstepdetails.html#cfn-transfer-workflow-decryptstepdetails-overwriteexisting","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-decryptstepdetails.html#cfn-transfer-workflow-decryptstepdetails-sourcefilelocation","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-decryptstepdetails.html#cfn-transfer-workflow-decryptstepdetails-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Transfer::Workflow.DeleteStepDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-deletestepdetails.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-deletestepdetails.html#cfn-transfer-workflow-deletestepdetails-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-deletestepdetails.html#cfn-transfer-workflow-deletestepdetails-sourcefilelocation","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Transfer::Workflow.EfsInputFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-efsinputfilelocation.html","Properties":{"FileSystemId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-efsinputfilelocation.html#cfn-transfer-workflow-efsinputfilelocation-filesystemid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-efsinputfilelocation.html#cfn-transfer-workflow-efsinputfilelocation-path","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Transfer::Workflow.InputFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-inputfilelocation.html","Properties":{"EfsFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-inputfilelocation.html#cfn-transfer-workflow-inputfilelocation-efsfilelocation","Required":false,"Type":"EfsInputFileLocation","UpdateType":"Immutable"},"S3FileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-inputfilelocation.html#cfn-transfer-workflow-inputfilelocation-s3filelocation","Required":false,"Type":"S3InputFileLocation","UpdateType":"Immutable"}}},"AWS::Transfer::Workflow.S3FileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-s3filelocation.html","Properties":{"S3FileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-s3filelocation.html#cfn-transfer-workflow-s3filelocation-s3filelocation","Required":false,"Type":"S3InputFileLocation","UpdateType":"Immutable"}}},"AWS::Transfer::Workflow.S3InputFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-s3inputfilelocation.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-s3inputfilelocation.html#cfn-transfer-workflow-s3inputfilelocation-bucket","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-s3inputfilelocation.html#cfn-transfer-workflow-s3inputfilelocation-key","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Transfer::Workflow.S3Tag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-s3tag.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-s3tag.html#cfn-transfer-workflow-s3tag-key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-s3tag.html#cfn-transfer-workflow-s3tag-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Transfer::Workflow.TagStepDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-tagstepdetails.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-tagstepdetails.html#cfn-transfer-workflow-tagstepdetails-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceFileLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-tagstepdetails.html#cfn-transfer-workflow-tagstepdetails-sourcefilelocation","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-tagstepdetails.html#cfn-transfer-workflow-tagstepdetails-tags","DuplicatesAllowed":false,"ItemType":"S3Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Transfer::Workflow.WorkflowStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-workflowstep.html","Properties":{"CopyStepDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-workflowstep.html#cfn-transfer-workflow-workflowstep-copystepdetails","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"CustomStepDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-workflowstep.html#cfn-transfer-workflow-workflowstep-customstepdetails","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"DecryptStepDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-workflowstep.html#cfn-transfer-workflow-workflowstep-decryptstepdetails","Required":false,"Type":"DecryptStepDetails","UpdateType":"Immutable"},"DeleteStepDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-workflowstep.html#cfn-transfer-workflow-workflowstep-deletestepdetails","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"TagStepDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-workflowstep.html#cfn-transfer-workflow-workflowstep-tagstepdetails","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-transfer-workflow-workflowstep.html#cfn-transfer-workflow-workflowstep-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::VerifiedPermissions::IdentitySource.CognitoUserPoolConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-identitysource-cognitouserpoolconfiguration.html","Properties":{"ClientIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-identitysource-cognitouserpoolconfiguration.html#cfn-verifiedpermissions-identitysource-cognitouserpoolconfiguration-clientids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"UserPoolArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-identitysource-cognitouserpoolconfiguration.html#cfn-verifiedpermissions-identitysource-cognitouserpoolconfiguration-userpoolarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::VerifiedPermissions::IdentitySource.IdentitySourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-identitysource-identitysourceconfiguration.html","Properties":{"CognitoUserPoolConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-identitysource-identitysourceconfiguration.html#cfn-verifiedpermissions-identitysource-identitysourceconfiguration-cognitouserpoolconfiguration","Required":true,"Type":"CognitoUserPoolConfiguration","UpdateType":"Mutable"}}},"AWS::VerifiedPermissions::IdentitySource.IdentitySourceDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-identitysource-identitysourcedetails.html","Properties":{"ClientIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-identitysource-identitysourcedetails.html#cfn-verifiedpermissions-identitysource-identitysourcedetails-clientids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DiscoveryUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-identitysource-identitysourcedetails.html#cfn-verifiedpermissions-identitysource-identitysourcedetails-discoveryurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OpenIdIssuer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-identitysource-identitysourcedetails.html#cfn-verifiedpermissions-identitysource-identitysourcedetails-openidissuer","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserPoolArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-identitysource-identitysourcedetails.html#cfn-verifiedpermissions-identitysource-identitysourcedetails-userpoolarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::VerifiedPermissions::Policy.EntityIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-entityidentifier.html","Properties":{"EntityId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-entityidentifier.html#cfn-verifiedpermissions-policy-entityidentifier-entityid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EntityType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-entityidentifier.html#cfn-verifiedpermissions-policy-entityidentifier-entitytype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::VerifiedPermissions::Policy.PolicyDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-policydefinition.html","Properties":{"Static":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-policydefinition.html#cfn-verifiedpermissions-policy-policydefinition-static","Required":false,"Type":"StaticPolicyDefinition","UpdateType":"Mutable"},"TemplateLinked":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-policydefinition.html#cfn-verifiedpermissions-policy-policydefinition-templatelinked","Required":false,"Type":"TemplateLinkedPolicyDefinition","UpdateType":"Mutable"}}},"AWS::VerifiedPermissions::Policy.StaticPolicyDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-staticpolicydefinition.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-staticpolicydefinition.html#cfn-verifiedpermissions-policy-staticpolicydefinition-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Statement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-staticpolicydefinition.html#cfn-verifiedpermissions-policy-staticpolicydefinition-statement","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::VerifiedPermissions::Policy.TemplateLinkedPolicyDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-templatelinkedpolicydefinition.html","Properties":{"PolicyTemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-templatelinkedpolicydefinition.html#cfn-verifiedpermissions-policy-templatelinkedpolicydefinition-policytemplateid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-templatelinkedpolicydefinition.html#cfn-verifiedpermissions-policy-templatelinkedpolicydefinition-principal","Required":false,"Type":"EntityIdentifier","UpdateType":"Mutable"},"Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policy-templatelinkedpolicydefinition.html#cfn-verifiedpermissions-policy-templatelinkedpolicydefinition-resource","Required":false,"Type":"EntityIdentifier","UpdateType":"Mutable"}}},"AWS::VerifiedPermissions::PolicyStore.SchemaDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policystore-schemadefinition.html","Properties":{"CedarJson":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policystore-schemadefinition.html#cfn-verifiedpermissions-policystore-schemadefinition-cedarjson","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::VerifiedPermissions::PolicyStore.ValidationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policystore-validationsettings.html","Properties":{"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-verifiedpermissions-policystore-validationsettings.html#cfn-verifiedpermissions-policystore-validationsettings-mode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::VoiceID::Domain.ServerSideEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-voiceid-domain-serversideencryptionconfiguration.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-voiceid-domain-serversideencryptionconfiguration.html#cfn-voiceid-domain-serversideencryptionconfiguration-kmskeyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::VpcLattice::Listener.DefaultAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-listener-defaultaction.html","Properties":{"FixedResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-listener-defaultaction.html#cfn-vpclattice-listener-defaultaction-fixedresponse","Required":false,"Type":"FixedResponse","UpdateType":"Mutable"},"Forward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-listener-defaultaction.html#cfn-vpclattice-listener-defaultaction-forward","Required":false,"Type":"Forward","UpdateType":"Mutable"}}},"AWS::VpcLattice::Listener.FixedResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-listener-fixedresponse.html","Properties":{"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-listener-fixedresponse.html#cfn-vpclattice-listener-fixedresponse-statuscode","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::VpcLattice::Listener.Forward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-listener-forward.html","Properties":{"TargetGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-listener-forward.html#cfn-vpclattice-listener-forward-targetgroups","DuplicatesAllowed":true,"ItemType":"WeightedTargetGroup","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::VpcLattice::Listener.WeightedTargetGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-listener-weightedtargetgroup.html","Properties":{"TargetGroupIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-listener-weightedtargetgroup.html#cfn-vpclattice-listener-weightedtargetgroup-targetgroupidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-listener-weightedtargetgroup.html#cfn-vpclattice-listener-weightedtargetgroup-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::VpcLattice::Rule.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-action.html","Properties":{"FixedResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-action.html#cfn-vpclattice-rule-action-fixedresponse","Required":false,"Type":"FixedResponse","UpdateType":"Mutable"},"Forward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-action.html#cfn-vpclattice-rule-action-forward","Required":false,"Type":"Forward","UpdateType":"Mutable"}}},"AWS::VpcLattice::Rule.FixedResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-fixedresponse.html","Properties":{"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-fixedresponse.html#cfn-vpclattice-rule-fixedresponse-statuscode","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::VpcLattice::Rule.Forward":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-forward.html","Properties":{"TargetGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-forward.html#cfn-vpclattice-rule-forward-targetgroups","DuplicatesAllowed":true,"ItemType":"WeightedTargetGroup","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::VpcLattice::Rule.HeaderMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-headermatch.html","Properties":{"CaseSensitive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-headermatch.html#cfn-vpclattice-rule-headermatch-casesensitive","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-headermatch.html#cfn-vpclattice-rule-headermatch-match","Required":true,"Type":"HeaderMatchType","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-headermatch.html#cfn-vpclattice-rule-headermatch-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::VpcLattice::Rule.HeaderMatchType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-headermatchtype.html","Properties":{"Contains":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-headermatchtype.html#cfn-vpclattice-rule-headermatchtype-contains","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-headermatchtype.html#cfn-vpclattice-rule-headermatchtype-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-headermatchtype.html#cfn-vpclattice-rule-headermatchtype-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::VpcLattice::Rule.HttpMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-httpmatch.html","Properties":{"HeaderMatches":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-httpmatch.html#cfn-vpclattice-rule-httpmatch-headermatches","DuplicatesAllowed":true,"ItemType":"HeaderMatch","Required":false,"Type":"List","UpdateType":"Mutable"},"Method":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-httpmatch.html#cfn-vpclattice-rule-httpmatch-method","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PathMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-httpmatch.html#cfn-vpclattice-rule-httpmatch-pathmatch","Required":false,"Type":"PathMatch","UpdateType":"Mutable"}}},"AWS::VpcLattice::Rule.Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-match.html","Properties":{"HttpMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-match.html#cfn-vpclattice-rule-match-httpmatch","Required":true,"Type":"HttpMatch","UpdateType":"Mutable"}}},"AWS::VpcLattice::Rule.PathMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-pathmatch.html","Properties":{"CaseSensitive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-pathmatch.html#cfn-vpclattice-rule-pathmatch-casesensitive","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-pathmatch.html#cfn-vpclattice-rule-pathmatch-match","Required":true,"Type":"PathMatchType","UpdateType":"Mutable"}}},"AWS::VpcLattice::Rule.PathMatchType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-pathmatchtype.html","Properties":{"Exact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-pathmatchtype.html#cfn-vpclattice-rule-pathmatchtype-exact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-pathmatchtype.html#cfn-vpclattice-rule-pathmatchtype-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::VpcLattice::Rule.WeightedTargetGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-weightedtargetgroup.html","Properties":{"TargetGroupIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-weightedtargetgroup.html#cfn-vpclattice-rule-weightedtargetgroup-targetgroupidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-rule-weightedtargetgroup.html#cfn-vpclattice-rule-weightedtargetgroup-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::VpcLattice::Service.DnsEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-service-dnsentry.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-service-dnsentry.html#cfn-vpclattice-service-dnsentry-domainname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostedZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-service-dnsentry.html#cfn-vpclattice-service-dnsentry-hostedzoneid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::VpcLattice::ServiceNetworkServiceAssociation.DnsEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-servicenetworkserviceassociation-dnsentry.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-servicenetworkserviceassociation-dnsentry.html#cfn-vpclattice-servicenetworkserviceassociation-dnsentry-domainname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostedZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-servicenetworkserviceassociation-dnsentry.html#cfn-vpclattice-servicenetworkserviceassociation-dnsentry-hostedzoneid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::VpcLattice::TargetGroup.HealthCheckConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-healthcheckconfig.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-healthcheckconfig.html#cfn-vpclattice-targetgroup-healthcheckconfig-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HealthCheckIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-healthcheckconfig.html#cfn-vpclattice-targetgroup-healthcheckconfig-healthcheckintervalseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HealthCheckTimeoutSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-healthcheckconfig.html#cfn-vpclattice-targetgroup-healthcheckconfig-healthchecktimeoutseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HealthyThresholdCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-healthcheckconfig.html#cfn-vpclattice-targetgroup-healthcheckconfig-healthythresholdcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Matcher":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-healthcheckconfig.html#cfn-vpclattice-targetgroup-healthcheckconfig-matcher","Required":false,"Type":"Matcher","UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-healthcheckconfig.html#cfn-vpclattice-targetgroup-healthcheckconfig-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-healthcheckconfig.html#cfn-vpclattice-targetgroup-healthcheckconfig-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-healthcheckconfig.html#cfn-vpclattice-targetgroup-healthcheckconfig-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProtocolVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-healthcheckconfig.html#cfn-vpclattice-targetgroup-healthcheckconfig-protocolversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UnhealthyThresholdCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-healthcheckconfig.html#cfn-vpclattice-targetgroup-healthcheckconfig-unhealthythresholdcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::VpcLattice::TargetGroup.Matcher":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-matcher.html","Properties":{"HttpCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-matcher.html#cfn-vpclattice-targetgroup-matcher-httpcode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::VpcLattice::TargetGroup.Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-target.html","Properties":{"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-target.html#cfn-vpclattice-targetgroup-target-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-target.html#cfn-vpclattice-targetgroup-target-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::VpcLattice::TargetGroup.TargetGroupConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-targetgroupconfig.html","Properties":{"HealthCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-targetgroupconfig.html#cfn-vpclattice-targetgroup-targetgroupconfig-healthcheck","Required":false,"Type":"HealthCheckConfig","UpdateType":"Mutable"},"IpAddressType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-targetgroupconfig.html#cfn-vpclattice-targetgroup-targetgroupconfig-ipaddresstype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-targetgroupconfig.html#cfn-vpclattice-targetgroup-targetgroupconfig-port","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-targetgroupconfig.html#cfn-vpclattice-targetgroup-targetgroupconfig-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProtocolVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-targetgroupconfig.html#cfn-vpclattice-targetgroup-targetgroupconfig-protocolversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VpcIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-vpclattice-targetgroup-targetgroupconfig.html#cfn-vpclattice-targetgroup-targetgroupconfig-vpcidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::WAF::ByteMatchSet.ByteMatchTuple":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples.html#cfn-waf-bytematchset-bytematchtuples-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"PositionalConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples.html#cfn-waf-bytematchset-bytematchtuples-positionalconstraint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples.html#cfn-waf-bytematchset-bytematchtuples-targetstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetStringBase64":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples.html#cfn-waf-bytematchset-bytematchtuples-targetstringbase64","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples.html#cfn-waf-bytematchset-bytematchtuples-texttransformation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAF::ByteMatchSet.FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples-fieldtomatch.html","Properties":{"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples-fieldtomatch.html#cfn-waf-bytematchset-bytematchtuples-fieldtomatch-data","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples-fieldtomatch.html#cfn-waf-bytematchset-bytematchtuples-fieldtomatch-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAF::IPSet.IPSetDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-ipset-ipsetdescriptors.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-ipset-ipsetdescriptors.html#cfn-waf-ipset-ipsetdescriptors-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-ipset-ipsetdescriptors.html#cfn-waf-ipset-ipsetdescriptors-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAF::Rule.Predicate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-rule-predicates.html","Properties":{"DataId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-rule-predicates.html#cfn-waf-rule-predicates-dataid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Negated":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-rule-predicates.html#cfn-waf-rule-predicates-negated","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-rule-predicates.html#cfn-waf-rule-predicates-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAF::SizeConstraintSet.FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-sizeconstraintset-sizeconstraint-fieldtomatch.html","Properties":{"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-sizeconstraintset-sizeconstraint-fieldtomatch.html#cfn-waf-sizeconstraintset-sizeconstraint-fieldtomatch-data","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-sizeconstraintset-sizeconstraint-fieldtomatch.html#cfn-waf-sizeconstraintset-sizeconstraint-fieldtomatch-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAF::SizeConstraintSet.SizeConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-sizeconstraintset-sizeconstraint.html","Properties":{"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-sizeconstraintset-sizeconstraint.html#cfn-waf-sizeconstraintset-sizeconstraint-comparisonoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-sizeconstraintset-sizeconstraint.html#cfn-waf-sizeconstraintset-sizeconstraint-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-sizeconstraintset-sizeconstraint.html#cfn-waf-sizeconstraintset-sizeconstraint-size","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"TextTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-sizeconstraintset-sizeconstraint.html#cfn-waf-sizeconstraintset-sizeconstraint-texttransformation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAF::SqlInjectionMatchSet.FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples-fieldtomatch.html","Properties":{"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples-fieldtomatch.html#cfn-waf-sizeconstraintset-sizeconstraint-fieldtomatch-data","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-bytematchset-bytematchtuples-fieldtomatch.html#cfn-waf-sizeconstraintset-sizeconstraint-fieldtomatch-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAF::SqlInjectionMatchSet.SqlInjectionMatchTuple":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-sqlinjectionmatchset-sqlinjectionmatchtuples.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-sqlinjectionmatchset-sqlinjectionmatchtuples.html#cfn-waf-sqlinjectionmatchset-sqlinjectionmatchtuples-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"TextTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-sqlinjectionmatchset-sqlinjectionmatchtuples.html#cfn-waf-sqlinjectionmatchset-sqlinjectionmatchtuples-texttransformation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAF::WebACL.ActivatedRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-webacl-rules.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-webacl-rules.html#cfn-waf-webacl-rules-action","Required":false,"Type":"WafAction","UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-webacl-rules.html#cfn-waf-webacl-rules-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"RuleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-webacl-rules.html#cfn-waf-webacl-rules-ruleid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAF::WebACL.WafAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-webacl-action.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-webacl-action.html#cfn-waf-webacl-action-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAF::XssMatchSet.FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-xssmatchset-xssmatchtuple-fieldtomatch.html","Properties":{"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-xssmatchset-xssmatchtuple-fieldtomatch.html#cfn-waf-xssmatchset-xssmatchtuple-fieldtomatch-data","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-xssmatchset-xssmatchtuple-fieldtomatch.html#cfn-waf-xssmatchset-xssmatchtuple-fieldtomatch-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAF::XssMatchSet.XssMatchTuple":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-xssmatchset-xssmatchtuple.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-xssmatchset-xssmatchtuple.html#cfn-waf-xssmatchset-xssmatchtuple-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"TextTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waf-xssmatchset-xssmatchtuple.html#cfn-waf-xssmatchset-xssmatchtuple-texttransformation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::ByteMatchSet.ByteMatchTuple":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-bytematchset-bytematchtuple.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-bytematchset-bytematchtuple.html#cfn-wafregional-bytematchset-bytematchtuple-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"PositionalConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-bytematchset-bytematchtuple.html#cfn-wafregional-bytematchset-bytematchtuple-positionalconstraint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-bytematchset-bytematchtuple.html#cfn-wafregional-bytematchset-bytematchtuple-targetstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetStringBase64":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-bytematchset-bytematchtuple.html#cfn-wafregional-bytematchset-bytematchtuple-targetstringbase64","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-bytematchset-bytematchtuple.html#cfn-wafregional-bytematchset-bytematchtuple-texttransformation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::ByteMatchSet.FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-bytematchset-fieldtomatch.html","Properties":{"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-bytematchset-fieldtomatch.html#cfn-wafregional-bytematchset-fieldtomatch-data","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-bytematchset-fieldtomatch.html#cfn-wafregional-bytematchset-fieldtomatch-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::GeoMatchSet.GeoMatchConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-geomatchset-geomatchconstraint.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-geomatchset-geomatchconstraint.html#cfn-wafregional-geomatchset-geomatchconstraint-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-geomatchset-geomatchconstraint.html#cfn-wafregional-geomatchset-geomatchconstraint-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::IPSet.IPSetDescriptor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-ipset-ipsetdescriptor.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-ipset-ipsetdescriptor.html#cfn-wafregional-ipset-ipsetdescriptor-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-ipset-ipsetdescriptor.html#cfn-wafregional-ipset-ipsetdescriptor-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::RateBasedRule.Predicate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-ratebasedrule-predicate.html","Properties":{"DataId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-ratebasedrule-predicate.html#cfn-wafregional-ratebasedrule-predicate-dataid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Negated":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-ratebasedrule-predicate.html#cfn-wafregional-ratebasedrule-predicate-negated","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-ratebasedrule-predicate.html#cfn-wafregional-ratebasedrule-predicate-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::Rule.Predicate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-rule-predicate.html","Properties":{"DataId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-rule-predicate.html#cfn-wafregional-rule-predicate-dataid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Negated":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-rule-predicate.html#cfn-wafregional-rule-predicate-negated","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-rule-predicate.html#cfn-wafregional-rule-predicate-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::SizeConstraintSet.FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sizeconstraintset-fieldtomatch.html","Properties":{"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sizeconstraintset-fieldtomatch.html#cfn-wafregional-sizeconstraintset-fieldtomatch-data","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sizeconstraintset-fieldtomatch.html#cfn-wafregional-sizeconstraintset-fieldtomatch-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::SizeConstraintSet.SizeConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sizeconstraintset-sizeconstraint.html","Properties":{"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sizeconstraintset-sizeconstraint.html#cfn-wafregional-sizeconstraintset-sizeconstraint-comparisonoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sizeconstraintset-sizeconstraint.html#cfn-wafregional-sizeconstraintset-sizeconstraint-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sizeconstraintset-sizeconstraint.html#cfn-wafregional-sizeconstraintset-sizeconstraint-size","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"TextTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sizeconstraintset-sizeconstraint.html#cfn-wafregional-sizeconstraintset-sizeconstraint-texttransformation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::SqlInjectionMatchSet.FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sqlinjectionmatchset-fieldtomatch.html","Properties":{"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sqlinjectionmatchset-fieldtomatch.html#cfn-wafregional-sqlinjectionmatchset-fieldtomatch-data","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sqlinjectionmatchset-fieldtomatch.html#cfn-wafregional-sqlinjectionmatchset-fieldtomatch-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::SqlInjectionMatchSet.SqlInjectionMatchTuple":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sqlinjectionmatchset-sqlinjectionmatchtuple.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sqlinjectionmatchset-sqlinjectionmatchtuple.html#cfn-wafregional-sqlinjectionmatchset-sqlinjectionmatchtuple-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"TextTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-sqlinjectionmatchset-sqlinjectionmatchtuple.html#cfn-wafregional-sqlinjectionmatchset-sqlinjectionmatchtuple-texttransformation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::WebACL.Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-webacl-action.html","Properties":{"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-webacl-action.html#cfn-wafregional-webacl-action-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::WebACL.Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-webacl-rule.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-webacl-rule.html#cfn-wafregional-webacl-rule-action","Required":true,"Type":"Action","UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-webacl-rule.html#cfn-wafregional-webacl-rule-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"RuleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-webacl-rule.html#cfn-wafregional-webacl-rule-ruleid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::XssMatchSet.FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-xssmatchset-fieldtomatch.html","Properties":{"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-xssmatchset-fieldtomatch.html#cfn-wafregional-xssmatchset-fieldtomatch-data","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-xssmatchset-fieldtomatch.html#cfn-wafregional-xssmatchset-fieldtomatch-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::XssMatchSet.XssMatchTuple":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-xssmatchset-xssmatchtuple.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-xssmatchset-xssmatchtuple.html#cfn-wafregional-xssmatchset-xssmatchtuple-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"TextTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafregional-xssmatchset-xssmatchtuple.html#cfn-wafregional-xssmatchset-xssmatchtuple-texttransformation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::LoggingConfiguration.ActionCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-actioncondition.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-actioncondition.html#cfn-wafv2-loggingconfiguration-actioncondition-action","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::LoggingConfiguration.Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-condition.html","Properties":{"ActionCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-condition.html#cfn-wafv2-loggingconfiguration-condition-actioncondition","Required":false,"Type":"ActionCondition","UpdateType":"Mutable"},"LabelNameCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-condition.html#cfn-wafv2-loggingconfiguration-condition-labelnamecondition","Required":false,"Type":"LabelNameCondition","UpdateType":"Mutable"}}},"AWS::WAFv2::LoggingConfiguration.FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-fieldtomatch.html","Properties":{"JsonBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-fieldtomatch.html#cfn-wafv2-loggingconfiguration-fieldtomatch-jsonbody","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Method":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-fieldtomatch.html#cfn-wafv2-loggingconfiguration-fieldtomatch-method","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"QueryString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-fieldtomatch.html#cfn-wafv2-loggingconfiguration-fieldtomatch-querystring","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SingleHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-fieldtomatch.html#cfn-wafv2-loggingconfiguration-fieldtomatch-singleheader","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"UriPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-fieldtomatch.html#cfn-wafv2-loggingconfiguration-fieldtomatch-uripath","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::WAFv2::LoggingConfiguration.Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-filter.html","Properties":{"Behavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-filter.html#cfn-wafv2-loggingconfiguration-filter-behavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Conditions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-filter.html#cfn-wafv2-loggingconfiguration-filter-conditions","DuplicatesAllowed":true,"ItemType":"Condition","Required":true,"Type":"List","UpdateType":"Mutable"},"Requirement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-filter.html#cfn-wafv2-loggingconfiguration-filter-requirement","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::LoggingConfiguration.JsonBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-jsonbody.html","Properties":{"InvalidFallbackBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-jsonbody.html#cfn-wafv2-loggingconfiguration-jsonbody-invalidfallbackbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-jsonbody.html#cfn-wafv2-loggingconfiguration-jsonbody-matchpattern","Required":true,"Type":"MatchPattern","UpdateType":"Mutable"},"MatchScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-jsonbody.html#cfn-wafv2-loggingconfiguration-jsonbody-matchscope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::LoggingConfiguration.LabelNameCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-labelnamecondition.html","Properties":{"LabelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-labelnamecondition.html#cfn-wafv2-loggingconfiguration-labelnamecondition-labelname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::LoggingConfiguration.LoggingFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-loggingfilter.html","Properties":{"DefaultBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-loggingfilter.html#cfn-wafv2-loggingconfiguration-loggingfilter-defaultbehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-loggingfilter.html#cfn-wafv2-loggingconfiguration-loggingfilter-filters","DuplicatesAllowed":true,"ItemType":"Filter","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::LoggingConfiguration.MatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-matchpattern.html","Properties":{"All":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-matchpattern.html#cfn-wafv2-loggingconfiguration-matchpattern-all","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"IncludedPaths":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-matchpattern.html#cfn-wafv2-loggingconfiguration-matchpattern-includedpaths","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::LoggingConfiguration.SingleHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-singleheader.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-loggingconfiguration-singleheader.html#cfn-wafv2-loggingconfiguration-singleheader-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.Allow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-allowaction.html","Properties":{"CustomRequestHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-allowaction.html#cfn-wafv2-rulegroup-allowaction-customrequesthandling","Required":false,"Type":"CustomRequestHandling","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.AndStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-andstatement.html","Properties":{"Statements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-andstatement.html#cfn-wafv2-rulegroup-andstatement-statements","DuplicatesAllowed":true,"ItemType":"Statement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.Block":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-blockaction.html","Properties":{"CustomResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-blockaction.html#cfn-wafv2-rulegroup-blockaction-customresponse","Required":false,"Type":"CustomResponse","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-body.html","Properties":{"OversizeHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-body.html#cfn-wafv2-rulegroup-body-oversizehandling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.ByteMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-bytematchstatement.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-bytematchstatement.html#cfn-wafv2-rulegroup-bytematchstatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"PositionalConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-bytematchstatement.html#cfn-wafv2-rulegroup-bytematchstatement-positionalconstraint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SearchString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-bytematchstatement.html#cfn-wafv2-rulegroup-bytematchstatement-searchstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SearchStringBase64":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-bytematchstatement.html#cfn-wafv2-rulegroup-bytematchstatement-searchstringbase64","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-bytematchstatement.html#cfn-wafv2-rulegroup-bytematchstatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.Captcha":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-captchaaction.html","Properties":{"CustomRequestHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-captchaaction.html#cfn-wafv2-rulegroup-captchaaction-customrequesthandling","Required":false,"Type":"CustomRequestHandling","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.CaptchaConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-captchaconfig.html","Properties":{"ImmunityTimeProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-captchaconfig.html#cfn-wafv2-rulegroup-captchaconfig-immunitytimeproperty","Required":false,"Type":"ImmunityTimeProperty","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.Challenge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-challengeaction.html","Properties":{"CustomRequestHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-challengeaction.html#cfn-wafv2-rulegroup-challengeaction-customrequesthandling","Required":false,"Type":"CustomRequestHandling","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.ChallengeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-challengeconfig.html","Properties":{"ImmunityTimeProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-challengeconfig.html#cfn-wafv2-rulegroup-challengeconfig-immunitytimeproperty","Required":false,"Type":"ImmunityTimeProperty","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.CookieMatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-cookiematchpattern.html","Properties":{"All":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-cookiematchpattern.html#cfn-wafv2-rulegroup-cookiematchpattern-all","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ExcludedCookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-cookiematchpattern.html#cfn-wafv2-rulegroup-cookiematchpattern-excludedcookies","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludedCookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-cookiematchpattern.html#cfn-wafv2-rulegroup-cookiematchpattern-includedcookies","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.Cookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-cookies.html","Properties":{"MatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-cookies.html#cfn-wafv2-rulegroup-cookies-matchpattern","Required":true,"Type":"CookieMatchPattern","UpdateType":"Mutable"},"MatchScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-cookies.html#cfn-wafv2-rulegroup-cookies-matchscope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OversizeHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-cookies.html#cfn-wafv2-rulegroup-cookies-oversizehandling","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-countaction.html","Properties":{"CustomRequestHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-countaction.html#cfn-wafv2-rulegroup-countaction-customrequesthandling","Required":false,"Type":"CustomRequestHandling","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.CustomHTTPHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customhttpheader.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customhttpheader.html#cfn-wafv2-rulegroup-customhttpheader-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customhttpheader.html#cfn-wafv2-rulegroup-customhttpheader-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.CustomRequestHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customrequesthandling.html","Properties":{"InsertHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customrequesthandling.html#cfn-wafv2-rulegroup-customrequesthandling-insertheaders","DuplicatesAllowed":true,"ItemType":"CustomHTTPHeader","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.CustomResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customresponse.html","Properties":{"CustomResponseBodyKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customresponse.html#cfn-wafv2-rulegroup-customresponse-customresponsebodykey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customresponse.html#cfn-wafv2-rulegroup-customresponse-responsecode","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ResponseHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customresponse.html#cfn-wafv2-rulegroup-customresponse-responseheaders","DuplicatesAllowed":true,"ItemType":"CustomHTTPHeader","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.CustomResponseBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customresponsebody.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customresponsebody.html#cfn-wafv2-rulegroup-customresponsebody-content","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-customresponsebody.html#cfn-wafv2-rulegroup-customresponsebody-contenttype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-fieldtomatch.html","Properties":{"AllQueryArguments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-fieldtomatch.html#cfn-wafv2-rulegroup-fieldtomatch-allqueryarguments","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-fieldtomatch.html#cfn-wafv2-rulegroup-fieldtomatch-body","Required":false,"Type":"Body","UpdateType":"Mutable"},"Cookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-fieldtomatch.html#cfn-wafv2-rulegroup-fieldtomatch-cookies","Required":false,"Type":"Cookies","UpdateType":"Mutable"},"Headers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-fieldtomatch.html#cfn-wafv2-rulegroup-fieldtomatch-headers","Required":false,"Type":"Headers","UpdateType":"Mutable"},"JsonBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-fieldtomatch.html#cfn-wafv2-rulegroup-fieldtomatch-jsonbody","Required":false,"Type":"JsonBody","UpdateType":"Mutable"},"Method":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-fieldtomatch.html#cfn-wafv2-rulegroup-fieldtomatch-method","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"QueryString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-fieldtomatch.html#cfn-wafv2-rulegroup-fieldtomatch-querystring","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SingleHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-fieldtomatch.html#cfn-wafv2-rulegroup-fieldtomatch-singleheader","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SingleQueryArgument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-fieldtomatch.html#cfn-wafv2-rulegroup-fieldtomatch-singlequeryargument","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"UriPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-fieldtomatch.html#cfn-wafv2-rulegroup-fieldtomatch-uripath","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.ForwardedIPConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-forwardedipconfiguration.html","Properties":{"FallbackBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-forwardedipconfiguration.html#cfn-wafv2-rulegroup-forwardedipconfiguration-fallbackbehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HeaderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-forwardedipconfiguration.html#cfn-wafv2-rulegroup-forwardedipconfiguration-headername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.GeoMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-geomatchstatement.html","Properties":{"CountryCodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-geomatchstatement.html#cfn-wafv2-rulegroup-geomatchstatement-countrycodes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ForwardedIPConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-geomatchstatement.html#cfn-wafv2-rulegroup-geomatchstatement-forwardedipconfig","Required":false,"Type":"ForwardedIPConfiguration","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.HeaderMatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-headermatchpattern.html","Properties":{"All":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-headermatchpattern.html#cfn-wafv2-rulegroup-headermatchpattern-all","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ExcludedHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-headermatchpattern.html#cfn-wafv2-rulegroup-headermatchpattern-excludedheaders","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludedHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-headermatchpattern.html#cfn-wafv2-rulegroup-headermatchpattern-includedheaders","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.Headers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-headers.html","Properties":{"MatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-headers.html#cfn-wafv2-rulegroup-headers-matchpattern","Required":true,"Type":"HeaderMatchPattern","UpdateType":"Mutable"},"MatchScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-headers.html#cfn-wafv2-rulegroup-headers-matchscope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OversizeHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-headers.html#cfn-wafv2-rulegroup-headers-oversizehandling","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.IPSetForwardedIPConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ipsetforwardedipconfiguration.html","Properties":{"FallbackBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ipsetforwardedipconfiguration.html#cfn-wafv2-rulegroup-ipsetforwardedipconfiguration-fallbackbehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HeaderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ipsetforwardedipconfiguration.html#cfn-wafv2-rulegroup-ipsetforwardedipconfiguration-headername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ipsetforwardedipconfiguration.html#cfn-wafv2-rulegroup-ipsetforwardedipconfiguration-position","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.IPSetReferenceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ipsetreferencestatement.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ipsetreferencestatement.html#cfn-wafv2-rulegroup-ipsetreferencestatement-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IPSetForwardedIPConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ipsetreferencestatement.html#cfn-wafv2-rulegroup-ipsetreferencestatement-ipsetforwardedipconfig","Required":false,"Type":"IPSetForwardedIPConfiguration","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.ImmunityTimeProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-immunitytimeproperty.html","Properties":{"ImmunityTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-immunitytimeproperty.html#cfn-wafv2-rulegroup-immunitytimeproperty-immunitytime","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.JsonBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-jsonbody.html","Properties":{"InvalidFallbackBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-jsonbody.html#cfn-wafv2-rulegroup-jsonbody-invalidfallbackbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-jsonbody.html#cfn-wafv2-rulegroup-jsonbody-matchpattern","Required":true,"Type":"JsonMatchPattern","UpdateType":"Mutable"},"MatchScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-jsonbody.html#cfn-wafv2-rulegroup-jsonbody-matchscope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OversizeHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-jsonbody.html#cfn-wafv2-rulegroup-jsonbody-oversizehandling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.JsonMatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-jsonmatchpattern.html","Properties":{"All":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-jsonmatchpattern.html#cfn-wafv2-rulegroup-jsonmatchpattern-all","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"IncludedPaths":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-jsonmatchpattern.html#cfn-wafv2-rulegroup-jsonmatchpattern-includedpaths","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-label.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-label.html#cfn-wafv2-rulegroup-label-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.LabelMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-labelmatchstatement.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-labelmatchstatement.html#cfn-wafv2-rulegroup-labelmatchstatement-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-labelmatchstatement.html#cfn-wafv2-rulegroup-labelmatchstatement-scope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.LabelSummary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-labelsummary.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-labelsummary.html#cfn-wafv2-rulegroup-labelsummary-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.NotStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-notstatement.html","Properties":{"Statement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-notstatement.html#cfn-wafv2-rulegroup-notstatement-statement","Required":true,"Type":"Statement","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.OrStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-orstatement.html","Properties":{"Statements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-orstatement.html#cfn-wafv2-rulegroup-orstatement-statements","DuplicatesAllowed":true,"ItemType":"Statement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.RateBasedStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ratebasedstatement.html","Properties":{"AggregateKeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ratebasedstatement.html#cfn-wafv2-rulegroup-ratebasedstatement-aggregatekeytype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ForwardedIPConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ratebasedstatement.html#cfn-wafv2-rulegroup-ratebasedstatement-forwardedipconfig","Required":false,"Type":"ForwardedIPConfiguration","UpdateType":"Mutable"},"Limit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ratebasedstatement.html#cfn-wafv2-rulegroup-ratebasedstatement-limit","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ScopeDownStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ratebasedstatement.html#cfn-wafv2-rulegroup-ratebasedstatement-scopedownstatement","Required":false,"Type":"Statement","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.RegexMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-regexmatchstatement.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-regexmatchstatement.html#cfn-wafv2-rulegroup-regexmatchstatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"RegexString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-regexmatchstatement.html#cfn-wafv2-rulegroup-regexmatchstatement-regexstring","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-regexmatchstatement.html#cfn-wafv2-rulegroup-regexmatchstatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.RegexPatternSetReferenceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-regexpatternsetreferencestatement.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-regexpatternsetreferencestatement.html#cfn-wafv2-rulegroup-regexpatternsetreferencestatement-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-regexpatternsetreferencestatement.html#cfn-wafv2-rulegroup-regexpatternsetreferencestatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-regexpatternsetreferencestatement.html#cfn-wafv2-rulegroup-regexpatternsetreferencestatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-rule.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-rule.html#cfn-wafv2-rulegroup-rule-action","Required":false,"Type":"RuleAction","UpdateType":"Mutable"},"CaptchaConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-rule.html#cfn-wafv2-rulegroup-rule-captchaconfig","Required":false,"Type":"CaptchaConfig","UpdateType":"Mutable"},"ChallengeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-rule.html#cfn-wafv2-rulegroup-rule-challengeconfig","Required":false,"Type":"ChallengeConfig","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-rule.html#cfn-wafv2-rulegroup-rule-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-rule.html#cfn-wafv2-rulegroup-rule-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"RuleLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-rule.html#cfn-wafv2-rulegroup-rule-rulelabels","DuplicatesAllowed":true,"ItemType":"Label","Required":false,"Type":"List","UpdateType":"Mutable"},"Statement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-rule.html#cfn-wafv2-rulegroup-rule-statement","Required":true,"Type":"Statement","UpdateType":"Mutable"},"VisibilityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-rule.html#cfn-wafv2-rulegroup-rule-visibilityconfig","Required":true,"Type":"VisibilityConfig","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.RuleAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ruleaction.html","Properties":{"Allow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ruleaction.html#cfn-wafv2-rulegroup-ruleaction-allow","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Block":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ruleaction.html#cfn-wafv2-rulegroup-ruleaction-block","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Captcha":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ruleaction.html#cfn-wafv2-rulegroup-ruleaction-captcha","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Challenge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ruleaction.html#cfn-wafv2-rulegroup-ruleaction-challenge","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-ruleaction.html#cfn-wafv2-rulegroup-ruleaction-count","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.SingleHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-singleheader.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-singleheader.html#cfn-wafv2-rulegroup-singleheader-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.SingleQueryArgument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-singlequeryargument.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-singlequeryargument.html#cfn-wafv2-rulegroup-singlequeryargument-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.SizeConstraintStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-sizeconstraintstatement.html","Properties":{"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-sizeconstraintstatement.html#cfn-wafv2-rulegroup-sizeconstraintstatement-comparisonoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-sizeconstraintstatement.html#cfn-wafv2-rulegroup-sizeconstraintstatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-sizeconstraintstatement.html#cfn-wafv2-rulegroup-sizeconstraintstatement-size","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-sizeconstraintstatement.html#cfn-wafv2-rulegroup-sizeconstraintstatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.SqliMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-sqlimatchstatement.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-sqlimatchstatement.html#cfn-wafv2-rulegroup-sqlimatchstatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"SensitivityLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-sqlimatchstatement.html#cfn-wafv2-rulegroup-sqlimatchstatement-sensitivitylevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-sqlimatchstatement.html#cfn-wafv2-rulegroup-sqlimatchstatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.Statement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html","Properties":{"AndStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-andstatement","Required":false,"Type":"AndStatement","UpdateType":"Mutable"},"ByteMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-bytematchstatement","Required":false,"Type":"ByteMatchStatement","UpdateType":"Mutable"},"GeoMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-geomatchstatement","Required":false,"Type":"GeoMatchStatement","UpdateType":"Mutable"},"IPSetReferenceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-ipsetreferencestatement","Required":false,"Type":"IPSetReferenceStatement","UpdateType":"Mutable"},"LabelMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-labelmatchstatement","Required":false,"Type":"LabelMatchStatement","UpdateType":"Mutable"},"NotStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-notstatement","Required":false,"Type":"NotStatement","UpdateType":"Mutable"},"OrStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-orstatement","Required":false,"Type":"OrStatement","UpdateType":"Mutable"},"RateBasedStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-ratebasedstatement","Required":false,"Type":"RateBasedStatement","UpdateType":"Mutable"},"RegexMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-regexmatchstatement","Required":false,"Type":"RegexMatchStatement","UpdateType":"Mutable"},"RegexPatternSetReferenceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-regexpatternsetreferencestatement","Required":false,"Type":"RegexPatternSetReferenceStatement","UpdateType":"Mutable"},"SizeConstraintStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-sizeconstraintstatement","Required":false,"Type":"SizeConstraintStatement","UpdateType":"Mutable"},"SqliMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-sqlimatchstatement","Required":false,"Type":"SqliMatchStatement","UpdateType":"Mutable"},"XssMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-statement.html#cfn-wafv2-rulegroup-statement-xssmatchstatement","Required":false,"Type":"XssMatchStatement","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.TextTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-texttransformation.html","Properties":{"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-texttransformation.html#cfn-wafv2-rulegroup-texttransformation-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-texttransformation.html#cfn-wafv2-rulegroup-texttransformation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.VisibilityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-visibilityconfig.html","Properties":{"CloudWatchMetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-visibilityconfig.html#cfn-wafv2-rulegroup-visibilityconfig-cloudwatchmetricsenabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-visibilityconfig.html#cfn-wafv2-rulegroup-visibilityconfig-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SampledRequestsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-visibilityconfig.html#cfn-wafv2-rulegroup-visibilityconfig-sampledrequestsenabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup.XssMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-xssmatchstatement.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-xssmatchstatement.html#cfn-wafv2-rulegroup-xssmatchstatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-rulegroup-xssmatchstatement.html#cfn-wafv2-rulegroup-xssmatchstatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.AWSManagedRulesATPRuleSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-awsmanagedrulesatpruleset.html","Properties":{"LoginPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-awsmanagedrulesatpruleset.html#cfn-wafv2-webacl-awsmanagedrulesatpruleset-loginpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RequestInspection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-awsmanagedrulesatpruleset.html#cfn-wafv2-webacl-awsmanagedrulesatpruleset-requestinspection","Required":false,"Type":"RequestInspection","UpdateType":"Mutable"},"ResponseInspection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-awsmanagedrulesatpruleset.html#cfn-wafv2-webacl-awsmanagedrulesatpruleset-responseinspection","Required":false,"Type":"ResponseInspection","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.AWSManagedRulesBotControlRuleSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-awsmanagedrulesbotcontrolruleset.html","Properties":{"InspectionLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-awsmanagedrulesbotcontrolruleset.html#cfn-wafv2-webacl-awsmanagedrulesbotcontrolruleset-inspectionlevel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.AllowAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-allowaction.html","Properties":{"CustomRequestHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-allowaction.html#cfn-wafv2-webacl-allowaction-customrequesthandling","Required":false,"Type":"CustomRequestHandling","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.AndStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-andstatement.html","Properties":{"Statements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-andstatement.html#cfn-wafv2-webacl-andstatement-statements","DuplicatesAllowed":true,"ItemType":"Statement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.AssociationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-associationconfig.html","Properties":{"RequestBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-associationconfig.html#cfn-wafv2-webacl-associationconfig-requestbody","ItemType":"RequestBodyAssociatedResourceTypeConfig","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.BlockAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-blockaction.html","Properties":{"CustomResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-blockaction.html#cfn-wafv2-webacl-blockaction-customresponse","Required":false,"Type":"CustomResponse","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-body.html","Properties":{"OversizeHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-body.html#cfn-wafv2-webacl-body-oversizehandling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ByteMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-bytematchstatement.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-bytematchstatement.html#cfn-wafv2-webacl-bytematchstatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"PositionalConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-bytematchstatement.html#cfn-wafv2-webacl-bytematchstatement-positionalconstraint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SearchString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-bytematchstatement.html#cfn-wafv2-webacl-bytematchstatement-searchstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SearchStringBase64":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-bytematchstatement.html#cfn-wafv2-webacl-bytematchstatement-searchstringbase64","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-bytematchstatement.html#cfn-wafv2-webacl-bytematchstatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.CaptchaAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-captchaaction.html","Properties":{"CustomRequestHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-captchaaction.html#cfn-wafv2-webacl-captchaaction-customrequesthandling","Required":false,"Type":"CustomRequestHandling","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.CaptchaConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-captchaconfig.html","Properties":{"ImmunityTimeProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-captchaconfig.html#cfn-wafv2-webacl-captchaconfig-immunitytimeproperty","Required":false,"Type":"ImmunityTimeProperty","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ChallengeAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-challengeaction.html","Properties":{"CustomRequestHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-challengeaction.html#cfn-wafv2-webacl-challengeaction-customrequesthandling","Required":false,"Type":"CustomRequestHandling","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ChallengeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-challengeconfig.html","Properties":{"ImmunityTimeProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-challengeconfig.html#cfn-wafv2-webacl-challengeconfig-immunitytimeproperty","Required":false,"Type":"ImmunityTimeProperty","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.CookieMatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-cookiematchpattern.html","Properties":{"All":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-cookiematchpattern.html#cfn-wafv2-webacl-cookiematchpattern-all","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ExcludedCookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-cookiematchpattern.html#cfn-wafv2-webacl-cookiematchpattern-excludedcookies","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludedCookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-cookiematchpattern.html#cfn-wafv2-webacl-cookiematchpattern-includedcookies","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.Cookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-cookies.html","Properties":{"MatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-cookies.html#cfn-wafv2-webacl-cookies-matchpattern","Required":true,"Type":"CookieMatchPattern","UpdateType":"Mutable"},"MatchScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-cookies.html#cfn-wafv2-webacl-cookies-matchscope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OversizeHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-cookies.html#cfn-wafv2-webacl-cookies-oversizehandling","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.CountAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-countaction.html","Properties":{"CustomRequestHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-countaction.html#cfn-wafv2-webacl-countaction-customrequesthandling","Required":false,"Type":"CustomRequestHandling","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.CustomHTTPHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customhttpheader.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customhttpheader.html#cfn-wafv2-webacl-customhttpheader-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customhttpheader.html#cfn-wafv2-webacl-customhttpheader-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.CustomRequestHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customrequesthandling.html","Properties":{"InsertHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customrequesthandling.html#cfn-wafv2-webacl-customrequesthandling-insertheaders","DuplicatesAllowed":true,"ItemType":"CustomHTTPHeader","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.CustomResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customresponse.html","Properties":{"CustomResponseBodyKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customresponse.html#cfn-wafv2-webacl-customresponse-customresponsebodykey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customresponse.html#cfn-wafv2-webacl-customresponse-responsecode","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ResponseHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customresponse.html#cfn-wafv2-webacl-customresponse-responseheaders","DuplicatesAllowed":true,"ItemType":"CustomHTTPHeader","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.CustomResponseBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customresponsebody.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customresponsebody.html#cfn-wafv2-webacl-customresponsebody-content","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-customresponsebody.html#cfn-wafv2-webacl-customresponsebody-contenttype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.DefaultAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-defaultaction.html","Properties":{"Allow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-defaultaction.html#cfn-wafv2-webacl-defaultaction-allow","Required":false,"Type":"AllowAction","UpdateType":"Mutable"},"Block":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-defaultaction.html#cfn-wafv2-webacl-defaultaction-block","Required":false,"Type":"BlockAction","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ExcludedRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-excludedrule.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-excludedrule.html#cfn-wafv2-webacl-excludedrule-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.FieldIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldidentifier.html","Properties":{"Identifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldidentifier.html#cfn-wafv2-webacl-fieldidentifier-identifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldtomatch.html","Properties":{"AllQueryArguments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldtomatch.html#cfn-wafv2-webacl-fieldtomatch-allqueryarguments","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldtomatch.html#cfn-wafv2-webacl-fieldtomatch-body","Required":false,"Type":"Body","UpdateType":"Mutable"},"Cookies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldtomatch.html#cfn-wafv2-webacl-fieldtomatch-cookies","Required":false,"Type":"Cookies","UpdateType":"Mutable"},"Headers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldtomatch.html#cfn-wafv2-webacl-fieldtomatch-headers","Required":false,"Type":"Headers","UpdateType":"Mutable"},"JsonBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldtomatch.html#cfn-wafv2-webacl-fieldtomatch-jsonbody","Required":false,"Type":"JsonBody","UpdateType":"Mutable"},"Method":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldtomatch.html#cfn-wafv2-webacl-fieldtomatch-method","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"QueryString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldtomatch.html#cfn-wafv2-webacl-fieldtomatch-querystring","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SingleHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldtomatch.html#cfn-wafv2-webacl-fieldtomatch-singleheader","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SingleQueryArgument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldtomatch.html#cfn-wafv2-webacl-fieldtomatch-singlequeryargument","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"UriPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-fieldtomatch.html#cfn-wafv2-webacl-fieldtomatch-uripath","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ForwardedIPConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-forwardedipconfiguration.html","Properties":{"FallbackBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-forwardedipconfiguration.html#cfn-wafv2-webacl-forwardedipconfiguration-fallbackbehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HeaderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-forwardedipconfiguration.html#cfn-wafv2-webacl-forwardedipconfiguration-headername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.GeoMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-geomatchstatement.html","Properties":{"CountryCodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-geomatchstatement.html#cfn-wafv2-webacl-geomatchstatement-countrycodes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ForwardedIPConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-geomatchstatement.html#cfn-wafv2-webacl-geomatchstatement-forwardedipconfig","Required":false,"Type":"ForwardedIPConfiguration","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.HeaderMatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-headermatchpattern.html","Properties":{"All":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-headermatchpattern.html#cfn-wafv2-webacl-headermatchpattern-all","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ExcludedHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-headermatchpattern.html#cfn-wafv2-webacl-headermatchpattern-excludedheaders","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludedHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-headermatchpattern.html#cfn-wafv2-webacl-headermatchpattern-includedheaders","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.Headers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-headers.html","Properties":{"MatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-headers.html#cfn-wafv2-webacl-headers-matchpattern","Required":true,"Type":"HeaderMatchPattern","UpdateType":"Mutable"},"MatchScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-headers.html#cfn-wafv2-webacl-headers-matchscope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OversizeHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-headers.html#cfn-wafv2-webacl-headers-oversizehandling","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.IPSetForwardedIPConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ipsetforwardedipconfiguration.html","Properties":{"FallbackBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ipsetforwardedipconfiguration.html#cfn-wafv2-webacl-ipsetforwardedipconfiguration-fallbackbehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HeaderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ipsetforwardedipconfiguration.html#cfn-wafv2-webacl-ipsetforwardedipconfiguration-headername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ipsetforwardedipconfiguration.html#cfn-wafv2-webacl-ipsetforwardedipconfiguration-position","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.IPSetReferenceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ipsetreferencestatement.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ipsetreferencestatement.html#cfn-wafv2-webacl-ipsetreferencestatement-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IPSetForwardedIPConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ipsetreferencestatement.html#cfn-wafv2-webacl-ipsetreferencestatement-ipsetforwardedipconfig","Required":false,"Type":"IPSetForwardedIPConfiguration","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ImmunityTimeProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-immunitytimeproperty.html","Properties":{"ImmunityTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-immunitytimeproperty.html#cfn-wafv2-webacl-immunitytimeproperty-immunitytime","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.JsonBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-jsonbody.html","Properties":{"InvalidFallbackBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-jsonbody.html#cfn-wafv2-webacl-jsonbody-invalidfallbackbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-jsonbody.html#cfn-wafv2-webacl-jsonbody-matchpattern","Required":true,"Type":"JsonMatchPattern","UpdateType":"Mutable"},"MatchScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-jsonbody.html#cfn-wafv2-webacl-jsonbody-matchscope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OversizeHandling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-jsonbody.html#cfn-wafv2-webacl-jsonbody-oversizehandling","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.JsonMatchPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-jsonmatchpattern.html","Properties":{"All":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-jsonmatchpattern.html#cfn-wafv2-webacl-jsonmatchpattern-all","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"IncludedPaths":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-jsonmatchpattern.html#cfn-wafv2-webacl-jsonmatchpattern-includedpaths","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.Label":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-label.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-label.html#cfn-wafv2-webacl-label-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.LabelMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-labelmatchstatement.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-labelmatchstatement.html#cfn-wafv2-webacl-labelmatchstatement-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-labelmatchstatement.html#cfn-wafv2-webacl-labelmatchstatement-scope","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ManagedRuleGroupConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupconfig.html","Properties":{"AWSManagedRulesATPRuleSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupconfig.html#cfn-wafv2-webacl-managedrulegroupconfig-awsmanagedrulesatpruleset","Required":false,"Type":"AWSManagedRulesATPRuleSet","UpdateType":"Mutable"},"AWSManagedRulesBotControlRuleSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupconfig.html#cfn-wafv2-webacl-managedrulegroupconfig-awsmanagedrulesbotcontrolruleset","Required":false,"Type":"AWSManagedRulesBotControlRuleSet","UpdateType":"Mutable"},"LoginPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupconfig.html#cfn-wafv2-webacl-managedrulegroupconfig-loginpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PasswordField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupconfig.html#cfn-wafv2-webacl-managedrulegroupconfig-passwordfield","Required":false,"Type":"FieldIdentifier","UpdateType":"Mutable"},"PayloadType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupconfig.html#cfn-wafv2-webacl-managedrulegroupconfig-payloadtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UsernameField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupconfig.html#cfn-wafv2-webacl-managedrulegroupconfig-usernamefield","Required":false,"Type":"FieldIdentifier","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ManagedRuleGroupStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupstatement.html","Properties":{"ExcludedRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupstatement.html#cfn-wafv2-webacl-managedrulegroupstatement-excludedrules","DuplicatesAllowed":true,"ItemType":"ExcludedRule","Required":false,"Type":"List","UpdateType":"Mutable"},"ManagedRuleGroupConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupstatement.html#cfn-wafv2-webacl-managedrulegroupstatement-managedrulegroupconfigs","DuplicatesAllowed":true,"ItemType":"ManagedRuleGroupConfig","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupstatement.html#cfn-wafv2-webacl-managedrulegroupstatement-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RuleActionOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupstatement.html#cfn-wafv2-webacl-managedrulegroupstatement-ruleactionoverrides","DuplicatesAllowed":true,"ItemType":"RuleActionOverride","Required":false,"Type":"List","UpdateType":"Mutable"},"ScopeDownStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupstatement.html#cfn-wafv2-webacl-managedrulegroupstatement-scopedownstatement","Required":false,"Type":"Statement","UpdateType":"Mutable"},"VendorName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupstatement.html#cfn-wafv2-webacl-managedrulegroupstatement-vendorname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-managedrulegroupstatement.html#cfn-wafv2-webacl-managedrulegroupstatement-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.NotStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-notstatement.html","Properties":{"Statement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-notstatement.html#cfn-wafv2-webacl-notstatement-statement","Required":true,"Type":"Statement","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.OrStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-orstatement.html","Properties":{"Statements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-orstatement.html#cfn-wafv2-webacl-orstatement-statements","DuplicatesAllowed":true,"ItemType":"Statement","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.OverrideAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-overrideaction.html","Properties":{"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-overrideaction.html#cfn-wafv2-webacl-overrideaction-count","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"None":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-overrideaction.html#cfn-wafv2-webacl-overrideaction-none","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.RateBasedStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratebasedstatement.html","Properties":{"AggregateKeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratebasedstatement.html#cfn-wafv2-webacl-ratebasedstatement-aggregatekeytype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ForwardedIPConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratebasedstatement.html#cfn-wafv2-webacl-ratebasedstatement-forwardedipconfig","Required":false,"Type":"ForwardedIPConfiguration","UpdateType":"Mutable"},"Limit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratebasedstatement.html#cfn-wafv2-webacl-ratebasedstatement-limit","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ScopeDownStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ratebasedstatement.html#cfn-wafv2-webacl-ratebasedstatement-scopedownstatement","Required":false,"Type":"Statement","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.RegexMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-regexmatchstatement.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-regexmatchstatement.html#cfn-wafv2-webacl-regexmatchstatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"RegexString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-regexmatchstatement.html#cfn-wafv2-webacl-regexmatchstatement-regexstring","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-regexmatchstatement.html#cfn-wafv2-webacl-regexmatchstatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.RegexPatternSetReferenceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-regexpatternsetreferencestatement.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-regexpatternsetreferencestatement.html#cfn-wafv2-webacl-regexpatternsetreferencestatement-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-regexpatternsetreferencestatement.html#cfn-wafv2-webacl-regexpatternsetreferencestatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-regexpatternsetreferencestatement.html#cfn-wafv2-webacl-regexpatternsetreferencestatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.RequestBodyAssociatedResourceTypeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-requestbodyassociatedresourcetypeconfig.html","Properties":{"DefaultSizeInspectionLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-requestbodyassociatedresourcetypeconfig.html#cfn-wafv2-webacl-requestbodyassociatedresourcetypeconfig-defaultsizeinspectionlimit","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.RequestInspection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-requestinspection.html","Properties":{"PasswordField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-requestinspection.html#cfn-wafv2-webacl-requestinspection-passwordfield","Required":true,"Type":"FieldIdentifier","UpdateType":"Mutable"},"PayloadType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-requestinspection.html#cfn-wafv2-webacl-requestinspection-payloadtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UsernameField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-requestinspection.html#cfn-wafv2-webacl-requestinspection-usernamefield","Required":true,"Type":"FieldIdentifier","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ResponseInspection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspection.html","Properties":{"BodyContains":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspection.html#cfn-wafv2-webacl-responseinspection-bodycontains","Required":false,"Type":"ResponseInspectionBodyContains","UpdateType":"Mutable"},"Header":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspection.html#cfn-wafv2-webacl-responseinspection-header","Required":false,"Type":"ResponseInspectionHeader","UpdateType":"Mutable"},"Json":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspection.html#cfn-wafv2-webacl-responseinspection-json","Required":false,"Type":"ResponseInspectionJson","UpdateType":"Mutable"},"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspection.html#cfn-wafv2-webacl-responseinspection-statuscode","Required":false,"Type":"ResponseInspectionStatusCode","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ResponseInspectionBodyContains":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionbodycontains.html","Properties":{"FailureStrings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionbodycontains.html#cfn-wafv2-webacl-responseinspectionbodycontains-failurestrings","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SuccessStrings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionbodycontains.html#cfn-wafv2-webacl-responseinspectionbodycontains-successstrings","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ResponseInspectionHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionheader.html","Properties":{"FailureValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionheader.html#cfn-wafv2-webacl-responseinspectionheader-failurevalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionheader.html#cfn-wafv2-webacl-responseinspectionheader-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SuccessValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionheader.html#cfn-wafv2-webacl-responseinspectionheader-successvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ResponseInspectionJson":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionjson.html","Properties":{"FailureValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionjson.html#cfn-wafv2-webacl-responseinspectionjson-failurevalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Identifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionjson.html#cfn-wafv2-webacl-responseinspectionjson-identifier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SuccessValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionjson.html#cfn-wafv2-webacl-responseinspectionjson-successvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.ResponseInspectionStatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionstatuscode.html","Properties":{"FailureCodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionstatuscode.html#cfn-wafv2-webacl-responseinspectionstatuscode-failurecodes","DuplicatesAllowed":true,"PrimitiveItemType":"Integer","Required":true,"Type":"List","UpdateType":"Mutable"},"SuccessCodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-responseinspectionstatuscode.html#cfn-wafv2-webacl-responseinspectionstatuscode-successcodes","DuplicatesAllowed":true,"PrimitiveItemType":"Integer","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rule.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rule.html#cfn-wafv2-webacl-rule-action","Required":false,"Type":"RuleAction","UpdateType":"Mutable"},"CaptchaConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rule.html#cfn-wafv2-webacl-rule-captchaconfig","Required":false,"Type":"CaptchaConfig","UpdateType":"Mutable"},"ChallengeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rule.html#cfn-wafv2-webacl-rule-challengeconfig","Required":false,"Type":"ChallengeConfig","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rule.html#cfn-wafv2-webacl-rule-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OverrideAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rule.html#cfn-wafv2-webacl-rule-overrideaction","Required":false,"Type":"OverrideAction","UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rule.html#cfn-wafv2-webacl-rule-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"RuleLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rule.html#cfn-wafv2-webacl-rule-rulelabels","DuplicatesAllowed":true,"ItemType":"Label","Required":false,"Type":"List","UpdateType":"Mutable"},"Statement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rule.html#cfn-wafv2-webacl-rule-statement","Required":true,"Type":"Statement","UpdateType":"Mutable"},"VisibilityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rule.html#cfn-wafv2-webacl-rule-visibilityconfig","Required":true,"Type":"VisibilityConfig","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.RuleAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ruleaction.html","Properties":{"Allow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ruleaction.html#cfn-wafv2-webacl-ruleaction-allow","Required":false,"Type":"AllowAction","UpdateType":"Mutable"},"Block":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ruleaction.html#cfn-wafv2-webacl-ruleaction-block","Required":false,"Type":"BlockAction","UpdateType":"Mutable"},"Captcha":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ruleaction.html#cfn-wafv2-webacl-ruleaction-captcha","Required":false,"Type":"CaptchaAction","UpdateType":"Mutable"},"Challenge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ruleaction.html#cfn-wafv2-webacl-ruleaction-challenge","Required":false,"Type":"ChallengeAction","UpdateType":"Mutable"},"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ruleaction.html#cfn-wafv2-webacl-ruleaction-count","Required":false,"Type":"CountAction","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.RuleActionOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ruleactionoverride.html","Properties":{"ActionToUse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ruleactionoverride.html#cfn-wafv2-webacl-ruleactionoverride-actiontouse","Required":true,"Type":"RuleAction","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-ruleactionoverride.html#cfn-wafv2-webacl-ruleactionoverride-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.RuleGroupReferenceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rulegroupreferencestatement.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rulegroupreferencestatement.html#cfn-wafv2-webacl-rulegroupreferencestatement-arn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ExcludedRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rulegroupreferencestatement.html#cfn-wafv2-webacl-rulegroupreferencestatement-excludedrules","DuplicatesAllowed":true,"ItemType":"ExcludedRule","Required":false,"Type":"List","UpdateType":"Mutable"},"RuleActionOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-rulegroupreferencestatement.html#cfn-wafv2-webacl-rulegroupreferencestatement-ruleactionoverrides","DuplicatesAllowed":true,"ItemType":"RuleActionOverride","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.SingleHeader":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-singleheader.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-singleheader.html#cfn-wafv2-webacl-singleheader-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.SingleQueryArgument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-singlequeryargument.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-singlequeryargument.html#cfn-wafv2-webacl-singlequeryargument-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.SizeConstraintStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-sizeconstraintstatement.html","Properties":{"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-sizeconstraintstatement.html#cfn-wafv2-webacl-sizeconstraintstatement-comparisonoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-sizeconstraintstatement.html#cfn-wafv2-webacl-sizeconstraintstatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-sizeconstraintstatement.html#cfn-wafv2-webacl-sizeconstraintstatement-size","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-sizeconstraintstatement.html#cfn-wafv2-webacl-sizeconstraintstatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.SqliMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-sqlimatchstatement.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-sqlimatchstatement.html#cfn-wafv2-webacl-sqlimatchstatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"SensitivityLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-sqlimatchstatement.html#cfn-wafv2-webacl-sqlimatchstatement-sensitivitylevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-sqlimatchstatement.html#cfn-wafv2-webacl-sqlimatchstatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.Statement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html","Properties":{"AndStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-andstatement","Required":false,"Type":"AndStatement","UpdateType":"Mutable"},"ByteMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-bytematchstatement","Required":false,"Type":"ByteMatchStatement","UpdateType":"Mutable"},"GeoMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-geomatchstatement","Required":false,"Type":"GeoMatchStatement","UpdateType":"Mutable"},"IPSetReferenceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-ipsetreferencestatement","Required":false,"Type":"IPSetReferenceStatement","UpdateType":"Mutable"},"LabelMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-labelmatchstatement","Required":false,"Type":"LabelMatchStatement","UpdateType":"Mutable"},"ManagedRuleGroupStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-managedrulegroupstatement","Required":false,"Type":"ManagedRuleGroupStatement","UpdateType":"Mutable"},"NotStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-notstatement","Required":false,"Type":"NotStatement","UpdateType":"Mutable"},"OrStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-orstatement","Required":false,"Type":"OrStatement","UpdateType":"Mutable"},"RateBasedStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-ratebasedstatement","Required":false,"Type":"RateBasedStatement","UpdateType":"Mutable"},"RegexMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-regexmatchstatement","Required":false,"Type":"RegexMatchStatement","UpdateType":"Mutable"},"RegexPatternSetReferenceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-regexpatternsetreferencestatement","Required":false,"Type":"RegexPatternSetReferenceStatement","UpdateType":"Mutable"},"RuleGroupReferenceStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-rulegroupreferencestatement","Required":false,"Type":"RuleGroupReferenceStatement","UpdateType":"Mutable"},"SizeConstraintStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-sizeconstraintstatement","Required":false,"Type":"SizeConstraintStatement","UpdateType":"Mutable"},"SqliMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-sqlimatchstatement","Required":false,"Type":"SqliMatchStatement","UpdateType":"Mutable"},"XssMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-statement.html#cfn-wafv2-webacl-statement-xssmatchstatement","Required":false,"Type":"XssMatchStatement","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.TextTransformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-texttransformation.html","Properties":{"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-texttransformation.html#cfn-wafv2-webacl-texttransformation-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-texttransformation.html#cfn-wafv2-webacl-texttransformation-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.VisibilityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-visibilityconfig.html","Properties":{"CloudWatchMetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-visibilityconfig.html#cfn-wafv2-webacl-visibilityconfig-cloudwatchmetricsenabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-visibilityconfig.html#cfn-wafv2-webacl-visibilityconfig-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SampledRequestsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-visibilityconfig.html#cfn-wafv2-webacl-visibilityconfig-sampledrequestsenabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL.XssMatchStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-xssmatchstatement.html","Properties":{"FieldToMatch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-xssmatchstatement.html#cfn-wafv2-webacl-xssmatchstatement-fieldtomatch","Required":true,"Type":"FieldToMatch","UpdateType":"Mutable"},"TextTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wafv2-webacl-xssmatchstatement.html#cfn-wafv2-webacl-xssmatchstatement-texttransformations","DuplicatesAllowed":true,"ItemType":"TextTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Wisdom::Assistant.ServerSideEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-assistant-serversideencryptionconfiguration.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-assistant-serversideencryptionconfiguration.html#cfn-wisdom-assistant-serversideencryptionconfiguration-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Wisdom::AssistantAssociation.AssociationData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-assistantassociation-associationdata.html","Properties":{"KnowledgeBaseId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-assistantassociation-associationdata.html#cfn-wisdom-assistantassociation-associationdata-knowledgebaseid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Wisdom::KnowledgeBase.AppIntegrationsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-knowledgebase-appintegrationsconfiguration.html","Properties":{"AppIntegrationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-knowledgebase-appintegrationsconfiguration.html#cfn-wisdom-knowledgebase-appintegrationsconfiguration-appintegrationarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ObjectFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-knowledgebase-appintegrationsconfiguration.html#cfn-wisdom-knowledgebase-appintegrationsconfiguration-objectfields","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Wisdom::KnowledgeBase.RenderingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-knowledgebase-renderingconfiguration.html","Properties":{"TemplateUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-knowledgebase-renderingconfiguration.html#cfn-wisdom-knowledgebase-renderingconfiguration-templateuri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Wisdom::KnowledgeBase.ServerSideEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-knowledgebase-serversideencryptionconfiguration.html","Properties":{"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-knowledgebase-serversideencryptionconfiguration.html#cfn-wisdom-knowledgebase-serversideencryptionconfiguration-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Wisdom::KnowledgeBase.SourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-knowledgebase-sourceconfiguration.html","Properties":{"AppIntegrations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-wisdom-knowledgebase-sourceconfiguration.html#cfn-wisdom-knowledgebase-sourceconfiguration-appintegrations","Required":true,"Type":"AppIntegrationsConfiguration","UpdateType":"Immutable"}}},"AWS::WorkSpaces::ConnectionAlias.ConnectionAliasAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspaces-connectionalias-connectionaliasassociation.html","Properties":{"AssociatedAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspaces-connectionalias-connectionaliasassociation.html#cfn-workspaces-connectionalias-connectionaliasassociation-associatedaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AssociationStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspaces-connectionalias-connectionaliasassociation.html#cfn-workspaces-connectionalias-connectionaliasassociation-associationstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectionIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspaces-connectionalias-connectionaliasassociation.html#cfn-workspaces-connectionalias-connectionaliasassociation-connectionidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspaces-connectionalias-connectionaliasassociation.html#cfn-workspaces-connectionalias-connectionaliasassociation-resourceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::WorkSpaces::Workspace.WorkspaceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspaces-workspace-workspaceproperties.html","Properties":{"ComputeTypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspaces-workspace-workspaceproperties.html#cfn-workspaces-workspace-workspaceproperties-computetypename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RootVolumeSizeGib":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspaces-workspace-workspaceproperties.html#cfn-workspaces-workspace-workspaceproperties-rootvolumesizegib","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RunningMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspaces-workspace-workspaceproperties.html#cfn-workspaces-workspace-workspaceproperties-runningmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RunningModeAutoStopTimeoutInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspaces-workspace-workspaceproperties.html#cfn-workspaces-workspace-workspaceproperties-runningmodeautostoptimeoutinminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UserVolumeSizeGib":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspaces-workspace-workspaceproperties.html#cfn-workspaces-workspace-workspaceproperties-uservolumesizegib","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::XRay::Group.InsightsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-group-insightsconfiguration.html","Properties":{"InsightsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-group-insightsconfiguration.html#cfn-xray-group-insightsconfiguration-insightsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NotificationsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-group-insightsconfiguration.html#cfn-xray-group-insightsconfiguration-notificationsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::XRay::SamplingRule.SamplingRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-attributes","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"FixedRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-fixedrate","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"HTTPMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-httpmethod","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-host","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ReservoirSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-reservoirsize","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ResourceARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RuleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-rulearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-rulename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-servicename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServiceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-servicetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"URLPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-urlpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-xray-samplingrule-samplingrule.html#cfn-xray-samplingrule-samplingrule-version","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"Alexa::ASK::Skill.AuthenticationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-authenticationconfiguration.html","Properties":{"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-authenticationconfiguration.html#cfn-ask-skill-authenticationconfiguration-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-authenticationconfiguration.html#cfn-ask-skill-authenticationconfiguration-clientsecret","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RefreshToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-authenticationconfiguration.html#cfn-ask-skill-authenticationconfiguration-refreshtoken","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"Alexa::ASK::Skill.Overrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-overrides.html","Properties":{"Manifest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-overrides.html#cfn-ask-skill-overrides-manifest","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"Alexa::ASK::Skill.SkillPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-skillpackage.html","Properties":{"Overrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-skillpackage.html#cfn-ask-skill-skillpackage-overrides","Required":false,"Type":"Overrides","UpdateType":"Mutable"},"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-skillpackage.html#cfn-ask-skill-skillpackage-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3BucketRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-skillpackage.html#cfn-ask-skill-skillpackage-s3bucketrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-skillpackage.html#cfn-ask-skill-skillpackage-s3key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ask-skill-skillpackage.html#cfn-ask-skill-skillpackage-s3objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"Tag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html#cfn-resource-tags-key","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html#cfn-resource-tags-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}}},"ResourceSpecificationVersion":"130.1.0","ResourceTypes":{"AWS::ACMPCA::Certificate":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Certificate":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificate.html","Properties":{"ApiPassthrough":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificate.html#cfn-acmpca-certificate-apipassthrough","Required":false,"Type":"ApiPassthrough","UpdateType":"Immutable"},"CertificateAuthorityArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificate.html#cfn-acmpca-certificate-certificateauthorityarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CertificateSigningRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificate.html#cfn-acmpca-certificate-certificatesigningrequest","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SigningAlgorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificate.html#cfn-acmpca-certificate-signingalgorithm","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TemplateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificate.html#cfn-acmpca-certificate-templatearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Validity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificate.html#cfn-acmpca-certificate-validity","Required":true,"Type":"Validity","UpdateType":"Immutable"},"ValidityNotBefore":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificate.html#cfn-acmpca-certificate-validitynotbefore","Required":false,"Type":"Validity","UpdateType":"Immutable"}}},"AWS::ACMPCA::CertificateAuthority":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CertificateSigningRequest":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthority.html","Properties":{"CsrExtensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthority.html#cfn-acmpca-certificateauthority-csrextensions","Required":false,"Type":"CsrExtensions","UpdateType":"Immutable"},"KeyAlgorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthority.html#cfn-acmpca-certificateauthority-keyalgorithm","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KeyStorageSecurityStandard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthority.html#cfn-acmpca-certificateauthority-keystoragesecuritystandard","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RevocationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthority.html#cfn-acmpca-certificateauthority-revocationconfiguration","Required":false,"Type":"RevocationConfiguration","UpdateType":"Mutable"},"SigningAlgorithm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthority.html#cfn-acmpca-certificateauthority-signingalgorithm","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Subject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthority.html#cfn-acmpca-certificateauthority-subject","Required":true,"Type":"Subject","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthority.html#cfn-acmpca-certificateauthority-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthority.html#cfn-acmpca-certificateauthority-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UsageMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthority.html#cfn-acmpca-certificateauthority-usagemode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ACMPCA::CertificateAuthorityActivation":{"Attributes":{"CompleteCertificateChain":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthorityactivation.html","Properties":{"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthorityactivation.html#cfn-acmpca-certificateauthorityactivation-certificate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CertificateAuthorityArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthorityactivation.html#cfn-acmpca-certificateauthorityactivation-certificateauthorityarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CertificateChain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthorityactivation.html#cfn-acmpca-certificateauthorityactivation-certificatechain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-certificateauthorityactivation.html#cfn-acmpca-certificateauthorityactivation-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ACMPCA::Permission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-permission.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-permission.html#cfn-acmpca-permission-actions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"CertificateAuthorityArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-permission.html#cfn-acmpca-permission-certificateauthorityarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-permission.html#cfn-acmpca-permission-principal","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SourceAccount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-permission.html#cfn-acmpca-permission-sourceaccount","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::APS::RuleGroupsNamespace":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-rulegroupsnamespace.html","Properties":{"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-rulegroupsnamespace.html#cfn-aps-rulegroupsnamespace-data","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-rulegroupsnamespace.html#cfn-aps-rulegroupsnamespace-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-rulegroupsnamespace.html#cfn-aps-rulegroupsnamespace-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Workspace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-rulegroupsnamespace.html#cfn-aps-rulegroupsnamespace-workspace","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::APS::Workspace":{"Attributes":{"Arn":{"PrimitiveType":"String"},"PrometheusEndpoint":{"PrimitiveType":"String"},"WorkspaceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-workspace.html","Properties":{"AlertManagerDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-workspace.html#cfn-aps-workspace-alertmanagerdefinition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Alias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-workspace.html#cfn-aps-workspace-alias","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-workspace.html#cfn-aps-workspace-loggingconfiguration","Required":false,"Type":"LoggingConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-workspace.html#cfn-aps-workspace-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AccessAnalyzer::Analyzer":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-accessanalyzer-analyzer.html","Properties":{"AnalyzerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-accessanalyzer-analyzer.html#cfn-accessanalyzer-analyzer-analyzername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ArchiveRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-accessanalyzer-analyzer.html#cfn-accessanalyzer-analyzer-archiverules","DuplicatesAllowed":true,"ItemType":"ArchiveRule","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-accessanalyzer-analyzer.html#cfn-accessanalyzer-analyzer-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-accessanalyzer-analyzer.html#cfn-accessanalyzer-analyzer-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AmazonMQ::Broker":{"Attributes":{"AmqpEndpoints":{"PrimitiveItemType":"String","Type":"List"},"Arn":{"PrimitiveType":"String"},"ConfigurationId":{"PrimitiveType":"String"},"ConfigurationRevision":{"PrimitiveType":"Integer"},"IpAddresses":{"PrimitiveItemType":"String","Type":"List"},"MqttEndpoints":{"PrimitiveItemType":"String","Type":"List"},"OpenWireEndpoints":{"PrimitiveItemType":"String","Type":"List"},"StompEndpoints":{"PrimitiveItemType":"String","Type":"List"},"WssEndpoints":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html","Properties":{"AuthenticationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-authenticationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AutoMinorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-autominorversionupgrade","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"BrokerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-brokername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-configuration","Required":false,"Type":"ConfigurationId","UpdateType":"Mutable"},"DeploymentMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-deploymentmode","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EncryptionOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-encryptionoptions","Required":false,"Type":"EncryptionOptions","UpdateType":"Immutable"},"EngineType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-enginetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-engineversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"HostInstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-hostinstancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LdapServerMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-ldapservermetadata","Required":false,"Type":"LdapServerMetadata","UpdateType":"Mutable"},"Logs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-logs","Required":false,"Type":"LogList","UpdateType":"Mutable"},"MaintenanceWindowStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-maintenancewindowstarttime","Required":false,"Type":"MaintenanceWindow","UpdateType":"Mutable"},"PubliclyAccessible":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-publiclyaccessible","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-securitygroups","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"StorageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-storagetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-subnetids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-tags","ItemType":"TagsEntry","Required":false,"Type":"List","UpdateType":"Mutable"},"Users":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-broker.html#cfn-amazonmq-broker-users","ItemType":"User","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AmazonMQ::Configuration":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"Revision":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-configuration.html","Properties":{"AuthenticationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-configuration.html#cfn-amazonmq-configuration-authenticationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-configuration.html#cfn-amazonmq-configuration-data","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-configuration.html#cfn-amazonmq-configuration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EngineType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-configuration.html#cfn-amazonmq-configuration-enginetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-configuration.html#cfn-amazonmq-configuration-engineversion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-configuration.html#cfn-amazonmq-configuration-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-configuration.html#cfn-amazonmq-configuration-tags","ItemType":"TagsEntry","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AmazonMQ::ConfigurationAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-configurationassociation.html","Properties":{"Broker":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-configurationassociation.html#cfn-amazonmq-configurationassociation-broker","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amazonmq-configurationassociation.html#cfn-amazonmq-configurationassociation-configuration","Required":true,"Type":"ConfigurationId","UpdateType":"Mutable"}}},"AWS::Amplify::App":{"Attributes":{"AppId":{"PrimitiveType":"String"},"AppName":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"},"DefaultDomain":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html","Properties":{"AccessToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-accesstoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AutoBranchCreationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-autobranchcreationconfig","Required":false,"Type":"AutoBranchCreationConfig","UpdateType":"Mutable"},"BasicAuthConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-basicauthconfig","Required":false,"Type":"BasicAuthConfig","UpdateType":"Mutable"},"BuildSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-buildspec","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomHeaders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-customheaders","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-customrules","DuplicatesAllowed":true,"ItemType":"CustomRule","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableBranchAutoDeletion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-enablebranchautodeletion","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnvironmentVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-environmentvariables","DuplicatesAllowed":true,"ItemType":"EnvironmentVariable","Required":false,"Type":"List","UpdateType":"Mutable"},"IAMServiceRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-iamservicerole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OauthToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-oauthtoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Platform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-platform","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Repository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-repository","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-app.html#cfn-amplify-app-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Amplify::Branch":{"Attributes":{"Arn":{"PrimitiveType":"String"},"BranchName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html","Properties":{"AppId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-appid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BasicAuthConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-basicauthconfig","Required":false,"Type":"BasicAuthConfig","UpdateType":"Mutable"},"BranchName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-branchname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BuildSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-buildspec","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableAutoBuild":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-enableautobuild","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnablePerformanceMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-enableperformancemode","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnablePullRequestPreview":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-enablepullrequestpreview","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnvironmentVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-environmentvariables","DuplicatesAllowed":true,"ItemType":"EnvironmentVariable","Required":false,"Type":"List","UpdateType":"Mutable"},"Framework":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-framework","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PullRequestEnvironmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-pullrequestenvironmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Stage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-stage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-branch.html#cfn-amplify-branch-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Amplify::Domain":{"Attributes":{"Arn":{"PrimitiveType":"String"},"AutoSubDomainCreationPatterns":{"PrimitiveItemType":"String","Type":"List"},"AutoSubDomainIAMRole":{"PrimitiveType":"String"},"CertificateRecord":{"PrimitiveType":"String"},"DomainName":{"PrimitiveType":"String"},"DomainStatus":{"PrimitiveType":"String"},"EnableAutoSubDomain":{"PrimitiveType":"Boolean"},"StatusReason":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-domain.html","Properties":{"AppId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-domain.html#cfn-amplify-domain-appid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AutoSubDomainCreationPatterns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-domain.html#cfn-amplify-domain-autosubdomaincreationpatterns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AutoSubDomainIAMRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-domain.html#cfn-amplify-domain-autosubdomainiamrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-domain.html#cfn-amplify-domain-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EnableAutoSubDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-domain.html#cfn-amplify-domain-enableautosubdomain","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SubDomainSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplify-domain.html#cfn-amplify-domain-subdomainsettings","DuplicatesAllowed":true,"ItemType":"SubDomainSetting","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Component":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html","Properties":{"AppId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-appid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BindingProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-bindingproperties","ItemType":"ComponentBindingPropertiesValue","Required":true,"Type":"Map","UpdateType":"Mutable"},"Children":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-children","DuplicatesAllowed":true,"ItemType":"ComponentChild","Required":false,"Type":"List","UpdateType":"Mutable"},"CollectionProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-collectionproperties","ItemType":"ComponentDataConfiguration","Required":false,"Type":"Map","UpdateType":"Mutable"},"ComponentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-componenttype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EnvironmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-environmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Events":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-events","ItemType":"ComponentEvent","Required":false,"Type":"Map","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Overrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-overrides","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Properties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-properties","ItemType":"ComponentProperty","Required":true,"Type":"Map","UpdateType":"Mutable"},"SchemaVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-schemaversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-sourceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Variants":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-variants","DuplicatesAllowed":true,"ItemType":"ComponentVariant","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::AmplifyUIBuilder::Form":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html","Properties":{"AppId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-appid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Cta":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-cta","Required":false,"Type":"FormCTA","UpdateType":"Mutable"},"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-datatype","Required":true,"Type":"FormDataTypeConfig","UpdateType":"Mutable"},"EnvironmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-environmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Fields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-fields","ItemType":"FieldConfig","Required":true,"Type":"Map","UpdateType":"Mutable"},"FormActionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-formactiontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LabelDecorator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-labeldecorator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SchemaVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-schemaversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SectionalElements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-sectionalelements","ItemType":"SectionalElement","Required":true,"Type":"Map","UpdateType":"Mutable"},"Style":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-style","Required":true,"Type":"FormStyle","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-form.html#cfn-amplifyuibuilder-form-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::AmplifyUIBuilder::Theme":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html","Properties":{"AppId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html#cfn-amplifyuibuilder-theme-appid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnvironmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html#cfn-amplifyuibuilder-theme-environmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html#cfn-amplifyuibuilder-theme-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Overrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html#cfn-amplifyuibuilder-theme-overrides","DuplicatesAllowed":true,"ItemType":"ThemeValues","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html#cfn-amplifyuibuilder-theme-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Values":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html#cfn-amplifyuibuilder-theme-values","DuplicatesAllowed":true,"ItemType":"ThemeValues","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApiGateway::Account":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-account.html","Properties":{"CloudWatchRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-account.html#cfn-apigateway-account-cloudwatchrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::ApiKey":{"Attributes":{"APIKeyId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-apikey.html","Properties":{"CustomerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-apikey.html#cfn-apigateway-apikey-customerid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-apikey.html#cfn-apigateway-apikey-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-apikey.html#cfn-apigateway-apikey-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"GenerateDistinctId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-apikey.html#cfn-apigateway-apikey-generatedistinctid","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-apikey.html#cfn-apigateway-apikey-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StageKeys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-apikey.html#cfn-apigateway-apikey-stagekeys","DuplicatesAllowed":false,"ItemType":"StageKey","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-apikey.html#cfn-apigateway-apikey-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-apikey.html#cfn-apigateway-apikey-value","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ApiGateway::Authorizer":{"Attributes":{"AuthorizerId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html","Properties":{"AuthType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html#cfn-apigateway-authorizer-authtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthorizerCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html#cfn-apigateway-authorizer-authorizercredentials","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthorizerResultTtlInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html#cfn-apigateway-authorizer-authorizerresultttlinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AuthorizerUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html#cfn-apigateway-authorizer-authorizeruri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdentitySource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html#cfn-apigateway-authorizer-identitysource","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdentityValidationExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html#cfn-apigateway-authorizer-identityvalidationexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html#cfn-apigateway-authorizer-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProviderARNs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html#cfn-apigateway-authorizer-providerarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html#cfn-apigateway-authorizer-restapiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html#cfn-apigateway-authorizer-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApiGateway::BasePathMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-basepathmapping.html","Properties":{"BasePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-basepathmapping.html#cfn-apigateway-basepathmapping-basepath","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-basepathmapping.html#cfn-apigateway-basepathmapping-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-basepathmapping.html#cfn-apigateway-basepathmapping-id","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-basepathmapping.html#cfn-apigateway-basepathmapping-restapiid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Stage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-basepathmapping.html#cfn-apigateway-basepathmapping-stage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::ClientCertificate":{"Attributes":{"ClientCertificateId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-clientcertificate.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-clientcertificate.html#cfn-apigateway-clientcertificate-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-clientcertificate.html#cfn-apigateway-clientcertificate-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApiGateway::Deployment":{"Attributes":{"DeploymentId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-deployment.html","Properties":{"DeploymentCanarySettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-deployment.html#cfn-apigateway-deployment-deploymentcanarysettings","Required":false,"Type":"DeploymentCanarySettings","UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-deployment.html#cfn-apigateway-deployment-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-deployment.html#cfn-apigateway-deployment-restapiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StageDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-deployment.html#cfn-apigateway-deployment-stagedescription","Required":false,"Type":"StageDescription","UpdateType":"Mutable"},"StageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-deployment.html#cfn-apigateway-deployment-stagename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::DocumentationPart":{"Attributes":{"DocumentationPartId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-documentationpart.html","Properties":{"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-documentationpart.html#cfn-apigateway-documentationpart-location","Required":true,"Type":"Location","UpdateType":"Immutable"},"Properties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-documentationpart.html#cfn-apigateway-documentationpart-properties","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-documentationpart.html#cfn-apigateway-documentationpart-restapiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ApiGateway::DocumentationVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-documentationversion.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-documentationversion.html#cfn-apigateway-documentationversion-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentationVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-documentationversion.html#cfn-apigateway-documentationversion-documentationversion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-documentationversion.html#cfn-apigateway-documentationversion-restapiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ApiGateway::DomainName":{"Attributes":{"DistributionDomainName":{"PrimitiveType":"String"},"DistributionHostedZoneId":{"PrimitiveType":"String"},"RegionalDomainName":{"PrimitiveType":"String"},"RegionalHostedZoneId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html#cfn-apigateway-domainname-certificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html#cfn-apigateway-domainname-domainname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EndpointConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html#cfn-apigateway-domainname-endpointconfiguration","Required":false,"Type":"EndpointConfiguration","UpdateType":"Mutable"},"MutualTlsAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html#cfn-apigateway-domainname-mutualtlsauthentication","Required":false,"Type":"MutualTlsAuthentication","UpdateType":"Mutable"},"OwnershipVerificationCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html#cfn-apigateway-domainname-ownershipverificationcertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RegionalCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html#cfn-apigateway-domainname-regionalcertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html#cfn-apigateway-domainname-securitypolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html#cfn-apigateway-domainname-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApiGateway::GatewayResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-gatewayresponse.html","Properties":{"ResponseParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-gatewayresponse.html#cfn-apigateway-gatewayresponse-responseparameters","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"ResponseTemplates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-gatewayresponse.html#cfn-apigateway-gatewayresponse-responsetemplates","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"ResponseType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-gatewayresponse.html#cfn-apigateway-gatewayresponse-responsetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-gatewayresponse.html#cfn-apigateway-gatewayresponse-restapiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StatusCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-gatewayresponse.html#cfn-apigateway-gatewayresponse-statuscode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Method":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html","Properties":{"ApiKeyRequired":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-apikeyrequired","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AuthorizationScopes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-authorizationscopes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AuthorizationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-authorizationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthorizerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-authorizerid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HttpMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-httpmethod","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Integration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-integration","Required":false,"Type":"Integration","UpdateType":"Mutable"},"MethodResponses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-methodresponses","DuplicatesAllowed":false,"ItemType":"MethodResponse","Required":false,"Type":"List","UpdateType":"Mutable"},"OperationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-operationname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RequestModels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-requestmodels","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"RequestParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-requestparameters","DuplicatesAllowed":false,"PrimitiveItemType":"Boolean","Required":false,"Type":"Map","UpdateType":"Mutable"},"RequestValidatorId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-requestvalidatorid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-resourceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html#cfn-apigateway-method-restapiid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Model":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-model.html","Properties":{"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-model.html#cfn-apigateway-model-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-model.html#cfn-apigateway-model-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-model.html#cfn-apigateway-model-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-model.html#cfn-apigateway-model-restapiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-model.html#cfn-apigateway-model-schema","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::RequestValidator":{"Attributes":{"RequestValidatorId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-requestvalidator.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-requestvalidator.html#cfn-apigateway-requestvalidator-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-requestvalidator.html#cfn-apigateway-requestvalidator-restapiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ValidateRequestBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-requestvalidator.html#cfn-apigateway-requestvalidator-validaterequestbody","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ValidateRequestParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-requestvalidator.html#cfn-apigateway-requestvalidator-validaterequestparameters","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::Resource":{"Attributes":{"ResourceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-resource.html","Properties":{"ParentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-resource.html#cfn-apigateway-resource-parentid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PathPart":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-resource.html#cfn-apigateway-resource-pathpart","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-resource.html#cfn-apigateway-resource-restapiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ApiGateway::RestApi":{"Attributes":{"RestApiId":{"PrimitiveType":"String"},"RootResourceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html","Properties":{"ApiKeySourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-apikeysourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BinaryMediaTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-binarymediatypes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-body","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"BodyS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-bodys3location","Required":false,"Type":"S3Location","UpdateType":"Mutable"},"CloneFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-clonefrom","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisableExecuteApiEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-disableexecuteapiendpoint","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EndpointConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-endpointconfiguration","Required":false,"Type":"EndpointConfiguration","UpdateType":"Mutable"},"FailOnWarnings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-failonwarnings","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MinimumCompressionSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-minimumcompressionsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-mode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-parameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-policy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ApiGateway::Stage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html","Properties":{"AccessLogSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-accesslogsetting","Required":false,"Type":"AccessLogSetting","UpdateType":"Mutable"},"CacheClusterEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-cacheclusterenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CacheClusterSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-cacheclustersize","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CanarySetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-canarysetting","Required":false,"Type":"CanarySetting","UpdateType":"Mutable"},"ClientCertificateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-clientcertificateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeploymentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-deploymentid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentationVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-documentationversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MethodSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-methodsettings","DuplicatesAllowed":false,"ItemType":"MethodSetting","Required":false,"Type":"List","UpdateType":"Mutable"},"RestApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-restapiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-stagename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TracingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-tracingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Variables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-stage.html#cfn-apigateway-stage-variables","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::ApiGateway::UsagePlan":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplan.html","Properties":{"ApiStages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplan.html#cfn-apigateway-usageplan-apistages","DuplicatesAllowed":false,"ItemType":"ApiStage","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplan.html#cfn-apigateway-usageplan-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Quota":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplan.html#cfn-apigateway-usageplan-quota","Required":false,"Type":"QuotaSettings","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplan.html#cfn-apigateway-usageplan-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Throttle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplan.html#cfn-apigateway-usageplan-throttle","Required":false,"Type":"ThrottleSettings","UpdateType":"Mutable"},"UsagePlanName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplan.html#cfn-apigateway-usageplan-usageplanname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGateway::UsagePlanKey":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplankey.html","Properties":{"KeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplankey.html#cfn-apigateway-usageplankey-keyid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplankey.html#cfn-apigateway-usageplankey-keytype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UsagePlanId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-usageplankey.html#cfn-apigateway-usageplankey-usageplanid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ApiGateway::VpcLink":{"Attributes":{"VpcLinkId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-vpclink.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-vpclink.html#cfn-apigateway-vpclink-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-vpclink.html#cfn-apigateway-vpclink-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-vpclink.html#cfn-apigateway-vpclink-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-vpclink.html#cfn-apigateway-vpclink-targetarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::ApiGatewayV2::Api":{"Attributes":{"ApiEndpoint":{"PrimitiveType":"String"},"ApiId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html","Properties":{"ApiKeySelectionExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-apikeyselectionexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BasePath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-basepath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-body","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"BodyS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-bodys3location","Required":false,"Type":"BodyS3Location","UpdateType":"Mutable"},"CorsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-corsconfiguration","Required":false,"Type":"Cors","UpdateType":"Mutable"},"CredentialsArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-credentialsarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisableExecuteApiEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-disableexecuteapiendpoint","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DisableSchemaValidation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-disableschemavalidation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"FailOnWarnings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-failonwarnings","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProtocolType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-protocoltype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RouteKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-routekey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RouteSelectionExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-routeselectionexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-target","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html#cfn-apigatewayv2-api-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::ApiGatewayManagedOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-apigatewaymanagedoverrides.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-apigatewaymanagedoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Integration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-apigatewaymanagedoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-integration","Required":false,"Type":"IntegrationOverrides","UpdateType":"Mutable"},"Route":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-apigatewaymanagedoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-route","Required":false,"Type":"RouteOverrides","UpdateType":"Mutable"},"Stage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-apigatewaymanagedoverrides.html#cfn-apigatewayv2-apigatewaymanagedoverrides-stage","Required":false,"Type":"StageOverrides","UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::ApiMapping":{"Attributes":{"ApiMappingId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-apimapping.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-apimapping.html#cfn-apigatewayv2-apimapping-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ApiMappingKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-apimapping.html#cfn-apigatewayv2-apimapping-apimappingkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-apimapping.html#cfn-apigatewayv2-apimapping-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Stage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-apimapping.html#cfn-apigatewayv2-apimapping-stage","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Authorizer":{"Attributes":{"AuthorizerId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html#cfn-apigatewayv2-authorizer-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AuthorizerCredentialsArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html#cfn-apigatewayv2-authorizer-authorizercredentialsarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthorizerPayloadFormatVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html#cfn-apigatewayv2-authorizer-authorizerpayloadformatversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthorizerResultTtlInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html#cfn-apigatewayv2-authorizer-authorizerresultttlinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AuthorizerType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html#cfn-apigatewayv2-authorizer-authorizertype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AuthorizerUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html#cfn-apigatewayv2-authorizer-authorizeruri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableSimpleResponses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html#cfn-apigatewayv2-authorizer-enablesimpleresponses","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IdentitySource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html#cfn-apigatewayv2-authorizer-identitysource","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"IdentityValidationExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html#cfn-apigatewayv2-authorizer-identityvalidationexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JwtConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html#cfn-apigatewayv2-authorizer-jwtconfiguration","Required":false,"Type":"JWTConfiguration","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-authorizer.html#cfn-apigatewayv2-authorizer-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Deployment":{"Attributes":{"DeploymentId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-deployment.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-deployment.html#cfn-apigatewayv2-deployment-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-deployment.html#cfn-apigatewayv2-deployment-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-deployment.html#cfn-apigatewayv2-deployment-stagename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::DomainName":{"Attributes":{"RegionalDomainName":{"PrimitiveType":"String"},"RegionalHostedZoneId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-domainname.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-domainname.html#cfn-apigatewayv2-domainname-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DomainNameConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-domainname.html#cfn-apigatewayv2-domainname-domainnameconfigurations","ItemType":"DomainNameConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"MutualTlsAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-domainname.html#cfn-apigatewayv2-domainname-mutualtlsauthentication","Required":false,"Type":"MutualTlsAuthentication","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-domainname.html#cfn-apigatewayv2-domainname-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Integration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConnectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-connectionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConnectionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-connectiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContentHandlingStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-contenthandlingstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CredentialsArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-credentialsarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegrationMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-integrationmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegrationSubtype":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-integrationsubtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegrationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-integrationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IntegrationUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-integrationuri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PassthroughBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-passthroughbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PayloadFormatVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-payloadformatversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RequestParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-requestparameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"RequestTemplates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-requesttemplates","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ResponseParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-responseparameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TemplateSelectionExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-templateselectionexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeoutInMillis":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-timeoutinmillis","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TlsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integration.html#cfn-apigatewayv2-integration-tlsconfig","Required":false,"Type":"TlsConfig","UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::IntegrationResponse":{"Attributes":{"IntegrationResponseId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integrationresponse.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integrationresponse.html#cfn-apigatewayv2-integrationresponse-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ContentHandlingStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integrationresponse.html#cfn-apigatewayv2-integrationresponse-contenthandlingstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IntegrationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integrationresponse.html#cfn-apigatewayv2-integrationresponse-integrationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IntegrationResponseKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integrationresponse.html#cfn-apigatewayv2-integrationresponse-integrationresponsekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResponseParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integrationresponse.html#cfn-apigatewayv2-integrationresponse-responseparameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ResponseTemplates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integrationresponse.html#cfn-apigatewayv2-integrationresponse-responsetemplates","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TemplateSelectionExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-integrationresponse.html#cfn-apigatewayv2-integrationresponse-templateselectionexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Model":{"Attributes":{"ModelId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-model.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-model.html#cfn-apigatewayv2-model-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-model.html#cfn-apigatewayv2-model-contenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-model.html#cfn-apigatewayv2-model-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-model.html#cfn-apigatewayv2-model-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-model.html#cfn-apigatewayv2-model-schema","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Route":{"Attributes":{"RouteId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ApiKeyRequired":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-apikeyrequired","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AuthorizationScopes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-authorizationscopes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AuthorizationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-authorizationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthorizerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-authorizerid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelSelectionExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-modelselectionexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OperationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-operationname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RequestModels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-requestmodels","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"RequestParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-requestparameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"RouteKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-routekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RouteResponseSelectionExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-routeresponseselectionexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-route.html#cfn-apigatewayv2-route-target","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::RouteResponse":{"Attributes":{"RouteResponseId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-routeresponse.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-routeresponse.html#cfn-apigatewayv2-routeresponse-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ModelSelectionExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-routeresponse.html#cfn-apigatewayv2-routeresponse-modelselectionexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseModels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-routeresponse.html#cfn-apigatewayv2-routeresponse-responsemodels","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ResponseParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-routeresponse.html#cfn-apigatewayv2-routeresponse-responseparameters","ItemType":"ParameterConstraints","Required":false,"Type":"Map","UpdateType":"Mutable"},"RouteId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-routeresponse.html#cfn-apigatewayv2-routeresponse-routeid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RouteResponseKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-routeresponse.html#cfn-apigatewayv2-routeresponse-routeresponsekey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::Stage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html","Properties":{"AccessLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-accesslogsettings","Required":false,"Type":"AccessLogSettings","UpdateType":"Mutable"},"AccessPolicyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-accesspolicyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AutoDeploy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-autodeploy","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ClientCertificateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-clientcertificateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultRouteSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-defaultroutesettings","Required":false,"Type":"RouteSettings","UpdateType":"Mutable"},"DeploymentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-deploymentid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RouteSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-routesettings","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"StageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-stagename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StageVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-stagevariables","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-stage.html#cfn-apigatewayv2-stage-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::ApiGatewayV2::VpcLink":{"Attributes":{"VpcLinkId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-vpclink.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-vpclink.html#cfn-apigatewayv2-vpclink-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-vpclink.html#cfn-apigatewayv2-vpclink-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-vpclink.html#cfn-apigatewayv2-vpclink-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-vpclink.html#cfn-apigatewayv2-vpclink-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::AppConfig::Application":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-application.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-application.html#cfn-appconfig-application-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-application.html#cfn-appconfig-application-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-application.html#cfn-appconfig-application-tags","ItemType":"Tags","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppConfig::ConfigurationProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-configurationprofile.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-configurationprofile.html#cfn-appconfig-configurationprofile-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-configurationprofile.html#cfn-appconfig-configurationprofile-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LocationUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-configurationprofile.html#cfn-appconfig-configurationprofile-locationuri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-configurationprofile.html#cfn-appconfig-configurationprofile-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RetrievalRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-configurationprofile.html#cfn-appconfig-configurationprofile-retrievalrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-configurationprofile.html#cfn-appconfig-configurationprofile-tags","ItemType":"Tags","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-configurationprofile.html#cfn-appconfig-configurationprofile-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Validators":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-configurationprofile.html#cfn-appconfig-configurationprofile-validators","ItemType":"Validators","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppConfig::Deployment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deployment.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deployment.html#cfn-appconfig-deployment-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConfigurationProfileId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deployment.html#cfn-appconfig-deployment-configurationprofileid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConfigurationVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deployment.html#cfn-appconfig-deployment-configurationversion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DeploymentStrategyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deployment.html#cfn-appconfig-deployment-deploymentstrategyid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deployment.html#cfn-appconfig-deployment-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EnvironmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deployment.html#cfn-appconfig-deployment-environmentid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KmsKeyIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deployment.html#cfn-appconfig-deployment-kmskeyidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deployment.html#cfn-appconfig-deployment-tags","ItemType":"Tags","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::AppConfig::DeploymentStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deploymentstrategy.html","Properties":{"DeploymentDurationInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deploymentstrategy.html#cfn-appconfig-deploymentstrategy-deploymentdurationinminutes","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deploymentstrategy.html#cfn-appconfig-deploymentstrategy-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FinalBakeTimeInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deploymentstrategy.html#cfn-appconfig-deploymentstrategy-finalbaketimeinminutes","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"GrowthFactor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deploymentstrategy.html#cfn-appconfig-deploymentstrategy-growthfactor","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"GrowthType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deploymentstrategy.html#cfn-appconfig-deploymentstrategy-growthtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deploymentstrategy.html#cfn-appconfig-deploymentstrategy-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ReplicateTo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deploymentstrategy.html#cfn-appconfig-deploymentstrategy-replicateto","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-deploymentstrategy.html#cfn-appconfig-deploymentstrategy-tags","ItemType":"Tags","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppConfig::Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-environment.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-environment.html#cfn-appconfig-environment-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-environment.html#cfn-appconfig-environment-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Monitors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-environment.html#cfn-appconfig-environment-monitors","ItemType":"Monitors","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-environment.html#cfn-appconfig-environment-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-environment.html#cfn-appconfig-environment-tags","ItemType":"Tags","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppConfig::Extension":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"VersionNumber":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extension.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extension.html#cfn-appconfig-extension-actions","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extension.html#cfn-appconfig-extension-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LatestVersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extension.html#cfn-appconfig-extension-latestversionnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extension.html#cfn-appconfig-extension-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extension.html#cfn-appconfig-extension-parameters","ItemType":"Parameter","Required":false,"Type":"Map","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extension.html#cfn-appconfig-extension-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::AppConfig::ExtensionAssociation":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ExtensionArn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"ResourceArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extensionassociation.html","Properties":{"ExtensionIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extensionassociation.html#cfn-appconfig-extensionassociation-extensionidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ExtensionVersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extensionassociation.html#cfn-appconfig-extensionassociation-extensionversionnumber","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extensionassociation.html#cfn-appconfig-extensionassociation-parameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"ResourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extensionassociation.html#cfn-appconfig-extensionassociation-resourceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-extensionassociation.html#cfn-appconfig-extensionassociation-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::AppConfig::HostedConfigurationVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-hostedconfigurationversion.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-hostedconfigurationversion.html#cfn-appconfig-hostedconfigurationversion-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConfigurationProfileId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-hostedconfigurationversion.html#cfn-appconfig-hostedconfigurationversion-configurationprofileid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-hostedconfigurationversion.html#cfn-appconfig-hostedconfigurationversion-content","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ContentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-hostedconfigurationversion.html#cfn-appconfig-hostedconfigurationversion-contenttype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-hostedconfigurationversion.html#cfn-appconfig-hostedconfigurationversion-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LatestVersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-hostedconfigurationversion.html#cfn-appconfig-hostedconfigurationversion-latestversionnumber","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"VersionLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-hostedconfigurationversion.html#cfn-appconfig-hostedconfigurationversion-versionlabel","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::AppFlow::Connector":{"Attributes":{"ConnectorArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connector.html","Properties":{"ConnectorLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connector.html#cfn-appflow-connector-connectorlabel","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConnectorProvisioningConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connector.html#cfn-appflow-connector-connectorprovisioningconfig","Required":true,"Type":"ConnectorProvisioningConfig","UpdateType":"Mutable"},"ConnectorProvisioningType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connector.html#cfn-appflow-connector-connectorprovisioningtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connector.html#cfn-appflow-connector-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::ConnectorProfile":{"Attributes":{"ConnectorProfileArn":{"PrimitiveType":"String"},"CredentialsArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connectorprofile.html","Properties":{"ConnectionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connectorprofile.html#cfn-appflow-connectorprofile-connectionmode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConnectorLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connectorprofile.html#cfn-appflow-connectorprofile-connectorlabel","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConnectorProfileConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connectorprofile.html#cfn-appflow-connectorprofile-connectorprofileconfig","Required":false,"Type":"ConnectorProfileConfig","UpdateType":"Mutable"},"ConnectorProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connectorprofile.html#cfn-appflow-connectorprofile-connectorprofilename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConnectorType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connectorprofile.html#cfn-appflow-connectorprofile-connectortype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KMSArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-connectorprofile.html#cfn-appflow-connectorprofile-kmsarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppFlow::Flow":{"Attributes":{"FlowArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html#cfn-appflow-flow-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationFlowConfigList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html#cfn-appflow-flow-destinationflowconfiglist","DuplicatesAllowed":true,"ItemType":"DestinationFlowConfig","Required":true,"Type":"List","UpdateType":"Mutable"},"FlowName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html#cfn-appflow-flow-flowname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FlowStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html#cfn-appflow-flow-flowstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KMSArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html#cfn-appflow-flow-kmsarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MetadataCatalogConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html#cfn-appflow-flow-metadatacatalogconfig","Required":false,"Type":"MetadataCatalogConfig","UpdateType":"Mutable"},"SourceFlowConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html#cfn-appflow-flow-sourceflowconfig","Required":true,"Type":"SourceFlowConfig","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html#cfn-appflow-flow-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Tasks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html#cfn-appflow-flow-tasks","DuplicatesAllowed":true,"ItemType":"Task","Required":true,"Type":"List","UpdateType":"Mutable"},"TriggerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appflow-flow.html#cfn-appflow-flow-triggerconfig","Required":true,"Type":"TriggerConfig","UpdateType":"Mutable"}}},"AWS::AppIntegrations::DataIntegration":{"Attributes":{"DataIntegrationArn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FileConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-fileconfiguration","Required":false,"Type":"FileConfiguration","UpdateType":"Mutable"},"KmsKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-kmskey","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObjectConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-objectconfiguration","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ScheduleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-scheduleconfig","Required":true,"Type":"ScheduleConfig","UpdateType":"Immutable"},"SourceURI":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-sourceuri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppIntegrations::EventIntegration":{"Attributes":{"EventIntegrationArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-eventintegration.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-eventintegration.html#cfn-appintegrations-eventintegration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventBridgeBus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-eventintegration.html#cfn-appintegrations-eventintegration-eventbridgebus","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EventFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-eventintegration.html#cfn-appintegrations-eventintegration-eventfilter","Required":true,"Type":"EventFilter","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-eventintegration.html#cfn-appintegrations-eventintegration-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-eventintegration.html#cfn-appintegrations-eventintegration-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::GatewayRoute":{"Attributes":{"Arn":{"PrimitiveType":"String"},"GatewayRouteName":{"PrimitiveType":"String"},"MeshName":{"PrimitiveType":"String"},"MeshOwner":{"PrimitiveType":"String"},"ResourceOwner":{"PrimitiveType":"String"},"Uid":{"PrimitiveType":"String"},"VirtualGatewayName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html","Properties":{"GatewayRouteName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-gatewayroutename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MeshName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-meshname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MeshOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-meshowner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Spec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-spec","Required":true,"Type":"GatewayRouteSpec","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VirtualGatewayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-gatewayroute.html#cfn-appmesh-gatewayroute-virtualgatewayname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppMesh::Mesh":{"Attributes":{"Arn":{"PrimitiveType":"String"},"MeshName":{"PrimitiveType":"String"},"MeshOwner":{"PrimitiveType":"String"},"ResourceOwner":{"PrimitiveType":"String"},"Uid":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-mesh.html","Properties":{"MeshName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-mesh.html#cfn-appmesh-mesh-meshname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Spec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-mesh.html#cfn-appmesh-mesh-spec","Required":false,"Type":"MeshSpec","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-mesh.html#cfn-appmesh-mesh-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppMesh::Route":{"Attributes":{"Arn":{"PrimitiveType":"String"},"MeshName":{"PrimitiveType":"String"},"MeshOwner":{"PrimitiveType":"String"},"ResourceOwner":{"PrimitiveType":"String"},"RouteName":{"PrimitiveType":"String"},"Uid":{"PrimitiveType":"String"},"VirtualRouterName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html","Properties":{"MeshName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-meshname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MeshOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-meshowner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RouteName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-routename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Spec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-spec","Required":true,"Type":"RouteSpec","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VirtualRouterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-route.html#cfn-appmesh-route-virtualroutername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppMesh::VirtualGateway":{"Attributes":{"Arn":{"PrimitiveType":"String"},"MeshName":{"PrimitiveType":"String"},"MeshOwner":{"PrimitiveType":"String"},"ResourceOwner":{"PrimitiveType":"String"},"Uid":{"PrimitiveType":"String"},"VirtualGatewayName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html","Properties":{"MeshName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html#cfn-appmesh-virtualgateway-meshname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MeshOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html#cfn-appmesh-virtualgateway-meshowner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Spec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html#cfn-appmesh-virtualgateway-spec","Required":true,"Type":"VirtualGatewaySpec","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html#cfn-appmesh-virtualgateway-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VirtualGatewayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualgateway.html#cfn-appmesh-virtualgateway-virtualgatewayname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::AppMesh::VirtualNode":{"Attributes":{"Arn":{"PrimitiveType":"String"},"MeshName":{"PrimitiveType":"String"},"MeshOwner":{"PrimitiveType":"String"},"ResourceOwner":{"PrimitiveType":"String"},"Uid":{"PrimitiveType":"String"},"VirtualNodeName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html","Properties":{"MeshName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html#cfn-appmesh-virtualnode-meshname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MeshOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html#cfn-appmesh-virtualnode-meshowner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Spec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html#cfn-appmesh-virtualnode-spec","Required":true,"Type":"VirtualNodeSpec","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html#cfn-appmesh-virtualnode-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VirtualNodeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualnode.html#cfn-appmesh-virtualnode-virtualnodename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::AppMesh::VirtualRouter":{"Attributes":{"Arn":{"PrimitiveType":"String"},"MeshName":{"PrimitiveType":"String"},"MeshOwner":{"PrimitiveType":"String"},"ResourceOwner":{"PrimitiveType":"String"},"Uid":{"PrimitiveType":"String"},"VirtualRouterName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html","Properties":{"MeshName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html#cfn-appmesh-virtualrouter-meshname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MeshOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html#cfn-appmesh-virtualrouter-meshowner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Spec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html#cfn-appmesh-virtualrouter-spec","Required":true,"Type":"VirtualRouterSpec","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html#cfn-appmesh-virtualrouter-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VirtualRouterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualrouter.html#cfn-appmesh-virtualrouter-virtualroutername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::AppMesh::VirtualService":{"Attributes":{"Arn":{"PrimitiveType":"String"},"MeshName":{"PrimitiveType":"String"},"MeshOwner":{"PrimitiveType":"String"},"ResourceOwner":{"PrimitiveType":"String"},"Uid":{"PrimitiveType":"String"},"VirtualServiceName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html","Properties":{"MeshName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html#cfn-appmesh-virtualservice-meshname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MeshOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html#cfn-appmesh-virtualservice-meshowner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Spec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html#cfn-appmesh-virtualservice-spec","Required":true,"Type":"VirtualServiceSpec","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html#cfn-appmesh-virtualservice-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VirtualServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appmesh-virtualservice.html#cfn-appmesh-virtualservice-virtualservicename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppRunner::AutoScalingConfiguration":{"Attributes":{"AutoScalingConfigurationArn":{"PrimitiveType":"String"},"AutoScalingConfigurationRevision":{"PrimitiveType":"Integer"},"Latest":{"PrimitiveType":"Boolean"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-autoscalingconfiguration.html","Properties":{"AutoScalingConfigurationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-autoscalingconfiguration.html#cfn-apprunner-autoscalingconfiguration-autoscalingconfigurationname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MaxConcurrency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-autoscalingconfiguration.html#cfn-apprunner-autoscalingconfiguration-maxconcurrency","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MaxSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-autoscalingconfiguration.html#cfn-apprunner-autoscalingconfiguration-maxsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"MinSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-autoscalingconfiguration.html#cfn-apprunner-autoscalingconfiguration-minsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-autoscalingconfiguration.html#cfn-apprunner-autoscalingconfiguration-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::AppRunner::ObservabilityConfiguration":{"Attributes":{"Latest":{"PrimitiveType":"Boolean"},"ObservabilityConfigurationArn":{"PrimitiveType":"String"},"ObservabilityConfigurationRevision":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-observabilityconfiguration.html","Properties":{"ObservabilityConfigurationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-observabilityconfiguration.html#cfn-apprunner-observabilityconfiguration-observabilityconfigurationname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-observabilityconfiguration.html#cfn-apprunner-observabilityconfiguration-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"TraceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-observabilityconfiguration.html#cfn-apprunner-observabilityconfiguration-traceconfiguration","Required":false,"Type":"TraceConfiguration","UpdateType":"Immutable"}}},"AWS::AppRunner::Service":{"Attributes":{"ServiceArn":{"PrimitiveType":"String"},"ServiceId":{"PrimitiveType":"String"},"ServiceUrl":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html","Properties":{"AutoScalingConfigurationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html#cfn-apprunner-service-autoscalingconfigurationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html#cfn-apprunner-service-encryptionconfiguration","Required":false,"Type":"EncryptionConfiguration","UpdateType":"Immutable"},"HealthCheckConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html#cfn-apprunner-service-healthcheckconfiguration","Required":false,"Type":"HealthCheckConfiguration","UpdateType":"Mutable"},"InstanceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html#cfn-apprunner-service-instanceconfiguration","Required":false,"Type":"InstanceConfiguration","UpdateType":"Mutable"},"NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html#cfn-apprunner-service-networkconfiguration","Required":false,"Type":"NetworkConfiguration","UpdateType":"Mutable"},"ObservabilityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html#cfn-apprunner-service-observabilityconfiguration","Required":false,"Type":"ServiceObservabilityConfiguration","UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html#cfn-apprunner-service-servicename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html#cfn-apprunner-service-sourceconfiguration","Required":true,"Type":"SourceConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html#cfn-apprunner-service-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::AppRunner::VpcConnector":{"Attributes":{"VpcConnectorArn":{"PrimitiveType":"String"},"VpcConnectorRevision":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcconnector.html","Properties":{"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcconnector.html#cfn-apprunner-vpcconnector-securitygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcconnector.html#cfn-apprunner-vpcconnector-subnets","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcconnector.html#cfn-apprunner-vpcconnector-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"VpcConnectorName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcconnector.html#cfn-apprunner-vpcconnector-vpcconnectorname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::AppRunner::VpcIngressConnection":{"Attributes":{"DomainName":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"VpcIngressConnectionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcingressconnection.html","Properties":{"IngressVpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcingressconnection.html#cfn-apprunner-vpcingressconnection-ingressvpcconfiguration","Required":true,"Type":"IngressVpcConfiguration","UpdateType":"Mutable"},"ServiceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcingressconnection.html#cfn-apprunner-vpcingressconnection-servicearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcingressconnection.html#cfn-apprunner-vpcingressconnection-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"VpcIngressConnectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcingressconnection.html#cfn-apprunner-vpcingressconnection-vpcingressconnectionname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::AppStream::AppBlock":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PackagingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-packagingtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PostSetupScriptDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-postsetupscriptdetails","Required":false,"Type":"ScriptDetails","UpdateType":"Immutable"},"SetupScriptDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-setupscriptdetails","Required":false,"Type":"ScriptDetails","UpdateType":"Immutable"},"SourceS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-sources3location","Required":true,"Type":"S3Location","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppStream::AppBlockBuilder":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html","Properties":{"AccessEndpoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-accessendpoints","DuplicatesAllowed":false,"ItemType":"AccessEndpoint","Required":false,"Type":"List","UpdateType":"Mutable"},"AppBlockArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-appblockarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableDefaultInternetAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-enabledefaultinternetaccess","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IamRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-iamrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Platform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-platform","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblockbuilder.html#cfn-appstream-appblockbuilder-vpcconfig","Required":true,"Type":"VpcConfig","UpdateType":"Mutable"}}},"AWS::AppStream::Application":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html","Properties":{"AppBlockArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-appblockarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AttributesToDelete":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-attributestodelete","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IconS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-icons3location","Required":true,"Type":"S3Location","UpdateType":"Mutable"},"InstanceFamilies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-instancefamilies","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"LaunchParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-launchparameters","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-launchpath","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Platforms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-platforms","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"WorkingDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-workingdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppStream::ApplicationEntitlementAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html","Properties":{"ApplicationIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html#cfn-appstream-applicationentitlementassociation-applicationidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EntitlementName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html#cfn-appstream-applicationentitlementassociation-entitlementname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StackName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html#cfn-appstream-applicationentitlementassociation-stackname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppStream::ApplicationFleetAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationfleetassociation.html","Properties":{"ApplicationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationfleetassociation.html#cfn-appstream-applicationfleetassociation-applicationarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FleetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationfleetassociation.html#cfn-appstream-applicationfleetassociation-fleetname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppStream::DirectoryConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html","Properties":{"CertificateBasedAuthProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-certificatebasedauthproperties","Required":false,"Type":"CertificateBasedAuthProperties","UpdateType":"Mutable"},"DirectoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-directoryname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OrganizationalUnitDistinguishedNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-organizationalunitdistinguishednames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"ServiceAccountCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-serviceaccountcredentials","Required":true,"Type":"ServiceAccountCredentials","UpdateType":"Mutable"}}},"AWS::AppStream::Entitlement":{"Attributes":{"CreatedTime":{"PrimitiveType":"String"},"LastModifiedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html","Properties":{"AppVisibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-appvisibility","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-attributes","DuplicatesAllowed":false,"ItemType":"Attribute","Required":true,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StackName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-stackname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppStream::Fleet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html","Properties":{"ComputeCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-computecapacity","Required":false,"Type":"ComputeCapacity","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisconnectTimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-disconnecttimeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainJoinInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-domainjoininfo","Required":false,"Type":"DomainJoinInfo","UpdateType":"Mutable"},"EnableDefaultInternetAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-enabledefaultinternetaccess","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"FleetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-fleettype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IamRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-iamrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdleDisconnectTimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-idledisconnecttimeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ImageArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-imagearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-imagename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MaxConcurrentSessions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-maxconcurrentsessions","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxUserDurationInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-maxuserdurationinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Platform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-platform","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionScriptS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-sessionscripts3location","Required":false,"Type":"S3Location","UpdateType":"Mutable"},"StreamView":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-streamview","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UsbDeviceFilterStrings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-usbdevicefilterstrings","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Mutable"}}},"AWS::AppStream::ImageBuilder":{"Attributes":{"StreamingUrl":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html","Properties":{"AccessEndpoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-accessendpoints","DuplicatesAllowed":true,"ItemType":"AccessEndpoint","Required":false,"Type":"List","UpdateType":"Mutable"},"AppstreamAgentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-appstreamagentversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainJoinInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-domainjoininfo","Required":false,"Type":"DomainJoinInfo","UpdateType":"Mutable"},"EnableDefaultInternetAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-enabledefaultinternetaccess","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IamRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-iamrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-imagearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-imagename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-imagebuilder.html#cfn-appstream-imagebuilder-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Mutable"}}},"AWS::AppStream::Stack":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html","Properties":{"AccessEndpoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-accessendpoints","ItemType":"AccessEndpoint","Required":false,"Type":"List","UpdateType":"Mutable"},"ApplicationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-applicationsettings","Required":false,"Type":"ApplicationSettings","UpdateType":"Mutable"},"AttributesToDelete":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-attributestodelete","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DeleteStorageConnectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-deletestorageconnectors","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EmbedHostDomains":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-embedhostdomains","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"FeedbackURL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-feedbackurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RedirectURL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-redirecturl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StorageConnectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-storageconnectors","ItemType":"StorageConnector","Required":false,"Type":"List","UpdateType":"Mutable"},"StreamingExperienceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-streamingexperiencesettings","Required":false,"Type":"StreamingExperienceSettings","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stack.html#cfn-appstream-stack-usersettings","ItemType":"UserSetting","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AppStream::StackFleetAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackfleetassociation.html","Properties":{"FleetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackfleetassociation.html#cfn-appstream-stackfleetassociation-fleetname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StackName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackfleetassociation.html#cfn-appstream-stackfleetassociation-stackname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppStream::StackUserAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackuserassociation.html","Properties":{"AuthenticationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackuserassociation.html#cfn-appstream-stackuserassociation-authenticationtype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SendEmailNotification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackuserassociation.html#cfn-appstream-stackuserassociation-sendemailnotification","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"StackName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackuserassociation.html#cfn-appstream-stackuserassociation-stackname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-stackuserassociation.html#cfn-appstream-stackuserassociation-username","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppStream::User":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html","Properties":{"AuthenticationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html#cfn-appstream-user-authenticationtype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FirstName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html#cfn-appstream-user-firstname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LastName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html#cfn-appstream-user-lastname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MessageAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html#cfn-appstream-user-messageaction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"UserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-user.html#cfn-appstream-user-username","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppSync::ApiCache":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apicache.html","Properties":{"ApiCachingBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apicache.html#cfn-appsync-apicache-apicachingbehavior","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apicache.html#cfn-appsync-apicache-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AtRestEncryptionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apicache.html#cfn-appsync-apicache-atrestencryptionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TransitEncryptionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apicache.html#cfn-appsync-apicache-transitencryptionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Ttl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apicache.html#cfn-appsync-apicache-ttl","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apicache.html#cfn-appsync-apicache-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::ApiKey":{"Attributes":{"ApiKey":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apikey.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apikey.html#cfn-appsync-apikey-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ApiKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apikey.html#cfn-appsync-apikey-apikeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apikey.html#cfn-appsync-apikey-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Expires":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apikey.html#cfn-appsync-apikey-expires","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::DataSource":{"Attributes":{"DataSourceArn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DynamoDBConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-dynamodbconfig","Required":false,"Type":"DynamoDBConfig","UpdateType":"Mutable"},"ElasticsearchConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-elasticsearchconfig","Required":false,"Type":"ElasticsearchConfig","UpdateType":"Mutable"},"EventBridgeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-eventbridgeconfig","Required":false,"Type":"EventBridgeConfig","UpdateType":"Mutable"},"HttpConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-httpconfig","Required":false,"Type":"HttpConfig","UpdateType":"Mutable"},"LambdaConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-lambdaconfig","Required":false,"Type":"LambdaConfig","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OpenSearchServiceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-opensearchserviceconfig","Required":false,"Type":"OpenSearchServiceConfig","UpdateType":"Mutable"},"RelationalDatabaseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-relationaldatabaseconfig","Required":false,"Type":"RelationalDatabaseConfig","UpdateType":"Mutable"},"ServiceRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-servicerolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::AppSync::DomainName":{"Attributes":{"AppSyncDomainName":{"PrimitiveType":"String"},"DomainName":{"PrimitiveType":"String"},"HostedZoneId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainname.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainname.html#cfn-appsync-domainname-certificatearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainname.html#cfn-appsync-domainname-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainname.html#cfn-appsync-domainname-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppSync::DomainNameApiAssociation":{"Attributes":{"ApiAssociationIdentifier":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainnameapiassociation.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainnameapiassociation.html#cfn-appsync-domainnameapiassociation-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainnameapiassociation.html#cfn-appsync-domainnameapiassociation-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppSync::FunctionConfiguration":{"Attributes":{"DataSourceName":{"PrimitiveType":"String"},"FunctionArn":{"PrimitiveType":"String"},"FunctionId":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-code","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CodeS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-codes3location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataSourceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-datasourcename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FunctionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-functionversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxBatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-maxbatchsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RequestMappingTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-requestmappingtemplate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RequestMappingTemplateS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-requestmappingtemplates3location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseMappingTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-responsemappingtemplate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseMappingTemplateS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-responsemappingtemplates3location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Runtime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-runtime","Required":false,"Type":"AppSyncRuntime","UpdateType":"Mutable"},"SyncConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-syncconfig","Required":false,"Type":"SyncConfig","UpdateType":"Mutable"}}},"AWS::AppSync::GraphQLApi":{"Attributes":{"ApiId":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"},"GraphQLDns":{"PrimitiveType":"String"},"GraphQLUrl":{"PrimitiveType":"String"},"RealtimeDns":{"PrimitiveType":"String"},"RealtimeUrl":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html","Properties":{"AdditionalAuthenticationProviders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-additionalauthenticationproviders","ItemType":"AdditionalAuthenticationProvider","Required":false,"Type":"List","UpdateType":"Mutable"},"ApiType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-apitype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AuthenticationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-authenticationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LambdaAuthorizerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-lambdaauthorizerconfig","Required":false,"Type":"LambdaAuthorizerConfig","UpdateType":"Mutable"},"LogConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-logconfig","Required":false,"Type":"LogConfig","UpdateType":"Mutable"},"MergedApiExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-mergedapiexecutionrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OpenIDConnectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-openidconnectconfig","Required":false,"Type":"OpenIDConnectConfig","UpdateType":"Mutable"},"OwnerContact":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-ownercontact","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserPoolConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-userpoolconfig","Required":false,"Type":"UserPoolConfig","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"XrayEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-xrayenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::GraphQLSchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlschema.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlschema.html#cfn-appsync-graphqlschema-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlschema.html#cfn-appsync-graphqlschema-definition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefinitionS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlschema.html#cfn-appsync-graphqlschema-definitions3location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AppSync::Resolver":{"Attributes":{"FieldName":{"PrimitiveType":"String"},"ResolverArn":{"PrimitiveType":"String"},"TypeName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html","Properties":{"ApiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-apiid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CachingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-cachingconfig","Required":false,"Type":"CachingConfig","UpdateType":"Mutable"},"Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-code","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CodeS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-codes3location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataSourceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-datasourcename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FieldName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-fieldname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Kind":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-kind","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxBatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-maxbatchsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PipelineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-pipelineconfig","Required":false,"Type":"PipelineConfig","UpdateType":"Mutable"},"RequestMappingTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-requestmappingtemplate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RequestMappingTemplateS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-requestmappingtemplates3location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseMappingTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-responsemappingtemplate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResponseMappingTemplateS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-responsemappingtemplates3location","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Runtime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-runtime","Required":false,"Type":"AppSyncRuntime","UpdateType":"Mutable"},"SyncConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-syncconfig","Required":false,"Type":"SyncConfig","UpdateType":"Mutable"},"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-typename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::AppSync::SourceApiAssociation":{"Attributes":{"AssociationArn":{"PrimitiveType":"String"},"AssociationId":{"PrimitiveType":"String"},"LastSuccessfulMergeDate":{"PrimitiveType":"String"},"MergedApiArn":{"PrimitiveType":"String"},"MergedApiId":{"PrimitiveType":"String"},"SourceApiArn":{"PrimitiveType":"String"},"SourceApiAssociationStatus":{"PrimitiveType":"String"},"SourceApiAssociationStatusDetail":{"PrimitiveType":"String"},"SourceApiId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-sourceapiassociation.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-sourceapiassociation.html#cfn-appsync-sourceapiassociation-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MergedApiIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-sourceapiassociation.html#cfn-appsync-sourceapiassociation-mergedapiidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceApiAssociationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-sourceapiassociation.html#cfn-appsync-sourceapiassociation-sourceapiassociationconfig","Required":false,"Type":"SourceApiAssociationConfig","UpdateType":"Mutable"},"SourceApiIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-sourceapiassociation.html#cfn-appsync-sourceapiassociation-sourceapiidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ApplicationAutoScaling::ScalableTarget":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html","Properties":{"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html#cfn-applicationautoscaling-scalabletarget-maxcapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MinCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html#cfn-applicationautoscaling-scalabletarget-mincapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html#cfn-applicationautoscaling-scalabletarget-resourceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html#cfn-applicationautoscaling-scalabletarget-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScalableDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html#cfn-applicationautoscaling-scalabletarget-scalabledimension","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ScheduledActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html#cfn-applicationautoscaling-scalabletarget-scheduledactions","DuplicatesAllowed":false,"ItemType":"ScheduledAction","Required":false,"Type":"List","UpdateType":"Mutable"},"ServiceNamespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html#cfn-applicationautoscaling-scalabletarget-servicenamespace","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SuspendedState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html#cfn-applicationautoscaling-scalabletarget-suspendedstate","Required":false,"Type":"SuspendedState","UpdateType":"Mutable"}}},"AWS::ApplicationAutoScaling::ScalingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html","Properties":{"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html#cfn-applicationautoscaling-scalingpolicy-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PolicyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html#cfn-applicationautoscaling-scalingpolicy-policytype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html#cfn-applicationautoscaling-scalingpolicy-resourceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ScalableDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html#cfn-applicationautoscaling-scalingpolicy-scalabledimension","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ScalingTargetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html#cfn-applicationautoscaling-scalingpolicy-scalingtargetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServiceNamespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html#cfn-applicationautoscaling-scalingpolicy-servicenamespace","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StepScalingPolicyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html#cfn-applicationautoscaling-scalingpolicy-stepscalingpolicyconfiguration","Required":false,"Type":"StepScalingPolicyConfiguration","UpdateType":"Mutable"},"TargetTrackingScalingPolicyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html#cfn-applicationautoscaling-scalingpolicy-targettrackingscalingpolicyconfiguration","Required":false,"Type":"TargetTrackingScalingPolicyConfiguration","UpdateType":"Mutable"}}},"AWS::ApplicationInsights::Application":{"Attributes":{"ApplicationARN":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationinsights-application.html","Properties":{"AutoConfigurationEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationinsights-application.html#cfn-applicationinsights-application-autoconfigurationenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CWEMonitorEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationinsights-application.html#cfn-applicationinsights-application-cwemonitorenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ComponentMonitoringSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationinsights-application.html#cfn-applicationinsights-application-componentmonitoringsettings","DuplicatesAllowed":true,"ItemType":"ComponentMonitoringSetting","Required":false,"Type":"List","UpdateType":"Mutable"},"CustomComponents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationinsights-application.html#cfn-applicationinsights-application-customcomponents","DuplicatesAllowed":true,"ItemType":"CustomComponent","Required":false,"Type":"List","UpdateType":"Mutable"},"GroupingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationinsights-application.html#cfn-applicationinsights-application-groupingtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogPatternSets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationinsights-application.html#cfn-applicationinsights-application-logpatternsets","DuplicatesAllowed":true,"ItemType":"LogPatternSet","Required":false,"Type":"List","UpdateType":"Mutable"},"OpsCenterEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationinsights-application.html#cfn-applicationinsights-application-opscenterenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"OpsItemSNSTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationinsights-application.html#cfn-applicationinsights-application-opsitemsnstopicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationinsights-application.html#cfn-applicationinsights-application-resourcegroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationinsights-application.html#cfn-applicationinsights-application-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Athena::CapacityReservation":{"Attributes":{"AllocatedDpus":{"PrimitiveType":"Integer"},"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"LastSuccessfulAllocationTime":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-capacityreservation.html","Properties":{"CapacityAssignmentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-capacityreservation.html#cfn-athena-capacityreservation-capacityassignmentconfiguration","Required":false,"Type":"CapacityAssignmentConfiguration","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-capacityreservation.html#cfn-athena-capacityreservation-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-capacityreservation.html#cfn-athena-capacityreservation-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetDpus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-capacityreservation.html#cfn-athena-capacityreservation-targetdpus","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::Athena::DataCatalog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-datacatalog.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-datacatalog.html#cfn-athena-datacatalog-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-datacatalog.html#cfn-athena-datacatalog-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-datacatalog.html#cfn-athena-datacatalog-parameters","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-datacatalog.html#cfn-athena-datacatalog-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-datacatalog.html#cfn-athena-datacatalog-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Athena::NamedQuery":{"Attributes":{"NamedQueryId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-namedquery.html","Properties":{"Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-namedquery.html#cfn-athena-namedquery-database","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-namedquery.html#cfn-athena-namedquery-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-namedquery.html#cfn-athena-namedquery-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"QueryString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-namedquery.html#cfn-athena-namedquery-querystring","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WorkGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-namedquery.html#cfn-athena-namedquery-workgroup","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Athena::PreparedStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-preparedstatement.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-preparedstatement.html#cfn-athena-preparedstatement-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"QueryStatement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-preparedstatement.html#cfn-athena-preparedstatement-querystatement","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StatementName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-preparedstatement.html#cfn-athena-preparedstatement-statementname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WorkGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-preparedstatement.html#cfn-athena-preparedstatement-workgroup","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Athena::WorkGroup":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"WorkGroupConfiguration.EngineVersion.EffectiveEngineVersion":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-workgroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-workgroup.html#cfn-athena-workgroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-workgroup.html#cfn-athena-workgroup-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RecursiveDeleteOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-workgroup.html#cfn-athena-workgroup-recursivedeleteoption","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-workgroup.html#cfn-athena-workgroup-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-workgroup.html#cfn-athena-workgroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"WorkGroupConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-workgroup.html#cfn-athena-workgroup-workgroupconfiguration","Required":false,"Type":"WorkGroupConfiguration","UpdateType":"Mutable"}}},"AWS::AuditManager::Assessment":{"Attributes":{"Arn":{"PrimitiveType":"String"},"AssessmentId":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"Double"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-auditmanager-assessment.html","Properties":{"AssessmentReportsDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-auditmanager-assessment.html#cfn-auditmanager-assessment-assessmentreportsdestination","Required":false,"Type":"AssessmentReportsDestination","UpdateType":"Mutable"},"AwsAccount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-auditmanager-assessment.html#cfn-auditmanager-assessment-awsaccount","Required":false,"Type":"AWSAccount","UpdateType":"Immutable"},"Delegations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-auditmanager-assessment.html#cfn-auditmanager-assessment-delegations","DuplicatesAllowed":true,"ItemType":"Delegation","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-auditmanager-assessment.html#cfn-auditmanager-assessment-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FrameworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-auditmanager-assessment.html#cfn-auditmanager-assessment-frameworkid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-auditmanager-assessment.html#cfn-auditmanager-assessment-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Roles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-auditmanager-assessment.html#cfn-auditmanager-assessment-roles","DuplicatesAllowed":true,"ItemType":"Role","Required":false,"Type":"List","UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-auditmanager-assessment.html#cfn-auditmanager-assessment-scope","Required":false,"Type":"Scope","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-auditmanager-assessment.html#cfn-auditmanager-assessment-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-auditmanager-assessment.html#cfn-auditmanager-assessment-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AutoScaling::AutoScalingGroup":{"Attributes":{},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html","Properties":{"AutoScalingGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-autoscaling-autoscalinggroup-autoscalinggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AvailabilityZones":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-availabilityzones","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CapacityRebalance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-capacityrebalance","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Context":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-context","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Cooldown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-cooldown","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultInstanceWarmup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-defaultinstancewarmup","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DesiredCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-desiredcapacity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DesiredCapacityType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-desiredcapacitytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HealthCheckGracePeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-healthcheckgraceperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HealthCheckType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-healthchecktype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-instanceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LaunchConfigurationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-launchconfigurationname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-launchtemplate","Required":false,"Type":"LaunchTemplateSpecification","UpdateType":"Mutable"},"LifecycleHookSpecificationList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecificationlist","DuplicatesAllowed":true,"ItemType":"LifecycleHookSpecification","Required":false,"Type":"List","UpdateType":"Mutable"},"LoadBalancerNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-loadbalancernames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MaxInstanceLifetime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-maxinstancelifetime","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-maxsize","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MetricsCollection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-metricscollection","DuplicatesAllowed":true,"ItemType":"MetricsCollection","Required":false,"Type":"List","UpdateType":"Mutable"},"MinSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-minsize","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MixedInstancesPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-mixedinstancespolicy","Required":false,"Type":"MixedInstancesPolicy","UpdateType":"Mutable"},"NewInstancesProtectedFromScaleIn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-newinstancesprotectedfromscalein","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NotificationConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-notificationconfigurations","DuplicatesAllowed":true,"ItemType":"NotificationConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"PlacementGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-placementgroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServiceLinkedRoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-autoscaling-autoscalinggroup-servicelinkedrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-tags","DuplicatesAllowed":true,"ItemType":"TagProperty","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetGroupARNs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-targetgrouparns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TerminationPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-termpolicy","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VPCZoneIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-vpczoneidentifier","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::AutoScaling::LaunchConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html","Properties":{"AssociatePublicIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-associatepublicipaddress","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"BlockDeviceMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-blockdevicemappings","DuplicatesAllowed":false,"ItemType":"BlockDeviceMapping","Required":false,"Type":"List","UpdateType":"Immutable"},"ClassicLinkVPCId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-classiclinkvpcid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ClassicLinkVPCSecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-classiclinkvpcsecuritygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"EbsOptimized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-ebsoptimized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"IamInstanceProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-iaminstanceprofile","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ImageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-imageid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-instanceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceMonitoring":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-instancemonitoring","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KernelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-kernelid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KeyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-keyname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LaunchConfigurationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-launchconfigurationname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MetadataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-metadataoptions","Required":false,"Type":"MetadataOptions","UpdateType":"Immutable"},"PlacementTenancy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-placementtenancy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RamDiskId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-ramdiskid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SpotPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-spotprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"UserData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-userdata","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::AutoScaling::LifecycleHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html","Properties":{"AutoScalingGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-autoscalinggroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DefaultResult":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-defaultresult","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HeartbeatTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-heartbeattimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"LifecycleHookName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-lifecyclehookname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LifecycleTransition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-lifecycletransition","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NotificationMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-notificationmetadata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NotificationTargetARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-notificationtargetarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::ScalingPolicy":{"Attributes":{"Arn":{"PrimitiveType":"String"},"PolicyName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html","Properties":{"AdjustmentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html#cfn-autoscaling-scalingpolicy-adjustmenttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AutoScalingGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html#cfn-autoscaling-scalingpolicy-autoscalinggroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Cooldown":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html#cfn-autoscaling-scalingpolicy-cooldown","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EstimatedInstanceWarmup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html#cfn-autoscaling-scalingpolicy-estimatedinstancewarmup","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MetricAggregationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html#cfn-autoscaling-scalingpolicy-metricaggregationtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MinAdjustmentMagnitude":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html#cfn-autoscaling-scalingpolicy-minadjustmentmagnitude","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PolicyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html#cfn-autoscaling-scalingpolicy-policytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PredictiveScalingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration","Required":false,"Type":"PredictiveScalingConfiguration","UpdateType":"Mutable"},"ScalingAdjustment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html#cfn-autoscaling-scalingpolicy-scalingadjustment","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StepAdjustments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html#cfn-autoscaling-scalingpolicy-stepadjustments","DuplicatesAllowed":false,"ItemType":"StepAdjustment","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetTrackingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scalingpolicy.html#cfn-autoscaling-scalingpolicy-targettrackingconfiguration","Required":false,"Type":"TargetTrackingConfiguration","UpdateType":"Mutable"}}},"AWS::AutoScaling::ScheduledAction":{"Attributes":{"ScheduledActionName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scheduledaction.html","Properties":{"AutoScalingGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scheduledaction.html#cfn-autoscaling-scheduledaction-autoscalinggroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DesiredCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scheduledaction.html#cfn-autoscaling-scheduledaction-desiredcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"EndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scheduledaction.html#cfn-autoscaling-scheduledaction-endtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scheduledaction.html#cfn-autoscaling-scheduledaction-maxsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scheduledaction.html#cfn-autoscaling-scheduledaction-minsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Recurrence":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scheduledaction.html#cfn-autoscaling-scheduledaction-recurrence","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scheduledaction.html#cfn-autoscaling-scheduledaction-starttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TimeZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-scheduledaction.html#cfn-autoscaling-scheduledaction-timezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScaling::WarmPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-warmpool.html","Properties":{"AutoScalingGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-warmpool.html#cfn-autoscaling-warmpool-autoscalinggroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InstanceReusePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-warmpool.html#cfn-autoscaling-warmpool-instancereusepolicy","Required":false,"Type":"InstanceReusePolicy","UpdateType":"Mutable"},"MaxGroupPreparedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-warmpool.html#cfn-autoscaling-warmpool-maxgrouppreparedcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-warmpool.html#cfn-autoscaling-warmpool-minsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PoolState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-warmpool.html#cfn-autoscaling-warmpool-poolstate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::AutoScalingPlans::ScalingPlan":{"Attributes":{"ScalingPlanName":{"PrimitiveType":"String"},"ScalingPlanVersion":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscalingplans-scalingplan.html","Properties":{"ApplicationSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscalingplans-scalingplan.html#cfn-autoscalingplans-scalingplan-applicationsource","Required":true,"Type":"ApplicationSource","UpdateType":"Mutable"},"ScalingInstructions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscalingplans-scalingplan.html#cfn-autoscalingplans-scalingplan-scalinginstructions","ItemType":"ScalingInstruction","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Backup::BackupPlan":{"Attributes":{"BackupPlanArn":{"PrimitiveType":"String"},"BackupPlanId":{"PrimitiveType":"String"},"VersionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupplan.html","Properties":{"BackupPlan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupplan.html#cfn-backup-backupplan-backupplan","Required":true,"Type":"BackupPlanResourceType","UpdateType":"Mutable"},"BackupPlanTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupplan.html#cfn-backup-backupplan-backupplantags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::Backup::BackupSelection":{"Attributes":{"BackupPlanId":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"SelectionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupselection.html","Properties":{"BackupPlanId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupselection.html#cfn-backup-backupselection-backupplanid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BackupSelection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupselection.html#cfn-backup-backupselection-backupselection","Required":true,"Type":"BackupSelectionResourceType","UpdateType":"Immutable"}}},"AWS::Backup::BackupVault":{"Attributes":{"BackupVaultArn":{"PrimitiveType":"String"},"BackupVaultName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupvault.html","Properties":{"AccessPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupvault.html#cfn-backup-backupvault-accesspolicy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"BackupVaultName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupvault.html#cfn-backup-backupvault-backupvaultname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BackupVaultTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupvault.html#cfn-backup-backupvault-backupvaulttags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"EncryptionKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupvault.html#cfn-backup-backupvault-encryptionkeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LockConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupvault.html#cfn-backup-backupvault-lockconfiguration","Required":false,"Type":"LockConfigurationType","UpdateType":"Mutable"},"Notifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupvault.html#cfn-backup-backupvault-notifications","Required":false,"Type":"NotificationObjectType","UpdateType":"Mutable"}}},"AWS::Backup::Framework":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"DeploymentStatus":{"PrimitiveType":"String"},"FrameworkArn":{"PrimitiveType":"String"},"FrameworkStatus":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-framework.html","Properties":{"FrameworkControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-framework.html#cfn-backup-framework-frameworkcontrols","DuplicatesAllowed":false,"ItemType":"FrameworkControl","Required":true,"Type":"List","UpdateType":"Mutable"},"FrameworkDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-framework.html#cfn-backup-framework-frameworkdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FrameworkName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-framework.html#cfn-backup-framework-frameworkname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FrameworkTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-framework.html#cfn-backup-framework-frameworktags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Backup::ReportPlan":{"Attributes":{"ReportPlanArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html","Properties":{"ReportDeliveryChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html#cfn-backup-reportplan-reportdeliverychannel","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"ReportPlanDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html#cfn-backup-reportplan-reportplandescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReportPlanName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html#cfn-backup-reportplan-reportplanname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ReportPlanTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html#cfn-backup-reportplan-reportplantags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ReportSetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html#cfn-backup-reportplan-reportsetting","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"}}},"AWS::BackupGateway::Hypervisor":{"Attributes":{"HypervisorArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backupgateway-hypervisor.html","Properties":{"Host":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backupgateway-hypervisor.html#cfn-backupgateway-hypervisor-host","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backupgateway-hypervisor.html#cfn-backupgateway-hypervisor-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backupgateway-hypervisor.html#cfn-backupgateway-hypervisor-loggrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backupgateway-hypervisor.html#cfn-backupgateway-hypervisor-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backupgateway-hypervisor.html#cfn-backupgateway-hypervisor-password","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backupgateway-hypervisor.html#cfn-backupgateway-hypervisor-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backupgateway-hypervisor.html#cfn-backupgateway-hypervisor-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Batch::ComputeEnvironment":{"Attributes":{"ComputeEnvironmentArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html","Properties":{"ComputeEnvironmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-computeenvironmentname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ComputeResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-computeresources","Required":false,"Type":"ComputeResources","UpdateType":"Mutable"},"EksConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-eksconfiguration","Required":false,"Type":"EksConfiguration","UpdateType":"Immutable"},"ReplaceComputeEnvironment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-replacecomputeenvironment","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ServiceRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-servicerole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UnmanagedvCpus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-unmanagedvcpus","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UpdatePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-updatepolicy","Required":false,"Type":"UpdatePolicy","UpdateType":"Mutable"}}},"AWS::Batch::JobDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html","Properties":{"ContainerProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-containerproperties","Required":false,"Type":"ContainerProperties","UpdateType":"Mutable"},"EksProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-eksproperties","Required":false,"Type":"EksProperties","UpdateType":"Mutable"},"JobDefinitionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-jobdefinitionname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NodeProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-nodeproperties","Required":false,"Type":"NodeProperties","UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"PlatformCapabilities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-platformcapabilities","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PropagateTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-propagatetags","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RetryStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-retrystrategy","Required":false,"Type":"RetryStrategy","UpdateType":"Mutable"},"SchedulingPriority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-schedulingpriority","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-timeout","Required":false,"Type":"Timeout","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Batch::JobQueue":{"Attributes":{"JobQueueArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobqueue.html","Properties":{"ComputeEnvironmentOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobqueue.html#cfn-batch-jobqueue-computeenvironmentorder","DuplicatesAllowed":true,"ItemType":"ComputeEnvironmentOrder","Required":true,"Type":"List","UpdateType":"Mutable"},"JobQueueName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobqueue.html#cfn-batch-jobqueue-jobqueuename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobqueue.html#cfn-batch-jobqueue-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"SchedulingPolicyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobqueue.html#cfn-batch-jobqueue-schedulingpolicyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobqueue.html#cfn-batch-jobqueue-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobqueue.html#cfn-batch-jobqueue-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::Batch::SchedulingPolicy":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-schedulingpolicy.html","Properties":{"FairsharePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-schedulingpolicy.html#cfn-batch-schedulingpolicy-fairsharepolicy","Required":false,"Type":"FairsharePolicy","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-schedulingpolicy.html#cfn-batch-schedulingpolicy-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-schedulingpolicy.html#cfn-batch-schedulingpolicy-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::BillingConductor::BillingGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"Integer"},"LastModifiedTime":{"PrimitiveType":"Integer"},"Size":{"PrimitiveType":"Integer"},"Status":{"PrimitiveType":"String"},"StatusReason":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html","Properties":{"AccountGrouping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html#cfn-billingconductor-billinggroup-accountgrouping","Required":true,"Type":"AccountGrouping","UpdateType":"Mutable"},"ComputationPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html#cfn-billingconductor-billinggroup-computationpreference","Required":true,"Type":"ComputationPreference","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html#cfn-billingconductor-billinggroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html#cfn-billingconductor-billinggroup-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PrimaryAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html#cfn-billingconductor-billinggroup-primaryaccountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html#cfn-billingconductor-billinggroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::BillingConductor::CustomLineItem":{"Attributes":{"Arn":{"PrimitiveType":"String"},"AssociationSize":{"PrimitiveType":"Integer"},"CreationTime":{"PrimitiveType":"Integer"},"CurrencyCode":{"PrimitiveType":"String"},"LastModifiedTime":{"PrimitiveType":"Integer"},"ProductCode":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html","Properties":{"BillingGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html#cfn-billingconductor-customlineitem-billinggrouparn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BillingPeriodRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html#cfn-billingconductor-customlineitem-billingperiodrange","Required":false,"Type":"BillingPeriodRange","UpdateType":"Mutable"},"CustomLineItemChargeDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html#cfn-billingconductor-customlineitem-customlineitemchargedetails","Required":false,"Type":"CustomLineItemChargeDetails","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html#cfn-billingconductor-customlineitem-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html#cfn-billingconductor-customlineitem-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html#cfn-billingconductor-customlineitem-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::BillingConductor::PricingPlan":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"Integer"},"LastModifiedTime":{"PrimitiveType":"Integer"},"Size":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingplan.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingplan.html#cfn-billingconductor-pricingplan-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingplan.html#cfn-billingconductor-pricingplan-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PricingRuleArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingplan.html#cfn-billingconductor-pricingplan-pricingrulearns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingplan.html#cfn-billingconductor-pricingplan-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::BillingConductor::PricingRule":{"Attributes":{"Arn":{"PrimitiveType":"String"},"AssociatedPricingPlanCount":{"PrimitiveType":"Integer"},"CreationTime":{"PrimitiveType":"Integer"},"LastModifiedTime":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html","Properties":{"BillingEntity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-billingentity","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModifierPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-modifierpercentage","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Operation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-operation","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-scope","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Service":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-service","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Tiering":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-tiering","Required":false,"Type":"Tiering","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"UsageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-usagetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Budgets::Budget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budget.html","Properties":{"Budget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budget.html#cfn-budgets-budget-budget","Required":true,"Type":"BudgetData","UpdateType":"Mutable"},"NotificationsWithSubscribers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budget.html#cfn-budgets-budget-notificationswithsubscribers","ItemType":"NotificationWithSubscribers","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Budgets::BudgetsAction":{"Attributes":{"ActionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budgetsaction.html","Properties":{"ActionThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budgetsaction.html#cfn-budgets-budgetsaction-actionthreshold","Required":true,"Type":"ActionThreshold","UpdateType":"Mutable"},"ActionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budgetsaction.html#cfn-budgets-budgetsaction-actiontype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ApprovalModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budgetsaction.html#cfn-budgets-budgetsaction-approvalmodel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"BudgetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budgetsaction.html#cfn-budgets-budgetsaction-budgetname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budgetsaction.html#cfn-budgets-budgetsaction-definition","Required":true,"Type":"Definition","UpdateType":"Mutable"},"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budgetsaction.html#cfn-budgets-budgetsaction-executionrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NotificationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budgetsaction.html#cfn-budgets-budgetsaction-notificationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Subscribers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-budgets-budgetsaction.html#cfn-budgets-budgetsaction-subscribers","DuplicatesAllowed":true,"ItemType":"Subscriber","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CE::AnomalyMonitor":{"Attributes":{"CreationDate":{"PrimitiveType":"String"},"DimensionalValueCount":{"PrimitiveType":"Integer"},"LastEvaluatedDate":{"PrimitiveType":"String"},"LastUpdatedDate":{"PrimitiveType":"String"},"MonitorArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalymonitor.html","Properties":{"MonitorDimension":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalymonitor.html#cfn-ce-anomalymonitor-monitordimension","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MonitorName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalymonitor.html#cfn-ce-anomalymonitor-monitorname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MonitorSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalymonitor.html#cfn-ce-anomalymonitor-monitorspecification","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MonitorType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalymonitor.html#cfn-ce-anomalymonitor-monitortype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalymonitor.html#cfn-ce-anomalymonitor-resourcetags","DuplicatesAllowed":true,"ItemType":"ResourceTag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::CE::AnomalySubscription":{"Attributes":{"AccountId":{"PrimitiveType":"String"},"SubscriptionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalysubscription.html","Properties":{"Frequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalysubscription.html#cfn-ce-anomalysubscription-frequency","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MonitorArnList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalysubscription.html#cfn-ce-anomalysubscription-monitorarnlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"ResourceTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalysubscription.html#cfn-ce-anomalysubscription-resourcetags","DuplicatesAllowed":true,"ItemType":"ResourceTag","Required":false,"Type":"List","UpdateType":"Immutable"},"Subscribers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalysubscription.html#cfn-ce-anomalysubscription-subscribers","DuplicatesAllowed":true,"ItemType":"Subscriber","Required":true,"Type":"List","UpdateType":"Mutable"},"SubscriptionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalysubscription.html#cfn-ce-anomalysubscription-subscriptionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalysubscription.html#cfn-ce-anomalysubscription-threshold","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ThresholdExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-anomalysubscription.html#cfn-ce-anomalysubscription-thresholdexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CE::CostCategory":{"Attributes":{"Arn":{"PrimitiveType":"String"},"EffectiveStart":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-costcategory.html","Properties":{"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-costcategory.html#cfn-ce-costcategory-defaultvalue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-costcategory.html#cfn-ce-costcategory-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RuleVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-costcategory.html#cfn-ce-costcategory-ruleversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-costcategory.html#cfn-ce-costcategory-rules","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SplitChargeRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-costcategory.html#cfn-ce-costcategory-splitchargerules","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CUR::ReportDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html","Properties":{"AdditionalArtifacts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-additionalartifacts","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AdditionalSchemaElements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-additionalschemaelements","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"BillingViewArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-billingviewarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Compression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-compression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-format","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RefreshClosedReports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-refreshclosedreports","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"ReportName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-reportname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ReportVersioning":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-reportversioning","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-s3bucket","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-s3prefix","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-s3region","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeUnit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cur-reportdefinition.html#cfn-cur-reportdefinition-timeunit","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Cassandra::Keyspace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-keyspace.html","Properties":{"KeyspaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-keyspace.html#cfn-cassandra-keyspace-keyspacename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ReplicationSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-keyspace.html#cfn-cassandra-keyspace-replicationspecification","Required":false,"Type":"ReplicationSpecification","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-keyspace.html#cfn-cassandra-keyspace-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Cassandra::Table":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html","Properties":{"BillingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-billingmode","Required":false,"Type":"BillingMode","UpdateType":"Mutable"},"ClientSideTimestampsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-clientsidetimestampsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ClusteringKeyColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-clusteringkeycolumns","DuplicatesAllowed":false,"ItemType":"ClusteringKeyColumn","Required":false,"Type":"List","UpdateType":"Immutable"},"DefaultTimeToLive":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-defaulttimetolive","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"EncryptionSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-encryptionspecification","Required":false,"Type":"EncryptionSpecification","UpdateType":"Mutable"},"KeyspaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-keyspacename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PartitionKeyColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-partitionkeycolumns","DuplicatesAllowed":false,"ItemType":"Column","Required":true,"Type":"List","UpdateType":"Immutable"},"PointInTimeRecoveryEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-pointintimerecoveryenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RegularColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-regularcolumns","DuplicatesAllowed":false,"ItemType":"Column","Required":false,"Type":"List","UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-tablename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CertificateManager::Account":{"Attributes":{"AccountId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-account.html","Properties":{"ExpiryEventsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-account.html#cfn-certificatemanager-account-expiryeventsconfiguration","Required":true,"Type":"ExpiryEventsConfiguration","UpdateType":"Mutable"}}},"AWS::CertificateManager::Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-certificate.html","Properties":{"CertificateAuthorityArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-certificate.html#cfn-certificatemanager-certificate-certificateauthorityarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CertificateTransparencyLoggingPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-certificate.html#cfn-certificatemanager-certificate-certificatetransparencyloggingpreference","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-certificate.html#cfn-certificatemanager-certificate-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DomainValidationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-certificate.html#cfn-certificatemanager-certificate-domainvalidationoptions","DuplicatesAllowed":false,"ItemType":"DomainValidationOption","Required":false,"Type":"List","UpdateType":"Immutable"},"SubjectAlternativeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-certificate.html#cfn-certificatemanager-certificate-subjectalternativenames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-certificate.html#cfn-certificatemanager-certificate-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ValidationMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-certificatemanager-certificate.html#cfn-certificatemanager-certificate-validationmethod","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Chatbot::MicrosoftTeamsChannelConfiguration":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html","Properties":{"ConfigurationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-configurationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"GuardrailPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-guardrailpolicies","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"IamRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-iamrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LoggingLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-logginglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnsTopicArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-snstopicarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TeamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-teamid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TeamsChannelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-teamschannelid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TeamsTenantId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-teamstenantid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UserRoleRequired":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-microsoftteamschannelconfiguration.html#cfn-chatbot-microsoftteamschannelconfiguration-userrolerequired","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Chatbot::SlackChannelConfiguration":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html","Properties":{"ConfigurationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-configurationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"GuardrailPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-guardrailpolicies","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"IamRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-iamrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LoggingLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-logginglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SlackChannelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-slackchannelid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SlackWorkspaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-slackworkspaceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SnsTopicArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-snstopicarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"UserRoleRequired":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-userrolerequired","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::CleanRooms::Collaboration":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CollaborationIdentifier":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-collaboration.html","Properties":{"CreatorDisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-collaboration.html#cfn-cleanrooms-collaboration-creatordisplayname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CreatorMemberAbilities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-collaboration.html#cfn-cleanrooms-collaboration-creatormemberabilities","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"DataEncryptionMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-collaboration.html#cfn-cleanrooms-collaboration-dataencryptionmetadata","Required":false,"Type":"DataEncryptionMetadata","UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-collaboration.html#cfn-cleanrooms-collaboration-description","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Members":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-collaboration.html#cfn-cleanrooms-collaboration-members","DuplicatesAllowed":true,"ItemType":"MemberSpecification","Required":true,"Type":"List","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-collaboration.html#cfn-cleanrooms-collaboration-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"QueryLogStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-collaboration.html#cfn-cleanrooms-collaboration-querylogstatus","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-collaboration.html#cfn-cleanrooms-collaboration-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CleanRooms::ConfiguredTable":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ConfiguredTableIdentifier":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtable.html","Properties":{"AllowedColumns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtable.html#cfn-cleanrooms-configuredtable-allowedcolumns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"AnalysisMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtable.html#cfn-cleanrooms-configuredtable-analysismethod","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AnalysisRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtable.html#cfn-cleanrooms-configuredtable-analysisrules","DuplicatesAllowed":true,"ItemType":"AnalysisRule","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtable.html#cfn-cleanrooms-configuredtable-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtable.html#cfn-cleanrooms-configuredtable-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TableReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtable.html#cfn-cleanrooms-configuredtable-tablereference","Required":true,"Type":"TableReference","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtable.html#cfn-cleanrooms-configuredtable-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CleanRooms::ConfiguredTableAssociation":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ConfiguredTableAssociationIdentifier":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtableassociation.html","Properties":{"ConfiguredTableIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtableassociation.html#cfn-cleanrooms-configuredtableassociation-configuredtableidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtableassociation.html#cfn-cleanrooms-configuredtableassociation-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MembershipIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtableassociation.html#cfn-cleanrooms-configuredtableassociation-membershipidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtableassociation.html#cfn-cleanrooms-configuredtableassociation-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtableassociation.html#cfn-cleanrooms-configuredtableassociation-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-configuredtableassociation.html#cfn-cleanrooms-configuredtableassociation-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CleanRooms::Membership":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CollaborationArn":{"PrimitiveType":"String"},"CollaborationCreatorAccountId":{"PrimitiveType":"String"},"MembershipIdentifier":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-membership.html","Properties":{"CollaborationIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-membership.html#cfn-cleanrooms-membership-collaborationidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"QueryLogStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-membership.html#cfn-cleanrooms-membership-querylogstatus","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cleanrooms-membership.html#cfn-cleanrooms-membership-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Cloud9::EnvironmentEC2":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html","Properties":{"AutomaticStopTimeMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-automaticstoptimeminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ConnectionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-connectiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-imageid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OwnerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-ownerarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Repositories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-repositories","ItemType":"Repository","Required":false,"Type":"List","UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFormation::CustomResource":{"AdditionalProperties":true,"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html","Properties":{"ServiceToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html#cfn-customresource-servicetoken","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CloudFormation::HookDefaultVersion":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookdefaultversion.html","Properties":{"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookdefaultversion.html#cfn-cloudformation-hookdefaultversion-typename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TypeVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookdefaultversion.html#cfn-cloudformation-hookdefaultversion-typeversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VersionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookdefaultversion.html#cfn-cloudformation-hookdefaultversion-versionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFormation::HookTypeConfig":{"Attributes":{"ConfigurationArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hooktypeconfig.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hooktypeconfig.html#cfn-cloudformation-hooktypeconfig-configuration","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ConfigurationAlias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hooktypeconfig.html#cfn-cloudformation-hooktypeconfig-configurationalias","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TypeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hooktypeconfig.html#cfn-cloudformation-hooktypeconfig-typearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hooktypeconfig.html#cfn-cloudformation-hooktypeconfig-typename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFormation::HookVersion":{"Attributes":{"Arn":{"PrimitiveType":"String"},"IsDefaultVersion":{"PrimitiveType":"Boolean"},"TypeArn":{"PrimitiveType":"String"},"VersionId":{"PrimitiveType":"String"},"Visibility":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookversion.html","Properties":{"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookversion.html#cfn-cloudformation-hookversion-executionrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LoggingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookversion.html#cfn-cloudformation-hookversion-loggingconfig","Required":false,"Type":"LoggingConfig","UpdateType":"Immutable"},"SchemaHandlerPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookversion.html#cfn-cloudformation-hookversion-schemahandlerpackage","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookversion.html#cfn-cloudformation-hookversion-typename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CloudFormation::Macro":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-macro.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-macro.html#cfn-cloudformation-macro-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FunctionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-macro.html#cfn-cloudformation-macro-functionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-macro.html#cfn-cloudformation-macro-loggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogRoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-macro.html#cfn-cloudformation-macro-logrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-macro.html#cfn-cloudformation-macro-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CloudFormation::ModuleDefaultVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-moduledefaultversion.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-moduledefaultversion.html#cfn-cloudformation-moduledefaultversion-arn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ModuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-moduledefaultversion.html#cfn-cloudformation-moduledefaultversion-modulename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VersionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-moduledefaultversion.html#cfn-cloudformation-moduledefaultversion-versionid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CloudFormation::ModuleVersion":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Description":{"PrimitiveType":"String"},"DocumentationUrl":{"PrimitiveType":"String"},"IsDefaultVersion":{"PrimitiveType":"Boolean"},"Schema":{"PrimitiveType":"String"},"TimeCreated":{"PrimitiveType":"String"},"VersionId":{"PrimitiveType":"String"},"Visibility":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-moduleversion.html","Properties":{"ModuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-moduleversion.html#cfn-cloudformation-moduleversion-modulename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ModulePackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-moduleversion.html#cfn-cloudformation-moduleversion-modulepackage","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CloudFormation::PublicTypeVersion":{"Attributes":{"PublicTypeArn":{"PrimitiveType":"String"},"PublisherId":{"PrimitiveType":"String"},"TypeVersionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-publictypeversion.html","Properties":{"Arn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-publictypeversion.html#cfn-cloudformation-publictypeversion-arn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LogDeliveryBucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-publictypeversion.html#cfn-cloudformation-publictypeversion-logdeliverybucket","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PublicVersionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-publictypeversion.html#cfn-cloudformation-publictypeversion-publicversionnumber","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-publictypeversion.html#cfn-cloudformation-publictypeversion-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-publictypeversion.html#cfn-cloudformation-publictypeversion-typename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CloudFormation::Publisher":{"Attributes":{"IdentityProvider":{"PrimitiveType":"String"},"PublisherId":{"PrimitiveType":"String"},"PublisherProfile":{"PrimitiveType":"String"},"PublisherStatus":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-publisher.html","Properties":{"AcceptTermsAndConditions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-publisher.html#cfn-cloudformation-publisher-accepttermsandconditions","PrimitiveType":"Boolean","Required":true,"UpdateType":"Immutable"},"ConnectionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-publisher.html#cfn-cloudformation-publisher-connectionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CloudFormation::ResourceDefaultVersion":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-resourcedefaultversion.html","Properties":{"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-resourcedefaultversion.html#cfn-cloudformation-resourcedefaultversion-typename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TypeVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-resourcedefaultversion.html#cfn-cloudformation-resourcedefaultversion-typeversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VersionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-resourcedefaultversion.html#cfn-cloudformation-resourcedefaultversion-versionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFormation::ResourceVersion":{"Attributes":{"Arn":{"PrimitiveType":"String"},"IsDefaultVersion":{"PrimitiveType":"Boolean"},"ProvisioningType":{"PrimitiveType":"String"},"TypeArn":{"PrimitiveType":"String"},"VersionId":{"PrimitiveType":"String"},"Visibility":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-resourceversion.html","Properties":{"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-resourceversion.html#cfn-cloudformation-resourceversion-executionrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LoggingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-resourceversion.html#cfn-cloudformation-resourceversion-loggingconfig","Required":false,"Type":"LoggingConfig","UpdateType":"Immutable"},"SchemaHandlerPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-resourceversion.html#cfn-cloudformation-resourceversion-schemahandlerpackage","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-resourceversion.html#cfn-cloudformation-resourceversion-typename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CloudFormation::Stack":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html","Properties":{"NotificationARNs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html#cfn-cloudformation-stack-notificationarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html#cfn-cloudformation-stack-parameters","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html#cfn-cloudformation-stack-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TemplateURL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html#cfn-cloudformation-stack-templateurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TimeoutInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html#cfn-cloudformation-stack-timeoutinminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFormation::StackSet":{"Attributes":{"StackSetId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html","Properties":{"AdministrationRoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-administrationrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AutoDeployment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-autodeployment","Required":false,"Type":"AutoDeployment","UpdateType":"Mutable"},"CallAs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-callas","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Capabilities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-capabilities","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExecutionRoleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-executionrolename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ManagedExecution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-managedexecution","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"OperationPreferences":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-operationpreferences","Required":false,"Type":"OperationPreferences","UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-parameters","DuplicatesAllowed":false,"ItemType":"Parameter","Required":false,"Type":"List","UpdateType":"Mutable"},"PermissionModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-permissionmodel","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StackInstancesGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-stackinstancesgroup","DuplicatesAllowed":false,"ItemType":"StackInstances","Required":false,"Type":"List","UpdateType":"Mutable"},"StackSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-stacksetname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TemplateBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-templatebody","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateURL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-templateurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFormation::TypeActivation":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-typeactivation.html","Properties":{"AutoUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-typeactivation.html#cfn-cloudformation-typeactivation-autoupdate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-typeactivation.html#cfn-cloudformation-typeactivation-executionrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LoggingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-typeactivation.html#cfn-cloudformation-typeactivation-loggingconfig","Required":false,"Type":"LoggingConfig","UpdateType":"Immutable"},"MajorVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-typeactivation.html#cfn-cloudformation-typeactivation-majorversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PublicTypeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-typeactivation.html#cfn-cloudformation-typeactivation-publictypearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PublisherId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-typeactivation.html#cfn-cloudformation-typeactivation-publisherid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-typeactivation.html#cfn-cloudformation-typeactivation-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-typeactivation.html#cfn-cloudformation-typeactivation-typename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TypeNameAlias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-typeactivation.html#cfn-cloudformation-typeactivation-typenamealias","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VersionBump":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-typeactivation.html#cfn-cloudformation-typeactivation-versionbump","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFormation::WaitCondition":{"Attributes":{"Data":{"PrimitiveType":"Json"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waitcondition.html","Properties":{"Count":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waitcondition.html#cfn-waitcondition-count","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Handle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waitcondition.html#cfn-waitcondition-handle","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waitcondition.html#cfn-waitcondition-timeout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudFormation::WaitConditionHandle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-waitconditionhandle.html","Properties":{}},"AWS::CloudFront::CachePolicy":{"Attributes":{"Id":{"PrimitiveType":"String"},"LastModifiedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-cachepolicy.html","Properties":{"CachePolicyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-cachepolicy.html#cfn-cloudfront-cachepolicy-cachepolicyconfig","Required":true,"Type":"CachePolicyConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::CloudFrontOriginAccessIdentity":{"Attributes":{"Id":{"PrimitiveType":"String"},"S3CanonicalUserId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-cloudfrontoriginaccessidentity.html","Properties":{"CloudFrontOriginAccessIdentityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-cloudfrontoriginaccessidentity.html#cfn-cloudfront-cloudfrontoriginaccessidentity-cloudfrontoriginaccessidentityconfig","Required":true,"Type":"CloudFrontOriginAccessIdentityConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::ContinuousDeploymentPolicy":{"Attributes":{"Id":{"PrimitiveType":"String"},"LastModifiedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-continuousdeploymentpolicy.html","Properties":{"ContinuousDeploymentPolicyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-continuousdeploymentpolicy.html#cfn-cloudfront-continuousdeploymentpolicy-continuousdeploymentpolicyconfig","Required":true,"Type":"ContinuousDeploymentPolicyConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::Distribution":{"Attributes":{"DomainName":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-distribution.html","Properties":{"DistributionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-distribution.html#cfn-cloudfront-distribution-distributionconfig","Required":true,"Type":"DistributionConfig","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-distribution.html#cfn-cloudfront-distribution-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudFront::Function":{"Attributes":{"FunctionARN":{"PrimitiveType":"String"},"FunctionMetadata.FunctionARN":{"PrimitiveType":"String"},"Stage":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-function.html","Properties":{"AutoPublish":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-function.html#cfn-cloudfront-function-autopublish","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"FunctionCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-function.html#cfn-cloudfront-function-functioncode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FunctionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-function.html#cfn-cloudfront-function-functionconfig","Required":true,"Type":"FunctionConfig","UpdateType":"Mutable"},"FunctionMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-function.html#cfn-cloudfront-function-functionmetadata","Required":false,"Type":"FunctionMetadata","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-function.html#cfn-cloudfront-function-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::KeyGroup":{"Attributes":{"Id":{"PrimitiveType":"String"},"LastModifiedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-keygroup.html","Properties":{"KeyGroupConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-keygroup.html#cfn-cloudfront-keygroup-keygroupconfig","Required":true,"Type":"KeyGroupConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::MonitoringSubscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-monitoringsubscription.html","Properties":{"DistributionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-monitoringsubscription.html#cfn-cloudfront-monitoringsubscription-distributionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MonitoringSubscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-monitoringsubscription.html#cfn-cloudfront-monitoringsubscription-monitoringsubscription","Required":true,"Type":"MonitoringSubscription","UpdateType":"Mutable"}}},"AWS::CloudFront::OriginAccessControl":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-originaccesscontrol.html","Properties":{"OriginAccessControlConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-originaccesscontrol.html#cfn-cloudfront-originaccesscontrol-originaccesscontrolconfig","Required":true,"Type":"OriginAccessControlConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::OriginRequestPolicy":{"Attributes":{"Id":{"PrimitiveType":"String"},"LastModifiedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-originrequestpolicy.html","Properties":{"OriginRequestPolicyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-originrequestpolicy.html#cfn-cloudfront-originrequestpolicy-originrequestpolicyconfig","Required":true,"Type":"OriginRequestPolicyConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::PublicKey":{"Attributes":{"CreatedTime":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-publickey.html","Properties":{"PublicKeyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-publickey.html#cfn-cloudfront-publickey-publickeyconfig","Required":true,"Type":"PublicKeyConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::RealtimeLogConfig":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-realtimelogconfig.html","Properties":{"EndPoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-realtimelogconfig.html#cfn-cloudfront-realtimelogconfig-endpoints","DuplicatesAllowed":true,"ItemType":"EndPoint","Required":true,"Type":"List","UpdateType":"Mutable"},"Fields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-realtimelogconfig.html#cfn-cloudfront-realtimelogconfig-fields","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-realtimelogconfig.html#cfn-cloudfront-realtimelogconfig-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SamplingRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-realtimelogconfig.html#cfn-cloudfront-realtimelogconfig-samplingrate","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"}}},"AWS::CloudFront::ResponseHeadersPolicy":{"Attributes":{"Id":{"PrimitiveType":"String"},"LastModifiedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-responseheaderspolicy.html","Properties":{"ResponseHeadersPolicyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-responseheaderspolicy.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig","Required":true,"Type":"ResponseHeadersPolicyConfig","UpdateType":"Mutable"}}},"AWS::CloudFront::StreamingDistribution":{"Attributes":{"DomainName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-streamingdistribution.html","Properties":{"StreamingDistributionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-streamingdistribution.html#cfn-cloudfront-streamingdistribution-streamingdistributionconfig","Required":true,"Type":"StreamingDistributionConfig","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-streamingdistribution.html#cfn-cloudfront-streamingdistribution-tags","ItemType":"Tag","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudTrail::Channel":{"Attributes":{"ChannelArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-channel.html","Properties":{"Destinations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-channel.html#cfn-cloudtrail-channel-destinations","DuplicatesAllowed":false,"ItemType":"Destination","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-channel.html#cfn-cloudtrail-channel-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-channel.html#cfn-cloudtrail-channel-source","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-channel.html#cfn-cloudtrail-channel-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudTrail::EventDataStore":{"Attributes":{"CreatedTimestamp":{"PrimitiveType":"String"},"EventDataStoreArn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"UpdatedTimestamp":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-eventdatastore.html","Properties":{"AdvancedEventSelectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-eventdatastore.html#cfn-cloudtrail-eventdatastore-advancedeventselectors","DuplicatesAllowed":false,"ItemType":"AdvancedEventSelector","Required":false,"Type":"List","UpdateType":"Mutable"},"IngestionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-eventdatastore.html#cfn-cloudtrail-eventdatastore-ingestionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-eventdatastore.html#cfn-cloudtrail-eventdatastore-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MultiRegionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-eventdatastore.html#cfn-cloudtrail-eventdatastore-multiregionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-eventdatastore.html#cfn-cloudtrail-eventdatastore-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OrganizationEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-eventdatastore.html#cfn-cloudtrail-eventdatastore-organizationenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-eventdatastore.html#cfn-cloudtrail-eventdatastore-retentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-eventdatastore.html#cfn-cloudtrail-eventdatastore-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TerminationProtectionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-eventdatastore.html#cfn-cloudtrail-eventdatastore-terminationprotectionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudTrail::ResourcePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-resourcepolicy.html","Properties":{"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-resourcepolicy.html#cfn-cloudtrail-resourcepolicy-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourcePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-resourcepolicy.html#cfn-cloudtrail-resourcepolicy-resourcepolicy","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::CloudTrail::Trail":{"Attributes":{"Arn":{"PrimitiveType":"String"},"SnsTopicArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html","Properties":{"AdvancedEventSelectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-advancedeventselectors","DuplicatesAllowed":false,"ItemType":"AdvancedEventSelector","Required":false,"Type":"List","UpdateType":"Mutable"},"CloudWatchLogsLogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-cloudwatchlogsloggrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CloudWatchLogsRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-cloudwatchlogsrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableLogFileValidation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-enablelogfilevalidation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EventSelectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-eventselectors","DuplicatesAllowed":false,"ItemType":"EventSelector","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludeGlobalServiceEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-includeglobalserviceevents","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InsightSelectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-insightselectors","DuplicatesAllowed":false,"ItemType":"InsightSelector","Required":false,"Type":"List","UpdateType":"Mutable"},"IsLogging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-islogging","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"IsMultiRegionTrail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-ismultiregiontrail","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsOrganizationTrail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-isorganizationtrail","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"KMSKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-s3bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-s3keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnsTopicName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-snstopicname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TrailName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-trailname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CloudWatch::Alarm":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html","Properties":{"ActionsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-actionsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AlarmActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-alarmactions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AlarmDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-alarmdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlarmName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-alarmname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-comparisonoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DatapointsToAlarm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-datapointstoalarm","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-dimension","DuplicatesAllowed":true,"ItemType":"Dimension","Required":false,"Type":"List","UpdateType":"Mutable"},"EvaluateLowSampleCountPercentile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-evaluatelowsamplecountpercentile","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EvaluationPeriods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-evaluationperiods","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ExtendedStatistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-extendedstatistic","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InsufficientDataActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-insufficientdataactions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-metricname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Metrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarm-metrics","DuplicatesAllowed":false,"ItemType":"MetricDataQuery","Required":false,"Type":"List","UpdateType":"Mutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OKActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-okactions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Period":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-period","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Statistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-statistic","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-threshold","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ThresholdMetricId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-dynamic-threshold","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TreatMissingData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-treatmissingdata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-alarm.html#cfn-cloudwatch-alarms-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CloudWatch::AnomalyDetector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-configuration","Required":false,"Type":"Configuration","UpdateType":"Mutable"},"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-dimensions","ItemType":"Dimension","Required":false,"Type":"List","UpdateType":"Immutable"},"MetricMathAnomalyDetector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-metricmathanomalydetector","Required":false,"Type":"MetricMathAnomalyDetector","UpdateType":"Immutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-metricname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Namespace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-namespace","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SingleMetricAnomalyDetector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector","Required":false,"Type":"SingleMetricAnomalyDetector","UpdateType":"Immutable"},"Stat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-stat","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CloudWatch::CompositeAlarm":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html","Properties":{"ActionsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-actionsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ActionsSuppressor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-actionssuppressor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ActionsSuppressorExtensionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-actionssuppressorextensionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ActionsSuppressorWaitPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-actionssuppressorwaitperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AlarmActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-alarmactions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AlarmDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-alarmdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlarmName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-alarmname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AlarmRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-alarmrule","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InsufficientDataActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-insufficientdataactions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OKActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-compositealarm.html#cfn-cloudwatch-compositealarm-okactions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CloudWatch::Dashboard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-dashboard.html","Properties":{"DashboardBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-dashboard.html#cfn-cloudwatch-dashboard-dashboardbody","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DashboardName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-dashboard.html#cfn-cloudwatch-dashboard-dashboardname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CloudWatch::InsightRule":{"Attributes":{"Arn":{"PrimitiveType":"String"},"RuleName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-insightrule.html","Properties":{"RuleBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-insightrule.html#cfn-cloudwatch-insightrule-rulebody","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-insightrule.html#cfn-cloudwatch-insightrule-rulename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RuleState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-insightrule.html#cfn-cloudwatch-insightrule-rulestate","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-insightrule.html#cfn-cloudwatch-insightrule-tags","Required":false,"Type":"Tags","UpdateType":"Mutable"}}},"AWS::CloudWatch::MetricStream":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationDate":{"PrimitiveType":"String"},"LastUpdateDate":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html","Properties":{"ExcludeFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-excludefilters","DuplicatesAllowed":false,"ItemType":"MetricStreamFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"FirehoseArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-firehosearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IncludeFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-includefilters","DuplicatesAllowed":false,"ItemType":"MetricStreamFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"IncludeLinkedAccountsMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-includelinkedaccountsmetrics","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OutputFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-outputformat","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StatisticsConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-statisticsconfigurations","DuplicatesAllowed":false,"ItemType":"MetricStreamStatisticsConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html#cfn-cloudwatch-metricstream-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeArtifact::Domain":{"Attributes":{"Arn":{"PrimitiveType":"String"},"EncryptionKey":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"},"Owner":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-domain.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-domain.html#cfn-codeartifact-domain-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EncryptionKey":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-domain.html#cfn-codeartifact-domain-encryptionkey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PermissionsPolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-domain.html#cfn-codeartifact-domain-permissionspolicydocument","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-domain.html#cfn-codeartifact-domain-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeArtifact::Repository":{"Attributes":{"Arn":{"PrimitiveType":"String"},"DomainName":{"PrimitiveType":"String"},"DomainOwner":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-repository.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-repository.html#cfn-codeartifact-repository-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainName":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-repository.html#cfn-codeartifact-repository-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DomainOwner":{"Documentation":"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-repository.html#cfn-codeartifact-repository-domainowner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ExternalConnections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-repository.html#cfn-codeartifact-repository-externalconnections","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PermissionsPolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-repository.html#cfn-codeartifact-repository-permissionspolicydocument","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"RepositoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-repository.html#cfn-codeartifact-repository-repositoryname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-repository.html#cfn-codeartifact-repository-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Upstreams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeartifact-repository.html#cfn-codeartifact-repository-upstreams","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeBuild::Project":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html","Properties":{"Artifacts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-artifacts","Required":true,"Type":"Artifacts","UpdateType":"Mutable"},"BadgeEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-badgeenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"BuildBatchConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-buildbatchconfig","Required":false,"Type":"ProjectBuildBatchConfig","UpdateType":"Mutable"},"Cache":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-cache","Required":false,"Type":"ProjectCache","UpdateType":"Mutable"},"ConcurrentBuildLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-concurrentbuildlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-encryptionkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-environment","Required":true,"Type":"Environment","UpdateType":"Mutable"},"FileSystemLocations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-filesystemlocations","ItemType":"ProjectFileSystemLocation","Required":false,"Type":"List","UpdateType":"Mutable"},"LogsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-logsconfig","Required":false,"Type":"LogsConfig","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"QueuedTimeoutInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-queuedtimeoutinminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ResourceAccessRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-resourceaccessrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecondaryArtifacts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-secondaryartifacts","ItemType":"Artifacts","Required":false,"Type":"List","UpdateType":"Mutable"},"SecondarySourceVersions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-secondarysourceversions","ItemType":"ProjectSourceVersion","Required":false,"Type":"List","UpdateType":"Mutable"},"SecondarySources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-secondarysources","ItemType":"Source","Required":false,"Type":"List","UpdateType":"Mutable"},"ServiceRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-servicerole","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-source","Required":true,"Type":"Source","UpdateType":"Mutable"},"SourceVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-sourceversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TimeoutInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-timeoutinminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Triggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-triggers","Required":false,"Type":"ProjectTriggers","UpdateType":"Mutable"},"Visibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-visibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Mutable"}}},"AWS::CodeBuild::ReportGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-reportgroup.html","Properties":{"DeleteReports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-reportgroup.html#cfn-codebuild-reportgroup-deletereports","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExportConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-reportgroup.html#cfn-codebuild-reportgroup-exportconfig","Required":true,"Type":"ReportExportConfig","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-reportgroup.html#cfn-codebuild-reportgroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-reportgroup.html#cfn-codebuild-reportgroup-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-reportgroup.html#cfn-codebuild-reportgroup-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CodeBuild::SourceCredential":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-sourcecredential.html","Properties":{"AuthType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-sourcecredential.html#cfn-codebuild-sourcecredential-authtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServerType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-sourcecredential.html#cfn-codebuild-sourcecredential-servertype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Token":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-sourcecredential.html#cfn-codebuild-sourcecredential-token","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-sourcecredential.html#cfn-codebuild-sourcecredential-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::CodeCommit::Repository":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CloneUrlHttp":{"PrimitiveType":"String"},"CloneUrlSsh":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codecommit-repository.html","Properties":{"Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codecommit-repository.html#cfn-codecommit-repository-code","Required":false,"Type":"Code","UpdateType":"Mutable"},"RepositoryDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codecommit-repository.html#cfn-codecommit-repository-repositorydescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RepositoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codecommit-repository.html#cfn-codecommit-repository-repositoryname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codecommit-repository.html#cfn-codecommit-repository-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Triggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codecommit-repository.html#cfn-codecommit-repository-triggers","ItemType":"RepositoryTrigger","Required":false,"Type":"List","UpdateType":"Conditional"}}},"AWS::CodeDeploy::Application":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-application.html","Properties":{"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-application.html#cfn-codedeploy-application-applicationname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ComputePlatform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-application.html#cfn-codedeploy-application-computeplatform","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-application.html#cfn-codedeploy-application-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeDeploy::DeploymentConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentconfig.html","Properties":{"ComputePlatform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentconfig.html#cfn-codedeploy-deploymentconfig-computeplatform","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeploymentConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentconfig.html#cfn-codedeploy-deploymentconfig-deploymentconfigname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MinimumHealthyHosts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentconfig.html#cfn-codedeploy-deploymentconfig-minimumhealthyhosts","Required":false,"Type":"MinimumHealthyHosts","UpdateType":"Immutable"},"TrafficRoutingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentconfig.html#cfn-codedeploy-deploymentconfig-trafficroutingconfig","Required":false,"Type":"TrafficRoutingConfig","UpdateType":"Immutable"}}},"AWS::CodeDeploy::DeploymentGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html","Properties":{"AlarmConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-alarmconfiguration","Required":false,"Type":"AlarmConfiguration","UpdateType":"Mutable"},"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-applicationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AutoRollbackConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-autorollbackconfiguration","Required":false,"Type":"AutoRollbackConfiguration","UpdateType":"Mutable"},"AutoScalingGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-autoscalinggroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"BlueGreenDeploymentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-bluegreendeploymentconfiguration","Required":false,"Type":"BlueGreenDeploymentConfiguration","UpdateType":"Mutable"},"Deployment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-deployment","Required":false,"Type":"Deployment","UpdateType":"Mutable"},"DeploymentConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-deploymentconfigname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeploymentGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-deploymentgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeploymentStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-deploymentstyle","Required":false,"Type":"DeploymentStyle","UpdateType":"Mutable"},"ECSServices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-ecsservices","DuplicatesAllowed":false,"ItemType":"ECSService","Required":false,"Type":"List","UpdateType":"Mutable"},"Ec2TagFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-ec2tagfilters","DuplicatesAllowed":false,"ItemType":"EC2TagFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"Ec2TagSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-ec2tagset","Required":false,"Type":"EC2TagSet","UpdateType":"Mutable"},"LoadBalancerInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-loadbalancerinfo","Required":false,"Type":"LoadBalancerInfo","UpdateType":"Mutable"},"OnPremisesInstanceTagFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-onpremisesinstancetagfilters","DuplicatesAllowed":false,"ItemType":"TagFilter","Required":false,"Type":"List","UpdateType":"Mutable"},"OnPremisesTagSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-onpremisestagset","Required":false,"Type":"OnPremisesTagSet","UpdateType":"Mutable"},"OutdatedInstancesStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-outdatedinstancesstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServiceRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-servicerolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TriggerConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-triggerconfigurations","DuplicatesAllowed":false,"ItemType":"TriggerConfig","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeGuruProfiler::ProfilingGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeguruprofiler-profilinggroup.html","Properties":{"AgentPermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeguruprofiler-profilinggroup.html#cfn-codeguruprofiler-profilinggroup-agentpermissions","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"AnomalyDetectionNotificationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeguruprofiler-profilinggroup.html#cfn-codeguruprofiler-profilinggroup-anomalydetectionnotificationconfiguration","DuplicatesAllowed":true,"ItemType":"Channel","Required":false,"Type":"List","UpdateType":"Mutable"},"ComputePlatform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeguruprofiler-profilinggroup.html#cfn-codeguruprofiler-profilinggroup-computeplatform","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProfilingGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeguruprofiler-profilinggroup.html#cfn-codeguruprofiler-profilinggroup-profilinggroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codeguruprofiler-profilinggroup.html#cfn-codeguruprofiler-profilinggroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeGuruReviewer::RepositoryAssociation":{"Attributes":{"AssociationArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codegurureviewer-repositoryassociation.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codegurureviewer-repositoryassociation.html#cfn-codegurureviewer-repositoryassociation-bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConnectionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codegurureviewer-repositoryassociation.html#cfn-codegurureviewer-repositoryassociation-connectionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codegurureviewer-repositoryassociation.html#cfn-codegurureviewer-repositoryassociation-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Owner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codegurureviewer-repositoryassociation.html#cfn-codegurureviewer-repositoryassociation-owner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codegurureviewer-repositoryassociation.html#cfn-codegurureviewer-repositoryassociation-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codegurureviewer-repositoryassociation.html#cfn-codegurureviewer-repositoryassociation-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CodePipeline::CustomActionType":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-category","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConfigurationProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-configurationproperties","DuplicatesAllowed":false,"ItemType":"ConfigurationProperties","Required":false,"Type":"List","UpdateType":"Immutable"},"InputArtifactDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-inputartifactdetails","Required":true,"Type":"ArtifactDetails","UpdateType":"Immutable"},"OutputArtifactDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-outputartifactdetails","Required":true,"Type":"ArtifactDetails","UpdateType":"Immutable"},"Provider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-provider","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-settings","Required":false,"Type":"Settings","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-version","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CodePipeline::Pipeline":{"Attributes":{"Version":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html","Properties":{"ArtifactStore":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-artifactstore","Required":false,"Type":"ArtifactStore","UpdateType":"Mutable"},"ArtifactStores":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-artifactstores","DuplicatesAllowed":false,"ItemType":"ArtifactStoreMap","Required":false,"Type":"List","UpdateType":"Mutable"},"DisableInboundStageTransitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-disableinboundstagetransitions","DuplicatesAllowed":false,"ItemType":"StageTransition","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RestartExecutionOnUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-restartexecutiononupdate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Stages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-stages","DuplicatesAllowed":false,"ItemType":"StageDeclaration","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodePipeline::Webhook":{"Attributes":{"Url":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html","Properties":{"Authentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-authentication","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AuthenticationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-authenticationconfiguration","Required":true,"Type":"WebhookAuthConfiguration","UpdateType":"Mutable"},"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-filters","ItemType":"WebhookFilterRule","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RegisterWithThirdParty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-registerwiththirdparty","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TargetAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-targetaction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetPipeline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-targetpipeline","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetPipelineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-targetpipelineversion","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeStar::GitHubRepository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestar-githubrepository.html","Properties":{"Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestar-githubrepository.html#cfn-codestar-githubrepository-code","Required":false,"Type":"Code","UpdateType":"Mutable"},"ConnectionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestar-githubrepository.html#cfn-codestar-githubrepository-connectionarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableIssues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestar-githubrepository.html#cfn-codestar-githubrepository-enableissues","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsPrivate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestar-githubrepository.html#cfn-codestar-githubrepository-isprivate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RepositoryAccessToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestar-githubrepository.html#cfn-codestar-githubrepository-repositoryaccesstoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RepositoryDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestar-githubrepository.html#cfn-codestar-githubrepository-repositorydescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RepositoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestar-githubrepository.html#cfn-codestar-githubrepository-repositoryname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RepositoryOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestar-githubrepository.html#cfn-codestar-githubrepository-repositoryowner","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::CodeStarConnections::Connection":{"Attributes":{"ConnectionArn":{"PrimitiveType":"String"},"ConnectionStatus":{"PrimitiveType":"String"},"OwnerAccountId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarconnections-connection.html","Properties":{"ConnectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarconnections-connection.html#cfn-codestarconnections-connection-connectionname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"HostArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarconnections-connection.html#cfn-codestarconnections-connection-hostarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProviderType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarconnections-connection.html#cfn-codestarconnections-connection-providertype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarconnections-connection.html#cfn-codestarconnections-connection-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CodeStarNotifications::NotificationRule":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html","Properties":{"CreatedBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-createdby","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DetailType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-detailtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EventTypeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-eventtypeid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventTypeIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-eventtypeids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-resource","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"TargetAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-targetaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-targets","DuplicatesAllowed":true,"ItemType":"Target","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Cognito::IdentityPool":{"Attributes":{"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html","Properties":{"AllowClassicFlow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html#cfn-cognito-identitypool-allowclassicflow","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AllowUnauthenticatedIdentities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html#cfn-cognito-identitypool-allowunauthenticatedidentities","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"CognitoEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html#cfn-cognito-identitypool-cognitoevents","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"CognitoIdentityProviders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html#cfn-cognito-identitypool-cognitoidentityproviders","ItemType":"CognitoIdentityProvider","Required":false,"Type":"List","UpdateType":"Mutable"},"CognitoStreams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html#cfn-cognito-identitypool-cognitostreams","Required":false,"Type":"CognitoStreams","UpdateType":"Mutable"},"DeveloperProviderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html#cfn-cognito-identitypool-developerprovidername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdentityPoolName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html#cfn-cognito-identitypool-identitypoolname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OpenIdConnectProviderARNs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html#cfn-cognito-identitypool-openidconnectproviderarns","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PushSync":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html#cfn-cognito-identitypool-pushsync","Required":false,"Type":"PushSync","UpdateType":"Mutable"},"SamlProviderARNs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html#cfn-cognito-identitypool-samlproviderarns","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SupportedLoginProviders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html#cfn-cognito-identitypool-supportedloginproviders","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::IdentityPoolPrincipalTag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolprincipaltag.html","Properties":{"IdentityPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolprincipaltag.html#cfn-cognito-identitypoolprincipaltag-identitypoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IdentityProviderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolprincipaltag.html#cfn-cognito-identitypoolprincipaltag-identityprovidername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PrincipalTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolprincipaltag.html#cfn-cognito-identitypoolprincipaltag-principaltags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"UseDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolprincipaltag.html#cfn-cognito-identitypoolprincipaltag-usedefaults","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::IdentityPoolRoleAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolroleattachment.html","Properties":{"IdentityPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolroleattachment.html#cfn-cognito-identitypoolroleattachment-identitypoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolroleattachment.html#cfn-cognito-identitypoolroleattachment-rolemappings","ItemType":"RoleMapping","Required":false,"Type":"Map","UpdateType":"Mutable"},"Roles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypoolroleattachment.html#cfn-cognito-identitypoolroleattachment-roles","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Cognito::UserPool":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ProviderName":{"PrimitiveType":"String"},"ProviderURL":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html","Properties":{"AccountRecoverySetting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-accountrecoverysetting","Required":false,"Type":"AccountRecoverySetting","UpdateType":"Mutable"},"AdminCreateUserConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-admincreateuserconfig","Required":false,"Type":"AdminCreateUserConfig","UpdateType":"Mutable"},"AliasAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-aliasattributes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AutoVerifiedAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-autoverifiedattributes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DeletionProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-deletionprotection","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-deviceconfiguration","Required":false,"Type":"DeviceConfiguration","UpdateType":"Mutable"},"EmailConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-emailconfiguration","Required":false,"Type":"EmailConfiguration","UpdateType":"Mutable"},"EmailVerificationMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-emailverificationmessage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EmailVerificationSubject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-emailverificationsubject","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnabledMfas":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-enabledmfas","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"LambdaConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-lambdaconfig","Required":false,"Type":"LambdaConfig","UpdateType":"Mutable"},"MfaConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-mfaconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Policies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-policies","Required":false,"Type":"Policies","UpdateType":"Mutable"},"Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-schema","ItemType":"SchemaAttribute","Required":false,"Type":"List","UpdateType":"Mutable"},"SmsAuthenticationMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-smsauthenticationmessage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SmsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-smsconfiguration","Required":false,"Type":"SmsConfiguration","UpdateType":"Mutable"},"SmsVerificationMessage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-smsverificationmessage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserAttributeUpdateSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-userattributeupdatesettings","Required":false,"Type":"UserAttributeUpdateSettings","UpdateType":"Mutable"},"UserPoolAddOns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-userpooladdons","Required":false,"Type":"UserPoolAddOns","UpdateType":"Mutable"},"UserPoolName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-userpoolname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserPoolTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-userpooltags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"UsernameAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-usernameattributes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"UsernameConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-usernameconfiguration","Required":false,"Type":"UsernameConfiguration","UpdateType":"Mutable"},"VerificationMessageTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html#cfn-cognito-userpool-verificationmessagetemplate","Required":false,"Type":"VerificationMessageTemplate","UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolClient":{"Attributes":{"ClientSecret":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html","Properties":{"AccessTokenValidity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-accesstokenvalidity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AllowedOAuthFlows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-allowedoauthflows","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AllowedOAuthFlowsUserPoolClient":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-allowedoauthflowsuserpoolclient","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AllowedOAuthScopes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-allowedoauthscopes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AnalyticsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-analyticsconfiguration","Required":false,"Type":"AnalyticsConfiguration","UpdateType":"Mutable"},"AuthSessionValidity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-authsessionvalidity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CallbackURLs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-callbackurls","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ClientName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-clientname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultRedirectURI":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-defaultredirecturi","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnablePropagateAdditionalUserContextData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-enablepropagateadditionalusercontextdata","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableTokenRevocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-enabletokenrevocation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExplicitAuthFlows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-explicitauthflows","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"GenerateSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-generatesecret","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"IdTokenValidity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-idtokenvalidity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"LogoutURLs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-logouturls","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PreventUserExistenceErrors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-preventuserexistenceerrors","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReadAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-readattributes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RefreshTokenValidity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-refreshtokenvalidity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SupportedIdentityProviders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-supportedidentityproviders","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TokenValidityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-tokenvalidityunits","Required":false,"Type":"TokenValidityUnits","UpdateType":"Mutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-userpoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WriteAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolclient.html#cfn-cognito-userpoolclient-writeattributes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Cognito::UserPoolDomain":{"Attributes":{"CloudFrontDistribution":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooldomain.html","Properties":{"CustomDomainConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooldomain.html#cfn-cognito-userpooldomain-customdomainconfig","Required":false,"Type":"CustomDomainConfigType","UpdateType":"Mutable"},"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooldomain.html#cfn-cognito-userpooldomain-domain","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooldomain.html#cfn-cognito-userpooldomain-userpoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Cognito::UserPoolGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolgroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolgroup.html#cfn-cognito-userpoolgroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolgroup.html#cfn-cognito-userpoolgroup-groupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Precedence":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolgroup.html#cfn-cognito-userpoolgroup-precedence","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolgroup.html#cfn-cognito-userpoolgroup-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolgroup.html#cfn-cognito-userpoolgroup-userpoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Cognito::UserPoolIdentityProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolidentityprovider.html","Properties":{"AttributeMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolidentityprovider.html#cfn-cognito-userpoolidentityprovider-attributemapping","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"IdpIdentifiers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolidentityprovider.html#cfn-cognito-userpoolidentityprovider-idpidentifiers","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ProviderDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolidentityprovider.html#cfn-cognito-userpoolidentityprovider-providerdetails","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ProviderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolidentityprovider.html#cfn-cognito-userpoolidentityprovider-providername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProviderType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolidentityprovider.html#cfn-cognito-userpoolidentityprovider-providertype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolidentityprovider.html#cfn-cognito-userpoolidentityprovider-userpoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Cognito::UserPoolResourceServer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolresourceserver.html","Properties":{"Identifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolresourceserver.html#cfn-cognito-userpoolresourceserver-identifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolresourceserver.html#cfn-cognito-userpoolresourceserver-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Scopes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolresourceserver.html#cfn-cognito-userpoolresourceserver-scopes","ItemType":"ResourceServerScopeType","Required":false,"Type":"List","UpdateType":"Mutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolresourceserver.html#cfn-cognito-userpoolresourceserver-userpoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Cognito::UserPoolRiskConfigurationAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolriskconfigurationattachment.html","Properties":{"AccountTakeoverRiskConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolriskconfigurationattachment.html#cfn-cognito-userpoolriskconfigurationattachment-accounttakeoverriskconfiguration","Required":false,"Type":"AccountTakeoverRiskConfigurationType","UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolriskconfigurationattachment.html#cfn-cognito-userpoolriskconfigurationattachment-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CompromisedCredentialsRiskConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolriskconfigurationattachment.html#cfn-cognito-userpoolriskconfigurationattachment-compromisedcredentialsriskconfiguration","Required":false,"Type":"CompromisedCredentialsRiskConfigurationType","UpdateType":"Mutable"},"RiskExceptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolriskconfigurationattachment.html#cfn-cognito-userpoolriskconfigurationattachment-riskexceptionconfiguration","Required":false,"Type":"RiskExceptionConfigurationType","UpdateType":"Mutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolriskconfigurationattachment.html#cfn-cognito-userpoolriskconfigurationattachment-userpoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Cognito::UserPoolUICustomizationAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluicustomizationattachment.html","Properties":{"CSS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluicustomizationattachment.html#cfn-cognito-userpooluicustomizationattachment-css","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluicustomizationattachment.html#cfn-cognito-userpooluicustomizationattachment-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluicustomizationattachment.html#cfn-cognito-userpooluicustomizationattachment-userpoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Cognito::UserPoolUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluser.html","Properties":{"ClientMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluser.html#cfn-cognito-userpooluser-clientmetadata","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"DesiredDeliveryMediums":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluser.html#cfn-cognito-userpooluser-desireddeliverymediums","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ForceAliasCreation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluser.html#cfn-cognito-userpooluser-forcealiascreation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"MessageAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluser.html#cfn-cognito-userpooluser-messageaction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"UserAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluser.html#cfn-cognito-userpooluser-userattributes","ItemType":"AttributeType","Required":false,"Type":"List","UpdateType":"Immutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluser.html#cfn-cognito-userpooluser-userpoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluser.html#cfn-cognito-userpooluser-username","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ValidationData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpooluser.html#cfn-cognito-userpooluser-validationdata","ItemType":"AttributeType","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Cognito::UserPoolUserToGroupAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolusertogroupattachment.html","Properties":{"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolusertogroupattachment.html#cfn-cognito-userpoolusertogroupattachment-groupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UserPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolusertogroupattachment.html#cfn-cognito-userpoolusertogroupattachment-userpoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpoolusertogroupattachment.html#cfn-cognito-userpoolusertogroupattachment-username","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Comprehend::DocumentClassifier":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html","Properties":{"DataAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-dataaccessrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DocumentClassifierName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-documentclassifiername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InputDataConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-inputdataconfig","Required":true,"Type":"DocumentClassifierInputDataConfig","UpdateType":"Immutable"},"LanguageCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-languagecode","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-mode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ModelKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-modelkmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ModelPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-modelpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutputDataConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-outputdataconfig","Required":false,"Type":"DocumentClassifierOutputDataConfig","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VersionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-versionname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VolumeKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-volumekmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-documentclassifier.html#cfn-comprehend-documentclassifier-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Immutable"}}},"AWS::Comprehend::Flywheel":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-flywheel.html","Properties":{"ActiveModelArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-flywheel.html#cfn-comprehend-flywheel-activemodelarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-flywheel.html#cfn-comprehend-flywheel-dataaccessrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataLakeS3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-flywheel.html#cfn-comprehend-flywheel-datalakes3uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DataSecurityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-flywheel.html#cfn-comprehend-flywheel-datasecurityconfig","Required":false,"Type":"DataSecurityConfig","UpdateType":"Mutable"},"FlywheelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-flywheel.html#cfn-comprehend-flywheel-flywheelname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ModelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-flywheel.html#cfn-comprehend-flywheel-modeltype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-flywheel.html#cfn-comprehend-flywheel-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TaskConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-comprehend-flywheel.html#cfn-comprehend-flywheel-taskconfig","Required":false,"Type":"TaskConfig","UpdateType":"Immutable"}}},"AWS::Config::AggregationAuthorization":{"Attributes":{"AggregationAuthorizationArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-aggregationauthorization.html","Properties":{"AuthorizedAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-aggregationauthorization.html#cfn-config-aggregationauthorization-authorizedaccountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AuthorizedAwsRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-aggregationauthorization.html#cfn-config-aggregationauthorization-authorizedawsregion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-aggregationauthorization.html#cfn-config-aggregationauthorization-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Config::ConfigRule":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Compliance.Type":{"PrimitiveType":"String"},"ConfigRuleId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configrule.html","Properties":{"ConfigRuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configrule.html#cfn-config-configrule-configrulename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configrule.html#cfn-config-configrule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configrule.html#cfn-config-configrule-inputparameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"MaximumExecutionFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configrule.html#cfn-config-configrule-maximumexecutionfrequency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configrule.html#cfn-config-configrule-scope","Required":false,"Type":"Scope","UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configrule.html#cfn-config-configrule-source","Required":true,"Type":"Source","UpdateType":"Mutable"}}},"AWS::Config::ConfigurationAggregator":{"Attributes":{"ConfigurationAggregatorArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configurationaggregator.html","Properties":{"AccountAggregationSources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configurationaggregator.html#cfn-config-configurationaggregator-accountaggregationsources","DuplicatesAllowed":true,"ItemType":"AccountAggregationSource","Required":false,"Type":"List","UpdateType":"Mutable"},"ConfigurationAggregatorName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configurationaggregator.html#cfn-config-configurationaggregator-configurationaggregatorname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OrganizationAggregationSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configurationaggregator.html#cfn-config-configurationaggregator-organizationaggregationsource","Required":false,"Type":"OrganizationAggregationSource","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configurationaggregator.html#cfn-config-configurationaggregator-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Config::ConfigurationRecorder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configurationrecorder.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configurationrecorder.html#cfn-config-configurationrecorder-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RecordingGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configurationrecorder.html#cfn-config-configurationrecorder-recordinggroup","Required":false,"Type":"RecordingGroup","UpdateType":"Mutable"},"RoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-configurationrecorder.html#cfn-config-configurationrecorder-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Config::ConformancePack":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-conformancepack.html","Properties":{"ConformancePackInputParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-conformancepack.html#cfn-config-conformancepack-conformancepackinputparameters","DuplicatesAllowed":true,"ItemType":"ConformancePackInputParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"ConformancePackName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-conformancepack.html#cfn-config-conformancepack-conformancepackname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DeliveryS3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-conformancepack.html#cfn-config-conformancepack-deliverys3bucket","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeliveryS3KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-conformancepack.html#cfn-config-conformancepack-deliverys3keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-conformancepack.html#cfn-config-conformancepack-templatebody","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateS3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-conformancepack.html#cfn-config-conformancepack-templates3uri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateSSMDocumentDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-conformancepack.html#cfn-config-conformancepack-templatessmdocumentdetails","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::DeliveryChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-deliverychannel.html","Properties":{"ConfigSnapshotDeliveryProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-deliverychannel.html#cfn-config-deliverychannel-configsnapshotdeliveryproperties","Required":false,"Type":"ConfigSnapshotDeliveryProperties","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-deliverychannel.html#cfn-config-deliverychannel-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-deliverychannel.html#cfn-config-deliverychannel-s3bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-deliverychannel.html#cfn-config-deliverychannel-s3keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"S3KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-deliverychannel.html#cfn-config-deliverychannel-s3kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnsTopicARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-deliverychannel.html#cfn-config-deliverychannel-snstopicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::OrganizationConfigRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconfigrule.html","Properties":{"ExcludedAccounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconfigrule.html#cfn-config-organizationconfigrule-excludedaccounts","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OrganizationConfigRuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconfigrule.html#cfn-config-organizationconfigrule-organizationconfigrulename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OrganizationCustomPolicyRuleMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconfigrule.html#cfn-config-organizationconfigrule-organizationcustompolicyrulemetadata","Required":false,"Type":"OrganizationCustomPolicyRuleMetadata","UpdateType":"Mutable"},"OrganizationCustomRuleMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconfigrule.html#cfn-config-organizationconfigrule-organizationcustomrulemetadata","Required":false,"Type":"OrganizationCustomRuleMetadata","UpdateType":"Mutable"},"OrganizationManagedRuleMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconfigrule.html#cfn-config-organizationconfigrule-organizationmanagedrulemetadata","Required":false,"Type":"OrganizationManagedRuleMetadata","UpdateType":"Mutable"}}},"AWS::Config::OrganizationConformancePack":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconformancepack.html","Properties":{"ConformancePackInputParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconformancepack.html#cfn-config-organizationconformancepack-conformancepackinputparameters","DuplicatesAllowed":true,"ItemType":"ConformancePackInputParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"DeliveryS3Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconformancepack.html#cfn-config-organizationconformancepack-deliverys3bucket","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeliveryS3KeyPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconformancepack.html#cfn-config-organizationconformancepack-deliverys3keyprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExcludedAccounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconformancepack.html#cfn-config-organizationconformancepack-excludedaccounts","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OrganizationConformancePackName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconformancepack.html#cfn-config-organizationconformancepack-organizationconformancepackname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TemplateBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconformancepack.html#cfn-config-organizationconformancepack-templatebody","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateS3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconformancepack.html#cfn-config-organizationconformancepack-templates3uri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::RemediationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-remediationconfiguration.html","Properties":{"Automatic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-remediationconfiguration.html#cfn-config-remediationconfiguration-automatic","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ConfigRuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-remediationconfiguration.html#cfn-config-remediationconfiguration-configrulename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ExecutionControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-remediationconfiguration.html#cfn-config-remediationconfiguration-executioncontrols","Required":false,"Type":"ExecutionControls","UpdateType":"Mutable"},"MaximumAutomaticAttempts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-remediationconfiguration.html#cfn-config-remediationconfiguration-maximumautomaticattempts","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-remediationconfiguration.html#cfn-config-remediationconfiguration-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-remediationconfiguration.html#cfn-config-remediationconfiguration-resourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RetryAttemptSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-remediationconfiguration.html#cfn-config-remediationconfiguration-retryattemptseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TargetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-remediationconfiguration.html#cfn-config-remediationconfiguration-targetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-remediationconfiguration.html#cfn-config-remediationconfiguration-targettype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-remediationconfiguration.html#cfn-config-remediationconfiguration-targetversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Config::StoredQuery":{"Attributes":{"QueryArn":{"PrimitiveType":"String"},"QueryId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-storedquery.html","Properties":{"QueryDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-storedquery.html#cfn-config-storedquery-querydescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"QueryExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-storedquery.html#cfn-config-storedquery-queryexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"QueryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-storedquery.html#cfn-config-storedquery-queryname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-storedquery.html#cfn-config-storedquery-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Connect::ApprovedOrigin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-approvedorigin.html","Properties":{"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-approvedorigin.html#cfn-connect-approvedorigin-instanceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Origin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-approvedorigin.html#cfn-connect-approvedorigin-origin","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Connect::ContactFlow":{"Attributes":{"ContactFlowArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-content","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Connect::ContactFlowModule":{"Attributes":{"ContactFlowModuleArn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-content","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Connect::EvaluationForm":{"Attributes":{"EvaluationFormArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-evaluationform.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-evaluationform.html#cfn-connect-evaluationform-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-evaluationform.html#cfn-connect-evaluationform-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Items":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-evaluationform.html#cfn-connect-evaluationform-items","DuplicatesAllowed":true,"ItemType":"EvaluationFormBaseItem","Required":true,"Type":"List","UpdateType":"Mutable"},"ScoringStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-evaluationform.html#cfn-connect-evaluationform-scoringstrategy","Required":false,"Type":"ScoringStrategy","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-evaluationform.html#cfn-connect-evaluationform-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-evaluationform.html#cfn-connect-evaluationform-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Title":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-evaluationform.html#cfn-connect-evaluationform-title","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::HoursOfOperation":{"Attributes":{"HoursOfOperationArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html","Properties":{"Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-config","DuplicatesAllowed":false,"ItemType":"HoursOfOperationConfig","Required":true,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TimeZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-timezone","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::Instance":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"InstanceStatus":{"PrimitiveType":"String"},"ServiceRole":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instance.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instance.html#cfn-connect-instance-attributes","Required":true,"Type":"Attributes","UpdateType":"Mutable"},"DirectoryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instance.html#cfn-connect-instance-directoryid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IdentityManagementType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instance.html#cfn-connect-instance-identitymanagementtype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InstanceAlias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instance.html#cfn-connect-instance-instancealias","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Connect::InstanceStorageConfig":{"Attributes":{"AssociationId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instancestorageconfig.html","Properties":{"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instancestorageconfig.html#cfn-connect-instancestorageconfig-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KinesisFirehoseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instancestorageconfig.html#cfn-connect-instancestorageconfig-kinesisfirehoseconfig","Required":false,"Type":"KinesisFirehoseConfig","UpdateType":"Mutable"},"KinesisStreamConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instancestorageconfig.html#cfn-connect-instancestorageconfig-kinesisstreamconfig","Required":false,"Type":"KinesisStreamConfig","UpdateType":"Mutable"},"KinesisVideoStreamConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instancestorageconfig.html#cfn-connect-instancestorageconfig-kinesisvideostreamconfig","Required":false,"Type":"KinesisVideoStreamConfig","UpdateType":"Mutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instancestorageconfig.html#cfn-connect-instancestorageconfig-resourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instancestorageconfig.html#cfn-connect-instancestorageconfig-s3config","Required":false,"Type":"S3Config","UpdateType":"Mutable"},"StorageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-instancestorageconfig.html#cfn-connect-instancestorageconfig-storagetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::IntegrationAssociation":{"Attributes":{"IntegrationAssociationId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-integrationassociation.html","Properties":{"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-integrationassociation.html#cfn-connect-integrationassociation-instanceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IntegrationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-integrationassociation.html#cfn-connect-integrationassociation-integrationarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IntegrationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-integrationassociation.html#cfn-connect-integrationassociation-integrationtype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Connect::PhoneNumber":{"Attributes":{"Address":{"PrimitiveType":"String"},"PhoneNumberArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-phonenumber.html","Properties":{"CountryCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-phonenumber.html#cfn-connect-phonenumber-countrycode","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-phonenumber.html#cfn-connect-phonenumber-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-phonenumber.html#cfn-connect-phonenumber-prefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-phonenumber.html#cfn-connect-phonenumber-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-phonenumber.html#cfn-connect-phonenumber-targetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-phonenumber.html#cfn-connect-phonenumber-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Connect::Prompt":{"Attributes":{"PromptArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-prompt.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-prompt.html#cfn-connect-prompt-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-prompt.html#cfn-connect-prompt-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-prompt.html#cfn-connect-prompt-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-prompt.html#cfn-connect-prompt-s3uri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-prompt.html#cfn-connect-prompt-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Connect::QuickConnect":{"Attributes":{"QuickConnectArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"QuickConnectConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-quickconnectconfig","Required":true,"Type":"QuickConnectConfig","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Connect::Rule":{"Attributes":{"RuleArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-rule.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-rule.html#cfn-connect-rule-actions","Required":true,"Type":"Actions","UpdateType":"Mutable"},"Function":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-rule.html#cfn-connect-rule-function","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-rule.html#cfn-connect-rule-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-rule.html#cfn-connect-rule-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PublishStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-rule.html#cfn-connect-rule-publishstatus","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-rule.html#cfn-connect-rule-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TriggerEventSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-rule.html#cfn-connect-rule-triggereventsource","Required":true,"Type":"RuleTriggerEventSource","UpdateType":"Immutable"}}},"AWS::Connect::SecurityKey":{"Attributes":{"AssociationId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-securitykey.html","Properties":{"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-securitykey.html#cfn-connect-securitykey-instanceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-securitykey.html#cfn-connect-securitykey-key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Connect::TaskTemplate":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-tasktemplate.html","Properties":{"ClientToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-tasktemplate.html#cfn-connect-tasktemplate-clienttoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Constraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-tasktemplate.html#cfn-connect-tasktemplate-constraints","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ContactFlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-tasktemplate.html#cfn-connect-tasktemplate-contactflowarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Defaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-tasktemplate.html#cfn-connect-tasktemplate-defaults","DuplicatesAllowed":true,"ItemType":"DefaultFieldValue","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-tasktemplate.html#cfn-connect-tasktemplate-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Fields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-tasktemplate.html#cfn-connect-tasktemplate-fields","DuplicatesAllowed":true,"ItemType":"Field","Required":false,"Type":"List","UpdateType":"Mutable"},"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-tasktemplate.html#cfn-connect-tasktemplate-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-tasktemplate.html#cfn-connect-tasktemplate-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-tasktemplate.html#cfn-connect-tasktemplate-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-tasktemplate.html#cfn-connect-tasktemplate-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Connect::User":{"Attributes":{"UserArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html","Properties":{"DirectoryUserId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-directoryuserid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HierarchyGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-hierarchygrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdentityInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-identityinfo","Required":false,"Type":"UserIdentityInfo","UpdateType":"Mutable"},"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-password","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PhoneConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-phoneconfig","Required":true,"Type":"UserPhoneConfig","UpdateType":"Mutable"},"RoutingProfileArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-routingprofilearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecurityProfileArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-securityprofilearns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-username","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Connect::UserHierarchyGroup":{"Attributes":{"UserHierarchyGroupArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-userhierarchygroup.html","Properties":{"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-userhierarchygroup.html#cfn-connect-userhierarchygroup-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-userhierarchygroup.html#cfn-connect-userhierarchygroup-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParentGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-userhierarchygroup.html#cfn-connect-userhierarchygroup-parentgrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ConnectCampaigns::Campaign":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connectcampaigns-campaign.html","Properties":{"ConnectInstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connectcampaigns-campaign.html#cfn-connectcampaigns-campaign-connectinstancearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DialerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connectcampaigns-campaign.html#cfn-connectcampaigns-campaign-dialerconfig","Required":true,"Type":"DialerConfig","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connectcampaigns-campaign.html#cfn-connectcampaigns-campaign-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OutboundCallConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connectcampaigns-campaign.html#cfn-connectcampaigns-campaign-outboundcallconfig","Required":true,"Type":"OutboundCallConfig","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connectcampaigns-campaign.html#cfn-connectcampaigns-campaign-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ControlTower::EnabledControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-controltower-enabledcontrol.html","Properties":{"ControlIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-controltower-enabledcontrol.html#cfn-controltower-enabledcontrol-controlidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TargetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-controltower-enabledcontrol.html#cfn-controltower-enabledcontrol-targetidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CustomerProfiles::CalculatedAttributeDefinition":{"Attributes":{"CreatedAt":{"PrimitiveType":"String"},"LastUpdatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-calculatedattributedefinition.html","Properties":{"AttributeDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-calculatedattributedefinition.html#cfn-customerprofiles-calculatedattributedefinition-attributedetails","Required":true,"Type":"AttributeDetails","UpdateType":"Mutable"},"CalculatedAttributeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-calculatedattributedefinition.html#cfn-customerprofiles-calculatedattributedefinition-calculatedattributename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Conditions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-calculatedattributedefinition.html#cfn-customerprofiles-calculatedattributedefinition-conditions","Required":false,"Type":"Conditions","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-calculatedattributedefinition.html#cfn-customerprofiles-calculatedattributedefinition-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-calculatedattributedefinition.html#cfn-customerprofiles-calculatedattributedefinition-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-calculatedattributedefinition.html#cfn-customerprofiles-calculatedattributedefinition-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Statistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-calculatedattributedefinition.html#cfn-customerprofiles-calculatedattributedefinition-statistic","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-calculatedattributedefinition.html#cfn-customerprofiles-calculatedattributedefinition-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CustomerProfiles::Domain":{"Attributes":{"CreatedAt":{"PrimitiveType":"String"},"LastUpdatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-domain.html","Properties":{"DeadLetterQueueUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-domain.html#cfn-customerprofiles-domain-deadletterqueueurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultEncryptionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-domain.html#cfn-customerprofiles-domain-defaultencryptionkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultExpirationDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-domain.html#cfn-customerprofiles-domain-defaultexpirationdays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-domain.html#cfn-customerprofiles-domain-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-domain.html#cfn-customerprofiles-domain-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::CustomerProfiles::EventStream":{"Attributes":{"CreatedAt":{"PrimitiveType":"String"},"DestinationDetails":{"Type":"DestinationDetails"},"DestinationDetails.Status":{"PrimitiveType":"String"},"DestinationDetails.Uri":{"PrimitiveType":"String"},"EventStreamArn":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-eventstream.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-eventstream.html#cfn-customerprofiles-eventstream-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EventStreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-eventstream.html#cfn-customerprofiles-eventstream-eventstreamname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-eventstream.html#cfn-customerprofiles-eventstream-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-eventstream.html#cfn-customerprofiles-eventstream-uri","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::CustomerProfiles::Integration":{"Attributes":{"CreatedAt":{"PrimitiveType":"String"},"LastUpdatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-integration.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-integration.html#cfn-customerprofiles-integration-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FlowDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-integration.html#cfn-customerprofiles-integration-flowdefinition","Required":false,"Type":"FlowDefinition","UpdateType":"Mutable"},"ObjectTypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-integration.html#cfn-customerprofiles-integration-objecttypename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ObjectTypeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-integration.html#cfn-customerprofiles-integration-objecttypenames","DuplicatesAllowed":true,"ItemType":"ObjectTypeMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-integration.html#cfn-customerprofiles-integration-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-integration.html#cfn-customerprofiles-integration-uri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::CustomerProfiles::ObjectType":{"Attributes":{"CreatedAt":{"PrimitiveType":"String"},"LastUpdatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-objecttype.html","Properties":{"AllowProfileCreation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-objecttype.html#cfn-customerprofiles-objecttype-allowprofilecreation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-objecttype.html#cfn-customerprofiles-objecttype-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-objecttype.html#cfn-customerprofiles-objecttype-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EncryptionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-objecttype.html#cfn-customerprofiles-objecttype-encryptionkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExpirationDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-objecttype.html#cfn-customerprofiles-objecttype-expirationdays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Fields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-objecttype.html#cfn-customerprofiles-objecttype-fields","DuplicatesAllowed":true,"ItemType":"FieldMap","Required":false,"Type":"List","UpdateType":"Mutable"},"Keys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-objecttype.html#cfn-customerprofiles-objecttype-keys","DuplicatesAllowed":true,"ItemType":"KeyMap","Required":false,"Type":"List","UpdateType":"Mutable"},"ObjectTypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-objecttype.html#cfn-customerprofiles-objecttype-objecttypename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-objecttype.html#cfn-customerprofiles-objecttype-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-objecttype.html#cfn-customerprofiles-objecttype-templateid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DAX::Cluster":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ClusterDiscoveryEndpoint":{"PrimitiveType":"String"},"ClusterDiscoveryEndpointURL":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html","Properties":{"AvailabilityZones":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-availabilityzones","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ClusterEndpointEncryptionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-clusterendpointencryptiontype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-clustername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IAMRoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-iamrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NodeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-nodetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NotificationTopicARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-notificationtopicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-parametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReplicationFactor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-replicationfactor","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"SSESpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-ssespecification","Required":false,"Type":"SSESpecification","UpdateType":"Immutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-securitygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-subnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-cluster.html#cfn-dax-cluster-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::DAX::ParameterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-parametergroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-parametergroup.html#cfn-dax-parametergroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-parametergroup.html#cfn-dax-parametergroup-parametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ParameterNameValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-parametergroup.html#cfn-dax-parametergroup-parameternamevalues","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::DAX::SubnetGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-subnetgroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-subnetgroup.html#cfn-dax-subnetgroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-subnetgroup.html#cfn-dax-subnetgroup-subnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dax-subnetgroup.html#cfn-dax-subnetgroup-subnetids","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::DLM::LifecyclePolicy":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dlm-lifecyclepolicy.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dlm-lifecyclepolicy.html#cfn-dlm-lifecyclepolicy-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dlm-lifecyclepolicy.html#cfn-dlm-lifecyclepolicy-executionrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PolicyDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dlm-lifecyclepolicy.html#cfn-dlm-lifecyclepolicy-policydetails","Required":false,"Type":"PolicyDetails","UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dlm-lifecyclepolicy.html#cfn-dlm-lifecyclepolicy-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dlm-lifecyclepolicy.html#cfn-dlm-lifecyclepolicy-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DMS::Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-certificate.html","Properties":{"CertificateIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-certificate.html#cfn-dms-certificate-certificateidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CertificatePem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-certificate.html#cfn-dms-certificate-certificatepem","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CertificateWallet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-certificate.html#cfn-dms-certificate-certificatewallet","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::DMS::Endpoint":{"Attributes":{"ExternalId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-certificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocDbSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-docdbsettings","Required":false,"Type":"DocDbSettings","UpdateType":"Mutable"},"DynamoDbSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-dynamodbsettings","Required":false,"Type":"DynamoDbSettings","UpdateType":"Mutable"},"ElasticsearchSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-elasticsearchsettings","Required":false,"Type":"ElasticsearchSettings","UpdateType":"Mutable"},"EndpointIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-endpointidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-endpointtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EngineName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-enginename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ExtraConnectionAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-extraconnectionattributes","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GcpMySQLSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-gcpmysqlsettings","Required":false,"Type":"GcpMySQLSettings","UpdateType":"Mutable"},"IbmDb2Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-ibmdb2settings","Required":false,"Type":"IbmDb2Settings","UpdateType":"Mutable"},"KafkaSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-kafkasettings","Required":false,"Type":"KafkaSettings","UpdateType":"Mutable"},"KinesisSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-kinesissettings","Required":false,"Type":"KinesisSettings","UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MicrosoftSqlServerSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-microsoftsqlserversettings","Required":false,"Type":"MicrosoftSqlServerSettings","UpdateType":"Mutable"},"MongoDbSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-mongodbsettings","Required":false,"Type":"MongoDbSettings","UpdateType":"Mutable"},"MySqlSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-mysqlsettings","Required":false,"Type":"MySqlSettings","UpdateType":"Mutable"},"NeptuneSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-neptunesettings","Required":false,"Type":"NeptuneSettings","UpdateType":"Mutable"},"OracleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-oraclesettings","Required":false,"Type":"OracleSettings","UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-password","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PostgreSqlSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-postgresqlsettings","Required":false,"Type":"PostgreSqlSettings","UpdateType":"Mutable"},"RedisSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-redissettings","Required":false,"Type":"RedisSettings","UpdateType":"Mutable"},"RedshiftSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-redshiftsettings","Required":false,"Type":"RedshiftSettings","UpdateType":"Mutable"},"ResourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-resourceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3Settings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-s3settings","Required":false,"Type":"S3Settings","UpdateType":"Mutable"},"ServerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-servername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SslMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-sslmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SybaseSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-sybasesettings","Required":false,"Type":"SybaseSettings","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Username":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-username","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DMS::EventSubscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-eventsubscription.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-eventsubscription.html#cfn-dms-eventsubscription-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EventCategories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-eventsubscription.html#cfn-dms-eventsubscription-eventcategories","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SnsTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-eventsubscription.html#cfn-dms-eventsubscription-snstopicarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-eventsubscription.html#cfn-dms-eventsubscription-sourceids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-eventsubscription.html#cfn-dms-eventsubscription-sourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubscriptionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-eventsubscription.html#cfn-dms-eventsubscription-subscriptionname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-eventsubscription.html#cfn-dms-eventsubscription-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DMS::ReplicationInstance":{"Attributes":{"ReplicationInstancePrivateIpAddresses":{"PrimitiveType":"String"},"ReplicationInstancePublicIpAddresses":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html","Properties":{"AllocatedStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-allocatedstorage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AllowMajorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-allowmajorversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AutoMinorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-autominorversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MultiAZ":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-multiaz","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PubliclyAccessible":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-publiclyaccessible","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ReplicationInstanceClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-replicationinstanceclass","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ReplicationInstanceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-replicationinstanceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReplicationSubnetGroupIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-replicationsubnetgroupidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-resourceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationinstance.html#cfn-dms-replicationinstance-vpcsecuritygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DMS::ReplicationSubnetGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationsubnetgroup.html","Properties":{"ReplicationSubnetGroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationsubnetgroup.html#cfn-dms-replicationsubnetgroup-replicationsubnetgroupdescription","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ReplicationSubnetGroupIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationsubnetgroup.html#cfn-dms-replicationsubnetgroup-replicationsubnetgroupidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationsubnetgroup.html#cfn-dms-replicationsubnetgroup-subnetids","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationsubnetgroup.html#cfn-dms-replicationsubnetgroup-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DMS::ReplicationTask":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html","Properties":{"CdcStartPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-cdcstartposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CdcStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-cdcstarttime","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"CdcStopPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-cdcstopposition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MigrationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-migrationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ReplicationInstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-replicationinstancearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ReplicationTaskIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-replicationtaskidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReplicationTaskSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-replicationtasksettings","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-resourceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceEndpointArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-sourceendpointarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TableMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-tablemappings","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetEndpointArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-targetendpointarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TaskData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html#cfn-dms-replicationtask-taskdata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::DataBrew::Dataset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-dataset.html","Properties":{"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-dataset.html#cfn-databrew-dataset-format","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FormatOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-dataset.html#cfn-databrew-dataset-formatoptions","Required":false,"Type":"FormatOptions","UpdateType":"Mutable"},"Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-dataset.html#cfn-databrew-dataset-input","Required":true,"Type":"Input","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-dataset.html#cfn-databrew-dataset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PathOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-dataset.html#cfn-databrew-dataset-pathoptions","Required":false,"Type":"PathOptions","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-dataset.html#cfn-databrew-dataset-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::DataBrew::Job":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html","Properties":{"DataCatalogOutputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-datacatalogoutputs","DuplicatesAllowed":true,"ItemType":"DataCatalogOutput","Required":false,"Type":"List","UpdateType":"Mutable"},"DatabaseOutputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-databaseoutputs","DuplicatesAllowed":true,"ItemType":"DatabaseOutput","Required":false,"Type":"List","UpdateType":"Mutable"},"DatasetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-datasetname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-encryptionkeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-encryptionmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JobSample":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-jobsample","Required":false,"Type":"JobSample","UpdateType":"Mutable"},"LogSubscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-logsubscription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-maxcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-maxretries","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OutputLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-outputlocation","Required":false,"Type":"OutputLocation","UpdateType":"Mutable"},"Outputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-outputs","DuplicatesAllowed":true,"ItemType":"Output","Required":false,"Type":"List","UpdateType":"Mutable"},"ProfileConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-profileconfiguration","Required":false,"Type":"ProfileConfiguration","UpdateType":"Mutable"},"ProjectName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-projectname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Recipe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-recipe","Required":false,"Type":"Recipe","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-timeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ValidationConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-validationconfigurations","DuplicatesAllowed":true,"ItemType":"ValidationConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataBrew::Project":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-project.html","Properties":{"DatasetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-project.html#cfn-databrew-project-datasetname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-project.html#cfn-databrew-project-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RecipeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-project.html#cfn-databrew-project-recipename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-project.html#cfn-databrew-project-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Sample":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-project.html#cfn-databrew-project-sample","Required":false,"Type":"Sample","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-project.html#cfn-databrew-project-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::DataBrew::Recipe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-recipe.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-recipe.html#cfn-databrew-recipe-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-recipe.html#cfn-databrew-recipe-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Steps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-recipe.html#cfn-databrew-recipe-steps","DuplicatesAllowed":true,"ItemType":"RecipeStep","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-recipe.html#cfn-databrew-recipe-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::DataBrew::Ruleset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html#cfn-databrew-ruleset-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html#cfn-databrew-ruleset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html#cfn-databrew-ruleset-rules","DuplicatesAllowed":true,"ItemType":"Rule","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html#cfn-databrew-ruleset-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html#cfn-databrew-ruleset-targetarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::DataBrew::Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-schedule.html","Properties":{"CronExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-schedule.html#cfn-databrew-schedule-cronexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"JobNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-schedule.html#cfn-databrew-schedule-jobnames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-schedule.html#cfn-databrew-schedule-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-schedule.html#cfn-databrew-schedule-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::DataPipeline::Pipeline":{"Attributes":{"PipelineId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datapipeline-pipeline.html","Properties":{"Activate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datapipeline-pipeline.html#cfn-datapipeline-pipeline-activate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datapipeline-pipeline.html#cfn-datapipeline-pipeline-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datapipeline-pipeline.html#cfn-datapipeline-pipeline-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ParameterObjects":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datapipeline-pipeline.html#cfn-datapipeline-pipeline-parameterobjects","DuplicatesAllowed":true,"ItemType":"ParameterObject","Required":false,"Type":"List","UpdateType":"Mutable"},"ParameterValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datapipeline-pipeline.html#cfn-datapipeline-pipeline-parametervalues","DuplicatesAllowed":true,"ItemType":"ParameterValue","Required":false,"Type":"List","UpdateType":"Mutable"},"PipelineObjects":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datapipeline-pipeline.html#cfn-datapipeline-pipeline-pipelineobjects","DuplicatesAllowed":true,"ItemType":"PipelineObject","Required":false,"Type":"List","UpdateType":"Mutable"},"PipelineTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datapipeline-pipeline.html#cfn-datapipeline-pipeline-pipelinetags","DuplicatesAllowed":true,"ItemType":"PipelineTag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataSync::Agent":{"Attributes":{"AgentArn":{"PrimitiveType":"String"},"EndpointType":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-agent.html","Properties":{"ActivationKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-agent.html#cfn-datasync-agent-activationkey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AgentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-agent.html#cfn-datasync-agent-agentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroupArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-agent.html#cfn-datasync-agent-securitygrouparns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SubnetArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-agent.html#cfn-datasync-agent-subnetarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-agent.html#cfn-datasync-agent-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-agent.html#cfn-datasync-agent-vpcendpointid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::DataSync::LocationEFS":{"Attributes":{"LocationArn":{"PrimitiveType":"String"},"LocationUri":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationefs.html","Properties":{"AccessPointArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationefs.html#cfn-datasync-locationefs-accesspointarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Ec2Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationefs.html#cfn-datasync-locationefs-ec2config","Required":true,"Type":"Ec2Config","UpdateType":"Immutable"},"EfsFilesystemArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationefs.html#cfn-datasync-locationefs-efsfilesystemarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FileSystemAccessRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationefs.html#cfn-datasync-locationefs-filesystemaccessrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InTransitEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationefs.html#cfn-datasync-locationefs-intransitencryption","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Subdirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationefs.html#cfn-datasync-locationefs-subdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationefs.html#cfn-datasync-locationefs-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataSync::LocationFSxLustre":{"Attributes":{"LocationArn":{"PrimitiveType":"String"},"LocationUri":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxlustre.html","Properties":{"FsxFilesystemArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxlustre.html#cfn-datasync-locationfsxlustre-fsxfilesystemarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityGroupArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxlustre.html#cfn-datasync-locationfsxlustre-securitygrouparns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Subdirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxlustre.html#cfn-datasync-locationfsxlustre-subdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxlustre.html#cfn-datasync-locationfsxlustre-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataSync::LocationFSxONTAP":{"Attributes":{"FsxFilesystemArn":{"PrimitiveType":"String"},"LocationArn":{"PrimitiveType":"String"},"LocationUri":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxontap.html","Properties":{"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxontap.html#cfn-datasync-locationfsxontap-protocol","Required":false,"Type":"Protocol","UpdateType":"Immutable"},"SecurityGroupArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxontap.html#cfn-datasync-locationfsxontap-securitygrouparns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"StorageVirtualMachineArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxontap.html#cfn-datasync-locationfsxontap-storagevirtualmachinearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Subdirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxontap.html#cfn-datasync-locationfsxontap-subdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxontap.html#cfn-datasync-locationfsxontap-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataSync::LocationFSxOpenZFS":{"Attributes":{"LocationArn":{"PrimitiveType":"String"},"LocationUri":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html","Properties":{"FsxFilesystemArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html#cfn-datasync-locationfsxopenzfs-fsxfilesystemarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html#cfn-datasync-locationfsxopenzfs-protocol","Required":true,"Type":"Protocol","UpdateType":"Immutable"},"SecurityGroupArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html#cfn-datasync-locationfsxopenzfs-securitygrouparns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Subdirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html#cfn-datasync-locationfsxopenzfs-subdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html#cfn-datasync-locationfsxopenzfs-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataSync::LocationFSxWindows":{"Attributes":{"LocationArn":{"PrimitiveType":"String"},"LocationUri":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxwindows.html","Properties":{"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxwindows.html#cfn-datasync-locationfsxwindows-domain","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FsxFilesystemArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxwindows.html#cfn-datasync-locationfsxwindows-fsxfilesystemarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxwindows.html#cfn-datasync-locationfsxwindows-password","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityGroupArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxwindows.html#cfn-datasync-locationfsxwindows-securitygrouparns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Subdirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxwindows.html#cfn-datasync-locationfsxwindows-subdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxwindows.html#cfn-datasync-locationfsxwindows-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"User":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxwindows.html#cfn-datasync-locationfsxwindows-user","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::DataSync::LocationHDFS":{"Attributes":{"LocationArn":{"PrimitiveType":"String"},"LocationUri":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html","Properties":{"AgentArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-agentarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"AuthenticationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-authenticationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BlockSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-blocksize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"KerberosKeytab":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-kerberoskeytab","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KerberosKrb5Conf":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-kerberoskrb5conf","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KerberosPrincipal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-kerberosprincipal","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyProviderUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-kmskeyprovideruri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NameNodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-namenodes","DuplicatesAllowed":true,"ItemType":"NameNode","Required":true,"Type":"List","UpdateType":"Mutable"},"QopConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-qopconfiguration","Required":false,"Type":"QopConfiguration","UpdateType":"Mutable"},"ReplicationFactor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-replicationfactor","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SimpleUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-simpleuser","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Subdirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-subdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataSync::LocationNFS":{"Attributes":{"LocationArn":{"PrimitiveType":"String"},"LocationUri":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html","Properties":{"MountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html#cfn-datasync-locationnfs-mountoptions","Required":false,"Type":"MountOptions","UpdateType":"Mutable"},"OnPremConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html#cfn-datasync-locationnfs-onpremconfig","Required":true,"Type":"OnPremConfig","UpdateType":"Mutable"},"ServerHostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html#cfn-datasync-locationnfs-serverhostname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Subdirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html#cfn-datasync-locationnfs-subdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html#cfn-datasync-locationnfs-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataSync::LocationObjectStorage":{"Attributes":{"LocationArn":{"PrimitiveType":"String"},"LocationUri":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html","Properties":{"AccessKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-accesskey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AgentArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-agentarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecretKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-secretkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-servercertificate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerHostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-serverhostname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-serverport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ServerProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-serverprotocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Subdirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-subdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataSync::LocationS3":{"Attributes":{"LocationArn":{"PrimitiveType":"String"},"LocationUri":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locations3.html","Properties":{"S3BucketArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locations3.html#cfn-datasync-locations3-s3bucketarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locations3.html#cfn-datasync-locations3-s3config","Required":true,"Type":"S3Config","UpdateType":"Immutable"},"S3StorageClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locations3.html#cfn-datasync-locations3-s3storageclass","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Subdirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locations3.html#cfn-datasync-locations3-subdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locations3.html#cfn-datasync-locations3-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataSync::LocationSMB":{"Attributes":{"LocationArn":{"PrimitiveType":"String"},"LocationUri":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html","Properties":{"AgentArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-agentarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-domain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MountOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-mountoptions","Required":false,"Type":"MountOptions","UpdateType":"Mutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-password","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerHostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-serverhostname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Subdirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-subdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"User":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-user","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DataSync::StorageSystem":{"Attributes":{"ConnectivityStatus":{"PrimitiveType":"String"},"SecretsManagerArn":{"PrimitiveType":"String"},"StorageSystemArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-storagesystem.html","Properties":{"AgentArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-storagesystem.html#cfn-datasync-storagesystem-agentarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"CloudWatchLogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-storagesystem.html#cfn-datasync-storagesystem-cloudwatchloggrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-storagesystem.html#cfn-datasync-storagesystem-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-storagesystem.html#cfn-datasync-storagesystem-serverconfiguration","Required":true,"Type":"ServerConfiguration","UpdateType":"Mutable"},"ServerCredentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-storagesystem.html#cfn-datasync-storagesystem-servercredentials","Required":false,"Type":"ServerCredentials","UpdateType":"Mutable"},"SystemType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-storagesystem.html#cfn-datasync-storagesystem-systemtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-storagesystem.html#cfn-datasync-storagesystem-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DataSync::Task":{"Attributes":{"DestinationNetworkInterfaceArns":{"PrimitiveItemType":"String","Type":"List"},"SourceNetworkInterfaceArns":{"PrimitiveItemType":"String","Type":"List"},"Status":{"PrimitiveType":"String"},"TaskArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html","Properties":{"CloudWatchLogGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html#cfn-datasync-task-cloudwatchloggrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationLocationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html#cfn-datasync-task-destinationlocationarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Excludes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html#cfn-datasync-task-excludes","DuplicatesAllowed":true,"ItemType":"FilterRule","Required":false,"Type":"List","UpdateType":"Mutable"},"Includes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html#cfn-datasync-task-includes","DuplicatesAllowed":true,"ItemType":"FilterRule","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html#cfn-datasync-task-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html#cfn-datasync-task-options","Required":false,"Type":"Options","UpdateType":"Mutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html#cfn-datasync-task-schedule","Required":false,"Type":"TaskSchedule","UpdateType":"Mutable"},"SourceLocationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html#cfn-datasync-task-sourcelocationarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html#cfn-datasync-task-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Detective::Graph":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-graph.html","Properties":{"AutoEnableMembers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-graph.html#cfn-detective-graph-autoenablemembers","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-graph.html#cfn-detective-graph-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Detective::MemberInvitation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-memberinvitation.html","Properties":{"DisableEmailNotification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-memberinvitation.html#cfn-detective-memberinvitation-disableemailnotification","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"GraphArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-memberinvitation.html#cfn-detective-memberinvitation-grapharn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MemberEmailAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-memberinvitation.html#cfn-detective-memberinvitation-memberemailaddress","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MemberId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-memberinvitation.html#cfn-detective-memberinvitation-memberid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-memberinvitation.html#cfn-detective-memberinvitation-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Detective::OrganizationAdmin":{"Attributes":{"GraphArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-organizationadmin.html","Properties":{"AccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-detective-organizationadmin.html#cfn-detective-organizationadmin-accountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::DevOpsGuru::LogAnomalyDetectionIntegration":{"Attributes":{"AccountId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devopsguru-loganomalydetectionintegration.html","Properties":{}},"AWS::DevOpsGuru::NotificationChannel":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devopsguru-notificationchannel.html","Properties":{"Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devopsguru-notificationchannel.html#cfn-devopsguru-notificationchannel-config","Required":true,"Type":"NotificationChannelConfig","UpdateType":"Immutable"}}},"AWS::DevOpsGuru::ResourceCollection":{"Attributes":{"ResourceCollectionType":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devopsguru-resourcecollection.html","Properties":{"ResourceCollectionFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devopsguru-resourcecollection.html#cfn-devopsguru-resourcecollection-resourcecollectionfilter","Required":true,"Type":"ResourceCollectionFilter","UpdateType":"Mutable"}}},"AWS::DeviceFarm::DevicePool":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-devicepool.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-devicepool.html#cfn-devicefarm-devicepool-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxDevices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-devicepool.html#cfn-devicefarm-devicepool-maxdevices","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-devicepool.html#cfn-devicefarm-devicepool-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProjectArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-devicepool.html#cfn-devicefarm-devicepool-projectarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-devicepool.html#cfn-devicefarm-devicepool-rules","DuplicatesAllowed":true,"ItemType":"Rule","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-devicepool.html#cfn-devicefarm-devicepool-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DeviceFarm::InstanceProfile":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-instanceprofile.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-instanceprofile.html#cfn-devicefarm-instanceprofile-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExcludeAppPackagesFromCleanup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-instanceprofile.html#cfn-devicefarm-instanceprofile-excludeapppackagesfromcleanup","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-instanceprofile.html#cfn-devicefarm-instanceprofile-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PackageCleanup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-instanceprofile.html#cfn-devicefarm-instanceprofile-packagecleanup","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RebootAfterUse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-instanceprofile.html#cfn-devicefarm-instanceprofile-rebootafteruse","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-instanceprofile.html#cfn-devicefarm-instanceprofile-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DeviceFarm::NetworkProfile":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DownlinkBandwidthBits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-downlinkbandwidthbits","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DownlinkDelayMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-downlinkdelayms","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DownlinkJitterMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-downlinkjitterms","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DownlinkLossPercent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-downlinklosspercent","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProjectArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-projectarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UplinkBandwidthBits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-uplinkbandwidthbits","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UplinkDelayMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-uplinkdelayms","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UplinkJitterMs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-uplinkjitterms","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"UplinkLossPercent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-networkprofile.html#cfn-devicefarm-networkprofile-uplinklosspercent","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::DeviceFarm::Project":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-project.html","Properties":{"DefaultJobTimeoutMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-project.html#cfn-devicefarm-project-defaultjobtimeoutminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-project.html#cfn-devicefarm-project-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-project.html#cfn-devicefarm-project-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-project.html#cfn-devicefarm-project-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Mutable"}}},"AWS::DeviceFarm::TestGridProject":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-testgridproject.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-testgridproject.html#cfn-devicefarm-testgridproject-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-testgridproject.html#cfn-devicefarm-testgridproject-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-testgridproject.html#cfn-devicefarm-testgridproject-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-testgridproject.html#cfn-devicefarm-testgridproject-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Mutable"}}},"AWS::DeviceFarm::VPCEConfiguration":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-vpceconfiguration.html","Properties":{"ServiceDnsName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-vpceconfiguration.html#cfn-devicefarm-vpceconfiguration-servicednsname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-vpceconfiguration.html#cfn-devicefarm-vpceconfiguration-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpceConfigurationDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-vpceconfiguration.html#cfn-devicefarm-vpceconfiguration-vpceconfigurationdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpceConfigurationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-vpceconfiguration.html#cfn-devicefarm-vpceconfiguration-vpceconfigurationname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpceServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-devicefarm-vpceconfiguration.html#cfn-devicefarm-vpceconfiguration-vpceservicename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::DirectoryService::MicrosoftAD":{"Attributes":{"Alias":{"PrimitiveType":"String"},"DnsIpAddresses":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-microsoftad.html","Properties":{"CreateAlias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-microsoftad.html#cfn-directoryservice-microsoftad-createalias","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Edition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-microsoftad.html#cfn-directoryservice-microsoftad-edition","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EnableSso":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-microsoftad.html#cfn-directoryservice-microsoftad-enablesso","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-microsoftad.html#cfn-directoryservice-microsoftad-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-microsoftad.html#cfn-directoryservice-microsoftad-password","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ShortName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-microsoftad.html#cfn-directoryservice-microsoftad-shortname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VpcSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-microsoftad.html#cfn-directoryservice-microsoftad-vpcsettings","Required":true,"Type":"VpcSettings","UpdateType":"Immutable"}}},"AWS::DirectoryService::SimpleAD":{"Attributes":{"Alias":{"PrimitiveType":"String"},"DirectoryId":{"PrimitiveType":"String"},"DnsIpAddresses":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-simplead.html","Properties":{"CreateAlias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-simplead.html#cfn-directoryservice-simplead-createalias","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-simplead.html#cfn-directoryservice-simplead-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EnableSso":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-simplead.html#cfn-directoryservice-simplead-enablesso","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-simplead.html#cfn-directoryservice-simplead-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Password":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-simplead.html#cfn-directoryservice-simplead-password","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ShortName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-simplead.html#cfn-directoryservice-simplead-shortname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-simplead.html#cfn-directoryservice-simplead-size","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VpcSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-directoryservice-simplead.html#cfn-directoryservice-simplead-vpcsettings","Required":true,"Type":"VpcSettings","UpdateType":"Immutable"}}},"AWS::DocDB::DBCluster":{"Attributes":{"ClusterResourceId":{"PrimitiveType":"String"},"Endpoint":{"PrimitiveType":"String"},"Port":{"PrimitiveType":"String"},"ReadEndpoint":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html","Properties":{"AvailabilityZones":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-availabilityzones","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"BackupRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-backupretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CopyTagsToSnapshot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-copytagstosnapshot","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DBClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-dbclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBClusterParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-dbclusterparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DBSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-dbsubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeletionProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-deletionprotection","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableCloudwatchLogsExports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-enablecloudwatchlogsexports","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MasterUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-masteruserpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterUsername":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-masterusername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PreferredBackupWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-preferredbackupwindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RestoreToTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-restoretotime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RestoreType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-restoretype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnapshotIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-snapshotidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceDBClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-sourcedbclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StorageEncrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-storageencrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UseLatestRestorableTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-uselatestrestorabletime","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"VpcSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-vpcsecuritygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DocDB::DBClusterParameterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbclusterparametergroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbclusterparametergroup.html#cfn-docdb-dbclusterparametergroup-description","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Family":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbclusterparametergroup.html#cfn-docdb-dbclusterparametergroup-family","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbclusterparametergroup.html#cfn-docdb-dbclusterparametergroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbclusterparametergroup.html#cfn-docdb-dbclusterparametergroup-parameters","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbclusterparametergroup.html#cfn-docdb-dbclusterparametergroup-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DocDB::DBInstance":{"Attributes":{"Endpoint":{"PrimitiveType":"String"},"Port":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbinstance.html","Properties":{"AutoMinorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbinstance.html#cfn-docdb-dbinstance-autominorversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbinstance.html#cfn-docdb-dbinstance-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbinstance.html#cfn-docdb-dbinstance-dbclusteridentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DBInstanceClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbinstance.html#cfn-docdb-dbinstance-dbinstanceclass","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DBInstanceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbinstance.html#cfn-docdb-dbinstance-dbinstanceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EnablePerformanceInsights":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbinstance.html#cfn-docdb-dbinstance-enableperformanceinsights","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbinstance.html#cfn-docdb-dbinstance-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbinstance.html#cfn-docdb-dbinstance-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DocDB::DBSubnetGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbsubnetgroup.html","Properties":{"DBSubnetGroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbsubnetgroup.html#cfn-docdb-dbsubnetgroup-dbsubnetgroupdescription","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DBSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbsubnetgroup.html#cfn-docdb-dbsubnetgroup-dbsubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbsubnetgroup.html#cfn-docdb-dbsubnetgroup-subnetids","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbsubnetgroup.html#cfn-docdb-dbsubnetgroup-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DocDBElastic::Cluster":{"Attributes":{"ClusterArn":{"PrimitiveType":"String"},"ClusterEndpoint":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html","Properties":{"AdminUserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html#cfn-docdbelastic-cluster-adminusername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AdminUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html#cfn-docdbelastic-cluster-adminuserpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html#cfn-docdbelastic-cluster-authtype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html#cfn-docdbelastic-cluster-clustername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html#cfn-docdbelastic-cluster-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html#cfn-docdbelastic-cluster-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ShardCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html#cfn-docdbelastic-cluster-shardcapacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ShardCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html#cfn-docdbelastic-cluster-shardcount","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html#cfn-docdbelastic-cluster-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html#cfn-docdbelastic-cluster-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdbelastic-cluster.html#cfn-docdbelastic-cluster-vpcsecuritygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::DynamoDB::GlobalTable":{"Attributes":{"Arn":{"PrimitiveType":"String"},"StreamArn":{"PrimitiveType":"String"},"TableId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html","Properties":{"AttributeDefinitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html#cfn-dynamodb-globaltable-attributedefinitions","DuplicatesAllowed":false,"ItemType":"AttributeDefinition","Required":true,"Type":"List","UpdateType":"Mutable"},"BillingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html#cfn-dynamodb-globaltable-billingmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlobalSecondaryIndexes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html#cfn-dynamodb-globaltable-globalsecondaryindexes","DuplicatesAllowed":false,"ItemType":"GlobalSecondaryIndex","Required":false,"Type":"List","UpdateType":"Mutable"},"KeySchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html#cfn-dynamodb-globaltable-keyschema","DuplicatesAllowed":false,"ItemType":"KeySchema","Required":true,"Type":"List","UpdateType":"Immutable"},"LocalSecondaryIndexes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html#cfn-dynamodb-globaltable-localsecondaryindexes","DuplicatesAllowed":false,"ItemType":"LocalSecondaryIndex","Required":false,"Type":"List","UpdateType":"Immutable"},"Replicas":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html#cfn-dynamodb-globaltable-replicas","DuplicatesAllowed":false,"ItemType":"ReplicaSpecification","Required":true,"Type":"List","UpdateType":"Mutable"},"SSESpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html#cfn-dynamodb-globaltable-ssespecification","Required":false,"Type":"SSESpecification","UpdateType":"Mutable"},"StreamSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html#cfn-dynamodb-globaltable-streamspecification","Required":false,"Type":"StreamSpecification","UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html#cfn-dynamodb-globaltable-tablename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TimeToLiveSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html#cfn-dynamodb-globaltable-timetolivespecification","Required":false,"Type":"TimeToLiveSpecification","UpdateType":"Mutable"},"WriteProvisionedThroughputSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html#cfn-dynamodb-globaltable-writeprovisionedthroughputsettings","Required":false,"Type":"WriteProvisionedThroughputSettings","UpdateType":"Mutable"}}},"AWS::DynamoDB::Table":{"Attributes":{"Arn":{"PrimitiveType":"String"},"StreamArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html","Properties":{"AttributeDefinitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-attributedefinitions","DuplicatesAllowed":false,"ItemType":"AttributeDefinition","Required":false,"Type":"List","UpdateType":"Mutable"},"BillingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-billingmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ContributorInsightsSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-contributorinsightsspecification","Required":false,"Type":"ContributorInsightsSpecification","UpdateType":"Mutable"},"DeletionProtectionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-deletionprotectionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"GlobalSecondaryIndexes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-globalsecondaryindexes","DuplicatesAllowed":true,"ItemType":"GlobalSecondaryIndex","Required":false,"Type":"List","UpdateType":"Mutable"},"ImportSourceSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-importsourcespecification","Required":false,"Type":"ImportSourceSpecification","UpdateType":"Immutable"},"KeySchema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-keyschema","DuplicatesAllowed":false,"ItemType":"KeySchema","Required":true,"Type":"List","UpdateType":"Immutable"},"KinesisStreamSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-kinesisstreamspecification","Required":false,"Type":"KinesisStreamSpecification","UpdateType":"Mutable"},"LocalSecondaryIndexes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-localsecondaryindexes","DuplicatesAllowed":true,"ItemType":"LocalSecondaryIndex","Required":false,"Type":"List","UpdateType":"Mutable"},"PointInTimeRecoverySpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-pointintimerecoveryspecification","Required":false,"Type":"PointInTimeRecoverySpecification","UpdateType":"Mutable"},"ProvisionedThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-provisionedthroughput","Required":false,"Type":"ProvisionedThroughput","UpdateType":"Mutable"},"SSESpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-ssespecification","Required":false,"Type":"SSESpecification","UpdateType":"Mutable"},"StreamSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-streamspecification","Required":false,"Type":"StreamSpecification","UpdateType":"Mutable"},"TableClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-tableclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-tablename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TimeToLiveSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-timetolivespecification","Required":false,"Type":"TimeToLiveSpecification","UpdateType":"Mutable"}}},"AWS::EC2::CapacityReservation":{"Attributes":{"AvailabilityZone":{"PrimitiveType":"String"},"AvailableInstanceCount":{"PrimitiveType":"Integer"},"Id":{"PrimitiveType":"String"},"InstanceType":{"PrimitiveType":"String"},"Tenancy":{"PrimitiveType":"String"},"TotalInstanceCount":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-availabilityzone","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EbsOptimized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-ebsoptimized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"EndDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-enddate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EndDateType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-enddatetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EphemeralStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-ephemeralstorage","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-instancecount","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"InstanceMatchCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-instancematchcriteria","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstancePlatform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-instanceplatform","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OutPostArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-outpostarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PlacementGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-placementgrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TagSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-tagspecifications","DuplicatesAllowed":true,"ItemType":"TagSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"Tenancy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-tenancy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::CapacityReservationFleet":{"Attributes":{"CapacityReservationFleetId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html","Properties":{"AllocationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-allocationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EndDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-enddate","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceMatchCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-instancematchcriteria","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceTypeSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-instancetypespecifications","DuplicatesAllowed":false,"ItemType":"InstanceTypeSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"NoRemoveEndDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-noremoveenddate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RemoveEndDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-removeenddate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TagSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-tagspecifications","DuplicatesAllowed":true,"ItemType":"TagSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"Tenancy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-tenancy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TotalTargetCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-totaltargetcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::CarrierGateway":{"Attributes":{"CarrierGatewayId":{"PrimitiveType":"String"},"OwnerId":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-carriergateway.html","Properties":{"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-carriergateway.html#cfn-ec2-carriergateway-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-carriergateway.html#cfn-ec2-carriergateway-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::ClientVpnAuthorizationRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnauthorizationrule.html","Properties":{"AccessGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnauthorizationrule.html#cfn-ec2-clientvpnauthorizationrule-accessgroupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AuthorizeAllGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnauthorizationrule.html#cfn-ec2-clientvpnauthorizationrule-authorizeallgroups","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ClientVpnEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnauthorizationrule.html#cfn-ec2-clientvpnauthorizationrule-clientvpnendpointid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnauthorizationrule.html#cfn-ec2-clientvpnauthorizationrule-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TargetNetworkCidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnauthorizationrule.html#cfn-ec2-clientvpnauthorizationrule-targetnetworkcidr","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::ClientVpnEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html","Properties":{"AuthenticationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-authenticationoptions","ItemType":"ClientAuthenticationRequest","Required":true,"Type":"List","UpdateType":"Immutable"},"ClientCidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-clientcidrblock","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ClientConnectOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-clientconnectoptions","Required":false,"Type":"ClientConnectOptions","UpdateType":"Mutable"},"ClientLoginBannerOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-clientloginbanneroptions","Required":false,"Type":"ClientLoginBannerOptions","UpdateType":"Mutable"},"ConnectionLogOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-connectionlogoptions","Required":true,"Type":"ConnectionLogOptions","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DnsServers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-dnsservers","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-securitygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SelfServicePortal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-selfserviceportal","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServerCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-servercertificatearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SessionTimeoutHours":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-sessiontimeouthours","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SplitTunnel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-splittunnel","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TagSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-tagspecifications","ItemType":"TagSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"TransportProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-transportprotocol","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpnPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-vpnport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::ClientVpnRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnroute.html","Properties":{"ClientVpnEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnroute.html#cfn-ec2-clientvpnroute-clientvpnendpointid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnroute.html#cfn-ec2-clientvpnroute-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DestinationCidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnroute.html#cfn-ec2-clientvpnroute-destinationcidrblock","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TargetVpcSubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnroute.html#cfn-ec2-clientvpnroute-targetvpcsubnetid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::ClientVpnTargetNetworkAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpntargetnetworkassociation.html","Properties":{"ClientVpnEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpntargetnetworkassociation.html#cfn-ec2-clientvpntargetnetworkassociation-clientvpnendpointid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpntargetnetworkassociation.html#cfn-ec2-clientvpntargetnetworkassociation-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::CustomerGateway":{"Attributes":{"CustomerGatewayId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-customergateway.html","Properties":{"BgpAsn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-customergateway.html#cfn-ec2-customergateway-bgpasn","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-customergateway.html#cfn-ec2-customergateway-devicename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-customergateway.html#cfn-ec2-customergateway-ipaddress","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-customergateway.html#cfn-ec2-customergateway-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-customergateway.html#cfn-ec2-customergateway-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::DHCPOptions":{"Attributes":{"DhcpOptionsId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-domainname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DomainNameServers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-domainnameservers","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"NetbiosNameServers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-netbiosnameservers","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"NetbiosNodeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-netbiosnodetype","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"NtpServers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-ntpservers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::EC2Fleet":{"Attributes":{"FleetId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html","Properties":{"Context":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-context","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExcessCapacityTerminationPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-excesscapacityterminationpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LaunchTemplateConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-launchtemplateconfigs","DuplicatesAllowed":true,"ItemType":"FleetLaunchTemplateConfigRequest","Required":true,"Type":"List","UpdateType":"Immutable"},"OnDemandOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-ondemandoptions","Required":false,"Type":"OnDemandOptionsRequest","UpdateType":"Immutable"},"ReplaceUnhealthyInstances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-replaceunhealthyinstances","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"SpotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-spotoptions","Required":false,"Type":"SpotOptionsRequest","UpdateType":"Immutable"},"TagSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-tagspecifications","DuplicatesAllowed":true,"ItemType":"TagSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"TargetCapacitySpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-targetcapacityspecification","Required":true,"Type":"TargetCapacitySpecificationRequest","UpdateType":"Mutable"},"TerminateInstancesWithExpiration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-terminateinstanceswithexpiration","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ValidFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-validfrom","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ValidUntil":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ec2fleet.html#cfn-ec2-ec2fleet-validuntil","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EIP":{"Attributes":{"AllocationId":{"PrimitiveType":"String"},"PublicIp":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-eip.html","Properties":{"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-eip.html#cfn-ec2-eip-domain","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-eip.html#cfn-ec2-eip-instanceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkBorderGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-eip.html#cfn-ec2-eip-networkbordergroup","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PublicIpv4Pool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-eip.html#cfn-ec2-eip-publicipv4pool","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-eip.html#cfn-ec2-eip-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransferAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-eip.html#cfn-ec2-eip-transferaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::EIPAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip-association.html","Properties":{"AllocationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip-association.html#cfn-ec2-eipassociation-allocationid","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"EIP":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip-association.html#cfn-ec2-eipassociation-eip","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip-association.html#cfn-ec2-eipassociation-instanceid","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip-association.html#cfn-ec2-eipassociation-networkinterfaceid","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip-association.html#cfn-ec2-eipassociation-PrivateIpAddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::EgressOnlyInternetGateway":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-egressonlyinternetgateway.html","Properties":{"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-egressonlyinternetgateway.html#cfn-ec2-egressonlyinternetgateway-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::EnclaveCertificateIamRoleAssociation":{"Attributes":{"CertificateS3BucketName":{"PrimitiveType":"String"},"CertificateS3ObjectKey":{"PrimitiveType":"String"},"EncryptionKmsKeyId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-enclavecertificateiamroleassociation.html","Properties":{"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-enclavecertificateiamroleassociation.html#cfn-ec2-enclavecertificateiamroleassociation-certificatearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-enclavecertificateiamroleassociation.html#cfn-ec2-enclavecertificateiamroleassociation-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::FlowLog":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html","Properties":{"DeliverLogsPermissionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-deliverlogspermissionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DestinationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-destinationoptions","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"LogDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-logdestination","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LogDestinationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-logdestinationtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LogFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-logformat","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-loggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MaxAggregationInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-maxaggregationinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-resourceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-resourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TrafficType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-traffictype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::GatewayRouteTableAssociation":{"Attributes":{"AssociationId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-gatewayroutetableassociation.html","Properties":{"GatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-gatewayroutetableassociation.html#cfn-ec2-gatewayroutetableassociation-gatewayid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RouteTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-gatewayroutetableassociation.html#cfn-ec2-gatewayroutetableassociation-routetableid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::Host":{"Attributes":{"HostId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-host.html","Properties":{"AutoPlacement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-host.html#cfn-ec2-host-autoplacement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-host.html#cfn-ec2-host-availabilityzone","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"HostMaintenance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-host.html#cfn-ec2-host-hostmaintenance","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostRecovery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-host.html#cfn-ec2-host-hostrecovery","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceFamily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-host.html#cfn-ec2-host-instancefamily","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-host.html#cfn-ec2-host-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OutpostArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-host.html#cfn-ec2-host-outpostarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::IPAM":{"Attributes":{"Arn":{"PrimitiveType":"String"},"IpamId":{"PrimitiveType":"String"},"PrivateDefaultScopeId":{"PrimitiveType":"String"},"PublicDefaultScopeId":{"PrimitiveType":"String"},"ResourceDiscoveryAssociationCount":{"PrimitiveType":"Integer"},"ScopeCount":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html","Properties":{"DefaultResourceDiscoveryAssociationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html#cfn-ec2-ipam-defaultresourcediscoveryassociationid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultResourceDiscoveryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html#cfn-ec2-ipam-defaultresourcediscoveryid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html#cfn-ec2-ipam-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OperatingRegions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html#cfn-ec2-ipam-operatingregions","DuplicatesAllowed":false,"ItemType":"IpamOperatingRegion","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html#cfn-ec2-ipam-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::IPAMAllocation":{"Attributes":{"IpamPoolAllocationId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamallocation.html","Properties":{"Cidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamallocation.html#cfn-ec2-ipamallocation-cidr","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamallocation.html#cfn-ec2-ipamallocation-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IpamPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamallocation.html#cfn-ec2-ipamallocation-ipampoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NetmaskLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamallocation.html#cfn-ec2-ipamallocation-netmasklength","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::IPAMPool":{"Attributes":{"Arn":{"PrimitiveType":"String"},"IpamArn":{"PrimitiveType":"String"},"IpamPoolId":{"PrimitiveType":"String"},"IpamScopeArn":{"PrimitiveType":"String"},"IpamScopeType":{"PrimitiveType":"String"},"PoolDepth":{"PrimitiveType":"Integer"},"State":{"PrimitiveType":"String"},"StateMessage":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html","Properties":{"AddressFamily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-addressfamily","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AllocationDefaultNetmaskLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-allocationdefaultnetmasklength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AllocationMaxNetmaskLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-allocationmaxnetmasklength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AllocationMinNetmaskLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-allocationminnetmasklength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AllocationResourceTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-allocationresourcetags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"AutoImport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-autoimport","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AwsService":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-awsservice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IpamScopeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-ipamscopeid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Locale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-locale","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProvisionedCidrs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-provisionedcidrs","DuplicatesAllowed":false,"ItemType":"ProvisionedCidr","Required":false,"Type":"List","UpdateType":"Mutable"},"PublicIpSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-publicipsource","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PubliclyAdvertisable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-publiclyadvertisable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"SourceIpamPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-sourceipampoolid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::IPAMPoolCidr":{"Attributes":{"IpamPoolCidrId":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampoolcidr.html","Properties":{"Cidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampoolcidr.html#cfn-ec2-ipampoolcidr-cidr","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IpamPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampoolcidr.html#cfn-ec2-ipampoolcidr-ipampoolid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NetmaskLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampoolcidr.html#cfn-ec2-ipampoolcidr-netmasklength","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::IPAMResourceDiscovery":{"Attributes":{"IpamResourceDiscoveryArn":{"PrimitiveType":"String"},"IpamResourceDiscoveryId":{"PrimitiveType":"String"},"IpamResourceDiscoveryRegion":{"PrimitiveType":"String"},"IsDefault":{"PrimitiveType":"Boolean"},"OwnerId":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamresourcediscovery.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamresourcediscovery.html#cfn-ec2-ipamresourcediscovery-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OperatingRegions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamresourcediscovery.html#cfn-ec2-ipamresourcediscovery-operatingregions","DuplicatesAllowed":false,"ItemType":"IpamOperatingRegion","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamresourcediscovery.html#cfn-ec2-ipamresourcediscovery-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::IPAMResourceDiscoveryAssociation":{"Attributes":{"IpamArn":{"PrimitiveType":"String"},"IpamRegion":{"PrimitiveType":"String"},"IpamResourceDiscoveryAssociationArn":{"PrimitiveType":"String"},"IpamResourceDiscoveryAssociationId":{"PrimitiveType":"String"},"IsDefault":{"PrimitiveType":"Boolean"},"OwnerId":{"PrimitiveType":"String"},"ResourceDiscoveryStatus":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamresourcediscoveryassociation.html","Properties":{"IpamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamresourcediscoveryassociation.html#cfn-ec2-ipamresourcediscoveryassociation-ipamid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IpamResourceDiscoveryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamresourcediscoveryassociation.html#cfn-ec2-ipamresourcediscoveryassociation-ipamresourcediscoveryid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamresourcediscoveryassociation.html#cfn-ec2-ipamresourcediscoveryassociation-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::IPAMScope":{"Attributes":{"Arn":{"PrimitiveType":"String"},"IpamArn":{"PrimitiveType":"String"},"IpamScopeId":{"PrimitiveType":"String"},"IpamScopeType":{"PrimitiveType":"String"},"IsDefault":{"PrimitiveType":"Boolean"},"PoolCount":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamscope.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamscope.html#cfn-ec2-ipamscope-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IpamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamscope.html#cfn-ec2-ipamscope-ipamid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamscope.html#cfn-ec2-ipamscope-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::Instance":{"Attributes":{"AvailabilityZone":{"PrimitiveType":"String"},"PrivateDnsName":{"PrimitiveType":"String"},"PrivateIp":{"PrimitiveType":"String"},"PublicDnsName":{"PrimitiveType":"String"},"PublicIp":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html","Properties":{"AdditionalInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-additionalinfo","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Affinity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-affinity","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BlockDeviceMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-blockdevicemappings","DuplicatesAllowed":true,"ItemType":"BlockDeviceMapping","Required":false,"Type":"List","UpdateType":"Conditional"},"CpuOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-cpuoptions","Required":false,"Type":"CpuOptions","UpdateType":"Immutable"},"CreditSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-creditspecification","Required":false,"Type":"CreditSpecification","UpdateType":"Mutable"},"DisableApiTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-disableapitermination","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EbsOptimized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ebsoptimized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Conditional"},"ElasticGpuSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-elasticgpuspecifications","DuplicatesAllowed":false,"ItemType":"ElasticGpuSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"ElasticInferenceAccelerators":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-elasticinferenceaccelerators","DuplicatesAllowed":false,"ItemType":"ElasticInferenceAccelerator","Required":false,"Type":"List","UpdateType":"Immutable"},"EnclaveOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-enclaveoptions","Required":false,"Type":"EnclaveOptions","UpdateType":"Immutable"},"HibernationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-hibernationoptions","Required":false,"Type":"HibernationOptions","UpdateType":"Immutable"},"HostId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-hostid","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"HostResourceGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-hostresourcegrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IamInstanceProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-iaminstanceprofile","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-imageid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceInitiatedShutdownBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instanceinitiatedshutdownbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Ipv6AddressCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ipv6addresscount","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Ipv6Addresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ipv6addresses","DuplicatesAllowed":true,"ItemType":"InstanceIpv6Address","Required":false,"Type":"List","UpdateType":"Immutable"},"KernelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-kernelid","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"KeyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-keyname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LaunchTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-launchtemplate","Required":false,"Type":"LaunchTemplateSpecification","UpdateType":"Immutable"},"LicenseSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-licensespecifications","DuplicatesAllowed":false,"ItemType":"LicenseSpecification","Required":false,"Type":"List","UpdateType":"Immutable"},"Monitoring":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-monitoring","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NetworkInterfaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-networkinterfaces","DuplicatesAllowed":true,"ItemType":"NetworkInterface","Required":false,"Type":"List","UpdateType":"Immutable"},"PlacementGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-placementgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PrivateDnsNameOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-privatednsnameoptions","Required":false,"Type":"PrivateDnsNameOptions","UpdateType":"Conditional"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-privateipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PropagateTagsToVolumeOnCreation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-propagatetagstovolumeoncreation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RamdiskId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ramdiskid","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Conditional"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SourceDestCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-sourcedestcheck","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SsmAssociations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ssmassociations","DuplicatesAllowed":true,"ItemType":"SsmAssociation","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Tenancy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-tenancy","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"UserData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-userdata","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Volumes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-volumes","DuplicatesAllowed":true,"ItemType":"Volume","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::InternetGateway":{"Attributes":{"InternetGatewayId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html","Properties":{"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html#cfn-ec2-internetgateway-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::KeyPair":{"Attributes":{"KeyFingerprint":{"PrimitiveType":"String"},"KeyPairId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-keypair.html","Properties":{"KeyFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-keypair.html#cfn-ec2-keypair-keyformat","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KeyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-keypair.html#cfn-ec2-keypair-keyname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KeyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-keypair.html#cfn-ec2-keypair-keytype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PublicKeyMaterial":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-keypair.html#cfn-ec2-keypair-publickeymaterial","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-keypair.html#cfn-ec2-keypair-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::LaunchTemplate":{"Attributes":{"DefaultVersionNumber":{"PrimitiveType":"String"},"LatestVersionNumber":{"PrimitiveType":"String"},"LaunchTemplateId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html","Properties":{"LaunchTemplateData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#cfn-ec2-launchtemplate-launchtemplatedata","Required":true,"Type":"LaunchTemplateData","UpdateType":"Mutable"},"LaunchTemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#cfn-ec2-launchtemplate-launchtemplatename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TagSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#cfn-ec2-launchtemplate-tagspecifications","DuplicatesAllowed":true,"ItemType":"LaunchTemplateTagSpecification","Required":false,"Type":"List","UpdateType":"Mutable"},"VersionDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#cfn-ec2-launchtemplate-versiondescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LocalGatewayRoute":{"Attributes":{"State":{"PrimitiveType":"String"},"Type":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html","Properties":{"DestinationCidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html#cfn-ec2-localgatewayroute-destinationcidrblock","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LocalGatewayRouteTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html#cfn-ec2-localgatewayroute-localgatewayroutetableid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LocalGatewayVirtualInterfaceGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html#cfn-ec2-localgatewayroute-localgatewayvirtualinterfacegroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html#cfn-ec2-localgatewayroute-networkinterfaceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::LocalGatewayRouteTable":{"Attributes":{"LocalGatewayRouteTableArn":{"PrimitiveType":"String"},"LocalGatewayRouteTableId":{"PrimitiveType":"String"},"OutpostArn":{"PrimitiveType":"String"},"OwnerId":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetable.html","Properties":{"LocalGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetable.html#cfn-ec2-localgatewayroutetable-localgatewayid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Mode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetable.html#cfn-ec2-localgatewayroutetable-mode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetable.html#cfn-ec2-localgatewayroutetable-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::LocalGatewayRouteTableVPCAssociation":{"Attributes":{"LocalGatewayId":{"PrimitiveType":"String"},"LocalGatewayRouteTableVpcAssociationId":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html","Properties":{"LocalGatewayRouteTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html#cfn-ec2-localgatewayroutetablevpcassociation-localgatewayroutetableid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html#cfn-ec2-localgatewayroutetablevpcassociation-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html#cfn-ec2-localgatewayroutetablevpcassociation-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::LocalGatewayRouteTableVirtualInterfaceGroupAssociation":{"Attributes":{"LocalGatewayId":{"PrimitiveType":"String"},"LocalGatewayRouteTableArn":{"PrimitiveType":"String"},"LocalGatewayRouteTableVirtualInterfaceGroupAssociationId":{"PrimitiveType":"String"},"OwnerId":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevirtualinterfacegroupassociation.html","Properties":{"LocalGatewayRouteTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevirtualinterfacegroupassociation.html#cfn-ec2-localgatewayroutetablevirtualinterfacegroupassociation-localgatewayroutetableid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LocalGatewayVirtualInterfaceGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevirtualinterfacegroupassociation.html#cfn-ec2-localgatewayroutetablevirtualinterfacegroupassociation-localgatewayvirtualinterfacegroupid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevirtualinterfacegroupassociation.html#cfn-ec2-localgatewayroutetablevirtualinterfacegroupassociation-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::NatGateway":{"Attributes":{"NatGatewayId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html","Properties":{"AllocationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-allocationid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConnectivityType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-connectivitytype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MaxDrainDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-maxdraindurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-privateipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecondaryAllocationIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-secondaryallocationids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SecondaryPrivateIpAddressCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-secondaryprivateipaddresscount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SecondaryPrivateIpAddresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-secondaryprivateipaddresses","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::NetworkAcl":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkacl.html","Properties":{"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkacl.html#cfn-ec2-networkacl-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkacl.html#cfn-ec2-networkacl-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::NetworkAclEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html","Properties":{"CidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-cidrblock","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Egress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-egress","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Icmp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-icmp","Required":false,"Type":"Icmp","UpdateType":"Mutable"},"Ipv6CidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-ipv6cidrblock","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkAclId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-networkaclid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-portrange","Required":false,"Type":"PortRange","UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-protocol","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"RuleAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-ruleaction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RuleNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-rulenumber","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::NetworkInsightsAccessScope":{"Attributes":{"CreatedDate":{"PrimitiveType":"String"},"NetworkInsightsAccessScopeArn":{"PrimitiveType":"String"},"NetworkInsightsAccessScopeId":{"PrimitiveType":"String"},"UpdatedDate":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscope.html","Properties":{"ExcludePaths":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscope.html#cfn-ec2-networkinsightsaccessscope-excludepaths","DuplicatesAllowed":true,"ItemType":"AccessScopePathRequest","Required":false,"Type":"List","UpdateType":"Immutable"},"MatchPaths":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscope.html#cfn-ec2-networkinsightsaccessscope-matchpaths","DuplicatesAllowed":true,"ItemType":"AccessScopePathRequest","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscope.html#cfn-ec2-networkinsightsaccessscope-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAccessScopeAnalysis":{"Attributes":{"AnalyzedEniCount":{"PrimitiveType":"Integer"},"EndDate":{"PrimitiveType":"String"},"FindingsFound":{"PrimitiveType":"String"},"NetworkInsightsAccessScopeAnalysisArn":{"PrimitiveType":"String"},"NetworkInsightsAccessScopeAnalysisId":{"PrimitiveType":"String"},"StartDate":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"StatusMessage":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscopeanalysis.html","Properties":{"NetworkInsightsAccessScopeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscopeanalysis.html#cfn-ec2-networkinsightsaccessscopeanalysis-networkinsightsaccessscopeid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscopeanalysis.html#cfn-ec2-networkinsightsaccessscopeanalysis-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsAnalysis":{"Attributes":{"AlternatePathHints":{"ItemType":"AlternatePathHint","Type":"List"},"Explanations":{"ItemType":"Explanation","Type":"List"},"ForwardPathComponents":{"ItemType":"PathComponent","Type":"List"},"NetworkInsightsAnalysisArn":{"PrimitiveType":"String"},"NetworkInsightsAnalysisId":{"PrimitiveType":"String"},"NetworkPathFound":{"PrimitiveType":"Boolean"},"ReturnPathComponents":{"ItemType":"PathComponent","Type":"List"},"StartDate":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"StatusMessage":{"PrimitiveType":"String"},"SuggestedAccounts":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html","Properties":{"AdditionalAccounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html#cfn-ec2-networkinsightsanalysis-additionalaccounts","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"FilterInArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html#cfn-ec2-networkinsightsanalysis-filterinarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"NetworkInsightsPathId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html#cfn-ec2-networkinsightsanalysis-networkinsightspathid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html#cfn-ec2-networkinsightsanalysis-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::NetworkInsightsPath":{"Attributes":{"CreatedDate":{"PrimitiveType":"String"},"DestinationArn":{"PrimitiveType":"String"},"NetworkInsightsPathArn":{"PrimitiveType":"String"},"NetworkInsightsPathId":{"PrimitiveType":"String"},"SourceArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-destination","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DestinationIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-destinationip","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DestinationPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-destinationport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"FilterAtDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-filteratdestination","Required":false,"Type":"PathFilter","UpdateType":"Immutable"},"FilterAtSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-filteratsource","Required":false,"Type":"PathFilter","UpdateType":"Immutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-source","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SourceIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-sourceip","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::NetworkInterface":{"Attributes":{"Id":{"PrimitiveType":"String"},"PrimaryPrivateIpAddress":{"PrimitiveType":"String"},"SecondaryPrivateIpAddresses":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GroupSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-groupset","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"InterfaceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-interfacetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Ipv6AddressCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-ipv6addresscount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Ipv6Addresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-ipv6addresses","DuplicatesAllowed":false,"ItemType":"InstanceIpv6Address","Required":false,"Type":"List","UpdateType":"Mutable"},"PrivateIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-privateipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PrivateIpAddresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-privateipaddresses","DuplicatesAllowed":true,"ItemType":"PrivateIpAddressSpecification","Required":false,"Type":"List","UpdateType":"Conditional"},"SecondaryPrivateIpAddressCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-secondaryprivateipaddresscount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SourceDestCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-sourcedestcheck","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::NetworkInterfaceAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html","Properties":{"DeleteOnTermination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-deleteonterm","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DeviceIndex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-deviceindex","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-instanceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-networkinterfaceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::NetworkInterfacePermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html","Properties":{"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html#cfn-ec2-networkinterfacepermission-awsaccountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html#cfn-ec2-networkinterfacepermission-networkinterfaceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Permission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html#cfn-ec2-networkinterfacepermission-permission","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::NetworkPerformanceMetricSubscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkperformancemetricsubscription.html","Properties":{"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkperformancemetricsubscription.html#cfn-ec2-networkperformancemetricsubscription-destination","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Metric":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkperformancemetricsubscription.html#cfn-ec2-networkperformancemetricsubscription-metric","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkperformancemetricsubscription.html#cfn-ec2-networkperformancemetricsubscription-source","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Statistic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkperformancemetricsubscription.html#cfn-ec2-networkperformancemetricsubscription-statistic","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::PlacementGroup":{"Attributes":{"GroupName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-placementgroup.html","Properties":{"PartitionCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-placementgroup.html#cfn-ec2-placementgroup-partitioncount","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SpreadLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-placementgroup.html#cfn-ec2-placementgroup-spreadlevel","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Strategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-placementgroup.html#cfn-ec2-placementgroup-strategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-placementgroup.html#cfn-ec2-placementgroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::PrefixList":{"Attributes":{"Arn":{"PrimitiveType":"String"},"OwnerId":{"PrimitiveType":"String"},"PrefixListId":{"PrimitiveType":"String"},"Version":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html","Properties":{"AddressFamily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-addressfamily","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Entries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-entries","DuplicatesAllowed":true,"ItemType":"Entry","Required":false,"Type":"List","UpdateType":"Mutable"},"MaxEntries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-maxentries","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"PrefixListName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-prefixlistname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::Route":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html","Properties":{"CarrierGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-carriergatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationCidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-destinationcidrblock","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DestinationIpv6CidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-destinationipv6cidrblock","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EgressOnlyInternetGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-egressonlyinternetgatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-gatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-instanceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LocalGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-localgatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NatGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-natgatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-networkinterfaceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RouteTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-routetableid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TransitGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-transitgatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-vpcendpointid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcPeeringConnectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-vpcpeeringconnectionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::RouteTable":{"Attributes":{"RouteTableId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-routetable.html","Properties":{"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-routetable.html#cfn-ec2-routetable-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-routetable.html#cfn-ec2-routetable-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::SecurityGroup":{"Attributes":{"GroupId":{"PrimitiveType":"String"},"VpcId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html","Properties":{"GroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-groupdescription","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-groupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityGroupEgress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-securitygroupegress","DuplicatesAllowed":true,"ItemType":"Egress","Required":false,"ScrutinyType":"EgressRules","Type":"List","UpdateType":"Mutable"},"SecurityGroupIngress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-securitygroupingress","DuplicatesAllowed":true,"ItemType":"Ingress","Required":false,"ScrutinyType":"IngressRules","Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::SecurityGroupEgress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html","Properties":{"CidrIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-cidrip","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CidrIpv6":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-cidripv6","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationPrefixListId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-destinationprefixlistid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DestinationSecurityGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-destinationsecuritygroupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FromPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-fromport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"GroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-groupid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IpProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-ipprotocol","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ToPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-toport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}},"ScrutinyType":"EgressRuleResource"},"AWS::EC2::SecurityGroupIngress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html","Properties":{"CidrIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-cidrip","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CidrIpv6":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-cidripv6","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FromPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-fromport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"GroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-groupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-groupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IpProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-ipprotocol","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SourcePrefixListId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-securitygroupingress-sourceprefixlistid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceSecurityGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-sourcesecuritygroupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceSecurityGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-sourcesecuritygroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceSecurityGroupOwnerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-sourcesecuritygroupownerid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ToPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-toport","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}},"ScrutinyType":"IngressRuleResource"},"AWS::EC2::SpotFleet":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-spotfleet.html","Properties":{"SpotFleetRequestConfigData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-spotfleet.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata","Required":true,"Type":"SpotFleetRequestConfigData","UpdateType":"Mutable"}}},"AWS::EC2::Subnet":{"Attributes":{"AvailabilityZone":{"PrimitiveType":"String"},"AvailabilityZoneId":{"PrimitiveType":"String"},"CidrBlock":{"PrimitiveType":"String"},"Ipv6CidrBlocks":{"PrimitiveItemType":"String","Type":"List"},"NetworkAclAssociationId":{"PrimitiveType":"String"},"OutpostArn":{"PrimitiveType":"String"},"SubnetId":{"PrimitiveType":"String"},"VpcId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html","Properties":{"AssignIpv6AddressOnCreation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-assignipv6addressoncreation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AvailabilityZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-availabilityzoneid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-cidrblock","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EnableDns64":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-enabledns64","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Ipv6CidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-ipv6cidrblock","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Ipv6Native":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-ipv6native","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"MapPublicIpOnLaunch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-mappubliciponlaunch","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"OutpostArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-outpostarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PrivateDnsNameOptionsOnLaunch":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-privatednsnameoptionsonlaunch","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::SubnetCidrBlock":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetcidrblock.html","Properties":{"Ipv6CidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetcidrblock.html#cfn-ec2-subnetcidrblock-ipv6cidrblock","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetcidrblock.html#cfn-ec2-subnetcidrblock-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::SubnetNetworkAclAssociation":{"Attributes":{"AssociationId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-network-acl-assoc.html","Properties":{"NetworkAclId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-network-acl-assoc.html#cfn-ec2-subnetnetworkaclassociation-networkaclid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-network-acl-assoc.html#cfn-ec2-subnetnetworkaclassociation-associationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::SubnetRouteTableAssociation":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetroutetableassociation.html","Properties":{"RouteTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetroutetableassociation.html#cfn-ec2-subnetroutetableassociation-routetableid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetroutetableassociation.html#cfn-ec2-subnetroutetableassociation-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TrafficMirrorFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html#cfn-ec2-trafficmirrorfilter-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NetworkServices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html#cfn-ec2-trafficmirrorfilter-networkservices","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html#cfn-ec2-trafficmirrorfilter-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::TrafficMirrorFilterRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationCidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-destinationcidrblock","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DestinationPortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-destinationportrange","Required":false,"Type":"TrafficMirrorPortRange","UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-protocol","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RuleAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-ruleaction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RuleNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-rulenumber","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"SourceCidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-sourcecidrblock","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourcePortRange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-sourceportrange","Required":false,"Type":"TrafficMirrorPortRange","UpdateType":"Mutable"},"TrafficDirection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-trafficdirection","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TrafficMirrorFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-trafficmirrorfilterid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TrafficMirrorSession":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-networkinterfaceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PacketLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-packetlength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SessionNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-sessionnumber","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TrafficMirrorFilterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-trafficmirrorfilterid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TrafficMirrorTargetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-trafficmirrortargetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VirtualNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-virtualnetworkid","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::TrafficMirrorTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GatewayLoadBalancerEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-gatewayloadbalancerendpointid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-networkinterfaceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NetworkLoadBalancerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-networkloadbalancerarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::TransitGateway":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html","Properties":{"AmazonSideAsn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-amazonsideasn","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"AssociationDefaultRouteTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-associationdefaultroutetableid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AutoAcceptSharedAttachments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-autoacceptsharedattachments","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultRouteTableAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-defaultroutetableassociation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultRouteTablePropagation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-defaultroutetablepropagation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DnsSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-dnssupport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MulticastSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-multicastsupport","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PropagationDefaultRouteTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-propagationdefaultroutetableid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransitGatewayCidrBlocks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-transitgatewaycidrblocks","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VpnEcmpSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-vpnecmpsupport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::TransitGatewayAttachment":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html","Properties":{"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-options","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransitGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-transitgatewayid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayConnect":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"},"TransitGatewayAttachmentId":{"PrimitiveType":"String"},"TransitGatewayId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html","Properties":{"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html#cfn-ec2-transitgatewayconnect-options","Required":true,"Type":"TransitGatewayConnectOptions","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html#cfn-ec2-transitgatewayconnect-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransportTransitGatewayAttachmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html#cfn-ec2-transitgatewayconnect-transporttransitgatewayattachmentid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayMulticastDomain":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"},"TransitGatewayMulticastDomainArn":{"PrimitiveType":"String"},"TransitGatewayMulticastDomainId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html","Properties":{"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html#cfn-ec2-transitgatewaymulticastdomain-options","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html#cfn-ec2-transitgatewaymulticastdomain-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransitGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html#cfn-ec2-transitgatewaymulticastdomain-transitgatewayid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayMulticastDomainAssociation":{"Attributes":{"ResourceId":{"PrimitiveType":"String"},"ResourceType":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html","Properties":{"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html#cfn-ec2-transitgatewaymulticastdomainassociation-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TransitGatewayAttachmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html#cfn-ec2-transitgatewaymulticastdomainassociation-transitgatewayattachmentid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TransitGatewayMulticastDomainId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html#cfn-ec2-transitgatewaymulticastdomainassociation-transitgatewaymulticastdomainid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayMulticastGroupMember":{"Attributes":{"GroupMember":{"PrimitiveType":"Boolean"},"GroupSource":{"PrimitiveType":"Boolean"},"MemberType":{"PrimitiveType":"String"},"ResourceId":{"PrimitiveType":"String"},"ResourceType":{"PrimitiveType":"String"},"SourceType":{"PrimitiveType":"String"},"SubnetId":{"PrimitiveType":"String"},"TransitGatewayAttachmentId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html","Properties":{"GroupIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html#cfn-ec2-transitgatewaymulticastgroupmember-groupipaddress","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html#cfn-ec2-transitgatewaymulticastgroupmember-networkinterfaceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TransitGatewayMulticastDomainId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html#cfn-ec2-transitgatewaymulticastgroupmember-transitgatewaymulticastdomainid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayMulticastGroupSource":{"Attributes":{"GroupMember":{"PrimitiveType":"Boolean"},"GroupSource":{"PrimitiveType":"Boolean"},"MemberType":{"PrimitiveType":"String"},"ResourceId":{"PrimitiveType":"String"},"ResourceType":{"PrimitiveType":"String"},"SourceType":{"PrimitiveType":"String"},"SubnetId":{"PrimitiveType":"String"},"TransitGatewayAttachmentId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html","Properties":{"GroupIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html#cfn-ec2-transitgatewaymulticastgroupsource-groupipaddress","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NetworkInterfaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html#cfn-ec2-transitgatewaymulticastgroupsource-networkinterfaceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TransitGatewayMulticastDomainId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html#cfn-ec2-transitgatewaymulticastgroupsource-transitgatewaymulticastdomainid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayPeeringAttachment":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"},"Status":{"Type":"PeeringAttachmentStatus"},"Status.Code":{"PrimitiveType":"String"},"Status.Message":{"PrimitiveType":"String"},"TransitGatewayAttachmentId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html","Properties":{"PeerAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-peeraccountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PeerRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-peerregion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PeerTransitGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-peertransitgatewayid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransitGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-transitgatewayid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html","Properties":{"Blackhole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-blackhole","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DestinationCidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-destinationcidrblock","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TransitGatewayAttachmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-transitgatewayattachmentid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TransitGatewayRouteTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-transitgatewayroutetableid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayRouteTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetable.html","Properties":{"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetable.html#cfn-ec2-transitgatewayroutetable-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"TransitGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetable.html#cfn-ec2-transitgatewayroutetable-transitgatewayid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayRouteTableAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetableassociation.html","Properties":{"TransitGatewayAttachmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetableassociation.html#cfn-ec2-transitgatewayroutetableassociation-transitgatewayattachmentid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TransitGatewayRouteTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetableassociation.html#cfn-ec2-transitgatewayroutetableassociation-transitgatewayroutetableid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayRouteTablePropagation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetablepropagation.html","Properties":{"TransitGatewayAttachmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetablepropagation.html#cfn-ec2-transitgatewayroutetablepropagation-transitgatewayattachmentid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TransitGatewayRouteTableId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetablepropagation.html#cfn-ec2-transitgatewayroutetablepropagation-transitgatewayroutetableid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::TransitGatewayVpcAttachment":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html","Properties":{"AddSubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-addsubnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-options","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"RemoveSubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-removesubnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransitGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-transitgatewayid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::VPC":{"Attributes":{"CidrBlock":{"PrimitiveType":"String"},"CidrBlockAssociations":{"PrimitiveItemType":"String","Type":"List"},"DefaultNetworkAcl":{"PrimitiveType":"String"},"DefaultSecurityGroup":{"PrimitiveType":"String"},"Ipv6CidrBlocks":{"PrimitiveItemType":"String","Type":"List"},"VpcId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html","Properties":{"CidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-ec2-vpc-cidrblock","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EnableDnsHostnames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-ec2-vpc-enablednshostnames","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableDnsSupport":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-ec2-vpc-enablednssupport","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InstanceTenancy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-ec2-vpc-instancetenancy","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Ipv4IpamPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-ec2-vpc-ipv4ipampoolid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Ipv4NetmaskLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-ec2-vpc-ipv4netmasklength","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-ec2-vpc-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::VPCCidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html","Properties":{"AmazonProvidedIpv6CidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-amazonprovidedipv6cidrblock","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"CidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-cidrblock","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Ipv4IpamPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv4ipampoolid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Ipv4NetmaskLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv4netmasklength","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Ipv6CidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv6cidrblock","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Ipv6IpamPoolId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv6ipampoolid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Ipv6NetmaskLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv6netmasklength","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Ipv6Pool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv6pool","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::VPCDHCPOptionsAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcdhcpoptionsassociation.html","Properties":{"DhcpOptionsId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcdhcpoptionsassociation.html#cfn-ec2-vpcdhcpoptionsassociation-dhcpoptionsid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcdhcpoptionsassociation.html#cfn-ec2-vpcdhcpoptionsassociation-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::VPCEndpoint":{"Attributes":{"CreationTimestamp":{"PrimitiveType":"String"},"DnsEntries":{"PrimitiveItemType":"String","Type":"List"},"Id":{"PrimitiveType":"String"},"NetworkInterfaceIds":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html","Properties":{"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-policydocument","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"PrivateDnsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-privatednsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RouteTableIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-routetableids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-securitygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-servicename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcEndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-vpcendpointtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::VPCEndpointConnectionNotification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html","Properties":{"ConnectionEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-connectionevents","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"ConnectionNotificationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-connectionnotificationarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServiceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-serviceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VPCEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-vpcendpointid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::VPCEndpointService":{"Attributes":{"ServiceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html","Properties":{"AcceptanceRequired":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-acceptancerequired","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ContributorInsightsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-contributorinsightsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"GatewayLoadBalancerArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-gatewayloadbalancerarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"NetworkLoadBalancerArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-networkloadbalancerarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PayerResponsibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-payerresponsibility","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::VPCEndpointServicePermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservicepermissions.html","Properties":{"AllowedPrincipals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservicepermissions.html#cfn-ec2-vpcendpointservicepermissions-allowedprincipals","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ServiceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservicepermissions.html#cfn-ec2-vpcendpointservicepermissions-serviceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::VPCGatewayAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html","Properties":{"InternetGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html#cfn-ec2-vpcgatewayattachment-internetgatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html#cfn-ec2-vpcgatewayattachment-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"VpnGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html#cfn-ec2-vpcgatewayattachment-vpngatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::VPCPeeringConnection":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html","Properties":{"PeerOwnerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peerownerid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PeerRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peerregion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PeerRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peerrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PeerVpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peervpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::VPNConnection":{"Attributes":{"VpnConnectionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnection.html","Properties":{"CustomerGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnection.html#cfn-ec2-vpnconnection-customergatewayid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StaticRoutesOnly":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnection.html#cfn-ec2-vpnconnection-staticroutesonly","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnection.html#cfn-ec2-vpnconnection-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransitGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnection.html#cfn-ec2-vpnconnection-transitgatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnection.html#cfn-ec2-vpnconnection-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VpnGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnection.html#cfn-ec2-vpnconnection-vpngatewayid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VpnTunnelOptionsSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnection.html#cfn-ec2-vpnconnection-vpntunneloptionsspecifications","DuplicatesAllowed":true,"ItemType":"VpnTunnelOptionsSpecification","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::EC2::VPNConnectionRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnectionroute.html","Properties":{"DestinationCidrBlock":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnectionroute.html#cfn-ec2-vpnconnectionroute-destinationcidrblock","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VpnConnectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpnconnectionroute.html#cfn-ec2-vpnconnectionroute-vpnconnectionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::VPNGateway":{"Attributes":{"VPNGatewayId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpngateway.html","Properties":{"AmazonSideAsn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpngateway.html#cfn-ec2-vpngateway-amazonsideasn","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpngateway.html#cfn-ec2-vpngateway-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpngateway.html#cfn-ec2-vpngateway-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EC2::VPNGatewayRoutePropagation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gatewayrouteprop.html","Properties":{"RouteTableIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gatewayrouteprop.html#cfn-ec2-vpngatewayrouteprop-routetableids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"VpnGatewayId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gatewayrouteprop.html#cfn-ec2-vpngatewayrouteprop-vpngatewayid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::VerifiedAccessEndpoint":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"DeviceValidationDomain":{"PrimitiveType":"String"},"EndpointDomain":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"VerifiedAccessEndpointId":{"PrimitiveType":"String"},"VerifiedAccessInstanceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html","Properties":{"ApplicationDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-applicationdomain","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AttachmentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-attachmenttype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-domaincertificatearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EndpointDomainPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-endpointdomainprefix","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-endpointtype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LoadBalancerOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-loadbalanceroptions","Required":false,"Type":"LoadBalancerOptions","UpdateType":"Mutable"},"NetworkInterfaceOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-networkinterfaceoptions","Required":false,"Type":"NetworkInterfaceOptions","UpdateType":"Mutable"},"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-policydocument","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PolicyEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-policyenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-securitygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VerifiedAccessGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessendpoint.html#cfn-ec2-verifiedaccessendpoint-verifiedaccessgroupid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::VerifiedAccessGroup":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"},"Owner":{"PrimitiveType":"String"},"VerifiedAccessGroupArn":{"PrimitiveType":"String"},"VerifiedAccessGroupId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessgroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessgroup.html#cfn-ec2-verifiedaccessgroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessgroup.html#cfn-ec2-verifiedaccessgroup-policydocument","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PolicyEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessgroup.html#cfn-ec2-verifiedaccessgroup-policyenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessgroup.html#cfn-ec2-verifiedaccessgroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VerifiedAccessInstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessgroup.html#cfn-ec2-verifiedaccessgroup-verifiedaccessinstanceid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::EC2::VerifiedAccessInstance":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"},"VerifiedAccessInstanceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessinstance.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessinstance.html#cfn-ec2-verifiedaccessinstance-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoggingConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessinstance.html#cfn-ec2-verifiedaccessinstance-loggingconfigurations","Required":false,"Type":"VerifiedAccessLogs","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessinstance.html#cfn-ec2-verifiedaccessinstance-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VerifiedAccessTrustProviderIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessinstance.html#cfn-ec2-verifiedaccessinstance-verifiedaccesstrustproviderids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VerifiedAccessTrustProviders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccessinstance.html#cfn-ec2-verifiedaccessinstance-verifiedaccesstrustproviders","DuplicatesAllowed":false,"ItemType":"VerifiedAccessTrustProvider","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EC2::VerifiedAccessTrustProvider":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"},"VerifiedAccessTrustProviderId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccesstrustprovider.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccesstrustprovider-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccesstrustprovider-deviceoptions","Required":false,"Type":"DeviceOptions","UpdateType":"Immutable"},"DeviceTrustProviderType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccesstrustprovider-devicetrustprovidertype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OidcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccesstrustprovider-oidcoptions","Required":false,"Type":"OidcOptions","UpdateType":"Mutable"},"PolicyReferenceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccesstrustprovider-policyreferencename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccesstrustprovider-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TrustProviderType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccesstrustprovider-trustprovidertype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UserTrustProviderType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-verifiedaccesstrustprovider.html#cfn-ec2-verifiedaccesstrustprovider-usertrustprovidertype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EC2::Volume":{"Attributes":{"VolumeId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html","Properties":{"AutoEnableIO":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-autoenableio","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-availabilityzone","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-encrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MultiAttachEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-multiattachenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"OutpostArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-outpostarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Size":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-size","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SnapshotId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-snapshotid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Throughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-throughput","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#cfn-ec2-volume-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EC2::VolumeAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volumeattachment.html","Properties":{"Device":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volumeattachment.html#cfn-ec2-volumeattachment-device","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volumeattachment.html#cfn-ec2-volumeattachment-instanceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VolumeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volumeattachment.html#cfn-ec2-volumeattachment-volumeid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ECR::PublicRepository":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-publicrepository.html","Properties":{"RepositoryCatalogData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-publicrepository.html#cfn-ecr-publicrepository-repositorycatalogdata","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"RepositoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-publicrepository.html#cfn-ecr-publicrepository-repositoryname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RepositoryPolicyText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-publicrepository.html#cfn-ecr-publicrepository-repositorypolicytext","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-publicrepository.html#cfn-ecr-publicrepository-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ECR::PullThroughCacheRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-pullthroughcacherule.html","Properties":{"EcrRepositoryPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-pullthroughcacherule.html#cfn-ecr-pullthroughcacherule-ecrrepositoryprefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"UpstreamRegistryUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-pullthroughcacherule.html#cfn-ecr-pullthroughcacherule-upstreamregistryurl","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ECR::RegistryPolicy":{"Attributes":{"RegistryId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-registrypolicy.html","Properties":{"PolicyText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-registrypolicy.html#cfn-ecr-registrypolicy-policytext","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::ECR::ReplicationConfiguration":{"Attributes":{"RegistryId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-replicationconfiguration.html","Properties":{"ReplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-replicationconfiguration.html#cfn-ecr-replicationconfiguration-replicationconfiguration","Required":true,"Type":"ReplicationConfiguration","UpdateType":"Mutable"}}},"AWS::ECR::Repository":{"Attributes":{"Arn":{"PrimitiveType":"String"},"RepositoryUri":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html","Properties":{"EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html#cfn-ecr-repository-encryptionconfiguration","Required":false,"Type":"EncryptionConfiguration","UpdateType":"Immutable"},"ImageScanningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html#cfn-ecr-repository-imagescanningconfiguration","Required":false,"Type":"ImageScanningConfiguration","UpdateType":"Mutable"},"ImageTagMutability":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html#cfn-ecr-repository-imagetagmutability","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LifecyclePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html#cfn-ecr-repository-lifecyclepolicy","Required":false,"Type":"LifecyclePolicy","UpdateType":"Mutable"},"RepositoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html#cfn-ecr-repository-repositoryname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RepositoryPolicyText":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html#cfn-ecr-repository-repositorypolicytext","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html#cfn-ecr-repository-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ECS::CapacityProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-capacityprovider.html","Properties":{"AutoScalingGroupProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-capacityprovider.html#cfn-ecs-capacityprovider-autoscalinggroupprovider","Required":true,"Type":"AutoScalingGroupProvider","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-capacityprovider.html#cfn-ecs-capacityprovider-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-capacityprovider.html#cfn-ecs-capacityprovider-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ECS::Cluster":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html","Properties":{"CapacityProviders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html#cfn-ecs-cluster-capacityproviders","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html#cfn-ecs-cluster-clustername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ClusterSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html#cfn-ecs-cluster-clustersettings","DuplicatesAllowed":true,"ItemType":"ClusterSettings","Required":false,"Type":"List","UpdateType":"Mutable"},"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html#cfn-ecs-cluster-configuration","Required":false,"Type":"ClusterConfiguration","UpdateType":"Mutable"},"DefaultCapacityProviderStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html#cfn-ecs-cluster-defaultcapacityproviderstrategy","DuplicatesAllowed":true,"ItemType":"CapacityProviderStrategyItem","Required":false,"Type":"List","UpdateType":"Mutable"},"ServiceConnectDefaults":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html#cfn-ecs-cluster-serviceconnectdefaults","Required":false,"Type":"ServiceConnectDefaults","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html#cfn-ecs-cluster-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ECS::ClusterCapacityProviderAssociations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-clustercapacityproviderassociations.html","Properties":{"CapacityProviders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-clustercapacityproviderassociations.html#cfn-ecs-clustercapacityproviderassociations-capacityproviders","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Cluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-clustercapacityproviderassociations.html#cfn-ecs-clustercapacityproviderassociations-cluster","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DefaultCapacityProviderStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-clustercapacityproviderassociations.html#cfn-ecs-clustercapacityproviderassociations-defaultcapacityproviderstrategy","DuplicatesAllowed":true,"ItemType":"CapacityProviderStrategy","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::ECS::PrimaryTaskSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-primarytaskset.html","Properties":{"Cluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-primarytaskset.html#cfn-ecs-primarytaskset-cluster","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Service":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-primarytaskset.html#cfn-ecs-primarytaskset-service","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TaskSetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-primarytaskset.html#cfn-ecs-primarytaskset-tasksetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ECS::Service":{"Attributes":{"Name":{"PrimitiveType":"String"},"ServiceArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html","Properties":{"CapacityProviderStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-capacityproviderstrategy","DuplicatesAllowed":true,"ItemType":"CapacityProviderStrategyItem","Required":false,"Type":"List","UpdateType":"Mutable"},"Cluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-cluster","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeploymentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-deploymentconfiguration","Required":false,"Type":"DeploymentConfiguration","UpdateType":"Mutable"},"DeploymentController":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-deploymentcontroller","Required":false,"Type":"DeploymentController","UpdateType":"Immutable"},"DesiredCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-desiredcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"EnableECSManagedTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-enableecsmanagedtags","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableExecuteCommand":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-enableexecutecommand","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HealthCheckGracePeriodSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-healthcheckgraceperiodseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"LaunchType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-launchtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LoadBalancers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-loadbalancers","DuplicatesAllowed":true,"ItemType":"LoadBalancer","Required":false,"Type":"List","UpdateType":"Mutable"},"NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-networkconfiguration","Required":false,"Type":"NetworkConfiguration","UpdateType":"Mutable"},"PlacementConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-placementconstraints","DuplicatesAllowed":true,"ItemType":"PlacementConstraint","Required":false,"Type":"List","UpdateType":"Mutable"},"PlacementStrategies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-placementstrategies","DuplicatesAllowed":true,"ItemType":"PlacementStrategy","Required":false,"Type":"List","UpdateType":"Mutable"},"PlatformVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-platformversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PropagateTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-propagatetags","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-role","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SchedulingStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-schedulingstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServiceConnectConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-serviceconnectconfiguration","Required":false,"Type":"ServiceConnectConfiguration","UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-servicename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServiceRegistries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-serviceregistries","DuplicatesAllowed":true,"ItemType":"ServiceRegistry","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TaskDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-taskdefinition","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ECS::TaskDefinition":{"Attributes":{"TaskDefinitionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html","Properties":{"ContainerDefinitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-containerdefinitions","DuplicatesAllowed":false,"ItemType":"ContainerDefinition","Required":false,"Type":"List","UpdateType":"Immutable"},"Cpu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-cpu","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EphemeralStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-ephemeralstorage","Required":false,"Type":"EphemeralStorage","UpdateType":"Immutable"},"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-executionrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Family":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-family","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InferenceAccelerators":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-inferenceaccelerators","DuplicatesAllowed":false,"ItemType":"InferenceAccelerator","Required":false,"Type":"List","UpdateType":"Immutable"},"IpcMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-ipcmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Memory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-memory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NetworkMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-networkmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PidMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-pidmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PlacementConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-placementconstraints","DuplicatesAllowed":false,"ItemType":"TaskDefinitionPlacementConstraint","Required":false,"Type":"List","UpdateType":"Immutable"},"ProxyConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-proxyconfiguration","Required":false,"Type":"ProxyConfiguration","UpdateType":"Immutable"},"RequiresCompatibilities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-requirescompatibilities","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"RuntimePlatform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-runtimeplatform","Required":false,"Type":"RuntimePlatform","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TaskRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-taskrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Volumes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-volumes","DuplicatesAllowed":false,"ItemType":"Volume","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::ECS::TaskSet":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskset.html","Properties":{"Cluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskset.html#cfn-ecs-taskset-cluster","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ExternalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskset.html#cfn-ecs-taskset-externalid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LaunchType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskset.html#cfn-ecs-taskset-launchtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LoadBalancers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskset.html#cfn-ecs-taskset-loadbalancers","DuplicatesAllowed":true,"ItemType":"LoadBalancer","Required":false,"Type":"List","UpdateType":"Immutable"},"NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskset.html#cfn-ecs-taskset-networkconfiguration","Required":false,"Type":"NetworkConfiguration","UpdateType":"Immutable"},"PlatformVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskset.html#cfn-ecs-taskset-platformversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Scale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskset.html#cfn-ecs-taskset-scale","Required":false,"Type":"Scale","UpdateType":"Mutable"},"Service":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskset.html#cfn-ecs-taskset-service","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ServiceRegistries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskset.html#cfn-ecs-taskset-serviceregistries","DuplicatesAllowed":true,"ItemType":"ServiceRegistry","Required":false,"Type":"List","UpdateType":"Immutable"},"TaskDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskset.html#cfn-ecs-taskset-taskdefinition","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EFS::AccessPoint":{"Attributes":{"AccessPointId":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-accesspoint.html","Properties":{"AccessPointTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-accesspoint.html#cfn-efs-accesspoint-accesspointtags","DuplicatesAllowed":false,"ItemType":"AccessPointTag","Required":false,"Type":"List","UpdateType":"Mutable"},"ClientToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-accesspoint.html#cfn-efs-accesspoint-clienttoken","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FileSystemId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-accesspoint.html#cfn-efs-accesspoint-filesystemid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PosixUser":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-accesspoint.html#cfn-efs-accesspoint-posixuser","Required":false,"Type":"PosixUser","UpdateType":"Immutable"},"RootDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-accesspoint.html#cfn-efs-accesspoint-rootdirectory","Required":false,"Type":"RootDirectory","UpdateType":"Immutable"}}},"AWS::EFS::FileSystem":{"Attributes":{"Arn":{"PrimitiveType":"String"},"FileSystemId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html","Properties":{"AvailabilityZoneName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html#cfn-efs-filesystem-availabilityzonename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BackupPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html#cfn-efs-filesystem-backuppolicy","Required":false,"Type":"BackupPolicy","UpdateType":"Mutable"},"BypassPolicyLockoutSafetyCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html#cfn-efs-filesystem-bypasspolicylockoutsafetycheck","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html#cfn-efs-filesystem-encrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"FileSystemPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html#cfn-efs-filesystem-filesystempolicy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"FileSystemTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html#cfn-efs-filesystem-filesystemtags","DuplicatesAllowed":false,"ItemType":"ElasticFileSystemTag","Required":false,"Type":"List","UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html#cfn-efs-filesystem-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LifecyclePolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html#cfn-efs-filesystem-lifecyclepolicies","DuplicatesAllowed":false,"ItemType":"LifecyclePolicy","Required":false,"Type":"List","UpdateType":"Mutable"},"PerformanceMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html#cfn-efs-filesystem-performancemode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProvisionedThroughputInMibps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html#cfn-efs-filesystem-provisionedthroughputinmibps","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"ThroughputMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-filesystem.html#cfn-efs-filesystem-throughputmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EFS::MountTarget":{"Attributes":{"Id":{"PrimitiveType":"String"},"IpAddress":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-mounttarget.html","Properties":{"FileSystemId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-mounttarget.html#cfn-efs-mounttarget-filesystemid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-mounttarget.html#cfn-efs-mounttarget-ipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-mounttarget.html#cfn-efs-mounttarget-securitygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-efs-mounttarget.html#cfn-efs-mounttarget-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EKS::Addon":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-addon.html","Properties":{"AddonName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-addon.html#cfn-eks-addon-addonname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AddonVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-addon.html#cfn-eks-addon-addonversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-addon.html#cfn-eks-addon-clustername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConfigurationValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-addon.html#cfn-eks-addon-configurationvalues","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreserveOnDelete":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-addon.html#cfn-eks-addon-preserveondelete","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ResolveConflicts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-addon.html#cfn-eks-addon-resolveconflicts","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ServiceAccountRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-addon.html#cfn-eks-addon-serviceaccountrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-addon.html#cfn-eks-addon-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EKS::Cluster":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CertificateAuthorityData":{"PrimitiveType":"String"},"ClusterSecurityGroupId":{"PrimitiveType":"String"},"EncryptionConfigKeyArn":{"PrimitiveType":"String"},"Endpoint":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"KubernetesNetworkConfig.ServiceIpv6Cidr":{"PrimitiveType":"String"},"OpenIdConnectIssuerUrl":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html","Properties":{"EncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-encryptionconfig","DuplicatesAllowed":true,"ItemType":"EncryptionConfig","Required":false,"Type":"List","UpdateType":"Immutable"},"KubernetesNetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-kubernetesnetworkconfig","Required":false,"Type":"KubernetesNetworkConfig","UpdateType":"Immutable"},"Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-logging","Required":false,"Type":"Logging","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OutpostConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-outpostconfig","Required":false,"Type":"OutpostConfig","UpdateType":"Immutable"},"ResourcesVpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-resourcesvpcconfig","Required":true,"Type":"ResourcesVpcConfig","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EKS::FargateProfile":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-fargateprofile.html","Properties":{"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-fargateprofile.html#cfn-eks-fargateprofile-clustername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FargateProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-fargateprofile.html#cfn-eks-fargateprofile-fargateprofilename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PodExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-fargateprofile.html#cfn-eks-fargateprofile-podexecutionrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Selectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-fargateprofile.html#cfn-eks-fargateprofile-selectors","DuplicatesAllowed":true,"ItemType":"Selector","Required":true,"Type":"List","UpdateType":"Immutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-fargateprofile.html#cfn-eks-fargateprofile-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-fargateprofile.html#cfn-eks-fargateprofile-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EKS::IdentityProviderConfig":{"Attributes":{"IdentityProviderConfigArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html","Properties":{"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html#cfn-eks-identityproviderconfig-clustername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IdentityProviderConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html#cfn-eks-identityproviderconfig-identityproviderconfigname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Oidc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html#cfn-eks-identityproviderconfig-oidc","Required":false,"Type":"OidcIdentityProviderConfig","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html#cfn-eks-identityproviderconfig-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html#cfn-eks-identityproviderconfig-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EKS::Nodegroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ClusterName":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"NodegroupName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html","Properties":{"AmiType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-amitype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CapacityType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-capacitytype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-clustername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DiskSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-disksize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ForceUpdateEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-forceupdateenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-instancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Labels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-labels","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"LaunchTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-launchtemplate","Required":false,"Type":"LaunchTemplateSpecification","UpdateType":"Mutable"},"NodeRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-noderole","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NodegroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-nodegroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ReleaseVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-releaseversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoteAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-remoteaccess","Required":false,"Type":"RemoteAccess","UpdateType":"Immutable"},"ScalingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-scalingconfig","Required":false,"Type":"ScalingConfig","UpdateType":"Mutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-subnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Taints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-taints","DuplicatesAllowed":true,"ItemType":"Taint","Required":false,"Type":"List","UpdateType":"Mutable"},"UpdateConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-updateconfig","Required":false,"Type":"UpdateConfig","UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::Cluster":{"Attributes":{"MasterPublicDNS":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html","Properties":{"AdditionalInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-additionalinfo","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"Applications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-applications","DuplicatesAllowed":false,"ItemType":"Application","Required":false,"Type":"List","UpdateType":"Immutable"},"AutoScalingRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-autoscalingrole","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AutoTerminationPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-autoterminationpolicy","Required":false,"Type":"AutoTerminationPolicy","UpdateType":"Mutable"},"BootstrapActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-bootstrapactions","DuplicatesAllowed":false,"ItemType":"BootstrapActionConfig","Required":false,"Type":"List","UpdateType":"Immutable"},"Configurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-configurations","DuplicatesAllowed":false,"ItemType":"Configuration","Required":false,"Type":"List","UpdateType":"Immutable"},"CustomAmiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-customamiid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EbsRootVolumeSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-ebsrootvolumesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Instances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-instances","Required":true,"Type":"JobFlowInstancesConfig","UpdateType":"Conditional"},"JobFlowRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-jobflowrole","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KerberosAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-kerberosattributes","Required":false,"Type":"KerberosAttributes","UpdateType":"Immutable"},"LogEncryptionKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-logencryptionkmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LogUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-loguri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ManagedScalingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-managedscalingpolicy","Required":false,"Type":"ManagedScalingPolicy","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OSReleaseLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-osreleaselabel","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ReleaseLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-releaselabel","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ScaleDownBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-scaledownbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-securityconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServiceRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-servicerole","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StepConcurrencyLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-stepconcurrencylevel","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Steps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-steps","DuplicatesAllowed":false,"ItemType":"StepConfig","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VisibleToAllUsers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html#cfn-elasticmapreduce-cluster-visibletoallusers","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::InstanceFleetConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-instancefleetconfig.html","Properties":{"ClusterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-instancefleetconfig.html#cfn-elasticmapreduce-instancefleetconfig-clusterid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InstanceFleetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-instancefleetconfig.html#cfn-elasticmapreduce-instancefleetconfig-instancefleettype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InstanceTypeConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-instancefleetconfig.html#cfn-elasticmapreduce-instancefleetconfig-instancetypeconfigs","DuplicatesAllowed":false,"ItemType":"InstanceTypeConfig","Required":false,"Type":"List","UpdateType":"Immutable"},"LaunchSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-instancefleetconfig.html#cfn-elasticmapreduce-instancefleetconfig-launchspecifications","Required":false,"Type":"InstanceFleetProvisioningSpecifications","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-instancefleetconfig.html#cfn-elasticmapreduce-instancefleetconfig-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TargetOnDemandCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-instancefleetconfig.html#cfn-elasticmapreduce-instancefleetconfig-targetondemandcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TargetSpotCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-instancefleetconfig.html#cfn-elasticmapreduce-instancefleetconfig-targetspotcapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::EMR::InstanceGroupConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html","Properties":{"AutoScalingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-elasticmapreduce-instancegroupconfig-autoscalingpolicy","Required":false,"Type":"AutoScalingPolicy","UpdateType":"Mutable"},"BidPrice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfig-bidprice","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Configurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfig-configurations","DuplicatesAllowed":false,"ItemType":"Configuration","Required":false,"Type":"List","UpdateType":"Immutable"},"CustomAmiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfig-customamiid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EbsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfig-ebsconfiguration","Required":false,"Type":"EbsConfiguration","UpdateType":"Immutable"},"InstanceCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfiginstancecount-","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"InstanceRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfig-instancerole","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfig-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"JobFlowId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfig-jobflowid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Market":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfig-market","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfig-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::EMR::SecurityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-securityconfiguration.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-securityconfiguration.html#cfn-emr-securityconfiguration-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-securityconfiguration.html#cfn-emr-securityconfiguration-securityconfiguration","PrimitiveType":"Json","Required":true,"UpdateType":"Immutable"}}},"AWS::EMR::Step":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-step.html","Properties":{"ActionOnFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-step.html#cfn-elasticmapreduce-step-actiononfailure","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"HadoopJarStep":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-step.html#cfn-elasticmapreduce-step-hadoopjarstep","Required":true,"Type":"HadoopJarStepConfig","UpdateType":"Immutable"},"JobFlowId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-step.html#cfn-elasticmapreduce-step-jobflowid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-step.html#cfn-elasticmapreduce-step-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EMR::Studio":{"Attributes":{"Arn":{"PrimitiveType":"String"},"StudioId":{"PrimitiveType":"String"},"Url":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html","Properties":{"AuthMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-authmode","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DefaultS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-defaults3location","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EngineSecurityGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-enginesecuritygroupid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IdpAuthUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-idpauthurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdpRelayStateParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-idprelaystateparametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServiceRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-servicerole","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-userrole","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WorkspaceSecurityGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-workspacesecuritygroupid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EMR::StudioSessionMapping":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studiosessionmapping.html","Properties":{"IdentityName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studiosessionmapping.html#cfn-emr-studiosessionmapping-identityname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IdentityType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studiosessionmapping.html#cfn-emr-studiosessionmapping-identitytype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SessionPolicyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studiosessionmapping.html#cfn-emr-studiosessionmapping-sessionpolicyarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StudioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studiosessionmapping.html#cfn-emr-studiosessionmapping-studioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::EMRContainers::VirtualCluster":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrcontainers-virtualcluster.html","Properties":{"ContainerProvider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrcontainers-virtualcluster.html#cfn-emrcontainers-virtualcluster-containerprovider","Required":true,"Type":"ContainerProvider","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrcontainers-virtualcluster.html#cfn-emrcontainers-virtualcluster-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrcontainers-virtualcluster.html#cfn-emrcontainers-virtualcluster-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EMRServerless::Application":{"Attributes":{"ApplicationId":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html","Properties":{"Architecture":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-architecture","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AutoStartConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-autostartconfiguration","Required":false,"Type":"AutoStartConfiguration","UpdateType":"Mutable"},"AutoStopConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-autostopconfiguration","Required":false,"Type":"AutoStopConfiguration","UpdateType":"Mutable"},"ImageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-imageconfiguration","Required":false,"Type":"ImageConfigurationInput","UpdateType":"Mutable"},"InitialCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-initialcapacity","DuplicatesAllowed":false,"ItemType":"InitialCapacityConfigKeyValuePair","Required":false,"Type":"List","UpdateType":"Mutable"},"MaximumCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-maximumcapacity","Required":false,"Type":"MaximumAllowedResources","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-networkconfiguration","Required":false,"Type":"NetworkConfiguration","UpdateType":"Mutable"},"ReleaseLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-releaselabel","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WorkerTypeSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emrserverless-application.html#cfn-emrserverless-application-workertypespecifications","ItemType":"WorkerTypeSpecificationInput","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::ElastiCache::CacheCluster":{"Attributes":{"ConfigurationEndpoint.Address":{"PrimitiveType":"String"},"ConfigurationEndpoint.Port":{"PrimitiveType":"String"},"RedisEndpoint.Address":{"PrimitiveType":"String"},"RedisEndpoint.Port":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html","Properties":{"AZMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-azmode","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"AutoMinorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-autominorversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CacheNodeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-cachenodetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CacheParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-cacheparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CacheSecurityGroupNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-cachesecuritygroupnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CacheSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-cachesubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-clustername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Engine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-engine","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IpDiscovery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-ipdiscovery","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogDeliveryConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-logdeliveryconfigurations","DuplicatesAllowed":false,"ItemType":"LogDeliveryConfigurationRequest","Required":false,"Type":"List","UpdateType":"Mutable"},"NetworkType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-networktype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NotificationTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-notificationtopicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumCacheNodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-numcachenodes","PrimitiveType":"Integer","Required":true,"UpdateType":"Conditional"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"PreferredAvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-preferredavailabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"PreferredAvailabilityZones":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-preferredavailabilityzones","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Conditional"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnapshotArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-snapshotarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SnapshotName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-snapshotname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SnapshotRetentionLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-snapshotretentionlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SnapshotWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-snapshotwindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransitEncryptionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-transitencryptionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"VpcSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cache-cluster.html#cfn-elasticache-cachecluster-vpcsecuritygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElastiCache::GlobalReplicationGroup":{"Attributes":{"GlobalReplicationGroupId":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html","Properties":{"AutomaticFailoverEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-automaticfailoverenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CacheNodeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-cachenodetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CacheParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-cacheparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlobalNodeGroupCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-globalnodegroupcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"GlobalReplicationGroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-globalreplicationgroupdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlobalReplicationGroupIdSuffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-globalreplicationgroupidsuffix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Members":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-members","DuplicatesAllowed":false,"ItemType":"GlobalReplicationGroupMember","Required":true,"Type":"List","UpdateType":"Mutable"},"RegionalConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-globalreplicationgroup.html#cfn-elasticache-globalreplicationgroup-regionalconfigurations","DuplicatesAllowed":false,"ItemType":"RegionalConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElastiCache::ParameterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-parameter-group.html","Properties":{"CacheParameterGroupFamily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-parameter-group.html#cfn-elasticache-parametergroup-cacheparametergroupfamily","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-parameter-group.html#cfn-elasticache-parametergroup-description","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Properties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-parameter-group.html#cfn-elasticache-parametergroup-properties","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-parameter-group.html#cfn-elasticache-parametergroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElastiCache::ReplicationGroup":{"Attributes":{"ConfigurationEndPoint.Address":{"PrimitiveType":"String"},"ConfigurationEndPoint.Port":{"PrimitiveType":"String"},"PrimaryEndPoint.Address":{"PrimitiveType":"String"},"PrimaryEndPoint.Port":{"PrimitiveType":"String"},"ReadEndPoint.Addresses":{"PrimitiveType":"String"},"ReadEndPoint.Addresses.List":{"PrimitiveItemType":"String","Type":"List"},"ReadEndPoint.Ports":{"PrimitiveType":"String"},"ReadEndPoint.Ports.List":{"PrimitiveItemType":"String","Type":"List"},"ReaderEndPoint.Address":{"PrimitiveType":"String"},"ReaderEndPoint.Port":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html","Properties":{"AtRestEncryptionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-atrestencryptionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"AuthToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-authtoken","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"AutoMinorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-autominorversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AutomaticFailoverEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-automaticfailoverenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CacheNodeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-cachenodetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CacheParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-cacheparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CacheSecurityGroupNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-cachesecuritygroupnames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CacheSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-cachesubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ClusterMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-clustermode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataTieringEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-datatieringenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Engine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-engine","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlobalReplicationGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-globalreplicationgroupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IpDiscovery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-ipdiscovery","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LogDeliveryConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-logdeliveryconfigurations","DuplicatesAllowed":false,"ItemType":"LogDeliveryConfigurationRequest","Required":false,"Type":"List","UpdateType":"Mutable"},"MultiAZEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-multiazenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NetworkType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-networktype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NodeGroupConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-nodegroupconfiguration","DuplicatesAllowed":false,"ItemType":"NodeGroupConfiguration","Required":false,"Type":"List","UpdateType":"Conditional"},"NotificationTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-notificationtopicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumCacheClusters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-numcacheclusters","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NumNodeGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-numnodegroups","PrimitiveType":"Integer","Required":false,"UpdateType":"Conditional"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"PreferredCacheClusterAZs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-preferredcacheclusterazs","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrimaryClusterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-primaryclusterid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReplicasPerNodeGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-replicaspernodegroup","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"ReplicationGroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-replicationgroupdescription","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ReplicationGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-replicationgroupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-securitygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SnapshotArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-snapshotarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SnapshotName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-snapshotname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SnapshotRetentionLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-snapshotretentionlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SnapshotWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-snapshotwindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnapshottingClusterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-snapshottingclusterid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransitEncryptionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-transitencryptionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TransitEncryptionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-transitencryptionmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-usergroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElastiCache::SecurityGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group.html#cfn-elasticache-securitygroup-description","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group.html#cfn-elasticache-securitygroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElastiCache::SecurityGroupIngress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group-ingress.html","Properties":{"CacheSecurityGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group-ingress.html#cfn-elasticache-securitygroupingress-cachesecuritygroupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EC2SecurityGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group-ingress.html#cfn-elasticache-securitygroupingress-ec2securitygroupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EC2SecurityGroupOwnerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-security-group-ingress.html#cfn-elasticache-securitygroupingress-ec2securitygroupownerid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElastiCache::SubnetGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-subnetgroup.html","Properties":{"CacheSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-subnetgroup.html#cfn-elasticache-subnetgroup-cachesubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-subnetgroup.html#cfn-elasticache-subnetgroup-description","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-subnetgroup.html#cfn-elasticache-subnetgroup-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-subnetgroup.html#cfn-elasticache-subnetgroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElastiCache::User":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html","Properties":{"AccessString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-accessstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthenticationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-authenticationmode","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Engine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-engine","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NoPasswordRequired":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-nopasswordrequired","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Passwords":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-passwords","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-userid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-user.html#cfn-elasticache-user-username","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ElastiCache::UserGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-usergroup.html","Properties":{"Engine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-usergroup.html#cfn-elasticache-usergroup-engine","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-usergroup.html#cfn-elasticache-usergroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-usergroup.html#cfn-elasticache-usergroup-usergroupid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UserIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-usergroup.html#cfn-elasticache-usergroup-userids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElasticBeanstalk::Application":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-application.html","Properties":{"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-application.html#cfn-elasticbeanstalk-application-applicationname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-application.html#cfn-elasticbeanstalk-application-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceLifecycleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-application.html#cfn-elasticbeanstalk-application-resourcelifecycleconfig","Required":false,"Type":"ApplicationResourceLifecycleConfig","UpdateType":"Mutable"}}},"AWS::ElasticBeanstalk::ApplicationVersion":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-applicationversion.html","Properties":{"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-applicationversion.html#cfn-elasticbeanstalk-applicationversion-applicationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-applicationversion.html#cfn-elasticbeanstalk-applicationversion-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceBundle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-applicationversion.html#cfn-elasticbeanstalk-applicationversion-sourcebundle","Required":true,"Type":"SourceBundle","UpdateType":"Immutable"}}},"AWS::ElasticBeanstalk::ConfigurationTemplate":{"Attributes":{"TemplateName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-configurationtemplate.html","Properties":{"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-configurationtemplate.html#cfn-elasticbeanstalk-configurationtemplate-applicationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-configurationtemplate.html#cfn-elasticbeanstalk-configurationtemplate-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnvironmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-configurationtemplate.html#cfn-elasticbeanstalk-configurationtemplate-environmentid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OptionSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-configurationtemplate.html#cfn-elasticbeanstalk-configurationtemplate-optionsettings","DuplicatesAllowed":true,"ItemType":"ConfigurationOptionSetting","Required":false,"Type":"List","UpdateType":"Mutable"},"PlatformArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-configurationtemplate.html#cfn-elasticbeanstalk-configurationtemplate-platformarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SolutionStackName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-configurationtemplate.html#cfn-elasticbeanstalk-configurationtemplate-solutionstackname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-configurationtemplate.html#cfn-elasticbeanstalk-configurationtemplate-sourceconfiguration","Required":false,"Type":"SourceConfiguration","UpdateType":"Immutable"}}},"AWS::ElasticBeanstalk::Environment":{"Attributes":{"EndpointURL":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html","Properties":{"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-applicationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CNAMEPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-cnameprefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnvironmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-environmentname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OperationsRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-operationsrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OptionSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-optionsettings","DuplicatesAllowed":true,"ItemType":"OptionSetting","Required":false,"Type":"List","UpdateType":"Mutable"},"PlatformArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-platformarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SolutionStackName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-solutionstackname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-templatename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-tier","Required":false,"Type":"Tier","UpdateType":"Mutable"},"VersionLabel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticbeanstalk-environment.html#cfn-elasticbeanstalk-environment-versionlabel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancing::LoadBalancer":{"Attributes":{"CanonicalHostedZoneName":{"PrimitiveType":"String"},"CanonicalHostedZoneNameID":{"PrimitiveType":"String"},"DNSName":{"PrimitiveType":"String"},"SourceSecurityGroup.GroupName":{"PrimitiveType":"String"},"SourceSecurityGroup.OwnerAlias":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html","Properties":{"AccessLoggingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-accessloggingpolicy","Required":false,"Type":"AccessLoggingPolicy","UpdateType":"Mutable"},"AppCookieStickinessPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-appcookiestickinesspolicy","DuplicatesAllowed":false,"ItemType":"AppCookieStickinessPolicy","Required":false,"Type":"List","UpdateType":"Mutable"},"AvailabilityZones":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-availabilityzones","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Conditional"},"ConnectionDrainingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-connectiondrainingpolicy","Required":false,"Type":"ConnectionDrainingPolicy","UpdateType":"Mutable"},"ConnectionSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-connectionsettings","Required":false,"Type":"ConnectionSettings","UpdateType":"Mutable"},"CrossZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-crosszone","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HealthCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-healthcheck","Required":false,"Type":"HealthCheck","UpdateType":"Conditional"},"Instances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-instances","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"LBCookieStickinessPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-lbcookiestickinesspolicy","DuplicatesAllowed":false,"ItemType":"LBCookieStickinessPolicy","Required":false,"Type":"List","UpdateType":"Mutable"},"Listeners":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-listeners","DuplicatesAllowed":false,"ItemType":"Listeners","Required":true,"Type":"List","UpdateType":"Mutable"},"LoadBalancerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-elbname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Policies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-policies","DuplicatesAllowed":false,"ItemType":"Policies","Required":false,"Type":"List","UpdateType":"Mutable"},"Scheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-scheme","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-securitygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-ec2-elb-subnets","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Conditional"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html#cfn-elasticloadbalancing-loadbalancer-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::Listener":{"Attributes":{"ListenerArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html","Properties":{"AlpnPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html#cfn-elasticloadbalancingv2-listener-alpnpolicy","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Certificates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html#cfn-elasticloadbalancingv2-listener-certificates","DuplicatesAllowed":false,"ItemType":"Certificate","Required":false,"Type":"List","UpdateType":"Mutable"},"DefaultActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html#cfn-elasticloadbalancingv2-listener-defaultactions","DuplicatesAllowed":false,"ItemType":"Action","Required":true,"Type":"List","UpdateType":"Mutable"},"LoadBalancerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html#cfn-elasticloadbalancingv2-listener-loadbalancerarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html#cfn-elasticloadbalancingv2-listener-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html#cfn-elasticloadbalancingv2-listener-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SslPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html#cfn-elasticloadbalancingv2-listener-sslpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::ListenerCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenercertificate.html","Properties":{"Certificates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenercertificate.html#cfn-elasticloadbalancingv2-listenercertificate-certificates","DuplicatesAllowed":false,"ItemType":"Certificate","Required":true,"Type":"List","UpdateType":"Mutable"},"ListenerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenercertificate.html#cfn-elasticloadbalancingv2-listenercertificate-listenerarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ElasticLoadBalancingV2::ListenerRule":{"Attributes":{"IsDefault":{"PrimitiveType":"Boolean"},"RuleArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenerrule.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenerrule.html#cfn-elasticloadbalancingv2-listenerrule-actions","DuplicatesAllowed":false,"ItemType":"Action","Required":true,"Type":"List","UpdateType":"Mutable"},"Conditions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenerrule.html#cfn-elasticloadbalancingv2-listenerrule-conditions","DuplicatesAllowed":false,"ItemType":"RuleCondition","Required":true,"Type":"List","UpdateType":"Mutable"},"ListenerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenerrule.html#cfn-elasticloadbalancingv2-listenerrule-listenerarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listenerrule.html#cfn-elasticloadbalancingv2-listenerrule-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::ElasticLoadBalancingV2::LoadBalancer":{"Attributes":{"CanonicalHostedZoneID":{"PrimitiveType":"String"},"DNSName":{"PrimitiveType":"String"},"LoadBalancerFullName":{"PrimitiveType":"String"},"LoadBalancerName":{"PrimitiveType":"String"},"SecurityGroups":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html","Properties":{"IpAddressType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-ipaddresstype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoadBalancerAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-loadbalancerattributes","DuplicatesAllowed":false,"ItemType":"LoadBalancerAttribute","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Scheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-scheme","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-securitygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-subnetmappings","DuplicatesAllowed":false,"ItemType":"SubnetMapping","Required":false,"Type":"List","UpdateType":"Mutable"},"Subnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-subnets","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html#cfn-elasticloadbalancingv2-loadbalancer-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ElasticLoadBalancingV2::TargetGroup":{"Attributes":{"LoadBalancerArns":{"PrimitiveItemType":"String","Type":"List"},"TargetGroupArn":{"PrimitiveType":"String"},"TargetGroupFullName":{"PrimitiveType":"String"},"TargetGroupName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html","Properties":{"HealthCheckEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HealthCheckIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckintervalseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HealthCheckPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HealthCheckPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckport","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HealthCheckProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthcheckprotocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HealthCheckTimeoutSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthchecktimeoutseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HealthyThresholdCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-healthythresholdcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IpAddressType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-ipaddresstype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Matcher":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-matcher","Required":false,"Type":"Matcher","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProtocolVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-protocolversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetGroupAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-targetgroupattributes","DuplicatesAllowed":false,"ItemType":"TargetGroupAttribute","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-targettype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-targets","DuplicatesAllowed":false,"ItemType":"TargetDescription","Required":false,"Type":"List","UpdateType":"Mutable"},"UnhealthyThresholdCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-unhealthythresholdcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Elasticsearch::Domain":{"Attributes":{"Arn":{"PrimitiveType":"String"},"DomainEndpoint":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html","Properties":{"AccessPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-accesspolicies","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"AdvancedOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-advancedoptions","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"AdvancedSecurityOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-advancedsecurityoptions","Required":false,"Type":"AdvancedSecurityOptionsInput","UpdateType":"Conditional"},"CognitoOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-cognitooptions","Required":false,"Type":"CognitoOptions","UpdateType":"Mutable"},"DomainEndpointOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-domainendpointoptions","Required":false,"Type":"DomainEndpointOptions","UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-domainname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EBSOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-ebsoptions","Required":false,"Type":"EBSOptions","UpdateType":"Mutable"},"ElasticsearchClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-elasticsearchclusterconfig","Required":false,"Type":"ElasticsearchClusterConfig","UpdateType":"Mutable"},"ElasticsearchVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-elasticsearchversion","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"EncryptionAtRestOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-encryptionatrestoptions","Required":false,"Type":"EncryptionAtRestOptions","UpdateType":"Conditional"},"LogPublishingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-logpublishingoptions","DuplicatesAllowed":false,"ItemType":"LogPublishingOption","Required":false,"Type":"Map","UpdateType":"Mutable"},"NodeToNodeEncryptionOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-nodetonodeencryptionoptions","Required":false,"Type":"NodeToNodeEncryptionOptions","UpdateType":"Conditional"},"SnapshotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-snapshotoptions","Required":false,"Type":"SnapshotOptions","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VPCOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticsearch-domain.html#cfn-elasticsearch-domain-vpcoptions","Required":false,"Type":"VPCOptions","UpdateType":"Mutable"}}},"AWS::EventSchemas::Discoverer":{"Attributes":{"CrossAccount":{"PrimitiveType":"Boolean"},"DiscovererArn":{"PrimitiveType":"String"},"DiscovererId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-discoverer.html","Properties":{"CrossAccount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-discoverer.html#cfn-eventschemas-discoverer-crossaccount","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-discoverer.html#cfn-eventschemas-discoverer-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-discoverer.html#cfn-eventschemas-discoverer-sourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-discoverer.html#cfn-eventschemas-discoverer-tags","ItemType":"TagsEntry","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EventSchemas::Registry":{"Attributes":{"RegistryArn":{"PrimitiveType":"String"},"RegistryName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-registry.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-registry.html#cfn-eventschemas-registry-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RegistryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-registry.html#cfn-eventschemas-registry-registryname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-registry.html#cfn-eventschemas-registry-tags","ItemType":"TagsEntry","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::EventSchemas::RegistryPolicy":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-registrypolicy.html","Properties":{"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-registrypolicy.html#cfn-eventschemas-registrypolicy-policy","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"RegistryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-registrypolicy.html#cfn-eventschemas-registrypolicy-registryname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RevisionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-registrypolicy.html#cfn-eventschemas-registrypolicy-revisionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::EventSchemas::Schema":{"Attributes":{"SchemaArn":{"PrimitiveType":"String"},"SchemaName":{"PrimitiveType":"String"},"SchemaVersion":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-schema.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-schema.html#cfn-eventschemas-schema-content","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-schema.html#cfn-eventschemas-schema-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RegistryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-schema.html#cfn-eventschemas-schema-registryname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SchemaName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-schema.html#cfn-eventschemas-schema-schemaname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-schema.html#cfn-eventschemas-schema-tags","ItemType":"TagsEntry","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-schema.html#cfn-eventschemas-schema-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Events::ApiDestination":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-apidestination.html","Properties":{"ConnectionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-apidestination.html#cfn-events-apidestination-connectionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-apidestination.html#cfn-events-apidestination-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HttpMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-apidestination.html#cfn-events-apidestination-httpmethod","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InvocationEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-apidestination.html#cfn-events-apidestination-invocationendpoint","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InvocationRateLimitPerSecond":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-apidestination.html#cfn-events-apidestination-invocationratelimitpersecond","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-apidestination.html#cfn-events-apidestination-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Events::Archive":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html","Properties":{"ArchiveName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html#cfn-events-archive-archivename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html#cfn-events-archive-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html#cfn-events-archive-eventpattern","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"RetentionDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html#cfn-events-archive-retentiondays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-archive.html#cfn-events-archive-sourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Events::Connection":{"Attributes":{"Arn":{"PrimitiveType":"String"},"SecretArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-connection.html","Properties":{"AuthParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-connection.html#cfn-events-connection-authparameters","Required":true,"Type":"AuthParameters","UpdateType":"Mutable"},"AuthorizationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-connection.html#cfn-events-connection-authorizationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-connection.html#cfn-events-connection-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-connection.html#cfn-events-connection-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Events::Endpoint":{"Attributes":{"Arn":{"PrimitiveType":"String"},"EndpointId":{"PrimitiveType":"String"},"EndpointUrl":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"},"StateReason":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventBuses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-eventbuses","DuplicatesAllowed":true,"ItemType":"EndpointEventBus","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ReplicationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-replicationconfig","Required":false,"Type":"ReplicationConfig","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoutingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-routingconfig","Required":true,"Type":"RoutingConfig","UpdateType":"Mutable"}}},"AWS::Events::EventBus":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"},"Policy":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbus.html","Properties":{"EventSourceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbus.html#cfn-events-eventbus-eventsourcename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbus.html#cfn-events-eventbus-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbus.html#cfn-events-eventbus-tags","ItemType":"TagEntry","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Events::EventBusPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-action","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Condition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-condition","Required":false,"Type":"Condition","UpdateType":"Mutable"},"EventBusName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-eventbusname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-principal","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Statement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-statement","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"StatementId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbuspolicy.html#cfn-events-eventbuspolicy-statementid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Events::Rule":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventBusName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-eventbusname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EventPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-eventpattern","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-scheduleexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html#cfn-events-rule-targets","DuplicatesAllowed":false,"ItemType":"Target","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Evidently::Experiment":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricGoals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-metricgoals","DuplicatesAllowed":false,"ItemType":"MetricGoalObject","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OnlineAbConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-onlineabconfig","Required":true,"Type":"OnlineAbConfigObject","UpdateType":"Mutable"},"Project":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-project","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RandomizationSalt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-randomizationsalt","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RemoveSegment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-removesegment","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RunningStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-runningstatus","Required":false,"Type":"RunningStatusObject","UpdateType":"Mutable"},"SamplingRate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-samplingrate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Segment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-segment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Treatments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-treatments","DuplicatesAllowed":false,"ItemType":"TreatmentObject","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Evidently::Feature":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html","Properties":{"DefaultVariation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-defaultvariation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EntityOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-entityoverrides","DuplicatesAllowed":false,"ItemType":"EntityOverride","Required":false,"Type":"List","UpdateType":"Mutable"},"EvaluationStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-evaluationstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Project":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-project","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Variations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-variations","DuplicatesAllowed":false,"ItemType":"VariationObject","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Evidently::Launch":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExecutionStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-executionstatus","Required":false,"Type":"ExecutionStatusObject","UpdateType":"Mutable"},"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-groups","DuplicatesAllowed":false,"ItemType":"LaunchGroupObject","Required":true,"Type":"List","UpdateType":"Mutable"},"MetricMonitors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-metricmonitors","DuplicatesAllowed":false,"ItemType":"MetricDefinitionObject","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Project":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-project","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RandomizationSalt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-randomizationsalt","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduledSplitsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-scheduledsplitsconfig","DuplicatesAllowed":false,"ItemType":"StepConfig","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Evidently::Project":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-project.html","Properties":{"AppConfigResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-project.html#cfn-evidently-project-appconfigresource","Required":false,"Type":"AppConfigResourceObject","UpdateType":"Mutable"},"DataDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-project.html#cfn-evidently-project-datadelivery","Required":false,"Type":"DataDeliveryObject","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-project.html#cfn-evidently-project-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-project.html#cfn-evidently-project-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-project.html#cfn-evidently-project-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Evidently::Segment":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-segment.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-segment.html#cfn-evidently-segment-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-segment.html#cfn-evidently-segment-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Pattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-segment.html#cfn-evidently-segment-pattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-segment.html#cfn-evidently-segment-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FIS::ExperimentTemplate":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fis-experimenttemplate.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fis-experimenttemplate.html#cfn-fis-experimenttemplate-actions","ItemType":"ExperimentTemplateAction","Required":false,"Type":"Map","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fis-experimenttemplate.html#cfn-fis-experimenttemplate-description","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fis-experimenttemplate.html#cfn-fis-experimenttemplate-logconfiguration","Required":false,"Type":"ExperimentTemplateLogConfiguration","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fis-experimenttemplate.html#cfn-fis-experimenttemplate-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StopConditions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fis-experimenttemplate.html#cfn-fis-experimenttemplate-stopconditions","DuplicatesAllowed":true,"ItemType":"ExperimentTemplateStopCondition","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fis-experimenttemplate.html#cfn-fis-experimenttemplate-tags","PrimitiveItemType":"String","Required":true,"Type":"Map","UpdateType":"Immutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fis-experimenttemplate.html#cfn-fis-experimenttemplate-targets","ItemType":"ExperimentTemplateTarget","Required":true,"Type":"Map","UpdateType":"Mutable"}}},"AWS::FMS::NotificationChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-notificationchannel.html","Properties":{"SnsRoleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-notificationchannel.html#cfn-fms-notificationchannel-snsrolename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SnsTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-notificationchannel.html#cfn-fms-notificationchannel-snstopicarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::FMS::Policy":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html","Properties":{"DeleteAllPolicyResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-deleteallpolicyresources","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExcludeMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-excludemap","Required":false,"Type":"IEMap","UpdateType":"Mutable"},"ExcludeResourceTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-excluderesourcetags","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"IncludeMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-includemap","Required":false,"Type":"IEMap","UpdateType":"Mutable"},"PolicyDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-policydescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RemediationEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-remediationenabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"ResourceSetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-resourcesetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-resourcetags","DuplicatesAllowed":true,"ItemType":"ResourceTag","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-resourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceTypeList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-resourcetypelist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourcesCleanUp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-resourcescleanup","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SecurityServicePolicyData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-securityservicepolicydata","Required":true,"Type":"SecurityServicePolicyData","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-tags","DuplicatesAllowed":true,"ItemType":"PolicyTag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FMS::ResourceSet":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-resourceset.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-resourceset.html#cfn-fms-resourceset-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-resourceset.html#cfn-fms-resourceset-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceTypeList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-resourceset.html#cfn-fms-resourceset-resourcetypelist","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-resourceset.html#cfn-fms-resourceset-resources","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-resourceset.html#cfn-fms-resourceset-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FSx::DataRepositoryAssociation":{"Attributes":{"AssociationId":{"PrimitiveType":"String"},"ResourceARN":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-datarepositoryassociation.html","Properties":{"BatchImportMetaDataOnCreate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-datarepositoryassociation.html#cfn-fsx-datarepositoryassociation-batchimportmetadataoncreate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"DataRepositoryPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-datarepositoryassociation.html#cfn-fsx-datarepositoryassociation-datarepositorypath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FileSystemId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-datarepositoryassociation.html#cfn-fsx-datarepositoryassociation-filesystemid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FileSystemPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-datarepositoryassociation.html#cfn-fsx-datarepositoryassociation-filesystempath","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ImportedFileChunkSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-datarepositoryassociation.html#cfn-fsx-datarepositoryassociation-importedfilechunksize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"S3":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-datarepositoryassociation.html#cfn-fsx-datarepositoryassociation-s3","Required":false,"Type":"S3","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-datarepositoryassociation.html#cfn-fsx-datarepositoryassociation-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FSx::FileSystem":{"Attributes":{"DNSName":{"PrimitiveType":"String"},"LustreMountName":{"PrimitiveType":"String"},"ResourceARN":{"PrimitiveType":"String"},"RootVolumeId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html","Properties":{"BackupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-backupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FileSystemType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-filesystemtype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FileSystemTypeVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-filesystemtypeversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LustreConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-lustreconfiguration","Required":false,"Type":"LustreConfiguration","UpdateType":"Mutable"},"OntapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-ontapconfiguration","Required":false,"Type":"OntapConfiguration","UpdateType":"Mutable"},"OpenZFSConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-openzfsconfiguration","Required":false,"Type":"OpenZFSConfiguration","UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-securitygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"StorageCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-storagecapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StorageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-storagetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-subnetids","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"WindowsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-windowsconfiguration","Required":false,"Type":"WindowsConfiguration","UpdateType":"Mutable"}}},"AWS::FSx::Snapshot":{"Attributes":{"ResourceARN":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-snapshot.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-snapshot.html#cfn-fsx-snapshot-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-snapshot.html#cfn-fsx-snapshot-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VolumeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-snapshot.html#cfn-fsx-snapshot-volumeid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::FSx::StorageVirtualMachine":{"Attributes":{"ResourceARN":{"PrimitiveType":"String"},"StorageVirtualMachineId":{"PrimitiveType":"String"},"UUID":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html","Properties":{"ActiveDirectoryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration","Required":false,"Type":"ActiveDirectoryConfiguration","UpdateType":"Mutable"},"FileSystemId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-filesystemid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RootVolumeSecurityStyle":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-rootvolumesecuritystyle","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SvmAdminPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-svmadminpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FSx::Volume":{"Attributes":{"ResourceARN":{"PrimitiveType":"String"},"UUID":{"PrimitiveType":"String"},"VolumeId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html","Properties":{"BackupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-backupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OntapConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-ontapconfiguration","Required":false,"Type":"OntapConfiguration","UpdateType":"Mutable"},"OpenZFSConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-openzfsconfiguration","Required":false,"Type":"OpenZFSConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VolumeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-volumetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::FinSpace::Environment":{"Attributes":{"AwsAccountId":{"PrimitiveType":"String"},"DedicatedServiceAccountId":{"PrimitiveType":"String"},"EnvironmentArn":{"PrimitiveType":"String"},"EnvironmentId":{"PrimitiveType":"String"},"EnvironmentUrl":{"PrimitiveType":"String"},"SageMakerStudioDomainUrl":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-finspace-environment.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-finspace-environment.html#cfn-finspace-environment-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FederationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-finspace-environment.html#cfn-finspace-environment-federationmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FederationParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-finspace-environment.html#cfn-finspace-environment-federationparameters","Required":false,"Type":"FederationParameters","UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-finspace-environment.html#cfn-finspace-environment-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-finspace-environment.html#cfn-finspace-environment-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SuperuserParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-finspace-environment.html#cfn-finspace-environment-superuserparameters","Required":false,"Type":"SuperuserParameters","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-finspace-environment.html#cfn-finspace-environment-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Forecast::Dataset":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html","Properties":{"DataFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-datafrequency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatasetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-datasetname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatasetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-datasettype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-domain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EncryptionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-encryptionconfig","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-schema","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-tags","DuplicatesAllowed":true,"ItemType":"TagsItems","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Forecast::DatasetGroup":{"Attributes":{"DatasetGroupArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-datasetgroup.html","Properties":{"DatasetArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-datasetgroup.html#cfn-forecast-datasetgroup-datasetarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DatasetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-datasetgroup.html#cfn-forecast-datasetgroup-datasetgroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-datasetgroup.html#cfn-forecast-datasetgroup-domain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-datasetgroup.html#cfn-forecast-datasetgroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::Detector":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"DetectorVersionId":{"PrimitiveType":"String"},"EventType.Arn":{"PrimitiveType":"String"},"EventType.CreatedTime":{"PrimitiveType":"String"},"EventType.LastUpdatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-detector.html","Properties":{"AssociatedModels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-detector.html#cfn-frauddetector-detector-associatedmodels","DuplicatesAllowed":true,"ItemType":"Model","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-detector.html#cfn-frauddetector-detector-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DetectorId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-detector.html#cfn-frauddetector-detector-detectorid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DetectorVersionStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-detector.html#cfn-frauddetector-detector-detectorversionstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-detector.html#cfn-frauddetector-detector-eventtype","Required":true,"Type":"EventType","UpdateType":"Mutable"},"RuleExecutionMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-detector.html#cfn-frauddetector-detector-ruleexecutionmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-detector.html#cfn-frauddetector-detector-rules","DuplicatesAllowed":true,"ItemType":"Rule","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-detector.html#cfn-frauddetector-detector-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::EntityType":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-entitytype.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-entitytype.html#cfn-frauddetector-entitytype-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-entitytype.html#cfn-frauddetector-entitytype-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-entitytype.html#cfn-frauddetector-entitytype-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::EventType":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-eventtype.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-eventtype.html#cfn-frauddetector-eventtype-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EntityTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-eventtype.html#cfn-frauddetector-eventtype-entitytypes","DuplicatesAllowed":true,"ItemType":"EntityType","Required":true,"Type":"List","UpdateType":"Mutable"},"EventVariables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-eventtype.html#cfn-frauddetector-eventtype-eventvariables","DuplicatesAllowed":true,"ItemType":"EventVariable","Required":true,"Type":"List","UpdateType":"Mutable"},"Labels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-eventtype.html#cfn-frauddetector-eventtype-labels","DuplicatesAllowed":true,"ItemType":"Label","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-eventtype.html#cfn-frauddetector-eventtype-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-eventtype.html#cfn-frauddetector-eventtype-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::Label":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-label.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-label.html#cfn-frauddetector-label-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-label.html#cfn-frauddetector-label-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-label.html#cfn-frauddetector-label-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::List":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-list.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-list.html#cfn-frauddetector-list-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Elements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-list.html#cfn-frauddetector-list-elements","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-list.html#cfn-frauddetector-list-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-list.html#cfn-frauddetector-list-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VariableType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-list.html#cfn-frauddetector-list-variabletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::FraudDetector::Outcome":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-outcome.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-outcome.html#cfn-frauddetector-outcome-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-outcome.html#cfn-frauddetector-outcome-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-outcome.html#cfn-frauddetector-outcome-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::FraudDetector::Variable":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-variable.html","Properties":{"DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-variable.html#cfn-frauddetector-variable-datasource","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-variable.html#cfn-frauddetector-variable-datatype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DefaultValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-variable.html#cfn-frauddetector-variable-defaultvalue","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-variable.html#cfn-frauddetector-variable-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-variable.html#cfn-frauddetector-variable-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-variable.html#cfn-frauddetector-variable-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VariableType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-frauddetector-variable.html#cfn-frauddetector-variable-variabletype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GameLift::Alias":{"Attributes":{"AliasId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html#cfn-gamelift-alias-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html#cfn-gamelift-alias-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoutingStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-alias.html#cfn-gamelift-alias-routingstrategy","Required":true,"Type":"RoutingStrategy","UpdateType":"Mutable"}}},"AWS::GameLift::Build":{"Attributes":{"BuildId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html#cfn-gamelift-build-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OperatingSystem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html#cfn-gamelift-build-operatingsystem","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServerSdkVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html#cfn-gamelift-build-serversdkversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StorageLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html#cfn-gamelift-build-storagelocation","Required":false,"Type":"StorageLocation","UpdateType":"Immutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-build.html#cfn-gamelift-build-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GameLift::Fleet":{"Attributes":{"FleetId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html","Properties":{"AnywhereConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-anywhereconfiguration","Required":false,"Type":"AnywhereConfiguration","UpdateType":"Mutable"},"BuildId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-buildid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CertificateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-certificateconfiguration","Required":false,"Type":"CertificateConfiguration","UpdateType":"Immutable"},"ComputeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-computetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DesiredEC2Instances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-desiredec2instances","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"EC2InboundPermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-ec2inboundpermissions","DuplicatesAllowed":true,"ItemType":"IpPermission","Required":false,"Type":"List","UpdateType":"Mutable"},"EC2InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-ec2instancetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FleetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-fleettype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceRoleARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-instancerolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Locations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-locations","DuplicatesAllowed":true,"ItemType":"LocationConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"MaxSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-maxsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MetricGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-metricgroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MinSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-minsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NewGameSessionProtectionPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-newgamesessionprotectionpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PeerVpcAwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-peervpcawsaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PeerVpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-peervpcid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourceCreationLimitPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-resourcecreationlimitpolicy","Required":false,"Type":"ResourceCreationLimitPolicy","UpdateType":"Mutable"},"RuntimeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-runtimeconfiguration","Required":false,"Type":"RuntimeConfiguration","UpdateType":"Mutable"},"ScriptId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-fleet.html#cfn-gamelift-fleet-scriptid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::GameLift::GameServerGroup":{"Attributes":{"AutoScalingGroupArn":{"PrimitiveType":"String"},"GameServerGroupArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html","Properties":{"AutoScalingPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-autoscalingpolicy","Required":false,"Type":"AutoScalingPolicy","UpdateType":"Mutable"},"BalancingStrategy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-balancingstrategy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeleteOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-deleteoption","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GameServerGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-gameservergroupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"GameServerProtectionPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-gameserverprotectionpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceDefinitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-instancedefinitions","DuplicatesAllowed":true,"ItemType":"InstanceDefinition","Required":true,"Type":"List","UpdateType":"Mutable"},"LaunchTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-launchtemplate","Required":false,"Type":"LaunchTemplate","UpdateType":"Mutable"},"MaxSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-maxsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MinSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-minsize","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcSubnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gameservergroup.html#cfn-gamelift-gameservergroup-vpcsubnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GameLift::GameSessionQueue":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html","Properties":{"CustomEventData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html#cfn-gamelift-gamesessionqueue-customeventdata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Destinations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html#cfn-gamelift-gamesessionqueue-destinations","ItemType":"Destination","Required":false,"Type":"List","UpdateType":"Mutable"},"FilterConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html#cfn-gamelift-gamesessionqueue-filterconfiguration","Required":false,"Type":"FilterConfiguration","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html#cfn-gamelift-gamesessionqueue-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NotificationTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html#cfn-gamelift-gamesessionqueue-notificationtarget","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PlayerLatencyPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html#cfn-gamelift-gamesessionqueue-playerlatencypolicies","ItemType":"PlayerLatencyPolicy","Required":false,"Type":"List","UpdateType":"Mutable"},"PriorityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html#cfn-gamelift-gamesessionqueue-priorityconfiguration","Required":false,"Type":"PriorityConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html#cfn-gamelift-gamesessionqueue-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TimeoutInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html#cfn-gamelift-gamesessionqueue-timeoutinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::GameLift::Location":{"Attributes":{"LocationArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-location.html","Properties":{"LocationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-location.html#cfn-gamelift-location-locationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-location.html#cfn-gamelift-location-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GameLift::MatchmakingConfiguration":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html","Properties":{"AcceptanceRequired":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-acceptancerequired","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"AcceptanceTimeoutSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-acceptancetimeoutseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AdditionalPlayerCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-additionalplayercount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"BackfillMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-backfillmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomEventData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-customeventdata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FlexMatchMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-flexmatchmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GameProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-gameproperties","ItemType":"GameProperty","Required":false,"Type":"List","UpdateType":"Mutable"},"GameSessionData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-gamesessiondata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GameSessionQueueArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-gamesessionqueuearns","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NotificationTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-notificationtarget","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RequestTimeoutSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-requesttimeoutseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"RuleSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-rulesetname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GameLift::MatchmakingRuleSet":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingruleset.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingruleset.html#cfn-gamelift-matchmakingruleset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RuleSetBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingruleset.html#cfn-gamelift-matchmakingruleset-rulesetbody","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingruleset.html#cfn-gamelift-matchmakingruleset-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GameLift::Script":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-script.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-script.html#cfn-gamelift-script-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StorageLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-script.html#cfn-gamelift-script-storagelocation","Required":true,"Type":"S3Location","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-script.html#cfn-gamelift-script-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-script.html#cfn-gamelift-script-version","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GlobalAccelerator::Accelerator":{"Attributes":{"AcceleratorArn":{"PrimitiveType":"String"},"DnsName":{"PrimitiveType":"String"},"DualStackDnsName":{"PrimitiveType":"String"},"Ipv4Addresses":{"PrimitiveItemType":"String","Type":"List"},"Ipv6Addresses":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-accelerator.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-accelerator.html#cfn-globalaccelerator-accelerator-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IpAddressType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-accelerator.html#cfn-globalaccelerator-accelerator-ipaddresstype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IpAddresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-accelerator.html#cfn-globalaccelerator-accelerator-ipaddresses","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-accelerator.html#cfn-globalaccelerator-accelerator-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-accelerator.html#cfn-globalaccelerator-accelerator-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GlobalAccelerator::EndpointGroup":{"Attributes":{"EndpointGroupArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html","Properties":{"EndpointConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-endpointconfigurations","DuplicatesAllowed":true,"ItemType":"EndpointConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"EndpointGroupRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-endpointgroupregion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"HealthCheckIntervalSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-healthcheckintervalseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HealthCheckPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-healthcheckpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HealthCheckPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-healthcheckport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"HealthCheckProtocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-healthcheckprotocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ListenerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-listenerarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PortOverrides":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-portoverrides","DuplicatesAllowed":true,"ItemType":"PortOverride","Required":false,"Type":"List","UpdateType":"Mutable"},"ThresholdCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-thresholdcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TrafficDialPercentage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-endpointgroup.html#cfn-globalaccelerator-endpointgroup-trafficdialpercentage","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"}}},"AWS::GlobalAccelerator::Listener":{"Attributes":{"ListenerArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-listener.html","Properties":{"AcceleratorArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-listener.html#cfn-globalaccelerator-listener-acceleratorarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ClientAffinity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-listener.html#cfn-globalaccelerator-listener-clientaffinity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PortRanges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-listener.html#cfn-globalaccelerator-listener-portranges","DuplicatesAllowed":true,"ItemType":"PortRange","Required":true,"Type":"List","UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-globalaccelerator-listener.html#cfn-globalaccelerator-listener-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Glue::Classifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html","Properties":{"CsvClassifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html#cfn-glue-classifier-csvclassifier","Required":false,"Type":"CsvClassifier","UpdateType":"Mutable"},"GrokClassifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html#cfn-glue-classifier-grokclassifier","Required":false,"Type":"GrokClassifier","UpdateType":"Mutable"},"JsonClassifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html#cfn-glue-classifier-jsonclassifier","Required":false,"Type":"JsonClassifier","UpdateType":"Mutable"},"XMLClassifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-classifier.html#cfn-glue-classifier-xmlclassifier","Required":false,"Type":"XMLClassifier","UpdateType":"Mutable"}}},"AWS::Glue::Connection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-connection.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-connection.html#cfn-glue-connection-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConnectionInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-connection.html#cfn-glue-connection-connectioninput","Required":true,"Type":"ConnectionInput","UpdateType":"Mutable"}}},"AWS::Glue::Crawler":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html","Properties":{"Classifiers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-classifiers","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-configuration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CrawlerSecurityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-crawlersecurityconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RecrawlPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-recrawlpolicy","Required":false,"Type":"RecrawlPolicy","UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-role","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-schedule","Required":false,"Type":"Schedule","UpdateType":"Mutable"},"SchemaChangePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-schemachangepolicy","Required":false,"Type":"SchemaChangePolicy","UpdateType":"Mutable"},"TablePrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-tableprefix","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-targets","Required":true,"Type":"Targets","UpdateType":"Mutable"}}},"AWS::Glue::DataCatalogEncryptionSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-datacatalogencryptionsettings.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-datacatalogencryptionsettings.html#cfn-glue-datacatalogencryptionsettings-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DataCatalogEncryptionSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-datacatalogencryptionsettings.html#cfn-glue-datacatalogencryptionsettings-datacatalogencryptionsettings","Required":true,"Type":"DataCatalogEncryptionSettings","UpdateType":"Mutable"}}},"AWS::Glue::DataQualityRuleset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-dataqualityruleset.html","Properties":{"ClientToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-dataqualityruleset.html#cfn-glue-dataqualityruleset-clienttoken","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-dataqualityruleset.html#cfn-glue-dataqualityruleset-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-dataqualityruleset.html#cfn-glue-dataqualityruleset-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ruleset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-dataqualityruleset.html#cfn-glue-dataqualityruleset-ruleset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-dataqualityruleset.html#cfn-glue-dataqualityruleset-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TargetTable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-dataqualityruleset.html#cfn-glue-dataqualityruleset-targettable","Required":false,"Type":"DataQualityTargetTable","UpdateType":"Mutable"}}},"AWS::Glue::Database":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-database.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-database.html#cfn-glue-database-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatabaseInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-database.html#cfn-glue-database-databaseinput","Required":true,"Type":"DatabaseInput","UpdateType":"Mutable"}}},"AWS::Glue::DevEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html","Properties":{"Arguments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-arguments","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-endpointname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ExtraJarsS3Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-extrajarss3path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExtraPythonLibsS3Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-extrapythonlibss3path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlueVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-glueversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumberOfNodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-numberofnodes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NumberOfWorkers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-numberofworkers","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PublicKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-publickey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PublicKeys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-publickeys","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecurityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-securityconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-securitygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"WorkerType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-devendpoint.html#cfn-glue-devendpoint-workertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Job":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html","Properties":{"AllocatedCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-allocatedcapacity","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Command":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-command","Required":true,"Type":"JobCommand","UpdateType":"Mutable"},"Connections":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-connections","Required":false,"Type":"ConnectionsList","UpdateType":"Mutable"},"DefaultArguments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-defaultarguments","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExecutionClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-executionclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExecutionProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-executionproperty","Required":false,"Type":"ExecutionProperty","UpdateType":"Mutable"},"GlueVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-glueversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-loguri","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-maxcapacity","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaxRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-maxretries","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NonOverridableArguments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-nonoverridablearguments","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"NotificationProperty":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-notificationproperty","Required":false,"Type":"NotificationProperty","UpdateType":"Mutable"},"NumberOfWorkers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-numberofworkers","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-role","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecurityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-securityconfiguration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-timeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"WorkerType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-job.html#cfn-glue-job-workertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::MLTransform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlueVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-glueversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputRecordTables":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-inputrecordtables","Required":true,"Type":"InputRecordTables","UpdateType":"Immutable"},"MaxCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-maxcapacity","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaxRetries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-maxretries","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NumberOfWorkers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-numberofworkers","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-role","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-timeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TransformEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-transformencryption","Required":false,"Type":"TransformEncryption","UpdateType":"Mutable"},"TransformParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-transformparameters","Required":true,"Type":"TransformParameters","UpdateType":"Mutable"},"WorkerType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-mltransform.html#cfn-glue-mltransform-workertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Glue::Partition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PartitionInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-partitioninput","Required":true,"Type":"PartitionInput","UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-partition.html#cfn-glue-partition-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Glue::Registry":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-registry.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-registry.html#cfn-glue-registry-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-registry.html#cfn-glue-registry-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-registry.html#cfn-glue-registry-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Glue::Schema":{"Attributes":{"Arn":{"PrimitiveType":"String"},"InitialSchemaVersionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schema.html","Properties":{"CheckpointVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schema.html#cfn-glue-schema-checkpointversion","Required":false,"Type":"SchemaVersion","UpdateType":"Mutable"},"Compatibility":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schema.html#cfn-glue-schema-compatibility","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DataFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schema.html#cfn-glue-schema-dataformat","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schema.html#cfn-glue-schema-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schema.html#cfn-glue-schema-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Registry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schema.html#cfn-glue-schema-registry","Required":false,"Type":"Registry","UpdateType":"Immutable"},"SchemaDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schema.html#cfn-glue-schema-schemadefinition","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schema.html#cfn-glue-schema-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Glue::SchemaVersion":{"Attributes":{"VersionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schemaversion.html","Properties":{"Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schemaversion.html#cfn-glue-schemaversion-schema","Required":true,"Type":"Schema","UpdateType":"Immutable"},"SchemaDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schemaversion.html#cfn-glue-schemaversion-schemadefinition","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Glue::SchemaVersionMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schemaversionmetadata.html","Properties":{"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schemaversionmetadata.html#cfn-glue-schemaversionmetadata-key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SchemaVersionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schemaversionmetadata.html#cfn-glue-schemaversionmetadata-schemaversionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schemaversionmetadata.html#cfn-glue-schemaversionmetadata-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Glue::SecurityConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-securityconfiguration.html","Properties":{"EncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-securityconfiguration.html#cfn-glue-securityconfiguration-encryptionconfiguration","Required":true,"Type":"EncryptionConfiguration","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-securityconfiguration.html#cfn-glue-securityconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Glue::Table":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html#cfn-glue-table-catalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html#cfn-glue-table-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TableInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html#cfn-glue-table-tableinput","Required":true,"Type":"TableInput","UpdateType":"Mutable"}}},"AWS::Glue::Trigger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-actions","ItemType":"Action","Required":true,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EventBatchingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-eventbatchingcondition","Required":false,"Type":"EventBatchingCondition","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Predicate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-predicate","Required":false,"Type":"Predicate","UpdateType":"Mutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-schedule","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartOnCreation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-startoncreation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WorkflowName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-trigger.html#cfn-glue-trigger-workflowname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Glue::Workflow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-workflow.html","Properties":{"DefaultRunProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-workflow.html#cfn-glue-workflow-defaultrunproperties","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-workflow.html#cfn-glue-workflow-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxConcurrentRuns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-workflow.html#cfn-glue-workflow-maxconcurrentruns","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-workflow.html#cfn-glue-workflow-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-workflow.html#cfn-glue-workflow-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Grafana::Workspace":{"Attributes":{"CreationTimestamp":{"PrimitiveType":"String"},"Endpoint":{"PrimitiveType":"String"},"GrafanaVersion":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"ModificationTimestamp":{"PrimitiveType":"String"},"SamlConfigurationStatus":{"PrimitiveType":"String"},"SsoClientId":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html","Properties":{"AccountAccessType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-accountaccesstype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AuthenticationProviders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-authenticationproviders","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"ClientToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-clienttoken","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DataSources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-datasources","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GrafanaVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-grafanaversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkAccessControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-networkaccesscontrol","Required":false,"Type":"NetworkAccessControl","UpdateType":"Mutable"},"NotificationDestinations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-notificationdestinations","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"OrganizationRoleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-organizationrolename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OrganizationalUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-organizationalunits","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PermissionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-permissiontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SamlConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-samlconfiguration","Required":false,"Type":"SamlConfiguration","UpdateType":"Mutable"},"StackSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-stacksetname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-grafana-workspace.html#cfn-grafana-workspace-vpcconfiguration","Required":false,"Type":"VpcConfiguration","UpdateType":"Mutable"}}},"AWS::Greengrass::ConnectorDefinition":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LatestVersionArn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinition.html","Properties":{"InitialVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinition.html#cfn-greengrass-connectordefinition-initialversion","Required":false,"Type":"ConnectorDefinitionVersion","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinition.html#cfn-greengrass-connectordefinition-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinition.html#cfn-greengrass-connectordefinition-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Greengrass::ConnectorDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinitionversion.html","Properties":{"ConnectorDefinitionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinitionversion.html#cfn-greengrass-connectordefinitionversion-connectordefinitionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Connectors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-connectordefinitionversion.html#cfn-greengrass-connectordefinitionversion-connectors","ItemType":"Connector","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::CoreDefinition":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LatestVersionArn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinition.html","Properties":{"InitialVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinition.html#cfn-greengrass-coredefinition-initialversion","Required":false,"Type":"CoreDefinitionVersion","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinition.html#cfn-greengrass-coredefinition-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinition.html#cfn-greengrass-coredefinition-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Greengrass::CoreDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinitionversion.html","Properties":{"CoreDefinitionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinitionversion.html#cfn-greengrass-coredefinitionversion-coredefinitionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Cores":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-coredefinitionversion.html#cfn-greengrass-coredefinitionversion-cores","ItemType":"Core","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::DeviceDefinition":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LatestVersionArn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinition.html","Properties":{"InitialVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinition.html#cfn-greengrass-devicedefinition-initialversion","Required":false,"Type":"DeviceDefinitionVersion","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinition.html#cfn-greengrass-devicedefinition-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinition.html#cfn-greengrass-devicedefinition-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Greengrass::DeviceDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinitionversion.html","Properties":{"DeviceDefinitionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinitionversion.html#cfn-greengrass-devicedefinitionversion-devicedefinitionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Devices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-devicedefinitionversion.html#cfn-greengrass-devicedefinitionversion-devices","ItemType":"Device","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::FunctionDefinition":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LatestVersionArn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinition.html","Properties":{"InitialVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinition.html#cfn-greengrass-functiondefinition-initialversion","Required":false,"Type":"FunctionDefinitionVersion","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinition.html#cfn-greengrass-functiondefinition-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinition.html#cfn-greengrass-functiondefinition-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Greengrass::FunctionDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html","Properties":{"DefaultConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html#cfn-greengrass-functiondefinitionversion-defaultconfig","Required":false,"Type":"DefaultConfig","UpdateType":"Immutable"},"FunctionDefinitionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html#cfn-greengrass-functiondefinitionversion-functiondefinitionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Functions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-functiondefinitionversion.html#cfn-greengrass-functiondefinitionversion-functions","ItemType":"Function","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::Group":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LatestVersionArn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"},"RoleArn":{"PrimitiveType":"String"},"RoleAttachedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html","Properties":{"InitialVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html#cfn-greengrass-group-initialversion","Required":false,"Type":"GroupVersion","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html#cfn-greengrass-group-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html#cfn-greengrass-group-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-group.html#cfn-greengrass-group-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Greengrass::GroupVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html","Properties":{"ConnectorDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-connectordefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CoreDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-coredefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeviceDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-devicedefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FunctionDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-functiondefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-groupid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LoggerDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-loggerdefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourceDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-resourcedefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubscriptionDefinitionVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-groupversion.html#cfn-greengrass-groupversion-subscriptiondefinitionversionarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Greengrass::LoggerDefinition":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LatestVersionArn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinition.html","Properties":{"InitialVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinition.html#cfn-greengrass-loggerdefinition-initialversion","Required":false,"Type":"LoggerDefinitionVersion","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinition.html#cfn-greengrass-loggerdefinition-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinition.html#cfn-greengrass-loggerdefinition-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Greengrass::LoggerDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinitionversion.html","Properties":{"LoggerDefinitionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinitionversion.html#cfn-greengrass-loggerdefinitionversion-loggerdefinitionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Loggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-loggerdefinitionversion.html#cfn-greengrass-loggerdefinitionversion-loggers","ItemType":"Logger","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::ResourceDefinition":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LatestVersionArn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinition.html","Properties":{"InitialVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinition.html#cfn-greengrass-resourcedefinition-initialversion","Required":false,"Type":"ResourceDefinitionVersion","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinition.html#cfn-greengrass-resourcedefinition-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinition.html#cfn-greengrass-resourcedefinition-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Greengrass::ResourceDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinitionversion.html","Properties":{"ResourceDefinitionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinitionversion.html#cfn-greengrass-resourcedefinitionversion-resourcedefinitionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-resourcedefinitionversion.html#cfn-greengrass-resourcedefinitionversion-resources","ItemType":"ResourceInstance","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::Greengrass::SubscriptionDefinition":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LatestVersionArn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinition.html","Properties":{"InitialVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinition.html#cfn-greengrass-subscriptiondefinition-initialversion","Required":false,"Type":"SubscriptionDefinitionVersion","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinition.html#cfn-greengrass-subscriptiondefinition-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinition.html#cfn-greengrass-subscriptiondefinition-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Greengrass::SubscriptionDefinitionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinitionversion.html","Properties":{"SubscriptionDefinitionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinitionversion.html#cfn-greengrass-subscriptiondefinitionversion-subscriptiondefinitionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Subscriptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrass-subscriptiondefinitionversion.html#cfn-greengrass-subscriptiondefinitionversion-subscriptions","ItemType":"Subscription","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::GreengrassV2::ComponentVersion":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ComponentName":{"PrimitiveType":"String"},"ComponentVersion":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-componentversion.html","Properties":{"InlineRecipe":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-componentversion.html#cfn-greengrassv2-componentversion-inlinerecipe","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LambdaFunction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-componentversion.html#cfn-greengrassv2-componentversion-lambdafunction","Required":false,"Type":"LambdaFunctionRecipeSource","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-componentversion.html#cfn-greengrassv2-componentversion-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::GreengrassV2::Deployment":{"Attributes":{"DeploymentId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-deployment.html","Properties":{"Components":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-deployment.html#cfn-greengrassv2-deployment-components","ItemType":"ComponentDeploymentSpecification","Required":false,"Type":"Map","UpdateType":"Immutable"},"DeploymentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-deployment.html#cfn-greengrassv2-deployment-deploymentname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeploymentPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-deployment.html#cfn-greengrassv2-deployment-deploymentpolicies","Required":false,"Type":"DeploymentPolicies","UpdateType":"Immutable"},"IotJobConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-deployment.html#cfn-greengrassv2-deployment-iotjobconfiguration","Required":false,"Type":"DeploymentIoTJobConfiguration","UpdateType":"Immutable"},"ParentTargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-deployment.html#cfn-greengrassv2-deployment-parenttargetarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-deployment.html#cfn-greengrassv2-deployment-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"TargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-deployment.html#cfn-greengrassv2-deployment-targetarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::GroundStation::Config":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"Type":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-config.html","Properties":{"ConfigData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-config.html#cfn-groundstation-config-configdata","Required":true,"Type":"ConfigData","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-config.html#cfn-groundstation-config-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-config.html#cfn-groundstation-config-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GroundStation::DataflowEndpointGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-dataflowendpointgroup.html","Properties":{"ContactPostPassDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-dataflowendpointgroup.html#cfn-groundstation-dataflowendpointgroup-contactpostpassdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ContactPrePassDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-dataflowendpointgroup.html#cfn-groundstation-dataflowendpointgroup-contactprepassdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"EndpointDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-dataflowendpointgroup.html#cfn-groundstation-dataflowendpointgroup-endpointdetails","DuplicatesAllowed":true,"ItemType":"EndpointDetails","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-dataflowendpointgroup.html#cfn-groundstation-dataflowendpointgroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GroundStation::MissionProfile":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"Region":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-missionprofile.html","Properties":{"ContactPostPassDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-missionprofile.html#cfn-groundstation-missionprofile-contactpostpassdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ContactPrePassDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-missionprofile.html#cfn-groundstation-missionprofile-contactprepassdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DataflowEdges":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-missionprofile.html#cfn-groundstation-missionprofile-dataflowedges","DuplicatesAllowed":true,"ItemType":"DataflowEdge","Required":true,"Type":"List","UpdateType":"Mutable"},"MinimumViableContactDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-missionprofile.html#cfn-groundstation-missionprofile-minimumviablecontactdurationseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-missionprofile.html#cfn-groundstation-missionprofile-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StreamsKmsKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-missionprofile.html#cfn-groundstation-missionprofile-streamskmskey","Required":false,"Type":"StreamsKmsKey","UpdateType":"Mutable"},"StreamsKmsRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-missionprofile.html#cfn-groundstation-missionprofile-streamskmsrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-missionprofile.html#cfn-groundstation-missionprofile-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TrackingConfigArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-groundstation-missionprofile.html#cfn-groundstation-missionprofile-trackingconfigarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::GuardDuty::Detector":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-detector.html","Properties":{"DataSources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-detector.html#cfn-guardduty-detector-datasources","Required":false,"Type":"CFNDataSourceConfigurations","UpdateType":"Mutable"},"Enable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-detector.html#cfn-guardduty-detector-enable","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Features":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-detector.html#cfn-guardduty-detector-features","ItemType":"FeatureConfigurations","Required":false,"Type":"List","UpdateType":"Mutable"},"FindingPublishingFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-detector.html#cfn-guardduty-detector-findingpublishingfrequency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-detector.html#cfn-guardduty-detector-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GuardDuty::Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-filter.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-filter.html#cfn-guardduty-filter-action","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-filter.html#cfn-guardduty-filter-description","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DetectorId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-filter.html#cfn-guardduty-filter-detectorid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FindingCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-filter.html#cfn-guardduty-filter-findingcriteria","Required":true,"Type":"FindingCriteria","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-filter.html#cfn-guardduty-filter-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Rank":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-filter.html#cfn-guardduty-filter-rank","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-filter.html#cfn-guardduty-filter-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GuardDuty::IPSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-ipset.html","Properties":{"Activate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-ipset.html#cfn-guardduty-ipset-activate","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"DetectorId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-ipset.html#cfn-guardduty-ipset-detectorid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-ipset.html#cfn-guardduty-ipset-format","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-ipset.html#cfn-guardduty-ipset-location","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-ipset.html#cfn-guardduty-ipset-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-ipset.html#cfn-guardduty-ipset-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::GuardDuty::Master":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-master.html","Properties":{"DetectorId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-master.html#cfn-guardduty-master-detectorid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InvitationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-master.html#cfn-guardduty-master-invitationid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MasterId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-master.html#cfn-guardduty-master-masterid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::GuardDuty::Member":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-member.html","Properties":{"DetectorId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-member.html#cfn-guardduty-member-detectorid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DisableEmailNotification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-member.html#cfn-guardduty-member-disableemailnotification","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Email":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-member.html#cfn-guardduty-member-email","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MemberId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-member.html#cfn-guardduty-member-memberid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Message":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-member.html#cfn-guardduty-member-message","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-member.html#cfn-guardduty-member-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::GuardDuty::ThreatIntelSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-threatintelset.html","Properties":{"Activate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-threatintelset.html#cfn-guardduty-threatintelset-activate","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"DetectorId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-threatintelset.html#cfn-guardduty-threatintelset-detectorid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Format":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-threatintelset.html#cfn-guardduty-threatintelset-format","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-threatintelset.html#cfn-guardduty-threatintelset-location","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-threatintelset.html#cfn-guardduty-threatintelset-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-guardduty-threatintelset.html#cfn-guardduty-threatintelset-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::HealthLake::FHIRDatastore":{"Attributes":{"CreatedAt":{"Type":"CreatedAt"},"CreatedAt.Nanos":{"PrimitiveType":"Integer"},"CreatedAt.Seconds":{"PrimitiveType":"String"},"DatastoreArn":{"PrimitiveType":"String"},"DatastoreEndpoint":{"PrimitiveType":"String"},"DatastoreId":{"PrimitiveType":"String"},"DatastoreStatus":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html","Properties":{"DatastoreName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html#cfn-healthlake-fhirdatastore-datastorename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DatastoreTypeVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html#cfn-healthlake-fhirdatastore-datastoretypeversion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IdentityProviderConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html#cfn-healthlake-fhirdatastore-identityproviderconfiguration","Required":false,"Type":"IdentityProviderConfiguration","UpdateType":"Immutable"},"PreloadDataConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html#cfn-healthlake-fhirdatastore-preloaddataconfig","Required":false,"Type":"PreloadDataConfig","UpdateType":"Immutable"},"SseConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html#cfn-healthlake-fhirdatastore-sseconfiguration","Required":false,"Type":"SseConfiguration","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html#cfn-healthlake-fhirdatastore-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IAM::AccessKey":{"Attributes":{"SecretAccessKey":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-accesskey.html","Properties":{"Serial":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-accesskey.html#cfn-iam-accesskey-serial","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-accesskey.html#cfn-iam-accesskey-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-accesskey.html#cfn-iam-accesskey-username","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IAM::Group":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html","Properties":{"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html#cfn-iam-group-groupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ManagedPolicyArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html#cfn-iam-group-managepolicyarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"ScrutinyType":"ManagedPolicies","Type":"List","UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html#cfn-iam-group-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Policies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html#cfn-iam-group-policies","DuplicatesAllowed":false,"ItemType":"Policy","Required":false,"ScrutinyType":"InlineIdentityPolicies","Type":"List","UpdateType":"Mutable"}}},"AWS::IAM::InstanceProfile":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html","Properties":{"InstanceProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html#cfn-iam-instanceprofile-instanceprofilename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html#cfn-iam-instanceprofile-path","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Roles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html#cfn-iam-instanceprofile-roles","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::IAM::ManagedPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-managedpolicy.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-managedpolicy.html#cfn-iam-managedpolicy-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-managedpolicy.html#cfn-iam-managedpolicy-groups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ManagedPolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-managedpolicy.html#cfn-iam-managedpolicy-managedpolicyname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-managedpolicy.html#cfn-ec2-dhcpoptions-path","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-managedpolicy.html#cfn-iam-managedpolicy-policydocument","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Roles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-managedpolicy.html#cfn-iam-managedpolicy-roles","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Users":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-managedpolicy.html#cfn-iam-managedpolicy-users","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}},"ScrutinyType":"IdentityPolicyResource"},"AWS::IAM::OIDCProvider":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-oidcprovider.html","Properties":{"ClientIdList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-oidcprovider.html#cfn-iam-oidcprovider-clientidlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-oidcprovider.html#cfn-iam-oidcprovider-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ThumbprintList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-oidcprovider.html#cfn-iam-oidcprovider-thumbprintlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-oidcprovider.html#cfn-iam-oidcprovider-url","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IAM::Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html","Properties":{"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html#cfn-iam-policy-groups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html#cfn-iam-policy-policydocument","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html#cfn-iam-policy-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Roles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html#cfn-iam-policy-roles","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Users":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html#cfn-iam-policy-users","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}},"ScrutinyType":"IdentityPolicyResource"},"AWS::IAM::Role":{"Attributes":{"Arn":{"PrimitiveType":"String"},"RoleId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html","Properties":{"AssumeRolePolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-assumerolepolicydocument","PrimitiveType":"Json","Required":true,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ManagedPolicyArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-managepolicyarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"ScrutinyType":"ManagedPolicies","Type":"List","UpdateType":"Mutable"},"MaxSessionDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-maxsessionduration","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-path","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PermissionsBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-permissionsboundary","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Policies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-policies","DuplicatesAllowed":true,"ItemType":"Policy","Required":false,"ScrutinyType":"InlineIdentityPolicies","Type":"List","UpdateType":"Mutable"},"RoleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-rolename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IAM::SAMLProvider":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html#cfn-iam-samlprovider-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SamlMetadataDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html#cfn-iam-samlprovider-samlmetadatadocument","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html#cfn-iam-samlprovider-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IAM::ServerCertificate":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servercertificate.html","Properties":{"CertificateBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servercertificate.html#cfn-iam-servercertificate-certificatebody","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CertificateChain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servercertificate.html#cfn-iam-servercertificate-certificatechain","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servercertificate.html#cfn-iam-servercertificate-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servercertificate.html#cfn-iam-servercertificate-privatekey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServerCertificateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servercertificate.html#cfn-iam-servercertificate-servercertificatename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servercertificate.html#cfn-iam-servercertificate-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IAM::ServiceLinkedRole":{"Attributes":{"RoleName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servicelinkedrole.html","Properties":{"AWSServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servicelinkedrole.html#cfn-iam-servicelinkedrole-awsservicename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CustomSuffix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servicelinkedrole.html#cfn-iam-servicelinkedrole-customsuffix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servicelinkedrole.html#cfn-iam-servicelinkedrole-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IAM::User":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html","Properties":{"Groups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html#cfn-iam-user-groups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"LoginProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html#cfn-iam-user-loginprofile","Required":false,"Type":"LoginProfile","UpdateType":"Mutable"},"ManagedPolicyArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html#cfn-iam-user-managepolicyarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"ScrutinyType":"ManagedPolicies","Type":"List","UpdateType":"Mutable"},"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html#cfn-iam-user-path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PermissionsBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html#cfn-iam-user-permissionsboundary","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Policies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html#cfn-iam-user-policies","DuplicatesAllowed":true,"ItemType":"Policy","Required":false,"ScrutinyType":"InlineIdentityPolicies","Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html#cfn-iam-user-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html#cfn-iam-user-username","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IAM::UserToGroupAddition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-addusertogroup.html","Properties":{"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-addusertogroup.html#cfn-iam-addusertogroup-groupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Users":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-addusertogroup.html#cfn-iam-addusertogroup-users","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::IAM::VirtualMFADevice":{"Attributes":{"SerialNumber":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-virtualmfadevice.html","Properties":{"Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-virtualmfadevice.html#cfn-iam-virtualmfadevice-path","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-virtualmfadevice.html#cfn-iam-virtualmfadevice-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Users":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-virtualmfadevice.html#cfn-iam-virtualmfadevice-users","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"VirtualMfaDeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-virtualmfadevice.html#cfn-iam-virtualmfadevice-virtualmfadevicename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IVS::Channel":{"Attributes":{"Arn":{"PrimitiveType":"String"},"IngestEndpoint":{"PrimitiveType":"String"},"PlaybackUrl":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html","Properties":{"Authorized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-authorized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InsecureIngest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-insecureingest","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LatencyMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-latencymode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Preset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-preset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RecordingConfigurationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-recordingconfigurationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html#cfn-ivs-channel-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IVS::PlaybackKeyPair":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Fingerprint":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-playbackkeypair.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-playbackkeypair.html#cfn-ivs-playbackkeypair-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PublicKeyMaterial":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-playbackkeypair.html#cfn-ivs-playbackkeypair-publickeymaterial","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-playbackkeypair.html#cfn-ivs-playbackkeypair-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IVS::RecordingConfiguration":{"Attributes":{"Arn":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-recordingconfiguration.html","Properties":{"DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-recordingconfiguration.html#cfn-ivs-recordingconfiguration-destinationconfiguration","Required":true,"Type":"DestinationConfiguration","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-recordingconfiguration.html#cfn-ivs-recordingconfiguration-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RecordingReconnectWindowSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-recordingconfiguration.html#cfn-ivs-recordingconfiguration-recordingreconnectwindowseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-recordingconfiguration.html#cfn-ivs-recordingconfiguration-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ThumbnailConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-recordingconfiguration.html#cfn-ivs-recordingconfiguration-thumbnailconfiguration","Required":false,"Type":"ThumbnailConfiguration","UpdateType":"Immutable"}}},"AWS::IVS::StreamKey":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Value":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-streamkey.html","Properties":{"ChannelArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-streamkey.html#cfn-ivs-streamkey-channelarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-streamkey.html#cfn-ivs-streamkey-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IVSChat::LoggingConfiguration":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivschat-loggingconfiguration.html","Properties":{"DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivschat-loggingconfiguration.html#cfn-ivschat-loggingconfiguration-destinationconfiguration","Required":true,"Type":"DestinationConfiguration","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivschat-loggingconfiguration.html#cfn-ivschat-loggingconfiguration-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivschat-loggingconfiguration.html#cfn-ivschat-loggingconfiguration-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IVSChat::Room":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivschat-room.html","Properties":{"LoggingConfigurationIdentifiers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivschat-room.html#cfn-ivschat-room-loggingconfigurationidentifiers","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MaximumMessageLength":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivschat-room.html#cfn-ivschat-room-maximummessagelength","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumMessageRatePerSecond":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivschat-room.html#cfn-ivschat-room-maximummessageratepersecond","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MessageReviewHandler":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivschat-room.html#cfn-ivschat-room-messagereviewhandler","Required":false,"Type":"MessageReviewHandler","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivschat-room.html#cfn-ivschat-room-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivschat-room.html#cfn-ivschat-room-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IdentityStore::Group":{"Attributes":{"GroupId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-identitystore-group.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-identitystore-group.html#cfn-identitystore-group-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-identitystore-group.html#cfn-identitystore-group-displayname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IdentityStoreId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-identitystore-group.html#cfn-identitystore-group-identitystoreid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IdentityStore::GroupMembership":{"Attributes":{"MembershipId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-identitystore-groupmembership.html","Properties":{"GroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-identitystore-groupmembership.html#cfn-identitystore-groupmembership-groupid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"IdentityStoreId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-identitystore-groupmembership.html#cfn-identitystore-groupmembership-identitystoreid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MemberId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-identitystore-groupmembership.html#cfn-identitystore-groupmembership-memberid","Required":true,"Type":"MemberId","UpdateType":"Mutable"}}},"AWS::ImageBuilder::Component":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Encrypted":{"PrimitiveType":"Boolean"},"Name":{"PrimitiveType":"String"},"Type":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-component.html","Properties":{"ChangeDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-component.html#cfn-imagebuilder-component-changedescription","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Data":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-component.html#cfn-imagebuilder-component-data","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-component.html#cfn-imagebuilder-component-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-component.html#cfn-imagebuilder-component-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-component.html#cfn-imagebuilder-component-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Platform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-component.html#cfn-imagebuilder-component-platform","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SupportedOsVersions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-component.html#cfn-imagebuilder-component-supportedosversions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-component.html#cfn-imagebuilder-component-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Uri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-component.html#cfn-imagebuilder-component-uri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-component.html#cfn-imagebuilder-component-version","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::ContainerRecipe":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html","Properties":{"Components":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-components","DuplicatesAllowed":true,"ItemType":"ComponentConfiguration","Required":true,"Type":"List","UpdateType":"Immutable"},"ContainerType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-containertype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DockerfileTemplateData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-dockerfiletemplatedata","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DockerfileTemplateUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-dockerfiletemplateuri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ImageOsVersionOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-imageosversionoverride","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-instanceconfiguration","Required":false,"Type":"InstanceConfiguration","UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ParentImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-parentimage","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PlatformOverride":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-platformoverride","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"TargetRepository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-targetrepository","Required":true,"Type":"TargetContainerRepository","UpdateType":"Immutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-version","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WorkingDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-containerrecipe.html#cfn-imagebuilder-containerrecipe-workingdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::DistributionConfiguration":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-distributionconfiguration.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-distributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Distributions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-distributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-distributions","DuplicatesAllowed":true,"ItemType":"Distribution","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-distributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-distributionconfiguration.html#cfn-imagebuilder-distributionconfiguration-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::ImageBuilder::Image":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ImageId":{"PrimitiveType":"String"},"ImageUri":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-image.html","Properties":{"ContainerRecipeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-image.html#cfn-imagebuilder-image-containerrecipearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DistributionConfigurationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-image.html#cfn-imagebuilder-image-distributionconfigurationarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EnhancedImageMetadataEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-image.html#cfn-imagebuilder-image-enhancedimagemetadataenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ImageRecipeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-image.html#cfn-imagebuilder-image-imagerecipearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ImageScanningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-image.html#cfn-imagebuilder-image-imagescanningconfiguration","Required":false,"Type":"ImageScanningConfiguration","UpdateType":"Immutable"},"ImageTestsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-image.html#cfn-imagebuilder-image-imagetestsconfiguration","Required":false,"Type":"ImageTestsConfiguration","UpdateType":"Immutable"},"InfrastructureConfigurationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-image.html#cfn-imagebuilder-image-infrastructureconfigurationarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-image.html#cfn-imagebuilder-image-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::ImageBuilder::ImagePipeline":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html","Properties":{"ContainerRecipeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-containerrecipearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DistributionConfigurationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-distributionconfigurationarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnhancedImageMetadataEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-enhancedimagemetadataenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ImageRecipeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-imagerecipearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageScanningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-imagescanningconfiguration","Required":false,"Type":"ImageScanningConfiguration","UpdateType":"Mutable"},"ImageTestsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-imagetestsconfiguration","Required":false,"Type":"ImageTestsConfiguration","UpdateType":"Mutable"},"InfrastructureConfigurationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-infrastructureconfigurationarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-schedule","Required":false,"Type":"Schedule","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagepipeline.html#cfn-imagebuilder-imagepipeline-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::ImageBuilder::ImageRecipe":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html","Properties":{"AdditionalInstanceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html#cfn-imagebuilder-imagerecipe-additionalinstanceconfiguration","Required":false,"Type":"AdditionalInstanceConfiguration","UpdateType":"Mutable"},"BlockDeviceMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html#cfn-imagebuilder-imagerecipe-blockdevicemappings","DuplicatesAllowed":true,"ItemType":"InstanceBlockDeviceMapping","Required":false,"Type":"List","UpdateType":"Immutable"},"Components":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html#cfn-imagebuilder-imagerecipe-components","DuplicatesAllowed":true,"ItemType":"ComponentConfiguration","Required":true,"Type":"List","UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html#cfn-imagebuilder-imagerecipe-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html#cfn-imagebuilder-imagerecipe-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ParentImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html#cfn-imagebuilder-imagerecipe-parentimage","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html#cfn-imagebuilder-imagerecipe-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Version":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html#cfn-imagebuilder-imagerecipe-version","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WorkingDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html#cfn-imagebuilder-imagerecipe-workingdirectory","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ImageBuilder::InfrastructureConfiguration":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceMetadataOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-instancemetadataoptions","Required":false,"Type":"InstanceMetadataOptions","UpdateType":"Mutable"},"InstanceProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-instanceprofilename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InstanceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-instancetypes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"KeyPair":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-keypair","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-logging","Required":false,"Type":"Logging","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-resourcetags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SnsTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-snstopicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"TerminateInstanceOnFailure":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-terminateinstanceonfailure","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Inspector::AssessmentTarget":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspector-assessmenttarget.html","Properties":{"AssessmentTargetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspector-assessmenttarget.html#cfn-inspector-assessmenttarget-assessmenttargetname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourceGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspector-assessmenttarget.html#cfn-inspector-assessmenttarget-resourcegrouparn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Inspector::AssessmentTemplate":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspector-assessmenttemplate.html","Properties":{"AssessmentTargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspector-assessmenttemplate.html#cfn-inspector-assessmenttemplate-assessmenttargetarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AssessmentTemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspector-assessmenttemplate.html#cfn-inspector-assessmenttemplate-assessmenttemplatename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DurationInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspector-assessmenttemplate.html#cfn-inspector-assessmenttemplate-durationinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"RulesPackageArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspector-assessmenttemplate.html#cfn-inspector-assessmenttemplate-rulespackagearns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"UserAttributesForFindings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspector-assessmenttemplate.html#cfn-inspector-assessmenttemplate-userattributesforfindings","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Inspector::ResourceGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspector-resourcegroup.html","Properties":{"ResourceGroupTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspector-resourcegroup.html#cfn-inspector-resourcegroup-resourcegrouptags","DuplicatesAllowed":true,"ItemType":"Tag","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::InspectorV2::Filter":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspectorv2-filter.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspectorv2-filter.html#cfn-inspectorv2-filter-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilterAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspectorv2-filter.html#cfn-inspectorv2-filter-filteraction","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FilterCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspectorv2-filter.html#cfn-inspectorv2-filter-filtercriteria","Required":true,"Type":"FilterCriteria","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspectorv2-filter.html#cfn-inspectorv2-filter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::InternetMonitor::Monitor":{"Attributes":{"CreatedAt":{"PrimitiveType":"String"},"ModifiedAt":{"PrimitiveType":"String"},"MonitorArn":{"PrimitiveType":"String"},"ProcessingStatus":{"PrimitiveType":"String"},"ProcessingStatusInfo":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-internetmonitor-monitor.html","Properties":{"HealthEventsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-internetmonitor-monitor.html#cfn-internetmonitor-monitor-healtheventsconfig","Required":false,"Type":"HealthEventsConfig","UpdateType":"Mutable"},"InternetMeasurementsLogDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-internetmonitor-monitor.html#cfn-internetmonitor-monitor-internetmeasurementslogdelivery","Required":false,"Type":"InternetMeasurementsLogDelivery","UpdateType":"Mutable"},"MaxCityNetworksToMonitor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-internetmonitor-monitor.html#cfn-internetmonitor-monitor-maxcitynetworkstomonitor","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MonitorName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-internetmonitor-monitor.html#cfn-internetmonitor-monitor-monitorname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-internetmonitor-monitor.html#cfn-internetmonitor-monitor-resources","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourcesToAdd":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-internetmonitor-monitor.html#cfn-internetmonitor-monitor-resourcestoadd","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourcesToRemove":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-internetmonitor-monitor.html#cfn-internetmonitor-monitor-resourcestoremove","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-internetmonitor-monitor.html#cfn-internetmonitor-monitor-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-internetmonitor-monitor.html#cfn-internetmonitor-monitor-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TrafficPercentageToMonitor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-internetmonitor-monitor.html#cfn-internetmonitor-monitor-trafficpercentagetomonitor","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT1Click::Device":{"Attributes":{"Arn":{"PrimitiveType":"String"},"DeviceId":{"PrimitiveType":"String"},"Enabled":{"PrimitiveType":"Boolean"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-device.html","Properties":{"DeviceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-device.html#cfn-iot1click-device-deviceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-device.html#cfn-iot1click-device-enabled","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT1Click::Placement":{"Attributes":{"PlacementName":{"PrimitiveType":"String"},"ProjectName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-placement.html","Properties":{"AssociatedDevices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-placement.html#cfn-iot1click-placement-associateddevices","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-placement.html#cfn-iot1click-placement-attributes","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"PlacementName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-placement.html#cfn-iot1click-placement-placementname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProjectName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-placement.html#cfn-iot1click-placement-projectname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoT1Click::Project":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ProjectName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-project.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-project.html#cfn-iot1click-project-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PlacementTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-project.html#cfn-iot1click-project-placementtemplate","Required":true,"Type":"PlacementTemplate","UpdateType":"Mutable"},"ProjectName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot1click-project.html#cfn-iot1click-project-projectname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IoT::AccountAuditConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-accountauditconfiguration.html","Properties":{"AccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-accountauditconfiguration.html#cfn-iot-accountauditconfiguration-accountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AuditCheckConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-accountauditconfiguration.html#cfn-iot-accountauditconfiguration-auditcheckconfigurations","Required":true,"Type":"AuditCheckConfigurations","UpdateType":"Mutable"},"AuditNotificationTargetConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-accountauditconfiguration.html#cfn-iot-accountauditconfiguration-auditnotificationtargetconfigurations","Required":false,"Type":"AuditNotificationTargetConfigurations","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-accountauditconfiguration.html#cfn-iot-accountauditconfiguration-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::Authorizer":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-authorizer.html","Properties":{"AuthorizerFunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-authorizer.html#cfn-iot-authorizer-authorizerfunctionarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AuthorizerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-authorizer.html#cfn-iot-authorizer-authorizername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EnableCachingForHttp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-authorizer.html#cfn-iot-authorizer-enablecachingforhttp","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SigningDisabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-authorizer.html#cfn-iot-authorizer-signingdisabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-authorizer.html#cfn-iot-authorizer-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-authorizer.html#cfn-iot-authorizer-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TokenKeyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-authorizer.html#cfn-iot-authorizer-tokenkeyname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenSigningPublicKeys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-authorizer.html#cfn-iot-authorizer-tokensigningpublickeys","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::IoT::BillingGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-billinggroup.html","Properties":{"BillingGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-billinggroup.html#cfn-iot-billinggroup-billinggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BillingGroupProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-billinggroup.html#cfn-iot-billinggroup-billinggroupproperties","Required":false,"Type":"BillingGroupProperties","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-billinggroup.html#cfn-iot-billinggroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::CACertificate":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-cacertificate.html","Properties":{"AutoRegistrationStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-cacertificate.html#cfn-iot-cacertificate-autoregistrationstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CACertificatePem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-cacertificate.html#cfn-iot-cacertificate-cacertificatepem","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CertificateMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-cacertificate.html#cfn-iot-cacertificate-certificatemode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RegistrationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-cacertificate.html#cfn-iot-cacertificate-registrationconfig","Required":false,"Type":"RegistrationConfig","UpdateType":"Mutable"},"RemoveAutoRegistration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-cacertificate.html#cfn-iot-cacertificate-removeautoregistration","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-cacertificate.html#cfn-iot-cacertificate-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-cacertificate.html#cfn-iot-cacertificate-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VerificationCertificatePem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-cacertificate.html#cfn-iot-cacertificate-verificationcertificatepem","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IoT::Certificate":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-certificate.html","Properties":{"CACertificatePem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-certificate.html#cfn-iot-certificate-cacertificatepem","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CertificateMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-certificate.html#cfn-iot-certificate-certificatemode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CertificatePem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-certificate.html#cfn-iot-certificate-certificatepem","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CertificateSigningRequest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-certificate.html#cfn-iot-certificate-certificatesigningrequest","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-certificate.html#cfn-iot-certificate-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::CustomMetric":{"Attributes":{"MetricArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-custommetric.html","Properties":{"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-custommetric.html#cfn-iot-custommetric-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-custommetric.html#cfn-iot-custommetric-metricname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MetricType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-custommetric.html#cfn-iot-custommetric-metrictype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-custommetric.html#cfn-iot-custommetric-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::Dimension":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-dimension.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-dimension.html#cfn-iot-dimension-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StringValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-dimension.html#cfn-iot-dimension-stringvalues","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-dimension.html#cfn-iot-dimension-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-dimension.html#cfn-iot-dimension-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoT::DomainConfiguration":{"Attributes":{"Arn":{"PrimitiveType":"String"},"DomainType":{"PrimitiveType":"String"},"ServerCertificates":{"ItemType":"ServerCertificateSummary","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html","Properties":{"AuthorizerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-authorizerconfig","Required":false,"Type":"AuthorizerConfig","UpdateType":"Mutable"},"DomainConfigurationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-domainconfigurationname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DomainConfigurationStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-domainconfigurationstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-domainname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServerCertificateArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-servercertificatearns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ServiceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-servicetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TlsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-tlsconfig","Required":false,"Type":"TlsConfig","UpdateType":"Mutable"},"ValidationCertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-domainconfiguration.html#cfn-iot-domainconfiguration-validationcertificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IoT::FleetMetric":{"Attributes":{"CreationDate":{"PrimitiveType":"Double"},"LastModifiedDate":{"PrimitiveType":"Double"},"MetricArn":{"PrimitiveType":"String"},"Version":{"PrimitiveType":"Double"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html","Properties":{"AggregationField":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-aggregationfield","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AggregationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-aggregationtype","Required":false,"Type":"AggregationType","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-indexname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Period":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-period","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"QueryString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-querystring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"QueryVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-queryversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Unit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-unit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::IoT::JobTemplate":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html","Properties":{"AbortConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-abortconfig","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-description","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Document":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-document","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DocumentSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-documentsource","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"JobArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-jobarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"JobExecutionsRetryConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-jobexecutionsretryconfig","Required":false,"Type":"JobExecutionsRetryConfig","UpdateType":"Mutable"},"JobExecutionsRolloutConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-jobexecutionsrolloutconfig","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"JobTemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-jobtemplateid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MaintenanceWindows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-maintenancewindows","DuplicatesAllowed":true,"ItemType":"MaintenanceWindow","Required":false,"Type":"List","UpdateType":"Mutable"},"PresignedUrlConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-presignedurlconfig","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"TimeoutConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-timeoutconfig","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"}}},"AWS::IoT::Logging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-logging.html","Properties":{"AccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-logging.html#cfn-iot-logging-accountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DefaultLogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-logging.html#cfn-iot-logging-defaultloglevel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-logging.html#cfn-iot-logging-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoT::MitigationAction":{"Attributes":{"MitigationActionArn":{"PrimitiveType":"String"},"MitigationActionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-mitigationaction.html","Properties":{"ActionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-mitigationaction.html#cfn-iot-mitigationaction-actionname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ActionParams":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-mitigationaction.html#cfn-iot-mitigationaction-actionparams","Required":true,"Type":"ActionParams","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-mitigationaction.html#cfn-iot-mitigationaction-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-mitigationaction.html#cfn-iot-mitigationaction-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::Policy":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-policy.html","Properties":{"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-policy.html#cfn-iot-policy-policydocument","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-policy.html#cfn-iot-policy-policyname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::IoT::PolicyPrincipalAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-policyprincipalattachment.html","Properties":{"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-policyprincipalattachment.html#cfn-iot-policyprincipalattachment-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-policyprincipalattachment.html#cfn-iot-policyprincipalattachment-principal","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoT::ProvisioningTemplate":{"Attributes":{"TemplateArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-provisioningtemplate.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-provisioningtemplate.html#cfn-iot-provisioningtemplate-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-provisioningtemplate.html#cfn-iot-provisioningtemplate-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PreProvisioningHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-provisioningtemplate.html#cfn-iot-provisioningtemplate-preprovisioninghook","Required":false,"Type":"ProvisioningHook","UpdateType":"Mutable"},"ProvisioningRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-provisioningtemplate.html#cfn-iot-provisioningtemplate-provisioningrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-provisioningtemplate.html#cfn-iot-provisioningtemplate-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TemplateBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-provisioningtemplate.html#cfn-iot-provisioningtemplate-templatebody","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-provisioningtemplate.html#cfn-iot-provisioningtemplate-templatename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TemplateType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-provisioningtemplate.html#cfn-iot-provisioningtemplate-templatetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IoT::ResourceSpecificLogging":{"Attributes":{"TargetId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-resourcespecificlogging.html","Properties":{"LogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-resourcespecificlogging.html#cfn-iot-resourcespecificlogging-loglevel","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-resourcespecificlogging.html#cfn-iot-resourcespecificlogging-targetname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TargetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-resourcespecificlogging.html#cfn-iot-resourcespecificlogging-targettype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoT::RoleAlias":{"Attributes":{"RoleAliasArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-rolealias.html","Properties":{"CredentialDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-rolealias.html#cfn-iot-rolealias-credentialdurationseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RoleAlias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-rolealias.html#cfn-iot-rolealias-rolealias","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-rolealias.html#cfn-iot-rolealias-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-rolealias.html#cfn-iot-rolealias-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::ScheduledAudit":{"Attributes":{"ScheduledAuditArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-scheduledaudit.html","Properties":{"DayOfMonth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-scheduledaudit.html#cfn-iot-scheduledaudit-dayofmonth","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DayOfWeek":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-scheduledaudit.html#cfn-iot-scheduledaudit-dayofweek","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Frequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-scheduledaudit.html#cfn-iot-scheduledaudit-frequency","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScheduledAuditName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-scheduledaudit.html#cfn-iot-scheduledaudit-scheduledauditname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-scheduledaudit.html#cfn-iot-scheduledaudit-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetCheckNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-scheduledaudit.html#cfn-iot-scheduledaudit-targetchecknames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::SecurityProfile":{"Attributes":{"SecurityProfileArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-securityprofile.html","Properties":{"AdditionalMetricsToRetainV2":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-securityprofile.html#cfn-iot-securityprofile-additionalmetricstoretainv2","DuplicatesAllowed":false,"ItemType":"MetricToRetain","Required":false,"Type":"List","UpdateType":"Mutable"},"AlertTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-securityprofile.html#cfn-iot-securityprofile-alerttargets","ItemType":"AlertTarget","Required":false,"Type":"Map","UpdateType":"Mutable"},"Behaviors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-securityprofile.html#cfn-iot-securityprofile-behaviors","DuplicatesAllowed":false,"ItemType":"Behavior","Required":false,"Type":"List","UpdateType":"Mutable"},"SecurityProfileDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-securityprofile.html#cfn-iot-securityprofile-securityprofiledescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-securityprofile.html#cfn-iot-securityprofile-securityprofilename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-securityprofile.html#cfn-iot-securityprofile-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-securityprofile.html#cfn-iot-securityprofile-targetarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoT::Thing":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thing.html","Properties":{"AttributePayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thing.html#cfn-iot-thing-attributepayload","Required":false,"Type":"AttributePayload","UpdateType":"Mutable"},"ThingName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thing.html#cfn-iot-thing-thingname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::IoT::ThingGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thinggroup.html","Properties":{"ParentGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thinggroup.html#cfn-iot-thinggroup-parentgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"QueryString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thinggroup.html#cfn-iot-thinggroup-querystring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thinggroup.html#cfn-iot-thinggroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ThingGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thinggroup.html#cfn-iot-thinggroup-thinggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ThingGroupProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thinggroup.html#cfn-iot-thinggroup-thinggroupproperties","Required":false,"Type":"ThingGroupProperties","UpdateType":"Mutable"}}},"AWS::IoT::ThingPrincipalAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thingprincipalattachment.html","Properties":{"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thingprincipalattachment.html#cfn-iot-thingprincipalattachment-principal","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ThingName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thingprincipalattachment.html#cfn-iot-thingprincipalattachment-thingname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoT::ThingType":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thingtype.html","Properties":{"DeprecateThingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thingtype.html#cfn-iot-thingtype-deprecatethingtype","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thingtype.html#cfn-iot-thingtype-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ThingTypeName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thingtype.html#cfn-iot-thingtype-thingtypename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ThingTypeProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-thingtype.html#cfn-iot-thingtype-thingtypeproperties","Required":false,"Type":"ThingTypeProperties","UpdateType":"Immutable"}}},"AWS::IoT::TopicRule":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-topicrule.html","Properties":{"RuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-topicrule.html#cfn-iot-topicrule-rulename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-topicrule.html#cfn-iot-topicrule-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TopicRulePayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-topicrule.html#cfn-iot-topicrule-topicrulepayload","Required":true,"Type":"TopicRulePayload","UpdateType":"Mutable"}}},"AWS::IoT::TopicRuleDestination":{"Attributes":{"Arn":{"PrimitiveType":"String"},"StatusReason":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-topicruledestination.html","Properties":{"HttpUrlProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-topicruledestination.html#cfn-iot-topicruledestination-httpurlproperties","Required":false,"Type":"HttpUrlDestinationSummary","UpdateType":"Immutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-topicruledestination.html#cfn-iot-topicruledestination-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-topicruledestination.html#cfn-iot-topicruledestination-vpcproperties","Required":false,"Type":"VpcDestinationProperties","UpdateType":"Immutable"}}},"AWS::IoTAnalytics::Channel":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-channel.html","Properties":{"ChannelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-channel.html#cfn-iotanalytics-channel-channelname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ChannelStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-channel.html#cfn-iotanalytics-channel-channelstorage","Required":false,"Type":"ChannelStorage","UpdateType":"Mutable"},"RetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-channel.html#cfn-iotanalytics-channel-retentionperiod","Required":false,"Type":"RetentionPeriod","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-channel.html#cfn-iotanalytics-channel-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Dataset":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-dataset.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-dataset.html#cfn-iotanalytics-dataset-actions","DuplicatesAllowed":true,"ItemType":"Action","Required":true,"Type":"List","UpdateType":"Mutable"},"ContentDeliveryRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-dataset.html#cfn-iotanalytics-dataset-contentdeliveryrules","DuplicatesAllowed":true,"ItemType":"DatasetContentDeliveryRule","Required":false,"Type":"List","UpdateType":"Mutable"},"DatasetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-dataset.html#cfn-iotanalytics-dataset-datasetname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LateDataRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-dataset.html#cfn-iotanalytics-dataset-latedatarules","DuplicatesAllowed":true,"ItemType":"LateDataRule","Required":false,"Type":"List","UpdateType":"Mutable"},"RetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-dataset.html#cfn-iotanalytics-dataset-retentionperiod","Required":false,"Type":"RetentionPeriod","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-dataset.html#cfn-iotanalytics-dataset-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Triggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-dataset.html#cfn-iotanalytics-dataset-triggers","DuplicatesAllowed":true,"ItemType":"Trigger","Required":false,"Type":"List","UpdateType":"Mutable"},"VersioningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-dataset.html#cfn-iotanalytics-dataset-versioningconfiguration","Required":false,"Type":"VersioningConfiguration","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Datastore":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-datastore.html","Properties":{"DatastoreName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-datastore.html#cfn-iotanalytics-datastore-datastorename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DatastorePartitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-datastore.html#cfn-iotanalytics-datastore-datastorepartitions","Required":false,"Type":"DatastorePartitions","UpdateType":"Mutable"},"DatastoreStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-datastore.html#cfn-iotanalytics-datastore-datastorestorage","Required":false,"Type":"DatastoreStorage","UpdateType":"Mutable"},"FileFormatConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-datastore.html#cfn-iotanalytics-datastore-fileformatconfiguration","Required":false,"Type":"FileFormatConfiguration","UpdateType":"Mutable"},"RetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-datastore.html#cfn-iotanalytics-datastore-retentionperiod","Required":false,"Type":"RetentionPeriod","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-datastore.html#cfn-iotanalytics-datastore-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTAnalytics::Pipeline":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-pipeline.html","Properties":{"PipelineActivities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-pipeline.html#cfn-iotanalytics-pipeline-pipelineactivities","DuplicatesAllowed":true,"ItemType":"Activity","Required":true,"Type":"List","UpdateType":"Mutable"},"PipelineName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-pipeline.html#cfn-iotanalytics-pipeline-pipelinename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotanalytics-pipeline.html#cfn-iotanalytics-pipeline-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTCoreDeviceAdvisor::SuiteDefinition":{"Attributes":{"SuiteDefinitionArn":{"PrimitiveType":"String"},"SuiteDefinitionId":{"PrimitiveType":"String"},"SuiteDefinitionVersion":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotcoredeviceadvisor-suitedefinition.html","Properties":{"SuiteDefinitionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotcoredeviceadvisor-suitedefinition.html#cfn-iotcoredeviceadvisor-suitedefinition-suitedefinitionconfiguration","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotcoredeviceadvisor-suitedefinition.html#cfn-iotcoredeviceadvisor-suitedefinition-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTEvents::AlarmModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html","Properties":{"AlarmCapabilities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-alarmcapabilities","Required":false,"Type":"AlarmCapabilities","UpdateType":"Mutable"},"AlarmEventActions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-alarmeventactions","Required":false,"Type":"AlarmEventActions","UpdateType":"Mutable"},"AlarmModelDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-alarmmodeldescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AlarmModelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-alarmmodelname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AlarmRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-alarmrule","Required":true,"Type":"AlarmRule","UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-key","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Severity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-severity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTEvents::DetectorModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-detectormodel.html","Properties":{"DetectorModelDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-detectormodel.html#cfn-iotevents-detectormodel-detectormodeldefinition","Required":true,"Type":"DetectorModelDefinition","UpdateType":"Mutable"},"DetectorModelDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-detectormodel.html#cfn-iotevents-detectormodel-detectormodeldescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DetectorModelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-detectormodel.html#cfn-iotevents-detectormodel-detectormodelname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EvaluationMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-detectormodel.html#cfn-iotevents-detectormodel-evaluationmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-detectormodel.html#cfn-iotevents-detectormodel-key","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-detectormodel.html#cfn-iotevents-detectormodel-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-detectormodel.html#cfn-iotevents-detectormodel-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTEvents::Input":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-input.html","Properties":{"InputDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-input.html#cfn-iotevents-input-inputdefinition","Required":true,"Type":"InputDefinition","UpdateType":"Mutable"},"InputDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-input.html#cfn-iotevents-input-inputdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InputName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-input.html#cfn-iotevents-input-inputname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-input.html#cfn-iotevents-input-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTFleetHub::Application":{"Attributes":{"ApplicationArn":{"PrimitiveType":"String"},"ApplicationCreationDate":{"PrimitiveType":"Integer"},"ApplicationId":{"PrimitiveType":"String"},"ApplicationLastUpdateDate":{"PrimitiveType":"Integer"},"ApplicationState":{"PrimitiveType":"String"},"ApplicationUrl":{"PrimitiveType":"String"},"ErrorMessage":{"PrimitiveType":"String"},"SsoClientId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleethub-application.html","Properties":{"ApplicationDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleethub-application.html#cfn-iotfleethub-application-applicationdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleethub-application.html#cfn-iotfleethub-application-applicationname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleethub-application.html#cfn-iotfleethub-application-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleethub-application.html#cfn-iotfleethub-application-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTFleetWise::Campaign":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"LastModificationTime":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-action","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CollectionScheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-collectionscheme","Required":true,"Type":"CollectionScheme","UpdateType":"Immutable"},"Compression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-compression","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DataDestinationConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-datadestinationconfigs","DuplicatesAllowed":true,"ItemType":"DataDestinationConfig","Required":false,"Type":"List","UpdateType":"Mutable"},"DataExtraDimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-dataextradimensions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DiagnosticsMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-diagnosticsmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ExpiryTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-expirytime","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PostTriggerCollectionDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-posttriggercollectionduration","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-priority","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SignalCatalogArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-signalcatalogarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SignalsToCollect":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-signalstocollect","DuplicatesAllowed":true,"ItemType":"SignalInformation","Required":false,"Type":"List","UpdateType":"Mutable"},"SpoolingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-spoolingmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-starttime","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-campaign.html#cfn-iotfleetwise-campaign-targetarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoTFleetWise::DecoderManifest":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"LastModificationTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-decodermanifest.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-decodermanifest.html#cfn-iotfleetwise-decodermanifest-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelManifestArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-decodermanifest.html#cfn-iotfleetwise-decodermanifest-modelmanifestarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-decodermanifest.html#cfn-iotfleetwise-decodermanifest-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NetworkInterfaces":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-decodermanifest.html#cfn-iotfleetwise-decodermanifest-networkinterfaces","DuplicatesAllowed":true,"ItemType":"NetworkInterfacesItems","Required":false,"Type":"List","UpdateType":"Mutable"},"SignalDecoders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-decodermanifest.html#cfn-iotfleetwise-decodermanifest-signaldecoders","DuplicatesAllowed":true,"ItemType":"SignalDecodersItems","Required":false,"Type":"List","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-decodermanifest.html#cfn-iotfleetwise-decodermanifest-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-decodermanifest.html#cfn-iotfleetwise-decodermanifest-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTFleetWise::Fleet":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"LastModificationTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-fleet.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-fleet.html#cfn-iotfleetwise-fleet-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-fleet.html#cfn-iotfleetwise-fleet-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SignalCatalogArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-fleet.html#cfn-iotfleetwise-fleet-signalcatalogarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-fleet.html#cfn-iotfleetwise-fleet-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTFleetWise::ModelManifest":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"LastModificationTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-modelmanifest.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-modelmanifest.html#cfn-iotfleetwise-modelmanifest-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-modelmanifest.html#cfn-iotfleetwise-modelmanifest-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Nodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-modelmanifest.html#cfn-iotfleetwise-modelmanifest-nodes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SignalCatalogArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-modelmanifest.html#cfn-iotfleetwise-modelmanifest-signalcatalogarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-modelmanifest.html#cfn-iotfleetwise-modelmanifest-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-modelmanifest.html#cfn-iotfleetwise-modelmanifest-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTFleetWise::SignalCatalog":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"LastModificationTime":{"PrimitiveType":"String"},"NodeCounts.TotalActuators":{"PrimitiveType":"Double"},"NodeCounts.TotalAttributes":{"PrimitiveType":"Double"},"NodeCounts.TotalBranches":{"PrimitiveType":"Double"},"NodeCounts.TotalNodes":{"PrimitiveType":"Double"},"NodeCounts.TotalSensors":{"PrimitiveType":"Double"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-signalcatalog.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-signalcatalog.html#cfn-iotfleetwise-signalcatalog-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-signalcatalog.html#cfn-iotfleetwise-signalcatalog-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NodeCounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-signalcatalog.html#cfn-iotfleetwise-signalcatalog-nodecounts","Required":false,"Type":"NodeCounts","UpdateType":"Mutable"},"Nodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-signalcatalog.html#cfn-iotfleetwise-signalcatalog-nodes","DuplicatesAllowed":false,"ItemType":"Node","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-signalcatalog.html#cfn-iotfleetwise-signalcatalog-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTFleetWise::Vehicle":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"LastModificationTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-vehicle.html","Properties":{"AssociationBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-vehicle.html#cfn-iotfleetwise-vehicle-associationbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-vehicle.html#cfn-iotfleetwise-vehicle-attributes","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"DecoderManifestArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-vehicle.html#cfn-iotfleetwise-vehicle-decodermanifestarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ModelManifestArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-vehicle.html#cfn-iotfleetwise-vehicle-modelmanifestarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-vehicle.html#cfn-iotfleetwise-vehicle-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotfleetwise-vehicle.html#cfn-iotfleetwise-vehicle-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AccessPolicy":{"Attributes":{"AccessPolicyArn":{"PrimitiveType":"String"},"AccessPolicyId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-accesspolicy.html","Properties":{"AccessPolicyIdentity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-accesspolicy.html#cfn-iotsitewise-accesspolicy-accesspolicyidentity","Required":true,"Type":"AccessPolicyIdentity","UpdateType":"Mutable"},"AccessPolicyPermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-accesspolicy.html#cfn-iotsitewise-accesspolicy-accesspolicypermission","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AccessPolicyResource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-accesspolicy.html#cfn-iotsitewise-accesspolicy-accesspolicyresource","Required":true,"Type":"AccessPolicyResource","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::Asset":{"Attributes":{"AssetArn":{"PrimitiveType":"String"},"AssetId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html","Properties":{"AssetDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html#cfn-iotsitewise-asset-assetdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AssetHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html#cfn-iotsitewise-asset-assethierarchies","DuplicatesAllowed":true,"ItemType":"AssetHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"AssetModelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html#cfn-iotsitewise-asset-assetmodelid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AssetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html#cfn-iotsitewise-asset-assetname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AssetProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html#cfn-iotsitewise-asset-assetproperties","DuplicatesAllowed":true,"ItemType":"AssetProperty","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-asset.html#cfn-iotsitewise-asset-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::AssetModel":{"Attributes":{"AssetModelArn":{"PrimitiveType":"String"},"AssetModelId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html","Properties":{"AssetModelCompositeModels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html#cfn-iotsitewise-assetmodel-assetmodelcompositemodels","DuplicatesAllowed":true,"ItemType":"AssetModelCompositeModel","Required":false,"Type":"List","UpdateType":"Mutable"},"AssetModelDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html#cfn-iotsitewise-assetmodel-assetmodeldescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AssetModelHierarchies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html#cfn-iotsitewise-assetmodel-assetmodelhierarchies","DuplicatesAllowed":true,"ItemType":"AssetModelHierarchy","Required":false,"Type":"List","UpdateType":"Mutable"},"AssetModelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html#cfn-iotsitewise-assetmodel-assetmodelname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AssetModelProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html#cfn-iotsitewise-assetmodel-assetmodelproperties","DuplicatesAllowed":true,"ItemType":"AssetModelProperty","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-assetmodel.html#cfn-iotsitewise-assetmodel-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::Dashboard":{"Attributes":{"DashboardArn":{"PrimitiveType":"String"},"DashboardId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-dashboard.html","Properties":{"DashboardDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-dashboard.html#cfn-iotsitewise-dashboard-dashboarddefinition","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DashboardDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-dashboard.html#cfn-iotsitewise-dashboard-dashboarddescription","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DashboardName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-dashboard.html#cfn-iotsitewise-dashboard-dashboardname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProjectId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-dashboard.html#cfn-iotsitewise-dashboard-projectid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-dashboard.html#cfn-iotsitewise-dashboard-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::Gateway":{"Attributes":{"GatewayId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-gateway.html","Properties":{"GatewayCapabilitySummaries":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-gateway.html#cfn-iotsitewise-gateway-gatewaycapabilitysummaries","DuplicatesAllowed":false,"ItemType":"GatewayCapabilitySummary","Required":false,"Type":"List","UpdateType":"Mutable"},"GatewayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-gateway.html#cfn-iotsitewise-gateway-gatewayname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"GatewayPlatform":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-gateway.html#cfn-iotsitewise-gateway-gatewayplatform","Required":true,"Type":"GatewayPlatform","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-gateway.html#cfn-iotsitewise-gateway-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::Portal":{"Attributes":{"PortalArn":{"PrimitiveType":"String"},"PortalClientId":{"PrimitiveType":"String"},"PortalId":{"PrimitiveType":"String"},"PortalStartUrl":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-portal.html","Properties":{"Alarms":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-portal.html#cfn-iotsitewise-portal-alarms","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"NotificationSenderEmail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-portal.html#cfn-iotsitewise-portal-notificationsenderemail","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PortalAuthMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-portal.html#cfn-iotsitewise-portal-portalauthmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PortalContactEmail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-portal.html#cfn-iotsitewise-portal-portalcontactemail","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PortalDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-portal.html#cfn-iotsitewise-portal-portaldescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PortalName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-portal.html#cfn-iotsitewise-portal-portalname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-portal.html#cfn-iotsitewise-portal-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-portal.html#cfn-iotsitewise-portal-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTSiteWise::Project":{"Attributes":{"ProjectArn":{"PrimitiveType":"String"},"ProjectId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-project.html","Properties":{"AssetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-project.html#cfn-iotsitewise-project-assetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PortalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-project.html#cfn-iotsitewise-project-portalid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProjectDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-project.html#cfn-iotsitewise-project-projectdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProjectName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-project.html#cfn-iotsitewise-project-projectname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-project.html#cfn-iotsitewise-project-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTThingsGraph::FlowTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotthingsgraph-flowtemplate.html","Properties":{"CompatibleNamespaceVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotthingsgraph-flowtemplate.html#cfn-iotthingsgraph-flowtemplate-compatiblenamespaceversion","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotthingsgraph-flowtemplate.html#cfn-iotthingsgraph-flowtemplate-definition","Required":true,"Type":"DefinitionDocument","UpdateType":"Mutable"}}},"AWS::IoTTwinMaker::ComponentType":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationDateTime":{"PrimitiveType":"String"},"IsAbstract":{"PrimitiveType":"Boolean"},"IsSchemaInitialized":{"PrimitiveType":"Boolean"},"Status":{"Type":"Status"},"Status.Error":{"Type":"Error"},"Status.Error.Code":{"PrimitiveType":"String"},"Status.Error.Message":{"PrimitiveType":"String"},"Status.State":{"PrimitiveType":"String"},"UpdateDateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-componenttype.html","Properties":{"ComponentTypeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-componenttype.html#cfn-iottwinmaker-componenttype-componenttypeid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-componenttype.html#cfn-iottwinmaker-componenttype-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExtendsFrom":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-componenttype.html#cfn-iottwinmaker-componenttype-extendsfrom","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Functions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-componenttype.html#cfn-iottwinmaker-componenttype-functions","ItemType":"Function","Required":false,"Type":"Map","UpdateType":"Mutable"},"IsSingleton":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-componenttype.html#cfn-iottwinmaker-componenttype-issingleton","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PropertyDefinitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-componenttype.html#cfn-iottwinmaker-componenttype-propertydefinitions","ItemType":"PropertyDefinition","Required":false,"Type":"Map","UpdateType":"Mutable"},"PropertyGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-componenttype.html#cfn-iottwinmaker-componenttype-propertygroups","ItemType":"PropertyGroup","Required":false,"Type":"Map","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-componenttype.html#cfn-iottwinmaker-componenttype-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"WorkspaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-componenttype.html#cfn-iottwinmaker-componenttype-workspaceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoTTwinMaker::Entity":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationDateTime":{"PrimitiveType":"String"},"HasChildEntities":{"PrimitiveType":"Boolean"},"Status":{"Type":"Status"},"Status.Error":{"Type":"Error"},"Status.Error.Code":{"PrimitiveType":"String"},"Status.Error.Message":{"PrimitiveType":"String"},"Status.State":{"PrimitiveType":"String"},"UpdateDateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-entity.html","Properties":{"Components":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-entity.html#cfn-iottwinmaker-entity-components","ItemType":"Component","Required":false,"Type":"Map","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-entity.html#cfn-iottwinmaker-entity-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EntityId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-entity.html#cfn-iottwinmaker-entity-entityid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EntityName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-entity.html#cfn-iottwinmaker-entity-entityname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParentEntityId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-entity.html#cfn-iottwinmaker-entity-parententityid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-entity.html#cfn-iottwinmaker-entity-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"WorkspaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-entity.html#cfn-iottwinmaker-entity-workspaceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoTTwinMaker::Scene":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationDateTime":{"PrimitiveType":"String"},"GeneratedSceneMetadata":{"PrimitiveItemType":"String","Type":"Map"},"UpdateDateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-scene.html","Properties":{"Capabilities":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-scene.html#cfn-iottwinmaker-scene-capabilities","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ContentLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-scene.html#cfn-iottwinmaker-scene-contentlocation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-scene.html#cfn-iottwinmaker-scene-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SceneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-scene.html#cfn-iottwinmaker-scene-sceneid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SceneMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-scene.html#cfn-iottwinmaker-scene-scenemetadata","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-scene.html#cfn-iottwinmaker-scene-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"WorkspaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-scene.html#cfn-iottwinmaker-scene-workspaceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoTTwinMaker::SyncJob":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationDateTime":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"},"UpdateDateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-syncjob.html","Properties":{"SyncRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-syncjob.html#cfn-iottwinmaker-syncjob-syncrole","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SyncSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-syncjob.html#cfn-iottwinmaker-syncjob-syncsource","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-syncjob.html#cfn-iottwinmaker-syncjob-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"WorkspaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-syncjob.html#cfn-iottwinmaker-syncjob-workspaceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoTTwinMaker::Workspace":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationDateTime":{"PrimitiveType":"String"},"UpdateDateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-workspace.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-workspace.html#cfn-iottwinmaker-workspace-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-workspace.html#cfn-iottwinmaker-workspace-role","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"S3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-workspace.html#cfn-iottwinmaker-workspace-s3location","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-workspace.html#cfn-iottwinmaker-workspace-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"WorkspaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iottwinmaker-workspace.html#cfn-iottwinmaker-workspace-workspaceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::IoTWireless::Destination":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-destination.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-destination.html#cfn-iotwireless-destination-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Expression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-destination.html#cfn-iotwireless-destination-expression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ExpressionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-destination.html#cfn-iotwireless-destination-expressiontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-destination.html#cfn-iotwireless-destination-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-destination.html#cfn-iotwireless-destination-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-destination.html#cfn-iotwireless-destination-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTWireless::DeviceProfile":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-deviceprofile.html","Properties":{"LoRaWAN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-deviceprofile.html#cfn-iotwireless-deviceprofile-lorawan","Required":false,"Type":"LoRaWANDeviceProfile","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-deviceprofile.html#cfn-iotwireless-deviceprofile-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-deviceprofile.html#cfn-iotwireless-deviceprofile-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTWireless::FuotaTask":{"Attributes":{"Arn":{"PrimitiveType":"String"},"FuotaTaskStatus":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LoRaWAN.StartTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html","Properties":{"AssociateMulticastGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-associatemulticastgroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AssociateWirelessDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-associatewirelessdevice","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisassociateMulticastGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-disassociatemulticastgroup","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisassociateWirelessDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-disassociatewirelessdevice","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FirmwareUpdateImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-firmwareupdateimage","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FirmwareUpdateRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-firmwareupdaterole","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LoRaWAN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-lorawan","Required":true,"Type":"LoRaWAN","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTWireless::MulticastGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LoRaWAN.NumberOfDevicesInGroup":{"PrimitiveType":"Integer"},"LoRaWAN.NumberOfDevicesRequested":{"PrimitiveType":"Integer"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html","Properties":{"AssociateWirelessDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-associatewirelessdevice","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisassociateWirelessDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-disassociatewirelessdevice","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoRaWAN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-lorawan","Required":true,"Type":"LoRaWAN","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTWireless::NetworkAnalyzerConfiguration":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-networkanalyzerconfiguration.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-networkanalyzerconfiguration.html#cfn-iotwireless-networkanalyzerconfiguration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-networkanalyzerconfiguration.html#cfn-iotwireless-networkanalyzerconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-networkanalyzerconfiguration.html#cfn-iotwireless-networkanalyzerconfiguration-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"TraceContent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-networkanalyzerconfiguration.html#cfn-iotwireless-networkanalyzerconfiguration-tracecontent","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"WirelessDevices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-networkanalyzerconfiguration.html#cfn-iotwireless-networkanalyzerconfiguration-wirelessdevices","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"WirelessGateways":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-networkanalyzerconfiguration.html#cfn-iotwireless-networkanalyzerconfiguration-wirelessgateways","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTWireless::PartnerAccount":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Fingerprint":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-partneraccount.html","Properties":{"AccountLinked":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-partneraccount.html#cfn-iotwireless-partneraccount-accountlinked","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PartnerAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-partneraccount.html#cfn-iotwireless-partneraccount-partneraccountid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PartnerType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-partneraccount.html#cfn-iotwireless-partneraccount-partnertype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Sidewalk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-partneraccount.html#cfn-iotwireless-partneraccount-sidewalk","Required":false,"Type":"SidewalkAccountInfo","UpdateType":"Mutable"},"SidewalkResponse":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-partneraccount.html#cfn-iotwireless-partneraccount-sidewalkresponse","Required":false,"Type":"SidewalkAccountInfoWithFingerprint","UpdateType":"Mutable"},"SidewalkUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-partneraccount.html#cfn-iotwireless-partneraccount-sidewalkupdate","Required":false,"Type":"SidewalkUpdateAccount","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-partneraccount.html#cfn-iotwireless-partneraccount-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTWireless::ServiceProfile":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LoRaWAN.ChannelMask":{"PrimitiveType":"String"},"LoRaWAN.DevStatusReqFreq":{"PrimitiveType":"Integer"},"LoRaWAN.DlBucketSize":{"PrimitiveType":"Integer"},"LoRaWAN.DlRate":{"PrimitiveType":"Integer"},"LoRaWAN.DlRatePolicy":{"PrimitiveType":"String"},"LoRaWAN.DrMax":{"PrimitiveType":"Integer"},"LoRaWAN.DrMin":{"PrimitiveType":"Integer"},"LoRaWAN.HrAllowed":{"PrimitiveType":"Boolean"},"LoRaWAN.MinGwDiversity":{"PrimitiveType":"Integer"},"LoRaWAN.NwkGeoLoc":{"PrimitiveType":"Boolean"},"LoRaWAN.PrAllowed":{"PrimitiveType":"Boolean"},"LoRaWAN.RaAllowed":{"PrimitiveType":"Boolean"},"LoRaWAN.ReportDevStatusBattery":{"PrimitiveType":"Boolean"},"LoRaWAN.ReportDevStatusMargin":{"PrimitiveType":"Boolean"},"LoRaWAN.TargetPer":{"PrimitiveType":"Integer"},"LoRaWAN.UlBucketSize":{"PrimitiveType":"Integer"},"LoRaWAN.UlRate":{"PrimitiveType":"Integer"},"LoRaWAN.UlRatePolicy":{"PrimitiveType":"String"},"LoRaWANResponse":{"PrimitiveItemType":"String","Type":"Map"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-serviceprofile.html","Properties":{"LoRaWAN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-serviceprofile.html#cfn-iotwireless-serviceprofile-lorawan","Required":false,"Type":"LoRaWANServiceProfile","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-serviceprofile.html#cfn-iotwireless-serviceprofile-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-serviceprofile.html#cfn-iotwireless-serviceprofile-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTWireless::TaskDefinition":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-taskdefinition.html","Properties":{"AutoCreateTasks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-taskdefinition.html#cfn-iotwireless-taskdefinition-autocreatetasks","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"LoRaWANUpdateGatewayTaskEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-taskdefinition.html#cfn-iotwireless-taskdefinition-lorawanupdategatewaytaskentry","Required":false,"Type":"LoRaWANUpdateGatewayTaskEntry","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-taskdefinition.html#cfn-iotwireless-taskdefinition-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-taskdefinition.html#cfn-iotwireless-taskdefinition-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TaskDefinitionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-taskdefinition.html#cfn-iotwireless-taskdefinition-taskdefinitiontype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Update":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-taskdefinition.html#cfn-iotwireless-taskdefinition-update","Required":false,"Type":"UpdateWirelessGatewayTaskCreate","UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessDevice":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"ThingName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdevice.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdevice.html#cfn-iotwireless-wirelessdevice-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdevice.html#cfn-iotwireless-wirelessdevice-destinationname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LastUplinkReceivedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdevice.html#cfn-iotwireless-wirelessdevice-lastuplinkreceivedat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoRaWAN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdevice.html#cfn-iotwireless-wirelessdevice-lorawan","Required":false,"Type":"LoRaWANDevice","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdevice.html#cfn-iotwireless-wirelessdevice-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdevice.html#cfn-iotwireless-wirelessdevice-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ThingArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdevice.html#cfn-iotwireless-wirelessdevice-thingarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdevice.html#cfn-iotwireless-wirelessdevice-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessDeviceImportTask":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationDate":{"PrimitiveType":"String"},"FailedImportedDevicesCount":{"PrimitiveType":"Integer"},"Id":{"PrimitiveType":"String"},"InitializedImportedDevicesCount":{"PrimitiveType":"Integer"},"OnboardedImportedDevicesCount":{"PrimitiveType":"Integer"},"PendingImportedDevicesCount":{"PrimitiveType":"Integer"},"Sidewalk.DeviceCreationFileList":{"PrimitiveItemType":"String","Type":"List"},"Status":{"PrimitiveType":"String"},"StatusReason":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdeviceimporttask.html","Properties":{"DestinationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdeviceimporttask.html#cfn-iotwireless-wirelessdeviceimporttask-destinationname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Sidewalk":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdeviceimporttask.html#cfn-iotwireless-wirelessdeviceimporttask-sidewalk","Required":true,"Type":"Sidewalk","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessdeviceimporttask.html#cfn-iotwireless-wirelessdeviceimporttask-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::IoTWireless::WirelessGateway":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessgateway.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessgateway.html#cfn-iotwireless-wirelessgateway-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LastUplinkReceivedAt":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessgateway.html#cfn-iotwireless-wirelessgateway-lastuplinkreceivedat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoRaWAN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessgateway.html#cfn-iotwireless-wirelessgateway-lorawan","Required":true,"Type":"LoRaWANGateway","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessgateway.html#cfn-iotwireless-wirelessgateway-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessgateway.html#cfn-iotwireless-wirelessgateway-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ThingArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessgateway.html#cfn-iotwireless-wirelessgateway-thingarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ThingName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-wirelessgateway.html#cfn-iotwireless-wirelessgateway-thingname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KMS::Alias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-alias.html","Properties":{"AliasName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-alias.html#cfn-kms-alias-aliasname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TargetKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-alias.html#cfn-kms-alias-targetkeyid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::KMS::Key":{"Attributes":{"Arn":{"PrimitiveType":"String"},"KeyId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html#cfn-kms-key-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableKeyRotation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html#cfn-kms-key-enablekeyrotation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html#cfn-kms-key-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"KeyPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html#cfn-kms-key-keypolicy","PrimitiveType":"Json","Required":true,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"KeySpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html#cfn-kms-key-keyspec","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KeyUsage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html#cfn-kms-key-keyusage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MultiRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html#cfn-kms-key-multiregion","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PendingWindowInDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html#cfn-kms-key-pendingwindowindays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-key.html#cfn-kms-key-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::KMS::ReplicaKey":{"Attributes":{"Arn":{"PrimitiveType":"String"},"KeyId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-replicakey.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-replicakey.html#cfn-kms-replicakey-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-replicakey.html#cfn-kms-replicakey-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"KeyPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-replicakey.html#cfn-kms-replicakey-keypolicy","PrimitiveType":"Json","Required":true,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"PendingWindowInDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-replicakey.html#cfn-kms-replicakey-pendingwindowindays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PrimaryKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-replicakey.html#cfn-kms-replicakey-primarykeyarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-replicakey.html#cfn-kms-replicakey-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::KafkaConnect::Connector":{"Attributes":{"ConnectorArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html","Properties":{"Capacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-capacity","Required":true,"Type":"Capacity","UpdateType":"Mutable"},"ConnectorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-connectorconfiguration","PrimitiveItemType":"String","Required":true,"Type":"Map","UpdateType":"Immutable"},"ConnectorDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-connectordescription","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ConnectorName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-connectorname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KafkaCluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-kafkacluster","Required":true,"Type":"KafkaCluster","UpdateType":"Immutable"},"KafkaClusterClientAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-kafkaclusterclientauthentication","Required":true,"Type":"KafkaClusterClientAuthentication","UpdateType":"Immutable"},"KafkaClusterEncryptionInTransit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-kafkaclusterencryptionintransit","Required":true,"Type":"KafkaClusterEncryptionInTransit","UpdateType":"Immutable"},"KafkaConnectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-kafkaconnectversion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LogDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-logdelivery","Required":false,"Type":"LogDelivery","UpdateType":"Immutable"},"Plugins":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-plugins","DuplicatesAllowed":false,"ItemType":"Plugin","Required":true,"Type":"List","UpdateType":"Immutable"},"ServiceExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-serviceexecutionrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WorkerConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-workerconfiguration","Required":false,"Type":"WorkerConfiguration","UpdateType":"Immutable"}}},"AWS::Kendra::DataSource":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html","Properties":{"CustomDocumentEnrichmentConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-customdocumentenrichmentconfiguration","Required":false,"Type":"CustomDocumentEnrichmentConfiguration","UpdateType":"Mutable"},"DataSourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-datasourceconfiguration","Required":false,"Type":"DataSourceConfiguration","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IndexId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-indexid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-schedule","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Kendra::Faq":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FileFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-fileformat","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IndexId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-indexid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-s3path","Required":true,"Type":"S3Path","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kendra::Index":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html","Properties":{"CapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-capacityunits","Required":false,"Type":"CapacityUnitsConfiguration","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentMetadataConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-documentmetadataconfigurations","DuplicatesAllowed":true,"ItemType":"DocumentMetadataConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"Edition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-edition","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServerSideEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-serversideencryptionconfiguration","Required":false,"Type":"ServerSideEncryptionConfiguration","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserContextPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-usercontextpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UserTokenConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-usertokenconfigurations","DuplicatesAllowed":true,"ItemType":"UserTokenConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::KendraRanking::ExecutionPlan":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendraranking-executionplan.html","Properties":{"CapacityUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendraranking-executionplan.html#cfn-kendraranking-executionplan-capacityunits","Required":false,"Type":"CapacityUnitsConfiguration","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendraranking-executionplan.html#cfn-kendraranking-executionplan-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendraranking-executionplan.html#cfn-kendraranking-executionplan-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendraranking-executionplan.html#cfn-kendraranking-executionplan-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kinesis::Stream":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html#cfn-kinesis-stream-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RetentionPeriodHours":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html#cfn-kinesis-stream-retentionperiodhours","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ShardCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html#cfn-kinesis-stream-shardcount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StreamEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html#cfn-kinesis-stream-streamencryption","Required":false,"Type":"StreamEncryption","UpdateType":"Mutable"},"StreamModeDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html#cfn-kinesis-stream-streammodedetails","Required":false,"Type":"StreamModeDetails","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html#cfn-kinesis-stream-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Kinesis::StreamConsumer":{"Attributes":{"ConsumerARN":{"PrimitiveType":"String"},"ConsumerCreationTimestamp":{"PrimitiveType":"String"},"ConsumerName":{"PrimitiveType":"String"},"ConsumerStatus":{"PrimitiveType":"String"},"StreamARN":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-streamconsumer.html","Properties":{"ConsumerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-streamconsumer.html#cfn-kinesis-streamconsumer-consumername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StreamARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-streamconsumer.html#cfn-kinesis-streamconsumer-streamarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::KinesisAnalytics::Application":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalytics-application.html","Properties":{"ApplicationCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalytics-application.html#cfn-kinesisanalytics-application-applicationcode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ApplicationDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalytics-application.html#cfn-kinesisanalytics-application-applicationdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalytics-application.html#cfn-kinesisanalytics-application-applicationname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Inputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalytics-application.html#cfn-kinesisanalytics-application-inputs","ItemType":"Input","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalytics-applicationoutput.html","Properties":{"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalytics-applicationoutput.html#cfn-kinesisanalytics-applicationoutput-applicationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalytics-applicationoutput.html#cfn-kinesisanalytics-applicationoutput-output","Required":true,"Type":"Output","UpdateType":"Mutable"}}},"AWS::KinesisAnalytics::ApplicationReferenceDataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalytics-applicationreferencedatasource.html","Properties":{"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalytics-applicationreferencedatasource.html#cfn-kinesisanalytics-applicationreferencedatasource-applicationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ReferenceDataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalytics-applicationreferencedatasource.html#cfn-kinesisanalytics-applicationreferencedatasource-referencedatasource","Required":true,"Type":"ReferenceDataSource","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::Application":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html","Properties":{"ApplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-applicationconfiguration","Required":false,"Type":"ApplicationConfiguration","UpdateType":"Mutable"},"ApplicationDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-applicationdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ApplicationMaintenanceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-applicationmaintenanceconfiguration","Required":false,"Type":"ApplicationMaintenanceConfiguration","UpdateType":"Mutable"},"ApplicationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-applicationmode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-applicationname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RunConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-runconfiguration","Required":false,"Type":"RunConfiguration","UpdateType":"Mutable"},"RuntimeEnvironment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-runtimeenvironment","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ServiceExecutionRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-serviceexecutionrole","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationcloudwatchloggingoption.html","Properties":{"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationcloudwatchloggingoption.html#cfn-kinesisanalyticsv2-applicationcloudwatchloggingoption-applicationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CloudWatchLoggingOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationcloudwatchloggingoption.html#cfn-kinesisanalyticsv2-applicationcloudwatchloggingoption-cloudwatchloggingoption","Required":true,"Type":"CloudWatchLoggingOption","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationoutput.html","Properties":{"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationoutput.html#cfn-kinesisanalyticsv2-applicationoutput-applicationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Output":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationoutput.html#cfn-kinesisanalyticsv2-applicationoutput-output","Required":true,"Type":"Output","UpdateType":"Mutable"}}},"AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationreferencedatasource.html","Properties":{"ApplicationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationreferencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-applicationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ReferenceDataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationreferencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource","Required":true,"Type":"ReferenceDataSource","UpdateType":"Mutable"}}},"AWS::KinesisFirehose::DeliveryStream":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html","Properties":{"AmazonOpenSearchServerlessDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserverlessdestinationconfiguration","Required":false,"Type":"AmazonOpenSearchServerlessDestinationConfiguration","UpdateType":"Mutable"},"AmazonopensearchserviceDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration","Required":false,"Type":"AmazonopensearchserviceDestinationConfiguration","UpdateType":"Mutable"},"DeliveryStreamEncryptionConfigurationInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput","Required":false,"Type":"DeliveryStreamEncryptionConfigurationInput","UpdateType":"Mutable"},"DeliveryStreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-deliverystreamname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeliveryStreamType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-deliverystreamtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ElasticsearchDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-elasticsearchdestinationconfiguration","Required":false,"Type":"ElasticsearchDestinationConfiguration","UpdateType":"Mutable"},"ExtendedS3DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration","Required":false,"Type":"ExtendedS3DestinationConfiguration","UpdateType":"Mutable"},"HttpEndpointDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-httpendpointdestinationconfiguration","Required":false,"Type":"HttpEndpointDestinationConfiguration","UpdateType":"Mutable"},"KinesisStreamSourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-kinesisstreamsourceconfiguration","Required":false,"Type":"KinesisStreamSourceConfiguration","UpdateType":"Immutable"},"RedshiftDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-redshiftdestinationconfiguration","Required":false,"Type":"RedshiftDestinationConfiguration","UpdateType":"Mutable"},"S3DestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-s3destinationconfiguration","Required":false,"Type":"S3DestinationConfiguration","UpdateType":"Mutable"},"SplunkDestinationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-splunkdestinationconfiguration","Required":false,"Type":"SplunkDestinationConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::KinesisVideo::SignalingChannel":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-signalingchannel.html","Properties":{"MessageTtlSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-signalingchannel.html#cfn-kinesisvideo-signalingchannel-messagettlseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-signalingchannel.html#cfn-kinesisvideo-signalingchannel-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-signalingchannel.html#cfn-kinesisvideo-signalingchannel-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-signalingchannel.html#cfn-kinesisvideo-signalingchannel-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::KinesisVideo::Stream":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html","Properties":{"DataRetentionInHours":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-dataretentioninhours","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DeviceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-devicename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MediaType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-mediatype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::LakeFormation::DataCellsFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datacellsfilter.html","Properties":{"ColumnNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datacellsfilter.html#cfn-lakeformation-datacellsfilter-columnnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ColumnWildcard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datacellsfilter.html#cfn-lakeformation-datacellsfilter-columnwildcard","Required":false,"Type":"ColumnWildcard","UpdateType":"Immutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datacellsfilter.html#cfn-lakeformation-datacellsfilter-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datacellsfilter.html#cfn-lakeformation-datacellsfilter-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RowFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datacellsfilter.html#cfn-lakeformation-datacellsfilter-rowfilter","Required":false,"Type":"RowFilter","UpdateType":"Immutable"},"TableCatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datacellsfilter.html#cfn-lakeformation-datacellsfilter-tablecatalogid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datacellsfilter.html#cfn-lakeformation-datacellsfilter-tablename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::LakeFormation::DataLakeSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datalakesettings.html","Properties":{"Admins":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datalakesettings.html#cfn-lakeformation-datalakesettings-admins","Required":false,"Type":"Admins","UpdateType":"Mutable"},"AllowExternalDataFiltering":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datalakesettings.html#cfn-lakeformation-datalakesettings-allowexternaldatafiltering","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AuthorizedSessionTagValueList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datalakesettings.html#cfn-lakeformation-datalakesettings-authorizedsessiontagvaluelist","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"CreateDatabaseDefaultPermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datalakesettings.html#cfn-lakeformation-datalakesettings-createdatabasedefaultpermissions","Required":false,"Type":"CreateDatabaseDefaultPermissions","UpdateType":"Mutable"},"CreateTableDefaultPermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datalakesettings.html#cfn-lakeformation-datalakesettings-createtabledefaultpermissions","Required":false,"Type":"CreateTableDefaultPermissions","UpdateType":"Mutable"},"ExternalDataFilteringAllowList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datalakesettings.html#cfn-lakeformation-datalakesettings-externaldatafilteringallowlist","Required":false,"Type":"ExternalDataFilteringAllowList","UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datalakesettings.html#cfn-lakeformation-datalakesettings-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TrustedResourceOwners":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-datalakesettings.html#cfn-lakeformation-datalakesettings-trustedresourceowners","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::LakeFormation::Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-permissions.html","Properties":{"DataLakePrincipal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-permissions.html#cfn-lakeformation-permissions-datalakeprincipal","Required":true,"Type":"DataLakePrincipal","UpdateType":"Immutable"},"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-permissions.html#cfn-lakeformation-permissions-permissions","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"PermissionsWithGrantOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-permissions.html#cfn-lakeformation-permissions-permissionswithgrantoption","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-permissions.html#cfn-lakeformation-permissions-resource","Required":true,"Type":"Resource","UpdateType":"Immutable"}}},"AWS::LakeFormation::PrincipalPermissions":{"Attributes":{"PrincipalIdentifier":{"PrimitiveType":"String"},"ResourceIdentifier":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-principalpermissions.html","Properties":{"Catalog":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-principalpermissions.html#cfn-lakeformation-principalpermissions-catalog","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-principalpermissions.html#cfn-lakeformation-principalpermissions-permissions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"PermissionsWithGrantOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-principalpermissions.html#cfn-lakeformation-principalpermissions-permissionswithgrantoption","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-principalpermissions.html#cfn-lakeformation-principalpermissions-principal","Required":true,"Type":"DataLakePrincipal","UpdateType":"Immutable"},"Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-principalpermissions.html#cfn-lakeformation-principalpermissions-resource","Required":true,"Type":"Resource","UpdateType":"Immutable"}}},"AWS::LakeFormation::Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-resource.html","Properties":{"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-resource.html#cfn-lakeformation-resource-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-resource.html#cfn-lakeformation-resource-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UseServiceLinkedRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-resource.html#cfn-lakeformation-resource-useservicelinkedrole","PrimitiveType":"Boolean","Required":true,"UpdateType":"Conditional"},"WithFederation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-resource.html#cfn-lakeformation-resource-withfederation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::LakeFormation::Tag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-tag.html","Properties":{"CatalogId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-tag.html#cfn-lakeformation-tag-catalogid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TagKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-tag.html#cfn-lakeformation-tag-tagkey","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TagValues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-tag.html#cfn-lakeformation-tag-tagvalues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::LakeFormation::TagAssociation":{"Attributes":{"ResourceIdentifier":{"PrimitiveType":"String"},"TagsIdentifier":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-tagassociation.html","Properties":{"LFTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-tagassociation.html#cfn-lakeformation-tagassociation-lftags","DuplicatesAllowed":true,"ItemType":"LFTagPair","Required":true,"Type":"List","UpdateType":"Immutable"},"Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lakeformation-tagassociation.html#cfn-lakeformation-tagassociation-resource","Required":true,"Type":"Resource","UpdateType":"Immutable"}}},"AWS::Lambda::Alias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-alias.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-alias.html#cfn-lambda-alias-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FunctionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-alias.html#cfn-lambda-alias-functionname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FunctionVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-alias.html#cfn-lambda-alias-functionversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-alias.html#cfn-lambda-alias-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProvisionedConcurrencyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-alias.html#cfn-lambda-alias-provisionedconcurrencyconfig","Required":false,"Type":"ProvisionedConcurrencyConfiguration","UpdateType":"Mutable"},"RoutingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-alias.html#cfn-lambda-alias-routingconfig","Required":false,"Type":"AliasRoutingConfiguration","UpdateType":"Mutable"}}},"AWS::Lambda::CodeSigningConfig":{"Attributes":{"CodeSigningConfigArn":{"PrimitiveType":"String"},"CodeSigningConfigId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-codesigningconfig.html","Properties":{"AllowedPublishers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-codesigningconfig.html#cfn-lambda-codesigningconfig-allowedpublishers","Required":true,"Type":"AllowedPublishers","UpdateType":"Mutable"},"CodeSigningPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-codesigningconfig.html#cfn-lambda-codesigningconfig-codesigningpolicies","Required":false,"Type":"CodeSigningPolicies","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-codesigningconfig.html#cfn-lambda-codesigningconfig-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::EventInvokeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventinvokeconfig.html","Properties":{"DestinationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventinvokeconfig.html#cfn-lambda-eventinvokeconfig-destinationconfig","Required":false,"Type":"DestinationConfig","UpdateType":"Mutable"},"FunctionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventinvokeconfig.html#cfn-lambda-eventinvokeconfig-functionname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MaximumEventAgeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventinvokeconfig.html#cfn-lambda-eventinvokeconfig-maximumeventageinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumRetryAttempts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventinvokeconfig.html#cfn-lambda-eventinvokeconfig-maximumretryattempts","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Qualifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventinvokeconfig.html#cfn-lambda-eventinvokeconfig-qualifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Lambda::EventSourceMapping":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html","Properties":{"AmazonManagedKafkaEventSourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-amazonmanagedkafkaeventsourceconfig","Required":false,"Type":"AmazonManagedKafkaEventSourceConfig","UpdateType":"Immutable"},"BatchSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-batchsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"BisectBatchOnFunctionError":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-bisectbatchonfunctionerror","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DestinationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-destinationconfig","Required":false,"Type":"DestinationConfig","UpdateType":"Mutable"},"DocumentDBEventSourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-documentdbeventsourceconfig","Required":false,"Type":"DocumentDBEventSourceConfig","UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EventSourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-eventsourcearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FilterCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-filtercriteria","Required":false,"Type":"FilterCriteria","UpdateType":"Mutable"},"FunctionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-functionname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FunctionResponseTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-functionresponsetypes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MaximumBatchingWindowInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-maximumbatchingwindowinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumRecordAgeInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-maximumrecordageinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaximumRetryAttempts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-maximumretryattempts","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ParallelizationFactor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-parallelizationfactor","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Queues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-queues","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ScalingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-scalingconfig","Required":false,"Type":"ScalingConfig","UpdateType":"Mutable"},"SelfManagedEventSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-selfmanagedeventsource","Required":false,"Type":"SelfManagedEventSource","UpdateType":"Immutable"},"SelfManagedKafkaEventSourceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-selfmanagedkafkaeventsourceconfig","Required":false,"Type":"SelfManagedKafkaEventSourceConfig","UpdateType":"Immutable"},"SourceAccessConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-sourceaccessconfigurations","DuplicatesAllowed":false,"ItemType":"SourceAccessConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"StartingPosition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-startingposition","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StartingPositionTimestamp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-startingpositiontimestamp","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Topics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-topics","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"TumblingWindowInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-tumblingwindowinseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Lambda::Function":{"Attributes":{"Arn":{"PrimitiveType":"String"},"SnapStartResponse":{"Type":"SnapStartResponse"},"SnapStartResponse.ApplyOn":{"PrimitiveType":"String"},"SnapStartResponse.OptimizationStatus":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html","Properties":{"Architectures":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-architectures","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-code","Required":true,"Type":"Code","UpdateType":"Mutable"},"CodeSigningConfigArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-codesigningconfigarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeadLetterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-deadletterconfig","Required":false,"Type":"DeadLetterConfig","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-environment","Required":false,"Type":"Environment","UpdateType":"Mutable"},"EphemeralStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-ephemeralstorage","Required":false,"Type":"EphemeralStorage","UpdateType":"Mutable"},"FileSystemConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-filesystemconfigs","DuplicatesAllowed":true,"ItemType":"FileSystemConfig","Required":false,"Type":"List","UpdateType":"Mutable"},"FunctionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-functionname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Handler":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-handler","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-imageconfig","Required":false,"Type":"ImageConfig","UpdateType":"Mutable"},"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Layers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-layers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MemorySize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-memorysize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PackageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-packagetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ReservedConcurrentExecutions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-reservedconcurrentexecutions","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-role","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Runtime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-runtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RuntimeManagementConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-runtimemanagementconfig","Required":false,"Type":"RuntimeManagementConfig","UpdateType":"Mutable"},"SnapStart":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-snapstart","Required":false,"Type":"SnapStart","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Timeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-timeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"TracingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-tracingconfig","Required":false,"Type":"TracingConfig","UpdateType":"Mutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Mutable"}}},"AWS::Lambda::LayerVersion":{"Attributes":{"LayerVersionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversion.html","Properties":{"CompatibleArchitectures":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversion.html#cfn-lambda-layerversion-compatiblearchitectures","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"CompatibleRuntimes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversion.html#cfn-lambda-layerversion-compatibleruntimes","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversion.html#cfn-lambda-layerversion-content","Required":true,"Type":"Content","UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversion.html#cfn-lambda-layerversion-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LayerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversion.html#cfn-lambda-layerversion-layername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LicenseInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversion.html#cfn-lambda-layerversion-licenseinfo","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Lambda::LayerVersionPermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversionpermission.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversionpermission.html#cfn-lambda-layerversionpermission-action","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LayerVersionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversionpermission.html#cfn-lambda-layerversionpermission-layerversionarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OrganizationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversionpermission.html#cfn-lambda-layerversionpermission-organizationid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversionpermission.html#cfn-lambda-layerversionpermission-principal","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Lambda::Permission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-action","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EventSourceToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-eventsourcetoken","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FunctionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-functionname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FunctionUrlAuthType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-functionurlauthtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-principal","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PrincipalOrgID":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-principalorgid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceAccount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-sourceaccount","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-sourcearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}},"ScrutinyType":"LambdaPermission"},"AWS::Lambda::Url":{"Attributes":{"FunctionArn":{"PrimitiveType":"String"},"FunctionUrl":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html","Properties":{"AuthType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html#cfn-lambda-url-authtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Cors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html#cfn-lambda-url-cors","Required":false,"Type":"Cors","UpdateType":"Mutable"},"InvokeMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html#cfn-lambda-url-invokemode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Qualifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html#cfn-lambda-url-qualifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TargetFunctionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html#cfn-lambda-url-targetfunctionarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Lambda::Version":{"Attributes":{"Version":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-version.html","Properties":{"CodeSha256":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-version.html#cfn-lambda-version-codesha256","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-version.html#cfn-lambda-version-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FunctionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-version.html#cfn-lambda-version-functionname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProvisionedConcurrencyConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-version.html#cfn-lambda-version-provisionedconcurrencyconfig","Required":false,"Type":"ProvisionedConcurrencyConfiguration","UpdateType":"Mutable"}}},"AWS::Lex::Bot":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html","Properties":{"AutoBuildBotLocales":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-autobuildbotlocales","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"BotFileS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-botfiles3location","Required":false,"Type":"S3Location","UpdateType":"Mutable"},"BotLocales":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-botlocales","DuplicatesAllowed":false,"ItemType":"BotLocale","Required":false,"Type":"List","UpdateType":"Mutable"},"BotTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-bottags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"DataPrivacy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-dataprivacy","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdleSessionTTLInSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-idlesessionttlinseconds","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TestBotAliasSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-testbotaliassettings","Required":false,"Type":"TestBotAliasSettings","UpdateType":"Mutable"},"TestBotAliasTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-testbotaliastags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lex::BotAlias":{"Attributes":{"Arn":{"PrimitiveType":"String"},"BotAliasId":{"PrimitiveType":"String"},"BotAliasStatus":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html","Properties":{"BotAliasLocaleSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-botaliaslocalesettings","DuplicatesAllowed":false,"ItemType":"BotAliasLocaleSettingsItem","Required":false,"Type":"List","UpdateType":"Mutable"},"BotAliasName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-botaliasname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BotAliasTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-botaliastags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"BotId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-botid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BotVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-botversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConversationLogSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-conversationlogsettings","Required":false,"Type":"ConversationLogSettings","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SentimentAnalysisSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-sentimentanalysissettings","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Lex::BotVersion":{"Attributes":{"BotVersion":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botversion.html","Properties":{"BotId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botversion.html#cfn-lex-botversion-botid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BotVersionLocaleSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botversion.html#cfn-lex-botversion-botversionlocalespecification","DuplicatesAllowed":true,"ItemType":"BotVersionLocaleSpecification","Required":true,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botversion.html#cfn-lex-botversion-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lex::ResourcePolicy":{"Attributes":{"Id":{"PrimitiveType":"String"},"RevisionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-resourcepolicy.html","Properties":{"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-resourcepolicy.html#cfn-lex-resourcepolicy-policy","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-resourcepolicy.html#cfn-lex-resourcepolicy-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::LicenseManager::Grant":{"Attributes":{"GrantArn":{"PrimitiveType":"String"},"Version":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-grant.html","Properties":{"AllowedOperations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-grant.html#cfn-licensemanager-grant-allowedoperations","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"GrantName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-grant.html#cfn-licensemanager-grant-grantname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HomeRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-grant.html#cfn-licensemanager-grant-homeregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LicenseArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-grant.html#cfn-licensemanager-grant-licensearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Principals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-grant.html#cfn-licensemanager-grant-principals","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-grant.html#cfn-licensemanager-grant-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LicenseManager::License":{"Attributes":{"LicenseArn":{"PrimitiveType":"String"},"Version":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html","Properties":{"Beneficiary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html#cfn-licensemanager-license-beneficiary","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ConsumptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html#cfn-licensemanager-license-consumptionconfiguration","Required":true,"Type":"ConsumptionConfiguration","UpdateType":"Mutable"},"Entitlements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html#cfn-licensemanager-license-entitlements","DuplicatesAllowed":false,"ItemType":"Entitlement","Required":true,"Type":"List","UpdateType":"Mutable"},"HomeRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html#cfn-licensemanager-license-homeregion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Issuer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html#cfn-licensemanager-license-issuer","Required":true,"Type":"IssuerData","UpdateType":"Mutable"},"LicenseMetadata":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html#cfn-licensemanager-license-licensemetadata","DuplicatesAllowed":false,"ItemType":"Metadata","Required":false,"Type":"List","UpdateType":"Mutable"},"LicenseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html#cfn-licensemanager-license-licensename","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProductName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html#cfn-licensemanager-license-productname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProductSKU":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html#cfn-licensemanager-license-productsku","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html#cfn-licensemanager-license-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Validity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-licensemanager-license.html#cfn-licensemanager-license-validity","Required":true,"Type":"ValidityDateFormat","UpdateType":"Mutable"}}},"AWS::Lightsail::Alarm":{"Attributes":{"AlarmArn":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html","Properties":{"AlarmName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html#cfn-lightsail-alarm-alarmname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ComparisonOperator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html#cfn-lightsail-alarm-comparisonoperator","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ContactProtocols":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html#cfn-lightsail-alarm-contactprotocols","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DatapointsToAlarm":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html#cfn-lightsail-alarm-datapointstoalarm","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"EvaluationPeriods":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html#cfn-lightsail-alarm-evaluationperiods","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html#cfn-lightsail-alarm-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MonitoredResourceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html#cfn-lightsail-alarm-monitoredresourcename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NotificationEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html#cfn-lightsail-alarm-notificationenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NotificationTriggers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html#cfn-lightsail-alarm-notificationtriggers","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Threshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html#cfn-lightsail-alarm-threshold","PrimitiveType":"Double","Required":true,"UpdateType":"Mutable"},"TreatMissingData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-alarm.html#cfn-lightsail-alarm-treatmissingdata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::Bucket":{"Attributes":{"AbleToUpdateBundle":{"PrimitiveType":"Boolean"},"BucketArn":{"PrimitiveType":"String"},"Url":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-bucket.html","Properties":{"AccessRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-bucket.html#cfn-lightsail-bucket-accessrules","Required":false,"Type":"AccessRules","UpdateType":"Mutable"},"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-bucket.html#cfn-lightsail-bucket-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BundleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-bucket.html#cfn-lightsail-bucket-bundleid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ObjectVersioning":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-bucket.html#cfn-lightsail-bucket-objectversioning","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ReadOnlyAccessAccounts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-bucket.html#cfn-lightsail-bucket-readonlyaccessaccounts","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourcesReceivingAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-bucket.html#cfn-lightsail-bucket-resourcesreceivingaccess","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-bucket.html#cfn-lightsail-bucket-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lightsail::Certificate":{"Attributes":{"CertificateArn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-certificate.html","Properties":{"CertificateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-certificate.html#cfn-lightsail-certificate-certificatename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-certificate.html#cfn-lightsail-certificate-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SubjectAlternativeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-certificate.html#cfn-lightsail-certificate-subjectalternativenames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-certificate.html#cfn-lightsail-certificate-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lightsail::Container":{"Attributes":{"ContainerArn":{"PrimitiveType":"String"},"Url":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-container.html","Properties":{"ContainerServiceDeployment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-container.html#cfn-lightsail-container-containerservicedeployment","Required":false,"Type":"ContainerServiceDeployment","UpdateType":"Mutable"},"IsDisabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-container.html#cfn-lightsail-container-isdisabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Power":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-container.html#cfn-lightsail-container-power","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PublicDomainNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-container.html#cfn-lightsail-container-publicdomainnames","DuplicatesAllowed":false,"ItemType":"PublicDomainName","Required":false,"Type":"List","UpdateType":"Mutable"},"Scale":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-container.html#cfn-lightsail-container-scale","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ServiceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-container.html#cfn-lightsail-container-servicename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-container.html#cfn-lightsail-container-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lightsail::Database":{"Attributes":{"DatabaseArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BackupRetention":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-backupretention","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CaCertificateIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-cacertificateidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterDatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-masterdatabasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MasterUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-masteruserpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterUsername":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-masterusername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PreferredBackupWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-preferredbackupwindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PubliclyAccessible":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-publiclyaccessible","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RelationalDatabaseBlueprintId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-relationaldatabaseblueprintid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RelationalDatabaseBundleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-relationaldatabasebundleid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RelationalDatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-relationaldatabasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RelationalDatabaseParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-relationaldatabaseparameters","DuplicatesAllowed":false,"ItemType":"RelationalDatabaseParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"RotateMasterUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-rotatemasteruserpassword","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-database.html#cfn-lightsail-database-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lightsail::Disk":{"Attributes":{"AttachedTo":{"PrimitiveType":"String"},"AttachmentState":{"PrimitiveType":"String"},"DiskArn":{"PrimitiveType":"String"},"Iops":{"PrimitiveType":"Integer"},"IsAttached":{"PrimitiveType":"Boolean"},"Location.AvailabilityZone":{"PrimitiveType":"String"},"Location.RegionName":{"PrimitiveType":"String"},"Path":{"PrimitiveType":"String"},"ResourceType":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"},"SupportCode":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-disk.html","Properties":{"AddOns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-disk.html#cfn-lightsail-disk-addons","DuplicatesAllowed":true,"ItemType":"AddOn","Required":false,"Type":"List","UpdateType":"Mutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-disk.html#cfn-lightsail-disk-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DiskName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-disk.html#cfn-lightsail-disk-diskname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-disk.html#cfn-lightsail-disk-location","Required":false,"Type":"Location","UpdateType":"Mutable"},"SizeInGb":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-disk.html#cfn-lightsail-disk-sizeingb","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-disk.html#cfn-lightsail-disk-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lightsail::Distribution":{"Attributes":{"AbleToUpdateBundle":{"PrimitiveType":"Boolean"},"DistributionArn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html","Properties":{"BundleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html#cfn-lightsail-distribution-bundleid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CacheBehaviorSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html#cfn-lightsail-distribution-cachebehaviorsettings","Required":false,"Type":"CacheSettings","UpdateType":"Mutable"},"CacheBehaviors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html#cfn-lightsail-distribution-cachebehaviors","DuplicatesAllowed":false,"ItemType":"CacheBehaviorPerPath","Required":false,"Type":"List","UpdateType":"Mutable"},"CertificateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html#cfn-lightsail-distribution-certificatename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultCacheBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html#cfn-lightsail-distribution-defaultcachebehavior","Required":true,"Type":"CacheBehavior","UpdateType":"Mutable"},"DistributionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html#cfn-lightsail-distribution-distributionname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IpAddressType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html#cfn-lightsail-distribution-ipaddresstype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html#cfn-lightsail-distribution-isenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Origin":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html#cfn-lightsail-distribution-origin","Required":true,"Type":"InputOrigin","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-distribution.html#cfn-lightsail-distribution-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Lightsail::Instance":{"Attributes":{"Hardware.CpuCount":{"PrimitiveType":"Integer"},"Hardware.RamSizeInGb":{"PrimitiveType":"Integer"},"InstanceArn":{"PrimitiveType":"String"},"IsStaticIp":{"PrimitiveType":"Boolean"},"Location.AvailabilityZone":{"PrimitiveType":"String"},"Location.RegionName":{"PrimitiveType":"String"},"Networking.MonthlyTransfer.GbPerMonthAllocated":{"PrimitiveType":"String"},"PrivateIpAddress":{"PrimitiveType":"String"},"PublicIpAddress":{"PrimitiveType":"String"},"ResourceType":{"PrimitiveType":"String"},"SshKeyName":{"PrimitiveType":"String"},"State.Code":{"PrimitiveType":"Integer"},"State.Name":{"PrimitiveType":"String"},"SupportCode":{"PrimitiveType":"String"},"UserName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html","Properties":{"AddOns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-addons","DuplicatesAllowed":true,"ItemType":"AddOn","Required":false,"Type":"List","UpdateType":"Mutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BlueprintId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-blueprintid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BundleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-bundleid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Hardware":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-hardware","Required":false,"Type":"Hardware","UpdateType":"Mutable"},"InstanceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-instancename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KeyPairName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-keypairname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-location","Required":false,"Type":"Location","UpdateType":"Mutable"},"Networking":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-networking","Required":false,"Type":"Networking","UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-state","Required":false,"Type":"State","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-instance.html#cfn-lightsail-instance-userdata","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::LoadBalancer":{"Attributes":{"LoadBalancerArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancer.html","Properties":{"AttachedInstances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancer.html#cfn-lightsail-loadbalancer-attachedinstances","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"HealthCheckPath":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancer.html#cfn-lightsail-loadbalancer-healthcheckpath","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstancePort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancer.html#cfn-lightsail-loadbalancer-instanceport","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"IpAddressType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancer.html#cfn-lightsail-loadbalancer-ipaddresstype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LoadBalancerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancer.html#cfn-lightsail-loadbalancer-loadbalancername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SessionStickinessEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancer.html#cfn-lightsail-loadbalancer-sessionstickinessenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SessionStickinessLBCookieDurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancer.html#cfn-lightsail-loadbalancer-sessionstickinesslbcookiedurationseconds","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancer.html#cfn-lightsail-loadbalancer-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TlsPolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancer.html#cfn-lightsail-loadbalancer-tlspolicyname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Lightsail::LoadBalancerTlsCertificate":{"Attributes":{"LoadBalancerTlsCertificateArn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancertlscertificate.html","Properties":{"CertificateAlternativeNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancertlscertificate.html#cfn-lightsail-loadbalancertlscertificate-certificatealternativenames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"CertificateDomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancertlscertificate.html#cfn-lightsail-loadbalancertlscertificate-certificatedomainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CertificateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancertlscertificate.html#cfn-lightsail-loadbalancertlscertificate-certificatename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"HttpsRedirectionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancertlscertificate.html#cfn-lightsail-loadbalancertlscertificate-httpsredirectionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IsAttached":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancertlscertificate.html#cfn-lightsail-loadbalancertlscertificate-isattached","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LoadBalancerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-loadbalancertlscertificate.html#cfn-lightsail-loadbalancertlscertificate-loadbalancername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Lightsail::StaticIp":{"Attributes":{"IpAddress":{"PrimitiveType":"String"},"IsAttached":{"PrimitiveType":"Boolean"},"StaticIpArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-staticip.html","Properties":{"AttachedTo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-staticip.html#cfn-lightsail-staticip-attachedto","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StaticIpName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lightsail-staticip.html#cfn-lightsail-staticip-staticipname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Location::GeofenceCollection":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CollectionArn":{"PrimitiveType":"String"},"CreateTime":{"PrimitiveType":"String"},"UpdateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-geofencecollection.html","Properties":{"CollectionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-geofencecollection.html#cfn-location-geofencecollection-collectionname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-geofencecollection.html#cfn-location-geofencecollection-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-geofencecollection.html#cfn-location-geofencecollection-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Location::Map":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreateTime":{"PrimitiveType":"String"},"DataSource":{"PrimitiveType":"String"},"MapArn":{"PrimitiveType":"String"},"UpdateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-map.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-map.html#cfn-location-map-configuration","Required":true,"Type":"MapConfiguration","UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-map.html#cfn-location-map-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MapName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-map.html#cfn-location-map-mapname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PricingPlan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-map.html#cfn-location-map-pricingplan","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Location::PlaceIndex":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreateTime":{"PrimitiveType":"String"},"IndexArn":{"PrimitiveType":"String"},"UpdateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-placeindex.html","Properties":{"DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-placeindex.html#cfn-location-placeindex-datasource","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DataSourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-placeindex.html#cfn-location-placeindex-datasourceconfiguration","Required":false,"Type":"DataSourceConfiguration","UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-placeindex.html#cfn-location-placeindex-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IndexName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-placeindex.html#cfn-location-placeindex-indexname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PricingPlan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-placeindex.html#cfn-location-placeindex-pricingplan","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Location::RouteCalculator":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CalculatorArn":{"PrimitiveType":"String"},"CreateTime":{"PrimitiveType":"String"},"UpdateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-routecalculator.html","Properties":{"CalculatorName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-routecalculator.html#cfn-location-routecalculator-calculatorname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DataSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-routecalculator.html#cfn-location-routecalculator-datasource","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-routecalculator.html#cfn-location-routecalculator-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PricingPlan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-routecalculator.html#cfn-location-routecalculator-pricingplan","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Location::Tracker":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreateTime":{"PrimitiveType":"String"},"TrackerArn":{"PrimitiveType":"String"},"UpdateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-tracker.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-tracker.html#cfn-location-tracker-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-tracker.html#cfn-location-tracker-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PositionFiltering":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-tracker.html#cfn-location-tracker-positionfiltering","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TrackerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-tracker.html#cfn-location-tracker-trackername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Location::TrackerConsumer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-trackerconsumer.html","Properties":{"ConsumerArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-trackerconsumer.html#cfn-location-trackerconsumer-consumerarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TrackerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-location-trackerconsumer.html#cfn-location-trackerconsumer-trackername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Logs::Destination":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-destination.html","Properties":{"DestinationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-destination.html#cfn-logs-destination-destinationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DestinationPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-destination.html#cfn-logs-destination-destinationpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-destination.html#cfn-logs-destination-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-destination.html#cfn-logs-destination-targetarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Logs::LogGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html","Properties":{"DataProtectionPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-logs-loggroup-dataprotectionpolicy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-logs-loggroup-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-logs-loggroup-loggroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RetentionInDays":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-logs-loggroup-retentionindays","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html#cfn-logs-loggroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Logs::LogStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-logstream.html","Properties":{"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-logstream.html#cfn-logs-logstream-loggroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LogStreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-logstream.html#cfn-logs-logstream-logstreamname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Logs::MetricFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-metricfilter.html","Properties":{"FilterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-metricfilter.html#cfn-logs-metricfilter-filtername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FilterPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-metricfilter.html#cfn-logs-metricfilter-filterpattern","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-metricfilter.html#cfn-logs-metricfilter-loggroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MetricTransformations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-metricfilter.html#cfn-logs-metricfilter-metrictransformations","DuplicatesAllowed":true,"ItemType":"MetricTransformation","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Logs::QueryDefinition":{"Attributes":{"QueryDefinitionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-querydefinition.html","Properties":{"LogGroupNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-querydefinition.html#cfn-logs-querydefinition-loggroupnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-querydefinition.html#cfn-logs-querydefinition-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"QueryString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-querydefinition.html#cfn-logs-querydefinition-querystring","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Logs::ResourcePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-resourcepolicy.html","Properties":{"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-resourcepolicy.html#cfn-logs-resourcepolicy-policydocument","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-resourcepolicy.html#cfn-logs-resourcepolicy-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Logs::SubscriptionFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html","Properties":{"DestinationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html#cfn-logs-subscriptionfilter-destinationarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Distribution":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html#cfn-logs-subscriptionfilter-distribution","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FilterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html#cfn-logs-subscriptionfilter-filtername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FilterPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html#cfn-logs-subscriptionfilter-filterpattern","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LogGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html#cfn-logs-subscriptionfilter-loggroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html#cfn-logs-subscriptionfilter-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::LookoutEquipment::InferenceScheduler":{"Attributes":{"InferenceSchedulerArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutequipment-inferencescheduler.html","Properties":{"DataDelayOffsetInMinutes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutequipment-inferencescheduler.html#cfn-lookoutequipment-inferencescheduler-datadelayoffsetinminutes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DataInputConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutequipment-inferencescheduler.html#cfn-lookoutequipment-inferencescheduler-datainputconfiguration","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"DataOutputConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutequipment-inferencescheduler.html#cfn-lookoutequipment-inferencescheduler-dataoutputconfiguration","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"DataUploadFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutequipment-inferencescheduler.html#cfn-lookoutequipment-inferencescheduler-datauploadfrequency","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InferenceSchedulerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutequipment-inferencescheduler.html#cfn-lookoutequipment-inferencescheduler-inferenceschedulername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ModelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutequipment-inferencescheduler.html#cfn-lookoutequipment-inferencescheduler-modelname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutequipment-inferencescheduler.html#cfn-lookoutequipment-inferencescheduler-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServerSideKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutequipment-inferencescheduler.html#cfn-lookoutequipment-inferencescheduler-serversidekmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutequipment-inferencescheduler.html#cfn-lookoutequipment-inferencescheduler-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::LookoutMetrics::Alert":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-alert.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-alert.html#cfn-lookoutmetrics-alert-action","Required":true,"Type":"Action","UpdateType":"Immutable"},"AlertDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-alert.html#cfn-lookoutmetrics-alert-alertdescription","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AlertName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-alert.html#cfn-lookoutmetrics-alert-alertname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AlertSensitivityThreshold":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-alert.html#cfn-lookoutmetrics-alert-alertsensitivitythreshold","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"AnomalyDetectorArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-alert.html#cfn-lookoutmetrics-alert-anomalydetectorarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::LookoutMetrics::AnomalyDetector":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-anomalydetector.html","Properties":{"AnomalyDetectorConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-anomalydetector.html#cfn-lookoutmetrics-anomalydetector-anomalydetectorconfig","Required":true,"Type":"AnomalyDetectorConfig","UpdateType":"Mutable"},"AnomalyDetectorDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-anomalydetector.html#cfn-lookoutmetrics-anomalydetector-anomalydetectordescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AnomalyDetectorName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-anomalydetector.html#cfn-lookoutmetrics-anomalydetector-anomalydetectorname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-anomalydetector.html#cfn-lookoutmetrics-anomalydetector-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricSetList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutmetrics-anomalydetector.html#cfn-lookoutmetrics-anomalydetector-metricsetlist","DuplicatesAllowed":true,"ItemType":"MetricSet","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::LookoutVision::Project":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutvision-project.html","Properties":{"ProjectName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lookoutvision-project.html#cfn-lookoutvision-project-projectname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::M2::Application":{"Attributes":{"ApplicationArn":{"PrimitiveType":"String"},"ApplicationId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-application.html","Properties":{"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-application.html#cfn-m2-application-definition","Required":true,"Type":"Definition","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-application.html#cfn-m2-application-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EngineType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-application.html#cfn-m2-application-enginetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-application.html#cfn-m2-application-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-application.html#cfn-m2-application-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-application.html#cfn-m2-application-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-application.html#cfn-m2-application-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::M2::Environment":{"Attributes":{"EnvironmentArn":{"PrimitiveType":"String"},"EnvironmentId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EngineType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-enginetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HighAvailabilityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-highavailabilityconfig","Required":false,"Type":"HighAvailabilityConfig","UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PubliclyAccessible":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-publiclyaccessible","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"StorageConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-storageconfigurations","DuplicatesAllowed":true,"ItemType":"StorageConfiguration","Required":false,"Type":"List","UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-m2-environment.html#cfn-m2-environment-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::MSK::BatchScramSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-batchscramsecret.html","Properties":{"ClusterArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-batchscramsecret.html#cfn-msk-batchscramsecret-clusterarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SecretArnList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-batchscramsecret.html#cfn-msk-batchscramsecret-secretarnlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MSK::Cluster":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html","Properties":{"BrokerNodeGroupInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-brokernodegroupinfo","Required":true,"Type":"BrokerNodeGroupInfo","UpdateType":"Mutable"},"ClientAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-clientauthentication","Required":false,"Type":"ClientAuthentication","UpdateType":"Mutable"},"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-clustername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConfigurationInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-configurationinfo","Required":false,"Type":"ConfigurationInfo","UpdateType":"Mutable"},"CurrentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-currentversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-encryptioninfo","Required":false,"Type":"EncryptionInfo","UpdateType":"Mutable"},"EnhancedMonitoring":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-enhancedmonitoring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KafkaVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-kafkaversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LoggingInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-logginginfo","Required":false,"Type":"LoggingInfo","UpdateType":"Mutable"},"NumberOfBrokerNodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-numberofbrokernodes","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"OpenMonitoring":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-openmonitoring","Required":false,"Type":"OpenMonitoring","UpdateType":"Mutable"},"StorageMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-storagemode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-cluster.html#cfn-msk-cluster-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::MSK::ClusterPolicy":{"Attributes":{"CurrentVersion":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-clusterpolicy.html","Properties":{"ClusterArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-clusterpolicy.html#cfn-msk-clusterpolicy-clusterarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-clusterpolicy.html#cfn-msk-clusterpolicy-policy","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::MSK::Configuration":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-configuration.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-configuration.html#cfn-msk-configuration-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KafkaVersionsList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-configuration.html#cfn-msk-configuration-kafkaversionslist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-configuration.html#cfn-msk-configuration-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ServerProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-configuration.html#cfn-msk-configuration-serverproperties","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MSK::ServerlessCluster":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-serverlesscluster.html","Properties":{"ClientAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-serverlesscluster.html#cfn-msk-serverlesscluster-clientauthentication","Required":true,"Type":"ClientAuthentication","UpdateType":"Immutable"},"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-serverlesscluster.html#cfn-msk-serverlesscluster-clustername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-serverlesscluster.html#cfn-msk-serverlesscluster-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"VpcConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-serverlesscluster.html#cfn-msk-serverlesscluster-vpcconfigs","DuplicatesAllowed":false,"ItemType":"VpcConfig","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::MSK::VpcConnection":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-vpcconnection.html","Properties":{"Authentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-vpcconnection.html#cfn-msk-vpcconnection-authentication","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ClientSubnets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-vpcconnection.html#cfn-msk-vpcconnection-clientsubnets","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"SecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-vpcconnection.html#cfn-msk-vpcconnection-securitygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-vpcconnection.html#cfn-msk-vpcconnection-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"TargetClusterArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-vpcconnection.html#cfn-msk-vpcconnection-targetclusterarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-msk-vpcconnection.html#cfn-msk-vpcconnection-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::MWAA::Environment":{"Attributes":{"Arn":{"PrimitiveType":"String"},"LoggingConfiguration.DagProcessingLogs.CloudWatchLogGroupArn":{"PrimitiveType":"String"},"LoggingConfiguration.SchedulerLogs.CloudWatchLogGroupArn":{"PrimitiveType":"String"},"LoggingConfiguration.TaskLogs.CloudWatchLogGroupArn":{"PrimitiveType":"String"},"LoggingConfiguration.WebserverLogs.CloudWatchLogGroupArn":{"PrimitiveType":"String"},"LoggingConfiguration.WorkerLogs.CloudWatchLogGroupArn":{"PrimitiveType":"String"},"WebserverUrl":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html","Properties":{"AirflowConfigurationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-airflowconfigurationoptions","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"AirflowVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-airflowversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DagS3Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-dags3path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnvironmentClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-environmentclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-executionrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-kmskey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-loggingconfiguration","Required":false,"Type":"LoggingConfiguration","UpdateType":"Mutable"},"MaxWorkers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-maxworkers","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinWorkers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-minworkers","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-networkconfiguration","Required":false,"Type":"NetworkConfiguration","UpdateType":"Mutable"},"PluginsS3ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-pluginss3objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PluginsS3Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-pluginss3path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RequirementsS3ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-requirementss3objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RequirementsS3Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-requirementss3path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Schedulers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-schedulers","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SourceBucketArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-sourcebucketarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartupScriptS3ObjectVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-startupscripts3objectversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartupScriptS3Path":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-startupscripts3path","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"WebserverAccessMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-webserveraccessmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WeeklyMaintenanceWindowStart":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mwaa-environment.html#cfn-mwaa-environment-weeklymaintenancewindowstart","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Macie::AllowList":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-allowlist.html","Properties":{"Criteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-allowlist.html#cfn-macie-allowlist-criteria","Required":true,"Type":"Criteria","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-allowlist.html#cfn-macie-allowlist-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-allowlist.html#cfn-macie-allowlist-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-allowlist.html#cfn-macie-allowlist-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Macie::CustomDataIdentifier":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-customdataidentifier.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-customdataidentifier.html#cfn-macie-customdataidentifier-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"IgnoreWords":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-customdataidentifier.html#cfn-macie-customdataidentifier-ignorewords","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Keywords":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-customdataidentifier.html#cfn-macie-customdataidentifier-keywords","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"MaximumMatchDistance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-customdataidentifier.html#cfn-macie-customdataidentifier-maximummatchdistance","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-customdataidentifier.html#cfn-macie-customdataidentifier-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Regex":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-customdataidentifier.html#cfn-macie-customdataidentifier-regex","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Macie::FindingsFilter":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-findingsfilter.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-findingsfilter.html#cfn-macie-findingsfilter-action","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-findingsfilter.html#cfn-macie-findingsfilter-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FindingCriteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-findingsfilter.html#cfn-macie-findingsfilter-findingcriteria","Required":true,"Type":"FindingCriteria","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-findingsfilter.html#cfn-macie-findingsfilter-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Position":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-findingsfilter.html#cfn-macie-findingsfilter-position","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Macie::Session":{"Attributes":{"AwsAccountId":{"PrimitiveType":"String"},"ServiceRole":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-session.html","Properties":{"FindingPublishingFrequency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-session.html#cfn-macie-session-findingpublishingfrequency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-macie-session.html#cfn-macie-session-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Accessor":{"Attributes":{"Arn":{"PrimitiveType":"String"},"BillingToken":{"PrimitiveType":"String"},"CreationDate":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-accessor.html","Properties":{"AccessorType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-accessor.html#cfn-managedblockchain-accessor-accessortype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-accessor.html#cfn-managedblockchain-accessor-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Member":{"Attributes":{"MemberId":{"PrimitiveType":"String"},"NetworkId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-member.html","Properties":{"InvitationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-member.html#cfn-managedblockchain-member-invitationid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MemberConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-member.html#cfn-managedblockchain-member-memberconfiguration","Required":true,"Type":"MemberConfiguration","UpdateType":"Mutable"},"NetworkConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-member.html#cfn-managedblockchain-member-networkconfiguration","Required":false,"Type":"NetworkConfiguration","UpdateType":"Mutable"},"NetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-member.html#cfn-managedblockchain-member-networkid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ManagedBlockchain::Node":{"Attributes":{"Arn":{"PrimitiveType":"String"},"MemberId":{"PrimitiveType":"String"},"NetworkId":{"PrimitiveType":"String"},"NodeId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-node.html","Properties":{"MemberId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-node.html#cfn-managedblockchain-node-memberid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-node.html#cfn-managedblockchain-node-networkid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NodeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-managedblockchain-node.html#cfn-managedblockchain-node-nodeconfiguration","Required":true,"Type":"NodeConfiguration","UpdateType":"Mutable"}}},"AWS::MediaConnect::Bridge":{"Attributes":{"BridgeArn":{"PrimitiveType":"String"},"BridgeState":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridge.html","Properties":{"EgressGatewayBridge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridge.html#cfn-mediaconnect-bridge-egressgatewaybridge","Required":false,"Type":"EgressGatewayBridge","UpdateType":"Mutable"},"IngressGatewayBridge":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridge.html#cfn-mediaconnect-bridge-ingressgatewaybridge","Required":false,"Type":"IngressGatewayBridge","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridge.html#cfn-mediaconnect-bridge-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Outputs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridge.html#cfn-mediaconnect-bridge-outputs","DuplicatesAllowed":true,"ItemType":"BridgeOutput","Required":false,"Type":"List","UpdateType":"Mutable"},"PlacementArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridge.html#cfn-mediaconnect-bridge-placementarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceFailoverConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridge.html#cfn-mediaconnect-bridge-sourcefailoverconfig","Required":false,"Type":"FailoverConfig","UpdateType":"Mutable"},"Sources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridge.html#cfn-mediaconnect-bridge-sources","DuplicatesAllowed":true,"ItemType":"BridgeSource","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaConnect::BridgeOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridgeoutput.html","Properties":{"BridgeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridgeoutput.html#cfn-mediaconnect-bridgeoutput-bridgearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridgeoutput.html#cfn-mediaconnect-bridgeoutput-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NetworkOutput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridgeoutput.html#cfn-mediaconnect-bridgeoutput-networkoutput","Required":true,"Type":"BridgeNetworkOutput","UpdateType":"Mutable"}}},"AWS::MediaConnect::BridgeSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridgesource.html","Properties":{"BridgeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridgesource.html#cfn-mediaconnect-bridgesource-bridgearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FlowSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridgesource.html#cfn-mediaconnect-bridgesource-flowsource","Required":false,"Type":"BridgeFlowSource","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridgesource.html#cfn-mediaconnect-bridgesource-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NetworkSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-bridgesource.html#cfn-mediaconnect-bridgesource-networksource","Required":false,"Type":"BridgeNetworkSource","UpdateType":"Mutable"}}},"AWS::MediaConnect::Flow":{"Attributes":{"FlowArn":{"PrimitiveType":"String"},"FlowAvailabilityZone":{"PrimitiveType":"String"},"Source.IngestIp":{"PrimitiveType":"String"},"Source.SourceArn":{"PrimitiveType":"String"},"Source.SourceIngestPort":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flow.html","Properties":{"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flow.html#cfn-mediaconnect-flow-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flow.html#cfn-mediaconnect-flow-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flow.html#cfn-mediaconnect-flow-source","Required":true,"Type":"Source","UpdateType":"Mutable"},"SourceFailoverConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flow.html#cfn-mediaconnect-flow-sourcefailoverconfig","Required":false,"Type":"FailoverConfig","UpdateType":"Mutable"}}},"AWS::MediaConnect::FlowEntitlement":{"Attributes":{"EntitlementArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowentitlement.html","Properties":{"DataTransferSubscriberFeePercent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowentitlement.html#cfn-mediaconnect-flowentitlement-datatransfersubscriberfeepercent","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowentitlement.html#cfn-mediaconnect-flowentitlement-description","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowentitlement.html#cfn-mediaconnect-flowentitlement-encryption","Required":false,"Type":"Encryption","UpdateType":"Mutable"},"EntitlementStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowentitlement.html#cfn-mediaconnect-flowentitlement-entitlementstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowentitlement.html#cfn-mediaconnect-flowentitlement-flowarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowentitlement.html#cfn-mediaconnect-flowentitlement-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Subscribers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowentitlement.html#cfn-mediaconnect-flowentitlement-subscribers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaConnect::FlowOutput":{"Attributes":{"OutputArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html","Properties":{"CidrAllowList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-cidrallowlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-destination","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Encryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-encryption","Required":false,"Type":"Encryption","UpdateType":"Mutable"},"FlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-flowarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MaxLatency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-maxlatency","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinLatency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-minlatency","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RemoteId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-remoteid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SmoothingLatency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-smoothinglatency","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StreamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-streamid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcInterfaceAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowoutput.html#cfn-mediaconnect-flowoutput-vpcinterfaceattachment","Required":false,"Type":"VpcInterfaceAttachment","UpdateType":"Mutable"}}},"AWS::MediaConnect::FlowSource":{"Attributes":{"IngestIp":{"PrimitiveType":"String"},"SourceArn":{"PrimitiveType":"String"},"SourceIngestPort":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html","Properties":{"Decryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-decryption","Required":false,"Type":"Encryption","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-description","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EntitlementArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-entitlementarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-flowarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GatewayBridgeSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-gatewaybridgesource","Required":false,"Type":"GatewayBridgeSource","UpdateType":"Mutable"},"IngestPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-ingestport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxBitrate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-maxbitrate","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MaxLatency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-maxlatency","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MinLatency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-minlatency","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-protocol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SenderControlPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-sendercontrolport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SenderIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-senderipaddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceListenerAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-sourcelisteneraddress","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceListenerPort":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-sourcelistenerport","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StreamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-streamid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcInterfaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-vpcinterfacename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"WhitelistCidr":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowsource.html#cfn-mediaconnect-flowsource-whitelistcidr","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConnect::FlowVpcInterface":{"Attributes":{"NetworkInterfaceIds":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowvpcinterface.html","Properties":{"FlowArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowvpcinterface.html#cfn-mediaconnect-flowvpcinterface-flowarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowvpcinterface.html#cfn-mediaconnect-flowvpcinterface-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowvpcinterface.html#cfn-mediaconnect-flowvpcinterface-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowvpcinterface.html#cfn-mediaconnect-flowvpcinterface-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-flowvpcinterface.html#cfn-mediaconnect-flowvpcinterface-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MediaConnect::Gateway":{"Attributes":{"GatewayArn":{"PrimitiveType":"String"},"GatewayState":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-gateway.html","Properties":{"EgressCidrBlocks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-gateway.html#cfn-mediaconnect-gateway-egresscidrblocks","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-gateway.html#cfn-mediaconnect-gateway-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Networks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconnect-gateway.html#cfn-mediaconnect-gateway-networks","DuplicatesAllowed":true,"ItemType":"GatewayNetwork","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::MediaConvert::JobTemplate":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-jobtemplate.html","Properties":{"AccelerationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-jobtemplate.html#cfn-mediaconvert-jobtemplate-accelerationsettings","Required":false,"Type":"AccelerationSettings","UpdateType":"Mutable"},"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-jobtemplate.html#cfn-mediaconvert-jobtemplate-category","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-jobtemplate.html#cfn-mediaconvert-jobtemplate-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HopDestinations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-jobtemplate.html#cfn-mediaconvert-jobtemplate-hopdestinations","ItemType":"HopDestination","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-jobtemplate.html#cfn-mediaconvert-jobtemplate-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-jobtemplate.html#cfn-mediaconvert-jobtemplate-priority","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Queue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-jobtemplate.html#cfn-mediaconvert-jobtemplate-queue","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SettingsJson":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-jobtemplate.html#cfn-mediaconvert-jobtemplate-settingsjson","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"StatusUpdateInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-jobtemplate.html#cfn-mediaconvert-jobtemplate-statusupdateinterval","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-jobtemplate.html#cfn-mediaconvert-jobtemplate-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConvert::Preset":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-preset.html","Properties":{"Category":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-preset.html#cfn-mediaconvert-preset-category","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-preset.html#cfn-mediaconvert-preset-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-preset.html#cfn-mediaconvert-preset-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SettingsJson":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-preset.html#cfn-mediaconvert-preset-settingsjson","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-preset.html#cfn-mediaconvert-preset-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaConvert::Queue":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-queue.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-queue.html#cfn-mediaconvert-queue-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-queue.html#cfn-mediaconvert-queue-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PricingPlan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-queue.html#cfn-mediaconvert-queue-pricingplan","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-queue.html#cfn-mediaconvert-queue-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediaconvert-queue.html#cfn-mediaconvert-queue-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::MediaLive::Channel":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Inputs":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html","Properties":{"CdiInputSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-cdiinputspecification","Required":false,"Type":"CdiInputSpecification","UpdateType":"Mutable"},"ChannelClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-channelclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Destinations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-destinations","ItemType":"OutputDestination","Required":false,"Type":"List","UpdateType":"Mutable"},"EncoderSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-encodersettings","Required":false,"Type":"EncoderSettings","UpdateType":"Mutable"},"InputAttachments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-inputattachments","ItemType":"InputAttachment","Required":false,"Type":"List","UpdateType":"Mutable"},"InputSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-inputspecification","Required":false,"Type":"InputSpecification","UpdateType":"Mutable"},"LogLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-loglevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Maintenance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-maintenance","Required":false,"Type":"MaintenanceCreateSettings","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Vpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-channel.html#cfn-medialive-channel-vpc","Required":false,"Type":"VpcOutputSettings","UpdateType":"Immutable"}}},"AWS::MediaLive::Input":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Destinations":{"PrimitiveItemType":"String","Type":"List"},"Sources":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-input.html","Properties":{"Destinations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-input.html#cfn-medialive-input-destinations","ItemType":"InputDestinationRequest","Required":false,"Type":"List","UpdateType":"Mutable"},"InputDevices":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-input.html#cfn-medialive-input-inputdevices","ItemType":"InputDeviceSettings","Required":false,"Type":"List","UpdateType":"Mutable"},"InputSecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-input.html#cfn-medialive-input-inputsecuritygroups","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"MediaConnectFlows":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-input.html#cfn-medialive-input-mediaconnectflows","ItemType":"MediaConnectFlowRequest","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-input.html#cfn-medialive-input-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-input.html#cfn-medialive-input-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Sources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-input.html#cfn-medialive-input-sources","ItemType":"InputSourceRequest","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-input.html#cfn-medialive-input-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-input.html#cfn-medialive-input-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Vpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-input.html#cfn-medialive-input-vpc","Required":false,"Type":"InputVpcRequest","UpdateType":"Immutable"}}},"AWS::MediaLive::InputSecurityGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-inputsecuritygroup.html","Properties":{"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-inputsecuritygroup.html#cfn-medialive-inputsecuritygroup-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"WhitelistRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-medialive-inputsecuritygroup.html#cfn-medialive-inputsecuritygroup-whitelistrules","ItemType":"InputWhitelistRuleCidr","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaPackage::Asset":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html","Properties":{"EgressEndpoints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-egressendpoints","DuplicatesAllowed":true,"ItemType":"EgressEndpoint","Required":false,"Type":"List","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PackagingGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-packaginggroupid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-resourceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-sourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SourceRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-sourcerolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-asset.html#cfn-mediapackage-asset-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaPackage::Channel":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-channel.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-channel.html#cfn-mediapackage-channel-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EgressAccessLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-channel.html#cfn-mediapackage-channel-egressaccesslogs","Required":false,"Type":"LogConfiguration","UpdateType":"Mutable"},"HlsIngest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-channel.html#cfn-mediapackage-channel-hlsingest","Required":false,"Type":"HlsIngest","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-channel.html#cfn-mediapackage-channel-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IngressAccessLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-channel.html#cfn-mediapackage-channel-ingressaccesslogs","Required":false,"Type":"LogConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-channel.html#cfn-mediapackage-channel-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::MediaPackage::OriginEndpoint":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Url":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html","Properties":{"Authorization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-authorization","Required":false,"Type":"Authorization","UpdateType":"Mutable"},"ChannelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-channelid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CmafPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-cmafpackage","Required":false,"Type":"CmafPackage","UpdateType":"Mutable"},"DashPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-dashpackage","Required":false,"Type":"DashPackage","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HlsPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-hlspackage","Required":false,"Type":"HlsPackage","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ManifestName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-manifestname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MssPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-msspackage","Required":false,"Type":"MssPackage","UpdateType":"Mutable"},"Origination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-origination","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartoverWindowSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-startoverwindowseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TimeDelaySeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-timedelayseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Whitelist":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-originendpoint.html#cfn-mediapackage-originendpoint-whitelist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingConfiguration":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html","Properties":{"CmafPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-cmafpackage","Required":false,"Type":"CmafPackage","UpdateType":"Mutable"},"DashPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-dashpackage","Required":false,"Type":"DashPackage","UpdateType":"Mutable"},"HlsPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-hlspackage","Required":false,"Type":"HlsPackage","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MssPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-msspackage","Required":false,"Type":"MssPackage","UpdateType":"Mutable"},"PackagingGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-packaginggroupid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packagingconfiguration.html#cfn-mediapackage-packagingconfiguration-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaPackage::PackagingGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"DomainName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packaginggroup.html","Properties":{"Authorization":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packaginggroup.html#cfn-mediapackage-packaginggroup-authorization","Required":false,"Type":"Authorization","UpdateType":"Mutable"},"EgressAccessLogs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packaginggroup.html#cfn-mediapackage-packaginggroup-egressaccesslogs","Required":false,"Type":"LogConfiguration","UpdateType":"Mutable"},"Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packaginggroup.html#cfn-mediapackage-packaginggroup-id","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediapackage-packaginggroup.html#cfn-mediapackage-packaginggroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::MediaStore::Container":{"Attributes":{"Endpoint":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediastore-container.html","Properties":{"AccessLoggingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediastore-container.html#cfn-mediastore-container-accessloggingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ContainerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediastore-container.html#cfn-mediastore-container-containername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CorsPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediastore-container.html#cfn-mediastore-container-corspolicy","ItemType":"CorsRule","Required":false,"Type":"List","UpdateType":"Mutable"},"LifecyclePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediastore-container.html#cfn-mediastore-container-lifecyclepolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetricPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediastore-container.html#cfn-mediastore-container-metricpolicy","Required":false,"Type":"MetricPolicy","UpdateType":"Mutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediastore-container.html#cfn-mediastore-container-policy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediastore-container.html#cfn-mediastore-container-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MediaTailor::PlaybackConfiguration":{"Attributes":{"DashConfiguration.ManifestEndpointPrefix":{"PrimitiveType":"String"},"HlsConfiguration.ManifestEndpointPrefix":{"PrimitiveType":"String"},"PlaybackConfigurationArn":{"PrimitiveType":"String"},"PlaybackEndpointPrefix":{"PrimitiveType":"String"},"SessionInitializationEndpointPrefix":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html","Properties":{"AdDecisionServerUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-addecisionserverurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AvailSuppression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-availsuppression","Required":false,"Type":"AvailSuppression","UpdateType":"Mutable"},"Bumper":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-bumper","Required":false,"Type":"Bumper","UpdateType":"Mutable"},"CdnConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-cdnconfiguration","Required":false,"Type":"CdnConfiguration","UpdateType":"Mutable"},"ConfigurationAliases":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-configurationaliases","PrimitiveItemType":"Json","Required":false,"Type":"Map","UpdateType":"Mutable"},"DashConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-dashconfiguration","Required":false,"Type":"DashConfiguration","UpdateType":"Mutable"},"HlsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-hlsconfiguration","Required":false,"Type":"HlsConfiguration","UpdateType":"Mutable"},"LivePreRollConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-liveprerollconfiguration","Required":false,"Type":"LivePreRollConfiguration","UpdateType":"Mutable"},"ManifestProcessingRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-manifestprocessingrules","Required":false,"Type":"ManifestProcessingRules","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PersonalizationThresholdSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-personalizationthresholdseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SlateAdUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-slateadurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TranscodeProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-transcodeprofilename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VideoContentSourceUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-mediatailor-playbackconfiguration.html#cfn-mediatailor-playbackconfiguration-videocontentsourceurl","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::MemoryDB::ACL":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-acl.html","Properties":{"ACLName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-acl.html#cfn-memorydb-acl-aclname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-acl.html#cfn-memorydb-acl-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-acl.html#cfn-memorydb-acl-usernames","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MemoryDB::Cluster":{"Attributes":{"ARN":{"PrimitiveType":"String"},"ClusterEndpoint.Address":{"PrimitiveType":"String"},"ClusterEndpoint.Port":{"PrimitiveType":"Integer"},"ParameterGroupStatus":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html","Properties":{"ACLName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-aclname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"AutoMinorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-autominorversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ClusterEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-clusterendpoint","Required":false,"Type":"Endpoint","UpdateType":"Mutable"},"ClusterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-clustername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DataTiering":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-datatiering","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FinalSnapshotName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-finalsnapshotname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-maintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NodeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-nodetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NumReplicasPerShard":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-numreplicaspershard","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"NumShards":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-numshards","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-parametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SnapshotArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-snapshotarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SnapshotName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-snapshotname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SnapshotRetentionLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-snapshotretentionlimit","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SnapshotWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-snapshotwindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnsTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-snstopicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnsTopicStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-snstopicstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-subnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TLSEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-tlsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-cluster.html#cfn-memorydb-cluster-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MemoryDB::ParameterGroup":{"Attributes":{"ARN":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-parametergroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-parametergroup.html#cfn-memorydb-parametergroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Family":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-parametergroup.html#cfn-memorydb-parametergroup-family","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-parametergroup.html#cfn-memorydb-parametergroup-parametergroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-parametergroup.html#cfn-memorydb-parametergroup-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-parametergroup.html#cfn-memorydb-parametergroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MemoryDB::SubnetGroup":{"Attributes":{"ARN":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-subnetgroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-subnetgroup.html#cfn-memorydb-subnetgroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-subnetgroup.html#cfn-memorydb-subnetgroup-subnetgroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-subnetgroup.html#cfn-memorydb-subnetgroup-subnetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-subnetgroup.html#cfn-memorydb-subnetgroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::MemoryDB::User":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-user.html","Properties":{"AccessString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-user.html#cfn-memorydb-user-accessstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthenticationMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-user.html#cfn-memorydb-user-authenticationmode","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-user.html#cfn-memorydb-user-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-memorydb-user.html#cfn-memorydb-user-username","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Neptune::DBCluster":{"Attributes":{"ClusterResourceId":{"PrimitiveType":"String"},"Endpoint":{"PrimitiveType":"String"},"Port":{"PrimitiveType":"String"},"ReadEndpoint":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html","Properties":{"AssociatedRoles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-associatedroles","DuplicatesAllowed":false,"ItemType":"DBClusterRole","Required":false,"Type":"List","UpdateType":"Mutable"},"AvailabilityZones":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-availabilityzones","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"BackupRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-backupretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CopyTagsToSnapshot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-copytagstosnapshot","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DBClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-dbclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBClusterParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-dbclusterparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DBInstanceParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-dbinstanceparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DBSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-dbsubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeletionProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-deletionprotection","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableCloudwatchLogsExports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-enablecloudwatchlogsexports","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IamAuthEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-iamauthenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PreferredBackupWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-preferredbackupwindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RestoreToTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-restoretotime","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RestoreType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-restoretype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServerlessScalingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-serverlessscalingconfiguration","Required":false,"Type":"ServerlessScalingConfiguration","UpdateType":"Mutable"},"SnapshotIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-snapshotidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceDBClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-sourcedbclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StorageEncrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-storageencrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UseLatestRestorableTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-uselatestrestorabletime","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"VpcSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbcluster.html#cfn-neptune-dbcluster-vpcsecuritygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Neptune::DBClusterParameterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbclusterparametergroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbclusterparametergroup.html#cfn-neptune-dbclusterparametergroup-description","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Family":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbclusterparametergroup.html#cfn-neptune-dbclusterparametergroup-family","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbclusterparametergroup.html#cfn-neptune-dbclusterparametergroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbclusterparametergroup.html#cfn-neptune-dbclusterparametergroup-parameters","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbclusterparametergroup.html#cfn-neptune-dbclusterparametergroup-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Neptune::DBInstance":{"Attributes":{"Endpoint":{"PrimitiveType":"String"},"Port":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html","Properties":{"AllowMajorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html#cfn-neptune-dbinstance-allowmajorversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AutoMinorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html#cfn-neptune-dbinstance-autominorversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html#cfn-neptune-dbinstance-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html#cfn-neptune-dbinstance-dbclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBInstanceClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html#cfn-neptune-dbinstance-dbinstanceclass","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DBInstanceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html#cfn-neptune-dbinstance-dbinstanceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html#cfn-neptune-dbinstance-dbparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DBSnapshotIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html#cfn-neptune-dbinstance-dbsnapshotidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html#cfn-neptune-dbinstance-dbsubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html#cfn-neptune-dbinstance-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbinstance.html#cfn-neptune-dbinstance-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Neptune::DBParameterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbparametergroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbparametergroup.html#cfn-neptune-dbparametergroup-description","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Family":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbparametergroup.html#cfn-neptune-dbparametergroup-family","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbparametergroup.html#cfn-neptune-dbparametergroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbparametergroup.html#cfn-neptune-dbparametergroup-parameters","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbparametergroup.html#cfn-neptune-dbparametergroup-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Neptune::DBSubnetGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbsubnetgroup.html","Properties":{"DBSubnetGroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbsubnetgroup.html#cfn-neptune-dbsubnetgroup-dbsubnetgroupdescription","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DBSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbsubnetgroup.html#cfn-neptune-dbsubnetgroup-dbsubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbsubnetgroup.html#cfn-neptune-dbsubnetgroup-subnetids","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-neptune-dbsubnetgroup.html#cfn-neptune-dbsubnetgroup-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::Firewall":{"Attributes":{"EndpointIds":{"PrimitiveItemType":"String","Type":"List"},"FirewallArn":{"PrimitiveType":"String"},"FirewallId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewall.html","Properties":{"DeleteProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewall.html#cfn-networkfirewall-firewall-deleteprotection","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewall.html#cfn-networkfirewall-firewall-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FirewallName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewall.html#cfn-networkfirewall-firewall-firewallname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FirewallPolicyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewall.html#cfn-networkfirewall-firewall-firewallpolicyarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FirewallPolicyChangeProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewall.html#cfn-networkfirewall-firewall-firewallpolicychangeprotection","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SubnetChangeProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewall.html#cfn-networkfirewall-firewall-subnetchangeprotection","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SubnetMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewall.html#cfn-networkfirewall-firewall-subnetmappings","DuplicatesAllowed":false,"ItemType":"SubnetMapping","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewall.html#cfn-networkfirewall-firewall-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewall.html#cfn-networkfirewall-firewall-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::NetworkFirewall::FirewallPolicy":{"Attributes":{"FirewallPolicyArn":{"PrimitiveType":"String"},"FirewallPolicyId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewallpolicy.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FirewallPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-firewallpolicy","Required":true,"Type":"FirewallPolicy","UpdateType":"Mutable"},"FirewallPolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-firewallpolicyname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-firewallpolicy.html#cfn-networkfirewall-firewallpolicy-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::LoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-loggingconfiguration.html","Properties":{"FirewallArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-loggingconfiguration.html#cfn-networkfirewall-loggingconfiguration-firewallarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FirewallName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-loggingconfiguration.html#cfn-networkfirewall-loggingconfiguration-firewallname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-loggingconfiguration.html#cfn-networkfirewall-loggingconfiguration-loggingconfiguration","Required":true,"Type":"LoggingConfiguration","UpdateType":"Mutable"}}},"AWS::NetworkFirewall::RuleGroup":{"Attributes":{"RuleGroupArn":{"PrimitiveType":"String"},"RuleGroupId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-rulegroup.html","Properties":{"Capacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-rulegroup.html#cfn-networkfirewall-rulegroup-capacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-rulegroup.html#cfn-networkfirewall-rulegroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RuleGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-rulegroup.html#cfn-networkfirewall-rulegroup-rulegroup","Required":false,"Type":"RuleGroup","UpdateType":"Mutable"},"RuleGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-rulegroup.html#cfn-networkfirewall-rulegroup-rulegroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-rulegroup.html#cfn-networkfirewall-rulegroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkfirewall-rulegroup.html#cfn-networkfirewall-rulegroup-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::NetworkManager::ConnectAttachment":{"Attributes":{"AttachmentId":{"PrimitiveType":"String"},"AttachmentPolicyRuleNumber":{"PrimitiveType":"Integer"},"AttachmentType":{"PrimitiveType":"String"},"CoreNetworkArn":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"OwnerAccountId":{"PrimitiveType":"String"},"ResourceArn":{"PrimitiveType":"String"},"SegmentName":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"},"UpdatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectattachment.html","Properties":{"CoreNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectattachment.html#cfn-networkmanager-connectattachment-corenetworkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EdgeLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectattachment.html#cfn-networkmanager-connectattachment-edgelocation","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectattachment.html#cfn-networkmanager-connectattachment-options","Required":true,"Type":"ConnectAttachmentOptions","UpdateType":"Immutable"},"ProposedSegmentChange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectattachment.html#cfn-networkmanager-connectattachment-proposedsegmentchange","Required":false,"Type":"ProposedSegmentChange","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectattachment.html#cfn-networkmanager-connectattachment-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransportAttachmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectattachment.html#cfn-networkmanager-connectattachment-transportattachmentid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::NetworkManager::ConnectPeer":{"Attributes":{"Configuration":{"Type":"ConnectPeerConfiguration"},"Configuration.BgpConfigurations":{"ItemType":"ConnectPeerBgpConfiguration","Type":"List"},"Configuration.CoreNetworkAddress":{"PrimitiveType":"String"},"Configuration.InsideCidrBlocks":{"PrimitiveItemType":"String","Type":"List"},"Configuration.PeerAddress":{"PrimitiveType":"String"},"Configuration.Protocol":{"PrimitiveType":"String"},"ConnectPeerId":{"PrimitiveType":"String"},"CoreNetworkId":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"EdgeLocation":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectpeer.html","Properties":{"BgpOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectpeer.html#cfn-networkmanager-connectpeer-bgpoptions","Required":false,"Type":"BgpOptions","UpdateType":"Immutable"},"ConnectAttachmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectpeer.html#cfn-networkmanager-connectpeer-connectattachmentid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CoreNetworkAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectpeer.html#cfn-networkmanager-connectpeer-corenetworkaddress","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InsideCidrBlocks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectpeer.html#cfn-networkmanager-connectpeer-insidecidrblocks","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"PeerAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectpeer.html#cfn-networkmanager-connectpeer-peeraddress","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-connectpeer.html#cfn-networkmanager-connectpeer-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkManager::CoreNetwork":{"Attributes":{"CoreNetworkArn":{"PrimitiveType":"String"},"CoreNetworkId":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"Edges":{"ItemType":"CoreNetworkEdge","Type":"List"},"OwnerAccount":{"PrimitiveType":"String"},"Segments":{"ItemType":"CoreNetworkSegment","Type":"List"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-corenetwork.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-corenetwork.html#cfn-networkmanager-corenetwork-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlobalNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-corenetwork.html#cfn-networkmanager-corenetwork-globalnetworkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-corenetwork.html#cfn-networkmanager-corenetwork-policydocument","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-corenetwork.html#cfn-networkmanager-corenetwork-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkManager::CustomerGatewayAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-customergatewayassociation.html","Properties":{"CustomerGatewayArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-customergatewayassociation.html#cfn-networkmanager-customergatewayassociation-customergatewayarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DeviceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-customergatewayassociation.html#cfn-networkmanager-customergatewayassociation-deviceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"GlobalNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-customergatewayassociation.html#cfn-networkmanager-customergatewayassociation-globalnetworkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LinkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-customergatewayassociation.html#cfn-networkmanager-customergatewayassociation-linkid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::NetworkManager::Device":{"Attributes":{"CreatedAt":{"PrimitiveType":"String"},"DeviceArn":{"PrimitiveType":"String"},"DeviceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-device.html","Properties":{"AWSLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-device.html#cfn-networkmanager-device-awslocation","Required":false,"Type":"AWSLocation","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-device.html#cfn-networkmanager-device-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlobalNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-device.html#cfn-networkmanager-device-globalnetworkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-device.html#cfn-networkmanager-device-location","Required":false,"Type":"Location","UpdateType":"Mutable"},"Model":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-device.html#cfn-networkmanager-device-model","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SerialNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-device.html#cfn-networkmanager-device-serialnumber","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SiteId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-device.html#cfn-networkmanager-device-siteid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-device.html#cfn-networkmanager-device-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-device.html#cfn-networkmanager-device-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Vendor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-device.html#cfn-networkmanager-device-vendor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkManager::GlobalNetwork":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-globalnetwork.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-globalnetwork.html#cfn-networkmanager-globalnetwork-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-globalnetwork.html#cfn-networkmanager-globalnetwork-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkManager::Link":{"Attributes":{"LinkArn":{"PrimitiveType":"String"},"LinkId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-link.html","Properties":{"Bandwidth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-link.html#cfn-networkmanager-link-bandwidth","Required":true,"Type":"Bandwidth","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-link.html#cfn-networkmanager-link-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlobalNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-link.html#cfn-networkmanager-link-globalnetworkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Provider":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-link.html#cfn-networkmanager-link-provider","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SiteId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-link.html#cfn-networkmanager-link-siteid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-link.html#cfn-networkmanager-link-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-link.html#cfn-networkmanager-link-type","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::NetworkManager::LinkAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-linkassociation.html","Properties":{"DeviceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-linkassociation.html#cfn-networkmanager-linkassociation-deviceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"GlobalNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-linkassociation.html#cfn-networkmanager-linkassociation-globalnetworkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LinkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-linkassociation.html#cfn-networkmanager-linkassociation-linkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::NetworkManager::Site":{"Attributes":{"SiteArn":{"PrimitiveType":"String"},"SiteId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-site.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-site.html#cfn-networkmanager-site-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlobalNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-site.html#cfn-networkmanager-site-globalnetworkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-site.html#cfn-networkmanager-site-location","Required":false,"Type":"Location","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-site.html#cfn-networkmanager-site-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::NetworkManager::SiteToSiteVpnAttachment":{"Attributes":{"AttachmentId":{"PrimitiveType":"String"},"AttachmentPolicyRuleNumber":{"PrimitiveType":"Integer"},"AttachmentType":{"PrimitiveType":"String"},"CoreNetworkArn":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"EdgeLocation":{"PrimitiveType":"String"},"OwnerAccountId":{"PrimitiveType":"String"},"ResourceArn":{"PrimitiveType":"String"},"SegmentName":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"},"UpdatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-sitetositevpnattachment.html","Properties":{"CoreNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-sitetositevpnattachment.html#cfn-networkmanager-sitetositevpnattachment-corenetworkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProposedSegmentChange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-sitetositevpnattachment.html#cfn-networkmanager-sitetositevpnattachment-proposedsegmentchange","Required":false,"Type":"ProposedSegmentChange","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-sitetositevpnattachment.html#cfn-networkmanager-sitetositevpnattachment-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpnConnectionArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-sitetositevpnattachment.html#cfn-networkmanager-sitetositevpnattachment-vpnconnectionarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::NetworkManager::TransitGatewayPeering":{"Attributes":{"CoreNetworkArn":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"EdgeLocation":{"PrimitiveType":"String"},"OwnerAccountId":{"PrimitiveType":"String"},"PeeringId":{"PrimitiveType":"String"},"PeeringType":{"PrimitiveType":"String"},"ResourceArn":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"},"TransitGatewayPeeringAttachmentId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewaypeering.html","Properties":{"CoreNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewaypeering.html#cfn-networkmanager-transitgatewaypeering-corenetworkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewaypeering.html#cfn-networkmanager-transitgatewaypeering-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransitGatewayArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewaypeering.html#cfn-networkmanager-transitgatewaypeering-transitgatewayarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::NetworkManager::TransitGatewayRegistration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewayregistration.html","Properties":{"GlobalNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewayregistration.html#cfn-networkmanager-transitgatewayregistration-globalnetworkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TransitGatewayArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewayregistration.html#cfn-networkmanager-transitgatewayregistration-transitgatewayarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::NetworkManager::TransitGatewayRouteTableAttachment":{"Attributes":{"AttachmentId":{"PrimitiveType":"String"},"AttachmentPolicyRuleNumber":{"PrimitiveType":"Integer"},"AttachmentType":{"PrimitiveType":"String"},"CoreNetworkArn":{"PrimitiveType":"String"},"CoreNetworkId":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"EdgeLocation":{"PrimitiveType":"String"},"OwnerAccountId":{"PrimitiveType":"String"},"ResourceArn":{"PrimitiveType":"String"},"SegmentName":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"},"UpdatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewayroutetableattachment.html","Properties":{"PeeringId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewayroutetableattachment.html#cfn-networkmanager-transitgatewayroutetableattachment-peeringid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProposedSegmentChange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewayroutetableattachment.html#cfn-networkmanager-transitgatewayroutetableattachment-proposedsegmentchange","Required":false,"Type":"ProposedSegmentChange","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewayroutetableattachment.html#cfn-networkmanager-transitgatewayroutetableattachment-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TransitGatewayRouteTableArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-transitgatewayroutetableattachment.html#cfn-networkmanager-transitgatewayroutetableattachment-transitgatewayroutetablearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::NetworkManager::VpcAttachment":{"Attributes":{"AttachmentId":{"PrimitiveType":"String"},"AttachmentPolicyRuleNumber":{"PrimitiveType":"Integer"},"AttachmentType":{"PrimitiveType":"String"},"CoreNetworkArn":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"EdgeLocation":{"PrimitiveType":"String"},"OwnerAccountId":{"PrimitiveType":"String"},"ResourceArn":{"PrimitiveType":"String"},"SegmentName":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"},"UpdatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-vpcattachment.html","Properties":{"CoreNetworkId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-vpcattachment.html#cfn-networkmanager-vpcattachment-corenetworkid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Options":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-vpcattachment.html#cfn-networkmanager-vpcattachment-options","Required":false,"Type":"VpcOptions","UpdateType":"Mutable"},"ProposedSegmentChange":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-vpcattachment.html#cfn-networkmanager-vpcattachment-proposedsegmentchange","Required":false,"Type":"ProposedSegmentChange","UpdateType":"Mutable"},"SubnetArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-vpcattachment.html#cfn-networkmanager-vpcattachment-subnetarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-vpcattachment.html#cfn-networkmanager-vpcattachment-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-networkmanager-vpcattachment.html#cfn-networkmanager-vpcattachment-vpcarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::NimbleStudio::LaunchProfile":{"Attributes":{"LaunchProfileId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-launchprofile.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-launchprofile.html#cfn-nimblestudio-launchprofile-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ec2SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-launchprofile.html#cfn-nimblestudio-launchprofile-ec2subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"LaunchProfileProtocolVersions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-launchprofile.html#cfn-nimblestudio-launchprofile-launchprofileprotocolversions","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-launchprofile.html#cfn-nimblestudio-launchprofile-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StreamConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-launchprofile.html#cfn-nimblestudio-launchprofile-streamconfiguration","Required":true,"Type":"StreamConfiguration","UpdateType":"Mutable"},"StudioComponentIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-launchprofile.html#cfn-nimblestudio-launchprofile-studiocomponentids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"StudioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-launchprofile.html#cfn-nimblestudio-launchprofile-studioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-launchprofile.html#cfn-nimblestudio-launchprofile-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::NimbleStudio::StreamingImage":{"Attributes":{"EncryptionConfiguration":{"Type":"StreamingImageEncryptionConfiguration"},"EncryptionConfiguration.KeyArn":{"PrimitiveType":"String"},"EncryptionConfiguration.KeyType":{"PrimitiveType":"String"},"EulaIds":{"PrimitiveItemType":"String","Type":"List"},"Owner":{"PrimitiveType":"String"},"Platform":{"PrimitiveType":"String"},"StreamingImageId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-streamingimage.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-streamingimage.html#cfn-nimblestudio-streamingimage-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ec2ImageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-streamingimage.html#cfn-nimblestudio-streamingimage-ec2imageid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-streamingimage.html#cfn-nimblestudio-streamingimage-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StudioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-streamingimage.html#cfn-nimblestudio-streamingimage-studioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-streamingimage.html#cfn-nimblestudio-streamingimage-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::NimbleStudio::Studio":{"Attributes":{"HomeRegion":{"PrimitiveType":"String"},"SsoClientId":{"PrimitiveType":"String"},"StudioId":{"PrimitiveType":"String"},"StudioUrl":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studio.html","Properties":{"AdminRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studio.html#cfn-nimblestudio-studio-adminrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studio.html#cfn-nimblestudio-studio-displayname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StudioEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studio.html#cfn-nimblestudio-studio-studioencryptionconfiguration","Required":false,"Type":"StudioEncryptionConfiguration","UpdateType":"Mutable"},"StudioName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studio.html#cfn-nimblestudio-studio-studioname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studio.html#cfn-nimblestudio-studio-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"UserRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studio.html#cfn-nimblestudio-studio-userrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::NimbleStudio::StudioComponent":{"Attributes":{"StudioComponentId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studiocomponent.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studiocomponent.html#cfn-nimblestudio-studiocomponent-configuration","Required":false,"Type":"StudioComponentConfiguration","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studiocomponent.html#cfn-nimblestudio-studiocomponent-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Ec2SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studiocomponent.html#cfn-nimblestudio-studiocomponent-ec2securitygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"InitializationScripts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studiocomponent.html#cfn-nimblestudio-studiocomponent-initializationscripts","ItemType":"StudioComponentInitializationScript","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studiocomponent.html#cfn-nimblestudio-studiocomponent-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScriptParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studiocomponent.html#cfn-nimblestudio-studiocomponent-scriptparameters","ItemType":"ScriptParameterKeyValue","Required":false,"Type":"List","UpdateType":"Mutable"},"StudioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studiocomponent.html#cfn-nimblestudio-studiocomponent-studioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Subtype":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studiocomponent.html#cfn-nimblestudio-studiocomponent-subtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studiocomponent.html#cfn-nimblestudio-studiocomponent-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-nimblestudio-studiocomponent.html#cfn-nimblestudio-studiocomponent-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::OSIS::Pipeline":{"Attributes":{"IngestEndpointUrls":{"PrimitiveItemType":"String","Type":"List"},"PipelineArn":{"PrimitiveType":"String"},"VpcEndpoints":{"ItemType":"VpcEndpoint","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-osis-pipeline.html","Properties":{"LogPublishingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-osis-pipeline.html#cfn-osis-pipeline-logpublishingoptions","Required":false,"Type":"LogPublishingOptions","UpdateType":"Mutable"},"MaxUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-osis-pipeline.html#cfn-osis-pipeline-maxunits","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"MinUnits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-osis-pipeline.html#cfn-osis-pipeline-minunits","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"PipelineConfigurationBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-osis-pipeline.html#cfn-osis-pipeline-pipelineconfigurationbody","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PipelineName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-osis-pipeline.html#cfn-osis-pipeline-pipelinename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-osis-pipeline.html#cfn-osis-pipeline-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-osis-pipeline.html#cfn-osis-pipeline-vpcoptions","Required":false,"Type":"VpcOptions","UpdateType":"Mutable"}}},"AWS::Oam::Link":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Label":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-oam-link.html","Properties":{"LabelTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-oam-link.html#cfn-oam-link-labeltemplate","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourceTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-oam-link.html#cfn-oam-link-resourcetypes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SinkIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-oam-link.html#cfn-oam-link-sinkidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-oam-link.html#cfn-oam-link-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::Oam::Sink":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-oam-sink.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-oam-sink.html#cfn-oam-sink-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-oam-sink.html#cfn-oam-sink-policy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-oam-sink.html#cfn-oam-sink-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::Omics::AnnotationStore":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"StatusMessage":{"PrimitiveType":"String"},"StoreArn":{"PrimitiveType":"String"},"StoreSizeBytes":{"PrimitiveType":"Double"},"UpdateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-annotationstore.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-annotationstore.html#cfn-omics-annotationstore-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-annotationstore.html#cfn-omics-annotationstore-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Reference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-annotationstore.html#cfn-omics-annotationstore-reference","Required":false,"Type":"ReferenceItem","UpdateType":"Immutable"},"SseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-annotationstore.html#cfn-omics-annotationstore-sseconfig","Required":false,"Type":"SseConfig","UpdateType":"Immutable"},"StoreFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-annotationstore.html#cfn-omics-annotationstore-storeformat","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StoreOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-annotationstore.html#cfn-omics-annotationstore-storeoptions","Required":false,"Type":"StoreOptions","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-annotationstore.html#cfn-omics-annotationstore-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::Omics::ReferenceStore":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"ReferenceStoreId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-referencestore.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-referencestore.html#cfn-omics-referencestore-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-referencestore.html#cfn-omics-referencestore-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-referencestore.html#cfn-omics-referencestore-sseconfig","Required":false,"Type":"SseConfig","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-referencestore.html#cfn-omics-referencestore-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::Omics::RunGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-rungroup.html","Properties":{"MaxCpus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-rungroup.html#cfn-omics-rungroup-maxcpus","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaxDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-rungroup.html#cfn-omics-rungroup-maxduration","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"MaxRuns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-rungroup.html#cfn-omics-rungroup-maxruns","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-rungroup.html#cfn-omics-rungroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-rungroup.html#cfn-omics-rungroup-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::Omics::SequenceStore":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"SequenceStoreId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-sequencestore.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-sequencestore.html#cfn-omics-sequencestore-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FallbackLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-sequencestore.html#cfn-omics-sequencestore-fallbacklocation","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-sequencestore.html#cfn-omics-sequencestore-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-sequencestore.html#cfn-omics-sequencestore-sseconfig","Required":false,"Type":"SseConfig","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-sequencestore.html#cfn-omics-sequencestore-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::Omics::VariantStore":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"StatusMessage":{"PrimitiveType":"String"},"StoreArn":{"PrimitiveType":"String"},"StoreSizeBytes":{"PrimitiveType":"Double"},"UpdateTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-variantstore.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-variantstore.html#cfn-omics-variantstore-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-variantstore.html#cfn-omics-variantstore-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Reference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-variantstore.html#cfn-omics-variantstore-reference","Required":true,"Type":"ReferenceItem","UpdateType":"Immutable"},"SseConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-variantstore.html#cfn-omics-variantstore-sseconfig","Required":false,"Type":"SseConfig","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-variantstore.html#cfn-omics-variantstore-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}}},"AWS::Omics::Workflow":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"Type":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-workflow.html","Properties":{"DefinitionUri":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-workflow.html#cfn-omics-workflow-definitionuri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-workflow.html#cfn-omics-workflow-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Engine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-workflow.html#cfn-omics-workflow-engine","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Main":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-workflow.html#cfn-omics-workflow-main","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-workflow.html#cfn-omics-workflow-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ParameterTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-workflow.html#cfn-omics-workflow-parametertemplate","ItemType":"WorkflowParameter","Required":false,"Type":"Map","UpdateType":"Immutable"},"StorageCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-workflow.html#cfn-omics-workflow-storagecapacity","PrimitiveType":"Double","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-omics-workflow.html#cfn-omics-workflow-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::OpenSearchServerless::AccessPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-accesspolicy.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-accesspolicy.html#cfn-opensearchserverless-accesspolicy-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-accesspolicy.html#cfn-opensearchserverless-accesspolicy-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-accesspolicy.html#cfn-opensearchserverless-accesspolicy-policy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-accesspolicy.html#cfn-opensearchserverless-accesspolicy-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::OpenSearchServerless::Collection":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CollectionEndpoint":{"PrimitiveType":"String"},"DashboardEndpoint":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-collection.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-collection.html#cfn-opensearchserverless-collection-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-collection.html#cfn-opensearchserverless-collection-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-collection.html#cfn-opensearchserverless-collection-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-collection.html#cfn-opensearchserverless-collection-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::OpenSearchServerless::SecurityConfig":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-securityconfig.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-securityconfig.html#cfn-opensearchserverless-securityconfig-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-securityconfig.html#cfn-opensearchserverless-securityconfig-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SamlOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-securityconfig.html#cfn-opensearchserverless-securityconfig-samloptions","Required":false,"Type":"SamlConfigOptions","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-securityconfig.html#cfn-opensearchserverless-securityconfig-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::OpenSearchServerless::SecurityPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-securitypolicy.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-securitypolicy.html#cfn-opensearchserverless-securitypolicy-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-securitypolicy.html#cfn-opensearchserverless-securitypolicy-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-securitypolicy.html#cfn-opensearchserverless-securitypolicy-policy","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-securitypolicy.html#cfn-opensearchserverless-securitypolicy-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::OpenSearchServerless::VpcEndpoint":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-vpcendpoint.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-vpcendpoint.html#cfn-opensearchserverless-vpcendpoint-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-vpcendpoint.html#cfn-opensearchserverless-vpcendpoint-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-vpcendpoint.html#cfn-opensearchserverless-vpcendpoint-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchserverless-vpcendpoint.html#cfn-opensearchserverless-vpcendpoint-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::OpenSearchService::Domain":{"Attributes":{"AdvancedSecurityOptions.AnonymousAuthDisableDate":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"},"DomainEndpoint":{"PrimitiveType":"String"},"DomainEndpoints":{"PrimitiveItemType":"String","Type":"Map"},"Id":{"PrimitiveType":"String"},"ServiceSoftwareOptions":{"Type":"ServiceSoftwareOptions"},"ServiceSoftwareOptions.AutomatedUpdateDate":{"PrimitiveType":"String"},"ServiceSoftwareOptions.Cancellable":{"PrimitiveType":"Boolean"},"ServiceSoftwareOptions.CurrentVersion":{"PrimitiveType":"String"},"ServiceSoftwareOptions.Description":{"PrimitiveType":"String"},"ServiceSoftwareOptions.NewVersion":{"PrimitiveType":"String"},"ServiceSoftwareOptions.OptionalDeployment":{"PrimitiveType":"Boolean"},"ServiceSoftwareOptions.UpdateAvailable":{"PrimitiveType":"Boolean"},"ServiceSoftwareOptions.UpdateStatus":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html","Properties":{"AccessPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-accesspolicies","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"AdvancedOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-advancedoptions","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"AdvancedSecurityOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-advancedsecurityoptions","Required":false,"Type":"AdvancedSecurityOptionsInput","UpdateType":"Mutable"},"ClusterConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-clusterconfig","Required":false,"Type":"ClusterConfig","UpdateType":"Mutable"},"CognitoOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-cognitooptions","Required":false,"Type":"CognitoOptions","UpdateType":"Mutable"},"DomainEndpointOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-domainendpointoptions","Required":false,"Type":"DomainEndpointOptions","UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-domainname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EBSOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-ebsoptions","Required":false,"Type":"EBSOptions","UpdateType":"Mutable"},"EncryptionAtRestOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-encryptionatrestoptions","Required":false,"Type":"EncryptionAtRestOptions","UpdateType":"Mutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogPublishingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-logpublishingoptions","ItemType":"LogPublishingOption","Required":false,"Type":"Map","UpdateType":"Mutable"},"NodeToNodeEncryptionOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-nodetonodeencryptionoptions","Required":false,"Type":"NodeToNodeEncryptionOptions","UpdateType":"Mutable"},"OffPeakWindowOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-offpeakwindowoptions","Required":false,"Type":"OffPeakWindowOptions","UpdateType":"Mutable"},"SnapshotOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-snapshotoptions","Required":false,"Type":"SnapshotOptions","UpdateType":"Mutable"},"SoftwareUpdateOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-softwareupdateoptions","Required":false,"Type":"SoftwareUpdateOptions","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VPCOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opensearchservice-domain.html#cfn-opensearchservice-domain-vpcoptions","Required":false,"Type":"VPCOptions","UpdateType":"Mutable"}}},"AWS::OpsWorks::App":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html","Properties":{"AppSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-appsource","Required":false,"Type":"Source","UpdateType":"Mutable"},"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-attributes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"DataSources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-datasources","DuplicatesAllowed":false,"ItemType":"DataSource","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Domains":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-domains","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"EnableSsl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-enablessl","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-environment","DuplicatesAllowed":true,"ItemType":"EnvironmentVariable","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Shortname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-shortname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SslConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-sslconfiguration","Required":false,"Type":"SslConfiguration","UpdateType":"Mutable"},"StackId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-stackid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-app.html#cfn-opsworks-app-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::OpsWorks::ElasticLoadBalancerAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-elbattachment.html","Properties":{"ElasticLoadBalancerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-elbattachment.html#cfn-opsworks-elbattachment-elbname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LayerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-elbattachment.html#cfn-opsworks-elbattachment-layerid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Instance":{"Attributes":{"AvailabilityZone":{"PrimitiveType":"String"},"PrivateDnsName":{"PrimitiveType":"String"},"PrivateIp":{"PrimitiveType":"String"},"PublicDnsName":{"PrimitiveType":"String"},"PublicIp":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html","Properties":{"AgentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-agentversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AmiId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-amiid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Architecture":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-architecture","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AutoScalingType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-autoscalingtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BlockDeviceMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-blockdevicemappings","DuplicatesAllowed":false,"ItemType":"BlockDeviceMapping","Required":false,"Type":"List","UpdateType":"Immutable"},"EbsOptimized":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-ebsoptimized","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ElasticIps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-elasticips","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Hostname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-hostname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstallUpdatesOnBoot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-installupdatesonboot","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"LayerIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-layerids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Os":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-os","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RootDeviceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-rootdevicetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SshKeyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-sshkeyname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StackId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-stackid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tenancy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-tenancy","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TimeBasedAutoScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-timebasedautoscaling","Required":false,"Type":"TimeBasedAutoScaling","UpdateType":"Immutable"},"VirtualizationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-virtualizationtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Volumes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-instance.html#cfn-opsworks-instance-volumes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::OpsWorks::Layer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-attributes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"AutoAssignElasticIps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-autoassignelasticips","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"AutoAssignPublicIps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-autoassignpublicips","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"CustomInstanceProfileArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-custominstanceprofilearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomJson":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-customjson","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"CustomRecipes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-customrecipes","Required":false,"Type":"Recipes","UpdateType":"Mutable"},"CustomSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-customsecuritygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"EnableAutoHealing":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-enableautohealing","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"InstallUpdatesOnBoot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-installupdatesonboot","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"LifecycleEventConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-lifecycleeventconfiguration","Required":false,"Type":"LifecycleEventConfiguration","UpdateType":"Mutable"},"LoadBasedAutoScaling":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-loadbasedautoscaling","Required":false,"Type":"LoadBasedAutoScaling","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Packages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-packages","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Shortname":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-shortname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StackId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-stackid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UseEbsOptimizedInstances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-useebsoptimizedinstances","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"VolumeConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-layer.html#cfn-opsworks-layer-volumeconfigurations","DuplicatesAllowed":true,"ItemType":"VolumeConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::OpsWorks::Stack":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html","Properties":{"AgentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-agentversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-attributes","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"ChefConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-chefconfiguration","Required":false,"Type":"ChefConfiguration","UpdateType":"Mutable"},"CloneAppIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-cloneappids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ClonePermissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-clonepermissions","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ConfigurationManager":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-configmanager","Required":false,"Type":"StackConfigurationManager","UpdateType":"Mutable"},"CustomCookbooksSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-custcookbooksource","Required":false,"Type":"Source","UpdateType":"Mutable"},"CustomJson":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-custjson","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"DefaultAvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-defaultaz","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultInstanceProfileArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-defaultinstanceprof","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DefaultOs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-defaultos","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultRootDeviceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-defaultrootdevicetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultSshKeyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-defaultsshkeyname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultSubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#defaultsubnet","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EcsClusterArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-ecsclusterarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ElasticIps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-elasticips","DuplicatesAllowed":false,"ItemType":"ElasticIp","Required":false,"Type":"List","UpdateType":"Mutable"},"HostnameTheme":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-hostnametheme","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RdsDbInstances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-rdsdbinstances","DuplicatesAllowed":false,"ItemType":"RdsDbInstance","Required":false,"Type":"List","UpdateType":"Mutable"},"ServiceRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-servicerolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SourceStackId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-sourcestackid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UseCustomCookbooks":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#usecustcookbooks","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UseOpsworksSecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-useopsworkssecuritygroups","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-stack.html#cfn-opsworks-stack-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::OpsWorks::UserProfile":{"Attributes":{"SshUsername":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-userprofile.html","Properties":{"AllowSelfManagement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-userprofile.html#cfn-opsworks-userprofile-allowselfmanagement","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"IamUserArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-userprofile.html#cfn-opsworks-userprofile-iamuserarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SshPublicKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-userprofile.html#cfn-opsworks-userprofile-sshpublickey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SshUsername":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-userprofile.html#cfn-opsworks-userprofile-sshusername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::OpsWorks::Volume":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-volume.html","Properties":{"Ec2VolumeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-volume.html#cfn-opsworks-volume-ec2volumeid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MountPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-volume.html#cfn-opsworks-volume-mountpoint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-volume.html#cfn-opsworks-volume-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StackId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworks-volume.html#cfn-opsworks-volume-stackid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::OpsWorksCM::Server":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Endpoint":{"PrimitiveType":"String"},"ServerName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html","Properties":{"AssociatePublicIpAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-associatepublicipaddress","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"BackupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-backupid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BackupRetentionCount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-backupretentioncount","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CustomCertificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-customcertificate","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CustomDomain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-customdomain","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CustomPrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-customprivatekey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DisableAutomatedBackup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-disableautomatedbackup","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Engine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-engine","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EngineAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-engineattributes","DuplicatesAllowed":true,"ItemType":"EngineAttribute","Required":false,"Type":"List","UpdateType":"Mutable"},"EngineModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-enginemodel","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceProfileArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-instanceprofilearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KeyPair":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-keypair","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PreferredBackupWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-preferredbackupwindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ServiceRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-servicerolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-opsworkscm-server.html#cfn-opsworkscm-server-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Organizations::Account":{"Attributes":{"AccountId":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"},"JoinedMethod":{"PrimitiveType":"String"},"JoinedTimestamp":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-account.html","Properties":{"AccountName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-account.html#cfn-organizations-account-accountname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Email":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-account.html#cfn-organizations-account-email","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParentIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-account.html#cfn-organizations-account-parentids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RoleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-account.html#cfn-organizations-account-rolename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-account.html#cfn-organizations-account-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Organizations::Organization":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"ManagementAccountArn":{"PrimitiveType":"String"},"ManagementAccountEmail":{"PrimitiveType":"String"},"ManagementAccountId":{"PrimitiveType":"String"},"RootId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-organization.html","Properties":{"FeatureSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-organization.html#cfn-organizations-organization-featureset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Organizations::OrganizationalUnit":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-organizationalunit.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-organizationalunit.html#cfn-organizations-organizationalunit-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ParentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-organizationalunit.html#cfn-organizations-organizationalunit-parentid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-organizationalunit.html#cfn-organizations-organizationalunit-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Organizations::Policy":{"Attributes":{"Arn":{"PrimitiveType":"String"},"AwsManaged":{"PrimitiveType":"Boolean"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-policy.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-policy.html#cfn-organizations-policy-content","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-policy.html#cfn-organizations-policy-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-policy.html#cfn-organizations-policy-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-policy.html#cfn-organizations-policy-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-policy.html#cfn-organizations-policy-targetids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-policy.html#cfn-organizations-policy-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Organizations::ResourcePolicy":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-resourcepolicy.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-resourcepolicy.html#cfn-organizations-resourcepolicy-content","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-organizations-resourcepolicy.html#cfn-organizations-resourcepolicy-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Panorama::ApplicationInstance":{"Attributes":{"ApplicationInstanceId":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"Integer"},"DefaultRuntimeContextDeviceName":{"PrimitiveType":"String"},"HealthStatus":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"Integer"},"Status":{"PrimitiveType":"String"},"StatusDescription":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-applicationinstance.html","Properties":{"ApplicationInstanceIdToReplace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-applicationinstance.html#cfn-panorama-applicationinstance-applicationinstanceidtoreplace","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DefaultRuntimeContextDevice":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-applicationinstance.html#cfn-panorama-applicationinstance-defaultruntimecontextdevice","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-applicationinstance.html#cfn-panorama-applicationinstance-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ManifestOverridesPayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-applicationinstance.html#cfn-panorama-applicationinstance-manifestoverridespayload","Required":false,"Type":"ManifestOverridesPayload","UpdateType":"Immutable"},"ManifestPayload":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-applicationinstance.html#cfn-panorama-applicationinstance-manifestpayload","Required":true,"Type":"ManifestPayload","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-applicationinstance.html#cfn-panorama-applicationinstance-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RuntimeRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-applicationinstance.html#cfn-panorama-applicationinstance-runtimerolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-applicationinstance.html#cfn-panorama-applicationinstance-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Panorama::Package":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"Integer"},"PackageId":{"PrimitiveType":"String"},"StorageLocation.BinaryPrefixLocation":{"PrimitiveType":"String"},"StorageLocation.Bucket":{"PrimitiveType":"String"},"StorageLocation.GeneratedPrefixLocation":{"PrimitiveType":"String"},"StorageLocation.ManifestPrefixLocation":{"PrimitiveType":"String"},"StorageLocation.RepoPrefixLocation":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-package.html","Properties":{"PackageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-package.html#cfn-panorama-package-packagename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StorageLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-package.html#cfn-panorama-package-storagelocation","Required":false,"Type":"StorageLocation","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-package.html#cfn-panorama-package-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Panorama::PackageVersion":{"Attributes":{"IsLatestPatch":{"PrimitiveType":"Boolean"},"PackageArn":{"PrimitiveType":"String"},"PackageName":{"PrimitiveType":"String"},"RegisteredTime":{"PrimitiveType":"Integer"},"Status":{"PrimitiveType":"String"},"StatusDescription":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-packageversion.html","Properties":{"MarkLatest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-packageversion.html#cfn-panorama-packageversion-marklatest","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"OwnerAccount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-packageversion.html#cfn-panorama-packageversion-owneraccount","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PackageId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-packageversion.html#cfn-panorama-packageversion-packageid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PackageVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-packageversion.html#cfn-panorama-packageversion-packageversion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PatchVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-packageversion.html#cfn-panorama-packageversion-patchversion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UpdatedLatestPatchVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-panorama-packageversion.html#cfn-panorama-packageversion-updatedlatestpatchversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Personalize::Dataset":{"Attributes":{"DatasetArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-dataset.html","Properties":{"DatasetGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-dataset.html#cfn-personalize-dataset-datasetgrouparn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatasetImportJob":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-dataset.html#cfn-personalize-dataset-datasetimportjob","Required":false,"Type":"DatasetImportJob","UpdateType":"Mutable"},"DatasetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-dataset.html#cfn-personalize-dataset-datasettype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-dataset.html#cfn-personalize-dataset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SchemaArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-dataset.html#cfn-personalize-dataset-schemaarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Personalize::DatasetGroup":{"Attributes":{"DatasetGroupArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-datasetgroup.html","Properties":{"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-datasetgroup.html#cfn-personalize-datasetgroup-domain","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-datasetgroup.html#cfn-personalize-datasetgroup-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-datasetgroup.html#cfn-personalize-datasetgroup-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-datasetgroup.html#cfn-personalize-datasetgroup-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Personalize::Schema":{"Attributes":{"SchemaArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-schema.html","Properties":{"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-schema.html#cfn-personalize-schema-domain","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-schema.html#cfn-personalize-schema-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-schema.html#cfn-personalize-schema-schema","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Personalize::Solution":{"Attributes":{"SolutionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-solution.html","Properties":{"DatasetGroupArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-solution.html#cfn-personalize-solution-datasetgrouparn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EventType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-solution.html#cfn-personalize-solution-eventtype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-solution.html#cfn-personalize-solution-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PerformAutoML":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-solution.html#cfn-personalize-solution-performautoml","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"PerformHPO":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-solution.html#cfn-personalize-solution-performhpo","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"RecipeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-solution.html#cfn-personalize-solution-recipearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SolutionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-personalize-solution.html#cfn-personalize-solution-solutionconfig","Required":false,"Type":"SolutionConfig","UpdateType":"Immutable"}}},"AWS::Pinpoint::ADMChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-admchannel.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-admchannel.html#cfn-pinpoint-admchannel-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ClientId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-admchannel.html#cfn-pinpoint-admchannel-clientid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClientSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-admchannel.html#cfn-pinpoint-admchannel-clientsecret","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-admchannel.html#cfn-pinpoint-admchannel-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::APNSChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnschannel.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnschannel.html#cfn-pinpoint-apnschannel-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BundleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnschannel.html#cfn-pinpoint-apnschannel-bundleid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnschannel.html#cfn-pinpoint-apnschannel-certificate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultAuthenticationMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnschannel.html#cfn-pinpoint-apnschannel-defaultauthenticationmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnschannel.html#cfn-pinpoint-apnschannel-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnschannel.html#cfn-pinpoint-apnschannel-privatekey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TeamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnschannel.html#cfn-pinpoint-apnschannel-teamid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnschannel.html#cfn-pinpoint-apnschannel-tokenkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnschannel.html#cfn-pinpoint-apnschannel-tokenkeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::APNSSandboxChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnssandboxchannel.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnssandboxchannel.html#cfn-pinpoint-apnssandboxchannel-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BundleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnssandboxchannel.html#cfn-pinpoint-apnssandboxchannel-bundleid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnssandboxchannel.html#cfn-pinpoint-apnssandboxchannel-certificate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultAuthenticationMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnssandboxchannel.html#cfn-pinpoint-apnssandboxchannel-defaultauthenticationmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnssandboxchannel.html#cfn-pinpoint-apnssandboxchannel-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnssandboxchannel.html#cfn-pinpoint-apnssandboxchannel-privatekey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TeamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnssandboxchannel.html#cfn-pinpoint-apnssandboxchannel-teamid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnssandboxchannel.html#cfn-pinpoint-apnssandboxchannel-tokenkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnssandboxchannel.html#cfn-pinpoint-apnssandboxchannel-tokenkeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::APNSVoipChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipchannel.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipchannel.html#cfn-pinpoint-apnsvoipchannel-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BundleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipchannel.html#cfn-pinpoint-apnsvoipchannel-bundleid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipchannel.html#cfn-pinpoint-apnsvoipchannel-certificate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultAuthenticationMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipchannel.html#cfn-pinpoint-apnsvoipchannel-defaultauthenticationmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipchannel.html#cfn-pinpoint-apnsvoipchannel-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipchannel.html#cfn-pinpoint-apnsvoipchannel-privatekey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TeamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipchannel.html#cfn-pinpoint-apnsvoipchannel-teamid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipchannel.html#cfn-pinpoint-apnsvoipchannel-tokenkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipchannel.html#cfn-pinpoint-apnsvoipchannel-tokenkeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::APNSVoipSandboxChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipsandboxchannel.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipsandboxchannel.html#cfn-pinpoint-apnsvoipsandboxchannel-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BundleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipsandboxchannel.html#cfn-pinpoint-apnsvoipsandboxchannel-bundleid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipsandboxchannel.html#cfn-pinpoint-apnsvoipsandboxchannel-certificate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultAuthenticationMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipsandboxchannel.html#cfn-pinpoint-apnsvoipsandboxchannel-defaultauthenticationmethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipsandboxchannel.html#cfn-pinpoint-apnsvoipsandboxchannel-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipsandboxchannel.html#cfn-pinpoint-apnsvoipsandboxchannel-privatekey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TeamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipsandboxchannel.html#cfn-pinpoint-apnsvoipsandboxchannel-teamid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipsandboxchannel.html#cfn-pinpoint-apnsvoipsandboxchannel-tokenkey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TokenKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-apnsvoipsandboxchannel.html#cfn-pinpoint-apnsvoipsandboxchannel-tokenkeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::App":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-app.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-app.html#cfn-pinpoint-app-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-app.html#cfn-pinpoint-app-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::ApplicationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-applicationsettings.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-applicationsettings.html#cfn-pinpoint-applicationsettings-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CampaignHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-applicationsettings.html#cfn-pinpoint-applicationsettings-campaignhook","Required":false,"Type":"CampaignHook","UpdateType":"Mutable"},"CloudWatchMetricsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-applicationsettings.html#cfn-pinpoint-applicationsettings-cloudwatchmetricsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Limits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-applicationsettings.html#cfn-pinpoint-applicationsettings-limits","Required":false,"Type":"Limits","UpdateType":"Mutable"},"QuietTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-applicationsettings.html#cfn-pinpoint-applicationsettings-quiettime","Required":false,"Type":"QuietTime","UpdateType":"Mutable"}}},"AWS::Pinpoint::BaiduChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-baiduchannel.html","Properties":{"ApiKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-baiduchannel.html#cfn-pinpoint-baiduchannel-apikey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-baiduchannel.html#cfn-pinpoint-baiduchannel-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-baiduchannel.html#cfn-pinpoint-baiduchannel-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SecretKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-baiduchannel.html#cfn-pinpoint-baiduchannel-secretkey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Campaign":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CampaignId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html","Properties":{"AdditionalTreatments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-additionaltreatments","ItemType":"WriteTreatmentResource","Required":false,"Type":"List","UpdateType":"Mutable"},"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CampaignHook":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-campaignhook","Required":false,"Type":"CampaignHook","UpdateType":"Mutable"},"CustomDeliveryConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-customdeliveryconfiguration","Required":false,"Type":"CustomDeliveryConfiguration","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HoldoutPercent":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-holdoutpercent","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IsPaused":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-ispaused","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Limits":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-limits","Required":false,"Type":"Limits","UpdateType":"Mutable"},"MessageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-messageconfiguration","Required":false,"Type":"MessageConfiguration","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-priority","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-schedule","Required":true,"Type":"Schedule","UpdateType":"Mutable"},"SegmentId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-segmentid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SegmentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-segmentversion","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TemplateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-templateconfiguration","Required":false,"Type":"TemplateConfiguration","UpdateType":"Mutable"},"TreatmentDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-treatmentdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TreatmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-campaign.html#cfn-pinpoint-campaign-treatmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::EmailChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailchannel.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailchannel.html#cfn-pinpoint-emailchannel-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ConfigurationSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailchannel.html#cfn-pinpoint-emailchannel-configurationset","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailchannel.html#cfn-pinpoint-emailchannel-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"FromAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailchannel.html#cfn-pinpoint-emailchannel-fromaddress","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Identity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailchannel.html#cfn-pinpoint-emailchannel-identity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailchannel.html#cfn-pinpoint-emailchannel-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::EmailTemplate":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailtemplate.html","Properties":{"DefaultSubstitutions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailtemplate.html#cfn-pinpoint-emailtemplate-defaultsubstitutions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HtmlPart":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailtemplate.html#cfn-pinpoint-emailtemplate-htmlpart","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Subject":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailtemplate.html#cfn-pinpoint-emailtemplate-subject","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailtemplate.html#cfn-pinpoint-emailtemplate-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TemplateDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailtemplate.html#cfn-pinpoint-emailtemplate-templatedescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailtemplate.html#cfn-pinpoint-emailtemplate-templatename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TextPart":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-emailtemplate.html#cfn-pinpoint-emailtemplate-textpart","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::EventStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-eventstream.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-eventstream.html#cfn-pinpoint-eventstream-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DestinationStreamArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-eventstream.html#cfn-pinpoint-eventstream-destinationstreamarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-eventstream.html#cfn-pinpoint-eventstream-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Pinpoint::GCMChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-gcmchannel.html","Properties":{"ApiKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-gcmchannel.html#cfn-pinpoint-gcmchannel-apikey","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-gcmchannel.html#cfn-pinpoint-gcmchannel-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-gcmchannel.html#cfn-pinpoint-gcmchannel-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::InAppTemplate":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-inapptemplate.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-inapptemplate.html#cfn-pinpoint-inapptemplate-content","DuplicatesAllowed":true,"ItemType":"InAppMessageContent","Required":false,"Type":"List","UpdateType":"Mutable"},"CustomConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-inapptemplate.html#cfn-pinpoint-inapptemplate-customconfig","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Layout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-inapptemplate.html#cfn-pinpoint-inapptemplate-layout","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-inapptemplate.html#cfn-pinpoint-inapptemplate-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TemplateDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-inapptemplate.html#cfn-pinpoint-inapptemplate-templatedescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-inapptemplate.html#cfn-pinpoint-inapptemplate-templatename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Pinpoint::PushTemplate":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-pushtemplate.html","Properties":{"ADM":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-pushtemplate.html#cfn-pinpoint-pushtemplate-adm","Required":false,"Type":"AndroidPushNotificationTemplate","UpdateType":"Mutable"},"APNS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-pushtemplate.html#cfn-pinpoint-pushtemplate-apns","Required":false,"Type":"APNSPushNotificationTemplate","UpdateType":"Mutable"},"Baidu":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-pushtemplate.html#cfn-pinpoint-pushtemplate-baidu","Required":false,"Type":"AndroidPushNotificationTemplate","UpdateType":"Mutable"},"Default":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-pushtemplate.html#cfn-pinpoint-pushtemplate-default","Required":false,"Type":"DefaultPushNotificationTemplate","UpdateType":"Mutable"},"DefaultSubstitutions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-pushtemplate.html#cfn-pinpoint-pushtemplate-defaultsubstitutions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GCM":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-pushtemplate.html#cfn-pinpoint-pushtemplate-gcm","Required":false,"Type":"AndroidPushNotificationTemplate","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-pushtemplate.html#cfn-pinpoint-pushtemplate-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TemplateDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-pushtemplate.html#cfn-pinpoint-pushtemplate-templatedescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-pushtemplate.html#cfn-pinpoint-pushtemplate-templatename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Pinpoint::SMSChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-smschannel.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-smschannel.html#cfn-pinpoint-smschannel-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-smschannel.html#cfn-pinpoint-smschannel-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SenderId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-smschannel.html#cfn-pinpoint-smschannel-senderid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ShortCode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-smschannel.html#cfn-pinpoint-smschannel-shortcode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::Segment":{"Attributes":{"Arn":{"PrimitiveType":"String"},"SegmentId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-segment.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-segment.html#cfn-pinpoint-segment-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Dimensions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-segment.html#cfn-pinpoint-segment-dimensions","Required":false,"Type":"SegmentDimensions","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-segment.html#cfn-pinpoint-segment-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SegmentGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-segment.html#cfn-pinpoint-segment-segmentgroups","Required":false,"Type":"SegmentGroups","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-segment.html#cfn-pinpoint-segment-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::Pinpoint::SmsTemplate":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-smstemplate.html","Properties":{"Body":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-smstemplate.html#cfn-pinpoint-smstemplate-body","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DefaultSubstitutions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-smstemplate.html#cfn-pinpoint-smstemplate-defaultsubstitutions","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-smstemplate.html#cfn-pinpoint-smstemplate-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TemplateDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-smstemplate.html#cfn-pinpoint-smstemplate-templatedescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TemplateName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-smstemplate.html#cfn-pinpoint-smstemplate-templatename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Pinpoint::VoiceChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-voicechannel.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-voicechannel.html#cfn-pinpoint-voicechannel-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpoint-voicechannel.html#cfn-pinpoint-voicechannel-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-configurationset.html","Properties":{"DeliveryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-configurationset.html#cfn-pinpointemail-configurationset-deliveryoptions","Required":false,"Type":"DeliveryOptions","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-configurationset.html#cfn-pinpointemail-configurationset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ReputationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-configurationset.html#cfn-pinpointemail-configurationset-reputationoptions","Required":false,"Type":"ReputationOptions","UpdateType":"Mutable"},"SendingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-configurationset.html#cfn-pinpointemail-configurationset-sendingoptions","Required":false,"Type":"SendingOptions","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-configurationset.html#cfn-pinpointemail-configurationset-tags","ItemType":"Tags","Required":false,"Type":"List","UpdateType":"Mutable"},"TrackingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-configurationset.html#cfn-pinpointemail-configurationset-trackingoptions","Required":false,"Type":"TrackingOptions","UpdateType":"Mutable"}}},"AWS::PinpointEmail::ConfigurationSetEventDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-configurationseteventdestination.html","Properties":{"ConfigurationSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-configurationseteventdestination.html#cfn-pinpointemail-configurationseteventdestination-configurationsetname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EventDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-configurationseteventdestination.html#cfn-pinpointemail-configurationseteventdestination-eventdestination","Required":false,"Type":"EventDestination","UpdateType":"Mutable"},"EventDestinationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-configurationseteventdestination.html#cfn-pinpointemail-configurationseteventdestination-eventdestinationname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::PinpointEmail::DedicatedIpPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-dedicatedippool.html","Properties":{"PoolName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-dedicatedippool.html#cfn-pinpointemail-dedicatedippool-poolname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-dedicatedippool.html#cfn-pinpointemail-dedicatedippool-tags","ItemType":"Tags","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::PinpointEmail::Identity":{"Attributes":{"IdentityDNSRecordName1":{"PrimitiveType":"String"},"IdentityDNSRecordName2":{"PrimitiveType":"String"},"IdentityDNSRecordName3":{"PrimitiveType":"String"},"IdentityDNSRecordValue1":{"PrimitiveType":"String"},"IdentityDNSRecordValue2":{"PrimitiveType":"String"},"IdentityDNSRecordValue3":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-identity.html","Properties":{"DkimSigningEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-identity.html#cfn-pinpointemail-identity-dkimsigningenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"FeedbackForwardingEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-identity.html#cfn-pinpointemail-identity-feedbackforwardingenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MailFromAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-identity.html#cfn-pinpointemail-identity-mailfromattributes","Required":false,"Type":"MailFromAttributes","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-identity.html#cfn-pinpointemail-identity-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pinpointemail-identity.html#cfn-pinpointemail-identity-tags","ItemType":"Tags","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Pipes::Pipe":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"CurrentState":{"PrimitiveType":"String"},"LastModifiedTime":{"PrimitiveType":"String"},"StateReason":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html#cfn-pipes-pipe-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DesiredState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html#cfn-pipes-pipe-desiredstate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Enrichment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html#cfn-pipes-pipe-enrichment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnrichmentParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html#cfn-pipes-pipe-enrichmentparameters","Required":false,"Type":"PipeEnrichmentParameters","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html#cfn-pipes-pipe-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html#cfn-pipes-pipe-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html#cfn-pipes-pipe-source","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SourceParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html#cfn-pipes-pipe-sourceparameters","Required":false,"Type":"PipeSourceParameters","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html#cfn-pipes-pipe-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html#cfn-pipes-pipe-target","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-pipes-pipe.html#cfn-pipes-pipe-targetparameters","Required":false,"Type":"PipeTargetParameters","UpdateType":"Mutable"}}},"AWS::Proton::EnvironmentAccountConnection":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmentaccountconnection.html","Properties":{"CodebuildRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmentaccountconnection.html#cfn-proton-environmentaccountconnection-codebuildrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ComponentRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmentaccountconnection.html#cfn-proton-environmentaccountconnection-componentrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnvironmentAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmentaccountconnection.html#cfn-proton-environmentaccountconnection-environmentaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnvironmentName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmentaccountconnection.html#cfn-proton-environmentaccountconnection-environmentname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ManagementAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmentaccountconnection.html#cfn-proton-environmentaccountconnection-managementaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmentaccountconnection.html#cfn-proton-environmentaccountconnection-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmentaccountconnection.html#cfn-proton-environmentaccountconnection-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Proton::EnvironmentTemplate":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmenttemplate.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmenttemplate.html#cfn-proton-environmenttemplate-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmenttemplate.html#cfn-proton-environmenttemplate-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmenttemplate.html#cfn-proton-environmenttemplate-encryptionkey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmenttemplate.html#cfn-proton-environmenttemplate-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Provisioning":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmenttemplate.html#cfn-proton-environmenttemplate-provisioning","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-environmenttemplate.html#cfn-proton-environmenttemplate-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Proton::ServiceTemplate":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-servicetemplate.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-servicetemplate.html#cfn-proton-servicetemplate-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-servicetemplate.html#cfn-proton-servicetemplate-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EncryptionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-servicetemplate.html#cfn-proton-servicetemplate-encryptionkey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-servicetemplate.html#cfn-proton-servicetemplate-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PipelineProvisioning":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-servicetemplate.html#cfn-proton-servicetemplate-pipelineprovisioning","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-proton-servicetemplate.html#cfn-proton-servicetemplate-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QLDB::Ledger":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-ledger.html","Properties":{"DeletionProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-ledger.html#cfn-qldb-ledger-deletionprotection","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"KmsKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-ledger.html#cfn-qldb-ledger-kmskey","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-ledger.html#cfn-qldb-ledger-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PermissionsMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-ledger.html#cfn-qldb-ledger-permissionsmode","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-ledger.html#cfn-qldb-ledger-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QLDB::Stream":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-stream.html","Properties":{"ExclusiveEndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-stream.html#cfn-qldb-stream-exclusiveendtime","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InclusiveStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-stream.html#cfn-qldb-stream-inclusivestarttime","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KinesisConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-stream.html#cfn-qldb-stream-kinesisconfiguration","Required":true,"Type":"KinesisConfiguration","UpdateType":"Immutable"},"LedgerName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-stream.html#cfn-qldb-stream-ledgername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-stream.html#cfn-qldb-stream-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StreamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-stream.html#cfn-qldb-stream-streamname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-qldb-stream.html#cfn-qldb-stream-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::Analysis":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"DataSetArns":{"PrimitiveItemType":"String","Type":"List"},"Errors":{"ItemType":"AnalysisError","Type":"List"},"LastUpdatedTime":{"PrimitiveType":"String"},"Sheets":{"ItemType":"Sheet","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-analysis.html","Properties":{"AnalysisId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-analysis.html#cfn-quicksight-analysis-analysisid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-analysis.html#cfn-quicksight-analysis-awsaccountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-analysis.html#cfn-quicksight-analysis-definition","Required":false,"Type":"AnalysisDefinition","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-analysis.html#cfn-quicksight-analysis-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-analysis.html#cfn-quicksight-analysis-parameters","Required":false,"Type":"Parameters","UpdateType":"Mutable"},"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-analysis.html#cfn-quicksight-analysis-permissions","DuplicatesAllowed":true,"ItemType":"ResourcePermission","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceEntity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-analysis.html#cfn-quicksight-analysis-sourceentity","Required":false,"Type":"AnalysisSourceEntity","UpdateType":"Mutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-analysis.html#cfn-quicksight-analysis-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-analysis.html#cfn-quicksight-analysis-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ThemeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-analysis.html#cfn-quicksight-analysis-themearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Dashboard":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"LastPublishedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"},"Version.Arn":{"PrimitiveType":"String"},"Version.CreatedTime":{"PrimitiveType":"String"},"Version.DataSetArns":{"PrimitiveItemType":"String","Type":"List"},"Version.Description":{"PrimitiveType":"String"},"Version.Errors":{"ItemType":"DashboardError","Type":"List"},"Version.Sheets":{"ItemType":"Sheet","Type":"List"},"Version.SourceEntityArn":{"PrimitiveType":"String"},"Version.Status":{"PrimitiveType":"String"},"Version.ThemeArn":{"PrimitiveType":"String"},"Version.VersionNumber":{"PrimitiveType":"Double"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html","Properties":{"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html#cfn-quicksight-dashboard-awsaccountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DashboardId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html#cfn-quicksight-dashboard-dashboardid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DashboardPublishOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html#cfn-quicksight-dashboard-dashboardpublishoptions","Required":false,"Type":"DashboardPublishOptions","UpdateType":"Mutable"},"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html#cfn-quicksight-dashboard-definition","Required":false,"Type":"DashboardVersionDefinition","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html#cfn-quicksight-dashboard-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html#cfn-quicksight-dashboard-parameters","Required":false,"Type":"Parameters","UpdateType":"Mutable"},"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html#cfn-quicksight-dashboard-permissions","DuplicatesAllowed":true,"ItemType":"ResourcePermission","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceEntity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html#cfn-quicksight-dashboard-sourceentity","Required":false,"Type":"DashboardSourceEntity","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html#cfn-quicksight-dashboard-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ThemeArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html#cfn-quicksight-dashboard-themearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VersionDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dashboard.html#cfn-quicksight-dashboard-versiondescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::DataSet":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ConsumedSpiceCapacityInBytes":{"PrimitiveType":"Double"},"CreatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"},"OutputColumns":{"ItemType":"OutputColumn","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html","Properties":{"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-awsaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ColumnGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-columngroups","DuplicatesAllowed":true,"ItemType":"ColumnGroup","Required":false,"Type":"List","UpdateType":"Mutable"},"ColumnLevelPermissionRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-columnlevelpermissionrules","DuplicatesAllowed":true,"ItemType":"ColumnLevelPermissionRule","Required":false,"Type":"List","UpdateType":"Mutable"},"DataSetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-datasetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DataSetRefreshProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-datasetrefreshproperties","Required":false,"Type":"DataSetRefreshProperties","UpdateType":"Mutable"},"DataSetUsageConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-datasetusageconfiguration","Required":false,"Type":"DataSetUsageConfiguration","UpdateType":"Mutable"},"DatasetParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-datasetparameters","DuplicatesAllowed":true,"ItemType":"DatasetParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"FieldFolders":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-fieldfolders","ItemType":"FieldFolder","Required":false,"Type":"Map","UpdateType":"Mutable"},"ImportMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-importmode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IngestionWaitPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-ingestionwaitpolicy","Required":false,"Type":"IngestionWaitPolicy","UpdateType":"Mutable"},"LogicalTableMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-logicaltablemap","ItemType":"LogicalTable","Required":false,"Type":"Map","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-permissions","DuplicatesAllowed":true,"ItemType":"ResourcePermission","Required":false,"Type":"List","UpdateType":"Mutable"},"PhysicalTableMap":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-physicaltablemap","ItemType":"PhysicalTable","Required":false,"Type":"Map","UpdateType":"Mutable"},"RowLevelPermissionDataSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-rowlevelpermissiondataset","Required":false,"Type":"RowLevelPermissionDataSet","UpdateType":"Mutable"},"RowLevelPermissionTagConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-rowlevelpermissiontagconfiguration","Required":false,"Type":"RowLevelPermissionTagConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-dataset.html#cfn-quicksight-dataset-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::QuickSight::DataSource":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html","Properties":{"AlternateDataSourceParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-alternatedatasourceparameters","DuplicatesAllowed":true,"ItemType":"DataSourceParameters","Required":false,"Type":"List","UpdateType":"Mutable"},"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-awsaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Credentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-credentials","Required":false,"Type":"DataSourceCredentials","UpdateType":"Mutable"},"DataSourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-datasourceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DataSourceParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-datasourceparameters","Required":false,"Type":"DataSourceParameters","UpdateType":"Mutable"},"ErrorInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-errorinfo","Required":false,"Type":"DataSourceErrorInfo","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-permissions","DuplicatesAllowed":true,"ItemType":"ResourcePermission","Required":false,"Type":"List","UpdateType":"Mutable"},"SslProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-sslproperties","Required":false,"Type":"SslProperties","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VpcConnectionProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-datasource.html#cfn-quicksight-datasource-vpcconnectionproperties","Required":false,"Type":"VpcConnectionProperties","UpdateType":"Mutable"}}},"AWS::QuickSight::RefreshSchedule":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-refreshschedule.html","Properties":{"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-refreshschedule.html#cfn-quicksight-refreshschedule-awsaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DataSetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-refreshschedule.html#cfn-quicksight-refreshschedule-datasetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-refreshschedule.html#cfn-quicksight-refreshschedule-schedule","Required":false,"Type":"RefreshScheduleMap","UpdateType":"Mutable"}}},"AWS::QuickSight::Template":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"},"Version.CreatedTime":{"PrimitiveType":"String"},"Version.DataSetConfigurations":{"ItemType":"DataSetConfiguration","Type":"List"},"Version.Description":{"PrimitiveType":"String"},"Version.Errors":{"ItemType":"TemplateError","Type":"List"},"Version.Sheets":{"ItemType":"Sheet","Type":"List"},"Version.SourceEntityArn":{"PrimitiveType":"String"},"Version.Status":{"PrimitiveType":"String"},"Version.ThemeArn":{"PrimitiveType":"String"},"Version.VersionNumber":{"PrimitiveType":"Double"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-template.html","Properties":{"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-template.html#cfn-quicksight-template-awsaccountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-template.html#cfn-quicksight-template-definition","Required":false,"Type":"TemplateVersionDefinition","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-template.html#cfn-quicksight-template-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-template.html#cfn-quicksight-template-permissions","DuplicatesAllowed":true,"ItemType":"ResourcePermission","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceEntity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-template.html#cfn-quicksight-template-sourceentity","Required":false,"Type":"TemplateSourceEntity","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-template.html#cfn-quicksight-template-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TemplateId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-template.html#cfn-quicksight-template-templateid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VersionDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-template.html#cfn-quicksight-template-versiondescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Theme":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"},"Type":{"PrimitiveType":"String"},"Version.Arn":{"PrimitiveType":"String"},"Version.BaseThemeId":{"PrimitiveType":"String"},"Version.Configuration":{"Type":"ThemeConfiguration"},"Version.Configuration.DataColorPalette":{"Type":"DataColorPalette"},"Version.Configuration.Sheet":{"Type":"SheetStyle"},"Version.Configuration.Typography":{"Type":"Typography"},"Version.Configuration.UIColorPalette":{"Type":"UIColorPalette"},"Version.CreatedTime":{"PrimitiveType":"String"},"Version.Description":{"PrimitiveType":"String"},"Version.Errors":{"ItemType":"ThemeError","Type":"List"},"Version.Status":{"PrimitiveType":"String"},"Version.VersionNumber":{"PrimitiveType":"Double"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-theme.html","Properties":{"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-theme.html#cfn-quicksight-theme-awsaccountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BaseThemeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-theme.html#cfn-quicksight-theme-basethemeid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-theme.html#cfn-quicksight-theme-configuration","Required":true,"Type":"ThemeConfiguration","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-theme.html#cfn-quicksight-theme-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Permissions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-theme.html#cfn-quicksight-theme-permissions","DuplicatesAllowed":true,"ItemType":"ResourcePermission","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-theme.html#cfn-quicksight-theme-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"ThemeId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-theme.html#cfn-quicksight-theme-themeid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VersionDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-theme.html#cfn-quicksight-theme-versiondescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::QuickSight::Topic":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-topic.html","Properties":{"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-topic.html#cfn-quicksight-topic-awsaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DataSets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-topic.html#cfn-quicksight-topic-datasets","DuplicatesAllowed":true,"ItemType":"DatasetMetadata","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-topic.html#cfn-quicksight-topic-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-topic.html#cfn-quicksight-topic-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TopicId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-topic.html#cfn-quicksight-topic-topicid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::QuickSight::VPCConnection":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedTime":{"PrimitiveType":"String"},"LastUpdatedTime":{"PrimitiveType":"String"},"NetworkInterfaces":{"ItemType":"NetworkInterface","Type":"List"},"Status":{"PrimitiveType":"String"},"VPCId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-vpcconnection.html","Properties":{"AvailabilityStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-vpcconnection.html#cfn-quicksight-vpcconnection-availabilitystatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AwsAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-vpcconnection.html#cfn-quicksight-vpcconnection-awsaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DnsResolvers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-vpcconnection.html#cfn-quicksight-vpcconnection-dnsresolvers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-vpcconnection.html#cfn-quicksight-vpcconnection-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-vpcconnection.html#cfn-quicksight-vpcconnection-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-vpcconnection.html#cfn-quicksight-vpcconnection-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-vpcconnection.html#cfn-quicksight-vpcconnection-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-vpcconnection.html#cfn-quicksight-vpcconnection-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VPCConnectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-quicksight-vpcconnection.html#cfn-quicksight-vpcconnection-vpcconnectionid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::RAM::Permission":{"Attributes":{"Arn":{"PrimitiveType":"String"},"IsResourceTypeDefault":{"PrimitiveType":"Boolean"},"PermissionType":{"PrimitiveType":"String"},"Version":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-permission.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-permission.html#cfn-ram-permission-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PolicyTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-permission.html#cfn-ram-permission-policytemplate","PrimitiveType":"Json","Required":true,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Immutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-permission.html#cfn-ram-permission-resourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-permission.html#cfn-ram-permission-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RAM::ResourceShare":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-resourceshare.html","Properties":{"AllowExternalPrincipals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-resourceshare.html#cfn-ram-resourceshare-allowexternalprincipals","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-resourceshare.html#cfn-ram-resourceshare-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PermissionArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-resourceshare.html#cfn-ram-resourceshare-permissionarns","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Principals":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-resourceshare.html#cfn-ram-resourceshare-principals","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-resourceshare.html#cfn-ram-resourceshare-resourcearns","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ram-resourceshare.html#cfn-ram-resourceshare-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RDS::CustomDBEngineVersion":{"Attributes":{"DBEngineVersionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-customdbengineversion.html","Properties":{"DatabaseInstallationFilesS3BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-customdbengineversion.html#cfn-rds-customdbengineversion-databaseinstallationfiless3bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DatabaseInstallationFilesS3Prefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-customdbengineversion.html#cfn-rds-customdbengineversion-databaseinstallationfiless3prefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-customdbengineversion.html#cfn-rds-customdbengineversion-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Engine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-customdbengineversion.html#cfn-rds-customdbengineversion-engine","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-customdbengineversion.html#cfn-rds-customdbengineversion-engineversion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KMSKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-customdbengineversion.html#cfn-rds-customdbengineversion-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Manifest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-customdbengineversion.html#cfn-rds-customdbengineversion-manifest","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-customdbengineversion.html#cfn-rds-customdbengineversion-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-customdbengineversion.html#cfn-rds-customdbengineversion-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RDS::DBCluster":{"Attributes":{"DBClusterArn":{"PrimitiveType":"String"},"DBClusterResourceId":{"PrimitiveType":"String"},"Endpoint":{"Type":"Endpoint"},"Endpoint.Address":{"PrimitiveType":"String"},"Endpoint.Port":{"PrimitiveType":"String"},"MasterUserSecret.SecretArn":{"PrimitiveType":"String"},"ReadEndpoint.Address":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html","Properties":{"AllocatedStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-allocatedstorage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AssociatedRoles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-associatedroles","DuplicatesAllowed":false,"ItemType":"DBClusterRole","Required":false,"Type":"List","UpdateType":"Mutable"},"AutoMinorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-autominorversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AvailabilityZones":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-availabilityzones","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"BacktrackWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-backtrackwindow","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"BackupRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-backupretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"CopyTagsToSnapshot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-copytagstosnapshot","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DBClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-dbclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBClusterInstanceClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-dbclusterinstanceclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DBClusterParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-dbclusterparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DBInstanceParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-dbinstanceparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DBSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-dbsubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBSystemId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-dbsystemid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeletionProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-deletionprotection","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-domain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainIAMRoleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-domainiamrolename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableCloudwatchLogsExports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-enablecloudwatchlogsexports","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"EnableHttpEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-enablehttpendpoint","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnableIAMDatabaseAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-enableiamdatabaseauthentication","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Engine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-engine","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"EngineMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-enginemode","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlobalClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-globalclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ManageMasterUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-managemasteruserpassword","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MasterUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-masteruserpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterUserSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-masterusersecret","Required":false,"Type":"MasterUserSecret","UpdateType":"Mutable"},"MasterUsername":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-masterusername","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"MonitoringInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-monitoringinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MonitoringRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-monitoringrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NetworkType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-networktype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PerformanceInsightsEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-performanceinsightsenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PerformanceInsightsKmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-performanceinsightskmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PerformanceInsightsRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-performanceinsightsretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PreferredBackupWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-preferredbackupwindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PubliclyAccessible":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-publiclyaccessible","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ReplicationSourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-replicationsourceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RestoreToTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-restoretotime","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RestoreType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-restoretype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ScalingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-scalingconfiguration","Required":false,"Type":"ScalingConfiguration","UpdateType":"Mutable"},"ServerlessV2ScalingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-serverlessv2scalingconfiguration","Required":false,"Type":"ServerlessV2ScalingConfiguration","UpdateType":"Mutable"},"SnapshotIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-snapshotidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceDBClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-sourcedbclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-sourceregion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StorageEncrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-storageencrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"StorageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-storagetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UseLatestRestorableTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-uselatestrestorabletime","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"VpcSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-vpcsecuritygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RDS::DBClusterParameterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbclusterparametergroup.html","Properties":{"DBClusterParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbclusterparametergroup.html#cfn-rds-dbclusterparametergroup-dbclusterparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbclusterparametergroup.html#cfn-rds-dbclusterparametergroup-description","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Family":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbclusterparametergroup.html#cfn-rds-dbclusterparametergroup-family","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbclusterparametergroup.html#cfn-rds-dbclusterparametergroup-parameters","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbclusterparametergroup.html#cfn-rds-dbclusterparametergroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RDS::DBInstance":{"Attributes":{"CertificateDetails.CAIdentifier":{"PrimitiveType":"String"},"CertificateDetails.ValidTill":{"PrimitiveType":"String"},"DBInstanceArn":{"PrimitiveType":"String"},"DBSystemId":{"PrimitiveType":"String"},"DbiResourceId":{"PrimitiveType":"String"},"Endpoint.Address":{"PrimitiveType":"String"},"Endpoint.HostedZoneId":{"PrimitiveType":"String"},"Endpoint.Port":{"PrimitiveType":"String"},"MasterUserSecret.SecretArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html","Properties":{"AllocatedStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-allocatedstorage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AllowMajorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-allowmajorversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AssociatedRoles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-associatedroles","DuplicatesAllowed":true,"ItemType":"DBInstanceRole","Required":false,"Type":"List","UpdateType":"Mutable"},"AutoMinorVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-autominorversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Conditional"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"BackupRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-backupretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Conditional"},"CACertificateIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-cacertificateidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CertificateDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-certificatedetails","Required":false,"Type":"CertificateDetails","UpdateType":"Mutable"},"CertificateRotationRestart":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-certificaterotationrestart","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CharacterSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-charactersetname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CopyTagsToSnapshot":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-copytagstosnapshot","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"CustomIAMInstanceProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-customiaminstanceprofile","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-dbclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBClusterSnapshotIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-dbclustersnapshotidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"DBInstanceClass":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-dbinstanceclass","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DBInstanceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-dbinstanceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-dbname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DBParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-dbparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"DBSecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-dbsecuritygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DBSnapshotIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-dbsnapshotidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"DBSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-dbsubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DeleteAutomatedBackups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-deleteautomatedbackups","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DeletionProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-deletionprotection","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-domain","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DomainIAMRoleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-domainiamrolename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableCloudwatchLogsExports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-enablecloudwatchlogsexports","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"EnableIAMDatabaseAuthentication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-enableiamdatabaseauthentication","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EnablePerformanceInsights":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-enableperformanceinsights","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-endpoint","Required":false,"Type":"Endpoint","UpdateType":"Mutable"},"Engine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-engine","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Iops":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-iops","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LicenseModel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-licensemodel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ManageMasterUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-managemasteruserpassword","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"MasterUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-masteruserpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MasterUserSecret":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-masterusersecret","Required":false,"Type":"MasterUserSecret","UpdateType":"Mutable"},"MasterUsername":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-masterusername","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MaxAllocatedStorage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-maxallocatedstorage","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MonitoringInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-monitoringinterval","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MonitoringRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-monitoringrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MultiAZ":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-multiaz","PrimitiveType":"Boolean","Required":false,"UpdateType":"Conditional"},"NcharCharacterSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-ncharcharactersetname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NetworkType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-networktype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OptionGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-optiongroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PerformanceInsightsKMSKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-performanceinsightskmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"PerformanceInsightsRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-performanceinsightsretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-port","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PreferredBackupWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-preferredbackupwindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"ProcessorFeatures":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-processorfeatures","DuplicatesAllowed":true,"ItemType":"ProcessorFeature","Required":false,"Type":"List","UpdateType":"Mutable"},"PromotionTier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-promotiontier","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PubliclyAccessible":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-publiclyaccessible","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ReplicaMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-replicamode","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RestoreTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-restoretime","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"SourceDBClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-sourcedbclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"SourceDBInstanceAutomatedBackupsArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-sourcedbinstanceautomatedbackupsarn","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"SourceDBInstanceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-sourcedbinstanceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"SourceDbiResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-sourcedbiresourceid","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"SourceRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-sourceregion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StorageEncrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-storageencrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"StorageThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-storagethroughput","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"StorageType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-storagetype","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Timezone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-timezone","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"UseDefaultProcessorFeatures":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-usedefaultprocessorfeatures","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"UseLatestRestorableTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-uselatestrestorabletime","PrimitiveType":"Boolean","Required":false,"UpdateType":"Conditional"},"VPCSecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html#cfn-rds-dbinstance-vpcsecuritygroups","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RDS::DBParameterGroup":{"Attributes":{"DBParameterGroupName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbparametergroup.html","Properties":{"DBParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbparametergroup.html#cfn-rds-dbparametergroup-dbparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbparametergroup.html#cfn-rds-dbparametergroup-description","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Family":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbparametergroup.html#cfn-rds-dbparametergroup-family","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbparametergroup.html#cfn-rds-dbparametergroup-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbparametergroup.html#cfn-rds-dbparametergroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RDS::DBProxy":{"Attributes":{"DBProxyArn":{"PrimitiveType":"String"},"Endpoint":{"PrimitiveType":"String"},"VpcId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html","Properties":{"Auth":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html#cfn-rds-dbproxy-auth","DuplicatesAllowed":true,"ItemType":"AuthFormat","Required":true,"Type":"List","UpdateType":"Mutable"},"DBProxyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html#cfn-rds-dbproxy-dbproxyname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DebugLogging":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html#cfn-rds-dbproxy-debuglogging","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EngineFamily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html#cfn-rds-dbproxy-enginefamily","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IdleClientTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html#cfn-rds-dbproxy-idleclienttimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RequireTLS":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html#cfn-rds-dbproxy-requiretls","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html#cfn-rds-dbproxy-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html#cfn-rds-dbproxy-tags","DuplicatesAllowed":true,"ItemType":"TagFormat","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html#cfn-rds-dbproxy-vpcsecuritygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcSubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html#cfn-rds-dbproxy-vpcsubnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::RDS::DBProxyEndpoint":{"Attributes":{"DBProxyEndpointArn":{"PrimitiveType":"String"},"Endpoint":{"PrimitiveType":"String"},"IsDefault":{"PrimitiveType":"Boolean"},"VpcId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxyendpoint.html","Properties":{"DBProxyEndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxyendpoint.html#cfn-rds-dbproxyendpoint-dbproxyendpointname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DBProxyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxyendpoint.html#cfn-rds-dbproxyendpoint-dbproxyname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxyendpoint.html#cfn-rds-dbproxyendpoint-tags","DuplicatesAllowed":true,"ItemType":"TagFormat","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxyendpoint.html#cfn-rds-dbproxyendpoint-targetrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VpcSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxyendpoint.html#cfn-rds-dbproxyendpoint-vpcsecuritygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcSubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxyendpoint.html#cfn-rds-dbproxyendpoint-vpcsubnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::RDS::DBProxyTargetGroup":{"Attributes":{"TargetGroupArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html","Properties":{"ConnectionPoolConfigurationInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html#cfn-rds-dbproxytargetgroup-connectionpoolconfigurationinfo","Required":false,"Type":"ConnectionPoolConfigurationInfoFormat","UpdateType":"Mutable"},"DBClusterIdentifiers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html#cfn-rds-dbproxytargetgroup-dbclusteridentifiers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DBInstanceIdentifiers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html#cfn-rds-dbproxytargetgroup-dbinstanceidentifiers","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DBProxyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html#cfn-rds-dbproxytargetgroup-dbproxyname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TargetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html#cfn-rds-dbproxytargetgroup-targetgroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::RDS::DBSecurityGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-security-group.html","Properties":{"DBSecurityGroupIngress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-security-group.html#cfn-rds-dbsecuritygroup-dbsecuritygroupingress","DuplicatesAllowed":false,"ItemType":"Ingress","Required":true,"Type":"List","UpdateType":"Mutable"},"EC2VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-security-group.html#cfn-rds-dbsecuritygroup-ec2vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-security-group.html#cfn-rds-dbsecuritygroup-groupdescription","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-security-group.html#cfn-rds-dbsecuritygroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RDS::DBSecurityGroupIngress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-security-group-ingress.html","Properties":{"CIDRIP":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-security-group-ingress.html#cfn-rds-securitygroup-ingress-cidrip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DBSecurityGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-security-group-ingress.html#cfn-rds-securitygroup-ingress-dbsecuritygroupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EC2SecurityGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-security-group-ingress.html#cfn-rds-securitygroup-ingress-ec2securitygroupid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EC2SecurityGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-security-group-ingress.html#cfn-rds-securitygroup-ingress-ec2securitygroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EC2SecurityGroupOwnerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-security-group-ingress.html#cfn-rds-securitygroup-ingress-ec2securitygroupownerid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RDS::DBSubnetGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbsubnetgroup.html","Properties":{"DBSubnetGroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbsubnetgroup.html#cfn-rds-dbsubnetgroup-dbsubnetgroupdescription","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"DBSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbsubnetgroup.html#cfn-rds-dbsubnetgroup-dbsubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbsubnetgroup.html#cfn-rds-dbsubnetgroup-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbsubnetgroup.html#cfn-rds-dbsubnetgroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RDS::EventSubscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-eventsubscription.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-eventsubscription.html#cfn-rds-eventsubscription-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EventCategories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-eventsubscription.html#cfn-rds-eventsubscription-eventcategories","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SnsTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-eventsubscription.html#cfn-rds-eventsubscription-snstopicarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SourceIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-eventsubscription.html#cfn-rds-eventsubscription-sourceids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-eventsubscription.html#cfn-rds-eventsubscription-sourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubscriptionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-eventsubscription.html#cfn-rds-eventsubscription-subscriptionname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-eventsubscription.html#cfn-rds-eventsubscription-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RDS::GlobalCluster":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html","Properties":{"DeletionProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-deletionprotection","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Engine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-engine","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-engineversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlobalClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-globalclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceDBClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-sourcedbclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StorageEncrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#cfn-rds-globalcluster-storageencrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"}}},"AWS::RDS::OptionGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-optiongroup.html","Properties":{"EngineName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-optiongroup.html#cfn-rds-optiongroup-enginename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MajorEngineVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-optiongroup.html#cfn-rds-optiongroup-majorengineversion","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OptionConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-optiongroup.html#cfn-rds-optiongroup-optionconfigurations","DuplicatesAllowed":true,"ItemType":"OptionConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"OptionGroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-optiongroup.html#cfn-rds-optiongroup-optiongroupdescription","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OptionGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-optiongroup.html#cfn-rds-optiongroup-optiongroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-optiongroup.html#cfn-rds-optiongroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RUM::AppMonitor":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rum-appmonitor.html","Properties":{"AppMonitorConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rum-appmonitor.html#cfn-rum-appmonitor-appmonitorconfiguration","Required":false,"Type":"AppMonitorConfiguration","UpdateType":"Mutable"},"CustomEvents":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rum-appmonitor.html#cfn-rum-appmonitor-customevents","Required":false,"Type":"CustomEvents","UpdateType":"Mutable"},"CwLogEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rum-appmonitor.html#cfn-rum-appmonitor-cwlogenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rum-appmonitor.html#cfn-rum-appmonitor-domain","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rum-appmonitor.html#cfn-rum-appmonitor-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rum-appmonitor.html#cfn-rum-appmonitor-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Redshift::Cluster":{"Attributes":{"DeferMaintenanceIdentifier":{"PrimitiveType":"String"},"Endpoint.Address":{"PrimitiveType":"String"},"Endpoint.Port":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html","Properties":{"AllowVersionUpgrade":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-allowversionupgrade","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AquaConfigurationStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-aquaconfigurationstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AutomatedSnapshotRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-automatedsnapshotretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"AvailabilityZone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-availabilityzone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AvailabilityZoneRelocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-availabilityzonerelocation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AvailabilityZoneRelocationStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-availabilityzonerelocationstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Classic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-classic","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-clusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ClusterParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-clusterparametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ClusterSecurityGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-clustersecuritygroups","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ClusterSubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-clustersubnetgroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ClusterType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-clustertype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ClusterVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-clusterversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DBName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-dbname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DeferMaintenance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-defermaintenance","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DeferMaintenanceDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-defermaintenanceduration","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"DeferMaintenanceEndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-defermaintenanceendtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeferMaintenanceStartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-defermaintenancestarttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DestinationRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-destinationregion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ElasticIp":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-elasticip","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Encrypted":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-encrypted","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-endpoint","Required":false,"Type":"Endpoint","UpdateType":"Mutable"},"EnhancedVpcRouting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-enhancedvpcrouting","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"HsmClientCertificateIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-hsmclientcertificateidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HsmConfigurationIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-hsmconfigurationidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IamRoles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-iamroles","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoggingProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-loggingproperties","Required":false,"Type":"LoggingProperties","UpdateType":"Mutable"},"MaintenanceTrackName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-maintenancetrackname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ManualSnapshotRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-manualsnapshotretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MasterUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-masteruserpassword","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"MasterUsername":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-masterusername","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NodeType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-nodetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NumberOfNodes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-numberofnodes","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"OwnerAccount":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-owneraccount","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PreferredMaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-preferredmaintenancewindow","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PubliclyAccessible":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-publiclyaccessible","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ResourceAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-resourceaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RevisionTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-revisiontarget","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RotateEncryptionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-rotateencryptionkey","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SnapshotClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-snapshotclusteridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SnapshotCopyGrantName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-snapshotcopygrantname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnapshotCopyManual":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-snapshotcopymanual","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SnapshotCopyRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-snapshotcopyretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SnapshotIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-snapshotidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-cluster.html#cfn-redshift-cluster-vpcsecuritygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Redshift::ClusterParameterGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clusterparametergroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clusterparametergroup.html#cfn-redshift-clusterparametergroup-description","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ParameterGroupFamily":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clusterparametergroup.html#cfn-redshift-clusterparametergroup-parametergroupfamily","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ParameterGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clusterparametergroup.html#cfn-redshift-clusterparametergroup-parametergroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clusterparametergroup.html#cfn-redshift-clusterparametergroup-parameters","DuplicatesAllowed":true,"ItemType":"Parameter","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clusterparametergroup.html#cfn-redshift-clusterparametergroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Redshift::ClusterSecurityGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersecuritygroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersecuritygroup.html#cfn-redshift-clustersecuritygroup-description","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersecuritygroup.html#cfn-redshift-clustersecuritygroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Redshift::ClusterSecurityGroupIngress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersecuritygroupingress.html","Properties":{"CIDRIP":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersecuritygroupingress.html#cfn-redshift-clustersecuritygroupingress-cidrip","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ClusterSecurityGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersecuritygroupingress.html#cfn-redshift-clustersecuritygroupingress-clustersecuritygroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EC2SecurityGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersecuritygroupingress.html#cfn-redshift-clustersecuritygroupingress-ec2securitygroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EC2SecurityGroupOwnerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersecuritygroupingress.html#cfn-redshift-clustersecuritygroupingress-ec2securitygroupownerid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Redshift::ClusterSubnetGroup":{"Attributes":{"ClusterSubnetGroupName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersubnetgroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersubnetgroup.html#cfn-redshift-clustersubnetgroup-description","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersubnetgroup.html#cfn-redshift-clustersubnetgroup-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-clustersubnetgroup.html#cfn-redshift-clustersubnetgroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Redshift::EndpointAccess":{"Attributes":{"Address":{"PrimitiveType":"String"},"EndpointCreateTime":{"PrimitiveType":"String"},"EndpointStatus":{"PrimitiveType":"String"},"Port":{"PrimitiveType":"Integer"},"VpcEndpoint":{"Type":"VpcEndpoint"},"VpcEndpoint.NetworkInterfaces":{"ItemType":"NetworkInterface","Type":"List"},"VpcEndpoint.VpcEndpointId":{"PrimitiveType":"String"},"VpcEndpoint.VpcId":{"PrimitiveType":"String"},"VpcSecurityGroups":{"ItemType":"VpcSecurityGroup","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointaccess.html","Properties":{"ClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointaccess.html#cfn-redshift-endpointaccess-clusteridentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointaccess.html#cfn-redshift-endpointaccess-endpointname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceOwner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointaccess.html#cfn-redshift-endpointaccess-resourceowner","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubnetGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointaccess.html#cfn-redshift-endpointaccess-subnetgroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VpcSecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointaccess.html#cfn-redshift-endpointaccess-vpcsecuritygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::Redshift::EndpointAuthorization":{"Attributes":{"AllowedAllVPCs":{"PrimitiveType":"Boolean"},"AllowedVPCs":{"PrimitiveItemType":"String","Type":"List"},"AuthorizeTime":{"PrimitiveType":"String"},"ClusterStatus":{"PrimitiveType":"String"},"EndpointCount":{"PrimitiveType":"Integer"},"Grantee":{"PrimitiveType":"String"},"Grantor":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointauthorization.html","Properties":{"Account":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointauthorization.html#cfn-redshift-endpointauthorization-account","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ClusterIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointauthorization.html#cfn-redshift-endpointauthorization-clusteridentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Force":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointauthorization.html#cfn-redshift-endpointauthorization-force","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"VpcIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-endpointauthorization.html#cfn-redshift-endpointauthorization-vpcids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Redshift::EventSubscription":{"Attributes":{"CustSubscriptionId":{"PrimitiveType":"String"},"CustomerAwsId":{"PrimitiveType":"String"},"EventCategoriesList":{"PrimitiveItemType":"String","Type":"List"},"SourceIdsList":{"PrimitiveItemType":"String","Type":"List"},"Status":{"PrimitiveType":"String"},"SubscriptionCreationTime":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-eventsubscription.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-eventsubscription.html#cfn-redshift-eventsubscription-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EventCategories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-eventsubscription.html#cfn-redshift-eventsubscription-eventcategories","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Severity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-eventsubscription.html#cfn-redshift-eventsubscription-severity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SnsTopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-eventsubscription.html#cfn-redshift-eventsubscription-snstopicarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SourceIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-eventsubscription.html#cfn-redshift-eventsubscription-sourceids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-eventsubscription.html#cfn-redshift-eventsubscription-sourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubscriptionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-eventsubscription.html#cfn-redshift-eventsubscription-subscriptionname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-eventsubscription.html#cfn-redshift-eventsubscription-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Redshift::ScheduledAction":{"Attributes":{"NextInvocations":{"PrimitiveItemType":"String","Type":"List"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-scheduledaction.html","Properties":{"Enable":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-scheduledaction.html#cfn-redshift-scheduledaction-enable","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"EndTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-scheduledaction.html#cfn-redshift-scheduledaction-endtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IamRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-scheduledaction.html#cfn-redshift-scheduledaction-iamrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-scheduledaction.html#cfn-redshift-scheduledaction-schedule","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduledActionDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-scheduledaction.html#cfn-redshift-scheduledaction-scheduledactiondescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduledActionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-scheduledaction.html#cfn-redshift-scheduledaction-scheduledactionname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-scheduledaction.html#cfn-redshift-scheduledaction-starttime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TargetAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshift-scheduledaction.html#cfn-redshift-scheduledaction-targetaction","Required":false,"Type":"ScheduledActionType","UpdateType":"Mutable"}}},"AWS::RedshiftServerless::Namespace":{"Attributes":{"Namespace":{"Type":"Namespace"},"Namespace.AdminUsername":{"PrimitiveType":"String"},"Namespace.CreationDate":{"PrimitiveType":"String"},"Namespace.DbName":{"PrimitiveType":"String"},"Namespace.DefaultIamRoleArn":{"PrimitiveType":"String"},"Namespace.IamRoles":{"PrimitiveItemType":"String","Type":"List"},"Namespace.KmsKeyId":{"PrimitiveType":"String"},"Namespace.LogExports":{"PrimitiveItemType":"String","Type":"List"},"Namespace.NamespaceArn":{"PrimitiveType":"String"},"Namespace.NamespaceId":{"PrimitiveType":"String"},"Namespace.NamespaceName":{"PrimitiveType":"String"},"Namespace.Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html","Properties":{"AdminUserPassword":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html#cfn-redshiftserverless-namespace-adminuserpassword","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AdminUsername":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html#cfn-redshiftserverless-namespace-adminusername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DbName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html#cfn-redshiftserverless-namespace-dbname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefaultIamRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html#cfn-redshiftserverless-namespace-defaultiamrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FinalSnapshotName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html#cfn-redshiftserverless-namespace-finalsnapshotname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FinalSnapshotRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html#cfn-redshiftserverless-namespace-finalsnapshotretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"IamRoles":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html#cfn-redshiftserverless-namespace-iamroles","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html#cfn-redshiftserverless-namespace-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LogExports":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html#cfn-redshiftserverless-namespace-logexports","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"NamespaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html#cfn-redshiftserverless-namespace-namespacename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-namespace.html#cfn-redshiftserverless-namespace-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::RedshiftServerless::Workgroup":{"Attributes":{"Workgroup":{"Type":"Workgroup"},"Workgroup.BaseCapacity":{"PrimitiveType":"Integer"},"Workgroup.ConfigParameters":{"ItemType":"ConfigParameter","Type":"List"},"Workgroup.CreationDate":{"PrimitiveType":"String"},"Workgroup.Endpoint":{"Type":"Endpoint"},"Workgroup.Endpoint.Address":{"PrimitiveType":"String"},"Workgroup.Endpoint.Port":{"PrimitiveType":"Integer"},"Workgroup.Endpoint.VpcEndpoints":{"ItemType":"VpcEndpoint","Type":"List"},"Workgroup.EnhancedVpcRouting":{"PrimitiveType":"Boolean"},"Workgroup.NamespaceName":{"PrimitiveType":"String"},"Workgroup.PubliclyAccessible":{"PrimitiveType":"Boolean"},"Workgroup.SecurityGroupIds":{"PrimitiveItemType":"String","Type":"List"},"Workgroup.Status":{"PrimitiveType":"String"},"Workgroup.SubnetIds":{"PrimitiveItemType":"String","Type":"List"},"Workgroup.WorkgroupArn":{"PrimitiveType":"String"},"Workgroup.WorkgroupId":{"PrimitiveType":"String"},"Workgroup.WorkgroupName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html","Properties":{"BaseCapacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-basecapacity","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ConfigParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-configparameters","DuplicatesAllowed":false,"ItemType":"ConfigParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"EnhancedVpcRouting":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-enhancedvpcrouting","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NamespaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-namespacename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"PubliclyAccessible":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-publiclyaccessible","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-securitygroupids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"WorkgroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-workgroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::RefactorSpaces::Application":{"Attributes":{"ApiGatewayId":{"PrimitiveType":"String"},"ApplicationIdentifier":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"},"NlbArn":{"PrimitiveType":"String"},"NlbName":{"PrimitiveType":"String"},"ProxyUrl":{"PrimitiveType":"String"},"StageName":{"PrimitiveType":"String"},"VpcLinkId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-application.html","Properties":{"ApiGatewayProxy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-application.html#cfn-refactorspaces-application-apigatewayproxy","Required":false,"Type":"ApiGatewayProxyInput","UpdateType":"Immutable"},"EnvironmentIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-application.html#cfn-refactorspaces-application-environmentidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-application.html#cfn-refactorspaces-application-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProxyType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-application.html#cfn-refactorspaces-application-proxytype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-application.html#cfn-refactorspaces-application-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-application.html#cfn-refactorspaces-application-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::RefactorSpaces::Environment":{"Attributes":{"Arn":{"PrimitiveType":"String"},"EnvironmentIdentifier":{"PrimitiveType":"String"},"TransitGatewayId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-environment.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-environment.html#cfn-refactorspaces-environment-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-environment.html#cfn-refactorspaces-environment-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"NetworkFabricType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-environment.html#cfn-refactorspaces-environment-networkfabrictype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-environment.html#cfn-refactorspaces-environment-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RefactorSpaces::Route":{"Attributes":{"Arn":{"PrimitiveType":"String"},"PathResourceToId":{"PrimitiveType":"String"},"RouteIdentifier":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-route.html","Properties":{"ApplicationIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-route.html#cfn-refactorspaces-route-applicationidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DefaultRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-route.html#cfn-refactorspaces-route-defaultroute","Required":false,"Type":"DefaultRouteInput","UpdateType":"Mutable"},"EnvironmentIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-route.html#cfn-refactorspaces-route-environmentidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RouteType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-route.html#cfn-refactorspaces-route-routetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ServiceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-route.html#cfn-refactorspaces-route-serviceidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-route.html#cfn-refactorspaces-route-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UriPathRoute":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-route.html#cfn-refactorspaces-route-uripathroute","Required":false,"Type":"UriPathRouteInput","UpdateType":"Mutable"}}},"AWS::RefactorSpaces::Service":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ServiceIdentifier":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-service.html","Properties":{"ApplicationIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-service.html#cfn-refactorspaces-service-applicationidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-service.html#cfn-refactorspaces-service-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-service.html#cfn-refactorspaces-service-endpointtype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EnvironmentIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-service.html#cfn-refactorspaces-service-environmentidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LambdaEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-service.html#cfn-refactorspaces-service-lambdaendpoint","Required":false,"Type":"LambdaEndpointInput","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-service.html#cfn-refactorspaces-service-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-service.html#cfn-refactorspaces-service-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UrlEndpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-service.html#cfn-refactorspaces-service-urlendpoint","Required":false,"Type":"UrlEndpointInput","UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-refactorspaces-service.html#cfn-refactorspaces-service-vpcid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Rekognition::Collection":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-collection.html","Properties":{"CollectionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-collection.html#cfn-rekognition-collection-collectionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-collection.html#cfn-rekognition-collection-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Rekognition::Project":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-project.html","Properties":{"ProjectName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-project.html#cfn-rekognition-project-projectname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Rekognition::StreamProcessor":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"StatusMessage":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html","Properties":{"BoundingBoxRegionsOfInterest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-boundingboxregionsofinterest","DuplicatesAllowed":false,"ItemType":"BoundingBox","Required":false,"Type":"List","UpdateType":"Immutable"},"ConnectedHomeSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-connectedhomesettings","Required":false,"Type":"ConnectedHomeSettings","UpdateType":"Immutable"},"DataSharingPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-datasharingpreference","Required":false,"Type":"DataSharingPreference","UpdateType":"Immutable"},"FaceSearchSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-facesearchsettings","Required":false,"Type":"FaceSearchSettings","UpdateType":"Immutable"},"KinesisDataStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-kinesisdatastream","Required":false,"Type":"KinesisDataStream","UpdateType":"Immutable"},"KinesisVideoStream":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-kinesisvideostream","Required":true,"Type":"KinesisVideoStream","UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NotificationChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-notificationchannel","Required":false,"Type":"NotificationChannel","UpdateType":"Immutable"},"PolygonRegionsOfInterest":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-polygonregionsofinterest","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"S3Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-s3destination","Required":false,"Type":"S3Destination","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rekognition-streamprocessor.html#cfn-rekognition-streamprocessor-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ResilienceHub::App":{"Attributes":{"AppArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-app.html","Properties":{"AppAssessmentSchedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-app.html#cfn-resiliencehub-app-appassessmentschedule","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AppTemplateBody":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-app.html#cfn-resiliencehub-app-apptemplatebody","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-app.html#cfn-resiliencehub-app-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-app.html#cfn-resiliencehub-app-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResiliencyPolicyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-app.html#cfn-resiliencehub-app-resiliencypolicyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-app.html#cfn-resiliencehub-app-resourcemappings","DuplicatesAllowed":true,"ItemType":"ResourceMapping","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-app.html#cfn-resiliencehub-app-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::ResilienceHub::ResiliencyPolicy":{"Attributes":{"PolicyArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-resiliencypolicy.html","Properties":{"DataLocationConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-resiliencypolicy.html#cfn-resiliencehub-resiliencypolicy-datalocationconstraint","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-resiliencypolicy.html#cfn-resiliencehub-resiliencypolicy-policy","ItemType":"FailurePolicy","Required":true,"Type":"Map","UpdateType":"Mutable"},"PolicyDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-resiliencypolicy.html#cfn-resiliencehub-resiliencypolicy-policydescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-resiliencypolicy.html#cfn-resiliencehub-resiliencypolicy-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-resiliencypolicy.html#cfn-resiliencehub-resiliencypolicy-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Tier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resiliencehub-resiliencypolicy.html#cfn-resiliencehub-resiliencypolicy-tier","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ResourceExplorer2::DefaultViewAssociation":{"Attributes":{"AssociatedAwsPrincipal":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourceexplorer2-defaultviewassociation.html","Properties":{"ViewArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourceexplorer2-defaultviewassociation.html#cfn-resourceexplorer2-defaultviewassociation-viewarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ResourceExplorer2::Index":{"Attributes":{"Arn":{"PrimitiveType":"String"},"IndexState":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourceexplorer2-index.html","Properties":{"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourceexplorer2-index.html#cfn-resourceexplorer2-index-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourceexplorer2-index.html#cfn-resourceexplorer2-index-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ResourceExplorer2::View":{"Attributes":{"ViewArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourceexplorer2-view.html","Properties":{"Filters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourceexplorer2-view.html#cfn-resourceexplorer2-view-filters","Required":false,"Type":"Filters","UpdateType":"Mutable"},"IncludedProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourceexplorer2-view.html#cfn-resourceexplorer2-view-includedproperties","DuplicatesAllowed":true,"ItemType":"IncludedProperty","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourceexplorer2-view.html#cfn-resourceexplorer2-view-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"ViewName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourceexplorer2-view.html#cfn-resourceexplorer2-view-viewname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ResourceGroups::Group":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourcegroups-group.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourcegroups-group.html#cfn-resourcegroups-group-configuration","DuplicatesAllowed":true,"ItemType":"ConfigurationItem","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourcegroups-group.html#cfn-resourcegroups-group-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourcegroups-group.html#cfn-resourcegroups-group-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceQuery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourcegroups-group.html#cfn-resourcegroups-group-resourcequery","Required":false,"Type":"ResourceQuery","UpdateType":"Mutable"},"Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourcegroups-group.html#cfn-resourcegroups-group-resources","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-resourcegroups-group.html#cfn-resourcegroups-group-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RoboMaker::Fleet":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-fleet.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-fleet.html#cfn-robomaker-fleet-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-fleet.html#cfn-robomaker-fleet-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::RoboMaker::Robot":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robot.html","Properties":{"Architecture":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robot.html#cfn-robomaker-robot-architecture","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Fleet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robot.html#cfn-robomaker-robot-fleet","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GreengrassGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robot.html#cfn-robomaker-robot-greengrassgroupid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robot.html#cfn-robomaker-robot-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robot.html#cfn-robomaker-robot-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::RoboMaker::RobotApplication":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CurrentRevisionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robotapplication.html","Properties":{"CurrentRevisionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robotapplication.html#cfn-robomaker-robotapplication-currentrevisionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robotapplication.html#cfn-robomaker-robotapplication-environment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robotapplication.html#cfn-robomaker-robotapplication-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RobotSoftwareSuite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robotapplication.html#cfn-robomaker-robotapplication-robotsoftwaresuite","Required":true,"Type":"RobotSoftwareSuite","UpdateType":"Mutable"},"Sources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robotapplication.html#cfn-robomaker-robotapplication-sources","DuplicatesAllowed":true,"ItemType":"SourceConfig","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robotapplication.html#cfn-robomaker-robotapplication-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::RoboMaker::RobotApplicationVersion":{"Attributes":{"ApplicationVersion":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robotapplicationversion.html","Properties":{"Application":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robotapplicationversion.html#cfn-robomaker-robotapplicationversion-application","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CurrentRevisionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-robotapplicationversion.html#cfn-robomaker-robotapplicationversion-currentrevisionid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::RoboMaker::SimulationApplication":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CurrentRevisionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplication.html","Properties":{"CurrentRevisionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplication.html#cfn-robomaker-simulationapplication-currentrevisionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Environment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplication.html#cfn-robomaker-simulationapplication-environment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplication.html#cfn-robomaker-simulationapplication-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RenderingEngine":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplication.html#cfn-robomaker-simulationapplication-renderingengine","Required":false,"Type":"RenderingEngine","UpdateType":"Mutable"},"RobotSoftwareSuite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplication.html#cfn-robomaker-simulationapplication-robotsoftwaresuite","Required":true,"Type":"RobotSoftwareSuite","UpdateType":"Mutable"},"SimulationSoftwareSuite":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplication.html#cfn-robomaker-simulationapplication-simulationsoftwaresuite","Required":true,"Type":"SimulationSoftwareSuite","UpdateType":"Mutable"},"Sources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplication.html#cfn-robomaker-simulationapplication-sources","DuplicatesAllowed":true,"ItemType":"SourceConfig","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplication.html#cfn-robomaker-simulationapplication-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::RoboMaker::SimulationApplicationVersion":{"Attributes":{"ApplicationVersion":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplicationversion.html","Properties":{"Application":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplicationversion.html#cfn-robomaker-simulationapplicationversion-application","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CurrentRevisionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-robomaker-simulationapplicationversion.html#cfn-robomaker-simulationapplicationversion-currentrevisionid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::RolesAnywhere::CRL":{"Attributes":{"CrlId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-crl.html","Properties":{"CrlData":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-crl.html#cfn-rolesanywhere-crl-crldata","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-crl.html#cfn-rolesanywhere-crl-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-crl.html#cfn-rolesanywhere-crl-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-crl.html#cfn-rolesanywhere-crl-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TrustAnchorArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-crl.html#cfn-rolesanywhere-crl-trustanchorarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::RolesAnywhere::Profile":{"Attributes":{"ProfileArn":{"PrimitiveType":"String"},"ProfileId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-profile.html","Properties":{"DurationSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-profile.html#cfn-rolesanywhere-profile-durationseconds","PrimitiveType":"Double","Required":false,"UpdateType":"Mutable"},"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-profile.html#cfn-rolesanywhere-profile-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ManagedPolicyArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-profile.html#cfn-rolesanywhere-profile-managedpolicyarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"ScrutinyType":"ManagedPolicies","Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-profile.html#cfn-rolesanywhere-profile-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RequireInstanceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-profile.html#cfn-rolesanywhere-profile-requireinstanceproperties","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RoleArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-profile.html#cfn-rolesanywhere-profile-rolearns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"SessionPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-profile.html#cfn-rolesanywhere-profile-sessionpolicy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-profile.html#cfn-rolesanywhere-profile-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::RolesAnywhere::TrustAnchor":{"Attributes":{"TrustAnchorArn":{"PrimitiveType":"String"},"TrustAnchorId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-trustanchor.html","Properties":{"Enabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-trustanchor.html#cfn-rolesanywhere-trustanchor-enabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-trustanchor.html#cfn-rolesanywhere-trustanchor-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Source":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-trustanchor.html#cfn-rolesanywhere-trustanchor-source","Required":true,"Type":"Source","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rolesanywhere-trustanchor.html#cfn-rolesanywhere-trustanchor-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53::CidrCollection":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-cidrcollection.html","Properties":{"Locations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-cidrcollection.html#cfn-route53-cidrcollection-locations","DuplicatesAllowed":false,"ItemType":"Location","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-cidrcollection.html#cfn-route53-cidrcollection-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Route53::DNSSEC":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-dnssec.html","Properties":{"HostedZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-dnssec.html#cfn-route53-dnssec-hostedzoneid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Route53::HealthCheck":{"Attributes":{"HealthCheckId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-healthcheck.html","Properties":{"HealthCheckConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-healthcheck.html#cfn-route53-healthcheck-healthcheckconfig","Required":true,"Type":"HealthCheckConfig","UpdateType":"Mutable"},"HealthCheckTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-healthcheck.html#cfn-route53-healthcheck-healthchecktags","DuplicatesAllowed":false,"ItemType":"HealthCheckTag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53::HostedZone":{"Attributes":{"Id":{"PrimitiveType":"String"},"NameServers":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-hostedzone.html","Properties":{"HostedZoneConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-hostedzone.html#cfn-route53-hostedzone-hostedzoneconfig","Required":false,"Type":"HostedZoneConfig","UpdateType":"Mutable"},"HostedZoneTags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-hostedzone.html#cfn-route53-hostedzone-hostedzonetags","DuplicatesAllowed":false,"ItemType":"HostedZoneTag","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-hostedzone.html#cfn-route53-hostedzone-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"QueryLoggingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-hostedzone.html#cfn-route53-hostedzone-queryloggingconfig","Required":false,"Type":"QueryLoggingConfig","UpdateType":"Mutable"},"VPCs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-hostedzone.html#cfn-route53-hostedzone-vpcs","DuplicatesAllowed":false,"ItemType":"VPC","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53::KeySigningKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-keysigningkey.html","Properties":{"HostedZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-keysigningkey.html#cfn-route53-keysigningkey-hostedzoneid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KeyManagementServiceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-keysigningkey.html#cfn-route53-keysigningkey-keymanagementservicearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-keysigningkey.html#cfn-route53-keysigningkey-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-keysigningkey.html#cfn-route53-keysigningkey-status","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53::RecordSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html","Properties":{"AliasTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-aliastarget","Required":false,"Type":"AliasTarget","UpdateType":"Mutable"},"CidrRoutingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-cidrroutingconfig","Required":false,"Type":"CidrRoutingConfig","UpdateType":"Mutable"},"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Failover":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-failover","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GeoLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-geolocation","Required":false,"Type":"GeoLocation","UpdateType":"Mutable"},"HealthCheckId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-healthcheckid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostedZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-hostedzoneid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"HostedZoneName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-hostedzonename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"MultiValueAnswer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-multivalueanswer","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-region","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceRecords":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-resourcerecords","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"SetIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-setidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TTL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-ttl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Weight":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-weight","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::Route53::RecordSetGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-recordsetgroup.html","Properties":{"Comment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-recordsetgroup.html#cfn-route53-recordsetgroup-comment","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HostedZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-recordsetgroup.html#cfn-route53-recordsetgroup-hostedzoneid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"HostedZoneName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-recordsetgroup.html#cfn-route53-recordsetgroup-hostedzonename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RecordSets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53-recordsetgroup.html#cfn-route53-recordsetgroup-recordsets","DuplicatesAllowed":false,"ItemType":"RecordSet","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53RecoveryControl::Cluster":{"Attributes":{"ClusterArn":{"PrimitiveType":"String"},"ClusterEndpoints":{"ItemType":"ClusterEndpoint","Type":"List"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-cluster.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-cluster.html#cfn-route53recoverycontrol-cluster-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-cluster.html#cfn-route53recoverycontrol-cluster-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Route53RecoveryControl::ControlPanel":{"Attributes":{"ControlPanelArn":{"PrimitiveType":"String"},"DefaultControlPanel":{"PrimitiveType":"Boolean"},"RoutingControlCount":{"PrimitiveType":"Integer"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-controlpanel.html","Properties":{"ClusterArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-controlpanel.html#cfn-route53recoverycontrol-controlpanel-clusterarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-controlpanel.html#cfn-route53recoverycontrol-controlpanel-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-controlpanel.html#cfn-route53recoverycontrol-controlpanel-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Route53RecoveryControl::RoutingControl":{"Attributes":{"RoutingControlArn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-routingcontrol.html","Properties":{"ClusterArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-routingcontrol.html#cfn-route53recoverycontrol-routingcontrol-clusterarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ControlPanelArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-routingcontrol.html#cfn-route53recoverycontrol-routingcontrol-controlpanelarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-routingcontrol.html#cfn-route53recoverycontrol-routingcontrol-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Route53RecoveryControl::SafetyRule":{"Attributes":{"SafetyRuleArn":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-safetyrule.html","Properties":{"AssertionRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-safetyrule.html#cfn-route53recoverycontrol-safetyrule-assertionrule","Required":false,"Type":"AssertionRule","UpdateType":"Mutable"},"ControlPanelArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-safetyrule.html#cfn-route53recoverycontrol-safetyrule-controlpanelarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"GatingRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-safetyrule.html#cfn-route53recoverycontrol-safetyrule-gatingrule","Required":false,"Type":"GatingRule","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-safetyrule.html#cfn-route53recoverycontrol-safetyrule-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RuleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-safetyrule.html#cfn-route53recoverycontrol-safetyrule-ruleconfig","Required":true,"Type":"RuleConfig","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoverycontrol-safetyrule.html#cfn-route53recoverycontrol-safetyrule-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Route53RecoveryReadiness::Cell":{"Attributes":{"CellArn":{"PrimitiveType":"String"},"ParentReadinessScopes":{"PrimitiveItemType":"String","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-cell.html","Properties":{"CellName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-cell.html#cfn-route53recoveryreadiness-cell-cellname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Cells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-cell.html#cfn-route53recoveryreadiness-cell-cells","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-cell.html#cfn-route53recoveryreadiness-cell-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53RecoveryReadiness::ReadinessCheck":{"Attributes":{"ReadinessCheckArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-readinesscheck.html","Properties":{"ReadinessCheckName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-readinesscheck.html#cfn-route53recoveryreadiness-readinesscheck-readinesscheckname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourceSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-readinesscheck.html#cfn-route53recoveryreadiness-readinesscheck-resourcesetname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-readinesscheck.html#cfn-route53recoveryreadiness-readinesscheck-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53RecoveryReadiness::RecoveryGroup":{"Attributes":{"RecoveryGroupArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-recoverygroup.html","Properties":{"Cells":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-recoverygroup.html#cfn-route53recoveryreadiness-recoverygroup-cells","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RecoveryGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-recoverygroup.html#cfn-route53recoveryreadiness-recoverygroup-recoverygroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-recoverygroup.html#cfn-route53recoveryreadiness-recoverygroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53RecoveryReadiness::ResourceSet":{"Attributes":{"ResourceSetArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-resourceset.html","Properties":{"ResourceSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-resourceset.html#cfn-route53recoveryreadiness-resourceset-resourcesetname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourceSetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-resourceset.html#cfn-route53recoveryreadiness-resourceset-resourcesettype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Resources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-resourceset.html#cfn-route53recoveryreadiness-resourceset-resources","DuplicatesAllowed":true,"ItemType":"Resource","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53recoveryreadiness-resourceset.html#cfn-route53recoveryreadiness-resourceset-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53Resolver::FirewallDomainList":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"CreatorRequestId":{"PrimitiveType":"String"},"DomainCount":{"PrimitiveType":"Integer"},"Id":{"PrimitiveType":"String"},"ManagedOwnerName":{"PrimitiveType":"String"},"ModificationTime":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"StatusMessage":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewalldomainlist.html","Properties":{"DomainFileUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewalldomainlist.html#cfn-route53resolver-firewalldomainlist-domainfileurl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Domains":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewalldomainlist.html#cfn-route53resolver-firewalldomainlist-domains","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewalldomainlist.html#cfn-route53resolver-firewalldomainlist-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewalldomainlist.html#cfn-route53resolver-firewalldomainlist-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53Resolver::FirewallRuleGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"CreatorRequestId":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"ModificationTime":{"PrimitiveType":"String"},"OwnerId":{"PrimitiveType":"String"},"RuleCount":{"PrimitiveType":"Integer"},"ShareStatus":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"StatusMessage":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewallrulegroup.html","Properties":{"FirewallRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewallrulegroup.html#cfn-route53resolver-firewallrulegroup-firewallrules","DuplicatesAllowed":false,"ItemType":"FirewallRule","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewallrulegroup.html#cfn-route53resolver-firewallrulegroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewallrulegroup.html#cfn-route53resolver-firewallrulegroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53Resolver::FirewallRuleGroupAssociation":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"CreatorRequestId":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"ManagedOwnerName":{"PrimitiveType":"String"},"ModificationTime":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"StatusMessage":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewallrulegroupassociation.html","Properties":{"FirewallRuleGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewallrulegroupassociation.html#cfn-route53resolver-firewallrulegroupassociation-firewallrulegroupid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MutationProtection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewallrulegroupassociation.html#cfn-route53resolver-firewallrulegroupassociation-mutationprotection","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewallrulegroupassociation.html#cfn-route53resolver-firewallrulegroupassociation-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewallrulegroupassociation.html#cfn-route53resolver-firewallrulegroupassociation-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewallrulegroupassociation.html#cfn-route53resolver-firewallrulegroupassociation-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-firewallrulegroupassociation.html#cfn-route53resolver-firewallrulegroupassociation-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Route53Resolver::ResolverConfig":{"Attributes":{"AutodefinedReverse":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"OwnerId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverconfig.html","Properties":{"AutodefinedReverseFlag":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverconfig.html#cfn-route53resolver-resolverconfig-autodefinedreverseflag","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverconfig.html#cfn-route53resolver-resolverconfig-resourceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Route53Resolver::ResolverDNSSECConfig":{"Attributes":{"Id":{"PrimitiveType":"String"},"OwnerId":{"PrimitiveType":"String"},"ValidationStatus":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverdnssecconfig.html","Properties":{"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverdnssecconfig.html#cfn-route53resolver-resolverdnssecconfig-resourceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Route53Resolver::ResolverEndpoint":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Direction":{"PrimitiveType":"String"},"HostVPCId":{"PrimitiveType":"String"},"IpAddressCount":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"},"OutpostArn":{"PrimitiveType":"String"},"PreferredInstanceType":{"PrimitiveType":"String"},"ResolverEndpointId":{"PrimitiveType":"String"},"ResolverEndpointType":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverendpoint.html","Properties":{"Direction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverendpoint.html#cfn-route53resolver-resolverendpoint-direction","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"IpAddresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverendpoint.html#cfn-route53resolver-resolverendpoint-ipaddresses","ItemType":"IpAddressRequest","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverendpoint.html#cfn-route53resolver-resolverendpoint-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OutpostArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverendpoint.html#cfn-route53resolver-resolverendpoint-outpostarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PreferredInstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverendpoint.html#cfn-route53resolver-resolverendpoint-preferredinstancetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResolverEndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverendpoint.html#cfn-route53resolver-resolverendpoint-resolverendpointtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverendpoint.html#cfn-route53resolver-resolverendpoint-securitygroupids","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverendpoint.html#cfn-route53resolver-resolverendpoint-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53Resolver::ResolverQueryLoggingConfig":{"Attributes":{"Arn":{"PrimitiveType":"String"},"AssociationCount":{"PrimitiveType":"Integer"},"CreationTime":{"PrimitiveType":"String"},"CreatorRequestId":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"OwnerId":{"PrimitiveType":"String"},"ShareStatus":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverqueryloggingconfig.html","Properties":{"DestinationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverqueryloggingconfig.html#cfn-route53resolver-resolverqueryloggingconfig-destinationarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverqueryloggingconfig.html#cfn-route53resolver-resolverqueryloggingconfig-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"Error":{"PrimitiveType":"String"},"ErrorMessage":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverqueryloggingconfigassociation.html","Properties":{"ResolverQueryLogConfigId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverqueryloggingconfigassociation.html#cfn-route53resolver-resolverqueryloggingconfigassociation-resolverquerylogconfigid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverqueryloggingconfigassociation.html#cfn-route53resolver-resolverqueryloggingconfigassociation-resourceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Route53Resolver::ResolverRule":{"Attributes":{"Arn":{"PrimitiveType":"String"},"DomainName":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"},"ResolverEndpointId":{"PrimitiveType":"String"},"ResolverRuleId":{"PrimitiveType":"String"},"TargetIps":{"ItemType":"TargetAddress","Type":"List"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverrule.html","Properties":{"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverrule.html#cfn-route53resolver-resolverrule-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverrule.html#cfn-route53resolver-resolverrule-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResolverEndpointId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverrule.html#cfn-route53resolver-resolverrule-resolverendpointid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RuleType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverrule.html#cfn-route53resolver-resolverrule-ruletype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverrule.html#cfn-route53resolver-resolverrule-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetIps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverrule.html#cfn-route53resolver-resolverrule-targetips","DuplicatesAllowed":true,"ItemType":"TargetAddress","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Route53Resolver::ResolverRuleAssociation":{"Attributes":{"Name":{"PrimitiveType":"String"},"ResolverRuleAssociationId":{"PrimitiveType":"String"},"ResolverRuleId":{"PrimitiveType":"String"},"VPCId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverruleassociation.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverruleassociation.html#cfn-route53resolver-resolverruleassociation-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ResolverRuleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverruleassociation.html#cfn-route53resolver-resolverruleassociation-resolverruleid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VPCId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-route53resolver-resolverruleassociation.html#cfn-route53resolver-resolverruleassociation-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::S3::AccessPoint":{"Attributes":{"Alias":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"},"NetworkOrigin":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-accesspoint.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-accesspoint.html#cfn-s3-accesspoint-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"BucketAccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-accesspoint.html#cfn-s3-accesspoint-bucketaccountid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-accesspoint.html#cfn-s3-accesspoint-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-accesspoint.html#cfn-s3-accesspoint-policy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"PublicAccessBlockConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-accesspoint.html#cfn-s3-accesspoint-publicaccessblockconfiguration","Required":false,"Type":"PublicAccessBlockConfiguration","UpdateType":"Mutable"},"VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-accesspoint.html#cfn-s3-accesspoint-vpcconfiguration","Required":false,"Type":"VpcConfiguration","UpdateType":"Immutable"}}},"AWS::S3::Bucket":{"Attributes":{"Arn":{"PrimitiveType":"String"},"DomainName":{"PrimitiveType":"String"},"DualStackDomainName":{"PrimitiveType":"String"},"RegionalDomainName":{"PrimitiveType":"String"},"WebsiteURL":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html","Properties":{"AccelerateConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-accelerateconfiguration","Required":false,"Type":"AccelerateConfiguration","UpdateType":"Mutable"},"AccessControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-accesscontrol","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AnalyticsConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-analyticsconfigurations","DuplicatesAllowed":false,"ItemType":"AnalyticsConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"BucketEncryption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-bucketencryption","Required":false,"Type":"BucketEncryption","UpdateType":"Mutable"},"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CorsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-crossoriginconfig","Required":false,"Type":"CorsConfiguration","UpdateType":"Mutable"},"IntelligentTieringConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-intelligenttieringconfigurations","DuplicatesAllowed":false,"ItemType":"IntelligentTieringConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"InventoryConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-inventoryconfigurations","DuplicatesAllowed":false,"ItemType":"InventoryConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"LifecycleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-lifecycleconfig","Required":false,"Type":"LifecycleConfiguration","UpdateType":"Mutable"},"LoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-loggingconfig","Required":false,"Type":"LoggingConfiguration","UpdateType":"Mutable"},"MetricsConfigurations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-metricsconfigurations","DuplicatesAllowed":false,"ItemType":"MetricsConfiguration","Required":false,"Type":"List","UpdateType":"Mutable"},"NotificationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-notification","Required":false,"Type":"NotificationConfiguration","UpdateType":"Mutable"},"ObjectLockConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-objectlockconfiguration","Required":false,"Type":"ObjectLockConfiguration","UpdateType":"Mutable"},"ObjectLockEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-objectlockenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"OwnershipControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-ownershipcontrols","Required":false,"Type":"OwnershipControls","UpdateType":"Mutable"},"PublicAccessBlockConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-publicaccessblockconfiguration","Required":false,"Type":"PublicAccessBlockConfiguration","UpdateType":"Mutable"},"ReplicationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-replicationconfiguration","Required":false,"Type":"ReplicationConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VersioningConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-versioning","Required":false,"Type":"VersioningConfiguration","UpdateType":"Mutable"},"WebsiteConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#cfn-s3-bucket-websiteconfiguration","Required":false,"Type":"WebsiteConfiguration","UpdateType":"Mutable"}}},"AWS::S3::BucketPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-policy.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-policy.html#aws-properties-s3-policy-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-policy.html#aws-properties-s3-policy-policydocument","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::S3::MultiRegionAccessPoint":{"Attributes":{"Alias":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-multiregionaccesspoint.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-multiregionaccesspoint.html#cfn-s3-multiregionaccesspoint-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PublicAccessBlockConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-multiregionaccesspoint.html#cfn-s3-multiregionaccesspoint-publicaccessblockconfiguration","Required":false,"Type":"PublicAccessBlockConfiguration","UpdateType":"Immutable"},"Regions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-multiregionaccesspoint.html#cfn-s3-multiregionaccesspoint-regions","DuplicatesAllowed":false,"ItemType":"Region","Required":true,"Type":"List","UpdateType":"Immutable"}}},"AWS::S3::MultiRegionAccessPointPolicy":{"Attributes":{"PolicyStatus":{"Type":"PolicyStatus"},"PolicyStatus.IsPublic":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-multiregionaccesspointpolicy.html","Properties":{"MrapName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-multiregionaccesspointpolicy.html#cfn-s3-multiregionaccesspointpolicy-mrapname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-multiregionaccesspointpolicy.html#cfn-s3-multiregionaccesspointpolicy-policy","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::S3::StorageLens":{"Attributes":{"StorageLensConfiguration.StorageLensArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-storagelens.html","Properties":{"StorageLensConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-storagelens.html#cfn-s3-storagelens-storagelensconfiguration","Required":true,"Type":"StorageLensConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-storagelens.html#cfn-s3-storagelens-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3ObjectLambda::AccessPoint":{"Attributes":{"Alias":{"Type":"Alias"},"Alias.Status":{"PrimitiveType":"String"},"Alias.Value":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"},"CreationDate":{"PrimitiveType":"String"},"PolicyStatus":{"Type":"PolicyStatus"},"PolicyStatus.IsPublic":{"PrimitiveType":"Boolean"},"PublicAccessBlockConfiguration":{"Type":"PublicAccessBlockConfiguration"},"PublicAccessBlockConfiguration.BlockPublicAcls":{"PrimitiveType":"Boolean"},"PublicAccessBlockConfiguration.BlockPublicPolicy":{"PrimitiveType":"Boolean"},"PublicAccessBlockConfiguration.IgnorePublicAcls":{"PrimitiveType":"Boolean"},"PublicAccessBlockConfiguration.RestrictPublicBuckets":{"PrimitiveType":"Boolean"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3objectlambda-accesspoint.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3objectlambda-accesspoint.html#cfn-s3objectlambda-accesspoint-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ObjectLambdaConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3objectlambda-accesspoint.html#cfn-s3objectlambda-accesspoint-objectlambdaconfiguration","Required":true,"Type":"ObjectLambdaConfiguration","UpdateType":"Mutable"}}},"AWS::S3ObjectLambda::AccessPointPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3objectlambda-accesspointpolicy.html","Properties":{"ObjectLambdaAccessPoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3objectlambda-accesspointpolicy.html#cfn-s3objectlambda-accesspointpolicy-objectlambdaaccesspoint","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3objectlambda-accesspointpolicy.html#cfn-s3objectlambda-accesspointpolicy-policydocument","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::S3Outposts::AccessPoint":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-accesspoint.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-accesspoint.html#cfn-s3outposts-accesspoint-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-accesspoint.html#cfn-s3outposts-accesspoint-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-accesspoint.html#cfn-s3outposts-accesspoint-policy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"VpcConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-accesspoint.html#cfn-s3outposts-accesspoint-vpcconfiguration","Required":true,"Type":"VpcConfiguration","UpdateType":"Immutable"}}},"AWS::S3Outposts::Bucket":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-bucket.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-bucket.html#cfn-s3outposts-bucket-bucketname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"LifecycleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-bucket.html#cfn-s3outposts-bucket-lifecycleconfiguration","Required":false,"Type":"LifecycleConfiguration","UpdateType":"Mutable"},"OutpostId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-bucket.html#cfn-s3outposts-bucket-outpostid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-bucket.html#cfn-s3outposts-bucket-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::S3Outposts::BucketPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-bucketpolicy.html","Properties":{"Bucket":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-bucketpolicy.html#cfn-s3outposts-bucketpolicy-bucket","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-bucketpolicy.html#cfn-s3outposts-bucketpolicy-policydocument","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::S3Outposts::Endpoint":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CidrBlock":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"NetworkInterfaces":{"ItemType":"NetworkInterface","Type":"List"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-endpoint.html","Properties":{"AccessType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-endpoint.html#cfn-s3outposts-endpoint-accesstype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CustomerOwnedIpv4Pool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-endpoint.html#cfn-s3outposts-endpoint-customerownedipv4pool","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FailedReason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-endpoint.html#cfn-s3outposts-endpoint-failedreason","Required":false,"Type":"FailedReason","UpdateType":"Mutable"},"OutpostId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-endpoint.html#cfn-s3outposts-endpoint-outpostid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SecurityGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-endpoint.html#cfn-s3outposts-endpoint-securitygroupid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3outposts-endpoint.html#cfn-s3outposts-endpoint-subnetid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SDB::Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-simpledb.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-simpledb.html#cfn-sdb-domain-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-configurationset.html","Properties":{"DeliveryOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-configurationset.html#cfn-ses-configurationset-deliveryoptions","Required":false,"Type":"DeliveryOptions","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-configurationset.html#cfn-ses-configurationset-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ReputationOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-configurationset.html#cfn-ses-configurationset-reputationoptions","Required":false,"Type":"ReputationOptions","UpdateType":"Mutable"},"SendingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-configurationset.html#cfn-ses-configurationset-sendingoptions","Required":false,"Type":"SendingOptions","UpdateType":"Mutable"},"SuppressionOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-configurationset.html#cfn-ses-configurationset-suppressionoptions","Required":false,"Type":"SuppressionOptions","UpdateType":"Mutable"},"TrackingOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-configurationset.html#cfn-ses-configurationset-trackingoptions","Required":false,"Type":"TrackingOptions","UpdateType":"Mutable"},"VdmOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-configurationset.html#cfn-ses-configurationset-vdmoptions","Required":false,"Type":"VdmOptions","UpdateType":"Mutable"}}},"AWS::SES::ConfigurationSetEventDestination":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-configurationseteventdestination.html","Properties":{"ConfigurationSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-configurationseteventdestination.html#cfn-ses-configurationseteventdestination-configurationsetname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"EventDestination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-configurationseteventdestination.html#cfn-ses-configurationseteventdestination-eventdestination","Required":true,"Type":"EventDestination","UpdateType":"Mutable"}}},"AWS::SES::ContactList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-contactlist.html","Properties":{"ContactListName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-contactlist.html#cfn-ses-contactlist-contactlistname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-contactlist.html#cfn-ses-contactlist-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-contactlist.html#cfn-ses-contactlist-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Topics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-contactlist.html#cfn-ses-contactlist-topics","DuplicatesAllowed":true,"ItemType":"Topic","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SES::DedicatedIpPool":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-dedicatedippool.html","Properties":{"PoolName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-dedicatedippool.html#cfn-ses-dedicatedippool-poolname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ScalingMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-dedicatedippool.html#cfn-ses-dedicatedippool-scalingmode","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"}}},"AWS::SES::EmailIdentity":{"Attributes":{"DkimDNSTokenName1":{"PrimitiveType":"String"},"DkimDNSTokenName2":{"PrimitiveType":"String"},"DkimDNSTokenName3":{"PrimitiveType":"String"},"DkimDNSTokenValue1":{"PrimitiveType":"String"},"DkimDNSTokenValue2":{"PrimitiveType":"String"},"DkimDNSTokenValue3":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-emailidentity.html","Properties":{"ConfigurationSetAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-emailidentity.html#cfn-ses-emailidentity-configurationsetattributes","Required":false,"Type":"ConfigurationSetAttributes","UpdateType":"Mutable"},"DkimAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-emailidentity.html#cfn-ses-emailidentity-dkimattributes","Required":false,"Type":"DkimAttributes","UpdateType":"Mutable"},"DkimSigningAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-emailidentity.html#cfn-ses-emailidentity-dkimsigningattributes","Required":false,"Type":"DkimSigningAttributes","UpdateType":"Mutable"},"EmailIdentity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-emailidentity.html#cfn-ses-emailidentity-emailidentity","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FeedbackAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-emailidentity.html#cfn-ses-emailidentity-feedbackattributes","Required":false,"Type":"FeedbackAttributes","UpdateType":"Mutable"},"MailFromAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-emailidentity.html#cfn-ses-emailidentity-mailfromattributes","Required":false,"Type":"MailFromAttributes","UpdateType":"Mutable"}}},"AWS::SES::ReceiptFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-receiptfilter.html","Properties":{"Filter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-receiptfilter.html#cfn-ses-receiptfilter-filter","Required":true,"Type":"Filter","UpdateType":"Immutable"}}},"AWS::SES::ReceiptRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-receiptrule.html","Properties":{"After":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-receiptrule.html#cfn-ses-receiptrule-after","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-receiptrule.html#cfn-ses-receiptrule-rule","Required":true,"Type":"Rule","UpdateType":"Mutable"},"RuleSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-receiptrule.html#cfn-ses-receiptrule-rulesetname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SES::ReceiptRuleSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-receiptruleset.html","Properties":{"RuleSetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-receiptruleset.html#cfn-ses-receiptruleset-rulesetname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SES::Template":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-template.html","Properties":{"Template":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-template.html#cfn-ses-template-template","Required":false,"Type":"Template","UpdateType":"Mutable"}}},"AWS::SES::VdmAttributes":{"Attributes":{"VdmAttributesResourceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-vdmattributes.html","Properties":{"DashboardAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-vdmattributes.html#cfn-ses-vdmattributes-dashboardattributes","Required":false,"Type":"DashboardAttributes","UpdateType":"Mutable"},"GuardianAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-vdmattributes.html#cfn-ses-vdmattributes-guardianattributes","Required":false,"Type":"GuardianAttributes","UpdateType":"Mutable"}}},"AWS::SNS::Subscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html","Properties":{"DeliveryPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-deliverypolicy","PrimitiveType":"Json","Required":false,"ScrutinyType":"None","UpdateType":"Mutable"},"Endpoint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-endpoint","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"FilterPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-filterpolicy","PrimitiveType":"Json","Required":false,"ScrutinyType":"None","UpdateType":"Mutable"},"FilterPolicyScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-filterpolicyscope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RawMessageDelivery":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-rawmessagedelivery","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RedrivePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-redrivepolicy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"Region":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-region","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SubscriptionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#cfn-sns-subscription-subscriptionrolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"TopicArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html#topicarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SNS::Topic":{"Attributes":{"TopicArn":{"PrimitiveType":"String"},"TopicName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html","Properties":{"ContentBasedDeduplication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#cfn-sns-topic-contentbaseddeduplication","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DataProtectionPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#cfn-sns-topic-dataprotectionpolicy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#cfn-sns-topic-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FifoTopic":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#cfn-sns-topic-fifotopic","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"KmsMasterKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#cfn-sns-topic-kmsmasterkeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SignatureVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#cfn-sns-topic-signatureversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Subscription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#cfn-sns-topic-subscription","DuplicatesAllowed":true,"ItemType":"Subscription","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#cfn-sns-topic-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TopicName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#cfn-sns-topic-topicname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"TracingConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#cfn-sns-topic-tracingconfig","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SNS::TopicPolicy":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topicpolicy.html","Properties":{"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topicpolicy.html#cfn-sns-topicpolicy-policydocument","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Topics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topicpolicy.html#cfn-sns-topicpolicy-topics","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::SQS::Queue":{"Attributes":{"Arn":{"PrimitiveType":"String"},"QueueName":{"PrimitiveType":"String"},"QueueUrl":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html","Properties":{"ContentBasedDeduplication":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-contentbaseddeduplication","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"DeduplicationScope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-deduplicationscope","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DelaySeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-delayseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"FifoQueue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-fifoqueue","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"FifoThroughputLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-fifothroughputlimit","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsDataKeyReusePeriodSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-kmsdatakeyreuseperiodseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"KmsMasterKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-kmsmasterkeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaximumMessageSize":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-maximummessagesize","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"MessageRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-messageretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"QueueName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-queuename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ReceiveMessageWaitTimeSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-receivemessagewaittimeseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RedriveAllowPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-redriveallowpolicy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"RedrivePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-redrivepolicy","PrimitiveType":"Json","Required":false,"ScrutinyType":"None","UpdateType":"Mutable"},"SqsManagedSseEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-sqsmanagedsseenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VisibilityTimeout":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-visibilitytimeout","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::SQS::QueuePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-policy.html","Properties":{"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-policy.html#cfn-sqs-queuepolicy-policydoc","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Queues":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-policy.html#cfn-sqs-queuepolicy-queues","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::SSM::Association":{"Attributes":{"AssociationId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html","Properties":{"ApplyOnlyAtCronInterval":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-applyonlyatcroninterval","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"AssociationName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-associationname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AutomationTargetParameterName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-automationtargetparametername","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CalendarNames":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-calendarnames","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ComplianceSeverity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-complianceseverity","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-documentversion","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-instanceid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxConcurrency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-maxconcurrency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxErrors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-maxerrors","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OutputLocation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-outputlocation","Required":false,"Type":"InstanceAssociationOutputLocation","UpdateType":"Mutable"},"Parameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-parameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-scheduleexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ScheduleOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-scheduleoffset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SyncCompliance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-synccompliance","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-targets","DuplicatesAllowed":true,"ItemType":"Target","Required":false,"Type":"List","UpdateType":"Mutable"},"WaitForSuccessTimeoutSeconds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-association.html#cfn-ssm-association-waitforsuccesstimeoutseconds","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::SSM::Document":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html","Properties":{"Attachments":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html#cfn-ssm-document-attachments","DuplicatesAllowed":true,"ItemType":"AttachmentsSource","Required":false,"Type":"List","UpdateType":"Mutable"},"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html#cfn-ssm-document-content","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"DocumentFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html#cfn-ssm-document-documentformat","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DocumentType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html#cfn-ssm-document-documenttype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html#cfn-ssm-document-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Requires":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html#cfn-ssm-document-requires","DuplicatesAllowed":true,"ItemType":"DocumentRequires","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html#cfn-ssm-document-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html#cfn-ssm-document-targettype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"UpdateMethod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html#cfn-ssm-document-updatemethod","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"VersionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-document.html#cfn-ssm-document-versionname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html","Properties":{"AllowUnassociatedTargets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html#cfn-ssm-maintenancewindow-allowunassociatedtargets","PrimitiveType":"Boolean","Required":true,"UpdateType":"Mutable"},"Cutoff":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html#cfn-ssm-maintenancewindow-cutoff","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html#cfn-ssm-maintenancewindow-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Duration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html#cfn-ssm-maintenancewindow-duration","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"EndDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html#cfn-ssm-maintenancewindow-enddate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html#cfn-ssm-maintenancewindow-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html#cfn-ssm-maintenancewindow-schedule","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScheduleOffset":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html#cfn-ssm-maintenancewindow-scheduleoffset","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"ScheduleTimezone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html#cfn-ssm-maintenancewindow-scheduletimezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html#cfn-ssm-maintenancewindow-startdate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindow.html#cfn-ssm-maintenancewindow-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSM::MaintenanceWindowTarget":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtarget.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtarget.html#cfn-ssm-maintenancewindowtarget-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtarget.html#cfn-ssm-maintenancewindowtarget-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"OwnerInformation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtarget.html#cfn-ssm-maintenancewindowtarget-ownerinformation","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtarget.html#cfn-ssm-maintenancewindowtarget-resourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtarget.html#cfn-ssm-maintenancewindowtarget-targets","ItemType":"Targets","Required":true,"Type":"List","UpdateType":"Mutable"},"WindowId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtarget.html#cfn-ssm-maintenancewindowtarget-windowid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SSM::MaintenanceWindowTask":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html","Properties":{"CutoffBehavior":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-cutoffbehavior","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LoggingInfo":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-logginginfo","Required":false,"Type":"LoggingInfo","UpdateType":"Mutable"},"MaxConcurrency":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-maxconcurrency","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MaxErrors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-maxerrors","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-name","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ServiceRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-servicerolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-targets","ItemType":"Target","Required":false,"Type":"List","UpdateType":"Mutable"},"TaskArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-taskarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TaskInvocationParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-taskinvocationparameters","Required":false,"Type":"TaskInvocationParameters","UpdateType":"Mutable"},"TaskParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-taskparameters","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TaskType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-tasktype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WindowId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-maintenancewindowtask.html#cfn-ssm-maintenancewindowtask-windowid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SSM::Parameter":{"Attributes":{"Type":{"PrimitiveType":"String"},"Value":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html","Properties":{"AllowedPattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html#cfn-ssm-parameter-allowedpattern","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DataType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html#cfn-ssm-parameter-datatype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html#cfn-ssm-parameter-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html#cfn-ssm-parameter-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Policies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html#cfn-ssm-parameter-policies","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html#cfn-ssm-parameter-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"Tier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html#cfn-ssm-parameter-tier","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html#cfn-ssm-parameter-type","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html#cfn-ssm-parameter-value","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSM::PatchBaseline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html","Properties":{"ApprovalRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-approvalrules","Required":false,"Type":"RuleGroup","UpdateType":"Mutable"},"ApprovedPatches":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-approvedpatches","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ApprovedPatchesComplianceLevel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-approvedpatchescompliancelevel","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ApprovedPatchesEnableNonSecurity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-approvedpatchesenablenonsecurity","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GlobalFilters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-globalfilters","Required":false,"Type":"PatchFilterGroup","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"OperatingSystem":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-operatingsystem","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PatchGroups":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-patchgroups","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RejectedPatches":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-rejectedpatches","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RejectedPatchesAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-rejectedpatchesaction","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Sources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-sources","ItemType":"PatchSource","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-patchbaseline.html#cfn-ssm-patchbaseline-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSM::ResourceDataSync":{"Attributes":{"SyncName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcedatasync.html","Properties":{"BucketName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcedatasync.html#cfn-ssm-resourcedatasync-bucketname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BucketPrefix":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcedatasync.html#cfn-ssm-resourcedatasync-bucketprefix","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"BucketRegion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcedatasync.html#cfn-ssm-resourcedatasync-bucketregion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KMSKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcedatasync.html#cfn-ssm-resourcedatasync-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"S3Destination":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcedatasync.html#cfn-ssm-resourcedatasync-s3destination","Required":false,"Type":"S3Destination","UpdateType":"Immutable"},"SyncFormat":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcedatasync.html#cfn-ssm-resourcedatasync-syncformat","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SyncName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcedatasync.html#cfn-ssm-resourcedatasync-syncname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SyncSource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcedatasync.html#cfn-ssm-resourcedatasync-syncsource","Required":false,"Type":"SyncSource","UpdateType":"Mutable"},"SyncType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcedatasync.html#cfn-ssm-resourcedatasync-synctype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SSM::ResourcePolicy":{"Attributes":{"PolicyHash":{"PrimitiveType":"String"},"PolicyId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcepolicy.html","Properties":{"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcepolicy.html#cfn-ssm-resourcepolicy-policy","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-resourcepolicy.html#cfn-ssm-resourcepolicy-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::SSMContacts::Contact":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-contact.html","Properties":{"Alias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-contact.html#cfn-ssmcontacts-contact-alias","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-contact.html#cfn-ssmcontacts-contact-displayname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Plan":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-contact.html#cfn-ssmcontacts-contact-plan","DuplicatesAllowed":true,"ItemType":"Stage","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-contact.html#cfn-ssmcontacts-contact-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SSMContacts::ContactChannel":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-contactchannel.html","Properties":{"ChannelAddress":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-contactchannel.html#cfn-ssmcontacts-contactchannel-channeladdress","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ChannelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-contactchannel.html#cfn-ssmcontacts-contactchannel-channelname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ChannelType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-contactchannel.html#cfn-ssmcontacts-contactchannel-channeltype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ContactId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-contactchannel.html#cfn-ssmcontacts-contactchannel-contactid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DeferActivation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-contactchannel.html#cfn-ssmcontacts-contactchannel-deferactivation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::SSMContacts::Plan":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-plan.html","Properties":{"ContactId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-plan.html#cfn-ssmcontacts-plan-contactid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RotationIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-plan.html#cfn-ssmcontacts-plan-rotationids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Stages":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-plan.html#cfn-ssmcontacts-plan-stages","DuplicatesAllowed":true,"ItemType":"Stage","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSMContacts::Rotation":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-rotation.html","Properties":{"ContactIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-rotation.html#cfn-ssmcontacts-rotation-contactids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-rotation.html#cfn-ssmcontacts-rotation-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Recurrence":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-rotation.html#cfn-ssmcontacts-rotation-recurrence","Required":true,"Type":"RecurrenceSettings","UpdateType":"Mutable"},"StartTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-rotation.html#cfn-ssmcontacts-rotation-starttime","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-rotation.html#cfn-ssmcontacts-rotation-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TimeZoneId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmcontacts-rotation.html#cfn-ssmcontacts-rotation-timezoneid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SSMIncidents::ReplicationSet":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-replicationset.html","Properties":{"DeletionProtected":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-replicationset.html#cfn-ssmincidents-replicationset-deletionprotected","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Regions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-replicationset.html#cfn-ssmincidents-replicationset-regions","DuplicatesAllowed":false,"ItemType":"ReplicationRegion","Required":true,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-replicationset.html#cfn-ssmincidents-replicationset-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSMIncidents::ResponsePlan":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-responseplan.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-responseplan.html#cfn-ssmincidents-responseplan-actions","DuplicatesAllowed":false,"ItemType":"Action","Required":false,"Type":"List","UpdateType":"Mutable"},"ChatChannel":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-responseplan.html#cfn-ssmincidents-responseplan-chatchannel","Required":false,"Type":"ChatChannel","UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-responseplan.html#cfn-ssmincidents-responseplan-displayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Engagements":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-responseplan.html#cfn-ssmincidents-responseplan-engagements","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"IncidentTemplate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-responseplan.html#cfn-ssmincidents-responseplan-incidenttemplate","Required":true,"Type":"IncidentTemplate","UpdateType":"Mutable"},"Integrations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-responseplan.html#cfn-ssmincidents-responseplan-integrations","DuplicatesAllowed":false,"ItemType":"Integration","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-responseplan.html#cfn-ssmincidents-responseplan-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssmincidents-responseplan.html#cfn-ssmincidents-responseplan-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SSO::Assignment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-assignment.html","Properties":{"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-assignment.html#cfn-sso-assignment-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PermissionSetArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-assignment.html#cfn-sso-assignment-permissionsetarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PrincipalId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-assignment.html#cfn-sso-assignment-principalid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PrincipalType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-assignment.html#cfn-sso-assignment-principaltype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TargetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-assignment.html#cfn-sso-assignment-targetid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TargetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-assignment.html#cfn-sso-assignment-targettype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SSO::InstanceAccessControlAttributeConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-instanceaccesscontrolattributeconfiguration.html","Properties":{"AccessControlAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-instanceaccesscontrolattributeconfiguration.html#cfn-sso-instanceaccesscontrolattributeconfiguration-accesscontrolattributes","DuplicatesAllowed":true,"ItemType":"AccessControlAttribute","Required":false,"Type":"List","UpdateType":"Mutable"},"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-instanceaccesscontrolattributeconfiguration.html#cfn-sso-instanceaccesscontrolattributeconfiguration-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SSO::PermissionSet":{"Attributes":{"PermissionSetArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-permissionset.html","Properties":{"CustomerManagedPolicyReferences":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-permissionset.html#cfn-sso-permissionset-customermanagedpolicyreferences","DuplicatesAllowed":true,"ItemType":"CustomerManagedPolicyReference","Required":false,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-permissionset.html#cfn-sso-permissionset-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InlinePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-permissionset.html#cfn-sso-permissionset-inlinepolicy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"InstanceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-permissionset.html#cfn-sso-permissionset-instancearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ManagedPolicies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-permissionset.html#cfn-sso-permissionset-managedpolicies","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-permissionset.html#cfn-sso-permissionset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PermissionsBoundary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-permissionset.html#cfn-sso-permissionset-permissionsboundary","Required":false,"Type":"PermissionsBoundary","UpdateType":"Mutable"},"RelayStateType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-permissionset.html#cfn-sso-permissionset-relaystatetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SessionDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-permissionset.html#cfn-sso-permissionset-sessionduration","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sso-permissionset.html#cfn-sso-permissionset-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::App":{"Attributes":{"AppArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-app.html","Properties":{"AppName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-app.html#cfn-sagemaker-app-appname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AppType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-app.html#cfn-sagemaker-app-apptype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DomainId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-app.html#cfn-sagemaker-app-domainid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceSpec":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-app.html#cfn-sagemaker-app-resourcespec","Required":false,"Type":"ResourceSpec","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-app.html#cfn-sagemaker-app-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"UserProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-app.html#cfn-sagemaker-app-userprofilename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::AppImageConfig":{"Attributes":{"AppImageConfigArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-appimageconfig.html","Properties":{"AppImageConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-appimageconfig.html#cfn-sagemaker-appimageconfig-appimageconfigname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KernelGatewayImageConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-appimageconfig.html#cfn-sagemaker-appimageconfig-kernelgatewayimageconfig","Required":false,"Type":"KernelGatewayImageConfig","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-appimageconfig.html#cfn-sagemaker-appimageconfig-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::CodeRepository":{"Attributes":{"CodeRepositoryName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-coderepository.html","Properties":{"CodeRepositoryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-coderepository.html#cfn-sagemaker-coderepository-coderepositoryname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"GitConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-coderepository.html#cfn-sagemaker-coderepository-gitconfig","Required":true,"Type":"GitConfig","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-coderepository.html#cfn-sagemaker-coderepository-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::DataQualityJobDefinition":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"JobDefinitionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html","Properties":{"DataQualityAppSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html#cfn-sagemaker-dataqualityjobdefinition-dataqualityappspecification","Required":true,"Type":"DataQualityAppSpecification","UpdateType":"Immutable"},"DataQualityBaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html#cfn-sagemaker-dataqualityjobdefinition-dataqualitybaselineconfig","Required":false,"Type":"DataQualityBaselineConfig","UpdateType":"Immutable"},"DataQualityJobInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html#cfn-sagemaker-dataqualityjobdefinition-dataqualityjobinput","Required":true,"Type":"DataQualityJobInput","UpdateType":"Immutable"},"DataQualityJobOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html#cfn-sagemaker-dataqualityjobdefinition-dataqualityjoboutputconfig","Required":true,"Type":"MonitoringOutputConfig","UpdateType":"Immutable"},"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html#cfn-sagemaker-dataqualityjobdefinition-endpointname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JobDefinitionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html#cfn-sagemaker-dataqualityjobdefinition-jobdefinitionname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"JobResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html#cfn-sagemaker-dataqualityjobdefinition-jobresources","Required":true,"Type":"MonitoringResources","UpdateType":"Immutable"},"NetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html#cfn-sagemaker-dataqualityjobdefinition-networkconfig","Required":false,"Type":"NetworkConfig","UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html#cfn-sagemaker-dataqualityjobdefinition-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StoppingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html#cfn-sagemaker-dataqualityjobdefinition-stoppingcondition","Required":false,"Type":"StoppingCondition","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-dataqualityjobdefinition.html#cfn-sagemaker-dataqualityjobdefinition-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::Device":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-device.html","Properties":{"Device":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-device.html#cfn-sagemaker-device-device","Required":false,"Type":"Device","UpdateType":"Mutable"},"DeviceFleetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-device.html#cfn-sagemaker-device-devicefleetname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-device.html#cfn-sagemaker-device-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::DeviceFleet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-devicefleet.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-devicefleet.html#cfn-sagemaker-devicefleet-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DeviceFleetName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-devicefleet.html#cfn-sagemaker-devicefleet-devicefleetname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-devicefleet.html#cfn-sagemaker-devicefleet-outputconfig","Required":true,"Type":"EdgeOutputConfig","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-devicefleet.html#cfn-sagemaker-devicefleet-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-devicefleet.html#cfn-sagemaker-devicefleet-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::Domain":{"Attributes":{"DomainArn":{"PrimitiveType":"String"},"DomainId":{"PrimitiveType":"String"},"HomeEfsFileSystemId":{"PrimitiveType":"String"},"SecurityGroupIdForDomainBoundary":{"PrimitiveType":"String"},"SingleSignOnManagedApplicationInstanceId":{"PrimitiveType":"String"},"Url":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html","Properties":{"AppNetworkAccessType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html#cfn-sagemaker-domain-appnetworkaccesstype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AppSecurityGroupManagement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html#cfn-sagemaker-domain-appsecuritygroupmanagement","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AuthMode":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html#cfn-sagemaker-domain-authmode","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DefaultSpaceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html#cfn-sagemaker-domain-defaultspacesettings","Required":false,"Type":"DefaultSpaceSettings","UpdateType":"Mutable"},"DefaultUserSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html#cfn-sagemaker-domain-defaultusersettings","Required":true,"Type":"UserSettings","UpdateType":"Mutable"},"DomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html#cfn-sagemaker-domain-domainname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"DomainSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html#cfn-sagemaker-domain-domainsettings","Required":false,"Type":"DomainSettings","UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html#cfn-sagemaker-domain-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SubnetIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html#cfn-sagemaker-domain-subnetids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html#cfn-sagemaker-domain-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"VpcId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-domain.html#cfn-sagemaker-domain-vpcid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::Endpoint":{"Attributes":{"EndpointName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpoint.html","Properties":{"DeploymentConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpoint.html#cfn-sagemaker-endpoint-deploymentconfig","Required":false,"Type":"DeploymentConfig","UpdateType":"Mutable"},"EndpointConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpoint.html#cfn-sagemaker-endpoint-endpointconfigname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpoint.html#cfn-sagemaker-endpoint-endpointname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ExcludeRetainedVariantProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpoint.html#cfn-sagemaker-endpoint-excluderetainedvariantproperties","ItemType":"VariantProperty","Required":false,"Type":"List","UpdateType":"Mutable"},"RetainAllVariantProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpoint.html#cfn-sagemaker-endpoint-retainallvariantproperties","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RetainDeploymentConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpoint.html#cfn-sagemaker-endpoint-retaindeploymentconfig","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpoint.html#cfn-sagemaker-endpoint-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::EndpointConfig":{"Attributes":{"EndpointConfigName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html","Properties":{"AsyncInferenceConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html#cfn-sagemaker-endpointconfig-asyncinferenceconfig","Required":false,"Type":"AsyncInferenceConfig","UpdateType":"Immutable"},"DataCaptureConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html#cfn-sagemaker-endpointconfig-datacaptureconfig","Required":false,"Type":"DataCaptureConfig","UpdateType":"Immutable"},"EndpointConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html#cfn-sagemaker-endpointconfig-endpointconfigname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ExplainerConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html#cfn-sagemaker-endpointconfig-explainerconfig","Required":false,"Type":"ExplainerConfig","UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html#cfn-sagemaker-endpointconfig-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProductionVariants":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html#cfn-sagemaker-endpointconfig-productionvariants","ItemType":"ProductionVariant","Required":true,"Type":"List","UpdateType":"Immutable"},"ShadowProductionVariants":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html#cfn-sagemaker-endpointconfig-shadowproductionvariants","ItemType":"ProductionVariant","Required":false,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-endpointconfig.html#cfn-sagemaker-endpointconfig-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::FeatureGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-featuregroup.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-featuregroup.html#cfn-sagemaker-featuregroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EventTimeFeatureName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-featuregroup.html#cfn-sagemaker-featuregroup-eventtimefeaturename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"FeatureDefinitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-featuregroup.html#cfn-sagemaker-featuregroup-featuredefinitions","DuplicatesAllowed":true,"ItemType":"FeatureDefinition","Required":true,"Type":"List","UpdateType":"Mutable"},"FeatureGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-featuregroup.html#cfn-sagemaker-featuregroup-featuregroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"OfflineStoreConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-featuregroup.html#cfn-sagemaker-featuregroup-offlinestoreconfig","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"OnlineStoreConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-featuregroup.html#cfn-sagemaker-featuregroup-onlinestoreconfig","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"RecordIdentifierFeatureName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-featuregroup.html#cfn-sagemaker-featuregroup-recordidentifierfeaturename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-featuregroup.html#cfn-sagemaker-featuregroup-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-featuregroup.html#cfn-sagemaker-featuregroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::Image":{"Attributes":{"ImageArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-image.html","Properties":{"ImageDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-image.html#cfn-sagemaker-image-imagedescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageDisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-image.html#cfn-sagemaker-image-imagedisplayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ImageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-image.html#cfn-sagemaker-image-imagename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ImageRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-image.html#cfn-sagemaker-image-imagerolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-image.html#cfn-sagemaker-image-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::ImageVersion":{"Attributes":{"ContainerImage":{"PrimitiveType":"String"},"ImageArn":{"PrimitiveType":"String"},"ImageVersionArn":{"PrimitiveType":"String"},"Version":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-imageversion.html","Properties":{"BaseImage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-imageversion.html#cfn-sagemaker-imageversion-baseimage","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ImageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-imageversion.html#cfn-sagemaker-imageversion-imagename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::InferenceExperiment":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"EndpointMetadata":{"Type":"EndpointMetadata"},"EndpointMetadata.EndpointConfigName":{"PrimitiveType":"String"},"EndpointMetadata.EndpointName":{"PrimitiveType":"String"},"EndpointMetadata.EndpointStatus":{"PrimitiveType":"String"},"LastModifiedTime":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html","Properties":{"DataStorageConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-datastorageconfig","Required":false,"Type":"DataStorageConfig","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DesiredState":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-desiredstate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-endpointname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"KmsKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-kmskey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ModelVariants":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-modelvariants","DuplicatesAllowed":true,"ItemType":"ModelVariantConfig","Required":true,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-schedule","Required":false,"Type":"InferenceExperimentSchedule","UpdateType":"Mutable"},"ShadowModeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-shadowmodeconfig","Required":false,"Type":"ShadowModeConfig","UpdateType":"Mutable"},"StatusReason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-statusreason","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-inferenceexperiment.html#cfn-sagemaker-inferenceexperiment-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SageMaker::Model":{"Attributes":{"ModelName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-model.html","Properties":{"Containers":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-model.html#cfn-sagemaker-model-containers","ItemType":"ContainerDefinition","Required":false,"Type":"List","UpdateType":"Immutable"},"EnableNetworkIsolation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-model.html#cfn-sagemaker-model-enablenetworkisolation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-model.html#cfn-sagemaker-model-executionrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"InferenceExecutionConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-model.html#cfn-sagemaker-model-inferenceexecutionconfig","Required":false,"Type":"InferenceExecutionConfig","UpdateType":"Immutable"},"ModelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-model.html#cfn-sagemaker-model-modelname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PrimaryContainer":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-model.html#cfn-sagemaker-model-primarycontainer","Required":false,"Type":"ContainerDefinition","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-model.html#cfn-sagemaker-model-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-model.html#cfn-sagemaker-model-vpcconfig","Required":false,"Type":"VpcConfig","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelBiasJobDefinition":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"JobDefinitionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html","Properties":{"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html#cfn-sagemaker-modelbiasjobdefinition-endpointname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JobDefinitionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html#cfn-sagemaker-modelbiasjobdefinition-jobdefinitionname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"JobResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html#cfn-sagemaker-modelbiasjobdefinition-jobresources","Required":true,"Type":"MonitoringResources","UpdateType":"Immutable"},"ModelBiasAppSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasappspecification","Required":true,"Type":"ModelBiasAppSpecification","UpdateType":"Immutable"},"ModelBiasBaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasbaselineconfig","Required":false,"Type":"ModelBiasBaselineConfig","UpdateType":"Immutable"},"ModelBiasJobInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasjobinput","Required":true,"Type":"ModelBiasJobInput","UpdateType":"Immutable"},"ModelBiasJobOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html#cfn-sagemaker-modelbiasjobdefinition-modelbiasjoboutputconfig","Required":true,"Type":"MonitoringOutputConfig","UpdateType":"Immutable"},"NetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html#cfn-sagemaker-modelbiasjobdefinition-networkconfig","Required":false,"Type":"NetworkConfig","UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html#cfn-sagemaker-modelbiasjobdefinition-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StoppingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html#cfn-sagemaker-modelbiasjobdefinition-stoppingcondition","Required":false,"Type":"StoppingCondition","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelbiasjobdefinition.html#cfn-sagemaker-modelbiasjobdefinition-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelCard":{"Attributes":{"CreatedBy.DomainId":{"PrimitiveType":"String"},"CreatedBy.UserProfileArn":{"PrimitiveType":"String"},"CreatedBy.UserProfileName":{"PrimitiveType":"String"},"CreationTime":{"PrimitiveType":"String"},"LastModifiedBy.DomainId":{"PrimitiveType":"String"},"LastModifiedBy.UserProfileArn":{"PrimitiveType":"String"},"LastModifiedBy.UserProfileName":{"PrimitiveType":"String"},"LastModifiedTime":{"PrimitiveType":"String"},"ModelCardArn":{"PrimitiveType":"String"},"ModelCardProcessingStatus":{"PrimitiveType":"String"},"ModelCardVersion":{"PrimitiveType":"Integer"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelcard.html","Properties":{"Content":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelcard.html#cfn-sagemaker-modelcard-content","Required":true,"Type":"Content","UpdateType":"Mutable"},"CreatedBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelcard.html#cfn-sagemaker-modelcard-createdby","Required":false,"Type":"UserContext","UpdateType":"Mutable"},"LastModifiedBy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelcard.html#cfn-sagemaker-modelcard-lastmodifiedby","Required":false,"Type":"UserContext","UpdateType":"Mutable"},"ModelCardName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelcard.html#cfn-sagemaker-modelcard-modelcardname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ModelCardStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelcard.html#cfn-sagemaker-modelcard-modelcardstatus","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"SecurityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelcard.html#cfn-sagemaker-modelcard-securityconfig","Required":false,"Type":"SecurityConfig","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelcard.html#cfn-sagemaker-modelcard-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::ModelExplainabilityJobDefinition":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"JobDefinitionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html","Properties":{"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html#cfn-sagemaker-modelexplainabilityjobdefinition-endpointname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JobDefinitionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html#cfn-sagemaker-modelexplainabilityjobdefinition-jobdefinitionname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"JobResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html#cfn-sagemaker-modelexplainabilityjobdefinition-jobresources","Required":true,"Type":"MonitoringResources","UpdateType":"Immutable"},"ModelExplainabilityAppSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html#cfn-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityappspecification","Required":true,"Type":"ModelExplainabilityAppSpecification","UpdateType":"Immutable"},"ModelExplainabilityBaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html#cfn-sagemaker-modelexplainabilityjobdefinition-modelexplainabilitybaselineconfig","Required":false,"Type":"ModelExplainabilityBaselineConfig","UpdateType":"Immutable"},"ModelExplainabilityJobInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html#cfn-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityjobinput","Required":true,"Type":"ModelExplainabilityJobInput","UpdateType":"Immutable"},"ModelExplainabilityJobOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html#cfn-sagemaker-modelexplainabilityjobdefinition-modelexplainabilityjoboutputconfig","Required":true,"Type":"MonitoringOutputConfig","UpdateType":"Immutable"},"NetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html#cfn-sagemaker-modelexplainabilityjobdefinition-networkconfig","Required":false,"Type":"NetworkConfig","UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html#cfn-sagemaker-modelexplainabilityjobdefinition-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StoppingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html#cfn-sagemaker-modelexplainabilityjobdefinition-stoppingcondition","Required":false,"Type":"StoppingCondition","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelexplainabilityjobdefinition.html#cfn-sagemaker-modelexplainabilityjobdefinition-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackage":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"ModelPackageArn":{"PrimitiveType":"String"},"ModelPackageStatus":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html","Properties":{"AdditionalInferenceSpecifications":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-additionalinferencespecifications","DuplicatesAllowed":true,"ItemType":"AdditionalInferenceSpecificationDefinition","Required":false,"Type":"List","UpdateType":"Mutable"},"AdditionalInferenceSpecificationsToAdd":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-additionalinferencespecificationstoadd","DuplicatesAllowed":true,"ItemType":"AdditionalInferenceSpecificationDefinition","Required":false,"Type":"List","UpdateType":"Mutable"},"ApprovalDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-approvaldescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CertifyForMarketplace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-certifyformarketplace","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ClientToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-clienttoken","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CustomerMetadataProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-customermetadataproperties","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-domain","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DriftCheckBaselines":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-driftcheckbaselines","Required":false,"Type":"DriftCheckBaselines","UpdateType":"Immutable"},"InferenceSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-inferencespecification","Required":false,"Type":"InferenceSpecification","UpdateType":"Immutable"},"LastModifiedTime":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-lastmodifiedtime","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MetadataProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-metadataproperties","Required":false,"Type":"MetadataProperties","UpdateType":"Immutable"},"ModelApprovalStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-modelapprovalstatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelMetrics":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-modelmetrics","Required":false,"Type":"ModelMetrics","UpdateType":"Immutable"},"ModelPackageDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-modelpackagedescription","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ModelPackageGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-modelpackagegroupname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ModelPackageName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-modelpackagename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ModelPackageStatusDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-modelpackagestatusdetails","Required":false,"Type":"ModelPackageStatusDetails","UpdateType":"Mutable"},"ModelPackageVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-modelpackageversion","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"SamplePayloadUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-samplepayloadurl","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SourceAlgorithmSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-sourcealgorithmspecification","Required":false,"Type":"SourceAlgorithmSpecification","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Task":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-task","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ValidationSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackage.html#cfn-sagemaker-modelpackage-validationspecification","Required":false,"Type":"ValidationSpecification","UpdateType":"Immutable"}}},"AWS::SageMaker::ModelPackageGroup":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"ModelPackageGroupArn":{"PrimitiveType":"String"},"ModelPackageGroupStatus":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackagegroup.html","Properties":{"ModelPackageGroupDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackagegroup.html#cfn-sagemaker-modelpackagegroup-modelpackagegroupdescription","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ModelPackageGroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackagegroup.html#cfn-sagemaker-modelpackagegroup-modelpackagegroupname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ModelPackageGroupPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackagegroup.html#cfn-sagemaker-modelpackagegroup-modelpackagegrouppolicy","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelpackagegroup.html#cfn-sagemaker-modelpackagegroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::ModelQualityJobDefinition":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"JobDefinitionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html","Properties":{"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html#cfn-sagemaker-modelqualityjobdefinition-endpointname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"JobDefinitionName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html#cfn-sagemaker-modelqualityjobdefinition-jobdefinitionname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"JobResources":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html#cfn-sagemaker-modelqualityjobdefinition-jobresources","Required":true,"Type":"MonitoringResources","UpdateType":"Immutable"},"ModelQualityAppSpecification":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityappspecification","Required":true,"Type":"ModelQualityAppSpecification","UpdateType":"Immutable"},"ModelQualityBaselineConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html#cfn-sagemaker-modelqualityjobdefinition-modelqualitybaselineconfig","Required":false,"Type":"ModelQualityBaselineConfig","UpdateType":"Immutable"},"ModelQualityJobInput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityjobinput","Required":true,"Type":"ModelQualityJobInput","UpdateType":"Immutable"},"ModelQualityJobOutputConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html#cfn-sagemaker-modelqualityjobdefinition-modelqualityjoboutputconfig","Required":true,"Type":"MonitoringOutputConfig","UpdateType":"Immutable"},"NetworkConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html#cfn-sagemaker-modelqualityjobdefinition-networkconfig","Required":false,"Type":"NetworkConfig","UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html#cfn-sagemaker-modelqualityjobdefinition-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StoppingCondition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html#cfn-sagemaker-modelqualityjobdefinition-stoppingcondition","Required":false,"Type":"StoppingCondition","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-modelqualityjobdefinition.html#cfn-sagemaker-modelqualityjobdefinition-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::MonitoringSchedule":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"LastModifiedTime":{"PrimitiveType":"String"},"MonitoringScheduleArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-monitoringschedule.html","Properties":{"EndpointName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-monitoringschedule.html#cfn-sagemaker-monitoringschedule-endpointname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FailureReason":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-monitoringschedule.html#cfn-sagemaker-monitoringschedule-failurereason","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LastMonitoringExecutionSummary":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-monitoringschedule.html#cfn-sagemaker-monitoringschedule-lastmonitoringexecutionsummary","Required":false,"Type":"MonitoringExecutionSummary","UpdateType":"Mutable"},"MonitoringScheduleConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-monitoringschedule.html#cfn-sagemaker-monitoringschedule-monitoringscheduleconfig","Required":true,"Type":"MonitoringScheduleConfig","UpdateType":"Mutable"},"MonitoringScheduleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-monitoringschedule.html#cfn-sagemaker-monitoringschedule-monitoringschedulename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MonitoringScheduleStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-monitoringschedule.html#cfn-sagemaker-monitoringschedule-monitoringschedulestatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-monitoringschedule.html#cfn-sagemaker-monitoringschedule-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::NotebookInstance":{"Attributes":{"NotebookInstanceName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html","Properties":{"AcceleratorTypes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-acceleratortypes","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"AdditionalCodeRepositories":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-additionalcoderepositories","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"DefaultCodeRepository":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-defaultcoderepository","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DirectInternetAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-directinternetaccess","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InstanceMetadataServiceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-instancemetadataserviceconfiguration","Required":false,"Type":"InstanceMetadataServiceConfiguration","UpdateType":"Mutable"},"InstanceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-instancetype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LifecycleConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-lifecycleconfigname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NotebookInstanceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-notebookinstancename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PlatformIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-platformidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"RootAccess":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-rootaccess","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-securitygroupids","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SubnetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-subnetid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VolumeSizeInGB":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstance.html#cfn-sagemaker-notebookinstance-volumesizeingb","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"}}},"AWS::SageMaker::NotebookInstanceLifecycleConfig":{"Attributes":{"NotebookInstanceLifecycleConfigName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstancelifecycleconfig.html","Properties":{"NotebookInstanceLifecycleConfigName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstancelifecycleconfig.html#cfn-sagemaker-notebookinstancelifecycleconfig-notebookinstancelifecycleconfigname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OnCreate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstancelifecycleconfig.html#cfn-sagemaker-notebookinstancelifecycleconfig-oncreate","ItemType":"NotebookInstanceLifecycleHook","Required":false,"Type":"List","UpdateType":"Mutable"},"OnStart":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-notebookinstancelifecycleconfig.html#cfn-sagemaker-notebookinstancelifecycleconfig-onstart","ItemType":"NotebookInstanceLifecycleHook","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::Pipeline":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html","Properties":{"ParallelismConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html#cfn-sagemaker-pipeline-parallelismconfiguration","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"PipelineDefinition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html#cfn-sagemaker-pipeline-pipelinedefinition","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"PipelineDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html#cfn-sagemaker-pipeline-pipelinedescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PipelineDisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html#cfn-sagemaker-pipeline-pipelinedisplayname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PipelineName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html#cfn-sagemaker-pipeline-pipelinename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html#cfn-sagemaker-pipeline-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-pipeline.html#cfn-sagemaker-pipeline-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::Project":{"Attributes":{"CreationTime":{"PrimitiveType":"String"},"ProjectArn":{"PrimitiveType":"String"},"ProjectId":{"PrimitiveType":"String"},"ProjectStatus":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-project.html","Properties":{"ProjectDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-project.html#cfn-sagemaker-project-projectdescription","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProjectName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-project.html#cfn-sagemaker-project-projectname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ServiceCatalogProvisionedProductDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-project.html#cfn-sagemaker-project-servicecatalogprovisionedproductdetails","Required":false,"Type":"ServiceCatalogProvisionedProductDetails","UpdateType":"Mutable"},"ServiceCatalogProvisioningDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-project.html#cfn-sagemaker-project-servicecatalogprovisioningdetails","PrimitiveType":"Json","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-project.html#cfn-sagemaker-project-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::SageMaker::Space":{"Attributes":{"SpaceArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-space.html","Properties":{"DomainId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-space.html#cfn-sagemaker-space-domainid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SpaceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-space.html#cfn-sagemaker-space-spacename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SpaceSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-space.html#cfn-sagemaker-space-spacesettings","Required":false,"Type":"SpaceSettings","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-space.html#cfn-sagemaker-space-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SageMaker::UserProfile":{"Attributes":{"UserProfileArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-userprofile.html","Properties":{"DomainId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-userprofile.html#cfn-sagemaker-userprofile-domainid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SingleSignOnUserIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-userprofile.html#cfn-sagemaker-userprofile-singlesignonuseridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"SingleSignOnUserValue":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-userprofile.html#cfn-sagemaker-userprofile-singlesignonuservalue","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-userprofile.html#cfn-sagemaker-userprofile-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"UserProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-userprofile.html#cfn-sagemaker-userprofile-userprofilename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UserSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-userprofile.html#cfn-sagemaker-userprofile-usersettings","Required":false,"Type":"UserSettings","UpdateType":"Mutable"}}},"AWS::SageMaker::Workteam":{"Attributes":{"WorkteamName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-workteam.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-workteam.html#cfn-sagemaker-workteam-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"MemberDefinitions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-workteam.html#cfn-sagemaker-workteam-memberdefinitions","ItemType":"MemberDefinition","Required":false,"Type":"List","UpdateType":"Mutable"},"NotificationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-workteam.html#cfn-sagemaker-workteam-notificationconfiguration","Required":false,"Type":"NotificationConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-workteam.html#cfn-sagemaker-workteam-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"WorkforceName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-workteam.html#cfn-sagemaker-workteam-workforcename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"WorkteamName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sagemaker-workteam.html#cfn-sagemaker-workteam-workteamname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Scheduler::Schedule":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EndDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-enddate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"FlexibleTimeWindow":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-flexibletimewindow","Required":true,"Type":"FlexibleTimeWindow","UpdateType":"Mutable"},"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-groupname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"KmsKeyArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-kmskeyarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ScheduleExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-scheduleexpression","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ScheduleExpressionTimezone":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-scheduleexpressiontimezone","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StartDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-startdate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"State":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-state","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Target":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedule.html#cfn-scheduler-schedule-target","Required":true,"Type":"Target","UpdateType":"Mutable"}}},"AWS::Scheduler::ScheduleGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreationDate":{"PrimitiveType":"String"},"LastModificationDate":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedulegroup.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedulegroup.html#cfn-scheduler-schedulegroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-scheduler-schedulegroup.html#cfn-scheduler-schedulegroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SecretsManager::ResourcePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-resourcepolicy.html","Properties":{"BlockPublicPolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-resourcepolicy.html#cfn-secretsmanager-resourcepolicy-blockpublicpolicy","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ResourcePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-resourcepolicy.html#cfn-secretsmanager-resourcepolicy-resourcepolicy","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"SecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-resourcepolicy.html#cfn-secretsmanager-resourcepolicy-secretid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::SecretsManager::RotationSchedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-rotationschedule.html","Properties":{"HostedRotationLambda":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-rotationschedule.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda","Required":false,"Type":"HostedRotationLambda","UpdateType":"Mutable"},"RotateImmediatelyOnUpdate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-rotationschedule.html#cfn-secretsmanager-rotationschedule-rotateimmediatelyonupdate","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RotationLambdaARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-rotationschedule.html#cfn-secretsmanager-rotationschedule-rotationlambdaarn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RotationRules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-rotationschedule.html#cfn-secretsmanager-rotationschedule-rotationrules","Required":false,"Type":"RotationRules","UpdateType":"Mutable"},"SecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-rotationschedule.html#cfn-secretsmanager-rotationschedule-secretid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SecretsManager::Secret":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secret.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secret.html#cfn-secretsmanager-secret-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GenerateSecretString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secret.html#cfn-secretsmanager-secret-generatesecretstring","Required":false,"Type":"GenerateSecretString","UpdateType":"Mutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secret.html#cfn-secretsmanager-secret-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secret.html#cfn-secretsmanager-secret-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ReplicaRegions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secret.html#cfn-secretsmanager-secret-replicaregions","DuplicatesAllowed":true,"ItemType":"ReplicaRegion","Required":false,"Type":"List","UpdateType":"Mutable"},"SecretString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secret.html#cfn-secretsmanager-secret-secretstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secret.html#cfn-secretsmanager-secret-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SecretsManager::SecretTargetAttachment":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secrettargetattachment.html","Properties":{"SecretId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secrettargetattachment.html#cfn-secretsmanager-secrettargetattachment-secretid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secrettargetattachment.html#cfn-secretsmanager-secrettargetattachment-targetid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"TargetType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-secretsmanager-secrettargetattachment.html#cfn-secretsmanager-secrettargetattachment-targettype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SecurityHub::AutomationRule":{"Attributes":{"CreatedAt":{"PrimitiveType":"String"},"CreatedBy":{"PrimitiveType":"String"},"RuleArn":{"PrimitiveType":"String"},"UpdatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-automationrule.html","Properties":{"Actions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-automationrule.html#cfn-securityhub-automationrule-actions","DuplicatesAllowed":true,"ItemType":"AutomationRulesAction","Required":false,"Type":"List","UpdateType":"Mutable"},"Criteria":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-automationrule.html#cfn-securityhub-automationrule-criteria","Required":false,"Type":"AutomationRulesFindingFilters","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-automationrule.html#cfn-securityhub-automationrule-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IsTerminal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-automationrule.html#cfn-securityhub-automationrule-isterminal","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"RuleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-automationrule.html#cfn-securityhub-automationrule-rulename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"RuleOrder":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-automationrule.html#cfn-securityhub-automationrule-ruleorder","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"RuleStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-automationrule.html#cfn-securityhub-automationrule-rulestatus","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-automationrule.html#cfn-securityhub-automationrule-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::SecurityHub::Hub":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-hub.html","Properties":{"AutoEnableControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-hub.html#cfn-securityhub-hub-autoenablecontrols","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ControlFindingGenerator":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-hub.html#cfn-securityhub-hub-controlfindinggenerator","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"EnableDefaultStandards":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-hub.html#cfn-securityhub-hub-enabledefaultstandards","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-hub.html#cfn-securityhub-hub-tags","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"}}},"AWS::SecurityHub::Standard":{"Attributes":{"StandardsSubscriptionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-standard.html","Properties":{"DisabledStandardsControls":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-standard.html#cfn-securityhub-standard-disabledstandardscontrols","DuplicatesAllowed":false,"ItemType":"StandardsControl","Required":false,"Type":"List","UpdateType":"Mutable"},"StandardsArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-securityhub-standard.html#cfn-securityhub-standard-standardsarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Serverless::Api":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","Properties":{"AccessLogSetting":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","Required":false,"Type":"AccessLogSetting","UpdateType":"Immutable"},"Auth":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","Required":false,"Type":"Auth","UpdateType":"Immutable"},"BinaryMediaTypes":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"CacheClusterEnabled":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"CacheClusterSize":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CanarySetting":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-api-canarysetting","Required":false,"Type":"CanarySetting","UpdateType":"Immutable"},"Cors":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveTypes":["String"],"Required":false,"Types":["CorsConfiguration"],"UpdateType":"Immutable"},"DefinitionBody":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"DefinitionUri":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveTypes":["String"],"Required":false,"Types":["S3Location"],"UpdateType":"Immutable"},"Description":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-api-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DisableExecuteApiEndpoint":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-api-disableexecuteapiendpoint","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Domain":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-api-domain","Required":false,"Type":"DomainConfiguration","UpdateType":"Immutable"},"EndpointConfiguration":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveTypes":["String"],"Required":false,"Types":["EndpointConfiguration"],"UpdateType":"Immutable"},"GatewayResponses":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-api-gatewayresponses","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"MethodSettings":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveItemType":"Json","Required":false,"Type":"List","UpdateType":"Immutable"},"MinimumCompressionSize":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-api-minimumcompressionsize","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Models":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-api.html#sam-api-models","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OpenApiVersion":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StageName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"TracingEnabled":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Variables":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}},"RequiredTransform":"AWS::Serverless-2016-10-31"},"AWS::Serverless::Application":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication","Properties":{"Location":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication","PrimitiveTypes":["String"],"Required":true,"Types":["ApplicationLocation"],"UpdateType":"Immutable"},"NotificationArns":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"Parameters":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Tags":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"TimeoutInMinutes":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapplication","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"}},"RequiredTransform":"AWS::Serverless-2016-10-31"},"AWS::Serverless::Function":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","Properties":{"Architectures":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-architectures","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"AssumeRolePolicyDocument":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-assumerolepolicydocument","PrimitiveType":"Json","Required":false,"ScrutinyType":"InlineResourcePolicy","UpdateType":"Immutable"},"AutoPublishAlias":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AutoPublishCodeSha256":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-autopublishcodesha256","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CodeSigningConfigArn":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-codesigningconfigarn","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"CodeUri":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveTypes":["String"],"Required":false,"Types":["S3Location"],"UpdateType":"Immutable"},"DeadLetterQueue":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","Required":false,"Type":"DeadLetterQueue","UpdateType":"Immutable"},"DeploymentPreference":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#deploymentpreference-object","Required":false,"Type":"DeploymentPreference","UpdateType":"Immutable"},"Description":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Environment":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","Required":false,"Type":"FunctionEnvironment","UpdateType":"Immutable"},"EventInvokeConfig":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","Required":false,"Type":"EventInvokeConfig","UpdateType":"Immutable"},"Events":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","ItemType":"EventSource","Required":false,"Type":"Map","UpdateType":"Immutable"},"FileSystemConfigs":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html","ItemType":"FileSystemConfig","Required":false,"Type":"List","UpdateType":"Immutable"},"FunctionName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Handler":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ImageConfig":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-imageconfig","Required":false,"Type":"ImageConfig","UpdateType":"Immutable"},"ImageUri":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-imageuri","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"InlineCode":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KmsKeyArn":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Layers":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"MemorySize":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"PackageType":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-packagetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PermissionsBoundary":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Policies":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","InclusiveItemTypes":["IAMPolicyDocument","SAMPolicyTemplate"],"InclusivePrimitiveItemTypes":["String"],"PrimitiveTypes":["String"],"Required":false,"Types":["IAMPolicyDocument"],"UpdateType":"Immutable"},"ProvisionedConcurrencyConfig":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","Required":false,"Type":"ProvisionedConcurrencyConfig","UpdateType":"Immutable"},"ReservedConcurrentExecutions":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Role":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Runtime":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Timeout":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Tracing":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VersionDescription":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"VpcConfig":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction","Required":false,"Type":"VpcConfig","UpdateType":"Immutable"}},"RequiredTransform":"AWS::Serverless-2016-10-31"},"AWS::Serverless::HttpApi":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","Properties":{"AccessLogSetting":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","Required":false,"Type":"AccessLogSetting","UpdateType":"Immutable"},"Auth":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","Required":false,"Type":"HttpApiAuth","UpdateType":"Immutable"},"CorsConfiguration":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","PrimitiveTypes":["Boolean"],"Required":false,"Types":["CorsConfigurationObject"],"UpdateType":"Immutable"},"DefaultRouteSettings":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","Required":false,"Type":"RouteSettings","UpdateType":"Immutable"},"DefinitionBody":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"DefinitionUri":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","PrimitiveTypes":["String"],"Required":false,"Types":["S3Location"],"UpdateType":"Immutable"},"Description":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DisableExecuteApiEndpoint":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-httpapi.html#sam-httpapi-disableexecuteapiendpoint","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"Domain":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","Required":false,"Type":"HttpApiDomainConfiguration","UpdateType":"Immutable"},"FailOnWarnings":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","PrimitiveType":"Boolean","Required":false,"UpdateType":"Immutable"},"RouteSettings":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","Required":false,"Type":"RouteSettings","UpdateType":"Immutable"},"StageName":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StageVariables":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Tags":{"Documentation":"https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesshttpapi","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}},"RequiredTransform":"AWS::Serverless-2016-10-31"},"AWS::Serverless::LayerVersion":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesslayerversion","Properties":{"CompatibleRuntimes":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesslayerversion","PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"ContentUri":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesslayerversion","PrimitiveTypes":["String"],"Required":false,"Types":["S3Location"],"UpdateType":"Immutable"},"Description":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesslayerversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LayerName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesslayerversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LicenseInfo":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesslayerversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RetentionPolicy":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesslayerversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}},"RequiredTransform":"AWS::Serverless-2016-10-31"},"AWS::Serverless::SimpleTable":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesssimpletable","Properties":{"PrimaryKey":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#primary-key-object","Required":false,"Type":"PrimaryKey","UpdateType":"Immutable"},"ProvisionedThroughput":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-provisionedthroughput.html","Required":false,"Type":"ProvisionedThroughput","UpdateType":"Immutable"},"SSESpecification":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesssimpletable","Required":false,"Type":"SSESpecification","UpdateType":"Immutable"},"TableName":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesssimpletable","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlesssimpletable","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"}},"RequiredTransform":"AWS::Serverless-2016-10-31"},"AWS::Serverless::StateMachine":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html","Properties":{"Definition":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html","PrimitiveType":"Json","Required":false,"UpdateType":"Immutable"},"DefinitionSubstitutions":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"DefinitionUri":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html","PrimitiveTypes":["String"],"Required":false,"Types":["S3Location"],"UpdateType":"Immutable"},"Events":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html","ItemType":"EventSource","Required":false,"Type":"Map","UpdateType":"Immutable"},"Logging":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html","Required":false,"Type":"LoggingConfiguration","UpdateType":"Immutable"},"Name":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PermissionsBoundaries":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html#sam-statemachine-permissionsboundary","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Policies":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html","InclusiveItemTypes":["IAMPolicyDocument","SAMPolicyTemplate"],"InclusivePrimitiveItemTypes":["String"],"PrimitiveTypes":["String"],"Required":false,"Types":["IAMPolicyDocument"],"UpdateType":"Immutable"},"Role":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Immutable"},"Tracing":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html#sam-statemachine-tracing","Required":false,"Type":"TracingConfiguration","UpdateType":"Immutable"},"Type":{"Documentation":"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}},"RequiredTransform":"AWS::Serverless-2016-10-31"},"AWS::ServiceCatalog::AcceptedPortfolioShare":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-acceptedportfolioshare.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-acceptedportfolioshare.html#cfn-servicecatalog-acceptedportfolioshare-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PortfolioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-acceptedportfolioshare.html#cfn-servicecatalog-acceptedportfolioshare-portfolioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ServiceCatalog::CloudFormationProduct":{"Attributes":{"ProductName":{"PrimitiveType":"String"},"ProvisioningArtifactIds":{"PrimitiveType":"String"},"ProvisioningArtifactNames":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Distributor":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-distributor","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Owner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-owner","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProductType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-producttype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProvisioningArtifactParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-provisioningartifactparameters","ItemType":"ProvisioningArtifactProperties","Required":false,"Type":"List","UpdateType":"Mutable"},"ReplaceProvisioningArtifacts":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-replaceprovisioningartifacts","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SourceConnection":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-sourceconnection","Required":false,"Type":"SourceConnection","UpdateType":"Mutable"},"SupportDescription":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-supportdescription","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SupportEmail":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-supportemail","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"SupportUrl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-supporturl","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationproduct.html#cfn-servicecatalog-cloudformationproduct-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ServiceCatalog::CloudFormationProvisionedProduct":{"Attributes":{"CloudformationStackArn":{"PrimitiveType":"String"},"Outputs":{"PrimitiveItemType":"String","Type":"Map"},"ProvisionedProductId":{"PrimitiveType":"String"},"RecordId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NotificationArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-notificationarns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"PathId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-pathid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PathName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-pathname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProductId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-productid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProductName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-productname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProvisionedProductName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisionedproductname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ProvisioningArtifactId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningartifactid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProvisioningArtifactName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningartifactname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProvisioningParameters":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningparameters","DuplicatesAllowed":true,"ItemType":"ProvisioningParameter","Required":false,"Type":"List","UpdateType":"Mutable"},"ProvisioningPreferences":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-provisioningpreferences","Required":false,"Type":"ProvisioningPreferences","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-cloudformationprovisionedproduct.html#cfn-servicecatalog-cloudformationprovisionedproduct-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ServiceCatalog::LaunchNotificationConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchnotificationconstraint.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchnotificationconstraint.html#cfn-servicecatalog-launchnotificationconstraint-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchnotificationconstraint.html#cfn-servicecatalog-launchnotificationconstraint-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"NotificationArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchnotificationconstraint.html#cfn-servicecatalog-launchnotificationconstraint-notificationarns","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"PortfolioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchnotificationconstraint.html#cfn-servicecatalog-launchnotificationconstraint-portfolioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProductId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchnotificationconstraint.html#cfn-servicecatalog-launchnotificationconstraint-productid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ServiceCatalog::LaunchRoleConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchroleconstraint.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchroleconstraint.html#cfn-servicecatalog-launchroleconstraint-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchroleconstraint.html#cfn-servicecatalog-launchroleconstraint-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LocalRoleName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchroleconstraint.html#cfn-servicecatalog-launchroleconstraint-localrolename","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PortfolioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchroleconstraint.html#cfn-servicecatalog-launchroleconstraint-portfolioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProductId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchroleconstraint.html#cfn-servicecatalog-launchroleconstraint-productid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchroleconstraint.html#cfn-servicecatalog-launchroleconstraint-rolearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::ServiceCatalog::LaunchTemplateConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchtemplateconstraint.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchtemplateconstraint.html#cfn-servicecatalog-launchtemplateconstraint-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchtemplateconstraint.html#cfn-servicecatalog-launchtemplateconstraint-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PortfolioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchtemplateconstraint.html#cfn-servicecatalog-launchtemplateconstraint-portfolioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProductId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchtemplateconstraint.html#cfn-servicecatalog-launchtemplateconstraint-productid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-launchtemplateconstraint.html#cfn-servicecatalog-launchtemplateconstraint-rules","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ServiceCatalog::Portfolio":{"Attributes":{"PortfolioName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolio.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolio.html#cfn-servicecatalog-portfolio-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolio.html#cfn-servicecatalog-portfolio-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DisplayName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolio.html#cfn-servicecatalog-portfolio-displayname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProviderName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolio.html#cfn-servicecatalog-portfolio-providername","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolio.html#cfn-servicecatalog-portfolio-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ServiceCatalog::PortfolioPrincipalAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioprincipalassociation.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioprincipalassociation.html#cfn-servicecatalog-portfolioprincipalassociation-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PortfolioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioprincipalassociation.html#cfn-servicecatalog-portfolioprincipalassociation-portfolioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PrincipalARN":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioprincipalassociation.html#cfn-servicecatalog-portfolioprincipalassociation-principalarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PrincipalType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioprincipalassociation.html#cfn-servicecatalog-portfolioprincipalassociation-principaltype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ServiceCatalog::PortfolioProductAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioproductassociation.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioproductassociation.html#cfn-servicecatalog-portfolioproductassociation-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PortfolioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioproductassociation.html#cfn-servicecatalog-portfolioproductassociation-portfolioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProductId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioproductassociation.html#cfn-servicecatalog-portfolioproductassociation-productid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SourcePortfolioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioproductassociation.html#cfn-servicecatalog-portfolioproductassociation-sourceportfolioid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::ServiceCatalog::PortfolioShare":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioshare.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioshare.html#cfn-servicecatalog-portfolioshare-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"AccountId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioshare.html#cfn-servicecatalog-portfolioshare-accountid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"PortfolioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioshare.html#cfn-servicecatalog-portfolioshare-portfolioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ShareTagOptions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-portfolioshare.html#cfn-servicecatalog-portfolioshare-sharetagoptions","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"}}},"AWS::ServiceCatalog::ResourceUpdateConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-resourceupdateconstraint.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-resourceupdateconstraint.html#cfn-servicecatalog-resourceupdateconstraint-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-resourceupdateconstraint.html#cfn-servicecatalog-resourceupdateconstraint-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PortfolioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-resourceupdateconstraint.html#cfn-servicecatalog-resourceupdateconstraint-portfolioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProductId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-resourceupdateconstraint.html#cfn-servicecatalog-resourceupdateconstraint-productid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TagUpdateOnProvisionedProduct":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-resourceupdateconstraint.html#cfn-servicecatalog-resourceupdateconstraint-tagupdateonprovisionedproduct","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ServiceCatalog::ServiceAction":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-serviceaction.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-serviceaction.html#cfn-servicecatalog-serviceaction-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-serviceaction.html#cfn-servicecatalog-serviceaction-definition","DuplicatesAllowed":true,"ItemType":"DefinitionParameter","Required":true,"Type":"List","UpdateType":"Mutable"},"DefinitionType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-serviceaction.html#cfn-servicecatalog-serviceaction-definitiontype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-serviceaction.html#cfn-servicecatalog-serviceaction-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-serviceaction.html#cfn-servicecatalog-serviceaction-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ServiceCatalog::ServiceActionAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-serviceactionassociation.html","Properties":{"ProductId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-serviceactionassociation.html#cfn-servicecatalog-serviceactionassociation-productid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProvisioningArtifactId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-serviceactionassociation.html#cfn-servicecatalog-serviceactionassociation-provisioningartifactid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ServiceActionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-serviceactionassociation.html#cfn-servicecatalog-serviceactionassociation-serviceactionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ServiceCatalog::StackSetConstraint":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-stacksetconstraint.html","Properties":{"AcceptLanguage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-stacksetconstraint.html#cfn-servicecatalog-stacksetconstraint-acceptlanguage","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"AccountList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-stacksetconstraint.html#cfn-servicecatalog-stacksetconstraint-accountlist","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"AdminRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-stacksetconstraint.html#cfn-servicecatalog-stacksetconstraint-adminrole","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-stacksetconstraint.html#cfn-servicecatalog-stacksetconstraint-description","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ExecutionRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-stacksetconstraint.html#cfn-servicecatalog-stacksetconstraint-executionrole","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PortfolioId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-stacksetconstraint.html#cfn-servicecatalog-stacksetconstraint-portfolioid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProductId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-stacksetconstraint.html#cfn-servicecatalog-stacksetconstraint-productid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RegionList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-stacksetconstraint.html#cfn-servicecatalog-stacksetconstraint-regionlist","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"StackInstanceControl":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-stacksetconstraint.html#cfn-servicecatalog-stacksetconstraint-stackinstancecontrol","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::ServiceCatalog::TagOption":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-tagoption.html","Properties":{"Active":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-tagoption.html#cfn-servicecatalog-tagoption-active","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"Key":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-tagoption.html#cfn-servicecatalog-tagoption-key","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Value":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-tagoption.html#cfn-servicecatalog-tagoption-value","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ServiceCatalog::TagOptionAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-tagoptionassociation.html","Properties":{"ResourceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-tagoptionassociation.html#cfn-servicecatalog-tagoptionassociation-resourceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"TagOptionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalog-tagoptionassociation.html#cfn-servicecatalog-tagoptionassociation-tagoptionid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ServiceCatalogAppRegistry::Application":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-application.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-application.html#cfn-servicecatalogappregistry-application-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-application.html#cfn-servicecatalogappregistry-application-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-application.html#cfn-servicecatalogappregistry-application-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::ServiceCatalogAppRegistry::AttributeGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-attributegroup.html","Properties":{"Attributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-attributegroup.html#cfn-servicecatalogappregistry-attributegroup-attributes","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-attributegroup.html#cfn-servicecatalogappregistry-attributegroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-attributegroup.html#cfn-servicecatalogappregistry-attributegroup-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-attributegroup.html#cfn-servicecatalogappregistry-attributegroup-tags","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"}}},"AWS::ServiceCatalogAppRegistry::AttributeGroupAssociation":{"Attributes":{"ApplicationArn":{"PrimitiveType":"String"},"AttributeGroupArn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-attributegroupassociation.html","Properties":{"Application":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-attributegroupassociation.html#cfn-servicecatalogappregistry-attributegroupassociation-application","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"AttributeGroup":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-attributegroupassociation.html#cfn-servicecatalogappregistry-attributegroupassociation-attributegroup","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ServiceCatalogAppRegistry::ResourceAssociation":{"Attributes":{"ApplicationArn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"ResourceArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-resourceassociation.html","Properties":{"Application":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-resourceassociation.html#cfn-servicecatalogappregistry-resourceassociation-application","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Resource":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-resourceassociation.html#cfn-servicecatalogappregistry-resourceassociation-resource","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicecatalogappregistry-resourceassociation.html#cfn-servicecatalogappregistry-resourceassociation-resourcetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ServiceDiscovery::HttpNamespace":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-httpnamespace.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-httpnamespace.html#cfn-servicediscovery-httpnamespace-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-httpnamespace.html#cfn-servicediscovery-httpnamespace-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-httpnamespace.html#cfn-servicediscovery-httpnamespace-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::Instance":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-instance.html","Properties":{"InstanceAttributes":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-instance.html#cfn-servicediscovery-instance-instanceattributes","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"InstanceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-instance.html#cfn-servicediscovery-instance-instanceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServiceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-instance.html#cfn-servicediscovery-instance-serviceid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ServiceDiscovery::PrivateDnsNamespace":{"Attributes":{"Arn":{"PrimitiveType":"String"},"HostedZoneId":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-privatednsnamespace.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-privatednsnamespace.html#cfn-servicediscovery-privatednsnamespace-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-privatednsnamespace.html#cfn-servicediscovery-privatednsnamespace-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Properties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-privatednsnamespace.html#cfn-servicediscovery-privatednsnamespace-properties","Required":false,"Type":"Properties","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-privatednsnamespace.html#cfn-servicediscovery-privatednsnamespace-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Vpc":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-privatednsnamespace.html#cfn-servicediscovery-privatednsnamespace-vpc","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::ServiceDiscovery::PublicDnsNamespace":{"Attributes":{"Arn":{"PrimitiveType":"String"},"HostedZoneId":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-publicdnsnamespace.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-publicdnsnamespace.html#cfn-servicediscovery-publicdnsnamespace-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-publicdnsnamespace.html#cfn-servicediscovery-publicdnsnamespace-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Properties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-publicdnsnamespace.html#cfn-servicediscovery-publicdnsnamespace-properties","Required":false,"Type":"Properties","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-publicdnsnamespace.html#cfn-servicediscovery-publicdnsnamespace-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::ServiceDiscovery::Service":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-service.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-service.html#cfn-servicediscovery-service-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DnsConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-service.html#cfn-servicediscovery-service-dnsconfig","Required":false,"Type":"DnsConfig","UpdateType":"Mutable"},"HealthCheckConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-service.html#cfn-servicediscovery-service-healthcheckconfig","Required":false,"Type":"HealthCheckConfig","UpdateType":"Mutable"},"HealthCheckCustomConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-service.html#cfn-servicediscovery-service-healthcheckcustomconfig","Required":false,"Type":"HealthCheckCustomConfig","UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-service.html#cfn-servicediscovery-service-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NamespaceId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-service.html#cfn-servicediscovery-service-namespaceid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-service.html#cfn-servicediscovery-service-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-service.html#cfn-servicediscovery-service-type","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::Shield::DRTAccess":{"Attributes":{"AccountId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-drtaccess.html","Properties":{"LogBucketList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-drtaccess.html#cfn-shield-drtaccess-logbucketlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-drtaccess.html#cfn-shield-drtaccess-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Shield::ProactiveEngagement":{"Attributes":{"AccountId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-proactiveengagement.html","Properties":{"EmergencyContactList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-proactiveengagement.html#cfn-shield-proactiveengagement-emergencycontactlist","DuplicatesAllowed":true,"ItemType":"EmergencyContact","Required":true,"Type":"List","UpdateType":"Mutable"},"ProactiveEngagementStatus":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-proactiveengagement.html#cfn-shield-proactiveengagement-proactiveengagementstatus","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Shield::Protection":{"Attributes":{"ProtectionArn":{"PrimitiveType":"String"},"ProtectionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protection.html","Properties":{"ApplicationLayerAutomaticResponseConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protection.html#cfn-shield-protection-applicationlayerautomaticresponseconfiguration","Required":false,"Type":"ApplicationLayerAutomaticResponseConfiguration","UpdateType":"Mutable"},"HealthCheckArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protection.html#cfn-shield-protection-healthcheckarns","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protection.html#cfn-shield-protection-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protection.html#cfn-shield-protection-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protection.html#cfn-shield-protection-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Shield::ProtectionGroup":{"Attributes":{"ProtectionGroupArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protectiongroup.html","Properties":{"Aggregation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protectiongroup.html#cfn-shield-protectiongroup-aggregation","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Members":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protectiongroup.html#cfn-shield-protectiongroup-members","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Pattern":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protectiongroup.html#cfn-shield-protectiongroup-pattern","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ProtectionGroupId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protectiongroup.html#cfn-shield-protectiongroup-protectiongroupid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protectiongroup.html#cfn-shield-protectiongroup-resourcetype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-shield-protectiongroup.html#cfn-shield-protectiongroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Signer::ProfilePermission":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-signer-profilepermission.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-signer-profilepermission.html#cfn-signer-profilepermission-action","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Principal":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-signer-profilepermission.html#cfn-signer-profilepermission-principal","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProfileName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-signer-profilepermission.html#cfn-signer-profilepermission-profilename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ProfileVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-signer-profilepermission.html#cfn-signer-profilepermission-profileversion","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StatementId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-signer-profilepermission.html#cfn-signer-profilepermission-statementid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Signer::SigningProfile":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ProfileName":{"PrimitiveType":"String"},"ProfileVersion":{"PrimitiveType":"String"},"ProfileVersionArn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-signer-signingprofile.html","Properties":{"PlatformId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-signer-signingprofile.html#cfn-signer-signingprofile-platformid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SignatureValidityPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-signer-signingprofile.html#cfn-signer-signingprofile-signaturevalidityperiod","Required":false,"Type":"SignatureValidityPeriod","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-signer-signingprofile.html#cfn-signer-signingprofile-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SimSpaceWeaver::Simulation":{"Attributes":{"DescribePayload":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-simspaceweaver-simulation.html","Properties":{"MaximumDuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-simspaceweaver-simulation.html#cfn-simspaceweaver-simulation-maximumduration","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-simspaceweaver-simulation.html#cfn-simspaceweaver-simulation-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-simspaceweaver-simulation.html#cfn-simspaceweaver-simulation-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SchemaS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-simspaceweaver-simulation.html#cfn-simspaceweaver-simulation-schemas3location","Required":false,"Type":"S3Location","UpdateType":"Immutable"},"SnapshotS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-simspaceweaver-simulation.html#cfn-simspaceweaver-simulation-snapshots3location","Required":false,"Type":"S3Location","UpdateType":"Immutable"}}},"AWS::StepFunctions::Activity":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-activity.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-activity.html#cfn-stepfunctions-activity-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-activity.html#cfn-stepfunctions-activity-tags","DuplicatesAllowed":true,"ItemType":"TagsEntry","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::StepFunctions::StateMachine":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"},"StateMachineRevisionId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html","Properties":{"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definition","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"DefinitionS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definitions3location","Required":false,"Type":"S3Location","UpdateType":"Mutable"},"DefinitionString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definitionstring","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"DefinitionSubstitutions":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-definitionsubstitutions","PrimitiveItemType":"String","Required":false,"Type":"Map","UpdateType":"Mutable"},"LoggingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-loggingconfiguration","Required":false,"Type":"LoggingConfiguration","UpdateType":"Mutable"},"RoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-rolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"StateMachineName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-statemachinename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"StateMachineType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-statemachinetype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-tags","DuplicatesAllowed":true,"ItemType":"TagsEntry","Required":false,"Type":"List","UpdateType":"Mutable"},"TracingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html#cfn-stepfunctions-statemachine-tracingconfiguration","Required":false,"Type":"TracingConfiguration","UpdateType":"Mutable"}}},"AWS::StepFunctions::StateMachineAlias":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachinealias.html","Properties":{"DeploymentPreference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachinealias.html#cfn-stepfunctions-statemachinealias-deploymentpreference","Required":false,"Type":"DeploymentPreference","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachinealias.html#cfn-stepfunctions-statemachinealias-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachinealias.html#cfn-stepfunctions-statemachinealias-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RoutingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachinealias.html#cfn-stepfunctions-statemachinealias-routingconfiguration","DuplicatesAllowed":false,"ItemType":"RoutingConfigurationVersion","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::StepFunctions::StateMachineVersion":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachineversion.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachineversion.html#cfn-stepfunctions-statemachineversion-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StateMachineArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachineversion.html#cfn-stepfunctions-statemachineversion-statemachinearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"StateMachineRevisionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachineversion.html#cfn-stepfunctions-statemachineversion-statemachinerevisionid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::SupportApp::AccountAlias":{"Attributes":{"AccountAliasResourceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-accountalias.html","Properties":{"AccountAlias":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-accountalias.html#cfn-supportapp-accountalias-accountalias","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::SupportApp::SlackChannelConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackchannelconfiguration.html","Properties":{"ChannelId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackchannelconfiguration.html#cfn-supportapp-slackchannelconfiguration-channelid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ChannelName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackchannelconfiguration.html#cfn-supportapp-slackchannelconfiguration-channelname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ChannelRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackchannelconfiguration.html#cfn-supportapp-slackchannelconfiguration-channelrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NotifyOnAddCorrespondenceToCase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackchannelconfiguration.html#cfn-supportapp-slackchannelconfiguration-notifyonaddcorrespondencetocase","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NotifyOnCaseSeverity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackchannelconfiguration.html#cfn-supportapp-slackchannelconfiguration-notifyoncaseseverity","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"NotifyOnCreateOrReopenCase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackchannelconfiguration.html#cfn-supportapp-slackchannelconfiguration-notifyoncreateorreopencase","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"NotifyOnResolveCase":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackchannelconfiguration.html#cfn-supportapp-slackchannelconfiguration-notifyonresolvecase","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"TeamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackchannelconfiguration.html#cfn-supportapp-slackchannelconfiguration-teamid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::SupportApp::SlackWorkspaceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackworkspaceconfiguration.html","Properties":{"TeamId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackworkspaceconfiguration.html#cfn-supportapp-slackworkspaceconfiguration-teamid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"VersionId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-supportapp-slackworkspaceconfiguration.html#cfn-supportapp-slackworkspaceconfiguration-versionid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::Synthetics::Canary":{"Attributes":{"Code.SourceLocationArn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html","Properties":{"ArtifactConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-artifactconfig","Required":false,"Type":"ArtifactConfig","UpdateType":"Mutable"},"ArtifactS3Location":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-artifacts3location","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Code":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-code","Required":true,"Type":"Code","UpdateType":"Mutable"},"DeleteLambdaResourcesOnCanaryDeletion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-deletelambdaresourcesoncanarydeletion","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"ExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-executionrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"FailureRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-failureretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RunConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-runconfig","Required":false,"Type":"RunConfig","UpdateType":"Mutable"},"RuntimeVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-runtimeversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Schedule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-schedule","Required":true,"Type":"Schedule","UpdateType":"Mutable"},"StartCanaryAfterCreation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-startcanaryaftercreation","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"SuccessRetentionPeriod":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-successretentionperiod","PrimitiveType":"Integer","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VPCConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-vpcconfig","Required":false,"Type":"VPCConfig","UpdateType":"Mutable"},"VisualReference":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-canary.html#cfn-synthetics-canary-visualreference","Required":false,"Type":"VisualReference","UpdateType":"Mutable"}}},"AWS::Synthetics::Group":{"Attributes":{"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-group.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-group.html#cfn-synthetics-group-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ResourceArns":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-group.html#cfn-synthetics-group-resourcearns","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-synthetics-group.html#cfn-synthetics-group-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::SystemsManagerSAP::Application":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-systemsmanagersap-application.html","Properties":{"ApplicationId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-systemsmanagersap-application.html#cfn-systemsmanagersap-application-applicationid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ApplicationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-systemsmanagersap-application.html#cfn-systemsmanagersap-application-applicationtype","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Credentials":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-systemsmanagersap-application.html#cfn-systemsmanagersap-application-credentials","DuplicatesAllowed":true,"ItemType":"Credential","Required":false,"Type":"List","UpdateType":"Immutable"},"Instances":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-systemsmanagersap-application.html#cfn-systemsmanagersap-application-instances","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Immutable"},"SapInstanceNumber":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-systemsmanagersap-application.html#cfn-systemsmanagersap-application-sapinstancenumber","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Sid":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-systemsmanagersap-application.html#cfn-systemsmanagersap-application-sid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-systemsmanagersap-application.html#cfn-systemsmanagersap-application-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Timestream::Database":{"Attributes":{"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-database.html","Properties":{"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-database.html#cfn-timestream-database-databasename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-database.html#cfn-timestream-database-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-database.html#cfn-timestream-database-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Timestream::ScheduledQuery":{"Attributes":{"Arn":{"PrimitiveType":"String"},"SQErrorReportConfiguration":{"PrimitiveType":"String"},"SQKmsKeyId":{"PrimitiveType":"String"},"SQName":{"PrimitiveType":"String"},"SQNotificationConfiguration":{"PrimitiveType":"String"},"SQQueryString":{"PrimitiveType":"String"},"SQScheduleConfiguration":{"PrimitiveType":"String"},"SQScheduledQueryExecutionRoleArn":{"PrimitiveType":"String"},"SQTargetConfiguration":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-scheduledquery.html","Properties":{"ClientToken":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-scheduledquery.html#cfn-timestream-scheduledquery-clienttoken","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ErrorReportConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-scheduledquery.html#cfn-timestream-scheduledquery-errorreportconfiguration","Required":true,"Type":"ErrorReportConfiguration","UpdateType":"Immutable"},"KmsKeyId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-scheduledquery.html#cfn-timestream-scheduledquery-kmskeyid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"NotificationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-scheduledquery.html#cfn-timestream-scheduledquery-notificationconfiguration","Required":true,"Type":"NotificationConfiguration","UpdateType":"Immutable"},"QueryString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-scheduledquery.html#cfn-timestream-scheduledquery-querystring","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ScheduleConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-scheduledquery.html#cfn-timestream-scheduledquery-scheduleconfiguration","Required":true,"Type":"ScheduleConfiguration","UpdateType":"Immutable"},"ScheduledQueryExecutionRoleArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-scheduledquery.html#cfn-timestream-scheduledquery-scheduledqueryexecutionrolearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ScheduledQueryName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-scheduledquery.html#cfn-timestream-scheduledquery-scheduledqueryname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-scheduledquery.html#cfn-timestream-scheduledquery-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TargetConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-scheduledquery.html#cfn-timestream-scheduledquery-targetconfiguration","Required":false,"Type":"TargetConfiguration","UpdateType":"Immutable"}}},"AWS::Timestream::Table":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Name":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-table.html","Properties":{"DatabaseName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-table.html#cfn-timestream-table-databasename","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"MagneticStoreWriteProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-table.html#cfn-timestream-table-magneticstorewriteproperties","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"RetentionProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-table.html#cfn-timestream-table-retentionproperties","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"TableName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-table.html#cfn-timestream-table-tablename","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-timestream-table.html#cfn-timestream-table-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Transfer::Agreement":{"Attributes":{"AgreementId":{"PrimitiveType":"String"},"Arn":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-agreement.html","Properties":{"AccessRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-agreement.html#cfn-transfer-agreement-accessrole","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"BaseDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-agreement.html#cfn-transfer-agreement-basedirectory","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-agreement.html#cfn-transfer-agreement-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"LocalProfileId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-agreement.html#cfn-transfer-agreement-localprofileid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PartnerProfileId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-agreement.html#cfn-transfer-agreement-partnerprofileid","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-agreement.html#cfn-transfer-agreement-serverid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Status":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-agreement.html#cfn-transfer-agreement-status","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-agreement.html#cfn-transfer-agreement-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Transfer::Certificate":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CertificateId":{"PrimitiveType":"String"},"NotAfterDate":{"PrimitiveType":"String"},"NotBeforeDate":{"PrimitiveType":"String"},"Serial":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"Type":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-certificate.html","Properties":{"ActiveDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-certificate.html#cfn-transfer-certificate-activedate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-certificate.html#cfn-transfer-certificate-certificate","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"CertificateChain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-certificate.html#cfn-transfer-certificate-certificatechain","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-certificate.html#cfn-transfer-certificate-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"InactiveDate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-certificate.html#cfn-transfer-certificate-inactivedate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PrivateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-certificate.html#cfn-transfer-certificate-privatekey","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-certificate.html#cfn-transfer-certificate-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Usage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-certificate.html#cfn-transfer-certificate-usage","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Transfer::Connector":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ConnectorId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-connector.html","Properties":{"AccessRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-connector.html#cfn-transfer-connector-accessrole","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"As2Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-connector.html#cfn-transfer-connector-as2config","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"LoggingRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-connector.html#cfn-transfer-connector-loggingrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-connector.html#cfn-transfer-connector-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Url":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-connector.html#cfn-transfer-connector-url","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::Transfer::Profile":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ProfileId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-profile.html","Properties":{"As2Id":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-profile.html#cfn-transfer-profile-as2id","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"CertificateIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-profile.html#cfn-transfer-profile-certificateids","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ProfileType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-profile.html#cfn-transfer-profile-profiletype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-profile.html#cfn-transfer-profile-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::Transfer::Server":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ServerId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html","Properties":{"Certificate":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-certificate","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Domain":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-domain","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"EndpointDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-endpointdetails","Required":false,"Type":"EndpointDetails","UpdateType":"Mutable"},"EndpointType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-endpointtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IdentityProviderDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-identityproviderdetails","Required":false,"Type":"IdentityProviderDetails","UpdateType":"Mutable"},"IdentityProviderType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-identityprovidertype","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"LoggingRole":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-loggingrole","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PostAuthenticationLoginBanner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-postauthenticationloginbanner","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PreAuthenticationLoginBanner":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-preauthenticationloginbanner","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"ProtocolDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-protocoldetails","Required":false,"Type":"ProtocolDetails","UpdateType":"Mutable"},"Protocols":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-protocols","ItemType":"Protocol","Required":false,"Type":"List","UpdateType":"Mutable"},"SecurityPolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-securitypolicyname","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"StructuredLogDestinations":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-structuredlogdestinations","ItemType":"StructuredLogDestination","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"WorkflowDetails":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-server.html#cfn-transfer-server-workflowdetails","Required":false,"Type":"WorkflowDetails","UpdateType":"Mutable"}}},"AWS::Transfer::User":{"Attributes":{"Arn":{"PrimitiveType":"String"},"ServerId":{"PrimitiveType":"String"},"UserName":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-user.html","Properties":{"HomeDirectory":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-user.html#cfn-transfer-user-homedirectory","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"HomeDirectoryMappings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-user.html#cfn-transfer-user-homedirectorymappings","ItemType":"HomeDirectoryMapEntry","Required":false,"Type":"List","UpdateType":"Mutable"},"HomeDirectoryType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-user.html#cfn-transfer-user-homedirectorytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-user.html#cfn-transfer-user-policy","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PosixProfile":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-user.html#cfn-transfer-user-posixprofile","Required":false,"Type":"PosixProfile","UpdateType":"Mutable"},"Role":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-user.html#cfn-transfer-user-role","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServerId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-user.html#cfn-transfer-user-serverid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SshPublicKeys":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-user.html#cfn-transfer-user-sshpublickeys","ItemType":"SshPublicKey","Required":false,"Type":"List","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-user.html#cfn-transfer-user-tags","ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-user.html#cfn-transfer-user-username","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Transfer::Workflow":{"Attributes":{"Arn":{"PrimitiveType":"String"},"WorkflowId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-workflow.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-workflow.html#cfn-transfer-workflow-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"OnExceptionSteps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-workflow.html#cfn-transfer-workflow-onexceptionsteps","DuplicatesAllowed":false,"ItemType":"WorkflowStep","Required":false,"Type":"List","UpdateType":"Immutable"},"Steps":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-workflow.html#cfn-transfer-workflow-steps","DuplicatesAllowed":false,"ItemType":"WorkflowStep","Required":true,"Type":"List","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-transfer-workflow.html#cfn-transfer-workflow-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::VerifiedPermissions::IdentitySource":{"Attributes":{"Details":{"Type":"IdentitySourceDetails"},"Details.ClientIds":{"PrimitiveItemType":"String","Type":"List"},"Details.DiscoveryUrl":{"PrimitiveType":"String"},"Details.OpenIdIssuer":{"PrimitiveType":"String"},"Details.UserPoolArn":{"PrimitiveType":"String"},"IdentitySourceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-identitysource.html","Properties":{"Configuration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-identitysource.html#cfn-verifiedpermissions-identitysource-configuration","Required":true,"Type":"IdentitySourceConfiguration","UpdateType":"Mutable"},"PolicyStoreId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-identitysource.html#cfn-verifiedpermissions-identitysource-policystoreid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"PrincipalEntityType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-identitysource.html#cfn-verifiedpermissions-identitysource-principalentitytype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"}}},"AWS::VerifiedPermissions::Policy":{"Attributes":{"PolicyId":{"PrimitiveType":"String"},"PolicyType":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-policy.html","Properties":{"Definition":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-policy.html#cfn-verifiedpermissions-policy-definition","Required":true,"Type":"PolicyDefinition","UpdateType":"Mutable"},"PolicyStoreId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-policy.html#cfn-verifiedpermissions-policy-policystoreid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::VerifiedPermissions::PolicyStore":{"Attributes":{"Arn":{"PrimitiveType":"String"},"PolicyStoreId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-policystore.html","Properties":{"Schema":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-policystore.html#cfn-verifiedpermissions-policystore-schema","Required":false,"Type":"SchemaDefinition","UpdateType":"Mutable"},"ValidationSettings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-policystore.html#cfn-verifiedpermissions-policystore-validationsettings","Required":true,"Type":"ValidationSettings","UpdateType":"Mutable"}}},"AWS::VerifiedPermissions::PolicyTemplate":{"Attributes":{"PolicyTemplateId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-policytemplate.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-policytemplate.html#cfn-verifiedpermissions-policytemplate-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"PolicyStoreId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-policytemplate.html#cfn-verifiedpermissions-policytemplate-policystoreid","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Statement":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-verifiedpermissions-policytemplate.html#cfn-verifiedpermissions-policytemplate-statement","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"}}},"AWS::VoiceID::Domain":{"Attributes":{"DomainId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-voiceid-domain.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-voiceid-domain.html#cfn-voiceid-domain-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-voiceid-domain.html#cfn-voiceid-domain-name","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ServerSideEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-voiceid-domain.html#cfn-voiceid-domain-serversideencryptionconfiguration","Required":true,"Type":"ServerSideEncryptionConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-voiceid-domain.html#cfn-voiceid-domain-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::VpcLattice::AccessLogSubscription":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"ResourceArn":{"PrimitiveType":"String"},"ResourceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-accesslogsubscription.html","Properties":{"DestinationArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-accesslogsubscription.html#cfn-vpclattice-accesslogsubscription-destinationarn","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"ResourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-accesslogsubscription.html#cfn-vpclattice-accesslogsubscription-resourceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-accesslogsubscription.html#cfn-vpclattice-accesslogsubscription-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::VpcLattice::AuthPolicy":{"Attributes":{"State":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-authpolicy.html","Properties":{"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-authpolicy.html#cfn-vpclattice-authpolicy-policy","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"ResourceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-authpolicy.html#cfn-vpclattice-authpolicy-resourceidentifier","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::VpcLattice::Listener":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"ServiceArn":{"PrimitiveType":"String"},"ServiceId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-listener.html","Properties":{"DefaultAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-listener.html#cfn-vpclattice-listener-defaultaction","Required":true,"Type":"DefaultAction","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-listener.html#cfn-vpclattice-listener-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Port":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-listener.html#cfn-vpclattice-listener-port","PrimitiveType":"Integer","Required":false,"UpdateType":"Immutable"},"Protocol":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-listener.html#cfn-vpclattice-listener-protocol","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ServiceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-listener.html#cfn-vpclattice-listener-serviceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-listener.html#cfn-vpclattice-listener-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::VpcLattice::ResourcePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-resourcepolicy.html","Properties":{"Policy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-resourcepolicy.html#cfn-vpclattice-resourcepolicy-policy","PrimitiveType":"Json","Required":true,"UpdateType":"Mutable"},"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-resourcepolicy.html#cfn-vpclattice-resourcepolicy-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}},"ScrutinyType":"ResourcePolicyResource"},"AWS::VpcLattice::Rule":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-rule.html","Properties":{"Action":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-rule.html#cfn-vpclattice-rule-action","Required":true,"Type":"Action","UpdateType":"Mutable"},"ListenerIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-rule.html#cfn-vpclattice-rule-listeneridentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Match":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-rule.html#cfn-vpclattice-rule-match","Required":true,"Type":"Match","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-rule.html#cfn-vpclattice-rule-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Priority":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-rule.html#cfn-vpclattice-rule-priority","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ServiceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-rule.html#cfn-vpclattice-rule-serviceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-rule.html#cfn-vpclattice-rule-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::VpcLattice::Service":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"DnsEntry.DomainName":{"PrimitiveType":"String"},"DnsEntry.HostedZoneId":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LastUpdatedAt":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-service.html","Properties":{"AuthType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-service.html#cfn-vpclattice-service-authtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CertificateArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-service.html#cfn-vpclattice-service-certificatearn","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"CustomDomainName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-service.html#cfn-vpclattice-service-customdomainname","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"DnsEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-service.html#cfn-vpclattice-service-dnsentry","Required":false,"Type":"DnsEntry","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-service.html#cfn-vpclattice-service-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-service.html#cfn-vpclattice-service-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::VpcLattice::ServiceNetwork":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LastUpdatedAt":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetwork.html","Properties":{"AuthType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetwork.html#cfn-vpclattice-servicenetwork-authtype","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetwork.html#cfn-vpclattice-servicenetwork-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetwork.html#cfn-vpclattice-servicenetwork-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::VpcLattice::ServiceNetworkServiceAssociation":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"DnsEntry.DomainName":{"PrimitiveType":"String"},"DnsEntry.HostedZoneId":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"ServiceArn":{"PrimitiveType":"String"},"ServiceId":{"PrimitiveType":"String"},"ServiceName":{"PrimitiveType":"String"},"ServiceNetworkArn":{"PrimitiveType":"String"},"ServiceNetworkId":{"PrimitiveType":"String"},"ServiceNetworkName":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetworkserviceassociation.html","Properties":{"DnsEntry":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetworkserviceassociation.html#cfn-vpclattice-servicenetworkserviceassociation-dnsentry","Required":false,"Type":"DnsEntry","UpdateType":"Mutable"},"ServiceIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetworkserviceassociation.html#cfn-vpclattice-servicenetworkserviceassociation-serviceidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"ServiceNetworkIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetworkserviceassociation.html#cfn-vpclattice-servicenetworkserviceassociation-servicenetworkidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetworkserviceassociation.html#cfn-vpclattice-servicenetworkserviceassociation-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::VpcLattice::ServiceNetworkVpcAssociation":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"ServiceNetworkArn":{"PrimitiveType":"String"},"ServiceNetworkId":{"PrimitiveType":"String"},"ServiceNetworkName":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"},"VpcId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetworkvpcassociation.html","Properties":{"SecurityGroupIds":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetworkvpcassociation.html#cfn-vpclattice-servicenetworkvpcassociation-securitygroupids","DuplicatesAllowed":false,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"ServiceNetworkIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetworkvpcassociation.html#cfn-vpclattice-servicenetworkvpcassociation-servicenetworkidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetworkvpcassociation.html#cfn-vpclattice-servicenetworkvpcassociation-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VpcIdentifier":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-servicenetworkvpcassociation.html#cfn-vpclattice-servicenetworkvpcassociation-vpcidentifier","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"}}},"AWS::VpcLattice::TargetGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"CreatedAt":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LastUpdatedAt":{"PrimitiveType":"String"},"Status":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-targetgroup.html","Properties":{"Config":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-targetgroup.html#cfn-vpclattice-targetgroup-config","Required":false,"Type":"TargetGroupConfig","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-targetgroup.html#cfn-vpclattice-targetgroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-targetgroup.html#cfn-vpclattice-targetgroup-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"Targets":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-targetgroup.html#cfn-vpclattice-targetgroup-targets","DuplicatesAllowed":true,"ItemType":"Target","Required":false,"Type":"List","UpdateType":"Mutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-vpclattice-targetgroup.html#cfn-vpclattice-targetgroup-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::WAF::ByteMatchSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-bytematchset.html","Properties":{"ByteMatchTuples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-bytematchset.html#cfn-waf-bytematchset-bytematchtuples","DuplicatesAllowed":false,"ItemType":"ByteMatchTuple","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-bytematchset.html#cfn-waf-bytematchset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::WAF::IPSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-ipset.html","Properties":{"IPSetDescriptors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-ipset.html#cfn-waf-ipset-ipsetdescriptors","DuplicatesAllowed":false,"ItemType":"IPSetDescriptor","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-ipset.html#cfn-waf-ipset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::WAF::Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-rule.html","Properties":{"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-rule.html#cfn-waf-rule-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-rule.html#cfn-waf-rule-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Predicates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-rule.html#cfn-waf-rule-predicates","DuplicatesAllowed":false,"ItemType":"Predicate","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAF::SizeConstraintSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-sizeconstraintset.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-sizeconstraintset.html#cfn-waf-sizeconstraintset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SizeConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-sizeconstraintset.html#cfn-waf-sizeconstraintset-sizeconstraints","DuplicatesAllowed":false,"ItemType":"SizeConstraint","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAF::SqlInjectionMatchSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-sqlinjectionmatchset.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-sqlinjectionmatchset.html#cfn-waf-sqlinjectionmatchset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SqlInjectionMatchTuples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-sqlinjectionmatchset.html#cfn-waf-sqlinjectionmatchset-sqlinjectionmatchtuples","DuplicatesAllowed":false,"ItemType":"SqlInjectionMatchTuple","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAF::WebACL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-webacl.html","Properties":{"DefaultAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-webacl.html#cfn-waf-webacl-defaultaction","Required":true,"Type":"WafAction","UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-webacl.html#cfn-waf-webacl-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-webacl.html#cfn-waf-webacl-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-webacl.html#cfn-waf-webacl-rules","DuplicatesAllowed":false,"ItemType":"ActivatedRule","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAF::XssMatchSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-xssmatchset.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-xssmatchset.html#cfn-waf-xssmatchset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"XssMatchTuples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-waf-xssmatchset.html#cfn-waf-xssmatchset-xssmatchtuples","DuplicatesAllowed":false,"ItemType":"XssMatchTuple","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFRegional::ByteMatchSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-bytematchset.html","Properties":{"ByteMatchTuples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-bytematchset.html#cfn-wafregional-bytematchset-bytematchtuples","ItemType":"ByteMatchTuple","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-bytematchset.html#cfn-wafregional-bytematchset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::WAFRegional::GeoMatchSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-geomatchset.html","Properties":{"GeoMatchConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-geomatchset.html#cfn-wafregional-geomatchset-geomatchconstraints","ItemType":"GeoMatchConstraint","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-geomatchset.html#cfn-wafregional-geomatchset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::WAFRegional::IPSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-ipset.html","Properties":{"IPSetDescriptors":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-ipset.html#cfn-wafregional-ipset-ipsetdescriptors","ItemType":"IPSetDescriptor","Required":false,"Type":"List","UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-ipset.html#cfn-wafregional-ipset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::WAFRegional::RateBasedRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-ratebasedrule.html","Properties":{"MatchPredicates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-ratebasedrule.html#cfn-wafregional-ratebasedrule-matchpredicates","ItemType":"Predicate","Required":false,"Type":"List","UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-ratebasedrule.html#cfn-wafregional-ratebasedrule-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-ratebasedrule.html#cfn-wafregional-ratebasedrule-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RateKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-ratebasedrule.html#cfn-wafregional-ratebasedrule-ratekey","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RateLimit":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-ratebasedrule.html#cfn-wafregional-ratebasedrule-ratelimit","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"}}},"AWS::WAFRegional::RegexPatternSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-regexpatternset.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-regexpatternset.html#cfn-wafregional-regexpatternset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RegexPatternStrings":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-regexpatternset.html#cfn-wafregional-regexpatternset-regexpatternstrings","PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFRegional::Rule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-rule.html","Properties":{"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-rule.html#cfn-wafregional-rule-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-rule.html#cfn-wafregional-rule-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Predicates":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-rule.html#cfn-wafregional-rule-predicates","ItemType":"Predicate","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFRegional::SizeConstraintSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-sizeconstraintset.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-sizeconstraintset.html#cfn-wafregional-sizeconstraintset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SizeConstraints":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-sizeconstraintset.html#cfn-wafregional-sizeconstraintset-sizeconstraints","ItemType":"SizeConstraint","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFRegional::SqlInjectionMatchSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-sqlinjectionmatchset.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-sqlinjectionmatchset.html#cfn-wafregional-sqlinjectionmatchset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"SqlInjectionMatchTuples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-sqlinjectionmatchset.html#cfn-wafregional-sqlinjectionmatchset-sqlinjectionmatchtuples","ItemType":"SqlInjectionMatchTuple","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFRegional::WebACL":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-webacl.html","Properties":{"DefaultAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-webacl.html#cfn-wafregional-webacl-defaultaction","Required":true,"Type":"Action","UpdateType":"Mutable"},"MetricName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-webacl.html#cfn-wafregional-webacl-metricname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-webacl.html#cfn-wafregional-webacl-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-webacl.html#cfn-wafregional-webacl-rules","ItemType":"Rule","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFRegional::WebACLAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-webaclassociation.html","Properties":{"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-webaclassociation.html#cfn-wafregional-webaclassociation-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WebACLId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-webaclassociation.html#cfn-wafregional-webaclassociation-webaclid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::WAFRegional::XssMatchSet":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-xssmatchset.html","Properties":{"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-xssmatchset.html#cfn-wafregional-xssmatchset-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"XssMatchTuples":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafregional-xssmatchset.html#cfn-wafregional-xssmatchset-xssmatchtuples","ItemType":"XssMatchTuple","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::IPSet":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-ipset.html","Properties":{"Addresses":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-ipset.html#cfn-wafv2-ipset-addresses","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-ipset.html#cfn-wafv2-ipset-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"IPAddressVersion":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-ipset.html#cfn-wafv2-ipset-ipaddressversion","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-ipset.html#cfn-wafv2-ipset-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-ipset.html#cfn-wafv2-ipset-scope","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-ipset.html#cfn-wafv2-ipset-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::LoggingConfiguration":{"Attributes":{"ManagedByFirewallManager":{"PrimitiveType":"Boolean"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-loggingconfiguration.html","Properties":{"LogDestinationConfigs":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-loggingconfiguration.html#cfn-wafv2-loggingconfiguration-logdestinationconfigs","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"LoggingFilter":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-loggingconfiguration.html#cfn-wafv2-loggingconfiguration-loggingfilter","PrimitiveType":"Json","Required":false,"UpdateType":"Mutable"},"RedactedFields":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-loggingconfiguration.html#cfn-wafv2-loggingconfiguration-redactedfields","DuplicatesAllowed":true,"ItemType":"FieldToMatch","Required":false,"Type":"List","UpdateType":"Mutable"},"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-loggingconfiguration.html#cfn-wafv2-loggingconfiguration-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::WAFv2::RegexPatternSet":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-regexpatternset.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-regexpatternset.html#cfn-wafv2-regexpatternset-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-regexpatternset.html#cfn-wafv2-regexpatternset-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"RegularExpressionList":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-regexpatternset.html#cfn-wafv2-regexpatternset-regularexpressionlist","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":true,"Type":"List","UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-regexpatternset.html#cfn-wafv2-regexpatternset-scope","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-regexpatternset.html#cfn-wafv2-regexpatternset-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::WAFv2::RuleGroup":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Id":{"PrimitiveType":"String"},"LabelNamespace":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-rulegroup.html","Properties":{"AvailableLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-rulegroup.html#cfn-wafv2-rulegroup-availablelabels","DuplicatesAllowed":true,"ItemType":"LabelSummary","Required":false,"Type":"List","UpdateType":"Mutable"},"Capacity":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-rulegroup.html#cfn-wafv2-rulegroup-capacity","PrimitiveType":"Integer","Required":true,"UpdateType":"Mutable"},"ConsumedLabels":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-rulegroup.html#cfn-wafv2-rulegroup-consumedlabels","DuplicatesAllowed":true,"ItemType":"LabelSummary","Required":false,"Type":"List","UpdateType":"Mutable"},"CustomResponseBodies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-rulegroup.html#cfn-wafv2-rulegroup-customresponsebodies","ItemType":"CustomResponseBody","Required":false,"Type":"Map","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-rulegroup.html#cfn-wafv2-rulegroup-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-rulegroup.html#cfn-wafv2-rulegroup-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-rulegroup.html#cfn-wafv2-rulegroup-rules","DuplicatesAllowed":true,"ItemType":"Rule","Required":false,"Type":"List","UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-rulegroup.html#cfn-wafv2-rulegroup-scope","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-rulegroup.html#cfn-wafv2-rulegroup-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"VisibilityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-rulegroup.html#cfn-wafv2-rulegroup-visibilityconfig","Required":true,"Type":"VisibilityConfig","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACL":{"Attributes":{"Arn":{"PrimitiveType":"String"},"Capacity":{"PrimitiveType":"Integer"},"Id":{"PrimitiveType":"String"},"LabelNamespace":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html","Properties":{"AssociationConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-associationconfig","Required":false,"Type":"AssociationConfig","UpdateType":"Mutable"},"CaptchaConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-captchaconfig","Required":false,"Type":"CaptchaConfig","UpdateType":"Mutable"},"ChallengeConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-challengeconfig","Required":false,"Type":"ChallengeConfig","UpdateType":"Mutable"},"CustomResponseBodies":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-customresponsebodies","ItemType":"CustomResponseBody","Required":false,"Type":"Map","UpdateType":"Mutable"},"DefaultAction":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-defaultaction","Required":true,"Type":"DefaultAction","UpdateType":"Mutable"},"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-description","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-name","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Rules":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-rules","DuplicatesAllowed":true,"ItemType":"Rule","Required":false,"Type":"List","UpdateType":"Mutable"},"Scope":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-scope","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"TokenDomains":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-tokendomains","DuplicatesAllowed":true,"PrimitiveItemType":"String","Required":false,"Type":"List","UpdateType":"Mutable"},"VisibilityConfig":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webacl.html#cfn-wafv2-webacl-visibilityconfig","Required":true,"Type":"VisibilityConfig","UpdateType":"Mutable"}}},"AWS::WAFv2::WebACLAssociation":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webaclassociation.html","Properties":{"ResourceArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webaclassociation.html#cfn-wafv2-webaclassociation-resourcearn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"WebACLArn":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wafv2-webaclassociation.html#cfn-wafv2-webaclassociation-webaclarn","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Wisdom::Assistant":{"Attributes":{"AssistantArn":{"PrimitiveType":"String"},"AssistantId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-assistant.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-assistant.html#cfn-wisdom-assistant-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-assistant.html#cfn-wisdom-assistant-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"ServerSideEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-assistant.html#cfn-wisdom-assistant-serversideencryptionconfiguration","Required":false,"Type":"ServerSideEncryptionConfiguration","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-assistant.html#cfn-wisdom-assistant-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"},"Type":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-assistant.html#cfn-wisdom-assistant-type","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::Wisdom::AssistantAssociation":{"Attributes":{"AssistantArn":{"PrimitiveType":"String"},"AssistantAssociationArn":{"PrimitiveType":"String"},"AssistantAssociationId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-assistantassociation.html","Properties":{"AssistantId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-assistantassociation.html#cfn-wisdom-assistantassociation-assistantid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Association":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-assistantassociation.html#cfn-wisdom-assistantassociation-association","Required":true,"Type":"AssociationData","UpdateType":"Immutable"},"AssociationType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-assistantassociation.html#cfn-wisdom-assistantassociation-associationtype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-assistantassociation.html#cfn-wisdom-assistantassociation-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::Wisdom::KnowledgeBase":{"Attributes":{"KnowledgeBaseArn":{"PrimitiveType":"String"},"KnowledgeBaseId":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-knowledgebase.html","Properties":{"Description":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-knowledgebase.html#cfn-wisdom-knowledgebase-description","PrimitiveType":"String","Required":false,"UpdateType":"Immutable"},"KnowledgeBaseType":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-knowledgebase.html#cfn-wisdom-knowledgebase-knowledgebasetype","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Name":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-knowledgebase.html#cfn-wisdom-knowledgebase-name","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"RenderingConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-knowledgebase.html#cfn-wisdom-knowledgebase-renderingconfiguration","Required":false,"Type":"RenderingConfiguration","UpdateType":"Mutable"},"ServerSideEncryptionConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-knowledgebase.html#cfn-wisdom-knowledgebase-serversideencryptionconfiguration","Required":false,"Type":"ServerSideEncryptionConfiguration","UpdateType":"Immutable"},"SourceConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-knowledgebase.html#cfn-wisdom-knowledgebase-sourceconfiguration","Required":false,"Type":"SourceConfiguration","UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-wisdom-knowledgebase.html#cfn-wisdom-knowledgebase-tags","DuplicatesAllowed":false,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::WorkSpaces::ConnectionAlias":{"Attributes":{"AliasId":{"PrimitiveType":"String"},"Associations":{"ItemType":"ConnectionAliasAssociation","Type":"List"},"ConnectionAliasState":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-connectionalias.html","Properties":{"ConnectionString":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-connectionalias.html#cfn-workspaces-connectionalias-connectionstring","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-connectionalias.html#cfn-workspaces-connectionalias-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Immutable"}}},"AWS::WorkSpaces::Workspace":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-workspace.html","Properties":{"BundleId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-workspace.html#cfn-workspaces-workspace-bundleid","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"},"DirectoryId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-workspace.html#cfn-workspaces-workspace-directoryid","PrimitiveType":"String","Required":true,"UpdateType":"Conditional"},"RootVolumeEncryptionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-workspace.html#cfn-workspaces-workspace-rootvolumeencryptionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Conditional"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-workspace.html#cfn-workspaces-workspace-tags","DuplicatesAllowed":true,"ItemType":"Tag","Required":false,"Type":"List","UpdateType":"Mutable"},"UserName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-workspace.html#cfn-workspaces-workspace-username","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"},"UserVolumeEncryptionEnabled":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-workspace.html#cfn-workspaces-workspace-uservolumeencryptionenabled","PrimitiveType":"Boolean","Required":false,"UpdateType":"Conditional"},"VolumeEncryptionKey":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-workspace.html#cfn-workspaces-workspace-volumeencryptionkey","PrimitiveType":"String","Required":false,"UpdateType":"Conditional"},"WorkspaceProperties":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspaces-workspace.html#cfn-workspaces-workspace-workspaceproperties","Required":false,"Type":"WorkspaceProperties","UpdateType":"Mutable"}}},"AWS::XRay::Group":{"Attributes":{"GroupARN":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-group.html","Properties":{"FilterExpression":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-group.html#cfn-xray-group-filterexpression","PrimitiveType":"String","Required":false,"UpdateType":"Mutable"},"GroupName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-group.html#cfn-xray-group-groupname","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"InsightsConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-group.html#cfn-xray-group-insightsconfiguration","Required":false,"Type":"InsightsConfiguration","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-group.html#cfn-xray-group-tags","DuplicatesAllowed":true,"PrimitiveItemType":"Json","Required":false,"Type":"List","UpdateType":"Mutable"}}},"AWS::XRay::ResourcePolicy":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-resourcepolicy.html","Properties":{"BypassPolicyLockoutCheck":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-resourcepolicy.html#cfn-xray-resourcepolicy-bypasspolicylockoutcheck","PrimitiveType":"Boolean","Required":false,"UpdateType":"Mutable"},"PolicyDocument":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-resourcepolicy.html#cfn-xray-resourcepolicy-policydocument","PrimitiveType":"String","Required":true,"UpdateType":"Mutable"},"PolicyName":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-resourcepolicy.html#cfn-xray-resourcepolicy-policyname","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}},"AWS::XRay::SamplingRule":{"Attributes":{"RuleARN":{"PrimitiveType":"String"}},"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-samplingrule.html","Properties":{"SamplingRule":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-samplingrule.html#cfn-xray-samplingrule-samplingrule","Required":false,"Type":"SamplingRule","UpdateType":"Mutable"},"Tags":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-xray-samplingrule.html#cfn-xray-samplingrule-tags","DuplicatesAllowed":true,"PrimitiveItemType":"Json","Required":false,"Type":"List","UpdateType":"Mutable"}}},"Alexa::ASK::Skill":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ask-skill.html","Properties":{"AuthenticationConfiguration":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ask-skill.html#cfn-ask-skill-authenticationconfiguration","Required":true,"Type":"AuthenticationConfiguration","UpdateType":"Mutable"},"SkillPackage":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ask-skill.html#cfn-ask-skill-skillpackage","Required":true,"Type":"SkillPackage","UpdateType":"Mutable"},"VendorId":{"Documentation":"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ask-skill.html#cfn-ask-skill-vendorid","PrimitiveType":"String","Required":true,"UpdateType":"Immutable"}}}}}'); /***/ }), @@ -91264,7 +91994,7 @@ module.exports = JSON.parse('{"$ref":"#/definitions/AssetManifest","definitions" /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"$ref":"#/definitions/AssemblyManifest","definitions":{"AssemblyManifest":{"description":"A manifest which describes the cloud assembly.","type":"object","properties":{"version":{"description":"Protocol version","type":"string"},"artifacts":{"description":"The set of artifacts in this assembly. (Default - no artifacts.)","type":"object","additionalProperties":{"$ref":"#/definitions/ArtifactManifest"}},"missing":{"description":"Missing context information. If this field has values, it means that the\\ncloud assembly is not complete and should not be deployed. (Default - no missing context.)","type":"array","items":{"$ref":"#/definitions/MissingContext"}},"runtime":{"description":"Runtime information. (Default - no info.)","$ref":"#/definitions/RuntimeInfo"}},"required":["version"]},"ArtifactManifest":{"description":"A manifest for a single artifact within the cloud assembly.","type":"object","properties":{"type":{"$ref":"#/definitions/ArtifactType","description":"The type of artifact."},"environment":{"description":"The environment into which this artifact is deployed. (Default - no envrionment.)","type":"string"},"metadata":{"description":"Associated metadata. (Default - no metadata.)","type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/definitions/MetadataEntry"}}},"dependencies":{"description":"IDs of artifacts that must be deployed before this artifact. (Default - no dependencies.)","type":"array","items":{"type":"string"}},"properties":{"description":"The set of properties for this artifact (depends on type) (Default - no properties.)","anyOf":[{"$ref":"#/definitions/AwsCloudFormationStackProperties"},{"$ref":"#/definitions/AssetManifestProperties"},{"$ref":"#/definitions/TreeArtifactProperties"},{"$ref":"#/definitions/NestedCloudAssemblyProperties"}]},"displayName":{"description":"A string that represents this artifact. Should only be used in user interfaces. (Default - no display name)","type":"string"}},"required":["type"]},"ArtifactType":{"description":"Type of cloud artifact.","enum":["aws:cloudformation:stack","cdk:asset-manifest","cdk:cloud-assembly","cdk:tree","none"],"type":"string"},"MetadataEntry":{"description":"A metadata entry in a cloud assembly artifact.","type":"object","properties":{"type":{"description":"The type of the metadata entry.","type":"string"},"data":{"description":"The data. (Default - no data.)","anyOf":[{"$ref":"#/definitions/FileAssetMetadataEntry"},{"$ref":"#/definitions/ContainerImageAssetMetadataEntry"},{"type":"array","items":{"$ref":"#/definitions/Tag"}},{"type":"string"},{"description":"Free form data."}]},"trace":{"description":"A stack trace for when the entry was created. (Default - no trace.)","type":"array","items":{"type":"string"}}},"required":["type"]},"FileAssetMetadataEntry":{"description":"Metadata Entry spec for files.","type":"object","properties":{"packaging":{"description":"Requested packaging style","enum":["file","zip"],"type":"string"},"s3BucketParameter":{"description":"Name of parameter where S3 bucket should be passed in","type":"string"},"s3KeyParameter":{"description":"Name of parameter where S3 key should be passed in","type":"string"},"artifactHashParameter":{"description":"The name of the parameter where the hash of the bundled asset should be passed in.","type":"string"},"id":{"description":"Logical identifier for the asset","type":"string"},"sourceHash":{"description":"The hash of the asset source.","type":"string"},"path":{"description":"Path on disk to the asset","type":"string"}},"required":["artifactHashParameter","id","packaging","path","s3BucketParameter","s3KeyParameter","sourceHash"]},"ContainerImageAssetMetadataEntry":{"description":"Metadata Entry spec for container images.","type":"object","properties":{"packaging":{"description":"Type of asset","type":"string","const":"container-image"},"imageNameParameter":{"description":"ECR Repository name and repo digest (separated by \\"@sha256:\\") where this\\nimage is stored. (Default undefined If not specified, `repositoryName` and `imageTag` are\\nrequired because otherwise how will the stack know where to find the asset,\\nha?)","type":"string"},"repositoryName":{"description":"ECR repository name, if omitted a default name based on the asset\'s ID is\\nused instead. Specify this property if you need to statically address the\\nimage, e.g. from a Kubernetes Pod. Note, this is only the repository name,\\nwithout the registry and the tag parts. (Default - this parameter is REQUIRED after 1.21.0)","type":"string"},"imageTag":{"description":"The docker image tag to use for tagging pushed images. This field is\\nrequired if `imageParameterName` is ommited (otherwise, the app won\'t be\\nable to find the image). (Default - this parameter is REQUIRED after 1.21.0)","type":"string"},"buildArgs":{"description":"Build args to pass to the `docker build` command (Default no build args are passed)","type":"object","additionalProperties":{"type":"string"}},"buildSsh":{"description":"SSH agent socket or keys to pass to the `docker build` command (Default no ssh arg is passed)","type":"string"},"buildSecrets":{"description":"Build secrets to pass to the `docker build` command (Default no build secrets are passed)","type":"object","additionalProperties":{"type":"string"}},"target":{"description":"Docker target to build to (Default no build target)","type":"string"},"file":{"description":"Path to the Dockerfile (relative to the directory). (Default - no file is passed)","type":"string"},"networkMode":{"description":"Networking mode for the RUN commands during build. (Default - no networking mode specified)","type":"string"},"platform":{"description":"Platform to build for. _Requires Docker Buildx_. (Default - current machine platform)","type":"string"},"outputs":{"description":"Outputs to pass to the `docker build` command. (Default - no outputs are passed to the build command (default outputs are used))","type":"array","items":{"type":"string"}},"cacheFrom":{"description":"Cache from options to pass to the `docker build` command. (Default - no cache from options are passed to the build command)","type":"array","items":{"$ref":"#/definitions/ContainerImageAssetCacheOption"}},"cacheTo":{"description":"Cache to options to pass to the `docker build` command. (Default - no cache to options are passed to the build command)","$ref":"#/definitions/ContainerImageAssetCacheOption"},"id":{"description":"Logical identifier for the asset","type":"string"},"sourceHash":{"description":"The hash of the asset source.","type":"string"},"path":{"description":"Path on disk to the asset","type":"string"}},"required":["id","packaging","path","sourceHash"]},"ContainerImageAssetCacheOption":{"description":"Options for configuring the Docker cache backend","type":"object","properties":{"type":{"description":"The type of cache to use.\\nRefer to https://docs.docker.com/build/cache/backends/ for full list of backends. (Default - unspecified)","type":"string"},"params":{"description":"Any parameters to pass into the docker cache backend configuration.\\nRefer to https://docs.docker.com/build/cache/backends/ for cache backend configuration. (Default {} No options provided)","type":"object","additionalProperties":{"type":"string"}}},"required":["type"]},"Tag":{"description":"Metadata Entry spec for stack tag.","type":"object","properties":{"key":{"description":"Tag key.\\n\\n(In the actual file on disk this will be cased as \\"Key\\", and the structure is\\npatched to match this structure upon loading:\\nhttps://github.com/aws/aws-cdk/blob/4aadaa779b48f35838cccd4e25107b2338f05547/packages/%40aws-cdk/cloud-assembly-schema/lib/manifest.ts#L137)","type":"string"},"value":{"description":"Tag value.\\n\\n(In the actual file on disk this will be cased as \\"Value\\", and the structure is\\npatched to match this structure upon loading:\\nhttps://github.com/aws/aws-cdk/blob/4aadaa779b48f35838cccd4e25107b2338f05547/packages/%40aws-cdk/cloud-assembly-schema/lib/manifest.ts#L137)","type":"string"}},"required":["key","value"]},"AwsCloudFormationStackProperties":{"description":"Artifact properties for CloudFormation stacks.","type":"object","properties":{"templateFile":{"description":"A file relative to the assembly root which contains the CloudFormation template for this stack.","type":"string"},"parameters":{"description":"Values for CloudFormation stack parameters that should be passed when the stack is deployed. (Default - No parameters)","type":"object","additionalProperties":{"type":"string"}},"tags":{"description":"Values for CloudFormation stack tags that should be passed when the stack is deployed. (Default - No tags)","type":"object","additionalProperties":{"type":"string"}},"stackName":{"description":"The name to use for the CloudFormation stack. (Default - name derived from artifact ID)","type":"string"},"terminationProtection":{"description":"Whether to enable termination protection for this stack.","default":false,"type":"boolean"},"assumeRoleArn":{"description":"The role that needs to be assumed to deploy the stack (Default - No role is assumed (current credentials are used))","type":"string"},"assumeRoleExternalId":{"description":"External ID to use when assuming role for cloudformation deployments (Default - No external ID)","type":"string"},"cloudFormationExecutionRoleArn":{"description":"The role that is passed to CloudFormation to execute the change set (Default - No role is passed (currently assumed role/credentials are used))","type":"string"},"lookupRole":{"description":"The role to use to look up values from the target AWS account (Default - No role is assumed (current credentials are used))","$ref":"#/definitions/BootstrapRole"},"stackTemplateAssetObjectUrl":{"description":"If the stack template has already been included in the asset manifest, its asset URL (Default - Not uploaded yet, upload just before deploying)","type":"string"},"requiresBootstrapStackVersion":{"description":"Version of bootstrap stack required to deploy this stack (Default - No bootstrap stack required)","type":"number"},"bootstrapStackVersionSsmParameter":{"description":"SSM parameter where the bootstrap stack version number can be found\\n\\nOnly used if `requiresBootstrapStackVersion` is set.\\n\\n- If this value is not set, the bootstrap stack name must be known at\\n deployment time so the stack version can be looked up from the stack\\n outputs.\\n- If this value is set, the bootstrap stack can have any name because\\n we won\'t need to look it up. (Default - Bootstrap stack version number looked up)","type":"string"},"validateOnSynth":{"description":"Whether this stack should be validated by the CLI after synthesis (Default - false)","type":"boolean"}},"required":["templateFile"]},"BootstrapRole":{"description":"Information needed to access an IAM role created\\nas part of the bootstrap process","type":"object","properties":{"arn":{"description":"The ARN of the IAM role created as part of bootrapping\\ne.g. lookupRoleArn","type":"string"},"assumeRoleExternalId":{"description":"External ID to use when assuming the bootstrap role (Default - No external ID)","type":"string"},"requiresBootstrapStackVersion":{"description":"Version of bootstrap stack required to use this role (Default - No bootstrap stack required)","type":"number"},"bootstrapStackVersionSsmParameter":{"description":"Name of SSM parameter with bootstrap stack version (Default - Discover SSM parameter by reading stack)","type":"string"}},"required":["arn"]},"AssetManifestProperties":{"description":"Artifact properties for the Asset Manifest","type":"object","properties":{"file":{"description":"Filename of the asset manifest","type":"string"},"requiresBootstrapStackVersion":{"description":"Version of bootstrap stack required to deploy this stack (Default - Version 1 (basic modern bootstrap stack))","type":"number"},"bootstrapStackVersionSsmParameter":{"description":"SSM parameter where the bootstrap stack version number can be found\\n\\n- If this value is not set, the bootstrap stack name must be known at\\n deployment time so the stack version can be looked up from the stack\\n outputs.\\n- If this value is set, the bootstrap stack can have any name because\\n we won\'t need to look it up. (Default - Bootstrap stack version number looked up)","type":"string"}},"required":["file"]},"TreeArtifactProperties":{"description":"Artifact properties for the Construct Tree Artifact","type":"object","properties":{"file":{"description":"Filename of the tree artifact","type":"string"}},"required":["file"]},"NestedCloudAssemblyProperties":{"description":"Artifact properties for nested cloud assemblies","type":"object","properties":{"directoryName":{"description":"Relative path to the nested cloud assembly","type":"string"},"displayName":{"description":"Display name for the cloud assembly (Default - The artifact ID)","type":"string"}},"required":["directoryName"]},"MissingContext":{"description":"Represents a missing piece of context.","type":"object","properties":{"key":{"description":"The missing context key.","type":"string"},"provider":{"$ref":"#/definitions/ContextProvider","description":"The provider from which we expect this context key to be obtained."},"props":{"$ref":"#/definitions/ContextQueryProperties","description":"A set of provider-specific options."}},"required":["key","props","provider"]},"ContextProvider":{"description":"Identifier for the context provider","enum":["ami","availability-zones","endpoint-service-availability-zones","hosted-zone","key-provider","load-balancer","load-balancer-listener","plugin","security-group","ssm","vpc-provider"],"type":"string"},"ContextQueryProperties":{"anyOf":[{"$ref":"#/definitions/AmiContextQuery"},{"$ref":"#/definitions/AvailabilityZonesContextQuery"},{"$ref":"#/definitions/HostedZoneContextQuery"},{"$ref":"#/definitions/SSMParameterContextQuery"},{"$ref":"#/definitions/VpcContextQuery"},{"$ref":"#/definitions/EndpointServiceAvailabilityZonesContextQuery"},{"$ref":"#/definitions/LoadBalancerContextQuery"},{"$ref":"#/definitions/LoadBalancerListenerContextQuery"},{"$ref":"#/definitions/SecurityGroupContextQuery"},{"$ref":"#/definitions/KeyContextQuery"},{"$ref":"#/definitions/PluginContextQuery"}]},"AmiContextQuery":{"description":"Query to AMI context provider","type":"object","properties":{"account":{"description":"Account to query","type":"string"},"region":{"description":"Region to query","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"owners":{"description":"Owners to DescribeImages call (Default - All owners)","type":"array","items":{"type":"string"}},"filters":{"description":"Filters to DescribeImages call","type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["account","filters","region"]},"AvailabilityZonesContextQuery":{"description":"Query to availability zone context provider","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"}},"required":["account","region"]},"HostedZoneContextQuery":{"description":"Query to hosted zone context provider","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"domainName":{"description":"The domain name e.g. example.com to lookup","type":"string"},"privateZone":{"description":"True if the zone you want to find is a private hosted zone","default":false,"type":"boolean"},"vpcId":{"description":"The VPC ID to that the private zone must be associated with\\n\\nIf you provide VPC ID and privateZone is false, this will return no results\\nand raise an error. (Default - Required if privateZone=true)","type":"string"}},"required":["account","domainName","region"]},"SSMParameterContextQuery":{"description":"Query to SSM Parameter Context Provider","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"parameterName":{"description":"Parameter name to query","type":"string"}},"required":["account","parameterName","region"]},"VpcContextQuery":{"description":"Query input for looking up a VPC","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"filter":{"description":"Filters to apply to the VPC\\n\\nFilter parameters are the same as passed to DescribeVpcs.","type":"object","additionalProperties":{"type":"string"}},"returnAsymmetricSubnets":{"description":"Whether to populate the subnetGroups field of the `VpcContextResponse`,\\nwhich contains potentially asymmetric subnet groups.","default":false,"type":"boolean"},"subnetGroupNameTag":{"description":"Optional tag for subnet group name.\\nIf not provided, we\'ll look at the aws-cdk:subnet-name tag.\\nIf the subnet does not have the specified tag,\\nwe\'ll use its type as the name. (Default \'aws-cdk:subnet-name\')","type":"string"},"returnVpnGateways":{"description":"Whether to populate the `vpnGatewayId` field of the `VpcContextResponse`,\\nwhich contains the VPN Gateway ID, if one exists. You can explicitly\\ndisable this in order to avoid the lookup if you know the VPC does not have\\na VPN Gatway attached. (Default true)","type":"boolean"}},"required":["account","filter","region"]},"EndpointServiceAvailabilityZonesContextQuery":{"description":"Query to endpoint service context provider","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"serviceName":{"description":"Query service name","type":"string"}},"required":["account","region","serviceName"]},"LoadBalancerContextQuery":{"description":"Query input for looking up a load balancer","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"loadBalancerType":{"$ref":"#/definitions/LoadBalancerType","description":"Filter load balancers by their type"},"loadBalancerArn":{"description":"Find by load balancer\'s ARN (Default - does not search by load balancer arn)","type":"string"},"loadBalancerTags":{"description":"Match load balancer tags (Default - does not match load balancers by tags)","type":"array","items":{"$ref":"#/definitions/Tag"}}},"required":["account","loadBalancerType","region"]},"LoadBalancerType":{"description":"Type of load balancer","enum":["application","network"],"type":"string"},"LoadBalancerListenerContextQuery":{"description":"Query input for looking up a load balancer listener","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"listenerArn":{"description":"Find by listener\'s arn (Default - does not find by listener arn)","type":"string"},"listenerProtocol":{"description":"Filter by listener protocol (Default - does not filter by listener protocol)","enum":["HTTP","HTTPS","TCP","TCP_UDP","TLS","UDP"],"type":"string"},"listenerPort":{"description":"Filter listeners by listener port (Default - does not filter by a listener port)","type":"number"},"loadBalancerType":{"$ref":"#/definitions/LoadBalancerType","description":"Filter load balancers by their type"},"loadBalancerArn":{"description":"Find by load balancer\'s ARN (Default - does not search by load balancer arn)","type":"string"},"loadBalancerTags":{"description":"Match load balancer tags (Default - does not match load balancers by tags)","type":"array","items":{"$ref":"#/definitions/Tag"}}},"required":["account","loadBalancerType","region"]},"SecurityGroupContextQuery":{"description":"Query input for looking up a security group","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"securityGroupId":{"description":"Security group id (Default - None)","type":"string"},"securityGroupName":{"description":"Security group name (Default - None)","type":"string"},"vpcId":{"description":"VPC ID (Default - None)","type":"string"}},"required":["account","region"]},"KeyContextQuery":{"description":"Query input for looking up a KMS Key","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"aliasName":{"description":"Alias name used to search the Key","type":"string"}},"required":["account","aliasName","region"]},"PluginContextQuery":{"description":"Query input for plugins\\n\\nThis alternate branch is necessary because it needs to be able to escape all type checking\\nwe do on on the cloud assembly -- we cannot know the properties that will be used a priori.","type":"object","additionalProperties":{},"properties":{"pluginName":{"description":"The name of the plugin","type":"string"}},"required":["pluginName"]},"RuntimeInfo":{"description":"Information about the application\'s runtime components.","type":"object","properties":{"libraries":{"description":"The list of libraries loaded in the application, associated with their versions.","type":"object","additionalProperties":{"type":"string"}}},"required":["libraries"]}},"$schema":"http://json-schema.org/draft-07/schema#"}'); +module.exports = JSON.parse('{"$ref":"#/definitions/AssemblyManifest","definitions":{"AssemblyManifest":{"description":"A manifest which describes the cloud assembly.","type":"object","properties":{"version":{"description":"Protocol version","type":"string"},"artifacts":{"description":"The set of artifacts in this assembly. (Default - no artifacts.)","type":"object","additionalProperties":{"$ref":"#/definitions/ArtifactManifest"}},"missing":{"description":"Missing context information. If this field has values, it means that the\\ncloud assembly is not complete and should not be deployed. (Default - no missing context.)","type":"array","items":{"$ref":"#/definitions/MissingContext"}},"runtime":{"description":"Runtime information. (Default - no info.)","$ref":"#/definitions/RuntimeInfo"}},"required":["version"]},"ArtifactManifest":{"description":"A manifest for a single artifact within the cloud assembly.","type":"object","properties":{"type":{"$ref":"#/definitions/ArtifactType","description":"The type of artifact."},"environment":{"description":"The environment into which this artifact is deployed. (Default - no envrionment.)","type":"string"},"metadata":{"description":"Associated metadata. (Default - no metadata.)","type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/definitions/MetadataEntry"}}},"dependencies":{"description":"IDs of artifacts that must be deployed before this artifact. (Default - no dependencies.)","type":"array","items":{"type":"string"}},"properties":{"description":"The set of properties for this artifact (depends on type) (Default - no properties.)","anyOf":[{"$ref":"#/definitions/AwsCloudFormationStackProperties"},{"$ref":"#/definitions/AssetManifestProperties"},{"$ref":"#/definitions/TreeArtifactProperties"},{"$ref":"#/definitions/NestedCloudAssemblyProperties"}]},"displayName":{"description":"A string that represents this artifact. Should only be used in user interfaces. (Default - no display name)","type":"string"}},"required":["type"]},"ArtifactType":{"description":"Type of cloud artifact.","type":"string","enum":["none","aws:cloudformation:stack","cdk:tree","cdk:asset-manifest","cdk:cloud-assembly"]},"MetadataEntry":{"description":"A metadata entry in a cloud assembly artifact.","type":"object","properties":{"type":{"description":"The type of the metadata entry.","type":"string"},"data":{"description":"The data. (Default - no data.)","anyOf":[{"$ref":"#/definitions/FileAssetMetadataEntry"},{"$ref":"#/definitions/ContainerImageAssetMetadataEntry"},{"type":"array","items":{"$ref":"#/definitions/Tag"}},{"type":"string"},{"description":"Free form data."}]},"trace":{"description":"A stack trace for when the entry was created. (Default - no trace.)","type":"array","items":{"type":"string"}}},"required":["type"]},"FileAssetMetadataEntry":{"description":"Metadata Entry spec for files.","type":"object","properties":{"packaging":{"description":"Requested packaging style","enum":["file","zip"],"type":"string"},"s3BucketParameter":{"description":"Name of parameter where S3 bucket should be passed in","type":"string"},"s3KeyParameter":{"description":"Name of parameter where S3 key should be passed in","type":"string"},"artifactHashParameter":{"description":"The name of the parameter where the hash of the bundled asset should be passed in.","type":"string"},"id":{"description":"Logical identifier for the asset","type":"string"},"sourceHash":{"description":"The hash of the asset source.","type":"string"},"path":{"description":"Path on disk to the asset","type":"string"}},"required":["artifactHashParameter","id","packaging","path","s3BucketParameter","s3KeyParameter","sourceHash"]},"ContainerImageAssetMetadataEntry":{"description":"Metadata Entry spec for container images.","type":"object","properties":{"packaging":{"description":"Type of asset","type":"string","const":"container-image"},"imageNameParameter":{"description":"ECR Repository name and repo digest (separated by \\"@sha256:\\") where this\\nimage is stored. (Default undefined If not specified, `repositoryName` and `imageTag` are\\nrequired because otherwise how will the stack know where to find the asset,\\nha?)","type":"string"},"repositoryName":{"description":"ECR repository name, if omitted a default name based on the asset\'s ID is\\nused instead. Specify this property if you need to statically address the\\nimage, e.g. from a Kubernetes Pod. Note, this is only the repository name,\\nwithout the registry and the tag parts. (Default - this parameter is REQUIRED after 1.21.0)","type":"string"},"imageTag":{"description":"The docker image tag to use for tagging pushed images. This field is\\nrequired if `imageParameterName` is ommited (otherwise, the app won\'t be\\nable to find the image). (Default - this parameter is REQUIRED after 1.21.0)","type":"string"},"buildArgs":{"description":"Build args to pass to the `docker build` command (Default no build args are passed)","type":"object","additionalProperties":{"type":"string"}},"buildSsh":{"description":"SSH agent socket or keys to pass to the `docker build` command (Default no ssh arg is passed)","type":"string"},"buildSecrets":{"description":"Build secrets to pass to the `docker build` command (Default no build secrets are passed)","type":"object","additionalProperties":{"type":"string"}},"target":{"description":"Docker target to build to (Default no build target)","type":"string"},"file":{"description":"Path to the Dockerfile (relative to the directory). (Default - no file is passed)","type":"string"},"networkMode":{"description":"Networking mode for the RUN commands during build. (Default - no networking mode specified)","type":"string"},"platform":{"description":"Platform to build for. _Requires Docker Buildx_. (Default - current machine platform)","type":"string"},"outputs":{"description":"Outputs to pass to the `docker build` command. (Default - no outputs are passed to the build command (default outputs are used))","type":"array","items":{"type":"string"}},"cacheFrom":{"description":"Cache from options to pass to the `docker build` command. (Default - no cache from options are passed to the build command)","type":"array","items":{"$ref":"#/definitions/ContainerImageAssetCacheOption"}},"cacheTo":{"description":"Cache to options to pass to the `docker build` command. (Default - no cache to options are passed to the build command)","$ref":"#/definitions/ContainerImageAssetCacheOption"},"id":{"description":"Logical identifier for the asset","type":"string"},"sourceHash":{"description":"The hash of the asset source.","type":"string"},"path":{"description":"Path on disk to the asset","type":"string"}},"required":["id","packaging","path","sourceHash"]},"ContainerImageAssetCacheOption":{"description":"Options for configuring the Docker cache backend","type":"object","properties":{"type":{"description":"The type of cache to use.\\nRefer to https://docs.docker.com/build/cache/backends/ for full list of backends. (Default - unspecified)","type":"string"},"params":{"description":"Any parameters to pass into the docker cache backend configuration.\\nRefer to https://docs.docker.com/build/cache/backends/ for cache backend configuration. (Default {} No options provided)","type":"object","additionalProperties":{"type":"string"}}},"required":["type"]},"Tag":{"description":"Metadata Entry spec for stack tag.","type":"object","properties":{"key":{"description":"Tag key.\\n\\n(In the actual file on disk this will be cased as \\"Key\\", and the structure is\\npatched to match this structure upon loading:\\nhttps://github.com/aws/aws-cdk/blob/4aadaa779b48f35838cccd4e25107b2338f05547/packages/%40aws-cdk/cloud-assembly-schema/lib/manifest.ts#L137)","type":"string"},"value":{"description":"Tag value.\\n\\n(In the actual file on disk this will be cased as \\"Value\\", and the structure is\\npatched to match this structure upon loading:\\nhttps://github.com/aws/aws-cdk/blob/4aadaa779b48f35838cccd4e25107b2338f05547/packages/%40aws-cdk/cloud-assembly-schema/lib/manifest.ts#L137)","type":"string"}},"required":["key","value"]},"AwsCloudFormationStackProperties":{"description":"Artifact properties for CloudFormation stacks.","type":"object","properties":{"templateFile":{"description":"A file relative to the assembly root which contains the CloudFormation template for this stack.","type":"string"},"parameters":{"description":"Values for CloudFormation stack parameters that should be passed when the stack is deployed. (Default - No parameters)","type":"object","additionalProperties":{"type":"string"}},"tags":{"description":"Values for CloudFormation stack tags that should be passed when the stack is deployed. (Default - No tags)","type":"object","additionalProperties":{"type":"string"}},"stackName":{"description":"The name to use for the CloudFormation stack. (Default - name derived from artifact ID)","type":"string"},"terminationProtection":{"description":"Whether to enable termination protection for this stack.","default":false,"type":"boolean"},"assumeRoleArn":{"description":"The role that needs to be assumed to deploy the stack (Default - No role is assumed (current credentials are used))","type":"string"},"assumeRoleExternalId":{"description":"External ID to use when assuming role for cloudformation deployments (Default - No external ID)","type":"string"},"cloudFormationExecutionRoleArn":{"description":"The role that is passed to CloudFormation to execute the change set (Default - No role is passed (currently assumed role/credentials are used))","type":"string"},"lookupRole":{"description":"The role to use to look up values from the target AWS account (Default - No role is assumed (current credentials are used))","$ref":"#/definitions/BootstrapRole"},"stackTemplateAssetObjectUrl":{"description":"If the stack template has already been included in the asset manifest, its asset URL (Default - Not uploaded yet, upload just before deploying)","type":"string"},"requiresBootstrapStackVersion":{"description":"Version of bootstrap stack required to deploy this stack (Default - No bootstrap stack required)","type":"number"},"bootstrapStackVersionSsmParameter":{"description":"SSM parameter where the bootstrap stack version number can be found\\n\\nOnly used if `requiresBootstrapStackVersion` is set.\\n\\n- If this value is not set, the bootstrap stack name must be known at\\n deployment time so the stack version can be looked up from the stack\\n outputs.\\n- If this value is set, the bootstrap stack can have any name because\\n we won\'t need to look it up. (Default - Bootstrap stack version number looked up)","type":"string"},"validateOnSynth":{"description":"Whether this stack should be validated by the CLI after synthesis (Default - false)","type":"boolean"}},"required":["templateFile"]},"BootstrapRole":{"description":"Information needed to access an IAM role created\\nas part of the bootstrap process","type":"object","properties":{"arn":{"description":"The ARN of the IAM role created as part of bootrapping\\ne.g. lookupRoleArn","type":"string"},"assumeRoleExternalId":{"description":"External ID to use when assuming the bootstrap role (Default - No external ID)","type":"string"},"requiresBootstrapStackVersion":{"description":"Version of bootstrap stack required to use this role (Default - No bootstrap stack required)","type":"number"},"bootstrapStackVersionSsmParameter":{"description":"Name of SSM parameter with bootstrap stack version (Default - Discover SSM parameter by reading stack)","type":"string"}},"required":["arn"]},"AssetManifestProperties":{"description":"Artifact properties for the Asset Manifest","type":"object","properties":{"file":{"description":"Filename of the asset manifest","type":"string"},"requiresBootstrapStackVersion":{"description":"Version of bootstrap stack required to deploy this stack (Default - Version 1 (basic modern bootstrap stack))","type":"number"},"bootstrapStackVersionSsmParameter":{"description":"SSM parameter where the bootstrap stack version number can be found\\n\\n- If this value is not set, the bootstrap stack name must be known at\\n deployment time so the stack version can be looked up from the stack\\n outputs.\\n- If this value is set, the bootstrap stack can have any name because\\n we won\'t need to look it up. (Default - Bootstrap stack version number looked up)","type":"string"}},"required":["file"]},"TreeArtifactProperties":{"description":"Artifact properties for the Construct Tree Artifact","type":"object","properties":{"file":{"description":"Filename of the tree artifact","type":"string"}},"required":["file"]},"NestedCloudAssemblyProperties":{"description":"Artifact properties for nested cloud assemblies","type":"object","properties":{"directoryName":{"description":"Relative path to the nested cloud assembly","type":"string"},"displayName":{"description":"Display name for the cloud assembly (Default - The artifact ID)","type":"string"}},"required":["directoryName"]},"MissingContext":{"description":"Represents a missing piece of context.","type":"object","properties":{"key":{"description":"The missing context key.","type":"string"},"provider":{"$ref":"#/definitions/ContextProvider","description":"The provider from which we expect this context key to be obtained."},"props":{"$ref":"#/definitions/ContextQueryProperties","description":"A set of provider-specific options."}},"required":["key","props","provider"]},"ContextProvider":{"description":"Identifier for the context provider","type":"string","enum":["ami","availability-zones","hosted-zone","ssm","vpc-provider","endpoint-service-availability-zones","load-balancer","load-balancer-listener","security-group","key-provider","plugin"]},"ContextQueryProperties":{"anyOf":[{"$ref":"#/definitions/AmiContextQuery"},{"$ref":"#/definitions/AvailabilityZonesContextQuery"},{"$ref":"#/definitions/HostedZoneContextQuery"},{"$ref":"#/definitions/SSMParameterContextQuery"},{"$ref":"#/definitions/VpcContextQuery"},{"$ref":"#/definitions/EndpointServiceAvailabilityZonesContextQuery"},{"$ref":"#/definitions/LoadBalancerContextQuery"},{"$ref":"#/definitions/LoadBalancerListenerContextQuery"},{"$ref":"#/definitions/SecurityGroupContextQuery"},{"$ref":"#/definitions/KeyContextQuery"},{"$ref":"#/definitions/PluginContextQuery"}]},"AmiContextQuery":{"description":"Query to AMI context provider","type":"object","properties":{"account":{"description":"Account to query","type":"string"},"region":{"description":"Region to query","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"owners":{"description":"Owners to DescribeImages call (Default - All owners)","type":"array","items":{"type":"string"}},"filters":{"description":"Filters to DescribeImages call","type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["account","filters","region"]},"AvailabilityZonesContextQuery":{"description":"Query to availability zone context provider","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"}},"required":["account","region"]},"HostedZoneContextQuery":{"description":"Query to hosted zone context provider","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"domainName":{"description":"The domain name e.g. example.com to lookup","type":"string"},"privateZone":{"description":"True if the zone you want to find is a private hosted zone","default":false,"type":"boolean"},"vpcId":{"description":"The VPC ID to that the private zone must be associated with\\n\\nIf you provide VPC ID and privateZone is false, this will return no results\\nand raise an error. (Default - Required if privateZone=true)","type":"string"}},"required":["account","domainName","region"]},"SSMParameterContextQuery":{"description":"Query to SSM Parameter Context Provider","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"parameterName":{"description":"Parameter name to query","type":"string"}},"required":["account","parameterName","region"]},"VpcContextQuery":{"description":"Query input for looking up a VPC","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"filter":{"description":"Filters to apply to the VPC\\n\\nFilter parameters are the same as passed to DescribeVpcs.","type":"object","additionalProperties":{"type":"string"}},"returnAsymmetricSubnets":{"description":"Whether to populate the subnetGroups field of the `VpcContextResponse`,\\nwhich contains potentially asymmetric subnet groups.","default":false,"type":"boolean"},"subnetGroupNameTag":{"description":"Optional tag for subnet group name.\\nIf not provided, we\'ll look at the aws-cdk:subnet-name tag.\\nIf the subnet does not have the specified tag,\\nwe\'ll use its type as the name. (Default \'aws-cdk:subnet-name\')","type":"string"},"returnVpnGateways":{"description":"Whether to populate the `vpnGatewayId` field of the `VpcContextResponse`,\\nwhich contains the VPN Gateway ID, if one exists. You can explicitly\\ndisable this in order to avoid the lookup if you know the VPC does not have\\na VPN Gatway attached. (Default true)","type":"boolean"}},"required":["account","filter","region"]},"EndpointServiceAvailabilityZonesContextQuery":{"description":"Query to endpoint service context provider","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"serviceName":{"description":"Query service name","type":"string"}},"required":["account","region","serviceName"]},"LoadBalancerContextQuery":{"description":"Query input for looking up a load balancer","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"loadBalancerType":{"$ref":"#/definitions/LoadBalancerType","description":"Filter load balancers by their type"},"loadBalancerArn":{"description":"Find by load balancer\'s ARN (Default - does not search by load balancer arn)","type":"string"},"loadBalancerTags":{"description":"Match load balancer tags (Default - does not match load balancers by tags)","type":"array","items":{"$ref":"#/definitions/Tag"}}},"required":["account","loadBalancerType","region"]},"LoadBalancerType":{"description":"Type of load balancer","type":"string","enum":["network","application"]},"LoadBalancerListenerContextQuery":{"description":"Query input for looking up a load balancer listener","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"listenerArn":{"description":"Find by listener\'s arn (Default - does not find by listener arn)","type":"string"},"listenerProtocol":{"description":"Filter by listener protocol (Default - does not filter by listener protocol)","enum":["HTTP","HTTPS","TCP","TCP_UDP","TLS","UDP"],"type":"string"},"listenerPort":{"description":"Filter listeners by listener port (Default - does not filter by a listener port)","type":"number"},"loadBalancerType":{"$ref":"#/definitions/LoadBalancerType","description":"Filter load balancers by their type"},"loadBalancerArn":{"description":"Find by load balancer\'s ARN (Default - does not search by load balancer arn)","type":"string"},"loadBalancerTags":{"description":"Match load balancer tags (Default - does not match load balancers by tags)","type":"array","items":{"$ref":"#/definitions/Tag"}}},"required":["account","loadBalancerType","region"]},"SecurityGroupContextQuery":{"description":"Query input for looking up a security group","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"securityGroupId":{"description":"Security group id (Default - None)","type":"string"},"securityGroupName":{"description":"Security group name (Default - None)","type":"string"},"vpcId":{"description":"VPC ID (Default - None)","type":"string"}},"required":["account","region"]},"KeyContextQuery":{"description":"Query input for looking up a KMS Key","type":"object","properties":{"account":{"description":"Query account","type":"string"},"region":{"description":"Query region","type":"string"},"lookupRoleArn":{"description":"The ARN of the role that should be used to look up the missing values (Default - None)","type":"string"},"aliasName":{"description":"Alias name used to search the Key","type":"string"}},"required":["account","aliasName","region"]},"PluginContextQuery":{"description":"Query input for plugins\\n\\nThis alternate branch is necessary because it needs to be able to escape all type checking\\nwe do on on the cloud assembly -- we cannot know the properties that will be used a priori.","type":"object","additionalProperties":{},"properties":{"pluginName":{"description":"The name of the plugin","type":"string"}},"required":["pluginName"]},"RuntimeInfo":{"description":"Information about the application\'s runtime components.","type":"object","properties":{"libraries":{"description":"The list of libraries loaded in the application, associated with their versions.","type":"object","additionalProperties":{"type":"string"}}},"required":["libraries"]}},"$schema":"http://json-schema.org/draft-07/schema#"}'); /***/ }), @@ -91272,7 +92002,7 @@ module.exports = JSON.parse('{"$ref":"#/definitions/AssemblyManifest","definitio /***/ ((module) => { "use strict"; -module.exports = {"i":"34.0.0"}; +module.exports = {"i":"35.0.0"}; /***/ }), @@ -91288,7 +92018,7 @@ module.exports = JSON.parse('{"$ref":"#/definitions/IntegManifest","definitions" /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"name":"@aws-sdk/client-cloudformation","description":"AWS SDK for JavaScript Cloudformation Client for Node.js, Browser and React Native","version":"3.437.0","scripts":{"build":"concurrently \'yarn:build:cjs\' \'yarn:build:es\' \'yarn:build:types\'","build:cjs":"tsc -p tsconfig.cjs.json","build:docs":"typedoc","build:es":"tsc -p tsconfig.es.json","build:include:deps":"lerna run --scope $npm_package_name --include-dependencies build","build:types":"tsc -p tsconfig.types.json","build:types:downlevel":"downlevel-dts dist-types dist-types/ts3.4","clean":"rimraf ./dist-* && rimraf *.tsbuildinfo","extract:docs":"api-extractor run --local","generate:client":"node ../../scripts/generate-clients/single-service --solo cloudformation"},"main":"./dist-cjs/index.js","types":"./dist-types/index.d.ts","module":"./dist-es/index.js","sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"3.0.0","@aws-crypto/sha256-js":"3.0.0","@aws-sdk/client-sts":"3.437.0","@aws-sdk/core":"3.436.0","@aws-sdk/credential-provider-node":"3.437.0","@aws-sdk/middleware-host-header":"3.433.0","@aws-sdk/middleware-logger":"3.433.0","@aws-sdk/middleware-recursion-detection":"3.433.0","@aws-sdk/middleware-signing":"3.433.0","@aws-sdk/middleware-user-agent":"3.433.0","@aws-sdk/region-config-resolver":"3.433.0","@aws-sdk/types":"3.433.0","@aws-sdk/util-endpoints":"3.433.0","@aws-sdk/util-user-agent-browser":"3.433.0","@aws-sdk/util-user-agent-node":"3.437.0","@smithy/config-resolver":"^2.0.16","@smithy/fetch-http-handler":"^2.2.4","@smithy/hash-node":"^2.0.12","@smithy/invalid-dependency":"^2.0.12","@smithy/middleware-content-length":"^2.0.14","@smithy/middleware-endpoint":"^2.1.3","@smithy/middleware-retry":"^2.0.18","@smithy/middleware-serde":"^2.0.12","@smithy/middleware-stack":"^2.0.6","@smithy/node-config-provider":"^2.1.3","@smithy/node-http-handler":"^2.1.8","@smithy/protocol-http":"^3.0.8","@smithy/smithy-client":"^2.1.12","@smithy/types":"^2.4.0","@smithy/url-parser":"^2.0.12","@smithy/util-base64":"^2.0.0","@smithy/util-body-length-browser":"^2.0.0","@smithy/util-body-length-node":"^2.1.0","@smithy/util-defaults-mode-browser":"^2.0.16","@smithy/util-defaults-mode-node":"^2.0.21","@smithy/util-retry":"^2.0.5","@smithy/util-utf8":"^2.0.0","@smithy/util-waiter":"^2.0.12","fast-xml-parser":"4.2.5","tslib":"^2.5.0","uuid":"^8.3.2"},"devDependencies":{"@smithy/service-client-documentation-generator":"^2.0.0","@tsconfig/node14":"1.0.3","@types/node":"^14.14.31","@types/uuid":"^8.3.0","concurrently":"7.0.0","downlevel-dts":"0.10.1","rimraf":"3.0.2","typedoc":"0.23.23","typescript":"~4.9.5"},"engines":{"node":">=14.0.0"},"typesVersions":{"<4.0":{"dist-types/*":["dist-types/ts3.4/*"]}},"files":["dist-*/**"],"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","browser":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.browser"},"react-native":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.native"},"homepage":"https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-cloudformation","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-cloudformation"}}'); +module.exports = JSON.parse('{"name":"@aws-sdk/client-cloudformation","description":"AWS SDK for JavaScript Cloudformation Client for Node.js, Browser and React Native","version":"3.450.0","scripts":{"build":"concurrently \'yarn:build:cjs\' \'yarn:build:es\' \'yarn:build:types\'","build:cjs":"tsc -p tsconfig.cjs.json","build:docs":"typedoc","build:es":"tsc -p tsconfig.es.json","build:include:deps":"lerna run --scope $npm_package_name --include-dependencies build","build:types":"tsc -p tsconfig.types.json","build:types:downlevel":"downlevel-dts dist-types dist-types/ts3.4","clean":"rimraf ./dist-* && rimraf *.tsbuildinfo","extract:docs":"api-extractor run --local","generate:client":"node ../../scripts/generate-clients/single-service --solo cloudformation"},"main":"./dist-cjs/index.js","types":"./dist-types/index.d.ts","module":"./dist-es/index.js","sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"3.0.0","@aws-crypto/sha256-js":"3.0.0","@aws-sdk/client-sts":"3.450.0","@aws-sdk/core":"3.445.0","@aws-sdk/credential-provider-node":"3.450.0","@aws-sdk/middleware-host-header":"3.449.0","@aws-sdk/middleware-logger":"3.449.0","@aws-sdk/middleware-recursion-detection":"3.449.0","@aws-sdk/middleware-signing":"3.449.0","@aws-sdk/middleware-user-agent":"3.449.0","@aws-sdk/region-config-resolver":"3.433.0","@aws-sdk/types":"3.449.0","@aws-sdk/util-endpoints":"3.449.0","@aws-sdk/util-user-agent-browser":"3.449.0","@aws-sdk/util-user-agent-node":"3.449.0","@smithy/config-resolver":"^2.0.16","@smithy/fetch-http-handler":"^2.2.4","@smithy/hash-node":"^2.0.12","@smithy/invalid-dependency":"^2.0.12","@smithy/middleware-content-length":"^2.0.14","@smithy/middleware-endpoint":"^2.1.3","@smithy/middleware-retry":"^2.0.18","@smithy/middleware-serde":"^2.0.12","@smithy/middleware-stack":"^2.0.6","@smithy/node-config-provider":"^2.1.3","@smithy/node-http-handler":"^2.1.8","@smithy/protocol-http":"^3.0.8","@smithy/smithy-client":"^2.1.12","@smithy/types":"^2.4.0","@smithy/url-parser":"^2.0.12","@smithy/util-base64":"^2.0.0","@smithy/util-body-length-browser":"^2.0.0","@smithy/util-body-length-node":"^2.1.0","@smithy/util-defaults-mode-browser":"^2.0.16","@smithy/util-defaults-mode-node":"^2.0.21","@smithy/util-endpoints":"^1.0.2","@smithy/util-retry":"^2.0.5","@smithy/util-utf8":"^2.0.0","@smithy/util-waiter":"^2.0.12","fast-xml-parser":"4.2.5","tslib":"^2.5.0","uuid":"^8.3.2"},"devDependencies":{"@smithy/service-client-documentation-generator":"^2.0.0","@tsconfig/node14":"1.0.3","@types/node":"^14.14.31","@types/uuid":"^8.3.0","concurrently":"7.0.0","downlevel-dts":"0.10.1","rimraf":"3.0.2","typedoc":"0.23.23","typescript":"~4.9.5"},"engines":{"node":">=14.0.0"},"typesVersions":{"<4.0":{"dist-types/*":["dist-types/ts3.4/*"]}},"files":["dist-*/**"],"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","browser":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.browser"},"react-native":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.native"},"homepage":"https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-cloudformation","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-cloudformation"}}'); /***/ }), @@ -91296,7 +92026,7 @@ module.exports = JSON.parse('{"name":"@aws-sdk/client-cloudformation","descripti /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"name":"@aws-sdk/client-cognito-identity","description":"AWS SDK for JavaScript Cognito Identity Client for Node.js, Browser and React Native","version":"3.437.0","scripts":{"build":"concurrently \'yarn:build:cjs\' \'yarn:build:es\' \'yarn:build:types\'","build:cjs":"tsc -p tsconfig.cjs.json","build:docs":"typedoc","build:es":"tsc -p tsconfig.es.json","build:include:deps":"lerna run --scope $npm_package_name --include-dependencies build","build:types":"tsc -p tsconfig.types.json","build:types:downlevel":"downlevel-dts dist-types dist-types/ts3.4","clean":"rimraf ./dist-* && rimraf *.tsbuildinfo","extract:docs":"api-extractor run --local","generate:client":"node ../../scripts/generate-clients/single-service --solo cognito-identity","test:e2e":"ts-mocha test/**/*.ispec.ts && karma start karma.conf.js"},"main":"./dist-cjs/index.js","types":"./dist-types/index.d.ts","module":"./dist-es/index.js","sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"3.0.0","@aws-crypto/sha256-js":"3.0.0","@aws-sdk/client-sts":"3.437.0","@aws-sdk/core":"3.436.0","@aws-sdk/credential-provider-node":"3.437.0","@aws-sdk/middleware-host-header":"3.433.0","@aws-sdk/middleware-logger":"3.433.0","@aws-sdk/middleware-recursion-detection":"3.433.0","@aws-sdk/middleware-signing":"3.433.0","@aws-sdk/middleware-user-agent":"3.433.0","@aws-sdk/region-config-resolver":"3.433.0","@aws-sdk/types":"3.433.0","@aws-sdk/util-endpoints":"3.433.0","@aws-sdk/util-user-agent-browser":"3.433.0","@aws-sdk/util-user-agent-node":"3.437.0","@smithy/config-resolver":"^2.0.16","@smithy/fetch-http-handler":"^2.2.4","@smithy/hash-node":"^2.0.12","@smithy/invalid-dependency":"^2.0.12","@smithy/middleware-content-length":"^2.0.14","@smithy/middleware-endpoint":"^2.1.3","@smithy/middleware-retry":"^2.0.18","@smithy/middleware-serde":"^2.0.12","@smithy/middleware-stack":"^2.0.6","@smithy/node-config-provider":"^2.1.3","@smithy/node-http-handler":"^2.1.8","@smithy/protocol-http":"^3.0.8","@smithy/smithy-client":"^2.1.12","@smithy/types":"^2.4.0","@smithy/url-parser":"^2.0.12","@smithy/util-base64":"^2.0.0","@smithy/util-body-length-browser":"^2.0.0","@smithy/util-body-length-node":"^2.1.0","@smithy/util-defaults-mode-browser":"^2.0.16","@smithy/util-defaults-mode-node":"^2.0.21","@smithy/util-retry":"^2.0.5","@smithy/util-utf8":"^2.0.0","tslib":"^2.5.0"},"devDependencies":{"@aws-sdk/client-iam":"3.437.0","@smithy/service-client-documentation-generator":"^2.0.0","@tsconfig/node14":"1.0.3","@types/chai":"^4.2.11","@types/mocha":"^8.0.4","@types/node":"^14.14.31","concurrently":"7.0.0","downlevel-dts":"0.10.1","rimraf":"3.0.2","typedoc":"0.23.23","typescript":"~4.9.5"},"engines":{"node":">=14.0.0"},"typesVersions":{"<4.0":{"dist-types/*":["dist-types/ts3.4/*"]}},"files":["dist-*/**"],"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","browser":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.browser"},"react-native":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.native"},"homepage":"https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-cognito-identity","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-cognito-identity"}}'); +module.exports = JSON.parse('{"name":"@aws-sdk/client-cognito-identity","description":"AWS SDK for JavaScript Cognito Identity Client for Node.js, Browser and React Native","version":"3.450.0","scripts":{"build":"concurrently \'yarn:build:cjs\' \'yarn:build:es\' \'yarn:build:types\'","build:cjs":"tsc -p tsconfig.cjs.json","build:docs":"typedoc","build:es":"tsc -p tsconfig.es.json","build:include:deps":"lerna run --scope $npm_package_name --include-dependencies build","build:types":"tsc -p tsconfig.types.json","build:types:downlevel":"downlevel-dts dist-types dist-types/ts3.4","clean":"rimraf ./dist-* && rimraf *.tsbuildinfo","extract:docs":"api-extractor run --local","generate:client":"node ../../scripts/generate-clients/single-service --solo cognito-identity","test:e2e":"ts-mocha test/**/*.ispec.ts && karma start karma.conf.js"},"main":"./dist-cjs/index.js","types":"./dist-types/index.d.ts","module":"./dist-es/index.js","sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"3.0.0","@aws-crypto/sha256-js":"3.0.0","@aws-sdk/client-sts":"3.450.0","@aws-sdk/core":"3.445.0","@aws-sdk/credential-provider-node":"3.450.0","@aws-sdk/middleware-host-header":"3.449.0","@aws-sdk/middleware-logger":"3.449.0","@aws-sdk/middleware-recursion-detection":"3.449.0","@aws-sdk/middleware-signing":"3.449.0","@aws-sdk/middleware-user-agent":"3.449.0","@aws-sdk/region-config-resolver":"3.433.0","@aws-sdk/types":"3.449.0","@aws-sdk/util-endpoints":"3.449.0","@aws-sdk/util-user-agent-browser":"3.449.0","@aws-sdk/util-user-agent-node":"3.449.0","@smithy/config-resolver":"^2.0.16","@smithy/fetch-http-handler":"^2.2.4","@smithy/hash-node":"^2.0.12","@smithy/invalid-dependency":"^2.0.12","@smithy/middleware-content-length":"^2.0.14","@smithy/middleware-endpoint":"^2.1.3","@smithy/middleware-retry":"^2.0.18","@smithy/middleware-serde":"^2.0.12","@smithy/middleware-stack":"^2.0.6","@smithy/node-config-provider":"^2.1.3","@smithy/node-http-handler":"^2.1.8","@smithy/protocol-http":"^3.0.8","@smithy/smithy-client":"^2.1.12","@smithy/types":"^2.4.0","@smithy/url-parser":"^2.0.12","@smithy/util-base64":"^2.0.0","@smithy/util-body-length-browser":"^2.0.0","@smithy/util-body-length-node":"^2.1.0","@smithy/util-defaults-mode-browser":"^2.0.16","@smithy/util-defaults-mode-node":"^2.0.21","@smithy/util-endpoints":"^1.0.2","@smithy/util-retry":"^2.0.5","@smithy/util-utf8":"^2.0.0","tslib":"^2.5.0"},"devDependencies":{"@aws-sdk/client-iam":"3.450.0","@smithy/service-client-documentation-generator":"^2.0.0","@tsconfig/node14":"1.0.3","@types/chai":"^4.2.11","@types/mocha":"^8.0.4","@types/node":"^14.14.31","concurrently":"7.0.0","downlevel-dts":"0.10.1","rimraf":"3.0.2","typedoc":"0.23.23","typescript":"~4.9.5"},"engines":{"node":">=14.0.0"},"typesVersions":{"<4.0":{"dist-types/*":["dist-types/ts3.4/*"]}},"files":["dist-*/**"],"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","browser":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.browser"},"react-native":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.native"},"homepage":"https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-cognito-identity","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-cognito-identity"}}'); /***/ }), @@ -91304,7 +92034,7 @@ module.exports = JSON.parse('{"name":"@aws-sdk/client-cognito-identity","descrip /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"name":"@aws-sdk/client-sso","description":"AWS SDK for JavaScript Sso Client for Node.js, Browser and React Native","version":"3.437.0","scripts":{"build":"concurrently \'yarn:build:cjs\' \'yarn:build:es\' \'yarn:build:types\'","build:cjs":"tsc -p tsconfig.cjs.json","build:docs":"typedoc","build:es":"tsc -p tsconfig.es.json","build:include:deps":"lerna run --scope $npm_package_name --include-dependencies build","build:types":"tsc -p tsconfig.types.json","build:types:downlevel":"downlevel-dts dist-types dist-types/ts3.4","clean":"rimraf ./dist-* && rimraf *.tsbuildinfo","extract:docs":"api-extractor run --local","generate:client":"node ../../scripts/generate-clients/single-service --solo sso"},"main":"./dist-cjs/index.js","types":"./dist-types/index.d.ts","module":"./dist-es/index.js","sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"3.0.0","@aws-crypto/sha256-js":"3.0.0","@aws-sdk/core":"3.436.0","@aws-sdk/middleware-host-header":"3.433.0","@aws-sdk/middleware-logger":"3.433.0","@aws-sdk/middleware-recursion-detection":"3.433.0","@aws-sdk/middleware-user-agent":"3.433.0","@aws-sdk/region-config-resolver":"3.433.0","@aws-sdk/types":"3.433.0","@aws-sdk/util-endpoints":"3.433.0","@aws-sdk/util-user-agent-browser":"3.433.0","@aws-sdk/util-user-agent-node":"3.437.0","@smithy/config-resolver":"^2.0.16","@smithy/fetch-http-handler":"^2.2.4","@smithy/hash-node":"^2.0.12","@smithy/invalid-dependency":"^2.0.12","@smithy/middleware-content-length":"^2.0.14","@smithy/middleware-endpoint":"^2.1.3","@smithy/middleware-retry":"^2.0.18","@smithy/middleware-serde":"^2.0.12","@smithy/middleware-stack":"^2.0.6","@smithy/node-config-provider":"^2.1.3","@smithy/node-http-handler":"^2.1.8","@smithy/protocol-http":"^3.0.8","@smithy/smithy-client":"^2.1.12","@smithy/types":"^2.4.0","@smithy/url-parser":"^2.0.12","@smithy/util-base64":"^2.0.0","@smithy/util-body-length-browser":"^2.0.0","@smithy/util-body-length-node":"^2.1.0","@smithy/util-defaults-mode-browser":"^2.0.16","@smithy/util-defaults-mode-node":"^2.0.21","@smithy/util-retry":"^2.0.5","@smithy/util-utf8":"^2.0.0","tslib":"^2.5.0"},"devDependencies":{"@smithy/service-client-documentation-generator":"^2.0.0","@tsconfig/node14":"1.0.3","@types/node":"^14.14.31","concurrently":"7.0.0","downlevel-dts":"0.10.1","rimraf":"3.0.2","typedoc":"0.23.23","typescript":"~4.9.5"},"engines":{"node":">=14.0.0"},"typesVersions":{"<4.0":{"dist-types/*":["dist-types/ts3.4/*"]}},"files":["dist-*/**"],"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","browser":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.browser"},"react-native":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.native"},"homepage":"https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-sso","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-sso"}}'); +module.exports = JSON.parse('{"name":"@aws-sdk/client-sso","description":"AWS SDK for JavaScript Sso Client for Node.js, Browser and React Native","version":"3.450.0","scripts":{"build":"concurrently \'yarn:build:cjs\' \'yarn:build:es\' \'yarn:build:types\'","build:cjs":"tsc -p tsconfig.cjs.json","build:docs":"typedoc","build:es":"tsc -p tsconfig.es.json","build:include:deps":"lerna run --scope $npm_package_name --include-dependencies build","build:types":"tsc -p tsconfig.types.json","build:types:downlevel":"downlevel-dts dist-types dist-types/ts3.4","clean":"rimraf ./dist-* && rimraf *.tsbuildinfo","extract:docs":"api-extractor run --local","generate:client":"node ../../scripts/generate-clients/single-service --solo sso"},"main":"./dist-cjs/index.js","types":"./dist-types/index.d.ts","module":"./dist-es/index.js","sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"3.0.0","@aws-crypto/sha256-js":"3.0.0","@aws-sdk/core":"3.445.0","@aws-sdk/middleware-host-header":"3.449.0","@aws-sdk/middleware-logger":"3.449.0","@aws-sdk/middleware-recursion-detection":"3.449.0","@aws-sdk/middleware-user-agent":"3.449.0","@aws-sdk/region-config-resolver":"3.433.0","@aws-sdk/types":"3.449.0","@aws-sdk/util-endpoints":"3.449.0","@aws-sdk/util-user-agent-browser":"3.449.0","@aws-sdk/util-user-agent-node":"3.449.0","@smithy/config-resolver":"^2.0.16","@smithy/fetch-http-handler":"^2.2.4","@smithy/hash-node":"^2.0.12","@smithy/invalid-dependency":"^2.0.12","@smithy/middleware-content-length":"^2.0.14","@smithy/middleware-endpoint":"^2.1.3","@smithy/middleware-retry":"^2.0.18","@smithy/middleware-serde":"^2.0.12","@smithy/middleware-stack":"^2.0.6","@smithy/node-config-provider":"^2.1.3","@smithy/node-http-handler":"^2.1.8","@smithy/protocol-http":"^3.0.8","@smithy/smithy-client":"^2.1.12","@smithy/types":"^2.4.0","@smithy/url-parser":"^2.0.12","@smithy/util-base64":"^2.0.0","@smithy/util-body-length-browser":"^2.0.0","@smithy/util-body-length-node":"^2.1.0","@smithy/util-defaults-mode-browser":"^2.0.16","@smithy/util-defaults-mode-node":"^2.0.21","@smithy/util-endpoints":"^1.0.2","@smithy/util-retry":"^2.0.5","@smithy/util-utf8":"^2.0.0","tslib":"^2.5.0"},"devDependencies":{"@smithy/service-client-documentation-generator":"^2.0.0","@tsconfig/node14":"1.0.3","@types/node":"^14.14.31","concurrently":"7.0.0","downlevel-dts":"0.10.1","rimraf":"3.0.2","typedoc":"0.23.23","typescript":"~4.9.5"},"engines":{"node":">=14.0.0"},"typesVersions":{"<4.0":{"dist-types/*":["dist-types/ts3.4/*"]}},"files":["dist-*/**"],"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","browser":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.browser"},"react-native":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.native"},"homepage":"https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-sso","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-sso"}}'); /***/ }), @@ -91312,7 +92042,7 @@ module.exports = JSON.parse('{"name":"@aws-sdk/client-sso","description":"AWS SD /***/ ((module) => { "use strict"; -module.exports = JSON.parse('{"name":"@aws-sdk/client-sts","description":"AWS SDK for JavaScript Sts Client for Node.js, Browser and React Native","version":"3.437.0","scripts":{"build":"concurrently \'yarn:build:cjs\' \'yarn:build:es\' \'yarn:build:types\'","build:cjs":"tsc -p tsconfig.cjs.json","build:docs":"typedoc","build:es":"tsc -p tsconfig.es.json","build:include:deps":"lerna run --scope $npm_package_name --include-dependencies build","build:types":"tsc -p tsconfig.types.json","build:types:downlevel":"downlevel-dts dist-types dist-types/ts3.4","clean":"rimraf ./dist-* && rimraf *.tsbuildinfo","extract:docs":"api-extractor run --local","generate:client":"node ../../scripts/generate-clients/single-service --solo sts","test":"yarn test:unit","test:unit":"jest"},"main":"./dist-cjs/index.js","types":"./dist-types/index.d.ts","module":"./dist-es/index.js","sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"3.0.0","@aws-crypto/sha256-js":"3.0.0","@aws-sdk/core":"3.436.0","@aws-sdk/credential-provider-node":"3.437.0","@aws-sdk/middleware-host-header":"3.433.0","@aws-sdk/middleware-logger":"3.433.0","@aws-sdk/middleware-recursion-detection":"3.433.0","@aws-sdk/middleware-sdk-sts":"3.433.0","@aws-sdk/middleware-signing":"3.433.0","@aws-sdk/middleware-user-agent":"3.433.0","@aws-sdk/region-config-resolver":"3.433.0","@aws-sdk/types":"3.433.0","@aws-sdk/util-endpoints":"3.433.0","@aws-sdk/util-user-agent-browser":"3.433.0","@aws-sdk/util-user-agent-node":"3.437.0","@smithy/config-resolver":"^2.0.16","@smithy/fetch-http-handler":"^2.2.4","@smithy/hash-node":"^2.0.12","@smithy/invalid-dependency":"^2.0.12","@smithy/middleware-content-length":"^2.0.14","@smithy/middleware-endpoint":"^2.1.3","@smithy/middleware-retry":"^2.0.18","@smithy/middleware-serde":"^2.0.12","@smithy/middleware-stack":"^2.0.6","@smithy/node-config-provider":"^2.1.3","@smithy/node-http-handler":"^2.1.8","@smithy/protocol-http":"^3.0.8","@smithy/smithy-client":"^2.1.12","@smithy/types":"^2.4.0","@smithy/url-parser":"^2.0.12","@smithy/util-base64":"^2.0.0","@smithy/util-body-length-browser":"^2.0.0","@smithy/util-body-length-node":"^2.1.0","@smithy/util-defaults-mode-browser":"^2.0.16","@smithy/util-defaults-mode-node":"^2.0.21","@smithy/util-retry":"^2.0.5","@smithy/util-utf8":"^2.0.0","fast-xml-parser":"4.2.5","tslib":"^2.5.0"},"devDependencies":{"@smithy/service-client-documentation-generator":"^2.0.0","@tsconfig/node14":"1.0.3","@types/node":"^14.14.31","concurrently":"7.0.0","downlevel-dts":"0.10.1","rimraf":"3.0.2","typedoc":"0.23.23","typescript":"~4.9.5"},"engines":{"node":">=14.0.0"},"typesVersions":{"<4.0":{"dist-types/*":["dist-types/ts3.4/*"]}},"files":["dist-*/**"],"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","browser":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.browser"},"react-native":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.native"},"homepage":"https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-sts","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-sts"}}'); +module.exports = JSON.parse('{"name":"@aws-sdk/client-sts","description":"AWS SDK for JavaScript Sts Client for Node.js, Browser and React Native","version":"3.450.0","scripts":{"build":"concurrently \'yarn:build:cjs\' \'yarn:build:es\' \'yarn:build:types\'","build:cjs":"tsc -p tsconfig.cjs.json","build:docs":"typedoc","build:es":"tsc -p tsconfig.es.json","build:include:deps":"lerna run --scope $npm_package_name --include-dependencies build","build:types":"tsc -p tsconfig.types.json","build:types:downlevel":"downlevel-dts dist-types dist-types/ts3.4","clean":"rimraf ./dist-* && rimraf *.tsbuildinfo","extract:docs":"api-extractor run --local","generate:client":"node ../../scripts/generate-clients/single-service --solo sts","test":"yarn test:unit","test:unit":"jest"},"main":"./dist-cjs/index.js","types":"./dist-types/index.d.ts","module":"./dist-es/index.js","sideEffects":false,"dependencies":{"@aws-crypto/sha256-browser":"3.0.0","@aws-crypto/sha256-js":"3.0.0","@aws-sdk/core":"3.445.0","@aws-sdk/credential-provider-node":"3.450.0","@aws-sdk/middleware-host-header":"3.449.0","@aws-sdk/middleware-logger":"3.449.0","@aws-sdk/middleware-recursion-detection":"3.449.0","@aws-sdk/middleware-sdk-sts":"3.449.0","@aws-sdk/middleware-signing":"3.449.0","@aws-sdk/middleware-user-agent":"3.449.0","@aws-sdk/region-config-resolver":"3.433.0","@aws-sdk/types":"3.449.0","@aws-sdk/util-endpoints":"3.449.0","@aws-sdk/util-user-agent-browser":"3.449.0","@aws-sdk/util-user-agent-node":"3.449.0","@smithy/config-resolver":"^2.0.16","@smithy/fetch-http-handler":"^2.2.4","@smithy/hash-node":"^2.0.12","@smithy/invalid-dependency":"^2.0.12","@smithy/middleware-content-length":"^2.0.14","@smithy/middleware-endpoint":"^2.1.3","@smithy/middleware-retry":"^2.0.18","@smithy/middleware-serde":"^2.0.12","@smithy/middleware-stack":"^2.0.6","@smithy/node-config-provider":"^2.1.3","@smithy/node-http-handler":"^2.1.8","@smithy/protocol-http":"^3.0.8","@smithy/smithy-client":"^2.1.12","@smithy/types":"^2.4.0","@smithy/url-parser":"^2.0.12","@smithy/util-base64":"^2.0.0","@smithy/util-body-length-browser":"^2.0.0","@smithy/util-body-length-node":"^2.1.0","@smithy/util-defaults-mode-browser":"^2.0.16","@smithy/util-defaults-mode-node":"^2.0.21","@smithy/util-endpoints":"^1.0.2","@smithy/util-retry":"^2.0.5","@smithy/util-utf8":"^2.0.0","fast-xml-parser":"4.2.5","tslib":"^2.5.0"},"devDependencies":{"@smithy/service-client-documentation-generator":"^2.0.0","@tsconfig/node14":"1.0.3","@types/node":"^14.14.31","concurrently":"7.0.0","downlevel-dts":"0.10.1","rimraf":"3.0.2","typedoc":"0.23.23","typescript":"~4.9.5"},"engines":{"node":">=14.0.0"},"typesVersions":{"<4.0":{"dist-types/*":["dist-types/ts3.4/*"]}},"files":["dist-*/**"],"author":{"name":"AWS SDK for JavaScript Team","url":"https://aws.amazon.com/javascript/"},"license":"Apache-2.0","browser":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.browser"},"react-native":{"./dist-es/runtimeConfig":"./dist-es/runtimeConfig.native"},"homepage":"https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-sts","repository":{"type":"git","url":"https://github.com/aws/aws-sdk-js-v3.git","directory":"clients/client-sts"}}'); /***/ }), diff --git a/dist/index.js.map b/dist/index.js.map index e7166a4..c83a181 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/oBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACXA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5BA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtZA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpBA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrBA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnBA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACj9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1hBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7SA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACNA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChEA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClBA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACfA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACLA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACTA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnNA;AACA;AACA;AACA;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACNA;AACA;AACA;AACA;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACt/PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpKA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACl7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvFA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACngCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtEA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtCA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7gCA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClCA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1+DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9CA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClCA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1CA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9RA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpCA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClKA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACt0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3kBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7OA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/bA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9CA;AACA;AACA;AACA;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACroFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpaA;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACr0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/IA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACviBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9lEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/6BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrRA;;;;;;;;ACAA;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChCA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AChCA;AACA;AACA;AACA;AACA;;;;ACJA;AACA;;;;AEDA;AACA;AACA;AACA","sources":[".././lib/action.js",".././lib/assembly.js",".././lib/comment.js",".././lib/diff.js",".././lib/index.js",".././lib/stage-processor.js",".././node_modules/@actions/core/lib/command.js",".././node_modules/@actions/core/lib/core.js",".././node_modules/@actions/core/lib/file-command.js",".././node_modules/@actions/core/lib/oidc-utils.js",".././node_modules/@actions/core/lib/path-utils.js",".././node_modules/@actions/core/lib/summary.js",".././node_modules/@actions/core/lib/utils.js",".././node_modules/@actions/github/lib/context.js",".././node_modules/@actions/github/lib/github.js",".././node_modules/@actions/github/lib/internal/utils.js",".././node_modules/@actions/github/lib/utils.js",".././node_modules/@actions/http-client/lib/auth.js",".././node_modules/@actions/http-client/lib/index.js",".././node_modules/@actions/http-client/lib/proxy.js",".././node_modules/@aws-cdk/cfnspec/lib/canned-metrics.js",".././node_modules/@aws-cdk/cfnspec/lib/canned-metrics/canned-metrics-schema.js",".././node_modules/@aws-cdk/cfnspec/lib/index.js",".././node_modules/@aws-cdk/cfnspec/lib/schema/augmentation.js",".././node_modules/@aws-cdk/cfnspec/lib/schema/base-types.js",".././node_modules/@aws-cdk/cfnspec/lib/schema/cfn-lint.js",".././node_modules/@aws-cdk/cfnspec/lib/schema/docs.js",".././node_modules/@aws-cdk/cfnspec/lib/schema/index.js",".././node_modules/@aws-cdk/cfnspec/lib/schema/property.js",".././node_modules/@aws-cdk/cfnspec/lib/schema/resource-type.js",".././node_modules/@aws-cdk/cfnspec/lib/schema/specification.js",".././node_modules/@aws-cdk/cloud-assembly-schema/.warnings.jsii.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/assets/aws-destination.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/assets/docker-image-asset.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/assets/file-asset.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/assets/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/assets/schema.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/cloud-assembly/artifact-schema.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/cloud-assembly/context-queries.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/cloud-assembly/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/cloud-assembly/metadata-schema.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/cloud-assembly/schema.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/commands/common.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/commands/deploy.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/commands/destroy.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/commands/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/schema.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/test-case.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/manifest.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema/lib/attribute.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema/lib/helpers.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema/lib/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema/lib/scan.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema/lib/validator.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/classes/comparator.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/classes/range.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/classes/semver.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/clean.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/cmp.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/coerce.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/compare-build.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/compare-loose.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/compare.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/diff.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/eq.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/gt.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/gte.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/inc.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/lt.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/lte.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/major.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/minor.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/neq.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/parse.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/patch.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/prerelease.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/rcompare.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/rsort.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/satisfies.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/sort.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/valid.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/internal/constants.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/internal/debug.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/internal/identifiers.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/internal/parse-options.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/internal/re.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/gtr.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/intersects.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/ltr.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/max-satisfying.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/min-satisfying.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/min-version.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/outside.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/simplify.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/subset.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/to-comparators.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/valid.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist/iterator.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist/yallist.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diff/index.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diff/maybe-parsed.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diff/types.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diff/util.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diffable.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/format-table.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/format.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/iam/iam-changes.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/iam/managed-policy.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/iam/statement.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/index.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/network/security-group-changes.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/network/security-group-rule.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/render-intrinsics.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/util.js",".././node_modules/@aws-crypto/crc32/build/aws_crc32.js",".././node_modules/@aws-crypto/crc32/build/index.js",".././node_modules/@aws-crypto/crc32/node_modules/tslib/tslib.js",".././node_modules/@aws-crypto/util/build/convertToBuffer.js",".././node_modules/@aws-crypto/util/build/index.js",".././node_modules/@aws-crypto/util/build/isEmptyData.js",".././node_modules/@aws-crypto/util/build/numToUint8.js",".././node_modules/@aws-crypto/util/build/uint32ArrayFrom.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/CloudFormation.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/CloudFormationClient.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ActivateOrganizationsAccessCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ActivateTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/BatchDescribeTypeConfigurationsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/CancelUpdateStackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ContinueUpdateRollbackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/CreateChangeSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/CreateStackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/CreateStackInstancesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/CreateStackSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeactivateOrganizationsAccessCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeactivateTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeleteChangeSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeleteStackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeleteStackInstancesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeleteStackSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeregisterTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeAccountLimitsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeChangeSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeChangeSetHooksCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeOrganizationsAccessCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribePublisherCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackDriftDetectionStatusCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackEventsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackInstanceCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackResourceCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackResourceDriftsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackResourcesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackSetOperationCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStacksCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeTypeRegistrationCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DetectStackDriftCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DetectStackResourceDriftCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DetectStackSetDriftCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/EstimateTemplateCostCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ExecuteChangeSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/GetStackPolicyCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/GetTemplateCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/GetTemplateSummaryCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ImportStacksToStackSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListChangeSetsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListExportsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListImportsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackInstanceResourceDriftsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackInstancesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackResourcesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackSetOperationResultsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackSetOperationsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackSetsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStacksCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListTypeRegistrationsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListTypeVersionsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListTypesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/PublishTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/RecordHandlerProgressCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/RegisterPublisherCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/RegisterTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/RollbackStackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/SetStackPolicyCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/SetTypeConfigurationCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/SetTypeDefaultVersionCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/SignalResourceCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/StopStackSetOperationCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/TestTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/UpdateStackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/UpdateStackInstancesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/UpdateStackSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/UpdateTerminationProtectionCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ValidateTemplateCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/index.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/endpoint/EndpointParameters.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/endpoint/endpointResolver.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/endpoint/ruleset.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/index.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/models/CloudFormationServiceException.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/models/index.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/models/models_0.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/DescribeAccountLimitsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/DescribeStackEventsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/DescribeStackResourceDriftsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/DescribeStacksPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/Interfaces.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListChangeSetsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListExportsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListImportsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStackInstancesPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStackResourcesPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStackSetOperationResultsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStackSetOperationsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStackSetsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStacksPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListTypeRegistrationsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListTypeVersionsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListTypesPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/index.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/protocols/Aws_query.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/runtimeConfig.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/runtimeConfig.shared.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/runtimeExtensions.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/index.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForChangeSetCreateComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackCreateComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackDeleteComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackExists.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackImportComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackRollbackComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackUpdateComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForTypeRegistrationComplete.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/CognitoIdentity.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/CognitoIdentityClient.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/CreateIdentityPoolCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/DeleteIdentitiesCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/DeleteIdentityPoolCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/DescribeIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/DescribeIdentityPoolCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetCredentialsForIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetIdCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetIdentityPoolRolesCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetOpenIdTokenCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetOpenIdTokenForDeveloperIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetPrincipalTagAttributeMapCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/ListIdentitiesCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/ListIdentityPoolsCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/ListTagsForResourceCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/LookupDeveloperIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/MergeDeveloperIdentitiesCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/SetIdentityPoolRolesCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/SetPrincipalTagAttributeMapCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/TagResourceCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/UnlinkDeveloperIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/UnlinkIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/UntagResourceCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/UpdateIdentityPoolCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/index.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/endpoint/EndpointParameters.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/endpoint/endpointResolver.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/endpoint/ruleset.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/index.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/models/CognitoIdentityServiceException.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/models/index.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/models/models_0.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/pagination/Interfaces.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/pagination/ListIdentityPoolsPaginator.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/pagination/index.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/protocols/Aws_json1_1.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/runtimeConfig.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/runtimeConfig.shared.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/runtimeExtensions.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/SSO.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/SSOClient.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/commands/GetRoleCredentialsCommand.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/commands/ListAccountRolesCommand.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/commands/ListAccountsCommand.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/commands/LogoutCommand.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/commands/index.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/endpoint/EndpointParameters.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/endpoint/endpointResolver.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/endpoint/ruleset.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/index.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/models/SSOServiceException.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/models/index.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/models/models_0.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/pagination/Interfaces.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/pagination/ListAccountRolesPaginator.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/pagination/ListAccountsPaginator.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/pagination/index.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/protocols/Aws_restJson1.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/runtimeConfig.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/runtimeConfig.shared.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/runtimeExtensions.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/STS.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/STSClient.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/AssumeRoleCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/AssumeRoleWithSAMLCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/AssumeRoleWithWebIdentityCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/DecodeAuthorizationMessageCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/GetAccessKeyInfoCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/GetCallerIdentityCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/GetFederationTokenCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/GetSessionTokenCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/index.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/defaultRoleAssumers.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/defaultStsRoleAssumers.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/EndpointParameters.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/endpointResolver.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/ruleset.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/index.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/models/STSServiceException.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/models/index.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/models/models_0.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/protocols/Aws_query.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.shared.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/runtimeExtensions.js",".././node_modules/@aws-sdk/core/dist-cjs/client/emitWarningIfUnsupportedVersion.js",".././node_modules/@aws-sdk/core/dist-cjs/client/index.js",".././node_modules/@aws-sdk/core/dist-cjs/index.js",".././node_modules/@aws-sdk/core/dist-cjs/protocols/index.js",".././node_modules/@aws-sdk/core/dist-cjs/protocols/json/awsExpectUnion.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/CognitoProviderParameters.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/InMemoryStorage.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/IndexedDbStorage.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/Logins.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/Storage.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/fromCognitoIdentity.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/fromCognitoIdentityPool.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/localStorage.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/resolveLogins.js",".././node_modules/@aws-sdk/credential-provider-env/dist-cjs/fromEnv.js",".././node_modules/@aws-sdk/credential-provider-env/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/checkUrl.js",".././node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/fromHttp.js",".././node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/requestHelpers.js",".././node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/retry-wrapper.js",".././node_modules/@aws-sdk/credential-provider-http/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/fromIni.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveAssumeRoleCredentials.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveCredentialSource.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveProcessCredentials.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveProfileData.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveSsoCredentials.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveStaticCredentials.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveWebIdentityCredentials.js",".././node_modules/@aws-sdk/credential-provider-node/dist-cjs/defaultProvider.js",".././node_modules/@aws-sdk/credential-provider-node/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-node/dist-cjs/remoteProvider.js",".././node_modules/@aws-sdk/credential-provider-process/dist-cjs/fromProcess.js",".././node_modules/@aws-sdk/credential-provider-process/dist-cjs/getValidatedProcessCredentials.js",".././node_modules/@aws-sdk/credential-provider-process/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-process/dist-cjs/resolveProcessCredentials.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/fromSSO.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/isSsoProfile.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/resolveSSOCredentials.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/types.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/validateSsoProfile.js",".././node_modules/@aws-sdk/credential-provider-web-identity/dist-cjs/fromTokenFile.js",".././node_modules/@aws-sdk/credential-provider-web-identity/dist-cjs/fromWebToken.js",".././node_modules/@aws-sdk/credential-provider-web-identity/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromCognitoIdentity.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromCognitoIdentityPool.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromContainerMetadata.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromEnv.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromIni.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromInstanceMetadata.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromNodeProviderChain.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromProcess.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromSSO.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromTemporaryCredentials.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromTokenFile.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromWebToken.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-host-header/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-logger/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-logger/dist-cjs/loggerMiddleware.js",".././node_modules/@aws-sdk/middleware-recursion-detection/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-sdk-sts/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/awsAuthConfiguration.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/awsAuthMiddleware.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/utils/getSkewCorrectedDate.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/utils/getUpdatedSystemClockOffset.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/utils/isClockSkewed.js",".././node_modules/@aws-sdk/middleware-user-agent/dist-cjs/configurations.js",".././node_modules/@aws-sdk/middleware-user-agent/dist-cjs/constants.js",".././node_modules/@aws-sdk/middleware-user-agent/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-user-agent/dist-cjs/user-agent-middleware.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/extensions/index.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/index.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/regionConfig/config.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/regionConfig/getRealRegion.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/regionConfig/index.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/regionConfig/isFipsRegion.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/regionConfig/resolveRegionConfig.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/bundle/client-sso-oidc-node.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/constants.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/fromSso.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/fromStatic.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/getNewSsoOidcToken.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/getSsoOidcClient.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/index.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/nodeProvider.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/validateTokenExpiry.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/validateTokenKey.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/writeSSOTokenToFile.js",".././node_modules/@aws-sdk/types/dist-cjs/abort.js",".././node_modules/@aws-sdk/types/dist-cjs/auth.js",".././node_modules/@aws-sdk/types/dist-cjs/blob/blob-types.js",".././node_modules/@aws-sdk/types/dist-cjs/checksum.js",".././node_modules/@aws-sdk/types/dist-cjs/client.js",".././node_modules/@aws-sdk/types/dist-cjs/command.js",".././node_modules/@aws-sdk/types/dist-cjs/connection.js",".././node_modules/@aws-sdk/types/dist-cjs/credentials.js",".././node_modules/@aws-sdk/types/dist-cjs/crypto.js",".././node_modules/@aws-sdk/types/dist-cjs/dns.js",".././node_modules/@aws-sdk/types/dist-cjs/encode.js",".././node_modules/@aws-sdk/types/dist-cjs/endpoint.js",".././node_modules/@aws-sdk/types/dist-cjs/eventStream.js",".././node_modules/@aws-sdk/types/dist-cjs/extensions/index.js",".././node_modules/@aws-sdk/types/dist-cjs/http.js",".././node_modules/@aws-sdk/types/dist-cjs/identity/AnonymousIdentity.js",".././node_modules/@aws-sdk/types/dist-cjs/identity/AwsCredentialIdentity.js",".././node_modules/@aws-sdk/types/dist-cjs/identity/Identity.js",".././node_modules/@aws-sdk/types/dist-cjs/identity/LoginIdentity.js",".././node_modules/@aws-sdk/types/dist-cjs/identity/TokenIdentity.js",".././node_modules/@aws-sdk/types/dist-cjs/identity/index.js",".././node_modules/@aws-sdk/types/dist-cjs/index.js",".././node_modules/@aws-sdk/types/dist-cjs/logger.js",".././node_modules/@aws-sdk/types/dist-cjs/middleware.js",".././node_modules/@aws-sdk/types/dist-cjs/pagination.js",".././node_modules/@aws-sdk/types/dist-cjs/profile.js",".././node_modules/@aws-sdk/types/dist-cjs/request.js",".././node_modules/@aws-sdk/types/dist-cjs/response.js",".././node_modules/@aws-sdk/types/dist-cjs/retry.js",".././node_modules/@aws-sdk/types/dist-cjs/serde.js",".././node_modules/@aws-sdk/types/dist-cjs/shapes.js",".././node_modules/@aws-sdk/types/dist-cjs/signature.js",".././node_modules/@aws-sdk/types/dist-cjs/stream.js",".././node_modules/@aws-sdk/types/dist-cjs/token.js",".././node_modules/@aws-sdk/types/dist-cjs/transfer.js",".././node_modules/@aws-sdk/types/dist-cjs/uri.js",".././node_modules/@aws-sdk/types/dist-cjs/util.js",".././node_modules/@aws-sdk/types/dist-cjs/waiter.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/debug/debugId.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/debug/index.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/debug/toDebugString.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/index.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/aws/index.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/aws/isVirtualHostableS3Bucket.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/aws/parseArn.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/aws/partition.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/booleanEquals.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/getAttr.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/getAttrPathList.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/index.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/isIpAddress.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/isSet.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/isValidHostLabel.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/not.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/parseURL.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/stringEquals.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/substring.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/uriEncode.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/resolveEndpoint.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/EndpointError.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/EndpointRuleObject.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/ErrorRuleObject.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/RuleSetObject.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/TreeRuleObject.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/index.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/shared.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/callFunction.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/evaluateCondition.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/evaluateConditions.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/evaluateEndpointRule.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/evaluateErrorRule.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/evaluateExpression.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/evaluateRules.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/evaluateTemplate.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/evaluateTreeRule.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/getEndpointHeaders.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/getEndpointProperties.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/getEndpointProperty.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/getEndpointUrl.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/getReferenceValue.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/utils/index.js",".././node_modules/@aws-sdk/util-user-agent-node/dist-cjs/crt-availability.js",".././node_modules/@aws-sdk/util-user-agent-node/dist-cjs/index.js",".././node_modules/@aws-sdk/util-user-agent-node/dist-cjs/is-crt-available.js",".././node_modules/@aws-sdk/util-utf8-browser/dist-cjs/index.js",".././node_modules/@aws-sdk/util-utf8-browser/dist-cjs/pureJs.js",".././node_modules/@aws-sdk/util-utf8-browser/dist-cjs/whatwgEncodingApi.js",".././node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js",".././node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js",".././node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js",".././node_modules/@fastify/busboy/deps/streamsearch/sbmh.js",".././node_modules/@fastify/busboy/lib/main.js",".././node_modules/@fastify/busboy/lib/types/multipart.js",".././node_modules/@fastify/busboy/lib/types/urlencoded.js",".././node_modules/@fastify/busboy/lib/utils/Decoder.js",".././node_modules/@fastify/busboy/lib/utils/basename.js",".././node_modules/@fastify/busboy/lib/utils/decodeText.js",".././node_modules/@fastify/busboy/lib/utils/getLimit.js",".././node_modules/@fastify/busboy/lib/utils/parseParams.js",".././node_modules/@octokit/auth-token/dist-node/index.js",".././node_modules/@octokit/core/dist-node/index.js",".././node_modules/@octokit/endpoint/dist-node/index.js",".././node_modules/@octokit/graphql/dist-node/index.js",".././node_modules/@octokit/plugin-paginate-rest/dist-node/index.js",".././node_modules/@octokit/plugin-rest-endpoint-methods/dist-node/index.js",".././node_modules/@octokit/request-error/dist-node/index.js",".././node_modules/@octokit/request/dist-node/index.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/NodeUseDualstackEndpointConfigOptions.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/NodeUseFipsEndpointConfigOptions.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/index.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/resolveCustomEndpointsConfig.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/resolveEndpointsConfig.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/utils/getEndpointFromRegion.js",".././node_modules/@smithy/config-resolver/dist-cjs/index.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionConfig/config.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionConfig/getRealRegion.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionConfig/index.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionConfig/isFipsRegion.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionConfig/resolveRegionConfig.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/PartitionHash.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/RegionHash.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/getHostnameFromVariants.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/getRegionInfo.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/getResolvedHostname.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/getResolvedPartition.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/getResolvedSigningRegion.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/index.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/config/Endpoint.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/config/EndpointConfigOptions.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/config/EndpointMode.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/config/EndpointModeConfigOptions.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/fromContainerMetadata.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/fromInstanceMetadata.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/index.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/remoteProvider/ImdsCredentials.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/remoteProvider/RemoteProviderInit.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/remoteProvider/httpRequest.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/remoteProvider/retry.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/types.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/utils/getExtendedInstanceMetadataCredentials.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/utils/getInstanceMetadataEndpoint.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/utils/staticStabilityProvider.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/EventStreamCodec.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/HeaderMarshaller.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/Int64.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/Message.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/MessageDecoderStream.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/MessageEncoderStream.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/SmithyMessageDecoderStream.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/SmithyMessageEncoderStream.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/index.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/splitMessage.js",".././node_modules/@smithy/hash-node/dist-cjs/index.js",".././node_modules/@smithy/is-array-buffer/dist-cjs/index.js",".././node_modules/@smithy/middleware-content-length/dist-cjs/index.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/createConfigValueProvider.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/getEndpointFromConfig.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/getEndpointFromInstructions.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/getEndpointUrlConfig.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/index.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/toEndpointV1.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/endpointMiddleware.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/getEndpointPlugin.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/index.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/resolveEndpointConfig.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/service-customizations/index.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/service-customizations/s3.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/types.js",".././node_modules/@smithy/middleware-retry/dist-cjs/AdaptiveRetryStrategy.js",".././node_modules/@smithy/middleware-retry/dist-cjs/StandardRetryStrategy.js",".././node_modules/@smithy/middleware-retry/dist-cjs/configurations.js",".././node_modules/@smithy/middleware-retry/dist-cjs/defaultRetryQuota.js",".././node_modules/@smithy/middleware-retry/dist-cjs/delayDecider.js",".././node_modules/@smithy/middleware-retry/dist-cjs/index.js",".././node_modules/@smithy/middleware-retry/dist-cjs/omitRetryHeadersMiddleware.js",".././node_modules/@smithy/middleware-retry/dist-cjs/retryDecider.js",".././node_modules/@smithy/middleware-retry/dist-cjs/retryMiddleware.js",".././node_modules/@smithy/middleware-retry/dist-cjs/util.js",".././node_modules/@smithy/middleware-serde/dist-cjs/deserializerMiddleware.js",".././node_modules/@smithy/middleware-serde/dist-cjs/index.js",".././node_modules/@smithy/middleware-serde/dist-cjs/serdePlugin.js",".././node_modules/@smithy/middleware-serde/dist-cjs/serializerMiddleware.js",".././node_modules/@smithy/middleware-stack/dist-cjs/MiddlewareStack.js",".././node_modules/@smithy/middleware-stack/dist-cjs/index.js",".././node_modules/@smithy/node-config-provider/dist-cjs/configLoader.js",".././node_modules/@smithy/node-config-provider/dist-cjs/fromEnv.js",".././node_modules/@smithy/node-config-provider/dist-cjs/fromSharedConfigFiles.js",".././node_modules/@smithy/node-config-provider/dist-cjs/fromStatic.js",".././node_modules/@smithy/node-config-provider/dist-cjs/index.js",".././node_modules/@smithy/node-http-handler/dist-cjs/constants.js",".././node_modules/@smithy/node-http-handler/dist-cjs/get-transformed-headers.js",".././node_modules/@smithy/node-http-handler/dist-cjs/index.js",".././node_modules/@smithy/node-http-handler/dist-cjs/node-http-handler.js",".././node_modules/@smithy/node-http-handler/dist-cjs/node-http2-connection-manager.js",".././node_modules/@smithy/node-http-handler/dist-cjs/node-http2-connection-pool.js",".././node_modules/@smithy/node-http-handler/dist-cjs/node-http2-handler.js",".././node_modules/@smithy/node-http-handler/dist-cjs/set-connection-timeout.js",".././node_modules/@smithy/node-http-handler/dist-cjs/set-socket-keep-alive.js",".././node_modules/@smithy/node-http-handler/dist-cjs/set-socket-timeout.js",".././node_modules/@smithy/node-http-handler/dist-cjs/stream-collector/collector.js",".././node_modules/@smithy/node-http-handler/dist-cjs/stream-collector/index.js",".././node_modules/@smithy/node-http-handler/dist-cjs/write-request-body.js",".././node_modules/@smithy/property-provider/dist-cjs/CredentialsProviderError.js",".././node_modules/@smithy/property-provider/dist-cjs/ProviderError.js",".././node_modules/@smithy/property-provider/dist-cjs/TokenProviderError.js",".././node_modules/@smithy/property-provider/dist-cjs/chain.js",".././node_modules/@smithy/property-provider/dist-cjs/fromStatic.js",".././node_modules/@smithy/property-provider/dist-cjs/index.js",".././node_modules/@smithy/property-provider/dist-cjs/memoize.js",".././node_modules/@smithy/protocol-http/dist-cjs/Field.js",".././node_modules/@smithy/protocol-http/dist-cjs/Fields.js",".././node_modules/@smithy/protocol-http/dist-cjs/extensions/httpExtensionConfiguration.js",".././node_modules/@smithy/protocol-http/dist-cjs/extensions/index.js",".././node_modules/@smithy/protocol-http/dist-cjs/httpHandler.js",".././node_modules/@smithy/protocol-http/dist-cjs/httpRequest.js",".././node_modules/@smithy/protocol-http/dist-cjs/httpResponse.js",".././node_modules/@smithy/protocol-http/dist-cjs/index.js",".././node_modules/@smithy/protocol-http/dist-cjs/isValidHostname.js",".././node_modules/@smithy/protocol-http/dist-cjs/types.js",".././node_modules/@smithy/querystring-builder/dist-cjs/index.js",".././node_modules/@smithy/querystring-parser/dist-cjs/index.js",".././node_modules/@smithy/service-error-classification/dist-cjs/constants.js",".././node_modules/@smithy/service-error-classification/dist-cjs/index.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getConfigData.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getConfigFilepath.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getCredentialsFilepath.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getHomeDir.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getProfileName.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getSSOTokenFilepath.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getSSOTokenFromFile.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getSsoSessionData.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/index.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/loadSharedConfigFiles.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/loadSsoSessionData.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/mergeConfigFiles.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/parseIni.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/parseKnownFiles.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/slurpFile.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/types.js",".././node_modules/@smithy/signature-v4/dist-cjs/SignatureV4.js",".././node_modules/@smithy/signature-v4/dist-cjs/cloneRequest.js",".././node_modules/@smithy/signature-v4/dist-cjs/constants.js",".././node_modules/@smithy/signature-v4/dist-cjs/credentialDerivation.js",".././node_modules/@smithy/signature-v4/dist-cjs/getCanonicalHeaders.js",".././node_modules/@smithy/signature-v4/dist-cjs/getCanonicalQuery.js",".././node_modules/@smithy/signature-v4/dist-cjs/getPayloadHash.js",".././node_modules/@smithy/signature-v4/dist-cjs/headerUtil.js",".././node_modules/@smithy/signature-v4/dist-cjs/index.js",".././node_modules/@smithy/signature-v4/dist-cjs/moveHeadersToQuery.js",".././node_modules/@smithy/signature-v4/dist-cjs/prepareRequest.js",".././node_modules/@smithy/signature-v4/dist-cjs/utilDate.js",".././node_modules/@smithy/smithy-client/dist-cjs/NoOpLogger.js",".././node_modules/@smithy/smithy-client/dist-cjs/client.js",".././node_modules/@smithy/smithy-client/dist-cjs/collect-stream-body.js",".././node_modules/@smithy/smithy-client/dist-cjs/command.js",".././node_modules/@smithy/smithy-client/dist-cjs/constants.js",".././node_modules/@smithy/smithy-client/dist-cjs/create-aggregated-client.js",".././node_modules/@smithy/smithy-client/dist-cjs/date-utils.js",".././node_modules/@smithy/smithy-client/dist-cjs/default-error-handler.js",".././node_modules/@smithy/smithy-client/dist-cjs/defaults-mode.js",".././node_modules/@smithy/smithy-client/dist-cjs/emitWarningIfUnsupportedVersion.js",".././node_modules/@smithy/smithy-client/dist-cjs/exceptions.js",".././node_modules/@smithy/smithy-client/dist-cjs/extended-encode-uri-component.js",".././node_modules/@smithy/smithy-client/dist-cjs/extensions/checksum.js",".././node_modules/@smithy/smithy-client/dist-cjs/extensions/defaultExtensionConfiguration.js",".././node_modules/@smithy/smithy-client/dist-cjs/extensions/index.js",".././node_modules/@smithy/smithy-client/dist-cjs/extensions/retry.js",".././node_modules/@smithy/smithy-client/dist-cjs/get-array-if-single-item.js",".././node_modules/@smithy/smithy-client/dist-cjs/get-value-from-text-node.js",".././node_modules/@smithy/smithy-client/dist-cjs/index.js",".././node_modules/@smithy/smithy-client/dist-cjs/lazy-json.js",".././node_modules/@smithy/smithy-client/dist-cjs/object-mapping.js",".././node_modules/@smithy/smithy-client/dist-cjs/parse-utils.js",".././node_modules/@smithy/smithy-client/dist-cjs/resolve-path.js",".././node_modules/@smithy/smithy-client/dist-cjs/ser-utils.js",".././node_modules/@smithy/smithy-client/dist-cjs/serde-json.js",".././node_modules/@smithy/smithy-client/dist-cjs/split-every.js",".././node_modules/@smithy/types/dist-cjs/abort.js",".././node_modules/@smithy/types/dist-cjs/auth.js",".././node_modules/@smithy/types/dist-cjs/blob/blob-payload-input-types.js",".././node_modules/@smithy/types/dist-cjs/checksum.js",".././node_modules/@smithy/types/dist-cjs/client.js",".././node_modules/@smithy/types/dist-cjs/command.js",".././node_modules/@smithy/types/dist-cjs/connection/config.js",".././node_modules/@smithy/types/dist-cjs/connection/index.js",".././node_modules/@smithy/types/dist-cjs/connection/manager.js",".././node_modules/@smithy/types/dist-cjs/connection/pool.js",".././node_modules/@smithy/types/dist-cjs/crypto.js",".././node_modules/@smithy/types/dist-cjs/encode.js",".././node_modules/@smithy/types/dist-cjs/endpoint.js",".././node_modules/@smithy/types/dist-cjs/endpoints/EndpointRuleObject.js",".././node_modules/@smithy/types/dist-cjs/endpoints/ErrorRuleObject.js",".././node_modules/@smithy/types/dist-cjs/endpoints/RuleSetObject.js",".././node_modules/@smithy/types/dist-cjs/endpoints/TreeRuleObject.js",".././node_modules/@smithy/types/dist-cjs/endpoints/index.js",".././node_modules/@smithy/types/dist-cjs/endpoints/shared.js",".././node_modules/@smithy/types/dist-cjs/eventStream.js",".././node_modules/@smithy/types/dist-cjs/extensions/checksum.js",".././node_modules/@smithy/types/dist-cjs/extensions/defaultClientConfiguration.js",".././node_modules/@smithy/types/dist-cjs/extensions/defaultExtensionConfiguration.js",".././node_modules/@smithy/types/dist-cjs/extensions/index.js",".././node_modules/@smithy/types/dist-cjs/http.js",".././node_modules/@smithy/types/dist-cjs/identity/awsCredentialIdentity.js",".././node_modules/@smithy/types/dist-cjs/identity/identity.js",".././node_modules/@smithy/types/dist-cjs/identity/index.js",".././node_modules/@smithy/types/dist-cjs/index.js",".././node_modules/@smithy/types/dist-cjs/logger.js",".././node_modules/@smithy/types/dist-cjs/middleware.js",".././node_modules/@smithy/types/dist-cjs/pagination.js",".././node_modules/@smithy/types/dist-cjs/profile.js",".././node_modules/@smithy/types/dist-cjs/response.js",".././node_modules/@smithy/types/dist-cjs/retry.js",".././node_modules/@smithy/types/dist-cjs/serde.js",".././node_modules/@smithy/types/dist-cjs/shapes.js",".././node_modules/@smithy/types/dist-cjs/signature.js",".././node_modules/@smithy/types/dist-cjs/stream.js",".././node_modules/@smithy/types/dist-cjs/streaming-payload/streaming-blob-common-types.js",".././node_modules/@smithy/types/dist-cjs/streaming-payload/streaming-blob-payload-input-types.js",".././node_modules/@smithy/types/dist-cjs/streaming-payload/streaming-blob-payload-output-types.js",".././node_modules/@smithy/types/dist-cjs/transfer.js",".././node_modules/@smithy/types/dist-cjs/transform/client-payload-blob-type-narrow.js",".././node_modules/@smithy/types/dist-cjs/transform/type-transform.js",".././node_modules/@smithy/types/dist-cjs/uri.js",".././node_modules/@smithy/types/dist-cjs/util.js",".././node_modules/@smithy/types/dist-cjs/waiter.js",".././node_modules/@smithy/url-parser/dist-cjs/index.js",".././node_modules/@smithy/util-base64/dist-cjs/fromBase64.js",".././node_modules/@smithy/util-base64/dist-cjs/index.js",".././node_modules/@smithy/util-base64/dist-cjs/toBase64.js",".././node_modules/@smithy/util-body-length-node/dist-cjs/calculateBodyLength.js",".././node_modules/@smithy/util-body-length-node/dist-cjs/index.js",".././node_modules/@smithy/util-buffer-from/dist-cjs/index.js",".././node_modules/@smithy/util-config-provider/dist-cjs/booleanSelector.js",".././node_modules/@smithy/util-config-provider/dist-cjs/index.js",".././node_modules/@smithy/util-defaults-mode-node/dist-cjs/constants.js",".././node_modules/@smithy/util-defaults-mode-node/dist-cjs/defaultsModeConfig.js",".././node_modules/@smithy/util-defaults-mode-node/dist-cjs/index.js",".././node_modules/@smithy/util-defaults-mode-node/dist-cjs/resolveDefaultsModeConfig.js",".././node_modules/@smithy/util-hex-encoding/dist-cjs/index.js",".././node_modules/@smithy/util-middleware/dist-cjs/getSmithyContext.js",".././node_modules/@smithy/util-middleware/dist-cjs/index.js",".././node_modules/@smithy/util-middleware/dist-cjs/normalizeProvider.js",".././node_modules/@smithy/util-retry/dist-cjs/AdaptiveRetryStrategy.js",".././node_modules/@smithy/util-retry/dist-cjs/ConfiguredRetryStrategy.js",".././node_modules/@smithy/util-retry/dist-cjs/DefaultRateLimiter.js",".././node_modules/@smithy/util-retry/dist-cjs/StandardRetryStrategy.js",".././node_modules/@smithy/util-retry/dist-cjs/config.js",".././node_modules/@smithy/util-retry/dist-cjs/constants.js",".././node_modules/@smithy/util-retry/dist-cjs/defaultRetryBackoffStrategy.js",".././node_modules/@smithy/util-retry/dist-cjs/defaultRetryToken.js",".././node_modules/@smithy/util-retry/dist-cjs/index.js",".././node_modules/@smithy/util-retry/dist-cjs/types.js",".././node_modules/@smithy/util-stream/dist-cjs/blob/Uint8ArrayBlobAdapter.js",".././node_modules/@smithy/util-stream/dist-cjs/blob/transforms.js",".././node_modules/@smithy/util-stream/dist-cjs/getAwsChunkedEncodingStream.js",".././node_modules/@smithy/util-stream/dist-cjs/index.js",".././node_modules/@smithy/util-stream/dist-cjs/sdk-stream-mixin.js",".././node_modules/@smithy/util-uri-escape/dist-cjs/escape-uri-path.js",".././node_modules/@smithy/util-uri-escape/dist-cjs/escape-uri.js",".././node_modules/@smithy/util-uri-escape/dist-cjs/index.js",".././node_modules/@smithy/util-utf8/dist-cjs/fromUtf8.js",".././node_modules/@smithy/util-utf8/dist-cjs/index.js",".././node_modules/@smithy/util-utf8/dist-cjs/toUint8Array.js",".././node_modules/@smithy/util-utf8/dist-cjs/toUtf8.js",".././node_modules/@smithy/util-waiter/dist-cjs/createWaiter.js",".././node_modules/@smithy/util-waiter/dist-cjs/index.js",".././node_modules/@smithy/util-waiter/dist-cjs/poller.js",".././node_modules/@smithy/util-waiter/dist-cjs/utils/index.js",".././node_modules/@smithy/util-waiter/dist-cjs/utils/sleep.js",".././node_modules/@smithy/util-waiter/dist-cjs/utils/validate.js",".././node_modules/@smithy/util-waiter/dist-cjs/waiter.js",".././node_modules/ansi-regex/index.js",".././node_modules/ansi-styles/index.js",".././node_modules/astral-regex/index.js",".././node_modules/before-after-hook/index.js",".././node_modules/before-after-hook/lib/add.js",".././node_modules/before-after-hook/lib/register.js",".././node_modules/before-after-hook/lib/remove.js",".././node_modules/chalk/source/index.js",".././node_modules/chalk/source/templates.js",".././node_modules/chalk/source/util.js",".././node_modules/color-convert/conversions.js",".././node_modules/color-convert/index.js",".././node_modules/color-convert/route.js",".././node_modules/color-name/index.js",".././node_modules/deprecation/dist-node/index.js",".././node_modules/diff/lib/convert/dmp.js",".././node_modules/diff/lib/convert/xml.js",".././node_modules/diff/lib/diff/array.js",".././node_modules/diff/lib/diff/base.js",".././node_modules/diff/lib/diff/character.js",".././node_modules/diff/lib/diff/css.js",".././node_modules/diff/lib/diff/json.js",".././node_modules/diff/lib/diff/line.js",".././node_modules/diff/lib/diff/sentence.js",".././node_modules/diff/lib/diff/word.js",".././node_modules/diff/lib/index.js",".././node_modules/diff/lib/patch/apply.js",".././node_modules/diff/lib/patch/create.js",".././node_modules/diff/lib/patch/merge.js",".././node_modules/diff/lib/patch/parse.js",".././node_modules/diff/lib/util/array.js",".././node_modules/diff/lib/util/distance-iterator.js",".././node_modules/diff/lib/util/params.js",".././node_modules/emoji-regex/index.js",".././node_modules/fast-deep-equal/index.js",".././node_modules/fast-xml-parser/src/fxp.js",".././node_modules/fast-xml-parser/src/util.js",".././node_modules/fast-xml-parser/src/validator.js",".././node_modules/fast-xml-parser/src/xmlbuilder/json2xml.js",".././node_modules/fast-xml-parser/src/xmlbuilder/orderedJs2Xml.js",".././node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js",".././node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js",".././node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js",".././node_modules/fast-xml-parser/src/xmlparser/XMLParser.js",".././node_modules/fast-xml-parser/src/xmlparser/node2json.js",".././node_modules/fast-xml-parser/src/xmlparser/xmlNode.js",".././node_modules/fs-extra/lib/copy/copy-sync.js",".././node_modules/fs-extra/lib/copy/copy.js",".././node_modules/fs-extra/lib/copy/index.js",".././node_modules/fs-extra/lib/empty/index.js",".././node_modules/fs-extra/lib/ensure/file.js",".././node_modules/fs-extra/lib/ensure/index.js",".././node_modules/fs-extra/lib/ensure/link.js",".././node_modules/fs-extra/lib/ensure/symlink-paths.js",".././node_modules/fs-extra/lib/ensure/symlink-type.js",".././node_modules/fs-extra/lib/ensure/symlink.js",".././node_modules/fs-extra/lib/fs/index.js",".././node_modules/fs-extra/lib/index.js",".././node_modules/fs-extra/lib/json/index.js",".././node_modules/fs-extra/lib/json/jsonfile.js",".././node_modules/fs-extra/lib/json/output-json-sync.js",".././node_modules/fs-extra/lib/json/output-json.js",".././node_modules/fs-extra/lib/mkdirs/index.js",".././node_modules/fs-extra/lib/mkdirs/make-dir.js",".././node_modules/fs-extra/lib/mkdirs/utils.js",".././node_modules/fs-extra/lib/move/index.js",".././node_modules/fs-extra/lib/move/move-sync.js",".././node_modules/fs-extra/lib/move/move.js",".././node_modules/fs-extra/lib/output-file/index.js",".././node_modules/fs-extra/lib/path-exists/index.js",".././node_modules/fs-extra/lib/remove/index.js",".././node_modules/fs-extra/lib/util/stat.js",".././node_modules/fs-extra/lib/util/utimes.js",".././node_modules/graceful-fs/clone.js",".././node_modules/graceful-fs/graceful-fs.js",".././node_modules/graceful-fs/legacy-streams.js",".././node_modules/graceful-fs/polyfills.js",".././node_modules/has-flag/index.js",".././node_modules/is-fullwidth-code-point/index.js",".././node_modules/is-plain-object/dist/is-plain-object.js",".././node_modules/jsonfile/index.js",".././node_modules/jsonfile/utils.js",".././node_modules/lodash.truncate/index.js",".././node_modules/once/once.js",".././node_modules/slice-ansi/index.js",".././node_modules/string-width/index.js",".././node_modules/strip-ansi/index.js",".././node_modules/strnum/strnum.js",".././node_modules/supports-color/index.js",".././node_modules/table/dist/src/alignSpanningCell.js",".././node_modules/table/dist/src/alignString.js",".././node_modules/table/dist/src/alignTableData.js",".././node_modules/table/dist/src/calculateCellHeight.js",".././node_modules/table/dist/src/calculateMaximumColumnWidths.js",".././node_modules/table/dist/src/calculateOutputColumnWidths.js",".././node_modules/table/dist/src/calculateRowHeights.js",".././node_modules/table/dist/src/calculateSpanningCellWidth.js",".././node_modules/table/dist/src/createStream.js",".././node_modules/table/dist/src/drawBorder.js",".././node_modules/table/dist/src/drawContent.js",".././node_modules/table/dist/src/drawRow.js",".././node_modules/table/dist/src/drawTable.js",".././node_modules/table/dist/src/generated/validators.js",".././node_modules/table/dist/src/getBorderCharacters.js",".././node_modules/table/dist/src/index.js",".././node_modules/table/dist/src/injectHeaderConfig.js",".././node_modules/table/dist/src/makeRangeConfig.js",".././node_modules/table/dist/src/makeStreamConfig.js",".././node_modules/table/dist/src/makeTableConfig.js",".././node_modules/table/dist/src/mapDataUsingRowHeights.js",".././node_modules/table/dist/src/padTableData.js",".././node_modules/table/dist/src/spanningCellManager.js",".././node_modules/table/dist/src/stringifyTableData.js",".././node_modules/table/dist/src/table.js",".././node_modules/table/dist/src/truncateTableData.js",".././node_modules/table/dist/src/types/api.js",".././node_modules/table/dist/src/utils.js",".././node_modules/table/dist/src/validateConfig.js",".././node_modules/table/dist/src/validateSpanningCellConfig.js",".././node_modules/table/dist/src/validateTableData.js",".././node_modules/table/dist/src/wrapCell.js",".././node_modules/table/dist/src/wrapString.js",".././node_modules/table/dist/src/wrapWord.js",".././node_modules/table/node_modules/ajv/dist/runtime/equal.js",".././node_modules/tslib/tslib.js",".././node_modules/tunnel/index.js",".././node_modules/tunnel/lib/tunnel.js",".././node_modules/undici/index.js",".././node_modules/undici/lib/agent.js",".././node_modules/undici/lib/api/abort-signal.js",".././node_modules/undici/lib/api/api-connect.js",".././node_modules/undici/lib/api/api-pipeline.js",".././node_modules/undici/lib/api/api-request.js",".././node_modules/undici/lib/api/api-stream.js",".././node_modules/undici/lib/api/api-upgrade.js",".././node_modules/undici/lib/api/index.js",".././node_modules/undici/lib/api/readable.js",".././node_modules/undici/lib/api/util.js",".././node_modules/undici/lib/balanced-pool.js",".././node_modules/undici/lib/cache/cache.js",".././node_modules/undici/lib/cache/cachestorage.js",".././node_modules/undici/lib/cache/symbols.js",".././node_modules/undici/lib/cache/util.js",".././node_modules/undici/lib/client.js",".././node_modules/undici/lib/compat/dispatcher-weakref.js",".././node_modules/undici/lib/cookies/constants.js",".././node_modules/undici/lib/cookies/index.js",".././node_modules/undici/lib/cookies/parse.js",".././node_modules/undici/lib/cookies/util.js",".././node_modules/undici/lib/core/connect.js",".././node_modules/undici/lib/core/errors.js",".././node_modules/undici/lib/core/request.js",".././node_modules/undici/lib/core/symbols.js",".././node_modules/undici/lib/core/util.js",".././node_modules/undici/lib/dispatcher-base.js",".././node_modules/undici/lib/dispatcher.js",".././node_modules/undici/lib/fetch/body.js",".././node_modules/undici/lib/fetch/constants.js",".././node_modules/undici/lib/fetch/dataURL.js",".././node_modules/undici/lib/fetch/file.js",".././node_modules/undici/lib/fetch/formdata.js",".././node_modules/undici/lib/fetch/global.js",".././node_modules/undici/lib/fetch/headers.js",".././node_modules/undici/lib/fetch/index.js",".././node_modules/undici/lib/fetch/request.js",".././node_modules/undici/lib/fetch/response.js",".././node_modules/undici/lib/fetch/symbols.js",".././node_modules/undici/lib/fetch/util.js",".././node_modules/undici/lib/fetch/webidl.js",".././node_modules/undici/lib/fileapi/encoding.js",".././node_modules/undici/lib/fileapi/filereader.js",".././node_modules/undici/lib/fileapi/progressevent.js",".././node_modules/undici/lib/fileapi/symbols.js",".././node_modules/undici/lib/fileapi/util.js",".././node_modules/undici/lib/global.js",".././node_modules/undici/lib/handler/DecoratorHandler.js",".././node_modules/undici/lib/handler/RedirectHandler.js",".././node_modules/undici/lib/interceptor/redirectInterceptor.js",".././node_modules/undici/lib/llhttp/constants.js",".././node_modules/undici/lib/llhttp/llhttp-wasm.js",".././node_modules/undici/lib/llhttp/llhttp_simd-wasm.js",".././node_modules/undici/lib/llhttp/utils.js",".././node_modules/undici/lib/mock/mock-agent.js",".././node_modules/undici/lib/mock/mock-client.js",".././node_modules/undici/lib/mock/mock-errors.js",".././node_modules/undici/lib/mock/mock-interceptor.js",".././node_modules/undici/lib/mock/mock-pool.js",".././node_modules/undici/lib/mock/mock-symbols.js",".././node_modules/undici/lib/mock/mock-utils.js",".././node_modules/undici/lib/mock/pending-interceptors-formatter.js",".././node_modules/undici/lib/mock/pluralizer.js",".././node_modules/undici/lib/node/fixed-queue.js",".././node_modules/undici/lib/pool-base.js",".././node_modules/undici/lib/pool-stats.js",".././node_modules/undici/lib/pool.js",".././node_modules/undici/lib/proxy-agent.js",".././node_modules/undici/lib/timers.js",".././node_modules/undici/lib/websocket/connection.js",".././node_modules/undici/lib/websocket/constants.js",".././node_modules/undici/lib/websocket/events.js",".././node_modules/undici/lib/websocket/frame.js",".././node_modules/undici/lib/websocket/receiver.js",".././node_modules/undici/lib/websocket/symbols.js",".././node_modules/undici/lib/websocket/util.js",".././node_modules/undici/lib/websocket/websocket.js",".././node_modules/universal-user-agent/dist-node/index.js",".././node_modules/universalify/index.js",".././node_modules/uuid/dist/index.js",".././node_modules/uuid/dist/md5.js",".././node_modules/uuid/dist/nil.js",".././node_modules/uuid/dist/parse.js",".././node_modules/uuid/dist/regex.js",".././node_modules/uuid/dist/rng.js",".././node_modules/uuid/dist/sha1.js",".././node_modules/uuid/dist/stringify.js",".././node_modules/uuid/dist/v1.js",".././node_modules/uuid/dist/v3.js",".././node_modules/uuid/dist/v35.js",".././node_modules/uuid/dist/v4.js",".././node_modules/uuid/dist/v5.js",".././node_modules/uuid/dist/validate.js",".././node_modules/uuid/dist/version.js",".././node_modules/wrappy/wrappy.js","../external node-commonjs \"assert\"","../external node-commonjs \"async_hooks\"","../external node-commonjs \"buffer\"","../external node-commonjs \"child_process\"","../external node-commonjs \"console\"","../external node-commonjs \"constants\"","../external node-commonjs \"crypto\"","../external node-commonjs \"diagnostics_channel\"","../external node-commonjs \"events\"","../external node-commonjs \"fs\"","../external node-commonjs \"fs/promises\"","../external node-commonjs \"http\"","../external node-commonjs \"http2\"","../external node-commonjs \"https\"","../external node-commonjs \"net\"","../external node-commonjs \"node:events\"","../external node-commonjs \"node:stream\"","../external node-commonjs \"node:util\"","../external node-commonjs \"os\"","../external node-commonjs \"path\"","../external node-commonjs \"perf_hooks\"","../external node-commonjs \"process\"","../external node-commonjs \"querystring\"","../external node-commonjs \"stream\"","../external node-commonjs \"stream/web\"","../external node-commonjs \"string_decoder\"","../external node-commonjs \"tls\"","../external node-commonjs \"tty\"","../external node-commonjs \"url\"","../external node-commonjs \"util\"","../external node-commonjs \"util/types\"","../external node-commonjs \"worker_threads\"","../external node-commonjs \"zlib\"","../webpack/bootstrap","../webpack/runtime/node module decorator","../webpack/runtime/compat","../webpack/before-startup","../webpack/startup","../webpack/after-startup"],"sourcesContent":["\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.run = void 0;\nconst core_1 = require(\"@actions/core\");\nconst github = __importStar(require(\"@actions/github\"));\nconst assembly_1 = require(\"./assembly\");\nconst comment_1 = require(\"./comment\");\nconst stage_processor_1 = require(\"./stage-processor\");\nasync function run() {\n const inputs = {\n allowedDestroyTypes: (0, core_1.getInput)('allowedDestroyTypes').split(','),\n failOnDestructiveChanges: (0, core_1.getBooleanInput)('failOnDestructiveChanges'),\n githubToken: (0, core_1.getInput)('githubToken'),\n };\n const octokit = github.getOctokit(inputs.githubToken);\n const context = github.context;\n try {\n const assembly = assembly_1.AssemblyManifestReader.fromPath('cdk.out');\n let stages = assembly.stages;\n if (!stages.length) {\n stages = [{\n name: 'DefaultStage',\n stacks: assembly.stacks,\n }];\n }\n const comments = new comment_1.Comments(octokit, context);\n const processor = new stage_processor_1.StageProcessor(stages, inputs.allowedDestroyTypes);\n try {\n await processor.processStages();\n }\n catch (e) {\n console.error('Error running process stages: ', e);\n throw e;\n }\n try {\n await processor.commentStages(comments);\n }\n catch (e) {\n console.error('Error commenting stages: ', e);\n throw e;\n }\n if (processor.hasDestructiveChanges && inputs.failOnDestructiveChanges) {\n throw new Error('There are destructive changes! See PR comment for details.');\n }\n }\n catch (e) {\n console.error('Error performing diff: ', e);\n throw e;\n }\n return;\n}\nexports.run = run;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUEwRDtBQUMxRCx3REFBMEM7QUFDMUMseUNBQW9EO0FBQ3BELHVDQUFxQztBQUVyQyx1REFBbUQ7QUFFNUMsS0FBSyxVQUFVLEdBQUc7SUFDdkIsTUFBTSxNQUFNLEdBQVc7UUFDckIsbUJBQW1CLEVBQUUsSUFBQSxlQUFRLEVBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQy9ELHdCQUF3QixFQUFFLElBQUEsc0JBQWUsRUFBQywwQkFBMEIsQ0FBQztRQUNyRSxXQUFXLEVBQUUsSUFBQSxlQUFRLEVBQUMsYUFBYSxDQUFDO0tBQ3JDLENBQUM7SUFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQy9CLElBQUk7UUFDRixNQUFNLFFBQVEsR0FBRyxpQ0FBc0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUQsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNsQixNQUFNLEdBQUcsQ0FBQztvQkFDUixJQUFJLEVBQUUsY0FBYztvQkFDcEIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2lCQUN4QixDQUFDLENBQUM7U0FDSjtRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksa0JBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxnQ0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN6RSxJQUFJO1lBQ0YsTUFBTSxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDakM7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLENBQUM7U0FDVDtRQUVELElBQUk7WUFDRixNQUFNLFNBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7U0FFekM7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLENBQUM7U0FDVDtRQUVELElBQUksU0FBUyxDQUFDLHFCQUFxQixJQUFJLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRTtZQUN0RSxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7U0FDL0U7S0FDRjtJQUFDLE9BQU8sQ0FBTSxFQUFFO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsQ0FBQztLQUNUO0lBQ0QsT0FBTztBQUNULENBQUM7QUExQ0Qsa0JBMENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0SW5wdXQsIGdldEJvb2xlYW5JbnB1dCB9IGZyb20gJ0BhY3Rpb25zL2NvcmUnO1xuaW1wb3J0ICogYXMgZ2l0aHViIGZyb20gJ0BhY3Rpb25zL2dpdGh1Yic7XG5pbXBvcnQgeyBBc3NlbWJseU1hbmlmZXN0UmVhZGVyIH0gZnJvbSAnLi9hc3NlbWJseSc7XG5pbXBvcnQgeyBDb21tZW50cyB9IGZyb20gJy4vY29tbWVudCc7XG5pbXBvcnQgeyBJbnB1dHMgfSBmcm9tICcuL2lucHV0cyc7XG5pbXBvcnQgeyBTdGFnZVByb2Nlc3NvciB9IGZyb20gJy4vc3RhZ2UtcHJvY2Vzc29yJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgY29uc3QgaW5wdXRzOiBJbnB1dHMgPSB7XG4gICAgYWxsb3dlZERlc3Ryb3lUeXBlczogZ2V0SW5wdXQoJ2FsbG93ZWREZXN0cm95VHlwZXMnKS5zcGxpdCgnLCcpLFxuICAgIGZhaWxPbkRlc3RydWN0aXZlQ2hhbmdlczogZ2V0Qm9vbGVhbklucHV0KCdmYWlsT25EZXN0cnVjdGl2ZUNoYW5nZXMnKSxcbiAgICBnaXRodWJUb2tlbjogZ2V0SW5wdXQoJ2dpdGh1YlRva2VuJyksXG4gIH07XG4gIGNvbnN0IG9jdG9raXQgPSBnaXRodWIuZ2V0T2N0b2tpdChpbnB1dHMuZ2l0aHViVG9rZW4pO1xuICBjb25zdCBjb250ZXh0ID0gZ2l0aHViLmNvbnRleHQ7XG4gIHRyeSB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLmZyb21QYXRoKCdjZGsub3V0Jyk7XG4gICAgbGV0IHN0YWdlcyA9IGFzc2VtYmx5LnN0YWdlcztcbiAgICBpZiAoIXN0YWdlcy5sZW5ndGgpIHtcbiAgICAgIHN0YWdlcyA9IFt7XG4gICAgICAgIG5hbWU6ICdEZWZhdWx0U3RhZ2UnLFxuICAgICAgICBzdGFja3M6IGFzc2VtYmx5LnN0YWNrcyxcbiAgICAgIH1dO1xuICAgIH1cbiAgICBjb25zdCBjb21tZW50cyA9IG5ldyBDb21tZW50cyhvY3Rva2l0LCBjb250ZXh0KTtcbiAgICBjb25zdCBwcm9jZXNzb3IgPSBuZXcgU3RhZ2VQcm9jZXNzb3Ioc3RhZ2VzLCBpbnB1dHMuYWxsb3dlZERlc3Ryb3lUeXBlcyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHByb2Nlc3Nvci5wcm9jZXNzU3RhZ2VzKCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBydW5uaW5nIHByb2Nlc3Mgc3RhZ2VzOiAnLCBlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHByb2Nlc3Nvci5jb21tZW50U3RhZ2VzKGNvbW1lbnRzKTtcblxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY29tbWVudGluZyBzdGFnZXM6ICcsIGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzc29yLmhhc0Rlc3RydWN0aXZlQ2hhbmdlcyAmJiBpbnB1dHMuZmFpbE9uRGVzdHJ1Y3RpdmVDaGFuZ2VzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGFyZSBkZXN0cnVjdGl2ZSBjaGFuZ2VzISBTZWUgUFIgY29tbWVudCBmb3IgZGV0YWlscy4nKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBlcmZvcm1pbmcgZGlmZjogJywgZSk7XG4gICAgdGhyb3cgZTtcbiAgfVxuICByZXR1cm47XG59XG5cbiJdfQ==","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AssemblyManifestReader = void 0;\nconst path = __importStar(require(\"path\"));\nconst cloud_assembly_schema_1 = require(\"@aws-cdk/cloud-assembly-schema\");\nconst fs = __importStar(require(\"fs-extra\"));\n/**\n * Reads a Cloud Assembly manifest\n */\nclass AssemblyManifestReader {\n /**\n * Reads a Cloud Assembly manifest from a file\n */\n static fromFile(fileName) {\n try {\n const obj = cloud_assembly_schema_1.Manifest.loadAssemblyManifest(fileName);\n return new AssemblyManifestReader(path.dirname(fileName), obj);\n }\n catch (e) {\n throw new Error(`Cannot read integ manifest '${fileName}': ${e.message}`);\n }\n }\n /**\n * Reads a Cloud Assembly manifest from a file or a directory\n * If the given filePath is a directory then it will look for\n * a file within the directory with the DEFAULT_FILENAME\n */\n static fromPath(filePath) {\n let st;\n try {\n st = fs.statSync(filePath);\n }\n catch (e) {\n throw new Error(`Cannot read integ manifest at '${filePath}': ${e.message}`);\n }\n if (st.isDirectory()) {\n return AssemblyManifestReader.fromFile(path.join(filePath, AssemblyManifestReader.DEFAULT_FILENAME));\n }\n return AssemblyManifestReader.fromFile(filePath);\n }\n constructor(directory, manifest) {\n this.manifest = manifest;\n this.directory = directory;\n }\n /**\n * Get the stacks from the manifest\n * returns a map of artifactId to CloudFormation template\n */\n get stacks() {\n var _a, _b, _c;\n const stacks = [];\n for (const [artifactId, artifact] of Object.entries((_a = this.manifest.artifacts) !== null && _a !== void 0 ? _a : {})) {\n if (artifact.type !== cloud_assembly_schema_1.ArtifactType.AWS_CLOUDFORMATION_STACK) {\n continue;\n }\n const props = artifact.properties;\n const template = fs.readJSONSync(path.resolve(this.directory, props.templateFile));\n const env = (_b = artifact.environment) === null || _b === void 0 ? void 0 : _b.split(/\\/\\/?/);\n let region = env && env.length === 3 ? env[2] : undefined;\n if (region === 'unknown-region') {\n region = undefined;\n }\n stacks.push({\n content: template,\n region,\n lookupRole: props.lookupRole,\n name: (_c = props.stackName) !== null && _c !== void 0 ? _c : artifactId,\n });\n }\n return stacks;\n }\n /**\n * Get the stages in the assembly\n */\n get stages() {\n var _a, _b;\n const stages = [];\n for (const [artifactId, artifact] of Object.entries((_a = this.manifest.artifacts) !== null && _a !== void 0 ? _a : {})) {\n if (artifact.type !== cloud_assembly_schema_1.ArtifactType.NESTED_CLOUD_ASSEMBLY) {\n continue;\n }\n const props = artifact.properties;\n const nestedAssembly = AssemblyManifestReader.fromPath(path.join(this.directory, props.directoryName));\n stages.push({\n name: (_b = props.displayName) !== null && _b !== void 0 ? _b : artifactId,\n stacks: nestedAssembly.stacks,\n });\n }\n return stages;\n }\n}\nexports.AssemblyManifestReader = AssemblyManifestReader;\nAssemblyManifestReader.DEFAULT_FILENAME = 'manifest.json';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXNzZW1ibHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsMEVBQTBLO0FBQzFLLDZDQUErQjtBQThDL0I7O0dBRUc7QUFDSCxNQUFhLHNCQUFzQjtJQUdqQzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBZ0I7UUFDckMsSUFBSTtZQUNGLE1BQU0sR0FBRyxHQUFHLGdDQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEQsT0FBTyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FFaEU7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLFFBQVEsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUMzRTtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFnQjtRQUNyQyxJQUFJLEVBQUUsQ0FBQztRQUNQLElBQUk7WUFDRixFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM1QjtRQUFDLE9BQU8sQ0FBTSxFQUFFO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsUUFBUSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzlFO1FBQ0QsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDcEIsT0FBTyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1NBQ3RHO1FBQ0QsT0FBTyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQU9ELFlBQVksU0FBaUIsRUFBbUIsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFDeEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsTUFBTTs7UUFDZixNQUFNLE1BQU0sR0FBZ0IsRUFBRSxDQUFDO1FBQy9CLEtBQUssTUFBTSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLG1DQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQ2xGLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxvQ0FBWSxDQUFDLHdCQUF3QixFQUFFO2dCQUFFLFNBQVM7YUFBRTtZQUMxRSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsVUFBOEMsQ0FBQztZQUN0RSxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNuRixNQUFNLEdBQUcsR0FBRyxNQUFBLFFBQVEsQ0FBQyxXQUFXLDBDQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRCxJQUFJLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFELElBQUksTUFBTSxLQUFLLGdCQUFnQixFQUFFO2dCQUMvQixNQUFNLEdBQUcsU0FBUyxDQUFDO2FBQ3BCO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixPQUFPLEVBQUUsUUFBUTtnQkFDakIsTUFBTTtnQkFDTixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLElBQUksRUFBRSxNQUFBLEtBQUssQ0FBQyxTQUFTLG1DQUFJLFVBQVU7YUFDcEMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLE1BQU07O1FBQ2YsTUFBTSxNQUFNLEdBQWdCLEVBQUUsQ0FBQztRQUMvQixLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxtQ0FBSSxFQUFFLENBQUMsRUFBRTtZQUNsRixJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssb0NBQVksQ0FBQyxxQkFBcUIsRUFBRTtnQkFBRSxTQUFTO2FBQUU7WUFDdkUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFVBQTJDLENBQUM7WUFDbkUsTUFBTSxjQUFjLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUN2RyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLElBQUksRUFBRSxNQUFBLEtBQUssQ0FBQyxXQUFXLG1DQUFJLFVBQVU7Z0JBQ3JDLE1BQU0sRUFBRSxjQUFjLENBQUMsTUFBTTthQUM5QixDQUFDLENBQUM7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O0FBbkZILHdEQW9GQztBQW5Gd0IsdUNBQWdCLEdBQUcsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFzc2VtYmx5TWFuaWZlc3QsIE1hbmlmZXN0LCBBcnRpZmFjdFR5cGUsIEF3c0Nsb3VkRm9ybWF0aW9uU3RhY2tQcm9wZXJ0aWVzLCBOZXN0ZWRDbG91ZEFzc2VtYmx5UHJvcGVydGllcywgQm9vdHN0cmFwUm9sZSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5cbi8qKlxuICogSW5mb3JtYXRpb24gb24gdGhlIENESyBTdGFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc3RhZ2VcbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YWNrcyB3aXRoaW4gdGhlIHN0YWdlXG4gICAqL1xuICBzdGFja3M6IFN0YWNrSW5mb1tdO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIG9uIGEgc3RhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFja0luZm8ge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHN0YWNrXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhlIHN0YWNrIGlzIGRlcGxveWVkIHRvXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5rbm93bi1yZWdpb25cbiAgICovXG4gIHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvb2t1cCByb2xlIHRvIHVzZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxvb2t1cCByb2xlXG4gICAqL1xuICBsb29rdXBSb2xlPzogQm9vdHN0cmFwUm9sZTtcblxuICAvKipcbiAgICogVGhlIEpTT04gY29udGVudCBvZiB0aGUgc3RhY2tcbiAgICovXG4gIGNvbnRlbnQ6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59XG5cbi8qKlxuICogUmVhZHMgYSBDbG91ZCBBc3NlbWJseSBtYW5pZmVzdFxuICovXG5leHBvcnQgY2xhc3MgQXNzZW1ibHlNYW5pZmVzdFJlYWRlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GSUxFTkFNRSA9ICdtYW5pZmVzdC5qc29uJztcblxuICAvKipcbiAgICogUmVhZHMgYSBDbG91ZCBBc3NlbWJseSBtYW5pZmVzdCBmcm9tIGEgZmlsZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRmlsZShmaWxlTmFtZTogc3RyaW5nKTogQXNzZW1ibHlNYW5pZmVzdFJlYWRlciB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9iaiA9IE1hbmlmZXN0LmxvYWRBc3NlbWJseU1hbmlmZXN0KGZpbGVOYW1lKTtcbiAgICAgIHJldHVybiBuZXcgQXNzZW1ibHlNYW5pZmVzdFJlYWRlcihwYXRoLmRpcm5hbWUoZmlsZU5hbWUpLCBvYmopO1xuXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGludGVnIG1hbmlmZXN0ICcke2ZpbGVOYW1lfSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIENsb3VkIEFzc2VtYmx5IG1hbmlmZXN0IGZyb20gYSBmaWxlIG9yIGEgZGlyZWN0b3J5XG4gICAqIElmIHRoZSBnaXZlbiBmaWxlUGF0aCBpcyBhIGRpcmVjdG9yeSB0aGVuIGl0IHdpbGwgbG9vayBmb3JcbiAgICogYSBmaWxlIHdpdGhpbiB0aGUgZGlyZWN0b3J5IHdpdGggdGhlIERFRkFVTFRfRklMRU5BTUVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIge1xuICAgIGxldCBzdDtcbiAgICB0cnkge1xuICAgICAgc3QgPSBmcy5zdGF0U3luYyhmaWxlUGF0aCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGludGVnIG1hbmlmZXN0IGF0ICcke2ZpbGVQYXRofSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoc3QuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcmV0dXJuIEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbUZpbGUocGF0aC5qb2luKGZpbGVQYXRoLCBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLkRFRkFVTFRfRklMRU5BTUUpKTtcbiAgICB9XG4gICAgcmV0dXJuIEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbUZpbGUoZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1hbmlmZXN0IHdhcyBmb3VuZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpcmVjdG9yeTogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0OiBBc3NlbWJseU1hbmlmZXN0KSB7XG4gICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdGFja3MgZnJvbSB0aGUgbWFuaWZlc3RcbiAgICogcmV0dXJucyBhIG1hcCBvZiBhcnRpZmFjdElkIHRvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YWNrcygpOiBTdGFja0luZm9bXSB7XG4gICAgY29uc3Qgc3RhY2tzOiBTdGFja0luZm9bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2FydGlmYWN0SWQsIGFydGlmYWN0XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm1hbmlmZXN0LmFydGlmYWN0cyA/PyB7fSkpIHtcbiAgICAgIGlmIChhcnRpZmFjdC50eXBlICE9PSBBcnRpZmFjdFR5cGUuQVdTX0NMT1VERk9STUFUSU9OX1NUQUNLKSB7IGNvbnRpbnVlOyB9XG4gICAgICBjb25zdCBwcm9wcyA9IGFydGlmYWN0LnByb3BlcnRpZXMgYXMgQXdzQ2xvdWRGb3JtYXRpb25TdGFja1Byb3BlcnRpZXM7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZzLnJlYWRKU09OU3luYyhwYXRoLnJlc29sdmUodGhpcy5kaXJlY3RvcnksIHByb3BzLnRlbXBsYXRlRmlsZSkpO1xuICAgICAgY29uc3QgZW52ID0gYXJ0aWZhY3QuZW52aXJvbm1lbnQ/LnNwbGl0KC9cXC9cXC8/Lyk7XG4gICAgICBsZXQgcmVnaW9uID0gZW52ICYmIGVudi5sZW5ndGggPT09IDMgPyBlbnZbMl0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocmVnaW9uID09PSAndW5rbm93bi1yZWdpb24nKSB7XG4gICAgICAgIHJlZ2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHN0YWNrcy5wdXNoKHtcbiAgICAgICAgY29udGVudDogdGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgbG9va3VwUm9sZTogcHJvcHMubG9va3VwUm9sZSxcbiAgICAgICAgbmFtZTogcHJvcHMuc3RhY2tOYW1lID8/IGFydGlmYWN0SWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0YWdlcyBpbiB0aGUgYXNzZW1ibHlcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhZ2VzKCk6IFN0YWdlSW5mb1tdIHtcbiAgICBjb25zdCBzdGFnZXM6IFN0YWdlSW5mb1tdID0gW107XG4gICAgZm9yIChjb25zdCBbYXJ0aWZhY3RJZCwgYXJ0aWZhY3RdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMubWFuaWZlc3QuYXJ0aWZhY3RzID8/IHt9KSkge1xuICAgICAgaWYgKGFydGlmYWN0LnR5cGUgIT09IEFydGlmYWN0VHlwZS5ORVNURURfQ0xPVURfQVNTRU1CTFkpIHsgY29udGludWU7IH1cbiAgICAgIGNvbnN0IHByb3BzID0gYXJ0aWZhY3QucHJvcGVydGllcyBhcyBOZXN0ZWRDbG91ZEFzc2VtYmx5UHJvcGVydGllcztcbiAgICAgIGNvbnN0IG5lc3RlZEFzc2VtYmx5ID0gQXNzZW1ibHlNYW5pZmVzdFJlYWRlci5mcm9tUGF0aChwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIHByb3BzLmRpcmVjdG9yeU5hbWUpKTtcbiAgICAgIHN0YWdlcy5wdXNoKHtcbiAgICAgICAgbmFtZTogcHJvcHMuZGlzcGxheU5hbWUgPz8gYXJ0aWZhY3RJZCxcbiAgICAgICAgc3RhY2tzOiBuZXN0ZWRBc3NlbWJseS5zdGFja3MsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YWdlcztcbiAgfVxufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Comments = void 0;\n/**\n * Comments controls interacting with GitHub to make comments\n */\nclass Comments {\n constructor(octokit, context) {\n var _a;\n this.octokit = octokit;\n this.context = context;\n const payload = context.payload;\n this.commitSha = payload.pull_request.head.sha;\n if (!payload.pull_request.number) {\n throw new Error('Cannot find PR number, is this from a pull request?');\n }\n this.issueNumber = (_a = this.context.payload.pull_request) === null || _a === void 0 ? void 0 : _a.number;\n }\n /**\n * Find the previous comment with the given hash\n *\n * @param hash the unique hash identifying the stage comment to look for\n * @returns the PR comment id or undefined if there is no previous comment\n */\n async findPrevious(hash) {\n var _a;\n const comments = await this.octokit.rest.issues.listComments({\n ...this.context.repo,\n issue_number: this.issueNumber,\n });\n return (_a = comments.data.find(comment => { var _a; return (_a = comment.body) === null || _a === void 0 ? void 0 : _a.includes(hash); })) === null || _a === void 0 ? void 0 : _a.id;\n }\n /**\n * Update an existing comment\n *\n * @param hash the unique hash identifying the stage comment to look for\n * @param content the content of the comment\n * @param commentId the id of the comment to update\n */\n async updateComment(commentId, hash, content) {\n await this.octokit.rest.issues.updateComment({\n ...this.context.repo,\n body: [\n ``,\n ...content,\n '',\n `_Generated for commit ${this.commitSha}_`,\n ].join('\\n'),\n comment_id: commentId,\n });\n }\n /**\n * Create a new comment\n *\n * @param hash the unique hash identifying the stage comment to look for\n * @param content the content of the comment\n */\n async createComment(hash, content) {\n await this.octokit.rest.issues.createComment({\n ...this.context.repo,\n body: [\n ``,\n ...content,\n '',\n `_Generated for commit ${this.commitSha}_`,\n ].join('\\n'),\n issue_number: this.issueNumber,\n });\n }\n}\nexports.Comments = Comments;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBOztHQUVHO0FBQ0gsTUFBYSxRQUFRO0lBR25CLFlBQ21CLE9BQW9DLEVBQ3BDLE9BQWdCOztRQURoQixZQUFPLEdBQVAsT0FBTyxDQUE2QjtRQUNwQyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBRWpDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUEyQixDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7U0FDeEU7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSwwQ0FBRSxNQUFPLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFZOztRQUNwQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFDM0QsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7WUFDcEIsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQy9CLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxXQUFDLE9BQUEsTUFBQSxPQUFPLENBQUMsSUFBSSwwQ0FBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBQSxDQUFDLDBDQUFFLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFpQixFQUFFLElBQVksRUFBRSxPQUFpQjtRQUMzRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFDM0MsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7WUFDcEIsSUFBSSxFQUFFO2dCQUNKLGtDQUFrQyxJQUFJLE1BQU07Z0JBQzVDLEdBQUcsT0FBTztnQkFDVixFQUFFO2dCQUNGLHlCQUF5QixJQUFJLENBQUMsU0FBUyxHQUFHO2FBQzNDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNaLFVBQVUsRUFBRSxTQUFTO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBWSxFQUFFLE9BQWlCO1FBQ3hELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUMzQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUNwQixJQUFJLEVBQUU7Z0JBQ0osa0NBQWtDLElBQUksTUFBTTtnQkFDNUMsR0FBRyxPQUFPO2dCQUNWLEVBQUU7Z0JBQ0YseUJBQXlCLElBQUksQ0FBQyxTQUFTLEdBQUc7YUFDM0MsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ1osWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQW5FRCw0QkFtRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnQGFjdGlvbnMvZ2l0aHViL2xpYi9jb250ZXh0JztcbmltcG9ydCB7IEdpdEh1YiB9IGZyb20gJ0BhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgUHVsbFJlcXVlc3RFdmVudCB9IGZyb20gJ0BvY3Rva2l0L3dlYmhvb2tzLWRlZmluaXRpb25zL3NjaGVtYSc7XG5cbi8qKlxuICogQ29tbWVudHMgY29udHJvbHMgaW50ZXJhY3Rpbmcgd2l0aCBHaXRIdWIgdG8gbWFrZSBjb21tZW50c1xuICovXG5leHBvcnQgY2xhc3MgQ29tbWVudHMge1xuICBwcml2YXRlIHJlYWRvbmx5IGlzc3VlTnVtYmVyOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWl0U2hhOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb2N0b2tpdDogSW5zdGFuY2VUeXBlPHR5cGVvZiBHaXRIdWI+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogQ29udGV4dCxcbiAgKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IGNvbnRleHQucGF5bG9hZCBhcyBQdWxsUmVxdWVzdEV2ZW50O1xuICAgIHRoaXMuY29tbWl0U2hhID0gcGF5bG9hZC5wdWxsX3JlcXVlc3QuaGVhZC5zaGE7XG4gICAgaWYgKCFwYXlsb2FkLnB1bGxfcmVxdWVzdC5udW1iZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgUFIgbnVtYmVyLCBpcyB0aGlzIGZyb20gYSBwdWxsIHJlcXVlc3Q/Jyk7XG4gICAgfVxuICAgIHRoaXMuaXNzdWVOdW1iZXIgPSB0aGlzLmNvbnRleHQucGF5bG9hZC5wdWxsX3JlcXVlc3Q/Lm51bWJlciE7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgcHJldmlvdXMgY29tbWVudCB3aXRoIHRoZSBnaXZlbiBoYXNoXG4gICAqXG4gICAqIEBwYXJhbSBoYXNoIHRoZSB1bmlxdWUgaGFzaCBpZGVudGlmeWluZyB0aGUgc3RhZ2UgY29tbWVudCB0byBsb29rIGZvclxuICAgKiBAcmV0dXJucyB0aGUgUFIgY29tbWVudCBpZCBvciB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgY29tbWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZpbmRQcmV2aW91cyhoYXNoOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGNvbW1lbnRzID0gYXdhaXQgdGhpcy5vY3Rva2l0LnJlc3QuaXNzdWVzLmxpc3RDb21tZW50cyh7XG4gICAgICAuLi50aGlzLmNvbnRleHQucmVwbyxcbiAgICAgIGlzc3VlX251bWJlcjogdGhpcy5pc3N1ZU51bWJlcixcbiAgICB9KTtcbiAgICByZXR1cm4gY29tbWVudHMuZGF0YS5maW5kKGNvbW1lbnQgPT4gY29tbWVudC5ib2R5Py5pbmNsdWRlcyhoYXNoKSk/LmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBjb21tZW50XG4gICAqXG4gICAqIEBwYXJhbSBoYXNoIHRoZSB1bmlxdWUgaGFzaCBpZGVudGlmeWluZyB0aGUgc3RhZ2UgY29tbWVudCB0byBsb29rIGZvclxuICAgKiBAcGFyYW0gY29udGVudCB0aGUgY29udGVudCBvZiB0aGUgY29tbWVudFxuICAgKiBAcGFyYW0gY29tbWVudElkIHRoZSBpZCBvZiB0aGUgY29tbWVudCB0byB1cGRhdGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVDb21tZW50KGNvbW1lbnRJZDogbnVtYmVyLCBoYXNoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZ1tdKSB7XG4gICAgYXdhaXQgdGhpcy5vY3Rva2l0LnJlc3QuaXNzdWVzLnVwZGF0ZUNvbW1lbnQoe1xuICAgICAgLi4udGhpcy5jb250ZXh0LnJlcG8sXG4gICAgICBib2R5OiBbXG4gICAgICAgIGA8IS0tIGNkayBkaWZmIGFjdGlvbiB3aXRoIGhhc2ggJHtoYXNofSAtLT5gLFxuICAgICAgICAuLi5jb250ZW50LFxuICAgICAgICAnJyxcbiAgICAgICAgYF9HZW5lcmF0ZWQgZm9yIGNvbW1pdCAke3RoaXMuY29tbWl0U2hhfV9gLFxuICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgIGNvbW1lbnRfaWQ6IGNvbW1lbnRJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgY29tbWVudFxuICAgKlxuICAgKiBAcGFyYW0gaGFzaCB0aGUgdW5pcXVlIGhhc2ggaWRlbnRpZnlpbmcgdGhlIHN0YWdlIGNvbW1lbnQgdG8gbG9vayBmb3JcbiAgICogQHBhcmFtIGNvbnRlbnQgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbW1lbnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVDb21tZW50KGhhc2g6IHN0cmluZywgY29udGVudDogc3RyaW5nW10pIHtcbiAgICBhd2FpdCB0aGlzLm9jdG9raXQucmVzdC5pc3N1ZXMuY3JlYXRlQ29tbWVudCh7XG4gICAgICAuLi50aGlzLmNvbnRleHQucmVwbyxcbiAgICAgIGJvZHk6IFtcbiAgICAgICAgYDwhLS0gY2RrIGRpZmYgYWN0aW9uIHdpdGggaGFzaCAke2hhc2h9IC0tPmAsXG4gICAgICAgIC4uLmNvbnRlbnQsXG4gICAgICAgICcnLFxuICAgICAgICBgX0dlbmVyYXRlZCBmb3IgY29tbWl0ICR7dGhpcy5jb21taXRTaGF9X2AsXG4gICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgaXNzdWVfbnVtYmVyOiB0aGlzLmlzc3VlTnVtYmVyLFxuICAgIH0pO1xuICB9XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StackDiff = void 0;\nconst cloudformation_diff_1 = require(\"@aws-cdk/cloudformation-diff\");\nconst client_cloudformation_1 = require(\"@aws-sdk/client-cloudformation\");\nconst credential_providers_1 = require(\"@aws-sdk/credential-providers\");\n/**\n * StackDiff performs the diff on a stack\n */\nclass StackDiff {\n constructor(stack, allowedDestroyTypes) {\n this.stack = stack;\n this.allowedDestroyTypes = allowedDestroyTypes;\n let credentials;\n // if there is a lookup role then assume that, otherwise\n // just use the default credentials\n credentials = stack.lookupRole ? (0, credential_providers_1.fromTemporaryCredentials)({\n params: {\n RoleArn: stack.lookupRole.arn.replace('${AWS::Partition}', 'aws'),\n RoleSessionName: 'cdk-diff-action',\n ExternalId: stack.lookupRole.assumeRoleExternalId,\n DurationSeconds: 900,\n },\n }) : undefined;\n this.client = new client_cloudformation_1.CloudFormationClient({\n credentials,\n region: this.stack.region,\n });\n }\n /** Performs the diff on the CloudFormation stack\n * This reads the existing stack from CFN and then uses the cloudformation-diff\n * package to perform the diff and collect additional information on the type of changes\n */\n async diffStack() {\n const cmd = new client_cloudformation_1.GetTemplateCommand({\n StackName: this.stack.name,\n });\n let existingTemplate = {};\n try {\n const res = await this.client.send(cmd);\n existingTemplate = res.TemplateBody ? JSON.parse(res.TemplateBody) : {};\n }\n catch (e) {\n if (e instanceof client_cloudformation_1.StackNotFoundException) {\n existingTemplate = {};\n }\n }\n try {\n const diff = (0, cloudformation_diff_1.diffTemplate)(existingTemplate, this.stack.content);\n const changes = this.evaluateDiff(this.stack.name, diff);\n return {\n diff,\n changes,\n };\n }\n catch (e) {\n console.error('Error getting remote template: ', e);\n throw e;\n }\n }\n evaluateDiff(templateId, templateDiff) {\n const changes = {\n createdResources: 0,\n removedResources: 0,\n updatedResources: 0,\n destructiveChanges: [],\n };\n // go through all the resource differences and check for any\n // \"destructive\" changes\n templateDiff.resources.forEachDifference((logicalId, change) => {\n var _a, _b, _c;\n // if the change is a removal it will not show up as a 'changeImpact'\n // so need to check for it separately, unless it is a resourceType that\n // has been \"allowed\" to be destroyed\n const resourceType = (_b = (_a = change.oldValue) === null || _a === void 0 ? void 0 : _a.Type) !== null && _b !== void 0 ? _b : (_c = change.newValue) === null || _c === void 0 ? void 0 : _c.Type;\n switch (resourceType) {\n case 'AWS::CDK::Metadata':\n return;\n case 'AWS::Lambda::Function':\n const keys = Object.keys(change.propertyUpdates);\n if (keys.length <= 2 &&\n keys.includes('Code') ||\n keys.includes('Metadata')) {\n return;\n }\n }\n if (change.isUpdate) {\n changes.updatedResources += 1;\n }\n else if (change.isRemoval) {\n changes.removedResources += 1;\n }\n else if (change.isAddition) {\n changes.createdResources += 1;\n }\n if (resourceType && this.allowedDestroyTypes.includes(resourceType)) {\n return;\n }\n if (change.isRemoval) {\n changes.destructiveChanges.push({\n impact: cloudformation_diff_1.ResourceImpact.WILL_DESTROY,\n logicalId,\n stackName: templateId,\n });\n }\n else {\n switch (change.changeImpact) {\n case cloudformation_diff_1.ResourceImpact.MAY_REPLACE:\n case cloudformation_diff_1.ResourceImpact.WILL_ORPHAN:\n case cloudformation_diff_1.ResourceImpact.WILL_DESTROY:\n case cloudformation_diff_1.ResourceImpact.WILL_REPLACE:\n changes.destructiveChanges.push({\n impact: change.changeImpact,\n logicalId,\n stackName: templateId,\n });\n break;\n }\n }\n });\n return changes;\n }\n}\nexports.StackDiff = StackDiff;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kaWZmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNFQUE4RztBQUM5RywwRUFBa0g7QUFDbEgsd0VBQXlFO0FBaUR6RTs7R0FFRztBQUNILE1BQWEsU0FBUztJQUVwQixZQUNtQixLQUFnQixFQUNoQixtQkFBNkI7UUFEN0IsVUFBSyxHQUFMLEtBQUssQ0FBVztRQUNoQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQVU7UUFFOUMsSUFBSSxXQUFzRCxDQUFDO1FBQzNELHdEQUF3RDtRQUN4RCxtQ0FBbUM7UUFDbkMsV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUEsK0NBQXdCLEVBQUM7WUFDeEQsTUFBTSxFQUFFO2dCQUNOLE9BQU8sRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDO2dCQUNqRSxlQUFlLEVBQUUsaUJBQWlCO2dCQUNsQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0I7Z0JBQ2pELGVBQWUsRUFBRSxHQUFHO2FBQ3JCO1NBQ0YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksNENBQW9CLENBQUM7WUFDckMsV0FBVztZQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUksMENBQWtCLENBQUM7WUFDakMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtTQUMzQixDQUFDLENBQUM7UUFDSCxJQUFJLGdCQUFnQixHQUEyQixFQUFFLENBQUM7UUFDbEQsSUFBSTtZQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN6RTtRQUFDLE9BQU8sQ0FBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFlBQVksOENBQXNCLEVBQUU7Z0JBQ3ZDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQzthQUN2QjtTQUNGO1FBQ0QsSUFBSTtZQUNGLE1BQU0sSUFBSSxHQUFHLElBQUEsa0NBQVksRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekQsT0FBTztnQkFDTCxJQUFJO2dCQUNKLE9BQU87YUFDUixDQUFDO1NBRUg7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEQsTUFBTSxDQUFDLENBQUM7U0FDVDtJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsVUFBa0IsRUFBRSxZQUEwQjtRQUNqRSxNQUFNLE9BQU8sR0FBa0I7WUFDN0IsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLGdCQUFnQixFQUFFLENBQUM7WUFDbkIsa0JBQWtCLEVBQUUsRUFBRTtTQUN2QixDQUFDO1FBQ0YsNERBQTREO1FBQzVELHdCQUF3QjtRQUN4QixZQUFZLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUMsU0FBaUIsRUFBRSxNQUEwQixFQUFFLEVBQUU7O1lBQ3pGLHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUscUNBQXFDO1lBQ3JDLE1BQU0sWUFBWSxHQUFHLE1BQUEsTUFBQSxNQUFNLENBQUMsUUFBUSwwQ0FBRSxJQUFJLG1DQUFJLE1BQUEsTUFBTSxDQUFDLFFBQVEsMENBQUUsSUFBSSxDQUFDO1lBQ3BFLFFBQVEsWUFBWSxFQUFFO2dCQUNwQixLQUFLLG9CQUFvQjtvQkFDdkIsT0FBTztnQkFDVCxLQUFLLHVCQUF1QjtvQkFDMUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ2pELElBQ0UsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDO3dCQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQzt3QkFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFDekI7d0JBQ0EsT0FBTztxQkFDUjthQUNKO1lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUNuQixPQUFPLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxDQUFDO2FBQy9CO2lCQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDM0IsT0FBTyxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FBQzthQUMvQjtpQkFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JBQzVCLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7YUFDL0I7WUFDRCxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNuRSxPQUFPO2FBQ1I7WUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Z0JBQ3BCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7b0JBQzlCLE1BQU0sRUFBRSxvQ0FBYyxDQUFDLFlBQVk7b0JBQ25DLFNBQVM7b0JBQ1QsU0FBUyxFQUFFLFVBQVU7aUJBQ3RCLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLFFBQVEsTUFBTSxDQUFDLFlBQVksRUFBRTtvQkFDM0IsS0FBSyxvQ0FBYyxDQUFDLFdBQVcsQ0FBQztvQkFDaEMsS0FBSyxvQ0FBYyxDQUFDLFdBQVcsQ0FBQztvQkFDaEMsS0FBSyxvQ0FBYyxDQUFDLFlBQVksQ0FBQztvQkFDakMsS0FBSyxvQ0FBYyxDQUFDLFlBQVk7d0JBQzlCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7NEJBQzlCLE1BQU0sRUFBRSxNQUFNLENBQUMsWUFBWTs0QkFDM0IsU0FBUzs0QkFDVCxTQUFTLEVBQUUsVUFBVTt5QkFDdEIsQ0FBQyxDQUFDO3dCQUNILE1BQU07aUJBQ1Q7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBbkhELDhCQW1IQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlRGlmZmVyZW5jZSwgUmVzb3VyY2VJbXBhY3QsIFRlbXBsYXRlRGlmZiwgZGlmZlRlbXBsYXRlIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvbkNsaWVudCwgR2V0VGVtcGxhdGVDb21tYW5kLCBTdGFja05vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IGZyb21UZW1wb3JhcnlDcmVkZW50aWFscyB9IGZyb20gJ0Bhd3Mtc2RrL2NyZWRlbnRpYWwtcHJvdmlkZXJzJztcbmltcG9ydCB7IEF3c0NyZWRlbnRpYWxJZGVudGl0eVByb3ZpZGVyIH0gZnJvbSAnQHNtaXRoeS90eXBlcyc7XG5pbXBvcnQgeyBTdGFja0luZm8gfSBmcm9tICcuL2Fzc2VtYmx5JztcblxuLyoqXG4gKiBEZXRhaWxzIG9uIHdoYXQgY2hhbmdlcyBhcmUgb2NjdXJyaW5nIGluIHRoaXMgc3RhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2VEZXRhaWxzIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIGJlaW5nIHVwZGF0ZWRcbiAgICovXG4gIHVwZGF0ZWRSZXNvdXJjZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByZXNvdXJjZXMgdGhhdCBhcmUgYmVpbmcgcmVtb3ZlZFxuICAgKi9cbiAgcmVtb3ZlZFJlc291cmNlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHJlc291cmNlcyB0aGF0IGFyZSBiZWluZyBjcmVhdGVkXG4gICAqL1xuICBjcmVhdGVkUmVzb3VyY2VzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIG9uIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzXG4gICAqL1xuICBkZXN0cnVjdGl2ZUNoYW5nZXM6IERlc3RydWN0aXZlQ2hhbmdlW107XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gb24gYW55IGRlc3RydWN0aXZlIGNoYW5nZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXN0cnVjdGl2ZUNoYW5nZSB7XG4gIC8qKlxuICAgKiBUaGUgbG9naWNhbElkIG9mIHRoZSByZXNvdXJjZSB3aXRoIGEgZGVzdHJ1Y3RpdmUgY2hhbmdlXG4gICAqL1xuICByZWFkb25seSBsb2dpY2FsSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHN0YWNrIHRoYXQgY29udGFpbnMgdGhlIGRlc3RydWN0aXZlIGNoYW5nZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbXBhY3Qgb2YgdGhlIGRlc3RydWN0aXZlIGNoYW5nZVxuICAgKi9cbiAgcmVhZG9ubHkgaW1wYWN0OiBSZXNvdXJjZUltcGFjdDtcbn1cblxuLyoqXG4gKiBTdGFja0RpZmYgcGVyZm9ybXMgdGhlIGRpZmYgb24gYSBzdGFja1xuICovXG5leHBvcnQgY2xhc3MgU3RhY2tEaWZmIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IENsb3VkRm9ybWF0aW9uQ2xpZW50O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrOiBTdGFja0luZm8sXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGxvd2VkRGVzdHJveVR5cGVzOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgbGV0IGNyZWRlbnRpYWxzOiBBd3NDcmVkZW50aWFsSWRlbnRpdHlQcm92aWRlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBpZiB0aGVyZSBpcyBhIGxvb2t1cCByb2xlIHRoZW4gYXNzdW1lIHRoYXQsIG90aGVyd2lzZVxuICAgIC8vIGp1c3QgdXNlIHRoZSBkZWZhdWx0IGNyZWRlbnRpYWxzXG4gICAgY3JlZGVudGlhbHMgPSBzdGFjay5sb29rdXBSb2xlID8gZnJvbVRlbXBvcmFyeUNyZWRlbnRpYWxzKHtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBSb2xlQXJuOiBzdGFjay5sb29rdXBSb2xlLmFybi5yZXBsYWNlKCcke0FXUzo6UGFydGl0aW9ufScsICdhd3MnKSxcbiAgICAgICAgUm9sZVNlc3Npb25OYW1lOiAnY2RrLWRpZmYtYWN0aW9uJyxcbiAgICAgICAgRXh0ZXJuYWxJZDogc3RhY2subG9va3VwUm9sZS5hc3N1bWVSb2xlRXh0ZXJuYWxJZCxcbiAgICAgICAgRHVyYXRpb25TZWNvbmRzOiA5MDAsXG4gICAgICB9LFxuICAgIH0pIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xpZW50ID0gbmV3IENsb3VkRm9ybWF0aW9uQ2xpZW50KHtcbiAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgcmVnaW9uOiB0aGlzLnN0YWNrLnJlZ2lvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBQZXJmb3JtcyB0aGUgZGlmZiBvbiB0aGUgQ2xvdWRGb3JtYXRpb24gc3RhY2tcbiAgICogVGhpcyByZWFkcyB0aGUgZXhpc3Rpbmcgc3RhY2sgZnJvbSBDRk4gYW5kIHRoZW4gdXNlcyB0aGUgY2xvdWRmb3JtYXRpb24tZGlmZlxuICAgKiBwYWNrYWdlIHRvIHBlcmZvcm0gdGhlIGRpZmYgYW5kIGNvbGxlY3QgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgdHlwZSBvZiBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlmZlN0YWNrKCk6IFByb21pc2U8eyBkaWZmOiBUZW1wbGF0ZURpZmY7IGNoYW5nZXM6IENoYW5nZURldGFpbHMgfT4ge1xuICAgIGNvbnN0IGNtZCA9IG5ldyBHZXRUZW1wbGF0ZUNvbW1hbmQoe1xuICAgICAgU3RhY2tOYW1lOiB0aGlzLnN0YWNrLm5hbWUsXG4gICAgfSk7XG4gICAgbGV0IGV4aXN0aW5nVGVtcGxhdGU6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChjbWQpO1xuICAgICAgZXhpc3RpbmdUZW1wbGF0ZSA9IHJlcy5UZW1wbGF0ZUJvZHkgPyBKU09OLnBhcnNlKHJlcy5UZW1wbGF0ZUJvZHkpIDoge307XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0YWNrTm90Rm91bmRFeGNlcHRpb24pIHtcbiAgICAgICAgZXhpc3RpbmdUZW1wbGF0ZSA9IHt9O1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlmZiA9IGRpZmZUZW1wbGF0ZShleGlzdGluZ1RlbXBsYXRlLCB0aGlzLnN0YWNrLmNvbnRlbnQpO1xuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuZXZhbHVhdGVEaWZmKHRoaXMuc3RhY2submFtZSwgZGlmZik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaWZmLFxuICAgICAgICBjaGFuZ2VzLFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0dGluZyByZW1vdGUgdGVtcGxhdGU6ICcsIGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlRGlmZih0ZW1wbGF0ZUlkOiBzdHJpbmcsIHRlbXBsYXRlRGlmZjogVGVtcGxhdGVEaWZmKTogQ2hhbmdlRGV0YWlscyB7XG4gICAgY29uc3QgY2hhbmdlczogQ2hhbmdlRGV0YWlscyA9IHtcbiAgICAgIGNyZWF0ZWRSZXNvdXJjZXM6IDAsXG4gICAgICByZW1vdmVkUmVzb3VyY2VzOiAwLFxuICAgICAgdXBkYXRlZFJlc291cmNlczogMCxcbiAgICAgIGRlc3RydWN0aXZlQ2hhbmdlczogW10sXG4gICAgfTtcbiAgICAvLyBnbyB0aHJvdWdoIGFsbCB0aGUgcmVzb3VyY2UgZGlmZmVyZW5jZXMgYW5kIGNoZWNrIGZvciBhbnlcbiAgICAvLyBcImRlc3RydWN0aXZlXCIgY2hhbmdlc1xuICAgIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMuZm9yRWFjaERpZmZlcmVuY2UoKGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFJlc291cmNlRGlmZmVyZW5jZSkgPT4ge1xuICAgICAgLy8gaWYgdGhlIGNoYW5nZSBpcyBhIHJlbW92YWwgaXQgd2lsbCBub3Qgc2hvdyB1cCBhcyBhICdjaGFuZ2VJbXBhY3QnXG4gICAgICAvLyBzbyBuZWVkIHRvIGNoZWNrIGZvciBpdCBzZXBhcmF0ZWx5LCB1bmxlc3MgaXQgaXMgYSByZXNvdXJjZVR5cGUgdGhhdFxuICAgICAgLy8gaGFzIGJlZW4gXCJhbGxvd2VkXCIgdG8gYmUgZGVzdHJveWVkXG4gICAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBjaGFuZ2Uub2xkVmFsdWU/LlR5cGUgPz8gY2hhbmdlLm5ld1ZhbHVlPy5UeXBlO1xuICAgICAgc3dpdGNoIChyZXNvdXJjZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnQVdTOjpDREs6Ok1ldGFkYXRhJzpcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbic6XG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNoYW5nZS5wcm9wZXJ0eVVwZGF0ZXMpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGtleXMubGVuZ3RoIDw9IDIgJiZcbiAgICAgICAgICAgIGtleXMuaW5jbHVkZXMoJ0NvZGUnKSB8fFxuICAgICAgICAgICAga2V5cy5pbmNsdWRlcygnTWV0YWRhdGEnKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2UuaXNVcGRhdGUpIHtcbiAgICAgICAgY2hhbmdlcy51cGRhdGVkUmVzb3VyY2VzICs9IDE7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZS5pc1JlbW92YWwpIHtcbiAgICAgICAgY2hhbmdlcy5yZW1vdmVkUmVzb3VyY2VzICs9IDE7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZS5pc0FkZGl0aW9uKSB7XG4gICAgICAgIGNoYW5nZXMuY3JlYXRlZFJlc291cmNlcyArPSAxO1xuICAgICAgfVxuICAgICAgaWYgKHJlc291cmNlVHlwZSAmJiB0aGlzLmFsbG93ZWREZXN0cm95VHlwZXMuaW5jbHVkZXMocmVzb3VyY2VUeXBlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuaXNSZW1vdmFsKSB7XG4gICAgICAgIGNoYW5nZXMuZGVzdHJ1Y3RpdmVDaGFuZ2VzLnB1c2goe1xuICAgICAgICAgIGltcGFjdDogUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZLFxuICAgICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoIChjaGFuZ2UuY2hhbmdlSW1wYWN0KSB7XG4gICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5NQVlfUkVQTEFDRTpcbiAgICAgICAgICBjYXNlIFJlc291cmNlSW1wYWN0LldJTExfT1JQSEFOOlxuICAgICAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZOlxuICAgICAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9SRVBMQUNFOlxuICAgICAgICAgICAgY2hhbmdlcy5kZXN0cnVjdGl2ZUNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgICAgIGltcGFjdDogY2hhbmdlLmNoYW5nZUltcGFjdCxcbiAgICAgICAgICAgICAgbG9naWNhbElkLFxuICAgICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cbn1cbiJdfQ==","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst core = __importStar(require(\"@actions/core\"));\nconst action_1 = require(\"./action\");\n(0, action_1.run)().catch((error) => {\n core.setFailed(error.message);\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUFzQztBQUN0QyxxQ0FBK0I7QUFFL0IsSUFBQSxZQUFHLEdBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtJQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvcmUgZnJvbSAnQGFjdGlvbnMvY29yZSc7XG5pbXBvcnQgeyBydW4gfSBmcm9tICcuL2FjdGlvbic7XG5cbnJ1bigpLmNhdGNoKChlcnJvcjogYW55KSA9PiB7XG4gIGNvcmUuc2V0RmFpbGVkKGVycm9yLm1lc3NhZ2UpO1xufSk7XG4iXX0=","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StageProcessor = void 0;\nconst crypto = __importStar(require(\"crypto\"));\nconst stream_1 = require(\"stream\");\nconst string_decoder_1 = require(\"string_decoder\");\nconst cloudformation_diff_1 = require(\"@aws-cdk/cloudformation-diff\");\nconst diff_1 = require(\"./diff\");\n/**\n * StageProcessor processes a CDK stage and creates a comment on the GitHub PR\n * detailing the stack diffs\n */\nclass StageProcessor {\n constructor(stages, allowedDestroyTypes) {\n this.stages = stages;\n this.allowedDestroyTypes = allowedDestroyTypes;\n this.stageComments = {};\n this.stages.forEach(stage => {\n this.stageComments[stage.name] = {\n destructiveChanges: 0,\n comment: [],\n hash: md5Hash(JSON.stringify({\n stageName: stage.name,\n ...stage.stacks.reduce((prev, curr) => {\n prev.stacks.push({\n name: curr.name,\n lookupRole: curr.lookupRole,\n region: curr.region,\n });\n return prev;\n }, { stacks: [] }), // we don't want the content to be part of the hash\n })),\n };\n });\n }\n /**\n * Process all of the stages. Once this has been run\n * the comment can be created with `commentStages()`\n */\n async processStages() {\n for (const stage of this.stages) {\n for (const stack of stage.stacks) {\n try {\n const { comment, changes } = await this.diffStack(stack);\n this.stageComments[stage.name].comment.push(...comment);\n this.stageComments[stage.name].destructiveChanges += changes;\n }\n catch (e) {\n console.error('Error processing stages: ', e);\n throw e;\n }\n }\n }\n }\n /**\n * Create the GitHub comment for the stage\n */\n async commentStages(comments) {\n for (const [stageName, info] of Object.entries(this.stageComments)) {\n const stageComment = this.getCommentForStage(stageName);\n const previous = await comments.findPrevious(info.hash);\n if (previous) {\n await comments.updateComment(previous, info.hash, stageComment);\n }\n else {\n await comments.createComment(info.hash, stageComment);\n }\n }\n }\n /**\n * Returns whether or not there are destructive changes in this stage\n */\n get hasDestructiveChanges() {\n for (const comments of Object.values(this.stageComments)) {\n if (comments.destructiveChanges) {\n return true;\n }\n }\n return false;\n }\n async diffStack(stack) {\n try {\n const stackDiff = new diff_1.StackDiff(stack, this.allowedDestroyTypes);\n const { diff, changes } = await stackDiff.diffStack();\n return {\n comment: this.formatStackComment(stack.name, diff, changes),\n changes: changes.destructiveChanges.length,\n };\n }\n catch (e) {\n console.error('Error performing stack diff: ', e);\n throw e;\n }\n }\n getEmoji(changes) {\n if (changes.destructiveChanges.length || changes.removedResources) {\n return ':x:';\n }\n else if (changes.updatedResources) {\n return ':yellow_circle:';\n }\n else if (changes.createdResources) {\n return ':sparkle:';\n }\n return ':white_check_mark:';\n }\n formatStackComment(stackName, diff, changes) {\n const output = [];\n const emoji = this.getEmoji(changes);\n if (diff.isEmpty) {\n output.push(`No Changes for stack: ${stackName}`);\n return output;\n }\n output.push(...[\n `#### Diff for stack: ${stackName} - ` +\n `***${changes.createdResources} to add, ${changes.updatedResources} to update, ${changes.removedResources} to destroy*** ` +\n emoji,\n '
Details',\n '',\n ]);\n if (changes.destructiveChanges.length) {\n output.push('> [!WARNING]\\n> ***Destructive Changes*** :bangbang:'),\n changes.destructiveChanges.forEach(change => {\n output.push(`> **Stack: ${change.stackName} - Resource: ${change.logicalId} - Impact:** ***${change.impact}***`);\n });\n }\n const writable = new StringWritable({});\n (0, cloudformation_diff_1.formatDifferences)(writable, diff);\n output.push('```shell');\n output.push(writable.data);\n output.push('```');\n output.push('
');\n output.push('');\n return output;\n }\n getCommentForStage(stageName) {\n const output = [];\n const stageComments = this.stageComments[stageName];\n if (!stageComments.comment.length) {\n return output;\n }\n output.push(`### Diff for stage: ${stageName}`);\n if (stageComments.destructiveChanges) {\n output.push(`> [!WARNING]\\n> ${stageComments.destructiveChanges} Destructive Changes`);\n }\n return output.concat(stageComments.comment);\n }\n}\nexports.StageProcessor = StageProcessor;\nclass StringWritable extends stream_1.Writable {\n constructor(options) {\n super(options);\n this._decoder = new string_decoder_1.StringDecoder();\n this.data = '';\n }\n _write(chunk, encoding, callback) {\n if (encoding === 'buffer') {\n chunk = this._decoder.write(chunk);\n }\n this.data += chunk;\n callback();\n }\n _final(callback) {\n this.data += this._decoder.end();\n callback();\n }\n}\nfunction md5Hash(val) {\n return crypto.createHash('md5').update(val).digest('hex');\n}\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2UtcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YWdlLXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyxtQ0FBbUQ7QUFDbkQsbURBQStDO0FBQy9DLHNFQUErRTtBQUcvRSxpQ0FBa0Q7QUF3QmxEOzs7R0FHRztBQUNILE1BQWEsY0FBYztJQUV6QixZQUNtQixNQUFtQixFQUNuQixtQkFBNkI7UUFEN0IsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUNuQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQVU7UUFIL0Isa0JBQWEsR0FBMEMsRUFBRSxDQUFDO1FBS3pFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHO2dCQUMvQixrQkFBa0IsRUFBRSxDQUFDO2dCQUNyQixPQUFPLEVBQUUsRUFBRTtnQkFDWCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDckIsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTt3QkFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7NEJBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJOzRCQUNmLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTs0QkFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO3lCQUNwQixDQUFDLENBQUM7d0JBQ0gsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBOEMsQ0FBQyxFQUFFLG1EQUFtRDtpQkFDcEgsQ0FBQyxDQUFDO2FBQ0osQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxhQUFhO1FBQ3hCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMvQixLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ2hDLElBQUk7b0JBQ0YsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3pELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztvQkFDeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsa0JBQWtCLElBQUksT0FBTyxDQUFDO2lCQUM5RDtnQkFBQyxPQUFPLENBQU0sRUFBRTtvQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM5QyxNQUFNLENBQUMsQ0FBQztpQkFDVDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQWtCO1FBQzNDLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNsRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLFFBQVEsRUFBRTtnQkFDWixNQUFNLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDakU7aUJBQU07Z0JBQ0wsTUFBTSxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDdkQ7U0FDRjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcscUJBQXFCO1FBQzlCLEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDeEQsSUFBSSxRQUFRLENBQUMsa0JBQWtCLEVBQUU7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBZ0I7UUFDdEMsSUFBSTtZQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksZ0JBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDakUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0RCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO2dCQUMzRCxPQUFPLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU07YUFDM0MsQ0FBQztTQUVIO1FBQUMsT0FBTyxDQUFNLEVBQUU7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sQ0FBQyxDQUFDO1NBQ1Q7SUFDSCxDQUFDO0lBRU8sUUFBUSxDQUFDLE9BQXNCO1FBQ3JDLElBQUksT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7WUFDakUsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFO1lBQ25DLE9BQU8saUJBQWlCLENBQUM7U0FDMUI7YUFBTSxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtZQUNuQyxPQUFPLFdBQVcsQ0FBQztTQUNwQjtRQUNELE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFNBQWlCLEVBQUUsSUFBa0IsRUFBRSxPQUFzQjtRQUN0RixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNsRCxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQ2Isd0JBQXdCLFNBQVMsS0FBSztnQkFDcEMsTUFBTSxPQUFPLENBQUMsZ0JBQWdCLFlBQVksT0FBTyxDQUFDLGdCQUFnQixlQUFlLE9BQU8sQ0FBQyxnQkFBZ0Isa0JBQWtCO2dCQUMzSCxLQUFLO1lBQ1AscUNBQXFDO1lBQ3JDLEVBQUU7U0FDSCxDQUFDLENBQUM7UUFDSCxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7WUFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxzREFBc0QsQ0FBQztnQkFDbkUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDMUMsTUFBTSxDQUFDLElBQUksQ0FDVCxjQUFjLE1BQU0sQ0FBQyxTQUFTLGdCQUFnQixNQUFNLENBQUMsU0FBUyxtQkFBbUIsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUNwRyxDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxJQUFBLHVDQUFpQixFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVsQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFHTyxrQkFBa0IsQ0FBQyxTQUFpQjtRQUMxQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDakMsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFaEQsSUFBSSxhQUFhLENBQUMsa0JBQWtCLEVBQUU7WUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsYUFBYSxDQUFDLGtCQUFrQixzQkFBc0IsQ0FBQyxDQUFDO1NBQ3hGO1FBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUFoSkQsd0NBZ0pDO0FBRUQsTUFBTSxjQUFlLFNBQVEsaUJBQVE7SUFHbkMsWUFBWSxPQUF3QjtRQUNsQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksOEJBQWEsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBVSxFQUFFLFFBQWdCLEVBQUUsUUFBd0M7UUFDM0UsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ3pCLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQztRQUVELElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDO1FBQ25CLFFBQVEsRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUF3QztRQUM3QyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUFFRCxTQUFTLE9BQU8sQ0FBQyxHQUFXO0lBQzFCLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBXcml0YWJsZSwgV3JpdGFibGVPcHRpb25zIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tICdzdHJpbmdfZGVjb2Rlcic7XG5pbXBvcnQgeyBUZW1wbGF0ZURpZmYsIGZvcm1hdERpZmZlcmVuY2VzIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgeyBTdGFja0luZm8sIFN0YWdlSW5mbyB9IGZyb20gJy4vYXNzZW1ibHknO1xuaW1wb3J0IHsgQ29tbWVudHMgfSBmcm9tICcuL2NvbW1lbnQnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0YWlscywgU3RhY2tEaWZmIH0gZnJvbSAnLi9kaWZmJztcblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBuZWVkZWQgdG8gbWFrZSBhIGNvbW1lbnQgZm9yIGEgQ0RLIFN0YWdlXG4gKi9cbmludGVyZmFjZSBTdGFnZUNvbW1lbnQge1xuICAvKipcbiAgICogVGhlIGZ1bGwgY29tbWVudC4gVGhlIGxpc3Qgd2lsbCBiZSBqb2luZWQgd2l0aCBcXG5cbiAgICovXG4gIGNvbW1lbnQ6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGhhc2ggZm9yIHRoZSBzdGFnZSBjb21tZW50XG4gICAqIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGxvb2t1cCB0aGUgc3RhZ2UgY29tbWVudCBvbiB0aGUgUFJcbiAgICogc28gdGhhdCBpdCBjYW4gYmUgb3ZlcndyaXR0ZW5cbiAgICovXG4gIGhhc2g6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkZXN0cnVjdGl2ZSBjaGFuZ2VzIGluIHRoaXMgc3RhZ2VcbiAgICovXG4gIGRlc3RydWN0aXZlQ2hhbmdlczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFN0YWdlUHJvY2Vzc29yIHByb2Nlc3NlcyBhIENESyBzdGFnZSBhbmQgY3JlYXRlcyBhIGNvbW1lbnQgb24gdGhlIEdpdEh1YiBQUlxuICogZGV0YWlsaW5nIHRoZSBzdGFjayBkaWZmc1xuICovXG5leHBvcnQgY2xhc3MgU3RhZ2VQcm9jZXNzb3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWdlQ29tbWVudHM6IHsgW3N0YWdlTmFtZTogc3RyaW5nXTogU3RhZ2VDb21tZW50IH0gPSB7fTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGFnZXM6IFN0YWdlSW5mb1tdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dlZERlc3Ryb3lUeXBlczogc3RyaW5nW10sXG4gICkge1xuICAgIHRoaXMuc3RhZ2VzLmZvckVhY2goc3RhZ2UgPT4ge1xuICAgICAgdGhpcy5zdGFnZUNvbW1lbnRzW3N0YWdlLm5hbWVdID0ge1xuICAgICAgICBkZXN0cnVjdGl2ZUNoYW5nZXM6IDAsXG4gICAgICAgIGNvbW1lbnQ6IFtdLFxuICAgICAgICBoYXNoOiBtZDVIYXNoKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBzdGFnZU5hbWU6IHN0YWdlLm5hbWUsXG4gICAgICAgICAgLi4uc3RhZ2Uuc3RhY2tzLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgICAgcHJldi5zdGFja3MucHVzaCh7XG4gICAgICAgICAgICAgIG5hbWU6IGN1cnIubmFtZSxcbiAgICAgICAgICAgICAgbG9va3VwUm9sZTogY3Vyci5sb29rdXBSb2xlLFxuICAgICAgICAgICAgICByZWdpb246IGN1cnIucmVnaW9uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgICB9LCB7IHN0YWNrczogW10gfSBhcyB7IHN0YWNrczogT21pdDxTdGFja0luZm8sICdjb250ZW50Jz5bXSB9KSwgLy8gd2UgZG9uJ3Qgd2FudCB0aGUgY29udGVudCB0byBiZSBwYXJ0IG9mIHRoZSBoYXNoXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhbGwgb2YgdGhlIHN0YWdlcy4gT25jZSB0aGlzIGhhcyBiZWVuIHJ1blxuICAgKiB0aGUgY29tbWVudCBjYW4gYmUgY3JlYXRlZCB3aXRoIGBjb21tZW50U3RhZ2VzKClgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJvY2Vzc1N0YWdlcygpIHtcbiAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIHRoaXMuc3RhZ2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWdlLnN0YWNrcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgY29tbWVudCwgY2hhbmdlcyB9ID0gYXdhaXQgdGhpcy5kaWZmU3RhY2soc3RhY2spO1xuICAgICAgICAgIHRoaXMuc3RhZ2VDb21tZW50c1tzdGFnZS5uYW1lXS5jb21tZW50LnB1c2goLi4uY29tbWVudCk7XG4gICAgICAgICAgdGhpcy5zdGFnZUNvbW1lbnRzW3N0YWdlLm5hbWVdLmRlc3RydWN0aXZlQ2hhbmdlcyArPSBjaGFuZ2VzO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIHN0YWdlczogJywgZSk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIEdpdEh1YiBjb21tZW50IGZvciB0aGUgc3RhZ2VcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb21tZW50U3RhZ2VzKGNvbW1lbnRzOiBDb21tZW50cykge1xuICAgIGZvciAoY29uc3QgW3N0YWdlTmFtZSwgaW5mb10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdGFnZUNvbW1lbnRzKSkge1xuICAgICAgY29uc3Qgc3RhZ2VDb21tZW50ID0gdGhpcy5nZXRDb21tZW50Rm9yU3RhZ2Uoc3RhZ2VOYW1lKTtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gYXdhaXQgY29tbWVudHMuZmluZFByZXZpb3VzKGluZm8uaGFzaCk7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgYXdhaXQgY29tbWVudHMudXBkYXRlQ29tbWVudChwcmV2aW91cywgaW5mby5oYXNoLCBzdGFnZUNvbW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgY29tbWVudHMuY3JlYXRlQ29tbWVudChpbmZvLmhhc2gsIHN0YWdlQ29tbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlcmUgYXJlIGRlc3RydWN0aXZlIGNoYW5nZXMgaW4gdGhpcyBzdGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBoYXNEZXN0cnVjdGl2ZUNoYW5nZXMoKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBjb21tZW50cyBvZiBPYmplY3QudmFsdWVzKHRoaXMuc3RhZ2VDb21tZW50cykpIHtcbiAgICAgIGlmIChjb21tZW50cy5kZXN0cnVjdGl2ZUNoYW5nZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlmZlN0YWNrKHN0YWNrOiBTdGFja0luZm8pOiBQcm9taXNlPHtjb21tZW50OiBzdHJpbmdbXTsgY2hhbmdlczogbnVtYmVyfT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFja0RpZmYgPSBuZXcgU3RhY2tEaWZmKHN0YWNrLCB0aGlzLmFsbG93ZWREZXN0cm95VHlwZXMpO1xuICAgICAgY29uc3QgeyBkaWZmLCBjaGFuZ2VzIH0gPSBhd2FpdCBzdGFja0RpZmYuZGlmZlN0YWNrKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tZW50OiB0aGlzLmZvcm1hdFN0YWNrQ29tbWVudChzdGFjay5uYW1lLCBkaWZmLCBjaGFuZ2VzKSxcbiAgICAgICAgY2hhbmdlczogY2hhbmdlcy5kZXN0cnVjdGl2ZUNoYW5nZXMubGVuZ3RoLFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGVyZm9ybWluZyBzdGFjayBkaWZmOiAnLCBlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbW9qaShjaGFuZ2VzOiBDaGFuZ2VEZXRhaWxzKTogc3RyaW5nIHtcbiAgICBpZiAoY2hhbmdlcy5kZXN0cnVjdGl2ZUNoYW5nZXMubGVuZ3RoIHx8IGNoYW5nZXMucmVtb3ZlZFJlc291cmNlcykge1xuICAgICAgcmV0dXJuICc6eDonO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlcy51cGRhdGVkUmVzb3VyY2VzKSB7XG4gICAgICByZXR1cm4gJzp5ZWxsb3dfY2lyY2xlOic7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VzLmNyZWF0ZWRSZXNvdXJjZXMpIHtcbiAgICAgIHJldHVybiAnOnNwYXJrbGU6JztcbiAgICB9XG4gICAgcmV0dXJuICc6d2hpdGVfY2hlY2tfbWFyazonO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRTdGFja0NvbW1lbnQoc3RhY2tOYW1lOiBzdHJpbmcsIGRpZmY6IFRlbXBsYXRlRGlmZiwgY2hhbmdlczogQ2hhbmdlRGV0YWlscyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBvdXRwdXQ6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZW1vamkgPSB0aGlzLmdldEVtb2ppKGNoYW5nZXMpO1xuICAgIGlmIChkaWZmLmlzRW1wdHkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGBObyBDaGFuZ2VzIGZvciBzdGFjazogJHtzdGFja05hbWV9YCk7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbiAgICBvdXRwdXQucHVzaCguLi5bXG4gICAgICBgIyMjIyBEaWZmIGZvciBzdGFjazogJHtzdGFja05hbWV9IC0gYCtcbiAgICAgICAgYCoqKiR7Y2hhbmdlcy5jcmVhdGVkUmVzb3VyY2VzfSB0byBhZGQsICR7Y2hhbmdlcy51cGRhdGVkUmVzb3VyY2VzfSB0byB1cGRhdGUsICR7Y2hhbmdlcy5yZW1vdmVkUmVzb3VyY2VzfSB0byBkZXN0cm95KioqICBgK1xuICAgICAgICBlbW9qaSxcbiAgICAgICc8ZGV0YWlscz48c3VtbWFyeT5EZXRhaWxzPC9zdW1tYXJ5PicsXG4gICAgICAnJyxcbiAgICBdKTtcbiAgICBpZiAoY2hhbmdlcy5kZXN0cnVjdGl2ZUNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICBvdXRwdXQucHVzaCgnPiBbIVdBUk5JTkddXFxuPiAqKipEZXN0cnVjdGl2ZSBDaGFuZ2VzKioqIDpiYW5nYmFuZzonKSxcbiAgICAgIGNoYW5nZXMuZGVzdHJ1Y3RpdmVDaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgICAgb3V0cHV0LnB1c2goXG4gICAgICAgICAgYD4gKipTdGFjazogJHtjaGFuZ2Uuc3RhY2tOYW1lfSAtIFJlc291cmNlOiAke2NoYW5nZS5sb2dpY2FsSWR9IC0gSW1wYWN0OioqICoqKiR7Y2hhbmdlLmltcGFjdH0qKipgLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFN0cmluZ1dyaXRhYmxlKHt9KTtcbiAgICBmb3JtYXREaWZmZXJlbmNlcyh3cml0YWJsZSwgZGlmZik7XG5cbiAgICBvdXRwdXQucHVzaCgnYGBgc2hlbGwnKTtcbiAgICBvdXRwdXQucHVzaCh3cml0YWJsZS5kYXRhKTtcbiAgICBvdXRwdXQucHVzaCgnYGBgJyk7XG4gICAgb3V0cHV0LnB1c2goJzwvZGV0YWlscz4nKTtcbiAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBnZXRDb21tZW50Rm9yU3RhZ2Uoc3RhZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgb3V0cHV0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHN0YWdlQ29tbWVudHMgPSB0aGlzLnN0YWdlQ29tbWVudHNbc3RhZ2VOYW1lXTtcbiAgICBpZiAoIXN0YWdlQ29tbWVudHMuY29tbWVudC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICAgIG91dHB1dC5wdXNoKGAjIyMgRGlmZiBmb3Igc3RhZ2U6ICR7c3RhZ2VOYW1lfWApO1xuXG4gICAgaWYgKHN0YWdlQ29tbWVudHMuZGVzdHJ1Y3RpdmVDaGFuZ2VzKSB7XG4gICAgICBvdXRwdXQucHVzaChgPiBbIVdBUk5JTkddXFxuPiAke3N0YWdlQ29tbWVudHMuZGVzdHJ1Y3RpdmVDaGFuZ2VzfSBEZXN0cnVjdGl2ZSBDaGFuZ2VzYCk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQuY29uY2F0KHN0YWdlQ29tbWVudHMuY29tbWVudCk7XG4gIH1cbn1cblxuY2xhc3MgU3RyaW5nV3JpdGFibGUgZXh0ZW5kcyBXcml0YWJsZSB7XG4gIHB1YmxpYyBkYXRhOiBzdHJpbmc7XG4gIHByaXZhdGUgX2RlY29kZXI6IFN0cmluZ0RlY29kZXI7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFdyaXRhYmxlT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcigpO1xuICAgIHRoaXMuZGF0YSA9ICcnO1xuICB9XG5cbiAgX3dyaXRlKGNodW5rOiBhbnksIGVuY29kaW5nOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICdidWZmZXInKSB7XG4gICAgICBjaHVuayA9IHRoaXMuX2RlY29kZXIud3JpdGUoY2h1bmspO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YSArPSBjaHVuaztcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX2ZpbmFsKGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEgKz0gdGhpcy5fZGVjb2Rlci5lbmQoKTtcbiAgICBjYWxsYmFjaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1kNUhhc2godmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZSh2YWwpLmRpZ2VzdCgnaGV4Jyk7XG59O1xuIl19","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.issue = exports.issueCommand = void 0;\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\n/**\n * Commands\n *\n * Command Format:\n * ::name key=value,key=value::message\n *\n * Examples:\n * ::warning::This is the message\n * ::set-env name=MY_VAR::some value\n */\nfunction issueCommand(command, properties, message) {\n const cmd = new Command(command, properties, message);\n process.stdout.write(cmd.toString() + os.EOL);\n}\nexports.issueCommand = issueCommand;\nfunction issue(name, message = '') {\n issueCommand(name, {}, message);\n}\nexports.issue = issue;\nconst CMD_STRING = '::';\nclass Command {\n constructor(command, properties, message) {\n if (!command) {\n command = 'missing.command';\n }\n this.command = command;\n this.properties = properties;\n this.message = message;\n }\n toString() {\n let cmdStr = CMD_STRING + this.command;\n if (this.properties && Object.keys(this.properties).length > 0) {\n cmdStr += ' ';\n let first = true;\n for (const key in this.properties) {\n if (this.properties.hasOwnProperty(key)) {\n const val = this.properties[key];\n if (val) {\n if (first) {\n first = false;\n }\n else {\n cmdStr += ',';\n }\n cmdStr += `${key}=${escapeProperty(val)}`;\n }\n }\n }\n }\n cmdStr += `${CMD_STRING}${escapeData(this.message)}`;\n return cmdStr;\n }\n}\nfunction escapeData(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A');\n}\nfunction escapeProperty(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n//# sourceMappingURL=command.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0;\nconst command_1 = require(\"./command\");\nconst file_command_1 = require(\"./file-command\");\nconst utils_1 = require(\"./utils\");\nconst os = __importStar(require(\"os\"));\nconst path = __importStar(require(\"path\"));\nconst oidc_utils_1 = require(\"./oidc-utils\");\n/**\n * The code to exit an action\n */\nvar ExitCode;\n(function (ExitCode) {\n /**\n * A code indicating that the action was successful\n */\n ExitCode[ExitCode[\"Success\"] = 0] = \"Success\";\n /**\n * A code indicating that the action was a failure\n */\n ExitCode[ExitCode[\"Failure\"] = 1] = \"Failure\";\n})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));\n//-----------------------------------------------------------------------\n// Variables\n//-----------------------------------------------------------------------\n/**\n * Sets env variable for this action and future actions in the job\n * @param name the name of the variable to set\n * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction exportVariable(name, val) {\n const convertedVal = utils_1.toCommandValue(val);\n process.env[name] = convertedVal;\n const filePath = process.env['GITHUB_ENV'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));\n }\n command_1.issueCommand('set-env', { name }, convertedVal);\n}\nexports.exportVariable = exportVariable;\n/**\n * Registers a secret which will get masked from logs\n * @param secret value of the secret\n */\nfunction setSecret(secret) {\n command_1.issueCommand('add-mask', {}, secret);\n}\nexports.setSecret = setSecret;\n/**\n * Prepends inputPath to the PATH (for this action and future actions)\n * @param inputPath\n */\nfunction addPath(inputPath) {\n const filePath = process.env['GITHUB_PATH'] || '';\n if (filePath) {\n file_command_1.issueFileCommand('PATH', inputPath);\n }\n else {\n command_1.issueCommand('add-path', {}, inputPath);\n }\n process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;\n}\nexports.addPath = addPath;\n/**\n * Gets the value of an input.\n * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed.\n * Returns an empty string if the value is not defined.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string\n */\nfunction getInput(name, options) {\n const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';\n if (options && options.required && !val) {\n throw new Error(`Input required and not supplied: ${name}`);\n }\n if (options && options.trimWhitespace === false) {\n return val;\n }\n return val.trim();\n}\nexports.getInput = getInput;\n/**\n * Gets the values of an multiline input. Each value is also trimmed.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string[]\n *\n */\nfunction getMultilineInput(name, options) {\n const inputs = getInput(name, options)\n .split('\\n')\n .filter(x => x !== '');\n if (options && options.trimWhitespace === false) {\n return inputs;\n }\n return inputs.map(input => input.trim());\n}\nexports.getMultilineInput = getMultilineInput;\n/**\n * Gets the input value of the boolean type in the YAML 1.2 \"core schema\" specification.\n * Support boolean input list: `true | True | TRUE | false | False | FALSE` .\n * The return value is also in boolean type.\n * ref: https://yaml.org/spec/1.2/spec.html#id2804923\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns boolean\n */\nfunction getBooleanInput(name, options) {\n const trueValue = ['true', 'True', 'TRUE'];\n const falseValue = ['false', 'False', 'FALSE'];\n const val = getInput(name, options);\n if (trueValue.includes(val))\n return true;\n if (falseValue.includes(val))\n return false;\n throw new TypeError(`Input does not meet YAML 1.2 \"Core Schema\" specification: ${name}\\n` +\n `Support boolean input list: \\`true | True | TRUE | false | False | FALSE\\``);\n}\nexports.getBooleanInput = getBooleanInput;\n/**\n * Sets the value of an output.\n *\n * @param name name of the output to set\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setOutput(name, value) {\n const filePath = process.env['GITHUB_OUTPUT'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));\n }\n process.stdout.write(os.EOL);\n command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));\n}\nexports.setOutput = setOutput;\n/**\n * Enables or disables the echoing of commands into stdout for the rest of the step.\n * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set.\n *\n */\nfunction setCommandEcho(enabled) {\n command_1.issue('echo', enabled ? 'on' : 'off');\n}\nexports.setCommandEcho = setCommandEcho;\n//-----------------------------------------------------------------------\n// Results\n//-----------------------------------------------------------------------\n/**\n * Sets the action status to failed.\n * When the action exits it will be with an exit code of 1\n * @param message add error issue message\n */\nfunction setFailed(message) {\n process.exitCode = ExitCode.Failure;\n error(message);\n}\nexports.setFailed = setFailed;\n//-----------------------------------------------------------------------\n// Logging Commands\n//-----------------------------------------------------------------------\n/**\n * Gets whether Actions Step Debug is on or not\n */\nfunction isDebug() {\n return process.env['RUNNER_DEBUG'] === '1';\n}\nexports.isDebug = isDebug;\n/**\n * Writes debug message to user log\n * @param message debug message\n */\nfunction debug(message) {\n command_1.issueCommand('debug', {}, message);\n}\nexports.debug = debug;\n/**\n * Adds an error issue\n * @param message error issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction error(message, properties = {}) {\n command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.error = error;\n/**\n * Adds a warning issue\n * @param message warning issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction warning(message, properties = {}) {\n command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.warning = warning;\n/**\n * Adds a notice issue\n * @param message notice issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction notice(message, properties = {}) {\n command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.notice = notice;\n/**\n * Writes info to log with console.log.\n * @param message info message\n */\nfunction info(message) {\n process.stdout.write(message + os.EOL);\n}\nexports.info = info;\n/**\n * Begin an output group.\n *\n * Output until the next `groupEnd` will be foldable in this group\n *\n * @param name The name of the output group\n */\nfunction startGroup(name) {\n command_1.issue('group', name);\n}\nexports.startGroup = startGroup;\n/**\n * End an output group.\n */\nfunction endGroup() {\n command_1.issue('endgroup');\n}\nexports.endGroup = endGroup;\n/**\n * Wrap an asynchronous function call in a group.\n *\n * Returns the same type as the function itself.\n *\n * @param name The name of the group\n * @param fn The function to wrap in the group\n */\nfunction group(name, fn) {\n return __awaiter(this, void 0, void 0, function* () {\n startGroup(name);\n let result;\n try {\n result = yield fn();\n }\n finally {\n endGroup();\n }\n return result;\n });\n}\nexports.group = group;\n//-----------------------------------------------------------------------\n// Wrapper action state\n//-----------------------------------------------------------------------\n/**\n * Saves state for current action, the state can only be retrieved by this action's post job execution.\n *\n * @param name name of the state to store\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction saveState(name, value) {\n const filePath = process.env['GITHUB_STATE'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));\n }\n command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));\n}\nexports.saveState = saveState;\n/**\n * Gets the value of an state set by this action's main execution.\n *\n * @param name name of the state to get\n * @returns string\n */\nfunction getState(name) {\n return process.env[`STATE_${name}`] || '';\n}\nexports.getState = getState;\nfunction getIDToken(aud) {\n return __awaiter(this, void 0, void 0, function* () {\n return yield oidc_utils_1.OidcClient.getIDToken(aud);\n });\n}\nexports.getIDToken = getIDToken;\n/**\n * Summary exports\n */\nvar summary_1 = require(\"./summary\");\nObject.defineProperty(exports, \"summary\", { enumerable: true, get: function () { return summary_1.summary; } });\n/**\n * @deprecated use core.summary\n */\nvar summary_2 = require(\"./summary\");\nObject.defineProperty(exports, \"markdownSummary\", { enumerable: true, get: function () { return summary_2.markdownSummary; } });\n/**\n * Path exports\n */\nvar path_utils_1 = require(\"./path-utils\");\nObject.defineProperty(exports, \"toPosixPath\", { enumerable: true, get: function () { return path_utils_1.toPosixPath; } });\nObject.defineProperty(exports, \"toWin32Path\", { enumerable: true, get: function () { return path_utils_1.toWin32Path; } });\nObject.defineProperty(exports, \"toPlatformPath\", { enumerable: true, get: function () { return path_utils_1.toPlatformPath; } });\n//# sourceMappingURL=core.js.map","\"use strict\";\n// For internal use, subject to change.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.prepareKeyValueMessage = exports.issueFileCommand = void 0;\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst fs = __importStar(require(\"fs\"));\nconst os = __importStar(require(\"os\"));\nconst uuid_1 = require(\"uuid\");\nconst utils_1 = require(\"./utils\");\nfunction issueFileCommand(command, message) {\n const filePath = process.env[`GITHUB_${command}`];\n if (!filePath) {\n throw new Error(`Unable to find environment variable for file command ${command}`);\n }\n if (!fs.existsSync(filePath)) {\n throw new Error(`Missing file at path: ${filePath}`);\n }\n fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, {\n encoding: 'utf8'\n });\n}\nexports.issueFileCommand = issueFileCommand;\nfunction prepareKeyValueMessage(key, value) {\n const delimiter = `ghadelimiter_${uuid_1.v4()}`;\n const convertedValue = utils_1.toCommandValue(value);\n // These should realistically never happen, but just in case someone finds a\n // way to exploit uuid generation let's not allow keys or values that contain\n // the delimiter.\n if (key.includes(delimiter)) {\n throw new Error(`Unexpected input: name should not contain the delimiter \"${delimiter}\"`);\n }\n if (convertedValue.includes(delimiter)) {\n throw new Error(`Unexpected input: value should not contain the delimiter \"${delimiter}\"`);\n }\n return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;\n}\nexports.prepareKeyValueMessage = prepareKeyValueMessage;\n//# sourceMappingURL=file-command.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OidcClient = void 0;\nconst http_client_1 = require(\"@actions/http-client\");\nconst auth_1 = require(\"@actions/http-client/lib/auth\");\nconst core_1 = require(\"./core\");\nclass OidcClient {\n static createHttpClient(allowRetry = true, maxRetry = 10) {\n const requestOptions = {\n allowRetries: allowRetry,\n maxRetries: maxRetry\n };\n return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions);\n }\n static getRequestToken() {\n const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN'];\n if (!token) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable');\n }\n return token;\n }\n static getIDTokenUrl() {\n const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL'];\n if (!runtimeUrl) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable');\n }\n return runtimeUrl;\n }\n static getCall(id_token_url) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const httpclient = OidcClient.createHttpClient();\n const res = yield httpclient\n .getJson(id_token_url)\n .catch(error => {\n throw new Error(`Failed to get ID Token. \\n \n Error Code : ${error.statusCode}\\n \n Error Message: ${error.message}`);\n });\n const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;\n if (!id_token) {\n throw new Error('Response json body do not have ID Token field');\n }\n return id_token;\n });\n }\n static getIDToken(audience) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n // New ID Token is requested from action service\n let id_token_url = OidcClient.getIDTokenUrl();\n if (audience) {\n const encodedAudience = encodeURIComponent(audience);\n id_token_url = `${id_token_url}&audience=${encodedAudience}`;\n }\n core_1.debug(`ID token url is ${id_token_url}`);\n const id_token = yield OidcClient.getCall(id_token_url);\n core_1.setSecret(id_token);\n return id_token;\n }\n catch (error) {\n throw new Error(`Error message: ${error.message}`);\n }\n });\n }\n}\nexports.OidcClient = OidcClient;\n//# sourceMappingURL=oidc-utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0;\nconst path = __importStar(require(\"path\"));\n/**\n * toPosixPath converts the given path to the posix form. On Windows, \\\\ will be\n * replaced with /.\n *\n * @param pth. Path to transform.\n * @return string Posix path.\n */\nfunction toPosixPath(pth) {\n return pth.replace(/[\\\\]/g, '/');\n}\nexports.toPosixPath = toPosixPath;\n/**\n * toWin32Path converts the given path to the win32 form. On Linux, / will be\n * replaced with \\\\.\n *\n * @param pth. Path to transform.\n * @return string Win32 path.\n */\nfunction toWin32Path(pth) {\n return pth.replace(/[/]/g, '\\\\');\n}\nexports.toWin32Path = toWin32Path;\n/**\n * toPlatformPath converts the given path to a platform-specific path. It does\n * this by replacing instances of / and \\ with the platform-specific path\n * separator.\n *\n * @param pth The path to platformize.\n * @return string The platform-specific path.\n */\nfunction toPlatformPath(pth) {\n return pth.replace(/[/\\\\]/g, path.sep);\n}\nexports.toPlatformPath = toPlatformPath;\n//# sourceMappingURL=path-utils.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0;\nconst os_1 = require(\"os\");\nconst fs_1 = require(\"fs\");\nconst { access, appendFile, writeFile } = fs_1.promises;\nexports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY';\nexports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary';\nclass Summary {\n constructor() {\n this._buffer = '';\n }\n /**\n * Finds the summary file path from the environment, rejects if env var is not found or file does not exist\n * Also checks r/w permissions.\n *\n * @returns step summary file path\n */\n filePath() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._filePath) {\n return this._filePath;\n }\n const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR];\n if (!pathFromEnv) {\n throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`);\n }\n try {\n yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK);\n }\n catch (_a) {\n throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`);\n }\n this._filePath = pathFromEnv;\n return this._filePath;\n });\n }\n /**\n * Wraps content in an HTML tag, adding any HTML attributes\n *\n * @param {string} tag HTML tag to wrap\n * @param {string | null} content content within the tag\n * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add\n *\n * @returns {string} content wrapped in HTML element\n */\n wrap(tag, content, attrs = {}) {\n const htmlAttrs = Object.entries(attrs)\n .map(([key, value]) => ` ${key}=\"${value}\"`)\n .join('');\n if (!content) {\n return `<${tag}${htmlAttrs}>`;\n }\n return `<${tag}${htmlAttrs}>${content}`;\n }\n /**\n * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default.\n *\n * @param {SummaryWriteOptions} [options] (optional) options for write operation\n *\n * @returns {Promise} summary instance\n */\n write(options) {\n return __awaiter(this, void 0, void 0, function* () {\n const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite);\n const filePath = yield this.filePath();\n const writeFunc = overwrite ? writeFile : appendFile;\n yield writeFunc(filePath, this._buffer, { encoding: 'utf8' });\n return this.emptyBuffer();\n });\n }\n /**\n * Clears the summary buffer and wipes the summary file\n *\n * @returns {Summary} summary instance\n */\n clear() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.emptyBuffer().write({ overwrite: true });\n });\n }\n /**\n * Returns the current summary buffer as a string\n *\n * @returns {string} string of summary buffer\n */\n stringify() {\n return this._buffer;\n }\n /**\n * If the summary buffer is empty\n *\n * @returns {boolen} true if the buffer is empty\n */\n isEmptyBuffer() {\n return this._buffer.length === 0;\n }\n /**\n * Resets the summary buffer without writing to summary file\n *\n * @returns {Summary} summary instance\n */\n emptyBuffer() {\n this._buffer = '';\n return this;\n }\n /**\n * Adds raw text to the summary buffer\n *\n * @param {string} text content to add\n * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false)\n *\n * @returns {Summary} summary instance\n */\n addRaw(text, addEOL = false) {\n this._buffer += text;\n return addEOL ? this.addEOL() : this;\n }\n /**\n * Adds the operating system-specific end-of-line marker to the buffer\n *\n * @returns {Summary} summary instance\n */\n addEOL() {\n return this.addRaw(os_1.EOL);\n }\n /**\n * Adds an HTML codeblock to the summary buffer\n *\n * @param {string} code content to render within fenced code block\n * @param {string} lang (optional) language to syntax highlight code\n *\n * @returns {Summary} summary instance\n */\n addCodeBlock(code, lang) {\n const attrs = Object.assign({}, (lang && { lang }));\n const element = this.wrap('pre', this.wrap('code', code), attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML list to the summary buffer\n *\n * @param {string[]} items list of items to render\n * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false)\n *\n * @returns {Summary} summary instance\n */\n addList(items, ordered = false) {\n const tag = ordered ? 'ol' : 'ul';\n const listItems = items.map(item => this.wrap('li', item)).join('');\n const element = this.wrap(tag, listItems);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML table to the summary buffer\n *\n * @param {SummaryTableCell[]} rows table rows\n *\n * @returns {Summary} summary instance\n */\n addTable(rows) {\n const tableBody = rows\n .map(row => {\n const cells = row\n .map(cell => {\n if (typeof cell === 'string') {\n return this.wrap('td', cell);\n }\n const { header, data, colspan, rowspan } = cell;\n const tag = header ? 'th' : 'td';\n const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan }));\n return this.wrap(tag, data, attrs);\n })\n .join('');\n return this.wrap('tr', cells);\n })\n .join('');\n const element = this.wrap('table', tableBody);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds a collapsable HTML details element to the summary buffer\n *\n * @param {string} label text for the closed state\n * @param {string} content collapsable content\n *\n * @returns {Summary} summary instance\n */\n addDetails(label, content) {\n const element = this.wrap('details', this.wrap('summary', label) + content);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML image tag to the summary buffer\n *\n * @param {string} src path to the image you to embed\n * @param {string} alt text description of the image\n * @param {SummaryImageOptions} options (optional) addition image attributes\n *\n * @returns {Summary} summary instance\n */\n addImage(src, alt, options) {\n const { width, height } = options || {};\n const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height }));\n const element = this.wrap('img', null, Object.assign({ src, alt }, attrs));\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML section heading element\n *\n * @param {string} text heading text\n * @param {number | string} [level=1] (optional) the heading level, default: 1\n *\n * @returns {Summary} summary instance\n */\n addHeading(text, level) {\n const tag = `h${level}`;\n const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag)\n ? tag\n : 'h1';\n const element = this.wrap(allowedTag, text);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML thematic break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addSeparator() {\n const element = this.wrap('hr', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML line break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addBreak() {\n const element = this.wrap('br', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML blockquote to the summary buffer\n *\n * @param {string} text quote text\n * @param {string} cite (optional) citation url\n *\n * @returns {Summary} summary instance\n */\n addQuote(text, cite) {\n const attrs = Object.assign({}, (cite && { cite }));\n const element = this.wrap('blockquote', text, attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML anchor tag to the summary buffer\n *\n * @param {string} text link text/content\n * @param {string} href hyperlink\n *\n * @returns {Summary} summary instance\n */\n addLink(text, href) {\n const element = this.wrap('a', text, { href });\n return this.addRaw(element).addEOL();\n }\n}\nconst _summary = new Summary();\n/**\n * @deprecated use `core.summary`\n */\nexports.markdownSummary = _summary;\nexports.summary = _summary;\n//# sourceMappingURL=summary.js.map","\"use strict\";\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toCommandProperties = exports.toCommandValue = void 0;\n/**\n * Sanitizes an input into a string so it can be passed into issueCommand safely\n * @param input input to sanitize into a string\n */\nfunction toCommandValue(input) {\n if (input === null || input === undefined) {\n return '';\n }\n else if (typeof input === 'string' || input instanceof String) {\n return input;\n }\n return JSON.stringify(input);\n}\nexports.toCommandValue = toCommandValue;\n/**\n *\n * @param annotationProperties\n * @returns The command properties to send with the actual annotation command\n * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646\n */\nfunction toCommandProperties(annotationProperties) {\n if (!Object.keys(annotationProperties).length) {\n return {};\n }\n return {\n title: annotationProperties.title,\n file: annotationProperties.file,\n line: annotationProperties.startLine,\n endLine: annotationProperties.endLine,\n col: annotationProperties.startColumn,\n endColumn: annotationProperties.endColumn\n };\n}\nexports.toCommandProperties = toCommandProperties;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Context = void 0;\nconst fs_1 = require(\"fs\");\nconst os_1 = require(\"os\");\nclass Context {\n /**\n * Hydrate the context from the environment\n */\n constructor() {\n var _a, _b, _c;\n this.payload = {};\n if (process.env.GITHUB_EVENT_PATH) {\n if ((0, fs_1.existsSync)(process.env.GITHUB_EVENT_PATH)) {\n this.payload = JSON.parse((0, fs_1.readFileSync)(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' }));\n }\n else {\n const path = process.env.GITHUB_EVENT_PATH;\n process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`);\n }\n }\n this.eventName = process.env.GITHUB_EVENT_NAME;\n this.sha = process.env.GITHUB_SHA;\n this.ref = process.env.GITHUB_REF;\n this.workflow = process.env.GITHUB_WORKFLOW;\n this.action = process.env.GITHUB_ACTION;\n this.actor = process.env.GITHUB_ACTOR;\n this.job = process.env.GITHUB_JOB;\n this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10);\n this.runId = parseInt(process.env.GITHUB_RUN_ID, 10);\n this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`;\n this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`;\n this.graphqlUrl =\n (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`;\n }\n get issue() {\n const payload = this.payload;\n return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number });\n }\n get repo() {\n if (process.env.GITHUB_REPOSITORY) {\n const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');\n return { owner, repo };\n }\n if (this.payload.repository) {\n return {\n owner: this.payload.repository.owner.login,\n repo: this.payload.repository.name\n };\n }\n throw new Error(\"context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'\");\n }\n}\nexports.Context = Context;\n//# sourceMappingURL=context.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getOctokit = exports.context = void 0;\nconst Context = __importStar(require(\"./context\"));\nconst utils_1 = require(\"./utils\");\nexports.context = new Context.Context();\n/**\n * Returns a hydrated octokit ready to use for GitHub Actions\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokit(token, options, ...additionalPlugins) {\n const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins);\n return new GitHubWithPlugins((0, utils_1.getOctokitOptions)(token, options));\n}\nexports.getOctokit = getOctokit;\n//# sourceMappingURL=github.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getApiBaseUrl = exports.getProxyFetch = exports.getProxyAgentDispatcher = exports.getProxyAgent = exports.getAuthString = void 0;\nconst httpClient = __importStar(require(\"@actions/http-client\"));\nconst undici_1 = require(\"undici\");\nfunction getAuthString(token, options) {\n if (!token && !options.auth) {\n throw new Error('Parameter token or opts.auth is required');\n }\n else if (token && options.auth) {\n throw new Error('Parameters token and opts.auth may not both be specified');\n }\n return typeof options.auth === 'string' ? options.auth : `token ${token}`;\n}\nexports.getAuthString = getAuthString;\nfunction getProxyAgent(destinationUrl) {\n const hc = new httpClient.HttpClient();\n return hc.getAgent(destinationUrl);\n}\nexports.getProxyAgent = getProxyAgent;\nfunction getProxyAgentDispatcher(destinationUrl) {\n const hc = new httpClient.HttpClient();\n return hc.getAgentDispatcher(destinationUrl);\n}\nexports.getProxyAgentDispatcher = getProxyAgentDispatcher;\nfunction getProxyFetch(destinationUrl) {\n const httpDispatcher = getProxyAgentDispatcher(destinationUrl);\n const proxyFetch = (url, opts) => __awaiter(this, void 0, void 0, function* () {\n return (0, undici_1.fetch)(url, Object.assign(Object.assign({}, opts), { dispatcher: httpDispatcher }));\n });\n return proxyFetch;\n}\nexports.getProxyFetch = getProxyFetch;\nfunction getApiBaseUrl() {\n return process.env['GITHUB_API_URL'] || 'https://api.github.com';\n}\nexports.getApiBaseUrl = getApiBaseUrl;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;\nconst Context = __importStar(require(\"./context\"));\nconst Utils = __importStar(require(\"./internal/utils\"));\n// octokit + plugins\nconst core_1 = require(\"@octokit/core\");\nconst plugin_rest_endpoint_methods_1 = require(\"@octokit/plugin-rest-endpoint-methods\");\nconst plugin_paginate_rest_1 = require(\"@octokit/plugin-paginate-rest\");\nexports.context = new Context.Context();\nconst baseUrl = Utils.getApiBaseUrl();\nexports.defaults = {\n baseUrl,\n request: {\n agent: Utils.getProxyAgent(baseUrl),\n fetch: Utils.getProxyFetch(baseUrl)\n }\n};\nexports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);\n/**\n * Convience function to correctly format Octokit Options to pass into the constructor.\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokitOptions(token, options) {\n const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller\n // Auth\n const auth = Utils.getAuthString(token, opts);\n if (auth) {\n opts.auth = auth;\n }\n return opts;\n}\nexports.getOctokitOptions = getOctokitOptions;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0;\nclass BasicCredentialHandler {\n constructor(username, password) {\n this.username = username;\n this.password = password;\n }\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BasicCredentialHandler = BasicCredentialHandler;\nclass BearerCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Bearer ${this.token}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BearerCredentialHandler = BearerCredentialHandler;\nclass PersonalAccessTokenCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;\n//# sourceMappingURL=auth.js.map","\"use strict\";\n/* eslint-disable @typescript-eslint/no-explicit-any */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0;\nconst http = __importStar(require(\"http\"));\nconst https = __importStar(require(\"https\"));\nconst pm = __importStar(require(\"./proxy\"));\nconst tunnel = __importStar(require(\"tunnel\"));\nconst undici_1 = require(\"undici\");\nvar HttpCodes;\n(function (HttpCodes) {\n HttpCodes[HttpCodes[\"OK\"] = 200] = \"OK\";\n HttpCodes[HttpCodes[\"MultipleChoices\"] = 300] = \"MultipleChoices\";\n HttpCodes[HttpCodes[\"MovedPermanently\"] = 301] = \"MovedPermanently\";\n HttpCodes[HttpCodes[\"ResourceMoved\"] = 302] = \"ResourceMoved\";\n HttpCodes[HttpCodes[\"SeeOther\"] = 303] = \"SeeOther\";\n HttpCodes[HttpCodes[\"NotModified\"] = 304] = \"NotModified\";\n HttpCodes[HttpCodes[\"UseProxy\"] = 305] = \"UseProxy\";\n HttpCodes[HttpCodes[\"SwitchProxy\"] = 306] = \"SwitchProxy\";\n HttpCodes[HttpCodes[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\n HttpCodes[HttpCodes[\"PermanentRedirect\"] = 308] = \"PermanentRedirect\";\n HttpCodes[HttpCodes[\"BadRequest\"] = 400] = \"BadRequest\";\n HttpCodes[HttpCodes[\"Unauthorized\"] = 401] = \"Unauthorized\";\n HttpCodes[HttpCodes[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n HttpCodes[HttpCodes[\"Forbidden\"] = 403] = \"Forbidden\";\n HttpCodes[HttpCodes[\"NotFound\"] = 404] = \"NotFound\";\n HttpCodes[HttpCodes[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\n HttpCodes[HttpCodes[\"NotAcceptable\"] = 406] = \"NotAcceptable\";\n HttpCodes[HttpCodes[\"ProxyAuthenticationRequired\"] = 407] = \"ProxyAuthenticationRequired\";\n HttpCodes[HttpCodes[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\n HttpCodes[HttpCodes[\"Conflict\"] = 409] = \"Conflict\";\n HttpCodes[HttpCodes[\"Gone\"] = 410] = \"Gone\";\n HttpCodes[HttpCodes[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\n HttpCodes[HttpCodes[\"InternalServerError\"] = 500] = \"InternalServerError\";\n HttpCodes[HttpCodes[\"NotImplemented\"] = 501] = \"NotImplemented\";\n HttpCodes[HttpCodes[\"BadGateway\"] = 502] = \"BadGateway\";\n HttpCodes[HttpCodes[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\n HttpCodes[HttpCodes[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\n})(HttpCodes || (exports.HttpCodes = HttpCodes = {}));\nvar Headers;\n(function (Headers) {\n Headers[\"Accept\"] = \"accept\";\n Headers[\"ContentType\"] = \"content-type\";\n})(Headers || (exports.Headers = Headers = {}));\nvar MediaTypes;\n(function (MediaTypes) {\n MediaTypes[\"ApplicationJson\"] = \"application/json\";\n})(MediaTypes || (exports.MediaTypes = MediaTypes = {}));\n/**\n * Returns the proxy URL, depending upon the supplied url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\nfunction getProxyUrl(serverUrl) {\n const proxyUrl = pm.getProxyUrl(new URL(serverUrl));\n return proxyUrl ? proxyUrl.href : '';\n}\nexports.getProxyUrl = getProxyUrl;\nconst HttpRedirectCodes = [\n HttpCodes.MovedPermanently,\n HttpCodes.ResourceMoved,\n HttpCodes.SeeOther,\n HttpCodes.TemporaryRedirect,\n HttpCodes.PermanentRedirect\n];\nconst HttpResponseRetryCodes = [\n HttpCodes.BadGateway,\n HttpCodes.ServiceUnavailable,\n HttpCodes.GatewayTimeout\n];\nconst RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];\nconst ExponentialBackoffCeiling = 10;\nconst ExponentialBackoffTimeSlice = 5;\nclass HttpClientError extends Error {\n constructor(message, statusCode) {\n super(message);\n this.name = 'HttpClientError';\n this.statusCode = statusCode;\n Object.setPrototypeOf(this, HttpClientError.prototype);\n }\n}\nexports.HttpClientError = HttpClientError;\nclass HttpClientResponse {\n constructor(message) {\n this.message = message;\n }\n readBody() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n let output = Buffer.alloc(0);\n this.message.on('data', (chunk) => {\n output = Buffer.concat([output, chunk]);\n });\n this.message.on('end', () => {\n resolve(output.toString());\n });\n }));\n });\n }\n readBodyBuffer() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n const chunks = [];\n this.message.on('data', (chunk) => {\n chunks.push(chunk);\n });\n this.message.on('end', () => {\n resolve(Buffer.concat(chunks));\n });\n }));\n });\n }\n}\nexports.HttpClientResponse = HttpClientResponse;\nfunction isHttps(requestUrl) {\n const parsedUrl = new URL(requestUrl);\n return parsedUrl.protocol === 'https:';\n}\nexports.isHttps = isHttps;\nclass HttpClient {\n constructor(userAgent, handlers, requestOptions) {\n this._ignoreSslError = false;\n this._allowRedirects = true;\n this._allowRedirectDowngrade = false;\n this._maxRedirects = 50;\n this._allowRetries = false;\n this._maxRetries = 1;\n this._keepAlive = false;\n this._disposed = false;\n this.userAgent = userAgent;\n this.handlers = handlers || [];\n this.requestOptions = requestOptions;\n if (requestOptions) {\n if (requestOptions.ignoreSslError != null) {\n this._ignoreSslError = requestOptions.ignoreSslError;\n }\n this._socketTimeout = requestOptions.socketTimeout;\n if (requestOptions.allowRedirects != null) {\n this._allowRedirects = requestOptions.allowRedirects;\n }\n if (requestOptions.allowRedirectDowngrade != null) {\n this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;\n }\n if (requestOptions.maxRedirects != null) {\n this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);\n }\n if (requestOptions.keepAlive != null) {\n this._keepAlive = requestOptions.keepAlive;\n }\n if (requestOptions.allowRetries != null) {\n this._allowRetries = requestOptions.allowRetries;\n }\n if (requestOptions.maxRetries != null) {\n this._maxRetries = requestOptions.maxRetries;\n }\n }\n }\n options(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});\n });\n }\n get(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('GET', requestUrl, null, additionalHeaders || {});\n });\n }\n del(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('DELETE', requestUrl, null, additionalHeaders || {});\n });\n }\n post(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('POST', requestUrl, data, additionalHeaders || {});\n });\n }\n patch(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('PATCH', requestUrl, data, additionalHeaders || {});\n });\n }\n put(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('PUT', requestUrl, data, additionalHeaders || {});\n });\n }\n head(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('HEAD', requestUrl, null, additionalHeaders || {});\n });\n }\n sendStream(verb, requestUrl, stream, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(verb, requestUrl, stream, additionalHeaders);\n });\n }\n /**\n * Gets a typed object from an endpoint\n * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise\n */\n getJson(requestUrl, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n const res = yield this.get(requestUrl, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n postJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.post(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n putJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.put(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n patchJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.patch(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n /**\n * Makes a raw http request.\n * All other methods such as get, post, patch, and request ultimately call this.\n * Prefer get, del, post and patch\n */\n request(verb, requestUrl, data, headers) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._disposed) {\n throw new Error('Client has already been disposed.');\n }\n const parsedUrl = new URL(requestUrl);\n let info = this._prepareRequest(verb, parsedUrl, headers);\n // Only perform retries on reads since writes may not be idempotent.\n const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb)\n ? this._maxRetries + 1\n : 1;\n let numTries = 0;\n let response;\n do {\n response = yield this.requestRaw(info, data);\n // Check if it's an authentication challenge\n if (response &&\n response.message &&\n response.message.statusCode === HttpCodes.Unauthorized) {\n let authenticationHandler;\n for (const handler of this.handlers) {\n if (handler.canHandleAuthentication(response)) {\n authenticationHandler = handler;\n break;\n }\n }\n if (authenticationHandler) {\n return authenticationHandler.handleAuthentication(this, info, data);\n }\n else {\n // We have received an unauthorized response but have no handlers to handle it.\n // Let the response return to the caller.\n return response;\n }\n }\n let redirectsRemaining = this._maxRedirects;\n while (response.message.statusCode &&\n HttpRedirectCodes.includes(response.message.statusCode) &&\n this._allowRedirects &&\n redirectsRemaining > 0) {\n const redirectUrl = response.message.headers['location'];\n if (!redirectUrl) {\n // if there's no location to redirect to, we won't\n break;\n }\n const parsedRedirectUrl = new URL(redirectUrl);\n if (parsedUrl.protocol === 'https:' &&\n parsedUrl.protocol !== parsedRedirectUrl.protocol &&\n !this._allowRedirectDowngrade) {\n throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');\n }\n // we need to finish reading the response before reassigning response\n // which will leak the open socket.\n yield response.readBody();\n // strip authorization header if redirected to a different hostname\n if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {\n for (const header in headers) {\n // header names are case insensitive\n if (header.toLowerCase() === 'authorization') {\n delete headers[header];\n }\n }\n }\n // let's make the request with the new redirectUrl\n info = this._prepareRequest(verb, parsedRedirectUrl, headers);\n response = yield this.requestRaw(info, data);\n redirectsRemaining--;\n }\n if (!response.message.statusCode ||\n !HttpResponseRetryCodes.includes(response.message.statusCode)) {\n // If not a retry code, return immediately instead of retrying\n return response;\n }\n numTries += 1;\n if (numTries < maxTries) {\n yield response.readBody();\n yield this._performExponentialBackoff(numTries);\n }\n } while (numTries < maxTries);\n return response;\n });\n }\n /**\n * Needs to be called if keepAlive is set to true in request options.\n */\n dispose() {\n if (this._agent) {\n this._agent.destroy();\n }\n this._disposed = true;\n }\n /**\n * Raw request.\n * @param info\n * @param data\n */\n requestRaw(info, data) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n function callbackForResult(err, res) {\n if (err) {\n reject(err);\n }\n else if (!res) {\n // If `err` is not passed, then `res` must be passed.\n reject(new Error('Unknown error'));\n }\n else {\n resolve(res);\n }\n }\n this.requestRawWithCallback(info, data, callbackForResult);\n });\n });\n }\n /**\n * Raw request with callback.\n * @param info\n * @param data\n * @param onResult\n */\n requestRawWithCallback(info, data, onResult) {\n if (typeof data === 'string') {\n if (!info.options.headers) {\n info.options.headers = {};\n }\n info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');\n }\n let callbackCalled = false;\n function handleResult(err, res) {\n if (!callbackCalled) {\n callbackCalled = true;\n onResult(err, res);\n }\n }\n const req = info.httpModule.request(info.options, (msg) => {\n const res = new HttpClientResponse(msg);\n handleResult(undefined, res);\n });\n let socket;\n req.on('socket', sock => {\n socket = sock;\n });\n // If we ever get disconnected, we want the socket to timeout eventually\n req.setTimeout(this._socketTimeout || 3 * 60000, () => {\n if (socket) {\n socket.end();\n }\n handleResult(new Error(`Request timeout: ${info.options.path}`));\n });\n req.on('error', function (err) {\n // err has statusCode property\n // res should have headers\n handleResult(err);\n });\n if (data && typeof data === 'string') {\n req.write(data, 'utf8');\n }\n if (data && typeof data !== 'string') {\n data.on('close', function () {\n req.end();\n });\n data.pipe(req);\n }\n else {\n req.end();\n }\n }\n /**\n * Gets an http agent. This function is useful when you need an http agent that handles\n * routing through a proxy server - depending upon the url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\n getAgent(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n return this._getAgent(parsedUrl);\n }\n getAgentDispatcher(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (!useProxy) {\n return;\n }\n return this._getProxyAgentDispatcher(parsedUrl, proxyUrl);\n }\n _prepareRequest(method, requestUrl, headers) {\n const info = {};\n info.parsedUrl = requestUrl;\n const usingSsl = info.parsedUrl.protocol === 'https:';\n info.httpModule = usingSsl ? https : http;\n const defaultPort = usingSsl ? 443 : 80;\n info.options = {};\n info.options.host = info.parsedUrl.hostname;\n info.options.port = info.parsedUrl.port\n ? parseInt(info.parsedUrl.port)\n : defaultPort;\n info.options.path =\n (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');\n info.options.method = method;\n info.options.headers = this._mergeHeaders(headers);\n if (this.userAgent != null) {\n info.options.headers['user-agent'] = this.userAgent;\n }\n info.options.agent = this._getAgent(info.parsedUrl);\n // gives handlers an opportunity to participate\n if (this.handlers) {\n for (const handler of this.handlers) {\n handler.prepareRequest(info.options);\n }\n }\n return info;\n }\n _mergeHeaders(headers) {\n if (this.requestOptions && this.requestOptions.headers) {\n return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {}));\n }\n return lowercaseKeys(headers || {});\n }\n _getExistingOrDefaultHeader(additionalHeaders, header, _default) {\n let clientHeader;\n if (this.requestOptions && this.requestOptions.headers) {\n clientHeader = lowercaseKeys(this.requestOptions.headers)[header];\n }\n return additionalHeaders[header] || clientHeader || _default;\n }\n _getAgent(parsedUrl) {\n let agent;\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (this._keepAlive && useProxy) {\n agent = this._proxyAgent;\n }\n if (this._keepAlive && !useProxy) {\n agent = this._agent;\n }\n // if agent is already assigned use that agent.\n if (agent) {\n return agent;\n }\n const usingSsl = parsedUrl.protocol === 'https:';\n let maxSockets = 100;\n if (this.requestOptions) {\n maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;\n }\n // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis.\n if (proxyUrl && proxyUrl.hostname) {\n const agentOptions = {\n maxSockets,\n keepAlive: this._keepAlive,\n proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && {\n proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`\n })), { host: proxyUrl.hostname, port: proxyUrl.port })\n };\n let tunnelAgent;\n const overHttps = proxyUrl.protocol === 'https:';\n if (usingSsl) {\n tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;\n }\n else {\n tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;\n }\n agent = tunnelAgent(agentOptions);\n this._proxyAgent = agent;\n }\n // if reusing agent across request and tunneling agent isn't assigned create a new agent\n if (this._keepAlive && !agent) {\n const options = { keepAlive: this._keepAlive, maxSockets };\n agent = usingSsl ? new https.Agent(options) : new http.Agent(options);\n this._agent = agent;\n }\n // if not using private agent and tunnel agent isn't setup then use global agent\n if (!agent) {\n agent = usingSsl ? https.globalAgent : http.globalAgent;\n }\n if (usingSsl && this._ignoreSslError) {\n // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n agent.options = Object.assign(agent.options || {}, {\n rejectUnauthorized: false\n });\n }\n return agent;\n }\n _getProxyAgentDispatcher(parsedUrl, proxyUrl) {\n let proxyAgent;\n if (this._keepAlive) {\n proxyAgent = this._proxyAgentDispatcher;\n }\n // if agent is already assigned use that agent.\n if (proxyAgent) {\n return proxyAgent;\n }\n const usingSsl = parsedUrl.protocol === 'https:';\n proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && {\n token: `${proxyUrl.username}:${proxyUrl.password}`\n })));\n this._proxyAgentDispatcher = proxyAgent;\n if (usingSsl && this._ignoreSslError) {\n // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, {\n rejectUnauthorized: false\n });\n }\n return proxyAgent;\n }\n _performExponentialBackoff(retryNumber) {\n return __awaiter(this, void 0, void 0, function* () {\n retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);\n const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);\n return new Promise(resolve => setTimeout(() => resolve(), ms));\n });\n }\n _processResponse(res, options) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n const statusCode = res.message.statusCode || 0;\n const response = {\n statusCode,\n result: null,\n headers: {}\n };\n // not found leads to null obj returned\n if (statusCode === HttpCodes.NotFound) {\n resolve(response);\n }\n // get the result from the body\n function dateTimeDeserializer(key, value) {\n if (typeof value === 'string') {\n const a = new Date(value);\n if (!isNaN(a.valueOf())) {\n return a;\n }\n }\n return value;\n }\n let obj;\n let contents;\n try {\n contents = yield res.readBody();\n if (contents && contents.length > 0) {\n if (options && options.deserializeDates) {\n obj = JSON.parse(contents, dateTimeDeserializer);\n }\n else {\n obj = JSON.parse(contents);\n }\n response.result = obj;\n }\n response.headers = res.message.headers;\n }\n catch (err) {\n // Invalid resource (contents not json); leaving result obj null\n }\n // note that 3xx redirects are handled by the http layer.\n if (statusCode > 299) {\n let msg;\n // if exception/error in body, attempt to get better error\n if (obj && obj.message) {\n msg = obj.message;\n }\n else if (contents && contents.length > 0) {\n // it may be the case that the exception is in the body message as string\n msg = contents;\n }\n else {\n msg = `Failed request: (${statusCode})`;\n }\n const err = new HttpClientError(msg, statusCode);\n err.result = response.result;\n reject(err);\n }\n else {\n resolve(response);\n }\n }));\n });\n }\n}\nexports.HttpClient = HttpClient;\nconst lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.checkBypass = exports.getProxyUrl = void 0;\nfunction getProxyUrl(reqUrl) {\n const usingSsl = reqUrl.protocol === 'https:';\n if (checkBypass(reqUrl)) {\n return undefined;\n }\n const proxyVar = (() => {\n if (usingSsl) {\n return process.env['https_proxy'] || process.env['HTTPS_PROXY'];\n }\n else {\n return process.env['http_proxy'] || process.env['HTTP_PROXY'];\n }\n })();\n if (proxyVar) {\n try {\n return new URL(proxyVar);\n }\n catch (_a) {\n if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://'))\n return new URL(`http://${proxyVar}`);\n }\n }\n else {\n return undefined;\n }\n}\nexports.getProxyUrl = getProxyUrl;\nfunction checkBypass(reqUrl) {\n if (!reqUrl.hostname) {\n return false;\n }\n const reqHost = reqUrl.hostname;\n if (isLoopbackAddress(reqHost)) {\n return true;\n }\n const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';\n if (!noProxy) {\n return false;\n }\n // Determine the request port\n let reqPort;\n if (reqUrl.port) {\n reqPort = Number(reqUrl.port);\n }\n else if (reqUrl.protocol === 'http:') {\n reqPort = 80;\n }\n else if (reqUrl.protocol === 'https:') {\n reqPort = 443;\n }\n // Format the request hostname and hostname with port\n const upperReqHosts = [reqUrl.hostname.toUpperCase()];\n if (typeof reqPort === 'number') {\n upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);\n }\n // Compare request host against noproxy\n for (const upperNoProxyItem of noProxy\n .split(',')\n .map(x => x.trim().toUpperCase())\n .filter(x => x)) {\n if (upperNoProxyItem === '*' ||\n upperReqHosts.some(x => x === upperNoProxyItem ||\n x.endsWith(`.${upperNoProxyItem}`) ||\n (upperNoProxyItem.startsWith('.') &&\n x.endsWith(`${upperNoProxyItem}`)))) {\n return true;\n }\n }\n return false;\n}\nexports.checkBypass = checkBypass;\nfunction isLoopbackAddress(host) {\n const hostLower = host.toLowerCase();\n return (hostLower === 'localhost' ||\n hostLower.startsWith('127.') ||\n hostLower.startsWith('[::1]') ||\n hostLower.startsWith('[0:0:0:0:0:0:0:1]'));\n}\n//# sourceMappingURL=proxy.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.cannedMetricsForService = void 0;\nconst canned_metrics_schema_1 = require(\"./canned-metrics/canned-metrics-schema\");\n/**\n * Return the list of canned metrics for the given service\n */\nfunction cannedMetricsForService(cloudFormationNamespace) {\n // One metricTemplate has a single set of dimensions, but the same metric NAME\n // may occur in multiple metricTemplates (if it has multiple sets of dimensions)\n const metricTemplates = cannedMetricsIndex()[cloudFormationNamespace] ?? [];\n // First construct almost what we need, but with a single dimension per metric\n const metricsWithDuplicates = flatMap(metricTemplates, metricSet => {\n const dimensions = metricSet.dimensions.map(d => d.dimensionName);\n return metricSet.metrics.map(metric => ({\n namespace: metricSet.namespace,\n dimensions,\n metricName: metric.name,\n defaultStat: metric.defaultStat,\n }));\n });\n // Then combine the dimensions for the same metrics into a single list\n return groupBy(metricsWithDuplicates, m => `${m.namespace}/${m.metricName}`).map(metrics => ({\n namespace: metrics[0].namespace,\n metricName: metrics[0].metricName,\n defaultStat: metrics[0].defaultStat,\n dimensions: Array.from(dedupeStringLists(metrics.map(m => m.dimensions))),\n }));\n}\nexports.cannedMetricsForService = cannedMetricsForService;\nlet cannedMetricsCache;\n/**\n * Load the canned metrics file and process it into an index, grouped by service namespace\n */\nfunction cannedMetricsIndex() {\n if (cannedMetricsCache === undefined) {\n cannedMetricsCache = {};\n for (const group of (0, canned_metrics_schema_1.loadCannedMetricsFile)()) {\n for (const metricTemplate of group.metricTemplates) {\n const [aws, service] = metricTemplate.resourceType.split('::');\n const serviceKey = [aws, service].join('::');\n (cannedMetricsCache[serviceKey] ?? (cannedMetricsCache[serviceKey] = [])).push(metricTemplate);\n }\n }\n }\n return cannedMetricsCache;\n}\nfunction flatMap(xs, fn) {\n return Array.prototype.concat.apply([], xs.map(fn));\n}\nfunction groupBy(xs, keyFn) {\n const obj = {};\n for (const x of xs) {\n const key = keyFn(x);\n if (key in obj) {\n obj[key].push(x);\n }\n else {\n obj[key] = [x];\n }\n }\n return Object.values(obj);\n}\nfunction* dedupeStringLists(xs) {\n const seen = new Set();\n for (const x of xs) {\n x.sort();\n const key = `${x.join(',')}`;\n if (!seen.has(key)) {\n yield x;\n }\n seen.add(key);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FubmVkLW1ldHJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjYW5uZWQtbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrRkFBK0Y7QUE0Qy9GOztHQUVHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsdUJBQStCO0lBQ3JFLDhFQUE4RTtJQUM5RSxnRkFBZ0Y7SUFDaEYsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUU1RSw4RUFBOEU7SUFDOUUsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxFQUFFO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUztZQUM5QixVQUFVO1lBQ1YsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ3ZCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztTQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQyxDQUFDO0lBRUgsc0VBQXNFO0lBQ3RFLE9BQU8sT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0YsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQy9CLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVTtRQUNqQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVc7UUFDbkMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFRO0tBQ2pGLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQXZCRCwwREF1QkM7QUFJRCxJQUFJLGtCQUFrRCxDQUFDO0FBRXZEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0I7SUFDekIsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUU7UUFDcEMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBQSw2Q0FBcUIsR0FBRSxFQUFFO1lBQzNDLEtBQUssTUFBTSxjQUFjLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtnQkFDbEQsTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDaEc7U0FDRjtLQUNGO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQU8sRUFBTyxFQUFFLEVBQWlCO0lBQy9DLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFJLEVBQU8sRUFBRSxLQUF1QjtJQUNsRCxNQUFNLEdBQUcsR0FBcUMsRUFBRSxDQUFDO0lBQ2pELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7WUFDZCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xCO2FBQU07WUFDTCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQjtLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxRQUFRLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFjO0lBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDL0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1QsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxDQUFDLENBQUM7U0FDVDtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDZjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsb2FkQ2FubmVkTWV0cmljc0ZpbGUsIE1ldHJpY1RlbXBsYXRlIH0gZnJvbSAnLi9jYW5uZWQtbWV0cmljcy9jYW5uZWQtbWV0cmljcy1zY2hlbWEnO1xuXG5leHBvcnQgdHlwZSBOb25FbXB0eUFycmF5PFQ+ID0gW1QsIC4uLlRbXV07XG5cbi8qKlxuICogQSBzaW5nbGUgY2FubmVkIHNlcnZpY2UgbWV0cmljXG4gKlxuICogVGhlc2UgYXJlIGtpbmRseSBwcm92aWRlZCB0byB1cyBieSB0aGUgZ29vZCBwZW9wbGUgb2YgQ2xvdWRXYXRjaCBFeHBsb3Jlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYW5uZWRNZXRyaWMge1xuICAvKipcbiAgICogTWV0cmljIG5hbWVzcGFjZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBuYW1lXG4gICAqL1xuICByZWFkb25seSBtZXRyaWNOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYWxsIHBvc3NpYmxlIGRpbWVuc2lvbiBwZXJtdXRhdGlvbnMgZm9yIHRoaXMgbWV0cmljXG4gICAqXG4gICAqIE1vc3QgbWV0cmljcyB3aWxsIGhhdmUgYSBzaW5nbGUgbGlzdCBvZiBzdHJpbmdzIGFzIHRoZWlyIG9uZSBzZXQgb2ZcbiAgICogYWxsb3dlZCBkaW1lbnNpb25zLCBidXQgc29tZSBtZXRyaWNzIGFyZSBlbWl0dGVkIHVuZGVyIG11bHRpcGxlXG4gICAqIGNvbWJpbmF0aW9ucyBvZiBkaW1lbnNpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgZGltZW5zaW9uczogTm9uRW1wdHlBcnJheTxzdHJpbmdbXT47XG5cbiAgLyoqXG4gICAqIFN1Z2dlc3RlZCBkZWZhdWx0IGFnZ3JlZ3JhdGlvbiBzdGF0aXN0aWNcbiAgICpcbiAgICogTm90IGFsd2F5cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBvbmUgdG8gdXNlISBUaGVzZSBkZWZhdWx0cyBoYXZlXG4gICAqIGJlZW4gY2xhc3NpZmllZCBieSBwZW9wbGUgYW5kIHRoZXkgZ2VuZXJhbGx5IGp1c3QgcGljayBcIkF2ZXJhZ2VcIlxuICAgKiBhcyB0aGUgZGVmYXVsdCwgZXZlbiBpZiBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UuXG4gICAqXG4gICAqIEZvciBleGFtcGxlOiBmb3IgZXZlbnQtYmFzZWQgbWV0cmljcyB0aGF0IG9ubHkgZXZlciBlbWl0IGAxYFxuICAgKiAoYW5kIG5ldmVyIGAwYCkgdGhlIGJldHRlciBzdGF0aXN0aWMgd291bGQgYmUgYFN1bWAuXG4gICAqXG4gICAqIFVzZSB5b3VyIGp1ZGdlbWVudCBiYXNlZCBvbiB0aGUgdHlwZSBvZiBtZXRyaWMgdGhpcyBpcy5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRTdGF0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0IG9mIGNhbm5lZCBtZXRyaWNzIGZvciB0aGUgZ2l2ZW4gc2VydmljZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FubmVkTWV0cmljc0ZvclNlcnZpY2UoY2xvdWRGb3JtYXRpb25OYW1lc3BhY2U6IHN0cmluZyk6IENhbm5lZE1ldHJpY1tdIHtcbiAgLy8gT25lIG1ldHJpY1RlbXBsYXRlIGhhcyBhIHNpbmdsZSBzZXQgb2YgZGltZW5zaW9ucywgYnV0IHRoZSBzYW1lIG1ldHJpYyBOQU1FXG4gIC8vIG1heSBvY2N1ciBpbiBtdWx0aXBsZSBtZXRyaWNUZW1wbGF0ZXMgKGlmIGl0IGhhcyBtdWx0aXBsZSBzZXRzIG9mIGRpbWVuc2lvbnMpXG4gIGNvbnN0IG1ldHJpY1RlbXBsYXRlcyA9IGNhbm5lZE1ldHJpY3NJbmRleCgpW2Nsb3VkRm9ybWF0aW9uTmFtZXNwYWNlXSA/PyBbXTtcblxuICAvLyBGaXJzdCBjb25zdHJ1Y3QgYWxtb3N0IHdoYXQgd2UgbmVlZCwgYnV0IHdpdGggYSBzaW5nbGUgZGltZW5zaW9uIHBlciBtZXRyaWNcbiAgY29uc3QgbWV0cmljc1dpdGhEdXBsaWNhdGVzID0gZmxhdE1hcChtZXRyaWNUZW1wbGF0ZXMsIG1ldHJpY1NldCA9PiB7XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IG1ldHJpY1NldC5kaW1lbnNpb25zLm1hcChkID0+IGQuZGltZW5zaW9uTmFtZSk7XG4gICAgcmV0dXJuIG1ldHJpY1NldC5tZXRyaWNzLm1hcChtZXRyaWMgPT4gKHtcbiAgICAgIG5hbWVzcGFjZTogbWV0cmljU2V0Lm5hbWVzcGFjZSxcbiAgICAgIGRpbWVuc2lvbnMsXG4gICAgICBtZXRyaWNOYW1lOiBtZXRyaWMubmFtZSxcbiAgICAgIGRlZmF1bHRTdGF0OiBtZXRyaWMuZGVmYXVsdFN0YXQsXG4gICAgfSkpO1xuICB9KTtcblxuICAvLyBUaGVuIGNvbWJpbmUgdGhlIGRpbWVuc2lvbnMgZm9yIHRoZSBzYW1lIG1ldHJpY3MgaW50byBhIHNpbmdsZSBsaXN0XG4gIHJldHVybiBncm91cEJ5KG1ldHJpY3NXaXRoRHVwbGljYXRlcywgbSA9PiBgJHttLm5hbWVzcGFjZX0vJHttLm1ldHJpY05hbWV9YCkubWFwKG1ldHJpY3MgPT4gKHtcbiAgICBuYW1lc3BhY2U6IG1ldHJpY3NbMF0ubmFtZXNwYWNlLFxuICAgIG1ldHJpY05hbWU6IG1ldHJpY3NbMF0ubWV0cmljTmFtZSxcbiAgICBkZWZhdWx0U3RhdDogbWV0cmljc1swXS5kZWZhdWx0U3RhdCxcbiAgICBkaW1lbnNpb25zOiBBcnJheS5mcm9tKGRlZHVwZVN0cmluZ0xpc3RzKG1ldHJpY3MubWFwKG0gPT4gbS5kaW1lbnNpb25zKSkpIGFzIGFueSxcbiAgfSkpO1xufVxuXG50eXBlIENhbm5lZE1ldHJpY3NJbmRleCA9IFJlY29yZDxzdHJpbmcsIE1ldHJpY1RlbXBsYXRlW10+O1xuXG5sZXQgY2FubmVkTWV0cmljc0NhY2hlOiBDYW5uZWRNZXRyaWNzSW5kZXggfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogTG9hZCB0aGUgY2FubmVkIG1ldHJpY3MgZmlsZSBhbmQgcHJvY2VzcyBpdCBpbnRvIGFuIGluZGV4LCBncm91cGVkIGJ5IHNlcnZpY2UgbmFtZXNwYWNlXG4gKi9cbmZ1bmN0aW9uIGNhbm5lZE1ldHJpY3NJbmRleCgpIHtcbiAgaWYgKGNhbm5lZE1ldHJpY3NDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FubmVkTWV0cmljc0NhY2hlID0ge307XG4gICAgZm9yIChjb25zdCBncm91cCBvZiBsb2FkQ2FubmVkTWV0cmljc0ZpbGUoKSkge1xuICAgICAgZm9yIChjb25zdCBtZXRyaWNUZW1wbGF0ZSBvZiBncm91cC5tZXRyaWNUZW1wbGF0ZXMpIHtcbiAgICAgICAgY29uc3QgW2F3cywgc2VydmljZV0gPSBtZXRyaWNUZW1wbGF0ZS5yZXNvdXJjZVR5cGUuc3BsaXQoJzo6Jyk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBbYXdzLCBzZXJ2aWNlXS5qb2luKCc6OicpO1xuICAgICAgICAoY2FubmVkTWV0cmljc0NhY2hlW3NlcnZpY2VLZXldID8/IChjYW5uZWRNZXRyaWNzQ2FjaGVbc2VydmljZUtleV0gPSBbXSkpLnB1c2gobWV0cmljVGVtcGxhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2FubmVkTWV0cmljc0NhY2hlO1xufVxuXG5mdW5jdGlvbiBmbGF0TWFwPEEsIEI+KHhzOiBBW10sIGZuOiAoeDogQSkgPT4gQltdKTogQltdIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHhzLm1hcChmbikpO1xufVxuXG5mdW5jdGlvbiBncm91cEJ5PEE+KHhzOiBBW10sIGtleUZuOiAoeDogQSkgPT4gc3RyaW5nKTogQXJyYXk8Tm9uRW1wdHlBcnJheTxBPj4ge1xuICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIE5vbkVtcHR5QXJyYXk8QT4+ID0ge307XG4gIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgIGNvbnN0IGtleSA9IGtleUZuKHgpO1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICBvYmpba2V5XS5wdXNoKHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmpba2V5XSA9IFt4XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMob2JqKTtcbn1cblxuZnVuY3Rpb24qIGRlZHVwZVN0cmluZ0xpc3RzKHhzOiBzdHJpbmdbXVtdKTogSXRlcmFibGVJdGVyYXRvcjxzdHJpbmdbXT4ge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgIHguc29ydCgpO1xuICAgIGNvbnN0IGtleSA9IGAke3guam9pbignLCcpfWA7XG4gICAgaWYgKCFzZWVuLmhhcyhrZXkpKSB7XG4gICAgICB5aWVsZCB4O1xuICAgIH1cbiAgICBzZWVuLmFkZChrZXkpO1xuICB9XG59Il19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadCannedMetricsFile = void 0;\n/**\n * Get the canned metrics source file\n */\nfunction loadCannedMetricsFile() {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require('./services.json');\n}\nexports.loadCannedMetricsFile = loadCannedMetricsFile;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FubmVkLW1ldHJpY3Mtc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2FubmVkLW1ldHJpY3Mtc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCO0lBQ25DLGlFQUFpRTtJQUNqRSxPQUFPLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFIRCxzREFHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2V0IHRoZSBjYW5uZWQgbWV0cmljcyBzb3VyY2UgZmlsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZENhbm5lZE1ldHJpY3NGaWxlKCk6IENhbm5lZE1ldHJpY3NGaWxlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgcmV0dXJuIHJlcXVpcmUoJy4vc2VydmljZXMuanNvbicpO1xufVxuXG4vKipcbiAqIFNjaGVtYSBkZWZpbml0aW9ucyBmb3IgdGhlIGFjY29tcGFueWluZyBmaWxlIFwic2VydmljZXMuanNvblwiLlxuICovXG5leHBvcnQgdHlwZSBDYW5uZWRNZXRyaWNzRmlsZSA9IE1ldHJpY0luZm9Hcm91cFtdO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY0luZm9Hcm91cCB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIG1ldHJpYyB0ZW1wbGF0ZXNcbiAgICovXG4gIHJlYWRvbmx5IG1ldHJpY1RlbXBsYXRlczogTWV0cmljVGVtcGxhdGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNUZW1wbGF0ZSB7XG4gIC8qKlxuICAgKiBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBuYW1lXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZVR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogTWV0cmljIG5hbWVzcGFjZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNldCBvZiBkaW1lbnNpb25zIGZvciB0aGlzIHNldCBvZiBtZXRyaWNzXG4gICAqL1xuICByZWFkb25seSBkaW1lbnNpb25zOiBEaW1lbnNpb25bXTtcblxuICAvKipcbiAgICogU2V0IG9mIG1ldHJpY3MgdGhlc2UgZGltZW5zaW9ucyBhcHBseSB0b1xuICAgKi9cbiAgcmVhZG9ubHkgbWV0cmljczogTWV0cmljW107XG59XG5cbi8qKlxuICogRGltZW5zaW9uIGZvciB0aGlzIHNldCBvZiBtZXRyaWMgdGVtcGxhdGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9uIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGRpbWVuc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgZGltZW5zaW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHBvdGVudGlhbCBmaXhlZCB2YWx1ZSBmb3IgdGhpcyBkaW1lbnNpb25cbiAgICpcbiAgICogKEN1cnJlbnRseSB1bnVzZWQgYnkgdGhlIHNwZWMgcmVhZGVyLCBidXQgY291bGQgYmUgdXNlZClcbiAgICovXG4gIHJlYWRvbmx5IGRpbWVuc2lvblZhbHVlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2YgYW4gYXZhaWxhYmxlIG1ldHJpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBtZXRyaWNcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogRGVmYXVsdCAoc3VnZ2VzdGVkKSBzdGF0aXN0aWMgZm9yIHRoaXMgbWV0cmljXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0U3RhdDogc3RyaW5nO1xufSJdfQ==",null,"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MetricType = void 0;\nvar MetricType;\n(function (MetricType) {\n /**\n * This metric measures an attribute of events\n *\n * It could be time, or request size, or similar. The default\n * aggregate for this type of event is \"Avg\".\n */\n MetricType[\"Attrib\"] = \"attrib\";\n /**\n * This metric is counting events.\n *\n * This means the metric \"1\" is emitted every time an event occurs.\n * Only \"Sum\" is a meaningful aggregate of this type of metric.\n */\n MetricType[\"Count\"] = \"count\";\n /**\n * This metric is emitting a size.\n *\n * The metric is not event-based, but measures some global ever-changing\n * property. The most useful aggregate of this type of metric is \"Max\".\n */\n MetricType[\"Gauge\"] = \"gauge\";\n})(MetricType || (exports.MetricType = MetricType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVnbWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXVnbWVudGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXdFQSxJQUFZLFVBd0JYO0FBeEJELFdBQVksVUFBVTtJQUNwQjs7Ozs7T0FLRztJQUNILCtCQUFpQixDQUFBO0lBRWpCOzs7OztPQUtHO0lBQ0gsNkJBQWUsQ0FBQTtJQUVmOzs7OztPQUtHO0lBQ0gsNkJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBeEJXLFVBQVUsMEJBQVYsVUFBVSxRQXdCckIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1Z21lbnRhdGlvbnMgZm9yIGEgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlQXVnbWVudGF0aW9uIHtcbiAgLyoqXG4gICAqIE1ldHJpYyBhdWdtZW50YXRpb25zIGZvciB0aGlzIHJlc291cmNlIHR5cGVcbiAgICovXG4gIG1ldHJpY3M/OiBSZXNvdXJjZU1ldHJpY0F1Z21lbnRhdGlvbnM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIHRoaXMgcmVzb3VyY2UgYXVnbWVudGF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vIG9wdGlvbnNcbiAgICovXG4gIG9wdGlvbnM/OiBBdWdtZW50YXRpb25PcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1Z21lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MgdG8gYmUgXCJhdWdtZW50ZWRcIi5cbiAgICpcbiAgICogQGRlZmF1bHQga2ViYWIgY2FzZWQgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgbmFtZSArICctYmFzZSdcbiAgICovXG4gIGNsYXNzRmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIFwiYXVnbWVudGVkXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IENsb3VkRm9ybWF0aW9uIHJlc291cmNlIG5hbWUgKyAnQmFzZSdcbiAgICovXG4gIGNsYXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbnRlcmZhY2UgdG8gYmUgXCJhdWdtZW50ZWRcIi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzYW1lIGFzIGBgY2xhc3NGaWxlYGAuXG4gICAqL1xuICBpbnRlcmZhY2VGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRvIGJlIFwiYXVnbWVudGVkXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdJJyArIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIG5hbWVcbiAgICovXG4gIGludGVyZmFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZU1ldHJpY0F1Z21lbnRhdGlvbnMge1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgZGltZW5zaW9uczoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIG1ldHJpY3M6IFJlc291cmNlTWV0cmljW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VNZXRyaWMge1xuICAvKipcbiAgICogVXBwZXJjYXNlLWZpcnN0IG1ldHJpYyBuYW1lXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERvY3VtZW50YXRpb24gbGluZVxuICAgKi9cbiAgZG9jdW1lbnRhdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYW4gZXZlbiBjb3VudCAoMSBnZXRzIGVtaXR0ZWQgZXZlcnkgdGltZSBzb21ldGhpbmcgb2NjdXJzKVxuICAgKlxuICAgKiBAZGVmYXVsdCBNZXRyaWNUeXBlLkF0dHJpYlxuICAgKi9cbiAgdHlwZT86IE1ldHJpY1R5cGU7XG59XG5cbmV4cG9ydCBlbnVtIE1ldHJpY1R5cGUge1xuICAvKipcbiAgICogVGhpcyBtZXRyaWMgbWVhc3VyZXMgYW4gYXR0cmlidXRlIG9mIGV2ZW50c1xuICAgKlxuICAgKiBJdCBjb3VsZCBiZSB0aW1lLCBvciByZXF1ZXN0IHNpemUsIG9yIHNpbWlsYXIuIFRoZSBkZWZhdWx0XG4gICAqIGFnZ3JlZ2F0ZSBmb3IgdGhpcyB0eXBlIG9mIGV2ZW50IGlzIFwiQXZnXCIuXG4gICAqL1xuICBBdHRyaWIgPSAnYXR0cmliJyxcblxuICAvKipcbiAgICogVGhpcyBtZXRyaWMgaXMgY291bnRpbmcgZXZlbnRzLlxuICAgKlxuICAgKiBUaGlzIG1lYW5zIHRoZSBtZXRyaWMgXCIxXCIgaXMgZW1pdHRlZCBldmVyeSB0aW1lIGFuIGV2ZW50IG9jY3Vycy5cbiAgICogT25seSBcIlN1bVwiIGlzIGEgbWVhbmluZ2Z1bCBhZ2dyZWdhdGUgb2YgdGhpcyB0eXBlIG9mIG1ldHJpYy5cbiAgICovXG4gIENvdW50ID0gJ2NvdW50JyxcblxuICAvKipcbiAgICogVGhpcyBtZXRyaWMgaXMgZW1pdHRpbmcgYSBzaXplLlxuICAgKlxuICAgKiBUaGUgbWV0cmljIGlzIG5vdCBldmVudC1iYXNlZCwgYnV0IG1lYXN1cmVzIHNvbWUgZ2xvYmFsIGV2ZXItY2hhbmdpbmdcbiAgICogcHJvcGVydHkuIFRoZSBtb3N0IHVzZWZ1bCBhZ2dyZWdhdGUgb2YgdGhpcyB0eXBlIG9mIG1ldHJpYyBpcyBcIk1heFwiLlxuICAgKi9cbiAgR2F1Z2UgPSAnZ2F1Z2UnXG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isPrimitiveType = exports.PrimitiveType = void 0;\nvar PrimitiveType;\n(function (PrimitiveType) {\n PrimitiveType[\"String\"] = \"String\";\n PrimitiveType[\"Long\"] = \"Long\";\n PrimitiveType[\"Integer\"] = \"Integer\";\n PrimitiveType[\"Double\"] = \"Double\";\n PrimitiveType[\"Boolean\"] = \"Boolean\";\n PrimitiveType[\"Timestamp\"] = \"Timestamp\";\n PrimitiveType[\"Json\"] = \"Json\";\n})(PrimitiveType || (exports.PrimitiveType = PrimitiveType = {}));\nfunction isPrimitiveType(str) {\n switch (str) {\n case PrimitiveType.String:\n case PrimitiveType.Long:\n case PrimitiveType.Integer:\n case PrimitiveType.Double:\n case PrimitiveType.Boolean:\n case PrimitiveType.Timestamp:\n case PrimitiveType.Json:\n return true;\n default:\n return false;\n }\n}\nexports.isPrimitiveType = isPrimitiveType;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJhc2UtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsSUFBWSxhQVFYO0FBUkQsV0FBWSxhQUFhO0lBQ3ZCLGtDQUFpQixDQUFBO0lBQ2pCLDhCQUFhLENBQUE7SUFDYixvQ0FBbUIsQ0FBQTtJQUNuQixrQ0FBaUIsQ0FBQTtJQUNqQixvQ0FBbUIsQ0FBQTtJQUNuQix3Q0FBdUIsQ0FBQTtJQUN2Qiw4QkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQVJXLGFBQWEsNkJBQWIsYUFBYSxRQVF4QjtBQUVELFNBQWdCLGVBQWUsQ0FBQyxHQUFXO0lBQ3pDLFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQzFCLEtBQUssYUFBYSxDQUFDLElBQUksQ0FBQztRQUN4QixLQUFLLGFBQWEsQ0FBQyxPQUFPLENBQUM7UUFDM0IsS0FBSyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQzFCLEtBQUssYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUMzQixLQUFLLGFBQWEsQ0FBQyxTQUFTLENBQUM7UUFDN0IsS0FBSyxhQUFhLENBQUMsSUFBSTtZQUNyQixPQUFPLElBQUksQ0FBQztRQUNkO1lBQ0UsT0FBTyxLQUFLLENBQUM7S0FDaEI7QUFDSCxDQUFDO0FBYkQsMENBYUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIERvY3VtZW50ZWQge1xuICAvKiogQSBsaW5rIHRvIHRoZSBBV1MgQ2xvdWRGb3JtYXRpb24gVXNlciBHdWlkZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9ucyBhYm91dCB0aGUgZW50aXR5LiAqL1xuICBEb2N1bWVudGF0aW9uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBQcmltaXRpdmVUeXBlIHtcbiAgU3RyaW5nID0gJ1N0cmluZycsXG4gIExvbmcgPSAnTG9uZycsXG4gIEludGVnZXIgPSAnSW50ZWdlcicsXG4gIERvdWJsZSA9ICdEb3VibGUnLFxuICBCb29sZWFuID0gJ0Jvb2xlYW4nLFxuICBUaW1lc3RhbXAgPSAnVGltZXN0YW1wJyxcbiAgSnNvbiA9ICdKc29uJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmVUeXBlKHN0cjogc3RyaW5nKTogc3RyIGlzIFByaW1pdGl2ZVR5cGUge1xuICBzd2l0Y2ggKHN0cikge1xuICAgIGNhc2UgUHJpbWl0aXZlVHlwZS5TdHJpbmc6XG4gICAgY2FzZSBQcmltaXRpdmVUeXBlLkxvbmc6XG4gICAgY2FzZSBQcmltaXRpdmVUeXBlLkludGVnZXI6XG4gICAgY2FzZSBQcmltaXRpdmVUeXBlLkRvdWJsZTpcbiAgICBjYXNlIFByaW1pdGl2ZVR5cGUuQm9vbGVhbjpcbiAgICBjYXNlIFByaW1pdGl2ZVR5cGUuVGltZXN0YW1wOlxuICAgIGNhc2UgUHJpbWl0aXZlVHlwZS5Kc29uOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2ZuLWxpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZm4tbGludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZGRpdGlvbmFsIHJlc291cmNlIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gY2ZuLWxpbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZm5MaW50UmVzb3VyY2VBbm5vdGF0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gcmVzb3VyY2UgaXMgc3RhdGVmdWxcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlZnVsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCBhIERlbGV0ZSBvcGVyYXRpb24gcmVxdWlyZXMgdGhlIHJlc291cmNlIHRvIGJlIGVtcHR5XG4gICAqL1xuICByZWFkb25seSBtdXN0QmVFbXB0eVRvRGVsZXRlOiBib29sZWFuO1xufSJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRvY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRG9jcyBmb3IgYSBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBvciBwcm9wZXJ0eSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGb3JtYXRpb25UeXBlRG9jcyB7XG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBmb3IgdGhpcyB0eXBlXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbnMgZm9yIGVhY2ggb2YgdGhlIHR5cGUncyBwcm9wZXJ0aWVzXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbnMgZm9yIGVhY2ggb2YgdGhlIHJlc291cmNlJ3MgYXR0cmlidXRlc1xuICAgKi9cbiAgcmVhZG9ubHkgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGb3JtYXRpb25Eb2NzRmlsZSB7XG4gIHJlYWRvbmx5IFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBDbG91ZEZvcm1hdGlvblR5cGVEb2NzPjtcbn0iXX0=","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./base-types\"), exports);\n__exportStar(require(\"./property\"), exports);\n__exportStar(require(\"./resource-type\"), exports);\n__exportStar(require(\"./specification\"), exports);\n__exportStar(require(\"./augmentation\"), exports);\n__exportStar(require(\"./cfn-lint\"), exports);\n__exportStar(require(\"./docs\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQTZCO0FBQzdCLDZDQUEyQjtBQUMzQixrREFBZ0M7QUFDaEMsa0RBQWdDO0FBQ2hDLGlEQUErQjtBQUMvQiw2Q0FBMkI7QUFDM0IseUNBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9iYXNlLXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvcGVydHknO1xuZXhwb3J0ICogZnJvbSAnLi9yZXNvdXJjZS10eXBlJztcbmV4cG9ydCAqIGZyb20gJy4vc3BlY2lmaWNhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2F1Z21lbnRhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2Nmbi1saW50JztcbmV4cG9ydCAqIGZyb20gJy4vZG9jcyc7Il19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isTagPropertyStringMap = exports.isTagPropertyJson = exports.isTagPropertyAutoScalingGroup = exports.isTagPropertyStandard = exports.isTagProperty = exports.isTagPropertyName = exports.isPropertyScrutinyType = exports.PropertyScrutinyType = exports.isUnionProperty = exports.isMapOfListsOfPrimitivesProperty = exports.isMapOfStructsProperty = exports.isPrimitiveMapProperty = exports.isMapProperty = exports.isComplexListProperty = exports.isPrimitiveListProperty = exports.isListProperty = exports.isCollectionProperty = exports.isComplexProperty = exports.isPrimitiveProperty = exports.isScalarProperty = exports.isUpdateType = exports.UpdateType = void 0;\nconst base_types_1 = require(\"./base-types\");\nvar UpdateType;\n(function (UpdateType) {\n UpdateType[\"Conditional\"] = \"Conditional\";\n UpdateType[\"Immutable\"] = \"Immutable\";\n UpdateType[\"Mutable\"] = \"Mutable\";\n})(UpdateType || (exports.UpdateType = UpdateType = {}));\nfunction isUpdateType(str) {\n switch (str) {\n case UpdateType.Conditional:\n case UpdateType.Immutable:\n case UpdateType.Mutable:\n return true;\n default:\n return false;\n }\n}\nexports.isUpdateType = isUpdateType;\nfunction isScalarProperty(prop) {\n return isPrimitiveProperty(prop)\n || isComplexProperty(prop)\n // A UnionProperty is only Scalar if it defines Types or PrimitiveTypes\n || (isUnionProperty(prop) && !!(prop.Types || prop.PrimitiveTypes));\n}\nexports.isScalarProperty = isScalarProperty;\nfunction isPrimitiveProperty(prop) {\n return !!prop.PrimitiveType;\n}\nexports.isPrimitiveProperty = isPrimitiveProperty;\nfunction isComplexProperty(prop) {\n const propType = prop.Type;\n return propType != null && propType !== 'Map' && propType !== 'List';\n}\nexports.isComplexProperty = isComplexProperty;\nfunction isCollectionProperty(prop) {\n return isListProperty(prop)\n || isMapProperty(prop)\n // A UnionProperty is only Collection if it defines ItemTypes or PrimitiveItemTypes\n || (isUnionProperty(prop) && !!(prop.ItemTypes || prop.PrimitiveItemTypes || prop.InclusiveItemTypes || prop.InclusivePrimitiveItemTypes));\n}\nexports.isCollectionProperty = isCollectionProperty;\nfunction isListProperty(prop) {\n return prop.Type === 'List';\n}\nexports.isListProperty = isListProperty;\nfunction isPrimitiveListProperty(prop) {\n return isListProperty(prop) && !!prop.PrimitiveItemType;\n}\nexports.isPrimitiveListProperty = isPrimitiveListProperty;\nfunction isComplexListProperty(prop) {\n return isListProperty(prop) && !!prop.ItemType;\n}\nexports.isComplexListProperty = isComplexListProperty;\nfunction isMapProperty(prop) {\n return prop.Type === 'Map';\n}\nexports.isMapProperty = isMapProperty;\nfunction isPrimitiveMapProperty(prop) {\n return isMapProperty(prop) && !!prop.PrimitiveItemType;\n}\nexports.isPrimitiveMapProperty = isPrimitiveMapProperty;\nfunction isMapOfStructsProperty(prop) {\n return isMapProperty(prop) &&\n !isPrimitiveMapProperty(prop) &&\n !isMapOfListsOfPrimitivesProperty(prop);\n}\nexports.isMapOfStructsProperty = isMapOfStructsProperty;\n// note: this (and the MapOfListsOfPrimitives type) are not actually valid in the CFN spec!\n// they are only here to support our patch of the CFN spec\n// to alleviate https://github.com/aws/aws-cdk/issues/3092\nfunction isMapOfListsOfPrimitivesProperty(prop) {\n return isMapProperty(prop) && prop.ItemType === 'List';\n}\nexports.isMapOfListsOfPrimitivesProperty = isMapOfListsOfPrimitivesProperty;\nfunction isUnionProperty(prop) {\n const castProp = prop;\n return !!(castProp.ItemTypes ||\n castProp.PrimitiveTypes ||\n castProp.Types ||\n castProp.PrimitiveItemTypes ||\n castProp.InclusiveItemTypes ||\n castProp.InclusivePrimitiveItemTypes);\n}\nexports.isUnionProperty = isUnionProperty;\nvar PropertyScrutinyType;\n(function (PropertyScrutinyType) {\n /**\n * No additional scrutiny\n */\n PropertyScrutinyType[\"None\"] = \"None\";\n /**\n * This is an IAM policy directly on a resource\n */\n PropertyScrutinyType[\"InlineResourcePolicy\"] = \"InlineResourcePolicy\";\n /**\n * Either an AssumeRolePolicyDocument or a dictionary of policy documents\n */\n PropertyScrutinyType[\"InlineIdentityPolicies\"] = \"InlineIdentityPolicies\";\n /**\n * A list of managed policies (on an identity resource)\n */\n PropertyScrutinyType[\"ManagedPolicies\"] = \"ManagedPolicies\";\n /**\n * A set of ingress rules (on a security group)\n */\n PropertyScrutinyType[\"IngressRules\"] = \"IngressRules\";\n /**\n * A set of egress rules (on a security group)\n */\n PropertyScrutinyType[\"EgressRules\"] = \"EgressRules\";\n})(PropertyScrutinyType || (exports.PropertyScrutinyType = PropertyScrutinyType = {}));\nfunction isPropertyScrutinyType(str) {\n return PropertyScrutinyType[str] !== undefined;\n}\nexports.isPropertyScrutinyType = isPropertyScrutinyType;\nconst tagPropertyNames = {\n FileSystemTags: '',\n HostedZoneTags: '',\n Tags: '',\n UserPoolTags: '',\n AccessPointTags: '',\n};\nfunction isTagPropertyName(name) {\n if (undefined === name) {\n return false;\n }\n return tagPropertyNames.hasOwnProperty(name);\n}\nexports.isTagPropertyName = isTagPropertyName;\n/**\n * This function validates that the property **can** be a Tag Property\n *\n * The property is only a Tag if the name of this property is Tags, which is\n * validated using `ResourceType.isTaggable(resource)`.\n */\nfunction isTagProperty(prop) {\n return (isTagPropertyStandard(prop) ||\n isTagPropertyAutoScalingGroup(prop) ||\n isTagPropertyJson(prop) ||\n isTagPropertyStringMap(prop));\n}\nexports.isTagProperty = isTagProperty;\nfunction isTagPropertyStandard(prop) {\n return (prop.ItemType === 'Tag' ||\n prop.ItemType === 'TagsEntry' ||\n prop.Type === 'Tags' ||\n prop.ItemType === 'TagRef' ||\n prop.ItemType === 'ElasticFileSystemTag' ||\n prop.ItemType === 'HostedZoneTag' ||\n prop.ItemType === 'AccessPointTag');\n}\nexports.isTagPropertyStandard = isTagPropertyStandard;\nfunction isTagPropertyAutoScalingGroup(prop) {\n return prop.ItemType === 'TagProperty';\n}\nexports.isTagPropertyAutoScalingGroup = isTagPropertyAutoScalingGroup;\nfunction isTagPropertyJson(prop) {\n return prop.PrimitiveType === base_types_1.PrimitiveType.Json;\n}\nexports.isTagPropertyJson = isTagPropertyJson;\nfunction isTagPropertyStringMap(prop) {\n return prop.PrimitiveItemType === 'String';\n}\nexports.isTagPropertyStringMap = isTagPropertyStringMap;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcm9wZXJ0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBeUQ7QUFvSXpELElBQVksVUFJWDtBQUpELFdBQVksVUFBVTtJQUNwQix5Q0FBMkIsQ0FBQTtJQUMzQixxQ0FBdUIsQ0FBQTtJQUN2QixpQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBSlcsVUFBVSwwQkFBVixVQUFVLFFBSXJCO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLEdBQVc7SUFDdEMsUUFBUSxHQUFHLEVBQUU7UUFDWCxLQUFLLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDNUIsS0FBSyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQzFCLEtBQUssVUFBVSxDQUFDLE9BQU87WUFDckIsT0FBTyxJQUFJLENBQUM7UUFDZDtZQUNFLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0FBQ0gsQ0FBQztBQVRELG9DQVNDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsSUFBYztJQUM3QyxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQztXQUMzQixpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDMUIsdUVBQXVFO1dBQ3BFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUxELDRDQUtDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUMsSUFBYztJQUNoRCxPQUFPLENBQUMsQ0FBRSxJQUEwQixDQUFDLGFBQWEsQ0FBQztBQUNyRCxDQUFDO0FBRkQsa0RBRUM7QUFFRCxTQUFnQixpQkFBaUIsQ0FBQyxJQUFjO0lBQzlDLE1BQU0sUUFBUSxHQUFJLElBQXdCLENBQUMsSUFBSSxDQUFDO0lBQ2hELE9BQU8sUUFBUSxJQUFJLElBQUksSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFJLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFDdkUsQ0FBQztBQUhELDhDQUdDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsSUFBYztJQUNqRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUM7V0FDdEIsYUFBYSxDQUFDLElBQUksQ0FBQztRQUN0QixtRkFBbUY7V0FDaEYsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUM7QUFDL0ksQ0FBQztBQUxELG9EQUtDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLElBQWM7SUFDM0MsT0FBUSxJQUFxQixDQUFDLElBQUksS0FBSyxNQUFNLENBQUM7QUFDaEQsQ0FBQztBQUZELHdDQUVDO0FBRUQsU0FBZ0IsdUJBQXVCLENBQUMsSUFBYztJQUNwRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUUsSUFBOEIsQ0FBQyxpQkFBaUIsQ0FBQztBQUNyRixDQUFDO0FBRkQsMERBRUM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxJQUFjO0lBQ2xELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBRSxJQUE0QixDQUFDLFFBQVEsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0RBRUM7QUFFRCxTQUFnQixhQUFhLENBQUMsSUFBYztJQUMxQyxPQUFRLElBQW9CLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztBQUM5QyxDQUFDO0FBRkQsc0NBRUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FBQyxJQUFjO0lBQ25ELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBRSxJQUE2QixDQUFDLGlCQUFpQixDQUFDO0FBQ25GLENBQUM7QUFGRCx3REFFQztBQUVELFNBQWdCLHNCQUFzQixDQUFDLElBQWM7SUFDbkQsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ3hCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDO1FBQzdCLENBQUMsZ0NBQWdDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUpELHdEQUlDO0FBRUQsMkZBQTJGO0FBQzNGLDBEQUEwRDtBQUMxRCwwREFBMEQ7QUFDMUQsU0FBZ0IsZ0NBQWdDLENBQUMsSUFBYztJQUM3RCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSyxJQUEyQixDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFDakYsQ0FBQztBQUZELDRFQUVDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLElBQWM7SUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBcUIsQ0FBQztJQUN2QyxPQUFPLENBQUMsQ0FBQyxDQUNQLFFBQVEsQ0FBQyxTQUFTO1FBQ2xCLFFBQVEsQ0FBQyxjQUFjO1FBQ3ZCLFFBQVEsQ0FBQyxLQUFLO1FBQ2QsUUFBUSxDQUFDLGtCQUFrQjtRQUMzQixRQUFRLENBQUMsa0JBQWtCO1FBQzNCLFFBQVEsQ0FBQywyQkFBMkIsQ0FDckMsQ0FBQztBQUNKLENBQUM7QUFWRCwwQ0FVQztBQUVELElBQVksb0JBOEJYO0FBOUJELFdBQVksb0JBQW9CO0lBQzlCOztPQUVHO0lBQ0gscUNBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gscUVBQTZDLENBQUE7SUFFN0M7O09BRUc7SUFDSCx5RUFBaUQsQ0FBQTtJQUVqRDs7T0FFRztJQUNILDJEQUFtQyxDQUFBO0lBRW5DOztPQUVHO0lBQ0gscURBQTZCLENBQUE7SUFFN0I7O09BRUc7SUFDSCxtREFBMkIsQ0FBQTtBQUM3QixDQUFDLEVBOUJXLG9CQUFvQixvQ0FBcEIsb0JBQW9CLFFBOEIvQjtBQUVELFNBQWdCLHNCQUFzQixDQUFDLEdBQVc7SUFDaEQsT0FBUSxvQkFBNEIsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDMUQsQ0FBQztBQUZELHdEQUVDO0FBRUQsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QixjQUFjLEVBQUUsRUFBRTtJQUNsQixjQUFjLEVBQUUsRUFBRTtJQUNsQixJQUFJLEVBQUUsRUFBRTtJQUNSLFlBQVksRUFBRSxFQUFFO0lBQ2hCLGVBQWUsRUFBRSxFQUFFO0NBQ3BCLENBQUM7QUFJRixTQUFnQixpQkFBaUIsQ0FBQyxJQUFhO0lBQzdDLElBQUksU0FBUyxLQUFLLElBQUksRUFBRTtRQUN0QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUxELDhDQUtDO0FBQ0Q7Ozs7O0dBS0c7QUFDSCxTQUFnQixhQUFhLENBQUMsSUFBYztJQUMxQyxPQUFPLENBQ0wscUJBQXFCLENBQUMsSUFBSSxDQUFDO1FBQzNCLDZCQUE2QixDQUFDLElBQUksQ0FBQztRQUNuQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDdkIsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQzdCLENBQUM7QUFDSixDQUFDO0FBUEQsc0NBT0M7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxJQUFjO0lBQ2xELE9BQU8sQ0FDSixJQUE0QixDQUFDLFFBQVEsS0FBSyxLQUFLO1FBQy9DLElBQTRCLENBQUMsUUFBUSxLQUFLLFdBQVc7UUFDckQsSUFBNEIsQ0FBQyxJQUFJLEtBQUssTUFBTTtRQUM1QyxJQUE0QixDQUFDLFFBQVEsS0FBSyxRQUFRO1FBQ2xELElBQTRCLENBQUMsUUFBUSxLQUFLLHNCQUFzQjtRQUNoRSxJQUE0QixDQUFDLFFBQVEsS0FBSyxlQUFlO1FBQ3pELElBQTRCLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUM1RCxDQUFDO0FBRUosQ0FBQztBQVhELHNEQVdDO0FBRUQsU0FBZ0IsNkJBQTZCLENBQUMsSUFBYztJQUMxRCxPQUFRLElBQW9DLENBQUMsUUFBUSxLQUFLLGFBQWEsQ0FBQztBQUMxRSxDQUFDO0FBRkQsc0VBRUM7QUFFRCxTQUFnQixpQkFBaUIsQ0FBQyxJQUFjO0lBQzlDLE9BQVEsSUFBd0IsQ0FBQyxhQUFhLEtBQUssMEJBQWEsQ0FBQyxJQUFJLENBQUM7QUFDeEUsQ0FBQztBQUZELDhDQUVDO0FBRUQsU0FBZ0Isc0JBQXNCLENBQUMsSUFBYztJQUNuRCxPQUFRLElBQTZCLENBQUMsaUJBQWlCLEtBQUssUUFBUSxDQUFDO0FBQ3ZFLENBQUM7QUFGRCx3REFFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERvY3VtZW50ZWQsIFByaW1pdGl2ZVR5cGUgfSBmcm9tICcuL2Jhc2UtdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eSA9IFNjYWxhclByb3BlcnR5IHwgQ29sbGVjdGlvblByb3BlcnR5O1xuZXhwb3J0IHR5cGUgU2NhbGFyUHJvcGVydHkgPSBQcmltaXRpdmVQcm9wZXJ0eSB8IENvbXBsZXhQcm9wZXJ0eSB8IFVuaW9uUHJvcGVydHk7XG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUHJvcGVydHkgPSBMaXN0UHJvcGVydHkgfCBNYXBQcm9wZXJ0eSB8IFVuaW9uUHJvcGVydHk7XG5leHBvcnQgdHlwZSBMaXN0UHJvcGVydHkgPSBQcmltaXRpdmVMaXN0UHJvcGVydHkgfCBDb21wbGV4TGlzdFByb3BlcnR5O1xuZXhwb3J0IHR5cGUgTWFwUHJvcGVydHkgPSBQcmltaXRpdmVNYXBQcm9wZXJ0eSB8IENvbXBsZXhNYXBQcm9wZXJ0eTtcbmV4cG9ydCB0eXBlIENvbXBsZXhNYXBQcm9wZXJ0eSA9IE1hcE9mU3RydWN0cyB8IE1hcE9mTGlzdHNPZlByaW1pdGl2ZXM7XG5leHBvcnQgdHlwZSBUYWdQcm9wZXJ0eSA9IFRhZ1Byb3BlcnR5U3RhbmRhcmQgfCBUYWdQcm9wZXJ0eUF1dG9TY2FsaW5nR3JvdXAgfCBUYWdQcm9wZXJ0eUpzb24gfCBUYWdQcm9wZXJ0eVN0cmluZ01hcDtcblxuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eUJhc2UgZXh0ZW5kcyBEb2N1bWVudGVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIFJlcXVpcmVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIER1cmluZyBhIHN0YWNrIHVwZGF0ZSwgdGhlIHVwZGF0ZSBiZWhhdmlvciB3aGVuIHlvdSBhZGQsIHJlbW92ZSwgb3IgbW9kaWZ5IHRoZSBwcm9wZXJ0eS4gQVdTIENsb3VkRm9ybWF0aW9uXG4gICAqIHJlcGxhY2VzIHRoZSByZXNvdXJjZSB3aGVuIHlvdSBjaGFuZ2UgYMOMbW11dGFibGVgYHByb3BlcnRpZXMuIEFXUyBDbG91ZEZvcm1hdGlvbiBkb2Vzbid0IHJlcGxhY2UgdGhlIHJlc291cmNlXG4gICAqIHdoZW4geW91IGNoYW5nZSBgYE11dGFibGVgYCBwcm9wZXJ0aWVzLiBgYENvbmRpdGlvbmFsYGAgdXBkYXRlcyBjYW4gYmUgbXV0YWJsZSBvciBpbW11dGFibGUsIGRlcGVuZGluZyBvbiwgZm9yXG4gICAqIGV4YW1wbGUsIHdoaWNoIG90aGVyIHByb3BlcnRpZXMgeW91IHVwZGF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFVwZGF0ZVR5cGUuTXV0YWJsZVxuICAgKi9cbiAgVXBkYXRlVHlwZT86IFVwZGF0ZVR5cGU7XG5cbiAgLyoqXG4gICAqIER1cmluZyBhIHN0YWNrIHVwZGF0ZSwgd2hhdCBraW5kIG9mIGFkZGl0aW9uYWwgc2NydXRpbnkgY2hhbmdlcyB0byB0aGlzIHByb3BlcnR5IHNob3VsZCBiZSBzdWJqZWN0ZWQgdG9cbiAgICpcbiAgICogQGRlZmF1bHQgTm9uZVxuICAgKi9cbiAgU2NydXRpbnlUeXBlPzogUHJvcGVydHlTY3J1dGlueVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpbWl0aXZlUHJvcGVydHkgZXh0ZW5kcyBQcm9wZXJ0eUJhc2Uge1xuICAvKiogVGhlIHZhbGlkIHByaW1pdGl2ZSB0eXBlIGZvciB0aGUgcHJvcGVydHkuICovXG4gIFByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxleFByb3BlcnR5IGV4dGVuZHMgUHJvcGVydHlCYXNlIHtcbiAgLyoqIFRoZSB0eXBlIG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSAqL1xuICBUeXBlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFByb3BlcnR5QmFzZSBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIC8qKlxuICAgKiBBIGxpc3QgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2YWx1ZXMuXG4gICAqL1xuICBUeXBlOiAnTGlzdCc7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBBV1MgQ2xvdWRGb3JtYXRpb24gYWxsb3dzIGR1cGxpY2F0ZSB2YWx1ZXMuIElmIHRoZSB2YWx1ZSBpcyBgYHRydWVgYCwgQVdTIENsb3VkRm9ybWF0aW9uXG4gICAqIGlnbm9yZXMgZHVwbGljYXRlIHZhbHVlcy4gaWYgdGhlIHZhbHVlIGlzICBgYGZhbHNlYGAsIEFXUyBDbG91ZEZvcm1hdGlvbiByZXR1cm5zIGFuIGFycm9yIGlmIHlvdSBzdWJtaXQgZHVwbGljYXRlXG4gICAqIHZhbHVlcy5cbiAgICovXG4gIER1cGxpY2F0ZXNBbGxvd2VkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmltaXRpdmVMaXN0UHJvcGVydHkgZXh0ZW5kcyBMaXN0UHJvcGVydHlCYXNlIHtcbiAgLyoqIFRoZSB2YWxpZCBwcmltaXRpdmUgdHlwZSBmb3IgdGhlIHByb3BlcnR5LiAqL1xuICBQcmltaXRpdmVJdGVtVHlwZTogUHJpbWl0aXZlVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV4TGlzdFByb3BlcnR5IGV4dGVuZHMgTGlzdFByb3BlcnR5QmFzZSB7XG4gIC8qKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0eSAqL1xuICBJdGVtVHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcFByb3BlcnR5QmFzZSBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIC8qKiBBIG1hcCBpcyBhIHNldCBvZiBrZXktdmFsdWUgcGFpcnMsIHdoZXJlIHRoZSBrZXlzIGFyZSBhbHdheXMgc3RyaW5ncy4gKi9cbiAgVHlwZTogJ01hcCc7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBBV1MgQ2xvdWRGb3JtYXRpb24gYWxsb3dzIGR1cGxpY2F0ZSB2YWx1ZXMuIElmIHRoZSB2YWx1ZSBpcyBgYHRydWVgYCwgQVdTIENsb3VkRm9ybWF0aW9uXG4gICAqIGlnbm9yZXMgZHVwbGljYXRlIHZhbHVlcy4gaWYgdGhlIHZhbHVlIGlzICBgYGZhbHNlYGAsIEFXUyBDbG91ZEZvcm1hdGlvbiByZXR1cm5zIGFuIGFycm9yIGlmIHlvdSBzdWJtaXQgZHVwbGljYXRlXG4gICAqIHZhbHVlcy5cbiAgICovXG4gIER1cGxpY2F0ZXNBbGxvd2VkPzogZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpbWl0aXZlTWFwUHJvcGVydHkgZXh0ZW5kcyBNYXBQcm9wZXJ0eUJhc2Uge1xuICAvKiogVGhlIHZhbGlkIHByaW1pdGl2ZSB0eXBlIGZvciB0aGUgcHJvcGVydHkuICovXG4gIFByaW1pdGl2ZUl0ZW1UeXBlOiBQcmltaXRpdmVUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcE9mU3RydWN0cyBleHRlbmRzIE1hcFByb3BlcnR5QmFzZSB7XG4gIC8qKiBWYWxpZCB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0eSAqL1xuICBJdGVtVHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcE9mTGlzdHNPZlByaW1pdGl2ZXMgZXh0ZW5kcyBNYXBQcm9wZXJ0eUJhc2Uge1xuICAvKiogVGhlIHR5cGUgb2YgdGhlIG1hcCB2YWx1ZXMsIHdoaWNoIGluIHRoaXMgY2FzZSBpcyBhbHdheXMgJ0xpc3QnLiAqL1xuICBJdGVtVHlwZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdmFsaWQgcHJpbWl0aXZlIHR5cGUgZm9yIHRoZSBsaXN0cyB0aGF0IGFyZSB0aGUgdmFsdWVzIG9mIHRoaXMgbWFwLiAqL1xuICBQcmltaXRpdmVJdGVtSXRlbVR5cGU6IFByaW1pdGl2ZVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFnUHJvcGVydHlTdGFuZGFyZCBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIEl0ZW1UeXBlOiAnVGFnJyB8ICdUYWdzRW50cnknIHwgJ1RhZ1JlZicgfCAnRWxhc3RpY0ZpbGVTeXN0ZW1UYWcnIHwgJ0hvc3RlZFpvbmVUYWcnIHwgJ0FjY2Vzc1BvaW50VGFnJztcbiAgVHlwZTogJ1RhZ3MnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ1Byb3BlcnR5QXV0b1NjYWxpbmdHcm91cCBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIEl0ZW1UeXBlOiAnVGFnUHJvcGVydHknO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ1Byb3BlcnR5SnNvbiBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIFByaW1pdGl2ZVR5cGU6IFByaW1pdGl2ZVR5cGUuSnNvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYWdQcm9wZXJ0eVN0cmluZ01hcCBleHRlbmRzIFByb3BlcnR5QmFzZSB7XG4gIFByaW1pdGl2ZUl0ZW1UeXBlOiAnU3RyaW5nJztcbn1cblxuLyoqXG4gKiBBIHByb3BlcnR5IHR5cGUgdGhhdCBjYW4gYmUgb25lIG9mIHNldmVyYWwgdHlwZXMuIEN1cnJlbnRseSB1c2VkIG9ubHkgaW4gU0FNLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaW9uUHJvcGVydHkgZXh0ZW5kcyBQcm9wZXJ0eUJhc2Uge1xuICAvKiogVmFsaWQgcHJpbWl0aXZlIHR5cGVzIGZvciB0aGUgcHJvcGVydHkgKi9cbiAgUHJpbWl0aXZlVHlwZXM/OiBQcmltaXRpdmVUeXBlW107XG4gIC8qKiBWYWxpZCBjb21wbGV4IHR5cGVzIGZvciB0aGUgcHJvcGVydHkgKi9cbiAgVHlwZXM/OiBzdHJpbmdbXVxuICAvKiogVmFsaWQgcHJpbWl0aXZlIGl0ZW0gdHlwZXMgZm9yIHRoaXMgcHJvcGVydHkgKi9cbiAgUHJpbWl0aXZlSXRlbVR5cGVzPzogUHJpbWl0aXZlVHlwZVtdO1xuICAvKiogVmFsaWQgbGlzdCBpdGVtIHR5cGVzIGZvciB0aGUgcHJvcGVydHkgKi9cbiAgSXRlbVR5cGVzPzogc3RyaW5nW107XG4gIC8qKiBWYWxpZCBjb21wbGV4IHR5cGVzIGZvciB0aGlzIHByb3BlcnR5ICovXG4gIEluY2x1c2l2ZUl0ZW1UeXBlcz86IHN0cmluZ1tdO1xuICAvKiogVmFsaWQgcHJpbWl0aXZlIGl0ZW0gdHlwZXMgZm9yIHRoaXMgcHJvcGVydHkgKi9cbiAgSW5jbHVzaXZlUHJpbWl0aXZlSXRlbVR5cGVzPzogUHJpbWl0aXZlVHlwZVtdO1xufVxuXG5leHBvcnQgZW51bSBVcGRhdGVUeXBlIHtcbiAgQ29uZGl0aW9uYWwgPSAnQ29uZGl0aW9uYWwnLFxuICBJbW11dGFibGUgPSAnSW1tdXRhYmxlJyxcbiAgTXV0YWJsZSA9ICdNdXRhYmxlJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVcGRhdGVUeXBlKHN0cjogc3RyaW5nKTogc3RyIGlzIFVwZGF0ZVR5cGUge1xuICBzd2l0Y2ggKHN0cikge1xuICAgIGNhc2UgVXBkYXRlVHlwZS5Db25kaXRpb25hbDpcbiAgICBjYXNlIFVwZGF0ZVR5cGUuSW1tdXRhYmxlOlxuICAgIGNhc2UgVXBkYXRlVHlwZS5NdXRhYmxlOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY2FsYXJQcm9wZXJ0eShwcm9wOiBQcm9wZXJ0eSk6IHByb3AgaXMgU2NhbGFyUHJvcGVydHkge1xuICByZXR1cm4gaXNQcmltaXRpdmVQcm9wZXJ0eShwcm9wKVxuICAgIHx8IGlzQ29tcGxleFByb3BlcnR5KHByb3ApXG4gICAgLy8gQSBVbmlvblByb3BlcnR5IGlzIG9ubHkgU2NhbGFyIGlmIGl0IGRlZmluZXMgVHlwZXMgb3IgUHJpbWl0aXZlVHlwZXNcbiAgICB8fCAoaXNVbmlvblByb3BlcnR5KHByb3ApICYmICEhKHByb3AuVHlwZXMgfHwgcHJvcC5QcmltaXRpdmVUeXBlcykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmVQcm9wZXJ0eShwcm9wOiBQcm9wZXJ0eSk6IHByb3AgaXMgUHJpbWl0aXZlUHJvcGVydHkge1xuICByZXR1cm4gISEocHJvcCBhcyBQcmltaXRpdmVQcm9wZXJ0eSkuUHJpbWl0aXZlVHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGxleFByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBDb21wbGV4UHJvcGVydHkge1xuICBjb25zdCBwcm9wVHlwZSA9IChwcm9wIGFzIENvbXBsZXhQcm9wZXJ0eSkuVHlwZTtcbiAgcmV0dXJuIHByb3BUeXBlICE9IG51bGwgJiYgcHJvcFR5cGUgIT09ICdNYXAnICYmIHByb3BUeXBlICE9PSAnTGlzdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbGxlY3Rpb25Qcm9wZXJ0eShwcm9wOiBQcm9wZXJ0eSk6IHByb3AgaXMgQ29sbGVjdGlvblByb3BlcnR5IHtcbiAgcmV0dXJuIGlzTGlzdFByb3BlcnR5KHByb3ApXG4gICAgfHwgaXNNYXBQcm9wZXJ0eShwcm9wKVxuICAgIC8vIEEgVW5pb25Qcm9wZXJ0eSBpcyBvbmx5IENvbGxlY3Rpb24gaWYgaXQgZGVmaW5lcyBJdGVtVHlwZXMgb3IgUHJpbWl0aXZlSXRlbVR5cGVzXG4gICAgfHwgKGlzVW5pb25Qcm9wZXJ0eShwcm9wKSAmJiAhIShwcm9wLkl0ZW1UeXBlcyB8fCBwcm9wLlByaW1pdGl2ZUl0ZW1UeXBlcyB8fCBwcm9wLkluY2x1c2l2ZUl0ZW1UeXBlcyB8fCBwcm9wLkluY2x1c2l2ZVByaW1pdGl2ZUl0ZW1UeXBlcykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMaXN0UHJvcGVydHkocHJvcDogUHJvcGVydHkpOiBwcm9wIGlzIExpc3RQcm9wZXJ0eSB7XG4gIHJldHVybiAocHJvcCBhcyBMaXN0UHJvcGVydHkpLlR5cGUgPT09ICdMaXN0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlTGlzdFByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBQcmltaXRpdmVMaXN0UHJvcGVydHkge1xuICByZXR1cm4gaXNMaXN0UHJvcGVydHkocHJvcCkgJiYgISEocHJvcCBhcyBQcmltaXRpdmVMaXN0UHJvcGVydHkpLlByaW1pdGl2ZUl0ZW1UeXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wbGV4TGlzdFByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBDb21wbGV4TGlzdFByb3BlcnR5IHtcbiAgcmV0dXJuIGlzTGlzdFByb3BlcnR5KHByb3ApICYmICEhKHByb3AgYXMgQ29tcGxleExpc3RQcm9wZXJ0eSkuSXRlbVR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hcFByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBNYXBQcm9wZXJ0eSB7XG4gIHJldHVybiAocHJvcCBhcyBNYXBQcm9wZXJ0eSkuVHlwZSA9PT0gJ01hcCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZU1hcFByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBQcmltaXRpdmVNYXBQcm9wZXJ0eSB7XG4gIHJldHVybiBpc01hcFByb3BlcnR5KHByb3ApICYmICEhKHByb3AgYXMgUHJpbWl0aXZlTWFwUHJvcGVydHkpLlByaW1pdGl2ZUl0ZW1UeXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNYXBPZlN0cnVjdHNQcm9wZXJ0eShwcm9wOiBQcm9wZXJ0eSk6IHByb3AgaXMgTWFwT2ZTdHJ1Y3RzIHtcbiAgcmV0dXJuIGlzTWFwUHJvcGVydHkocHJvcCkgJiZcbiAgICAhaXNQcmltaXRpdmVNYXBQcm9wZXJ0eShwcm9wKSAmJlxuICAgICFpc01hcE9mTGlzdHNPZlByaW1pdGl2ZXNQcm9wZXJ0eShwcm9wKTtcbn1cblxuLy8gbm90ZTogdGhpcyAoYW5kIHRoZSBNYXBPZkxpc3RzT2ZQcmltaXRpdmVzIHR5cGUpIGFyZSBub3QgYWN0dWFsbHkgdmFsaWQgaW4gdGhlIENGTiBzcGVjIVxuLy8gdGhleSBhcmUgb25seSBoZXJlIHRvIHN1cHBvcnQgb3VyIHBhdGNoIG9mIHRoZSBDRk4gc3BlY1xuLy8gdG8gYWxsZXZpYXRlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMzA5MlxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFwT2ZMaXN0c09mUHJpbWl0aXZlc1Byb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBNYXBPZkxpc3RzT2ZQcmltaXRpdmVzIHtcbiAgcmV0dXJuIGlzTWFwUHJvcGVydHkocHJvcCkgJiYgKHByb3AgYXMgQ29tcGxleE1hcFByb3BlcnR5KS5JdGVtVHlwZSA9PT0gJ0xpc3QnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmlvblByb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBVbmlvblByb3BlcnR5IHtcbiAgY29uc3QgY2FzdFByb3AgPSBwcm9wIGFzIFVuaW9uUHJvcGVydHk7XG4gIHJldHVybiAhIShcbiAgICBjYXN0UHJvcC5JdGVtVHlwZXMgfHxcbiAgICBjYXN0UHJvcC5QcmltaXRpdmVUeXBlcyB8fFxuICAgIGNhc3RQcm9wLlR5cGVzIHx8XG4gICAgY2FzdFByb3AuUHJpbWl0aXZlSXRlbVR5cGVzIHx8XG4gICAgY2FzdFByb3AuSW5jbHVzaXZlSXRlbVR5cGVzIHx8XG4gICAgY2FzdFByb3AuSW5jbHVzaXZlUHJpbWl0aXZlSXRlbVR5cGVzXG4gICk7XG59XG5cbmV4cG9ydCBlbnVtIFByb3BlcnR5U2NydXRpbnlUeXBlIHtcbiAgLyoqXG4gICAqIE5vIGFkZGl0aW9uYWwgc2NydXRpbnlcbiAgICovXG4gIE5vbmUgPSAnTm9uZScsXG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYW4gSUFNIHBvbGljeSBkaXJlY3RseSBvbiBhIHJlc291cmNlXG4gICAqL1xuICBJbmxpbmVSZXNvdXJjZVBvbGljeSA9ICdJbmxpbmVSZXNvdXJjZVBvbGljeScsXG5cbiAgLyoqXG4gICAqIEVpdGhlciBhbiBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQgb3IgYSBkaWN0aW9uYXJ5IG9mIHBvbGljeSBkb2N1bWVudHNcbiAgICovXG4gIElubGluZUlkZW50aXR5UG9saWNpZXMgPSAnSW5saW5lSWRlbnRpdHlQb2xpY2llcycsXG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBtYW5hZ2VkIHBvbGljaWVzIChvbiBhbiBpZGVudGl0eSByZXNvdXJjZSlcbiAgICovXG4gIE1hbmFnZWRQb2xpY2llcyA9ICdNYW5hZ2VkUG9saWNpZXMnLFxuXG4gIC8qKlxuICAgKiBBIHNldCBvZiBpbmdyZXNzIHJ1bGVzIChvbiBhIHNlY3VyaXR5IGdyb3VwKVxuICAgKi9cbiAgSW5ncmVzc1J1bGVzID0gJ0luZ3Jlc3NSdWxlcycsXG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIGVncmVzcyBydWxlcyAob24gYSBzZWN1cml0eSBncm91cClcbiAgICovXG4gIEVncmVzc1J1bGVzID0gJ0VncmVzc1J1bGVzJyxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvcGVydHlTY3J1dGlueVR5cGUoc3RyOiBzdHJpbmcpOiBzdHIgaXMgUHJvcGVydHlTY3J1dGlueVR5cGUge1xuICByZXR1cm4gKFByb3BlcnR5U2NydXRpbnlUeXBlIGFzIGFueSlbc3RyXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5jb25zdCB0YWdQcm9wZXJ0eU5hbWVzID0ge1xuICBGaWxlU3lzdGVtVGFnczogJycsXG4gIEhvc3RlZFpvbmVUYWdzOiAnJyxcbiAgVGFnczogJycsXG4gIFVzZXJQb29sVGFnczogJycsXG4gIEFjY2Vzc1BvaW50VGFnczogJycsXG59O1xuXG5leHBvcnQgdHlwZSBUYWdQcm9wZXJ0eU5hbWUgPSBrZXlvZiB0eXBlb2YgdGFnUHJvcGVydHlOYW1lcztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFnUHJvcGVydHlOYW1lKG5hbWU/OiBzdHJpbmcpOiBuYW1lIGlzIFRhZ1Byb3BlcnR5TmFtZSB7XG4gIGlmICh1bmRlZmluZWQgPT09IG5hbWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRhZ1Byb3BlcnR5TmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSk7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIHRoYXQgdGhlIHByb3BlcnR5ICoqY2FuKiogYmUgYSBUYWcgUHJvcGVydHlcbiAqXG4gKiBUaGUgcHJvcGVydHkgaXMgb25seSBhIFRhZyBpZiB0aGUgbmFtZSBvZiB0aGlzIHByb3BlcnR5IGlzIFRhZ3MsIHdoaWNoIGlzXG4gKiB2YWxpZGF0ZWQgdXNpbmcgYFJlc291cmNlVHlwZS5pc1RhZ2dhYmxlKHJlc291cmNlKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RhZ1Byb3BlcnR5KHByb3A6IFByb3BlcnR5KTogcHJvcCBpcyBUYWdQcm9wZXJ0eSB7XG4gIHJldHVybiAoXG4gICAgaXNUYWdQcm9wZXJ0eVN0YW5kYXJkKHByb3ApIHx8XG4gICAgaXNUYWdQcm9wZXJ0eUF1dG9TY2FsaW5nR3JvdXAocHJvcCkgfHxcbiAgICBpc1RhZ1Byb3BlcnR5SnNvbihwcm9wKSB8fFxuICAgIGlzVGFnUHJvcGVydHlTdHJpbmdNYXAocHJvcClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFnUHJvcGVydHlTdGFuZGFyZChwcm9wOiBQcm9wZXJ0eSk6IHByb3AgaXMgVGFnUHJvcGVydHlTdGFuZGFyZCB7XG4gIHJldHVybiAoXG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuSXRlbVR5cGUgPT09ICdUYWcnIHx8XG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuSXRlbVR5cGUgPT09ICdUYWdzRW50cnknIHx8XG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuVHlwZSA9PT0gJ1RhZ3MnIHx8XG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuSXRlbVR5cGUgPT09ICdUYWdSZWYnIHx8XG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuSXRlbVR5cGUgPT09ICdFbGFzdGljRmlsZVN5c3RlbVRhZycgfHxcbiAgICAocHJvcCBhcyBUYWdQcm9wZXJ0eVN0YW5kYXJkKS5JdGVtVHlwZSA9PT0gJ0hvc3RlZFpvbmVUYWcnIHx8XG4gICAgKHByb3AgYXMgVGFnUHJvcGVydHlTdGFuZGFyZCkuSXRlbVR5cGUgPT09ICdBY2Nlc3NQb2ludFRhZydcbiAgKTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUYWdQcm9wZXJ0eUF1dG9TY2FsaW5nR3JvdXAocHJvcDogUHJvcGVydHkpOiBwcm9wIGlzIFRhZ1Byb3BlcnR5QXV0b1NjYWxpbmdHcm91cCB7XG4gIHJldHVybiAocHJvcCBhcyBUYWdQcm9wZXJ0eUF1dG9TY2FsaW5nR3JvdXApLkl0ZW1UeXBlID09PSAnVGFnUHJvcGVydHknO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUYWdQcm9wZXJ0eUpzb24ocHJvcDogUHJvcGVydHkpOiBwcm9wIGlzIFRhZ1Byb3BlcnR5SnNvbiB7XG4gIHJldHVybiAocHJvcCBhcyBUYWdQcm9wZXJ0eUpzb24pLlByaW1pdGl2ZVR5cGUgPT09IFByaW1pdGl2ZVR5cGUuSnNvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFnUHJvcGVydHlTdHJpbmdNYXAocHJvcDogUHJvcGVydHkpOiBwcm9wIGlzIFRhZ1Byb3BlcnR5U3RyaW5nTWFwIHtcbiAgcmV0dXJuIChwcm9wIGFzIFRhZ1Byb3BlcnR5U3RyaW5nTWFwKS5QcmltaXRpdmVJdGVtVHlwZSA9PT0gJ1N0cmluZyc7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isResourceScrutinyType = exports.ResourceScrutinyType = exports.SpecialRefKind = exports.isPrimitiveMapAttribute = exports.isComplexListAttribute = exports.isPrimitiveListAttribute = exports.isMapAttribute = exports.isListAttribute = exports.isPrimitiveAttribute = exports.isTaggableResource = void 0;\nconst property_1 = require(\"./property\");\n/**\n * Determine if the resource supports tags\n *\n * This function combined with isTagProperty determines if the `cdk.TagManager`\n * and `cdk.TaggableResource` can process these tags. If not, standard code\n * generation of properties will be used.\n */\nfunction isTaggableResource(spec) {\n if (spec.Properties === undefined) {\n return false;\n }\n for (const key of Object.keys(spec.Properties)) {\n if ((0, property_1.isTagPropertyName)(key) && (0, property_1.isTagProperty)(spec.Properties[key])) {\n return true;\n }\n }\n return false;\n}\nexports.isTaggableResource = isTaggableResource;\nfunction isPrimitiveAttribute(spec) {\n return !!spec.PrimitiveType;\n}\nexports.isPrimitiveAttribute = isPrimitiveAttribute;\nfunction isListAttribute(spec) {\n return spec.Type === 'List';\n}\nexports.isListAttribute = isListAttribute;\nfunction isMapAttribute(spec) {\n return spec.Type === 'Map';\n}\nexports.isMapAttribute = isMapAttribute;\nfunction isPrimitiveListAttribute(spec) {\n return isListAttribute(spec) && !!spec.PrimitiveItemType;\n}\nexports.isPrimitiveListAttribute = isPrimitiveListAttribute;\nfunction isComplexListAttribute(spec) {\n return isListAttribute(spec) && !!spec.ItemType;\n}\nexports.isComplexListAttribute = isComplexListAttribute;\nfunction isPrimitiveMapAttribute(spec) {\n return isMapAttribute(spec) && !!spec.PrimitiveItemType;\n}\nexports.isPrimitiveMapAttribute = isPrimitiveMapAttribute;\n/**\n * Type declaration for special values of the \"Ref\" attribute represents.\n *\n * The attribute can take on more values than these, but these are treated specially.\n */\nvar SpecialRefKind;\n(function (SpecialRefKind) {\n /**\n * No '.ref' member is generated for this type, because it doesn't have a meaningful value.\n */\n SpecialRefKind[\"None\"] = \"None\";\n /**\n * The generated class will inherit from the built-in 'Arn' type.\n */\n SpecialRefKind[\"Arn\"] = \"Arn\";\n})(SpecialRefKind || (exports.SpecialRefKind = SpecialRefKind = {}));\nvar ResourceScrutinyType;\n(function (ResourceScrutinyType) {\n /**\n * No additional scrutiny\n */\n ResourceScrutinyType[\"None\"] = \"None\";\n /**\n * An externally attached policy document to a resource\n *\n * (Common for SQS, SNS, S3, ...)\n */\n ResourceScrutinyType[\"ResourcePolicyResource\"] = \"ResourcePolicyResource\";\n /**\n * This is an IAM policy on an identity resource\n *\n * (Basically saying: this is AWS::IAM::Policy)\n */\n ResourceScrutinyType[\"IdentityPolicyResource\"] = \"IdentityPolicyResource\";\n /**\n * This is a Lambda Permission policy\n */\n ResourceScrutinyType[\"LambdaPermission\"] = \"LambdaPermission\";\n /**\n * An ingress rule object\n */\n ResourceScrutinyType[\"IngressRuleResource\"] = \"IngressRuleResource\";\n /**\n * A set of egress rules\n */\n ResourceScrutinyType[\"EgressRuleResource\"] = \"EgressRuleResource\";\n})(ResourceScrutinyType || (exports.ResourceScrutinyType = ResourceScrutinyType = {}));\nfunction isResourceScrutinyType(str) {\n return ResourceScrutinyType[str] !== undefined;\n}\nexports.isResourceScrutinyType = isResourceScrutinyType;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlc291cmNlLXR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXFGO0FBaUVyRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxJQUFrQjtJQUNuRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFO1FBQ2pDLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQzlDLElBQUksSUFBQSw0QkFBaUIsRUFBQyxHQUFHLENBQUMsSUFBSSxJQUFBLHdCQUFhLEVBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2pFLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQVZELGdEQVVDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsSUFBZTtJQUNsRCxPQUFPLENBQUMsQ0FBRSxJQUEyQixDQUFDLGFBQWEsQ0FBQztBQUN0RCxDQUFDO0FBRkQsb0RBRUM7QUFFRCxTQUFnQixlQUFlLENBQUMsSUFBZTtJQUM3QyxPQUFRLElBQXNCLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUNqRCxDQUFDO0FBRkQsMENBRUM7QUFFRCxTQUFnQixjQUFjLENBQUMsSUFBZTtJQUM1QyxPQUFRLElBQXFCLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztBQUMvQyxDQUFDO0FBRkQsd0NBRUM7QUFFRCxTQUFnQix3QkFBd0IsQ0FBQyxJQUFlO0lBQ3RELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBRSxJQUErQixDQUFDLGlCQUFpQixDQUFDO0FBQ3ZGLENBQUM7QUFGRCw0REFFQztBQUVELFNBQWdCLHNCQUFzQixDQUFDLElBQWU7SUFDcEQsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFFLElBQTZCLENBQUMsUUFBUSxDQUFDO0FBQzVFLENBQUM7QUFGRCx3REFFQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLElBQWU7SUFDckQsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFFLElBQThCLENBQUMsaUJBQWlCLENBQUM7QUFDckYsQ0FBQztBQUZELDBEQUVDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksY0FVWDtBQVZELFdBQVksY0FBYztJQUN4Qjs7T0FFRztJQUNILCtCQUFhLENBQUE7SUFFYjs7T0FFRztJQUNILDZCQUFXLENBQUE7QUFDYixDQUFDLEVBVlcsY0FBYyw4QkFBZCxjQUFjLFFBVXpCO0FBRUQsSUFBWSxvQkFrQ1g7QUFsQ0QsV0FBWSxvQkFBb0I7SUFDOUI7O09BRUc7SUFDSCxxQ0FBYSxDQUFBO0lBRWI7Ozs7T0FJRztJQUNILHlFQUFpRCxDQUFBO0lBRWpEOzs7O09BSUc7SUFDSCx5RUFBaUQsQ0FBQTtJQUVqRDs7T0FFRztJQUNILDZEQUFxQyxDQUFBO0lBRXJDOztPQUVHO0lBQ0gsbUVBQTJDLENBQUE7SUFFM0M7O09BRUc7SUFDSCxpRUFBeUMsQ0FBQTtBQUMzQyxDQUFDLEVBbENXLG9CQUFvQixvQ0FBcEIsb0JBQW9CLFFBa0MvQjtBQUVELFNBQWdCLHNCQUFzQixDQUFDLEdBQVc7SUFDaEQsT0FBUSxvQkFBNEIsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDMUQsQ0FBQztBQUZELHdEQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRG9jdW1lbnRlZCwgUHJpbWl0aXZlVHlwZSB9IGZyb20gJy4vYmFzZS10eXBlcyc7XG5pbXBvcnQgeyBpc1RhZ1Byb3BlcnR5LCBpc1RhZ1Byb3BlcnR5TmFtZSwgUHJvcGVydHksIFRhZ1Byb3BlcnR5IH0gZnJvbSAnLi9wcm9wZXJ0eSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VUeXBlIGV4dGVuZHMgRG9jdW1lbnRlZCB7XG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlcyBleHBvc2VkIGJ5IHRoZSByZXNvdXJjZSB0eXBlLCBpZiBhbnkuXG4gICAqL1xuICBBdHRyaWJ1dGVzPzogeyBbbmFtZTogc3RyaW5nXTogQXR0cmlidXRlIH07XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBhY2NlcHRlZCBieSB0aGUgcmVzb3VyY2UgdHlwZSwgaWYgYW55LlxuICAgKi9cbiAgUHJvcGVydGllcz86IHsgW25hbWU6IHN0cmluZ106IFByb3BlcnR5IH07XG4gIC8qKlxuICAgKiBUaGUgYGBUcmFuc2Zvcm1gYCByZXF1aXJlZCBieSB0aGUgcmVzb3VyY2UgdHlwZSwgaWYgYW55LlxuICAgKi9cbiAgUmVxdWlyZWRUcmFuc2Zvcm0/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQga2luZCBvZiB2YWx1ZSB0aGUgJ1JlZicgb3BlcmF0b3IgcmVmZXJzIHRvLCBpZiBhbnkuXG4gICAqL1xuICBSZWZLaW5kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEdXJpbmcgYSBzdGFjayB1cGRhdGUsIHdoYXQga2luZCBvZiBhZGRpdGlvbmFsIHNjcnV0aW55IGNoYW5nZXMgdG8gdGhpcyByZXNvdXJjZSBzaG91bGQgYmUgc3ViamVjdGVkIHRvXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIFNjcnV0aW55VHlwZT86IFJlc291cmNlU2NydXRpbnlUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ2dhYmxlUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZVR5cGUge1xuICBQcm9wZXJ0aWVzOiB7XG4gICAgRmlsZVN5c3RlbVRhZ3M6IFRhZ1Byb3BlcnR5O1xuICAgIEhvc3RlZFpvbmVUYWdzOiBUYWdQcm9wZXJ0eTtcbiAgICBUYWdzOiBUYWdQcm9wZXJ0eTtcbiAgICBVc2VyUG9vbFRhZ3M6IFRhZ1Byb3BlcnR5O1xuICAgIEFjY2Vzc1BvaW50VGFnczogVGFnUHJvcGVydHk7XG4gICAgW25hbWU6IHN0cmluZ106IFByb3BlcnR5O1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEF0dHJpYnV0ZSA9IFByaW1pdGl2ZUF0dHJpYnV0ZSB8IExpc3RBdHRyaWJ1dGUgfCBNYXBBdHRyaWJ1dGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpbWl0aXZlQXR0cmlidXRlIHtcbiAgUHJpbWl0aXZlVHlwZTogUHJpbWl0aXZlVHlwZTtcbn1cblxuZXhwb3J0IHR5cGUgTGlzdEF0dHJpYnV0ZSA9IFByaW1pdGl2ZUxpc3RBdHRyaWJ1dGUgfCBDb21wbGV4TGlzdEF0dHJpYnV0ZTtcblxuZXhwb3J0IGludGVyZmFjZSBQcmltaXRpdmVMaXN0QXR0cmlidXRlIHtcbiAgVHlwZTogJ0xpc3QnO1xuICBQcmltaXRpdmVJdGVtVHlwZTogUHJpbWl0aXZlVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV4TGlzdEF0dHJpYnV0ZSB7XG4gIFR5cGU6ICdMaXN0JztcbiAgSXRlbVR5cGU6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTWFwQXR0cmlidXRlID0gUHJpbWl0aXZlTWFwQXR0cmlidXRlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByaW1pdGl2ZU1hcEF0dHJpYnV0ZSB7XG4gIFR5cGU6ICdNYXAnO1xuICBQcmltaXRpdmVJdGVtVHlwZTogUHJpbWl0aXZlVHlwZTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHJlc291cmNlIHN1cHBvcnRzIHRhZ3NcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGNvbWJpbmVkIHdpdGggaXNUYWdQcm9wZXJ0eSBkZXRlcm1pbmVzIGlmIHRoZSBgY2RrLlRhZ01hbmFnZXJgXG4gKiBhbmQgYGNkay5UYWdnYWJsZVJlc291cmNlYCBjYW4gcHJvY2VzcyB0aGVzZSB0YWdzLiBJZiBub3QsIHN0YW5kYXJkIGNvZGVcbiAqIGdlbmVyYXRpb24gb2YgcHJvcGVydGllcyB3aWxsIGJlIHVzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RhZ2dhYmxlUmVzb3VyY2Uoc3BlYzogUmVzb3VyY2VUeXBlKTogc3BlYyBpcyBUYWdnYWJsZVJlc291cmNlIHtcbiAgaWYgKHNwZWMuUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNwZWMuUHJvcGVydGllcykpIHtcbiAgICBpZiAoaXNUYWdQcm9wZXJ0eU5hbWUoa2V5KSAmJiBpc1RhZ1Byb3BlcnR5KHNwZWMuUHJvcGVydGllc1trZXldKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlQXR0cmlidXRlKHNwZWM6IEF0dHJpYnV0ZSk6IHNwZWMgaXMgUHJpbWl0aXZlQXR0cmlidXRlIHtcbiAgcmV0dXJuICEhKHNwZWMgYXMgUHJpbWl0aXZlQXR0cmlidXRlKS5QcmltaXRpdmVUeXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMaXN0QXR0cmlidXRlKHNwZWM6IEF0dHJpYnV0ZSk6IHNwZWMgaXMgTGlzdEF0dHJpYnV0ZSB7XG4gIHJldHVybiAoc3BlYyBhcyBMaXN0QXR0cmlidXRlKS5UeXBlID09PSAnTGlzdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hcEF0dHJpYnV0ZShzcGVjOiBBdHRyaWJ1dGUpOiBzcGVjIGlzIE1hcEF0dHJpYnV0ZSB7XG4gIHJldHVybiAoc3BlYyBhcyBNYXBBdHRyaWJ1dGUpLlR5cGUgPT09ICdNYXAnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmVMaXN0QXR0cmlidXRlKHNwZWM6IEF0dHJpYnV0ZSk6IHNwZWMgaXMgUHJpbWl0aXZlTGlzdEF0dHJpYnV0ZSB7XG4gIHJldHVybiBpc0xpc3RBdHRyaWJ1dGUoc3BlYykgJiYgISEoc3BlYyBhcyBQcmltaXRpdmVMaXN0QXR0cmlidXRlKS5QcmltaXRpdmVJdGVtVHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGxleExpc3RBdHRyaWJ1dGUoc3BlYzogQXR0cmlidXRlKTogc3BlYyBpcyBDb21wbGV4TGlzdEF0dHJpYnV0ZSB7XG4gIHJldHVybiBpc0xpc3RBdHRyaWJ1dGUoc3BlYykgJiYgISEoc3BlYyBhcyBDb21wbGV4TGlzdEF0dHJpYnV0ZSkuSXRlbVR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZU1hcEF0dHJpYnV0ZShzcGVjOiBBdHRyaWJ1dGUpOiBzcGVjIGlzIFByaW1pdGl2ZU1hcEF0dHJpYnV0ZSB7XG4gIHJldHVybiBpc01hcEF0dHJpYnV0ZShzcGVjKSAmJiAhIShzcGVjIGFzIFByaW1pdGl2ZU1hcEF0dHJpYnV0ZSkuUHJpbWl0aXZlSXRlbVR5cGU7XG59XG5cbi8qKlxuICogVHlwZSBkZWNsYXJhdGlvbiBmb3Igc3BlY2lhbCB2YWx1ZXMgb2YgdGhlIFwiUmVmXCIgYXR0cmlidXRlIHJlcHJlc2VudHMuXG4gKlxuICogVGhlIGF0dHJpYnV0ZSBjYW4gdGFrZSBvbiBtb3JlIHZhbHVlcyB0aGFuIHRoZXNlLCBidXQgdGhlc2UgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5LlxuICovXG5leHBvcnQgZW51bSBTcGVjaWFsUmVmS2luZCB7XG4gIC8qKlxuICAgKiBObyAnLnJlZicgbWVtYmVyIGlzIGdlbmVyYXRlZCBmb3IgdGhpcyB0eXBlLCBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBhIG1lYW5pbmdmdWwgdmFsdWUuXG4gICAqL1xuICBOb25lID0gJ05vbmUnLFxuXG4gIC8qKlxuICAgKiBUaGUgZ2VuZXJhdGVkIGNsYXNzIHdpbGwgaW5oZXJpdCBmcm9tIHRoZSBidWlsdC1pbiAnQXJuJyB0eXBlLlxuICAgKi9cbiAgQXJuID0gJ0Fybidcbn1cblxuZXhwb3J0IGVudW0gUmVzb3VyY2VTY3J1dGlueVR5cGUge1xuICAvKipcbiAgICogTm8gYWRkaXRpb25hbCBzY3J1dGlueVxuICAgKi9cbiAgTm9uZSA9ICdOb25lJyxcblxuICAvKipcbiAgICogQW4gZXh0ZXJuYWxseSBhdHRhY2hlZCBwb2xpY3kgZG9jdW1lbnQgdG8gYSByZXNvdXJjZVxuICAgKlxuICAgKiAoQ29tbW9uIGZvciBTUVMsIFNOUywgUzMsIC4uLilcbiAgICovXG4gIFJlc291cmNlUG9saWN5UmVzb3VyY2UgPSAnUmVzb3VyY2VQb2xpY3lSZXNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYW4gSUFNIHBvbGljeSBvbiBhbiBpZGVudGl0eSByZXNvdXJjZVxuICAgKlxuICAgKiAoQmFzaWNhbGx5IHNheWluZzogdGhpcyBpcyBBV1M6OklBTTo6UG9saWN5KVxuICAgKi9cbiAgSWRlbnRpdHlQb2xpY3lSZXNvdXJjZSA9ICdJZGVudGl0eVBvbGljeVJlc291cmNlJyxcblxuICAvKipcbiAgICogVGhpcyBpcyBhIExhbWJkYSBQZXJtaXNzaW9uIHBvbGljeVxuICAgKi9cbiAgTGFtYmRhUGVybWlzc2lvbiA9ICdMYW1iZGFQZXJtaXNzaW9uJyxcblxuICAvKipcbiAgICogQW4gaW5ncmVzcyBydWxlIG9iamVjdFxuICAgKi9cbiAgSW5ncmVzc1J1bGVSZXNvdXJjZSA9ICdJbmdyZXNzUnVsZVJlc291cmNlJyxcblxuICAvKipcbiAgICogQSBzZXQgb2YgZWdyZXNzIHJ1bGVzXG4gICAqL1xuICBFZ3Jlc3NSdWxlUmVzb3VyY2UgPSAnRWdyZXNzUnVsZVJlc291cmNlJyxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VTY3J1dGlueVR5cGUoc3RyOiBzdHJpbmcpOiBzdHIgaXMgUmVzb3VyY2VTY3J1dGlueVR5cGUge1xuICByZXR1cm4gKFJlc291cmNlU2NydXRpbnlUeXBlIGFzIGFueSlbc3RyXSAhPT0gdW5kZWZpbmVkO1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isRecordType = void 0;\n/**\n * Whether the given type definition is a Record property\n */\nfunction isRecordType(propertyType) {\n return 'Properties' in propertyType;\n}\nexports.isRecordType = isRecordType;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY2lmaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNwZWNpZmljYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBa0RBOztHQUVHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLFlBQTBCO0lBQ3JELE9BQU8sWUFBWSxJQUFJLFlBQVksQ0FBQztBQUN0QyxDQUFDO0FBRkQsb0NBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2N1bWVudGVkIH0gZnJvbSAnLi9iYXNlLXR5cGVzJztcbmltcG9ydCB7IFByb3BlcnR5IH0gZnJvbSAnLi9wcm9wZXJ0eSc7XG5pbXBvcnQgeyBSZXNvdXJjZVR5cGUgfSBmcm9tICcuL3Jlc291cmNlLXR5cGUnO1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvY2ZuLXJlc291cmNlLXNwZWNpZmljYXRpb24tZm9ybWF0Lmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGVjaWZpY2F0aW9uIHtcbiAgLyoqXG4gICAqIEEgZmluZ2VycHJpbnQgb2YgdGhlIHRlbXBsYXRlLCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBoYXMgY2hhbmdlZC5cbiAgICovXG4gIEZpbmdlcnByaW50OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGb3IgcmVzb3VyY2VzIHRoYXQgaGF2ZSBwcm9wZXJ0aWVzIHdpdGhpbiBhIHByb3BlcnR5IChhbHNvIGtub3duIGFzIHN1YnByb3BlcnRpZXMpLCBhIGxpc3Qgb2Ygc3VicHJvcGVydHlcbiAgICogc3BlY2lmaWNhdGlvbnMsIHN1Y2ggYXMgd2hpY2ggcHJvcGVydGllcyBhcmUgcmVxdWlyZWQsIHRoZSB0eXBlIG9mIGFsbG93ZWQgdmFsdWUgZm9yIGVhY2ggcHJvcGVydHksIGFuZCB0aGVpclxuICAgKiB1cGRhdGUgYmVoYXZpb3IuXG4gICAqL1xuICBQcm9wZXJ0eVR5cGVzOiB7IFtuYW1lOiBzdHJpbmddOiBQcm9wZXJ0eVR5cGUgfTtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHJlc291cmNlcyBhbmQgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZXNvdXJjZSdzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXQncyBwcm9wZXJ0eSBuYW1lcywgd2hpY2hcbiAgICogcHJvcGVydGllcyBhcmUgcmVxdWlyZWQsIGFuZCB0aGVpciB1cGRhdGUgYmVoYXZpb3IuXG4gICAqL1xuICBSZXNvdXJjZVR5cGVzOiB7IFtuYW1lOiBzdHJpbmddOiBSZXNvdXJjZVR5cGUgfTtcbn1cblxuLyoqXG4gKiBEZXNjcmliaW5nIGEgdXNlci1kZWZpbmVkIHByb3BlcnR5IHR5cGVcbiAqXG4gKiBFdmVuIHRob3VnaCBsb29rcyB3ZWlyZCwgdGhlIENsb3VkRm9ybWF0aW9uIHNwZWMgZG9lcyBub3QgbWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gcHJvcGVydGllcyBhbmRcbiAqIHByb3BlcnR5IFRZUEVTOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9jZm4tcmVzb3VyY2Utc3BlY2lmaWNhdGlvbi1mb3JtYXQuaHRtbFxuICpcbiAqIFRoYXQgbWVhbnMgdGhhdCBhIFwidHlwZVwiIGNvbWVzIHdpdGggZmllbGRzIHN1Y2ggYXMgXCJSZXF1aXJlZFwiLCBcIlVwZGF0ZVR5cGUgTXV0YWJsZVwiLCBldGNcbiAqIChldmVuIHRob3VnaCB0aG9zZSBvbmx5IG1ha2Ugc2Vuc2UgZm9yIGEgcGFydGljdWxhciBQUk9QRVJUWSBvZiB0aGF0IHR5cGUpLiBUaGV5IG9ubHkgc2VlbSB0byBvY2N1clxuICogb24gbm9uLVJlY29yZCBwcm9wZXJ0aWVzIHRob3VnaC5cbiAqXG4gKiBJbiBwcmFjdGljZSwgZXZlbiB0aG91Z2ggYWxpYXNlcyBmb3IgUHJpbWl0aXZlIHByb3BlcnRpZXMgYXJlIGFsbG93ZWQsIG9ubHkgUmVjb3JkUHJvcGVydGllc1xuICogYW5kIENvbGxlY3Rpb25Qcm9wZXJ0aWVzIHNlZW0gdG8gYWN0dWFsbHkgb2NjdXIgaW4gdGhlIHNwZWMgaW4gdGhlIFwidHlwZXNcIiBzZWN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGUgPSBSZWNvcmRQcm9wZXJ0eSB8IFByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBzcGVjaWZpY2F0aW9ucyBvZiBhIHByb3BlcnR5IG9iamVjdCB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZFByb3BlcnR5IGV4dGVuZHMgRG9jdW1lbnRlZCB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiB0aGUgUHJvcGVydHkgdHlwZS5cbiAgICovXG4gIFByb3BlcnRpZXM6IHsgW25hbWU6IHN0cmluZ106IFByb3BlcnR5IH07XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBkZWZpbml0aW9uIGlzIGEgUmVjb3JkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlY29yZFR5cGUocHJvcGVydHlUeXBlOiBQcm9wZXJ0eVR5cGUpOiBwcm9wZXJ0eVR5cGUgaXMgUmVjb3JkUHJvcGVydHkge1xuICByZXR1cm4gJ1Byb3BlcnRpZXMnIGluIHByb3BlcnR5VHlwZTtcbn1cbiJdfQ==","function _aws_cdk_cloud_assembly_schema_ArtifactType(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_RuntimeInfo(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_MissingContext(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.props))\n _aws_cdk_cloud_assembly_schema_AmiContextQuery(p.props);\n if (!visitedObjects.has(p.provider))\n _aws_cdk_cloud_assembly_schema_ContextProvider(p.provider);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_ArtifactManifest(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.type))\n _aws_cdk_cloud_assembly_schema_ArtifactType(p.type);\n if (!visitedObjects.has(p.properties))\n _aws_cdk_cloud_assembly_schema_AwsCloudFormationStackProperties(p.properties);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_AssemblyManifest(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.artifacts != null)\n for (const o of Object.values(p.artifacts))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_ArtifactManifest(o);\n if (p.missing != null)\n for (const o of p.missing)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_MissingContext(o);\n if (!visitedObjects.has(p.runtime))\n _aws_cdk_cloud_assembly_schema_RuntimeInfo(p.runtime);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_FileAssetMetadataEntry(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_Tag(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_ContainerImageAssetCacheOption(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_ContainerImageAssetMetadataEntry(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.cacheFrom != null)\n for (const o of p.cacheFrom)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_ContainerImageAssetCacheOption(o);\n if (!visitedObjects.has(p.cacheTo))\n _aws_cdk_cloud_assembly_schema_ContainerImageAssetCacheOption(p.cacheTo);\n if (\"imageNameParameter\" in p)\n print(\"@aws-cdk/cloud-assembly-schema.ContainerImageAssetMetadataEntry#imageNameParameter\", \"specify `repositoryName` and `imageTag` instead, and then you\\nknow where the image will go.\");\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_ArtifactMetadataEntryType(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_MetadataEntry(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_BootstrapRole(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AwsCloudFormationStackProperties(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.lookupRole))\n _aws_cdk_cloud_assembly_schema_BootstrapRole(p.lookupRole);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_AssetManifestOptions(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AssetManifestProperties(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_TreeArtifactProperties(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_NestedCloudAssemblyProperties(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_ContextProvider(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AmiContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AvailabilityZonesContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_HostedZoneContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_SSMParameterContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_VpcContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_EndpointServiceAvailabilityZonesContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadBalancerType(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadBalancerFilter(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.loadBalancerType))\n _aws_cdk_cloud_assembly_schema_LoadBalancerType(p.loadBalancerType);\n if (p.loadBalancerTags != null)\n for (const o of p.loadBalancerTags)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_Tag(o);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadBalancerContextQuery(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.loadBalancerType))\n _aws_cdk_cloud_assembly_schema_LoadBalancerType(p.loadBalancerType);\n if (p.loadBalancerTags != null)\n for (const o of p.loadBalancerTags)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_Tag(o);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadBalancerListenerProtocol(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadBalancerListenerContextQuery(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.listenerProtocol))\n _aws_cdk_cloud_assembly_schema_LoadBalancerListenerProtocol(p.listenerProtocol);\n if (!visitedObjects.has(p.loadBalancerType))\n _aws_cdk_cloud_assembly_schema_LoadBalancerType(p.loadBalancerType);\n if (p.loadBalancerTags != null)\n for (const o of p.loadBalancerTags)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_Tag(o);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_SecurityGroupContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_KeyContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_PluginContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AssetManifest(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.dockerImages != null)\n for (const o of Object.values(p.dockerImages))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_DockerImageAsset(o);\n if (p.files != null)\n for (const o of Object.values(p.files))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_FileAsset(o);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_DockerImageAsset(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.destinations != null)\n for (const o of Object.values(p.destinations))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_DockerImageDestination(o);\n if (!visitedObjects.has(p.source))\n _aws_cdk_cloud_assembly_schema_DockerImageSource(p.source);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_DockerImageSource(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.cacheFrom != null)\n for (const o of p.cacheFrom)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_DockerCacheOption(o);\n if (!visitedObjects.has(p.cacheTo))\n _aws_cdk_cloud_assembly_schema_DockerCacheOption(p.cacheTo);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_DockerImageDestination(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_DockerCacheOption(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_FileAsset(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.destinations != null)\n for (const o of Object.values(p.destinations))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_FileDestination(o);\n if (!visitedObjects.has(p.source))\n _aws_cdk_cloud_assembly_schema_FileSource(p.source);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_FileAssetPackaging(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_FileSource(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.packaging))\n _aws_cdk_cloud_assembly_schema_FileAssetPackaging(p.packaging);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_FileDestination(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AwsDestination(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadManifestOptions(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_Manifest(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_IntegManifest(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.testCases != null)\n for (const o of Object.values(p.testCases))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_TestCase(o);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_RequireApproval(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_DefaultCdkOptions(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_DeployOptions(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.requireApproval))\n _aws_cdk_cloud_assembly_schema_RequireApproval(p.requireApproval);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_DestroyOptions(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_TestOptions(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.cdkCommandOptions))\n _aws_cdk_cloud_assembly_schema_CdkCommands(p.cdkCommandOptions);\n if (!visitedObjects.has(p.hooks))\n _aws_cdk_cloud_assembly_schema_Hooks(p.hooks);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_TestCase(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.cdkCommandOptions))\n _aws_cdk_cloud_assembly_schema_CdkCommands(p.cdkCommandOptions);\n if (!visitedObjects.has(p.hooks))\n _aws_cdk_cloud_assembly_schema_Hooks(p.hooks);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_Hooks(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_CdkCommand(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_DeployCommand(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.args))\n _aws_cdk_cloud_assembly_schema_DeployOptions(p.args);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_DestroyCommand(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.args))\n _aws_cdk_cloud_assembly_schema_DestroyOptions(p.args);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_CdkCommands(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.deploy))\n _aws_cdk_cloud_assembly_schema_DeployCommand(p.deploy);\n if (!visitedObjects.has(p.destroy))\n _aws_cdk_cloud_assembly_schema_DestroyCommand(p.destroy);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction print(name, deprecationMessage) {\n const deprecated = process.env.JSII_DEPRECATED;\n const deprecationMode = [\"warn\", \"fail\", \"quiet\"].includes(deprecated) ? deprecated : \"warn\";\n const message = `${name} is deprecated.\\n ${deprecationMessage.trim()}\\n This API will be removed in the next major release.`;\n switch (deprecationMode) {\n case \"fail\":\n throw new DeprecationError(message);\n case \"warn\":\n console.warn(\"[WARNING]\", message);\n break;\n }\n}\nfunction getPropertyDescriptor(obj, prop) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor) {\n return descriptor;\n }\n const proto = Object.getPrototypeOf(obj);\n const prototypeDescriptor = proto && getPropertyDescriptor(proto, prop);\n if (prototypeDescriptor) {\n return prototypeDescriptor;\n }\n return {};\n}\nconst visitedObjects = new Set();\nclass DeprecationError extends Error {\n constructor(...args) {\n super(...args);\n Object.defineProperty(this, \"name\", {\n configurable: false,\n enumerable: true,\n value: \"DeprecationError\",\n writable: false,\n });\n }\n}\nmodule.exports = { print, getPropertyDescriptor, DeprecationError, _aws_cdk_cloud_assembly_schema_ArtifactType, _aws_cdk_cloud_assembly_schema_RuntimeInfo, _aws_cdk_cloud_assembly_schema_MissingContext, _aws_cdk_cloud_assembly_schema_ArtifactManifest, _aws_cdk_cloud_assembly_schema_AssemblyManifest, _aws_cdk_cloud_assembly_schema_FileAssetMetadataEntry, _aws_cdk_cloud_assembly_schema_Tag, _aws_cdk_cloud_assembly_schema_ContainerImageAssetCacheOption, _aws_cdk_cloud_assembly_schema_ContainerImageAssetMetadataEntry, _aws_cdk_cloud_assembly_schema_ArtifactMetadataEntryType, _aws_cdk_cloud_assembly_schema_MetadataEntry, _aws_cdk_cloud_assembly_schema_BootstrapRole, _aws_cdk_cloud_assembly_schema_AwsCloudFormationStackProperties, _aws_cdk_cloud_assembly_schema_AssetManifestOptions, _aws_cdk_cloud_assembly_schema_AssetManifestProperties, _aws_cdk_cloud_assembly_schema_TreeArtifactProperties, _aws_cdk_cloud_assembly_schema_NestedCloudAssemblyProperties, _aws_cdk_cloud_assembly_schema_ContextProvider, _aws_cdk_cloud_assembly_schema_AmiContextQuery, _aws_cdk_cloud_assembly_schema_AvailabilityZonesContextQuery, _aws_cdk_cloud_assembly_schema_HostedZoneContextQuery, _aws_cdk_cloud_assembly_schema_SSMParameterContextQuery, _aws_cdk_cloud_assembly_schema_VpcContextQuery, _aws_cdk_cloud_assembly_schema_EndpointServiceAvailabilityZonesContextQuery, _aws_cdk_cloud_assembly_schema_LoadBalancerType, _aws_cdk_cloud_assembly_schema_LoadBalancerFilter, _aws_cdk_cloud_assembly_schema_LoadBalancerContextQuery, _aws_cdk_cloud_assembly_schema_LoadBalancerListenerProtocol, _aws_cdk_cloud_assembly_schema_LoadBalancerListenerContextQuery, _aws_cdk_cloud_assembly_schema_SecurityGroupContextQuery, _aws_cdk_cloud_assembly_schema_KeyContextQuery, _aws_cdk_cloud_assembly_schema_PluginContextQuery, _aws_cdk_cloud_assembly_schema_AssetManifest, _aws_cdk_cloud_assembly_schema_DockerImageAsset, _aws_cdk_cloud_assembly_schema_DockerImageSource, _aws_cdk_cloud_assembly_schema_DockerImageDestination, _aws_cdk_cloud_assembly_schema_DockerCacheOption, _aws_cdk_cloud_assembly_schema_FileAsset, _aws_cdk_cloud_assembly_schema_FileAssetPackaging, _aws_cdk_cloud_assembly_schema_FileSource, _aws_cdk_cloud_assembly_schema_FileDestination, _aws_cdk_cloud_assembly_schema_AwsDestination, _aws_cdk_cloud_assembly_schema_LoadManifestOptions, _aws_cdk_cloud_assembly_schema_Manifest, _aws_cdk_cloud_assembly_schema_IntegManifest, _aws_cdk_cloud_assembly_schema_RequireApproval, _aws_cdk_cloud_assembly_schema_DefaultCdkOptions, _aws_cdk_cloud_assembly_schema_DeployOptions, _aws_cdk_cloud_assembly_schema_DestroyOptions, _aws_cdk_cloud_assembly_schema_TestOptions, _aws_cdk_cloud_assembly_schema_TestCase, _aws_cdk_cloud_assembly_schema_Hooks, _aws_cdk_cloud_assembly_schema_CdkCommand, _aws_cdk_cloud_assembly_schema_DeployCommand, _aws_cdk_cloud_assembly_schema_DestroyCommand, _aws_cdk_cloud_assembly_schema_CdkCommands };\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWRlc3RpbmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLWRlc3RpbmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlc3RpbmF0aW9uIGZvciBhc3NldHMgdGhhdCBuZWVkIHRvIGJlIHVwbG9hZGVkIHRvIEFXU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF3c0Rlc3RpbmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSByZWdpb24gd2hlcmUgdGhpcyBhc3NldCB3aWxsIG5lZWQgdG8gYmUgcHVibGlzaGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ3VycmVudCByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvbGUgdGhhdCBuZWVkcyB0byBiZSBhc3N1bWVkIHdoaWxlIHB1Ymxpc2hpbmcgdGhpcyBhc3NldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHJvbGUgd2lsbCBiZSBhc3N1bWVkXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRXh0ZXJuYWxJZCB0aGF0IG5lZWRzIHRvIGJlIHN1cHBsaWVkIHdoaWxlIGFzc3VtaW5nIHRoaXMgcm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIEV4dGVybmFsSWQgd2lsbCBiZSBzdXBwbGllZFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzdW1lUm9sZUV4dGVybmFsSWQ/OiBzdHJpbmc7XG59Il19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9ja2VyLWltYWdlLWFzc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG9ja2VyLWltYWdlLWFzc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBd3NEZXN0aW5hdGlvbiB9IGZyb20gJy4vYXdzLWRlc3RpbmF0aW9uJztcblxuLyoqXG4gKiBBIGZpbGUgYXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NrZXJJbWFnZUFzc2V0IHtcbiAgLyoqXG4gICAqIFNvdXJjZSBkZXNjcmlwdGlvbiBmb3IgZmlsZSBhc3NldHNcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZTogRG9ja2VySW1hZ2VTb3VyY2U7XG5cbiAgLyoqXG4gICAqIERlc3RpbmF0aW9ucyBmb3IgdGhpcyBmaWxlIGFzc2V0XG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbnM6IHsgW2lkOiBzdHJpbmddOiBEb2NrZXJJbWFnZURlc3RpbmF0aW9uIH07XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgaG93IHRvIHByb2R1Y2UgYSBEb2NrZXIgaW1hZ2UgZnJvbSBhIHNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY2tlckltYWdlU291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgRG9ja2VyIGltYWdlIGJ1aWxkIGluc3RydWN0aW9ucy5cbiAgICpcbiAgICogVGhpcyBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBhc3NldCBtYW5pZmVzdCBsb2NhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBFeGFjdGx5IG9uZSBvZiBgZGlyZWN0b3J5YCBhbmQgYGV4ZWN1dGFibGVgIGlzIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSBkaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY29tbWFuZC1saW5lIGV4ZWN1dGFibGUgdGhhdCByZXR1cm5zIHRoZSBuYW1lIG9mIGEgbG9jYWxcbiAgICogRG9ja2VyIGltYWdlIG9uIHN0ZG91dCBhZnRlciBiZWluZyBydW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRXhhY3RseSBvbmUgb2YgYGRpcmVjdG9yeWAgYW5kIGBleGVjdXRhYmxlYCBpcyByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0YWJsZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSB3aXRoIGJ1aWxkIGluc3RydWN0aW9uc1xuICAgKlxuICAgKiBPbmx5IGFsbG93ZWQgd2hlbiBgZGlyZWN0b3J5YCBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiRG9ja2VyZmlsZVwiXG4gICAqL1xuICByZWFkb25seSBkb2NrZXJGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXJnZXQgYnVpbGQgc3RhZ2UgaW4gYSBEb2NrZXJmaWxlIHdpdGggbXVsdGlwbGUgYnVpbGQgc3RhZ2VzXG4gICAqXG4gICAqIE9ubHkgYWxsb3dlZCB3aGVuIGBkaXJlY3RvcnlgIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgbGFzdCBzdGFnZSBpbiB0aGUgRG9ja2VyZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyQnVpbGRUYXJnZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgYnVpbGQgYXJndW1lbnRzXG4gICAqXG4gICAqIE9ubHkgYWxsb3dlZCB3aGVuIGBkaXJlY3RvcnlgIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBhZGRpdGlvbmFsIGJ1aWxkIGFyZ3VtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyQnVpbGRBcmdzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFNTSCBhZ2VudCBzb2NrZXQgb3Iga2V5c1xuICAgKlxuICAgKiBSZXF1aXJlcyBidWlsZGluZyB3aXRoIGRvY2tlciBidWlsZGtpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzc2ggZmxhZyBpcyBzZXRcbiAgICovXG4gIHJlYWRvbmx5IGRvY2tlckJ1aWxkU3NoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGJ1aWxkIHNlY3JldHNcbiAgICpcbiAgICogT25seSBhbGxvd2VkIHdoZW4gYGRpcmVjdG9yeWAgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGFkZGl0aW9uYWwgYnVpbGQgc2VjcmV0c1xuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyQnVpbGRTZWNyZXRzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIE5ldHdvcmtpbmcgbW9kZSBmb3IgdGhlIFJVTiBjb21tYW5kcyBkdXJpbmcgYnVpbGQuIF9SZXF1aXJlcyBEb2NrZXIgRW5naW5lIEFQSSB2MS4yNStfLlxuICAgKlxuICAgKiBTcGVjaWZ5IHRoaXMgcHJvcGVydHkgdG8gYnVpbGQgaW1hZ2VzIG9uIGEgc3BlY2lmaWMgbmV0d29ya2luZyBtb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG5ldHdvcmtpbmcgbW9kZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtNb2RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbGF0Zm9ybSB0byBidWlsZCBmb3IuIF9SZXF1aXJlcyBEb2NrZXIgQnVpbGR4Xy5cbiAgICpcbiAgICogU3BlY2lmeSB0aGlzIHByb3BlcnR5IHRvIGJ1aWxkIGltYWdlcyBvbiBhIHNwZWNpZmljIHBsYXRmb3JtL2FyY2hpdGVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBjdXJyZW50IG1hY2hpbmUgcGxhdGZvcm1cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdXRwdXRzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gb3V0cHV0cyBhcmUgcGFzc2VkIHRvIHRoZSBidWlsZCBjb21tYW5kIChkZWZhdWx0IG91dHB1dHMgYXJlIHVzZWQpXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9jb21tYW5kbGluZS9idWlsZC8jY3VzdG9tLWJ1aWxkLW91dHB1dHNcbiAgICovXG4gIHJlYWRvbmx5IGRvY2tlck91dHB1dHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ2FjaGUgZnJvbSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIGBkb2NrZXIgYnVpbGRgIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY2FjaGUgZnJvbSBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIGJ1aWxkIGNvbW1hbmRcbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9idWlsZC9jYWNoZS9iYWNrZW5kcy9cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRnJvbT86IERvY2tlckNhY2hlT3B0aW9uW107XG5cbiAgLyoqXG4gICAqIENhY2hlIHRvIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgYGRvY2tlciBidWlsZGAgY29tbWFuZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjYWNoZSB0byBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIGJ1aWxkIGNvbW1hbmRcbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9idWlsZC9jYWNoZS9iYWNrZW5kcy9cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlVG8/OiBEb2NrZXJDYWNoZU9wdGlvbjtcbn1cblxuLyoqXG4gKiBXaGVyZSB0byBwdWJsaXNoIGRvY2tlciBpbWFnZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NrZXJJbWFnZURlc3RpbmF0aW9uIGV4dGVuZHMgQXdzRGVzdGluYXRpb24ge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgRUNSIHJlcG9zaXRvcnkgdG8gcHVibGlzaCB0b1xuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGFnIG9mIHRoZSBpbWFnZSB0byBwdWJsaXNoXG4gICAqL1xuICByZWFkb25seSBpbWFnZVRhZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBEb2NrZXIgY2FjaGUgYmFja2VuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY2tlckNhY2hlT3B0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS5cbiAgICogUmVmZXIgdG8gaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vYnVpbGQvY2FjaGUvYmFja2VuZHMvIGZvciBmdWxsIGxpc3Qgb2YgYmFja2VuZHMuXG4gICAqIEBkZWZhdWx0IC0gdW5zcGVjaWZpZWRcbiAgICpcbiAgICogQGV4YW1wbGUgJ3JlZ2lzdHJ5J1xuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuICAvKipcbiAgICogQW55IHBhcmFtZXRlcnMgdG8gcGFzcyBpbnRvIHRoZSBkb2NrZXIgY2FjaGUgYmFja2VuZCBjb25maWd1cmF0aW9uLlxuICAgKiBSZWZlciB0byBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9idWlsZC9jYWNoZS9iYWNrZW5kcy8gZm9yIGNhY2hlIGJhY2tlbmQgY29uZmlndXJhdGlvbi5cbiAgICogQGRlZmF1bHQge30gTm8gb3B0aW9ucyBwcm92aWRlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBkZWNsYXJlIGNvbnN0IGJyYW5jaDogc3RyaW5nO1xuICAgKlxuICAgKiBjb25zdCBwYXJhbXMgPSB7XG4gICAqICAgcmVmOiBgMTIzNDU2NzguZGtyLmVjci51cy13ZXN0LTIuYW1hem9uYXdzLmNvbS9jYWNoZToke2JyYW5jaH1gLFxuICAgKiAgIG1vZGU6IFwibWF4XCIsXG4gICAqIH07XG4gICAqL1xuICByZWFkb25seSBwYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FileAssetPackaging = void 0;\n/**\n * Packaging strategy for file assets\n */\nvar FileAssetPackaging;\n(function (FileAssetPackaging) {\n /**\n * Upload the given path as a file\n */\n FileAssetPackaging[\"FILE\"] = \"file\";\n /**\n * The given path is a directory, zip it and upload\n */\n FileAssetPackaging[\"ZIP_DIRECTORY\"] = \"zip\";\n})(FileAssetPackaging || (exports.FileAssetPackaging = FileAssetPackaging = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1hc3NldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZpbGUtYXNzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaUJBOztHQUVHO0FBQ0gsSUFBWSxrQkFVWDtBQVZELFdBQVksa0JBQWtCO0lBQzVCOztPQUVHO0lBQ0gsbUNBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsMkNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVZXLGtCQUFrQixrQ0FBbEIsa0JBQWtCLFFBVTdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXdzRGVzdGluYXRpb24gfSBmcm9tICcuL2F3cy1kZXN0aW5hdGlvbic7XG5cbi8qKlxuICogQSBmaWxlIGFzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUFzc2V0IHtcbiAgLyoqXG4gICAqIFNvdXJjZSBkZXNjcmlwdGlvbiBmb3IgZmlsZSBhc3NldHNcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZTogRmlsZVNvdXJjZTtcblxuICAvKipcbiAgICogRGVzdGluYXRpb25zIGZvciB0aGlzIGZpbGUgYXNzZXRcbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uczogeyBbaWQ6IHN0cmluZ106IEZpbGVEZXN0aW5hdGlvbiB9O1xufVxuXG4vKipcbiAqIFBhY2thZ2luZyBzdHJhdGVneSBmb3IgZmlsZSBhc3NldHNcbiAqL1xuZXhwb3J0IGVudW0gRmlsZUFzc2V0UGFja2FnaW5nIHtcbiAgLyoqXG4gICAqIFVwbG9hZCB0aGUgZ2l2ZW4gcGF0aCBhcyBhIGZpbGVcbiAgICovXG4gIEZJTEUgPSAnZmlsZScsXG5cbiAgLyoqXG4gICAqIFRoZSBnaXZlbiBwYXRoIGlzIGEgZGlyZWN0b3J5LCB6aXAgaXQgYW5kIHVwbG9hZFxuICAgKi9cbiAgWklQX0RJUkVDVE9SWSA9ICd6aXAnLFxufVxuXG4vKipcbiAqIERlc2NyaWJlIHRoZSBzb3VyY2Ugb2YgYSBmaWxlIGFzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNvdXJjZSB7XG4gIC8qKlxuICAgKiBFeHRlcm5hbCBjb21tYW5kIHdoaWNoIHdpbGwgcHJvZHVjZSB0aGUgZmlsZSBhc3NldCB0byB1cGxvYWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRXhhY3RseSBvbmUgb2YgYGV4ZWN1dGFibGVgIGFuZCBgcGF0aGAgaXMgcmVxdWlyZWQuXG4gICAqL1xuICByZWFkb25seSBleGVjdXRhYmxlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlc3lzdGVtIG9iamVjdCB0byB1cGxvYWRcbiAgICpcbiAgICogVGhpcyBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBhc3NldCBtYW5pZmVzdCBsb2NhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBFeGFjdGx5IG9uZSBvZiBgZXhlY3V0YWJsZWAgYW5kIGBwYXRoYCBpcyByZXF1aXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhY2thZ2luZyBtZXRob2RcbiAgICpcbiAgICogT25seSBhbGxvd2VkIHdoZW4gYHBhdGhgIGlzIHNwZWNpZmllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgRklMRVxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnaW5nPzogRmlsZUFzc2V0UGFja2FnaW5nO1xufVxuXG4vKipcbiAqIFdoZXJlIGluIFMzIGEgZmlsZSBhc3NldCBuZWVkcyB0byBiZSBwdWJsaXNoZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlRGVzdGluYXRpb24gZXh0ZW5kcyBBd3NEZXN0aW5hdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYnVja2V0XG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXN0aW5hdGlvbiBvYmplY3Qga2V5XG4gICAqL1xuICByZWFkb25seSBvYmplY3RLZXk6IHN0cmluZztcbn1cbiJdfQ==","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./schema\"), exports);\n__exportStar(require(\"./docker-image-asset\"), exports);\n__exportStar(require(\"./file-asset\"), exports);\n__exportStar(require(\"./aws-destination\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLHVEQUFxQztBQUNyQywrQ0FBNkI7QUFDN0Isb0RBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zY2hlbWEnO1xuZXhwb3J0ICogZnJvbSAnLi9kb2NrZXItaW1hZ2UtYXNzZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9maWxlLWFzc2V0JztcbmV4cG9ydCAqIGZyb20gJy4vYXdzLWRlc3RpbmF0aW9uJztcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2NrZXJJbWFnZUFzc2V0IH0gZnJvbSAnLi9kb2NrZXItaW1hZ2UtYXNzZXQnO1xuaW1wb3J0IHsgRmlsZUFzc2V0IH0gZnJvbSAnLi9maWxlLWFzc2V0JztcblxuLyoqXG4gKiBEZWZpbml0aW9ucyBmb3IgdGhlIGFzc2V0IG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBtYW5pZmVzdFxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSBhc3NldHMgaW4gdGhpcyBtYW5pZmVzdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGZpbGVzXG4gICAqL1xuICByZWFkb25seSBmaWxlcz86IHsgW2lkOiBzdHJpbmddOiBGaWxlQXNzZXQgfTtcblxuICAvKipcbiAgICogVGhlIERvY2tlciBpbWFnZSBhc3NldHMgaW4gdGhpcyBtYW5pZmVzdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIERvY2tlciBpbWFnZXNcbiAgICovXG4gIHJlYWRvbmx5IGRvY2tlckltYWdlcz86IHsgW2lkOiBzdHJpbmddOiBEb2NrZXJJbWFnZUFzc2V0IH07XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3Qtc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXJ0aWZhY3Qtc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogSW5mb3JtYXRpb24gbmVlZGVkIHRvIGFjY2VzcyBhbiBJQU0gcm9sZSBjcmVhdGVkXG4gKiBhcyBwYXJ0IG9mIHRoZSBib290c3RyYXAgcHJvY2Vzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJvb3RzdHJhcFJvbGUge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgSUFNIHJvbGUgY3JlYXRlZCBhcyBwYXJ0IG9mIGJvb3RyYXBwaW5nXG4gICAqIGUuZy4gbG9va3VwUm9sZUFyblxuICAgKi9cbiAgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4dGVybmFsIElEIHRvIHVzZSB3aGVuIGFzc3VtaW5nIHRoZSBib290c3RyYXAgcm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGV4dGVybmFsIElEXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVSb2xlRXh0ZXJuYWxJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVmVyc2lvbiBvZiBib290c3RyYXAgc3RhY2sgcmVxdWlyZWQgdG8gdXNlIHRoaXMgcm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGJvb3RzdHJhcCBzdGFjayByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgU1NNIHBhcmFtZXRlciB3aXRoIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRGlzY292ZXIgU1NNIHBhcmFtZXRlciBieSByZWFkaW5nIHN0YWNrXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXJ0aWZhY3QgcHJvcGVydGllcyBmb3IgQ2xvdWRGb3JtYXRpb24gc3RhY2tzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF3c0Nsb3VkRm9ybWF0aW9uU3RhY2tQcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIEEgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXNzZW1ibHkgcm9vdCB3aGljaCBjb250YWlucyB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgZm9yIHRoaXMgc3RhY2suXG4gICAqL1xuICByZWFkb25seSB0ZW1wbGF0ZUZpbGU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsdWVzIGZvciBDbG91ZEZvcm1hdGlvbiBzdGFjayBwYXJhbWV0ZXJzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB3aGVuIHRoZSBzdGFjayBpcyBkZXBsb3llZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwYXJhbWV0ZXJzXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzPzogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBWYWx1ZXMgZm9yIENsb3VkRm9ybWF0aW9uIHN0YWNrIHRhZ3MgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHdoZW4gdGhlIHN0YWNrIGlzIGRlcGxveWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIENsb3VkRm9ybWF0aW9uIHN0YWNrLlxuICAgKiBAZGVmYXVsdCAtIG5hbWUgZGVyaXZlZCBmcm9tIGFydGlmYWN0IElEXG4gICAqL1xuICByZWFkb25seSBzdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRlcm1pbmF0aW9uIHByb3RlY3Rpb24gZm9yIHRoaXMgc3RhY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB0ZXJtaW5hdGlvblByb3RlY3Rpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSB0aGF0IG5lZWRzIHRvIGJlIGFzc3VtZWQgdG8gZGVwbG95IHRoZSBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHJvbGUgaXMgYXNzdW1lZCAoY3VycmVudCBjcmVkZW50aWFscyBhcmUgdXNlZClcbiAgICovXG4gIHJlYWRvbmx5IGFzc3VtZVJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4dGVybmFsIElEIHRvIHVzZSB3aGVuIGFzc3VtaW5nIHJvbGUgZm9yIGNsb3VkZm9ybWF0aW9uIGRlcGxveW1lbnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZXh0ZXJuYWwgSURcbiAgICovXG4gIHJlYWRvbmx5IGFzc3VtZVJvbGVFeHRlcm5hbElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSB0aGF0IGlzIHBhc3NlZCB0byBDbG91ZEZvcm1hdGlvbiB0byBleGVjdXRlIHRoZSBjaGFuZ2Ugc2V0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcm9sZSBpcyBwYXNzZWQgKGN1cnJlbnRseSBhc3N1bWVkIHJvbGUvY3JlZGVudGlhbHMgYXJlIHVzZWQpXG4gICAqL1xuICByZWFkb25seSBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIHRvIHVzZSB0byBsb29rIHVwIHZhbHVlcyBmcm9tIHRoZSB0YXJnZXQgQVdTIGFjY291bnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyByb2xlIGlzIGFzc3VtZWQgKGN1cnJlbnQgY3JlZGVudGlhbHMgYXJlIHVzZWQpXG4gICAqL1xuICByZWFkb25seSBsb29rdXBSb2xlPzogQm9vdHN0cmFwUm9sZTtcblxuICAvKipcbiAgICogSWYgdGhlIHN0YWNrIHRlbXBsYXRlIGhhcyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgaW4gdGhlIGFzc2V0IG1hbmlmZXN0LCBpdHMgYXNzZXQgVVJMXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm90IHVwbG9hZGVkIHlldCwgdXBsb2FkIGp1c3QgYmVmb3JlIGRlcGxveWluZ1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tUZW1wbGF0ZUFzc2V0T2JqZWN0VXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIGJvb3RzdHJhcCBzdGFjayByZXF1aXJlZCB0byBkZXBsb3kgdGhpcyBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGJvb3RzdHJhcCBzdGFjayByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNTTSBwYXJhbWV0ZXIgd2hlcmUgdGhlIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uIG51bWJlciBjYW4gYmUgZm91bmRcbiAgICpcbiAgICogT25seSB1c2VkIGlmIGByZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbmAgaXMgc2V0LlxuICAgKlxuICAgKiAtIElmIHRoaXMgdmFsdWUgaXMgbm90IHNldCwgdGhlIGJvb3RzdHJhcCBzdGFjayBuYW1lIG11c3QgYmUga25vd24gYXRcbiAgICogICBkZXBsb3ltZW50IHRpbWUgc28gdGhlIHN0YWNrIHZlcnNpb24gY2FuIGJlIGxvb2tlZCB1cCBmcm9tIHRoZSBzdGFja1xuICAgKiAgIG91dHB1dHMuXG4gICAqIC0gSWYgdGhpcyB2YWx1ZSBpcyBzZXQsIHRoZSBib290c3RyYXAgc3RhY2sgY2FuIGhhdmUgYW55IG5hbWUgYmVjYXVzZVxuICAgKiAgIHdlIHdvbid0IG5lZWQgdG8gbG9vayBpdCB1cC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBCb290c3RyYXAgc3RhY2sgdmVyc2lvbiBudW1iZXIgbG9va2VkIHVwXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBzdGFjayBzaG91bGQgYmUgdmFsaWRhdGVkIGJ5IHRoZSBDTEkgYWZ0ZXIgc3ludGhlc2lzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkYXRlT25TeW50aD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXNzZXQgTWFuaWZlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldE1hbmlmZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIGJvb3RzdHJhcCBzdGFjayByZXF1aXJlZCB0byBkZXBsb3kgdGhpcyBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIFZlcnNpb24gMSAoYmFzaWMgbW9kZXJuIGJvb3RzdHJhcCBzdGFjaylcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTU00gcGFyYW1ldGVyIHdoZXJlIHRoZSBib290c3RyYXAgc3RhY2sgdmVyc2lvbiBudW1iZXIgY2FuIGJlIGZvdW5kXG4gICAqXG4gICAqIC0gSWYgdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCB0aGUgYm9vdHN0cmFwIHN0YWNrIG5hbWUgbXVzdCBiZSBrbm93biBhdFxuICAgKiAgIGRlcGxveW1lbnQgdGltZSBzbyB0aGUgc3RhY2sgdmVyc2lvbiBjYW4gYmUgbG9va2VkIHVwIGZyb20gdGhlIHN0YWNrXG4gICAqICAgb3V0cHV0cy5cbiAgICogLSBJZiB0aGlzIHZhbHVlIGlzIHNldCwgdGhlIGJvb3RzdHJhcCBzdGFjayBjYW4gaGF2ZSBhbnkgbmFtZSBiZWNhdXNlXG4gICAqICAgd2Ugd29uJ3QgbmVlZCB0byBsb29rIGl0IHVwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uIG51bWJlciBsb29rZWQgdXBcbiAgICovXG4gIHJlYWRvbmx5IGJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcnRpZmFjdCBwcm9wZXJ0aWVzIGZvciB0aGUgQXNzZXQgTWFuaWZlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldE1hbmlmZXN0UHJvcGVydGllcyBleHRlbmRzIEFzc2V0TWFuaWZlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIEZpbGVuYW1lIG9mIHRoZSBhc3NldCBtYW5pZmVzdFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFydGlmYWN0IHByb3BlcnRpZXMgZm9yIHRoZSBDb25zdHJ1Y3QgVHJlZSBBcnRpZmFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVBcnRpZmFjdFByb3BlcnRpZXMge1xuICAvKipcbiAgICogRmlsZW5hbWUgb2YgdGhlIHRyZWUgYXJ0aWZhY3RcbiAgICovXG4gIHJlYWRvbmx5IGZpbGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcnRpZmFjdCBwcm9wZXJ0aWVzIGZvciBuZXN0ZWQgY2xvdWQgYXNzZW1ibGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5lc3RlZENsb3VkQXNzZW1ibHlQcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIFJlbGF0aXZlIHBhdGggdG8gdGhlIG5lc3RlZCBjbG91ZCBhc3NlbWJseVxuICAgKi9cbiAgcmVhZG9ubHkgZGlyZWN0b3J5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IG5hbWUgZm9yIHRoZSBjbG91ZCBhc3NlbWJseVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBhcnRpZmFjdCBJRFxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgbWFuaWZlc3QgYXJ0aWZhY3RzXG4gKi9cbmV4cG9ydCB0eXBlIEFydGlmYWN0UHJvcGVydGllcyA9IEF3c0Nsb3VkRm9ybWF0aW9uU3RhY2tQcm9wZXJ0aWVzXG58IEFzc2V0TWFuaWZlc3RQcm9wZXJ0aWVzXG58IFRyZWVBcnRpZmFjdFByb3BlcnRpZXNcbnwgTmVzdGVkQ2xvdWRBc3NlbWJseVByb3BlcnRpZXM7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LoadBalancerListenerProtocol = exports.LoadBalancerType = exports.ContextProvider = void 0;\n/**\n * Identifier for the context provider\n */\nvar ContextProvider;\n(function (ContextProvider) {\n /**\n * AMI provider\n */\n ContextProvider[\"AMI_PROVIDER\"] = \"ami\";\n /**\n * AZ provider\n */\n ContextProvider[\"AVAILABILITY_ZONE_PROVIDER\"] = \"availability-zones\";\n /**\n * Route53 Hosted Zone provider\n */\n ContextProvider[\"HOSTED_ZONE_PROVIDER\"] = \"hosted-zone\";\n /**\n * SSM Parameter Provider\n */\n ContextProvider[\"SSM_PARAMETER_PROVIDER\"] = \"ssm\";\n /**\n * VPC Provider\n */\n ContextProvider[\"VPC_PROVIDER\"] = \"vpc-provider\";\n /**\n * VPC Endpoint Service AZ Provider\n */\n ContextProvider[\"ENDPOINT_SERVICE_AVAILABILITY_ZONE_PROVIDER\"] = \"endpoint-service-availability-zones\";\n /**\n * Load balancer provider\n */\n ContextProvider[\"LOAD_BALANCER_PROVIDER\"] = \"load-balancer\";\n /**\n * Load balancer listener provider\n */\n ContextProvider[\"LOAD_BALANCER_LISTENER_PROVIDER\"] = \"load-balancer-listener\";\n /**\n * Security group provider\n */\n ContextProvider[\"SECURITY_GROUP_PROVIDER\"] = \"security-group\";\n /**\n * KMS Key Provider\n */\n ContextProvider[\"KEY_PROVIDER\"] = \"key-provider\";\n /**\n * A plugin provider (the actual plugin name will be in the properties)\n */\n ContextProvider[\"PLUGIN\"] = \"plugin\";\n})(ContextProvider || (exports.ContextProvider = ContextProvider = {}));\n/**\n * Type of load balancer\n */\nvar LoadBalancerType;\n(function (LoadBalancerType) {\n /**\n * Network load balancer\n */\n LoadBalancerType[\"NETWORK\"] = \"network\";\n /**\n * Application load balancer\n */\n LoadBalancerType[\"APPLICATION\"] = \"application\";\n})(LoadBalancerType || (exports.LoadBalancerType = LoadBalancerType = {}));\n/**\n * The protocol for connections from clients to the load balancer\n */\nvar LoadBalancerListenerProtocol;\n(function (LoadBalancerListenerProtocol) {\n /**\n * HTTP protocol\n */\n LoadBalancerListenerProtocol[\"HTTP\"] = \"HTTP\";\n /**\n * HTTPS protocol\n */\n LoadBalancerListenerProtocol[\"HTTPS\"] = \"HTTPS\";\n /**\n * TCP protocol\n */\n LoadBalancerListenerProtocol[\"TCP\"] = \"TCP\";\n /**\n * TLS protocol\n */\n LoadBalancerListenerProtocol[\"TLS\"] = \"TLS\";\n /**\n * UDP protocol\n * */\n LoadBalancerListenerProtocol[\"UDP\"] = \"UDP\";\n /**\n * TCP and UDP protocol\n * */\n LoadBalancerListenerProtocol[\"TCP_UDP\"] = \"TCP_UDP\";\n})(LoadBalancerListenerProtocol || (exports.LoadBalancerListenerProtocol = LoadBalancerListenerProtocol = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1xdWVyaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29udGV4dC1xdWVyaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOztHQUVHO0FBQ0gsSUFBWSxlQXVEWDtBQXZERCxXQUFZLGVBQWU7SUFDekI7O09BRUc7SUFDSCx1Q0FBb0IsQ0FBQTtJQUVwQjs7T0FFRztJQUNILG9FQUFpRCxDQUFBO0lBRWpEOztPQUVHO0lBQ0gsdURBQW9DLENBQUE7SUFFcEM7O09BRUc7SUFDSCxpREFBOEIsQ0FBQTtJQUU5Qjs7T0FFRztJQUNILGdEQUE2QixDQUFBO0lBRTdCOztPQUVHO0lBQ0gsc0dBQW1GLENBQUE7SUFFbkY7O09BRUc7SUFDSCwyREFBd0MsQ0FBQTtJQUV4Qzs7T0FFRztJQUNILDZFQUEwRCxDQUFBO0lBRTFEOztPQUVHO0lBQ0gsNkRBQTBDLENBQUE7SUFFMUM7O09BRUc7SUFDSCxnREFBNkIsQ0FBQTtJQUU3Qjs7T0FFRztJQUNILG9DQUFpQixDQUFBO0FBQ25CLENBQUMsRUF2RFcsZUFBZSwrQkFBZixlQUFlLFFBdUQxQjtBQXdORDs7R0FFRztBQUNILElBQVksZ0JBVVg7QUFWRCxXQUFZLGdCQUFnQjtJQUMxQjs7T0FFRztJQUNILHVDQUFtQixDQUFBO0lBRW5COztPQUVHO0lBQ0gsK0NBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQVZXLGdCQUFnQixnQ0FBaEIsZ0JBQWdCLFFBVTNCO0FBOENEOztHQUVHO0FBQ0gsSUFBWSw0QkE4Qlg7QUE5QkQsV0FBWSw0QkFBNEI7SUFDdEM7O09BRUc7SUFDSCw2Q0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCwrQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCwyQ0FBVyxDQUFBO0lBRVg7O09BRUc7SUFDSCwyQ0FBVyxDQUFBO0lBRVg7O1NBRUs7SUFDTCwyQ0FBVyxDQUFBO0lBRVg7O1NBRUs7SUFDTCxtREFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBOUJXLDRCQUE0Qiw0Q0FBNUIsNEJBQTRCLFFBOEJ2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhZyB9IGZyb20gJy4vbWV0YWRhdGEtc2NoZW1hJztcblxuLyoqXG4gKiBJZGVudGlmaWVyIGZvciB0aGUgY29udGV4dCBwcm92aWRlclxuICovXG5leHBvcnQgZW51bSBDb250ZXh0UHJvdmlkZXIge1xuICAvKipcbiAgICogQU1JIHByb3ZpZGVyXG4gICAqL1xuICBBTUlfUFJPVklERVIgPSAnYW1pJyxcblxuICAvKipcbiAgICogQVogcHJvdmlkZXJcbiAgICovXG4gIEFWQUlMQUJJTElUWV9aT05FX1BST1ZJREVSID0gJ2F2YWlsYWJpbGl0eS16b25lcycsXG5cbiAgLyoqXG4gICAqIFJvdXRlNTMgSG9zdGVkIFpvbmUgcHJvdmlkZXJcbiAgICovXG4gIEhPU1RFRF9aT05FX1BST1ZJREVSID0gJ2hvc3RlZC16b25lJyxcblxuICAvKipcbiAgICogU1NNIFBhcmFtZXRlciBQcm92aWRlclxuICAgKi9cbiAgU1NNX1BBUkFNRVRFUl9QUk9WSURFUiA9ICdzc20nLFxuXG4gIC8qKlxuICAgKiBWUEMgUHJvdmlkZXJcbiAgICovXG4gIFZQQ19QUk9WSURFUiA9ICd2cGMtcHJvdmlkZXInLFxuXG4gIC8qKlxuICAgKiBWUEMgRW5kcG9pbnQgU2VydmljZSBBWiBQcm92aWRlclxuICAgKi9cbiAgRU5EUE9JTlRfU0VSVklDRV9BVkFJTEFCSUxJVFlfWk9ORV9QUk9WSURFUiA9ICdlbmRwb2ludC1zZXJ2aWNlLWF2YWlsYWJpbGl0eS16b25lcycsXG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgcHJvdmlkZXJcbiAgICovXG4gIExPQURfQkFMQU5DRVJfUFJPVklERVIgPSAnbG9hZC1iYWxhbmNlcicsXG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgbGlzdGVuZXIgcHJvdmlkZXJcbiAgICovXG4gIExPQURfQkFMQU5DRVJfTElTVEVORVJfUFJPVklERVIgPSAnbG9hZC1iYWxhbmNlci1saXN0ZW5lcicsXG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IGdyb3VwIHByb3ZpZGVyXG4gICAqL1xuICBTRUNVUklUWV9HUk9VUF9QUk9WSURFUiA9ICdzZWN1cml0eS1ncm91cCcsXG5cbiAgLyoqXG4gICAqIEtNUyBLZXkgUHJvdmlkZXJcbiAgICovXG4gIEtFWV9QUk9WSURFUiA9ICdrZXktcHJvdmlkZXInLFxuXG4gIC8qKlxuICAgKiBBIHBsdWdpbiBwcm92aWRlciAodGhlIGFjdHVhbCBwbHVnaW4gbmFtZSB3aWxsIGJlIGluIHRoZSBwcm9wZXJ0aWVzKVxuICAgKi9cbiAgUExVR0lOID0gJ3BsdWdpbicsXG59XG5cbi8qKlxuICogUXVlcnkgdG8gQU1JIGNvbnRleHQgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbWlDb250ZXh0UXVlcnkge1xuICAvKipcbiAgICogQWNjb3VudCB0byBxdWVyeVxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWdpb24gdG8gcXVlcnlcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSByb2xlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gbG9vayB1cCB0aGUgbWlzc2luZyB2YWx1ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBsb29rdXBSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPd25lcnMgdG8gRGVzY3JpYmVJbWFnZXMgY2FsbFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFsbCBvd25lcnNcbiAgICovXG4gIHJlYWRvbmx5IG93bmVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHRvIERlc2NyaWJlSW1hZ2VzIGNhbGxcbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcnM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmdbXX07XG59XG5cbi8qKlxuICogUXVlcnkgdG8gYXZhaWxhYmlsaXR5IHpvbmUgY29udGV4dCBwcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF2YWlsYWJpbGl0eVpvbmVzQ29udGV4dFF1ZXJ5IHtcbiAgLyoqXG4gICAqIFF1ZXJ5IGFjY291bnRcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogUXVlcnkgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcm9sZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIG1pc3NpbmcgdmFsdWVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZUFybj86IHN0cmluZztcblxufVxuXG4vKipcbiAqIFF1ZXJ5IHRvIGhvc3RlZCB6b25lIGNvbnRleHQgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0ZWRab25lQ29udGV4dFF1ZXJ5IHtcbiAgLyoqXG4gICAqIFF1ZXJ5IGFjY291bnRcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogUXVlcnkgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcm9sZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIG1pc3NpbmcgdmFsdWVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvbWFpbiBuYW1lIGUuZy4gZXhhbXBsZS5jb20gdG8gbG9va3VwXG4gICAqL1xuICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRydWUgaWYgdGhlIHpvbmUgeW91IHdhbnQgdG8gZmluZCBpcyBhIHByaXZhdGUgaG9zdGVkIHpvbmVcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGVab25lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIFZQQyBJRCB0byB0aGF0IHRoZSBwcml2YXRlIHpvbmUgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICpcbiAgICogSWYgeW91IHByb3ZpZGUgVlBDIElEIGFuZCBwcml2YXRlWm9uZSBpcyBmYWxzZSwgdGhpcyB3aWxsIHJldHVybiBubyByZXN1bHRzXG4gICAqIGFuZCByYWlzZSBhbiBlcnJvci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBSZXF1aXJlZCBpZiBwcml2YXRlWm9uZT10cnVlXG4gICAqL1xuICByZWFkb25seSB2cGNJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBRdWVyeSB0byBTU00gUGFyYW1ldGVyIENvbnRleHQgUHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTU01QYXJhbWV0ZXJDb250ZXh0UXVlcnkge1xuICAvKipcbiAgICogUXVlcnkgYWNjb3VudFxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBRdWVyeSByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSByb2xlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gbG9vayB1cCB0aGUgbWlzc2luZyB2YWx1ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBsb29rdXBSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXJhbWV0ZXIgbmFtZSB0byBxdWVyeVxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFF1ZXJ5IGlucHV0IGZvciBsb29raW5nIHVwIGEgVlBDXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjQ29udGV4dFF1ZXJ5IHtcbiAgLyoqXG4gICAqIFF1ZXJ5IGFjY291bnRcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogUXVlcnkgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcm9sZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIG1pc3NpbmcgdmFsdWVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsdGVycyB0byBhcHBseSB0byB0aGUgVlBDXG4gICAqXG4gICAqIEZpbHRlciBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyBwYXNzZWQgdG8gRGVzY3JpYmVWcGNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVWcGNzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcjoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcG9wdWxhdGUgdGhlIHN1Ym5ldEdyb3VwcyBmaWVsZCBvZiB0aGUgYFZwY0NvbnRleHRSZXNwb25zZWAsXG4gICAqIHdoaWNoIGNvbnRhaW5zIHBvdGVudGlhbGx5IGFzeW1tZXRyaWMgc3VibmV0IGdyb3Vwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJldHVybkFzeW1tZXRyaWNTdWJuZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgdGFnIGZvciBzdWJuZXQgZ3JvdXAgbmFtZS5cbiAgICogSWYgbm90IHByb3ZpZGVkLCB3ZSdsbCBsb29rIGF0IHRoZSBhd3MtY2RrOnN1Ym5ldC1uYW1lIHRhZy5cbiAgICogSWYgdGhlIHN1Ym5ldCBkb2VzIG5vdCBoYXZlIHRoZSBzcGVjaWZpZWQgdGFnLFxuICAgKiB3ZSdsbCB1c2UgaXRzIHR5cGUgYXMgdGhlIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdhd3MtY2RrOnN1Ym5ldC1uYW1lJ1xuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0R3JvdXBOYW1lVGFnPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHBvcHVsYXRlIHRoZSBgdnBuR2F0ZXdheUlkYCBmaWVsZCBvZiB0aGUgYFZwY0NvbnRleHRSZXNwb25zZWAsXG4gICAqIHdoaWNoIGNvbnRhaW5zIHRoZSBWUE4gR2F0ZXdheSBJRCwgaWYgb25lIGV4aXN0cy4gWW91IGNhbiBleHBsaWNpdGx5XG4gICAqIGRpc2FibGUgdGhpcyBpbiBvcmRlciB0byBhdm9pZCB0aGUgbG9va3VwIGlmIHlvdSBrbm93IHRoZSBWUEMgZG9lcyBub3QgaGF2ZVxuICAgKiBhIFZQTiBHYXR3YXkgYXR0YWNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJldHVyblZwbkdhdGV3YXlzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBRdWVyeSB0byBlbmRwb2ludCBzZXJ2aWNlIGNvbnRleHQgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmRwb2ludFNlcnZpY2VBdmFpbGFiaWxpdHlab25lc0NvbnRleHRRdWVyeSB7XG4gIC8qKlxuICAgKiBRdWVyeSBhY2NvdW50XG4gICAqL1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHJvbGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBsb29rIHVwIHRoZSBtaXNzaW5nIHZhbHVlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cFJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHNlcnZpY2UgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlIG9mIGxvYWQgYmFsYW5jZXJcbiAqL1xuZXhwb3J0IGVudW0gTG9hZEJhbGFuY2VyVHlwZSB7XG4gIC8qKlxuICAgKiBOZXR3b3JrIGxvYWQgYmFsYW5jZXJcbiAgICovXG4gIE5FVFdPUksgPSAnbmV0d29yaycsXG5cbiAgLyoqXG4gICAqIEFwcGxpY2F0aW9uIGxvYWQgYmFsYW5jZXJcbiAgICovXG4gIEFQUExJQ0FUSU9OID0gJ2FwcGxpY2F0aW9uJyxcbn1cblxuLyoqXG4gKiBGaWx0ZXJzIGZvciBzZWxlY3RpbmcgbG9hZCBiYWxhbmNlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkQmFsYW5jZXJGaWx0ZXIge1xuICAvKipcbiAgICogRmlsdGVyIGxvYWQgYmFsYW5jZXJzIGJ5IHRoZWlyIHR5cGVcbiAgICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlclR5cGU6IExvYWRCYWxhbmNlclR5cGU7XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbG9hZCBiYWxhbmNlcidzIEFSTlxuICAgKiBAZGVmYXVsdCAtIGRvZXMgbm90IHNlYXJjaCBieSBsb2FkIGJhbGFuY2VyIGFyblxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXRjaCBsb2FkIGJhbGFuY2VyIHRhZ3NcbiAgICogQGRlZmF1bHQgLSBkb2VzIG5vdCBtYXRjaCBsb2FkIGJhbGFuY2VycyBieSB0YWdzXG4gICAqL1xuICByZWFkb25seSBsb2FkQmFsYW5jZXJUYWdzPzogVGFnW107XG59XG5cbi8qKlxuICogUXVlcnkgaW5wdXQgZm9yIGxvb2tpbmcgdXAgYSBsb2FkIGJhbGFuY2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZEJhbGFuY2VyQ29udGV4dFF1ZXJ5IGV4dGVuZHMgTG9hZEJhbGFuY2VyRmlsdGVyIHtcbiAgLyoqXG4gICAqIFF1ZXJ5IGFjY291bnRcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogUXVlcnkgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcm9sZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIG1pc3NpbmcgdmFsdWVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZUFybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcHJvdG9jb2wgZm9yIGNvbm5lY3Rpb25zIGZyb20gY2xpZW50cyB0byB0aGUgbG9hZCBiYWxhbmNlclxuICovXG5leHBvcnQgZW51bSBMb2FkQmFsYW5jZXJMaXN0ZW5lclByb3RvY29sIHtcbiAgLyoqXG4gICAqIEhUVFAgcHJvdG9jb2xcbiAgICovXG4gIEhUVFAgPSAnSFRUUCcsXG5cbiAgLyoqXG4gICAqIEhUVFBTIHByb3RvY29sXG4gICAqL1xuICBIVFRQUyA9ICdIVFRQUycsXG5cbiAgLyoqXG4gICAqIFRDUCBwcm90b2NvbFxuICAgKi9cbiAgVENQID0gJ1RDUCcsXG5cbiAgLyoqXG4gICAqIFRMUyBwcm90b2NvbFxuICAgKi9cbiAgVExTID0gJ1RMUycsXG5cbiAgLyoqXG4gICAqIFVEUCBwcm90b2NvbFxuICAgKiAqL1xuICBVRFAgPSAnVURQJyxcblxuICAvKipcbiAgICogVENQIGFuZCBVRFAgcHJvdG9jb2xcbiAgICogKi9cbiAgVENQX1VEUCA9ICdUQ1BfVURQJyxcbn1cblxuLyoqXG4gKiBRdWVyeSBpbnB1dCBmb3IgbG9va2luZyB1cCBhIGxvYWQgYmFsYW5jZXIgbGlzdGVuZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkQmFsYW5jZXJMaXN0ZW5lckNvbnRleHRRdWVyeSBleHRlbmRzIExvYWRCYWxhbmNlckZpbHRlciB7XG4gIC8qKlxuICAgKiBRdWVyeSBhY2NvdW50XG4gICAqL1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHJvbGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBsb29rIHVwIHRoZSBtaXNzaW5nIHZhbHVlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cFJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbGlzdGVuZXIncyBhcm5cbiAgICogQGRlZmF1bHQgLSBkb2VzIG5vdCBmaW5kIGJ5IGxpc3RlbmVyIGFyblxuICAgKi9cbiAgcmVhZG9ubHkgbGlzdGVuZXJBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBsaXN0ZW5lciBwcm90b2NvbFxuICAgKiBAZGVmYXVsdCAtIGRvZXMgbm90IGZpbHRlciBieSBsaXN0ZW5lciBwcm90b2NvbFxuICAgKi9cbiAgcmVhZG9ubHkgbGlzdGVuZXJQcm90b2NvbD86IExvYWRCYWxhbmNlckxpc3RlbmVyUHJvdG9jb2w7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBsaXN0ZW5lcnMgYnkgbGlzdGVuZXIgcG9ydFxuICAgKiBAZGVmYXVsdCAtIGRvZXMgbm90IGZpbHRlciBieSBhIGxpc3RlbmVyIHBvcnRcbiAgICovXG4gIHJlYWRvbmx5IGxpc3RlbmVyUG9ydD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBRdWVyeSBpbnB1dCBmb3IgbG9va2luZyB1cCBhIHNlY3VyaXR5IGdyb3VwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlHcm91cENvbnRleHRRdWVyeSB7XG4gIC8qKlxuICAgKiBRdWVyeSBhY2NvdW50XG4gICAqL1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHJvbGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBsb29rIHVwIHRoZSBtaXNzaW5nIHZhbHVlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cFJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IGdyb3VwIGlkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZQQyBJRFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHZwY0lkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFF1ZXJ5IGlucHV0IGZvciBsb29raW5nIHVwIGEgS01TIEtleVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtleUNvbnRleHRRdWVyeSB7XG4gIC8qKlxuICAgKiBRdWVyeSBhY2NvdW50XG4gICAqL1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHJvbGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBsb29rIHVwIHRoZSBtaXNzaW5nIHZhbHVlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cFJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsaWFzIG5hbWUgdXNlZCB0byBzZWFyY2ggdGhlIEtleVxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUXVlcnkgaW5wdXQgZm9yIHBsdWdpbnNcbiAqXG4gKiBUaGlzIGFsdGVybmF0ZSBicmFuY2ggaXMgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgYWJsZSB0byBlc2NhcGUgYWxsIHR5cGUgY2hlY2tpbmdcbiAqIHdlIGRvIG9uIG9uIHRoZSBjbG91ZCBhc3NlbWJseSAtLSB3ZSBjYW5ub3Qga25vdyB0aGUgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgdXNlZCBhIHByaW9yaS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Db250ZXh0UXVlcnkge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHBsdWdpblxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcmJpdHJhcnkgb3RoZXIgYXJndW1lbnRzIGZvciB0aGUgcGx1Z2luLlxuICAgKlxuICAgKiBUaGlzIGluZGV4IHNpZ25hdHVyZSBpcyBub3QgdXNhYmxlIGluIG5vbi1UeXBlU2NyaXB0L0phdmFTY3JpcHQgbGFuZ3VhZ2VzLlxuICAgKlxuICAgKiBAanNpaSBpZ25vcmVcbiAgICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgQ29udGV4dFF1ZXJ5UHJvcGVydGllcyA9IEFtaUNvbnRleHRRdWVyeVxufCBBdmFpbGFiaWxpdHlab25lc0NvbnRleHRRdWVyeVxufCBIb3N0ZWRab25lQ29udGV4dFF1ZXJ5XG58IFNTTVBhcmFtZXRlckNvbnRleHRRdWVyeVxufCBWcGNDb250ZXh0UXVlcnlcbnwgRW5kcG9pbnRTZXJ2aWNlQXZhaWxhYmlsaXR5Wm9uZXNDb250ZXh0UXVlcnlcbnwgTG9hZEJhbGFuY2VyQ29udGV4dFF1ZXJ5XG58IExvYWRCYWxhbmNlckxpc3RlbmVyQ29udGV4dFF1ZXJ5XG58IFNlY3VyaXR5R3JvdXBDb250ZXh0UXVlcnlcbnwgS2V5Q29udGV4dFF1ZXJ5XG58IFBsdWdpbkNvbnRleHRRdWVyeTtcblxuIl19","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./schema\"), exports);\n__exportStar(require(\"./metadata-schema\"), exports);\n__exportStar(require(\"./artifact-schema\"), exports);\n__exportStar(require(\"./context-queries\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLG9EQUFrQztBQUNsQyxvREFBa0M7QUFDbEMsb0RBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zY2hlbWEnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRhZGF0YS1zY2hlbWEnO1xuZXhwb3J0ICogZnJvbSAnLi9hcnRpZmFjdC1zY2hlbWEnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250ZXh0LXF1ZXJpZXMnO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ArtifactMetadataEntryType = void 0;\n/**\n * Type of artifact metadata entry.\n */\nvar ArtifactMetadataEntryType;\n(function (ArtifactMetadataEntryType) {\n /**\n * Asset in metadata.\n */\n ArtifactMetadataEntryType[\"ASSET\"] = \"aws:cdk:asset\";\n /**\n * Metadata key used to print INFO-level messages by the toolkit when an app is syntheized.\n */\n ArtifactMetadataEntryType[\"INFO\"] = \"aws:cdk:info\";\n /**\n * Metadata key used to print WARNING-level messages by the toolkit when an app is syntheized.\n */\n ArtifactMetadataEntryType[\"WARN\"] = \"aws:cdk:warning\";\n /**\n * Metadata key used to print ERROR-level messages by the toolkit when an app is syntheized.\n */\n ArtifactMetadataEntryType[\"ERROR\"] = \"aws:cdk:error\";\n /**\n * Represents the CloudFormation logical ID of a resource at a certain path.\n */\n ArtifactMetadataEntryType[\"LOGICAL_ID\"] = \"aws:cdk:logicalId\";\n /**\n * Represents tags of a stack.\n */\n ArtifactMetadataEntryType[\"STACK_TAGS\"] = \"aws:cdk:stack-tags\";\n})(ArtifactMetadataEntryType || (exports.ArtifactMetadataEntryType = ArtifactMetadataEntryType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWV0YWRhdGEtc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW9RQTs7R0FFRztBQUNILElBQVkseUJBOEJYO0FBOUJELFdBQVkseUJBQXlCO0lBQ25DOztPQUVHO0lBQ0gsb0RBQXVCLENBQUE7SUFFdkI7O09BRUc7SUFDSCxrREFBcUIsQ0FBQTtJQUVyQjs7T0FFRztJQUNILHFEQUF3QixDQUFBO0lBRXhCOztPQUVHO0lBQ0gsb0RBQXVCLENBQUE7SUFFdkI7O09BRUc7SUFDSCw2REFBZ0MsQ0FBQTtJQUVoQzs7T0FFRztJQUNILDhEQUFpQyxDQUFBO0FBQ25DLENBQUMsRUE5QlcseUJBQXlCLHlDQUF6Qix5QkFBeUIsUUE4QnBDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21tb24gcHJvcGVydGllcyBmb3IgYXNzZXQgbWV0YWRhdGEuXG4gKi9cbmludGVyZmFjZSBCYXNlQXNzZXRNZXRhZGF0YUVudHJ5IHtcbiAgLyoqXG4gICAqIFJlcXVlc3RlZCBwYWNrYWdpbmcgc3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2luZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMb2dpY2FsIGlkZW50aWZpZXIgZm9yIHRoZSBhc3NldFxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGhhc2ggb2YgdGhlIGFzc2V0IHNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUhhc2g6IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCBvbiBkaXNrIHRvIHRoZSBhc3NldFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIEVudHJ5IHNwZWMgZm9yIGZpbGVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBlbnRyeSA9IHtcbiAqICAgcGFja2FnaW5nOiAnZmlsZScsXG4gKiAgIHMzQnVja2V0UGFyYW1ldGVyOiAnYnVja2V0LXBhcmFtZXRlcicsXG4gKiAgIHMzS2V5UGFyYW1lbnRlcjogJ2tleS1wYXJhbWV0ZXInLFxuICogICBhcnRpZmFjdEhhc2hQYXJhbWV0ZXI6ICdoYXNoLXBhcmFtZXRlcicsXG4gKiB9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUFzc2V0TWV0YWRhdGFFbnRyeSBleHRlbmRzIEJhc2VBc3NldE1ldGFkYXRhRW50cnkge1xuICAvKipcbiAgICogUmVxdWVzdGVkIHBhY2thZ2luZyBzdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnaW5nOiAnemlwJyB8ICdmaWxlJztcblxuICAvKipcbiAgICogTmFtZSBvZiBwYXJhbWV0ZXIgd2hlcmUgUzMgYnVja2V0IHNob3VsZCBiZSBwYXNzZWQgaW5cbiAgICovXG4gIHJlYWRvbmx5IHMzQnVja2V0UGFyYW1ldGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgcGFyYW1ldGVyIHdoZXJlIFMzIGtleSBzaG91bGQgYmUgcGFzc2VkIGluXG4gICAqL1xuICByZWFkb25seSBzM0tleVBhcmFtZXRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHdoZXJlIHRoZSBoYXNoIG9mIHRoZSBidW5kbGVkIGFzc2V0IHNob3VsZCBiZSBwYXNzZWQgaW4uXG4gICAqL1xuICByZWFkb25seSBhcnRpZmFjdEhhc2hQYXJhbWV0ZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBNZXRhZGF0YSBFbnRyeSBzcGVjIGZvciBzdGFjayB0YWcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFnIHtcbiAgLyoqXG4gICAqIFRhZyBrZXkuXG4gICAqXG4gICAqIChJbiB0aGUgYWN0dWFsIGZpbGUgb24gZGlzayB0aGlzIHdpbGwgYmUgY2FzZWQgYXMgXCJLZXlcIiwgYW5kIHRoZSBzdHJ1Y3R1cmUgaXNcbiAgICogcGF0Y2hlZCB0byBtYXRjaCB0aGlzIHN0cnVjdHVyZSB1cG9uIGxvYWRpbmc6XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iLzRhYWRhYTc3OWI0OGYzNTgzOGNjY2Q0ZTI1MTA3YjIzMzhmMDU1NDcvcGFja2FnZXMvJTQwYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEvbGliL21hbmlmZXN0LnRzI0wxMzcpXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUYWcgdmFsdWUuXG4gICAqXG4gICAqIChJbiB0aGUgYWN0dWFsIGZpbGUgb24gZGlzayB0aGlzIHdpbGwgYmUgY2FzZWQgYXMgXCJWYWx1ZVwiLCBhbmQgdGhlIHN0cnVjdHVyZSBpc1xuICAgKiBwYXRjaGVkIHRvIG1hdGNoIHRoaXMgc3RydWN0dXJlIHVwb24gbG9hZGluZzpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvNGFhZGFhNzc5YjQ4ZjM1ODM4Y2NjZDRlMjUxMDdiMjMzOGYwNTU0Ny9wYWNrYWdlcy8lNDBhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYS9saWIvbWFuaWZlc3QudHMjTDEzNylcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgRG9ja2VyIGNhY2hlIGJhY2tlbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJJbWFnZUFzc2V0Q2FjaGVPcHRpb24ge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLlxuICAgKiBSZWZlciB0byBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9idWlsZC9jYWNoZS9iYWNrZW5kcy8gZm9yIGZ1bGwgbGlzdCBvZiBiYWNrZW5kcy5cbiAgICogQGRlZmF1bHQgLSB1bnNwZWNpZmllZFxuICAgKlxuICAgKiBAZXhhbXBsZSAncmVnaXN0cnknXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbnkgcGFyYW1ldGVycyB0byBwYXNzIGludG8gdGhlIGRvY2tlciBjYWNoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24uXG4gICAqIFJlZmVyIHRvIGh0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2J1aWxkL2NhY2hlL2JhY2tlbmRzLyBmb3IgY2FjaGUgYmFja2VuZCBjb25maWd1cmF0aW9uLlxuICAgKiBAZGVmYXVsdCB7fSBObyBvcHRpb25zIHByb3ZpZGVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGRlY2xhcmUgY29uc3QgYnJhbmNoOiBzdHJpbmc7XG4gICAqXG4gICAqIGNvbnN0IHBhcmFtcyA9IHtcbiAgICogICByZWY6IGAxMjM0NTY3OC5ka3IuZWNyLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL2NhY2hlOiR7YnJhbmNofWAsXG4gICAqICAgbW9kZTogXCJtYXhcIixcbiAgICogfTtcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogTWV0YWRhdGEgRW50cnkgc3BlYyBmb3IgY29udGFpbmVyIGltYWdlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZW50cnkgPSB7XG4gKiAgIHBhY2thZ2luZzogJ2NvbnRhaW5lci1pbWFnZScsXG4gKiAgIHJlcG9zaXRvcnlOYW1lOiAncmVwb3NpdG9yeS1uYW1lJyxcbiAqICAgaW1hZ2VUYWc6ICd0YWcnLFxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lckltYWdlQXNzZXRNZXRhZGF0YUVudHJ5IGV4dGVuZHMgQmFzZUFzc2V0TWV0YWRhdGFFbnRyeSB7XG4gIC8qKlxuICAgKiBUeXBlIG9mIGFzc2V0XG4gICAqL1xuICByZWFkb25seSBwYWNrYWdpbmc6ICdjb250YWluZXItaW1hZ2UnO1xuXG4gIC8qKlxuICAgKiBFQ1IgUmVwb3NpdG9yeSBuYW1lIGFuZCByZXBvIGRpZ2VzdCAoc2VwYXJhdGVkIGJ5IFwiQHNoYTI1NjpcIikgd2hlcmUgdGhpc1xuICAgKiBpbWFnZSBpcyBzdG9yZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCBJZiBub3Qgc3BlY2lmaWVkLCBgcmVwb3NpdG9yeU5hbWVgIGFuZCBgaW1hZ2VUYWdgIGFyZVxuICAgKiByZXF1aXJlZCBiZWNhdXNlIG90aGVyd2lzZSBob3cgd2lsbCB0aGUgc3RhY2sga25vdyB3aGVyZSB0byBmaW5kIHRoZSBhc3NldCxcbiAgICogaGE/XG4gICAqIEBkZXByZWNhdGVkIHNwZWNpZnkgYHJlcG9zaXRvcnlOYW1lYCBhbmQgYGltYWdlVGFnYCBpbnN0ZWFkLCBhbmQgdGhlbiB5b3VcbiAgICoga25vdyB3aGVyZSB0aGUgaW1hZ2Ugd2lsbCBnby5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlTmFtZVBhcmFtZXRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogRUNSIHJlcG9zaXRvcnkgbmFtZSwgaWYgb21pdHRlZCBhIGRlZmF1bHQgbmFtZSBiYXNlZCBvbiB0aGUgYXNzZXQncyBJRCBpc1xuICAgKiB1c2VkIGluc3RlYWQuIFNwZWNpZnkgdGhpcyBwcm9wZXJ0eSBpZiB5b3UgbmVlZCB0byBzdGF0aWNhbGx5IGFkZHJlc3MgdGhlXG4gICAqIGltYWdlLCBlLmcuIGZyb20gYSBLdWJlcm5ldGVzIFBvZC4gTm90ZSwgdGhpcyBpcyBvbmx5IHRoZSByZXBvc2l0b3J5IG5hbWUsXG4gICAqIHdpdGhvdXQgdGhlIHJlZ2lzdHJ5IGFuZCB0aGUgdGFnIHBhcnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoaXMgcGFyYW1ldGVyIGlzIFJFUVVJUkVEIGFmdGVyIDEuMjEuMFxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2NrZXIgaW1hZ2UgdGFnIHRvIHVzZSBmb3IgdGFnZ2luZyBwdXNoZWQgaW1hZ2VzLiBUaGlzIGZpZWxkIGlzXG4gICAqIHJlcXVpcmVkIGlmIGBpbWFnZVBhcmFtZXRlck5hbWVgIGlzIG9tbWl0ZWQgKG90aGVyd2lzZSwgdGhlIGFwcCB3b24ndCBiZVxuICAgKiBhYmxlIHRvIGZpbmQgdGhlIGltYWdlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGlzIHBhcmFtZXRlciBpcyBSRVFVSVJFRCBhZnRlciAxLjIxLjBcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlVGFnPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBhcmdzIHRvIHBhc3MgdG8gdGhlIGBkb2NrZXIgYnVpbGRgIGNvbW1hbmRcbiAgICpcbiAgICogQGRlZmF1bHQgbm8gYnVpbGQgYXJncyBhcmUgcGFzc2VkXG4gICAqL1xuICByZWFkb25seSBidWlsZEFyZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBTU0ggYWdlbnQgc29ja2V0IG9yIGtleXMgdG8gcGFzcyB0byB0aGUgYGRvY2tlciBidWlsZGAgY29tbWFuZFxuICAgKlxuICAgKiBAZGVmYXVsdCBubyBzc2ggYXJnIGlzIHBhc3NlZFxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRTc2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHNlY3JldHMgdG8gcGFzcyB0byB0aGUgYGRvY2tlciBidWlsZGAgY29tbWFuZFxuICAgKlxuICAgKiBAZGVmYXVsdCBubyBidWlsZCBzZWNyZXRzIGFyZSBwYXNzZWRcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkU2VjcmV0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIERvY2tlciB0YXJnZXQgdG8gYnVpbGQgdG9cbiAgICpcbiAgICogQGRlZmF1bHQgbm8gYnVpbGQgdGFyZ2V0XG4gICAqL1xuICByZWFkb25seSB0YXJnZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIERvY2tlcmZpbGUgKHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGZpbGUgaXMgcGFzc2VkXG4gICAqL1xuICByZWFkb25seSBmaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOZXR3b3JraW5nIG1vZGUgZm9yIHRoZSBSVU4gY29tbWFuZHMgZHVyaW5nIGJ1aWxkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG5ldHdvcmtpbmcgbW9kZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtNb2RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbGF0Zm9ybSB0byBidWlsZCBmb3IuIF9SZXF1aXJlcyBEb2NrZXIgQnVpbGR4Xy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBjdXJyZW50IG1hY2hpbmUgcGxhdGZvcm1cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdXRwdXRzIHRvIHBhc3MgdG8gdGhlIGBkb2NrZXIgYnVpbGRgIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gb3V0cHV0cyBhcmUgcGFzc2VkIHRvIHRoZSBidWlsZCBjb21tYW5kIChkZWZhdWx0IG91dHB1dHMgYXJlIHVzZWQpXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9jb21tYW5kbGluZS9idWlsZC8jY3VzdG9tLWJ1aWxkLW91dHB1dHNcbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ2FjaGUgZnJvbSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIGBkb2NrZXIgYnVpbGRgIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY2FjaGUgZnJvbSBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIGJ1aWxkIGNvbW1hbmRcbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9idWlsZC9jYWNoZS9iYWNrZW5kcy9cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRnJvbT86IENvbnRhaW5lckltYWdlQXNzZXRDYWNoZU9wdGlvbltdO1xuXG4gIC8qKlxuICAgKiBDYWNoZSB0byBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIGBkb2NrZXIgYnVpbGRgIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY2FjaGUgdG8gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSBidWlsZCBjb21tYW5kXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vYnVpbGQvY2FjaGUvYmFja2VuZHMvXG4gICAqL1xuICByZWFkb25seSBjYWNoZVRvPzogQ29udGFpbmVySW1hZ2VBc3NldENhY2hlT3B0aW9uO1xufVxuXG4vKipcbiAqIEBzZWUgQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5BU1NFVFxuICovXG5leHBvcnQgdHlwZSBBc3NldE1ldGFkYXRhRW50cnkgPSBGaWxlQXNzZXRNZXRhZGF0YUVudHJ5IHwgQ29udGFpbmVySW1hZ2VBc3NldE1ldGFkYXRhRW50cnk7XG5cbi8vIFR5cGUgYWxpYXNlcyBmb3IgbWV0YWRhdGEgZW50cmllcy5cbi8vIFVzZWQgc2ltcGx5IHRvIGFzc2lnbiBuYW1lcyB0byBkYXRhIHR5cGVzIGZvciBtb3JlIGNsYXJpdHkuXG5cbi8qKlxuICogQHNlZSBBcnRpZmFjdE1ldGFkYXRhRW50cnlUeXBlLklORk9cbiAqIEBzZWUgQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5XQVJOXG4gKiBAc2VlIEFydGlmYWN0TWV0YWRhdGFFbnRyeVR5cGUuRVJST1JcbiAqL1xuZXhwb3J0IHR5cGUgTG9nTWVzc2FnZU1ldGFkYXRhRW50cnkgPSBzdHJpbmc7XG5cbi8qKlxuICogQHNlZSBBcnRpZmFjdE1ldGFkYXRhRW50cnlUeXBlLkxPR0lDQUxfSURcbiAqL1xuZXhwb3J0IHR5cGUgTG9naWNhbElkTWV0YWRhdGFFbnRyeSA9IHN0cmluZztcblxuLyoqXG4gKiBAc2VlIEFydGlmYWN0TWV0YWRhdGFFbnRyeVR5cGUuU1RBQ0tfVEFHU1xuICovXG5leHBvcnQgdHlwZSBTdGFja1RhZ3NNZXRhZGF0YUVudHJ5ID0gVGFnW107XG5cbi8qKlxuICogVW5pb24gdHlwZSBmb3IgYWxsIG1ldGFkYXRhIGVudHJpZXMgdGhhdCBtaWdodCBleGlzdCBpbiB0aGUgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCB0eXBlIE1ldGFkYXRhRW50cnlEYXRhID0gQXNzZXRNZXRhZGF0YUVudHJ5IHwgTG9nTWVzc2FnZU1ldGFkYXRhRW50cnkgfCBMb2dpY2FsSWRNZXRhZGF0YUVudHJ5IHwgU3RhY2tUYWdzTWV0YWRhdGFFbnRyeTtcblxuLyoqXG4gKiBUeXBlIG9mIGFydGlmYWN0IG1ldGFkYXRhIGVudHJ5LlxuICovXG5leHBvcnQgZW51bSBBcnRpZmFjdE1ldGFkYXRhRW50cnlUeXBlIHtcbiAgLyoqXG4gICAqIEFzc2V0IGluIG1ldGFkYXRhLlxuICAgKi9cbiAgQVNTRVQgPSAnYXdzOmNkazphc3NldCcsXG5cbiAgLyoqXG4gICAqIE1ldGFkYXRhIGtleSB1c2VkIHRvIHByaW50IElORk8tbGV2ZWwgbWVzc2FnZXMgYnkgdGhlIHRvb2xraXQgd2hlbiBhbiBhcHAgaXMgc3ludGhlaXplZC5cbiAgICovXG4gIElORk8gPSAnYXdzOmNkazppbmZvJyxcblxuICAvKipcbiAgICogTWV0YWRhdGEga2V5IHVzZWQgdG8gcHJpbnQgV0FSTklORy1sZXZlbCBtZXNzYWdlcyBieSB0aGUgdG9vbGtpdCB3aGVuIGFuIGFwcCBpcyBzeW50aGVpemVkLlxuICAgKi9cbiAgV0FSTiA9ICdhd3M6Y2RrOndhcm5pbmcnLFxuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBrZXkgdXNlZCB0byBwcmludCBFUlJPUi1sZXZlbCBtZXNzYWdlcyBieSB0aGUgdG9vbGtpdCB3aGVuIGFuIGFwcCBpcyBzeW50aGVpemVkLlxuICAgKi9cbiAgRVJST1IgPSAnYXdzOmNkazplcnJvcicsXG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIENsb3VkRm9ybWF0aW9uIGxvZ2ljYWwgSUQgb2YgYSByZXNvdXJjZSBhdCBhIGNlcnRhaW4gcGF0aC5cbiAgICovXG4gIExPR0lDQUxfSUQgPSAnYXdzOmNkazpsb2dpY2FsSWQnLFxuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHRhZ3Mgb2YgYSBzdGFjay5cbiAgICovXG4gIFNUQUNLX1RBR1MgPSAnYXdzOmNkazpzdGFjay10YWdzJ1xufVxuXG4vKipcbiAqIEEgbWV0YWRhdGEgZW50cnkgaW4gYSBjbG91ZCBhc3NlbWJseSBhcnRpZmFjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUVudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGF0YS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiBNZXRhZGF0YUVudHJ5RGF0YTtcblxuICAvKipcbiAgICogQSBzdGFjayB0cmFjZSBmb3Igd2hlbiB0aGUgZW50cnkgd2FzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdHJhY2UuXG4gICAqL1xuICByZWFkb25seSB0cmFjZT86IHN0cmluZ1tdO1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ArtifactType = void 0;\n/**\n * Type of cloud artifact.\n */\nvar ArtifactType;\n(function (ArtifactType) {\n /**\n * Stub required because of JSII.\n */\n ArtifactType[\"NONE\"] = \"none\";\n /**\n * The artifact is an AWS CloudFormation stack.\n */\n ArtifactType[\"AWS_CLOUDFORMATION_STACK\"] = \"aws:cloudformation:stack\";\n /**\n * The artifact contains the CDK application's construct tree.\n */\n ArtifactType[\"CDK_TREE\"] = \"cdk:tree\";\n /**\n * Manifest for all assets in the Cloud Assembly\n */\n ArtifactType[\"ASSET_MANIFEST\"] = \"cdk:asset-manifest\";\n /**\n * Nested Cloud Assembly\n */\n ArtifactType[\"NESTED_CLOUD_ASSEMBLY\"] = \"cdk:cloud-assembly\";\n})(ArtifactType || (exports.ArtifactType = ArtifactType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBOztHQUVHO0FBQ0gsSUFBWSxZQXlCWDtBQXpCRCxXQUFZLFlBQVk7SUFDdEI7O09BRUc7SUFDSCw2QkFBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxxRUFBcUQsQ0FBQTtJQUVyRDs7T0FFRztJQUNILHFDQUFxQixDQUFBO0lBRXJCOztPQUVHO0lBQ0gscURBQXFDLENBQUE7SUFFckM7O09BRUc7SUFDSCw0REFBNEMsQ0FBQTtBQUM5QyxDQUFDLEVBekJXLFlBQVksNEJBQVosWUFBWSxRQXlCdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcnRpZmFjdFByb3BlcnRpZXMgfSBmcm9tICcuL2FydGlmYWN0LXNjaGVtYSc7XG5pbXBvcnQgeyBDb250ZXh0UHJvdmlkZXIsIENvbnRleHRRdWVyeVByb3BlcnRpZXMgfSBmcm9tICcuL2NvbnRleHQtcXVlcmllcyc7XG5pbXBvcnQgeyBNZXRhZGF0YUVudHJ5IH0gZnJvbSAnLi9tZXRhZGF0YS1zY2hlbWEnO1xuXG4vKipcbiAqIFR5cGUgb2YgY2xvdWQgYXJ0aWZhY3QuXG4gKi9cbmV4cG9ydCBlbnVtIEFydGlmYWN0VHlwZSB7XG4gIC8qKlxuICAgKiBTdHViIHJlcXVpcmVkIGJlY2F1c2Ugb2YgSlNJSS5cbiAgICovXG4gIE5PTkUgPSAnbm9uZScsIC8vIHJlcXVpcmVkIGR1ZSB0byBhIGpzaWkgYnVnXG5cbiAgLyoqXG4gICAqIFRoZSBhcnRpZmFjdCBpcyBhbiBBV1MgQ2xvdWRGb3JtYXRpb24gc3RhY2suXG4gICAqL1xuICBBV1NfQ0xPVURGT1JNQVRJT05fU1RBQ0sgPSAnYXdzOmNsb3VkZm9ybWF0aW9uOnN0YWNrJyxcblxuICAvKipcbiAgICogVGhlIGFydGlmYWN0IGNvbnRhaW5zIHRoZSBDREsgYXBwbGljYXRpb24ncyBjb25zdHJ1Y3QgdHJlZS5cbiAgICovXG4gIENES19UUkVFID0gJ2Nkazp0cmVlJyxcblxuICAvKipcbiAgICogTWFuaWZlc3QgZm9yIGFsbCBhc3NldHMgaW4gdGhlIENsb3VkIEFzc2VtYmx5XG4gICAqL1xuICBBU1NFVF9NQU5JRkVTVCA9ICdjZGs6YXNzZXQtbWFuaWZlc3QnLFxuXG4gIC8qKlxuICAgKiBOZXN0ZWQgQ2xvdWQgQXNzZW1ibHlcbiAgICovXG4gIE5FU1RFRF9DTE9VRF9BU1NFTUJMWSA9ICdjZGs6Y2xvdWQtYXNzZW1ibHknLFxufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBhcHBsaWNhdGlvbidzIHJ1bnRpbWUgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBsaWJyYXJpZXMgbG9hZGVkIGluIHRoZSBhcHBsaWNhdGlvbiwgYXNzb2NpYXRlZCB3aXRoIHRoZWlyIHZlcnNpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlicmFyaWVzOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWlzc2luZyBwaWVjZSBvZiBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1pc3NpbmdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBtaXNzaW5nIGNvbnRleHQga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm92aWRlciBmcm9tIHdoaWNoIHdlIGV4cGVjdCB0aGlzIGNvbnRleHQga2V5IHRvIGJlIG9idGFpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI6IENvbnRleHRQcm92aWRlcjtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcHJvdmlkZXItc3BlY2lmaWMgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BzOiBDb250ZXh0UXVlcnlQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIEEgbWFuaWZlc3QgZm9yIGEgc2luZ2xlIGFydGlmYWN0IHdpdGhpbiB0aGUgY2xvdWQgYXNzZW1ibHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJ0aWZhY3RNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBhcnRpZmFjdC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IEFydGlmYWN0VHlwZTtcblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IGludG8gd2hpY2ggdGhpcyBhcnRpZmFjdCBpcyBkZXBsb3llZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBlbnZyaW9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50Pzogc3RyaW5nOyAvLyBmb3JtYXQ6IGF3czovL2FjY291bnQvcmVnaW9uXG5cbiAgLyoqXG4gICAqIEFzc29jaWF0ZWQgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbWV0YWRhdGEuXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IHsgW3BhdGg6IHN0cmluZ106IE1ldGFkYXRhRW50cnlbXSB9O1xuXG4gIC8qKlxuICAgKiBJRHMgb2YgYXJ0aWZhY3RzIHRoYXQgbXVzdCBiZSBkZXBsb3llZCBiZWZvcmUgdGhpcyBhcnRpZmFjdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICByZWFkb25seSBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHNldCBvZiBwcm9wZXJ0aWVzIGZvciB0aGlzIGFydGlmYWN0IChkZXBlbmRzIG9uIHR5cGUpXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJvcGVydGllcy5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnRpZXM/OiBBcnRpZmFjdFByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGlzIGFydGlmYWN0LiBTaG91bGQgb25seSBiZSB1c2VkIGluIHVzZXIgaW50ZXJmYWNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkaXNwbGF5IG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbWFuaWZlc3Qgd2hpY2ggZGVzY3JpYmVzIHRoZSBjbG91ZCBhc3NlbWJseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NlbWJseU1hbmlmZXN0IHtcbiAgLyoqXG4gICAqIFByb3RvY29sIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNldCBvZiBhcnRpZmFjdHMgaW4gdGhpcyBhc3NlbWJseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhcnRpZmFjdHMuXG4gICAqL1xuICByZWFkb25seSBhcnRpZmFjdHM/OiB7IFtpZDogc3RyaW5nXTogQXJ0aWZhY3RNYW5pZmVzdCB9O1xuXG4gIC8qKlxuICAgKiBNaXNzaW5nIGNvbnRleHQgaW5mb3JtYXRpb24uIElmIHRoaXMgZmllbGQgaGFzIHZhbHVlcywgaXQgbWVhbnMgdGhhdCB0aGVcbiAgICogY2xvdWQgYXNzZW1ibHkgaXMgbm90IGNvbXBsZXRlIGFuZCBzaG91bGQgbm90IGJlIGRlcGxveWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG1pc3NpbmcgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IG1pc3Npbmc/OiBNaXNzaW5nQ29udGV4dFtdO1xuXG4gIC8qKlxuICAgKiBSdW50aW1lIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGluZm8uXG4gICAqL1xuICByZWFkb25seSBydW50aW1lPzogUnVudGltZUluZm87XG59XG4iXX0=","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./cloud-assembly\"), exports);\n__exportStar(require(\"./assets\"), exports);\n__exportStar(require(\"./manifest\"), exports);\n__exportStar(require(\"./integ-tests\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBQWlDO0FBQ2pDLDJDQUF5QjtBQUN6Qiw2Q0FBMkI7QUFDM0IsZ0RBQThCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jbG91ZC1hc3NlbWJseSc7XG5leHBvcnQgKiBmcm9tICcuL2Fzc2V0cyc7XG5leHBvcnQgKiBmcm9tICcuL21hbmlmZXN0JztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZWctdGVzdHMnO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RequireApproval = void 0;\n/**\n * In what scenarios should the CLI ask for approval\n */\nvar RequireApproval;\n(function (RequireApproval) {\n /**\n * Never ask for approval\n */\n RequireApproval[\"NEVER\"] = \"never\";\n /**\n * Prompt for approval for any type of change to the stack\n */\n RequireApproval[\"ANYCHANGE\"] = \"any-change\";\n /**\n * Only prompt for approval if there are security related changes\n */\n RequireApproval[\"BROADENING\"] = \"broadening\";\n})(RequireApproval || (exports.RequireApproval = RequireApproval = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsSUFBWSxlQWVYO0FBZkQsV0FBWSxlQUFlO0lBQ3pCOztPQUVHO0lBQ0gsa0NBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gsMkNBQXdCLENBQUE7SUFFeEI7O09BRUc7SUFDSCw0Q0FBeUIsQ0FBQTtBQUMzQixDQUFDLEVBZlcsZUFBZSwrQkFBZixlQUFlLFFBZTFCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbiB3aGF0IHNjZW5hcmlvcyBzaG91bGQgdGhlIENMSSBhc2sgZm9yIGFwcHJvdmFsXG4gKi9cbmV4cG9ydCBlbnVtIFJlcXVpcmVBcHByb3ZhbCB7XG4gIC8qKlxuICAgKiBOZXZlciBhc2sgZm9yIGFwcHJvdmFsXG4gICAqL1xuICBORVZFUiA9ICduZXZlcicsXG5cbiAgLyoqXG4gICAqIFByb21wdCBmb3IgYXBwcm92YWwgZm9yIGFueSB0eXBlICBvZiBjaGFuZ2UgdG8gdGhlIHN0YWNrXG4gICAqL1xuICBBTllDSEFOR0UgPSAnYW55LWNoYW5nZScsXG5cbiAgLyoqXG4gICAqIE9ubHkgcHJvbXB0IGZvciBhcHByb3ZhbCBpZiB0aGVyZSBhcmUgc2VjdXJpdHkgcmVsYXRlZCBjaGFuZ2VzXG4gICAqL1xuICBCUk9BREVOSU5HID0gJ2Jyb2FkZW5pbmcnXG59XG5cbi8qKlxuICogRGVmYXVsdCBDREsgQ0xJIG9wdGlvbnMgdGhhdCBhcHBseSB0byBhbGwgY29tbWFuZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0Q2RrT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHN0YWNrcyB0byBkZXBsb3lcbiAgICpcbiAgICogUmVxdXJpZWQgaWYgYGFsbGAgaXMgbm90IHNldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFtdXG4gICAqL1xuICByZWFkb25seSBzdGFja3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRGVwbG95IGFsbCBzdGFja3NcbiAgICpcbiAgICogUmVxdXJpZWQgaWYgYHN0YWNrc2AgaXMgbm90IHNldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbGw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBjb21tYW5kLWxpbmUgZm9yIGV4ZWN1dGluZyB5b3VyIGFwcCBvciBhIGNsb3VkIGFzc2VtYmx5IGRpcmVjdG9yeVxuICAgKiBlLmcuIFwibm9kZSBiaW4vbXktYXBwLmpzXCJcbiAgICogb3JcbiAgICogXCJjZGsub3V0XCJcbiAgICpcbiAgICogQGRlZmF1bHQgLSByZWFkIGZyb20gY2RrLmpzb25cbiAgICovXG4gIHJlYWRvbmx5IGFwcD86IHN0cmluZztcblxuICAvKipcbiAgICogUm9sZSB0byBwYXNzIHRvIENsb3VkRm9ybWF0aW9uIGZvciBkZXBsb3ltZW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIHRoZSBib290c3RyYXAgY2ZuLWV4ZWMgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBjb250ZXh0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBjb250ZXh0XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFByaW50IHRyYWNlIGZvciBzdGFjayB3YXJuaW5nc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEbyBub3QgY29uc3RydWN0IHN0YWNrcyB3aXRoIHdhcm5pbmdzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzdHJpY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGNvbnRleHQgbG9va3Vwcy5cbiAgICpcbiAgICogU3ludGhlc2lzIGZhaWxzIGlmIHRoaXMgaXMgZGlzYWJsZWQgYW5kIGNvbnRleHQgbG9va3VwcyBuZWVkXG4gICAqIHRvIGJlIHBlcmZvcm1lZFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBsb29rdXBzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICAqIElnbm9yZXMgc3ludGhlc2lzIGVycm9ycywgd2hpY2ggd2lsbCBsaWtlbHkgcHJvZHVjZSBhbiBpbnZhbGlkIG91dHB1dFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlRXJyb3JzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNlIEpTT04gb3V0cHV0IGluc3RlYWQgb2YgWUFNTCB3aGVuIHRlbXBsYXRlcyBhcmUgcHJpbnRlZFxuICAgKiB0byBTVERPVVRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGpzb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBzaG93IGRlYnVnIGxvZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcmJvc2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBlbmFibGUgZW1pc3Npb24gb2YgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHN1Y2ggYXMgY3JlYXRpb24gc3RhY2tcbiAgICogdHJhY2VzIG9mIHRva2Vuc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGluZGljYXRlZCBBV1MgcHJvZmlsZSBhcyB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb2ZpbGUgaXMgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVXNlIHRoZSBpbmRpY2F0ZWQgcHJveHkuIFdpbGwgcmVhZCBmcm9tXG4gICAqIEhUVFBTX1BST1hZIGVudmlyb25tZW50IGlmIHNwZWNpZmllZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb3h5XG4gICAqL1xuICByZWFkb25seSBwcm94eT86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBDQSBjZXJ0aWZpY2F0ZSB0byB1c2Ugd2hlbiB2YWxpZGF0aW5nIEhUVFBTXG4gICAqIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHJlYWQgZnJvbSBBV1NfQ0FfQlVORExFIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAqL1xuICByZWFkb25seSBjYUJ1bmRsZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZvcmNlIHRyeWluZyB0byBmZXRjaCBFQzIgaW5zdGFuY2UgY3JlZGVudGlhbHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBndWVzcyBFQzIgaW5zdGFuY2Ugc3RhdHVzXG4gICAqL1xuICByZWFkb25seSBlYzJDcmVkcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluY2x1ZGUgXCJBV1M6OkNESzo6TWV0YWRhdGFcIiByZXNvdXJjZSBpbiBzeW50aGVzaXplZCB0ZW1wbGF0ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvblJlcG9ydGluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluY2x1ZGUgXCJhd3M6Y2RrOnBhdGhcIiBDbG91ZEZvcm1hdGlvbiBtZXRhZGF0YSBmb3IgZWFjaCByZXNvdXJjZVxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBwYXRoTWV0YWRhdGE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIFwiYXdzOmFzc2V0OipcIiBDbG91ZEZvcm1hdGlvbiBtZXRhZGF0YSBmb3IgcmVzb3VyY2VzIHRoYXQgdXNlIGFzc2V0c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhc3NldE1ldGFkYXRhPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29weSBhc3NldHMgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnlcbiAgICpcbiAgICogTmVlZGVkIGZvciBsb2NhbCBkZWJ1Z2dpbmcgdGhlIHNvdXJjZSBmaWxlcyB3aXRoIFNBTSBDTElcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHN0YWdpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgc3ludGhlc2l6ZWQgY2xvdWQgYXNzZW1ibHkgaW50byBhIGRpcmVjdG9yeVxuICAgKlxuICAgKiBAZGVmYXVsdCBjZGsub3V0XG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNob3cgcmVsZXZhbnQgbm90aWNlc1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBub3RpY2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2hvdyBjb2xvcnMgYW5kIG90aGVyIHN0eWxlIGZyb20gY29uc29sZSBvdXRwdXRcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29sb3I/OiBib29sZWFuO1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVwbG95LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0Q2RrT3B0aW9ucywgUmVxdWlyZUFwcHJvdmFsIH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIE9wdGlvbnMgdG8gdXNlIHdpdGggY2RrIGRlcGxveVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveU9wdGlvbnMgZXh0ZW5kcyBEZWZhdWx0Q2RrT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPbmx5IHBlcmZvcm0gYWN0aW9uIG9uIHRoZSBnaXZlbiBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVzaXZlbHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0b29sa2l0IHN0YWNrIHRvIHVzZS9kZXBsb3lcbiAgICpcbiAgICogQGRlZmF1bHQgQ0RLVG9vbGtpdFxuICAgKi9cbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmV1c2UgdGhlIGFzc2V0cyB3aXRoIHRoZSBnaXZlbiBhc3NldCBJRHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkbyBub3QgcmV1c2UgYXNzZXRzXG4gICAqL1xuICByZWFkb25seSByZXVzZUFzc2V0cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBuYW1lIHRvIHVzZSBmb3IgdGhlIENsb3VkRm9ybWF0aW9uIGNoYW5nZSBzZXQuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYSBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0byBnZW5lcmF0ZSBhIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZVNldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBkZXBsb3ksIGV2ZW4gaWYgdGVtcGxhdGVzIGFyZSBpZGVudGljYWwuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIGZhaWxlZCBkZXBsb3ltZW50c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSByb2xsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFSTnMgb2YgU05TIHRvcGljcyB0aGF0IENsb3VkRm9ybWF0aW9uIHdpbGwgbm90aWZ5IHdpdGggc3RhY2sgcmVsYXRlZCBldmVudHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBub3RpZmljYXRpb25zXG4gICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Bcm5zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoYXQga2luZCBvZiBzZWN1cml0eSBjaGFuZ2VzIHJlcXVpcmUgYXBwcm92YWxcbiAgICpcbiAgICogQGRlZmF1bHQgUmVxdWlyZUFwcHJvdmFsLk5ldmVyXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlQXBwcm92YWw/OiBSZXF1aXJlQXBwcm92YWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXhlY3V0ZSB0aGUgQ2hhbmdlU2V0XG4gICAqIE5vdCBwcm92aWRpbmcgYGV4ZWN1dGVgIHBhcmFtZXRlciB3aWxsIHJlc3VsdCBpbiBleGVjdXRpb24gb2YgQ2hhbmdlU2V0XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIENsb3VkRm9ybWF0aW9uIGF0IGRlcGxveSB0aW1lXG4gICAqIEBkZWZhdWx0IHt9XG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFVzZSBwcmV2aW91cyB2YWx1ZXMgZm9yIHVuc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAgICpcbiAgICogSWYgbm90IHNldCwgYWxsIHBhcmFtZXRlcnMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGV2ZXJ5IGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHVzZVByZXZpb3VzUGFyYW1ldGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZmlsZSB3aGVyZSBzdGFjayBvdXRwdXRzIHdpbGwgYmUgd3JpdHRlbiBhZnRlciBhIHN1Y2Nlc3NmdWwgZGVwbG95IGFzIEpTT05cbiAgICogQGRlZmF1bHQgLSBPdXRwdXRzIGFyZSBub3Qgd3JpdHRlbiB0byBhbnkgZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0c0ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2UgYXJlIG9uIGEgQ0kgc3lzdGVtXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjaT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlcGxveSBtdWx0aXBsZSBzdGFja3MgaW4gcGFyYWxsZWxcbiAgICpcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgY29uY3VycmVuY3k/OiBudW1iZXI7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzdHJveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRlc3Ryb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlZmF1bHRDZGtPcHRpb25zIH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIE9wdGlvbnMgdG8gdXNlIHdpdGggY2RrIGRlc3Ryb3lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXN0cm95T3B0aW9ucyBleHRlbmRzIERlZmF1bHRDZGtPcHRpb25zIHtcbiAgLyoqXG4gICAqIERvIG5vdCBhc2sgZm9yIHBlcm1pc3Npb24gYmVmb3JlIGRlc3Ryb3lpbmcgc3RhY2tzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9ubHkgZGVzdHJveSB0aGUgZ2l2ZW4gc3RhY2tcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1c2l2ZWx5PzogYm9vbGVhbjtcbn1cbiJdfQ==","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./common\"), exports);\n__exportStar(require(\"./deploy\"), exports);\n__exportStar(require(\"./destroy\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLDJDQUF5QjtBQUN6Qiw0Q0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NvbW1vbic7XG5leHBvcnQgKiBmcm9tICcuL2RlcGxveSc7XG5leHBvcnQgKiBmcm9tICcuL2Rlc3Ryb3knO1xuIl19","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./schema\"), exports);\n__exportStar(require(\"./commands\"), exports);\n__exportStar(require(\"./test-case\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLDZDQUEyQjtBQUMzQiw4Q0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NjaGVtYSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbW1hbmRzJztcbmV4cG9ydCAqIGZyb20gJy4vdGVzdC1jYXNlJztcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXN0Q2FzZSB9IGZyb20gJy4vdGVzdC1jYXNlJztcbi8qKlxuICogRGVmaW5pdGlvbnMgZm9yIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0aW5nIG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBtYW5pZmVzdFxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgbG9va3VwcyBmb3IgdGhpcyB0ZXN0LiBJZiBsb29rdXBzIGFyZSBlbmFibGVkXG4gICAqIHRoZW4gYHN0YWNrVXBkYXRlV29ya2Zsb3dgIG11c3QgYmUgc2V0IHRvIGZhbHNlLlxuICAgKiBMb29rdXBzIHNob3VsZCBvbmx5IGJlIGVuYWJsZWQgd2hlbiB5b3UgYXJlIGV4cGxpY2l0ZWx5IHRlc3RpbmdcbiAgICogbG9va3Vwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUxvb2t1cHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGNvbnRleHQgdG8gdXNlIHdoZW4gcGVyZm9ybWluZ1xuICAgKiBhIHN5bnRoLiBBbnkgY29udGV4dCBwcm92aWRlZCBoZXJlIHdpbGwgb3ZlcnJpZGVcbiAgICogYW55IGRlZmF1bHQgY29udGV4dFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgY29udGV4dFxuICAgKi9cbiAgcmVhZG9ubHkgc3ludGhDb250ZXh0PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIHRlc3QgY2FzZXNcbiAgICovXG4gIHJlYWRvbmx5IHRlc3RDYXNlczogeyBbdGVzdE5hbWU6IHN0cmluZ106IFRlc3RDYXNlIH07XG59XG5cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidGVzdC1jYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXBsb3lPcHRpb25zLCBEZXN0cm95T3B0aW9ucyB9IGZyb20gJy4vY29tbWFuZHMnO1xuXG4vKipcbiAqIFRoZSBzZXQgb2Ygb3B0aW9ucyB0byBjb250cm9sIHRoZSB3b3JrZmxvdyBvZiB0aGUgdGVzdCBydW5uZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSdW4gdXBkYXRlIHdvcmtmbG93IG9uIHRoaXMgdGVzdCBjYXNlXG4gICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgc2V0IHRvIGZhbHNlIHRvIHRlc3Qgc2NlbmFyaW9zXG4gICAqIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSB0byB0ZXN0IGFzIHBhcnQgb2YgdGhlIHVwZGF0ZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzdGFja1VwZGF0ZVdvcmtmbG93PzogYm9vbGVhbjtcblxuICAvKipcbiAgICAqIEFkZGl0aW9uYWwgb3B0aW9ucyB0byB1c2UgZm9yIGVhY2ggQ0RLIGNvbW1hbmRcbiAgICAqXG4gICAgKiBAZGVmYXVsdCAtIHJ1bm5lciBkZWZhdWx0IG9wdGlvbnNcbiAgICAqL1xuICByZWFkb25seSBjZGtDb21tYW5kT3B0aW9ucz86IENka0NvbW1hbmRzO1xuXG4gIC8qKlxuICAgICogQWRkaXRpb25hbCBjb21tYW5kcyB0byBydW4gYXQgcHJlZGVmaW5lZCBwb2ludHMgaW4gdGhlIHRlc3Qgd29ya2Zsb3dcbiAgICAqXG4gICAgKiBlLmcuIHsgcG9zdERlcGxveTogWyd5YXJuJywgJ3Rlc3QnXSB9XG4gICAgKlxuICAgICogQGRlZmF1bHQgLSBubyBob29rc1xuICAgICovXG4gIHJlYWRvbmx5IGhvb2tzPzogSG9va3M7XG5cbiAgLyoqXG4gICAgKiBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIGFzc2V0IGhhc2hlcyBpbiB0aGUgZGlmZlxuICAgICogQXNzZXQgaGFzaGVzIGNhbiBpbnRyb2R1Y2VzIGEgbG90IG9mIHVubmVjY2Vzc2FyeSBub2lzZSBpbnRvIHRlc3RzLFxuICAgICogYnV0IHRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIGFzc2V0IGhhc2hlcyBfc2hvdWxkXyBiZSBpbmNsdWRlZC4gRm9yIGV4YW1wbGVcbiAgICAqIGFueSB0ZXN0cyBpbnZvbHZpbmcgY3VzdG9tIHJlc291cmNlcyBvciBidW5kbGluZ1xuICAgICpcbiAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgKi9cbiAgcmVhZG9ubHkgZGlmZkFzc2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAgKiBMaXN0IG9mIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGVzIGluIHRoaXMgc3RhY2sgdGhhdCBjYW5cbiAgICAqIGJlIGRlc3Ryb3llZCBhcyBwYXJ0IG9mIGFuIHVwZGF0ZSB3aXRob3V0IGZhaWxpbmcgdGhlIHRlc3QuXG4gICAgKlxuICAgICogVGhpcyBsaXN0IHNob3VsZCBvbmx5IGluY2x1ZGUgcmVzb3VyY2VzIHRoYXQgZm9yIHRoaXMgc3BlY2lmaWNcbiAgICAqIGludGVncmF0aW9uIHRlc3Qgd2UgYXJlIHN1cmUgd2lsbCBub3QgY2F1c2UgZXJyb3JzIG9yIGFuIG91dGFnZSBpZlxuICAgICogZGVzdHJveWVkLiBGb3IgZXhhbXBsZSwgbWF5YmUgd2Uga25vdyB0aGF0IGEgbmV3IHJlc291cmNlIHdpbGwgYmUgY3JlYXRlZFxuICAgICogZmlyc3QgYmVmb3JlIHRoZSBvbGQgcmVzb3VyY2UgaXMgZGVzdHJveWVkIHdoaWNoIHByZXZlbnRzIGFueSBvdXRhZ2UuXG4gICAgKlxuICAgICogZS5nLiBbJ0FXUzo6SUFNOjpSb2xlJ11cbiAgICAqXG4gICAgKiBAZGVmYXVsdCAtIGRvIG5vdCBhbGxvdyBkZXN0cnVjdGlvbiBvZiBhbnkgcmVzb3VyY2VzIG9uIHVwZGF0ZVxuICAgICovXG4gIHJlYWRvbmx5IGFsbG93RGVzdHJveT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgICogTGltaXQgZGVwbG95bWVudCB0byB0aGVzZSByZWdpb25zXG4gICAgKlxuICAgICogQGRlZmF1bHQgLSBjYW4gcnVuIGluIGFueSByZWdpb25cbiAgICAqL1xuICByZWFkb25seSByZWdpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbnRlZ3JhdGlvbiB0ZXN0IGNhc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXN0Q2FzZSBleHRlbmRzIFRlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrcyB0aGF0IHNob3VsZCBiZSB0ZXN0ZWQgYXMgcGFydCBvZiB0aGlzIHRlc3QgY2FzZVxuICAgKiBUaGUgc3RhY2tOYW1lcyB3aWxsIGJlIHBhc3NlZCBhcyBhcmdzIHRvIHRoZSBjZGsgY29tbWFuZHNcbiAgICogc28gZGVwZW5kZW50IHN0YWNrcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGVwbG95ZWQgdW5sZXNzXG4gICAqIGBleGNsdXNpdmVseWAgaXMgcGFzc2VkXG4gICAqL1xuICByZWFkb25seSBzdGFja3M6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbm9kZSBpZCBvZiB0aGUgc3RhY2sgdGhhdCBjb250YWlucyBhc3NlcnRpb25zLlxuICAgKiBUaGlzIGlzIHRoZSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlcGxveSB0aGUgc3RhY2sgd2l0aCB0aGUgQ0RLIENMSVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFzc2VydGlvbiBzdGFja1xuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXJ0aW9uU3RhY2s/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzdGFjayB0aGF0IGNvbnRhaW5zIGFzc2VydGlvbnNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhc3NlcnRpb24gc3RhY2tcbiAgICovXG4gIHJlYWRvbmx5IGFzc2VydGlvblN0YWNrTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21tYW5kcyB0byBydW4gYXQgcHJlZGVmaW5lZCBwb2ludHMgZHVyaW5nIHRoZVxuICogaW50ZWdyYXRpb24gdGVzdCB3b3JrZmxvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tzIHtcbiAgLyoqXG4gICAqIENvbW1hbmRzIHRvIHJ1biBwcmlvciB0byBkZXBsb3lpbmcgdGhlIGNkayBzdGFja3NcbiAgICogaW4gdGhlIGludGVncmF0aW9uIHRlc3RcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb21tYW5kc1xuICAgKi9cbiAgcmVhZG9ubHkgcHJlRGVwbG95Pzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIENvbW1hbmRzIHRvIHJ1biBwcmlvciBhZnRlciBkZXBsb3lpbmcgdGhlIGNkayBzdGFja3NcbiAgICogaW4gdGhlIGludGVncmF0aW9uIHRlc3RcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb21tYW5kc1xuICAgKi9cbiAgcmVhZG9ubHkgcG9zdERlcGxveT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBDb21tYW5kcyB0byBydW4gcHJpb3IgdG8gZGVzdHJveWluZyB0aGUgY2RrIHN0YWNrc1xuICAgKiBpbiB0aGUgaW50ZWdyYXRpb24gdGVzdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbW1hbmRzXG4gICAqL1xuICByZWFkb25seSBwcmVEZXN0cm95Pzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIENvbW1hbmRzIHRvIHJ1biBhZnRlciBkZXN0cm95aW5nIHRoZSBjZGsgc3RhY2tzXG4gICAqIGluIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29tbWFuZHNcbiAgICovXG4gIHJlYWRvbmx5IHBvc3REZXN0cm95Pzogc3RyaW5nW107XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNkayBjb21tYW5kXG4gKiBpLmUuIGBzeW50aGAsIGBkZXBsb3lgLCAmIGBkZXN0cm95YFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENka0NvbW1hbmQge1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gcnVuIHRoaXMgY29tbWFuZCBhcyBwYXJ0IG9mIHRoZSB3b3JrZmxvd1xuICAgKiBUaGlzIGNhbiBiZSB1c2VkIGlmIHlvdSBvbmx5IHdhbnQgdG8gdGVzdCBzb21lIG9mIHRoZSB3b3JrZmxvd1xuICAgKiBmb3IgZXhhbXBsZSBlbmFibGUgYHN5bnRoYCBhbmQgZGlzYWJsZSBgZGVwbG95YCAmIGBkZXN0cm95YCBpbiBvcmRlclxuICAgKiB0byBsaW1pdCB0aGUgdGVzdCB0byBzeW50aGVzaXNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRoZSBydW5uZXIgc2hvdWxkIGV4cGVjdCB0aGlzIGNvbW1hbmQgdG8gZmFpbFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZWN0RXJyb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggYGV4cGVjdGVkRXJyb3JgXG4gICAqIHRvIHZhbGlkYXRlIHRoYXQgYSBzcGVjaWZpYyBtZXNzYWdlIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRvIG5vdCB2YWxpZGF0ZSBtZXNzYWdlXG4gICAqL1xuICByZWFkb25seSBleHBlY3RlZE1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNkayBkZXBsb3kgY29tbWFuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveUNvbW1hbmQgZXh0ZW5kcyBDZGtDb21tYW5kIHtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNvbW1hbmRcbiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byB0ZXN0IHNwZWNpZmljIENMSSBmdW5jdGlvbmFsaXR5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gb25seSBkZWZhdWx0IGFyZ3MgYXJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M/OiBEZXBsb3lPcHRpb25zO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjZGsgZGVzdHJveSBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVzdHJveUNvbW1hbmQgZXh0ZW5kcyBDZGtDb21tYW5kIHtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNvbW1hbmRcbiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byB0ZXN0IHNwZWNpZmljIENMSSBmdW5jdGlvbmFsaXR5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gb25seSBkZWZhdWx0IGFyZ3MgYXJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M/OiBEZXN0cm95T3B0aW9ucztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGVjaWZpYyBjZGsgY29tbWFuZHMgdGhhdCBhcmUgcnVuXG4gKiBhcyBwYXJ0IG9mIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IHdvcmtmbG93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrQ29tbWFuZHMge1xuICAvKipcbiAgICogT3B0aW9ucyB0byBmb3IgdGhlIGNkayBkZXBsb3kgY29tbWFuZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgZGVwbG95IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveT86IERlcGxveUNvbW1hbmQ7XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgdG8gZm9yIHRoZSBjZGsgZGVzdHJveSBjb21tYW5kXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBkZXN0cm95IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRlc3Ryb3k/OiBEZXN0cm95Q29tbWFuZDtcbn1cbiJdfQ==","\"use strict\";\nvar _a;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Manifest = exports.VERSION_MISMATCH = void 0;\nconst jsiiDeprecationWarnings = require(\"../.warnings.jsii.js\");\nconst JSII_RTTI_SYMBOL_1 = Symbol.for(\"jsii.rtti\");\nconst fs = require(\"fs\");\nconst jsonschema = require(\"jsonschema\");\nconst semver = require(\"semver\");\nconst assembly = require(\"./cloud-assembly\");\n/* eslint-disable @typescript-eslint/no-var-requires */\n/* eslint-disable @typescript-eslint/no-require-imports */\n// this prefix is used by the CLI to identify this specific error.\n// in which case we want to instruct the user to upgrade his CLI.\n// see exec.ts#createAssembly\nexports.VERSION_MISMATCH = 'Cloud assembly schema version mismatch';\nconst ASSETS_SCHEMA = require('../schema/assets.schema.json');\nconst ASSEMBLY_SCHEMA = require('../schema/cloud-assembly.schema.json');\n/**\n * Version is shared for both manifests\n */\nconst SCHEMA_VERSION = require('../schema/cloud-assembly.version.json').version;\nconst INTEG_SCHEMA = require('../schema/integ.schema.json');\n/**\n * Protocol utility class.\n */\nclass Manifest {\n /**\n * Validates and saves the cloud assembly manifest to file.\n *\n * @param manifest - manifest.\n * @param filePath - output file path.\n */\n static saveAssemblyManifest(manifest, filePath) {\n try {\n jsiiDeprecationWarnings._aws_cdk_cloud_assembly_schema_AssemblyManifest(manifest);\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.saveAssemblyManifest);\n }\n throw error;\n }\n Manifest.saveManifest(manifest, filePath, ASSEMBLY_SCHEMA, Manifest.patchStackTagsOnWrite);\n }\n /**\n * Load and validates the cloud assembly manifest from file.\n *\n * @param filePath - path to the manifest file.\n */\n static loadAssemblyManifest(filePath, options) {\n try {\n jsiiDeprecationWarnings._aws_cdk_cloud_assembly_schema_LoadManifestOptions(options);\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.loadAssemblyManifest);\n }\n throw error;\n }\n return Manifest.loadManifest(filePath, ASSEMBLY_SCHEMA, Manifest.patchStackTagsOnRead, options);\n }\n /**\n * Validates and saves the asset manifest to file.\n *\n * @param manifest - manifest.\n * @param filePath - output file path.\n */\n static saveAssetManifest(manifest, filePath) {\n try {\n jsiiDeprecationWarnings._aws_cdk_cloud_assembly_schema_AssetManifest(manifest);\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.saveAssetManifest);\n }\n throw error;\n }\n Manifest.saveManifest(manifest, filePath, ASSETS_SCHEMA, Manifest.patchStackTagsOnRead);\n }\n /**\n * Load and validates the asset manifest from file.\n *\n * @param filePath - path to the manifest file.\n */\n static loadAssetManifest(filePath) {\n return this.loadManifest(filePath, ASSETS_SCHEMA);\n }\n /**\n * Validates and saves the integ manifest to file.\n *\n * @param manifest - manifest.\n * @param filePath - output file path.\n */\n static saveIntegManifest(manifest, filePath) {\n try {\n jsiiDeprecationWarnings._aws_cdk_cloud_assembly_schema_IntegManifest(manifest);\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.saveIntegManifest);\n }\n throw error;\n }\n Manifest.saveManifest(manifest, filePath, INTEG_SCHEMA);\n }\n /**\n * Load and validates the integ manifest from file.\n *\n * @param filePath - path to the manifest file.\n */\n static loadIntegManifest(filePath) {\n return this.loadManifest(filePath, INTEG_SCHEMA);\n }\n /**\n * Fetch the current schema version number.\n */\n static version() {\n return SCHEMA_VERSION;\n }\n /**\n * Deprecated\n * @deprecated use `saveAssemblyManifest()`\n */\n static save(manifest, filePath) { try {\n jsiiDeprecationWarnings.print(\"@aws-cdk/cloud-assembly-schema.Manifest#save\", \"use `saveAssemblyManifest()`\");\n jsiiDeprecationWarnings._aws_cdk_cloud_assembly_schema_AssemblyManifest(manifest);\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.save);\n }\n throw error;\n } return this.saveAssemblyManifest(manifest, filePath); }\n /**\n * Deprecated\n * @deprecated use `loadAssemblyManifest()`\n */\n static load(filePath) { try {\n jsiiDeprecationWarnings.print(\"@aws-cdk/cloud-assembly-schema.Manifest#load\", \"use `loadAssemblyManifest()`\");\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.load);\n }\n throw error;\n } return this.loadAssemblyManifest(filePath); }\n static validate(manifest, schema, options) {\n function parseVersion(version) {\n const ver = semver.valid(version);\n if (!ver) {\n throw new Error(`Invalid semver string: \"${version}\"`);\n }\n return ver;\n }\n const maxSupported = parseVersion(Manifest.version());\n const actual = parseVersion(manifest.version);\n // first validate the version should be accepted.\n if (semver.gt(actual, maxSupported) && !options?.skipVersionCheck) {\n // we use a well known error prefix so that the CLI can identify this specific error\n // and print some more context to the user.\n throw new Error(`${exports.VERSION_MISMATCH}: Maximum schema version supported is ${maxSupported}, but found ${actual}`);\n }\n // now validate the format is good.\n const validator = new jsonschema.Validator();\n const result = validator.validate(manifest, schema, {\n // does exist but is not in the TypeScript definitions\n nestedErrors: true,\n allowUnknownAttributes: false,\n });\n let errors = result.errors;\n if (options?.skipEnumCheck) {\n // Enum validations aren't useful when\n errors = stripEnumErrors(errors);\n }\n if (errors.length > 0) {\n throw new Error(`Invalid assembly manifest:\\n${errors.map(e => e.stack).join('\\n')}`);\n }\n }\n static saveManifest(manifest, filePath, schema, preprocess) {\n let withVersion = { ...manifest, version: Manifest.version() };\n Manifest.validate(withVersion, schema);\n if (preprocess) {\n withVersion = preprocess(withVersion);\n }\n fs.writeFileSync(filePath, JSON.stringify(withVersion, undefined, 2));\n }\n static loadManifest(filePath, schema, preprocess, options) {\n const contents = fs.readFileSync(filePath, { encoding: 'utf-8' });\n let obj;\n try {\n obj = JSON.parse(contents);\n }\n catch (e) {\n throw new Error(`${e.message}, while parsing ${JSON.stringify(contents)}`);\n }\n if (preprocess) {\n obj = preprocess(obj);\n }\n Manifest.validate(obj, schema, options);\n return obj;\n }\n /**\n * This requires some explaining...\n *\n * We previously used `{ Key, Value }` for the object that represents a stack tag. (Notice the casing)\n * @link https://github.com/aws/aws-cdk/blob/v1.27.0/packages/aws-cdk/lib/api/cxapp/stacks.ts#L427.\n *\n * When that object moved to this package, it had to be JSII compliant, which meant the property\n * names must be `camelCased`, and not `PascalCased`. This meant it no longer matches the structure in the `manifest.json` file.\n * In order to support current manifest files, we have to translate the `PascalCased` representation to the new `camelCased` one.\n *\n * Note that the serialization itself still writes `PascalCased` because it relates to how CloudFormation expects it.\n *\n * Ideally, we would start writing the `camelCased` and translate to how CloudFormation expects it when needed. But this requires nasty\n * backwards-compatibility code and it just doesn't seem to be worth the effort.\n */\n static patchStackTagsOnRead(manifest) {\n return Manifest.replaceStackTags(manifest, tags => tags.map((diskTag) => ({\n key: diskTag.Key,\n value: diskTag.Value,\n })));\n }\n /**\n * See explanation on `patchStackTagsOnRead`\n *\n * Translate stack tags metadata if it has the \"right\" casing.\n */\n static patchStackTagsOnWrite(manifest) {\n return Manifest.replaceStackTags(manifest, tags => tags.map(memTag => \n // Might already be uppercased (because stack synthesis generates it in final form yet)\n ('Key' in memTag ? memTag : { Key: memTag.key, Value: memTag.value })));\n }\n /**\n * Recursively replace stack tags in the stack metadata\n */\n static replaceStackTags(manifest, fn) {\n // Need to add in the `noUndefined`s because otherwise jest snapshot tests are going to freak out\n // about the keys with values that are `undefined` (even though they would never be JSON.stringified)\n return noUndefined({\n ...manifest,\n artifacts: mapValues(manifest.artifacts, artifact => {\n if (artifact.type !== assembly.ArtifactType.AWS_CLOUDFORMATION_STACK) {\n return artifact;\n }\n return noUndefined({\n ...artifact,\n metadata: mapValues(artifact.metadata, metadataEntries => metadataEntries.map(metadataEntry => {\n if (metadataEntry.type !== assembly.ArtifactMetadataEntryType.STACK_TAGS || !metadataEntry.data) {\n return metadataEntry;\n }\n return {\n ...metadataEntry,\n data: fn(metadataEntry.data),\n };\n })),\n });\n }),\n });\n }\n constructor() { }\n}\nexports.Manifest = Manifest;\n_a = JSII_RTTI_SYMBOL_1;\nManifest[_a] = { fqn: \"@aws-cdk/cloud-assembly-schema.Manifest\", version: \"2.103.1\" };\nfunction mapValues(xs, fn) {\n if (!xs) {\n return undefined;\n }\n const ret = {};\n for (const [k, v] of Object.entries(xs)) {\n ret[k] = fn(v);\n }\n return ret;\n}\nfunction noUndefined(xs) {\n const ret = {};\n for (const [k, v] of Object.entries(xs)) {\n if (v !== undefined) {\n ret[k] = v;\n }\n }\n return ret;\n}\nfunction stripEnumErrors(errors) {\n return errors.filter(e => typeof e.schema === 'string' || !('enum' in e.schema));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx5QkFBeUI7QUFDekIseUNBQXlDO0FBQ3pDLGlDQUFpQztBQUVqQyw2Q0FBNkM7QUFHN0MsdURBQXVEO0FBQ3ZELDBEQUEwRDtBQUUxRCxrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLDZCQUE2QjtBQUNoQixRQUFBLGdCQUFnQixHQUFXLHdDQUF3QyxDQUFDO0FBRWpGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBRTlELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0FBRXhFOztHQUVHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBRWhGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBc0M1RDs7R0FFRztBQUNILE1BQWEsUUFBUTtJQUNuQjs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxRQUFtQyxFQUFFLFFBQWdCOzs7Ozs7Ozs7O1FBQ3RGLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7S0FDNUY7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsT0FBNkI7Ozs7Ozs7Ozs7UUFDaEYsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ2pHO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBOEIsRUFBRSxRQUFnQjs7Ozs7Ozs7OztRQUM5RSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0tBQ3pGO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFnQjtRQUM5QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0tBQ25EO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBNkIsRUFBRSxRQUFnQjs7Ozs7Ozs7OztRQUM3RSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDekQ7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQWdCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDbEQ7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxPQUFPO1FBQ25CLE9BQU8sY0FBYyxDQUFDO0tBQ3ZCO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFtQyxFQUFFLFFBQWdCOzs7Ozs7Ozs7TUFBSSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtJQUVuSTs7O09BR0c7SUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQWdCOzs7Ozs7OztNQUErQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFO0lBRXZHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBNkIsRUFBRSxNQUF5QixFQUFFLE9BQTZCO1FBQzdHLFNBQVMsWUFBWSxDQUFDLE9BQWU7WUFDbkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE9BQU8sR0FBRyxDQUFDLENBQUM7YUFDeEQ7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5QyxpREFBaUQ7UUFDakQsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRTtZQUNqRSxvRkFBb0Y7WUFDcEYsMkNBQTJDO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyx3QkFBZ0IseUNBQXlDLFlBQVksZUFBZSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ2xIO1FBRUQsbUNBQW1DO1FBQ25DLE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRTtZQUVsRCxzREFBc0Q7WUFDdEQsWUFBWSxFQUFFLElBQUk7WUFFbEIsc0JBQXNCLEVBQUUsS0FBSztTQUV2QixDQUFDLENBQUM7UUFFVixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksT0FBTyxFQUFFLGFBQWEsRUFBRTtZQUMxQixzQ0FBc0M7WUFDdEMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNsQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZGO0tBQ0Y7SUFFTyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQWEsRUFBRSxRQUFnQixFQUFFLE1BQXlCLEVBQUUsVUFBOEI7UUFDcEgsSUFBSSxXQUFXLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDL0QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxVQUFVLEVBQUU7WUFDZCxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3ZDO1FBQ0QsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkU7SUFFTyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQWdCLEVBQUUsTUFBeUIsRUFBRSxVQUE4QixFQUFFLE9BQTZCO1FBQ3BJLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxHQUFHLENBQUM7UUFDUixJQUFJO1lBQ0YsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDNUI7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxtQkFBbUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDNUU7UUFDRCxJQUFJLFVBQVUsRUFBRTtZQUNkLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdkI7UUFDRCxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEMsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0ssTUFBTSxDQUFDLG9CQUFvQixDQUFDLFFBQW1DO1FBQ3JFLE9BQU8sUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0UsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQ2hCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztTQUNyQixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ047SUFFRDs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLHFCQUFxQixDQUFDLFFBQW1DO1FBQ3RFLE9BQU8sUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbkUsdUZBQXVGO1FBQ3ZGLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQVEsQ0FDN0UsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFtQyxFQUFFLEVBQWdEO1FBQ25ILGlHQUFpRztRQUNqRyxxR0FBcUc7UUFDckcsT0FBTyxXQUFXLENBQUM7WUFDakIsR0FBRyxRQUFRO1lBQ1gsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsRUFBRTtvQkFBRSxPQUFPLFFBQVEsQ0FBQztpQkFBRTtnQkFDMUYsT0FBTyxXQUFXLENBQUM7b0JBQ2pCLEdBQUcsUUFBUTtvQkFDWCxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFO3dCQUM1RixJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7NEJBQUUsT0FBTyxhQUFhLENBQUM7eUJBQUU7d0JBQzFILE9BQU87NEJBQ0wsR0FBRyxhQUFhOzRCQUNoQixJQUFJLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUF1QyxDQUFDO3lCQUNoRSxDQUFDO29CQUNKLENBQUMsQ0FBQyxDQUFDO2lCQUN5QixDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDO1NBQ0gsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxpQkFBd0I7O0FBeE0xQiw0QkF5TUM7OztBQUlELFNBQVMsU0FBUyxDQUFPLEVBQWlDLEVBQUUsRUFBZTtJQUN6RSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUM7S0FBRTtJQUM5QixNQUFNLEdBQUcsR0FBa0MsRUFBRSxDQUFDO0lBQzlDLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEI7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBbUIsRUFBSztJQUMxQyxNQUFNLEdBQUcsR0FBUSxFQUFFLENBQUM7SUFDcEIsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDdkMsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDWjtLQUNGO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsTUFBb0M7SUFDM0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFJLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBqc29uc2NoZW1hIGZyb20gJ2pzb25zY2hlbWEnO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgKiBhcyBhc3NldHMgZnJvbSAnLi9hc3NldHMnO1xuaW1wb3J0ICogYXMgYXNzZW1ibHkgZnJvbSAnLi9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgKiBhcyBpbnRlZyBmcm9tICcuL2ludGVnLXRlc3RzJztcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuXG4vLyB0aGlzIHByZWZpeCBpcyB1c2VkIGJ5IHRoZSBDTEkgdG8gaWRlbnRpZnkgdGhpcyBzcGVjaWZpYyBlcnJvci5cbi8vIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBpbnN0cnVjdCB0aGUgdXNlciB0byB1cGdyYWRlIGhpcyBDTEkuXG4vLyBzZWUgZXhlYy50cyNjcmVhdGVBc3NlbWJseVxuZXhwb3J0IGNvbnN0IFZFUlNJT05fTUlTTUFUQ0g6IHN0cmluZyA9ICdDbG91ZCBhc3NlbWJseSBzY2hlbWEgdmVyc2lvbiBtaXNtYXRjaCc7XG5cbmNvbnN0IEFTU0VUU19TQ0hFTUEgPSByZXF1aXJlKCcuLi9zY2hlbWEvYXNzZXRzLnNjaGVtYS5qc29uJyk7XG5cbmNvbnN0IEFTU0VNQkxZX1NDSEVNQSA9IHJlcXVpcmUoJy4uL3NjaGVtYS9jbG91ZC1hc3NlbWJseS5zY2hlbWEuanNvbicpO1xuXG4vKipcbiAqIFZlcnNpb24gaXMgc2hhcmVkIGZvciBib3RoIG1hbmlmZXN0c1xuICovXG5jb25zdCBTQ0hFTUFfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL3NjaGVtYS9jbG91ZC1hc3NlbWJseS52ZXJzaW9uLmpzb24nKS52ZXJzaW9uO1xuXG5jb25zdCBJTlRFR19TQ0hFTUEgPSByZXF1aXJlKCcuLi9zY2hlbWEvaW50ZWcuc2NoZW1hLmpzb24nKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgbG9hZE1hbmlmZXN0IG9wZXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRNYW5pZmVzdE9wdGlvbnMge1xuICAvKipcbiAgICogU2tpcCB0aGUgdmVyc2lvbiBjaGVja1xuICAgKlxuICAgKiBUaGlzIG1lYW5zIHlvdSBtYXkgcmVhZCBhIG5ld2VyIGNsb3VkIGFzc2VtYmx5IHRoYW4gdGhlIENYIEFQSSBpcyBkZXNpZ25lZFxuICAgKiB0byBzdXBwb3J0LCBhbmQgeW91ciBhcHBsaWNhdGlvbiBtYXkgbm90IGJlIGF3YXJlIG9mIGFsbCBmZWF0dXJlcyB0aGF0IGluIHVzZVxuICAgKiBpbiB0aGUgQ2xvdWQgQXNzZW1ibHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBza2lwVmVyc2lvbkNoZWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2tpcCBlbnVtIGNoZWNrc1xuICAgKlxuICAgKiBUaGlzIG1lYW5zIHlvdSBtYXkgcmVhZCBlbnVtIHZhbHVlcyB5b3UgZG9uJ3Qga25vdyBhYm91dCB5ZXQuIE1ha2Ugc3VyZSB0byBhbHdheXNcbiAgICogY2hlY2sgdGhlIHZhbHVlcyBvZiBlbnVtcyB5b3UgZW5jb3VudGVyIGluIHRoZSBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBFbnVtQ2hlY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUb3BvbG9naWNhbGx5IHNvcnQgYWxsIGFydGlmYWN0c1xuICAgKlxuICAgKiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHJlc3BlY3RlZCBieSB0aGUgY29uc3RydWN0b3Igb2YgYENsb3VkQXNzZW1ibHlgLiBUaGVcbiAgICogcHJvcGVydHkgbGl2ZXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdG9wb1NvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3RvY29sIHV0aWxpdHkgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIHNhdmVzIHRoZSBjbG91ZCBhc3NlbWJseSBtYW5pZmVzdCB0byBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gbWFuaWZlc3QgLSBtYW5pZmVzdC5cbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gb3V0cHV0IGZpbGUgcGF0aC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2F2ZUFzc2VtYmx5TWFuaWZlc3QobWFuaWZlc3Q6IGFzc2VtYmx5LkFzc2VtYmx5TWFuaWZlc3QsIGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBNYW5pZmVzdC5zYXZlTWFuaWZlc3QobWFuaWZlc3QsIGZpbGVQYXRoLCBBU1NFTUJMWV9TQ0hFTUEsIE1hbmlmZXN0LnBhdGNoU3RhY2tUYWdzT25Xcml0ZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbmQgdmFsaWRhdGVzIHRoZSBjbG91ZCBhc3NlbWJseSBtYW5pZmVzdCBmcm9tIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIHBhdGggdG8gdGhlIG1hbmlmZXN0IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxvYWRBc3NlbWJseU1hbmlmZXN0KGZpbGVQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBMb2FkTWFuaWZlc3RPcHRpb25zKTogYXNzZW1ibHkuQXNzZW1ibHlNYW5pZmVzdCB7XG4gICAgcmV0dXJuIE1hbmlmZXN0LmxvYWRNYW5pZmVzdChmaWxlUGF0aCwgQVNTRU1CTFlfU0NIRU1BLCBNYW5pZmVzdC5wYXRjaFN0YWNrVGFnc09uUmVhZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBzYXZlcyB0aGUgYXNzZXQgbWFuaWZlc3QgdG8gZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIG1hbmlmZXN0IC0gbWFuaWZlc3QuXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIG91dHB1dCBmaWxlIHBhdGguXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNhdmVBc3NldE1hbmlmZXN0KG1hbmlmZXN0OiBhc3NldHMuQXNzZXRNYW5pZmVzdCwgZmlsZVBhdGg6IHN0cmluZykge1xuICAgIE1hbmlmZXN0LnNhdmVNYW5pZmVzdChtYW5pZmVzdCwgZmlsZVBhdGgsIEFTU0VUU19TQ0hFTUEsIE1hbmlmZXN0LnBhdGNoU3RhY2tUYWdzT25SZWFkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuZCB2YWxpZGF0ZXMgdGhlIGFzc2V0IG1hbmlmZXN0IGZyb20gZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gcGF0aCB0byB0aGUgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbG9hZEFzc2V0TWFuaWZlc3QoZmlsZVBhdGg6IHN0cmluZyk6IGFzc2V0cy5Bc3NldE1hbmlmZXN0IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkTWFuaWZlc3QoZmlsZVBhdGgsIEFTU0VUU19TQ0hFTUEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbmQgc2F2ZXMgdGhlIGludGVnIG1hbmlmZXN0IHRvIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBtYW5pZmVzdCAtIG1hbmlmZXN0LlxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBvdXRwdXQgZmlsZSBwYXRoLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzYXZlSW50ZWdNYW5pZmVzdChtYW5pZmVzdDogaW50ZWcuSW50ZWdNYW5pZmVzdCwgZmlsZVBhdGg6IHN0cmluZykge1xuICAgIE1hbmlmZXN0LnNhdmVNYW5pZmVzdChtYW5pZmVzdCwgZmlsZVBhdGgsIElOVEVHX1NDSEVNQSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbmQgdmFsaWRhdGVzIHRoZSBpbnRlZyBtYW5pZmVzdCBmcm9tIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIHBhdGggdG8gdGhlIG1hbmlmZXN0IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxvYWRJbnRlZ01hbmlmZXN0KGZpbGVQYXRoOiBzdHJpbmcpOiBpbnRlZy5JbnRlZ01hbmlmZXN0IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkTWFuaWZlc3QoZmlsZVBhdGgsIElOVEVHX1NDSEVNQSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGN1cnJlbnQgc2NoZW1hIHZlcnNpb24gbnVtYmVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNDSEVNQV9WRVJTSU9OO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWRcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBzYXZlQXNzZW1ibHlNYW5pZmVzdCgpYFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzYXZlKG1hbmlmZXN0OiBhc3NlbWJseS5Bc3NlbWJseU1hbmlmZXN0LCBmaWxlUGF0aDogc3RyaW5nKSB7IHJldHVybiB0aGlzLnNhdmVBc3NlbWJseU1hbmlmZXN0KG1hbmlmZXN0LCBmaWxlUGF0aCk7IH1cblxuICAvKipcbiAgICogRGVwcmVjYXRlZFxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYGxvYWRBc3NlbWJseU1hbmlmZXN0KClgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxvYWQoZmlsZVBhdGg6IHN0cmluZyk6IGFzc2VtYmx5LkFzc2VtYmx5TWFuaWZlc3QgeyByZXR1cm4gdGhpcy5sb2FkQXNzZW1ibHlNYW5pZmVzdChmaWxlUGF0aCk7IH1cblxuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZShtYW5pZmVzdDogeyB2ZXJzaW9uOiBzdHJpbmcgfSwgc2NoZW1hOiBqc29uc2NoZW1hLlNjaGVtYSwgb3B0aW9ucz86IExvYWRNYW5pZmVzdE9wdGlvbnMpIHtcbiAgICBmdW5jdGlvbiBwYXJzZVZlcnNpb24odmVyc2lvbjogc3RyaW5nKSB7XG4gICAgICBjb25zdCB2ZXIgPSBzZW12ZXIudmFsaWQodmVyc2lvbik7XG4gICAgICBpZiAoIXZlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2VtdmVyIHN0cmluZzogXCIke3ZlcnNpb259XCJgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2ZXI7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4U3VwcG9ydGVkID0gcGFyc2VWZXJzaW9uKE1hbmlmZXN0LnZlcnNpb24oKSk7XG4gICAgY29uc3QgYWN0dWFsID0gcGFyc2VWZXJzaW9uKG1hbmlmZXN0LnZlcnNpb24pO1xuXG4gICAgLy8gZmlyc3QgdmFsaWRhdGUgdGhlIHZlcnNpb24gc2hvdWxkIGJlIGFjY2VwdGVkLlxuICAgIGlmIChzZW12ZXIuZ3QoYWN0dWFsLCBtYXhTdXBwb3J0ZWQpICYmICFvcHRpb25zPy5za2lwVmVyc2lvbkNoZWNrKSB7XG4gICAgICAvLyB3ZSB1c2UgYSB3ZWxsIGtub3duIGVycm9yIHByZWZpeCBzbyB0aGF0IHRoZSBDTEkgY2FuIGlkZW50aWZ5IHRoaXMgc3BlY2lmaWMgZXJyb3JcbiAgICAgIC8vIGFuZCBwcmludCBzb21lIG1vcmUgY29udGV4dCB0byB0aGUgdXNlci5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtWRVJTSU9OX01JU01BVENIfTogTWF4aW11bSBzY2hlbWEgdmVyc2lvbiBzdXBwb3J0ZWQgaXMgJHttYXhTdXBwb3J0ZWR9LCBidXQgZm91bmQgJHthY3R1YWx9YCk7XG4gICAgfVxuXG4gICAgLy8gbm93IHZhbGlkYXRlIHRoZSBmb3JtYXQgaXMgZ29vZC5cbiAgICBjb25zdCB2YWxpZGF0b3IgPSBuZXcganNvbnNjaGVtYS5WYWxpZGF0b3IoKTtcbiAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0b3IudmFsaWRhdGUobWFuaWZlc3QsIHNjaGVtYSwge1xuXG4gICAgICAvLyBkb2VzIGV4aXN0IGJ1dCBpcyBub3QgaW4gdGhlIFR5cGVTY3JpcHQgZGVmaW5pdGlvbnNcbiAgICAgIG5lc3RlZEVycm9yczogdHJ1ZSxcblxuICAgICAgYWxsb3dVbmtub3duQXR0cmlidXRlczogZmFsc2UsXG5cbiAgICB9IGFzIGFueSk7XG5cbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0LmVycm9ycztcbiAgICBpZiAob3B0aW9ucz8uc2tpcEVudW1DaGVjaykge1xuICAgICAgLy8gRW51bSB2YWxpZGF0aW9ucyBhcmVuJ3QgdXNlZnVsIHdoZW5cbiAgICAgIGVycm9ycyA9IHN0cmlwRW51bUVycm9ycyhlcnJvcnMpO1xuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzc2VtYmx5IG1hbmlmZXN0OlxcbiR7ZXJyb3JzLm1hcChlID0+IGUuc3RhY2spLmpvaW4oJ1xcbicpfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNhdmVNYW5pZmVzdChtYW5pZmVzdDogYW55LCBmaWxlUGF0aDogc3RyaW5nLCBzY2hlbWE6IGpzb25zY2hlbWEuU2NoZW1hLCBwcmVwcm9jZXNzPzogKG9iajogYW55KSA9PiBhbnkpIHtcbiAgICBsZXQgd2l0aFZlcnNpb24gPSB7IC4uLm1hbmlmZXN0LCB2ZXJzaW9uOiBNYW5pZmVzdC52ZXJzaW9uKCkgfTtcbiAgICBNYW5pZmVzdC52YWxpZGF0ZSh3aXRoVmVyc2lvbiwgc2NoZW1hKTtcbiAgICBpZiAocHJlcHJvY2Vzcykge1xuICAgICAgd2l0aFZlcnNpb24gPSBwcmVwcm9jZXNzKHdpdGhWZXJzaW9uKTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkod2l0aFZlcnNpb24sIHVuZGVmaW5lZCwgMikpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbG9hZE1hbmlmZXN0KGZpbGVQYXRoOiBzdHJpbmcsIHNjaGVtYToganNvbnNjaGVtYS5TY2hlbWEsIHByZXByb2Nlc3M/OiAob2JqOiBhbnkpID0+IGFueSwgb3B0aW9ucz86IExvYWRNYW5pZmVzdE9wdGlvbnMpIHtcbiAgICBjb25zdCBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICBsZXQgb2JqO1xuICAgIHRyeSB7XG4gICAgICBvYmogPSBKU09OLnBhcnNlKGNvbnRlbnRzKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlLm1lc3NhZ2V9LCB3aGlsZSBwYXJzaW5nICR7SlNPTi5zdHJpbmdpZnkoY29udGVudHMpfWApO1xuICAgIH1cbiAgICBpZiAocHJlcHJvY2Vzcykge1xuICAgICAgb2JqID0gcHJlcHJvY2VzcyhvYmopO1xuICAgIH1cbiAgICBNYW5pZmVzdC52YWxpZGF0ZShvYmosIHNjaGVtYSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHJlcXVpcmVzIHNvbWUgZXhwbGFpbmluZy4uLlxuICAgKlxuICAgKiBXZSBwcmV2aW91c2x5IHVzZWQgYHsgS2V5LCBWYWx1ZSB9YCBmb3IgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBzdGFjayB0YWcuIChOb3RpY2UgdGhlIGNhc2luZylcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjEuMjcuMC9wYWNrYWdlcy9hd3MtY2RrL2xpYi9hcGkvY3hhcHAvc3RhY2tzLnRzI0w0MjcuXG4gICAqXG4gICAqIFdoZW4gdGhhdCBvYmplY3QgbW92ZWQgdG8gdGhpcyBwYWNrYWdlLCBpdCBoYWQgdG8gYmUgSlNJSSBjb21wbGlhbnQsIHdoaWNoIG1lYW50IHRoZSBwcm9wZXJ0eVxuICAgKiBuYW1lcyBtdXN0IGJlIGBjYW1lbENhc2VkYCwgYW5kIG5vdCBgUGFzY2FsQ2FzZWRgLiBUaGlzIG1lYW50IGl0IG5vIGxvbmdlciBtYXRjaGVzIHRoZSBzdHJ1Y3R1cmUgaW4gdGhlIGBtYW5pZmVzdC5qc29uYCBmaWxlLlxuICAgKiBJbiBvcmRlciB0byBzdXBwb3J0IGN1cnJlbnQgbWFuaWZlc3QgZmlsZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZSBgUGFzY2FsQ2FzZWRgIHJlcHJlc2VudGF0aW9uIHRvIHRoZSBuZXcgYGNhbWVsQ2FzZWRgIG9uZS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBzZXJpYWxpemF0aW9uIGl0c2VsZiBzdGlsbCB3cml0ZXMgYFBhc2NhbENhc2VkYCBiZWNhdXNlIGl0IHJlbGF0ZXMgdG8gaG93IENsb3VkRm9ybWF0aW9uIGV4cGVjdHMgaXQuXG4gICAqXG4gICAqIElkZWFsbHksIHdlIHdvdWxkIHN0YXJ0IHdyaXRpbmcgdGhlIGBjYW1lbENhc2VkYCBhbmQgdHJhbnNsYXRlIHRvIGhvdyBDbG91ZEZvcm1hdGlvbiBleHBlY3RzIGl0IHdoZW4gbmVlZGVkLiBCdXQgdGhpcyByZXF1aXJlcyBuYXN0eVxuICAgKiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBjb2RlIGFuZCBpdCBqdXN0IGRvZXNuJ3Qgc2VlbSB0byBiZSB3b3J0aCB0aGUgZWZmb3J0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGF0Y2hTdGFja1RhZ3NPblJlYWQobWFuaWZlc3Q6IGFzc2VtYmx5LkFzc2VtYmx5TWFuaWZlc3QpIHtcbiAgICByZXR1cm4gTWFuaWZlc3QucmVwbGFjZVN0YWNrVGFncyhtYW5pZmVzdCwgdGFncyA9PiB0YWdzLm1hcCgoZGlza1RhZzogYW55KSA9PiAoe1xuICAgICAga2V5OiBkaXNrVGFnLktleSxcbiAgICAgIHZhbHVlOiBkaXNrVGFnLlZhbHVlLFxuICAgIH0pKSk7XG4gIH1cblxuICAvKipcbiAgICogU2VlIGV4cGxhbmF0aW9uIG9uIGBwYXRjaFN0YWNrVGFnc09uUmVhZGBcbiAgICpcbiAgICogVHJhbnNsYXRlIHN0YWNrIHRhZ3MgbWV0YWRhdGEgaWYgaXQgaGFzIHRoZSBcInJpZ2h0XCIgY2FzaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGF0Y2hTdGFja1RhZ3NPbldyaXRlKG1hbmlmZXN0OiBhc3NlbWJseS5Bc3NlbWJseU1hbmlmZXN0KSB7XG4gICAgcmV0dXJuIE1hbmlmZXN0LnJlcGxhY2VTdGFja1RhZ3MobWFuaWZlc3QsIHRhZ3MgPT4gdGFncy5tYXAobWVtVGFnID0+XG4gICAgICAvLyBNaWdodCBhbHJlYWR5IGJlIHVwcGVyY2FzZWQgKGJlY2F1c2Ugc3RhY2sgc3ludGhlc2lzIGdlbmVyYXRlcyBpdCBpbiBmaW5hbCBmb3JtIHlldClcbiAgICAgICgnS2V5JyBpbiBtZW1UYWcgPyBtZW1UYWcgOiB7IEtleTogbWVtVGFnLmtleSwgVmFsdWU6IG1lbVRhZy52YWx1ZSB9KSBhcyBhbnksXG4gICAgKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgcmVwbGFjZSBzdGFjayB0YWdzIGluIHRoZSBzdGFjayBtZXRhZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVwbGFjZVN0YWNrVGFncyhtYW5pZmVzdDogYXNzZW1ibHkuQXNzZW1ibHlNYW5pZmVzdCwgZm46IEVuZG9mdW5jdG9yPGFzc2VtYmx5LlN0YWNrVGFnc01ldGFkYXRhRW50cnk+KTogYXNzZW1ibHkuQXNzZW1ibHlNYW5pZmVzdCB7XG4gICAgLy8gTmVlZCB0byBhZGQgaW4gdGhlIGBub1VuZGVmaW5lZGBzIGJlY2F1c2Ugb3RoZXJ3aXNlIGplc3Qgc25hcHNob3QgdGVzdHMgYXJlIGdvaW5nIHRvIGZyZWFrIG91dFxuICAgIC8vIGFib3V0IHRoZSBrZXlzIHdpdGggdmFsdWVzIHRoYXQgYXJlIGB1bmRlZmluZWRgIChldmVuIHRob3VnaCB0aGV5IHdvdWxkIG5ldmVyIGJlIEpTT04uc3RyaW5naWZpZWQpXG4gICAgcmV0dXJuIG5vVW5kZWZpbmVkKHtcbiAgICAgIC4uLm1hbmlmZXN0LFxuICAgICAgYXJ0aWZhY3RzOiBtYXBWYWx1ZXMobWFuaWZlc3QuYXJ0aWZhY3RzLCBhcnRpZmFjdCA9PiB7XG4gICAgICAgIGlmIChhcnRpZmFjdC50eXBlICE9PSBhc3NlbWJseS5BcnRpZmFjdFR5cGUuQVdTX0NMT1VERk9STUFUSU9OX1NUQUNLKSB7IHJldHVybiBhcnRpZmFjdDsgfVxuICAgICAgICByZXR1cm4gbm9VbmRlZmluZWQoe1xuICAgICAgICAgIC4uLmFydGlmYWN0LFxuICAgICAgICAgIG1ldGFkYXRhOiBtYXBWYWx1ZXMoYXJ0aWZhY3QubWV0YWRhdGEsIG1ldGFkYXRhRW50cmllcyA9PiBtZXRhZGF0YUVudHJpZXMubWFwKG1ldGFkYXRhRW50cnkgPT4ge1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhRW50cnkudHlwZSAhPT0gYXNzZW1ibHkuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5TVEFDS19UQUdTIHx8ICFtZXRhZGF0YUVudHJ5LmRhdGEpIHsgcmV0dXJuIG1ldGFkYXRhRW50cnk7IH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLm1ldGFkYXRhRW50cnksXG4gICAgICAgICAgICAgIGRhdGE6IGZuKG1ldGFkYXRhRW50cnkuZGF0YSBhcyBhc3NlbWJseS5TdGFja1RhZ3NNZXRhZGF0YUVudHJ5KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkpLFxuICAgICAgICB9IGFzIGFzc2VtYmx5LkFydGlmYWN0TWFuaWZlc3QpO1xuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cblxudHlwZSBFbmRvZnVuY3RvcjxBPiA9ICh4OiBBKSA9PiBBO1xuXG5mdW5jdGlvbiBtYXBWYWx1ZXM8QSwgQj4oeHM6IFJlY29yZDxzdHJpbmcsIEE+IHwgdW5kZWZpbmVkLCBmbjogKHg6IEEpID0+IEIpOiBSZWNvcmQ8c3RyaW5nLCBCPiB8IHVuZGVmaW5lZCB7XG4gIGlmICgheHMpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXQ6IFJlY29yZDxzdHJpbmcsIEI+IHwgdW5kZWZpbmVkID0ge307XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHhzKSkge1xuICAgIHJldFtrXSA9IGZuKHYpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG5vVW5kZWZpbmVkPEEgZXh0ZW5kcyBvYmplY3Q+KHhzOiBBKTogQSB7XG4gIGNvbnN0IHJldDogYW55ID0ge307XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHhzKSkge1xuICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldFtrXSA9IHY7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHN0cmlwRW51bUVycm9ycyhlcnJvcnM6IGpzb25zY2hlbWEuVmFsaWRhdGlvbkVycm9yW10pIHtcbiAgcmV0dXJuIGVycm9ycy5maWx0ZXIoZSA9PiB0eXBlb2YgZS5zY2hlbWEgPT09J3N0cmluZycgfHwgISgnZW51bScgaW4gZS5zY2hlbWEpKTtcbn1cbiJdfQ==","'use strict';\n\nvar helpers = require('./helpers');\n\n/** @type ValidatorResult */\nvar ValidatorResult = helpers.ValidatorResult;\n/** @type SchemaError */\nvar SchemaError = helpers.SchemaError;\n\nvar attribute = {};\n\nattribute.ignoreProperties = {\n // informative properties\n 'id': true,\n 'default': true,\n 'description': true,\n 'title': true,\n // arguments to other properties\n 'additionalItems': true,\n 'then': true,\n 'else': true,\n // special-handled properties\n '$schema': true,\n '$ref': true,\n 'extends': true,\n};\n\n/**\n * @name validators\n */\nvar validators = attribute.validators = {};\n\n/**\n * Validates whether the instance if of a certain type\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {ValidatorResult|null}\n */\nvalidators.type = function validateType (instance, schema, options, ctx) {\n // Ignore undefined instances\n if (instance === undefined) {\n return null;\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n var types = Array.isArray(schema.type) ? schema.type : [schema.type];\n if (!types.some(this.testType.bind(this, instance, schema, options, ctx))) {\n var list = types.map(function (v) {\n if(!v) return;\n var id = v.$id || v.id;\n return id ? ('<' + id + '>') : (v+'');\n });\n result.addError({\n name: 'type',\n argument: list,\n message: \"is not of a type(s) \" + list,\n });\n }\n return result;\n};\n\nfunction testSchemaNoThrow(instance, options, ctx, callback, schema){\n var throwError = options.throwError;\n var throwAll = options.throwAll;\n options.throwError = false;\n options.throwAll = false;\n var res = this.validateSchema(instance, schema, options, ctx);\n options.throwError = throwError;\n options.throwAll = throwAll;\n\n if (!res.valid && callback instanceof Function) {\n callback(res);\n }\n return res.valid;\n}\n\n/**\n * Validates whether the instance matches some of the given schemas\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {ValidatorResult|null}\n */\nvalidators.anyOf = function validateAnyOf (instance, schema, options, ctx) {\n // Ignore undefined instances\n if (instance === undefined) {\n return null;\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n var inner = new ValidatorResult(instance, schema, options, ctx);\n if (!Array.isArray(schema.anyOf)){\n throw new SchemaError(\"anyOf must be an array\");\n }\n if (!schema.anyOf.some(\n testSchemaNoThrow.bind(\n this, instance, options, ctx, function(res){inner.importErrors(res);}\n ))) {\n var list = schema.anyOf.map(function (v, i) {\n var id = v.$id || v.id;\n if(id) return '<' + id + '>';\n return(v.title && JSON.stringify(v.title)) || (v['$ref'] && ('<' + v['$ref'] + '>')) || '[subschema '+i+']';\n });\n if (options.nestedErrors) {\n result.importErrors(inner);\n }\n result.addError({\n name: 'anyOf',\n argument: list,\n message: \"is not any of \" + list.join(','),\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance matches every given schema\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null}\n */\nvalidators.allOf = function validateAllOf (instance, schema, options, ctx) {\n // Ignore undefined instances\n if (instance === undefined) {\n return null;\n }\n if (!Array.isArray(schema.allOf)){\n throw new SchemaError(\"allOf must be an array\");\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n var self = this;\n schema.allOf.forEach(function(v, i){\n var valid = self.validateSchema(instance, v, options, ctx);\n if(!valid.valid){\n var id = v.$id || v.id;\n var msg = id || (v.title && JSON.stringify(v.title)) || (v['$ref'] && ('<' + v['$ref'] + '>')) || '[subschema '+i+']';\n result.addError({\n name: 'allOf',\n argument: { id: msg, length: valid.errors.length, valid: valid },\n message: 'does not match allOf schema ' + msg + ' with ' + valid.errors.length + ' error[s]:',\n });\n result.importErrors(valid);\n }\n });\n return result;\n};\n\n/**\n * Validates whether the instance matches exactly one of the given schemas\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null}\n */\nvalidators.oneOf = function validateOneOf (instance, schema, options, ctx) {\n // Ignore undefined instances\n if (instance === undefined) {\n return null;\n }\n if (!Array.isArray(schema.oneOf)){\n throw new SchemaError(\"oneOf must be an array\");\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n var inner = new ValidatorResult(instance, schema, options, ctx);\n var count = schema.oneOf.filter(\n testSchemaNoThrow.bind(\n this, instance, options, ctx, function(res) {inner.importErrors(res);}\n ) ).length;\n var list = schema.oneOf.map(function (v, i) {\n var id = v.$id || v.id;\n return id || (v.title && JSON.stringify(v.title)) || (v['$ref'] && ('<' + v['$ref'] + '>')) || '[subschema '+i+']';\n });\n if (count!==1) {\n if (options.nestedErrors) {\n result.importErrors(inner);\n }\n result.addError({\n name: 'oneOf',\n argument: list,\n message: \"is not exactly one from \" + list.join(','),\n });\n }\n return result;\n};\n\n/**\n * Validates \"then\" or \"else\" depending on the result of validating \"if\"\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null}\n */\nvalidators.if = function validateIf (instance, schema, options, ctx) {\n // Ignore undefined instances\n if (instance === undefined) return null;\n if (!helpers.isSchema(schema.if)) throw new Error('Expected \"if\" keyword to be a schema');\n var ifValid = testSchemaNoThrow.call(this, instance, options, ctx, null, schema.if);\n var result = new ValidatorResult(instance, schema, options, ctx);\n var res;\n if(ifValid){\n if (schema.then === undefined) return;\n if (!helpers.isSchema(schema.then)) throw new Error('Expected \"then\" keyword to be a schema');\n res = this.validateSchema(instance, schema.then, options, ctx.makeChild(schema.then));\n result.importErrors(res);\n }else{\n if (schema.else === undefined) return;\n if (!helpers.isSchema(schema.else)) throw new Error('Expected \"else\" keyword to be a schema');\n res = this.validateSchema(instance, schema.else, options, ctx.makeChild(schema.else));\n result.importErrors(res);\n }\n return result;\n};\n\nfunction getEnumerableProperty(object, key){\n // Determine if `key` shows up in `for(var key in object)`\n // First test Object.hasOwnProperty.call as an optimization: that guarantees it does\n if(Object.hasOwnProperty.call(object, key)) return object[key];\n // Test `key in object` as an optimization; false means it won't\n if(!(key in object)) return;\n while( (object = Object.getPrototypeOf(object)) ){\n if(Object.propertyIsEnumerable.call(object, key)) return object[key];\n }\n}\n\n/**\n * Validates propertyNames\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.propertyNames = function validatePropertyNames (instance, schema, options, ctx) {\n if(!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var subschema = schema.propertyNames!==undefined ? schema.propertyNames : {};\n if(!helpers.isSchema(subschema)) throw new SchemaError('Expected \"propertyNames\" to be a schema (object or boolean)');\n\n for (var property in instance) {\n if(getEnumerableProperty(instance, property) !== undefined){\n var res = this.validateSchema(property, subschema, options, ctx.makeChild(subschema));\n result.importErrors(res);\n }\n }\n\n return result;\n};\n\n/**\n * Validates properties\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.properties = function validateProperties (instance, schema, options, ctx) {\n if(!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var properties = schema.properties || {};\n for (var property in properties) {\n var subschema = properties[property];\n if(subschema===undefined){\n continue;\n }else if(subschema===null){\n throw new SchemaError('Unexpected null, expected schema in \"properties\"');\n }\n if (typeof options.preValidateProperty == 'function') {\n options.preValidateProperty(instance, property, subschema, options, ctx);\n }\n var prop = getEnumerableProperty(instance, property);\n var res = this.validateSchema(prop, subschema, options, ctx.makeChild(subschema, property));\n if(res.instance !== result.instance[property]) result.instance[property] = res.instance;\n result.importErrors(res);\n }\n return result;\n};\n\n/**\n * Test a specific property within in instance against the additionalProperties schema attribute\n * This ignores properties with definitions in the properties schema attribute, but no other attributes.\n * If too many more types of property-existence tests pop up they may need their own class of tests (like `type` has)\n * @private\n * @return {boolean}\n */\nfunction testAdditionalProperty (instance, schema, options, ctx, property, result) {\n if(!this.types.object(instance)) return;\n if (schema.properties && schema.properties[property] !== undefined) {\n return;\n }\n if (schema.additionalProperties === false) {\n result.addError({\n name: 'additionalProperties',\n argument: property,\n message: \"is not allowed to have the additional property \" + JSON.stringify(property),\n });\n } else {\n var additionalProperties = schema.additionalProperties || {};\n\n if (typeof options.preValidateProperty == 'function') {\n options.preValidateProperty(instance, property, additionalProperties, options, ctx);\n }\n\n var res = this.validateSchema(instance[property], additionalProperties, options, ctx.makeChild(additionalProperties, property));\n if(res.instance !== result.instance[property]) result.instance[property] = res.instance;\n result.importErrors(res);\n }\n}\n\n/**\n * Validates patternProperties\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.patternProperties = function validatePatternProperties (instance, schema, options, ctx) {\n if(!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var patternProperties = schema.patternProperties || {};\n\n for (var property in instance) {\n var test = true;\n for (var pattern in patternProperties) {\n var subschema = patternProperties[pattern];\n if(subschema===undefined){\n continue;\n }else if(subschema===null){\n throw new SchemaError('Unexpected null, expected schema in \"patternProperties\"');\n }\n try {\n var regexp = new RegExp(pattern, 'u');\n } catch(_e) {\n // In the event the stricter handling causes an error, fall back on the forgiving handling\n // DEPRECATED\n regexp = new RegExp(pattern);\n }\n if (!regexp.test(property)) {\n continue;\n }\n test = false;\n\n if (typeof options.preValidateProperty == 'function') {\n options.preValidateProperty(instance, property, subschema, options, ctx);\n }\n\n var res = this.validateSchema(instance[property], subschema, options, ctx.makeChild(subschema, property));\n if(res.instance !== result.instance[property]) result.instance[property] = res.instance;\n result.importErrors(res);\n }\n if (test) {\n testAdditionalProperty.call(this, instance, schema, options, ctx, property, result);\n }\n }\n\n return result;\n};\n\n/**\n * Validates additionalProperties\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.additionalProperties = function validateAdditionalProperties (instance, schema, options, ctx) {\n if(!this.types.object(instance)) return;\n // if patternProperties is defined then we'll test when that one is called instead\n if (schema.patternProperties) {\n return null;\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n for (var property in instance) {\n testAdditionalProperty.call(this, instance, schema, options, ctx, property, result);\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is at least of a certain length, when the instance value is a string.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.minProperties = function validateMinProperties (instance, schema, options, ctx) {\n if (!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var keys = Object.keys(instance);\n if (!(keys.length >= schema.minProperties)) {\n result.addError({\n name: 'minProperties',\n argument: schema.minProperties,\n message: \"does not meet minimum property length of \" + schema.minProperties,\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is at most of a certain length, when the instance value is a string.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.maxProperties = function validateMaxProperties (instance, schema, options, ctx) {\n if (!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var keys = Object.keys(instance);\n if (!(keys.length <= schema.maxProperties)) {\n result.addError({\n name: 'maxProperties',\n argument: schema.maxProperties,\n message: \"does not meet maximum property length of \" + schema.maxProperties,\n });\n }\n return result;\n};\n\n/**\n * Validates items when instance is an array\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.items = function validateItems (instance, schema, options, ctx) {\n var self = this;\n if (!this.types.array(instance)) return;\n if (schema.items===undefined) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n instance.every(function (value, i) {\n if(Array.isArray(schema.items)){\n var items = schema.items[i]===undefined ? schema.additionalItems : schema.items[i];\n }else{\n var items = schema.items;\n }\n if (items === undefined) {\n return true;\n }\n if (items === false) {\n result.addError({\n name: 'items',\n message: \"additionalItems not permitted\",\n });\n return false;\n }\n var res = self.validateSchema(value, items, options, ctx.makeChild(items, i));\n if(res.instance !== result.instance[i]) result.instance[i] = res.instance;\n result.importErrors(res);\n return true;\n });\n return result;\n};\n\n/**\n * Validates the \"contains\" keyword\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.contains = function validateContains (instance, schema, options, ctx) {\n var self = this;\n if (!this.types.array(instance)) return;\n if (schema.contains===undefined) return;\n if (!helpers.isSchema(schema.contains)) throw new Error('Expected \"contains\" keyword to be a schema');\n var result = new ValidatorResult(instance, schema, options, ctx);\n var count = instance.some(function (value, i) {\n var res = self.validateSchema(value, schema.contains, options, ctx.makeChild(schema.contains, i));\n return res.errors.length===0;\n });\n if(count===false){\n result.addError({\n name: 'contains',\n argument: schema.contains,\n message: \"must contain an item matching given schema\",\n });\n }\n return result;\n};\n\n/**\n * Validates minimum and exclusiveMinimum when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.minimum = function validateMinimum (instance, schema, options, ctx) {\n if (!this.types.number(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (schema.exclusiveMinimum && schema.exclusiveMinimum === true) {\n if(!(instance > schema.minimum)){\n result.addError({\n name: 'minimum',\n argument: schema.minimum,\n message: \"must be greater than \" + schema.minimum,\n });\n }\n } else {\n if(!(instance >= schema.minimum)){\n result.addError({\n name: 'minimum',\n argument: schema.minimum,\n message: \"must be greater than or equal to \" + schema.minimum,\n });\n }\n }\n return result;\n};\n\n/**\n * Validates maximum and exclusiveMaximum when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.maximum = function validateMaximum (instance, schema, options, ctx) {\n if (!this.types.number(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (schema.exclusiveMaximum && schema.exclusiveMaximum === true) {\n if(!(instance < schema.maximum)){\n result.addError({\n name: 'maximum',\n argument: schema.maximum,\n message: \"must be less than \" + schema.maximum,\n });\n }\n } else {\n if(!(instance <= schema.maximum)){\n result.addError({\n name: 'maximum',\n argument: schema.maximum,\n message: \"must be less than or equal to \" + schema.maximum,\n });\n }\n }\n return result;\n};\n\n/**\n * Validates the number form of exclusiveMinimum when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.exclusiveMinimum = function validateExclusiveMinimum (instance, schema, options, ctx) {\n // Support the boolean form of exclusiveMinimum, which is handled by the \"minimum\" keyword.\n if(typeof schema.exclusiveMinimum === 'boolean') return;\n if (!this.types.number(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var valid = instance > schema.exclusiveMinimum;\n if (!valid) {\n result.addError({\n name: 'exclusiveMinimum',\n argument: schema.exclusiveMinimum,\n message: \"must be strictly greater than \" + schema.exclusiveMinimum,\n });\n }\n return result;\n};\n\n/**\n * Validates the number form of exclusiveMaximum when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.exclusiveMaximum = function validateExclusiveMaximum (instance, schema, options, ctx) {\n // Support the boolean form of exclusiveMaximum, which is handled by the \"maximum\" keyword.\n if(typeof schema.exclusiveMaximum === 'boolean') return;\n if (!this.types.number(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var valid = instance < schema.exclusiveMaximum;\n if (!valid) {\n result.addError({\n name: 'exclusiveMaximum',\n argument: schema.exclusiveMaximum,\n message: \"must be strictly less than \" + schema.exclusiveMaximum,\n });\n }\n return result;\n};\n\n/**\n * Perform validation for multipleOf and divisibleBy, which are essentially the same.\n * @param instance\n * @param schema\n * @param validationType\n * @param errorMessage\n * @returns {String|null}\n */\nvar validateMultipleOfOrDivisbleBy = function validateMultipleOfOrDivisbleBy (instance, schema, options, ctx, validationType, errorMessage) {\n if (!this.types.number(instance)) return;\n\n var validationArgument = schema[validationType];\n if (validationArgument == 0) {\n throw new SchemaError(validationType + \" cannot be zero\");\n }\n\n var result = new ValidatorResult(instance, schema, options, ctx);\n\n var instanceDecimals = helpers.getDecimalPlaces(instance);\n var divisorDecimals = helpers.getDecimalPlaces(validationArgument);\n\n var maxDecimals = Math.max(instanceDecimals , divisorDecimals);\n var multiplier = Math.pow(10, maxDecimals);\n\n if (Math.round(instance * multiplier) % Math.round(validationArgument * multiplier) !== 0) {\n result.addError({\n name: validationType,\n argument: validationArgument,\n message: errorMessage + JSON.stringify(validationArgument),\n });\n }\n\n return result;\n};\n\n/**\n * Validates divisibleBy when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.multipleOf = function validateMultipleOf (instance, schema, options, ctx) {\n return validateMultipleOfOrDivisbleBy.call(this, instance, schema, options, ctx, \"multipleOf\", \"is not a multiple of (divisible by) \");\n};\n\n/**\n * Validates multipleOf when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.divisibleBy = function validateDivisibleBy (instance, schema, options, ctx) {\n return validateMultipleOfOrDivisbleBy.call(this, instance, schema, options, ctx, \"divisibleBy\", \"is not divisible by (multiple of) \");\n};\n\n/**\n * Validates whether the instance value is present.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.required = function validateRequired (instance, schema, options, ctx) {\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (instance === undefined && schema.required === true) {\n // A boolean form is implemented for reverse-compatibility with schemas written against older drafts\n result.addError({\n name: 'required',\n message: \"is required\",\n });\n } else if (this.types.object(instance) && Array.isArray(schema.required)) {\n schema.required.forEach(function(n){\n if(getEnumerableProperty(instance, n)===undefined){\n result.addError({\n name: 'required',\n argument: n,\n message: \"requires property \" + JSON.stringify(n),\n });\n }\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance value matches the regular expression, when the instance value is a string.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.pattern = function validatePattern (instance, schema, options, ctx) {\n if (!this.types.string(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var pattern = schema.pattern;\n try {\n var regexp = new RegExp(pattern, 'u');\n } catch(_e) {\n // In the event the stricter handling causes an error, fall back on the forgiving handling\n // DEPRECATED\n regexp = new RegExp(pattern);\n }\n if (!instance.match(regexp)) {\n result.addError({\n name: 'pattern',\n argument: schema.pattern,\n message: \"does not match pattern \" + JSON.stringify(schema.pattern.toString()),\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is of a certain defined format or a custom\n * format.\n * The following formats are supported for string types:\n * - date-time\n * - date\n * - time\n * - ip-address\n * - ipv6\n * - uri\n * - color\n * - host-name\n * - alpha\n * - alpha-numeric\n * - utc-millisec\n * @param instance\n * @param schema\n * @param [options]\n * @param [ctx]\n * @return {String|null}\n */\nvalidators.format = function validateFormat (instance, schema, options, ctx) {\n if (instance===undefined) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!result.disableFormat && !helpers.isFormat(instance, schema.format, this)) {\n result.addError({\n name: 'format',\n argument: schema.format,\n message: \"does not conform to the \" + JSON.stringify(schema.format) + \" format\",\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is at least of a certain length, when the instance value is a string.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.minLength = function validateMinLength (instance, schema, options, ctx) {\n if (!this.types.string(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var hsp = instance.match(/[\\uDC00-\\uDFFF]/g);\n var length = instance.length - (hsp ? hsp.length : 0);\n if (!(length >= schema.minLength)) {\n result.addError({\n name: 'minLength',\n argument: schema.minLength,\n message: \"does not meet minimum length of \" + schema.minLength,\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is at most of a certain length, when the instance value is a string.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.maxLength = function validateMaxLength (instance, schema, options, ctx) {\n if (!this.types.string(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n // TODO if this was already computed in \"minLength\", use that value instead of re-computing\n var hsp = instance.match(/[\\uDC00-\\uDFFF]/g);\n var length = instance.length - (hsp ? hsp.length : 0);\n if (!(length <= schema.maxLength)) {\n result.addError({\n name: 'maxLength',\n argument: schema.maxLength,\n message: \"does not meet maximum length of \" + schema.maxLength,\n });\n }\n return result;\n};\n\n/**\n * Validates whether instance contains at least a minimum number of items, when the instance is an Array.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.minItems = function validateMinItems (instance, schema, options, ctx) {\n if (!this.types.array(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!(instance.length >= schema.minItems)) {\n result.addError({\n name: 'minItems',\n argument: schema.minItems,\n message: \"does not meet minimum length of \" + schema.minItems,\n });\n }\n return result;\n};\n\n/**\n * Validates whether instance contains no more than a maximum number of items, when the instance is an Array.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.maxItems = function validateMaxItems (instance, schema, options, ctx) {\n if (!this.types.array(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!(instance.length <= schema.maxItems)) {\n result.addError({\n name: 'maxItems',\n argument: schema.maxItems,\n message: \"does not meet maximum length of \" + schema.maxItems,\n });\n }\n return result;\n};\n\n/**\n * Deep compares arrays for duplicates\n * @param v\n * @param i\n * @param a\n * @private\n * @return {boolean}\n */\nfunction testArrays (v, i, a) {\n var j, len = a.length;\n for (j = i + 1, len; j < len; j++) {\n if (helpers.deepCompareStrict(v, a[j])) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Validates whether there are no duplicates, when the instance is an Array.\n * @param instance\n * @return {String|null}\n */\nvalidators.uniqueItems = function validateUniqueItems (instance, schema, options, ctx) {\n if (schema.uniqueItems!==true) return;\n if (!this.types.array(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!instance.every(testArrays)) {\n result.addError({\n name: 'uniqueItems',\n message: \"contains duplicate item\",\n });\n }\n return result;\n};\n\n/**\n * Validate for the presence of dependency properties, if the instance is an object.\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {null|ValidatorResult}\n */\nvalidators.dependencies = function validateDependencies (instance, schema, options, ctx) {\n if (!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n for (var property in schema.dependencies) {\n if (instance[property] === undefined) {\n continue;\n }\n var dep = schema.dependencies[property];\n var childContext = ctx.makeChild(dep, property);\n if (typeof dep == 'string') {\n dep = [dep];\n }\n if (Array.isArray(dep)) {\n dep.forEach(function (prop) {\n if (instance[prop] === undefined) {\n result.addError({\n // FIXME there's two different \"dependencies\" errors here with slightly different outputs\n // Can we make these the same? Or should we create different error types?\n name: 'dependencies',\n argument: childContext.propertyPath,\n message: \"property \" + prop + \" not found, required by \" + childContext.propertyPath,\n });\n }\n });\n } else {\n var res = this.validateSchema(instance, dep, options, childContext);\n if(result.instance !== res.instance) result.instance = res.instance;\n if (res && res.errors.length) {\n result.addError({\n name: 'dependencies',\n argument: childContext.propertyPath,\n message: \"does not meet dependency required by \" + childContext.propertyPath,\n });\n result.importErrors(res);\n }\n }\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is one of the enumerated values.\n *\n * @param instance\n * @param schema\n * @return {ValidatorResult|null}\n */\nvalidators['enum'] = function validateEnum (instance, schema, options, ctx) {\n if (instance === undefined) {\n return null;\n }\n if (!Array.isArray(schema['enum'])) {\n throw new SchemaError(\"enum expects an array\", schema);\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!schema['enum'].some(helpers.deepCompareStrict.bind(null, instance))) {\n result.addError({\n name: 'enum',\n argument: schema['enum'],\n message: \"is not one of enum values: \" + schema['enum'].map(String).join(','),\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance exactly matches a given value\n *\n * @param instance\n * @param schema\n * @return {ValidatorResult|null}\n */\nvalidators['const'] = function validateEnum (instance, schema, options, ctx) {\n if (instance === undefined) {\n return null;\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!helpers.deepCompareStrict(schema['const'], instance)) {\n result.addError({\n name: 'const',\n argument: schema['const'],\n message: \"does not exactly match expected constant: \" + schema['const'],\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance if of a prohibited type.\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {null|ValidatorResult}\n */\nvalidators.not = validators.disallow = function validateNot (instance, schema, options, ctx) {\n var self = this;\n if(instance===undefined) return null;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var notTypes = schema.not || schema.disallow;\n if(!notTypes) return null;\n if(!Array.isArray(notTypes)) notTypes=[notTypes];\n notTypes.forEach(function (type) {\n if (self.testType(instance, schema, options, ctx, type)) {\n var id = type && (type.$id || type.id);\n var schemaId = id || type;\n result.addError({\n name: 'not',\n argument: schemaId,\n message: \"is of prohibited type \" + schemaId,\n });\n }\n });\n return result;\n};\n\nmodule.exports = attribute;\n","'use strict';\n\nvar uri = require('url');\n\nvar ValidationError = exports.ValidationError = function ValidationError (message, instance, schema, path, name, argument) {\n if(Array.isArray(path)){\n this.path = path;\n this.property = path.reduce(function(sum, item){\n return sum + makeSuffix(item);\n }, 'instance');\n }else if(path !== undefined){\n this.property = path;\n }\n if (message) {\n this.message = message;\n }\n if (schema) {\n var id = schema.$id || schema.id;\n this.schema = id || schema;\n }\n if (instance !== undefined) {\n this.instance = instance;\n }\n this.name = name;\n this.argument = argument;\n this.stack = this.toString();\n};\n\nValidationError.prototype.toString = function toString() {\n return this.property + ' ' + this.message;\n};\n\nvar ValidatorResult = exports.ValidatorResult = function ValidatorResult(instance, schema, options, ctx) {\n this.instance = instance;\n this.schema = schema;\n this.options = options;\n this.path = ctx.path;\n this.propertyPath = ctx.propertyPath;\n this.errors = [];\n this.throwError = options && options.throwError;\n this.throwFirst = options && options.throwFirst;\n this.throwAll = options && options.throwAll;\n this.disableFormat = options && options.disableFormat === true;\n};\n\nValidatorResult.prototype.addError = function addError(detail) {\n var err;\n if (typeof detail == 'string') {\n err = new ValidationError(detail, this.instance, this.schema, this.path);\n } else {\n if (!detail) throw new Error('Missing error detail');\n if (!detail.message) throw new Error('Missing error message');\n if (!detail.name) throw new Error('Missing validator type');\n err = new ValidationError(detail.message, this.instance, this.schema, this.path, detail.name, detail.argument);\n }\n\n this.errors.push(err);\n if (this.throwFirst) {\n throw new ValidatorResultError(this);\n }else if(this.throwError){\n throw err;\n }\n return err;\n};\n\nValidatorResult.prototype.importErrors = function importErrors(res) {\n if (typeof res == 'string' || (res && res.validatorType)) {\n this.addError(res);\n } else if (res && res.errors) {\n this.errors = this.errors.concat(res.errors);\n }\n};\n\nfunction stringizer (v,i){\n return i+': '+v.toString()+'\\n';\n}\nValidatorResult.prototype.toString = function toString(res) {\n return this.errors.map(stringizer).join('');\n};\n\nObject.defineProperty(ValidatorResult.prototype, \"valid\", { get: function() {\n return !this.errors.length;\n} });\n\nmodule.exports.ValidatorResultError = ValidatorResultError;\nfunction ValidatorResultError(result) {\n if(Error.captureStackTrace){\n Error.captureStackTrace(this, ValidatorResultError);\n }\n this.instance = result.instance;\n this.schema = result.schema;\n this.options = result.options;\n this.errors = result.errors;\n}\nValidatorResultError.prototype = new Error();\nValidatorResultError.prototype.constructor = ValidatorResultError;\nValidatorResultError.prototype.name = \"Validation Error\";\n\n/**\n * Describes a problem with a Schema which prevents validation of an instance\n * @name SchemaError\n * @constructor\n */\nvar SchemaError = exports.SchemaError = function SchemaError (msg, schema) {\n this.message = msg;\n this.schema = schema;\n Error.call(this, msg);\n Error.captureStackTrace(this, SchemaError);\n};\nSchemaError.prototype = Object.create(Error.prototype,\n {\n constructor: {value: SchemaError, enumerable: false},\n name: {value: 'SchemaError', enumerable: false},\n });\n\nvar SchemaContext = exports.SchemaContext = function SchemaContext (schema, options, path, base, schemas) {\n this.schema = schema;\n this.options = options;\n if(Array.isArray(path)){\n this.path = path;\n this.propertyPath = path.reduce(function(sum, item){\n return sum + makeSuffix(item);\n }, 'instance');\n }else{\n this.propertyPath = path;\n }\n this.base = base;\n this.schemas = schemas;\n};\n\nSchemaContext.prototype.resolve = function resolve (target) {\n return uri.resolve(this.base, target);\n};\n\nSchemaContext.prototype.makeChild = function makeChild(schema, propertyName){\n var path = (propertyName===undefined) ? this.path : this.path.concat([propertyName]);\n var id = schema.$id || schema.id;\n var base = uri.resolve(this.base, id||'');\n var ctx = new SchemaContext(schema, this.options, path, base, Object.create(this.schemas));\n if(id && !ctx.schemas[base]){\n ctx.schemas[base] = schema;\n }\n return ctx;\n};\n\nvar FORMAT_REGEXPS = exports.FORMAT_REGEXPS = {\n // 7.3.1. Dates, Times, and Duration\n 'date-time': /^\\d{4}-(?:0[0-9]{1}|1[0-2]{1})-(3[01]|0[1-9]|[12][0-9])[tT ](2[0-4]|[01][0-9]):([0-5][0-9]):(60|[0-5][0-9])(\\.\\d+)?([zZ]|[+-]([0-5][0-9]):(60|[0-5][0-9]))$/,\n 'date': /^\\d{4}-(?:0[0-9]{1}|1[0-2]{1})-(3[01]|0[1-9]|[12][0-9])$/,\n 'time': /^(2[0-4]|[01][0-9]):([0-5][0-9]):(60|[0-5][0-9])$/,\n 'duration': /P(T\\d+(H(\\d+M(\\d+S)?)?|M(\\d+S)?|S)|\\d+(D|M(\\d+D)?|Y(\\d+M(\\d+D)?)?)(T\\d+(H(\\d+M(\\d+S)?)?|M(\\d+S)?|S))?|\\d+W)/i,\n\n // 7.3.2. Email Addresses\n // TODO: fix the email production\n 'email': /^(?:[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+\\.)*[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!\\.)){0,61}[a-zA-Z0-9]?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\\[(?:(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\]))$/,\n 'idn-email': /^(\"(?:[!#-\\[\\]-\\u{10FFFF}]|\\\\[\\t -\\u{10FFFF}])*\"|[!#-'*+\\-/-9=?A-Z\\^-\\u{10FFFF}](?:\\.?[!#-'*+\\-/-9=?A-Z\\^-\\u{10FFFF}])*)@([!#-'*+\\-/-9=?A-Z\\^-\\u{10FFFF}](?:\\.?[!#-'*+\\-/-9=?A-Z\\^-\\u{10FFFF}])*|\\[[!-Z\\^-\\u{10FFFF}]*\\])$/u,\n\n // 7.3.3. Hostnames\n\n // 7.3.4. IP Addresses\n 'ip-address': /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\n // FIXME whitespace is invalid\n 'ipv6': /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/,\n\n // 7.3.5. Resource Identifiers\n // TODO: A more accurate regular expression for \"uri\" goes:\n // [A-Za-z][+\\-.0-9A-Za-z]*:((/(/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?)?)?#(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|(/(/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?[/?]|[!$&-.0-;=?-Z_a-z~])|/?%[0-9A-Fa-f]{2}|[!$&-.0-;=?-Z_a-z~])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*(#(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*)?|/(/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+(:\\d*)?|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?:\\d*|\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)?)?\n 'uri': /^[a-zA-Z][a-zA-Z0-9+.-]*:[^\\s]*$/,\n 'uri-reference': /^(((([A-Za-z][+\\-.0-9A-Za-z]*(:%[0-9A-Fa-f]{2}|:[!$&-.0-;=?-Z_a-z~]|[/?])|\\?)(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|([A-Za-z][+\\-.0-9A-Za-z]*:?)?)|([A-Za-z][+\\-.0-9A-Za-z]*:)?\\/((%[0-9A-Fa-f]{2}|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?[/?]|[!$&-.0-;=?-Z_a-z~])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|(\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?)?))#(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|(([A-Za-z][+\\-.0-9A-Za-z]*)?%[0-9A-Fa-f]{2}|[!$&-.0-9;=@_~]|[A-Za-z][+\\-.0-9A-Za-z]*[!$&-*,;=@_~])(%[0-9A-Fa-f]{2}|[!$&-.0-9;=@-Z_a-z~])*((([/?](%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*)?#|[/?])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*)?|([A-Za-z][+\\-.0-9A-Za-z]*(:%[0-9A-Fa-f]{2}|:[!$&-.0-;=?-Z_a-z~]|[/?])|\\?)(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|([A-Za-z][+\\-.0-9A-Za-z]*:)?\\/((%[0-9A-Fa-f]{2}|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?[/?]|[!$&-.0-;=?-Z_a-z~])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+(:\\d*)?|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?:\\d*|\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)?|[A-Za-z][+\\-.0-9A-Za-z]*:?)?$/,\n 'iri': /^[a-zA-Z][a-zA-Z0-9+.-]*:[^\\s]*$/,\n 'iri-reference': /^(((([A-Za-z][+\\-.0-9A-Za-z]*(:%[0-9A-Fa-f]{2}|:[!$&-.0-;=?-Z_a-z~-\\u{10FFFF}]|[/?])|\\?)(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*|([A-Za-z][+\\-.0-9A-Za-z]*:?)?)|([A-Za-z][+\\-.0-9A-Za-z]*:)?\\/((%[0-9A-Fa-f]{2}|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~-\\u{10FFFF}])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~-\\u{10FFFF}]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?[/?]|[!$&-.0-;=?-Z_a-z~-\\u{10FFFF}])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*|(\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~-\\u{10FFFF}])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~-\\u{10FFFF}]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?)?))#(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*|(([A-Za-z][+\\-.0-9A-Za-z]*)?%[0-9A-Fa-f]{2}|[!$&-.0-9;=@_~-\\u{10FFFF}]|[A-Za-z][+\\-.0-9A-Za-z]*[!$&-*,;=@_~-\\u{10FFFF}])(%[0-9A-Fa-f]{2}|[!$&-.0-9;=@-Z_a-z~-\\u{10FFFF}])*((([/?](%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*)?#|[/?])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*)?|([A-Za-z][+\\-.0-9A-Za-z]*(:%[0-9A-Fa-f]{2}|:[!$&-.0-;=?-Z_a-z~-\\u{10FFFF}]|[/?])|\\?)(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*|([A-Za-z][+\\-.0-9A-Za-z]*:)?\\/((%[0-9A-Fa-f]{2}|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~-\\u{10FFFF}])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~-\\u{10FFFF}]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?[/?]|[!$&-.0-;=?-Z_a-z~-\\u{10FFFF}])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~-\\u{10FFFF}])+(:\\d*)?|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~-\\u{10FFFF}]+)?|[.0-:A-Fa-f]+)\\])?:\\d*|\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~-\\u{10FFFF}]+)?|[.0-:A-Fa-f]+)\\])?)?|[A-Za-z][+\\-.0-9A-Za-z]*:?)?$/u,\n 'uuid': /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i,\n\n // 7.3.6. uri-template\n 'uri-template': /(%[0-9a-f]{2}|[!#$&(-;=?@\\[\\]_a-z~]|\\{[!#&+,./;=?@|]?(%[0-9a-f]{2}|[0-9_a-z])(\\.?(%[0-9a-f]{2}|[0-9_a-z]))*(:[1-9]\\d{0,3}|\\*)?(,(%[0-9a-f]{2}|[0-9_a-z])(\\.?(%[0-9a-f]{2}|[0-9_a-z]))*(:[1-9]\\d{0,3}|\\*)?)*\\})*/iu,\n\n // 7.3.7. JSON Pointers\n 'json-pointer': /^(\\/([\\x00-\\x2e0-@\\[-}\\x7f]|~[01])*)*$/iu,\n 'relative-json-pointer': /^\\d+(#|(\\/([\\x00-\\x2e0-@\\[-}\\x7f]|~[01])*)*)$/iu,\n\n // hostname regex from: http://stackoverflow.com/a/1420225/5628\n 'hostname': /^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?$/,\n 'host-name': /^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?$/,\n\n 'utc-millisec': function (input) {\n return (typeof input === 'string') && parseFloat(input) === parseInt(input, 10) && !isNaN(input);\n },\n\n // 7.3.8. regex\n 'regex': function (input) {\n var result = true;\n try {\n new RegExp(input);\n } catch (e) {\n result = false;\n }\n return result;\n },\n\n // Other definitions\n // \"style\" was removed from JSON Schema in draft-4 and is deprecated\n 'style': /[\\r\\n\\t ]*[^\\r\\n\\t ][^:]*:[\\r\\n\\t ]*[^\\r\\n\\t ;]*[\\r\\n\\t ]*;?/,\n // \"color\" was removed from JSON Schema in draft-4 and is deprecated\n 'color': /^(#?([0-9A-Fa-f]{3}){1,2}\\b|aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow|(rgb\\(\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*,\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*,\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*\\))|(rgb\\(\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*\\)))$/,\n 'phone': /^\\+(?:[0-9] ?){6,14}[0-9]$/,\n 'alpha': /^[a-zA-Z]+$/,\n 'alphanumeric': /^[a-zA-Z0-9]+$/,\n};\n\nFORMAT_REGEXPS.regexp = FORMAT_REGEXPS.regex;\nFORMAT_REGEXPS.pattern = FORMAT_REGEXPS.regex;\nFORMAT_REGEXPS.ipv4 = FORMAT_REGEXPS['ip-address'];\n\nexports.isFormat = function isFormat (input, format, validator) {\n if (typeof input === 'string' && FORMAT_REGEXPS[format] !== undefined) {\n if (FORMAT_REGEXPS[format] instanceof RegExp) {\n return FORMAT_REGEXPS[format].test(input);\n }\n if (typeof FORMAT_REGEXPS[format] === 'function') {\n return FORMAT_REGEXPS[format](input);\n }\n } else if (validator && validator.customFormats &&\n typeof validator.customFormats[format] === 'function') {\n return validator.customFormats[format](input);\n }\n return true;\n};\n\nvar makeSuffix = exports.makeSuffix = function makeSuffix (key) {\n key = key.toString();\n // This function could be capable of outputting valid a ECMAScript string, but the\n // resulting code for testing which form to use would be tens of thousands of characters long\n // That means this will use the name form for some illegal forms\n if (!key.match(/[.\\s\\[\\]]/) && !key.match(/^[\\d]/)) {\n return '.' + key;\n }\n if (key.match(/^\\d+$/)) {\n return '[' + key + ']';\n }\n return '[' + JSON.stringify(key) + ']';\n};\n\nexports.deepCompareStrict = function deepCompareStrict (a, b) {\n if (typeof a !== typeof b) {\n return false;\n }\n if (Array.isArray(a)) {\n if (!Array.isArray(b)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n return a.every(function (v, i) {\n return deepCompareStrict(a[i], b[i]);\n });\n }\n if (typeof a === 'object') {\n if (!a || !b) {\n return a === b;\n }\n var aKeys = Object.keys(a);\n var bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every(function (v) {\n return deepCompareStrict(a[v], b[v]);\n });\n }\n return a === b;\n};\n\nfunction deepMerger (target, dst, e, i) {\n if (typeof e === 'object') {\n dst[i] = deepMerge(target[i], e);\n } else {\n if (target.indexOf(e) === -1) {\n dst.push(e);\n }\n }\n}\n\nfunction copyist (src, dst, key) {\n dst[key] = src[key];\n}\n\nfunction copyistWithDeepMerge (target, src, dst, key) {\n if (typeof src[key] !== 'object' || !src[key]) {\n dst[key] = src[key];\n }\n else {\n if (!target[key]) {\n dst[key] = src[key];\n } else {\n dst[key] = deepMerge(target[key], src[key]);\n }\n }\n}\n\nfunction deepMerge (target, src) {\n var array = Array.isArray(src);\n var dst = array && [] || {};\n\n if (array) {\n target = target || [];\n dst = dst.concat(target);\n src.forEach(deepMerger.bind(null, target, dst));\n } else {\n if (target && typeof target === 'object') {\n Object.keys(target).forEach(copyist.bind(null, target, dst));\n }\n Object.keys(src).forEach(copyistWithDeepMerge.bind(null, target, src, dst));\n }\n\n return dst;\n}\n\nmodule.exports.deepMerge = deepMerge;\n\n/**\n * Validates instance against the provided schema\n * Implements URI+JSON Pointer encoding, e.g. \"%7e\"=\"~0\"=>\"~\", \"~1\"=\"%2f\"=>\"/\"\n * @param o\n * @param s The path to walk o along\n * @return any\n */\nexports.objectGetPath = function objectGetPath(o, s) {\n var parts = s.split('/').slice(1);\n var k;\n while (typeof (k=parts.shift()) == 'string') {\n var n = decodeURIComponent(k.replace(/~0/,'~').replace(/~1/g,'/'));\n if (!(n in o)) return;\n o = o[n];\n }\n return o;\n};\n\nfunction pathEncoder (v) {\n return '/'+encodeURIComponent(v).replace(/~/g,'%7E');\n}\n/**\n * Accept an Array of property names and return a JSON Pointer URI fragment\n * @param Array a\n * @return {String}\n */\nexports.encodePath = function encodePointer(a){\n // ~ must be encoded explicitly because hacks\n // the slash is encoded by encodeURIComponent\n return a.map(pathEncoder).join('');\n};\n\n\n/**\n * Calculate the number of decimal places a number uses\n * We need this to get correct results out of multipleOf and divisibleBy\n * when either figure is has decimal places, due to IEEE-754 float issues.\n * @param number\n * @returns {number}\n */\nexports.getDecimalPlaces = function getDecimalPlaces(number) {\n\n var decimalPlaces = 0;\n if (isNaN(number)) return decimalPlaces;\n\n if (typeof number !== 'number') {\n number = Number(number);\n }\n\n var parts = number.toString().split('e');\n if (parts.length === 2) {\n if (parts[1][0] !== '-') {\n return decimalPlaces;\n } else {\n decimalPlaces = Number(parts[1].slice(1));\n }\n }\n\n var decimalParts = parts[0].split('.');\n if (decimalParts.length === 2) {\n decimalPlaces += decimalParts[1].length;\n }\n\n return decimalPlaces;\n};\n\nexports.isSchema = function isSchema(val){\n return (typeof val === 'object' && val) || (typeof val === 'boolean');\n};\n\n","'use strict';\n\nvar Validator = module.exports.Validator = require('./validator');\n\nmodule.exports.ValidatorResult = require('./helpers').ValidatorResult;\nmodule.exports.ValidatorResultError = require('./helpers').ValidatorResultError;\nmodule.exports.ValidationError = require('./helpers').ValidationError;\nmodule.exports.SchemaError = require('./helpers').SchemaError;\nmodule.exports.SchemaScanResult = require('./scan').SchemaScanResult;\nmodule.exports.scan = require('./scan').scan;\n\nmodule.exports.validate = function (instance, schema, options) {\n var v = new Validator();\n return v.validate(instance, schema, options);\n};\n","\"use strict\";\n\nvar urilib = require('url');\nvar helpers = require('./helpers');\n\nmodule.exports.SchemaScanResult = SchemaScanResult;\nfunction SchemaScanResult(found, ref){\n this.id = found;\n this.ref = ref;\n}\n\n/**\n * Adds a schema with a certain urn to the Validator instance.\n * @param string uri\n * @param object schema\n * @return {Object}\n */\nmodule.exports.scan = function scan(base, schema){\n function scanSchema(baseuri, schema){\n if(!schema || typeof schema!='object') return;\n // Mark all referenced schemas so we can tell later which schemas are referred to, but never defined\n if(schema.$ref){\n var resolvedUri = urilib.resolve(baseuri, schema.$ref);\n ref[resolvedUri] = ref[resolvedUri] ? ref[resolvedUri]+1 : 0;\n return;\n }\n var id = schema.$id || schema.id;\n var ourBase = id ? urilib.resolve(baseuri, id) : baseuri;\n if (ourBase) {\n // If there's no fragment, append an empty one\n if(ourBase.indexOf('#')<0) ourBase += '#';\n if(found[ourBase]){\n if(!helpers.deepCompareStrict(found[ourBase], schema)){\n throw new Error('Schema <'+ourBase+'> already exists with different definition');\n }\n return found[ourBase];\n }\n found[ourBase] = schema;\n // strip trailing fragment\n if(ourBase[ourBase.length-1]=='#'){\n found[ourBase.substring(0, ourBase.length-1)] = schema;\n }\n }\n scanArray(ourBase+'/items', (Array.isArray(schema.items)?schema.items:[schema.items]));\n scanArray(ourBase+'/extends', (Array.isArray(schema.extends)?schema.extends:[schema.extends]));\n scanSchema(ourBase+'/additionalItems', schema.additionalItems);\n scanObject(ourBase+'/properties', schema.properties);\n scanSchema(ourBase+'/additionalProperties', schema.additionalProperties);\n scanObject(ourBase+'/definitions', schema.definitions);\n scanObject(ourBase+'/patternProperties', schema.patternProperties);\n scanObject(ourBase+'/dependencies', schema.dependencies);\n scanArray(ourBase+'/disallow', schema.disallow);\n scanArray(ourBase+'/allOf', schema.allOf);\n scanArray(ourBase+'/anyOf', schema.anyOf);\n scanArray(ourBase+'/oneOf', schema.oneOf);\n scanSchema(ourBase+'/not', schema.not);\n }\n function scanArray(baseuri, schemas){\n if(!Array.isArray(schemas)) return;\n for(var i=0; i\", schema);\n }\n var subschema = helpers.objectGetPath(ctx.schemas[document], fragment.substr(1));\n if(subschema===undefined){\n throw new SchemaError(\"no such schema \" + fragment + \" located in <\" + document + \">\", schema);\n }\n return {subschema: subschema, switchSchema: switchSchema};\n};\n\n/**\n * Tests whether the instance if of a certain type.\n * @private\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @param type\n * @return {boolean}\n */\nValidator.prototype.testType = function validateType (instance, schema, options, ctx, type) {\n if(type===undefined){\n return;\n }else if(type===null){\n throw new SchemaError('Unexpected null in \"type\" keyword');\n }\n if (typeof this.types[type] == 'function') {\n return this.types[type].call(this, instance);\n }\n if (type && typeof type == 'object') {\n var res = this.validateSchema(instance, type, options, ctx);\n return res === undefined || !(res && res.errors.length);\n }\n // Undefined or properties not on the list are acceptable, same as not being defined\n return true;\n};\n\nvar types = Validator.prototype.types = {};\ntypes.string = function testString (instance) {\n return typeof instance == 'string';\n};\ntypes.number = function testNumber (instance) {\n // isFinite returns false for NaN, Infinity, and -Infinity\n return typeof instance == 'number' && isFinite(instance);\n};\ntypes.integer = function testInteger (instance) {\n return (typeof instance == 'number') && instance % 1 === 0;\n};\ntypes.boolean = function testBoolean (instance) {\n return typeof instance == 'boolean';\n};\ntypes.array = function testArray (instance) {\n return Array.isArray(instance);\n};\ntypes['null'] = function testNull (instance) {\n return instance === null;\n};\ntypes.date = function testDate (instance) {\n return instance instanceof Date;\n};\ntypes.any = function testAny (instance) {\n return true;\n};\ntypes.object = function testObject (instance) {\n // TODO: fix this - see #15\n return instance && (typeof instance === 'object') && !(Array.isArray(instance)) && !(instance instanceof Date);\n};\n\nmodule.exports = Validator;\n","'use strict'\n\n// A linked list to keep track of recently-used-ness\nconst Yallist = require('yallist')\n\nconst MAX = Symbol('max')\nconst LENGTH = Symbol('length')\nconst LENGTH_CALCULATOR = Symbol('lengthCalculator')\nconst ALLOW_STALE = Symbol('allowStale')\nconst MAX_AGE = Symbol('maxAge')\nconst DISPOSE = Symbol('dispose')\nconst NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet')\nconst LRU_LIST = Symbol('lruList')\nconst CACHE = Symbol('cache')\nconst UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet')\n\nconst naiveLength = () => 1\n\n// lruList is a yallist where the head is the youngest\n// item, and the tail is the oldest. the list contains the Hit\n// objects as the entries.\n// Each Hit object has a reference to its Yallist.Node. This\n// never changes.\n//\n// cache is a Map (or PseudoMap) that matches the keys to\n// the Yallist.Node object.\nclass LRUCache {\n constructor (options) {\n if (typeof options === 'number')\n options = { max: options }\n\n if (!options)\n options = {}\n\n if (options.max && (typeof options.max !== 'number' || options.max < 0))\n throw new TypeError('max must be a non-negative number')\n // Kind of weird to have a default max of Infinity, but oh well.\n const max = this[MAX] = options.max || Infinity\n\n const lc = options.length || naiveLength\n this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc\n this[ALLOW_STALE] = options.stale || false\n if (options.maxAge && typeof options.maxAge !== 'number')\n throw new TypeError('maxAge must be a number')\n this[MAX_AGE] = options.maxAge || 0\n this[DISPOSE] = options.dispose\n this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false\n this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false\n this.reset()\n }\n\n // resize the cache when the max changes.\n set max (mL) {\n if (typeof mL !== 'number' || mL < 0)\n throw new TypeError('max must be a non-negative number')\n\n this[MAX] = mL || Infinity\n trim(this)\n }\n get max () {\n return this[MAX]\n }\n\n set allowStale (allowStale) {\n this[ALLOW_STALE] = !!allowStale\n }\n get allowStale () {\n return this[ALLOW_STALE]\n }\n\n set maxAge (mA) {\n if (typeof mA !== 'number')\n throw new TypeError('maxAge must be a non-negative number')\n\n this[MAX_AGE] = mA\n trim(this)\n }\n get maxAge () {\n return this[MAX_AGE]\n }\n\n // resize the cache when the lengthCalculator changes.\n set lengthCalculator (lC) {\n if (typeof lC !== 'function')\n lC = naiveLength\n\n if (lC !== this[LENGTH_CALCULATOR]) {\n this[LENGTH_CALCULATOR] = lC\n this[LENGTH] = 0\n this[LRU_LIST].forEach(hit => {\n hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key)\n this[LENGTH] += hit.length\n })\n }\n trim(this)\n }\n get lengthCalculator () { return this[LENGTH_CALCULATOR] }\n\n get length () { return this[LENGTH] }\n get itemCount () { return this[LRU_LIST].length }\n\n rforEach (fn, thisp) {\n thisp = thisp || this\n for (let walker = this[LRU_LIST].tail; walker !== null;) {\n const prev = walker.prev\n forEachStep(this, fn, walker, thisp)\n walker = prev\n }\n }\n\n forEach (fn, thisp) {\n thisp = thisp || this\n for (let walker = this[LRU_LIST].head; walker !== null;) {\n const next = walker.next\n forEachStep(this, fn, walker, thisp)\n walker = next\n }\n }\n\n keys () {\n return this[LRU_LIST].toArray().map(k => k.key)\n }\n\n values () {\n return this[LRU_LIST].toArray().map(k => k.value)\n }\n\n reset () {\n if (this[DISPOSE] &&\n this[LRU_LIST] &&\n this[LRU_LIST].length) {\n this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value))\n }\n\n this[CACHE] = new Map() // hash of items by key\n this[LRU_LIST] = new Yallist() // list of items in order of use recency\n this[LENGTH] = 0 // length of items in the list\n }\n\n dump () {\n return this[LRU_LIST].map(hit =>\n isStale(this, hit) ? false : {\n k: hit.key,\n v: hit.value,\n e: hit.now + (hit.maxAge || 0)\n }).toArray().filter(h => h)\n }\n\n dumpLru () {\n return this[LRU_LIST]\n }\n\n set (key, value, maxAge) {\n maxAge = maxAge || this[MAX_AGE]\n\n if (maxAge && typeof maxAge !== 'number')\n throw new TypeError('maxAge must be a number')\n\n const now = maxAge ? Date.now() : 0\n const len = this[LENGTH_CALCULATOR](value, key)\n\n if (this[CACHE].has(key)) {\n if (len > this[MAX]) {\n del(this, this[CACHE].get(key))\n return false\n }\n\n const node = this[CACHE].get(key)\n const item = node.value\n\n // dispose of the old one before overwriting\n // split out into 2 ifs for better coverage tracking\n if (this[DISPOSE]) {\n if (!this[NO_DISPOSE_ON_SET])\n this[DISPOSE](key, item.value)\n }\n\n item.now = now\n item.maxAge = maxAge\n item.value = value\n this[LENGTH] += len - item.length\n item.length = len\n this.get(key)\n trim(this)\n return true\n }\n\n const hit = new Entry(key, value, len, now, maxAge)\n\n // oversized objects fall out of cache automatically.\n if (hit.length > this[MAX]) {\n if (this[DISPOSE])\n this[DISPOSE](key, value)\n\n return false\n }\n\n this[LENGTH] += hit.length\n this[LRU_LIST].unshift(hit)\n this[CACHE].set(key, this[LRU_LIST].head)\n trim(this)\n return true\n }\n\n has (key) {\n if (!this[CACHE].has(key)) return false\n const hit = this[CACHE].get(key).value\n return !isStale(this, hit)\n }\n\n get (key) {\n return get(this, key, true)\n }\n\n peek (key) {\n return get(this, key, false)\n }\n\n pop () {\n const node = this[LRU_LIST].tail\n if (!node)\n return null\n\n del(this, node)\n return node.value\n }\n\n del (key) {\n del(this, this[CACHE].get(key))\n }\n\n load (arr) {\n // reset the cache\n this.reset()\n\n const now = Date.now()\n // A previous serialized cache has the most recent items first\n for (let l = arr.length - 1; l >= 0; l--) {\n const hit = arr[l]\n const expiresAt = hit.e || 0\n if (expiresAt === 0)\n // the item was created without expiration in a non aged cache\n this.set(hit.k, hit.v)\n else {\n const maxAge = expiresAt - now\n // dont add already expired items\n if (maxAge > 0) {\n this.set(hit.k, hit.v, maxAge)\n }\n }\n }\n }\n\n prune () {\n this[CACHE].forEach((value, key) => get(this, key, false))\n }\n}\n\nconst get = (self, key, doUse) => {\n const node = self[CACHE].get(key)\n if (node) {\n const hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!self[ALLOW_STALE])\n return undefined\n } else {\n if (doUse) {\n if (self[UPDATE_AGE_ON_GET])\n node.value.now = Date.now()\n self[LRU_LIST].unshiftNode(node)\n }\n }\n return hit.value\n }\n}\n\nconst isStale = (self, hit) => {\n if (!hit || (!hit.maxAge && !self[MAX_AGE]))\n return false\n\n const diff = Date.now() - hit.now\n return hit.maxAge ? diff > hit.maxAge\n : self[MAX_AGE] && (diff > self[MAX_AGE])\n}\n\nconst trim = self => {\n if (self[LENGTH] > self[MAX]) {\n for (let walker = self[LRU_LIST].tail;\n self[LENGTH] > self[MAX] && walker !== null;) {\n // We know that we're about to delete this one, and also\n // what the next least recently used key will be, so just\n // go ahead and set it now.\n const prev = walker.prev\n del(self, walker)\n walker = prev\n }\n }\n}\n\nconst del = (self, node) => {\n if (node) {\n const hit = node.value\n if (self[DISPOSE])\n self[DISPOSE](hit.key, hit.value)\n\n self[LENGTH] -= hit.length\n self[CACHE].delete(hit.key)\n self[LRU_LIST].removeNode(node)\n }\n}\n\nclass Entry {\n constructor (key, value, length, now, maxAge) {\n this.key = key\n this.value = value\n this.length = length\n this.now = now\n this.maxAge = maxAge || 0\n }\n}\n\nconst forEachStep = (self, fn, node, thisp) => {\n let hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!self[ALLOW_STALE])\n hit = undefined\n }\n if (hit)\n fn.call(thisp, hit.value, hit.key, self)\n}\n\nmodule.exports = LRUCache\n","const ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.format()\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range\n .trim()\n .split(/\\s+/)\n .join(' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.format()\n }\n\n format () {\n this.range = this.set\n .map((comps) => comps.join(' ').trim())\n .join('||')\n .trim()\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('lru-cache')\nconst cache = new LRU({ max: 1000 })\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr, tb) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","const debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","const parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","const eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","const SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n let next\n while ((next = re[t.COERCERTL].exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n re[t.COERCERTL].lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options)\n}\nmodule.exports = coerce\n","const SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","const compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","const SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","const parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // Otherwise it can be determined by checking the high version\n\n if (highVersion.patch) {\n // anything higher than a patch bump would result in the wrong version\n return 'patch'\n }\n\n if (highVersion.minor) {\n // anything higher than a minor bump would result in the wrong version\n return 'minor'\n }\n\n // bumping major/minor/patch all have same result\n return 'major'\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","const compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","const compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","const compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","const SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","const compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","const compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","const SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","const SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","const compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","const SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","const SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","const parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","const compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","const compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","const Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","const compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","const parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","const debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","const numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","const {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCE', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","const Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","const outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","const SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","const Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","const Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","const Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\nmodule.exports = function (Yallist) {\n Yallist.prototype[Symbol.iterator] = function* () {\n for (let walker = this.head; walker; walker = walker.next) {\n yield walker.value\n }\n }\n}\n","'use strict'\nmodule.exports = Yallist\n\nYallist.Node = Node\nYallist.create = Yallist\n\nfunction Yallist (list) {\n var self = this\n if (!(self instanceof Yallist)) {\n self = new Yallist()\n }\n\n self.tail = null\n self.head = null\n self.length = 0\n\n if (list && typeof list.forEach === 'function') {\n list.forEach(function (item) {\n self.push(item)\n })\n } else if (arguments.length > 0) {\n for (var i = 0, l = arguments.length; i < l; i++) {\n self.push(arguments[i])\n }\n }\n\n return self\n}\n\nYallist.prototype.removeNode = function (node) {\n if (node.list !== this) {\n throw new Error('removing node which does not belong to this list')\n }\n\n var next = node.next\n var prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n node.list.length--\n node.next = null\n node.prev = null\n node.list = null\n\n return next\n}\n\nYallist.prototype.unshiftNode = function (node) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length++\n}\n\nYallist.prototype.pushNode = function (node) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length++\n}\n\nYallist.prototype.push = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n push(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.unshift = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n unshift(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.pop = function () {\n if (!this.tail) {\n return undefined\n }\n\n var res = this.tail.value\n this.tail = this.tail.prev\n if (this.tail) {\n this.tail.next = null\n } else {\n this.head = null\n }\n this.length--\n return res\n}\n\nYallist.prototype.shift = function () {\n if (!this.head) {\n return undefined\n }\n\n var res = this.head.value\n this.head = this.head.next\n if (this.head) {\n this.head.prev = null\n } else {\n this.tail = null\n }\n this.length--\n return res\n}\n\nYallist.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.head, i = 0; walker !== null; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n}\n\nYallist.prototype.forEachReverse = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n}\n\nYallist.prototype.get = function (n) {\n for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.next\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.getReverse = function (n) {\n for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.map = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.head; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n}\n\nYallist.prototype.mapReverse = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.tail; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n}\n\nYallist.prototype.reduce = function (fn, initial) {\n var acc\n var walker = this.head\n if (arguments.length > 1) {\n acc = initial\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = 0; walker !== null; i++) {\n acc = fn(acc, walker.value, i)\n walker = walker.next\n }\n\n return acc\n}\n\nYallist.prototype.reduceReverse = function (fn, initial) {\n var acc\n var walker = this.tail\n if (arguments.length > 1) {\n acc = initial\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = this.length - 1; walker !== null; i--) {\n acc = fn(acc, walker.value, i)\n walker = walker.prev\n }\n\n return acc\n}\n\nYallist.prototype.toArray = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.head; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n}\n\nYallist.prototype.toArrayReverse = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.tail; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n}\n\nYallist.prototype.slice = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n walker = walker.next\n }\n for (; walker !== null && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.sliceReverse = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n walker = walker.prev\n }\n for (; walker !== null && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.splice = function (start, deleteCount, ...nodes) {\n if (start > this.length) {\n start = this.length - 1\n }\n if (start < 0) {\n start = this.length + start;\n }\n\n for (var i = 0, walker = this.head; walker !== null && i < start; i++) {\n walker = walker.next\n }\n\n var ret = []\n for (var i = 0; walker && i < deleteCount; i++) {\n ret.push(walker.value)\n walker = this.removeNode(walker)\n }\n if (walker === null) {\n walker = this.tail\n }\n\n if (walker !== this.head && walker !== this.tail) {\n walker = walker.prev\n }\n\n for (var i = 0; i < nodes.length; i++) {\n walker = insert(this, walker, nodes[i])\n }\n return ret;\n}\n\nYallist.prototype.reverse = function () {\n var head = this.head\n var tail = this.tail\n for (var walker = head; walker !== null; walker = walker.prev) {\n var p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n}\n\nfunction insert (self, node, value) {\n var inserted = node === self.head ?\n new Node(value, null, node, self) :\n new Node(value, node, node.next, self)\n\n if (inserted.next === null) {\n self.tail = inserted\n }\n if (inserted.prev === null) {\n self.head = inserted\n }\n\n self.length++\n\n return inserted\n}\n\nfunction push (self, item) {\n self.tail = new Node(item, self.tail, null, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length++\n}\n\nfunction unshift (self, item) {\n self.head = new Node(item, null, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length++\n}\n\nfunction Node (value, prev, next, list) {\n if (!(this instanceof Node)) {\n return new Node(value, prev, next, list)\n }\n\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = null\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = null\n }\n}\n\ntry {\n // add if support for Symbol.iterator is present\n require('./iterator.js')(Yallist)\n} catch (er) {}\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.diffResource = exports.diffTemplate = void 0;\nconst impl = require(\"./diff\");\nconst types = require(\"./diff/types\");\nconst util_1 = require(\"./diff/util\");\n__exportStar(require(\"./diff/types\"), exports);\nconst DIFF_HANDLERS = {\n AWSTemplateFormatVersion: (diff, oldValue, newValue) => diff.awsTemplateFormatVersion = impl.diffAttribute(oldValue, newValue),\n Description: (diff, oldValue, newValue) => diff.description = impl.diffAttribute(oldValue, newValue),\n Metadata: (diff, oldValue, newValue) => diff.metadata = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffMetadata)),\n Parameters: (diff, oldValue, newValue) => diff.parameters = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffParameter)),\n Mappings: (diff, oldValue, newValue) => diff.mappings = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffMapping)),\n Conditions: (diff, oldValue, newValue) => diff.conditions = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffCondition)),\n Transform: (diff, oldValue, newValue) => diff.transform = impl.diffAttribute(oldValue, newValue),\n Resources: (diff, oldValue, newValue) => diff.resources = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffResource)),\n Outputs: (diff, oldValue, newValue) => diff.outputs = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffOutput)),\n};\n/**\n * Compare two CloudFormation templates and return semantic differences between them.\n *\n * @param currentTemplate the current state of the stack.\n * @param newTemplate the target state of the stack.\n *\n * @returns a +types.TemplateDiff+ object that represents the changes that will happen if\n * a stack which current state is described by +currentTemplate+ is updated with\n * the template +newTemplate+.\n */\nfunction diffTemplate(currentTemplate, newTemplate) {\n // Base diff\n const theDiff = calculateTemplateDiff(currentTemplate, newTemplate);\n // We're going to modify this in-place\n const newTemplateCopy = deepCopy(newTemplate);\n let didPropagateReferenceChanges;\n let diffWithReplacements;\n do {\n diffWithReplacements = calculateTemplateDiff(currentTemplate, newTemplateCopy);\n // Propagate replacements for replaced resources\n didPropagateReferenceChanges = false;\n if (diffWithReplacements.resources) {\n diffWithReplacements.resources.forEachDifference((logicalId, change) => {\n if (change.changeImpact === types.ResourceImpact.WILL_REPLACE) {\n if (propagateReplacedReferences(newTemplateCopy, logicalId)) {\n didPropagateReferenceChanges = true;\n }\n }\n });\n }\n } while (didPropagateReferenceChanges);\n // Copy \"replaced\" states from `diffWithReplacements` to `theDiff`.\n diffWithReplacements.resources\n .filter(r => isReplacement(r.changeImpact))\n .forEachDifference((logicalId, downstreamReplacement) => {\n const resource = theDiff.resources.get(logicalId);\n if (resource.changeImpact !== downstreamReplacement.changeImpact) {\n propagatePropertyReplacement(downstreamReplacement, resource);\n }\n });\n return theDiff;\n}\nexports.diffTemplate = diffTemplate;\nfunction isReplacement(impact) {\n return impact === types.ResourceImpact.MAY_REPLACE || impact === types.ResourceImpact.WILL_REPLACE;\n}\n/**\n * For all properties in 'source' that have a \"replacement\" impact, propagate that impact to \"dest\"\n */\nfunction propagatePropertyReplacement(source, dest) {\n for (const [propertyName, diff] of Object.entries(source.propertyUpdates)) {\n if (diff.changeImpact && isReplacement(diff.changeImpact)) {\n // Use the propertydiff of source in target. The result of this happens to be clear enough.\n dest.setPropertyChange(propertyName, diff);\n }\n }\n}\nfunction calculateTemplateDiff(currentTemplate, newTemplate) {\n const differences = {};\n const unknown = {};\n for (const key of (0, util_1.unionOf)(Object.keys(currentTemplate), Object.keys(newTemplate)).sort()) {\n const oldValue = currentTemplate[key];\n const newValue = newTemplate[key];\n if ((0, util_1.deepEqual)(oldValue, newValue)) {\n continue;\n }\n const handler = DIFF_HANDLERS[key]\n || ((_diff, oldV, newV) => unknown[key] = impl.diffUnknown(oldV, newV));\n handler(differences, oldValue, newValue);\n }\n if (Object.keys(unknown).length > 0) {\n differences.unknown = new types.DifferenceCollection(unknown);\n }\n return new types.TemplateDiff(differences);\n}\n/**\n * Compare two CloudFormation resources and return semantic differences between them\n */\nfunction diffResource(oldValue, newValue) {\n return impl.diffResource(oldValue, newValue);\n}\nexports.diffResource = diffResource;\n/**\n * Replace all references to the given logicalID on the given template, in-place\n *\n * Returns true iff any references were replaced.\n */\nfunction propagateReplacedReferences(template, logicalId) {\n let ret = false;\n function recurse(obj) {\n if (Array.isArray(obj)) {\n obj.forEach(recurse);\n }\n if (typeof obj === 'object' && obj !== null) {\n if (!replaceReference(obj)) {\n Object.values(obj).forEach(recurse);\n }\n }\n }\n function replaceReference(obj) {\n const keys = Object.keys(obj);\n if (keys.length !== 1) {\n return false;\n }\n const key = keys[0];\n if (key === 'Ref') {\n if (obj.Ref === logicalId) {\n obj.Ref = logicalId + ' (replaced)';\n ret = true;\n }\n return true;\n }\n if (key.startsWith('Fn::')) {\n if (Array.isArray(obj[key]) && obj[key].length > 0 && obj[key][0] === logicalId) {\n obj[key][0] = logicalId + '(replaced)';\n ret = true;\n }\n return true;\n }\n return false;\n }\n recurse(template);\n return ret;\n}\nfunction deepCopy(x) {\n if (Array.isArray(x)) {\n return x.map(deepCopy);\n }\n if (typeof x === 'object' && x !== null) {\n const ret = {};\n for (const key of Object.keys(x)) {\n ret[key] = deepCopy(x[key]);\n }\n return ret;\n }\n return x;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi10ZW1wbGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRpZmYtdGVtcGxhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0Isc0NBQXNDO0FBQ3RDLHNDQUFvRTtBQUVwRSwrQ0FBNkI7QUFLN0IsTUFBTSxhQUFhLEdBQW9CO0lBQ3JDLHdCQUF3QixFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUNyRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0lBQ3hFLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7SUFDM0QsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUEsd0JBQWlCLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUcsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUEsd0JBQWlCLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0csUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUEsd0JBQWlCLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekcsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUEsd0JBQWlCLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0csU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUN6RCxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBQSx3QkFBaUIsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzRyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBQSx3QkFBaUIsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztDQUN4RyxDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLGVBQXVDLEVBQUUsV0FBbUM7SUFDdkcsWUFBWTtJQUNaLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVwRSxzQ0FBc0M7SUFDdEMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTlDLElBQUksNEJBQTRCLENBQUM7SUFDakMsSUFBSSxvQkFBb0IsQ0FBQztJQUN6QixHQUFHO1FBQ0Qsb0JBQW9CLEdBQUcscUJBQXFCLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRS9FLGdEQUFnRDtRQUNoRCw0QkFBNEIsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLEVBQUU7WUFDbEMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyRSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUU7b0JBQzdELElBQUksMkJBQTJCLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxFQUFFO3dCQUMzRCw0QkFBNEIsR0FBRyxJQUFJLENBQUM7cUJBQ3JDO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtLQUNGLFFBQVEsNEJBQTRCLEVBQUU7SUFFdkMsbUVBQW1FO0lBQ25FLG9CQUFvQixDQUFDLFNBQVM7U0FDM0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMzQyxpQkFBaUIsQ0FBQyxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxFQUFFO1FBQ3RELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxELElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUU7WUFDaEUsNEJBQTRCLENBQUMscUJBQXFCLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDL0Q7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFyQ0Qsb0NBcUNDO0FBRUQsU0FBUyxhQUFhLENBQUMsTUFBNEI7SUFDakQsT0FBTyxNQUFNLEtBQUssS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFXLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO0FBQ3JHLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsNEJBQTRCLENBQUMsTUFBZ0MsRUFBRSxJQUE4QjtJQUNwRyxLQUFLLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDekUsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDekQsMkZBQTJGO1lBQzNGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDNUM7S0FDRjtBQUNILENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLGVBQXVDLEVBQUUsV0FBbUM7SUFDekcsTUFBTSxXQUFXLEdBQXdCLEVBQUUsQ0FBQztJQUM1QyxNQUFNLE9BQU8sR0FBNkMsRUFBRSxDQUFDO0lBQzdELEtBQUssTUFBTSxHQUFHLElBQUksSUFBQSxjQUFPLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDeEYsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLElBQUEsZ0JBQVMsRUFBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDakMsU0FBUztTQUNWO1FBQ0QsTUFBTSxPQUFPLEdBQWdCLGFBQWEsQ0FBQyxHQUFHLENBQUM7ZUFDOUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RixPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztLQUUxQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ25DLFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDL0Q7SUFFRCxPQUFPLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixZQUFZLENBQUMsUUFBd0IsRUFBRSxRQUF3QjtJQUM3RSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFGRCxvQ0FFQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLDJCQUEyQixDQUFDLFFBQWdCLEVBQUUsU0FBaUI7SUFDdEUsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBRWhCLFNBQVMsT0FBTyxDQUFDLEdBQVE7UUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEI7UUFFRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDckM7U0FDRjtJQUNILENBQUM7SUFFRCxTQUFTLGdCQUFnQixDQUFDLEdBQVE7UUFDaEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7U0FBRTtRQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEIsSUFBSSxHQUFHLEtBQUssS0FBSyxFQUFFO1lBQ2pCLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUU7Z0JBQ3pCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLGFBQWEsQ0FBQztnQkFDcEMsR0FBRyxHQUFHLElBQUksQ0FBQzthQUNaO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMxQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDL0UsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxZQUFZLENBQUM7Z0JBQ3ZDLEdBQUcsR0FBRyxJQUFJLENBQUM7YUFDWjtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBTTtJQUN0QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3hCO0lBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN2QyxNQUFNLEdBQUcsR0FBUSxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2hDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFDRCxPQUFPLEdBQUcsQ0FBQztLQUNaO0lBRUQsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaW1wbCBmcm9tICcuL2RpZmYnO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi9kaWZmL3R5cGVzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgZGlmZktleWVkRW50aXRpZXMsIHVuaW9uT2YgfSBmcm9tICcuL2RpZmYvdXRpbCc7XG5cbmV4cG9ydCAqIGZyb20gJy4vZGlmZi90eXBlcyc7XG5cbnR5cGUgRGlmZkhhbmRsZXIgPSAoZGlmZjogdHlwZXMuSVRlbXBsYXRlRGlmZiwgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkgPT4gdm9pZDtcbnR5cGUgSGFuZGxlclJlZ2lzdHJ5ID0geyBbc2VjdGlvbjogc3RyaW5nXTogRGlmZkhhbmRsZXIgfTtcblxuY29uc3QgRElGRl9IQU5ETEVSUzogSGFuZGxlclJlZ2lzdHJ5ID0ge1xuICBBV1NUZW1wbGF0ZUZvcm1hdFZlcnNpb246IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5hd3NUZW1wbGF0ZUZvcm1hdFZlcnNpb24gPSBpbXBsLmRpZmZBdHRyaWJ1dGUob2xkVmFsdWUsIG5ld1ZhbHVlKSxcbiAgRGVzY3JpcHRpb246IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5kZXNjcmlwdGlvbiA9IGltcGwuZGlmZkF0dHJpYnV0ZShvbGRWYWx1ZSwgbmV3VmFsdWUpLFxuICBNZXRhZGF0YTogKGRpZmYsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT5cbiAgICBkaWZmLm1ldGFkYXRhID0gbmV3IHR5cGVzLkRpZmZlcmVuY2VDb2xsZWN0aW9uKGRpZmZLZXllZEVudGl0aWVzKG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW1wbC5kaWZmTWV0YWRhdGEpKSxcbiAgUGFyYW1ldGVyczogKGRpZmYsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT5cbiAgICBkaWZmLnBhcmFtZXRlcnMgPSBuZXcgdHlwZXMuRGlmZmVyZW5jZUNvbGxlY3Rpb24oZGlmZktleWVkRW50aXRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCBpbXBsLmRpZmZQYXJhbWV0ZXIpKSxcbiAgTWFwcGluZ3M6IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5tYXBwaW5ncyA9IG5ldyB0eXBlcy5EaWZmZXJlbmNlQ29sbGVjdGlvbihkaWZmS2V5ZWRFbnRpdGllcyhvbGRWYWx1ZSwgbmV3VmFsdWUsIGltcGwuZGlmZk1hcHBpbmcpKSxcbiAgQ29uZGl0aW9uczogKGRpZmYsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT5cbiAgICBkaWZmLmNvbmRpdGlvbnMgPSBuZXcgdHlwZXMuRGlmZmVyZW5jZUNvbGxlY3Rpb24oZGlmZktleWVkRW50aXRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCBpbXBsLmRpZmZDb25kaXRpb24pKSxcbiAgVHJhbnNmb3JtOiAoZGlmZiwgb2xkVmFsdWUsIG5ld1ZhbHVlKSA9PlxuICAgIGRpZmYudHJhbnNmb3JtID0gaW1wbC5kaWZmQXR0cmlidXRlKG9sZFZhbHVlLCBuZXdWYWx1ZSksXG4gIFJlc291cmNlczogKGRpZmYsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT5cbiAgICBkaWZmLnJlc291cmNlcyA9IG5ldyB0eXBlcy5EaWZmZXJlbmNlQ29sbGVjdGlvbihkaWZmS2V5ZWRFbnRpdGllcyhvbGRWYWx1ZSwgbmV3VmFsdWUsIGltcGwuZGlmZlJlc291cmNlKSksXG4gIE91dHB1dHM6IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5vdXRwdXRzID0gbmV3IHR5cGVzLkRpZmZlcmVuY2VDb2xsZWN0aW9uKGRpZmZLZXllZEVudGl0aWVzKG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW1wbC5kaWZmT3V0cHV0KSksXG59O1xuXG4vKipcbiAqIENvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcyBhbmQgcmV0dXJuIHNlbWFudGljIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlbS5cbiAqXG4gKiBAcGFyYW0gY3VycmVudFRlbXBsYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzdGFjay5cbiAqIEBwYXJhbSBuZXdUZW1wbGF0ZSAgICAgdGhlIHRhcmdldCBzdGF0ZSBvZiB0aGUgc3RhY2suXG4gKlxuICogQHJldHVybnMgYSArdHlwZXMuVGVtcGxhdGVEaWZmKyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjaGFuZ2VzIHRoYXQgd2lsbCBoYXBwZW4gaWZcbiAqICAgICAgYSBzdGFjayB3aGljaCBjdXJyZW50IHN0YXRlIGlzIGRlc2NyaWJlZCBieSArY3VycmVudFRlbXBsYXRlKyBpcyB1cGRhdGVkIHdpdGhcbiAqICAgICAgdGhlIHRlbXBsYXRlICtuZXdUZW1wbGF0ZSsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmVGVtcGxhdGUoY3VycmVudFRlbXBsYXRlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBuZXdUZW1wbGF0ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHR5cGVzLlRlbXBsYXRlRGlmZiB7XG4gIC8vIEJhc2UgZGlmZlxuICBjb25zdCB0aGVEaWZmID0gY2FsY3VsYXRlVGVtcGxhdGVEaWZmKGN1cnJlbnRUZW1wbGF0ZSwgbmV3VGVtcGxhdGUpO1xuXG4gIC8vIFdlJ3JlIGdvaW5nIHRvIG1vZGlmeSB0aGlzIGluLXBsYWNlXG4gIGNvbnN0IG5ld1RlbXBsYXRlQ29weSA9IGRlZXBDb3B5KG5ld1RlbXBsYXRlKTtcblxuICBsZXQgZGlkUHJvcGFnYXRlUmVmZXJlbmNlQ2hhbmdlcztcbiAgbGV0IGRpZmZXaXRoUmVwbGFjZW1lbnRzO1xuICBkbyB7XG4gICAgZGlmZldpdGhSZXBsYWNlbWVudHMgPSBjYWxjdWxhdGVUZW1wbGF0ZURpZmYoY3VycmVudFRlbXBsYXRlLCBuZXdUZW1wbGF0ZUNvcHkpO1xuXG4gICAgLy8gUHJvcGFnYXRlIHJlcGxhY2VtZW50cyBmb3IgcmVwbGFjZWQgcmVzb3VyY2VzXG4gICAgZGlkUHJvcGFnYXRlUmVmZXJlbmNlQ2hhbmdlcyA9IGZhbHNlO1xuICAgIGlmIChkaWZmV2l0aFJlcGxhY2VtZW50cy5yZXNvdXJjZXMpIHtcbiAgICAgIGRpZmZXaXRoUmVwbGFjZW1lbnRzLnJlc291cmNlcy5mb3JFYWNoRGlmZmVyZW5jZSgobG9naWNhbElkLCBjaGFuZ2UpID0+IHtcbiAgICAgICAgaWYgKGNoYW5nZS5jaGFuZ2VJbXBhY3QgPT09IHR5cGVzLlJlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRSkge1xuICAgICAgICAgIGlmIChwcm9wYWdhdGVSZXBsYWNlZFJlZmVyZW5jZXMobmV3VGVtcGxhdGVDb3B5LCBsb2dpY2FsSWQpKSB7XG4gICAgICAgICAgICBkaWRQcm9wYWdhdGVSZWZlcmVuY2VDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSB3aGlsZSAoZGlkUHJvcGFnYXRlUmVmZXJlbmNlQ2hhbmdlcyk7XG5cbiAgLy8gQ29weSBcInJlcGxhY2VkXCIgc3RhdGVzIGZyb20gYGRpZmZXaXRoUmVwbGFjZW1lbnRzYCB0byBgdGhlRGlmZmAuXG4gIGRpZmZXaXRoUmVwbGFjZW1lbnRzLnJlc291cmNlc1xuICAgIC5maWx0ZXIociA9PiBpc1JlcGxhY2VtZW50KHIhLmNoYW5nZUltcGFjdCkpXG4gICAgLmZvckVhY2hEaWZmZXJlbmNlKChsb2dpY2FsSWQsIGRvd25zdHJlYW1SZXBsYWNlbWVudCkgPT4ge1xuICAgICAgY29uc3QgcmVzb3VyY2UgPSB0aGVEaWZmLnJlc291cmNlcy5nZXQobG9naWNhbElkKTtcblxuICAgICAgaWYgKHJlc291cmNlLmNoYW5nZUltcGFjdCAhPT0gZG93bnN0cmVhbVJlcGxhY2VtZW50LmNoYW5nZUltcGFjdCkge1xuICAgICAgICBwcm9wYWdhdGVQcm9wZXJ0eVJlcGxhY2VtZW50KGRvd25zdHJlYW1SZXBsYWNlbWVudCwgcmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHJldHVybiB0aGVEaWZmO1xufVxuXG5mdW5jdGlvbiBpc1JlcGxhY2VtZW50KGltcGFjdDogdHlwZXMuUmVzb3VyY2VJbXBhY3QpIHtcbiAgcmV0dXJuIGltcGFjdCA9PT0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuTUFZX1JFUExBQ0UgfHwgaW1wYWN0ID09PSB0eXBlcy5SZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0U7XG59XG5cbi8qKlxuICogRm9yIGFsbCBwcm9wZXJ0aWVzIGluICdzb3VyY2UnIHRoYXQgaGF2ZSBhIFwicmVwbGFjZW1lbnRcIiBpbXBhY3QsIHByb3BhZ2F0ZSB0aGF0IGltcGFjdCB0byBcImRlc3RcIlxuICovXG5mdW5jdGlvbiBwcm9wYWdhdGVQcm9wZXJ0eVJlcGxhY2VtZW50KHNvdXJjZTogdHlwZXMuUmVzb3VyY2VEaWZmZXJlbmNlLCBkZXN0OiB0eXBlcy5SZXNvdXJjZURpZmZlcmVuY2UpIHtcbiAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCBkaWZmXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UucHJvcGVydHlVcGRhdGVzKSkge1xuICAgIGlmIChkaWZmLmNoYW5nZUltcGFjdCAmJiBpc1JlcGxhY2VtZW50KGRpZmYuY2hhbmdlSW1wYWN0KSkge1xuICAgICAgLy8gVXNlIHRoZSBwcm9wZXJ0eWRpZmYgb2Ygc291cmNlIGluIHRhcmdldC4gVGhlIHJlc3VsdCBvZiB0aGlzIGhhcHBlbnMgdG8gYmUgY2xlYXIgZW5vdWdoLlxuICAgICAgZGVzdC5zZXRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIGRpZmYpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVUZW1wbGF0ZURpZmYoY3VycmVudFRlbXBsYXRlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBuZXdUZW1wbGF0ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHR5cGVzLlRlbXBsYXRlRGlmZiB7XG4gIGNvbnN0IGRpZmZlcmVuY2VzOiB0eXBlcy5JVGVtcGxhdGVEaWZmID0ge307XG4gIGNvbnN0IHVua25vd246IHsgW2tleTogc3RyaW5nXTogdHlwZXMuRGlmZmVyZW5jZTxhbnk+IH0gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgdW5pb25PZihPYmplY3Qua2V5cyhjdXJyZW50VGVtcGxhdGUpLCBPYmplY3Qua2V5cyhuZXdUZW1wbGF0ZSkpLnNvcnQoKSkge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gY3VycmVudFRlbXBsYXRlW2tleV07XG4gICAgY29uc3QgbmV3VmFsdWUgPSBuZXdUZW1wbGF0ZVtrZXldO1xuICAgIGlmIChkZWVwRXF1YWwob2xkVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXI6IERpZmZIYW5kbGVyID0gRElGRl9IQU5ETEVSU1trZXldXG4gICAgICAgICAgICAgICAgICB8fCAoKF9kaWZmLCBvbGRWLCBuZXdWKSA9PiB1bmtub3duW2tleV0gPSBpbXBsLmRpZmZVbmtub3duKG9sZFYsIG5ld1YpKTtcbiAgICBoYW5kbGVyKGRpZmZlcmVuY2VzLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuXG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKHVua25vd24pLmxlbmd0aCA+IDApIHtcbiAgICBkaWZmZXJlbmNlcy51bmtub3duID0gbmV3IHR5cGVzLkRpZmZlcmVuY2VDb2xsZWN0aW9uKHVua25vd24pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyB0eXBlcy5UZW1wbGF0ZURpZmYoZGlmZmVyZW5jZXMpO1xufVxuXG4vKipcbiAqIENvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHJlc291cmNlcyBhbmQgcmV0dXJuIHNlbWFudGljIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZlJlc291cmNlKG9sZFZhbHVlOiB0eXBlcy5SZXNvdXJjZSwgbmV3VmFsdWU6IHR5cGVzLlJlc291cmNlKTogdHlwZXMuUmVzb3VyY2VEaWZmZXJlbmNlIHtcbiAgcmV0dXJuIGltcGwuZGlmZlJlc291cmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4gbG9naWNhbElEIG9uIHRoZSBnaXZlbiB0ZW1wbGF0ZSwgaW4tcGxhY2VcbiAqXG4gKiBSZXR1cm5zIHRydWUgaWZmIGFueSByZWZlcmVuY2VzIHdlcmUgcmVwbGFjZWQuXG4gKi9cbmZ1bmN0aW9uIHByb3BhZ2F0ZVJlcGxhY2VkUmVmZXJlbmNlcyh0ZW1wbGF0ZTogb2JqZWN0LCBsb2dpY2FsSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgcmV0ID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gcmVjdXJzZShvYmo6IGFueSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIG9iai5mb3JFYWNoKHJlY3Vyc2UpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcbiAgICAgIGlmICghcmVwbGFjZVJlZmVyZW5jZShvYmopKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXMob2JqKS5mb3JFYWNoKHJlY3Vyc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlcGxhY2VSZWZlcmVuY2Uob2JqOiBhbnkpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY29uc3Qga2V5ID0ga2V5c1swXTtcblxuICAgIGlmIChrZXkgPT09ICdSZWYnKSB7XG4gICAgICBpZiAob2JqLlJlZiA9PT0gbG9naWNhbElkKSB7XG4gICAgICAgIG9iai5SZWYgPSBsb2dpY2FsSWQgKyAnIChyZXBsYWNlZCknO1xuICAgICAgICByZXQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGtleS5zdGFydHNXaXRoKCdGbjo6JykpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ialtrZXldKSAmJiBvYmpba2V5XS5sZW5ndGggPiAwICYmIG9ialtrZXldWzBdID09PSBsb2dpY2FsSWQpIHtcbiAgICAgICAgb2JqW2tleV1bMF0gPSBsb2dpY2FsSWQgKyAnKHJlcGxhY2VkKSc7XG4gICAgICAgIHJldCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZWN1cnNlKHRlbXBsYXRlKTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZGVlcENvcHkoeDogYW55KTogYW55IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4geC5tYXAoZGVlcENvcHkpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKSB7XG4gICAgY29uc3QgcmV0OiBhbnkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh4KSkge1xuICAgICAgcmV0W2tleV0gPSBkZWVwQ29weSh4W2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcmV0dXJuIHg7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.diffUnknown = exports.diffResource = exports.diffParameter = exports.diffOutput = exports.diffMetadata = exports.diffMapping = exports.diffCondition = exports.diffAttribute = void 0;\nconst cfnspec = require(\"@aws-cdk/cfnspec\");\nconst types = require(\"./types\");\nconst util_1 = require(\"./util\");\nfunction diffAttribute(oldValue, newValue) {\n return new types.Difference(_asString(oldValue), _asString(newValue));\n}\nexports.diffAttribute = diffAttribute;\nfunction diffCondition(oldValue, newValue) {\n return new types.ConditionDifference(oldValue, newValue);\n}\nexports.diffCondition = diffCondition;\nfunction diffMapping(oldValue, newValue) {\n return new types.MappingDifference(oldValue, newValue);\n}\nexports.diffMapping = diffMapping;\nfunction diffMetadata(oldValue, newValue) {\n return new types.MetadataDifference(oldValue, newValue);\n}\nexports.diffMetadata = diffMetadata;\nfunction diffOutput(oldValue, newValue) {\n return new types.OutputDifference(oldValue, newValue);\n}\nexports.diffOutput = diffOutput;\nfunction diffParameter(oldValue, newValue) {\n return new types.ParameterDifference(oldValue, newValue);\n}\nexports.diffParameter = diffParameter;\nfunction diffResource(oldValue, newValue) {\n const resourceType = {\n oldType: oldValue && oldValue.Type,\n newType: newValue && newValue.Type,\n };\n let propertyDiffs = {};\n let otherDiffs = {};\n if (resourceType.oldType !== undefined && resourceType.oldType === resourceType.newType) {\n // Only makes sense to inspect deeper if the types stayed the same\n const typeSpec = cfnspec.filteredSpecification(resourceType.oldType);\n const impl = typeSpec.ResourceTypes[resourceType.oldType];\n propertyDiffs = (0, util_1.diffKeyedEntities)(oldValue.Properties, newValue.Properties, (oldVal, newVal, key) => _diffProperty(oldVal, newVal, key, impl));\n otherDiffs = (0, util_1.diffKeyedEntities)(oldValue, newValue, _diffOther);\n delete otherDiffs.Properties;\n }\n return new types.ResourceDifference(oldValue, newValue, {\n resourceType, propertyDiffs, otherDiffs,\n });\n function _diffProperty(oldV, newV, key, resourceSpec) {\n let changeImpact = types.ResourceImpact.NO_CHANGE;\n const spec = resourceSpec && resourceSpec.Properties && resourceSpec.Properties[key];\n if (spec && !(0, util_1.deepEqual)(oldV, newV)) {\n switch (spec.UpdateType) {\n case cfnspec.schema.UpdateType.Immutable:\n changeImpact = types.ResourceImpact.WILL_REPLACE;\n break;\n case cfnspec.schema.UpdateType.Conditional:\n changeImpact = types.ResourceImpact.MAY_REPLACE;\n break;\n default:\n // In those cases, whatever is the current value is what we should keep\n changeImpact = types.ResourceImpact.WILL_UPDATE;\n }\n }\n return new types.PropertyDifference(oldV, newV, { changeImpact });\n }\n function _diffOther(oldV, newV) {\n return new types.Difference(oldV, newV);\n }\n}\nexports.diffResource = diffResource;\nfunction diffUnknown(oldValue, newValue) {\n return new types.Difference(oldValue, newValue);\n}\nexports.diffUnknown = diffUnknown;\n/**\n * Coerces a given value to +string | undefined+.\n *\n * @param value the value to be coerced.\n *\n * @returns +undefined+ if +value+ is +null+ or +undefined+,\n * +value+ if it is a +string+,\n * a compact JSON representation of +value+ otherwise.\n */\nfunction _asString(value) {\n if (value == null) {\n return undefined;\n }\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0Q0FBNEM7QUFDNUMsaUNBQWlDO0FBQ2pDLGlDQUFzRDtBQUV0RCxTQUFnQixhQUFhLENBQUMsUUFBYSxFQUFFLFFBQWE7SUFDeEQsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQVMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFGRCxzQ0FFQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxRQUF5QixFQUFFLFFBQXlCO0lBQ2hGLE9BQU8sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFGRCxzQ0FFQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxRQUF1QixFQUFFLFFBQXVCO0lBQzFFLE9BQU8sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFGRCxrQ0FFQztBQUVELFNBQWdCLFlBQVksQ0FBQyxRQUF3QixFQUFFLFFBQXdCO0lBQzdFLE9BQU8sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFGRCxvQ0FFQztBQUVELFNBQWdCLFVBQVUsQ0FBQyxRQUFzQixFQUFFLFFBQXNCO0lBQ3ZFLE9BQU8sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFGRCxnQ0FFQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxRQUF5QixFQUFFLFFBQXlCO0lBQ2hGLE9BQU8sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFGRCxzQ0FFQztBQUVELFNBQWdCLFlBQVksQ0FBQyxRQUF5QixFQUFFLFFBQXlCO0lBQy9FLE1BQU0sWUFBWSxHQUFHO1FBQ25CLE9BQU8sRUFBRSxRQUFRLElBQUksUUFBUSxDQUFDLElBQUk7UUFDbEMsT0FBTyxFQUFFLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSTtLQUNuQyxDQUFDO0lBQ0YsSUFBSSxhQUFhLEdBQXFELEVBQUUsQ0FBQztJQUN6RSxJQUFJLFVBQVUsR0FBNkMsRUFBRSxDQUFDO0lBRTlELElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsT0FBTyxFQUFFO1FBQ3ZGLGtFQUFrRTtRQUNsRSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFELGFBQWEsR0FBRyxJQUFBLHdCQUFpQixFQUFDLFFBQVMsQ0FBQyxVQUFVLEVBQ3BELFFBQVMsQ0FBQyxVQUFVLEVBQ3BCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXJFLFVBQVUsR0FBRyxJQUFBLHdCQUFpQixFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0QsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDO0tBQzlCO0lBRUQsT0FBTyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFO1FBQ3RELFlBQVksRUFBRSxhQUFhLEVBQUUsVUFBVTtLQUN4QyxDQUFDLENBQUM7SUFFSCxTQUFTLGFBQWEsQ0FBQyxJQUFTLEVBQUUsSUFBUyxFQUFFLEdBQVcsRUFBRSxZQUEwQztRQUNsRyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUVsRCxNQUFNLElBQUksR0FBRyxZQUFZLElBQUksWUFBWSxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JGLElBQUksSUFBSSxJQUFJLENBQUMsSUFBQSxnQkFBUyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNsQyxRQUFRLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3ZCLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUztvQkFDdEMsWUFBWSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO29CQUNqRCxNQUFNO2dCQUNSLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVztvQkFDeEMsWUFBWSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO29CQUNoRCxNQUFNO2dCQUNSO29CQUNFLHVFQUF1RTtvQkFDdkUsWUFBWSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO2FBQ25EO1NBQ0Y7UUFFRCxPQUFPLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFTLEVBQUUsSUFBUztRQUN0QyxPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztBQUNILENBQUM7QUFoREQsb0NBZ0RDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLFFBQWEsRUFBRSxRQUFhO0lBQ3RELE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRkQsa0NBRUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsU0FBUyxDQUFDLEtBQVU7SUFDM0IsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBTyxLQUFlLENBQUM7S0FDeEI7SUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNmbnNwZWMgZnJvbSAnQGF3cy1jZGsvY2Zuc3BlYyc7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgZGlmZktleWVkRW50aXRpZXMgfSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkF0dHJpYnV0ZShvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KTogdHlwZXMuRGlmZmVyZW5jZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5EaWZmZXJlbmNlPHN0cmluZz4oX2FzU3RyaW5nKG9sZFZhbHVlKSwgX2FzU3RyaW5nKG5ld1ZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQ29uZGl0aW9uKG9sZFZhbHVlOiB0eXBlcy5Db25kaXRpb24sIG5ld1ZhbHVlOiB0eXBlcy5Db25kaXRpb24pOiB0eXBlcy5Db25kaXRpb25EaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5Db25kaXRpb25EaWZmZXJlbmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmTWFwcGluZyhvbGRWYWx1ZTogdHlwZXMuTWFwcGluZywgbmV3VmFsdWU6IHR5cGVzLk1hcHBpbmcpOiB0eXBlcy5NYXBwaW5nRGlmZmVyZW5jZSB7XG4gIHJldHVybiBuZXcgdHlwZXMuTWFwcGluZ0RpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZNZXRhZGF0YShvbGRWYWx1ZTogdHlwZXMuTWV0YWRhdGEsIG5ld1ZhbHVlOiB0eXBlcy5NZXRhZGF0YSk6IHR5cGVzLk1ldGFkYXRhRGlmZmVyZW5jZSB7XG4gIHJldHVybiBuZXcgdHlwZXMuTWV0YWRhdGFEaWZmZXJlbmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmT3V0cHV0KG9sZFZhbHVlOiB0eXBlcy5PdXRwdXQsIG5ld1ZhbHVlOiB0eXBlcy5PdXRwdXQpOiB0eXBlcy5PdXRwdXREaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5PdXRwdXREaWZmZXJlbmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmUGFyYW1ldGVyKG9sZFZhbHVlOiB0eXBlcy5QYXJhbWV0ZXIsIG5ld1ZhbHVlOiB0eXBlcy5QYXJhbWV0ZXIpOiB0eXBlcy5QYXJhbWV0ZXJEaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5QYXJhbWV0ZXJEaWZmZXJlbmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmUmVzb3VyY2Uob2xkVmFsdWU/OiB0eXBlcy5SZXNvdXJjZSwgbmV3VmFsdWU/OiB0eXBlcy5SZXNvdXJjZSk6IHR5cGVzLlJlc291cmNlRGlmZmVyZW5jZSB7XG4gIGNvbnN0IHJlc291cmNlVHlwZSA9IHtcbiAgICBvbGRUeXBlOiBvbGRWYWx1ZSAmJiBvbGRWYWx1ZS5UeXBlLFxuICAgIG5ld1R5cGU6IG5ld1ZhbHVlICYmIG5ld1ZhbHVlLlR5cGUsXG4gIH07XG4gIGxldCBwcm9wZXJ0eURpZmZzOiB7IFtrZXk6IHN0cmluZ106IHR5cGVzLlByb3BlcnR5RGlmZmVyZW5jZTxhbnk+IH0gPSB7fTtcbiAgbGV0IG90aGVyRGlmZnM6IHsgW2tleTogc3RyaW5nXTogdHlwZXMuRGlmZmVyZW5jZTxhbnk+IH0gPSB7fTtcblxuICBpZiAocmVzb3VyY2VUeXBlLm9sZFR5cGUgIT09IHVuZGVmaW5lZCAmJiByZXNvdXJjZVR5cGUub2xkVHlwZSA9PT0gcmVzb3VyY2VUeXBlLm5ld1R5cGUpIHtcbiAgICAvLyBPbmx5IG1ha2VzIHNlbnNlIHRvIGluc3BlY3QgZGVlcGVyIGlmIHRoZSB0eXBlcyBzdGF5ZWQgdGhlIHNhbWVcbiAgICBjb25zdCB0eXBlU3BlYyA9IGNmbnNwZWMuZmlsdGVyZWRTcGVjaWZpY2F0aW9uKHJlc291cmNlVHlwZS5vbGRUeXBlKTtcbiAgICBjb25zdCBpbXBsID0gdHlwZVNwZWMuUmVzb3VyY2VUeXBlc1tyZXNvdXJjZVR5cGUub2xkVHlwZV07XG4gICAgcHJvcGVydHlEaWZmcyA9IGRpZmZLZXllZEVudGl0aWVzKG9sZFZhbHVlIS5Qcm9wZXJ0aWVzLFxuICAgICAgbmV3VmFsdWUhLlByb3BlcnRpZXMsXG4gICAgICAob2xkVmFsLCBuZXdWYWwsIGtleSkgPT4gX2RpZmZQcm9wZXJ0eShvbGRWYWwsIG5ld1ZhbCwga2V5LCBpbXBsKSk7XG5cbiAgICBvdGhlckRpZmZzID0gZGlmZktleWVkRW50aXRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCBfZGlmZk90aGVyKTtcbiAgICBkZWxldGUgb3RoZXJEaWZmcy5Qcm9wZXJ0aWVzO1xuICB9XG5cbiAgcmV0dXJuIG5ldyB0eXBlcy5SZXNvdXJjZURpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlLCB7XG4gICAgcmVzb3VyY2VUeXBlLCBwcm9wZXJ0eURpZmZzLCBvdGhlckRpZmZzLFxuICB9KTtcblxuICBmdW5jdGlvbiBfZGlmZlByb3BlcnR5KG9sZFY6IGFueSwgbmV3VjogYW55LCBrZXk6IHN0cmluZywgcmVzb3VyY2VTcGVjPzogY2Zuc3BlYy5zY2hlbWEuUmVzb3VyY2VUeXBlKSB7XG4gICAgbGV0IGNoYW5nZUltcGFjdCA9IHR5cGVzLlJlc291cmNlSW1wYWN0Lk5PX0NIQU5HRTtcblxuICAgIGNvbnN0IHNwZWMgPSByZXNvdXJjZVNwZWMgJiYgcmVzb3VyY2VTcGVjLlByb3BlcnRpZXMgJiYgcmVzb3VyY2VTcGVjLlByb3BlcnRpZXNba2V5XTtcbiAgICBpZiAoc3BlYyAmJiAhZGVlcEVxdWFsKG9sZFYsIG5ld1YpKSB7XG4gICAgICBzd2l0Y2ggKHNwZWMuVXBkYXRlVHlwZSkge1xuICAgICAgICBjYXNlIGNmbnNwZWMuc2NoZW1hLlVwZGF0ZVR5cGUuSW1tdXRhYmxlOlxuICAgICAgICAgIGNoYW5nZUltcGFjdCA9IHR5cGVzLlJlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5VcGRhdGVUeXBlLkNvbmRpdGlvbmFsOlxuICAgICAgICAgIGNoYW5nZUltcGFjdCA9IHR5cGVzLlJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEluIHRob3NlIGNhc2VzLCB3aGF0ZXZlciBpcyB0aGUgY3VycmVudCB2YWx1ZSBpcyB3aGF0IHdlIHNob3VsZCBrZWVwXG4gICAgICAgICAgY2hhbmdlSW1wYWN0ID0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuV0lMTF9VUERBVEU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyB0eXBlcy5Qcm9wZXJ0eURpZmZlcmVuY2Uob2xkViwgbmV3ViwgeyBjaGFuZ2VJbXBhY3QgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBfZGlmZk90aGVyKG9sZFY6IGFueSwgbmV3VjogYW55KSB7XG4gICAgcmV0dXJuIG5ldyB0eXBlcy5EaWZmZXJlbmNlKG9sZFYsIG5ld1YpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmVW5rbm93bihvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KTogdHlwZXMuRGlmZmVyZW5jZTxhbnk+IHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5EaWZmZXJlbmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbi8qKlxuICogQ29lcmNlcyBhIGdpdmVuIHZhbHVlIHRvICtzdHJpbmcgfCB1bmRlZmluZWQrLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgY29lcmNlZC5cbiAqXG4gKiBAcmV0dXJucyArdW5kZWZpbmVkKyBpZiArdmFsdWUrIGlzICtudWxsKyBvciArdW5kZWZpbmVkKyxcbiAqICAgICAgK3ZhbHVlKyBpZiBpdCBpcyBhICtzdHJpbmcrLFxuICogICAgICBhIGNvbXBhY3QgSlNPTiByZXByZXNlbnRhdGlvbiBvZiArdmFsdWUrIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gX2FzU3RyaW5nKHZhbHVlOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgc3RyaW5nO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mkUnparseable = exports.mkParsed = void 0;\nfunction mkParsed(value) {\n return { type: 'parsed', value };\n}\nexports.mkParsed = mkParsed;\nfunction mkUnparseable(value) {\n return {\n type: 'unparseable',\n repr: typeof value === 'string' ? value : JSON.stringify(value),\n };\n}\nexports.mkUnparseable = mkUnparseable;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF5YmUtcGFyc2VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWF5YmUtcGFyc2VkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWVBLFNBQWdCLFFBQVEsQ0FBSSxLQUFRO0lBQ2xDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ25DLENBQUM7QUFGRCw0QkFFQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxLQUFVO0lBQ3RDLE9BQU87UUFDTCxJQUFJLEVBQUUsYUFBYTtRQUNuQixJQUFJLEVBQUUsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0tBQ2hFLENBQUM7QUFDSixDQUFDO0FBTEQsc0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgdmFsdWUgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBwYXJzZWFibGVcbiAqL1xuZXhwb3J0IHR5cGUgTWF5YmVQYXJzZWQ8QT4gPSBQYXJzZWQ8QT4gfCBVbnBhcnNlYWJsZUNmbjtcblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWQ8QT4ge1xuICByZWFkb25seSB0eXBlOiAncGFyc2VkJztcbiAgcmVhZG9ubHkgdmFsdWU6IEE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVW5wYXJzZWFibGVDZm4ge1xuICByZWFkb25seSB0eXBlOiAndW5wYXJzZWFibGUnO1xuICByZWFkb25seSByZXByOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBta1BhcnNlZDxBPih2YWx1ZTogQSk6IFBhcnNlZDxBPiB7XG4gIHJldHVybiB7IHR5cGU6ICdwYXJzZWQnLCB2YWx1ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWtVbnBhcnNlYWJsZSh2YWx1ZTogYW55KTogVW5wYXJzZWFibGVDZm4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1bnBhcnNlYWJsZScsXG4gICAgcmVwcjogdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpLFxuICB9O1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isPropertyDifference = exports.ResourceDifference = exports.ResourceImpact = exports.ParameterDifference = exports.OutputDifference = exports.MetadataDifference = exports.MappingDifference = exports.ConditionDifference = exports.DifferenceCollection = exports.PropertyDifference = exports.Difference = exports.TemplateDiff = void 0;\nconst assert_1 = require(\"assert\");\nconst cfnspec = require(\"@aws-cdk/cfnspec\");\nconst util_1 = require(\"./util\");\nconst iam_changes_1 = require(\"../iam/iam-changes\");\nconst security_group_changes_1 = require(\"../network/security-group-changes\");\n/** Semantic differences between two CloudFormation templates. */\nclass TemplateDiff {\n constructor(args) {\n if (args.awsTemplateFormatVersion !== undefined) {\n this.awsTemplateFormatVersion = args.awsTemplateFormatVersion;\n }\n if (args.description !== undefined) {\n this.description = args.description;\n }\n if (args.transform !== undefined) {\n this.transform = args.transform;\n }\n this.conditions = args.conditions || new DifferenceCollection({});\n this.mappings = args.mappings || new DifferenceCollection({});\n this.metadata = args.metadata || new DifferenceCollection({});\n this.outputs = args.outputs || new DifferenceCollection({});\n this.parameters = args.parameters || new DifferenceCollection({});\n this.resources = args.resources || new DifferenceCollection({});\n this.unknown = args.unknown || new DifferenceCollection({});\n this.iamChanges = new iam_changes_1.IamChanges({\n propertyChanges: this.scrutinizablePropertyChanges(iam_changes_1.IamChanges.IamPropertyScrutinies),\n resourceChanges: this.scrutinizableResourceChanges(iam_changes_1.IamChanges.IamResourceScrutinies),\n });\n this.securityGroupChanges = new security_group_changes_1.SecurityGroupChanges({\n egressRulePropertyChanges: this.scrutinizablePropertyChanges([cfnspec.schema.PropertyScrutinyType.EgressRules]),\n ingressRulePropertyChanges: this.scrutinizablePropertyChanges([cfnspec.schema.PropertyScrutinyType.IngressRules]),\n egressRuleResourceChanges: this.scrutinizableResourceChanges([cfnspec.schema.ResourceScrutinyType.EgressRuleResource]),\n ingressRuleResourceChanges: this.scrutinizableResourceChanges([cfnspec.schema.ResourceScrutinyType.IngressRuleResource]),\n });\n }\n get differenceCount() {\n let count = 0;\n if (this.awsTemplateFormatVersion !== undefined) {\n count += 1;\n }\n if (this.description !== undefined) {\n count += 1;\n }\n if (this.transform !== undefined) {\n count += 1;\n }\n count += this.conditions.differenceCount;\n count += this.mappings.differenceCount;\n count += this.metadata.differenceCount;\n count += this.outputs.differenceCount;\n count += this.parameters.differenceCount;\n count += this.resources.differenceCount;\n count += this.unknown.differenceCount;\n return count;\n }\n get isEmpty() {\n return this.differenceCount === 0;\n }\n /**\n * Return true if any of the permissions objects involve a broadening of permissions\n */\n get permissionsBroadened() {\n return this.iamChanges.permissionsBroadened || this.securityGroupChanges.rulesAdded;\n }\n /**\n * Return true if any of the permissions objects have changed\n */\n get permissionsAnyChanges() {\n return this.iamChanges.hasChanges || this.securityGroupChanges.hasChanges;\n }\n /**\n * Return all property changes of a given scrutiny type\n *\n * We don't just look at property updates; we also look at resource additions and deletions (in which\n * case there is no further detail on property values), and resource type changes.\n */\n scrutinizablePropertyChanges(scrutinyTypes) {\n const ret = new Array();\n for (const [resourceLogicalId, resourceChange] of Object.entries(this.resources.changes)) {\n if (resourceChange.resourceTypeChanged) {\n // we ignore resource type changes here, and handle them in scrutinizableResourceChanges()\n continue;\n }\n const props = cfnspec.scrutinizablePropertyNames(resourceChange.newResourceType, scrutinyTypes);\n for (const propertyName of props) {\n ret.push({\n resourceLogicalId,\n propertyName,\n resourceType: resourceChange.resourceType,\n scrutinyType: cfnspec.propertySpecification(resourceChange.resourceType, propertyName).ScrutinyType,\n oldValue: resourceChange.oldProperties && resourceChange.oldProperties[propertyName],\n newValue: resourceChange.newProperties && resourceChange.newProperties[propertyName],\n });\n }\n }\n return ret;\n }\n /**\n * Return all resource changes of a given scrutiny type\n *\n * We don't just look at resource updates; we also look at resource additions and deletions (in which\n * case there is no further detail on property values), and resource type changes.\n */\n scrutinizableResourceChanges(scrutinyTypes) {\n const ret = new Array();\n const scrutinizableTypes = new Set(cfnspec.scrutinizableResourceTypes(scrutinyTypes));\n for (const [resourceLogicalId, resourceChange] of Object.entries(this.resources.changes)) {\n if (!resourceChange) {\n continue;\n }\n const commonProps = {\n oldProperties: resourceChange.oldProperties,\n newProperties: resourceChange.newProperties,\n resourceLogicalId,\n };\n // changes to the Type of resources can happen when migrating from CFN templates that use Transforms\n if (resourceChange.resourceTypeChanged) {\n // Treat as DELETE+ADD\n if (scrutinizableTypes.has(resourceChange.oldResourceType)) {\n ret.push({\n ...commonProps,\n newProperties: undefined,\n resourceType: resourceChange.oldResourceType,\n scrutinyType: cfnspec.resourceSpecification(resourceChange.oldResourceType).ScrutinyType,\n });\n }\n if (scrutinizableTypes.has(resourceChange.newResourceType)) {\n ret.push({\n ...commonProps,\n oldProperties: undefined,\n resourceType: resourceChange.newResourceType,\n scrutinyType: cfnspec.resourceSpecification(resourceChange.newResourceType).ScrutinyType,\n });\n }\n }\n else {\n if (scrutinizableTypes.has(resourceChange.resourceType)) {\n ret.push({\n ...commonProps,\n resourceType: resourceChange.resourceType,\n scrutinyType: cfnspec.resourceSpecification(resourceChange.resourceType).ScrutinyType,\n });\n }\n }\n }\n return ret;\n }\n}\nexports.TemplateDiff = TemplateDiff;\n/**\n * Models an entity that changed between two versions of a CloudFormation template.\n */\nclass Difference {\n /**\n * @param oldValue the old value, cannot be equal (to the sense of +deepEqual+) to +newValue+.\n * @param newValue the new value, cannot be equal (to the sense of +deepEqual+) to +oldValue+.\n */\n constructor(oldValue, newValue) {\n this.oldValue = oldValue;\n this.newValue = newValue;\n if (oldValue === undefined && newValue === undefined) {\n throw new assert_1.AssertionError({ message: 'oldValue and newValue are both undefined!' });\n }\n this.isDifferent = !(0, util_1.deepEqual)(oldValue, newValue);\n }\n /** @returns +true+ if the element is new to the template. */\n get isAddition() {\n return this.oldValue === undefined;\n }\n /** @returns +true+ if the element was removed from the template. */\n get isRemoval() {\n return this.newValue === undefined;\n }\n /** @returns +true+ if the element was already in the template and is updated. */\n get isUpdate() {\n return this.oldValue !== undefined\n && this.newValue !== undefined;\n }\n}\nexports.Difference = Difference;\nclass PropertyDifference extends Difference {\n constructor(oldValue, newValue, args) {\n super(oldValue, newValue);\n this.changeImpact = args.changeImpact;\n }\n}\nexports.PropertyDifference = PropertyDifference;\nclass DifferenceCollection {\n constructor(diffs) {\n this.diffs = diffs;\n }\n get changes() {\n return onlyChanges(this.diffs);\n }\n get differenceCount() {\n return Object.values(this.changes).length;\n }\n get(logicalId) {\n const ret = this.diffs[logicalId];\n if (!ret) {\n throw new Error(`No object with logical ID '${logicalId}'`);\n }\n return ret;\n }\n get logicalIds() {\n return Object.keys(this.changes);\n }\n /**\n * Returns a new TemplateDiff which only contains changes for which `predicate`\n * returns `true`.\n */\n filter(predicate) {\n const newChanges = {};\n for (const id of Object.keys(this.changes)) {\n const diff = this.changes[id];\n if (predicate(diff)) {\n newChanges[id] = diff;\n }\n }\n return new DifferenceCollection(newChanges);\n }\n /**\n * Invokes `cb` for all changes in this collection.\n *\n * Changes will be sorted as follows:\n * - Removed\n * - Added\n * - Updated\n * - Others\n *\n * @param cb\n */\n forEachDifference(cb) {\n const removed = new Array();\n const added = new Array();\n const updated = new Array();\n const others = new Array();\n for (const logicalId of this.logicalIds) {\n const change = this.changes[logicalId];\n if (change.isAddition) {\n added.push({ logicalId, change });\n }\n else if (change.isRemoval) {\n removed.push({ logicalId, change });\n }\n else if (change.isUpdate) {\n updated.push({ logicalId, change });\n }\n else if (change.isDifferent) {\n others.push({ logicalId, change });\n }\n }\n removed.forEach(v => cb(v.logicalId, v.change));\n added.forEach(v => cb(v.logicalId, v.change));\n updated.forEach(v => cb(v.logicalId, v.change));\n others.forEach(v => cb(v.logicalId, v.change));\n }\n}\nexports.DifferenceCollection = DifferenceCollection;\nclass ConditionDifference extends Difference {\n}\nexports.ConditionDifference = ConditionDifference;\nclass MappingDifference extends Difference {\n}\nexports.MappingDifference = MappingDifference;\nclass MetadataDifference extends Difference {\n}\nexports.MetadataDifference = MetadataDifference;\nclass OutputDifference extends Difference {\n}\nexports.OutputDifference = OutputDifference;\nclass ParameterDifference extends Difference {\n}\nexports.ParameterDifference = ParameterDifference;\nvar ResourceImpact;\n(function (ResourceImpact) {\n /** The existing physical resource will be updated */\n ResourceImpact[\"WILL_UPDATE\"] = \"WILL_UPDATE\";\n /** A new physical resource will be created */\n ResourceImpact[\"WILL_CREATE\"] = \"WILL_CREATE\";\n /** The existing physical resource will be replaced */\n ResourceImpact[\"WILL_REPLACE\"] = \"WILL_REPLACE\";\n /** The existing physical resource may be replaced */\n ResourceImpact[\"MAY_REPLACE\"] = \"MAY_REPLACE\";\n /** The existing physical resource will be destroyed */\n ResourceImpact[\"WILL_DESTROY\"] = \"WILL_DESTROY\";\n /** The existing physical resource will be removed from CloudFormation supervision */\n ResourceImpact[\"WILL_ORPHAN\"] = \"WILL_ORPHAN\";\n /** There is no change in this resource */\n ResourceImpact[\"NO_CHANGE\"] = \"NO_CHANGE\";\n})(ResourceImpact || (exports.ResourceImpact = ResourceImpact = {}));\n/**\n * This function can be used as a reducer to obtain the resource-level impact of a list\n * of property-level impacts.\n * @param one the current worst impact so far.\n * @param two the new impact being considered (can be undefined, as we may not always be\n * able to determine some peroperty's impact).\n */\nfunction worstImpact(one, two) {\n if (!two) {\n return one;\n }\n const badness = {\n [ResourceImpact.NO_CHANGE]: 0,\n [ResourceImpact.WILL_UPDATE]: 1,\n [ResourceImpact.WILL_CREATE]: 2,\n [ResourceImpact.WILL_ORPHAN]: 3,\n [ResourceImpact.MAY_REPLACE]: 4,\n [ResourceImpact.WILL_REPLACE]: 5,\n [ResourceImpact.WILL_DESTROY]: 6,\n };\n return badness[one] > badness[two] ? one : two;\n}\n/**\n * Change to a single resource between two CloudFormation templates\n *\n * This class can be mutated after construction.\n */\nclass ResourceDifference {\n constructor(oldValue, newValue, args) {\n this.oldValue = oldValue;\n this.newValue = newValue;\n this.resourceTypes = args.resourceType;\n this.propertyDiffs = args.propertyDiffs;\n this.otherDiffs = args.otherDiffs;\n this.isAddition = oldValue === undefined;\n this.isRemoval = newValue === undefined;\n }\n get oldProperties() {\n return this.oldValue && this.oldValue.Properties;\n }\n get newProperties() {\n return this.newValue && this.newValue.Properties;\n }\n /**\n * Whether this resource was modified at all\n */\n get isDifferent() {\n return this.differenceCount > 0 || this.oldResourceType !== this.newResourceType;\n }\n /**\n * Whether the resource was updated in-place\n */\n get isUpdate() {\n return this.isDifferent && !this.isAddition && !this.isRemoval;\n }\n get oldResourceType() {\n return this.resourceTypes.oldType;\n }\n get newResourceType() {\n return this.resourceTypes.newType;\n }\n /**\n * All actual property updates\n */\n get propertyUpdates() {\n return onlyChanges(this.propertyDiffs);\n }\n /**\n * All actual \"other\" updates\n */\n get otherChanges() {\n return onlyChanges(this.otherDiffs);\n }\n /**\n * Return whether the resource type was changed in this diff\n *\n * This is not a valid operation in CloudFormation but to be defensive we're going\n * to be aware of it anyway.\n */\n get resourceTypeChanged() {\n return (this.resourceTypes.oldType !== undefined\n && this.resourceTypes.newType !== undefined\n && this.resourceTypes.oldType !== this.resourceTypes.newType);\n }\n /**\n * Return the resource type if it was unchanged\n *\n * If the resource type was changed, it's an error to call this.\n */\n get resourceType() {\n if (this.resourceTypeChanged) {\n throw new Error('Cannot get .resourceType, because the type was changed');\n }\n return this.resourceTypes.oldType || this.resourceTypes.newType;\n }\n /**\n * Replace a PropertyChange in this object\n *\n * This affects the property diff as it is summarized to users, but it DOES\n * NOT affect either the \"oldValue\" or \"newValue\" values; those still contain\n * the actual template values as provided by the user (they might still be\n * used for downstream processing).\n */\n setPropertyChange(propertyName, change) {\n this.propertyDiffs[propertyName] = change;\n }\n get changeImpact() {\n // Check the Type first\n if (this.resourceTypes.oldType !== this.resourceTypes.newType) {\n if (this.resourceTypes.oldType === undefined) {\n return ResourceImpact.WILL_CREATE;\n }\n if (this.resourceTypes.newType === undefined) {\n return this.oldValue.DeletionPolicy === 'Retain'\n ? ResourceImpact.WILL_ORPHAN\n : ResourceImpact.WILL_DESTROY;\n }\n return ResourceImpact.WILL_REPLACE;\n }\n // Base impact (before we mix in the worst of the property impacts);\n // WILL_UPDATE if we have \"other\" changes, NO_CHANGE if there are no \"other\" changes.\n const baseImpact = Object.keys(this.otherChanges).length > 0 ? ResourceImpact.WILL_UPDATE : ResourceImpact.NO_CHANGE;\n return Object.values(this.propertyDiffs)\n .map(elt => elt.changeImpact)\n .reduce(worstImpact, baseImpact);\n }\n /**\n * Count of actual differences (not of elements)\n */\n get differenceCount() {\n return Object.values(this.propertyUpdates).length\n + Object.values(this.otherChanges).length;\n }\n /**\n * Invoke a callback for each actual difference\n */\n forEachDifference(cb) {\n for (const key of Object.keys(this.propertyUpdates).sort()) {\n cb('Property', key, this.propertyUpdates[key]);\n }\n for (const key of Object.keys(this.otherChanges).sort()) {\n cb('Other', key, this.otherDiffs[key]);\n }\n }\n}\nexports.ResourceDifference = ResourceDifference;\nfunction isPropertyDifference(diff) {\n return diff.changeImpact !== undefined;\n}\nexports.isPropertyDifference = isPropertyDifference;\n/**\n * Filter a map of IDifferences down to only retain the actual changes\n */\nfunction onlyChanges(xs) {\n const ret = {};\n for (const [key, diff] of Object.entries(xs)) {\n if (diff.isDifferent) {\n ret[key] = diff;\n }\n }\n return ret;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBd0M7QUFDeEMsNENBQTRDO0FBQzVDLGlDQUFtQztBQUNuQyxvREFBZ0Q7QUFDaEQsOEVBQXlFO0FBSXpFLGlFQUFpRTtBQUNqRSxNQUFhLFlBQVk7SUF1QnZCLFlBQVksSUFBbUI7UUFDN0IsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUssU0FBUyxFQUFFO1lBQy9DLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7U0FDL0Q7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUNyQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHdCQUFVLENBQUM7WUFDL0IsZUFBZSxFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyx3QkFBVSxDQUFDLHFCQUFxQixDQUFDO1lBQ3BGLGVBQWUsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsd0JBQVUsQ0FBQyxxQkFBcUIsQ0FBQztTQUNyRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSw2Q0FBb0IsQ0FBQztZQUNuRCx5QkFBeUIsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9HLDBCQUEwQixFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakgseUJBQXlCLEVBQUUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3RILDBCQUEwQixFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN6SCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUVkLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtZQUMvQyxLQUFLLElBQUksQ0FBQyxDQUFDO1NBQ1o7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLEtBQUssSUFBSSxDQUFDLENBQUM7U0FDWjtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUNaO1FBRUQsS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO1FBQ3pDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUN2QyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDdkMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBQ3RDLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN6QyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7UUFDeEMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBRXRDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDO0lBQ3RGLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcscUJBQXFCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyw0QkFBNEIsQ0FBQyxhQUFvRDtRQUN2RixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBa0IsQ0FBQztRQUV4QyxLQUFLLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxjQUFjLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEYsSUFBSSxjQUFjLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3RDLDBGQUEwRjtnQkFDMUYsU0FBUzthQUNWO1lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxlQUFnQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ2pHLEtBQUssTUFBTSxZQUFZLElBQUksS0FBSyxFQUFFO2dCQUNoQyxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUNQLGlCQUFpQjtvQkFDakIsWUFBWTtvQkFDWixZQUFZLEVBQUUsY0FBYyxDQUFDLFlBQVk7b0JBQ3pDLFlBQVksRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQyxZQUFhO29CQUNwRyxRQUFRLEVBQUUsY0FBYyxDQUFDLGFBQWEsSUFBSSxjQUFjLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztvQkFDcEYsUUFBUSxFQUFFLGNBQWMsQ0FBQyxhQUFhLElBQUksY0FBYyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7aUJBQ3JGLENBQUMsQ0FBQzthQUNKO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLDRCQUE0QixDQUFDLGFBQW9EO1FBQ3ZGLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFrQixDQUFDO1FBRXhDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFFdEYsS0FBSyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3hGLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBRWxDLE1BQU0sV0FBVyxHQUFHO2dCQUNsQixhQUFhLEVBQUUsY0FBYyxDQUFDLGFBQWE7Z0JBQzNDLGFBQWEsRUFBRSxjQUFjLENBQUMsYUFBYTtnQkFDM0MsaUJBQWlCO2FBQ2xCLENBQUM7WUFFRixvR0FBb0c7WUFDcEcsSUFBSSxjQUFjLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3RDLHNCQUFzQjtnQkFDdEIsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLGVBQWdCLENBQUMsRUFBRTtvQkFDM0QsR0FBRyxDQUFDLElBQUksQ0FBQzt3QkFDUCxHQUFHLFdBQVc7d0JBQ2QsYUFBYSxFQUFFLFNBQVM7d0JBQ3hCLFlBQVksRUFBRSxjQUFjLENBQUMsZUFBZ0I7d0JBQzdDLFlBQVksRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLGVBQWdCLENBQUMsQ0FBQyxZQUFhO3FCQUMzRixDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLGVBQWdCLENBQUMsRUFBRTtvQkFDM0QsR0FBRyxDQUFDLElBQUksQ0FBQzt3QkFDUCxHQUFHLFdBQVc7d0JBQ2QsYUFBYSxFQUFFLFNBQVM7d0JBQ3hCLFlBQVksRUFBRSxjQUFjLENBQUMsZUFBZ0I7d0JBQzdDLFlBQVksRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLGVBQWdCLENBQUMsQ0FBQyxZQUFhO3FCQUMzRixDQUFDLENBQUM7aUJBQ0o7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUU7b0JBQ3ZELEdBQUcsQ0FBQyxJQUFJLENBQUM7d0JBQ1AsR0FBRyxXQUFXO3dCQUNkLFlBQVksRUFBRSxjQUFjLENBQUMsWUFBWTt3QkFDekMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsWUFBYTtxQkFDdkYsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7U0FDRjtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBcExELG9DQW9MQztBQW1GRDs7R0FFRztBQUNILE1BQWEsVUFBVTtJQVFyQjs7O09BR0c7SUFDSCxZQUE0QixRQUErQixFQUFrQixRQUErQjtRQUFoRixhQUFRLEdBQVIsUUFBUSxDQUF1QjtRQUFrQixhQUFRLEdBQVIsUUFBUSxDQUF1QjtRQUMxRyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUNwRCxNQUFNLElBQUksdUJBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSwyQ0FBMkMsRUFBRSxDQUFDLENBQUM7U0FDcEY7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBQSxnQkFBUyxFQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7SUFDckMsQ0FBQztJQUVELGlGQUFpRjtJQUNqRixJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVM7ZUFDN0IsSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBbENELGdDQWtDQztBQUVELE1BQWEsa0JBQThCLFNBQVEsVUFBcUI7SUFHdEUsWUFBWSxRQUErQixFQUFFLFFBQStCLEVBQUUsSUFBdUM7UUFDbkgsS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDeEMsQ0FBQztDQUNGO0FBUEQsZ0RBT0M7QUFFRCxNQUFhLG9CQUFvQjtJQUMvQixZQUE2QixLQUFpQztRQUFqQyxVQUFLLEdBQUwsS0FBSyxDQUE0QjtJQUFHLENBQUM7SUFFbEUsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVDLENBQUM7SUFFTSxHQUFHLENBQUMsU0FBaUI7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsU0FBUyxHQUFHLENBQUMsQ0FBQztTQUFFO1FBQzFFLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsU0FBMkM7UUFDdkQsTUFBTSxVQUFVLEdBQStCLEVBQUcsQ0FBQztRQUNuRCxLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFOUIsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25CLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDdkI7U0FDRjtRQUVELE9BQU8sSUFBSSxvQkFBb0IsQ0FBTyxVQUFVLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGlCQUFpQixDQUFDLEVBQXlDO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxFQUFvQyxDQUFDO1FBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFvQyxDQUFDO1FBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxFQUFvQyxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxFQUFvQyxDQUFDO1FBRTdELEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN2QyxNQUFNLE1BQU0sR0FBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBRSxDQUFDO1lBQzNDLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtnQkFDckIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ25DO2lCQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ3JDO2lCQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ3JDO2lCQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtnQkFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ3BDO1NBQ0Y7UUFFRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDaEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNGO0FBekVELG9EQXlFQztBQXNCRCxNQUFhLG1CQUFvQixTQUFRLFVBQXFCO0NBRTdEO0FBRkQsa0RBRUM7QUFHRCxNQUFhLGlCQUFrQixTQUFRLFVBQW1CO0NBRXpEO0FBRkQsOENBRUM7QUFHRCxNQUFhLGtCQUFtQixTQUFRLFVBQW9CO0NBRTNEO0FBRkQsZ0RBRUM7QUFHRCxNQUFhLGdCQUFpQixTQUFRLFVBQWtCO0NBRXZEO0FBRkQsNENBRUM7QUFHRCxNQUFhLG1CQUFvQixTQUFRLFVBQXFCO0NBRTdEO0FBRkQsa0RBRUM7QUFFRCxJQUFZLGNBZVg7QUFmRCxXQUFZLGNBQWM7SUFDeEIscURBQXFEO0lBQ3JELDZDQUEyQixDQUFBO0lBQzNCLDhDQUE4QztJQUM5Qyw2Q0FBMkIsQ0FBQTtJQUMzQixzREFBc0Q7SUFDdEQsK0NBQTZCLENBQUE7SUFDN0IscURBQXFEO0lBQ3JELDZDQUEyQixDQUFBO0lBQzNCLHVEQUF1RDtJQUN2RCwrQ0FBNkIsQ0FBQTtJQUM3QixxRkFBcUY7SUFDckYsNkNBQTJCLENBQUE7SUFDM0IsMENBQTBDO0lBQzFDLHlDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFmVyxjQUFjLDhCQUFkLGNBQWMsUUFlekI7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxHQUFtQixFQUFFLEdBQW9CO0lBQzVELElBQUksQ0FBQyxHQUFHLEVBQUU7UUFBRSxPQUFPLEdBQUcsQ0FBQztLQUFFO0lBQ3pCLE1BQU0sT0FBTyxHQUFHO1FBQ2QsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM3QixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQy9CLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMvQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQy9CLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDaEMsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztLQUNqQyxDQUFDO0lBQ0YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUNqRCxDQUFDO0FBU0Q7Ozs7R0FJRztBQUNILE1BQWEsa0JBQWtCO0lBb0I3QixZQUNrQixRQUE4QixFQUM5QixRQUE4QixFQUM5QyxJQUlDO1FBTmUsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7UUFDOUIsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7UUFPOUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLEtBQUssU0FBUyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxLQUFLLFNBQVMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDbkYsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFlBQVk7UUFDckIsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsbUJBQW1CO1FBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxTQUFTO2VBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxLQUFLLFNBQVM7ZUFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQVcsWUFBWTtRQUNyQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7U0FDM0U7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBUSxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksaUJBQWlCLENBQUMsWUFBb0IsRUFBRSxNQUErQjtRQUM1RSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLHVCQUF1QjtRQUN2QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFO1lBQzdELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUFFLE9BQU8sY0FBYyxDQUFDLFdBQVcsQ0FBQzthQUFFO1lBQ3BGLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUM1QyxPQUFPLElBQUksQ0FBQyxRQUFTLENBQUMsY0FBYyxLQUFLLFFBQVE7b0JBQy9DLENBQUMsQ0FBQyxjQUFjLENBQUMsV0FBVztvQkFDNUIsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7YUFDakM7WUFDRCxPQUFPLGNBQWMsQ0FBQyxZQUFZLENBQUM7U0FDcEM7UUFFRCxvRUFBb0U7UUFDcEUscUZBQXFGO1FBQ3JGLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7UUFFckgsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7YUFDckMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQzthQUM1QixNQUFNLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZUFBZTtRQUN4QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU07Y0FDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQixDQUFDLEVBQXVHO1FBQzlILEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDMUQsRUFBRSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2RCxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDeEM7SUFDSCxDQUFDO0NBQ0Y7QUE3SkQsZ0RBNkpDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUksSUFBbUI7SUFDekQsT0FBUSxJQUE4QixDQUFDLFlBQVksS0FBSyxTQUFTLENBQUM7QUFDcEUsQ0FBQztBQUZELG9EQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FBOEIsRUFBc0I7SUFDdEUsTUFBTSxHQUFHLEdBQXlCLEVBQUUsQ0FBQztJQUNyQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUM1QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUNqQjtLQUNGO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNzZXJ0aW9uRXJyb3IgfSBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgY2Zuc3BlYyBmcm9tICdAYXdzLWNkay9jZm5zcGVjJztcbmltcG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBJYW1DaGFuZ2VzIH0gZnJvbSAnLi4vaWFtL2lhbS1jaGFuZ2VzJztcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXBDaGFuZ2VzIH0gZnJvbSAnLi4vbmV0d29yay9zZWN1cml0eS1ncm91cC1jaGFuZ2VzJztcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlNYXAgPSB7W2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKiBTZW1hbnRpYyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZXMuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVEaWZmIGltcGxlbWVudHMgSVRlbXBsYXRlRGlmZiB7XG4gIHB1YmxpYyBhd3NUZW1wbGF0ZUZvcm1hdFZlcnNpb24/OiBEaWZmZXJlbmNlPHN0cmluZz47XG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IERpZmZlcmVuY2U8c3RyaW5nPjtcbiAgcHVibGljIHRyYW5zZm9ybT86IERpZmZlcmVuY2U8c3RyaW5nPjtcbiAgcHVibGljIGNvbmRpdGlvbnM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPENvbmRpdGlvbiwgQ29uZGl0aW9uRGlmZmVyZW5jZT47XG4gIHB1YmxpYyBtYXBwaW5nczogRGlmZmVyZW5jZUNvbGxlY3Rpb248TWFwcGluZywgTWFwcGluZ0RpZmZlcmVuY2U+O1xuICBwdWJsaWMgbWV0YWRhdGE6IERpZmZlcmVuY2VDb2xsZWN0aW9uPE1ldGFkYXRhLCBNZXRhZGF0YURpZmZlcmVuY2U+O1xuICBwdWJsaWMgb3V0cHV0czogRGlmZmVyZW5jZUNvbGxlY3Rpb248T3V0cHV0LCBPdXRwdXREaWZmZXJlbmNlPjtcbiAgcHVibGljIHBhcmFtZXRlcnM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPFBhcmFtZXRlciwgUGFyYW1ldGVyRGlmZmVyZW5jZT47XG4gIHB1YmxpYyByZXNvdXJjZXM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPFJlc291cmNlLCBSZXNvdXJjZURpZmZlcmVuY2U+O1xuICAvKiogVGhlIGRpZmZlcmVuY2VzIGluIHVua25vd24vdW5leHBlY3RlZCBwYXJ0cyBvZiB0aGUgdGVtcGxhdGUgKi9cbiAgcHVibGljIHVua25vd246IERpZmZlcmVuY2VDb2xsZWN0aW9uPGFueSwgRGlmZmVyZW5jZTxhbnk+PjtcblxuICAvKipcbiAgICogQ2hhbmdlcyB0byBJQU0gcG9saWNpZXNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpYW1DaGFuZ2VzOiBJYW1DaGFuZ2VzO1xuXG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRvIFNlY3VyaXR5IEdyb3VwIGluZ3Jlc3MgYW5kIGVncmVzcyBydWxlc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBDaGFuZ2VzOiBTZWN1cml0eUdyb3VwQ2hhbmdlcztcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBJVGVtcGxhdGVEaWZmKSB7XG4gICAgaWYgKGFyZ3MuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uID0gYXJncy5hd3NUZW1wbGF0ZUZvcm1hdFZlcnNpb247XG4gICAgfVxuICAgIGlmIChhcmdzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBhcmdzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAoYXJncy50cmFuc2Zvcm0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy50cmFuc2Zvcm0gPSBhcmdzLnRyYW5zZm9ybTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmRpdGlvbnMgPSBhcmdzLmNvbmRpdGlvbnMgfHwgbmV3IERpZmZlcmVuY2VDb2xsZWN0aW9uKHt9KTtcbiAgICB0aGlzLm1hcHBpbmdzID0gYXJncy5tYXBwaW5ncyB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuICAgIHRoaXMubWV0YWRhdGEgPSBhcmdzLm1ldGFkYXRhIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5vdXRwdXRzID0gYXJncy5vdXRwdXRzIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5wYXJhbWV0ZXJzID0gYXJncy5wYXJhbWV0ZXJzIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5yZXNvdXJjZXMgPSBhcmdzLnJlc291cmNlcyB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuICAgIHRoaXMudW5rbm93biA9IGFyZ3MudW5rbm93biB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuXG4gICAgdGhpcy5pYW1DaGFuZ2VzID0gbmV3IElhbUNoYW5nZXMoe1xuICAgICAgcHJvcGVydHlDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVQcm9wZXJ0eUNoYW5nZXMoSWFtQ2hhbmdlcy5JYW1Qcm9wZXJ0eVNjcnV0aW5pZXMpLFxuICAgICAgcmVzb3VyY2VDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVSZXNvdXJjZUNoYW5nZXMoSWFtQ2hhbmdlcy5JYW1SZXNvdXJjZVNjcnV0aW5pZXMpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWN1cml0eUdyb3VwQ2hhbmdlcyA9IG5ldyBTZWN1cml0eUdyb3VwQ2hhbmdlcyh7XG4gICAgICBlZ3Jlc3NSdWxlUHJvcGVydHlDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVQcm9wZXJ0eUNoYW5nZXMoW2NmbnNwZWMuc2NoZW1hLlByb3BlcnR5U2NydXRpbnlUeXBlLkVncmVzc1J1bGVzXSksXG4gICAgICBpbmdyZXNzUnVsZVByb3BlcnR5Q2hhbmdlczogdGhpcy5zY3J1dGluaXphYmxlUHJvcGVydHlDaGFuZ2VzKFtjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmdyZXNzUnVsZXNdKSxcbiAgICAgIGVncmVzc1J1bGVSZXNvdXJjZUNoYW5nZXM6IHRoaXMuc2NydXRpbml6YWJsZVJlc291cmNlQ2hhbmdlcyhbY2Zuc3BlYy5zY2hlbWEuUmVzb3VyY2VTY3J1dGlueVR5cGUuRWdyZXNzUnVsZVJlc291cmNlXSksXG4gICAgICBpbmdyZXNzUnVsZVJlc291cmNlQ2hhbmdlczogdGhpcy5zY3J1dGluaXphYmxlUmVzb3VyY2VDaGFuZ2VzKFtjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZS5JbmdyZXNzUnVsZVJlc291cmNlXSksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuXG4gICAgaWYgKHRoaXMuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLnRyYW5zZm9ybSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cblxuICAgIGNvdW50ICs9IHRoaXMuY29uZGl0aW9ucy5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5tYXBwaW5ncy5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5tZXRhZGF0YS5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5vdXRwdXRzLmRpZmZlcmVuY2VDb3VudDtcbiAgICBjb3VudCArPSB0aGlzLnBhcmFtZXRlcnMuZGlmZmVyZW5jZUNvdW50O1xuICAgIGNvdW50ICs9IHRoaXMucmVzb3VyY2VzLmRpZmZlcmVuY2VDb3VudDtcbiAgICBjb3VudCArPSB0aGlzLnVua25vd24uZGlmZmVyZW5jZUNvdW50O1xuXG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpZmZlcmVuY2VDb3VudCA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIHBlcm1pc3Npb25zIG9iamVjdHMgaW52b2x2ZSBhIGJyb2FkZW5pbmcgb2YgcGVybWlzc2lvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnNCcm9hZGVuZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWFtQ2hhbmdlcy5wZXJtaXNzaW9uc0Jyb2FkZW5lZCB8fCB0aGlzLnNlY3VyaXR5R3JvdXBDaGFuZ2VzLnJ1bGVzQWRkZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBwZXJtaXNzaW9ucyBvYmplY3RzIGhhdmUgY2hhbmdlZFxuICAgKi9cbiAgcHVibGljIGdldCBwZXJtaXNzaW9uc0FueUNoYW5nZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWFtQ2hhbmdlcy5oYXNDaGFuZ2VzIHx8IHRoaXMuc2VjdXJpdHlHcm91cENoYW5nZXMuaGFzQ2hhbmdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIHByb3BlcnR5IGNoYW5nZXMgb2YgYSBnaXZlbiBzY3J1dGlueSB0eXBlXG4gICAqXG4gICAqIFdlIGRvbid0IGp1c3QgbG9vayBhdCBwcm9wZXJ0eSB1cGRhdGVzOyB3ZSBhbHNvIGxvb2sgYXQgcmVzb3VyY2UgYWRkaXRpb25zIGFuZCBkZWxldGlvbnMgKGluIHdoaWNoXG4gICAqIGNhc2UgdGhlcmUgaXMgbm8gZnVydGhlciBkZXRhaWwgb24gcHJvcGVydHkgdmFsdWVzKSwgYW5kIHJlc291cmNlIHR5cGUgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgc2NydXRpbml6YWJsZVByb3BlcnR5Q2hhbmdlcyhzY3J1dGlueVR5cGVzOiBjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZVtdKTogUHJvcGVydHlDaGFuZ2VbXSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFByb3BlcnR5Q2hhbmdlPigpO1xuXG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2VMb2dpY2FsSWQsIHJlc291cmNlQ2hhbmdlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnJlc291cmNlcy5jaGFuZ2VzKSkge1xuICAgICAgaWYgKHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgICAgLy8gd2UgaWdub3JlIHJlc291cmNlIHR5cGUgY2hhbmdlcyBoZXJlLCBhbmQgaGFuZGxlIHRoZW0gaW4gc2NydXRpbml6YWJsZVJlc291cmNlQ2hhbmdlcygpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wcyA9IGNmbnNwZWMuc2NydXRpbml6YWJsZVByb3BlcnR5TmFtZXMocmVzb3VyY2VDaGFuZ2UubmV3UmVzb3VyY2VUeXBlISwgc2NydXRpbnlUeXBlcyk7XG4gICAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBwcm9wcykge1xuICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgcmVzb3VyY2VMb2dpY2FsSWQsXG4gICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgIHJlc291cmNlVHlwZTogcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VUeXBlLFxuICAgICAgICAgIHNjcnV0aW55VHlwZTogY2Zuc3BlYy5wcm9wZXJ0eVNwZWNpZmljYXRpb24ocmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VUeXBlLCBwcm9wZXJ0eU5hbWUpLlNjcnV0aW55VHlwZSEsXG4gICAgICAgICAgb2xkVmFsdWU6IHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMgJiYgcmVzb3VyY2VDaGFuZ2Uub2xkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLFxuICAgICAgICAgIG5ld1ZhbHVlOiByZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzICYmIHJlc291cmNlQ2hhbmdlLm5ld1Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIHJlc291cmNlIGNoYW5nZXMgb2YgYSBnaXZlbiBzY3J1dGlueSB0eXBlXG4gICAqXG4gICAqIFdlIGRvbid0IGp1c3QgbG9vayBhdCByZXNvdXJjZSB1cGRhdGVzOyB3ZSBhbHNvIGxvb2sgYXQgcmVzb3VyY2UgYWRkaXRpb25zIGFuZCBkZWxldGlvbnMgKGluIHdoaWNoXG4gICAqIGNhc2UgdGhlcmUgaXMgbm8gZnVydGhlciBkZXRhaWwgb24gcHJvcGVydHkgdmFsdWVzKSwgYW5kIHJlc291cmNlIHR5cGUgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgc2NydXRpbml6YWJsZVJlc291cmNlQ2hhbmdlcyhzY3J1dGlueVR5cGVzOiBjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZVtdKTogUmVzb3VyY2VDaGFuZ2VbXSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFJlc291cmNlQ2hhbmdlPigpO1xuXG4gICAgY29uc3Qgc2NydXRpbml6YWJsZVR5cGVzID0gbmV3IFNldChjZm5zcGVjLnNjcnV0aW5pemFibGVSZXNvdXJjZVR5cGVzKHNjcnV0aW55VHlwZXMpKTtcblxuICAgIGZvciAoY29uc3QgW3Jlc291cmNlTG9naWNhbElkLCByZXNvdXJjZUNoYW5nZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZXNvdXJjZXMuY2hhbmdlcykpIHtcbiAgICAgIGlmICghcmVzb3VyY2VDaGFuZ2UpIHsgY29udGludWU7IH1cblxuICAgICAgY29uc3QgY29tbW9uUHJvcHMgPSB7XG4gICAgICAgIG9sZFByb3BlcnRpZXM6IHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMsXG4gICAgICAgIG5ld1Byb3BlcnRpZXM6IHJlc291cmNlQ2hhbmdlLm5ld1Byb3BlcnRpZXMsXG4gICAgICAgIHJlc291cmNlTG9naWNhbElkLFxuICAgICAgfTtcblxuICAgICAgLy8gY2hhbmdlcyB0byB0aGUgVHlwZSBvZiByZXNvdXJjZXMgY2FuIGhhcHBlbiB3aGVuIG1pZ3JhdGluZyBmcm9tIENGTiB0ZW1wbGF0ZXMgdGhhdCB1c2UgVHJhbnNmb3Jtc1xuICAgICAgaWYgKHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgICAgLy8gVHJlYXQgYXMgREVMRVRFK0FERFxuICAgICAgICBpZiAoc2NydXRpbml6YWJsZVR5cGVzLmhhcyhyZXNvdXJjZUNoYW5nZS5vbGRSZXNvdXJjZVR5cGUhKSkge1xuICAgICAgICAgIHJldC5wdXNoKHtcbiAgICAgICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICAgICAgbmV3UHJvcGVydGllczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVzb3VyY2VUeXBlOiByZXNvdXJjZUNoYW5nZS5vbGRSZXNvdXJjZVR5cGUhLFxuICAgICAgICAgICAgc2NydXRpbnlUeXBlOiBjZm5zcGVjLnJlc291cmNlU3BlY2lmaWNhdGlvbihyZXNvdXJjZUNoYW5nZS5vbGRSZXNvdXJjZVR5cGUhKS5TY3J1dGlueVR5cGUhLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY3J1dGluaXphYmxlVHlwZXMuaGFzKHJlc291cmNlQ2hhbmdlLm5ld1Jlc291cmNlVHlwZSEpKSB7XG4gICAgICAgICAgcmV0LnB1c2goe1xuICAgICAgICAgICAgLi4uY29tbW9uUHJvcHMsXG4gICAgICAgICAgICBvbGRQcm9wZXJ0aWVzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICByZXNvdXJjZVR5cGU6IHJlc291cmNlQ2hhbmdlLm5ld1Jlc291cmNlVHlwZSEsXG4gICAgICAgICAgICBzY3J1dGlueVR5cGU6IGNmbnNwZWMucmVzb3VyY2VTcGVjaWZpY2F0aW9uKHJlc291cmNlQ2hhbmdlLm5ld1Jlc291cmNlVHlwZSEpLlNjcnV0aW55VHlwZSEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzY3J1dGluaXphYmxlVHlwZXMuaGFzKHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZSkpIHtcbiAgICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgICAuLi5jb21tb25Qcm9wcyxcbiAgICAgICAgICAgIHJlc291cmNlVHlwZTogcmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VUeXBlLFxuICAgICAgICAgICAgc2NydXRpbnlUeXBlOiBjZm5zcGVjLnJlc291cmNlU3BlY2lmaWNhdGlvbihyZXNvdXJjZUNoYW5nZS5yZXNvdXJjZVR5cGUpLlNjcnV0aW55VHlwZSEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG5cbi8qKlxuICogQSBjaGFuZ2UgaW4gcHJvcGVydHkgdmFsdWVzXG4gKlxuICogTm90IG5lY2Vzc2FyaWx5IGFuIHVwZGF0ZSwgaXQgY291bGQgYmUgdGhhdCB0aGVyZSB1c2VkIHRvIGJlIG5vIHZhbHVlIHRoZXJlXG4gKiBiZWNhdXNlIHRoZXJlIHdhcyBubyByZXNvdXJjZSwgYW5kIG5vdyB0aGVyZSBpcyAob3IgdmljZSB2ZXJzYSkuXG4gKlxuICogVGhlcmVmb3JlLCB3ZSBqdXN0IGNvbnRhaW4gcGxhaW4gdmFsdWVzIGFuZCBub3QgYSBQcm9wZXJ0eURpZmZlcmVuY2U8YW55Pi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eUNoYW5nZSB7XG4gIC8qKlxuICAgKiBMb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZSB3aGVyZSB0aGlzIHByb3BlcnR5IGNoYW5nZSB3YXMgZm91bmRcbiAgICovXG4gIHJlc291cmNlTG9naWNhbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogU2NydXRpbnkgdHlwZSBmb3IgdGhpcyBwcm9wZXJ0eSBjaGFuZ2VcbiAgICovXG4gIHNjcnV0aW55VHlwZTogY2Zuc3BlYy5zY2hlbWEuUHJvcGVydHlTY3J1dGlueVR5cGU7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgaXMgY2hhbmdpbmdcbiAgICovXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHByb3BlcnR5IHZhbHVlXG4gICAqL1xuICBvbGRWYWx1ZT86IGFueTtcblxuICAvKipcbiAgICogVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZVxuICAgKi9cbiAgbmV3VmFsdWU/OiBhbnk7XG59XG5cbi8qKlxuICogQSByZXNvdXJjZSBjaGFuZ2VcbiAqXG4gKiBFaXRoZXIgYSBjcmVhdGlvbiwgZGVsZXRpb24gb3IgdXBkYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlQ2hhbmdlIHtcbiAgLyoqXG4gICAqIExvZ2ljYWwgSUQgb2YgdGhlIHJlc291cmNlIHdoZXJlIHRoaXMgcHJvcGVydHkgY2hhbmdlIHdhcyBmb3VuZFxuICAgKi9cbiAgcmVzb3VyY2VMb2dpY2FsSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU2NydXRpbnkgdHlwZSBmb3IgdGhpcyByZXNvdXJjZSBjaGFuZ2VcbiAgICovXG4gIHNjcnV0aW55VHlwZTogY2Zuc3BlYy5zY2hlbWEuUmVzb3VyY2VTY3J1dGlueVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcHJvcGVydGllcyB2YWx1ZSAobWlnaHQgYmUgdW5kZWZpbmVkIGluIGNhc2Ugb2YgY3JlYXRpb24pXG4gICAqL1xuICBvbGRQcm9wZXJ0aWVzPzogUHJvcGVydHlNYXA7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgcHJvcGVydGllcyB2YWx1ZSAobWlnaHQgYmUgdW5kZWZpbmVkIGluIGNhc2Ugb2YgZGVsZXRpb24pXG4gICAqL1xuICBuZXdQcm9wZXJ0aWVzPzogUHJvcGVydHlNYXA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpZmZlcmVuY2U8VmFsdWVUeXBlPiB7XG4gIHJlYWRvbmx5IG9sZFZhbHVlOiBWYWx1ZVR5cGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG5ld1ZhbHVlOiBWYWx1ZVR5cGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGlzRGlmZmVyZW50OiBib29sZWFuO1xuICByZWFkb25seSBpc0FkZGl0aW9uOiBib29sZWFuO1xuICByZWFkb25seSBpc1JlbW92YWw6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzVXBkYXRlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vZGVscyBhbiBlbnRpdHkgdGhhdCBjaGFuZ2VkIGJldHdlZW4gdHdvIHZlcnNpb25zIG9mIGEgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaWZmZXJlbmNlPFZhbHVlVHlwZT4gaW1wbGVtZW50cyBJRGlmZmVyZW5jZTxWYWx1ZVR5cGU+IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpcyBhbiBhY3R1YWwgZGlmZmVyZW50IG9yIHRoZSB2YWx1ZXMgYXJlIGFjdHVhbGx5IHRoZSBzYW1lXG4gICAqXG4gICAqIGlzRGlmZmVyZW50ID0+IChpc1VwZGF0ZSB8IGlzUmVtb3ZlZCB8IGlzVXBkYXRlKVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzRGlmZmVyZW50OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCB2YWx1ZSwgY2Fubm90IGJlIGVxdWFsICh0byB0aGUgc2Vuc2Ugb2YgK2RlZXBFcXVhbCspIHRvICtuZXdWYWx1ZSsuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlLCBjYW5ub3QgYmUgZXF1YWwgKHRvIHRoZSBzZW5zZSBvZiArZGVlcEVxdWFsKykgdG8gK29sZFZhbHVlKy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBvbGRWYWx1ZTogVmFsdWVUeXBlIHwgdW5kZWZpbmVkLCBwdWJsaWMgcmVhZG9ubHkgbmV3VmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6ICdvbGRWYWx1ZSBhbmQgbmV3VmFsdWUgYXJlIGJvdGggdW5kZWZpbmVkIScgfSk7XG4gICAgfVxuICAgIHRoaXMuaXNEaWZmZXJlbnQgPSAhZGVlcEVxdWFsKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gIH1cblxuICAvKiogQHJldHVybnMgK3RydWUrIGlmIHRoZSBlbGVtZW50IGlzIG5ldyB0byB0aGUgdGVtcGxhdGUuICovXG4gIHB1YmxpYyBnZXQgaXNBZGRpdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vbGRWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEByZXR1cm5zICt0cnVlKyBpZiB0aGUgZWxlbWVudCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB0ZW1wbGF0ZS4gKi9cbiAgcHVibGljIGdldCBpc1JlbW92YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyArdHJ1ZSsgaWYgdGhlIGVsZW1lbnQgd2FzIGFscmVhZHkgaW4gdGhlIHRlbXBsYXRlIGFuZCBpcyB1cGRhdGVkLiAqL1xuICBwdWJsaWMgZ2V0IGlzVXBkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9sZFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICYmIHRoaXMubmV3VmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlEaWZmZXJlbmNlPFZhbHVlVHlwZT4gZXh0ZW5kcyBEaWZmZXJlbmNlPFZhbHVlVHlwZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlSW1wYWN0PzogUmVzb3VyY2VJbXBhY3Q7XG5cbiAgY29uc3RydWN0b3Iob2xkVmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCwgYXJnczogeyBjaGFuZ2VJbXBhY3Q/OiBSZXNvdXJjZUltcGFjdCB9KSB7XG4gICAgc3VwZXIob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLmNoYW5nZUltcGFjdCA9IGFyZ3MuY2hhbmdlSW1wYWN0O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUIGV4dGVuZHMgSURpZmZlcmVuY2U8Vj4+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkaWZmczogeyBbbG9naWNhbElkOiBzdHJpbmddOiBUIH0pIHt9XG5cbiAgcHVibGljIGdldCBjaGFuZ2VzKCk6IHsgW2xvZ2ljYWxJZDogc3RyaW5nXTogVCB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5kaWZmcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY2hhbmdlcykubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGdldChsb2dpY2FsSWQ6IHN0cmluZyk6IFQge1xuICAgIGNvbnN0IHJldCA9IHRoaXMuZGlmZnNbbG9naWNhbElkXTtcbiAgICBpZiAoIXJldCkgeyB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCB3aXRoIGxvZ2ljYWwgSUQgJyR7bG9naWNhbElkfSdgKTsgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvZ2ljYWxJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgVGVtcGxhdGVEaWZmIHdoaWNoIG9ubHkgY29udGFpbnMgY2hhbmdlcyBmb3Igd2hpY2ggYHByZWRpY2F0ZWBcbiAgICogcmV0dXJucyBgdHJ1ZWAuXG4gICAqL1xuICBwdWJsaWMgZmlsdGVyKHByZWRpY2F0ZTogKGRpZmY6IFQgfCB1bmRlZmluZWQpID0+IGJvb2xlYW4pOiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUPiB7XG4gICAgY29uc3QgbmV3Q2hhbmdlczogeyBbbG9naWNhbElkOiBzdHJpbmddOiBUIH0gPSB7IH07XG4gICAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpKSB7XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5jaGFuZ2VzW2lkXTtcblxuICAgICAgaWYgKHByZWRpY2F0ZShkaWZmKSkge1xuICAgICAgICBuZXdDaGFuZ2VzW2lkXSA9IGRpZmY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUPihuZXdDaGFuZ2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGBjYmAgZm9yIGFsbCBjaGFuZ2VzIGluIHRoaXMgY29sbGVjdGlvbi5cbiAgICpcbiAgICogQ2hhbmdlcyB3aWxsIGJlIHNvcnRlZCBhcyBmb2xsb3dzOlxuICAgKiAgLSBSZW1vdmVkXG4gICAqICAtIEFkZGVkXG4gICAqICAtIFVwZGF0ZWRcbiAgICogIC0gT3RoZXJzXG4gICAqXG4gICAqIEBwYXJhbSBjYlxuICAgKi9cbiAgcHVibGljIGZvckVhY2hEaWZmZXJlbmNlKGNiOiAobG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogVCkgPT4gYW55KTogdm9pZCB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcbiAgICBjb25zdCBhZGRlZCA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcbiAgICBjb25zdCB1cGRhdGVkID0gbmV3IEFycmF5PHsgbG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogVCB9PigpO1xuICAgIGNvbnN0IG90aGVycyA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcblxuICAgIGZvciAoY29uc3QgbG9naWNhbElkIG9mIHRoaXMubG9naWNhbElkcykge1xuICAgICAgY29uc3QgY2hhbmdlOiBUID0gdGhpcy5jaGFuZ2VzW2xvZ2ljYWxJZF0hO1xuICAgICAgaWYgKGNoYW5nZS5pc0FkZGl0aW9uKSB7XG4gICAgICAgIGFkZGVkLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmlzUmVtb3ZhbCkge1xuICAgICAgICByZW1vdmVkLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmlzVXBkYXRlKSB7XG4gICAgICAgIHVwZGF0ZWQucHVzaCh7IGxvZ2ljYWxJZCwgY2hhbmdlIH0pO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2UuaXNEaWZmZXJlbnQpIHtcbiAgICAgICAgb3RoZXJzLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVkLmZvckVhY2godiA9PiBjYih2LmxvZ2ljYWxJZCwgdi5jaGFuZ2UpKTtcbiAgICBhZGRlZC5mb3JFYWNoKHYgPT4gY2Iodi5sb2dpY2FsSWQsIHYuY2hhbmdlKSk7XG4gICAgdXBkYXRlZC5mb3JFYWNoKHYgPT4gY2Iodi5sb2dpY2FsSWQsIHYuY2hhbmdlKSk7XG4gICAgb3RoZXJzLmZvckVhY2godiA9PiBjYih2LmxvZ2ljYWxJZCwgdi5jaGFuZ2UpKTtcbiAgfVxufVxuXG4vKipcbiAqIEFyZ3VtZW50cyBleHBlY3RlZCBieSB0aGUgY29uc3RydWN0b3Igb2YgK1RlbXBsYXRlRGlmZissIGV4dHJhY3RlZCBhcyBhbiBpbnRlcmZhY2UgZm9yIHRoZSBzYWtlXG4gKiBvZiAocmVsYXRpdmUpIGNvbmNpc2VuZXNzIG9mIHRoZSBjb25zdHJ1Y3RvcidzIHNpZ25hdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVGVtcGxhdGVEaWZmIHtcbiAgYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uPzogSURpZmZlcmVuY2U8c3RyaW5nPjtcbiAgZGVzY3JpcHRpb24/OiBJRGlmZmVyZW5jZTxzdHJpbmc+O1xuICB0cmFuc2Zvcm0/OiBJRGlmZmVyZW5jZTxzdHJpbmc+O1xuXG4gIGNvbmRpdGlvbnM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxDb25kaXRpb24sIENvbmRpdGlvbkRpZmZlcmVuY2U+O1xuICBtYXBwaW5ncz86IERpZmZlcmVuY2VDb2xsZWN0aW9uPE1hcHBpbmcsIE1hcHBpbmdEaWZmZXJlbmNlPjtcbiAgbWV0YWRhdGE/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxNZXRhZGF0YSwgTWV0YWRhdGFEaWZmZXJlbmNlPjtcbiAgb3V0cHV0cz86IERpZmZlcmVuY2VDb2xsZWN0aW9uPE91dHB1dCwgT3V0cHV0RGlmZmVyZW5jZT47XG4gIHBhcmFtZXRlcnM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxQYXJhbWV0ZXIsIFBhcmFtZXRlckRpZmZlcmVuY2U+O1xuICByZXNvdXJjZXM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxSZXNvdXJjZSwgUmVzb3VyY2VEaWZmZXJlbmNlPjtcblxuICB1bmtub3duPzogRGlmZmVyZW5jZUNvbGxlY3Rpb248YW55LCBJRGlmZmVyZW5jZTxhbnk+Pjtcbn1cblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uID0gYW55O1xuZXhwb3J0IGNsYXNzIENvbmRpdGlvbkRpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPENvbmRpdGlvbj4ge1xuICAvLyBUT0RPOiBkZWZpbmUgc3BlY2lmaWMgZGlmZmVyZW5jZSBhdHRyaWJ1dGVzXG59XG5cbmV4cG9ydCB0eXBlIE1hcHBpbmcgPSBhbnk7XG5leHBvcnQgY2xhc3MgTWFwcGluZ0RpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE1hcHBpbmc+IHtcbiAgLy8gVE9ETzogZGVmaW5lIHNwZWNpZmljIGRpZmZlcmVuY2UgYXR0cmlidXRlc1xufVxuXG5leHBvcnQgdHlwZSBNZXRhZGF0YSA9IGFueTtcbmV4cG9ydCBjbGFzcyBNZXRhZGF0YURpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE1ldGFkYXRhPiB7XG4gIC8vIFRPRE86IGRlZmluZSBzcGVjaWZpYyBkaWZmZXJlbmNlIGF0dHJpYnV0ZXNcbn1cblxuZXhwb3J0IHR5cGUgT3V0cHV0ID0gYW55O1xuZXhwb3J0IGNsYXNzIE91dHB1dERpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE91dHB1dD4ge1xuICAvLyBUT0RPOiBkZWZpbmUgc3BlY2lmaWMgZGlmZmVyZW5jZSBhdHRyaWJ1dGVzXG59XG5cbmV4cG9ydCB0eXBlIFBhcmFtZXRlciA9IGFueTtcbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJEaWZmZXJlbmNlIGV4dGVuZHMgRGlmZmVyZW5jZTxQYXJhbWV0ZXI+IHtcbiAgLy8gVE9ETzogZGVmaW5lIHNwZWNpZmljIGRpZmZlcmVuY2UgYXR0cmlidXRlc1xufVxuXG5leHBvcnQgZW51bSBSZXNvdXJjZUltcGFjdCB7XG4gIC8qKiBUaGUgZXhpc3RpbmcgcGh5c2ljYWwgcmVzb3VyY2Ugd2lsbCBiZSB1cGRhdGVkICovXG4gIFdJTExfVVBEQVRFID0gJ1dJTExfVVBEQVRFJyxcbiAgLyoqIEEgbmV3IHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgY3JlYXRlZCAqL1xuICBXSUxMX0NSRUFURSA9ICdXSUxMX0NSRUFURScsXG4gIC8qKiBUaGUgZXhpc3RpbmcgcGh5c2ljYWwgcmVzb3VyY2Ugd2lsbCBiZSByZXBsYWNlZCAqL1xuICBXSUxMX1JFUExBQ0UgPSAnV0lMTF9SRVBMQUNFJyxcbiAgLyoqIFRoZSBleGlzdGluZyBwaHlzaWNhbCByZXNvdXJjZSBtYXkgYmUgcmVwbGFjZWQgKi9cbiAgTUFZX1JFUExBQ0UgPSAnTUFZX1JFUExBQ0UnLFxuICAvKiogVGhlIGV4aXN0aW5nIHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgZGVzdHJveWVkICovXG4gIFdJTExfREVTVFJPWSA9ICdXSUxMX0RFU1RST1knLFxuICAvKiogVGhlIGV4aXN0aW5nIHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIENsb3VkRm9ybWF0aW9uIHN1cGVydmlzaW9uICovXG4gIFdJTExfT1JQSEFOID0gJ1dJTExfT1JQSEFOJyxcbiAgLyoqIFRoZXJlIGlzIG5vIGNoYW5nZSBpbiB0aGlzIHJlc291cmNlICovXG4gIE5PX0NIQU5HRSA9ICdOT19DSEFOR0UnLFxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYXMgYSByZWR1Y2VyIHRvIG9idGFpbiB0aGUgcmVzb3VyY2UtbGV2ZWwgaW1wYWN0IG9mIGEgbGlzdFxuICogb2YgcHJvcGVydHktbGV2ZWwgaW1wYWN0cy5cbiAqIEBwYXJhbSBvbmUgdGhlIGN1cnJlbnQgd29yc3QgaW1wYWN0IHNvIGZhci5cbiAqIEBwYXJhbSB0d28gdGhlIG5ldyBpbXBhY3QgYmVpbmcgY29uc2lkZXJlZCAoY2FuIGJlIHVuZGVmaW5lZCwgYXMgd2UgbWF5IG5vdCBhbHdheXMgYmVcbiAqICAgICAgYWJsZSB0byBkZXRlcm1pbmUgc29tZSBwZXJvcGVydHkncyBpbXBhY3QpLlxuICovXG5mdW5jdGlvbiB3b3JzdEltcGFjdChvbmU6IFJlc291cmNlSW1wYWN0LCB0d28/OiBSZXNvdXJjZUltcGFjdCk6IFJlc291cmNlSW1wYWN0IHtcbiAgaWYgKCF0d28pIHsgcmV0dXJuIG9uZTsgfVxuICBjb25zdCBiYWRuZXNzID0ge1xuICAgIFtSZXNvdXJjZUltcGFjdC5OT19DSEFOR0VdOiAwLFxuICAgIFtSZXNvdXJjZUltcGFjdC5XSUxMX1VQREFURV06IDEsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFXTogMixcbiAgICBbUmVzb3VyY2VJbXBhY3QuV0lMTF9PUlBIQU5dOiAzLFxuICAgIFtSZXNvdXJjZUltcGFjdC5NQVlfUkVQTEFDRV06IDQsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRV06IDUsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfREVTVFJPWV06IDYsXG4gIH07XG4gIHJldHVybiBiYWRuZXNzW29uZV0gPiBiYWRuZXNzW3R3b10gPyBvbmUgOiB0d287XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2Uge1xuICBUeXBlOiBzdHJpbmc7XG4gIFByb3BlcnRpZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ2hhbmdlIHRvIGEgc2luZ2xlIHJlc291cmNlIGJldHdlZW4gdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlc1xuICpcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIG11dGF0ZWQgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VEaWZmZXJlbmNlIGltcGxlbWVudHMgSURpZmZlcmVuY2U8UmVzb3VyY2U+IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyByZXNvdXJjZSB3YXMgYWRkZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc0FkZGl0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcmVzb3VyY2Ugd2FzIHJlbW92ZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc1JlbW92YWw6IGJvb2xlYW47XG5cbiAgLyoqIFByb3BlcnR5LWxldmVsIGNoYW5nZXMgb24gdGhlIHJlc291cmNlICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlEaWZmczogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9O1xuXG4gIC8qKiBDaGFuZ2VzIHRvIG5vbi1wcm9wZXJ0eSBsZXZlbCBhdHRyaWJ1dGVzIG9mIHRoZSByZXNvdXJjZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG90aGVyRGlmZnM6IHsgW2tleTogc3RyaW5nXTogRGlmZmVyZW5jZTxhbnk+IH07XG5cbiAgLyoqIFRoZSByZXNvdXJjZSB0eXBlIChvciBvbGQgYW5kIG5ldyB0eXBlIGlmIGl0IGhhcyBjaGFuZ2VkKSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlVHlwZXM6IHsgcmVhZG9ubHkgb2xkVHlwZT86IHN0cmluZywgcmVhZG9ubHkgbmV3VHlwZT86IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBvbGRWYWx1ZTogUmVzb3VyY2UgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IG5ld1ZhbHVlOiBSZXNvdXJjZSB8IHVuZGVmaW5lZCxcbiAgICBhcmdzOiB7XG4gICAgICByZXNvdXJjZVR5cGU6IHsgb2xkVHlwZT86IHN0cmluZywgbmV3VHlwZT86IHN0cmluZyB9LFxuICAgICAgcHJvcGVydHlEaWZmczogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9LFxuICAgICAgb3RoZXJEaWZmczogeyBba2V5OiBzdHJpbmddOiBEaWZmZXJlbmNlPGFueT4gfVxuICAgIH0sXG4gICkge1xuICAgIHRoaXMucmVzb3VyY2VUeXBlcyA9IGFyZ3MucmVzb3VyY2VUeXBlO1xuICAgIHRoaXMucHJvcGVydHlEaWZmcyA9IGFyZ3MucHJvcGVydHlEaWZmcztcbiAgICB0aGlzLm90aGVyRGlmZnMgPSBhcmdzLm90aGVyRGlmZnM7XG5cbiAgICB0aGlzLmlzQWRkaXRpb24gPSBvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNSZW1vdmFsID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2xkUHJvcGVydGllcygpOiBQcm9wZXJ0eU1hcCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub2xkVmFsdWUgJiYgdGhpcy5vbGRWYWx1ZS5Qcm9wZXJ0aWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdQcm9wZXJ0aWVzKCk6IFByb3BlcnR5TWFwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5uZXdWYWx1ZSAmJiB0aGlzLm5ld1ZhbHVlLlByb3BlcnRpZXM7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHJlc291cmNlIHdhcyBtb2RpZmllZCBhdCBhbGxcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEaWZmZXJlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlmZmVyZW5jZUNvdW50ID4gMCB8fCB0aGlzLm9sZFJlc291cmNlVHlwZSAhPT0gdGhpcy5uZXdSZXNvdXJjZVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVzb3VyY2Ugd2FzIHVwZGF0ZWQgaW4tcGxhY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNVcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaWZmZXJlbnQgJiYgIXRoaXMuaXNBZGRpdGlvbiAmJiAhdGhpcy5pc1JlbW92YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9sZFJlc291cmNlVHlwZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmV3UmVzb3VyY2VUeXBlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBhY3R1YWwgcHJvcGVydHkgdXBkYXRlc1xuICAgKi9cbiAgcHVibGljIGdldCBwcm9wZXJ0eVVwZGF0ZXMoKTogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5wcm9wZXJ0eURpZmZzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgYWN0dWFsIFwib3RoZXJcIiB1cGRhdGVzXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVyQ2hhbmdlcygpOiB7IFtrZXk6IHN0cmluZ106IERpZmZlcmVuY2U8YW55PiB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5vdGhlckRpZmZzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgcmVzb3VyY2UgdHlwZSB3YXMgY2hhbmdlZCBpbiB0aGlzIGRpZmZcbiAgICpcbiAgICogVGhpcyBpcyBub3QgYSB2YWxpZCBvcGVyYXRpb24gaW4gQ2xvdWRGb3JtYXRpb24gYnV0IHRvIGJlIGRlZmVuc2l2ZSB3ZSdyZSBnb2luZ1xuICAgKiB0byBiZSBhd2FyZSBvZiBpdCBhbnl3YXkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlVHlwZUNoYW5nZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgdGhpcy5yZXNvdXJjZVR5cGVzLm9sZFR5cGUgIT09IHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgaWYgaXQgd2FzIHVuY2hhbmdlZFxuICAgKlxuICAgKiBJZiB0aGUgcmVzb3VyY2UgdHlwZSB3YXMgY2hhbmdlZCwgaXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlVHlwZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCAucmVzb3VyY2VUeXBlLCBiZWNhdXNlIHRoZSB0eXBlIHdhcyBjaGFuZ2VkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZSB8fCB0aGlzLnJlc291cmNlVHlwZXMubmV3VHlwZSE7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBhIFByb3BlcnR5Q2hhbmdlIGluIHRoaXMgb2JqZWN0XG4gICAqXG4gICAqIFRoaXMgYWZmZWN0cyB0aGUgcHJvcGVydHkgZGlmZiBhcyBpdCBpcyBzdW1tYXJpemVkIHRvIHVzZXJzLCBidXQgaXQgRE9FU1xuICAgKiBOT1QgYWZmZWN0IGVpdGhlciB0aGUgXCJvbGRWYWx1ZVwiIG9yIFwibmV3VmFsdWVcIiB2YWx1ZXM7IHRob3NlIHN0aWxsIGNvbnRhaW5cbiAgICogdGhlIGFjdHVhbCB0ZW1wbGF0ZSB2YWx1ZXMgYXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgKHRoZXkgbWlnaHQgc3RpbGwgYmVcbiAgICogdXNlZCBmb3IgZG93bnN0cmVhbSBwcm9jZXNzaW5nKS5cbiAgICovXG4gIHB1YmxpYyBzZXRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWU6IHN0cmluZywgY2hhbmdlOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55Pikge1xuICAgIHRoaXMucHJvcGVydHlEaWZmc1twcm9wZXJ0eU5hbWVdID0gY2hhbmdlO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGFuZ2VJbXBhY3QoKTogUmVzb3VyY2VJbXBhY3Qge1xuICAgIC8vIENoZWNrIHRoZSBUeXBlIGZpcnN0XG4gICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlcy5vbGRUeXBlICE9PSB0aGlzLnJlc291cmNlVHlwZXMubmV3VHlwZSkge1xuICAgICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlcy5vbGRUeXBlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIFJlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFOyB9XG4gICAgICBpZiAodGhpcy5yZXNvdXJjZVR5cGVzLm5ld1R5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbGRWYWx1ZSEuRGVsZXRpb25Qb2xpY3kgPT09ICdSZXRhaW4nXG4gICAgICAgICAgPyBSZXNvdXJjZUltcGFjdC5XSUxMX09SUEhBTlxuICAgICAgICAgIDogUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRTtcbiAgICB9XG5cbiAgICAvLyBCYXNlIGltcGFjdCAoYmVmb3JlIHdlIG1peCBpbiB0aGUgd29yc3Qgb2YgdGhlIHByb3BlcnR5IGltcGFjdHMpO1xuICAgIC8vIFdJTExfVVBEQVRFIGlmIHdlIGhhdmUgXCJvdGhlclwiIGNoYW5nZXMsIE5PX0NIQU5HRSBpZiB0aGVyZSBhcmUgbm8gXCJvdGhlclwiIGNoYW5nZXMuXG4gICAgY29uc3QgYmFzZUltcGFjdCA9IE9iamVjdC5rZXlzKHRoaXMub3RoZXJDaGFuZ2VzKS5sZW5ndGggPiAwID8gUmVzb3VyY2VJbXBhY3QuV0lMTF9VUERBVEUgOiBSZXNvdXJjZUltcGFjdC5OT19DSEFOR0U7XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnByb3BlcnR5RGlmZnMpXG4gICAgICAubWFwKGVsdCA9PiBlbHQuY2hhbmdlSW1wYWN0KVxuICAgICAgLnJlZHVjZSh3b3JzdEltcGFjdCwgYmFzZUltcGFjdCk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgb2YgYWN0dWFsIGRpZmZlcmVuY2VzIChub3Qgb2YgZWxlbWVudHMpXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMucHJvcGVydHlVcGRhdGVzKS5sZW5ndGhcbiAgICAgICsgT2JqZWN0LnZhbHVlcyh0aGlzLm90aGVyQ2hhbmdlcykubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBhIGNhbGxiYWNrIGZvciBlYWNoIGFjdHVhbCBkaWZmZXJlbmNlXG4gICAqL1xuICBwdWJsaWMgZm9yRWFjaERpZmZlcmVuY2UoY2I6ICh0eXBlOiAnUHJvcGVydHknIHwgJ090aGVyJywgbmFtZTogc3RyaW5nLCB2YWx1ZTogRGlmZmVyZW5jZTxhbnk+IHwgUHJvcGVydHlEaWZmZXJlbmNlPGFueT4pID0+IGFueSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMucHJvcGVydHlVcGRhdGVzKS5zb3J0KCkpIHtcbiAgICAgIGNiKCdQcm9wZXJ0eScsIGtleSwgdGhpcy5wcm9wZXJ0eVVwZGF0ZXNba2V5XSk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMub3RoZXJDaGFuZ2VzKS5zb3J0KCkpIHtcbiAgICAgIGNiKCdPdGhlcicsIGtleSwgdGhpcy5vdGhlckRpZmZzW2tleV0pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wZXJ0eURpZmZlcmVuY2U8VD4oZGlmZjogRGlmZmVyZW5jZTxUPik6IGRpZmYgaXMgUHJvcGVydHlEaWZmZXJlbmNlPFQ+IHtcbiAgcmV0dXJuIChkaWZmIGFzIFByb3BlcnR5RGlmZmVyZW5jZTxUPikuY2hhbmdlSW1wYWN0ICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmlsdGVyIGEgbWFwIG9mIElEaWZmZXJlbmNlcyBkb3duIHRvIG9ubHkgcmV0YWluIHRoZSBhY3R1YWwgY2hhbmdlc1xuICovXG5mdW5jdGlvbiBvbmx5Q2hhbmdlczxWLCBUIGV4dGVuZHMgSURpZmZlcmVuY2U8Vj4+KHhzOiB7W2tleTogc3RyaW5nXTogVH0pOiB7W2tleTogc3RyaW5nXTogVH0ge1xuICBjb25zdCByZXQ6IHsgW2tleTogc3RyaW5nXTogVCB9ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgZGlmZl0gb2YgT2JqZWN0LmVudHJpZXMoeHMpKSB7XG4gICAgaWYgKGRpZmYuaXNEaWZmZXJlbnQpIHtcbiAgICAgIHJldFtrZXldID0gZGlmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mangleLikeCloudFormation = exports.unionOf = exports.diffKeyedEntities = exports.deepEqual = void 0;\n/**\n * Compares two objects for equality, deeply. The function handles arguments that are\n * +null+, +undefined+, arrays and objects. For objects, the function will not take the\n * object prototype into account for the purpose of the comparison, only the values of\n * properties reported by +Object.keys+.\n *\n * If both operands can be parsed to equivalent numbers, will return true.\n * This makes diff consistent with CloudFormation, where a numeric 10 and a literal \"10\"\n * are considered equivalent.\n *\n * @param lvalue the left operand of the equality comparison.\n * @param rvalue the right operand of the equality comparison.\n *\n * @returns +true+ if both +lvalue+ and +rvalue+ are equivalent to each other.\n */\nfunction deepEqual(lvalue, rvalue) {\n if (lvalue === rvalue) {\n return true;\n }\n // CloudFormation allows passing strings into boolean-typed fields\n if (((typeof lvalue === 'string' && typeof rvalue === 'boolean') ||\n (typeof lvalue === 'boolean' && typeof rvalue === 'string')) &&\n lvalue.toString() === rvalue.toString()) {\n return true;\n }\n // allows a numeric 10 and a literal \"10\" to be equivalent;\n // this is consistent with CloudFormation.\n if ((typeof lvalue === 'string' || typeof rvalue === 'string') &&\n safeParseFloat(lvalue) === safeParseFloat(rvalue)) {\n return true;\n }\n if (typeof lvalue !== typeof rvalue) {\n return false;\n }\n if (Array.isArray(lvalue) !== Array.isArray(rvalue)) {\n return false;\n }\n if (Array.isArray(lvalue) /* && Array.isArray(rvalue) */) {\n if (lvalue.length !== rvalue.length) {\n return false;\n }\n for (let i = 0; i < lvalue.length; i++) {\n if (!deepEqual(lvalue[i], rvalue[i])) {\n return false;\n }\n }\n return true;\n }\n if (typeof lvalue === 'object' /* && typeof rvalue === 'object' */) {\n if (lvalue === null || rvalue === null) {\n // If both were null, they'd have been ===\n return false;\n }\n const keys = Object.keys(lvalue);\n if (keys.length !== Object.keys(rvalue).length) {\n return false;\n }\n for (const key of keys) {\n if (!rvalue.hasOwnProperty(key)) {\n return false;\n }\n if (key === 'DependsOn') {\n if (!dependsOnEqual(lvalue[key], rvalue[key])) {\n return false;\n }\n ;\n // check differences other than `DependsOn`\n continue;\n }\n if (!deepEqual(lvalue[key], rvalue[key])) {\n return false;\n }\n }\n return true;\n }\n // Neither object, nor array: I deduce this is primitive type\n // Primitive type and not ===, so I deduce not deepEqual\n return false;\n}\nexports.deepEqual = deepEqual;\n/**\n * Compares two arguments to DependsOn for equality.\n *\n * @param lvalue the left operand of the equality comparison.\n * @param rvalue the right operand of the equality comparison.\n *\n * @returns +true+ if both +lvalue+ and +rvalue+ are equivalent to each other.\n */\nfunction dependsOnEqual(lvalue, rvalue) {\n // allows ['Value'] and 'Value' to be equal\n if (Array.isArray(lvalue) !== Array.isArray(rvalue)) {\n const array = Array.isArray(lvalue) ? lvalue : rvalue;\n const nonArray = Array.isArray(lvalue) ? rvalue : lvalue;\n if (array.length === 1 && deepEqual(array[0], nonArray)) {\n return true;\n }\n return false;\n }\n // allows arrays passed to DependsOn to be equivalent irrespective of element order\n if (Array.isArray(lvalue) && Array.isArray(rvalue)) {\n if (lvalue.length !== rvalue.length) {\n return false;\n }\n for (let i = 0; i < lvalue.length; i++) {\n for (let j = 0; j < lvalue.length; j++) {\n if ((!deepEqual(lvalue[i], rvalue[j])) && (j === lvalue.length - 1)) {\n return false;\n }\n break;\n }\n }\n return true;\n }\n return false;\n}\n/**\n * Produce the differences between two maps, as a map, using a specified diff function.\n *\n * @param oldValue the old map.\n * @param newValue the new map.\n * @param elementDiff the diff function.\n *\n * @returns a map representing the differences between +oldValue+ and +newValue+.\n */\nfunction diffKeyedEntities(oldValue, newValue, elementDiff) {\n const result = {};\n for (const logicalId of unionOf(Object.keys(oldValue || {}), Object.keys(newValue || {}))) {\n const oldElement = oldValue && oldValue[logicalId];\n const newElement = newValue && newValue[logicalId];\n if (oldElement === undefined && newElement === undefined) {\n // Shouldn't happen in reality, but may happen in tests. Skip.\n continue;\n }\n result[logicalId] = elementDiff(oldElement, newElement, logicalId);\n }\n return result;\n}\nexports.diffKeyedEntities = diffKeyedEntities;\n/**\n * Computes the union of two sets of strings.\n *\n * @param lv the left set of strings.\n * @param rv the right set of strings.\n *\n * @returns a new array containing all elemebts from +lv+ and +rv+, with no duplicates.\n */\nfunction unionOf(lv, rv) {\n const result = new Set(lv);\n for (const v of rv) {\n result.add(v);\n }\n return new Array(...result);\n}\nexports.unionOf = unionOf;\n/**\n * GetStackTemplate flattens any codepoint greater than \"\\u7f\" to \"?\". This is\n * true even for codepoints in the supplemental planes which are represented\n * in JS as surrogate pairs, all the way up to \"\\u{10ffff}\".\n *\n * This function implements the same mangling in order to provide diagnostic\n * information in `cdk diff`.\n */\nfunction mangleLikeCloudFormation(payload) {\n return payload.replace(/[\\u{80}-\\u{10ffff}]/gu, '?');\n}\nexports.mangleLikeCloudFormation = mangleLikeCloudFormation;\n/**\n * A parseFloat implementation that does the right thing for\n * strings like '0.0.0'\n * (for which JavaScript's parseFloat() returns 0).\n * We return NaN for all of these strings that do not represent numbers,\n * and so comparing them fails,\n * and doesn't short-circuit the diff logic.\n */\nfunction safeParseFloat(str) {\n return Number(str);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFnQixTQUFTLENBQUMsTUFBVyxFQUFFLE1BQVc7SUFDaEQsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUM7S0FBRTtJQUN2QyxrRUFBa0U7SUFDbEUsSUFBSSxDQUFDLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQztRQUM1RCxDQUFDLE9BQU8sTUFBTSxLQUFLLFNBQVMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQzNDLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCwyREFBMkQ7SUFDM0QsMENBQTBDO0lBQzFDLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDO1FBQzFELGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDckQsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELElBQUksT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEVBQUU7UUFBRSxPQUFPLEtBQUssQ0FBQztLQUFFO0lBQ3RELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7S0FBRTtJQUN0RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsOEJBQThCLEVBQUU7UUFDeEQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO1FBQ3RELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFHLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUFFLE9BQU8sS0FBSyxDQUFDO2FBQUU7U0FDeEQ7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsbUNBQW1DLEVBQUU7UUFDbEUsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDdEMsMENBQTBDO1lBQzFDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1NBQUU7UUFDakUsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7YUFBRTtZQUNsRCxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO29CQUFFLE9BQU8sS0FBSyxDQUFDO2lCQUFFO2dCQUFBLENBQUM7Z0JBQ2pFLDJDQUEyQztnQkFDM0MsU0FBUzthQUNWO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7YUFBRTtTQUM1RDtRQUNELE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCw2REFBNkQ7SUFDN0Qsd0RBQXdEO0lBQ3hELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQTVDRCw4QkE0Q0M7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBVyxFQUFFLE1BQVc7SUFDOUMsMkNBQTJDO0lBQzNDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ25ELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRXpELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUN2RCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELG1GQUFtRjtJQUNuRixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNsRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1NBQUU7UUFDdEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUcsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO29CQUNuRSxPQUFPLEtBQUssQ0FBQztpQkFDZDtnQkFDRCxNQUFNO2FBQ1A7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLGlCQUFpQixDQUMvQixRQUE0QyxFQUM1QyxRQUE0QyxFQUM1QyxXQUFpRTtJQUNqRSxNQUFNLE1BQU0sR0FBMEIsRUFBRSxDQUFDO0lBQ3pDLEtBQUssTUFBTSxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDekYsTUFBTSxVQUFVLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRW5ELElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQ3hELDhEQUE4RDtZQUM5RCxTQUFTO1NBQ1Y7UUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDcEU7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBakJELDhDQWlCQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixPQUFPLENBQUMsRUFBMEIsRUFBRSxFQUEwQjtJQUM1RSxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzQixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2Y7SUFDRCxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQU5ELDBCQU1DO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLE9BQWU7SUFDdEQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFGRCw0REFFQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxHQUFXO0lBQ2pDLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXBhcmVzIHR3byBvYmplY3RzIGZvciBlcXVhbGl0eSwgZGVlcGx5LiBUaGUgZnVuY3Rpb24gaGFuZGxlcyBhcmd1bWVudHMgdGhhdCBhcmVcbiAqICtudWxsKywgK3VuZGVmaW5lZCssIGFycmF5cyBhbmQgb2JqZWN0cy4gRm9yIG9iamVjdHMsIHRoZSBmdW5jdGlvbiB3aWxsIG5vdCB0YWtlIHRoZVxuICogb2JqZWN0IHByb3RvdHlwZSBpbnRvIGFjY291bnQgZm9yIHRoZSBwdXJwb3NlIG9mIHRoZSBjb21wYXJpc29uLCBvbmx5IHRoZSB2YWx1ZXMgb2ZcbiAqIHByb3BlcnRpZXMgcmVwb3J0ZWQgYnkgK09iamVjdC5rZXlzKy5cbiAqXG4gKiBJZiBib3RoIG9wZXJhbmRzIGNhbiBiZSBwYXJzZWQgdG8gZXF1aXZhbGVudCBudW1iZXJzLCB3aWxsIHJldHVybiB0cnVlLlxuICogVGhpcyBtYWtlcyBkaWZmIGNvbnNpc3RlbnQgd2l0aCBDbG91ZEZvcm1hdGlvbiwgd2hlcmUgYSBudW1lcmljIDEwIGFuZCBhIGxpdGVyYWwgXCIxMFwiXG4gKiBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50LlxuICpcbiAqIEBwYXJhbSBsdmFsdWUgdGhlIGxlZnQgb3BlcmFuZCBvZiB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqIEBwYXJhbSBydmFsdWUgdGhlIHJpZ2h0IG9wZXJhbmQgb2YgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24uXG4gKlxuICogQHJldHVybnMgK3RydWUrIGlmIGJvdGggK2x2YWx1ZSsgYW5kICtydmFsdWUrIGFyZSBlcXVpdmFsZW50IHRvIGVhY2ggb3RoZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwobHZhbHVlOiBhbnksIHJ2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIGlmIChsdmFsdWUgPT09IHJ2YWx1ZSkgeyByZXR1cm4gdHJ1ZTsgfVxuICAvLyBDbG91ZEZvcm1hdGlvbiBhbGxvd3MgcGFzc2luZyBzdHJpbmdzIGludG8gYm9vbGVhbi10eXBlZCBmaWVsZHNcbiAgaWYgKCgodHlwZW9mIGx2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHJ2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB8fFxuICAgICAgKHR5cGVvZiBsdmFsdWUgPT09ICdib29sZWFuJyAmJiB0eXBlb2YgcnZhbHVlID09PSAnc3RyaW5nJykpICYmXG4gICAgICBsdmFsdWUudG9TdHJpbmcoKSA9PT0gcnZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBhbGxvd3MgYSBudW1lcmljIDEwIGFuZCBhIGxpdGVyYWwgXCIxMFwiIHRvIGJlIGVxdWl2YWxlbnQ7XG4gIC8vIHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIENsb3VkRm9ybWF0aW9uLlxuICBpZiAoKHR5cGVvZiBsdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBydmFsdWUgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgc2FmZVBhcnNlRmxvYXQobHZhbHVlKSA9PT0gc2FmZVBhcnNlRmxvYXQocnZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgbHZhbHVlICE9PSB0eXBlb2YgcnZhbHVlKSB7IHJldHVybiBmYWxzZTsgfVxuICBpZiAoQXJyYXkuaXNBcnJheShsdmFsdWUpICE9PSBBcnJheS5pc0FycmF5KHJ2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChBcnJheS5pc0FycmF5KGx2YWx1ZSkgLyogJiYgQXJyYXkuaXNBcnJheShydmFsdWUpICovKSB7XG4gICAgaWYgKGx2YWx1ZS5sZW5ndGggIT09IHJ2YWx1ZS5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZm9yIChsZXQgaSA9IDAgOyBpIDwgbHZhbHVlLmxlbmd0aCA7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwobHZhbHVlW2ldLCBydmFsdWVbaV0pKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIGx2YWx1ZSA9PT0gJ29iamVjdCcgLyogJiYgdHlwZW9mIHJ2YWx1ZSA9PT0gJ29iamVjdCcgKi8pIHtcbiAgICBpZiAobHZhbHVlID09PSBudWxsIHx8IHJ2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgYm90aCB3ZXJlIG51bGwsIHRoZXknZCBoYXZlIGJlZW4gPT09XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhsdmFsdWUpO1xuICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMocnZhbHVlKS5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFydmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgIGlmIChrZXkgPT09ICdEZXBlbmRzT24nKSB7XG4gICAgICAgIGlmICghZGVwZW5kc09uRXF1YWwobHZhbHVlW2tleV0sIHJ2YWx1ZVtrZXldKSkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgICAgIC8vIGNoZWNrIGRpZmZlcmVuY2VzIG90aGVyIHRoYW4gYERlcGVuZHNPbmBcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWRlZXBFcXVhbChsdmFsdWVba2V5XSwgcnZhbHVlW2tleV0pKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBOZWl0aGVyIG9iamVjdCwgbm9yIGFycmF5OiBJIGRlZHVjZSB0aGlzIGlzIHByaW1pdGl2ZSB0eXBlXG4gIC8vIFByaW1pdGl2ZSB0eXBlIGFuZCBub3QgPT09LCBzbyBJIGRlZHVjZSBub3QgZGVlcEVxdWFsXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gYXJndW1lbnRzIHRvIERlcGVuZHNPbiBmb3IgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIGx2YWx1ZSB0aGUgbGVmdCBvcGVyYW5kIG9mIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uLlxuICogQHBhcmFtIHJ2YWx1ZSB0aGUgcmlnaHQgb3BlcmFuZCBvZiB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqXG4gKiBAcmV0dXJucyArdHJ1ZSsgaWYgYm90aCArbHZhbHVlKyBhbmQgK3J2YWx1ZSsgYXJlIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlci5cbiAqL1xuZnVuY3Rpb24gZGVwZW5kc09uRXF1YWwobHZhbHVlOiBhbnksIHJ2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIC8vIGFsbG93cyBbJ1ZhbHVlJ10gYW5kICdWYWx1ZScgdG8gYmUgZXF1YWxcbiAgaWYgKEFycmF5LmlzQXJyYXkobHZhbHVlKSAhPT0gQXJyYXkuaXNBcnJheShydmFsdWUpKSB7XG4gICAgY29uc3QgYXJyYXkgPSBBcnJheS5pc0FycmF5KGx2YWx1ZSkgPyBsdmFsdWUgOiBydmFsdWU7XG4gICAgY29uc3Qgbm9uQXJyYXkgPSBBcnJheS5pc0FycmF5KGx2YWx1ZSkgPyBydmFsdWUgOiBsdmFsdWU7XG5cbiAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAxICYmIGRlZXBFcXVhbChhcnJheVswXSwgbm9uQXJyYXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gYWxsb3dzIGFycmF5cyBwYXNzZWQgdG8gRGVwZW5kc09uIHRvIGJlIGVxdWl2YWxlbnQgaXJyZXNwZWN0aXZlIG9mIGVsZW1lbnQgb3JkZXJcbiAgaWYgKEFycmF5LmlzQXJyYXkobHZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHJ2YWx1ZSkpIHtcbiAgICBpZiAobHZhbHVlLmxlbmd0aCAhPT0gcnZhbHVlLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGxldCBpID0gMCA7IGkgPCBsdmFsdWUubGVuZ3RoIDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMCA7IGogPCBsdmFsdWUubGVuZ3RoIDsgaisrKSB7XG4gICAgICAgIGlmICgoIWRlZXBFcXVhbChsdmFsdWVbaV0sIHJ2YWx1ZVtqXSkpICYmIChqID09PSBsdmFsdWUubGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFByb2R1Y2UgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIG1hcHMsIGFzIGEgbWFwLCB1c2luZyBhIHNwZWNpZmllZCBkaWZmIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBvbGRWYWx1ZSAgdGhlIG9sZCBtYXAuXG4gKiBAcGFyYW0gbmV3VmFsdWUgIHRoZSBuZXcgbWFwLlxuICogQHBhcmFtIGVsZW1lbnREaWZmIHRoZSBkaWZmIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIGEgbWFwIHJlcHJlc2VudGluZyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiArb2xkVmFsdWUrIGFuZCArbmV3VmFsdWUrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZktleWVkRW50aXRpZXM8VD4oXG4gIG9sZFZhbHVlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkLFxuICBuZXdWYWx1ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCxcbiAgZWxlbWVudERpZmY6IChvbGRFbGVtZW50OiBhbnksIG5ld0VsZW1lbnQ6IGFueSwga2V5OiBzdHJpbmcpID0+IFQpOiB7IFtuYW1lOiBzdHJpbmddOiBUIH0ge1xuICBjb25zdCByZXN1bHQ6IHsgW25hbWU6IHN0cmluZ106IFQgfSA9IHt9O1xuICBmb3IgKGNvbnN0IGxvZ2ljYWxJZCBvZiB1bmlvbk9mKE9iamVjdC5rZXlzKG9sZFZhbHVlIHx8IHt9KSwgT2JqZWN0LmtleXMobmV3VmFsdWUgfHwge30pKSkge1xuICAgIGNvbnN0IG9sZEVsZW1lbnQgPSBvbGRWYWx1ZSAmJiBvbGRWYWx1ZVtsb2dpY2FsSWRdO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBuZXdWYWx1ZSAmJiBuZXdWYWx1ZVtsb2dpY2FsSWRdO1xuXG4gICAgaWYgKG9sZEVsZW1lbnQgPT09IHVuZGVmaW5lZCAmJiBuZXdFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFNob3VsZG4ndCBoYXBwZW4gaW4gcmVhbGl0eSwgYnV0IG1heSBoYXBwZW4gaW4gdGVzdHMuIFNraXAuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXN1bHRbbG9naWNhbElkXSA9IGVsZW1lbnREaWZmKG9sZEVsZW1lbnQsIG5ld0VsZW1lbnQsIGxvZ2ljYWxJZCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgdW5pb24gb2YgdHdvIHNldHMgb2Ygc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0gbHYgdGhlIGxlZnQgc2V0IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gcnYgdGhlIHJpZ2h0IHNldCBvZiBzdHJpbmdzLlxuICpcbiAqIEByZXR1cm5zIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lYnRzIGZyb20gK2x2KyBhbmQgK3J2Kywgd2l0aCBubyBkdXBsaWNhdGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pb25PZihsdjogc3RyaW5nW10gfCBTZXQ8c3RyaW5nPiwgcnY6IHN0cmluZ1tdIHwgU2V0PHN0cmluZz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQobHYpO1xuICBmb3IgKGNvbnN0IHYgb2YgcnYpIHtcbiAgICByZXN1bHQuYWRkKHYpO1xuICB9XG4gIHJldHVybiBuZXcgQXJyYXkoLi4ucmVzdWx0KTtcbn1cblxuLyoqXG4gKiBHZXRTdGFja1RlbXBsYXRlIGZsYXR0ZW5zIGFueSBjb2RlcG9pbnQgZ3JlYXRlciB0aGFuIFwiXFx1N2ZcIiB0byBcIj9cIi4gVGhpcyBpc1xuICogdHJ1ZSBldmVuIGZvciBjb2RlcG9pbnRzIGluIHRoZSBzdXBwbGVtZW50YWwgcGxhbmVzIHdoaWNoIGFyZSByZXByZXNlbnRlZFxuICogaW4gSlMgYXMgc3Vycm9nYXRlIHBhaXJzLCBhbGwgdGhlIHdheSB1cCB0byBcIlxcdXsxMGZmZmZ9XCIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBzYW1lIG1hbmdsaW5nIGluIG9yZGVyIHRvIHByb3ZpZGUgZGlhZ25vc3RpY1xuICogaW5mb3JtYXRpb24gaW4gYGNkayBkaWZmYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbmdsZUxpa2VDbG91ZEZvcm1hdGlvbihwYXlsb2FkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHBheWxvYWQucmVwbGFjZSgvW1xcdXs4MH0tXFx1ezEwZmZmZn1dL2d1LCAnPycpO1xufVxuXG4vKipcbiAqIEEgcGFyc2VGbG9hdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGZvclxuICogc3RyaW5ncyBsaWtlICcwLjAuMCdcbiAqIChmb3Igd2hpY2ggSmF2YVNjcmlwdCdzIHBhcnNlRmxvYXQoKSByZXR1cm5zIDApLlxuICogV2UgcmV0dXJuIE5hTiBmb3IgYWxsIG9mIHRoZXNlIHN0cmluZ3MgdGhhdCBkbyBub3QgcmVwcmVzZW50IG51bWJlcnMsXG4gKiBhbmQgc28gY29tcGFyaW5nIHRoZW0gZmFpbHMsXG4gKiBhbmQgZG9lc24ndCBzaG9ydC1jaXJjdWl0IHRoZSBkaWZmIGxvZ2ljLlxuICovXG5mdW5jdGlvbiBzYWZlUGFyc2VGbG9hdChzdHI6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBOdW1iZXIoc3RyKTtcbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DiffableCollection = void 0;\n/**\n * Calculate differences of immutable elements\n */\nclass DiffableCollection {\n constructor() {\n this.additions = [];\n this.removals = [];\n this.oldElements = [];\n this.newElements = [];\n }\n addOld(...elements) {\n this.oldElements.push(...elements);\n }\n addNew(...elements) {\n this.newElements.push(...elements);\n }\n calculateDiff() {\n this.additions.push(...difference(this.newElements, this.oldElements));\n this.removals.push(...difference(this.oldElements, this.newElements));\n }\n get hasChanges() {\n return this.additions.length + this.removals.length > 0;\n }\n get hasAdditions() {\n return this.additions.length > 0;\n }\n get hasRemovals() {\n return this.removals.length > 0;\n }\n}\nexports.DiffableCollection = DiffableCollection;\n/**\n * Whether a collection contains some element (by value)\n */\nfunction contains(element, xs) {\n return xs.some(x => x.equal(element));\n}\n/**\n * Return collection except for elements\n */\nfunction difference(collection, elements) {\n return collection.filter(x => !contains(x, elements));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZmFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7R0FFRztBQUNILE1BQWEsa0JBQWtCO0lBQS9CO1FBQ2tCLGNBQVMsR0FBUSxFQUFFLENBQUM7UUFDcEIsYUFBUSxHQUFRLEVBQUUsQ0FBQztRQUVsQixnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFRLEVBQUUsQ0FBQztJQTBCekMsQ0FBQztJQXhCUSxNQUFNLENBQUMsR0FBRyxRQUFhO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxHQUFHLFFBQWE7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU0sYUFBYTtRQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBL0JELGdEQStCQztBQVNEOztHQUVHO0FBQ0gsU0FBUyxRQUFRLENBQWtCLE9BQVUsRUFBRSxFQUFPO0lBQ3BELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFVBQVUsQ0FBa0IsVUFBZSxFQUFFLFFBQWE7SUFDakUsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2FsY3VsYXRlIGRpZmZlcmVuY2VzIG9mIGltbXV0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgY2xhc3MgRGlmZmFibGVDb2xsZWN0aW9uPFQgZXh0ZW5kcyBFcTxUPj4ge1xuICBwdWJsaWMgcmVhZG9ubHkgYWRkaXRpb25zOiBUW10gPSBbXTtcbiAgcHVibGljIHJlYWRvbmx5IHJlbW92YWxzOiBUW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9sZEVsZW1lbnRzOiBUW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdFbGVtZW50czogVFtdID0gW107XG5cbiAgcHVibGljIGFkZE9sZCguLi5lbGVtZW50czogVFtdKSB7XG4gICAgdGhpcy5vbGRFbGVtZW50cy5wdXNoKC4uLmVsZW1lbnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGROZXcoLi4uZWxlbWVudHM6IFRbXSkge1xuICAgIHRoaXMubmV3RWxlbWVudHMucHVzaCguLi5lbGVtZW50cyk7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlRGlmZigpIHtcbiAgICB0aGlzLmFkZGl0aW9ucy5wdXNoKC4uLmRpZmZlcmVuY2UodGhpcy5uZXdFbGVtZW50cywgdGhpcy5vbGRFbGVtZW50cykpO1xuICAgIHRoaXMucmVtb3ZhbHMucHVzaCguLi5kaWZmZXJlbmNlKHRoaXMub2xkRWxlbWVudHMsIHRoaXMubmV3RWxlbWVudHMpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQ2hhbmdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRpdGlvbnMubGVuZ3RoICsgdGhpcy5yZW1vdmFscy5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNBZGRpdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkaXRpb25zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc1JlbW92YWxzKCkge1xuICAgIHJldHVybiB0aGlzLnJlbW92YWxzLmxlbmd0aCA+IDA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGluZ3MgdGhhdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlbXNlbHZlcyAoYnkgdmFsdWUpXG4gKi9cbmludGVyZmFjZSBFcTxUPiB7XG4gIGVxdWFsKG90aGVyOiBUKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgY29sbGVjdGlvbiBjb250YWlucyBzb21lIGVsZW1lbnQgKGJ5IHZhbHVlKVxuICovXG5mdW5jdGlvbiBjb250YWluczxUIGV4dGVuZHMgRXE8VD4+KGVsZW1lbnQ6IFQsIHhzOiBUW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHhzLnNvbWUoeCA9PiB4LmVxdWFsKGVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gY29sbGVjdGlvbiBleGNlcHQgZm9yIGVsZW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGRpZmZlcmVuY2U8VCBleHRlbmRzIEVxPFQ+Pihjb2xsZWN0aW9uOiBUW10sIGVsZW1lbnRzOiBUW10pOiBUW10ge1xuICByZXR1cm4gY29sbGVjdGlvbi5maWx0ZXIoeCA9PiAhY29udGFpbnMoeCwgZWxlbWVudHMpKTtcbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.formatTable = void 0;\nconst chalk = require(\"chalk\");\nconst string_width_1 = require(\"string-width\");\nconst table = require(\"table\");\n/**\n * Render a two-dimensional array to a visually attractive table\n *\n * First row is considered the table header.\n */\nfunction formatTable(cells, columns) {\n return table.table(cells, {\n border: TABLE_BORDER_CHARACTERS,\n columns: buildColumnConfig(columns !== undefined ? calculateColumnWidths(cells, columns) : undefined),\n drawHorizontalLine: (line) => {\n // Numbering like this: [line 0] [header = row[0]] [line 1] [row 1] [line 2] [content 2] [line 3]\n return (line < 2 || line === cells.length) || lineBetween(cells[line - 1], cells[line]);\n },\n }).trimRight();\n}\nexports.formatTable = formatTable;\n/**\n * Whether we should draw a line between two rows\n *\n * Draw horizontal line if 2nd column values are different.\n */\nfunction lineBetween(rowA, rowB) {\n return rowA[1] !== rowB[1];\n}\nfunction buildColumnConfig(widths) {\n if (widths === undefined) {\n return undefined;\n }\n const ret = {};\n widths.forEach((width, i) => {\n if (width === undefined) {\n return;\n }\n ret[i] = { width };\n });\n return ret;\n}\n/**\n * Calculate column widths given a terminal width\n *\n * We do this by calculating a fair share for every column. Extra width smaller\n * than the fair share is evenly distributed over all columns that exceed their\n * fair share.\n */\nfunction calculateColumnWidths(rows, terminalWidth) {\n // The terminal is sometimes reported to be 0. Also if the terminal is VERY narrow,\n // just assume a reasonable minimum size.\n terminalWidth = Math.max(terminalWidth, 40);\n // use 'string-width' to not count ANSI chars as actual character width\n const columns = rows[0].map((_, i) => Math.max(...rows.map(row => (0, string_width_1.default)(String(row[i])))));\n // If we have no terminal width, do nothing\n const contentWidth = terminalWidth - 2 - columns.length * 3;\n // If we don't exceed the terminal width, do nothing\n if (sum(columns) <= contentWidth) {\n return columns;\n }\n const fairShare = Math.min(contentWidth / columns.length);\n const smallColumns = columns.filter(w => w < fairShare);\n let distributableWidth = contentWidth - sum(smallColumns);\n const fairDistributable = Math.floor(distributableWidth / (columns.length - smallColumns.length));\n const ret = new Array();\n for (const requestedWidth of columns) {\n if (requestedWidth < fairShare) {\n // Small column gets what they want\n ret.push(requestedWidth);\n }\n else {\n // Last column gets all remaining, otherwise get fair redist share\n const width = distributableWidth < 2 * fairDistributable ? distributableWidth : fairDistributable;\n ret.push(width);\n distributableWidth -= width;\n }\n }\n return ret;\n}\nfunction sum(xs) {\n let total = 0;\n for (const x of xs) {\n total += x;\n }\n return total;\n}\n// What color the table is going to be\nconst tableColor = chalk.gray;\n// Unicode table characters with a color\nconst TABLE_BORDER_CHARACTERS = {\n topBody: tableColor('─'),\n topJoin: tableColor('┬'),\n topLeft: tableColor('┌'),\n topRight: tableColor('┐'),\n bottomBody: tableColor('─'),\n bottomJoin: tableColor('┴'),\n bottomLeft: tableColor('└'),\n bottomRight: tableColor('┘'),\n bodyLeft: tableColor('│'),\n bodyRight: tableColor('│'),\n bodyJoin: tableColor('│'),\n joinBody: tableColor('─'),\n joinLeft: tableColor('├'),\n joinRight: tableColor('┤'),\n joinJoin: tableColor('┼'),\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LXRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZm9ybWF0LXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUMvQiwrQ0FBdUM7QUFDdkMsK0JBQStCO0FBRS9COzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQUMsS0FBaUIsRUFBRSxPQUEyQjtJQUN4RSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQ3hCLE1BQU0sRUFBRSx1QkFBdUI7UUFDL0IsT0FBTyxFQUFFLGlCQUFpQixDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3JHLGtCQUFrQixFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDM0IsaUdBQWlHO1lBQ2pHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUYsQ0FBQztLQUNGLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNqQixDQUFDO0FBVEQsa0NBU0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxXQUFXLENBQUMsSUFBYyxFQUFFLElBQWM7SUFDakQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE1BQTRCO0lBQ3JELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0tBQUU7SUFFL0MsTUFBTSxHQUFHLEdBQWdELEVBQUUsQ0FBQztJQUM1RCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixPQUFPO1NBQ1I7UUFDRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMscUJBQXFCLENBQUMsSUFBZ0IsRUFBRSxhQUFxQjtJQUNwRSxtRkFBbUY7SUFDbkYseUNBQXlDO0lBQ3pDLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUU1Qyx1RUFBdUU7SUFDdkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBQSxzQkFBVyxFQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWpHLDJDQUEyQztJQUMzQyxNQUFNLFlBQVksR0FBRyxhQUFhLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRTVELG9EQUFvRDtJQUNwRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxZQUFZLEVBQUU7UUFBRSxPQUFPLE9BQU8sQ0FBQztLQUFFO0lBRXJELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRXhELElBQUksa0JBQWtCLEdBQUcsWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRWxHLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFDaEMsS0FBSyxNQUFNLGNBQWMsSUFBSSxPQUFPLEVBQUU7UUFDcEMsSUFBSSxjQUFjLEdBQUcsU0FBUyxFQUFFO1lBQzlCLG1DQUFtQztZQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQzFCO2FBQU07WUFDTCxrRUFBa0U7WUFDbEUsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7WUFDbEcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixrQkFBa0IsSUFBSSxLQUFLLENBQUM7U0FDN0I7S0FDRjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsR0FBRyxDQUFDLEVBQVk7SUFDdkIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsS0FBSyxJQUFJLENBQUMsQ0FBQztLQUNaO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsc0NBQXNDO0FBQ3RDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFFOUIsd0NBQXdDO0FBQ3hDLE1BQU0sdUJBQXVCLEdBQUc7SUFDOUIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDeEIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDeEIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDeEIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDekIsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDM0IsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDM0IsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDM0IsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDNUIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDekIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDMUIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDekIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDekIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDekIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDMUIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7Q0FDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBzdHJpbmdXaWR0aCBmcm9tICdzdHJpbmctd2lkdGgnO1xuaW1wb3J0ICogYXMgdGFibGUgZnJvbSAndGFibGUnO1xuXG4vKipcbiAqIFJlbmRlciBhIHR3by1kaW1lbnNpb25hbCBhcnJheSB0byBhIHZpc3VhbGx5IGF0dHJhY3RpdmUgdGFibGVcbiAqXG4gKiBGaXJzdCByb3cgaXMgY29uc2lkZXJlZCB0aGUgdGFibGUgaGVhZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGFibGUoY2VsbHM6IHN0cmluZ1tdW10sIGNvbHVtbnM6IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiB0YWJsZS50YWJsZShjZWxscywge1xuICAgIGJvcmRlcjogVEFCTEVfQk9SREVSX0NIQVJBQ1RFUlMsXG4gICAgY29sdW1uczogYnVpbGRDb2x1bW5Db25maWcoY29sdW1ucyAhPT0gdW5kZWZpbmVkID8gY2FsY3VsYXRlQ29sdW1uV2lkdGhzKGNlbGxzLCBjb2x1bW5zKSA6IHVuZGVmaW5lZCksXG4gICAgZHJhd0hvcml6b250YWxMaW5lOiAobGluZSkgPT4ge1xuICAgICAgLy8gTnVtYmVyaW5nIGxpa2UgdGhpczogW2xpbmUgMF0gW2hlYWRlciA9IHJvd1swXV0gW2xpbmUgMV0gW3JvdyAxXSBbbGluZSAyXSBbY29udGVudCAyXSBbbGluZSAzXVxuICAgICAgcmV0dXJuIChsaW5lIDwgMiB8fCBsaW5lID09PSBjZWxscy5sZW5ndGgpIHx8IGxpbmVCZXR3ZWVuKGNlbGxzW2xpbmUgLSAxXSwgY2VsbHNbbGluZV0pO1xuICAgIH0sXG4gIH0pLnRyaW1SaWdodCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgd2Ugc2hvdWxkIGRyYXcgYSBsaW5lIGJldHdlZW4gdHdvIHJvd3NcbiAqXG4gKiBEcmF3IGhvcml6b250YWwgbGluZSBpZiAybmQgY29sdW1uIHZhbHVlcyBhcmUgZGlmZmVyZW50LlxuICovXG5mdW5jdGlvbiBsaW5lQmV0d2Vlbihyb3dBOiBzdHJpbmdbXSwgcm93Qjogc3RyaW5nW10pIHtcbiAgcmV0dXJuIHJvd0FbMV0gIT09IHJvd0JbMV07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29sdW1uQ29uZmlnKHdpZHRoczogbnVtYmVyW10gfCB1bmRlZmluZWQpOiB7IFtpbmRleDogbnVtYmVyXTogdGFibGUuQ29sdW1uVXNlckNvbmZpZyB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHdpZHRocyA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cblxuICBjb25zdCByZXQ6IHsgW2luZGV4OiBudW1iZXJdOiB0YWJsZS5Db2x1bW5Vc2VyQ29uZmlnIH0gPSB7fTtcbiAgd2lkdGhzLmZvckVhY2goKHdpZHRoLCBpKSA9PiB7XG4gICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0W2ldID0geyB3aWR0aCB9O1xuICB9KTtcblxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBjb2x1bW4gd2lkdGhzIGdpdmVuIGEgdGVybWluYWwgd2lkdGhcbiAqXG4gKiBXZSBkbyB0aGlzIGJ5IGNhbGN1bGF0aW5nIGEgZmFpciBzaGFyZSBmb3IgZXZlcnkgY29sdW1uLiBFeHRyYSB3aWR0aCBzbWFsbGVyXG4gKiB0aGFuIHRoZSBmYWlyIHNoYXJlIGlzIGV2ZW5seSBkaXN0cmlidXRlZCBvdmVyIGFsbCBjb2x1bW5zIHRoYXQgZXhjZWVkIHRoZWlyXG4gKiBmYWlyIHNoYXJlLlxuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVDb2x1bW5XaWR0aHMocm93czogc3RyaW5nW11bXSwgdGVybWluYWxXaWR0aDogbnVtYmVyKTogbnVtYmVyW10ge1xuICAvLyBUaGUgdGVybWluYWwgaXMgc29tZXRpbWVzIHJlcG9ydGVkIHRvIGJlIDAuIEFsc28gaWYgdGhlIHRlcm1pbmFsIGlzIFZFUlkgbmFycm93LFxuICAvLyBqdXN0IGFzc3VtZSBhIHJlYXNvbmFibGUgbWluaW11bSBzaXplLlxuICB0ZXJtaW5hbFdpZHRoID0gTWF0aC5tYXgodGVybWluYWxXaWR0aCwgNDApO1xuXG4gIC8vIHVzZSAnc3RyaW5nLXdpZHRoJyB0byBub3QgY291bnQgQU5TSSBjaGFycyBhcyBhY3R1YWwgY2hhcmFjdGVyIHdpZHRoXG4gIGNvbnN0IGNvbHVtbnMgPSByb3dzWzBdLm1hcCgoXywgaSkgPT4gTWF0aC5tYXgoLi4ucm93cy5tYXAocm93ID0+IHN0cmluZ1dpZHRoKFN0cmluZyhyb3dbaV0pKSkpKTtcblxuICAvLyBJZiB3ZSBoYXZlIG5vIHRlcm1pbmFsIHdpZHRoLCBkbyBub3RoaW5nXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IHRlcm1pbmFsV2lkdGggLSAyIC0gY29sdW1ucy5sZW5ndGggKiAzO1xuXG4gIC8vIElmIHdlIGRvbid0IGV4Y2VlZCB0aGUgdGVybWluYWwgd2lkdGgsIGRvIG5vdGhpbmdcbiAgaWYgKHN1bShjb2x1bW5zKSA8PSBjb250ZW50V2lkdGgpIHsgcmV0dXJuIGNvbHVtbnM7IH1cblxuICBjb25zdCBmYWlyU2hhcmUgPSBNYXRoLm1pbihjb250ZW50V2lkdGggLyBjb2x1bW5zLmxlbmd0aCk7XG4gIGNvbnN0IHNtYWxsQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKHcgPT4gdyA8IGZhaXJTaGFyZSk7XG5cbiAgbGV0IGRpc3RyaWJ1dGFibGVXaWR0aCA9IGNvbnRlbnRXaWR0aCAtIHN1bShzbWFsbENvbHVtbnMpO1xuICBjb25zdCBmYWlyRGlzdHJpYnV0YWJsZSA9IE1hdGguZmxvb3IoZGlzdHJpYnV0YWJsZVdpZHRoIC8gKGNvbHVtbnMubGVuZ3RoIC0gc21hbGxDb2x1bW5zLmxlbmd0aCkpO1xuXG4gIGNvbnN0IHJldCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgcmVxdWVzdGVkV2lkdGggb2YgY29sdW1ucykge1xuICAgIGlmIChyZXF1ZXN0ZWRXaWR0aCA8IGZhaXJTaGFyZSkge1xuICAgICAgLy8gU21hbGwgY29sdW1uIGdldHMgd2hhdCB0aGV5IHdhbnRcbiAgICAgIHJldC5wdXNoKHJlcXVlc3RlZFdpZHRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGFzdCBjb2x1bW4gZ2V0cyBhbGwgcmVtYWluaW5nLCBvdGhlcndpc2UgZ2V0IGZhaXIgcmVkaXN0IHNoYXJlXG4gICAgICBjb25zdCB3aWR0aCA9IGRpc3RyaWJ1dGFibGVXaWR0aCA8IDIgKiBmYWlyRGlzdHJpYnV0YWJsZSA/IGRpc3RyaWJ1dGFibGVXaWR0aCA6IGZhaXJEaXN0cmlidXRhYmxlO1xuICAgICAgcmV0LnB1c2god2lkdGgpO1xuICAgICAgZGlzdHJpYnV0YWJsZVdpZHRoIC09IHdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHN1bSh4czogbnVtYmVyW10pOiBudW1iZXIge1xuICBsZXQgdG90YWwgPSAwO1xuICBmb3IgKGNvbnN0IHggb2YgeHMpIHtcbiAgICB0b3RhbCArPSB4O1xuICB9XG4gIHJldHVybiB0b3RhbDtcbn1cblxuLy8gV2hhdCBjb2xvciB0aGUgdGFibGUgaXMgZ29pbmcgdG8gYmVcbmNvbnN0IHRhYmxlQ29sb3IgPSBjaGFsay5ncmF5O1xuXG4vLyBVbmljb2RlIHRhYmxlIGNoYXJhY3RlcnMgd2l0aCBhIGNvbG9yXG5jb25zdCBUQUJMRV9CT1JERVJfQ0hBUkFDVEVSUyA9IHtcbiAgdG9wQm9keTogdGFibGVDb2xvcign4pSAJyksXG4gIHRvcEpvaW46IHRhYmxlQ29sb3IoJ+KUrCcpLFxuICB0b3BMZWZ0OiB0YWJsZUNvbG9yKCfilIwnKSxcbiAgdG9wUmlnaHQ6IHRhYmxlQ29sb3IoJ+KUkCcpLFxuICBib3R0b21Cb2R5OiB0YWJsZUNvbG9yKCfilIAnKSxcbiAgYm90dG9tSm9pbjogdGFibGVDb2xvcign4pS0JyksXG4gIGJvdHRvbUxlZnQ6IHRhYmxlQ29sb3IoJ+KUlCcpLFxuICBib3R0b21SaWdodDogdGFibGVDb2xvcign4pSYJyksXG4gIGJvZHlMZWZ0OiB0YWJsZUNvbG9yKCfilIInKSxcbiAgYm9keVJpZ2h0OiB0YWJsZUNvbG9yKCfilIInKSxcbiAgYm9keUpvaW46IHRhYmxlQ29sb3IoJ+KUgicpLFxuICBqb2luQm9keTogdGFibGVDb2xvcign4pSAJyksXG4gIGpvaW5MZWZ0OiB0YWJsZUNvbG9yKCfilJwnKSxcbiAgam9pblJpZ2h0OiB0YWJsZUNvbG9yKCfilKQnKSxcbiAgam9pbkpvaW46IHRhYmxlQ29sb3IoJ+KUvCcpLFxufTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.formatSecurityChanges = exports.formatDifferences = void 0;\nconst util_1 = require(\"util\");\nconst chalk = require(\"chalk\");\nconst util_2 = require(\"./diff/util\");\nconst diff_template_1 = require(\"./diff-template\");\nconst format_table_1 = require(\"./format-table\");\n// from cx-api\nconst PATH_METADATA_KEY = 'aws:cdk:path';\n/* eslint-disable @typescript-eslint/no-require-imports */\nconst { structuredPatch } = require('diff');\n/**\n * Renders template differences to the process' console.\n *\n * @param stream The IO stream where to output the rendered diff.\n * @param templateDiff TemplateDiff to be rendered to the console.\n * @param logicalToPathMap A map from logical ID to construct path. Useful in\n * case there is no aws:cdk:path metadata in the template.\n * @param context the number of context lines to use in arbitrary JSON diff (defaults to 3).\n */\nfunction formatDifferences(stream, templateDiff, logicalToPathMap = {}, context = 3) {\n const formatter = new Formatter(stream, logicalToPathMap, templateDiff, context);\n if (templateDiff.awsTemplateFormatVersion || templateDiff.transform || templateDiff.description) {\n formatter.printSectionHeader('Template');\n formatter.formatDifference('AWSTemplateFormatVersion', 'AWSTemplateFormatVersion', templateDiff.awsTemplateFormatVersion);\n formatter.formatDifference('Transform', 'Transform', templateDiff.transform);\n formatter.formatDifference('Description', 'Description', templateDiff.description);\n formatter.printSectionFooter();\n }\n formatSecurityChangesWithBanner(formatter, templateDiff);\n formatter.formatSection('Parameters', 'Parameter', templateDiff.parameters);\n formatter.formatSection('Metadata', 'Metadata', templateDiff.metadata);\n formatter.formatSection('Mappings', 'Mapping', templateDiff.mappings);\n formatter.formatSection('Conditions', 'Condition', templateDiff.conditions);\n formatter.formatSection('Resources', 'Resource', templateDiff.resources, formatter.formatResourceDifference.bind(formatter));\n formatter.formatSection('Outputs', 'Output', templateDiff.outputs);\n formatter.formatSection('Other Changes', 'Unknown', templateDiff.unknown);\n}\nexports.formatDifferences = formatDifferences;\n/**\n * Renders a diff of security changes to the given stream\n */\nfunction formatSecurityChanges(stream, templateDiff, logicalToPathMap = {}, context) {\n const formatter = new Formatter(stream, logicalToPathMap, templateDiff, context);\n formatSecurityChangesWithBanner(formatter, templateDiff);\n}\nexports.formatSecurityChanges = formatSecurityChanges;\nfunction formatSecurityChangesWithBanner(formatter, templateDiff) {\n if (!templateDiff.iamChanges.hasChanges && !templateDiff.securityGroupChanges.hasChanges) {\n return;\n }\n formatter.formatIamChanges(templateDiff.iamChanges);\n formatter.formatSecurityGroupChanges(templateDiff.securityGroupChanges);\n formatter.warning('(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)');\n formatter.printSectionFooter();\n}\nconst ADDITION = chalk.green('[+]');\nconst CONTEXT = chalk.grey('[ ]');\nconst UPDATE = chalk.yellow('[~]');\nconst REMOVAL = chalk.red('[-]');\nclass Formatter {\n constructor(stream, logicalToPathMap, diff, context = 3) {\n this.stream = stream;\n this.logicalToPathMap = logicalToPathMap;\n this.context = context;\n // Read additional construct paths from the diff if it is supplied\n if (diff) {\n this.readConstructPathsFrom(diff);\n }\n }\n print(fmt, ...args) {\n this.stream.write(chalk.white((0, util_1.format)(fmt, ...args)) + '\\n');\n }\n warning(fmt, ...args) {\n this.stream.write(chalk.yellow((0, util_1.format)(fmt, ...args)) + '\\n');\n }\n formatSection(title, entryType, collection, formatter = this.formatDifference.bind(this)) {\n if (collection.differenceCount === 0) {\n return;\n }\n this.printSectionHeader(title);\n collection.forEachDifference((id, diff) => formatter(entryType, id, diff));\n this.printSectionFooter();\n }\n printSectionHeader(title) {\n this.print(chalk.underline(chalk.bold(title)));\n }\n printSectionFooter() {\n this.print('');\n }\n /**\n * Print a simple difference for a given named entity.\n *\n * @param logicalId the name of the entity that is different.\n * @param diff the difference to be rendered.\n */\n formatDifference(type, logicalId, diff) {\n if (!diff || !diff.isDifferent) {\n return;\n }\n let value;\n const oldValue = this.formatValue(diff.oldValue, chalk.red);\n const newValue = this.formatValue(diff.newValue, chalk.green);\n if (diff.isAddition) {\n value = newValue;\n }\n else if (diff.isUpdate) {\n value = `${oldValue} to ${newValue}`;\n }\n else if (diff.isRemoval) {\n value = oldValue;\n }\n this.print(`${this.formatPrefix(diff)} ${chalk.cyan(type)} ${this.formatLogicalId(logicalId)}: ${value}`);\n }\n /**\n * Print a resource difference for a given logical ID.\n *\n * @param logicalId the logical ID of the resource that changed.\n * @param diff the change to be rendered.\n */\n formatResourceDifference(_type, logicalId, diff) {\n if (!diff.isDifferent) {\n return;\n }\n const resourceType = diff.isRemoval ? diff.oldResourceType : diff.newResourceType;\n // eslint-disable-next-line max-len\n this.print(`${this.formatPrefix(diff)} ${this.formatValue(resourceType, chalk.cyan)} ${this.formatLogicalId(logicalId)} ${this.formatImpact(diff.changeImpact)}`);\n if (diff.isUpdate) {\n const differenceCount = diff.differenceCount;\n let processedCount = 0;\n diff.forEachDifference((_, name, values) => {\n processedCount += 1;\n this.formatTreeDiff(name, values, processedCount === differenceCount);\n });\n }\n }\n formatPrefix(diff) {\n if (diff.isAddition) {\n return ADDITION;\n }\n if (diff.isUpdate) {\n return UPDATE;\n }\n if (diff.isRemoval) {\n return REMOVAL;\n }\n return chalk.white('[?]');\n }\n /**\n * @param value the value to be formatted.\n * @param color the color to be used.\n *\n * @returns the formatted string, with color applied.\n */\n formatValue(value, color) {\n if (value == null) {\n return undefined;\n }\n if (typeof value === 'string') {\n return color(value);\n }\n return color(JSON.stringify(value));\n }\n /**\n * @param impact the impact to be formatted\n * @returns a user-friendly, colored string representing the impact.\n */\n formatImpact(impact) {\n switch (impact) {\n case diff_template_1.ResourceImpact.MAY_REPLACE:\n return chalk.italic(chalk.yellow('may be replaced'));\n case diff_template_1.ResourceImpact.WILL_REPLACE:\n return chalk.italic(chalk.bold(chalk.red('replace')));\n case diff_template_1.ResourceImpact.WILL_DESTROY:\n return chalk.italic(chalk.bold(chalk.red('destroy')));\n case diff_template_1.ResourceImpact.WILL_ORPHAN:\n return chalk.italic(chalk.yellow('orphan'));\n case diff_template_1.ResourceImpact.WILL_UPDATE:\n case diff_template_1.ResourceImpact.WILL_CREATE:\n case diff_template_1.ResourceImpact.NO_CHANGE:\n return ''; // no extra info is gained here\n }\n }\n /**\n * Renders a tree of differences under a particular name.\n * @param name the name of the root of the tree.\n * @param diff the difference on the tree.\n * @param last whether this is the last node of a parent tree.\n */\n formatTreeDiff(name, diff, last) {\n let additionalInfo = '';\n if ((0, diff_template_1.isPropertyDifference)(diff)) {\n if (diff.changeImpact === diff_template_1.ResourceImpact.MAY_REPLACE) {\n additionalInfo = ' (may cause replacement)';\n }\n else if (diff.changeImpact === diff_template_1.ResourceImpact.WILL_REPLACE) {\n additionalInfo = ' (requires replacement)';\n }\n }\n this.print(' %s─ %s %s%s', last ? '└' : '├', this.changeTag(diff.oldValue, diff.newValue), name, additionalInfo);\n return this.formatObjectDiff(diff.oldValue, diff.newValue, ` ${last ? ' ' : '│'}`);\n }\n /**\n * Renders the difference between two objects, looking for the differences as deep as possible,\n * and rendering a tree graph of the path until the difference is found.\n *\n * @param oldObject the old object.\n * @param newObject the new object.\n * @param linePrefix a prefix (indent-like) to be used on every line.\n */\n formatObjectDiff(oldObject, newObject, linePrefix) {\n if ((typeof oldObject !== typeof newObject) || Array.isArray(oldObject) || typeof oldObject === 'string' || typeof oldObject === 'number') {\n if (oldObject !== undefined && newObject !== undefined) {\n if (typeof oldObject === 'object' || typeof newObject === 'object') {\n const oldStr = JSON.stringify(oldObject, null, 2);\n const newStr = JSON.stringify(newObject, null, 2);\n const diff = _diffStrings(oldStr, newStr, this.context);\n for (let i = 0; i < diff.length; i++) {\n this.print('%s %s %s', linePrefix, i === 0 ? '└─' : ' ', diff[i]);\n }\n }\n else {\n this.print('%s ├─ %s %s', linePrefix, REMOVAL, this.formatValue(oldObject, chalk.red));\n this.print('%s └─ %s %s', linePrefix, ADDITION, this.formatValue(newObject, chalk.green));\n }\n }\n else if (oldObject !== undefined /* && newObject === undefined */) {\n this.print('%s └─ %s', linePrefix, this.formatValue(oldObject, chalk.red));\n }\n else /* if (oldObject === undefined && newObject !== undefined) */ {\n this.print('%s └─ %s', linePrefix, this.formatValue(newObject, chalk.green));\n }\n return;\n }\n const keySet = new Set(Object.keys(oldObject));\n Object.keys(newObject).forEach(k => keySet.add(k));\n const keys = new Array(...keySet).filter(k => !(0, util_2.deepEqual)(oldObject[k], newObject[k])).sort();\n const lastKey = keys[keys.length - 1];\n for (const key of keys) {\n const oldValue = oldObject[key];\n const newValue = newObject[key];\n const treePrefix = key === lastKey ? '└' : '├';\n if (oldValue !== undefined && newValue !== undefined) {\n this.print('%s %s─ %s %s:', linePrefix, treePrefix, this.changeTag(oldValue, newValue), chalk.blue(`.${key}`));\n this.formatObjectDiff(oldValue, newValue, `${linePrefix} ${key === lastKey ? ' ' : '│'}`);\n }\n else if (oldValue !== undefined /* && newValue === undefined */) {\n this.print('%s %s─ %s Removed: %s', linePrefix, treePrefix, REMOVAL, chalk.blue(`.${key}`));\n }\n else /* if (oldValue === undefined && newValue !== undefined */ {\n this.print('%s %s─ %s Added: %s', linePrefix, treePrefix, ADDITION, chalk.blue(`.${key}`));\n }\n }\n }\n /**\n * @param oldValue the old value of a difference.\n * @param newValue the new value of a difference.\n *\n * @returns a tag to be rendered in the diff, reflecting whether the difference\n * was an ADDITION, UPDATE or REMOVAL.\n */\n changeTag(oldValue, newValue) {\n if (oldValue !== undefined && newValue !== undefined) {\n return UPDATE;\n }\n else if (oldValue !== undefined /* && newValue === undefined*/) {\n return REMOVAL;\n }\n else /* if (oldValue === undefined && newValue !== undefined) */ {\n return ADDITION;\n }\n }\n /**\n * Find 'aws:cdk:path' metadata in the diff and add it to the logicalToPathMap\n *\n * There are multiple sources of logicalID -> path mappings: synth metadata\n * and resource metadata, and we combine all sources into a single map.\n */\n readConstructPathsFrom(templateDiff) {\n for (const [logicalId, resourceDiff] of Object.entries(templateDiff.resources)) {\n if (!resourceDiff) {\n continue;\n }\n const oldPathMetadata = resourceDiff.oldValue && resourceDiff.oldValue.Metadata && resourceDiff.oldValue.Metadata[PATH_METADATA_KEY];\n if (oldPathMetadata && !(logicalId in this.logicalToPathMap)) {\n this.logicalToPathMap[logicalId] = oldPathMetadata;\n }\n const newPathMetadata = resourceDiff.newValue && resourceDiff.newValue.Metadata && resourceDiff.newValue.Metadata[PATH_METADATA_KEY];\n if (newPathMetadata && !(logicalId in this.logicalToPathMap)) {\n this.logicalToPathMap[logicalId] = newPathMetadata;\n }\n }\n }\n formatLogicalId(logicalId) {\n // if we have a path in the map, return it\n const normalized = this.normalizedLogicalIdPath(logicalId);\n if (normalized) {\n return `${normalized} ${chalk.gray(logicalId)}`;\n }\n return logicalId;\n }\n normalizedLogicalIdPath(logicalId) {\n // if we have a path in the map, return it\n const path = this.logicalToPathMap[logicalId];\n return path ? normalizePath(path) : undefined;\n /**\n * Path is supposed to start with \"/stack-name\". If this is the case (i.e. path has more than\n * two components, we remove the first part. Otherwise, we just use the full path.\n * @param p\n */\n function normalizePath(p) {\n if (p.startsWith('/')) {\n p = p.slice(1);\n }\n let parts = p.split('/');\n if (parts.length > 1) {\n parts = parts.slice(1);\n // remove the last component if it's \"Resource\" or \"Default\" (if we have more than a single component)\n if (parts.length > 1) {\n const last = parts[parts.length - 1];\n if (last === 'Resource' || last === 'Default') {\n parts = parts.slice(0, parts.length - 1);\n }\n }\n p = parts.join('/');\n }\n return p;\n }\n }\n formatIamChanges(changes) {\n if (!changes.hasChanges) {\n return;\n }\n if (changes.statements.hasChanges) {\n this.printSectionHeader('IAM Statement Changes');\n this.print((0, format_table_1.formatTable)(this.deepSubstituteBracedLogicalIds(changes.summarizeStatements()), this.stream.columns));\n }\n if (changes.managedPolicies.hasChanges) {\n this.printSectionHeader('IAM Policy Changes');\n this.print((0, format_table_1.formatTable)(this.deepSubstituteBracedLogicalIds(changes.summarizeManagedPolicies()), this.stream.columns));\n }\n }\n formatSecurityGroupChanges(changes) {\n if (!changes.hasChanges) {\n return;\n }\n this.printSectionHeader('Security Group Changes');\n this.print((0, format_table_1.formatTable)(this.deepSubstituteBracedLogicalIds(changes.summarize()), this.stream.columns));\n }\n deepSubstituteBracedLogicalIds(rows) {\n return rows.map(row => row.map(this.substituteBracedLogicalIds.bind(this)));\n }\n /**\n * Substitute all strings like ${LogId.xxx} with the path instead of the logical ID\n */\n substituteBracedLogicalIds(source) {\n return source.replace(/\\$\\{([^.}]+)(.[^}]+)?\\}/ig, (_match, logId, suffix) => {\n return '${' + (this.normalizedLogicalIdPath(logId) || logId) + (suffix || '') + '}';\n });\n }\n}\n/**\n * Creates a unified diff of two strings.\n *\n * @param oldStr the \"old\" version of the string.\n * @param newStr the \"new\" version of the string.\n * @param context the number of context lines to use in arbitrary JSON diff.\n *\n * @returns an array of diff lines.\n */\nfunction _diffStrings(oldStr, newStr, context) {\n const patch = structuredPatch(null, null, oldStr, newStr, null, null, { context });\n const result = new Array();\n for (const hunk of patch.hunks) {\n result.push(chalk.magenta(`@@ -${hunk.oldStart},${hunk.oldLines} +${hunk.newStart},${hunk.newLines} @@`));\n const baseIndent = _findIndent(hunk.lines);\n for (const line of hunk.lines) {\n // Don't care about termination newline.\n if (line === '\\\\ No newline at end of file') {\n continue;\n }\n const marker = line.charAt(0);\n const text = line.slice(1 + baseIndent);\n switch (marker) {\n case ' ':\n result.push(`${CONTEXT} ${text}`);\n break;\n case '+':\n result.push(chalk.bold(`${ADDITION} ${chalk.green(text)}`));\n break;\n case '-':\n result.push(chalk.bold(`${REMOVAL} ${chalk.red(text)}`));\n break;\n default:\n throw new Error(`Unexpected diff marker: ${marker} (full line: ${line})`);\n }\n }\n }\n return result;\n function _findIndent(lines) {\n let indent = Number.MAX_SAFE_INTEGER;\n for (const line of lines) {\n for (let i = 1; i < line.length; i++) {\n if (line.charAt(i) !== ' ') {\n indent = indent > i - 1 ? i - 1 : indent;\n break;\n }\n }\n }\n return indent;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUE4QjtBQUM5QiwrQkFBK0I7QUFFL0Isc0NBQXdDO0FBQ3hDLG1EQUF1RztBQUN2RyxpREFBNkM7QUFJN0MsY0FBYztBQUNkLE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDO0FBRXpDLDBEQUEwRDtBQUMxRCxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBTzVDOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLE1BQW9CLEVBQ3BCLFlBQTBCLEVBQzFCLG1CQUFvRCxFQUFHLEVBQ3ZELFVBQWtCLENBQUM7SUFDbkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVqRixJQUFJLFlBQVksQ0FBQyx3QkFBd0IsSUFBSSxZQUFZLENBQUMsU0FBUyxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUU7UUFDL0YsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsRUFBRSwwQkFBMEIsRUFBRSxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUMxSCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0UsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25GLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0tBQ2hDO0lBRUQsK0JBQStCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRXpELFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RSxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RFLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzdILFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBeEJELDhDQXdCQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQ25DLE1BQTZCLEVBQzdCLFlBQTBCLEVBQzFCLG1CQUFrRCxFQUFFLEVBQ3BELE9BQWdCO0lBQ2hCLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFakYsK0JBQStCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFSRCxzREFRQztBQUVELFNBQVMsK0JBQStCLENBQUMsU0FBb0IsRUFBRSxZQUEwQjtJQUN2RixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFO1FBQUUsT0FBTztLQUFFO0lBQ3JHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEQsU0FBUyxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRXhFLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0hBQWdILENBQUMsQ0FBQztJQUNwSSxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUVqQyxNQUFNLFNBQVM7SUFDYixZQUNtQixNQUFvQixFQUNwQixnQkFBaUQsRUFDbEUsSUFBbUIsRUFDRixVQUFrQixDQUFDO1FBSG5CLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQztRQUVqRCxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ3BDLGtFQUFrRTtRQUNsRSxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVztRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUEsYUFBTSxFQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBQSxhQUFNLEVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU0sYUFBYSxDQUNsQixLQUFhLEVBQ2IsU0FBaUIsRUFDakIsVUFBc0MsRUFDdEMsWUFBeUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFekYsSUFBSSxVQUFVLENBQUMsZUFBZSxLQUFLLENBQUMsRUFBRTtZQUNwQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sa0JBQWtCLENBQUMsS0FBYTtRQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGdCQUFnQixDQUFDLElBQVksRUFBRSxTQUFpQixFQUFFLElBQWlDO1FBQ3hGLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRTNDLElBQUksS0FBSyxDQUFDO1FBRVYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ2xCO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3hCLEtBQUssR0FBRyxHQUFHLFFBQVEsT0FBTyxRQUFRLEVBQUUsQ0FBQztTQUN0QzthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN6QixLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksd0JBQXdCLENBQUMsS0FBYSxFQUFFLFNBQWlCLEVBQUUsSUFBd0I7UUFDeEYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUVsRixtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWxLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzdDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUN6QyxjQUFjLElBQUksQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxLQUFLLGVBQWUsQ0FBQyxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU0sWUFBWSxDQUFJLElBQW1CO1FBQ3hDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU8sUUFBUSxDQUFDO1NBQUU7UUFDekMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQUUsT0FBTyxNQUFNLENBQUM7U0FBRTtRQUNyQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPLE9BQU8sQ0FBQztTQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxXQUFXLENBQUMsS0FBVSxFQUFFLEtBQThCO1FBQzNELElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtZQUFFLE9BQU8sU0FBUyxDQUFDO1NBQUU7UUFDeEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUFFO1FBQ3ZELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksWUFBWSxDQUFDLE1BQXNCO1FBQ3hDLFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyw4QkFBYyxDQUFDLFdBQVc7Z0JBQzdCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUN2RCxLQUFLLDhCQUFjLENBQUMsWUFBWTtnQkFDOUIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsS0FBSyw4QkFBYyxDQUFDLFlBQVk7Z0JBQzlCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELEtBQUssOEJBQWMsQ0FBQyxXQUFXO2dCQUM3QixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzlDLEtBQUssOEJBQWMsQ0FBQyxXQUFXLENBQUM7WUFDaEMsS0FBSyw4QkFBYyxDQUFDLFdBQVcsQ0FBQztZQUNoQyxLQUFLLDhCQUFjLENBQUMsU0FBUztnQkFDM0IsT0FBTyxFQUFFLENBQUMsQ0FBQywrQkFBK0I7U0FDN0M7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxjQUFjLENBQUMsSUFBWSxFQUFFLElBQXFCLEVBQUUsSUFBYTtRQUN0RSxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFBLG9DQUFvQixFQUFDLElBQUksQ0FBQyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyw4QkFBYyxDQUFDLFdBQVcsRUFBRTtnQkFDcEQsY0FBYyxHQUFHLDBCQUEwQixDQUFDO2FBQzdDO2lCQUFNLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyw4QkFBYyxDQUFDLFlBQVksRUFBRTtnQkFDNUQsY0FBYyxHQUFHLHlCQUF5QixDQUFDO2FBQzVDO1NBQ0Y7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2pILE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZ0JBQWdCLENBQUMsU0FBYyxFQUFFLFNBQWMsRUFBRSxVQUFrQjtRQUN4RSxJQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssT0FBTyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDekksSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7Z0JBQ3RELElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtvQkFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUcsQ0FBQyxFQUFFLEVBQUU7d0JBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdEU7aUJBQ0Y7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDekYsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDN0Y7YUFDRjtpQkFBTSxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsZ0NBQWdDLEVBQUU7Z0JBQ25FLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM5RTtpQkFBTSw2REFBNkQsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsT0FBTztTQUNSO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFBLGdCQUFTLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDdEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLFVBQVUsR0FBRyxHQUFHLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMvQyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtnQkFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsVUFBVSxNQUFNLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQzthQUM3RjtpQkFBTSxJQUFJLFFBQVEsS0FBSyxTQUFTLENBQUMsK0JBQStCLEVBQUU7Z0JBQ2pFLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMvRjtpQkFBTSwwREFBMEQsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzlGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksU0FBUyxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7UUFDbkUsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDcEQsT0FBTyxNQUFNLENBQUM7U0FDZjthQUFNLElBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQyw4QkFBOEIsRUFBRTtZQUNoRSxPQUFPLE9BQU8sQ0FBQztTQUNoQjthQUFNLDJEQUEyRCxDQUFDO1lBQ2pFLE9BQU8sUUFBUSxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksc0JBQXNCLENBQUMsWUFBMEI7UUFDdEQsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzlFLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBRWhDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNySSxJQUFJLGVBQWUsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsZUFBZSxDQUFDO2FBQ3BEO1lBRUQsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3JJLElBQUksZUFBZSxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxlQUFlLENBQUM7YUFDcEQ7U0FDRjtJQUNILENBQUM7SUFFTSxlQUFlLENBQUMsU0FBaUI7UUFDdEMsMENBQTBDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUzRCxJQUFJLFVBQVUsRUFBRTtZQUNkLE9BQU8sR0FBRyxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1NBQ2pEO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVNLHVCQUF1QixDQUFDLFNBQWlCO1FBQzlDLDBDQUEwQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlDOzs7O1dBSUc7UUFDSCxTQUFTLGFBQWEsQ0FBQyxDQUFTO1lBQzlCLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDckIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEI7WUFFRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BCLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2QixzR0FBc0c7Z0JBQ3RHLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3BCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTt3QkFDN0MsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQzFDO2lCQUNGO2dCQUVELENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3JCO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVNLGdCQUFnQixDQUFDLE9BQW1CO1FBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRXBDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7WUFDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLDBCQUFXLEVBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ2xIO1FBRUQsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRTtZQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUEsMEJBQVcsRUFBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDdkg7SUFDSCxDQUFDO0lBRU0sMEJBQTBCLENBQUMsT0FBNkI7UUFDN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLDBCQUFXLEVBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRU0sOEJBQThCLENBQUMsSUFBZ0I7UUFDcEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSwwQkFBMEIsQ0FBQyxNQUFjO1FBQzlDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0UsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBdUJEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxPQUFlO0lBQ25FLE1BQU0sS0FBSyxHQUFVLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUNuQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7UUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxRyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM3Qix3Q0FBd0M7WUFDeEMsSUFBSSxJQUFJLEtBQUssOEJBQThCLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBQzFELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDeEMsUUFBUSxNQUFNLEVBQUU7Z0JBQ2QsS0FBSyxHQUFHO29CQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDbEMsTUFBTTtnQkFDUixLQUFLLEdBQUc7b0JBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzVELE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN6RCxNQUFNO2dCQUNSO29CQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE1BQU0sZ0JBQWdCLElBQUksR0FBRyxDQUFDLENBQUM7YUFDN0U7U0FDRjtLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUM7SUFFZCxTQUFTLFdBQVcsQ0FBQyxLQUFlO1FBQ2xDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRyxDQUFDLEVBQUUsRUFBRTtnQkFDdEMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtvQkFDMUIsTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7b0JBQ3pDLE1BQU07aUJBQ1A7YUFDRjtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IERpZmZlcmVuY2VDb2xsZWN0aW9uLCBUZW1wbGF0ZURpZmYgfSBmcm9tICcuL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9kaWZmL3V0aWwnO1xuaW1wb3J0IHsgRGlmZmVyZW5jZSwgaXNQcm9wZXJ0eURpZmZlcmVuY2UsIFJlc291cmNlRGlmZmVyZW5jZSwgUmVzb3VyY2VJbXBhY3QgfSBmcm9tICcuL2RpZmYtdGVtcGxhdGUnO1xuaW1wb3J0IHsgZm9ybWF0VGFibGUgfSBmcm9tICcuL2Zvcm1hdC10YWJsZSc7XG5pbXBvcnQgeyBJYW1DaGFuZ2VzIH0gZnJvbSAnLi9pYW0vaWFtLWNoYW5nZXMnO1xuaW1wb3J0IHsgU2VjdXJpdHlHcm91cENoYW5nZXMgfSBmcm9tICcuL25ldHdvcmsvc2VjdXJpdHktZ3JvdXAtY2hhbmdlcyc7XG5cbi8vIGZyb20gY3gtYXBpXG5jb25zdCBQQVRIX01FVEFEQVRBX0tFWSA9ICdhd3M6Y2RrOnBhdGgnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5jb25zdCB7IHN0cnVjdHVyZWRQYXRjaCB9ID0gcmVxdWlyZSgnZGlmZicpO1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdFN0cmVhbSBleHRlbmRzIE5vZGVKUy5Xcml0YWJsZVN0cmVhbSB7XG4gIGNvbHVtbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVuZGVycyB0ZW1wbGF0ZSBkaWZmZXJlbmNlcyB0byB0aGUgcHJvY2VzcycgY29uc29sZS5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtICAgICAgICAgICBUaGUgSU8gc3RyZWFtIHdoZXJlIHRvIG91dHB1dCB0aGUgcmVuZGVyZWQgZGlmZi5cbiAqIEBwYXJhbSB0ZW1wbGF0ZURpZmYgICAgIFRlbXBsYXRlRGlmZiB0byBiZSByZW5kZXJlZCB0byB0aGUgY29uc29sZS5cbiAqIEBwYXJhbSBsb2dpY2FsVG9QYXRoTWFwIEEgbWFwIGZyb20gbG9naWNhbCBJRCB0byBjb25zdHJ1Y3QgcGF0aC4gVXNlZnVsIGluXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoZXJlIGlzIG5vIGF3czpjZGs6cGF0aCBtZXRhZGF0YSBpbiB0aGUgdGVtcGxhdGUuXG4gKiBAcGFyYW0gY29udGV4dCAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gdXNlIGluIGFyYml0cmFyeSBKU09OIGRpZmYgKGRlZmF1bHRzIHRvIDMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGlmZmVyZW5jZXMoXG4gIHN0cmVhbTogRm9ybWF0U3RyZWFtLFxuICB0ZW1wbGF0ZURpZmY6IFRlbXBsYXRlRGlmZixcbiAgbG9naWNhbFRvUGF0aE1hcDogeyBbbG9naWNhbElkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHsgfSxcbiAgY29udGV4dDogbnVtYmVyID0gMykge1xuICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKHN0cmVhbSwgbG9naWNhbFRvUGF0aE1hcCwgdGVtcGxhdGVEaWZmLCBjb250ZXh0KTtcblxuICBpZiAodGVtcGxhdGVEaWZmLmF3c1RlbXBsYXRlRm9ybWF0VmVyc2lvbiB8fCB0ZW1wbGF0ZURpZmYudHJhbnNmb3JtIHx8IHRlbXBsYXRlRGlmZi5kZXNjcmlwdGlvbikge1xuICAgIGZvcm1hdHRlci5wcmludFNlY3Rpb25IZWFkZXIoJ1RlbXBsYXRlJyk7XG4gICAgZm9ybWF0dGVyLmZvcm1hdERpZmZlcmVuY2UoJ0FXU1RlbXBsYXRlRm9ybWF0VmVyc2lvbicsICdBV1NUZW1wbGF0ZUZvcm1hdFZlcnNpb24nLCB0ZW1wbGF0ZURpZmYuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uKTtcbiAgICBmb3JtYXR0ZXIuZm9ybWF0RGlmZmVyZW5jZSgnVHJhbnNmb3JtJywgJ1RyYW5zZm9ybScsIHRlbXBsYXRlRGlmZi50cmFuc2Zvcm0pO1xuICAgIGZvcm1hdHRlci5mb3JtYXREaWZmZXJlbmNlKCdEZXNjcmlwdGlvbicsICdEZXNjcmlwdGlvbicsIHRlbXBsYXRlRGlmZi5kZXNjcmlwdGlvbik7XG4gICAgZm9ybWF0dGVyLnByaW50U2VjdGlvbkZvb3RlcigpO1xuICB9XG5cbiAgZm9ybWF0U2VjdXJpdHlDaGFuZ2VzV2l0aEJhbm5lcihmb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZik7XG5cbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ1BhcmFtZXRlcnMnLCAnUGFyYW1ldGVyJywgdGVtcGxhdGVEaWZmLnBhcmFtZXRlcnMpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignTWV0YWRhdGEnLCAnTWV0YWRhdGEnLCB0ZW1wbGF0ZURpZmYubWV0YWRhdGEpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignTWFwcGluZ3MnLCAnTWFwcGluZycsIHRlbXBsYXRlRGlmZi5tYXBwaW5ncyk7XG4gIGZvcm1hdHRlci5mb3JtYXRTZWN0aW9uKCdDb25kaXRpb25zJywgJ0NvbmRpdGlvbicsIHRlbXBsYXRlRGlmZi5jb25kaXRpb25zKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ1Jlc291cmNlcycsICdSZXNvdXJjZScsIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMsIGZvcm1hdHRlci5mb3JtYXRSZXNvdXJjZURpZmZlcmVuY2UuYmluZChmb3JtYXR0ZXIpKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ091dHB1dHMnLCAnT3V0cHV0JywgdGVtcGxhdGVEaWZmLm91dHB1dHMpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignT3RoZXIgQ2hhbmdlcycsICdVbmtub3duJywgdGVtcGxhdGVEaWZmLnVua25vd24pO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBkaWZmIG9mIHNlY3VyaXR5IGNoYW5nZXMgdG8gdGhlIGdpdmVuIHN0cmVhbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2VjdXJpdHlDaGFuZ2VzKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0YWJsZVN0cmVhbSxcbiAgdGVtcGxhdGVEaWZmOiBUZW1wbGF0ZURpZmYsXG4gIGxvZ2ljYWxUb1BhdGhNYXA6IHtbbG9naWNhbElkOiBzdHJpbmddOiBzdHJpbmd9ID0ge30sXG4gIGNvbnRleHQ/OiBudW1iZXIpIHtcbiAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcihzdHJlYW0sIGxvZ2ljYWxUb1BhdGhNYXAsIHRlbXBsYXRlRGlmZiwgY29udGV4dCk7XG5cbiAgZm9ybWF0U2VjdXJpdHlDaGFuZ2VzV2l0aEJhbm5lcihmb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlY3VyaXR5Q2hhbmdlc1dpdGhCYW5uZXIoZm9ybWF0dGVyOiBGb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZjogVGVtcGxhdGVEaWZmKSB7XG4gIGlmICghdGVtcGxhdGVEaWZmLmlhbUNoYW5nZXMuaGFzQ2hhbmdlcyAmJiAhdGVtcGxhdGVEaWZmLnNlY3VyaXR5R3JvdXBDaGFuZ2VzLmhhc0NoYW5nZXMpIHsgcmV0dXJuOyB9XG4gIGZvcm1hdHRlci5mb3JtYXRJYW1DaGFuZ2VzKHRlbXBsYXRlRGlmZi5pYW1DaGFuZ2VzKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3VyaXR5R3JvdXBDaGFuZ2VzKHRlbXBsYXRlRGlmZi5zZWN1cml0eUdyb3VwQ2hhbmdlcyk7XG5cbiAgZm9ybWF0dGVyLndhcm5pbmcoJyhOT1RFOiBUaGVyZSBtYXkgYmUgc2VjdXJpdHktcmVsYXRlZCBjaGFuZ2VzIG5vdCBpbiB0aGlzIGxpc3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzEyOTkpJyk7XG4gIGZvcm1hdHRlci5wcmludFNlY3Rpb25Gb290ZXIoKTtcbn1cblxuY29uc3QgQURESVRJT04gPSBjaGFsay5ncmVlbignWytdJyk7XG5jb25zdCBDT05URVhUID0gY2hhbGsuZ3JleSgnWyBdJyk7XG5jb25zdCBVUERBVEUgPSBjaGFsay55ZWxsb3coJ1t+XScpO1xuY29uc3QgUkVNT1ZBTCA9IGNoYWxrLnJlZCgnWy1dJyk7XG5cbmNsYXNzIEZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyZWFtOiBGb3JtYXRTdHJlYW0sXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dpY2FsVG9QYXRoTWFwOiB7IFtsb2dpY2FsSWQ6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIGRpZmY/OiBUZW1wbGF0ZURpZmYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBudW1iZXIgPSAzKSB7XG4gICAgLy8gUmVhZCBhZGRpdGlvbmFsIGNvbnN0cnVjdCBwYXRocyBmcm9tIHRoZSBkaWZmIGlmIGl0IGlzIHN1cHBsaWVkXG4gICAgaWYgKGRpZmYpIHtcbiAgICAgIHRoaXMucmVhZENvbnN0cnVjdFBhdGhzRnJvbShkaWZmKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJpbnQoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5zdHJlYW0ud3JpdGUoY2hhbGsud2hpdGUoZm9ybWF0KGZtdCwgLi4uYXJncykpICsgJ1xcbicpO1xuICB9XG5cbiAgcHVibGljIHdhcm5pbmcoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5zdHJlYW0ud3JpdGUoY2hhbGsueWVsbG93KGZvcm1hdChmbXQsIC4uLmFyZ3MpKSArICdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXRTZWN0aW9uPFYsIFQgZXh0ZW5kcyBEaWZmZXJlbmNlPFY+PihcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGVudHJ5VHlwZTogc3RyaW5nLFxuICAgIGNvbGxlY3Rpb246IERpZmZlcmVuY2VDb2xsZWN0aW9uPFYsIFQ+LFxuICAgIGZvcm1hdHRlcjogKHR5cGU6IHN0cmluZywgaWQ6IHN0cmluZywgZGlmZjogVCkgPT4gdm9pZCA9IHRoaXMuZm9ybWF0RGlmZmVyZW5jZS5iaW5kKHRoaXMpKSB7XG5cbiAgICBpZiAoY29sbGVjdGlvbi5kaWZmZXJlbmNlQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByaW50U2VjdGlvbkhlYWRlcih0aXRsZSk7XG4gICAgY29sbGVjdGlvbi5mb3JFYWNoRGlmZmVyZW5jZSgoaWQsIGRpZmYpID0+IGZvcm1hdHRlcihlbnRyeVR5cGUsIGlkLCBkaWZmKSk7XG4gICAgdGhpcy5wcmludFNlY3Rpb25Gb290ZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmludFNlY3Rpb25IZWFkZXIodGl0bGU6IHN0cmluZykge1xuICAgIHRoaXMucHJpbnQoY2hhbGsudW5kZXJsaW5lKGNoYWxrLmJvbGQodGl0bGUpKSk7XG4gIH1cblxuICBwdWJsaWMgcHJpbnRTZWN0aW9uRm9vdGVyKCkge1xuICAgIHRoaXMucHJpbnQoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IGEgc2ltcGxlIGRpZmZlcmVuY2UgZm9yIGEgZ2l2ZW4gbmFtZWQgZW50aXR5LlxuICAgKlxuICAgKiBAcGFyYW0gbG9naWNhbElkIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBkaWZmZXJlbnQuXG4gICAqIEBwYXJhbSBkaWZmIHRoZSBkaWZmZXJlbmNlIHRvIGJlIHJlbmRlcmVkLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdERpZmZlcmVuY2UodHlwZTogc3RyaW5nLCBsb2dpY2FsSWQ6IHN0cmluZywgZGlmZjogRGlmZmVyZW5jZTxhbnk+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFkaWZmIHx8ICFkaWZmLmlzRGlmZmVyZW50KSB7IHJldHVybjsgfVxuXG4gICAgbGV0IHZhbHVlO1xuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKGRpZmYub2xkVmFsdWUsIGNoYWxrLnJlZCk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKGRpZmYubmV3VmFsdWUsIGNoYWxrLmdyZWVuKTtcbiAgICBpZiAoZGlmZi5pc0FkZGl0aW9uKSB7XG4gICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH0gZWxzZSBpZiAoZGlmZi5pc1VwZGF0ZSkge1xuICAgICAgdmFsdWUgPSBgJHtvbGRWYWx1ZX0gdG8gJHtuZXdWYWx1ZX1gO1xuICAgIH0gZWxzZSBpZiAoZGlmZi5pc1JlbW92YWwpIHtcbiAgICAgIHZhbHVlID0gb2xkVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5wcmludChgJHt0aGlzLmZvcm1hdFByZWZpeChkaWZmKX0gJHtjaGFsay5jeWFuKHR5cGUpfSAke3RoaXMuZm9ybWF0TG9naWNhbElkKGxvZ2ljYWxJZCl9OiAke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IGEgcmVzb3VyY2UgZGlmZmVyZW5jZSBmb3IgYSBnaXZlbiBsb2dpY2FsIElELlxuICAgKlxuICAgKiBAcGFyYW0gbG9naWNhbElkIHRoZSBsb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZSB0aGF0IGNoYW5nZWQuXG4gICAqIEBwYXJhbSBkaWZmICAgICAgdGhlIGNoYW5nZSB0byBiZSByZW5kZXJlZC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRSZXNvdXJjZURpZmZlcmVuY2UoX3R5cGU6IHN0cmluZywgbG9naWNhbElkOiBzdHJpbmcsIGRpZmY6IFJlc291cmNlRGlmZmVyZW5jZSkge1xuICAgIGlmICghZGlmZi5pc0RpZmZlcmVudCkgeyByZXR1cm47IH1cblxuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGRpZmYuaXNSZW1vdmFsID8gZGlmZi5vbGRSZXNvdXJjZVR5cGUgOiBkaWZmLm5ld1Jlc291cmNlVHlwZTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgdGhpcy5wcmludChgJHt0aGlzLmZvcm1hdFByZWZpeChkaWZmKX0gJHt0aGlzLmZvcm1hdFZhbHVlKHJlc291cmNlVHlwZSwgY2hhbGsuY3lhbil9ICR7dGhpcy5mb3JtYXRMb2dpY2FsSWQobG9naWNhbElkKX0gJHt0aGlzLmZvcm1hdEltcGFjdChkaWZmLmNoYW5nZUltcGFjdCl9YCk7XG5cbiAgICBpZiAoZGlmZi5pc1VwZGF0ZSkge1xuICAgICAgY29uc3QgZGlmZmVyZW5jZUNvdW50ID0gZGlmZi5kaWZmZXJlbmNlQ291bnQ7XG4gICAgICBsZXQgcHJvY2Vzc2VkQ291bnQgPSAwO1xuICAgICAgZGlmZi5mb3JFYWNoRGlmZmVyZW5jZSgoXywgbmFtZSwgdmFsdWVzKSA9PiB7XG4gICAgICAgIHByb2Nlc3NlZENvdW50ICs9IDE7XG4gICAgICAgIHRoaXMuZm9ybWF0VHJlZURpZmYobmFtZSwgdmFsdWVzLCBwcm9jZXNzZWRDb3VudCA9PT0gZGlmZmVyZW5jZUNvdW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXRQcmVmaXg8VD4oZGlmZjogRGlmZmVyZW5jZTxUPikge1xuICAgIGlmIChkaWZmLmlzQWRkaXRpb24pIHsgcmV0dXJuIEFERElUSU9OOyB9XG4gICAgaWYgKGRpZmYuaXNVcGRhdGUpIHsgcmV0dXJuIFVQREFURTsgfVxuICAgIGlmIChkaWZmLmlzUmVtb3ZhbCkgeyByZXR1cm4gUkVNT1ZBTDsgfVxuICAgIHJldHVybiBjaGFsay53aGl0ZSgnWz9dJyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBmb3JtYXR0ZWQuXG4gICAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgdG8gYmUgdXNlZC5cbiAgICpcbiAgICogQHJldHVybnMgdGhlIGZvcm1hdHRlZCBzdHJpbmcsIHdpdGggY29sb3IgYXBwbGllZC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRWYWx1ZSh2YWx1ZTogYW55LCBjb2xvcjogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGNvbG9yKHZhbHVlKTsgfVxuICAgIHJldHVybiBjb2xvcihKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbXBhY3QgdGhlIGltcGFjdCB0byBiZSBmb3JtYXR0ZWRcbiAgICogQHJldHVybnMgYSB1c2VyLWZyaWVuZGx5LCBjb2xvcmVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGltcGFjdC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRJbXBhY3QoaW1wYWN0OiBSZXNvdXJjZUltcGFjdCkge1xuICAgIHN3aXRjaCAoaW1wYWN0KSB7XG4gICAgICBjYXNlIFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFOlxuICAgICAgICByZXR1cm4gY2hhbGsuaXRhbGljKGNoYWxrLnllbGxvdygnbWF5IGJlIHJlcGxhY2VkJykpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0U6XG4gICAgICAgIHJldHVybiBjaGFsay5pdGFsaWMoY2hhbGsuYm9sZChjaGFsay5yZWQoJ3JlcGxhY2UnKSkpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX0RFU1RST1k6XG4gICAgICAgIHJldHVybiBjaGFsay5pdGFsaWMoY2hhbGsuYm9sZChjaGFsay5yZWQoJ2Rlc3Ryb3knKSkpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX09SUEhBTjpcbiAgICAgICAgcmV0dXJuIGNoYWxrLml0YWxpYyhjaGFsay55ZWxsb3coJ29ycGhhbicpKTtcbiAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9VUERBVEU6XG4gICAgICBjYXNlIFJlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFOlxuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5OT19DSEFOR0U6XG4gICAgICAgIHJldHVybiAnJzsgLy8gbm8gZXh0cmEgaW5mbyBpcyBnYWluZWQgaGVyZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgdHJlZSBvZiBkaWZmZXJlbmNlcyB1bmRlciBhIHBhcnRpY3VsYXIgbmFtZS5cbiAgICogQHBhcmFtIG5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuXG4gICAqIEBwYXJhbSBkaWZmICAgIHRoZSBkaWZmZXJlbmNlIG9uIHRoZSB0cmVlLlxuICAgKiBAcGFyYW0gbGFzdCAgICB3aGV0aGVyIHRoaXMgaXMgdGhlIGxhc3Qgbm9kZSBvZiBhIHBhcmVudCB0cmVlLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdFRyZWVEaWZmKG5hbWU6IHN0cmluZywgZGlmZjogRGlmZmVyZW5jZTxhbnk+LCBsYXN0OiBib29sZWFuKSB7XG4gICAgbGV0IGFkZGl0aW9uYWxJbmZvID0gJyc7XG4gICAgaWYgKGlzUHJvcGVydHlEaWZmZXJlbmNlKGRpZmYpKSB7XG4gICAgICBpZiAoZGlmZi5jaGFuZ2VJbXBhY3QgPT09IFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFKSB7XG4gICAgICAgIGFkZGl0aW9uYWxJbmZvID0gJyAobWF5IGNhdXNlIHJlcGxhY2VtZW50KSc7XG4gICAgICB9IGVsc2UgaWYgKGRpZmYuY2hhbmdlSW1wYWN0ID09PSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0UpIHtcbiAgICAgICAgYWRkaXRpb25hbEluZm8gPSAnIChyZXF1aXJlcyByZXBsYWNlbWVudCknO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnByaW50KCcgJXPilIAgJXMgJXMlcycsIGxhc3QgPyAn4pSUJyA6ICfilJwnLCB0aGlzLmNoYW5nZVRhZyhkaWZmLm9sZFZhbHVlLCBkaWZmLm5ld1ZhbHVlKSwgbmFtZSwgYWRkaXRpb25hbEluZm8pO1xuICAgIHJldHVybiB0aGlzLmZvcm1hdE9iamVjdERpZmYoZGlmZi5vbGRWYWx1ZSwgZGlmZi5uZXdWYWx1ZSwgYCAke2xhc3QgPyAnICcgOiAn4pSCJ31gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG9iamVjdHMsIGxvb2tpbmcgZm9yIHRoZSBkaWZmZXJlbmNlcyBhcyBkZWVwIGFzIHBvc3NpYmxlLFxuICAgKiBhbmQgcmVuZGVyaW5nIGEgdHJlZSBncmFwaCBvZiB0aGUgcGF0aCB1bnRpbCB0aGUgZGlmZmVyZW5jZSBpcyBmb3VuZC5cbiAgICpcbiAgICogQHBhcmFtIG9sZE9iamVjdCAgdGhlIG9sZCBvYmplY3QuXG4gICAqIEBwYXJhbSBuZXdPYmplY3QgIHRoZSBuZXcgb2JqZWN0LlxuICAgKiBAcGFyYW0gbGluZVByZWZpeCBhIHByZWZpeCAoaW5kZW50LWxpa2UpIHRvIGJlIHVzZWQgb24gZXZlcnkgbGluZS5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRPYmplY3REaWZmKG9sZE9iamVjdDogYW55LCBuZXdPYmplY3Q6IGFueSwgbGluZVByZWZpeDogc3RyaW5nKSB7XG4gICAgaWYgKCh0eXBlb2Ygb2xkT2JqZWN0ICE9PSB0eXBlb2YgbmV3T2JqZWN0KSB8fCBBcnJheS5pc0FycmF5KG9sZE9iamVjdCkgfHwgdHlwZW9mIG9sZE9iamVjdCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9sZE9iamVjdCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChvbGRPYmplY3QgIT09IHVuZGVmaW5lZCAmJiBuZXdPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9sZE9iamVjdCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ld09iamVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBjb25zdCBvbGRTdHIgPSBKU09OLnN0cmluZ2lmeShvbGRPYmplY3QsIG51bGwsIDIpO1xuICAgICAgICAgIGNvbnN0IG5ld1N0ciA9IEpTT04uc3RyaW5naWZ5KG5ld09iamVjdCwgbnVsbCwgMik7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IF9kaWZmU3RyaW5ncyhvbGRTdHIsIG5ld1N0ciwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMCA7IGkgPCBkaWZmLmxlbmd0aCA7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5wcmludCgnJXMgICAlcyAlcycsIGxpbmVQcmVmaXgsIGkgPT09IDAgPyAn4pSU4pSAJyA6ICcgICcsIGRpZmZbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUnOKUgCAlcyAlcycsIGxpbmVQcmVmaXgsIFJFTU9WQUwsIHRoaXMuZm9ybWF0VmFsdWUob2xkT2JqZWN0LCBjaGFsay5yZWQpKTtcbiAgICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUlOKUgCAlcyAlcycsIGxpbmVQcmVmaXgsIEFERElUSU9OLCB0aGlzLmZvcm1hdFZhbHVlKG5ld09iamVjdCwgY2hhbGsuZ3JlZW4pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvbGRPYmplY3QgIT09IHVuZGVmaW5lZCAvKiAmJiBuZXdPYmplY3QgPT09IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUlOKUgCAlcycsIGxpbmVQcmVmaXgsIHRoaXMuZm9ybWF0VmFsdWUob2xkT2JqZWN0LCBjaGFsay5yZWQpKTtcbiAgICAgIH0gZWxzZSAvKiBpZiAob2xkT2JqZWN0ID09PSB1bmRlZmluZWQgJiYgbmV3T2JqZWN0ICE9PSB1bmRlZmluZWQpICovIHtcbiAgICAgICAgdGhpcy5wcmludCgnJXMgICDilJTilIAgJXMnLCBsaW5lUHJlZml4LCB0aGlzLmZvcm1hdFZhbHVlKG5ld09iamVjdCwgY2hhbGsuZ3JlZW4pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5U2V0ID0gbmV3IFNldChPYmplY3Qua2V5cyhvbGRPYmplY3QpKTtcbiAgICBPYmplY3Qua2V5cyhuZXdPYmplY3QpLmZvckVhY2goayA9PiBrZXlTZXQuYWRkKGspKTtcbiAgICBjb25zdCBrZXlzID0gbmV3IEFycmF5KC4uLmtleVNldCkuZmlsdGVyKGsgPT4gIWRlZXBFcXVhbChvbGRPYmplY3Rba10sIG5ld09iamVjdFtrXSkpLnNvcnQoKTtcbiAgICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkT2JqZWN0W2tleV07XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld09iamVjdFtrZXldO1xuICAgICAgY29uc3QgdHJlZVByZWZpeCA9IGtleSA9PT0gbGFzdEtleSA/ICfilJQnIDogJ+KUnCc7XG4gICAgICBpZiAob2xkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBuZXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucHJpbnQoJyVzICAgJXPilIAgJXMgJXM6JywgbGluZVByZWZpeCwgdHJlZVByZWZpeCwgdGhpcy5jaGFuZ2VUYWcob2xkVmFsdWUsIG5ld1ZhbHVlKSwgY2hhbGsuYmx1ZShgLiR7a2V5fWApKTtcbiAgICAgICAgdGhpcy5mb3JtYXRPYmplY3REaWZmKG9sZFZhbHVlLCBuZXdWYWx1ZSwgYCR7bGluZVByZWZpeH0gICAke2tleSA9PT0gbGFzdEtleSA/ICcgJyA6ICfilIInfWApO1xuICAgICAgfSBlbHNlIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkIC8qICYmIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKi8pIHtcbiAgICAgICAgdGhpcy5wcmludCgnJXMgICAlc+KUgCAlcyBSZW1vdmVkOiAlcycsIGxpbmVQcmVmaXgsIHRyZWVQcmVmaXgsIFJFTU9WQUwsIGNoYWxrLmJsdWUoYC4ke2tleX1gKSk7XG4gICAgICB9IGVsc2UgLyogaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCAqLyB7XG4gICAgICAgIHRoaXMucHJpbnQoJyVzICAgJXPilIAgJXMgQWRkZWQ6ICVzJywgbGluZVByZWZpeCwgdHJlZVByZWZpeCwgQURESVRJT04sIGNoYWxrLmJsdWUoYC4ke2tleX1gKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlIG9mIGEgZGlmZmVyZW5jZS5cbiAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgYSBkaWZmZXJlbmNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIHRhZyB0byBiZSByZW5kZXJlZCBpbiB0aGUgZGlmZiwgcmVmbGVjdGluZyB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlXG4gICAqICAgICAgd2FzIGFuIEFERElUSU9OLCBVUERBVEUgb3IgUkVNT1ZBTC5cbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VUYWcob2xkVmFsdWU6IGFueSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IGFueSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFVQREFURTtcbiAgICB9IGVsc2UgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQgLyogJiYgbmV3VmFsdWUgPT09IHVuZGVmaW5lZCovKSB7XG4gICAgICByZXR1cm4gUkVNT1ZBTDtcbiAgICB9IGVsc2UgLyogaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCkgKi8ge1xuICAgICAgcmV0dXJuIEFERElUSU9OO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kICdhd3M6Y2RrOnBhdGgnIG1ldGFkYXRhIGluIHRoZSBkaWZmIGFuZCBhZGQgaXQgdG8gdGhlIGxvZ2ljYWxUb1BhdGhNYXBcbiAgICpcbiAgICogVGhlcmUgYXJlIG11bHRpcGxlIHNvdXJjZXMgb2YgbG9naWNhbElEIC0+IHBhdGggbWFwcGluZ3M6IHN5bnRoIG1ldGFkYXRhXG4gICAqIGFuZCByZXNvdXJjZSBtZXRhZGF0YSwgYW5kIHdlIGNvbWJpbmUgYWxsIHNvdXJjZXMgaW50byBhIHNpbmdsZSBtYXAuXG4gICAqL1xuICBwdWJsaWMgcmVhZENvbnN0cnVjdFBhdGhzRnJvbSh0ZW1wbGF0ZURpZmY6IFRlbXBsYXRlRGlmZikge1xuICAgIGZvciAoY29uc3QgW2xvZ2ljYWxJZCwgcmVzb3VyY2VEaWZmXSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURpZmYucmVzb3VyY2VzKSkge1xuICAgICAgaWYgKCFyZXNvdXJjZURpZmYpIHsgY29udGludWU7IH1cblxuICAgICAgY29uc3Qgb2xkUGF0aE1ldGFkYXRhID0gcmVzb3VyY2VEaWZmLm9sZFZhbHVlICYmIHJlc291cmNlRGlmZi5vbGRWYWx1ZS5NZXRhZGF0YSAmJiByZXNvdXJjZURpZmYub2xkVmFsdWUuTWV0YWRhdGFbUEFUSF9NRVRBREFUQV9LRVldO1xuICAgICAgaWYgKG9sZFBhdGhNZXRhZGF0YSAmJiAhKGxvZ2ljYWxJZCBpbiB0aGlzLmxvZ2ljYWxUb1BhdGhNYXApKSB7XG4gICAgICAgIHRoaXMubG9naWNhbFRvUGF0aE1hcFtsb2dpY2FsSWRdID0gb2xkUGF0aE1ldGFkYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdQYXRoTWV0YWRhdGEgPSByZXNvdXJjZURpZmYubmV3VmFsdWUgJiYgcmVzb3VyY2VEaWZmLm5ld1ZhbHVlLk1ldGFkYXRhICYmIHJlc291cmNlRGlmZi5uZXdWYWx1ZS5NZXRhZGF0YVtQQVRIX01FVEFEQVRBX0tFWV07XG4gICAgICBpZiAobmV3UGF0aE1ldGFkYXRhICYmICEobG9naWNhbElkIGluIHRoaXMubG9naWNhbFRvUGF0aE1hcCkpIHtcbiAgICAgICAgdGhpcy5sb2dpY2FsVG9QYXRoTWFwW2xvZ2ljYWxJZF0gPSBuZXdQYXRoTWV0YWRhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvcm1hdExvZ2ljYWxJZChsb2dpY2FsSWQ6IHN0cmluZykge1xuICAgIC8vIGlmIHdlIGhhdmUgYSBwYXRoIGluIHRoZSBtYXAsIHJldHVybiBpdFxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZWRMb2dpY2FsSWRQYXRoKGxvZ2ljYWxJZCk7XG5cbiAgICBpZiAobm9ybWFsaXplZCkge1xuICAgICAgcmV0dXJuIGAke25vcm1hbGl6ZWR9ICR7Y2hhbGsuZ3JheShsb2dpY2FsSWQpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvZ2ljYWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBub3JtYWxpemVkTG9naWNhbElkUGF0aChsb2dpY2FsSWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gaWYgd2UgaGF2ZSBhIHBhdGggaW4gdGhlIG1hcCwgcmV0dXJuIGl0XG4gICAgY29uc3QgcGF0aCA9IHRoaXMubG9naWNhbFRvUGF0aE1hcFtsb2dpY2FsSWRdO1xuICAgIHJldHVybiBwYXRoID8gbm9ybWFsaXplUGF0aChwYXRoKSA6IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFBhdGggaXMgc3VwcG9zZWQgdG8gc3RhcnQgd2l0aCBcIi9zdGFjay1uYW1lXCIuIElmIHRoaXMgaXMgdGhlIGNhc2UgKGkuZS4gcGF0aCBoYXMgbW9yZSB0aGFuXG4gICAgICogdHdvIGNvbXBvbmVudHMsIHdlIHJlbW92ZSB0aGUgZmlyc3QgcGFydC4gT3RoZXJ3aXNlLCB3ZSBqdXN0IHVzZSB0aGUgZnVsbCBwYXRoLlxuICAgICAqIEBwYXJhbSBwXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwOiBzdHJpbmcpIHtcbiAgICAgIGlmIChwLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICBwID0gcC5zbGljZSgxKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHBhcnRzID0gcC5zcGxpdCgnLycpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcGFydHMgPSBwYXJ0cy5zbGljZSgxKTtcblxuICAgICAgICAvLyByZW1vdmUgdGhlIGxhc3QgY29tcG9uZW50IGlmIGl0J3MgXCJSZXNvdXJjZVwiIG9yIFwiRGVmYXVsdFwiIChpZiB3ZSBoYXZlIG1vcmUgdGhhbiBhIHNpbmdsZSBjb21wb25lbnQpXG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgY29uc3QgbGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChsYXN0ID09PSAnUmVzb3VyY2UnIHx8IGxhc3QgPT09ICdEZWZhdWx0Jykge1xuICAgICAgICAgICAgcGFydHMgPSBwYXJ0cy5zbGljZSgwLCBwYXJ0cy5sZW5ndGggLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwID0gcGFydHMuam9pbignLycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvcm1hdElhbUNoYW5nZXMoY2hhbmdlczogSWFtQ2hhbmdlcykge1xuICAgIGlmICghY2hhbmdlcy5oYXNDaGFuZ2VzKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKGNoYW5nZXMuc3RhdGVtZW50cy5oYXNDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnByaW50U2VjdGlvbkhlYWRlcignSUFNIFN0YXRlbWVudCBDaGFuZ2VzJyk7XG4gICAgICB0aGlzLnByaW50KGZvcm1hdFRhYmxlKHRoaXMuZGVlcFN1YnN0aXR1dGVCcmFjZWRMb2dpY2FsSWRzKGNoYW5nZXMuc3VtbWFyaXplU3RhdGVtZW50cygpKSwgdGhpcy5zdHJlYW0uY29sdW1ucykpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm1hbmFnZWRQb2xpY2llcy5oYXNDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnByaW50U2VjdGlvbkhlYWRlcignSUFNIFBvbGljeSBDaGFuZ2VzJyk7XG4gICAgICB0aGlzLnByaW50KGZvcm1hdFRhYmxlKHRoaXMuZGVlcFN1YnN0aXR1dGVCcmFjZWRMb2dpY2FsSWRzKGNoYW5nZXMuc3VtbWFyaXplTWFuYWdlZFBvbGljaWVzKCkpLCB0aGlzLnN0cmVhbS5jb2x1bW5zKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvcm1hdFNlY3VyaXR5R3JvdXBDaGFuZ2VzKGNoYW5nZXM6IFNlY3VyaXR5R3JvdXBDaGFuZ2VzKSB7XG4gICAgaWYgKCFjaGFuZ2VzLmhhc0NoYW5nZXMpIHsgcmV0dXJuOyB9XG5cbiAgICB0aGlzLnByaW50U2VjdGlvbkhlYWRlcignU2VjdXJpdHkgR3JvdXAgQ2hhbmdlcycpO1xuICAgIHRoaXMucHJpbnQoZm9ybWF0VGFibGUodGhpcy5kZWVwU3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMoY2hhbmdlcy5zdW1tYXJpemUoKSksIHRoaXMuc3RyZWFtLmNvbHVtbnMpKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWVwU3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMocm93czogc3RyaW5nW11bXSk6IHN0cmluZ1tdW10ge1xuICAgIHJldHVybiByb3dzLm1hcChyb3cgPT4gcm93Lm1hcCh0aGlzLnN1YnN0aXR1dGVCcmFjZWRMb2dpY2FsSWRzLmJpbmQodGhpcykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzdGl0dXRlIGFsbCBzdHJpbmdzIGxpa2UgJHtMb2dJZC54eHh9IHdpdGggdGhlIHBhdGggaW5zdGVhZCBvZiB0aGUgbG9naWNhbCBJRFxuICAgKi9cbiAgcHVibGljIHN1YnN0aXR1dGVCcmFjZWRMb2dpY2FsSWRzKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc291cmNlLnJlcGxhY2UoL1xcJFxceyhbXi59XSspKC5bXn1dKyk/XFx9L2lnLCAoX21hdGNoLCBsb2dJZCwgc3VmZml4KSA9PiB7XG4gICAgICByZXR1cm4gJyR7JyArICh0aGlzLm5vcm1hbGl6ZWRMb2dpY2FsSWRQYXRoKGxvZ0lkKSB8fCBsb2dJZCkgKyAoc3VmZml4IHx8ICcnKSArICd9JztcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcGF0Y2ggYXMgcmV0dXJuZWQgYnkgYGBkaWZmLnN0cnVjdHVyZWRQYXRjaGBgLlxuICovXG5pbnRlcmZhY2UgUGF0Y2gge1xuICAvKipcbiAgICogSHVua3MgaW4gdGhlIHBhdGNoLlxuICAgKi9cbiAgaHVua3M6IFJlYWRvbmx5QXJyYXk8UGF0Y2hIdW5rPjtcbn1cblxuLyoqXG4gKiBBIGh1bmsgaW4gYSBwYXRjaCBwcm9kdWNlZCBieSBgYGRpZmYuc3RydWN0dXJlZFBhdGNoYGAuXG4gKi9cbmludGVyZmFjZSBQYXRjaEh1bmsge1xuICBvbGRTdGFydDogbnVtYmVyO1xuICBvbGRMaW5lczogbnVtYmVyO1xuICBuZXdTdGFydDogbnVtYmVyO1xuICBuZXdMaW5lczogbnVtYmVyO1xuICBsaW5lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuaWZpZWQgZGlmZiBvZiB0d28gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0gb2xkU3RyICB0aGUgXCJvbGRcIiB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0gbmV3U3RyICB0aGUgXCJuZXdcIiB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0gY29udGV4dCB0aGUgbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gdXNlIGluIGFyYml0cmFyeSBKU09OIGRpZmYuXG4gKlxuICogQHJldHVybnMgYW4gYXJyYXkgb2YgZGlmZiBsaW5lcy5cbiAqL1xuZnVuY3Rpb24gX2RpZmZTdHJpbmdzKG9sZFN0cjogc3RyaW5nLCBuZXdTdHI6IHN0cmluZywgY29udGV4dDogbnVtYmVyKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXRjaDogUGF0Y2ggPSBzdHJ1Y3R1cmVkUGF0Y2gobnVsbCwgbnVsbCwgb2xkU3RyLCBuZXdTdHIsIG51bGwsIG51bGwsIHsgY29udGV4dCB9KTtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBodW5rIG9mIHBhdGNoLmh1bmtzKSB7XG4gICAgcmVzdWx0LnB1c2goY2hhbGsubWFnZW50YShgQEAgLSR7aHVuay5vbGRTdGFydH0sJHtodW5rLm9sZExpbmVzfSArJHtodW5rLm5ld1N0YXJ0fSwke2h1bmsubmV3TGluZXN9IEBAYCkpO1xuICAgIGNvbnN0IGJhc2VJbmRlbnQgPSBfZmluZEluZGVudChodW5rLmxpbmVzKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgaHVuay5saW5lcykge1xuICAgICAgLy8gRG9uJ3QgY2FyZSBhYm91dCB0ZXJtaW5hdGlvbiBuZXdsaW5lLlxuICAgICAgaWYgKGxpbmUgPT09ICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKSB7IGNvbnRpbnVlOyB9XG4gICAgICBjb25zdCBtYXJrZXIgPSBsaW5lLmNoYXJBdCgwKTtcbiAgICAgIGNvbnN0IHRleHQgPSBsaW5lLnNsaWNlKDEgKyBiYXNlSW5kZW50KTtcbiAgICAgIHN3aXRjaCAobWFya2VyKSB7XG4gICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgIHJlc3VsdC5wdXNoKGAke0NPTlRFWFR9ICR7dGV4dH1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgcmVzdWx0LnB1c2goY2hhbGsuYm9sZChgJHtBRERJVElPTn0gJHtjaGFsay5ncmVlbih0ZXh0KX1gKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgIHJlc3VsdC5wdXNoKGNoYWxrLmJvbGQoYCR7UkVNT1ZBTH0gJHtjaGFsay5yZWQodGV4dCl9YCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBkaWZmIG1hcmtlcjogJHttYXJrZXJ9IChmdWxsIGxpbmU6ICR7bGluZX0pYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG5cbiAgZnVuY3Rpb24gX2ZpbmRJbmRlbnQobGluZXM6IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgICBsZXQgaW5kZW50ID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMSA7IGkgPCBsaW5lLmxlbmd0aCA7IGkrKykge1xuICAgICAgICBpZiAobGluZS5jaGFyQXQoaSkgIT09ICcgJykge1xuICAgICAgICAgIGluZGVudCA9IGluZGVudCA+IGkgLSAxID8gaSAtIDEgOiBpbmRlbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGVudDtcbiAgfVxufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IamChanges = void 0;\nconst cfnspec = require(\"@aws-cdk/cfnspec\");\nconst chalk = require(\"chalk\");\nconst managed_policy_1 = require(\"./managed-policy\");\nconst statement_1 = require(\"./statement\");\nconst diffable_1 = require(\"../diffable\");\nconst render_intrinsics_1 = require(\"../render-intrinsics\");\nconst util_1 = require(\"../util\");\n/**\n * Changes to IAM statements\n */\nclass IamChanges {\n constructor(props) {\n this.statements = new diffable_1.DiffableCollection();\n this.managedPolicies = new diffable_1.DiffableCollection();\n for (const propertyChange of props.propertyChanges) {\n this.readPropertyChange(propertyChange);\n }\n for (const resourceChange of props.resourceChanges) {\n this.readResourceChange(resourceChange);\n }\n this.statements.calculateDiff();\n this.managedPolicies.calculateDiff();\n }\n get hasChanges() {\n return this.statements.hasChanges || this.managedPolicies.hasChanges;\n }\n /**\n * Return whether the changes include broadened permissions\n *\n * Permissions are broadened if positive statements are added or\n * negative statements are removed, or if managed policies are added.\n */\n get permissionsBroadened() {\n return this.statements.additions.some(s => !s.isNegativeStatement)\n || this.statements.removals.some(s => s.isNegativeStatement)\n || this.managedPolicies.hasAdditions;\n }\n /**\n * Return a summary table of changes\n */\n summarizeStatements() {\n const ret = [];\n const header = ['', 'Resource', 'Effect', 'Action', 'Principal', 'Condition'];\n // First generate all lines, then sort on Resource so that similar resources are together\n for (const statement of this.statements.additions) {\n const renderedStatement = statement.render();\n ret.push([\n '+',\n renderedStatement.resource,\n renderedStatement.effect,\n renderedStatement.action,\n renderedStatement.principal,\n renderedStatement.condition,\n ].map(s => chalk.green(s)));\n }\n for (const statement of this.statements.removals) {\n const renderedStatement = statement.render();\n ret.push([\n chalk.red('-'),\n renderedStatement.resource,\n renderedStatement.effect,\n renderedStatement.action,\n renderedStatement.principal,\n renderedStatement.condition,\n ].map(s => chalk.red(s)));\n }\n // Sort by 2nd column\n ret.sort((0, util_1.makeComparator)((row) => [row[1]]));\n ret.splice(0, 0, header);\n return ret;\n }\n summarizeManagedPolicies() {\n const ret = [];\n const header = ['', 'Resource', 'Managed Policy ARN'];\n for (const att of this.managedPolicies.additions) {\n ret.push([\n '+',\n att.identityArn,\n att.managedPolicyArn,\n ].map(s => chalk.green(s)));\n }\n for (const att of this.managedPolicies.removals) {\n ret.push([\n '-',\n att.identityArn,\n att.managedPolicyArn,\n ].map(s => chalk.red(s)));\n }\n // Sort by 2nd column\n ret.sort((0, util_1.makeComparator)((row) => [row[1]]));\n ret.splice(0, 0, header);\n return ret;\n }\n /**\n * Return a machine-readable version of the changes.\n * This is only used in tests.\n *\n * @internal\n */\n _toJson() {\n return (0, util_1.deepRemoveUndefined)({\n statementAdditions: (0, util_1.dropIfEmpty)(this.statements.additions.map(s => s._toJson())),\n statementRemovals: (0, util_1.dropIfEmpty)(this.statements.removals.map(s => s._toJson())),\n managedPolicyAdditions: (0, util_1.dropIfEmpty)(this.managedPolicies.additions.map(s => s._toJson())),\n managedPolicyRemovals: (0, util_1.dropIfEmpty)(this.managedPolicies.removals.map(s => s._toJson())),\n });\n }\n readPropertyChange(propertyChange) {\n switch (propertyChange.scrutinyType) {\n case cfnspec.schema.PropertyScrutinyType.InlineIdentityPolicies:\n // AWS::IAM::{ Role | User | Group }.Policies\n this.statements.addOld(...this.readIdentityPolicies(propertyChange.oldValue, propertyChange.resourceLogicalId));\n this.statements.addNew(...this.readIdentityPolicies(propertyChange.newValue, propertyChange.resourceLogicalId));\n break;\n case cfnspec.schema.PropertyScrutinyType.InlineResourcePolicy:\n // Any PolicyDocument on a resource (including AssumeRolePolicyDocument)\n this.statements.addOld(...this.readResourceStatements(propertyChange.oldValue, propertyChange.resourceLogicalId));\n this.statements.addNew(...this.readResourceStatements(propertyChange.newValue, propertyChange.resourceLogicalId));\n break;\n case cfnspec.schema.PropertyScrutinyType.ManagedPolicies:\n // Just a list of managed policies\n this.managedPolicies.addOld(...this.readManagedPolicies(propertyChange.oldValue, propertyChange.resourceLogicalId));\n this.managedPolicies.addNew(...this.readManagedPolicies(propertyChange.newValue, propertyChange.resourceLogicalId));\n break;\n }\n }\n readResourceChange(resourceChange) {\n switch (resourceChange.scrutinyType) {\n case cfnspec.schema.ResourceScrutinyType.IdentityPolicyResource:\n // AWS::IAM::Policy\n this.statements.addOld(...this.readIdentityPolicyResource(resourceChange.oldProperties));\n this.statements.addNew(...this.readIdentityPolicyResource(resourceChange.newProperties));\n break;\n case cfnspec.schema.ResourceScrutinyType.ResourcePolicyResource:\n // AWS::*::{Bucket,Queue,Topic}Policy\n this.statements.addOld(...this.readResourcePolicyResource(resourceChange.oldProperties));\n this.statements.addNew(...this.readResourcePolicyResource(resourceChange.newProperties));\n break;\n case cfnspec.schema.ResourceScrutinyType.LambdaPermission:\n this.statements.addOld(...this.readLambdaStatements(resourceChange.oldProperties));\n this.statements.addNew(...this.readLambdaStatements(resourceChange.newProperties));\n break;\n }\n }\n /**\n * Parse a list of policies on an identity\n */\n readIdentityPolicies(policies, logicalId) {\n if (policies === undefined || !Array.isArray(policies)) {\n return [];\n }\n const appliesToPrincipal = 'AWS:${' + logicalId + '}';\n return (0, util_1.flatMap)(policies, (policy) => {\n // check if the Policy itself is not an intrinsic, like an Fn::If\n const unparsedStatement = policy.PolicyDocument?.Statement\n ? policy.PolicyDocument.Statement\n : policy;\n return defaultPrincipal(appliesToPrincipal, (0, statement_1.parseStatements)((0, render_intrinsics_1.renderIntrinsics)(unparsedStatement)));\n });\n }\n /**\n * Parse an IAM::Policy resource\n */\n readIdentityPolicyResource(properties) {\n if (properties === undefined) {\n return [];\n }\n properties = (0, render_intrinsics_1.renderIntrinsics)(properties);\n const principals = (properties.Groups || []).concat(properties.Users || []).concat(properties.Roles || []);\n return (0, util_1.flatMap)(principals, (principal) => {\n const ref = 'AWS:' + principal;\n return defaultPrincipal(ref, (0, statement_1.parseStatements)(properties.PolicyDocument.Statement));\n });\n }\n readResourceStatements(policy, logicalId) {\n if (policy === undefined) {\n return [];\n }\n const appliesToResource = '${' + logicalId + '.Arn}';\n return defaultResource(appliesToResource, (0, statement_1.parseStatements)((0, render_intrinsics_1.renderIntrinsics)(policy.Statement)));\n }\n /**\n * Parse an AWS::*::{Bucket,Topic,Queue}policy\n */\n readResourcePolicyResource(properties) {\n if (properties === undefined) {\n return [];\n }\n properties = (0, render_intrinsics_1.renderIntrinsics)(properties);\n const policyKeys = Object.keys(properties).filter(key => key.indexOf('Policy') > -1);\n // Find the key that identifies the resource(s) this policy applies to\n const resourceKeys = Object.keys(properties).filter(key => !policyKeys.includes(key) && !key.endsWith('Name'));\n let resources = resourceKeys.length === 1 ? properties[resourceKeys[0]] : ['???'];\n // For some resources, this is a singleton string, for some it's an array\n if (!Array.isArray(resources)) {\n resources = [resources];\n }\n return (0, util_1.flatMap)(resources, (resource) => {\n return defaultResource(resource, (0, statement_1.parseStatements)(properties[policyKeys[0]].Statement));\n });\n }\n readManagedPolicies(policyArns, logicalId) {\n if (!policyArns) {\n return [];\n }\n const rep = '${' + logicalId + '}';\n return managed_policy_1.ManagedPolicyAttachment.parseManagedPolicies(rep, (0, render_intrinsics_1.renderIntrinsics)(policyArns));\n }\n readLambdaStatements(properties) {\n if (!properties) {\n return [];\n }\n return [(0, statement_1.parseLambdaPermission)((0, render_intrinsics_1.renderIntrinsics)(properties))];\n }\n}\nexports.IamChanges = IamChanges;\nIamChanges.IamPropertyScrutinies = [\n cfnspec.schema.PropertyScrutinyType.InlineIdentityPolicies,\n cfnspec.schema.PropertyScrutinyType.InlineResourcePolicy,\n cfnspec.schema.PropertyScrutinyType.ManagedPolicies,\n];\nIamChanges.IamResourceScrutinies = [\n cfnspec.schema.ResourceScrutinyType.ResourcePolicyResource,\n cfnspec.schema.ResourceScrutinyType.IdentityPolicyResource,\n cfnspec.schema.ResourceScrutinyType.LambdaPermission,\n];\n/**\n * Set an undefined or wildcarded principal on these statements\n */\nfunction defaultPrincipal(principal, statements) {\n statements.forEach(s => s.principals.replaceEmpty(principal));\n statements.forEach(s => s.principals.replaceStar(principal));\n return statements;\n}\n/**\n * Set an undefined or wildcarded resource on these statements\n */\nfunction defaultResource(resource, statements) {\n statements.forEach(s => s.resources.replaceEmpty(resource));\n statements.forEach(s => s.resources.replaceStar(resource));\n return statements;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWNoYW5nZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpYW0tY2hhbmdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0Q0FBNEM7QUFDNUMsK0JBQStCO0FBQy9CLHFEQUE4RTtBQUM5RSwyQ0FBK0Y7QUFHL0YsMENBQWlEO0FBQ2pELDREQUF3RDtBQUN4RCxrQ0FBb0Y7QUFPcEY7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFnQnJCLFlBQVksS0FBc0I7UUFIbEIsZUFBVSxHQUFHLElBQUksNkJBQWtCLEVBQWEsQ0FBQztRQUNqRCxvQkFBZSxHQUFHLElBQUksNkJBQWtCLEVBQTJCLENBQUM7UUFHbEYsS0FBSyxNQUFNLGNBQWMsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFO1lBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN6QztRQUNELEtBQUssTUFBTSxjQUFjLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDekM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7ZUFDM0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO2VBQ3pELElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNJLG1CQUFtQjtRQUN4QixNQUFNLEdBQUcsR0FBZSxFQUFFLENBQUM7UUFFM0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTlFLHlGQUF5RjtRQUN6RixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFO1lBQ2pELE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxpQkFBaUIsQ0FBQyxRQUFRO2dCQUMxQixpQkFBaUIsQ0FBQyxNQUFNO2dCQUN4QixpQkFBaUIsQ0FBQyxNQUFNO2dCQUN4QixpQkFBaUIsQ0FBQyxTQUFTO2dCQUMzQixpQkFBaUIsQ0FBQyxTQUFTO2FBQzVCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFDRCxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1lBQ2hELE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsaUJBQWlCLENBQUMsUUFBUTtnQkFDMUIsaUJBQWlCLENBQUMsTUFBTTtnQkFDeEIsaUJBQWlCLENBQUMsTUFBTTtnQkFDeEIsaUJBQWlCLENBQUMsU0FBUztnQkFDM0IsaUJBQWlCLENBQUMsU0FBUzthQUM1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCO1FBRUQscUJBQXFCO1FBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSxxQkFBYyxFQUFDLENBQUMsR0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFekIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sd0JBQXdCO1FBQzdCLE1BQU0sR0FBRyxHQUFlLEVBQUUsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUV0RCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFO1lBQ2hELEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxHQUFHLENBQUMsV0FBVztnQkFDZixHQUFHLENBQUMsZ0JBQWdCO2FBQ3JCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQy9DLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxHQUFHLENBQUMsV0FBVztnQkFDZixHQUFHLENBQUMsZ0JBQWdCO2FBQ3JCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFFRCxxQkFBcUI7UUFDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFBLHFCQUFjLEVBQUMsQ0FBQyxHQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRELEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUEsMEJBQW1CLEVBQUM7WUFDekIsa0JBQWtCLEVBQUUsSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLGlCQUFpQixFQUFFLElBQUEsa0JBQVcsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM5RSxzQkFBc0IsRUFBRSxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDekYscUJBQXFCLEVBQUUsSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3hGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxjQUE4QjtRQUN2RCxRQUFRLGNBQWMsQ0FBQyxZQUFZLEVBQUU7WUFDbkMsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQjtnQkFDN0QsNkNBQTZDO2dCQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hILElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDaEgsTUFBTTtZQUNSLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0I7Z0JBQzNELHdFQUF3RTtnQkFDeEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUNsSCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xILE1BQU07WUFDUixLQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsZUFBZTtnQkFDdEQsa0NBQWtDO2dCQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BILElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDcEgsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLGNBQThCO1FBQ3ZELFFBQVEsY0FBYyxDQUFDLFlBQVksRUFBRTtZQUNuQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCO2dCQUM3RCxtQkFBbUI7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUN6RixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDekYsTUFBTTtZQUNSLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0I7Z0JBQzdELHFDQUFxQztnQkFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUN6RixNQUFNO1lBQ1IsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQjtnQkFDdkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ25GLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FBQyxRQUFhLEVBQUUsU0FBaUI7UUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFdEUsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUV0RCxPQUFPLElBQUEsY0FBTyxFQUFDLFFBQVEsRUFBRSxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ3ZDLGlFQUFpRTtZQUNqRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsU0FBUztnQkFDeEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUztnQkFDakMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNYLE9BQU8sZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsSUFBQSwyQkFBZSxFQUFDLElBQUEsb0NBQWdCLEVBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSywwQkFBMEIsQ0FBQyxVQUFlO1FBQ2hELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFNUMsVUFBVSxHQUFHLElBQUEsb0NBQWdCLEVBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLE9BQU8sSUFBQSxjQUFPLEVBQUMsVUFBVSxFQUFFLENBQUMsU0FBaUIsRUFBRSxFQUFFO1lBQy9DLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUM7WUFDL0IsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBQSwyQkFBZSxFQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFXLEVBQUUsU0FBaUI7UUFDM0QsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7U0FBRTtRQUV4QyxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ3JELE9BQU8sZUFBZSxDQUFDLGlCQUFpQixFQUFFLElBQUEsMkJBQWUsRUFBQyxJQUFBLG9DQUFnQixFQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVEOztPQUVHO0lBQ0ssMEJBQTBCLENBQUMsVUFBZTtRQUNoRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBRTVDLFVBQVUsR0FBRyxJQUFBLG9DQUFnQixFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJGLHNFQUFzRTtRQUN0RSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMvRyxJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxGLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM3QixTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN6QjtRQUVELE9BQU8sSUFBQSxjQUFPLEVBQUMsU0FBUyxFQUFFLENBQUMsUUFBZ0IsRUFBRSxFQUFFO1lBQzdDLE9BQU8sZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFBLDJCQUFlLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsVUFBZSxFQUFFLFNBQWlCO1FBQzVELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBRS9CLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ25DLE9BQU8sd0NBQXVCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLElBQUEsb0NBQWdCLEVBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRU8sb0JBQW9CLENBQUMsVUFBd0I7UUFDbkQsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFL0IsT0FBTyxDQUFDLElBQUEsaUNBQXFCLEVBQUMsSUFBQSxvQ0FBZ0IsRUFBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7QUEvT0gsZ0NBZ1BDO0FBL09lLGdDQUFxQixHQUFHO0lBQ3BDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCO0lBQzFELE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CO0lBQ3hELE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsZUFBZTtDQUNwRCxBQUprQyxDQUlqQztBQUVZLGdDQUFxQixHQUFHO0lBQ3BDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCO0lBQzFELE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCO0lBQzFELE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCO0NBQ3JELEFBSmtDLENBSWpDO0FBdU9KOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxTQUFpQixFQUFFLFVBQXVCO0lBQ2xFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzlELFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzdELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLFFBQWdCLEVBQUUsVUFBdUI7SUFDaEUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDNUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNmbnNwZWMgZnJvbSAnQGF3cy1jZGsvY2Zuc3BlYyc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBNYW5hZ2VkUG9saWN5QXR0YWNobWVudCwgTWFuYWdlZFBvbGljeUpzb24gfSBmcm9tICcuL21hbmFnZWQtcG9saWN5JztcbmltcG9ydCB7IHBhcnNlTGFtYmRhUGVybWlzc2lvbiwgcGFyc2VTdGF0ZW1lbnRzLCBTdGF0ZW1lbnQsIFN0YXRlbWVudEpzb24gfSBmcm9tICcuL3N0YXRlbWVudCc7XG5pbXBvcnQgeyBNYXliZVBhcnNlZCB9IGZyb20gJy4uL2RpZmYvbWF5YmUtcGFyc2VkJztcbmltcG9ydCB7IFByb3BlcnR5Q2hhbmdlLCBQcm9wZXJ0eU1hcCwgUmVzb3VyY2VDaGFuZ2UgfSBmcm9tICcuLi9kaWZmL3R5cGVzJztcbmltcG9ydCB7IERpZmZhYmxlQ29sbGVjdGlvbiB9IGZyb20gJy4uL2RpZmZhYmxlJztcbmltcG9ydCB7IHJlbmRlckludHJpbnNpY3MgfSBmcm9tICcuLi9yZW5kZXItaW50cmluc2ljcyc7XG5pbXBvcnQgeyBkZWVwUmVtb3ZlVW5kZWZpbmVkLCBkcm9wSWZFbXB0eSwgZmxhdE1hcCwgbWFrZUNvbXBhcmF0b3IgfSBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBJYW1DaGFuZ2VzUHJvcHMge1xuICBwcm9wZXJ0eUNoYW5nZXM6IFByb3BlcnR5Q2hhbmdlW107XG4gIHJlc291cmNlQ2hhbmdlczogUmVzb3VyY2VDaGFuZ2VbXTtcbn1cblxuLyoqXG4gKiBDaGFuZ2VzIHRvIElBTSBzdGF0ZW1lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBJYW1DaGFuZ2VzIHtcbiAgcHVibGljIHN0YXRpYyBJYW1Qcm9wZXJ0eVNjcnV0aW5pZXMgPSBbXG4gICAgY2Zuc3BlYy5zY2hlbWEuUHJvcGVydHlTY3J1dGlueVR5cGUuSW5saW5lSWRlbnRpdHlQb2xpY2llcyxcbiAgICBjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVSZXNvdXJjZVBvbGljeSxcbiAgICBjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZS5NYW5hZ2VkUG9saWNpZXMsXG4gIF07XG5cbiAgcHVibGljIHN0YXRpYyBJYW1SZXNvdXJjZVNjcnV0aW5pZXMgPSBbXG4gICAgY2Zuc3BlYy5zY2hlbWEuUmVzb3VyY2VTY3J1dGlueVR5cGUuUmVzb3VyY2VQb2xpY3lSZXNvdXJjZSxcbiAgICBjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZS5JZGVudGl0eVBvbGljeVJlc291cmNlLFxuICAgIGNmbnNwZWMuc2NoZW1hLlJlc291cmNlU2NydXRpbnlUeXBlLkxhbWJkYVBlcm1pc3Npb24sXG4gIF07XG5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlbWVudHMgPSBuZXcgRGlmZmFibGVDb2xsZWN0aW9uPFN0YXRlbWVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IG1hbmFnZWRQb2xpY2llcyA9IG5ldyBEaWZmYWJsZUNvbGxlY3Rpb248TWFuYWdlZFBvbGljeUF0dGFjaG1lbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IElhbUNoYW5nZXNQcm9wcykge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlDaGFuZ2Ugb2YgcHJvcHMucHJvcGVydHlDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUNoYW5nZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VDaGFuZ2Ugb2YgcHJvcHMucmVzb3VyY2VDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRSZXNvdXJjZUNoYW5nZShyZXNvdXJjZUNoYW5nZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZW1lbnRzLmNhbGN1bGF0ZURpZmYoKTtcbiAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5jYWxjdWxhdGVEaWZmKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50cy5oYXNDaGFuZ2VzIHx8IHRoaXMubWFuYWdlZFBvbGljaWVzLmhhc0NoYW5nZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGNoYW5nZXMgaW5jbHVkZSBicm9hZGVuZWQgcGVybWlzc2lvbnNcbiAgICpcbiAgICogUGVybWlzc2lvbnMgYXJlIGJyb2FkZW5lZCBpZiBwb3NpdGl2ZSBzdGF0ZW1lbnRzIGFyZSBhZGRlZCBvclxuICAgKiBuZWdhdGl2ZSBzdGF0ZW1lbnRzIGFyZSByZW1vdmVkLCBvciBpZiBtYW5hZ2VkIHBvbGljaWVzIGFyZSBhZGRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnNCcm9hZGVuZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50cy5hZGRpdGlvbnMuc29tZShzID0+ICFzLmlzTmVnYXRpdmVTdGF0ZW1lbnQpXG4gICAgICAgIHx8IHRoaXMuc3RhdGVtZW50cy5yZW1vdmFscy5zb21lKHMgPT4gcy5pc05lZ2F0aXZlU3RhdGVtZW50KVxuICAgICAgICB8fCB0aGlzLm1hbmFnZWRQb2xpY2llcy5oYXNBZGRpdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3VtbWFyeSB0YWJsZSBvZiBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgc3VtbWFyaXplU3RhdGVtZW50cygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcblxuICAgIGNvbnN0IGhlYWRlciA9IFsnJywgJ1Jlc291cmNlJywgJ0VmZmVjdCcsICdBY3Rpb24nLCAnUHJpbmNpcGFsJywgJ0NvbmRpdGlvbiddO1xuXG4gICAgLy8gRmlyc3QgZ2VuZXJhdGUgYWxsIGxpbmVzLCB0aGVuIHNvcnQgb24gUmVzb3VyY2Ugc28gdGhhdCBzaW1pbGFyIHJlc291cmNlcyBhcmUgdG9nZXRoZXJcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMuYWRkaXRpb25zKSB7XG4gICAgICBjb25zdCByZW5kZXJlZFN0YXRlbWVudCA9IHN0YXRlbWVudC5yZW5kZXIoKTtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJysnLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5yZXNvdXJjZSxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuZWZmZWN0LFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5hY3Rpb24sXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LnByaW5jaXBhbCxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuY29uZGl0aW9uLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMucmVtb3ZhbHMpIHtcbiAgICAgIGNvbnN0IHJlbmRlcmVkU3RhdGVtZW50ID0gc3RhdGVtZW50LnJlbmRlcigpO1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICBjaGFsay5yZWQoJy0nKSxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQucmVzb3VyY2UsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LmVmZmVjdCxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuYWN0aW9uLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5wcmluY2lwYWwsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LmNvbmRpdGlvbixcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsucmVkKHMpKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSAybmQgY29sdW1uXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV1dKSk7XG5cbiAgICByZXQuc3BsaWNlKDAsIDAsIGhlYWRlcik7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIHN1bW1hcml6ZU1hbmFnZWRQb2xpY2llcygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcbiAgICBjb25zdCBoZWFkZXIgPSBbJycsICdSZXNvdXJjZScsICdNYW5hZ2VkIFBvbGljeSBBUk4nXTtcblxuICAgIGZvciAoY29uc3QgYXR0IG9mIHRoaXMubWFuYWdlZFBvbGljaWVzLmFkZGl0aW9ucykge1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICAnKycsXG4gICAgICAgIGF0dC5pZGVudGl0eUFybixcbiAgICAgICAgYXR0Lm1hbmFnZWRQb2xpY3lBcm4sXG4gICAgICBdLm1hcChzID0+IGNoYWxrLmdyZWVuKHMpKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgYXR0IG9mIHRoaXMubWFuYWdlZFBvbGljaWVzLnJlbW92YWxzKSB7XG4gICAgICByZXQucHVzaChbXG4gICAgICAgICctJyxcbiAgICAgICAgYXR0LmlkZW50aXR5QXJuLFxuICAgICAgICBhdHQubWFuYWdlZFBvbGljeUFybixcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsucmVkKHMpKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSAybmQgY29sdW1uXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV1dKSk7XG5cbiAgICByZXQuc3BsaWNlKDAsIDAsIGhlYWRlcik7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY2hhbmdlcy5cbiAgICogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGVzdHMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0pzb24oKTogSWFtQ2hhbmdlc0pzb24ge1xuICAgIHJldHVybiBkZWVwUmVtb3ZlVW5kZWZpbmVkKHtcbiAgICAgIHN0YXRlbWVudEFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5zdGF0ZW1lbnRzLmFkZGl0aW9ucy5tYXAocyA9PiBzLl90b0pzb24oKSkpLFxuICAgICAgc3RhdGVtZW50UmVtb3ZhbHM6IGRyb3BJZkVtcHR5KHRoaXMuc3RhdGVtZW50cy5yZW1vdmFscy5tYXAocyA9PiBzLl90b0pzb24oKSkpLFxuICAgICAgbWFuYWdlZFBvbGljeUFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5tYW5hZ2VkUG9saWNpZXMuYWRkaXRpb25zLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgICBtYW5hZ2VkUG9saWN5UmVtb3ZhbHM6IGRyb3BJZkVtcHR5KHRoaXMubWFuYWdlZFBvbGljaWVzLnJlbW92YWxzLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUNoYW5nZTogUHJvcGVydHlDaGFuZ2UpIHtcbiAgICBzd2l0Y2ggKHByb3BlcnR5Q2hhbmdlLnNjcnV0aW55VHlwZSkge1xuICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVJZGVudGl0eVBvbGljaWVzOlxuICAgICAgICAvLyBBV1M6OklBTTo6eyBSb2xlIHwgVXNlciB8IEdyb3VwIH0uUG9saWNpZXNcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE9sZCguLi50aGlzLnJlYWRJZGVudGl0eVBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZElkZW50aXR5UG9saWNpZXMocHJvcGVydHlDaGFuZ2UubmV3VmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5Qcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVSZXNvdXJjZVBvbGljeTpcbiAgICAgICAgLy8gQW55IFBvbGljeURvY3VtZW50IG9uIGEgcmVzb3VyY2UgKGluY2x1ZGluZyBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQpXG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkUmVzb3VyY2VTdGF0ZW1lbnRzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZFJlc291cmNlU3RhdGVtZW50cyhwcm9wZXJ0eUNoYW5nZS5uZXdWYWx1ZSwgcHJvcGVydHlDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGNmbnNwZWMuc2NoZW1hLlByb3BlcnR5U2NydXRpbnlUeXBlLk1hbmFnZWRQb2xpY2llczpcbiAgICAgICAgLy8gSnVzdCBhIGxpc3Qgb2YgbWFuYWdlZCBwb2xpY2llc1xuICAgICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGRPbGQoLi4udGhpcy5yZWFkTWFuYWdlZFBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGROZXcoLi4udGhpcy5yZWFkTWFuYWdlZFBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm5ld1ZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRSZXNvdXJjZUNoYW5nZShyZXNvdXJjZUNoYW5nZTogUmVzb3VyY2VDaGFuZ2UpIHtcbiAgICBzd2l0Y2ggKHJlc291cmNlQ2hhbmdlLnNjcnV0aW55VHlwZSkge1xuICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZS5JZGVudGl0eVBvbGljeVJlc291cmNlOlxuICAgICAgICAvLyBBV1M6OklBTTo6UG9saWN5XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZS5SZXNvdXJjZVBvbGljeVJlc291cmNlOlxuICAgICAgICAvLyBBV1M6Oio6OntCdWNrZXQsUXVldWUsVG9waWN9UG9saWN5XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkUmVzb3VyY2VQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkUmVzb3VyY2VQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBjZm5zcGVjLnNjaGVtYS5SZXNvdXJjZVNjcnV0aW55VHlwZS5MYW1iZGFQZXJtaXNzaW9uOlxuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkT2xkKC4uLnRoaXMucmVhZExhbWJkYVN0YXRlbWVudHMocmVzb3VyY2VDaGFuZ2Uub2xkUHJvcGVydGllcykpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZExhbWJkYVN0YXRlbWVudHMocmVzb3VyY2VDaGFuZ2UubmV3UHJvcGVydGllcykpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYSBsaXN0IG9mIHBvbGljaWVzIG9uIGFuIGlkZW50aXR5XG4gICAqL1xuICBwcml2YXRlIHJlYWRJZGVudGl0eVBvbGljaWVzKHBvbGljaWVzOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwb2xpY2llcyA9PT0gdW5kZWZpbmVkIHx8ICFBcnJheS5pc0FycmF5KHBvbGljaWVzKSkgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IGFwcGxpZXNUb1ByaW5jaXBhbCA9ICdBV1M6JHsnICsgbG9naWNhbElkICsgJ30nO1xuXG4gICAgcmV0dXJuIGZsYXRNYXAocG9saWNpZXMsIChwb2xpY3k6IGFueSkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIFBvbGljeSBpdHNlbGYgaXMgbm90IGFuIGludHJpbnNpYywgbGlrZSBhbiBGbjo6SWZcbiAgICAgIGNvbnN0IHVucGFyc2VkU3RhdGVtZW50ID0gcG9saWN5LlBvbGljeURvY3VtZW50Py5TdGF0ZW1lbnRcbiAgICAgICAgPyBwb2xpY3kuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50XG4gICAgICAgIDogcG9saWN5O1xuICAgICAgcmV0dXJuIGRlZmF1bHRQcmluY2lwYWwoYXBwbGllc1RvUHJpbmNpcGFsLCBwYXJzZVN0YXRlbWVudHMocmVuZGVySW50cmluc2ljcyh1bnBhcnNlZFN0YXRlbWVudCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbiBJQU06OlBvbGljeSByZXNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShwcm9wZXJ0aWVzOiBhbnkpOiBTdGF0ZW1lbnRbXSB7XG4gICAgaWYgKHByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIHByb3BlcnRpZXMgPSByZW5kZXJJbnRyaW5zaWNzKHByb3BlcnRpZXMpO1xuXG4gICAgY29uc3QgcHJpbmNpcGFscyA9IChwcm9wZXJ0aWVzLkdyb3VwcyB8fCBbXSkuY29uY2F0KHByb3BlcnRpZXMuVXNlcnMgfHwgW10pLmNvbmNhdChwcm9wZXJ0aWVzLlJvbGVzIHx8IFtdKTtcbiAgICByZXR1cm4gZmxhdE1hcChwcmluY2lwYWxzLCAocHJpbmNpcGFsOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHJlZiA9ICdBV1M6JyArIHByaW5jaXBhbDtcbiAgICAgIHJldHVybiBkZWZhdWx0UHJpbmNpcGFsKHJlZiwgcGFyc2VTdGF0ZW1lbnRzKHByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50KSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRSZXNvdXJjZVN0YXRlbWVudHMocG9saWN5OiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwb2xpY3kgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IGFwcGxpZXNUb1Jlc291cmNlID0gJyR7JyArIGxvZ2ljYWxJZCArICcuQXJufSc7XG4gICAgcmV0dXJuIGRlZmF1bHRSZXNvdXJjZShhcHBsaWVzVG9SZXNvdXJjZSwgcGFyc2VTdGF0ZW1lbnRzKHJlbmRlckludHJpbnNpY3MocG9saWN5LlN0YXRlbWVudCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbiBBV1M6Oio6OntCdWNrZXQsVG9waWMsUXVldWV9cG9saWN5XG4gICAqL1xuICBwcml2YXRlIHJlYWRSZXNvdXJjZVBvbGljeVJlc291cmNlKHByb3BlcnRpZXM6IGFueSk6IFN0YXRlbWVudFtdIHtcbiAgICBpZiAocHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBbXTsgfVxuXG4gICAgcHJvcGVydGllcyA9IHJlbmRlckludHJpbnNpY3MocHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBwb2xpY3lLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykuZmlsdGVyKGtleSA9PiBrZXkuaW5kZXhPZignUG9saWN5JykgPiAtMSk7XG5cbiAgICAvLyBGaW5kIHRoZSBrZXkgdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZShzKSB0aGlzIHBvbGljeSBhcHBsaWVzIHRvXG4gICAgY29uc3QgcmVzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykuZmlsdGVyKGtleSA9PiAhcG9saWN5S2V5cy5pbmNsdWRlcyhrZXkpICYmICFrZXkuZW5kc1dpdGgoJ05hbWUnKSk7XG4gICAgbGV0IHJlc291cmNlcyA9IHJlc291cmNlS2V5cy5sZW5ndGggPT09IDEgPyBwcm9wZXJ0aWVzW3Jlc291cmNlS2V5c1swXV0gOiBbJz8/PyddO1xuXG4gICAgLy8gRm9yIHNvbWUgcmVzb3VyY2VzLCB0aGlzIGlzIGEgc2luZ2xldG9uIHN0cmluZywgZm9yIHNvbWUgaXQncyBhbiBhcnJheVxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZXNvdXJjZXMpKSB7XG4gICAgICByZXNvdXJjZXMgPSBbcmVzb3VyY2VzXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdE1hcChyZXNvdXJjZXMsIChyZXNvdXJjZTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gZGVmYXVsdFJlc291cmNlKHJlc291cmNlLCBwYXJzZVN0YXRlbWVudHMocHJvcGVydGllc1twb2xpY3lLZXlzWzBdXS5TdGF0ZW1lbnQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZE1hbmFnZWRQb2xpY2llcyhwb2xpY3lBcm5zOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogTWFuYWdlZFBvbGljeUF0dGFjaG1lbnRbXSB7XG4gICAgaWYgKCFwb2xpY3lBcm5zKSB7IHJldHVybiBbXTsgfVxuXG4gICAgY29uc3QgcmVwID0gJyR7JyArIGxvZ2ljYWxJZCArICd9JztcbiAgICByZXR1cm4gTWFuYWdlZFBvbGljeUF0dGFjaG1lbnQucGFyc2VNYW5hZ2VkUG9saWNpZXMocmVwLCByZW5kZXJJbnRyaW5zaWNzKHBvbGljeUFybnMpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZExhbWJkYVN0YXRlbWVudHMocHJvcGVydGllcz86IFByb3BlcnR5TWFwKTogU3RhdGVtZW50W10ge1xuICAgIGlmICghcHJvcGVydGllcykgeyByZXR1cm4gW107IH1cblxuICAgIHJldHVybiBbcGFyc2VMYW1iZGFQZXJtaXNzaW9uKHJlbmRlckludHJpbnNpY3MocHJvcGVydGllcykpXTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBhbiB1bmRlZmluZWQgb3Igd2lsZGNhcmRlZCBwcmluY2lwYWwgb24gdGhlc2Ugc3RhdGVtZW50c1xuICovXG5mdW5jdGlvbiBkZWZhdWx0UHJpbmNpcGFsKHByaW5jaXBhbDogc3RyaW5nLCBzdGF0ZW1lbnRzOiBTdGF0ZW1lbnRbXSkge1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnByaW5jaXBhbHMucmVwbGFjZUVtcHR5KHByaW5jaXBhbCkpO1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnByaW5jaXBhbHMucmVwbGFjZVN0YXIocHJpbmNpcGFsKSk7XG4gIHJldHVybiBzdGF0ZW1lbnRzO1xufVxuXG4vKipcbiAqIFNldCBhbiB1bmRlZmluZWQgb3Igd2lsZGNhcmRlZCByZXNvdXJjZSBvbiB0aGVzZSBzdGF0ZW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRSZXNvdXJjZShyZXNvdXJjZTogc3RyaW5nLCBzdGF0ZW1lbnRzOiBTdGF0ZW1lbnRbXSkge1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnJlc291cmNlcy5yZXBsYWNlRW1wdHkocmVzb3VyY2UpKTtcbiAgc3RhdGVtZW50cy5mb3JFYWNoKHMgPT4gcy5yZXNvdXJjZXMucmVwbGFjZVN0YXIocmVzb3VyY2UpKTtcbiAgcmV0dXJuIHN0YXRlbWVudHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWFtQ2hhbmdlc0pzb24ge1xuICBzdGF0ZW1lbnRBZGRpdGlvbnM/OiBBcnJheTxNYXliZVBhcnNlZDxTdGF0ZW1lbnRKc29uPj47XG4gIHN0YXRlbWVudFJlbW92YWxzPzogQXJyYXk8TWF5YmVQYXJzZWQ8U3RhdGVtZW50SnNvbj4+O1xuICBtYW5hZ2VkUG9saWN5QWRkaXRpb25zPzogQXJyYXk8TWF5YmVQYXJzZWQ8TWFuYWdlZFBvbGljeUpzb24+PjtcbiAgbWFuYWdlZFBvbGljeVJlbW92YWxzPzogQXJyYXk8TWF5YmVQYXJzZWQ8TWFuYWdlZFBvbGljeUpzb24+Pjtcbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ManagedPolicyAttachment = void 0;\nconst maybe_parsed_1 = require(\"../diff/maybe-parsed\");\nclass ManagedPolicyAttachment {\n static parseManagedPolicies(identityArn, arns) {\n return typeof arns === 'string'\n ? [new ManagedPolicyAttachment(identityArn, arns)]\n : arns.map((arn) => new ManagedPolicyAttachment(identityArn, arn));\n }\n constructor(identityArn, managedPolicyArn) {\n this.identityArn = identityArn;\n this.managedPolicyArn = managedPolicyArn;\n }\n equal(other) {\n return this.identityArn === other.identityArn\n && this.managedPolicyArn === other.managedPolicyArn;\n }\n /**\n * Return a machine-readable version of the changes.\n * This is only used in tests.\n *\n * @internal\n */\n _toJson() {\n return (0, maybe_parsed_1.mkParsed)({\n identityArn: this.identityArn,\n managedPolicyArn: this.managedPolicyArn,\n });\n }\n}\nexports.ManagedPolicyAttachment = ManagedPolicyAttachment;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYW5hZ2VkLXBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1REFBNkQ7QUFFN0QsTUFBYSx1QkFBdUI7SUFDM0IsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFdBQW1CLEVBQUUsSUFBdUI7UUFDN0UsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRO1lBQzdCLENBQUMsQ0FBQyxDQUFDLElBQUksdUJBQXVCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xELENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxZQUE0QixXQUFtQixFQUFrQixnQkFBd0I7UUFBN0QsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFBa0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO0lBQ3pGLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBOEI7UUFDekMsT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxXQUFXO2VBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksT0FBTztRQUNaLE9BQU8sSUFBQSx1QkFBUSxFQUFDO1lBQ2QsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7U0FDeEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBM0JELDBEQTJCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1heWJlUGFyc2VkLCBta1BhcnNlZCB9IGZyb20gJy4uL2RpZmYvbWF5YmUtcGFyc2VkJztcblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRQb2xpY3lBdHRhY2htZW50IHtcbiAgcHVibGljIHN0YXRpYyBwYXJzZU1hbmFnZWRQb2xpY2llcyhpZGVudGl0eUFybjogc3RyaW5nLCBhcm5zOiBzdHJpbmcgfCBzdHJpbmdbXSk6IE1hbmFnZWRQb2xpY3lBdHRhY2htZW50W10ge1xuICAgIHJldHVybiB0eXBlb2YgYXJucyA9PT0gJ3N0cmluZydcbiAgICAgID8gW25ldyBNYW5hZ2VkUG9saWN5QXR0YWNobWVudChpZGVudGl0eUFybiwgYXJucyldXG4gICAgICA6IGFybnMubWFwKChhcm46IHN0cmluZykgPT4gbmV3IE1hbmFnZWRQb2xpY3lBdHRhY2htZW50KGlkZW50aXR5QXJuLCBhcm4pKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBpZGVudGl0eUFybjogc3RyaW5nLCBwdWJsaWMgcmVhZG9ubHkgbWFuYWdlZFBvbGljeUFybjogc3RyaW5nKSB7XG4gIH1cblxuICBwdWJsaWMgZXF1YWwob3RoZXI6IE1hbmFnZWRQb2xpY3lBdHRhY2htZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlBcm4gPT09IG90aGVyLmlkZW50aXR5QXJuXG4gICAgICAgICYmIHRoaXMubWFuYWdlZFBvbGljeUFybiA9PT0gb3RoZXIubWFuYWdlZFBvbGljeUFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGNoYW5nZXMuXG4gICAqIFRoaXMgaXMgb25seSB1c2VkIGluIHRlc3RzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9Kc29uKCk6IE1heWJlUGFyc2VkPE1hbmFnZWRQb2xpY3lKc29uPiB7XG4gICAgcmV0dXJuIG1rUGFyc2VkKHtcbiAgICAgIGlkZW50aXR5QXJuOiB0aGlzLmlkZW50aXR5QXJuLFxuICAgICAgbWFuYWdlZFBvbGljeUFybjogdGhpcy5tYW5hZ2VkUG9saWN5QXJuLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlZFBvbGljeUpzb24ge1xuICBpZGVudGl0eUFybjogc3RyaW5nO1xuICBtYW5hZ2VkUG9saWN5QXJuOiBzdHJpbmc7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.renderCondition = exports.Effect = exports.Targets = exports.parseLambdaPermission = exports.parseStatements = exports.Statement = void 0;\nconst maybe_parsed_1 = require(\"../diff/maybe-parsed\");\nconst util_1 = require(\"../util\");\n// namespace object imports won't work in the bundle for function exports\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst deepEqual = require('fast-deep-equal');\nclass Statement {\n constructor(statement) {\n if (typeof statement === 'string') {\n this.sid = undefined;\n this.effect = Effect.Unknown;\n this.resources = new Targets({}, '', '');\n this.actions = new Targets({}, '', '');\n this.principals = new Targets({}, '', '');\n this.condition = undefined;\n this.serializedIntrinsic = statement;\n }\n else {\n this.sid = expectString(statement.Sid);\n this.effect = expectEffect(statement.Effect);\n this.resources = new Targets(statement, 'Resource', 'NotResource');\n this.actions = new Targets(statement, 'Action', 'NotAction');\n this.principals = new Targets(statement, 'Principal', 'NotPrincipal');\n this.condition = statement.Condition;\n this.serializedIntrinsic = undefined;\n }\n }\n /**\n * Whether this statement is equal to the other statement\n */\n equal(other) {\n return (this.sid === other.sid\n && this.effect === other.effect\n && this.serializedIntrinsic === other.serializedIntrinsic\n && this.resources.equal(other.resources)\n && this.actions.equal(other.actions)\n && this.principals.equal(other.principals)\n && deepEqual(this.condition, other.condition));\n }\n render() {\n return this.serializedIntrinsic\n ? {\n resource: this.serializedIntrinsic,\n effect: '',\n action: '',\n principal: this.principals.render(),\n condition: '',\n }\n : {\n resource: this.resources.render(),\n effect: this.effect,\n action: this.actions.render(),\n principal: this.principals.render(),\n condition: renderCondition(this.condition),\n };\n }\n /**\n * Return a machine-readable version of the changes.\n * This is only used in tests.\n *\n * @internal\n */\n _toJson() {\n return this.serializedIntrinsic\n ? (0, maybe_parsed_1.mkUnparseable)(this.serializedIntrinsic)\n : (0, maybe_parsed_1.mkParsed)((0, util_1.deepRemoveUndefined)({\n sid: this.sid,\n effect: this.effect,\n resources: this.resources._toJson(),\n principals: this.principals._toJson(),\n actions: this.actions._toJson(),\n condition: this.condition,\n }));\n }\n /**\n * Whether this is a negative statement\n *\n * A statement is negative if any of its targets are negative, inverted\n * if the Effect is Deny.\n */\n get isNegativeStatement() {\n const notTarget = this.actions.not || this.principals.not || this.resources.not;\n return this.effect === Effect.Allow ? notTarget : !notTarget;\n }\n}\nexports.Statement = Statement;\n/**\n * Parse a list of statements from undefined, a Statement, or a list of statements\n */\nfunction parseStatements(x) {\n if (x === undefined) {\n x = [];\n }\n if (!Array.isArray(x)) {\n x = [x];\n }\n return x.map((s) => new Statement(s));\n}\nexports.parseStatements = parseStatements;\n/**\n * Parse a Statement from a Lambda::Permission object\n *\n * This is actually what Lambda adds to the policy document if you call AddPermission.\n */\nfunction parseLambdaPermission(x) {\n // Construct a statement from\n const statement = {\n Effect: 'Allow',\n Action: x.Action,\n Resource: x.FunctionName,\n };\n if (x.Principal !== undefined) {\n if (x.Principal === '*') {\n // *\n statement.Principal = '*';\n }\n else if (/^\\d{12}$/.test(x.Principal)) {\n // Account number\n // eslint-disable-next-line @aws-cdk/no-literal-partition\n statement.Principal = { AWS: `arn:aws:iam::${x.Principal}:root` };\n }\n else {\n // Assume it's a service principal\n // We might get this wrong vs. the previous one for tokens. Nothing to be done\n // about that. It's only for human readable consumption after all.\n statement.Principal = { Service: x.Principal };\n }\n }\n if (x.SourceArn !== undefined) {\n if (statement.Condition === undefined) {\n statement.Condition = {};\n }\n statement.Condition.ArnLike = { 'AWS:SourceArn': x.SourceArn };\n }\n if (x.SourceAccount !== undefined) {\n if (statement.Condition === undefined) {\n statement.Condition = {};\n }\n statement.Condition.StringEquals = { 'AWS:SourceAccount': x.SourceAccount };\n }\n if (x.EventSourceToken !== undefined) {\n if (statement.Condition === undefined) {\n statement.Condition = {};\n }\n statement.Condition.StringEquals = { 'lambda:EventSourceToken': x.EventSourceToken };\n }\n return new Statement(statement);\n}\nexports.parseLambdaPermission = parseLambdaPermission;\n/**\n * Targets for a field\n */\nclass Targets {\n constructor(statement, positiveKey, negativeKey) {\n if (negativeKey in statement) {\n this.values = forceListOfStrings(statement[negativeKey]);\n this.not = true;\n }\n else {\n this.values = forceListOfStrings(statement[positiveKey]);\n this.not = false;\n }\n this.values.sort();\n }\n get empty() {\n return this.values.length === 0;\n }\n /**\n * Whether this set of targets is equal to the other set of targets\n */\n equal(other) {\n return this.not === other.not && deepEqual(this.values.sort(), other.values.sort());\n }\n /**\n * If the current value set is empty, put this in it\n */\n replaceEmpty(replacement) {\n if (this.empty) {\n this.values.push(replacement);\n }\n }\n /**\n * If the actions contains a '*', replace with this string.\n */\n replaceStar(replacement) {\n for (let i = 0; i < this.values.length; i++) {\n if (this.values[i] === '*') {\n this.values[i] = replacement;\n }\n }\n this.values.sort();\n }\n /**\n * Render into a summary table cell\n */\n render() {\n return this.not\n ? this.values.map(s => `NOT ${s}`).join('\\n')\n : this.values.join('\\n');\n }\n /**\n * Return a machine-readable version of the changes.\n * This is only used in tests.\n *\n * @internal\n */\n _toJson() {\n return { not: this.not, values: this.values };\n }\n}\nexports.Targets = Targets;\nvar Effect;\n(function (Effect) {\n Effect[\"Unknown\"] = \"Unknown\";\n Effect[\"Allow\"] = \"Allow\";\n Effect[\"Deny\"] = \"Deny\";\n})(Effect || (exports.Effect = Effect = {}));\nfunction expectString(x) {\n return typeof x === 'string' ? x : undefined;\n}\nfunction expectEffect(x) {\n if (x === Effect.Allow || x === Effect.Deny) {\n return x;\n }\n return Effect.Unknown;\n}\nfunction forceListOfStrings(x) {\n if (typeof x === 'string') {\n return [x];\n }\n if (typeof x === 'undefined' || x === null) {\n return [];\n }\n if (Array.isArray(x)) {\n return x.map(e => forceListOfStrings(e).join(','));\n }\n if (typeof x === 'object' && x !== null) {\n const ret = [];\n for (const [key, value] of Object.entries(x)) {\n ret.push(...forceListOfStrings(value).map(s => `${key}:${s}`));\n }\n return ret;\n }\n return [`${x}`];\n}\n/**\n * Render the Condition column\n */\nfunction renderCondition(condition) {\n if (!condition || Object.keys(condition).length === 0) {\n return '';\n }\n const jsonRepresentation = JSON.stringify(condition, undefined, 2);\n // The JSON representation looks like this:\n //\n // {\n // \"ArnLike\": {\n // \"AWS:SourceArn\": \"${MyTopic86869434}\"\n // }\n // }\n //\n // We can make it more compact without losing information by getting rid of the outermost braces\n // and the indentation.\n const lines = jsonRepresentation.split('\\n');\n return lines.slice(1, lines.length - 1).map(s => s.slice(2)).join('\\n');\n}\nexports.renderCondition = renderCondition;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhdGVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUE0RTtBQUM1RSxrQ0FBOEM7QUFFOUMseUVBQXlFO0FBQ3pFLGlFQUFpRTtBQUNqRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUU3QyxNQUFhLFNBQVM7SUFpQ3BCLFlBQVksU0FBOEI7UUFDeEMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDakMsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7WUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7U0FDdEM7YUFBTTtZQUNMLElBQUksQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBZ0I7UUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUc7ZUFDekIsSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtlQUM1QixJQUFJLENBQUMsbUJBQW1CLEtBQUssS0FBSyxDQUFDLG1CQUFtQjtlQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO2VBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7ZUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztlQUN2QyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRU0sTUFBTTtRQUNYLE9BQU8sSUFBSSxDQUFDLG1CQUFtQjtZQUM3QixDQUFDLENBQUM7Z0JBQ0EsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ2xDLE1BQU0sRUFBRSxFQUFFO2dCQUNWLE1BQU0sRUFBRSxFQUFFO2dCQUNWLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDbkMsU0FBUyxFQUFFLEVBQUU7YUFDZDtZQUNELENBQUMsQ0FBQztnQkFDQSxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO2dCQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ25DLFNBQVMsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUMzQyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksT0FBTztRQUNaLE9BQU8sSUFBSSxDQUFDLG1CQUFtQjtZQUM3QixDQUFDLENBQUMsSUFBQSw0QkFBYSxFQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUN6QyxDQUFDLENBQUMsSUFBQSx1QkFBUSxFQUFDLElBQUEsMEJBQW1CLEVBQUM7Z0JBQzdCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtnQkFDbkMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFO2dCQUNyQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQy9CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUzthQUMxQixDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsbUJBQW1CO1FBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ2hGLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQy9ELENBQUM7Q0FDRjtBQWpIRCw4QkFpSEM7QUF3QkQ7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQUMsQ0FBTTtJQUNwQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7UUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQUU7SUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUFFO0lBQ25DLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBSkQsMENBSUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsQ0FBTTtJQUMxQyw2QkFBNkI7SUFDN0IsTUFBTSxTQUFTLEdBQVE7UUFDckIsTUFBTSxFQUFFLE9BQU87UUFDZixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07UUFDaEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxZQUFZO0tBQ3pCLENBQUM7SUFFRixJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO1FBQzdCLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxHQUFHLEVBQUU7WUFDdkIsSUFBSTtZQUNKLFNBQVMsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1NBQzNCO2FBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN2QyxpQkFBaUI7WUFDakIseURBQXlEO1lBQ3pELFNBQVMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLE9BQU8sRUFBRSxDQUFDO1NBQ25FO2FBQU07WUFDTCxrQ0FBa0M7WUFDbEMsOEVBQThFO1lBQzlFLGtFQUFrRTtZQUNsRSxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNoRDtLQUNGO0lBQ0QsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtRQUM3QixJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQUUsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7U0FBRTtRQUNwRSxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDaEU7SUFDRCxJQUFJLENBQUMsQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFO1FBQ2pDLElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFBRSxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztTQUFFO1FBQ3BFLFNBQVMsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO0tBQzdFO0lBQ0QsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFO1FBQ3BDLElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFBRSxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztTQUFFO1FBQ3BFLFNBQVMsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7S0FDdEY7SUFFRCxPQUFPLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFyQ0Qsc0RBcUNDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLE9BQU87SUFXbEIsWUFBWSxTQUFxQixFQUFFLFdBQW1CLEVBQUUsV0FBbUI7UUFDekUsSUFBSSxXQUFXLElBQUksU0FBUyxFQUFFO1lBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7U0FDakI7YUFBTTtZQUNMLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7U0FDbEI7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBYztRQUN6QixPQUFPLElBQUksQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLFdBQW1CO1FBQ3JDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFDLFdBQW1CO1FBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQzthQUM5QjtTQUNGO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRztZQUNiLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxPQUFPO1FBQ1osT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEQsQ0FBQztDQUNGO0FBeEVELDBCQXdFQztBQUlELElBQVksTUFJWDtBQUpELFdBQVksTUFBTTtJQUNoQiw2QkFBbUIsQ0FBQTtJQUNuQix5QkFBZSxDQUFBO0lBQ2YsdUJBQWEsQ0FBQTtBQUNmLENBQUMsRUFKVyxNQUFNLHNCQUFOLE1BQU0sUUFJakI7QUFFRCxTQUFTLFlBQVksQ0FBQyxDQUFVO0lBQzlCLE9BQU8sT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsQ0FBVTtJQUM5QixJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFO1FBQUUsT0FBTyxDQUFXLENBQUM7S0FBRTtJQUNwRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsQ0FBVTtJQUNwQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUFFO0lBQzFDLElBQUksT0FBTyxDQUFDLEtBQUssV0FBVyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFBRSxPQUFPLEVBQUUsQ0FBQztLQUFFO0lBRTFELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNwQixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUNwRDtJQUVELElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDdkMsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzVDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDaEU7UUFDRCxPQUFPLEdBQUcsQ0FBQztLQUNaO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQUMsU0FBYztJQUM1QyxJQUFJLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUFFLE9BQU8sRUFBRSxDQUFDO0tBQUU7SUFDckUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFbkUsMkNBQTJDO0lBQzNDLEVBQUU7SUFDRixLQUFLO0lBQ0wsa0JBQWtCO0lBQ2xCLDZDQUE2QztJQUM3QyxPQUFPO0lBQ1AsS0FBSztJQUNMLEVBQUU7SUFDRixnR0FBZ0c7SUFDaEcsdUJBQXVCO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBaEJELDBDQWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1heWJlUGFyc2VkLCBta1BhcnNlZCwgbWtVbnBhcnNlYWJsZSB9IGZyb20gJy4uL2RpZmYvbWF5YmUtcGFyc2VkJztcbmltcG9ydCB7IGRlZXBSZW1vdmVVbmRlZmluZWQgfSBmcm9tICcuLi91dGlsJztcblxuLy8gbmFtZXNwYWNlIG9iamVjdCBpbXBvcnRzIHdvbid0IHdvcmsgaW4gdGhlIGJ1bmRsZSBmb3IgZnVuY3Rpb24gZXhwb3J0c1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IGRlZXBFcXVhbCA9IHJlcXVpcmUoJ2Zhc3QtZGVlcC1lcXVhbCcpO1xuXG5leHBvcnQgY2xhc3MgU3RhdGVtZW50IHtcbiAgLyoqXG4gICAqIFN0YXRlbWVudCBJRFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgZWZmZWN0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZWZmZWN0OiBFZmZlY3Q7XG5cbiAgLyoqXG4gICAqIFJlc291cmNlc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlczogVGFyZ2V0cztcblxuICAvKipcbiAgICogUHJpbmNpcGFsc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbHM6IFRhcmdldHM7XG5cbiAgLyoqXG4gICAqIEFjdGlvbnNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhY3Rpb25zOiBUYXJnZXRzO1xuXG4gIC8qKlxuICAgKiBPYmplY3Qgd2l0aCBjb25kaXRpb25zXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZGl0aW9uPzogYW55O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VyaWFsaXplZEludHJpbnNpYzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHN0YXRlbWVudDogVW5rbm93bk1hcCB8IHN0cmluZykge1xuICAgIGlmICh0eXBlb2Ygc3RhdGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5zaWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmVmZmVjdCA9IEVmZmVjdC5Vbmtub3duO1xuICAgICAgdGhpcy5yZXNvdXJjZXMgPSBuZXcgVGFyZ2V0cyh7fSwgJycsICcnKTtcbiAgICAgIHRoaXMuYWN0aW9ucyA9IG5ldyBUYXJnZXRzKHt9LCAnJywgJycpO1xuICAgICAgdGhpcy5wcmluY2lwYWxzID0gbmV3IFRhcmdldHMoe30sICcnLCAnJyk7XG4gICAgICB0aGlzLmNvbmRpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc2VyaWFsaXplZEludHJpbnNpYyA9IHN0YXRlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaWQgPSBleHBlY3RTdHJpbmcoc3RhdGVtZW50LlNpZCk7XG4gICAgICB0aGlzLmVmZmVjdCA9IGV4cGVjdEVmZmVjdChzdGF0ZW1lbnQuRWZmZWN0KTtcbiAgICAgIHRoaXMucmVzb3VyY2VzID0gbmV3IFRhcmdldHMoc3RhdGVtZW50LCAnUmVzb3VyY2UnLCAnTm90UmVzb3VyY2UnKTtcbiAgICAgIHRoaXMuYWN0aW9ucyA9IG5ldyBUYXJnZXRzKHN0YXRlbWVudCwgJ0FjdGlvbicsICdOb3RBY3Rpb24nKTtcbiAgICAgIHRoaXMucHJpbmNpcGFscyA9IG5ldyBUYXJnZXRzKHN0YXRlbWVudCwgJ1ByaW5jaXBhbCcsICdOb3RQcmluY2lwYWwnKTtcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gc3RhdGVtZW50LkNvbmRpdGlvbjtcbiAgICAgIHRoaXMuc2VyaWFsaXplZEludHJpbnNpYyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN0YXRlbWVudCBpcyBlcXVhbCB0byB0aGUgb3RoZXIgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgZXF1YWwob3RoZXI6IFN0YXRlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5zaWQgPT09IG90aGVyLnNpZFxuICAgICAgJiYgdGhpcy5lZmZlY3QgPT09IG90aGVyLmVmZmVjdFxuICAgICAgJiYgdGhpcy5zZXJpYWxpemVkSW50cmluc2ljID09PSBvdGhlci5zZXJpYWxpemVkSW50cmluc2ljXG4gICAgICAmJiB0aGlzLnJlc291cmNlcy5lcXVhbChvdGhlci5yZXNvdXJjZXMpXG4gICAgICAmJiB0aGlzLmFjdGlvbnMuZXF1YWwob3RoZXIuYWN0aW9ucylcbiAgICAgICYmIHRoaXMucHJpbmNpcGFscy5lcXVhbChvdGhlci5wcmluY2lwYWxzKVxuICAgICAgJiYgZGVlcEVxdWFsKHRoaXMuY29uZGl0aW9uLCBvdGhlci5jb25kaXRpb24pKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKTogUmVuZGVyZWRTdGF0ZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZWRJbnRyaW5zaWNcbiAgICAgID8ge1xuICAgICAgICByZXNvdXJjZTogdGhpcy5zZXJpYWxpemVkSW50cmluc2ljLFxuICAgICAgICBlZmZlY3Q6ICcnLFxuICAgICAgICBhY3Rpb246ICcnLFxuICAgICAgICBwcmluY2lwYWw6IHRoaXMucHJpbmNpcGFscy5yZW5kZXIoKSwgLy8gdGhlc2Ugd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgY2FsbCB0byByZXBsYWNlRW1wdHkoKSBmcm9tIElhbUNoYW5nZXNcbiAgICAgICAgY29uZGl0aW9uOiAnJyxcbiAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICByZXNvdXJjZTogdGhpcy5yZXNvdXJjZXMucmVuZGVyKCksXG4gICAgICAgIGVmZmVjdDogdGhpcy5lZmZlY3QsXG4gICAgICAgIGFjdGlvbjogdGhpcy5hY3Rpb25zLnJlbmRlcigpLFxuICAgICAgICBwcmluY2lwYWw6IHRoaXMucHJpbmNpcGFscy5yZW5kZXIoKSxcbiAgICAgICAgY29uZGl0aW9uOiByZW5kZXJDb25kaXRpb24odGhpcy5jb25kaXRpb24pLFxuICAgICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGNoYW5nZXMuXG4gICAqIFRoaXMgaXMgb25seSB1c2VkIGluIHRlc3RzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9Kc29uKCk6IE1heWJlUGFyc2VkPFN0YXRlbWVudEpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVkSW50cmluc2ljXG4gICAgICA/IG1rVW5wYXJzZWFibGUodGhpcy5zZXJpYWxpemVkSW50cmluc2ljKVxuICAgICAgOiBta1BhcnNlZChkZWVwUmVtb3ZlVW5kZWZpbmVkKHtcbiAgICAgICAgc2lkOiB0aGlzLnNpZCxcbiAgICAgICAgZWZmZWN0OiB0aGlzLmVmZmVjdCxcbiAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcy5fdG9Kc29uKCksXG4gICAgICAgIHByaW5jaXBhbHM6IHRoaXMucHJpbmNpcGFscy5fdG9Kc29uKCksXG4gICAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucy5fdG9Kc29uKCksXG4gICAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGlzIGEgbmVnYXRpdmUgc3RhdGVtZW50XG4gICAqXG4gICAqIEEgc3RhdGVtZW50IGlzIG5lZ2F0aXZlIGlmIGFueSBvZiBpdHMgdGFyZ2V0cyBhcmUgbmVnYXRpdmUsIGludmVydGVkXG4gICAqIGlmIHRoZSBFZmZlY3QgaXMgRGVueS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNOZWdhdGl2ZVN0YXRlbWVudCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3RUYXJnZXQgPSB0aGlzLmFjdGlvbnMubm90IHx8IHRoaXMucHJpbmNpcGFscy5ub3QgfHwgdGhpcy5yZXNvdXJjZXMubm90O1xuICAgIHJldHVybiB0aGlzLmVmZmVjdCA9PT0gRWZmZWN0LkFsbG93ID8gbm90VGFyZ2V0IDogIW5vdFRhcmdldDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlcmVkU3RhdGVtZW50IHtcbiAgcmVhZG9ubHkgcmVzb3VyY2U6IHN0cmluZztcbiAgcmVhZG9ubHkgZWZmZWN0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFjdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBwcmluY2lwYWw6IHN0cmluZztcbiAgcmVhZG9ubHkgY29uZGl0aW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50SnNvbiB7XG4gIHNpZD86IHN0cmluZztcbiAgZWZmZWN0OiBzdHJpbmc7XG4gIHJlc291cmNlczogVGFyZ2V0c0pzb247XG4gIGFjdGlvbnM6IFRhcmdldHNKc29uO1xuICBwcmluY2lwYWxzOiBUYXJnZXRzSnNvbjtcbiAgY29uZGl0aW9uPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldHNKc29uIHtcbiAgbm90OiBib29sZWFuO1xuICB2YWx1ZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIGZyb20gdW5kZWZpbmVkLCBhIFN0YXRlbWVudCwgb3IgYSBsaXN0IG9mIHN0YXRlbWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RhdGVtZW50cyh4OiBhbnkpOiBTdGF0ZW1lbnRbXSB7XG4gIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IFtdOyB9XG4gIGlmICghQXJyYXkuaXNBcnJheSh4KSkgeyB4ID0gW3hdOyB9XG4gIHJldHVybiB4Lm1hcCgoczogYW55KSA9PiBuZXcgU3RhdGVtZW50KHMpKTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIFN0YXRlbWVudCBmcm9tIGEgTGFtYmRhOjpQZXJtaXNzaW9uIG9iamVjdFxuICpcbiAqIFRoaXMgaXMgYWN0dWFsbHkgd2hhdCBMYW1iZGEgYWRkcyB0byB0aGUgcG9saWN5IGRvY3VtZW50IGlmIHlvdSBjYWxsIEFkZFBlcm1pc3Npb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxhbWJkYVBlcm1pc3Npb24oeDogYW55KTogU3RhdGVtZW50IHtcbiAgLy8gQ29uc3RydWN0IGEgc3RhdGVtZW50IGZyb21cbiAgY29uc3Qgc3RhdGVtZW50OiBhbnkgPSB7XG4gICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgIEFjdGlvbjogeC5BY3Rpb24sXG4gICAgUmVzb3VyY2U6IHguRnVuY3Rpb25OYW1lLFxuICB9O1xuXG4gIGlmICh4LlByaW5jaXBhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHguUHJpbmNpcGFsID09PSAnKicpIHtcbiAgICAgIC8vICpcbiAgICAgIHN0YXRlbWVudC5QcmluY2lwYWwgPSAnKic7XG4gICAgfSBlbHNlIGlmICgvXlxcZHsxMn0kLy50ZXN0KHguUHJpbmNpcGFsKSkge1xuICAgICAgLy8gQWNjb3VudCBudW1iZXJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXdzLWNkay9uby1saXRlcmFsLXBhcnRpdGlvblxuICAgICAgc3RhdGVtZW50LlByaW5jaXBhbCA9IHsgQVdTOiBgYXJuOmF3czppYW06OiR7eC5QcmluY2lwYWx9OnJvb3RgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFzc3VtZSBpdCdzIGEgc2VydmljZSBwcmluY2lwYWxcbiAgICAgIC8vIFdlIG1pZ2h0IGdldCB0aGlzIHdyb25nIHZzLiB0aGUgcHJldmlvdXMgb25lIGZvciB0b2tlbnMuIE5vdGhpbmcgdG8gYmUgZG9uZVxuICAgICAgLy8gYWJvdXQgdGhhdC4gSXQncyBvbmx5IGZvciBodW1hbiByZWFkYWJsZSBjb25zdW1wdGlvbiBhZnRlciBhbGwuXG4gICAgICBzdGF0ZW1lbnQuUHJpbmNpcGFsID0geyBTZXJ2aWNlOiB4LlByaW5jaXBhbCB9O1xuICAgIH1cbiAgfVxuICBpZiAoeC5Tb3VyY2VBcm4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0ZW1lbnQuQ29uZGl0aW9uID09PSB1bmRlZmluZWQpIHsgc3RhdGVtZW50LkNvbmRpdGlvbiA9IHt9OyB9XG4gICAgc3RhdGVtZW50LkNvbmRpdGlvbi5Bcm5MaWtlID0geyAnQVdTOlNvdXJjZUFybic6IHguU291cmNlQXJuIH07XG4gIH1cbiAgaWYgKHguU291cmNlQWNjb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0YXRlbWVudC5Db25kaXRpb24gPT09IHVuZGVmaW5lZCkgeyBzdGF0ZW1lbnQuQ29uZGl0aW9uID0ge307IH1cbiAgICBzdGF0ZW1lbnQuQ29uZGl0aW9uLlN0cmluZ0VxdWFscyA9IHsgJ0FXUzpTb3VyY2VBY2NvdW50JzogeC5Tb3VyY2VBY2NvdW50IH07XG4gIH1cbiAgaWYgKHguRXZlbnRTb3VyY2VUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0YXRlbWVudC5Db25kaXRpb24gPT09IHVuZGVmaW5lZCkgeyBzdGF0ZW1lbnQuQ29uZGl0aW9uID0ge307IH1cbiAgICBzdGF0ZW1lbnQuQ29uZGl0aW9uLlN0cmluZ0VxdWFscyA9IHsgJ2xhbWJkYTpFdmVudFNvdXJjZVRva2VuJzogeC5FdmVudFNvdXJjZVRva2VuIH07XG4gIH1cblxuICByZXR1cm4gbmV3IFN0YXRlbWVudChzdGF0ZW1lbnQpO1xufVxuXG4vKipcbiAqIFRhcmdldHMgZm9yIGEgZmllbGRcbiAqL1xuZXhwb3J0IGNsYXNzIFRhcmdldHMge1xuICAvKipcbiAgICogVGhlIHZhbHVlcyBvZiB0aGUgdGFyZ2V0c1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUgbWF0Y2hlcnNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBub3Q6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioc3RhdGVtZW50OiBVbmtub3duTWFwLCBwb3NpdGl2ZUtleTogc3RyaW5nLCBuZWdhdGl2ZUtleTogc3RyaW5nKSB7XG4gICAgaWYgKG5lZ2F0aXZlS2V5IGluIHN0YXRlbWVudCkge1xuICAgICAgdGhpcy52YWx1ZXMgPSBmb3JjZUxpc3RPZlN0cmluZ3Moc3RhdGVtZW50W25lZ2F0aXZlS2V5XSk7XG4gICAgICB0aGlzLm5vdCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVzID0gZm9yY2VMaXN0T2ZTdHJpbmdzKHN0YXRlbWVudFtwb3NpdGl2ZUtleV0pO1xuICAgICAgdGhpcy5ub3QgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZXMuc29ydCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBlbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBzZXQgb2YgdGFyZ2V0cyBpcyBlcXVhbCB0byB0aGUgb3RoZXIgc2V0IG9mIHRhcmdldHNcbiAgICovXG4gIHB1YmxpYyBlcXVhbChvdGhlcjogVGFyZ2V0cykge1xuICAgIHJldHVybiB0aGlzLm5vdCA9PT0gb3RoZXIubm90ICYmIGRlZXBFcXVhbCh0aGlzLnZhbHVlcy5zb3J0KCksIG90aGVyLnZhbHVlcy5zb3J0KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBjdXJyZW50IHZhbHVlIHNldCBpcyBlbXB0eSwgcHV0IHRoaXMgaW4gaXRcbiAgICovXG4gIHB1YmxpYyByZXBsYWNlRW1wdHkocmVwbGFjZW1lbnQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmVtcHR5KSB7XG4gICAgICB0aGlzLnZhbHVlcy5wdXNoKHJlcGxhY2VtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGFjdGlvbnMgY29udGFpbnMgYSAnKicsIHJlcGxhY2Ugd2l0aCB0aGlzIHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyByZXBsYWNlU3RhcihyZXBsYWNlbWVudDogc3RyaW5nKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMudmFsdWVzW2ldID09PSAnKicpIHtcbiAgICAgICAgdGhpcy52YWx1ZXNbaV0gPSByZXBsYWNlbWVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWx1ZXMuc29ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBpbnRvIGEgc3VtbWFyeSB0YWJsZSBjZWxsXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubm90XG4gICAgICA/IHRoaXMudmFsdWVzLm1hcChzID0+IGBOT1QgJHtzfWApLmpvaW4oJ1xcbicpXG4gICAgICA6IHRoaXMudmFsdWVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY2hhbmdlcy5cbiAgICogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGVzdHMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0pzb24oKTogVGFyZ2V0c0pzb24ge1xuICAgIHJldHVybiB7IG5vdDogdGhpcy5ub3QsIHZhbHVlczogdGhpcy52YWx1ZXMgfTtcbiAgfVxufVxuXG50eXBlIFVua25vd25NYXAgPSB7W2tleTogc3RyaW5nXTogdW5rbm93bn07XG5cbmV4cG9ydCBlbnVtIEVmZmVjdCB7XG4gIFVua25vd24gPSAnVW5rbm93bicsXG4gIEFsbG93ID0gJ0FsbG93JyxcbiAgRGVueSA9ICdEZW55Jyxcbn1cblxuZnVuY3Rpb24gZXhwZWN0U3RyaW5nKHg6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnID8geCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXhwZWN0RWZmZWN0KHg6IHVua25vd24pOiBFZmZlY3Qge1xuICBpZiAoeCA9PT0gRWZmZWN0LkFsbG93IHx8IHggPT09IEVmZmVjdC5EZW55KSB7IHJldHVybiB4IGFzIEVmZmVjdDsgfVxuICByZXR1cm4gRWZmZWN0LlVua25vd247XG59XG5cbmZ1bmN0aW9uIGZvcmNlTGlzdE9mU3RyaW5ncyh4OiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHggPT09ICdzdHJpbmcnKSB7IHJldHVybiBbeF07IH1cbiAgaWYgKHR5cGVvZiB4ID09PSAndW5kZWZpbmVkJyB8fCB4ID09PSBudWxsKSB7IHJldHVybiBbXTsgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIHgubWFwKGUgPT4gZm9yY2VMaXN0T2ZTdHJpbmdzKGUpLmpvaW4oJywnKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGwpIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoeCkpIHtcbiAgICAgIHJldC5wdXNoKC4uLmZvcmNlTGlzdE9mU3RyaW5ncyh2YWx1ZSkubWFwKHMgPT4gYCR7a2V5fToke3N9YCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcmV0dXJuIFtgJHt4fWBdO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgQ29uZGl0aW9uIGNvbHVtblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29uZGl0aW9uKGNvbmRpdGlvbjogYW55KTogc3RyaW5nIHtcbiAgaWYgKCFjb25kaXRpb24gfHwgT2JqZWN0LmtleXMoY29uZGl0aW9uKS5sZW5ndGggPT09IDApIHsgcmV0dXJuICcnOyB9XG4gIGNvbnN0IGpzb25SZXByZXNlbnRhdGlvbiA9IEpTT04uc3RyaW5naWZ5KGNvbmRpdGlvbiwgdW5kZWZpbmVkLCAyKTtcblxuICAvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBsb29rcyBsaWtlIHRoaXM6XG4gIC8vXG4gIC8vICB7XG4gIC8vICAgIFwiQXJuTGlrZVwiOiB7XG4gIC8vICAgICAgXCJBV1M6U291cmNlQXJuXCI6IFwiJHtNeVRvcGljODY4Njk0MzR9XCJcbiAgLy8gICAgfVxuICAvLyAgfVxuICAvL1xuICAvLyBXZSBjYW4gbWFrZSBpdCBtb3JlIGNvbXBhY3Qgd2l0aG91dCBsb3NpbmcgaW5mb3JtYXRpb24gYnkgZ2V0dGluZyByaWQgb2YgdGhlIG91dGVybW9zdCBicmFjZXNcbiAgLy8gYW5kIHRoZSBpbmRlbnRhdGlvbi5cbiAgY29uc3QgbGluZXMgPSBqc29uUmVwcmVzZW50YXRpb24uc3BsaXQoJ1xcbicpO1xuICByZXR1cm4gbGluZXMuc2xpY2UoMSwgbGluZXMubGVuZ3RoIC0gMSkubWFwKHMgPT4gcy5zbGljZSgyKSkuam9pbignXFxuJyk7XG59XG4iXX0=","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mangleLikeCloudFormation = exports.deepEqual = void 0;\n__exportStar(require(\"./diff-template\"), exports);\n__exportStar(require(\"./format\"), exports);\n__exportStar(require(\"./format-table\"), exports);\nvar util_1 = require(\"./diff/util\");\nObject.defineProperty(exports, \"deepEqual\", { enumerable: true, get: function () { return util_1.deepEqual; } });\nObject.defineProperty(exports, \"mangleLikeCloudFormation\", { enumerable: true, get: function () { return util_1.mangleLikeCloudFormation; } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUFnQztBQUNoQywyQ0FBeUI7QUFDekIsaURBQStCO0FBQy9CLG9DQUFrRTtBQUF6RCxpR0FBQSxTQUFTLE9BQUE7QUFBRSxnSEFBQSx3QkFBd0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGlmZi10ZW1wbGF0ZSc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdCc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdC10YWJsZSc7XG5leHBvcnQgeyBkZWVwRXF1YWwsIG1hbmdsZUxpa2VDbG91ZEZvcm1hdGlvbiB9IGZyb20gJy4vZGlmZi91dGlsJztcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SecurityGroupChanges = void 0;\nconst chalk = require(\"chalk\");\nconst security_group_rule_1 = require(\"./security-group-rule\");\nconst diffable_1 = require(\"../diffable\");\nconst render_intrinsics_1 = require(\"../render-intrinsics\");\nconst util_1 = require(\"../util\");\n/**\n * Changes to IAM statements\n */\nclass SecurityGroupChanges {\n constructor(props) {\n this.ingress = new diffable_1.DiffableCollection();\n this.egress = new diffable_1.DiffableCollection();\n // Group rules\n for (const ingressProp of props.ingressRulePropertyChanges) {\n this.ingress.addOld(...this.readInlineRules(ingressProp.oldValue, ingressProp.resourceLogicalId));\n this.ingress.addNew(...this.readInlineRules(ingressProp.newValue, ingressProp.resourceLogicalId));\n }\n for (const egressProp of props.egressRulePropertyChanges) {\n this.egress.addOld(...this.readInlineRules(egressProp.oldValue, egressProp.resourceLogicalId));\n this.egress.addNew(...this.readInlineRules(egressProp.newValue, egressProp.resourceLogicalId));\n }\n // Rule resources\n for (const ingressRes of props.ingressRuleResourceChanges) {\n this.ingress.addOld(...this.readRuleResource(ingressRes.oldProperties));\n this.ingress.addNew(...this.readRuleResource(ingressRes.newProperties));\n }\n for (const egressRes of props.egressRuleResourceChanges) {\n this.egress.addOld(...this.readRuleResource(egressRes.oldProperties));\n this.egress.addNew(...this.readRuleResource(egressRes.newProperties));\n }\n this.ingress.calculateDiff();\n this.egress.calculateDiff();\n }\n get hasChanges() {\n return this.ingress.hasChanges || this.egress.hasChanges;\n }\n /**\n * Return a summary table of changes\n */\n summarize() {\n const ret = [];\n const header = ['', 'Group', 'Dir', 'Protocol', 'Peer'];\n const inWord = 'In';\n const outWord = 'Out';\n // Render a single rule to the table (curried function so we can map it across rules easily--thank you JavaScript!)\n const renderRule = (plusMin, inOut) => (rule) => [\n plusMin,\n rule.groupId,\n inOut,\n rule.describeProtocol(),\n rule.describePeer(),\n ].map(s => plusMin === '+' ? chalk.green(s) : chalk.red(s));\n // First generate all lines, sort later\n ret.push(...this.ingress.additions.map(renderRule('+', inWord)));\n ret.push(...this.egress.additions.map(renderRule('+', outWord)));\n ret.push(...this.ingress.removals.map(renderRule('-', inWord)));\n ret.push(...this.egress.removals.map(renderRule('-', outWord)));\n // Sort by group name then ingress/egress (ingress first)\n ret.sort((0, util_1.makeComparator)((row) => [row[1], row[2].indexOf(inWord) > -1 ? 0 : 1]));\n ret.splice(0, 0, header);\n return ret;\n }\n toJson() {\n return (0, util_1.deepRemoveUndefined)({\n ingressRuleAdditions: (0, util_1.dropIfEmpty)(this.ingress.additions.map(s => s.toJson())),\n ingressRuleRemovals: (0, util_1.dropIfEmpty)(this.ingress.removals.map(s => s.toJson())),\n egressRuleAdditions: (0, util_1.dropIfEmpty)(this.egress.additions.map(s => s.toJson())),\n egressRuleRemovals: (0, util_1.dropIfEmpty)(this.egress.removals.map(s => s.toJson())),\n });\n }\n get rulesAdded() {\n return this.ingress.hasAdditions\n || this.egress.hasAdditions;\n }\n readInlineRules(rules, logicalId) {\n if (!rules || !Array.isArray(rules)) {\n return [];\n }\n // UnCloudFormation so the parser works in an easier domain\n const ref = '${' + logicalId + '.GroupId}';\n return rules.flatMap((r) => {\n const rendered = (0, render_intrinsics_1.renderIntrinsics)(r);\n // SecurityGroupRule is not robust against unparsed objects\n return typeof rendered === 'object' ? [new security_group_rule_1.SecurityGroupRule(rendered, ref)] : [];\n });\n }\n readRuleResource(resource) {\n if (!resource) {\n return [];\n }\n // UnCloudFormation so the parser works in an easier domain\n return [new security_group_rule_1.SecurityGroupRule((0, render_intrinsics_1.renderIntrinsics)(resource))];\n }\n}\nexports.SecurityGroupChanges = SecurityGroupChanges;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktZ3JvdXAtY2hhbmdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlY3VyaXR5LWdyb3VwLWNoYW5nZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQy9CLCtEQUFvRTtBQUVwRSwwQ0FBaUQ7QUFDakQsNERBQXdEO0FBQ3hELGtDQUEyRTtBQVMzRTs7R0FFRztBQUNILE1BQWEsb0JBQW9CO0lBSS9CLFlBQVksS0FBZ0M7UUFINUIsWUFBTyxHQUFHLElBQUksNkJBQWtCLEVBQXFCLENBQUM7UUFDdEQsV0FBTSxHQUFHLElBQUksNkJBQWtCLEVBQXFCLENBQUM7UUFHbkUsY0FBYztRQUNkLEtBQUssTUFBTSxXQUFXLElBQUksS0FBSyxDQUFDLDBCQUEwQixFQUFFO1lBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDbEcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztTQUNuRztRQUNELEtBQUssTUFBTSxVQUFVLElBQUksS0FBSyxDQUFDLHlCQUF5QixFQUFFO1lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDL0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztTQUNoRztRQUVELGlCQUFpQjtRQUNqQixLQUFLLE1BQU0sVUFBVSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsRUFBRTtZQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztTQUN6RTtRQUNELEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxDQUFDLHlCQUF5QixFQUFFO1lBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ2QsTUFBTSxHQUFHLEdBQWUsRUFBRSxDQUFDO1FBRTNCLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXhELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQztRQUNwQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFdEIsbUhBQW1IO1FBQ25ILE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBZSxFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUF1QixFQUFFLEVBQUUsQ0FBQztZQUNsRixPQUFPO1lBQ1AsSUFBSSxDQUFDLE9BQU87WUFDWixLQUFLO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUU7U0FDcEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUQsdUNBQXVDO1FBQ3ZDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEUseURBQXlEO1FBQ3pELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSxxQkFBYyxFQUFDLENBQUMsR0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFekIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sTUFBTTtRQUNYLE9BQU8sSUFBQSwwQkFBbUIsRUFBQztZQUN6QixvQkFBb0IsRUFBRSxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDOUUsbUJBQW1CLEVBQUUsSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzVFLG1CQUFtQixFQUFFLElBQUEsa0JBQVcsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUM1RSxrQkFBa0IsRUFBRSxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDM0UsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWTtlQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUNsQyxDQUFDO0lBRU8sZUFBZSxDQUFDLEtBQVUsRUFBRSxTQUFpQjtRQUNuRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFbkQsMkRBQTJEO1FBRTNELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzNDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUEsb0NBQWdCLEVBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsMkRBQTJEO1lBQzNELE9BQU8sT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksdUNBQWlCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxRQUFhO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBRTdCLDJEQUEyRDtRQUUzRCxPQUFPLENBQUMsSUFBSSx1Q0FBaUIsQ0FBQyxJQUFBLG9DQUFnQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUFyR0Qsb0RBcUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgUnVsZUpzb24sIFNlY3VyaXR5R3JvdXBSdWxlIH0gZnJvbSAnLi9zZWN1cml0eS1ncm91cC1ydWxlJztcbmltcG9ydCB7IFByb3BlcnR5Q2hhbmdlLCBSZXNvdXJjZUNoYW5nZSB9IGZyb20gJy4uL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgRGlmZmFibGVDb2xsZWN0aW9uIH0gZnJvbSAnLi4vZGlmZmFibGUnO1xuaW1wb3J0IHsgcmVuZGVySW50cmluc2ljcyB9IGZyb20gJy4uL3JlbmRlci1pbnRyaW5zaWNzJztcbmltcG9ydCB7IGRlZXBSZW1vdmVVbmRlZmluZWQsIGRyb3BJZkVtcHR5LCBtYWtlQ29tcGFyYXRvciB9IGZyb20gJy4uL3V0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5R3JvdXBDaGFuZ2VzUHJvcHMge1xuICBpbmdyZXNzUnVsZVByb3BlcnR5Q2hhbmdlczogUHJvcGVydHlDaGFuZ2VbXTtcbiAgaW5ncmVzc1J1bGVSZXNvdXJjZUNoYW5nZXM6IFJlc291cmNlQ2hhbmdlW107XG4gIGVncmVzc1J1bGVSZXNvdXJjZUNoYW5nZXM6IFJlc291cmNlQ2hhbmdlW107XG4gIGVncmVzc1J1bGVQcm9wZXJ0eUNoYW5nZXM6IFByb3BlcnR5Q2hhbmdlW107XG59XG5cbi8qKlxuICogQ2hhbmdlcyB0byBJQU0gc3RhdGVtZW50c1xuICovXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlHcm91cENoYW5nZXMge1xuICBwdWJsaWMgcmVhZG9ubHkgaW5ncmVzcyA9IG5ldyBEaWZmYWJsZUNvbGxlY3Rpb248U2VjdXJpdHlHcm91cFJ1bGU+KCk7XG4gIHB1YmxpYyByZWFkb25seSBlZ3Jlc3MgPSBuZXcgRGlmZmFibGVDb2xsZWN0aW9uPFNlY3VyaXR5R3JvdXBSdWxlPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTZWN1cml0eUdyb3VwQ2hhbmdlc1Byb3BzKSB7XG4gICAgLy8gR3JvdXAgcnVsZXNcbiAgICBmb3IgKGNvbnN0IGluZ3Jlc3NQcm9wIG9mIHByb3BzLmluZ3Jlc3NSdWxlUHJvcGVydHlDaGFuZ2VzKSB7XG4gICAgICB0aGlzLmluZ3Jlc3MuYWRkT2xkKC4uLnRoaXMucmVhZElubGluZVJ1bGVzKGluZ3Jlc3NQcm9wLm9sZFZhbHVlLCBpbmdyZXNzUHJvcC5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgdGhpcy5pbmdyZXNzLmFkZE5ldyguLi50aGlzLnJlYWRJbmxpbmVSdWxlcyhpbmdyZXNzUHJvcC5uZXdWYWx1ZSwgaW5ncmVzc1Byb3AucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZ3Jlc3NQcm9wIG9mIHByb3BzLmVncmVzc1J1bGVQcm9wZXJ0eUNoYW5nZXMpIHtcbiAgICAgIHRoaXMuZWdyZXNzLmFkZE9sZCguLi50aGlzLnJlYWRJbmxpbmVSdWxlcyhlZ3Jlc3NQcm9wLm9sZFZhbHVlLCBlZ3Jlc3NQcm9wLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICB0aGlzLmVncmVzcy5hZGROZXcoLi4udGhpcy5yZWFkSW5saW5lUnVsZXMoZWdyZXNzUHJvcC5uZXdWYWx1ZSwgZWdyZXNzUHJvcC5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgIH1cblxuICAgIC8vIFJ1bGUgcmVzb3VyY2VzXG4gICAgZm9yIChjb25zdCBpbmdyZXNzUmVzIG9mIHByb3BzLmluZ3Jlc3NSdWxlUmVzb3VyY2VDaGFuZ2VzKSB7XG4gICAgICB0aGlzLmluZ3Jlc3MuYWRkT2xkKC4uLnRoaXMucmVhZFJ1bGVSZXNvdXJjZShpbmdyZXNzUmVzLm9sZFByb3BlcnRpZXMpKTtcbiAgICAgIHRoaXMuaW5ncmVzcy5hZGROZXcoLi4udGhpcy5yZWFkUnVsZVJlc291cmNlKGluZ3Jlc3NSZXMubmV3UHJvcGVydGllcykpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVncmVzc1JlcyBvZiBwcm9wcy5lZ3Jlc3NSdWxlUmVzb3VyY2VDaGFuZ2VzKSB7XG4gICAgICB0aGlzLmVncmVzcy5hZGRPbGQoLi4udGhpcy5yZWFkUnVsZVJlc291cmNlKGVncmVzc1Jlcy5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICB0aGlzLmVncmVzcy5hZGROZXcoLi4udGhpcy5yZWFkUnVsZVJlc291cmNlKGVncmVzc1Jlcy5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgfVxuXG4gICAgdGhpcy5pbmdyZXNzLmNhbGN1bGF0ZURpZmYoKTtcbiAgICB0aGlzLmVncmVzcy5jYWxjdWxhdGVEaWZmKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5ncmVzcy5oYXNDaGFuZ2VzIHx8IHRoaXMuZWdyZXNzLmhhc0NoYW5nZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3VtbWFyeSB0YWJsZSBvZiBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgc3VtbWFyaXplKCk6IHN0cmluZ1tdW10ge1xuICAgIGNvbnN0IHJldDogc3RyaW5nW11bXSA9IFtdO1xuXG4gICAgY29uc3QgaGVhZGVyID0gWycnLCAnR3JvdXAnLCAnRGlyJywgJ1Byb3RvY29sJywgJ1BlZXInXTtcblxuICAgIGNvbnN0IGluV29yZCA9ICdJbic7XG4gICAgY29uc3Qgb3V0V29yZCA9ICdPdXQnO1xuXG4gICAgLy8gUmVuZGVyIGEgc2luZ2xlIHJ1bGUgdG8gdGhlIHRhYmxlIChjdXJyaWVkIGZ1bmN0aW9uIHNvIHdlIGNhbiBtYXAgaXQgYWNyb3NzIHJ1bGVzIGVhc2lseS0tdGhhbmsgeW91IEphdmFTY3JpcHQhKVxuICAgIGNvbnN0IHJlbmRlclJ1bGUgPSAocGx1c01pbjogc3RyaW5nLCBpbk91dDogc3RyaW5nKSA9PiAocnVsZTogU2VjdXJpdHlHcm91cFJ1bGUpID0+IFtcbiAgICAgIHBsdXNNaW4sXG4gICAgICBydWxlLmdyb3VwSWQsXG4gICAgICBpbk91dCxcbiAgICAgIHJ1bGUuZGVzY3JpYmVQcm90b2NvbCgpLFxuICAgICAgcnVsZS5kZXNjcmliZVBlZXIoKSxcbiAgICBdLm1hcChzID0+IHBsdXNNaW4gPT09ICcrJyA/IGNoYWxrLmdyZWVuKHMpIDogY2hhbGsucmVkKHMpKTtcblxuICAgIC8vIEZpcnN0IGdlbmVyYXRlIGFsbCBsaW5lcywgc29ydCBsYXRlclxuICAgIHJldC5wdXNoKC4uLnRoaXMuaW5ncmVzcy5hZGRpdGlvbnMubWFwKHJlbmRlclJ1bGUoJysnLCBpbldvcmQpKSk7XG4gICAgcmV0LnB1c2goLi4udGhpcy5lZ3Jlc3MuYWRkaXRpb25zLm1hcChyZW5kZXJSdWxlKCcrJywgb3V0V29yZCkpKTtcbiAgICByZXQucHVzaCguLi50aGlzLmluZ3Jlc3MucmVtb3ZhbHMubWFwKHJlbmRlclJ1bGUoJy0nLCBpbldvcmQpKSk7XG4gICAgcmV0LnB1c2goLi4udGhpcy5lZ3Jlc3MucmVtb3ZhbHMubWFwKHJlbmRlclJ1bGUoJy0nLCBvdXRXb3JkKSkpO1xuXG4gICAgLy8gU29ydCBieSBncm91cCBuYW1lIHRoZW4gaW5ncmVzcy9lZ3Jlc3MgKGluZ3Jlc3MgZmlyc3QpXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV0sIHJvd1syXS5pbmRleE9mKGluV29yZCkgPiAtMSA/IDAgOiAxXSkpO1xuXG4gICAgcmV0LnNwbGljZSgwLCAwLCBoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyB0b0pzb24oKTogU2VjdXJpdHlHcm91cENoYW5nZXNKc29uIHtcbiAgICByZXR1cm4gZGVlcFJlbW92ZVVuZGVmaW5lZCh7XG4gICAgICBpbmdyZXNzUnVsZUFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5pbmdyZXNzLmFkZGl0aW9ucy5tYXAocyA9PiBzLnRvSnNvbigpKSksXG4gICAgICBpbmdyZXNzUnVsZVJlbW92YWxzOiBkcm9wSWZFbXB0eSh0aGlzLmluZ3Jlc3MucmVtb3ZhbHMubWFwKHMgPT4gcy50b0pzb24oKSkpLFxuICAgICAgZWdyZXNzUnVsZUFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5lZ3Jlc3MuYWRkaXRpb25zLm1hcChzID0+IHMudG9Kc29uKCkpKSxcbiAgICAgIGVncmVzc1J1bGVSZW1vdmFsczogZHJvcElmRW1wdHkodGhpcy5lZ3Jlc3MucmVtb3ZhbHMubWFwKHMgPT4gcy50b0pzb24oKSkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBydWxlc0FkZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluZ3Jlc3MuaGFzQWRkaXRpb25zXG4gICAgICAgIHx8IHRoaXMuZWdyZXNzLmhhc0FkZGl0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgcmVhZElubGluZVJ1bGVzKHJ1bGVzOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU2VjdXJpdHlHcm91cFJ1bGVbXSB7XG4gICAgaWYgKCFydWxlcyB8fCAhQXJyYXkuaXNBcnJheShydWxlcykpIHsgcmV0dXJuIFtdOyB9XG5cbiAgICAvLyBVbkNsb3VkRm9ybWF0aW9uIHNvIHRoZSBwYXJzZXIgd29ya3MgaW4gYW4gZWFzaWVyIGRvbWFpblxuXG4gICAgY29uc3QgcmVmID0gJyR7JyArIGxvZ2ljYWxJZCArICcuR3JvdXBJZH0nO1xuICAgIHJldHVybiBydWxlcy5mbGF0TWFwKChyOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gcmVuZGVySW50cmluc2ljcyhyKTtcbiAgICAgIC8vIFNlY3VyaXR5R3JvdXBSdWxlIGlzIG5vdCByb2J1c3QgYWdhaW5zdCB1bnBhcnNlZCBvYmplY3RzXG4gICAgICByZXR1cm4gdHlwZW9mIHJlbmRlcmVkID09PSAnb2JqZWN0JyA/IFtuZXcgU2VjdXJpdHlHcm91cFJ1bGUocmVuZGVyZWQsIHJlZildIDogW107XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRSdWxlUmVzb3VyY2UocmVzb3VyY2U6IGFueSk6IFNlY3VyaXR5R3JvdXBSdWxlW10ge1xuICAgIGlmICghcmVzb3VyY2UpIHsgcmV0dXJuIFtdOyB9XG5cbiAgICAvLyBVbkNsb3VkRm9ybWF0aW9uIHNvIHRoZSBwYXJzZXIgd29ya3MgaW4gYW4gZWFzaWVyIGRvbWFpblxuXG4gICAgcmV0dXJuIFtuZXcgU2VjdXJpdHlHcm91cFJ1bGUocmVuZGVySW50cmluc2ljcyhyZXNvdXJjZSkpXTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5R3JvdXBDaGFuZ2VzSnNvbiB7XG4gIGluZ3Jlc3NSdWxlQWRkaXRpb25zPzogUnVsZUpzb25bXTtcbiAgaW5ncmVzc1J1bGVSZW1vdmFscz86IFJ1bGVKc29uW107XG4gIGVncmVzc1J1bGVBZGRpdGlvbnM/OiBSdWxlSnNvbltdO1xuICBlZ3Jlc3NSdWxlUmVtb3ZhbHM/OiBSdWxlSnNvbltdO1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SecurityGroupRule = void 0;\n/**\n * A single security group rule, either egress or ingress\n */\nclass SecurityGroupRule {\n constructor(ruleObject, groupRef) {\n this.ipProtocol = ruleObject.IpProtocol || '*unknown*';\n this.fromPort = ruleObject.FromPort;\n this.toPort = ruleObject.ToPort;\n this.groupId = ruleObject.GroupId || groupRef || '*unknown*'; // In case of an inline rule\n this.peer =\n findFirst(ruleObject, ['CidrIp', 'CidrIpv6'], (ip) => ({ kind: 'cidr-ip', ip }))\n ||\n findFirst(ruleObject, ['DestinationSecurityGroupId', 'SourceSecurityGroupId'], (securityGroupId) => ({ kind: 'security-group', securityGroupId }))\n ||\n findFirst(ruleObject, ['DestinationPrefixListId', 'SourcePrefixListId'], (prefixListId) => ({ kind: 'prefix-list', prefixListId }));\n }\n equal(other) {\n return this.ipProtocol === other.ipProtocol\n && this.fromPort === other.fromPort\n && this.toPort === other.toPort\n && peerEqual(this.peer, other.peer);\n }\n describeProtocol() {\n if (this.ipProtocol === '-1') {\n return 'Everything';\n }\n const ipProtocol = this.ipProtocol.toUpperCase();\n if (this.fromPort === -1) {\n return `All ${ipProtocol}`;\n }\n if (this.fromPort === this.toPort) {\n return `${ipProtocol} ${this.fromPort}`;\n }\n return `${ipProtocol} ${this.fromPort}-${this.toPort}`;\n }\n describePeer() {\n if (this.peer) {\n switch (this.peer.kind) {\n case 'cidr-ip':\n if (this.peer.ip === '0.0.0.0/0') {\n return 'Everyone (IPv4)';\n }\n if (this.peer.ip === '::/0') {\n return 'Everyone (IPv6)';\n }\n return `${this.peer.ip}`;\n case 'prefix-list': return `${this.peer.prefixListId}`;\n case 'security-group': return `${this.peer.securityGroupId}`;\n }\n }\n return '?';\n }\n toJson() {\n return {\n groupId: this.groupId,\n ipProtocol: this.ipProtocol,\n fromPort: this.fromPort,\n toPort: this.toPort,\n peer: this.peer,\n };\n }\n}\nexports.SecurityGroupRule = SecurityGroupRule;\nfunction peerEqual(a, b) {\n if ((a === undefined) !== (b === undefined)) {\n return false;\n }\n if (a === undefined) {\n return true;\n }\n if (a.kind !== b.kind) {\n return false;\n }\n switch (a.kind) {\n case 'cidr-ip': return a.ip === b.ip;\n case 'security-group': return a.securityGroupId === b.securityGroupId;\n case 'prefix-list': return a.prefixListId === b.prefixListId;\n }\n}\nfunction findFirst(obj, keys, fn) {\n for (const key of keys) {\n try {\n if (key in obj) {\n return fn(obj[key]);\n }\n }\n catch (e) {\n debugger;\n }\n }\n return undefined;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktZ3JvdXAtcnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlY3VyaXR5LWdyb3VwLXJ1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQTBCNUIsWUFBWSxVQUFlLEVBQUUsUUFBaUI7UUFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxJQUFJLFdBQVcsQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSxRQUFRLElBQUksV0FBVyxDQUFDLENBQUMsNEJBQTRCO1FBRTFGLElBQUksQ0FBQyxJQUFJO1lBQ0wsU0FBUyxDQUFDLFVBQVUsRUFDbEIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQ3RCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQWlCLENBQUEsQ0FBQzs7b0JBRWxELFNBQVMsQ0FBQyxVQUFVLEVBQ2xCLENBQUMsNEJBQTRCLEVBQUUsdUJBQXVCLENBQUMsRUFDdkQsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUF3QixDQUFBLENBQUM7O29CQUUxRixTQUFTLENBQUMsVUFBVSxFQUNsQixDQUFDLHlCQUF5QixFQUFFLG9CQUFvQixDQUFDLEVBQ2pELENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQXFCLENBQUEsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBd0I7UUFDbkMsT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxVQUFVO2VBQ3BDLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLFFBQVE7ZUFDaEMsSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtlQUM1QixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQUUsT0FBTyxZQUFZLENBQUM7U0FBRTtRQUV0RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWpELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUFFLE9BQU8sT0FBTyxVQUFVLEVBQUUsQ0FBQztTQUFFO1FBQ3pELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQUUsT0FBTyxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FBRTtRQUMvRSxPQUFPLEdBQUcsVUFBVSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFTSxZQUFZO1FBQ2pCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3RCLEtBQUssU0FBUztvQkFDWixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFdBQVcsRUFBRTt3QkFBRSxPQUFPLGlCQUFpQixDQUFDO3FCQUFFO29CQUMvRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLE1BQU0sRUFBRTt3QkFBRSxPQUFPLGlCQUFpQixDQUFDO3FCQUFFO29CQUMxRCxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDM0IsS0FBSyxhQUFhLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdkQsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQzlEO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxNQUFNO1FBQ1gsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDaEIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXZGRCw4Q0F1RkM7QUFtQkQsU0FBUyxTQUFTLENBQUMsQ0FBWSxFQUFFLENBQVk7SUFDM0MsSUFBSSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0tBQUU7SUFDOUQsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUM7S0FBRTtJQUVyQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBRSxDQUFDLElBQUksRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0tBQUU7SUFDekMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFO1FBQ2QsS0FBSyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQU0sQ0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxLQUFLLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxLQUFNLENBQWMsQ0FBQyxlQUFlLENBQUM7UUFDcEYsS0FBSyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEtBQU0sQ0FBYyxDQUFDLFlBQVksQ0FBQztLQUM1RTtBQUNILENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBSSxHQUFRLEVBQUUsSUFBYyxFQUFFLEVBQW9CO0lBQ2xFLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3RCLElBQUk7WUFDRixJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7Z0JBQ2QsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDckI7U0FDRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsUUFBUSxDQUFDO1NBQ1Y7S0FDRjtJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc2luZ2xlIHNlY3VyaXR5IGdyb3VwIHJ1bGUsIGVpdGhlciBlZ3Jlc3Mgb3IgaW5ncmVzc1xuICovXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlHcm91cFJ1bGUge1xuICAvKipcbiAgICogR3JvdXAgSUQgb2YgdGhlIGdyb3VwIHRoaXMgcnVsZSBhcHBsaWVzIHRvXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JvdXBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJUCBwcm90b2NvbCB0aGlzIHJ1bGUgYXBwbGllcyB0b1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwUHJvdG9jb2w6IHN0cmluZztcblxuICAvKipcbiAgICogU3RhcnQgb2YgcG9ydCByYW5nZSB0aGlzIHJ1bGUgYXBwbGllcyB0bywgb3IgSUNNUCB0eXBlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZnJvbVBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEVuZCBvZiBwb3J0IHJhbmdlIHRoaXMgcnVsZSBhcHBsaWVzIHRvLCBvciBJQ01QIGNvZGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0b1BvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFBlZXIgb2YgdGhpcyBydWxlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGVlcj86IFJ1bGVQZWVyO1xuXG4gIGNvbnN0cnVjdG9yKHJ1bGVPYmplY3Q6IGFueSwgZ3JvdXBSZWY/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmlwUHJvdG9jb2wgPSBydWxlT2JqZWN0LklwUHJvdG9jb2wgfHwgJyp1bmtub3duKic7XG4gICAgdGhpcy5mcm9tUG9ydCA9IHJ1bGVPYmplY3QuRnJvbVBvcnQ7XG4gICAgdGhpcy50b1BvcnQgPSBydWxlT2JqZWN0LlRvUG9ydDtcbiAgICB0aGlzLmdyb3VwSWQgPSBydWxlT2JqZWN0Lkdyb3VwSWQgfHwgZ3JvdXBSZWYgfHwgJyp1bmtub3duKic7IC8vIEluIGNhc2Ugb2YgYW4gaW5saW5lIHJ1bGVcblxuICAgIHRoaXMucGVlciA9XG4gICAgICAgIGZpbmRGaXJzdChydWxlT2JqZWN0LFxuICAgICAgICAgIFsnQ2lkcklwJywgJ0NpZHJJcHY2J10sXG4gICAgICAgICAgKGlwKSA9PiAoeyBraW5kOiAnY2lkci1pcCcsIGlwIH0gYXMgQ2lkcklwUGVlcikpXG4gICAgICAgIHx8XG4gICAgICAgIGZpbmRGaXJzdChydWxlT2JqZWN0LFxuICAgICAgICAgIFsnRGVzdGluYXRpb25TZWN1cml0eUdyb3VwSWQnLCAnU291cmNlU2VjdXJpdHlHcm91cElkJ10sXG4gICAgICAgICAgKHNlY3VyaXR5R3JvdXBJZCkgPT4gKHsga2luZDogJ3NlY3VyaXR5LWdyb3VwJywgc2VjdXJpdHlHcm91cElkIH0gYXMgU2VjdXJpdHlHcm91cFBlZXIpKVxuICAgICAgICB8fFxuICAgICAgICBmaW5kRmlyc3QocnVsZU9iamVjdCxcbiAgICAgICAgICBbJ0Rlc3RpbmF0aW9uUHJlZml4TGlzdElkJywgJ1NvdXJjZVByZWZpeExpc3RJZCddLFxuICAgICAgICAgIChwcmVmaXhMaXN0SWQpID0+ICh7IGtpbmQ6ICdwcmVmaXgtbGlzdCcsIHByZWZpeExpc3RJZCB9IGFzIFByZWZpeExpc3RQZWVyKSk7XG4gIH1cblxuICBwdWJsaWMgZXF1YWwob3RoZXI6IFNlY3VyaXR5R3JvdXBSdWxlKSB7XG4gICAgcmV0dXJuIHRoaXMuaXBQcm90b2NvbCA9PT0gb3RoZXIuaXBQcm90b2NvbFxuICAgICAgICAmJiB0aGlzLmZyb21Qb3J0ID09PSBvdGhlci5mcm9tUG9ydFxuICAgICAgICAmJiB0aGlzLnRvUG9ydCA9PT0gb3RoZXIudG9Qb3J0XG4gICAgICAgICYmIHBlZXJFcXVhbCh0aGlzLnBlZXIsIG90aGVyLnBlZXIpO1xuICB9XG5cbiAgcHVibGljIGRlc2NyaWJlUHJvdG9jb2woKSB7XG4gICAgaWYgKHRoaXMuaXBQcm90b2NvbCA9PT0gJy0xJykgeyByZXR1cm4gJ0V2ZXJ5dGhpbmcnOyB9XG5cbiAgICBjb25zdCBpcFByb3RvY29sID0gdGhpcy5pcFByb3RvY29sLnRvVXBwZXJDYXNlKCk7XG5cbiAgICBpZiAodGhpcy5mcm9tUG9ydCA9PT0gLTEpIHsgcmV0dXJuIGBBbGwgJHtpcFByb3RvY29sfWA7IH1cbiAgICBpZiAodGhpcy5mcm9tUG9ydCA9PT0gdGhpcy50b1BvcnQpIHsgcmV0dXJuIGAke2lwUHJvdG9jb2x9ICR7dGhpcy5mcm9tUG9ydH1gOyB9XG4gICAgcmV0dXJuIGAke2lwUHJvdG9jb2x9ICR7dGhpcy5mcm9tUG9ydH0tJHt0aGlzLnRvUG9ydH1gO1xuICB9XG5cbiAgcHVibGljIGRlc2NyaWJlUGVlcigpIHtcbiAgICBpZiAodGhpcy5wZWVyKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMucGVlci5raW5kKSB7XG4gICAgICAgIGNhc2UgJ2NpZHItaXAnOlxuICAgICAgICAgIGlmICh0aGlzLnBlZXIuaXAgPT09ICcwLjAuMC4wLzAnKSB7IHJldHVybiAnRXZlcnlvbmUgKElQdjQpJzsgfVxuICAgICAgICAgIGlmICh0aGlzLnBlZXIuaXAgPT09ICc6Oi8wJykgeyByZXR1cm4gJ0V2ZXJ5b25lIChJUHY2KSc7IH1cbiAgICAgICAgICByZXR1cm4gYCR7dGhpcy5wZWVyLmlwfWA7XG4gICAgICAgIGNhc2UgJ3ByZWZpeC1saXN0JzogcmV0dXJuIGAke3RoaXMucGVlci5wcmVmaXhMaXN0SWR9YDtcbiAgICAgICAgY2FzZSAnc2VjdXJpdHktZ3JvdXAnOiByZXR1cm4gYCR7dGhpcy5wZWVyLnNlY3VyaXR5R3JvdXBJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnPyc7XG4gIH1cblxuICBwdWJsaWMgdG9Kc29uKCk6IFJ1bGVKc29uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ3JvdXBJZDogdGhpcy5ncm91cElkLFxuICAgICAgaXBQcm90b2NvbDogdGhpcy5pcFByb3RvY29sLFxuICAgICAgZnJvbVBvcnQ6IHRoaXMuZnJvbVBvcnQsXG4gICAgICB0b1BvcnQ6IHRoaXMudG9Qb3J0LFxuICAgICAgcGVlcjogdGhpcy5wZWVyLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaWRySXBQZWVyIHtcbiAga2luZDogJ2NpZHItaXAnO1xuICBpcDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5R3JvdXBQZWVyIHtcbiAga2luZDogJ3NlY3VyaXR5LWdyb3VwJztcbiAgc2VjdXJpdHlHcm91cElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlZml4TGlzdFBlZXIge1xuICBraW5kOiAncHJlZml4LWxpc3QnO1xuICBwcmVmaXhMaXN0SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUnVsZVBlZXIgPSBDaWRySXBQZWVyIHwgU2VjdXJpdHlHcm91cFBlZXIgfCBQcmVmaXhMaXN0UGVlcjtcblxuZnVuY3Rpb24gcGVlckVxdWFsKGE/OiBSdWxlUGVlciwgYj86IFJ1bGVQZWVyKSB7XG4gIGlmICgoYSA9PT0gdW5kZWZpbmVkKSAhPT0gKGIgPT09IHVuZGVmaW5lZCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHRydWU7IH1cblxuICBpZiAoYS5raW5kICE9PSBiIS5raW5kKSB7IHJldHVybiBmYWxzZTsgfVxuICBzd2l0Y2ggKGEua2luZCkge1xuICAgIGNhc2UgJ2NpZHItaXAnOiByZXR1cm4gYS5pcCA9PT0gKGIgYXMgdHlwZW9mIGEpLmlwO1xuICAgIGNhc2UgJ3NlY3VyaXR5LWdyb3VwJzogcmV0dXJuIGEuc2VjdXJpdHlHcm91cElkID09PSAoYiBhcyB0eXBlb2YgYSkuc2VjdXJpdHlHcm91cElkO1xuICAgIGNhc2UgJ3ByZWZpeC1saXN0JzogcmV0dXJuIGEucHJlZml4TGlzdElkID09PSAoYiBhcyB0eXBlb2YgYSkucHJlZml4TGlzdElkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRGaXJzdDxUPihvYmo6IGFueSwga2V5czogc3RyaW5nW10sIGZuOiAoeDogc3RyaW5nKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAgICAgcmV0dXJuIGZuKG9ialtrZXldKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlSnNvbiB7XG4gIGdyb3VwSWQ6IHN0cmluZztcbiAgaXBQcm90b2NvbDogc3RyaW5nO1xuICBmcm9tUG9ydD86IG51bWJlcjtcbiAgdG9Qb3J0PzogbnVtYmVyO1xuICBwZWVyPzogUnVsZVBlZXI7XG59Il19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.renderIntrinsics = void 0;\n/**\n * Turn CloudFormation intrinsics into strings\n *\n * ------\n *\n * This stringification is not intended to be mechanically reversible! It's intended\n * to be understood by humans!\n *\n * ------\n *\n * Turns Fn::GetAtt and Fn::Ref objects into the same strings that can be\n * parsed by Fn::Sub, but without the surrounding intrinsics.\n *\n * Evaluates Fn::Join directly if the second argument is a literal list of strings.\n *\n * Removes list and object values evaluating to { Ref: 'AWS::NoValue' }.\n *\n * For other intrinsics we choose a string representation that CloudFormation\n * cannot actually parse, but is comprehensible to humans.\n */\nfunction renderIntrinsics(x) {\n if (Array.isArray(x)) {\n return x.filter(el => !isNoValue(el)).map(renderIntrinsics);\n }\n if (isNoValue(x)) {\n return undefined;\n }\n const intrinsic = getIntrinsic(x);\n if (intrinsic) {\n if (intrinsic.fn === 'Ref') {\n return '${' + intrinsic.args + '}';\n }\n if (intrinsic.fn === 'Fn::GetAtt') {\n return '${' + intrinsic.args[0] + '.' + intrinsic.args[1] + '}';\n }\n if (intrinsic.fn === 'Fn::Join') {\n return unCloudFormationFnJoin(intrinsic.args[0], intrinsic.args[1]);\n }\n return stringifyIntrinsic(intrinsic.fn, intrinsic.args);\n }\n if (typeof x === 'object' && x !== null) {\n const ret = {};\n for (const [key, value] of Object.entries(x)) {\n if (!isNoValue(value)) {\n ret[key] = renderIntrinsics(value);\n }\n }\n return ret;\n }\n return x;\n}\nexports.renderIntrinsics = renderIntrinsics;\nfunction unCloudFormationFnJoin(separator, args) {\n if (Array.isArray(args)) {\n return args.filter(el => !isNoValue(el)).map(renderIntrinsics).join(separator);\n }\n return stringifyIntrinsic('Fn::Join', [separator, args]);\n}\nfunction stringifyIntrinsic(fn, args) {\n return JSON.stringify({ [fn]: renderIntrinsics(args) });\n}\nfunction getIntrinsic(x) {\n if (x === undefined || x === null || Array.isArray(x)) {\n return undefined;\n }\n if (typeof x !== 'object') {\n return undefined;\n }\n const keys = Object.keys(x);\n return keys.length === 1 && (keys[0] === 'Ref' || keys[0].startsWith('Fn::')) ? { fn: keys[0], args: x[keys[0]] } : undefined;\n}\nfunction isNoValue(x) {\n const int = getIntrinsic(x);\n return int && int.fn === 'Ref' && int.args === 'AWS::NoValue';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWludHJpbnNpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyZW5kZXItaW50cmluc2ljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLENBQU07SUFDckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7S0FDN0Q7SUFFRCxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0tBQUU7SUFFdkMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLElBQUksU0FBUyxFQUFFO1FBQ2IsSUFBSSxTQUFTLENBQUMsRUFBRSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU8sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1NBQUU7UUFDbkUsSUFBSSxTQUFTLENBQUMsRUFBRSxLQUFLLFlBQVksRUFBRTtZQUFFLE9BQU8sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQUU7UUFDdkcsSUFBSSxTQUFTLENBQUMsRUFBRSxLQUFLLFVBQVUsRUFBRTtZQUFFLE9BQU8sc0JBQXNCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FBRTtRQUN6RyxPQUFPLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN2QyxNQUFNLEdBQUcsR0FBUSxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDckIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BDO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztLQUNaO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBekJELDRDQXlCQztBQUVELFNBQVMsc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxJQUFTO0lBQzFELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNoRjtJQUNELE9BQU8sa0JBQWtCLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsRUFBVSxFQUFFLElBQVM7SUFDL0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLENBQU07SUFDMUIsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0tBQUU7SUFDNUUsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztLQUFFO0lBQ2hELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEksQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLENBQU07SUFDdkIsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssS0FBSyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDO0FBQ2hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR1cm4gQ2xvdWRGb3JtYXRpb24gaW50cmluc2ljcyBpbnRvIHN0cmluZ3NcbiAqXG4gKiAtLS0tLS1cbiAqXG4gKiBUaGlzIHN0cmluZ2lmaWNhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgbWVjaGFuaWNhbGx5IHJldmVyc2libGUhIEl0J3MgaW50ZW5kZWRcbiAqIHRvIGJlIHVuZGVyc3Rvb2QgYnkgaHVtYW5zIVxuICpcbiAqIC0tLS0tLVxuICpcbiAqIFR1cm5zIEZuOjpHZXRBdHQgYW5kIEZuOjpSZWYgb2JqZWN0cyBpbnRvIHRoZSBzYW1lIHN0cmluZ3MgdGhhdCBjYW4gYmVcbiAqIHBhcnNlZCBieSBGbjo6U3ViLCBidXQgd2l0aG91dCB0aGUgc3Vycm91bmRpbmcgaW50cmluc2ljcy5cbiAqXG4gKiBFdmFsdWF0ZXMgRm46OkpvaW4gZGlyZWN0bHkgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBhIGxpdGVyYWwgbGlzdCBvZiBzdHJpbmdzLlxuICpcbiAqIFJlbW92ZXMgbGlzdCBhbmQgb2JqZWN0IHZhbHVlcyBldmFsdWF0aW5nIHRvIHsgUmVmOiAnQVdTOjpOb1ZhbHVlJyB9LlxuICpcbiAqIEZvciBvdGhlciBpbnRyaW5zaWNzIHdlIGNob29zZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB0aGF0IENsb3VkRm9ybWF0aW9uXG4gKiBjYW5ub3QgYWN0dWFsbHkgcGFyc2UsIGJ1dCBpcyBjb21wcmVoZW5zaWJsZSB0byBodW1hbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJJbnRyaW5zaWNzKHg6IGFueSk6IGFueSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIHguZmlsdGVyKGVsID0+ICFpc05vVmFsdWUoZWwpKS5tYXAocmVuZGVySW50cmluc2ljcyk7XG4gIH1cblxuICBpZiAoaXNOb1ZhbHVlKHgpKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cblxuICBjb25zdCBpbnRyaW5zaWMgPSBnZXRJbnRyaW5zaWMoeCk7XG4gIGlmIChpbnRyaW5zaWMpIHtcbiAgICBpZiAoaW50cmluc2ljLmZuID09PSAnUmVmJykgeyByZXR1cm4gJyR7JyArIGludHJpbnNpYy5hcmdzICsgJ30nOyB9XG4gICAgaWYgKGludHJpbnNpYy5mbiA9PT0gJ0ZuOjpHZXRBdHQnKSB7IHJldHVybiAnJHsnICsgaW50cmluc2ljLmFyZ3NbMF0gKyAnLicgKyBpbnRyaW5zaWMuYXJnc1sxXSArICd9JzsgfVxuICAgIGlmIChpbnRyaW5zaWMuZm4gPT09ICdGbjo6Sm9pbicpIHsgcmV0dXJuIHVuQ2xvdWRGb3JtYXRpb25GbkpvaW4oaW50cmluc2ljLmFyZ3NbMF0sIGludHJpbnNpYy5hcmdzWzFdKTsgfVxuICAgIHJldHVybiBzdHJpbmdpZnlJbnRyaW5zaWMoaW50cmluc2ljLmZuLCBpbnRyaW5zaWMuYXJncyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGwpIHtcbiAgICBjb25zdCByZXQ6IGFueSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHgpKSB7XG4gICAgICBpZiAoIWlzTm9WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0W2tleV0gPSByZW5kZXJJbnRyaW5zaWNzKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gdW5DbG91ZEZvcm1hdGlvbkZuSm9pbihzZXBhcmF0b3I6IHN0cmluZywgYXJnczogYW55KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG4gICAgcmV0dXJuIGFyZ3MuZmlsdGVyKGVsID0+ICFpc05vVmFsdWUoZWwpKS5tYXAocmVuZGVySW50cmluc2ljcykuam9pbihzZXBhcmF0b3IpO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZnlJbnRyaW5zaWMoJ0ZuOjpKb2luJywgW3NlcGFyYXRvciwgYXJnc10pO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlJbnRyaW5zaWMoZm46IHN0cmluZywgYXJnczogYW55KSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IFtmbl06IHJlbmRlckludHJpbnNpY3MoYXJncykgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEludHJpbnNpYyh4OiBhbnkpOiBJbnRyaW5zaWMgfCB1bmRlZmluZWQge1xuICBpZiAoeCA9PT0gdW5kZWZpbmVkIHx8IHggPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheSh4KSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGlmICh0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoeCk7XG4gIHJldHVybiBrZXlzLmxlbmd0aCA9PT0gMSAmJiAoa2V5c1swXSA9PT0gJ1JlZicgfHwga2V5c1swXS5zdGFydHNXaXRoKCdGbjo6JykpID8geyBmbjoga2V5c1swXSwgYXJnczogeFtrZXlzWzBdXSB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc05vVmFsdWUoeDogYW55KSB7XG4gIGNvbnN0IGludCA9IGdldEludHJpbnNpYyh4KTtcbiAgcmV0dXJuIGludCAmJiBpbnQuZm4gPT09ICdSZWYnICYmIGludC5hcmdzID09PSAnQVdTOjpOb1ZhbHVlJztcbn1cblxuaW50ZXJmYWNlIEludHJpbnNpYyB7XG4gIGZuOiBzdHJpbmc7XG4gIGFyZ3M6IGFueTtcbn0iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.flatMap = exports.deepRemoveUndefined = exports.dropIfEmpty = exports.makeComparator = void 0;\n/**\n * Turn a (multi-key) extraction function into a comparator for use in Array.sort()\n */\nfunction makeComparator(keyFn) {\n return (a, b) => {\n const keyA = keyFn(a);\n const keyB = keyFn(b);\n const len = Math.min(keyA.length, keyB.length);\n for (let i = 0; i < len; i++) {\n const c = compare(keyA[i], keyB[i]);\n if (c !== 0) {\n return c;\n }\n }\n // Arrays are the same up to the min length -- shorter array sorts first\n return keyA.length - keyB.length;\n };\n}\nexports.makeComparator = makeComparator;\nfunction compare(a, b) {\n if (a < b) {\n return -1;\n }\n if (b < a) {\n return 1;\n }\n return 0;\n}\nfunction dropIfEmpty(xs) {\n return xs.length > 0 ? xs : undefined;\n}\nexports.dropIfEmpty = dropIfEmpty;\nfunction deepRemoveUndefined(x) {\n if (typeof x === undefined || x === null) {\n return x;\n }\n if (Array.isArray(x)) {\n return x.map(deepRemoveUndefined);\n }\n if (typeof x === 'object') {\n for (const [key, value] of Object.entries(x)) {\n x[key] = deepRemoveUndefined(value);\n if (x[key] === undefined) {\n delete x[key];\n }\n }\n return x;\n }\n return x;\n}\nexports.deepRemoveUndefined = deepRemoveUndefined;\nfunction flatMap(xs, f) {\n const ret = new Array();\n for (const x of xs) {\n ret.push(...f(x));\n }\n return ret;\n}\nexports.flatMap = flatMap;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQU8sS0FBb0I7SUFDdkQsT0FBTyxDQUFDLENBQUksRUFBRSxDQUFJLEVBQUUsRUFBRTtRQUNwQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFBRSxPQUFPLENBQUMsQ0FBQzthQUFFO1NBQzNCO1FBRUQsd0VBQXdFO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ25DLENBQUMsQ0FBQztBQUNKLENBQUM7QUFkRCx3Q0FjQztBQUVELFNBQVMsT0FBTyxDQUFJLENBQUksRUFBRSxDQUFJO0lBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FBRTtJQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFBRSxPQUFPLENBQUMsQ0FBQztLQUFFO0lBQ3hCLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBSSxFQUFPO0lBQ3BDLE9BQU8sRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3hDLENBQUM7QUFGRCxrQ0FFQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLENBQU07SUFDeEMsSUFBSSxPQUFPLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQUU7SUFDdkQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0FBRTtJQUM1RCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUN6QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FDN0M7UUFDRCxPQUFPLENBQUMsQ0FBQztLQUNWO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBWEQsa0RBV0M7QUFFRCxTQUFnQixPQUFPLENBQU8sRUFBTyxFQUFFLENBQWdCO0lBQ3JELE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFLLENBQUM7SUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBTkQsMEJBTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR1cm4gYSAobXVsdGkta2V5KSBleHRyYWN0aW9uIGZ1bmN0aW9uIGludG8gYSBjb21wYXJhdG9yIGZvciB1c2UgaW4gQXJyYXkuc29ydCgpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ29tcGFyYXRvcjxULCBVPihrZXlGbjogKHg6IFQpID0+IFVbXSkge1xuICByZXR1cm4gKGE6IFQsIGI6IFQpID0+IHtcbiAgICBjb25zdCBrZXlBID0ga2V5Rm4oYSk7XG4gICAgY29uc3Qga2V5QiA9IGtleUZuKGIpO1xuICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGtleUEubGVuZ3RoLCBrZXlCLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gY29tcGFyZShrZXlBW2ldLCBrZXlCW2ldKTtcbiAgICAgIGlmIChjICE9PSAwKSB7IHJldHVybiBjOyB9XG4gICAgfVxuXG4gICAgLy8gQXJyYXlzIGFyZSB0aGUgc2FtZSB1cCB0byB0aGUgbWluIGxlbmd0aCAtLSBzaG9ydGVyIGFycmF5IHNvcnRzIGZpcnN0XG4gICAgcmV0dXJuIGtleUEubGVuZ3RoIC0ga2V5Qi5sZW5ndGg7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmU8VD4oYTogVCwgYjogVCkge1xuICBpZiAoYSA8IGIpIHsgcmV0dXJuIC0xOyB9XG4gIGlmIChiIDwgYSkgeyByZXR1cm4gMTsgfVxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyb3BJZkVtcHR5PFQ+KHhzOiBUW10pOiBUW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4geHMubGVuZ3RoID4gMCA/IHhzIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFJlbW92ZVVuZGVmaW5lZCh4OiBhbnkpOiBhbnkge1xuICBpZiAodHlwZW9mIHggPT09IHVuZGVmaW5lZCB8fCB4ID09PSBudWxsKSB7IHJldHVybiB4OyB9XG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7IHJldHVybiB4Lm1hcChkZWVwUmVtb3ZlVW5kZWZpbmVkKTsgfVxuICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoeCkpIHtcbiAgICAgIHhba2V5XSA9IGRlZXBSZW1vdmVVbmRlZmluZWQodmFsdWUpO1xuICAgICAgaWYgKHhba2V5XSA9PT0gdW5kZWZpbmVkKSB7IGRlbGV0ZSB4W2tleV07IH1cbiAgICB9XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0TWFwPFQsIFU+KHhzOiBUW10sIGY6ICh4OiBUKSA9PiBVW10pOiBVW10ge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8VT4oKTtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgcmV0LnB1c2goLi4uZih4KSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn0iXX0=","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AwsCrc32 = void 0;\nvar tslib_1 = require(\"tslib\");\nvar util_1 = require(\"@aws-crypto/util\");\nvar index_1 = require(\"./index\");\nvar AwsCrc32 = /** @class */ (function () {\n function AwsCrc32() {\n this.crc32 = new index_1.Crc32();\n }\n AwsCrc32.prototype.update = function (toHash) {\n if ((0, util_1.isEmptyData)(toHash))\n return;\n this.crc32.update((0, util_1.convertToBuffer)(toHash));\n };\n AwsCrc32.prototype.digest = function () {\n return tslib_1.__awaiter(this, void 0, void 0, function () {\n return tslib_1.__generator(this, function (_a) {\n return [2 /*return*/, (0, util_1.numToUint8)(this.crc32.digest())];\n });\n });\n };\n AwsCrc32.prototype.reset = function () {\n this.crc32 = new index_1.Crc32();\n };\n return AwsCrc32;\n}());\nexports.AwsCrc32 = AwsCrc32;\n//# sourceMappingURL=aws_crc32.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AwsCrc32 = exports.Crc32 = exports.crc32 = void 0;\nvar tslib_1 = require(\"tslib\");\nvar util_1 = require(\"@aws-crypto/util\");\nfunction crc32(data) {\n return new Crc32().update(data).digest();\n}\nexports.crc32 = crc32;\nvar Crc32 = /** @class */ (function () {\n function Crc32() {\n this.checksum = 0xffffffff;\n }\n Crc32.prototype.update = function (data) {\n var e_1, _a;\n try {\n for (var data_1 = tslib_1.__values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) {\n var byte = data_1_1.value;\n this.checksum =\n (this.checksum >>> 8) ^ lookupTable[(this.checksum ^ byte) & 0xff];\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return this;\n };\n Crc32.prototype.digest = function () {\n return (this.checksum ^ 0xffffffff) >>> 0;\n };\n return Crc32;\n}());\nexports.Crc32 = Crc32;\n// prettier-ignore\nvar a_lookUpTable = [\n 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,\n 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,\n 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\n 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,\n 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,\n 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\n 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,\n 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,\n 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\n 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,\n 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,\n 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,\n 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,\n 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\n 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,\n 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\n 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,\n 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\n 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,\n 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\n 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,\n 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\n 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,\n 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,\n 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\n 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,\n 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\n 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,\n 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\n 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,\n 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\n 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,\n 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,\n 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\n 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,\n 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\n 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,\n 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\n 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,\n 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\n 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,\n 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\n 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,\n 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\n 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,\n 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\n 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,\n 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\n 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,\n 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\n 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,\n 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,\n 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\n 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,\n 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,\n];\nvar lookupTable = (0, util_1.uint32ArrayFrom)(a_lookUpTable);\nvar aws_crc32_1 = require(\"./aws_crc32\");\nObject.defineProperty(exports, \"AwsCrc32\", { enumerable: true, get: function () { return aws_crc32_1.AwsCrc32; } });\n//# sourceMappingURL=index.js.map","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __createBinding = function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n };\r\n\r\n __exportStar = function (m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n };\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result[\"default\"] = mod;\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n});\r\n","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.convertToBuffer = void 0;\nvar util_utf8_browser_1 = require(\"@aws-sdk/util-utf8-browser\");\n// Quick polyfill\nvar fromUtf8 = typeof Buffer !== \"undefined\" && Buffer.from\n ? function (input) { return Buffer.from(input, \"utf8\"); }\n : util_utf8_browser_1.fromUtf8;\nfunction convertToBuffer(data) {\n // Already a Uint8, do nothing\n if (data instanceof Uint8Array)\n return data;\n if (typeof data === \"string\") {\n return fromUtf8(data);\n }\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT);\n }\n return new Uint8Array(data);\n}\nexports.convertToBuffer = convertToBuffer;\n//# sourceMappingURL=convertToBuffer.js.map","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.uint32ArrayFrom = exports.numToUint8 = exports.isEmptyData = exports.convertToBuffer = void 0;\nvar convertToBuffer_1 = require(\"./convertToBuffer\");\nObject.defineProperty(exports, \"convertToBuffer\", { enumerable: true, get: function () { return convertToBuffer_1.convertToBuffer; } });\nvar isEmptyData_1 = require(\"./isEmptyData\");\nObject.defineProperty(exports, \"isEmptyData\", { enumerable: true, get: function () { return isEmptyData_1.isEmptyData; } });\nvar numToUint8_1 = require(\"./numToUint8\");\nObject.defineProperty(exports, \"numToUint8\", { enumerable: true, get: function () { return numToUint8_1.numToUint8; } });\nvar uint32ArrayFrom_1 = require(\"./uint32ArrayFrom\");\nObject.defineProperty(exports, \"uint32ArrayFrom\", { enumerable: true, get: function () { return uint32ArrayFrom_1.uint32ArrayFrom; } });\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isEmptyData = void 0;\nfunction isEmptyData(data) {\n if (typeof data === \"string\") {\n return data.length === 0;\n }\n return data.byteLength === 0;\n}\nexports.isEmptyData = isEmptyData;\n//# sourceMappingURL=isEmptyData.js.map","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.numToUint8 = void 0;\nfunction numToUint8(num) {\n return new Uint8Array([\n (num & 0xff000000) >> 24,\n (num & 0x00ff0000) >> 16,\n (num & 0x0000ff00) >> 8,\n num & 0x000000ff,\n ]);\n}\nexports.numToUint8 = numToUint8;\n//# sourceMappingURL=numToUint8.js.map","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.uint32ArrayFrom = void 0;\n// IE 11 does not support Array.from, so we do it manually\nfunction uint32ArrayFrom(a_lookUpTable) {\n if (!Uint32Array.from) {\n var return_array = new Uint32Array(a_lookUpTable.length);\n var a_index = 0;\n while (a_index < a_lookUpTable.length) {\n return_array[a_index] = a_lookUpTable[a_index];\n a_index += 1;\n }\n return return_array;\n }\n return Uint32Array.from(a_lookUpTable);\n}\nexports.uint32ArrayFrom = uint32ArrayFrom;\n//# sourceMappingURL=uint32ArrayFrom.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CloudFormation = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst CloudFormationClient_1 = require(\"./CloudFormationClient\");\nconst ActivateOrganizationsAccessCommand_1 = require(\"./commands/ActivateOrganizationsAccessCommand\");\nconst ActivateTypeCommand_1 = require(\"./commands/ActivateTypeCommand\");\nconst BatchDescribeTypeConfigurationsCommand_1 = require(\"./commands/BatchDescribeTypeConfigurationsCommand\");\nconst CancelUpdateStackCommand_1 = require(\"./commands/CancelUpdateStackCommand\");\nconst ContinueUpdateRollbackCommand_1 = require(\"./commands/ContinueUpdateRollbackCommand\");\nconst CreateChangeSetCommand_1 = require(\"./commands/CreateChangeSetCommand\");\nconst CreateStackCommand_1 = require(\"./commands/CreateStackCommand\");\nconst CreateStackInstancesCommand_1 = require(\"./commands/CreateStackInstancesCommand\");\nconst CreateStackSetCommand_1 = require(\"./commands/CreateStackSetCommand\");\nconst DeactivateOrganizationsAccessCommand_1 = require(\"./commands/DeactivateOrganizationsAccessCommand\");\nconst DeactivateTypeCommand_1 = require(\"./commands/DeactivateTypeCommand\");\nconst DeleteChangeSetCommand_1 = require(\"./commands/DeleteChangeSetCommand\");\nconst DeleteStackCommand_1 = require(\"./commands/DeleteStackCommand\");\nconst DeleteStackInstancesCommand_1 = require(\"./commands/DeleteStackInstancesCommand\");\nconst DeleteStackSetCommand_1 = require(\"./commands/DeleteStackSetCommand\");\nconst DeregisterTypeCommand_1 = require(\"./commands/DeregisterTypeCommand\");\nconst DescribeAccountLimitsCommand_1 = require(\"./commands/DescribeAccountLimitsCommand\");\nconst DescribeChangeSetCommand_1 = require(\"./commands/DescribeChangeSetCommand\");\nconst DescribeChangeSetHooksCommand_1 = require(\"./commands/DescribeChangeSetHooksCommand\");\nconst DescribeOrganizationsAccessCommand_1 = require(\"./commands/DescribeOrganizationsAccessCommand\");\nconst DescribePublisherCommand_1 = require(\"./commands/DescribePublisherCommand\");\nconst DescribeStackDriftDetectionStatusCommand_1 = require(\"./commands/DescribeStackDriftDetectionStatusCommand\");\nconst DescribeStackEventsCommand_1 = require(\"./commands/DescribeStackEventsCommand\");\nconst DescribeStackInstanceCommand_1 = require(\"./commands/DescribeStackInstanceCommand\");\nconst DescribeStackResourceCommand_1 = require(\"./commands/DescribeStackResourceCommand\");\nconst DescribeStackResourceDriftsCommand_1 = require(\"./commands/DescribeStackResourceDriftsCommand\");\nconst DescribeStackResourcesCommand_1 = require(\"./commands/DescribeStackResourcesCommand\");\nconst DescribeStacksCommand_1 = require(\"./commands/DescribeStacksCommand\");\nconst DescribeStackSetCommand_1 = require(\"./commands/DescribeStackSetCommand\");\nconst DescribeStackSetOperationCommand_1 = require(\"./commands/DescribeStackSetOperationCommand\");\nconst DescribeTypeCommand_1 = require(\"./commands/DescribeTypeCommand\");\nconst DescribeTypeRegistrationCommand_1 = require(\"./commands/DescribeTypeRegistrationCommand\");\nconst DetectStackDriftCommand_1 = require(\"./commands/DetectStackDriftCommand\");\nconst DetectStackResourceDriftCommand_1 = require(\"./commands/DetectStackResourceDriftCommand\");\nconst DetectStackSetDriftCommand_1 = require(\"./commands/DetectStackSetDriftCommand\");\nconst EstimateTemplateCostCommand_1 = require(\"./commands/EstimateTemplateCostCommand\");\nconst ExecuteChangeSetCommand_1 = require(\"./commands/ExecuteChangeSetCommand\");\nconst GetStackPolicyCommand_1 = require(\"./commands/GetStackPolicyCommand\");\nconst GetTemplateCommand_1 = require(\"./commands/GetTemplateCommand\");\nconst GetTemplateSummaryCommand_1 = require(\"./commands/GetTemplateSummaryCommand\");\nconst ImportStacksToStackSetCommand_1 = require(\"./commands/ImportStacksToStackSetCommand\");\nconst ListChangeSetsCommand_1 = require(\"./commands/ListChangeSetsCommand\");\nconst ListExportsCommand_1 = require(\"./commands/ListExportsCommand\");\nconst ListImportsCommand_1 = require(\"./commands/ListImportsCommand\");\nconst ListStackInstanceResourceDriftsCommand_1 = require(\"./commands/ListStackInstanceResourceDriftsCommand\");\nconst ListStackInstancesCommand_1 = require(\"./commands/ListStackInstancesCommand\");\nconst ListStackResourcesCommand_1 = require(\"./commands/ListStackResourcesCommand\");\nconst ListStacksCommand_1 = require(\"./commands/ListStacksCommand\");\nconst ListStackSetOperationResultsCommand_1 = require(\"./commands/ListStackSetOperationResultsCommand\");\nconst ListStackSetOperationsCommand_1 = require(\"./commands/ListStackSetOperationsCommand\");\nconst ListStackSetsCommand_1 = require(\"./commands/ListStackSetsCommand\");\nconst ListTypeRegistrationsCommand_1 = require(\"./commands/ListTypeRegistrationsCommand\");\nconst ListTypesCommand_1 = require(\"./commands/ListTypesCommand\");\nconst ListTypeVersionsCommand_1 = require(\"./commands/ListTypeVersionsCommand\");\nconst PublishTypeCommand_1 = require(\"./commands/PublishTypeCommand\");\nconst RecordHandlerProgressCommand_1 = require(\"./commands/RecordHandlerProgressCommand\");\nconst RegisterPublisherCommand_1 = require(\"./commands/RegisterPublisherCommand\");\nconst RegisterTypeCommand_1 = require(\"./commands/RegisterTypeCommand\");\nconst RollbackStackCommand_1 = require(\"./commands/RollbackStackCommand\");\nconst SetStackPolicyCommand_1 = require(\"./commands/SetStackPolicyCommand\");\nconst SetTypeConfigurationCommand_1 = require(\"./commands/SetTypeConfigurationCommand\");\nconst SetTypeDefaultVersionCommand_1 = require(\"./commands/SetTypeDefaultVersionCommand\");\nconst SignalResourceCommand_1 = require(\"./commands/SignalResourceCommand\");\nconst StopStackSetOperationCommand_1 = require(\"./commands/StopStackSetOperationCommand\");\nconst TestTypeCommand_1 = require(\"./commands/TestTypeCommand\");\nconst UpdateStackCommand_1 = require(\"./commands/UpdateStackCommand\");\nconst UpdateStackInstancesCommand_1 = require(\"./commands/UpdateStackInstancesCommand\");\nconst UpdateStackSetCommand_1 = require(\"./commands/UpdateStackSetCommand\");\nconst UpdateTerminationProtectionCommand_1 = require(\"./commands/UpdateTerminationProtectionCommand\");\nconst ValidateTemplateCommand_1 = require(\"./commands/ValidateTemplateCommand\");\nconst commands = {\n ActivateOrganizationsAccessCommand: ActivateOrganizationsAccessCommand_1.ActivateOrganizationsAccessCommand,\n ActivateTypeCommand: ActivateTypeCommand_1.ActivateTypeCommand,\n BatchDescribeTypeConfigurationsCommand: BatchDescribeTypeConfigurationsCommand_1.BatchDescribeTypeConfigurationsCommand,\n CancelUpdateStackCommand: CancelUpdateStackCommand_1.CancelUpdateStackCommand,\n ContinueUpdateRollbackCommand: ContinueUpdateRollbackCommand_1.ContinueUpdateRollbackCommand,\n CreateChangeSetCommand: CreateChangeSetCommand_1.CreateChangeSetCommand,\n CreateStackCommand: CreateStackCommand_1.CreateStackCommand,\n CreateStackInstancesCommand: CreateStackInstancesCommand_1.CreateStackInstancesCommand,\n CreateStackSetCommand: CreateStackSetCommand_1.CreateStackSetCommand,\n DeactivateOrganizationsAccessCommand: DeactivateOrganizationsAccessCommand_1.DeactivateOrganizationsAccessCommand,\n DeactivateTypeCommand: DeactivateTypeCommand_1.DeactivateTypeCommand,\n DeleteChangeSetCommand: DeleteChangeSetCommand_1.DeleteChangeSetCommand,\n DeleteStackCommand: DeleteStackCommand_1.DeleteStackCommand,\n DeleteStackInstancesCommand: DeleteStackInstancesCommand_1.DeleteStackInstancesCommand,\n DeleteStackSetCommand: DeleteStackSetCommand_1.DeleteStackSetCommand,\n DeregisterTypeCommand: DeregisterTypeCommand_1.DeregisterTypeCommand,\n DescribeAccountLimitsCommand: DescribeAccountLimitsCommand_1.DescribeAccountLimitsCommand,\n DescribeChangeSetCommand: DescribeChangeSetCommand_1.DescribeChangeSetCommand,\n DescribeChangeSetHooksCommand: DescribeChangeSetHooksCommand_1.DescribeChangeSetHooksCommand,\n DescribeOrganizationsAccessCommand: DescribeOrganizationsAccessCommand_1.DescribeOrganizationsAccessCommand,\n DescribePublisherCommand: DescribePublisherCommand_1.DescribePublisherCommand,\n DescribeStackDriftDetectionStatusCommand: DescribeStackDriftDetectionStatusCommand_1.DescribeStackDriftDetectionStatusCommand,\n DescribeStackEventsCommand: DescribeStackEventsCommand_1.DescribeStackEventsCommand,\n DescribeStackInstanceCommand: DescribeStackInstanceCommand_1.DescribeStackInstanceCommand,\n DescribeStackResourceCommand: DescribeStackResourceCommand_1.DescribeStackResourceCommand,\n DescribeStackResourceDriftsCommand: DescribeStackResourceDriftsCommand_1.DescribeStackResourceDriftsCommand,\n DescribeStackResourcesCommand: DescribeStackResourcesCommand_1.DescribeStackResourcesCommand,\n DescribeStacksCommand: DescribeStacksCommand_1.DescribeStacksCommand,\n DescribeStackSetCommand: DescribeStackSetCommand_1.DescribeStackSetCommand,\n DescribeStackSetOperationCommand: DescribeStackSetOperationCommand_1.DescribeStackSetOperationCommand,\n DescribeTypeCommand: DescribeTypeCommand_1.DescribeTypeCommand,\n DescribeTypeRegistrationCommand: DescribeTypeRegistrationCommand_1.DescribeTypeRegistrationCommand,\n DetectStackDriftCommand: DetectStackDriftCommand_1.DetectStackDriftCommand,\n DetectStackResourceDriftCommand: DetectStackResourceDriftCommand_1.DetectStackResourceDriftCommand,\n DetectStackSetDriftCommand: DetectStackSetDriftCommand_1.DetectStackSetDriftCommand,\n EstimateTemplateCostCommand: EstimateTemplateCostCommand_1.EstimateTemplateCostCommand,\n ExecuteChangeSetCommand: ExecuteChangeSetCommand_1.ExecuteChangeSetCommand,\n GetStackPolicyCommand: GetStackPolicyCommand_1.GetStackPolicyCommand,\n GetTemplateCommand: GetTemplateCommand_1.GetTemplateCommand,\n GetTemplateSummaryCommand: GetTemplateSummaryCommand_1.GetTemplateSummaryCommand,\n ImportStacksToStackSetCommand: ImportStacksToStackSetCommand_1.ImportStacksToStackSetCommand,\n ListChangeSetsCommand: ListChangeSetsCommand_1.ListChangeSetsCommand,\n ListExportsCommand: ListExportsCommand_1.ListExportsCommand,\n ListImportsCommand: ListImportsCommand_1.ListImportsCommand,\n ListStackInstanceResourceDriftsCommand: ListStackInstanceResourceDriftsCommand_1.ListStackInstanceResourceDriftsCommand,\n ListStackInstancesCommand: ListStackInstancesCommand_1.ListStackInstancesCommand,\n ListStackResourcesCommand: ListStackResourcesCommand_1.ListStackResourcesCommand,\n ListStacksCommand: ListStacksCommand_1.ListStacksCommand,\n ListStackSetOperationResultsCommand: ListStackSetOperationResultsCommand_1.ListStackSetOperationResultsCommand,\n ListStackSetOperationsCommand: ListStackSetOperationsCommand_1.ListStackSetOperationsCommand,\n ListStackSetsCommand: ListStackSetsCommand_1.ListStackSetsCommand,\n ListTypeRegistrationsCommand: ListTypeRegistrationsCommand_1.ListTypeRegistrationsCommand,\n ListTypesCommand: ListTypesCommand_1.ListTypesCommand,\n ListTypeVersionsCommand: ListTypeVersionsCommand_1.ListTypeVersionsCommand,\n PublishTypeCommand: PublishTypeCommand_1.PublishTypeCommand,\n RecordHandlerProgressCommand: RecordHandlerProgressCommand_1.RecordHandlerProgressCommand,\n RegisterPublisherCommand: RegisterPublisherCommand_1.RegisterPublisherCommand,\n RegisterTypeCommand: RegisterTypeCommand_1.RegisterTypeCommand,\n RollbackStackCommand: RollbackStackCommand_1.RollbackStackCommand,\n SetStackPolicyCommand: SetStackPolicyCommand_1.SetStackPolicyCommand,\n SetTypeConfigurationCommand: SetTypeConfigurationCommand_1.SetTypeConfigurationCommand,\n SetTypeDefaultVersionCommand: SetTypeDefaultVersionCommand_1.SetTypeDefaultVersionCommand,\n SignalResourceCommand: SignalResourceCommand_1.SignalResourceCommand,\n StopStackSetOperationCommand: StopStackSetOperationCommand_1.StopStackSetOperationCommand,\n TestTypeCommand: TestTypeCommand_1.TestTypeCommand,\n UpdateStackCommand: UpdateStackCommand_1.UpdateStackCommand,\n UpdateStackInstancesCommand: UpdateStackInstancesCommand_1.UpdateStackInstancesCommand,\n UpdateStackSetCommand: UpdateStackSetCommand_1.UpdateStackSetCommand,\n UpdateTerminationProtectionCommand: UpdateTerminationProtectionCommand_1.UpdateTerminationProtectionCommand,\n ValidateTemplateCommand: ValidateTemplateCommand_1.ValidateTemplateCommand,\n};\nclass CloudFormation extends CloudFormationClient_1.CloudFormationClient {\n}\nexports.CloudFormation = CloudFormation;\n(0, smithy_client_1.createAggregatedClient)(commands, CloudFormation);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CloudFormationClient = exports.__Client = void 0;\nconst middleware_host_header_1 = require(\"@aws-sdk/middleware-host-header\");\nconst middleware_logger_1 = require(\"@aws-sdk/middleware-logger\");\nconst middleware_recursion_detection_1 = require(\"@aws-sdk/middleware-recursion-detection\");\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_user_agent_1 = require(\"@aws-sdk/middleware-user-agent\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst middleware_content_length_1 = require(\"@smithy/middleware-content-length\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__Client\", { enumerable: true, get: function () { return smithy_client_1.Client; } });\nconst EndpointParameters_1 = require(\"./endpoint/EndpointParameters\");\nconst runtimeConfig_1 = require(\"./runtimeConfig\");\nconst runtimeExtensions_1 = require(\"./runtimeExtensions\");\nclass CloudFormationClient extends smithy_client_1.Client {\n constructor(...[configuration]) {\n const _config_0 = (0, runtimeConfig_1.getRuntimeConfig)(configuration || {});\n const _config_1 = (0, EndpointParameters_1.resolveClientEndpointParameters)(_config_0);\n const _config_2 = (0, config_resolver_1.resolveRegionConfig)(_config_1);\n const _config_3 = (0, middleware_endpoint_1.resolveEndpointConfig)(_config_2);\n const _config_4 = (0, middleware_retry_1.resolveRetryConfig)(_config_3);\n const _config_5 = (0, middleware_host_header_1.resolveHostHeaderConfig)(_config_4);\n const _config_6 = (0, middleware_signing_1.resolveAwsAuthConfig)(_config_5);\n const _config_7 = (0, middleware_user_agent_1.resolveUserAgentConfig)(_config_6);\n const _config_8 = (0, runtimeExtensions_1.resolveRuntimeExtensions)(_config_7, configuration?.extensions || []);\n super(_config_8);\n this.config = _config_8;\n this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));\n this.middlewareStack.use((0, middleware_content_length_1.getContentLengthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_host_header_1.getHostHeaderPlugin)(this.config));\n this.middlewareStack.use((0, middleware_logger_1.getLoggerPlugin)(this.config));\n this.middlewareStack.use((0, middleware_recursion_detection_1.getRecursionDetectionPlugin)(this.config));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));\n }\n destroy() {\n super.destroy();\n }\n}\nexports.CloudFormationClient = CloudFormationClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ActivateOrganizationsAccessCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ActivateOrganizationsAccessCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ActivateOrganizationsAccessCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ActivateOrganizationsAccessCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ActivateOrganizationsAccess\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ActivateOrganizationsAccessCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ActivateOrganizationsAccessCommand)(output, context);\n }\n}\nexports.ActivateOrganizationsAccessCommand = ActivateOrganizationsAccessCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ActivateTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ActivateTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ActivateTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ActivateTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ActivateType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ActivateTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ActivateTypeCommand)(output, context);\n }\n}\nexports.ActivateTypeCommand = ActivateTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BatchDescribeTypeConfigurationsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass BatchDescribeTypeConfigurationsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, BatchDescribeTypeConfigurationsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"BatchDescribeTypeConfigurationsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"BatchDescribeTypeConfigurations\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_BatchDescribeTypeConfigurationsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_BatchDescribeTypeConfigurationsCommand)(output, context);\n }\n}\nexports.BatchDescribeTypeConfigurationsCommand = BatchDescribeTypeConfigurationsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancelUpdateStackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass CancelUpdateStackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CancelUpdateStackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"CancelUpdateStackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"CancelUpdateStack\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_CancelUpdateStackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_CancelUpdateStackCommand)(output, context);\n }\n}\nexports.CancelUpdateStackCommand = CancelUpdateStackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ContinueUpdateRollbackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ContinueUpdateRollbackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ContinueUpdateRollbackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ContinueUpdateRollbackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ContinueUpdateRollback\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ContinueUpdateRollbackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ContinueUpdateRollbackCommand)(output, context);\n }\n}\nexports.ContinueUpdateRollbackCommand = ContinueUpdateRollbackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CreateChangeSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass CreateChangeSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CreateChangeSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"CreateChangeSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"CreateChangeSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_CreateChangeSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_CreateChangeSetCommand)(output, context);\n }\n}\nexports.CreateChangeSetCommand = CreateChangeSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CreateStackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass CreateStackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CreateStackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"CreateStackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"CreateStack\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_CreateStackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_CreateStackCommand)(output, context);\n }\n}\nexports.CreateStackCommand = CreateStackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CreateStackInstancesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass CreateStackInstancesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CreateStackInstancesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"CreateStackInstancesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"CreateStackInstances\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_CreateStackInstancesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_CreateStackInstancesCommand)(output, context);\n }\n}\nexports.CreateStackInstancesCommand = CreateStackInstancesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CreateStackSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass CreateStackSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CreateStackSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"CreateStackSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"CreateStackSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_CreateStackSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_CreateStackSetCommand)(output, context);\n }\n}\nexports.CreateStackSetCommand = CreateStackSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeactivateOrganizationsAccessCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeactivateOrganizationsAccessCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeactivateOrganizationsAccessCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeactivateOrganizationsAccessCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeactivateOrganizationsAccess\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeactivateOrganizationsAccessCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeactivateOrganizationsAccessCommand)(output, context);\n }\n}\nexports.DeactivateOrganizationsAccessCommand = DeactivateOrganizationsAccessCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeactivateTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeactivateTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeactivateTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeactivateTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeactivateType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeactivateTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeactivateTypeCommand)(output, context);\n }\n}\nexports.DeactivateTypeCommand = DeactivateTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteChangeSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeleteChangeSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteChangeSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeleteChangeSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeleteChangeSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeleteChangeSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeleteChangeSetCommand)(output, context);\n }\n}\nexports.DeleteChangeSetCommand = DeleteChangeSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteStackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeleteStackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteStackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeleteStackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeleteStack\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeleteStackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeleteStackCommand)(output, context);\n }\n}\nexports.DeleteStackCommand = DeleteStackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteStackInstancesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeleteStackInstancesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteStackInstancesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeleteStackInstancesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeleteStackInstances\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeleteStackInstancesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeleteStackInstancesCommand)(output, context);\n }\n}\nexports.DeleteStackInstancesCommand = DeleteStackInstancesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteStackSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeleteStackSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteStackSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeleteStackSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeleteStackSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeleteStackSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeleteStackSetCommand)(output, context);\n }\n}\nexports.DeleteStackSetCommand = DeleteStackSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeregisterTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeregisterTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeregisterTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeregisterTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeregisterType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeregisterTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeregisterTypeCommand)(output, context);\n }\n}\nexports.DeregisterTypeCommand = DeregisterTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeAccountLimitsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeAccountLimitsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeAccountLimitsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeAccountLimitsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeAccountLimits\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeAccountLimitsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeAccountLimitsCommand)(output, context);\n }\n}\nexports.DescribeAccountLimitsCommand = DescribeAccountLimitsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeChangeSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeChangeSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeChangeSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeChangeSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeChangeSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeChangeSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeChangeSetCommand)(output, context);\n }\n}\nexports.DescribeChangeSetCommand = DescribeChangeSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeChangeSetHooksCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeChangeSetHooksCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeChangeSetHooksCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeChangeSetHooksCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeChangeSetHooks\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeChangeSetHooksCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeChangeSetHooksCommand)(output, context);\n }\n}\nexports.DescribeChangeSetHooksCommand = DescribeChangeSetHooksCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeOrganizationsAccessCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeOrganizationsAccessCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeOrganizationsAccessCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeOrganizationsAccessCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeOrganizationsAccess\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeOrganizationsAccessCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeOrganizationsAccessCommand)(output, context);\n }\n}\nexports.DescribeOrganizationsAccessCommand = DescribeOrganizationsAccessCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribePublisherCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribePublisherCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribePublisherCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribePublisherCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribePublisher\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribePublisherCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribePublisherCommand)(output, context);\n }\n}\nexports.DescribePublisherCommand = DescribePublisherCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackDriftDetectionStatusCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackDriftDetectionStatusCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackDriftDetectionStatusCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackDriftDetectionStatusCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackDriftDetectionStatus\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackDriftDetectionStatusCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackDriftDetectionStatusCommand)(output, context);\n }\n}\nexports.DescribeStackDriftDetectionStatusCommand = DescribeStackDriftDetectionStatusCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackEventsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackEventsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackEventsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackEventsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackEvents\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackEventsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackEventsCommand)(output, context);\n }\n}\nexports.DescribeStackEventsCommand = DescribeStackEventsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackInstanceCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackInstanceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackInstanceCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackInstanceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackInstance\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackInstanceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackInstanceCommand)(output, context);\n }\n}\nexports.DescribeStackInstanceCommand = DescribeStackInstanceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackResourceCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackResourceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackResourceCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackResourceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackResource\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackResourceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackResourceCommand)(output, context);\n }\n}\nexports.DescribeStackResourceCommand = DescribeStackResourceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackResourceDriftsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackResourceDriftsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackResourceDriftsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackResourceDriftsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackResourceDrifts\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackResourceDriftsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackResourceDriftsCommand)(output, context);\n }\n}\nexports.DescribeStackResourceDriftsCommand = DescribeStackResourceDriftsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackResourcesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackResourcesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackResourcesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackResourcesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackResources\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackResourcesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackResourcesCommand)(output, context);\n }\n}\nexports.DescribeStackResourcesCommand = DescribeStackResourcesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackSetCommand)(output, context);\n }\n}\nexports.DescribeStackSetCommand = DescribeStackSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackSetOperationCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackSetOperationCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackSetOperationCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackSetOperationCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackSetOperation\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackSetOperationCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackSetOperationCommand)(output, context);\n }\n}\nexports.DescribeStackSetOperationCommand = DescribeStackSetOperationCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStacksCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStacksCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStacksCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStacksCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStacks\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStacksCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStacksCommand)(output, context);\n }\n}\nexports.DescribeStacksCommand = DescribeStacksCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeTypeCommand)(output, context);\n }\n}\nexports.DescribeTypeCommand = DescribeTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeTypeRegistrationCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeTypeRegistrationCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeTypeRegistrationCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeTypeRegistrationCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeTypeRegistration\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeTypeRegistrationCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeTypeRegistrationCommand)(output, context);\n }\n}\nexports.DescribeTypeRegistrationCommand = DescribeTypeRegistrationCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DetectStackDriftCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DetectStackDriftCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DetectStackDriftCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DetectStackDriftCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DetectStackDrift\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DetectStackDriftCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DetectStackDriftCommand)(output, context);\n }\n}\nexports.DetectStackDriftCommand = DetectStackDriftCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DetectStackResourceDriftCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DetectStackResourceDriftCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DetectStackResourceDriftCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DetectStackResourceDriftCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DetectStackResourceDrift\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DetectStackResourceDriftCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DetectStackResourceDriftCommand)(output, context);\n }\n}\nexports.DetectStackResourceDriftCommand = DetectStackResourceDriftCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DetectStackSetDriftCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DetectStackSetDriftCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DetectStackSetDriftCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DetectStackSetDriftCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DetectStackSetDrift\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DetectStackSetDriftCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DetectStackSetDriftCommand)(output, context);\n }\n}\nexports.DetectStackSetDriftCommand = DetectStackSetDriftCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EstimateTemplateCostCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass EstimateTemplateCostCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, EstimateTemplateCostCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"EstimateTemplateCostCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"EstimateTemplateCost\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_EstimateTemplateCostCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_EstimateTemplateCostCommand)(output, context);\n }\n}\nexports.EstimateTemplateCostCommand = EstimateTemplateCostCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExecuteChangeSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ExecuteChangeSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ExecuteChangeSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ExecuteChangeSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ExecuteChangeSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ExecuteChangeSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ExecuteChangeSetCommand)(output, context);\n }\n}\nexports.ExecuteChangeSetCommand = ExecuteChangeSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetStackPolicyCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetStackPolicyCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetStackPolicyCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"GetStackPolicyCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"GetStackPolicy\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetStackPolicyCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetStackPolicyCommand)(output, context);\n }\n}\nexports.GetStackPolicyCommand = GetStackPolicyCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetTemplateCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetTemplateCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetTemplateCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"GetTemplateCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"GetTemplate\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetTemplateCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetTemplateCommand)(output, context);\n }\n}\nexports.GetTemplateCommand = GetTemplateCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetTemplateSummaryCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetTemplateSummaryCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetTemplateSummaryCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"GetTemplateSummaryCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"GetTemplateSummary\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetTemplateSummaryCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetTemplateSummaryCommand)(output, context);\n }\n}\nexports.GetTemplateSummaryCommand = GetTemplateSummaryCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ImportStacksToStackSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ImportStacksToStackSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ImportStacksToStackSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ImportStacksToStackSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ImportStacksToStackSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ImportStacksToStackSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ImportStacksToStackSetCommand)(output, context);\n }\n}\nexports.ImportStacksToStackSetCommand = ImportStacksToStackSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListChangeSetsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListChangeSetsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListChangeSetsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListChangeSetsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListChangeSets\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListChangeSetsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListChangeSetsCommand)(output, context);\n }\n}\nexports.ListChangeSetsCommand = ListChangeSetsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListExportsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListExportsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListExportsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListExportsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListExports\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListExportsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListExportsCommand)(output, context);\n }\n}\nexports.ListExportsCommand = ListExportsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListImportsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListImportsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListImportsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListImportsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListImports\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListImportsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListImportsCommand)(output, context);\n }\n}\nexports.ListImportsCommand = ListImportsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackInstanceResourceDriftsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackInstanceResourceDriftsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackInstanceResourceDriftsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackInstanceResourceDriftsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackInstanceResourceDrifts\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackInstanceResourceDriftsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackInstanceResourceDriftsCommand)(output, context);\n }\n}\nexports.ListStackInstanceResourceDriftsCommand = ListStackInstanceResourceDriftsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackInstancesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackInstancesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackInstancesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackInstancesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackInstances\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackInstancesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackInstancesCommand)(output, context);\n }\n}\nexports.ListStackInstancesCommand = ListStackInstancesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackResourcesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackResourcesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackResourcesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackResourcesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackResources\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackResourcesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackResourcesCommand)(output, context);\n }\n}\nexports.ListStackResourcesCommand = ListStackResourcesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackSetOperationResultsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackSetOperationResultsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackSetOperationResultsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackSetOperationResultsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackSetOperationResults\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackSetOperationResultsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackSetOperationResultsCommand)(output, context);\n }\n}\nexports.ListStackSetOperationResultsCommand = ListStackSetOperationResultsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackSetOperationsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackSetOperationsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackSetOperationsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackSetOperationsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackSetOperations\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackSetOperationsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackSetOperationsCommand)(output, context);\n }\n}\nexports.ListStackSetOperationsCommand = ListStackSetOperationsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackSetsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackSetsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackSetsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackSetsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackSets\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackSetsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackSetsCommand)(output, context);\n }\n}\nexports.ListStackSetsCommand = ListStackSetsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStacksCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStacksCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStacksCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStacksCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStacks\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStacksCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStacksCommand)(output, context);\n }\n}\nexports.ListStacksCommand = ListStacksCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListTypeRegistrationsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListTypeRegistrationsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListTypeRegistrationsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListTypeRegistrationsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListTypeRegistrations\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListTypeRegistrationsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListTypeRegistrationsCommand)(output, context);\n }\n}\nexports.ListTypeRegistrationsCommand = ListTypeRegistrationsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListTypeVersionsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListTypeVersionsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListTypeVersionsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListTypeVersionsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListTypeVersions\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListTypeVersionsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListTypeVersionsCommand)(output, context);\n }\n}\nexports.ListTypeVersionsCommand = ListTypeVersionsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListTypesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListTypesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListTypesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListTypesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListTypes\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListTypesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListTypesCommand)(output, context);\n }\n}\nexports.ListTypesCommand = ListTypesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PublishTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass PublishTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, PublishTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"PublishTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"PublishType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_PublishTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_PublishTypeCommand)(output, context);\n }\n}\nexports.PublishTypeCommand = PublishTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RecordHandlerProgressCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass RecordHandlerProgressCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, RecordHandlerProgressCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"RecordHandlerProgressCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"RecordHandlerProgress\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_RecordHandlerProgressCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_RecordHandlerProgressCommand)(output, context);\n }\n}\nexports.RecordHandlerProgressCommand = RecordHandlerProgressCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RegisterPublisherCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass RegisterPublisherCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, RegisterPublisherCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"RegisterPublisherCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"RegisterPublisher\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_RegisterPublisherCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_RegisterPublisherCommand)(output, context);\n }\n}\nexports.RegisterPublisherCommand = RegisterPublisherCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RegisterTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass RegisterTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, RegisterTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"RegisterTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"RegisterType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_RegisterTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_RegisterTypeCommand)(output, context);\n }\n}\nexports.RegisterTypeCommand = RegisterTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RollbackStackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass RollbackStackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, RollbackStackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"RollbackStackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"RollbackStack\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_RollbackStackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_RollbackStackCommand)(output, context);\n }\n}\nexports.RollbackStackCommand = RollbackStackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SetStackPolicyCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass SetStackPolicyCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SetStackPolicyCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"SetStackPolicyCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"SetStackPolicy\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_SetStackPolicyCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_SetStackPolicyCommand)(output, context);\n }\n}\nexports.SetStackPolicyCommand = SetStackPolicyCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SetTypeConfigurationCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass SetTypeConfigurationCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SetTypeConfigurationCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"SetTypeConfigurationCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"SetTypeConfiguration\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_SetTypeConfigurationCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_SetTypeConfigurationCommand)(output, context);\n }\n}\nexports.SetTypeConfigurationCommand = SetTypeConfigurationCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SetTypeDefaultVersionCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass SetTypeDefaultVersionCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SetTypeDefaultVersionCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"SetTypeDefaultVersionCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"SetTypeDefaultVersion\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_SetTypeDefaultVersionCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_SetTypeDefaultVersionCommand)(output, context);\n }\n}\nexports.SetTypeDefaultVersionCommand = SetTypeDefaultVersionCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SignalResourceCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass SignalResourceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SignalResourceCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"SignalResourceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"SignalResource\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_SignalResourceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_SignalResourceCommand)(output, context);\n }\n}\nexports.SignalResourceCommand = SignalResourceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StopStackSetOperationCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass StopStackSetOperationCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, StopStackSetOperationCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"StopStackSetOperationCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"StopStackSetOperation\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_StopStackSetOperationCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_StopStackSetOperationCommand)(output, context);\n }\n}\nexports.StopStackSetOperationCommand = StopStackSetOperationCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TestTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass TestTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, TestTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"TestTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"TestType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_TestTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_TestTypeCommand)(output, context);\n }\n}\nexports.TestTypeCommand = TestTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UpdateStackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass UpdateStackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UpdateStackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"UpdateStackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"UpdateStack\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_UpdateStackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_UpdateStackCommand)(output, context);\n }\n}\nexports.UpdateStackCommand = UpdateStackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UpdateStackInstancesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass UpdateStackInstancesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UpdateStackInstancesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"UpdateStackInstancesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"UpdateStackInstances\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_UpdateStackInstancesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_UpdateStackInstancesCommand)(output, context);\n }\n}\nexports.UpdateStackInstancesCommand = UpdateStackInstancesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UpdateStackSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass UpdateStackSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UpdateStackSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"UpdateStackSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"UpdateStackSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_UpdateStackSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_UpdateStackSetCommand)(output, context);\n }\n}\nexports.UpdateStackSetCommand = UpdateStackSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UpdateTerminationProtectionCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass UpdateTerminationProtectionCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UpdateTerminationProtectionCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"UpdateTerminationProtectionCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"UpdateTerminationProtection\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_UpdateTerminationProtectionCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_UpdateTerminationProtectionCommand)(output, context);\n }\n}\nexports.UpdateTerminationProtectionCommand = UpdateTerminationProtectionCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ValidateTemplateCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ValidateTemplateCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ValidateTemplateCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ValidateTemplateCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ValidateTemplate\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ValidateTemplateCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ValidateTemplateCommand)(output, context);\n }\n}\nexports.ValidateTemplateCommand = ValidateTemplateCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./ActivateOrganizationsAccessCommand\"), exports);\ntslib_1.__exportStar(require(\"./ActivateTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./BatchDescribeTypeConfigurationsCommand\"), exports);\ntslib_1.__exportStar(require(\"./CancelUpdateStackCommand\"), exports);\ntslib_1.__exportStar(require(\"./ContinueUpdateRollbackCommand\"), exports);\ntslib_1.__exportStar(require(\"./CreateChangeSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./CreateStackCommand\"), exports);\ntslib_1.__exportStar(require(\"./CreateStackInstancesCommand\"), exports);\ntslib_1.__exportStar(require(\"./CreateStackSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeactivateOrganizationsAccessCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeactivateTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteChangeSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteStackCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteStackInstancesCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteStackSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeregisterTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeAccountLimitsCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeChangeSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeChangeSetHooksCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeOrganizationsAccessCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribePublisherCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackDriftDetectionStatusCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackEventsCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackInstanceCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackResourceCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackResourceDriftsCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackResourcesCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackSetOperationCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStacksCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeTypeRegistrationCommand\"), exports);\ntslib_1.__exportStar(require(\"./DetectStackDriftCommand\"), exports);\ntslib_1.__exportStar(require(\"./DetectStackResourceDriftCommand\"), exports);\ntslib_1.__exportStar(require(\"./DetectStackSetDriftCommand\"), exports);\ntslib_1.__exportStar(require(\"./EstimateTemplateCostCommand\"), exports);\ntslib_1.__exportStar(require(\"./ExecuteChangeSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetStackPolicyCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetTemplateCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetTemplateSummaryCommand\"), exports);\ntslib_1.__exportStar(require(\"./ImportStacksToStackSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListChangeSetsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListExportsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListImportsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackInstanceResourceDriftsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackInstancesCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackResourcesCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetOperationResultsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetOperationsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStacksCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListTypeRegistrationsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListTypeVersionsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListTypesCommand\"), exports);\ntslib_1.__exportStar(require(\"./PublishTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./RecordHandlerProgressCommand\"), exports);\ntslib_1.__exportStar(require(\"./RegisterPublisherCommand\"), exports);\ntslib_1.__exportStar(require(\"./RegisterTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./RollbackStackCommand\"), exports);\ntslib_1.__exportStar(require(\"./SetStackPolicyCommand\"), exports);\ntslib_1.__exportStar(require(\"./SetTypeConfigurationCommand\"), exports);\ntslib_1.__exportStar(require(\"./SetTypeDefaultVersionCommand\"), exports);\ntslib_1.__exportStar(require(\"./SignalResourceCommand\"), exports);\ntslib_1.__exportStar(require(\"./StopStackSetOperationCommand\"), exports);\ntslib_1.__exportStar(require(\"./TestTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./UpdateStackCommand\"), exports);\ntslib_1.__exportStar(require(\"./UpdateStackInstancesCommand\"), exports);\ntslib_1.__exportStar(require(\"./UpdateStackSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./UpdateTerminationProtectionCommand\"), exports);\ntslib_1.__exportStar(require(\"./ValidateTemplateCommand\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveClientEndpointParameters = void 0;\nconst resolveClientEndpointParameters = (options) => {\n return {\n ...options,\n useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n useFipsEndpoint: options.useFipsEndpoint ?? false,\n defaultSigningName: \"cloudformation\",\n };\n};\nexports.resolveClientEndpointParameters = resolveClientEndpointParameters;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultEndpointResolver = void 0;\nconst util_endpoints_1 = require(\"@aws-sdk/util-endpoints\");\nconst ruleset_1 = require(\"./ruleset\");\nconst defaultEndpointResolver = (endpointParams, context = {}) => {\n return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, {\n endpointParams: endpointParams,\n logger: context.logger,\n });\n};\nexports.defaultEndpointResolver = defaultEndpointResolver;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ruleSet = void 0;\nconst u = \"required\", v = \"fn\", w = \"argv\", x = \"ref\";\nconst a = true, b = \"isSet\", c = \"booleanEquals\", d = \"error\", e = \"endpoint\", f = \"tree\", g = \"PartitionResult\", h = \"getAttr\", i = { [u]: false, \"type\": \"String\" }, j = { [u]: true, \"default\": false, \"type\": \"Boolean\" }, k = { [x]: \"Endpoint\" }, l = { [v]: c, [w]: [{ [x]: \"UseFIPS\" }, true] }, m = { [v]: c, [w]: [{ [x]: \"UseDualStack\" }, true] }, n = {}, o = { [v]: h, [w]: [{ [x]: g }, \"supportsFIPS\"] }, p = { [x]: g }, q = { [v]: c, [w]: [true, { [v]: h, [w]: [p, \"supportsDualStack\"] }] }, r = [l], s = [m], t = [{ [x]: \"Region\" }];\nconst _data = { version: \"1.0\", parameters: { Region: i, UseDualStack: j, UseFIPS: j, Endpoint: i }, rules: [{ conditions: [{ [v]: b, [w]: [k] }], rules: [{ conditions: r, error: \"Invalid Configuration: FIPS and custom endpoint are not supported\", type: d }, { conditions: s, error: \"Invalid Configuration: Dualstack and custom endpoint are not supported\", type: d }, { endpoint: { url: k, properties: n, headers: n }, type: e }], type: f }, { conditions: [{ [v]: b, [w]: t }], rules: [{ conditions: [{ [v]: \"aws.partition\", [w]: t, assign: g }], rules: [{ conditions: [l, m], rules: [{ conditions: [{ [v]: c, [w]: [a, o] }, q], rules: [{ endpoint: { url: \"https://cloudformation-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"FIPS and DualStack are enabled, but this partition does not support one or both\", type: d }], type: f }, { conditions: r, rules: [{ conditions: [{ [v]: c, [w]: [o, a] }], rules: [{ conditions: [{ [v]: \"stringEquals\", [w]: [{ [v]: h, [w]: [p, \"name\"] }, \"aws-us-gov\"] }], endpoint: { url: \"https://cloudformation.{Region}.amazonaws.com\", properties: n, headers: n }, type: e }, { endpoint: { url: \"https://cloudformation-fips.{Region}.{PartitionResult#dnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"FIPS is enabled but this partition does not support FIPS\", type: d }], type: f }, { conditions: s, rules: [{ conditions: [q], rules: [{ endpoint: { url: \"https://cloudformation.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"DualStack is enabled but this partition does not support DualStack\", type: d }], type: f }, { endpoint: { url: \"https://cloudformation.{Region}.{PartitionResult#dnsSuffix}\", properties: n, headers: n }, type: e }], type: f }], type: f }, { error: \"Invalid Configuration: Missing Region\", type: d }] };\nexports.ruleSet = _data;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CloudFormationServiceException = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./CloudFormationClient\"), exports);\ntslib_1.__exportStar(require(\"./CloudFormation\"), exports);\ntslib_1.__exportStar(require(\"./commands\"), exports);\ntslib_1.__exportStar(require(\"./pagination\"), exports);\ntslib_1.__exportStar(require(\"./waiters\"), exports);\ntslib_1.__exportStar(require(\"./models\"), exports);\nvar CloudFormationServiceException_1 = require(\"./models/CloudFormationServiceException\");\nObject.defineProperty(exports, \"CloudFormationServiceException\", { enumerable: true, get: function () { return CloudFormationServiceException_1.CloudFormationServiceException; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CloudFormationServiceException = exports.__ServiceException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__ServiceException\", { enumerable: true, get: function () { return smithy_client_1.ServiceException; } });\nclass CloudFormationServiceException extends smithy_client_1.ServiceException {\n constructor(options) {\n super(options);\n Object.setPrototypeOf(this, CloudFormationServiceException.prototype);\n }\n}\nexports.CloudFormationServiceException = CloudFormationServiceException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./models_0\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HookStatus = exports.StackDriftStatus = exports.StackDriftDetectionStatus = exports.PublisherStatus = exports.IdentityProvider = exports.OrganizationStatus = exports.RegistryType = exports.StackSetNotEmptyException = exports.InvalidChangeSetStatusException = exports.NameAlreadyExistsException = exports.PermissionModels = exports.CreatedButModifiedException = exports.StaleRequestException = exports.StackSetNotFoundException = exports.OperationInProgressException = exports.OperationIdAlreadyExistsException = exports.RegionConcurrencyType = exports.OnFailure = exports.LimitExceededException = exports.InsufficientCapabilitiesException = exports.OnStackFailure = exports.ChangeSetType = exports.ExecutionStatus = exports.ChangeSetStatus = exports.ChangeSetNotFoundException = exports.ChangeSetHooksStatus = exports.HookTargetType = exports.HookInvocationPoint = exports.HookFailureMode = exports.ChangeType = exports.Replacement = exports.RequiresRecreation = exports.ResourceAttribute = exports.EvaluationType = exports.ChangeSource = exports.ChangeAction = exports.Category = exports.Capability = exports.TokenAlreadyExistsException = exports.CallAs = exports.TypeConfigurationNotFoundException = exports.AlreadyExistsException = exports.TypeNotFoundException = exports.CFNRegistryException = exports.VersionBump = exports.ThirdPartyType = exports.OperationNotFoundException = exports.InvalidOperationException = exports.AccountGateStatus = exports.AccountFilterType = void 0;\nexports.ResourceSignalStatus = exports.HandlerErrorCode = exports.OperationStatus = exports.OperationStatusCheckFailedException = exports.InvalidStateTransitionException = exports.StackSetOperationResultStatus = exports.OperationResultFilterName = exports.StackInstanceFilterName = exports.StackNotFoundException = exports.TemplateStage = exports.RegistrationStatus = exports.Visibility = exports.TypeTestsStatus = exports.ProvisioningType = exports.DeprecatedStatus = exports.StackSetOperationStatus = exports.StackSetOperationAction = exports.StackSetStatus = exports.StackSetDriftStatus = exports.StackSetDriftDetectionStatus = exports.StackStatus = exports.DifferenceType = exports.StackResourceDriftStatus = exports.StackInstanceNotFoundException = exports.StackInstanceStatus = exports.StackInstanceDetailedStatus = exports.ResourceStatus = void 0;\nconst CloudFormationServiceException_1 = require(\"./CloudFormationServiceException\");\nexports.AccountFilterType = {\n DIFFERENCE: \"DIFFERENCE\",\n INTERSECTION: \"INTERSECTION\",\n NONE: \"NONE\",\n UNION: \"UNION\",\n};\nexports.AccountGateStatus = {\n FAILED: \"FAILED\",\n SKIPPED: \"SKIPPED\",\n SUCCEEDED: \"SUCCEEDED\",\n};\nclass InvalidOperationException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"InvalidOperationException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidOperationException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidOperationException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.InvalidOperationException = InvalidOperationException;\nclass OperationNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"OperationNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"OperationNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, OperationNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.OperationNotFoundException = OperationNotFoundException;\nexports.ThirdPartyType = {\n HOOK: \"HOOK\",\n MODULE: \"MODULE\",\n RESOURCE: \"RESOURCE\",\n};\nexports.VersionBump = {\n MAJOR: \"MAJOR\",\n MINOR: \"MINOR\",\n};\nclass CFNRegistryException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"CFNRegistryException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"CFNRegistryException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, CFNRegistryException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.CFNRegistryException = CFNRegistryException;\nclass TypeNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"TypeNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"TypeNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, TypeNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.TypeNotFoundException = TypeNotFoundException;\nclass AlreadyExistsException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"AlreadyExistsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"AlreadyExistsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, AlreadyExistsException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.AlreadyExistsException = AlreadyExistsException;\nclass TypeConfigurationNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"TypeConfigurationNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"TypeConfigurationNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, TypeConfigurationNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.TypeConfigurationNotFoundException = TypeConfigurationNotFoundException;\nexports.CallAs = {\n DELEGATED_ADMIN: \"DELEGATED_ADMIN\",\n SELF: \"SELF\",\n};\nclass TokenAlreadyExistsException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"TokenAlreadyExistsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"TokenAlreadyExistsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, TokenAlreadyExistsException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.TokenAlreadyExistsException = TokenAlreadyExistsException;\nexports.Capability = {\n CAPABILITY_AUTO_EXPAND: \"CAPABILITY_AUTO_EXPAND\",\n CAPABILITY_IAM: \"CAPABILITY_IAM\",\n CAPABILITY_NAMED_IAM: \"CAPABILITY_NAMED_IAM\",\n};\nexports.Category = {\n ACTIVATED: \"ACTIVATED\",\n AWS_TYPES: \"AWS_TYPES\",\n REGISTERED: \"REGISTERED\",\n THIRD_PARTY: \"THIRD_PARTY\",\n};\nexports.ChangeAction = {\n Add: \"Add\",\n Dynamic: \"Dynamic\",\n Import: \"Import\",\n Modify: \"Modify\",\n Remove: \"Remove\",\n};\nexports.ChangeSource = {\n Automatic: \"Automatic\",\n DirectModification: \"DirectModification\",\n ParameterReference: \"ParameterReference\",\n ResourceAttribute: \"ResourceAttribute\",\n ResourceReference: \"ResourceReference\",\n};\nexports.EvaluationType = {\n Dynamic: \"Dynamic\",\n Static: \"Static\",\n};\nexports.ResourceAttribute = {\n CreationPolicy: \"CreationPolicy\",\n DeletionPolicy: \"DeletionPolicy\",\n Metadata: \"Metadata\",\n Properties: \"Properties\",\n Tags: \"Tags\",\n UpdatePolicy: \"UpdatePolicy\",\n UpdateReplacePolicy: \"UpdateReplacePolicy\",\n};\nexports.RequiresRecreation = {\n Always: \"Always\",\n Conditionally: \"Conditionally\",\n Never: \"Never\",\n};\nexports.Replacement = {\n Conditional: \"Conditional\",\n False: \"False\",\n True: \"True\",\n};\nexports.ChangeType = {\n Resource: \"Resource\",\n};\nexports.HookFailureMode = {\n FAIL: \"FAIL\",\n WARN: \"WARN\",\n};\nexports.HookInvocationPoint = {\n PRE_PROVISION: \"PRE_PROVISION\",\n};\nexports.HookTargetType = {\n RESOURCE: \"RESOURCE\",\n};\nexports.ChangeSetHooksStatus = {\n PLANNED: \"PLANNED\",\n PLANNING: \"PLANNING\",\n UNAVAILABLE: \"UNAVAILABLE\",\n};\nclass ChangeSetNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"ChangeSetNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ChangeSetNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ChangeSetNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.ChangeSetNotFoundException = ChangeSetNotFoundException;\nexports.ChangeSetStatus = {\n CREATE_COMPLETE: \"CREATE_COMPLETE\",\n CREATE_IN_PROGRESS: \"CREATE_IN_PROGRESS\",\n CREATE_PENDING: \"CREATE_PENDING\",\n DELETE_COMPLETE: \"DELETE_COMPLETE\",\n DELETE_FAILED: \"DELETE_FAILED\",\n DELETE_IN_PROGRESS: \"DELETE_IN_PROGRESS\",\n DELETE_PENDING: \"DELETE_PENDING\",\n FAILED: \"FAILED\",\n};\nexports.ExecutionStatus = {\n AVAILABLE: \"AVAILABLE\",\n EXECUTE_COMPLETE: \"EXECUTE_COMPLETE\",\n EXECUTE_FAILED: \"EXECUTE_FAILED\",\n EXECUTE_IN_PROGRESS: \"EXECUTE_IN_PROGRESS\",\n OBSOLETE: \"OBSOLETE\",\n UNAVAILABLE: \"UNAVAILABLE\",\n};\nexports.ChangeSetType = {\n CREATE: \"CREATE\",\n IMPORT: \"IMPORT\",\n UPDATE: \"UPDATE\",\n};\nexports.OnStackFailure = {\n DELETE: \"DELETE\",\n DO_NOTHING: \"DO_NOTHING\",\n ROLLBACK: \"ROLLBACK\",\n};\nclass InsufficientCapabilitiesException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"InsufficientCapabilitiesException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InsufficientCapabilitiesException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InsufficientCapabilitiesException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.InsufficientCapabilitiesException = InsufficientCapabilitiesException;\nclass LimitExceededException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"LimitExceededException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"LimitExceededException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, LimitExceededException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.LimitExceededException = LimitExceededException;\nexports.OnFailure = {\n DELETE: \"DELETE\",\n DO_NOTHING: \"DO_NOTHING\",\n ROLLBACK: \"ROLLBACK\",\n};\nexports.RegionConcurrencyType = {\n PARALLEL: \"PARALLEL\",\n SEQUENTIAL: \"SEQUENTIAL\",\n};\nclass OperationIdAlreadyExistsException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"OperationIdAlreadyExistsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"OperationIdAlreadyExistsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, OperationIdAlreadyExistsException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.OperationIdAlreadyExistsException = OperationIdAlreadyExistsException;\nclass OperationInProgressException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"OperationInProgressException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"OperationInProgressException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, OperationInProgressException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.OperationInProgressException = OperationInProgressException;\nclass StackSetNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"StackSetNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"StackSetNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, StackSetNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.StackSetNotFoundException = StackSetNotFoundException;\nclass StaleRequestException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"StaleRequestException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"StaleRequestException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, StaleRequestException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.StaleRequestException = StaleRequestException;\nclass CreatedButModifiedException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"CreatedButModifiedException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"CreatedButModifiedException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, CreatedButModifiedException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.CreatedButModifiedException = CreatedButModifiedException;\nexports.PermissionModels = {\n SELF_MANAGED: \"SELF_MANAGED\",\n SERVICE_MANAGED: \"SERVICE_MANAGED\",\n};\nclass NameAlreadyExistsException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"NameAlreadyExistsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"NameAlreadyExistsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, NameAlreadyExistsException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.NameAlreadyExistsException = NameAlreadyExistsException;\nclass InvalidChangeSetStatusException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"InvalidChangeSetStatusException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidChangeSetStatusException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidChangeSetStatusException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.InvalidChangeSetStatusException = InvalidChangeSetStatusException;\nclass StackSetNotEmptyException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"StackSetNotEmptyException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"StackSetNotEmptyException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, StackSetNotEmptyException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.StackSetNotEmptyException = StackSetNotEmptyException;\nexports.RegistryType = {\n HOOK: \"HOOK\",\n MODULE: \"MODULE\",\n RESOURCE: \"RESOURCE\",\n};\nexports.OrganizationStatus = {\n DISABLED: \"DISABLED\",\n DISABLED_PERMANENTLY: \"DISABLED_PERMANENTLY\",\n ENABLED: \"ENABLED\",\n};\nexports.IdentityProvider = {\n AWS_Marketplace: \"AWS_Marketplace\",\n Bitbucket: \"Bitbucket\",\n GitHub: \"GitHub\",\n};\nexports.PublisherStatus = {\n UNVERIFIED: \"UNVERIFIED\",\n VERIFIED: \"VERIFIED\",\n};\nexports.StackDriftDetectionStatus = {\n DETECTION_COMPLETE: \"DETECTION_COMPLETE\",\n DETECTION_FAILED: \"DETECTION_FAILED\",\n DETECTION_IN_PROGRESS: \"DETECTION_IN_PROGRESS\",\n};\nexports.StackDriftStatus = {\n DRIFTED: \"DRIFTED\",\n IN_SYNC: \"IN_SYNC\",\n NOT_CHECKED: \"NOT_CHECKED\",\n UNKNOWN: \"UNKNOWN\",\n};\nexports.HookStatus = {\n HOOK_COMPLETE_FAILED: \"HOOK_COMPLETE_FAILED\",\n HOOK_COMPLETE_SUCCEEDED: \"HOOK_COMPLETE_SUCCEEDED\",\n HOOK_FAILED: \"HOOK_FAILED\",\n HOOK_IN_PROGRESS: \"HOOK_IN_PROGRESS\",\n};\nexports.ResourceStatus = {\n CREATE_COMPLETE: \"CREATE_COMPLETE\",\n CREATE_FAILED: \"CREATE_FAILED\",\n CREATE_IN_PROGRESS: \"CREATE_IN_PROGRESS\",\n DELETE_COMPLETE: \"DELETE_COMPLETE\",\n DELETE_FAILED: \"DELETE_FAILED\",\n DELETE_IN_PROGRESS: \"DELETE_IN_PROGRESS\",\n DELETE_SKIPPED: \"DELETE_SKIPPED\",\n IMPORT_COMPLETE: \"IMPORT_COMPLETE\",\n IMPORT_FAILED: \"IMPORT_FAILED\",\n IMPORT_IN_PROGRESS: \"IMPORT_IN_PROGRESS\",\n IMPORT_ROLLBACK_COMPLETE: \"IMPORT_ROLLBACK_COMPLETE\",\n IMPORT_ROLLBACK_FAILED: \"IMPORT_ROLLBACK_FAILED\",\n IMPORT_ROLLBACK_IN_PROGRESS: \"IMPORT_ROLLBACK_IN_PROGRESS\",\n ROLLBACK_COMPLETE: \"ROLLBACK_COMPLETE\",\n ROLLBACK_FAILED: \"ROLLBACK_FAILED\",\n ROLLBACK_IN_PROGRESS: \"ROLLBACK_IN_PROGRESS\",\n UPDATE_COMPLETE: \"UPDATE_COMPLETE\",\n UPDATE_FAILED: \"UPDATE_FAILED\",\n UPDATE_IN_PROGRESS: \"UPDATE_IN_PROGRESS\",\n UPDATE_ROLLBACK_COMPLETE: \"UPDATE_ROLLBACK_COMPLETE\",\n UPDATE_ROLLBACK_FAILED: \"UPDATE_ROLLBACK_FAILED\",\n UPDATE_ROLLBACK_IN_PROGRESS: \"UPDATE_ROLLBACK_IN_PROGRESS\",\n};\nexports.StackInstanceDetailedStatus = {\n CANCELLED: \"CANCELLED\",\n FAILED: \"FAILED\",\n INOPERABLE: \"INOPERABLE\",\n PENDING: \"PENDING\",\n RUNNING: \"RUNNING\",\n SKIPPED_SUSPENDED_ACCOUNT: \"SKIPPED_SUSPENDED_ACCOUNT\",\n SUCCEEDED: \"SUCCEEDED\",\n};\nexports.StackInstanceStatus = {\n CURRENT: \"CURRENT\",\n INOPERABLE: \"INOPERABLE\",\n OUTDATED: \"OUTDATED\",\n};\nclass StackInstanceNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"StackInstanceNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"StackInstanceNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, StackInstanceNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.StackInstanceNotFoundException = StackInstanceNotFoundException;\nexports.StackResourceDriftStatus = {\n DELETED: \"DELETED\",\n IN_SYNC: \"IN_SYNC\",\n MODIFIED: \"MODIFIED\",\n NOT_CHECKED: \"NOT_CHECKED\",\n};\nexports.DifferenceType = {\n ADD: \"ADD\",\n NOT_EQUAL: \"NOT_EQUAL\",\n REMOVE: \"REMOVE\",\n};\nexports.StackStatus = {\n CREATE_COMPLETE: \"CREATE_COMPLETE\",\n CREATE_FAILED: \"CREATE_FAILED\",\n CREATE_IN_PROGRESS: \"CREATE_IN_PROGRESS\",\n DELETE_COMPLETE: \"DELETE_COMPLETE\",\n DELETE_FAILED: \"DELETE_FAILED\",\n DELETE_IN_PROGRESS: \"DELETE_IN_PROGRESS\",\n IMPORT_COMPLETE: \"IMPORT_COMPLETE\",\n IMPORT_IN_PROGRESS: \"IMPORT_IN_PROGRESS\",\n IMPORT_ROLLBACK_COMPLETE: \"IMPORT_ROLLBACK_COMPLETE\",\n IMPORT_ROLLBACK_FAILED: \"IMPORT_ROLLBACK_FAILED\",\n IMPORT_ROLLBACK_IN_PROGRESS: \"IMPORT_ROLLBACK_IN_PROGRESS\",\n REVIEW_IN_PROGRESS: \"REVIEW_IN_PROGRESS\",\n ROLLBACK_COMPLETE: \"ROLLBACK_COMPLETE\",\n ROLLBACK_FAILED: \"ROLLBACK_FAILED\",\n ROLLBACK_IN_PROGRESS: \"ROLLBACK_IN_PROGRESS\",\n UPDATE_COMPLETE: \"UPDATE_COMPLETE\",\n UPDATE_COMPLETE_CLEANUP_IN_PROGRESS: \"UPDATE_COMPLETE_CLEANUP_IN_PROGRESS\",\n UPDATE_FAILED: \"UPDATE_FAILED\",\n UPDATE_IN_PROGRESS: \"UPDATE_IN_PROGRESS\",\n UPDATE_ROLLBACK_COMPLETE: \"UPDATE_ROLLBACK_COMPLETE\",\n UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS: \"UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS\",\n UPDATE_ROLLBACK_FAILED: \"UPDATE_ROLLBACK_FAILED\",\n UPDATE_ROLLBACK_IN_PROGRESS: \"UPDATE_ROLLBACK_IN_PROGRESS\",\n};\nexports.StackSetDriftDetectionStatus = {\n COMPLETED: \"COMPLETED\",\n FAILED: \"FAILED\",\n IN_PROGRESS: \"IN_PROGRESS\",\n PARTIAL_SUCCESS: \"PARTIAL_SUCCESS\",\n STOPPED: \"STOPPED\",\n};\nexports.StackSetDriftStatus = {\n DRIFTED: \"DRIFTED\",\n IN_SYNC: \"IN_SYNC\",\n NOT_CHECKED: \"NOT_CHECKED\",\n};\nexports.StackSetStatus = {\n ACTIVE: \"ACTIVE\",\n DELETED: \"DELETED\",\n};\nexports.StackSetOperationAction = {\n CREATE: \"CREATE\",\n DELETE: \"DELETE\",\n DETECT_DRIFT: \"DETECT_DRIFT\",\n UPDATE: \"UPDATE\",\n};\nexports.StackSetOperationStatus = {\n FAILED: \"FAILED\",\n QUEUED: \"QUEUED\",\n RUNNING: \"RUNNING\",\n STOPPED: \"STOPPED\",\n STOPPING: \"STOPPING\",\n SUCCEEDED: \"SUCCEEDED\",\n};\nexports.DeprecatedStatus = {\n DEPRECATED: \"DEPRECATED\",\n LIVE: \"LIVE\",\n};\nexports.ProvisioningType = {\n FULLY_MUTABLE: \"FULLY_MUTABLE\",\n IMMUTABLE: \"IMMUTABLE\",\n NON_PROVISIONABLE: \"NON_PROVISIONABLE\",\n};\nexports.TypeTestsStatus = {\n FAILED: \"FAILED\",\n IN_PROGRESS: \"IN_PROGRESS\",\n NOT_TESTED: \"NOT_TESTED\",\n PASSED: \"PASSED\",\n};\nexports.Visibility = {\n PRIVATE: \"PRIVATE\",\n PUBLIC: \"PUBLIC\",\n};\nexports.RegistrationStatus = {\n COMPLETE: \"COMPLETE\",\n FAILED: \"FAILED\",\n IN_PROGRESS: \"IN_PROGRESS\",\n};\nexports.TemplateStage = {\n Original: \"Original\",\n Processed: \"Processed\",\n};\nclass StackNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"StackNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"StackNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, StackNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.StackNotFoundException = StackNotFoundException;\nexports.StackInstanceFilterName = {\n DETAILED_STATUS: \"DETAILED_STATUS\",\n DRIFT_STATUS: \"DRIFT_STATUS\",\n LAST_OPERATION_ID: \"LAST_OPERATION_ID\",\n};\nexports.OperationResultFilterName = {\n OPERATION_RESULT_STATUS: \"OPERATION_RESULT_STATUS\",\n};\nexports.StackSetOperationResultStatus = {\n CANCELLED: \"CANCELLED\",\n FAILED: \"FAILED\",\n PENDING: \"PENDING\",\n RUNNING: \"RUNNING\",\n SUCCEEDED: \"SUCCEEDED\",\n};\nclass InvalidStateTransitionException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"InvalidStateTransitionException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidStateTransitionException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidStateTransitionException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.InvalidStateTransitionException = InvalidStateTransitionException;\nclass OperationStatusCheckFailedException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"OperationStatusCheckFailedException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"OperationStatusCheckFailedException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, OperationStatusCheckFailedException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.OperationStatusCheckFailedException = OperationStatusCheckFailedException;\nexports.OperationStatus = {\n FAILED: \"FAILED\",\n IN_PROGRESS: \"IN_PROGRESS\",\n PENDING: \"PENDING\",\n SUCCESS: \"SUCCESS\",\n};\nexports.HandlerErrorCode = {\n AccessDenied: \"AccessDenied\",\n AlreadyExists: \"AlreadyExists\",\n GeneralServiceException: \"GeneralServiceException\",\n HandlerInternalFailure: \"HandlerInternalFailure\",\n InternalFailure: \"InternalFailure\",\n InvalidCredentials: \"InvalidCredentials\",\n InvalidRequest: \"InvalidRequest\",\n InvalidTypeConfiguration: \"InvalidTypeConfiguration\",\n NetworkFailure: \"NetworkFailure\",\n NonCompliant: \"NonCompliant\",\n NotFound: \"NotFound\",\n NotUpdatable: \"NotUpdatable\",\n ResourceConflict: \"ResourceConflict\",\n ServiceInternalError: \"ServiceInternalError\",\n ServiceLimitExceeded: \"ServiceLimitExceeded\",\n ServiceTimeout: \"NotStabilized\",\n Throttling: \"Throttling\",\n Unknown: \"Unknown\",\n UnsupportedTarget: \"UnsupportedTarget\",\n};\nexports.ResourceSignalStatus = {\n FAILURE: \"FAILURE\",\n SUCCESS: \"SUCCESS\",\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateDescribeAccountLimits = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst DescribeAccountLimitsCommand_1 = require(\"../commands/DescribeAccountLimitsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new DescribeAccountLimitsCommand_1.DescribeAccountLimitsCommand(input), ...args);\n};\nasync function* paginateDescribeAccountLimits(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateDescribeAccountLimits = paginateDescribeAccountLimits;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateDescribeStackEvents = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst DescribeStackEventsCommand_1 = require(\"../commands/DescribeStackEventsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new DescribeStackEventsCommand_1.DescribeStackEventsCommand(input), ...args);\n};\nasync function* paginateDescribeStackEvents(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateDescribeStackEvents = paginateDescribeStackEvents;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateDescribeStackResourceDrifts = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst DescribeStackResourceDriftsCommand_1 = require(\"../commands/DescribeStackResourceDriftsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new DescribeStackResourceDriftsCommand_1.DescribeStackResourceDriftsCommand(input), ...args);\n};\nasync function* paginateDescribeStackResourceDrifts(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateDescribeStackResourceDrifts = paginateDescribeStackResourceDrifts;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateDescribeStacks = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input), ...args);\n};\nasync function* paginateDescribeStacks(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateDescribeStacks = paginateDescribeStacks;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListChangeSets = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListChangeSetsCommand_1 = require(\"../commands/ListChangeSetsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListChangeSetsCommand_1.ListChangeSetsCommand(input), ...args);\n};\nasync function* paginateListChangeSets(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListChangeSets = paginateListChangeSets;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListExports = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListExportsCommand_1 = require(\"../commands/ListExportsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListExportsCommand_1.ListExportsCommand(input), ...args);\n};\nasync function* paginateListExports(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListExports = paginateListExports;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListImports = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListImportsCommand_1 = require(\"../commands/ListImportsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListImportsCommand_1.ListImportsCommand(input), ...args);\n};\nasync function* paginateListImports(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListImports = paginateListImports;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStackInstances = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStackInstancesCommand_1 = require(\"../commands/ListStackInstancesCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStackInstancesCommand_1.ListStackInstancesCommand(input), ...args);\n};\nasync function* paginateListStackInstances(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStackInstances = paginateListStackInstances;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStackResources = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStackResourcesCommand_1 = require(\"../commands/ListStackResourcesCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStackResourcesCommand_1.ListStackResourcesCommand(input), ...args);\n};\nasync function* paginateListStackResources(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStackResources = paginateListStackResources;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStackSetOperationResults = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStackSetOperationResultsCommand_1 = require(\"../commands/ListStackSetOperationResultsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStackSetOperationResultsCommand_1.ListStackSetOperationResultsCommand(input), ...args);\n};\nasync function* paginateListStackSetOperationResults(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStackSetOperationResults = paginateListStackSetOperationResults;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStackSetOperations = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStackSetOperationsCommand_1 = require(\"../commands/ListStackSetOperationsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStackSetOperationsCommand_1.ListStackSetOperationsCommand(input), ...args);\n};\nasync function* paginateListStackSetOperations(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStackSetOperations = paginateListStackSetOperations;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStackSets = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStackSetsCommand_1 = require(\"../commands/ListStackSetsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStackSetsCommand_1.ListStackSetsCommand(input), ...args);\n};\nasync function* paginateListStackSets(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStackSets = paginateListStackSets;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStacks = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStacksCommand_1 = require(\"../commands/ListStacksCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStacksCommand_1.ListStacksCommand(input), ...args);\n};\nasync function* paginateListStacks(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStacks = paginateListStacks;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListTypeRegistrations = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListTypeRegistrationsCommand_1 = require(\"../commands/ListTypeRegistrationsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListTypeRegistrationsCommand_1.ListTypeRegistrationsCommand(input), ...args);\n};\nasync function* paginateListTypeRegistrations(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListTypeRegistrations = paginateListTypeRegistrations;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListTypeVersions = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListTypeVersionsCommand_1 = require(\"../commands/ListTypeVersionsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListTypeVersionsCommand_1.ListTypeVersionsCommand(input), ...args);\n};\nasync function* paginateListTypeVersions(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListTypeVersions = paginateListTypeVersions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListTypes = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListTypesCommand_1 = require(\"../commands/ListTypesCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListTypesCommand_1.ListTypesCommand(input), ...args);\n};\nasync function* paginateListTypes(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListTypes = paginateListTypes;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./DescribeAccountLimitsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackEventsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackResourceDriftsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStacksPaginator\"), exports);\ntslib_1.__exportStar(require(\"./Interfaces\"), exports);\ntslib_1.__exportStar(require(\"./ListChangeSetsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListExportsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListImportsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStackInstancesPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStackResourcesPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetOperationResultsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetOperationsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStacksPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListTypeRegistrationsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListTypeVersionsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListTypesPaginator\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.se_ListStackSetOperationsCommand = exports.se_ListStackSetOperationResultsCommand = exports.se_ListStacksCommand = exports.se_ListStackResourcesCommand = exports.se_ListStackInstancesCommand = exports.se_ListStackInstanceResourceDriftsCommand = exports.se_ListImportsCommand = exports.se_ListExportsCommand = exports.se_ListChangeSetsCommand = exports.se_ImportStacksToStackSetCommand = exports.se_GetTemplateSummaryCommand = exports.se_GetTemplateCommand = exports.se_GetStackPolicyCommand = exports.se_ExecuteChangeSetCommand = exports.se_EstimateTemplateCostCommand = exports.se_DetectStackSetDriftCommand = exports.se_DetectStackResourceDriftCommand = exports.se_DetectStackDriftCommand = exports.se_DescribeTypeRegistrationCommand = exports.se_DescribeTypeCommand = exports.se_DescribeStackSetOperationCommand = exports.se_DescribeStackSetCommand = exports.se_DescribeStacksCommand = exports.se_DescribeStackResourcesCommand = exports.se_DescribeStackResourceDriftsCommand = exports.se_DescribeStackResourceCommand = exports.se_DescribeStackInstanceCommand = exports.se_DescribeStackEventsCommand = exports.se_DescribeStackDriftDetectionStatusCommand = exports.se_DescribePublisherCommand = exports.se_DescribeOrganizationsAccessCommand = exports.se_DescribeChangeSetHooksCommand = exports.se_DescribeChangeSetCommand = exports.se_DescribeAccountLimitsCommand = exports.se_DeregisterTypeCommand = exports.se_DeleteStackSetCommand = exports.se_DeleteStackInstancesCommand = exports.se_DeleteStackCommand = exports.se_DeleteChangeSetCommand = exports.se_DeactivateTypeCommand = exports.se_DeactivateOrganizationsAccessCommand = exports.se_CreateStackSetCommand = exports.se_CreateStackInstancesCommand = exports.se_CreateStackCommand = exports.se_CreateChangeSetCommand = exports.se_ContinueUpdateRollbackCommand = exports.se_CancelUpdateStackCommand = exports.se_BatchDescribeTypeConfigurationsCommand = exports.se_ActivateTypeCommand = exports.se_ActivateOrganizationsAccessCommand = void 0;\nexports.de_DescribeStackSetOperationCommand = exports.de_DescribeStackSetCommand = exports.de_DescribeStacksCommand = exports.de_DescribeStackResourcesCommand = exports.de_DescribeStackResourceDriftsCommand = exports.de_DescribeStackResourceCommand = exports.de_DescribeStackInstanceCommand = exports.de_DescribeStackEventsCommand = exports.de_DescribeStackDriftDetectionStatusCommand = exports.de_DescribePublisherCommand = exports.de_DescribeOrganizationsAccessCommand = exports.de_DescribeChangeSetHooksCommand = exports.de_DescribeChangeSetCommand = exports.de_DescribeAccountLimitsCommand = exports.de_DeregisterTypeCommand = exports.de_DeleteStackSetCommand = exports.de_DeleteStackInstancesCommand = exports.de_DeleteStackCommand = exports.de_DeleteChangeSetCommand = exports.de_DeactivateTypeCommand = exports.de_DeactivateOrganizationsAccessCommand = exports.de_CreateStackSetCommand = exports.de_CreateStackInstancesCommand = exports.de_CreateStackCommand = exports.de_CreateChangeSetCommand = exports.de_ContinueUpdateRollbackCommand = exports.de_CancelUpdateStackCommand = exports.de_BatchDescribeTypeConfigurationsCommand = exports.de_ActivateTypeCommand = exports.de_ActivateOrganizationsAccessCommand = exports.se_ValidateTemplateCommand = exports.se_UpdateTerminationProtectionCommand = exports.se_UpdateStackSetCommand = exports.se_UpdateStackInstancesCommand = exports.se_UpdateStackCommand = exports.se_TestTypeCommand = exports.se_StopStackSetOperationCommand = exports.se_SignalResourceCommand = exports.se_SetTypeDefaultVersionCommand = exports.se_SetTypeConfigurationCommand = exports.se_SetStackPolicyCommand = exports.se_RollbackStackCommand = exports.se_RegisterTypeCommand = exports.se_RegisterPublisherCommand = exports.se_RecordHandlerProgressCommand = exports.se_PublishTypeCommand = exports.se_ListTypeVersionsCommand = exports.se_ListTypesCommand = exports.se_ListTypeRegistrationsCommand = exports.se_ListStackSetsCommand = void 0;\nexports.de_ValidateTemplateCommand = exports.de_UpdateTerminationProtectionCommand = exports.de_UpdateStackSetCommand = exports.de_UpdateStackInstancesCommand = exports.de_UpdateStackCommand = exports.de_TestTypeCommand = exports.de_StopStackSetOperationCommand = exports.de_SignalResourceCommand = exports.de_SetTypeDefaultVersionCommand = exports.de_SetTypeConfigurationCommand = exports.de_SetStackPolicyCommand = exports.de_RollbackStackCommand = exports.de_RegisterTypeCommand = exports.de_RegisterPublisherCommand = exports.de_RecordHandlerProgressCommand = exports.de_PublishTypeCommand = exports.de_ListTypeVersionsCommand = exports.de_ListTypesCommand = exports.de_ListTypeRegistrationsCommand = exports.de_ListStackSetsCommand = exports.de_ListStackSetOperationsCommand = exports.de_ListStackSetOperationResultsCommand = exports.de_ListStacksCommand = exports.de_ListStackResourcesCommand = exports.de_ListStackInstancesCommand = exports.de_ListStackInstanceResourceDriftsCommand = exports.de_ListImportsCommand = exports.de_ListExportsCommand = exports.de_ListChangeSetsCommand = exports.de_ImportStacksToStackSetCommand = exports.de_GetTemplateSummaryCommand = exports.de_GetTemplateCommand = exports.de_GetStackPolicyCommand = exports.de_ExecuteChangeSetCommand = exports.de_EstimateTemplateCostCommand = exports.de_DetectStackSetDriftCommand = exports.de_DetectStackResourceDriftCommand = exports.de_DetectStackDriftCommand = exports.de_DescribeTypeRegistrationCommand = exports.de_DescribeTypeCommand = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst fast_xml_parser_1 = require(\"fast-xml-parser\");\nconst uuid_1 = require(\"uuid\");\nconst CloudFormationServiceException_1 = require(\"../models/CloudFormationServiceException\");\nconst models_0_1 = require(\"../models/models_0\");\nconst se_ActivateOrganizationsAccessCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ActivateOrganizationsAccessInput(input, context),\n Action: \"ActivateOrganizationsAccess\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ActivateOrganizationsAccessCommand = se_ActivateOrganizationsAccessCommand;\nconst se_ActivateTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ActivateTypeInput(input, context),\n Action: \"ActivateType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ActivateTypeCommand = se_ActivateTypeCommand;\nconst se_BatchDescribeTypeConfigurationsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_BatchDescribeTypeConfigurationsInput(input, context),\n Action: \"BatchDescribeTypeConfigurations\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_BatchDescribeTypeConfigurationsCommand = se_BatchDescribeTypeConfigurationsCommand;\nconst se_CancelUpdateStackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_CancelUpdateStackInput(input, context),\n Action: \"CancelUpdateStack\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CancelUpdateStackCommand = se_CancelUpdateStackCommand;\nconst se_ContinueUpdateRollbackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ContinueUpdateRollbackInput(input, context),\n Action: \"ContinueUpdateRollback\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ContinueUpdateRollbackCommand = se_ContinueUpdateRollbackCommand;\nconst se_CreateChangeSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_CreateChangeSetInput(input, context),\n Action: \"CreateChangeSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CreateChangeSetCommand = se_CreateChangeSetCommand;\nconst se_CreateStackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_CreateStackInput(input, context),\n Action: \"CreateStack\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CreateStackCommand = se_CreateStackCommand;\nconst se_CreateStackInstancesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_CreateStackInstancesInput(input, context),\n Action: \"CreateStackInstances\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CreateStackInstancesCommand = se_CreateStackInstancesCommand;\nconst se_CreateStackSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_CreateStackSetInput(input, context),\n Action: \"CreateStackSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CreateStackSetCommand = se_CreateStackSetCommand;\nconst se_DeactivateOrganizationsAccessCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeactivateOrganizationsAccessInput(input, context),\n Action: \"DeactivateOrganizationsAccess\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeactivateOrganizationsAccessCommand = se_DeactivateOrganizationsAccessCommand;\nconst se_DeactivateTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeactivateTypeInput(input, context),\n Action: \"DeactivateType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeactivateTypeCommand = se_DeactivateTypeCommand;\nconst se_DeleteChangeSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeleteChangeSetInput(input, context),\n Action: \"DeleteChangeSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteChangeSetCommand = se_DeleteChangeSetCommand;\nconst se_DeleteStackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeleteStackInput(input, context),\n Action: \"DeleteStack\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteStackCommand = se_DeleteStackCommand;\nconst se_DeleteStackInstancesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeleteStackInstancesInput(input, context),\n Action: \"DeleteStackInstances\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteStackInstancesCommand = se_DeleteStackInstancesCommand;\nconst se_DeleteStackSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeleteStackSetInput(input, context),\n Action: \"DeleteStackSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteStackSetCommand = se_DeleteStackSetCommand;\nconst se_DeregisterTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeregisterTypeInput(input, context),\n Action: \"DeregisterType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeregisterTypeCommand = se_DeregisterTypeCommand;\nconst se_DescribeAccountLimitsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeAccountLimitsInput(input, context),\n Action: \"DescribeAccountLimits\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeAccountLimitsCommand = se_DescribeAccountLimitsCommand;\nconst se_DescribeChangeSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeChangeSetInput(input, context),\n Action: \"DescribeChangeSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeChangeSetCommand = se_DescribeChangeSetCommand;\nconst se_DescribeChangeSetHooksCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeChangeSetHooksInput(input, context),\n Action: \"DescribeChangeSetHooks\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeChangeSetHooksCommand = se_DescribeChangeSetHooksCommand;\nconst se_DescribeOrganizationsAccessCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeOrganizationsAccessInput(input, context),\n Action: \"DescribeOrganizationsAccess\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeOrganizationsAccessCommand = se_DescribeOrganizationsAccessCommand;\nconst se_DescribePublisherCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribePublisherInput(input, context),\n Action: \"DescribePublisher\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribePublisherCommand = se_DescribePublisherCommand;\nconst se_DescribeStackDriftDetectionStatusCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackDriftDetectionStatusInput(input, context),\n Action: \"DescribeStackDriftDetectionStatus\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackDriftDetectionStatusCommand = se_DescribeStackDriftDetectionStatusCommand;\nconst se_DescribeStackEventsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackEventsInput(input, context),\n Action: \"DescribeStackEvents\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackEventsCommand = se_DescribeStackEventsCommand;\nconst se_DescribeStackInstanceCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackInstanceInput(input, context),\n Action: \"DescribeStackInstance\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackInstanceCommand = se_DescribeStackInstanceCommand;\nconst se_DescribeStackResourceCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackResourceInput(input, context),\n Action: \"DescribeStackResource\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackResourceCommand = se_DescribeStackResourceCommand;\nconst se_DescribeStackResourceDriftsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackResourceDriftsInput(input, context),\n Action: \"DescribeStackResourceDrifts\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackResourceDriftsCommand = se_DescribeStackResourceDriftsCommand;\nconst se_DescribeStackResourcesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackResourcesInput(input, context),\n Action: \"DescribeStackResources\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackResourcesCommand = se_DescribeStackResourcesCommand;\nconst se_DescribeStacksCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStacksInput(input, context),\n Action: \"DescribeStacks\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStacksCommand = se_DescribeStacksCommand;\nconst se_DescribeStackSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackSetInput(input, context),\n Action: \"DescribeStackSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackSetCommand = se_DescribeStackSetCommand;\nconst se_DescribeStackSetOperationCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackSetOperationInput(input, context),\n Action: \"DescribeStackSetOperation\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackSetOperationCommand = se_DescribeStackSetOperationCommand;\nconst se_DescribeTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeTypeInput(input, context),\n Action: \"DescribeType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeTypeCommand = se_DescribeTypeCommand;\nconst se_DescribeTypeRegistrationCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeTypeRegistrationInput(input, context),\n Action: \"DescribeTypeRegistration\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeTypeRegistrationCommand = se_DescribeTypeRegistrationCommand;\nconst se_DetectStackDriftCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DetectStackDriftInput(input, context),\n Action: \"DetectStackDrift\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DetectStackDriftCommand = se_DetectStackDriftCommand;\nconst se_DetectStackResourceDriftCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DetectStackResourceDriftInput(input, context),\n Action: \"DetectStackResourceDrift\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DetectStackResourceDriftCommand = se_DetectStackResourceDriftCommand;\nconst se_DetectStackSetDriftCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DetectStackSetDriftInput(input, context),\n Action: \"DetectStackSetDrift\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DetectStackSetDriftCommand = se_DetectStackSetDriftCommand;\nconst se_EstimateTemplateCostCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_EstimateTemplateCostInput(input, context),\n Action: \"EstimateTemplateCost\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_EstimateTemplateCostCommand = se_EstimateTemplateCostCommand;\nconst se_ExecuteChangeSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ExecuteChangeSetInput(input, context),\n Action: \"ExecuteChangeSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ExecuteChangeSetCommand = se_ExecuteChangeSetCommand;\nconst se_GetStackPolicyCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetStackPolicyInput(input, context),\n Action: \"GetStackPolicy\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetStackPolicyCommand = se_GetStackPolicyCommand;\nconst se_GetTemplateCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetTemplateInput(input, context),\n Action: \"GetTemplate\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetTemplateCommand = se_GetTemplateCommand;\nconst se_GetTemplateSummaryCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetTemplateSummaryInput(input, context),\n Action: \"GetTemplateSummary\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetTemplateSummaryCommand = se_GetTemplateSummaryCommand;\nconst se_ImportStacksToStackSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ImportStacksToStackSetInput(input, context),\n Action: \"ImportStacksToStackSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ImportStacksToStackSetCommand = se_ImportStacksToStackSetCommand;\nconst se_ListChangeSetsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListChangeSetsInput(input, context),\n Action: \"ListChangeSets\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListChangeSetsCommand = se_ListChangeSetsCommand;\nconst se_ListExportsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListExportsInput(input, context),\n Action: \"ListExports\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListExportsCommand = se_ListExportsCommand;\nconst se_ListImportsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListImportsInput(input, context),\n Action: \"ListImports\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListImportsCommand = se_ListImportsCommand;\nconst se_ListStackInstanceResourceDriftsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackInstanceResourceDriftsInput(input, context),\n Action: \"ListStackInstanceResourceDrifts\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackInstanceResourceDriftsCommand = se_ListStackInstanceResourceDriftsCommand;\nconst se_ListStackInstancesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackInstancesInput(input, context),\n Action: \"ListStackInstances\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackInstancesCommand = se_ListStackInstancesCommand;\nconst se_ListStackResourcesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackResourcesInput(input, context),\n Action: \"ListStackResources\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackResourcesCommand = se_ListStackResourcesCommand;\nconst se_ListStacksCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStacksInput(input, context),\n Action: \"ListStacks\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStacksCommand = se_ListStacksCommand;\nconst se_ListStackSetOperationResultsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackSetOperationResultsInput(input, context),\n Action: \"ListStackSetOperationResults\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackSetOperationResultsCommand = se_ListStackSetOperationResultsCommand;\nconst se_ListStackSetOperationsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackSetOperationsInput(input, context),\n Action: \"ListStackSetOperations\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackSetOperationsCommand = se_ListStackSetOperationsCommand;\nconst se_ListStackSetsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackSetsInput(input, context),\n Action: \"ListStackSets\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackSetsCommand = se_ListStackSetsCommand;\nconst se_ListTypeRegistrationsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListTypeRegistrationsInput(input, context),\n Action: \"ListTypeRegistrations\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListTypeRegistrationsCommand = se_ListTypeRegistrationsCommand;\nconst se_ListTypesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListTypesInput(input, context),\n Action: \"ListTypes\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListTypesCommand = se_ListTypesCommand;\nconst se_ListTypeVersionsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListTypeVersionsInput(input, context),\n Action: \"ListTypeVersions\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListTypeVersionsCommand = se_ListTypeVersionsCommand;\nconst se_PublishTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_PublishTypeInput(input, context),\n Action: \"PublishType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_PublishTypeCommand = se_PublishTypeCommand;\nconst se_RecordHandlerProgressCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_RecordHandlerProgressInput(input, context),\n Action: \"RecordHandlerProgress\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_RecordHandlerProgressCommand = se_RecordHandlerProgressCommand;\nconst se_RegisterPublisherCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_RegisterPublisherInput(input, context),\n Action: \"RegisterPublisher\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_RegisterPublisherCommand = se_RegisterPublisherCommand;\nconst se_RegisterTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_RegisterTypeInput(input, context),\n Action: \"RegisterType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_RegisterTypeCommand = se_RegisterTypeCommand;\nconst se_RollbackStackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_RollbackStackInput(input, context),\n Action: \"RollbackStack\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_RollbackStackCommand = se_RollbackStackCommand;\nconst se_SetStackPolicyCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_SetStackPolicyInput(input, context),\n Action: \"SetStackPolicy\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SetStackPolicyCommand = se_SetStackPolicyCommand;\nconst se_SetTypeConfigurationCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_SetTypeConfigurationInput(input, context),\n Action: \"SetTypeConfiguration\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SetTypeConfigurationCommand = se_SetTypeConfigurationCommand;\nconst se_SetTypeDefaultVersionCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_SetTypeDefaultVersionInput(input, context),\n Action: \"SetTypeDefaultVersion\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SetTypeDefaultVersionCommand = se_SetTypeDefaultVersionCommand;\nconst se_SignalResourceCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_SignalResourceInput(input, context),\n Action: \"SignalResource\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SignalResourceCommand = se_SignalResourceCommand;\nconst se_StopStackSetOperationCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_StopStackSetOperationInput(input, context),\n Action: \"StopStackSetOperation\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_StopStackSetOperationCommand = se_StopStackSetOperationCommand;\nconst se_TestTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_TestTypeInput(input, context),\n Action: \"TestType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_TestTypeCommand = se_TestTypeCommand;\nconst se_UpdateStackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_UpdateStackInput(input, context),\n Action: \"UpdateStack\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UpdateStackCommand = se_UpdateStackCommand;\nconst se_UpdateStackInstancesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_UpdateStackInstancesInput(input, context),\n Action: \"UpdateStackInstances\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UpdateStackInstancesCommand = se_UpdateStackInstancesCommand;\nconst se_UpdateStackSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_UpdateStackSetInput(input, context),\n Action: \"UpdateStackSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UpdateStackSetCommand = se_UpdateStackSetCommand;\nconst se_UpdateTerminationProtectionCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_UpdateTerminationProtectionInput(input, context),\n Action: \"UpdateTerminationProtection\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UpdateTerminationProtectionCommand = se_UpdateTerminationProtectionCommand;\nconst se_ValidateTemplateCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ValidateTemplateInput(input, context),\n Action: \"ValidateTemplate\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ValidateTemplateCommand = se_ValidateTemplateCommand;\nconst de_ActivateOrganizationsAccessCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ActivateOrganizationsAccessCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ActivateOrganizationsAccessOutput(data.ActivateOrganizationsAccessResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ActivateOrganizationsAccessCommand = de_ActivateOrganizationsAccessCommand;\nconst de_ActivateOrganizationsAccessCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ActivateTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ActivateTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ActivateTypeOutput(data.ActivateTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ActivateTypeCommand = de_ActivateTypeCommand;\nconst de_ActivateTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_BatchDescribeTypeConfigurationsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_BatchDescribeTypeConfigurationsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_BatchDescribeTypeConfigurationsOutput(data.BatchDescribeTypeConfigurationsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_BatchDescribeTypeConfigurationsCommand = de_BatchDescribeTypeConfigurationsCommand;\nconst de_BatchDescribeTypeConfigurationsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeConfigurationNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeConfigurationNotFoundException\":\n throw await de_TypeConfigurationNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_CancelUpdateStackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CancelUpdateStackCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_CancelUpdateStackCommand = de_CancelUpdateStackCommand;\nconst de_CancelUpdateStackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ContinueUpdateRollbackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ContinueUpdateRollbackCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ContinueUpdateRollbackOutput(data.ContinueUpdateRollbackResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ContinueUpdateRollbackCommand = de_ContinueUpdateRollbackCommand;\nconst de_ContinueUpdateRollbackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_CreateChangeSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CreateChangeSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_CreateChangeSetOutput(data.CreateChangeSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_CreateChangeSetCommand = de_CreateChangeSetCommand;\nconst de_CreateChangeSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"AlreadyExistsException\":\n case \"com.amazonaws.cloudformation#AlreadyExistsException\":\n throw await de_AlreadyExistsExceptionRes(parsedOutput, context);\n case \"InsufficientCapabilitiesException\":\n case \"com.amazonaws.cloudformation#InsufficientCapabilitiesException\":\n throw await de_InsufficientCapabilitiesExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cloudformation#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_CreateStackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CreateStackCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_CreateStackOutput(data.CreateStackResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_CreateStackCommand = de_CreateStackCommand;\nconst de_CreateStackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"AlreadyExistsException\":\n case \"com.amazonaws.cloudformation#AlreadyExistsException\":\n throw await de_AlreadyExistsExceptionRes(parsedOutput, context);\n case \"InsufficientCapabilitiesException\":\n case \"com.amazonaws.cloudformation#InsufficientCapabilitiesException\":\n throw await de_InsufficientCapabilitiesExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cloudformation#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_CreateStackInstancesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CreateStackInstancesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_CreateStackInstancesOutput(data.CreateStackInstancesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_CreateStackInstancesCommand = de_CreateStackInstancesCommand;\nconst de_CreateStackInstancesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cloudformation#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"OperationIdAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#OperationIdAlreadyExistsException\":\n throw await de_OperationIdAlreadyExistsExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n case \"StaleRequestException\":\n case \"com.amazonaws.cloudformation#StaleRequestException\":\n throw await de_StaleRequestExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_CreateStackSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CreateStackSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_CreateStackSetOutput(data.CreateStackSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_CreateStackSetCommand = de_CreateStackSetCommand;\nconst de_CreateStackSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CreatedButModifiedException\":\n case \"com.amazonaws.cloudformation#CreatedButModifiedException\":\n throw await de_CreatedButModifiedExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cloudformation#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"NameAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#NameAlreadyExistsException\":\n throw await de_NameAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeactivateOrganizationsAccessCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeactivateOrganizationsAccessCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeactivateOrganizationsAccessOutput(data.DeactivateOrganizationsAccessResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeactivateOrganizationsAccessCommand = de_DeactivateOrganizationsAccessCommand;\nconst de_DeactivateOrganizationsAccessCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeactivateTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeactivateTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeactivateTypeOutput(data.DeactivateTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeactivateTypeCommand = de_DeactivateTypeCommand;\nconst de_DeactivateTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeleteChangeSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteChangeSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeleteChangeSetOutput(data.DeleteChangeSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeleteChangeSetCommand = de_DeleteChangeSetCommand;\nconst de_DeleteChangeSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidChangeSetStatus\":\n case \"com.amazonaws.cloudformation#InvalidChangeSetStatusException\":\n throw await de_InvalidChangeSetStatusExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeleteStackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteStackCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_DeleteStackCommand = de_DeleteStackCommand;\nconst de_DeleteStackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeleteStackInstancesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteStackInstancesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeleteStackInstancesOutput(data.DeleteStackInstancesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeleteStackInstancesCommand = de_DeleteStackInstancesCommand;\nconst de_DeleteStackInstancesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationIdAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#OperationIdAlreadyExistsException\":\n throw await de_OperationIdAlreadyExistsExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n case \"StaleRequestException\":\n case \"com.amazonaws.cloudformation#StaleRequestException\":\n throw await de_StaleRequestExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeleteStackSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteStackSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeleteStackSetOutput(data.DeleteStackSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeleteStackSetCommand = de_DeleteStackSetCommand;\nconst de_DeleteStackSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackSetNotEmptyException\":\n case \"com.amazonaws.cloudformation#StackSetNotEmptyException\":\n throw await de_StackSetNotEmptyExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeregisterTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeregisterTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeregisterTypeOutput(data.DeregisterTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeregisterTypeCommand = de_DeregisterTypeCommand;\nconst de_DeregisterTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeAccountLimitsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeAccountLimitsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeAccountLimitsOutput(data.DescribeAccountLimitsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeAccountLimitsCommand = de_DescribeAccountLimitsCommand;\nconst de_DescribeAccountLimitsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeChangeSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeChangeSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeChangeSetOutput(data.DescribeChangeSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeChangeSetCommand = de_DescribeChangeSetCommand;\nconst de_DescribeChangeSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ChangeSetNotFound\":\n case \"com.amazonaws.cloudformation#ChangeSetNotFoundException\":\n throw await de_ChangeSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeChangeSetHooksCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeChangeSetHooksCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeChangeSetHooksOutput(data.DescribeChangeSetHooksResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeChangeSetHooksCommand = de_DescribeChangeSetHooksCommand;\nconst de_DescribeChangeSetHooksCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ChangeSetNotFound\":\n case \"com.amazonaws.cloudformation#ChangeSetNotFoundException\":\n throw await de_ChangeSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeOrganizationsAccessCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeOrganizationsAccessCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeOrganizationsAccessOutput(data.DescribeOrganizationsAccessResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeOrganizationsAccessCommand = de_DescribeOrganizationsAccessCommand;\nconst de_DescribeOrganizationsAccessCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribePublisherCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribePublisherCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribePublisherOutput(data.DescribePublisherResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribePublisherCommand = de_DescribePublisherCommand;\nconst de_DescribePublisherCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeStackDriftDetectionStatusCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackDriftDetectionStatusCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackDriftDetectionStatusOutput(data.DescribeStackDriftDetectionStatusResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackDriftDetectionStatusCommand = de_DescribeStackDriftDetectionStatusCommand;\nconst de_DescribeStackDriftDetectionStatusCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStackEventsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackEventsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackEventsOutput(data.DescribeStackEventsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackEventsCommand = de_DescribeStackEventsCommand;\nconst de_DescribeStackEventsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStackInstanceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackInstanceCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackInstanceOutput(data.DescribeStackInstanceResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackInstanceCommand = de_DescribeStackInstanceCommand;\nconst de_DescribeStackInstanceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"StackInstanceNotFoundException\":\n case \"com.amazonaws.cloudformation#StackInstanceNotFoundException\":\n throw await de_StackInstanceNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeStackResourceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackResourceCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackResourceOutput(data.DescribeStackResourceResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackResourceCommand = de_DescribeStackResourceCommand;\nconst de_DescribeStackResourceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStackResourceDriftsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackResourceDriftsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackResourceDriftsOutput(data.DescribeStackResourceDriftsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackResourceDriftsCommand = de_DescribeStackResourceDriftsCommand;\nconst de_DescribeStackResourceDriftsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStackResourcesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackResourcesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackResourcesOutput(data.DescribeStackResourcesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackResourcesCommand = de_DescribeStackResourcesCommand;\nconst de_DescribeStackResourcesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStacksCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStacksCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStacksOutput(data.DescribeStacksResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStacksCommand = de_DescribeStacksCommand;\nconst de_DescribeStacksCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStackSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackSetOutput(data.DescribeStackSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackSetCommand = de_DescribeStackSetCommand;\nconst de_DescribeStackSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeStackSetOperationCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackSetOperationCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackSetOperationOutput(data.DescribeStackSetOperationResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackSetOperationCommand = de_DescribeStackSetOperationCommand;\nconst de_DescribeStackSetOperationCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeTypeOutput(data.DescribeTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeTypeCommand = de_DescribeTypeCommand;\nconst de_DescribeTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeTypeRegistrationCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeTypeRegistrationCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeTypeRegistrationOutput(data.DescribeTypeRegistrationResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeTypeRegistrationCommand = de_DescribeTypeRegistrationCommand;\nconst de_DescribeTypeRegistrationCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DetectStackDriftCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DetectStackDriftCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DetectStackDriftOutput(data.DetectStackDriftResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DetectStackDriftCommand = de_DetectStackDriftCommand;\nconst de_DetectStackDriftCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DetectStackResourceDriftCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DetectStackResourceDriftCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DetectStackResourceDriftOutput(data.DetectStackResourceDriftResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DetectStackResourceDriftCommand = de_DetectStackResourceDriftCommand;\nconst de_DetectStackResourceDriftCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DetectStackSetDriftCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DetectStackSetDriftCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DetectStackSetDriftOutput(data.DetectStackSetDriftResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DetectStackSetDriftCommand = de_DetectStackSetDriftCommand;\nconst de_DetectStackSetDriftCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_EstimateTemplateCostCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_EstimateTemplateCostCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_EstimateTemplateCostOutput(data.EstimateTemplateCostResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_EstimateTemplateCostCommand = de_EstimateTemplateCostCommand;\nconst de_EstimateTemplateCostCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ExecuteChangeSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ExecuteChangeSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ExecuteChangeSetOutput(data.ExecuteChangeSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ExecuteChangeSetCommand = de_ExecuteChangeSetCommand;\nconst de_ExecuteChangeSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ChangeSetNotFound\":\n case \"com.amazonaws.cloudformation#ChangeSetNotFoundException\":\n throw await de_ChangeSetNotFoundExceptionRes(parsedOutput, context);\n case \"InsufficientCapabilitiesException\":\n case \"com.amazonaws.cloudformation#InsufficientCapabilitiesException\":\n throw await de_InsufficientCapabilitiesExceptionRes(parsedOutput, context);\n case \"InvalidChangeSetStatus\":\n case \"com.amazonaws.cloudformation#InvalidChangeSetStatusException\":\n throw await de_InvalidChangeSetStatusExceptionRes(parsedOutput, context);\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_GetStackPolicyCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetStackPolicyCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetStackPolicyOutput(data.GetStackPolicyResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetStackPolicyCommand = de_GetStackPolicyCommand;\nconst de_GetStackPolicyCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_GetTemplateCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetTemplateCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetTemplateOutput(data.GetTemplateResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetTemplateCommand = de_GetTemplateCommand;\nconst de_GetTemplateCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ChangeSetNotFound\":\n case \"com.amazonaws.cloudformation#ChangeSetNotFoundException\":\n throw await de_ChangeSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_GetTemplateSummaryCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetTemplateSummaryCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetTemplateSummaryOutput(data.GetTemplateSummaryResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetTemplateSummaryCommand = de_GetTemplateSummaryCommand;\nconst de_GetTemplateSummaryCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ImportStacksToStackSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ImportStacksToStackSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ImportStacksToStackSetOutput(data.ImportStacksToStackSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ImportStacksToStackSetCommand = de_ImportStacksToStackSetCommand;\nconst de_ImportStacksToStackSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cloudformation#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"OperationIdAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#OperationIdAlreadyExistsException\":\n throw await de_OperationIdAlreadyExistsExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackNotFoundException\":\n case \"com.amazonaws.cloudformation#StackNotFoundException\":\n throw await de_StackNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n case \"StaleRequestException\":\n case \"com.amazonaws.cloudformation#StaleRequestException\":\n throw await de_StaleRequestExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListChangeSetsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListChangeSetsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListChangeSetsOutput(data.ListChangeSetsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListChangeSetsCommand = de_ListChangeSetsCommand;\nconst de_ListChangeSetsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListExportsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListExportsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListExportsOutput(data.ListExportsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListExportsCommand = de_ListExportsCommand;\nconst de_ListExportsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListImportsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListImportsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListImportsOutput(data.ListImportsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListImportsCommand = de_ListImportsCommand;\nconst de_ListImportsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListStackInstanceResourceDriftsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackInstanceResourceDriftsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackInstanceResourceDriftsOutput(data.ListStackInstanceResourceDriftsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackInstanceResourceDriftsCommand = de_ListStackInstanceResourceDriftsCommand;\nconst de_ListStackInstanceResourceDriftsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n case \"StackInstanceNotFoundException\":\n case \"com.amazonaws.cloudformation#StackInstanceNotFoundException\":\n throw await de_StackInstanceNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListStackInstancesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackInstancesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackInstancesOutput(data.ListStackInstancesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackInstancesCommand = de_ListStackInstancesCommand;\nconst de_ListStackInstancesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListStackResourcesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackResourcesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackResourcesOutput(data.ListStackResourcesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackResourcesCommand = de_ListStackResourcesCommand;\nconst de_ListStackResourcesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListStacksCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStacksCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStacksOutput(data.ListStacksResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStacksCommand = de_ListStacksCommand;\nconst de_ListStacksCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListStackSetOperationResultsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackSetOperationResultsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackSetOperationResultsOutput(data.ListStackSetOperationResultsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackSetOperationResultsCommand = de_ListStackSetOperationResultsCommand;\nconst de_ListStackSetOperationResultsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListStackSetOperationsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackSetOperationsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackSetOperationsOutput(data.ListStackSetOperationsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackSetOperationsCommand = de_ListStackSetOperationsCommand;\nconst de_ListStackSetOperationsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListStackSetsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackSetsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackSetsOutput(data.ListStackSetsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackSetsCommand = de_ListStackSetsCommand;\nconst de_ListStackSetsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListTypeRegistrationsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListTypeRegistrationsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListTypeRegistrationsOutput(data.ListTypeRegistrationsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListTypeRegistrationsCommand = de_ListTypeRegistrationsCommand;\nconst de_ListTypeRegistrationsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListTypesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListTypesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListTypesOutput(data.ListTypesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListTypesCommand = de_ListTypesCommand;\nconst de_ListTypesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListTypeVersionsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListTypeVersionsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListTypeVersionsOutput(data.ListTypeVersionsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListTypeVersionsCommand = de_ListTypeVersionsCommand;\nconst de_ListTypeVersionsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_PublishTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_PublishTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_PublishTypeOutput(data.PublishTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_PublishTypeCommand = de_PublishTypeCommand;\nconst de_PublishTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_RecordHandlerProgressCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_RecordHandlerProgressCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_RecordHandlerProgressOutput(data.RecordHandlerProgressResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_RecordHandlerProgressCommand = de_RecordHandlerProgressCommand;\nconst de_RecordHandlerProgressCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ConditionalCheckFailed\":\n case \"com.amazonaws.cloudformation#OperationStatusCheckFailedException\":\n throw await de_OperationStatusCheckFailedExceptionRes(parsedOutput, context);\n case \"InvalidStateTransition\":\n case \"com.amazonaws.cloudformation#InvalidStateTransitionException\":\n throw await de_InvalidStateTransitionExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_RegisterPublisherCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_RegisterPublisherCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_RegisterPublisherOutput(data.RegisterPublisherResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_RegisterPublisherCommand = de_RegisterPublisherCommand;\nconst de_RegisterPublisherCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_RegisterTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_RegisterTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_RegisterTypeOutput(data.RegisterTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_RegisterTypeCommand = de_RegisterTypeCommand;\nconst de_RegisterTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_RollbackStackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_RollbackStackCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_RollbackStackOutput(data.RollbackStackResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_RollbackStackCommand = de_RollbackStackCommand;\nconst de_RollbackStackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_SetStackPolicyCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SetStackPolicyCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_SetStackPolicyCommand = de_SetStackPolicyCommand;\nconst de_SetStackPolicyCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_SetTypeConfigurationCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SetTypeConfigurationCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_SetTypeConfigurationOutput(data.SetTypeConfigurationResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_SetTypeConfigurationCommand = de_SetTypeConfigurationCommand;\nconst de_SetTypeConfigurationCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_SetTypeDefaultVersionCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SetTypeDefaultVersionCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_SetTypeDefaultVersionOutput(data.SetTypeDefaultVersionResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_SetTypeDefaultVersionCommand = de_SetTypeDefaultVersionCommand;\nconst de_SetTypeDefaultVersionCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_SignalResourceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SignalResourceCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_SignalResourceCommand = de_SignalResourceCommand;\nconst de_SignalResourceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_StopStackSetOperationCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_StopStackSetOperationCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_StopStackSetOperationOutput(data.StopStackSetOperationResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_StopStackSetOperationCommand = de_StopStackSetOperationCommand;\nconst de_StopStackSetOperationCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_TestTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_TestTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_TestTypeOutput(data.TestTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_TestTypeCommand = de_TestTypeCommand;\nconst de_TestTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_UpdateStackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UpdateStackCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_UpdateStackOutput(data.UpdateStackResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UpdateStackCommand = de_UpdateStackCommand;\nconst de_UpdateStackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InsufficientCapabilitiesException\":\n case \"com.amazonaws.cloudformation#InsufficientCapabilitiesException\":\n throw await de_InsufficientCapabilitiesExceptionRes(parsedOutput, context);\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_UpdateStackInstancesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UpdateStackInstancesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_UpdateStackInstancesOutput(data.UpdateStackInstancesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UpdateStackInstancesCommand = de_UpdateStackInstancesCommand;\nconst de_UpdateStackInstancesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationIdAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#OperationIdAlreadyExistsException\":\n throw await de_OperationIdAlreadyExistsExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackInstanceNotFoundException\":\n case \"com.amazonaws.cloudformation#StackInstanceNotFoundException\":\n throw await de_StackInstanceNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n case \"StaleRequestException\":\n case \"com.amazonaws.cloudformation#StaleRequestException\":\n throw await de_StaleRequestExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_UpdateStackSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UpdateStackSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_UpdateStackSetOutput(data.UpdateStackSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UpdateStackSetCommand = de_UpdateStackSetCommand;\nconst de_UpdateStackSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationIdAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#OperationIdAlreadyExistsException\":\n throw await de_OperationIdAlreadyExistsExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackInstanceNotFoundException\":\n case \"com.amazonaws.cloudformation#StackInstanceNotFoundException\":\n throw await de_StackInstanceNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n case \"StaleRequestException\":\n case \"com.amazonaws.cloudformation#StaleRequestException\":\n throw await de_StaleRequestExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_UpdateTerminationProtectionCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UpdateTerminationProtectionCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_UpdateTerminationProtectionOutput(data.UpdateTerminationProtectionResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UpdateTerminationProtectionCommand = de_UpdateTerminationProtectionCommand;\nconst de_UpdateTerminationProtectionCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ValidateTemplateCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ValidateTemplateCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ValidateTemplateOutput(data.ValidateTemplateResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ValidateTemplateCommand = de_ValidateTemplateCommand;\nconst de_ValidateTemplateCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_AlreadyExistsExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_AlreadyExistsException(body.Error, context);\n const exception = new models_0_1.AlreadyExistsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_CFNRegistryExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_CFNRegistryException(body.Error, context);\n const exception = new models_0_1.CFNRegistryException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_ChangeSetNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_ChangeSetNotFoundException(body.Error, context);\n const exception = new models_0_1.ChangeSetNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_CreatedButModifiedExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_CreatedButModifiedException(body.Error, context);\n const exception = new models_0_1.CreatedButModifiedException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InsufficientCapabilitiesExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InsufficientCapabilitiesException(body.Error, context);\n const exception = new models_0_1.InsufficientCapabilitiesException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidChangeSetStatusExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InvalidChangeSetStatusException(body.Error, context);\n const exception = new models_0_1.InvalidChangeSetStatusException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidOperationExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InvalidOperationException(body.Error, context);\n const exception = new models_0_1.InvalidOperationException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidStateTransitionExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InvalidStateTransitionException(body.Error, context);\n const exception = new models_0_1.InvalidStateTransitionException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_LimitExceededExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_LimitExceededException(body.Error, context);\n const exception = new models_0_1.LimitExceededException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_NameAlreadyExistsExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_NameAlreadyExistsException(body.Error, context);\n const exception = new models_0_1.NameAlreadyExistsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_OperationIdAlreadyExistsExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_OperationIdAlreadyExistsException(body.Error, context);\n const exception = new models_0_1.OperationIdAlreadyExistsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_OperationInProgressExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_OperationInProgressException(body.Error, context);\n const exception = new models_0_1.OperationInProgressException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_OperationNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_OperationNotFoundException(body.Error, context);\n const exception = new models_0_1.OperationNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_OperationStatusCheckFailedExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_OperationStatusCheckFailedException(body.Error, context);\n const exception = new models_0_1.OperationStatusCheckFailedException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_StackInstanceNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_StackInstanceNotFoundException(body.Error, context);\n const exception = new models_0_1.StackInstanceNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_StackNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_StackNotFoundException(body.Error, context);\n const exception = new models_0_1.StackNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_StackSetNotEmptyExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_StackSetNotEmptyException(body.Error, context);\n const exception = new models_0_1.StackSetNotEmptyException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_StackSetNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_StackSetNotFoundException(body.Error, context);\n const exception = new models_0_1.StackSetNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_StaleRequestExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_StaleRequestException(body.Error, context);\n const exception = new models_0_1.StaleRequestException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_TokenAlreadyExistsExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_TokenAlreadyExistsException(body.Error, context);\n const exception = new models_0_1.TokenAlreadyExistsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_TypeConfigurationNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_TypeConfigurationNotFoundException(body.Error, context);\n const exception = new models_0_1.TypeConfigurationNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_TypeNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_TypeNotFoundException(body.Error, context);\n const exception = new models_0_1.TypeNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst se_AccountList = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_ActivateOrganizationsAccessInput = (input, context) => {\n const entries = {};\n return entries;\n};\nconst se_ActivateTypeInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.PublicTypeArn != null) {\n entries[\"PublicTypeArn\"] = input.PublicTypeArn;\n }\n if (input.PublisherId != null) {\n entries[\"PublisherId\"] = input.PublisherId;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.TypeNameAlias != null) {\n entries[\"TypeNameAlias\"] = input.TypeNameAlias;\n }\n if (input.AutoUpdate != null) {\n entries[\"AutoUpdate\"] = input.AutoUpdate;\n }\n if (input.LoggingConfig != null) {\n const memberEntries = se_LoggingConfig(input.LoggingConfig, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `LoggingConfig.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ExecutionRoleArn != null) {\n entries[\"ExecutionRoleArn\"] = input.ExecutionRoleArn;\n }\n if (input.VersionBump != null) {\n entries[\"VersionBump\"] = input.VersionBump;\n }\n if (input.MajorVersion != null) {\n entries[\"MajorVersion\"] = input.MajorVersion;\n }\n return entries;\n};\nconst se_AutoDeployment = (input, context) => {\n const entries = {};\n if (input.Enabled != null) {\n entries[\"Enabled\"] = input.Enabled;\n }\n if (input.RetainStacksOnAccountRemoval != null) {\n entries[\"RetainStacksOnAccountRemoval\"] = input.RetainStacksOnAccountRemoval;\n }\n return entries;\n};\nconst se_BatchDescribeTypeConfigurationsInput = (input, context) => {\n const entries = {};\n if (input.TypeConfigurationIdentifiers != null) {\n const memberEntries = se_TypeConfigurationIdentifiers(input.TypeConfigurationIdentifiers, context);\n if (input.TypeConfigurationIdentifiers?.length === 0) {\n entries.TypeConfigurationIdentifiers = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `TypeConfigurationIdentifiers.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_CancelUpdateStackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n return entries;\n};\nconst se_Capabilities = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_ContinueUpdateRollbackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.ResourcesToSkip != null) {\n const memberEntries = se_ResourcesToSkip(input.ResourcesToSkip, context);\n if (input.ResourcesToSkip?.length === 0) {\n entries.ResourcesToSkip = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourcesToSkip.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n return entries;\n};\nconst se_CreateChangeSetInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.UsePreviousTemplate != null) {\n entries[\"UsePreviousTemplate\"] = input.UsePreviousTemplate;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Capabilities != null) {\n const memberEntries = se_Capabilities(input.Capabilities, context);\n if (input.Capabilities?.length === 0) {\n entries.Capabilities = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Capabilities.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ResourceTypes != null) {\n const memberEntries = se_ResourceTypes(input.ResourceTypes, context);\n if (input.ResourceTypes?.length === 0) {\n entries.ResourceTypes = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourceTypes.${key}`;\n entries[loc] = value;\n });\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.RollbackConfiguration != null) {\n const memberEntries = se_RollbackConfiguration(input.RollbackConfiguration, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RollbackConfiguration.${key}`;\n entries[loc] = value;\n });\n }\n if (input.NotificationARNs != null) {\n const memberEntries = se_NotificationARNs(input.NotificationARNs, context);\n if (input.NotificationARNs?.length === 0) {\n entries.NotificationARNs = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `NotificationARNs.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Tags != null) {\n const memberEntries = se_Tags(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.ClientToken != null) {\n entries[\"ClientToken\"] = input.ClientToken;\n }\n if (input.Description != null) {\n entries[\"Description\"] = input.Description;\n }\n if (input.ChangeSetType != null) {\n entries[\"ChangeSetType\"] = input.ChangeSetType;\n }\n if (input.ResourcesToImport != null) {\n const memberEntries = se_ResourcesToImport(input.ResourcesToImport, context);\n if (input.ResourcesToImport?.length === 0) {\n entries.ResourcesToImport = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourcesToImport.${key}`;\n entries[loc] = value;\n });\n }\n if (input.IncludeNestedStacks != null) {\n entries[\"IncludeNestedStacks\"] = input.IncludeNestedStacks;\n }\n if (input.OnStackFailure != null) {\n entries[\"OnStackFailure\"] = input.OnStackFailure;\n }\n return entries;\n};\nconst se_CreateStackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DisableRollback != null) {\n entries[\"DisableRollback\"] = input.DisableRollback;\n }\n if (input.RollbackConfiguration != null) {\n const memberEntries = se_RollbackConfiguration(input.RollbackConfiguration, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RollbackConfiguration.${key}`;\n entries[loc] = value;\n });\n }\n if (input.TimeoutInMinutes != null) {\n entries[\"TimeoutInMinutes\"] = input.TimeoutInMinutes;\n }\n if (input.NotificationARNs != null) {\n const memberEntries = se_NotificationARNs(input.NotificationARNs, context);\n if (input.NotificationARNs?.length === 0) {\n entries.NotificationARNs = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `NotificationARNs.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Capabilities != null) {\n const memberEntries = se_Capabilities(input.Capabilities, context);\n if (input.Capabilities?.length === 0) {\n entries.Capabilities = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Capabilities.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ResourceTypes != null) {\n const memberEntries = se_ResourceTypes(input.ResourceTypes, context);\n if (input.ResourceTypes?.length === 0) {\n entries.ResourceTypes = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourceTypes.${key}`;\n entries[loc] = value;\n });\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.OnFailure != null) {\n entries[\"OnFailure\"] = input.OnFailure;\n }\n if (input.StackPolicyBody != null) {\n entries[\"StackPolicyBody\"] = input.StackPolicyBody;\n }\n if (input.StackPolicyURL != null) {\n entries[\"StackPolicyURL\"] = input.StackPolicyURL;\n }\n if (input.Tags != null) {\n const memberEntries = se_Tags(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n if (input.EnableTerminationProtection != null) {\n entries[\"EnableTerminationProtection\"] = input.EnableTerminationProtection;\n }\n if (input.RetainExceptOnCreate != null) {\n entries[\"RetainExceptOnCreate\"] = input.RetainExceptOnCreate;\n }\n return entries;\n};\nconst se_CreateStackInstancesInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.Accounts != null) {\n const memberEntries = se_AccountList(input.Accounts, context);\n if (input.Accounts?.length === 0) {\n entries.Accounts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Accounts.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DeploymentTargets != null) {\n const memberEntries = se_DeploymentTargets(input.DeploymentTargets, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `DeploymentTargets.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Regions != null) {\n const memberEntries = se_RegionList(input.Regions, context);\n if (input.Regions?.length === 0) {\n entries.Regions = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Regions.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ParameterOverrides != null) {\n const memberEntries = se_Parameters(input.ParameterOverrides, context);\n if (input.ParameterOverrides?.length === 0) {\n entries.ParameterOverrides = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ParameterOverrides.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_CreateStackSetInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.Description != null) {\n entries[\"Description\"] = input.Description;\n }\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.StackId != null) {\n entries[\"StackId\"] = input.StackId;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Capabilities != null) {\n const memberEntries = se_Capabilities(input.Capabilities, context);\n if (input.Capabilities?.length === 0) {\n entries.Capabilities = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Capabilities.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Tags != null) {\n const memberEntries = se_Tags(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.AdministrationRoleARN != null) {\n entries[\"AdministrationRoleARN\"] = input.AdministrationRoleARN;\n }\n if (input.ExecutionRoleName != null) {\n entries[\"ExecutionRoleName\"] = input.ExecutionRoleName;\n }\n if (input.PermissionModel != null) {\n entries[\"PermissionModel\"] = input.PermissionModel;\n }\n if (input.AutoDeployment != null) {\n const memberEntries = se_AutoDeployment(input.AutoDeployment, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `AutoDeployment.${key}`;\n entries[loc] = value;\n });\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n if (input.ClientRequestToken === undefined) {\n input.ClientRequestToken = (0, uuid_1.v4)();\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n if (input.ManagedExecution != null) {\n const memberEntries = se_ManagedExecution(input.ManagedExecution, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ManagedExecution.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_DeactivateOrganizationsAccessInput = (input, context) => {\n const entries = {};\n return entries;\n};\nconst se_DeactivateTypeInput = (input, context) => {\n const entries = {};\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n return entries;\n};\nconst se_DeleteChangeSetInput = (input, context) => {\n const entries = {};\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n return entries;\n};\nconst se_DeleteStackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.RetainResources != null) {\n const memberEntries = se_RetainResources(input.RetainResources, context);\n if (input.RetainResources?.length === 0) {\n entries.RetainResources = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RetainResources.${key}`;\n entries[loc] = value;\n });\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n return entries;\n};\nconst se_DeleteStackInstancesInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.Accounts != null) {\n const memberEntries = se_AccountList(input.Accounts, context);\n if (input.Accounts?.length === 0) {\n entries.Accounts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Accounts.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DeploymentTargets != null) {\n const memberEntries = se_DeploymentTargets(input.DeploymentTargets, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `DeploymentTargets.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Regions != null) {\n const memberEntries = se_RegionList(input.Regions, context);\n if (input.Regions?.length === 0) {\n entries.Regions = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Regions.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.RetainStacks != null) {\n entries[\"RetainStacks\"] = input.RetainStacks;\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DeleteStackSetInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DeploymentTargets = (input, context) => {\n const entries = {};\n if (input.Accounts != null) {\n const memberEntries = se_AccountList(input.Accounts, context);\n if (input.Accounts?.length === 0) {\n entries.Accounts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Accounts.${key}`;\n entries[loc] = value;\n });\n }\n if (input.AccountsUrl != null) {\n entries[\"AccountsUrl\"] = input.AccountsUrl;\n }\n if (input.OrganizationalUnitIds != null) {\n const memberEntries = se_OrganizationalUnitIdList(input.OrganizationalUnitIds, context);\n if (input.OrganizationalUnitIds?.length === 0) {\n entries.OrganizationalUnitIds = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OrganizationalUnitIds.${key}`;\n entries[loc] = value;\n });\n }\n if (input.AccountFilterType != null) {\n entries[\"AccountFilterType\"] = input.AccountFilterType;\n }\n return entries;\n};\nconst se_DeregisterTypeInput = (input, context) => {\n const entries = {};\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.VersionId != null) {\n entries[\"VersionId\"] = input.VersionId;\n }\n return entries;\n};\nconst se_DescribeAccountLimitsInput = (input, context) => {\n const entries = {};\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_DescribeChangeSetHooksInput = (input, context) => {\n const entries = {};\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n return entries;\n};\nconst se_DescribeChangeSetInput = (input, context) => {\n const entries = {};\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_DescribeOrganizationsAccessInput = (input, context) => {\n const entries = {};\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DescribePublisherInput = (input, context) => {\n const entries = {};\n if (input.PublisherId != null) {\n entries[\"PublisherId\"] = input.PublisherId;\n }\n return entries;\n};\nconst se_DescribeStackDriftDetectionStatusInput = (input, context) => {\n const entries = {};\n if (input.StackDriftDetectionId != null) {\n entries[\"StackDriftDetectionId\"] = input.StackDriftDetectionId;\n }\n return entries;\n};\nconst se_DescribeStackEventsInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_DescribeStackInstanceInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.StackInstanceAccount != null) {\n entries[\"StackInstanceAccount\"] = input.StackInstanceAccount;\n }\n if (input.StackInstanceRegion != null) {\n entries[\"StackInstanceRegion\"] = input.StackInstanceRegion;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DescribeStackResourceDriftsInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.StackResourceDriftStatusFilters != null) {\n const memberEntries = se_StackResourceDriftStatusFilters(input.StackResourceDriftStatusFilters, context);\n if (input.StackResourceDriftStatusFilters?.length === 0) {\n entries.StackResourceDriftStatusFilters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `StackResourceDriftStatusFilters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n return entries;\n};\nconst se_DescribeStackResourceInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n return entries;\n};\nconst se_DescribeStackResourcesInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n if (input.PhysicalResourceId != null) {\n entries[\"PhysicalResourceId\"] = input.PhysicalResourceId;\n }\n return entries;\n};\nconst se_DescribeStackSetInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DescribeStackSetOperationInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DescribeStacksInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_DescribeTypeInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.VersionId != null) {\n entries[\"VersionId\"] = input.VersionId;\n }\n if (input.PublisherId != null) {\n entries[\"PublisherId\"] = input.PublisherId;\n }\n if (input.PublicVersionNumber != null) {\n entries[\"PublicVersionNumber\"] = input.PublicVersionNumber;\n }\n return entries;\n};\nconst se_DescribeTypeRegistrationInput = (input, context) => {\n const entries = {};\n if (input.RegistrationToken != null) {\n entries[\"RegistrationToken\"] = input.RegistrationToken;\n }\n return entries;\n};\nconst se_DetectStackDriftInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.LogicalResourceIds != null) {\n const memberEntries = se_LogicalResourceIds(input.LogicalResourceIds, context);\n if (input.LogicalResourceIds?.length === 0) {\n entries.LogicalResourceIds = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `LogicalResourceIds.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_DetectStackResourceDriftInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n return entries;\n};\nconst se_DetectStackSetDriftInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_EstimateTemplateCostInput = (input, context) => {\n const entries = {};\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_ExecuteChangeSetInput = (input, context) => {\n const entries = {};\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n if (input.DisableRollback != null) {\n entries[\"DisableRollback\"] = input.DisableRollback;\n }\n if (input.RetainExceptOnCreate != null) {\n entries[\"RetainExceptOnCreate\"] = input.RetainExceptOnCreate;\n }\n return entries;\n};\nconst se_GetStackPolicyInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n return entries;\n};\nconst se_GetTemplateInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.TemplateStage != null) {\n entries[\"TemplateStage\"] = input.TemplateStage;\n }\n return entries;\n};\nconst se_GetTemplateSummaryInput = (input, context) => {\n const entries = {};\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n if (input.TemplateSummaryConfig != null) {\n const memberEntries = se_TemplateSummaryConfig(input.TemplateSummaryConfig, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `TemplateSummaryConfig.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_ImportStacksToStackSetInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.StackIds != null) {\n const memberEntries = se_StackIdList(input.StackIds, context);\n if (input.StackIds?.length === 0) {\n entries.StackIds = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `StackIds.${key}`;\n entries[loc] = value;\n });\n }\n if (input.StackIdsUrl != null) {\n entries[\"StackIdsUrl\"] = input.StackIdsUrl;\n }\n if (input.OrganizationalUnitIds != null) {\n const memberEntries = se_OrganizationalUnitIdList(input.OrganizationalUnitIds, context);\n if (input.OrganizationalUnitIds?.length === 0) {\n entries.OrganizationalUnitIds = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OrganizationalUnitIds.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_ListChangeSetsInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListExportsInput = (input, context) => {\n const entries = {};\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListImportsInput = (input, context) => {\n const entries = {};\n if (input.ExportName != null) {\n entries[\"ExportName\"] = input.ExportName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListStackInstanceResourceDriftsInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.StackInstanceResourceDriftStatuses != null) {\n const memberEntries = se_StackResourceDriftStatusFilters(input.StackInstanceResourceDriftStatuses, context);\n if (input.StackInstanceResourceDriftStatuses?.length === 0) {\n entries.StackInstanceResourceDriftStatuses = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `StackInstanceResourceDriftStatuses.${key}`;\n entries[loc] = value;\n });\n }\n if (input.StackInstanceAccount != null) {\n entries[\"StackInstanceAccount\"] = input.StackInstanceAccount;\n }\n if (input.StackInstanceRegion != null) {\n entries[\"StackInstanceRegion\"] = input.StackInstanceRegion;\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_ListStackInstancesInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.Filters != null) {\n const memberEntries = se_StackInstanceFilters(input.Filters, context);\n if (input.Filters?.length === 0) {\n entries.Filters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Filters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.StackInstanceAccount != null) {\n entries[\"StackInstanceAccount\"] = input.StackInstanceAccount;\n }\n if (input.StackInstanceRegion != null) {\n entries[\"StackInstanceRegion\"] = input.StackInstanceRegion;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_ListStackResourcesInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListStackSetOperationResultsInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n if (input.Filters != null) {\n const memberEntries = se_OperationResultFilters(input.Filters, context);\n if (input.Filters?.length === 0) {\n entries.Filters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Filters.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_ListStackSetOperationsInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_ListStackSetsInput = (input, context) => {\n const entries = {};\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.Status != null) {\n entries[\"Status\"] = input.Status;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_ListStacksInput = (input, context) => {\n const entries = {};\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.StackStatusFilter != null) {\n const memberEntries = se_StackStatusFilter(input.StackStatusFilter, context);\n if (input.StackStatusFilter?.length === 0) {\n entries.StackStatusFilter = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `StackStatusFilter.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_ListTypeRegistrationsInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.TypeArn != null) {\n entries[\"TypeArn\"] = input.TypeArn;\n }\n if (input.RegistrationStatusFilter != null) {\n entries[\"RegistrationStatusFilter\"] = input.RegistrationStatusFilter;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListTypesInput = (input, context) => {\n const entries = {};\n if (input.Visibility != null) {\n entries[\"Visibility\"] = input.Visibility;\n }\n if (input.ProvisioningType != null) {\n entries[\"ProvisioningType\"] = input.ProvisioningType;\n }\n if (input.DeprecatedStatus != null) {\n entries[\"DeprecatedStatus\"] = input.DeprecatedStatus;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.Filters != null) {\n const memberEntries = se_TypeFilters(input.Filters, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Filters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListTypeVersionsInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.DeprecatedStatus != null) {\n entries[\"DeprecatedStatus\"] = input.DeprecatedStatus;\n }\n if (input.PublisherId != null) {\n entries[\"PublisherId\"] = input.PublisherId;\n }\n return entries;\n};\nconst se_LoggingConfig = (input, context) => {\n const entries = {};\n if (input.LogRoleArn != null) {\n entries[\"LogRoleArn\"] = input.LogRoleArn;\n }\n if (input.LogGroupName != null) {\n entries[\"LogGroupName\"] = input.LogGroupName;\n }\n return entries;\n};\nconst se_LogicalResourceIds = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_ManagedExecution = (input, context) => {\n const entries = {};\n if (input.Active != null) {\n entries[\"Active\"] = input.Active;\n }\n return entries;\n};\nconst se_NotificationARNs = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_OperationResultFilter = (input, context) => {\n const entries = {};\n if (input.Name != null) {\n entries[\"Name\"] = input.Name;\n }\n if (input.Values != null) {\n entries[\"Values\"] = input.Values;\n }\n return entries;\n};\nconst se_OperationResultFilters = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_OperationResultFilter(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_OrganizationalUnitIdList = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_Parameter = (input, context) => {\n const entries = {};\n if (input.ParameterKey != null) {\n entries[\"ParameterKey\"] = input.ParameterKey;\n }\n if (input.ParameterValue != null) {\n entries[\"ParameterValue\"] = input.ParameterValue;\n }\n if (input.UsePreviousValue != null) {\n entries[\"UsePreviousValue\"] = input.UsePreviousValue;\n }\n if (input.ResolvedValue != null) {\n entries[\"ResolvedValue\"] = input.ResolvedValue;\n }\n return entries;\n};\nconst se_Parameters = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_Parameter(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_PublishTypeInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.PublicVersionNumber != null) {\n entries[\"PublicVersionNumber\"] = input.PublicVersionNumber;\n }\n return entries;\n};\nconst se_RecordHandlerProgressInput = (input, context) => {\n const entries = {};\n if (input.BearerToken != null) {\n entries[\"BearerToken\"] = input.BearerToken;\n }\n if (input.OperationStatus != null) {\n entries[\"OperationStatus\"] = input.OperationStatus;\n }\n if (input.CurrentOperationStatus != null) {\n entries[\"CurrentOperationStatus\"] = input.CurrentOperationStatus;\n }\n if (input.StatusMessage != null) {\n entries[\"StatusMessage\"] = input.StatusMessage;\n }\n if (input.ErrorCode != null) {\n entries[\"ErrorCode\"] = input.ErrorCode;\n }\n if (input.ResourceModel != null) {\n entries[\"ResourceModel\"] = input.ResourceModel;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n return entries;\n};\nconst se_RegionList = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_RegisterPublisherInput = (input, context) => {\n const entries = {};\n if (input.AcceptTermsAndConditions != null) {\n entries[\"AcceptTermsAndConditions\"] = input.AcceptTermsAndConditions;\n }\n if (input.ConnectionArn != null) {\n entries[\"ConnectionArn\"] = input.ConnectionArn;\n }\n return entries;\n};\nconst se_RegisterTypeInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.SchemaHandlerPackage != null) {\n entries[\"SchemaHandlerPackage\"] = input.SchemaHandlerPackage;\n }\n if (input.LoggingConfig != null) {\n const memberEntries = se_LoggingConfig(input.LoggingConfig, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `LoggingConfig.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ExecutionRoleArn != null) {\n entries[\"ExecutionRoleArn\"] = input.ExecutionRoleArn;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n return entries;\n};\nconst se_ResourceIdentifierProperties = (input, context) => {\n const entries = {};\n let counter = 1;\n Object.keys(input)\n .filter((key) => input[key] != null)\n .forEach((key) => {\n entries[`entry.${counter}.key`] = key;\n entries[`entry.${counter}.value`] = input[key];\n counter++;\n });\n return entries;\n};\nconst se_ResourcesToImport = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_ResourceToImport(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_ResourcesToSkip = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_ResourceToImport = (input, context) => {\n const entries = {};\n if (input.ResourceType != null) {\n entries[\"ResourceType\"] = input.ResourceType;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n if (input.ResourceIdentifier != null) {\n const memberEntries = se_ResourceIdentifierProperties(input.ResourceIdentifier, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourceIdentifier.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_ResourceTypes = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_RetainResources = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_RollbackConfiguration = (input, context) => {\n const entries = {};\n if (input.RollbackTriggers != null) {\n const memberEntries = se_RollbackTriggers(input.RollbackTriggers, context);\n if (input.RollbackTriggers?.length === 0) {\n entries.RollbackTriggers = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RollbackTriggers.${key}`;\n entries[loc] = value;\n });\n }\n if (input.MonitoringTimeInMinutes != null) {\n entries[\"MonitoringTimeInMinutes\"] = input.MonitoringTimeInMinutes;\n }\n return entries;\n};\nconst se_RollbackStackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n if (input.RetainExceptOnCreate != null) {\n entries[\"RetainExceptOnCreate\"] = input.RetainExceptOnCreate;\n }\n return entries;\n};\nconst se_RollbackTrigger = (input, context) => {\n const entries = {};\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n return entries;\n};\nconst se_RollbackTriggers = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_RollbackTrigger(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_SetStackPolicyInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.StackPolicyBody != null) {\n entries[\"StackPolicyBody\"] = input.StackPolicyBody;\n }\n if (input.StackPolicyURL != null) {\n entries[\"StackPolicyURL\"] = input.StackPolicyURL;\n }\n return entries;\n};\nconst se_SetTypeConfigurationInput = (input, context) => {\n const entries = {};\n if (input.TypeArn != null) {\n entries[\"TypeArn\"] = input.TypeArn;\n }\n if (input.Configuration != null) {\n entries[\"Configuration\"] = input.Configuration;\n }\n if (input.ConfigurationAlias != null) {\n entries[\"ConfigurationAlias\"] = input.ConfigurationAlias;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n return entries;\n};\nconst se_SetTypeDefaultVersionInput = (input, context) => {\n const entries = {};\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.VersionId != null) {\n entries[\"VersionId\"] = input.VersionId;\n }\n return entries;\n};\nconst se_SignalResourceInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n if (input.UniqueId != null) {\n entries[\"UniqueId\"] = input.UniqueId;\n }\n if (input.Status != null) {\n entries[\"Status\"] = input.Status;\n }\n return entries;\n};\nconst se_StackIdList = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_StackInstanceFilter = (input, context) => {\n const entries = {};\n if (input.Name != null) {\n entries[\"Name\"] = input.Name;\n }\n if (input.Values != null) {\n entries[\"Values\"] = input.Values;\n }\n return entries;\n};\nconst se_StackInstanceFilters = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_StackInstanceFilter(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_StackResourceDriftStatusFilters = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_StackSetOperationPreferences = (input, context) => {\n const entries = {};\n if (input.RegionConcurrencyType != null) {\n entries[\"RegionConcurrencyType\"] = input.RegionConcurrencyType;\n }\n if (input.RegionOrder != null) {\n const memberEntries = se_RegionList(input.RegionOrder, context);\n if (input.RegionOrder?.length === 0) {\n entries.RegionOrder = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RegionOrder.${key}`;\n entries[loc] = value;\n });\n }\n if (input.FailureToleranceCount != null) {\n entries[\"FailureToleranceCount\"] = input.FailureToleranceCount;\n }\n if (input.FailureTolerancePercentage != null) {\n entries[\"FailureTolerancePercentage\"] = input.FailureTolerancePercentage;\n }\n if (input.MaxConcurrentCount != null) {\n entries[\"MaxConcurrentCount\"] = input.MaxConcurrentCount;\n }\n if (input.MaxConcurrentPercentage != null) {\n entries[\"MaxConcurrentPercentage\"] = input.MaxConcurrentPercentage;\n }\n return entries;\n};\nconst se_StackStatusFilter = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_StopStackSetOperationInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_Tag = (input, context) => {\n const entries = {};\n if (input.Key != null) {\n entries[\"Key\"] = input.Key;\n }\n if (input.Value != null) {\n entries[\"Value\"] = input.Value;\n }\n return entries;\n};\nconst se_Tags = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_Tag(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_TemplateSummaryConfig = (input, context) => {\n const entries = {};\n if (input.TreatUnrecognizedResourceTypesAsWarnings != null) {\n entries[\"TreatUnrecognizedResourceTypesAsWarnings\"] = input.TreatUnrecognizedResourceTypesAsWarnings;\n }\n return entries;\n};\nconst se_TestTypeInput = (input, context) => {\n const entries = {};\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.VersionId != null) {\n entries[\"VersionId\"] = input.VersionId;\n }\n if (input.LogDeliveryBucket != null) {\n entries[\"LogDeliveryBucket\"] = input.LogDeliveryBucket;\n }\n return entries;\n};\nconst se_TypeConfigurationIdentifier = (input, context) => {\n const entries = {};\n if (input.TypeArn != null) {\n entries[\"TypeArn\"] = input.TypeArn;\n }\n if (input.TypeConfigurationAlias != null) {\n entries[\"TypeConfigurationAlias\"] = input.TypeConfigurationAlias;\n }\n if (input.TypeConfigurationArn != null) {\n entries[\"TypeConfigurationArn\"] = input.TypeConfigurationArn;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n return entries;\n};\nconst se_TypeConfigurationIdentifiers = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_TypeConfigurationIdentifier(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_TypeFilters = (input, context) => {\n const entries = {};\n if (input.Category != null) {\n entries[\"Category\"] = input.Category;\n }\n if (input.PublisherId != null) {\n entries[\"PublisherId\"] = input.PublisherId;\n }\n if (input.TypeNamePrefix != null) {\n entries[\"TypeNamePrefix\"] = input.TypeNamePrefix;\n }\n return entries;\n};\nconst se_UpdateStackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.UsePreviousTemplate != null) {\n entries[\"UsePreviousTemplate\"] = input.UsePreviousTemplate;\n }\n if (input.StackPolicyDuringUpdateBody != null) {\n entries[\"StackPolicyDuringUpdateBody\"] = input.StackPolicyDuringUpdateBody;\n }\n if (input.StackPolicyDuringUpdateURL != null) {\n entries[\"StackPolicyDuringUpdateURL\"] = input.StackPolicyDuringUpdateURL;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Capabilities != null) {\n const memberEntries = se_Capabilities(input.Capabilities, context);\n if (input.Capabilities?.length === 0) {\n entries.Capabilities = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Capabilities.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ResourceTypes != null) {\n const memberEntries = se_ResourceTypes(input.ResourceTypes, context);\n if (input.ResourceTypes?.length === 0) {\n entries.ResourceTypes = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourceTypes.${key}`;\n entries[loc] = value;\n });\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.RollbackConfiguration != null) {\n const memberEntries = se_RollbackConfiguration(input.RollbackConfiguration, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RollbackConfiguration.${key}`;\n entries[loc] = value;\n });\n }\n if (input.StackPolicyBody != null) {\n entries[\"StackPolicyBody\"] = input.StackPolicyBody;\n }\n if (input.StackPolicyURL != null) {\n entries[\"StackPolicyURL\"] = input.StackPolicyURL;\n }\n if (input.NotificationARNs != null) {\n const memberEntries = se_NotificationARNs(input.NotificationARNs, context);\n if (input.NotificationARNs?.length === 0) {\n entries.NotificationARNs = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `NotificationARNs.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Tags != null) {\n const memberEntries = se_Tags(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DisableRollback != null) {\n entries[\"DisableRollback\"] = input.DisableRollback;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n if (input.RetainExceptOnCreate != null) {\n entries[\"RetainExceptOnCreate\"] = input.RetainExceptOnCreate;\n }\n return entries;\n};\nconst se_UpdateStackInstancesInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.Accounts != null) {\n const memberEntries = se_AccountList(input.Accounts, context);\n if (input.Accounts?.length === 0) {\n entries.Accounts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Accounts.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DeploymentTargets != null) {\n const memberEntries = se_DeploymentTargets(input.DeploymentTargets, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `DeploymentTargets.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Regions != null) {\n const memberEntries = se_RegionList(input.Regions, context);\n if (input.Regions?.length === 0) {\n entries.Regions = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Regions.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ParameterOverrides != null) {\n const memberEntries = se_Parameters(input.ParameterOverrides, context);\n if (input.ParameterOverrides?.length === 0) {\n entries.ParameterOverrides = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ParameterOverrides.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_UpdateStackSetInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.Description != null) {\n entries[\"Description\"] = input.Description;\n }\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.UsePreviousTemplate != null) {\n entries[\"UsePreviousTemplate\"] = input.UsePreviousTemplate;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Capabilities != null) {\n const memberEntries = se_Capabilities(input.Capabilities, context);\n if (input.Capabilities?.length === 0) {\n entries.Capabilities = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Capabilities.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Tags != null) {\n const memberEntries = se_Tags(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.AdministrationRoleARN != null) {\n entries[\"AdministrationRoleARN\"] = input.AdministrationRoleARN;\n }\n if (input.ExecutionRoleName != null) {\n entries[\"ExecutionRoleName\"] = input.ExecutionRoleName;\n }\n if (input.DeploymentTargets != null) {\n const memberEntries = se_DeploymentTargets(input.DeploymentTargets, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `DeploymentTargets.${key}`;\n entries[loc] = value;\n });\n }\n if (input.PermissionModel != null) {\n entries[\"PermissionModel\"] = input.PermissionModel;\n }\n if (input.AutoDeployment != null) {\n const memberEntries = se_AutoDeployment(input.AutoDeployment, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `AutoDeployment.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.Accounts != null) {\n const memberEntries = se_AccountList(input.Accounts, context);\n if (input.Accounts?.length === 0) {\n entries.Accounts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Accounts.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Regions != null) {\n const memberEntries = se_RegionList(input.Regions, context);\n if (input.Regions?.length === 0) {\n entries.Regions = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Regions.${key}`;\n entries[loc] = value;\n });\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n if (input.ManagedExecution != null) {\n const memberEntries = se_ManagedExecution(input.ManagedExecution, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ManagedExecution.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_UpdateTerminationProtectionInput = (input, context) => {\n const entries = {};\n if (input.EnableTerminationProtection != null) {\n entries[\"EnableTerminationProtection\"] = input.EnableTerminationProtection;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n return entries;\n};\nconst se_ValidateTemplateInput = (input, context) => {\n const entries = {};\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n return entries;\n};\nconst de_AccountGateResult = (output, context) => {\n const contents = {};\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n return contents;\n};\nconst de_AccountLimit = (output, context) => {\n const contents = {};\n if (output[\"Name\"] !== undefined) {\n contents.Name = (0, smithy_client_1.expectString)(output[\"Name\"]);\n }\n if (output[\"Value\"] !== undefined) {\n contents.Value = (0, smithy_client_1.strictParseInt32)(output[\"Value\"]);\n }\n return contents;\n};\nconst de_AccountLimitList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_AccountLimit(entry, context);\n });\n};\nconst de_AccountList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_ActivateOrganizationsAccessOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_ActivateTypeOutput = (output, context) => {\n const contents = {};\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n return contents;\n};\nconst de_AllowedValues = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_AlreadyExistsException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_AutoDeployment = (output, context) => {\n const contents = {};\n if (output[\"Enabled\"] !== undefined) {\n contents.Enabled = (0, smithy_client_1.parseBoolean)(output[\"Enabled\"]);\n }\n if (output[\"RetainStacksOnAccountRemoval\"] !== undefined) {\n contents.RetainStacksOnAccountRemoval = (0, smithy_client_1.parseBoolean)(output[\"RetainStacksOnAccountRemoval\"]);\n }\n return contents;\n};\nconst de_BatchDescribeTypeConfigurationsError = (output, context) => {\n const contents = {};\n if (output[\"ErrorCode\"] !== undefined) {\n contents.ErrorCode = (0, smithy_client_1.expectString)(output[\"ErrorCode\"]);\n }\n if (output[\"ErrorMessage\"] !== undefined) {\n contents.ErrorMessage = (0, smithy_client_1.expectString)(output[\"ErrorMessage\"]);\n }\n if (output[\"TypeConfigurationIdentifier\"] !== undefined) {\n contents.TypeConfigurationIdentifier = de_TypeConfigurationIdentifier(output[\"TypeConfigurationIdentifier\"], context);\n }\n return contents;\n};\nconst de_BatchDescribeTypeConfigurationsErrors = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_BatchDescribeTypeConfigurationsError(entry, context);\n });\n};\nconst de_BatchDescribeTypeConfigurationsOutput = (output, context) => {\n const contents = {};\n if (output.Errors === \"\") {\n contents.Errors = [];\n }\n else if (output[\"Errors\"] !== undefined && output[\"Errors\"][\"member\"] !== undefined) {\n contents.Errors = de_BatchDescribeTypeConfigurationsErrors((0, smithy_client_1.getArrayIfSingleItem)(output[\"Errors\"][\"member\"]), context);\n }\n if (output.UnprocessedTypeConfigurations === \"\") {\n contents.UnprocessedTypeConfigurations = [];\n }\n else if (output[\"UnprocessedTypeConfigurations\"] !== undefined &&\n output[\"UnprocessedTypeConfigurations\"][\"member\"] !== undefined) {\n contents.UnprocessedTypeConfigurations = de_UnprocessedTypeConfigurations((0, smithy_client_1.getArrayIfSingleItem)(output[\"UnprocessedTypeConfigurations\"][\"member\"]), context);\n }\n if (output.TypeConfigurations === \"\") {\n contents.TypeConfigurations = [];\n }\n else if (output[\"TypeConfigurations\"] !== undefined && output[\"TypeConfigurations\"][\"member\"] !== undefined) {\n contents.TypeConfigurations = de_TypeConfigurationDetailsList((0, smithy_client_1.getArrayIfSingleItem)(output[\"TypeConfigurations\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_Capabilities = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_CFNRegistryException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_Change = (output, context) => {\n const contents = {};\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n if (output[\"HookInvocationCount\"] !== undefined) {\n contents.HookInvocationCount = (0, smithy_client_1.strictParseInt32)(output[\"HookInvocationCount\"]);\n }\n if (output[\"ResourceChange\"] !== undefined) {\n contents.ResourceChange = de_ResourceChange(output[\"ResourceChange\"], context);\n }\n return contents;\n};\nconst de_Changes = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Change(entry, context);\n });\n};\nconst de_ChangeSetHook = (output, context) => {\n const contents = {};\n if (output[\"InvocationPoint\"] !== undefined) {\n contents.InvocationPoint = (0, smithy_client_1.expectString)(output[\"InvocationPoint\"]);\n }\n if (output[\"FailureMode\"] !== undefined) {\n contents.FailureMode = (0, smithy_client_1.expectString)(output[\"FailureMode\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n if (output[\"TypeVersionId\"] !== undefined) {\n contents.TypeVersionId = (0, smithy_client_1.expectString)(output[\"TypeVersionId\"]);\n }\n if (output[\"TypeConfigurationVersionId\"] !== undefined) {\n contents.TypeConfigurationVersionId = (0, smithy_client_1.expectString)(output[\"TypeConfigurationVersionId\"]);\n }\n if (output[\"TargetDetails\"] !== undefined) {\n contents.TargetDetails = de_ChangeSetHookTargetDetails(output[\"TargetDetails\"], context);\n }\n return contents;\n};\nconst de_ChangeSetHookResourceTargetDetails = (output, context) => {\n const contents = {};\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"ResourceAction\"] !== undefined) {\n contents.ResourceAction = (0, smithy_client_1.expectString)(output[\"ResourceAction\"]);\n }\n return contents;\n};\nconst de_ChangeSetHooks = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_ChangeSetHook(entry, context);\n });\n};\nconst de_ChangeSetHookTargetDetails = (output, context) => {\n const contents = {};\n if (output[\"TargetType\"] !== undefined) {\n contents.TargetType = (0, smithy_client_1.expectString)(output[\"TargetType\"]);\n }\n if (output[\"ResourceTargetDetails\"] !== undefined) {\n contents.ResourceTargetDetails = de_ChangeSetHookResourceTargetDetails(output[\"ResourceTargetDetails\"], context);\n }\n return contents;\n};\nconst de_ChangeSetNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_ChangeSetSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_ChangeSetSummary(entry, context);\n });\n};\nconst de_ChangeSetSummary = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"ChangeSetId\"] !== undefined) {\n contents.ChangeSetId = (0, smithy_client_1.expectString)(output[\"ChangeSetId\"]);\n }\n if (output[\"ChangeSetName\"] !== undefined) {\n contents.ChangeSetName = (0, smithy_client_1.expectString)(output[\"ChangeSetName\"]);\n }\n if (output[\"ExecutionStatus\"] !== undefined) {\n contents.ExecutionStatus = (0, smithy_client_1.expectString)(output[\"ExecutionStatus\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"CreationTime\"] !== undefined) {\n contents.CreationTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTime\"]));\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"IncludeNestedStacks\"] !== undefined) {\n contents.IncludeNestedStacks = (0, smithy_client_1.parseBoolean)(output[\"IncludeNestedStacks\"]);\n }\n if (output[\"ParentChangeSetId\"] !== undefined) {\n contents.ParentChangeSetId = (0, smithy_client_1.expectString)(output[\"ParentChangeSetId\"]);\n }\n if (output[\"RootChangeSetId\"] !== undefined) {\n contents.RootChangeSetId = (0, smithy_client_1.expectString)(output[\"RootChangeSetId\"]);\n }\n return contents;\n};\nconst de_ContinueUpdateRollbackOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_CreateChangeSetOutput = (output, context) => {\n const contents = {};\n if (output[\"Id\"] !== undefined) {\n contents.Id = (0, smithy_client_1.expectString)(output[\"Id\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n return contents;\n};\nconst de_CreatedButModifiedException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_CreateStackInstancesOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_CreateStackOutput = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n return contents;\n};\nconst de_CreateStackSetOutput = (output, context) => {\n const contents = {};\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n return contents;\n};\nconst de_DeactivateOrganizationsAccessOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_DeactivateTypeOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_DeleteChangeSetOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_DeleteStackInstancesOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_DeleteStackSetOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_DeploymentTargets = (output, context) => {\n const contents = {};\n if (output.Accounts === \"\") {\n contents.Accounts = [];\n }\n else if (output[\"Accounts\"] !== undefined && output[\"Accounts\"][\"member\"] !== undefined) {\n contents.Accounts = de_AccountList((0, smithy_client_1.getArrayIfSingleItem)(output[\"Accounts\"][\"member\"]), context);\n }\n if (output[\"AccountsUrl\"] !== undefined) {\n contents.AccountsUrl = (0, smithy_client_1.expectString)(output[\"AccountsUrl\"]);\n }\n if (output.OrganizationalUnitIds === \"\") {\n contents.OrganizationalUnitIds = [];\n }\n else if (output[\"OrganizationalUnitIds\"] !== undefined && output[\"OrganizationalUnitIds\"][\"member\"] !== undefined) {\n contents.OrganizationalUnitIds = de_OrganizationalUnitIdList((0, smithy_client_1.getArrayIfSingleItem)(output[\"OrganizationalUnitIds\"][\"member\"]), context);\n }\n if (output[\"AccountFilterType\"] !== undefined) {\n contents.AccountFilterType = (0, smithy_client_1.expectString)(output[\"AccountFilterType\"]);\n }\n return contents;\n};\nconst de_DeregisterTypeOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_DescribeAccountLimitsOutput = (output, context) => {\n const contents = {};\n if (output.AccountLimits === \"\") {\n contents.AccountLimits = [];\n }\n else if (output[\"AccountLimits\"] !== undefined && output[\"AccountLimits\"][\"member\"] !== undefined) {\n contents.AccountLimits = de_AccountLimitList((0, smithy_client_1.getArrayIfSingleItem)(output[\"AccountLimits\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_DescribeChangeSetHooksOutput = (output, context) => {\n const contents = {};\n if (output[\"ChangeSetId\"] !== undefined) {\n contents.ChangeSetId = (0, smithy_client_1.expectString)(output[\"ChangeSetId\"]);\n }\n if (output[\"ChangeSetName\"] !== undefined) {\n contents.ChangeSetName = (0, smithy_client_1.expectString)(output[\"ChangeSetName\"]);\n }\n if (output.Hooks === \"\") {\n contents.Hooks = [];\n }\n else if (output[\"Hooks\"] !== undefined && output[\"Hooks\"][\"member\"] !== undefined) {\n contents.Hooks = de_ChangeSetHooks((0, smithy_client_1.getArrayIfSingleItem)(output[\"Hooks\"][\"member\"]), context);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n return contents;\n};\nconst de_DescribeChangeSetOutput = (output, context) => {\n const contents = {};\n if (output[\"ChangeSetName\"] !== undefined) {\n contents.ChangeSetName = (0, smithy_client_1.expectString)(output[\"ChangeSetName\"]);\n }\n if (output[\"ChangeSetId\"] !== undefined) {\n contents.ChangeSetId = (0, smithy_client_1.expectString)(output[\"ChangeSetId\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output.Parameters === \"\") {\n contents.Parameters = [];\n }\n else if (output[\"Parameters\"] !== undefined && output[\"Parameters\"][\"member\"] !== undefined) {\n contents.Parameters = de_Parameters((0, smithy_client_1.getArrayIfSingleItem)(output[\"Parameters\"][\"member\"]), context);\n }\n if (output[\"CreationTime\"] !== undefined) {\n contents.CreationTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTime\"]));\n }\n if (output[\"ExecutionStatus\"] !== undefined) {\n contents.ExecutionStatus = (0, smithy_client_1.expectString)(output[\"ExecutionStatus\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output.NotificationARNs === \"\") {\n contents.NotificationARNs = [];\n }\n else if (output[\"NotificationARNs\"] !== undefined && output[\"NotificationARNs\"][\"member\"] !== undefined) {\n contents.NotificationARNs = de_NotificationARNs((0, smithy_client_1.getArrayIfSingleItem)(output[\"NotificationARNs\"][\"member\"]), context);\n }\n if (output[\"RollbackConfiguration\"] !== undefined) {\n contents.RollbackConfiguration = de_RollbackConfiguration(output[\"RollbackConfiguration\"], context);\n }\n if (output.Capabilities === \"\") {\n contents.Capabilities = [];\n }\n else if (output[\"Capabilities\"] !== undefined && output[\"Capabilities\"][\"member\"] !== undefined) {\n contents.Capabilities = de_Capabilities((0, smithy_client_1.getArrayIfSingleItem)(output[\"Capabilities\"][\"member\"]), context);\n }\n if (output.Tags === \"\") {\n contents.Tags = [];\n }\n else if (output[\"Tags\"] !== undefined && output[\"Tags\"][\"member\"] !== undefined) {\n contents.Tags = de_Tags((0, smithy_client_1.getArrayIfSingleItem)(output[\"Tags\"][\"member\"]), context);\n }\n if (output.Changes === \"\") {\n contents.Changes = [];\n }\n else if (output[\"Changes\"] !== undefined && output[\"Changes\"][\"member\"] !== undefined) {\n contents.Changes = de_Changes((0, smithy_client_1.getArrayIfSingleItem)(output[\"Changes\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n if (output[\"IncludeNestedStacks\"] !== undefined) {\n contents.IncludeNestedStacks = (0, smithy_client_1.parseBoolean)(output[\"IncludeNestedStacks\"]);\n }\n if (output[\"ParentChangeSetId\"] !== undefined) {\n contents.ParentChangeSetId = (0, smithy_client_1.expectString)(output[\"ParentChangeSetId\"]);\n }\n if (output[\"RootChangeSetId\"] !== undefined) {\n contents.RootChangeSetId = (0, smithy_client_1.expectString)(output[\"RootChangeSetId\"]);\n }\n if (output[\"OnStackFailure\"] !== undefined) {\n contents.OnStackFailure = (0, smithy_client_1.expectString)(output[\"OnStackFailure\"]);\n }\n return contents;\n};\nconst de_DescribeOrganizationsAccessOutput = (output, context) => {\n const contents = {};\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n return contents;\n};\nconst de_DescribePublisherOutput = (output, context) => {\n const contents = {};\n if (output[\"PublisherId\"] !== undefined) {\n contents.PublisherId = (0, smithy_client_1.expectString)(output[\"PublisherId\"]);\n }\n if (output[\"PublisherStatus\"] !== undefined) {\n contents.PublisherStatus = (0, smithy_client_1.expectString)(output[\"PublisherStatus\"]);\n }\n if (output[\"IdentityProvider\"] !== undefined) {\n contents.IdentityProvider = (0, smithy_client_1.expectString)(output[\"IdentityProvider\"]);\n }\n if (output[\"PublisherProfile\"] !== undefined) {\n contents.PublisherProfile = (0, smithy_client_1.expectString)(output[\"PublisherProfile\"]);\n }\n return contents;\n};\nconst de_DescribeStackDriftDetectionStatusOutput = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackDriftDetectionId\"] !== undefined) {\n contents.StackDriftDetectionId = (0, smithy_client_1.expectString)(output[\"StackDriftDetectionId\"]);\n }\n if (output[\"StackDriftStatus\"] !== undefined) {\n contents.StackDriftStatus = (0, smithy_client_1.expectString)(output[\"StackDriftStatus\"]);\n }\n if (output[\"DetectionStatus\"] !== undefined) {\n contents.DetectionStatus = (0, smithy_client_1.expectString)(output[\"DetectionStatus\"]);\n }\n if (output[\"DetectionStatusReason\"] !== undefined) {\n contents.DetectionStatusReason = (0, smithy_client_1.expectString)(output[\"DetectionStatusReason\"]);\n }\n if (output[\"DriftedStackResourceCount\"] !== undefined) {\n contents.DriftedStackResourceCount = (0, smithy_client_1.strictParseInt32)(output[\"DriftedStackResourceCount\"]);\n }\n if (output[\"Timestamp\"] !== undefined) {\n contents.Timestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Timestamp\"]));\n }\n return contents;\n};\nconst de_DescribeStackEventsOutput = (output, context) => {\n const contents = {};\n if (output.StackEvents === \"\") {\n contents.StackEvents = [];\n }\n else if (output[\"StackEvents\"] !== undefined && output[\"StackEvents\"][\"member\"] !== undefined) {\n contents.StackEvents = de_StackEvents((0, smithy_client_1.getArrayIfSingleItem)(output[\"StackEvents\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_DescribeStackInstanceOutput = (output, context) => {\n const contents = {};\n if (output[\"StackInstance\"] !== undefined) {\n contents.StackInstance = de_StackInstance(output[\"StackInstance\"], context);\n }\n return contents;\n};\nconst de_DescribeStackResourceDriftsOutput = (output, context) => {\n const contents = {};\n if (output.StackResourceDrifts === \"\") {\n contents.StackResourceDrifts = [];\n }\n else if (output[\"StackResourceDrifts\"] !== undefined && output[\"StackResourceDrifts\"][\"member\"] !== undefined) {\n contents.StackResourceDrifts = de_StackResourceDrifts((0, smithy_client_1.getArrayIfSingleItem)(output[\"StackResourceDrifts\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_DescribeStackResourceOutput = (output, context) => {\n const contents = {};\n if (output[\"StackResourceDetail\"] !== undefined) {\n contents.StackResourceDetail = de_StackResourceDetail(output[\"StackResourceDetail\"], context);\n }\n return contents;\n};\nconst de_DescribeStackResourcesOutput = (output, context) => {\n const contents = {};\n if (output.StackResources === \"\") {\n contents.StackResources = [];\n }\n else if (output[\"StackResources\"] !== undefined && output[\"StackResources\"][\"member\"] !== undefined) {\n contents.StackResources = de_StackResources((0, smithy_client_1.getArrayIfSingleItem)(output[\"StackResources\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_DescribeStackSetOperationOutput = (output, context) => {\n const contents = {};\n if (output[\"StackSetOperation\"] !== undefined) {\n contents.StackSetOperation = de_StackSetOperation(output[\"StackSetOperation\"], context);\n }\n return contents;\n};\nconst de_DescribeStackSetOutput = (output, context) => {\n const contents = {};\n if (output[\"StackSet\"] !== undefined) {\n contents.StackSet = de_StackSet(output[\"StackSet\"], context);\n }\n return contents;\n};\nconst de_DescribeStacksOutput = (output, context) => {\n const contents = {};\n if (output.Stacks === \"\") {\n contents.Stacks = [];\n }\n else if (output[\"Stacks\"] !== undefined && output[\"Stacks\"][\"member\"] !== undefined) {\n contents.Stacks = de_Stacks((0, smithy_client_1.getArrayIfSingleItem)(output[\"Stacks\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_DescribeTypeOutput = (output, context) => {\n const contents = {};\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n if (output[\"DefaultVersionId\"] !== undefined) {\n contents.DefaultVersionId = (0, smithy_client_1.expectString)(output[\"DefaultVersionId\"]);\n }\n if (output[\"IsDefaultVersion\"] !== undefined) {\n contents.IsDefaultVersion = (0, smithy_client_1.parseBoolean)(output[\"IsDefaultVersion\"]);\n }\n if (output[\"TypeTestsStatus\"] !== undefined) {\n contents.TypeTestsStatus = (0, smithy_client_1.expectString)(output[\"TypeTestsStatus\"]);\n }\n if (output[\"TypeTestsStatusDescription\"] !== undefined) {\n contents.TypeTestsStatusDescription = (0, smithy_client_1.expectString)(output[\"TypeTestsStatusDescription\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"Schema\"] !== undefined) {\n contents.Schema = (0, smithy_client_1.expectString)(output[\"Schema\"]);\n }\n if (output[\"ProvisioningType\"] !== undefined) {\n contents.ProvisioningType = (0, smithy_client_1.expectString)(output[\"ProvisioningType\"]);\n }\n if (output[\"DeprecatedStatus\"] !== undefined) {\n contents.DeprecatedStatus = (0, smithy_client_1.expectString)(output[\"DeprecatedStatus\"]);\n }\n if (output[\"LoggingConfig\"] !== undefined) {\n contents.LoggingConfig = de_LoggingConfig(output[\"LoggingConfig\"], context);\n }\n if (output.RequiredActivatedTypes === \"\") {\n contents.RequiredActivatedTypes = [];\n }\n else if (output[\"RequiredActivatedTypes\"] !== undefined &&\n output[\"RequiredActivatedTypes\"][\"member\"] !== undefined) {\n contents.RequiredActivatedTypes = de_RequiredActivatedTypes((0, smithy_client_1.getArrayIfSingleItem)(output[\"RequiredActivatedTypes\"][\"member\"]), context);\n }\n if (output[\"ExecutionRoleArn\"] !== undefined) {\n contents.ExecutionRoleArn = (0, smithy_client_1.expectString)(output[\"ExecutionRoleArn\"]);\n }\n if (output[\"Visibility\"] !== undefined) {\n contents.Visibility = (0, smithy_client_1.expectString)(output[\"Visibility\"]);\n }\n if (output[\"SourceUrl\"] !== undefined) {\n contents.SourceUrl = (0, smithy_client_1.expectString)(output[\"SourceUrl\"]);\n }\n if (output[\"DocumentationUrl\"] !== undefined) {\n contents.DocumentationUrl = (0, smithy_client_1.expectString)(output[\"DocumentationUrl\"]);\n }\n if (output[\"LastUpdated\"] !== undefined) {\n contents.LastUpdated = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdated\"]));\n }\n if (output[\"TimeCreated\"] !== undefined) {\n contents.TimeCreated = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"TimeCreated\"]));\n }\n if (output[\"ConfigurationSchema\"] !== undefined) {\n contents.ConfigurationSchema = (0, smithy_client_1.expectString)(output[\"ConfigurationSchema\"]);\n }\n if (output[\"PublisherId\"] !== undefined) {\n contents.PublisherId = (0, smithy_client_1.expectString)(output[\"PublisherId\"]);\n }\n if (output[\"OriginalTypeName\"] !== undefined) {\n contents.OriginalTypeName = (0, smithy_client_1.expectString)(output[\"OriginalTypeName\"]);\n }\n if (output[\"OriginalTypeArn\"] !== undefined) {\n contents.OriginalTypeArn = (0, smithy_client_1.expectString)(output[\"OriginalTypeArn\"]);\n }\n if (output[\"PublicVersionNumber\"] !== undefined) {\n contents.PublicVersionNumber = (0, smithy_client_1.expectString)(output[\"PublicVersionNumber\"]);\n }\n if (output[\"LatestPublicVersion\"] !== undefined) {\n contents.LatestPublicVersion = (0, smithy_client_1.expectString)(output[\"LatestPublicVersion\"]);\n }\n if (output[\"IsActivated\"] !== undefined) {\n contents.IsActivated = (0, smithy_client_1.parseBoolean)(output[\"IsActivated\"]);\n }\n if (output[\"AutoUpdate\"] !== undefined) {\n contents.AutoUpdate = (0, smithy_client_1.parseBoolean)(output[\"AutoUpdate\"]);\n }\n return contents;\n};\nconst de_DescribeTypeRegistrationOutput = (output, context) => {\n const contents = {};\n if (output[\"ProgressStatus\"] !== undefined) {\n contents.ProgressStatus = (0, smithy_client_1.expectString)(output[\"ProgressStatus\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"TypeArn\"] !== undefined) {\n contents.TypeArn = (0, smithy_client_1.expectString)(output[\"TypeArn\"]);\n }\n if (output[\"TypeVersionArn\"] !== undefined) {\n contents.TypeVersionArn = (0, smithy_client_1.expectString)(output[\"TypeVersionArn\"]);\n }\n return contents;\n};\nconst de_DetectStackDriftOutput = (output, context) => {\n const contents = {};\n if (output[\"StackDriftDetectionId\"] !== undefined) {\n contents.StackDriftDetectionId = (0, smithy_client_1.expectString)(output[\"StackDriftDetectionId\"]);\n }\n return contents;\n};\nconst de_DetectStackResourceDriftOutput = (output, context) => {\n const contents = {};\n if (output[\"StackResourceDrift\"] !== undefined) {\n contents.StackResourceDrift = de_StackResourceDrift(output[\"StackResourceDrift\"], context);\n }\n return contents;\n};\nconst de_DetectStackSetDriftOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_EstimateTemplateCostOutput = (output, context) => {\n const contents = {};\n if (output[\"Url\"] !== undefined) {\n contents.Url = (0, smithy_client_1.expectString)(output[\"Url\"]);\n }\n return contents;\n};\nconst de_ExecuteChangeSetOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_Export = (output, context) => {\n const contents = {};\n if (output[\"ExportingStackId\"] !== undefined) {\n contents.ExportingStackId = (0, smithy_client_1.expectString)(output[\"ExportingStackId\"]);\n }\n if (output[\"Name\"] !== undefined) {\n contents.Name = (0, smithy_client_1.expectString)(output[\"Name\"]);\n }\n if (output[\"Value\"] !== undefined) {\n contents.Value = (0, smithy_client_1.expectString)(output[\"Value\"]);\n }\n return contents;\n};\nconst de_Exports = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Export(entry, context);\n });\n};\nconst de_GetStackPolicyOutput = (output, context) => {\n const contents = {};\n if (output[\"StackPolicyBody\"] !== undefined) {\n contents.StackPolicyBody = (0, smithy_client_1.expectString)(output[\"StackPolicyBody\"]);\n }\n return contents;\n};\nconst de_GetTemplateOutput = (output, context) => {\n const contents = {};\n if (output[\"TemplateBody\"] !== undefined) {\n contents.TemplateBody = (0, smithy_client_1.expectString)(output[\"TemplateBody\"]);\n }\n if (output.StagesAvailable === \"\") {\n contents.StagesAvailable = [];\n }\n else if (output[\"StagesAvailable\"] !== undefined && output[\"StagesAvailable\"][\"member\"] !== undefined) {\n contents.StagesAvailable = de_StageList((0, smithy_client_1.getArrayIfSingleItem)(output[\"StagesAvailable\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_GetTemplateSummaryOutput = (output, context) => {\n const contents = {};\n if (output.Parameters === \"\") {\n contents.Parameters = [];\n }\n else if (output[\"Parameters\"] !== undefined && output[\"Parameters\"][\"member\"] !== undefined) {\n contents.Parameters = de_ParameterDeclarations((0, smithy_client_1.getArrayIfSingleItem)(output[\"Parameters\"][\"member\"]), context);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output.Capabilities === \"\") {\n contents.Capabilities = [];\n }\n else if (output[\"Capabilities\"] !== undefined && output[\"Capabilities\"][\"member\"] !== undefined) {\n contents.Capabilities = de_Capabilities((0, smithy_client_1.getArrayIfSingleItem)(output[\"Capabilities\"][\"member\"]), context);\n }\n if (output[\"CapabilitiesReason\"] !== undefined) {\n contents.CapabilitiesReason = (0, smithy_client_1.expectString)(output[\"CapabilitiesReason\"]);\n }\n if (output.ResourceTypes === \"\") {\n contents.ResourceTypes = [];\n }\n else if (output[\"ResourceTypes\"] !== undefined && output[\"ResourceTypes\"][\"member\"] !== undefined) {\n contents.ResourceTypes = de_ResourceTypes((0, smithy_client_1.getArrayIfSingleItem)(output[\"ResourceTypes\"][\"member\"]), context);\n }\n if (output[\"Version\"] !== undefined) {\n contents.Version = (0, smithy_client_1.expectString)(output[\"Version\"]);\n }\n if (output[\"Metadata\"] !== undefined) {\n contents.Metadata = (0, smithy_client_1.expectString)(output[\"Metadata\"]);\n }\n if (output.DeclaredTransforms === \"\") {\n contents.DeclaredTransforms = [];\n }\n else if (output[\"DeclaredTransforms\"] !== undefined && output[\"DeclaredTransforms\"][\"member\"] !== undefined) {\n contents.DeclaredTransforms = de_TransformsList((0, smithy_client_1.getArrayIfSingleItem)(output[\"DeclaredTransforms\"][\"member\"]), context);\n }\n if (output.ResourceIdentifierSummaries === \"\") {\n contents.ResourceIdentifierSummaries = [];\n }\n else if (output[\"ResourceIdentifierSummaries\"] !== undefined &&\n output[\"ResourceIdentifierSummaries\"][\"member\"] !== undefined) {\n contents.ResourceIdentifierSummaries = de_ResourceIdentifierSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"ResourceIdentifierSummaries\"][\"member\"]), context);\n }\n if (output[\"Warnings\"] !== undefined) {\n contents.Warnings = de_Warnings(output[\"Warnings\"], context);\n }\n return contents;\n};\nconst de_Imports = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_ImportStacksToStackSetOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_InsufficientCapabilitiesException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_InvalidChangeSetStatusException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_InvalidOperationException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_InvalidStateTransitionException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_LimitExceededException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_ListChangeSetsOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_ChangeSetSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListExportsOutput = (output, context) => {\n const contents = {};\n if (output.Exports === \"\") {\n contents.Exports = [];\n }\n else if (output[\"Exports\"] !== undefined && output[\"Exports\"][\"member\"] !== undefined) {\n contents.Exports = de_Exports((0, smithy_client_1.getArrayIfSingleItem)(output[\"Exports\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListImportsOutput = (output, context) => {\n const contents = {};\n if (output.Imports === \"\") {\n contents.Imports = [];\n }\n else if (output[\"Imports\"] !== undefined && output[\"Imports\"][\"member\"] !== undefined) {\n contents.Imports = de_Imports((0, smithy_client_1.getArrayIfSingleItem)(output[\"Imports\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackInstanceResourceDriftsOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_StackInstanceResourceDriftsSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackInstancesOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_StackInstanceSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackResourcesOutput = (output, context) => {\n const contents = {};\n if (output.StackResourceSummaries === \"\") {\n contents.StackResourceSummaries = [];\n }\n else if (output[\"StackResourceSummaries\"] !== undefined &&\n output[\"StackResourceSummaries\"][\"member\"] !== undefined) {\n contents.StackResourceSummaries = de_StackResourceSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"StackResourceSummaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackSetOperationResultsOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_StackSetOperationResultSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackSetOperationsOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_StackSetOperationSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackSetsOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_StackSetSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStacksOutput = (output, context) => {\n const contents = {};\n if (output.StackSummaries === \"\") {\n contents.StackSummaries = [];\n }\n else if (output[\"StackSummaries\"] !== undefined && output[\"StackSummaries\"][\"member\"] !== undefined) {\n contents.StackSummaries = de_StackSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"StackSummaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListTypeRegistrationsOutput = (output, context) => {\n const contents = {};\n if (output.RegistrationTokenList === \"\") {\n contents.RegistrationTokenList = [];\n }\n else if (output[\"RegistrationTokenList\"] !== undefined && output[\"RegistrationTokenList\"][\"member\"] !== undefined) {\n contents.RegistrationTokenList = de_RegistrationTokenList((0, smithy_client_1.getArrayIfSingleItem)(output[\"RegistrationTokenList\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListTypesOutput = (output, context) => {\n const contents = {};\n if (output.TypeSummaries === \"\") {\n contents.TypeSummaries = [];\n }\n else if (output[\"TypeSummaries\"] !== undefined && output[\"TypeSummaries\"][\"member\"] !== undefined) {\n contents.TypeSummaries = de_TypeSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"TypeSummaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListTypeVersionsOutput = (output, context) => {\n const contents = {};\n if (output.TypeVersionSummaries === \"\") {\n contents.TypeVersionSummaries = [];\n }\n else if (output[\"TypeVersionSummaries\"] !== undefined && output[\"TypeVersionSummaries\"][\"member\"] !== undefined) {\n contents.TypeVersionSummaries = de_TypeVersionSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"TypeVersionSummaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_LoggingConfig = (output, context) => {\n const contents = {};\n if (output[\"LogRoleArn\"] !== undefined) {\n contents.LogRoleArn = (0, smithy_client_1.expectString)(output[\"LogRoleArn\"]);\n }\n if (output[\"LogGroupName\"] !== undefined) {\n contents.LogGroupName = (0, smithy_client_1.expectString)(output[\"LogGroupName\"]);\n }\n return contents;\n};\nconst de_LogicalResourceIds = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_ManagedExecution = (output, context) => {\n const contents = {};\n if (output[\"Active\"] !== undefined) {\n contents.Active = (0, smithy_client_1.parseBoolean)(output[\"Active\"]);\n }\n return contents;\n};\nconst de_ModuleInfo = (output, context) => {\n const contents = {};\n if (output[\"TypeHierarchy\"] !== undefined) {\n contents.TypeHierarchy = (0, smithy_client_1.expectString)(output[\"TypeHierarchy\"]);\n }\n if (output[\"LogicalIdHierarchy\"] !== undefined) {\n contents.LogicalIdHierarchy = (0, smithy_client_1.expectString)(output[\"LogicalIdHierarchy\"]);\n }\n return contents;\n};\nconst de_NameAlreadyExistsException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_NotificationARNs = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_OperationIdAlreadyExistsException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_OperationInProgressException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_OperationNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_OperationStatusCheckFailedException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_OrganizationalUnitIdList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_Output = (output, context) => {\n const contents = {};\n if (output[\"OutputKey\"] !== undefined) {\n contents.OutputKey = (0, smithy_client_1.expectString)(output[\"OutputKey\"]);\n }\n if (output[\"OutputValue\"] !== undefined) {\n contents.OutputValue = (0, smithy_client_1.expectString)(output[\"OutputValue\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"ExportName\"] !== undefined) {\n contents.ExportName = (0, smithy_client_1.expectString)(output[\"ExportName\"]);\n }\n return contents;\n};\nconst de_Outputs = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Output(entry, context);\n });\n};\nconst de_Parameter = (output, context) => {\n const contents = {};\n if (output[\"ParameterKey\"] !== undefined) {\n contents.ParameterKey = (0, smithy_client_1.expectString)(output[\"ParameterKey\"]);\n }\n if (output[\"ParameterValue\"] !== undefined) {\n contents.ParameterValue = (0, smithy_client_1.expectString)(output[\"ParameterValue\"]);\n }\n if (output[\"UsePreviousValue\"] !== undefined) {\n contents.UsePreviousValue = (0, smithy_client_1.parseBoolean)(output[\"UsePreviousValue\"]);\n }\n if (output[\"ResolvedValue\"] !== undefined) {\n contents.ResolvedValue = (0, smithy_client_1.expectString)(output[\"ResolvedValue\"]);\n }\n return contents;\n};\nconst de_ParameterConstraints = (output, context) => {\n const contents = {};\n if (output.AllowedValues === \"\") {\n contents.AllowedValues = [];\n }\n else if (output[\"AllowedValues\"] !== undefined && output[\"AllowedValues\"][\"member\"] !== undefined) {\n contents.AllowedValues = de_AllowedValues((0, smithy_client_1.getArrayIfSingleItem)(output[\"AllowedValues\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_ParameterDeclaration = (output, context) => {\n const contents = {};\n if (output[\"ParameterKey\"] !== undefined) {\n contents.ParameterKey = (0, smithy_client_1.expectString)(output[\"ParameterKey\"]);\n }\n if (output[\"DefaultValue\"] !== undefined) {\n contents.DefaultValue = (0, smithy_client_1.expectString)(output[\"DefaultValue\"]);\n }\n if (output[\"ParameterType\"] !== undefined) {\n contents.ParameterType = (0, smithy_client_1.expectString)(output[\"ParameterType\"]);\n }\n if (output[\"NoEcho\"] !== undefined) {\n contents.NoEcho = (0, smithy_client_1.parseBoolean)(output[\"NoEcho\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"ParameterConstraints\"] !== undefined) {\n contents.ParameterConstraints = de_ParameterConstraints(output[\"ParameterConstraints\"], context);\n }\n return contents;\n};\nconst de_ParameterDeclarations = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_ParameterDeclaration(entry, context);\n });\n};\nconst de_Parameters = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Parameter(entry, context);\n });\n};\nconst de_PhysicalResourceIdContext = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_PhysicalResourceIdContextKeyValuePair(entry, context);\n });\n};\nconst de_PhysicalResourceIdContextKeyValuePair = (output, context) => {\n const contents = {};\n if (output[\"Key\"] !== undefined) {\n contents.Key = (0, smithy_client_1.expectString)(output[\"Key\"]);\n }\n if (output[\"Value\"] !== undefined) {\n contents.Value = (0, smithy_client_1.expectString)(output[\"Value\"]);\n }\n return contents;\n};\nconst de_PropertyDifference = (output, context) => {\n const contents = {};\n if (output[\"PropertyPath\"] !== undefined) {\n contents.PropertyPath = (0, smithy_client_1.expectString)(output[\"PropertyPath\"]);\n }\n if (output[\"ExpectedValue\"] !== undefined) {\n contents.ExpectedValue = (0, smithy_client_1.expectString)(output[\"ExpectedValue\"]);\n }\n if (output[\"ActualValue\"] !== undefined) {\n contents.ActualValue = (0, smithy_client_1.expectString)(output[\"ActualValue\"]);\n }\n if (output[\"DifferenceType\"] !== undefined) {\n contents.DifferenceType = (0, smithy_client_1.expectString)(output[\"DifferenceType\"]);\n }\n return contents;\n};\nconst de_PropertyDifferences = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_PropertyDifference(entry, context);\n });\n};\nconst de_PublishTypeOutput = (output, context) => {\n const contents = {};\n if (output[\"PublicTypeArn\"] !== undefined) {\n contents.PublicTypeArn = (0, smithy_client_1.expectString)(output[\"PublicTypeArn\"]);\n }\n return contents;\n};\nconst de_RecordHandlerProgressOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_RegionList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_RegisterPublisherOutput = (output, context) => {\n const contents = {};\n if (output[\"PublisherId\"] !== undefined) {\n contents.PublisherId = (0, smithy_client_1.expectString)(output[\"PublisherId\"]);\n }\n return contents;\n};\nconst de_RegisterTypeOutput = (output, context) => {\n const contents = {};\n if (output[\"RegistrationToken\"] !== undefined) {\n contents.RegistrationToken = (0, smithy_client_1.expectString)(output[\"RegistrationToken\"]);\n }\n return contents;\n};\nconst de_RegistrationTokenList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_RequiredActivatedType = (output, context) => {\n const contents = {};\n if (output[\"TypeNameAlias\"] !== undefined) {\n contents.TypeNameAlias = (0, smithy_client_1.expectString)(output[\"TypeNameAlias\"]);\n }\n if (output[\"OriginalTypeName\"] !== undefined) {\n contents.OriginalTypeName = (0, smithy_client_1.expectString)(output[\"OriginalTypeName\"]);\n }\n if (output[\"PublisherId\"] !== undefined) {\n contents.PublisherId = (0, smithy_client_1.expectString)(output[\"PublisherId\"]);\n }\n if (output.SupportedMajorVersions === \"\") {\n contents.SupportedMajorVersions = [];\n }\n else if (output[\"SupportedMajorVersions\"] !== undefined &&\n output[\"SupportedMajorVersions\"][\"member\"] !== undefined) {\n contents.SupportedMajorVersions = de_SupportedMajorVersions((0, smithy_client_1.getArrayIfSingleItem)(output[\"SupportedMajorVersions\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_RequiredActivatedTypes = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_RequiredActivatedType(entry, context);\n });\n};\nconst de_ResourceChange = (output, context) => {\n const contents = {};\n if (output[\"Action\"] !== undefined) {\n contents.Action = (0, smithy_client_1.expectString)(output[\"Action\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"Replacement\"] !== undefined) {\n contents.Replacement = (0, smithy_client_1.expectString)(output[\"Replacement\"]);\n }\n if (output.Scope === \"\") {\n contents.Scope = [];\n }\n else if (output[\"Scope\"] !== undefined && output[\"Scope\"][\"member\"] !== undefined) {\n contents.Scope = de_Scope((0, smithy_client_1.getArrayIfSingleItem)(output[\"Scope\"][\"member\"]), context);\n }\n if (output.Details === \"\") {\n contents.Details = [];\n }\n else if (output[\"Details\"] !== undefined && output[\"Details\"][\"member\"] !== undefined) {\n contents.Details = de_ResourceChangeDetails((0, smithy_client_1.getArrayIfSingleItem)(output[\"Details\"][\"member\"]), context);\n }\n if (output[\"ChangeSetId\"] !== undefined) {\n contents.ChangeSetId = (0, smithy_client_1.expectString)(output[\"ChangeSetId\"]);\n }\n if (output[\"ModuleInfo\"] !== undefined) {\n contents.ModuleInfo = de_ModuleInfo(output[\"ModuleInfo\"], context);\n }\n return contents;\n};\nconst de_ResourceChangeDetail = (output, context) => {\n const contents = {};\n if (output[\"Target\"] !== undefined) {\n contents.Target = de_ResourceTargetDefinition(output[\"Target\"], context);\n }\n if (output[\"Evaluation\"] !== undefined) {\n contents.Evaluation = (0, smithy_client_1.expectString)(output[\"Evaluation\"]);\n }\n if (output[\"ChangeSource\"] !== undefined) {\n contents.ChangeSource = (0, smithy_client_1.expectString)(output[\"ChangeSource\"]);\n }\n if (output[\"CausingEntity\"] !== undefined) {\n contents.CausingEntity = (0, smithy_client_1.expectString)(output[\"CausingEntity\"]);\n }\n return contents;\n};\nconst de_ResourceChangeDetails = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_ResourceChangeDetail(entry, context);\n });\n};\nconst de_ResourceIdentifiers = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_ResourceIdentifierSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_ResourceIdentifierSummary(entry, context);\n });\n};\nconst de_ResourceIdentifierSummary = (output, context) => {\n const contents = {};\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output.LogicalResourceIds === \"\") {\n contents.LogicalResourceIds = [];\n }\n else if (output[\"LogicalResourceIds\"] !== undefined && output[\"LogicalResourceIds\"][\"member\"] !== undefined) {\n contents.LogicalResourceIds = de_LogicalResourceIds((0, smithy_client_1.getArrayIfSingleItem)(output[\"LogicalResourceIds\"][\"member\"]), context);\n }\n if (output.ResourceIdentifiers === \"\") {\n contents.ResourceIdentifiers = [];\n }\n else if (output[\"ResourceIdentifiers\"] !== undefined && output[\"ResourceIdentifiers\"][\"member\"] !== undefined) {\n contents.ResourceIdentifiers = de_ResourceIdentifiers((0, smithy_client_1.getArrayIfSingleItem)(output[\"ResourceIdentifiers\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_ResourceTargetDefinition = (output, context) => {\n const contents = {};\n if (output[\"Attribute\"] !== undefined) {\n contents.Attribute = (0, smithy_client_1.expectString)(output[\"Attribute\"]);\n }\n if (output[\"Name\"] !== undefined) {\n contents.Name = (0, smithy_client_1.expectString)(output[\"Name\"]);\n }\n if (output[\"RequiresRecreation\"] !== undefined) {\n contents.RequiresRecreation = (0, smithy_client_1.expectString)(output[\"RequiresRecreation\"]);\n }\n return contents;\n};\nconst de_ResourceTypes = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_RollbackConfiguration = (output, context) => {\n const contents = {};\n if (output.RollbackTriggers === \"\") {\n contents.RollbackTriggers = [];\n }\n else if (output[\"RollbackTriggers\"] !== undefined && output[\"RollbackTriggers\"][\"member\"] !== undefined) {\n contents.RollbackTriggers = de_RollbackTriggers((0, smithy_client_1.getArrayIfSingleItem)(output[\"RollbackTriggers\"][\"member\"]), context);\n }\n if (output[\"MonitoringTimeInMinutes\"] !== undefined) {\n contents.MonitoringTimeInMinutes = (0, smithy_client_1.strictParseInt32)(output[\"MonitoringTimeInMinutes\"]);\n }\n return contents;\n};\nconst de_RollbackStackOutput = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n return contents;\n};\nconst de_RollbackTrigger = (output, context) => {\n const contents = {};\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n return contents;\n};\nconst de_RollbackTriggers = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_RollbackTrigger(entry, context);\n });\n};\nconst de_Scope = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_SetTypeConfigurationOutput = (output, context) => {\n const contents = {};\n if (output[\"ConfigurationArn\"] !== undefined) {\n contents.ConfigurationArn = (0, smithy_client_1.expectString)(output[\"ConfigurationArn\"]);\n }\n return contents;\n};\nconst de_SetTypeDefaultVersionOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_Stack = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"ChangeSetId\"] !== undefined) {\n contents.ChangeSetId = (0, smithy_client_1.expectString)(output[\"ChangeSetId\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output.Parameters === \"\") {\n contents.Parameters = [];\n }\n else if (output[\"Parameters\"] !== undefined && output[\"Parameters\"][\"member\"] !== undefined) {\n contents.Parameters = de_Parameters((0, smithy_client_1.getArrayIfSingleItem)(output[\"Parameters\"][\"member\"]), context);\n }\n if (output[\"CreationTime\"] !== undefined) {\n contents.CreationTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTime\"]));\n }\n if (output[\"DeletionTime\"] !== undefined) {\n contents.DeletionTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"DeletionTime\"]));\n }\n if (output[\"LastUpdatedTime\"] !== undefined) {\n contents.LastUpdatedTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdatedTime\"]));\n }\n if (output[\"RollbackConfiguration\"] !== undefined) {\n contents.RollbackConfiguration = de_RollbackConfiguration(output[\"RollbackConfiguration\"], context);\n }\n if (output[\"StackStatus\"] !== undefined) {\n contents.StackStatus = (0, smithy_client_1.expectString)(output[\"StackStatus\"]);\n }\n if (output[\"StackStatusReason\"] !== undefined) {\n contents.StackStatusReason = (0, smithy_client_1.expectString)(output[\"StackStatusReason\"]);\n }\n if (output[\"DisableRollback\"] !== undefined) {\n contents.DisableRollback = (0, smithy_client_1.parseBoolean)(output[\"DisableRollback\"]);\n }\n if (output.NotificationARNs === \"\") {\n contents.NotificationARNs = [];\n }\n else if (output[\"NotificationARNs\"] !== undefined && output[\"NotificationARNs\"][\"member\"] !== undefined) {\n contents.NotificationARNs = de_NotificationARNs((0, smithy_client_1.getArrayIfSingleItem)(output[\"NotificationARNs\"][\"member\"]), context);\n }\n if (output[\"TimeoutInMinutes\"] !== undefined) {\n contents.TimeoutInMinutes = (0, smithy_client_1.strictParseInt32)(output[\"TimeoutInMinutes\"]);\n }\n if (output.Capabilities === \"\") {\n contents.Capabilities = [];\n }\n else if (output[\"Capabilities\"] !== undefined && output[\"Capabilities\"][\"member\"] !== undefined) {\n contents.Capabilities = de_Capabilities((0, smithy_client_1.getArrayIfSingleItem)(output[\"Capabilities\"][\"member\"]), context);\n }\n if (output.Outputs === \"\") {\n contents.Outputs = [];\n }\n else if (output[\"Outputs\"] !== undefined && output[\"Outputs\"][\"member\"] !== undefined) {\n contents.Outputs = de_Outputs((0, smithy_client_1.getArrayIfSingleItem)(output[\"Outputs\"][\"member\"]), context);\n }\n if (output[\"RoleARN\"] !== undefined) {\n contents.RoleARN = (0, smithy_client_1.expectString)(output[\"RoleARN\"]);\n }\n if (output.Tags === \"\") {\n contents.Tags = [];\n }\n else if (output[\"Tags\"] !== undefined && output[\"Tags\"][\"member\"] !== undefined) {\n contents.Tags = de_Tags((0, smithy_client_1.getArrayIfSingleItem)(output[\"Tags\"][\"member\"]), context);\n }\n if (output[\"EnableTerminationProtection\"] !== undefined) {\n contents.EnableTerminationProtection = (0, smithy_client_1.parseBoolean)(output[\"EnableTerminationProtection\"]);\n }\n if (output[\"ParentId\"] !== undefined) {\n contents.ParentId = (0, smithy_client_1.expectString)(output[\"ParentId\"]);\n }\n if (output[\"RootId\"] !== undefined) {\n contents.RootId = (0, smithy_client_1.expectString)(output[\"RootId\"]);\n }\n if (output[\"DriftInformation\"] !== undefined) {\n contents.DriftInformation = de_StackDriftInformation(output[\"DriftInformation\"], context);\n }\n if (output[\"RetainExceptOnCreate\"] !== undefined) {\n contents.RetainExceptOnCreate = (0, smithy_client_1.parseBoolean)(output[\"RetainExceptOnCreate\"]);\n }\n return contents;\n};\nconst de_StackDriftInformation = (output, context) => {\n const contents = {};\n if (output[\"StackDriftStatus\"] !== undefined) {\n contents.StackDriftStatus = (0, smithy_client_1.expectString)(output[\"StackDriftStatus\"]);\n }\n if (output[\"LastCheckTimestamp\"] !== undefined) {\n contents.LastCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastCheckTimestamp\"]));\n }\n return contents;\n};\nconst de_StackDriftInformationSummary = (output, context) => {\n const contents = {};\n if (output[\"StackDriftStatus\"] !== undefined) {\n contents.StackDriftStatus = (0, smithy_client_1.expectString)(output[\"StackDriftStatus\"]);\n }\n if (output[\"LastCheckTimestamp\"] !== undefined) {\n contents.LastCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastCheckTimestamp\"]));\n }\n return contents;\n};\nconst de_StackEvent = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"EventId\"] !== undefined) {\n contents.EventId = (0, smithy_client_1.expectString)(output[\"EventId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"Timestamp\"] !== undefined) {\n contents.Timestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Timestamp\"]));\n }\n if (output[\"ResourceStatus\"] !== undefined) {\n contents.ResourceStatus = (0, smithy_client_1.expectString)(output[\"ResourceStatus\"]);\n }\n if (output[\"ResourceStatusReason\"] !== undefined) {\n contents.ResourceStatusReason = (0, smithy_client_1.expectString)(output[\"ResourceStatusReason\"]);\n }\n if (output[\"ResourceProperties\"] !== undefined) {\n contents.ResourceProperties = (0, smithy_client_1.expectString)(output[\"ResourceProperties\"]);\n }\n if (output[\"ClientRequestToken\"] !== undefined) {\n contents.ClientRequestToken = (0, smithy_client_1.expectString)(output[\"ClientRequestToken\"]);\n }\n if (output[\"HookType\"] !== undefined) {\n contents.HookType = (0, smithy_client_1.expectString)(output[\"HookType\"]);\n }\n if (output[\"HookStatus\"] !== undefined) {\n contents.HookStatus = (0, smithy_client_1.expectString)(output[\"HookStatus\"]);\n }\n if (output[\"HookStatusReason\"] !== undefined) {\n contents.HookStatusReason = (0, smithy_client_1.expectString)(output[\"HookStatusReason\"]);\n }\n if (output[\"HookInvocationPoint\"] !== undefined) {\n contents.HookInvocationPoint = (0, smithy_client_1.expectString)(output[\"HookInvocationPoint\"]);\n }\n if (output[\"HookFailureMode\"] !== undefined) {\n contents.HookFailureMode = (0, smithy_client_1.expectString)(output[\"HookFailureMode\"]);\n }\n return contents;\n};\nconst de_StackEvents = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackEvent(entry, context);\n });\n};\nconst de_StackInstance = (output, context) => {\n const contents = {};\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n if (output[\"Region\"] !== undefined) {\n contents.Region = (0, smithy_client_1.expectString)(output[\"Region\"]);\n }\n if (output[\"Account\"] !== undefined) {\n contents.Account = (0, smithy_client_1.expectString)(output[\"Account\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output.ParameterOverrides === \"\") {\n contents.ParameterOverrides = [];\n }\n else if (output[\"ParameterOverrides\"] !== undefined && output[\"ParameterOverrides\"][\"member\"] !== undefined) {\n contents.ParameterOverrides = de_Parameters((0, smithy_client_1.getArrayIfSingleItem)(output[\"ParameterOverrides\"][\"member\"]), context);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StackInstanceStatus\"] !== undefined) {\n contents.StackInstanceStatus = de_StackInstanceComprehensiveStatus(output[\"StackInstanceStatus\"], context);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"OrganizationalUnitId\"] !== undefined) {\n contents.OrganizationalUnitId = (0, smithy_client_1.expectString)(output[\"OrganizationalUnitId\"]);\n }\n if (output[\"DriftStatus\"] !== undefined) {\n contents.DriftStatus = (0, smithy_client_1.expectString)(output[\"DriftStatus\"]);\n }\n if (output[\"LastDriftCheckTimestamp\"] !== undefined) {\n contents.LastDriftCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastDriftCheckTimestamp\"]));\n }\n if (output[\"LastOperationId\"] !== undefined) {\n contents.LastOperationId = (0, smithy_client_1.expectString)(output[\"LastOperationId\"]);\n }\n return contents;\n};\nconst de_StackInstanceComprehensiveStatus = (output, context) => {\n const contents = {};\n if (output[\"DetailedStatus\"] !== undefined) {\n contents.DetailedStatus = (0, smithy_client_1.expectString)(output[\"DetailedStatus\"]);\n }\n return contents;\n};\nconst de_StackInstanceNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_StackInstanceResourceDriftsSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackInstanceResourceDriftsSummary(entry, context);\n });\n};\nconst de_StackInstanceResourceDriftsSummary = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output.PhysicalResourceIdContext === \"\") {\n contents.PhysicalResourceIdContext = [];\n }\n else if (output[\"PhysicalResourceIdContext\"] !== undefined &&\n output[\"PhysicalResourceIdContext\"][\"member\"] !== undefined) {\n contents.PhysicalResourceIdContext = de_PhysicalResourceIdContext((0, smithy_client_1.getArrayIfSingleItem)(output[\"PhysicalResourceIdContext\"][\"member\"]), context);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output.PropertyDifferences === \"\") {\n contents.PropertyDifferences = [];\n }\n else if (output[\"PropertyDifferences\"] !== undefined && output[\"PropertyDifferences\"][\"member\"] !== undefined) {\n contents.PropertyDifferences = de_PropertyDifferences((0, smithy_client_1.getArrayIfSingleItem)(output[\"PropertyDifferences\"][\"member\"]), context);\n }\n if (output[\"StackResourceDriftStatus\"] !== undefined) {\n contents.StackResourceDriftStatus = (0, smithy_client_1.expectString)(output[\"StackResourceDriftStatus\"]);\n }\n if (output[\"Timestamp\"] !== undefined) {\n contents.Timestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Timestamp\"]));\n }\n return contents;\n};\nconst de_StackInstanceSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackInstanceSummary(entry, context);\n });\n};\nconst de_StackInstanceSummary = (output, context) => {\n const contents = {};\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n if (output[\"Region\"] !== undefined) {\n contents.Region = (0, smithy_client_1.expectString)(output[\"Region\"]);\n }\n if (output[\"Account\"] !== undefined) {\n contents.Account = (0, smithy_client_1.expectString)(output[\"Account\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"StackInstanceStatus\"] !== undefined) {\n contents.StackInstanceStatus = de_StackInstanceComprehensiveStatus(output[\"StackInstanceStatus\"], context);\n }\n if (output[\"OrganizationalUnitId\"] !== undefined) {\n contents.OrganizationalUnitId = (0, smithy_client_1.expectString)(output[\"OrganizationalUnitId\"]);\n }\n if (output[\"DriftStatus\"] !== undefined) {\n contents.DriftStatus = (0, smithy_client_1.expectString)(output[\"DriftStatus\"]);\n }\n if (output[\"LastDriftCheckTimestamp\"] !== undefined) {\n contents.LastDriftCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastDriftCheckTimestamp\"]));\n }\n if (output[\"LastOperationId\"] !== undefined) {\n contents.LastOperationId = (0, smithy_client_1.expectString)(output[\"LastOperationId\"]);\n }\n return contents;\n};\nconst de_StackNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_StackResource = (output, context) => {\n const contents = {};\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"Timestamp\"] !== undefined) {\n contents.Timestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Timestamp\"]));\n }\n if (output[\"ResourceStatus\"] !== undefined) {\n contents.ResourceStatus = (0, smithy_client_1.expectString)(output[\"ResourceStatus\"]);\n }\n if (output[\"ResourceStatusReason\"] !== undefined) {\n contents.ResourceStatusReason = (0, smithy_client_1.expectString)(output[\"ResourceStatusReason\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"DriftInformation\"] !== undefined) {\n contents.DriftInformation = de_StackResourceDriftInformation(output[\"DriftInformation\"], context);\n }\n if (output[\"ModuleInfo\"] !== undefined) {\n contents.ModuleInfo = de_ModuleInfo(output[\"ModuleInfo\"], context);\n }\n return contents;\n};\nconst de_StackResourceDetail = (output, context) => {\n const contents = {};\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"LastUpdatedTimestamp\"] !== undefined) {\n contents.LastUpdatedTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdatedTimestamp\"]));\n }\n if (output[\"ResourceStatus\"] !== undefined) {\n contents.ResourceStatus = (0, smithy_client_1.expectString)(output[\"ResourceStatus\"]);\n }\n if (output[\"ResourceStatusReason\"] !== undefined) {\n contents.ResourceStatusReason = (0, smithy_client_1.expectString)(output[\"ResourceStatusReason\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"Metadata\"] !== undefined) {\n contents.Metadata = (0, smithy_client_1.expectString)(output[\"Metadata\"]);\n }\n if (output[\"DriftInformation\"] !== undefined) {\n contents.DriftInformation = de_StackResourceDriftInformation(output[\"DriftInformation\"], context);\n }\n if (output[\"ModuleInfo\"] !== undefined) {\n contents.ModuleInfo = de_ModuleInfo(output[\"ModuleInfo\"], context);\n }\n return contents;\n};\nconst de_StackResourceDrift = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output.PhysicalResourceIdContext === \"\") {\n contents.PhysicalResourceIdContext = [];\n }\n else if (output[\"PhysicalResourceIdContext\"] !== undefined &&\n output[\"PhysicalResourceIdContext\"][\"member\"] !== undefined) {\n contents.PhysicalResourceIdContext = de_PhysicalResourceIdContext((0, smithy_client_1.getArrayIfSingleItem)(output[\"PhysicalResourceIdContext\"][\"member\"]), context);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"ExpectedProperties\"] !== undefined) {\n contents.ExpectedProperties = (0, smithy_client_1.expectString)(output[\"ExpectedProperties\"]);\n }\n if (output[\"ActualProperties\"] !== undefined) {\n contents.ActualProperties = (0, smithy_client_1.expectString)(output[\"ActualProperties\"]);\n }\n if (output.PropertyDifferences === \"\") {\n contents.PropertyDifferences = [];\n }\n else if (output[\"PropertyDifferences\"] !== undefined && output[\"PropertyDifferences\"][\"member\"] !== undefined) {\n contents.PropertyDifferences = de_PropertyDifferences((0, smithy_client_1.getArrayIfSingleItem)(output[\"PropertyDifferences\"][\"member\"]), context);\n }\n if (output[\"StackResourceDriftStatus\"] !== undefined) {\n contents.StackResourceDriftStatus = (0, smithy_client_1.expectString)(output[\"StackResourceDriftStatus\"]);\n }\n if (output[\"Timestamp\"] !== undefined) {\n contents.Timestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Timestamp\"]));\n }\n if (output[\"ModuleInfo\"] !== undefined) {\n contents.ModuleInfo = de_ModuleInfo(output[\"ModuleInfo\"], context);\n }\n return contents;\n};\nconst de_StackResourceDriftInformation = (output, context) => {\n const contents = {};\n if (output[\"StackResourceDriftStatus\"] !== undefined) {\n contents.StackResourceDriftStatus = (0, smithy_client_1.expectString)(output[\"StackResourceDriftStatus\"]);\n }\n if (output[\"LastCheckTimestamp\"] !== undefined) {\n contents.LastCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastCheckTimestamp\"]));\n }\n return contents;\n};\nconst de_StackResourceDriftInformationSummary = (output, context) => {\n const contents = {};\n if (output[\"StackResourceDriftStatus\"] !== undefined) {\n contents.StackResourceDriftStatus = (0, smithy_client_1.expectString)(output[\"StackResourceDriftStatus\"]);\n }\n if (output[\"LastCheckTimestamp\"] !== undefined) {\n contents.LastCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastCheckTimestamp\"]));\n }\n return contents;\n};\nconst de_StackResourceDrifts = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackResourceDrift(entry, context);\n });\n};\nconst de_StackResources = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackResource(entry, context);\n });\n};\nconst de_StackResourceSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackResourceSummary(entry, context);\n });\n};\nconst de_StackResourceSummary = (output, context) => {\n const contents = {};\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"LastUpdatedTimestamp\"] !== undefined) {\n contents.LastUpdatedTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdatedTimestamp\"]));\n }\n if (output[\"ResourceStatus\"] !== undefined) {\n contents.ResourceStatus = (0, smithy_client_1.expectString)(output[\"ResourceStatus\"]);\n }\n if (output[\"ResourceStatusReason\"] !== undefined) {\n contents.ResourceStatusReason = (0, smithy_client_1.expectString)(output[\"ResourceStatusReason\"]);\n }\n if (output[\"DriftInformation\"] !== undefined) {\n contents.DriftInformation = de_StackResourceDriftInformationSummary(output[\"DriftInformation\"], context);\n }\n if (output[\"ModuleInfo\"] !== undefined) {\n contents.ModuleInfo = de_ModuleInfo(output[\"ModuleInfo\"], context);\n }\n return contents;\n};\nconst de_Stacks = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Stack(entry, context);\n });\n};\nconst de_StackSet = (output, context) => {\n const contents = {};\n if (output[\"StackSetName\"] !== undefined) {\n contents.StackSetName = (0, smithy_client_1.expectString)(output[\"StackSetName\"]);\n }\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"TemplateBody\"] !== undefined) {\n contents.TemplateBody = (0, smithy_client_1.expectString)(output[\"TemplateBody\"]);\n }\n if (output.Parameters === \"\") {\n contents.Parameters = [];\n }\n else if (output[\"Parameters\"] !== undefined && output[\"Parameters\"][\"member\"] !== undefined) {\n contents.Parameters = de_Parameters((0, smithy_client_1.getArrayIfSingleItem)(output[\"Parameters\"][\"member\"]), context);\n }\n if (output.Capabilities === \"\") {\n contents.Capabilities = [];\n }\n else if (output[\"Capabilities\"] !== undefined && output[\"Capabilities\"][\"member\"] !== undefined) {\n contents.Capabilities = de_Capabilities((0, smithy_client_1.getArrayIfSingleItem)(output[\"Capabilities\"][\"member\"]), context);\n }\n if (output.Tags === \"\") {\n contents.Tags = [];\n }\n else if (output[\"Tags\"] !== undefined && output[\"Tags\"][\"member\"] !== undefined) {\n contents.Tags = de_Tags((0, smithy_client_1.getArrayIfSingleItem)(output[\"Tags\"][\"member\"]), context);\n }\n if (output[\"StackSetARN\"] !== undefined) {\n contents.StackSetARN = (0, smithy_client_1.expectString)(output[\"StackSetARN\"]);\n }\n if (output[\"AdministrationRoleARN\"] !== undefined) {\n contents.AdministrationRoleARN = (0, smithy_client_1.expectString)(output[\"AdministrationRoleARN\"]);\n }\n if (output[\"ExecutionRoleName\"] !== undefined) {\n contents.ExecutionRoleName = (0, smithy_client_1.expectString)(output[\"ExecutionRoleName\"]);\n }\n if (output[\"StackSetDriftDetectionDetails\"] !== undefined) {\n contents.StackSetDriftDetectionDetails = de_StackSetDriftDetectionDetails(output[\"StackSetDriftDetectionDetails\"], context);\n }\n if (output[\"AutoDeployment\"] !== undefined) {\n contents.AutoDeployment = de_AutoDeployment(output[\"AutoDeployment\"], context);\n }\n if (output[\"PermissionModel\"] !== undefined) {\n contents.PermissionModel = (0, smithy_client_1.expectString)(output[\"PermissionModel\"]);\n }\n if (output.OrganizationalUnitIds === \"\") {\n contents.OrganizationalUnitIds = [];\n }\n else if (output[\"OrganizationalUnitIds\"] !== undefined && output[\"OrganizationalUnitIds\"][\"member\"] !== undefined) {\n contents.OrganizationalUnitIds = de_OrganizationalUnitIdList((0, smithy_client_1.getArrayIfSingleItem)(output[\"OrganizationalUnitIds\"][\"member\"]), context);\n }\n if (output[\"ManagedExecution\"] !== undefined) {\n contents.ManagedExecution = de_ManagedExecution(output[\"ManagedExecution\"], context);\n }\n if (output.Regions === \"\") {\n contents.Regions = [];\n }\n else if (output[\"Regions\"] !== undefined && output[\"Regions\"][\"member\"] !== undefined) {\n contents.Regions = de_RegionList((0, smithy_client_1.getArrayIfSingleItem)(output[\"Regions\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_StackSetDriftDetectionDetails = (output, context) => {\n const contents = {};\n if (output[\"DriftStatus\"] !== undefined) {\n contents.DriftStatus = (0, smithy_client_1.expectString)(output[\"DriftStatus\"]);\n }\n if (output[\"DriftDetectionStatus\"] !== undefined) {\n contents.DriftDetectionStatus = (0, smithy_client_1.expectString)(output[\"DriftDetectionStatus\"]);\n }\n if (output[\"LastDriftCheckTimestamp\"] !== undefined) {\n contents.LastDriftCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastDriftCheckTimestamp\"]));\n }\n if (output[\"TotalStackInstancesCount\"] !== undefined) {\n contents.TotalStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"TotalStackInstancesCount\"]);\n }\n if (output[\"DriftedStackInstancesCount\"] !== undefined) {\n contents.DriftedStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"DriftedStackInstancesCount\"]);\n }\n if (output[\"InSyncStackInstancesCount\"] !== undefined) {\n contents.InSyncStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"InSyncStackInstancesCount\"]);\n }\n if (output[\"InProgressStackInstancesCount\"] !== undefined) {\n contents.InProgressStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"InProgressStackInstancesCount\"]);\n }\n if (output[\"FailedStackInstancesCount\"] !== undefined) {\n contents.FailedStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"FailedStackInstancesCount\"]);\n }\n return contents;\n};\nconst de_StackSetNotEmptyException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_StackSetNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_StackSetOperation = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n if (output[\"Action\"] !== undefined) {\n contents.Action = (0, smithy_client_1.expectString)(output[\"Action\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"OperationPreferences\"] !== undefined) {\n contents.OperationPreferences = de_StackSetOperationPreferences(output[\"OperationPreferences\"], context);\n }\n if (output[\"RetainStacks\"] !== undefined) {\n contents.RetainStacks = (0, smithy_client_1.parseBoolean)(output[\"RetainStacks\"]);\n }\n if (output[\"AdministrationRoleARN\"] !== undefined) {\n contents.AdministrationRoleARN = (0, smithy_client_1.expectString)(output[\"AdministrationRoleARN\"]);\n }\n if (output[\"ExecutionRoleName\"] !== undefined) {\n contents.ExecutionRoleName = (0, smithy_client_1.expectString)(output[\"ExecutionRoleName\"]);\n }\n if (output[\"CreationTimestamp\"] !== undefined) {\n contents.CreationTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTimestamp\"]));\n }\n if (output[\"EndTimestamp\"] !== undefined) {\n contents.EndTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"EndTimestamp\"]));\n }\n if (output[\"DeploymentTargets\"] !== undefined) {\n contents.DeploymentTargets = de_DeploymentTargets(output[\"DeploymentTargets\"], context);\n }\n if (output[\"StackSetDriftDetectionDetails\"] !== undefined) {\n contents.StackSetDriftDetectionDetails = de_StackSetDriftDetectionDetails(output[\"StackSetDriftDetectionDetails\"], context);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"StatusDetails\"] !== undefined) {\n contents.StatusDetails = de_StackSetOperationStatusDetails(output[\"StatusDetails\"], context);\n }\n return contents;\n};\nconst de_StackSetOperationPreferences = (output, context) => {\n const contents = {};\n if (output[\"RegionConcurrencyType\"] !== undefined) {\n contents.RegionConcurrencyType = (0, smithy_client_1.expectString)(output[\"RegionConcurrencyType\"]);\n }\n if (output.RegionOrder === \"\") {\n contents.RegionOrder = [];\n }\n else if (output[\"RegionOrder\"] !== undefined && output[\"RegionOrder\"][\"member\"] !== undefined) {\n contents.RegionOrder = de_RegionList((0, smithy_client_1.getArrayIfSingleItem)(output[\"RegionOrder\"][\"member\"]), context);\n }\n if (output[\"FailureToleranceCount\"] !== undefined) {\n contents.FailureToleranceCount = (0, smithy_client_1.strictParseInt32)(output[\"FailureToleranceCount\"]);\n }\n if (output[\"FailureTolerancePercentage\"] !== undefined) {\n contents.FailureTolerancePercentage = (0, smithy_client_1.strictParseInt32)(output[\"FailureTolerancePercentage\"]);\n }\n if (output[\"MaxConcurrentCount\"] !== undefined) {\n contents.MaxConcurrentCount = (0, smithy_client_1.strictParseInt32)(output[\"MaxConcurrentCount\"]);\n }\n if (output[\"MaxConcurrentPercentage\"] !== undefined) {\n contents.MaxConcurrentPercentage = (0, smithy_client_1.strictParseInt32)(output[\"MaxConcurrentPercentage\"]);\n }\n return contents;\n};\nconst de_StackSetOperationResultSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackSetOperationResultSummary(entry, context);\n });\n};\nconst de_StackSetOperationResultSummary = (output, context) => {\n const contents = {};\n if (output[\"Account\"] !== undefined) {\n contents.Account = (0, smithy_client_1.expectString)(output[\"Account\"]);\n }\n if (output[\"Region\"] !== undefined) {\n contents.Region = (0, smithy_client_1.expectString)(output[\"Region\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"AccountGateResult\"] !== undefined) {\n contents.AccountGateResult = de_AccountGateResult(output[\"AccountGateResult\"], context);\n }\n if (output[\"OrganizationalUnitId\"] !== undefined) {\n contents.OrganizationalUnitId = (0, smithy_client_1.expectString)(output[\"OrganizationalUnitId\"]);\n }\n return contents;\n};\nconst de_StackSetOperationStatusDetails = (output, context) => {\n const contents = {};\n if (output[\"FailedStackInstancesCount\"] !== undefined) {\n contents.FailedStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"FailedStackInstancesCount\"]);\n }\n return contents;\n};\nconst de_StackSetOperationSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackSetOperationSummary(entry, context);\n });\n};\nconst de_StackSetOperationSummary = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n if (output[\"Action\"] !== undefined) {\n contents.Action = (0, smithy_client_1.expectString)(output[\"Action\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"CreationTimestamp\"] !== undefined) {\n contents.CreationTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTimestamp\"]));\n }\n if (output[\"EndTimestamp\"] !== undefined) {\n contents.EndTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"EndTimestamp\"]));\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"StatusDetails\"] !== undefined) {\n contents.StatusDetails = de_StackSetOperationStatusDetails(output[\"StatusDetails\"], context);\n }\n if (output[\"OperationPreferences\"] !== undefined) {\n contents.OperationPreferences = de_StackSetOperationPreferences(output[\"OperationPreferences\"], context);\n }\n return contents;\n};\nconst de_StackSetSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackSetSummary(entry, context);\n });\n};\nconst de_StackSetSummary = (output, context) => {\n const contents = {};\n if (output[\"StackSetName\"] !== undefined) {\n contents.StackSetName = (0, smithy_client_1.expectString)(output[\"StackSetName\"]);\n }\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"AutoDeployment\"] !== undefined) {\n contents.AutoDeployment = de_AutoDeployment(output[\"AutoDeployment\"], context);\n }\n if (output[\"PermissionModel\"] !== undefined) {\n contents.PermissionModel = (0, smithy_client_1.expectString)(output[\"PermissionModel\"]);\n }\n if (output[\"DriftStatus\"] !== undefined) {\n contents.DriftStatus = (0, smithy_client_1.expectString)(output[\"DriftStatus\"]);\n }\n if (output[\"LastDriftCheckTimestamp\"] !== undefined) {\n contents.LastDriftCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastDriftCheckTimestamp\"]));\n }\n if (output[\"ManagedExecution\"] !== undefined) {\n contents.ManagedExecution = de_ManagedExecution(output[\"ManagedExecution\"], context);\n }\n return contents;\n};\nconst de_StackSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackSummary(entry, context);\n });\n};\nconst de_StackSummary = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"TemplateDescription\"] !== undefined) {\n contents.TemplateDescription = (0, smithy_client_1.expectString)(output[\"TemplateDescription\"]);\n }\n if (output[\"CreationTime\"] !== undefined) {\n contents.CreationTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTime\"]));\n }\n if (output[\"LastUpdatedTime\"] !== undefined) {\n contents.LastUpdatedTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdatedTime\"]));\n }\n if (output[\"DeletionTime\"] !== undefined) {\n contents.DeletionTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"DeletionTime\"]));\n }\n if (output[\"StackStatus\"] !== undefined) {\n contents.StackStatus = (0, smithy_client_1.expectString)(output[\"StackStatus\"]);\n }\n if (output[\"StackStatusReason\"] !== undefined) {\n contents.StackStatusReason = (0, smithy_client_1.expectString)(output[\"StackStatusReason\"]);\n }\n if (output[\"ParentId\"] !== undefined) {\n contents.ParentId = (0, smithy_client_1.expectString)(output[\"ParentId\"]);\n }\n if (output[\"RootId\"] !== undefined) {\n contents.RootId = (0, smithy_client_1.expectString)(output[\"RootId\"]);\n }\n if (output[\"DriftInformation\"] !== undefined) {\n contents.DriftInformation = de_StackDriftInformationSummary(output[\"DriftInformation\"], context);\n }\n return contents;\n};\nconst de_StageList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_StaleRequestException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_StopStackSetOperationOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_SupportedMajorVersions = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.strictParseInt32)(entry);\n });\n};\nconst de_Tag = (output, context) => {\n const contents = {};\n if (output[\"Key\"] !== undefined) {\n contents.Key = (0, smithy_client_1.expectString)(output[\"Key\"]);\n }\n if (output[\"Value\"] !== undefined) {\n contents.Value = (0, smithy_client_1.expectString)(output[\"Value\"]);\n }\n return contents;\n};\nconst de_Tags = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Tag(entry, context);\n });\n};\nconst de_TemplateParameter = (output, context) => {\n const contents = {};\n if (output[\"ParameterKey\"] !== undefined) {\n contents.ParameterKey = (0, smithy_client_1.expectString)(output[\"ParameterKey\"]);\n }\n if (output[\"DefaultValue\"] !== undefined) {\n contents.DefaultValue = (0, smithy_client_1.expectString)(output[\"DefaultValue\"]);\n }\n if (output[\"NoEcho\"] !== undefined) {\n contents.NoEcho = (0, smithy_client_1.parseBoolean)(output[\"NoEcho\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n return contents;\n};\nconst de_TemplateParameters = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_TemplateParameter(entry, context);\n });\n};\nconst de_TestTypeOutput = (output, context) => {\n const contents = {};\n if (output[\"TypeVersionArn\"] !== undefined) {\n contents.TypeVersionArn = (0, smithy_client_1.expectString)(output[\"TypeVersionArn\"]);\n }\n return contents;\n};\nconst de_TokenAlreadyExistsException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_TransformsList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_TypeConfigurationDetails = (output, context) => {\n const contents = {};\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n if (output[\"Alias\"] !== undefined) {\n contents.Alias = (0, smithy_client_1.expectString)(output[\"Alias\"]);\n }\n if (output[\"Configuration\"] !== undefined) {\n contents.Configuration = (0, smithy_client_1.expectString)(output[\"Configuration\"]);\n }\n if (output[\"LastUpdated\"] !== undefined) {\n contents.LastUpdated = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdated\"]));\n }\n if (output[\"TypeArn\"] !== undefined) {\n contents.TypeArn = (0, smithy_client_1.expectString)(output[\"TypeArn\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n if (output[\"IsDefaultConfiguration\"] !== undefined) {\n contents.IsDefaultConfiguration = (0, smithy_client_1.parseBoolean)(output[\"IsDefaultConfiguration\"]);\n }\n return contents;\n};\nconst de_TypeConfigurationDetailsList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_TypeConfigurationDetails(entry, context);\n });\n};\nconst de_TypeConfigurationIdentifier = (output, context) => {\n const contents = {};\n if (output[\"TypeArn\"] !== undefined) {\n contents.TypeArn = (0, smithy_client_1.expectString)(output[\"TypeArn\"]);\n }\n if (output[\"TypeConfigurationAlias\"] !== undefined) {\n contents.TypeConfigurationAlias = (0, smithy_client_1.expectString)(output[\"TypeConfigurationAlias\"]);\n }\n if (output[\"TypeConfigurationArn\"] !== undefined) {\n contents.TypeConfigurationArn = (0, smithy_client_1.expectString)(output[\"TypeConfigurationArn\"]);\n }\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n return contents;\n};\nconst de_TypeConfigurationNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_TypeNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_TypeSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_TypeSummary(entry, context);\n });\n};\nconst de_TypeSummary = (output, context) => {\n const contents = {};\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n if (output[\"DefaultVersionId\"] !== undefined) {\n contents.DefaultVersionId = (0, smithy_client_1.expectString)(output[\"DefaultVersionId\"]);\n }\n if (output[\"TypeArn\"] !== undefined) {\n contents.TypeArn = (0, smithy_client_1.expectString)(output[\"TypeArn\"]);\n }\n if (output[\"LastUpdated\"] !== undefined) {\n contents.LastUpdated = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdated\"]));\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"PublisherId\"] !== undefined) {\n contents.PublisherId = (0, smithy_client_1.expectString)(output[\"PublisherId\"]);\n }\n if (output[\"OriginalTypeName\"] !== undefined) {\n contents.OriginalTypeName = (0, smithy_client_1.expectString)(output[\"OriginalTypeName\"]);\n }\n if (output[\"PublicVersionNumber\"] !== undefined) {\n contents.PublicVersionNumber = (0, smithy_client_1.expectString)(output[\"PublicVersionNumber\"]);\n }\n if (output[\"LatestPublicVersion\"] !== undefined) {\n contents.LatestPublicVersion = (0, smithy_client_1.expectString)(output[\"LatestPublicVersion\"]);\n }\n if (output[\"PublisherIdentity\"] !== undefined) {\n contents.PublisherIdentity = (0, smithy_client_1.expectString)(output[\"PublisherIdentity\"]);\n }\n if (output[\"PublisherName\"] !== undefined) {\n contents.PublisherName = (0, smithy_client_1.expectString)(output[\"PublisherName\"]);\n }\n if (output[\"IsActivated\"] !== undefined) {\n contents.IsActivated = (0, smithy_client_1.parseBoolean)(output[\"IsActivated\"]);\n }\n return contents;\n};\nconst de_TypeVersionSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_TypeVersionSummary(entry, context);\n });\n};\nconst de_TypeVersionSummary = (output, context) => {\n const contents = {};\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n if (output[\"VersionId\"] !== undefined) {\n contents.VersionId = (0, smithy_client_1.expectString)(output[\"VersionId\"]);\n }\n if (output[\"IsDefaultVersion\"] !== undefined) {\n contents.IsDefaultVersion = (0, smithy_client_1.parseBoolean)(output[\"IsDefaultVersion\"]);\n }\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n if (output[\"TimeCreated\"] !== undefined) {\n contents.TimeCreated = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"TimeCreated\"]));\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"PublicVersionNumber\"] !== undefined) {\n contents.PublicVersionNumber = (0, smithy_client_1.expectString)(output[\"PublicVersionNumber\"]);\n }\n return contents;\n};\nconst de_UnprocessedTypeConfigurations = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_TypeConfigurationIdentifier(entry, context);\n });\n};\nconst de_UpdateStackInstancesOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_UpdateStackOutput = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n return contents;\n};\nconst de_UpdateStackSetOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_UpdateTerminationProtectionOutput = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n return contents;\n};\nconst de_ValidateTemplateOutput = (output, context) => {\n const contents = {};\n if (output.Parameters === \"\") {\n contents.Parameters = [];\n }\n else if (output[\"Parameters\"] !== undefined && output[\"Parameters\"][\"member\"] !== undefined) {\n contents.Parameters = de_TemplateParameters((0, smithy_client_1.getArrayIfSingleItem)(output[\"Parameters\"][\"member\"]), context);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output.Capabilities === \"\") {\n contents.Capabilities = [];\n }\n else if (output[\"Capabilities\"] !== undefined && output[\"Capabilities\"][\"member\"] !== undefined) {\n contents.Capabilities = de_Capabilities((0, smithy_client_1.getArrayIfSingleItem)(output[\"Capabilities\"][\"member\"]), context);\n }\n if (output[\"CapabilitiesReason\"] !== undefined) {\n contents.CapabilitiesReason = (0, smithy_client_1.expectString)(output[\"CapabilitiesReason\"]);\n }\n if (output.DeclaredTransforms === \"\") {\n contents.DeclaredTransforms = [];\n }\n else if (output[\"DeclaredTransforms\"] !== undefined && output[\"DeclaredTransforms\"][\"member\"] !== undefined) {\n contents.DeclaredTransforms = de_TransformsList((0, smithy_client_1.getArrayIfSingleItem)(output[\"DeclaredTransforms\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_Warnings = (output, context) => {\n const contents = {};\n if (output.UnrecognizedResourceTypes === \"\") {\n contents.UnrecognizedResourceTypes = [];\n }\n else if (output[\"UnrecognizedResourceTypes\"] !== undefined &&\n output[\"UnrecognizedResourceTypes\"][\"member\"] !== undefined) {\n contents.UnrecognizedResourceTypes = de_ResourceTypes((0, smithy_client_1.getArrayIfSingleItem)(output[\"UnrecognizedResourceTypes\"][\"member\"]), context);\n }\n return contents;\n};\nconst deserializeMetadata = (output) => ({\n httpStatusCode: output.statusCode,\n requestId: output.headers[\"x-amzn-requestid\"] ?? output.headers[\"x-amzn-request-id\"] ?? output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n});\nconst collectBodyString = (streamBody, context) => (0, smithy_client_1.collectBody)(streamBody, context).then((body) => context.utf8Encoder(body));\nconst throwDefaultError = (0, smithy_client_1.withBaseException)(CloudFormationServiceException_1.CloudFormationServiceException);\nconst buildHttpRpcRequest = async (context, headers, path, resolvedHostname, body) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const contents = {\n protocol,\n hostname,\n port,\n method: \"POST\",\n path: basePath.endsWith(\"/\") ? basePath.slice(0, -1) + path : basePath + path,\n headers,\n };\n if (resolvedHostname !== undefined) {\n contents.hostname = resolvedHostname;\n }\n if (body !== undefined) {\n contents.body = body;\n }\n return new protocol_http_1.HttpRequest(contents);\n};\nconst SHARED_HEADERS = {\n \"content-type\": \"application/x-www-form-urlencoded\",\n};\nconst parseBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n if (encoded.length) {\n const parser = new fast_xml_parser_1.XMLParser({\n attributeNamePrefix: \"\",\n htmlEntities: true,\n ignoreAttributes: false,\n ignoreDeclaration: true,\n parseTagValue: false,\n trimValues: false,\n tagValueProcessor: (_, val) => (val.trim() === \"\" && val.includes(\"\\n\") ? \"\" : undefined),\n });\n parser.addEntity(\"#xD\", \"\\r\");\n parser.addEntity(\"#10\", \"\\n\");\n const parsedObj = parser.parse(encoded);\n const textNodeName = \"#text\";\n const key = Object.keys(parsedObj)[0];\n const parsedObjToReturn = parsedObj[key];\n if (parsedObjToReturn[textNodeName]) {\n parsedObjToReturn[key] = parsedObjToReturn[textNodeName];\n delete parsedObjToReturn[textNodeName];\n }\n return (0, smithy_client_1.getValueFromTextNode)(parsedObjToReturn);\n }\n return {};\n});\nconst parseErrorBody = async (errorBody, context) => {\n const value = await parseBody(errorBody, context);\n if (value.Error) {\n value.Error.message = value.Error.message ?? value.Error.Message;\n }\n return value;\n};\nconst buildFormUrlencodedString = (formEntries) => Object.entries(formEntries)\n .map(([key, value]) => (0, smithy_client_1.extendedEncodeURIComponent)(key) + \"=\" + (0, smithy_client_1.extendedEncodeURIComponent)(value))\n .join(\"&\");\nconst loadQueryErrorCode = (output, data) => {\n if (data.Error?.Code !== undefined) {\n return data.Error.Code;\n }\n if (output.statusCode == 404) {\n return \"NotFound\";\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst tslib_1 = require(\"tslib\");\nconst package_json_1 = tslib_1.__importDefault(require(\"../package.json\"));\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst core_1 = require(\"@aws-sdk/core\");\nconst credential_provider_node_1 = require(\"@aws-sdk/credential-provider-node\");\nconst util_user_agent_node_1 = require(\"@aws-sdk/util-user-agent-node\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst hash_node_1 = require(\"@smithy/hash-node\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_body_length_node_1 = require(\"@smithy/util-body-length-node\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst runtimeConfig_shared_1 = require(\"./runtimeConfig.shared\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst util_defaults_mode_node_1 = require(\"@smithy/util-defaults-mode-node\");\nconst smithy_client_2 = require(\"@smithy/smithy-client\");\nconst getRuntimeConfig = (config) => {\n (0, smithy_client_2.emitWarningIfUnsupportedVersion)(process.version);\n const defaultsMode = (0, util_defaults_mode_node_1.resolveDefaultsModeConfig)(config);\n const defaultConfigProvider = () => defaultsMode().then(smithy_client_1.loadConfigsForDefaultMode);\n const clientSharedValues = (0, runtimeConfig_shared_1.getRuntimeConfig)(config);\n (0, core_1.emitWarningIfUnsupportedVersion)(process.version);\n return {\n ...clientSharedValues,\n ...config,\n runtime: \"node\",\n defaultsMode,\n bodyLengthChecker: config?.bodyLengthChecker ?? util_body_length_node_1.calculateBodyLength,\n credentialDefaultProvider: config?.credentialDefaultProvider ?? (0, client_sts_1.decorateDefaultCredentialProvider)(credential_provider_node_1.defaultProvider),\n defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n (0, util_user_agent_node_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_json_1.default.version }),\n maxAttempts: config?.maxAttempts ?? (0, node_config_provider_1.loadConfig)(middleware_retry_1.NODE_MAX_ATTEMPT_CONFIG_OPTIONS),\n region: config?.region ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS, config_resolver_1.NODE_REGION_CONFIG_FILE_OPTIONS),\n requestHandler: config?.requestHandler ?? new node_http_handler_1.NodeHttpHandler(defaultConfigProvider),\n retryMode: config?.retryMode ??\n (0, node_config_provider_1.loadConfig)({\n ...middleware_retry_1.NODE_RETRY_MODE_CONFIG_OPTIONS,\n default: async () => (await defaultConfigProvider()).retryMode || util_retry_1.DEFAULT_RETRY_MODE,\n }),\n sha256: config?.sha256 ?? hash_node_1.Hash.bind(null, \"sha256\"),\n streamCollector: config?.streamCollector ?? node_http_handler_1.streamCollector,\n useDualstackEndpoint: config?.useDualstackEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS),\n useFipsEndpoint: config?.useFipsEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS),\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst endpointResolver_1 = require(\"./endpoint/endpointResolver\");\nconst getRuntimeConfig = (config) => {\n return {\n apiVersion: \"2010-05-15\",\n base64Decoder: config?.base64Decoder ?? util_base64_1.fromBase64,\n base64Encoder: config?.base64Encoder ?? util_base64_1.toBase64,\n disableHostPrefix: config?.disableHostPrefix ?? false,\n endpointProvider: config?.endpointProvider ?? endpointResolver_1.defaultEndpointResolver,\n extensions: config?.extensions ?? [],\n logger: config?.logger ?? new smithy_client_1.NoOpLogger(),\n serviceId: config?.serviceId ?? \"CloudFormation\",\n urlParser: config?.urlParser ?? url_parser_1.parseUrl,\n utf8Decoder: config?.utf8Decoder ?? util_utf8_1.fromUtf8,\n utf8Encoder: config?.utf8Encoder ?? util_utf8_1.toUtf8,\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRuntimeExtensions = void 0;\nconst region_config_resolver_1 = require(\"@aws-sdk/region-config-resolver\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst asPartial = (t) => t;\nconst resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n const extensionConfiguration = {\n ...asPartial((0, region_config_resolver_1.getAwsRegionExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, smithy_client_1.getDefaultExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, protocol_http_1.getHttpHandlerExtensionConfiguration)(runtimeConfig)),\n };\n extensions.forEach((extension) => extension.configure(extensionConfiguration));\n return {\n ...runtimeConfig,\n ...(0, region_config_resolver_1.resolveAwsRegionExtensionConfiguration)(extensionConfiguration),\n ...(0, smithy_client_1.resolveDefaultRuntimeConfig)(extensionConfiguration),\n ...(0, protocol_http_1.resolveHttpHandlerRuntimeConfig)(extensionConfiguration),\n };\n};\nexports.resolveRuntimeExtensions = resolveRuntimeExtensions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./waitForChangeSetCreateComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackCreateComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackDeleteComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackExists\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackImportComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackRollbackComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackUpdateComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForTypeRegistrationComplete\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilChangeSetCreateComplete = exports.waitForChangeSetCreateComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeChangeSetCommand_1 = require(\"../commands/DescribeChangeSetCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeChangeSetCommand_1.DescribeChangeSetCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n return result.Status;\n };\n if (returnComparator() === \"CREATE_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n return result.Status;\n };\n if (returnComparator() === \"FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForChangeSetCreateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForChangeSetCreateComplete = waitForChangeSetCreateComplete;\nconst waitUntilChangeSetCreateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilChangeSetCreateComplete = waitUntilChangeSetCreateComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackCreateComplete = exports.waitForStackCreateComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n let allStringEq_5 = returnComparator().length > 0;\n for (const element_4 of returnComparator()) {\n allStringEq_5 = allStringEq_5 && element_4 == \"CREATE_COMPLETE\";\n }\n if (allStringEq_5) {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"CREATE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"DELETE_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"DELETE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"ROLLBACK_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackCreateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackCreateComplete = waitForStackCreateComplete;\nconst waitUntilStackCreateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackCreateComplete = waitUntilStackCreateComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackDeleteComplete = exports.waitForStackDeleteComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n let allStringEq_5 = returnComparator().length > 0;\n for (const element_4 of returnComparator()) {\n allStringEq_5 = allStringEq_5 && element_4 == \"DELETE_COMPLETE\";\n }\n if (allStringEq_5) {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"DELETE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"CREATE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_IN_PROGRESS\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackDeleteComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackDeleteComplete = waitForStackDeleteComplete;\nconst waitUntilStackDeleteComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackDeleteComplete = waitUntilStackDeleteComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackExists = exports.waitForStackExists = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackExists = async (params, input) => {\n const serviceDefaults = { minDelay: 5, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackExists = waitForStackExists;\nconst waitUntilStackExists = async (params, input) => {\n const serviceDefaults = { minDelay: 5, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackExists = waitUntilStackExists;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackImportComplete = exports.waitForStackImportComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n let allStringEq_5 = returnComparator().length > 0;\n for (const element_4 of returnComparator()) {\n allStringEq_5 = allStringEq_5 && element_4 == \"IMPORT_COMPLETE\";\n }\n if (allStringEq_5) {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"ROLLBACK_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"IMPORT_ROLLBACK_IN_PROGRESS\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"IMPORT_ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"IMPORT_ROLLBACK_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackImportComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackImportComplete = waitForStackImportComplete;\nconst waitUntilStackImportComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackImportComplete = waitUntilStackImportComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackRollbackComplete = exports.waitForStackRollbackComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n let allStringEq_5 = returnComparator().length > 0;\n for (const element_4 of returnComparator()) {\n allStringEq_5 = allStringEq_5 && element_4 == \"UPDATE_ROLLBACK_COMPLETE\";\n }\n if (allStringEq_5) {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"DELETE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackRollbackComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackRollbackComplete = waitForStackRollbackComplete;\nconst waitUntilStackRollbackComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackRollbackComplete = waitUntilStackRollbackComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackUpdateComplete = exports.waitForStackUpdateComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n let allStringEq_5 = returnComparator().length > 0;\n for (const element_4 of returnComparator()) {\n allStringEq_5 = allStringEq_5 && element_4 == \"UPDATE_COMPLETE\";\n }\n if (allStringEq_5) {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackUpdateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackUpdateComplete = waitForStackUpdateComplete;\nconst waitUntilStackUpdateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackUpdateComplete = waitUntilStackUpdateComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilTypeRegistrationComplete = exports.waitForTypeRegistrationComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeTypeRegistrationCommand_1 = require(\"../commands/DescribeTypeRegistrationCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeTypeRegistrationCommand_1.DescribeTypeRegistrationCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n return result.ProgressStatus;\n };\n if (returnComparator() === \"COMPLETE\") {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n return result.ProgressStatus;\n };\n if (returnComparator() === \"FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForTypeRegistrationComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForTypeRegistrationComplete = waitForTypeRegistrationComplete;\nconst waitUntilTypeRegistrationComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilTypeRegistrationComplete = waitUntilTypeRegistrationComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CognitoIdentity = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst CognitoIdentityClient_1 = require(\"./CognitoIdentityClient\");\nconst CreateIdentityPoolCommand_1 = require(\"./commands/CreateIdentityPoolCommand\");\nconst DeleteIdentitiesCommand_1 = require(\"./commands/DeleteIdentitiesCommand\");\nconst DeleteIdentityPoolCommand_1 = require(\"./commands/DeleteIdentityPoolCommand\");\nconst DescribeIdentityCommand_1 = require(\"./commands/DescribeIdentityCommand\");\nconst DescribeIdentityPoolCommand_1 = require(\"./commands/DescribeIdentityPoolCommand\");\nconst GetCredentialsForIdentityCommand_1 = require(\"./commands/GetCredentialsForIdentityCommand\");\nconst GetIdCommand_1 = require(\"./commands/GetIdCommand\");\nconst GetIdentityPoolRolesCommand_1 = require(\"./commands/GetIdentityPoolRolesCommand\");\nconst GetOpenIdTokenCommand_1 = require(\"./commands/GetOpenIdTokenCommand\");\nconst GetOpenIdTokenForDeveloperIdentityCommand_1 = require(\"./commands/GetOpenIdTokenForDeveloperIdentityCommand\");\nconst GetPrincipalTagAttributeMapCommand_1 = require(\"./commands/GetPrincipalTagAttributeMapCommand\");\nconst ListIdentitiesCommand_1 = require(\"./commands/ListIdentitiesCommand\");\nconst ListIdentityPoolsCommand_1 = require(\"./commands/ListIdentityPoolsCommand\");\nconst ListTagsForResourceCommand_1 = require(\"./commands/ListTagsForResourceCommand\");\nconst LookupDeveloperIdentityCommand_1 = require(\"./commands/LookupDeveloperIdentityCommand\");\nconst MergeDeveloperIdentitiesCommand_1 = require(\"./commands/MergeDeveloperIdentitiesCommand\");\nconst SetIdentityPoolRolesCommand_1 = require(\"./commands/SetIdentityPoolRolesCommand\");\nconst SetPrincipalTagAttributeMapCommand_1 = require(\"./commands/SetPrincipalTagAttributeMapCommand\");\nconst TagResourceCommand_1 = require(\"./commands/TagResourceCommand\");\nconst UnlinkDeveloperIdentityCommand_1 = require(\"./commands/UnlinkDeveloperIdentityCommand\");\nconst UnlinkIdentityCommand_1 = require(\"./commands/UnlinkIdentityCommand\");\nconst UntagResourceCommand_1 = require(\"./commands/UntagResourceCommand\");\nconst UpdateIdentityPoolCommand_1 = require(\"./commands/UpdateIdentityPoolCommand\");\nconst commands = {\n CreateIdentityPoolCommand: CreateIdentityPoolCommand_1.CreateIdentityPoolCommand,\n DeleteIdentitiesCommand: DeleteIdentitiesCommand_1.DeleteIdentitiesCommand,\n DeleteIdentityPoolCommand: DeleteIdentityPoolCommand_1.DeleteIdentityPoolCommand,\n DescribeIdentityCommand: DescribeIdentityCommand_1.DescribeIdentityCommand,\n DescribeIdentityPoolCommand: DescribeIdentityPoolCommand_1.DescribeIdentityPoolCommand,\n GetCredentialsForIdentityCommand: GetCredentialsForIdentityCommand_1.GetCredentialsForIdentityCommand,\n GetIdCommand: GetIdCommand_1.GetIdCommand,\n GetIdentityPoolRolesCommand: GetIdentityPoolRolesCommand_1.GetIdentityPoolRolesCommand,\n GetOpenIdTokenCommand: GetOpenIdTokenCommand_1.GetOpenIdTokenCommand,\n GetOpenIdTokenForDeveloperIdentityCommand: GetOpenIdTokenForDeveloperIdentityCommand_1.GetOpenIdTokenForDeveloperIdentityCommand,\n GetPrincipalTagAttributeMapCommand: GetPrincipalTagAttributeMapCommand_1.GetPrincipalTagAttributeMapCommand,\n ListIdentitiesCommand: ListIdentitiesCommand_1.ListIdentitiesCommand,\n ListIdentityPoolsCommand: ListIdentityPoolsCommand_1.ListIdentityPoolsCommand,\n ListTagsForResourceCommand: ListTagsForResourceCommand_1.ListTagsForResourceCommand,\n LookupDeveloperIdentityCommand: LookupDeveloperIdentityCommand_1.LookupDeveloperIdentityCommand,\n MergeDeveloperIdentitiesCommand: MergeDeveloperIdentitiesCommand_1.MergeDeveloperIdentitiesCommand,\n SetIdentityPoolRolesCommand: SetIdentityPoolRolesCommand_1.SetIdentityPoolRolesCommand,\n SetPrincipalTagAttributeMapCommand: SetPrincipalTagAttributeMapCommand_1.SetPrincipalTagAttributeMapCommand,\n TagResourceCommand: TagResourceCommand_1.TagResourceCommand,\n UnlinkDeveloperIdentityCommand: UnlinkDeveloperIdentityCommand_1.UnlinkDeveloperIdentityCommand,\n UnlinkIdentityCommand: UnlinkIdentityCommand_1.UnlinkIdentityCommand,\n UntagResourceCommand: UntagResourceCommand_1.UntagResourceCommand,\n UpdateIdentityPoolCommand: UpdateIdentityPoolCommand_1.UpdateIdentityPoolCommand,\n};\nclass CognitoIdentity extends CognitoIdentityClient_1.CognitoIdentityClient {\n}\nexports.CognitoIdentity = CognitoIdentity;\n(0, smithy_client_1.createAggregatedClient)(commands, CognitoIdentity);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CognitoIdentityClient = exports.__Client = void 0;\nconst middleware_host_header_1 = require(\"@aws-sdk/middleware-host-header\");\nconst middleware_logger_1 = require(\"@aws-sdk/middleware-logger\");\nconst middleware_recursion_detection_1 = require(\"@aws-sdk/middleware-recursion-detection\");\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_user_agent_1 = require(\"@aws-sdk/middleware-user-agent\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst middleware_content_length_1 = require(\"@smithy/middleware-content-length\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__Client\", { enumerable: true, get: function () { return smithy_client_1.Client; } });\nconst EndpointParameters_1 = require(\"./endpoint/EndpointParameters\");\nconst runtimeConfig_1 = require(\"./runtimeConfig\");\nconst runtimeExtensions_1 = require(\"./runtimeExtensions\");\nclass CognitoIdentityClient extends smithy_client_1.Client {\n constructor(...[configuration]) {\n const _config_0 = (0, runtimeConfig_1.getRuntimeConfig)(configuration || {});\n const _config_1 = (0, EndpointParameters_1.resolveClientEndpointParameters)(_config_0);\n const _config_2 = (0, config_resolver_1.resolveRegionConfig)(_config_1);\n const _config_3 = (0, middleware_endpoint_1.resolveEndpointConfig)(_config_2);\n const _config_4 = (0, middleware_retry_1.resolveRetryConfig)(_config_3);\n const _config_5 = (0, middleware_host_header_1.resolveHostHeaderConfig)(_config_4);\n const _config_6 = (0, middleware_signing_1.resolveAwsAuthConfig)(_config_5);\n const _config_7 = (0, middleware_user_agent_1.resolveUserAgentConfig)(_config_6);\n const _config_8 = (0, runtimeExtensions_1.resolveRuntimeExtensions)(_config_7, configuration?.extensions || []);\n super(_config_8);\n this.config = _config_8;\n this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));\n this.middlewareStack.use((0, middleware_content_length_1.getContentLengthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_host_header_1.getHostHeaderPlugin)(this.config));\n this.middlewareStack.use((0, middleware_logger_1.getLoggerPlugin)(this.config));\n this.middlewareStack.use((0, middleware_recursion_detection_1.getRecursionDetectionPlugin)(this.config));\n this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));\n }\n destroy() {\n super.destroy();\n }\n}\nexports.CognitoIdentityClient = CognitoIdentityClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CreateIdentityPoolCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass CreateIdentityPoolCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CreateIdentityPoolCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"CreateIdentityPoolCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"CreateIdentityPool\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_CreateIdentityPoolCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_CreateIdentityPoolCommand)(output, context);\n }\n}\nexports.CreateIdentityPoolCommand = CreateIdentityPoolCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteIdentitiesCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass DeleteIdentitiesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteIdentitiesCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"DeleteIdentitiesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"DeleteIdentities\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_DeleteIdentitiesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_DeleteIdentitiesCommand)(output, context);\n }\n}\nexports.DeleteIdentitiesCommand = DeleteIdentitiesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteIdentityPoolCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass DeleteIdentityPoolCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteIdentityPoolCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"DeleteIdentityPoolCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"DeleteIdentityPool\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_DeleteIdentityPoolCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_DeleteIdentityPoolCommand)(output, context);\n }\n}\nexports.DeleteIdentityPoolCommand = DeleteIdentityPoolCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeIdentityCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass DescribeIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeIdentityCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"DescribeIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"DescribeIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_DescribeIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_DescribeIdentityCommand)(output, context);\n }\n}\nexports.DescribeIdentityCommand = DescribeIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeIdentityPoolCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass DescribeIdentityPoolCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeIdentityPoolCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"DescribeIdentityPoolCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"DescribeIdentityPool\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_DescribeIdentityPoolCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_DescribeIdentityPoolCommand)(output, context);\n }\n}\nexports.DescribeIdentityPoolCommand = DescribeIdentityPoolCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetCredentialsForIdentityCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetCredentialsForIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetCredentialsForIdentityCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetCredentialsForIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetCredentialsForIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetCredentialsForIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetCredentialsForIdentityCommand)(output, context);\n }\n}\nexports.GetCredentialsForIdentityCommand = GetCredentialsForIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetIdCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetIdCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetIdCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetIdCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetId\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetIdCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetIdCommand)(output, context);\n }\n}\nexports.GetIdCommand = GetIdCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetIdentityPoolRolesCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetIdentityPoolRolesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetIdentityPoolRolesCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetIdentityPoolRolesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetIdentityPoolRoles\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetIdentityPoolRolesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetIdentityPoolRolesCommand)(output, context);\n }\n}\nexports.GetIdentityPoolRolesCommand = GetIdentityPoolRolesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetOpenIdTokenCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetOpenIdTokenCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetOpenIdTokenCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetOpenIdTokenCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetOpenIdToken\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetOpenIdTokenCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetOpenIdTokenCommand)(output, context);\n }\n}\nexports.GetOpenIdTokenCommand = GetOpenIdTokenCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetOpenIdTokenForDeveloperIdentityCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetOpenIdTokenForDeveloperIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetOpenIdTokenForDeveloperIdentityCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetOpenIdTokenForDeveloperIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetOpenIdTokenForDeveloperIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetOpenIdTokenForDeveloperIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetOpenIdTokenForDeveloperIdentityCommand)(output, context);\n }\n}\nexports.GetOpenIdTokenForDeveloperIdentityCommand = GetOpenIdTokenForDeveloperIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetPrincipalTagAttributeMapCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetPrincipalTagAttributeMapCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetPrincipalTagAttributeMapCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetPrincipalTagAttributeMapCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetPrincipalTagAttributeMap\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetPrincipalTagAttributeMapCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetPrincipalTagAttributeMapCommand)(output, context);\n }\n}\nexports.GetPrincipalTagAttributeMapCommand = GetPrincipalTagAttributeMapCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListIdentitiesCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass ListIdentitiesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListIdentitiesCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"ListIdentitiesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"ListIdentities\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_ListIdentitiesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_ListIdentitiesCommand)(output, context);\n }\n}\nexports.ListIdentitiesCommand = ListIdentitiesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListIdentityPoolsCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass ListIdentityPoolsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListIdentityPoolsCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"ListIdentityPoolsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"ListIdentityPools\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_ListIdentityPoolsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_ListIdentityPoolsCommand)(output, context);\n }\n}\nexports.ListIdentityPoolsCommand = ListIdentityPoolsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListTagsForResourceCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass ListTagsForResourceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListTagsForResourceCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"ListTagsForResourceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"ListTagsForResource\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_ListTagsForResourceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_ListTagsForResourceCommand)(output, context);\n }\n}\nexports.ListTagsForResourceCommand = ListTagsForResourceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LookupDeveloperIdentityCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass LookupDeveloperIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, LookupDeveloperIdentityCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"LookupDeveloperIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"LookupDeveloperIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_LookupDeveloperIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_LookupDeveloperIdentityCommand)(output, context);\n }\n}\nexports.LookupDeveloperIdentityCommand = LookupDeveloperIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MergeDeveloperIdentitiesCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass MergeDeveloperIdentitiesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, MergeDeveloperIdentitiesCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"MergeDeveloperIdentitiesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"MergeDeveloperIdentities\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_MergeDeveloperIdentitiesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_MergeDeveloperIdentitiesCommand)(output, context);\n }\n}\nexports.MergeDeveloperIdentitiesCommand = MergeDeveloperIdentitiesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SetIdentityPoolRolesCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass SetIdentityPoolRolesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SetIdentityPoolRolesCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"SetIdentityPoolRolesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"SetIdentityPoolRoles\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_SetIdentityPoolRolesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_SetIdentityPoolRolesCommand)(output, context);\n }\n}\nexports.SetIdentityPoolRolesCommand = SetIdentityPoolRolesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SetPrincipalTagAttributeMapCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass SetPrincipalTagAttributeMapCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SetPrincipalTagAttributeMapCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"SetPrincipalTagAttributeMapCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"SetPrincipalTagAttributeMap\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_SetPrincipalTagAttributeMapCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_SetPrincipalTagAttributeMapCommand)(output, context);\n }\n}\nexports.SetPrincipalTagAttributeMapCommand = SetPrincipalTagAttributeMapCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TagResourceCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass TagResourceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, TagResourceCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"TagResourceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"TagResource\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_TagResourceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_TagResourceCommand)(output, context);\n }\n}\nexports.TagResourceCommand = TagResourceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UnlinkDeveloperIdentityCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass UnlinkDeveloperIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UnlinkDeveloperIdentityCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"UnlinkDeveloperIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"UnlinkDeveloperIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_UnlinkDeveloperIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_UnlinkDeveloperIdentityCommand)(output, context);\n }\n}\nexports.UnlinkDeveloperIdentityCommand = UnlinkDeveloperIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UnlinkIdentityCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass UnlinkIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UnlinkIdentityCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"UnlinkIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"UnlinkIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_UnlinkIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_UnlinkIdentityCommand)(output, context);\n }\n}\nexports.UnlinkIdentityCommand = UnlinkIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UntagResourceCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass UntagResourceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UntagResourceCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"UntagResourceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"UntagResource\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_UntagResourceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_UntagResourceCommand)(output, context);\n }\n}\nexports.UntagResourceCommand = UntagResourceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UpdateIdentityPoolCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass UpdateIdentityPoolCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UpdateIdentityPoolCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"UpdateIdentityPoolCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"UpdateIdentityPool\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_UpdateIdentityPoolCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_UpdateIdentityPoolCommand)(output, context);\n }\n}\nexports.UpdateIdentityPoolCommand = UpdateIdentityPoolCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./CreateIdentityPoolCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteIdentitiesCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteIdentityPoolCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeIdentityPoolCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetCredentialsForIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetIdCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetIdentityPoolRolesCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetOpenIdTokenCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetOpenIdTokenForDeveloperIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetPrincipalTagAttributeMapCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListIdentitiesCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListIdentityPoolsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListTagsForResourceCommand\"), exports);\ntslib_1.__exportStar(require(\"./LookupDeveloperIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./MergeDeveloperIdentitiesCommand\"), exports);\ntslib_1.__exportStar(require(\"./SetIdentityPoolRolesCommand\"), exports);\ntslib_1.__exportStar(require(\"./SetPrincipalTagAttributeMapCommand\"), exports);\ntslib_1.__exportStar(require(\"./TagResourceCommand\"), exports);\ntslib_1.__exportStar(require(\"./UnlinkDeveloperIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./UnlinkIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./UntagResourceCommand\"), exports);\ntslib_1.__exportStar(require(\"./UpdateIdentityPoolCommand\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveClientEndpointParameters = void 0;\nconst resolveClientEndpointParameters = (options) => {\n return {\n ...options,\n useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n useFipsEndpoint: options.useFipsEndpoint ?? false,\n defaultSigningName: \"cognito-identity\",\n };\n};\nexports.resolveClientEndpointParameters = resolveClientEndpointParameters;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultEndpointResolver = void 0;\nconst util_endpoints_1 = require(\"@aws-sdk/util-endpoints\");\nconst ruleset_1 = require(\"./ruleset\");\nconst defaultEndpointResolver = (endpointParams, context = {}) => {\n return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, {\n endpointParams: endpointParams,\n logger: context.logger,\n });\n};\nexports.defaultEndpointResolver = defaultEndpointResolver;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ruleSet = void 0;\nconst s = \"required\", t = \"fn\", u = \"argv\", v = \"ref\";\nconst a = true, b = \"isSet\", c = \"booleanEquals\", d = \"error\", e = \"endpoint\", f = \"tree\", g = \"PartitionResult\", h = { [s]: false, \"type\": \"String\" }, i = { [s]: true, \"default\": false, \"type\": \"Boolean\" }, j = { [v]: \"Endpoint\" }, k = { [t]: c, [u]: [{ [v]: \"UseFIPS\" }, true] }, l = { [t]: c, [u]: [{ [v]: \"UseDualStack\" }, true] }, m = {}, n = { [t]: \"getAttr\", [u]: [{ [v]: g }, \"supportsFIPS\"] }, o = { [t]: c, [u]: [true, { [t]: \"getAttr\", [u]: [{ [v]: g }, \"supportsDualStack\"] }] }, p = [k], q = [l], r = [{ [v]: \"Region\" }];\nconst _data = { version: \"1.0\", parameters: { Region: h, UseDualStack: i, UseFIPS: i, Endpoint: h }, rules: [{ conditions: [{ [t]: b, [u]: [j] }], rules: [{ conditions: p, error: \"Invalid Configuration: FIPS and custom endpoint are not supported\", type: d }, { conditions: q, error: \"Invalid Configuration: Dualstack and custom endpoint are not supported\", type: d }, { endpoint: { url: j, properties: m, headers: m }, type: e }], type: f }, { conditions: [{ [t]: b, [u]: r }], rules: [{ conditions: [{ [t]: \"aws.partition\", [u]: r, assign: g }], rules: [{ conditions: [k, l], rules: [{ conditions: [{ [t]: c, [u]: [a, n] }, o], rules: [{ endpoint: { url: \"https://cognito-identity-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: m, headers: m }, type: e }], type: f }, { error: \"FIPS and DualStack are enabled, but this partition does not support one or both\", type: d }], type: f }, { conditions: p, rules: [{ conditions: [{ [t]: c, [u]: [n, a] }], rules: [{ endpoint: { url: \"https://cognito-identity-fips.{Region}.{PartitionResult#dnsSuffix}\", properties: m, headers: m }, type: e }], type: f }, { error: \"FIPS is enabled but this partition does not support FIPS\", type: d }], type: f }, { conditions: q, rules: [{ conditions: [o], rules: [{ endpoint: { url: \"https://cognito-identity.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: m, headers: m }, type: e }], type: f }, { error: \"DualStack is enabled but this partition does not support DualStack\", type: d }], type: f }, { endpoint: { url: \"https://cognito-identity.{Region}.{PartitionResult#dnsSuffix}\", properties: m, headers: m }, type: e }], type: f }], type: f }, { error: \"Invalid Configuration: Missing Region\", type: d }] };\nexports.ruleSet = _data;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CognitoIdentityServiceException = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./CognitoIdentityClient\"), exports);\ntslib_1.__exportStar(require(\"./CognitoIdentity\"), exports);\ntslib_1.__exportStar(require(\"./commands\"), exports);\ntslib_1.__exportStar(require(\"./pagination\"), exports);\ntslib_1.__exportStar(require(\"./models\"), exports);\nvar CognitoIdentityServiceException_1 = require(\"./models/CognitoIdentityServiceException\");\nObject.defineProperty(exports, \"CognitoIdentityServiceException\", { enumerable: true, get: function () { return CognitoIdentityServiceException_1.CognitoIdentityServiceException; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CognitoIdentityServiceException = exports.__ServiceException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__ServiceException\", { enumerable: true, get: function () { return smithy_client_1.ServiceException; } });\nclass CognitoIdentityServiceException extends smithy_client_1.ServiceException {\n constructor(options) {\n super(options);\n Object.setPrototypeOf(this, CognitoIdentityServiceException.prototype);\n }\n}\nexports.CognitoIdentityServiceException = CognitoIdentityServiceException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./models_0\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConcurrentModificationException = exports.DeveloperUserAlreadyRegisteredException = exports.RoleMappingType = exports.MappingRuleMatchType = exports.InvalidIdentityPoolConfigurationException = exports.ExternalServiceException = exports.ResourceNotFoundException = exports.ErrorCode = exports.TooManyRequestsException = exports.ResourceConflictException = exports.NotAuthorizedException = exports.LimitExceededException = exports.InvalidParameterException = exports.InternalErrorException = exports.AmbiguousRoleResolutionType = void 0;\nconst CognitoIdentityServiceException_1 = require(\"./CognitoIdentityServiceException\");\nexports.AmbiguousRoleResolutionType = {\n AUTHENTICATED_ROLE: \"AuthenticatedRole\",\n DENY: \"Deny\",\n};\nclass InternalErrorException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"InternalErrorException\",\n $fault: \"server\",\n ...opts,\n });\n this.name = \"InternalErrorException\";\n this.$fault = \"server\";\n Object.setPrototypeOf(this, InternalErrorException.prototype);\n }\n}\nexports.InternalErrorException = InternalErrorException;\nclass InvalidParameterException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"InvalidParameterException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidParameterException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidParameterException.prototype);\n }\n}\nexports.InvalidParameterException = InvalidParameterException;\nclass LimitExceededException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"LimitExceededException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"LimitExceededException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, LimitExceededException.prototype);\n }\n}\nexports.LimitExceededException = LimitExceededException;\nclass NotAuthorizedException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"NotAuthorizedException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"NotAuthorizedException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, NotAuthorizedException.prototype);\n }\n}\nexports.NotAuthorizedException = NotAuthorizedException;\nclass ResourceConflictException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"ResourceConflictException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ResourceConflictException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ResourceConflictException.prototype);\n }\n}\nexports.ResourceConflictException = ResourceConflictException;\nclass TooManyRequestsException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"TooManyRequestsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"TooManyRequestsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, TooManyRequestsException.prototype);\n }\n}\nexports.TooManyRequestsException = TooManyRequestsException;\nexports.ErrorCode = {\n ACCESS_DENIED: \"AccessDenied\",\n INTERNAL_SERVER_ERROR: \"InternalServerError\",\n};\nclass ResourceNotFoundException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"ResourceNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ResourceNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ResourceNotFoundException.prototype);\n }\n}\nexports.ResourceNotFoundException = ResourceNotFoundException;\nclass ExternalServiceException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"ExternalServiceException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ExternalServiceException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ExternalServiceException.prototype);\n }\n}\nexports.ExternalServiceException = ExternalServiceException;\nclass InvalidIdentityPoolConfigurationException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"InvalidIdentityPoolConfigurationException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidIdentityPoolConfigurationException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidIdentityPoolConfigurationException.prototype);\n }\n}\nexports.InvalidIdentityPoolConfigurationException = InvalidIdentityPoolConfigurationException;\nexports.MappingRuleMatchType = {\n CONTAINS: \"Contains\",\n EQUALS: \"Equals\",\n NOT_EQUAL: \"NotEqual\",\n STARTS_WITH: \"StartsWith\",\n};\nexports.RoleMappingType = {\n RULES: \"Rules\",\n TOKEN: \"Token\",\n};\nclass DeveloperUserAlreadyRegisteredException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"DeveloperUserAlreadyRegisteredException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"DeveloperUserAlreadyRegisteredException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, DeveloperUserAlreadyRegisteredException.prototype);\n }\n}\nexports.DeveloperUserAlreadyRegisteredException = DeveloperUserAlreadyRegisteredException;\nclass ConcurrentModificationException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"ConcurrentModificationException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ConcurrentModificationException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ConcurrentModificationException.prototype);\n }\n}\nexports.ConcurrentModificationException = ConcurrentModificationException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListIdentityPools = void 0;\nconst CognitoIdentityClient_1 = require(\"../CognitoIdentityClient\");\nconst ListIdentityPoolsCommand_1 = require(\"../commands/ListIdentityPoolsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListIdentityPoolsCommand_1.ListIdentityPoolsCommand(input), ...args);\n};\nasync function* paginateListIdentityPools(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CognitoIdentityClient_1.CognitoIdentityClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CognitoIdentity | CognitoIdentityClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListIdentityPools = paginateListIdentityPools;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./Interfaces\"), exports);\ntslib_1.__exportStar(require(\"./ListIdentityPoolsPaginator\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.de_UpdateIdentityPoolCommand = exports.de_UntagResourceCommand = exports.de_UnlinkIdentityCommand = exports.de_UnlinkDeveloperIdentityCommand = exports.de_TagResourceCommand = exports.de_SetPrincipalTagAttributeMapCommand = exports.de_SetIdentityPoolRolesCommand = exports.de_MergeDeveloperIdentitiesCommand = exports.de_LookupDeveloperIdentityCommand = exports.de_ListTagsForResourceCommand = exports.de_ListIdentityPoolsCommand = exports.de_ListIdentitiesCommand = exports.de_GetPrincipalTagAttributeMapCommand = exports.de_GetOpenIdTokenForDeveloperIdentityCommand = exports.de_GetOpenIdTokenCommand = exports.de_GetIdentityPoolRolesCommand = exports.de_GetIdCommand = exports.de_GetCredentialsForIdentityCommand = exports.de_DescribeIdentityPoolCommand = exports.de_DescribeIdentityCommand = exports.de_DeleteIdentityPoolCommand = exports.de_DeleteIdentitiesCommand = exports.de_CreateIdentityPoolCommand = exports.se_UpdateIdentityPoolCommand = exports.se_UntagResourceCommand = exports.se_UnlinkIdentityCommand = exports.se_UnlinkDeveloperIdentityCommand = exports.se_TagResourceCommand = exports.se_SetPrincipalTagAttributeMapCommand = exports.se_SetIdentityPoolRolesCommand = exports.se_MergeDeveloperIdentitiesCommand = exports.se_LookupDeveloperIdentityCommand = exports.se_ListTagsForResourceCommand = exports.se_ListIdentityPoolsCommand = exports.se_ListIdentitiesCommand = exports.se_GetPrincipalTagAttributeMapCommand = exports.se_GetOpenIdTokenForDeveloperIdentityCommand = exports.se_GetOpenIdTokenCommand = exports.se_GetIdentityPoolRolesCommand = exports.se_GetIdCommand = exports.se_GetCredentialsForIdentityCommand = exports.se_DescribeIdentityPoolCommand = exports.se_DescribeIdentityCommand = exports.se_DeleteIdentityPoolCommand = exports.se_DeleteIdentitiesCommand = exports.se_CreateIdentityPoolCommand = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst CognitoIdentityServiceException_1 = require(\"../models/CognitoIdentityServiceException\");\nconst models_0_1 = require(\"../models/models_0\");\nconst se_CreateIdentityPoolCommand = async (input, context) => {\n const headers = sharedHeaders(\"CreateIdentityPool\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CreateIdentityPoolCommand = se_CreateIdentityPoolCommand;\nconst se_DeleteIdentitiesCommand = async (input, context) => {\n const headers = sharedHeaders(\"DeleteIdentities\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteIdentitiesCommand = se_DeleteIdentitiesCommand;\nconst se_DeleteIdentityPoolCommand = async (input, context) => {\n const headers = sharedHeaders(\"DeleteIdentityPool\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteIdentityPoolCommand = se_DeleteIdentityPoolCommand;\nconst se_DescribeIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"DescribeIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeIdentityCommand = se_DescribeIdentityCommand;\nconst se_DescribeIdentityPoolCommand = async (input, context) => {\n const headers = sharedHeaders(\"DescribeIdentityPool\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeIdentityPoolCommand = se_DescribeIdentityPoolCommand;\nconst se_GetCredentialsForIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetCredentialsForIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetCredentialsForIdentityCommand = se_GetCredentialsForIdentityCommand;\nconst se_GetIdCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetId\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetIdCommand = se_GetIdCommand;\nconst se_GetIdentityPoolRolesCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetIdentityPoolRoles\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetIdentityPoolRolesCommand = se_GetIdentityPoolRolesCommand;\nconst se_GetOpenIdTokenCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetOpenIdToken\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetOpenIdTokenCommand = se_GetOpenIdTokenCommand;\nconst se_GetOpenIdTokenForDeveloperIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetOpenIdTokenForDeveloperIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetOpenIdTokenForDeveloperIdentityCommand = se_GetOpenIdTokenForDeveloperIdentityCommand;\nconst se_GetPrincipalTagAttributeMapCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetPrincipalTagAttributeMap\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetPrincipalTagAttributeMapCommand = se_GetPrincipalTagAttributeMapCommand;\nconst se_ListIdentitiesCommand = async (input, context) => {\n const headers = sharedHeaders(\"ListIdentities\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListIdentitiesCommand = se_ListIdentitiesCommand;\nconst se_ListIdentityPoolsCommand = async (input, context) => {\n const headers = sharedHeaders(\"ListIdentityPools\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListIdentityPoolsCommand = se_ListIdentityPoolsCommand;\nconst se_ListTagsForResourceCommand = async (input, context) => {\n const headers = sharedHeaders(\"ListTagsForResource\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListTagsForResourceCommand = se_ListTagsForResourceCommand;\nconst se_LookupDeveloperIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"LookupDeveloperIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_LookupDeveloperIdentityCommand = se_LookupDeveloperIdentityCommand;\nconst se_MergeDeveloperIdentitiesCommand = async (input, context) => {\n const headers = sharedHeaders(\"MergeDeveloperIdentities\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_MergeDeveloperIdentitiesCommand = se_MergeDeveloperIdentitiesCommand;\nconst se_SetIdentityPoolRolesCommand = async (input, context) => {\n const headers = sharedHeaders(\"SetIdentityPoolRoles\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SetIdentityPoolRolesCommand = se_SetIdentityPoolRolesCommand;\nconst se_SetPrincipalTagAttributeMapCommand = async (input, context) => {\n const headers = sharedHeaders(\"SetPrincipalTagAttributeMap\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SetPrincipalTagAttributeMapCommand = se_SetPrincipalTagAttributeMapCommand;\nconst se_TagResourceCommand = async (input, context) => {\n const headers = sharedHeaders(\"TagResource\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_TagResourceCommand = se_TagResourceCommand;\nconst se_UnlinkDeveloperIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"UnlinkDeveloperIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UnlinkDeveloperIdentityCommand = se_UnlinkDeveloperIdentityCommand;\nconst se_UnlinkIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"UnlinkIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UnlinkIdentityCommand = se_UnlinkIdentityCommand;\nconst se_UntagResourceCommand = async (input, context) => {\n const headers = sharedHeaders(\"UntagResource\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UntagResourceCommand = se_UntagResourceCommand;\nconst se_UpdateIdentityPoolCommand = async (input, context) => {\n const headers = sharedHeaders(\"UpdateIdentityPool\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UpdateIdentityPoolCommand = se_UpdateIdentityPoolCommand;\nconst de_CreateIdentityPoolCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CreateIdentityPoolCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_CreateIdentityPoolCommand = de_CreateIdentityPoolCommand;\nconst de_CreateIdentityPoolCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cognitoidentity#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_DeleteIdentitiesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteIdentitiesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeleteIdentitiesCommand = de_DeleteIdentitiesCommand;\nconst de_DeleteIdentitiesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_DeleteIdentityPoolCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteIdentityPoolCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_DeleteIdentityPoolCommand = de_DeleteIdentityPoolCommand;\nconst de_DeleteIdentityPoolCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_DescribeIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_IdentityDescription(data, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeIdentityCommand = de_DescribeIdentityCommand;\nconst de_DescribeIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_DescribeIdentityPoolCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeIdentityPoolCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeIdentityPoolCommand = de_DescribeIdentityPoolCommand;\nconst de_DescribeIdentityPoolCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetCredentialsForIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetCredentialsForIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetCredentialsForIdentityResponse(data, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetCredentialsForIdentityCommand = de_GetCredentialsForIdentityCommand;\nconst de_GetCredentialsForIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExternalServiceException\":\n case \"com.amazonaws.cognitoidentity#ExternalServiceException\":\n throw await de_ExternalServiceExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidIdentityPoolConfigurationException\":\n case \"com.amazonaws.cognitoidentity#InvalidIdentityPoolConfigurationException\":\n throw await de_InvalidIdentityPoolConfigurationExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetIdCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetIdCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetIdCommand = de_GetIdCommand;\nconst de_GetIdCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExternalServiceException\":\n case \"com.amazonaws.cognitoidentity#ExternalServiceException\":\n throw await de_ExternalServiceExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cognitoidentity#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetIdentityPoolRolesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetIdentityPoolRolesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetIdentityPoolRolesCommand = de_GetIdentityPoolRolesCommand;\nconst de_GetIdentityPoolRolesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetOpenIdTokenCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetOpenIdTokenCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetOpenIdTokenCommand = de_GetOpenIdTokenCommand;\nconst de_GetOpenIdTokenCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExternalServiceException\":\n case \"com.amazonaws.cognitoidentity#ExternalServiceException\":\n throw await de_ExternalServiceExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetOpenIdTokenForDeveloperIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetOpenIdTokenForDeveloperIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetOpenIdTokenForDeveloperIdentityCommand = de_GetOpenIdTokenForDeveloperIdentityCommand;\nconst de_GetOpenIdTokenForDeveloperIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"DeveloperUserAlreadyRegisteredException\":\n case \"com.amazonaws.cognitoidentity#DeveloperUserAlreadyRegisteredException\":\n throw await de_DeveloperUserAlreadyRegisteredExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetPrincipalTagAttributeMapCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetPrincipalTagAttributeMapCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetPrincipalTagAttributeMapCommand = de_GetPrincipalTagAttributeMapCommand;\nconst de_GetPrincipalTagAttributeMapCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ListIdentitiesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListIdentitiesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListIdentitiesResponse(data, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListIdentitiesCommand = de_ListIdentitiesCommand;\nconst de_ListIdentitiesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ListIdentityPoolsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListIdentityPoolsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListIdentityPoolsCommand = de_ListIdentityPoolsCommand;\nconst de_ListIdentityPoolsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ListTagsForResourceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListTagsForResourceCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListTagsForResourceCommand = de_ListTagsForResourceCommand;\nconst de_ListTagsForResourceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_LookupDeveloperIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_LookupDeveloperIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_LookupDeveloperIdentityCommand = de_LookupDeveloperIdentityCommand;\nconst de_LookupDeveloperIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_MergeDeveloperIdentitiesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_MergeDeveloperIdentitiesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_MergeDeveloperIdentitiesCommand = de_MergeDeveloperIdentitiesCommand;\nconst de_MergeDeveloperIdentitiesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_SetIdentityPoolRolesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SetIdentityPoolRolesCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_SetIdentityPoolRolesCommand = de_SetIdentityPoolRolesCommand;\nconst de_SetIdentityPoolRolesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ConcurrentModificationException\":\n case \"com.amazonaws.cognitoidentity#ConcurrentModificationException\":\n throw await de_ConcurrentModificationExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_SetPrincipalTagAttributeMapCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SetPrincipalTagAttributeMapCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_SetPrincipalTagAttributeMapCommand = de_SetPrincipalTagAttributeMapCommand;\nconst de_SetPrincipalTagAttributeMapCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_TagResourceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_TagResourceCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_TagResourceCommand = de_TagResourceCommand;\nconst de_TagResourceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_UnlinkDeveloperIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UnlinkDeveloperIdentityCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_UnlinkDeveloperIdentityCommand = de_UnlinkDeveloperIdentityCommand;\nconst de_UnlinkDeveloperIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_UnlinkIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UnlinkIdentityCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_UnlinkIdentityCommand = de_UnlinkIdentityCommand;\nconst de_UnlinkIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExternalServiceException\":\n case \"com.amazonaws.cognitoidentity#ExternalServiceException\":\n throw await de_ExternalServiceExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_UntagResourceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UntagResourceCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UntagResourceCommand = de_UntagResourceCommand;\nconst de_UntagResourceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_UpdateIdentityPoolCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UpdateIdentityPoolCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UpdateIdentityPoolCommand = de_UpdateIdentityPoolCommand;\nconst de_UpdateIdentityPoolCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ConcurrentModificationException\":\n case \"com.amazonaws.cognitoidentity#ConcurrentModificationException\":\n throw await de_ConcurrentModificationExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cognitoidentity#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ConcurrentModificationExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.ConcurrentModificationException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_DeveloperUserAlreadyRegisteredExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.DeveloperUserAlreadyRegisteredException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_ExternalServiceExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.ExternalServiceException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InternalErrorExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.InternalErrorException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidIdentityPoolConfigurationExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.InvalidIdentityPoolConfigurationException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidParameterExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.InvalidParameterException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_LimitExceededExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.LimitExceededException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_NotAuthorizedExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.NotAuthorizedException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_ResourceConflictExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.ResourceConflictException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_ResourceNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.ResourceNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_TooManyRequestsExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.TooManyRequestsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_Credentials = (output, context) => {\n return (0, smithy_client_1.take)(output, {\n AccessKeyId: smithy_client_1.expectString,\n Expiration: (_) => (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseEpochTimestamp)((0, smithy_client_1.expectNumber)(_))),\n SecretKey: smithy_client_1.expectString,\n SessionToken: smithy_client_1.expectString,\n });\n};\nconst de_GetCredentialsForIdentityResponse = (output, context) => {\n return (0, smithy_client_1.take)(output, {\n Credentials: (_) => de_Credentials(_, context),\n IdentityId: smithy_client_1.expectString,\n });\n};\nconst de_IdentitiesList = (output, context) => {\n const retVal = (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_IdentityDescription(entry, context);\n });\n return retVal;\n};\nconst de_IdentityDescription = (output, context) => {\n return (0, smithy_client_1.take)(output, {\n CreationDate: (_) => (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseEpochTimestamp)((0, smithy_client_1.expectNumber)(_))),\n IdentityId: smithy_client_1.expectString,\n LastModifiedDate: (_) => (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseEpochTimestamp)((0, smithy_client_1.expectNumber)(_))),\n Logins: smithy_client_1._json,\n });\n};\nconst de_ListIdentitiesResponse = (output, context) => {\n return (0, smithy_client_1.take)(output, {\n Identities: (_) => de_IdentitiesList(_, context),\n IdentityPoolId: smithy_client_1.expectString,\n NextToken: smithy_client_1.expectString,\n });\n};\nconst deserializeMetadata = (output) => ({\n httpStatusCode: output.statusCode,\n requestId: output.headers[\"x-amzn-requestid\"] ?? output.headers[\"x-amzn-request-id\"] ?? output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n});\nconst collectBodyString = (streamBody, context) => (0, smithy_client_1.collectBody)(streamBody, context).then((body) => context.utf8Encoder(body));\nconst throwDefaultError = (0, smithy_client_1.withBaseException)(CognitoIdentityServiceException_1.CognitoIdentityServiceException);\nconst buildHttpRpcRequest = async (context, headers, path, resolvedHostname, body) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const contents = {\n protocol,\n hostname,\n port,\n method: \"POST\",\n path: basePath.endsWith(\"/\") ? basePath.slice(0, -1) + path : basePath + path,\n headers,\n };\n if (resolvedHostname !== undefined) {\n contents.hostname = resolvedHostname;\n }\n if (body !== undefined) {\n contents.body = body;\n }\n return new protocol_http_1.HttpRequest(contents);\n};\nfunction sharedHeaders(operation) {\n return {\n \"content-type\": \"application/x-amz-json-1.1\",\n \"x-amz-target\": `AWSCognitoIdentityService.${operation}`,\n };\n}\nconst parseBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n if (encoded.length) {\n return JSON.parse(encoded);\n }\n return {};\n});\nconst parseErrorBody = async (errorBody, context) => {\n const value = await parseBody(errorBody, context);\n value.message = value.message ?? value.Message;\n return value;\n};\nconst loadRestJsonErrorCode = (output, data) => {\n const findKey = (object, key) => Object.keys(object).find((k) => k.toLowerCase() === key.toLowerCase());\n const sanitizeErrorCode = (rawValue) => {\n let cleanValue = rawValue;\n if (typeof cleanValue === \"number\") {\n cleanValue = cleanValue.toString();\n }\n if (cleanValue.indexOf(\",\") >= 0) {\n cleanValue = cleanValue.split(\",\")[0];\n }\n if (cleanValue.indexOf(\":\") >= 0) {\n cleanValue = cleanValue.split(\":\")[0];\n }\n if (cleanValue.indexOf(\"#\") >= 0) {\n cleanValue = cleanValue.split(\"#\")[1];\n }\n return cleanValue;\n };\n const headerKey = findKey(output.headers, \"x-amzn-errortype\");\n if (headerKey !== undefined) {\n return sanitizeErrorCode(output.headers[headerKey]);\n }\n if (data.code !== undefined) {\n return sanitizeErrorCode(data.code);\n }\n if (data[\"__type\"] !== undefined) {\n return sanitizeErrorCode(data[\"__type\"]);\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst tslib_1 = require(\"tslib\");\nconst package_json_1 = tslib_1.__importDefault(require(\"../package.json\"));\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst core_1 = require(\"@aws-sdk/core\");\nconst credential_provider_node_1 = require(\"@aws-sdk/credential-provider-node\");\nconst util_user_agent_node_1 = require(\"@aws-sdk/util-user-agent-node\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst hash_node_1 = require(\"@smithy/hash-node\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_body_length_node_1 = require(\"@smithy/util-body-length-node\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst runtimeConfig_shared_1 = require(\"./runtimeConfig.shared\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst util_defaults_mode_node_1 = require(\"@smithy/util-defaults-mode-node\");\nconst smithy_client_2 = require(\"@smithy/smithy-client\");\nconst getRuntimeConfig = (config) => {\n (0, smithy_client_2.emitWarningIfUnsupportedVersion)(process.version);\n const defaultsMode = (0, util_defaults_mode_node_1.resolveDefaultsModeConfig)(config);\n const defaultConfigProvider = () => defaultsMode().then(smithy_client_1.loadConfigsForDefaultMode);\n const clientSharedValues = (0, runtimeConfig_shared_1.getRuntimeConfig)(config);\n (0, core_1.emitWarningIfUnsupportedVersion)(process.version);\n return {\n ...clientSharedValues,\n ...config,\n runtime: \"node\",\n defaultsMode,\n bodyLengthChecker: config?.bodyLengthChecker ?? util_body_length_node_1.calculateBodyLength,\n credentialDefaultProvider: config?.credentialDefaultProvider ?? (0, client_sts_1.decorateDefaultCredentialProvider)(credential_provider_node_1.defaultProvider),\n defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n (0, util_user_agent_node_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_json_1.default.version }),\n maxAttempts: config?.maxAttempts ?? (0, node_config_provider_1.loadConfig)(middleware_retry_1.NODE_MAX_ATTEMPT_CONFIG_OPTIONS),\n region: config?.region ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS, config_resolver_1.NODE_REGION_CONFIG_FILE_OPTIONS),\n requestHandler: config?.requestHandler ?? new node_http_handler_1.NodeHttpHandler(defaultConfigProvider),\n retryMode: config?.retryMode ??\n (0, node_config_provider_1.loadConfig)({\n ...middleware_retry_1.NODE_RETRY_MODE_CONFIG_OPTIONS,\n default: async () => (await defaultConfigProvider()).retryMode || util_retry_1.DEFAULT_RETRY_MODE,\n }),\n sha256: config?.sha256 ?? hash_node_1.Hash.bind(null, \"sha256\"),\n streamCollector: config?.streamCollector ?? node_http_handler_1.streamCollector,\n useDualstackEndpoint: config?.useDualstackEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS),\n useFipsEndpoint: config?.useFipsEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS),\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst endpointResolver_1 = require(\"./endpoint/endpointResolver\");\nconst getRuntimeConfig = (config) => {\n return {\n apiVersion: \"2014-06-30\",\n base64Decoder: config?.base64Decoder ?? util_base64_1.fromBase64,\n base64Encoder: config?.base64Encoder ?? util_base64_1.toBase64,\n disableHostPrefix: config?.disableHostPrefix ?? false,\n endpointProvider: config?.endpointProvider ?? endpointResolver_1.defaultEndpointResolver,\n extensions: config?.extensions ?? [],\n logger: config?.logger ?? new smithy_client_1.NoOpLogger(),\n serviceId: config?.serviceId ?? \"Cognito Identity\",\n urlParser: config?.urlParser ?? url_parser_1.parseUrl,\n utf8Decoder: config?.utf8Decoder ?? util_utf8_1.fromUtf8,\n utf8Encoder: config?.utf8Encoder ?? util_utf8_1.toUtf8,\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRuntimeExtensions = void 0;\nconst region_config_resolver_1 = require(\"@aws-sdk/region-config-resolver\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst asPartial = (t) => t;\nconst resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n const extensionConfiguration = {\n ...asPartial((0, region_config_resolver_1.getAwsRegionExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, smithy_client_1.getDefaultExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, protocol_http_1.getHttpHandlerExtensionConfiguration)(runtimeConfig)),\n };\n extensions.forEach((extension) => extension.configure(extensionConfiguration));\n return {\n ...runtimeConfig,\n ...(0, region_config_resolver_1.resolveAwsRegionExtensionConfiguration)(extensionConfiguration),\n ...(0, smithy_client_1.resolveDefaultRuntimeConfig)(extensionConfiguration),\n ...(0, protocol_http_1.resolveHttpHandlerRuntimeConfig)(extensionConfiguration),\n };\n};\nexports.resolveRuntimeExtensions = resolveRuntimeExtensions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SSO = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst GetRoleCredentialsCommand_1 = require(\"./commands/GetRoleCredentialsCommand\");\nconst ListAccountRolesCommand_1 = require(\"./commands/ListAccountRolesCommand\");\nconst ListAccountsCommand_1 = require(\"./commands/ListAccountsCommand\");\nconst LogoutCommand_1 = require(\"./commands/LogoutCommand\");\nconst SSOClient_1 = require(\"./SSOClient\");\nconst commands = {\n GetRoleCredentialsCommand: GetRoleCredentialsCommand_1.GetRoleCredentialsCommand,\n ListAccountRolesCommand: ListAccountRolesCommand_1.ListAccountRolesCommand,\n ListAccountsCommand: ListAccountsCommand_1.ListAccountsCommand,\n LogoutCommand: LogoutCommand_1.LogoutCommand,\n};\nclass SSO extends SSOClient_1.SSOClient {\n}\nexports.SSO = SSO;\n(0, smithy_client_1.createAggregatedClient)(commands, SSO);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SSOClient = exports.__Client = void 0;\nconst middleware_host_header_1 = require(\"@aws-sdk/middleware-host-header\");\nconst middleware_logger_1 = require(\"@aws-sdk/middleware-logger\");\nconst middleware_recursion_detection_1 = require(\"@aws-sdk/middleware-recursion-detection\");\nconst middleware_user_agent_1 = require(\"@aws-sdk/middleware-user-agent\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst middleware_content_length_1 = require(\"@smithy/middleware-content-length\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__Client\", { enumerable: true, get: function () { return smithy_client_1.Client; } });\nconst EndpointParameters_1 = require(\"./endpoint/EndpointParameters\");\nconst runtimeConfig_1 = require(\"./runtimeConfig\");\nconst runtimeExtensions_1 = require(\"./runtimeExtensions\");\nclass SSOClient extends smithy_client_1.Client {\n constructor(...[configuration]) {\n const _config_0 = (0, runtimeConfig_1.getRuntimeConfig)(configuration || {});\n const _config_1 = (0, EndpointParameters_1.resolveClientEndpointParameters)(_config_0);\n const _config_2 = (0, config_resolver_1.resolveRegionConfig)(_config_1);\n const _config_3 = (0, middleware_endpoint_1.resolveEndpointConfig)(_config_2);\n const _config_4 = (0, middleware_retry_1.resolveRetryConfig)(_config_3);\n const _config_5 = (0, middleware_host_header_1.resolveHostHeaderConfig)(_config_4);\n const _config_6 = (0, middleware_user_agent_1.resolveUserAgentConfig)(_config_5);\n const _config_7 = (0, runtimeExtensions_1.resolveRuntimeExtensions)(_config_6, configuration?.extensions || []);\n super(_config_7);\n this.config = _config_7;\n this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));\n this.middlewareStack.use((0, middleware_content_length_1.getContentLengthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_host_header_1.getHostHeaderPlugin)(this.config));\n this.middlewareStack.use((0, middleware_logger_1.getLoggerPlugin)(this.config));\n this.middlewareStack.use((0, middleware_recursion_detection_1.getRecursionDetectionPlugin)(this.config));\n this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));\n }\n destroy() {\n super.destroy();\n }\n}\nexports.SSOClient = SSOClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetRoleCredentialsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_restJson1_1 = require(\"../protocols/Aws_restJson1\");\nclass GetRoleCredentialsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetRoleCredentialsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOClient\";\n const commandName = \"GetRoleCredentialsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.GetRoleCredentialsRequestFilterSensitiveLog,\n outputFilterSensitiveLog: models_0_1.GetRoleCredentialsResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"SWBPortalService\",\n operation: \"GetRoleCredentials\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_restJson1_1.se_GetRoleCredentialsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_restJson1_1.de_GetRoleCredentialsCommand)(output, context);\n }\n}\nexports.GetRoleCredentialsCommand = GetRoleCredentialsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListAccountRolesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_restJson1_1 = require(\"../protocols/Aws_restJson1\");\nclass ListAccountRolesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListAccountRolesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOClient\";\n const commandName = \"ListAccountRolesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.ListAccountRolesRequestFilterSensitiveLog,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"SWBPortalService\",\n operation: \"ListAccountRoles\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_restJson1_1.se_ListAccountRolesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_restJson1_1.de_ListAccountRolesCommand)(output, context);\n }\n}\nexports.ListAccountRolesCommand = ListAccountRolesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListAccountsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_restJson1_1 = require(\"../protocols/Aws_restJson1\");\nclass ListAccountsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListAccountsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOClient\";\n const commandName = \"ListAccountsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.ListAccountsRequestFilterSensitiveLog,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"SWBPortalService\",\n operation: \"ListAccounts\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_restJson1_1.se_ListAccountsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_restJson1_1.de_ListAccountsCommand)(output, context);\n }\n}\nexports.ListAccountsCommand = ListAccountsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LogoutCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_restJson1_1 = require(\"../protocols/Aws_restJson1\");\nclass LogoutCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, LogoutCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOClient\";\n const commandName = \"LogoutCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.LogoutRequestFilterSensitiveLog,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"SWBPortalService\",\n operation: \"Logout\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_restJson1_1.se_LogoutCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_restJson1_1.de_LogoutCommand)(output, context);\n }\n}\nexports.LogoutCommand = LogoutCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./GetRoleCredentialsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListAccountRolesCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListAccountsCommand\"), exports);\ntslib_1.__exportStar(require(\"./LogoutCommand\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveClientEndpointParameters = void 0;\nconst resolveClientEndpointParameters = (options) => {\n return {\n ...options,\n useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n useFipsEndpoint: options.useFipsEndpoint ?? false,\n defaultSigningName: \"awsssoportal\",\n };\n};\nexports.resolveClientEndpointParameters = resolveClientEndpointParameters;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultEndpointResolver = void 0;\nconst util_endpoints_1 = require(\"@aws-sdk/util-endpoints\");\nconst ruleset_1 = require(\"./ruleset\");\nconst defaultEndpointResolver = (endpointParams, context = {}) => {\n return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, {\n endpointParams: endpointParams,\n logger: context.logger,\n });\n};\nexports.defaultEndpointResolver = defaultEndpointResolver;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ruleSet = void 0;\nconst u = \"required\", v = \"fn\", w = \"argv\", x = \"ref\";\nconst a = true, b = \"isSet\", c = \"booleanEquals\", d = \"error\", e = \"endpoint\", f = \"tree\", g = \"PartitionResult\", h = \"getAttr\", i = { [u]: false, \"type\": \"String\" }, j = { [u]: true, \"default\": false, \"type\": \"Boolean\" }, k = { [x]: \"Endpoint\" }, l = { [v]: c, [w]: [{ [x]: \"UseFIPS\" }, true] }, m = { [v]: c, [w]: [{ [x]: \"UseDualStack\" }, true] }, n = {}, o = { [v]: h, [w]: [{ [x]: g }, \"supportsFIPS\"] }, p = { [x]: g }, q = { [v]: c, [w]: [true, { [v]: h, [w]: [p, \"supportsDualStack\"] }] }, r = [l], s = [m], t = [{ [x]: \"Region\" }];\nconst _data = { version: \"1.0\", parameters: { Region: i, UseDualStack: j, UseFIPS: j, Endpoint: i }, rules: [{ conditions: [{ [v]: b, [w]: [k] }], rules: [{ conditions: r, error: \"Invalid Configuration: FIPS and custom endpoint are not supported\", type: d }, { conditions: s, error: \"Invalid Configuration: Dualstack and custom endpoint are not supported\", type: d }, { endpoint: { url: k, properties: n, headers: n }, type: e }], type: f }, { conditions: [{ [v]: b, [w]: t }], rules: [{ conditions: [{ [v]: \"aws.partition\", [w]: t, assign: g }], rules: [{ conditions: [l, m], rules: [{ conditions: [{ [v]: c, [w]: [a, o] }, q], rules: [{ endpoint: { url: \"https://portal.sso-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"FIPS and DualStack are enabled, but this partition does not support one or both\", type: d }], type: f }, { conditions: r, rules: [{ conditions: [{ [v]: c, [w]: [o, a] }], rules: [{ conditions: [{ [v]: \"stringEquals\", [w]: [{ [v]: h, [w]: [p, \"name\"] }, \"aws-us-gov\"] }], endpoint: { url: \"https://portal.sso.{Region}.amazonaws.com\", properties: n, headers: n }, type: e }, { endpoint: { url: \"https://portal.sso-fips.{Region}.{PartitionResult#dnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"FIPS is enabled but this partition does not support FIPS\", type: d }], type: f }, { conditions: s, rules: [{ conditions: [q], rules: [{ endpoint: { url: \"https://portal.sso.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"DualStack is enabled but this partition does not support DualStack\", type: d }], type: f }, { endpoint: { url: \"https://portal.sso.{Region}.{PartitionResult#dnsSuffix}\", properties: n, headers: n }, type: e }], type: f }], type: f }, { error: \"Invalid Configuration: Missing Region\", type: d }] };\nexports.ruleSet = _data;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SSOServiceException = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./SSOClient\"), exports);\ntslib_1.__exportStar(require(\"./SSO\"), exports);\ntslib_1.__exportStar(require(\"./commands\"), exports);\ntslib_1.__exportStar(require(\"./pagination\"), exports);\ntslib_1.__exportStar(require(\"./models\"), exports);\nvar SSOServiceException_1 = require(\"./models/SSOServiceException\");\nObject.defineProperty(exports, \"SSOServiceException\", { enumerable: true, get: function () { return SSOServiceException_1.SSOServiceException; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SSOServiceException = exports.__ServiceException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__ServiceException\", { enumerable: true, get: function () { return smithy_client_1.ServiceException; } });\nclass SSOServiceException extends smithy_client_1.ServiceException {\n constructor(options) {\n super(options);\n Object.setPrototypeOf(this, SSOServiceException.prototype);\n }\n}\nexports.SSOServiceException = SSOServiceException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./models_0\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LogoutRequestFilterSensitiveLog = exports.ListAccountsRequestFilterSensitiveLog = exports.ListAccountRolesRequestFilterSensitiveLog = exports.GetRoleCredentialsResponseFilterSensitiveLog = exports.RoleCredentialsFilterSensitiveLog = exports.GetRoleCredentialsRequestFilterSensitiveLog = exports.UnauthorizedException = exports.TooManyRequestsException = exports.ResourceNotFoundException = exports.InvalidRequestException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst SSOServiceException_1 = require(\"./SSOServiceException\");\nclass InvalidRequestException extends SSOServiceException_1.SSOServiceException {\n constructor(opts) {\n super({\n name: \"InvalidRequestException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidRequestException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidRequestException.prototype);\n }\n}\nexports.InvalidRequestException = InvalidRequestException;\nclass ResourceNotFoundException extends SSOServiceException_1.SSOServiceException {\n constructor(opts) {\n super({\n name: \"ResourceNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ResourceNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ResourceNotFoundException.prototype);\n }\n}\nexports.ResourceNotFoundException = ResourceNotFoundException;\nclass TooManyRequestsException extends SSOServiceException_1.SSOServiceException {\n constructor(opts) {\n super({\n name: \"TooManyRequestsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"TooManyRequestsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, TooManyRequestsException.prototype);\n }\n}\nexports.TooManyRequestsException = TooManyRequestsException;\nclass UnauthorizedException extends SSOServiceException_1.SSOServiceException {\n constructor(opts) {\n super({\n name: \"UnauthorizedException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"UnauthorizedException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, UnauthorizedException.prototype);\n }\n}\nexports.UnauthorizedException = UnauthorizedException;\nconst GetRoleCredentialsRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.accessToken && { accessToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.GetRoleCredentialsRequestFilterSensitiveLog = GetRoleCredentialsRequestFilterSensitiveLog;\nconst RoleCredentialsFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.secretAccessKey && { secretAccessKey: smithy_client_1.SENSITIVE_STRING }),\n ...(obj.sessionToken && { sessionToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.RoleCredentialsFilterSensitiveLog = RoleCredentialsFilterSensitiveLog;\nconst GetRoleCredentialsResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.roleCredentials && { roleCredentials: (0, exports.RoleCredentialsFilterSensitiveLog)(obj.roleCredentials) }),\n});\nexports.GetRoleCredentialsResponseFilterSensitiveLog = GetRoleCredentialsResponseFilterSensitiveLog;\nconst ListAccountRolesRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.accessToken && { accessToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.ListAccountRolesRequestFilterSensitiveLog = ListAccountRolesRequestFilterSensitiveLog;\nconst ListAccountsRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.accessToken && { accessToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.ListAccountsRequestFilterSensitiveLog = ListAccountsRequestFilterSensitiveLog;\nconst LogoutRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.accessToken && { accessToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.LogoutRequestFilterSensitiveLog = LogoutRequestFilterSensitiveLog;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListAccountRoles = void 0;\nconst ListAccountRolesCommand_1 = require(\"../commands/ListAccountRolesCommand\");\nconst SSOClient_1 = require(\"../SSOClient\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListAccountRolesCommand_1.ListAccountRolesCommand(input), ...args);\n};\nasync function* paginateListAccountRoles(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.nextToken = token;\n input[\"maxResults\"] = config.pageSize;\n if (config.client instanceof SSOClient_1.SSOClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected SSO | SSOClient\");\n }\n yield page;\n const prevToken = token;\n token = page.nextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListAccountRoles = paginateListAccountRoles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListAccounts = void 0;\nconst ListAccountsCommand_1 = require(\"../commands/ListAccountsCommand\");\nconst SSOClient_1 = require(\"../SSOClient\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListAccountsCommand_1.ListAccountsCommand(input), ...args);\n};\nasync function* paginateListAccounts(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.nextToken = token;\n input[\"maxResults\"] = config.pageSize;\n if (config.client instanceof SSOClient_1.SSOClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected SSO | SSOClient\");\n }\n yield page;\n const prevToken = token;\n token = page.nextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListAccounts = paginateListAccounts;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./Interfaces\"), exports);\ntslib_1.__exportStar(require(\"./ListAccountRolesPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListAccountsPaginator\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.de_LogoutCommand = exports.de_ListAccountsCommand = exports.de_ListAccountRolesCommand = exports.de_GetRoleCredentialsCommand = exports.se_LogoutCommand = exports.se_ListAccountsCommand = exports.se_ListAccountRolesCommand = exports.se_GetRoleCredentialsCommand = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst models_0_1 = require(\"../models/models_0\");\nconst SSOServiceException_1 = require(\"../models/SSOServiceException\");\nconst se_GetRoleCredentialsCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = (0, smithy_client_1.map)({}, isSerializableHeaderValue, {\n \"x-amz-sso_bearer_token\": input.accessToken,\n });\n const resolvedPath = `${basePath?.endsWith(\"/\") ? basePath.slice(0, -1) : basePath || \"\"}` + \"/federation/credentials\";\n const query = (0, smithy_client_1.map)({\n role_name: [, (0, smithy_client_1.expectNonNull)(input.roleName, `roleName`)],\n account_id: [, (0, smithy_client_1.expectNonNull)(input.accountId, `accountId`)],\n });\n let body;\n return new protocol_http_1.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"GET\",\n headers,\n path: resolvedPath,\n query,\n body,\n });\n};\nexports.se_GetRoleCredentialsCommand = se_GetRoleCredentialsCommand;\nconst se_ListAccountRolesCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = (0, smithy_client_1.map)({}, isSerializableHeaderValue, {\n \"x-amz-sso_bearer_token\": input.accessToken,\n });\n const resolvedPath = `${basePath?.endsWith(\"/\") ? basePath.slice(0, -1) : basePath || \"\"}` + \"/assignment/roles\";\n const query = (0, smithy_client_1.map)({\n next_token: [, input.nextToken],\n max_result: [() => input.maxResults !== void 0, () => input.maxResults.toString()],\n account_id: [, (0, smithy_client_1.expectNonNull)(input.accountId, `accountId`)],\n });\n let body;\n return new protocol_http_1.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"GET\",\n headers,\n path: resolvedPath,\n query,\n body,\n });\n};\nexports.se_ListAccountRolesCommand = se_ListAccountRolesCommand;\nconst se_ListAccountsCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = (0, smithy_client_1.map)({}, isSerializableHeaderValue, {\n \"x-amz-sso_bearer_token\": input.accessToken,\n });\n const resolvedPath = `${basePath?.endsWith(\"/\") ? basePath.slice(0, -1) : basePath || \"\"}` + \"/assignment/accounts\";\n const query = (0, smithy_client_1.map)({\n next_token: [, input.nextToken],\n max_result: [() => input.maxResults !== void 0, () => input.maxResults.toString()],\n });\n let body;\n return new protocol_http_1.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"GET\",\n headers,\n path: resolvedPath,\n query,\n body,\n });\n};\nexports.se_ListAccountsCommand = se_ListAccountsCommand;\nconst se_LogoutCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = (0, smithy_client_1.map)({}, isSerializableHeaderValue, {\n \"x-amz-sso_bearer_token\": input.accessToken,\n });\n const resolvedPath = `${basePath?.endsWith(\"/\") ? basePath.slice(0, -1) : basePath || \"\"}` + \"/logout\";\n let body;\n return new protocol_http_1.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"POST\",\n headers,\n path: resolvedPath,\n body,\n });\n};\nexports.se_LogoutCommand = se_LogoutCommand;\nconst de_GetRoleCredentialsCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_GetRoleCredentialsCommandError(output, context);\n }\n const contents = (0, smithy_client_1.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_1.take)(data, {\n roleCredentials: smithy_client_1._json,\n });\n Object.assign(contents, doc);\n return contents;\n};\nexports.de_GetRoleCredentialsCommand = de_GetRoleCredentialsCommand;\nconst de_GetRoleCredentialsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidRequestException\":\n case \"com.amazonaws.sso#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.sso#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.sso#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n case \"UnauthorizedException\":\n case \"com.amazonaws.sso#UnauthorizedException\":\n throw await de_UnauthorizedExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ListAccountRolesCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_ListAccountRolesCommandError(output, context);\n }\n const contents = (0, smithy_client_1.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_1.take)(data, {\n nextToken: smithy_client_1.expectString,\n roleList: smithy_client_1._json,\n });\n Object.assign(contents, doc);\n return contents;\n};\nexports.de_ListAccountRolesCommand = de_ListAccountRolesCommand;\nconst de_ListAccountRolesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidRequestException\":\n case \"com.amazonaws.sso#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.sso#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.sso#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n case \"UnauthorizedException\":\n case \"com.amazonaws.sso#UnauthorizedException\":\n throw await de_UnauthorizedExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ListAccountsCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_ListAccountsCommandError(output, context);\n }\n const contents = (0, smithy_client_1.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_1.take)(data, {\n accountList: smithy_client_1._json,\n nextToken: smithy_client_1.expectString,\n });\n Object.assign(contents, doc);\n return contents;\n};\nexports.de_ListAccountsCommand = de_ListAccountsCommand;\nconst de_ListAccountsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidRequestException\":\n case \"com.amazonaws.sso#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.sso#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.sso#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n case \"UnauthorizedException\":\n case \"com.amazonaws.sso#UnauthorizedException\":\n throw await de_UnauthorizedExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_LogoutCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_LogoutCommandError(output, context);\n }\n const contents = (0, smithy_client_1.map)({\n $metadata: deserializeMetadata(output),\n });\n await (0, smithy_client_1.collectBody)(output.body, context);\n return contents;\n};\nexports.de_LogoutCommand = de_LogoutCommand;\nconst de_LogoutCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidRequestException\":\n case \"com.amazonaws.sso#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.sso#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n case \"UnauthorizedException\":\n case \"com.amazonaws.sso#UnauthorizedException\":\n throw await de_UnauthorizedExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst throwDefaultError = (0, smithy_client_1.withBaseException)(SSOServiceException_1.SSOServiceException);\nconst de_InvalidRequestExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_1.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_1.take)(data, {\n message: smithy_client_1.expectString,\n });\n Object.assign(contents, doc);\n const exception = new models_0_1.InvalidRequestException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, parsedOutput.body);\n};\nconst de_ResourceNotFoundExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_1.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_1.take)(data, {\n message: smithy_client_1.expectString,\n });\n Object.assign(contents, doc);\n const exception = new models_0_1.ResourceNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, parsedOutput.body);\n};\nconst de_TooManyRequestsExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_1.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_1.take)(data, {\n message: smithy_client_1.expectString,\n });\n Object.assign(contents, doc);\n const exception = new models_0_1.TooManyRequestsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, parsedOutput.body);\n};\nconst de_UnauthorizedExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_1.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_1.take)(data, {\n message: smithy_client_1.expectString,\n });\n Object.assign(contents, doc);\n const exception = new models_0_1.UnauthorizedException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, parsedOutput.body);\n};\nconst deserializeMetadata = (output) => ({\n httpStatusCode: output.statusCode,\n requestId: output.headers[\"x-amzn-requestid\"] ?? output.headers[\"x-amzn-request-id\"] ?? output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n});\nconst collectBodyString = (streamBody, context) => (0, smithy_client_1.collectBody)(streamBody, context).then((body) => context.utf8Encoder(body));\nconst isSerializableHeaderValue = (value) => value !== undefined &&\n value !== null &&\n value !== \"\" &&\n (!Object.getOwnPropertyNames(value).includes(\"length\") || value.length != 0) &&\n (!Object.getOwnPropertyNames(value).includes(\"size\") || value.size != 0);\nconst parseBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n if (encoded.length) {\n return JSON.parse(encoded);\n }\n return {};\n});\nconst parseErrorBody = async (errorBody, context) => {\n const value = await parseBody(errorBody, context);\n value.message = value.message ?? value.Message;\n return value;\n};\nconst loadRestJsonErrorCode = (output, data) => {\n const findKey = (object, key) => Object.keys(object).find((k) => k.toLowerCase() === key.toLowerCase());\n const sanitizeErrorCode = (rawValue) => {\n let cleanValue = rawValue;\n if (typeof cleanValue === \"number\") {\n cleanValue = cleanValue.toString();\n }\n if (cleanValue.indexOf(\",\") >= 0) {\n cleanValue = cleanValue.split(\",\")[0];\n }\n if (cleanValue.indexOf(\":\") >= 0) {\n cleanValue = cleanValue.split(\":\")[0];\n }\n if (cleanValue.indexOf(\"#\") >= 0) {\n cleanValue = cleanValue.split(\"#\")[1];\n }\n return cleanValue;\n };\n const headerKey = findKey(output.headers, \"x-amzn-errortype\");\n if (headerKey !== undefined) {\n return sanitizeErrorCode(output.headers[headerKey]);\n }\n if (data.code !== undefined) {\n return sanitizeErrorCode(data.code);\n }\n if (data[\"__type\"] !== undefined) {\n return sanitizeErrorCode(data[\"__type\"]);\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst tslib_1 = require(\"tslib\");\nconst package_json_1 = tslib_1.__importDefault(require(\"../package.json\"));\nconst core_1 = require(\"@aws-sdk/core\");\nconst util_user_agent_node_1 = require(\"@aws-sdk/util-user-agent-node\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst hash_node_1 = require(\"@smithy/hash-node\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_body_length_node_1 = require(\"@smithy/util-body-length-node\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst runtimeConfig_shared_1 = require(\"./runtimeConfig.shared\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst util_defaults_mode_node_1 = require(\"@smithy/util-defaults-mode-node\");\nconst smithy_client_2 = require(\"@smithy/smithy-client\");\nconst getRuntimeConfig = (config) => {\n (0, smithy_client_2.emitWarningIfUnsupportedVersion)(process.version);\n const defaultsMode = (0, util_defaults_mode_node_1.resolveDefaultsModeConfig)(config);\n const defaultConfigProvider = () => defaultsMode().then(smithy_client_1.loadConfigsForDefaultMode);\n const clientSharedValues = (0, runtimeConfig_shared_1.getRuntimeConfig)(config);\n (0, core_1.emitWarningIfUnsupportedVersion)(process.version);\n return {\n ...clientSharedValues,\n ...config,\n runtime: \"node\",\n defaultsMode,\n bodyLengthChecker: config?.bodyLengthChecker ?? util_body_length_node_1.calculateBodyLength,\n defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n (0, util_user_agent_node_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_json_1.default.version }),\n maxAttempts: config?.maxAttempts ?? (0, node_config_provider_1.loadConfig)(middleware_retry_1.NODE_MAX_ATTEMPT_CONFIG_OPTIONS),\n region: config?.region ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS, config_resolver_1.NODE_REGION_CONFIG_FILE_OPTIONS),\n requestHandler: config?.requestHandler ?? new node_http_handler_1.NodeHttpHandler(defaultConfigProvider),\n retryMode: config?.retryMode ??\n (0, node_config_provider_1.loadConfig)({\n ...middleware_retry_1.NODE_RETRY_MODE_CONFIG_OPTIONS,\n default: async () => (await defaultConfigProvider()).retryMode || util_retry_1.DEFAULT_RETRY_MODE,\n }),\n sha256: config?.sha256 ?? hash_node_1.Hash.bind(null, \"sha256\"),\n streamCollector: config?.streamCollector ?? node_http_handler_1.streamCollector,\n useDualstackEndpoint: config?.useDualstackEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS),\n useFipsEndpoint: config?.useFipsEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS),\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst endpointResolver_1 = require(\"./endpoint/endpointResolver\");\nconst getRuntimeConfig = (config) => {\n return {\n apiVersion: \"2019-06-10\",\n base64Decoder: config?.base64Decoder ?? util_base64_1.fromBase64,\n base64Encoder: config?.base64Encoder ?? util_base64_1.toBase64,\n disableHostPrefix: config?.disableHostPrefix ?? false,\n endpointProvider: config?.endpointProvider ?? endpointResolver_1.defaultEndpointResolver,\n extensions: config?.extensions ?? [],\n logger: config?.logger ?? new smithy_client_1.NoOpLogger(),\n serviceId: config?.serviceId ?? \"SSO\",\n urlParser: config?.urlParser ?? url_parser_1.parseUrl,\n utf8Decoder: config?.utf8Decoder ?? util_utf8_1.fromUtf8,\n utf8Encoder: config?.utf8Encoder ?? util_utf8_1.toUtf8,\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRuntimeExtensions = void 0;\nconst region_config_resolver_1 = require(\"@aws-sdk/region-config-resolver\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst asPartial = (t) => t;\nconst resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n const extensionConfiguration = {\n ...asPartial((0, region_config_resolver_1.getAwsRegionExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, smithy_client_1.getDefaultExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, protocol_http_1.getHttpHandlerExtensionConfiguration)(runtimeConfig)),\n };\n extensions.forEach((extension) => extension.configure(extensionConfiguration));\n return {\n ...runtimeConfig,\n ...(0, region_config_resolver_1.resolveAwsRegionExtensionConfiguration)(extensionConfiguration),\n ...(0, smithy_client_1.resolveDefaultRuntimeConfig)(extensionConfiguration),\n ...(0, protocol_http_1.resolveHttpHandlerRuntimeConfig)(extensionConfiguration),\n };\n};\nexports.resolveRuntimeExtensions = resolveRuntimeExtensions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.STS = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst AssumeRoleCommand_1 = require(\"./commands/AssumeRoleCommand\");\nconst AssumeRoleWithSAMLCommand_1 = require(\"./commands/AssumeRoleWithSAMLCommand\");\nconst AssumeRoleWithWebIdentityCommand_1 = require(\"./commands/AssumeRoleWithWebIdentityCommand\");\nconst DecodeAuthorizationMessageCommand_1 = require(\"./commands/DecodeAuthorizationMessageCommand\");\nconst GetAccessKeyInfoCommand_1 = require(\"./commands/GetAccessKeyInfoCommand\");\nconst GetCallerIdentityCommand_1 = require(\"./commands/GetCallerIdentityCommand\");\nconst GetFederationTokenCommand_1 = require(\"./commands/GetFederationTokenCommand\");\nconst GetSessionTokenCommand_1 = require(\"./commands/GetSessionTokenCommand\");\nconst STSClient_1 = require(\"./STSClient\");\nconst commands = {\n AssumeRoleCommand: AssumeRoleCommand_1.AssumeRoleCommand,\n AssumeRoleWithSAMLCommand: AssumeRoleWithSAMLCommand_1.AssumeRoleWithSAMLCommand,\n AssumeRoleWithWebIdentityCommand: AssumeRoleWithWebIdentityCommand_1.AssumeRoleWithWebIdentityCommand,\n DecodeAuthorizationMessageCommand: DecodeAuthorizationMessageCommand_1.DecodeAuthorizationMessageCommand,\n GetAccessKeyInfoCommand: GetAccessKeyInfoCommand_1.GetAccessKeyInfoCommand,\n GetCallerIdentityCommand: GetCallerIdentityCommand_1.GetCallerIdentityCommand,\n GetFederationTokenCommand: GetFederationTokenCommand_1.GetFederationTokenCommand,\n GetSessionTokenCommand: GetSessionTokenCommand_1.GetSessionTokenCommand,\n};\nclass STS extends STSClient_1.STSClient {\n}\nexports.STS = STS;\n(0, smithy_client_1.createAggregatedClient)(commands, STS);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.STSClient = exports.__Client = void 0;\nconst middleware_host_header_1 = require(\"@aws-sdk/middleware-host-header\");\nconst middleware_logger_1 = require(\"@aws-sdk/middleware-logger\");\nconst middleware_recursion_detection_1 = require(\"@aws-sdk/middleware-recursion-detection\");\nconst middleware_sdk_sts_1 = require(\"@aws-sdk/middleware-sdk-sts\");\nconst middleware_user_agent_1 = require(\"@aws-sdk/middleware-user-agent\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst middleware_content_length_1 = require(\"@smithy/middleware-content-length\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__Client\", { enumerable: true, get: function () { return smithy_client_1.Client; } });\nconst EndpointParameters_1 = require(\"./endpoint/EndpointParameters\");\nconst runtimeConfig_1 = require(\"./runtimeConfig\");\nconst runtimeExtensions_1 = require(\"./runtimeExtensions\");\nclass STSClient extends smithy_client_1.Client {\n constructor(...[configuration]) {\n const _config_0 = (0, runtimeConfig_1.getRuntimeConfig)(configuration || {});\n const _config_1 = (0, EndpointParameters_1.resolveClientEndpointParameters)(_config_0);\n const _config_2 = (0, config_resolver_1.resolveRegionConfig)(_config_1);\n const _config_3 = (0, middleware_endpoint_1.resolveEndpointConfig)(_config_2);\n const _config_4 = (0, middleware_retry_1.resolveRetryConfig)(_config_3);\n const _config_5 = (0, middleware_host_header_1.resolveHostHeaderConfig)(_config_4);\n const _config_6 = (0, middleware_sdk_sts_1.resolveStsAuthConfig)(_config_5, { stsClientCtor: STSClient });\n const _config_7 = (0, middleware_user_agent_1.resolveUserAgentConfig)(_config_6);\n const _config_8 = (0, runtimeExtensions_1.resolveRuntimeExtensions)(_config_7, configuration?.extensions || []);\n super(_config_8);\n this.config = _config_8;\n this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));\n this.middlewareStack.use((0, middleware_content_length_1.getContentLengthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_host_header_1.getHostHeaderPlugin)(this.config));\n this.middlewareStack.use((0, middleware_logger_1.getLoggerPlugin)(this.config));\n this.middlewareStack.use((0, middleware_recursion_detection_1.getRecursionDetectionPlugin)(this.config));\n this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));\n }\n destroy() {\n super.destroy();\n }\n}\nexports.STSClient = STSClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AssumeRoleCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass AssumeRoleCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, AssumeRoleCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"AssumeRoleCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: models_0_1.AssumeRoleResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"AssumeRole\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_AssumeRoleCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_AssumeRoleCommand)(output, context);\n }\n}\nexports.AssumeRoleCommand = AssumeRoleCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AssumeRoleWithSAMLCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass AssumeRoleWithSAMLCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, AssumeRoleWithSAMLCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"AssumeRoleWithSAMLCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.AssumeRoleWithSAMLRequestFilterSensitiveLog,\n outputFilterSensitiveLog: models_0_1.AssumeRoleWithSAMLResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"AssumeRoleWithSAML\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_AssumeRoleWithSAMLCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_AssumeRoleWithSAMLCommand)(output, context);\n }\n}\nexports.AssumeRoleWithSAMLCommand = AssumeRoleWithSAMLCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AssumeRoleWithWebIdentityCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass AssumeRoleWithWebIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, AssumeRoleWithWebIdentityCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"AssumeRoleWithWebIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.AssumeRoleWithWebIdentityRequestFilterSensitiveLog,\n outputFilterSensitiveLog: models_0_1.AssumeRoleWithWebIdentityResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"AssumeRoleWithWebIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_AssumeRoleWithWebIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_AssumeRoleWithWebIdentityCommand)(output, context);\n }\n}\nexports.AssumeRoleWithWebIdentityCommand = AssumeRoleWithWebIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DecodeAuthorizationMessageCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DecodeAuthorizationMessageCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DecodeAuthorizationMessageCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"DecodeAuthorizationMessageCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"DecodeAuthorizationMessage\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DecodeAuthorizationMessageCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DecodeAuthorizationMessageCommand)(output, context);\n }\n}\nexports.DecodeAuthorizationMessageCommand = DecodeAuthorizationMessageCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetAccessKeyInfoCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetAccessKeyInfoCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetAccessKeyInfoCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"GetAccessKeyInfoCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"GetAccessKeyInfo\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetAccessKeyInfoCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetAccessKeyInfoCommand)(output, context);\n }\n}\nexports.GetAccessKeyInfoCommand = GetAccessKeyInfoCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetCallerIdentityCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetCallerIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetCallerIdentityCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"GetCallerIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"GetCallerIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetCallerIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetCallerIdentityCommand)(output, context);\n }\n}\nexports.GetCallerIdentityCommand = GetCallerIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetFederationTokenCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetFederationTokenCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetFederationTokenCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"GetFederationTokenCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: models_0_1.GetFederationTokenResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"GetFederationToken\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetFederationTokenCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetFederationTokenCommand)(output, context);\n }\n}\nexports.GetFederationTokenCommand = GetFederationTokenCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetSessionTokenCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetSessionTokenCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetSessionTokenCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"GetSessionTokenCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: models_0_1.GetSessionTokenResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"GetSessionToken\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetSessionTokenCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetSessionTokenCommand)(output, context);\n }\n}\nexports.GetSessionTokenCommand = GetSessionTokenCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./AssumeRoleCommand\"), exports);\ntslib_1.__exportStar(require(\"./AssumeRoleWithSAMLCommand\"), exports);\ntslib_1.__exportStar(require(\"./AssumeRoleWithWebIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./DecodeAuthorizationMessageCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetAccessKeyInfoCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetCallerIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetFederationTokenCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetSessionTokenCommand\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decorateDefaultCredentialProvider = exports.getDefaultRoleAssumerWithWebIdentity = exports.getDefaultRoleAssumer = void 0;\nconst defaultStsRoleAssumers_1 = require(\"./defaultStsRoleAssumers\");\nconst STSClient_1 = require(\"./STSClient\");\nconst getCustomizableStsClientCtor = (baseCtor, customizations) => {\n if (!customizations)\n return baseCtor;\n else\n return class CustomizableSTSClient extends baseCtor {\n constructor(config) {\n super(config);\n for (const customization of customizations) {\n this.middlewareStack.use(customization);\n }\n }\n };\n};\nconst getDefaultRoleAssumer = (stsOptions = {}, stsPlugins) => (0, defaultStsRoleAssumers_1.getDefaultRoleAssumer)(stsOptions, getCustomizableStsClientCtor(STSClient_1.STSClient, stsPlugins));\nexports.getDefaultRoleAssumer = getDefaultRoleAssumer;\nconst getDefaultRoleAssumerWithWebIdentity = (stsOptions = {}, stsPlugins) => (0, defaultStsRoleAssumers_1.getDefaultRoleAssumerWithWebIdentity)(stsOptions, getCustomizableStsClientCtor(STSClient_1.STSClient, stsPlugins));\nexports.getDefaultRoleAssumerWithWebIdentity = getDefaultRoleAssumerWithWebIdentity;\nconst decorateDefaultCredentialProvider = (provider) => (input) => provider({\n roleAssumer: (0, exports.getDefaultRoleAssumer)(input),\n roleAssumerWithWebIdentity: (0, exports.getDefaultRoleAssumerWithWebIdentity)(input),\n ...input,\n});\nexports.decorateDefaultCredentialProvider = decorateDefaultCredentialProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decorateDefaultCredentialProvider = exports.getDefaultRoleAssumerWithWebIdentity = exports.getDefaultRoleAssumer = void 0;\nconst AssumeRoleCommand_1 = require(\"./commands/AssumeRoleCommand\");\nconst AssumeRoleWithWebIdentityCommand_1 = require(\"./commands/AssumeRoleWithWebIdentityCommand\");\nconst ASSUME_ROLE_DEFAULT_REGION = \"us-east-1\";\nconst decorateDefaultRegion = (region) => {\n if (typeof region !== \"function\") {\n return region === undefined ? ASSUME_ROLE_DEFAULT_REGION : region;\n }\n return async () => {\n try {\n return await region();\n }\n catch (e) {\n return ASSUME_ROLE_DEFAULT_REGION;\n }\n };\n};\nconst getDefaultRoleAssumer = (stsOptions, stsClientCtor) => {\n let stsClient;\n let closureSourceCreds;\n return async (sourceCreds, params) => {\n closureSourceCreds = sourceCreds;\n if (!stsClient) {\n const { logger, region, requestHandler } = stsOptions;\n stsClient = new stsClientCtor({\n logger,\n credentialDefaultProvider: () => async () => closureSourceCreds,\n region: decorateDefaultRegion(region || stsOptions.region),\n ...(requestHandler ? { requestHandler } : {}),\n });\n }\n const { Credentials } = await stsClient.send(new AssumeRoleCommand_1.AssumeRoleCommand(params));\n if (!Credentials || !Credentials.AccessKeyId || !Credentials.SecretAccessKey) {\n throw new Error(`Invalid response from STS.assumeRole call with role ${params.RoleArn}`);\n }\n return {\n accessKeyId: Credentials.AccessKeyId,\n secretAccessKey: Credentials.SecretAccessKey,\n sessionToken: Credentials.SessionToken,\n expiration: Credentials.Expiration,\n };\n };\n};\nexports.getDefaultRoleAssumer = getDefaultRoleAssumer;\nconst getDefaultRoleAssumerWithWebIdentity = (stsOptions, stsClientCtor) => {\n let stsClient;\n return async (params) => {\n if (!stsClient) {\n const { logger, region, requestHandler } = stsOptions;\n stsClient = new stsClientCtor({\n logger,\n region: decorateDefaultRegion(region || stsOptions.region),\n ...(requestHandler ? { requestHandler } : {}),\n });\n }\n const { Credentials } = await stsClient.send(new AssumeRoleWithWebIdentityCommand_1.AssumeRoleWithWebIdentityCommand(params));\n if (!Credentials || !Credentials.AccessKeyId || !Credentials.SecretAccessKey) {\n throw new Error(`Invalid response from STS.assumeRoleWithWebIdentity call with role ${params.RoleArn}`);\n }\n return {\n accessKeyId: Credentials.AccessKeyId,\n secretAccessKey: Credentials.SecretAccessKey,\n sessionToken: Credentials.SessionToken,\n expiration: Credentials.Expiration,\n };\n };\n};\nexports.getDefaultRoleAssumerWithWebIdentity = getDefaultRoleAssumerWithWebIdentity;\nconst decorateDefaultCredentialProvider = (provider) => (input) => provider({\n roleAssumer: (0, exports.getDefaultRoleAssumer)(input, input.stsClientCtor),\n roleAssumerWithWebIdentity: (0, exports.getDefaultRoleAssumerWithWebIdentity)(input, input.stsClientCtor),\n ...input,\n});\nexports.decorateDefaultCredentialProvider = decorateDefaultCredentialProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveClientEndpointParameters = void 0;\nconst resolveClientEndpointParameters = (options) => {\n return {\n ...options,\n useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n useFipsEndpoint: options.useFipsEndpoint ?? false,\n useGlobalEndpoint: options.useGlobalEndpoint ?? false,\n defaultSigningName: \"sts\",\n };\n};\nexports.resolveClientEndpointParameters = resolveClientEndpointParameters;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultEndpointResolver = void 0;\nconst util_endpoints_1 = require(\"@aws-sdk/util-endpoints\");\nconst ruleset_1 = require(\"./ruleset\");\nconst defaultEndpointResolver = (endpointParams, context = {}) => {\n return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, {\n endpointParams: endpointParams,\n logger: context.logger,\n });\n};\nexports.defaultEndpointResolver = defaultEndpointResolver;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ruleSet = void 0;\nconst F = \"required\", G = \"type\", H = \"fn\", I = \"argv\", J = \"ref\";\nconst a = false, b = true, c = \"booleanEquals\", d = \"stringEquals\", e = \"sigv4\", f = \"sts\", g = \"us-east-1\", h = \"endpoint\", i = \"https://sts.{Region}.{PartitionResult#dnsSuffix}\", j = \"tree\", k = \"error\", l = \"getAttr\", m = { [F]: false, [G]: \"String\" }, n = { [F]: true, \"default\": false, [G]: \"Boolean\" }, o = { [J]: \"Endpoint\" }, p = { [H]: \"isSet\", [I]: [{ [J]: \"Region\" }] }, q = { [J]: \"Region\" }, r = { [H]: \"aws.partition\", [I]: [q], \"assign\": \"PartitionResult\" }, s = { [J]: \"UseFIPS\" }, t = { [J]: \"UseDualStack\" }, u = { \"url\": \"https://sts.amazonaws.com\", \"properties\": { \"authSchemes\": [{ \"name\": e, \"signingName\": f, \"signingRegion\": g }] }, \"headers\": {} }, v = {}, w = { \"conditions\": [{ [H]: d, [I]: [q, \"aws-global\"] }], [h]: u, [G]: h }, x = { [H]: c, [I]: [s, true] }, y = { [H]: c, [I]: [t, true] }, z = { [H]: l, [I]: [{ [J]: \"PartitionResult\" }, \"supportsFIPS\"] }, A = { [J]: \"PartitionResult\" }, B = { [H]: c, [I]: [true, { [H]: l, [I]: [A, \"supportsDualStack\"] }] }, C = [{ [H]: \"isSet\", [I]: [o] }], D = [x], E = [y];\nconst _data = { version: \"1.0\", parameters: { Region: m, UseDualStack: n, UseFIPS: n, Endpoint: m, UseGlobalEndpoint: n }, rules: [{ conditions: [{ [H]: c, [I]: [{ [J]: \"UseGlobalEndpoint\" }, b] }, { [H]: \"not\", [I]: C }, p, r, { [H]: c, [I]: [s, a] }, { [H]: c, [I]: [t, a] }], rules: [{ conditions: [{ [H]: d, [I]: [q, \"ap-northeast-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"ap-south-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"ap-southeast-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"ap-southeast-2\"] }], endpoint: u, [G]: h }, w, { conditions: [{ [H]: d, [I]: [q, \"ca-central-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"eu-central-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"eu-north-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"eu-west-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"eu-west-2\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"eu-west-3\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"sa-east-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, g] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"us-east-2\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"us-west-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"us-west-2\"] }], endpoint: u, [G]: h }, { endpoint: { url: i, properties: { authSchemes: [{ name: e, signingName: f, signingRegion: \"{Region}\" }] }, headers: v }, [G]: h }], [G]: j }, { conditions: C, rules: [{ conditions: D, error: \"Invalid Configuration: FIPS and custom endpoint are not supported\", [G]: k }, { conditions: E, error: \"Invalid Configuration: Dualstack and custom endpoint are not supported\", [G]: k }, { endpoint: { url: o, properties: v, headers: v }, [G]: h }], [G]: j }, { conditions: [p], rules: [{ conditions: [r], rules: [{ conditions: [x, y], rules: [{ conditions: [{ [H]: c, [I]: [b, z] }, B], rules: [{ endpoint: { url: \"https://sts-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: v, headers: v }, [G]: h }], [G]: j }, { error: \"FIPS and DualStack are enabled, but this partition does not support one or both\", [G]: k }], [G]: j }, { conditions: D, rules: [{ conditions: [{ [H]: c, [I]: [z, b] }], rules: [{ conditions: [{ [H]: d, [I]: [{ [H]: l, [I]: [A, \"name\"] }, \"aws-us-gov\"] }], endpoint: { url: \"https://sts.{Region}.amazonaws.com\", properties: v, headers: v }, [G]: h }, { endpoint: { url: \"https://sts-fips.{Region}.{PartitionResult#dnsSuffix}\", properties: v, headers: v }, [G]: h }], [G]: j }, { error: \"FIPS is enabled but this partition does not support FIPS\", [G]: k }], [G]: j }, { conditions: E, rules: [{ conditions: [B], rules: [{ endpoint: { url: \"https://sts.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: v, headers: v }, [G]: h }], [G]: j }, { error: \"DualStack is enabled but this partition does not support DualStack\", [G]: k }], [G]: j }, w, { endpoint: { url: i, properties: v, headers: v }, [G]: h }], [G]: j }], [G]: j }, { error: \"Invalid Configuration: Missing Region\", [G]: k }] };\nexports.ruleSet = _data;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.STSServiceException = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./STSClient\"), exports);\ntslib_1.__exportStar(require(\"./STS\"), exports);\ntslib_1.__exportStar(require(\"./commands\"), exports);\ntslib_1.__exportStar(require(\"./models\"), exports);\ntslib_1.__exportStar(require(\"./defaultRoleAssumers\"), exports);\nvar STSServiceException_1 = require(\"./models/STSServiceException\");\nObject.defineProperty(exports, \"STSServiceException\", { enumerable: true, get: function () { return STSServiceException_1.STSServiceException; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.STSServiceException = exports.__ServiceException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__ServiceException\", { enumerable: true, get: function () { return smithy_client_1.ServiceException; } });\nclass STSServiceException extends smithy_client_1.ServiceException {\n constructor(options) {\n super(options);\n Object.setPrototypeOf(this, STSServiceException.prototype);\n }\n}\nexports.STSServiceException = STSServiceException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./models_0\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetSessionTokenResponseFilterSensitiveLog = exports.GetFederationTokenResponseFilterSensitiveLog = exports.AssumeRoleWithWebIdentityResponseFilterSensitiveLog = exports.AssumeRoleWithWebIdentityRequestFilterSensitiveLog = exports.AssumeRoleWithSAMLResponseFilterSensitiveLog = exports.AssumeRoleWithSAMLRequestFilterSensitiveLog = exports.AssumeRoleResponseFilterSensitiveLog = exports.CredentialsFilterSensitiveLog = exports.InvalidAuthorizationMessageException = exports.IDPCommunicationErrorException = exports.InvalidIdentityTokenException = exports.IDPRejectedClaimException = exports.RegionDisabledException = exports.PackedPolicyTooLargeException = exports.MalformedPolicyDocumentException = exports.ExpiredTokenException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst STSServiceException_1 = require(\"./STSServiceException\");\nclass ExpiredTokenException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"ExpiredTokenException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ExpiredTokenException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ExpiredTokenException.prototype);\n }\n}\nexports.ExpiredTokenException = ExpiredTokenException;\nclass MalformedPolicyDocumentException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"MalformedPolicyDocumentException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"MalformedPolicyDocumentException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, MalformedPolicyDocumentException.prototype);\n }\n}\nexports.MalformedPolicyDocumentException = MalformedPolicyDocumentException;\nclass PackedPolicyTooLargeException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"PackedPolicyTooLargeException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"PackedPolicyTooLargeException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, PackedPolicyTooLargeException.prototype);\n }\n}\nexports.PackedPolicyTooLargeException = PackedPolicyTooLargeException;\nclass RegionDisabledException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"RegionDisabledException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"RegionDisabledException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, RegionDisabledException.prototype);\n }\n}\nexports.RegionDisabledException = RegionDisabledException;\nclass IDPRejectedClaimException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"IDPRejectedClaimException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"IDPRejectedClaimException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, IDPRejectedClaimException.prototype);\n }\n}\nexports.IDPRejectedClaimException = IDPRejectedClaimException;\nclass InvalidIdentityTokenException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"InvalidIdentityTokenException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidIdentityTokenException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidIdentityTokenException.prototype);\n }\n}\nexports.InvalidIdentityTokenException = InvalidIdentityTokenException;\nclass IDPCommunicationErrorException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"IDPCommunicationErrorException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"IDPCommunicationErrorException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, IDPCommunicationErrorException.prototype);\n }\n}\nexports.IDPCommunicationErrorException = IDPCommunicationErrorException;\nclass InvalidAuthorizationMessageException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"InvalidAuthorizationMessageException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidAuthorizationMessageException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidAuthorizationMessageException.prototype);\n }\n}\nexports.InvalidAuthorizationMessageException = InvalidAuthorizationMessageException;\nconst CredentialsFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.SecretAccessKey && { SecretAccessKey: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.CredentialsFilterSensitiveLog = CredentialsFilterSensitiveLog;\nconst AssumeRoleResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.Credentials && { Credentials: (0, exports.CredentialsFilterSensitiveLog)(obj.Credentials) }),\n});\nexports.AssumeRoleResponseFilterSensitiveLog = AssumeRoleResponseFilterSensitiveLog;\nconst AssumeRoleWithSAMLRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.SAMLAssertion && { SAMLAssertion: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.AssumeRoleWithSAMLRequestFilterSensitiveLog = AssumeRoleWithSAMLRequestFilterSensitiveLog;\nconst AssumeRoleWithSAMLResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.Credentials && { Credentials: (0, exports.CredentialsFilterSensitiveLog)(obj.Credentials) }),\n});\nexports.AssumeRoleWithSAMLResponseFilterSensitiveLog = AssumeRoleWithSAMLResponseFilterSensitiveLog;\nconst AssumeRoleWithWebIdentityRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.WebIdentityToken && { WebIdentityToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.AssumeRoleWithWebIdentityRequestFilterSensitiveLog = AssumeRoleWithWebIdentityRequestFilterSensitiveLog;\nconst AssumeRoleWithWebIdentityResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.Credentials && { Credentials: (0, exports.CredentialsFilterSensitiveLog)(obj.Credentials) }),\n});\nexports.AssumeRoleWithWebIdentityResponseFilterSensitiveLog = AssumeRoleWithWebIdentityResponseFilterSensitiveLog;\nconst GetFederationTokenResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.Credentials && { Credentials: (0, exports.CredentialsFilterSensitiveLog)(obj.Credentials) }),\n});\nexports.GetFederationTokenResponseFilterSensitiveLog = GetFederationTokenResponseFilterSensitiveLog;\nconst GetSessionTokenResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.Credentials && { Credentials: (0, exports.CredentialsFilterSensitiveLog)(obj.Credentials) }),\n});\nexports.GetSessionTokenResponseFilterSensitiveLog = GetSessionTokenResponseFilterSensitiveLog;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.de_GetSessionTokenCommand = exports.de_GetFederationTokenCommand = exports.de_GetCallerIdentityCommand = exports.de_GetAccessKeyInfoCommand = exports.de_DecodeAuthorizationMessageCommand = exports.de_AssumeRoleWithWebIdentityCommand = exports.de_AssumeRoleWithSAMLCommand = exports.de_AssumeRoleCommand = exports.se_GetSessionTokenCommand = exports.se_GetFederationTokenCommand = exports.se_GetCallerIdentityCommand = exports.se_GetAccessKeyInfoCommand = exports.se_DecodeAuthorizationMessageCommand = exports.se_AssumeRoleWithWebIdentityCommand = exports.se_AssumeRoleWithSAMLCommand = exports.se_AssumeRoleCommand = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst fast_xml_parser_1 = require(\"fast-xml-parser\");\nconst models_0_1 = require(\"../models/models_0\");\nconst STSServiceException_1 = require(\"../models/STSServiceException\");\nconst se_AssumeRoleCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_AssumeRoleRequest(input, context),\n Action: \"AssumeRole\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_AssumeRoleCommand = se_AssumeRoleCommand;\nconst se_AssumeRoleWithSAMLCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_AssumeRoleWithSAMLRequest(input, context),\n Action: \"AssumeRoleWithSAML\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_AssumeRoleWithSAMLCommand = se_AssumeRoleWithSAMLCommand;\nconst se_AssumeRoleWithWebIdentityCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_AssumeRoleWithWebIdentityRequest(input, context),\n Action: \"AssumeRoleWithWebIdentity\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_AssumeRoleWithWebIdentityCommand = se_AssumeRoleWithWebIdentityCommand;\nconst se_DecodeAuthorizationMessageCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DecodeAuthorizationMessageRequest(input, context),\n Action: \"DecodeAuthorizationMessage\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DecodeAuthorizationMessageCommand = se_DecodeAuthorizationMessageCommand;\nconst se_GetAccessKeyInfoCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetAccessKeyInfoRequest(input, context),\n Action: \"GetAccessKeyInfo\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetAccessKeyInfoCommand = se_GetAccessKeyInfoCommand;\nconst se_GetCallerIdentityCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetCallerIdentityRequest(input, context),\n Action: \"GetCallerIdentity\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetCallerIdentityCommand = se_GetCallerIdentityCommand;\nconst se_GetFederationTokenCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetFederationTokenRequest(input, context),\n Action: \"GetFederationToken\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetFederationTokenCommand = se_GetFederationTokenCommand;\nconst se_GetSessionTokenCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetSessionTokenRequest(input, context),\n Action: \"GetSessionToken\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetSessionTokenCommand = se_GetSessionTokenCommand;\nconst de_AssumeRoleCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_AssumeRoleCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_AssumeRoleResponse(data.AssumeRoleResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_AssumeRoleCommand = de_AssumeRoleCommand;\nconst de_AssumeRoleCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExpiredTokenException\":\n case \"com.amazonaws.sts#ExpiredTokenException\":\n throw await de_ExpiredTokenExceptionRes(parsedOutput, context);\n case \"MalformedPolicyDocument\":\n case \"com.amazonaws.sts#MalformedPolicyDocumentException\":\n throw await de_MalformedPolicyDocumentExceptionRes(parsedOutput, context);\n case \"PackedPolicyTooLarge\":\n case \"com.amazonaws.sts#PackedPolicyTooLargeException\":\n throw await de_PackedPolicyTooLargeExceptionRes(parsedOutput, context);\n case \"RegionDisabledException\":\n case \"com.amazonaws.sts#RegionDisabledException\":\n throw await de_RegionDisabledExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_AssumeRoleWithSAMLCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_AssumeRoleWithSAMLCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_AssumeRoleWithSAMLResponse(data.AssumeRoleWithSAMLResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_AssumeRoleWithSAMLCommand = de_AssumeRoleWithSAMLCommand;\nconst de_AssumeRoleWithSAMLCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExpiredTokenException\":\n case \"com.amazonaws.sts#ExpiredTokenException\":\n throw await de_ExpiredTokenExceptionRes(parsedOutput, context);\n case \"IDPRejectedClaim\":\n case \"com.amazonaws.sts#IDPRejectedClaimException\":\n throw await de_IDPRejectedClaimExceptionRes(parsedOutput, context);\n case \"InvalidIdentityToken\":\n case \"com.amazonaws.sts#InvalidIdentityTokenException\":\n throw await de_InvalidIdentityTokenExceptionRes(parsedOutput, context);\n case \"MalformedPolicyDocument\":\n case \"com.amazonaws.sts#MalformedPolicyDocumentException\":\n throw await de_MalformedPolicyDocumentExceptionRes(parsedOutput, context);\n case \"PackedPolicyTooLarge\":\n case \"com.amazonaws.sts#PackedPolicyTooLargeException\":\n throw await de_PackedPolicyTooLargeExceptionRes(parsedOutput, context);\n case \"RegionDisabledException\":\n case \"com.amazonaws.sts#RegionDisabledException\":\n throw await de_RegionDisabledExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_AssumeRoleWithWebIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_AssumeRoleWithWebIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_AssumeRoleWithWebIdentityResponse(data.AssumeRoleWithWebIdentityResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_AssumeRoleWithWebIdentityCommand = de_AssumeRoleWithWebIdentityCommand;\nconst de_AssumeRoleWithWebIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExpiredTokenException\":\n case \"com.amazonaws.sts#ExpiredTokenException\":\n throw await de_ExpiredTokenExceptionRes(parsedOutput, context);\n case \"IDPCommunicationError\":\n case \"com.amazonaws.sts#IDPCommunicationErrorException\":\n throw await de_IDPCommunicationErrorExceptionRes(parsedOutput, context);\n case \"IDPRejectedClaim\":\n case \"com.amazonaws.sts#IDPRejectedClaimException\":\n throw await de_IDPRejectedClaimExceptionRes(parsedOutput, context);\n case \"InvalidIdentityToken\":\n case \"com.amazonaws.sts#InvalidIdentityTokenException\":\n throw await de_InvalidIdentityTokenExceptionRes(parsedOutput, context);\n case \"MalformedPolicyDocument\":\n case \"com.amazonaws.sts#MalformedPolicyDocumentException\":\n throw await de_MalformedPolicyDocumentExceptionRes(parsedOutput, context);\n case \"PackedPolicyTooLarge\":\n case \"com.amazonaws.sts#PackedPolicyTooLargeException\":\n throw await de_PackedPolicyTooLargeExceptionRes(parsedOutput, context);\n case \"RegionDisabledException\":\n case \"com.amazonaws.sts#RegionDisabledException\":\n throw await de_RegionDisabledExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DecodeAuthorizationMessageCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DecodeAuthorizationMessageCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DecodeAuthorizationMessageResponse(data.DecodeAuthorizationMessageResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DecodeAuthorizationMessageCommand = de_DecodeAuthorizationMessageCommand;\nconst de_DecodeAuthorizationMessageCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidAuthorizationMessageException\":\n case \"com.amazonaws.sts#InvalidAuthorizationMessageException\":\n throw await de_InvalidAuthorizationMessageExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_GetAccessKeyInfoCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetAccessKeyInfoCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetAccessKeyInfoResponse(data.GetAccessKeyInfoResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetAccessKeyInfoCommand = de_GetAccessKeyInfoCommand;\nconst de_GetAccessKeyInfoCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_GetCallerIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetCallerIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetCallerIdentityResponse(data.GetCallerIdentityResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetCallerIdentityCommand = de_GetCallerIdentityCommand;\nconst de_GetCallerIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_GetFederationTokenCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetFederationTokenCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetFederationTokenResponse(data.GetFederationTokenResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetFederationTokenCommand = de_GetFederationTokenCommand;\nconst de_GetFederationTokenCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"MalformedPolicyDocument\":\n case \"com.amazonaws.sts#MalformedPolicyDocumentException\":\n throw await de_MalformedPolicyDocumentExceptionRes(parsedOutput, context);\n case \"PackedPolicyTooLarge\":\n case \"com.amazonaws.sts#PackedPolicyTooLargeException\":\n throw await de_PackedPolicyTooLargeExceptionRes(parsedOutput, context);\n case \"RegionDisabledException\":\n case \"com.amazonaws.sts#RegionDisabledException\":\n throw await de_RegionDisabledExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_GetSessionTokenCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetSessionTokenCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetSessionTokenResponse(data.GetSessionTokenResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetSessionTokenCommand = de_GetSessionTokenCommand;\nconst de_GetSessionTokenCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"RegionDisabledException\":\n case \"com.amazonaws.sts#RegionDisabledException\":\n throw await de_RegionDisabledExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ExpiredTokenExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_ExpiredTokenException(body.Error, context);\n const exception = new models_0_1.ExpiredTokenException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_IDPCommunicationErrorExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_IDPCommunicationErrorException(body.Error, context);\n const exception = new models_0_1.IDPCommunicationErrorException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_IDPRejectedClaimExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_IDPRejectedClaimException(body.Error, context);\n const exception = new models_0_1.IDPRejectedClaimException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidAuthorizationMessageExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InvalidAuthorizationMessageException(body.Error, context);\n const exception = new models_0_1.InvalidAuthorizationMessageException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidIdentityTokenExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InvalidIdentityTokenException(body.Error, context);\n const exception = new models_0_1.InvalidIdentityTokenException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_MalformedPolicyDocumentExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_MalformedPolicyDocumentException(body.Error, context);\n const exception = new models_0_1.MalformedPolicyDocumentException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_PackedPolicyTooLargeExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_PackedPolicyTooLargeException(body.Error, context);\n const exception = new models_0_1.PackedPolicyTooLargeException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_RegionDisabledExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_RegionDisabledException(body.Error, context);\n const exception = new models_0_1.RegionDisabledException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst se_AssumeRoleRequest = (input, context) => {\n const entries = {};\n if (input.RoleArn != null) {\n entries[\"RoleArn\"] = input.RoleArn;\n }\n if (input.RoleSessionName != null) {\n entries[\"RoleSessionName\"] = input.RoleSessionName;\n }\n if (input.PolicyArns != null) {\n const memberEntries = se_policyDescriptorListType(input.PolicyArns, context);\n if (input.PolicyArns?.length === 0) {\n entries.PolicyArns = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `PolicyArns.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Policy != null) {\n entries[\"Policy\"] = input.Policy;\n }\n if (input.DurationSeconds != null) {\n entries[\"DurationSeconds\"] = input.DurationSeconds;\n }\n if (input.Tags != null) {\n const memberEntries = se_tagListType(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.TransitiveTagKeys != null) {\n const memberEntries = se_tagKeyListType(input.TransitiveTagKeys, context);\n if (input.TransitiveTagKeys?.length === 0) {\n entries.TransitiveTagKeys = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `TransitiveTagKeys.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ExternalId != null) {\n entries[\"ExternalId\"] = input.ExternalId;\n }\n if (input.SerialNumber != null) {\n entries[\"SerialNumber\"] = input.SerialNumber;\n }\n if (input.TokenCode != null) {\n entries[\"TokenCode\"] = input.TokenCode;\n }\n if (input.SourceIdentity != null) {\n entries[\"SourceIdentity\"] = input.SourceIdentity;\n }\n if (input.ProvidedContexts != null) {\n const memberEntries = se_ProvidedContextsListType(input.ProvidedContexts, context);\n if (input.ProvidedContexts?.length === 0) {\n entries.ProvidedContexts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ProvidedContexts.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_AssumeRoleWithSAMLRequest = (input, context) => {\n const entries = {};\n if (input.RoleArn != null) {\n entries[\"RoleArn\"] = input.RoleArn;\n }\n if (input.PrincipalArn != null) {\n entries[\"PrincipalArn\"] = input.PrincipalArn;\n }\n if (input.SAMLAssertion != null) {\n entries[\"SAMLAssertion\"] = input.SAMLAssertion;\n }\n if (input.PolicyArns != null) {\n const memberEntries = se_policyDescriptorListType(input.PolicyArns, context);\n if (input.PolicyArns?.length === 0) {\n entries.PolicyArns = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `PolicyArns.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Policy != null) {\n entries[\"Policy\"] = input.Policy;\n }\n if (input.DurationSeconds != null) {\n entries[\"DurationSeconds\"] = input.DurationSeconds;\n }\n return entries;\n};\nconst se_AssumeRoleWithWebIdentityRequest = (input, context) => {\n const entries = {};\n if (input.RoleArn != null) {\n entries[\"RoleArn\"] = input.RoleArn;\n }\n if (input.RoleSessionName != null) {\n entries[\"RoleSessionName\"] = input.RoleSessionName;\n }\n if (input.WebIdentityToken != null) {\n entries[\"WebIdentityToken\"] = input.WebIdentityToken;\n }\n if (input.ProviderId != null) {\n entries[\"ProviderId\"] = input.ProviderId;\n }\n if (input.PolicyArns != null) {\n const memberEntries = se_policyDescriptorListType(input.PolicyArns, context);\n if (input.PolicyArns?.length === 0) {\n entries.PolicyArns = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `PolicyArns.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Policy != null) {\n entries[\"Policy\"] = input.Policy;\n }\n if (input.DurationSeconds != null) {\n entries[\"DurationSeconds\"] = input.DurationSeconds;\n }\n return entries;\n};\nconst se_DecodeAuthorizationMessageRequest = (input, context) => {\n const entries = {};\n if (input.EncodedMessage != null) {\n entries[\"EncodedMessage\"] = input.EncodedMessage;\n }\n return entries;\n};\nconst se_GetAccessKeyInfoRequest = (input, context) => {\n const entries = {};\n if (input.AccessKeyId != null) {\n entries[\"AccessKeyId\"] = input.AccessKeyId;\n }\n return entries;\n};\nconst se_GetCallerIdentityRequest = (input, context) => {\n const entries = {};\n return entries;\n};\nconst se_GetFederationTokenRequest = (input, context) => {\n const entries = {};\n if (input.Name != null) {\n entries[\"Name\"] = input.Name;\n }\n if (input.Policy != null) {\n entries[\"Policy\"] = input.Policy;\n }\n if (input.PolicyArns != null) {\n const memberEntries = se_policyDescriptorListType(input.PolicyArns, context);\n if (input.PolicyArns?.length === 0) {\n entries.PolicyArns = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `PolicyArns.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DurationSeconds != null) {\n entries[\"DurationSeconds\"] = input.DurationSeconds;\n }\n if (input.Tags != null) {\n const memberEntries = se_tagListType(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_GetSessionTokenRequest = (input, context) => {\n const entries = {};\n if (input.DurationSeconds != null) {\n entries[\"DurationSeconds\"] = input.DurationSeconds;\n }\n if (input.SerialNumber != null) {\n entries[\"SerialNumber\"] = input.SerialNumber;\n }\n if (input.TokenCode != null) {\n entries[\"TokenCode\"] = input.TokenCode;\n }\n return entries;\n};\nconst se_policyDescriptorListType = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_PolicyDescriptorType(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_PolicyDescriptorType = (input, context) => {\n const entries = {};\n if (input.arn != null) {\n entries[\"arn\"] = input.arn;\n }\n return entries;\n};\nconst se_ProvidedContext = (input, context) => {\n const entries = {};\n if (input.ProviderArn != null) {\n entries[\"ProviderArn\"] = input.ProviderArn;\n }\n if (input.ContextAssertion != null) {\n entries[\"ContextAssertion\"] = input.ContextAssertion;\n }\n return entries;\n};\nconst se_ProvidedContextsListType = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_ProvidedContext(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_Tag = (input, context) => {\n const entries = {};\n if (input.Key != null) {\n entries[\"Key\"] = input.Key;\n }\n if (input.Value != null) {\n entries[\"Value\"] = input.Value;\n }\n return entries;\n};\nconst se_tagKeyListType = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_tagListType = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_Tag(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst de_AssumedRoleUser = (output, context) => {\n const contents = {};\n if (output[\"AssumedRoleId\"] !== undefined) {\n contents.AssumedRoleId = (0, smithy_client_1.expectString)(output[\"AssumedRoleId\"]);\n }\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n return contents;\n};\nconst de_AssumeRoleResponse = (output, context) => {\n const contents = {};\n if (output[\"Credentials\"] !== undefined) {\n contents.Credentials = de_Credentials(output[\"Credentials\"], context);\n }\n if (output[\"AssumedRoleUser\"] !== undefined) {\n contents.AssumedRoleUser = de_AssumedRoleUser(output[\"AssumedRoleUser\"], context);\n }\n if (output[\"PackedPolicySize\"] !== undefined) {\n contents.PackedPolicySize = (0, smithy_client_1.strictParseInt32)(output[\"PackedPolicySize\"]);\n }\n if (output[\"SourceIdentity\"] !== undefined) {\n contents.SourceIdentity = (0, smithy_client_1.expectString)(output[\"SourceIdentity\"]);\n }\n return contents;\n};\nconst de_AssumeRoleWithSAMLResponse = (output, context) => {\n const contents = {};\n if (output[\"Credentials\"] !== undefined) {\n contents.Credentials = de_Credentials(output[\"Credentials\"], context);\n }\n if (output[\"AssumedRoleUser\"] !== undefined) {\n contents.AssumedRoleUser = de_AssumedRoleUser(output[\"AssumedRoleUser\"], context);\n }\n if (output[\"PackedPolicySize\"] !== undefined) {\n contents.PackedPolicySize = (0, smithy_client_1.strictParseInt32)(output[\"PackedPolicySize\"]);\n }\n if (output[\"Subject\"] !== undefined) {\n contents.Subject = (0, smithy_client_1.expectString)(output[\"Subject\"]);\n }\n if (output[\"SubjectType\"] !== undefined) {\n contents.SubjectType = (0, smithy_client_1.expectString)(output[\"SubjectType\"]);\n }\n if (output[\"Issuer\"] !== undefined) {\n contents.Issuer = (0, smithy_client_1.expectString)(output[\"Issuer\"]);\n }\n if (output[\"Audience\"] !== undefined) {\n contents.Audience = (0, smithy_client_1.expectString)(output[\"Audience\"]);\n }\n if (output[\"NameQualifier\"] !== undefined) {\n contents.NameQualifier = (0, smithy_client_1.expectString)(output[\"NameQualifier\"]);\n }\n if (output[\"SourceIdentity\"] !== undefined) {\n contents.SourceIdentity = (0, smithy_client_1.expectString)(output[\"SourceIdentity\"]);\n }\n return contents;\n};\nconst de_AssumeRoleWithWebIdentityResponse = (output, context) => {\n const contents = {};\n if (output[\"Credentials\"] !== undefined) {\n contents.Credentials = de_Credentials(output[\"Credentials\"], context);\n }\n if (output[\"SubjectFromWebIdentityToken\"] !== undefined) {\n contents.SubjectFromWebIdentityToken = (0, smithy_client_1.expectString)(output[\"SubjectFromWebIdentityToken\"]);\n }\n if (output[\"AssumedRoleUser\"] !== undefined) {\n contents.AssumedRoleUser = de_AssumedRoleUser(output[\"AssumedRoleUser\"], context);\n }\n if (output[\"PackedPolicySize\"] !== undefined) {\n contents.PackedPolicySize = (0, smithy_client_1.strictParseInt32)(output[\"PackedPolicySize\"]);\n }\n if (output[\"Provider\"] !== undefined) {\n contents.Provider = (0, smithy_client_1.expectString)(output[\"Provider\"]);\n }\n if (output[\"Audience\"] !== undefined) {\n contents.Audience = (0, smithy_client_1.expectString)(output[\"Audience\"]);\n }\n if (output[\"SourceIdentity\"] !== undefined) {\n contents.SourceIdentity = (0, smithy_client_1.expectString)(output[\"SourceIdentity\"]);\n }\n return contents;\n};\nconst de_Credentials = (output, context) => {\n const contents = {};\n if (output[\"AccessKeyId\"] !== undefined) {\n contents.AccessKeyId = (0, smithy_client_1.expectString)(output[\"AccessKeyId\"]);\n }\n if (output[\"SecretAccessKey\"] !== undefined) {\n contents.SecretAccessKey = (0, smithy_client_1.expectString)(output[\"SecretAccessKey\"]);\n }\n if (output[\"SessionToken\"] !== undefined) {\n contents.SessionToken = (0, smithy_client_1.expectString)(output[\"SessionToken\"]);\n }\n if (output[\"Expiration\"] !== undefined) {\n contents.Expiration = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Expiration\"]));\n }\n return contents;\n};\nconst de_DecodeAuthorizationMessageResponse = (output, context) => {\n const contents = {};\n if (output[\"DecodedMessage\"] !== undefined) {\n contents.DecodedMessage = (0, smithy_client_1.expectString)(output[\"DecodedMessage\"]);\n }\n return contents;\n};\nconst de_ExpiredTokenException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_FederatedUser = (output, context) => {\n const contents = {};\n if (output[\"FederatedUserId\"] !== undefined) {\n contents.FederatedUserId = (0, smithy_client_1.expectString)(output[\"FederatedUserId\"]);\n }\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n return contents;\n};\nconst de_GetAccessKeyInfoResponse = (output, context) => {\n const contents = {};\n if (output[\"Account\"] !== undefined) {\n contents.Account = (0, smithy_client_1.expectString)(output[\"Account\"]);\n }\n return contents;\n};\nconst de_GetCallerIdentityResponse = (output, context) => {\n const contents = {};\n if (output[\"UserId\"] !== undefined) {\n contents.UserId = (0, smithy_client_1.expectString)(output[\"UserId\"]);\n }\n if (output[\"Account\"] !== undefined) {\n contents.Account = (0, smithy_client_1.expectString)(output[\"Account\"]);\n }\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n return contents;\n};\nconst de_GetFederationTokenResponse = (output, context) => {\n const contents = {};\n if (output[\"Credentials\"] !== undefined) {\n contents.Credentials = de_Credentials(output[\"Credentials\"], context);\n }\n if (output[\"FederatedUser\"] !== undefined) {\n contents.FederatedUser = de_FederatedUser(output[\"FederatedUser\"], context);\n }\n if (output[\"PackedPolicySize\"] !== undefined) {\n contents.PackedPolicySize = (0, smithy_client_1.strictParseInt32)(output[\"PackedPolicySize\"]);\n }\n return contents;\n};\nconst de_GetSessionTokenResponse = (output, context) => {\n const contents = {};\n if (output[\"Credentials\"] !== undefined) {\n contents.Credentials = de_Credentials(output[\"Credentials\"], context);\n }\n return contents;\n};\nconst de_IDPCommunicationErrorException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_IDPRejectedClaimException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_InvalidAuthorizationMessageException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_InvalidIdentityTokenException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_MalformedPolicyDocumentException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_PackedPolicyTooLargeException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_RegionDisabledException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst deserializeMetadata = (output) => ({\n httpStatusCode: output.statusCode,\n requestId: output.headers[\"x-amzn-requestid\"] ?? output.headers[\"x-amzn-request-id\"] ?? output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n});\nconst collectBodyString = (streamBody, context) => (0, smithy_client_1.collectBody)(streamBody, context).then((body) => context.utf8Encoder(body));\nconst throwDefaultError = (0, smithy_client_1.withBaseException)(STSServiceException_1.STSServiceException);\nconst buildHttpRpcRequest = async (context, headers, path, resolvedHostname, body) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const contents = {\n protocol,\n hostname,\n port,\n method: \"POST\",\n path: basePath.endsWith(\"/\") ? basePath.slice(0, -1) + path : basePath + path,\n headers,\n };\n if (resolvedHostname !== undefined) {\n contents.hostname = resolvedHostname;\n }\n if (body !== undefined) {\n contents.body = body;\n }\n return new protocol_http_1.HttpRequest(contents);\n};\nconst SHARED_HEADERS = {\n \"content-type\": \"application/x-www-form-urlencoded\",\n};\nconst parseBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n if (encoded.length) {\n const parser = new fast_xml_parser_1.XMLParser({\n attributeNamePrefix: \"\",\n htmlEntities: true,\n ignoreAttributes: false,\n ignoreDeclaration: true,\n parseTagValue: false,\n trimValues: false,\n tagValueProcessor: (_, val) => (val.trim() === \"\" && val.includes(\"\\n\") ? \"\" : undefined),\n });\n parser.addEntity(\"#xD\", \"\\r\");\n parser.addEntity(\"#10\", \"\\n\");\n const parsedObj = parser.parse(encoded);\n const textNodeName = \"#text\";\n const key = Object.keys(parsedObj)[0];\n const parsedObjToReturn = parsedObj[key];\n if (parsedObjToReturn[textNodeName]) {\n parsedObjToReturn[key] = parsedObjToReturn[textNodeName];\n delete parsedObjToReturn[textNodeName];\n }\n return (0, smithy_client_1.getValueFromTextNode)(parsedObjToReturn);\n }\n return {};\n});\nconst parseErrorBody = async (errorBody, context) => {\n const value = await parseBody(errorBody, context);\n if (value.Error) {\n value.Error.message = value.Error.message ?? value.Error.Message;\n }\n return value;\n};\nconst buildFormUrlencodedString = (formEntries) => Object.entries(formEntries)\n .map(([key, value]) => (0, smithy_client_1.extendedEncodeURIComponent)(key) + \"=\" + (0, smithy_client_1.extendedEncodeURIComponent)(value))\n .join(\"&\");\nconst loadQueryErrorCode = (output, data) => {\n if (data.Error?.Code !== undefined) {\n return data.Error.Code;\n }\n if (output.statusCode == 404) {\n return \"NotFound\";\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst tslib_1 = require(\"tslib\");\nconst package_json_1 = tslib_1.__importDefault(require(\"../package.json\"));\nconst defaultStsRoleAssumers_1 = require(\"./defaultStsRoleAssumers\");\nconst core_1 = require(\"@aws-sdk/core\");\nconst credential_provider_node_1 = require(\"@aws-sdk/credential-provider-node\");\nconst util_user_agent_node_1 = require(\"@aws-sdk/util-user-agent-node\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst hash_node_1 = require(\"@smithy/hash-node\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_body_length_node_1 = require(\"@smithy/util-body-length-node\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst runtimeConfig_shared_1 = require(\"./runtimeConfig.shared\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst util_defaults_mode_node_1 = require(\"@smithy/util-defaults-mode-node\");\nconst smithy_client_2 = require(\"@smithy/smithy-client\");\nconst getRuntimeConfig = (config) => {\n (0, smithy_client_2.emitWarningIfUnsupportedVersion)(process.version);\n const defaultsMode = (0, util_defaults_mode_node_1.resolveDefaultsModeConfig)(config);\n const defaultConfigProvider = () => defaultsMode().then(smithy_client_1.loadConfigsForDefaultMode);\n const clientSharedValues = (0, runtimeConfig_shared_1.getRuntimeConfig)(config);\n (0, core_1.emitWarningIfUnsupportedVersion)(process.version);\n return {\n ...clientSharedValues,\n ...config,\n runtime: \"node\",\n defaultsMode,\n bodyLengthChecker: config?.bodyLengthChecker ?? util_body_length_node_1.calculateBodyLength,\n credentialDefaultProvider: config?.credentialDefaultProvider ?? (0, defaultStsRoleAssumers_1.decorateDefaultCredentialProvider)(credential_provider_node_1.defaultProvider),\n defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n (0, util_user_agent_node_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_json_1.default.version }),\n maxAttempts: config?.maxAttempts ?? (0, node_config_provider_1.loadConfig)(middleware_retry_1.NODE_MAX_ATTEMPT_CONFIG_OPTIONS),\n region: config?.region ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS, config_resolver_1.NODE_REGION_CONFIG_FILE_OPTIONS),\n requestHandler: config?.requestHandler ?? new node_http_handler_1.NodeHttpHandler(defaultConfigProvider),\n retryMode: config?.retryMode ??\n (0, node_config_provider_1.loadConfig)({\n ...middleware_retry_1.NODE_RETRY_MODE_CONFIG_OPTIONS,\n default: async () => (await defaultConfigProvider()).retryMode || util_retry_1.DEFAULT_RETRY_MODE,\n }),\n sha256: config?.sha256 ?? hash_node_1.Hash.bind(null, \"sha256\"),\n streamCollector: config?.streamCollector ?? node_http_handler_1.streamCollector,\n useDualstackEndpoint: config?.useDualstackEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS),\n useFipsEndpoint: config?.useFipsEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS),\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst endpointResolver_1 = require(\"./endpoint/endpointResolver\");\nconst getRuntimeConfig = (config) => {\n return {\n apiVersion: \"2011-06-15\",\n base64Decoder: config?.base64Decoder ?? util_base64_1.fromBase64,\n base64Encoder: config?.base64Encoder ?? util_base64_1.toBase64,\n disableHostPrefix: config?.disableHostPrefix ?? false,\n endpointProvider: config?.endpointProvider ?? endpointResolver_1.defaultEndpointResolver,\n extensions: config?.extensions ?? [],\n logger: config?.logger ?? new smithy_client_1.NoOpLogger(),\n serviceId: config?.serviceId ?? \"STS\",\n urlParser: config?.urlParser ?? url_parser_1.parseUrl,\n utf8Decoder: config?.utf8Decoder ?? util_utf8_1.fromUtf8,\n utf8Encoder: config?.utf8Encoder ?? util_utf8_1.toUtf8,\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRuntimeExtensions = void 0;\nconst region_config_resolver_1 = require(\"@aws-sdk/region-config-resolver\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst asPartial = (t) => t;\nconst resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n const extensionConfiguration = {\n ...asPartial((0, region_config_resolver_1.getAwsRegionExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, smithy_client_1.getDefaultExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, protocol_http_1.getHttpHandlerExtensionConfiguration)(runtimeConfig)),\n };\n extensions.forEach((extension) => extension.configure(extensionConfiguration));\n return {\n ...runtimeConfig,\n ...(0, region_config_resolver_1.resolveAwsRegionExtensionConfiguration)(extensionConfiguration),\n ...(0, smithy_client_1.resolveDefaultRuntimeConfig)(extensionConfiguration),\n ...(0, protocol_http_1.resolveHttpHandlerRuntimeConfig)(extensionConfiguration),\n };\n};\nexports.resolveRuntimeExtensions = resolveRuntimeExtensions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.emitWarningIfUnsupportedVersion = void 0;\nlet warningEmitted = false;\nconst emitWarningIfUnsupportedVersion = (version) => {\n if (version && !warningEmitted && parseInt(version.substring(1, version.indexOf(\".\"))) < 16) {\n warningEmitted = true;\n process.emitWarning(`NodeDeprecationWarning: The AWS SDK for JavaScript (v3) will\nno longer support Node.js 14.x on May 1, 2024.\n\nTo continue receiving updates to AWS services, bug fixes, and security\nupdates please upgrade to an active Node.js LTS version.\n\nMore information can be found at: https://a.co/dzr2AJd`);\n }\n};\nexports.emitWarningIfUnsupportedVersion = emitWarningIfUnsupportedVersion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./emitWarningIfUnsupportedVersion\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./client/index\"), exports);\ntslib_1.__exportStar(require(\"./protocols/index\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./json/awsExpectUnion\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.awsExpectUnion = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst awsExpectUnion = (value) => {\n if (value == null) {\n return undefined;\n }\n if (typeof value === \"object\" && \"__type\" in value) {\n delete value.__type;\n }\n return (0, smithy_client_1.expectUnion)(value);\n};\nexports.awsExpectUnion = awsExpectUnion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InMemoryStorage = void 0;\nclass InMemoryStorage {\n constructor(store = {}) {\n this.store = store;\n }\n getItem(key) {\n if (key in this.store) {\n return this.store[key];\n }\n return null;\n }\n removeItem(key) {\n delete this.store[key];\n }\n setItem(key, value) {\n this.store[key] = value;\n }\n}\nexports.InMemoryStorage = InMemoryStorage;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IndexedDbStorage = void 0;\nconst STORE_NAME = \"IdentityIds\";\nclass IndexedDbStorage {\n constructor(dbName = \"aws:cognito-identity-ids\") {\n this.dbName = dbName;\n }\n getItem(key) {\n return this.withObjectStore(\"readonly\", (store) => {\n const req = store.get(key);\n return new Promise((resolve) => {\n req.onerror = () => resolve(null);\n req.onsuccess = () => resolve(req.result ? req.result.value : null);\n });\n }).catch(() => null);\n }\n removeItem(key) {\n return this.withObjectStore(\"readwrite\", (store) => {\n const req = store.delete(key);\n return new Promise((resolve, reject) => {\n req.onerror = () => reject(req.error);\n req.onsuccess = () => resolve();\n });\n });\n }\n setItem(id, value) {\n return this.withObjectStore(\"readwrite\", (store) => {\n const req = store.put({ id, value });\n return new Promise((resolve, reject) => {\n req.onerror = () => reject(req.error);\n req.onsuccess = () => resolve();\n });\n });\n }\n getDb() {\n const openDbRequest = self.indexedDB.open(this.dbName, 1);\n return new Promise((resolve, reject) => {\n openDbRequest.onsuccess = () => {\n resolve(openDbRequest.result);\n };\n openDbRequest.onerror = () => {\n reject(openDbRequest.error);\n };\n openDbRequest.onblocked = () => {\n reject(new Error(\"Unable to access DB\"));\n };\n openDbRequest.onupgradeneeded = () => {\n const db = openDbRequest.result;\n db.onerror = () => {\n reject(new Error(\"Failed to create object store\"));\n };\n db.createObjectStore(STORE_NAME, { keyPath: \"id\" });\n };\n });\n }\n withObjectStore(mode, action) {\n return this.getDb().then((db) => {\n const tx = db.transaction(STORE_NAME, mode);\n tx.oncomplete = () => db.close();\n return new Promise((resolve, reject) => {\n tx.onerror = () => reject(tx.error);\n resolve(action(tx.objectStore(STORE_NAME)));\n }).catch((err) => {\n db.close();\n throw err;\n });\n });\n }\n}\nexports.IndexedDbStorage = IndexedDbStorage;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromCognitoIdentity = void 0;\nconst client_cognito_identity_1 = require(\"@aws-sdk/client-cognito-identity\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst resolveLogins_1 = require(\"./resolveLogins\");\nfunction fromCognitoIdentity(parameters) {\n return async () => {\n const { Credentials: { AccessKeyId = throwOnMissingAccessKeyId(), Expiration, SecretKey = throwOnMissingSecretKey(), SessionToken, } = throwOnMissingCredentials(), } = await parameters.client.send(new client_cognito_identity_1.GetCredentialsForIdentityCommand({\n CustomRoleArn: parameters.customRoleArn,\n IdentityId: parameters.identityId,\n Logins: parameters.logins ? await (0, resolveLogins_1.resolveLogins)(parameters.logins) : undefined,\n }));\n return {\n identityId: parameters.identityId,\n accessKeyId: AccessKeyId,\n secretAccessKey: SecretKey,\n sessionToken: SessionToken,\n expiration: Expiration,\n };\n };\n}\nexports.fromCognitoIdentity = fromCognitoIdentity;\nfunction throwOnMissingAccessKeyId() {\n throw new property_provider_1.CredentialsProviderError(\"Response from Amazon Cognito contained no access key ID\");\n}\nfunction throwOnMissingCredentials() {\n throw new property_provider_1.CredentialsProviderError(\"Response from Amazon Cognito contained no credentials\");\n}\nfunction throwOnMissingSecretKey() {\n throw new property_provider_1.CredentialsProviderError(\"Response from Amazon Cognito contained no secret key\");\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromCognitoIdentityPool = void 0;\nconst client_cognito_identity_1 = require(\"@aws-sdk/client-cognito-identity\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromCognitoIdentity_1 = require(\"./fromCognitoIdentity\");\nconst localStorage_1 = require(\"./localStorage\");\nconst resolveLogins_1 = require(\"./resolveLogins\");\nfunction fromCognitoIdentityPool({ accountId, cache = (0, localStorage_1.localStorage)(), client, customRoleArn, identityPoolId, logins, userIdentifier = !logins || Object.keys(logins).length === 0 ? \"ANONYMOUS\" : undefined, }) {\n const cacheKey = userIdentifier ? `aws:cognito-identity-credentials:${identityPoolId}:${userIdentifier}` : undefined;\n let provider = async () => {\n let identityId = cacheKey && (await cache.getItem(cacheKey));\n if (!identityId) {\n const { IdentityId = throwOnMissingId() } = await client.send(new client_cognito_identity_1.GetIdCommand({\n AccountId: accountId,\n IdentityPoolId: identityPoolId,\n Logins: logins ? await (0, resolveLogins_1.resolveLogins)(logins) : undefined,\n }));\n identityId = IdentityId;\n if (cacheKey) {\n Promise.resolve(cache.setItem(cacheKey, identityId)).catch(() => { });\n }\n }\n provider = (0, fromCognitoIdentity_1.fromCognitoIdentity)({\n client,\n customRoleArn,\n logins,\n identityId,\n });\n return provider();\n };\n return () => provider().catch(async (err) => {\n if (cacheKey) {\n Promise.resolve(cache.removeItem(cacheKey)).catch(() => { });\n }\n throw err;\n });\n}\nexports.fromCognitoIdentityPool = fromCognitoIdentityPool;\nfunction throwOnMissingId() {\n throw new property_provider_1.CredentialsProviderError(\"Response from Amazon Cognito contained no identity ID\");\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./CognitoProviderParameters\"), exports);\ntslib_1.__exportStar(require(\"./Logins\"), exports);\ntslib_1.__exportStar(require(\"./Storage\"), exports);\ntslib_1.__exportStar(require(\"./fromCognitoIdentity\"), exports);\ntslib_1.__exportStar(require(\"./fromCognitoIdentityPool\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.localStorage = void 0;\nconst IndexedDbStorage_1 = require(\"./IndexedDbStorage\");\nconst InMemoryStorage_1 = require(\"./InMemoryStorage\");\nconst inMemoryStorage = new InMemoryStorage_1.InMemoryStorage();\nfunction localStorage() {\n if (typeof self === \"object\" && self.indexedDB) {\n return new IndexedDbStorage_1.IndexedDbStorage();\n }\n if (typeof window === \"object\" && window.localStorage) {\n return window.localStorage;\n }\n return inMemoryStorage;\n}\nexports.localStorage = localStorage;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveLogins = void 0;\nfunction resolveLogins(logins) {\n return Promise.all(Object.keys(logins).reduce((arr, name) => {\n const tokenOrProvider = logins[name];\n if (typeof tokenOrProvider === \"string\") {\n arr.push([name, tokenOrProvider]);\n }\n else {\n arr.push(tokenOrProvider().then((token) => [name, token]));\n }\n return arr;\n }, [])).then((resolvedPairs) => resolvedPairs.reduce((logins, [key, value]) => {\n logins[key] = value;\n return logins;\n }, {}));\n}\nexports.resolveLogins = resolveLogins;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromEnv = exports.ENV_EXPIRATION = exports.ENV_SESSION = exports.ENV_SECRET = exports.ENV_KEY = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nexports.ENV_KEY = \"AWS_ACCESS_KEY_ID\";\nexports.ENV_SECRET = \"AWS_SECRET_ACCESS_KEY\";\nexports.ENV_SESSION = \"AWS_SESSION_TOKEN\";\nexports.ENV_EXPIRATION = \"AWS_CREDENTIAL_EXPIRATION\";\nconst fromEnv = () => async () => {\n const accessKeyId = process.env[exports.ENV_KEY];\n const secretAccessKey = process.env[exports.ENV_SECRET];\n const sessionToken = process.env[exports.ENV_SESSION];\n const expiry = process.env[exports.ENV_EXPIRATION];\n if (accessKeyId && secretAccessKey) {\n return {\n accessKeyId,\n secretAccessKey,\n ...(sessionToken && { sessionToken }),\n ...(expiry && { expiration: new Date(expiry) }),\n };\n }\n throw new property_provider_1.CredentialsProviderError(\"Unable to find environment variable credentials.\");\n};\nexports.fromEnv = fromEnv;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromEnv\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.checkUrl = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst LOOPBACK_CIDR_IPv4 = \"127.0.0.0/8\";\nconst LOOPBACK_CIDR_IPv6 = \"::1/128\";\nconst ECS_CONTAINER_HOST = \"169.254.170.2\";\nconst EKS_CONTAINER_HOST_IPv4 = \"169.254.170.23\";\nconst EKS_CONTAINER_HOST_IPv6 = \"[fd00:ec2::23]\";\nconst checkUrl = (url) => {\n if (url.protocol === \"https:\") {\n return;\n }\n if (url.hostname === ECS_CONTAINER_HOST ||\n url.hostname === EKS_CONTAINER_HOST_IPv4 ||\n url.hostname === EKS_CONTAINER_HOST_IPv6) {\n return;\n }\n if (url.hostname.includes(\"[\")) {\n if (url.hostname === \"[::1]\" || url.hostname === \"[0000:0000:0000:0000:0000:0000:0000:0001]\") {\n return;\n }\n }\n else {\n if (url.hostname === \"localhost\") {\n return;\n }\n const ipComponents = url.hostname.split(\".\");\n const inRange = (component) => {\n const num = parseInt(component, 10);\n return 0 <= num && num <= 255;\n };\n if (ipComponents[0] === \"127\" &&\n inRange(ipComponents[1]) &&\n inRange(ipComponents[2]) &&\n inRange(ipComponents[3]) &&\n ipComponents.length === 4) {\n return;\n }\n }\n throw new property_provider_1.CredentialsProviderError(`URL not accepted. It must either be HTTPS or match one of the following:\n - loopback CIDR 127.0.0.0/8 or [::1/128]\n - ECS container host 169.254.170.2\n - EKS container host 169.254.170.23 or [fd00:ec2::23]`);\n};\nexports.checkUrl = checkUrl;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromHttp = void 0;\nconst tslib_1 = require(\"tslib\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst promises_1 = tslib_1.__importDefault(require(\"fs/promises\"));\nconst checkUrl_1 = require(\"./checkUrl\");\nconst requestHelpers_1 = require(\"./requestHelpers\");\nconst retry_wrapper_1 = require(\"./retry-wrapper\");\nconst AWS_CONTAINER_CREDENTIALS_RELATIVE_URI = \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\";\nconst DEFAULT_LINK_LOCAL_HOST = \"http://169.254.170.2\";\nconst AWS_CONTAINER_CREDENTIALS_FULL_URI = \"AWS_CONTAINER_CREDENTIALS_FULL_URI\";\nconst AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE = \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\";\nconst AWS_CONTAINER_AUTHORIZATION_TOKEN = \"AWS_CONTAINER_AUTHORIZATION_TOKEN\";\nconst fromHttp = (options) => {\n var _a, _b, _c, _d, _e, _f;\n let host;\n const relative = (_a = options.awsContainerCredentialsRelativeUri) !== null && _a !== void 0 ? _a : process.env[AWS_CONTAINER_CREDENTIALS_RELATIVE_URI];\n const full = (_b = options.awsContainerCredentialsFullUri) !== null && _b !== void 0 ? _b : process.env[AWS_CONTAINER_CREDENTIALS_FULL_URI];\n const token = (_c = options.awsContainerAuthorizationToken) !== null && _c !== void 0 ? _c : process.env[AWS_CONTAINER_AUTHORIZATION_TOKEN];\n const tokenFile = (_d = options.awsContainerAuthorizationTokenFile) !== null && _d !== void 0 ? _d : process.env[AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE];\n if (relative && full) {\n console.warn(\"AWS SDK HTTP credentials provider:\", \"you have set both awsContainerCredentialsRelativeUri and awsContainerCredentialsFullUri.\");\n console.warn(\"awsContainerCredentialsFullUri will take precedence.\");\n }\n if (token && tokenFile) {\n console.warn(\"AWS SDK HTTP credentials provider:\", \"you have set both awsContainerAuthorizationToken and awsContainerAuthorizationTokenFile.\");\n console.warn(\"awsContainerAuthorizationToken will take precedence.\");\n }\n if (full) {\n host = full;\n }\n else if (relative) {\n host = `${DEFAULT_LINK_LOCAL_HOST}${relative}`;\n }\n else {\n throw new property_provider_1.CredentialsProviderError(\"No HTTP credential provider host provided.\");\n }\n const url = new URL(host);\n (0, checkUrl_1.checkUrl)(url);\n const requestHandler = new node_http_handler_1.NodeHttpHandler();\n return (0, retry_wrapper_1.retryWrapper)(async () => {\n const request = (0, requestHelpers_1.createGetRequest)(url);\n if (token) {\n request.headers.Authorization = token;\n }\n else if (tokenFile) {\n request.headers.Authorization = (await promises_1.default.readFile(tokenFile)).toString();\n }\n const result = await requestHandler.handle(request);\n return (0, requestHelpers_1.getCredentials)(result.response);\n }, (_e = options.maxRetries) !== null && _e !== void 0 ? _e : 3, (_f = options.timeout) !== null && _f !== void 0 ? _f : 1000);\n};\nexports.fromHttp = fromHttp;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getCredentials = exports.createGetRequest = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst util_stream_1 = require(\"@smithy/util-stream\");\nfunction createGetRequest(url) {\n return new protocol_http_1.HttpRequest({\n protocol: url.protocol,\n hostname: url.hostname,\n port: Number(url.port),\n path: url.pathname,\n query: Array.from(url.searchParams.entries()).reduce((acc, [k, v]) => {\n acc[k] = v;\n return acc;\n }, {}),\n fragment: url.hash,\n });\n}\nexports.createGetRequest = createGetRequest;\nasync function getCredentials(response) {\n var _a, _b;\n const contentType = (_b = (_a = response === null || response === void 0 ? void 0 : response.headers[\"content-type\"]) !== null && _a !== void 0 ? _a : response === null || response === void 0 ? void 0 : response.headers[\"Content-Type\"]) !== null && _b !== void 0 ? _b : \"\";\n if (!contentType.includes(\"json\")) {\n console.warn(\"HTTP credential provider response header content-type was not application/json. Observed: \" + contentType + \".\");\n }\n const stream = (0, util_stream_1.sdkStreamMixin)(response.body);\n const str = await stream.transformToString();\n if (response.statusCode === 200) {\n const parsed = JSON.parse(str);\n if (typeof parsed.AccessKeyId !== \"string\" ||\n typeof parsed.SecretAccessKey !== \"string\" ||\n typeof parsed.Token !== \"string\" ||\n typeof parsed.Expiration !== \"string\") {\n throw new property_provider_1.CredentialsProviderError(\"HTTP credential provider response not of the required format, an object matching: \" +\n \"{ AccessKeyId: string, SecretAccessKey: string, Token: string, Expiration: string(rfc3339) }\");\n }\n return {\n accessKeyId: parsed.AccessKeyId,\n secretAccessKey: parsed.SecretAccessKey,\n sessionToken: parsed.Token,\n expiration: (0, smithy_client_1.parseRfc3339DateTime)(parsed.Expiration),\n };\n }\n if (response.statusCode >= 400 && response.statusCode < 500) {\n let parsedBody = {};\n try {\n parsedBody = JSON.parse(str);\n }\n catch (e) { }\n throw Object.assign(new property_provider_1.CredentialsProviderError(`Server responded with status: ${response.statusCode}`), {\n Code: parsedBody.Code,\n Message: parsedBody.Message,\n });\n }\n throw new property_provider_1.CredentialsProviderError(`Server responded with status: ${response.statusCode}`);\n}\nexports.getCredentials = getCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.retryWrapper = void 0;\nconst retryWrapper = (toRetry, maxRetries, delayMs) => {\n return async () => {\n for (let i = 0; i < maxRetries; ++i) {\n try {\n return await toRetry();\n }\n catch (e) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n return await toRetry();\n };\n};\nexports.retryWrapper = retryWrapper;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromHttp = void 0;\nvar fromHttp_1 = require(\"./fromHttp/fromHttp\");\nObject.defineProperty(exports, \"fromHttp\", { enumerable: true, get: function () { return fromHttp_1.fromHttp; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromIni = void 0;\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst resolveProfileData_1 = require(\"./resolveProfileData\");\nconst fromIni = (init = {}) => async () => {\n const profiles = await (0, shared_ini_file_loader_1.parseKnownFiles)(init);\n return (0, resolveProfileData_1.resolveProfileData)((0, shared_ini_file_loader_1.getProfileName)(init), profiles, init);\n};\nexports.fromIni = fromIni;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromIni\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveAssumeRoleCredentials = exports.isAssumeRoleProfile = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst resolveCredentialSource_1 = require(\"./resolveCredentialSource\");\nconst resolveProfileData_1 = require(\"./resolveProfileData\");\nconst isAssumeRoleProfile = (arg) => Boolean(arg) &&\n typeof arg === \"object\" &&\n typeof arg.role_arn === \"string\" &&\n [\"undefined\", \"string\"].indexOf(typeof arg.role_session_name) > -1 &&\n [\"undefined\", \"string\"].indexOf(typeof arg.external_id) > -1 &&\n [\"undefined\", \"string\"].indexOf(typeof arg.mfa_serial) > -1 &&\n (isAssumeRoleWithSourceProfile(arg) || isAssumeRoleWithProviderProfile(arg));\nexports.isAssumeRoleProfile = isAssumeRoleProfile;\nconst isAssumeRoleWithSourceProfile = (arg) => typeof arg.source_profile === \"string\" && typeof arg.credential_source === \"undefined\";\nconst isAssumeRoleWithProviderProfile = (arg) => typeof arg.credential_source === \"string\" && typeof arg.source_profile === \"undefined\";\nconst resolveAssumeRoleCredentials = async (profileName, profiles, options, visitedProfiles = {}) => {\n const data = profiles[profileName];\n if (!options.roleAssumer) {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} requires a role to be assumed, but no role assumption callback was provided.`, false);\n }\n const { source_profile } = data;\n if (source_profile && source_profile in visitedProfiles) {\n throw new property_provider_1.CredentialsProviderError(`Detected a cycle attempting to resolve credentials for profile` +\n ` ${(0, shared_ini_file_loader_1.getProfileName)(options)}. Profiles visited: ` +\n Object.keys(visitedProfiles).join(\", \"), false);\n }\n const sourceCredsProvider = source_profile\n ? (0, resolveProfileData_1.resolveProfileData)(source_profile, profiles, options, {\n ...visitedProfiles,\n [source_profile]: true,\n })\n : (0, resolveCredentialSource_1.resolveCredentialSource)(data.credential_source, profileName)();\n const params = {\n RoleArn: data.role_arn,\n RoleSessionName: data.role_session_name || `aws-sdk-js-${Date.now()}`,\n ExternalId: data.external_id,\n DurationSeconds: parseInt(data.duration_seconds || \"3600\", 10),\n };\n const { mfa_serial } = data;\n if (mfa_serial) {\n if (!options.mfaCodeProvider) {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} requires multi-factor authentication, but no MFA code callback was provided.`, false);\n }\n params.SerialNumber = mfa_serial;\n params.TokenCode = await options.mfaCodeProvider(mfa_serial);\n }\n const sourceCreds = await sourceCredsProvider;\n return options.roleAssumer(sourceCreds, params);\n};\nexports.resolveAssumeRoleCredentials = resolveAssumeRoleCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveCredentialSource = void 0;\nconst credential_provider_env_1 = require(\"@aws-sdk/credential-provider-env\");\nconst credential_provider_imds_1 = require(\"@smithy/credential-provider-imds\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst resolveCredentialSource = (credentialSource, profileName) => {\n const sourceProvidersMap = {\n EcsContainer: credential_provider_imds_1.fromContainerMetadata,\n Ec2InstanceMetadata: credential_provider_imds_1.fromInstanceMetadata,\n Environment: credential_provider_env_1.fromEnv,\n };\n if (credentialSource in sourceProvidersMap) {\n return sourceProvidersMap[credentialSource]();\n }\n else {\n throw new property_provider_1.CredentialsProviderError(`Unsupported credential source in profile ${profileName}. Got ${credentialSource}, ` +\n `expected EcsContainer or Ec2InstanceMetadata or Environment.`);\n }\n};\nexports.resolveCredentialSource = resolveCredentialSource;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveProcessCredentials = exports.isProcessProfile = void 0;\nconst credential_provider_process_1 = require(\"@aws-sdk/credential-provider-process\");\nconst isProcessProfile = (arg) => Boolean(arg) && typeof arg === \"object\" && typeof arg.credential_process === \"string\";\nexports.isProcessProfile = isProcessProfile;\nconst resolveProcessCredentials = async (options, profile) => (0, credential_provider_process_1.fromProcess)({\n ...options,\n profile,\n})();\nexports.resolveProcessCredentials = resolveProcessCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveProfileData = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst resolveAssumeRoleCredentials_1 = require(\"./resolveAssumeRoleCredentials\");\nconst resolveProcessCredentials_1 = require(\"./resolveProcessCredentials\");\nconst resolveSsoCredentials_1 = require(\"./resolveSsoCredentials\");\nconst resolveStaticCredentials_1 = require(\"./resolveStaticCredentials\");\nconst resolveWebIdentityCredentials_1 = require(\"./resolveWebIdentityCredentials\");\nconst resolveProfileData = async (profileName, profiles, options, visitedProfiles = {}) => {\n const data = profiles[profileName];\n if (Object.keys(visitedProfiles).length > 0 && (0, resolveStaticCredentials_1.isStaticCredsProfile)(data)) {\n return (0, resolveStaticCredentials_1.resolveStaticCredentials)(data);\n }\n if ((0, resolveAssumeRoleCredentials_1.isAssumeRoleProfile)(data)) {\n return (0, resolveAssumeRoleCredentials_1.resolveAssumeRoleCredentials)(profileName, profiles, options, visitedProfiles);\n }\n if ((0, resolveStaticCredentials_1.isStaticCredsProfile)(data)) {\n return (0, resolveStaticCredentials_1.resolveStaticCredentials)(data);\n }\n if ((0, resolveWebIdentityCredentials_1.isWebIdentityProfile)(data)) {\n return (0, resolveWebIdentityCredentials_1.resolveWebIdentityCredentials)(data, options);\n }\n if ((0, resolveProcessCredentials_1.isProcessProfile)(data)) {\n return (0, resolveProcessCredentials_1.resolveProcessCredentials)(options, profileName);\n }\n if ((0, resolveSsoCredentials_1.isSsoProfile)(data)) {\n return (0, resolveSsoCredentials_1.resolveSsoCredentials)(data);\n }\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} could not be found or parsed in shared credentials file.`);\n};\nexports.resolveProfileData = resolveProfileData;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveSsoCredentials = exports.isSsoProfile = void 0;\nconst credential_provider_sso_1 = require(\"@aws-sdk/credential-provider-sso\");\nvar credential_provider_sso_2 = require(\"@aws-sdk/credential-provider-sso\");\nObject.defineProperty(exports, \"isSsoProfile\", { enumerable: true, get: function () { return credential_provider_sso_2.isSsoProfile; } });\nconst resolveSsoCredentials = (data) => {\n const { sso_start_url, sso_account_id, sso_session, sso_region, sso_role_name } = (0, credential_provider_sso_1.validateSsoProfile)(data);\n return (0, credential_provider_sso_1.fromSSO)({\n ssoStartUrl: sso_start_url,\n ssoAccountId: sso_account_id,\n ssoSession: sso_session,\n ssoRegion: sso_region,\n ssoRoleName: sso_role_name,\n })();\n};\nexports.resolveSsoCredentials = resolveSsoCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveStaticCredentials = exports.isStaticCredsProfile = void 0;\nconst isStaticCredsProfile = (arg) => Boolean(arg) &&\n typeof arg === \"object\" &&\n typeof arg.aws_access_key_id === \"string\" &&\n typeof arg.aws_secret_access_key === \"string\" &&\n [\"undefined\", \"string\"].indexOf(typeof arg.aws_session_token) > -1;\nexports.isStaticCredsProfile = isStaticCredsProfile;\nconst resolveStaticCredentials = (profile) => Promise.resolve({\n accessKeyId: profile.aws_access_key_id,\n secretAccessKey: profile.aws_secret_access_key,\n sessionToken: profile.aws_session_token,\n});\nexports.resolveStaticCredentials = resolveStaticCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveWebIdentityCredentials = exports.isWebIdentityProfile = void 0;\nconst credential_provider_web_identity_1 = require(\"@aws-sdk/credential-provider-web-identity\");\nconst isWebIdentityProfile = (arg) => Boolean(arg) &&\n typeof arg === \"object\" &&\n typeof arg.web_identity_token_file === \"string\" &&\n typeof arg.role_arn === \"string\" &&\n [\"undefined\", \"string\"].indexOf(typeof arg.role_session_name) > -1;\nexports.isWebIdentityProfile = isWebIdentityProfile;\nconst resolveWebIdentityCredentials = async (profile, options) => (0, credential_provider_web_identity_1.fromTokenFile)({\n webIdentityTokenFile: profile.web_identity_token_file,\n roleArn: profile.role_arn,\n roleSessionName: profile.role_session_name,\n roleAssumerWithWebIdentity: options.roleAssumerWithWebIdentity,\n})();\nexports.resolveWebIdentityCredentials = resolveWebIdentityCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultProvider = void 0;\nconst credential_provider_env_1 = require(\"@aws-sdk/credential-provider-env\");\nconst credential_provider_ini_1 = require(\"@aws-sdk/credential-provider-ini\");\nconst credential_provider_process_1 = require(\"@aws-sdk/credential-provider-process\");\nconst credential_provider_sso_1 = require(\"@aws-sdk/credential-provider-sso\");\nconst credential_provider_web_identity_1 = require(\"@aws-sdk/credential-provider-web-identity\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst remoteProvider_1 = require(\"./remoteProvider\");\nconst defaultProvider = (init = {}) => (0, property_provider_1.memoize)((0, property_provider_1.chain)(...(init.profile || process.env[shared_ini_file_loader_1.ENV_PROFILE] ? [] : [(0, credential_provider_env_1.fromEnv)()]), (0, credential_provider_sso_1.fromSSO)(init), (0, credential_provider_ini_1.fromIni)(init), (0, credential_provider_process_1.fromProcess)(init), (0, credential_provider_web_identity_1.fromTokenFile)(init), (0, remoteProvider_1.remoteProvider)(init), async () => {\n throw new property_provider_1.CredentialsProviderError(\"Could not load credentials from any providers\", false);\n}), (credentials) => credentials.expiration !== undefined && credentials.expiration.getTime() - Date.now() < 300000, (credentials) => credentials.expiration !== undefined);\nexports.defaultProvider = defaultProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./defaultProvider\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.remoteProvider = exports.ENV_IMDS_DISABLED = void 0;\nconst credential_provider_imds_1 = require(\"@smithy/credential-provider-imds\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nexports.ENV_IMDS_DISABLED = \"AWS_EC2_METADATA_DISABLED\";\nconst remoteProvider = (init) => {\n if (process.env[credential_provider_imds_1.ENV_CMDS_RELATIVE_URI] || process.env[credential_provider_imds_1.ENV_CMDS_FULL_URI]) {\n return (0, credential_provider_imds_1.fromContainerMetadata)(init);\n }\n if (process.env[exports.ENV_IMDS_DISABLED]) {\n return async () => {\n throw new property_provider_1.CredentialsProviderError(\"EC2 Instance Metadata Service access disabled\");\n };\n }\n return (0, credential_provider_imds_1.fromInstanceMetadata)(init);\n};\nexports.remoteProvider = remoteProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromProcess = void 0;\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst resolveProcessCredentials_1 = require(\"./resolveProcessCredentials\");\nconst fromProcess = (init = {}) => async () => {\n const profiles = await (0, shared_ini_file_loader_1.parseKnownFiles)(init);\n return (0, resolveProcessCredentials_1.resolveProcessCredentials)((0, shared_ini_file_loader_1.getProfileName)(init), profiles);\n};\nexports.fromProcess = fromProcess;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getValidatedProcessCredentials = void 0;\nconst getValidatedProcessCredentials = (profileName, data) => {\n if (data.Version !== 1) {\n throw Error(`Profile ${profileName} credential_process did not return Version 1.`);\n }\n if (data.AccessKeyId === undefined || data.SecretAccessKey === undefined) {\n throw Error(`Profile ${profileName} credential_process returned invalid credentials.`);\n }\n if (data.Expiration) {\n const currentTime = new Date();\n const expireTime = new Date(data.Expiration);\n if (expireTime < currentTime) {\n throw Error(`Profile ${profileName} credential_process returned expired credentials.`);\n }\n }\n return {\n accessKeyId: data.AccessKeyId,\n secretAccessKey: data.SecretAccessKey,\n ...(data.SessionToken && { sessionToken: data.SessionToken }),\n ...(data.Expiration && { expiration: new Date(data.Expiration) }),\n };\n};\nexports.getValidatedProcessCredentials = getValidatedProcessCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromProcess\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveProcessCredentials = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst child_process_1 = require(\"child_process\");\nconst util_1 = require(\"util\");\nconst getValidatedProcessCredentials_1 = require(\"./getValidatedProcessCredentials\");\nconst resolveProcessCredentials = async (profileName, profiles) => {\n const profile = profiles[profileName];\n if (profiles[profileName]) {\n const credentialProcess = profile[\"credential_process\"];\n if (credentialProcess !== undefined) {\n const execPromise = (0, util_1.promisify)(child_process_1.exec);\n try {\n const { stdout } = await execPromise(credentialProcess);\n let data;\n try {\n data = JSON.parse(stdout.trim());\n }\n catch (_a) {\n throw Error(`Profile ${profileName} credential_process returned invalid JSON.`);\n }\n return (0, getValidatedProcessCredentials_1.getValidatedProcessCredentials)(profileName, data);\n }\n catch (error) {\n throw new property_provider_1.CredentialsProviderError(error.message);\n }\n }\n else {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} did not contain credential_process.`);\n }\n }\n else {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} could not be found in shared credentials file.`);\n }\n};\nexports.resolveProcessCredentials = resolveProcessCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromSSO = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst isSsoProfile_1 = require(\"./isSsoProfile\");\nconst resolveSSOCredentials_1 = require(\"./resolveSSOCredentials\");\nconst validateSsoProfile_1 = require(\"./validateSsoProfile\");\nconst fromSSO = (init = {}) => async () => {\n const { ssoStartUrl, ssoAccountId, ssoRegion, ssoRoleName, ssoClient, ssoSession } = init;\n const profileName = (0, shared_ini_file_loader_1.getProfileName)(init);\n if (!ssoStartUrl && !ssoAccountId && !ssoRegion && !ssoRoleName && !ssoSession) {\n const profiles = await (0, shared_ini_file_loader_1.parseKnownFiles)(init);\n const profile = profiles[profileName];\n if (!profile) {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} was not found.`);\n }\n if (!(0, isSsoProfile_1.isSsoProfile)(profile)) {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} is not configured with SSO credentials.`);\n }\n if (profile === null || profile === void 0 ? void 0 : profile.sso_session) {\n const ssoSessions = await (0, shared_ini_file_loader_1.loadSsoSessionData)(init);\n const session = ssoSessions[profile.sso_session];\n const conflictMsg = ` configurations in profile ${profileName} and sso-session ${profile.sso_session}`;\n if (ssoRegion && ssoRegion !== session.sso_region) {\n throw new property_provider_1.CredentialsProviderError(`Conflicting SSO region` + conflictMsg, false);\n }\n if (ssoStartUrl && ssoStartUrl !== session.sso_start_url) {\n throw new property_provider_1.CredentialsProviderError(`Conflicting SSO start_url` + conflictMsg, false);\n }\n profile.sso_region = session.sso_region;\n profile.sso_start_url = session.sso_start_url;\n }\n const { sso_start_url, sso_account_id, sso_region, sso_role_name, sso_session } = (0, validateSsoProfile_1.validateSsoProfile)(profile);\n return (0, resolveSSOCredentials_1.resolveSSOCredentials)({\n ssoStartUrl: sso_start_url,\n ssoSession: sso_session,\n ssoAccountId: sso_account_id,\n ssoRegion: sso_region,\n ssoRoleName: sso_role_name,\n ssoClient: ssoClient,\n profile: profileName,\n });\n }\n else if (!ssoStartUrl || !ssoAccountId || !ssoRegion || !ssoRoleName) {\n throw new property_provider_1.CredentialsProviderError(\"Incomplete configuration. The fromSSO() argument hash must include \" +\n '\"ssoStartUrl\", \"ssoAccountId\", \"ssoRegion\", \"ssoRoleName\"');\n }\n else {\n return (0, resolveSSOCredentials_1.resolveSSOCredentials)({\n ssoStartUrl,\n ssoSession,\n ssoAccountId,\n ssoRegion,\n ssoRoleName,\n ssoClient,\n profile: profileName,\n });\n }\n};\nexports.fromSSO = fromSSO;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromSSO\"), exports);\ntslib_1.__exportStar(require(\"./isSsoProfile\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\ntslib_1.__exportStar(require(\"./validateSsoProfile\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isSsoProfile = void 0;\nconst isSsoProfile = (arg) => arg &&\n (typeof arg.sso_start_url === \"string\" ||\n typeof arg.sso_account_id === \"string\" ||\n typeof arg.sso_session === \"string\" ||\n typeof arg.sso_region === \"string\" ||\n typeof arg.sso_role_name === \"string\");\nexports.isSsoProfile = isSsoProfile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveSSOCredentials = void 0;\nconst client_sso_1 = require(\"@aws-sdk/client-sso\");\nconst token_providers_1 = require(\"@aws-sdk/token-providers\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst SHOULD_FAIL_CREDENTIAL_CHAIN = false;\nconst resolveSSOCredentials = async ({ ssoStartUrl, ssoSession, ssoAccountId, ssoRegion, ssoRoleName, ssoClient, profile, }) => {\n let token;\n const refreshMessage = `To refresh this SSO session run aws sso login with the corresponding profile.`;\n if (ssoSession) {\n try {\n const _token = await (0, token_providers_1.fromSso)({ profile })();\n token = {\n accessToken: _token.token,\n expiresAt: new Date(_token.expiration).toISOString(),\n };\n }\n catch (e) {\n throw new property_provider_1.CredentialsProviderError(e.message, SHOULD_FAIL_CREDENTIAL_CHAIN);\n }\n }\n else {\n try {\n token = await (0, shared_ini_file_loader_1.getSSOTokenFromFile)(ssoStartUrl);\n }\n catch (e) {\n throw new property_provider_1.CredentialsProviderError(`The SSO session associated with this profile is invalid. ${refreshMessage}`, SHOULD_FAIL_CREDENTIAL_CHAIN);\n }\n }\n if (new Date(token.expiresAt).getTime() - Date.now() <= 0) {\n throw new property_provider_1.CredentialsProviderError(`The SSO session associated with this profile has expired. ${refreshMessage}`, SHOULD_FAIL_CREDENTIAL_CHAIN);\n }\n const { accessToken } = token;\n const sso = ssoClient || new client_sso_1.SSOClient({ region: ssoRegion });\n let ssoResp;\n try {\n ssoResp = await sso.send(new client_sso_1.GetRoleCredentialsCommand({\n accountId: ssoAccountId,\n roleName: ssoRoleName,\n accessToken,\n }));\n }\n catch (e) {\n throw property_provider_1.CredentialsProviderError.from(e, SHOULD_FAIL_CREDENTIAL_CHAIN);\n }\n const { roleCredentials: { accessKeyId, secretAccessKey, sessionToken, expiration } = {} } = ssoResp;\n if (!accessKeyId || !secretAccessKey || !sessionToken || !expiration) {\n throw new property_provider_1.CredentialsProviderError(\"SSO returns an invalid temporary credential.\", SHOULD_FAIL_CREDENTIAL_CHAIN);\n }\n return { accessKeyId, secretAccessKey, sessionToken, expiration: new Date(expiration) };\n};\nexports.resolveSSOCredentials = resolveSSOCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateSsoProfile = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst validateSsoProfile = (profile) => {\n const { sso_start_url, sso_account_id, sso_region, sso_role_name } = profile;\n if (!sso_start_url || !sso_account_id || !sso_region || !sso_role_name) {\n throw new property_provider_1.CredentialsProviderError(`Profile is configured with invalid SSO credentials. Required parameters \"sso_account_id\", ` +\n `\"sso_region\", \"sso_role_name\", \"sso_start_url\". Got ${Object.keys(profile).join(\", \")}\\nReference: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html`, false);\n }\n return profile;\n};\nexports.validateSsoProfile = validateSsoProfile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromTokenFile = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fs_1 = require(\"fs\");\nconst fromWebToken_1 = require(\"./fromWebToken\");\nconst ENV_TOKEN_FILE = \"AWS_WEB_IDENTITY_TOKEN_FILE\";\nconst ENV_ROLE_ARN = \"AWS_ROLE_ARN\";\nconst ENV_ROLE_SESSION_NAME = \"AWS_ROLE_SESSION_NAME\";\nconst fromTokenFile = (init = {}) => async () => {\n var _a, _b, _c;\n const webIdentityTokenFile = (_a = init === null || init === void 0 ? void 0 : init.webIdentityTokenFile) !== null && _a !== void 0 ? _a : process.env[ENV_TOKEN_FILE];\n const roleArn = (_b = init === null || init === void 0 ? void 0 : init.roleArn) !== null && _b !== void 0 ? _b : process.env[ENV_ROLE_ARN];\n const roleSessionName = (_c = init === null || init === void 0 ? void 0 : init.roleSessionName) !== null && _c !== void 0 ? _c : process.env[ENV_ROLE_SESSION_NAME];\n if (!webIdentityTokenFile || !roleArn) {\n throw new property_provider_1.CredentialsProviderError(\"Web identity configuration not specified\");\n }\n return (0, fromWebToken_1.fromWebToken)({\n ...init,\n webIdentityToken: (0, fs_1.readFileSync)(webIdentityTokenFile, { encoding: \"ascii\" }),\n roleArn,\n roleSessionName,\n })();\n};\nexports.fromTokenFile = fromTokenFile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromWebToken = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromWebToken = (init) => () => {\n const { roleArn, roleSessionName, webIdentityToken, providerId, policyArns, policy, durationSeconds, roleAssumerWithWebIdentity, } = init;\n if (!roleAssumerWithWebIdentity) {\n throw new property_provider_1.CredentialsProviderError(`Role Arn '${roleArn}' needs to be assumed with web identity,` +\n ` but no role assumption callback was provided.`, false);\n }\n return roleAssumerWithWebIdentity({\n RoleArn: roleArn,\n RoleSessionName: roleSessionName !== null && roleSessionName !== void 0 ? roleSessionName : `aws-sdk-js-session-${Date.now()}`,\n WebIdentityToken: webIdentityToken,\n ProviderId: providerId,\n PolicyArns: policyArns,\n Policy: policy,\n DurationSeconds: durationSeconds,\n });\n};\nexports.fromWebToken = fromWebToken;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromTokenFile\"), exports);\ntslib_1.__exportStar(require(\"./fromWebToken\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromCognitoIdentity = void 0;\nconst client_cognito_identity_1 = require(\"@aws-sdk/client-cognito-identity\");\nconst credential_provider_cognito_identity_1 = require(\"@aws-sdk/credential-provider-cognito-identity\");\nconst fromCognitoIdentity = (options) => {\n var _a;\n return (0, credential_provider_cognito_identity_1.fromCognitoIdentity)({\n ...options,\n client: new client_cognito_identity_1.CognitoIdentityClient((_a = options.clientConfig) !== null && _a !== void 0 ? _a : {}),\n });\n};\nexports.fromCognitoIdentity = fromCognitoIdentity;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromCognitoIdentityPool = void 0;\nconst client_cognito_identity_1 = require(\"@aws-sdk/client-cognito-identity\");\nconst credential_provider_cognito_identity_1 = require(\"@aws-sdk/credential-provider-cognito-identity\");\nconst fromCognitoIdentityPool = (options) => {\n var _a;\n return (0, credential_provider_cognito_identity_1.fromCognitoIdentityPool)({\n ...options,\n client: new client_cognito_identity_1.CognitoIdentityClient((_a = options.clientConfig) !== null && _a !== void 0 ? _a : {}),\n });\n};\nexports.fromCognitoIdentityPool = fromCognitoIdentityPool;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromContainerMetadata = void 0;\nconst credential_provider_imds_1 = require(\"@smithy/credential-provider-imds\");\nconst fromContainerMetadata = (init) => (0, credential_provider_imds_1.fromContainerMetadata)(init);\nexports.fromContainerMetadata = fromContainerMetadata;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromEnv = void 0;\nconst credential_provider_env_1 = require(\"@aws-sdk/credential-provider-env\");\nconst fromEnv = () => (0, credential_provider_env_1.fromEnv)();\nexports.fromEnv = fromEnv;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromIni = void 0;\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst credential_provider_ini_1 = require(\"@aws-sdk/credential-provider-ini\");\nconst fromIni = (init = {}) => {\n var _a, _b;\n return (0, credential_provider_ini_1.fromIni)({\n ...init,\n roleAssumer: (_a = init.roleAssumer) !== null && _a !== void 0 ? _a : (0, client_sts_1.getDefaultRoleAssumer)(init.clientConfig, init.clientPlugins),\n roleAssumerWithWebIdentity: (_b = init.roleAssumerWithWebIdentity) !== null && _b !== void 0 ? _b : (0, client_sts_1.getDefaultRoleAssumerWithWebIdentity)(init.clientConfig, init.clientPlugins),\n });\n};\nexports.fromIni = fromIni;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromInstanceMetadata = void 0;\nconst credential_provider_imds_1 = require(\"@smithy/credential-provider-imds\");\nconst fromInstanceMetadata = (init) => (0, credential_provider_imds_1.fromInstanceMetadata)(init);\nexports.fromInstanceMetadata = fromInstanceMetadata;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromNodeProviderChain = void 0;\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst credential_provider_node_1 = require(\"@aws-sdk/credential-provider-node\");\nconst fromNodeProviderChain = (init = {}) => {\n var _a, _b;\n return (0, credential_provider_node_1.defaultProvider)({\n ...init,\n roleAssumer: (_a = init.roleAssumer) !== null && _a !== void 0 ? _a : (0, client_sts_1.getDefaultRoleAssumer)(init.clientConfig, init.clientPlugins),\n roleAssumerWithWebIdentity: (_b = init.roleAssumerWithWebIdentity) !== null && _b !== void 0 ? _b : (0, client_sts_1.getDefaultRoleAssumerWithWebIdentity)(init.clientConfig, init.clientPlugins),\n });\n};\nexports.fromNodeProviderChain = fromNodeProviderChain;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromProcess = void 0;\nconst credential_provider_process_1 = require(\"@aws-sdk/credential-provider-process\");\nconst fromProcess = (init) => (0, credential_provider_process_1.fromProcess)(init);\nexports.fromProcess = fromProcess;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromSSO = void 0;\nconst client_sso_1 = require(\"@aws-sdk/client-sso\");\nconst credential_provider_sso_1 = require(\"@aws-sdk/credential-provider-sso\");\nconst fromSSO = (init = {}) => (0, credential_provider_sso_1.fromSSO)({ ...{ ssoClient: init.clientConfig ? new client_sso_1.SSOClient(init.clientConfig) : undefined }, ...init });\nexports.fromSSO = fromSSO;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromTemporaryCredentials = void 0;\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromTemporaryCredentials = (options) => {\n let stsClient;\n return async () => {\n var _a;\n const params = { ...options.params, RoleSessionName: (_a = options.params.RoleSessionName) !== null && _a !== void 0 ? _a : \"aws-sdk-js-\" + Date.now() };\n if (params === null || params === void 0 ? void 0 : params.SerialNumber) {\n if (!options.mfaCodeProvider) {\n throw new property_provider_1.CredentialsProviderError(`Temporary credential requires multi-factor authentication,` + ` but no MFA code callback was provided.`, false);\n }\n params.TokenCode = await options.mfaCodeProvider(params === null || params === void 0 ? void 0 : params.SerialNumber);\n }\n if (!stsClient)\n stsClient = new client_sts_1.STSClient({ ...options.clientConfig, credentials: options.masterCredentials });\n if (options.clientPlugins) {\n for (const plugin of options.clientPlugins) {\n stsClient.middlewareStack.use(plugin);\n }\n }\n const { Credentials } = await stsClient.send(new client_sts_1.AssumeRoleCommand(params));\n if (!Credentials || !Credentials.AccessKeyId || !Credentials.SecretAccessKey) {\n throw new property_provider_1.CredentialsProviderError(`Invalid response from STS.assumeRole call with role ${params.RoleArn}`);\n }\n return {\n accessKeyId: Credentials.AccessKeyId,\n secretAccessKey: Credentials.SecretAccessKey,\n sessionToken: Credentials.SessionToken,\n expiration: Credentials.Expiration,\n };\n };\n};\nexports.fromTemporaryCredentials = fromTemporaryCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromTokenFile = void 0;\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst credential_provider_web_identity_1 = require(\"@aws-sdk/credential-provider-web-identity\");\nconst fromTokenFile = (init = {}) => {\n var _a;\n return (0, credential_provider_web_identity_1.fromTokenFile)({\n ...init,\n roleAssumerWithWebIdentity: (_a = init.roleAssumerWithWebIdentity) !== null && _a !== void 0 ? _a : (0, client_sts_1.getDefaultRoleAssumerWithWebIdentity)(init.clientConfig, init.clientPlugins),\n });\n};\nexports.fromTokenFile = fromTokenFile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromWebToken = void 0;\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst credential_provider_web_identity_1 = require(\"@aws-sdk/credential-provider-web-identity\");\nconst fromWebToken = (init) => {\n var _a;\n return (0, credential_provider_web_identity_1.fromWebToken)({\n ...init,\n roleAssumerWithWebIdentity: (_a = init.roleAssumerWithWebIdentity) !== null && _a !== void 0 ? _a : (0, client_sts_1.getDefaultRoleAssumerWithWebIdentity)(init.clientConfig, init.clientPlugins),\n });\n};\nexports.fromWebToken = fromWebToken;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromHttp = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromCognitoIdentity\"), exports);\ntslib_1.__exportStar(require(\"./fromCognitoIdentityPool\"), exports);\ntslib_1.__exportStar(require(\"./fromContainerMetadata\"), exports);\ntslib_1.__exportStar(require(\"./fromEnv\"), exports);\nvar credential_provider_http_1 = require(\"@aws-sdk/credential-provider-http\");\nObject.defineProperty(exports, \"fromHttp\", { enumerable: true, get: function () { return credential_provider_http_1.fromHttp; } });\ntslib_1.__exportStar(require(\"./fromIni\"), exports);\ntslib_1.__exportStar(require(\"./fromInstanceMetadata\"), exports);\ntslib_1.__exportStar(require(\"./fromNodeProviderChain\"), exports);\ntslib_1.__exportStar(require(\"./fromProcess\"), exports);\ntslib_1.__exportStar(require(\"./fromSSO\"), exports);\ntslib_1.__exportStar(require(\"./fromTemporaryCredentials\"), exports);\ntslib_1.__exportStar(require(\"./fromTokenFile\"), exports);\ntslib_1.__exportStar(require(\"./fromWebToken\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getHostHeaderPlugin = exports.hostHeaderMiddlewareOptions = exports.hostHeaderMiddleware = exports.resolveHostHeaderConfig = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nfunction resolveHostHeaderConfig(input) {\n return input;\n}\nexports.resolveHostHeaderConfig = resolveHostHeaderConfig;\nconst hostHeaderMiddleware = (options) => (next) => async (args) => {\n if (!protocol_http_1.HttpRequest.isInstance(args.request))\n return next(args);\n const { request } = args;\n const { handlerProtocol = \"\" } = options.requestHandler.metadata || {};\n if (handlerProtocol.indexOf(\"h2\") >= 0 && !request.headers[\":authority\"]) {\n delete request.headers[\"host\"];\n request.headers[\":authority\"] = request.hostname + (request.port ? \":\" + request.port : \"\");\n }\n else if (!request.headers[\"host\"]) {\n let host = request.hostname;\n if (request.port != null)\n host += `:${request.port}`;\n request.headers[\"host\"] = host;\n }\n return next(args);\n};\nexports.hostHeaderMiddleware = hostHeaderMiddleware;\nexports.hostHeaderMiddlewareOptions = {\n name: \"hostHeaderMiddleware\",\n step: \"build\",\n priority: \"low\",\n tags: [\"HOST\"],\n override: true,\n};\nconst getHostHeaderPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.add((0, exports.hostHeaderMiddleware)(options), exports.hostHeaderMiddlewareOptions);\n },\n});\nexports.getHostHeaderPlugin = getHostHeaderPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./loggerMiddleware\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getLoggerPlugin = exports.loggerMiddlewareOptions = exports.loggerMiddleware = void 0;\nconst loggerMiddleware = () => (next, context) => async (args) => {\n var _a, _b;\n try {\n const response = await next(args);\n const { clientName, commandName, logger, dynamoDbDocumentClientOptions = {} } = context;\n const { overrideInputFilterSensitiveLog, overrideOutputFilterSensitiveLog } = dynamoDbDocumentClientOptions;\n const inputFilterSensitiveLog = overrideInputFilterSensitiveLog !== null && overrideInputFilterSensitiveLog !== void 0 ? overrideInputFilterSensitiveLog : context.inputFilterSensitiveLog;\n const outputFilterSensitiveLog = overrideOutputFilterSensitiveLog !== null && overrideOutputFilterSensitiveLog !== void 0 ? overrideOutputFilterSensitiveLog : context.outputFilterSensitiveLog;\n const { $metadata, ...outputWithoutMetadata } = response.output;\n (_a = logger === null || logger === void 0 ? void 0 : logger.info) === null || _a === void 0 ? void 0 : _a.call(logger, {\n clientName,\n commandName,\n input: inputFilterSensitiveLog(args.input),\n output: outputFilterSensitiveLog(outputWithoutMetadata),\n metadata: $metadata,\n });\n return response;\n }\n catch (error) {\n const { clientName, commandName, logger, dynamoDbDocumentClientOptions = {} } = context;\n const { overrideInputFilterSensitiveLog } = dynamoDbDocumentClientOptions;\n const inputFilterSensitiveLog = overrideInputFilterSensitiveLog !== null && overrideInputFilterSensitiveLog !== void 0 ? overrideInputFilterSensitiveLog : context.inputFilterSensitiveLog;\n (_b = logger === null || logger === void 0 ? void 0 : logger.error) === null || _b === void 0 ? void 0 : _b.call(logger, {\n clientName,\n commandName,\n input: inputFilterSensitiveLog(args.input),\n error,\n metadata: error.$metadata,\n });\n throw error;\n }\n};\nexports.loggerMiddleware = loggerMiddleware;\nexports.loggerMiddlewareOptions = {\n name: \"loggerMiddleware\",\n tags: [\"LOGGER\"],\n step: \"initialize\",\n override: true,\n};\nconst getLoggerPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.add((0, exports.loggerMiddleware)(), exports.loggerMiddlewareOptions);\n },\n});\nexports.getLoggerPlugin = getLoggerPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRecursionDetectionPlugin = exports.addRecursionDetectionMiddlewareOptions = exports.recursionDetectionMiddleware = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst TRACE_ID_HEADER_NAME = \"X-Amzn-Trace-Id\";\nconst ENV_LAMBDA_FUNCTION_NAME = \"AWS_LAMBDA_FUNCTION_NAME\";\nconst ENV_TRACE_ID = \"_X_AMZN_TRACE_ID\";\nconst recursionDetectionMiddleware = (options) => (next) => async (args) => {\n const { request } = args;\n if (!protocol_http_1.HttpRequest.isInstance(request) ||\n options.runtime !== \"node\" ||\n request.headers.hasOwnProperty(TRACE_ID_HEADER_NAME)) {\n return next(args);\n }\n const functionName = process.env[ENV_LAMBDA_FUNCTION_NAME];\n const traceId = process.env[ENV_TRACE_ID];\n const nonEmptyString = (str) => typeof str === \"string\" && str.length > 0;\n if (nonEmptyString(functionName) && nonEmptyString(traceId)) {\n request.headers[TRACE_ID_HEADER_NAME] = traceId;\n }\n return next({\n ...args,\n request,\n });\n};\nexports.recursionDetectionMiddleware = recursionDetectionMiddleware;\nexports.addRecursionDetectionMiddlewareOptions = {\n step: \"build\",\n tags: [\"RECURSION_DETECTION\"],\n name: \"recursionDetectionMiddleware\",\n override: true,\n priority: \"low\",\n};\nconst getRecursionDetectionPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.add((0, exports.recursionDetectionMiddleware)(options), exports.addRecursionDetectionMiddlewareOptions);\n },\n});\nexports.getRecursionDetectionPlugin = getRecursionDetectionPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveStsAuthConfig = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst resolveStsAuthConfig = (input, { stsClientCtor }) => (0, middleware_signing_1.resolveAwsAuthConfig)({\n ...input,\n stsClientCtor,\n});\nexports.resolveStsAuthConfig = resolveStsAuthConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveSigV4AuthConfig = exports.resolveAwsAuthConfig = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst signature_v4_1 = require(\"@smithy/signature-v4\");\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst CREDENTIAL_EXPIRE_WINDOW = 300000;\nconst resolveAwsAuthConfig = (input) => {\n const normalizedCreds = input.credentials\n ? normalizeCredentialProvider(input.credentials)\n : input.credentialDefaultProvider(input);\n const { signingEscapePath = true, systemClockOffset = input.systemClockOffset || 0, sha256 } = input;\n let signer;\n if (input.signer) {\n signer = (0, util_middleware_1.normalizeProvider)(input.signer);\n }\n else if (input.regionInfoProvider) {\n signer = () => (0, util_middleware_1.normalizeProvider)(input.region)()\n .then(async (region) => [\n (await input.regionInfoProvider(region, {\n useFipsEndpoint: await input.useFipsEndpoint(),\n useDualstackEndpoint: await input.useDualstackEndpoint(),\n })) || {},\n region,\n ])\n .then(([regionInfo, region]) => {\n const { signingRegion, signingService } = regionInfo;\n input.signingRegion = input.signingRegion || signingRegion || region;\n input.signingName = input.signingName || signingService || input.serviceId;\n const params = {\n ...input,\n credentials: normalizedCreds,\n region: input.signingRegion,\n service: input.signingName,\n sha256,\n uriEscapePath: signingEscapePath,\n };\n const SignerCtor = input.signerConstructor || signature_v4_1.SignatureV4;\n return new SignerCtor(params);\n });\n }\n else {\n signer = async (authScheme) => {\n authScheme = Object.assign({}, {\n name: \"sigv4\",\n signingName: input.signingName || input.defaultSigningName,\n signingRegion: await (0, util_middleware_1.normalizeProvider)(input.region)(),\n properties: {},\n }, authScheme);\n const signingRegion = authScheme.signingRegion;\n const signingService = authScheme.signingName;\n input.signingRegion = input.signingRegion || signingRegion;\n input.signingName = input.signingName || signingService || input.serviceId;\n const params = {\n ...input,\n credentials: normalizedCreds,\n region: input.signingRegion,\n service: input.signingName,\n sha256,\n uriEscapePath: signingEscapePath,\n };\n const SignerCtor = input.signerConstructor || signature_v4_1.SignatureV4;\n return new SignerCtor(params);\n };\n }\n return {\n ...input,\n systemClockOffset,\n signingEscapePath,\n credentials: normalizedCreds,\n signer,\n };\n};\nexports.resolveAwsAuthConfig = resolveAwsAuthConfig;\nconst resolveSigV4AuthConfig = (input) => {\n const normalizedCreds = input.credentials\n ? normalizeCredentialProvider(input.credentials)\n : input.credentialDefaultProvider(input);\n const { signingEscapePath = true, systemClockOffset = input.systemClockOffset || 0, sha256 } = input;\n let signer;\n if (input.signer) {\n signer = (0, util_middleware_1.normalizeProvider)(input.signer);\n }\n else {\n signer = (0, util_middleware_1.normalizeProvider)(new signature_v4_1.SignatureV4({\n credentials: normalizedCreds,\n region: input.region,\n service: input.signingName,\n sha256,\n uriEscapePath: signingEscapePath,\n }));\n }\n return {\n ...input,\n systemClockOffset,\n signingEscapePath,\n credentials: normalizedCreds,\n signer,\n };\n};\nexports.resolveSigV4AuthConfig = resolveSigV4AuthConfig;\nconst normalizeCredentialProvider = (credentials) => {\n if (typeof credentials === \"function\") {\n return (0, property_provider_1.memoize)(credentials, (credentials) => credentials.expiration !== undefined &&\n credentials.expiration.getTime() - Date.now() < CREDENTIAL_EXPIRE_WINDOW, (credentials) => credentials.expiration !== undefined);\n }\n return (0, util_middleware_1.normalizeProvider)(credentials);\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSigV4AuthPlugin = exports.getAwsAuthPlugin = exports.awsAuthMiddlewareOptions = exports.awsAuthMiddleware = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst getSkewCorrectedDate_1 = require(\"./utils/getSkewCorrectedDate\");\nconst getUpdatedSystemClockOffset_1 = require(\"./utils/getUpdatedSystemClockOffset\");\nconst awsAuthMiddleware = (options) => (next, context) => async function (args) {\n var _a, _b, _c, _d;\n if (!protocol_http_1.HttpRequest.isInstance(args.request))\n return next(args);\n const authScheme = (_c = (_b = (_a = context.endpointV2) === null || _a === void 0 ? void 0 : _a.properties) === null || _b === void 0 ? void 0 : _b.authSchemes) === null || _c === void 0 ? void 0 : _c[0];\n const multiRegionOverride = (authScheme === null || authScheme === void 0 ? void 0 : authScheme.name) === \"sigv4a\" ? (_d = authScheme === null || authScheme === void 0 ? void 0 : authScheme.signingRegionSet) === null || _d === void 0 ? void 0 : _d.join(\",\") : undefined;\n const signer = await options.signer(authScheme);\n const output = await next({\n ...args,\n request: await signer.sign(args.request, {\n signingDate: (0, getSkewCorrectedDate_1.getSkewCorrectedDate)(options.systemClockOffset),\n signingRegion: multiRegionOverride || context[\"signing_region\"],\n signingService: context[\"signing_service\"],\n }),\n }).catch((error) => {\n var _a;\n const serverTime = (_a = error.ServerTime) !== null && _a !== void 0 ? _a : getDateHeader(error.$response);\n if (serverTime) {\n options.systemClockOffset = (0, getUpdatedSystemClockOffset_1.getUpdatedSystemClockOffset)(serverTime, options.systemClockOffset);\n }\n throw error;\n });\n const dateHeader = getDateHeader(output.response);\n if (dateHeader) {\n options.systemClockOffset = (0, getUpdatedSystemClockOffset_1.getUpdatedSystemClockOffset)(dateHeader, options.systemClockOffset);\n }\n return output;\n};\nexports.awsAuthMiddleware = awsAuthMiddleware;\nconst getDateHeader = (response) => { var _a, _b, _c; return protocol_http_1.HttpResponse.isInstance(response) ? (_b = (_a = response.headers) === null || _a === void 0 ? void 0 : _a.date) !== null && _b !== void 0 ? _b : (_c = response.headers) === null || _c === void 0 ? void 0 : _c.Date : undefined; };\nexports.awsAuthMiddlewareOptions = {\n name: \"awsAuthMiddleware\",\n tags: [\"SIGNATURE\", \"AWSAUTH\"],\n relation: \"after\",\n toMiddleware: \"retryMiddleware\",\n override: true,\n};\nconst getAwsAuthPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.addRelativeTo((0, exports.awsAuthMiddleware)(options), exports.awsAuthMiddlewareOptions);\n },\n});\nexports.getAwsAuthPlugin = getAwsAuthPlugin;\nexports.getSigV4AuthPlugin = exports.getAwsAuthPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./awsAuthConfiguration\"), exports);\ntslib_1.__exportStar(require(\"./awsAuthMiddleware\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSkewCorrectedDate = void 0;\nconst getSkewCorrectedDate = (systemClockOffset) => new Date(Date.now() + systemClockOffset);\nexports.getSkewCorrectedDate = getSkewCorrectedDate;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getUpdatedSystemClockOffset = void 0;\nconst isClockSkewed_1 = require(\"./isClockSkewed\");\nconst getUpdatedSystemClockOffset = (clockTime, currentSystemClockOffset) => {\n const clockTimeInMs = Date.parse(clockTime);\n if ((0, isClockSkewed_1.isClockSkewed)(clockTimeInMs, currentSystemClockOffset)) {\n return clockTimeInMs - Date.now();\n }\n return currentSystemClockOffset;\n};\nexports.getUpdatedSystemClockOffset = getUpdatedSystemClockOffset;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isClockSkewed = void 0;\nconst getSkewCorrectedDate_1 = require(\"./getSkewCorrectedDate\");\nconst isClockSkewed = (clockTime, systemClockOffset) => Math.abs((0, getSkewCorrectedDate_1.getSkewCorrectedDate)(systemClockOffset).getTime() - clockTime) >= 300000;\nexports.isClockSkewed = isClockSkewed;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveUserAgentConfig = void 0;\nfunction resolveUserAgentConfig(input) {\n return {\n ...input,\n customUserAgent: typeof input.customUserAgent === \"string\" ? [[input.customUserAgent]] : input.customUserAgent,\n };\n}\nexports.resolveUserAgentConfig = resolveUserAgentConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UA_ESCAPE_CHAR = exports.UA_VALUE_ESCAPE_REGEX = exports.UA_NAME_ESCAPE_REGEX = exports.UA_NAME_SEPARATOR = exports.SPACE = exports.X_AMZ_USER_AGENT = exports.USER_AGENT = void 0;\nexports.USER_AGENT = \"user-agent\";\nexports.X_AMZ_USER_AGENT = \"x-amz-user-agent\";\nexports.SPACE = \" \";\nexports.UA_NAME_SEPARATOR = \"/\";\nexports.UA_NAME_ESCAPE_REGEX = /[^\\!\\$\\%\\&\\'\\*\\+\\-\\.\\^\\_\\`\\|\\~\\d\\w]/g;\nexports.UA_VALUE_ESCAPE_REGEX = /[^\\!\\$\\%\\&\\'\\*\\+\\-\\.\\^\\_\\`\\|\\~\\d\\w\\#]/g;\nexports.UA_ESCAPE_CHAR = \"-\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./configurations\"), exports);\ntslib_1.__exportStar(require(\"./user-agent-middleware\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getUserAgentPlugin = exports.getUserAgentMiddlewareOptions = exports.userAgentMiddleware = void 0;\nconst util_endpoints_1 = require(\"@aws-sdk/util-endpoints\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst constants_1 = require(\"./constants\");\nconst userAgentMiddleware = (options) => (next, context) => async (args) => {\n var _a, _b;\n const { request } = args;\n if (!protocol_http_1.HttpRequest.isInstance(request))\n return next(args);\n const { headers } = request;\n const userAgent = ((_a = context === null || context === void 0 ? void 0 : context.userAgent) === null || _a === void 0 ? void 0 : _a.map(escapeUserAgent)) || [];\n const defaultUserAgent = (await options.defaultUserAgentProvider()).map(escapeUserAgent);\n const customUserAgent = ((_b = options === null || options === void 0 ? void 0 : options.customUserAgent) === null || _b === void 0 ? void 0 : _b.map(escapeUserAgent)) || [];\n const prefix = (0, util_endpoints_1.getUserAgentPrefix)();\n const sdkUserAgentValue = (prefix ? [prefix] : [])\n .concat([...defaultUserAgent, ...userAgent, ...customUserAgent])\n .join(constants_1.SPACE);\n const normalUAValue = [\n ...defaultUserAgent.filter((section) => section.startsWith(\"aws-sdk-\")),\n ...customUserAgent,\n ].join(constants_1.SPACE);\n if (options.runtime !== \"browser\") {\n if (normalUAValue) {\n headers[constants_1.X_AMZ_USER_AGENT] = headers[constants_1.X_AMZ_USER_AGENT]\n ? `${headers[constants_1.USER_AGENT]} ${normalUAValue}`\n : normalUAValue;\n }\n headers[constants_1.USER_AGENT] = sdkUserAgentValue;\n }\n else {\n headers[constants_1.X_AMZ_USER_AGENT] = sdkUserAgentValue;\n }\n return next({\n ...args,\n request,\n });\n};\nexports.userAgentMiddleware = userAgentMiddleware;\nconst escapeUserAgent = (userAgentPair) => {\n var _a;\n const name = userAgentPair[0]\n .split(constants_1.UA_NAME_SEPARATOR)\n .map((part) => part.replace(constants_1.UA_NAME_ESCAPE_REGEX, constants_1.UA_ESCAPE_CHAR))\n .join(constants_1.UA_NAME_SEPARATOR);\n const version = (_a = userAgentPair[1]) === null || _a === void 0 ? void 0 : _a.replace(constants_1.UA_VALUE_ESCAPE_REGEX, constants_1.UA_ESCAPE_CHAR);\n const prefixSeparatorIndex = name.indexOf(constants_1.UA_NAME_SEPARATOR);\n const prefix = name.substring(0, prefixSeparatorIndex);\n let uaName = name.substring(prefixSeparatorIndex + 1);\n if (prefix === \"api\") {\n uaName = uaName.toLowerCase();\n }\n return [prefix, uaName, version]\n .filter((item) => item && item.length > 0)\n .reduce((acc, item, index) => {\n switch (index) {\n case 0:\n return item;\n case 1:\n return `${acc}/${item}`;\n default:\n return `${acc}#${item}`;\n }\n }, \"\");\n};\nexports.getUserAgentMiddlewareOptions = {\n name: \"getUserAgentMiddleware\",\n step: \"build\",\n priority: \"low\",\n tags: [\"SET_USER_AGENT\", \"USER_AGENT\"],\n override: true,\n};\nconst getUserAgentPlugin = (config) => ({\n applyToStack: (clientStack) => {\n clientStack.add((0, exports.userAgentMiddleware)(config), exports.getUserAgentMiddlewareOptions);\n },\n});\nexports.getUserAgentPlugin = getUserAgentPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveAwsRegionExtensionConfiguration = exports.getAwsRegionExtensionConfiguration = void 0;\nconst getAwsRegionExtensionConfiguration = (runtimeConfig) => {\n let runtimeConfigRegion = async () => {\n if (runtimeConfig.region === undefined) {\n throw new Error(\"Region is missing from runtimeConfig\");\n }\n const region = runtimeConfig.region;\n if (typeof region === \"string\") {\n return region;\n }\n return region();\n };\n return {\n setRegion(region) {\n runtimeConfigRegion = region;\n },\n region() {\n return runtimeConfigRegion;\n },\n };\n};\nexports.getAwsRegionExtensionConfiguration = getAwsRegionExtensionConfiguration;\nconst resolveAwsRegionExtensionConfiguration = (awsRegionExtensionConfiguration) => {\n return {\n region: awsRegionExtensionConfiguration.region(),\n };\n};\nexports.resolveAwsRegionExtensionConfiguration = resolveAwsRegionExtensionConfiguration;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./extensions\"), exports);\ntslib_1.__exportStar(require(\"./regionConfig\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_REGION_CONFIG_FILE_OPTIONS = exports.NODE_REGION_CONFIG_OPTIONS = exports.REGION_INI_NAME = exports.REGION_ENV_NAME = void 0;\nexports.REGION_ENV_NAME = \"AWS_REGION\";\nexports.REGION_INI_NAME = \"region\";\nexports.NODE_REGION_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => env[exports.REGION_ENV_NAME],\n configFileSelector: (profile) => profile[exports.REGION_INI_NAME],\n default: () => {\n throw new Error(\"Region is missing\");\n },\n};\nexports.NODE_REGION_CONFIG_FILE_OPTIONS = {\n preferredFile: \"credentials\",\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRealRegion = void 0;\nconst isFipsRegion_1 = require(\"./isFipsRegion\");\nconst getRealRegion = (region) => (0, isFipsRegion_1.isFipsRegion)(region)\n ? [\"fips-aws-global\", \"aws-fips\"].includes(region)\n ? \"us-east-1\"\n : region.replace(/fips-(dkr-|prod-)?|-fips/, \"\")\n : region;\nexports.getRealRegion = getRealRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./config\"), exports);\ntslib_1.__exportStar(require(\"./resolveRegionConfig\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isFipsRegion = void 0;\nconst isFipsRegion = (region) => typeof region === \"string\" && (region.startsWith(\"fips-\") || region.endsWith(\"-fips\"));\nexports.isFipsRegion = isFipsRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRegionConfig = void 0;\nconst getRealRegion_1 = require(\"./getRealRegion\");\nconst isFipsRegion_1 = require(\"./isFipsRegion\");\nconst resolveRegionConfig = (input) => {\n const { region, useFipsEndpoint } = input;\n if (!region) {\n throw new Error(\"Region is missing\");\n }\n return {\n ...input,\n region: async () => {\n if (typeof region === \"string\") {\n return (0, getRealRegion_1.getRealRegion)(region);\n }\n const providedRegion = await region();\n return (0, getRealRegion_1.getRealRegion)(providedRegion);\n },\n useFipsEndpoint: async () => {\n const providedRegion = typeof region === \"string\" ? region : await region();\n if ((0, isFipsRegion_1.isFipsRegion)(providedRegion)) {\n return true;\n }\n return typeof useFipsEndpoint !== \"function\" ? Promise.resolve(!!useFipsEndpoint) : useFipsEndpoint();\n },\n };\n};\nexports.resolveRegionConfig = resolveRegionConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UnsupportedGrantTypeException = exports.UnauthorizedClientException = exports.SlowDownException = exports.SSOOIDCClient = exports.InvalidScopeException = exports.InvalidRequestException = exports.InvalidClientException = exports.InternalServerException = exports.ExpiredTokenException = exports.CreateTokenCommand = exports.AuthorizationPendingException = exports.AccessDeniedException = void 0;\nconst middleware_host_header_1 = require(\"@aws-sdk/middleware-host-header\");\nconst middleware_logger_1 = require(\"@aws-sdk/middleware-logger\");\nconst middleware_recursion_detection_1 = require(\"@aws-sdk/middleware-recursion-detection\");\nconst middleware_user_agent_1 = require(\"@aws-sdk/middleware-user-agent\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst middleware_content_length_1 = require(\"@smithy/middleware-content-length\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nvar resolveClientEndpointParameters = (options) => {\n var _a, _b;\n return {\n ...options,\n useDualstackEndpoint: (_a = options.useDualstackEndpoint) !== null && _a !== void 0 ? _a : false,\n useFipsEndpoint: (_b = options.useFipsEndpoint) !== null && _b !== void 0 ? _b : false,\n defaultSigningName: \"awsssooidc\",\n };\n};\nvar package_default = { version: \"3.429.0\" };\nconst util_user_agent_node_1 = require(\"@aws-sdk/util-user-agent-node\");\nconst config_resolver_2 = require(\"@smithy/config-resolver\");\nconst hash_node_1 = require(\"@smithy/hash-node\");\nconst middleware_retry_2 = require(\"@smithy/middleware-retry\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_body_length_node_1 = require(\"@smithy/util-body-length-node\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst smithy_client_2 = require(\"@smithy/smithy-client\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst util_endpoints_1 = require(\"@aws-sdk/util-endpoints\");\nvar s = \"required\";\nvar t = \"fn\";\nvar u = \"argv\";\nvar v = \"ref\";\nvar a = \"isSet\";\nvar b = \"tree\";\nvar c = \"error\";\nvar d = \"endpoint\";\nvar e = \"PartitionResult\";\nvar f = \"getAttr\";\nvar g = { [s]: false, type: \"String\" };\nvar h = { [s]: true, default: false, type: \"Boolean\" };\nvar i = { [v]: \"Endpoint\" };\nvar j = { [t]: \"booleanEquals\", [u]: [{ [v]: \"UseFIPS\" }, true] };\nvar k = { [t]: \"booleanEquals\", [u]: [{ [v]: \"UseDualStack\" }, true] };\nvar l = {};\nvar m = { [t]: \"booleanEquals\", [u]: [true, { [t]: f, [u]: [{ [v]: e }, \"supportsFIPS\"] }] };\nvar n = { [v]: e };\nvar o = { [t]: \"booleanEquals\", [u]: [true, { [t]: f, [u]: [n, \"supportsDualStack\"] }] };\nvar p = [j];\nvar q = [k];\nvar r = [{ [v]: \"Region\" }];\nvar _data = {\n version: \"1.0\",\n parameters: { Region: g, UseDualStack: h, UseFIPS: h, Endpoint: g },\n rules: [\n {\n conditions: [{ [t]: a, [u]: [i] }],\n type: b,\n rules: [\n { conditions: p, error: \"Invalid Configuration: FIPS and custom endpoint are not supported\", type: c },\n { conditions: q, error: \"Invalid Configuration: Dualstack and custom endpoint are not supported\", type: c },\n { endpoint: { url: i, properties: l, headers: l }, type: d },\n ],\n },\n {\n conditions: [{ [t]: a, [u]: r }],\n type: b,\n rules: [\n {\n conditions: [{ [t]: \"aws.partition\", [u]: r, assign: e }],\n type: b,\n rules: [\n {\n conditions: [j, k],\n type: b,\n rules: [\n {\n conditions: [m, o],\n type: b,\n rules: [\n {\n endpoint: {\n url: \"https://oidc-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n properties: l,\n headers: l,\n },\n type: d,\n },\n ],\n },\n { error: \"FIPS and DualStack are enabled, but this partition does not support one or both\", type: c },\n ],\n },\n {\n conditions: p,\n type: b,\n rules: [\n {\n conditions: [m],\n type: b,\n rules: [\n {\n conditions: [{ [t]: \"stringEquals\", [u]: [\"aws-us-gov\", { [t]: f, [u]: [n, \"name\"] }] }],\n endpoint: { url: \"https://oidc.{Region}.amazonaws.com\", properties: l, headers: l },\n type: d,\n },\n {\n endpoint: {\n url: \"https://oidc-fips.{Region}.{PartitionResult#dnsSuffix}\",\n properties: l,\n headers: l,\n },\n type: d,\n },\n ],\n },\n { error: \"FIPS is enabled but this partition does not support FIPS\", type: c },\n ],\n },\n {\n conditions: q,\n type: b,\n rules: [\n {\n conditions: [o],\n type: b,\n rules: [\n {\n endpoint: {\n url: \"https://oidc.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n properties: l,\n headers: l,\n },\n type: d,\n },\n ],\n },\n { error: \"DualStack is enabled but this partition does not support DualStack\", type: c },\n ],\n },\n {\n endpoint: { url: \"https://oidc.{Region}.{PartitionResult#dnsSuffix}\", properties: l, headers: l },\n type: d,\n },\n ],\n },\n ],\n },\n { error: \"Invalid Configuration: Missing Region\", type: c },\n ],\n};\nvar ruleSet = _data;\nvar defaultEndpointResolver = (endpointParams, context = {}) => {\n return (0, util_endpoints_1.resolveEndpoint)(ruleSet, {\n endpointParams,\n logger: context.logger,\n });\n};\nvar getRuntimeConfig = (config) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n return ({\n apiVersion: \"2019-06-10\",\n base64Decoder: (_a = config === null || config === void 0 ? void 0 : config.base64Decoder) !== null && _a !== void 0 ? _a : util_base64_1.fromBase64,\n base64Encoder: (_b = config === null || config === void 0 ? void 0 : config.base64Encoder) !== null && _b !== void 0 ? _b : util_base64_1.toBase64,\n disableHostPrefix: (_c = config === null || config === void 0 ? void 0 : config.disableHostPrefix) !== null && _c !== void 0 ? _c : false,\n endpointProvider: (_d = config === null || config === void 0 ? void 0 : config.endpointProvider) !== null && _d !== void 0 ? _d : defaultEndpointResolver,\n extensions: (_e = config === null || config === void 0 ? void 0 : config.extensions) !== null && _e !== void 0 ? _e : [],\n logger: (_f = config === null || config === void 0 ? void 0 : config.logger) !== null && _f !== void 0 ? _f : new smithy_client_2.NoOpLogger(),\n serviceId: (_g = config === null || config === void 0 ? void 0 : config.serviceId) !== null && _g !== void 0 ? _g : \"SSO OIDC\",\n urlParser: (_h = config === null || config === void 0 ? void 0 : config.urlParser) !== null && _h !== void 0 ? _h : url_parser_1.parseUrl,\n utf8Decoder: (_j = config === null || config === void 0 ? void 0 : config.utf8Decoder) !== null && _j !== void 0 ? _j : util_utf8_1.fromUtf8,\n utf8Encoder: (_k = config === null || config === void 0 ? void 0 : config.utf8Encoder) !== null && _k !== void 0 ? _k : util_utf8_1.toUtf8,\n });\n};\nconst smithy_client_3 = require(\"@smithy/smithy-client\");\nconst util_defaults_mode_node_1 = require(\"@smithy/util-defaults-mode-node\");\nconst smithy_client_4 = require(\"@smithy/smithy-client\");\nvar getRuntimeConfig2 = (config) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n (0, smithy_client_4.emitWarningIfUnsupportedVersion)(process.version);\n const defaultsMode = (0, util_defaults_mode_node_1.resolveDefaultsModeConfig)(config);\n const defaultConfigProvider = () => defaultsMode().then(smithy_client_3.loadConfigsForDefaultMode);\n const clientSharedValues = getRuntimeConfig(config);\n return {\n ...clientSharedValues,\n ...config,\n runtime: \"node\",\n defaultsMode,\n bodyLengthChecker: (_a = config === null || config === void 0 ? void 0 : config.bodyLengthChecker) !== null && _a !== void 0 ? _a : util_body_length_node_1.calculateBodyLength,\n defaultUserAgentProvider: (_b = config === null || config === void 0 ? void 0 : config.defaultUserAgentProvider) !== null && _b !== void 0 ? _b : (0, util_user_agent_node_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_default.version }),\n maxAttempts: (_c = config === null || config === void 0 ? void 0 : config.maxAttempts) !== null && _c !== void 0 ? _c : (0, node_config_provider_1.loadConfig)(middleware_retry_2.NODE_MAX_ATTEMPT_CONFIG_OPTIONS),\n region: (_d = config === null || config === void 0 ? void 0 : config.region) !== null && _d !== void 0 ? _d : (0, node_config_provider_1.loadConfig)(config_resolver_2.NODE_REGION_CONFIG_OPTIONS, config_resolver_2.NODE_REGION_CONFIG_FILE_OPTIONS),\n requestHandler: (_e = config === null || config === void 0 ? void 0 : config.requestHandler) !== null && _e !== void 0 ? _e : new node_http_handler_1.NodeHttpHandler(defaultConfigProvider),\n retryMode: (_f = config === null || config === void 0 ? void 0 : config.retryMode) !== null && _f !== void 0 ? _f : (0, node_config_provider_1.loadConfig)({\n ...middleware_retry_2.NODE_RETRY_MODE_CONFIG_OPTIONS,\n default: async () => (await defaultConfigProvider()).retryMode || util_retry_1.DEFAULT_RETRY_MODE,\n }),\n sha256: (_g = config === null || config === void 0 ? void 0 : config.sha256) !== null && _g !== void 0 ? _g : hash_node_1.Hash.bind(null, \"sha256\"),\n streamCollector: (_h = config === null || config === void 0 ? void 0 : config.streamCollector) !== null && _h !== void 0 ? _h : node_http_handler_1.streamCollector,\n useDualstackEndpoint: (_j = config === null || config === void 0 ? void 0 : config.useDualstackEndpoint) !== null && _j !== void 0 ? _j : (0, node_config_provider_1.loadConfig)(config_resolver_2.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS),\n useFipsEndpoint: (_k = config === null || config === void 0 ? void 0 : config.useFipsEndpoint) !== null && _k !== void 0 ? _k : (0, node_config_provider_1.loadConfig)(config_resolver_2.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS),\n };\n};\nconst region_config_resolver_1 = require(\"@aws-sdk/region-config-resolver\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_5 = require(\"@smithy/smithy-client\");\nvar asPartial = (t2) => t2;\nvar resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n const extensionConfiguration = {\n ...asPartial((0, region_config_resolver_1.getAwsRegionExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, smithy_client_5.getDefaultExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, protocol_http_1.getHttpHandlerExtensionConfiguration)(runtimeConfig)),\n };\n extensions.forEach((extension) => extension.configure(extensionConfiguration));\n return {\n ...runtimeConfig,\n ...(0, region_config_resolver_1.resolveAwsRegionExtensionConfiguration)(extensionConfiguration),\n ...(0, smithy_client_5.resolveDefaultRuntimeConfig)(extensionConfiguration),\n ...(0, protocol_http_1.resolveHttpHandlerRuntimeConfig)(extensionConfiguration),\n };\n};\nvar SSOOIDCClient = class extends smithy_client_1.Client {\n constructor(...[configuration]) {\n const _config_0 = getRuntimeConfig2(configuration || {});\n const _config_1 = resolveClientEndpointParameters(_config_0);\n const _config_2 = (0, config_resolver_1.resolveRegionConfig)(_config_1);\n const _config_3 = (0, middleware_endpoint_1.resolveEndpointConfig)(_config_2);\n const _config_4 = (0, middleware_retry_1.resolveRetryConfig)(_config_3);\n const _config_5 = (0, middleware_host_header_1.resolveHostHeaderConfig)(_config_4);\n const _config_6 = (0, middleware_user_agent_1.resolveUserAgentConfig)(_config_5);\n const _config_7 = resolveRuntimeExtensions(_config_6, (configuration === null || configuration === void 0 ? void 0 : configuration.extensions) || []);\n super(_config_7);\n this.config = _config_7;\n this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));\n this.middlewareStack.use((0, middleware_content_length_1.getContentLengthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_host_header_1.getHostHeaderPlugin)(this.config));\n this.middlewareStack.use((0, middleware_logger_1.getLoggerPlugin)(this.config));\n this.middlewareStack.use((0, middleware_recursion_detection_1.getRecursionDetectionPlugin)(this.config));\n this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));\n }\n destroy() {\n super.destroy();\n }\n};\nexports.SSOOIDCClient = SSOOIDCClient;\nconst smithy_client_6 = require(\"@smithy/smithy-client\");\nconst middleware_endpoint_2 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_7 = require(\"@smithy/smithy-client\");\nconst types_1 = require(\"@smithy/types\");\nconst protocol_http_2 = require(\"@smithy/protocol-http\");\nconst smithy_client_8 = require(\"@smithy/smithy-client\");\nconst smithy_client_9 = require(\"@smithy/smithy-client\");\nvar SSOOIDCServiceException = class _SSOOIDCServiceException extends smithy_client_9.ServiceException {\n constructor(options) {\n super(options);\n Object.setPrototypeOf(this, _SSOOIDCServiceException.prototype);\n }\n};\nvar AccessDeniedException = class _AccessDeniedException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"AccessDeniedException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"AccessDeniedException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _AccessDeniedException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.AccessDeniedException = AccessDeniedException;\nvar AuthorizationPendingException = class _AuthorizationPendingException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"AuthorizationPendingException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"AuthorizationPendingException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _AuthorizationPendingException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.AuthorizationPendingException = AuthorizationPendingException;\nvar ExpiredTokenException = class _ExpiredTokenException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"ExpiredTokenException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ExpiredTokenException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _ExpiredTokenException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.ExpiredTokenException = ExpiredTokenException;\nvar InternalServerException = class _InternalServerException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InternalServerException\",\n $fault: \"server\",\n ...opts,\n });\n this.name = \"InternalServerException\";\n this.$fault = \"server\";\n Object.setPrototypeOf(this, _InternalServerException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.InternalServerException = InternalServerException;\nvar InvalidClientException = class _InvalidClientException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InvalidClientException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidClientException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _InvalidClientException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.InvalidClientException = InvalidClientException;\nvar InvalidGrantException = class _InvalidGrantException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InvalidGrantException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidGrantException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _InvalidGrantException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nvar InvalidRequestException = class _InvalidRequestException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InvalidRequestException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidRequestException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _InvalidRequestException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.InvalidRequestException = InvalidRequestException;\nvar InvalidScopeException = class _InvalidScopeException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InvalidScopeException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidScopeException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _InvalidScopeException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.InvalidScopeException = InvalidScopeException;\nvar SlowDownException = class _SlowDownException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"SlowDownException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"SlowDownException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _SlowDownException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.SlowDownException = SlowDownException;\nvar UnauthorizedClientException = class _UnauthorizedClientException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"UnauthorizedClientException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"UnauthorizedClientException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _UnauthorizedClientException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.UnauthorizedClientException = UnauthorizedClientException;\nvar UnsupportedGrantTypeException = class _UnsupportedGrantTypeException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"UnsupportedGrantTypeException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"UnsupportedGrantTypeException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _UnsupportedGrantTypeException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.UnsupportedGrantTypeException = UnsupportedGrantTypeException;\nvar InvalidClientMetadataException = class _InvalidClientMetadataException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InvalidClientMetadataException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidClientMetadataException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _InvalidClientMetadataException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nvar se_CreateTokenCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = {\n \"content-type\": \"application/json\",\n };\n const resolvedPath = `${(basePath === null || basePath === void 0 ? void 0 : basePath.endsWith(\"/\")) ? basePath.slice(0, -1) : basePath || \"\"}/token`;\n let body;\n body = JSON.stringify((0, smithy_client_8.take)(input, {\n clientId: [],\n clientSecret: [],\n code: [],\n deviceCode: [],\n grantType: [],\n redirectUri: [],\n refreshToken: [],\n scope: (_) => (0, smithy_client_8._json)(_),\n }));\n return new protocol_http_2.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"POST\",\n headers,\n path: resolvedPath,\n body,\n });\n};\nvar se_RegisterClientCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = {\n \"content-type\": \"application/json\",\n };\n const resolvedPath = `${(basePath === null || basePath === void 0 ? void 0 : basePath.endsWith(\"/\")) ? basePath.slice(0, -1) : basePath || \"\"}/client/register`;\n let body;\n body = JSON.stringify((0, smithy_client_8.take)(input, {\n clientName: [],\n clientType: [],\n scopes: (_) => (0, smithy_client_8._json)(_),\n }));\n return new protocol_http_2.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"POST\",\n headers,\n path: resolvedPath,\n body,\n });\n};\nvar se_StartDeviceAuthorizationCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = {\n \"content-type\": \"application/json\",\n };\n const resolvedPath = `${(basePath === null || basePath === void 0 ? void 0 : basePath.endsWith(\"/\")) ? basePath.slice(0, -1) : basePath || \"\"}/device_authorization`;\n let body;\n body = JSON.stringify((0, smithy_client_8.take)(input, {\n clientId: [],\n clientSecret: [],\n startUrl: [],\n }));\n return new protocol_http_2.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"POST\",\n headers,\n path: resolvedPath,\n body,\n });\n};\nvar de_CreateTokenCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_CreateTokenCommandError(output, context);\n }\n const contents = (0, smithy_client_8.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_8.expectNonNull)((0, smithy_client_8.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_8.take)(data, {\n accessToken: smithy_client_8.expectString,\n expiresIn: smithy_client_8.expectInt32,\n idToken: smithy_client_8.expectString,\n refreshToken: smithy_client_8.expectString,\n tokenType: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n return contents;\n};\nvar de_CreateTokenCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"AccessDeniedException\":\n case \"com.amazonaws.ssooidc#AccessDeniedException\":\n throw await de_AccessDeniedExceptionRes(parsedOutput, context);\n case \"AuthorizationPendingException\":\n case \"com.amazonaws.ssooidc#AuthorizationPendingException\":\n throw await de_AuthorizationPendingExceptionRes(parsedOutput, context);\n case \"ExpiredTokenException\":\n case \"com.amazonaws.ssooidc#ExpiredTokenException\":\n throw await de_ExpiredTokenExceptionRes(parsedOutput, context);\n case \"InternalServerException\":\n case \"com.amazonaws.ssooidc#InternalServerException\":\n throw await de_InternalServerExceptionRes(parsedOutput, context);\n case \"InvalidClientException\":\n case \"com.amazonaws.ssooidc#InvalidClientException\":\n throw await de_InvalidClientExceptionRes(parsedOutput, context);\n case \"InvalidGrantException\":\n case \"com.amazonaws.ssooidc#InvalidGrantException\":\n throw await de_InvalidGrantExceptionRes(parsedOutput, context);\n case \"InvalidRequestException\":\n case \"com.amazonaws.ssooidc#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"InvalidScopeException\":\n case \"com.amazonaws.ssooidc#InvalidScopeException\":\n throw await de_InvalidScopeExceptionRes(parsedOutput, context);\n case \"SlowDownException\":\n case \"com.amazonaws.ssooidc#SlowDownException\":\n throw await de_SlowDownExceptionRes(parsedOutput, context);\n case \"UnauthorizedClientException\":\n case \"com.amazonaws.ssooidc#UnauthorizedClientException\":\n throw await de_UnauthorizedClientExceptionRes(parsedOutput, context);\n case \"UnsupportedGrantTypeException\":\n case \"com.amazonaws.ssooidc#UnsupportedGrantTypeException\":\n throw await de_UnsupportedGrantTypeExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nvar de_RegisterClientCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_RegisterClientCommandError(output, context);\n }\n const contents = (0, smithy_client_8.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_8.expectNonNull)((0, smithy_client_8.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_8.take)(data, {\n authorizationEndpoint: smithy_client_8.expectString,\n clientId: smithy_client_8.expectString,\n clientIdIssuedAt: smithy_client_8.expectLong,\n clientSecret: smithy_client_8.expectString,\n clientSecretExpiresAt: smithy_client_8.expectLong,\n tokenEndpoint: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n return contents;\n};\nvar de_RegisterClientCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalServerException\":\n case \"com.amazonaws.ssooidc#InternalServerException\":\n throw await de_InternalServerExceptionRes(parsedOutput, context);\n case \"InvalidClientMetadataException\":\n case \"com.amazonaws.ssooidc#InvalidClientMetadataException\":\n throw await de_InvalidClientMetadataExceptionRes(parsedOutput, context);\n case \"InvalidRequestException\":\n case \"com.amazonaws.ssooidc#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"InvalidScopeException\":\n case \"com.amazonaws.ssooidc#InvalidScopeException\":\n throw await de_InvalidScopeExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nvar de_StartDeviceAuthorizationCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_StartDeviceAuthorizationCommandError(output, context);\n }\n const contents = (0, smithy_client_8.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_8.expectNonNull)((0, smithy_client_8.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_8.take)(data, {\n deviceCode: smithy_client_8.expectString,\n expiresIn: smithy_client_8.expectInt32,\n interval: smithy_client_8.expectInt32,\n userCode: smithy_client_8.expectString,\n verificationUri: smithy_client_8.expectString,\n verificationUriComplete: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n return contents;\n};\nvar de_StartDeviceAuthorizationCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalServerException\":\n case \"com.amazonaws.ssooidc#InternalServerException\":\n throw await de_InternalServerExceptionRes(parsedOutput, context);\n case \"InvalidClientException\":\n case \"com.amazonaws.ssooidc#InvalidClientException\":\n throw await de_InvalidClientExceptionRes(parsedOutput, context);\n case \"InvalidRequestException\":\n case \"com.amazonaws.ssooidc#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"SlowDownException\":\n case \"com.amazonaws.ssooidc#SlowDownException\":\n throw await de_SlowDownExceptionRes(parsedOutput, context);\n case \"UnauthorizedClientException\":\n case \"com.amazonaws.ssooidc#UnauthorizedClientException\":\n throw await de_UnauthorizedClientExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nvar throwDefaultError = (0, smithy_client_8.withBaseException)(SSOOIDCServiceException);\nvar de_AccessDeniedExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new AccessDeniedException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_AuthorizationPendingExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new AuthorizationPendingException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_ExpiredTokenExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new ExpiredTokenException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InternalServerExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InternalServerException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InvalidClientExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InvalidClientException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InvalidClientMetadataExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InvalidClientMetadataException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InvalidGrantExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InvalidGrantException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InvalidRequestExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InvalidRequestException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InvalidScopeExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InvalidScopeException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_SlowDownExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new SlowDownException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_UnauthorizedClientExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new UnauthorizedClientException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_UnsupportedGrantTypeExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new UnsupportedGrantTypeException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar deserializeMetadata = (output) => {\n var _a, _b;\n return ({\n httpStatusCode: output.statusCode,\n requestId: (_b = (_a = output.headers[\"x-amzn-requestid\"]) !== null && _a !== void 0 ? _a : output.headers[\"x-amzn-request-id\"]) !== null && _b !== void 0 ? _b : output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n });\n};\nvar collectBodyString = (streamBody, context) => (0, smithy_client_8.collectBody)(streamBody, context).then((body) => context.utf8Encoder(body));\nvar parseBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n if (encoded.length) {\n return JSON.parse(encoded);\n }\n return {};\n});\nvar parseErrorBody = async (errorBody, context) => {\n var _a;\n const value = await parseBody(errorBody, context);\n value.message = (_a = value.message) !== null && _a !== void 0 ? _a : value.Message;\n return value;\n};\nvar loadRestJsonErrorCode = (output, data) => {\n const findKey = (object, key) => Object.keys(object).find((k2) => k2.toLowerCase() === key.toLowerCase());\n const sanitizeErrorCode = (rawValue) => {\n let cleanValue = rawValue;\n if (typeof cleanValue === \"number\") {\n cleanValue = cleanValue.toString();\n }\n if (cleanValue.indexOf(\",\") >= 0) {\n cleanValue = cleanValue.split(\",\")[0];\n }\n if (cleanValue.indexOf(\":\") >= 0) {\n cleanValue = cleanValue.split(\":\")[0];\n }\n if (cleanValue.indexOf(\"#\") >= 0) {\n cleanValue = cleanValue.split(\"#\")[1];\n }\n return cleanValue;\n };\n const headerKey = findKey(output.headers, \"x-amzn-errortype\");\n if (headerKey !== void 0) {\n return sanitizeErrorCode(output.headers[headerKey]);\n }\n if (data.code !== void 0) {\n return sanitizeErrorCode(data.code);\n }\n if (data[\"__type\"] !== void 0) {\n return sanitizeErrorCode(data[\"__type\"]);\n }\n};\nvar CreateTokenCommand = class _CreateTokenCommand extends smithy_client_7.Command {\n constructor(input) {\n super();\n this.input = input;\n }\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_2.getEndpointPlugin)(configuration, _CreateTokenCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOOIDCClient\";\n const commandName = \"CreateTokenCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSSOOIDCService\",\n operation: \"CreateToken\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return se_CreateTokenCommand(input, context);\n }\n deserialize(output, context) {\n return de_CreateTokenCommand(output, context);\n }\n};\nexports.CreateTokenCommand = CreateTokenCommand;\nconst middleware_endpoint_3 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_2 = require(\"@smithy/middleware-serde\");\nconst smithy_client_10 = require(\"@smithy/smithy-client\");\nconst types_2 = require(\"@smithy/types\");\nvar RegisterClientCommand = class _RegisterClientCommand extends smithy_client_10.Command {\n constructor(input) {\n super();\n this.input = input;\n }\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_2.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_3.getEndpointPlugin)(configuration, _RegisterClientCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOOIDCClient\";\n const commandName = \"RegisterClientCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_2.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSSOOIDCService\",\n operation: \"RegisterClient\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return se_RegisterClientCommand(input, context);\n }\n deserialize(output, context) {\n return de_RegisterClientCommand(output, context);\n }\n};\nconst middleware_endpoint_4 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_3 = require(\"@smithy/middleware-serde\");\nconst smithy_client_11 = require(\"@smithy/smithy-client\");\nconst types_3 = require(\"@smithy/types\");\nvar StartDeviceAuthorizationCommand = class _StartDeviceAuthorizationCommand extends smithy_client_11.Command {\n constructor(input) {\n super();\n this.input = input;\n }\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_3.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_4.getEndpointPlugin)(configuration, _StartDeviceAuthorizationCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOOIDCClient\";\n const commandName = \"StartDeviceAuthorizationCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_3.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSSOOIDCService\",\n operation: \"StartDeviceAuthorization\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return se_StartDeviceAuthorizationCommand(input, context);\n }\n deserialize(output, context) {\n return de_StartDeviceAuthorizationCommand(output, context);\n }\n};\nvar commands = {\n CreateTokenCommand,\n RegisterClientCommand,\n StartDeviceAuthorizationCommand,\n};\nvar SSOOIDC = class extends SSOOIDCClient {\n};\n(0, smithy_client_6.createAggregatedClient)(commands, SSOOIDC);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.REFRESH_MESSAGE = exports.EXPIRE_WINDOW_MS = void 0;\nexports.EXPIRE_WINDOW_MS = 5 * 60 * 1000;\nexports.REFRESH_MESSAGE = `To refresh this SSO session run 'aws sso login' with the corresponding profile.`;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromSso = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst constants_1 = require(\"./constants\");\nconst getNewSsoOidcToken_1 = require(\"./getNewSsoOidcToken\");\nconst validateTokenExpiry_1 = require(\"./validateTokenExpiry\");\nconst validateTokenKey_1 = require(\"./validateTokenKey\");\nconst writeSSOTokenToFile_1 = require(\"./writeSSOTokenToFile\");\nconst lastRefreshAttemptTime = new Date(0);\nconst fromSso = (init = {}) => async () => {\n const profiles = await (0, shared_ini_file_loader_1.parseKnownFiles)(init);\n const profileName = (0, shared_ini_file_loader_1.getProfileName)(init);\n const profile = profiles[profileName];\n if (!profile) {\n throw new property_provider_1.TokenProviderError(`Profile '${profileName}' could not be found in shared credentials file.`, false);\n }\n else if (!profile[\"sso_session\"]) {\n throw new property_provider_1.TokenProviderError(`Profile '${profileName}' is missing required property 'sso_session'.`);\n }\n const ssoSessionName = profile[\"sso_session\"];\n const ssoSessions = await (0, shared_ini_file_loader_1.loadSsoSessionData)(init);\n const ssoSession = ssoSessions[ssoSessionName];\n if (!ssoSession) {\n throw new property_provider_1.TokenProviderError(`Sso session '${ssoSessionName}' could not be found in shared credentials file.`, false);\n }\n for (const ssoSessionRequiredKey of [\"sso_start_url\", \"sso_region\"]) {\n if (!ssoSession[ssoSessionRequiredKey]) {\n throw new property_provider_1.TokenProviderError(`Sso session '${ssoSessionName}' is missing required property '${ssoSessionRequiredKey}'.`, false);\n }\n }\n const ssoStartUrl = ssoSession[\"sso_start_url\"];\n const ssoRegion = ssoSession[\"sso_region\"];\n let ssoToken;\n try {\n ssoToken = await (0, shared_ini_file_loader_1.getSSOTokenFromFile)(ssoSessionName);\n }\n catch (e) {\n throw new property_provider_1.TokenProviderError(`The SSO session token associated with profile=${profileName} was not found or is invalid. ${constants_1.REFRESH_MESSAGE}`, false);\n }\n (0, validateTokenKey_1.validateTokenKey)(\"accessToken\", ssoToken.accessToken);\n (0, validateTokenKey_1.validateTokenKey)(\"expiresAt\", ssoToken.expiresAt);\n const { accessToken, expiresAt } = ssoToken;\n const existingToken = { token: accessToken, expiration: new Date(expiresAt) };\n if (existingToken.expiration.getTime() - Date.now() > constants_1.EXPIRE_WINDOW_MS) {\n return existingToken;\n }\n if (Date.now() - lastRefreshAttemptTime.getTime() < 30 * 1000) {\n (0, validateTokenExpiry_1.validateTokenExpiry)(existingToken);\n return existingToken;\n }\n (0, validateTokenKey_1.validateTokenKey)(\"clientId\", ssoToken.clientId, true);\n (0, validateTokenKey_1.validateTokenKey)(\"clientSecret\", ssoToken.clientSecret, true);\n (0, validateTokenKey_1.validateTokenKey)(\"refreshToken\", ssoToken.refreshToken, true);\n try {\n lastRefreshAttemptTime.setTime(Date.now());\n const newSsoOidcToken = await (0, getNewSsoOidcToken_1.getNewSsoOidcToken)(ssoToken, ssoRegion);\n (0, validateTokenKey_1.validateTokenKey)(\"accessToken\", newSsoOidcToken.accessToken);\n (0, validateTokenKey_1.validateTokenKey)(\"expiresIn\", newSsoOidcToken.expiresIn);\n const newTokenExpiration = new Date(Date.now() + newSsoOidcToken.expiresIn * 1000);\n try {\n await (0, writeSSOTokenToFile_1.writeSSOTokenToFile)(ssoSessionName, {\n ...ssoToken,\n accessToken: newSsoOidcToken.accessToken,\n expiresAt: newTokenExpiration.toISOString(),\n refreshToken: newSsoOidcToken.refreshToken,\n });\n }\n catch (error) {\n }\n return {\n token: newSsoOidcToken.accessToken,\n expiration: newTokenExpiration,\n };\n }\n catch (error) {\n (0, validateTokenExpiry_1.validateTokenExpiry)(existingToken);\n return existingToken;\n }\n};\nexports.fromSso = fromSso;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromStatic = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromStatic = ({ token }) => async () => {\n if (!token || !token.token) {\n throw new property_provider_1.TokenProviderError(`Please pass a valid token to fromStatic`, false);\n }\n return token;\n};\nexports.fromStatic = fromStatic;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getNewSsoOidcToken = void 0;\nconst client_sso_oidc_node_1 = require(\"./bundle/client-sso-oidc-node\");\nconst getSsoOidcClient_1 = require(\"./getSsoOidcClient\");\nconst getNewSsoOidcToken = (ssoToken, ssoRegion) => {\n const ssoOidcClient = (0, getSsoOidcClient_1.getSsoOidcClient)(ssoRegion);\n return ssoOidcClient.send(new client_sso_oidc_node_1.CreateTokenCommand({\n clientId: ssoToken.clientId,\n clientSecret: ssoToken.clientSecret,\n refreshToken: ssoToken.refreshToken,\n grantType: \"refresh_token\",\n }));\n};\nexports.getNewSsoOidcToken = getNewSsoOidcToken;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSsoOidcClient = void 0;\nconst client_sso_oidc_node_1 = require(\"./bundle/client-sso-oidc-node\");\nconst ssoOidcClientsHash = {};\nconst getSsoOidcClient = (ssoRegion) => {\n if (ssoOidcClientsHash[ssoRegion]) {\n return ssoOidcClientsHash[ssoRegion];\n }\n const ssoOidcClient = new client_sso_oidc_node_1.SSOOIDCClient({ region: ssoRegion });\n ssoOidcClientsHash[ssoRegion] = ssoOidcClient;\n return ssoOidcClient;\n};\nexports.getSsoOidcClient = getSsoOidcClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./bundle/client-sso-oidc-node\"), exports);\ntslib_1.__exportStar(require(\"./fromSso\"), exports);\ntslib_1.__exportStar(require(\"./fromStatic\"), exports);\ntslib_1.__exportStar(require(\"./nodeProvider\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.nodeProvider = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromSso_1 = require(\"./fromSso\");\nconst nodeProvider = (init = {}) => (0, property_provider_1.memoize)((0, property_provider_1.chain)((0, fromSso_1.fromSso)(init), async () => {\n throw new property_provider_1.TokenProviderError(\"Could not load token from any providers\", false);\n}), (token) => token.expiration !== undefined && token.expiration.getTime() - Date.now() < 300000, (token) => token.expiration !== undefined);\nexports.nodeProvider = nodeProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateTokenExpiry = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst constants_1 = require(\"./constants\");\nconst validateTokenExpiry = (token) => {\n if (token.expiration && token.expiration.getTime() < Date.now()) {\n throw new property_provider_1.TokenProviderError(`Token is expired. ${constants_1.REFRESH_MESSAGE}`, false);\n }\n};\nexports.validateTokenExpiry = validateTokenExpiry;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateTokenKey = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst constants_1 = require(\"./constants\");\nconst validateTokenKey = (key, value, forRefresh = false) => {\n if (typeof value === \"undefined\") {\n throw new property_provider_1.TokenProviderError(`Value not present for '${key}' in SSO Token${forRefresh ? \". Cannot refresh\" : \"\"}. ${constants_1.REFRESH_MESSAGE}`, false);\n }\n};\nexports.validateTokenKey = validateTokenKey;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.writeSSOTokenToFile = void 0;\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst fs_1 = require(\"fs\");\nconst { writeFile } = fs_1.promises;\nconst writeSSOTokenToFile = (id, ssoToken) => {\n const tokenFilepath = (0, shared_ini_file_loader_1.getSSOTokenFilepath)(id);\n const tokenString = JSON.stringify(ssoToken, null, 2);\n return writeFile(tokenFilepath, tokenString);\n};\nexports.writeSSOTokenToFile = writeSSOTokenToFile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpAuthLocation = void 0;\nvar types_1 = require(\"@smithy/types\");\nObject.defineProperty(exports, \"HttpAuthLocation\", { enumerable: true, get: function () { return types_1.HttpAuthLocation; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HostAddressType = void 0;\nvar HostAddressType;\n(function (HostAddressType) {\n HostAddressType[\"AAAA\"] = \"AAAA\";\n HostAddressType[\"A\"] = \"A\";\n})(HostAddressType = exports.HostAddressType || (exports.HostAddressType = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EndpointURLScheme = void 0;\nvar types_1 = require(\"@smithy/types\");\nObject.defineProperty(exports, \"EndpointURLScheme\", { enumerable: true, get: function () { return types_1.EndpointURLScheme; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./AnonymousIdentity\"), exports);\ntslib_1.__exportStar(require(\"./AwsCredentialIdentity\"), exports);\ntslib_1.__exportStar(require(\"./Identity\"), exports);\ntslib_1.__exportStar(require(\"./LoginIdentity\"), exports);\ntslib_1.__exportStar(require(\"./TokenIdentity\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./abort\"), exports);\ntslib_1.__exportStar(require(\"./auth\"), exports);\ntslib_1.__exportStar(require(\"./blob/blob-types\"), exports);\ntslib_1.__exportStar(require(\"./checksum\"), exports);\ntslib_1.__exportStar(require(\"./client\"), exports);\ntslib_1.__exportStar(require(\"./command\"), exports);\ntslib_1.__exportStar(require(\"./connection\"), exports);\ntslib_1.__exportStar(require(\"./credentials\"), exports);\ntslib_1.__exportStar(require(\"./crypto\"), exports);\ntslib_1.__exportStar(require(\"./dns\"), exports);\ntslib_1.__exportStar(require(\"./encode\"), exports);\ntslib_1.__exportStar(require(\"./endpoint\"), exports);\ntslib_1.__exportStar(require(\"./eventStream\"), exports);\ntslib_1.__exportStar(require(\"./extensions\"), exports);\ntslib_1.__exportStar(require(\"./http\"), exports);\ntslib_1.__exportStar(require(\"./identity\"), exports);\ntslib_1.__exportStar(require(\"./logger\"), exports);\ntslib_1.__exportStar(require(\"./middleware\"), exports);\ntslib_1.__exportStar(require(\"./pagination\"), exports);\ntslib_1.__exportStar(require(\"./profile\"), exports);\ntslib_1.__exportStar(require(\"./request\"), exports);\ntslib_1.__exportStar(require(\"./response\"), exports);\ntslib_1.__exportStar(require(\"./retry\"), exports);\ntslib_1.__exportStar(require(\"./serde\"), exports);\ntslib_1.__exportStar(require(\"./shapes\"), exports);\ntslib_1.__exportStar(require(\"./signature\"), exports);\ntslib_1.__exportStar(require(\"./stream\"), exports);\ntslib_1.__exportStar(require(\"./token\"), exports);\ntslib_1.__exportStar(require(\"./transfer\"), exports);\ntslib_1.__exportStar(require(\"./uri\"), exports);\ntslib_1.__exportStar(require(\"./util\"), exports);\ntslib_1.__exportStar(require(\"./waiter\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RequestHandlerProtocol = void 0;\nvar types_1 = require(\"@smithy/types\");\nObject.defineProperty(exports, \"RequestHandlerProtocol\", { enumerable: true, get: function () { return types_1.RequestHandlerProtocol; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.debugId = void 0;\nexports.debugId = \"endpoints\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./debugId\"), exports);\ntslib_1.__exportStar(require(\"./toDebugString\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toDebugString = void 0;\nfunction toDebugString(input) {\n if (typeof input !== \"object\" || input == null) {\n return input;\n }\n if (\"ref\" in input) {\n return `$${toDebugString(input.ref)}`;\n }\n if (\"fn\" in input) {\n return `${input.fn}(${(input.argv || []).map(toDebugString).join(\", \")})`;\n }\n return JSON.stringify(input, null, 2);\n}\nexports.toDebugString = toDebugString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./lib/aws/partition\"), exports);\ntslib_1.__exportStar(require(\"./lib/isIpAddress\"), exports);\ntslib_1.__exportStar(require(\"./resolveEndpoint\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./isVirtualHostableS3Bucket\"), exports);\ntslib_1.__exportStar(require(\"./parseArn\"), exports);\ntslib_1.__exportStar(require(\"./partition\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isVirtualHostableS3Bucket = void 0;\nconst isIpAddress_1 = require(\"../isIpAddress\");\nconst isValidHostLabel_1 = require(\"../isValidHostLabel\");\nconst isVirtualHostableS3Bucket = (value, allowSubDomains = false) => {\n if (allowSubDomains) {\n for (const label of value.split(\".\")) {\n if (!(0, exports.isVirtualHostableS3Bucket)(label)) {\n return false;\n }\n }\n return true;\n }\n if (!(0, isValidHostLabel_1.isValidHostLabel)(value)) {\n return false;\n }\n if (value.length < 3 || value.length > 63) {\n return false;\n }\n if (value !== value.toLowerCase()) {\n return false;\n }\n if ((0, isIpAddress_1.isIpAddress)(value)) {\n return false;\n }\n return true;\n};\nexports.isVirtualHostableS3Bucket = isVirtualHostableS3Bucket;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseArn = void 0;\nconst parseArn = (value) => {\n const segments = value.split(\":\");\n if (segments.length < 6)\n return null;\n const [arn, partition, service, region, accountId, ...resourceId] = segments;\n if (arn !== \"arn\" || partition === \"\" || service === \"\" || resourceId[0] === \"\")\n return null;\n return {\n partition,\n service,\n region,\n accountId,\n resourceId: resourceId[0].includes(\"/\") ? resourceId[0].split(\"/\") : resourceId,\n };\n};\nexports.parseArn = parseArn;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getUserAgentPrefix = exports.useDefaultPartitionInfo = exports.setPartitionInfo = exports.partition = void 0;\nconst tslib_1 = require(\"tslib\");\nconst partitions_json_1 = tslib_1.__importDefault(require(\"./partitions.json\"));\nlet selectedPartitionsInfo = partitions_json_1.default;\nlet selectedUserAgentPrefix = \"\";\nconst partition = (value) => {\n const { partitions } = selectedPartitionsInfo;\n for (const partition of partitions) {\n const { regions, outputs } = partition;\n for (const [region, regionData] of Object.entries(regions)) {\n if (region === value) {\n return {\n ...outputs,\n ...regionData,\n };\n }\n }\n }\n for (const partition of partitions) {\n const { regionRegex, outputs } = partition;\n if (new RegExp(regionRegex).test(value)) {\n return {\n ...outputs,\n };\n }\n }\n const DEFAULT_PARTITION = partitions.find((partition) => partition.id === \"aws\");\n if (!DEFAULT_PARTITION) {\n throw new Error(\"Provided region was not found in the partition array or regex,\" +\n \" and default partition with id 'aws' doesn't exist.\");\n }\n return {\n ...DEFAULT_PARTITION.outputs,\n };\n};\nexports.partition = partition;\nconst setPartitionInfo = (partitionsInfo, userAgentPrefix = \"\") => {\n selectedPartitionsInfo = partitionsInfo;\n selectedUserAgentPrefix = userAgentPrefix;\n};\nexports.setPartitionInfo = setPartitionInfo;\nconst useDefaultPartitionInfo = () => {\n (0, exports.setPartitionInfo)(partitions_json_1.default, \"\");\n};\nexports.useDefaultPartitionInfo = useDefaultPartitionInfo;\nconst getUserAgentPrefix = () => selectedUserAgentPrefix;\nexports.getUserAgentPrefix = getUserAgentPrefix;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.booleanEquals = void 0;\nconst booleanEquals = (value1, value2) => value1 === value2;\nexports.booleanEquals = booleanEquals;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getAttr = void 0;\nconst types_1 = require(\"../types\");\nconst getAttrPathList_1 = require(\"./getAttrPathList\");\nconst getAttr = (value, path) => (0, getAttrPathList_1.getAttrPathList)(path).reduce((acc, index) => {\n if (typeof acc !== \"object\") {\n throw new types_1.EndpointError(`Index '${index}' in '${path}' not found in '${JSON.stringify(value)}'`);\n }\n else if (Array.isArray(acc)) {\n return acc[parseInt(index)];\n }\n return acc[index];\n}, value);\nexports.getAttr = getAttr;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getAttrPathList = void 0;\nconst types_1 = require(\"../types\");\nconst getAttrPathList = (path) => {\n const parts = path.split(\".\");\n const pathList = [];\n for (const part of parts) {\n const squareBracketIndex = part.indexOf(\"[\");\n if (squareBracketIndex !== -1) {\n if (part.indexOf(\"]\") !== part.length - 1) {\n throw new types_1.EndpointError(`Path: '${path}' does not end with ']'`);\n }\n const arrayIndex = part.slice(squareBracketIndex + 1, -1);\n if (Number.isNaN(parseInt(arrayIndex))) {\n throw new types_1.EndpointError(`Invalid array index: '${arrayIndex}' in path: '${path}'`);\n }\n if (squareBracketIndex !== 0) {\n pathList.push(part.slice(0, squareBracketIndex));\n }\n pathList.push(arrayIndex);\n }\n else {\n pathList.push(part);\n }\n }\n return pathList;\n};\nexports.getAttrPathList = getAttrPathList;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.aws = void 0;\nconst tslib_1 = require(\"tslib\");\nexports.aws = tslib_1.__importStar(require(\"./aws\"));\ntslib_1.__exportStar(require(\"./booleanEquals\"), exports);\ntslib_1.__exportStar(require(\"./getAttr\"), exports);\ntslib_1.__exportStar(require(\"./isSet\"), exports);\ntslib_1.__exportStar(require(\"./isValidHostLabel\"), exports);\ntslib_1.__exportStar(require(\"./not\"), exports);\ntslib_1.__exportStar(require(\"./parseURL\"), exports);\ntslib_1.__exportStar(require(\"./stringEquals\"), exports);\ntslib_1.__exportStar(require(\"./substring\"), exports);\ntslib_1.__exportStar(require(\"./uriEncode\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isIpAddress = void 0;\nconst IP_V4_REGEX = new RegExp(`^(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}$`);\nconst isIpAddress = (value) => IP_V4_REGEX.test(value) || (value.startsWith(\"[\") && value.endsWith(\"]\"));\nexports.isIpAddress = isIpAddress;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isSet = void 0;\nconst isSet = (value) => value != null;\nexports.isSet = isSet;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isValidHostLabel = void 0;\nconst VALID_HOST_LABEL_REGEX = new RegExp(`^(?!.*-$)(?!-)[a-zA-Z0-9-]{1,63}$`);\nconst isValidHostLabel = (value, allowSubDomains = false) => {\n if (!allowSubDomains) {\n return VALID_HOST_LABEL_REGEX.test(value);\n }\n const labels = value.split(\".\");\n for (const label of labels) {\n if (!(0, exports.isValidHostLabel)(label)) {\n return false;\n }\n }\n return true;\n};\nexports.isValidHostLabel = isValidHostLabel;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.not = void 0;\nconst not = (value) => !value;\nexports.not = not;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseURL = void 0;\nconst types_1 = require(\"@aws-sdk/types\");\nconst isIpAddress_1 = require(\"./isIpAddress\");\nconst DEFAULT_PORTS = {\n [types_1.EndpointURLScheme.HTTP]: 80,\n [types_1.EndpointURLScheme.HTTPS]: 443,\n};\nconst parseURL = (value) => {\n const whatwgURL = (() => {\n try {\n if (value instanceof URL) {\n return value;\n }\n if (typeof value === \"object\" && \"hostname\" in value) {\n const { hostname, port, protocol = \"\", path = \"\", query = {} } = value;\n const url = new URL(`${protocol}//${hostname}${port ? `:${port}` : \"\"}${path}`);\n url.search = Object.entries(query)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"&\");\n return url;\n }\n return new URL(value);\n }\n catch (error) {\n return null;\n }\n })();\n if (!whatwgURL) {\n console.error(`Unable to parse ${JSON.stringify(value)} as a whatwg URL.`);\n return null;\n }\n const urlString = whatwgURL.href;\n const { host, hostname, pathname, protocol, search } = whatwgURL;\n if (search) {\n return null;\n }\n const scheme = protocol.slice(0, -1);\n if (!Object.values(types_1.EndpointURLScheme).includes(scheme)) {\n return null;\n }\n const isIp = (0, isIpAddress_1.isIpAddress)(hostname);\n const inputContainsDefaultPort = urlString.includes(`${host}:${DEFAULT_PORTS[scheme]}`) ||\n (typeof value === \"string\" && value.includes(`${host}:${DEFAULT_PORTS[scheme]}`));\n const authority = `${host}${inputContainsDefaultPort ? `:${DEFAULT_PORTS[scheme]}` : ``}`;\n return {\n scheme,\n authority,\n path: pathname,\n normalizedPath: pathname.endsWith(\"/\") ? pathname : `${pathname}/`,\n isIp,\n };\n};\nexports.parseURL = parseURL;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringEquals = void 0;\nconst stringEquals = (value1, value2) => value1 === value2;\nexports.stringEquals = stringEquals;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.substring = void 0;\nconst substring = (input, start, stop, reverse) => {\n if (start >= stop || input.length < stop) {\n return null;\n }\n if (!reverse) {\n return input.substring(start, stop);\n }\n return input.substring(input.length - stop, input.length - start);\n};\nexports.substring = substring;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.uriEncode = void 0;\nconst uriEncode = (value) => encodeURIComponent(value).replace(/[!*'()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);\nexports.uriEncode = uriEncode;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveEndpoint = void 0;\nconst debug_1 = require(\"./debug\");\nconst types_1 = require(\"./types\");\nconst utils_1 = require(\"./utils\");\nconst resolveEndpoint = (ruleSetObject, options) => {\n var _a, _b, _c, _d, _e, _f;\n const { endpointParams, logger } = options;\n const { parameters, rules } = ruleSetObject;\n (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, `${debug_1.debugId} Initial EndpointParams: ${(0, debug_1.toDebugString)(endpointParams)}`);\n const paramsWithDefault = Object.entries(parameters)\n .filter(([, v]) => v.default != null)\n .map(([k, v]) => [k, v.default]);\n if (paramsWithDefault.length > 0) {\n for (const [paramKey, paramDefaultValue] of paramsWithDefault) {\n endpointParams[paramKey] = (_c = endpointParams[paramKey]) !== null && _c !== void 0 ? _c : paramDefaultValue;\n }\n }\n const requiredParams = Object.entries(parameters)\n .filter(([, v]) => v.required)\n .map(([k]) => k);\n for (const requiredParam of requiredParams) {\n if (endpointParams[requiredParam] == null) {\n throw new types_1.EndpointError(`Missing required parameter: '${requiredParam}'`);\n }\n }\n const endpoint = (0, utils_1.evaluateRules)(rules, { endpointParams, logger, referenceRecord: {} });\n if ((_d = options.endpointParams) === null || _d === void 0 ? void 0 : _d.Endpoint) {\n try {\n const givenEndpoint = new URL(options.endpointParams.Endpoint);\n const { protocol, port } = givenEndpoint;\n endpoint.url.protocol = protocol;\n endpoint.url.port = port;\n }\n catch (e) {\n }\n }\n (_f = (_e = options.logger) === null || _e === void 0 ? void 0 : _e.debug) === null || _f === void 0 ? void 0 : _f.call(_e, `${debug_1.debugId} Resolved endpoint: ${(0, debug_1.toDebugString)(endpoint)}`);\n return endpoint;\n};\nexports.resolveEndpoint = resolveEndpoint;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EndpointError = void 0;\nclass EndpointError extends Error {\n constructor(message) {\n super(message);\n this.name = \"EndpointError\";\n }\n}\nexports.EndpointError = EndpointError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./EndpointError\"), exports);\ntslib_1.__exportStar(require(\"./EndpointRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./ErrorRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./RuleSetObject\"), exports);\ntslib_1.__exportStar(require(\"./TreeRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./shared\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.callFunction = void 0;\nconst tslib_1 = require(\"tslib\");\nconst lib = tslib_1.__importStar(require(\"../lib\"));\nconst evaluateExpression_1 = require(\"./evaluateExpression\");\nconst callFunction = ({ fn, argv }, options) => {\n const evaluatedArgs = argv.map((arg) => [\"boolean\", \"number\"].includes(typeof arg) ? arg : (0, evaluateExpression_1.evaluateExpression)(arg, \"arg\", options));\n return fn.split(\".\").reduce((acc, key) => acc[key], lib)(...evaluatedArgs);\n};\nexports.callFunction = callFunction;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateCondition = void 0;\nconst debug_1 = require(\"../debug\");\nconst types_1 = require(\"../types\");\nconst callFunction_1 = require(\"./callFunction\");\nconst evaluateCondition = ({ assign, ...fnArgs }, options) => {\n var _a, _b;\n if (assign && assign in options.referenceRecord) {\n throw new types_1.EndpointError(`'${assign}' is already defined in Reference Record.`);\n }\n const value = (0, callFunction_1.callFunction)(fnArgs, options);\n (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `evaluateCondition: ${(0, debug_1.toDebugString)(fnArgs)} = ${(0, debug_1.toDebugString)(value)}`);\n return {\n result: value === \"\" ? true : !!value,\n ...(assign != null && { toAssign: { name: assign, value } }),\n };\n};\nexports.evaluateCondition = evaluateCondition;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateConditions = void 0;\nconst debug_1 = require(\"../debug\");\nconst evaluateCondition_1 = require(\"./evaluateCondition\");\nconst evaluateConditions = (conditions = [], options) => {\n var _a, _b;\n const conditionsReferenceRecord = {};\n for (const condition of conditions) {\n const { result, toAssign } = (0, evaluateCondition_1.evaluateCondition)(condition, {\n ...options,\n referenceRecord: {\n ...options.referenceRecord,\n ...conditionsReferenceRecord,\n },\n });\n if (!result) {\n return { result };\n }\n if (toAssign) {\n conditionsReferenceRecord[toAssign.name] = toAssign.value;\n (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `assign: ${toAssign.name} := ${(0, debug_1.toDebugString)(toAssign.value)}`);\n }\n }\n return { result: true, referenceRecord: conditionsReferenceRecord };\n};\nexports.evaluateConditions = evaluateConditions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateEndpointRule = void 0;\nconst debug_1 = require(\"../debug\");\nconst evaluateConditions_1 = require(\"./evaluateConditions\");\nconst getEndpointHeaders_1 = require(\"./getEndpointHeaders\");\nconst getEndpointProperties_1 = require(\"./getEndpointProperties\");\nconst getEndpointUrl_1 = require(\"./getEndpointUrl\");\nconst evaluateEndpointRule = (endpointRule, options) => {\n var _a, _b;\n const { conditions, endpoint } = endpointRule;\n const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options);\n if (!result) {\n return;\n }\n const endpointRuleOptions = {\n ...options,\n referenceRecord: { ...options.referenceRecord, ...referenceRecord },\n };\n const { url, properties, headers } = endpoint;\n (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `Resolving endpoint from template: ${(0, debug_1.toDebugString)(endpoint)}`);\n return {\n ...(headers != undefined && {\n headers: (0, getEndpointHeaders_1.getEndpointHeaders)(headers, endpointRuleOptions),\n }),\n ...(properties != undefined && {\n properties: (0, getEndpointProperties_1.getEndpointProperties)(properties, endpointRuleOptions),\n }),\n url: (0, getEndpointUrl_1.getEndpointUrl)(url, endpointRuleOptions),\n };\n};\nexports.evaluateEndpointRule = evaluateEndpointRule;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateErrorRule = void 0;\nconst types_1 = require(\"../types\");\nconst evaluateConditions_1 = require(\"./evaluateConditions\");\nconst evaluateExpression_1 = require(\"./evaluateExpression\");\nconst evaluateErrorRule = (errorRule, options) => {\n const { conditions, error } = errorRule;\n const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options);\n if (!result) {\n return;\n }\n throw new types_1.EndpointError((0, evaluateExpression_1.evaluateExpression)(error, \"Error\", {\n ...options,\n referenceRecord: { ...options.referenceRecord, ...referenceRecord },\n }));\n};\nexports.evaluateErrorRule = evaluateErrorRule;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateExpression = void 0;\nconst types_1 = require(\"../types\");\nconst callFunction_1 = require(\"./callFunction\");\nconst evaluateTemplate_1 = require(\"./evaluateTemplate\");\nconst getReferenceValue_1 = require(\"./getReferenceValue\");\nconst evaluateExpression = (obj, keyName, options) => {\n if (typeof obj === \"string\") {\n return (0, evaluateTemplate_1.evaluateTemplate)(obj, options);\n }\n else if (obj[\"fn\"]) {\n return (0, callFunction_1.callFunction)(obj, options);\n }\n else if (obj[\"ref\"]) {\n return (0, getReferenceValue_1.getReferenceValue)(obj, options);\n }\n throw new types_1.EndpointError(`'${keyName}': ${String(obj)} is not a string, function or reference.`);\n};\nexports.evaluateExpression = evaluateExpression;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateRules = void 0;\nconst types_1 = require(\"../types\");\nconst evaluateEndpointRule_1 = require(\"./evaluateEndpointRule\");\nconst evaluateErrorRule_1 = require(\"./evaluateErrorRule\");\nconst evaluateTreeRule_1 = require(\"./evaluateTreeRule\");\nconst evaluateRules = (rules, options) => {\n for (const rule of rules) {\n if (rule.type === \"endpoint\") {\n const endpointOrUndefined = (0, evaluateEndpointRule_1.evaluateEndpointRule)(rule, options);\n if (endpointOrUndefined) {\n return endpointOrUndefined;\n }\n }\n else if (rule.type === \"error\") {\n (0, evaluateErrorRule_1.evaluateErrorRule)(rule, options);\n }\n else if (rule.type === \"tree\") {\n const endpointOrUndefined = (0, evaluateTreeRule_1.evaluateTreeRule)(rule, options);\n if (endpointOrUndefined) {\n return endpointOrUndefined;\n }\n }\n else {\n throw new types_1.EndpointError(`Unknown endpoint rule: ${rule}`);\n }\n }\n throw new types_1.EndpointError(`Rules evaluation failed`);\n};\nexports.evaluateRules = evaluateRules;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateTemplate = void 0;\nconst lib_1 = require(\"../lib\");\nconst evaluateTemplate = (template, options) => {\n const evaluatedTemplateArr = [];\n const templateContext = {\n ...options.endpointParams,\n ...options.referenceRecord,\n };\n let currentIndex = 0;\n while (currentIndex < template.length) {\n const openingBraceIndex = template.indexOf(\"{\", currentIndex);\n if (openingBraceIndex === -1) {\n evaluatedTemplateArr.push(template.slice(currentIndex));\n break;\n }\n evaluatedTemplateArr.push(template.slice(currentIndex, openingBraceIndex));\n const closingBraceIndex = template.indexOf(\"}\", openingBraceIndex);\n if (closingBraceIndex === -1) {\n evaluatedTemplateArr.push(template.slice(openingBraceIndex));\n break;\n }\n if (template[openingBraceIndex + 1] === \"{\" && template[closingBraceIndex + 1] === \"}\") {\n evaluatedTemplateArr.push(template.slice(openingBraceIndex + 1, closingBraceIndex));\n currentIndex = closingBraceIndex + 2;\n }\n const parameterName = template.substring(openingBraceIndex + 1, closingBraceIndex);\n if (parameterName.includes(\"#\")) {\n const [refName, attrName] = parameterName.split(\"#\");\n evaluatedTemplateArr.push((0, lib_1.getAttr)(templateContext[refName], attrName));\n }\n else {\n evaluatedTemplateArr.push(templateContext[parameterName]);\n }\n currentIndex = closingBraceIndex + 1;\n }\n return evaluatedTemplateArr.join(\"\");\n};\nexports.evaluateTemplate = evaluateTemplate;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateTreeRule = void 0;\nconst evaluateConditions_1 = require(\"./evaluateConditions\");\nconst evaluateRules_1 = require(\"./evaluateRules\");\nconst evaluateTreeRule = (treeRule, options) => {\n const { conditions, rules } = treeRule;\n const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options);\n if (!result) {\n return;\n }\n return (0, evaluateRules_1.evaluateRules)(rules, {\n ...options,\n referenceRecord: { ...options.referenceRecord, ...referenceRecord },\n });\n};\nexports.evaluateTreeRule = evaluateTreeRule;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointHeaders = void 0;\nconst types_1 = require(\"../types\");\nconst evaluateExpression_1 = require(\"./evaluateExpression\");\nconst getEndpointHeaders = (headers, options) => Object.entries(headers).reduce((acc, [headerKey, headerVal]) => ({\n ...acc,\n [headerKey]: headerVal.map((headerValEntry) => {\n const processedExpr = (0, evaluateExpression_1.evaluateExpression)(headerValEntry, \"Header value entry\", options);\n if (typeof processedExpr !== \"string\") {\n throw new types_1.EndpointError(`Header '${headerKey}' value '${processedExpr}' is not a string`);\n }\n return processedExpr;\n }),\n}), {});\nexports.getEndpointHeaders = getEndpointHeaders;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointProperties = void 0;\nconst getEndpointProperty_1 = require(\"./getEndpointProperty\");\nconst getEndpointProperties = (properties, options) => Object.entries(properties).reduce((acc, [propertyKey, propertyVal]) => ({\n ...acc,\n [propertyKey]: (0, getEndpointProperty_1.getEndpointProperty)(propertyVal, options),\n}), {});\nexports.getEndpointProperties = getEndpointProperties;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointProperty = void 0;\nconst types_1 = require(\"../types\");\nconst evaluateTemplate_1 = require(\"./evaluateTemplate\");\nconst getEndpointProperties_1 = require(\"./getEndpointProperties\");\nconst getEndpointProperty = (property, options) => {\n if (Array.isArray(property)) {\n return property.map((propertyEntry) => (0, exports.getEndpointProperty)(propertyEntry, options));\n }\n switch (typeof property) {\n case \"string\":\n return (0, evaluateTemplate_1.evaluateTemplate)(property, options);\n case \"object\":\n if (property === null) {\n throw new types_1.EndpointError(`Unexpected endpoint property: ${property}`);\n }\n return (0, getEndpointProperties_1.getEndpointProperties)(property, options);\n case \"boolean\":\n return property;\n default:\n throw new types_1.EndpointError(`Unexpected endpoint property type: ${typeof property}`);\n }\n};\nexports.getEndpointProperty = getEndpointProperty;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointUrl = void 0;\nconst types_1 = require(\"../types\");\nconst evaluateExpression_1 = require(\"./evaluateExpression\");\nconst getEndpointUrl = (endpointUrl, options) => {\n const expression = (0, evaluateExpression_1.evaluateExpression)(endpointUrl, \"Endpoint URL\", options);\n if (typeof expression === \"string\") {\n try {\n return new URL(expression);\n }\n catch (error) {\n console.error(`Failed to construct URL with ${expression}`, error);\n throw error;\n }\n }\n throw new types_1.EndpointError(`Endpoint URL must be a string, got ${typeof expression}`);\n};\nexports.getEndpointUrl = getEndpointUrl;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getReferenceValue = void 0;\nconst getReferenceValue = ({ ref }, options) => {\n const referenceRecord = {\n ...options.endpointParams,\n ...options.referenceRecord,\n };\n return referenceRecord[ref];\n};\nexports.getReferenceValue = getReferenceValue;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./evaluateRules\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.crtAvailability = void 0;\nexports.crtAvailability = {\n isCrtAvailable: false,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultUserAgent = exports.UA_APP_ID_INI_NAME = exports.UA_APP_ID_ENV_NAME = exports.crtAvailability = void 0;\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst os_1 = require(\"os\");\nconst process_1 = require(\"process\");\nconst is_crt_available_1 = require(\"./is-crt-available\");\nvar crt_availability_1 = require(\"./crt-availability\");\nObject.defineProperty(exports, \"crtAvailability\", { enumerable: true, get: function () { return crt_availability_1.crtAvailability; } });\nexports.UA_APP_ID_ENV_NAME = \"AWS_SDK_UA_APP_ID\";\nexports.UA_APP_ID_INI_NAME = \"sdk-ua-app-id\";\nconst defaultUserAgent = ({ serviceId, clientVersion }) => {\n const sections = [\n [\"aws-sdk-js\", clientVersion],\n [\"ua\", \"2.0\"],\n [`os/${(0, os_1.platform)()}`, (0, os_1.release)()],\n [\"lang/js\"],\n [\"md/nodejs\", `${process_1.versions.node}`],\n ];\n const crtAvailable = (0, is_crt_available_1.isCrtAvailable)();\n if (crtAvailable) {\n sections.push(crtAvailable);\n }\n if (serviceId) {\n sections.push([`api/${serviceId}`, clientVersion]);\n }\n if (process_1.env.AWS_EXECUTION_ENV) {\n sections.push([`exec-env/${process_1.env.AWS_EXECUTION_ENV}`]);\n }\n const appIdPromise = (0, node_config_provider_1.loadConfig)({\n environmentVariableSelector: (env) => env[exports.UA_APP_ID_ENV_NAME],\n configFileSelector: (profile) => profile[exports.UA_APP_ID_INI_NAME],\n default: undefined,\n })();\n let resolvedUserAgent = undefined;\n return async () => {\n if (!resolvedUserAgent) {\n const appId = await appIdPromise;\n resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections];\n }\n return resolvedUserAgent;\n };\n};\nexports.defaultUserAgent = defaultUserAgent;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isCrtAvailable = void 0;\nconst crt_availability_1 = require(\"./crt-availability\");\nconst isCrtAvailable = () => {\n if (crt_availability_1.crtAvailability.isCrtAvailable) {\n return [\"md/crt-avail\"];\n }\n return null;\n};\nexports.isCrtAvailable = isCrtAvailable;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nconst pureJs_1 = require(\"./pureJs\");\nconst whatwgEncodingApi_1 = require(\"./whatwgEncodingApi\");\nconst fromUtf8 = (input) => typeof TextEncoder === \"function\" ? (0, whatwgEncodingApi_1.fromUtf8)(input) : (0, pureJs_1.fromUtf8)(input);\nexports.fromUtf8 = fromUtf8;\nconst toUtf8 = (input) => typeof TextDecoder === \"function\" ? (0, whatwgEncodingApi_1.toUtf8)(input) : (0, pureJs_1.toUtf8)(input);\nexports.toUtf8 = toUtf8;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nconst fromUtf8 = (input) => {\n const bytes = [];\n for (let i = 0, len = input.length; i < len; i++) {\n const value = input.charCodeAt(i);\n if (value < 0x80) {\n bytes.push(value);\n }\n else if (value < 0x800) {\n bytes.push((value >> 6) | 0b11000000, (value & 0b111111) | 0b10000000);\n }\n else if (i + 1 < input.length && (value & 0xfc00) === 0xd800 && (input.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\n const surrogatePair = 0x10000 + ((value & 0b1111111111) << 10) + (input.charCodeAt(++i) & 0b1111111111);\n bytes.push((surrogatePair >> 18) | 0b11110000, ((surrogatePair >> 12) & 0b111111) | 0b10000000, ((surrogatePair >> 6) & 0b111111) | 0b10000000, (surrogatePair & 0b111111) | 0b10000000);\n }\n else {\n bytes.push((value >> 12) | 0b11100000, ((value >> 6) & 0b111111) | 0b10000000, (value & 0b111111) | 0b10000000);\n }\n }\n return Uint8Array.from(bytes);\n};\nexports.fromUtf8 = fromUtf8;\nconst toUtf8 = (input) => {\n let decoded = \"\";\n for (let i = 0, len = input.length; i < len; i++) {\n const byte = input[i];\n if (byte < 0x80) {\n decoded += String.fromCharCode(byte);\n }\n else if (0b11000000 <= byte && byte < 0b11100000) {\n const nextByte = input[++i];\n decoded += String.fromCharCode(((byte & 0b11111) << 6) | (nextByte & 0b111111));\n }\n else if (0b11110000 <= byte && byte < 0b101101101) {\n const surrogatePair = [byte, input[++i], input[++i], input[++i]];\n const encoded = \"%\" + surrogatePair.map((byteValue) => byteValue.toString(16)).join(\"%\");\n decoded += decodeURIComponent(encoded);\n }\n else {\n decoded += String.fromCharCode(((byte & 0b1111) << 12) | ((input[++i] & 0b111111) << 6) | (input[++i] & 0b111111));\n }\n }\n return decoded;\n};\nexports.toUtf8 = toUtf8;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nfunction fromUtf8(input) {\n return new TextEncoder().encode(input);\n}\nexports.fromUtf8 = fromUtf8;\nfunction toUtf8(input) {\n return new TextDecoder(\"utf-8\").decode(input);\n}\nexports.toUtf8 = toUtf8;\n","'use strict'\n\nconst WritableStream = require('node:stream').Writable\nconst inherits = require('node:util').inherits\n\nconst StreamSearch = require('../../streamsearch/sbmh')\n\nconst PartStream = require('./PartStream')\nconst HeaderParser = require('./HeaderParser')\n\nconst DASH = 45\nconst B_ONEDASH = Buffer.from('-')\nconst B_CRLF = Buffer.from('\\r\\n')\nconst EMPTY_FN = function () {}\n\nfunction Dicer (cfg) {\n if (!(this instanceof Dicer)) { return new Dicer(cfg) }\n WritableStream.call(this, cfg)\n\n if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') }\n\n if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined }\n\n this._headerFirst = cfg.headerFirst\n\n this._dashes = 0\n this._parts = 0\n this._finished = false\n this._realFinish = false\n this._isPreamble = true\n this._justMatched = false\n this._firstWrite = true\n this._inHeader = true\n this._part = undefined\n this._cb = undefined\n this._ignoreData = false\n this._partOpts = { highWaterMark: cfg.partHwm }\n this._pause = false\n\n const self = this\n this._hparser = new HeaderParser(cfg)\n this._hparser.on('header', function (header) {\n self._inHeader = false\n self._part.emit('header', header)\n })\n}\ninherits(Dicer, WritableStream)\n\nDicer.prototype.emit = function (ev) {\n if (ev === 'finish' && !this._realFinish) {\n if (!this._finished) {\n const self = this\n process.nextTick(function () {\n self.emit('error', new Error('Unexpected end of multipart data'))\n if (self._part && !self._ignoreData) {\n const type = (self._isPreamble ? 'Preamble' : 'Part')\n self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data'))\n self._part.push(null)\n process.nextTick(function () {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n })\n return\n }\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n })\n }\n } else { WritableStream.prototype.emit.apply(this, arguments) }\n}\n\nDicer.prototype._write = function (data, encoding, cb) {\n // ignore unexpected data (e.g. extra trailer data after finished)\n if (!this._hparser && !this._bparser) { return cb() }\n\n if (this._headerFirst && this._isPreamble) {\n if (!this._part) {\n this._part = new PartStream(this._partOpts)\n if (this._events.preamble) { this.emit('preamble', this._part) } else { this._ignore() }\n }\n const r = this._hparser.push(data)\n if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() }\n }\n\n // allows for \"easier\" testing\n if (this._firstWrite) {\n this._bparser.push(B_CRLF)\n this._firstWrite = false\n }\n\n this._bparser.push(data)\n\n if (this._pause) { this._cb = cb } else { cb() }\n}\n\nDicer.prototype.reset = function () {\n this._part = undefined\n this._bparser = undefined\n this._hparser = undefined\n}\n\nDicer.prototype.setBoundary = function (boundary) {\n const self = this\n this._bparser = new StreamSearch('\\r\\n--' + boundary)\n this._bparser.on('info', function (isMatch, data, start, end) {\n self._oninfo(isMatch, data, start, end)\n })\n}\n\nDicer.prototype._ignore = function () {\n if (this._part && !this._ignoreData) {\n this._ignoreData = true\n this._part.on('error', EMPTY_FN)\n // we must perform some kind of read on the stream even though we are\n // ignoring the data, otherwise node's Readable stream will not emit 'end'\n // after pushing null to the stream\n this._part.resume()\n }\n}\n\nDicer.prototype._oninfo = function (isMatch, data, start, end) {\n let buf; const self = this; let i = 0; let r; let shouldWriteMore = true\n\n if (!this._part && this._justMatched && data) {\n while (this._dashes < 2 && (start + i) < end) {\n if (data[start + i] === DASH) {\n ++i\n ++this._dashes\n } else {\n if (this._dashes) { buf = B_ONEDASH }\n this._dashes = 0\n break\n }\n }\n if (this._dashes === 2) {\n if ((start + i) < end && this._events.trailer) { this.emit('trailer', data.slice(start + i, end)) }\n this.reset()\n this._finished = true\n // no more parts will be added\n if (self._parts === 0) {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n }\n }\n if (this._dashes) { return }\n }\n if (this._justMatched) { this._justMatched = false }\n if (!this._part) {\n this._part = new PartStream(this._partOpts)\n this._part._read = function (n) {\n self._unpause()\n }\n if (this._isPreamble && this._events.preamble) { this.emit('preamble', this._part) } else if (this._isPreamble !== true && this._events.part) { this.emit('part', this._part) } else { this._ignore() }\n if (!this._isPreamble) { this._inHeader = true }\n }\n if (data && start < end && !this._ignoreData) {\n if (this._isPreamble || !this._inHeader) {\n if (buf) { shouldWriteMore = this._part.push(buf) }\n shouldWriteMore = this._part.push(data.slice(start, end))\n if (!shouldWriteMore) { this._pause = true }\n } else if (!this._isPreamble && this._inHeader) {\n if (buf) { this._hparser.push(buf) }\n r = this._hparser.push(data.slice(start, end))\n if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) }\n }\n }\n if (isMatch) {\n this._hparser.reset()\n if (this._isPreamble) { this._isPreamble = false } else {\n if (start !== end) {\n ++this._parts\n this._part.on('end', function () {\n if (--self._parts === 0) {\n if (self._finished) {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n } else {\n self._unpause()\n }\n }\n })\n }\n }\n this._part.push(null)\n this._part = undefined\n this._ignoreData = false\n this._justMatched = true\n this._dashes = 0\n }\n}\n\nDicer.prototype._unpause = function () {\n if (!this._pause) { return }\n\n this._pause = false\n if (this._cb) {\n const cb = this._cb\n this._cb = undefined\n cb()\n }\n}\n\nmodule.exports = Dicer\n","'use strict'\n\nconst EventEmitter = require('node:events').EventEmitter\nconst inherits = require('node:util').inherits\nconst getLimit = require('../../../lib/utils/getLimit')\n\nconst StreamSearch = require('../../streamsearch/sbmh')\n\nconst B_DCRLF = Buffer.from('\\r\\n\\r\\n')\nconst RE_CRLF = /\\r\\n/g\nconst RE_HDR = /^([^:]+):[ \\t]?([\\x00-\\xFF]+)?$/ // eslint-disable-line no-control-regex\n\nfunction HeaderParser (cfg) {\n EventEmitter.call(this)\n\n cfg = cfg || {}\n const self = this\n this.nread = 0\n this.maxed = false\n this.npairs = 0\n this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000)\n this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024)\n this.buffer = ''\n this.header = {}\n this.finished = false\n this.ss = new StreamSearch(B_DCRLF)\n this.ss.on('info', function (isMatch, data, start, end) {\n if (data && !self.maxed) {\n if (self.nread + end - start >= self.maxHeaderSize) {\n end = self.maxHeaderSize - self.nread + start\n self.nread = self.maxHeaderSize\n self.maxed = true\n } else { self.nread += (end - start) }\n\n self.buffer += data.toString('binary', start, end)\n }\n if (isMatch) { self._finish() }\n })\n}\ninherits(HeaderParser, EventEmitter)\n\nHeaderParser.prototype.push = function (data) {\n const r = this.ss.push(data)\n if (this.finished) { return r }\n}\n\nHeaderParser.prototype.reset = function () {\n this.finished = false\n this.buffer = ''\n this.header = {}\n this.ss.reset()\n}\n\nHeaderParser.prototype._finish = function () {\n if (this.buffer) { this._parseHeader() }\n this.ss.matches = this.ss.maxMatches\n const header = this.header\n this.header = {}\n this.buffer = ''\n this.finished = true\n this.nread = this.npairs = 0\n this.maxed = false\n this.emit('header', header)\n}\n\nHeaderParser.prototype._parseHeader = function () {\n if (this.npairs === this.maxHeaderPairs) { return }\n\n const lines = this.buffer.split(RE_CRLF)\n const len = lines.length\n let m, h\n\n for (var i = 0; i < len; ++i) { // eslint-disable-line no-var\n if (lines[i].length === 0) { continue }\n if (lines[i][0] === '\\t' || lines[i][0] === ' ') {\n // folded header content\n // RFC2822 says to just remove the CRLF and not the whitespace following\n // it, so we follow the RFC and include the leading whitespace ...\n if (h) {\n this.header[h][this.header[h].length - 1] += lines[i]\n continue\n }\n }\n\n const posColon = lines[i].indexOf(':')\n if (\n posColon === -1 ||\n posColon === 0\n ) {\n return\n }\n m = RE_HDR.exec(lines[i])\n h = m[1].toLowerCase()\n this.header[h] = this.header[h] || []\n this.header[h].push((m[2] || ''))\n if (++this.npairs === this.maxHeaderPairs) { break }\n }\n}\n\nmodule.exports = HeaderParser\n","'use strict'\n\nconst inherits = require('node:util').inherits\nconst ReadableStream = require('node:stream').Readable\n\nfunction PartStream (opts) {\n ReadableStream.call(this, opts)\n}\ninherits(PartStream, ReadableStream)\n\nPartStream.prototype._read = function (n) {}\n\nmodule.exports = PartStream\n","'use strict'\n\n/**\n * Copyright Brian White. All rights reserved.\n *\n * @see https://github.com/mscdex/streamsearch\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n *\n * Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation\n * by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool\n */\nconst EventEmitter = require('node:events').EventEmitter\nconst inherits = require('node:util').inherits\n\nfunction SBMH (needle) {\n if (typeof needle === 'string') {\n needle = Buffer.from(needle)\n }\n\n if (!Buffer.isBuffer(needle)) {\n throw new TypeError('The needle has to be a String or a Buffer.')\n }\n\n const needleLength = needle.length\n\n if (needleLength === 0) {\n throw new Error('The needle cannot be an empty String/Buffer.')\n }\n\n if (needleLength > 256) {\n throw new Error('The needle cannot have a length bigger than 256.')\n }\n\n this.maxMatches = Infinity\n this.matches = 0\n\n this._occ = new Array(256)\n .fill(needleLength) // Initialize occurrence table.\n this._lookbehind_size = 0\n this._needle = needle\n this._bufpos = 0\n\n this._lookbehind = Buffer.alloc(needleLength)\n\n // Populate occurrence table with analysis of the needle,\n // ignoring last letter.\n for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var\n this._occ[needle[i]] = needleLength - 1 - i\n }\n}\ninherits(SBMH, EventEmitter)\n\nSBMH.prototype.reset = function () {\n this._lookbehind_size = 0\n this.matches = 0\n this._bufpos = 0\n}\n\nSBMH.prototype.push = function (chunk, pos) {\n if (!Buffer.isBuffer(chunk)) {\n chunk = Buffer.from(chunk, 'binary')\n }\n const chlen = chunk.length\n this._bufpos = pos || 0\n let r\n while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) }\n return r\n}\n\nSBMH.prototype._sbmh_feed = function (data) {\n const len = data.length\n const needle = this._needle\n const needleLength = needle.length\n const lastNeedleChar = needle[needleLength - 1]\n\n // Positive: points to a position in `data`\n // pos == 3 points to data[3]\n // Negative: points to a position in the lookbehind buffer\n // pos == -2 points to lookbehind[lookbehind_size - 2]\n let pos = -this._lookbehind_size\n let ch\n\n if (pos < 0) {\n // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool\n // search with character lookup code that considers both the\n // lookbehind buffer and the current round's haystack data.\n //\n // Loop until\n // there is a match.\n // or until\n // we've moved past the position that requires the\n // lookbehind buffer. In this case we switch to the\n // optimized loop.\n // or until\n // the character to look at lies outside the haystack.\n while (pos < 0 && pos <= len - needleLength) {\n ch = this._sbmh_lookup_char(data, pos + needleLength - 1)\n\n if (\n ch === lastNeedleChar &&\n this._sbmh_memcmp(data, pos, needleLength - 1)\n ) {\n this._lookbehind_size = 0\n ++this.matches\n this.emit('info', true)\n\n return (this._bufpos = pos + needleLength)\n }\n pos += this._occ[ch]\n }\n\n // No match.\n\n if (pos < 0) {\n // There's too few data for Boyer-Moore-Horspool to run,\n // so let's use a different algorithm to skip as much as\n // we can.\n // Forward pos until\n // the trailing part of lookbehind + data\n // looks like the beginning of the needle\n // or until\n // pos == 0\n while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos }\n }\n\n if (pos >= 0) {\n // Discard lookbehind buffer.\n this.emit('info', false, this._lookbehind, 0, this._lookbehind_size)\n this._lookbehind_size = 0\n } else {\n // Cut off part of the lookbehind buffer that has\n // been processed and append the entire haystack\n // into it.\n const bytesToCutOff = this._lookbehind_size + pos\n if (bytesToCutOff > 0) {\n // The cut off data is guaranteed not to contain the needle.\n this.emit('info', false, this._lookbehind, 0, bytesToCutOff)\n }\n\n this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff,\n this._lookbehind_size - bytesToCutOff)\n this._lookbehind_size -= bytesToCutOff\n\n data.copy(this._lookbehind, this._lookbehind_size)\n this._lookbehind_size += len\n\n this._bufpos = len\n return len\n }\n }\n\n pos += (pos >= 0) * this._bufpos\n\n // Lookbehind buffer is now empty. We only need to check if the\n // needle is in the haystack.\n if (data.indexOf(needle, pos) !== -1) {\n pos = data.indexOf(needle, pos)\n ++this.matches\n if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) }\n\n return (this._bufpos = pos + needleLength)\n } else {\n pos = len - needleLength\n }\n\n // There was no match. If there's trailing haystack data that we cannot\n // match yet using the Boyer-Moore-Horspool algorithm (because the trailing\n // data is less than the needle size) then match using a modified\n // algorithm that starts matching from the beginning instead of the end.\n // Whatever trailing data is left after running this algorithm is added to\n // the lookbehind buffer.\n while (\n pos < len &&\n (\n data[pos] !== needle[0] ||\n (\n (Buffer.compare(\n data.subarray(pos, pos + len - pos),\n needle.subarray(0, len - pos)\n ) !== 0)\n )\n )\n ) {\n ++pos\n }\n if (pos < len) {\n data.copy(this._lookbehind, 0, pos, pos + (len - pos))\n this._lookbehind_size = len - pos\n }\n\n // Everything until pos is guaranteed not to contain needle data.\n if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) }\n\n this._bufpos = len\n return len\n}\n\nSBMH.prototype._sbmh_lookup_char = function (data, pos) {\n return (pos < 0)\n ? this._lookbehind[this._lookbehind_size + pos]\n : data[pos]\n}\n\nSBMH.prototype._sbmh_memcmp = function (data, pos, len) {\n for (var i = 0; i < len; ++i) { // eslint-disable-line no-var\n if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false }\n }\n return true\n}\n\nmodule.exports = SBMH\n","'use strict'\n\nconst WritableStream = require('node:stream').Writable\nconst { inherits } = require('node:util')\nconst Dicer = require('../deps/dicer/lib/Dicer')\n\nconst MultipartParser = require('./types/multipart')\nconst UrlencodedParser = require('./types/urlencoded')\nconst parseParams = require('./utils/parseParams')\n\nfunction Busboy (opts) {\n if (!(this instanceof Busboy)) { return new Busboy(opts) }\n\n if (typeof opts !== 'object') {\n throw new TypeError('Busboy expected an options-Object.')\n }\n if (typeof opts.headers !== 'object') {\n throw new TypeError('Busboy expected an options-Object with headers-attribute.')\n }\n if (typeof opts.headers['content-type'] !== 'string') {\n throw new TypeError('Missing Content-Type-header.')\n }\n\n const {\n headers,\n ...streamOptions\n } = opts\n\n this.opts = {\n autoDestroy: false,\n ...streamOptions\n }\n WritableStream.call(this, this.opts)\n\n this._done = false\n this._parser = this.getParserByHeaders(headers)\n this._finished = false\n}\ninherits(Busboy, WritableStream)\n\nBusboy.prototype.emit = function (ev) {\n if (ev === 'finish') {\n if (!this._done) {\n this._parser?.end()\n return\n } else if (this._finished) {\n return\n }\n this._finished = true\n }\n WritableStream.prototype.emit.apply(this, arguments)\n}\n\nBusboy.prototype.getParserByHeaders = function (headers) {\n const parsed = parseParams(headers['content-type'])\n\n const cfg = {\n defCharset: this.opts.defCharset,\n fileHwm: this.opts.fileHwm,\n headers,\n highWaterMark: this.opts.highWaterMark,\n isPartAFile: this.opts.isPartAFile,\n limits: this.opts.limits,\n parsedConType: parsed,\n preservePath: this.opts.preservePath\n }\n\n if (MultipartParser.detect.test(parsed[0])) {\n return new MultipartParser(this, cfg)\n }\n if (UrlencodedParser.detect.test(parsed[0])) {\n return new UrlencodedParser(this, cfg)\n }\n throw new Error('Unsupported Content-Type.')\n}\n\nBusboy.prototype._write = function (chunk, encoding, cb) {\n this._parser.write(chunk, cb)\n}\n\nmodule.exports = Busboy\nmodule.exports.default = Busboy\nmodule.exports.Busboy = Busboy\n\nmodule.exports.Dicer = Dicer\n","'use strict'\n\n// TODO:\n// * support 1 nested multipart level\n// (see second multipart example here:\n// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data)\n// * support limits.fieldNameSize\n// -- this will require modifications to utils.parseParams\n\nconst { Readable } = require('node:stream')\nconst { inherits } = require('node:util')\n\nconst Dicer = require('../../deps/dicer/lib/Dicer')\n\nconst parseParams = require('../utils/parseParams')\nconst decodeText = require('../utils/decodeText')\nconst basename = require('../utils/basename')\nconst getLimit = require('../utils/getLimit')\n\nconst RE_BOUNDARY = /^boundary$/i\nconst RE_FIELD = /^form-data$/i\nconst RE_CHARSET = /^charset$/i\nconst RE_FILENAME = /^filename$/i\nconst RE_NAME = /^name$/i\n\nMultipart.detect = /^multipart\\/form-data/i\nfunction Multipart (boy, cfg) {\n let i\n let len\n const self = this\n let boundary\n const limits = cfg.limits\n const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined))\n const parsedConType = cfg.parsedConType || []\n const defCharset = cfg.defCharset || 'utf8'\n const preservePath = cfg.preservePath\n const fileOpts = { highWaterMark: cfg.fileHwm }\n\n for (i = 0, len = parsedConType.length; i < len; ++i) {\n if (Array.isArray(parsedConType[i]) &&\n RE_BOUNDARY.test(parsedConType[i][0])) {\n boundary = parsedConType[i][1]\n break\n }\n }\n\n function checkFinished () {\n if (nends === 0 && finished && !boy._done) {\n finished = false\n self.end()\n }\n }\n\n if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') }\n\n const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)\n const fileSizeLimit = getLimit(limits, 'fileSize', Infinity)\n const filesLimit = getLimit(limits, 'files', Infinity)\n const fieldsLimit = getLimit(limits, 'fields', Infinity)\n const partsLimit = getLimit(limits, 'parts', Infinity)\n const headerPairsLimit = getLimit(limits, 'headerPairs', 2000)\n const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024)\n\n let nfiles = 0\n let nfields = 0\n let nends = 0\n let curFile\n let curField\n let finished = false\n\n this._needDrain = false\n this._pause = false\n this._cb = undefined\n this._nparts = 0\n this._boy = boy\n\n const parserCfg = {\n boundary,\n maxHeaderPairs: headerPairsLimit,\n maxHeaderSize: headerSizeLimit,\n partHwm: fileOpts.highWaterMark,\n highWaterMark: cfg.highWaterMark\n }\n\n this.parser = new Dicer(parserCfg)\n this.parser.on('drain', function () {\n self._needDrain = false\n if (self._cb && !self._pause) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n }).on('part', function onPart (part) {\n if (++self._nparts > partsLimit) {\n self.parser.removeListener('part', onPart)\n self.parser.on('part', skipPart)\n boy.hitPartsLimit = true\n boy.emit('partsLimit')\n return skipPart(part)\n }\n\n // hack because streams2 _always_ doesn't emit 'end' until nextTick, so let\n // us emit 'end' early since we know the part has ended if we are already\n // seeing the next part\n if (curField) {\n const field = curField\n field.emit('end')\n field.removeAllListeners('end')\n }\n\n part.on('header', function (header) {\n let contype\n let fieldname\n let parsed\n let charset\n let encoding\n let filename\n let nsize = 0\n\n if (header['content-type']) {\n parsed = parseParams(header['content-type'][0])\n if (parsed[0]) {\n contype = parsed[0].toLowerCase()\n for (i = 0, len = parsed.length; i < len; ++i) {\n if (RE_CHARSET.test(parsed[i][0])) {\n charset = parsed[i][1].toLowerCase()\n break\n }\n }\n }\n }\n\n if (contype === undefined) { contype = 'text/plain' }\n if (charset === undefined) { charset = defCharset }\n\n if (header['content-disposition']) {\n parsed = parseParams(header['content-disposition'][0])\n if (!RE_FIELD.test(parsed[0])) { return skipPart(part) }\n for (i = 0, len = parsed.length; i < len; ++i) {\n if (RE_NAME.test(parsed[i][0])) {\n fieldname = parsed[i][1]\n } else if (RE_FILENAME.test(parsed[i][0])) {\n filename = parsed[i][1]\n if (!preservePath) { filename = basename(filename) }\n }\n }\n } else { return skipPart(part) }\n\n if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' }\n\n let onData,\n onEnd\n\n if (isPartAFile(fieldname, contype, filename)) {\n // file/binary field\n if (nfiles === filesLimit) {\n if (!boy.hitFilesLimit) {\n boy.hitFilesLimit = true\n boy.emit('filesLimit')\n }\n return skipPart(part)\n }\n\n ++nfiles\n\n if (!boy._events.file) {\n self.parser._ignore()\n return\n }\n\n ++nends\n const file = new FileStream(fileOpts)\n curFile = file\n file.on('end', function () {\n --nends\n self._pause = false\n checkFinished()\n if (self._cb && !self._needDrain) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n })\n file._read = function (n) {\n if (!self._pause) { return }\n self._pause = false\n if (self._cb && !self._needDrain) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n }\n boy.emit('file', fieldname, file, filename, encoding, contype)\n\n onData = function (data) {\n if ((nsize += data.length) > fileSizeLimit) {\n const extralen = fileSizeLimit - nsize + data.length\n if (extralen > 0) { file.push(data.slice(0, extralen)) }\n file.truncated = true\n file.bytesRead = fileSizeLimit\n part.removeAllListeners('data')\n file.emit('limit')\n return\n } else if (!file.push(data)) { self._pause = true }\n\n file.bytesRead = nsize\n }\n\n onEnd = function () {\n curFile = undefined\n file.push(null)\n }\n } else {\n // non-file field\n if (nfields === fieldsLimit) {\n if (!boy.hitFieldsLimit) {\n boy.hitFieldsLimit = true\n boy.emit('fieldsLimit')\n }\n return skipPart(part)\n }\n\n ++nfields\n ++nends\n let buffer = ''\n let truncated = false\n curField = part\n\n onData = function (data) {\n if ((nsize += data.length) > fieldSizeLimit) {\n const extralen = (fieldSizeLimit - (nsize - data.length))\n buffer += data.toString('binary', 0, extralen)\n truncated = true\n part.removeAllListeners('data')\n } else { buffer += data.toString('binary') }\n }\n\n onEnd = function () {\n curField = undefined\n if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) }\n boy.emit('field', fieldname, buffer, false, truncated, encoding, contype)\n --nends\n checkFinished()\n }\n }\n\n /* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become\n broken. Streams2/streams3 is a huge black box of confusion, but\n somehow overriding the sync state seems to fix things again (and still\n seems to work for previous node versions).\n */\n part._readableState.sync = false\n\n part.on('data', onData)\n part.on('end', onEnd)\n }).on('error', function (err) {\n if (curFile) { curFile.emit('error', err) }\n })\n }).on('error', function (err) {\n boy.emit('error', err)\n }).on('finish', function () {\n finished = true\n checkFinished()\n })\n}\n\nMultipart.prototype.write = function (chunk, cb) {\n const r = this.parser.write(chunk)\n if (r && !this._pause) {\n cb()\n } else {\n this._needDrain = !r\n this._cb = cb\n }\n}\n\nMultipart.prototype.end = function () {\n const self = this\n\n if (self.parser.writable) {\n self.parser.end()\n } else if (!self._boy._done) {\n process.nextTick(function () {\n self._boy._done = true\n self._boy.emit('finish')\n })\n }\n}\n\nfunction skipPart (part) {\n part.resume()\n}\n\nfunction FileStream (opts) {\n Readable.call(this, opts)\n\n this.bytesRead = 0\n\n this.truncated = false\n}\n\ninherits(FileStream, Readable)\n\nFileStream.prototype._read = function (n) {}\n\nmodule.exports = Multipart\n","'use strict'\n\nconst Decoder = require('../utils/Decoder')\nconst decodeText = require('../utils/decodeText')\nconst getLimit = require('../utils/getLimit')\n\nconst RE_CHARSET = /^charset$/i\n\nUrlEncoded.detect = /^application\\/x-www-form-urlencoded/i\nfunction UrlEncoded (boy, cfg) {\n const limits = cfg.limits\n const parsedConType = cfg.parsedConType\n this.boy = boy\n\n this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)\n this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100)\n this.fieldsLimit = getLimit(limits, 'fields', Infinity)\n\n let charset\n for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var\n if (Array.isArray(parsedConType[i]) &&\n RE_CHARSET.test(parsedConType[i][0])) {\n charset = parsedConType[i][1].toLowerCase()\n break\n }\n }\n\n if (charset === undefined) { charset = cfg.defCharset || 'utf8' }\n\n this.decoder = new Decoder()\n this.charset = charset\n this._fields = 0\n this._state = 'key'\n this._checkingBytes = true\n this._bytesKey = 0\n this._bytesVal = 0\n this._key = ''\n this._val = ''\n this._keyTrunc = false\n this._valTrunc = false\n this._hitLimit = false\n}\n\nUrlEncoded.prototype.write = function (data, cb) {\n if (this._fields === this.fieldsLimit) {\n if (!this.boy.hitFieldsLimit) {\n this.boy.hitFieldsLimit = true\n this.boy.emit('fieldsLimit')\n }\n return cb()\n }\n\n let idxeq; let idxamp; let i; let p = 0; const len = data.length\n\n while (p < len) {\n if (this._state === 'key') {\n idxeq = idxamp = undefined\n for (i = p; i < len; ++i) {\n if (!this._checkingBytes) { ++p }\n if (data[i] === 0x3D/* = */) {\n idxeq = i\n break\n } else if (data[i] === 0x26/* & */) {\n idxamp = i\n break\n }\n if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) {\n this._hitLimit = true\n break\n } else if (this._checkingBytes) { ++this._bytesKey }\n }\n\n if (idxeq !== undefined) {\n // key with assignment\n if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) }\n this._state = 'val'\n\n this._hitLimit = false\n this._checkingBytes = true\n this._val = ''\n this._bytesVal = 0\n this._valTrunc = false\n this.decoder.reset()\n\n p = idxeq + 1\n } else if (idxamp !== undefined) {\n // key with no assignment\n ++this._fields\n let key; const keyTrunc = this._keyTrunc\n if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key }\n\n this._hitLimit = false\n this._checkingBytes = true\n this._key = ''\n this._bytesKey = 0\n this._keyTrunc = false\n this.decoder.reset()\n\n if (key.length) {\n this.boy.emit('field', decodeText(key, 'binary', this.charset),\n '',\n keyTrunc,\n false)\n }\n\n p = idxamp + 1\n if (this._fields === this.fieldsLimit) { return cb() }\n } else if (this._hitLimit) {\n // we may not have hit the actual limit if there are encoded bytes...\n if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) }\n p = i\n if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) {\n // yep, we actually did hit the limit\n this._checkingBytes = false\n this._keyTrunc = true\n }\n } else {\n if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) }\n p = len\n }\n } else {\n idxamp = undefined\n for (i = p; i < len; ++i) {\n if (!this._checkingBytes) { ++p }\n if (data[i] === 0x26/* & */) {\n idxamp = i\n break\n }\n if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) {\n this._hitLimit = true\n break\n } else if (this._checkingBytes) { ++this._bytesVal }\n }\n\n if (idxamp !== undefined) {\n ++this._fields\n if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) }\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n decodeText(this._val, 'binary', this.charset),\n this._keyTrunc,\n this._valTrunc)\n this._state = 'key'\n\n this._hitLimit = false\n this._checkingBytes = true\n this._key = ''\n this._bytesKey = 0\n this._keyTrunc = false\n this.decoder.reset()\n\n p = idxamp + 1\n if (this._fields === this.fieldsLimit) { return cb() }\n } else if (this._hitLimit) {\n // we may not have hit the actual limit if there are encoded bytes...\n if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) }\n p = i\n if ((this._val === '' && this.fieldSizeLimit === 0) ||\n (this._bytesVal = this._val.length) === this.fieldSizeLimit) {\n // yep, we actually did hit the limit\n this._checkingBytes = false\n this._valTrunc = true\n }\n } else {\n if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) }\n p = len\n }\n }\n }\n cb()\n}\n\nUrlEncoded.prototype.end = function () {\n if (this.boy._done) { return }\n\n if (this._state === 'key' && this._key.length > 0) {\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n '',\n this._keyTrunc,\n false)\n } else if (this._state === 'val') {\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n decodeText(this._val, 'binary', this.charset),\n this._keyTrunc,\n this._valTrunc)\n }\n this.boy._done = true\n this.boy.emit('finish')\n}\n\nmodule.exports = UrlEncoded\n","'use strict'\n\nconst RE_PLUS = /\\+/g\n\nconst HEX = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,\n 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n]\n\nfunction Decoder () {\n this.buffer = undefined\n}\nDecoder.prototype.write = function (str) {\n // Replace '+' with ' ' before decoding\n str = str.replace(RE_PLUS, ' ')\n let res = ''\n let i = 0; let p = 0; const len = str.length\n for (; i < len; ++i) {\n if (this.buffer !== undefined) {\n if (!HEX[str.charCodeAt(i)]) {\n res += '%' + this.buffer\n this.buffer = undefined\n --i // retry character\n } else {\n this.buffer += str[i]\n ++p\n if (this.buffer.length === 2) {\n res += String.fromCharCode(parseInt(this.buffer, 16))\n this.buffer = undefined\n }\n }\n } else if (str[i] === '%') {\n if (i > p) {\n res += str.substring(p, i)\n p = i\n }\n this.buffer = ''\n ++p\n }\n }\n if (p < len && this.buffer === undefined) { res += str.substring(p) }\n return res\n}\nDecoder.prototype.reset = function () {\n this.buffer = undefined\n}\n\nmodule.exports = Decoder\n","'use strict'\n\nmodule.exports = function basename (path) {\n if (typeof path !== 'string') { return '' }\n for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var\n switch (path.charCodeAt(i)) {\n case 0x2F: // '/'\n case 0x5C: // '\\'\n path = path.slice(i + 1)\n return (path === '..' || path === '.' ? '' : path)\n }\n }\n return (path === '..' || path === '.' ? '' : path)\n}\n","'use strict'\n\n// Node has always utf-8\nconst utf8Decoder = new TextDecoder('utf-8')\nconst textDecoders = new Map([\n ['utf-8', utf8Decoder],\n ['utf8', utf8Decoder]\n])\n\nfunction decodeText (text, textEncoding, destEncoding) {\n if (text) {\n if (textDecoders.has(destEncoding)) {\n try {\n return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding))\n } catch (e) { }\n } else {\n try {\n textDecoders.set(destEncoding, new TextDecoder(destEncoding))\n return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding))\n } catch (e) { }\n }\n }\n return text\n}\n\nmodule.exports = decodeText\n","'use strict'\n\nmodule.exports = function getLimit (limits, name, defaultLimit) {\n if (\n !limits ||\n limits[name] === undefined ||\n limits[name] === null\n ) { return defaultLimit }\n\n if (\n typeof limits[name] !== 'number' ||\n isNaN(limits[name])\n ) { throw new TypeError('Limit ' + name + ' is not a valid number') }\n\n return limits[name]\n}\n","'use strict'\n\nconst decodeText = require('./decodeText')\n\nconst RE_ENCODED = /%([a-fA-F0-9]{2})/g\n\nfunction encodedReplacer (match, byte) {\n return String.fromCharCode(parseInt(byte, 16))\n}\n\nfunction parseParams (str) {\n const res = []\n let state = 'key'\n let charset = ''\n let inquote = false\n let escaping = false\n let p = 0\n let tmp = ''\n\n for (var i = 0, len = str.length; i < len; ++i) { // eslint-disable-line no-var\n const char = str[i]\n if (char === '\\\\' && inquote) {\n if (escaping) { escaping = false } else {\n escaping = true\n continue\n }\n } else if (char === '\"') {\n if (!escaping) {\n if (inquote) {\n inquote = false\n state = 'key'\n } else { inquote = true }\n continue\n } else { escaping = false }\n } else {\n if (escaping && inquote) { tmp += '\\\\' }\n escaping = false\n if ((state === 'charset' || state === 'lang') && char === \"'\") {\n if (state === 'charset') {\n state = 'lang'\n charset = tmp.substring(1)\n } else { state = 'value' }\n tmp = ''\n continue\n } else if (state === 'key' &&\n (char === '*' || char === '=') &&\n res.length) {\n if (char === '*') { state = 'charset' } else { state = 'value' }\n res[p] = [tmp, undefined]\n tmp = ''\n continue\n } else if (!inquote && char === ';') {\n state = 'key'\n if (charset) {\n if (tmp.length) {\n tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),\n 'binary',\n charset)\n }\n charset = ''\n } else if (tmp.length) {\n tmp = decodeText(tmp, 'binary', 'utf8')\n }\n if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp }\n tmp = ''\n ++p\n continue\n } else if (!inquote && (char === ' ' || char === '\\t')) { continue }\n }\n tmp += char\n }\n if (charset && tmp.length) {\n tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),\n 'binary',\n charset)\n } else if (tmp) {\n tmp = decodeText(tmp, 'binary', 'utf8')\n }\n\n if (res[p] === undefined) {\n if (tmp) { res[p] = tmp }\n } else { res[p][1] = tmp }\n\n return res\n}\n\nmodule.exports = parseParams\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n createTokenAuth: () => createTokenAuth\n});\nmodule.exports = __toCommonJS(dist_src_exports);\n\n// pkg/dist-src/auth.js\nvar REGEX_IS_INSTALLATION_LEGACY = /^v1\\./;\nvar REGEX_IS_INSTALLATION = /^ghs_/;\nvar REGEX_IS_USER_TO_SERVER = /^ghu_/;\nasync function auth(token) {\n const isApp = token.split(/\\./).length === 3;\n const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token);\n const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token);\n const tokenType = isApp ? \"app\" : isInstallation ? \"installation\" : isUserToServer ? \"user-to-server\" : \"oauth\";\n return {\n type: \"token\",\n token,\n tokenType\n };\n}\n\n// pkg/dist-src/with-authorization-prefix.js\nfunction withAuthorizationPrefix(token) {\n if (token.split(/\\./).length === 3) {\n return `bearer ${token}`;\n }\n return `token ${token}`;\n}\n\n// pkg/dist-src/hook.js\nasync function hook(token, request, route, parameters) {\n const endpoint = request.endpoint.merge(\n route,\n parameters\n );\n endpoint.headers.authorization = withAuthorizationPrefix(token);\n return request(endpoint);\n}\n\n// pkg/dist-src/index.js\nvar createTokenAuth = function createTokenAuth2(token) {\n if (!token) {\n throw new Error(\"[@octokit/auth-token] No token passed to createTokenAuth\");\n }\n if (typeof token !== \"string\") {\n throw new Error(\n \"[@octokit/auth-token] Token passed to createTokenAuth is not a string\"\n );\n }\n token = token.replace(/^(token|bearer) +/i, \"\");\n return Object.assign(auth.bind(null, token), {\n hook: hook.bind(null, token)\n });\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createTokenAuth\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n Octokit: () => Octokit\n});\nmodule.exports = __toCommonJS(dist_src_exports);\nvar import_universal_user_agent = require(\"universal-user-agent\");\nvar import_before_after_hook = require(\"before-after-hook\");\nvar import_request = require(\"@octokit/request\");\nvar import_graphql = require(\"@octokit/graphql\");\nvar import_auth_token = require(\"@octokit/auth-token\");\n\n// pkg/dist-src/version.js\nvar VERSION = \"5.0.1\";\n\n// pkg/dist-src/index.js\nvar Octokit = class {\n static {\n this.VERSION = VERSION;\n }\n static defaults(defaults) {\n const OctokitWithDefaults = class extends this {\n constructor(...args) {\n const options = args[0] || {};\n if (typeof defaults === \"function\") {\n super(defaults(options));\n return;\n }\n super(\n Object.assign(\n {},\n defaults,\n options,\n options.userAgent && defaults.userAgent ? {\n userAgent: `${options.userAgent} ${defaults.userAgent}`\n } : null\n )\n );\n }\n };\n return OctokitWithDefaults;\n }\n static {\n this.plugins = [];\n }\n /**\n * Attach a plugin (or many) to your Octokit instance.\n *\n * @example\n * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)\n */\n static plugin(...newPlugins) {\n const currentPlugins = this.plugins;\n const NewOctokit = class extends this {\n static {\n this.plugins = currentPlugins.concat(\n newPlugins.filter((plugin) => !currentPlugins.includes(plugin))\n );\n }\n };\n return NewOctokit;\n }\n constructor(options = {}) {\n const hook = new import_before_after_hook.Collection();\n const requestDefaults = {\n baseUrl: import_request.request.endpoint.DEFAULTS.baseUrl,\n headers: {},\n request: Object.assign({}, options.request, {\n // @ts-ignore internal usage only, no need to type\n hook: hook.bind(null, \"request\")\n }),\n mediaType: {\n previews: [],\n format: \"\"\n }\n };\n requestDefaults.headers[\"user-agent\"] = [\n options.userAgent,\n `octokit-core.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`\n ].filter(Boolean).join(\" \");\n if (options.baseUrl) {\n requestDefaults.baseUrl = options.baseUrl;\n }\n if (options.previews) {\n requestDefaults.mediaType.previews = options.previews;\n }\n if (options.timeZone) {\n requestDefaults.headers[\"time-zone\"] = options.timeZone;\n }\n this.request = import_request.request.defaults(requestDefaults);\n this.graphql = (0, import_graphql.withCustomRequest)(this.request).defaults(requestDefaults);\n this.log = Object.assign(\n {\n debug: () => {\n },\n info: () => {\n },\n warn: console.warn.bind(console),\n error: console.error.bind(console)\n },\n options.log\n );\n this.hook = hook;\n if (!options.authStrategy) {\n if (!options.auth) {\n this.auth = async () => ({\n type: \"unauthenticated\"\n });\n } else {\n const auth = (0, import_auth_token.createTokenAuth)(options.auth);\n hook.wrap(\"request\", auth.hook);\n this.auth = auth;\n }\n } else {\n const { authStrategy, ...otherOptions } = options;\n const auth = authStrategy(\n Object.assign(\n {\n request: this.request,\n log: this.log,\n // we pass the current octokit instance as well as its constructor options\n // to allow for authentication strategies that return a new octokit instance\n // that shares the same internal state as the current one. The original\n // requirement for this was the \"event-octokit\" authentication strategy\n // of https://github.com/probot/octokit-auth-probot.\n octokit: this,\n octokitOptions: otherOptions\n },\n options.auth\n )\n );\n hook.wrap(\"request\", auth.hook);\n this.auth = auth;\n }\n const classConstructor = this.constructor;\n classConstructor.plugins.forEach((plugin) => {\n Object.assign(this, plugin(this, options));\n });\n }\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n Octokit\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n endpoint: () => endpoint\n});\nmodule.exports = __toCommonJS(dist_src_exports);\n\n// pkg/dist-src/defaults.js\nvar import_universal_user_agent = require(\"universal-user-agent\");\n\n// pkg/dist-src/version.js\nvar VERSION = \"9.0.1\";\n\n// pkg/dist-src/defaults.js\nvar userAgent = `octokit-endpoint.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`;\nvar DEFAULTS = {\n method: \"GET\",\n baseUrl: \"https://api.github.com\",\n headers: {\n accept: \"application/vnd.github.v3+json\",\n \"user-agent\": userAgent\n },\n mediaType: {\n format: \"\"\n }\n};\n\n// pkg/dist-src/util/lowercase-keys.js\nfunction lowercaseKeys(object) {\n if (!object) {\n return {};\n }\n return Object.keys(object).reduce((newObj, key) => {\n newObj[key.toLowerCase()] = object[key];\n return newObj;\n }, {});\n}\n\n// pkg/dist-src/util/merge-deep.js\nvar import_is_plain_object = require(\"is-plain-object\");\nfunction mergeDeep(defaults, options) {\n const result = Object.assign({}, defaults);\n Object.keys(options).forEach((key) => {\n if ((0, import_is_plain_object.isPlainObject)(options[key])) {\n if (!(key in defaults))\n Object.assign(result, { [key]: options[key] });\n else\n result[key] = mergeDeep(defaults[key], options[key]);\n } else {\n Object.assign(result, { [key]: options[key] });\n }\n });\n return result;\n}\n\n// pkg/dist-src/util/remove-undefined-properties.js\nfunction removeUndefinedProperties(obj) {\n for (const key in obj) {\n if (obj[key] === void 0) {\n delete obj[key];\n }\n }\n return obj;\n}\n\n// pkg/dist-src/merge.js\nfunction merge(defaults, route, options) {\n if (typeof route === \"string\") {\n let [method, url] = route.split(\" \");\n options = Object.assign(url ? { method, url } : { url: method }, options);\n } else {\n options = Object.assign({}, route);\n }\n options.headers = lowercaseKeys(options.headers);\n removeUndefinedProperties(options);\n removeUndefinedProperties(options.headers);\n const mergedOptions = mergeDeep(defaults || {}, options);\n if (options.url === \"/graphql\") {\n if (defaults && defaults.mediaType.previews?.length) {\n mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(\n (preview) => !mergedOptions.mediaType.previews.includes(preview)\n ).concat(mergedOptions.mediaType.previews);\n }\n mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, \"\"));\n }\n return mergedOptions;\n}\n\n// pkg/dist-src/util/add-query-parameters.js\nfunction addQueryParameters(url, parameters) {\n const separator = /\\?/.test(url) ? \"&\" : \"?\";\n const names = Object.keys(parameters);\n if (names.length === 0) {\n return url;\n }\n return url + separator + names.map((name) => {\n if (name === \"q\") {\n return \"q=\" + parameters.q.split(\"+\").map(encodeURIComponent).join(\"+\");\n }\n return `${name}=${encodeURIComponent(parameters[name])}`;\n }).join(\"&\");\n}\n\n// pkg/dist-src/util/extract-url-variable-names.js\nvar urlVariableRegex = /\\{[^}]+\\}/g;\nfunction removeNonChars(variableName) {\n return variableName.replace(/^\\W+|\\W+$/g, \"\").split(/,/);\n}\nfunction extractUrlVariableNames(url) {\n const matches = url.match(urlVariableRegex);\n if (!matches) {\n return [];\n }\n return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);\n}\n\n// pkg/dist-src/util/omit.js\nfunction omit(object, keysToOmit) {\n return Object.keys(object).filter((option) => !keysToOmit.includes(option)).reduce((obj, key) => {\n obj[key] = object[key];\n return obj;\n }, {});\n}\n\n// pkg/dist-src/util/url-template.js\nfunction encodeReserved(str) {\n return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {\n if (!/%[0-9A-Fa-f]/.test(part)) {\n part = encodeURI(part).replace(/%5B/g, \"[\").replace(/%5D/g, \"]\");\n }\n return part;\n }).join(\"\");\n}\nfunction encodeUnreserved(str) {\n return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {\n return \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\nfunction encodeValue(operator, value, key) {\n value = operator === \"+\" || operator === \"#\" ? encodeReserved(value) : encodeUnreserved(value);\n if (key) {\n return encodeUnreserved(key) + \"=\" + value;\n } else {\n return value;\n }\n}\nfunction isDefined(value) {\n return value !== void 0 && value !== null;\n}\nfunction isKeyOperator(operator) {\n return operator === \";\" || operator === \"&\" || operator === \"?\";\n}\nfunction getValues(context, operator, key, modifier) {\n var value = context[key], result = [];\n if (isDefined(value) && value !== \"\") {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n value = value.toString();\n if (modifier && modifier !== \"*\") {\n value = value.substring(0, parseInt(modifier, 10));\n }\n result.push(\n encodeValue(operator, value, isKeyOperator(operator) ? key : \"\")\n );\n } else {\n if (modifier === \"*\") {\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n result.push(\n encodeValue(operator, value2, isKeyOperator(operator) ? key : \"\")\n );\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n result.push(encodeValue(operator, value[k], k));\n }\n });\n }\n } else {\n const tmp = [];\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n tmp.push(encodeValue(operator, value2));\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n tmp.push(encodeUnreserved(k));\n tmp.push(encodeValue(operator, value[k].toString()));\n }\n });\n }\n if (isKeyOperator(operator)) {\n result.push(encodeUnreserved(key) + \"=\" + tmp.join(\",\"));\n } else if (tmp.length !== 0) {\n result.push(tmp.join(\",\"));\n }\n }\n }\n } else {\n if (operator === \";\") {\n if (isDefined(value)) {\n result.push(encodeUnreserved(key));\n }\n } else if (value === \"\" && (operator === \"&\" || operator === \"?\")) {\n result.push(encodeUnreserved(key) + \"=\");\n } else if (value === \"\") {\n result.push(\"\");\n }\n }\n return result;\n}\nfunction parseUrl(template) {\n return {\n expand: expand.bind(null, template)\n };\n}\nfunction expand(template, context) {\n var operators = [\"+\", \"#\", \".\", \"/\", \";\", \"?\", \"&\"];\n return template.replace(\n /\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g,\n function(_, expression, literal) {\n if (expression) {\n let operator = \"\";\n const values = [];\n if (operators.indexOf(expression.charAt(0)) !== -1) {\n operator = expression.charAt(0);\n expression = expression.substr(1);\n }\n expression.split(/,/g).forEach(function(variable) {\n var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n });\n if (operator && operator !== \"+\") {\n var separator = \",\";\n if (operator === \"?\") {\n separator = \"&\";\n } else if (operator !== \"#\") {\n separator = operator;\n }\n return (values.length !== 0 ? operator : \"\") + values.join(separator);\n } else {\n return values.join(\",\");\n }\n } else {\n return encodeReserved(literal);\n }\n }\n );\n}\n\n// pkg/dist-src/parse.js\nfunction parse(options) {\n let method = options.method.toUpperCase();\n let url = (options.url || \"/\").replace(/:([a-z]\\w+)/g, \"{$1}\");\n let headers = Object.assign({}, options.headers);\n let body;\n let parameters = omit(options, [\n \"method\",\n \"baseUrl\",\n \"url\",\n \"headers\",\n \"request\",\n \"mediaType\"\n ]);\n const urlVariableNames = extractUrlVariableNames(url);\n url = parseUrl(url).expand(parameters);\n if (!/^http/.test(url)) {\n url = options.baseUrl + url;\n }\n const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat(\"baseUrl\");\n const remainingParameters = omit(parameters, omittedParameters);\n const isBinaryRequest = /application\\/octet-stream/i.test(headers.accept);\n if (!isBinaryRequest) {\n if (options.mediaType.format) {\n headers.accept = headers.accept.split(/,/).map(\n (format) => format.replace(\n /application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/,\n `application/vnd$1$2.${options.mediaType.format}`\n )\n ).join(\",\");\n }\n if (url.endsWith(\"/graphql\")) {\n if (options.mediaType.previews?.length) {\n const previewsFromAcceptHeader = headers.accept.match(/[\\w-]+(?=-preview)/g) || [];\n headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map((preview) => {\n const format = options.mediaType.format ? `.${options.mediaType.format}` : \"+json\";\n return `application/vnd.github.${preview}-preview${format}`;\n }).join(\",\");\n }\n }\n }\n if ([\"GET\", \"HEAD\"].includes(method)) {\n url = addQueryParameters(url, remainingParameters);\n } else {\n if (\"data\" in remainingParameters) {\n body = remainingParameters.data;\n } else {\n if (Object.keys(remainingParameters).length) {\n body = remainingParameters;\n }\n }\n }\n if (!headers[\"content-type\"] && typeof body !== \"undefined\") {\n headers[\"content-type\"] = \"application/json; charset=utf-8\";\n }\n if ([\"PATCH\", \"PUT\"].includes(method) && typeof body === \"undefined\") {\n body = \"\";\n }\n return Object.assign(\n { method, url, headers },\n typeof body !== \"undefined\" ? { body } : null,\n options.request ? { request: options.request } : null\n );\n}\n\n// pkg/dist-src/endpoint-with-defaults.js\nfunction endpointWithDefaults(defaults, route, options) {\n return parse(merge(defaults, route, options));\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(oldDefaults, newDefaults) {\n const DEFAULTS2 = merge(oldDefaults, newDefaults);\n const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2);\n return Object.assign(endpoint2, {\n DEFAULTS: DEFAULTS2,\n defaults: withDefaults.bind(null, DEFAULTS2),\n merge: merge.bind(null, DEFAULTS2),\n parse\n });\n}\n\n// pkg/dist-src/index.js\nvar endpoint = withDefaults(null, DEFAULTS);\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n endpoint\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n GraphqlResponseError: () => GraphqlResponseError,\n graphql: () => graphql2,\n withCustomRequest: () => withCustomRequest\n});\nmodule.exports = __toCommonJS(dist_src_exports);\nvar import_request3 = require(\"@octokit/request\");\nvar import_universal_user_agent = require(\"universal-user-agent\");\n\n// pkg/dist-src/version.js\nvar VERSION = \"7.0.2\";\n\n// pkg/dist-src/with-defaults.js\nvar import_request2 = require(\"@octokit/request\");\n\n// pkg/dist-src/graphql.js\nvar import_request = require(\"@octokit/request\");\n\n// pkg/dist-src/error.js\nfunction _buildMessageForResponseErrors(data) {\n return `Request failed due to following response errors:\n` + data.errors.map((e) => ` - ${e.message}`).join(\"\\n\");\n}\nvar GraphqlResponseError = class extends Error {\n constructor(request2, headers, response) {\n super(_buildMessageForResponseErrors(response));\n this.request = request2;\n this.headers = headers;\n this.response = response;\n this.name = \"GraphqlResponseError\";\n this.errors = response.errors;\n this.data = response.data;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n};\n\n// pkg/dist-src/graphql.js\nvar NON_VARIABLE_OPTIONS = [\n \"method\",\n \"baseUrl\",\n \"url\",\n \"headers\",\n \"request\",\n \"query\",\n \"mediaType\"\n];\nvar FORBIDDEN_VARIABLE_OPTIONS = [\"query\", \"method\", \"url\"];\nvar GHES_V3_SUFFIX_REGEX = /\\/api\\/v3\\/?$/;\nfunction graphql(request2, query, options) {\n if (options) {\n if (typeof query === \"string\" && \"query\" in options) {\n return Promise.reject(\n new Error(`[@octokit/graphql] \"query\" cannot be used as variable name`)\n );\n }\n for (const key in options) {\n if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key))\n continue;\n return Promise.reject(\n new Error(\n `[@octokit/graphql] \"${key}\" cannot be used as variable name`\n )\n );\n }\n }\n const parsedOptions = typeof query === \"string\" ? Object.assign({ query }, options) : query;\n const requestOptions = Object.keys(\n parsedOptions\n ).reduce((result, key) => {\n if (NON_VARIABLE_OPTIONS.includes(key)) {\n result[key] = parsedOptions[key];\n return result;\n }\n if (!result.variables) {\n result.variables = {};\n }\n result.variables[key] = parsedOptions[key];\n return result;\n }, {});\n const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl;\n if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {\n requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, \"/api/graphql\");\n }\n return request2(requestOptions).then((response) => {\n if (response.data.errors) {\n const headers = {};\n for (const key of Object.keys(response.headers)) {\n headers[key] = response.headers[key];\n }\n throw new GraphqlResponseError(\n requestOptions,\n headers,\n response.data\n );\n }\n return response.data.data;\n });\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(request2, newDefaults) {\n const newRequest = request2.defaults(newDefaults);\n const newApi = (query, options) => {\n return graphql(newRequest, query, options);\n };\n return Object.assign(newApi, {\n defaults: withDefaults.bind(null, newRequest),\n endpoint: newRequest.endpoint\n });\n}\n\n// pkg/dist-src/index.js\nvar graphql2 = withDefaults(import_request3.request, {\n headers: {\n \"user-agent\": `octokit-graphql.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`\n },\n method: \"POST\",\n url: \"/graphql\"\n});\nfunction withCustomRequest(customRequest) {\n return withDefaults(customRequest, {\n method: \"POST\",\n url: \"/graphql\"\n });\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n GraphqlResponseError,\n graphql,\n withCustomRequest\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n composePaginateRest: () => composePaginateRest,\n isPaginatingEndpoint: () => isPaginatingEndpoint,\n paginateRest: () => paginateRest,\n paginatingEndpoints: () => paginatingEndpoints\n});\nmodule.exports = __toCommonJS(dist_src_exports);\n\n// pkg/dist-src/version.js\nvar VERSION = \"9.0.0\";\n\n// pkg/dist-src/normalize-paginated-list-response.js\nfunction normalizePaginatedListResponse(response) {\n if (!response.data) {\n return {\n ...response,\n data: []\n };\n }\n const responseNeedsNormalization = \"total_count\" in response.data && !(\"url\" in response.data);\n if (!responseNeedsNormalization)\n return response;\n const incompleteResults = response.data.incomplete_results;\n const repositorySelection = response.data.repository_selection;\n const totalCount = response.data.total_count;\n delete response.data.incomplete_results;\n delete response.data.repository_selection;\n delete response.data.total_count;\n const namespaceKey = Object.keys(response.data)[0];\n const data = response.data[namespaceKey];\n response.data = data;\n if (typeof incompleteResults !== \"undefined\") {\n response.data.incomplete_results = incompleteResults;\n }\n if (typeof repositorySelection !== \"undefined\") {\n response.data.repository_selection = repositorySelection;\n }\n response.data.total_count = totalCount;\n return response;\n}\n\n// pkg/dist-src/iterator.js\nfunction iterator(octokit, route, parameters) {\n const options = typeof route === \"function\" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters);\n const requestMethod = typeof route === \"function\" ? route : octokit.request;\n const method = options.method;\n const headers = options.headers;\n let url = options.url;\n return {\n [Symbol.asyncIterator]: () => ({\n async next() {\n if (!url)\n return { done: true };\n try {\n const response = await requestMethod({ method, url, headers });\n const normalizedResponse = normalizePaginatedListResponse(response);\n url = ((normalizedResponse.headers.link || \"\").match(\n /<([^>]+)>;\\s*rel=\"next\"/\n ) || [])[1];\n return { value: normalizedResponse };\n } catch (error) {\n if (error.status !== 409)\n throw error;\n url = \"\";\n return {\n value: {\n status: 200,\n headers: {},\n data: []\n }\n };\n }\n }\n })\n };\n}\n\n// pkg/dist-src/paginate.js\nfunction paginate(octokit, route, parameters, mapFn) {\n if (typeof parameters === \"function\") {\n mapFn = parameters;\n parameters = void 0;\n }\n return gather(\n octokit,\n [],\n iterator(octokit, route, parameters)[Symbol.asyncIterator](),\n mapFn\n );\n}\nfunction gather(octokit, results, iterator2, mapFn) {\n return iterator2.next().then((result) => {\n if (result.done) {\n return results;\n }\n let earlyExit = false;\n function done() {\n earlyExit = true;\n }\n results = results.concat(\n mapFn ? mapFn(result.value, done) : result.value.data\n );\n if (earlyExit) {\n return results;\n }\n return gather(octokit, results, iterator2, mapFn);\n });\n}\n\n// pkg/dist-src/compose-paginate.js\nvar composePaginateRest = Object.assign(paginate, {\n iterator\n});\n\n// pkg/dist-src/generated/paginating-endpoints.js\nvar paginatingEndpoints = [\n \"GET /advisories\",\n \"GET /app/hook/deliveries\",\n \"GET /app/installation-requests\",\n \"GET /app/installations\",\n \"GET /assignments/{assignment_id}/accepted_assignments\",\n \"GET /classrooms\",\n \"GET /classrooms/{classroom_id}/assignments\",\n \"GET /enterprises/{enterprise}/dependabot/alerts\",\n \"GET /enterprises/{enterprise}/secret-scanning/alerts\",\n \"GET /events\",\n \"GET /gists\",\n \"GET /gists/public\",\n \"GET /gists/starred\",\n \"GET /gists/{gist_id}/comments\",\n \"GET /gists/{gist_id}/commits\",\n \"GET /gists/{gist_id}/forks\",\n \"GET /installation/repositories\",\n \"GET /issues\",\n \"GET /licenses\",\n \"GET /marketplace_listing/plans\",\n \"GET /marketplace_listing/plans/{plan_id}/accounts\",\n \"GET /marketplace_listing/stubbed/plans\",\n \"GET /marketplace_listing/stubbed/plans/{plan_id}/accounts\",\n \"GET /networks/{owner}/{repo}/events\",\n \"GET /notifications\",\n \"GET /organizations\",\n \"GET /orgs/{org}/actions/cache/usage-by-repository\",\n \"GET /orgs/{org}/actions/permissions/repositories\",\n \"GET /orgs/{org}/actions/runners\",\n \"GET /orgs/{org}/actions/secrets\",\n \"GET /orgs/{org}/actions/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/actions/variables\",\n \"GET /orgs/{org}/actions/variables/{name}/repositories\",\n \"GET /orgs/{org}/blocks\",\n \"GET /orgs/{org}/code-scanning/alerts\",\n \"GET /orgs/{org}/codespaces\",\n \"GET /orgs/{org}/codespaces/secrets\",\n \"GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/copilot/billing/seats\",\n \"GET /orgs/{org}/dependabot/alerts\",\n \"GET /orgs/{org}/dependabot/secrets\",\n \"GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/events\",\n \"GET /orgs/{org}/failed_invitations\",\n \"GET /orgs/{org}/hooks\",\n \"GET /orgs/{org}/hooks/{hook_id}/deliveries\",\n \"GET /orgs/{org}/installations\",\n \"GET /orgs/{org}/invitations\",\n \"GET /orgs/{org}/invitations/{invitation_id}/teams\",\n \"GET /orgs/{org}/issues\",\n \"GET /orgs/{org}/members\",\n \"GET /orgs/{org}/members/{username}/codespaces\",\n \"GET /orgs/{org}/migrations\",\n \"GET /orgs/{org}/migrations/{migration_id}/repositories\",\n \"GET /orgs/{org}/outside_collaborators\",\n \"GET /orgs/{org}/packages\",\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\",\n \"GET /orgs/{org}/personal-access-token-requests\",\n \"GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories\",\n \"GET /orgs/{org}/personal-access-tokens\",\n \"GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories\",\n \"GET /orgs/{org}/projects\",\n \"GET /orgs/{org}/public_members\",\n \"GET /orgs/{org}/repos\",\n \"GET /orgs/{org}/rulesets\",\n \"GET /orgs/{org}/secret-scanning/alerts\",\n \"GET /orgs/{org}/security-advisories\",\n \"GET /orgs/{org}/teams\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\",\n \"GET /orgs/{org}/teams/{team_slug}/invitations\",\n \"GET /orgs/{org}/teams/{team_slug}/members\",\n \"GET /orgs/{org}/teams/{team_slug}/projects\",\n \"GET /orgs/{org}/teams/{team_slug}/repos\",\n \"GET /orgs/{org}/teams/{team_slug}/teams\",\n \"GET /projects/columns/{column_id}/cards\",\n \"GET /projects/{project_id}/collaborators\",\n \"GET /projects/{project_id}/columns\",\n \"GET /repos/{owner}/{repo}/actions/artifacts\",\n \"GET /repos/{owner}/{repo}/actions/caches\",\n \"GET /repos/{owner}/{repo}/actions/organization-secrets\",\n \"GET /repos/{owner}/{repo}/actions/organization-variables\",\n \"GET /repos/{owner}/{repo}/actions/runners\",\n \"GET /repos/{owner}/{repo}/actions/runs\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs\",\n \"GET /repos/{owner}/{repo}/actions/secrets\",\n \"GET /repos/{owner}/{repo}/actions/variables\",\n \"GET /repos/{owner}/{repo}/actions/workflows\",\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs\",\n \"GET /repos/{owner}/{repo}/activity\",\n \"GET /repos/{owner}/{repo}/assignees\",\n \"GET /repos/{owner}/{repo}/branches\",\n \"GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations\",\n \"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs\",\n \"GET /repos/{owner}/{repo}/code-scanning/alerts\",\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\",\n \"GET /repos/{owner}/{repo}/code-scanning/analyses\",\n \"GET /repos/{owner}/{repo}/codespaces\",\n \"GET /repos/{owner}/{repo}/codespaces/devcontainers\",\n \"GET /repos/{owner}/{repo}/codespaces/secrets\",\n \"GET /repos/{owner}/{repo}/collaborators\",\n \"GET /repos/{owner}/{repo}/comments\",\n \"GET /repos/{owner}/{repo}/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/commits\",\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/comments\",\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/check-runs\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/check-suites\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/status\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/statuses\",\n \"GET /repos/{owner}/{repo}/contributors\",\n \"GET /repos/{owner}/{repo}/dependabot/alerts\",\n \"GET /repos/{owner}/{repo}/dependabot/secrets\",\n \"GET /repos/{owner}/{repo}/deployments\",\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\",\n \"GET /repos/{owner}/{repo}/environments\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps\",\n \"GET /repos/{owner}/{repo}/events\",\n \"GET /repos/{owner}/{repo}/forks\",\n \"GET /repos/{owner}/{repo}/hooks\",\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries\",\n \"GET /repos/{owner}/{repo}/invitations\",\n \"GET /repos/{owner}/{repo}/issues\",\n \"GET /repos/{owner}/{repo}/issues/comments\",\n \"GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/issues/events\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/comments\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/events\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/labels\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/reactions\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/timeline\",\n \"GET /repos/{owner}/{repo}/keys\",\n \"GET /repos/{owner}/{repo}/labels\",\n \"GET /repos/{owner}/{repo}/milestones\",\n \"GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels\",\n \"GET /repos/{owner}/{repo}/notifications\",\n \"GET /repos/{owner}/{repo}/pages/builds\",\n \"GET /repos/{owner}/{repo}/projects\",\n \"GET /repos/{owner}/{repo}/pulls\",\n \"GET /repos/{owner}/{repo}/pulls/comments\",\n \"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/comments\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/commits\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/files\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments\",\n \"GET /repos/{owner}/{repo}/releases\",\n \"GET /repos/{owner}/{repo}/releases/{release_id}/assets\",\n \"GET /repos/{owner}/{repo}/releases/{release_id}/reactions\",\n \"GET /repos/{owner}/{repo}/rules/branches/{branch}\",\n \"GET /repos/{owner}/{repo}/rulesets\",\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts\",\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations\",\n \"GET /repos/{owner}/{repo}/security-advisories\",\n \"GET /repos/{owner}/{repo}/stargazers\",\n \"GET /repos/{owner}/{repo}/subscribers\",\n \"GET /repos/{owner}/{repo}/tags\",\n \"GET /repos/{owner}/{repo}/teams\",\n \"GET /repos/{owner}/{repo}/topics\",\n \"GET /repositories\",\n \"GET /repositories/{repository_id}/environments/{environment_name}/secrets\",\n \"GET /repositories/{repository_id}/environments/{environment_name}/variables\",\n \"GET /search/code\",\n \"GET /search/commits\",\n \"GET /search/issues\",\n \"GET /search/labels\",\n \"GET /search/repositories\",\n \"GET /search/topics\",\n \"GET /search/users\",\n \"GET /teams/{team_id}/discussions\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/comments\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/reactions\",\n \"GET /teams/{team_id}/invitations\",\n \"GET /teams/{team_id}/members\",\n \"GET /teams/{team_id}/projects\",\n \"GET /teams/{team_id}/repos\",\n \"GET /teams/{team_id}/teams\",\n \"GET /user/blocks\",\n \"GET /user/codespaces\",\n \"GET /user/codespaces/secrets\",\n \"GET /user/emails\",\n \"GET /user/followers\",\n \"GET /user/following\",\n \"GET /user/gpg_keys\",\n \"GET /user/installations\",\n \"GET /user/installations/{installation_id}/repositories\",\n \"GET /user/issues\",\n \"GET /user/keys\",\n \"GET /user/marketplace_purchases\",\n \"GET /user/marketplace_purchases/stubbed\",\n \"GET /user/memberships/orgs\",\n \"GET /user/migrations\",\n \"GET /user/migrations/{migration_id}/repositories\",\n \"GET /user/orgs\",\n \"GET /user/packages\",\n \"GET /user/packages/{package_type}/{package_name}/versions\",\n \"GET /user/public_emails\",\n \"GET /user/repos\",\n \"GET /user/repository_invitations\",\n \"GET /user/social_accounts\",\n \"GET /user/ssh_signing_keys\",\n \"GET /user/starred\",\n \"GET /user/subscriptions\",\n \"GET /user/teams\",\n \"GET /users\",\n \"GET /users/{username}/events\",\n \"GET /users/{username}/events/orgs/{org}\",\n \"GET /users/{username}/events/public\",\n \"GET /users/{username}/followers\",\n \"GET /users/{username}/following\",\n \"GET /users/{username}/gists\",\n \"GET /users/{username}/gpg_keys\",\n \"GET /users/{username}/keys\",\n \"GET /users/{username}/orgs\",\n \"GET /users/{username}/packages\",\n \"GET /users/{username}/projects\",\n \"GET /users/{username}/received_events\",\n \"GET /users/{username}/received_events/public\",\n \"GET /users/{username}/repos\",\n \"GET /users/{username}/social_accounts\",\n \"GET /users/{username}/ssh_signing_keys\",\n \"GET /users/{username}/starred\",\n \"GET /users/{username}/subscriptions\"\n];\n\n// pkg/dist-src/paginating-endpoints.js\nfunction isPaginatingEndpoint(arg) {\n if (typeof arg === \"string\") {\n return paginatingEndpoints.includes(arg);\n } else {\n return false;\n }\n}\n\n// pkg/dist-src/index.js\nfunction paginateRest(octokit) {\n return {\n paginate: Object.assign(paginate.bind(null, octokit), {\n iterator: iterator.bind(null, octokit)\n })\n };\n}\npaginateRest.VERSION = VERSION;\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n composePaginateRest,\n isPaginatingEndpoint,\n paginateRest,\n paginatingEndpoints\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n legacyRestEndpointMethods: () => legacyRestEndpointMethods,\n restEndpointMethods: () => restEndpointMethods\n});\nmodule.exports = __toCommonJS(dist_src_exports);\n\n// pkg/dist-src/version.js\nvar VERSION = \"10.0.1\";\n\n// pkg/dist-src/generated/endpoints.js\nvar Endpoints = {\n actions: {\n addCustomLabelsToSelfHostedRunnerForOrg: [\n \"POST /orgs/{org}/actions/runners/{runner_id}/labels\"\n ],\n addCustomLabelsToSelfHostedRunnerForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\"\n ],\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n addSelectedRepoToOrgVariable: [\n \"PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}\"\n ],\n approveWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve\"\n ],\n cancelWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel\"\n ],\n createEnvironmentVariable: [\n \"POST /repositories/{repository_id}/environments/{environment_name}/variables\"\n ],\n createOrUpdateEnvironmentSecret: [\n \"PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}\"\n ],\n createOrUpdateOrgSecret: [\"PUT /orgs/{org}/actions/secrets/{secret_name}\"],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}\"\n ],\n createOrgVariable: [\"POST /orgs/{org}/actions/variables\"],\n createRegistrationTokenForOrg: [\n \"POST /orgs/{org}/actions/runners/registration-token\"\n ],\n createRegistrationTokenForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/registration-token\"\n ],\n createRemoveTokenForOrg: [\"POST /orgs/{org}/actions/runners/remove-token\"],\n createRemoveTokenForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/remove-token\"\n ],\n createRepoVariable: [\"POST /repos/{owner}/{repo}/actions/variables\"],\n createWorkflowDispatch: [\n \"POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches\"\n ],\n deleteActionsCacheById: [\n \"DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}\"\n ],\n deleteActionsCacheByKey: [\n \"DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}\"\n ],\n deleteArtifact: [\n \"DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}\"\n ],\n deleteEnvironmentSecret: [\n \"DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}\"\n ],\n deleteEnvironmentVariable: [\n \"DELETE /repositories/{repository_id}/environments/{environment_name}/variables/{name}\"\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/actions/secrets/{secret_name}\"],\n deleteOrgVariable: [\"DELETE /orgs/{org}/actions/variables/{name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}\"\n ],\n deleteRepoVariable: [\n \"DELETE /repos/{owner}/{repo}/actions/variables/{name}\"\n ],\n deleteSelfHostedRunnerFromOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}\"\n ],\n deleteSelfHostedRunnerFromRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}\"\n ],\n deleteWorkflowRun: [\"DELETE /repos/{owner}/{repo}/actions/runs/{run_id}\"],\n deleteWorkflowRunLogs: [\n \"DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs\"\n ],\n disableSelectedRepositoryGithubActionsOrganization: [\n \"DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}\"\n ],\n disableWorkflow: [\n \"PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable\"\n ],\n downloadArtifact: [\n \"GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}\"\n ],\n downloadJobLogsForWorkflowRun: [\n \"GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs\"\n ],\n downloadWorkflowRunAttemptLogs: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs\"\n ],\n downloadWorkflowRunLogs: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs\"\n ],\n enableSelectedRepositoryGithubActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/repositories/{repository_id}\"\n ],\n enableWorkflow: [\n \"PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable\"\n ],\n generateRunnerJitconfigForOrg: [\n \"POST /orgs/{org}/actions/runners/generate-jitconfig\"\n ],\n generateRunnerJitconfigForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig\"\n ],\n getActionsCacheList: [\"GET /repos/{owner}/{repo}/actions/caches\"],\n getActionsCacheUsage: [\"GET /repos/{owner}/{repo}/actions/cache/usage\"],\n getActionsCacheUsageByRepoForOrg: [\n \"GET /orgs/{org}/actions/cache/usage-by-repository\"\n ],\n getActionsCacheUsageForOrg: [\"GET /orgs/{org}/actions/cache/usage\"],\n getAllowedActionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/selected-actions\"\n ],\n getAllowedActionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/selected-actions\"\n ],\n getArtifact: [\"GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}\"],\n getEnvironmentPublicKey: [\n \"GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key\"\n ],\n getEnvironmentSecret: [\n \"GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}\"\n ],\n getEnvironmentVariable: [\n \"GET /repositories/{repository_id}/environments/{environment_name}/variables/{name}\"\n ],\n getGithubActionsDefaultWorkflowPermissionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/workflow\"\n ],\n getGithubActionsDefaultWorkflowPermissionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/workflow\"\n ],\n getGithubActionsPermissionsOrganization: [\n \"GET /orgs/{org}/actions/permissions\"\n ],\n getGithubActionsPermissionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions\"\n ],\n getJobForWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/jobs/{job_id}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/actions/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/actions/secrets/{secret_name}\"],\n getOrgVariable: [\"GET /orgs/{org}/actions/variables/{name}\"],\n getPendingDeploymentsForRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments\"\n ],\n getRepoPermissions: [\n \"GET /repos/{owner}/{repo}/actions/permissions\",\n {},\n { renamed: [\"actions\", \"getGithubActionsPermissionsRepository\"] }\n ],\n getRepoPublicKey: [\"GET /repos/{owner}/{repo}/actions/secrets/public-key\"],\n getRepoSecret: [\"GET /repos/{owner}/{repo}/actions/secrets/{secret_name}\"],\n getRepoVariable: [\"GET /repos/{owner}/{repo}/actions/variables/{name}\"],\n getReviewsForRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals\"\n ],\n getSelfHostedRunnerForOrg: [\"GET /orgs/{org}/actions/runners/{runner_id}\"],\n getSelfHostedRunnerForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/{runner_id}\"\n ],\n getWorkflow: [\"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}\"],\n getWorkflowAccessToRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/access\"\n ],\n getWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/runs/{run_id}\"],\n getWorkflowRunAttempt: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}\"\n ],\n getWorkflowRunUsage: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing\"\n ],\n getWorkflowUsage: [\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing\"\n ],\n listArtifactsForRepo: [\"GET /repos/{owner}/{repo}/actions/artifacts\"],\n listEnvironmentSecrets: [\n \"GET /repositories/{repository_id}/environments/{environment_name}/secrets\"\n ],\n listEnvironmentVariables: [\n \"GET /repositories/{repository_id}/environments/{environment_name}/variables\"\n ],\n listJobsForWorkflowRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs\"\n ],\n listJobsForWorkflowRunAttempt: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs\"\n ],\n listLabelsForSelfHostedRunnerForOrg: [\n \"GET /orgs/{org}/actions/runners/{runner_id}/labels\"\n ],\n listLabelsForSelfHostedRunnerForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\"\n ],\n listOrgSecrets: [\"GET /orgs/{org}/actions/secrets\"],\n listOrgVariables: [\"GET /orgs/{org}/actions/variables\"],\n listRepoOrganizationSecrets: [\n \"GET /repos/{owner}/{repo}/actions/organization-secrets\"\n ],\n listRepoOrganizationVariables: [\n \"GET /repos/{owner}/{repo}/actions/organization-variables\"\n ],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/actions/secrets\"],\n listRepoVariables: [\"GET /repos/{owner}/{repo}/actions/variables\"],\n listRepoWorkflows: [\"GET /repos/{owner}/{repo}/actions/workflows\"],\n listRunnerApplicationsForOrg: [\"GET /orgs/{org}/actions/runners/downloads\"],\n listRunnerApplicationsForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/downloads\"\n ],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/actions/secrets/{secret_name}/repositories\"\n ],\n listSelectedReposForOrgVariable: [\n \"GET /orgs/{org}/actions/variables/{name}/repositories\"\n ],\n listSelectedRepositoriesEnabledGithubActionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/repositories\"\n ],\n listSelfHostedRunnersForOrg: [\"GET /orgs/{org}/actions/runners\"],\n listSelfHostedRunnersForRepo: [\"GET /repos/{owner}/{repo}/actions/runners\"],\n listWorkflowRunArtifacts: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts\"\n ],\n listWorkflowRuns: [\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs\"\n ],\n listWorkflowRunsForRepo: [\"GET /repos/{owner}/{repo}/actions/runs\"],\n reRunJobForWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun\"\n ],\n reRunWorkflow: [\"POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun\"],\n reRunWorkflowFailedJobs: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs\"\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}/labels\"\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\"\n ],\n removeCustomLabelFromSelfHostedRunnerForOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}\"\n ],\n removeCustomLabelFromSelfHostedRunnerForRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}\"\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n removeSelectedRepoFromOrgVariable: [\n \"DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}\"\n ],\n reviewCustomGatesForRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule\"\n ],\n reviewPendingDeploymentsForRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments\"\n ],\n setAllowedActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/selected-actions\"\n ],\n setAllowedActionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/selected-actions\"\n ],\n setCustomLabelsForSelfHostedRunnerForOrg: [\n \"PUT /orgs/{org}/actions/runners/{runner_id}/labels\"\n ],\n setCustomLabelsForSelfHostedRunnerForRepo: [\n \"PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\"\n ],\n setGithubActionsDefaultWorkflowPermissionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/workflow\"\n ],\n setGithubActionsDefaultWorkflowPermissionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/workflow\"\n ],\n setGithubActionsPermissionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions\"\n ],\n setGithubActionsPermissionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions\"\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/actions/secrets/{secret_name}/repositories\"\n ],\n setSelectedReposForOrgVariable: [\n \"PUT /orgs/{org}/actions/variables/{name}/repositories\"\n ],\n setSelectedRepositoriesEnabledGithubActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/repositories\"\n ],\n setWorkflowAccessToRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/access\"\n ],\n updateEnvironmentVariable: [\n \"PATCH /repositories/{repository_id}/environments/{environment_name}/variables/{name}\"\n ],\n updateOrgVariable: [\"PATCH /orgs/{org}/actions/variables/{name}\"],\n updateRepoVariable: [\n \"PATCH /repos/{owner}/{repo}/actions/variables/{name}\"\n ]\n },\n activity: {\n checkRepoIsStarredByAuthenticatedUser: [\"GET /user/starred/{owner}/{repo}\"],\n deleteRepoSubscription: [\"DELETE /repos/{owner}/{repo}/subscription\"],\n deleteThreadSubscription: [\n \"DELETE /notifications/threads/{thread_id}/subscription\"\n ],\n getFeeds: [\"GET /feeds\"],\n getRepoSubscription: [\"GET /repos/{owner}/{repo}/subscription\"],\n getThread: [\"GET /notifications/threads/{thread_id}\"],\n getThreadSubscriptionForAuthenticatedUser: [\n \"GET /notifications/threads/{thread_id}/subscription\"\n ],\n listEventsForAuthenticatedUser: [\"GET /users/{username}/events\"],\n listNotificationsForAuthenticatedUser: [\"GET /notifications\"],\n listOrgEventsForAuthenticatedUser: [\n \"GET /users/{username}/events/orgs/{org}\"\n ],\n listPublicEvents: [\"GET /events\"],\n listPublicEventsForRepoNetwork: [\"GET /networks/{owner}/{repo}/events\"],\n listPublicEventsForUser: [\"GET /users/{username}/events/public\"],\n listPublicOrgEvents: [\"GET /orgs/{org}/events\"],\n listReceivedEventsForUser: [\"GET /users/{username}/received_events\"],\n listReceivedPublicEventsForUser: [\n \"GET /users/{username}/received_events/public\"\n ],\n listRepoEvents: [\"GET /repos/{owner}/{repo}/events\"],\n listRepoNotificationsForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/notifications\"\n ],\n listReposStarredByAuthenticatedUser: [\"GET /user/starred\"],\n listReposStarredByUser: [\"GET /users/{username}/starred\"],\n listReposWatchedByUser: [\"GET /users/{username}/subscriptions\"],\n listStargazersForRepo: [\"GET /repos/{owner}/{repo}/stargazers\"],\n listWatchedReposForAuthenticatedUser: [\"GET /user/subscriptions\"],\n listWatchersForRepo: [\"GET /repos/{owner}/{repo}/subscribers\"],\n markNotificationsAsRead: [\"PUT /notifications\"],\n markRepoNotificationsAsRead: [\"PUT /repos/{owner}/{repo}/notifications\"],\n markThreadAsRead: [\"PATCH /notifications/threads/{thread_id}\"],\n setRepoSubscription: [\"PUT /repos/{owner}/{repo}/subscription\"],\n setThreadSubscription: [\n \"PUT /notifications/threads/{thread_id}/subscription\"\n ],\n starRepoForAuthenticatedUser: [\"PUT /user/starred/{owner}/{repo}\"],\n unstarRepoForAuthenticatedUser: [\"DELETE /user/starred/{owner}/{repo}\"]\n },\n apps: {\n addRepoToInstallation: [\n \"PUT /user/installations/{installation_id}/repositories/{repository_id}\",\n {},\n { renamed: [\"apps\", \"addRepoToInstallationForAuthenticatedUser\"] }\n ],\n addRepoToInstallationForAuthenticatedUser: [\n \"PUT /user/installations/{installation_id}/repositories/{repository_id}\"\n ],\n checkToken: [\"POST /applications/{client_id}/token\"],\n createFromManifest: [\"POST /app-manifests/{code}/conversions\"],\n createInstallationAccessToken: [\n \"POST /app/installations/{installation_id}/access_tokens\"\n ],\n deleteAuthorization: [\"DELETE /applications/{client_id}/grant\"],\n deleteInstallation: [\"DELETE /app/installations/{installation_id}\"],\n deleteToken: [\"DELETE /applications/{client_id}/token\"],\n getAuthenticated: [\"GET /app\"],\n getBySlug: [\"GET /apps/{app_slug}\"],\n getInstallation: [\"GET /app/installations/{installation_id}\"],\n getOrgInstallation: [\"GET /orgs/{org}/installation\"],\n getRepoInstallation: [\"GET /repos/{owner}/{repo}/installation\"],\n getSubscriptionPlanForAccount: [\n \"GET /marketplace_listing/accounts/{account_id}\"\n ],\n getSubscriptionPlanForAccountStubbed: [\n \"GET /marketplace_listing/stubbed/accounts/{account_id}\"\n ],\n getUserInstallation: [\"GET /users/{username}/installation\"],\n getWebhookConfigForApp: [\"GET /app/hook/config\"],\n getWebhookDelivery: [\"GET /app/hook/deliveries/{delivery_id}\"],\n listAccountsForPlan: [\"GET /marketplace_listing/plans/{plan_id}/accounts\"],\n listAccountsForPlanStubbed: [\n \"GET /marketplace_listing/stubbed/plans/{plan_id}/accounts\"\n ],\n listInstallationReposForAuthenticatedUser: [\n \"GET /user/installations/{installation_id}/repositories\"\n ],\n listInstallationRequestsForAuthenticatedApp: [\n \"GET /app/installation-requests\"\n ],\n listInstallations: [\"GET /app/installations\"],\n listInstallationsForAuthenticatedUser: [\"GET /user/installations\"],\n listPlans: [\"GET /marketplace_listing/plans\"],\n listPlansStubbed: [\"GET /marketplace_listing/stubbed/plans\"],\n listReposAccessibleToInstallation: [\"GET /installation/repositories\"],\n listSubscriptionsForAuthenticatedUser: [\"GET /user/marketplace_purchases\"],\n listSubscriptionsForAuthenticatedUserStubbed: [\n \"GET /user/marketplace_purchases/stubbed\"\n ],\n listWebhookDeliveries: [\"GET /app/hook/deliveries\"],\n redeliverWebhookDelivery: [\n \"POST /app/hook/deliveries/{delivery_id}/attempts\"\n ],\n removeRepoFromInstallation: [\n \"DELETE /user/installations/{installation_id}/repositories/{repository_id}\",\n {},\n { renamed: [\"apps\", \"removeRepoFromInstallationForAuthenticatedUser\"] }\n ],\n removeRepoFromInstallationForAuthenticatedUser: [\n \"DELETE /user/installations/{installation_id}/repositories/{repository_id}\"\n ],\n resetToken: [\"PATCH /applications/{client_id}/token\"],\n revokeInstallationAccessToken: [\"DELETE /installation/token\"],\n scopeToken: [\"POST /applications/{client_id}/token/scoped\"],\n suspendInstallation: [\"PUT /app/installations/{installation_id}/suspended\"],\n unsuspendInstallation: [\n \"DELETE /app/installations/{installation_id}/suspended\"\n ],\n updateWebhookConfigForApp: [\"PATCH /app/hook/config\"]\n },\n billing: {\n getGithubActionsBillingOrg: [\"GET /orgs/{org}/settings/billing/actions\"],\n getGithubActionsBillingUser: [\n \"GET /users/{username}/settings/billing/actions\"\n ],\n getGithubPackagesBillingOrg: [\"GET /orgs/{org}/settings/billing/packages\"],\n getGithubPackagesBillingUser: [\n \"GET /users/{username}/settings/billing/packages\"\n ],\n getSharedStorageBillingOrg: [\n \"GET /orgs/{org}/settings/billing/shared-storage\"\n ],\n getSharedStorageBillingUser: [\n \"GET /users/{username}/settings/billing/shared-storage\"\n ]\n },\n checks: {\n create: [\"POST /repos/{owner}/{repo}/check-runs\"],\n createSuite: [\"POST /repos/{owner}/{repo}/check-suites\"],\n get: [\"GET /repos/{owner}/{repo}/check-runs/{check_run_id}\"],\n getSuite: [\"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}\"],\n listAnnotations: [\n \"GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations\"\n ],\n listForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/check-runs\"],\n listForSuite: [\n \"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs\"\n ],\n listSuitesForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/check-suites\"],\n rerequestRun: [\n \"POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest\"\n ],\n rerequestSuite: [\n \"POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest\"\n ],\n setSuitesPreferences: [\n \"PATCH /repos/{owner}/{repo}/check-suites/preferences\"\n ],\n update: [\"PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}\"]\n },\n codeScanning: {\n deleteAnalysis: [\n \"DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}\"\n ],\n getAlert: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}\",\n {},\n { renamedParameters: { alert_id: \"alert_number\" } }\n ],\n getAnalysis: [\n \"GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}\"\n ],\n getCodeqlDatabase: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}\"\n ],\n getDefaultSetup: [\"GET /repos/{owner}/{repo}/code-scanning/default-setup\"],\n getSarif: [\"GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}\"],\n listAlertInstances: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\"\n ],\n listAlertsForOrg: [\"GET /orgs/{org}/code-scanning/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/code-scanning/alerts\"],\n listAlertsInstances: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\",\n {},\n { renamed: [\"codeScanning\", \"listAlertInstances\"] }\n ],\n listCodeqlDatabases: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/databases\"\n ],\n listRecentAnalyses: [\"GET /repos/{owner}/{repo}/code-scanning/analyses\"],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}\"\n ],\n updateDefaultSetup: [\n \"PATCH /repos/{owner}/{repo}/code-scanning/default-setup\"\n ],\n uploadSarif: [\"POST /repos/{owner}/{repo}/code-scanning/sarifs\"]\n },\n codesOfConduct: {\n getAllCodesOfConduct: [\"GET /codes_of_conduct\"],\n getConductCode: [\"GET /codes_of_conduct/{key}\"]\n },\n codespaces: {\n addRepositoryForSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n codespaceMachinesForAuthenticatedUser: [\n \"GET /user/codespaces/{codespace_name}/machines\"\n ],\n createForAuthenticatedUser: [\"POST /user/codespaces\"],\n createOrUpdateOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}\"\n ],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\"\n ],\n createOrUpdateSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}\"\n ],\n createWithPrForAuthenticatedUser: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces\"\n ],\n createWithRepoForAuthenticatedUser: [\n \"POST /repos/{owner}/{repo}/codespaces\"\n ],\n deleteForAuthenticatedUser: [\"DELETE /user/codespaces/{codespace_name}\"],\n deleteFromOrganization: [\n \"DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}\"\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/codespaces/secrets/{secret_name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\"\n ],\n deleteSecretForAuthenticatedUser: [\n \"DELETE /user/codespaces/secrets/{secret_name}\"\n ],\n exportForAuthenticatedUser: [\n \"POST /user/codespaces/{codespace_name}/exports\"\n ],\n getCodespacesForUserInOrg: [\n \"GET /orgs/{org}/members/{username}/codespaces\"\n ],\n getExportDetailsForAuthenticatedUser: [\n \"GET /user/codespaces/{codespace_name}/exports/{export_id}\"\n ],\n getForAuthenticatedUser: [\"GET /user/codespaces/{codespace_name}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/codespaces/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/codespaces/secrets/{secret_name}\"],\n getPublicKeyForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/public-key\"\n ],\n getRepoPublicKey: [\n \"GET /repos/{owner}/{repo}/codespaces/secrets/public-key\"\n ],\n getRepoSecret: [\n \"GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\"\n ],\n getSecretForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/{secret_name}\"\n ],\n listDevcontainersInRepositoryForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/devcontainers\"\n ],\n listForAuthenticatedUser: [\"GET /user/codespaces\"],\n listInOrganization: [\n \"GET /orgs/{org}/codespaces\",\n {},\n { renamedParameters: { org_id: \"org\" } }\n ],\n listInRepositoryForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces\"\n ],\n listOrgSecrets: [\"GET /orgs/{org}/codespaces/secrets\"],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/codespaces/secrets\"],\n listRepositoriesForSecretForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/{secret_name}/repositories\"\n ],\n listSecretsForAuthenticatedUser: [\"GET /user/codespaces/secrets\"],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories\"\n ],\n preFlightWithRepoForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/new\"\n ],\n publishForAuthenticatedUser: [\n \"POST /user/codespaces/{codespace_name}/publish\"\n ],\n removeRepositoryForSecretForAuthenticatedUser: [\n \"DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n repoMachinesForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/machines\"\n ],\n setRepositoriesForSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}/repositories\"\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories\"\n ],\n startForAuthenticatedUser: [\"POST /user/codespaces/{codespace_name}/start\"],\n stopForAuthenticatedUser: [\"POST /user/codespaces/{codespace_name}/stop\"],\n stopInOrganization: [\n \"POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop\"\n ],\n updateForAuthenticatedUser: [\"PATCH /user/codespaces/{codespace_name}\"]\n },\n copilot: {\n addCopilotForBusinessSeatsForTeams: [\n \"POST /orgs/{org}/copilot/billing/selected_teams\"\n ],\n addCopilotForBusinessSeatsForUsers: [\n \"POST /orgs/{org}/copilot/billing/selected_users\"\n ],\n cancelCopilotSeatAssignmentForTeams: [\n \"DELETE /orgs/{org}/copilot/billing/selected_teams\"\n ],\n cancelCopilotSeatAssignmentForUsers: [\n \"DELETE /orgs/{org}/copilot/billing/selected_users\"\n ],\n getCopilotOrganizationDetails: [\"GET /orgs/{org}/copilot/billing\"],\n getCopilotSeatAssignmentDetailsForUser: [\n \"GET /orgs/{org}/members/{username}/copilot\"\n ],\n listCopilotSeats: [\"GET /orgs/{org}/copilot/billing/seats\"]\n },\n dependabot: {\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n createOrUpdateOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}\"\n ],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\"\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/dependabot/secrets/{secret_name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\"\n ],\n getAlert: [\"GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/dependabot/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/dependabot/secrets/{secret_name}\"],\n getRepoPublicKey: [\n \"GET /repos/{owner}/{repo}/dependabot/secrets/public-key\"\n ],\n getRepoSecret: [\n \"GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\"\n ],\n listAlertsForEnterprise: [\n \"GET /enterprises/{enterprise}/dependabot/alerts\"\n ],\n listAlertsForOrg: [\"GET /orgs/{org}/dependabot/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/dependabot/alerts\"],\n listOrgSecrets: [\"GET /orgs/{org}/dependabot/secrets\"],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/dependabot/secrets\"],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories\"\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories\"\n ],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}\"\n ]\n },\n dependencyGraph: {\n createRepositorySnapshot: [\n \"POST /repos/{owner}/{repo}/dependency-graph/snapshots\"\n ],\n diffRange: [\n \"GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}\"\n ],\n exportSbom: [\"GET /repos/{owner}/{repo}/dependency-graph/sbom\"]\n },\n emojis: { get: [\"GET /emojis\"] },\n gists: {\n checkIsStarred: [\"GET /gists/{gist_id}/star\"],\n create: [\"POST /gists\"],\n createComment: [\"POST /gists/{gist_id}/comments\"],\n delete: [\"DELETE /gists/{gist_id}\"],\n deleteComment: [\"DELETE /gists/{gist_id}/comments/{comment_id}\"],\n fork: [\"POST /gists/{gist_id}/forks\"],\n get: [\"GET /gists/{gist_id}\"],\n getComment: [\"GET /gists/{gist_id}/comments/{comment_id}\"],\n getRevision: [\"GET /gists/{gist_id}/{sha}\"],\n list: [\"GET /gists\"],\n listComments: [\"GET /gists/{gist_id}/comments\"],\n listCommits: [\"GET /gists/{gist_id}/commits\"],\n listForUser: [\"GET /users/{username}/gists\"],\n listForks: [\"GET /gists/{gist_id}/forks\"],\n listPublic: [\"GET /gists/public\"],\n listStarred: [\"GET /gists/starred\"],\n star: [\"PUT /gists/{gist_id}/star\"],\n unstar: [\"DELETE /gists/{gist_id}/star\"],\n update: [\"PATCH /gists/{gist_id}\"],\n updateComment: [\"PATCH /gists/{gist_id}/comments/{comment_id}\"]\n },\n git: {\n createBlob: [\"POST /repos/{owner}/{repo}/git/blobs\"],\n createCommit: [\"POST /repos/{owner}/{repo}/git/commits\"],\n createRef: [\"POST /repos/{owner}/{repo}/git/refs\"],\n createTag: [\"POST /repos/{owner}/{repo}/git/tags\"],\n createTree: [\"POST /repos/{owner}/{repo}/git/trees\"],\n deleteRef: [\"DELETE /repos/{owner}/{repo}/git/refs/{ref}\"],\n getBlob: [\"GET /repos/{owner}/{repo}/git/blobs/{file_sha}\"],\n getCommit: [\"GET /repos/{owner}/{repo}/git/commits/{commit_sha}\"],\n getRef: [\"GET /repos/{owner}/{repo}/git/ref/{ref}\"],\n getTag: [\"GET /repos/{owner}/{repo}/git/tags/{tag_sha}\"],\n getTree: [\"GET /repos/{owner}/{repo}/git/trees/{tree_sha}\"],\n listMatchingRefs: [\"GET /repos/{owner}/{repo}/git/matching-refs/{ref}\"],\n updateRef: [\"PATCH /repos/{owner}/{repo}/git/refs/{ref}\"]\n },\n gitignore: {\n getAllTemplates: [\"GET /gitignore/templates\"],\n getTemplate: [\"GET /gitignore/templates/{name}\"]\n },\n interactions: {\n getRestrictionsForAuthenticatedUser: [\"GET /user/interaction-limits\"],\n getRestrictionsForOrg: [\"GET /orgs/{org}/interaction-limits\"],\n getRestrictionsForRepo: [\"GET /repos/{owner}/{repo}/interaction-limits\"],\n getRestrictionsForYourPublicRepos: [\n \"GET /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"getRestrictionsForAuthenticatedUser\"] }\n ],\n removeRestrictionsForAuthenticatedUser: [\"DELETE /user/interaction-limits\"],\n removeRestrictionsForOrg: [\"DELETE /orgs/{org}/interaction-limits\"],\n removeRestrictionsForRepo: [\n \"DELETE /repos/{owner}/{repo}/interaction-limits\"\n ],\n removeRestrictionsForYourPublicRepos: [\n \"DELETE /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"removeRestrictionsForAuthenticatedUser\"] }\n ],\n setRestrictionsForAuthenticatedUser: [\"PUT /user/interaction-limits\"],\n setRestrictionsForOrg: [\"PUT /orgs/{org}/interaction-limits\"],\n setRestrictionsForRepo: [\"PUT /repos/{owner}/{repo}/interaction-limits\"],\n setRestrictionsForYourPublicRepos: [\n \"PUT /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"setRestrictionsForAuthenticatedUser\"] }\n ]\n },\n issues: {\n addAssignees: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/assignees\"\n ],\n addLabels: [\"POST /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n checkUserCanBeAssigned: [\"GET /repos/{owner}/{repo}/assignees/{assignee}\"],\n checkUserCanBeAssignedToIssue: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}\"\n ],\n create: [\"POST /repos/{owner}/{repo}/issues\"],\n createComment: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/comments\"\n ],\n createLabel: [\"POST /repos/{owner}/{repo}/labels\"],\n createMilestone: [\"POST /repos/{owner}/{repo}/milestones\"],\n deleteComment: [\n \"DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}\"\n ],\n deleteLabel: [\"DELETE /repos/{owner}/{repo}/labels/{name}\"],\n deleteMilestone: [\n \"DELETE /repos/{owner}/{repo}/milestones/{milestone_number}\"\n ],\n get: [\"GET /repos/{owner}/{repo}/issues/{issue_number}\"],\n getComment: [\"GET /repos/{owner}/{repo}/issues/comments/{comment_id}\"],\n getEvent: [\"GET /repos/{owner}/{repo}/issues/events/{event_id}\"],\n getLabel: [\"GET /repos/{owner}/{repo}/labels/{name}\"],\n getMilestone: [\"GET /repos/{owner}/{repo}/milestones/{milestone_number}\"],\n list: [\"GET /issues\"],\n listAssignees: [\"GET /repos/{owner}/{repo}/assignees\"],\n listComments: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/comments\"],\n listCommentsForRepo: [\"GET /repos/{owner}/{repo}/issues/comments\"],\n listEvents: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/events\"],\n listEventsForRepo: [\"GET /repos/{owner}/{repo}/issues/events\"],\n listEventsForTimeline: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/timeline\"\n ],\n listForAuthenticatedUser: [\"GET /user/issues\"],\n listForOrg: [\"GET /orgs/{org}/issues\"],\n listForRepo: [\"GET /repos/{owner}/{repo}/issues\"],\n listLabelsForMilestone: [\n \"GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels\"\n ],\n listLabelsForRepo: [\"GET /repos/{owner}/{repo}/labels\"],\n listLabelsOnIssue: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/labels\"\n ],\n listMilestones: [\"GET /repos/{owner}/{repo}/milestones\"],\n lock: [\"PUT /repos/{owner}/{repo}/issues/{issue_number}/lock\"],\n removeAllLabels: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels\"\n ],\n removeAssignees: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees\"\n ],\n removeLabel: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}\"\n ],\n setLabels: [\"PUT /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n unlock: [\"DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock\"],\n update: [\"PATCH /repos/{owner}/{repo}/issues/{issue_number}\"],\n updateComment: [\"PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}\"],\n updateLabel: [\"PATCH /repos/{owner}/{repo}/labels/{name}\"],\n updateMilestone: [\n \"PATCH /repos/{owner}/{repo}/milestones/{milestone_number}\"\n ]\n },\n licenses: {\n get: [\"GET /licenses/{license}\"],\n getAllCommonlyUsed: [\"GET /licenses\"],\n getForRepo: [\"GET /repos/{owner}/{repo}/license\"]\n },\n markdown: {\n render: [\"POST /markdown\"],\n renderRaw: [\n \"POST /markdown/raw\",\n { headers: { \"content-type\": \"text/plain; charset=utf-8\" } }\n ]\n },\n meta: {\n get: [\"GET /meta\"],\n getAllVersions: [\"GET /versions\"],\n getOctocat: [\"GET /octocat\"],\n getZen: [\"GET /zen\"],\n root: [\"GET /\"]\n },\n migrations: {\n cancelImport: [\"DELETE /repos/{owner}/{repo}/import\"],\n deleteArchiveForAuthenticatedUser: [\n \"DELETE /user/migrations/{migration_id}/archive\"\n ],\n deleteArchiveForOrg: [\n \"DELETE /orgs/{org}/migrations/{migration_id}/archive\"\n ],\n downloadArchiveForOrg: [\n \"GET /orgs/{org}/migrations/{migration_id}/archive\"\n ],\n getArchiveForAuthenticatedUser: [\n \"GET /user/migrations/{migration_id}/archive\"\n ],\n getCommitAuthors: [\"GET /repos/{owner}/{repo}/import/authors\"],\n getImportStatus: [\"GET /repos/{owner}/{repo}/import\"],\n getLargeFiles: [\"GET /repos/{owner}/{repo}/import/large_files\"],\n getStatusForAuthenticatedUser: [\"GET /user/migrations/{migration_id}\"],\n getStatusForOrg: [\"GET /orgs/{org}/migrations/{migration_id}\"],\n listForAuthenticatedUser: [\"GET /user/migrations\"],\n listForOrg: [\"GET /orgs/{org}/migrations\"],\n listReposForAuthenticatedUser: [\n \"GET /user/migrations/{migration_id}/repositories\"\n ],\n listReposForOrg: [\"GET /orgs/{org}/migrations/{migration_id}/repositories\"],\n listReposForUser: [\n \"GET /user/migrations/{migration_id}/repositories\",\n {},\n { renamed: [\"migrations\", \"listReposForAuthenticatedUser\"] }\n ],\n mapCommitAuthor: [\"PATCH /repos/{owner}/{repo}/import/authors/{author_id}\"],\n setLfsPreference: [\"PATCH /repos/{owner}/{repo}/import/lfs\"],\n startForAuthenticatedUser: [\"POST /user/migrations\"],\n startForOrg: [\"POST /orgs/{org}/migrations\"],\n startImport: [\"PUT /repos/{owner}/{repo}/import\"],\n unlockRepoForAuthenticatedUser: [\n \"DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock\"\n ],\n unlockRepoForOrg: [\n \"DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock\"\n ],\n updateImport: [\"PATCH /repos/{owner}/{repo}/import\"]\n },\n orgs: {\n addSecurityManagerTeam: [\n \"PUT /orgs/{org}/security-managers/teams/{team_slug}\"\n ],\n blockUser: [\"PUT /orgs/{org}/blocks/{username}\"],\n cancelInvitation: [\"DELETE /orgs/{org}/invitations/{invitation_id}\"],\n checkBlockedUser: [\"GET /orgs/{org}/blocks/{username}\"],\n checkMembershipForUser: [\"GET /orgs/{org}/members/{username}\"],\n checkPublicMembershipForUser: [\"GET /orgs/{org}/public_members/{username}\"],\n convertMemberToOutsideCollaborator: [\n \"PUT /orgs/{org}/outside_collaborators/{username}\"\n ],\n createInvitation: [\"POST /orgs/{org}/invitations\"],\n createWebhook: [\"POST /orgs/{org}/hooks\"],\n delete: [\"DELETE /orgs/{org}\"],\n deleteWebhook: [\"DELETE /orgs/{org}/hooks/{hook_id}\"],\n enableOrDisableSecurityProductOnAllOrgRepos: [\n \"POST /orgs/{org}/{security_product}/{enablement}\"\n ],\n get: [\"GET /orgs/{org}\"],\n getMembershipForAuthenticatedUser: [\"GET /user/memberships/orgs/{org}\"],\n getMembershipForUser: [\"GET /orgs/{org}/memberships/{username}\"],\n getWebhook: [\"GET /orgs/{org}/hooks/{hook_id}\"],\n getWebhookConfigForOrg: [\"GET /orgs/{org}/hooks/{hook_id}/config\"],\n getWebhookDelivery: [\n \"GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}\"\n ],\n list: [\"GET /organizations\"],\n listAppInstallations: [\"GET /orgs/{org}/installations\"],\n listBlockedUsers: [\"GET /orgs/{org}/blocks\"],\n listFailedInvitations: [\"GET /orgs/{org}/failed_invitations\"],\n listForAuthenticatedUser: [\"GET /user/orgs\"],\n listForUser: [\"GET /users/{username}/orgs\"],\n listInvitationTeams: [\"GET /orgs/{org}/invitations/{invitation_id}/teams\"],\n listMembers: [\"GET /orgs/{org}/members\"],\n listMembershipsForAuthenticatedUser: [\"GET /user/memberships/orgs\"],\n listOutsideCollaborators: [\"GET /orgs/{org}/outside_collaborators\"],\n listPatGrantRepositories: [\n \"GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories\"\n ],\n listPatGrantRequestRepositories: [\n \"GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories\"\n ],\n listPatGrantRequests: [\"GET /orgs/{org}/personal-access-token-requests\"],\n listPatGrants: [\"GET /orgs/{org}/personal-access-tokens\"],\n listPendingInvitations: [\"GET /orgs/{org}/invitations\"],\n listPublicMembers: [\"GET /orgs/{org}/public_members\"],\n listSecurityManagerTeams: [\"GET /orgs/{org}/security-managers\"],\n listWebhookDeliveries: [\"GET /orgs/{org}/hooks/{hook_id}/deliveries\"],\n listWebhooks: [\"GET /orgs/{org}/hooks\"],\n pingWebhook: [\"POST /orgs/{org}/hooks/{hook_id}/pings\"],\n redeliverWebhookDelivery: [\n \"POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts\"\n ],\n removeMember: [\"DELETE /orgs/{org}/members/{username}\"],\n removeMembershipForUser: [\"DELETE /orgs/{org}/memberships/{username}\"],\n removeOutsideCollaborator: [\n \"DELETE /orgs/{org}/outside_collaborators/{username}\"\n ],\n removePublicMembershipForAuthenticatedUser: [\n \"DELETE /orgs/{org}/public_members/{username}\"\n ],\n removeSecurityManagerTeam: [\n \"DELETE /orgs/{org}/security-managers/teams/{team_slug}\"\n ],\n reviewPatGrantRequest: [\n \"POST /orgs/{org}/personal-access-token-requests/{pat_request_id}\"\n ],\n reviewPatGrantRequestsInBulk: [\n \"POST /orgs/{org}/personal-access-token-requests\"\n ],\n setMembershipForUser: [\"PUT /orgs/{org}/memberships/{username}\"],\n setPublicMembershipForAuthenticatedUser: [\n \"PUT /orgs/{org}/public_members/{username}\"\n ],\n unblockUser: [\"DELETE /orgs/{org}/blocks/{username}\"],\n update: [\"PATCH /orgs/{org}\"],\n updateMembershipForAuthenticatedUser: [\n \"PATCH /user/memberships/orgs/{org}\"\n ],\n updatePatAccess: [\"POST /orgs/{org}/personal-access-tokens/{pat_id}\"],\n updatePatAccesses: [\"POST /orgs/{org}/personal-access-tokens\"],\n updateWebhook: [\"PATCH /orgs/{org}/hooks/{hook_id}\"],\n updateWebhookConfigForOrg: [\"PATCH /orgs/{org}/hooks/{hook_id}/config\"]\n },\n packages: {\n deletePackageForAuthenticatedUser: [\n \"DELETE /user/packages/{package_type}/{package_name}\"\n ],\n deletePackageForOrg: [\n \"DELETE /orgs/{org}/packages/{package_type}/{package_name}\"\n ],\n deletePackageForUser: [\n \"DELETE /users/{username}/packages/{package_type}/{package_name}\"\n ],\n deletePackageVersionForAuthenticatedUser: [\n \"DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n deletePackageVersionForOrg: [\n \"DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n deletePackageVersionForUser: [\n \"DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n getAllPackageVersionsForAPackageOwnedByAnOrg: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\",\n {},\n { renamed: [\"packages\", \"getAllPackageVersionsForPackageOwnedByOrg\"] }\n ],\n getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions\",\n {},\n {\n renamed: [\n \"packages\",\n \"getAllPackageVersionsForPackageOwnedByAuthenticatedUser\"\n ]\n }\n ],\n getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions\"\n ],\n getAllPackageVersionsForPackageOwnedByOrg: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\"\n ],\n getAllPackageVersionsForPackageOwnedByUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}/versions\"\n ],\n getPackageForAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}\"\n ],\n getPackageForOrganization: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}\"\n ],\n getPackageForUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}\"\n ],\n getPackageVersionForAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n getPackageVersionForOrganization: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n getPackageVersionForUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n listDockerMigrationConflictingPackagesForAuthenticatedUser: [\n \"GET /user/docker/conflicts\"\n ],\n listDockerMigrationConflictingPackagesForOrganization: [\n \"GET /orgs/{org}/docker/conflicts\"\n ],\n listDockerMigrationConflictingPackagesForUser: [\n \"GET /users/{username}/docker/conflicts\"\n ],\n listPackagesForAuthenticatedUser: [\"GET /user/packages\"],\n listPackagesForOrganization: [\"GET /orgs/{org}/packages\"],\n listPackagesForUser: [\"GET /users/{username}/packages\"],\n restorePackageForAuthenticatedUser: [\n \"POST /user/packages/{package_type}/{package_name}/restore{?token}\"\n ],\n restorePackageForOrg: [\n \"POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}\"\n ],\n restorePackageForUser: [\n \"POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}\"\n ],\n restorePackageVersionForAuthenticatedUser: [\n \"POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\"\n ],\n restorePackageVersionForOrg: [\n \"POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\"\n ],\n restorePackageVersionForUser: [\n \"POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\"\n ]\n },\n projects: {\n addCollaborator: [\"PUT /projects/{project_id}/collaborators/{username}\"],\n createCard: [\"POST /projects/columns/{column_id}/cards\"],\n createColumn: [\"POST /projects/{project_id}/columns\"],\n createForAuthenticatedUser: [\"POST /user/projects\"],\n createForOrg: [\"POST /orgs/{org}/projects\"],\n createForRepo: [\"POST /repos/{owner}/{repo}/projects\"],\n delete: [\"DELETE /projects/{project_id}\"],\n deleteCard: [\"DELETE /projects/columns/cards/{card_id}\"],\n deleteColumn: [\"DELETE /projects/columns/{column_id}\"],\n get: [\"GET /projects/{project_id}\"],\n getCard: [\"GET /projects/columns/cards/{card_id}\"],\n getColumn: [\"GET /projects/columns/{column_id}\"],\n getPermissionForUser: [\n \"GET /projects/{project_id}/collaborators/{username}/permission\"\n ],\n listCards: [\"GET /projects/columns/{column_id}/cards\"],\n listCollaborators: [\"GET /projects/{project_id}/collaborators\"],\n listColumns: [\"GET /projects/{project_id}/columns\"],\n listForOrg: [\"GET /orgs/{org}/projects\"],\n listForRepo: [\"GET /repos/{owner}/{repo}/projects\"],\n listForUser: [\"GET /users/{username}/projects\"],\n moveCard: [\"POST /projects/columns/cards/{card_id}/moves\"],\n moveColumn: [\"POST /projects/columns/{column_id}/moves\"],\n removeCollaborator: [\n \"DELETE /projects/{project_id}/collaborators/{username}\"\n ],\n update: [\"PATCH /projects/{project_id}\"],\n updateCard: [\"PATCH /projects/columns/cards/{card_id}\"],\n updateColumn: [\"PATCH /projects/columns/{column_id}\"]\n },\n pulls: {\n checkIfMerged: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/merge\"],\n create: [\"POST /repos/{owner}/{repo}/pulls\"],\n createReplyForReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies\"\n ],\n createReview: [\"POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews\"],\n createReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/comments\"\n ],\n deletePendingReview: [\n \"DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\"\n ],\n deleteReviewComment: [\n \"DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}\"\n ],\n dismissReview: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals\"\n ],\n get: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}\"],\n getReview: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\"\n ],\n getReviewComment: [\"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}\"],\n list: [\"GET /repos/{owner}/{repo}/pulls\"],\n listCommentsForReview: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments\"\n ],\n listCommits: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/commits\"],\n listFiles: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/files\"],\n listRequestedReviewers: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\"\n ],\n listReviewComments: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/comments\"\n ],\n listReviewCommentsForRepo: [\"GET /repos/{owner}/{repo}/pulls/comments\"],\n listReviews: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews\"],\n merge: [\"PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge\"],\n removeRequestedReviewers: [\n \"DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\"\n ],\n requestReviewers: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\"\n ],\n submitReview: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events\"\n ],\n update: [\"PATCH /repos/{owner}/{repo}/pulls/{pull_number}\"],\n updateBranch: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch\"\n ],\n updateReview: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\"\n ],\n updateReviewComment: [\n \"PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}\"\n ]\n },\n rateLimit: { get: [\"GET /rate_limit\"] },\n reactions: {\n createForCommitComment: [\n \"POST /repos/{owner}/{repo}/comments/{comment_id}/reactions\"\n ],\n createForIssue: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/reactions\"\n ],\n createForIssueComment: [\n \"POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\"\n ],\n createForPullRequestReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\"\n ],\n createForRelease: [\n \"POST /repos/{owner}/{repo}/releases/{release_id}/reactions\"\n ],\n createForTeamDiscussionCommentInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\"\n ],\n createForTeamDiscussionInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\"\n ],\n deleteForCommitComment: [\n \"DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}\"\n ],\n deleteForIssue: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}\"\n ],\n deleteForIssueComment: [\n \"DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}\"\n ],\n deleteForPullRequestComment: [\n \"DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}\"\n ],\n deleteForRelease: [\n \"DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}\"\n ],\n deleteForTeamDiscussion: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}\"\n ],\n deleteForTeamDiscussionComment: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}\"\n ],\n listForCommitComment: [\n \"GET /repos/{owner}/{repo}/comments/{comment_id}/reactions\"\n ],\n listForIssue: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/reactions\"],\n listForIssueComment: [\n \"GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\"\n ],\n listForPullRequestReviewComment: [\n \"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\"\n ],\n listForRelease: [\n \"GET /repos/{owner}/{repo}/releases/{release_id}/reactions\"\n ],\n listForTeamDiscussionCommentInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\"\n ],\n listForTeamDiscussionInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\"\n ]\n },\n repos: {\n acceptInvitation: [\n \"PATCH /user/repository_invitations/{invitation_id}\",\n {},\n { renamed: [\"repos\", \"acceptInvitationForAuthenticatedUser\"] }\n ],\n acceptInvitationForAuthenticatedUser: [\n \"PATCH /user/repository_invitations/{invitation_id}\"\n ],\n addAppAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" }\n ],\n addCollaborator: [\"PUT /repos/{owner}/{repo}/collaborators/{username}\"],\n addStatusCheckContexts: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" }\n ],\n addTeamAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" }\n ],\n addUserAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" }\n ],\n checkAutomatedSecurityFixes: [\n \"GET /repos/{owner}/{repo}/automated-security-fixes\"\n ],\n checkCollaborator: [\"GET /repos/{owner}/{repo}/collaborators/{username}\"],\n checkVulnerabilityAlerts: [\n \"GET /repos/{owner}/{repo}/vulnerability-alerts\"\n ],\n codeownersErrors: [\"GET /repos/{owner}/{repo}/codeowners/errors\"],\n compareCommits: [\"GET /repos/{owner}/{repo}/compare/{base}...{head}\"],\n compareCommitsWithBasehead: [\n \"GET /repos/{owner}/{repo}/compare/{basehead}\"\n ],\n createAutolink: [\"POST /repos/{owner}/{repo}/autolinks\"],\n createCommitComment: [\n \"POST /repos/{owner}/{repo}/commits/{commit_sha}/comments\"\n ],\n createCommitSignatureProtection: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\"\n ],\n createCommitStatus: [\"POST /repos/{owner}/{repo}/statuses/{sha}\"],\n createDeployKey: [\"POST /repos/{owner}/{repo}/keys\"],\n createDeployment: [\"POST /repos/{owner}/{repo}/deployments\"],\n createDeploymentBranchPolicy: [\n \"POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\"\n ],\n createDeploymentProtectionRule: [\n \"POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules\"\n ],\n createDeploymentStatus: [\n \"POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\"\n ],\n createDispatchEvent: [\"POST /repos/{owner}/{repo}/dispatches\"],\n createForAuthenticatedUser: [\"POST /user/repos\"],\n createFork: [\"POST /repos/{owner}/{repo}/forks\"],\n createInOrg: [\"POST /orgs/{org}/repos\"],\n createOrUpdateEnvironment: [\n \"PUT /repos/{owner}/{repo}/environments/{environment_name}\"\n ],\n createOrUpdateFileContents: [\"PUT /repos/{owner}/{repo}/contents/{path}\"],\n createOrgRuleset: [\"POST /orgs/{org}/rulesets\"],\n createPagesDeployment: [\"POST /repos/{owner}/{repo}/pages/deployment\"],\n createPagesSite: [\"POST /repos/{owner}/{repo}/pages\"],\n createRelease: [\"POST /repos/{owner}/{repo}/releases\"],\n createRepoRuleset: [\"POST /repos/{owner}/{repo}/rulesets\"],\n createTagProtection: [\"POST /repos/{owner}/{repo}/tags/protection\"],\n createUsingTemplate: [\n \"POST /repos/{template_owner}/{template_repo}/generate\"\n ],\n createWebhook: [\"POST /repos/{owner}/{repo}/hooks\"],\n declineInvitation: [\n \"DELETE /user/repository_invitations/{invitation_id}\",\n {},\n { renamed: [\"repos\", \"declineInvitationForAuthenticatedUser\"] }\n ],\n declineInvitationForAuthenticatedUser: [\n \"DELETE /user/repository_invitations/{invitation_id}\"\n ],\n delete: [\"DELETE /repos/{owner}/{repo}\"],\n deleteAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions\"\n ],\n deleteAdminBranchProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\"\n ],\n deleteAnEnvironment: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}\"\n ],\n deleteAutolink: [\"DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}\"],\n deleteBranchProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection\"\n ],\n deleteCommitComment: [\"DELETE /repos/{owner}/{repo}/comments/{comment_id}\"],\n deleteCommitSignatureProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\"\n ],\n deleteDeployKey: [\"DELETE /repos/{owner}/{repo}/keys/{key_id}\"],\n deleteDeployment: [\n \"DELETE /repos/{owner}/{repo}/deployments/{deployment_id}\"\n ],\n deleteDeploymentBranchPolicy: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\"\n ],\n deleteFile: [\"DELETE /repos/{owner}/{repo}/contents/{path}\"],\n deleteInvitation: [\n \"DELETE /repos/{owner}/{repo}/invitations/{invitation_id}\"\n ],\n deleteOrgRuleset: [\"DELETE /orgs/{org}/rulesets/{ruleset_id}\"],\n deletePagesSite: [\"DELETE /repos/{owner}/{repo}/pages\"],\n deletePullRequestReviewProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\"\n ],\n deleteRelease: [\"DELETE /repos/{owner}/{repo}/releases/{release_id}\"],\n deleteReleaseAsset: [\n \"DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}\"\n ],\n deleteRepoRuleset: [\"DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n deleteTagProtection: [\n \"DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}\"\n ],\n deleteWebhook: [\"DELETE /repos/{owner}/{repo}/hooks/{hook_id}\"],\n disableAutomatedSecurityFixes: [\n \"DELETE /repos/{owner}/{repo}/automated-security-fixes\"\n ],\n disableDeploymentProtectionRule: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}\"\n ],\n disablePrivateVulnerabilityReporting: [\n \"DELETE /repos/{owner}/{repo}/private-vulnerability-reporting\"\n ],\n disableVulnerabilityAlerts: [\n \"DELETE /repos/{owner}/{repo}/vulnerability-alerts\"\n ],\n downloadArchive: [\n \"GET /repos/{owner}/{repo}/zipball/{ref}\",\n {},\n { renamed: [\"repos\", \"downloadZipballArchive\"] }\n ],\n downloadTarballArchive: [\"GET /repos/{owner}/{repo}/tarball/{ref}\"],\n downloadZipballArchive: [\"GET /repos/{owner}/{repo}/zipball/{ref}\"],\n enableAutomatedSecurityFixes: [\n \"PUT /repos/{owner}/{repo}/automated-security-fixes\"\n ],\n enablePrivateVulnerabilityReporting: [\n \"PUT /repos/{owner}/{repo}/private-vulnerability-reporting\"\n ],\n enableVulnerabilityAlerts: [\n \"PUT /repos/{owner}/{repo}/vulnerability-alerts\"\n ],\n generateReleaseNotes: [\n \"POST /repos/{owner}/{repo}/releases/generate-notes\"\n ],\n get: [\"GET /repos/{owner}/{repo}\"],\n getAccessRestrictions: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions\"\n ],\n getAdminBranchProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\"\n ],\n getAllDeploymentProtectionRules: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules\"\n ],\n getAllEnvironments: [\"GET /repos/{owner}/{repo}/environments\"],\n getAllStatusCheckContexts: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\"\n ],\n getAllTopics: [\"GET /repos/{owner}/{repo}/topics\"],\n getAppsWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\"\n ],\n getAutolink: [\"GET /repos/{owner}/{repo}/autolinks/{autolink_id}\"],\n getBranch: [\"GET /repos/{owner}/{repo}/branches/{branch}\"],\n getBranchProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection\"\n ],\n getBranchRules: [\"GET /repos/{owner}/{repo}/rules/branches/{branch}\"],\n getClones: [\"GET /repos/{owner}/{repo}/traffic/clones\"],\n getCodeFrequencyStats: [\"GET /repos/{owner}/{repo}/stats/code_frequency\"],\n getCollaboratorPermissionLevel: [\n \"GET /repos/{owner}/{repo}/collaborators/{username}/permission\"\n ],\n getCombinedStatusForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/status\"],\n getCommit: [\"GET /repos/{owner}/{repo}/commits/{ref}\"],\n getCommitActivityStats: [\"GET /repos/{owner}/{repo}/stats/commit_activity\"],\n getCommitComment: [\"GET /repos/{owner}/{repo}/comments/{comment_id}\"],\n getCommitSignatureProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\"\n ],\n getCommunityProfileMetrics: [\"GET /repos/{owner}/{repo}/community/profile\"],\n getContent: [\"GET /repos/{owner}/{repo}/contents/{path}\"],\n getContributorsStats: [\"GET /repos/{owner}/{repo}/stats/contributors\"],\n getCustomDeploymentProtectionRule: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}\"\n ],\n getDeployKey: [\"GET /repos/{owner}/{repo}/keys/{key_id}\"],\n getDeployment: [\"GET /repos/{owner}/{repo}/deployments/{deployment_id}\"],\n getDeploymentBranchPolicy: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\"\n ],\n getDeploymentStatus: [\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}\"\n ],\n getEnvironment: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}\"\n ],\n getLatestPagesBuild: [\"GET /repos/{owner}/{repo}/pages/builds/latest\"],\n getLatestRelease: [\"GET /repos/{owner}/{repo}/releases/latest\"],\n getOrgRuleset: [\"GET /orgs/{org}/rulesets/{ruleset_id}\"],\n getOrgRulesets: [\"GET /orgs/{org}/rulesets\"],\n getPages: [\"GET /repos/{owner}/{repo}/pages\"],\n getPagesBuild: [\"GET /repos/{owner}/{repo}/pages/builds/{build_id}\"],\n getPagesHealthCheck: [\"GET /repos/{owner}/{repo}/pages/health\"],\n getParticipationStats: [\"GET /repos/{owner}/{repo}/stats/participation\"],\n getPullRequestReviewProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\"\n ],\n getPunchCardStats: [\"GET /repos/{owner}/{repo}/stats/punch_card\"],\n getReadme: [\"GET /repos/{owner}/{repo}/readme\"],\n getReadmeInDirectory: [\"GET /repos/{owner}/{repo}/readme/{dir}\"],\n getRelease: [\"GET /repos/{owner}/{repo}/releases/{release_id}\"],\n getReleaseAsset: [\"GET /repos/{owner}/{repo}/releases/assets/{asset_id}\"],\n getReleaseByTag: [\"GET /repos/{owner}/{repo}/releases/tags/{tag}\"],\n getRepoRuleset: [\"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n getRepoRulesets: [\"GET /repos/{owner}/{repo}/rulesets\"],\n getStatusChecksProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\"\n ],\n getTeamsWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\"\n ],\n getTopPaths: [\"GET /repos/{owner}/{repo}/traffic/popular/paths\"],\n getTopReferrers: [\"GET /repos/{owner}/{repo}/traffic/popular/referrers\"],\n getUsersWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\"\n ],\n getViews: [\"GET /repos/{owner}/{repo}/traffic/views\"],\n getWebhook: [\"GET /repos/{owner}/{repo}/hooks/{hook_id}\"],\n getWebhookConfigForRepo: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/config\"\n ],\n getWebhookDelivery: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}\"\n ],\n listActivities: [\"GET /repos/{owner}/{repo}/activity\"],\n listAutolinks: [\"GET /repos/{owner}/{repo}/autolinks\"],\n listBranches: [\"GET /repos/{owner}/{repo}/branches\"],\n listBranchesForHeadCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head\"\n ],\n listCollaborators: [\"GET /repos/{owner}/{repo}/collaborators\"],\n listCommentsForCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/comments\"\n ],\n listCommitCommentsForRepo: [\"GET /repos/{owner}/{repo}/comments\"],\n listCommitStatusesForRef: [\n \"GET /repos/{owner}/{repo}/commits/{ref}/statuses\"\n ],\n listCommits: [\"GET /repos/{owner}/{repo}/commits\"],\n listContributors: [\"GET /repos/{owner}/{repo}/contributors\"],\n listCustomDeploymentRuleIntegrations: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps\"\n ],\n listDeployKeys: [\"GET /repos/{owner}/{repo}/keys\"],\n listDeploymentBranchPolicies: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\"\n ],\n listDeploymentStatuses: [\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\"\n ],\n listDeployments: [\"GET /repos/{owner}/{repo}/deployments\"],\n listForAuthenticatedUser: [\"GET /user/repos\"],\n listForOrg: [\"GET /orgs/{org}/repos\"],\n listForUser: [\"GET /users/{username}/repos\"],\n listForks: [\"GET /repos/{owner}/{repo}/forks\"],\n listInvitations: [\"GET /repos/{owner}/{repo}/invitations\"],\n listInvitationsForAuthenticatedUser: [\"GET /user/repository_invitations\"],\n listLanguages: [\"GET /repos/{owner}/{repo}/languages\"],\n listPagesBuilds: [\"GET /repos/{owner}/{repo}/pages/builds\"],\n listPublic: [\"GET /repositories\"],\n listPullRequestsAssociatedWithCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls\"\n ],\n listReleaseAssets: [\n \"GET /repos/{owner}/{repo}/releases/{release_id}/assets\"\n ],\n listReleases: [\"GET /repos/{owner}/{repo}/releases\"],\n listTagProtection: [\"GET /repos/{owner}/{repo}/tags/protection\"],\n listTags: [\"GET /repos/{owner}/{repo}/tags\"],\n listTeams: [\"GET /repos/{owner}/{repo}/teams\"],\n listWebhookDeliveries: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries\"\n ],\n listWebhooks: [\"GET /repos/{owner}/{repo}/hooks\"],\n merge: [\"POST /repos/{owner}/{repo}/merges\"],\n mergeUpstream: [\"POST /repos/{owner}/{repo}/merge-upstream\"],\n pingWebhook: [\"POST /repos/{owner}/{repo}/hooks/{hook_id}/pings\"],\n redeliverWebhookDelivery: [\n \"POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts\"\n ],\n removeAppAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" }\n ],\n removeCollaborator: [\n \"DELETE /repos/{owner}/{repo}/collaborators/{username}\"\n ],\n removeStatusCheckContexts: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" }\n ],\n removeStatusCheckProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\"\n ],\n removeTeamAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" }\n ],\n removeUserAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" }\n ],\n renameBranch: [\"POST /repos/{owner}/{repo}/branches/{branch}/rename\"],\n replaceAllTopics: [\"PUT /repos/{owner}/{repo}/topics\"],\n requestPagesBuild: [\"POST /repos/{owner}/{repo}/pages/builds\"],\n setAdminBranchProtection: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\"\n ],\n setAppAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" }\n ],\n setStatusCheckContexts: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" }\n ],\n setTeamAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" }\n ],\n setUserAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" }\n ],\n testPushWebhook: [\"POST /repos/{owner}/{repo}/hooks/{hook_id}/tests\"],\n transfer: [\"POST /repos/{owner}/{repo}/transfer\"],\n update: [\"PATCH /repos/{owner}/{repo}\"],\n updateBranchProtection: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection\"\n ],\n updateCommitComment: [\"PATCH /repos/{owner}/{repo}/comments/{comment_id}\"],\n updateDeploymentBranchPolicy: [\n \"PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\"\n ],\n updateInformationAboutPagesSite: [\"PUT /repos/{owner}/{repo}/pages\"],\n updateInvitation: [\n \"PATCH /repos/{owner}/{repo}/invitations/{invitation_id}\"\n ],\n updateOrgRuleset: [\"PUT /orgs/{org}/rulesets/{ruleset_id}\"],\n updatePullRequestReviewProtection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\"\n ],\n updateRelease: [\"PATCH /repos/{owner}/{repo}/releases/{release_id}\"],\n updateReleaseAsset: [\n \"PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}\"\n ],\n updateRepoRuleset: [\"PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n updateStatusCheckPotection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\",\n {},\n { renamed: [\"repos\", \"updateStatusCheckProtection\"] }\n ],\n updateStatusCheckProtection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\"\n ],\n updateWebhook: [\"PATCH /repos/{owner}/{repo}/hooks/{hook_id}\"],\n updateWebhookConfigForRepo: [\n \"PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config\"\n ],\n uploadReleaseAsset: [\n \"POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}\",\n { baseUrl: \"https://uploads.github.com\" }\n ]\n },\n search: {\n code: [\"GET /search/code\"],\n commits: [\"GET /search/commits\"],\n issuesAndPullRequests: [\"GET /search/issues\"],\n labels: [\"GET /search/labels\"],\n repos: [\"GET /search/repositories\"],\n topics: [\"GET /search/topics\"],\n users: [\"GET /search/users\"]\n },\n secretScanning: {\n getAlert: [\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}\"\n ],\n listAlertsForEnterprise: [\n \"GET /enterprises/{enterprise}/secret-scanning/alerts\"\n ],\n listAlertsForOrg: [\"GET /orgs/{org}/secret-scanning/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/secret-scanning/alerts\"],\n listLocationsForAlert: [\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations\"\n ],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}\"\n ]\n },\n securityAdvisories: {\n createPrivateVulnerabilityReport: [\n \"POST /repos/{owner}/{repo}/security-advisories/reports\"\n ],\n createRepositoryAdvisory: [\n \"POST /repos/{owner}/{repo}/security-advisories\"\n ],\n createRepositoryAdvisoryCveRequest: [\n \"POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve\"\n ],\n getGlobalAdvisory: [\"GET /advisories/{ghsa_id}\"],\n getRepositoryAdvisory: [\n \"GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}\"\n ],\n listGlobalAdvisories: [\"GET /advisories\"],\n listOrgRepositoryAdvisories: [\"GET /orgs/{org}/security-advisories\"],\n listRepositoryAdvisories: [\"GET /repos/{owner}/{repo}/security-advisories\"],\n updateRepositoryAdvisory: [\n \"PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}\"\n ]\n },\n teams: {\n addOrUpdateMembershipForUserInOrg: [\n \"PUT /orgs/{org}/teams/{team_slug}/memberships/{username}\"\n ],\n addOrUpdateProjectPermissionsInOrg: [\n \"PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}\"\n ],\n addOrUpdateRepoPermissionsInOrg: [\n \"PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\"\n ],\n checkPermissionsForProjectInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/projects/{project_id}\"\n ],\n checkPermissionsForRepoInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\"\n ],\n create: [\"POST /orgs/{org}/teams\"],\n createDiscussionCommentInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\"\n ],\n createDiscussionInOrg: [\"POST /orgs/{org}/teams/{team_slug}/discussions\"],\n deleteDiscussionCommentInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\"\n ],\n deleteDiscussionInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\"\n ],\n deleteInOrg: [\"DELETE /orgs/{org}/teams/{team_slug}\"],\n getByName: [\"GET /orgs/{org}/teams/{team_slug}\"],\n getDiscussionCommentInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\"\n ],\n getDiscussionInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\"\n ],\n getMembershipForUserInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/memberships/{username}\"\n ],\n list: [\"GET /orgs/{org}/teams\"],\n listChildInOrg: [\"GET /orgs/{org}/teams/{team_slug}/teams\"],\n listDiscussionCommentsInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\"\n ],\n listDiscussionsInOrg: [\"GET /orgs/{org}/teams/{team_slug}/discussions\"],\n listForAuthenticatedUser: [\"GET /user/teams\"],\n listMembersInOrg: [\"GET /orgs/{org}/teams/{team_slug}/members\"],\n listPendingInvitationsInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/invitations\"\n ],\n listProjectsInOrg: [\"GET /orgs/{org}/teams/{team_slug}/projects\"],\n listReposInOrg: [\"GET /orgs/{org}/teams/{team_slug}/repos\"],\n removeMembershipForUserInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}\"\n ],\n removeProjectInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}\"\n ],\n removeRepoInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\"\n ],\n updateDiscussionCommentInOrg: [\n \"PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\"\n ],\n updateDiscussionInOrg: [\n \"PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\"\n ],\n updateInOrg: [\"PATCH /orgs/{org}/teams/{team_slug}\"]\n },\n users: {\n addEmailForAuthenticated: [\n \"POST /user/emails\",\n {},\n { renamed: [\"users\", \"addEmailForAuthenticatedUser\"] }\n ],\n addEmailForAuthenticatedUser: [\"POST /user/emails\"],\n addSocialAccountForAuthenticatedUser: [\"POST /user/social_accounts\"],\n block: [\"PUT /user/blocks/{username}\"],\n checkBlocked: [\"GET /user/blocks/{username}\"],\n checkFollowingForUser: [\"GET /users/{username}/following/{target_user}\"],\n checkPersonIsFollowedByAuthenticated: [\"GET /user/following/{username}\"],\n createGpgKeyForAuthenticated: [\n \"POST /user/gpg_keys\",\n {},\n { renamed: [\"users\", \"createGpgKeyForAuthenticatedUser\"] }\n ],\n createGpgKeyForAuthenticatedUser: [\"POST /user/gpg_keys\"],\n createPublicSshKeyForAuthenticated: [\n \"POST /user/keys\",\n {},\n { renamed: [\"users\", \"createPublicSshKeyForAuthenticatedUser\"] }\n ],\n createPublicSshKeyForAuthenticatedUser: [\"POST /user/keys\"],\n createSshSigningKeyForAuthenticatedUser: [\"POST /user/ssh_signing_keys\"],\n deleteEmailForAuthenticated: [\n \"DELETE /user/emails\",\n {},\n { renamed: [\"users\", \"deleteEmailForAuthenticatedUser\"] }\n ],\n deleteEmailForAuthenticatedUser: [\"DELETE /user/emails\"],\n deleteGpgKeyForAuthenticated: [\n \"DELETE /user/gpg_keys/{gpg_key_id}\",\n {},\n { renamed: [\"users\", \"deleteGpgKeyForAuthenticatedUser\"] }\n ],\n deleteGpgKeyForAuthenticatedUser: [\"DELETE /user/gpg_keys/{gpg_key_id}\"],\n deletePublicSshKeyForAuthenticated: [\n \"DELETE /user/keys/{key_id}\",\n {},\n { renamed: [\"users\", \"deletePublicSshKeyForAuthenticatedUser\"] }\n ],\n deletePublicSshKeyForAuthenticatedUser: [\"DELETE /user/keys/{key_id}\"],\n deleteSocialAccountForAuthenticatedUser: [\"DELETE /user/social_accounts\"],\n deleteSshSigningKeyForAuthenticatedUser: [\n \"DELETE /user/ssh_signing_keys/{ssh_signing_key_id}\"\n ],\n follow: [\"PUT /user/following/{username}\"],\n getAuthenticated: [\"GET /user\"],\n getByUsername: [\"GET /users/{username}\"],\n getContextForUser: [\"GET /users/{username}/hovercard\"],\n getGpgKeyForAuthenticated: [\n \"GET /user/gpg_keys/{gpg_key_id}\",\n {},\n { renamed: [\"users\", \"getGpgKeyForAuthenticatedUser\"] }\n ],\n getGpgKeyForAuthenticatedUser: [\"GET /user/gpg_keys/{gpg_key_id}\"],\n getPublicSshKeyForAuthenticated: [\n \"GET /user/keys/{key_id}\",\n {},\n { renamed: [\"users\", \"getPublicSshKeyForAuthenticatedUser\"] }\n ],\n getPublicSshKeyForAuthenticatedUser: [\"GET /user/keys/{key_id}\"],\n getSshSigningKeyForAuthenticatedUser: [\n \"GET /user/ssh_signing_keys/{ssh_signing_key_id}\"\n ],\n list: [\"GET /users\"],\n listBlockedByAuthenticated: [\n \"GET /user/blocks\",\n {},\n { renamed: [\"users\", \"listBlockedByAuthenticatedUser\"] }\n ],\n listBlockedByAuthenticatedUser: [\"GET /user/blocks\"],\n listEmailsForAuthenticated: [\n \"GET /user/emails\",\n {},\n { renamed: [\"users\", \"listEmailsForAuthenticatedUser\"] }\n ],\n listEmailsForAuthenticatedUser: [\"GET /user/emails\"],\n listFollowedByAuthenticated: [\n \"GET /user/following\",\n {},\n { renamed: [\"users\", \"listFollowedByAuthenticatedUser\"] }\n ],\n listFollowedByAuthenticatedUser: [\"GET /user/following\"],\n listFollowersForAuthenticatedUser: [\"GET /user/followers\"],\n listFollowersForUser: [\"GET /users/{username}/followers\"],\n listFollowingForUser: [\"GET /users/{username}/following\"],\n listGpgKeysForAuthenticated: [\n \"GET /user/gpg_keys\",\n {},\n { renamed: [\"users\", \"listGpgKeysForAuthenticatedUser\"] }\n ],\n listGpgKeysForAuthenticatedUser: [\"GET /user/gpg_keys\"],\n listGpgKeysForUser: [\"GET /users/{username}/gpg_keys\"],\n listPublicEmailsForAuthenticated: [\n \"GET /user/public_emails\",\n {},\n { renamed: [\"users\", \"listPublicEmailsForAuthenticatedUser\"] }\n ],\n listPublicEmailsForAuthenticatedUser: [\"GET /user/public_emails\"],\n listPublicKeysForUser: [\"GET /users/{username}/keys\"],\n listPublicSshKeysForAuthenticated: [\n \"GET /user/keys\",\n {},\n { renamed: [\"users\", \"listPublicSshKeysForAuthenticatedUser\"] }\n ],\n listPublicSshKeysForAuthenticatedUser: [\"GET /user/keys\"],\n listSocialAccountsForAuthenticatedUser: [\"GET /user/social_accounts\"],\n listSocialAccountsForUser: [\"GET /users/{username}/social_accounts\"],\n listSshSigningKeysForAuthenticatedUser: [\"GET /user/ssh_signing_keys\"],\n listSshSigningKeysForUser: [\"GET /users/{username}/ssh_signing_keys\"],\n setPrimaryEmailVisibilityForAuthenticated: [\n \"PATCH /user/email/visibility\",\n {},\n { renamed: [\"users\", \"setPrimaryEmailVisibilityForAuthenticatedUser\"] }\n ],\n setPrimaryEmailVisibilityForAuthenticatedUser: [\n \"PATCH /user/email/visibility\"\n ],\n unblock: [\"DELETE /user/blocks/{username}\"],\n unfollow: [\"DELETE /user/following/{username}\"],\n updateAuthenticated: [\"PATCH /user\"]\n }\n};\nvar endpoints_default = Endpoints;\n\n// pkg/dist-src/endpoints-to-methods.js\nvar endpointMethodsMap = /* @__PURE__ */ new Map();\nfor (const [scope, endpoints] of Object.entries(endpoints_default)) {\n for (const [methodName, endpoint] of Object.entries(endpoints)) {\n const [route, defaults, decorations] = endpoint;\n const [method, url] = route.split(/ /);\n const endpointDefaults = Object.assign(\n {\n method,\n url\n },\n defaults\n );\n if (!endpointMethodsMap.has(scope)) {\n endpointMethodsMap.set(scope, /* @__PURE__ */ new Map());\n }\n endpointMethodsMap.get(scope).set(methodName, {\n scope,\n methodName,\n endpointDefaults,\n decorations\n });\n }\n}\nvar handler = {\n has({ scope }, methodName) {\n return endpointMethodsMap.get(scope).has(methodName);\n },\n getOwnPropertyDescriptor(target, methodName) {\n return {\n value: this.get(target, methodName),\n // ensures method is in the cache\n configurable: true,\n writable: true,\n enumerable: true\n };\n },\n defineProperty(target, methodName, descriptor) {\n Object.defineProperty(target.cache, methodName, descriptor);\n return true;\n },\n deleteProperty(target, methodName) {\n delete target.cache[methodName];\n return true;\n },\n ownKeys({ scope }) {\n return [...endpointMethodsMap.get(scope).keys()];\n },\n set(target, methodName, value) {\n return target.cache[methodName] = value;\n },\n get({ octokit, scope, cache }, methodName) {\n if (cache[methodName]) {\n return cache[methodName];\n }\n const method = endpointMethodsMap.get(scope).get(methodName);\n if (!method) {\n return void 0;\n }\n const { endpointDefaults, decorations } = method;\n if (decorations) {\n cache[methodName] = decorate(\n octokit,\n scope,\n methodName,\n endpointDefaults,\n decorations\n );\n } else {\n cache[methodName] = octokit.request.defaults(endpointDefaults);\n }\n return cache[methodName];\n }\n};\nfunction endpointsToMethods(octokit) {\n const newMethods = {};\n for (const scope of endpointMethodsMap.keys()) {\n newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler);\n }\n return newMethods;\n}\nfunction decorate(octokit, scope, methodName, defaults, decorations) {\n const requestWithDefaults = octokit.request.defaults(defaults);\n function withDecorations(...args) {\n let options = requestWithDefaults.endpoint.merge(...args);\n if (decorations.mapToData) {\n options = Object.assign({}, options, {\n data: options[decorations.mapToData],\n [decorations.mapToData]: void 0\n });\n return requestWithDefaults(options);\n }\n if (decorations.renamed) {\n const [newScope, newMethodName] = decorations.renamed;\n octokit.log.warn(\n `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`\n );\n }\n if (decorations.deprecated) {\n octokit.log.warn(decorations.deprecated);\n }\n if (decorations.renamedParameters) {\n const options2 = requestWithDefaults.endpoint.merge(...args);\n for (const [name, alias] of Object.entries(\n decorations.renamedParameters\n )) {\n if (name in options2) {\n octokit.log.warn(\n `\"${name}\" parameter is deprecated for \"octokit.${scope}.${methodName}()\". Use \"${alias}\" instead`\n );\n if (!(alias in options2)) {\n options2[alias] = options2[name];\n }\n delete options2[name];\n }\n }\n return requestWithDefaults(options2);\n }\n return requestWithDefaults(...args);\n }\n return Object.assign(withDecorations, requestWithDefaults);\n}\n\n// pkg/dist-src/index.js\nfunction restEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit);\n return {\n rest: api\n };\n}\nrestEndpointMethods.VERSION = VERSION;\nfunction legacyRestEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit);\n return {\n ...api,\n rest: api\n };\n}\nlegacyRestEndpointMethods.VERSION = VERSION;\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n legacyRestEndpointMethods,\n restEndpointMethods\n});\n","\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n RequestError: () => RequestError\n});\nmodule.exports = __toCommonJS(dist_src_exports);\nvar import_deprecation = require(\"deprecation\");\nvar import_once = __toESM(require(\"once\"));\nvar logOnceCode = (0, import_once.default)((deprecation) => console.warn(deprecation));\nvar logOnceHeaders = (0, import_once.default)((deprecation) => console.warn(deprecation));\nvar RequestError = class extends Error {\n constructor(message, statusCode, options) {\n super(message);\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n this.name = \"HttpError\";\n this.status = statusCode;\n let headers;\n if (\"headers\" in options && typeof options.headers !== \"undefined\") {\n headers = options.headers;\n }\n if (\"response\" in options) {\n this.response = options.response;\n headers = options.response.headers;\n }\n const requestCopy = Object.assign({}, options.request);\n if (options.request.headers.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(\n / .*$/,\n \" [REDACTED]\"\n )\n });\n }\n requestCopy.url = requestCopy.url.replace(/\\bclient_secret=\\w+/g, \"client_secret=[REDACTED]\").replace(/\\baccess_token=\\w+/g, \"access_token=[REDACTED]\");\n this.request = requestCopy;\n Object.defineProperty(this, \"code\", {\n get() {\n logOnceCode(\n new import_deprecation.Deprecation(\n \"[@octokit/request-error] `error.code` is deprecated, use `error.status`.\"\n )\n );\n return statusCode;\n }\n });\n Object.defineProperty(this, \"headers\", {\n get() {\n logOnceHeaders(\n new import_deprecation.Deprecation(\n \"[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`.\"\n )\n );\n return headers || {};\n }\n });\n }\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n RequestError\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n request: () => request\n});\nmodule.exports = __toCommonJS(dist_src_exports);\nvar import_endpoint = require(\"@octokit/endpoint\");\nvar import_universal_user_agent = require(\"universal-user-agent\");\n\n// pkg/dist-src/version.js\nvar VERSION = \"8.1.4\";\n\n// pkg/dist-src/fetch-wrapper.js\nvar import_is_plain_object = require(\"is-plain-object\");\nvar import_request_error = require(\"@octokit/request-error\");\n\n// pkg/dist-src/get-buffer-response.js\nfunction getBufferResponse(response) {\n return response.arrayBuffer();\n}\n\n// pkg/dist-src/fetch-wrapper.js\nfunction fetchWrapper(requestOptions) {\n var _a, _b, _c;\n const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console;\n const parseSuccessResponseBody = ((_a = requestOptions.request) == null ? void 0 : _a.parseSuccessResponseBody) !== false;\n if ((0, import_is_plain_object.isPlainObject)(requestOptions.body) || Array.isArray(requestOptions.body)) {\n requestOptions.body = JSON.stringify(requestOptions.body);\n }\n let headers = {};\n let status;\n let url;\n let { fetch } = globalThis;\n if ((_b = requestOptions.request) == null ? void 0 : _b.fetch) {\n fetch = requestOptions.request.fetch;\n }\n if (!fetch) {\n throw new Error(\n \"fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing\"\n );\n }\n return fetch(requestOptions.url, {\n method: requestOptions.method,\n body: requestOptions.body,\n headers: requestOptions.headers,\n signal: (_c = requestOptions.request) == null ? void 0 : _c.signal,\n // duplex must be set if request.body is ReadableStream or Async Iterables.\n // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex.\n ...requestOptions.body && { duplex: \"half\" }\n }).then(async (response) => {\n url = response.url;\n status = response.status;\n for (const keyAndValue of response.headers) {\n headers[keyAndValue[0]] = keyAndValue[1];\n }\n if (\"deprecation\" in headers) {\n const matches = headers.link && headers.link.match(/<([^>]+)>; rel=\"deprecation\"/);\n const deprecationLink = matches && matches.pop();\n log.warn(\n `[@octokit/request] \"${requestOptions.method} ${requestOptions.url}\" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : \"\"}`\n );\n }\n if (status === 204 || status === 205) {\n return;\n }\n if (requestOptions.method === \"HEAD\") {\n if (status < 400) {\n return;\n }\n throw new import_request_error.RequestError(response.statusText, status, {\n response: {\n url,\n status,\n headers,\n data: void 0\n },\n request: requestOptions\n });\n }\n if (status === 304) {\n throw new import_request_error.RequestError(\"Not modified\", status, {\n response: {\n url,\n status,\n headers,\n data: await getResponseData(response)\n },\n request: requestOptions\n });\n }\n if (status >= 400) {\n const data = await getResponseData(response);\n const error = new import_request_error.RequestError(toErrorMessage(data), status, {\n response: {\n url,\n status,\n headers,\n data\n },\n request: requestOptions\n });\n throw error;\n }\n return parseSuccessResponseBody ? await getResponseData(response) : response.body;\n }).then((data) => {\n return {\n status,\n url,\n headers,\n data\n };\n }).catch((error) => {\n if (error instanceof import_request_error.RequestError)\n throw error;\n else if (error.name === \"AbortError\")\n throw error;\n let message = error.message;\n if (error.name === \"TypeError\" && \"cause\" in error) {\n if (error.cause instanceof Error) {\n message = error.cause.message;\n } else if (typeof error.cause === \"string\") {\n message = error.cause;\n }\n }\n throw new import_request_error.RequestError(message, 500, {\n request: requestOptions\n });\n });\n}\nasync function getResponseData(response) {\n const contentType = response.headers.get(\"content-type\");\n if (/application\\/json/.test(contentType)) {\n return response.json();\n }\n if (!contentType || /^text\\/|charset=utf-8$/.test(contentType)) {\n return response.text();\n }\n return getBufferResponse(response);\n}\nfunction toErrorMessage(data) {\n if (typeof data === \"string\")\n return data;\n if (\"message\" in data) {\n if (Array.isArray(data.errors)) {\n return `${data.message}: ${data.errors.map(JSON.stringify).join(\", \")}`;\n }\n return data.message;\n }\n return `Unknown error: ${JSON.stringify(data)}`;\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(oldEndpoint, newDefaults) {\n const endpoint2 = oldEndpoint.defaults(newDefaults);\n const newApi = function(route, parameters) {\n const endpointOptions = endpoint2.merge(route, parameters);\n if (!endpointOptions.request || !endpointOptions.request.hook) {\n return fetchWrapper(endpoint2.parse(endpointOptions));\n }\n const request2 = (route2, parameters2) => {\n return fetchWrapper(\n endpoint2.parse(endpoint2.merge(route2, parameters2))\n );\n };\n Object.assign(request2, {\n endpoint: endpoint2,\n defaults: withDefaults.bind(null, endpoint2)\n });\n return endpointOptions.request.hook(request2, endpointOptions);\n };\n return Object.assign(newApi, {\n endpoint: endpoint2,\n defaults: withDefaults.bind(null, endpoint2)\n });\n}\n\n// pkg/dist-src/index.js\nvar request = withDefaults(import_endpoint.endpoint, {\n headers: {\n \"user-agent\": `octokit-request.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`\n }\n});\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n request\n});\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = exports.DEFAULT_USE_DUALSTACK_ENDPOINT = exports.CONFIG_USE_DUALSTACK_ENDPOINT = exports.ENV_USE_DUALSTACK_ENDPOINT = void 0;\nconst util_config_provider_1 = require(\"@smithy/util-config-provider\");\nexports.ENV_USE_DUALSTACK_ENDPOINT = \"AWS_USE_DUALSTACK_ENDPOINT\";\nexports.CONFIG_USE_DUALSTACK_ENDPOINT = \"use_dualstack_endpoint\";\nexports.DEFAULT_USE_DUALSTACK_ENDPOINT = false;\nexports.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => (0, util_config_provider_1.booleanSelector)(env, exports.ENV_USE_DUALSTACK_ENDPOINT, util_config_provider_1.SelectorType.ENV),\n configFileSelector: (profile) => (0, util_config_provider_1.booleanSelector)(profile, exports.CONFIG_USE_DUALSTACK_ENDPOINT, util_config_provider_1.SelectorType.CONFIG),\n default: false,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = exports.DEFAULT_USE_FIPS_ENDPOINT = exports.CONFIG_USE_FIPS_ENDPOINT = exports.ENV_USE_FIPS_ENDPOINT = void 0;\nconst util_config_provider_1 = require(\"@smithy/util-config-provider\");\nexports.ENV_USE_FIPS_ENDPOINT = \"AWS_USE_FIPS_ENDPOINT\";\nexports.CONFIG_USE_FIPS_ENDPOINT = \"use_fips_endpoint\";\nexports.DEFAULT_USE_FIPS_ENDPOINT = false;\nexports.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => (0, util_config_provider_1.booleanSelector)(env, exports.ENV_USE_FIPS_ENDPOINT, util_config_provider_1.SelectorType.ENV),\n configFileSelector: (profile) => (0, util_config_provider_1.booleanSelector)(profile, exports.CONFIG_USE_FIPS_ENDPOINT, util_config_provider_1.SelectorType.CONFIG),\n default: false,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./NodeUseDualstackEndpointConfigOptions\"), exports);\ntslib_1.__exportStar(require(\"./NodeUseFipsEndpointConfigOptions\"), exports);\ntslib_1.__exportStar(require(\"./resolveCustomEndpointsConfig\"), exports);\ntslib_1.__exportStar(require(\"./resolveEndpointsConfig\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveCustomEndpointsConfig = void 0;\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst resolveCustomEndpointsConfig = (input) => {\n var _a, _b;\n const { endpoint, urlParser } = input;\n return {\n ...input,\n tls: (_a = input.tls) !== null && _a !== void 0 ? _a : true,\n endpoint: (0, util_middleware_1.normalizeProvider)(typeof endpoint === \"string\" ? urlParser(endpoint) : endpoint),\n isCustomEndpoint: true,\n useDualstackEndpoint: (0, util_middleware_1.normalizeProvider)((_b = input.useDualstackEndpoint) !== null && _b !== void 0 ? _b : false),\n };\n};\nexports.resolveCustomEndpointsConfig = resolveCustomEndpointsConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveEndpointsConfig = void 0;\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst getEndpointFromRegion_1 = require(\"./utils/getEndpointFromRegion\");\nconst resolveEndpointsConfig = (input) => {\n var _a, _b;\n const useDualstackEndpoint = (0, util_middleware_1.normalizeProvider)((_a = input.useDualstackEndpoint) !== null && _a !== void 0 ? _a : false);\n const { endpoint, useFipsEndpoint, urlParser } = input;\n return {\n ...input,\n tls: (_b = input.tls) !== null && _b !== void 0 ? _b : true,\n endpoint: endpoint\n ? (0, util_middleware_1.normalizeProvider)(typeof endpoint === \"string\" ? urlParser(endpoint) : endpoint)\n : () => (0, getEndpointFromRegion_1.getEndpointFromRegion)({ ...input, useDualstackEndpoint, useFipsEndpoint }),\n isCustomEndpoint: !!endpoint,\n useDualstackEndpoint,\n };\n};\nexports.resolveEndpointsConfig = resolveEndpointsConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointFromRegion = void 0;\nconst getEndpointFromRegion = async (input) => {\n var _a;\n const { tls = true } = input;\n const region = await input.region();\n const dnsHostRegex = new RegExp(/^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$/);\n if (!dnsHostRegex.test(region)) {\n throw new Error(\"Invalid region in client config\");\n }\n const useDualstackEndpoint = await input.useDualstackEndpoint();\n const useFipsEndpoint = await input.useFipsEndpoint();\n const { hostname } = (_a = (await input.regionInfoProvider(region, { useDualstackEndpoint, useFipsEndpoint }))) !== null && _a !== void 0 ? _a : {};\n if (!hostname) {\n throw new Error(\"Cannot resolve hostname from client config\");\n }\n return input.urlParser(`${tls ? \"https:\" : \"http:\"}//${hostname}`);\n};\nexports.getEndpointFromRegion = getEndpointFromRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./endpointsConfig\"), exports);\ntslib_1.__exportStar(require(\"./regionConfig\"), exports);\ntslib_1.__exportStar(require(\"./regionInfo\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_REGION_CONFIG_FILE_OPTIONS = exports.NODE_REGION_CONFIG_OPTIONS = exports.REGION_INI_NAME = exports.REGION_ENV_NAME = void 0;\nexports.REGION_ENV_NAME = \"AWS_REGION\";\nexports.REGION_INI_NAME = \"region\";\nexports.NODE_REGION_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => env[exports.REGION_ENV_NAME],\n configFileSelector: (profile) => profile[exports.REGION_INI_NAME],\n default: () => {\n throw new Error(\"Region is missing\");\n },\n};\nexports.NODE_REGION_CONFIG_FILE_OPTIONS = {\n preferredFile: \"credentials\",\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRealRegion = void 0;\nconst isFipsRegion_1 = require(\"./isFipsRegion\");\nconst getRealRegion = (region) => (0, isFipsRegion_1.isFipsRegion)(region)\n ? [\"fips-aws-global\", \"aws-fips\"].includes(region)\n ? \"us-east-1\"\n : region.replace(/fips-(dkr-|prod-)?|-fips/, \"\")\n : region;\nexports.getRealRegion = getRealRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./config\"), exports);\ntslib_1.__exportStar(require(\"./resolveRegionConfig\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isFipsRegion = void 0;\nconst isFipsRegion = (region) => typeof region === \"string\" && (region.startsWith(\"fips-\") || region.endsWith(\"-fips\"));\nexports.isFipsRegion = isFipsRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRegionConfig = void 0;\nconst getRealRegion_1 = require(\"./getRealRegion\");\nconst isFipsRegion_1 = require(\"./isFipsRegion\");\nconst resolveRegionConfig = (input) => {\n const { region, useFipsEndpoint } = input;\n if (!region) {\n throw new Error(\"Region is missing\");\n }\n return {\n ...input,\n region: async () => {\n if (typeof region === \"string\") {\n return (0, getRealRegion_1.getRealRegion)(region);\n }\n const providedRegion = await region();\n return (0, getRealRegion_1.getRealRegion)(providedRegion);\n },\n useFipsEndpoint: async () => {\n const providedRegion = typeof region === \"string\" ? region : await region();\n if ((0, isFipsRegion_1.isFipsRegion)(providedRegion)) {\n return true;\n }\n return typeof useFipsEndpoint !== \"function\" ? Promise.resolve(!!useFipsEndpoint) : useFipsEndpoint();\n },\n };\n};\nexports.resolveRegionConfig = resolveRegionConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getHostnameFromVariants = void 0;\nconst getHostnameFromVariants = (variants = [], { useFipsEndpoint, useDualstackEndpoint }) => {\n var _a;\n return (_a = variants.find(({ tags }) => useFipsEndpoint === tags.includes(\"fips\") && useDualstackEndpoint === tags.includes(\"dualstack\"))) === null || _a === void 0 ? void 0 : _a.hostname;\n};\nexports.getHostnameFromVariants = getHostnameFromVariants;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRegionInfo = void 0;\nconst getHostnameFromVariants_1 = require(\"./getHostnameFromVariants\");\nconst getResolvedHostname_1 = require(\"./getResolvedHostname\");\nconst getResolvedPartition_1 = require(\"./getResolvedPartition\");\nconst getResolvedSigningRegion_1 = require(\"./getResolvedSigningRegion\");\nconst getRegionInfo = (region, { useFipsEndpoint = false, useDualstackEndpoint = false, signingService, regionHash, partitionHash, }) => {\n var _a, _b, _c, _d, _e, _f;\n const partition = (0, getResolvedPartition_1.getResolvedPartition)(region, { partitionHash });\n const resolvedRegion = region in regionHash ? region : (_b = (_a = partitionHash[partition]) === null || _a === void 0 ? void 0 : _a.endpoint) !== null && _b !== void 0 ? _b : region;\n const hostnameOptions = { useFipsEndpoint, useDualstackEndpoint };\n const regionHostname = (0, getHostnameFromVariants_1.getHostnameFromVariants)((_c = regionHash[resolvedRegion]) === null || _c === void 0 ? void 0 : _c.variants, hostnameOptions);\n const partitionHostname = (0, getHostnameFromVariants_1.getHostnameFromVariants)((_d = partitionHash[partition]) === null || _d === void 0 ? void 0 : _d.variants, hostnameOptions);\n const hostname = (0, getResolvedHostname_1.getResolvedHostname)(resolvedRegion, { regionHostname, partitionHostname });\n if (hostname === undefined) {\n throw new Error(`Endpoint resolution failed for: ${{ resolvedRegion, useFipsEndpoint, useDualstackEndpoint }}`);\n }\n const signingRegion = (0, getResolvedSigningRegion_1.getResolvedSigningRegion)(hostname, {\n signingRegion: (_e = regionHash[resolvedRegion]) === null || _e === void 0 ? void 0 : _e.signingRegion,\n regionRegex: partitionHash[partition].regionRegex,\n useFipsEndpoint,\n });\n return {\n partition,\n signingService,\n hostname,\n ...(signingRegion && { signingRegion }),\n ...(((_f = regionHash[resolvedRegion]) === null || _f === void 0 ? void 0 : _f.signingService) && {\n signingService: regionHash[resolvedRegion].signingService,\n }),\n };\n};\nexports.getRegionInfo = getRegionInfo;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getResolvedHostname = void 0;\nconst getResolvedHostname = (resolvedRegion, { regionHostname, partitionHostname }) => regionHostname\n ? regionHostname\n : partitionHostname\n ? partitionHostname.replace(\"{region}\", resolvedRegion)\n : undefined;\nexports.getResolvedHostname = getResolvedHostname;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getResolvedPartition = void 0;\nconst getResolvedPartition = (region, { partitionHash }) => { var _a; return (_a = Object.keys(partitionHash || {}).find((key) => partitionHash[key].regions.includes(region))) !== null && _a !== void 0 ? _a : \"aws\"; };\nexports.getResolvedPartition = getResolvedPartition;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getResolvedSigningRegion = void 0;\nconst getResolvedSigningRegion = (hostname, { signingRegion, regionRegex, useFipsEndpoint }) => {\n if (signingRegion) {\n return signingRegion;\n }\n else if (useFipsEndpoint) {\n const regionRegexJs = regionRegex.replace(\"\\\\\\\\\", \"\\\\\").replace(/^\\^/g, \"\\\\.\").replace(/\\$$/g, \"\\\\.\");\n const regionRegexmatchArray = hostname.match(regionRegexJs);\n if (regionRegexmatchArray) {\n return regionRegexmatchArray[0].slice(1, -1);\n }\n }\n};\nexports.getResolvedSigningRegion = getResolvedSigningRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./PartitionHash\"), exports);\ntslib_1.__exportStar(require(\"./RegionHash\"), exports);\ntslib_1.__exportStar(require(\"./getRegionInfo\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Endpoint = void 0;\nvar Endpoint;\n(function (Endpoint) {\n Endpoint[\"IPv4\"] = \"http://169.254.169.254\";\n Endpoint[\"IPv6\"] = \"http://[fd00:ec2::254]\";\n})(Endpoint = exports.Endpoint || (exports.Endpoint = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ENDPOINT_CONFIG_OPTIONS = exports.CONFIG_ENDPOINT_NAME = exports.ENV_ENDPOINT_NAME = void 0;\nexports.ENV_ENDPOINT_NAME = \"AWS_EC2_METADATA_SERVICE_ENDPOINT\";\nexports.CONFIG_ENDPOINT_NAME = \"ec2_metadata_service_endpoint\";\nexports.ENDPOINT_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => env[exports.ENV_ENDPOINT_NAME],\n configFileSelector: (profile) => profile[exports.CONFIG_ENDPOINT_NAME],\n default: undefined,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EndpointMode = void 0;\nvar EndpointMode;\n(function (EndpointMode) {\n EndpointMode[\"IPv4\"] = \"IPv4\";\n EndpointMode[\"IPv6\"] = \"IPv6\";\n})(EndpointMode = exports.EndpointMode || (exports.EndpointMode = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ENDPOINT_MODE_CONFIG_OPTIONS = exports.CONFIG_ENDPOINT_MODE_NAME = exports.ENV_ENDPOINT_MODE_NAME = void 0;\nconst EndpointMode_1 = require(\"./EndpointMode\");\nexports.ENV_ENDPOINT_MODE_NAME = \"AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE\";\nexports.CONFIG_ENDPOINT_MODE_NAME = \"ec2_metadata_service_endpoint_mode\";\nexports.ENDPOINT_MODE_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => env[exports.ENV_ENDPOINT_MODE_NAME],\n configFileSelector: (profile) => profile[exports.CONFIG_ENDPOINT_MODE_NAME],\n default: EndpointMode_1.EndpointMode.IPv4,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromContainerMetadata = exports.ENV_CMDS_AUTH_TOKEN = exports.ENV_CMDS_RELATIVE_URI = exports.ENV_CMDS_FULL_URI = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst url_1 = require(\"url\");\nconst httpRequest_1 = require(\"./remoteProvider/httpRequest\");\nconst ImdsCredentials_1 = require(\"./remoteProvider/ImdsCredentials\");\nconst RemoteProviderInit_1 = require(\"./remoteProvider/RemoteProviderInit\");\nconst retry_1 = require(\"./remoteProvider/retry\");\nexports.ENV_CMDS_FULL_URI = \"AWS_CONTAINER_CREDENTIALS_FULL_URI\";\nexports.ENV_CMDS_RELATIVE_URI = \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\";\nexports.ENV_CMDS_AUTH_TOKEN = \"AWS_CONTAINER_AUTHORIZATION_TOKEN\";\nconst fromContainerMetadata = (init = {}) => {\n const { timeout, maxRetries } = (0, RemoteProviderInit_1.providerConfigFromInit)(init);\n return () => (0, retry_1.retry)(async () => {\n const requestOptions = await getCmdsUri();\n const credsResponse = JSON.parse(await requestFromEcsImds(timeout, requestOptions));\n if (!(0, ImdsCredentials_1.isImdsCredentials)(credsResponse)) {\n throw new property_provider_1.CredentialsProviderError(\"Invalid response received from instance metadata service.\");\n }\n return (0, ImdsCredentials_1.fromImdsCredentials)(credsResponse);\n }, maxRetries);\n};\nexports.fromContainerMetadata = fromContainerMetadata;\nconst requestFromEcsImds = async (timeout, options) => {\n if (process.env[exports.ENV_CMDS_AUTH_TOKEN]) {\n options.headers = {\n ...options.headers,\n Authorization: process.env[exports.ENV_CMDS_AUTH_TOKEN],\n };\n }\n const buffer = await (0, httpRequest_1.httpRequest)({\n ...options,\n timeout,\n });\n return buffer.toString();\n};\nconst CMDS_IP = \"169.254.170.2\";\nconst GREENGRASS_HOSTS = {\n localhost: true,\n \"127.0.0.1\": true,\n};\nconst GREENGRASS_PROTOCOLS = {\n \"http:\": true,\n \"https:\": true,\n};\nconst getCmdsUri = async () => {\n if (process.env[exports.ENV_CMDS_RELATIVE_URI]) {\n return {\n hostname: CMDS_IP,\n path: process.env[exports.ENV_CMDS_RELATIVE_URI],\n };\n }\n if (process.env[exports.ENV_CMDS_FULL_URI]) {\n const parsed = (0, url_1.parse)(process.env[exports.ENV_CMDS_FULL_URI]);\n if (!parsed.hostname || !(parsed.hostname in GREENGRASS_HOSTS)) {\n throw new property_provider_1.CredentialsProviderError(`${parsed.hostname} is not a valid container metadata service hostname`, false);\n }\n if (!parsed.protocol || !(parsed.protocol in GREENGRASS_PROTOCOLS)) {\n throw new property_provider_1.CredentialsProviderError(`${parsed.protocol} is not a valid container metadata service protocol`, false);\n }\n return {\n ...parsed,\n port: parsed.port ? parseInt(parsed.port, 10) : undefined,\n };\n }\n throw new property_provider_1.CredentialsProviderError(\"The container metadata credential provider cannot be used unless\" +\n ` the ${exports.ENV_CMDS_RELATIVE_URI} or ${exports.ENV_CMDS_FULL_URI} environment` +\n \" variable is set\", false);\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromInstanceMetadata = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst httpRequest_1 = require(\"./remoteProvider/httpRequest\");\nconst ImdsCredentials_1 = require(\"./remoteProvider/ImdsCredentials\");\nconst RemoteProviderInit_1 = require(\"./remoteProvider/RemoteProviderInit\");\nconst retry_1 = require(\"./remoteProvider/retry\");\nconst getInstanceMetadataEndpoint_1 = require(\"./utils/getInstanceMetadataEndpoint\");\nconst staticStabilityProvider_1 = require(\"./utils/staticStabilityProvider\");\nconst IMDS_PATH = \"/latest/meta-data/iam/security-credentials/\";\nconst IMDS_TOKEN_PATH = \"/latest/api/token\";\nconst fromInstanceMetadata = (init = {}) => (0, staticStabilityProvider_1.staticStabilityProvider)(getInstanceImdsProvider(init), { logger: init.logger });\nexports.fromInstanceMetadata = fromInstanceMetadata;\nconst getInstanceImdsProvider = (init) => {\n let disableFetchToken = false;\n const { timeout, maxRetries } = (0, RemoteProviderInit_1.providerConfigFromInit)(init);\n const getCredentials = async (maxRetries, options) => {\n const profile = (await (0, retry_1.retry)(async () => {\n let profile;\n try {\n profile = await getProfile(options);\n }\n catch (err) {\n if (err.statusCode === 401) {\n disableFetchToken = false;\n }\n throw err;\n }\n return profile;\n }, maxRetries)).trim();\n return (0, retry_1.retry)(async () => {\n let creds;\n try {\n creds = await getCredentialsFromProfile(profile, options);\n }\n catch (err) {\n if (err.statusCode === 401) {\n disableFetchToken = false;\n }\n throw err;\n }\n return creds;\n }, maxRetries);\n };\n return async () => {\n const endpoint = await (0, getInstanceMetadataEndpoint_1.getInstanceMetadataEndpoint)();\n if (disableFetchToken) {\n return getCredentials(maxRetries, { ...endpoint, timeout });\n }\n else {\n let token;\n try {\n token = (await getMetadataToken({ ...endpoint, timeout })).toString();\n }\n catch (error) {\n if ((error === null || error === void 0 ? void 0 : error.statusCode) === 400) {\n throw Object.assign(error, {\n message: \"EC2 Metadata token request returned error\",\n });\n }\n else if (error.message === \"TimeoutError\" || [403, 404, 405].includes(error.statusCode)) {\n disableFetchToken = true;\n }\n return getCredentials(maxRetries, { ...endpoint, timeout });\n }\n return getCredentials(maxRetries, {\n ...endpoint,\n headers: {\n \"x-aws-ec2-metadata-token\": token,\n },\n timeout,\n });\n }\n };\n};\nconst getMetadataToken = async (options) => (0, httpRequest_1.httpRequest)({\n ...options,\n path: IMDS_TOKEN_PATH,\n method: \"PUT\",\n headers: {\n \"x-aws-ec2-metadata-token-ttl-seconds\": \"21600\",\n },\n});\nconst getProfile = async (options) => (await (0, httpRequest_1.httpRequest)({ ...options, path: IMDS_PATH })).toString();\nconst getCredentialsFromProfile = async (profile, options) => {\n const credsResponse = JSON.parse((await (0, httpRequest_1.httpRequest)({\n ...options,\n path: IMDS_PATH + profile,\n })).toString());\n if (!(0, ImdsCredentials_1.isImdsCredentials)(credsResponse)) {\n throw new property_provider_1.CredentialsProviderError(\"Invalid response received from instance metadata service.\");\n }\n return (0, ImdsCredentials_1.fromImdsCredentials)(credsResponse);\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getInstanceMetadataEndpoint = exports.httpRequest = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromContainerMetadata\"), exports);\ntslib_1.__exportStar(require(\"./fromInstanceMetadata\"), exports);\ntslib_1.__exportStar(require(\"./remoteProvider/RemoteProviderInit\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\nvar httpRequest_1 = require(\"./remoteProvider/httpRequest\");\nObject.defineProperty(exports, \"httpRequest\", { enumerable: true, get: function () { return httpRequest_1.httpRequest; } });\nvar getInstanceMetadataEndpoint_1 = require(\"./utils/getInstanceMetadataEndpoint\");\nObject.defineProperty(exports, \"getInstanceMetadataEndpoint\", { enumerable: true, get: function () { return getInstanceMetadataEndpoint_1.getInstanceMetadataEndpoint; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromImdsCredentials = exports.isImdsCredentials = void 0;\nconst isImdsCredentials = (arg) => Boolean(arg) &&\n typeof arg === \"object\" &&\n typeof arg.AccessKeyId === \"string\" &&\n typeof arg.SecretAccessKey === \"string\" &&\n typeof arg.Token === \"string\" &&\n typeof arg.Expiration === \"string\";\nexports.isImdsCredentials = isImdsCredentials;\nconst fromImdsCredentials = (creds) => ({\n accessKeyId: creds.AccessKeyId,\n secretAccessKey: creds.SecretAccessKey,\n sessionToken: creds.Token,\n expiration: new Date(creds.Expiration),\n});\nexports.fromImdsCredentials = fromImdsCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.providerConfigFromInit = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_TIMEOUT = void 0;\nexports.DEFAULT_TIMEOUT = 1000;\nexports.DEFAULT_MAX_RETRIES = 0;\nconst providerConfigFromInit = ({ maxRetries = exports.DEFAULT_MAX_RETRIES, timeout = exports.DEFAULT_TIMEOUT, }) => ({ maxRetries, timeout });\nexports.providerConfigFromInit = providerConfigFromInit;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.httpRequest = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst buffer_1 = require(\"buffer\");\nconst http_1 = require(\"http\");\nfunction httpRequest(options) {\n return new Promise((resolve, reject) => {\n var _a;\n const req = (0, http_1.request)({\n method: \"GET\",\n ...options,\n hostname: (_a = options.hostname) === null || _a === void 0 ? void 0 : _a.replace(/^\\[(.+)\\]$/, \"$1\"),\n });\n req.on(\"error\", (err) => {\n reject(Object.assign(new property_provider_1.ProviderError(\"Unable to connect to instance metadata service\"), err));\n req.destroy();\n });\n req.on(\"timeout\", () => {\n reject(new property_provider_1.ProviderError(\"TimeoutError from instance metadata service\"));\n req.destroy();\n });\n req.on(\"response\", (res) => {\n const { statusCode = 400 } = res;\n if (statusCode < 200 || 300 <= statusCode) {\n reject(Object.assign(new property_provider_1.ProviderError(\"Error response received from instance metadata service\"), { statusCode }));\n req.destroy();\n }\n const chunks = [];\n res.on(\"data\", (chunk) => {\n chunks.push(chunk);\n });\n res.on(\"end\", () => {\n resolve(buffer_1.Buffer.concat(chunks));\n req.destroy();\n });\n });\n req.end();\n });\n}\nexports.httpRequest = httpRequest;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.retry = void 0;\nconst retry = (toRetry, maxRetries) => {\n let promise = toRetry();\n for (let i = 0; i < maxRetries; i++) {\n promise = promise.catch(toRetry);\n }\n return promise;\n};\nexports.retry = retry;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getExtendedInstanceMetadataCredentials = void 0;\nconst STATIC_STABILITY_REFRESH_INTERVAL_SECONDS = 5 * 60;\nconst STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS = 5 * 60;\nconst STATIC_STABILITY_DOC_URL = \"https://docs.aws.amazon.com/sdkref/latest/guide/feature-static-credentials.html\";\nconst getExtendedInstanceMetadataCredentials = (credentials, logger) => {\n var _a;\n const refreshInterval = STATIC_STABILITY_REFRESH_INTERVAL_SECONDS +\n Math.floor(Math.random() * STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS);\n const newExpiration = new Date(Date.now() + refreshInterval * 1000);\n logger.warn(\"Attempting credential expiration extension due to a credential service availability issue. A refresh of these \" +\n \"credentials will be attempted after ${new Date(newExpiration)}.\\nFor more information, please visit: \" +\n STATIC_STABILITY_DOC_URL);\n const originalExpiration = (_a = credentials.originalExpiration) !== null && _a !== void 0 ? _a : credentials.expiration;\n return {\n ...credentials,\n ...(originalExpiration ? { originalExpiration } : {}),\n expiration: newExpiration,\n };\n};\nexports.getExtendedInstanceMetadataCredentials = getExtendedInstanceMetadataCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getInstanceMetadataEndpoint = void 0;\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst Endpoint_1 = require(\"../config/Endpoint\");\nconst EndpointConfigOptions_1 = require(\"../config/EndpointConfigOptions\");\nconst EndpointMode_1 = require(\"../config/EndpointMode\");\nconst EndpointModeConfigOptions_1 = require(\"../config/EndpointModeConfigOptions\");\nconst getInstanceMetadataEndpoint = async () => (0, url_parser_1.parseUrl)((await getFromEndpointConfig()) || (await getFromEndpointModeConfig()));\nexports.getInstanceMetadataEndpoint = getInstanceMetadataEndpoint;\nconst getFromEndpointConfig = async () => (0, node_config_provider_1.loadConfig)(EndpointConfigOptions_1.ENDPOINT_CONFIG_OPTIONS)();\nconst getFromEndpointModeConfig = async () => {\n const endpointMode = await (0, node_config_provider_1.loadConfig)(EndpointModeConfigOptions_1.ENDPOINT_MODE_CONFIG_OPTIONS)();\n switch (endpointMode) {\n case EndpointMode_1.EndpointMode.IPv4:\n return Endpoint_1.Endpoint.IPv4;\n case EndpointMode_1.EndpointMode.IPv6:\n return Endpoint_1.Endpoint.IPv6;\n default:\n throw new Error(`Unsupported endpoint mode: ${endpointMode}.` + ` Select from ${Object.values(EndpointMode_1.EndpointMode)}`);\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.staticStabilityProvider = void 0;\nconst getExtendedInstanceMetadataCredentials_1 = require(\"./getExtendedInstanceMetadataCredentials\");\nconst staticStabilityProvider = (provider, options = {}) => {\n const logger = (options === null || options === void 0 ? void 0 : options.logger) || console;\n let pastCredentials;\n return async () => {\n let credentials;\n try {\n credentials = await provider();\n if (credentials.expiration && credentials.expiration.getTime() < Date.now()) {\n credentials = (0, getExtendedInstanceMetadataCredentials_1.getExtendedInstanceMetadataCredentials)(credentials, logger);\n }\n }\n catch (e) {\n if (pastCredentials) {\n logger.warn(\"Credential renew failed: \", e);\n credentials = (0, getExtendedInstanceMetadataCredentials_1.getExtendedInstanceMetadataCredentials)(pastCredentials, logger);\n }\n else {\n throw e;\n }\n }\n pastCredentials = credentials;\n return credentials;\n };\n};\nexports.staticStabilityProvider = staticStabilityProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EventStreamCodec = void 0;\nconst crc32_1 = require(\"@aws-crypto/crc32\");\nconst HeaderMarshaller_1 = require(\"./HeaderMarshaller\");\nconst splitMessage_1 = require(\"./splitMessage\");\nclass EventStreamCodec {\n constructor(toUtf8, fromUtf8) {\n this.headerMarshaller = new HeaderMarshaller_1.HeaderMarshaller(toUtf8, fromUtf8);\n this.messageBuffer = [];\n this.isEndOfStream = false;\n }\n feed(message) {\n this.messageBuffer.push(this.decode(message));\n }\n endOfStream() {\n this.isEndOfStream = true;\n }\n getMessage() {\n const message = this.messageBuffer.pop();\n const isEndOfStream = this.isEndOfStream;\n return {\n getMessage() {\n return message;\n },\n isEndOfStream() {\n return isEndOfStream;\n },\n };\n }\n getAvailableMessages() {\n const messages = this.messageBuffer;\n this.messageBuffer = [];\n const isEndOfStream = this.isEndOfStream;\n return {\n getMessages() {\n return messages;\n },\n isEndOfStream() {\n return isEndOfStream;\n },\n };\n }\n encode({ headers: rawHeaders, body }) {\n const headers = this.headerMarshaller.format(rawHeaders);\n const length = headers.byteLength + body.byteLength + 16;\n const out = new Uint8Array(length);\n const view = new DataView(out.buffer, out.byteOffset, out.byteLength);\n const checksum = new crc32_1.Crc32();\n view.setUint32(0, length, false);\n view.setUint32(4, headers.byteLength, false);\n view.setUint32(8, checksum.update(out.subarray(0, 8)).digest(), false);\n out.set(headers, 12);\n out.set(body, headers.byteLength + 12);\n view.setUint32(length - 4, checksum.update(out.subarray(8, length - 4)).digest(), false);\n return out;\n }\n decode(message) {\n const { headers, body } = (0, splitMessage_1.splitMessage)(message);\n return { headers: this.headerMarshaller.parse(headers), body };\n }\n formatHeaders(rawHeaders) {\n return this.headerMarshaller.format(rawHeaders);\n }\n}\nexports.EventStreamCodec = EventStreamCodec;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HeaderMarshaller = void 0;\nconst util_hex_encoding_1 = require(\"@smithy/util-hex-encoding\");\nconst Int64_1 = require(\"./Int64\");\nclass HeaderMarshaller {\n constructor(toUtf8, fromUtf8) {\n this.toUtf8 = toUtf8;\n this.fromUtf8 = fromUtf8;\n }\n format(headers) {\n const chunks = [];\n for (const headerName of Object.keys(headers)) {\n const bytes = this.fromUtf8(headerName);\n chunks.push(Uint8Array.from([bytes.byteLength]), bytes, this.formatHeaderValue(headers[headerName]));\n }\n const out = new Uint8Array(chunks.reduce((carry, bytes) => carry + bytes.byteLength, 0));\n let position = 0;\n for (const chunk of chunks) {\n out.set(chunk, position);\n position += chunk.byteLength;\n }\n return out;\n }\n formatHeaderValue(header) {\n switch (header.type) {\n case \"boolean\":\n return Uint8Array.from([header.value ? 0 : 1]);\n case \"byte\":\n return Uint8Array.from([2, header.value]);\n case \"short\":\n const shortView = new DataView(new ArrayBuffer(3));\n shortView.setUint8(0, 3);\n shortView.setInt16(1, header.value, false);\n return new Uint8Array(shortView.buffer);\n case \"integer\":\n const intView = new DataView(new ArrayBuffer(5));\n intView.setUint8(0, 4);\n intView.setInt32(1, header.value, false);\n return new Uint8Array(intView.buffer);\n case \"long\":\n const longBytes = new Uint8Array(9);\n longBytes[0] = 5;\n longBytes.set(header.value.bytes, 1);\n return longBytes;\n case \"binary\":\n const binView = new DataView(new ArrayBuffer(3 + header.value.byteLength));\n binView.setUint8(0, 6);\n binView.setUint16(1, header.value.byteLength, false);\n const binBytes = new Uint8Array(binView.buffer);\n binBytes.set(header.value, 3);\n return binBytes;\n case \"string\":\n const utf8Bytes = this.fromUtf8(header.value);\n const strView = new DataView(new ArrayBuffer(3 + utf8Bytes.byteLength));\n strView.setUint8(0, 7);\n strView.setUint16(1, utf8Bytes.byteLength, false);\n const strBytes = new Uint8Array(strView.buffer);\n strBytes.set(utf8Bytes, 3);\n return strBytes;\n case \"timestamp\":\n const tsBytes = new Uint8Array(9);\n tsBytes[0] = 8;\n tsBytes.set(Int64_1.Int64.fromNumber(header.value.valueOf()).bytes, 1);\n return tsBytes;\n case \"uuid\":\n if (!UUID_PATTERN.test(header.value)) {\n throw new Error(`Invalid UUID received: ${header.value}`);\n }\n const uuidBytes = new Uint8Array(17);\n uuidBytes[0] = 9;\n uuidBytes.set((0, util_hex_encoding_1.fromHex)(header.value.replace(/\\-/g, \"\")), 1);\n return uuidBytes;\n }\n }\n parse(headers) {\n const out = {};\n let position = 0;\n while (position < headers.byteLength) {\n const nameLength = headers.getUint8(position++);\n const name = this.toUtf8(new Uint8Array(headers.buffer, headers.byteOffset + position, nameLength));\n position += nameLength;\n switch (headers.getUint8(position++)) {\n case 0:\n out[name] = {\n type: BOOLEAN_TAG,\n value: true,\n };\n break;\n case 1:\n out[name] = {\n type: BOOLEAN_TAG,\n value: false,\n };\n break;\n case 2:\n out[name] = {\n type: BYTE_TAG,\n value: headers.getInt8(position++),\n };\n break;\n case 3:\n out[name] = {\n type: SHORT_TAG,\n value: headers.getInt16(position, false),\n };\n position += 2;\n break;\n case 4:\n out[name] = {\n type: INT_TAG,\n value: headers.getInt32(position, false),\n };\n position += 4;\n break;\n case 5:\n out[name] = {\n type: LONG_TAG,\n value: new Int64_1.Int64(new Uint8Array(headers.buffer, headers.byteOffset + position, 8)),\n };\n position += 8;\n break;\n case 6:\n const binaryLength = headers.getUint16(position, false);\n position += 2;\n out[name] = {\n type: BINARY_TAG,\n value: new Uint8Array(headers.buffer, headers.byteOffset + position, binaryLength),\n };\n position += binaryLength;\n break;\n case 7:\n const stringLength = headers.getUint16(position, false);\n position += 2;\n out[name] = {\n type: STRING_TAG,\n value: this.toUtf8(new Uint8Array(headers.buffer, headers.byteOffset + position, stringLength)),\n };\n position += stringLength;\n break;\n case 8:\n out[name] = {\n type: TIMESTAMP_TAG,\n value: new Date(new Int64_1.Int64(new Uint8Array(headers.buffer, headers.byteOffset + position, 8)).valueOf()),\n };\n position += 8;\n break;\n case 9:\n const uuidBytes = new Uint8Array(headers.buffer, headers.byteOffset + position, 16);\n position += 16;\n out[name] = {\n type: UUID_TAG,\n value: `${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(0, 4))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(4, 6))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(6, 8))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(8, 10))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(10))}`,\n };\n break;\n default:\n throw new Error(`Unrecognized header type tag`);\n }\n }\n return out;\n }\n}\nexports.HeaderMarshaller = HeaderMarshaller;\nvar HEADER_VALUE_TYPE;\n(function (HEADER_VALUE_TYPE) {\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"boolTrue\"] = 0] = \"boolTrue\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"boolFalse\"] = 1] = \"boolFalse\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"byte\"] = 2] = \"byte\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"short\"] = 3] = \"short\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"integer\"] = 4] = \"integer\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"long\"] = 5] = \"long\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"byteArray\"] = 6] = \"byteArray\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"string\"] = 7] = \"string\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"timestamp\"] = 8] = \"timestamp\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"uuid\"] = 9] = \"uuid\";\n})(HEADER_VALUE_TYPE || (HEADER_VALUE_TYPE = {}));\nconst BOOLEAN_TAG = \"boolean\";\nconst BYTE_TAG = \"byte\";\nconst SHORT_TAG = \"short\";\nconst INT_TAG = \"integer\";\nconst LONG_TAG = \"long\";\nconst BINARY_TAG = \"binary\";\nconst STRING_TAG = \"string\";\nconst TIMESTAMP_TAG = \"timestamp\";\nconst UUID_TAG = \"uuid\";\nconst UUID_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Int64 = void 0;\nconst util_hex_encoding_1 = require(\"@smithy/util-hex-encoding\");\nclass Int64 {\n constructor(bytes) {\n this.bytes = bytes;\n if (bytes.byteLength !== 8) {\n throw new Error(\"Int64 buffers must be exactly 8 bytes\");\n }\n }\n static fromNumber(number) {\n if (number > 9223372036854776000 || number < -9223372036854776000) {\n throw new Error(`${number} is too large (or, if negative, too small) to represent as an Int64`);\n }\n const bytes = new Uint8Array(8);\n for (let i = 7, remaining = Math.abs(Math.round(number)); i > -1 && remaining > 0; i--, remaining /= 256) {\n bytes[i] = remaining;\n }\n if (number < 0) {\n negate(bytes);\n }\n return new Int64(bytes);\n }\n valueOf() {\n const bytes = this.bytes.slice(0);\n const negative = bytes[0] & 0b10000000;\n if (negative) {\n negate(bytes);\n }\n return parseInt((0, util_hex_encoding_1.toHex)(bytes), 16) * (negative ? -1 : 1);\n }\n toString() {\n return String(this.valueOf());\n }\n}\nexports.Int64 = Int64;\nfunction negate(bytes) {\n for (let i = 0; i < 8; i++) {\n bytes[i] ^= 0xff;\n }\n for (let i = 7; i > -1; i--) {\n bytes[i]++;\n if (bytes[i] !== 0)\n break;\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MessageDecoderStream = void 0;\nclass MessageDecoderStream {\n constructor(options) {\n this.options = options;\n }\n [Symbol.asyncIterator]() {\n return this.asyncIterator();\n }\n async *asyncIterator() {\n for await (const bytes of this.options.inputStream) {\n const decoded = this.options.decoder.decode(bytes);\n yield decoded;\n }\n }\n}\nexports.MessageDecoderStream = MessageDecoderStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MessageEncoderStream = void 0;\nclass MessageEncoderStream {\n constructor(options) {\n this.options = options;\n }\n [Symbol.asyncIterator]() {\n return this.asyncIterator();\n }\n async *asyncIterator() {\n for await (const msg of this.options.messageStream) {\n const encoded = this.options.encoder.encode(msg);\n yield encoded;\n }\n if (this.options.includeEndFrame) {\n yield new Uint8Array(0);\n }\n }\n}\nexports.MessageEncoderStream = MessageEncoderStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SmithyMessageDecoderStream = void 0;\nclass SmithyMessageDecoderStream {\n constructor(options) {\n this.options = options;\n }\n [Symbol.asyncIterator]() {\n return this.asyncIterator();\n }\n async *asyncIterator() {\n for await (const message of this.options.messageStream) {\n const deserialized = await this.options.deserializer(message);\n if (deserialized === undefined)\n continue;\n yield deserialized;\n }\n }\n}\nexports.SmithyMessageDecoderStream = SmithyMessageDecoderStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SmithyMessageEncoderStream = void 0;\nclass SmithyMessageEncoderStream {\n constructor(options) {\n this.options = options;\n }\n [Symbol.asyncIterator]() {\n return this.asyncIterator();\n }\n async *asyncIterator() {\n for await (const chunk of this.options.inputStream) {\n const payloadBuf = this.options.serializer(chunk);\n yield payloadBuf;\n }\n }\n}\nexports.SmithyMessageEncoderStream = SmithyMessageEncoderStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./EventStreamCodec\"), exports);\ntslib_1.__exportStar(require(\"./HeaderMarshaller\"), exports);\ntslib_1.__exportStar(require(\"./Int64\"), exports);\ntslib_1.__exportStar(require(\"./Message\"), exports);\ntslib_1.__exportStar(require(\"./MessageDecoderStream\"), exports);\ntslib_1.__exportStar(require(\"./MessageEncoderStream\"), exports);\ntslib_1.__exportStar(require(\"./SmithyMessageDecoderStream\"), exports);\ntslib_1.__exportStar(require(\"./SmithyMessageEncoderStream\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.splitMessage = void 0;\nconst crc32_1 = require(\"@aws-crypto/crc32\");\nconst PRELUDE_MEMBER_LENGTH = 4;\nconst PRELUDE_LENGTH = PRELUDE_MEMBER_LENGTH * 2;\nconst CHECKSUM_LENGTH = 4;\nconst MINIMUM_MESSAGE_LENGTH = PRELUDE_LENGTH + CHECKSUM_LENGTH * 2;\nfunction splitMessage({ byteLength, byteOffset, buffer }) {\n if (byteLength < MINIMUM_MESSAGE_LENGTH) {\n throw new Error(\"Provided message too short to accommodate event stream message overhead\");\n }\n const view = new DataView(buffer, byteOffset, byteLength);\n const messageLength = view.getUint32(0, false);\n if (byteLength !== messageLength) {\n throw new Error(\"Reported message length does not match received message length\");\n }\n const headerLength = view.getUint32(PRELUDE_MEMBER_LENGTH, false);\n const expectedPreludeChecksum = view.getUint32(PRELUDE_LENGTH, false);\n const expectedMessageChecksum = view.getUint32(byteLength - CHECKSUM_LENGTH, false);\n const checksummer = new crc32_1.Crc32().update(new Uint8Array(buffer, byteOffset, PRELUDE_LENGTH));\n if (expectedPreludeChecksum !== checksummer.digest()) {\n throw new Error(`The prelude checksum specified in the message (${expectedPreludeChecksum}) does not match the calculated CRC32 checksum (${checksummer.digest()})`);\n }\n checksummer.update(new Uint8Array(buffer, byteOffset + PRELUDE_LENGTH, byteLength - (PRELUDE_LENGTH + CHECKSUM_LENGTH)));\n if (expectedMessageChecksum !== checksummer.digest()) {\n throw new Error(`The message checksum (${checksummer.digest()}) did not match the expected value of ${expectedMessageChecksum}`);\n }\n return {\n headers: new DataView(buffer, byteOffset + PRELUDE_LENGTH + CHECKSUM_LENGTH, headerLength),\n body: new Uint8Array(buffer, byteOffset + PRELUDE_LENGTH + CHECKSUM_LENGTH + headerLength, messageLength - headerLength - (PRELUDE_LENGTH + CHECKSUM_LENGTH + CHECKSUM_LENGTH)),\n };\n}\nexports.splitMessage = splitMessage;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Hash = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst buffer_1 = require(\"buffer\");\nconst crypto_1 = require(\"crypto\");\nclass Hash {\n constructor(algorithmIdentifier, secret) {\n this.algorithmIdentifier = algorithmIdentifier;\n this.secret = secret;\n this.reset();\n }\n update(toHash, encoding) {\n this.hash.update((0, util_utf8_1.toUint8Array)(castSourceData(toHash, encoding)));\n }\n digest() {\n return Promise.resolve(this.hash.digest());\n }\n reset() {\n this.hash = this.secret\n ? (0, crypto_1.createHmac)(this.algorithmIdentifier, castSourceData(this.secret))\n : (0, crypto_1.createHash)(this.algorithmIdentifier);\n }\n}\nexports.Hash = Hash;\nfunction castSourceData(toCast, encoding) {\n if (buffer_1.Buffer.isBuffer(toCast)) {\n return toCast;\n }\n if (typeof toCast === \"string\") {\n return (0, util_buffer_from_1.fromString)(toCast, encoding);\n }\n if (ArrayBuffer.isView(toCast)) {\n return (0, util_buffer_from_1.fromArrayBuffer)(toCast.buffer, toCast.byteOffset, toCast.byteLength);\n }\n return (0, util_buffer_from_1.fromArrayBuffer)(toCast);\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isArrayBuffer = void 0;\nconst isArrayBuffer = (arg) => (typeof ArrayBuffer === \"function\" && arg instanceof ArrayBuffer) ||\n Object.prototype.toString.call(arg) === \"[object ArrayBuffer]\";\nexports.isArrayBuffer = isArrayBuffer;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getContentLengthPlugin = exports.contentLengthMiddlewareOptions = exports.contentLengthMiddleware = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst CONTENT_LENGTH_HEADER = \"content-length\";\nfunction contentLengthMiddleware(bodyLengthChecker) {\n return (next) => async (args) => {\n const request = args.request;\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n const { body, headers } = request;\n if (body &&\n Object.keys(headers)\n .map((str) => str.toLowerCase())\n .indexOf(CONTENT_LENGTH_HEADER) === -1) {\n try {\n const length = bodyLengthChecker(body);\n request.headers = {\n ...request.headers,\n [CONTENT_LENGTH_HEADER]: String(length),\n };\n }\n catch (error) {\n }\n }\n }\n return next({\n ...args,\n request,\n });\n };\n}\nexports.contentLengthMiddleware = contentLengthMiddleware;\nexports.contentLengthMiddlewareOptions = {\n step: \"build\",\n tags: [\"SET_CONTENT_LENGTH\", \"CONTENT_LENGTH\"],\n name: \"contentLengthMiddleware\",\n override: true,\n};\nconst getContentLengthPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.add(contentLengthMiddleware(options.bodyLengthChecker), exports.contentLengthMiddlewareOptions);\n },\n});\nexports.getContentLengthPlugin = getContentLengthPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createConfigValueProvider = void 0;\nconst createConfigValueProvider = (configKey, canonicalEndpointParamKey, config) => {\n const configProvider = async () => {\n var _a;\n const configValue = (_a = config[configKey]) !== null && _a !== void 0 ? _a : config[canonicalEndpointParamKey];\n if (typeof configValue === \"function\") {\n return configValue();\n }\n return configValue;\n };\n if (configKey === \"endpoint\" || canonicalEndpointParamKey === \"endpoint\") {\n return async () => {\n const endpoint = await configProvider();\n if (endpoint && typeof endpoint === \"object\") {\n if (\"url\" in endpoint) {\n return endpoint.url.href;\n }\n if (\"hostname\" in endpoint) {\n const { protocol, hostname, port, path } = endpoint;\n return `${protocol}//${hostname}${port ? \":\" + port : \"\"}${path}`;\n }\n }\n return endpoint;\n };\n }\n return configProvider;\n};\nexports.createConfigValueProvider = createConfigValueProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointFromConfig = void 0;\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst getEndpointUrlConfig_1 = require(\"./getEndpointUrlConfig\");\nconst getEndpointFromConfig = async (serviceId) => (0, node_config_provider_1.loadConfig)((0, getEndpointUrlConfig_1.getEndpointUrlConfig)(serviceId))();\nexports.getEndpointFromConfig = getEndpointFromConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveParams = exports.getEndpointFromInstructions = void 0;\nconst service_customizations_1 = require(\"../service-customizations\");\nconst createConfigValueProvider_1 = require(\"./createConfigValueProvider\");\nconst getEndpointFromConfig_1 = require(\"./getEndpointFromConfig\");\nconst toEndpointV1_1 = require(\"./toEndpointV1\");\nconst getEndpointFromInstructions = async (commandInput, instructionsSupplier, clientConfig, context) => {\n if (!clientConfig.endpoint) {\n const endpointFromConfig = await (0, getEndpointFromConfig_1.getEndpointFromConfig)(clientConfig.serviceId || \"\");\n if (endpointFromConfig) {\n clientConfig.endpoint = () => Promise.resolve((0, toEndpointV1_1.toEndpointV1)(endpointFromConfig));\n }\n }\n const endpointParams = await (0, exports.resolveParams)(commandInput, instructionsSupplier, clientConfig);\n if (typeof clientConfig.endpointProvider !== \"function\") {\n throw new Error(\"config.endpointProvider is not set.\");\n }\n const endpoint = clientConfig.endpointProvider(endpointParams, context);\n return endpoint;\n};\nexports.getEndpointFromInstructions = getEndpointFromInstructions;\nconst resolveParams = async (commandInput, instructionsSupplier, clientConfig) => {\n var _a;\n const endpointParams = {};\n const instructions = ((_a = instructionsSupplier === null || instructionsSupplier === void 0 ? void 0 : instructionsSupplier.getEndpointParameterInstructions) === null || _a === void 0 ? void 0 : _a.call(instructionsSupplier)) || {};\n for (const [name, instruction] of Object.entries(instructions)) {\n switch (instruction.type) {\n case \"staticContextParams\":\n endpointParams[name] = instruction.value;\n break;\n case \"contextParams\":\n endpointParams[name] = commandInput[instruction.name];\n break;\n case \"clientContextParams\":\n case \"builtInParams\":\n endpointParams[name] = await (0, createConfigValueProvider_1.createConfigValueProvider)(instruction.name, name, clientConfig)();\n break;\n default:\n throw new Error(\"Unrecognized endpoint parameter instruction: \" + JSON.stringify(instruction));\n }\n }\n if (Object.keys(instructions).length === 0) {\n Object.assign(endpointParams, clientConfig);\n }\n if (String(clientConfig.serviceId).toLowerCase() === \"s3\") {\n await (0, service_customizations_1.resolveParamsForS3)(endpointParams);\n }\n return endpointParams;\n};\nexports.resolveParams = resolveParams;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointUrlConfig = void 0;\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst ENV_ENDPOINT_URL = \"AWS_ENDPOINT_URL\";\nconst CONFIG_ENDPOINT_URL = \"endpoint_url\";\nconst getEndpointUrlConfig = (serviceId) => ({\n environmentVariableSelector: (env) => {\n const serviceSuffixParts = serviceId.split(\" \").map((w) => w.toUpperCase());\n const serviceEndpointUrl = env[[ENV_ENDPOINT_URL, ...serviceSuffixParts].join(\"_\")];\n if (serviceEndpointUrl)\n return serviceEndpointUrl;\n const endpointUrl = env[ENV_ENDPOINT_URL];\n if (endpointUrl)\n return endpointUrl;\n return undefined;\n },\n configFileSelector: (profile, config) => {\n if (config && profile.services) {\n const servicesSection = config[[\"services\", profile.services].join(shared_ini_file_loader_1.CONFIG_PREFIX_SEPARATOR)];\n if (servicesSection) {\n const servicePrefixParts = serviceId.split(\" \").map((w) => w.toLowerCase());\n const endpointUrl = servicesSection[[servicePrefixParts.join(\"_\"), CONFIG_ENDPOINT_URL].join(shared_ini_file_loader_1.CONFIG_PREFIX_SEPARATOR)];\n if (endpointUrl)\n return endpointUrl;\n }\n }\n const endpointUrl = profile[CONFIG_ENDPOINT_URL];\n if (endpointUrl)\n return endpointUrl;\n return undefined;\n },\n default: undefined,\n});\nexports.getEndpointUrlConfig = getEndpointUrlConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./getEndpointFromInstructions\"), exports);\ntslib_1.__exportStar(require(\"./toEndpointV1\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toEndpointV1 = void 0;\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst toEndpointV1 = (endpoint) => {\n if (typeof endpoint === \"object\") {\n if (\"url\" in endpoint) {\n return (0, url_parser_1.parseUrl)(endpoint.url);\n }\n return endpoint;\n }\n return (0, url_parser_1.parseUrl)(endpoint);\n};\nexports.toEndpointV1 = toEndpointV1;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.endpointMiddleware = void 0;\nconst getEndpointFromInstructions_1 = require(\"./adaptors/getEndpointFromInstructions\");\nconst endpointMiddleware = ({ config, instructions, }) => {\n return (next, context) => async (args) => {\n var _a, _b;\n const endpoint = await (0, getEndpointFromInstructions_1.getEndpointFromInstructions)(args.input, {\n getEndpointParameterInstructions() {\n return instructions;\n },\n }, { ...config }, context);\n context.endpointV2 = endpoint;\n context.authSchemes = (_a = endpoint.properties) === null || _a === void 0 ? void 0 : _a.authSchemes;\n const authScheme = (_b = context.authSchemes) === null || _b === void 0 ? void 0 : _b[0];\n if (authScheme) {\n context[\"signing_region\"] = authScheme.signingRegion;\n context[\"signing_service\"] = authScheme.signingName;\n }\n return next({\n ...args,\n });\n };\n};\nexports.endpointMiddleware = endpointMiddleware;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointPlugin = exports.endpointMiddlewareOptions = void 0;\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst endpointMiddleware_1 = require(\"./endpointMiddleware\");\nexports.endpointMiddlewareOptions = {\n step: \"serialize\",\n tags: [\"ENDPOINT_PARAMETERS\", \"ENDPOINT_V2\", \"ENDPOINT\"],\n name: \"endpointV2Middleware\",\n override: true,\n relation: \"before\",\n toMiddleware: middleware_serde_1.serializerMiddlewareOption.name,\n};\nconst getEndpointPlugin = (config, instructions) => ({\n applyToStack: (clientStack) => {\n clientStack.addRelativeTo((0, endpointMiddleware_1.endpointMiddleware)({\n config,\n instructions,\n }), exports.endpointMiddlewareOptions);\n },\n});\nexports.getEndpointPlugin = getEndpointPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./adaptors\"), exports);\ntslib_1.__exportStar(require(\"./endpointMiddleware\"), exports);\ntslib_1.__exportStar(require(\"./getEndpointPlugin\"), exports);\ntslib_1.__exportStar(require(\"./resolveEndpointConfig\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveEndpointConfig = void 0;\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst toEndpointV1_1 = require(\"./adaptors/toEndpointV1\");\nconst resolveEndpointConfig = (input) => {\n var _a, _b, _c;\n const tls = (_a = input.tls) !== null && _a !== void 0 ? _a : true;\n const { endpoint } = input;\n const customEndpointProvider = endpoint != null ? async () => (0, toEndpointV1_1.toEndpointV1)(await (0, util_middleware_1.normalizeProvider)(endpoint)()) : undefined;\n const isCustomEndpoint = !!endpoint;\n return {\n ...input,\n endpoint: customEndpointProvider,\n tls,\n isCustomEndpoint,\n useDualstackEndpoint: (0, util_middleware_1.normalizeProvider)((_b = input.useDualstackEndpoint) !== null && _b !== void 0 ? _b : false),\n useFipsEndpoint: (0, util_middleware_1.normalizeProvider)((_c = input.useFipsEndpoint) !== null && _c !== void 0 ? _c : false),\n };\n};\nexports.resolveEndpointConfig = resolveEndpointConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./s3\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isArnBucketName = exports.isDnsCompatibleBucketName = exports.S3_HOSTNAME_PATTERN = exports.DOT_PATTERN = exports.resolveParamsForS3 = void 0;\nconst resolveParamsForS3 = async (endpointParams) => {\n const bucket = (endpointParams === null || endpointParams === void 0 ? void 0 : endpointParams.Bucket) || \"\";\n if (typeof endpointParams.Bucket === \"string\") {\n endpointParams.Bucket = bucket.replace(/#/g, encodeURIComponent(\"#\")).replace(/\\?/g, encodeURIComponent(\"?\"));\n }\n if ((0, exports.isArnBucketName)(bucket)) {\n if (endpointParams.ForcePathStyle === true) {\n throw new Error(\"Path-style addressing cannot be used with ARN buckets\");\n }\n }\n else if (!(0, exports.isDnsCompatibleBucketName)(bucket) ||\n (bucket.indexOf(\".\") !== -1 && !String(endpointParams.Endpoint).startsWith(\"http:\")) ||\n bucket.toLowerCase() !== bucket ||\n bucket.length < 3) {\n endpointParams.ForcePathStyle = true;\n }\n if (endpointParams.DisableMultiRegionAccessPoints) {\n endpointParams.disableMultiRegionAccessPoints = true;\n endpointParams.DisableMRAP = true;\n }\n return endpointParams;\n};\nexports.resolveParamsForS3 = resolveParamsForS3;\nconst DOMAIN_PATTERN = /^[a-z0-9][a-z0-9\\.\\-]{1,61}[a-z0-9]$/;\nconst IP_ADDRESS_PATTERN = /(\\d+\\.){3}\\d+/;\nconst DOTS_PATTERN = /\\.\\./;\nexports.DOT_PATTERN = /\\./;\nexports.S3_HOSTNAME_PATTERN = /^(.+\\.)?s3(-fips)?(\\.dualstack)?[.-]([a-z0-9-]+)\\./;\nconst isDnsCompatibleBucketName = (bucketName) => DOMAIN_PATTERN.test(bucketName) && !IP_ADDRESS_PATTERN.test(bucketName) && !DOTS_PATTERN.test(bucketName);\nexports.isDnsCompatibleBucketName = isDnsCompatibleBucketName;\nconst isArnBucketName = (bucketName) => {\n const [arn, partition, service, region, account, typeOrId] = bucketName.split(\":\");\n const isArn = arn === \"arn\" && bucketName.split(\":\").length >= 6;\n const isValidArn = [arn, partition, service, account, typeOrId].filter(Boolean).length === 5;\n if (isArn && !isValidArn) {\n throw new Error(`Invalid ARN: ${bucketName} was an invalid ARN.`);\n }\n return arn === \"arn\" && !!partition && !!service && !!account && !!typeOrId;\n};\nexports.isArnBucketName = isArnBucketName;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AdaptiveRetryStrategy = void 0;\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst StandardRetryStrategy_1 = require(\"./StandardRetryStrategy\");\nclass AdaptiveRetryStrategy extends StandardRetryStrategy_1.StandardRetryStrategy {\n constructor(maxAttemptsProvider, options) {\n const { rateLimiter, ...superOptions } = options !== null && options !== void 0 ? options : {};\n super(maxAttemptsProvider, superOptions);\n this.rateLimiter = rateLimiter !== null && rateLimiter !== void 0 ? rateLimiter : new util_retry_1.DefaultRateLimiter();\n this.mode = util_retry_1.RETRY_MODES.ADAPTIVE;\n }\n async retry(next, args) {\n return super.retry(next, args, {\n beforeRequest: async () => {\n return this.rateLimiter.getSendToken();\n },\n afterRequest: (response) => {\n this.rateLimiter.updateClientSendingRate(response);\n },\n });\n }\n}\nexports.AdaptiveRetryStrategy = AdaptiveRetryStrategy;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StandardRetryStrategy = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst service_error_classification_1 = require(\"@smithy/service-error-classification\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst uuid_1 = require(\"uuid\");\nconst defaultRetryQuota_1 = require(\"./defaultRetryQuota\");\nconst delayDecider_1 = require(\"./delayDecider\");\nconst retryDecider_1 = require(\"./retryDecider\");\nconst util_1 = require(\"./util\");\nclass StandardRetryStrategy {\n constructor(maxAttemptsProvider, options) {\n var _a, _b, _c;\n this.maxAttemptsProvider = maxAttemptsProvider;\n this.mode = util_retry_1.RETRY_MODES.STANDARD;\n this.retryDecider = (_a = options === null || options === void 0 ? void 0 : options.retryDecider) !== null && _a !== void 0 ? _a : retryDecider_1.defaultRetryDecider;\n this.delayDecider = (_b = options === null || options === void 0 ? void 0 : options.delayDecider) !== null && _b !== void 0 ? _b : delayDecider_1.defaultDelayDecider;\n this.retryQuota = (_c = options === null || options === void 0 ? void 0 : options.retryQuota) !== null && _c !== void 0 ? _c : (0, defaultRetryQuota_1.getDefaultRetryQuota)(util_retry_1.INITIAL_RETRY_TOKENS);\n }\n shouldRetry(error, attempts, maxAttempts) {\n return attempts < maxAttempts && this.retryDecider(error) && this.retryQuota.hasRetryTokens(error);\n }\n async getMaxAttempts() {\n let maxAttempts;\n try {\n maxAttempts = await this.maxAttemptsProvider();\n }\n catch (error) {\n maxAttempts = util_retry_1.DEFAULT_MAX_ATTEMPTS;\n }\n return maxAttempts;\n }\n async retry(next, args, options) {\n let retryTokenAmount;\n let attempts = 0;\n let totalDelay = 0;\n const maxAttempts = await this.getMaxAttempts();\n const { request } = args;\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n request.headers[util_retry_1.INVOCATION_ID_HEADER] = (0, uuid_1.v4)();\n }\n while (true) {\n try {\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n request.headers[util_retry_1.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`;\n }\n if (options === null || options === void 0 ? void 0 : options.beforeRequest) {\n await options.beforeRequest();\n }\n const { response, output } = await next(args);\n if (options === null || options === void 0 ? void 0 : options.afterRequest) {\n options.afterRequest(response);\n }\n this.retryQuota.releaseRetryTokens(retryTokenAmount);\n output.$metadata.attempts = attempts + 1;\n output.$metadata.totalRetryDelay = totalDelay;\n return { response, output };\n }\n catch (e) {\n const err = (0, util_1.asSdkError)(e);\n attempts++;\n if (this.shouldRetry(err, attempts, maxAttempts)) {\n retryTokenAmount = this.retryQuota.retrieveRetryTokens(err);\n const delayFromDecider = this.delayDecider((0, service_error_classification_1.isThrottlingError)(err) ? util_retry_1.THROTTLING_RETRY_DELAY_BASE : util_retry_1.DEFAULT_RETRY_DELAY_BASE, attempts);\n const delayFromResponse = getDelayFromRetryAfterHeader(err.$response);\n const delay = Math.max(delayFromResponse || 0, delayFromDecider);\n totalDelay += delay;\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n if (!err.$metadata) {\n err.$metadata = {};\n }\n err.$metadata.attempts = attempts;\n err.$metadata.totalRetryDelay = totalDelay;\n throw err;\n }\n }\n }\n}\nexports.StandardRetryStrategy = StandardRetryStrategy;\nconst getDelayFromRetryAfterHeader = (response) => {\n if (!protocol_http_1.HttpResponse.isInstance(response))\n return;\n const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === \"retry-after\");\n if (!retryAfterHeaderName)\n return;\n const retryAfter = response.headers[retryAfterHeaderName];\n const retryAfterSeconds = Number(retryAfter);\n if (!Number.isNaN(retryAfterSeconds))\n return retryAfterSeconds * 1000;\n const retryAfterDate = new Date(retryAfter);\n return retryAfterDate.getTime() - Date.now();\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_RETRY_MODE_CONFIG_OPTIONS = exports.CONFIG_RETRY_MODE = exports.ENV_RETRY_MODE = exports.resolveRetryConfig = exports.NODE_MAX_ATTEMPT_CONFIG_OPTIONS = exports.CONFIG_MAX_ATTEMPTS = exports.ENV_MAX_ATTEMPTS = void 0;\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nexports.ENV_MAX_ATTEMPTS = \"AWS_MAX_ATTEMPTS\";\nexports.CONFIG_MAX_ATTEMPTS = \"max_attempts\";\nexports.NODE_MAX_ATTEMPT_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => {\n const value = env[exports.ENV_MAX_ATTEMPTS];\n if (!value)\n return undefined;\n const maxAttempt = parseInt(value);\n if (Number.isNaN(maxAttempt)) {\n throw new Error(`Environment variable ${exports.ENV_MAX_ATTEMPTS} mast be a number, got \"${value}\"`);\n }\n return maxAttempt;\n },\n configFileSelector: (profile) => {\n const value = profile[exports.CONFIG_MAX_ATTEMPTS];\n if (!value)\n return undefined;\n const maxAttempt = parseInt(value);\n if (Number.isNaN(maxAttempt)) {\n throw new Error(`Shared config file entry ${exports.CONFIG_MAX_ATTEMPTS} mast be a number, got \"${value}\"`);\n }\n return maxAttempt;\n },\n default: util_retry_1.DEFAULT_MAX_ATTEMPTS,\n};\nconst resolveRetryConfig = (input) => {\n var _a;\n const { retryStrategy } = input;\n const maxAttempts = (0, util_middleware_1.normalizeProvider)((_a = input.maxAttempts) !== null && _a !== void 0 ? _a : util_retry_1.DEFAULT_MAX_ATTEMPTS);\n return {\n ...input,\n maxAttempts,\n retryStrategy: async () => {\n if (retryStrategy) {\n return retryStrategy;\n }\n const retryMode = await (0, util_middleware_1.normalizeProvider)(input.retryMode)();\n if (retryMode === util_retry_1.RETRY_MODES.ADAPTIVE) {\n return new util_retry_1.AdaptiveRetryStrategy(maxAttempts);\n }\n return new util_retry_1.StandardRetryStrategy(maxAttempts);\n },\n };\n};\nexports.resolveRetryConfig = resolveRetryConfig;\nexports.ENV_RETRY_MODE = \"AWS_RETRY_MODE\";\nexports.CONFIG_RETRY_MODE = \"retry_mode\";\nexports.NODE_RETRY_MODE_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => env[exports.ENV_RETRY_MODE],\n configFileSelector: (profile) => profile[exports.CONFIG_RETRY_MODE],\n default: util_retry_1.DEFAULT_RETRY_MODE,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getDefaultRetryQuota = void 0;\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst getDefaultRetryQuota = (initialRetryTokens, options) => {\n var _a, _b, _c;\n const MAX_CAPACITY = initialRetryTokens;\n const noRetryIncrement = (_a = options === null || options === void 0 ? void 0 : options.noRetryIncrement) !== null && _a !== void 0 ? _a : util_retry_1.NO_RETRY_INCREMENT;\n const retryCost = (_b = options === null || options === void 0 ? void 0 : options.retryCost) !== null && _b !== void 0 ? _b : util_retry_1.RETRY_COST;\n const timeoutRetryCost = (_c = options === null || options === void 0 ? void 0 : options.timeoutRetryCost) !== null && _c !== void 0 ? _c : util_retry_1.TIMEOUT_RETRY_COST;\n let availableCapacity = initialRetryTokens;\n const getCapacityAmount = (error) => (error.name === \"TimeoutError\" ? timeoutRetryCost : retryCost);\n const hasRetryTokens = (error) => getCapacityAmount(error) <= availableCapacity;\n const retrieveRetryTokens = (error) => {\n if (!hasRetryTokens(error)) {\n throw new Error(\"No retry token available\");\n }\n const capacityAmount = getCapacityAmount(error);\n availableCapacity -= capacityAmount;\n return capacityAmount;\n };\n const releaseRetryTokens = (capacityReleaseAmount) => {\n availableCapacity += capacityReleaseAmount !== null && capacityReleaseAmount !== void 0 ? capacityReleaseAmount : noRetryIncrement;\n availableCapacity = Math.min(availableCapacity, MAX_CAPACITY);\n };\n return Object.freeze({\n hasRetryTokens,\n retrieveRetryTokens,\n releaseRetryTokens,\n });\n};\nexports.getDefaultRetryQuota = getDefaultRetryQuota;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultDelayDecider = void 0;\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst defaultDelayDecider = (delayBase, attempts) => Math.floor(Math.min(util_retry_1.MAXIMUM_RETRY_DELAY, Math.random() * 2 ** attempts * delayBase));\nexports.defaultDelayDecider = defaultDelayDecider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./AdaptiveRetryStrategy\"), exports);\ntslib_1.__exportStar(require(\"./StandardRetryStrategy\"), exports);\ntslib_1.__exportStar(require(\"./configurations\"), exports);\ntslib_1.__exportStar(require(\"./delayDecider\"), exports);\ntslib_1.__exportStar(require(\"./omitRetryHeadersMiddleware\"), exports);\ntslib_1.__exportStar(require(\"./retryDecider\"), exports);\ntslib_1.__exportStar(require(\"./retryMiddleware\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getOmitRetryHeadersPlugin = exports.omitRetryHeadersMiddlewareOptions = exports.omitRetryHeadersMiddleware = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst omitRetryHeadersMiddleware = () => (next) => async (args) => {\n const { request } = args;\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n delete request.headers[util_retry_1.INVOCATION_ID_HEADER];\n delete request.headers[util_retry_1.REQUEST_HEADER];\n }\n return next(args);\n};\nexports.omitRetryHeadersMiddleware = omitRetryHeadersMiddleware;\nexports.omitRetryHeadersMiddlewareOptions = {\n name: \"omitRetryHeadersMiddleware\",\n tags: [\"RETRY\", \"HEADERS\", \"OMIT_RETRY_HEADERS\"],\n relation: \"before\",\n toMiddleware: \"awsAuthMiddleware\",\n override: true,\n};\nconst getOmitRetryHeadersPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.addRelativeTo((0, exports.omitRetryHeadersMiddleware)(), exports.omitRetryHeadersMiddlewareOptions);\n },\n});\nexports.getOmitRetryHeadersPlugin = getOmitRetryHeadersPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultRetryDecider = void 0;\nconst service_error_classification_1 = require(\"@smithy/service-error-classification\");\nconst defaultRetryDecider = (error) => {\n if (!error) {\n return false;\n }\n return (0, service_error_classification_1.isRetryableByTrait)(error) || (0, service_error_classification_1.isClockSkewError)(error) || (0, service_error_classification_1.isThrottlingError)(error) || (0, service_error_classification_1.isTransientError)(error);\n};\nexports.defaultRetryDecider = defaultRetryDecider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRetryAfterHint = exports.getRetryPlugin = exports.retryMiddlewareOptions = exports.retryMiddleware = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst service_error_classification_1 = require(\"@smithy/service-error-classification\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst uuid_1 = require(\"uuid\");\nconst util_1 = require(\"./util\");\nconst retryMiddleware = (options) => (next, context) => async (args) => {\n let retryStrategy = await options.retryStrategy();\n const maxAttempts = await options.maxAttempts();\n if (isRetryStrategyV2(retryStrategy)) {\n retryStrategy = retryStrategy;\n let retryToken = await retryStrategy.acquireInitialRetryToken(context[\"partition_id\"]);\n let lastError = new Error();\n let attempts = 0;\n let totalRetryDelay = 0;\n const { request } = args;\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n request.headers[util_retry_1.INVOCATION_ID_HEADER] = (0, uuid_1.v4)();\n }\n while (true) {\n try {\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n request.headers[util_retry_1.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`;\n }\n const { response, output } = await next(args);\n retryStrategy.recordSuccess(retryToken);\n output.$metadata.attempts = attempts + 1;\n output.$metadata.totalRetryDelay = totalRetryDelay;\n return { response, output };\n }\n catch (e) {\n const retryErrorInfo = getRetryErrorInfo(e);\n lastError = (0, util_1.asSdkError)(e);\n try {\n retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo);\n }\n catch (refreshError) {\n if (!lastError.$metadata) {\n lastError.$metadata = {};\n }\n lastError.$metadata.attempts = attempts + 1;\n lastError.$metadata.totalRetryDelay = totalRetryDelay;\n throw lastError;\n }\n attempts = retryToken.getRetryCount();\n const delay = retryToken.getRetryDelay();\n totalRetryDelay += delay;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n else {\n retryStrategy = retryStrategy;\n if (retryStrategy === null || retryStrategy === void 0 ? void 0 : retryStrategy.mode)\n context.userAgent = [...(context.userAgent || []), [\"cfg/retry-mode\", retryStrategy.mode]];\n return retryStrategy.retry(next, args);\n }\n};\nexports.retryMiddleware = retryMiddleware;\nconst isRetryStrategyV2 = (retryStrategy) => typeof retryStrategy.acquireInitialRetryToken !== \"undefined\" &&\n typeof retryStrategy.refreshRetryTokenForRetry !== \"undefined\" &&\n typeof retryStrategy.recordSuccess !== \"undefined\";\nconst getRetryErrorInfo = (error) => {\n const errorInfo = {\n errorType: getRetryErrorType(error),\n };\n const retryAfterHint = (0, exports.getRetryAfterHint)(error.$response);\n if (retryAfterHint) {\n errorInfo.retryAfterHint = retryAfterHint;\n }\n return errorInfo;\n};\nconst getRetryErrorType = (error) => {\n if ((0, service_error_classification_1.isThrottlingError)(error))\n return \"THROTTLING\";\n if ((0, service_error_classification_1.isTransientError)(error))\n return \"TRANSIENT\";\n if ((0, service_error_classification_1.isServerError)(error))\n return \"SERVER_ERROR\";\n return \"CLIENT_ERROR\";\n};\nexports.retryMiddlewareOptions = {\n name: \"retryMiddleware\",\n tags: [\"RETRY\"],\n step: \"finalizeRequest\",\n priority: \"high\",\n override: true,\n};\nconst getRetryPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.add((0, exports.retryMiddleware)(options), exports.retryMiddlewareOptions);\n },\n});\nexports.getRetryPlugin = getRetryPlugin;\nconst getRetryAfterHint = (response) => {\n if (!protocol_http_1.HttpResponse.isInstance(response))\n return;\n const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === \"retry-after\");\n if (!retryAfterHeaderName)\n return;\n const retryAfter = response.headers[retryAfterHeaderName];\n const retryAfterSeconds = Number(retryAfter);\n if (!Number.isNaN(retryAfterSeconds))\n return new Date(retryAfterSeconds * 1000);\n const retryAfterDate = new Date(retryAfter);\n return retryAfterDate;\n};\nexports.getRetryAfterHint = getRetryAfterHint;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.asSdkError = void 0;\nconst asSdkError = (error) => {\n if (error instanceof Error)\n return error;\n if (error instanceof Object)\n return Object.assign(new Error(), error);\n if (typeof error === \"string\")\n return new Error(error);\n return new Error(`AWS SDK error wrapper for ${error}`);\n};\nexports.asSdkError = asSdkError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.deserializerMiddleware = void 0;\nconst deserializerMiddleware = (options, deserializer) => (next, context) => async (args) => {\n const { response } = await next(args);\n try {\n const parsed = await deserializer(response, options);\n return {\n response,\n output: parsed,\n };\n }\n catch (error) {\n Object.defineProperty(error, \"$response\", {\n value: response,\n });\n if (!(\"$metadata\" in error)) {\n const hint = `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.`;\n error.message += \"\\n \" + hint;\n }\n throw error;\n }\n};\nexports.deserializerMiddleware = deserializerMiddleware;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./deserializerMiddleware\"), exports);\ntslib_1.__exportStar(require(\"./serdePlugin\"), exports);\ntslib_1.__exportStar(require(\"./serializerMiddleware\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSerdePlugin = exports.serializerMiddlewareOption = exports.deserializerMiddlewareOption = void 0;\nconst deserializerMiddleware_1 = require(\"./deserializerMiddleware\");\nconst serializerMiddleware_1 = require(\"./serializerMiddleware\");\nexports.deserializerMiddlewareOption = {\n name: \"deserializerMiddleware\",\n step: \"deserialize\",\n tags: [\"DESERIALIZER\"],\n override: true,\n};\nexports.serializerMiddlewareOption = {\n name: \"serializerMiddleware\",\n step: \"serialize\",\n tags: [\"SERIALIZER\"],\n override: true,\n};\nfunction getSerdePlugin(config, serializer, deserializer) {\n return {\n applyToStack: (commandStack) => {\n commandStack.add((0, deserializerMiddleware_1.deserializerMiddleware)(config, deserializer), exports.deserializerMiddlewareOption);\n commandStack.add((0, serializerMiddleware_1.serializerMiddleware)(config, serializer), exports.serializerMiddlewareOption);\n },\n };\n}\nexports.getSerdePlugin = getSerdePlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serializerMiddleware = void 0;\nconst serializerMiddleware = (options, serializer) => (next, context) => async (args) => {\n var _a;\n const endpoint = ((_a = context.endpointV2) === null || _a === void 0 ? void 0 : _a.url) && options.urlParser\n ? async () => options.urlParser(context.endpointV2.url)\n : options.endpoint;\n if (!endpoint) {\n throw new Error(\"No valid endpoint provider available.\");\n }\n const request = await serializer(args.input, { ...options, endpoint });\n return next({\n ...args,\n request,\n });\n};\nexports.serializerMiddleware = serializerMiddleware;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.constructStack = void 0;\nconst getAllAliases = (name, aliases) => {\n const _aliases = [];\n if (name) {\n _aliases.push(name);\n }\n if (aliases) {\n for (const alias of aliases) {\n _aliases.push(alias);\n }\n }\n return _aliases;\n};\nconst getMiddlewareNameWithAliases = (name, aliases) => {\n return `${name || \"anonymous\"}${aliases && aliases.length > 0 ? ` (a.k.a. ${aliases.join(\",\")})` : \"\"}`;\n};\nconst constructStack = () => {\n let absoluteEntries = [];\n let relativeEntries = [];\n let identifyOnResolve = false;\n const entriesNameSet = new Set();\n const sort = (entries) => entries.sort((a, b) => stepWeights[b.step] - stepWeights[a.step] ||\n priorityWeights[b.priority || \"normal\"] - priorityWeights[a.priority || \"normal\"]);\n const removeByName = (toRemove) => {\n let isRemoved = false;\n const filterCb = (entry) => {\n const aliases = getAllAliases(entry.name, entry.aliases);\n if (aliases.includes(toRemove)) {\n isRemoved = true;\n for (const alias of aliases) {\n entriesNameSet.delete(alias);\n }\n return false;\n }\n return true;\n };\n absoluteEntries = absoluteEntries.filter(filterCb);\n relativeEntries = relativeEntries.filter(filterCb);\n return isRemoved;\n };\n const removeByReference = (toRemove) => {\n let isRemoved = false;\n const filterCb = (entry) => {\n if (entry.middleware === toRemove) {\n isRemoved = true;\n for (const alias of getAllAliases(entry.name, entry.aliases)) {\n entriesNameSet.delete(alias);\n }\n return false;\n }\n return true;\n };\n absoluteEntries = absoluteEntries.filter(filterCb);\n relativeEntries = relativeEntries.filter(filterCb);\n return isRemoved;\n };\n const cloneTo = (toStack) => {\n var _a;\n absoluteEntries.forEach((entry) => {\n toStack.add(entry.middleware, { ...entry });\n });\n relativeEntries.forEach((entry) => {\n toStack.addRelativeTo(entry.middleware, { ...entry });\n });\n (_a = toStack.identifyOnResolve) === null || _a === void 0 ? void 0 : _a.call(toStack, stack.identifyOnResolve());\n return toStack;\n };\n const expandRelativeMiddlewareList = (from) => {\n const expandedMiddlewareList = [];\n from.before.forEach((entry) => {\n if (entry.before.length === 0 && entry.after.length === 0) {\n expandedMiddlewareList.push(entry);\n }\n else {\n expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry));\n }\n });\n expandedMiddlewareList.push(from);\n from.after.reverse().forEach((entry) => {\n if (entry.before.length === 0 && entry.after.length === 0) {\n expandedMiddlewareList.push(entry);\n }\n else {\n expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry));\n }\n });\n return expandedMiddlewareList;\n };\n const getMiddlewareList = (debug = false) => {\n const normalizedAbsoluteEntries = [];\n const normalizedRelativeEntries = [];\n const normalizedEntriesNameMap = {};\n absoluteEntries.forEach((entry) => {\n const normalizedEntry = {\n ...entry,\n before: [],\n after: [],\n };\n for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) {\n normalizedEntriesNameMap[alias] = normalizedEntry;\n }\n normalizedAbsoluteEntries.push(normalizedEntry);\n });\n relativeEntries.forEach((entry) => {\n const normalizedEntry = {\n ...entry,\n before: [],\n after: [],\n };\n for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) {\n normalizedEntriesNameMap[alias] = normalizedEntry;\n }\n normalizedRelativeEntries.push(normalizedEntry);\n });\n normalizedRelativeEntries.forEach((entry) => {\n if (entry.toMiddleware) {\n const toMiddleware = normalizedEntriesNameMap[entry.toMiddleware];\n if (toMiddleware === undefined) {\n if (debug) {\n return;\n }\n throw new Error(`${entry.toMiddleware} is not found when adding ` +\n `${getMiddlewareNameWithAliases(entry.name, entry.aliases)} ` +\n `middleware ${entry.relation} ${entry.toMiddleware}`);\n }\n if (entry.relation === \"after\") {\n toMiddleware.after.push(entry);\n }\n if (entry.relation === \"before\") {\n toMiddleware.before.push(entry);\n }\n }\n });\n const mainChain = sort(normalizedAbsoluteEntries)\n .map(expandRelativeMiddlewareList)\n .reduce((wholeList, expandedMiddlewareList) => {\n wholeList.push(...expandedMiddlewareList);\n return wholeList;\n }, []);\n return mainChain;\n };\n const stack = {\n add: (middleware, options = {}) => {\n const { name, override, aliases: _aliases } = options;\n const entry = {\n step: \"initialize\",\n priority: \"normal\",\n middleware,\n ...options,\n };\n const aliases = getAllAliases(name, _aliases);\n if (aliases.length > 0) {\n if (aliases.some((alias) => entriesNameSet.has(alias))) {\n if (!override)\n throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`);\n for (const alias of aliases) {\n const toOverrideIndex = absoluteEntries.findIndex((entry) => { var _a; return entry.name === alias || ((_a = entry.aliases) === null || _a === void 0 ? void 0 : _a.some((a) => a === alias)); });\n if (toOverrideIndex === -1) {\n continue;\n }\n const toOverride = absoluteEntries[toOverrideIndex];\n if (toOverride.step !== entry.step || entry.priority !== toOverride.priority) {\n throw new Error(`\"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}\" middleware with ` +\n `${toOverride.priority} priority in ${toOverride.step} step cannot ` +\n `be overridden by \"${getMiddlewareNameWithAliases(name, _aliases)}\" middleware with ` +\n `${entry.priority} priority in ${entry.step} step.`);\n }\n absoluteEntries.splice(toOverrideIndex, 1);\n }\n }\n for (const alias of aliases) {\n entriesNameSet.add(alias);\n }\n }\n absoluteEntries.push(entry);\n },\n addRelativeTo: (middleware, options) => {\n const { name, override, aliases: _aliases } = options;\n const entry = {\n middleware,\n ...options,\n };\n const aliases = getAllAliases(name, _aliases);\n if (aliases.length > 0) {\n if (aliases.some((alias) => entriesNameSet.has(alias))) {\n if (!override)\n throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`);\n for (const alias of aliases) {\n const toOverrideIndex = relativeEntries.findIndex((entry) => { var _a; return entry.name === alias || ((_a = entry.aliases) === null || _a === void 0 ? void 0 : _a.some((a) => a === alias)); });\n if (toOverrideIndex === -1) {\n continue;\n }\n const toOverride = relativeEntries[toOverrideIndex];\n if (toOverride.toMiddleware !== entry.toMiddleware || toOverride.relation !== entry.relation) {\n throw new Error(`\"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}\" middleware ` +\n `${toOverride.relation} \"${toOverride.toMiddleware}\" middleware cannot be overridden ` +\n `by \"${getMiddlewareNameWithAliases(name, _aliases)}\" middleware ${entry.relation} ` +\n `\"${entry.toMiddleware}\" middleware.`);\n }\n relativeEntries.splice(toOverrideIndex, 1);\n }\n }\n for (const alias of aliases) {\n entriesNameSet.add(alias);\n }\n }\n relativeEntries.push(entry);\n },\n clone: () => cloneTo((0, exports.constructStack)()),\n use: (plugin) => {\n plugin.applyToStack(stack);\n },\n remove: (toRemove) => {\n if (typeof toRemove === \"string\")\n return removeByName(toRemove);\n else\n return removeByReference(toRemove);\n },\n removeByTag: (toRemove) => {\n let isRemoved = false;\n const filterCb = (entry) => {\n const { tags, name, aliases: _aliases } = entry;\n if (tags && tags.includes(toRemove)) {\n const aliases = getAllAliases(name, _aliases);\n for (const alias of aliases) {\n entriesNameSet.delete(alias);\n }\n isRemoved = true;\n return false;\n }\n return true;\n };\n absoluteEntries = absoluteEntries.filter(filterCb);\n relativeEntries = relativeEntries.filter(filterCb);\n return isRemoved;\n },\n concat: (from) => {\n var _a, _b;\n const cloned = cloneTo((0, exports.constructStack)());\n cloned.use(from);\n cloned.identifyOnResolve(identifyOnResolve || cloned.identifyOnResolve() || ((_b = (_a = from.identifyOnResolve) === null || _a === void 0 ? void 0 : _a.call(from)) !== null && _b !== void 0 ? _b : false));\n return cloned;\n },\n applyToStack: cloneTo,\n identify: () => {\n return getMiddlewareList(true).map((mw) => {\n var _a;\n const step = (_a = mw.step) !== null && _a !== void 0 ? _a : mw.relation +\n \" \" +\n mw.toMiddleware;\n return getMiddlewareNameWithAliases(mw.name, mw.aliases) + \" - \" + step;\n });\n },\n identifyOnResolve(toggle) {\n if (typeof toggle === \"boolean\")\n identifyOnResolve = toggle;\n return identifyOnResolve;\n },\n resolve: (handler, context) => {\n for (const middleware of getMiddlewareList()\n .map((entry) => entry.middleware)\n .reverse()) {\n handler = middleware(handler, context);\n }\n if (identifyOnResolve) {\n console.log(stack.identify());\n }\n return handler;\n },\n };\n return stack;\n};\nexports.constructStack = constructStack;\nconst stepWeights = {\n initialize: 5,\n serialize: 4,\n build: 3,\n finalizeRequest: 2,\n deserialize: 1,\n};\nconst priorityWeights = {\n high: 3,\n normal: 2,\n low: 1,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./MiddlewareStack\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadConfig = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromEnv_1 = require(\"./fromEnv\");\nconst fromSharedConfigFiles_1 = require(\"./fromSharedConfigFiles\");\nconst fromStatic_1 = require(\"./fromStatic\");\nconst loadConfig = ({ environmentVariableSelector, configFileSelector, default: defaultValue }, configuration = {}) => (0, property_provider_1.memoize)((0, property_provider_1.chain)((0, fromEnv_1.fromEnv)(environmentVariableSelector), (0, fromSharedConfigFiles_1.fromSharedConfigFiles)(configFileSelector, configuration), (0, fromStatic_1.fromStatic)(defaultValue)));\nexports.loadConfig = loadConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromEnv = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromEnv = (envVarSelector) => async () => {\n try {\n const config = envVarSelector(process.env);\n if (config === undefined) {\n throw new Error();\n }\n return config;\n }\n catch (e) {\n throw new property_provider_1.CredentialsProviderError(e.message || `Cannot load config from environment variables with getter: ${envVarSelector}`);\n }\n};\nexports.fromEnv = fromEnv;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromSharedConfigFiles = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst fromSharedConfigFiles = (configSelector, { preferredFile = \"config\", ...init } = {}) => async () => {\n const profile = (0, shared_ini_file_loader_1.getProfileName)(init);\n const { configFile, credentialsFile } = await (0, shared_ini_file_loader_1.loadSharedConfigFiles)(init);\n const profileFromCredentials = credentialsFile[profile] || {};\n const profileFromConfig = configFile[profile] || {};\n const mergedProfile = preferredFile === \"config\"\n ? { ...profileFromCredentials, ...profileFromConfig }\n : { ...profileFromConfig, ...profileFromCredentials };\n try {\n const cfgFile = preferredFile === \"config\" ? configFile : credentialsFile;\n const configValue = configSelector(mergedProfile, cfgFile);\n if (configValue === undefined) {\n throw new Error();\n }\n return configValue;\n }\n catch (e) {\n throw new property_provider_1.CredentialsProviderError(e.message || `Cannot load config for profile ${profile} in SDK configuration files with getter: ${configSelector}`);\n }\n};\nexports.fromSharedConfigFiles = fromSharedConfigFiles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromStatic = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst isFunction = (func) => typeof func === \"function\";\nconst fromStatic = (defaultValue) => isFunction(defaultValue) ? async () => await defaultValue() : (0, property_provider_1.fromStatic)(defaultValue);\nexports.fromStatic = fromStatic;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./configLoader\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODEJS_TIMEOUT_ERROR_CODES = void 0;\nexports.NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"EPIPE\", \"ETIMEDOUT\"];\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getTransformedHeaders = void 0;\nconst getTransformedHeaders = (headers) => {\n const transformedHeaders = {};\n for (const name of Object.keys(headers)) {\n const headerValues = headers[name];\n transformedHeaders[name] = Array.isArray(headerValues) ? headerValues.join(\",\") : headerValues;\n }\n return transformedHeaders;\n};\nexports.getTransformedHeaders = getTransformedHeaders;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./node-http-handler\"), exports);\ntslib_1.__exportStar(require(\"./node-http2-handler\"), exports);\ntslib_1.__exportStar(require(\"./stream-collector\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NodeHttpHandler = exports.DEFAULT_REQUEST_TIMEOUT = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst querystring_builder_1 = require(\"@smithy/querystring-builder\");\nconst http_1 = require(\"http\");\nconst https_1 = require(\"https\");\nconst constants_1 = require(\"./constants\");\nconst get_transformed_headers_1 = require(\"./get-transformed-headers\");\nconst set_connection_timeout_1 = require(\"./set-connection-timeout\");\nconst set_socket_keep_alive_1 = require(\"./set-socket-keep-alive\");\nconst set_socket_timeout_1 = require(\"./set-socket-timeout\");\nconst write_request_body_1 = require(\"./write-request-body\");\nexports.DEFAULT_REQUEST_TIMEOUT = 0;\nclass NodeHttpHandler {\n constructor(options) {\n this.metadata = { handlerProtocol: \"http/1.1\" };\n this.configProvider = new Promise((resolve, reject) => {\n if (typeof options === \"function\") {\n options()\n .then((_options) => {\n resolve(this.resolveDefaultConfig(_options));\n })\n .catch(reject);\n }\n else {\n resolve(this.resolveDefaultConfig(options));\n }\n });\n }\n resolveDefaultConfig(options) {\n const { requestTimeout, connectionTimeout, socketTimeout, httpAgent, httpsAgent } = options || {};\n const keepAlive = true;\n const maxSockets = 50;\n return {\n connectionTimeout,\n requestTimeout: requestTimeout !== null && requestTimeout !== void 0 ? requestTimeout : socketTimeout,\n httpAgent: httpAgent || new http_1.Agent({ keepAlive, maxSockets }),\n httpsAgent: httpsAgent || new https_1.Agent({ keepAlive, maxSockets }),\n };\n }\n destroy() {\n var _a, _b, _c, _d;\n (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.httpAgent) === null || _b === void 0 ? void 0 : _b.destroy();\n (_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.httpsAgent) === null || _d === void 0 ? void 0 : _d.destroy();\n }\n async handle(request, { abortSignal } = {}) {\n if (!this.config) {\n this.config = await this.configProvider;\n }\n return new Promise((_resolve, _reject) => {\n var _a, _b;\n let writeRequestBodyPromise = undefined;\n const resolve = async (arg) => {\n await writeRequestBodyPromise;\n _resolve(arg);\n };\n const reject = async (arg) => {\n await writeRequestBodyPromise;\n _reject(arg);\n };\n if (!this.config) {\n throw new Error(\"Node HTTP request handler config is not resolved\");\n }\n if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n return;\n }\n const isSSL = request.protocol === \"https:\";\n const queryString = (0, querystring_builder_1.buildQueryString)(request.query || {});\n let auth = undefined;\n if (request.username != null || request.password != null) {\n const username = (_a = request.username) !== null && _a !== void 0 ? _a : \"\";\n const password = (_b = request.password) !== null && _b !== void 0 ? _b : \"\";\n auth = `${username}:${password}`;\n }\n let path = request.path;\n if (queryString) {\n path += `?${queryString}`;\n }\n if (request.fragment) {\n path += `#${request.fragment}`;\n }\n const nodeHttpsOptions = {\n headers: request.headers,\n host: request.hostname,\n method: request.method,\n path,\n port: request.port,\n agent: isSSL ? this.config.httpsAgent : this.config.httpAgent,\n auth,\n };\n const requestFunc = isSSL ? https_1.request : http_1.request;\n const req = requestFunc(nodeHttpsOptions, (res) => {\n const httpResponse = new protocol_http_1.HttpResponse({\n statusCode: res.statusCode || -1,\n reason: res.statusMessage,\n headers: (0, get_transformed_headers_1.getTransformedHeaders)(res.headers),\n body: res,\n });\n resolve({ response: httpResponse });\n });\n req.on(\"error\", (err) => {\n if (constants_1.NODEJS_TIMEOUT_ERROR_CODES.includes(err.code)) {\n reject(Object.assign(err, { name: \"TimeoutError\" }));\n }\n else {\n reject(err);\n }\n });\n (0, set_connection_timeout_1.setConnectionTimeout)(req, reject, this.config.connectionTimeout);\n (0, set_socket_timeout_1.setSocketTimeout)(req, reject, this.config.requestTimeout);\n if (abortSignal) {\n abortSignal.onabort = () => {\n req.abort();\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n };\n }\n const httpAgent = nodeHttpsOptions.agent;\n if (typeof httpAgent === \"object\" && \"keepAlive\" in httpAgent) {\n (0, set_socket_keep_alive_1.setSocketKeepAlive)(req, {\n keepAlive: httpAgent.keepAlive,\n keepAliveMsecs: httpAgent.keepAliveMsecs,\n });\n }\n writeRequestBodyPromise = (0, write_request_body_1.writeRequestBody)(req, request, this.config.requestTimeout).catch(_reject);\n });\n }\n updateHttpClientConfig(key, value) {\n this.config = undefined;\n this.configProvider = this.configProvider.then((config) => {\n return {\n ...config,\n [key]: value,\n };\n });\n }\n httpHandlerConfigs() {\n var _a;\n return (_a = this.config) !== null && _a !== void 0 ? _a : {};\n }\n}\nexports.NodeHttpHandler = NodeHttpHandler;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NodeHttp2ConnectionManager = void 0;\nconst tslib_1 = require(\"tslib\");\nconst http2_1 = tslib_1.__importDefault(require(\"http2\"));\nconst node_http2_connection_pool_1 = require(\"./node-http2-connection-pool\");\nclass NodeHttp2ConnectionManager {\n constructor(config) {\n this.sessionCache = new Map();\n this.config = config;\n if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) {\n throw new RangeError(\"maxConcurrency must be greater than zero.\");\n }\n }\n lease(requestContext, connectionConfiguration) {\n const url = this.getUrlString(requestContext);\n const existingPool = this.sessionCache.get(url);\n if (existingPool) {\n const existingSession = existingPool.poll();\n if (existingSession && !this.config.disableConcurrency) {\n return existingSession;\n }\n }\n const session = http2_1.default.connect(url);\n if (this.config.maxConcurrency) {\n session.settings({ maxConcurrentStreams: this.config.maxConcurrency }, (err) => {\n if (err) {\n throw new Error(\"Fail to set maxConcurrentStreams to \" +\n this.config.maxConcurrency +\n \"when creating new session for \" +\n requestContext.destination.toString());\n }\n });\n }\n session.unref();\n const destroySessionCb = () => {\n session.destroy();\n this.deleteSession(url, session);\n };\n session.on(\"goaway\", destroySessionCb);\n session.on(\"error\", destroySessionCb);\n session.on(\"frameError\", destroySessionCb);\n session.on(\"close\", () => this.deleteSession(url, session));\n if (connectionConfiguration.requestTimeout) {\n session.setTimeout(connectionConfiguration.requestTimeout, destroySessionCb);\n }\n const connectionPool = this.sessionCache.get(url) || new node_http2_connection_pool_1.NodeHttp2ConnectionPool();\n connectionPool.offerLast(session);\n this.sessionCache.set(url, connectionPool);\n return session;\n }\n deleteSession(authority, session) {\n const existingConnectionPool = this.sessionCache.get(authority);\n if (!existingConnectionPool) {\n return;\n }\n if (!existingConnectionPool.contains(session)) {\n return;\n }\n existingConnectionPool.remove(session);\n this.sessionCache.set(authority, existingConnectionPool);\n }\n release(requestContext, session) {\n var _a;\n const cacheKey = this.getUrlString(requestContext);\n (_a = this.sessionCache.get(cacheKey)) === null || _a === void 0 ? void 0 : _a.offerLast(session);\n }\n destroy() {\n for (const [key, connectionPool] of this.sessionCache) {\n for (const session of connectionPool) {\n if (!session.destroyed) {\n session.destroy();\n }\n connectionPool.remove(session);\n }\n this.sessionCache.delete(key);\n }\n }\n setMaxConcurrentStreams(maxConcurrentStreams) {\n if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) {\n throw new RangeError(\"maxConcurrentStreams must be greater than zero.\");\n }\n this.config.maxConcurrency = maxConcurrentStreams;\n }\n setDisableConcurrentStreams(disableConcurrentStreams) {\n this.config.disableConcurrency = disableConcurrentStreams;\n }\n getUrlString(request) {\n return request.destination.toString();\n }\n}\nexports.NodeHttp2ConnectionManager = NodeHttp2ConnectionManager;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NodeHttp2ConnectionPool = void 0;\nclass NodeHttp2ConnectionPool {\n constructor(sessions) {\n this.sessions = [];\n this.sessions = sessions !== null && sessions !== void 0 ? sessions : [];\n }\n poll() {\n if (this.sessions.length > 0) {\n return this.sessions.shift();\n }\n }\n offerLast(session) {\n this.sessions.push(session);\n }\n contains(session) {\n return this.sessions.includes(session);\n }\n remove(session) {\n this.sessions = this.sessions.filter((s) => s !== session);\n }\n [Symbol.iterator]() {\n return this.sessions[Symbol.iterator]();\n }\n destroy(connection) {\n for (const session of this.sessions) {\n if (session === connection) {\n if (!session.destroyed) {\n session.destroy();\n }\n }\n }\n }\n}\nexports.NodeHttp2ConnectionPool = NodeHttp2ConnectionPool;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NodeHttp2Handler = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst querystring_builder_1 = require(\"@smithy/querystring-builder\");\nconst http2_1 = require(\"http2\");\nconst get_transformed_headers_1 = require(\"./get-transformed-headers\");\nconst node_http2_connection_manager_1 = require(\"./node-http2-connection-manager\");\nconst write_request_body_1 = require(\"./write-request-body\");\nclass NodeHttp2Handler {\n constructor(options) {\n this.metadata = { handlerProtocol: \"h2\" };\n this.connectionManager = new node_http2_connection_manager_1.NodeHttp2ConnectionManager({});\n this.configProvider = new Promise((resolve, reject) => {\n if (typeof options === \"function\") {\n options()\n .then((opts) => {\n resolve(opts || {});\n })\n .catch(reject);\n }\n else {\n resolve(options || {});\n }\n });\n }\n destroy() {\n this.connectionManager.destroy();\n }\n async handle(request, { abortSignal } = {}) {\n if (!this.config) {\n this.config = await this.configProvider;\n this.connectionManager.setDisableConcurrentStreams(this.config.disableConcurrentStreams || false);\n if (this.config.maxConcurrentStreams) {\n this.connectionManager.setMaxConcurrentStreams(this.config.maxConcurrentStreams);\n }\n }\n const { requestTimeout, disableConcurrentStreams } = this.config;\n return new Promise((_resolve, _reject) => {\n var _a, _b, _c;\n let fulfilled = false;\n let writeRequestBodyPromise = undefined;\n const resolve = async (arg) => {\n await writeRequestBodyPromise;\n _resolve(arg);\n };\n const reject = async (arg) => {\n await writeRequestBodyPromise;\n _reject(arg);\n };\n if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {\n fulfilled = true;\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n return;\n }\n const { hostname, method, port, protocol, query } = request;\n let auth = \"\";\n if (request.username != null || request.password != null) {\n const username = (_a = request.username) !== null && _a !== void 0 ? _a : \"\";\n const password = (_b = request.password) !== null && _b !== void 0 ? _b : \"\";\n auth = `${username}:${password}@`;\n }\n const authority = `${protocol}//${auth}${hostname}${port ? `:${port}` : \"\"}`;\n const requestContext = { destination: new URL(authority) };\n const session = this.connectionManager.lease(requestContext, {\n requestTimeout: (_c = this.config) === null || _c === void 0 ? void 0 : _c.sessionTimeout,\n disableConcurrentStreams: disableConcurrentStreams || false,\n });\n const rejectWithDestroy = (err) => {\n if (disableConcurrentStreams) {\n this.destroySession(session);\n }\n fulfilled = true;\n reject(err);\n };\n const queryString = (0, querystring_builder_1.buildQueryString)(query || {});\n let path = request.path;\n if (queryString) {\n path += `?${queryString}`;\n }\n if (request.fragment) {\n path += `#${request.fragment}`;\n }\n const req = session.request({\n ...request.headers,\n [http2_1.constants.HTTP2_HEADER_PATH]: path,\n [http2_1.constants.HTTP2_HEADER_METHOD]: method,\n });\n session.ref();\n req.on(\"response\", (headers) => {\n const httpResponse = new protocol_http_1.HttpResponse({\n statusCode: headers[\":status\"] || -1,\n headers: (0, get_transformed_headers_1.getTransformedHeaders)(headers),\n body: req,\n });\n fulfilled = true;\n resolve({ response: httpResponse });\n if (disableConcurrentStreams) {\n session.close();\n this.connectionManager.deleteSession(authority, session);\n }\n });\n if (requestTimeout) {\n req.setTimeout(requestTimeout, () => {\n req.close();\n const timeoutError = new Error(`Stream timed out because of no activity for ${requestTimeout} ms`);\n timeoutError.name = \"TimeoutError\";\n rejectWithDestroy(timeoutError);\n });\n }\n if (abortSignal) {\n abortSignal.onabort = () => {\n req.close();\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n rejectWithDestroy(abortError);\n };\n }\n req.on(\"frameError\", (type, code, id) => {\n rejectWithDestroy(new Error(`Frame type id ${type} in stream id ${id} has failed with code ${code}.`));\n });\n req.on(\"error\", rejectWithDestroy);\n req.on(\"aborted\", () => {\n rejectWithDestroy(new Error(`HTTP/2 stream is abnormally aborted in mid-communication with result code ${req.rstCode}.`));\n });\n req.on(\"close\", () => {\n session.unref();\n if (disableConcurrentStreams) {\n session.destroy();\n }\n if (!fulfilled) {\n rejectWithDestroy(new Error(\"Unexpected error: http2 request did not get a response\"));\n }\n });\n writeRequestBodyPromise = (0, write_request_body_1.writeRequestBody)(req, request, requestTimeout);\n });\n }\n updateHttpClientConfig(key, value) {\n this.config = undefined;\n this.configProvider = this.configProvider.then((config) => {\n return {\n ...config,\n [key]: value,\n };\n });\n }\n httpHandlerConfigs() {\n var _a;\n return (_a = this.config) !== null && _a !== void 0 ? _a : {};\n }\n destroySession(session) {\n if (!session.destroyed) {\n session.destroy();\n }\n }\n}\nexports.NodeHttp2Handler = NodeHttp2Handler;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.setConnectionTimeout = void 0;\nconst setConnectionTimeout = (request, reject, timeoutInMs = 0) => {\n if (!timeoutInMs) {\n return;\n }\n const timeoutId = setTimeout(() => {\n request.destroy();\n reject(Object.assign(new Error(`Socket timed out without establishing a connection within ${timeoutInMs} ms`), {\n name: \"TimeoutError\",\n }));\n }, timeoutInMs);\n request.on(\"socket\", (socket) => {\n if (socket.connecting) {\n socket.on(\"connect\", () => {\n clearTimeout(timeoutId);\n });\n }\n else {\n clearTimeout(timeoutId);\n }\n });\n};\nexports.setConnectionTimeout = setConnectionTimeout;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.setSocketKeepAlive = void 0;\nconst setSocketKeepAlive = (request, { keepAlive, keepAliveMsecs }) => {\n if (keepAlive !== true) {\n return;\n }\n request.on(\"socket\", (socket) => {\n socket.setKeepAlive(keepAlive, keepAliveMsecs || 0);\n });\n};\nexports.setSocketKeepAlive = setSocketKeepAlive;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.setSocketTimeout = void 0;\nconst setSocketTimeout = (request, reject, timeoutInMs = 0) => {\n request.setTimeout(timeoutInMs, () => {\n request.destroy();\n reject(Object.assign(new Error(`Connection timed out after ${timeoutInMs} ms`), { name: \"TimeoutError\" }));\n });\n};\nexports.setSocketTimeout = setSocketTimeout;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Collector = void 0;\nconst stream_1 = require(\"stream\");\nclass Collector extends stream_1.Writable {\n constructor() {\n super(...arguments);\n this.bufferedBytes = [];\n }\n _write(chunk, encoding, callback) {\n this.bufferedBytes.push(chunk);\n callback();\n }\n}\nexports.Collector = Collector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.streamCollector = void 0;\nconst collector_1 = require(\"./collector\");\nconst streamCollector = (stream) => new Promise((resolve, reject) => {\n const collector = new collector_1.Collector();\n stream.pipe(collector);\n stream.on(\"error\", (err) => {\n collector.end();\n reject(err);\n });\n collector.on(\"error\", reject);\n collector.on(\"finish\", function () {\n const bytes = new Uint8Array(Buffer.concat(this.bufferedBytes));\n resolve(bytes);\n });\n});\nexports.streamCollector = streamCollector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.writeRequestBody = void 0;\nconst stream_1 = require(\"stream\");\nconst MIN_WAIT_TIME = 1000;\nasync function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) {\n var _a;\n const headers = (_a = request.headers) !== null && _a !== void 0 ? _a : {};\n const expect = headers[\"Expect\"] || headers[\"expect\"];\n let timeoutId = -1;\n let hasError = false;\n if (expect === \"100-continue\") {\n await Promise.race([\n new Promise((resolve) => {\n timeoutId = Number(setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs)));\n }),\n new Promise((resolve) => {\n httpRequest.on(\"continue\", () => {\n clearTimeout(timeoutId);\n resolve();\n });\n httpRequest.on(\"error\", () => {\n hasError = true;\n clearTimeout(timeoutId);\n resolve();\n });\n }),\n ]);\n }\n if (!hasError) {\n writeBody(httpRequest, request.body);\n }\n}\nexports.writeRequestBody = writeRequestBody;\nfunction writeBody(httpRequest, body) {\n if (body instanceof stream_1.Readable) {\n body.pipe(httpRequest);\n }\n else if (body) {\n httpRequest.end(Buffer.from(body));\n }\n else {\n httpRequest.end();\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CredentialsProviderError = void 0;\nconst ProviderError_1 = require(\"./ProviderError\");\nclass CredentialsProviderError extends ProviderError_1.ProviderError {\n constructor(message, tryNextLink = true) {\n super(message, tryNextLink);\n this.tryNextLink = tryNextLink;\n this.name = \"CredentialsProviderError\";\n Object.setPrototypeOf(this, CredentialsProviderError.prototype);\n }\n}\nexports.CredentialsProviderError = CredentialsProviderError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ProviderError = void 0;\nclass ProviderError extends Error {\n constructor(message, tryNextLink = true) {\n super(message);\n this.tryNextLink = tryNextLink;\n this.name = \"ProviderError\";\n Object.setPrototypeOf(this, ProviderError.prototype);\n }\n static from(error, tryNextLink = true) {\n return Object.assign(new this(error.message, tryNextLink), error);\n }\n}\nexports.ProviderError = ProviderError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TokenProviderError = void 0;\nconst ProviderError_1 = require(\"./ProviderError\");\nclass TokenProviderError extends ProviderError_1.ProviderError {\n constructor(message, tryNextLink = true) {\n super(message, tryNextLink);\n this.tryNextLink = tryNextLink;\n this.name = \"TokenProviderError\";\n Object.setPrototypeOf(this, TokenProviderError.prototype);\n }\n}\nexports.TokenProviderError = TokenProviderError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.chain = void 0;\nconst ProviderError_1 = require(\"./ProviderError\");\nconst chain = (...providers) => async () => {\n if (providers.length === 0) {\n throw new ProviderError_1.ProviderError(\"No providers in chain\");\n }\n let lastProviderError;\n for (const provider of providers) {\n try {\n const credentials = await provider();\n return credentials;\n }\n catch (err) {\n lastProviderError = err;\n if (err === null || err === void 0 ? void 0 : err.tryNextLink) {\n continue;\n }\n throw err;\n }\n }\n throw lastProviderError;\n};\nexports.chain = chain;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromStatic = void 0;\nconst fromStatic = (staticValue) => () => Promise.resolve(staticValue);\nexports.fromStatic = fromStatic;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./CredentialsProviderError\"), exports);\ntslib_1.__exportStar(require(\"./ProviderError\"), exports);\ntslib_1.__exportStar(require(\"./TokenProviderError\"), exports);\ntslib_1.__exportStar(require(\"./chain\"), exports);\ntslib_1.__exportStar(require(\"./fromStatic\"), exports);\ntslib_1.__exportStar(require(\"./memoize\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.memoize = void 0;\nconst memoize = (provider, isExpired, requiresRefresh) => {\n let resolved;\n let pending;\n let hasResult;\n let isConstant = false;\n const coalesceProvider = async () => {\n if (!pending) {\n pending = provider();\n }\n try {\n resolved = await pending;\n hasResult = true;\n isConstant = false;\n }\n finally {\n pending = undefined;\n }\n return resolved;\n };\n if (isExpired === undefined) {\n return async (options) => {\n if (!hasResult || (options === null || options === void 0 ? void 0 : options.forceRefresh)) {\n resolved = await coalesceProvider();\n }\n return resolved;\n };\n }\n return async (options) => {\n if (!hasResult || (options === null || options === void 0 ? void 0 : options.forceRefresh)) {\n resolved = await coalesceProvider();\n }\n if (isConstant) {\n return resolved;\n }\n if (requiresRefresh && !requiresRefresh(resolved)) {\n isConstant = true;\n return resolved;\n }\n if (isExpired(resolved)) {\n await coalesceProvider();\n return resolved;\n }\n return resolved;\n };\n};\nexports.memoize = memoize;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Field = void 0;\nconst types_1 = require(\"@smithy/types\");\nclass Field {\n constructor({ name, kind = types_1.FieldPosition.HEADER, values = [] }) {\n this.name = name;\n this.kind = kind;\n this.values = values;\n }\n add(value) {\n this.values.push(value);\n }\n set(values) {\n this.values = values;\n }\n remove(value) {\n this.values = this.values.filter((v) => v !== value);\n }\n toString() {\n return this.values.map((v) => (v.includes(\",\") || v.includes(\" \") ? `\"${v}\"` : v)).join(\", \");\n }\n get() {\n return this.values;\n }\n}\nexports.Field = Field;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Fields = void 0;\nclass Fields {\n constructor({ fields = [], encoding = \"utf-8\" }) {\n this.entries = {};\n fields.forEach(this.setField.bind(this));\n this.encoding = encoding;\n }\n setField(field) {\n this.entries[field.name.toLowerCase()] = field;\n }\n getField(name) {\n return this.entries[name.toLowerCase()];\n }\n removeField(name) {\n delete this.entries[name.toLowerCase()];\n }\n getByType(kind) {\n return Object.values(this.entries).filter((field) => field.kind === kind);\n }\n}\nexports.Fields = Fields;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveHttpHandlerRuntimeConfig = exports.getHttpHandlerExtensionConfiguration = void 0;\nconst getHttpHandlerExtensionConfiguration = (runtimeConfig) => {\n let httpHandler = runtimeConfig.httpHandler;\n return {\n setHttpHandler(handler) {\n httpHandler = handler;\n },\n httpHandler() {\n return httpHandler;\n },\n updateHttpClientConfig(key, value) {\n httpHandler.updateHttpClientConfig(key, value);\n },\n httpHandlerConfigs() {\n return httpHandler.httpHandlerConfigs();\n },\n };\n};\nexports.getHttpHandlerExtensionConfiguration = getHttpHandlerExtensionConfiguration;\nconst resolveHttpHandlerRuntimeConfig = (httpHandlerExtensionConfiguration) => {\n return {\n httpHandler: httpHandlerExtensionConfiguration.httpHandler(),\n };\n};\nexports.resolveHttpHandlerRuntimeConfig = resolveHttpHandlerRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./httpExtensionConfiguration\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpRequest = void 0;\nclass HttpRequest {\n constructor(options) {\n this.method = options.method || \"GET\";\n this.hostname = options.hostname || \"localhost\";\n this.port = options.port;\n this.query = options.query || {};\n this.headers = options.headers || {};\n this.body = options.body;\n this.protocol = options.protocol\n ? options.protocol.slice(-1) !== \":\"\n ? `${options.protocol}:`\n : options.protocol\n : \"https:\";\n this.path = options.path ? (options.path.charAt(0) !== \"/\" ? `/${options.path}` : options.path) : \"/\";\n this.username = options.username;\n this.password = options.password;\n this.fragment = options.fragment;\n }\n static isInstance(request) {\n if (!request)\n return false;\n const req = request;\n return (\"method\" in req &&\n \"protocol\" in req &&\n \"hostname\" in req &&\n \"path\" in req &&\n typeof req[\"query\"] === \"object\" &&\n typeof req[\"headers\"] === \"object\");\n }\n clone() {\n const cloned = new HttpRequest({\n ...this,\n headers: { ...this.headers },\n });\n if (cloned.query)\n cloned.query = cloneQuery(cloned.query);\n return cloned;\n }\n}\nexports.HttpRequest = HttpRequest;\nfunction cloneQuery(query) {\n return Object.keys(query).reduce((carry, paramName) => {\n const param = query[paramName];\n return {\n ...carry,\n [paramName]: Array.isArray(param) ? [...param] : param,\n };\n }, {});\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpResponse = void 0;\nclass HttpResponse {\n constructor(options) {\n this.statusCode = options.statusCode;\n this.reason = options.reason;\n this.headers = options.headers || {};\n this.body = options.body;\n }\n static isInstance(response) {\n if (!response)\n return false;\n const resp = response;\n return typeof resp.statusCode === \"number\" && typeof resp.headers === \"object\";\n }\n}\nexports.HttpResponse = HttpResponse;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./extensions\"), exports);\ntslib_1.__exportStar(require(\"./Field\"), exports);\ntslib_1.__exportStar(require(\"./Fields\"), exports);\ntslib_1.__exportStar(require(\"./httpHandler\"), exports);\ntslib_1.__exportStar(require(\"./httpRequest\"), exports);\ntslib_1.__exportStar(require(\"./httpResponse\"), exports);\ntslib_1.__exportStar(require(\"./isValidHostname\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isValidHostname = void 0;\nfunction isValidHostname(hostname) {\n const hostPattern = /^[a-z0-9][a-z0-9\\.\\-]*[a-z0-9]$/;\n return hostPattern.test(hostname);\n}\nexports.isValidHostname = isValidHostname;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.buildQueryString = void 0;\nconst util_uri_escape_1 = require(\"@smithy/util-uri-escape\");\nfunction buildQueryString(query) {\n const parts = [];\n for (let key of Object.keys(query).sort()) {\n const value = query[key];\n key = (0, util_uri_escape_1.escapeUri)(key);\n if (Array.isArray(value)) {\n for (let i = 0, iLen = value.length; i < iLen; i++) {\n parts.push(`${key}=${(0, util_uri_escape_1.escapeUri)(value[i])}`);\n }\n }\n else {\n let qsEntry = key;\n if (value || typeof value === \"string\") {\n qsEntry += `=${(0, util_uri_escape_1.escapeUri)(value)}`;\n }\n parts.push(qsEntry);\n }\n }\n return parts.join(\"&\");\n}\nexports.buildQueryString = buildQueryString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseQueryString = void 0;\nfunction parseQueryString(querystring) {\n const query = {};\n querystring = querystring.replace(/^\\?/, \"\");\n if (querystring) {\n for (const pair of querystring.split(\"&\")) {\n let [key, value = null] = pair.split(\"=\");\n key = decodeURIComponent(key);\n if (value) {\n value = decodeURIComponent(value);\n }\n if (!(key in query)) {\n query[key] = value;\n }\n else if (Array.isArray(query[key])) {\n query[key].push(value);\n }\n else {\n query[key] = [query[key], value];\n }\n }\n }\n return query;\n}\nexports.parseQueryString = parseQueryString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODEJS_TIMEOUT_ERROR_CODES = exports.TRANSIENT_ERROR_STATUS_CODES = exports.TRANSIENT_ERROR_CODES = exports.THROTTLING_ERROR_CODES = exports.CLOCK_SKEW_ERROR_CODES = void 0;\nexports.CLOCK_SKEW_ERROR_CODES = [\n \"AuthFailure\",\n \"InvalidSignatureException\",\n \"RequestExpired\",\n \"RequestInTheFuture\",\n \"RequestTimeTooSkewed\",\n \"SignatureDoesNotMatch\",\n];\nexports.THROTTLING_ERROR_CODES = [\n \"BandwidthLimitExceeded\",\n \"EC2ThrottledException\",\n \"LimitExceededException\",\n \"PriorRequestNotComplete\",\n \"ProvisionedThroughputExceededException\",\n \"RequestLimitExceeded\",\n \"RequestThrottled\",\n \"RequestThrottledException\",\n \"SlowDown\",\n \"ThrottledException\",\n \"Throttling\",\n \"ThrottlingException\",\n \"TooManyRequestsException\",\n \"TransactionInProgressException\",\n];\nexports.TRANSIENT_ERROR_CODES = [\"TimeoutError\", \"RequestTimeout\", \"RequestTimeoutException\"];\nexports.TRANSIENT_ERROR_STATUS_CODES = [500, 502, 503, 504];\nexports.NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"ECONNREFUSED\", \"EPIPE\", \"ETIMEDOUT\"];\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isServerError = exports.isTransientError = exports.isThrottlingError = exports.isClockSkewError = exports.isRetryableByTrait = void 0;\nconst constants_1 = require(\"./constants\");\nconst isRetryableByTrait = (error) => error.$retryable !== undefined;\nexports.isRetryableByTrait = isRetryableByTrait;\nconst isClockSkewError = (error) => constants_1.CLOCK_SKEW_ERROR_CODES.includes(error.name);\nexports.isClockSkewError = isClockSkewError;\nconst isThrottlingError = (error) => {\n var _a, _b;\n return ((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) === 429 ||\n constants_1.THROTTLING_ERROR_CODES.includes(error.name) ||\n ((_b = error.$retryable) === null || _b === void 0 ? void 0 : _b.throttling) == true;\n};\nexports.isThrottlingError = isThrottlingError;\nconst isTransientError = (error) => {\n var _a;\n return constants_1.TRANSIENT_ERROR_CODES.includes(error.name) ||\n constants_1.NODEJS_TIMEOUT_ERROR_CODES.includes((error === null || error === void 0 ? void 0 : error.code) || \"\") ||\n constants_1.TRANSIENT_ERROR_STATUS_CODES.includes(((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) || 0);\n};\nexports.isTransientError = isTransientError;\nconst isServerError = (error) => {\n var _a;\n if (((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) !== undefined) {\n const statusCode = error.$metadata.httpStatusCode;\n if (500 <= statusCode && statusCode <= 599 && !(0, exports.isTransientError)(error)) {\n return true;\n }\n return false;\n }\n return false;\n};\nexports.isServerError = isServerError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getConfigData = void 0;\nconst types_1 = require(\"@smithy/types\");\nconst loadSharedConfigFiles_1 = require(\"./loadSharedConfigFiles\");\nconst getConfigData = (data) => Object.entries(data)\n .filter(([key]) => {\n const sections = key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR);\n if (sections.length === 2 && Object.values(types_1.IniSectionType).includes(sections[0])) {\n return true;\n }\n return false;\n})\n .reduce((acc, [key, value]) => {\n const updatedKey = key.startsWith(types_1.IniSectionType.PROFILE) ? key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR)[1] : key;\n acc[updatedKey] = value;\n return acc;\n}, {\n ...(data.default && { default: data.default }),\n});\nexports.getConfigData = getConfigData;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getConfigFilepath = exports.ENV_CONFIG_PATH = void 0;\nconst path_1 = require(\"path\");\nconst getHomeDir_1 = require(\"./getHomeDir\");\nexports.ENV_CONFIG_PATH = \"AWS_CONFIG_FILE\";\nconst getConfigFilepath = () => process.env[exports.ENV_CONFIG_PATH] || (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), \".aws\", \"config\");\nexports.getConfigFilepath = getConfigFilepath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getCredentialsFilepath = exports.ENV_CREDENTIALS_PATH = void 0;\nconst path_1 = require(\"path\");\nconst getHomeDir_1 = require(\"./getHomeDir\");\nexports.ENV_CREDENTIALS_PATH = \"AWS_SHARED_CREDENTIALS_FILE\";\nconst getCredentialsFilepath = () => process.env[exports.ENV_CREDENTIALS_PATH] || (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), \".aws\", \"credentials\");\nexports.getCredentialsFilepath = getCredentialsFilepath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getHomeDir = void 0;\nconst os_1 = require(\"os\");\nconst path_1 = require(\"path\");\nconst homeDirCache = {};\nconst getHomeDirCacheKey = () => {\n if (process && process.geteuid) {\n return `${process.geteuid()}`;\n }\n return \"DEFAULT\";\n};\nconst getHomeDir = () => {\n const { HOME, USERPROFILE, HOMEPATH, HOMEDRIVE = `C:${path_1.sep}` } = process.env;\n if (HOME)\n return HOME;\n if (USERPROFILE)\n return USERPROFILE;\n if (HOMEPATH)\n return `${HOMEDRIVE}${HOMEPATH}`;\n const homeDirCacheKey = getHomeDirCacheKey();\n if (!homeDirCache[homeDirCacheKey])\n homeDirCache[homeDirCacheKey] = (0, os_1.homedir)();\n return homeDirCache[homeDirCacheKey];\n};\nexports.getHomeDir = getHomeDir;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getProfileName = exports.DEFAULT_PROFILE = exports.ENV_PROFILE = void 0;\nexports.ENV_PROFILE = \"AWS_PROFILE\";\nexports.DEFAULT_PROFILE = \"default\";\nconst getProfileName = (init) => init.profile || process.env[exports.ENV_PROFILE] || exports.DEFAULT_PROFILE;\nexports.getProfileName = getProfileName;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSSOTokenFilepath = void 0;\nconst crypto_1 = require(\"crypto\");\nconst path_1 = require(\"path\");\nconst getHomeDir_1 = require(\"./getHomeDir\");\nconst getSSOTokenFilepath = (id) => {\n const hasher = (0, crypto_1.createHash)(\"sha1\");\n const cacheName = hasher.update(id).digest(\"hex\");\n return (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), \".aws\", \"sso\", \"cache\", `${cacheName}.json`);\n};\nexports.getSSOTokenFilepath = getSSOTokenFilepath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSSOTokenFromFile = void 0;\nconst fs_1 = require(\"fs\");\nconst getSSOTokenFilepath_1 = require(\"./getSSOTokenFilepath\");\nconst { readFile } = fs_1.promises;\nconst getSSOTokenFromFile = async (id) => {\n const ssoTokenFilepath = (0, getSSOTokenFilepath_1.getSSOTokenFilepath)(id);\n const ssoTokenText = await readFile(ssoTokenFilepath, \"utf8\");\n return JSON.parse(ssoTokenText);\n};\nexports.getSSOTokenFromFile = getSSOTokenFromFile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSsoSessionData = void 0;\nconst types_1 = require(\"@smithy/types\");\nconst loadSharedConfigFiles_1 = require(\"./loadSharedConfigFiles\");\nconst getSsoSessionData = (data) => Object.entries(data)\n .filter(([key]) => key.startsWith(types_1.IniSectionType.SSO_SESSION + loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR))\n .reduce((acc, [key, value]) => ({ ...acc, [key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR)[1]]: value }), {});\nexports.getSsoSessionData = getSsoSessionData;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./getHomeDir\"), exports);\ntslib_1.__exportStar(require(\"./getProfileName\"), exports);\ntslib_1.__exportStar(require(\"./getSSOTokenFilepath\"), exports);\ntslib_1.__exportStar(require(\"./getSSOTokenFromFile\"), exports);\ntslib_1.__exportStar(require(\"./loadSharedConfigFiles\"), exports);\ntslib_1.__exportStar(require(\"./loadSsoSessionData\"), exports);\ntslib_1.__exportStar(require(\"./parseKnownFiles\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadSharedConfigFiles = exports.CONFIG_PREFIX_SEPARATOR = void 0;\nconst getConfigData_1 = require(\"./getConfigData\");\nconst getConfigFilepath_1 = require(\"./getConfigFilepath\");\nconst getCredentialsFilepath_1 = require(\"./getCredentialsFilepath\");\nconst parseIni_1 = require(\"./parseIni\");\nconst slurpFile_1 = require(\"./slurpFile\");\nconst swallowError = () => ({});\nexports.CONFIG_PREFIX_SEPARATOR = \".\";\nconst loadSharedConfigFiles = async (init = {}) => {\n const { filepath = (0, getCredentialsFilepath_1.getCredentialsFilepath)(), configFilepath = (0, getConfigFilepath_1.getConfigFilepath)() } = init;\n const parsedFiles = await Promise.all([\n (0, slurpFile_1.slurpFile)(configFilepath, {\n ignoreCache: init.ignoreCache,\n })\n .then(parseIni_1.parseIni)\n .then(getConfigData_1.getConfigData)\n .catch(swallowError),\n (0, slurpFile_1.slurpFile)(filepath, {\n ignoreCache: init.ignoreCache,\n })\n .then(parseIni_1.parseIni)\n .catch(swallowError),\n ]);\n return {\n configFile: parsedFiles[0],\n credentialsFile: parsedFiles[1],\n };\n};\nexports.loadSharedConfigFiles = loadSharedConfigFiles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadSsoSessionData = void 0;\nconst getConfigFilepath_1 = require(\"./getConfigFilepath\");\nconst getSsoSessionData_1 = require(\"./getSsoSessionData\");\nconst parseIni_1 = require(\"./parseIni\");\nconst slurpFile_1 = require(\"./slurpFile\");\nconst swallowError = () => ({});\nconst loadSsoSessionData = async (init = {}) => {\n var _a;\n return (0, slurpFile_1.slurpFile)((_a = init.configFilepath) !== null && _a !== void 0 ? _a : (0, getConfigFilepath_1.getConfigFilepath)())\n .then(parseIni_1.parseIni)\n .then(getSsoSessionData_1.getSsoSessionData)\n .catch(swallowError);\n};\nexports.loadSsoSessionData = loadSsoSessionData;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mergeConfigFiles = void 0;\nconst mergeConfigFiles = (...files) => {\n const merged = {};\n for (const file of files) {\n for (const [key, values] of Object.entries(file)) {\n if (merged[key] !== undefined) {\n Object.assign(merged[key], values);\n }\n else {\n merged[key] = values;\n }\n }\n }\n return merged;\n};\nexports.mergeConfigFiles = mergeConfigFiles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseIni = void 0;\nconst types_1 = require(\"@smithy/types\");\nconst loadSharedConfigFiles_1 = require(\"./loadSharedConfigFiles\");\nconst prefixKeyRegex = /^([\\w-]+)\\s([\"'])?([\\w-@\\+]+)\\2$/;\nconst profileNameBlockList = [\"__proto__\", \"profile __proto__\"];\nconst parseIni = (iniData) => {\n const map = {};\n let currentSection;\n let currentSubSection;\n for (const iniLine of iniData.split(/\\r?\\n/)) {\n const trimmedLine = iniLine.split(/(^|\\s)[;#]/)[0].trim();\n const isSection = trimmedLine[0] === \"[\" && trimmedLine[trimmedLine.length - 1] === \"]\";\n if (isSection) {\n currentSection = undefined;\n currentSubSection = undefined;\n const sectionName = trimmedLine.substring(1, trimmedLine.length - 1);\n const matches = prefixKeyRegex.exec(sectionName);\n if (matches) {\n const [, prefix, , name] = matches;\n if (Object.values(types_1.IniSectionType).includes(prefix)) {\n currentSection = [prefix, name].join(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR);\n }\n }\n else {\n currentSection = sectionName;\n }\n if (profileNameBlockList.includes(sectionName)) {\n throw new Error(`Found invalid profile name \"${sectionName}\"`);\n }\n }\n else if (currentSection) {\n const indexOfEqualsSign = trimmedLine.indexOf(\"=\");\n if (![0, -1].includes(indexOfEqualsSign)) {\n const [name, value] = [\n trimmedLine.substring(0, indexOfEqualsSign).trim(),\n trimmedLine.substring(indexOfEqualsSign + 1).trim(),\n ];\n if (value === \"\") {\n currentSubSection = name;\n }\n else {\n if (currentSubSection && iniLine.trimStart() === iniLine) {\n currentSubSection = undefined;\n }\n map[currentSection] = map[currentSection] || {};\n const key = currentSubSection ? [currentSubSection, name].join(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR) : name;\n map[currentSection][key] = value;\n }\n }\n }\n }\n return map;\n};\nexports.parseIni = parseIni;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseKnownFiles = void 0;\nconst loadSharedConfigFiles_1 = require(\"./loadSharedConfigFiles\");\nconst mergeConfigFiles_1 = require(\"./mergeConfigFiles\");\nconst parseKnownFiles = async (init) => {\n const parsedFiles = await (0, loadSharedConfigFiles_1.loadSharedConfigFiles)(init);\n return (0, mergeConfigFiles_1.mergeConfigFiles)(parsedFiles.configFile, parsedFiles.credentialsFile);\n};\nexports.parseKnownFiles = parseKnownFiles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.slurpFile = void 0;\nconst fs_1 = require(\"fs\");\nconst { readFile } = fs_1.promises;\nconst filePromisesHash = {};\nconst slurpFile = (path, options) => {\n if (!filePromisesHash[path] || (options === null || options === void 0 ? void 0 : options.ignoreCache)) {\n filePromisesHash[path] = readFile(path, \"utf8\");\n }\n return filePromisesHash[path];\n};\nexports.slurpFile = slurpFile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SignatureV4 = void 0;\nconst eventstream_codec_1 = require(\"@smithy/eventstream-codec\");\nconst util_hex_encoding_1 = require(\"@smithy/util-hex-encoding\");\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst constants_1 = require(\"./constants\");\nconst credentialDerivation_1 = require(\"./credentialDerivation\");\nconst getCanonicalHeaders_1 = require(\"./getCanonicalHeaders\");\nconst getCanonicalQuery_1 = require(\"./getCanonicalQuery\");\nconst getPayloadHash_1 = require(\"./getPayloadHash\");\nconst headerUtil_1 = require(\"./headerUtil\");\nconst moveHeadersToQuery_1 = require(\"./moveHeadersToQuery\");\nconst prepareRequest_1 = require(\"./prepareRequest\");\nconst utilDate_1 = require(\"./utilDate\");\nclass SignatureV4 {\n constructor({ applyChecksum, credentials, region, service, sha256, uriEscapePath = true, }) {\n this.headerMarshaller = new eventstream_codec_1.HeaderMarshaller(util_utf8_1.toUtf8, util_utf8_1.fromUtf8);\n this.service = service;\n this.sha256 = sha256;\n this.uriEscapePath = uriEscapePath;\n this.applyChecksum = typeof applyChecksum === \"boolean\" ? applyChecksum : true;\n this.regionProvider = (0, util_middleware_1.normalizeProvider)(region);\n this.credentialProvider = (0, util_middleware_1.normalizeProvider)(credentials);\n }\n async presign(originalRequest, options = {}) {\n const { signingDate = new Date(), expiresIn = 3600, unsignableHeaders, unhoistableHeaders, signableHeaders, signingRegion, signingService, } = options;\n const credentials = await this.credentialProvider();\n this.validateResolvedCredentials(credentials);\n const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider());\n const { longDate, shortDate } = formatDate(signingDate);\n if (expiresIn > constants_1.MAX_PRESIGNED_TTL) {\n return Promise.reject(\"Signature version 4 presigned URLs\" + \" must have an expiration date less than one week in\" + \" the future\");\n }\n const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service);\n const request = (0, moveHeadersToQuery_1.moveHeadersToQuery)((0, prepareRequest_1.prepareRequest)(originalRequest), { unhoistableHeaders });\n if (credentials.sessionToken) {\n request.query[constants_1.TOKEN_QUERY_PARAM] = credentials.sessionToken;\n }\n request.query[constants_1.ALGORITHM_QUERY_PARAM] = constants_1.ALGORITHM_IDENTIFIER;\n request.query[constants_1.CREDENTIAL_QUERY_PARAM] = `${credentials.accessKeyId}/${scope}`;\n request.query[constants_1.AMZ_DATE_QUERY_PARAM] = longDate;\n request.query[constants_1.EXPIRES_QUERY_PARAM] = expiresIn.toString(10);\n const canonicalHeaders = (0, getCanonicalHeaders_1.getCanonicalHeaders)(request, unsignableHeaders, signableHeaders);\n request.query[constants_1.SIGNED_HEADERS_QUERY_PARAM] = getCanonicalHeaderList(canonicalHeaders);\n request.query[constants_1.SIGNATURE_QUERY_PARAM] = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, await (0, getPayloadHash_1.getPayloadHash)(originalRequest, this.sha256)));\n return request;\n }\n async sign(toSign, options) {\n if (typeof toSign === \"string\") {\n return this.signString(toSign, options);\n }\n else if (toSign.headers && toSign.payload) {\n return this.signEvent(toSign, options);\n }\n else if (toSign.message) {\n return this.signMessage(toSign, options);\n }\n else {\n return this.signRequest(toSign, options);\n }\n }\n async signEvent({ headers, payload }, { signingDate = new Date(), priorSignature, signingRegion, signingService }) {\n const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider());\n const { shortDate, longDate } = formatDate(signingDate);\n const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service);\n const hashedPayload = await (0, getPayloadHash_1.getPayloadHash)({ headers: {}, body: payload }, this.sha256);\n const hash = new this.sha256();\n hash.update(headers);\n const hashedHeaders = (0, util_hex_encoding_1.toHex)(await hash.digest());\n const stringToSign = [\n constants_1.EVENT_ALGORITHM_IDENTIFIER,\n longDate,\n scope,\n priorSignature,\n hashedHeaders,\n hashedPayload,\n ].join(\"\\n\");\n return this.signString(stringToSign, { signingDate, signingRegion: region, signingService });\n }\n async signMessage(signableMessage, { signingDate = new Date(), signingRegion, signingService }) {\n const promise = this.signEvent({\n headers: this.headerMarshaller.format(signableMessage.message.headers),\n payload: signableMessage.message.body,\n }, {\n signingDate,\n signingRegion,\n signingService,\n priorSignature: signableMessage.priorSignature,\n });\n return promise.then((signature) => {\n return { message: signableMessage.message, signature };\n });\n }\n async signString(stringToSign, { signingDate = new Date(), signingRegion, signingService } = {}) {\n const credentials = await this.credentialProvider();\n this.validateResolvedCredentials(credentials);\n const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider());\n const { shortDate } = formatDate(signingDate);\n const hash = new this.sha256(await this.getSigningKey(credentials, region, shortDate, signingService));\n hash.update((0, util_utf8_1.toUint8Array)(stringToSign));\n return (0, util_hex_encoding_1.toHex)(await hash.digest());\n }\n async signRequest(requestToSign, { signingDate = new Date(), signableHeaders, unsignableHeaders, signingRegion, signingService, } = {}) {\n const credentials = await this.credentialProvider();\n this.validateResolvedCredentials(credentials);\n const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider());\n const request = (0, prepareRequest_1.prepareRequest)(requestToSign);\n const { longDate, shortDate } = formatDate(signingDate);\n const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service);\n request.headers[constants_1.AMZ_DATE_HEADER] = longDate;\n if (credentials.sessionToken) {\n request.headers[constants_1.TOKEN_HEADER] = credentials.sessionToken;\n }\n const payloadHash = await (0, getPayloadHash_1.getPayloadHash)(request, this.sha256);\n if (!(0, headerUtil_1.hasHeader)(constants_1.SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants_1.SHA256_HEADER] = payloadHash;\n }\n const canonicalHeaders = (0, getCanonicalHeaders_1.getCanonicalHeaders)(request, unsignableHeaders, signableHeaders);\n const signature = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, payloadHash));\n request.headers[constants_1.AUTH_HEADER] =\n `${constants_1.ALGORITHM_IDENTIFIER} ` +\n `Credential=${credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${getCanonicalHeaderList(canonicalHeaders)}, ` +\n `Signature=${signature}`;\n return request;\n }\n createCanonicalRequest(request, canonicalHeaders, payloadHash) {\n const sortedHeaders = Object.keys(canonicalHeaders).sort();\n return `${request.method}\n${this.getCanonicalPath(request)}\n${(0, getCanonicalQuery_1.getCanonicalQuery)(request)}\n${sortedHeaders.map((name) => `${name}:${canonicalHeaders[name]}`).join(\"\\n\")}\n\n${sortedHeaders.join(\";\")}\n${payloadHash}`;\n }\n async createStringToSign(longDate, credentialScope, canonicalRequest) {\n const hash = new this.sha256();\n hash.update((0, util_utf8_1.toUint8Array)(canonicalRequest));\n const hashedRequest = await hash.digest();\n return `${constants_1.ALGORITHM_IDENTIFIER}\n${longDate}\n${credentialScope}\n${(0, util_hex_encoding_1.toHex)(hashedRequest)}`;\n }\n getCanonicalPath({ path }) {\n if (this.uriEscapePath) {\n const normalizedPathSegments = [];\n for (const pathSegment of path.split(\"/\")) {\n if ((pathSegment === null || pathSegment === void 0 ? void 0 : pathSegment.length) === 0)\n continue;\n if (pathSegment === \".\")\n continue;\n if (pathSegment === \"..\") {\n normalizedPathSegments.pop();\n }\n else {\n normalizedPathSegments.push(pathSegment);\n }\n }\n const normalizedPath = `${(path === null || path === void 0 ? void 0 : path.startsWith(\"/\")) ? \"/\" : \"\"}${normalizedPathSegments.join(\"/\")}${normalizedPathSegments.length > 0 && (path === null || path === void 0 ? void 0 : path.endsWith(\"/\")) ? \"/\" : \"\"}`;\n const doubleEncoded = encodeURIComponent(normalizedPath);\n return doubleEncoded.replace(/%2F/g, \"/\");\n }\n return path;\n }\n async getSignature(longDate, credentialScope, keyPromise, canonicalRequest) {\n const stringToSign = await this.createStringToSign(longDate, credentialScope, canonicalRequest);\n const hash = new this.sha256(await keyPromise);\n hash.update((0, util_utf8_1.toUint8Array)(stringToSign));\n return (0, util_hex_encoding_1.toHex)(await hash.digest());\n }\n getSigningKey(credentials, region, shortDate, service) {\n return (0, credentialDerivation_1.getSigningKey)(this.sha256, credentials, shortDate, region, service || this.service);\n }\n validateResolvedCredentials(credentials) {\n if (typeof credentials !== \"object\" ||\n typeof credentials.accessKeyId !== \"string\" ||\n typeof credentials.secretAccessKey !== \"string\") {\n throw new Error(\"Resolved credential object is not valid\");\n }\n }\n}\nexports.SignatureV4 = SignatureV4;\nconst formatDate = (now) => {\n const longDate = (0, utilDate_1.iso8601)(now).replace(/[\\-:]/g, \"\");\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n };\n};\nconst getCanonicalHeaderList = (headers) => Object.keys(headers).sort().join(\";\");\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.cloneQuery = exports.cloneRequest = void 0;\nconst cloneRequest = ({ headers, query, ...rest }) => ({\n ...rest,\n headers: { ...headers },\n query: query ? (0, exports.cloneQuery)(query) : undefined,\n});\nexports.cloneRequest = cloneRequest;\nconst cloneQuery = (query) => Object.keys(query).reduce((carry, paramName) => {\n const param = query[paramName];\n return {\n ...carry,\n [paramName]: Array.isArray(param) ? [...param] : param,\n };\n}, {});\nexports.cloneQuery = cloneQuery;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MAX_PRESIGNED_TTL = exports.KEY_TYPE_IDENTIFIER = exports.MAX_CACHE_SIZE = exports.UNSIGNED_PAYLOAD = exports.EVENT_ALGORITHM_IDENTIFIER = exports.ALGORITHM_IDENTIFIER_V4A = exports.ALGORITHM_IDENTIFIER = exports.UNSIGNABLE_PATTERNS = exports.SEC_HEADER_PATTERN = exports.PROXY_HEADER_PATTERN = exports.ALWAYS_UNSIGNABLE_HEADERS = exports.HOST_HEADER = exports.TOKEN_HEADER = exports.SHA256_HEADER = exports.SIGNATURE_HEADER = exports.GENERATED_HEADERS = exports.DATE_HEADER = exports.AMZ_DATE_HEADER = exports.AUTH_HEADER = exports.REGION_SET_PARAM = exports.TOKEN_QUERY_PARAM = exports.SIGNATURE_QUERY_PARAM = exports.EXPIRES_QUERY_PARAM = exports.SIGNED_HEADERS_QUERY_PARAM = exports.AMZ_DATE_QUERY_PARAM = exports.CREDENTIAL_QUERY_PARAM = exports.ALGORITHM_QUERY_PARAM = void 0;\nexports.ALGORITHM_QUERY_PARAM = \"X-Amz-Algorithm\";\nexports.CREDENTIAL_QUERY_PARAM = \"X-Amz-Credential\";\nexports.AMZ_DATE_QUERY_PARAM = \"X-Amz-Date\";\nexports.SIGNED_HEADERS_QUERY_PARAM = \"X-Amz-SignedHeaders\";\nexports.EXPIRES_QUERY_PARAM = \"X-Amz-Expires\";\nexports.SIGNATURE_QUERY_PARAM = \"X-Amz-Signature\";\nexports.TOKEN_QUERY_PARAM = \"X-Amz-Security-Token\";\nexports.REGION_SET_PARAM = \"X-Amz-Region-Set\";\nexports.AUTH_HEADER = \"authorization\";\nexports.AMZ_DATE_HEADER = exports.AMZ_DATE_QUERY_PARAM.toLowerCase();\nexports.DATE_HEADER = \"date\";\nexports.GENERATED_HEADERS = [exports.AUTH_HEADER, exports.AMZ_DATE_HEADER, exports.DATE_HEADER];\nexports.SIGNATURE_HEADER = exports.SIGNATURE_QUERY_PARAM.toLowerCase();\nexports.SHA256_HEADER = \"x-amz-content-sha256\";\nexports.TOKEN_HEADER = exports.TOKEN_QUERY_PARAM.toLowerCase();\nexports.HOST_HEADER = \"host\";\nexports.ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n \"cache-control\": true,\n connection: true,\n expect: true,\n from: true,\n \"keep-alive\": true,\n \"max-forwards\": true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n \"transfer-encoding\": true,\n upgrade: true,\n \"user-agent\": true,\n \"x-amzn-trace-id\": true,\n};\nexports.PROXY_HEADER_PATTERN = /^proxy-/;\nexports.SEC_HEADER_PATTERN = /^sec-/;\nexports.UNSIGNABLE_PATTERNS = [/^proxy-/i, /^sec-/i];\nexports.ALGORITHM_IDENTIFIER = \"AWS4-HMAC-SHA256\";\nexports.ALGORITHM_IDENTIFIER_V4A = \"AWS4-ECDSA-P256-SHA256\";\nexports.EVENT_ALGORITHM_IDENTIFIER = \"AWS4-HMAC-SHA256-PAYLOAD\";\nexports.UNSIGNED_PAYLOAD = \"UNSIGNED-PAYLOAD\";\nexports.MAX_CACHE_SIZE = 50;\nexports.KEY_TYPE_IDENTIFIER = \"aws4_request\";\nexports.MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.clearCredentialCache = exports.getSigningKey = exports.createScope = void 0;\nconst util_hex_encoding_1 = require(\"@smithy/util-hex-encoding\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst constants_1 = require(\"./constants\");\nconst signingKeyCache = {};\nconst cacheQueue = [];\nconst createScope = (shortDate, region, service) => `${shortDate}/${region}/${service}/${constants_1.KEY_TYPE_IDENTIFIER}`;\nexports.createScope = createScope;\nconst getSigningKey = async (sha256Constructor, credentials, shortDate, region, service) => {\n const credsHash = await hmac(sha256Constructor, credentials.secretAccessKey, credentials.accessKeyId);\n const cacheKey = `${shortDate}:${region}:${service}:${(0, util_hex_encoding_1.toHex)(credsHash)}:${credentials.sessionToken}`;\n if (cacheKey in signingKeyCache) {\n return signingKeyCache[cacheKey];\n }\n cacheQueue.push(cacheKey);\n while (cacheQueue.length > constants_1.MAX_CACHE_SIZE) {\n delete signingKeyCache[cacheQueue.shift()];\n }\n let key = `AWS4${credentials.secretAccessKey}`;\n for (const signable of [shortDate, region, service, constants_1.KEY_TYPE_IDENTIFIER]) {\n key = await hmac(sha256Constructor, key, signable);\n }\n return (signingKeyCache[cacheKey] = key);\n};\nexports.getSigningKey = getSigningKey;\nconst clearCredentialCache = () => {\n cacheQueue.length = 0;\n Object.keys(signingKeyCache).forEach((cacheKey) => {\n delete signingKeyCache[cacheKey];\n });\n};\nexports.clearCredentialCache = clearCredentialCache;\nconst hmac = (ctor, secret, data) => {\n const hash = new ctor(secret);\n hash.update((0, util_utf8_1.toUint8Array)(data));\n return hash.digest();\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getCanonicalHeaders = void 0;\nconst constants_1 = require(\"./constants\");\nconst getCanonicalHeaders = ({ headers }, unsignableHeaders, signableHeaders) => {\n const canonical = {};\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue;\n }\n const canonicalHeaderName = headerName.toLowerCase();\n if (canonicalHeaderName in constants_1.ALWAYS_UNSIGNABLE_HEADERS ||\n (unsignableHeaders === null || unsignableHeaders === void 0 ? void 0 : unsignableHeaders.has(canonicalHeaderName)) ||\n constants_1.PROXY_HEADER_PATTERN.test(canonicalHeaderName) ||\n constants_1.SEC_HEADER_PATTERN.test(canonicalHeaderName)) {\n if (!signableHeaders || (signableHeaders && !signableHeaders.has(canonicalHeaderName))) {\n continue;\n }\n }\n canonical[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, \" \");\n }\n return canonical;\n};\nexports.getCanonicalHeaders = getCanonicalHeaders;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getCanonicalQuery = void 0;\nconst util_uri_escape_1 = require(\"@smithy/util-uri-escape\");\nconst constants_1 = require(\"./constants\");\nconst getCanonicalQuery = ({ query = {} }) => {\n const keys = [];\n const serialized = {};\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants_1.SIGNATURE_HEADER) {\n continue;\n }\n keys.push(key);\n const value = query[key];\n if (typeof value === \"string\") {\n serialized[key] = `${(0, util_uri_escape_1.escapeUri)(key)}=${(0, util_uri_escape_1.escapeUri)(value)}`;\n }\n else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .reduce((encoded, value) => encoded.concat([`${(0, util_uri_escape_1.escapeUri)(key)}=${(0, util_uri_escape_1.escapeUri)(value)}`]), [])\n .sort()\n .join(\"&\");\n }\n }\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join(\"&\");\n};\nexports.getCanonicalQuery = getCanonicalQuery;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getPayloadHash = void 0;\nconst is_array_buffer_1 = require(\"@smithy/is-array-buffer\");\nconst util_hex_encoding_1 = require(\"@smithy/util-hex-encoding\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst constants_1 = require(\"./constants\");\nconst getPayloadHash = async ({ headers, body }, hashConstructor) => {\n for (const headerName of Object.keys(headers)) {\n if (headerName.toLowerCase() === constants_1.SHA256_HEADER) {\n return headers[headerName];\n }\n }\n if (body == undefined) {\n return \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\";\n }\n else if (typeof body === \"string\" || ArrayBuffer.isView(body) || (0, is_array_buffer_1.isArrayBuffer)(body)) {\n const hashCtor = new hashConstructor();\n hashCtor.update((0, util_utf8_1.toUint8Array)(body));\n return (0, util_hex_encoding_1.toHex)(await hashCtor.digest());\n }\n return constants_1.UNSIGNED_PAYLOAD;\n};\nexports.getPayloadHash = getPayloadHash;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.deleteHeader = exports.getHeaderValue = exports.hasHeader = void 0;\nconst hasHeader = (soughtHeader, headers) => {\n soughtHeader = soughtHeader.toLowerCase();\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true;\n }\n }\n return false;\n};\nexports.hasHeader = hasHeader;\nconst getHeaderValue = (soughtHeader, headers) => {\n soughtHeader = soughtHeader.toLowerCase();\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return headers[headerName];\n }\n }\n return undefined;\n};\nexports.getHeaderValue = getHeaderValue;\nconst deleteHeader = (soughtHeader, headers) => {\n soughtHeader = soughtHeader.toLowerCase();\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n delete headers[headerName];\n }\n }\n};\nexports.deleteHeader = deleteHeader;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.prepareRequest = exports.moveHeadersToQuery = exports.getPayloadHash = exports.getCanonicalQuery = exports.getCanonicalHeaders = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./SignatureV4\"), exports);\nvar getCanonicalHeaders_1 = require(\"./getCanonicalHeaders\");\nObject.defineProperty(exports, \"getCanonicalHeaders\", { enumerable: true, get: function () { return getCanonicalHeaders_1.getCanonicalHeaders; } });\nvar getCanonicalQuery_1 = require(\"./getCanonicalQuery\");\nObject.defineProperty(exports, \"getCanonicalQuery\", { enumerable: true, get: function () { return getCanonicalQuery_1.getCanonicalQuery; } });\nvar getPayloadHash_1 = require(\"./getPayloadHash\");\nObject.defineProperty(exports, \"getPayloadHash\", { enumerable: true, get: function () { return getPayloadHash_1.getPayloadHash; } });\nvar moveHeadersToQuery_1 = require(\"./moveHeadersToQuery\");\nObject.defineProperty(exports, \"moveHeadersToQuery\", { enumerable: true, get: function () { return moveHeadersToQuery_1.moveHeadersToQuery; } });\nvar prepareRequest_1 = require(\"./prepareRequest\");\nObject.defineProperty(exports, \"prepareRequest\", { enumerable: true, get: function () { return prepareRequest_1.prepareRequest; } });\ntslib_1.__exportStar(require(\"./credentialDerivation\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.moveHeadersToQuery = void 0;\nconst cloneRequest_1 = require(\"./cloneRequest\");\nconst moveHeadersToQuery = (request, options = {}) => {\n var _a;\n const { headers, query = {} } = typeof request.clone === \"function\" ? request.clone() : (0, cloneRequest_1.cloneRequest)(request);\n for (const name of Object.keys(headers)) {\n const lname = name.toLowerCase();\n if (lname.slice(0, 6) === \"x-amz-\" && !((_a = options.unhoistableHeaders) === null || _a === void 0 ? void 0 : _a.has(lname))) {\n query[name] = headers[name];\n delete headers[name];\n }\n }\n return {\n ...request,\n headers,\n query,\n };\n};\nexports.moveHeadersToQuery = moveHeadersToQuery;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.prepareRequest = void 0;\nconst cloneRequest_1 = require(\"./cloneRequest\");\nconst constants_1 = require(\"./constants\");\nconst prepareRequest = (request) => {\n request = typeof request.clone === \"function\" ? request.clone() : (0, cloneRequest_1.cloneRequest)(request);\n for (const headerName of Object.keys(request.headers)) {\n if (constants_1.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName];\n }\n }\n return request;\n};\nexports.prepareRequest = prepareRequest;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toDate = exports.iso8601 = void 0;\nconst iso8601 = (time) => (0, exports.toDate)(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, \"Z\");\nexports.iso8601 = iso8601;\nconst toDate = (time) => {\n if (typeof time === \"number\") {\n return new Date(time * 1000);\n }\n if (typeof time === \"string\") {\n if (Number(time)) {\n return new Date(Number(time) * 1000);\n }\n return new Date(time);\n }\n return time;\n};\nexports.toDate = toDate;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NoOpLogger = void 0;\nclass NoOpLogger {\n trace() { }\n debug() { }\n info() { }\n warn() { }\n error() { }\n}\nexports.NoOpLogger = NoOpLogger;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Client = void 0;\nconst middleware_stack_1 = require(\"@smithy/middleware-stack\");\nclass Client {\n constructor(config) {\n this.middlewareStack = (0, middleware_stack_1.constructStack)();\n this.config = config;\n }\n send(command, optionsOrCb, cb) {\n const options = typeof optionsOrCb !== \"function\" ? optionsOrCb : undefined;\n const callback = typeof optionsOrCb === \"function\" ? optionsOrCb : cb;\n const handler = command.resolveMiddleware(this.middlewareStack, this.config, options);\n if (callback) {\n handler(command)\n .then((result) => callback(null, result.output), (err) => callback(err))\n .catch(() => { });\n }\n else {\n return handler(command).then((result) => result.output);\n }\n }\n destroy() {\n if (this.config.requestHandler.destroy)\n this.config.requestHandler.destroy();\n }\n}\nexports.Client = Client;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.collectBody = void 0;\nconst util_stream_1 = require(\"@smithy/util-stream\");\nconst collectBody = async (streamBody = new Uint8Array(), context) => {\n if (streamBody instanceof Uint8Array) {\n return util_stream_1.Uint8ArrayBlobAdapter.mutate(streamBody);\n }\n if (!streamBody) {\n return util_stream_1.Uint8ArrayBlobAdapter.mutate(new Uint8Array());\n }\n const fromContext = context.streamCollector(streamBody);\n return util_stream_1.Uint8ArrayBlobAdapter.mutate(await fromContext);\n};\nexports.collectBody = collectBody;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Command = void 0;\nconst middleware_stack_1 = require(\"@smithy/middleware-stack\");\nclass Command {\n constructor() {\n this.middlewareStack = (0, middleware_stack_1.constructStack)();\n }\n}\nexports.Command = Command;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SENSITIVE_STRING = void 0;\nexports.SENSITIVE_STRING = \"***SensitiveInformation***\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createAggregatedClient = void 0;\nconst createAggregatedClient = (commands, Client) => {\n for (const command of Object.keys(commands)) {\n const CommandCtor = commands[command];\n const methodImpl = async function (args, optionsOrCb, cb) {\n const command = new CommandCtor(args);\n if (typeof optionsOrCb === \"function\") {\n this.send(command, optionsOrCb);\n }\n else if (typeof cb === \"function\") {\n if (typeof optionsOrCb !== \"object\")\n throw new Error(`Expected http options but got ${typeof optionsOrCb}`);\n this.send(command, optionsOrCb || {}, cb);\n }\n else {\n return this.send(command, optionsOrCb);\n }\n };\n const methodName = (command[0].toLowerCase() + command.slice(1)).replace(/Command$/, \"\");\n Client.prototype[methodName] = methodImpl;\n }\n};\nexports.createAggregatedClient = createAggregatedClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseEpochTimestamp = exports.parseRfc7231DateTime = exports.parseRfc3339DateTimeWithOffset = exports.parseRfc3339DateTime = exports.dateToUtcString = void 0;\nconst parse_utils_1 = require(\"./parse-utils\");\nconst DAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\nfunction dateToUtcString(date) {\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth();\n const dayOfWeek = date.getUTCDay();\n const dayOfMonthInt = date.getUTCDate();\n const hoursInt = date.getUTCHours();\n const minutesInt = date.getUTCMinutes();\n const secondsInt = date.getUTCSeconds();\n const dayOfMonthString = dayOfMonthInt < 10 ? `0${dayOfMonthInt}` : `${dayOfMonthInt}`;\n const hoursString = hoursInt < 10 ? `0${hoursInt}` : `${hoursInt}`;\n const minutesString = minutesInt < 10 ? `0${minutesInt}` : `${minutesInt}`;\n const secondsString = secondsInt < 10 ? `0${secondsInt}` : `${secondsInt}`;\n return `${DAYS[dayOfWeek]}, ${dayOfMonthString} ${MONTHS[month]} ${year} ${hoursString}:${minutesString}:${secondsString} GMT`;\n}\nexports.dateToUtcString = dateToUtcString;\nconst RFC3339 = new RegExp(/^(\\d{4})-(\\d{2})-(\\d{2})[tT](\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?[zZ]$/);\nconst parseRfc3339DateTime = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(\"RFC-3339 date-times must be expressed as strings\");\n }\n const match = RFC3339.exec(value);\n if (!match) {\n throw new TypeError(\"Invalid RFC-3339 date-time value\");\n }\n const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n const year = (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr));\n const month = parseDateValue(monthStr, \"month\", 1, 12);\n const day = parseDateValue(dayStr, \"day\", 1, 31);\n return buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds });\n};\nexports.parseRfc3339DateTime = parseRfc3339DateTime;\nconst RFC3339_WITH_OFFSET = new RegExp(/^(\\d{4})-(\\d{2})-(\\d{2})[tT](\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?(([-+]\\d{2}\\:\\d{2})|[zZ])$/);\nconst parseRfc3339DateTimeWithOffset = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(\"RFC-3339 date-times must be expressed as strings\");\n }\n const match = RFC3339_WITH_OFFSET.exec(value);\n if (!match) {\n throw new TypeError(\"Invalid RFC-3339 date-time value\");\n }\n const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, offsetStr] = match;\n const year = (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr));\n const month = parseDateValue(monthStr, \"month\", 1, 12);\n const day = parseDateValue(dayStr, \"day\", 1, 31);\n const date = buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds });\n if (offsetStr.toUpperCase() != \"Z\") {\n date.setTime(date.getTime() - parseOffsetToMilliseconds(offsetStr));\n }\n return date;\n};\nexports.parseRfc3339DateTimeWithOffset = parseRfc3339DateTimeWithOffset;\nconst IMF_FIXDATE = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? GMT$/);\nconst RFC_850_DATE = new RegExp(/^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d{2}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? GMT$/);\nconst ASC_TIME = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( [1-9]|\\d{2}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? (\\d{4})$/);\nconst parseRfc7231DateTime = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(\"RFC-7231 date-times must be expressed as strings\");\n }\n let match = IMF_FIXDATE.exec(value);\n if (match) {\n const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n return buildDate((0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr, \"day\", 1, 31), { hours, minutes, seconds, fractionalMilliseconds });\n }\n match = RFC_850_DATE.exec(value);\n if (match) {\n const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n return adjustRfc850Year(buildDate(parseTwoDigitYear(yearStr), parseMonthByShortName(monthStr), parseDateValue(dayStr, \"day\", 1, 31), {\n hours,\n minutes,\n seconds,\n fractionalMilliseconds,\n }));\n }\n match = ASC_TIME.exec(value);\n if (match) {\n const [_, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, yearStr] = match;\n return buildDate((0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr.trimLeft(), \"day\", 1, 31), { hours, minutes, seconds, fractionalMilliseconds });\n }\n throw new TypeError(\"Invalid RFC-7231 date-time value\");\n};\nexports.parseRfc7231DateTime = parseRfc7231DateTime;\nconst parseEpochTimestamp = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n let valueAsDouble;\n if (typeof value === \"number\") {\n valueAsDouble = value;\n }\n else if (typeof value === \"string\") {\n valueAsDouble = (0, parse_utils_1.strictParseDouble)(value);\n }\n else {\n throw new TypeError(\"Epoch timestamps must be expressed as floating point numbers or their string representation\");\n }\n if (Number.isNaN(valueAsDouble) || valueAsDouble === Infinity || valueAsDouble === -Infinity) {\n throw new TypeError(\"Epoch timestamps must be valid, non-Infinite, non-NaN numerics\");\n }\n return new Date(Math.round(valueAsDouble * 1000));\n};\nexports.parseEpochTimestamp = parseEpochTimestamp;\nconst buildDate = (year, month, day, time) => {\n const adjustedMonth = month - 1;\n validateDayOfMonth(year, adjustedMonth, day);\n return new Date(Date.UTC(year, adjustedMonth, day, parseDateValue(time.hours, \"hour\", 0, 23), parseDateValue(time.minutes, \"minute\", 0, 59), parseDateValue(time.seconds, \"seconds\", 0, 60), parseMilliseconds(time.fractionalMilliseconds)));\n};\nconst parseTwoDigitYear = (value) => {\n const thisYear = new Date().getUTCFullYear();\n const valueInThisCentury = Math.floor(thisYear / 100) * 100 + (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(value));\n if (valueInThisCentury < thisYear) {\n return valueInThisCentury + 100;\n }\n return valueInThisCentury;\n};\nconst FIFTY_YEARS_IN_MILLIS = 50 * 365 * 24 * 60 * 60 * 1000;\nconst adjustRfc850Year = (input) => {\n if (input.getTime() - new Date().getTime() > FIFTY_YEARS_IN_MILLIS) {\n return new Date(Date.UTC(input.getUTCFullYear() - 100, input.getUTCMonth(), input.getUTCDate(), input.getUTCHours(), input.getUTCMinutes(), input.getUTCSeconds(), input.getUTCMilliseconds()));\n }\n return input;\n};\nconst parseMonthByShortName = (value) => {\n const monthIdx = MONTHS.indexOf(value);\n if (monthIdx < 0) {\n throw new TypeError(`Invalid month: ${value}`);\n }\n return monthIdx + 1;\n};\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst validateDayOfMonth = (year, month, day) => {\n let maxDays = DAYS_IN_MONTH[month];\n if (month === 1 && isLeapYear(year)) {\n maxDays = 29;\n }\n if (day > maxDays) {\n throw new TypeError(`Invalid day for ${MONTHS[month]} in ${year}: ${day}`);\n }\n};\nconst isLeapYear = (year) => {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n};\nconst parseDateValue = (value, type, lower, upper) => {\n const dateVal = (0, parse_utils_1.strictParseByte)(stripLeadingZeroes(value));\n if (dateVal < lower || dateVal > upper) {\n throw new TypeError(`${type} must be between ${lower} and ${upper}, inclusive`);\n }\n return dateVal;\n};\nconst parseMilliseconds = (value) => {\n if (value === null || value === undefined) {\n return 0;\n }\n return (0, parse_utils_1.strictParseFloat32)(\"0.\" + value) * 1000;\n};\nconst parseOffsetToMilliseconds = (value) => {\n const directionStr = value[0];\n let direction = 1;\n if (directionStr == \"+\") {\n direction = 1;\n }\n else if (directionStr == \"-\") {\n direction = -1;\n }\n else {\n throw new TypeError(`Offset direction, ${directionStr}, must be \"+\" or \"-\"`);\n }\n const hour = Number(value.substring(1, 3));\n const minute = Number(value.substring(4, 6));\n return direction * (hour * 60 + minute) * 60 * 1000;\n};\nconst stripLeadingZeroes = (value) => {\n let idx = 0;\n while (idx < value.length - 1 && value.charAt(idx) === \"0\") {\n idx++;\n }\n if (idx === 0) {\n return value;\n }\n return value.slice(idx);\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.withBaseException = exports.throwDefaultError = void 0;\nconst exceptions_1 = require(\"./exceptions\");\nconst throwDefaultError = ({ output, parsedBody, exceptionCtor, errorCode }) => {\n const $metadata = deserializeMetadata(output);\n const statusCode = $metadata.httpStatusCode ? $metadata.httpStatusCode + \"\" : undefined;\n const response = new exceptionCtor({\n name: (parsedBody === null || parsedBody === void 0 ? void 0 : parsedBody.code) || (parsedBody === null || parsedBody === void 0 ? void 0 : parsedBody.Code) || errorCode || statusCode || \"UnknownError\",\n $fault: \"client\",\n $metadata,\n });\n throw (0, exceptions_1.decorateServiceException)(response, parsedBody);\n};\nexports.throwDefaultError = throwDefaultError;\nconst withBaseException = (ExceptionCtor) => {\n return ({ output, parsedBody, errorCode }) => {\n (0, exports.throwDefaultError)({ output, parsedBody, exceptionCtor: ExceptionCtor, errorCode });\n };\n};\nexports.withBaseException = withBaseException;\nconst deserializeMetadata = (output) => {\n var _a, _b;\n return ({\n httpStatusCode: output.statusCode,\n requestId: (_b = (_a = output.headers[\"x-amzn-requestid\"]) !== null && _a !== void 0 ? _a : output.headers[\"x-amzn-request-id\"]) !== null && _b !== void 0 ? _b : output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n });\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadConfigsForDefaultMode = void 0;\nconst loadConfigsForDefaultMode = (mode) => {\n switch (mode) {\n case \"standard\":\n return {\n retryMode: \"standard\",\n connectionTimeout: 3100,\n };\n case \"in-region\":\n return {\n retryMode: \"standard\",\n connectionTimeout: 1100,\n };\n case \"cross-region\":\n return {\n retryMode: \"standard\",\n connectionTimeout: 3100,\n };\n case \"mobile\":\n return {\n retryMode: \"standard\",\n connectionTimeout: 30000,\n };\n default:\n return {};\n }\n};\nexports.loadConfigsForDefaultMode = loadConfigsForDefaultMode;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.emitWarningIfUnsupportedVersion = void 0;\nlet warningEmitted = false;\nconst emitWarningIfUnsupportedVersion = (version) => {\n if (version && !warningEmitted && parseInt(version.substring(1, version.indexOf(\".\"))) < 14) {\n warningEmitted = true;\n }\n};\nexports.emitWarningIfUnsupportedVersion = emitWarningIfUnsupportedVersion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decorateServiceException = exports.ServiceException = void 0;\nclass ServiceException extends Error {\n constructor(options) {\n super(options.message);\n Object.setPrototypeOf(this, ServiceException.prototype);\n this.name = options.name;\n this.$fault = options.$fault;\n this.$metadata = options.$metadata;\n }\n}\nexports.ServiceException = ServiceException;\nconst decorateServiceException = (exception, additions = {}) => {\n Object.entries(additions)\n .filter(([, v]) => v !== undefined)\n .forEach(([k, v]) => {\n if (exception[k] == undefined || exception[k] === \"\") {\n exception[k] = v;\n }\n });\n const message = exception.message || exception.Message || \"UnknownError\";\n exception.message = message;\n delete exception.Message;\n return exception;\n};\nexports.decorateServiceException = decorateServiceException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.extendedEncodeURIComponent = void 0;\nfunction extendedEncodeURIComponent(str) {\n return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {\n return \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\nexports.extendedEncodeURIComponent = extendedEncodeURIComponent;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveChecksumRuntimeConfig = exports.getChecksumConfiguration = exports.AlgorithmId = void 0;\nconst types_1 = require(\"@smithy/types\");\nObject.defineProperty(exports, \"AlgorithmId\", { enumerable: true, get: function () { return types_1.AlgorithmId; } });\nconst getChecksumConfiguration = (runtimeConfig) => {\n const checksumAlgorithms = [];\n for (const id in types_1.AlgorithmId) {\n const algorithmId = types_1.AlgorithmId[id];\n if (runtimeConfig[algorithmId] === undefined) {\n continue;\n }\n checksumAlgorithms.push({\n algorithmId: () => algorithmId,\n checksumConstructor: () => runtimeConfig[algorithmId],\n });\n }\n return {\n _checksumAlgorithms: checksumAlgorithms,\n addChecksumAlgorithm(algo) {\n this._checksumAlgorithms.push(algo);\n },\n checksumAlgorithms() {\n return this._checksumAlgorithms;\n },\n };\n};\nexports.getChecksumConfiguration = getChecksumConfiguration;\nconst resolveChecksumRuntimeConfig = (clientConfig) => {\n const runtimeConfig = {};\n clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor();\n });\n return runtimeConfig;\n};\nexports.resolveChecksumRuntimeConfig = resolveChecksumRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveDefaultRuntimeConfig = exports.getDefaultClientConfiguration = exports.getDefaultExtensionConfiguration = void 0;\nconst checksum_1 = require(\"./checksum\");\nconst retry_1 = require(\"./retry\");\nconst getDefaultExtensionConfiguration = (runtimeConfig) => {\n return {\n ...(0, checksum_1.getChecksumConfiguration)(runtimeConfig),\n ...(0, retry_1.getRetryConfiguration)(runtimeConfig),\n };\n};\nexports.getDefaultExtensionConfiguration = getDefaultExtensionConfiguration;\nexports.getDefaultClientConfiguration = exports.getDefaultExtensionConfiguration;\nconst resolveDefaultRuntimeConfig = (config) => {\n return {\n ...(0, checksum_1.resolveChecksumRuntimeConfig)(config),\n ...(0, retry_1.resolveRetryRuntimeConfig)(config),\n };\n};\nexports.resolveDefaultRuntimeConfig = resolveDefaultRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./defaultExtensionConfiguration\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRetryRuntimeConfig = exports.getRetryConfiguration = void 0;\nconst getRetryConfiguration = (runtimeConfig) => {\n let _retryStrategy = runtimeConfig.retryStrategy;\n return {\n setRetryStrategy(retryStrategy) {\n _retryStrategy = retryStrategy;\n },\n retryStrategy() {\n return _retryStrategy;\n },\n };\n};\nexports.getRetryConfiguration = getRetryConfiguration;\nconst resolveRetryRuntimeConfig = (retryStrategyConfiguration) => {\n const runtimeConfig = {};\n runtimeConfig.retryStrategy = retryStrategyConfiguration.retryStrategy();\n return runtimeConfig;\n};\nexports.resolveRetryRuntimeConfig = resolveRetryRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getArrayIfSingleItem = void 0;\nconst getArrayIfSingleItem = (mayBeArray) => Array.isArray(mayBeArray) ? mayBeArray : [mayBeArray];\nexports.getArrayIfSingleItem = getArrayIfSingleItem;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getValueFromTextNode = void 0;\nconst getValueFromTextNode = (obj) => {\n const textNodeName = \"#text\";\n for (const key in obj) {\n if (obj.hasOwnProperty(key) && obj[key][textNodeName] !== undefined) {\n obj[key] = obj[key][textNodeName];\n }\n else if (typeof obj[key] === \"object\" && obj[key] !== null) {\n obj[key] = (0, exports.getValueFromTextNode)(obj[key]);\n }\n }\n return obj;\n};\nexports.getValueFromTextNode = getValueFromTextNode;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./NoOpLogger\"), exports);\ntslib_1.__exportStar(require(\"./client\"), exports);\ntslib_1.__exportStar(require(\"./collect-stream-body\"), exports);\ntslib_1.__exportStar(require(\"./command\"), exports);\ntslib_1.__exportStar(require(\"./constants\"), exports);\ntslib_1.__exportStar(require(\"./create-aggregated-client\"), exports);\ntslib_1.__exportStar(require(\"./date-utils\"), exports);\ntslib_1.__exportStar(require(\"./default-error-handler\"), exports);\ntslib_1.__exportStar(require(\"./defaults-mode\"), exports);\ntslib_1.__exportStar(require(\"./emitWarningIfUnsupportedVersion\"), exports);\ntslib_1.__exportStar(require(\"./extensions\"), exports);\ntslib_1.__exportStar(require(\"./exceptions\"), exports);\ntslib_1.__exportStar(require(\"./extended-encode-uri-component\"), exports);\ntslib_1.__exportStar(require(\"./get-array-if-single-item\"), exports);\ntslib_1.__exportStar(require(\"./get-value-from-text-node\"), exports);\ntslib_1.__exportStar(require(\"./lazy-json\"), exports);\ntslib_1.__exportStar(require(\"./object-mapping\"), exports);\ntslib_1.__exportStar(require(\"./parse-utils\"), exports);\ntslib_1.__exportStar(require(\"./resolve-path\"), exports);\ntslib_1.__exportStar(require(\"./ser-utils\"), exports);\ntslib_1.__exportStar(require(\"./serde-json\"), exports);\ntslib_1.__exportStar(require(\"./split-every\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LazyJsonString = exports.StringWrapper = void 0;\nconst StringWrapper = function () {\n const Class = Object.getPrototypeOf(this).constructor;\n const Constructor = Function.bind.apply(String, [null, ...arguments]);\n const instance = new Constructor();\n Object.setPrototypeOf(instance, Class.prototype);\n return instance;\n};\nexports.StringWrapper = StringWrapper;\nexports.StringWrapper.prototype = Object.create(String.prototype, {\n constructor: {\n value: exports.StringWrapper,\n enumerable: false,\n writable: true,\n configurable: true,\n },\n});\nObject.setPrototypeOf(exports.StringWrapper, String);\nclass LazyJsonString extends exports.StringWrapper {\n deserializeJSON() {\n return JSON.parse(super.toString());\n }\n toJSON() {\n return super.toString();\n }\n static fromObject(object) {\n if (object instanceof LazyJsonString) {\n return object;\n }\n else if (object instanceof String || typeof object === \"string\") {\n return new LazyJsonString(object);\n }\n return new LazyJsonString(JSON.stringify(object));\n }\n}\nexports.LazyJsonString = LazyJsonString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.take = exports.convertMap = exports.map = void 0;\nfunction map(arg0, arg1, arg2) {\n let target;\n let filter;\n let instructions;\n if (typeof arg1 === \"undefined\" && typeof arg2 === \"undefined\") {\n target = {};\n instructions = arg0;\n }\n else {\n target = arg0;\n if (typeof arg1 === \"function\") {\n filter = arg1;\n instructions = arg2;\n return mapWithFilter(target, filter, instructions);\n }\n else {\n instructions = arg1;\n }\n }\n for (const key of Object.keys(instructions)) {\n if (!Array.isArray(instructions[key])) {\n target[key] = instructions[key];\n continue;\n }\n applyInstruction(target, null, instructions, key);\n }\n return target;\n}\nexports.map = map;\nconst convertMap = (target) => {\n const output = {};\n for (const [k, v] of Object.entries(target || {})) {\n output[k] = [, v];\n }\n return output;\n};\nexports.convertMap = convertMap;\nconst take = (source, instructions) => {\n const out = {};\n for (const key in instructions) {\n applyInstruction(out, source, instructions, key);\n }\n return out;\n};\nexports.take = take;\nconst mapWithFilter = (target, filter, instructions) => {\n return map(target, Object.entries(instructions).reduce((_instructions, [key, value]) => {\n if (Array.isArray(value)) {\n _instructions[key] = value;\n }\n else {\n if (typeof value === \"function\") {\n _instructions[key] = [filter, value()];\n }\n else {\n _instructions[key] = [filter, value];\n }\n }\n return _instructions;\n }, {}));\n};\nconst applyInstruction = (target, source, instructions, targetKey) => {\n if (source !== null) {\n let instruction = instructions[targetKey];\n if (typeof instruction === \"function\") {\n instruction = [, instruction];\n }\n const [filter = nonNullish, valueFn = pass, sourceKey = targetKey] = instruction;\n if ((typeof filter === \"function\" && filter(source[sourceKey])) || (typeof filter !== \"function\" && !!filter)) {\n target[targetKey] = valueFn(source[sourceKey]);\n }\n return;\n }\n let [filter, value] = instructions[targetKey];\n if (typeof value === \"function\") {\n let _value;\n const defaultFilterPassed = filter === undefined && (_value = value()) != null;\n const customFilterPassed = (typeof filter === \"function\" && !!filter(void 0)) || (typeof filter !== \"function\" && !!filter);\n if (defaultFilterPassed) {\n target[targetKey] = _value;\n }\n else if (customFilterPassed) {\n target[targetKey] = value();\n }\n }\n else {\n const defaultFilterPassed = filter === undefined && value != null;\n const customFilterPassed = (typeof filter === \"function\" && !!filter(value)) || (typeof filter !== \"function\" && !!filter);\n if (defaultFilterPassed || customFilterPassed) {\n target[targetKey] = value;\n }\n }\n};\nconst nonNullish = (_) => _ != null;\nconst pass = (_) => _;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.logger = exports.strictParseByte = exports.strictParseShort = exports.strictParseInt32 = exports.strictParseInt = exports.strictParseLong = exports.limitedParseFloat32 = exports.limitedParseFloat = exports.handleFloat = exports.limitedParseDouble = exports.strictParseFloat32 = exports.strictParseFloat = exports.strictParseDouble = exports.expectUnion = exports.expectString = exports.expectObject = exports.expectNonNull = exports.expectByte = exports.expectShort = exports.expectInt32 = exports.expectInt = exports.expectLong = exports.expectFloat32 = exports.expectNumber = exports.expectBoolean = exports.parseBoolean = void 0;\nconst parseBoolean = (value) => {\n switch (value) {\n case \"true\":\n return true;\n case \"false\":\n return false;\n default:\n throw new Error(`Unable to parse boolean value \"${value}\"`);\n }\n};\nexports.parseBoolean = parseBoolean;\nconst expectBoolean = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === \"number\") {\n if (value === 0 || value === 1) {\n exports.logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`));\n }\n if (value === 0) {\n return false;\n }\n if (value === 1) {\n return true;\n }\n }\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (lower === \"false\" || lower === \"true\") {\n exports.logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`));\n }\n if (lower === \"false\") {\n return false;\n }\n if (lower === \"true\") {\n return true;\n }\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n throw new TypeError(`Expected boolean, got ${typeof value}: ${value}`);\n};\nexports.expectBoolean = expectBoolean;\nconst expectNumber = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n const parsed = parseFloat(value);\n if (!Number.isNaN(parsed)) {\n if (String(parsed) !== String(value)) {\n exports.logger.warn(stackTraceWarning(`Expected number but observed string: ${value}`));\n }\n return parsed;\n }\n }\n if (typeof value === \"number\") {\n return value;\n }\n throw new TypeError(`Expected number, got ${typeof value}: ${value}`);\n};\nexports.expectNumber = expectNumber;\nconst MAX_FLOAT = Math.ceil(2 ** 127 * (2 - 2 ** -23));\nconst expectFloat32 = (value) => {\n const expected = (0, exports.expectNumber)(value);\n if (expected !== undefined && !Number.isNaN(expected) && expected !== Infinity && expected !== -Infinity) {\n if (Math.abs(expected) > MAX_FLOAT) {\n throw new TypeError(`Expected 32-bit float, got ${value}`);\n }\n }\n return expected;\n};\nexports.expectFloat32 = expectFloat32;\nconst expectLong = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (Number.isInteger(value) && !Number.isNaN(value)) {\n return value;\n }\n throw new TypeError(`Expected integer, got ${typeof value}: ${value}`);\n};\nexports.expectLong = expectLong;\nexports.expectInt = exports.expectLong;\nconst expectInt32 = (value) => expectSizedInt(value, 32);\nexports.expectInt32 = expectInt32;\nconst expectShort = (value) => expectSizedInt(value, 16);\nexports.expectShort = expectShort;\nconst expectByte = (value) => expectSizedInt(value, 8);\nexports.expectByte = expectByte;\nconst expectSizedInt = (value, size) => {\n const expected = (0, exports.expectLong)(value);\n if (expected !== undefined && castInt(expected, size) !== expected) {\n throw new TypeError(`Expected ${size}-bit integer, got ${value}`);\n }\n return expected;\n};\nconst castInt = (value, size) => {\n switch (size) {\n case 32:\n return Int32Array.of(value)[0];\n case 16:\n return Int16Array.of(value)[0];\n case 8:\n return Int8Array.of(value)[0];\n }\n};\nconst expectNonNull = (value, location) => {\n if (value === null || value === undefined) {\n if (location) {\n throw new TypeError(`Expected a non-null value for ${location}`);\n }\n throw new TypeError(\"Expected a non-null value\");\n }\n return value;\n};\nexports.expectNonNull = expectNonNull;\nconst expectObject = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === \"object\" && !Array.isArray(value)) {\n return value;\n }\n const receivedType = Array.isArray(value) ? \"array\" : typeof value;\n throw new TypeError(`Expected object, got ${receivedType}: ${value}`);\n};\nexports.expectObject = expectObject;\nconst expectString = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if ([\"boolean\", \"number\", \"bigint\"].includes(typeof value)) {\n exports.logger.warn(stackTraceWarning(`Expected string, got ${typeof value}: ${value}`));\n return String(value);\n }\n throw new TypeError(`Expected string, got ${typeof value}: ${value}`);\n};\nexports.expectString = expectString;\nconst expectUnion = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n const asObject = (0, exports.expectObject)(value);\n const setKeys = Object.entries(asObject)\n .filter(([, v]) => v != null)\n .map(([k]) => k);\n if (setKeys.length === 0) {\n throw new TypeError(`Unions must have exactly one non-null member. None were found.`);\n }\n if (setKeys.length > 1) {\n throw new TypeError(`Unions must have exactly one non-null member. Keys ${setKeys} were not null.`);\n }\n return asObject;\n};\nexports.expectUnion = expectUnion;\nconst strictParseDouble = (value) => {\n if (typeof value == \"string\") {\n return (0, exports.expectNumber)(parseNumber(value));\n }\n return (0, exports.expectNumber)(value);\n};\nexports.strictParseDouble = strictParseDouble;\nexports.strictParseFloat = exports.strictParseDouble;\nconst strictParseFloat32 = (value) => {\n if (typeof value == \"string\") {\n return (0, exports.expectFloat32)(parseNumber(value));\n }\n return (0, exports.expectFloat32)(value);\n};\nexports.strictParseFloat32 = strictParseFloat32;\nconst NUMBER_REGEX = /(-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|(-?Infinity)|(NaN)/g;\nconst parseNumber = (value) => {\n const matches = value.match(NUMBER_REGEX);\n if (matches === null || matches[0].length !== value.length) {\n throw new TypeError(`Expected real number, got implicit NaN`);\n }\n return parseFloat(value);\n};\nconst limitedParseDouble = (value) => {\n if (typeof value == \"string\") {\n return parseFloatString(value);\n }\n return (0, exports.expectNumber)(value);\n};\nexports.limitedParseDouble = limitedParseDouble;\nexports.handleFloat = exports.limitedParseDouble;\nexports.limitedParseFloat = exports.limitedParseDouble;\nconst limitedParseFloat32 = (value) => {\n if (typeof value == \"string\") {\n return parseFloatString(value);\n }\n return (0, exports.expectFloat32)(value);\n};\nexports.limitedParseFloat32 = limitedParseFloat32;\nconst parseFloatString = (value) => {\n switch (value) {\n case \"NaN\":\n return NaN;\n case \"Infinity\":\n return Infinity;\n case \"-Infinity\":\n return -Infinity;\n default:\n throw new Error(`Unable to parse float value: ${value}`);\n }\n};\nconst strictParseLong = (value) => {\n if (typeof value === \"string\") {\n return (0, exports.expectLong)(parseNumber(value));\n }\n return (0, exports.expectLong)(value);\n};\nexports.strictParseLong = strictParseLong;\nexports.strictParseInt = exports.strictParseLong;\nconst strictParseInt32 = (value) => {\n if (typeof value === \"string\") {\n return (0, exports.expectInt32)(parseNumber(value));\n }\n return (0, exports.expectInt32)(value);\n};\nexports.strictParseInt32 = strictParseInt32;\nconst strictParseShort = (value) => {\n if (typeof value === \"string\") {\n return (0, exports.expectShort)(parseNumber(value));\n }\n return (0, exports.expectShort)(value);\n};\nexports.strictParseShort = strictParseShort;\nconst strictParseByte = (value) => {\n if (typeof value === \"string\") {\n return (0, exports.expectByte)(parseNumber(value));\n }\n return (0, exports.expectByte)(value);\n};\nexports.strictParseByte = strictParseByte;\nconst stackTraceWarning = (message) => {\n return String(new TypeError(message).stack || message)\n .split(\"\\n\")\n .slice(0, 5)\n .filter((s) => !s.includes(\"stackTraceWarning\"))\n .join(\"\\n\");\n};\nexports.logger = {\n warn: console.warn,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolvedPath = void 0;\nconst extended_encode_uri_component_1 = require(\"./extended-encode-uri-component\");\nconst resolvedPath = (resolvedPath, input, memberName, labelValueProvider, uriLabel, isGreedyLabel) => {\n if (input != null && input[memberName] !== undefined) {\n const labelValue = labelValueProvider();\n if (labelValue.length <= 0) {\n throw new Error(\"Empty value provided for input HTTP label: \" + memberName + \".\");\n }\n resolvedPath = resolvedPath.replace(uriLabel, isGreedyLabel\n ? labelValue\n .split(\"/\")\n .map((segment) => (0, extended_encode_uri_component_1.extendedEncodeURIComponent)(segment))\n .join(\"/\")\n : (0, extended_encode_uri_component_1.extendedEncodeURIComponent)(labelValue));\n }\n else {\n throw new Error(\"No value provided for input HTTP label: \" + memberName + \".\");\n }\n return resolvedPath;\n};\nexports.resolvedPath = resolvedPath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serializeFloat = void 0;\nconst serializeFloat = (value) => {\n if (value !== value) {\n return \"NaN\";\n }\n switch (value) {\n case Infinity:\n return \"Infinity\";\n case -Infinity:\n return \"-Infinity\";\n default:\n return value;\n }\n};\nexports.serializeFloat = serializeFloat;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports._json = void 0;\nconst _json = (obj) => {\n if (obj == null) {\n return {};\n }\n if (Array.isArray(obj)) {\n return obj.filter((_) => _ != null);\n }\n if (typeof obj === \"object\") {\n const target = {};\n for (const key of Object.keys(obj)) {\n if (obj[key] == null) {\n continue;\n }\n target[key] = (0, exports._json)(obj[key]);\n }\n return target;\n }\n return obj;\n};\nexports._json = _json;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.splitEvery = void 0;\nfunction splitEvery(value, delimiter, numDelimiters) {\n if (numDelimiters <= 0 || !Number.isInteger(numDelimiters)) {\n throw new Error(\"Invalid number of delimiters (\" + numDelimiters + \") for splitEvery.\");\n }\n const segments = value.split(delimiter);\n if (numDelimiters === 1) {\n return segments;\n }\n const compoundSegments = [];\n let currentSegment = \"\";\n for (let i = 0; i < segments.length; i++) {\n if (currentSegment === \"\") {\n currentSegment = segments[i];\n }\n else {\n currentSegment += delimiter + segments[i];\n }\n if ((i + 1) % numDelimiters === 0) {\n compoundSegments.push(currentSegment);\n currentSegment = \"\";\n }\n }\n if (currentSegment !== \"\") {\n compoundSegments.push(currentSegment);\n }\n return compoundSegments;\n}\nexports.splitEvery = splitEvery;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpAuthLocation = void 0;\nvar HttpAuthLocation;\n(function (HttpAuthLocation) {\n HttpAuthLocation[\"HEADER\"] = \"header\";\n HttpAuthLocation[\"QUERY\"] = \"query\";\n})(HttpAuthLocation = exports.HttpAuthLocation || (exports.HttpAuthLocation = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./config\"), exports);\ntslib_1.__exportStar(require(\"./manager\"), exports);\ntslib_1.__exportStar(require(\"./pool\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EndpointURLScheme = void 0;\nvar EndpointURLScheme;\n(function (EndpointURLScheme) {\n EndpointURLScheme[\"HTTP\"] = \"http\";\n EndpointURLScheme[\"HTTPS\"] = \"https\";\n})(EndpointURLScheme = exports.EndpointURLScheme || (exports.EndpointURLScheme = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./EndpointRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./ErrorRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./RuleSetObject\"), exports);\ntslib_1.__exportStar(require(\"./shared\"), exports);\ntslib_1.__exportStar(require(\"./TreeRuleObject\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveChecksumRuntimeConfig = exports.getChecksumConfiguration = exports.AlgorithmId = void 0;\nvar AlgorithmId;\n(function (AlgorithmId) {\n AlgorithmId[\"MD5\"] = \"md5\";\n AlgorithmId[\"CRC32\"] = \"crc32\";\n AlgorithmId[\"CRC32C\"] = \"crc32c\";\n AlgorithmId[\"SHA1\"] = \"sha1\";\n AlgorithmId[\"SHA256\"] = \"sha256\";\n})(AlgorithmId = exports.AlgorithmId || (exports.AlgorithmId = {}));\nconst getChecksumConfiguration = (runtimeConfig) => {\n const checksumAlgorithms = [];\n if (runtimeConfig.sha256 !== undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.SHA256,\n checksumConstructor: () => runtimeConfig.sha256,\n });\n }\n if (runtimeConfig.md5 != undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.MD5,\n checksumConstructor: () => runtimeConfig.md5,\n });\n }\n return {\n _checksumAlgorithms: checksumAlgorithms,\n addChecksumAlgorithm(algo) {\n this._checksumAlgorithms.push(algo);\n },\n checksumAlgorithms() {\n return this._checksumAlgorithms;\n },\n };\n};\nexports.getChecksumConfiguration = getChecksumConfiguration;\nconst resolveChecksumRuntimeConfig = (clientConfig) => {\n const runtimeConfig = {};\n clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor();\n });\n return runtimeConfig;\n};\nexports.resolveChecksumRuntimeConfig = resolveChecksumRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveDefaultRuntimeConfig = exports.getDefaultClientConfiguration = void 0;\nconst checksum_1 = require(\"./checksum\");\nconst getDefaultClientConfiguration = (runtimeConfig) => {\n return {\n ...(0, checksum_1.getChecksumConfiguration)(runtimeConfig),\n };\n};\nexports.getDefaultClientConfiguration = getDefaultClientConfiguration;\nconst resolveDefaultRuntimeConfig = (config) => {\n return {\n ...(0, checksum_1.resolveChecksumRuntimeConfig)(config),\n };\n};\nexports.resolveDefaultRuntimeConfig = resolveDefaultRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AlgorithmId = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./defaultClientConfiguration\"), exports);\ntslib_1.__exportStar(require(\"./defaultExtensionConfiguration\"), exports);\nvar checksum_1 = require(\"./checksum\");\nObject.defineProperty(exports, \"AlgorithmId\", { enumerable: true, get: function () { return checksum_1.AlgorithmId; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FieldPosition = void 0;\nvar FieldPosition;\n(function (FieldPosition) {\n FieldPosition[FieldPosition[\"HEADER\"] = 0] = \"HEADER\";\n FieldPosition[FieldPosition[\"TRAILER\"] = 1] = \"TRAILER\";\n})(FieldPosition = exports.FieldPosition || (exports.FieldPosition = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./awsCredentialIdentity\"), exports);\ntslib_1.__exportStar(require(\"./identity\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./abort\"), exports);\ntslib_1.__exportStar(require(\"./auth\"), exports);\ntslib_1.__exportStar(require(\"./blob/blob-payload-input-types\"), exports);\ntslib_1.__exportStar(require(\"./checksum\"), exports);\ntslib_1.__exportStar(require(\"./client\"), exports);\ntslib_1.__exportStar(require(\"./command\"), exports);\ntslib_1.__exportStar(require(\"./connection\"), exports);\ntslib_1.__exportStar(require(\"./crypto\"), exports);\ntslib_1.__exportStar(require(\"./encode\"), exports);\ntslib_1.__exportStar(require(\"./endpoint\"), exports);\ntslib_1.__exportStar(require(\"./endpoints\"), exports);\ntslib_1.__exportStar(require(\"./eventStream\"), exports);\ntslib_1.__exportStar(require(\"./extensions\"), exports);\ntslib_1.__exportStar(require(\"./http\"), exports);\ntslib_1.__exportStar(require(\"./identity\"), exports);\ntslib_1.__exportStar(require(\"./logger\"), exports);\ntslib_1.__exportStar(require(\"./middleware\"), exports);\ntslib_1.__exportStar(require(\"./pagination\"), exports);\ntslib_1.__exportStar(require(\"./profile\"), exports);\ntslib_1.__exportStar(require(\"./response\"), exports);\ntslib_1.__exportStar(require(\"./retry\"), exports);\ntslib_1.__exportStar(require(\"./serde\"), exports);\ntslib_1.__exportStar(require(\"./shapes\"), exports);\ntslib_1.__exportStar(require(\"./signature\"), exports);\ntslib_1.__exportStar(require(\"./stream\"), exports);\ntslib_1.__exportStar(require(\"./streaming-payload/streaming-blob-common-types\"), exports);\ntslib_1.__exportStar(require(\"./streaming-payload/streaming-blob-payload-input-types\"), exports);\ntslib_1.__exportStar(require(\"./streaming-payload/streaming-blob-payload-output-types\"), exports);\ntslib_1.__exportStar(require(\"./transfer\"), exports);\ntslib_1.__exportStar(require(\"./transform/client-payload-blob-type-narrow\"), exports);\ntslib_1.__exportStar(require(\"./transform/type-transform\"), exports);\ntslib_1.__exportStar(require(\"./uri\"), exports);\ntslib_1.__exportStar(require(\"./util\"), exports);\ntslib_1.__exportStar(require(\"./waiter\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SMITHY_CONTEXT_KEY = void 0;\nexports.SMITHY_CONTEXT_KEY = \"__smithy_context\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IniSectionType = void 0;\nvar IniSectionType;\n(function (IniSectionType) {\n IniSectionType[\"PROFILE\"] = \"profile\";\n IniSectionType[\"SSO_SESSION\"] = \"sso-session\";\n IniSectionType[\"SERVICES\"] = \"services\";\n})(IniSectionType = exports.IniSectionType || (exports.IniSectionType = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RequestHandlerProtocol = void 0;\nvar RequestHandlerProtocol;\n(function (RequestHandlerProtocol) {\n RequestHandlerProtocol[\"HTTP_0_9\"] = \"http/0.9\";\n RequestHandlerProtocol[\"HTTP_1_0\"] = \"http/1.0\";\n RequestHandlerProtocol[\"TDS_8_0\"] = \"tds/8.0\";\n})(RequestHandlerProtocol = exports.RequestHandlerProtocol || (exports.RequestHandlerProtocol = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseUrl = void 0;\nconst querystring_parser_1 = require(\"@smithy/querystring-parser\");\nconst parseUrl = (url) => {\n if (typeof url === \"string\") {\n return (0, exports.parseUrl)(new URL(url));\n }\n const { hostname, pathname, port, protocol, search } = url;\n let query;\n if (search) {\n query = (0, querystring_parser_1.parseQueryString)(search);\n }\n return {\n hostname,\n port: port ? parseInt(port) : undefined,\n protocol,\n path: pathname,\n query,\n };\n};\nexports.parseUrl = parseUrl;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromBase64 = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst BASE64_REGEX = /^[A-Za-z0-9+/]*={0,2}$/;\nconst fromBase64 = (input) => {\n if ((input.length * 3) % 4 !== 0) {\n throw new TypeError(`Incorrect padding on base64 string.`);\n }\n if (!BASE64_REGEX.exec(input)) {\n throw new TypeError(`Invalid base64 string.`);\n }\n const buffer = (0, util_buffer_from_1.fromString)(input, \"base64\");\n return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n};\nexports.fromBase64 = fromBase64;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromBase64\"), exports);\ntslib_1.__exportStar(require(\"./toBase64\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toBase64 = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst toBase64 = (input) => (0, util_buffer_from_1.fromArrayBuffer)(input.buffer, input.byteOffset, input.byteLength).toString(\"base64\");\nexports.toBase64 = toBase64;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateBodyLength = void 0;\nconst fs_1 = require(\"fs\");\nconst calculateBodyLength = (body) => {\n if (!body) {\n return 0;\n }\n if (typeof body === \"string\") {\n return Buffer.from(body).length;\n }\n else if (typeof body.byteLength === \"number\") {\n return body.byteLength;\n }\n else if (typeof body.size === \"number\") {\n return body.size;\n }\n else if (typeof body.start === \"number\" && typeof body.end === \"number\") {\n return body.end + 1 - body.start;\n }\n else if (typeof body.path === \"string\" || Buffer.isBuffer(body.path)) {\n return (0, fs_1.lstatSync)(body.path).size;\n }\n else if (typeof body.fd === \"number\") {\n return (0, fs_1.fstatSync)(body.fd).size;\n }\n throw new Error(`Body Length computation failed for ${body}`);\n};\nexports.calculateBodyLength = calculateBodyLength;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./calculateBodyLength\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromString = exports.fromArrayBuffer = void 0;\nconst is_array_buffer_1 = require(\"@smithy/is-array-buffer\");\nconst buffer_1 = require(\"buffer\");\nconst fromArrayBuffer = (input, offset = 0, length = input.byteLength - offset) => {\n if (!(0, is_array_buffer_1.isArrayBuffer)(input)) {\n throw new TypeError(`The \"input\" argument must be ArrayBuffer. Received type ${typeof input} (${input})`);\n }\n return buffer_1.Buffer.from(input, offset, length);\n};\nexports.fromArrayBuffer = fromArrayBuffer;\nconst fromString = (input, encoding) => {\n if (typeof input !== \"string\") {\n throw new TypeError(`The \"input\" argument must be of type string. Received type ${typeof input} (${input})`);\n }\n return encoding ? buffer_1.Buffer.from(input, encoding) : buffer_1.Buffer.from(input);\n};\nexports.fromString = fromString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.booleanSelector = exports.SelectorType = void 0;\nvar SelectorType;\n(function (SelectorType) {\n SelectorType[\"ENV\"] = \"env\";\n SelectorType[\"CONFIG\"] = \"shared config entry\";\n})(SelectorType = exports.SelectorType || (exports.SelectorType = {}));\nconst booleanSelector = (obj, key, type) => {\n if (!(key in obj))\n return undefined;\n if (obj[key] === \"true\")\n return true;\n if (obj[key] === \"false\")\n return false;\n throw new Error(`Cannot load ${type} \"${key}\". Expected \"true\" or \"false\", got ${obj[key]}.`);\n};\nexports.booleanSelector = booleanSelector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./booleanSelector\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IMDS_REGION_PATH = exports.DEFAULTS_MODE_OPTIONS = exports.ENV_IMDS_DISABLED = exports.AWS_DEFAULT_REGION_ENV = exports.AWS_REGION_ENV = exports.AWS_EXECUTION_ENV = void 0;\nexports.AWS_EXECUTION_ENV = \"AWS_EXECUTION_ENV\";\nexports.AWS_REGION_ENV = \"AWS_REGION\";\nexports.AWS_DEFAULT_REGION_ENV = \"AWS_DEFAULT_REGION\";\nexports.ENV_IMDS_DISABLED = \"AWS_EC2_METADATA_DISABLED\";\nexports.DEFAULTS_MODE_OPTIONS = [\"in-region\", \"cross-region\", \"mobile\", \"standard\", \"legacy\"];\nexports.IMDS_REGION_PATH = \"/latest/meta-data/placement/region\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_DEFAULTS_MODE_CONFIG_OPTIONS = void 0;\nconst AWS_DEFAULTS_MODE_ENV = \"AWS_DEFAULTS_MODE\";\nconst AWS_DEFAULTS_MODE_CONFIG = \"defaults_mode\";\nexports.NODE_DEFAULTS_MODE_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => {\n return env[AWS_DEFAULTS_MODE_ENV];\n },\n configFileSelector: (profile) => {\n return profile[AWS_DEFAULTS_MODE_CONFIG];\n },\n default: \"legacy\",\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./resolveDefaultsModeConfig\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveDefaultsModeConfig = void 0;\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst credential_provider_imds_1 = require(\"@smithy/credential-provider-imds\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst constants_1 = require(\"./constants\");\nconst defaultsModeConfig_1 = require(\"./defaultsModeConfig\");\nconst resolveDefaultsModeConfig = ({ region = (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS), defaultsMode = (0, node_config_provider_1.loadConfig)(defaultsModeConfig_1.NODE_DEFAULTS_MODE_CONFIG_OPTIONS), } = {}) => (0, property_provider_1.memoize)(async () => {\n const mode = typeof defaultsMode === \"function\" ? await defaultsMode() : defaultsMode;\n switch (mode === null || mode === void 0 ? void 0 : mode.toLowerCase()) {\n case \"auto\":\n return resolveNodeDefaultsModeAuto(region);\n case \"in-region\":\n case \"cross-region\":\n case \"mobile\":\n case \"standard\":\n case \"legacy\":\n return Promise.resolve(mode === null || mode === void 0 ? void 0 : mode.toLocaleLowerCase());\n case undefined:\n return Promise.resolve(\"legacy\");\n default:\n throw new Error(`Invalid parameter for \"defaultsMode\", expect ${constants_1.DEFAULTS_MODE_OPTIONS.join(\", \")}, got ${mode}`);\n }\n});\nexports.resolveDefaultsModeConfig = resolveDefaultsModeConfig;\nconst resolveNodeDefaultsModeAuto = async (clientRegion) => {\n if (clientRegion) {\n const resolvedRegion = typeof clientRegion === \"function\" ? await clientRegion() : clientRegion;\n const inferredRegion = await inferPhysicalRegion();\n if (!inferredRegion) {\n return \"standard\";\n }\n if (resolvedRegion === inferredRegion) {\n return \"in-region\";\n }\n else {\n return \"cross-region\";\n }\n }\n return \"standard\";\n};\nconst inferPhysicalRegion = async () => {\n var _a;\n if (process.env[constants_1.AWS_EXECUTION_ENV] && (process.env[constants_1.AWS_REGION_ENV] || process.env[constants_1.AWS_DEFAULT_REGION_ENV])) {\n return (_a = process.env[constants_1.AWS_REGION_ENV]) !== null && _a !== void 0 ? _a : process.env[constants_1.AWS_DEFAULT_REGION_ENV];\n }\n if (!process.env[constants_1.ENV_IMDS_DISABLED]) {\n try {\n const endpoint = await (0, credential_provider_imds_1.getInstanceMetadataEndpoint)();\n return (await (0, credential_provider_imds_1.httpRequest)({ ...endpoint, path: constants_1.IMDS_REGION_PATH })).toString();\n }\n catch (e) {\n }\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toHex = exports.fromHex = void 0;\nconst SHORT_TO_HEX = {};\nconst HEX_TO_SHORT = {};\nfor (let i = 0; i < 256; i++) {\n let encodedByte = i.toString(16).toLowerCase();\n if (encodedByte.length === 1) {\n encodedByte = `0${encodedByte}`;\n }\n SHORT_TO_HEX[i] = encodedByte;\n HEX_TO_SHORT[encodedByte] = i;\n}\nfunction fromHex(encoded) {\n if (encoded.length % 2 !== 0) {\n throw new Error(\"Hex encoded strings must have an even number length\");\n }\n const out = new Uint8Array(encoded.length / 2);\n for (let i = 0; i < encoded.length; i += 2) {\n const encodedByte = encoded.slice(i, i + 2).toLowerCase();\n if (encodedByte in HEX_TO_SHORT) {\n out[i / 2] = HEX_TO_SHORT[encodedByte];\n }\n else {\n throw new Error(`Cannot decode unrecognized sequence ${encodedByte} as hexadecimal`);\n }\n }\n return out;\n}\nexports.fromHex = fromHex;\nfunction toHex(bytes) {\n let out = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n out += SHORT_TO_HEX[bytes[i]];\n }\n return out;\n}\nexports.toHex = toHex;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSmithyContext = void 0;\nconst types_1 = require(\"@smithy/types\");\nconst getSmithyContext = (context) => context[types_1.SMITHY_CONTEXT_KEY] || (context[types_1.SMITHY_CONTEXT_KEY] = {});\nexports.getSmithyContext = getSmithyContext;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./getSmithyContext\"), exports);\ntslib_1.__exportStar(require(\"./normalizeProvider\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.normalizeProvider = void 0;\nconst normalizeProvider = (input) => {\n if (typeof input === \"function\")\n return input;\n const promisified = Promise.resolve(input);\n return () => promisified;\n};\nexports.normalizeProvider = normalizeProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AdaptiveRetryStrategy = void 0;\nconst config_1 = require(\"./config\");\nconst DefaultRateLimiter_1 = require(\"./DefaultRateLimiter\");\nconst StandardRetryStrategy_1 = require(\"./StandardRetryStrategy\");\nclass AdaptiveRetryStrategy {\n constructor(maxAttemptsProvider, options) {\n this.maxAttemptsProvider = maxAttemptsProvider;\n this.mode = config_1.RETRY_MODES.ADAPTIVE;\n const { rateLimiter } = options !== null && options !== void 0 ? options : {};\n this.rateLimiter = rateLimiter !== null && rateLimiter !== void 0 ? rateLimiter : new DefaultRateLimiter_1.DefaultRateLimiter();\n this.standardRetryStrategy = new StandardRetryStrategy_1.StandardRetryStrategy(maxAttemptsProvider);\n }\n async acquireInitialRetryToken(retryTokenScope) {\n await this.rateLimiter.getSendToken();\n return this.standardRetryStrategy.acquireInitialRetryToken(retryTokenScope);\n }\n async refreshRetryTokenForRetry(tokenToRenew, errorInfo) {\n this.rateLimiter.updateClientSendingRate(errorInfo);\n return this.standardRetryStrategy.refreshRetryTokenForRetry(tokenToRenew, errorInfo);\n }\n recordSuccess(token) {\n this.rateLimiter.updateClientSendingRate({});\n this.standardRetryStrategy.recordSuccess(token);\n }\n}\nexports.AdaptiveRetryStrategy = AdaptiveRetryStrategy;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConfiguredRetryStrategy = void 0;\nconst constants_1 = require(\"./constants\");\nconst StandardRetryStrategy_1 = require(\"./StandardRetryStrategy\");\nclass ConfiguredRetryStrategy extends StandardRetryStrategy_1.StandardRetryStrategy {\n constructor(maxAttempts, computeNextBackoffDelay = constants_1.DEFAULT_RETRY_DELAY_BASE) {\n super(typeof maxAttempts === \"function\" ? maxAttempts : async () => maxAttempts);\n if (typeof computeNextBackoffDelay === \"number\") {\n this.computeNextBackoffDelay = () => computeNextBackoffDelay;\n }\n else {\n this.computeNextBackoffDelay = computeNextBackoffDelay;\n }\n }\n async refreshRetryTokenForRetry(tokenToRenew, errorInfo) {\n const token = await super.refreshRetryTokenForRetry(tokenToRenew, errorInfo);\n token.getRetryDelay = () => this.computeNextBackoffDelay(token.getRetryCount());\n return token;\n }\n}\nexports.ConfiguredRetryStrategy = ConfiguredRetryStrategy;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DefaultRateLimiter = void 0;\nconst service_error_classification_1 = require(\"@smithy/service-error-classification\");\nclass DefaultRateLimiter {\n constructor(options) {\n var _a, _b, _c, _d, _e;\n this.currentCapacity = 0;\n this.enabled = false;\n this.lastMaxRate = 0;\n this.measuredTxRate = 0;\n this.requestCount = 0;\n this.lastTimestamp = 0;\n this.timeWindow = 0;\n this.beta = (_a = options === null || options === void 0 ? void 0 : options.beta) !== null && _a !== void 0 ? _a : 0.7;\n this.minCapacity = (_b = options === null || options === void 0 ? void 0 : options.minCapacity) !== null && _b !== void 0 ? _b : 1;\n this.minFillRate = (_c = options === null || options === void 0 ? void 0 : options.minFillRate) !== null && _c !== void 0 ? _c : 0.5;\n this.scaleConstant = (_d = options === null || options === void 0 ? void 0 : options.scaleConstant) !== null && _d !== void 0 ? _d : 0.4;\n this.smooth = (_e = options === null || options === void 0 ? void 0 : options.smooth) !== null && _e !== void 0 ? _e : 0.8;\n const currentTimeInSeconds = this.getCurrentTimeInSeconds();\n this.lastThrottleTime = currentTimeInSeconds;\n this.lastTxRateBucket = Math.floor(this.getCurrentTimeInSeconds());\n this.fillRate = this.minFillRate;\n this.maxCapacity = this.minCapacity;\n }\n getCurrentTimeInSeconds() {\n return Date.now() / 1000;\n }\n async getSendToken() {\n return this.acquireTokenBucket(1);\n }\n async acquireTokenBucket(amount) {\n if (!this.enabled) {\n return;\n }\n this.refillTokenBucket();\n if (amount > this.currentCapacity) {\n const delay = ((amount - this.currentCapacity) / this.fillRate) * 1000;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n this.currentCapacity = this.currentCapacity - amount;\n }\n refillTokenBucket() {\n const timestamp = this.getCurrentTimeInSeconds();\n if (!this.lastTimestamp) {\n this.lastTimestamp = timestamp;\n return;\n }\n const fillAmount = (timestamp - this.lastTimestamp) * this.fillRate;\n this.currentCapacity = Math.min(this.maxCapacity, this.currentCapacity + fillAmount);\n this.lastTimestamp = timestamp;\n }\n updateClientSendingRate(response) {\n let calculatedRate;\n this.updateMeasuredRate();\n if ((0, service_error_classification_1.isThrottlingError)(response)) {\n const rateToUse = !this.enabled ? this.measuredTxRate : Math.min(this.measuredTxRate, this.fillRate);\n this.lastMaxRate = rateToUse;\n this.calculateTimeWindow();\n this.lastThrottleTime = this.getCurrentTimeInSeconds();\n calculatedRate = this.cubicThrottle(rateToUse);\n this.enableTokenBucket();\n }\n else {\n this.calculateTimeWindow();\n calculatedRate = this.cubicSuccess(this.getCurrentTimeInSeconds());\n }\n const newRate = Math.min(calculatedRate, 2 * this.measuredTxRate);\n this.updateTokenBucketRate(newRate);\n }\n calculateTimeWindow() {\n this.timeWindow = this.getPrecise(Math.pow((this.lastMaxRate * (1 - this.beta)) / this.scaleConstant, 1 / 3));\n }\n cubicThrottle(rateToUse) {\n return this.getPrecise(rateToUse * this.beta);\n }\n cubicSuccess(timestamp) {\n return this.getPrecise(this.scaleConstant * Math.pow(timestamp - this.lastThrottleTime - this.timeWindow, 3) + this.lastMaxRate);\n }\n enableTokenBucket() {\n this.enabled = true;\n }\n updateTokenBucketRate(newRate) {\n this.refillTokenBucket();\n this.fillRate = Math.max(newRate, this.minFillRate);\n this.maxCapacity = Math.max(newRate, this.minCapacity);\n this.currentCapacity = Math.min(this.currentCapacity, this.maxCapacity);\n }\n updateMeasuredRate() {\n const t = this.getCurrentTimeInSeconds();\n const timeBucket = Math.floor(t * 2) / 2;\n this.requestCount++;\n if (timeBucket > this.lastTxRateBucket) {\n const currentRate = this.requestCount / (timeBucket - this.lastTxRateBucket);\n this.measuredTxRate = this.getPrecise(currentRate * this.smooth + this.measuredTxRate * (1 - this.smooth));\n this.requestCount = 0;\n this.lastTxRateBucket = timeBucket;\n }\n }\n getPrecise(num) {\n return parseFloat(num.toFixed(8));\n }\n}\nexports.DefaultRateLimiter = DefaultRateLimiter;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StandardRetryStrategy = void 0;\nconst config_1 = require(\"./config\");\nconst constants_1 = require(\"./constants\");\nconst defaultRetryBackoffStrategy_1 = require(\"./defaultRetryBackoffStrategy\");\nconst defaultRetryToken_1 = require(\"./defaultRetryToken\");\nclass StandardRetryStrategy {\n constructor(maxAttempts) {\n this.maxAttempts = maxAttempts;\n this.mode = config_1.RETRY_MODES.STANDARD;\n this.capacity = constants_1.INITIAL_RETRY_TOKENS;\n this.retryBackoffStrategy = (0, defaultRetryBackoffStrategy_1.getDefaultRetryBackoffStrategy)();\n this.maxAttemptsProvider = typeof maxAttempts === \"function\" ? maxAttempts : async () => maxAttempts;\n }\n async acquireInitialRetryToken(retryTokenScope) {\n return (0, defaultRetryToken_1.createDefaultRetryToken)({\n retryDelay: constants_1.DEFAULT_RETRY_DELAY_BASE,\n retryCount: 0,\n });\n }\n async refreshRetryTokenForRetry(token, errorInfo) {\n const maxAttempts = await this.getMaxAttempts();\n if (this.shouldRetry(token, errorInfo, maxAttempts)) {\n const errorType = errorInfo.errorType;\n this.retryBackoffStrategy.setDelayBase(errorType === \"THROTTLING\" ? constants_1.THROTTLING_RETRY_DELAY_BASE : constants_1.DEFAULT_RETRY_DELAY_BASE);\n const delayFromErrorType = this.retryBackoffStrategy.computeNextBackoffDelay(token.getRetryCount());\n const retryDelay = errorInfo.retryAfterHint\n ? Math.max(errorInfo.retryAfterHint.getTime() - Date.now() || 0, delayFromErrorType)\n : delayFromErrorType;\n const capacityCost = this.getCapacityCost(errorType);\n this.capacity -= capacityCost;\n return (0, defaultRetryToken_1.createDefaultRetryToken)({\n retryDelay,\n retryCount: token.getRetryCount() + 1,\n retryCost: capacityCost,\n });\n }\n throw new Error(\"No retry token available\");\n }\n recordSuccess(token) {\n var _a;\n this.capacity = Math.max(constants_1.INITIAL_RETRY_TOKENS, this.capacity + ((_a = token.getRetryCost()) !== null && _a !== void 0 ? _a : constants_1.NO_RETRY_INCREMENT));\n }\n getCapacity() {\n return this.capacity;\n }\n async getMaxAttempts() {\n try {\n return await this.maxAttemptsProvider();\n }\n catch (error) {\n console.warn(`Max attempts provider could not resolve. Using default of ${config_1.DEFAULT_MAX_ATTEMPTS}`);\n return config_1.DEFAULT_MAX_ATTEMPTS;\n }\n }\n shouldRetry(tokenToRenew, errorInfo, maxAttempts) {\n const attempts = tokenToRenew.getRetryCount() + 1;\n return (attempts < maxAttempts &&\n this.capacity >= this.getCapacityCost(errorInfo.errorType) &&\n this.isRetryableError(errorInfo.errorType));\n }\n getCapacityCost(errorType) {\n return errorType === \"TRANSIENT\" ? constants_1.TIMEOUT_RETRY_COST : constants_1.RETRY_COST;\n }\n isRetryableError(errorType) {\n return errorType === \"THROTTLING\" || errorType === \"TRANSIENT\";\n }\n}\nexports.StandardRetryStrategy = StandardRetryStrategy;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_RETRY_MODE = exports.DEFAULT_MAX_ATTEMPTS = exports.RETRY_MODES = void 0;\nvar RETRY_MODES;\n(function (RETRY_MODES) {\n RETRY_MODES[\"STANDARD\"] = \"standard\";\n RETRY_MODES[\"ADAPTIVE\"] = \"adaptive\";\n})(RETRY_MODES = exports.RETRY_MODES || (exports.RETRY_MODES = {}));\nexports.DEFAULT_MAX_ATTEMPTS = 3;\nexports.DEFAULT_RETRY_MODE = RETRY_MODES.STANDARD;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.REQUEST_HEADER = exports.INVOCATION_ID_HEADER = exports.NO_RETRY_INCREMENT = exports.TIMEOUT_RETRY_COST = exports.RETRY_COST = exports.INITIAL_RETRY_TOKENS = exports.THROTTLING_RETRY_DELAY_BASE = exports.MAXIMUM_RETRY_DELAY = exports.DEFAULT_RETRY_DELAY_BASE = void 0;\nexports.DEFAULT_RETRY_DELAY_BASE = 100;\nexports.MAXIMUM_RETRY_DELAY = 20 * 1000;\nexports.THROTTLING_RETRY_DELAY_BASE = 500;\nexports.INITIAL_RETRY_TOKENS = 500;\nexports.RETRY_COST = 5;\nexports.TIMEOUT_RETRY_COST = 10;\nexports.NO_RETRY_INCREMENT = 1;\nexports.INVOCATION_ID_HEADER = \"amz-sdk-invocation-id\";\nexports.REQUEST_HEADER = \"amz-sdk-request\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getDefaultRetryBackoffStrategy = void 0;\nconst constants_1 = require(\"./constants\");\nconst getDefaultRetryBackoffStrategy = () => {\n let delayBase = constants_1.DEFAULT_RETRY_DELAY_BASE;\n const computeNextBackoffDelay = (attempts) => {\n return Math.floor(Math.min(constants_1.MAXIMUM_RETRY_DELAY, Math.random() * 2 ** attempts * delayBase));\n };\n const setDelayBase = (delay) => {\n delayBase = delay;\n };\n return {\n computeNextBackoffDelay,\n setDelayBase,\n };\n};\nexports.getDefaultRetryBackoffStrategy = getDefaultRetryBackoffStrategy;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createDefaultRetryToken = void 0;\nconst constants_1 = require(\"./constants\");\nconst createDefaultRetryToken = ({ retryDelay, retryCount, retryCost, }) => {\n const getRetryCount = () => retryCount;\n const getRetryDelay = () => Math.min(constants_1.MAXIMUM_RETRY_DELAY, retryDelay);\n const getRetryCost = () => retryCost;\n return {\n getRetryCount,\n getRetryDelay,\n getRetryCost,\n };\n};\nexports.createDefaultRetryToken = createDefaultRetryToken;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./AdaptiveRetryStrategy\"), exports);\ntslib_1.__exportStar(require(\"./ConfiguredRetryStrategy\"), exports);\ntslib_1.__exportStar(require(\"./DefaultRateLimiter\"), exports);\ntslib_1.__exportStar(require(\"./StandardRetryStrategy\"), exports);\ntslib_1.__exportStar(require(\"./config\"), exports);\ntslib_1.__exportStar(require(\"./constants\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Uint8ArrayBlobAdapter = void 0;\nconst transforms_1 = require(\"./transforms\");\nclass Uint8ArrayBlobAdapter extends Uint8Array {\n static fromString(source, encoding = \"utf-8\") {\n switch (typeof source) {\n case \"string\":\n return (0, transforms_1.transformFromString)(source, encoding);\n default:\n throw new Error(`Unsupported conversion from ${typeof source} to Uint8ArrayBlobAdapter.`);\n }\n }\n static mutate(source) {\n Object.setPrototypeOf(source, Uint8ArrayBlobAdapter.prototype);\n return source;\n }\n transformToString(encoding = \"utf-8\") {\n return (0, transforms_1.transformToString)(this, encoding);\n }\n}\nexports.Uint8ArrayBlobAdapter = Uint8ArrayBlobAdapter;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.transformFromString = exports.transformToString = void 0;\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst Uint8ArrayBlobAdapter_1 = require(\"./Uint8ArrayBlobAdapter\");\nfunction transformToString(payload, encoding = \"utf-8\") {\n if (encoding === \"base64\") {\n return (0, util_base64_1.toBase64)(payload);\n }\n return (0, util_utf8_1.toUtf8)(payload);\n}\nexports.transformToString = transformToString;\nfunction transformFromString(str, encoding) {\n if (encoding === \"base64\") {\n return Uint8ArrayBlobAdapter_1.Uint8ArrayBlobAdapter.mutate((0, util_base64_1.fromBase64)(str));\n }\n return Uint8ArrayBlobAdapter_1.Uint8ArrayBlobAdapter.mutate((0, util_utf8_1.fromUtf8)(str));\n}\nexports.transformFromString = transformFromString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getAwsChunkedEncodingStream = void 0;\nconst stream_1 = require(\"stream\");\nconst getAwsChunkedEncodingStream = (readableStream, options) => {\n const { base64Encoder, bodyLengthChecker, checksumAlgorithmFn, checksumLocationName, streamHasher } = options;\n const checksumRequired = base64Encoder !== undefined &&\n checksumAlgorithmFn !== undefined &&\n checksumLocationName !== undefined &&\n streamHasher !== undefined;\n const digest = checksumRequired ? streamHasher(checksumAlgorithmFn, readableStream) : undefined;\n const awsChunkedEncodingStream = new stream_1.Readable({ read: () => { } });\n readableStream.on(\"data\", (data) => {\n const length = bodyLengthChecker(data) || 0;\n awsChunkedEncodingStream.push(`${length.toString(16)}\\r\\n`);\n awsChunkedEncodingStream.push(data);\n awsChunkedEncodingStream.push(\"\\r\\n\");\n });\n readableStream.on(\"end\", async () => {\n awsChunkedEncodingStream.push(`0\\r\\n`);\n if (checksumRequired) {\n const checksum = base64Encoder(await digest);\n awsChunkedEncodingStream.push(`${checksumLocationName}:${checksum}\\r\\n`);\n awsChunkedEncodingStream.push(`\\r\\n`);\n }\n awsChunkedEncodingStream.push(null);\n });\n return awsChunkedEncodingStream;\n};\nexports.getAwsChunkedEncodingStream = getAwsChunkedEncodingStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./blob/Uint8ArrayBlobAdapter\"), exports);\ntslib_1.__exportStar(require(\"./getAwsChunkedEncodingStream\"), exports);\ntslib_1.__exportStar(require(\"./sdk-stream-mixin\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sdkStreamMixin = void 0;\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst stream_1 = require(\"stream\");\nconst util_1 = require(\"util\");\nconst ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED = \"The stream has already been transformed.\";\nconst sdkStreamMixin = (stream) => {\n var _a, _b;\n if (!(stream instanceof stream_1.Readable)) {\n const name = ((_b = (_a = stream === null || stream === void 0 ? void 0 : stream.__proto__) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name) || stream;\n throw new Error(`Unexpected stream implementation, expect Stream.Readable instance, got ${name}`);\n }\n let transformed = false;\n const transformToByteArray = async () => {\n if (transformed) {\n throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED);\n }\n transformed = true;\n return await (0, node_http_handler_1.streamCollector)(stream);\n };\n return Object.assign(stream, {\n transformToByteArray,\n transformToString: async (encoding) => {\n const buf = await transformToByteArray();\n if (encoding === undefined || Buffer.isEncoding(encoding)) {\n return (0, util_buffer_from_1.fromArrayBuffer)(buf.buffer, buf.byteOffset, buf.byteLength).toString(encoding);\n }\n else {\n const decoder = new util_1.TextDecoder(encoding);\n return decoder.decode(buf);\n }\n },\n transformToWebStream: () => {\n if (transformed) {\n throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED);\n }\n if (stream.readableFlowing !== null) {\n throw new Error(\"The stream has been consumed by other callbacks.\");\n }\n if (typeof stream_1.Readable.toWeb !== \"function\") {\n throw new Error(\"Readable.toWeb() is not supported. Please make sure you are using Node.js >= 17.0.0, or polyfill is available.\");\n }\n transformed = true;\n return stream_1.Readable.toWeb(stream);\n },\n });\n};\nexports.sdkStreamMixin = sdkStreamMixin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escapeUriPath = void 0;\nconst escape_uri_1 = require(\"./escape-uri\");\nconst escapeUriPath = (uri) => uri.split(\"/\").map(escape_uri_1.escapeUri).join(\"/\");\nexports.escapeUriPath = escapeUriPath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escapeUri = void 0;\nconst escapeUri = (uri) => encodeURIComponent(uri).replace(/[!'()*]/g, hexEncode);\nexports.escapeUri = escapeUri;\nconst hexEncode = (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./escape-uri\"), exports);\ntslib_1.__exportStar(require(\"./escape-uri-path\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromUtf8 = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst fromUtf8 = (input) => {\n const buf = (0, util_buffer_from_1.fromString)(input, \"utf8\");\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength / Uint8Array.BYTES_PER_ELEMENT);\n};\nexports.fromUtf8 = fromUtf8;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromUtf8\"), exports);\ntslib_1.__exportStar(require(\"./toUint8Array\"), exports);\ntslib_1.__exportStar(require(\"./toUtf8\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUint8Array = void 0;\nconst fromUtf8_1 = require(\"./fromUtf8\");\nconst toUint8Array = (data) => {\n if (typeof data === \"string\") {\n return (0, fromUtf8_1.fromUtf8)(data);\n }\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT);\n }\n return new Uint8Array(data);\n};\nexports.toUint8Array = toUint8Array;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst toUtf8 = (input) => (0, util_buffer_from_1.fromArrayBuffer)(input.buffer, input.byteOffset, input.byteLength).toString(\"utf8\");\nexports.toUtf8 = toUtf8;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createWaiter = void 0;\nconst poller_1 = require(\"./poller\");\nconst utils_1 = require(\"./utils\");\nconst waiter_1 = require(\"./waiter\");\nconst abortTimeout = async (abortSignal) => {\n return new Promise((resolve) => {\n abortSignal.onabort = () => resolve({ state: waiter_1.WaiterState.ABORTED });\n });\n};\nconst createWaiter = async (options, input, acceptorChecks) => {\n const params = {\n ...waiter_1.waiterServiceDefaults,\n ...options,\n };\n (0, utils_1.validateWaiterOptions)(params);\n const exitConditions = [(0, poller_1.runPolling)(params, input, acceptorChecks)];\n if (options.abortController) {\n exitConditions.push(abortTimeout(options.abortController.signal));\n }\n if (options.abortSignal) {\n exitConditions.push(abortTimeout(options.abortSignal));\n }\n return Promise.race(exitConditions);\n};\nexports.createWaiter = createWaiter;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./createWaiter\"), exports);\ntslib_1.__exportStar(require(\"./waiter\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.runPolling = void 0;\nconst sleep_1 = require(\"./utils/sleep\");\nconst waiter_1 = require(\"./waiter\");\nconst exponentialBackoffWithJitter = (minDelay, maxDelay, attemptCeiling, attempt) => {\n if (attempt > attemptCeiling)\n return maxDelay;\n const delay = minDelay * 2 ** (attempt - 1);\n return randomInRange(minDelay, delay);\n};\nconst randomInRange = (min, max) => min + Math.random() * (max - min);\nconst runPolling = async ({ minDelay, maxDelay, maxWaitTime, abortController, client, abortSignal }, input, acceptorChecks) => {\n var _a;\n const { state, reason } = await acceptorChecks(client, input);\n if (state !== waiter_1.WaiterState.RETRY) {\n return { state, reason };\n }\n let currentAttempt = 1;\n const waitUntil = Date.now() + maxWaitTime * 1000;\n const attemptCeiling = Math.log(maxDelay / minDelay) / Math.log(2) + 1;\n while (true) {\n if (((_a = abortController === null || abortController === void 0 ? void 0 : abortController.signal) === null || _a === void 0 ? void 0 : _a.aborted) || (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted)) {\n return { state: waiter_1.WaiterState.ABORTED };\n }\n const delay = exponentialBackoffWithJitter(minDelay, maxDelay, attemptCeiling, currentAttempt);\n if (Date.now() + delay * 1000 > waitUntil) {\n return { state: waiter_1.WaiterState.TIMEOUT };\n }\n await (0, sleep_1.sleep)(delay);\n const { state, reason } = await acceptorChecks(client, input);\n if (state !== waiter_1.WaiterState.RETRY) {\n return { state, reason };\n }\n currentAttempt += 1;\n }\n};\nexports.runPolling = runPolling;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./sleep\"), exports);\ntslib_1.__exportStar(require(\"./validate\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sleep = void 0;\nconst sleep = (seconds) => {\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n};\nexports.sleep = sleep;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateWaiterOptions = void 0;\nconst validateWaiterOptions = (options) => {\n if (options.maxWaitTime < 1) {\n throw new Error(`WaiterConfiguration.maxWaitTime must be greater than 0`);\n }\n else if (options.minDelay < 1) {\n throw new Error(`WaiterConfiguration.minDelay must be greater than 0`);\n }\n else if (options.maxDelay < 1) {\n throw new Error(`WaiterConfiguration.maxDelay must be greater than 0`);\n }\n else if (options.maxWaitTime <= options.minDelay) {\n throw new Error(`WaiterConfiguration.maxWaitTime [${options.maxWaitTime}] must be greater than WaiterConfiguration.minDelay [${options.minDelay}] for this waiter`);\n }\n else if (options.maxDelay < options.minDelay) {\n throw new Error(`WaiterConfiguration.maxDelay [${options.maxDelay}] must be greater than WaiterConfiguration.minDelay [${options.minDelay}] for this waiter`);\n }\n};\nexports.validateWaiterOptions = validateWaiterOptions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.checkExceptions = exports.WaiterState = exports.waiterServiceDefaults = void 0;\nexports.waiterServiceDefaults = {\n minDelay: 2,\n maxDelay: 120,\n};\nvar WaiterState;\n(function (WaiterState) {\n WaiterState[\"ABORTED\"] = \"ABORTED\";\n WaiterState[\"FAILURE\"] = \"FAILURE\";\n WaiterState[\"SUCCESS\"] = \"SUCCESS\";\n WaiterState[\"RETRY\"] = \"RETRY\";\n WaiterState[\"TIMEOUT\"] = \"TIMEOUT\";\n})(WaiterState = exports.WaiterState || (exports.WaiterState = {}));\nconst checkExceptions = (result) => {\n if (result.state === WaiterState.ABORTED) {\n const abortError = new Error(`${JSON.stringify({\n ...result,\n reason: \"Request was aborted\",\n })}`);\n abortError.name = \"AbortError\";\n throw abortError;\n }\n else if (result.state === WaiterState.TIMEOUT) {\n const timeoutError = new Error(`${JSON.stringify({\n ...result,\n reason: \"Waiter has timed out\",\n })}`);\n timeoutError.name = \"TimeoutError\";\n throw timeoutError;\n }\n else if (result.state !== WaiterState.SUCCESS) {\n throw new Error(`${JSON.stringify({ result })}`);\n }\n return result;\n};\nexports.checkExceptions = checkExceptions;\n","'use strict';\n\nmodule.exports = ({onlyFirst = false} = {}) => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n};\n","'use strict';\n\nconst wrapAnsi16 = (fn, offset) => (...args) => {\n\tconst code = fn(...args);\n\treturn `\\u001B[${code + offset}m`;\n};\n\nconst wrapAnsi256 = (fn, offset) => (...args) => {\n\tconst code = fn(...args);\n\treturn `\\u001B[${38 + offset};5;${code}m`;\n};\n\nconst wrapAnsi16m = (fn, offset) => (...args) => {\n\tconst rgb = fn(...args);\n\treturn `\\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;\n};\n\nconst ansi2ansi = n => n;\nconst rgb2rgb = (r, g, b) => [r, g, b];\n\nconst setLazyProperty = (object, property, get) => {\n\tObject.defineProperty(object, property, {\n\t\tget: () => {\n\t\t\tconst value = get();\n\n\t\t\tObject.defineProperty(object, property, {\n\t\t\t\tvalue,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true\n\t\t\t});\n\n\t\t\treturn value;\n\t\t},\n\t\tenumerable: true,\n\t\tconfigurable: true\n\t});\n};\n\n/** @type {typeof import('color-convert')} */\nlet colorConvert;\nconst makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {\n\tif (colorConvert === undefined) {\n\t\tcolorConvert = require('color-convert');\n\t}\n\n\tconst offset = isBackground ? 10 : 0;\n\tconst styles = {};\n\n\tfor (const [sourceSpace, suite] of Object.entries(colorConvert)) {\n\t\tconst name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace;\n\t\tif (sourceSpace === targetSpace) {\n\t\t\tstyles[name] = wrap(identity, offset);\n\t\t} else if (typeof suite === 'object') {\n\t\t\tstyles[name] = wrap(suite[targetSpace], offset);\n\t\t}\n\t}\n\n\treturn styles;\n};\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\tconst styles = {\n\t\tmodifier: {\n\t\t\treset: [0, 0],\n\t\t\t// 21 isn't widely supported and 22 does the same thing\n\t\t\tbold: [1, 22],\n\t\t\tdim: [2, 22],\n\t\t\titalic: [3, 23],\n\t\t\tunderline: [4, 24],\n\t\t\tinverse: [7, 27],\n\t\t\thidden: [8, 28],\n\t\t\tstrikethrough: [9, 29]\n\t\t},\n\t\tcolor: {\n\t\t\tblack: [30, 39],\n\t\t\tred: [31, 39],\n\t\t\tgreen: [32, 39],\n\t\t\tyellow: [33, 39],\n\t\t\tblue: [34, 39],\n\t\t\tmagenta: [35, 39],\n\t\t\tcyan: [36, 39],\n\t\t\twhite: [37, 39],\n\n\t\t\t// Bright color\n\t\t\tblackBright: [90, 39],\n\t\t\tredBright: [91, 39],\n\t\t\tgreenBright: [92, 39],\n\t\t\tyellowBright: [93, 39],\n\t\t\tblueBright: [94, 39],\n\t\t\tmagentaBright: [95, 39],\n\t\t\tcyanBright: [96, 39],\n\t\t\twhiteBright: [97, 39]\n\t\t},\n\t\tbgColor: {\n\t\t\tbgBlack: [40, 49],\n\t\t\tbgRed: [41, 49],\n\t\t\tbgGreen: [42, 49],\n\t\t\tbgYellow: [43, 49],\n\t\t\tbgBlue: [44, 49],\n\t\t\tbgMagenta: [45, 49],\n\t\t\tbgCyan: [46, 49],\n\t\t\tbgWhite: [47, 49],\n\n\t\t\t// Bright color\n\t\t\tbgBlackBright: [100, 49],\n\t\t\tbgRedBright: [101, 49],\n\t\t\tbgGreenBright: [102, 49],\n\t\t\tbgYellowBright: [103, 49],\n\t\t\tbgBlueBright: [104, 49],\n\t\t\tbgMagentaBright: [105, 49],\n\t\t\tbgCyanBright: [106, 49],\n\t\t\tbgWhiteBright: [107, 49]\n\t\t}\n\t};\n\n\t// Alias bright black as gray (and grey)\n\tstyles.color.gray = styles.color.blackBright;\n\tstyles.bgColor.bgGray = styles.bgColor.bgBlackBright;\n\tstyles.color.grey = styles.color.blackBright;\n\tstyles.bgColor.bgGrey = styles.bgColor.bgBlackBright;\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tsetLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false));\n\tsetLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false));\n\tsetLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false));\n\tsetLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true));\n\tsetLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true));\n\tsetLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true));\n\n\treturn styles;\n}\n\n// Make the export immutable\nObject.defineProperty(module, 'exports', {\n\tenumerable: true,\n\tget: assembleStyles\n});\n","'use strict';\nconst regex = '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]';\n\nconst astralRegex = options => options && options.exact ? new RegExp(`^${regex}$`) : new RegExp(regex, 'g');\n\nmodule.exports = astralRegex;\n","var register = require(\"./lib/register\");\nvar addHook = require(\"./lib/add\");\nvar removeHook = require(\"./lib/remove\");\n\n// bind with array of arguments: https://stackoverflow.com/a/21792913\nvar bind = Function.bind;\nvar bindable = bind.bind(bind);\n\nfunction bindApi(hook, state, name) {\n var removeHookRef = bindable(removeHook, null).apply(\n null,\n name ? [state, name] : [state]\n );\n hook.api = { remove: removeHookRef };\n hook.remove = removeHookRef;\n [\"before\", \"error\", \"after\", \"wrap\"].forEach(function (kind) {\n var args = name ? [state, kind, name] : [state, kind];\n hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args);\n });\n}\n\nfunction HookSingular() {\n var singularHookName = \"h\";\n var singularHookState = {\n registry: {},\n };\n var singularHook = register.bind(null, singularHookState, singularHookName);\n bindApi(singularHook, singularHookState, singularHookName);\n return singularHook;\n}\n\nfunction HookCollection() {\n var state = {\n registry: {},\n };\n\n var hook = register.bind(null, state);\n bindApi(hook, state);\n\n return hook;\n}\n\nvar collectionHookDeprecationMessageDisplayed = false;\nfunction Hook() {\n if (!collectionHookDeprecationMessageDisplayed) {\n console.warn(\n '[before-after-hook]: \"Hook()\" repurposing warning, use \"Hook.Collection()\". Read more: https://git.io/upgrade-before-after-hook-to-1.4'\n );\n collectionHookDeprecationMessageDisplayed = true;\n }\n return HookCollection();\n}\n\nHook.Singular = HookSingular.bind();\nHook.Collection = HookCollection.bind();\n\nmodule.exports = Hook;\n// expose constructors as a named property for TypeScript\nmodule.exports.Hook = Hook;\nmodule.exports.Singular = Hook.Singular;\nmodule.exports.Collection = Hook.Collection;\n","module.exports = addHook;\n\nfunction addHook(state, kind, name, hook) {\n var orig = hook;\n if (!state.registry[name]) {\n state.registry[name] = [];\n }\n\n if (kind === \"before\") {\n hook = function (method, options) {\n return Promise.resolve()\n .then(orig.bind(null, options))\n .then(method.bind(null, options));\n };\n }\n\n if (kind === \"after\") {\n hook = function (method, options) {\n var result;\n return Promise.resolve()\n .then(method.bind(null, options))\n .then(function (result_) {\n result = result_;\n return orig(result, options);\n })\n .then(function () {\n return result;\n });\n };\n }\n\n if (kind === \"error\") {\n hook = function (method, options) {\n return Promise.resolve()\n .then(method.bind(null, options))\n .catch(function (error) {\n return orig(error, options);\n });\n };\n }\n\n state.registry[name].push({\n hook: hook,\n orig: orig,\n });\n}\n","module.exports = register;\n\nfunction register(state, name, method, options) {\n if (typeof method !== \"function\") {\n throw new Error(\"method for before hook must be a function\");\n }\n\n if (!options) {\n options = {};\n }\n\n if (Array.isArray(name)) {\n return name.reverse().reduce(function (callback, name) {\n return register.bind(null, state, name, callback, options);\n }, method)();\n }\n\n return Promise.resolve().then(function () {\n if (!state.registry[name]) {\n return method(options);\n }\n\n return state.registry[name].reduce(function (method, registered) {\n return registered.hook.bind(null, method, options);\n }, method)();\n });\n}\n","module.exports = removeHook;\n\nfunction removeHook(state, name, method) {\n if (!state.registry[name]) {\n return;\n }\n\n var index = state.registry[name]\n .map(function (registered) {\n return registered.orig;\n })\n .indexOf(method);\n\n if (index === -1) {\n return;\n }\n\n state.registry[name].splice(index, 1);\n}\n","'use strict';\nconst ansiStyles = require('ansi-styles');\nconst {stdout: stdoutColor, stderr: stderrColor} = require('supports-color');\nconst {\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex\n} = require('./util');\n\nconst {isArray} = Array;\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m'\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nclass ChalkClass {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = {};\n\tapplyOptions(chalk, options);\n\n\tchalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_);\n\n\tObject.setPrototypeOf(chalk, Chalk.prototype);\n\tObject.setPrototypeOf(chalk.template, chalk);\n\n\tchalk.template.constructor = () => {\n\t\tthrow new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.');\n\t};\n\n\tchalk.template.Instance = ChalkClass;\n\n\treturn chalk.template;\n};\n\nfunction Chalk(options) {\n\treturn chalkFactory(options);\n}\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t}\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this._styler, true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t}\n};\n\nconst usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler);\n\t\t\t\treturn createBuilder(this, styler, this._isEmpty);\n\t\t\t};\n\t\t}\n\t};\n}\n\nfor (const model of usedModels) {\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler);\n\t\t\t\treturn createBuilder(this, styler, this._isEmpty);\n\t\t\t};\n\t\t}\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this._generator.level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis._generator.level = level;\n\t\t}\n\t}\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\tconst builder = (...arguments_) => {\n\t\tif (isArray(arguments_[0]) && isArray(arguments_[0].raw)) {\n\t\t\t// Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}`\n\t\t\treturn applyStyle(builder, chalkTag(builder, ...arguments_));\n\t\t}\n\n\t\t// Single argument is hot path, implicit coercion is faster than anything\n\t\t// eslint-disable-next-line no-implicit-coercion\n\t\treturn applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\t};\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder._generator = self;\n\tbuilder._styler = _styler;\n\tbuilder._isEmpty = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self._isEmpty ? '' : string;\n\t}\n\n\tlet styler = self._styler;\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.indexOf('\\u001B') !== -1) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nlet template;\nconst chalkTag = (chalk, ...strings) => {\n\tconst [firstString] = strings;\n\n\tif (!isArray(firstString) || !isArray(firstString.raw)) {\n\t\t// If chalk() was called by itself or with a string,\n\t\t// return the string itself as a string.\n\t\treturn strings.join(' ');\n\t}\n\n\tconst arguments_ = strings.slice(1);\n\tconst parts = [firstString.raw[0]];\n\n\tfor (let i = 1; i < firstString.length; i++) {\n\t\tparts.push(\n\t\t\tString(arguments_[i - 1]).replace(/[{}\\\\]/g, '\\\\$&'),\n\t\t\tString(firstString.raw[i])\n\t\t);\n\t}\n\n\tif (template === undefined) {\n\t\ttemplate = require('./templates');\n\t}\n\n\treturn template(chalk, parts.join(''));\n};\n\nObject.defineProperties(Chalk.prototype, styles);\n\nconst chalk = Chalk(); // eslint-disable-line new-cap\nchalk.supportsColor = stdoutColor;\nchalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap\nchalk.stderr.supportsColor = stderrColor;\n\nmodule.exports = chalk;\n","'use strict';\nconst TEMPLATE_REGEX = /(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi;\nconst STYLE_REGEX = /(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g;\nconst STRING_REGEX = /^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/;\nconst ESCAPE_REGEX = /\\\\(u(?:[a-f\\d]{4}|{[a-f\\d]{1,6}})|x[a-f\\d]{2}|.)|([^\\\\])/gi;\n\nconst ESCAPES = new Map([\n\t['n', '\\n'],\n\t['r', '\\r'],\n\t['t', '\\t'],\n\t['b', '\\b'],\n\t['f', '\\f'],\n\t['v', '\\v'],\n\t['0', '\\0'],\n\t['\\\\', '\\\\'],\n\t['e', '\\u001B'],\n\t['a', '\\u0007']\n]);\n\nfunction unescape(c) {\n\tconst u = c[0] === 'u';\n\tconst bracket = c[1] === '{';\n\n\tif ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) {\n\t\treturn String.fromCharCode(parseInt(c.slice(1), 16));\n\t}\n\n\tif (u && bracket) {\n\t\treturn String.fromCodePoint(parseInt(c.slice(2, -1), 16));\n\t}\n\n\treturn ESCAPES.get(c) || c;\n}\n\nfunction parseArguments(name, arguments_) {\n\tconst results = [];\n\tconst chunks = arguments_.trim().split(/\\s*,\\s*/g);\n\tlet matches;\n\n\tfor (const chunk of chunks) {\n\t\tconst number = Number(chunk);\n\t\tif (!Number.isNaN(number)) {\n\t\t\tresults.push(number);\n\t\t} else if ((matches = chunk.match(STRING_REGEX))) {\n\t\t\tresults.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character));\n\t\t} else {\n\t\t\tthrow new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction parseStyle(style) {\n\tSTYLE_REGEX.lastIndex = 0;\n\n\tconst results = [];\n\tlet matches;\n\n\twhile ((matches = STYLE_REGEX.exec(style)) !== null) {\n\t\tconst name = matches[1];\n\n\t\tif (matches[2]) {\n\t\t\tconst args = parseArguments(name, matches[2]);\n\t\t\tresults.push([name].concat(args));\n\t\t} else {\n\t\t\tresults.push([name]);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction buildStyle(chalk, styles) {\n\tconst enabled = {};\n\n\tfor (const layer of styles) {\n\t\tfor (const style of layer.styles) {\n\t\t\tenabled[style[0]] = layer.inverse ? null : style.slice(1);\n\t\t}\n\t}\n\n\tlet current = chalk;\n\tfor (const [styleName, styles] of Object.entries(enabled)) {\n\t\tif (!Array.isArray(styles)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!(styleName in current)) {\n\t\t\tthrow new Error(`Unknown Chalk style: ${styleName}`);\n\t\t}\n\n\t\tcurrent = styles.length > 0 ? current[styleName](...styles) : current[styleName];\n\t}\n\n\treturn current;\n}\n\nmodule.exports = (chalk, temporary) => {\n\tconst styles = [];\n\tconst chunks = [];\n\tlet chunk = [];\n\n\t// eslint-disable-next-line max-params\n\ttemporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => {\n\t\tif (escapeCharacter) {\n\t\t\tchunk.push(unescape(escapeCharacter));\n\t\t} else if (style) {\n\t\t\tconst string = chunk.join('');\n\t\t\tchunk = [];\n\t\t\tchunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string));\n\t\t\tstyles.push({inverse, styles: parseStyle(style)});\n\t\t} else if (close) {\n\t\t\tif (styles.length === 0) {\n\t\t\t\tthrow new Error('Found extraneous } in Chalk template literal');\n\t\t\t}\n\n\t\t\tchunks.push(buildStyle(chalk, styles)(chunk.join('')));\n\t\t\tchunk = [];\n\t\t\tstyles.pop();\n\t\t} else {\n\t\t\tchunk.push(character);\n\t\t}\n\t});\n\n\tchunks.push(chunk.join(''));\n\n\tif (styles.length > 0) {\n\t\tconst errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\\`}\\`)`;\n\t\tthrow new Error(errMessage);\n\t}\n\n\treturn chunks.join('');\n};\n","'use strict';\n\nconst stringReplaceAll = (string, substring, replacer) => {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.substr(endIndex, index - endIndex) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.substr(endIndex);\n\treturn returnValue;\n};\n\nconst stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.substr(endIndex);\n\treturn returnValue;\n};\n\nmodule.exports = {\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex\n};\n","/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `typeof` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n","const conversions = require('./conversions');\nconst route = require('./route');\n\nconst convert = {};\n\nconst models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\tconst result = fn(args);\n\n\t\t// We're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (let len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(fromModel => {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tconst routes = route(fromModel);\n\tconst routeModels = Object.keys(routes);\n\n\trouteModels.forEach(toModel => {\n\t\tconst fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n","const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nclass Deprecation extends Error {\n constructor(message) {\n super(message); // Maintains proper stack trace (only available on V8)\n\n /* istanbul ignore next */\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n\n this.name = 'Deprecation';\n }\n\n}\n\nexports.Deprecation = Deprecation;\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.convertChangesToDMP = convertChangesToDMP;\n\n/*istanbul ignore end*/\n// See: http://code.google.com/p/google-diff-match-patch/wiki/API\nfunction convertChangesToDMP(changes) {\n var ret = [],\n change,\n operation;\n\n for (var i = 0; i < changes.length; i++) {\n change = changes[i];\n\n if (change.added) {\n operation = 1;\n } else if (change.removed) {\n operation = -1;\n } else {\n operation = 0;\n }\n\n ret.push([operation, change.value]);\n }\n\n return ret;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb252ZXJ0L2RtcC5qcyJdLCJuYW1lcyI6WyJjb252ZXJ0Q2hhbmdlc1RvRE1QIiwiY2hhbmdlcyIsInJldCIsImNoYW5nZSIsIm9wZXJhdGlvbiIsImkiLCJsZW5ndGgiLCJhZGRlZCIsInJlbW92ZWQiLCJwdXNoIiwidmFsdWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ08sU0FBU0EsbUJBQVQsQ0FBNkJDLE9BQTdCLEVBQXNDO0FBQzNDLE1BQUlDLEdBQUcsR0FBRyxFQUFWO0FBQUEsTUFDSUMsTUFESjtBQUFBLE1BRUlDLFNBRko7O0FBR0EsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHSixPQUFPLENBQUNLLE1BQTVCLEVBQW9DRCxDQUFDLEVBQXJDLEVBQXlDO0FBQ3ZDRixJQUFBQSxNQUFNLEdBQUdGLE9BQU8sQ0FBQ0ksQ0FBRCxDQUFoQjs7QUFDQSxRQUFJRixNQUFNLENBQUNJLEtBQVgsRUFBa0I7QUFDaEJILE1BQUFBLFNBQVMsR0FBRyxDQUFaO0FBQ0QsS0FGRCxNQUVPLElBQUlELE1BQU0sQ0FBQ0ssT0FBWCxFQUFvQjtBQUN6QkosTUFBQUEsU0FBUyxHQUFHLENBQUMsQ0FBYjtBQUNELEtBRk0sTUFFQTtBQUNMQSxNQUFBQSxTQUFTLEdBQUcsQ0FBWjtBQUNEOztBQUVERixJQUFBQSxHQUFHLENBQUNPLElBQUosQ0FBUyxDQUFDTCxTQUFELEVBQVlELE1BQU0sQ0FBQ08sS0FBbkIsQ0FBVDtBQUNEOztBQUNELFNBQU9SLEdBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIFNlZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoL3dpa2kvQVBJXG5leHBvcnQgZnVuY3Rpb24gY29udmVydENoYW5nZXNUb0RNUChjaGFuZ2VzKSB7XG4gIGxldCByZXQgPSBbXSxcbiAgICAgIGNoYW5nZSxcbiAgICAgIG9wZXJhdGlvbjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhbmdlID0gY2hhbmdlc1tpXTtcbiAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICBvcGVyYXRpb24gPSAxO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgIG9wZXJhdGlvbiA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIHJldC5wdXNoKFtvcGVyYXRpb24sIGNoYW5nZS52YWx1ZV0pO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.convertChangesToXML = convertChangesToXML;\n\n/*istanbul ignore end*/\nfunction convertChangesToXML(changes) {\n var ret = [];\n\n for (var i = 0; i < changes.length; i++) {\n var change = changes[i];\n\n if (change.added) {\n ret.push('');\n } else if (change.removed) {\n ret.push('');\n }\n\n ret.push(escapeHTML(change.value));\n\n if (change.added) {\n ret.push('');\n } else if (change.removed) {\n ret.push('');\n }\n }\n\n return ret.join('');\n}\n\nfunction escapeHTML(s) {\n var n = s;\n n = n.replace(/&/g, '&');\n n = n.replace(//g, '>');\n n = n.replace(/\"/g, '"');\n return n;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb252ZXJ0L3htbC5qcyJdLCJuYW1lcyI6WyJjb252ZXJ0Q2hhbmdlc1RvWE1MIiwiY2hhbmdlcyIsInJldCIsImkiLCJsZW5ndGgiLCJjaGFuZ2UiLCJhZGRlZCIsInB1c2giLCJyZW1vdmVkIiwiZXNjYXBlSFRNTCIsInZhbHVlIiwiam9pbiIsInMiLCJuIiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQU8sU0FBU0EsbUJBQVQsQ0FBNkJDLE9BQTdCLEVBQXNDO0FBQzNDLE1BQUlDLEdBQUcsR0FBRyxFQUFWOztBQUNBLE9BQUssSUFBSUMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0YsT0FBTyxDQUFDRyxNQUE1QixFQUFvQ0QsQ0FBQyxFQUFyQyxFQUF5QztBQUN2QyxRQUFJRSxNQUFNLEdBQUdKLE9BQU8sQ0FBQ0UsQ0FBRCxDQUFwQjs7QUFDQSxRQUFJRSxNQUFNLENBQUNDLEtBQVgsRUFBa0I7QUFDaEJKLE1BQUFBLEdBQUcsQ0FBQ0ssSUFBSixDQUFTLE9BQVQ7QUFDRCxLQUZELE1BRU8sSUFBSUYsTUFBTSxDQUFDRyxPQUFYLEVBQW9CO0FBQ3pCTixNQUFBQSxHQUFHLENBQUNLLElBQUosQ0FBUyxPQUFUO0FBQ0Q7O0FBRURMLElBQUFBLEdBQUcsQ0FBQ0ssSUFBSixDQUFTRSxVQUFVLENBQUNKLE1BQU0sQ0FBQ0ssS0FBUixDQUFuQjs7QUFFQSxRQUFJTCxNQUFNLENBQUNDLEtBQVgsRUFBa0I7QUFDaEJKLE1BQUFBLEdBQUcsQ0FBQ0ssSUFBSixDQUFTLFFBQVQ7QUFDRCxLQUZELE1BRU8sSUFBSUYsTUFBTSxDQUFDRyxPQUFYLEVBQW9CO0FBQ3pCTixNQUFBQSxHQUFHLENBQUNLLElBQUosQ0FBUyxRQUFUO0FBQ0Q7QUFDRjs7QUFDRCxTQUFPTCxHQUFHLENBQUNTLElBQUosQ0FBUyxFQUFULENBQVA7QUFDRDs7QUFFRCxTQUFTRixVQUFULENBQW9CRyxDQUFwQixFQUF1QjtBQUNyQixNQUFJQyxDQUFDLEdBQUdELENBQVI7QUFDQUMsRUFBQUEsQ0FBQyxHQUFHQSxDQUFDLENBQUNDLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLE9BQWhCLENBQUo7QUFDQUQsRUFBQUEsQ0FBQyxHQUFHQSxDQUFDLENBQUNDLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLE1BQWhCLENBQUo7QUFDQUQsRUFBQUEsQ0FBQyxHQUFHQSxDQUFDLENBQUNDLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLE1BQWhCLENBQUo7QUFDQUQsRUFBQUEsQ0FBQyxHQUFHQSxDQUFDLENBQUNDLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLFFBQWhCLENBQUo7QUFFQSxTQUFPRCxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gY29udmVydENoYW5nZXNUb1hNTChjaGFuZ2VzKSB7XG4gIGxldCByZXQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGNoYW5nZSA9IGNoYW5nZXNbaV07XG4gICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgcmV0LnB1c2goJzxpbnM+Jyk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuICAgICAgcmV0LnB1c2goJzxkZWw+Jyk7XG4gICAgfVxuXG4gICAgcmV0LnB1c2goZXNjYXBlSFRNTChjaGFuZ2UudmFsdWUpKTtcblxuICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8L2lucz4nKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICByZXQucHVzaCgnPC9kZWw+Jyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUhUTUwocykge1xuICBsZXQgbiA9IHM7XG4gIG4gPSBuLnJlcGxhY2UoLyYvZywgJyZhbXA7Jyk7XG4gIG4gPSBuLnJlcGxhY2UoLzwvZywgJyZsdDsnKTtcbiAgbiA9IG4ucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuICBuID0gbi5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG5cbiAgcmV0dXJuIG47XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffArrays = diffArrays;\nexports.arrayDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nvar arrayDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.arrayDiff = arrayDiff;\n\n/*istanbul ignore end*/\narrayDiff.tokenize = function (value) {\n return value.slice();\n};\n\narrayDiff.join = arrayDiff.removeEmpty = function (value) {\n return value;\n};\n\nfunction diffArrays(oldArr, newArr, callback) {\n return arrayDiff.diff(oldArr, newArr, callback);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2FycmF5LmpzIl0sIm5hbWVzIjpbImFycmF5RGlmZiIsIkRpZmYiLCJ0b2tlbml6ZSIsInZhbHVlIiwic2xpY2UiLCJqb2luIiwicmVtb3ZlRW1wdHkiLCJkaWZmQXJyYXlzIiwib2xkQXJyIiwibmV3QXJyIiwiY2FsbGJhY2siLCJkaWZmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxJQUFNQSxTQUFTLEdBQUc7QUFBSUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsQ0FBSixFQUFsQjs7Ozs7O0FBQ1BELFNBQVMsQ0FBQ0UsUUFBVixHQUFxQixVQUFTQyxLQUFULEVBQWdCO0FBQ25DLFNBQU9BLEtBQUssQ0FBQ0MsS0FBTixFQUFQO0FBQ0QsQ0FGRDs7QUFHQUosU0FBUyxDQUFDSyxJQUFWLEdBQWlCTCxTQUFTLENBQUNNLFdBQVYsR0FBd0IsVUFBU0gsS0FBVCxFQUFnQjtBQUN2RCxTQUFPQSxLQUFQO0FBQ0QsQ0FGRDs7QUFJTyxTQUFTSSxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsTUFBNUIsRUFBb0NDLFFBQXBDLEVBQThDO0FBQUUsU0FBT1YsU0FBUyxDQUFDVyxJQUFWLENBQWVILE1BQWYsRUFBdUJDLE1BQXZCLEVBQStCQyxRQUEvQixDQUFQO0FBQWtEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGNvbnN0IGFycmF5RGlmZiA9IG5ldyBEaWZmKCk7XG5hcnJheURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc2xpY2UoKTtcbn07XG5hcnJheURpZmYuam9pbiA9IGFycmF5RGlmZi5yZW1vdmVFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQXJyYXlzKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjaykgeyByZXR1cm4gYXJyYXlEaWZmLmRpZmYob2xkQXJyLCBuZXdBcnIsIGNhbGxiYWNrKTsgfVxuIl19\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = Diff;\n\n/*istanbul ignore end*/\nfunction Diff() {}\n\nDiff.prototype = {\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n diff: function diff(oldString, newString) {\n /*istanbul ignore start*/\n var\n /*istanbul ignore end*/\n options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var callback = options.callback;\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n this.options = options;\n var self = this;\n\n function done(value) {\n if (callback) {\n setTimeout(function () {\n callback(undefined, value);\n }, 0);\n return true;\n } else {\n return value;\n }\n } // Allow subclasses to massage the input prior to running\n\n\n oldString = this.castInput(oldString);\n newString = this.castInput(newString);\n oldString = this.removeEmpty(this.tokenize(oldString));\n newString = this.removeEmpty(this.tokenize(newString));\n var newLen = newString.length,\n oldLen = oldString.length;\n var editLength = 1;\n var maxEditLength = newLen + oldLen;\n\n if (options.maxEditLength) {\n maxEditLength = Math.min(maxEditLength, options.maxEditLength);\n }\n\n var bestPath = [{\n newPos: -1,\n components: []\n }]; // Seed editLength = 0, i.e. the content starts with the same values\n\n var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);\n\n if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\n // Identity per the equality and tokenizer\n return done([{\n value: this.join(newString),\n count: newString.length\n }]);\n } // Main worker method. checks all permutations of a given edit length for acceptance.\n\n\n function execEditLength() {\n for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {\n var basePath =\n /*istanbul ignore start*/\n void 0\n /*istanbul ignore end*/\n ;\n\n var addPath = bestPath[diagonalPath - 1],\n removePath = bestPath[diagonalPath + 1],\n _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;\n\n if (addPath) {\n // No one else is going to attempt to use this value, clear it\n bestPath[diagonalPath - 1] = undefined;\n }\n\n var canAdd = addPath && addPath.newPos + 1 < newLen,\n canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;\n\n if (!canAdd && !canRemove) {\n // If this path is a terminal then prune\n bestPath[diagonalPath] = undefined;\n continue;\n } // Select the diagonal that we want to branch from. We select the prior\n // path whose position in the new string is the farthest from the origin\n // and does not pass the bounds of the diff graph\n\n\n if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {\n basePath = clonePath(removePath);\n self.pushComponent(basePath.components, undefined, true);\n } else {\n basePath = addPath; // No need to clone, we've pulled it from the list\n\n basePath.newPos++;\n self.pushComponent(basePath.components, true, undefined);\n }\n\n _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done\n\n if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {\n return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));\n } else {\n // Otherwise track this path as a potential candidate and continue.\n bestPath[diagonalPath] = basePath;\n }\n }\n\n editLength++;\n } // Performs the length of edit iteration. Is a bit fugly as this has to support the\n // sync and async mode which is never fun. Loops over execEditLength until a value\n // is produced, or until the edit length exceeds options.maxEditLength (if given),\n // in which case it will return undefined.\n\n\n if (callback) {\n (function exec() {\n setTimeout(function () {\n if (editLength > maxEditLength) {\n return callback();\n }\n\n if (!execEditLength()) {\n exec();\n }\n }, 0);\n })();\n } else {\n while (editLength <= maxEditLength) {\n var ret = execEditLength();\n\n if (ret) {\n return ret;\n }\n }\n }\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n pushComponent: function pushComponent(components, added, removed) {\n var last = components[components.length - 1];\n\n if (last && last.added === added && last.removed === removed) {\n // We need to clone here as the component clone operation is just\n // as shallow array clone\n components[components.length - 1] = {\n count: last.count + 1,\n added: added,\n removed: removed\n };\n } else {\n components.push({\n count: 1,\n added: added,\n removed: removed\n });\n }\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {\n var newLen = newString.length,\n oldLen = oldString.length,\n newPos = basePath.newPos,\n oldPos = newPos - diagonalPath,\n commonCount = 0;\n\n while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {\n newPos++;\n oldPos++;\n commonCount++;\n }\n\n if (commonCount) {\n basePath.components.push({\n count: commonCount\n });\n }\n\n basePath.newPos = newPos;\n return oldPos;\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n equals: function equals(left, right) {\n if (this.options.comparator) {\n return this.options.comparator(left, right);\n } else {\n return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();\n }\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n removeEmpty: function removeEmpty(array) {\n var ret = [];\n\n for (var i = 0; i < array.length; i++) {\n if (array[i]) {\n ret.push(array[i]);\n }\n }\n\n return ret;\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n castInput: function castInput(value) {\n return value;\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n tokenize: function tokenize(value) {\n return value.split('');\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n join: function join(chars) {\n return chars.join('');\n }\n};\n\nfunction buildValues(diff, components, newString, oldString, useLongestToken) {\n var componentPos = 0,\n componentLen = components.length,\n newPos = 0,\n oldPos = 0;\n\n for (; componentPos < componentLen; componentPos++) {\n var component = components[componentPos];\n\n if (!component.removed) {\n if (!component.added && useLongestToken) {\n var value = newString.slice(newPos, newPos + component.count);\n value = value.map(function (value, i) {\n var oldValue = oldString[oldPos + i];\n return oldValue.length > value.length ? oldValue : value;\n });\n component.value = diff.join(value);\n } else {\n component.value = diff.join(newString.slice(newPos, newPos + component.count));\n }\n\n newPos += component.count; // Common case\n\n if (!component.added) {\n oldPos += component.count;\n }\n } else {\n component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));\n oldPos += component.count; // Reverse add and remove so removes are output first to match common convention\n // The diffing algorithm is tied to add then remove output and this is the simplest\n // route to get the desired output with minimal overhead.\n\n if (componentPos && components[componentPos - 1].added) {\n var tmp = components[componentPos - 1];\n components[componentPos - 1] = components[componentPos];\n components[componentPos] = tmp;\n }\n }\n } // Special case handle for when one terminal is ignored (i.e. whitespace).\n // For this case we merge the terminal into the prior string and drop the change.\n // This is only available for string mode.\n\n\n var lastComponent = components[componentLen - 1];\n\n if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {\n components[componentLen - 2].value += lastComponent.value;\n components.pop();\n }\n\n return components;\n}\n\nfunction clonePath(path) {\n return {\n newPos: path.newPos,\n components: path.components.slice(0)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Jhc2UuanMiXSwibmFtZXMiOlsiRGlmZiIsInByb3RvdHlwZSIsImRpZmYiLCJvbGRTdHJpbmciLCJuZXdTdHJpbmciLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZWxmIiwiZG9uZSIsInZhbHVlIiwic2V0VGltZW91dCIsInVuZGVmaW5lZCIsImNhc3RJbnB1dCIsInJlbW92ZUVtcHR5IiwidG9rZW5pemUiLCJuZXdMZW4iLCJsZW5ndGgiLCJvbGRMZW4iLCJlZGl0TGVuZ3RoIiwibWF4RWRpdExlbmd0aCIsIk1hdGgiLCJtaW4iLCJiZXN0UGF0aCIsIm5ld1BvcyIsImNvbXBvbmVudHMiLCJvbGRQb3MiLCJleHRyYWN0Q29tbW9uIiwiam9pbiIsImNvdW50IiwiZXhlY0VkaXRMZW5ndGgiLCJkaWFnb25hbFBhdGgiLCJiYXNlUGF0aCIsImFkZFBhdGgiLCJyZW1vdmVQYXRoIiwiY2FuQWRkIiwiY2FuUmVtb3ZlIiwiY2xvbmVQYXRoIiwicHVzaENvbXBvbmVudCIsImJ1aWxkVmFsdWVzIiwidXNlTG9uZ2VzdFRva2VuIiwiZXhlYyIsInJldCIsImFkZGVkIiwicmVtb3ZlZCIsImxhc3QiLCJwdXNoIiwiY29tbW9uQ291bnQiLCJlcXVhbHMiLCJsZWZ0IiwicmlnaHQiLCJjb21wYXJhdG9yIiwiaWdub3JlQ2FzZSIsInRvTG93ZXJDYXNlIiwiYXJyYXkiLCJpIiwic3BsaXQiLCJjaGFycyIsImNvbXBvbmVudFBvcyIsImNvbXBvbmVudExlbiIsImNvbXBvbmVudCIsInNsaWNlIiwibWFwIiwib2xkVmFsdWUiLCJ0bXAiLCJsYXN0Q29tcG9uZW50IiwicG9wIiwicGF0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQWUsU0FBU0EsSUFBVCxHQUFnQixDQUFFOztBQUVqQ0EsSUFBSSxDQUFDQyxTQUFMLEdBQWlCO0FBQUE7O0FBQUE7QUFDZkMsRUFBQUEsSUFEZSxnQkFDVkMsU0FEVSxFQUNDQyxTQURELEVBQzBCO0FBQUE7QUFBQTtBQUFBO0FBQWRDLElBQUFBLE9BQWMsdUVBQUosRUFBSTtBQUN2QyxRQUFJQyxRQUFRLEdBQUdELE9BQU8sQ0FBQ0MsUUFBdkI7O0FBQ0EsUUFBSSxPQUFPRCxPQUFQLEtBQW1CLFVBQXZCLEVBQW1DO0FBQ2pDQyxNQUFBQSxRQUFRLEdBQUdELE9BQVg7QUFDQUEsTUFBQUEsT0FBTyxHQUFHLEVBQVY7QUFDRDs7QUFDRCxTQUFLQSxPQUFMLEdBQWVBLE9BQWY7QUFFQSxRQUFJRSxJQUFJLEdBQUcsSUFBWDs7QUFFQSxhQUFTQyxJQUFULENBQWNDLEtBQWQsRUFBcUI7QUFDbkIsVUFBSUgsUUFBSixFQUFjO0FBQ1pJLFFBQUFBLFVBQVUsQ0FBQyxZQUFXO0FBQUVKLFVBQUFBLFFBQVEsQ0FBQ0ssU0FBRCxFQUFZRixLQUFaLENBQVI7QUFBNkIsU0FBM0MsRUFBNkMsQ0FBN0MsQ0FBVjtBQUNBLGVBQU8sSUFBUDtBQUNELE9BSEQsTUFHTztBQUNMLGVBQU9BLEtBQVA7QUFDRDtBQUNGLEtBakJzQyxDQW1CdkM7OztBQUNBTixJQUFBQSxTQUFTLEdBQUcsS0FBS1MsU0FBTCxDQUFlVCxTQUFmLENBQVo7QUFDQUMsSUFBQUEsU0FBUyxHQUFHLEtBQUtRLFNBQUwsQ0FBZVIsU0FBZixDQUFaO0FBRUFELElBQUFBLFNBQVMsR0FBRyxLQUFLVSxXQUFMLENBQWlCLEtBQUtDLFFBQUwsQ0FBY1gsU0FBZCxDQUFqQixDQUFaO0FBQ0FDLElBQUFBLFNBQVMsR0FBRyxLQUFLUyxXQUFMLENBQWlCLEtBQUtDLFFBQUwsQ0FBY1YsU0FBZCxDQUFqQixDQUFaO0FBRUEsUUFBSVcsTUFBTSxHQUFHWCxTQUFTLENBQUNZLE1BQXZCO0FBQUEsUUFBK0JDLE1BQU0sR0FBR2QsU0FBUyxDQUFDYSxNQUFsRDtBQUNBLFFBQUlFLFVBQVUsR0FBRyxDQUFqQjtBQUNBLFFBQUlDLGFBQWEsR0FBR0osTUFBTSxHQUFHRSxNQUE3Qjs7QUFDQSxRQUFHWixPQUFPLENBQUNjLGFBQVgsRUFBMEI7QUFDeEJBLE1BQUFBLGFBQWEsR0FBR0MsSUFBSSxDQUFDQyxHQUFMLENBQVNGLGFBQVQsRUFBd0JkLE9BQU8sQ0FBQ2MsYUFBaEMsQ0FBaEI7QUFDRDs7QUFFRCxRQUFJRyxRQUFRLEdBQUcsQ0FBQztBQUFFQyxNQUFBQSxNQUFNLEVBQUUsQ0FBQyxDQUFYO0FBQWNDLE1BQUFBLFVBQVUsRUFBRTtBQUExQixLQUFELENBQWYsQ0FqQ3VDLENBbUN2Qzs7QUFDQSxRQUFJQyxNQUFNLEdBQUcsS0FBS0MsYUFBTCxDQUFtQkosUUFBUSxDQUFDLENBQUQsQ0FBM0IsRUFBZ0NsQixTQUFoQyxFQUEyQ0QsU0FBM0MsRUFBc0QsQ0FBdEQsQ0FBYjs7QUFDQSxRQUFJbUIsUUFBUSxDQUFDLENBQUQsQ0FBUixDQUFZQyxNQUFaLEdBQXFCLENBQXJCLElBQTBCUixNQUExQixJQUFvQ1UsTUFBTSxHQUFHLENBQVQsSUFBY1IsTUFBdEQsRUFBOEQ7QUFDNUQ7QUFDQSxhQUFPVCxJQUFJLENBQUMsQ0FBQztBQUFDQyxRQUFBQSxLQUFLLEVBQUUsS0FBS2tCLElBQUwsQ0FBVXZCLFNBQVYsQ0FBUjtBQUE4QndCLFFBQUFBLEtBQUssRUFBRXhCLFNBQVMsQ0FBQ1k7QUFBL0MsT0FBRCxDQUFELENBQVg7QUFDRCxLQXhDc0MsQ0EwQ3ZDOzs7QUFDQSxhQUFTYSxjQUFULEdBQTBCO0FBQ3hCLFdBQUssSUFBSUMsWUFBWSxHQUFHLENBQUMsQ0FBRCxHQUFLWixVQUE3QixFQUF5Q1ksWUFBWSxJQUFJWixVQUF6RCxFQUFxRVksWUFBWSxJQUFJLENBQXJGLEVBQXdGO0FBQ3RGLFlBQUlDLFFBQVE7QUFBQTtBQUFBO0FBQVo7QUFBQTs7QUFDQSxZQUFJQyxPQUFPLEdBQUdWLFFBQVEsQ0FBQ1EsWUFBWSxHQUFHLENBQWhCLENBQXRCO0FBQUEsWUFDSUcsVUFBVSxHQUFHWCxRQUFRLENBQUNRLFlBQVksR0FBRyxDQUFoQixDQUR6QjtBQUFBLFlBRUlMLE9BQU0sR0FBRyxDQUFDUSxVQUFVLEdBQUdBLFVBQVUsQ0FBQ1YsTUFBZCxHQUF1QixDQUFsQyxJQUF1Q08sWUFGcEQ7O0FBR0EsWUFBSUUsT0FBSixFQUFhO0FBQ1g7QUFDQVYsVUFBQUEsUUFBUSxDQUFDUSxZQUFZLEdBQUcsQ0FBaEIsQ0FBUixHQUE2Qm5CLFNBQTdCO0FBQ0Q7O0FBRUQsWUFBSXVCLE1BQU0sR0FBR0YsT0FBTyxJQUFJQSxPQUFPLENBQUNULE1BQVIsR0FBaUIsQ0FBakIsR0FBcUJSLE1BQTdDO0FBQUEsWUFDSW9CLFNBQVMsR0FBR0YsVUFBVSxJQUFJLEtBQUtSLE9BQW5CLElBQTZCQSxPQUFNLEdBQUdSLE1BRHREOztBQUVBLFlBQUksQ0FBQ2lCLE1BQUQsSUFBVyxDQUFDQyxTQUFoQixFQUEyQjtBQUN6QjtBQUNBYixVQUFBQSxRQUFRLENBQUNRLFlBQUQsQ0FBUixHQUF5Qm5CLFNBQXpCO0FBQ0E7QUFDRCxTQWhCcUYsQ0FrQnRGO0FBQ0E7QUFDQTs7O0FBQ0EsWUFBSSxDQUFDdUIsTUFBRCxJQUFZQyxTQUFTLElBQUlILE9BQU8sQ0FBQ1QsTUFBUixHQUFpQlUsVUFBVSxDQUFDVixNQUF6RCxFQUFrRTtBQUNoRVEsVUFBQUEsUUFBUSxHQUFHSyxTQUFTLENBQUNILFVBQUQsQ0FBcEI7QUFDQTFCLFVBQUFBLElBQUksQ0FBQzhCLGFBQUwsQ0FBbUJOLFFBQVEsQ0FBQ1AsVUFBNUIsRUFBd0NiLFNBQXhDLEVBQW1ELElBQW5EO0FBQ0QsU0FIRCxNQUdPO0FBQ0xvQixVQUFBQSxRQUFRLEdBQUdDLE9BQVgsQ0FESyxDQUNlOztBQUNwQkQsVUFBQUEsUUFBUSxDQUFDUixNQUFUO0FBQ0FoQixVQUFBQSxJQUFJLENBQUM4QixhQUFMLENBQW1CTixRQUFRLENBQUNQLFVBQTVCLEVBQXdDLElBQXhDLEVBQThDYixTQUE5QztBQUNEOztBQUVEYyxRQUFBQSxPQUFNLEdBQUdsQixJQUFJLENBQUNtQixhQUFMLENBQW1CSyxRQUFuQixFQUE2QjNCLFNBQTdCLEVBQXdDRCxTQUF4QyxFQUFtRDJCLFlBQW5ELENBQVQsQ0E5QnNGLENBZ0N0Rjs7QUFDQSxZQUFJQyxRQUFRLENBQUNSLE1BQVQsR0FBa0IsQ0FBbEIsSUFBdUJSLE1BQXZCLElBQWlDVSxPQUFNLEdBQUcsQ0FBVCxJQUFjUixNQUFuRCxFQUEyRDtBQUN6RCxpQkFBT1QsSUFBSSxDQUFDOEIsV0FBVyxDQUFDL0IsSUFBRCxFQUFPd0IsUUFBUSxDQUFDUCxVQUFoQixFQUE0QnBCLFNBQTVCLEVBQXVDRCxTQUF2QyxFQUFrREksSUFBSSxDQUFDZ0MsZUFBdkQsQ0FBWixDQUFYO0FBQ0QsU0FGRCxNQUVPO0FBQ0w7QUFDQWpCLFVBQUFBLFFBQVEsQ0FBQ1EsWUFBRCxDQUFSLEdBQXlCQyxRQUF6QjtBQUNEO0FBQ0Y7O0FBRURiLE1BQUFBLFVBQVU7QUFDWCxLQXRGc0MsQ0F3RnZDO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxRQUFJWixRQUFKLEVBQWM7QUFDWCxnQkFBU2tDLElBQVQsR0FBZ0I7QUFDZjlCLFFBQUFBLFVBQVUsQ0FBQyxZQUFXO0FBQ3BCLGNBQUlRLFVBQVUsR0FBR0MsYUFBakIsRUFBZ0M7QUFDOUIsbUJBQU9iLFFBQVEsRUFBZjtBQUNEOztBQUVELGNBQUksQ0FBQ3VCLGNBQWMsRUFBbkIsRUFBdUI7QUFDckJXLFlBQUFBLElBQUk7QUFDTDtBQUNGLFNBUlMsRUFRUCxDQVJPLENBQVY7QUFTRCxPQVZBLEdBQUQ7QUFXRCxLQVpELE1BWU87QUFDTCxhQUFPdEIsVUFBVSxJQUFJQyxhQUFyQixFQUFvQztBQUNsQyxZQUFJc0IsR0FBRyxHQUFHWixjQUFjLEVBQXhCOztBQUNBLFlBQUlZLEdBQUosRUFBUztBQUNQLGlCQUFPQSxHQUFQO0FBQ0Q7QUFDRjtBQUNGO0FBQ0YsR0FqSGM7O0FBQUE7O0FBQUE7QUFtSGZKLEVBQUFBLGFBbkhlLHlCQW1IRGIsVUFuSEMsRUFtSFdrQixLQW5IWCxFQW1Ia0JDLE9BbkhsQixFQW1IMkI7QUFDeEMsUUFBSUMsSUFBSSxHQUFHcEIsVUFBVSxDQUFDQSxVQUFVLENBQUNSLE1BQVgsR0FBb0IsQ0FBckIsQ0FBckI7O0FBQ0EsUUFBSTRCLElBQUksSUFBSUEsSUFBSSxDQUFDRixLQUFMLEtBQWVBLEtBQXZCLElBQWdDRSxJQUFJLENBQUNELE9BQUwsS0FBaUJBLE9BQXJELEVBQThEO0FBQzVEO0FBQ0E7QUFDQW5CLE1BQUFBLFVBQVUsQ0FBQ0EsVUFBVSxDQUFDUixNQUFYLEdBQW9CLENBQXJCLENBQVYsR0FBb0M7QUFBQ1ksUUFBQUEsS0FBSyxFQUFFZ0IsSUFBSSxDQUFDaEIsS0FBTCxHQUFhLENBQXJCO0FBQXdCYyxRQUFBQSxLQUFLLEVBQUVBLEtBQS9CO0FBQXNDQyxRQUFBQSxPQUFPLEVBQUVBO0FBQS9DLE9BQXBDO0FBQ0QsS0FKRCxNQUlPO0FBQ0xuQixNQUFBQSxVQUFVLENBQUNxQixJQUFYLENBQWdCO0FBQUNqQixRQUFBQSxLQUFLLEVBQUUsQ0FBUjtBQUFXYyxRQUFBQSxLQUFLLEVBQUVBLEtBQWxCO0FBQXlCQyxRQUFBQSxPQUFPLEVBQUVBO0FBQWxDLE9BQWhCO0FBQ0Q7QUFDRixHQTVIYzs7QUFBQTs7QUFBQTtBQTZIZmpCLEVBQUFBLGFBN0hlLHlCQTZIREssUUE3SEMsRUE2SFMzQixTQTdIVCxFQTZIb0JELFNBN0hwQixFQTZIK0IyQixZQTdIL0IsRUE2SDZDO0FBQzFELFFBQUlmLE1BQU0sR0FBR1gsU0FBUyxDQUFDWSxNQUF2QjtBQUFBLFFBQ0lDLE1BQU0sR0FBR2QsU0FBUyxDQUFDYSxNQUR2QjtBQUFBLFFBRUlPLE1BQU0sR0FBR1EsUUFBUSxDQUFDUixNQUZ0QjtBQUFBLFFBR0lFLE1BQU0sR0FBR0YsTUFBTSxHQUFHTyxZQUh0QjtBQUFBLFFBS0lnQixXQUFXLEdBQUcsQ0FMbEI7O0FBTUEsV0FBT3ZCLE1BQU0sR0FBRyxDQUFULEdBQWFSLE1BQWIsSUFBdUJVLE1BQU0sR0FBRyxDQUFULEdBQWFSLE1BQXBDLElBQThDLEtBQUs4QixNQUFMLENBQVkzQyxTQUFTLENBQUNtQixNQUFNLEdBQUcsQ0FBVixDQUFyQixFQUFtQ3BCLFNBQVMsQ0FBQ3NCLE1BQU0sR0FBRyxDQUFWLENBQTVDLENBQXJELEVBQWdIO0FBQzlHRixNQUFBQSxNQUFNO0FBQ05FLE1BQUFBLE1BQU07QUFDTnFCLE1BQUFBLFdBQVc7QUFDWjs7QUFFRCxRQUFJQSxXQUFKLEVBQWlCO0FBQ2ZmLE1BQUFBLFFBQVEsQ0FBQ1AsVUFBVCxDQUFvQnFCLElBQXBCLENBQXlCO0FBQUNqQixRQUFBQSxLQUFLLEVBQUVrQjtBQUFSLE9BQXpCO0FBQ0Q7O0FBRURmLElBQUFBLFFBQVEsQ0FBQ1IsTUFBVCxHQUFrQkEsTUFBbEI7QUFDQSxXQUFPRSxNQUFQO0FBQ0QsR0FoSmM7O0FBQUE7O0FBQUE7QUFrSmZzQixFQUFBQSxNQWxKZSxrQkFrSlJDLElBbEpRLEVBa0pGQyxLQWxKRSxFQWtKSztBQUNsQixRQUFJLEtBQUs1QyxPQUFMLENBQWE2QyxVQUFqQixFQUE2QjtBQUMzQixhQUFPLEtBQUs3QyxPQUFMLENBQWE2QyxVQUFiLENBQXdCRixJQUF4QixFQUE4QkMsS0FBOUIsQ0FBUDtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU9ELElBQUksS0FBS0MsS0FBVCxJQUNELEtBQUs1QyxPQUFMLENBQWE4QyxVQUFiLElBQTJCSCxJQUFJLENBQUNJLFdBQUwsT0FBdUJILEtBQUssQ0FBQ0csV0FBTixFQUR4RDtBQUVEO0FBQ0YsR0F6SmM7O0FBQUE7O0FBQUE7QUEwSmZ2QyxFQUFBQSxXQTFKZSx1QkEwSkh3QyxLQTFKRyxFQTBKSTtBQUNqQixRQUFJWixHQUFHLEdBQUcsRUFBVjs7QUFDQSxTQUFLLElBQUlhLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdELEtBQUssQ0FBQ3JDLE1BQTFCLEVBQWtDc0MsQ0FBQyxFQUFuQyxFQUF1QztBQUNyQyxVQUFJRCxLQUFLLENBQUNDLENBQUQsQ0FBVCxFQUFjO0FBQ1piLFFBQUFBLEdBQUcsQ0FBQ0ksSUFBSixDQUFTUSxLQUFLLENBQUNDLENBQUQsQ0FBZDtBQUNEO0FBQ0Y7O0FBQ0QsV0FBT2IsR0FBUDtBQUNELEdBbEtjOztBQUFBOztBQUFBO0FBbUtmN0IsRUFBQUEsU0FuS2UscUJBbUtMSCxLQW5LSyxFQW1LRTtBQUNmLFdBQU9BLEtBQVA7QUFDRCxHQXJLYzs7QUFBQTs7QUFBQTtBQXNLZkssRUFBQUEsUUF0S2Usb0JBc0tOTCxLQXRLTSxFQXNLQztBQUNkLFdBQU9BLEtBQUssQ0FBQzhDLEtBQU4sQ0FBWSxFQUFaLENBQVA7QUFDRCxHQXhLYzs7QUFBQTs7QUFBQTtBQXlLZjVCLEVBQUFBLElBektlLGdCQXlLVjZCLEtBektVLEVBeUtIO0FBQ1YsV0FBT0EsS0FBSyxDQUFDN0IsSUFBTixDQUFXLEVBQVgsQ0FBUDtBQUNEO0FBM0tjLENBQWpCOztBQThLQSxTQUFTVyxXQUFULENBQXFCcEMsSUFBckIsRUFBMkJzQixVQUEzQixFQUF1Q3BCLFNBQXZDLEVBQWtERCxTQUFsRCxFQUE2RG9DLGVBQTdELEVBQThFO0FBQzVFLE1BQUlrQixZQUFZLEdBQUcsQ0FBbkI7QUFBQSxNQUNJQyxZQUFZLEdBQUdsQyxVQUFVLENBQUNSLE1BRDlCO0FBQUEsTUFFSU8sTUFBTSxHQUFHLENBRmI7QUFBQSxNQUdJRSxNQUFNLEdBQUcsQ0FIYjs7QUFLQSxTQUFPZ0MsWUFBWSxHQUFHQyxZQUF0QixFQUFvQ0QsWUFBWSxFQUFoRCxFQUFvRDtBQUNsRCxRQUFJRSxTQUFTLEdBQUduQyxVQUFVLENBQUNpQyxZQUFELENBQTFCOztBQUNBLFFBQUksQ0FBQ0UsU0FBUyxDQUFDaEIsT0FBZixFQUF3QjtBQUN0QixVQUFJLENBQUNnQixTQUFTLENBQUNqQixLQUFYLElBQW9CSCxlQUF4QixFQUF5QztBQUN2QyxZQUFJOUIsS0FBSyxHQUFHTCxTQUFTLENBQUN3RCxLQUFWLENBQWdCckMsTUFBaEIsRUFBd0JBLE1BQU0sR0FBR29DLFNBQVMsQ0FBQy9CLEtBQTNDLENBQVo7QUFDQW5CLFFBQUFBLEtBQUssR0FBR0EsS0FBSyxDQUFDb0QsR0FBTixDQUFVLFVBQVNwRCxLQUFULEVBQWdCNkMsQ0FBaEIsRUFBbUI7QUFDbkMsY0FBSVEsUUFBUSxHQUFHM0QsU0FBUyxDQUFDc0IsTUFBTSxHQUFHNkIsQ0FBVixDQUF4QjtBQUNBLGlCQUFPUSxRQUFRLENBQUM5QyxNQUFULEdBQWtCUCxLQUFLLENBQUNPLE1BQXhCLEdBQWlDOEMsUUFBakMsR0FBNENyRCxLQUFuRDtBQUNELFNBSE8sQ0FBUjtBQUtBa0QsUUFBQUEsU0FBUyxDQUFDbEQsS0FBVixHQUFrQlAsSUFBSSxDQUFDeUIsSUFBTCxDQUFVbEIsS0FBVixDQUFsQjtBQUNELE9BUkQsTUFRTztBQUNMa0QsUUFBQUEsU0FBUyxDQUFDbEQsS0FBVixHQUFrQlAsSUFBSSxDQUFDeUIsSUFBTCxDQUFVdkIsU0FBUyxDQUFDd0QsS0FBVixDQUFnQnJDLE1BQWhCLEVBQXdCQSxNQUFNLEdBQUdvQyxTQUFTLENBQUMvQixLQUEzQyxDQUFWLENBQWxCO0FBQ0Q7O0FBQ0RMLE1BQUFBLE1BQU0sSUFBSW9DLFNBQVMsQ0FBQy9CLEtBQXBCLENBWnNCLENBY3RCOztBQUNBLFVBQUksQ0FBQytCLFNBQVMsQ0FBQ2pCLEtBQWYsRUFBc0I7QUFDcEJqQixRQUFBQSxNQUFNLElBQUlrQyxTQUFTLENBQUMvQixLQUFwQjtBQUNEO0FBQ0YsS0FsQkQsTUFrQk87QUFDTCtCLE1BQUFBLFNBQVMsQ0FBQ2xELEtBQVYsR0FBa0JQLElBQUksQ0FBQ3lCLElBQUwsQ0FBVXhCLFNBQVMsQ0FBQ3lELEtBQVYsQ0FBZ0JuQyxNQUFoQixFQUF3QkEsTUFBTSxHQUFHa0MsU0FBUyxDQUFDL0IsS0FBM0MsQ0FBVixDQUFsQjtBQUNBSCxNQUFBQSxNQUFNLElBQUlrQyxTQUFTLENBQUMvQixLQUFwQixDQUZLLENBSUw7QUFDQTtBQUNBOztBQUNBLFVBQUk2QixZQUFZLElBQUlqQyxVQUFVLENBQUNpQyxZQUFZLEdBQUcsQ0FBaEIsQ0FBVixDQUE2QmYsS0FBakQsRUFBd0Q7QUFDdEQsWUFBSXFCLEdBQUcsR0FBR3ZDLFVBQVUsQ0FBQ2lDLFlBQVksR0FBRyxDQUFoQixDQUFwQjtBQUNBakMsUUFBQUEsVUFBVSxDQUFDaUMsWUFBWSxHQUFHLENBQWhCLENBQVYsR0FBK0JqQyxVQUFVLENBQUNpQyxZQUFELENBQXpDO0FBQ0FqQyxRQUFBQSxVQUFVLENBQUNpQyxZQUFELENBQVYsR0FBMkJNLEdBQTNCO0FBQ0Q7QUFDRjtBQUNGLEdBdkMyRSxDQXlDNUU7QUFDQTtBQUNBOzs7QUFDQSxNQUFJQyxhQUFhLEdBQUd4QyxVQUFVLENBQUNrQyxZQUFZLEdBQUcsQ0FBaEIsQ0FBOUI7O0FBQ0EsTUFBSUEsWUFBWSxHQUFHLENBQWYsSUFDRyxPQUFPTSxhQUFhLENBQUN2RCxLQUFyQixLQUErQixRQURsQyxLQUVJdUQsYUFBYSxDQUFDdEIsS0FBZCxJQUF1QnNCLGFBQWEsQ0FBQ3JCLE9BRnpDLEtBR0d6QyxJQUFJLENBQUM2QyxNQUFMLENBQVksRUFBWixFQUFnQmlCLGFBQWEsQ0FBQ3ZELEtBQTlCLENBSFAsRUFHNkM7QUFDM0NlLElBQUFBLFVBQVUsQ0FBQ2tDLFlBQVksR0FBRyxDQUFoQixDQUFWLENBQTZCakQsS0FBN0IsSUFBc0N1RCxhQUFhLENBQUN2RCxLQUFwRDtBQUNBZSxJQUFBQSxVQUFVLENBQUN5QyxHQUFYO0FBQ0Q7O0FBRUQsU0FBT3pDLFVBQVA7QUFDRDs7QUFFRCxTQUFTWSxTQUFULENBQW1COEIsSUFBbkIsRUFBeUI7QUFDdkIsU0FBTztBQUFFM0MsSUFBQUEsTUFBTSxFQUFFMkMsSUFBSSxDQUFDM0MsTUFBZjtBQUF1QkMsSUFBQUEsVUFBVSxFQUFFMEMsSUFBSSxDQUFDMUMsVUFBTCxDQUFnQm9DLEtBQWhCLENBQXNCLENBQXRCO0FBQW5DLEdBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERpZmYoKSB7fVxuXG5EaWZmLnByb3RvdHlwZSA9IHtcbiAgZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvbmUodmFsdWUpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayh1bmRlZmluZWQsIHZhbHVlKTsgfSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5jYXN0SW5wdXQobmV3U3RyaW5nKTtcblxuICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUobmV3U3RyaW5nKSk7XG5cbiAgICBsZXQgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCwgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcbiAgICBsZXQgZWRpdExlbmd0aCA9IDE7XG4gICAgbGV0IG1heEVkaXRMZW5ndGggPSBuZXdMZW4gKyBvbGRMZW47XG4gICAgaWYob3B0aW9ucy5tYXhFZGl0TGVuZ3RoKSB7XG4gICAgICBtYXhFZGl0TGVuZ3RoID0gTWF0aC5taW4obWF4RWRpdExlbmd0aCwgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoKTtcbiAgICB9XG5cbiAgICBsZXQgYmVzdFBhdGggPSBbeyBuZXdQb3M6IC0xLCBjb21wb25lbnRzOiBbXSB9XTtcblxuICAgIC8vIFNlZWQgZWRpdExlbmd0aCA9IDAsIGkuZS4gdGhlIGNvbnRlbnQgc3RhcnRzIHdpdGggdGhlIHNhbWUgdmFsdWVzXG4gICAgbGV0IG9sZFBvcyA9IHRoaXMuZXh0cmFjdENvbW1vbihiZXN0UGF0aFswXSwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIDApO1xuICAgIGlmIChiZXN0UGF0aFswXS5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgLy8gSWRlbnRpdHkgcGVyIHRoZSBlcXVhbGl0eSBhbmQgdG9rZW5pemVyXG4gICAgICByZXR1cm4gZG9uZShbe3ZhbHVlOiB0aGlzLmpvaW4obmV3U3RyaW5nKSwgY291bnQ6IG5ld1N0cmluZy5sZW5ndGh9XSk7XG4gICAgfVxuXG4gICAgLy8gTWFpbiB3b3JrZXIgbWV0aG9kLiBjaGVja3MgYWxsIHBlcm11dGF0aW9ucyBvZiBhIGdpdmVuIGVkaXQgbGVuZ3RoIGZvciBhY2NlcHRhbmNlLlxuICAgIGZ1bmN0aW9uIGV4ZWNFZGl0TGVuZ3RoKCkge1xuICAgICAgZm9yIChsZXQgZGlhZ29uYWxQYXRoID0gLTEgKiBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggPD0gZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoICs9IDIpIHtcbiAgICAgICAgbGV0IGJhc2VQYXRoO1xuICAgICAgICBsZXQgYWRkUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdLFxuICAgICAgICAgICAgcmVtb3ZlUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCArIDFdLFxuICAgICAgICAgICAgb2xkUG9zID0gKHJlbW92ZVBhdGggPyByZW1vdmVQYXRoLm5ld1BvcyA6IDApIC0gZGlhZ29uYWxQYXRoO1xuICAgICAgICBpZiAoYWRkUGF0aCkge1xuICAgICAgICAgIC8vIE5vIG9uZSBlbHNlIGlzIGdvaW5nIHRvIGF0dGVtcHQgdG8gdXNlIHRoaXMgdmFsdWUsIGNsZWFyIGl0XG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FuQWRkID0gYWRkUGF0aCAmJiBhZGRQYXRoLm5ld1BvcyArIDEgPCBuZXdMZW4sXG4gICAgICAgICAgICBjYW5SZW1vdmUgPSByZW1vdmVQYXRoICYmIDAgPD0gb2xkUG9zICYmIG9sZFBvcyA8IG9sZExlbjtcbiAgICAgICAgaWYgKCFjYW5BZGQgJiYgIWNhblJlbW92ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgcGF0aCBpcyBhIHRlcm1pbmFsIHRoZW4gcHJ1bmVcbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VsZWN0IHRoZSBkaWFnb25hbCB0aGF0IHdlIHdhbnQgdG8gYnJhbmNoIGZyb20uIFdlIHNlbGVjdCB0aGUgcHJpb3JcbiAgICAgICAgLy8gcGF0aCB3aG9zZSBwb3NpdGlvbiBpbiB0aGUgbmV3IHN0cmluZyBpcyB0aGUgZmFydGhlc3QgZnJvbSB0aGUgb3JpZ2luXG4gICAgICAgIC8vIGFuZCBkb2VzIG5vdCBwYXNzIHRoZSBib3VuZHMgb2YgdGhlIGRpZmYgZ3JhcGhcbiAgICAgICAgaWYgKCFjYW5BZGQgfHwgKGNhblJlbW92ZSAmJiBhZGRQYXRoLm5ld1BvcyA8IHJlbW92ZVBhdGgubmV3UG9zKSkge1xuICAgICAgICAgIGJhc2VQYXRoID0gY2xvbmVQYXRoKHJlbW92ZVBhdGgpO1xuICAgICAgICAgIHNlbGYucHVzaENvbXBvbmVudChiYXNlUGF0aC5jb21wb25lbnRzLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhc2VQYXRoID0gYWRkUGF0aDsgLy8gTm8gbmVlZCB0byBjbG9uZSwgd2UndmUgcHVsbGVkIGl0IGZyb20gdGhlIGxpc3RcbiAgICAgICAgICBiYXNlUGF0aC5uZXdQb3MrKztcbiAgICAgICAgICBzZWxmLnB1c2hDb21wb25lbnQoYmFzZVBhdGguY29tcG9uZW50cywgdHJ1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9sZFBvcyA9IHNlbGYuZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiBib3RoIHN0cmluZ3MsIHRoZW4gd2UgYXJlIGRvbmVcbiAgICAgICAgaWYgKGJhc2VQYXRoLm5ld1BvcyArIDEgPj0gbmV3TGVuICYmIG9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAgICAgcmV0dXJuIGRvbmUoYnVpbGRWYWx1ZXMoc2VsZiwgYmFzZVBhdGguY29tcG9uZW50cywgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHNlbGYudXNlTG9uZ2VzdFRva2VuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIHRyYWNrIHRoaXMgcGF0aCBhcyBhIHBvdGVudGlhbCBjYW5kaWRhdGUgYW5kIGNvbnRpbnVlLlxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZGl0TGVuZ3RoKys7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybXMgdGhlIGxlbmd0aCBvZiBlZGl0IGl0ZXJhdGlvbi4gSXMgYSBiaXQgZnVnbHkgYXMgdGhpcyBoYXMgdG8gc3VwcG9ydCB0aGVcbiAgICAvLyBzeW5jIGFuZCBhc3luYyBtb2RlIHdoaWNoIGlzIG5ldmVyIGZ1bi4gTG9vcHMgb3ZlciBleGVjRWRpdExlbmd0aCB1bnRpbCBhIHZhbHVlXG4gICAgLy8gaXMgcHJvZHVjZWQsIG9yIHVudGlsIHRoZSBlZGl0IGxlbmd0aCBleGNlZWRzIG9wdGlvbnMubWF4RWRpdExlbmd0aCAoaWYgZ2l2ZW4pLFxuICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgKGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKGVkaXRMZW5ndGggPiBtYXhFZGl0TGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWV4ZWNFZGl0TGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIGV4ZWMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgICAgfSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKGVkaXRMZW5ndGggPD0gbWF4RWRpdExlbmd0aCkge1xuICAgICAgICBsZXQgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcHVzaENvbXBvbmVudChjb21wb25lbnRzLCBhZGRlZCwgcmVtb3ZlZCkge1xuICAgIGxldCBsYXN0ID0gY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0ICYmIGxhc3QuYWRkZWQgPT09IGFkZGVkICYmIGxhc3QucmVtb3ZlZCA9PT0gcmVtb3ZlZCkge1xuICAgICAgLy8gV2UgbmVlZCB0byBjbG9uZSBoZXJlIGFzIHRoZSBjb21wb25lbnQgY2xvbmUgb3BlcmF0aW9uIGlzIGp1c3RcbiAgICAgIC8vIGFzIHNoYWxsb3cgYXJyYXkgY2xvbmVcbiAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXSA9IHtjb3VudDogbGFzdC5jb3VudCArIDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goe2NvdW50OiAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQgfSk7XG4gICAgfVxuICB9LFxuICBleHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKSB7XG4gICAgbGV0IG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG4gICAgICAgIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGgsXG4gICAgICAgIG5ld1BvcyA9IGJhc2VQYXRoLm5ld1BvcyxcbiAgICAgICAgb2xkUG9zID0gbmV3UG9zIC0gZGlhZ29uYWxQYXRoLFxuXG4gICAgICAgIGNvbW1vbkNvdW50ID0gMDtcbiAgICB3aGlsZSAobmV3UG9zICsgMSA8IG5ld0xlbiAmJiBvbGRQb3MgKyAxIDwgb2xkTGVuICYmIHRoaXMuZXF1YWxzKG5ld1N0cmluZ1tuZXdQb3MgKyAxXSwgb2xkU3RyaW5nW29sZFBvcyArIDFdKSkge1xuICAgICAgbmV3UG9zKys7XG4gICAgICBvbGRQb3MrKztcbiAgICAgIGNvbW1vbkNvdW50Kys7XG4gICAgfVxuXG4gICAgaWYgKGNvbW1vbkNvdW50KSB7XG4gICAgICBiYXNlUGF0aC5jb21wb25lbnRzLnB1c2goe2NvdW50OiBjb21tb25Db3VudH0pO1xuICAgIH1cblxuICAgIGJhc2VQYXRoLm5ld1BvcyA9IG5ld1BvcztcbiAgICByZXR1cm4gb2xkUG9zO1xuICB9LFxuXG4gIGVxdWFscyhsZWZ0LCByaWdodCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0XG4gICAgICAgIHx8ICh0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSAmJiBsZWZ0LnRvTG93ZXJDYXNlKCkgPT09IHJpZ2h0LnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlRW1wdHkoYXJyYXkpIHtcbiAgICBsZXQgcmV0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycmF5W2ldKSB7XG4gICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcbiAgY2FzdElucHV0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICB0b2tlbml6ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnJyk7XG4gIH0sXG4gIGpvaW4oY2hhcnMpIHtcbiAgICByZXR1cm4gY2hhcnMuam9pbignJyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJ1aWxkVmFsdWVzKGRpZmYsIGNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCB1c2VMb25nZXN0VG9rZW4pIHtcbiAgbGV0IGNvbXBvbmVudFBvcyA9IDAsXG4gICAgICBjb21wb25lbnRMZW4gPSBjb21wb25lbnRzLmxlbmd0aCxcbiAgICAgIG5ld1BvcyA9IDAsXG4gICAgICBvbGRQb3MgPSAwO1xuXG4gIGZvciAoOyBjb21wb25lbnRQb3MgPCBjb21wb25lbnRMZW47IGNvbXBvbmVudFBvcysrKSB7XG4gICAgbGV0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICBpZiAoIWNvbXBvbmVudC5yZW1vdmVkKSB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCAmJiB1c2VMb25nZXN0VG9rZW4pIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24odmFsdWUsIGkpIHtcbiAgICAgICAgICBsZXQgb2xkVmFsdWUgPSBvbGRTdHJpbmdbb2xkUG9zICsgaV07XG4gICAgICAgICAgcmV0dXJuIG9sZFZhbHVlLmxlbmd0aCA+IHZhbHVlLmxlbmd0aCA/IG9sZFZhbHVlIDogdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbih2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4obmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICB9XG4gICAgICBuZXdQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuXG4gICAgICAvLyBDb21tb24gY2FzZVxuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcbiAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG9sZFN0cmluZy5zbGljZShvbGRQb3MsIG9sZFBvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuICAgICAgLy8gUmV2ZXJzZSBhZGQgYW5kIHJlbW92ZSBzbyByZW1vdmVzIGFyZSBvdXRwdXQgZmlyc3QgdG8gbWF0Y2ggY29tbW9uIGNvbnZlbnRpb25cbiAgICAgIC8vIFRoZSBkaWZmaW5nIGFsZ29yaXRobSBpcyB0aWVkIHRvIGFkZCB0aGVuIHJlbW92ZSBvdXRwdXQgYW5kIHRoaXMgaXMgdGhlIHNpbXBsZXN0XG4gICAgICAvLyByb3V0ZSB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0IHdpdGggbWluaW1hbCBvdmVyaGVhZC5cbiAgICAgIGlmIChjb21wb25lbnRQb3MgJiYgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXS5hZGRlZCkge1xuICAgICAgICBsZXQgdG1wID0gY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXSA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3NdID0gdG1wO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNwZWNpYWwgY2FzZSBoYW5kbGUgZm9yIHdoZW4gb25lIHRlcm1pbmFsIGlzIGlnbm9yZWQgKGkuZS4gd2hpdGVzcGFjZSkuXG4gIC8vIEZvciB0aGlzIGNhc2Ugd2UgbWVyZ2UgdGhlIHRlcm1pbmFsIGludG8gdGhlIHByaW9yIHN0cmluZyBhbmQgZHJvcCB0aGUgY2hhbmdlLlxuICAvLyBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdHJpbmcgbW9kZS5cbiAgbGV0IGxhc3RDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDFdO1xuICBpZiAoY29tcG9uZW50TGVuID4gMVxuICAgICAgJiYgdHlwZW9mIGxhc3RDb21wb25lbnQudmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAmJiAobGFzdENvbXBvbmVudC5hZGRlZCB8fCBsYXN0Q29tcG9uZW50LnJlbW92ZWQpXG4gICAgICAmJiBkaWZmLmVxdWFscygnJywgbGFzdENvbXBvbmVudC52YWx1ZSkpIHtcbiAgICBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDJdLnZhbHVlICs9IGxhc3RDb21wb25lbnQudmFsdWU7XG4gICAgY29tcG9uZW50cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBjb21wb25lbnRzO1xufVxuXG5mdW5jdGlvbiBjbG9uZVBhdGgocGF0aCkge1xuICByZXR1cm4geyBuZXdQb3M6IHBhdGgubmV3UG9zLCBjb21wb25lbnRzOiBwYXRoLmNvbXBvbmVudHMuc2xpY2UoMCkgfTtcbn1cbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffChars = diffChars;\nexports.characterDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nvar characterDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.characterDiff = characterDiff;\n\n/*istanbul ignore end*/\nfunction diffChars(oldStr, newStr, options) {\n return characterDiff.diff(oldStr, newStr, options);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2NoYXJhY3Rlci5qcyJdLCJuYW1lcyI6WyJjaGFyYWN0ZXJEaWZmIiwiRGlmZiIsImRpZmZDaGFycyIsIm9sZFN0ciIsIm5ld1N0ciIsIm9wdGlvbnMiLCJkaWZmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxJQUFNQSxhQUFhLEdBQUc7QUFBSUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsQ0FBSixFQUF0Qjs7Ozs7O0FBQ0EsU0FBU0MsU0FBVCxDQUFtQkMsTUFBbkIsRUFBMkJDLE1BQTNCLEVBQW1DQyxPQUFuQyxFQUE0QztBQUFFLFNBQU9MLGFBQWEsQ0FBQ00sSUFBZCxDQUFtQkgsTUFBbkIsRUFBMkJDLE1BQTNCLEVBQW1DQyxPQUFuQyxDQUFQO0FBQXFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGNvbnN0IGNoYXJhY3RlckRpZmYgPSBuZXcgRGlmZigpO1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZDaGFycyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykgeyByZXR1cm4gY2hhcmFjdGVyRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTsgfVxuIl19\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffCss = diffCss;\nexports.cssDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nvar cssDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.cssDiff = cssDiff;\n\n/*istanbul ignore end*/\ncssDiff.tokenize = function (value) {\n return value.split(/([{}:;,]|\\s+)/);\n};\n\nfunction diffCss(oldStr, newStr, callback) {\n return cssDiff.diff(oldStr, newStr, callback);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Nzcy5qcyJdLCJuYW1lcyI6WyJjc3NEaWZmIiwiRGlmZiIsInRva2VuaXplIiwidmFsdWUiLCJzcGxpdCIsImRpZmZDc3MiLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7OztBQUVPLElBQU1BLE9BQU8sR0FBRztBQUFJQztBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQSxDQUFKLEVBQWhCOzs7Ozs7QUFDUEQsT0FBTyxDQUFDRSxRQUFSLEdBQW1CLFVBQVNDLEtBQVQsRUFBZ0I7QUFDakMsU0FBT0EsS0FBSyxDQUFDQyxLQUFOLENBQVksZUFBWixDQUFQO0FBQ0QsQ0FGRDs7QUFJTyxTQUFTQyxPQUFULENBQWlCQyxNQUFqQixFQUF5QkMsTUFBekIsRUFBaUNDLFFBQWpDLEVBQTJDO0FBQUUsU0FBT1IsT0FBTyxDQUFDUyxJQUFSLENBQWFILE1BQWIsRUFBcUJDLE1BQXJCLEVBQTZCQyxRQUE3QixDQUFQO0FBQWdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGNvbnN0IGNzc0RpZmYgPSBuZXcgRGlmZigpO1xuY3NzRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5zcGxpdCgvKFt7fTo7LF18XFxzKykvKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQ3NzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykgeyByZXR1cm4gY3NzRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffJson = diffJson;\nexports.canonicalize = canonicalize;\nexports.jsonDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_line = require(\"./line\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*istanbul ignore end*/\nvar objectPrototypeToString = Object.prototype.toString;\nvar jsonDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n](); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a\n// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:\n\n/*istanbul ignore start*/\nexports.jsonDiff = jsonDiff;\n\n/*istanbul ignore end*/\njsonDiff.useLongestToken = true;\njsonDiff.tokenize =\n/*istanbul ignore start*/\n_line\n/*istanbul ignore end*/\n.\n/*istanbul ignore start*/\nlineDiff\n/*istanbul ignore end*/\n.tokenize;\n\njsonDiff.castInput = function (value) {\n /*istanbul ignore start*/\n var _this$options =\n /*istanbul ignore end*/\n this.options,\n undefinedReplacement = _this$options.undefinedReplacement,\n _this$options$stringi = _this$options.stringifyReplacer,\n stringifyReplacer = _this$options$stringi === void 0 ? function (k, v)\n /*istanbul ignore start*/\n {\n return (\n /*istanbul ignore end*/\n typeof v === 'undefined' ? undefinedReplacement : v\n );\n } : _this$options$stringi;\n return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' ');\n};\n\njsonDiff.equals = function (left, right) {\n return (\n /*istanbul ignore start*/\n _base\n /*istanbul ignore end*/\n [\n /*istanbul ignore start*/\n \"default\"\n /*istanbul ignore end*/\n ].prototype.equals.call(jsonDiff, left.replace(/,([\\r\\n])/g, '$1'), right.replace(/,([\\r\\n])/g, '$1'))\n );\n};\n\nfunction diffJson(oldObj, newObj, options) {\n return jsonDiff.diff(oldObj, newObj, options);\n} // This function handles the presence of circular references by bailing out when encountering an\n// object that is already on the \"stack\" of items being processed. Accepts an optional replacer\n\n\nfunction canonicalize(obj, stack, replacementStack, replacer, key) {\n stack = stack || [];\n replacementStack = replacementStack || [];\n\n if (replacer) {\n obj = replacer(key, obj);\n }\n\n var i;\n\n for (i = 0; i < stack.length; i += 1) {\n if (stack[i] === obj) {\n return replacementStack[i];\n }\n }\n\n var canonicalizedObj;\n\n if ('[object Array]' === objectPrototypeToString.call(obj)) {\n stack.push(obj);\n canonicalizedObj = new Array(obj.length);\n replacementStack.push(canonicalizedObj);\n\n for (i = 0; i < obj.length; i += 1) {\n canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key);\n }\n\n stack.pop();\n replacementStack.pop();\n return canonicalizedObj;\n }\n\n if (obj && obj.toJSON) {\n obj = obj.toJSON();\n }\n\n if (\n /*istanbul ignore start*/\n _typeof(\n /*istanbul ignore end*/\n obj) === 'object' && obj !== null) {\n stack.push(obj);\n canonicalizedObj = {};\n replacementStack.push(canonicalizedObj);\n\n var sortedKeys = [],\n _key;\n\n for (_key in obj) {\n /* istanbul ignore else */\n if (obj.hasOwnProperty(_key)) {\n sortedKeys.push(_key);\n }\n }\n\n sortedKeys.sort();\n\n for (i = 0; i < sortedKeys.length; i += 1) {\n _key = sortedKeys[i];\n canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);\n }\n\n stack.pop();\n replacementStack.pop();\n } else {\n canonicalizedObj = obj;\n }\n\n return canonicalizedObj;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2pzb24uanMiXSwibmFtZXMiOlsib2JqZWN0UHJvdG90eXBlVG9TdHJpbmciLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImpzb25EaWZmIiwiRGlmZiIsInVzZUxvbmdlc3RUb2tlbiIsInRva2VuaXplIiwibGluZURpZmYiLCJjYXN0SW5wdXQiLCJ2YWx1ZSIsIm9wdGlvbnMiLCJ1bmRlZmluZWRSZXBsYWNlbWVudCIsInN0cmluZ2lmeVJlcGxhY2VyIiwiayIsInYiLCJKU09OIiwic3RyaW5naWZ5IiwiY2Fub25pY2FsaXplIiwiZXF1YWxzIiwibGVmdCIsInJpZ2h0IiwiY2FsbCIsInJlcGxhY2UiLCJkaWZmSnNvbiIsIm9sZE9iaiIsIm5ld09iaiIsImRpZmYiLCJvYmoiLCJzdGFjayIsInJlcGxhY2VtZW50U3RhY2siLCJyZXBsYWNlciIsImtleSIsImkiLCJsZW5ndGgiLCJjYW5vbmljYWxpemVkT2JqIiwicHVzaCIsIkFycmF5IiwicG9wIiwidG9KU09OIiwic29ydGVkS2V5cyIsImhhc093blByb3BlcnR5Iiwic29ydCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7QUFFQSxJQUFNQSx1QkFBdUIsR0FBR0MsTUFBTSxDQUFDQyxTQUFQLENBQWlCQyxRQUFqRDtBQUdPLElBQU1DLFFBQVEsR0FBRztBQUFJQztBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQSxDQUFKLEVBQWpCLEMsQ0FDUDtBQUNBOzs7Ozs7QUFDQUQsUUFBUSxDQUFDRSxlQUFULEdBQTJCLElBQTNCO0FBRUFGLFFBQVEsQ0FBQ0csUUFBVDtBQUFvQkM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLENBQVNELFFBQTdCOztBQUNBSCxRQUFRLENBQUNLLFNBQVQsR0FBcUIsVUFBU0MsS0FBVCxFQUFnQjtBQUFBO0FBQUE7QUFBQTtBQUMrRSxPQUFLQyxPQURwRjtBQUFBLE1BQzVCQyxvQkFENEIsaUJBQzVCQSxvQkFENEI7QUFBQSw0Q0FDTkMsaUJBRE07QUFBQSxNQUNOQSxpQkFETSxzQ0FDYyxVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFVLGFBQU9BLENBQVAsS0FBYSxXQUFiLEdBQTJCSCxvQkFBM0IsR0FBa0RHO0FBQTVEO0FBQUEsR0FEZDtBQUduQyxTQUFPLE9BQU9MLEtBQVAsS0FBaUIsUUFBakIsR0FBNEJBLEtBQTVCLEdBQW9DTSxJQUFJLENBQUNDLFNBQUwsQ0FBZUMsWUFBWSxDQUFDUixLQUFELEVBQVEsSUFBUixFQUFjLElBQWQsRUFBb0JHLGlCQUFwQixDQUEzQixFQUFtRUEsaUJBQW5FLEVBQXNGLElBQXRGLENBQTNDO0FBQ0QsQ0FKRDs7QUFLQVQsUUFBUSxDQUFDZSxNQUFULEdBQWtCLFVBQVNDLElBQVQsRUFBZUMsS0FBZixFQUFzQjtBQUN0QyxTQUFPaEI7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsTUFBS0gsU0FBTCxDQUFlaUIsTUFBZixDQUFzQkcsSUFBdEIsQ0FBMkJsQixRQUEzQixFQUFxQ2dCLElBQUksQ0FBQ0csT0FBTCxDQUFhLFlBQWIsRUFBMkIsSUFBM0IsQ0FBckMsRUFBdUVGLEtBQUssQ0FBQ0UsT0FBTixDQUFjLFlBQWQsRUFBNEIsSUFBNUIsQ0FBdkU7QUFBUDtBQUNELENBRkQ7O0FBSU8sU0FBU0MsUUFBVCxDQUFrQkMsTUFBbEIsRUFBMEJDLE1BQTFCLEVBQWtDZixPQUFsQyxFQUEyQztBQUFFLFNBQU9QLFFBQVEsQ0FBQ3VCLElBQVQsQ0FBY0YsTUFBZCxFQUFzQkMsTUFBdEIsRUFBOEJmLE9BQTlCLENBQVA7QUFBZ0QsQyxDQUVwRztBQUNBOzs7QUFDTyxTQUFTTyxZQUFULENBQXNCVSxHQUF0QixFQUEyQkMsS0FBM0IsRUFBa0NDLGdCQUFsQyxFQUFvREMsUUFBcEQsRUFBOERDLEdBQTlELEVBQW1FO0FBQ3hFSCxFQUFBQSxLQUFLLEdBQUdBLEtBQUssSUFBSSxFQUFqQjtBQUNBQyxFQUFBQSxnQkFBZ0IsR0FBR0EsZ0JBQWdCLElBQUksRUFBdkM7O0FBRUEsTUFBSUMsUUFBSixFQUFjO0FBQ1pILElBQUFBLEdBQUcsR0FBR0csUUFBUSxDQUFDQyxHQUFELEVBQU1KLEdBQU4sQ0FBZDtBQUNEOztBQUVELE1BQUlLLENBQUo7O0FBRUEsT0FBS0EsQ0FBQyxHQUFHLENBQVQsRUFBWUEsQ0FBQyxHQUFHSixLQUFLLENBQUNLLE1BQXRCLEVBQThCRCxDQUFDLElBQUksQ0FBbkMsRUFBc0M7QUFDcEMsUUFBSUosS0FBSyxDQUFDSSxDQUFELENBQUwsS0FBYUwsR0FBakIsRUFBc0I7QUFDcEIsYUFBT0UsZ0JBQWdCLENBQUNHLENBQUQsQ0FBdkI7QUFDRDtBQUNGOztBQUVELE1BQUlFLGdCQUFKOztBQUVBLE1BQUkscUJBQXFCbkMsdUJBQXVCLENBQUNzQixJQUF4QixDQUE2Qk0sR0FBN0IsQ0FBekIsRUFBNEQ7QUFDMURDLElBQUFBLEtBQUssQ0FBQ08sSUFBTixDQUFXUixHQUFYO0FBQ0FPLElBQUFBLGdCQUFnQixHQUFHLElBQUlFLEtBQUosQ0FBVVQsR0FBRyxDQUFDTSxNQUFkLENBQW5CO0FBQ0FKLElBQUFBLGdCQUFnQixDQUFDTSxJQUFqQixDQUFzQkQsZ0JBQXRCOztBQUNBLFNBQUtGLENBQUMsR0FBRyxDQUFULEVBQVlBLENBQUMsR0FBR0wsR0FBRyxDQUFDTSxNQUFwQixFQUE0QkQsQ0FBQyxJQUFJLENBQWpDLEVBQW9DO0FBQ2xDRSxNQUFBQSxnQkFBZ0IsQ0FBQ0YsQ0FBRCxDQUFoQixHQUFzQmYsWUFBWSxDQUFDVSxHQUFHLENBQUNLLENBQUQsQ0FBSixFQUFTSixLQUFULEVBQWdCQyxnQkFBaEIsRUFBa0NDLFFBQWxDLEVBQTRDQyxHQUE1QyxDQUFsQztBQUNEOztBQUNESCxJQUFBQSxLQUFLLENBQUNTLEdBQU47QUFDQVIsSUFBQUEsZ0JBQWdCLENBQUNRLEdBQWpCO0FBQ0EsV0FBT0gsZ0JBQVA7QUFDRDs7QUFFRCxNQUFJUCxHQUFHLElBQUlBLEdBQUcsQ0FBQ1csTUFBZixFQUF1QjtBQUNyQlgsSUFBQUEsR0FBRyxHQUFHQSxHQUFHLENBQUNXLE1BQUosRUFBTjtBQUNEOztBQUVEO0FBQUk7QUFBQTtBQUFBO0FBQU9YLEVBQUFBLEdBQVAsTUFBZSxRQUFmLElBQTJCQSxHQUFHLEtBQUssSUFBdkMsRUFBNkM7QUFDM0NDLElBQUFBLEtBQUssQ0FBQ08sSUFBTixDQUFXUixHQUFYO0FBQ0FPLElBQUFBLGdCQUFnQixHQUFHLEVBQW5CO0FBQ0FMLElBQUFBLGdCQUFnQixDQUFDTSxJQUFqQixDQUFzQkQsZ0JBQXRCOztBQUNBLFFBQUlLLFVBQVUsR0FBRyxFQUFqQjtBQUFBLFFBQ0lSLElBREo7O0FBRUEsU0FBS0EsSUFBTCxJQUFZSixHQUFaLEVBQWlCO0FBQ2Y7QUFDQSxVQUFJQSxHQUFHLENBQUNhLGNBQUosQ0FBbUJULElBQW5CLENBQUosRUFBNkI7QUFDM0JRLFFBQUFBLFVBQVUsQ0FBQ0osSUFBWCxDQUFnQkosSUFBaEI7QUFDRDtBQUNGOztBQUNEUSxJQUFBQSxVQUFVLENBQUNFLElBQVg7O0FBQ0EsU0FBS1QsQ0FBQyxHQUFHLENBQVQsRUFBWUEsQ0FBQyxHQUFHTyxVQUFVLENBQUNOLE1BQTNCLEVBQW1DRCxDQUFDLElBQUksQ0FBeEMsRUFBMkM7QUFDekNELE1BQUFBLElBQUcsR0FBR1EsVUFBVSxDQUFDUCxDQUFELENBQWhCO0FBQ0FFLE1BQUFBLGdCQUFnQixDQUFDSCxJQUFELENBQWhCLEdBQXdCZCxZQUFZLENBQUNVLEdBQUcsQ0FBQ0ksSUFBRCxDQUFKLEVBQVdILEtBQVgsRUFBa0JDLGdCQUFsQixFQUFvQ0MsUUFBcEMsRUFBOENDLElBQTlDLENBQXBDO0FBQ0Q7O0FBQ0RILElBQUFBLEtBQUssQ0FBQ1MsR0FBTjtBQUNBUixJQUFBQSxnQkFBZ0IsQ0FBQ1EsR0FBakI7QUFDRCxHQW5CRCxNQW1CTztBQUNMSCxJQUFBQSxnQkFBZ0IsR0FBR1AsR0FBbkI7QUFDRDs7QUFDRCxTQUFPTyxnQkFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7bGluZURpZmZ9IGZyb20gJy4vbGluZSc7XG5cbmNvbnN0IG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuXG5leHBvcnQgY29uc3QganNvbkRpZmYgPSBuZXcgRGlmZigpO1xuLy8gRGlzY3JpbWluYXRlIGJldHdlZW4gdHdvIGxpbmVzIG9mIHByZXR0eS1wcmludGVkLCBzZXJpYWxpemVkIEpTT04gd2hlcmUgb25lIG9mIHRoZW0gaGFzIGFcbi8vIGRhbmdsaW5nIGNvbW1hIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4gVHVybnMgb3V0IGluY2x1ZGluZyB0aGUgZGFuZ2xpbmcgY29tbWEgeWllbGRzIHRoZSBuaWNlc3Qgb3V0cHV0OlxuanNvbkRpZmYudXNlTG9uZ2VzdFRva2VuID0gdHJ1ZTtcblxuanNvbkRpZmYudG9rZW5pemUgPSBsaW5lRGlmZi50b2tlbml6ZTtcbmpzb25EaWZmLmNhc3RJbnB1dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGNvbnN0IHt1bmRlZmluZWRSZXBsYWNlbWVudCwgc3RyaW5naWZ5UmVwbGFjZXIgPSAoaywgdikgPT4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkUmVwbGFjZW1lbnQgOiB2fSA9IHRoaXMub3B0aW9ucztcblxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsaXplKHZhbHVlLCBudWxsLCBudWxsLCBzdHJpbmdpZnlSZXBsYWNlciksIHN0cmluZ2lmeVJlcGxhY2VyLCAnICAnKTtcbn07XG5qc29uRGlmZi5lcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICByZXR1cm4gRGlmZi5wcm90b3R5cGUuZXF1YWxzLmNhbGwoanNvbkRpZmYsIGxlZnQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJyksIHJpZ2h0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmSnNvbihvbGRPYmosIG5ld09iaiwgb3B0aW9ucykgeyByZXR1cm4ganNvbkRpZmYuZGlmZihvbGRPYmosIG5ld09iaiwgb3B0aW9ucyk7IH1cblxuLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVzZW5jZSBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGJhaWxpbmcgb3V0IHdoZW4gZW5jb3VudGVyaW5nIGFuXG4vLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLiBBY2NlcHRzIGFuIG9wdGlvbmFsIHJlcGxhY2VyXG5leHBvcnQgZnVuY3Rpb24gY2Fub25pY2FsaXplKG9iaiwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpIHtcbiAgc3RhY2sgPSBzdGFjayB8fCBbXTtcbiAgcmVwbGFjZW1lbnRTdGFjayA9IHJlcGxhY2VtZW50U3RhY2sgfHwgW107XG5cbiAgaWYgKHJlcGxhY2VyKSB7XG4gICAgb2JqID0gcmVwbGFjZXIoa2V5LCBvYmopO1xuICB9XG5cbiAgbGV0IGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHN0YWNrW2ldID09PSBvYmopIHtcbiAgICAgIHJldHVybiByZXBsYWNlbWVudFN0YWNrW2ldO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjYW5vbmljYWxpemVkT2JqO1xuXG4gIGlmICgnW29iamVjdCBBcnJheV0nID09PSBvYmplY3RQcm90b3R5cGVUb1N0cmluZy5jYWxsKG9iaikpIHtcbiAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IG5ldyBBcnJheShvYmoubGVuZ3RoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG4gICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICB9XG4gICAgc3RhY2sucG9wKCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcbiAgICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcbiAgfVxuXG4gIGlmIChvYmogJiYgb2JqLnRvSlNPTikge1xuICAgIG9iaiA9IG9iai50b0pTT04oKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcbiAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IHt9O1xuICAgIHJlcGxhY2VtZW50U3RhY2sucHVzaChjYW5vbmljYWxpemVkT2JqKTtcbiAgICBsZXQgc29ydGVkS2V5cyA9IFtdLFxuICAgICAgICBrZXk7XG4gICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHNvcnRlZEtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0ZWRLZXlzLnNvcnQoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc29ydGVkS2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAga2V5ID0gc29ydGVkS2V5c1tpXTtcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmpba2V5XSA9IGNhbm9uaWNhbGl6ZShvYmpba2V5XSwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpO1xuICAgIH1cbiAgICBzdGFjay5wb3AoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBvYmo7XG4gIH1cbiAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffLines = diffLines;\nexports.diffTrimmedLines = diffTrimmedLines;\nexports.lineDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_params = require(\"../util/params\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nvar lineDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.lineDiff = lineDiff;\n\n/*istanbul ignore end*/\nlineDiff.tokenize = function (value) {\n var retLines = [],\n linesAndNewlines = value.split(/(\\n|\\r\\n)/); // Ignore the final empty token that occurs if the string ends with a new line\n\n if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n linesAndNewlines.pop();\n } // Merge the content and line separators into single tokens\n\n\n for (var i = 0; i < linesAndNewlines.length; i++) {\n var line = linesAndNewlines[i];\n\n if (i % 2 && !this.options.newlineIsToken) {\n retLines[retLines.length - 1] += line;\n } else {\n if (this.options.ignoreWhitespace) {\n line = line.trim();\n }\n\n retLines.push(line);\n }\n }\n\n return retLines;\n};\n\nfunction diffLines(oldStr, newStr, callback) {\n return lineDiff.diff(oldStr, newStr, callback);\n}\n\nfunction diffTrimmedLines(oldStr, newStr, callback) {\n var options =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _params\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n generateOptions)\n /*istanbul ignore end*/\n (callback, {\n ignoreWhitespace: true\n });\n return lineDiff.diff(oldStr, newStr, options);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2xpbmUuanMiXSwibmFtZXMiOlsibGluZURpZmYiLCJEaWZmIiwidG9rZW5pemUiLCJ2YWx1ZSIsInJldExpbmVzIiwibGluZXNBbmROZXdsaW5lcyIsInNwbGl0IiwibGVuZ3RoIiwicG9wIiwiaSIsImxpbmUiLCJvcHRpb25zIiwibmV3bGluZUlzVG9rZW4iLCJpZ25vcmVXaGl0ZXNwYWNlIiwidHJpbSIsInB1c2giLCJkaWZmTGluZXMiLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiLCJkaWZmVHJpbW1lZExpbmVzIiwiZ2VuZXJhdGVPcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxJQUFNQSxRQUFRLEdBQUc7QUFBSUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsQ0FBSixFQUFqQjs7Ozs7O0FBQ1BELFFBQVEsQ0FBQ0UsUUFBVCxHQUFvQixVQUFTQyxLQUFULEVBQWdCO0FBQ2xDLE1BQUlDLFFBQVEsR0FBRyxFQUFmO0FBQUEsTUFDSUMsZ0JBQWdCLEdBQUdGLEtBQUssQ0FBQ0csS0FBTixDQUFZLFdBQVosQ0FEdkIsQ0FEa0MsQ0FJbEM7O0FBQ0EsTUFBSSxDQUFDRCxnQkFBZ0IsQ0FBQ0EsZ0JBQWdCLENBQUNFLE1BQWpCLEdBQTBCLENBQTNCLENBQXJCLEVBQW9EO0FBQ2xERixJQUFBQSxnQkFBZ0IsQ0FBQ0csR0FBakI7QUFDRCxHQVBpQyxDQVNsQzs7O0FBQ0EsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHSixnQkFBZ0IsQ0FBQ0UsTUFBckMsRUFBNkNFLENBQUMsRUFBOUMsRUFBa0Q7QUFDaEQsUUFBSUMsSUFBSSxHQUFHTCxnQkFBZ0IsQ0FBQ0ksQ0FBRCxDQUEzQjs7QUFFQSxRQUFJQSxDQUFDLEdBQUcsQ0FBSixJQUFTLENBQUMsS0FBS0UsT0FBTCxDQUFhQyxjQUEzQixFQUEyQztBQUN6Q1IsTUFBQUEsUUFBUSxDQUFDQSxRQUFRLENBQUNHLE1BQVQsR0FBa0IsQ0FBbkIsQ0FBUixJQUFpQ0csSUFBakM7QUFDRCxLQUZELE1BRU87QUFDTCxVQUFJLEtBQUtDLE9BQUwsQ0FBYUUsZ0JBQWpCLEVBQW1DO0FBQ2pDSCxRQUFBQSxJQUFJLEdBQUdBLElBQUksQ0FBQ0ksSUFBTCxFQUFQO0FBQ0Q7O0FBQ0RWLE1BQUFBLFFBQVEsQ0FBQ1csSUFBVCxDQUFjTCxJQUFkO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPTixRQUFQO0FBQ0QsQ0F4QkQ7O0FBMEJPLFNBQVNZLFNBQVQsQ0FBbUJDLE1BQW5CLEVBQTJCQyxNQUEzQixFQUFtQ0MsUUFBbkMsRUFBNkM7QUFBRSxTQUFPbkIsUUFBUSxDQUFDb0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QkMsUUFBOUIsQ0FBUDtBQUFpRDs7QUFDaEcsU0FBU0UsZ0JBQVQsQ0FBMEJKLE1BQTFCLEVBQWtDQyxNQUFsQyxFQUEwQ0MsUUFBMUMsRUFBb0Q7QUFDekQsTUFBSVIsT0FBTztBQUFHO0FBQUE7QUFBQTs7QUFBQVc7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLEdBQWdCSCxRQUFoQixFQUEwQjtBQUFDTixJQUFBQSxnQkFBZ0IsRUFBRTtBQUFuQixHQUExQixDQUFkO0FBQ0EsU0FBT2IsUUFBUSxDQUFDb0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QlAsT0FBOUIsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7Z2VuZXJhdGVPcHRpb25zfSBmcm9tICcuLi91dGlsL3BhcmFtcyc7XG5cbmV4cG9ydCBjb25zdCBsaW5lRGlmZiA9IG5ldyBEaWZmKCk7XG5saW5lRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGxldCByZXRMaW5lcyA9IFtdLFxuICAgICAgbGluZXNBbmROZXdsaW5lcyA9IHZhbHVlLnNwbGl0KC8oXFxufFxcclxcbikvKTtcblxuICAvLyBJZ25vcmUgdGhlIGZpbmFsIGVtcHR5IHRva2VuIHRoYXQgb2NjdXJzIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGEgbmV3IGxpbmVcbiAgaWYgKCFsaW5lc0FuZE5ld2xpbmVzW2xpbmVzQW5kTmV3bGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICBsaW5lc0FuZE5ld2xpbmVzLnBvcCgpO1xuICB9XG5cbiAgLy8gTWVyZ2UgdGhlIGNvbnRlbnQgYW5kIGxpbmUgc2VwYXJhdG9ycyBpbnRvIHNpbmdsZSB0b2tlbnNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG4gICAgaWYgKGkgJSAyICYmICF0aGlzLm9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG4gICAgICB9XG4gICAgICByZXRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXRMaW5lcztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7IHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbmV4cG9ydCBmdW5jdGlvbiBkaWZmVHJpbW1lZExpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICBsZXQgb3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucyhjYWxsYmFjaywge2lnbm9yZVdoaXRlc3BhY2U6IHRydWV9KTtcbiAgcmV0dXJuIGxpbmVEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuIl19\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffSentences = diffSentences;\nexports.sentenceDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nvar sentenceDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.sentenceDiff = sentenceDiff;\n\n/*istanbul ignore end*/\nsentenceDiff.tokenize = function (value) {\n return value.split(/(\\S.+?[.!?])(?=\\s+|$)/);\n};\n\nfunction diffSentences(oldStr, newStr, callback) {\n return sentenceDiff.diff(oldStr, newStr, callback);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL3NlbnRlbmNlLmpzIl0sIm5hbWVzIjpbInNlbnRlbmNlRGlmZiIsIkRpZmYiLCJ0b2tlbml6ZSIsInZhbHVlIiwic3BsaXQiLCJkaWZmU2VudGVuY2VzIiwib2xkU3RyIiwibmV3U3RyIiwiY2FsbGJhY2siLCJkaWZmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFHTyxJQUFNQSxZQUFZLEdBQUc7QUFBSUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsQ0FBSixFQUFyQjs7Ozs7O0FBQ1BELFlBQVksQ0FBQ0UsUUFBYixHQUF3QixVQUFTQyxLQUFULEVBQWdCO0FBQ3RDLFNBQU9BLEtBQUssQ0FBQ0MsS0FBTixDQUFZLHVCQUFaLENBQVA7QUFDRCxDQUZEOztBQUlPLFNBQVNDLGFBQVQsQ0FBdUJDLE1BQXZCLEVBQStCQyxNQUEvQixFQUF1Q0MsUUFBdkMsRUFBaUQ7QUFBRSxTQUFPUixZQUFZLENBQUNTLElBQWIsQ0FBa0JILE1BQWxCLEVBQTBCQyxNQUExQixFQUFrQ0MsUUFBbEMsQ0FBUDtBQUFxRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5cblxuZXhwb3J0IGNvbnN0IHNlbnRlbmNlRGlmZiA9IG5ldyBEaWZmKCk7XG5zZW50ZW5jZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhcXFMuKz9bLiE/XSkoPz1cXHMrfCQpLyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZlNlbnRlbmNlcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHsgcmV0dXJuIHNlbnRlbmNlRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffWords = diffWords;\nexports.diffWordsWithSpace = diffWordsWithSpace;\nexports.wordDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_params = require(\"../util/params\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\n// Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode\n//\n// Ranges and exceptions:\n// Latin-1 Supplement, 0080–00FF\n// - U+00D7 × Multiplication sign\n// - U+00F7 ÷ Division sign\n// Latin Extended-A, 0100–017F\n// Latin Extended-B, 0180–024F\n// IPA Extensions, 0250–02AF\n// Spacing Modifier Letters, 02B0–02FF\n// - U+02C7 ˇ ˇ Caron\n// - U+02D8 ˘ ˘ Breve\n// - U+02D9 ˙ ˙ Dot Above\n// - U+02DA ˚ ˚ Ring Above\n// - U+02DB ˛ ˛ Ogonek\n// - U+02DC ˜ ˜ Small Tilde\n// - U+02DD ˝ ˝ Double Acute Accent\n// Latin Extended Additional, 1E00–1EFF\nvar extendedWordChars = /^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/;\nvar reWhitespace = /\\S/;\nvar wordDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.wordDiff = wordDiff;\n\n/*istanbul ignore end*/\nwordDiff.equals = function (left, right) {\n if (this.options.ignoreCase) {\n left = left.toLowerCase();\n right = right.toLowerCase();\n }\n\n return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);\n};\n\nwordDiff.tokenize = function (value) {\n // All whitespace symbols except newline group into one token, each newline - in separate token\n var tokens = value.split(/([^\\S\\r\\n]+|[()[\\]{}'\"\\r\\n]|\\b)/); // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.\n\n for (var i = 0; i < tokens.length - 1; i++) {\n // If we have an empty string in the next field and we have only word chars before and after, merge\n if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {\n tokens[i] += tokens[i + 2];\n tokens.splice(i + 1, 2);\n i--;\n }\n }\n\n return tokens;\n};\n\nfunction diffWords(oldStr, newStr, options) {\n options =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _params\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n generateOptions)\n /*istanbul ignore end*/\n (options, {\n ignoreWhitespace: true\n });\n return wordDiff.diff(oldStr, newStr, options);\n}\n\nfunction diffWordsWithSpace(oldStr, newStr, options) {\n return wordDiff.diff(oldStr, newStr, options);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL3dvcmQuanMiXSwibmFtZXMiOlsiZXh0ZW5kZWRXb3JkQ2hhcnMiLCJyZVdoaXRlc3BhY2UiLCJ3b3JkRGlmZiIsIkRpZmYiLCJlcXVhbHMiLCJsZWZ0IiwicmlnaHQiLCJvcHRpb25zIiwiaWdub3JlQ2FzZSIsInRvTG93ZXJDYXNlIiwiaWdub3JlV2hpdGVzcGFjZSIsInRlc3QiLCJ0b2tlbml6ZSIsInZhbHVlIiwidG9rZW5zIiwic3BsaXQiLCJpIiwibGVuZ3RoIiwic3BsaWNlIiwiZGlmZldvcmRzIiwib2xkU3RyIiwibmV3U3RyIiwiZ2VuZXJhdGVPcHRpb25zIiwiZGlmZiIsImRpZmZXb3Jkc1dpdGhTcGFjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTUEsaUJBQWlCLEdBQUcsK0RBQTFCO0FBRUEsSUFBTUMsWUFBWSxHQUFHLElBQXJCO0FBRU8sSUFBTUMsUUFBUSxHQUFHO0FBQUlDO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBLENBQUosRUFBakI7Ozs7OztBQUNQRCxRQUFRLENBQUNFLE1BQVQsR0FBa0IsVUFBU0MsSUFBVCxFQUFlQyxLQUFmLEVBQXNCO0FBQ3RDLE1BQUksS0FBS0MsT0FBTCxDQUFhQyxVQUFqQixFQUE2QjtBQUMzQkgsSUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNJLFdBQUwsRUFBUDtBQUNBSCxJQUFBQSxLQUFLLEdBQUdBLEtBQUssQ0FBQ0csV0FBTixFQUFSO0FBQ0Q7O0FBQ0QsU0FBT0osSUFBSSxLQUFLQyxLQUFULElBQW1CLEtBQUtDLE9BQUwsQ0FBYUcsZ0JBQWIsSUFBaUMsQ0FBQ1QsWUFBWSxDQUFDVSxJQUFiLENBQWtCTixJQUFsQixDQUFsQyxJQUE2RCxDQUFDSixZQUFZLENBQUNVLElBQWIsQ0FBa0JMLEtBQWxCLENBQXhGO0FBQ0QsQ0FORDs7QUFPQUosUUFBUSxDQUFDVSxRQUFULEdBQW9CLFVBQVNDLEtBQVQsRUFBZ0I7QUFDbEM7QUFDQSxNQUFJQyxNQUFNLEdBQUdELEtBQUssQ0FBQ0UsS0FBTixDQUFZLGlDQUFaLENBQWIsQ0FGa0MsQ0FJbEM7O0FBQ0EsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRixNQUFNLENBQUNHLE1BQVAsR0FBZ0IsQ0FBcEMsRUFBdUNELENBQUMsRUFBeEMsRUFBNEM7QUFDMUM7QUFDQSxRQUFJLENBQUNGLE1BQU0sQ0FBQ0UsQ0FBQyxHQUFHLENBQUwsQ0FBUCxJQUFrQkYsTUFBTSxDQUFDRSxDQUFDLEdBQUcsQ0FBTCxDQUF4QixJQUNLaEIsaUJBQWlCLENBQUNXLElBQWxCLENBQXVCRyxNQUFNLENBQUNFLENBQUQsQ0FBN0IsQ0FETCxJQUVLaEIsaUJBQWlCLENBQUNXLElBQWxCLENBQXVCRyxNQUFNLENBQUNFLENBQUMsR0FBRyxDQUFMLENBQTdCLENBRlQsRUFFZ0Q7QUFDOUNGLE1BQUFBLE1BQU0sQ0FBQ0UsQ0FBRCxDQUFOLElBQWFGLE1BQU0sQ0FBQ0UsQ0FBQyxHQUFHLENBQUwsQ0FBbkI7QUFDQUYsTUFBQUEsTUFBTSxDQUFDSSxNQUFQLENBQWNGLENBQUMsR0FBRyxDQUFsQixFQUFxQixDQUFyQjtBQUNBQSxNQUFBQSxDQUFDO0FBQ0Y7QUFDRjs7QUFFRCxTQUFPRixNQUFQO0FBQ0QsQ0FqQkQ7O0FBbUJPLFNBQVNLLFNBQVQsQ0FBbUJDLE1BQW5CLEVBQTJCQyxNQUEzQixFQUFtQ2QsT0FBbkMsRUFBNEM7QUFDakRBLEVBQUFBLE9BQU87QUFBRztBQUFBO0FBQUE7O0FBQUFlO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxHQUFnQmYsT0FBaEIsRUFBeUI7QUFBQ0csSUFBQUEsZ0JBQWdCLEVBQUU7QUFBbkIsR0FBekIsQ0FBVjtBQUNBLFNBQU9SLFFBQVEsQ0FBQ3FCLElBQVQsQ0FBY0gsTUFBZCxFQUFzQkMsTUFBdEIsRUFBOEJkLE9BQTlCLENBQVA7QUFDRDs7QUFFTSxTQUFTaUIsa0JBQVQsQ0FBNEJKLE1BQTVCLEVBQW9DQyxNQUFwQyxFQUE0Q2QsT0FBNUMsRUFBcUQ7QUFDMUQsU0FBT0wsUUFBUSxDQUFDcUIsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmQsT0FBOUIsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7Z2VuZXJhdGVPcHRpb25zfSBmcm9tICcuLi91dGlsL3BhcmFtcyc7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX3NjcmlwdF9pbl9Vbmljb2RlXG4vL1xuLy8gUmFuZ2VzIGFuZCBleGNlcHRpb25zOlxuLy8gTGF0aW4tMSBTdXBwbGVtZW50LCAwMDgw4oCTMDBGRlxuLy8gIC0gVSswMEQ3ICDDlyBNdWx0aXBsaWNhdGlvbiBzaWduXG4vLyAgLSBVKzAwRjcgIMO3IERpdmlzaW9uIHNpZ25cbi8vIExhdGluIEV4dGVuZGVkLUEsIDAxMDDigJMwMTdGXG4vLyBMYXRpbiBFeHRlbmRlZC1CLCAwMTgw4oCTMDI0RlxuLy8gSVBBIEV4dGVuc2lvbnMsIDAyNTDigJMwMkFGXG4vLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMsIDAyQjDigJMwMkZGXG4vLyAgLSBVKzAyQzcgIMuHICYjNzExOyAgQ2Fyb25cbi8vICAtIFUrMDJEOCAgy5ggJiM3Mjg7ICBCcmV2ZVxuLy8gIC0gVSswMkQ5ICDLmSAmIzcyOTsgIERvdCBBYm92ZVxuLy8gIC0gVSswMkRBICDLmiAmIzczMDsgIFJpbmcgQWJvdmVcbi8vICAtIFUrMDJEQiAgy5sgJiM3MzE7ICBPZ29uZWtcbi8vICAtIFUrMDJEQyAgy5wgJiM3MzI7ICBTbWFsbCBUaWxkZVxuLy8gIC0gVSswMkREICDLnSAmIzczMzsgIERvdWJsZSBBY3V0ZSBBY2NlbnRcbi8vIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwsIDFFMDDigJMxRUZGXG5jb25zdCBleHRlbmRlZFdvcmRDaGFycyA9IC9eW2EtekEtWlxcdXtDMH0tXFx1e0ZGfVxcdXtEOH0tXFx1e0Y2fVxcdXtGOH0tXFx1ezJDNn1cXHV7MkM4fS1cXHV7MkQ3fVxcdXsyREV9LVxcdXsyRkZ9XFx1ezFFMDB9LVxcdXsxRUZGfV0rJC91O1xuXG5jb25zdCByZVdoaXRlc3BhY2UgPSAvXFxTLztcblxuZXhwb3J0IGNvbnN0IHdvcmREaWZmID0gbmV3IERpZmYoKTtcbndvcmREaWZmLmVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSkge1xuICAgIGxlZnQgPSBsZWZ0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmlnaHQgPSByaWdodC50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCAodGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UgJiYgIXJlV2hpdGVzcGFjZS50ZXN0KGxlZnQpICYmICFyZVdoaXRlc3BhY2UudGVzdChyaWdodCkpO1xufTtcbndvcmREaWZmLnRva2VuaXplID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgLy8gQWxsIHdoaXRlc3BhY2Ugc3ltYm9scyBleGNlcHQgbmV3bGluZSBncm91cCBpbnRvIG9uZSB0b2tlbiwgZWFjaCBuZXdsaW5lIC0gaW4gc2VwYXJhdGUgdG9rZW5cbiAgbGV0IHRva2VucyA9IHZhbHVlLnNwbGl0KC8oW15cXFNcXHJcXG5dK3xbKClbXFxde30nXCJcXHJcXG5dfFxcYikvKTtcblxuICAvLyBKb2luIHRoZSBib3VuZGFyeSBzcGxpdHMgdGhhdCB3ZSBkbyBub3QgY29uc2lkZXIgdG8gYmUgYm91bmRhcmllcy4gVGhpcyBpcyBwcmltYXJpbHkgdGhlIGV4dGVuZGVkIExhdGluIGNoYXJhY3RlciBzZXQuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gZW1wdHkgc3RyaW5nIGluIHRoZSBuZXh0IGZpZWxkIGFuZCB3ZSBoYXZlIG9ubHkgd29yZCBjaGFycyBiZWZvcmUgYW5kIGFmdGVyLCBtZXJnZVxuICAgIGlmICghdG9rZW5zW2kgKyAxXSAmJiB0b2tlbnNbaSArIDJdXG4gICAgICAgICAgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaV0pXG4gICAgICAgICAgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaSArIDJdKSkge1xuICAgICAgdG9rZW5zW2ldICs9IHRva2Vuc1tpICsgMl07XG4gICAgICB0b2tlbnMuc3BsaWNlKGkgKyAxLCAyKTtcbiAgICAgIGktLTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZXb3JkcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICBvcHRpb25zID0gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIHtpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlfSk7XG4gIHJldHVybiB3b3JkRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZXb3Jkc1dpdGhTcGFjZShvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"Diff\", {\n enumerable: true,\n get: function get() {\n return _base[\"default\"];\n }\n});\nObject.defineProperty(exports, \"diffChars\", {\n enumerable: true,\n get: function get() {\n return _character.diffChars;\n }\n});\nObject.defineProperty(exports, \"diffWords\", {\n enumerable: true,\n get: function get() {\n return _word.diffWords;\n }\n});\nObject.defineProperty(exports, \"diffWordsWithSpace\", {\n enumerable: true,\n get: function get() {\n return _word.diffWordsWithSpace;\n }\n});\nObject.defineProperty(exports, \"diffLines\", {\n enumerable: true,\n get: function get() {\n return _line.diffLines;\n }\n});\nObject.defineProperty(exports, \"diffTrimmedLines\", {\n enumerable: true,\n get: function get() {\n return _line.diffTrimmedLines;\n }\n});\nObject.defineProperty(exports, \"diffSentences\", {\n enumerable: true,\n get: function get() {\n return _sentence.diffSentences;\n }\n});\nObject.defineProperty(exports, \"diffCss\", {\n enumerable: true,\n get: function get() {\n return _css.diffCss;\n }\n});\nObject.defineProperty(exports, \"diffJson\", {\n enumerable: true,\n get: function get() {\n return _json.diffJson;\n }\n});\nObject.defineProperty(exports, \"canonicalize\", {\n enumerable: true,\n get: function get() {\n return _json.canonicalize;\n }\n});\nObject.defineProperty(exports, \"diffArrays\", {\n enumerable: true,\n get: function get() {\n return _array.diffArrays;\n }\n});\nObject.defineProperty(exports, \"applyPatch\", {\n enumerable: true,\n get: function get() {\n return _apply.applyPatch;\n }\n});\nObject.defineProperty(exports, \"applyPatches\", {\n enumerable: true,\n get: function get() {\n return _apply.applyPatches;\n }\n});\nObject.defineProperty(exports, \"parsePatch\", {\n enumerable: true,\n get: function get() {\n return _parse.parsePatch;\n }\n});\nObject.defineProperty(exports, \"merge\", {\n enumerable: true,\n get: function get() {\n return _merge.merge;\n }\n});\nObject.defineProperty(exports, \"structuredPatch\", {\n enumerable: true,\n get: function get() {\n return _create.structuredPatch;\n }\n});\nObject.defineProperty(exports, \"createTwoFilesPatch\", {\n enumerable: true,\n get: function get() {\n return _create.createTwoFilesPatch;\n }\n});\nObject.defineProperty(exports, \"createPatch\", {\n enumerable: true,\n get: function get() {\n return _create.createPatch;\n }\n});\nObject.defineProperty(exports, \"convertChangesToDMP\", {\n enumerable: true,\n get: function get() {\n return _dmp.convertChangesToDMP;\n }\n});\nObject.defineProperty(exports, \"convertChangesToXML\", {\n enumerable: true,\n get: function get() {\n return _xml.convertChangesToXML;\n }\n});\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./diff/base\"))\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_character = require(\"./diff/character\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_word = require(\"./diff/word\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_line = require(\"./diff/line\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_sentence = require(\"./diff/sentence\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_css = require(\"./diff/css\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_json = require(\"./diff/json\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_array = require(\"./diff/array\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_apply = require(\"./patch/apply\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_parse = require(\"./patch/parse\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_merge = require(\"./patch/merge\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_create = require(\"./patch/create\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_dmp = require(\"./convert/dmp\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_xml = require(\"./convert/xml\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBTZWUgTElDRU5TRSBmaWxlIGZvciB0ZXJtcyBvZiB1c2UgKi9cblxuLypcbiAqIFRleHQgZGlmZiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBUElTOlxuICogSnNEaWZmLmRpZmZDaGFyczogQ2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBkaWZmXG4gKiBKc0RpZmYuZGlmZldvcmRzOiBXb3JkIChhcyBkZWZpbmVkIGJ5IFxcYiByZWdleCkgZGlmZiB3aGljaCBpZ25vcmVzIHdoaXRlc3BhY2VcbiAqIEpzRGlmZi5kaWZmTGluZXM6IExpbmUgYmFzZWQgZGlmZlxuICpcbiAqIEpzRGlmZi5kaWZmQ3NzOiBEaWZmIHRhcmdldGVkIGF0IENTUyBjb250ZW50XG4gKlxuICogVGhlc2UgbWV0aG9kcyBhcmUgYmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uIHByb3Bvc2VkIGluXG4gKiBcIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9uc1wiIChNeWVycywgMTk4NikuXG4gKiBodHRwOi8vY2l0ZXNlZXJ4LmlzdC5wc3UuZWR1L3ZpZXdkb2Mvc3VtbWFyeT9kb2k9MTAuMS4xLjQuNjkyN1xuICovXG5pbXBvcnQgRGlmZiBmcm9tICcuL2RpZmYvYmFzZSc7XG5pbXBvcnQge2RpZmZDaGFyc30gZnJvbSAnLi9kaWZmL2NoYXJhY3Rlcic7XG5pbXBvcnQge2RpZmZXb3JkcywgZGlmZldvcmRzV2l0aFNwYWNlfSBmcm9tICcuL2RpZmYvd29yZCc7XG5pbXBvcnQge2RpZmZMaW5lcywgZGlmZlRyaW1tZWRMaW5lc30gZnJvbSAnLi9kaWZmL2xpbmUnO1xuaW1wb3J0IHtkaWZmU2VudGVuY2VzfSBmcm9tICcuL2RpZmYvc2VudGVuY2UnO1xuXG5pbXBvcnQge2RpZmZDc3N9IGZyb20gJy4vZGlmZi9jc3MnO1xuaW1wb3J0IHtkaWZmSnNvbiwgY2Fub25pY2FsaXplfSBmcm9tICcuL2RpZmYvanNvbic7XG5cbmltcG9ydCB7ZGlmZkFycmF5c30gZnJvbSAnLi9kaWZmL2FycmF5JztcblxuaW1wb3J0IHthcHBseVBhdGNoLCBhcHBseVBhdGNoZXN9IGZyb20gJy4vcGF0Y2gvYXBwbHknO1xuaW1wb3J0IHtwYXJzZVBhdGNofSBmcm9tICcuL3BhdGNoL3BhcnNlJztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJy4vcGF0Y2gvbWVyZ2UnO1xuaW1wb3J0IHtzdHJ1Y3R1cmVkUGF0Y2gsIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gsIGNyZWF0ZVBhdGNofSBmcm9tICcuL3BhdGNoL2NyZWF0ZSc7XG5cbmltcG9ydCB7Y29udmVydENoYW5nZXNUb0RNUH0gZnJvbSAnLi9jb252ZXJ0L2RtcCc7XG5pbXBvcnQge2NvbnZlcnRDaGFuZ2VzVG9YTUx9IGZyb20gJy4vY29udmVydC94bWwnO1xuXG5leHBvcnQge1xuICBEaWZmLFxuXG4gIGRpZmZDaGFycyxcbiAgZGlmZldvcmRzLFxuICBkaWZmV29yZHNXaXRoU3BhY2UsXG4gIGRpZmZMaW5lcyxcbiAgZGlmZlRyaW1tZWRMaW5lcyxcbiAgZGlmZlNlbnRlbmNlcyxcblxuICBkaWZmQ3NzLFxuICBkaWZmSnNvbixcblxuICBkaWZmQXJyYXlzLFxuXG4gIHN0cnVjdHVyZWRQYXRjaCxcbiAgY3JlYXRlVHdvRmlsZXNQYXRjaCxcbiAgY3JlYXRlUGF0Y2gsXG4gIGFwcGx5UGF0Y2gsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgcGFyc2VQYXRjaCxcbiAgbWVyZ2UsXG4gIGNvbnZlcnRDaGFuZ2VzVG9ETVAsXG4gIGNvbnZlcnRDaGFuZ2VzVG9YTUwsXG4gIGNhbm9uaWNhbGl6ZVxufTtcbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.applyPatch = applyPatch;\nexports.applyPatches = applyPatches;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_parse = require(\"./parse\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_distanceIterator = _interopRequireDefault(require(\"../util/distance-iterator\"))\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nfunction applyPatch(source, uniDiff) {\n /*istanbul ignore start*/\n var\n /*istanbul ignore end*/\n options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (typeof uniDiff === 'string') {\n uniDiff =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _parse\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n parsePatch)\n /*istanbul ignore end*/\n (uniDiff);\n }\n\n if (Array.isArray(uniDiff)) {\n if (uniDiff.length > 1) {\n throw new Error('applyPatch only works with a single input.');\n }\n\n uniDiff = uniDiff[0];\n } // Apply the diff to the input\n\n\n var lines = source.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n delimiters = source.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n hunks = uniDiff.hunks,\n compareLine = options.compareLine || function (lineNumber, line, operation, patchContent)\n /*istanbul ignore start*/\n {\n return (\n /*istanbul ignore end*/\n line === patchContent\n );\n },\n errorCount = 0,\n fuzzFactor = options.fuzzFactor || 0,\n minLine = 0,\n offset = 0,\n removeEOFNL,\n addEOFNL;\n /**\n * Checks if the hunk exactly fits on the provided location\n */\n\n\n function hunkFits(hunk, toPos) {\n for (var j = 0; j < hunk.lines.length; j++) {\n var line = hunk.lines[j],\n operation = line.length > 0 ? line[0] : ' ',\n content = line.length > 0 ? line.substr(1) : line;\n\n if (operation === ' ' || operation === '-') {\n // Context sanity check\n if (!compareLine(toPos + 1, lines[toPos], operation, content)) {\n errorCount++;\n\n if (errorCount > fuzzFactor) {\n return false;\n }\n }\n\n toPos++;\n }\n }\n\n return true;\n } // Search best fit offsets for each hunk based on the previous ones\n\n\n for (var i = 0; i < hunks.length; i++) {\n var hunk = hunks[i],\n maxLine = lines.length - hunk.oldLines,\n localOffset = 0,\n toPos = offset + hunk.oldStart - 1;\n var iterator =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _distanceIterator\n /*istanbul ignore end*/\n [\n /*istanbul ignore start*/\n \"default\"\n /*istanbul ignore end*/\n ])(toPos, minLine, maxLine);\n\n for (; localOffset !== undefined; localOffset = iterator()) {\n if (hunkFits(hunk, toPos + localOffset)) {\n hunk.offset = offset += localOffset;\n break;\n }\n }\n\n if (localOffset === undefined) {\n return false;\n } // Set lower text limit to end of the current hunk, so next ones don't try\n // to fit over already patched text\n\n\n minLine = hunk.offset + hunk.oldStart + hunk.oldLines;\n } // Apply patch hunks\n\n\n var diffOffset = 0;\n\n for (var _i = 0; _i < hunks.length; _i++) {\n var _hunk = hunks[_i],\n _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;\n\n diffOffset += _hunk.newLines - _hunk.oldLines;\n\n for (var j = 0; j < _hunk.lines.length; j++) {\n var line = _hunk.lines[j],\n operation = line.length > 0 ? line[0] : ' ',\n content = line.length > 0 ? line.substr(1) : line,\n delimiter = _hunk.linedelimiters[j];\n\n if (operation === ' ') {\n _toPos++;\n } else if (operation === '-') {\n lines.splice(_toPos, 1);\n delimiters.splice(_toPos, 1);\n /* istanbul ignore else */\n } else if (operation === '+') {\n lines.splice(_toPos, 0, content);\n delimiters.splice(_toPos, 0, delimiter);\n _toPos++;\n } else if (operation === '\\\\') {\n var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;\n\n if (previousOperation === '+') {\n removeEOFNL = true;\n } else if (previousOperation === '-') {\n addEOFNL = true;\n }\n }\n }\n } // Handle EOFNL insertion/removal\n\n\n if (removeEOFNL) {\n while (!lines[lines.length - 1]) {\n lines.pop();\n delimiters.pop();\n }\n } else if (addEOFNL) {\n lines.push('');\n delimiters.push('\\n');\n }\n\n for (var _k = 0; _k < lines.length - 1; _k++) {\n lines[_k] = lines[_k] + delimiters[_k];\n }\n\n return lines.join('');\n} // Wrapper that supports multiple file patches via callbacks.\n\n\nfunction applyPatches(uniDiff, options) {\n if (typeof uniDiff === 'string') {\n uniDiff =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _parse\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n parsePatch)\n /*istanbul ignore end*/\n (uniDiff);\n }\n\n var currentIndex = 0;\n\n function processIndex() {\n var index = uniDiff[currentIndex++];\n\n if (!index) {\n return options.complete();\n }\n\n options.loadFile(index, function (err, data) {\n if (err) {\n return options.complete(err);\n }\n\n var updatedContent = applyPatch(data, index, options);\n options.patched(index, updatedContent, function (err) {\n if (err) {\n return options.complete(err);\n }\n\n processIndex();\n });\n });\n }\n\n processIndex();\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6WyJhcHBseVBhdGNoIiwic291cmNlIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJwYXJzZVBhdGNoIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiRXJyb3IiLCJsaW5lcyIsInNwbGl0IiwiZGVsaW1pdGVycyIsIm1hdGNoIiwiaHVua3MiLCJjb21wYXJlTGluZSIsImxpbmVOdW1iZXIiLCJsaW5lIiwib3BlcmF0aW9uIiwicGF0Y2hDb250ZW50IiwiZXJyb3JDb3VudCIsImZ1enpGYWN0b3IiLCJtaW5MaW5lIiwib2Zmc2V0IiwicmVtb3ZlRU9GTkwiLCJhZGRFT0ZOTCIsImh1bmtGaXRzIiwiaHVuayIsInRvUG9zIiwiaiIsImNvbnRlbnQiLCJzdWJzdHIiLCJpIiwibWF4TGluZSIsIm9sZExpbmVzIiwibG9jYWxPZmZzZXQiLCJvbGRTdGFydCIsIml0ZXJhdG9yIiwiZGlzdGFuY2VJdGVyYXRvciIsInVuZGVmaW5lZCIsImRpZmZPZmZzZXQiLCJuZXdMaW5lcyIsImRlbGltaXRlciIsImxpbmVkZWxpbWl0ZXJzIiwic3BsaWNlIiwicHJldmlvdXNPcGVyYXRpb24iLCJwb3AiLCJwdXNoIiwiX2siLCJqb2luIiwiYXBwbHlQYXRjaGVzIiwiY3VycmVudEluZGV4IiwicHJvY2Vzc0luZGV4IiwiaW5kZXgiLCJjb21wbGV0ZSIsImxvYWRGaWxlIiwiZXJyIiwiZGF0YSIsInVwZGF0ZWRDb250ZW50IiwicGF0Y2hlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxTQUFTQSxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsT0FBNUIsRUFBbUQ7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJOztBQUN4RCxNQUFJLE9BQU9ELE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7QUFDL0JBLElBQUFBLE9BQU87QUFBRztBQUFBO0FBQUE7O0FBQUFFO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxLQUFXRixPQUFYLENBQVY7QUFDRDs7QUFFRCxNQUFJRyxLQUFLLENBQUNDLE9BQU4sQ0FBY0osT0FBZCxDQUFKLEVBQTRCO0FBQzFCLFFBQUlBLE9BQU8sQ0FBQ0ssTUFBUixHQUFpQixDQUFyQixFQUF3QjtBQUN0QixZQUFNLElBQUlDLEtBQUosQ0FBVSw0Q0FBVixDQUFOO0FBQ0Q7O0FBRUROLElBQUFBLE9BQU8sR0FBR0EsT0FBTyxDQUFDLENBQUQsQ0FBakI7QUFDRCxHQVh1RCxDQWF4RDs7O0FBQ0EsTUFBSU8sS0FBSyxHQUFHUixNQUFNLENBQUNTLEtBQVAsQ0FBYSxxQkFBYixDQUFaO0FBQUEsTUFDSUMsVUFBVSxHQUFHVixNQUFNLENBQUNXLEtBQVAsQ0FBYSxzQkFBYixLQUF3QyxFQUR6RDtBQUFBLE1BRUlDLEtBQUssR0FBR1gsT0FBTyxDQUFDVyxLQUZwQjtBQUFBLE1BSUlDLFdBQVcsR0FBR1gsT0FBTyxDQUFDVyxXQUFSLElBQXdCLFVBQUNDLFVBQUQsRUFBYUMsSUFBYixFQUFtQkMsU0FBbkIsRUFBOEJDLFlBQTlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0NGLE1BQUFBLElBQUksS0FBS0U7QUFBeEQ7QUFBQSxHQUoxQztBQUFBLE1BS0lDLFVBQVUsR0FBRyxDQUxqQjtBQUFBLE1BTUlDLFVBQVUsR0FBR2pCLE9BQU8sQ0FBQ2lCLFVBQVIsSUFBc0IsQ0FOdkM7QUFBQSxNQU9JQyxPQUFPLEdBQUcsQ0FQZDtBQUFBLE1BUUlDLE1BQU0sR0FBRyxDQVJiO0FBQUEsTUFVSUMsV0FWSjtBQUFBLE1BV0lDLFFBWEo7QUFhQTs7Ozs7QUFHQSxXQUFTQyxRQUFULENBQWtCQyxJQUFsQixFQUF3QkMsS0FBeEIsRUFBK0I7QUFDN0IsU0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRixJQUFJLENBQUNqQixLQUFMLENBQVdGLE1BQS9CLEVBQXVDcUIsQ0FBQyxFQUF4QyxFQUE0QztBQUMxQyxVQUFJWixJQUFJLEdBQUdVLElBQUksQ0FBQ2pCLEtBQUwsQ0FBV21CLENBQVgsQ0FBWDtBQUFBLFVBQ0lYLFNBQVMsR0FBSUQsSUFBSSxDQUFDVCxNQUFMLEdBQWMsQ0FBZCxHQUFrQlMsSUFBSSxDQUFDLENBQUQsQ0FBdEIsR0FBNEIsR0FEN0M7QUFBQSxVQUVJYSxPQUFPLEdBQUliLElBQUksQ0FBQ1QsTUFBTCxHQUFjLENBQWQsR0FBa0JTLElBQUksQ0FBQ2MsTUFBTCxDQUFZLENBQVosQ0FBbEIsR0FBbUNkLElBRmxEOztBQUlBLFVBQUlDLFNBQVMsS0FBSyxHQUFkLElBQXFCQSxTQUFTLEtBQUssR0FBdkMsRUFBNEM7QUFDMUM7QUFDQSxZQUFJLENBQUNILFdBQVcsQ0FBQ2EsS0FBSyxHQUFHLENBQVQsRUFBWWxCLEtBQUssQ0FBQ2tCLEtBQUQsQ0FBakIsRUFBMEJWLFNBQTFCLEVBQXFDWSxPQUFyQyxDQUFoQixFQUErRDtBQUM3RFYsVUFBQUEsVUFBVTs7QUFFVixjQUFJQSxVQUFVLEdBQUdDLFVBQWpCLEVBQTZCO0FBQzNCLG1CQUFPLEtBQVA7QUFDRDtBQUNGOztBQUNETyxRQUFBQSxLQUFLO0FBQ047QUFDRjs7QUFFRCxXQUFPLElBQVA7QUFDRCxHQWxEdUQsQ0FvRHhEOzs7QUFDQSxPQUFLLElBQUlJLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdsQixLQUFLLENBQUNOLE1BQTFCLEVBQWtDd0IsQ0FBQyxFQUFuQyxFQUF1QztBQUNyQyxRQUFJTCxJQUFJLEdBQUdiLEtBQUssQ0FBQ2tCLENBQUQsQ0FBaEI7QUFBQSxRQUNJQyxPQUFPLEdBQUd2QixLQUFLLENBQUNGLE1BQU4sR0FBZW1CLElBQUksQ0FBQ08sUUFEbEM7QUFBQSxRQUVJQyxXQUFXLEdBQUcsQ0FGbEI7QUFBQSxRQUdJUCxLQUFLLEdBQUdMLE1BQU0sR0FBR0ksSUFBSSxDQUFDUyxRQUFkLEdBQXlCLENBSHJDO0FBS0EsUUFBSUMsUUFBUTtBQUFHO0FBQUE7QUFBQTs7QUFBQUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsT0FBaUJWLEtBQWpCLEVBQXdCTixPQUF4QixFQUFpQ1csT0FBakMsQ0FBZjs7QUFFQSxXQUFPRSxXQUFXLEtBQUtJLFNBQXZCLEVBQWtDSixXQUFXLEdBQUdFLFFBQVEsRUFBeEQsRUFBNEQ7QUFDMUQsVUFBSVgsUUFBUSxDQUFDQyxJQUFELEVBQU9DLEtBQUssR0FBR08sV0FBZixDQUFaLEVBQXlDO0FBQ3ZDUixRQUFBQSxJQUFJLENBQUNKLE1BQUwsR0FBY0EsTUFBTSxJQUFJWSxXQUF4QjtBQUNBO0FBQ0Q7QUFDRjs7QUFFRCxRQUFJQSxXQUFXLEtBQUtJLFNBQXBCLEVBQStCO0FBQzdCLGFBQU8sS0FBUDtBQUNELEtBakJvQyxDQW1CckM7QUFDQTs7O0FBQ0FqQixJQUFBQSxPQUFPLEdBQUdLLElBQUksQ0FBQ0osTUFBTCxHQUFjSSxJQUFJLENBQUNTLFFBQW5CLEdBQThCVCxJQUFJLENBQUNPLFFBQTdDO0FBQ0QsR0EzRXVELENBNkV4RDs7O0FBQ0EsTUFBSU0sVUFBVSxHQUFHLENBQWpCOztBQUNBLE9BQUssSUFBSVIsRUFBQyxHQUFHLENBQWIsRUFBZ0JBLEVBQUMsR0FBR2xCLEtBQUssQ0FBQ04sTUFBMUIsRUFBa0N3QixFQUFDLEVBQW5DLEVBQXVDO0FBQ3JDLFFBQUlMLEtBQUksR0FBR2IsS0FBSyxDQUFDa0IsRUFBRCxDQUFoQjtBQUFBLFFBQ0lKLE1BQUssR0FBR0QsS0FBSSxDQUFDUyxRQUFMLEdBQWdCVCxLQUFJLENBQUNKLE1BQXJCLEdBQThCaUIsVUFBOUIsR0FBMkMsQ0FEdkQ7O0FBRUFBLElBQUFBLFVBQVUsSUFBSWIsS0FBSSxDQUFDYyxRQUFMLEdBQWdCZCxLQUFJLENBQUNPLFFBQW5DOztBQUVBLFNBQUssSUFBSUwsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0YsS0FBSSxDQUFDakIsS0FBTCxDQUFXRixNQUEvQixFQUF1Q3FCLENBQUMsRUFBeEMsRUFBNEM7QUFDMUMsVUFBSVosSUFBSSxHQUFHVSxLQUFJLENBQUNqQixLQUFMLENBQVdtQixDQUFYLENBQVg7QUFBQSxVQUNJWCxTQUFTLEdBQUlELElBQUksQ0FBQ1QsTUFBTCxHQUFjLENBQWQsR0FBa0JTLElBQUksQ0FBQyxDQUFELENBQXRCLEdBQTRCLEdBRDdDO0FBQUEsVUFFSWEsT0FBTyxHQUFJYixJQUFJLENBQUNULE1BQUwsR0FBYyxDQUFkLEdBQWtCUyxJQUFJLENBQUNjLE1BQUwsQ0FBWSxDQUFaLENBQWxCLEdBQW1DZCxJQUZsRDtBQUFBLFVBR0l5QixTQUFTLEdBQUdmLEtBQUksQ0FBQ2dCLGNBQUwsQ0FBb0JkLENBQXBCLENBSGhCOztBQUtBLFVBQUlYLFNBQVMsS0FBSyxHQUFsQixFQUF1QjtBQUNyQlUsUUFBQUEsTUFBSztBQUNOLE9BRkQsTUFFTyxJQUFJVixTQUFTLEtBQUssR0FBbEIsRUFBdUI7QUFDNUJSLFFBQUFBLEtBQUssQ0FBQ2tDLE1BQU4sQ0FBYWhCLE1BQWIsRUFBb0IsQ0FBcEI7QUFDQWhCLFFBQUFBLFVBQVUsQ0FBQ2dDLE1BQVgsQ0FBa0JoQixNQUFsQixFQUF5QixDQUF6QjtBQUNGO0FBQ0MsT0FKTSxNQUlBLElBQUlWLFNBQVMsS0FBSyxHQUFsQixFQUF1QjtBQUM1QlIsUUFBQUEsS0FBSyxDQUFDa0MsTUFBTixDQUFhaEIsTUFBYixFQUFvQixDQUFwQixFQUF1QkUsT0FBdkI7QUFDQWxCLFFBQUFBLFVBQVUsQ0FBQ2dDLE1BQVgsQ0FBa0JoQixNQUFsQixFQUF5QixDQUF6QixFQUE0QmMsU0FBNUI7QUFDQWQsUUFBQUEsTUFBSztBQUNOLE9BSk0sTUFJQSxJQUFJVixTQUFTLEtBQUssSUFBbEIsRUFBd0I7QUFDN0IsWUFBSTJCLGlCQUFpQixHQUFHbEIsS0FBSSxDQUFDakIsS0FBTCxDQUFXbUIsQ0FBQyxHQUFHLENBQWYsSUFBb0JGLEtBQUksQ0FBQ2pCLEtBQUwsQ0FBV21CLENBQUMsR0FBRyxDQUFmLEVBQWtCLENBQWxCLENBQXBCLEdBQTJDLElBQW5FOztBQUNBLFlBQUlnQixpQkFBaUIsS0FBSyxHQUExQixFQUErQjtBQUM3QnJCLFVBQUFBLFdBQVcsR0FBRyxJQUFkO0FBQ0QsU0FGRCxNQUVPLElBQUlxQixpQkFBaUIsS0FBSyxHQUExQixFQUErQjtBQUNwQ3BCLFVBQUFBLFFBQVEsR0FBRyxJQUFYO0FBQ0Q7QUFDRjtBQUNGO0FBQ0YsR0E3R3VELENBK0d4RDs7O0FBQ0EsTUFBSUQsV0FBSixFQUFpQjtBQUNmLFdBQU8sQ0FBQ2QsS0FBSyxDQUFDQSxLQUFLLENBQUNGLE1BQU4sR0FBZSxDQUFoQixDQUFiLEVBQWlDO0FBQy9CRSxNQUFBQSxLQUFLLENBQUNvQyxHQUFOO0FBQ0FsQyxNQUFBQSxVQUFVLENBQUNrQyxHQUFYO0FBQ0Q7QUFDRixHQUxELE1BS08sSUFBSXJCLFFBQUosRUFBYztBQUNuQmYsSUFBQUEsS0FBSyxDQUFDcUMsSUFBTixDQUFXLEVBQVg7QUFDQW5DLElBQUFBLFVBQVUsQ0FBQ21DLElBQVgsQ0FBZ0IsSUFBaEI7QUFDRDs7QUFDRCxPQUFLLElBQUlDLEVBQUUsR0FBRyxDQUFkLEVBQWlCQSxFQUFFLEdBQUd0QyxLQUFLLENBQUNGLE1BQU4sR0FBZSxDQUFyQyxFQUF3Q3dDLEVBQUUsRUFBMUMsRUFBOEM7QUFDNUN0QyxJQUFBQSxLQUFLLENBQUNzQyxFQUFELENBQUwsR0FBWXRDLEtBQUssQ0FBQ3NDLEVBQUQsQ0FBTCxHQUFZcEMsVUFBVSxDQUFDb0MsRUFBRCxDQUFsQztBQUNEOztBQUNELFNBQU90QyxLQUFLLENBQUN1QyxJQUFOLENBQVcsRUFBWCxDQUFQO0FBQ0QsQyxDQUVEOzs7QUFDTyxTQUFTQyxZQUFULENBQXNCL0MsT0FBdEIsRUFBK0JDLE9BQS9CLEVBQXdDO0FBQzdDLE1BQUksT0FBT0QsT0FBUCxLQUFtQixRQUF2QixFQUFpQztBQUMvQkEsSUFBQUEsT0FBTztBQUFHO0FBQUE7QUFBQTs7QUFBQUU7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLEtBQVdGLE9BQVgsQ0FBVjtBQUNEOztBQUVELE1BQUlnRCxZQUFZLEdBQUcsQ0FBbkI7O0FBQ0EsV0FBU0MsWUFBVCxHQUF3QjtBQUN0QixRQUFJQyxLQUFLLEdBQUdsRCxPQUFPLENBQUNnRCxZQUFZLEVBQWIsQ0FBbkI7O0FBQ0EsUUFBSSxDQUFDRSxLQUFMLEVBQVk7QUFDVixhQUFPakQsT0FBTyxDQUFDa0QsUUFBUixFQUFQO0FBQ0Q7O0FBRURsRCxJQUFBQSxPQUFPLENBQUNtRCxRQUFSLENBQWlCRixLQUFqQixFQUF3QixVQUFTRyxHQUFULEVBQWNDLElBQWQsRUFBb0I7QUFDMUMsVUFBSUQsR0FBSixFQUFTO0FBQ1AsZUFBT3BELE9BQU8sQ0FBQ2tELFFBQVIsQ0FBaUJFLEdBQWpCLENBQVA7QUFDRDs7QUFFRCxVQUFJRSxjQUFjLEdBQUd6RCxVQUFVLENBQUN3RCxJQUFELEVBQU9KLEtBQVAsRUFBY2pELE9BQWQsQ0FBL0I7QUFDQUEsTUFBQUEsT0FBTyxDQUFDdUQsT0FBUixDQUFnQk4sS0FBaEIsRUFBdUJLLGNBQXZCLEVBQXVDLFVBQVNGLEdBQVQsRUFBYztBQUNuRCxZQUFJQSxHQUFKLEVBQVM7QUFDUCxpQkFBT3BELE9BQU8sQ0FBQ2tELFFBQVIsQ0FBaUJFLEdBQWpCLENBQVA7QUFDRDs7QUFFREosUUFBQUEsWUFBWTtBQUNiLE9BTkQ7QUFPRCxLQWJEO0FBY0Q7O0FBQ0RBLEVBQUFBLFlBQVk7QUFDYiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXJzZSc7XG5pbXBvcnQgZGlzdGFuY2VJdGVyYXRvciBmcm9tICcuLi91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgIHVuaURpZmYgPSBwYXJzZVBhdGNoKHVuaURpZmYpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodW5pRGlmZikpIHtcbiAgICBpZiAodW5pRGlmZi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FwcGx5UGF0Y2ggb25seSB3b3JrcyB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuICAgIH1cblxuICAgIHVuaURpZmYgPSB1bmlEaWZmWzBdO1xuICB9XG5cbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG4gIGxldCBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcbiAgICAgIGRlbGltaXRlcnMgPSBzb3VyY2UubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgaHVua3MgPSB1bmlEaWZmLmh1bmtzLFxuXG4gICAgICBjb21wYXJlTGluZSA9IG9wdGlvbnMuY29tcGFyZUxpbmUgfHwgKChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkgPT4gbGluZSA9PT0gcGF0Y2hDb250ZW50KSxcbiAgICAgIGVycm9yQ291bnQgPSAwLFxuICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuICAgICAgbWluTGluZSA9IDAsXG4gICAgICBvZmZzZXQgPSAwLFxuXG4gICAgICByZW1vdmVFT0ZOTCxcbiAgICAgIGFkZEVPRk5MO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGh1bmsgZXhhY3RseSBmaXRzIG9uIHRoZSBwcm92aWRlZCBsb2NhdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGxldCBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSAobGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyksXG4gICAgICAgICAgY29udGVudCA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUpO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgLy8gQ29udGV4dCBzYW5pdHkgY2hlY2tcbiAgICAgICAgaWYgKCFjb21wYXJlTGluZSh0b1BvcyArIDEsIGxpbmVzW3RvUG9zXSwgb3BlcmF0aW9uLCBjb250ZW50KSkge1xuICAgICAgICAgIGVycm9yQ291bnQrKztcblxuICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gZnV6ekZhY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0b1BvcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gU2VhcmNoIGJlc3QgZml0IG9mZnNldHMgZm9yIGVhY2ggaHVuayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGh1bmsgPSBodW5rc1tpXSxcbiAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG4gICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcbiAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcblxuICAgIGxldCBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNldCBsb3dlciB0ZXh0IGxpbWl0IHRvIGVuZCBvZiB0aGUgY3VycmVudCBodW5rLCBzbyBuZXh0IG9uZXMgZG9uJ3QgdHJ5XG4gICAgLy8gdG8gZml0IG92ZXIgYWxyZWFkeSBwYXRjaGVkIHRleHRcbiAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIC8vIEFwcGx5IHBhdGNoIGh1bmtzXG4gIGxldCBkaWZmT2Zmc2V0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBodW5rID0gaHVua3NbaV0sXG4gICAgICAgIHRvUG9zID0gaHVuay5vbGRTdGFydCArIGh1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG4gICAgZGlmZk9mZnNldCArPSBodW5rLm5ld0xpbmVzIC0gaHVuay5vbGRMaW5lcztcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgbGV0IGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lWzBdIDogJyAnKSxcbiAgICAgICAgICBjb250ZW50ID0gKGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZSksXG4gICAgICAgICAgZGVsaW1pdGVyID0gaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIHRvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMSk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAxKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICB0b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBsZXQgcHJldmlvdXNPcGVyYXRpb24gPSBodW5rLmxpbmVzW2ogLSAxXSA/IGh1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcbiAgfVxuICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn1cblxuLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgbGV0IGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHByb2Nlc3NJbmRleCgpO1xufVxuIl19\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.structuredPatch = structuredPatch;\nexports.formatPatch = formatPatch;\nexports.createTwoFilesPatch = createTwoFilesPatch;\nexports.createPatch = createPatch;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_line = require(\"../diff/line\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/*istanbul ignore end*/\nfunction structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n if (!options) {\n options = {};\n }\n\n if (typeof options.context === 'undefined') {\n options.context = 4;\n }\n\n var diff =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _line\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n diffLines)\n /*istanbul ignore end*/\n (oldStr, newStr, options);\n\n if (!diff) {\n return;\n }\n\n diff.push({\n value: '',\n lines: []\n }); // Append an empty value to make cleanup easier\n\n function contextLines(lines) {\n return lines.map(function (entry) {\n return ' ' + entry;\n });\n }\n\n var hunks = [];\n var oldRangeStart = 0,\n newRangeStart = 0,\n curRange = [],\n oldLine = 1,\n newLine = 1;\n\n /*istanbul ignore start*/\n var _loop = function _loop(\n /*istanbul ignore end*/\n i) {\n var current = diff[i],\n lines = current.lines || current.value.replace(/\\n$/, '').split('\\n');\n current.lines = lines;\n\n if (current.added || current.removed) {\n /*istanbul ignore start*/\n var _curRange;\n\n /*istanbul ignore end*/\n // If we have previous context, start with that\n if (!oldRangeStart) {\n var prev = diff[i - 1];\n oldRangeStart = oldLine;\n newRangeStart = newLine;\n\n if (prev) {\n curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];\n oldRangeStart -= curRange.length;\n newRangeStart -= curRange.length;\n }\n } // Output our changes\n\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_curRange =\n /*istanbul ignore end*/\n curRange).push.apply(\n /*istanbul ignore start*/\n _curRange\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n lines.map(function (entry) {\n return (current.added ? '+' : '-') + entry;\n }))); // Track the updated file position\n\n\n if (current.added) {\n newLine += lines.length;\n } else {\n oldLine += lines.length;\n }\n } else {\n // Identical context lines. Track line changes\n if (oldRangeStart) {\n // Close out any changes that have been output (or join overlapping)\n if (lines.length <= options.context * 2 && i < diff.length - 2) {\n /*istanbul ignore start*/\n var _curRange2;\n\n /*istanbul ignore end*/\n // Overlapping\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_curRange2 =\n /*istanbul ignore end*/\n curRange).push.apply(\n /*istanbul ignore start*/\n _curRange2\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n contextLines(lines)));\n } else {\n /*istanbul ignore start*/\n var _curRange3;\n\n /*istanbul ignore end*/\n // end the range and output\n var contextSize = Math.min(lines.length, options.context);\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_curRange3 =\n /*istanbul ignore end*/\n curRange).push.apply(\n /*istanbul ignore start*/\n _curRange3\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n contextLines(lines.slice(0, contextSize))));\n\n var hunk = {\n oldStart: oldRangeStart,\n oldLines: oldLine - oldRangeStart + contextSize,\n newStart: newRangeStart,\n newLines: newLine - newRangeStart + contextSize,\n lines: curRange\n };\n\n if (i >= diff.length - 2 && lines.length <= options.context) {\n // EOF is inside this hunk\n var oldEOFNewline = /\\n$/.test(oldStr);\n var newEOFNewline = /\\n$/.test(newStr);\n var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines;\n\n if (!oldEOFNewline && noNlBeforeAdds && oldStr.length > 0) {\n // special case: old has no eol and no trailing context; no-nl can end up before adds\n // however, if the old file is empty, do not output the no-nl line\n curRange.splice(hunk.oldLines, 0, '\\\\ No newline at end of file');\n }\n\n if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) {\n curRange.push('\\\\ No newline at end of file');\n }\n }\n\n hunks.push(hunk);\n oldRangeStart = 0;\n newRangeStart = 0;\n curRange = [];\n }\n }\n\n oldLine += lines.length;\n newLine += lines.length;\n }\n };\n\n for (var i = 0; i < diff.length; i++) {\n /*istanbul ignore start*/\n _loop(\n /*istanbul ignore end*/\n i);\n }\n\n return {\n oldFileName: oldFileName,\n newFileName: newFileName,\n oldHeader: oldHeader,\n newHeader: newHeader,\n hunks: hunks\n };\n}\n\nfunction formatPatch(diff) {\n var ret = [];\n\n if (diff.oldFileName == diff.newFileName) {\n ret.push('Index: ' + diff.oldFileName);\n }\n\n ret.push('===================================================================');\n ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\\t' + diff.oldHeader));\n ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\\t' + diff.newHeader));\n\n for (var i = 0; i < diff.hunks.length; i++) {\n var hunk = diff.hunks[i]; // Unified Diff Format quirk: If the chunk size is 0,\n // the first number is one lower than one would expect.\n // https://www.artima.com/weblogs/viewpost.jsp?thread=164293\n\n if (hunk.oldLines === 0) {\n hunk.oldStart -= 1;\n }\n\n if (hunk.newLines === 0) {\n hunk.newStart -= 1;\n }\n\n ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@');\n ret.push.apply(ret, hunk.lines);\n }\n\n return ret.join('\\n') + '\\n';\n}\n\nfunction createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n return formatPatch(structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options));\n}\n\nfunction createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {\n return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9jcmVhdGUuanMiXSwibmFtZXMiOlsic3RydWN0dXJlZFBhdGNoIiwib2xkRmlsZU5hbWUiLCJuZXdGaWxlTmFtZSIsIm9sZFN0ciIsIm5ld1N0ciIsIm9sZEhlYWRlciIsIm5ld0hlYWRlciIsIm9wdGlvbnMiLCJjb250ZXh0IiwiZGlmZiIsImRpZmZMaW5lcyIsInB1c2giLCJ2YWx1ZSIsImxpbmVzIiwiY29udGV4dExpbmVzIiwibWFwIiwiZW50cnkiLCJodW5rcyIsIm9sZFJhbmdlU3RhcnQiLCJuZXdSYW5nZVN0YXJ0IiwiY3VyUmFuZ2UiLCJvbGRMaW5lIiwibmV3TGluZSIsImkiLCJjdXJyZW50IiwicmVwbGFjZSIsInNwbGl0IiwiYWRkZWQiLCJyZW1vdmVkIiwicHJldiIsInNsaWNlIiwibGVuZ3RoIiwiY29udGV4dFNpemUiLCJNYXRoIiwibWluIiwiaHVuayIsIm9sZFN0YXJ0Iiwib2xkTGluZXMiLCJuZXdTdGFydCIsIm5ld0xpbmVzIiwib2xkRU9GTmV3bGluZSIsInRlc3QiLCJuZXdFT0ZOZXdsaW5lIiwibm9ObEJlZm9yZUFkZHMiLCJzcGxpY2UiLCJmb3JtYXRQYXRjaCIsInJldCIsImFwcGx5Iiwiam9pbiIsImNyZWF0ZVR3b0ZpbGVzUGF0Y2giLCJjcmVhdGVQYXRjaCIsImZpbGVOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULENBQXlCQyxXQUF6QixFQUFzQ0MsV0FBdEMsRUFBbURDLE1BQW5ELEVBQTJEQyxNQUEzRCxFQUFtRUMsU0FBbkUsRUFBOEVDLFNBQTlFLEVBQXlGQyxPQUF6RixFQUFrRztBQUN2RyxNQUFJLENBQUNBLE9BQUwsRUFBYztBQUNaQSxJQUFBQSxPQUFPLEdBQUcsRUFBVjtBQUNEOztBQUNELE1BQUksT0FBT0EsT0FBTyxDQUFDQyxPQUFmLEtBQTJCLFdBQS9CLEVBQTRDO0FBQzFDRCxJQUFBQSxPQUFPLENBQUNDLE9BQVIsR0FBa0IsQ0FBbEI7QUFDRDs7QUFFRCxNQUFNQyxJQUFJO0FBQUc7QUFBQTtBQUFBOztBQUFBQztBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBO0FBQUEsR0FBVVAsTUFBVixFQUFrQkMsTUFBbEIsRUFBMEJHLE9BQTFCLENBQWI7O0FBQ0EsTUFBRyxDQUFDRSxJQUFKLEVBQVU7QUFDUjtBQUNEOztBQUVEQSxFQUFBQSxJQUFJLENBQUNFLElBQUwsQ0FBVTtBQUFDQyxJQUFBQSxLQUFLLEVBQUUsRUFBUjtBQUFZQyxJQUFBQSxLQUFLLEVBQUU7QUFBbkIsR0FBVixFQWJ1RyxDQWFwRTs7QUFFbkMsV0FBU0MsWUFBVCxDQUFzQkQsS0FBdEIsRUFBNkI7QUFDM0IsV0FBT0EsS0FBSyxDQUFDRSxHQUFOLENBQVUsVUFBU0MsS0FBVCxFQUFnQjtBQUFFLGFBQU8sTUFBTUEsS0FBYjtBQUFxQixLQUFqRCxDQUFQO0FBQ0Q7O0FBRUQsTUFBSUMsS0FBSyxHQUFHLEVBQVo7QUFDQSxNQUFJQyxhQUFhLEdBQUcsQ0FBcEI7QUFBQSxNQUF1QkMsYUFBYSxHQUFHLENBQXZDO0FBQUEsTUFBMENDLFFBQVEsR0FBRyxFQUFyRDtBQUFBLE1BQ0lDLE9BQU8sR0FBRyxDQURkO0FBQUEsTUFDaUJDLE9BQU8sR0FBRyxDQUQzQjs7QUFwQnVHO0FBQUE7QUFBQTtBQXNCOUZDLEVBQUFBLENBdEI4RjtBQXVCckcsUUFBTUMsT0FBTyxHQUFHZixJQUFJLENBQUNjLENBQUQsQ0FBcEI7QUFBQSxRQUNNVixLQUFLLEdBQUdXLE9BQU8sQ0FBQ1gsS0FBUixJQUFpQlcsT0FBTyxDQUFDWixLQUFSLENBQWNhLE9BQWQsQ0FBc0IsS0FBdEIsRUFBNkIsRUFBN0IsRUFBaUNDLEtBQWpDLENBQXVDLElBQXZDLENBRC9CO0FBRUFGLElBQUFBLE9BQU8sQ0FBQ1gsS0FBUixHQUFnQkEsS0FBaEI7O0FBRUEsUUFBSVcsT0FBTyxDQUFDRyxLQUFSLElBQWlCSCxPQUFPLENBQUNJLE9BQTdCLEVBQXNDO0FBQUE7QUFBQTs7QUFBQTtBQUNwQztBQUNBLFVBQUksQ0FBQ1YsYUFBTCxFQUFvQjtBQUNsQixZQUFNVyxJQUFJLEdBQUdwQixJQUFJLENBQUNjLENBQUMsR0FBRyxDQUFMLENBQWpCO0FBQ0FMLFFBQUFBLGFBQWEsR0FBR0csT0FBaEI7QUFDQUYsUUFBQUEsYUFBYSxHQUFHRyxPQUFoQjs7QUFFQSxZQUFJTyxJQUFKLEVBQVU7QUFDUlQsVUFBQUEsUUFBUSxHQUFHYixPQUFPLENBQUNDLE9BQVIsR0FBa0IsQ0FBbEIsR0FBc0JNLFlBQVksQ0FBQ2UsSUFBSSxDQUFDaEIsS0FBTCxDQUFXaUIsS0FBWCxDQUFpQixDQUFDdkIsT0FBTyxDQUFDQyxPQUExQixDQUFELENBQWxDLEdBQXlFLEVBQXBGO0FBQ0FVLFVBQUFBLGFBQWEsSUFBSUUsUUFBUSxDQUFDVyxNQUExQjtBQUNBWixVQUFBQSxhQUFhLElBQUlDLFFBQVEsQ0FBQ1csTUFBMUI7QUFDRDtBQUNGLE9BWm1DLENBY3BDOzs7QUFDQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQVgsTUFBQUEsUUFBUSxFQUFDVCxJQUFUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBa0JFLE1BQUFBLEtBQUssQ0FBQ0UsR0FBTixDQUFVLFVBQVNDLEtBQVQsRUFBZ0I7QUFDMUMsZUFBTyxDQUFDUSxPQUFPLENBQUNHLEtBQVIsR0FBZ0IsR0FBaEIsR0FBc0IsR0FBdkIsSUFBOEJYLEtBQXJDO0FBQ0QsT0FGaUIsQ0FBbEIsR0Fmb0MsQ0FtQnBDOzs7QUFDQSxVQUFJUSxPQUFPLENBQUNHLEtBQVosRUFBbUI7QUFDakJMLFFBQUFBLE9BQU8sSUFBSVQsS0FBSyxDQUFDa0IsTUFBakI7QUFDRCxPQUZELE1BRU87QUFDTFYsUUFBQUEsT0FBTyxJQUFJUixLQUFLLENBQUNrQixNQUFqQjtBQUNEO0FBQ0YsS0F6QkQsTUF5Qk87QUFDTDtBQUNBLFVBQUliLGFBQUosRUFBbUI7QUFDakI7QUFDQSxZQUFJTCxLQUFLLENBQUNrQixNQUFOLElBQWdCeEIsT0FBTyxDQUFDQyxPQUFSLEdBQWtCLENBQWxDLElBQXVDZSxDQUFDLEdBQUdkLElBQUksQ0FBQ3NCLE1BQUwsR0FBYyxDQUE3RCxFQUFnRTtBQUFBO0FBQUE7O0FBQUE7QUFDOUQ7O0FBQ0E7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUFYLFVBQUFBLFFBQVEsRUFBQ1QsSUFBVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWtCRyxVQUFBQSxZQUFZLENBQUNELEtBQUQsQ0FBOUI7QUFDRCxTQUhELE1BR087QUFBQTtBQUFBOztBQUFBO0FBQ0w7QUFDQSxjQUFJbUIsV0FBVyxHQUFHQyxJQUFJLENBQUNDLEdBQUwsQ0FBU3JCLEtBQUssQ0FBQ2tCLE1BQWYsRUFBdUJ4QixPQUFPLENBQUNDLE9BQS9CLENBQWxCOztBQUNBOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBWSxVQUFBQSxRQUFRLEVBQUNULElBQVQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFrQkcsVUFBQUEsWUFBWSxDQUFDRCxLQUFLLENBQUNpQixLQUFOLENBQVksQ0FBWixFQUFlRSxXQUFmLENBQUQsQ0FBOUI7O0FBRUEsY0FBSUcsSUFBSSxHQUFHO0FBQ1RDLFlBQUFBLFFBQVEsRUFBRWxCLGFBREQ7QUFFVG1CLFlBQUFBLFFBQVEsRUFBR2hCLE9BQU8sR0FBR0gsYUFBVixHQUEwQmMsV0FGNUI7QUFHVE0sWUFBQUEsUUFBUSxFQUFFbkIsYUFIRDtBQUlUb0IsWUFBQUEsUUFBUSxFQUFHakIsT0FBTyxHQUFHSCxhQUFWLEdBQTBCYSxXQUo1QjtBQUtUbkIsWUFBQUEsS0FBSyxFQUFFTztBQUxFLFdBQVg7O0FBT0EsY0FBSUcsQ0FBQyxJQUFJZCxJQUFJLENBQUNzQixNQUFMLEdBQWMsQ0FBbkIsSUFBd0JsQixLQUFLLENBQUNrQixNQUFOLElBQWdCeEIsT0FBTyxDQUFDQyxPQUFwRCxFQUE2RDtBQUMzRDtBQUNBLGdCQUFJZ0MsYUFBYSxHQUFLLEtBQUQsQ0FBUUMsSUFBUixDQUFhdEMsTUFBYixDQUFyQjtBQUNBLGdCQUFJdUMsYUFBYSxHQUFLLEtBQUQsQ0FBUUQsSUFBUixDQUFhckMsTUFBYixDQUFyQjtBQUNBLGdCQUFJdUMsY0FBYyxHQUFHOUIsS0FBSyxDQUFDa0IsTUFBTixJQUFnQixDQUFoQixJQUFxQlgsUUFBUSxDQUFDVyxNQUFULEdBQWtCSSxJQUFJLENBQUNFLFFBQWpFOztBQUNBLGdCQUFJLENBQUNHLGFBQUQsSUFBa0JHLGNBQWxCLElBQW9DeEMsTUFBTSxDQUFDNEIsTUFBUCxHQUFnQixDQUF4RCxFQUEyRDtBQUN6RDtBQUNBO0FBQ0FYLGNBQUFBLFFBQVEsQ0FBQ3dCLE1BQVQsQ0FBZ0JULElBQUksQ0FBQ0UsUUFBckIsRUFBK0IsQ0FBL0IsRUFBa0MsOEJBQWxDO0FBQ0Q7O0FBQ0QsZ0JBQUssQ0FBQ0csYUFBRCxJQUFrQixDQUFDRyxjQUFwQixJQUF1QyxDQUFDRCxhQUE1QyxFQUEyRDtBQUN6RHRCLGNBQUFBLFFBQVEsQ0FBQ1QsSUFBVCxDQUFjLDhCQUFkO0FBQ0Q7QUFDRjs7QUFDRE0sVUFBQUEsS0FBSyxDQUFDTixJQUFOLENBQVd3QixJQUFYO0FBRUFqQixVQUFBQSxhQUFhLEdBQUcsQ0FBaEI7QUFDQUMsVUFBQUEsYUFBYSxHQUFHLENBQWhCO0FBQ0FDLFVBQUFBLFFBQVEsR0FBRyxFQUFYO0FBQ0Q7QUFDRjs7QUFDREMsTUFBQUEsT0FBTyxJQUFJUixLQUFLLENBQUNrQixNQUFqQjtBQUNBVCxNQUFBQSxPQUFPLElBQUlULEtBQUssQ0FBQ2tCLE1BQWpCO0FBQ0Q7QUE5Rm9HOztBQXNCdkcsT0FBSyxJQUFJUixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHZCxJQUFJLENBQUNzQixNQUF6QixFQUFpQ1IsQ0FBQyxFQUFsQyxFQUFzQztBQUFBO0FBQUE7QUFBQTtBQUE3QkEsSUFBQUEsQ0FBNkI7QUF5RXJDOztBQUVELFNBQU87QUFDTHRCLElBQUFBLFdBQVcsRUFBRUEsV0FEUjtBQUNxQkMsSUFBQUEsV0FBVyxFQUFFQSxXQURsQztBQUVMRyxJQUFBQSxTQUFTLEVBQUVBLFNBRk47QUFFaUJDLElBQUFBLFNBQVMsRUFBRUEsU0FGNUI7QUFHTFcsSUFBQUEsS0FBSyxFQUFFQTtBQUhGLEdBQVA7QUFLRDs7QUFFTSxTQUFTNEIsV0FBVCxDQUFxQnBDLElBQXJCLEVBQTJCO0FBQ2hDLE1BQU1xQyxHQUFHLEdBQUcsRUFBWjs7QUFDQSxNQUFJckMsSUFBSSxDQUFDUixXQUFMLElBQW9CUSxJQUFJLENBQUNQLFdBQTdCLEVBQTBDO0FBQ3hDNEMsSUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUFTLFlBQVlGLElBQUksQ0FBQ1IsV0FBMUI7QUFDRDs7QUFDRDZDLEVBQUFBLEdBQUcsQ0FBQ25DLElBQUosQ0FBUyxxRUFBVDtBQUNBbUMsRUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUFTLFNBQVNGLElBQUksQ0FBQ1IsV0FBZCxJQUE2QixPQUFPUSxJQUFJLENBQUNKLFNBQVosS0FBMEIsV0FBMUIsR0FBd0MsRUFBeEMsR0FBNkMsT0FBT0ksSUFBSSxDQUFDSixTQUF0RixDQUFUO0FBQ0F5QyxFQUFBQSxHQUFHLENBQUNuQyxJQUFKLENBQVMsU0FBU0YsSUFBSSxDQUFDUCxXQUFkLElBQTZCLE9BQU9PLElBQUksQ0FBQ0gsU0FBWixLQUEwQixXQUExQixHQUF3QyxFQUF4QyxHQUE2QyxPQUFPRyxJQUFJLENBQUNILFNBQXRGLENBQVQ7O0FBRUEsT0FBSyxJQUFJaUIsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR2QsSUFBSSxDQUFDUSxLQUFMLENBQVdjLE1BQS9CLEVBQXVDUixDQUFDLEVBQXhDLEVBQTRDO0FBQzFDLFFBQU1ZLElBQUksR0FBRzFCLElBQUksQ0FBQ1EsS0FBTCxDQUFXTSxDQUFYLENBQWIsQ0FEMEMsQ0FFMUM7QUFDQTtBQUNBOztBQUNBLFFBQUlZLElBQUksQ0FBQ0UsUUFBTCxLQUFrQixDQUF0QixFQUF5QjtBQUN2QkYsTUFBQUEsSUFBSSxDQUFDQyxRQUFMLElBQWlCLENBQWpCO0FBQ0Q7O0FBQ0QsUUFBSUQsSUFBSSxDQUFDSSxRQUFMLEtBQWtCLENBQXRCLEVBQXlCO0FBQ3ZCSixNQUFBQSxJQUFJLENBQUNHLFFBQUwsSUFBaUIsQ0FBakI7QUFDRDs7QUFDRFEsSUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUNFLFNBQVN3QixJQUFJLENBQUNDLFFBQWQsR0FBeUIsR0FBekIsR0FBK0JELElBQUksQ0FBQ0UsUUFBcEMsR0FDRSxJQURGLEdBQ1NGLElBQUksQ0FBQ0csUUFEZCxHQUN5QixHQUR6QixHQUMrQkgsSUFBSSxDQUFDSSxRQURwQyxHQUVFLEtBSEo7QUFLQU8sSUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUFTb0MsS0FBVCxDQUFlRCxHQUFmLEVBQW9CWCxJQUFJLENBQUN0QixLQUF6QjtBQUNEOztBQUVELFNBQU9pQyxHQUFHLENBQUNFLElBQUosQ0FBUyxJQUFULElBQWlCLElBQXhCO0FBQ0Q7O0FBRU0sU0FBU0MsbUJBQVQsQ0FBNkJoRCxXQUE3QixFQUEwQ0MsV0FBMUMsRUFBdURDLE1BQXZELEVBQStEQyxNQUEvRCxFQUF1RUMsU0FBdkUsRUFBa0ZDLFNBQWxGLEVBQTZGQyxPQUE3RixFQUFzRztBQUMzRyxTQUFPc0MsV0FBVyxDQUFDN0MsZUFBZSxDQUFDQyxXQUFELEVBQWNDLFdBQWQsRUFBMkJDLE1BQTNCLEVBQW1DQyxNQUFuQyxFQUEyQ0MsU0FBM0MsRUFBc0RDLFNBQXRELEVBQWlFQyxPQUFqRSxDQUFoQixDQUFsQjtBQUNEOztBQUVNLFNBQVMyQyxXQUFULENBQXFCQyxRQUFyQixFQUErQmhELE1BQS9CLEVBQXVDQyxNQUF2QyxFQUErQ0MsU0FBL0MsRUFBMERDLFNBQTFELEVBQXFFQyxPQUFyRSxFQUE4RTtBQUNuRixTQUFPMEMsbUJBQW1CLENBQUNFLFFBQUQsRUFBV0EsUUFBWCxFQUFxQmhELE1BQXJCLEVBQTZCQyxNQUE3QixFQUFxQ0MsU0FBckMsRUFBZ0RDLFNBQWhELEVBQTJEQyxPQUEzRCxDQUExQjtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWZmTGluZXN9IGZyb20gJy4uL2RpZmYvbGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMuY29udGV4dCA9IDQ7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgaWYoIWRpZmYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaWZmLnB1c2goe3ZhbHVlOiAnJywgbGluZXM6IFtdfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gJyAnICsgZW50cnk7IH0pO1xuICB9XG5cbiAgbGV0IGh1bmtzID0gW107XG4gIGxldCBvbGRSYW5nZVN0YXJ0ID0gMCwgbmV3UmFuZ2VTdGFydCA9IDAsIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSwgbmV3TGluZSA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuICAgICAgY3VyUmFuZ2UucHVzaCguLi4gbGluZXMubWFwKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvLyBPdmVybGFwcGluZ1xuICAgICAgICAgIGN1clJhbmdlLnB1c2goLi4uIGNvbnRleHRMaW5lcyhsaW5lcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIGxldCBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcbiAgICAgICAgICBjdXJSYW5nZS5wdXNoKC4uLiBjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSk7XG5cbiAgICAgICAgICBsZXQgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgb2xkTGluZXM6IChvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IChuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICBsZXQgb2xkRU9GTmV3bGluZSA9ICgoL1xcbiQvKS50ZXN0KG9sZFN0cikpO1xuICAgICAgICAgICAgbGV0IG5ld0VPRk5ld2xpbmUgPSAoKC9cXG4kLykudGVzdChuZXdTdHIpKTtcbiAgICAgICAgICAgIGxldCBub05sQmVmb3JlQWRkcyA9IGxpbmVzLmxlbmd0aCA9PSAwICYmIGN1clJhbmdlLmxlbmd0aCA+IGh1bmsub2xkTGluZXM7XG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoIW9sZEVPRk5ld2xpbmUgJiYgIW5vTmxCZWZvcmVBZGRzKSB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaHVua3MucHVzaChodW5rKTtcblxuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvbGRGaWxlTmFtZTogb2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lOiBuZXdGaWxlTmFtZSxcbiAgICBvbGRIZWFkZXI6IG9sZEhlYWRlciwgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYXRjaChkaWZmKSB7XG4gIGNvbnN0IHJldCA9IFtdO1xuICBpZiAoZGlmZi5vbGRGaWxlTmFtZSA9PSBkaWZmLm5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgZGlmZi5vbGRGaWxlTmFtZSk7XG4gIH1cbiAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG4gIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGh1bmsgPSBkaWZmLmh1bmtzW2ldO1xuICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0IC09IDE7XG4gICAgfVxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0IC09IDE7XG4gICAgfVxuICAgIHJldC5wdXNoKFxuICAgICAgJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXNcbiAgICAgICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzXG4gICAgICArICcgQEAnXG4gICAgKTtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICByZXR1cm4gZm9ybWF0UGF0Y2goc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.calcLineCount = calcLineCount;\nexports.merge = merge;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_create = require(\"./create\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_parse = require(\"./parse\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_array = require(\"../util/array\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/*istanbul ignore end*/\nfunction calcLineCount(hunk) {\n /*istanbul ignore start*/\n var _calcOldNewLineCount =\n /*istanbul ignore end*/\n calcOldNewLineCount(hunk.lines),\n oldLines = _calcOldNewLineCount.oldLines,\n newLines = _calcOldNewLineCount.newLines;\n\n if (oldLines !== undefined) {\n hunk.oldLines = oldLines;\n } else {\n delete hunk.oldLines;\n }\n\n if (newLines !== undefined) {\n hunk.newLines = newLines;\n } else {\n delete hunk.newLines;\n }\n}\n\nfunction merge(mine, theirs, base) {\n mine = loadPatch(mine, base);\n theirs = loadPatch(theirs, base);\n var ret = {}; // For index we just let it pass through as it doesn't have any necessary meaning.\n // Leaving sanity checks on this to the API consumer that may know more about the\n // meaning in their own context.\n\n if (mine.index || theirs.index) {\n ret.index = mine.index || theirs.index;\n }\n\n if (mine.newFileName || theirs.newFileName) {\n if (!fileNameChanged(mine)) {\n // No header or no change in ours, use theirs (and ours if theirs does not exist)\n ret.oldFileName = theirs.oldFileName || mine.oldFileName;\n ret.newFileName = theirs.newFileName || mine.newFileName;\n ret.oldHeader = theirs.oldHeader || mine.oldHeader;\n ret.newHeader = theirs.newHeader || mine.newHeader;\n } else if (!fileNameChanged(theirs)) {\n // No header or no change in theirs, use ours\n ret.oldFileName = mine.oldFileName;\n ret.newFileName = mine.newFileName;\n ret.oldHeader = mine.oldHeader;\n ret.newHeader = mine.newHeader;\n } else {\n // Both changed... figure it out\n ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName);\n ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName);\n ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader);\n ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader);\n }\n }\n\n ret.hunks = [];\n var mineIndex = 0,\n theirsIndex = 0,\n mineOffset = 0,\n theirsOffset = 0;\n\n while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) {\n var mineCurrent = mine.hunks[mineIndex] || {\n oldStart: Infinity\n },\n theirsCurrent = theirs.hunks[theirsIndex] || {\n oldStart: Infinity\n };\n\n if (hunkBefore(mineCurrent, theirsCurrent)) {\n // This patch does not overlap with any of the others, yay.\n ret.hunks.push(cloneHunk(mineCurrent, mineOffset));\n mineIndex++;\n theirsOffset += mineCurrent.newLines - mineCurrent.oldLines;\n } else if (hunkBefore(theirsCurrent, mineCurrent)) {\n // This patch does not overlap with any of the others, yay.\n ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset));\n theirsIndex++;\n mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines;\n } else {\n // Overlap, merge as best we can\n var mergedHunk = {\n oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart),\n oldLines: 0,\n newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset),\n newLines: 0,\n lines: []\n };\n mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines);\n theirsIndex++;\n mineIndex++;\n ret.hunks.push(mergedHunk);\n }\n }\n\n return ret;\n}\n\nfunction loadPatch(param, base) {\n if (typeof param === 'string') {\n if (/^@@/m.test(param) || /^Index:/m.test(param)) {\n return (\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _parse\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n parsePatch)\n /*istanbul ignore end*/\n (param)[0]\n );\n }\n\n if (!base) {\n throw new Error('Must provide a base reference or pass in a patch');\n }\n\n return (\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _create\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n structuredPatch)\n /*istanbul ignore end*/\n (undefined, undefined, base, param)\n );\n }\n\n return param;\n}\n\nfunction fileNameChanged(patch) {\n return patch.newFileName && patch.newFileName !== patch.oldFileName;\n}\n\nfunction selectField(index, mine, theirs) {\n if (mine === theirs) {\n return mine;\n } else {\n index.conflict = true;\n return {\n mine: mine,\n theirs: theirs\n };\n }\n}\n\nfunction hunkBefore(test, check) {\n return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart;\n}\n\nfunction cloneHunk(hunk, offset) {\n return {\n oldStart: hunk.oldStart,\n oldLines: hunk.oldLines,\n newStart: hunk.newStart + offset,\n newLines: hunk.newLines,\n lines: hunk.lines\n };\n}\n\nfunction mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) {\n // This will generally result in a conflicted hunk, but there are cases where the context\n // is the only overlap where we can successfully merge the content here.\n var mine = {\n offset: mineOffset,\n lines: mineLines,\n index: 0\n },\n their = {\n offset: theirOffset,\n lines: theirLines,\n index: 0\n }; // Handle any leading content\n\n insertLeading(hunk, mine, their);\n insertLeading(hunk, their, mine); // Now in the overlap content. Scan through and select the best changes from each.\n\n while (mine.index < mine.lines.length && their.index < their.lines.length) {\n var mineCurrent = mine.lines[mine.index],\n theirCurrent = their.lines[their.index];\n\n if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) {\n // Both modified ...\n mutualChange(hunk, mine, their);\n } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') {\n /*istanbul ignore start*/\n var _hunk$lines;\n\n /*istanbul ignore end*/\n // Mine inserted\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n collectChange(mine)));\n } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') {\n /*istanbul ignore start*/\n var _hunk$lines2;\n\n /*istanbul ignore end*/\n // Theirs inserted\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines2 =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines2\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n collectChange(their)));\n } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') {\n // Mine removed or edited\n removal(hunk, mine, their);\n } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') {\n // Their removed or edited\n removal(hunk, their, mine, true);\n } else if (mineCurrent === theirCurrent) {\n // Context identity\n hunk.lines.push(mineCurrent);\n mine.index++;\n their.index++;\n } else {\n // Context mismatch\n conflict(hunk, collectChange(mine), collectChange(their));\n }\n } // Now push anything that may be remaining\n\n\n insertTrailing(hunk, mine);\n insertTrailing(hunk, their);\n calcLineCount(hunk);\n}\n\nfunction mutualChange(hunk, mine, their) {\n var myChanges = collectChange(mine),\n theirChanges = collectChange(their);\n\n if (allRemoves(myChanges) && allRemoves(theirChanges)) {\n // Special case for remove changes that are supersets of one another\n if (\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _array\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n arrayStartsWith)\n /*istanbul ignore end*/\n (myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) {\n /*istanbul ignore start*/\n var _hunk$lines3;\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines3 =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines3\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n myChanges));\n\n return;\n } else if (\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _array\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n arrayStartsWith)\n /*istanbul ignore end*/\n (theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) {\n /*istanbul ignore start*/\n var _hunk$lines4;\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines4 =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines4\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n theirChanges));\n\n return;\n }\n } else if (\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _array\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n arrayEqual)\n /*istanbul ignore end*/\n (myChanges, theirChanges)) {\n /*istanbul ignore start*/\n var _hunk$lines5;\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines5 =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines5\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n myChanges));\n\n return;\n }\n\n conflict(hunk, myChanges, theirChanges);\n}\n\nfunction removal(hunk, mine, their, swap) {\n var myChanges = collectChange(mine),\n theirChanges = collectContext(their, myChanges);\n\n if (theirChanges.merged) {\n /*istanbul ignore start*/\n var _hunk$lines6;\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines6 =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines6\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n theirChanges.merged));\n } else {\n conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges);\n }\n}\n\nfunction conflict(hunk, mine, their) {\n hunk.conflict = true;\n hunk.lines.push({\n conflict: true,\n mine: mine,\n theirs: their\n });\n}\n\nfunction insertLeading(hunk, insert, their) {\n while (insert.offset < their.offset && insert.index < insert.lines.length) {\n var line = insert.lines[insert.index++];\n hunk.lines.push(line);\n insert.offset++;\n }\n}\n\nfunction insertTrailing(hunk, insert) {\n while (insert.index < insert.lines.length) {\n var line = insert.lines[insert.index++];\n hunk.lines.push(line);\n }\n}\n\nfunction collectChange(state) {\n var ret = [],\n operation = state.lines[state.index][0];\n\n while (state.index < state.lines.length) {\n var line = state.lines[state.index]; // Group additions that are immediately after subtractions and treat them as one \"atomic\" modify change.\n\n if (operation === '-' && line[0] === '+') {\n operation = '+';\n }\n\n if (operation === line[0]) {\n ret.push(line);\n state.index++;\n } else {\n break;\n }\n }\n\n return ret;\n}\n\nfunction collectContext(state, matchChanges) {\n var changes = [],\n merged = [],\n matchIndex = 0,\n contextChanges = false,\n conflicted = false;\n\n while (matchIndex < matchChanges.length && state.index < state.lines.length) {\n var change = state.lines[state.index],\n match = matchChanges[matchIndex]; // Once we've hit our add, then we are done\n\n if (match[0] === '+') {\n break;\n }\n\n contextChanges = contextChanges || change[0] !== ' ';\n merged.push(match);\n matchIndex++; // Consume any additions in the other block as a conflict to attempt\n // to pull in the remaining context after this\n\n if (change[0] === '+') {\n conflicted = true;\n\n while (change[0] === '+') {\n changes.push(change);\n change = state.lines[++state.index];\n }\n }\n\n if (match.substr(1) === change.substr(1)) {\n changes.push(change);\n state.index++;\n } else {\n conflicted = true;\n }\n }\n\n if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) {\n conflicted = true;\n }\n\n if (conflicted) {\n return changes;\n }\n\n while (matchIndex < matchChanges.length) {\n merged.push(matchChanges[matchIndex++]);\n }\n\n return {\n merged: merged,\n changes: changes\n };\n}\n\nfunction allRemoves(changes) {\n return changes.reduce(function (prev, change) {\n return prev && change[0] === '-';\n }, true);\n}\n\nfunction skipRemoveSuperset(state, removeChanges, delta) {\n for (var i = 0; i < delta; i++) {\n var changeContent = removeChanges[removeChanges.length - delta + i].substr(1);\n\n if (state.lines[state.index + i] !== ' ' + changeContent) {\n return false;\n }\n }\n\n state.index += delta;\n return true;\n}\n\nfunction calcOldNewLineCount(lines) {\n var oldLines = 0;\n var newLines = 0;\n lines.forEach(function (line) {\n if (typeof line !== 'string') {\n var myCount = calcOldNewLineCount(line.mine);\n var theirCount = calcOldNewLineCount(line.theirs);\n\n if (oldLines !== undefined) {\n if (myCount.oldLines === theirCount.oldLines) {\n oldLines += myCount.oldLines;\n } else {\n oldLines = undefined;\n }\n }\n\n if (newLines !== undefined) {\n if (myCount.newLines === theirCount.newLines) {\n newLines += myCount.newLines;\n } else {\n newLines = undefined;\n }\n }\n } else {\n if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) {\n newLines++;\n }\n\n if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) {\n oldLines++;\n }\n }\n });\n return {\n oldLines: oldLines,\n newLines: newLines\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9tZXJnZS5qcyJdLCJuYW1lcyI6WyJjYWxjTGluZUNvdW50IiwiaHVuayIsImNhbGNPbGROZXdMaW5lQ291bnQiLCJsaW5lcyIsIm9sZExpbmVzIiwibmV3TGluZXMiLCJ1bmRlZmluZWQiLCJtZXJnZSIsIm1pbmUiLCJ0aGVpcnMiLCJiYXNlIiwibG9hZFBhdGNoIiwicmV0IiwiaW5kZXgiLCJuZXdGaWxlTmFtZSIsImZpbGVOYW1lQ2hhbmdlZCIsIm9sZEZpbGVOYW1lIiwib2xkSGVhZGVyIiwibmV3SGVhZGVyIiwic2VsZWN0RmllbGQiLCJodW5rcyIsIm1pbmVJbmRleCIsInRoZWlyc0luZGV4IiwibWluZU9mZnNldCIsInRoZWlyc09mZnNldCIsImxlbmd0aCIsIm1pbmVDdXJyZW50Iiwib2xkU3RhcnQiLCJJbmZpbml0eSIsInRoZWlyc0N1cnJlbnQiLCJodW5rQmVmb3JlIiwicHVzaCIsImNsb25lSHVuayIsIm1lcmdlZEh1bmsiLCJNYXRoIiwibWluIiwibmV3U3RhcnQiLCJtZXJnZUxpbmVzIiwicGFyYW0iLCJ0ZXN0IiwicGFyc2VQYXRjaCIsIkVycm9yIiwic3RydWN0dXJlZFBhdGNoIiwicGF0Y2giLCJjb25mbGljdCIsImNoZWNrIiwib2Zmc2V0IiwibWluZUxpbmVzIiwidGhlaXJPZmZzZXQiLCJ0aGVpckxpbmVzIiwidGhlaXIiLCJpbnNlcnRMZWFkaW5nIiwidGhlaXJDdXJyZW50IiwibXV0dWFsQ2hhbmdlIiwiY29sbGVjdENoYW5nZSIsInJlbW92YWwiLCJpbnNlcnRUcmFpbGluZyIsIm15Q2hhbmdlcyIsInRoZWlyQ2hhbmdlcyIsImFsbFJlbW92ZXMiLCJhcnJheVN0YXJ0c1dpdGgiLCJza2lwUmVtb3ZlU3VwZXJzZXQiLCJhcnJheUVxdWFsIiwic3dhcCIsImNvbGxlY3RDb250ZXh0IiwibWVyZ2VkIiwiaW5zZXJ0IiwibGluZSIsInN0YXRlIiwib3BlcmF0aW9uIiwibWF0Y2hDaGFuZ2VzIiwiY2hhbmdlcyIsIm1hdGNoSW5kZXgiLCJjb250ZXh0Q2hhbmdlcyIsImNvbmZsaWN0ZWQiLCJjaGFuZ2UiLCJtYXRjaCIsInN1YnN0ciIsInJlZHVjZSIsInByZXYiLCJyZW1vdmVDaGFuZ2VzIiwiZGVsdGEiLCJpIiwiY2hhbmdlQ29udGVudCIsImZvckVhY2giLCJteUNvdW50IiwidGhlaXJDb3VudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxhQUFULENBQXVCQyxJQUF2QixFQUE2QjtBQUFBO0FBQUE7QUFBQTtBQUNMQyxFQUFBQSxtQkFBbUIsQ0FBQ0QsSUFBSSxDQUFDRSxLQUFOLENBRGQ7QUFBQSxNQUMzQkMsUUFEMkIsd0JBQzNCQSxRQUQyQjtBQUFBLE1BQ2pCQyxRQURpQix3QkFDakJBLFFBRGlCOztBQUdsQyxNQUFJRCxRQUFRLEtBQUtFLFNBQWpCLEVBQTRCO0FBQzFCTCxJQUFBQSxJQUFJLENBQUNHLFFBQUwsR0FBZ0JBLFFBQWhCO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsV0FBT0gsSUFBSSxDQUFDRyxRQUFaO0FBQ0Q7O0FBRUQsTUFBSUMsUUFBUSxLQUFLQyxTQUFqQixFQUE0QjtBQUMxQkwsSUFBQUEsSUFBSSxDQUFDSSxRQUFMLEdBQWdCQSxRQUFoQjtBQUNELEdBRkQsTUFFTztBQUNMLFdBQU9KLElBQUksQ0FBQ0ksUUFBWjtBQUNEO0FBQ0Y7O0FBRU0sU0FBU0UsS0FBVCxDQUFlQyxJQUFmLEVBQXFCQyxNQUFyQixFQUE2QkMsSUFBN0IsRUFBbUM7QUFDeENGLEVBQUFBLElBQUksR0FBR0csU0FBUyxDQUFDSCxJQUFELEVBQU9FLElBQVAsQ0FBaEI7QUFDQUQsRUFBQUEsTUFBTSxHQUFHRSxTQUFTLENBQUNGLE1BQUQsRUFBU0MsSUFBVCxDQUFsQjtBQUVBLE1BQUlFLEdBQUcsR0FBRyxFQUFWLENBSndDLENBTXhDO0FBQ0E7QUFDQTs7QUFDQSxNQUFJSixJQUFJLENBQUNLLEtBQUwsSUFBY0osTUFBTSxDQUFDSSxLQUF6QixFQUFnQztBQUM5QkQsSUFBQUEsR0FBRyxDQUFDQyxLQUFKLEdBQVlMLElBQUksQ0FBQ0ssS0FBTCxJQUFjSixNQUFNLENBQUNJLEtBQWpDO0FBQ0Q7O0FBRUQsTUFBSUwsSUFBSSxDQUFDTSxXQUFMLElBQW9CTCxNQUFNLENBQUNLLFdBQS9CLEVBQTRDO0FBQzFDLFFBQUksQ0FBQ0MsZUFBZSxDQUFDUCxJQUFELENBQXBCLEVBQTRCO0FBQzFCO0FBQ0FJLE1BQUFBLEdBQUcsQ0FBQ0ksV0FBSixHQUFrQlAsTUFBTSxDQUFDTyxXQUFQLElBQXNCUixJQUFJLENBQUNRLFdBQTdDO0FBQ0FKLE1BQUFBLEdBQUcsQ0FBQ0UsV0FBSixHQUFrQkwsTUFBTSxDQUFDSyxXQUFQLElBQXNCTixJQUFJLENBQUNNLFdBQTdDO0FBQ0FGLE1BQUFBLEdBQUcsQ0FBQ0ssU0FBSixHQUFnQlIsTUFBTSxDQUFDUSxTQUFQLElBQW9CVCxJQUFJLENBQUNTLFNBQXpDO0FBQ0FMLE1BQUFBLEdBQUcsQ0FBQ00sU0FBSixHQUFnQlQsTUFBTSxDQUFDUyxTQUFQLElBQW9CVixJQUFJLENBQUNVLFNBQXpDO0FBQ0QsS0FORCxNQU1PLElBQUksQ0FBQ0gsZUFBZSxDQUFDTixNQUFELENBQXBCLEVBQThCO0FBQ25DO0FBQ0FHLE1BQUFBLEdBQUcsQ0FBQ0ksV0FBSixHQUFrQlIsSUFBSSxDQUFDUSxXQUF2QjtBQUNBSixNQUFBQSxHQUFHLENBQUNFLFdBQUosR0FBa0JOLElBQUksQ0FBQ00sV0FBdkI7QUFDQUYsTUFBQUEsR0FBRyxDQUFDSyxTQUFKLEdBQWdCVCxJQUFJLENBQUNTLFNBQXJCO0FBQ0FMLE1BQUFBLEdBQUcsQ0FBQ00sU0FBSixHQUFnQlYsSUFBSSxDQUFDVSxTQUFyQjtBQUNELEtBTk0sTUFNQTtBQUNMO0FBQ0FOLE1BQUFBLEdBQUcsQ0FBQ0ksV0FBSixHQUFrQkcsV0FBVyxDQUFDUCxHQUFELEVBQU1KLElBQUksQ0FBQ1EsV0FBWCxFQUF3QlAsTUFBTSxDQUFDTyxXQUEvQixDQUE3QjtBQUNBSixNQUFBQSxHQUFHLENBQUNFLFdBQUosR0FBa0JLLFdBQVcsQ0FBQ1AsR0FBRCxFQUFNSixJQUFJLENBQUNNLFdBQVgsRUFBd0JMLE1BQU0sQ0FBQ0ssV0FBL0IsQ0FBN0I7QUFDQUYsTUFBQUEsR0FBRyxDQUFDSyxTQUFKLEdBQWdCRSxXQUFXLENBQUNQLEdBQUQsRUFBTUosSUFBSSxDQUFDUyxTQUFYLEVBQXNCUixNQUFNLENBQUNRLFNBQTdCLENBQTNCO0FBQ0FMLE1BQUFBLEdBQUcsQ0FBQ00sU0FBSixHQUFnQkMsV0FBVyxDQUFDUCxHQUFELEVBQU1KLElBQUksQ0FBQ1UsU0FBWCxFQUFzQlQsTUFBTSxDQUFDUyxTQUE3QixDQUEzQjtBQUNEO0FBQ0Y7O0FBRUROLEVBQUFBLEdBQUcsQ0FBQ1EsS0FBSixHQUFZLEVBQVo7QUFFQSxNQUFJQyxTQUFTLEdBQUcsQ0FBaEI7QUFBQSxNQUNJQyxXQUFXLEdBQUcsQ0FEbEI7QUFBQSxNQUVJQyxVQUFVLEdBQUcsQ0FGakI7QUFBQSxNQUdJQyxZQUFZLEdBQUcsQ0FIbkI7O0FBS0EsU0FBT0gsU0FBUyxHQUFHYixJQUFJLENBQUNZLEtBQUwsQ0FBV0ssTUFBdkIsSUFBaUNILFdBQVcsR0FBR2IsTUFBTSxDQUFDVyxLQUFQLENBQWFLLE1BQW5FLEVBQTJFO0FBQ3pFLFFBQUlDLFdBQVcsR0FBR2xCLElBQUksQ0FBQ1ksS0FBTCxDQUFXQyxTQUFYLEtBQXlCO0FBQUNNLE1BQUFBLFFBQVEsRUFBRUM7QUFBWCxLQUEzQztBQUFBLFFBQ0lDLGFBQWEsR0FBR3BCLE1BQU0sQ0FBQ1csS0FBUCxDQUFhRSxXQUFiLEtBQTZCO0FBQUNLLE1BQUFBLFFBQVEsRUFBRUM7QUFBWCxLQURqRDs7QUFHQSxRQUFJRSxVQUFVLENBQUNKLFdBQUQsRUFBY0csYUFBZCxDQUFkLEVBQTRDO0FBQzFDO0FBQ0FqQixNQUFBQSxHQUFHLENBQUNRLEtBQUosQ0FBVVcsSUFBVixDQUFlQyxTQUFTLENBQUNOLFdBQUQsRUFBY0gsVUFBZCxDQUF4QjtBQUNBRixNQUFBQSxTQUFTO0FBQ1RHLE1BQUFBLFlBQVksSUFBSUUsV0FBVyxDQUFDckIsUUFBWixHQUF1QnFCLFdBQVcsQ0FBQ3RCLFFBQW5EO0FBQ0QsS0FMRCxNQUtPLElBQUkwQixVQUFVLENBQUNELGFBQUQsRUFBZ0JILFdBQWhCLENBQWQsRUFBNEM7QUFDakQ7QUFDQWQsTUFBQUEsR0FBRyxDQUFDUSxLQUFKLENBQVVXLElBQVYsQ0FBZUMsU0FBUyxDQUFDSCxhQUFELEVBQWdCTCxZQUFoQixDQUF4QjtBQUNBRixNQUFBQSxXQUFXO0FBQ1hDLE1BQUFBLFVBQVUsSUFBSU0sYUFBYSxDQUFDeEIsUUFBZCxHQUF5QndCLGFBQWEsQ0FBQ3pCLFFBQXJEO0FBQ0QsS0FMTSxNQUtBO0FBQ0w7QUFDQSxVQUFJNkIsVUFBVSxHQUFHO0FBQ2ZOLFFBQUFBLFFBQVEsRUFBRU8sSUFBSSxDQUFDQyxHQUFMLENBQVNULFdBQVcsQ0FBQ0MsUUFBckIsRUFBK0JFLGFBQWEsQ0FBQ0YsUUFBN0MsQ0FESztBQUVmdkIsUUFBQUEsUUFBUSxFQUFFLENBRks7QUFHZmdDLFFBQUFBLFFBQVEsRUFBRUYsSUFBSSxDQUFDQyxHQUFMLENBQVNULFdBQVcsQ0FBQ1UsUUFBWixHQUF1QmIsVUFBaEMsRUFBNENNLGFBQWEsQ0FBQ0YsUUFBZCxHQUF5QkgsWUFBckUsQ0FISztBQUlmbkIsUUFBQUEsUUFBUSxFQUFFLENBSks7QUFLZkYsUUFBQUEsS0FBSyxFQUFFO0FBTFEsT0FBakI7QUFPQWtDLE1BQUFBLFVBQVUsQ0FBQ0osVUFBRCxFQUFhUCxXQUFXLENBQUNDLFFBQXpCLEVBQW1DRCxXQUFXLENBQUN2QixLQUEvQyxFQUFzRDBCLGFBQWEsQ0FBQ0YsUUFBcEUsRUFBOEVFLGFBQWEsQ0FBQzFCLEtBQTVGLENBQVY7QUFDQW1CLE1BQUFBLFdBQVc7QUFDWEQsTUFBQUEsU0FBUztBQUVUVCxNQUFBQSxHQUFHLENBQUNRLEtBQUosQ0FBVVcsSUFBVixDQUFlRSxVQUFmO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPckIsR0FBUDtBQUNEOztBQUVELFNBQVNELFNBQVQsQ0FBbUIyQixLQUFuQixFQUEwQjVCLElBQTFCLEVBQWdDO0FBQzlCLE1BQUksT0FBTzRCLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDN0IsUUFBSyxNQUFELENBQVNDLElBQVQsQ0FBY0QsS0FBZCxLQUEwQixVQUFELENBQWFDLElBQWIsQ0FBa0JELEtBQWxCLENBQTdCLEVBQXdEO0FBQ3RELGFBQU87QUFBQTtBQUFBO0FBQUE7O0FBQUFFO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxTQUFXRixLQUFYLEVBQWtCLENBQWxCO0FBQVA7QUFDRDs7QUFFRCxRQUFJLENBQUM1QixJQUFMLEVBQVc7QUFDVCxZQUFNLElBQUkrQixLQUFKLENBQVUsa0RBQVYsQ0FBTjtBQUNEOztBQUNELFdBQU87QUFBQTtBQUFBO0FBQUE7O0FBQUFDO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxPQUFnQnBDLFNBQWhCLEVBQTJCQSxTQUEzQixFQUFzQ0ksSUFBdEMsRUFBNEM0QixLQUE1QztBQUFQO0FBQ0Q7O0FBRUQsU0FBT0EsS0FBUDtBQUNEOztBQUVELFNBQVN2QixlQUFULENBQXlCNEIsS0FBekIsRUFBZ0M7QUFDOUIsU0FBT0EsS0FBSyxDQUFDN0IsV0FBTixJQUFxQjZCLEtBQUssQ0FBQzdCLFdBQU4sS0FBc0I2QixLQUFLLENBQUMzQixXQUF4RDtBQUNEOztBQUVELFNBQVNHLFdBQVQsQ0FBcUJOLEtBQXJCLEVBQTRCTCxJQUE1QixFQUFrQ0MsTUFBbEMsRUFBMEM7QUFDeEMsTUFBSUQsSUFBSSxLQUFLQyxNQUFiLEVBQXFCO0FBQ25CLFdBQU9ELElBQVA7QUFDRCxHQUZELE1BRU87QUFDTEssSUFBQUEsS0FBSyxDQUFDK0IsUUFBTixHQUFpQixJQUFqQjtBQUNBLFdBQU87QUFBQ3BDLE1BQUFBLElBQUksRUFBSkEsSUFBRDtBQUFPQyxNQUFBQSxNQUFNLEVBQU5BO0FBQVAsS0FBUDtBQUNEO0FBQ0Y7O0FBRUQsU0FBU3FCLFVBQVQsQ0FBb0JTLElBQXBCLEVBQTBCTSxLQUExQixFQUFpQztBQUMvQixTQUFPTixJQUFJLENBQUNaLFFBQUwsR0FBZ0JrQixLQUFLLENBQUNsQixRQUF0QixJQUNEWSxJQUFJLENBQUNaLFFBQUwsR0FBZ0JZLElBQUksQ0FBQ25DLFFBQXRCLEdBQWtDeUMsS0FBSyxDQUFDbEIsUUFEN0M7QUFFRDs7QUFFRCxTQUFTSyxTQUFULENBQW1CL0IsSUFBbkIsRUFBeUI2QyxNQUF6QixFQUFpQztBQUMvQixTQUFPO0FBQ0xuQixJQUFBQSxRQUFRLEVBQUUxQixJQUFJLENBQUMwQixRQURWO0FBQ29CdkIsSUFBQUEsUUFBUSxFQUFFSCxJQUFJLENBQUNHLFFBRG5DO0FBRUxnQyxJQUFBQSxRQUFRLEVBQUVuQyxJQUFJLENBQUNtQyxRQUFMLEdBQWdCVSxNQUZyQjtBQUU2QnpDLElBQUFBLFFBQVEsRUFBRUosSUFBSSxDQUFDSSxRQUY1QztBQUdMRixJQUFBQSxLQUFLLEVBQUVGLElBQUksQ0FBQ0U7QUFIUCxHQUFQO0FBS0Q7O0FBRUQsU0FBU2tDLFVBQVQsQ0FBb0JwQyxJQUFwQixFQUEwQnNCLFVBQTFCLEVBQXNDd0IsU0FBdEMsRUFBaURDLFdBQWpELEVBQThEQyxVQUE5RCxFQUEwRTtBQUN4RTtBQUNBO0FBQ0EsTUFBSXpDLElBQUksR0FBRztBQUFDc0MsSUFBQUEsTUFBTSxFQUFFdkIsVUFBVDtBQUFxQnBCLElBQUFBLEtBQUssRUFBRTRDLFNBQTVCO0FBQXVDbEMsSUFBQUEsS0FBSyxFQUFFO0FBQTlDLEdBQVg7QUFBQSxNQUNJcUMsS0FBSyxHQUFHO0FBQUNKLElBQUFBLE1BQU0sRUFBRUUsV0FBVDtBQUFzQjdDLElBQUFBLEtBQUssRUFBRThDLFVBQTdCO0FBQXlDcEMsSUFBQUEsS0FBSyxFQUFFO0FBQWhELEdBRFosQ0FId0UsQ0FNeEU7O0FBQ0FzQyxFQUFBQSxhQUFhLENBQUNsRCxJQUFELEVBQU9PLElBQVAsRUFBYTBDLEtBQWIsQ0FBYjtBQUNBQyxFQUFBQSxhQUFhLENBQUNsRCxJQUFELEVBQU9pRCxLQUFQLEVBQWMxQyxJQUFkLENBQWIsQ0FSd0UsQ0FVeEU7O0FBQ0EsU0FBT0EsSUFBSSxDQUFDSyxLQUFMLEdBQWFMLElBQUksQ0FBQ0wsS0FBTCxDQUFXc0IsTUFBeEIsSUFBa0N5QixLQUFLLENBQUNyQyxLQUFOLEdBQWNxQyxLQUFLLENBQUMvQyxLQUFOLENBQVlzQixNQUFuRSxFQUEyRTtBQUN6RSxRQUFJQyxXQUFXLEdBQUdsQixJQUFJLENBQUNMLEtBQUwsQ0FBV0ssSUFBSSxDQUFDSyxLQUFoQixDQUFsQjtBQUFBLFFBQ0l1QyxZQUFZLEdBQUdGLEtBQUssQ0FBQy9DLEtBQU4sQ0FBWStDLEtBQUssQ0FBQ3JDLEtBQWxCLENBRG5COztBQUdBLFFBQUksQ0FBQ2EsV0FBVyxDQUFDLENBQUQsQ0FBWCxLQUFtQixHQUFuQixJQUEwQkEsV0FBVyxDQUFDLENBQUQsQ0FBWCxLQUFtQixHQUE5QyxNQUNJMEIsWUFBWSxDQUFDLENBQUQsQ0FBWixLQUFvQixHQUFwQixJQUEyQkEsWUFBWSxDQUFDLENBQUQsQ0FBWixLQUFvQixHQURuRCxDQUFKLEVBQzZEO0FBQzNEO0FBQ0FDLE1BQUFBLFlBQVksQ0FBQ3BELElBQUQsRUFBT08sSUFBUCxFQUFhMEMsS0FBYixDQUFaO0FBQ0QsS0FKRCxNQUlPLElBQUl4QixXQUFXLENBQUMsQ0FBRCxDQUFYLEtBQW1CLEdBQW5CLElBQTBCMEIsWUFBWSxDQUFDLENBQUQsQ0FBWixLQUFvQixHQUFsRCxFQUF1RDtBQUFBO0FBQUE7O0FBQUE7QUFDNUQ7O0FBQ0E7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUFuRCxNQUFBQSxJQUFJLENBQUNFLEtBQUwsRUFBVzRCLElBQVg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQnVCLE1BQUFBLGFBQWEsQ0FBQzlDLElBQUQsQ0FBakM7QUFDRCxLQUhNLE1BR0EsSUFBSTRDLFlBQVksQ0FBQyxDQUFELENBQVosS0FBb0IsR0FBcEIsSUFBMkIxQixXQUFXLENBQUMsQ0FBRCxDQUFYLEtBQW1CLEdBQWxELEVBQXVEO0FBQUE7QUFBQTs7QUFBQTtBQUM1RDs7QUFDQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQXpCLE1BQUFBLElBQUksQ0FBQ0UsS0FBTCxFQUFXNEIsSUFBWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9CdUIsTUFBQUEsYUFBYSxDQUFDSixLQUFELENBQWpDO0FBQ0QsS0FITSxNQUdBLElBQUl4QixXQUFXLENBQUMsQ0FBRCxDQUFYLEtBQW1CLEdBQW5CLElBQTBCMEIsWUFBWSxDQUFDLENBQUQsQ0FBWixLQUFvQixHQUFsRCxFQUF1RDtBQUM1RDtBQUNBRyxNQUFBQSxPQUFPLENBQUN0RCxJQUFELEVBQU9PLElBQVAsRUFBYTBDLEtBQWIsQ0FBUDtBQUNELEtBSE0sTUFHQSxJQUFJRSxZQUFZLENBQUMsQ0FBRCxDQUFaLEtBQW9CLEdBQXBCLElBQTJCMUIsV0FBVyxDQUFDLENBQUQsQ0FBWCxLQUFtQixHQUFsRCxFQUF1RDtBQUM1RDtBQUNBNkIsTUFBQUEsT0FBTyxDQUFDdEQsSUFBRCxFQUFPaUQsS0FBUCxFQUFjMUMsSUFBZCxFQUFvQixJQUFwQixDQUFQO0FBQ0QsS0FITSxNQUdBLElBQUlrQixXQUFXLEtBQUswQixZQUFwQixFQUFrQztBQUN2QztBQUNBbkQsTUFBQUEsSUFBSSxDQUFDRSxLQUFMLENBQVc0QixJQUFYLENBQWdCTCxXQUFoQjtBQUNBbEIsTUFBQUEsSUFBSSxDQUFDSyxLQUFMO0FBQ0FxQyxNQUFBQSxLQUFLLENBQUNyQyxLQUFOO0FBQ0QsS0FMTSxNQUtBO0FBQ0w7QUFDQStCLE1BQUFBLFFBQVEsQ0FBQzNDLElBQUQsRUFBT3FELGFBQWEsQ0FBQzlDLElBQUQsQ0FBcEIsRUFBNEI4QyxhQUFhLENBQUNKLEtBQUQsQ0FBekMsQ0FBUjtBQUNEO0FBQ0YsR0F4Q3VFLENBMEN4RTs7O0FBQ0FNLEVBQUFBLGNBQWMsQ0FBQ3ZELElBQUQsRUFBT08sSUFBUCxDQUFkO0FBQ0FnRCxFQUFBQSxjQUFjLENBQUN2RCxJQUFELEVBQU9pRCxLQUFQLENBQWQ7QUFFQWxELEVBQUFBLGFBQWEsQ0FBQ0MsSUFBRCxDQUFiO0FBQ0Q7O0FBRUQsU0FBU29ELFlBQVQsQ0FBc0JwRCxJQUF0QixFQUE0Qk8sSUFBNUIsRUFBa0MwQyxLQUFsQyxFQUF5QztBQUN2QyxNQUFJTyxTQUFTLEdBQUdILGFBQWEsQ0FBQzlDLElBQUQsQ0FBN0I7QUFBQSxNQUNJa0QsWUFBWSxHQUFHSixhQUFhLENBQUNKLEtBQUQsQ0FEaEM7O0FBR0EsTUFBSVMsVUFBVSxDQUFDRixTQUFELENBQVYsSUFBeUJFLFVBQVUsQ0FBQ0QsWUFBRCxDQUF2QyxFQUF1RDtBQUNyRDtBQUNBO0FBQUk7QUFBQTtBQUFBOztBQUFBRTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBO0FBQUEsS0FBZ0JILFNBQWhCLEVBQTJCQyxZQUEzQixLQUNHRyxrQkFBa0IsQ0FBQ1gsS0FBRCxFQUFRTyxTQUFSLEVBQW1CQSxTQUFTLENBQUNoQyxNQUFWLEdBQW1CaUMsWUFBWSxDQUFDakMsTUFBbkQsQ0FEekIsRUFDcUY7QUFBQTtBQUFBOztBQUFBOztBQUNuRjs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQXhCLE1BQUFBLElBQUksQ0FBQ0UsS0FBTCxFQUFXNEIsSUFBWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9CMEIsTUFBQUEsU0FBcEI7O0FBQ0E7QUFDRCxLQUpELE1BSU87QUFBSTtBQUFBO0FBQUE7O0FBQUFHO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxLQUFnQkYsWUFBaEIsRUFBOEJELFNBQTlCLEtBQ0pJLGtCQUFrQixDQUFDckQsSUFBRCxFQUFPa0QsWUFBUCxFQUFxQkEsWUFBWSxDQUFDakMsTUFBYixHQUFzQmdDLFNBQVMsQ0FBQ2hDLE1BQXJELENBRGxCLEVBQ2dGO0FBQUE7QUFBQTs7QUFBQTs7QUFDckY7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUF4QixNQUFBQSxJQUFJLENBQUNFLEtBQUwsRUFBVzRCLElBQVg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQjJCLE1BQUFBLFlBQXBCOztBQUNBO0FBQ0Q7QUFDRixHQVhELE1BV087QUFBSTtBQUFBO0FBQUE7O0FBQUFJO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxHQUFXTCxTQUFYLEVBQXNCQyxZQUF0QixDQUFKLEVBQXlDO0FBQUE7QUFBQTs7QUFBQTs7QUFDOUM7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUF6RCxJQUFBQSxJQUFJLENBQUNFLEtBQUwsRUFBVzRCLElBQVg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQjBCLElBQUFBLFNBQXBCOztBQUNBO0FBQ0Q7O0FBRURiLEVBQUFBLFFBQVEsQ0FBQzNDLElBQUQsRUFBT3dELFNBQVAsRUFBa0JDLFlBQWxCLENBQVI7QUFDRDs7QUFFRCxTQUFTSCxPQUFULENBQWlCdEQsSUFBakIsRUFBdUJPLElBQXZCLEVBQTZCMEMsS0FBN0IsRUFBb0NhLElBQXBDLEVBQTBDO0FBQ3hDLE1BQUlOLFNBQVMsR0FBR0gsYUFBYSxDQUFDOUMsSUFBRCxDQUE3QjtBQUFBLE1BQ0lrRCxZQUFZLEdBQUdNLGNBQWMsQ0FBQ2QsS0FBRCxFQUFRTyxTQUFSLENBRGpDOztBQUVBLE1BQUlDLFlBQVksQ0FBQ08sTUFBakIsRUFBeUI7QUFBQTtBQUFBOztBQUFBOztBQUN2Qjs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQWhFLElBQUFBLElBQUksQ0FBQ0UsS0FBTCxFQUFXNEIsSUFBWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9CMkIsSUFBQUEsWUFBWSxDQUFDTyxNQUFqQztBQUNELEdBRkQsTUFFTztBQUNMckIsSUFBQUEsUUFBUSxDQUFDM0MsSUFBRCxFQUFPOEQsSUFBSSxHQUFHTCxZQUFILEdBQWtCRCxTQUE3QixFQUF3Q00sSUFBSSxHQUFHTixTQUFILEdBQWVDLFlBQTNELENBQVI7QUFDRDtBQUNGOztBQUVELFNBQVNkLFFBQVQsQ0FBa0IzQyxJQUFsQixFQUF3Qk8sSUFBeEIsRUFBOEIwQyxLQUE5QixFQUFxQztBQUNuQ2pELEVBQUFBLElBQUksQ0FBQzJDLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQTNDLEVBQUFBLElBQUksQ0FBQ0UsS0FBTCxDQUFXNEIsSUFBWCxDQUFnQjtBQUNkYSxJQUFBQSxRQUFRLEVBQUUsSUFESTtBQUVkcEMsSUFBQUEsSUFBSSxFQUFFQSxJQUZRO0FBR2RDLElBQUFBLE1BQU0sRUFBRXlDO0FBSE0sR0FBaEI7QUFLRDs7QUFFRCxTQUFTQyxhQUFULENBQXVCbEQsSUFBdkIsRUFBNkJpRSxNQUE3QixFQUFxQ2hCLEtBQXJDLEVBQTRDO0FBQzFDLFNBQU9nQixNQUFNLENBQUNwQixNQUFQLEdBQWdCSSxLQUFLLENBQUNKLE1BQXRCLElBQWdDb0IsTUFBTSxDQUFDckQsS0FBUCxHQUFlcUQsTUFBTSxDQUFDL0QsS0FBUCxDQUFhc0IsTUFBbkUsRUFBMkU7QUFDekUsUUFBSTBDLElBQUksR0FBR0QsTUFBTSxDQUFDL0QsS0FBUCxDQUFhK0QsTUFBTSxDQUFDckQsS0FBUCxFQUFiLENBQVg7QUFDQVosSUFBQUEsSUFBSSxDQUFDRSxLQUFMLENBQVc0QixJQUFYLENBQWdCb0MsSUFBaEI7QUFDQUQsSUFBQUEsTUFBTSxDQUFDcEIsTUFBUDtBQUNEO0FBQ0Y7O0FBQ0QsU0FBU1UsY0FBVCxDQUF3QnZELElBQXhCLEVBQThCaUUsTUFBOUIsRUFBc0M7QUFDcEMsU0FBT0EsTUFBTSxDQUFDckQsS0FBUCxHQUFlcUQsTUFBTSxDQUFDL0QsS0FBUCxDQUFhc0IsTUFBbkMsRUFBMkM7QUFDekMsUUFBSTBDLElBQUksR0FBR0QsTUFBTSxDQUFDL0QsS0FBUCxDQUFhK0QsTUFBTSxDQUFDckQsS0FBUCxFQUFiLENBQVg7QUFDQVosSUFBQUEsSUFBSSxDQUFDRSxLQUFMLENBQVc0QixJQUFYLENBQWdCb0MsSUFBaEI7QUFDRDtBQUNGOztBQUVELFNBQVNiLGFBQVQsQ0FBdUJjLEtBQXZCLEVBQThCO0FBQzVCLE1BQUl4RCxHQUFHLEdBQUcsRUFBVjtBQUFBLE1BQ0l5RCxTQUFTLEdBQUdELEtBQUssQ0FBQ2pFLEtBQU4sQ0FBWWlFLEtBQUssQ0FBQ3ZELEtBQWxCLEVBQXlCLENBQXpCLENBRGhCOztBQUVBLFNBQU91RCxLQUFLLENBQUN2RCxLQUFOLEdBQWN1RCxLQUFLLENBQUNqRSxLQUFOLENBQVlzQixNQUFqQyxFQUF5QztBQUN2QyxRQUFJMEMsSUFBSSxHQUFHQyxLQUFLLENBQUNqRSxLQUFOLENBQVlpRSxLQUFLLENBQUN2RCxLQUFsQixDQUFYLENBRHVDLENBR3ZDOztBQUNBLFFBQUl3RCxTQUFTLEtBQUssR0FBZCxJQUFxQkYsSUFBSSxDQUFDLENBQUQsQ0FBSixLQUFZLEdBQXJDLEVBQTBDO0FBQ3hDRSxNQUFBQSxTQUFTLEdBQUcsR0FBWjtBQUNEOztBQUVELFFBQUlBLFNBQVMsS0FBS0YsSUFBSSxDQUFDLENBQUQsQ0FBdEIsRUFBMkI7QUFDekJ2RCxNQUFBQSxHQUFHLENBQUNtQixJQUFKLENBQVNvQyxJQUFUO0FBQ0FDLE1BQUFBLEtBQUssQ0FBQ3ZELEtBQU47QUFDRCxLQUhELE1BR087QUFDTDtBQUNEO0FBQ0Y7O0FBRUQsU0FBT0QsR0FBUDtBQUNEOztBQUNELFNBQVNvRCxjQUFULENBQXdCSSxLQUF4QixFQUErQkUsWUFBL0IsRUFBNkM7QUFDM0MsTUFBSUMsT0FBTyxHQUFHLEVBQWQ7QUFBQSxNQUNJTixNQUFNLEdBQUcsRUFEYjtBQUFBLE1BRUlPLFVBQVUsR0FBRyxDQUZqQjtBQUFBLE1BR0lDLGNBQWMsR0FBRyxLQUhyQjtBQUFBLE1BSUlDLFVBQVUsR0FBRyxLQUpqQjs7QUFLQSxTQUFPRixVQUFVLEdBQUdGLFlBQVksQ0FBQzdDLE1BQTFCLElBQ0UyQyxLQUFLLENBQUN2RCxLQUFOLEdBQWN1RCxLQUFLLENBQUNqRSxLQUFOLENBQVlzQixNQURuQyxFQUMyQztBQUN6QyxRQUFJa0QsTUFBTSxHQUFHUCxLQUFLLENBQUNqRSxLQUFOLENBQVlpRSxLQUFLLENBQUN2RCxLQUFsQixDQUFiO0FBQUEsUUFDSStELEtBQUssR0FBR04sWUFBWSxDQUFDRSxVQUFELENBRHhCLENBRHlDLENBSXpDOztBQUNBLFFBQUlJLEtBQUssQ0FBQyxDQUFELENBQUwsS0FBYSxHQUFqQixFQUFzQjtBQUNwQjtBQUNEOztBQUVESCxJQUFBQSxjQUFjLEdBQUdBLGNBQWMsSUFBSUUsTUFBTSxDQUFDLENBQUQsQ0FBTixLQUFjLEdBQWpEO0FBRUFWLElBQUFBLE1BQU0sQ0FBQ2xDLElBQVAsQ0FBWTZDLEtBQVo7QUFDQUosSUFBQUEsVUFBVSxHQVorQixDQWN6QztBQUNBOztBQUNBLFFBQUlHLE1BQU0sQ0FBQyxDQUFELENBQU4sS0FBYyxHQUFsQixFQUF1QjtBQUNyQkQsTUFBQUEsVUFBVSxHQUFHLElBQWI7O0FBRUEsYUFBT0MsTUFBTSxDQUFDLENBQUQsQ0FBTixLQUFjLEdBQXJCLEVBQTBCO0FBQ3hCSixRQUFBQSxPQUFPLENBQUN4QyxJQUFSLENBQWE0QyxNQUFiO0FBQ0FBLFFBQUFBLE1BQU0sR0FBR1AsS0FBSyxDQUFDakUsS0FBTixDQUFZLEVBQUVpRSxLQUFLLENBQUN2RCxLQUFwQixDQUFUO0FBQ0Q7QUFDRjs7QUFFRCxRQUFJK0QsS0FBSyxDQUFDQyxNQUFOLENBQWEsQ0FBYixNQUFvQkYsTUFBTSxDQUFDRSxNQUFQLENBQWMsQ0FBZCxDQUF4QixFQUEwQztBQUN4Q04sTUFBQUEsT0FBTyxDQUFDeEMsSUFBUixDQUFhNEMsTUFBYjtBQUNBUCxNQUFBQSxLQUFLLENBQUN2RCxLQUFOO0FBQ0QsS0FIRCxNQUdPO0FBQ0w2RCxNQUFBQSxVQUFVLEdBQUcsSUFBYjtBQUNEO0FBQ0Y7O0FBRUQsTUFBSSxDQUFDSixZQUFZLENBQUNFLFVBQUQsQ0FBWixJQUE0QixFQUE3QixFQUFpQyxDQUFqQyxNQUF3QyxHQUF4QyxJQUNHQyxjQURQLEVBQ3VCO0FBQ3JCQyxJQUFBQSxVQUFVLEdBQUcsSUFBYjtBQUNEOztBQUVELE1BQUlBLFVBQUosRUFBZ0I7QUFDZCxXQUFPSCxPQUFQO0FBQ0Q7O0FBRUQsU0FBT0MsVUFBVSxHQUFHRixZQUFZLENBQUM3QyxNQUFqQyxFQUF5QztBQUN2Q3dDLElBQUFBLE1BQU0sQ0FBQ2xDLElBQVAsQ0FBWXVDLFlBQVksQ0FBQ0UsVUFBVSxFQUFYLENBQXhCO0FBQ0Q7O0FBRUQsU0FBTztBQUNMUCxJQUFBQSxNQUFNLEVBQU5BLE1BREs7QUFFTE0sSUFBQUEsT0FBTyxFQUFQQTtBQUZLLEdBQVA7QUFJRDs7QUFFRCxTQUFTWixVQUFULENBQW9CWSxPQUFwQixFQUE2QjtBQUMzQixTQUFPQSxPQUFPLENBQUNPLE1BQVIsQ0FBZSxVQUFTQyxJQUFULEVBQWVKLE1BQWYsRUFBdUI7QUFDM0MsV0FBT0ksSUFBSSxJQUFJSixNQUFNLENBQUMsQ0FBRCxDQUFOLEtBQWMsR0FBN0I7QUFDRCxHQUZNLEVBRUosSUFGSSxDQUFQO0FBR0Q7O0FBQ0QsU0FBU2Qsa0JBQVQsQ0FBNEJPLEtBQTVCLEVBQW1DWSxhQUFuQyxFQUFrREMsS0FBbEQsRUFBeUQ7QUFDdkQsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRCxLQUFwQixFQUEyQkMsQ0FBQyxFQUE1QixFQUFnQztBQUM5QixRQUFJQyxhQUFhLEdBQUdILGFBQWEsQ0FBQ0EsYUFBYSxDQUFDdkQsTUFBZCxHQUF1QndELEtBQXZCLEdBQStCQyxDQUFoQyxDQUFiLENBQWdETCxNQUFoRCxDQUF1RCxDQUF2RCxDQUFwQjs7QUFDQSxRQUFJVCxLQUFLLENBQUNqRSxLQUFOLENBQVlpRSxLQUFLLENBQUN2RCxLQUFOLEdBQWNxRSxDQUExQixNQUFpQyxNQUFNQyxhQUEzQyxFQUEwRDtBQUN4RCxhQUFPLEtBQVA7QUFDRDtBQUNGOztBQUVEZixFQUFBQSxLQUFLLENBQUN2RCxLQUFOLElBQWVvRSxLQUFmO0FBQ0EsU0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBUy9FLG1CQUFULENBQTZCQyxLQUE3QixFQUFvQztBQUNsQyxNQUFJQyxRQUFRLEdBQUcsQ0FBZjtBQUNBLE1BQUlDLFFBQVEsR0FBRyxDQUFmO0FBRUFGLEVBQUFBLEtBQUssQ0FBQ2lGLE9BQU4sQ0FBYyxVQUFTakIsSUFBVCxFQUFlO0FBQzNCLFFBQUksT0FBT0EsSUFBUCxLQUFnQixRQUFwQixFQUE4QjtBQUM1QixVQUFJa0IsT0FBTyxHQUFHbkYsbUJBQW1CLENBQUNpRSxJQUFJLENBQUMzRCxJQUFOLENBQWpDO0FBQ0EsVUFBSThFLFVBQVUsR0FBR3BGLG1CQUFtQixDQUFDaUUsSUFBSSxDQUFDMUQsTUFBTixDQUFwQzs7QUFFQSxVQUFJTCxRQUFRLEtBQUtFLFNBQWpCLEVBQTRCO0FBQzFCLFlBQUkrRSxPQUFPLENBQUNqRixRQUFSLEtBQXFCa0YsVUFBVSxDQUFDbEYsUUFBcEMsRUFBOEM7QUFDNUNBLFVBQUFBLFFBQVEsSUFBSWlGLE9BQU8sQ0FBQ2pGLFFBQXBCO0FBQ0QsU0FGRCxNQUVPO0FBQ0xBLFVBQUFBLFFBQVEsR0FBR0UsU0FBWDtBQUNEO0FBQ0Y7O0FBRUQsVUFBSUQsUUFBUSxLQUFLQyxTQUFqQixFQUE0QjtBQUMxQixZQUFJK0UsT0FBTyxDQUFDaEYsUUFBUixLQUFxQmlGLFVBQVUsQ0FBQ2pGLFFBQXBDLEVBQThDO0FBQzVDQSxVQUFBQSxRQUFRLElBQUlnRixPQUFPLENBQUNoRixRQUFwQjtBQUNELFNBRkQsTUFFTztBQUNMQSxVQUFBQSxRQUFRLEdBQUdDLFNBQVg7QUFDRDtBQUNGO0FBQ0YsS0FuQkQsTUFtQk87QUFDTCxVQUFJRCxRQUFRLEtBQUtDLFNBQWIsS0FBMkI2RCxJQUFJLENBQUMsQ0FBRCxDQUFKLEtBQVksR0FBWixJQUFtQkEsSUFBSSxDQUFDLENBQUQsQ0FBSixLQUFZLEdBQTFELENBQUosRUFBb0U7QUFDbEU5RCxRQUFBQSxRQUFRO0FBQ1Q7O0FBQ0QsVUFBSUQsUUFBUSxLQUFLRSxTQUFiLEtBQTJCNkQsSUFBSSxDQUFDLENBQUQsQ0FBSixLQUFZLEdBQVosSUFBbUJBLElBQUksQ0FBQyxDQUFELENBQUosS0FBWSxHQUExRCxDQUFKLEVBQW9FO0FBQ2xFL0QsUUFBQUEsUUFBUTtBQUNUO0FBQ0Y7QUFDRixHQTVCRDtBQThCQSxTQUFPO0FBQUNBLElBQUFBLFFBQVEsRUFBUkEsUUFBRDtBQUFXQyxJQUFBQSxRQUFRLEVBQVJBO0FBQVgsR0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtzdHJ1Y3R1cmVkUGF0Y2h9IGZyb20gJy4vY3JlYXRlJztcbmltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXJzZSc7XG5cbmltcG9ydCB7YXJyYXlFcXVhbCwgYXJyYXlTdGFydHNXaXRofSBmcm9tICcuLi91dGlsL2FycmF5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNMaW5lQ291bnQoaHVuaykge1xuICBjb25zdCB7b2xkTGluZXMsIG5ld0xpbmVzfSA9IGNhbGNPbGROZXdMaW5lQ291bnQoaHVuay5saW5lcyk7XG5cbiAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBodW5rLm9sZExpbmVzID0gb2xkTGluZXM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGh1bmsub2xkTGluZXM7XG4gIH1cblxuICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGh1bmsubmV3TGluZXMgPSBuZXdMaW5lcztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgaHVuay5uZXdMaW5lcztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2UobWluZSwgdGhlaXJzLCBiYXNlKSB7XG4gIG1pbmUgPSBsb2FkUGF0Y2gobWluZSwgYmFzZSk7XG4gIHRoZWlycyA9IGxvYWRQYXRjaCh0aGVpcnMsIGJhc2UpO1xuXG4gIGxldCByZXQgPSB7fTtcblxuICAvLyBGb3IgaW5kZXggd2UganVzdCBsZXQgaXQgcGFzcyB0aHJvdWdoIGFzIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgbmVjZXNzYXJ5IG1lYW5pbmcuXG4gIC8vIExlYXZpbmcgc2FuaXR5IGNoZWNrcyBvbiB0aGlzIHRvIHRoZSBBUEkgY29uc3VtZXIgdGhhdCBtYXkga25vdyBtb3JlIGFib3V0IHRoZVxuICAvLyBtZWFuaW5nIGluIHRoZWlyIG93biBjb250ZXh0LlxuICBpZiAobWluZS5pbmRleCB8fCB0aGVpcnMuaW5kZXgpIHtcbiAgICByZXQuaW5kZXggPSBtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleDtcbiAgfVxuXG4gIGlmIChtaW5lLm5ld0ZpbGVOYW1lIHx8IHRoZWlycy5uZXdGaWxlTmFtZSkge1xuICAgIGlmICghZmlsZU5hbWVDaGFuZ2VkKG1pbmUpKSB7XG4gICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIG91cnMsIHVzZSB0aGVpcnMgKGFuZCBvdXJzIGlmIHRoZWlycyBkb2VzIG5vdCBleGlzdClcbiAgICAgIHJldC5vbGRGaWxlTmFtZSA9IHRoZWlycy5vbGRGaWxlTmFtZSB8fCBtaW5lLm9sZEZpbGVOYW1lO1xuICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gdGhlaXJzLm5ld0ZpbGVOYW1lIHx8IG1pbmUubmV3RmlsZU5hbWU7XG4gICAgICByZXQub2xkSGVhZGVyID0gdGhlaXJzLm9sZEhlYWRlciB8fCBtaW5lLm9sZEhlYWRlcjtcbiAgICAgIHJldC5uZXdIZWFkZXIgPSB0aGVpcnMubmV3SGVhZGVyIHx8IG1pbmUubmV3SGVhZGVyO1xuICAgIH0gZWxzZSBpZiAoIWZpbGVOYW1lQ2hhbmdlZCh0aGVpcnMpKSB7XG4gICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIHRoZWlycywgdXNlIG91cnNcbiAgICAgIHJldC5vbGRGaWxlTmFtZSA9IG1pbmUub2xkRmlsZU5hbWU7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSBtaW5lLm5ld0ZpbGVOYW1lO1xuICAgICAgcmV0Lm9sZEhlYWRlciA9IG1pbmUub2xkSGVhZGVyO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IG1pbmUubmV3SGVhZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb3RoIGNoYW5nZWQuLi4gZmlndXJlIGl0IG91dFxuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEZpbGVOYW1lLCB0aGVpcnMub2xkRmlsZU5hbWUpO1xuICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0ZpbGVOYW1lLCB0aGVpcnMubmV3RmlsZU5hbWUpO1xuICAgICAgcmV0Lm9sZEhlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5vbGRIZWFkZXIsIHRoZWlycy5vbGRIZWFkZXIpO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5uZXdIZWFkZXIsIHRoZWlycy5uZXdIZWFkZXIpO1xuICAgIH1cbiAgfVxuXG4gIHJldC5odW5rcyA9IFtdO1xuXG4gIGxldCBtaW5lSW5kZXggPSAwLFxuICAgICAgdGhlaXJzSW5kZXggPSAwLFxuICAgICAgbWluZU9mZnNldCA9IDAsXG4gICAgICB0aGVpcnNPZmZzZXQgPSAwO1xuXG4gIHdoaWxlIChtaW5lSW5kZXggPCBtaW5lLmh1bmtzLmxlbmd0aCB8fCB0aGVpcnNJbmRleCA8IHRoZWlycy5odW5rcy5sZW5ndGgpIHtcbiAgICBsZXQgbWluZUN1cnJlbnQgPSBtaW5lLmh1bmtzW21pbmVJbmRleF0gfHwge29sZFN0YXJ0OiBJbmZpbml0eX0sXG4gICAgICAgIHRoZWlyc0N1cnJlbnQgPSB0aGVpcnMuaHVua3NbdGhlaXJzSW5kZXhdIHx8IHtvbGRTdGFydDogSW5maW5pdHl9O1xuXG4gICAgaWYgKGh1bmtCZWZvcmUobWluZUN1cnJlbnQsIHRoZWlyc0N1cnJlbnQpKSB7XG4gICAgICAvLyBUaGlzIHBhdGNoIGRvZXMgbm90IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIG90aGVycywgeWF5LlxuICAgICAgcmV0Lmh1bmtzLnB1c2goY2xvbmVIdW5rKG1pbmVDdXJyZW50LCBtaW5lT2Zmc2V0KSk7XG4gICAgICBtaW5lSW5kZXgrKztcbiAgICAgIHRoZWlyc09mZnNldCArPSBtaW5lQ3VycmVudC5uZXdMaW5lcyAtIG1pbmVDdXJyZW50Lm9sZExpbmVzO1xuICAgIH0gZWxzZSBpZiAoaHVua0JlZm9yZSh0aGVpcnNDdXJyZW50LCBtaW5lQ3VycmVudCkpIHtcbiAgICAgIC8vIFRoaXMgcGF0Y2ggZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgb3RoZXJzLCB5YXkuXG4gICAgICByZXQuaHVua3MucHVzaChjbG9uZUh1bmsodGhlaXJzQ3VycmVudCwgdGhlaXJzT2Zmc2V0KSk7XG4gICAgICB0aGVpcnNJbmRleCsrO1xuICAgICAgbWluZU9mZnNldCArPSB0aGVpcnNDdXJyZW50Lm5ld0xpbmVzIC0gdGhlaXJzQ3VycmVudC5vbGRMaW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3ZlcmxhcCwgbWVyZ2UgYXMgYmVzdCB3ZSBjYW5cbiAgICAgIGxldCBtZXJnZWRIdW5rID0ge1xuICAgICAgICBvbGRTdGFydDogTWF0aC5taW4obWluZUN1cnJlbnQub2xkU3RhcnQsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQpLFxuICAgICAgICBvbGRMaW5lczogMCxcbiAgICAgICAgbmV3U3RhcnQ6IE1hdGgubWluKG1pbmVDdXJyZW50Lm5ld1N0YXJ0ICsgbWluZU9mZnNldCwgdGhlaXJzQ3VycmVudC5vbGRTdGFydCArIHRoZWlyc09mZnNldCksXG4gICAgICAgIG5ld0xpbmVzOiAwLFxuICAgICAgICBsaW5lczogW11cbiAgICAgIH07XG4gICAgICBtZXJnZUxpbmVzKG1lcmdlZEh1bmssIG1pbmVDdXJyZW50Lm9sZFN0YXJ0LCBtaW5lQ3VycmVudC5saW5lcywgdGhlaXJzQ3VycmVudC5vbGRTdGFydCwgdGhlaXJzQ3VycmVudC5saW5lcyk7XG4gICAgICB0aGVpcnNJbmRleCsrO1xuICAgICAgbWluZUluZGV4Kys7XG5cbiAgICAgIHJldC5odW5rcy5wdXNoKG1lcmdlZEh1bmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGxvYWRQYXRjaChwYXJhbSwgYmFzZSkge1xuICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgIGlmICgoL15AQC9tKS50ZXN0KHBhcmFtKSB8fCAoKC9eSW5kZXg6L20pLnRlc3QocGFyYW0pKSkge1xuICAgICAgcmV0dXJuIHBhcnNlUGF0Y2gocGFyYW0pWzBdO1xuICAgIH1cblxuICAgIGlmICghYmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgYSBiYXNlIHJlZmVyZW5jZSBvciBwYXNzIGluIGEgcGF0Y2gnKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRQYXRjaCh1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmFzZSwgcGFyYW0pO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtO1xufVxuXG5mdW5jdGlvbiBmaWxlTmFtZUNoYW5nZWQocGF0Y2gpIHtcbiAgcmV0dXJuIHBhdGNoLm5ld0ZpbGVOYW1lICYmIHBhdGNoLm5ld0ZpbGVOYW1lICE9PSBwYXRjaC5vbGRGaWxlTmFtZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0RmllbGQoaW5kZXgsIG1pbmUsIHRoZWlycykge1xuICBpZiAobWluZSA9PT0gdGhlaXJzKSB7XG4gICAgcmV0dXJuIG1pbmU7XG4gIH0gZWxzZSB7XG4gICAgaW5kZXguY29uZmxpY3QgPSB0cnVlO1xuICAgIHJldHVybiB7bWluZSwgdGhlaXJzfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBodW5rQmVmb3JlKHRlc3QsIGNoZWNrKSB7XG4gIHJldHVybiB0ZXN0Lm9sZFN0YXJ0IDwgY2hlY2sub2xkU3RhcnRcbiAgICAmJiAodGVzdC5vbGRTdGFydCArIHRlc3Qub2xkTGluZXMpIDwgY2hlY2sub2xkU3RhcnQ7XG59XG5cbmZ1bmN0aW9uIGNsb25lSHVuayhodW5rLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBvbGRTdGFydDogaHVuay5vbGRTdGFydCwgb2xkTGluZXM6IGh1bmsub2xkTGluZXMsXG4gICAgbmV3U3RhcnQ6IGh1bmsubmV3U3RhcnQgKyBvZmZzZXQsIG5ld0xpbmVzOiBodW5rLm5ld0xpbmVzLFxuICAgIGxpbmVzOiBodW5rLmxpbmVzXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlTGluZXMoaHVuaywgbWluZU9mZnNldCwgbWluZUxpbmVzLCB0aGVpck9mZnNldCwgdGhlaXJMaW5lcykge1xuICAvLyBUaGlzIHdpbGwgZ2VuZXJhbGx5IHJlc3VsdCBpbiBhIGNvbmZsaWN0ZWQgaHVuaywgYnV0IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgY29udGV4dFxuICAvLyBpcyB0aGUgb25seSBvdmVybGFwIHdoZXJlIHdlIGNhbiBzdWNjZXNzZnVsbHkgbWVyZ2UgdGhlIGNvbnRlbnQgaGVyZS5cbiAgbGV0IG1pbmUgPSB7b2Zmc2V0OiBtaW5lT2Zmc2V0LCBsaW5lczogbWluZUxpbmVzLCBpbmRleDogMH0sXG4gICAgICB0aGVpciA9IHtvZmZzZXQ6IHRoZWlyT2Zmc2V0LCBsaW5lczogdGhlaXJMaW5lcywgaW5kZXg6IDB9O1xuXG4gIC8vIEhhbmRsZSBhbnkgbGVhZGluZyBjb250ZW50XG4gIGluc2VydExlYWRpbmcoaHVuaywgbWluZSwgdGhlaXIpO1xuICBpbnNlcnRMZWFkaW5nKGh1bmssIHRoZWlyLCBtaW5lKTtcblxuICAvLyBOb3cgaW4gdGhlIG92ZXJsYXAgY29udGVudC4gU2NhbiB0aHJvdWdoIGFuZCBzZWxlY3QgdGhlIGJlc3QgY2hhbmdlcyBmcm9tIGVhY2guXG4gIHdoaWxlIChtaW5lLmluZGV4IDwgbWluZS5saW5lcy5sZW5ndGggJiYgdGhlaXIuaW5kZXggPCB0aGVpci5saW5lcy5sZW5ndGgpIHtcbiAgICBsZXQgbWluZUN1cnJlbnQgPSBtaW5lLmxpbmVzW21pbmUuaW5kZXhdLFxuICAgICAgICB0aGVpckN1cnJlbnQgPSB0aGVpci5saW5lc1t0aGVpci5pbmRleF07XG5cbiAgICBpZiAoKG1pbmVDdXJyZW50WzBdID09PSAnLScgfHwgbWluZUN1cnJlbnRbMF0gPT09ICcrJylcbiAgICAgICAgJiYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nIHx8IHRoZWlyQ3VycmVudFswXSA9PT0gJysnKSkge1xuICAgICAgLy8gQm90aCBtb2RpZmllZCAuLi5cbiAgICAgIG11dHVhbENoYW5nZShodW5rLCBtaW5lLCB0aGVpcik7XG4gICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJysnICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICAvLyBNaW5lIGluc2VydGVkXG4gICAgICBodW5rLmxpbmVzLnB1c2goLi4uIGNvbGxlY3RDaGFuZ2UobWluZSkpO1xuICAgIH0gZWxzZSBpZiAodGhlaXJDdXJyZW50WzBdID09PSAnKycgJiYgbWluZUN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgLy8gVGhlaXJzIGluc2VydGVkXG4gICAgICBodW5rLmxpbmVzLnB1c2goLi4uIGNvbGxlY3RDaGFuZ2UodGhlaXIpKTtcbiAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50WzBdID09PSAnLScgJiYgdGhlaXJDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8vIE1pbmUgcmVtb3ZlZCBvciBlZGl0ZWRcbiAgICAgIHJlbW92YWwoaHVuaywgbWluZSwgdGhlaXIpO1xuICAgIH0gZWxzZSBpZiAodGhlaXJDdXJyZW50WzBdID09PSAnLScgJiYgbWluZUN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgLy8gVGhlaXIgcmVtb3ZlZCBvciBlZGl0ZWRcbiAgICAgIHJlbW92YWwoaHVuaywgdGhlaXIsIG1pbmUsIHRydWUpO1xuICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnQgPT09IHRoZWlyQ3VycmVudCkge1xuICAgICAgLy8gQ29udGV4dCBpZGVudGl0eVxuICAgICAgaHVuay5saW5lcy5wdXNoKG1pbmVDdXJyZW50KTtcbiAgICAgIG1pbmUuaW5kZXgrKztcbiAgICAgIHRoZWlyLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnRleHQgbWlzbWF0Y2hcbiAgICAgIGNvbmZsaWN0KGh1bmssIGNvbGxlY3RDaGFuZ2UobWluZSksIGNvbGxlY3RDaGFuZ2UodGhlaXIpKTtcbiAgICB9XG4gIH1cblxuICAvLyBOb3cgcHVzaCBhbnl0aGluZyB0aGF0IG1heSBiZSByZW1haW5pbmdcbiAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgbWluZSk7XG4gIGluc2VydFRyYWlsaW5nKGh1bmssIHRoZWlyKTtcblxuICBjYWxjTGluZUNvdW50KGh1bmspO1xufVxuXG5mdW5jdGlvbiBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpIHtcbiAgbGV0IG15Q2hhbmdlcyA9IGNvbGxlY3RDaGFuZ2UobWluZSksXG4gICAgICB0aGVpckNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKHRoZWlyKTtcblxuICBpZiAoYWxsUmVtb3ZlcyhteUNoYW5nZXMpICYmIGFsbFJlbW92ZXModGhlaXJDaGFuZ2VzKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgcmVtb3ZlIGNoYW5nZXMgdGhhdCBhcmUgc3VwZXJzZXRzIG9mIG9uZSBhbm90aGVyXG4gICAgaWYgKGFycmF5U3RhcnRzV2l0aChteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcylcbiAgICAgICAgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KHRoZWlyLCBteUNoYW5nZXMsIG15Q2hhbmdlcy5sZW5ndGggLSB0aGVpckNoYW5nZXMubGVuZ3RoKSkge1xuICAgICAgaHVuay5saW5lcy5wdXNoKC4uLiBteUNoYW5nZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoYXJyYXlTdGFydHNXaXRoKHRoZWlyQ2hhbmdlcywgbXlDaGFuZ2VzKVxuICAgICAgICAmJiBza2lwUmVtb3ZlU3VwZXJzZXQobWluZSwgdGhlaXJDaGFuZ2VzLCB0aGVpckNoYW5nZXMubGVuZ3RoIC0gbXlDaGFuZ2VzLmxlbmd0aCkpIHtcbiAgICAgIGh1bmsubGluZXMucHVzaCguLi4gdGhlaXJDaGFuZ2VzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXJyYXlFcXVhbChteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcykpIHtcbiAgICBodW5rLmxpbmVzLnB1c2goLi4uIG15Q2hhbmdlcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uZmxpY3QoaHVuaywgbXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmFsKGh1bmssIG1pbmUsIHRoZWlyLCBzd2FwKSB7XG4gIGxldCBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuICAgICAgdGhlaXJDaGFuZ2VzID0gY29sbGVjdENvbnRleHQodGhlaXIsIG15Q2hhbmdlcyk7XG4gIGlmICh0aGVpckNoYW5nZXMubWVyZ2VkKSB7XG4gICAgaHVuay5saW5lcy5wdXNoKC4uLiB0aGVpckNoYW5nZXMubWVyZ2VkKTtcbiAgfSBlbHNlIHtcbiAgICBjb25mbGljdChodW5rLCBzd2FwID8gdGhlaXJDaGFuZ2VzIDogbXlDaGFuZ2VzLCBzd2FwID8gbXlDaGFuZ2VzIDogdGhlaXJDaGFuZ2VzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25mbGljdChodW5rLCBtaW5lLCB0aGVpcikge1xuICBodW5rLmNvbmZsaWN0ID0gdHJ1ZTtcbiAgaHVuay5saW5lcy5wdXNoKHtcbiAgICBjb25mbGljdDogdHJ1ZSxcbiAgICBtaW5lOiBtaW5lLFxuICAgIHRoZWlyczogdGhlaXJcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydExlYWRpbmcoaHVuaywgaW5zZXJ0LCB0aGVpcikge1xuICB3aGlsZSAoaW5zZXJ0Lm9mZnNldCA8IHRoZWlyLm9mZnNldCAmJiBpbnNlcnQuaW5kZXggPCBpbnNlcnQubGluZXMubGVuZ3RoKSB7XG4gICAgbGV0IGxpbmUgPSBpbnNlcnQubGluZXNbaW5zZXJ0LmluZGV4KytdO1xuICAgIGh1bmsubGluZXMucHVzaChsaW5lKTtcbiAgICBpbnNlcnQub2Zmc2V0Kys7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc2VydFRyYWlsaW5nKGh1bmssIGluc2VydCkge1xuICB3aGlsZSAoaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgIGxldCBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcbiAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdENoYW5nZShzdGF0ZSkge1xuICBsZXQgcmV0ID0gW10sXG4gICAgICBvcGVyYXRpb24gPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF1bMF07XG4gIHdoaWxlIChzdGF0ZS5pbmRleCA8IHN0YXRlLmxpbmVzLmxlbmd0aCkge1xuICAgIGxldCBsaW5lID0gc3RhdGUubGluZXNbc3RhdGUuaW5kZXhdO1xuXG4gICAgLy8gR3JvdXAgYWRkaXRpb25zIHRoYXQgYXJlIGltbWVkaWF0ZWx5IGFmdGVyIHN1YnRyYWN0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyBvbmUgXCJhdG9taWNcIiBtb2RpZnkgY2hhbmdlLlxuICAgIGlmIChvcGVyYXRpb24gPT09ICctJyAmJiBsaW5lWzBdID09PSAnKycpIHtcbiAgICAgIG9wZXJhdGlvbiA9ICcrJztcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0aW9uID09PSBsaW5lWzBdKSB7XG4gICAgICByZXQucHVzaChsaW5lKTtcbiAgICAgIHN0YXRlLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBjb2xsZWN0Q29udGV4dChzdGF0ZSwgbWF0Y2hDaGFuZ2VzKSB7XG4gIGxldCBjaGFuZ2VzID0gW10sXG4gICAgICBtZXJnZWQgPSBbXSxcbiAgICAgIG1hdGNoSW5kZXggPSAwLFxuICAgICAgY29udGV4dENoYW5nZXMgPSBmYWxzZSxcbiAgICAgIGNvbmZsaWN0ZWQgPSBmYWxzZTtcbiAgd2hpbGUgKG1hdGNoSW5kZXggPCBtYXRjaENoYW5nZXMubGVuZ3RoXG4gICAgICAgICYmIHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG4gICAgbGV0IGNoYW5nZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XSxcbiAgICAgICAgbWF0Y2ggPSBtYXRjaENoYW5nZXNbbWF0Y2hJbmRleF07XG5cbiAgICAvLyBPbmNlIHdlJ3ZlIGhpdCBvdXIgYWRkLCB0aGVuIHdlIGFyZSBkb25lXG4gICAgaWYgKG1hdGNoWzBdID09PSAnKycpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnRleHRDaGFuZ2VzID0gY29udGV4dENoYW5nZXMgfHwgY2hhbmdlWzBdICE9PSAnICc7XG5cbiAgICBtZXJnZWQucHVzaChtYXRjaCk7XG4gICAgbWF0Y2hJbmRleCsrO1xuXG4gICAgLy8gQ29uc3VtZSBhbnkgYWRkaXRpb25zIGluIHRoZSBvdGhlciBibG9jayBhcyBhIGNvbmZsaWN0IHRvIGF0dGVtcHRcbiAgICAvLyB0byBwdWxsIGluIHRoZSByZW1haW5pbmcgY29udGV4dCBhZnRlciB0aGlzXG4gICAgaWYgKGNoYW5nZVswXSA9PT0gJysnKSB7XG4gICAgICBjb25mbGljdGVkID0gdHJ1ZTtcblxuICAgICAgd2hpbGUgKGNoYW5nZVswXSA9PT0gJysnKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaChjaGFuZ2UpO1xuICAgICAgICBjaGFuZ2UgPSBzdGF0ZS5saW5lc1srK3N0YXRlLmluZGV4XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWF0Y2guc3Vic3RyKDEpID09PSBjaGFuZ2Uuc3Vic3RyKDEpKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgIHN0YXRlLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICgobWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdIHx8ICcnKVswXSA9PT0gJysnXG4gICAgICAmJiBjb250ZXh0Q2hhbmdlcykge1xuICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGNvbmZsaWN0ZWQpIHtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aCkge1xuICAgIG1lcmdlZC5wdXNoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4KytdKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVyZ2VkLFxuICAgIGNoYW5nZXNcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWxsUmVtb3ZlcyhjaGFuZ2VzKSB7XG4gIHJldHVybiBjaGFuZ2VzLnJlZHVjZShmdW5jdGlvbihwcmV2LCBjaGFuZ2UpIHtcbiAgICByZXR1cm4gcHJldiAmJiBjaGFuZ2VbMF0gPT09ICctJztcbiAgfSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBza2lwUmVtb3ZlU3VwZXJzZXQoc3RhdGUsIHJlbW92ZUNoYW5nZXMsIGRlbHRhKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGVsdGE7IGkrKykge1xuICAgIGxldCBjaGFuZ2VDb250ZW50ID0gcmVtb3ZlQ2hhbmdlc1tyZW1vdmVDaGFuZ2VzLmxlbmd0aCAtIGRlbHRhICsgaV0uc3Vic3RyKDEpO1xuICAgIGlmIChzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleCArIGldICE9PSAnICcgKyBjaGFuZ2VDb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUuaW5kZXggKz0gZGVsdGE7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmVzKSB7XG4gIGxldCBvbGRMaW5lcyA9IDA7XG4gIGxldCBuZXdMaW5lcyA9IDA7XG5cbiAgbGluZXMuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgaWYgKHR5cGVvZiBsaW5lICE9PSAnc3RyaW5nJykge1xuICAgICAgbGV0IG15Q291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmUubWluZSk7XG4gICAgICBsZXQgdGhlaXJDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQobGluZS50aGVpcnMpO1xuXG4gICAgICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobXlDb3VudC5vbGRMaW5lcyA9PT0gdGhlaXJDb3VudC5vbGRMaW5lcykge1xuICAgICAgICAgIG9sZExpbmVzICs9IG15Q291bnQub2xkTGluZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkTGluZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG15Q291bnQubmV3TGluZXMgPT09IHRoZWlyQ291bnQubmV3TGluZXMpIHtcbiAgICAgICAgICBuZXdMaW5lcyArPSBteUNvdW50Lm5ld0xpbmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xpbmVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnKycgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuICAgICAgICBuZXdMaW5lcysrO1xuICAgICAgfVxuICAgICAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQgJiYgKGxpbmVbMF0gPT09ICctJyB8fCBsaW5lWzBdID09PSAnICcpKSB7XG4gICAgICAgIG9sZExpbmVzKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge29sZExpbmVzLCBuZXdMaW5lc307XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.parsePatch = parsePatch;\n\n/*istanbul ignore end*/\nfunction parsePatch(uniDiff) {\n /*istanbul ignore start*/\n var\n /*istanbul ignore end*/\n options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var diffstr = uniDiff.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n delimiters = uniDiff.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n list = [],\n i = 0;\n\n function parseIndex() {\n var index = {};\n list.push(index); // Parse diff metadata\n\n while (i < diffstr.length) {\n var line = diffstr[i]; // File header found, end parsing diff metadata\n\n if (/^(\\-\\-\\-|\\+\\+\\+|@@)\\s/.test(line)) {\n break;\n } // Diff index\n\n\n var header = /^(?:Index:|diff(?: -r \\w+)+)\\s+(.+?)\\s*$/.exec(line);\n\n if (header) {\n index.index = header[1];\n }\n\n i++;\n } // Parse file headers if they are defined. Unified diff requires them, but\n // there's no technical issues to have an isolated hunk without file header\n\n\n parseFileHeader(index);\n parseFileHeader(index); // Parse hunks\n\n index.hunks = [];\n\n while (i < diffstr.length) {\n var _line = diffstr[i];\n\n if (/^(Index:|diff|\\-\\-\\-|\\+\\+\\+)\\s/.test(_line)) {\n break;\n } else if (/^@@/.test(_line)) {\n index.hunks.push(parseHunk());\n } else if (_line && options.strict) {\n // Ignore unexpected content unless in strict mode\n throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line));\n } else {\n i++;\n }\n }\n } // Parses the --- and +++ headers, if none are found, no lines\n // are consumed.\n\n\n function parseFileHeader(index) {\n var fileHeader = /^(---|\\+\\+\\+)\\s+(.*)$/.exec(diffstr[i]);\n\n if (fileHeader) {\n var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new';\n var data = fileHeader[2].split('\\t', 2);\n var fileName = data[0].replace(/\\\\\\\\/g, '\\\\');\n\n if (/^\".*\"$/.test(fileName)) {\n fileName = fileName.substr(1, fileName.length - 2);\n }\n\n index[keyPrefix + 'FileName'] = fileName;\n index[keyPrefix + 'Header'] = (data[1] || '').trim();\n i++;\n }\n } // Parses a hunk\n // This assumes that we are at the start of a hunk.\n\n\n function parseHunk() {\n var chunkHeaderIndex = i,\n chunkHeaderLine = diffstr[i++],\n chunkHeader = chunkHeaderLine.split(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n var hunk = {\n oldStart: +chunkHeader[1],\n oldLines: typeof chunkHeader[2] === 'undefined' ? 1 : +chunkHeader[2],\n newStart: +chunkHeader[3],\n newLines: typeof chunkHeader[4] === 'undefined' ? 1 : +chunkHeader[4],\n lines: [],\n linedelimiters: []\n }; // Unified Diff Format quirk: If the chunk size is 0,\n // the first number is one lower than one would expect.\n // https://www.artima.com/weblogs/viewpost.jsp?thread=164293\n\n if (hunk.oldLines === 0) {\n hunk.oldStart += 1;\n }\n\n if (hunk.newLines === 0) {\n hunk.newStart += 1;\n }\n\n var addCount = 0,\n removeCount = 0;\n\n for (; i < diffstr.length; i++) {\n // Lines starting with '---' could be mistaken for the \"remove line\" operation\n // But they could be the header for the next file. Therefore prune such cases out.\n if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) {\n break;\n }\n\n var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0];\n\n if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\\\') {\n hunk.lines.push(diffstr[i]);\n hunk.linedelimiters.push(delimiters[i] || '\\n');\n\n if (operation === '+') {\n addCount++;\n } else if (operation === '-') {\n removeCount++;\n } else if (operation === ' ') {\n addCount++;\n removeCount++;\n }\n } else {\n break;\n }\n } // Handle the empty block count case\n\n\n if (!addCount && hunk.newLines === 1) {\n hunk.newLines = 0;\n }\n\n if (!removeCount && hunk.oldLines === 1) {\n hunk.oldLines = 0;\n } // Perform optional sanity checking\n\n\n if (options.strict) {\n if (addCount !== hunk.newLines) {\n throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n }\n\n if (removeCount !== hunk.oldLines) {\n throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n }\n }\n\n return hunk;\n }\n\n while (i < diffstr.length) {\n parseIndex();\n }\n\n return list;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9wYXJzZS5qcyJdLCJuYW1lcyI6WyJwYXJzZVBhdGNoIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJkaWZmc3RyIiwic3BsaXQiLCJkZWxpbWl0ZXJzIiwibWF0Y2giLCJsaXN0IiwiaSIsInBhcnNlSW5kZXgiLCJpbmRleCIsInB1c2giLCJsZW5ndGgiLCJsaW5lIiwidGVzdCIsImhlYWRlciIsImV4ZWMiLCJwYXJzZUZpbGVIZWFkZXIiLCJodW5rcyIsInBhcnNlSHVuayIsInN0cmljdCIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpbGVIZWFkZXIiLCJrZXlQcmVmaXgiLCJkYXRhIiwiZmlsZU5hbWUiLCJyZXBsYWNlIiwic3Vic3RyIiwidHJpbSIsImNodW5rSGVhZGVySW5kZXgiLCJjaHVua0hlYWRlckxpbmUiLCJjaHVua0hlYWRlciIsImh1bmsiLCJvbGRTdGFydCIsIm9sZExpbmVzIiwibmV3U3RhcnQiLCJuZXdMaW5lcyIsImxpbmVzIiwibGluZWRlbGltaXRlcnMiLCJhZGRDb3VudCIsInJlbW92ZUNvdW50IiwiaW5kZXhPZiIsIm9wZXJhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQU8sU0FBU0EsVUFBVCxDQUFvQkMsT0FBcEIsRUFBMkM7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJO0FBQ2hELE1BQUlDLE9BQU8sR0FBR0YsT0FBTyxDQUFDRyxLQUFSLENBQWMscUJBQWQsQ0FBZDtBQUFBLE1BQ0lDLFVBQVUsR0FBR0osT0FBTyxDQUFDSyxLQUFSLENBQWMsc0JBQWQsS0FBeUMsRUFEMUQ7QUFBQSxNQUVJQyxJQUFJLEdBQUcsRUFGWDtBQUFBLE1BR0lDLENBQUMsR0FBRyxDQUhSOztBQUtBLFdBQVNDLFVBQVQsR0FBc0I7QUFDcEIsUUFBSUMsS0FBSyxHQUFHLEVBQVo7QUFDQUgsSUFBQUEsSUFBSSxDQUFDSSxJQUFMLENBQVVELEtBQVYsRUFGb0IsQ0FJcEI7O0FBQ0EsV0FBT0YsQ0FBQyxHQUFHTCxPQUFPLENBQUNTLE1BQW5CLEVBQTJCO0FBQ3pCLFVBQUlDLElBQUksR0FBR1YsT0FBTyxDQUFDSyxDQUFELENBQWxCLENBRHlCLENBR3pCOztBQUNBLFVBQUssdUJBQUQsQ0FBMEJNLElBQTFCLENBQStCRCxJQUEvQixDQUFKLEVBQTBDO0FBQ3hDO0FBQ0QsT0FOd0IsQ0FRekI7OztBQUNBLFVBQUlFLE1BQU0sR0FBSSwwQ0FBRCxDQUE2Q0MsSUFBN0MsQ0FBa0RILElBQWxELENBQWI7O0FBQ0EsVUFBSUUsTUFBSixFQUFZO0FBQ1ZMLFFBQUFBLEtBQUssQ0FBQ0EsS0FBTixHQUFjSyxNQUFNLENBQUMsQ0FBRCxDQUFwQjtBQUNEOztBQUVEUCxNQUFBQSxDQUFDO0FBQ0YsS0FwQm1CLENBc0JwQjtBQUNBOzs7QUFDQVMsSUFBQUEsZUFBZSxDQUFDUCxLQUFELENBQWY7QUFDQU8sSUFBQUEsZUFBZSxDQUFDUCxLQUFELENBQWYsQ0F6Qm9CLENBMkJwQjs7QUFDQUEsSUFBQUEsS0FBSyxDQUFDUSxLQUFOLEdBQWMsRUFBZDs7QUFFQSxXQUFPVixDQUFDLEdBQUdMLE9BQU8sQ0FBQ1MsTUFBbkIsRUFBMkI7QUFDekIsVUFBSUMsS0FBSSxHQUFHVixPQUFPLENBQUNLLENBQUQsQ0FBbEI7O0FBRUEsVUFBSyxnQ0FBRCxDQUFtQ00sSUFBbkMsQ0FBd0NELEtBQXhDLENBQUosRUFBbUQ7QUFDakQ7QUFDRCxPQUZELE1BRU8sSUFBSyxLQUFELENBQVFDLElBQVIsQ0FBYUQsS0FBYixDQUFKLEVBQXdCO0FBQzdCSCxRQUFBQSxLQUFLLENBQUNRLEtBQU4sQ0FBWVAsSUFBWixDQUFpQlEsU0FBUyxFQUExQjtBQUNELE9BRk0sTUFFQSxJQUFJTixLQUFJLElBQUlYLE9BQU8sQ0FBQ2tCLE1BQXBCLEVBQTRCO0FBQ2pDO0FBQ0EsY0FBTSxJQUFJQyxLQUFKLENBQVUsbUJBQW1CYixDQUFDLEdBQUcsQ0FBdkIsSUFBNEIsR0FBNUIsR0FBa0NjLElBQUksQ0FBQ0MsU0FBTCxDQUFlVixLQUFmLENBQTVDLENBQU47QUFDRCxPQUhNLE1BR0E7QUFDTEwsUUFBQUEsQ0FBQztBQUNGO0FBQ0Y7QUFDRixHQWxEK0MsQ0FvRGhEO0FBQ0E7OztBQUNBLFdBQVNTLGVBQVQsQ0FBeUJQLEtBQXpCLEVBQWdDO0FBQzlCLFFBQU1jLFVBQVUsR0FBSSx1QkFBRCxDQUEwQlIsSUFBMUIsQ0FBK0JiLE9BQU8sQ0FBQ0ssQ0FBRCxDQUF0QyxDQUFuQjs7QUFDQSxRQUFJZ0IsVUFBSixFQUFnQjtBQUNkLFVBQUlDLFNBQVMsR0FBR0QsVUFBVSxDQUFDLENBQUQsQ0FBVixLQUFrQixLQUFsQixHQUEwQixLQUExQixHQUFrQyxLQUFsRDtBQUNBLFVBQU1FLElBQUksR0FBR0YsVUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjcEIsS0FBZCxDQUFvQixJQUFwQixFQUEwQixDQUExQixDQUFiO0FBQ0EsVUFBSXVCLFFBQVEsR0FBR0QsSUFBSSxDQUFDLENBQUQsQ0FBSixDQUFRRSxPQUFSLENBQWdCLE9BQWhCLEVBQXlCLElBQXpCLENBQWY7O0FBQ0EsVUFBSyxRQUFELENBQVdkLElBQVgsQ0FBZ0JhLFFBQWhCLENBQUosRUFBK0I7QUFDN0JBLFFBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDRSxNQUFULENBQWdCLENBQWhCLEVBQW1CRixRQUFRLENBQUNmLE1BQVQsR0FBa0IsQ0FBckMsQ0FBWDtBQUNEOztBQUNERixNQUFBQSxLQUFLLENBQUNlLFNBQVMsR0FBRyxVQUFiLENBQUwsR0FBZ0NFLFFBQWhDO0FBQ0FqQixNQUFBQSxLQUFLLENBQUNlLFNBQVMsR0FBRyxRQUFiLENBQUwsR0FBOEIsQ0FBQ0MsSUFBSSxDQUFDLENBQUQsQ0FBSixJQUFXLEVBQVosRUFBZ0JJLElBQWhCLEVBQTlCO0FBRUF0QixNQUFBQSxDQUFDO0FBQ0Y7QUFDRixHQXBFK0MsQ0FzRWhEO0FBQ0E7OztBQUNBLFdBQVNXLFNBQVQsR0FBcUI7QUFDbkIsUUFBSVksZ0JBQWdCLEdBQUd2QixDQUF2QjtBQUFBLFFBQ0l3QixlQUFlLEdBQUc3QixPQUFPLENBQUNLLENBQUMsRUFBRixDQUQ3QjtBQUFBLFFBRUl5QixXQUFXLEdBQUdELGVBQWUsQ0FBQzVCLEtBQWhCLENBQXNCLDRDQUF0QixDQUZsQjtBQUlBLFFBQUk4QixJQUFJLEdBQUc7QUFDVEMsTUFBQUEsUUFBUSxFQUFFLENBQUNGLFdBQVcsQ0FBQyxDQUFELENBRGI7QUFFVEcsTUFBQUEsUUFBUSxFQUFFLE9BQU9ILFdBQVcsQ0FBQyxDQUFELENBQWxCLEtBQTBCLFdBQTFCLEdBQXdDLENBQXhDLEdBQTRDLENBQUNBLFdBQVcsQ0FBQyxDQUFELENBRnpEO0FBR1RJLE1BQUFBLFFBQVEsRUFBRSxDQUFDSixXQUFXLENBQUMsQ0FBRCxDQUhiO0FBSVRLLE1BQUFBLFFBQVEsRUFBRSxPQUFPTCxXQUFXLENBQUMsQ0FBRCxDQUFsQixLQUEwQixXQUExQixHQUF3QyxDQUF4QyxHQUE0QyxDQUFDQSxXQUFXLENBQUMsQ0FBRCxDQUp6RDtBQUtUTSxNQUFBQSxLQUFLLEVBQUUsRUFMRTtBQU1UQyxNQUFBQSxjQUFjLEVBQUU7QUFOUCxLQUFYLENBTG1CLENBY25CO0FBQ0E7QUFDQTs7QUFDQSxRQUFJTixJQUFJLENBQUNFLFFBQUwsS0FBa0IsQ0FBdEIsRUFBeUI7QUFDdkJGLE1BQUFBLElBQUksQ0FBQ0MsUUFBTCxJQUFpQixDQUFqQjtBQUNEOztBQUNELFFBQUlELElBQUksQ0FBQ0ksUUFBTCxLQUFrQixDQUF0QixFQUF5QjtBQUN2QkosTUFBQUEsSUFBSSxDQUFDRyxRQUFMLElBQWlCLENBQWpCO0FBQ0Q7O0FBRUQsUUFBSUksUUFBUSxHQUFHLENBQWY7QUFBQSxRQUNJQyxXQUFXLEdBQUcsQ0FEbEI7O0FBRUEsV0FBT2xDLENBQUMsR0FBR0wsT0FBTyxDQUFDUyxNQUFuQixFQUEyQkosQ0FBQyxFQUE1QixFQUFnQztBQUM5QjtBQUNBO0FBQ0EsVUFBSUwsT0FBTyxDQUFDSyxDQUFELENBQVAsQ0FBV21DLE9BQVgsQ0FBbUIsTUFBbkIsTUFBK0IsQ0FBL0IsSUFDTW5DLENBQUMsR0FBRyxDQUFKLEdBQVFMLE9BQU8sQ0FBQ1MsTUFEdEIsSUFFS1QsT0FBTyxDQUFDSyxDQUFDLEdBQUcsQ0FBTCxDQUFQLENBQWVtQyxPQUFmLENBQXVCLE1BQXZCLE1BQW1DLENBRnhDLElBR0t4QyxPQUFPLENBQUNLLENBQUMsR0FBRyxDQUFMLENBQVAsQ0FBZW1DLE9BQWYsQ0FBdUIsSUFBdkIsTUFBaUMsQ0FIMUMsRUFHNkM7QUFDekM7QUFDSDs7QUFDRCxVQUFJQyxTQUFTLEdBQUl6QyxPQUFPLENBQUNLLENBQUQsQ0FBUCxDQUFXSSxNQUFYLElBQXFCLENBQXJCLElBQTBCSixDQUFDLElBQUtMLE9BQU8sQ0FBQ1MsTUFBUixHQUFpQixDQUFsRCxHQUF3RCxHQUF4RCxHQUE4RFQsT0FBTyxDQUFDSyxDQUFELENBQVAsQ0FBVyxDQUFYLENBQTlFOztBQUVBLFVBQUlvQyxTQUFTLEtBQUssR0FBZCxJQUFxQkEsU0FBUyxLQUFLLEdBQW5DLElBQTBDQSxTQUFTLEtBQUssR0FBeEQsSUFBK0RBLFNBQVMsS0FBSyxJQUFqRixFQUF1RjtBQUNyRlYsUUFBQUEsSUFBSSxDQUFDSyxLQUFMLENBQVc1QixJQUFYLENBQWdCUixPQUFPLENBQUNLLENBQUQsQ0FBdkI7QUFDQTBCLFFBQUFBLElBQUksQ0FBQ00sY0FBTCxDQUFvQjdCLElBQXBCLENBQXlCTixVQUFVLENBQUNHLENBQUQsQ0FBVixJQUFpQixJQUExQzs7QUFFQSxZQUFJb0MsU0FBUyxLQUFLLEdBQWxCLEVBQXVCO0FBQ3JCSCxVQUFBQSxRQUFRO0FBQ1QsU0FGRCxNQUVPLElBQUlHLFNBQVMsS0FBSyxHQUFsQixFQUF1QjtBQUM1QkYsVUFBQUEsV0FBVztBQUNaLFNBRk0sTUFFQSxJQUFJRSxTQUFTLEtBQUssR0FBbEIsRUFBdUI7QUFDNUJILFVBQUFBLFFBQVE7QUFDUkMsVUFBQUEsV0FBVztBQUNaO0FBQ0YsT0FaRCxNQVlPO0FBQ0w7QUFDRDtBQUNGLEtBcERrQixDQXNEbkI7OztBQUNBLFFBQUksQ0FBQ0QsUUFBRCxJQUFhUCxJQUFJLENBQUNJLFFBQUwsS0FBa0IsQ0FBbkMsRUFBc0M7QUFDcENKLE1BQUFBLElBQUksQ0FBQ0ksUUFBTCxHQUFnQixDQUFoQjtBQUNEOztBQUNELFFBQUksQ0FBQ0ksV0FBRCxJQUFnQlIsSUFBSSxDQUFDRSxRQUFMLEtBQWtCLENBQXRDLEVBQXlDO0FBQ3ZDRixNQUFBQSxJQUFJLENBQUNFLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDRCxLQTVEa0IsQ0E4RG5COzs7QUFDQSxRQUFJbEMsT0FBTyxDQUFDa0IsTUFBWixFQUFvQjtBQUNsQixVQUFJcUIsUUFBUSxLQUFLUCxJQUFJLENBQUNJLFFBQXRCLEVBQWdDO0FBQzlCLGNBQU0sSUFBSWpCLEtBQUosQ0FBVSxzREFBc0RVLGdCQUFnQixHQUFHLENBQXpFLENBQVYsQ0FBTjtBQUNEOztBQUNELFVBQUlXLFdBQVcsS0FBS1IsSUFBSSxDQUFDRSxRQUF6QixFQUFtQztBQUNqQyxjQUFNLElBQUlmLEtBQUosQ0FBVSx3REFBd0RVLGdCQUFnQixHQUFHLENBQTNFLENBQVYsQ0FBTjtBQUNEO0FBQ0Y7O0FBRUQsV0FBT0csSUFBUDtBQUNEOztBQUVELFNBQU8xQixDQUFDLEdBQUdMLE9BQU8sQ0FBQ1MsTUFBbkIsRUFBMkI7QUFDekJILElBQUFBLFVBQVU7QUFDWDs7QUFFRCxTQUFPRixJQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICBsZXQgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpO1xuXG4gICAgLy8gUGFyc2UgZGlmZiBtZXRhZGF0YVxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcbiAgICAgIGlmICgoL14oXFwtXFwtXFwtfFxcK1xcK1xcK3xAQClcXHMvKS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBEaWZmIGluZGV4XG4gICAgICBsZXQgaGVhZGVyID0gKC9eKD86SW5kZXg6fGRpZmYoPzogLXIgXFx3KykrKVxccysoLis/KVxccyokLykuZXhlYyhsaW5lKTtcbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgaW5kZXguaW5kZXggPSBoZWFkZXJbMV07XG4gICAgICB9XG5cbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBmaWxlIGhlYWRlcnMgaWYgdGhleSBhcmUgZGVmaW5lZC4gVW5pZmllZCBkaWZmIHJlcXVpcmVzIHRoZW0sIGJ1dFxuICAgIC8vIHRoZXJlJ3Mgbm8gdGVjaG5pY2FsIGlzc3VlcyB0byBoYXZlIGFuIGlzb2xhdGVkIGh1bmsgd2l0aG91dCBmaWxlIGhlYWRlclxuICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7XG4gICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcblxuICAgIC8vIFBhcnNlIGh1bmtzXG4gICAgaW5kZXguaHVua3MgPSBbXTtcblxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgaWYgKCgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8pLnRlc3QobGluZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKCgvXkBALykudGVzdChsaW5lKSkge1xuICAgICAgICBpbmRleC5odW5rcy5wdXNoKHBhcnNlSHVuaygpKTtcbiAgICAgIH0gZWxzZSBpZiAobGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KGxpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQYXJzZXMgdGhlIC0tLSBhbmQgKysrIGhlYWRlcnMsIGlmIG5vbmUgYXJlIGZvdW5kLCBubyBsaW5lc1xuICAvLyBhcmUgY29uc3VtZWQuXG4gIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuICAgIGNvbnN0IGZpbGVIZWFkZXIgPSAoL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKSQvKS5leGVjKGRpZmZzdHJbaV0pO1xuICAgIGlmIChmaWxlSGVhZGVyKSB7XG4gICAgICBsZXQga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuICAgICAgY29uc3QgZGF0YSA9IGZpbGVIZWFkZXJbMl0uc3BsaXQoJ1xcdCcsIDIpO1xuICAgICAgbGV0IGZpbGVOYW1lID0gZGF0YVswXS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpO1xuICAgICAgaWYgKCgvXlwiLipcIiQvKS50ZXN0KGZpbGVOYW1lKSkge1xuICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cigxLCBmaWxlTmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIH1cbiAgICAgIGluZGV4W2tleVByZWZpeCArICdGaWxlTmFtZSddID0gZmlsZU5hbWU7XG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnSGVhZGVyJ10gPSAoZGF0YVsxXSB8fCAnJykudHJpbSgpO1xuXG4gICAgICBpKys7XG4gICAgfVxuICB9XG5cbiAgLy8gUGFyc2VzIGEgaHVua1xuICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIGEgaHVuay5cbiAgZnVuY3Rpb24gcGFyc2VIdW5rKCkge1xuICAgIGxldCBjaHVua0hlYWRlckluZGV4ID0gaSxcbiAgICAgICAgY2h1bmtIZWFkZXJMaW5lID0gZGlmZnN0cltpKytdLFxuICAgICAgICBjaHVua0hlYWRlciA9IGNodW5rSGVhZGVyTGluZS5zcGxpdCgvQEAgLShcXGQrKSg/OiwoXFxkKykpPyBcXCsoXFxkKykoPzosKFxcZCspKT8gQEAvKTtcblxuICAgIGxldCBodW5rID0ge1xuICAgICAgb2xkU3RhcnQ6ICtjaHVua0hlYWRlclsxXSxcbiAgICAgIG9sZExpbmVzOiB0eXBlb2YgY2h1bmtIZWFkZXJbMl0gPT09ICd1bmRlZmluZWQnID8gMSA6ICtjaHVua0hlYWRlclsyXSxcbiAgICAgIG5ld1N0YXJ0OiArY2h1bmtIZWFkZXJbM10sXG4gICAgICBuZXdMaW5lczogdHlwZW9mIGNodW5rSGVhZGVyWzRdID09PSAndW5kZWZpbmVkJyA/IDEgOiArY2h1bmtIZWFkZXJbNF0sXG4gICAgICBsaW5lczogW10sXG4gICAgICBsaW5lZGVsaW1pdGVyczogW11cbiAgICB9O1xuXG4gICAgLy8gVW5pZmllZCBEaWZmIEZvcm1hdCBxdWlyazogSWYgdGhlIGNodW5rIHNpemUgaXMgMCxcbiAgICAvLyB0aGUgZmlyc3QgbnVtYmVyIGlzIG9uZSBsb3dlciB0aGFuIG9uZSB3b3VsZCBleHBlY3QuXG4gICAgLy8gaHR0cHM6Ly93d3cuYXJ0aW1hLmNvbS93ZWJsb2dzL3ZpZXdwb3N0LmpzcD90aHJlYWQ9MTY0MjkzXG4gICAgaWYgKGh1bmsub2xkTGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsub2xkU3RhcnQgKz0gMTtcbiAgICB9XG4gICAgaWYgKGh1bmsubmV3TGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsubmV3U3RhcnQgKz0gMTtcbiAgICB9XG5cbiAgICBsZXQgYWRkQ291bnQgPSAwLFxuICAgICAgICByZW1vdmVDb3VudCA9IDA7XG4gICAgZm9yICg7IGkgPCBkaWZmc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBMaW5lcyBzdGFydGluZyB3aXRoICctLS0nIGNvdWxkIGJlIG1pc3Rha2VuIGZvciB0aGUgXCJyZW1vdmUgbGluZVwiIG9wZXJhdGlvblxuICAgICAgLy8gQnV0IHRoZXkgY291bGQgYmUgdGhlIGhlYWRlciBmb3IgdGhlIG5leHQgZmlsZS4gVGhlcmVmb3JlIHBydW5lIHN1Y2ggY2FzZXMgb3V0LlxuICAgICAgaWYgKGRpZmZzdHJbaV0uaW5kZXhPZignLS0tICcpID09PSAwXG4gICAgICAgICAgICAmJiAoaSArIDIgPCBkaWZmc3RyLmxlbmd0aClcbiAgICAgICAgICAgICYmIGRpZmZzdHJbaSArIDFdLmluZGV4T2YoJysrKyAnKSA9PT0gMFxuICAgICAgICAgICAgJiYgZGlmZnN0cltpICsgMl0uaW5kZXhPZignQEAnKSA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbGV0IG9wZXJhdGlvbiA9IChkaWZmc3RyW2ldLmxlbmd0aCA9PSAwICYmIGkgIT0gKGRpZmZzdHIubGVuZ3RoIC0gMSkpID8gJyAnIDogZGlmZnN0cltpXVswXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnIHx8IG9wZXJhdGlvbiA9PT0gJy0nIHx8IG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIGh1bmsubGluZXMucHVzaChkaWZmc3RyW2ldKTtcbiAgICAgICAgaHVuay5saW5lZGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcnNbaV0gfHwgJ1xcbicpO1xuXG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgICAgYWRkQ291bnQrKztcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIGVtcHR5IGJsb2NrIGNvdW50IGNhc2VcbiAgICBpZiAoIWFkZENvdW50ICYmIGh1bmsubmV3TGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsubmV3TGluZXMgPSAwO1xuICAgIH1cbiAgICBpZiAoIXJlbW92ZUNvdW50ICYmIGh1bmsub2xkTGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsub2xkTGluZXMgPSAwO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gb3B0aW9uYWwgc2FuaXR5IGNoZWNraW5nXG4gICAgaWYgKG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZGRlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlQ291bnQgIT09IGh1bmsub2xkTGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW1vdmVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaHVuaztcbiAgfVxuXG4gIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICBwYXJzZUluZGV4KCk7XG4gIH1cblxuICByZXR1cm4gbGlzdDtcbn1cbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.arrayEqual = arrayEqual;\nexports.arrayStartsWith = arrayStartsWith;\n\n/*istanbul ignore end*/\nfunction arrayEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n\n return arrayStartsWith(a, b);\n}\n\nfunction arrayStartsWith(array, start) {\n if (start.length > array.length) {\n return false;\n }\n\n for (var i = 0; i < start.length; i++) {\n if (start[i] !== array[i]) {\n return false;\n }\n }\n\n return true;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2FycmF5LmpzIl0sIm5hbWVzIjpbImFycmF5RXF1YWwiLCJhIiwiYiIsImxlbmd0aCIsImFycmF5U3RhcnRzV2l0aCIsImFycmF5Iiwic3RhcnQiLCJpIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQU8sU0FBU0EsVUFBVCxDQUFvQkMsQ0FBcEIsRUFBdUJDLENBQXZCLEVBQTBCO0FBQy9CLE1BQUlELENBQUMsQ0FBQ0UsTUFBRixLQUFhRCxDQUFDLENBQUNDLE1BQW5CLEVBQTJCO0FBQ3pCLFdBQU8sS0FBUDtBQUNEOztBQUVELFNBQU9DLGVBQWUsQ0FBQ0gsQ0FBRCxFQUFJQyxDQUFKLENBQXRCO0FBQ0Q7O0FBRU0sU0FBU0UsZUFBVCxDQUF5QkMsS0FBekIsRUFBZ0NDLEtBQWhDLEVBQXVDO0FBQzVDLE1BQUlBLEtBQUssQ0FBQ0gsTUFBTixHQUFlRSxLQUFLLENBQUNGLE1BQXpCLEVBQWlDO0FBQy9CLFdBQU8sS0FBUDtBQUNEOztBQUVELE9BQUssSUFBSUksQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0QsS0FBSyxDQUFDSCxNQUExQixFQUFrQ0ksQ0FBQyxFQUFuQyxFQUF1QztBQUNyQyxRQUFJRCxLQUFLLENBQUNDLENBQUQsQ0FBTCxLQUFhRixLQUFLLENBQUNFLENBQUQsQ0FBdEIsRUFBMkI7QUFDekIsYUFBTyxLQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPLElBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBhcnJheUVxdWFsKGEsIGIpIHtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBhcnJheVN0YXJ0c1dpdGgoYSwgYik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVN0YXJ0c1dpdGgoYXJyYXksIHN0YXJ0KSB7XG4gIGlmIChzdGFydC5sZW5ndGggPiBhcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXJ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0YXJ0W2ldICE9PSBhcnJheVtpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIl19\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = _default;\n\n/*istanbul ignore end*/\n// Iterator that traverses in the range of [min, max], stepping\n// by distance from a given start position. I.e. for [0, 4], with\n// start of 2, this will iterate 2, 3, 1, 4, 0.\nfunction\n/*istanbul ignore start*/\n_default\n/*istanbul ignore end*/\n(start, minLine, maxLine) {\n var wantForward = true,\n backwardExhausted = false,\n forwardExhausted = false,\n localOffset = 1;\n return function iterator() {\n if (wantForward && !forwardExhausted) {\n if (backwardExhausted) {\n localOffset++;\n } else {\n wantForward = false;\n } // Check if trying to fit beyond text length, and if not, check it fits\n // after offset location (or desired location on first iteration)\n\n\n if (start + localOffset <= maxLine) {\n return localOffset;\n }\n\n forwardExhausted = true;\n }\n\n if (!backwardExhausted) {\n if (!forwardExhausted) {\n wantForward = true;\n } // Check if trying to fit before text beginning, and if not, check it fits\n // before offset location\n\n\n if (minLine <= start - localOffset) {\n return -localOffset++;\n }\n\n backwardExhausted = true;\n return iterator();\n } // We tried to fit hunk before text beginning and beyond text length, then\n // hunk can't fit on the text. Return undefined\n\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yLmpzIl0sIm5hbWVzIjpbInN0YXJ0IiwibWluTGluZSIsIm1heExpbmUiLCJ3YW50Rm9yd2FyZCIsImJhY2t3YXJkRXhoYXVzdGVkIiwiZm9yd2FyZEV4aGF1c3RlZCIsImxvY2FsT2Zmc2V0IiwiaXRlcmF0b3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNlO0FBQUE7QUFBQTtBQUFBO0FBQUEsQ0FBU0EsS0FBVCxFQUFnQkMsT0FBaEIsRUFBeUJDLE9BQXpCLEVBQWtDO0FBQy9DLE1BQUlDLFdBQVcsR0FBRyxJQUFsQjtBQUFBLE1BQ0lDLGlCQUFpQixHQUFHLEtBRHhCO0FBQUEsTUFFSUMsZ0JBQWdCLEdBQUcsS0FGdkI7QUFBQSxNQUdJQyxXQUFXLEdBQUcsQ0FIbEI7QUFLQSxTQUFPLFNBQVNDLFFBQVQsR0FBb0I7QUFDekIsUUFBSUosV0FBVyxJQUFJLENBQUNFLGdCQUFwQixFQUFzQztBQUNwQyxVQUFJRCxpQkFBSixFQUF1QjtBQUNyQkUsUUFBQUEsV0FBVztBQUNaLE9BRkQsTUFFTztBQUNMSCxRQUFBQSxXQUFXLEdBQUcsS0FBZDtBQUNELE9BTG1DLENBT3BDO0FBQ0E7OztBQUNBLFVBQUlILEtBQUssR0FBR00sV0FBUixJQUF1QkosT0FBM0IsRUFBb0M7QUFDbEMsZUFBT0ksV0FBUDtBQUNEOztBQUVERCxNQUFBQSxnQkFBZ0IsR0FBRyxJQUFuQjtBQUNEOztBQUVELFFBQUksQ0FBQ0QsaUJBQUwsRUFBd0I7QUFDdEIsVUFBSSxDQUFDQyxnQkFBTCxFQUF1QjtBQUNyQkYsUUFBQUEsV0FBVyxHQUFHLElBQWQ7QUFDRCxPQUhxQixDQUt0QjtBQUNBOzs7QUFDQSxVQUFJRixPQUFPLElBQUlELEtBQUssR0FBR00sV0FBdkIsRUFBb0M7QUFDbEMsZUFBTyxDQUFDQSxXQUFXLEVBQW5CO0FBQ0Q7O0FBRURGLE1BQUFBLGlCQUFpQixHQUFHLElBQXBCO0FBQ0EsYUFBT0csUUFBUSxFQUFmO0FBQ0QsS0E5QndCLENBZ0N6QjtBQUNBOztBQUNELEdBbENEO0FBbUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSXRlcmF0b3IgdGhhdCB0cmF2ZXJzZXMgaW4gdGhlIHJhbmdlIG9mIFttaW4sIG1heF0sIHN0ZXBwaW5nXG4vLyBieSBkaXN0YW5jZSBmcm9tIGEgZ2l2ZW4gc3RhcnQgcG9zaXRpb24uIEkuZS4gZm9yIFswLCA0XSwgd2l0aFxuLy8gc3RhcnQgb2YgMiwgdGhpcyB3aWxsIGl0ZXJhdGUgMiwgMywgMSwgNCwgMC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0YXJ0LCBtaW5MaW5lLCBtYXhMaW5lKSB7XG4gIGxldCB3YW50Rm9yd2FyZCA9IHRydWUsXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgbG9jYWxPZmZzZXQgPSAxO1xuXG4gIHJldHVybiBmdW5jdGlvbiBpdGVyYXRvcigpIHtcbiAgICBpZiAod2FudEZvcndhcmQgJiYgIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgIGlmIChiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICBsb2NhbE9mZnNldCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FudEZvcndhcmQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZXlvbmQgdGV4dCBsZW5ndGgsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgIC8vIGFmdGVyIG9mZnNldCBsb2NhdGlvbiAob3IgZGVzaXJlZCBsb2NhdGlvbiBvbiBmaXJzdCBpdGVyYXRpb24pXG4gICAgICBpZiAoc3RhcnQgKyBsb2NhbE9mZnNldCA8PSBtYXhMaW5lKSB7XG4gICAgICAgIHJldHVybiBsb2NhbE9mZnNldDtcbiAgICAgIH1cblxuICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgaWYgKCFmb3J3YXJkRXhoYXVzdGVkKSB7XG4gICAgICAgIHdhbnRGb3J3YXJkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZWZvcmUgdGV4dCBiZWdpbm5pbmcsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgIC8vIGJlZm9yZSBvZmZzZXQgbG9jYXRpb25cbiAgICAgIGlmIChtaW5MaW5lIDw9IHN0YXJ0IC0gbG9jYWxPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIC1sb2NhbE9mZnNldCsrO1xuICAgICAgfVxuXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgICByZXR1cm4gaXRlcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBXZSB0cmllZCB0byBmaXQgaHVuayBiZWZvcmUgdGV4dCBiZWdpbm5pbmcgYW5kIGJleW9uZCB0ZXh0IGxlbmd0aCwgdGhlblxuICAgIC8vIGh1bmsgY2FuJ3QgZml0IG9uIHRoZSB0ZXh0LiBSZXR1cm4gdW5kZWZpbmVkXG4gIH07XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.generateOptions = generateOptions;\n\n/*istanbul ignore end*/\nfunction generateOptions(options, defaults) {\n if (typeof options === 'function') {\n defaults.callback = options;\n } else if (options) {\n for (var name in options) {\n /* istanbul ignore else */\n if (options.hasOwnProperty(name)) {\n defaults[name] = options[name];\n }\n }\n }\n\n return defaults;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3BhcmFtcy5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZU9wdGlvbnMiLCJvcHRpb25zIiwiZGVmYXVsdHMiLCJjYWxsYmFjayIsIm5hbWUiLCJoYXNPd25Qcm9wZXJ0eSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQU8sU0FBU0EsZUFBVCxDQUF5QkMsT0FBekIsRUFBa0NDLFFBQWxDLEVBQTRDO0FBQ2pELE1BQUksT0FBT0QsT0FBUCxLQUFtQixVQUF2QixFQUFtQztBQUNqQ0MsSUFBQUEsUUFBUSxDQUFDQyxRQUFULEdBQW9CRixPQUFwQjtBQUNELEdBRkQsTUFFTyxJQUFJQSxPQUFKLEVBQWE7QUFDbEIsU0FBSyxJQUFJRyxJQUFULElBQWlCSCxPQUFqQixFQUEwQjtBQUN4QjtBQUNBLFVBQUlBLE9BQU8sQ0FBQ0ksY0FBUixDQUF1QkQsSUFBdkIsQ0FBSixFQUFrQztBQUNoQ0YsUUFBQUEsUUFBUSxDQUFDRSxJQUFELENBQVIsR0FBaUJILE9BQU8sQ0FBQ0csSUFBRCxDQUF4QjtBQUNEO0FBQ0Y7QUFDRjs7QUFDRCxTQUFPRixRQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRlZmF1bHRzLmNhbGxiYWNrID0gb3B0aW9ucztcbiAgfSBlbHNlIGlmIChvcHRpb25zKSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBvcHRpb25zKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgZGVmYXVsdHNbbmFtZV0gPSBvcHRpb25zW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVmYXVsdHM7XG59XG4iXX0=\n","\"use strict\";\n\nmodule.exports = function () {\n // https://mths.be/emoji\n return /\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g;\n};\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","'use strict';\n\nconst validator = require('./validator');\nconst XMLParser = require('./xmlparser/XMLParser');\nconst XMLBuilder = require('./xmlbuilder/json2xml');\n\nmodule.exports = {\n XMLParser: XMLParser,\n XMLValidator: validator,\n XMLBuilder: XMLBuilder\n}","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nconst nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*'\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nconst getAllMatches = function(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n};\n\nconst isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n};\n\nexports.isExist = function(v) {\n return typeof v !== 'undefined';\n};\n\nexports.isEmptyObject = function(obj) {\n return Object.keys(obj).length === 0;\n};\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexports.merge = function(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a); // will return an array of own properties\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n if (arrayMode === 'strict') {\n target[keys[i]] = [ a[keys[i]] ];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n};\n/* exports.merge =function (b,a){\n return Object.assign(b,a);\n} */\n\nexports.getValue = function(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n};\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};\n\nexports.isName = isName;\nexports.getAllMatches = getAllMatches;\nexports.nameRegexp = nameRegexp;\n","'use strict';\n\nconst util = require('./util');\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexports.validate = function (xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n \n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n i+=2;\n i = readPI(xmlData,i);\n if (i.err) return i;\n }else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n \n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if(options.unpairedTags.indexOf(tagName) !== -1){\n //don't push into stack\n } else {\n tags.push({tagName, tagStartPos});\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i+1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else{\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n }else{\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if ( isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n }else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n }else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\"+\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n \"' found.\", {line: 1, col: 1});\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char){\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = util.getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return util.isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return util.isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","'use strict';\n//parse Empty Node as self closing node\nconst buildFromOrderedJs = require('./orderedJs2Xml');\n\nconst defaultOptions = {\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: ' ',\n suppressEmptyNode: false,\n suppressUnpairedNode: true,\n suppressBooleanAttributes: true,\n tagValueProcessor: function(key, a) {\n return a;\n },\n attributeValueProcessor: function(attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: [\n { regex: new RegExp(\"&\", \"g\"), val: \"&\" },//it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \">\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"<\" },\n { regex: new RegExp(\"\\'\", \"g\"), val: \"'\" },\n { regex: new RegExp(\"\\\"\", \"g\"), val: \""\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false\n};\n\nfunction Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n if (this.options.ignoreAttributes || this.options.attributesGroupName) {\n this.isAttribute = function(/*a*/) {\n return false;\n };\n } else {\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n\n this.processTextOrObjNode = processTextOrObjNode\n\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = '>\\n';\n this.newLine = '\\n';\n } else {\n this.indentate = function() {\n return '';\n };\n this.tagEndChar = '>';\n this.newLine = '';\n }\n}\n\nBuilder.prototype.build = function(jObj) {\n if(this.options.preserveOrder){\n return buildFromOrderedJs(jObj, this.options);\n }else {\n if(Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1){\n jObj = {\n [this.options.arrayNodeName] : jObj\n }\n }\n return this.j2x(jObj, 0).val;\n }\n};\n\nBuilder.prototype.j2x = function(jObj, level) {\n let attrStr = '';\n let val = '';\n for (let key in jObj) {\n if (typeof jObj[key] === 'undefined') {\n // supress undefined node\n } else if (jObj[key] === null) {\n if(key[0] === \"?\") val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n else val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (jObj[key] instanceof Date) {\n val += this.buildTextValNode(jObj[key], key, '', level);\n } else if (typeof jObj[key] !== 'object') {\n //premitive type\n const attr = this.isAttribute(key);\n if (attr) {\n attrStr += this.buildAttrPairStr(attr, '' + jObj[key]);\n }else {\n //tag value\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, '' + jObj[key]);\n val += this.replaceEntitiesValue(newval);\n } else {\n val += this.buildTextValNode(jObj[key], key, '', level);\n }\n }\n } else if (Array.isArray(jObj[key])) {\n //repeated nodes\n const arrLen = jObj[key].length;\n let listTagVal = \"\";\n for (let j = 0; j < arrLen; j++) {\n const item = jObj[key][j];\n if (typeof item === 'undefined') {\n // supress undefined node\n } else if (item === null) {\n if(key[0] === \"?\") val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n else val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (typeof item === 'object') {\n if(this.options.oneListGroup ){\n listTagVal += this.j2x(item, level + 1).val;\n }else{\n listTagVal += this.processTextOrObjNode(item, key, level)\n }\n } else {\n listTagVal += this.buildTextValNode(item, key, '', level);\n }\n }\n if(this.options.oneListGroup){\n listTagVal = this.buildObjectNode(listTagVal, key, '', level);\n }\n val += listTagVal;\n } else {\n //nested node\n if (this.options.attributesGroupName && key === this.options.attributesGroupName) {\n const Ks = Object.keys(jObj[key]);\n const L = Ks.length;\n for (let j = 0; j < L; j++) {\n attrStr += this.buildAttrPairStr(Ks[j], '' + jObj[key][Ks[j]]);\n }\n } else {\n val += this.processTextOrObjNode(jObj[key], key, level)\n }\n }\n }\n return {attrStr: attrStr, val: val};\n};\n\nBuilder.prototype.buildAttrPairStr = function(attrName, val){\n val = this.options.attributeValueProcessor(attrName, '' + val);\n val = this.replaceEntitiesValue(val);\n if (this.options.suppressBooleanAttributes && val === \"true\") {\n return ' ' + attrName;\n } else return ' ' + attrName + '=\"' + val + '\"';\n}\n\nfunction processTextOrObjNode (object, key, level) {\n const result = this.j2x(object, level + 1);\n if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) {\n return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level);\n } else {\n return this.buildObjectNode(result.val, key, result.attrStr, level);\n }\n}\n\nBuilder.prototype.buildObjectNode = function(val, key, attrStr, level) {\n if(val === \"\"){\n if(key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar;\n else {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n }else{\n\n let tagEndExp = '' + val + tagEndExp );\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `` + this.newLine;\n }else {\n return (\n this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar +\n val +\n this.indentate(level) + tagEndExp );\n }\n }\n}\n\nBuilder.prototype.closeTag = function(key){\n let closeTag = \"\";\n if(this.options.unpairedTags.indexOf(key) !== -1){ //unpaired\n if(!this.options.suppressUnpairedNode) closeTag = \"/\"\n }else if(this.options.suppressEmptyNode){ //empty\n closeTag = \"/\";\n }else{\n closeTag = `>` + this.newLine;\n }else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `` + this.newLine;\n }else if(key[0] === \"?\") {//PI tag\n return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar; \n }else{\n let textValue = this.options.tagValueProcessor(key, val);\n textValue = this.replaceEntitiesValue(textValue);\n \n if( textValue === ''){\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }else{\n return this.indentate(level) + '<' + key + attrStr + '>' +\n textValue +\n ' 0 && this.options.processEntities){\n for (let i=0; i 0) {\n indentation = EOL;\n }\n return arrToStr(jArray, options, \"\", indentation);\n}\n\nfunction arrToStr(arr, options, jPath, indentation) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n let newJPath = \"\";\n if (jPath.length === 0) newJPath = tagName\n else newJPath = `${jPath}.${tagName}`;\n\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode(newJPath, options)) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += ``;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + ``;\n isPreviousElementTag = true;\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\"; //remove extra spacing\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr}?>`;\n isPreviousElementTag = true;\n continue;\n }\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tagStart = indentation + `<${tagName}${attStr}`;\n const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation);\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n else xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"`;\n }\n isPreviousElementTag = true;\n }\n\n return xmlStr;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \":@\") return key;\n }\n}\n\nfunction attr_to_str(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n let attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\n\nfunction isStopNode(jPath, options) {\n jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1);\n let tagName = jPath.substr(jPath.lastIndexOf(\".\") + 1);\n for (let index in options.stopNodes) {\n if (options.stopNodes[index] === jPath || options.stopNodes[index] === \"*.\" + tagName) return true;\n }\n return false;\n}\n\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\nmodule.exports = toXml;\n","const util = require('../util');\n\n//TODO: handle comments\nfunction readDocType(xmlData, i){\n \n const entities = {};\n if( xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E')\n { \n i = i+9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for(;i') { //Read tag content\n if(comment){\n if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n comment = false;\n angleBracketsCount--;\n }\n }else{\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n }else if( xmlData[i] === '['){\n hasBody = true;\n }else{\n exp += xmlData[i];\n }\n }\n if(angleBracketsCount !== 0){\n throw new Error(`Unclosed DOCTYPE`);\n }\n }else{\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return {entities, i};\n}\n\nfunction readEntityExp(xmlData,i){\n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n \n //read EntityName\n let entityName = \"\";\n for (; i < xmlData.length && (xmlData[i] !== \"'\" && xmlData[i] !== '\"' ); i++) {\n // if(xmlData[i] === \" \") continue;\n // else \n entityName += xmlData[i];\n }\n entityName = entityName.trim();\n if(entityName.indexOf(\" \") !== -1) throw new Error(\"External entites are not supported\");\n\n //read Entity Value\n const startChar = xmlData[i++];\n let val = \"\"\n for (; i < xmlData.length && xmlData[i] !== startChar ; i++) {\n val += xmlData[i];\n }\n return [entityName, val, i];\n}\n\nfunction isComment(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === '-' &&\n xmlData[i+3] === '-') return true\n return false\n}\nfunction isEntity(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'E' &&\n xmlData[i+3] === 'N' &&\n xmlData[i+4] === 'T' &&\n xmlData[i+5] === 'I' &&\n xmlData[i+6] === 'T' &&\n xmlData[i+7] === 'Y') return true\n return false\n}\nfunction isElement(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'E' &&\n xmlData[i+3] === 'L' &&\n xmlData[i+4] === 'E' &&\n xmlData[i+5] === 'M' &&\n xmlData[i+6] === 'E' &&\n xmlData[i+7] === 'N' &&\n xmlData[i+8] === 'T') return true\n return false\n}\n\nfunction isAttlist(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'A' &&\n xmlData[i+3] === 'T' &&\n xmlData[i+4] === 'T' &&\n xmlData[i+5] === 'L' &&\n xmlData[i+6] === 'I' &&\n xmlData[i+7] === 'S' &&\n xmlData[i+8] === 'T') return true\n return false\n}\nfunction isNotation(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'N' &&\n xmlData[i+3] === 'O' &&\n xmlData[i+4] === 'T' &&\n xmlData[i+5] === 'A' &&\n xmlData[i+6] === 'T' &&\n xmlData[i+7] === 'I' &&\n xmlData[i+8] === 'O' &&\n xmlData[i+9] === 'N') return true\n return false\n}\n\nfunction validateEntityName(name){\n if (util.isName(name))\n\treturn name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}\n\nmodule.exports = readDocType;\n","\nconst defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function(tagName, val) {\n return val;\n },\n attributeValueProcessor: function(attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function(tagName, jPath, attrs){\n return tagName\n },\n // skipEmptyListItem: false\n};\n \nconst buildOptions = function(options) {\n return Object.assign({}, defaultOptions, options);\n};\n\nexports.buildOptions = buildOptions;\nexports.defaultOptions = defaultOptions;","'use strict';\n///@ts-check\n\nconst util = require('../util');\nconst xmlNode = require('./xmlNode');\nconst readDocType = require(\"./DocTypeReader\");\nconst toNumber = require(\"strnum\");\n\nconst regx =\n '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nclass OrderedObjParser{\n constructor(options){\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n };\n this.ampEntity = { regex: /&(amp|#38|#x26);/g, val : \"&\"};\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n }\n\n}\n\nfunction addExternalEntities(externalEntities){\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\"+ent+\";\",\"g\"),\n val : externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if(val.length > 0){\n if(!escapeEntities) val = this.replaceEntitiesValue(val);\n \n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if(newval === null || newval === undefined){\n //don't parse\n return val;\n }else if(typeof newval !== typeof val || newval !== val){\n //overwrite\n return newval;\n }else if(this.options.trimValues){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n const trimmedVal = val.trim();\n if(trimmedVal === val){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath, tagName) {\n if (!this.options.ignoreAttributes && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = util.getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if(aName === \"__proto__\") aName = \"#__proto__\";\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if(newVal === null || newVal === undefined){\n //don't parse\n attrs[aName] = oldVal;\n }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n //overwrite\n attrs[aName] = newVal;\n }else{\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs\n }\n}\n\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n for(let i=0; i< xmlData.length; i++){//for each char in XML data\n const ch = xmlData[i];\n if(ch === '<'){\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if( xmlData[i+1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n if(this.options.removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n }\n }\n\n if(this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if(currentNode){\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = jPath.substring(jPath.lastIndexOf(\".\")+1);\n if(tagName && this.options.unpairedTags.indexOf(tagName) !== -1 ){\n throw new Error(`Unpaired tag can not be used as closing tag: `);\n }\n let propIndex = 0\n if(lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1 ){\n propIndex = jPath.lastIndexOf('.', jPath.lastIndexOf('.')-1)\n this.tagsNodeStack.pop();\n }else{\n propIndex = jPath.lastIndexOf(\".\");\n }\n jPath = jPath.substring(0, propIndex);\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if( xmlData[i+1] === '?') {\n\n let tagData = readTagExp(xmlData,i, false, \"?>\");\n if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n if( (this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags){\n\n }else{\n \n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n \n if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath, tagData.tagName);\n }\n this.addChild(currentNode, childNode, jPath)\n\n }\n\n\n i = tagData.closeIndex + 1;\n } else if(xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i+4, \"Comment is not closed.\")\n if(this.options.commentPropName){\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n }\n i = endIndex;\n } else if( xmlData.substr(i + 1, 2) === '!D') {\n const result = readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n }else if(xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9,closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n //cdata should be set even if it is 0 length string\n if(this.options.cdataPropName){\n // let val = this.parseTextData(tagExp, this.options.cdataPropName, jPath + \".\" + this.options.cdataPropName, true, false, true);\n // if(!val) val = \"\";\n currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n }else{\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true);\n if(val == undefined) val = \"\";\n currentNode.add(this.options.textNodeName, val);\n }\n \n i = closeIndex + 2;\n }else {//Opening tag\n let result = readTagExp(xmlData,i, this.options.removeNSPrefix);\n let tagName= result.tagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n \n //save text as child node\n if (currentNode && textData) {\n if(currentNode.tagname !== '!xml'){\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n currentNode = this.tagsNodeStack.pop();\n jPath = jPath.substring(0, jPath.lastIndexOf(\".\"));\n }\n if(tagName !== xmlObj.tagname){\n jPath += jPath ? \".\" + tagName : tagName;\n }\n if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { //TODO: namespace\n let tagContent = \"\";\n //self-closing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n i = result.closeIndex;\n }\n //unpaired tag\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){\n i = result.closeIndex;\n }\n //normal tag\n else{\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, tagName, closeIndex + 1);\n if(!result) throw new Error(`Unexpected end of ${tagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n if(tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n \n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n \n this.addChild(currentNode, childNode, jPath)\n }else{\n //selfClosing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n \n if(this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath)\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n }\n //opening tag\n else{\n const childNode = new xmlNode( tagName);\n this.tagsNodeStack.push(currentNode);\n \n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath)\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n }else{\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, jPath){\n const result = this.options.updateTag(childNode.tagname, jPath, childNode[\":@\"])\n if(result === false){\n }else if(typeof result === \"string\"){\n childNode.tagname = result\n currentNode.addChild(childNode);\n }else{\n currentNode.addChild(childNode);\n }\n}\n\nconst replaceEntitiesValue = function(val){\n\n if(this.options.processEntities){\n for(let entityName in this.docTypeEntities){\n const entity = this.docTypeEntities[entityName];\n val = val.replace( entity.regx, entity.val);\n }\n for(let entityName in this.lastEntities){\n const entity = this.lastEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n if(this.options.htmlEntities){\n for(let entityName in this.htmlEntities){\n const entity = this.htmlEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n }\n val = val.replace( this.ampEntity.regex, this.ampEntity.val);\n }\n return val;\n}\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if(isLeafNode === undefined) isLeafNode = Object.keys(currentNode.child).length === 0\n \n textData = this.parseTextData(textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * \n * @param {string[]} stopNodes \n * @param {string} jPath\n * @param {string} currentTagName \n */\nfunction isItStopNode(stopNodes, jPath, currentTagName){\n const allNodesExp = \"*.\" + currentTagName;\n for (const stopNodePath in stopNodes) {\n const stopNodeExp = stopNodes[stopNodePath];\n if( allNodesExp === stopNodeExp || jPath === stopNodeExp ) return true;\n }\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if(closingChar[1]){\n if(xmlData[index + 1] === closingChar[1]){\n return {\n data: tagExp,\n index: index\n }\n }\n }else{\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \"\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n const closingIndex = xmlData.indexOf(str, i);\n if(closingIndex === -1){\n throw new Error(errMsg)\n }else{\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n if(!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if(separatorIndex !== -1){//separate tag name and attributes expression\n tagName = tagExp.substr(0, separatorIndex).replace(/\\s\\s*$/, '');\n tagExp = tagExp.substr(separatorIndex + 1);\n }\n\n if(removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if( xmlData[i] === \"<\"){ \n if (xmlData[i+1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n if(closeTagName === tagName){\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i : closeIndex\n }\n }\n }\n i=closeIndex;\n } else if(xmlData[i+1] === '?') { \n const closeIndex = findClosingIndex(xmlData, \"?>\", i+1, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 3) === '!--') { \n const closeIndex = findClosingIndex(xmlData, \"-->\", i+3, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 2) === '![') { \n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i=closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length-1] !== \"/\") {\n openTagCount++;\n }\n i=tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if(newval === 'true' ) return true;\n else if(newval === 'false' ) return false;\n else return toNumber(val, options);\n } else {\n if (util.isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\n\nmodule.exports = OrderedObjParser;\n","const { buildOptions} = require(\"./OptionsBuilder\");\nconst OrderedObjParser = require(\"./OrderedObjParser\");\nconst { prettify} = require(\"./node2json\");\nconst validator = require('../validator');\n\nclass XMLParser{\n \n constructor(options){\n this.externalEntities = {};\n this.options = buildOptions(options);\n \n }\n /**\n * Parse XML dats to JS object \n * @param {string|Buffer} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData,validationOption){\n if(typeof xmlData === \"string\"){\n }else if( xmlData.toString){\n xmlData = xmlData.toString();\n }else{\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n if( validationOption){\n if(validationOption === true) validationOption = {}; //validate with default options\n \n const result = validator.validate(xmlData, validationOption);\n if (result !== true) {\n throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value){\n if(value.indexOf(\"&\") !== -1){\n throw new Error(\"Entity value can't have '&'\")\n }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for ' '\")\n }else if(value === \"&\"){\n throw new Error(\"An entity with value '&' is not permitted\");\n }else{\n this.externalEntities[key] = value;\n }\n }\n}\n\nmodule.exports = XMLParser;","'use strict';\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nfunction prettify(node, options){\n return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n let newJpath = \"\";\n if(jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if(property === options.textNodeName){\n if(text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n }else if(property === undefined){\n continue;\n }else if(tagObj[property]){\n \n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n\n if(tagObj[\":@\"]){\n assignAttributes( val, tagObj[\":@\"], newJpath, options);\n }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n val = val[options.textNodeName];\n }else if(Object.keys(val).length === 0){\n if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if(compressedObj[property] !== undefined && compressedObj.hasOwnProperty(property)) {\n if(!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [ compressedObj[property] ];\n }\n compressedObj[property].push(val);\n }else{\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf )) {\n compressedObj[property] = [val];\n }else{\n compressedObj[property] = val;\n }\n }\n }\n \n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if(typeof text === \"string\"){\n if(text.length > 0) compressedObj[options.textNodeName] = text;\n }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [ attrMap[atrrName] ];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options){\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n \n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}\nexports.prettify = prettify;\n","'use strict';\n\nclass XmlNode{\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = {}; //attributes map\n }\n add(key,val){\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if(key === \"__proto__\") key = \"#__proto__\";\n this.child.push( {[key]: val });\n }\n addChild(node) {\n if(node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n }else{\n this.child.push( { [node.tagname]: node.child });\n }\n };\n};\n\n\nmodule.exports = XmlNode;","'use strict'\n\nconst fs = require('graceful-fs')\nconst path = require('path')\nconst mkdirsSync = require('../mkdirs').mkdirsSync\nconst utimesMillisSync = require('../util/utimes').utimesMillisSync\nconst stat = require('../util/stat')\n\nfunction copySync (src, dest, opts) {\n if (typeof opts === 'function') {\n opts = { filter: opts }\n }\n\n opts = opts || {}\n opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now\n opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber\n\n // Warn about using preserveTimestamps on 32-bit node\n if (opts.preserveTimestamps && process.arch === 'ia32') {\n process.emitWarning(\n 'Using the preserveTimestamps option in 32-bit node is not recommended;\\n\\n' +\n '\\tsee https://github.com/jprichardson/node-fs-extra/issues/269',\n 'Warning', 'fs-extra-WARN0002'\n )\n }\n\n const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy', opts)\n stat.checkParentPathsSync(src, srcStat, dest, 'copy')\n if (opts.filter && !opts.filter(src, dest)) return\n const destParent = path.dirname(dest)\n if (!fs.existsSync(destParent)) mkdirsSync(destParent)\n return getStats(destStat, src, dest, opts)\n}\n\nfunction getStats (destStat, src, dest, opts) {\n const statSync = opts.dereference ? fs.statSync : fs.lstatSync\n const srcStat = statSync(src)\n\n if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)\n else if (srcStat.isFile() ||\n srcStat.isCharacterDevice() ||\n srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)\n else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)\n else if (srcStat.isSocket()) throw new Error(`Cannot copy a socket file: ${src}`)\n else if (srcStat.isFIFO()) throw new Error(`Cannot copy a FIFO pipe: ${src}`)\n throw new Error(`Unknown file: ${src}`)\n}\n\nfunction onFile (srcStat, destStat, src, dest, opts) {\n if (!destStat) return copyFile(srcStat, src, dest, opts)\n return mayCopyFile(srcStat, src, dest, opts)\n}\n\nfunction mayCopyFile (srcStat, src, dest, opts) {\n if (opts.overwrite) {\n fs.unlinkSync(dest)\n return copyFile(srcStat, src, dest, opts)\n } else if (opts.errorOnExist) {\n throw new Error(`'${dest}' already exists`)\n }\n}\n\nfunction copyFile (srcStat, src, dest, opts) {\n fs.copyFileSync(src, dest)\n if (opts.preserveTimestamps) handleTimestamps(srcStat.mode, src, dest)\n return setDestMode(dest, srcStat.mode)\n}\n\nfunction handleTimestamps (srcMode, src, dest) {\n // Make sure the file is writable before setting the timestamp\n // otherwise open fails with EPERM when invoked with 'r+'\n // (through utimes call)\n if (fileIsNotWritable(srcMode)) makeFileWritable(dest, srcMode)\n return setDestTimestamps(src, dest)\n}\n\nfunction fileIsNotWritable (srcMode) {\n return (srcMode & 0o200) === 0\n}\n\nfunction makeFileWritable (dest, srcMode) {\n return setDestMode(dest, srcMode | 0o200)\n}\n\nfunction setDestMode (dest, srcMode) {\n return fs.chmodSync(dest, srcMode)\n}\n\nfunction setDestTimestamps (src, dest) {\n // The initial srcStat.atime cannot be trusted\n // because it is modified by the read(2) system call\n // (See https://nodejs.org/api/fs.html#fs_stat_time_values)\n const updatedSrcStat = fs.statSync(src)\n return utimesMillisSync(dest, updatedSrcStat.atime, updatedSrcStat.mtime)\n}\n\nfunction onDir (srcStat, destStat, src, dest, opts) {\n if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts)\n return copyDir(src, dest, opts)\n}\n\nfunction mkDirAndCopy (srcMode, src, dest, opts) {\n fs.mkdirSync(dest)\n copyDir(src, dest, opts)\n return setDestMode(dest, srcMode)\n}\n\nfunction copyDir (src, dest, opts) {\n fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))\n}\n\nfunction copyDirItem (item, src, dest, opts) {\n const srcItem = path.join(src, item)\n const destItem = path.join(dest, item)\n if (opts.filter && !opts.filter(srcItem, destItem)) return\n const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy', opts)\n return getStats(destStat, srcItem, destItem, opts)\n}\n\nfunction onLink (destStat, src, dest, opts) {\n let resolvedSrc = fs.readlinkSync(src)\n if (opts.dereference) {\n resolvedSrc = path.resolve(process.cwd(), resolvedSrc)\n }\n\n if (!destStat) {\n return fs.symlinkSync(resolvedSrc, dest)\n } else {\n let resolvedDest\n try {\n resolvedDest = fs.readlinkSync(dest)\n } catch (err) {\n // dest exists and is a regular file or directory,\n // Windows may throw UNKNOWN error. If dest already exists,\n // fs throws error anyway, so no need to guard against it here.\n if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)\n throw err\n }\n if (opts.dereference) {\n resolvedDest = path.resolve(process.cwd(), resolvedDest)\n }\n if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {\n throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)\n }\n\n // prevent copy if src is a subdir of dest since unlinking\n // dest in this case would result in removing src contents\n // and therefore a broken symlink would be created.\n if (stat.isSrcSubdir(resolvedDest, resolvedSrc)) {\n throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)\n }\n return copyLink(resolvedSrc, dest)\n }\n}\n\nfunction copyLink (resolvedSrc, dest) {\n fs.unlinkSync(dest)\n return fs.symlinkSync(resolvedSrc, dest)\n}\n\nmodule.exports = copySync\n","'use strict'\n\nconst fs = require('graceful-fs')\nconst path = require('path')\nconst mkdirs = require('../mkdirs').mkdirs\nconst pathExists = require('../path-exists').pathExists\nconst utimesMillis = require('../util/utimes').utimesMillis\nconst stat = require('../util/stat')\n\nfunction copy (src, dest, opts, cb) {\n if (typeof opts === 'function' && !cb) {\n cb = opts\n opts = {}\n } else if (typeof opts === 'function') {\n opts = { filter: opts }\n }\n\n cb = cb || function () {}\n opts = opts || {}\n\n opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now\n opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber\n\n // Warn about using preserveTimestamps on 32-bit node\n if (opts.preserveTimestamps && process.arch === 'ia32') {\n process.emitWarning(\n 'Using the preserveTimestamps option in 32-bit node is not recommended;\\n\\n' +\n '\\tsee https://github.com/jprichardson/node-fs-extra/issues/269',\n 'Warning', 'fs-extra-WARN0001'\n )\n }\n\n stat.checkPaths(src, dest, 'copy', opts, (err, stats) => {\n if (err) return cb(err)\n const { srcStat, destStat } = stats\n stat.checkParentPaths(src, srcStat, dest, 'copy', err => {\n if (err) return cb(err)\n runFilter(src, dest, opts, (err, include) => {\n if (err) return cb(err)\n if (!include) return cb()\n\n checkParentDir(destStat, src, dest, opts, cb)\n })\n })\n })\n}\n\nfunction checkParentDir (destStat, src, dest, opts, cb) {\n const destParent = path.dirname(dest)\n pathExists(destParent, (err, dirExists) => {\n if (err) return cb(err)\n if (dirExists) return getStats(destStat, src, dest, opts, cb)\n mkdirs(destParent, err => {\n if (err) return cb(err)\n return getStats(destStat, src, dest, opts, cb)\n })\n })\n}\n\nfunction runFilter (src, dest, opts, cb) {\n if (!opts.filter) return cb(null, true)\n Promise.resolve(opts.filter(src, dest))\n .then(include => cb(null, include), error => cb(error))\n}\n\nfunction getStats (destStat, src, dest, opts, cb) {\n const stat = opts.dereference ? fs.stat : fs.lstat\n stat(src, (err, srcStat) => {\n if (err) return cb(err)\n\n if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)\n else if (srcStat.isFile() ||\n srcStat.isCharacterDevice() ||\n srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)\n else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)\n else if (srcStat.isSocket()) return cb(new Error(`Cannot copy a socket file: ${src}`))\n else if (srcStat.isFIFO()) return cb(new Error(`Cannot copy a FIFO pipe: ${src}`))\n return cb(new Error(`Unknown file: ${src}`))\n })\n}\n\nfunction onFile (srcStat, destStat, src, dest, opts, cb) {\n if (!destStat) return copyFile(srcStat, src, dest, opts, cb)\n return mayCopyFile(srcStat, src, dest, opts, cb)\n}\n\nfunction mayCopyFile (srcStat, src, dest, opts, cb) {\n if (opts.overwrite) {\n fs.unlink(dest, err => {\n if (err) return cb(err)\n return copyFile(srcStat, src, dest, opts, cb)\n })\n } else if (opts.errorOnExist) {\n return cb(new Error(`'${dest}' already exists`))\n } else return cb()\n}\n\nfunction copyFile (srcStat, src, dest, opts, cb) {\n fs.copyFile(src, dest, err => {\n if (err) return cb(err)\n if (opts.preserveTimestamps) return handleTimestampsAndMode(srcStat.mode, src, dest, cb)\n return setDestMode(dest, srcStat.mode, cb)\n })\n}\n\nfunction handleTimestampsAndMode (srcMode, src, dest, cb) {\n // Make sure the file is writable before setting the timestamp\n // otherwise open fails with EPERM when invoked with 'r+'\n // (through utimes call)\n if (fileIsNotWritable(srcMode)) {\n return makeFileWritable(dest, srcMode, err => {\n if (err) return cb(err)\n return setDestTimestampsAndMode(srcMode, src, dest, cb)\n })\n }\n return setDestTimestampsAndMode(srcMode, src, dest, cb)\n}\n\nfunction fileIsNotWritable (srcMode) {\n return (srcMode & 0o200) === 0\n}\n\nfunction makeFileWritable (dest, srcMode, cb) {\n return setDestMode(dest, srcMode | 0o200, cb)\n}\n\nfunction setDestTimestampsAndMode (srcMode, src, dest, cb) {\n setDestTimestamps(src, dest, err => {\n if (err) return cb(err)\n return setDestMode(dest, srcMode, cb)\n })\n}\n\nfunction setDestMode (dest, srcMode, cb) {\n return fs.chmod(dest, srcMode, cb)\n}\n\nfunction setDestTimestamps (src, dest, cb) {\n // The initial srcStat.atime cannot be trusted\n // because it is modified by the read(2) system call\n // (See https://nodejs.org/api/fs.html#fs_stat_time_values)\n fs.stat(src, (err, updatedSrcStat) => {\n if (err) return cb(err)\n return utimesMillis(dest, updatedSrcStat.atime, updatedSrcStat.mtime, cb)\n })\n}\n\nfunction onDir (srcStat, destStat, src, dest, opts, cb) {\n if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts, cb)\n return copyDir(src, dest, opts, cb)\n}\n\nfunction mkDirAndCopy (srcMode, src, dest, opts, cb) {\n fs.mkdir(dest, err => {\n if (err) return cb(err)\n copyDir(src, dest, opts, err => {\n if (err) return cb(err)\n return setDestMode(dest, srcMode, cb)\n })\n })\n}\n\nfunction copyDir (src, dest, opts, cb) {\n fs.readdir(src, (err, items) => {\n if (err) return cb(err)\n return copyDirItems(items, src, dest, opts, cb)\n })\n}\n\nfunction copyDirItems (items, src, dest, opts, cb) {\n const item = items.pop()\n if (!item) return cb()\n return copyDirItem(items, item, src, dest, opts, cb)\n}\n\nfunction copyDirItem (items, item, src, dest, opts, cb) {\n const srcItem = path.join(src, item)\n const destItem = path.join(dest, item)\n runFilter(srcItem, destItem, opts, (err, include) => {\n if (err) return cb(err)\n if (!include) return copyDirItems(items, src, dest, opts, cb)\n\n stat.checkPaths(srcItem, destItem, 'copy', opts, (err, stats) => {\n if (err) return cb(err)\n const { destStat } = stats\n getStats(destStat, srcItem, destItem, opts, err => {\n if (err) return cb(err)\n return copyDirItems(items, src, dest, opts, cb)\n })\n })\n })\n}\n\nfunction onLink (destStat, src, dest, opts, cb) {\n fs.readlink(src, (err, resolvedSrc) => {\n if (err) return cb(err)\n if (opts.dereference) {\n resolvedSrc = path.resolve(process.cwd(), resolvedSrc)\n }\n\n if (!destStat) {\n return fs.symlink(resolvedSrc, dest, cb)\n } else {\n fs.readlink(dest, (err, resolvedDest) => {\n if (err) {\n // dest exists and is a regular file or directory,\n // Windows may throw UNKNOWN error. If dest already exists,\n // fs throws error anyway, so no need to guard against it here.\n if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)\n return cb(err)\n }\n if (opts.dereference) {\n resolvedDest = path.resolve(process.cwd(), resolvedDest)\n }\n if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {\n return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))\n }\n\n // do not copy if src is a subdir of dest since unlinking\n // dest in this case would result in removing src contents\n // and therefore a broken symlink would be created.\n if (stat.isSrcSubdir(resolvedDest, resolvedSrc)) {\n return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))\n }\n return copyLink(resolvedSrc, dest, cb)\n })\n }\n })\n}\n\nfunction copyLink (resolvedSrc, dest, cb) {\n fs.unlink(dest, err => {\n if (err) return cb(err)\n return fs.symlink(resolvedSrc, dest, cb)\n })\n}\n\nmodule.exports = copy\n","'use strict'\n\nconst u = require('universalify').fromCallback\nmodule.exports = {\n copy: u(require('./copy')),\n copySync: require('./copy-sync')\n}\n","'use strict'\n\nconst u = require('universalify').fromPromise\nconst fs = require('../fs')\nconst path = require('path')\nconst mkdir = require('../mkdirs')\nconst remove = require('../remove')\n\nconst emptyDir = u(async function emptyDir (dir) {\n let items\n try {\n items = await fs.readdir(dir)\n } catch {\n return mkdir.mkdirs(dir)\n }\n\n return Promise.all(items.map(item => remove.remove(path.join(dir, item))))\n})\n\nfunction emptyDirSync (dir) {\n let items\n try {\n items = fs.readdirSync(dir)\n } catch {\n return mkdir.mkdirsSync(dir)\n }\n\n items.forEach(item => {\n item = path.join(dir, item)\n remove.removeSync(item)\n })\n}\n\nmodule.exports = {\n emptyDirSync,\n emptydirSync: emptyDirSync,\n emptyDir,\n emptydir: emptyDir\n}\n","'use strict'\n\nconst u = require('universalify').fromCallback\nconst path = require('path')\nconst fs = require('graceful-fs')\nconst mkdir = require('../mkdirs')\n\nfunction createFile (file, callback) {\n function makeFile () {\n fs.writeFile(file, '', err => {\n if (err) return callback(err)\n callback()\n })\n }\n\n fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err\n if (!err && stats.isFile()) return callback()\n const dir = path.dirname(file)\n fs.stat(dir, (err, stats) => {\n if (err) {\n // if the directory doesn't exist, make it\n if (err.code === 'ENOENT') {\n return mkdir.mkdirs(dir, err => {\n if (err) return callback(err)\n makeFile()\n })\n }\n return callback(err)\n }\n\n if (stats.isDirectory()) makeFile()\n else {\n // parent is not a directory\n // This is just to cause an internal ENOTDIR error to be thrown\n fs.readdir(dir, err => {\n if (err) return callback(err)\n })\n }\n })\n })\n}\n\nfunction createFileSync (file) {\n let stats\n try {\n stats = fs.statSync(file)\n } catch {}\n if (stats && stats.isFile()) return\n\n const dir = path.dirname(file)\n try {\n if (!fs.statSync(dir).isDirectory()) {\n // parent is not a directory\n // This is just to cause an internal ENOTDIR error to be thrown\n fs.readdirSync(dir)\n }\n } catch (err) {\n // If the stat call above failed because the directory doesn't exist, create it\n if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir)\n else throw err\n }\n\n fs.writeFileSync(file, '')\n}\n\nmodule.exports = {\n createFile: u(createFile),\n createFileSync\n}\n","'use strict'\n\nconst { createFile, createFileSync } = require('./file')\nconst { createLink, createLinkSync } = require('./link')\nconst { createSymlink, createSymlinkSync } = require('./symlink')\n\nmodule.exports = {\n // file\n createFile,\n createFileSync,\n ensureFile: createFile,\n ensureFileSync: createFileSync,\n // link\n createLink,\n createLinkSync,\n ensureLink: createLink,\n ensureLinkSync: createLinkSync,\n // symlink\n createSymlink,\n createSymlinkSync,\n ensureSymlink: createSymlink,\n ensureSymlinkSync: createSymlinkSync\n}\n","'use strict'\n\nconst u = require('universalify').fromCallback\nconst path = require('path')\nconst fs = require('graceful-fs')\nconst mkdir = require('../mkdirs')\nconst pathExists = require('../path-exists').pathExists\nconst { areIdentical } = require('../util/stat')\n\nfunction createLink (srcpath, dstpath, callback) {\n function makeLink (srcpath, dstpath) {\n fs.link(srcpath, dstpath, err => {\n if (err) return callback(err)\n callback(null)\n })\n }\n\n fs.lstat(dstpath, (_, dstStat) => {\n fs.lstat(srcpath, (err, srcStat) => {\n if (err) {\n err.message = err.message.replace('lstat', 'ensureLink')\n return callback(err)\n }\n if (dstStat && areIdentical(srcStat, dstStat)) return callback(null)\n\n const dir = path.dirname(dstpath)\n pathExists(dir, (err, dirExists) => {\n if (err) return callback(err)\n if (dirExists) return makeLink(srcpath, dstpath)\n mkdir.mkdirs(dir, err => {\n if (err) return callback(err)\n makeLink(srcpath, dstpath)\n })\n })\n })\n })\n}\n\nfunction createLinkSync (srcpath, dstpath) {\n let dstStat\n try {\n dstStat = fs.lstatSync(dstpath)\n } catch {}\n\n try {\n const srcStat = fs.lstatSync(srcpath)\n if (dstStat && areIdentical(srcStat, dstStat)) return\n } catch (err) {\n err.message = err.message.replace('lstat', 'ensureLink')\n throw err\n }\n\n const dir = path.dirname(dstpath)\n const dirExists = fs.existsSync(dir)\n if (dirExists) return fs.linkSync(srcpath, dstpath)\n mkdir.mkdirsSync(dir)\n\n return fs.linkSync(srcpath, dstpath)\n}\n\nmodule.exports = {\n createLink: u(createLink),\n createLinkSync\n}\n","'use strict'\n\nconst path = require('path')\nconst fs = require('graceful-fs')\nconst pathExists = require('../path-exists').pathExists\n\n/**\n * Function that returns two types of paths, one relative to symlink, and one\n * relative to the current working directory. Checks if path is absolute or\n * relative. If the path is relative, this function checks if the path is\n * relative to symlink or relative to current working directory. This is an\n * initiative to find a smarter `srcpath` to supply when building symlinks.\n * This allows you to determine which path to use out of one of three possible\n * types of source paths. The first is an absolute path. This is detected by\n * `path.isAbsolute()`. When an absolute path is provided, it is checked to\n * see if it exists. If it does it's used, if not an error is returned\n * (callback)/ thrown (sync). The other two options for `srcpath` are a\n * relative url. By default Node's `fs.symlink` works by creating a symlink\n * using `dstpath` and expects the `srcpath` to be relative to the newly\n * created symlink. If you provide a `srcpath` that does not exist on the file\n * system it results in a broken symlink. To minimize this, the function\n * checks to see if the 'relative to symlink' source file exists, and if it\n * does it will use it. If it does not, it checks if there's a file that\n * exists that is relative to the current working directory, if does its used.\n * This preserves the expectations of the original fs.symlink spec and adds\n * the ability to pass in `relative to current working direcotry` paths.\n */\n\nfunction symlinkPaths (srcpath, dstpath, callback) {\n if (path.isAbsolute(srcpath)) {\n return fs.lstat(srcpath, (err) => {\n if (err) {\n err.message = err.message.replace('lstat', 'ensureSymlink')\n return callback(err)\n }\n return callback(null, {\n toCwd: srcpath,\n toDst: srcpath\n })\n })\n } else {\n const dstdir = path.dirname(dstpath)\n const relativeToDst = path.join(dstdir, srcpath)\n return pathExists(relativeToDst, (err, exists) => {\n if (err) return callback(err)\n if (exists) {\n return callback(null, {\n toCwd: relativeToDst,\n toDst: srcpath\n })\n } else {\n return fs.lstat(srcpath, (err) => {\n if (err) {\n err.message = err.message.replace('lstat', 'ensureSymlink')\n return callback(err)\n }\n return callback(null, {\n toCwd: srcpath,\n toDst: path.relative(dstdir, srcpath)\n })\n })\n }\n })\n }\n}\n\nfunction symlinkPathsSync (srcpath, dstpath) {\n let exists\n if (path.isAbsolute(srcpath)) {\n exists = fs.existsSync(srcpath)\n if (!exists) throw new Error('absolute srcpath does not exist')\n return {\n toCwd: srcpath,\n toDst: srcpath\n }\n } else {\n const dstdir = path.dirname(dstpath)\n const relativeToDst = path.join(dstdir, srcpath)\n exists = fs.existsSync(relativeToDst)\n if (exists) {\n return {\n toCwd: relativeToDst,\n toDst: srcpath\n }\n } else {\n exists = fs.existsSync(srcpath)\n if (!exists) throw new Error('relative srcpath does not exist')\n return {\n toCwd: srcpath,\n toDst: path.relative(dstdir, srcpath)\n }\n }\n }\n}\n\nmodule.exports = {\n symlinkPaths,\n symlinkPathsSync\n}\n","'use strict'\n\nconst fs = require('graceful-fs')\n\nfunction symlinkType (srcpath, type, callback) {\n callback = (typeof type === 'function') ? type : callback\n type = (typeof type === 'function') ? false : type\n if (type) return callback(null, type)\n fs.lstat(srcpath, (err, stats) => {\n if (err) return callback(null, 'file')\n type = (stats && stats.isDirectory()) ? 'dir' : 'file'\n callback(null, type)\n })\n}\n\nfunction symlinkTypeSync (srcpath, type) {\n let stats\n\n if (type) return type\n try {\n stats = fs.lstatSync(srcpath)\n } catch {\n return 'file'\n }\n return (stats && stats.isDirectory()) ? 'dir' : 'file'\n}\n\nmodule.exports = {\n symlinkType,\n symlinkTypeSync\n}\n","'use strict'\n\nconst u = require('universalify').fromCallback\nconst path = require('path')\nconst fs = require('../fs')\nconst _mkdirs = require('../mkdirs')\nconst mkdirs = _mkdirs.mkdirs\nconst mkdirsSync = _mkdirs.mkdirsSync\n\nconst _symlinkPaths = require('./symlink-paths')\nconst symlinkPaths = _symlinkPaths.symlinkPaths\nconst symlinkPathsSync = _symlinkPaths.symlinkPathsSync\n\nconst _symlinkType = require('./symlink-type')\nconst symlinkType = _symlinkType.symlinkType\nconst symlinkTypeSync = _symlinkType.symlinkTypeSync\n\nconst pathExists = require('../path-exists').pathExists\n\nconst { areIdentical } = require('../util/stat')\n\nfunction createSymlink (srcpath, dstpath, type, callback) {\n callback = (typeof type === 'function') ? type : callback\n type = (typeof type === 'function') ? false : type\n\n fs.lstat(dstpath, (err, stats) => {\n if (!err && stats.isSymbolicLink()) {\n Promise.all([\n fs.stat(srcpath),\n fs.stat(dstpath)\n ]).then(([srcStat, dstStat]) => {\n if (areIdentical(srcStat, dstStat)) return callback(null)\n _createSymlink(srcpath, dstpath, type, callback)\n })\n } else _createSymlink(srcpath, dstpath, type, callback)\n })\n}\n\nfunction _createSymlink (srcpath, dstpath, type, callback) {\n symlinkPaths(srcpath, dstpath, (err, relative) => {\n if (err) return callback(err)\n srcpath = relative.toDst\n symlinkType(relative.toCwd, type, (err, type) => {\n if (err) return callback(err)\n const dir = path.dirname(dstpath)\n pathExists(dir, (err, dirExists) => {\n if (err) return callback(err)\n if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)\n mkdirs(dir, err => {\n if (err) return callback(err)\n fs.symlink(srcpath, dstpath, type, callback)\n })\n })\n })\n })\n}\n\nfunction createSymlinkSync (srcpath, dstpath, type) {\n let stats\n try {\n stats = fs.lstatSync(dstpath)\n } catch {}\n if (stats && stats.isSymbolicLink()) {\n const srcStat = fs.statSync(srcpath)\n const dstStat = fs.statSync(dstpath)\n if (areIdentical(srcStat, dstStat)) return\n }\n\n const relative = symlinkPathsSync(srcpath, dstpath)\n srcpath = relative.toDst\n type = symlinkTypeSync(relative.toCwd, type)\n const dir = path.dirname(dstpath)\n const exists = fs.existsSync(dir)\n if (exists) return fs.symlinkSync(srcpath, dstpath, type)\n mkdirsSync(dir)\n return fs.symlinkSync(srcpath, dstpath, type)\n}\n\nmodule.exports = {\n createSymlink: u(createSymlink),\n createSymlinkSync\n}\n","'use strict'\n// This is adapted from https://github.com/normalize/mz\n// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors\nconst u = require('universalify').fromCallback\nconst fs = require('graceful-fs')\n\nconst api = [\n 'access',\n 'appendFile',\n 'chmod',\n 'chown',\n 'close',\n 'copyFile',\n 'fchmod',\n 'fchown',\n 'fdatasync',\n 'fstat',\n 'fsync',\n 'ftruncate',\n 'futimes',\n 'lchmod',\n 'lchown',\n 'link',\n 'lstat',\n 'mkdir',\n 'mkdtemp',\n 'open',\n 'opendir',\n 'readdir',\n 'readFile',\n 'readlink',\n 'realpath',\n 'rename',\n 'rm',\n 'rmdir',\n 'stat',\n 'symlink',\n 'truncate',\n 'unlink',\n 'utimes',\n 'writeFile'\n].filter(key => {\n // Some commands are not available on some systems. Ex:\n // fs.cp was added in Node.js v16.7.0\n // fs.lchown is not available on at least some Linux\n return typeof fs[key] === 'function'\n})\n\n// Export cloned fs:\nObject.assign(exports, fs)\n\n// Universalify async methods:\napi.forEach(method => {\n exports[method] = u(fs[method])\n})\n\n// We differ from mz/fs in that we still ship the old, broken, fs.exists()\n// since we are a drop-in replacement for the native module\nexports.exists = function (filename, callback) {\n if (typeof callback === 'function') {\n return fs.exists(filename, callback)\n }\n return new Promise(resolve => {\n return fs.exists(filename, resolve)\n })\n}\n\n// fs.read(), fs.write(), fs.readv(), & fs.writev() need special treatment due to multiple callback args\n\nexports.read = function (fd, buffer, offset, length, position, callback) {\n if (typeof callback === 'function') {\n return fs.read(fd, buffer, offset, length, position, callback)\n }\n return new Promise((resolve, reject) => {\n fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {\n if (err) return reject(err)\n resolve({ bytesRead, buffer })\n })\n })\n}\n\n// Function signature can be\n// fs.write(fd, buffer[, offset[, length[, position]]], callback)\n// OR\n// fs.write(fd, string[, position[, encoding]], callback)\n// We need to handle both cases, so we use ...args\nexports.write = function (fd, buffer, ...args) {\n if (typeof args[args.length - 1] === 'function') {\n return fs.write(fd, buffer, ...args)\n }\n\n return new Promise((resolve, reject) => {\n fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {\n if (err) return reject(err)\n resolve({ bytesWritten, buffer })\n })\n })\n}\n\n// Function signature is\n// s.readv(fd, buffers[, position], callback)\n// We need to handle the optional arg, so we use ...args\nexports.readv = function (fd, buffers, ...args) {\n if (typeof args[args.length - 1] === 'function') {\n return fs.readv(fd, buffers, ...args)\n }\n\n return new Promise((resolve, reject) => {\n fs.readv(fd, buffers, ...args, (err, bytesRead, buffers) => {\n if (err) return reject(err)\n resolve({ bytesRead, buffers })\n })\n })\n}\n\n// Function signature is\n// s.writev(fd, buffers[, position], callback)\n// We need to handle the optional arg, so we use ...args\nexports.writev = function (fd, buffers, ...args) {\n if (typeof args[args.length - 1] === 'function') {\n return fs.writev(fd, buffers, ...args)\n }\n\n return new Promise((resolve, reject) => {\n fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => {\n if (err) return reject(err)\n resolve({ bytesWritten, buffers })\n })\n })\n}\n\n// fs.realpath.native sometimes not available if fs is monkey-patched\nif (typeof fs.realpath.native === 'function') {\n exports.realpath.native = u(fs.realpath.native)\n} else {\n process.emitWarning(\n 'fs.realpath.native is not a function. Is fs being monkey-patched?',\n 'Warning', 'fs-extra-WARN0003'\n )\n}\n","'use strict'\n\nmodule.exports = {\n // Export promiseified graceful-fs:\n ...require('./fs'),\n // Export extra methods:\n ...require('./copy'),\n ...require('./empty'),\n ...require('./ensure'),\n ...require('./json'),\n ...require('./mkdirs'),\n ...require('./move'),\n ...require('./output-file'),\n ...require('./path-exists'),\n ...require('./remove')\n}\n","'use strict'\n\nconst u = require('universalify').fromPromise\nconst jsonFile = require('./jsonfile')\n\njsonFile.outputJson = u(require('./output-json'))\njsonFile.outputJsonSync = require('./output-json-sync')\n// aliases\njsonFile.outputJSON = jsonFile.outputJson\njsonFile.outputJSONSync = jsonFile.outputJsonSync\njsonFile.writeJSON = jsonFile.writeJson\njsonFile.writeJSONSync = jsonFile.writeJsonSync\njsonFile.readJSON = jsonFile.readJson\njsonFile.readJSONSync = jsonFile.readJsonSync\n\nmodule.exports = jsonFile\n","'use strict'\n\nconst jsonFile = require('jsonfile')\n\nmodule.exports = {\n // jsonfile exports\n readJson: jsonFile.readFile,\n readJsonSync: jsonFile.readFileSync,\n writeJson: jsonFile.writeFile,\n writeJsonSync: jsonFile.writeFileSync\n}\n","'use strict'\n\nconst { stringify } = require('jsonfile/utils')\nconst { outputFileSync } = require('../output-file')\n\nfunction outputJsonSync (file, data, options) {\n const str = stringify(data, options)\n\n outputFileSync(file, str, options)\n}\n\nmodule.exports = outputJsonSync\n","'use strict'\n\nconst { stringify } = require('jsonfile/utils')\nconst { outputFile } = require('../output-file')\n\nasync function outputJson (file, data, options = {}) {\n const str = stringify(data, options)\n\n await outputFile(file, str, options)\n}\n\nmodule.exports = outputJson\n","'use strict'\nconst u = require('universalify').fromPromise\nconst { makeDir: _makeDir, makeDirSync } = require('./make-dir')\nconst makeDir = u(_makeDir)\n\nmodule.exports = {\n mkdirs: makeDir,\n mkdirsSync: makeDirSync,\n // alias\n mkdirp: makeDir,\n mkdirpSync: makeDirSync,\n ensureDir: makeDir,\n ensureDirSync: makeDirSync\n}\n","'use strict'\nconst fs = require('../fs')\nconst { checkPath } = require('./utils')\n\nconst getMode = options => {\n const defaults = { mode: 0o777 }\n if (typeof options === 'number') return options\n return ({ ...defaults, ...options }).mode\n}\n\nmodule.exports.makeDir = async (dir, options) => {\n checkPath(dir)\n\n return fs.mkdir(dir, {\n mode: getMode(options),\n recursive: true\n })\n}\n\nmodule.exports.makeDirSync = (dir, options) => {\n checkPath(dir)\n\n return fs.mkdirSync(dir, {\n mode: getMode(options),\n recursive: true\n })\n}\n","// Adapted from https://github.com/sindresorhus/make-dir\n// Copyright (c) Sindre Sorhus (sindresorhus.com)\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n'use strict'\nconst path = require('path')\n\n// https://github.com/nodejs/node/issues/8987\n// https://github.com/libuv/libuv/pull/1088\nmodule.exports.checkPath = function checkPath (pth) {\n if (process.platform === 'win32') {\n const pathHasInvalidWinCharacters = /[<>:\"|?*]/.test(pth.replace(path.parse(pth).root, ''))\n\n if (pathHasInvalidWinCharacters) {\n const error = new Error(`Path contains invalid characters: ${pth}`)\n error.code = 'EINVAL'\n throw error\n }\n }\n}\n","'use strict'\n\nconst u = require('universalify').fromCallback\nmodule.exports = {\n move: u(require('./move')),\n moveSync: require('./move-sync')\n}\n","'use strict'\n\nconst fs = require('graceful-fs')\nconst path = require('path')\nconst copySync = require('../copy').copySync\nconst removeSync = require('../remove').removeSync\nconst mkdirpSync = require('../mkdirs').mkdirpSync\nconst stat = require('../util/stat')\n\nfunction moveSync (src, dest, opts) {\n opts = opts || {}\n const overwrite = opts.overwrite || opts.clobber || false\n\n const { srcStat, isChangingCase = false } = stat.checkPathsSync(src, dest, 'move', opts)\n stat.checkParentPathsSync(src, srcStat, dest, 'move')\n if (!isParentRoot(dest)) mkdirpSync(path.dirname(dest))\n return doRename(src, dest, overwrite, isChangingCase)\n}\n\nfunction isParentRoot (dest) {\n const parent = path.dirname(dest)\n const parsedPath = path.parse(parent)\n return parsedPath.root === parent\n}\n\nfunction doRename (src, dest, overwrite, isChangingCase) {\n if (isChangingCase) return rename(src, dest, overwrite)\n if (overwrite) {\n removeSync(dest)\n return rename(src, dest, overwrite)\n }\n if (fs.existsSync(dest)) throw new Error('dest already exists.')\n return rename(src, dest, overwrite)\n}\n\nfunction rename (src, dest, overwrite) {\n try {\n fs.renameSync(src, dest)\n } catch (err) {\n if (err.code !== 'EXDEV') throw err\n return moveAcrossDevice(src, dest, overwrite)\n }\n}\n\nfunction moveAcrossDevice (src, dest, overwrite) {\n const opts = {\n overwrite,\n errorOnExist: true,\n preserveTimestamps: true\n }\n copySync(src, dest, opts)\n return removeSync(src)\n}\n\nmodule.exports = moveSync\n","'use strict'\n\nconst fs = require('graceful-fs')\nconst path = require('path')\nconst copy = require('../copy').copy\nconst remove = require('../remove').remove\nconst mkdirp = require('../mkdirs').mkdirp\nconst pathExists = require('../path-exists').pathExists\nconst stat = require('../util/stat')\n\nfunction move (src, dest, opts, cb) {\n if (typeof opts === 'function') {\n cb = opts\n opts = {}\n }\n\n opts = opts || {}\n\n const overwrite = opts.overwrite || opts.clobber || false\n\n stat.checkPaths(src, dest, 'move', opts, (err, stats) => {\n if (err) return cb(err)\n const { srcStat, isChangingCase = false } = stats\n stat.checkParentPaths(src, srcStat, dest, 'move', err => {\n if (err) return cb(err)\n if (isParentRoot(dest)) return doRename(src, dest, overwrite, isChangingCase, cb)\n mkdirp(path.dirname(dest), err => {\n if (err) return cb(err)\n return doRename(src, dest, overwrite, isChangingCase, cb)\n })\n })\n })\n}\n\nfunction isParentRoot (dest) {\n const parent = path.dirname(dest)\n const parsedPath = path.parse(parent)\n return parsedPath.root === parent\n}\n\nfunction doRename (src, dest, overwrite, isChangingCase, cb) {\n if (isChangingCase) return rename(src, dest, overwrite, cb)\n if (overwrite) {\n return remove(dest, err => {\n if (err) return cb(err)\n return rename(src, dest, overwrite, cb)\n })\n }\n pathExists(dest, (err, destExists) => {\n if (err) return cb(err)\n if (destExists) return cb(new Error('dest already exists.'))\n return rename(src, dest, overwrite, cb)\n })\n}\n\nfunction rename (src, dest, overwrite, cb) {\n fs.rename(src, dest, err => {\n if (!err) return cb()\n if (err.code !== 'EXDEV') return cb(err)\n return moveAcrossDevice(src, dest, overwrite, cb)\n })\n}\n\nfunction moveAcrossDevice (src, dest, overwrite, cb) {\n const opts = {\n overwrite,\n errorOnExist: true,\n preserveTimestamps: true\n }\n copy(src, dest, opts, err => {\n if (err) return cb(err)\n return remove(src, cb)\n })\n}\n\nmodule.exports = move\n","'use strict'\n\nconst u = require('universalify').fromCallback\nconst fs = require('graceful-fs')\nconst path = require('path')\nconst mkdir = require('../mkdirs')\nconst pathExists = require('../path-exists').pathExists\n\nfunction outputFile (file, data, encoding, callback) {\n if (typeof encoding === 'function') {\n callback = encoding\n encoding = 'utf8'\n }\n\n const dir = path.dirname(file)\n pathExists(dir, (err, itDoes) => {\n if (err) return callback(err)\n if (itDoes) return fs.writeFile(file, data, encoding, callback)\n\n mkdir.mkdirs(dir, err => {\n if (err) return callback(err)\n\n fs.writeFile(file, data, encoding, callback)\n })\n })\n}\n\nfunction outputFileSync (file, ...args) {\n const dir = path.dirname(file)\n if (fs.existsSync(dir)) {\n return fs.writeFileSync(file, ...args)\n }\n mkdir.mkdirsSync(dir)\n fs.writeFileSync(file, ...args)\n}\n\nmodule.exports = {\n outputFile: u(outputFile),\n outputFileSync\n}\n","'use strict'\nconst u = require('universalify').fromPromise\nconst fs = require('../fs')\n\nfunction pathExists (path) {\n return fs.access(path).then(() => true).catch(() => false)\n}\n\nmodule.exports = {\n pathExists: u(pathExists),\n pathExistsSync: fs.existsSync\n}\n","'use strict'\n\nconst fs = require('graceful-fs')\nconst u = require('universalify').fromCallback\n\nfunction remove (path, callback) {\n fs.rm(path, { recursive: true, force: true }, callback)\n}\n\nfunction removeSync (path) {\n fs.rmSync(path, { recursive: true, force: true })\n}\n\nmodule.exports = {\n remove: u(remove),\n removeSync\n}\n","'use strict'\n\nconst fs = require('../fs')\nconst path = require('path')\nconst util = require('util')\n\nfunction getStats (src, dest, opts) {\n const statFunc = opts.dereference\n ? (file) => fs.stat(file, { bigint: true })\n : (file) => fs.lstat(file, { bigint: true })\n return Promise.all([\n statFunc(src),\n statFunc(dest).catch(err => {\n if (err.code === 'ENOENT') return null\n throw err\n })\n ]).then(([srcStat, destStat]) => ({ srcStat, destStat }))\n}\n\nfunction getStatsSync (src, dest, opts) {\n let destStat\n const statFunc = opts.dereference\n ? (file) => fs.statSync(file, { bigint: true })\n : (file) => fs.lstatSync(file, { bigint: true })\n const srcStat = statFunc(src)\n try {\n destStat = statFunc(dest)\n } catch (err) {\n if (err.code === 'ENOENT') return { srcStat, destStat: null }\n throw err\n }\n return { srcStat, destStat }\n}\n\nfunction checkPaths (src, dest, funcName, opts, cb) {\n util.callbackify(getStats)(src, dest, opts, (err, stats) => {\n if (err) return cb(err)\n const { srcStat, destStat } = stats\n\n if (destStat) {\n if (areIdentical(srcStat, destStat)) {\n const srcBaseName = path.basename(src)\n const destBaseName = path.basename(dest)\n if (funcName === 'move' &&\n srcBaseName !== destBaseName &&\n srcBaseName.toLowerCase() === destBaseName.toLowerCase()) {\n return cb(null, { srcStat, destStat, isChangingCase: true })\n }\n return cb(new Error('Source and destination must not be the same.'))\n }\n if (srcStat.isDirectory() && !destStat.isDirectory()) {\n return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))\n }\n if (!srcStat.isDirectory() && destStat.isDirectory()) {\n return cb(new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`))\n }\n }\n\n if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {\n return cb(new Error(errMsg(src, dest, funcName)))\n }\n return cb(null, { srcStat, destStat })\n })\n}\n\nfunction checkPathsSync (src, dest, funcName, opts) {\n const { srcStat, destStat } = getStatsSync(src, dest, opts)\n\n if (destStat) {\n if (areIdentical(srcStat, destStat)) {\n const srcBaseName = path.basename(src)\n const destBaseName = path.basename(dest)\n if (funcName === 'move' &&\n srcBaseName !== destBaseName &&\n srcBaseName.toLowerCase() === destBaseName.toLowerCase()) {\n return { srcStat, destStat, isChangingCase: true }\n }\n throw new Error('Source and destination must not be the same.')\n }\n if (srcStat.isDirectory() && !destStat.isDirectory()) {\n throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)\n }\n if (!srcStat.isDirectory() && destStat.isDirectory()) {\n throw new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`)\n }\n }\n\n if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {\n throw new Error(errMsg(src, dest, funcName))\n }\n return { srcStat, destStat }\n}\n\n// recursively check if dest parent is a subdirectory of src.\n// It works for all file types including symlinks since it\n// checks the src and dest inodes. It starts from the deepest\n// parent and stops once it reaches the src parent or the root path.\nfunction checkParentPaths (src, srcStat, dest, funcName, cb) {\n const srcParent = path.resolve(path.dirname(src))\n const destParent = path.resolve(path.dirname(dest))\n if (destParent === srcParent || destParent === path.parse(destParent).root) return cb()\n fs.stat(destParent, { bigint: true }, (err, destStat) => {\n if (err) {\n if (err.code === 'ENOENT') return cb()\n return cb(err)\n }\n if (areIdentical(srcStat, destStat)) {\n return cb(new Error(errMsg(src, dest, funcName)))\n }\n return checkParentPaths(src, srcStat, destParent, funcName, cb)\n })\n}\n\nfunction checkParentPathsSync (src, srcStat, dest, funcName) {\n const srcParent = path.resolve(path.dirname(src))\n const destParent = path.resolve(path.dirname(dest))\n if (destParent === srcParent || destParent === path.parse(destParent).root) return\n let destStat\n try {\n destStat = fs.statSync(destParent, { bigint: true })\n } catch (err) {\n if (err.code === 'ENOENT') return\n throw err\n }\n if (areIdentical(srcStat, destStat)) {\n throw new Error(errMsg(src, dest, funcName))\n }\n return checkParentPathsSync(src, srcStat, destParent, funcName)\n}\n\nfunction areIdentical (srcStat, destStat) {\n return destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev\n}\n\n// return true if dest is a subdir of src, otherwise false.\n// It only checks the path strings.\nfunction isSrcSubdir (src, dest) {\n const srcArr = path.resolve(src).split(path.sep).filter(i => i)\n const destArr = path.resolve(dest).split(path.sep).filter(i => i)\n return srcArr.reduce((acc, cur, i) => acc && destArr[i] === cur, true)\n}\n\nfunction errMsg (src, dest, funcName) {\n return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.`\n}\n\nmodule.exports = {\n checkPaths,\n checkPathsSync,\n checkParentPaths,\n checkParentPathsSync,\n isSrcSubdir,\n areIdentical\n}\n","'use strict'\n\nconst fs = require('graceful-fs')\n\nfunction utimesMillis (path, atime, mtime, callback) {\n // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)\n fs.open(path, 'r+', (err, fd) => {\n if (err) return callback(err)\n fs.futimes(fd, atime, mtime, futimesErr => {\n fs.close(fd, closeErr => {\n if (callback) callback(futimesErr || closeErr)\n })\n })\n })\n}\n\nfunction utimesMillisSync (path, atime, mtime) {\n const fd = fs.openSync(path, 'r+')\n fs.futimesSync(fd, atime, mtime)\n return fs.closeSync(fd)\n}\n\nmodule.exports = {\n utimesMillis,\n utimesMillisSync\n}\n","'use strict'\n\nmodule.exports = clone\n\nvar getPrototypeOf = Object.getPrototypeOf || function (obj) {\n return obj.__proto__\n}\n\nfunction clone (obj) {\n if (obj === null || typeof obj !== 'object')\n return obj\n\n if (obj instanceof Object)\n var copy = { __proto__: getPrototypeOf(obj) }\n else\n var copy = Object.create(null)\n\n Object.getOwnPropertyNames(obj).forEach(function (key) {\n Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key))\n })\n\n return copy\n}\n","var fs = require('fs')\nvar polyfills = require('./polyfills.js')\nvar legacy = require('./legacy-streams.js')\nvar clone = require('./clone.js')\n\nvar util = require('util')\n\n/* istanbul ignore next - node 0.x polyfill */\nvar gracefulQueue\nvar previousSymbol\n\n/* istanbul ignore else - node 0.x polyfill */\nif (typeof Symbol === 'function' && typeof Symbol.for === 'function') {\n gracefulQueue = Symbol.for('graceful-fs.queue')\n // This is used in testing by future versions\n previousSymbol = Symbol.for('graceful-fs.previous')\n} else {\n gracefulQueue = '___graceful-fs.queue'\n previousSymbol = '___graceful-fs.previous'\n}\n\nfunction noop () {}\n\nfunction publishQueue(context, queue) {\n Object.defineProperty(context, gracefulQueue, {\n get: function() {\n return queue\n }\n })\n}\n\nvar debug = noop\nif (util.debuglog)\n debug = util.debuglog('gfs4')\nelse if (/\\bgfs4\\b/i.test(process.env.NODE_DEBUG || ''))\n debug = function() {\n var m = util.format.apply(util, arguments)\n m = 'GFS4: ' + m.split(/\\n/).join('\\nGFS4: ')\n console.error(m)\n }\n\n// Once time initialization\nif (!fs[gracefulQueue]) {\n // This queue can be shared by multiple loaded instances\n var queue = global[gracefulQueue] || []\n publishQueue(fs, queue)\n\n // Patch fs.close/closeSync to shared queue version, because we need\n // to retry() whenever a close happens *anywhere* in the program.\n // This is essential when multiple graceful-fs instances are\n // in play at the same time.\n fs.close = (function (fs$close) {\n function close (fd, cb) {\n return fs$close.call(fs, fd, function (err) {\n // This function uses the graceful-fs shared queue\n if (!err) {\n resetQueue()\n }\n\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n })\n }\n\n Object.defineProperty(close, previousSymbol, {\n value: fs$close\n })\n return close\n })(fs.close)\n\n fs.closeSync = (function (fs$closeSync) {\n function closeSync (fd) {\n // This function uses the graceful-fs shared queue\n fs$closeSync.apply(fs, arguments)\n resetQueue()\n }\n\n Object.defineProperty(closeSync, previousSymbol, {\n value: fs$closeSync\n })\n return closeSync\n })(fs.closeSync)\n\n if (/\\bgfs4\\b/i.test(process.env.NODE_DEBUG || '')) {\n process.on('exit', function() {\n debug(fs[gracefulQueue])\n require('assert').equal(fs[gracefulQueue].length, 0)\n })\n }\n}\n\nif (!global[gracefulQueue]) {\n publishQueue(global, fs[gracefulQueue]);\n}\n\nmodule.exports = patch(clone(fs))\nif (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) {\n module.exports = patch(fs)\n fs.__patched = true;\n}\n\nfunction patch (fs) {\n // Everything that references the open() function needs to be in here\n polyfills(fs)\n fs.gracefulify = patch\n\n fs.createReadStream = createReadStream\n fs.createWriteStream = createWriteStream\n var fs$readFile = fs.readFile\n fs.readFile = readFile\n function readFile (path, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$readFile(path, options, cb)\n\n function go$readFile (path, options, cb, startTime) {\n return fs$readFile(path, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$readFile, [path, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$writeFile = fs.writeFile\n fs.writeFile = writeFile\n function writeFile (path, data, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$writeFile(path, data, options, cb)\n\n function go$writeFile (path, data, options, cb, startTime) {\n return fs$writeFile(path, data, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$writeFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$appendFile = fs.appendFile\n if (fs$appendFile)\n fs.appendFile = appendFile\n function appendFile (path, data, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$appendFile(path, data, options, cb)\n\n function go$appendFile (path, data, options, cb, startTime) {\n return fs$appendFile(path, data, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$appendFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$copyFile = fs.copyFile\n if (fs$copyFile)\n fs.copyFile = copyFile\n function copyFile (src, dest, flags, cb) {\n if (typeof flags === 'function') {\n cb = flags\n flags = 0\n }\n return go$copyFile(src, dest, flags, cb)\n\n function go$copyFile (src, dest, flags, cb, startTime) {\n return fs$copyFile(src, dest, flags, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$copyFile, [src, dest, flags, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$readdir = fs.readdir\n fs.readdir = readdir\n var noReaddirOptionVersions = /^v[0-5]\\./\n function readdir (path, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n var go$readdir = noReaddirOptionVersions.test(process.version)\n ? function go$readdir (path, options, cb, startTime) {\n return fs$readdir(path, fs$readdirCallback(\n path, options, cb, startTime\n ))\n }\n : function go$readdir (path, options, cb, startTime) {\n return fs$readdir(path, options, fs$readdirCallback(\n path, options, cb, startTime\n ))\n }\n\n return go$readdir(path, options, cb)\n\n function fs$readdirCallback (path, options, cb, startTime) {\n return function (err, files) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([\n go$readdir,\n [path, options, cb],\n err,\n startTime || Date.now(),\n Date.now()\n ])\n else {\n if (files && files.sort)\n files.sort()\n\n if (typeof cb === 'function')\n cb.call(this, err, files)\n }\n }\n }\n }\n\n if (process.version.substr(0, 4) === 'v0.8') {\n var legStreams = legacy(fs)\n ReadStream = legStreams.ReadStream\n WriteStream = legStreams.WriteStream\n }\n\n var fs$ReadStream = fs.ReadStream\n if (fs$ReadStream) {\n ReadStream.prototype = Object.create(fs$ReadStream.prototype)\n ReadStream.prototype.open = ReadStream$open\n }\n\n var fs$WriteStream = fs.WriteStream\n if (fs$WriteStream) {\n WriteStream.prototype = Object.create(fs$WriteStream.prototype)\n WriteStream.prototype.open = WriteStream$open\n }\n\n Object.defineProperty(fs, 'ReadStream', {\n get: function () {\n return ReadStream\n },\n set: function (val) {\n ReadStream = val\n },\n enumerable: true,\n configurable: true\n })\n Object.defineProperty(fs, 'WriteStream', {\n get: function () {\n return WriteStream\n },\n set: function (val) {\n WriteStream = val\n },\n enumerable: true,\n configurable: true\n })\n\n // legacy names\n var FileReadStream = ReadStream\n Object.defineProperty(fs, 'FileReadStream', {\n get: function () {\n return FileReadStream\n },\n set: function (val) {\n FileReadStream = val\n },\n enumerable: true,\n configurable: true\n })\n var FileWriteStream = WriteStream\n Object.defineProperty(fs, 'FileWriteStream', {\n get: function () {\n return FileWriteStream\n },\n set: function (val) {\n FileWriteStream = val\n },\n enumerable: true,\n configurable: true\n })\n\n function ReadStream (path, options) {\n if (this instanceof ReadStream)\n return fs$ReadStream.apply(this, arguments), this\n else\n return ReadStream.apply(Object.create(ReadStream.prototype), arguments)\n }\n\n function ReadStream$open () {\n var that = this\n open(that.path, that.flags, that.mode, function (err, fd) {\n if (err) {\n if (that.autoClose)\n that.destroy()\n\n that.emit('error', err)\n } else {\n that.fd = fd\n that.emit('open', fd)\n that.read()\n }\n })\n }\n\n function WriteStream (path, options) {\n if (this instanceof WriteStream)\n return fs$WriteStream.apply(this, arguments), this\n else\n return WriteStream.apply(Object.create(WriteStream.prototype), arguments)\n }\n\n function WriteStream$open () {\n var that = this\n open(that.path, that.flags, that.mode, function (err, fd) {\n if (err) {\n that.destroy()\n that.emit('error', err)\n } else {\n that.fd = fd\n that.emit('open', fd)\n }\n })\n }\n\n function createReadStream (path, options) {\n return new fs.ReadStream(path, options)\n }\n\n function createWriteStream (path, options) {\n return new fs.WriteStream(path, options)\n }\n\n var fs$open = fs.open\n fs.open = open\n function open (path, flags, mode, cb) {\n if (typeof mode === 'function')\n cb = mode, mode = null\n\n return go$open(path, flags, mode, cb)\n\n function go$open (path, flags, mode, cb, startTime) {\n return fs$open(path, flags, mode, function (err, fd) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$open, [path, flags, mode, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n return fs\n}\n\nfunction enqueue (elem) {\n debug('ENQUEUE', elem[0].name, elem[1])\n fs[gracefulQueue].push(elem)\n retry()\n}\n\n// keep track of the timeout between retry() calls\nvar retryTimer\n\n// reset the startTime and lastTime to now\n// this resets the start of the 60 second overall timeout as well as the\n// delay between attempts so that we'll retry these jobs sooner\nfunction resetQueue () {\n var now = Date.now()\n for (var i = 0; i < fs[gracefulQueue].length; ++i) {\n // entries that are only a length of 2 are from an older version, don't\n // bother modifying those since they'll be retried anyway.\n if (fs[gracefulQueue][i].length > 2) {\n fs[gracefulQueue][i][3] = now // startTime\n fs[gracefulQueue][i][4] = now // lastTime\n }\n }\n // call retry to make sure we're actively processing the queue\n retry()\n}\n\nfunction retry () {\n // clear the timer and remove it to help prevent unintended concurrency\n clearTimeout(retryTimer)\n retryTimer = undefined\n\n if (fs[gracefulQueue].length === 0)\n return\n\n var elem = fs[gracefulQueue].shift()\n var fn = elem[0]\n var args = elem[1]\n // these items may be unset if they were added by an older graceful-fs\n var err = elem[2]\n var startTime = elem[3]\n var lastTime = elem[4]\n\n // if we don't have a startTime we have no way of knowing if we've waited\n // long enough, so go ahead and retry this item now\n if (startTime === undefined) {\n debug('RETRY', fn.name, args)\n fn.apply(null, args)\n } else if (Date.now() - startTime >= 60000) {\n // it's been more than 60 seconds total, bail now\n debug('TIMEOUT', fn.name, args)\n var cb = args.pop()\n if (typeof cb === 'function')\n cb.call(null, err)\n } else {\n // the amount of time between the last attempt and right now\n var sinceAttempt = Date.now() - lastTime\n // the amount of time between when we first tried, and when we last tried\n // rounded up to at least 1\n var sinceStart = Math.max(lastTime - startTime, 1)\n // backoff. wait longer than the total time we've been retrying, but only\n // up to a maximum of 100ms\n var desiredDelay = Math.min(sinceStart * 1.2, 100)\n // it's been long enough since the last retry, do it again\n if (sinceAttempt >= desiredDelay) {\n debug('RETRY', fn.name, args)\n fn.apply(null, args.concat([startTime]))\n } else {\n // if we can't do this job yet, push it to the end of the queue\n // and let the next iteration check again\n fs[gracefulQueue].push(elem)\n }\n }\n\n // schedule our next run if one isn't already scheduled\n if (retryTimer === undefined) {\n retryTimer = setTimeout(retry, 0)\n }\n}\n","var Stream = require('stream').Stream\n\nmodule.exports = legacy\n\nfunction legacy (fs) {\n return {\n ReadStream: ReadStream,\n WriteStream: WriteStream\n }\n\n function ReadStream (path, options) {\n if (!(this instanceof ReadStream)) return new ReadStream(path, options);\n\n Stream.call(this);\n\n var self = this;\n\n this.path = path;\n this.fd = null;\n this.readable = true;\n this.paused = false;\n\n this.flags = 'r';\n this.mode = 438; /*=0666*/\n this.bufferSize = 64 * 1024;\n\n options = options || {};\n\n // Mixin options into this\n var keys = Object.keys(options);\n for (var index = 0, length = keys.length; index < length; index++) {\n var key = keys[index];\n this[key] = options[key];\n }\n\n if (this.encoding) this.setEncoding(this.encoding);\n\n if (this.start !== undefined) {\n if ('number' !== typeof this.start) {\n throw TypeError('start must be a Number');\n }\n if (this.end === undefined) {\n this.end = Infinity;\n } else if ('number' !== typeof this.end) {\n throw TypeError('end must be a Number');\n }\n\n if (this.start > this.end) {\n throw new Error('start must be <= end');\n }\n\n this.pos = this.start;\n }\n\n if (this.fd !== null) {\n process.nextTick(function() {\n self._read();\n });\n return;\n }\n\n fs.open(this.path, this.flags, this.mode, function (err, fd) {\n if (err) {\n self.emit('error', err);\n self.readable = false;\n return;\n }\n\n self.fd = fd;\n self.emit('open', fd);\n self._read();\n })\n }\n\n function WriteStream (path, options) {\n if (!(this instanceof WriteStream)) return new WriteStream(path, options);\n\n Stream.call(this);\n\n this.path = path;\n this.fd = null;\n this.writable = true;\n\n this.flags = 'w';\n this.encoding = 'binary';\n this.mode = 438; /*=0666*/\n this.bytesWritten = 0;\n\n options = options || {};\n\n // Mixin options into this\n var keys = Object.keys(options);\n for (var index = 0, length = keys.length; index < length; index++) {\n var key = keys[index];\n this[key] = options[key];\n }\n\n if (this.start !== undefined) {\n if ('number' !== typeof this.start) {\n throw TypeError('start must be a Number');\n }\n if (this.start < 0) {\n throw new Error('start must be >= zero');\n }\n\n this.pos = this.start;\n }\n\n this.busy = false;\n this._queue = [];\n\n if (this.fd === null) {\n this._open = fs.open;\n this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);\n this.flush();\n }\n }\n}\n","var constants = require('constants')\n\nvar origCwd = process.cwd\nvar cwd = null\n\nvar platform = process.env.GRACEFUL_FS_PLATFORM || process.platform\n\nprocess.cwd = function() {\n if (!cwd)\n cwd = origCwd.call(process)\n return cwd\n}\ntry {\n process.cwd()\n} catch (er) {}\n\n// This check is needed until node.js 12 is required\nif (typeof process.chdir === 'function') {\n var chdir = process.chdir\n process.chdir = function (d) {\n cwd = null\n chdir.call(process, d)\n }\n if (Object.setPrototypeOf) Object.setPrototypeOf(process.chdir, chdir)\n}\n\nmodule.exports = patch\n\nfunction patch (fs) {\n // (re-)implement some things that are known busted or missing.\n\n // lchmod, broken prior to 0.6.2\n // back-port the fix here.\n if (constants.hasOwnProperty('O_SYMLINK') &&\n process.version.match(/^v0\\.6\\.[0-2]|^v0\\.5\\./)) {\n patchLchmod(fs)\n }\n\n // lutimes implementation, or no-op\n if (!fs.lutimes) {\n patchLutimes(fs)\n }\n\n // https://github.com/isaacs/node-graceful-fs/issues/4\n // Chown should not fail on einval or eperm if non-root.\n // It should not fail on enosys ever, as this just indicates\n // that a fs doesn't support the intended operation.\n\n fs.chown = chownFix(fs.chown)\n fs.fchown = chownFix(fs.fchown)\n fs.lchown = chownFix(fs.lchown)\n\n fs.chmod = chmodFix(fs.chmod)\n fs.fchmod = chmodFix(fs.fchmod)\n fs.lchmod = chmodFix(fs.lchmod)\n\n fs.chownSync = chownFixSync(fs.chownSync)\n fs.fchownSync = chownFixSync(fs.fchownSync)\n fs.lchownSync = chownFixSync(fs.lchownSync)\n\n fs.chmodSync = chmodFixSync(fs.chmodSync)\n fs.fchmodSync = chmodFixSync(fs.fchmodSync)\n fs.lchmodSync = chmodFixSync(fs.lchmodSync)\n\n fs.stat = statFix(fs.stat)\n fs.fstat = statFix(fs.fstat)\n fs.lstat = statFix(fs.lstat)\n\n fs.statSync = statFixSync(fs.statSync)\n fs.fstatSync = statFixSync(fs.fstatSync)\n fs.lstatSync = statFixSync(fs.lstatSync)\n\n // if lchmod/lchown do not exist, then make them no-ops\n if (fs.chmod && !fs.lchmod) {\n fs.lchmod = function (path, mode, cb) {\n if (cb) process.nextTick(cb)\n }\n fs.lchmodSync = function () {}\n }\n if (fs.chown && !fs.lchown) {\n fs.lchown = function (path, uid, gid, cb) {\n if (cb) process.nextTick(cb)\n }\n fs.lchownSync = function () {}\n }\n\n // on Windows, A/V software can lock the directory, causing this\n // to fail with an EACCES or EPERM if the directory contains newly\n // created files. Try again on failure, for up to 60 seconds.\n\n // Set the timeout this long because some Windows Anti-Virus, such as Parity\n // bit9, may lock files for up to a minute, causing npm package install\n // failures. Also, take care to yield the scheduler. Windows scheduling gives\n // CPU to a busy looping process, which can cause the program causing the lock\n // contention to be starved of CPU by node, so the contention doesn't resolve.\n if (platform === \"win32\") {\n fs.rename = typeof fs.rename !== 'function' ? fs.rename\n : (function (fs$rename) {\n function rename (from, to, cb) {\n var start = Date.now()\n var backoff = 0;\n fs$rename(from, to, function CB (er) {\n if (er\n && (er.code === \"EACCES\" || er.code === \"EPERM\" || er.code === \"EBUSY\")\n && Date.now() - start < 60000) {\n setTimeout(function() {\n fs.stat(to, function (stater, st) {\n if (stater && stater.code === \"ENOENT\")\n fs$rename(from, to, CB);\n else\n cb(er)\n })\n }, backoff)\n if (backoff < 100)\n backoff += 10;\n return;\n }\n if (cb) cb(er)\n })\n }\n if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename)\n return rename\n })(fs.rename)\n }\n\n // if read() returns EAGAIN, then just try it again.\n fs.read = typeof fs.read !== 'function' ? fs.read\n : (function (fs$read) {\n function read (fd, buffer, offset, length, position, callback_) {\n var callback\n if (callback_ && typeof callback_ === 'function') {\n var eagCounter = 0\n callback = function (er, _, __) {\n if (er && er.code === 'EAGAIN' && eagCounter < 10) {\n eagCounter ++\n return fs$read.call(fs, fd, buffer, offset, length, position, callback)\n }\n callback_.apply(this, arguments)\n }\n }\n return fs$read.call(fs, fd, buffer, offset, length, position, callback)\n }\n\n // This ensures `util.promisify` works as it does for native `fs.read`.\n if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read)\n return read\n })(fs.read)\n\n fs.readSync = typeof fs.readSync !== 'function' ? fs.readSync\n : (function (fs$readSync) { return function (fd, buffer, offset, length, position) {\n var eagCounter = 0\n while (true) {\n try {\n return fs$readSync.call(fs, fd, buffer, offset, length, position)\n } catch (er) {\n if (er.code === 'EAGAIN' && eagCounter < 10) {\n eagCounter ++\n continue\n }\n throw er\n }\n }\n }})(fs.readSync)\n\n function patchLchmod (fs) {\n fs.lchmod = function (path, mode, callback) {\n fs.open( path\n , constants.O_WRONLY | constants.O_SYMLINK\n , mode\n , function (err, fd) {\n if (err) {\n if (callback) callback(err)\n return\n }\n // prefer to return the chmod error, if one occurs,\n // but still try to close, and report closing errors if they occur.\n fs.fchmod(fd, mode, function (err) {\n fs.close(fd, function(err2) {\n if (callback) callback(err || err2)\n })\n })\n })\n }\n\n fs.lchmodSync = function (path, mode) {\n var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)\n\n // prefer to return the chmod error, if one occurs,\n // but still try to close, and report closing errors if they occur.\n var threw = true\n var ret\n try {\n ret = fs.fchmodSync(fd, mode)\n threw = false\n } finally {\n if (threw) {\n try {\n fs.closeSync(fd)\n } catch (er) {}\n } else {\n fs.closeSync(fd)\n }\n }\n return ret\n }\n }\n\n function patchLutimes (fs) {\n if (constants.hasOwnProperty(\"O_SYMLINK\") && fs.futimes) {\n fs.lutimes = function (path, at, mt, cb) {\n fs.open(path, constants.O_SYMLINK, function (er, fd) {\n if (er) {\n if (cb) cb(er)\n return\n }\n fs.futimes(fd, at, mt, function (er) {\n fs.close(fd, function (er2) {\n if (cb) cb(er || er2)\n })\n })\n })\n }\n\n fs.lutimesSync = function (path, at, mt) {\n var fd = fs.openSync(path, constants.O_SYMLINK)\n var ret\n var threw = true\n try {\n ret = fs.futimesSync(fd, at, mt)\n threw = false\n } finally {\n if (threw) {\n try {\n fs.closeSync(fd)\n } catch (er) {}\n } else {\n fs.closeSync(fd)\n }\n }\n return ret\n }\n\n } else if (fs.futimes) {\n fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }\n fs.lutimesSync = function () {}\n }\n }\n\n function chmodFix (orig) {\n if (!orig) return orig\n return function (target, mode, cb) {\n return orig.call(fs, target, mode, function (er) {\n if (chownErOk(er)) er = null\n if (cb) cb.apply(this, arguments)\n })\n }\n }\n\n function chmodFixSync (orig) {\n if (!orig) return orig\n return function (target, mode) {\n try {\n return orig.call(fs, target, mode)\n } catch (er) {\n if (!chownErOk(er)) throw er\n }\n }\n }\n\n\n function chownFix (orig) {\n if (!orig) return orig\n return function (target, uid, gid, cb) {\n return orig.call(fs, target, uid, gid, function (er) {\n if (chownErOk(er)) er = null\n if (cb) cb.apply(this, arguments)\n })\n }\n }\n\n function chownFixSync (orig) {\n if (!orig) return orig\n return function (target, uid, gid) {\n try {\n return orig.call(fs, target, uid, gid)\n } catch (er) {\n if (!chownErOk(er)) throw er\n }\n }\n }\n\n function statFix (orig) {\n if (!orig) return orig\n // Older versions of Node erroneously returned signed integers for\n // uid + gid.\n return function (target, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = null\n }\n function callback (er, stats) {\n if (stats) {\n if (stats.uid < 0) stats.uid += 0x100000000\n if (stats.gid < 0) stats.gid += 0x100000000\n }\n if (cb) cb.apply(this, arguments)\n }\n return options ? orig.call(fs, target, options, callback)\n : orig.call(fs, target, callback)\n }\n }\n\n function statFixSync (orig) {\n if (!orig) return orig\n // Older versions of Node erroneously returned signed integers for\n // uid + gid.\n return function (target, options) {\n var stats = options ? orig.call(fs, target, options)\n : orig.call(fs, target)\n if (stats) {\n if (stats.uid < 0) stats.uid += 0x100000000\n if (stats.gid < 0) stats.gid += 0x100000000\n }\n return stats;\n }\n }\n\n // ENOSYS means that the fs doesn't support the op. Just ignore\n // that, because it doesn't matter.\n //\n // if there's no getuid, or if getuid() is something other\n // than 0, and the error is EINVAL or EPERM, then just ignore\n // it.\n //\n // This specific case is a silent failure in cp, install, tar,\n // and most other unix tools that manage permissions.\n //\n // When running as root, or if other types of errors are\n // encountered, then it's strict.\n function chownErOk (er) {\n if (!er)\n return true\n\n if (er.code === \"ENOSYS\")\n return true\n\n var nonroot = !process.getuid || process.getuid() !== 0\n if (nonroot) {\n if (er.code === \"EINVAL\" || er.code === \"EPERM\")\n return true\n }\n\n return false\n }\n}\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","/* eslint-disable yoda */\n'use strict';\n\nconst isFullwidthCodePoint = codePoint => {\n\tif (Number.isNaN(codePoint)) {\n\t\treturn false;\n\t}\n\n\t// Code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (\n\t\tcodePoint >= 0x1100 && (\n\t\t\tcodePoint <= 0x115F || // Hangul Jamo\n\t\t\tcodePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n\t\t\tcodePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET\n\t\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t\t(0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||\n\t\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t\t(0x3250 <= codePoint && codePoint <= 0x4DBF) ||\n\t\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t\t(0x4E00 <= codePoint && codePoint <= 0xA4C6) ||\n\t\t\t// Hangul Jamo Extended-A\n\t\t\t(0xA960 <= codePoint && codePoint <= 0xA97C) ||\n\t\t\t// Hangul Syllables\n\t\t\t(0xAC00 <= codePoint && codePoint <= 0xD7A3) ||\n\t\t\t// CJK Compatibility Ideographs\n\t\t\t(0xF900 <= codePoint && codePoint <= 0xFAFF) ||\n\t\t\t// Vertical Forms\n\t\t\t(0xFE10 <= codePoint && codePoint <= 0xFE19) ||\n\t\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t\t(0xFE30 <= codePoint && codePoint <= 0xFE6B) ||\n\t\t\t// Halfwidth and Fullwidth Forms\n\t\t\t(0xFF01 <= codePoint && codePoint <= 0xFF60) ||\n\t\t\t(0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||\n\t\t\t// Kana Supplement\n\t\t\t(0x1B000 <= codePoint && codePoint <= 0x1B001) ||\n\t\t\t// Enclosed Ideographic Supplement\n\t\t\t(0x1F200 <= codePoint && codePoint <= 0x1F251) ||\n\t\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t\t(0x20000 <= codePoint && codePoint <= 0x3FFFD)\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nmodule.exports = isFullwidthCodePoint;\nmodule.exports.default = isFullwidthCodePoint;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/*!\n * is-plain-object \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction isPlainObject(o) {\n var ctor,prot;\n\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n\nexports.isPlainObject = isPlainObject;\n","let _fs\ntry {\n _fs = require('graceful-fs')\n} catch (_) {\n _fs = require('fs')\n}\nconst universalify = require('universalify')\nconst { stringify, stripBom } = require('./utils')\n\nasync function _readFile (file, options = {}) {\n if (typeof options === 'string') {\n options = { encoding: options }\n }\n\n const fs = options.fs || _fs\n\n const shouldThrow = 'throws' in options ? options.throws : true\n\n let data = await universalify.fromCallback(fs.readFile)(file, options)\n\n data = stripBom(data)\n\n let obj\n try {\n obj = JSON.parse(data, options ? options.reviver : null)\n } catch (err) {\n if (shouldThrow) {\n err.message = `${file}: ${err.message}`\n throw err\n } else {\n return null\n }\n }\n\n return obj\n}\n\nconst readFile = universalify.fromPromise(_readFile)\n\nfunction readFileSync (file, options = {}) {\n if (typeof options === 'string') {\n options = { encoding: options }\n }\n\n const fs = options.fs || _fs\n\n const shouldThrow = 'throws' in options ? options.throws : true\n\n try {\n let content = fs.readFileSync(file, options)\n content = stripBom(content)\n return JSON.parse(content, options.reviver)\n } catch (err) {\n if (shouldThrow) {\n err.message = `${file}: ${err.message}`\n throw err\n } else {\n return null\n }\n }\n}\n\nasync function _writeFile (file, obj, options = {}) {\n const fs = options.fs || _fs\n\n const str = stringify(obj, options)\n\n await universalify.fromCallback(fs.writeFile)(file, str, options)\n}\n\nconst writeFile = universalify.fromPromise(_writeFile)\n\nfunction writeFileSync (file, obj, options = {}) {\n const fs = options.fs || _fs\n\n const str = stringify(obj, options)\n // not sure if fs.writeFileSync returns anything, but just in case\n return fs.writeFileSync(file, str, options)\n}\n\nconst jsonfile = {\n readFile,\n readFileSync,\n writeFile,\n writeFileSync\n}\n\nmodule.exports = jsonfile\n","function stringify (obj, { EOL = '\\n', finalEOL = true, replacer = null, spaces } = {}) {\n const EOF = finalEOL ? EOL : ''\n const str = JSON.stringify(obj, replacer, spaces)\n\n return str.replace(/\\n/g, EOL) + EOF\n}\n\nfunction stripBom (content) {\n // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified\n if (Buffer.isBuffer(content)) content = content.toString('utf8')\n return content.replace(/^\\uFEFF/, '')\n}\n\nmodule.exports = { stringify, stripBom }\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as default options for `_.truncate`. */\nvar DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]',\n symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nvar asciiSize = baseProperty('length');\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\n/**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\nfunction stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\n/**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nfunction unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n result++;\n }\n return result;\n}\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n return isObject(value) && objectToString.call(value) == regexpTag;\n}\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Truncates `string` if it's longer than the given maximum string length.\n * The last characters of the truncated string are replaced with the omission\n * string which defaults to \"...\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to truncate.\n * @param {Object} [options={}] The options object.\n * @param {number} [options.length=30] The maximum string length.\n * @param {string} [options.omission='...'] The string to indicate text is omitted.\n * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n * @returns {string} Returns the truncated string.\n * @example\n *\n * _.truncate('hi-diddly-ho there, neighborino');\n * // => 'hi-diddly-ho there, neighbo...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': ' '\n * });\n * // => 'hi-diddly-ho there,...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': /,? +/\n * });\n * // => 'hi-diddly-ho there...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'omission': ' [...]'\n * });\n * // => 'hi-diddly-ho there, neig [...]'\n */\nfunction truncate(string, options) {\n var length = DEFAULT_TRUNC_LENGTH,\n omission = DEFAULT_TRUNC_OMISSION;\n\n if (isObject(options)) {\n var separator = 'separator' in options ? options.separator : separator;\n length = 'length' in options ? toInteger(options.length) : length;\n omission = 'omission' in options ? baseToString(options.omission) : omission;\n }\n string = toString(string);\n\n var strLength = string.length;\n if (hasUnicode(string)) {\n var strSymbols = stringToArray(string);\n strLength = strSymbols.length;\n }\n if (length >= strLength) {\n return string;\n }\n var end = length - stringSize(omission);\n if (end < 1) {\n return omission;\n }\n var result = strSymbols\n ? castSlice(strSymbols, 0, end).join('')\n : string.slice(0, end);\n\n if (separator === undefined) {\n return result + omission;\n }\n if (strSymbols) {\n end += (result.length - end);\n }\n if (isRegExp(separator)) {\n if (string.slice(end).search(separator)) {\n var match,\n substring = result;\n\n if (!separator.global) {\n separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n }\n separator.lastIndex = 0;\n while ((match = separator.exec(substring))) {\n var newEnd = match.index;\n }\n result = result.slice(0, newEnd === undefined ? end : newEnd);\n }\n } else if (string.indexOf(baseToString(separator), end) != end) {\n var index = result.lastIndexOf(separator);\n if (index > -1) {\n result = result.slice(0, index);\n }\n }\n return result + omission;\n}\n\nmodule.exports = truncate;\n","var wrappy = require('wrappy')\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n Object.defineProperty(Function.prototype, 'once', {\n value: function () {\n return once(this)\n },\n configurable: true\n })\n\n Object.defineProperty(Function.prototype, 'onceStrict', {\n value: function () {\n return onceStrict(this)\n },\n configurable: true\n })\n})\n\nfunction once (fn) {\n var f = function () {\n if (f.called) return f.value\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n f.called = false\n return f\n}\n\nfunction onceStrict (fn) {\n var f = function () {\n if (f.called)\n throw new Error(f.onceError)\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n var name = fn.name || 'Function wrapped with `once`'\n f.onceError = name + \" shouldn't be called more than once\"\n f.called = false\n return f\n}\n","'use strict';\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\nconst astralRegex = require('astral-regex');\nconst ansiStyles = require('ansi-styles');\n\nconst ESCAPES = [\n\t'\\u001B',\n\t'\\u009B'\n];\n\nconst wrapAnsi = code => `${ESCAPES[0]}[${code}m`;\n\nconst checkAnsi = (ansiCodes, isEscapes, endAnsiCode) => {\n\tlet output = [];\n\tansiCodes = [...ansiCodes];\n\n\tfor (let ansiCode of ansiCodes) {\n\t\tconst ansiCodeOrigin = ansiCode;\n\t\tif (ansiCode.includes(';')) {\n\t\t\tansiCode = ansiCode.split(';')[0][0] + '0';\n\t\t}\n\n\t\tconst item = ansiStyles.codes.get(Number.parseInt(ansiCode, 10));\n\t\tif (item) {\n\t\t\tconst indexEscape = ansiCodes.indexOf(item.toString());\n\t\t\tif (indexEscape === -1) {\n\t\t\t\toutput.push(wrapAnsi(isEscapes ? item : ansiCodeOrigin));\n\t\t\t} else {\n\t\t\t\tansiCodes.splice(indexEscape, 1);\n\t\t\t}\n\t\t} else if (isEscapes) {\n\t\t\toutput.push(wrapAnsi(0));\n\t\t\tbreak;\n\t\t} else {\n\t\t\toutput.push(wrapAnsi(ansiCodeOrigin));\n\t\t}\n\t}\n\n\tif (isEscapes) {\n\t\toutput = output.filter((element, index) => output.indexOf(element) === index);\n\n\t\tif (endAnsiCode !== undefined) {\n\t\t\tconst fistEscapeCode = wrapAnsi(ansiStyles.codes.get(Number.parseInt(endAnsiCode, 10)));\n\t\t\toutput = output.reduce((current, next) => next === fistEscapeCode ? [next, ...current] : [...current, next], []);\n\t\t}\n\t}\n\n\treturn output.join('');\n};\n\nmodule.exports = (string, begin, end) => {\n\tconst characters = [...string];\n\tconst ansiCodes = [];\n\n\tlet stringEnd = typeof end === 'number' ? end : characters.length;\n\tlet isInsideEscape = false;\n\tlet ansiCode;\n\tlet visible = 0;\n\tlet output = '';\n\n\tfor (const [index, character] of characters.entries()) {\n\t\tlet leftEscape = false;\n\n\t\tif (ESCAPES.includes(character)) {\n\t\t\tconst code = /\\d[^m]*/.exec(string.slice(index, index + 18));\n\t\t\tansiCode = code && code.length > 0 ? code[0] : undefined;\n\n\t\t\tif (visible < stringEnd) {\n\t\t\t\tisInsideEscape = true;\n\n\t\t\t\tif (ansiCode !== undefined) {\n\t\t\t\t\tansiCodes.push(ansiCode);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (isInsideEscape && character === 'm') {\n\t\t\tisInsideEscape = false;\n\t\t\tleftEscape = true;\n\t\t}\n\n\t\tif (!isInsideEscape && !leftEscape) {\n\t\t\tvisible++;\n\t\t}\n\n\t\tif (!astralRegex({exact: true}).test(character) && isFullwidthCodePoint(character.codePointAt())) {\n\t\t\tvisible++;\n\n\t\t\tif (typeof end !== 'number') {\n\t\t\t\tstringEnd++;\n\t\t\t}\n\t\t}\n\n\t\tif (visible > begin && visible <= stringEnd) {\n\t\t\toutput += character;\n\t\t} else if (visible === begin && !isInsideEscape && ansiCode !== undefined) {\n\t\t\toutput = checkAnsi(ansiCodes);\n\t\t} else if (visible >= stringEnd) {\n\t\t\toutput += checkAnsi(ansiCodes, true, ansiCode);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn output;\n};\n","'use strict';\nconst stripAnsi = require('strip-ansi');\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\nconst emojiRegex = require('emoji-regex');\n\nconst stringWidth = string => {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = stripAnsi(string);\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = string.replace(emojiRegex(), ' ');\n\n\tlet width = 0;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst code = string.codePointAt(i);\n\n\t\t// Ignore control characters\n\t\tif (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (code >= 0x300 && code <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Surrogates\n\t\tif (code > 0xFFFF) {\n\t\t\ti++;\n\t\t}\n\n\t\twidth += isFullwidthCodePoint(code) ? 2 : 1;\n\t}\n\n\treturn width;\n};\n\nmodule.exports = stringWidth;\n// TODO: remove this in the next major version\nmodule.exports.default = stringWidth;\n","'use strict';\nconst ansiRegex = require('ansi-regex');\n\nmodule.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;\n","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\n// const octRegex = /0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\n//polyfill\nif (!Number.parseInt && window.parseInt) {\n Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n Number.parseFloat = window.parseFloat;\n}\n\n \nconst consider = {\n hex : true,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true\n //skipLike: /regex/\n};\n\nfunction toNumber(str, options = {}){\n // const options = Object.assign({}, consider);\n // if(opt.leadingZeros === false){\n // options.leadingZeros = false;\n // }else if(opt.hex === false){\n // options.hex = false;\n // }\n\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n // if(trimmedStr === \"0.0\") return 0;\n // else if(trimmedStr === \"+0.0\") return 0;\n // else if(trimmedStr === \"-0.0\") return -0;\n\n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n // } else if (options.parseOct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n }else{\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n if(match){\n const sign = match[1];\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n //trim ending zeros for floating number\n \n const eNotation = match[4] || match[6];\n if(!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== \".\") return str; //-0123\n else if(!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== \".\") return str; //0123\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const numStr = \"\" + num;\n if(numStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(eNotation){ //given number has enotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n // const decimalPart = match[5].substr(1);\n // const intPart = trimmedStr.substr(0,trimmedStr.indexOf(\".\"));\n\n \n // const p = numStr.indexOf(\".\");\n // const givenIntPart = numStr.substr(0,p);\n // const givenDecPart = numStr.substr(p+1);\n if(numStr === \"0\" && (numTrimmedByZeros === \"\") ) return num; //0.0\n else if(numStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( sign && numStr === \"-\"+numTrimmedByZeros) return num;\n else return str;\n }\n \n if(leadingZeros){\n // if(numTrimmedByZeros === numStr){\n // if(options.leadingZeros) return num;\n // else return str;\n // }else return str;\n if(numTrimmedByZeros === numStr) return num;\n else if(sign+numTrimmedByZeros === numStr) return num;\n else return str;\n }\n\n if(trimmedStr === numStr) return num;\n else if(trimmedStr === sign+numStr) return num;\n // else{\n // //number with +/- sign\n // trimmedStr.test(/[-+][0-9]);\n\n // }\n return str;\n }\n // else if(!eNotation && trimmedStr && trimmedStr !== Number(trimmedStr) ) return str;\n \n }else{ //non-numeric string\n return str;\n }\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n if(numStr && numStr.indexOf(\".\") !== -1){//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if(numStr === \".\") numStr = \"0\";\n else if(numStr[0] === \".\") numStr = \"0\"+numStr;\n else if(numStr[numStr.length-1] === \".\") numStr = numStr.substr(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\nmodule.exports = toNumber\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.alignVerticalRangeContent = exports.wrapRangeContent = void 0;\nconst string_width_1 = __importDefault(require(\"string-width\"));\nconst alignString_1 = require(\"./alignString\");\nconst mapDataUsingRowHeights_1 = require(\"./mapDataUsingRowHeights\");\nconst padTableData_1 = require(\"./padTableData\");\nconst truncateTableData_1 = require(\"./truncateTableData\");\nconst utils_1 = require(\"./utils\");\nconst wrapCell_1 = require(\"./wrapCell\");\n/**\n * Fill content into all cells in range in order to calculate total height\n */\nconst wrapRangeContent = (rangeConfig, rangeWidth, context) => {\n const { topLeft, paddingRight, paddingLeft, truncate, wrapWord, alignment } = rangeConfig;\n const originalContent = context.rows[topLeft.row][topLeft.col];\n const contentWidth = rangeWidth - paddingLeft - paddingRight;\n return (0, wrapCell_1.wrapCell)((0, truncateTableData_1.truncateString)(originalContent, truncate), contentWidth, wrapWord).map((line) => {\n const alignedLine = (0, alignString_1.alignString)(line, contentWidth, alignment);\n return (0, padTableData_1.padString)(alignedLine, paddingLeft, paddingRight);\n });\n};\nexports.wrapRangeContent = wrapRangeContent;\nconst alignVerticalRangeContent = (range, content, context) => {\n const { rows, drawHorizontalLine, rowHeights } = context;\n const { topLeft, bottomRight, verticalAlignment } = range;\n // They are empty before calculateRowHeights function run\n if (rowHeights.length === 0) {\n return [];\n }\n const totalCellHeight = (0, utils_1.sumArray)(rowHeights.slice(topLeft.row, bottomRight.row + 1));\n const totalBorderHeight = bottomRight.row - topLeft.row;\n const hiddenHorizontalBorderCount = (0, utils_1.sequence)(topLeft.row + 1, bottomRight.row).filter((horizontalBorderIndex) => {\n return !drawHorizontalLine(horizontalBorderIndex, rows.length);\n }).length;\n const availableRangeHeight = totalCellHeight + totalBorderHeight - hiddenHorizontalBorderCount;\n return (0, mapDataUsingRowHeights_1.padCellVertically)(content, availableRangeHeight, verticalAlignment).map((line) => {\n if (line.length === 0) {\n return ' '.repeat((0, string_width_1.default)(content[0]));\n }\n return line;\n });\n};\nexports.alignVerticalRangeContent = alignVerticalRangeContent;\n//# sourceMappingURL=alignSpanningCell.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.alignString = void 0;\nconst string_width_1 = __importDefault(require(\"string-width\"));\nconst utils_1 = require(\"./utils\");\nconst alignLeft = (subject, width) => {\n return subject + ' '.repeat(width);\n};\nconst alignRight = (subject, width) => {\n return ' '.repeat(width) + subject;\n};\nconst alignCenter = (subject, width) => {\n return ' '.repeat(Math.floor(width / 2)) + subject + ' '.repeat(Math.ceil(width / 2));\n};\nconst alignJustify = (subject, width) => {\n const spaceSequenceCount = (0, utils_1.countSpaceSequence)(subject);\n if (spaceSequenceCount === 0) {\n return alignLeft(subject, width);\n }\n const addingSpaces = (0, utils_1.distributeUnevenly)(width, spaceSequenceCount);\n if (Math.max(...addingSpaces) > 3) {\n return alignLeft(subject, width);\n }\n let spaceSequenceIndex = 0;\n return subject.replace(/\\s+/g, (groupSpace) => {\n return groupSpace + ' '.repeat(addingSpaces[spaceSequenceIndex++]);\n });\n};\n/**\n * Pads a string to the left and/or right to position the subject\n * text in a desired alignment within a container.\n */\nconst alignString = (subject, containerWidth, alignment) => {\n const subjectWidth = (0, string_width_1.default)(subject);\n if (subjectWidth === containerWidth) {\n return subject;\n }\n if (subjectWidth > containerWidth) {\n throw new Error('Subject parameter value width cannot be greater than the container width.');\n }\n if (subjectWidth === 0) {\n return ' '.repeat(containerWidth);\n }\n const availableWidth = containerWidth - subjectWidth;\n if (alignment === 'left') {\n return alignLeft(subject, availableWidth);\n }\n if (alignment === 'right') {\n return alignRight(subject, availableWidth);\n }\n if (alignment === 'justify') {\n return alignJustify(subject, availableWidth);\n }\n return alignCenter(subject, availableWidth);\n};\nexports.alignString = alignString;\n//# sourceMappingURL=alignString.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.alignTableData = void 0;\nconst alignString_1 = require(\"./alignString\");\nconst alignTableData = (rows, config) => {\n return rows.map((row, rowIndex) => {\n return row.map((cell, cellIndex) => {\n var _a;\n const { width, alignment } = config.columns[cellIndex];\n const containingRange = (_a = config.spanningCellManager) === null || _a === void 0 ? void 0 : _a.getContainingRange({ col: cellIndex,\n row: rowIndex }, { mapped: true });\n if (containingRange) {\n return cell;\n }\n return (0, alignString_1.alignString)(cell, width, alignment);\n });\n });\n};\nexports.alignTableData = alignTableData;\n//# sourceMappingURL=alignTableData.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateCellHeight = void 0;\nconst wrapCell_1 = require(\"./wrapCell\");\n/**\n * Calculates height of cell content in regard to its width and word wrapping.\n */\nconst calculateCellHeight = (value, columnWidth, useWrapWord = false) => {\n return (0, wrapCell_1.wrapCell)(value, columnWidth, useWrapWord).length;\n};\nexports.calculateCellHeight = calculateCellHeight;\n//# sourceMappingURL=calculateCellHeight.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateMaximumColumnWidths = exports.calculateMaximumCellWidth = void 0;\nconst string_width_1 = __importDefault(require(\"string-width\"));\nconst utils_1 = require(\"./utils\");\nconst calculateMaximumCellWidth = (cell) => {\n return Math.max(...cell.split('\\n').map(string_width_1.default));\n};\nexports.calculateMaximumCellWidth = calculateMaximumCellWidth;\n/**\n * Produces an array of values that describe the largest value length (width) in every column.\n */\nconst calculateMaximumColumnWidths = (rows, spanningCellConfigs = []) => {\n const columnWidths = new Array(rows[0].length).fill(0);\n const rangeCoordinates = spanningCellConfigs.map(utils_1.calculateRangeCoordinate);\n const isSpanningCell = (rowIndex, columnIndex) => {\n return rangeCoordinates.some((rangeCoordinate) => {\n return (0, utils_1.isCellInRange)({ col: columnIndex,\n row: rowIndex }, rangeCoordinate);\n });\n };\n rows.forEach((row, rowIndex) => {\n row.forEach((cell, cellIndex) => {\n if (isSpanningCell(rowIndex, cellIndex)) {\n return;\n }\n columnWidths[cellIndex] = Math.max(columnWidths[cellIndex], (0, exports.calculateMaximumCellWidth)(cell));\n });\n });\n return columnWidths;\n};\nexports.calculateMaximumColumnWidths = calculateMaximumColumnWidths;\n//# sourceMappingURL=calculateMaximumColumnWidths.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateOutputColumnWidths = void 0;\nconst calculateOutputColumnWidths = (config) => {\n return config.columns.map((col) => {\n return col.paddingLeft + col.width + col.paddingRight;\n });\n};\nexports.calculateOutputColumnWidths = calculateOutputColumnWidths;\n//# sourceMappingURL=calculateOutputColumnWidths.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateRowHeights = void 0;\nconst calculateCellHeight_1 = require(\"./calculateCellHeight\");\nconst utils_1 = require(\"./utils\");\n/**\n * Produces an array of values that describe the largest value length (height) in every row.\n */\nconst calculateRowHeights = (rows, config) => {\n const rowHeights = [];\n for (const [rowIndex, row] of rows.entries()) {\n let rowHeight = 1;\n row.forEach((cell, cellIndex) => {\n var _a;\n const containingRange = (_a = config.spanningCellManager) === null || _a === void 0 ? void 0 : _a.getContainingRange({ col: cellIndex,\n row: rowIndex });\n if (!containingRange) {\n const cellHeight = (0, calculateCellHeight_1.calculateCellHeight)(cell, config.columns[cellIndex].width, config.columns[cellIndex].wrapWord);\n rowHeight = Math.max(rowHeight, cellHeight);\n return;\n }\n const { topLeft, bottomRight, height } = containingRange;\n // bottom-most cell of a range needs to contain all remain lines of spanning cells\n if (rowIndex === bottomRight.row) {\n const totalOccupiedSpanningCellHeight = (0, utils_1.sumArray)(rowHeights.slice(topLeft.row));\n const totalHorizontalBorderHeight = bottomRight.row - topLeft.row;\n const totalHiddenHorizontalBorderHeight = (0, utils_1.sequence)(topLeft.row + 1, bottomRight.row).filter((horizontalBorderIndex) => {\n var _a;\n /* istanbul ignore next */\n return !((_a = config.drawHorizontalLine) === null || _a === void 0 ? void 0 : _a.call(config, horizontalBorderIndex, rows.length));\n }).length;\n const cellHeight = height - totalOccupiedSpanningCellHeight - totalHorizontalBorderHeight + totalHiddenHorizontalBorderHeight;\n rowHeight = Math.max(rowHeight, cellHeight);\n }\n // otherwise, just depend on other sibling cell heights in the row\n });\n rowHeights.push(rowHeight);\n }\n return rowHeights;\n};\nexports.calculateRowHeights = calculateRowHeights;\n//# sourceMappingURL=calculateRowHeights.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateSpanningCellWidth = void 0;\nconst utils_1 = require(\"./utils\");\nconst calculateSpanningCellWidth = (rangeConfig, dependencies) => {\n const { columnsConfig, drawVerticalLine } = dependencies;\n const { topLeft, bottomRight } = rangeConfig;\n const totalWidth = (0, utils_1.sumArray)(columnsConfig.slice(topLeft.col, bottomRight.col + 1).map(({ width }) => {\n return width;\n }));\n const totalPadding = topLeft.col === bottomRight.col ?\n columnsConfig[topLeft.col].paddingRight +\n columnsConfig[bottomRight.col].paddingLeft :\n (0, utils_1.sumArray)(columnsConfig\n .slice(topLeft.col, bottomRight.col + 1)\n .map(({ paddingLeft, paddingRight }) => {\n return paddingLeft + paddingRight;\n }));\n const totalBorderWidths = bottomRight.col - topLeft.col;\n const totalHiddenVerticalBorders = (0, utils_1.sequence)(topLeft.col + 1, bottomRight.col).filter((verticalBorderIndex) => {\n return !drawVerticalLine(verticalBorderIndex, columnsConfig.length);\n }).length;\n return totalWidth + totalPadding + totalBorderWidths - totalHiddenVerticalBorders;\n};\nexports.calculateSpanningCellWidth = calculateSpanningCellWidth;\n//# sourceMappingURL=calculateSpanningCellWidth.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createStream = void 0;\nconst alignTableData_1 = require(\"./alignTableData\");\nconst calculateRowHeights_1 = require(\"./calculateRowHeights\");\nconst drawBorder_1 = require(\"./drawBorder\");\nconst drawRow_1 = require(\"./drawRow\");\nconst makeStreamConfig_1 = require(\"./makeStreamConfig\");\nconst mapDataUsingRowHeights_1 = require(\"./mapDataUsingRowHeights\");\nconst padTableData_1 = require(\"./padTableData\");\nconst stringifyTableData_1 = require(\"./stringifyTableData\");\nconst truncateTableData_1 = require(\"./truncateTableData\");\nconst utils_1 = require(\"./utils\");\nconst prepareData = (data, config) => {\n let rows = (0, stringifyTableData_1.stringifyTableData)(data);\n rows = (0, truncateTableData_1.truncateTableData)(rows, (0, utils_1.extractTruncates)(config));\n const rowHeights = (0, calculateRowHeights_1.calculateRowHeights)(rows, config);\n rows = (0, mapDataUsingRowHeights_1.mapDataUsingRowHeights)(rows, rowHeights, config);\n rows = (0, alignTableData_1.alignTableData)(rows, config);\n rows = (0, padTableData_1.padTableData)(rows, config);\n return rows;\n};\nconst create = (row, columnWidths, config) => {\n const rows = prepareData([row], config);\n const body = rows.map((literalRow) => {\n return (0, drawRow_1.drawRow)(literalRow, config);\n }).join('');\n let output;\n output = '';\n output += (0, drawBorder_1.drawBorderTop)(columnWidths, config);\n output += body;\n output += (0, drawBorder_1.drawBorderBottom)(columnWidths, config);\n output = output.trimEnd();\n process.stdout.write(output);\n};\nconst append = (row, columnWidths, config) => {\n const rows = prepareData([row], config);\n const body = rows.map((literalRow) => {\n return (0, drawRow_1.drawRow)(literalRow, config);\n }).join('');\n let output = '';\n const bottom = (0, drawBorder_1.drawBorderBottom)(columnWidths, config);\n if (bottom !== '\\n') {\n output = '\\r\\u001B[K';\n }\n output += (0, drawBorder_1.drawBorderJoin)(columnWidths, config);\n output += body;\n output += bottom;\n output = output.trimEnd();\n process.stdout.write(output);\n};\nconst createStream = (userConfig) => {\n const config = (0, makeStreamConfig_1.makeStreamConfig)(userConfig);\n const columnWidths = Object.values(config.columns).map((column) => {\n return column.width + column.paddingLeft + column.paddingRight;\n });\n let empty = true;\n return {\n write: (row) => {\n if (row.length !== config.columnCount) {\n throw new Error('Row cell count does not match the config.columnCount.');\n }\n if (empty) {\n empty = false;\n create(row, columnWidths, config);\n }\n else {\n append(row, columnWidths, config);\n }\n },\n };\n};\nexports.createStream = createStream;\n//# sourceMappingURL=createStream.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createTableBorderGetter = exports.drawBorderBottom = exports.drawBorderJoin = exports.drawBorderTop = exports.drawBorder = exports.createSeparatorGetter = exports.drawBorderSegments = void 0;\nconst drawContent_1 = require(\"./drawContent\");\nconst drawBorderSegments = (columnWidths, parameters) => {\n const { separator, horizontalBorderIndex, spanningCellManager } = parameters;\n return columnWidths.map((columnWidth, columnIndex) => {\n const normalSegment = separator.body.repeat(columnWidth);\n if (horizontalBorderIndex === undefined) {\n return normalSegment;\n }\n /* istanbul ignore next */\n const range = spanningCellManager === null || spanningCellManager === void 0 ? void 0 : spanningCellManager.getContainingRange({ col: columnIndex,\n row: horizontalBorderIndex });\n if (!range) {\n return normalSegment;\n }\n const { topLeft } = range;\n // draw border segments as usual for top border of spanning cell\n if (horizontalBorderIndex === topLeft.row) {\n return normalSegment;\n }\n // if for first column/row of spanning cell, just skip\n if (columnIndex !== topLeft.col) {\n return '';\n }\n return range.extractBorderContent(horizontalBorderIndex);\n });\n};\nexports.drawBorderSegments = drawBorderSegments;\nconst createSeparatorGetter = (dependencies) => {\n const { separator, spanningCellManager, horizontalBorderIndex, rowCount } = dependencies;\n // eslint-disable-next-line complexity\n return (verticalBorderIndex, columnCount) => {\n const inSameRange = spanningCellManager === null || spanningCellManager === void 0 ? void 0 : spanningCellManager.inSameRange;\n if (horizontalBorderIndex !== undefined && inSameRange) {\n const topCell = { col: verticalBorderIndex,\n row: horizontalBorderIndex - 1 };\n const leftCell = { col: verticalBorderIndex - 1,\n row: horizontalBorderIndex };\n const oppositeCell = { col: verticalBorderIndex - 1,\n row: horizontalBorderIndex - 1 };\n const currentCell = { col: verticalBorderIndex,\n row: horizontalBorderIndex };\n const pairs = [\n [oppositeCell, topCell],\n [topCell, currentCell],\n [currentCell, leftCell],\n [leftCell, oppositeCell],\n ];\n // left side of horizontal border\n if (verticalBorderIndex === 0) {\n if (inSameRange(currentCell, topCell) && separator.bodyJoinOuter) {\n return separator.bodyJoinOuter;\n }\n return separator.left;\n }\n // right side of horizontal border\n if (verticalBorderIndex === columnCount) {\n if (inSameRange(oppositeCell, leftCell) && separator.bodyJoinOuter) {\n return separator.bodyJoinOuter;\n }\n return separator.right;\n }\n // top horizontal border\n if (horizontalBorderIndex === 0) {\n if (inSameRange(currentCell, leftCell)) {\n return separator.body;\n }\n return separator.join;\n }\n // bottom horizontal border\n if (horizontalBorderIndex === rowCount) {\n if (inSameRange(topCell, oppositeCell)) {\n return separator.body;\n }\n return separator.join;\n }\n const sameRangeCount = pairs.map((pair) => {\n return inSameRange(...pair);\n }).filter(Boolean).length;\n // four cells are belongs to different spanning cells\n if (sameRangeCount === 0) {\n return separator.join;\n }\n // belong to one spanning cell\n if (sameRangeCount === 4) {\n return '';\n }\n // belongs to two spanning cell\n if (sameRangeCount === 2) {\n if (inSameRange(...pairs[1]) && inSameRange(...pairs[3]) && separator.bodyJoinInner) {\n return separator.bodyJoinInner;\n }\n return separator.body;\n }\n /* istanbul ignore next */\n if (sameRangeCount === 1) {\n if (!separator.joinRight || !separator.joinLeft || !separator.joinUp || !separator.joinDown) {\n throw new Error(`Can not get border separator for position [${horizontalBorderIndex}, ${verticalBorderIndex}]`);\n }\n if (inSameRange(...pairs[0])) {\n return separator.joinDown;\n }\n if (inSameRange(...pairs[1])) {\n return separator.joinLeft;\n }\n if (inSameRange(...pairs[2])) {\n return separator.joinUp;\n }\n return separator.joinRight;\n }\n /* istanbul ignore next */\n throw new Error('Invalid case');\n }\n if (verticalBorderIndex === 0) {\n return separator.left;\n }\n if (verticalBorderIndex === columnCount) {\n return separator.right;\n }\n return separator.join;\n };\n};\nexports.createSeparatorGetter = createSeparatorGetter;\nconst drawBorder = (columnWidths, parameters) => {\n const borderSegments = (0, exports.drawBorderSegments)(columnWidths, parameters);\n const { drawVerticalLine, horizontalBorderIndex, spanningCellManager } = parameters;\n return (0, drawContent_1.drawContent)({\n contents: borderSegments,\n drawSeparator: drawVerticalLine,\n elementType: 'border',\n rowIndex: horizontalBorderIndex,\n separatorGetter: (0, exports.createSeparatorGetter)(parameters),\n spanningCellManager,\n }) + '\\n';\n};\nexports.drawBorder = drawBorder;\nconst drawBorderTop = (columnWidths, parameters) => {\n const { border } = parameters;\n const result = (0, exports.drawBorder)(columnWidths, {\n ...parameters,\n separator: {\n body: border.topBody,\n join: border.topJoin,\n left: border.topLeft,\n right: border.topRight,\n },\n });\n if (result === '\\n') {\n return '';\n }\n return result;\n};\nexports.drawBorderTop = drawBorderTop;\nconst drawBorderJoin = (columnWidths, parameters) => {\n const { border } = parameters;\n return (0, exports.drawBorder)(columnWidths, {\n ...parameters,\n separator: {\n body: border.joinBody,\n bodyJoinInner: border.bodyJoin,\n bodyJoinOuter: border.bodyLeft,\n join: border.joinJoin,\n joinDown: border.joinMiddleDown,\n joinLeft: border.joinMiddleLeft,\n joinRight: border.joinMiddleRight,\n joinUp: border.joinMiddleUp,\n left: border.joinLeft,\n right: border.joinRight,\n },\n });\n};\nexports.drawBorderJoin = drawBorderJoin;\nconst drawBorderBottom = (columnWidths, parameters) => {\n const { border } = parameters;\n return (0, exports.drawBorder)(columnWidths, {\n ...parameters,\n separator: {\n body: border.bottomBody,\n join: border.bottomJoin,\n left: border.bottomLeft,\n right: border.bottomRight,\n },\n });\n};\nexports.drawBorderBottom = drawBorderBottom;\nconst createTableBorderGetter = (columnWidths, parameters) => {\n return (index, size) => {\n const drawBorderParameters = { ...parameters,\n horizontalBorderIndex: index };\n if (index === 0) {\n return (0, exports.drawBorderTop)(columnWidths, drawBorderParameters);\n }\n else if (index === size) {\n return (0, exports.drawBorderBottom)(columnWidths, drawBorderParameters);\n }\n return (0, exports.drawBorderJoin)(columnWidths, drawBorderParameters);\n };\n};\nexports.createTableBorderGetter = createTableBorderGetter;\n//# sourceMappingURL=drawBorder.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.drawContent = void 0;\nconst drawContent = (parameters) => {\n const { contents, separatorGetter, drawSeparator, spanningCellManager, rowIndex, elementType } = parameters;\n const contentSize = contents.length;\n const result = [];\n if (drawSeparator(0, contentSize)) {\n result.push(separatorGetter(0, contentSize));\n }\n contents.forEach((content, contentIndex) => {\n if (!elementType || elementType === 'border' || elementType === 'row') {\n result.push(content);\n }\n if (elementType === 'cell' && rowIndex === undefined) {\n result.push(content);\n }\n if (elementType === 'cell' && rowIndex !== undefined) {\n /* istanbul ignore next */\n const containingRange = spanningCellManager === null || spanningCellManager === void 0 ? void 0 : spanningCellManager.getContainingRange({ col: contentIndex,\n row: rowIndex });\n // when drawing content row, just add a cell when it is a normal cell\n // or belongs to first column of spanning cell\n if (!containingRange || contentIndex === containingRange.topLeft.col) {\n result.push(content);\n }\n }\n // Only append the middle separator if the content is not the last\n if (contentIndex + 1 < contentSize && drawSeparator(contentIndex + 1, contentSize)) {\n const separator = separatorGetter(contentIndex + 1, contentSize);\n if (elementType === 'cell' && rowIndex !== undefined) {\n const currentCell = { col: contentIndex + 1,\n row: rowIndex };\n /* istanbul ignore next */\n const containingRange = spanningCellManager === null || spanningCellManager === void 0 ? void 0 : spanningCellManager.getContainingRange(currentCell);\n if (!containingRange || containingRange.topLeft.col === currentCell.col) {\n result.push(separator);\n }\n }\n else {\n result.push(separator);\n }\n }\n });\n if (drawSeparator(contentSize, contentSize)) {\n result.push(separatorGetter(contentSize, contentSize));\n }\n return result.join('');\n};\nexports.drawContent = drawContent;\n//# sourceMappingURL=drawContent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.drawRow = void 0;\nconst drawContent_1 = require(\"./drawContent\");\nconst drawRow = (row, config) => {\n const { border, drawVerticalLine, rowIndex, spanningCellManager } = config;\n return (0, drawContent_1.drawContent)({\n contents: row,\n drawSeparator: drawVerticalLine,\n elementType: 'cell',\n rowIndex,\n separatorGetter: (index, columnCount) => {\n if (index === 0) {\n return border.bodyLeft;\n }\n if (index === columnCount) {\n return border.bodyRight;\n }\n return border.bodyJoin;\n },\n spanningCellManager,\n }) + '\\n';\n};\nexports.drawRow = drawRow;\n//# sourceMappingURL=drawRow.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.drawTable = void 0;\nconst drawBorder_1 = require(\"./drawBorder\");\nconst drawContent_1 = require(\"./drawContent\");\nconst drawRow_1 = require(\"./drawRow\");\nconst utils_1 = require(\"./utils\");\nconst drawTable = (rows, outputColumnWidths, rowHeights, config) => {\n const { drawHorizontalLine, singleLine, } = config;\n const contents = (0, utils_1.groupBySizes)(rows, rowHeights).map((group, groupIndex) => {\n return group.map((row) => {\n return (0, drawRow_1.drawRow)(row, { ...config,\n rowIndex: groupIndex });\n }).join('');\n });\n return (0, drawContent_1.drawContent)({ contents,\n drawSeparator: (index, size) => {\n // Top/bottom border\n if (index === 0 || index === size) {\n return drawHorizontalLine(index, size);\n }\n return !singleLine && drawHorizontalLine(index, size);\n },\n elementType: 'row',\n rowIndex: -1,\n separatorGetter: (0, drawBorder_1.createTableBorderGetter)(outputColumnWidths, { ...config,\n rowCount: contents.length }),\n spanningCellManager: config.spanningCellManager });\n};\nexports.drawTable = drawTable;\n//# sourceMappingURL=drawTable.js.map","\"use strict\";\nexports[\"config.json\"] = validate43;\nconst schema13 = {\n \"$id\": \"config.json\",\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"border\": {\n \"$ref\": \"shared.json#/definitions/borders\"\n },\n \"header\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\"\n },\n \"alignment\": {\n \"$ref\": \"shared.json#/definitions/alignment\"\n },\n \"wrapWord\": {\n \"type\": \"boolean\"\n },\n \"truncate\": {\n \"type\": \"integer\"\n },\n \"paddingLeft\": {\n \"type\": \"integer\"\n },\n \"paddingRight\": {\n \"type\": \"integer\"\n }\n },\n \"required\": [\"content\"],\n \"additionalProperties\": false\n },\n \"columns\": {\n \"$ref\": \"shared.json#/definitions/columns\"\n },\n \"columnDefault\": {\n \"$ref\": \"shared.json#/definitions/column\"\n },\n \"drawVerticalLine\": {\n \"typeof\": \"function\"\n },\n \"drawHorizontalLine\": {\n \"typeof\": \"function\"\n },\n \"singleLine\": {\n \"typeof\": \"boolean\"\n },\n \"spanningCells\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"col\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"row\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"colSpan\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"rowSpan\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"alignment\": {\n \"$ref\": \"shared.json#/definitions/alignment\"\n },\n \"verticalAlignment\": {\n \"$ref\": \"shared.json#/definitions/verticalAlignment\"\n },\n \"wrapWord\": {\n \"type\": \"boolean\"\n },\n \"truncate\": {\n \"type\": \"integer\"\n },\n \"paddingLeft\": {\n \"type\": \"integer\"\n },\n \"paddingRight\": {\n \"type\": \"integer\"\n }\n },\n \"required\": [\"row\", \"col\"],\n \"additionalProperties\": false\n }\n }\n },\n \"additionalProperties\": false\n};\nconst schema15 = {\n \"type\": \"object\",\n \"properties\": {\n \"topBody\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"topJoin\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"topLeft\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"topRight\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bottomBody\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bottomJoin\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bottomLeft\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bottomRight\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bodyLeft\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bodyRight\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bodyJoin\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"headerJoin\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinBody\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinLeft\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinRight\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinJoin\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinMiddleUp\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinMiddleDown\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinMiddleLeft\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinMiddleRight\": {\n \"$ref\": \"#/definitions/border\"\n }\n },\n \"additionalProperties\": false\n};\nconst func8 = Object.prototype.hasOwnProperty;\nconst schema16 = {\n \"type\": \"string\"\n};\nfunction validate46(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (typeof data !== \"string\") {\n const err0 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n validate46.errors = vErrors;\n return errors === 0;\n}\nfunction validate45(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(func8.call(schema15.properties, key0))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.topBody !== undefined) {\n if (!(validate46(data.topBody, {\n instancePath: instancePath + \"/topBody\",\n parentData: data,\n parentDataProperty: \"topBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topJoin !== undefined) {\n if (!(validate46(data.topJoin, {\n instancePath: instancePath + \"/topJoin\",\n parentData: data,\n parentDataProperty: \"topJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topLeft !== undefined) {\n if (!(validate46(data.topLeft, {\n instancePath: instancePath + \"/topLeft\",\n parentData: data,\n parentDataProperty: \"topLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topRight !== undefined) {\n if (!(validate46(data.topRight, {\n instancePath: instancePath + \"/topRight\",\n parentData: data,\n parentDataProperty: \"topRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomBody !== undefined) {\n if (!(validate46(data.bottomBody, {\n instancePath: instancePath + \"/bottomBody\",\n parentData: data,\n parentDataProperty: \"bottomBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomJoin !== undefined) {\n if (!(validate46(data.bottomJoin, {\n instancePath: instancePath + \"/bottomJoin\",\n parentData: data,\n parentDataProperty: \"bottomJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomLeft !== undefined) {\n if (!(validate46(data.bottomLeft, {\n instancePath: instancePath + \"/bottomLeft\",\n parentData: data,\n parentDataProperty: \"bottomLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomRight !== undefined) {\n if (!(validate46(data.bottomRight, {\n instancePath: instancePath + \"/bottomRight\",\n parentData: data,\n parentDataProperty: \"bottomRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyLeft !== undefined) {\n if (!(validate46(data.bodyLeft, {\n instancePath: instancePath + \"/bodyLeft\",\n parentData: data,\n parentDataProperty: \"bodyLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyRight !== undefined) {\n if (!(validate46(data.bodyRight, {\n instancePath: instancePath + \"/bodyRight\",\n parentData: data,\n parentDataProperty: \"bodyRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyJoin !== undefined) {\n if (!(validate46(data.bodyJoin, {\n instancePath: instancePath + \"/bodyJoin\",\n parentData: data,\n parentDataProperty: \"bodyJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.headerJoin !== undefined) {\n if (!(validate46(data.headerJoin, {\n instancePath: instancePath + \"/headerJoin\",\n parentData: data,\n parentDataProperty: \"headerJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinBody !== undefined) {\n if (!(validate46(data.joinBody, {\n instancePath: instancePath + \"/joinBody\",\n parentData: data,\n parentDataProperty: \"joinBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinLeft !== undefined) {\n if (!(validate46(data.joinLeft, {\n instancePath: instancePath + \"/joinLeft\",\n parentData: data,\n parentDataProperty: \"joinLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinRight !== undefined) {\n if (!(validate46(data.joinRight, {\n instancePath: instancePath + \"/joinRight\",\n parentData: data,\n parentDataProperty: \"joinRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinJoin !== undefined) {\n if (!(validate46(data.joinJoin, {\n instancePath: instancePath + \"/joinJoin\",\n parentData: data,\n parentDataProperty: \"joinJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleUp !== undefined) {\n if (!(validate46(data.joinMiddleUp, {\n instancePath: instancePath + \"/joinMiddleUp\",\n parentData: data,\n parentDataProperty: \"joinMiddleUp\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleDown !== undefined) {\n if (!(validate46(data.joinMiddleDown, {\n instancePath: instancePath + \"/joinMiddleDown\",\n parentData: data,\n parentDataProperty: \"joinMiddleDown\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleLeft !== undefined) {\n if (!(validate46(data.joinMiddleLeft, {\n instancePath: instancePath + \"/joinMiddleLeft\",\n parentData: data,\n parentDataProperty: \"joinMiddleLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleRight !== undefined) {\n if (!(validate46(data.joinMiddleRight, {\n instancePath: instancePath + \"/joinMiddleRight\",\n parentData: data,\n parentDataProperty: \"joinMiddleRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n }\n else {\n const err1 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate45.errors = vErrors;\n return errors === 0;\n}\nconst schema17 = {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"center\", \"justify\"]\n};\nconst func0 = require(\"ajv/dist/runtime/equal\").default;\nfunction validate68(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (typeof data !== \"string\") {\n const err0 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n if (!((((data === \"left\") || (data === \"right\")) || (data === \"center\")) || (data === \"justify\"))) {\n const err1 = {\n instancePath,\n schemaPath: \"#/enum\",\n keyword: \"enum\",\n params: {\n allowedValues: schema17.enum\n },\n message: \"must be equal to one of the allowed values\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate68.errors = vErrors;\n return errors === 0;\n}\nconst schema18 = {\n \"oneOf\": [{\n \"type\": \"object\",\n \"patternProperties\": {\n \"^[0-9]+$\": {\n \"$ref\": \"#/definitions/column\"\n }\n },\n \"additionalProperties\": false\n }, {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/column\"\n }\n }]\n};\nconst pattern0 = new RegExp(\"^[0-9]+$\", \"u\");\nconst schema19 = {\n \"type\": \"object\",\n \"properties\": {\n \"alignment\": {\n \"$ref\": \"#/definitions/alignment\"\n },\n \"verticalAlignment\": {\n \"$ref\": \"#/definitions/verticalAlignment\"\n },\n \"width\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"wrapWord\": {\n \"type\": \"boolean\"\n },\n \"truncate\": {\n \"type\": \"integer\"\n },\n \"paddingLeft\": {\n \"type\": \"integer\"\n },\n \"paddingRight\": {\n \"type\": \"integer\"\n }\n },\n \"additionalProperties\": false\n};\nfunction validate72(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (typeof data !== \"string\") {\n const err0 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n if (!((((data === \"left\") || (data === \"right\")) || (data === \"center\")) || (data === \"justify\"))) {\n const err1 = {\n instancePath,\n schemaPath: \"#/enum\",\n keyword: \"enum\",\n params: {\n allowedValues: schema17.enum\n },\n message: \"must be equal to one of the allowed values\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate72.errors = vErrors;\n return errors === 0;\n}\nconst schema21 = {\n \"type\": \"string\",\n \"enum\": [\"top\", \"middle\", \"bottom\"]\n};\nfunction validate74(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (typeof data !== \"string\") {\n const err0 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n if (!(((data === \"top\") || (data === \"middle\")) || (data === \"bottom\"))) {\n const err1 = {\n instancePath,\n schemaPath: \"#/enum\",\n keyword: \"enum\",\n params: {\n allowedValues: schema21.enum\n },\n message: \"must be equal to one of the allowed values\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate74.errors = vErrors;\n return errors === 0;\n}\nfunction validate71(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(((((((key0 === \"alignment\") || (key0 === \"verticalAlignment\")) || (key0 === \"width\")) || (key0 === \"wrapWord\")) || (key0 === \"truncate\")) || (key0 === \"paddingLeft\")) || (key0 === \"paddingRight\"))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.alignment !== undefined) {\n if (!(validate72(data.alignment, {\n instancePath: instancePath + \"/alignment\",\n parentData: data,\n parentDataProperty: \"alignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate72.errors : vErrors.concat(validate72.errors);\n errors = vErrors.length;\n }\n }\n if (data.verticalAlignment !== undefined) {\n if (!(validate74(data.verticalAlignment, {\n instancePath: instancePath + \"/verticalAlignment\",\n parentData: data,\n parentDataProperty: \"verticalAlignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate74.errors : vErrors.concat(validate74.errors);\n errors = vErrors.length;\n }\n }\n if (data.width !== undefined) {\n let data2 = data.width;\n if (!(((typeof data2 == \"number\") && (!(data2 % 1) && !isNaN(data2))) && (isFinite(data2)))) {\n const err1 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n if ((typeof data2 == \"number\") && (isFinite(data2))) {\n if (data2 < 1 || isNaN(data2)) {\n const err2 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n }\n }\n if (data.wrapWord !== undefined) {\n if (typeof data.wrapWord !== \"boolean\") {\n const err3 = {\n instancePath: instancePath + \"/wrapWord\",\n schemaPath: \"#/properties/wrapWord/type\",\n keyword: \"type\",\n params: {\n type: \"boolean\"\n },\n message: \"must be boolean\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n }\n if (data.truncate !== undefined) {\n let data4 = data.truncate;\n if (!(((typeof data4 == \"number\") && (!(data4 % 1) && !isNaN(data4))) && (isFinite(data4)))) {\n const err4 = {\n instancePath: instancePath + \"/truncate\",\n schemaPath: \"#/properties/truncate/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err4];\n }\n else {\n vErrors.push(err4);\n }\n errors++;\n }\n }\n if (data.paddingLeft !== undefined) {\n let data5 = data.paddingLeft;\n if (!(((typeof data5 == \"number\") && (!(data5 % 1) && !isNaN(data5))) && (isFinite(data5)))) {\n const err5 = {\n instancePath: instancePath + \"/paddingLeft\",\n schemaPath: \"#/properties/paddingLeft/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err5];\n }\n else {\n vErrors.push(err5);\n }\n errors++;\n }\n }\n if (data.paddingRight !== undefined) {\n let data6 = data.paddingRight;\n if (!(((typeof data6 == \"number\") && (!(data6 % 1) && !isNaN(data6))) && (isFinite(data6)))) {\n const err6 = {\n instancePath: instancePath + \"/paddingRight\",\n schemaPath: \"#/properties/paddingRight/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err6];\n }\n else {\n vErrors.push(err6);\n }\n errors++;\n }\n }\n }\n else {\n const err7 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err7];\n }\n else {\n vErrors.push(err7);\n }\n errors++;\n }\n validate71.errors = vErrors;\n return errors === 0;\n}\nfunction validate70(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n const _errs0 = errors;\n let valid0 = false;\n let passing0 = null;\n const _errs1 = errors;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(pattern0.test(key0))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/oneOf/0/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n for (const key1 in data) {\n if (pattern0.test(key1)) {\n if (!(validate71(data[key1], {\n instancePath: instancePath + \"/\" + key1.replace(/~/g, \"~0\").replace(/\\//g, \"~1\"),\n parentData: data,\n parentDataProperty: key1,\n rootData\n }))) {\n vErrors = vErrors === null ? validate71.errors : vErrors.concat(validate71.errors);\n errors = vErrors.length;\n }\n }\n }\n }\n else {\n const err1 = {\n instancePath,\n schemaPath: \"#/oneOf/0/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n var _valid0 = _errs1 === errors;\n if (_valid0) {\n valid0 = true;\n passing0 = 0;\n }\n const _errs5 = errors;\n if (Array.isArray(data)) {\n const len0 = data.length;\n for (let i0 = 0; i0 < len0; i0++) {\n if (!(validate71(data[i0], {\n instancePath: instancePath + \"/\" + i0,\n parentData: data,\n parentDataProperty: i0,\n rootData\n }))) {\n vErrors = vErrors === null ? validate71.errors : vErrors.concat(validate71.errors);\n errors = vErrors.length;\n }\n }\n }\n else {\n const err2 = {\n instancePath,\n schemaPath: \"#/oneOf/1/type\",\n keyword: \"type\",\n params: {\n type: \"array\"\n },\n message: \"must be array\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n var _valid0 = _errs5 === errors;\n if (_valid0 && valid0) {\n valid0 = false;\n passing0 = [passing0, 1];\n }\n else {\n if (_valid0) {\n valid0 = true;\n passing0 = 1;\n }\n }\n if (!valid0) {\n const err3 = {\n instancePath,\n schemaPath: \"#/oneOf\",\n keyword: \"oneOf\",\n params: {\n passingSchemas: passing0\n },\n message: \"must match exactly one schema in oneOf\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n else {\n errors = _errs0;\n if (vErrors !== null) {\n if (_errs0) {\n vErrors.length = _errs0;\n }\n else {\n vErrors = null;\n }\n }\n }\n validate70.errors = vErrors;\n return errors === 0;\n}\nfunction validate79(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(((((((key0 === \"alignment\") || (key0 === \"verticalAlignment\")) || (key0 === \"width\")) || (key0 === \"wrapWord\")) || (key0 === \"truncate\")) || (key0 === \"paddingLeft\")) || (key0 === \"paddingRight\"))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.alignment !== undefined) {\n if (!(validate72(data.alignment, {\n instancePath: instancePath + \"/alignment\",\n parentData: data,\n parentDataProperty: \"alignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate72.errors : vErrors.concat(validate72.errors);\n errors = vErrors.length;\n }\n }\n if (data.verticalAlignment !== undefined) {\n if (!(validate74(data.verticalAlignment, {\n instancePath: instancePath + \"/verticalAlignment\",\n parentData: data,\n parentDataProperty: \"verticalAlignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate74.errors : vErrors.concat(validate74.errors);\n errors = vErrors.length;\n }\n }\n if (data.width !== undefined) {\n let data2 = data.width;\n if (!(((typeof data2 == \"number\") && (!(data2 % 1) && !isNaN(data2))) && (isFinite(data2)))) {\n const err1 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n if ((typeof data2 == \"number\") && (isFinite(data2))) {\n if (data2 < 1 || isNaN(data2)) {\n const err2 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n }\n }\n if (data.wrapWord !== undefined) {\n if (typeof data.wrapWord !== \"boolean\") {\n const err3 = {\n instancePath: instancePath + \"/wrapWord\",\n schemaPath: \"#/properties/wrapWord/type\",\n keyword: \"type\",\n params: {\n type: \"boolean\"\n },\n message: \"must be boolean\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n }\n if (data.truncate !== undefined) {\n let data4 = data.truncate;\n if (!(((typeof data4 == \"number\") && (!(data4 % 1) && !isNaN(data4))) && (isFinite(data4)))) {\n const err4 = {\n instancePath: instancePath + \"/truncate\",\n schemaPath: \"#/properties/truncate/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err4];\n }\n else {\n vErrors.push(err4);\n }\n errors++;\n }\n }\n if (data.paddingLeft !== undefined) {\n let data5 = data.paddingLeft;\n if (!(((typeof data5 == \"number\") && (!(data5 % 1) && !isNaN(data5))) && (isFinite(data5)))) {\n const err5 = {\n instancePath: instancePath + \"/paddingLeft\",\n schemaPath: \"#/properties/paddingLeft/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err5];\n }\n else {\n vErrors.push(err5);\n }\n errors++;\n }\n }\n if (data.paddingRight !== undefined) {\n let data6 = data.paddingRight;\n if (!(((typeof data6 == \"number\") && (!(data6 % 1) && !isNaN(data6))) && (isFinite(data6)))) {\n const err6 = {\n instancePath: instancePath + \"/paddingRight\",\n schemaPath: \"#/properties/paddingRight/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err6];\n }\n else {\n vErrors.push(err6);\n }\n errors++;\n }\n }\n }\n else {\n const err7 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err7];\n }\n else {\n vErrors.push(err7);\n }\n errors++;\n }\n validate79.errors = vErrors;\n return errors === 0;\n}\nfunction validate84(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (typeof data !== \"string\") {\n const err0 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n if (!(((data === \"top\") || (data === \"middle\")) || (data === \"bottom\"))) {\n const err1 = {\n instancePath,\n schemaPath: \"#/enum\",\n keyword: \"enum\",\n params: {\n allowedValues: schema21.enum\n },\n message: \"must be equal to one of the allowed values\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate84.errors = vErrors;\n return errors === 0;\n}\nfunction validate43(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n /*# sourceURL=\"config.json\" */ ;\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!((((((((key0 === \"border\") || (key0 === \"header\")) || (key0 === \"columns\")) || (key0 === \"columnDefault\")) || (key0 === \"drawVerticalLine\")) || (key0 === \"drawHorizontalLine\")) || (key0 === \"singleLine\")) || (key0 === \"spanningCells\"))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.border !== undefined) {\n if (!(validate45(data.border, {\n instancePath: instancePath + \"/border\",\n parentData: data,\n parentDataProperty: \"border\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate45.errors : vErrors.concat(validate45.errors);\n errors = vErrors.length;\n }\n }\n if (data.header !== undefined) {\n let data1 = data.header;\n if (data1 && typeof data1 == \"object\" && !Array.isArray(data1)) {\n if (data1.content === undefined) {\n const err1 = {\n instancePath: instancePath + \"/header\",\n schemaPath: \"#/properties/header/required\",\n keyword: \"required\",\n params: {\n missingProperty: \"content\"\n },\n message: \"must have required property '\" + \"content\" + \"'\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n for (const key1 in data1) {\n if (!((((((key1 === \"content\") || (key1 === \"alignment\")) || (key1 === \"wrapWord\")) || (key1 === \"truncate\")) || (key1 === \"paddingLeft\")) || (key1 === \"paddingRight\"))) {\n const err2 = {\n instancePath: instancePath + \"/header\",\n schemaPath: \"#/properties/header/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key1\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n }\n if (data1.content !== undefined) {\n if (typeof data1.content !== \"string\") {\n const err3 = {\n instancePath: instancePath + \"/header/content\",\n schemaPath: \"#/properties/header/properties/content/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n }\n if (data1.alignment !== undefined) {\n if (!(validate68(data1.alignment, {\n instancePath: instancePath + \"/header/alignment\",\n parentData: data1,\n parentDataProperty: \"alignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate68.errors : vErrors.concat(validate68.errors);\n errors = vErrors.length;\n }\n }\n if (data1.wrapWord !== undefined) {\n if (typeof data1.wrapWord !== \"boolean\") {\n const err4 = {\n instancePath: instancePath + \"/header/wrapWord\",\n schemaPath: \"#/properties/header/properties/wrapWord/type\",\n keyword: \"type\",\n params: {\n type: \"boolean\"\n },\n message: \"must be boolean\"\n };\n if (vErrors === null) {\n vErrors = [err4];\n }\n else {\n vErrors.push(err4);\n }\n errors++;\n }\n }\n if (data1.truncate !== undefined) {\n let data5 = data1.truncate;\n if (!(((typeof data5 == \"number\") && (!(data5 % 1) && !isNaN(data5))) && (isFinite(data5)))) {\n const err5 = {\n instancePath: instancePath + \"/header/truncate\",\n schemaPath: \"#/properties/header/properties/truncate/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err5];\n }\n else {\n vErrors.push(err5);\n }\n errors++;\n }\n }\n if (data1.paddingLeft !== undefined) {\n let data6 = data1.paddingLeft;\n if (!(((typeof data6 == \"number\") && (!(data6 % 1) && !isNaN(data6))) && (isFinite(data6)))) {\n const err6 = {\n instancePath: instancePath + \"/header/paddingLeft\",\n schemaPath: \"#/properties/header/properties/paddingLeft/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err6];\n }\n else {\n vErrors.push(err6);\n }\n errors++;\n }\n }\n if (data1.paddingRight !== undefined) {\n let data7 = data1.paddingRight;\n if (!(((typeof data7 == \"number\") && (!(data7 % 1) && !isNaN(data7))) && (isFinite(data7)))) {\n const err7 = {\n instancePath: instancePath + \"/header/paddingRight\",\n schemaPath: \"#/properties/header/properties/paddingRight/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err7];\n }\n else {\n vErrors.push(err7);\n }\n errors++;\n }\n }\n }\n else {\n const err8 = {\n instancePath: instancePath + \"/header\",\n schemaPath: \"#/properties/header/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err8];\n }\n else {\n vErrors.push(err8);\n }\n errors++;\n }\n }\n if (data.columns !== undefined) {\n if (!(validate70(data.columns, {\n instancePath: instancePath + \"/columns\",\n parentData: data,\n parentDataProperty: \"columns\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate70.errors : vErrors.concat(validate70.errors);\n errors = vErrors.length;\n }\n }\n if (data.columnDefault !== undefined) {\n if (!(validate79(data.columnDefault, {\n instancePath: instancePath + \"/columnDefault\",\n parentData: data,\n parentDataProperty: \"columnDefault\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate79.errors : vErrors.concat(validate79.errors);\n errors = vErrors.length;\n }\n }\n if (data.drawVerticalLine !== undefined) {\n if (typeof data.drawVerticalLine != \"function\") {\n const err9 = {\n instancePath: instancePath + \"/drawVerticalLine\",\n schemaPath: \"#/properties/drawVerticalLine/typeof\",\n keyword: \"typeof\",\n params: {},\n message: \"must pass \\\"typeof\\\" keyword validation\"\n };\n if (vErrors === null) {\n vErrors = [err9];\n }\n else {\n vErrors.push(err9);\n }\n errors++;\n }\n }\n if (data.drawHorizontalLine !== undefined) {\n if (typeof data.drawHorizontalLine != \"function\") {\n const err10 = {\n instancePath: instancePath + \"/drawHorizontalLine\",\n schemaPath: \"#/properties/drawHorizontalLine/typeof\",\n keyword: \"typeof\",\n params: {},\n message: \"must pass \\\"typeof\\\" keyword validation\"\n };\n if (vErrors === null) {\n vErrors = [err10];\n }\n else {\n vErrors.push(err10);\n }\n errors++;\n }\n }\n if (data.singleLine !== undefined) {\n if (typeof data.singleLine != \"boolean\") {\n const err11 = {\n instancePath: instancePath + \"/singleLine\",\n schemaPath: \"#/properties/singleLine/typeof\",\n keyword: \"typeof\",\n params: {},\n message: \"must pass \\\"typeof\\\" keyword validation\"\n };\n if (vErrors === null) {\n vErrors = [err11];\n }\n else {\n vErrors.push(err11);\n }\n errors++;\n }\n }\n if (data.spanningCells !== undefined) {\n let data13 = data.spanningCells;\n if (Array.isArray(data13)) {\n const len0 = data13.length;\n for (let i0 = 0; i0 < len0; i0++) {\n let data14 = data13[i0];\n if (data14 && typeof data14 == \"object\" && !Array.isArray(data14)) {\n if (data14.row === undefined) {\n const err12 = {\n instancePath: instancePath + \"/spanningCells/\" + i0,\n schemaPath: \"#/properties/spanningCells/items/required\",\n keyword: \"required\",\n params: {\n missingProperty: \"row\"\n },\n message: \"must have required property '\" + \"row\" + \"'\"\n };\n if (vErrors === null) {\n vErrors = [err12];\n }\n else {\n vErrors.push(err12);\n }\n errors++;\n }\n if (data14.col === undefined) {\n const err13 = {\n instancePath: instancePath + \"/spanningCells/\" + i0,\n schemaPath: \"#/properties/spanningCells/items/required\",\n keyword: \"required\",\n params: {\n missingProperty: \"col\"\n },\n message: \"must have required property '\" + \"col\" + \"'\"\n };\n if (vErrors === null) {\n vErrors = [err13];\n }\n else {\n vErrors.push(err13);\n }\n errors++;\n }\n for (const key2 in data14) {\n if (!(func8.call(schema13.properties.spanningCells.items.properties, key2))) {\n const err14 = {\n instancePath: instancePath + \"/spanningCells/\" + i0,\n schemaPath: \"#/properties/spanningCells/items/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key2\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err14];\n }\n else {\n vErrors.push(err14);\n }\n errors++;\n }\n }\n if (data14.col !== undefined) {\n let data15 = data14.col;\n if (!(((typeof data15 == \"number\") && (!(data15 % 1) && !isNaN(data15))) && (isFinite(data15)))) {\n const err15 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/col\",\n schemaPath: \"#/properties/spanningCells/items/properties/col/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err15];\n }\n else {\n vErrors.push(err15);\n }\n errors++;\n }\n if ((typeof data15 == \"number\") && (isFinite(data15))) {\n if (data15 < 0 || isNaN(data15)) {\n const err16 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/col\",\n schemaPath: \"#/properties/spanningCells/items/properties/col/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 0\n },\n message: \"must be >= 0\"\n };\n if (vErrors === null) {\n vErrors = [err16];\n }\n else {\n vErrors.push(err16);\n }\n errors++;\n }\n }\n }\n if (data14.row !== undefined) {\n let data16 = data14.row;\n if (!(((typeof data16 == \"number\") && (!(data16 % 1) && !isNaN(data16))) && (isFinite(data16)))) {\n const err17 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/row\",\n schemaPath: \"#/properties/spanningCells/items/properties/row/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err17];\n }\n else {\n vErrors.push(err17);\n }\n errors++;\n }\n if ((typeof data16 == \"number\") && (isFinite(data16))) {\n if (data16 < 0 || isNaN(data16)) {\n const err18 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/row\",\n schemaPath: \"#/properties/spanningCells/items/properties/row/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 0\n },\n message: \"must be >= 0\"\n };\n if (vErrors === null) {\n vErrors = [err18];\n }\n else {\n vErrors.push(err18);\n }\n errors++;\n }\n }\n }\n if (data14.colSpan !== undefined) {\n let data17 = data14.colSpan;\n if (!(((typeof data17 == \"number\") && (!(data17 % 1) && !isNaN(data17))) && (isFinite(data17)))) {\n const err19 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/colSpan\",\n schemaPath: \"#/properties/spanningCells/items/properties/colSpan/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err19];\n }\n else {\n vErrors.push(err19);\n }\n errors++;\n }\n if ((typeof data17 == \"number\") && (isFinite(data17))) {\n if (data17 < 1 || isNaN(data17)) {\n const err20 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/colSpan\",\n schemaPath: \"#/properties/spanningCells/items/properties/colSpan/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err20];\n }\n else {\n vErrors.push(err20);\n }\n errors++;\n }\n }\n }\n if (data14.rowSpan !== undefined) {\n let data18 = data14.rowSpan;\n if (!(((typeof data18 == \"number\") && (!(data18 % 1) && !isNaN(data18))) && (isFinite(data18)))) {\n const err21 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/rowSpan\",\n schemaPath: \"#/properties/spanningCells/items/properties/rowSpan/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err21];\n }\n else {\n vErrors.push(err21);\n }\n errors++;\n }\n if ((typeof data18 == \"number\") && (isFinite(data18))) {\n if (data18 < 1 || isNaN(data18)) {\n const err22 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/rowSpan\",\n schemaPath: \"#/properties/spanningCells/items/properties/rowSpan/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err22];\n }\n else {\n vErrors.push(err22);\n }\n errors++;\n }\n }\n }\n if (data14.alignment !== undefined) {\n if (!(validate68(data14.alignment, {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/alignment\",\n parentData: data14,\n parentDataProperty: \"alignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate68.errors : vErrors.concat(validate68.errors);\n errors = vErrors.length;\n }\n }\n if (data14.verticalAlignment !== undefined) {\n if (!(validate84(data14.verticalAlignment, {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/verticalAlignment\",\n parentData: data14,\n parentDataProperty: \"verticalAlignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate84.errors : vErrors.concat(validate84.errors);\n errors = vErrors.length;\n }\n }\n if (data14.wrapWord !== undefined) {\n if (typeof data14.wrapWord !== \"boolean\") {\n const err23 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/wrapWord\",\n schemaPath: \"#/properties/spanningCells/items/properties/wrapWord/type\",\n keyword: \"type\",\n params: {\n type: \"boolean\"\n },\n message: \"must be boolean\"\n };\n if (vErrors === null) {\n vErrors = [err23];\n }\n else {\n vErrors.push(err23);\n }\n errors++;\n }\n }\n if (data14.truncate !== undefined) {\n let data22 = data14.truncate;\n if (!(((typeof data22 == \"number\") && (!(data22 % 1) && !isNaN(data22))) && (isFinite(data22)))) {\n const err24 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/truncate\",\n schemaPath: \"#/properties/spanningCells/items/properties/truncate/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err24];\n }\n else {\n vErrors.push(err24);\n }\n errors++;\n }\n }\n if (data14.paddingLeft !== undefined) {\n let data23 = data14.paddingLeft;\n if (!(((typeof data23 == \"number\") && (!(data23 % 1) && !isNaN(data23))) && (isFinite(data23)))) {\n const err25 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/paddingLeft\",\n schemaPath: \"#/properties/spanningCells/items/properties/paddingLeft/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err25];\n }\n else {\n vErrors.push(err25);\n }\n errors++;\n }\n }\n if (data14.paddingRight !== undefined) {\n let data24 = data14.paddingRight;\n if (!(((typeof data24 == \"number\") && (!(data24 % 1) && !isNaN(data24))) && (isFinite(data24)))) {\n const err26 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/paddingRight\",\n schemaPath: \"#/properties/spanningCells/items/properties/paddingRight/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err26];\n }\n else {\n vErrors.push(err26);\n }\n errors++;\n }\n }\n }\n else {\n const err27 = {\n instancePath: instancePath + \"/spanningCells/\" + i0,\n schemaPath: \"#/properties/spanningCells/items/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err27];\n }\n else {\n vErrors.push(err27);\n }\n errors++;\n }\n }\n }\n else {\n const err28 = {\n instancePath: instancePath + \"/spanningCells\",\n schemaPath: \"#/properties/spanningCells/type\",\n keyword: \"type\",\n params: {\n type: \"array\"\n },\n message: \"must be array\"\n };\n if (vErrors === null) {\n vErrors = [err28];\n }\n else {\n vErrors.push(err28);\n }\n errors++;\n }\n }\n }\n else {\n const err29 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err29];\n }\n else {\n vErrors.push(err29);\n }\n errors++;\n }\n validate43.errors = vErrors;\n return errors === 0;\n}\nexports[\"streamConfig.json\"] = validate86;\nconst schema24 = {\n \"$id\": \"streamConfig.json\",\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"border\": {\n \"$ref\": \"shared.json#/definitions/borders\"\n },\n \"columns\": {\n \"$ref\": \"shared.json#/definitions/columns\"\n },\n \"columnDefault\": {\n \"$ref\": \"shared.json#/definitions/column\"\n },\n \"columnCount\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"drawVerticalLine\": {\n \"typeof\": \"function\"\n }\n },\n \"required\": [\"columnDefault\", \"columnCount\"],\n \"additionalProperties\": false\n};\nfunction validate87(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(func8.call(schema15.properties, key0))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.topBody !== undefined) {\n if (!(validate46(data.topBody, {\n instancePath: instancePath + \"/topBody\",\n parentData: data,\n parentDataProperty: \"topBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topJoin !== undefined) {\n if (!(validate46(data.topJoin, {\n instancePath: instancePath + \"/topJoin\",\n parentData: data,\n parentDataProperty: \"topJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topLeft !== undefined) {\n if (!(validate46(data.topLeft, {\n instancePath: instancePath + \"/topLeft\",\n parentData: data,\n parentDataProperty: \"topLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topRight !== undefined) {\n if (!(validate46(data.topRight, {\n instancePath: instancePath + \"/topRight\",\n parentData: data,\n parentDataProperty: \"topRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomBody !== undefined) {\n if (!(validate46(data.bottomBody, {\n instancePath: instancePath + \"/bottomBody\",\n parentData: data,\n parentDataProperty: \"bottomBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomJoin !== undefined) {\n if (!(validate46(data.bottomJoin, {\n instancePath: instancePath + \"/bottomJoin\",\n parentData: data,\n parentDataProperty: \"bottomJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomLeft !== undefined) {\n if (!(validate46(data.bottomLeft, {\n instancePath: instancePath + \"/bottomLeft\",\n parentData: data,\n parentDataProperty: \"bottomLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomRight !== undefined) {\n if (!(validate46(data.bottomRight, {\n instancePath: instancePath + \"/bottomRight\",\n parentData: data,\n parentDataProperty: \"bottomRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyLeft !== undefined) {\n if (!(validate46(data.bodyLeft, {\n instancePath: instancePath + \"/bodyLeft\",\n parentData: data,\n parentDataProperty: \"bodyLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyRight !== undefined) {\n if (!(validate46(data.bodyRight, {\n instancePath: instancePath + \"/bodyRight\",\n parentData: data,\n parentDataProperty: \"bodyRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyJoin !== undefined) {\n if (!(validate46(data.bodyJoin, {\n instancePath: instancePath + \"/bodyJoin\",\n parentData: data,\n parentDataProperty: \"bodyJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.headerJoin !== undefined) {\n if (!(validate46(data.headerJoin, {\n instancePath: instancePath + \"/headerJoin\",\n parentData: data,\n parentDataProperty: \"headerJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinBody !== undefined) {\n if (!(validate46(data.joinBody, {\n instancePath: instancePath + \"/joinBody\",\n parentData: data,\n parentDataProperty: \"joinBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinLeft !== undefined) {\n if (!(validate46(data.joinLeft, {\n instancePath: instancePath + \"/joinLeft\",\n parentData: data,\n parentDataProperty: \"joinLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinRight !== undefined) {\n if (!(validate46(data.joinRight, {\n instancePath: instancePath + \"/joinRight\",\n parentData: data,\n parentDataProperty: \"joinRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinJoin !== undefined) {\n if (!(validate46(data.joinJoin, {\n instancePath: instancePath + \"/joinJoin\",\n parentData: data,\n parentDataProperty: \"joinJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleUp !== undefined) {\n if (!(validate46(data.joinMiddleUp, {\n instancePath: instancePath + \"/joinMiddleUp\",\n parentData: data,\n parentDataProperty: \"joinMiddleUp\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleDown !== undefined) {\n if (!(validate46(data.joinMiddleDown, {\n instancePath: instancePath + \"/joinMiddleDown\",\n parentData: data,\n parentDataProperty: \"joinMiddleDown\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleLeft !== undefined) {\n if (!(validate46(data.joinMiddleLeft, {\n instancePath: instancePath + \"/joinMiddleLeft\",\n parentData: data,\n parentDataProperty: \"joinMiddleLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleRight !== undefined) {\n if (!(validate46(data.joinMiddleRight, {\n instancePath: instancePath + \"/joinMiddleRight\",\n parentData: data,\n parentDataProperty: \"joinMiddleRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n }\n else {\n const err1 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate87.errors = vErrors;\n return errors === 0;\n}\nfunction validate109(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n const _errs0 = errors;\n let valid0 = false;\n let passing0 = null;\n const _errs1 = errors;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(pattern0.test(key0))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/oneOf/0/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n for (const key1 in data) {\n if (pattern0.test(key1)) {\n if (!(validate71(data[key1], {\n instancePath: instancePath + \"/\" + key1.replace(/~/g, \"~0\").replace(/\\//g, \"~1\"),\n parentData: data,\n parentDataProperty: key1,\n rootData\n }))) {\n vErrors = vErrors === null ? validate71.errors : vErrors.concat(validate71.errors);\n errors = vErrors.length;\n }\n }\n }\n }\n else {\n const err1 = {\n instancePath,\n schemaPath: \"#/oneOf/0/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n var _valid0 = _errs1 === errors;\n if (_valid0) {\n valid0 = true;\n passing0 = 0;\n }\n const _errs5 = errors;\n if (Array.isArray(data)) {\n const len0 = data.length;\n for (let i0 = 0; i0 < len0; i0++) {\n if (!(validate71(data[i0], {\n instancePath: instancePath + \"/\" + i0,\n parentData: data,\n parentDataProperty: i0,\n rootData\n }))) {\n vErrors = vErrors === null ? validate71.errors : vErrors.concat(validate71.errors);\n errors = vErrors.length;\n }\n }\n }\n else {\n const err2 = {\n instancePath,\n schemaPath: \"#/oneOf/1/type\",\n keyword: \"type\",\n params: {\n type: \"array\"\n },\n message: \"must be array\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n var _valid0 = _errs5 === errors;\n if (_valid0 && valid0) {\n valid0 = false;\n passing0 = [passing0, 1];\n }\n else {\n if (_valid0) {\n valid0 = true;\n passing0 = 1;\n }\n }\n if (!valid0) {\n const err3 = {\n instancePath,\n schemaPath: \"#/oneOf\",\n keyword: \"oneOf\",\n params: {\n passingSchemas: passing0\n },\n message: \"must match exactly one schema in oneOf\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n else {\n errors = _errs0;\n if (vErrors !== null) {\n if (_errs0) {\n vErrors.length = _errs0;\n }\n else {\n vErrors = null;\n }\n }\n }\n validate109.errors = vErrors;\n return errors === 0;\n}\nfunction validate113(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(((((((key0 === \"alignment\") || (key0 === \"verticalAlignment\")) || (key0 === \"width\")) || (key0 === \"wrapWord\")) || (key0 === \"truncate\")) || (key0 === \"paddingLeft\")) || (key0 === \"paddingRight\"))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.alignment !== undefined) {\n if (!(validate72(data.alignment, {\n instancePath: instancePath + \"/alignment\",\n parentData: data,\n parentDataProperty: \"alignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate72.errors : vErrors.concat(validate72.errors);\n errors = vErrors.length;\n }\n }\n if (data.verticalAlignment !== undefined) {\n if (!(validate74(data.verticalAlignment, {\n instancePath: instancePath + \"/verticalAlignment\",\n parentData: data,\n parentDataProperty: \"verticalAlignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate74.errors : vErrors.concat(validate74.errors);\n errors = vErrors.length;\n }\n }\n if (data.width !== undefined) {\n let data2 = data.width;\n if (!(((typeof data2 == \"number\") && (!(data2 % 1) && !isNaN(data2))) && (isFinite(data2)))) {\n const err1 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n if ((typeof data2 == \"number\") && (isFinite(data2))) {\n if (data2 < 1 || isNaN(data2)) {\n const err2 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n }\n }\n if (data.wrapWord !== undefined) {\n if (typeof data.wrapWord !== \"boolean\") {\n const err3 = {\n instancePath: instancePath + \"/wrapWord\",\n schemaPath: \"#/properties/wrapWord/type\",\n keyword: \"type\",\n params: {\n type: \"boolean\"\n },\n message: \"must be boolean\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n }\n if (data.truncate !== undefined) {\n let data4 = data.truncate;\n if (!(((typeof data4 == \"number\") && (!(data4 % 1) && !isNaN(data4))) && (isFinite(data4)))) {\n const err4 = {\n instancePath: instancePath + \"/truncate\",\n schemaPath: \"#/properties/truncate/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err4];\n }\n else {\n vErrors.push(err4);\n }\n errors++;\n }\n }\n if (data.paddingLeft !== undefined) {\n let data5 = data.paddingLeft;\n if (!(((typeof data5 == \"number\") && (!(data5 % 1) && !isNaN(data5))) && (isFinite(data5)))) {\n const err5 = {\n instancePath: instancePath + \"/paddingLeft\",\n schemaPath: \"#/properties/paddingLeft/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err5];\n }\n else {\n vErrors.push(err5);\n }\n errors++;\n }\n }\n if (data.paddingRight !== undefined) {\n let data6 = data.paddingRight;\n if (!(((typeof data6 == \"number\") && (!(data6 % 1) && !isNaN(data6))) && (isFinite(data6)))) {\n const err6 = {\n instancePath: instancePath + \"/paddingRight\",\n schemaPath: \"#/properties/paddingRight/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err6];\n }\n else {\n vErrors.push(err6);\n }\n errors++;\n }\n }\n }\n else {\n const err7 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err7];\n }\n else {\n vErrors.push(err7);\n }\n errors++;\n }\n validate113.errors = vErrors;\n return errors === 0;\n}\nfunction validate86(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n /*# sourceURL=\"streamConfig.json\" */ ;\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n if (data.columnDefault === undefined) {\n const err0 = {\n instancePath,\n schemaPath: \"#/required\",\n keyword: \"required\",\n params: {\n missingProperty: \"columnDefault\"\n },\n message: \"must have required property '\" + \"columnDefault\" + \"'\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n if (data.columnCount === undefined) {\n const err1 = {\n instancePath,\n schemaPath: \"#/required\",\n keyword: \"required\",\n params: {\n missingProperty: \"columnCount\"\n },\n message: \"must have required property '\" + \"columnCount\" + \"'\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n for (const key0 in data) {\n if (!(((((key0 === \"border\") || (key0 === \"columns\")) || (key0 === \"columnDefault\")) || (key0 === \"columnCount\")) || (key0 === \"drawVerticalLine\"))) {\n const err2 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n }\n if (data.border !== undefined) {\n if (!(validate87(data.border, {\n instancePath: instancePath + \"/border\",\n parentData: data,\n parentDataProperty: \"border\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate87.errors : vErrors.concat(validate87.errors);\n errors = vErrors.length;\n }\n }\n if (data.columns !== undefined) {\n if (!(validate109(data.columns, {\n instancePath: instancePath + \"/columns\",\n parentData: data,\n parentDataProperty: \"columns\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate109.errors : vErrors.concat(validate109.errors);\n errors = vErrors.length;\n }\n }\n if (data.columnDefault !== undefined) {\n if (!(validate113(data.columnDefault, {\n instancePath: instancePath + \"/columnDefault\",\n parentData: data,\n parentDataProperty: \"columnDefault\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate113.errors : vErrors.concat(validate113.errors);\n errors = vErrors.length;\n }\n }\n if (data.columnCount !== undefined) {\n let data3 = data.columnCount;\n if (!(((typeof data3 == \"number\") && (!(data3 % 1) && !isNaN(data3))) && (isFinite(data3)))) {\n const err3 = {\n instancePath: instancePath + \"/columnCount\",\n schemaPath: \"#/properties/columnCount/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n if ((typeof data3 == \"number\") && (isFinite(data3))) {\n if (data3 < 1 || isNaN(data3)) {\n const err4 = {\n instancePath: instancePath + \"/columnCount\",\n schemaPath: \"#/properties/columnCount/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err4];\n }\n else {\n vErrors.push(err4);\n }\n errors++;\n }\n }\n }\n if (data.drawVerticalLine !== undefined) {\n if (typeof data.drawVerticalLine != \"function\") {\n const err5 = {\n instancePath: instancePath + \"/drawVerticalLine\",\n schemaPath: \"#/properties/drawVerticalLine/typeof\",\n keyword: \"typeof\",\n params: {},\n message: \"must pass \\\"typeof\\\" keyword validation\"\n };\n if (vErrors === null) {\n vErrors = [err5];\n }\n else {\n vErrors.push(err5);\n }\n errors++;\n }\n }\n }\n else {\n const err6 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err6];\n }\n else {\n vErrors.push(err6);\n }\n errors++;\n }\n validate86.errors = vErrors;\n return errors === 0;\n}\n//# sourceMappingURL=validators.js.map","\"use strict\";\n/* eslint-disable sort-keys-fix/sort-keys-fix */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getBorderCharacters = void 0;\nconst getBorderCharacters = (name) => {\n if (name === 'honeywell') {\n return {\n topBody: '═',\n topJoin: '╤',\n topLeft: '╔',\n topRight: '╗',\n bottomBody: '═',\n bottomJoin: '╧',\n bottomLeft: '╚',\n bottomRight: '╝',\n bodyLeft: '║',\n bodyRight: '║',\n bodyJoin: '│',\n headerJoin: '┬',\n joinBody: '─',\n joinLeft: '╟',\n joinRight: '╢',\n joinJoin: '┼',\n joinMiddleDown: '┬',\n joinMiddleUp: '┴',\n joinMiddleLeft: '┤',\n joinMiddleRight: '├',\n };\n }\n if (name === 'norc') {\n return {\n topBody: '─',\n topJoin: '┬',\n topLeft: '┌',\n topRight: '┐',\n bottomBody: '─',\n bottomJoin: '┴',\n bottomLeft: '└',\n bottomRight: '┘',\n bodyLeft: '│',\n bodyRight: '│',\n bodyJoin: '│',\n headerJoin: '┬',\n joinBody: '─',\n joinLeft: '├',\n joinRight: '┤',\n joinJoin: '┼',\n joinMiddleDown: '┬',\n joinMiddleUp: '┴',\n joinMiddleLeft: '┤',\n joinMiddleRight: '├',\n };\n }\n if (name === 'ramac') {\n return {\n topBody: '-',\n topJoin: '+',\n topLeft: '+',\n topRight: '+',\n bottomBody: '-',\n bottomJoin: '+',\n bottomLeft: '+',\n bottomRight: '+',\n bodyLeft: '|',\n bodyRight: '|',\n bodyJoin: '|',\n headerJoin: '+',\n joinBody: '-',\n joinLeft: '|',\n joinRight: '|',\n joinJoin: '|',\n joinMiddleDown: '+',\n joinMiddleUp: '+',\n joinMiddleLeft: '+',\n joinMiddleRight: '+',\n };\n }\n if (name === 'void') {\n return {\n topBody: '',\n topJoin: '',\n topLeft: '',\n topRight: '',\n bottomBody: '',\n bottomJoin: '',\n bottomLeft: '',\n bottomRight: '',\n bodyLeft: '',\n bodyRight: '',\n bodyJoin: '',\n headerJoin: '',\n joinBody: '',\n joinLeft: '',\n joinRight: '',\n joinJoin: '',\n joinMiddleDown: '',\n joinMiddleUp: '',\n joinMiddleLeft: '',\n joinMiddleRight: '',\n };\n }\n throw new Error('Unknown border template \"' + name + '\".');\n};\nexports.getBorderCharacters = getBorderCharacters;\n//# sourceMappingURL=getBorderCharacters.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getBorderCharacters = exports.createStream = exports.table = void 0;\nconst createStream_1 = require(\"./createStream\");\nObject.defineProperty(exports, \"createStream\", { enumerable: true, get: function () { return createStream_1.createStream; } });\nconst getBorderCharacters_1 = require(\"./getBorderCharacters\");\nObject.defineProperty(exports, \"getBorderCharacters\", { enumerable: true, get: function () { return getBorderCharacters_1.getBorderCharacters; } });\nconst table_1 = require(\"./table\");\nObject.defineProperty(exports, \"table\", { enumerable: true, get: function () { return table_1.table; } });\n__exportStar(require(\"./types/api\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.injectHeaderConfig = void 0;\nconst injectHeaderConfig = (rows, config) => {\n var _a;\n let spanningCellConfig = (_a = config.spanningCells) !== null && _a !== void 0 ? _a : [];\n const headerConfig = config.header;\n const adjustedRows = [...rows];\n if (headerConfig) {\n spanningCellConfig = spanningCellConfig.map(({ row, ...rest }) => {\n return { ...rest,\n row: row + 1 };\n });\n const { content, ...headerStyles } = headerConfig;\n spanningCellConfig.unshift({ alignment: 'center',\n col: 0,\n colSpan: rows[0].length,\n paddingLeft: 1,\n paddingRight: 1,\n row: 0,\n wrapWord: false,\n ...headerStyles });\n adjustedRows.unshift([content, ...Array.from({ length: rows[0].length - 1 }).fill('')]);\n }\n return [adjustedRows,\n spanningCellConfig];\n};\nexports.injectHeaderConfig = injectHeaderConfig;\n//# sourceMappingURL=injectHeaderConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.makeRangeConfig = void 0;\nconst utils_1 = require(\"./utils\");\nconst makeRangeConfig = (spanningCellConfig, columnsConfig) => {\n var _a;\n const { topLeft, bottomRight } = (0, utils_1.calculateRangeCoordinate)(spanningCellConfig);\n const cellConfig = {\n ...columnsConfig[topLeft.col],\n ...spanningCellConfig,\n paddingRight: (_a = spanningCellConfig.paddingRight) !== null && _a !== void 0 ? _a : columnsConfig[bottomRight.col].paddingRight,\n };\n return { ...cellConfig,\n bottomRight,\n topLeft };\n};\nexports.makeRangeConfig = makeRangeConfig;\n//# sourceMappingURL=makeRangeConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.makeStreamConfig = void 0;\nconst utils_1 = require(\"./utils\");\nconst validateConfig_1 = require(\"./validateConfig\");\n/**\n * Creates a configuration for every column using default\n * values for the missing configuration properties.\n */\nconst makeColumnsConfig = (columnCount, columns = {}, columnDefault) => {\n return Array.from({ length: columnCount }).map((_, index) => {\n return {\n alignment: 'left',\n paddingLeft: 1,\n paddingRight: 1,\n truncate: Number.POSITIVE_INFINITY,\n verticalAlignment: 'top',\n wrapWord: false,\n ...columnDefault,\n ...columns[index],\n };\n });\n};\n/**\n * Makes a new configuration object out of the userConfig object\n * using default values for the missing configuration properties.\n */\nconst makeStreamConfig = (config) => {\n (0, validateConfig_1.validateConfig)('streamConfig.json', config);\n if (config.columnDefault.width === undefined) {\n throw new Error('Must provide config.columnDefault.width when creating a stream.');\n }\n return {\n drawVerticalLine: () => {\n return true;\n },\n ...config,\n border: (0, utils_1.makeBorderConfig)(config.border),\n columns: makeColumnsConfig(config.columnCount, config.columns, config.columnDefault),\n };\n};\nexports.makeStreamConfig = makeStreamConfig;\n//# sourceMappingURL=makeStreamConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.makeTableConfig = void 0;\nconst calculateMaximumColumnWidths_1 = require(\"./calculateMaximumColumnWidths\");\nconst spanningCellManager_1 = require(\"./spanningCellManager\");\nconst utils_1 = require(\"./utils\");\nconst validateConfig_1 = require(\"./validateConfig\");\nconst validateSpanningCellConfig_1 = require(\"./validateSpanningCellConfig\");\n/**\n * Creates a configuration for every column using default\n * values for the missing configuration properties.\n */\nconst makeColumnsConfig = (rows, columns, columnDefault, spanningCellConfigs) => {\n const columnWidths = (0, calculateMaximumColumnWidths_1.calculateMaximumColumnWidths)(rows, spanningCellConfigs);\n return rows[0].map((_, columnIndex) => {\n return {\n alignment: 'left',\n paddingLeft: 1,\n paddingRight: 1,\n truncate: Number.POSITIVE_INFINITY,\n verticalAlignment: 'top',\n width: columnWidths[columnIndex],\n wrapWord: false,\n ...columnDefault,\n ...columns === null || columns === void 0 ? void 0 : columns[columnIndex],\n };\n });\n};\n/**\n * Makes a new configuration object out of the userConfig object\n * using default values for the missing configuration properties.\n */\nconst makeTableConfig = (rows, config = {}, injectedSpanningCellConfig) => {\n var _a, _b, _c, _d, _e;\n (0, validateConfig_1.validateConfig)('config.json', config);\n (0, validateSpanningCellConfig_1.validateSpanningCellConfig)(rows, (_a = config.spanningCells) !== null && _a !== void 0 ? _a : []);\n const spanningCellConfigs = (_b = injectedSpanningCellConfig !== null && injectedSpanningCellConfig !== void 0 ? injectedSpanningCellConfig : config.spanningCells) !== null && _b !== void 0 ? _b : [];\n const columnsConfig = makeColumnsConfig(rows, config.columns, config.columnDefault, spanningCellConfigs);\n const drawVerticalLine = (_c = config.drawVerticalLine) !== null && _c !== void 0 ? _c : (() => {\n return true;\n });\n const drawHorizontalLine = (_d = config.drawHorizontalLine) !== null && _d !== void 0 ? _d : (() => {\n return true;\n });\n return {\n ...config,\n border: (0, utils_1.makeBorderConfig)(config.border),\n columns: columnsConfig,\n drawHorizontalLine,\n drawVerticalLine,\n singleLine: (_e = config.singleLine) !== null && _e !== void 0 ? _e : false,\n spanningCellManager: (0, spanningCellManager_1.createSpanningCellManager)({\n columnsConfig,\n drawHorizontalLine,\n drawVerticalLine,\n rows,\n spanningCellConfigs,\n }),\n };\n};\nexports.makeTableConfig = makeTableConfig;\n//# sourceMappingURL=makeTableConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mapDataUsingRowHeights = exports.padCellVertically = void 0;\nconst utils_1 = require(\"./utils\");\nconst wrapCell_1 = require(\"./wrapCell\");\nconst createEmptyStrings = (length) => {\n return new Array(length).fill('');\n};\nconst padCellVertically = (lines, rowHeight, verticalAlignment) => {\n const availableLines = rowHeight - lines.length;\n if (verticalAlignment === 'top') {\n return [...lines, ...createEmptyStrings(availableLines)];\n }\n if (verticalAlignment === 'bottom') {\n return [...createEmptyStrings(availableLines), ...lines];\n }\n return [\n ...createEmptyStrings(Math.floor(availableLines / 2)),\n ...lines,\n ...createEmptyStrings(Math.ceil(availableLines / 2)),\n ];\n};\nexports.padCellVertically = padCellVertically;\nconst mapDataUsingRowHeights = (unmappedRows, rowHeights, config) => {\n const nColumns = unmappedRows[0].length;\n const mappedRows = unmappedRows.map((unmappedRow, unmappedRowIndex) => {\n const outputRowHeight = rowHeights[unmappedRowIndex];\n const outputRow = Array.from({ length: outputRowHeight }, () => {\n return new Array(nColumns).fill('');\n });\n unmappedRow.forEach((cell, cellIndex) => {\n var _a;\n const containingRange = (_a = config.spanningCellManager) === null || _a === void 0 ? void 0 : _a.getContainingRange({ col: cellIndex,\n row: unmappedRowIndex });\n if (containingRange) {\n containingRange.extractCellContent(unmappedRowIndex).forEach((cellLine, cellLineIndex) => {\n outputRow[cellLineIndex][cellIndex] = cellLine;\n });\n return;\n }\n const cellLines = (0, wrapCell_1.wrapCell)(cell, config.columns[cellIndex].width, config.columns[cellIndex].wrapWord);\n const paddedCellLines = (0, exports.padCellVertically)(cellLines, outputRowHeight, config.columns[cellIndex].verticalAlignment);\n paddedCellLines.forEach((cellLine, cellLineIndex) => {\n outputRow[cellLineIndex][cellIndex] = cellLine;\n });\n });\n return outputRow;\n });\n return (0, utils_1.flatten)(mappedRows);\n};\nexports.mapDataUsingRowHeights = mapDataUsingRowHeights;\n//# sourceMappingURL=mapDataUsingRowHeights.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.padTableData = exports.padString = void 0;\nconst padString = (input, paddingLeft, paddingRight) => {\n return ' '.repeat(paddingLeft) + input + ' '.repeat(paddingRight);\n};\nexports.padString = padString;\nconst padTableData = (rows, config) => {\n return rows.map((cells, rowIndex) => {\n return cells.map((cell, cellIndex) => {\n var _a;\n const containingRange = (_a = config.spanningCellManager) === null || _a === void 0 ? void 0 : _a.getContainingRange({ col: cellIndex,\n row: rowIndex }, { mapped: true });\n if (containingRange) {\n return cell;\n }\n const { paddingLeft, paddingRight } = config.columns[cellIndex];\n return (0, exports.padString)(cell, paddingLeft, paddingRight);\n });\n });\n};\nexports.padTableData = padTableData;\n//# sourceMappingURL=padTableData.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createSpanningCellManager = void 0;\nconst alignSpanningCell_1 = require(\"./alignSpanningCell\");\nconst calculateSpanningCellWidth_1 = require(\"./calculateSpanningCellWidth\");\nconst makeRangeConfig_1 = require(\"./makeRangeConfig\");\nconst utils_1 = require(\"./utils\");\nconst findRangeConfig = (cell, rangeConfigs) => {\n return rangeConfigs.find((rangeCoordinate) => {\n return (0, utils_1.isCellInRange)(cell, rangeCoordinate);\n });\n};\nconst getContainingRange = (rangeConfig, context) => {\n const width = (0, calculateSpanningCellWidth_1.calculateSpanningCellWidth)(rangeConfig, context);\n const wrappedContent = (0, alignSpanningCell_1.wrapRangeContent)(rangeConfig, width, context);\n const alignedContent = (0, alignSpanningCell_1.alignVerticalRangeContent)(rangeConfig, wrappedContent, context);\n const getCellContent = (rowIndex) => {\n const { topLeft } = rangeConfig;\n const { drawHorizontalLine, rowHeights } = context;\n const totalWithinHorizontalBorderHeight = rowIndex - topLeft.row;\n const totalHiddenHorizontalBorderHeight = (0, utils_1.sequence)(topLeft.row + 1, rowIndex).filter((index) => {\n /* istanbul ignore next */\n return !(drawHorizontalLine === null || drawHorizontalLine === void 0 ? void 0 : drawHorizontalLine(index, rowHeights.length));\n }).length;\n const offset = (0, utils_1.sumArray)(rowHeights.slice(topLeft.row, rowIndex)) + totalWithinHorizontalBorderHeight - totalHiddenHorizontalBorderHeight;\n return alignedContent.slice(offset, offset + rowHeights[rowIndex]);\n };\n const getBorderContent = (borderIndex) => {\n const { topLeft } = rangeConfig;\n const offset = (0, utils_1.sumArray)(context.rowHeights.slice(topLeft.row, borderIndex)) + (borderIndex - topLeft.row - 1);\n return alignedContent[offset];\n };\n return {\n ...rangeConfig,\n extractBorderContent: getBorderContent,\n extractCellContent: getCellContent,\n height: wrappedContent.length,\n width,\n };\n};\nconst inSameRange = (cell1, cell2, ranges) => {\n const range1 = findRangeConfig(cell1, ranges);\n const range2 = findRangeConfig(cell2, ranges);\n if (range1 && range2) {\n return (0, utils_1.areCellEqual)(range1.topLeft, range2.topLeft);\n }\n return false;\n};\nconst hashRange = (range) => {\n const { row, col } = range.topLeft;\n return `${row}/${col}`;\n};\nconst createSpanningCellManager = (parameters) => {\n const { spanningCellConfigs, columnsConfig } = parameters;\n const ranges = spanningCellConfigs.map((config) => {\n return (0, makeRangeConfig_1.makeRangeConfig)(config, columnsConfig);\n });\n const rangeCache = {};\n let rowHeights = [];\n return { getContainingRange: (cell, options) => {\n var _a;\n const originalRow = (options === null || options === void 0 ? void 0 : options.mapped) ? (0, utils_1.findOriginalRowIndex)(rowHeights, cell.row) : cell.row;\n const range = findRangeConfig({ ...cell,\n row: originalRow }, ranges);\n if (!range) {\n return undefined;\n }\n if (rowHeights.length === 0) {\n return getContainingRange(range, { ...parameters,\n rowHeights });\n }\n const hash = hashRange(range);\n (_a = rangeCache[hash]) !== null && _a !== void 0 ? _a : (rangeCache[hash] = getContainingRange(range, { ...parameters,\n rowHeights }));\n return rangeCache[hash];\n },\n inSameRange: (cell1, cell2) => {\n return inSameRange(cell1, cell2, ranges);\n },\n rowHeights,\n setRowHeights: (_rowHeights) => {\n rowHeights = _rowHeights;\n } };\n};\nexports.createSpanningCellManager = createSpanningCellManager;\n//# sourceMappingURL=spanningCellManager.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringifyTableData = void 0;\nconst utils_1 = require(\"./utils\");\nconst stringifyTableData = (rows) => {\n return rows.map((cells) => {\n return cells.map((cell) => {\n return (0, utils_1.normalizeString)(String(cell));\n });\n });\n};\nexports.stringifyTableData = stringifyTableData;\n//# sourceMappingURL=stringifyTableData.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.table = void 0;\nconst alignTableData_1 = require(\"./alignTableData\");\nconst calculateOutputColumnWidths_1 = require(\"./calculateOutputColumnWidths\");\nconst calculateRowHeights_1 = require(\"./calculateRowHeights\");\nconst drawTable_1 = require(\"./drawTable\");\nconst injectHeaderConfig_1 = require(\"./injectHeaderConfig\");\nconst makeTableConfig_1 = require(\"./makeTableConfig\");\nconst mapDataUsingRowHeights_1 = require(\"./mapDataUsingRowHeights\");\nconst padTableData_1 = require(\"./padTableData\");\nconst stringifyTableData_1 = require(\"./stringifyTableData\");\nconst truncateTableData_1 = require(\"./truncateTableData\");\nconst utils_1 = require(\"./utils\");\nconst validateTableData_1 = require(\"./validateTableData\");\nconst table = (data, userConfig = {}) => {\n (0, validateTableData_1.validateTableData)(data);\n let rows = (0, stringifyTableData_1.stringifyTableData)(data);\n const [injectedRows, injectedSpanningCellConfig] = (0, injectHeaderConfig_1.injectHeaderConfig)(rows, userConfig);\n const config = (0, makeTableConfig_1.makeTableConfig)(injectedRows, userConfig, injectedSpanningCellConfig);\n rows = (0, truncateTableData_1.truncateTableData)(injectedRows, (0, utils_1.extractTruncates)(config));\n const rowHeights = (0, calculateRowHeights_1.calculateRowHeights)(rows, config);\n config.spanningCellManager.setRowHeights(rowHeights);\n rows = (0, mapDataUsingRowHeights_1.mapDataUsingRowHeights)(rows, rowHeights, config);\n rows = (0, alignTableData_1.alignTableData)(rows, config);\n rows = (0, padTableData_1.padTableData)(rows, config);\n const outputColumnWidths = (0, calculateOutputColumnWidths_1.calculateOutputColumnWidths)(config);\n return (0, drawTable_1.drawTable)(rows, outputColumnWidths, rowHeights, config);\n};\nexports.table = table;\n//# sourceMappingURL=table.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.truncateTableData = exports.truncateString = void 0;\nconst lodash_truncate_1 = __importDefault(require(\"lodash.truncate\"));\nconst truncateString = (input, length) => {\n return (0, lodash_truncate_1.default)(input, { length,\n omission: '…' });\n};\nexports.truncateString = truncateString;\n/**\n * @todo Make it work with ASCII content.\n */\nconst truncateTableData = (rows, truncates) => {\n return rows.map((cells) => {\n return cells.map((cell, cellIndex) => {\n return (0, exports.truncateString)(cell, truncates[cellIndex]);\n });\n });\n};\nexports.truncateTableData = truncateTableData;\n//# sourceMappingURL=truncateTableData.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=api.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isCellInRange = exports.areCellEqual = exports.calculateRangeCoordinate = exports.findOriginalRowIndex = exports.flatten = exports.extractTruncates = exports.sumArray = exports.sequence = exports.distributeUnevenly = exports.countSpaceSequence = exports.groupBySizes = exports.makeBorderConfig = exports.splitAnsi = exports.normalizeString = void 0;\nconst slice_ansi_1 = __importDefault(require(\"slice-ansi\"));\nconst string_width_1 = __importDefault(require(\"string-width\"));\nconst strip_ansi_1 = __importDefault(require(\"strip-ansi\"));\nconst getBorderCharacters_1 = require(\"./getBorderCharacters\");\n/**\n * Converts Windows-style newline to Unix-style\n *\n * @internal\n */\nconst normalizeString = (input) => {\n return input.replace(/\\r\\n/g, '\\n');\n};\nexports.normalizeString = normalizeString;\n/**\n * Splits ansi string by newlines\n *\n * @internal\n */\nconst splitAnsi = (input) => {\n const lengths = (0, strip_ansi_1.default)(input).split('\\n').map(string_width_1.default);\n const result = [];\n let startIndex = 0;\n lengths.forEach((length) => {\n result.push(length === 0 ? '' : (0, slice_ansi_1.default)(input, startIndex, startIndex + length));\n // Plus 1 for the newline character itself\n startIndex += length + 1;\n });\n return result;\n};\nexports.splitAnsi = splitAnsi;\n/**\n * Merges user provided border characters with the default border (\"honeywell\") characters.\n *\n * @internal\n */\nconst makeBorderConfig = (border) => {\n return {\n ...(0, getBorderCharacters_1.getBorderCharacters)('honeywell'),\n ...border,\n };\n};\nexports.makeBorderConfig = makeBorderConfig;\n/**\n * Groups the array into sub-arrays by sizes.\n *\n * @internal\n * @example\n * groupBySizes(['a', 'b', 'c', 'd', 'e'], [2, 1, 2]) = [ ['a', 'b'], ['c'], ['d', 'e'] ]\n */\nconst groupBySizes = (array, sizes) => {\n let startIndex = 0;\n return sizes.map((size) => {\n const group = array.slice(startIndex, startIndex + size);\n startIndex += size;\n return group;\n });\n};\nexports.groupBySizes = groupBySizes;\n/**\n * Counts the number of continuous spaces in a string\n *\n * @internal\n * @example\n * countGroupSpaces('a bc de f') = 3\n */\nconst countSpaceSequence = (input) => {\n var _a, _b;\n return (_b = (_a = input.match(/\\s+/g)) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0;\n};\nexports.countSpaceSequence = countSpaceSequence;\n/**\n * Creates the non-increasing number array given sum and length\n * whose the difference between maximum and minimum is not greater than 1\n *\n * @internal\n * @example\n * distributeUnevenly(6, 3) = [2, 2, 2]\n * distributeUnevenly(8, 3) = [3, 3, 2]\n */\nconst distributeUnevenly = (sum, length) => {\n const result = Array.from({ length }).fill(Math.floor(sum / length));\n return result.map((element, index) => {\n return element + (index < sum % length ? 1 : 0);\n });\n};\nexports.distributeUnevenly = distributeUnevenly;\nconst sequence = (start, end) => {\n return Array.from({ length: end - start + 1 }, (_, index) => {\n return index + start;\n });\n};\nexports.sequence = sequence;\nconst sumArray = (array) => {\n return array.reduce((accumulator, element) => {\n return accumulator + element;\n }, 0);\n};\nexports.sumArray = sumArray;\nconst extractTruncates = (config) => {\n return config.columns.map(({ truncate }) => {\n return truncate;\n });\n};\nexports.extractTruncates = extractTruncates;\nconst flatten = (array) => {\n return [].concat(...array);\n};\nexports.flatten = flatten;\nconst findOriginalRowIndex = (mappedRowHeights, mappedRowIndex) => {\n const rowIndexMapping = (0, exports.flatten)(mappedRowHeights.map((height, index) => {\n return Array.from({ length: height }, () => {\n return index;\n });\n }));\n return rowIndexMapping[mappedRowIndex];\n};\nexports.findOriginalRowIndex = findOriginalRowIndex;\nconst calculateRangeCoordinate = (spanningCellConfig) => {\n const { row, col, colSpan = 1, rowSpan = 1 } = spanningCellConfig;\n return { bottomRight: { col: col + colSpan - 1,\n row: row + rowSpan - 1 },\n topLeft: { col,\n row } };\n};\nexports.calculateRangeCoordinate = calculateRangeCoordinate;\nconst areCellEqual = (cell1, cell2) => {\n return cell1.row === cell2.row && cell1.col === cell2.col;\n};\nexports.areCellEqual = areCellEqual;\nconst isCellInRange = (cell, { topLeft, bottomRight }) => {\n return (topLeft.row <= cell.row &&\n cell.row <= bottomRight.row &&\n topLeft.col <= cell.col &&\n cell.col <= bottomRight.col);\n};\nexports.isCellInRange = isCellInRange;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateConfig = void 0;\nconst validators_1 = __importDefault(require(\"./generated/validators\"));\nconst validateConfig = (schemaId, config) => {\n const validate = validators_1.default[schemaId];\n if (!validate(config) && validate.errors) {\n // eslint-disable-next-line promise/prefer-await-to-callbacks\n const errors = validate.errors.map((error) => {\n return {\n message: error.message,\n params: error.params,\n schemaPath: error.schemaPath,\n };\n });\n /* eslint-disable no-console */\n console.log('config', config);\n console.log('errors', errors);\n /* eslint-enable no-console */\n throw new Error('Invalid config.');\n }\n};\nexports.validateConfig = validateConfig;\n//# sourceMappingURL=validateConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateSpanningCellConfig = void 0;\nconst utils_1 = require(\"./utils\");\nconst inRange = (start, end, value) => {\n return start <= value && value <= end;\n};\nconst validateSpanningCellConfig = (rows, configs) => {\n const [nRow, nCol] = [rows.length, rows[0].length];\n configs.forEach((config, configIndex) => {\n const { colSpan, rowSpan } = config;\n if (colSpan === undefined && rowSpan === undefined) {\n throw new Error(`Expect at least colSpan or rowSpan is provided in config.spanningCells[${configIndex}]`);\n }\n if (colSpan !== undefined && colSpan < 1) {\n throw new Error(`Expect colSpan is not equal zero, instead got: ${colSpan} in config.spanningCells[${configIndex}]`);\n }\n if (rowSpan !== undefined && rowSpan < 1) {\n throw new Error(`Expect rowSpan is not equal zero, instead got: ${rowSpan} in config.spanningCells[${configIndex}]`);\n }\n });\n const rangeCoordinates = configs.map(utils_1.calculateRangeCoordinate);\n rangeCoordinates.forEach(({ topLeft, bottomRight }, rangeIndex) => {\n if (!inRange(0, nCol - 1, topLeft.col) ||\n !inRange(0, nRow - 1, topLeft.row) ||\n !inRange(0, nCol - 1, bottomRight.col) ||\n !inRange(0, nRow - 1, bottomRight.row)) {\n throw new Error(`Some cells in config.spanningCells[${rangeIndex}] are out of the table`);\n }\n });\n const configOccupy = Array.from({ length: nRow }, () => {\n return Array.from({ length: nCol });\n });\n rangeCoordinates.forEach(({ topLeft, bottomRight }, rangeIndex) => {\n (0, utils_1.sequence)(topLeft.row, bottomRight.row).forEach((row) => {\n (0, utils_1.sequence)(topLeft.col, bottomRight.col).forEach((col) => {\n if (configOccupy[row][col] !== undefined) {\n throw new Error(`Spanning cells in config.spanningCells[${configOccupy[row][col]}] and config.spanningCells[${rangeIndex}] are overlap each other`);\n }\n configOccupy[row][col] = rangeIndex;\n });\n });\n });\n};\nexports.validateSpanningCellConfig = validateSpanningCellConfig;\n//# sourceMappingURL=validateSpanningCellConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateTableData = void 0;\nconst utils_1 = require(\"./utils\");\nconst validateTableData = (rows) => {\n if (!Array.isArray(rows)) {\n throw new TypeError('Table data must be an array.');\n }\n if (rows.length === 0) {\n throw new Error('Table must define at least one row.');\n }\n if (rows[0].length === 0) {\n throw new Error('Table must define at least one column.');\n }\n const columnNumber = rows[0].length;\n for (const row of rows) {\n if (!Array.isArray(row)) {\n throw new TypeError('Table row data must be an array.');\n }\n if (row.length !== columnNumber) {\n throw new Error('Table must have a consistent number of cells.');\n }\n for (const cell of row) {\n // eslint-disable-next-line no-control-regex\n if (/[\\u0001-\\u0006\\u0008\\u0009\\u000B-\\u001A]/.test((0, utils_1.normalizeString)(String(cell)))) {\n throw new Error('Table data must not contain control characters.');\n }\n }\n }\n};\nexports.validateTableData = validateTableData;\n//# sourceMappingURL=validateTableData.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapCell = void 0;\nconst utils_1 = require(\"./utils\");\nconst wrapString_1 = require(\"./wrapString\");\nconst wrapWord_1 = require(\"./wrapWord\");\n/**\n * Wrap a single cell value into a list of lines\n *\n * Always wraps on newlines, for the remainder uses either word or string wrapping\n * depending on user configuration.\n *\n */\nconst wrapCell = (cellValue, cellWidth, useWrapWord) => {\n // First split on literal newlines\n const cellLines = (0, utils_1.splitAnsi)(cellValue);\n // Then iterate over the list and word-wrap every remaining line if necessary.\n for (let lineNr = 0; lineNr < cellLines.length;) {\n let lineChunks;\n if (useWrapWord) {\n lineChunks = (0, wrapWord_1.wrapWord)(cellLines[lineNr], cellWidth);\n }\n else {\n lineChunks = (0, wrapString_1.wrapString)(cellLines[lineNr], cellWidth);\n }\n // Replace our original array element with whatever the wrapping returned\n cellLines.splice(lineNr, 1, ...lineChunks);\n lineNr += lineChunks.length;\n }\n return cellLines;\n};\nexports.wrapCell = wrapCell;\n//# sourceMappingURL=wrapCell.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapString = void 0;\nconst slice_ansi_1 = __importDefault(require(\"slice-ansi\"));\nconst string_width_1 = __importDefault(require(\"string-width\"));\n/**\n * Creates an array of strings split into groups the length of size.\n * This function works with strings that contain ASCII characters.\n *\n * wrapText is different from would-be \"chunk\" implementation\n * in that whitespace characters that occur on a chunk size limit are trimmed.\n *\n */\nconst wrapString = (subject, size) => {\n let subjectSlice = subject;\n const chunks = [];\n do {\n chunks.push((0, slice_ansi_1.default)(subjectSlice, 0, size));\n subjectSlice = (0, slice_ansi_1.default)(subjectSlice, size).trim();\n } while ((0, string_width_1.default)(subjectSlice));\n return chunks;\n};\nexports.wrapString = wrapString;\n//# sourceMappingURL=wrapString.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapWord = void 0;\nconst slice_ansi_1 = __importDefault(require(\"slice-ansi\"));\nconst strip_ansi_1 = __importDefault(require(\"strip-ansi\"));\nconst calculateStringLengths = (input, size) => {\n let subject = (0, strip_ansi_1.default)(input);\n const chunks = [];\n // https://regex101.com/r/gY5kZ1/1\n const re = new RegExp('(^.{1,' + String(Math.max(size, 1)) + '}(\\\\s+|$))|(^.{1,' + String(Math.max(size - 1, 1)) + '}(\\\\\\\\|/|_|\\\\.|,|;|-))');\n do {\n let chunk;\n const match = re.exec(subject);\n if (match) {\n chunk = match[0];\n subject = subject.slice(chunk.length);\n const trimmedLength = chunk.trim().length;\n const offset = chunk.length - trimmedLength;\n chunks.push([trimmedLength, offset]);\n }\n else {\n chunk = subject.slice(0, size);\n subject = subject.slice(size);\n chunks.push([chunk.length, 0]);\n }\n } while (subject.length);\n return chunks;\n};\nconst wrapWord = (input, size) => {\n const result = [];\n let startIndex = 0;\n calculateStringLengths(input, size).forEach(([length, offset]) => {\n result.push((0, slice_ansi_1.default)(input, startIndex, startIndex + length));\n startIndex += length + offset;\n });\n return result;\n};\nexports.wrapWord = wrapWord;\n//# sourceMappingURL=wrapWord.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// https://github.com/ajv-validator/ajv/issues/889\nconst equal = require(\"fast-deep-equal\");\nequal.code = 'require(\"ajv/dist/runtime/equal\").default';\nexports.default = equal;\n//# sourceMappingURL=equal.js.map","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, Symbol, Reflect, Promise, SuppressedError */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __esDecorate;\r\nvar __runInitializers;\r\nvar __propKey;\r\nvar __setFunctionName;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __classPrivateFieldIn;\r\nvar __createBinding;\r\nvar __addDisposableResource;\r\nvar __disposeResources;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __esDecorate = function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n };\r\n\r\n __runInitializers = function (thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n };\r\n\r\n __propKey = function (x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n };\r\n\r\n __setFunctionName = function (f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n };\r\n\r\n __classPrivateFieldIn = function (state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n };\r\n\r\n __addDisposableResource = function (env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n };\r\n\r\n var _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n };\r\n\r\n __disposeResources = function (env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__esDecorate\", __esDecorate);\r\n exporter(\"__runInitializers\", __runInitializers);\r\n exporter(\"__propKey\", __propKey);\r\n exporter(\"__setFunctionName\", __setFunctionName);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n exporter(\"__classPrivateFieldIn\", __classPrivateFieldIn);\r\n exporter(\"__addDisposableResource\", __addDisposableResource);\r\n exporter(\"__disposeResources\", __disposeResources);\r\n});\r\n","module.exports = require('./lib/tunnel');\n","'use strict';\n\nvar net = require('net');\nvar tls = require('tls');\nvar http = require('http');\nvar https = require('https');\nvar events = require('events');\nvar assert = require('assert');\nvar util = require('util');\n\n\nexports.httpOverHttp = httpOverHttp;\nexports.httpsOverHttp = httpsOverHttp;\nexports.httpOverHttps = httpOverHttps;\nexports.httpsOverHttps = httpsOverHttps;\n\n\nfunction httpOverHttp(options) {\n var agent = new TunnelingAgent(options);\n agent.request = http.request;\n return agent;\n}\n\nfunction httpsOverHttp(options) {\n var agent = new TunnelingAgent(options);\n agent.request = http.request;\n agent.createSocket = createSecureSocket;\n agent.defaultPort = 443;\n return agent;\n}\n\nfunction httpOverHttps(options) {\n var agent = new TunnelingAgent(options);\n agent.request = https.request;\n return agent;\n}\n\nfunction httpsOverHttps(options) {\n var agent = new TunnelingAgent(options);\n agent.request = https.request;\n agent.createSocket = createSecureSocket;\n agent.defaultPort = 443;\n return agent;\n}\n\n\nfunction TunnelingAgent(options) {\n var self = this;\n self.options = options || {};\n self.proxyOptions = self.options.proxy || {};\n self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets;\n self.requests = [];\n self.sockets = [];\n\n self.on('free', function onFree(socket, host, port, localAddress) {\n var options = toOptions(host, port, localAddress);\n for (var i = 0, len = self.requests.length; i < len; ++i) {\n var pending = self.requests[i];\n if (pending.host === options.host && pending.port === options.port) {\n // Detect the request to connect same origin server,\n // reuse the connection.\n self.requests.splice(i, 1);\n pending.request.onSocket(socket);\n return;\n }\n }\n socket.destroy();\n self.removeSocket(socket);\n });\n}\nutil.inherits(TunnelingAgent, events.EventEmitter);\n\nTunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) {\n var self = this;\n var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress));\n\n if (self.sockets.length >= this.maxSockets) {\n // We are over limit so we'll add it to the queue.\n self.requests.push(options);\n return;\n }\n\n // If we are under maxSockets create a new one.\n self.createSocket(options, function(socket) {\n socket.on('free', onFree);\n socket.on('close', onCloseOrRemove);\n socket.on('agentRemove', onCloseOrRemove);\n req.onSocket(socket);\n\n function onFree() {\n self.emit('free', socket, options);\n }\n\n function onCloseOrRemove(err) {\n self.removeSocket(socket);\n socket.removeListener('free', onFree);\n socket.removeListener('close', onCloseOrRemove);\n socket.removeListener('agentRemove', onCloseOrRemove);\n }\n });\n};\n\nTunnelingAgent.prototype.createSocket = function createSocket(options, cb) {\n var self = this;\n var placeholder = {};\n self.sockets.push(placeholder);\n\n var connectOptions = mergeOptions({}, self.proxyOptions, {\n method: 'CONNECT',\n path: options.host + ':' + options.port,\n agent: false,\n headers: {\n host: options.host + ':' + options.port\n }\n });\n if (options.localAddress) {\n connectOptions.localAddress = options.localAddress;\n }\n if (connectOptions.proxyAuth) {\n connectOptions.headers = connectOptions.headers || {};\n connectOptions.headers['Proxy-Authorization'] = 'Basic ' +\n new Buffer(connectOptions.proxyAuth).toString('base64');\n }\n\n debug('making CONNECT request');\n var connectReq = self.request(connectOptions);\n connectReq.useChunkedEncodingByDefault = false; // for v0.6\n connectReq.once('response', onResponse); // for v0.6\n connectReq.once('upgrade', onUpgrade); // for v0.6\n connectReq.once('connect', onConnect); // for v0.7 or later\n connectReq.once('error', onError);\n connectReq.end();\n\n function onResponse(res) {\n // Very hacky. This is necessary to avoid http-parser leaks.\n res.upgrade = true;\n }\n\n function onUpgrade(res, socket, head) {\n // Hacky.\n process.nextTick(function() {\n onConnect(res, socket, head);\n });\n }\n\n function onConnect(res, socket, head) {\n connectReq.removeAllListeners();\n socket.removeAllListeners();\n\n if (res.statusCode !== 200) {\n debug('tunneling socket could not be established, statusCode=%d',\n res.statusCode);\n socket.destroy();\n var error = new Error('tunneling socket could not be established, ' +\n 'statusCode=' + res.statusCode);\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n return;\n }\n if (head.length > 0) {\n debug('got illegal response body from proxy');\n socket.destroy();\n var error = new Error('got illegal response body from proxy');\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n return;\n }\n debug('tunneling connection has established');\n self.sockets[self.sockets.indexOf(placeholder)] = socket;\n return cb(socket);\n }\n\n function onError(cause) {\n connectReq.removeAllListeners();\n\n debug('tunneling socket could not be established, cause=%s\\n',\n cause.message, cause.stack);\n var error = new Error('tunneling socket could not be established, ' +\n 'cause=' + cause.message);\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n }\n};\n\nTunnelingAgent.prototype.removeSocket = function removeSocket(socket) {\n var pos = this.sockets.indexOf(socket)\n if (pos === -1) {\n return;\n }\n this.sockets.splice(pos, 1);\n\n var pending = this.requests.shift();\n if (pending) {\n // If we have pending requests and a socket gets closed a new one\n // needs to be created to take over in the pool for the one that closed.\n this.createSocket(pending, function(socket) {\n pending.request.onSocket(socket);\n });\n }\n};\n\nfunction createSecureSocket(options, cb) {\n var self = this;\n TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {\n var hostHeader = options.request.getHeader('host');\n var tlsOptions = mergeOptions({}, self.options, {\n socket: socket,\n servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host\n });\n\n // 0 is dummy port for v0.6\n var secureSocket = tls.connect(0, tlsOptions);\n self.sockets[self.sockets.indexOf(socket)] = secureSocket;\n cb(secureSocket);\n });\n}\n\n\nfunction toOptions(host, port, localAddress) {\n if (typeof host === 'string') { // since v0.10\n return {\n host: host,\n port: port,\n localAddress: localAddress\n };\n }\n return host; // for v0.11 or later\n}\n\nfunction mergeOptions(target) {\n for (var i = 1, len = arguments.length; i < len; ++i) {\n var overrides = arguments[i];\n if (typeof overrides === 'object') {\n var keys = Object.keys(overrides);\n for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {\n var k = keys[j];\n if (overrides[k] !== undefined) {\n target[k] = overrides[k];\n }\n }\n }\n }\n return target;\n}\n\n\nvar debug;\nif (process.env.NODE_DEBUG && /\\btunnel\\b/.test(process.env.NODE_DEBUG)) {\n debug = function() {\n var args = Array.prototype.slice.call(arguments);\n if (typeof args[0] === 'string') {\n args[0] = 'TUNNEL: ' + args[0];\n } else {\n args.unshift('TUNNEL:');\n }\n console.error.apply(console, args);\n }\n} else {\n debug = function() {};\n}\nexports.debug = debug; // for test\n","'use strict'\n\nconst Client = require('./lib/client')\nconst Dispatcher = require('./lib/dispatcher')\nconst errors = require('./lib/core/errors')\nconst Pool = require('./lib/pool')\nconst BalancedPool = require('./lib/balanced-pool')\nconst Agent = require('./lib/agent')\nconst util = require('./lib/core/util')\nconst { InvalidArgumentError } = errors\nconst api = require('./lib/api')\nconst buildConnector = require('./lib/core/connect')\nconst MockClient = require('./lib/mock/mock-client')\nconst MockAgent = require('./lib/mock/mock-agent')\nconst MockPool = require('./lib/mock/mock-pool')\nconst mockErrors = require('./lib/mock/mock-errors')\nconst ProxyAgent = require('./lib/proxy-agent')\nconst { getGlobalDispatcher, setGlobalDispatcher } = require('./lib/global')\nconst DecoratorHandler = require('./lib/handler/DecoratorHandler')\nconst RedirectHandler = require('./lib/handler/RedirectHandler')\nconst createRedirectInterceptor = require('./lib/interceptor/redirectInterceptor')\n\nlet hasCrypto\ntry {\n require('crypto')\n hasCrypto = true\n} catch {\n hasCrypto = false\n}\n\nObject.assign(Dispatcher.prototype, api)\n\nmodule.exports.Dispatcher = Dispatcher\nmodule.exports.Client = Client\nmodule.exports.Pool = Pool\nmodule.exports.BalancedPool = BalancedPool\nmodule.exports.Agent = Agent\nmodule.exports.ProxyAgent = ProxyAgent\n\nmodule.exports.DecoratorHandler = DecoratorHandler\nmodule.exports.RedirectHandler = RedirectHandler\nmodule.exports.createRedirectInterceptor = createRedirectInterceptor\n\nmodule.exports.buildConnector = buildConnector\nmodule.exports.errors = errors\n\nfunction makeDispatcher (fn) {\n return (url, opts, handler) => {\n if (typeof opts === 'function') {\n handler = opts\n opts = null\n }\n\n if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) {\n throw new InvalidArgumentError('invalid url')\n }\n\n if (opts != null && typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (opts && opts.path != null) {\n if (typeof opts.path !== 'string') {\n throw new InvalidArgumentError('invalid opts.path')\n }\n\n let path = opts.path\n if (!opts.path.startsWith('/')) {\n path = `/${path}`\n }\n\n url = new URL(util.parseOrigin(url).origin + path)\n } else {\n if (!opts) {\n opts = typeof url === 'object' ? url : {}\n }\n\n url = util.parseURL(url)\n }\n\n const { agent, dispatcher = getGlobalDispatcher() } = opts\n\n if (agent) {\n throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?')\n }\n\n return fn.call(dispatcher, {\n ...opts,\n origin: url.origin,\n path: url.search ? `${url.pathname}${url.search}` : url.pathname,\n method: opts.method || (opts.body ? 'PUT' : 'GET')\n }, handler)\n }\n}\n\nmodule.exports.setGlobalDispatcher = setGlobalDispatcher\nmodule.exports.getGlobalDispatcher = getGlobalDispatcher\n\nif (util.nodeMajor > 16 || (util.nodeMajor === 16 && util.nodeMinor >= 8)) {\n let fetchImpl = null\n module.exports.fetch = async function fetch (resource) {\n if (!fetchImpl) {\n fetchImpl = require('./lib/fetch').fetch\n }\n\n try {\n return await fetchImpl(...arguments)\n } catch (err) {\n if (typeof err === 'object') {\n Error.captureStackTrace(err, this)\n }\n\n throw err\n }\n }\n module.exports.Headers = require('./lib/fetch/headers').Headers\n module.exports.Response = require('./lib/fetch/response').Response\n module.exports.Request = require('./lib/fetch/request').Request\n module.exports.FormData = require('./lib/fetch/formdata').FormData\n module.exports.File = require('./lib/fetch/file').File\n module.exports.FileReader = require('./lib/fileapi/filereader').FileReader\n\n const { setGlobalOrigin, getGlobalOrigin } = require('./lib/fetch/global')\n\n module.exports.setGlobalOrigin = setGlobalOrigin\n module.exports.getGlobalOrigin = getGlobalOrigin\n\n const { CacheStorage } = require('./lib/cache/cachestorage')\n const { kConstruct } = require('./lib/cache/symbols')\n\n // Cache & CacheStorage are tightly coupled with fetch. Even if it may run\n // in an older version of Node, it doesn't have any use without fetch.\n module.exports.caches = new CacheStorage(kConstruct)\n}\n\nif (util.nodeMajor >= 16) {\n const { deleteCookie, getCookies, getSetCookies, setCookie } = require('./lib/cookies')\n\n module.exports.deleteCookie = deleteCookie\n module.exports.getCookies = getCookies\n module.exports.getSetCookies = getSetCookies\n module.exports.setCookie = setCookie\n\n const { parseMIMEType, serializeAMimeType } = require('./lib/fetch/dataURL')\n\n module.exports.parseMIMEType = parseMIMEType\n module.exports.serializeAMimeType = serializeAMimeType\n}\n\nif (util.nodeMajor >= 18 && hasCrypto) {\n const { WebSocket } = require('./lib/websocket/websocket')\n\n module.exports.WebSocket = WebSocket\n}\n\nmodule.exports.request = makeDispatcher(api.request)\nmodule.exports.stream = makeDispatcher(api.stream)\nmodule.exports.pipeline = makeDispatcher(api.pipeline)\nmodule.exports.connect = makeDispatcher(api.connect)\nmodule.exports.upgrade = makeDispatcher(api.upgrade)\n\nmodule.exports.MockClient = MockClient\nmodule.exports.MockPool = MockPool\nmodule.exports.MockAgent = MockAgent\nmodule.exports.mockErrors = mockErrors\n","'use strict'\n\nconst { InvalidArgumentError } = require('./core/errors')\nconst { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require('./core/symbols')\nconst DispatcherBase = require('./dispatcher-base')\nconst Pool = require('./pool')\nconst Client = require('./client')\nconst util = require('./core/util')\nconst createRedirectInterceptor = require('./interceptor/redirectInterceptor')\nconst { WeakRef, FinalizationRegistry } = require('./compat/dispatcher-weakref')()\n\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kMaxRedirections = Symbol('maxRedirections')\nconst kOnDrain = Symbol('onDrain')\nconst kFactory = Symbol('factory')\nconst kFinalizer = Symbol('finalizer')\nconst kOptions = Symbol('options')\n\nfunction defaultFactory (origin, opts) {\n return opts && opts.connections === 1\n ? new Client(origin, opts)\n : new Pool(origin, opts)\n}\n\nclass Agent extends DispatcherBase {\n constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) {\n super()\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (!Number.isInteger(maxRedirections) || maxRedirections < 0) {\n throw new InvalidArgumentError('maxRedirections must be a positive number')\n }\n\n if (connect && typeof connect !== 'function') {\n connect = { ...connect }\n }\n\n this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent)\n ? options.interceptors.Agent\n : [createRedirectInterceptor({ maxRedirections })]\n\n this[kOptions] = { ...util.deepClone(options), connect }\n this[kOptions].interceptors = options.interceptors\n ? { ...options.interceptors }\n : undefined\n this[kMaxRedirections] = maxRedirections\n this[kFactory] = factory\n this[kClients] = new Map()\n this[kFinalizer] = new FinalizationRegistry(/* istanbul ignore next: gc is undeterministic */ key => {\n const ref = this[kClients].get(key)\n if (ref !== undefined && ref.deref() === undefined) {\n this[kClients].delete(key)\n }\n })\n\n const agent = this\n\n this[kOnDrain] = (origin, targets) => {\n agent.emit('drain', origin, [agent, ...targets])\n }\n\n this[kOnConnect] = (origin, targets) => {\n agent.emit('connect', origin, [agent, ...targets])\n }\n\n this[kOnDisconnect] = (origin, targets, err) => {\n agent.emit('disconnect', origin, [agent, ...targets], err)\n }\n\n this[kOnConnectionError] = (origin, targets, err) => {\n agent.emit('connectionError', origin, [agent, ...targets], err)\n }\n }\n\n get [kRunning] () {\n let ret = 0\n for (const ref of this[kClients].values()) {\n const client = ref.deref()\n /* istanbul ignore next: gc is undeterministic */\n if (client) {\n ret += client[kRunning]\n }\n }\n return ret\n }\n\n [kDispatch] (opts, handler) {\n let key\n if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) {\n key = String(opts.origin)\n } else {\n throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.')\n }\n\n const ref = this[kClients].get(key)\n\n let dispatcher = ref ? ref.deref() : null\n if (!dispatcher) {\n dispatcher = this[kFactory](opts.origin, this[kOptions])\n .on('drain', this[kOnDrain])\n .on('connect', this[kOnConnect])\n .on('disconnect', this[kOnDisconnect])\n .on('connectionError', this[kOnConnectionError])\n\n this[kClients].set(key, new WeakRef(dispatcher))\n this[kFinalizer].register(dispatcher, key)\n }\n\n return dispatcher.dispatch(opts, handler)\n }\n\n async [kClose] () {\n const closePromises = []\n for (const ref of this[kClients].values()) {\n const client = ref.deref()\n /* istanbul ignore else: gc is undeterministic */\n if (client) {\n closePromises.push(client.close())\n }\n }\n\n await Promise.all(closePromises)\n }\n\n async [kDestroy] (err) {\n const destroyPromises = []\n for (const ref of this[kClients].values()) {\n const client = ref.deref()\n /* istanbul ignore else: gc is undeterministic */\n if (client) {\n destroyPromises.push(client.destroy(err))\n }\n }\n\n await Promise.all(destroyPromises)\n }\n}\n\nmodule.exports = Agent\n","const { addAbortListener } = require('../core/util')\nconst { RequestAbortedError } = require('../core/errors')\n\nconst kListener = Symbol('kListener')\nconst kSignal = Symbol('kSignal')\n\nfunction abort (self) {\n if (self.abort) {\n self.abort()\n } else {\n self.onError(new RequestAbortedError())\n }\n}\n\nfunction addSignal (self, signal) {\n self[kSignal] = null\n self[kListener] = null\n\n if (!signal) {\n return\n }\n\n if (signal.aborted) {\n abort(self)\n return\n }\n\n self[kSignal] = signal\n self[kListener] = () => {\n abort(self)\n }\n\n addAbortListener(self[kSignal], self[kListener])\n}\n\nfunction removeSignal (self) {\n if (!self[kSignal]) {\n return\n }\n\n if ('removeEventListener' in self[kSignal]) {\n self[kSignal].removeEventListener('abort', self[kListener])\n } else {\n self[kSignal].removeListener('abort', self[kListener])\n }\n\n self[kSignal] = null\n self[kListener] = null\n}\n\nmodule.exports = {\n addSignal,\n removeSignal\n}\n","'use strict'\n\nconst { AsyncResource } = require('async_hooks')\nconst { InvalidArgumentError, RequestAbortedError, SocketError } = require('../core/errors')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass ConnectHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n const { signal, opaque, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n super('UNDICI_CONNECT')\n\n this.opaque = opaque || null\n this.responseHeaders = responseHeaders || null\n this.callback = callback\n this.abort = null\n\n addSignal(this, signal)\n }\n\n onConnect (abort, context) {\n if (!this.callback) {\n throw new RequestAbortedError()\n }\n\n this.abort = abort\n this.context = context\n }\n\n onHeaders () {\n throw new SocketError('bad connect', null)\n }\n\n onUpgrade (statusCode, rawHeaders, socket) {\n const { callback, opaque, context } = this\n\n removeSignal(this)\n\n this.callback = null\n\n let headers = rawHeaders\n // Indicates is an HTTP2Session\n if (headers != null) {\n headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n }\n\n this.runInAsyncScope(callback, null, null, {\n statusCode,\n headers,\n socket,\n opaque,\n context\n })\n }\n\n onError (err) {\n const { callback, opaque } = this\n\n removeSignal(this)\n\n if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n }\n}\n\nfunction connect (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n connect.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const connectHandler = new ConnectHandler(opts, callback)\n this.dispatch({ ...opts, method: 'CONNECT' }, connectHandler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts && opts.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = connect\n","'use strict'\n\nconst {\n Readable,\n Duplex,\n PassThrough\n} = require('stream')\nconst {\n InvalidArgumentError,\n InvalidReturnValueError,\n RequestAbortedError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { AsyncResource } = require('async_hooks')\nconst { addSignal, removeSignal } = require('./abort-signal')\nconst assert = require('assert')\n\nconst kResume = Symbol('resume')\n\nclass PipelineRequest extends Readable {\n constructor () {\n super({ autoDestroy: true })\n\n this[kResume] = null\n }\n\n _read () {\n const { [kResume]: resume } = this\n\n if (resume) {\n this[kResume] = null\n resume()\n }\n }\n\n _destroy (err, callback) {\n this._read()\n\n callback(err)\n }\n}\n\nclass PipelineResponse extends Readable {\n constructor (resume) {\n super({ autoDestroy: true })\n this[kResume] = resume\n }\n\n _read () {\n this[kResume]()\n }\n\n _destroy (err, callback) {\n if (!err && !this._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n callback(err)\n }\n}\n\nclass PipelineHandler extends AsyncResource {\n constructor (opts, handler) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof handler !== 'function') {\n throw new InvalidArgumentError('invalid handler')\n }\n\n const { signal, method, opaque, onInfo, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_PIPELINE')\n\n this.opaque = opaque || null\n this.responseHeaders = responseHeaders || null\n this.handler = handler\n this.abort = null\n this.context = null\n this.onInfo = onInfo || null\n\n this.req = new PipelineRequest().on('error', util.nop)\n\n this.ret = new Duplex({\n readableObjectMode: opts.objectMode,\n autoDestroy: true,\n read: () => {\n const { body } = this\n\n if (body && body.resume) {\n body.resume()\n }\n },\n write: (chunk, encoding, callback) => {\n const { req } = this\n\n if (req.push(chunk, encoding) || req._readableState.destroyed) {\n callback()\n } else {\n req[kResume] = callback\n }\n },\n destroy: (err, callback) => {\n const { body, req, res, ret, abort } = this\n\n if (!err && !ret._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n if (abort && err) {\n abort()\n }\n\n util.destroy(body, err)\n util.destroy(req, err)\n util.destroy(res, err)\n\n removeSignal(this)\n\n callback(err)\n }\n }).on('prefinish', () => {\n const { req } = this\n\n // Node < 15 does not call _final in same tick.\n req.push(null)\n })\n\n this.res = null\n\n addSignal(this, signal)\n }\n\n onConnect (abort, context) {\n const { ret, res } = this\n\n assert(!res, 'pipeline cannot be retried')\n\n if (ret.destroyed) {\n throw new RequestAbortedError()\n }\n\n this.abort = abort\n this.context = context\n }\n\n onHeaders (statusCode, rawHeaders, resume) {\n const { opaque, handler, context } = this\n\n if (statusCode < 200) {\n if (this.onInfo) {\n const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n this.onInfo({ statusCode, headers })\n }\n return\n }\n\n this.res = new PipelineResponse(resume)\n\n let body\n try {\n this.handler = null\n const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n body = this.runInAsyncScope(handler, null, {\n statusCode,\n headers,\n opaque,\n body: this.res,\n context\n })\n } catch (err) {\n this.res.on('error', util.nop)\n throw err\n }\n\n if (!body || typeof body.on !== 'function') {\n throw new InvalidReturnValueError('expected Readable')\n }\n\n body\n .on('data', (chunk) => {\n const { ret, body } = this\n\n if (!ret.push(chunk) && body.pause) {\n body.pause()\n }\n })\n .on('error', (err) => {\n const { ret } = this\n\n util.destroy(ret, err)\n })\n .on('end', () => {\n const { ret } = this\n\n ret.push(null)\n })\n .on('close', () => {\n const { ret } = this\n\n if (!ret._readableState.ended) {\n util.destroy(ret, new RequestAbortedError())\n }\n })\n\n this.body = body\n }\n\n onData (chunk) {\n const { res } = this\n return res.push(chunk)\n }\n\n onComplete (trailers) {\n const { res } = this\n res.push(null)\n }\n\n onError (err) {\n const { ret } = this\n this.handler = null\n util.destroy(ret, err)\n }\n}\n\nfunction pipeline (opts, handler) {\n try {\n const pipelineHandler = new PipelineHandler(opts, handler)\n this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler)\n return pipelineHandler.ret\n } catch (err) {\n return new PassThrough().destroy(err)\n }\n}\n\nmodule.exports = pipeline\n","'use strict'\n\nconst Readable = require('./readable')\nconst {\n InvalidArgumentError,\n RequestAbortedError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { getResolveErrorBodyCallback } = require('./util')\nconst { AsyncResource } = require('async_hooks')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass RequestHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts\n\n try {\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) {\n throw new InvalidArgumentError('invalid highWaterMark')\n }\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_REQUEST')\n } catch (err) {\n if (util.isStream(body)) {\n util.destroy(body.on('error', util.nop), err)\n }\n throw err\n }\n\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.callback = callback\n this.res = null\n this.abort = null\n this.body = body\n this.trailers = {}\n this.context = null\n this.onInfo = onInfo || null\n this.throwOnError = throwOnError\n this.highWaterMark = highWaterMark\n\n if (util.isStream(body)) {\n body.on('error', (err) => {\n this.onError(err)\n })\n }\n\n addSignal(this, signal)\n }\n\n onConnect (abort, context) {\n if (!this.callback) {\n throw new RequestAbortedError()\n }\n\n this.abort = abort\n this.context = context\n }\n\n onHeaders (statusCode, rawHeaders, resume, statusMessage) {\n const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this\n\n const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n\n if (statusCode < 200) {\n if (this.onInfo) {\n this.onInfo({ statusCode, headers })\n }\n return\n }\n\n const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers\n const contentType = parsedHeaders['content-type']\n const body = new Readable({ resume, abort, contentType, highWaterMark })\n\n this.callback = null\n this.res = body\n if (callback !== null) {\n if (this.throwOnError && statusCode >= 400) {\n this.runInAsyncScope(getResolveErrorBodyCallback, null,\n { callback, body, contentType, statusCode, statusMessage, headers }\n )\n } else {\n this.runInAsyncScope(callback, null, null, {\n statusCode,\n headers,\n trailers: this.trailers,\n opaque,\n body,\n context\n })\n }\n }\n }\n\n onData (chunk) {\n const { res } = this\n return res.push(chunk)\n }\n\n onComplete (trailers) {\n const { res } = this\n\n removeSignal(this)\n\n util.parseHeaders(trailers, this.trailers)\n\n res.push(null)\n }\n\n onError (err) {\n const { res, callback, body, opaque } = this\n\n removeSignal(this)\n\n if (callback) {\n // TODO: Does this need queueMicrotask?\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n\n if (res) {\n this.res = null\n // Ensure all queued handlers are invoked before destroying res.\n queueMicrotask(() => {\n util.destroy(res, err)\n })\n }\n\n if (body) {\n this.body = null\n util.destroy(body, err)\n }\n }\n}\n\nfunction request (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n request.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n this.dispatch(opts, new RequestHandler(opts, callback))\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts && opts.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = request\n","'use strict'\n\nconst { finished, PassThrough } = require('stream')\nconst {\n InvalidArgumentError,\n InvalidReturnValueError,\n RequestAbortedError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { getResolveErrorBodyCallback } = require('./util')\nconst { AsyncResource } = require('async_hooks')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass StreamHandler extends AsyncResource {\n constructor (opts, factory, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts\n\n try {\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('invalid factory')\n }\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_STREAM')\n } catch (err) {\n if (util.isStream(body)) {\n util.destroy(body.on('error', util.nop), err)\n }\n throw err\n }\n\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.factory = factory\n this.callback = callback\n this.res = null\n this.abort = null\n this.context = null\n this.trailers = null\n this.body = body\n this.onInfo = onInfo || null\n this.throwOnError = throwOnError || false\n\n if (util.isStream(body)) {\n body.on('error', (err) => {\n this.onError(err)\n })\n }\n\n addSignal(this, signal)\n }\n\n onConnect (abort, context) {\n if (!this.callback) {\n throw new RequestAbortedError()\n }\n\n this.abort = abort\n this.context = context\n }\n\n onHeaders (statusCode, rawHeaders, resume, statusMessage) {\n const { factory, opaque, context, callback, responseHeaders } = this\n\n const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n\n if (statusCode < 200) {\n if (this.onInfo) {\n this.onInfo({ statusCode, headers })\n }\n return\n }\n\n this.factory = null\n\n let res\n\n if (this.throwOnError && statusCode >= 400) {\n const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers\n const contentType = parsedHeaders['content-type']\n res = new PassThrough()\n\n this.callback = null\n this.runInAsyncScope(getResolveErrorBodyCallback, null,\n { callback, body: res, contentType, statusCode, statusMessage, headers }\n )\n } else {\n if (factory === null) {\n return\n }\n\n res = this.runInAsyncScope(factory, null, {\n statusCode,\n headers,\n opaque,\n context\n })\n\n if (\n !res ||\n typeof res.write !== 'function' ||\n typeof res.end !== 'function' ||\n typeof res.on !== 'function'\n ) {\n throw new InvalidReturnValueError('expected Writable')\n }\n\n // TODO: Avoid finished. It registers an unnecessary amount of listeners.\n finished(res, { readable: false }, (err) => {\n const { callback, res, opaque, trailers, abort } = this\n\n this.res = null\n if (err || !res.readable) {\n util.destroy(res, err)\n }\n\n this.callback = null\n this.runInAsyncScope(callback, null, err || null, { opaque, trailers })\n\n if (err) {\n abort()\n }\n })\n }\n\n res.on('drain', resume)\n\n this.res = res\n\n const needDrain = res.writableNeedDrain !== undefined\n ? res.writableNeedDrain\n : res._writableState && res._writableState.needDrain\n\n return needDrain !== true\n }\n\n onData (chunk) {\n const { res } = this\n\n return res ? res.write(chunk) : true\n }\n\n onComplete (trailers) {\n const { res } = this\n\n removeSignal(this)\n\n if (!res) {\n return\n }\n\n this.trailers = util.parseHeaders(trailers)\n\n res.end()\n }\n\n onError (err) {\n const { res, callback, opaque, body } = this\n\n removeSignal(this)\n\n this.factory = null\n\n if (res) {\n this.res = null\n util.destroy(res, err)\n } else if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n\n if (body) {\n this.body = null\n util.destroy(body, err)\n }\n }\n}\n\nfunction stream (opts, factory, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n stream.call(this, opts, factory, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n this.dispatch(opts, new StreamHandler(opts, factory, callback))\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts && opts.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = stream\n","'use strict'\n\nconst { InvalidArgumentError, RequestAbortedError, SocketError } = require('../core/errors')\nconst { AsyncResource } = require('async_hooks')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\nconst assert = require('assert')\n\nclass UpgradeHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n const { signal, opaque, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n super('UNDICI_UPGRADE')\n\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.callback = callback\n this.abort = null\n this.context = null\n\n addSignal(this, signal)\n }\n\n onConnect (abort, context) {\n if (!this.callback) {\n throw new RequestAbortedError()\n }\n\n this.abort = abort\n this.context = null\n }\n\n onHeaders () {\n throw new SocketError('bad upgrade', null)\n }\n\n onUpgrade (statusCode, rawHeaders, socket) {\n const { callback, opaque, context } = this\n\n assert.strictEqual(statusCode, 101)\n\n removeSignal(this)\n\n this.callback = null\n const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n this.runInAsyncScope(callback, null, null, {\n headers,\n socket,\n opaque,\n context\n })\n }\n\n onError (err) {\n const { callback, opaque } = this\n\n removeSignal(this)\n\n if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n }\n}\n\nfunction upgrade (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n upgrade.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const upgradeHandler = new UpgradeHandler(opts, callback)\n this.dispatch({\n ...opts,\n method: opts.method || 'GET',\n upgrade: opts.protocol || 'Websocket'\n }, upgradeHandler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts && opts.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = upgrade\n","'use strict'\n\nmodule.exports.request = require('./api-request')\nmodule.exports.stream = require('./api-stream')\nmodule.exports.pipeline = require('./api-pipeline')\nmodule.exports.upgrade = require('./api-upgrade')\nmodule.exports.connect = require('./api-connect')\n","// Ported from https://github.com/nodejs/undici/pull/907\n\n'use strict'\n\nconst assert = require('assert')\nconst { Readable } = require('stream')\nconst { RequestAbortedError, NotSupportedError, InvalidArgumentError } = require('../core/errors')\nconst util = require('../core/util')\nconst { ReadableStreamFrom, toUSVString } = require('../core/util')\n\nlet Blob\n\nconst kConsume = Symbol('kConsume')\nconst kReading = Symbol('kReading')\nconst kBody = Symbol('kBody')\nconst kAbort = Symbol('abort')\nconst kContentType = Symbol('kContentType')\n\nmodule.exports = class BodyReadable extends Readable {\n constructor ({\n resume,\n abort,\n contentType = '',\n highWaterMark = 64 * 1024 // Same as nodejs fs streams.\n }) {\n super({\n autoDestroy: true,\n read: resume,\n highWaterMark\n })\n\n this._readableState.dataEmitted = false\n\n this[kAbort] = abort\n this[kConsume] = null\n this[kBody] = null\n this[kContentType] = contentType\n\n // Is stream being consumed through Readable API?\n // This is an optimization so that we avoid checking\n // for 'data' and 'readable' listeners in the hot path\n // inside push().\n this[kReading] = false\n }\n\n destroy (err) {\n if (this.destroyed) {\n // Node < 16\n return this\n }\n\n if (!err && !this._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n if (err) {\n this[kAbort]()\n }\n\n return super.destroy(err)\n }\n\n emit (ev, ...args) {\n if (ev === 'data') {\n // Node < 16.7\n this._readableState.dataEmitted = true\n } else if (ev === 'error') {\n // Node < 16\n this._readableState.errorEmitted = true\n }\n return super.emit(ev, ...args)\n }\n\n on (ev, ...args) {\n if (ev === 'data' || ev === 'readable') {\n this[kReading] = true\n }\n return super.on(ev, ...args)\n }\n\n addListener (ev, ...args) {\n return this.on(ev, ...args)\n }\n\n off (ev, ...args) {\n const ret = super.off(ev, ...args)\n if (ev === 'data' || ev === 'readable') {\n this[kReading] = (\n this.listenerCount('data') > 0 ||\n this.listenerCount('readable') > 0\n )\n }\n return ret\n }\n\n removeListener (ev, ...args) {\n return this.off(ev, ...args)\n }\n\n push (chunk) {\n if (this[kConsume] && chunk !== null && this.readableLength === 0) {\n consumePush(this[kConsume], chunk)\n return this[kReading] ? super.push(chunk) : true\n }\n return super.push(chunk)\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-text\n async text () {\n return consume(this, 'text')\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-json\n async json () {\n return consume(this, 'json')\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-blob\n async blob () {\n return consume(this, 'blob')\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-arraybuffer\n async arrayBuffer () {\n return consume(this, 'arrayBuffer')\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-formdata\n async formData () {\n // TODO: Implement.\n throw new NotSupportedError()\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-bodyused\n get bodyUsed () {\n return util.isDisturbed(this)\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-body\n get body () {\n if (!this[kBody]) {\n this[kBody] = ReadableStreamFrom(this)\n if (this[kConsume]) {\n // TODO: Is this the best way to force a lock?\n this[kBody].getReader() // Ensure stream is locked.\n assert(this[kBody].locked)\n }\n }\n return this[kBody]\n }\n\n async dump (opts) {\n let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144\n const signal = opts && opts.signal\n const abortFn = () => {\n this.destroy()\n }\n let signalListenerCleanup\n if (signal) {\n if (typeof signal !== 'object' || !('aborted' in signal)) {\n throw new InvalidArgumentError('signal must be an AbortSignal')\n }\n util.throwIfAborted(signal)\n signalListenerCleanup = util.addAbortListener(signal, abortFn)\n }\n try {\n for await (const chunk of this) {\n util.throwIfAborted(signal)\n limit -= Buffer.byteLength(chunk)\n if (limit < 0) {\n return\n }\n }\n } catch {\n util.throwIfAborted(signal)\n } finally {\n if (typeof signalListenerCleanup === 'function') {\n signalListenerCleanup()\n } else if (signalListenerCleanup) {\n signalListenerCleanup[Symbol.dispose]()\n }\n }\n }\n}\n\n// https://streams.spec.whatwg.org/#readablestream-locked\nfunction isLocked (self) {\n // Consume is an implicit lock.\n return (self[kBody] && self[kBody].locked === true) || self[kConsume]\n}\n\n// https://fetch.spec.whatwg.org/#body-unusable\nfunction isUnusable (self) {\n return util.isDisturbed(self) || isLocked(self)\n}\n\nasync function consume (stream, type) {\n if (isUnusable(stream)) {\n throw new TypeError('unusable')\n }\n\n assert(!stream[kConsume])\n\n return new Promise((resolve, reject) => {\n stream[kConsume] = {\n type,\n stream,\n resolve,\n reject,\n length: 0,\n body: []\n }\n\n stream\n .on('error', function (err) {\n consumeFinish(this[kConsume], err)\n })\n .on('close', function () {\n if (this[kConsume].body !== null) {\n consumeFinish(this[kConsume], new RequestAbortedError())\n }\n })\n\n process.nextTick(consumeStart, stream[kConsume])\n })\n}\n\nfunction consumeStart (consume) {\n if (consume.body === null) {\n return\n }\n\n const { _readableState: state } = consume.stream\n\n for (const chunk of state.buffer) {\n consumePush(consume, chunk)\n }\n\n if (state.endEmitted) {\n consumeEnd(this[kConsume])\n } else {\n consume.stream.on('end', function () {\n consumeEnd(this[kConsume])\n })\n }\n\n consume.stream.resume()\n\n while (consume.stream.read() != null) {\n // Loop\n }\n}\n\nfunction consumeEnd (consume) {\n const { type, body, resolve, stream, length } = consume\n\n try {\n if (type === 'text') {\n resolve(toUSVString(Buffer.concat(body)))\n } else if (type === 'json') {\n resolve(JSON.parse(Buffer.concat(body)))\n } else if (type === 'arrayBuffer') {\n const dst = new Uint8Array(length)\n\n let pos = 0\n for (const buf of body) {\n dst.set(buf, pos)\n pos += buf.byteLength\n }\n\n resolve(dst.buffer)\n } else if (type === 'blob') {\n if (!Blob) {\n Blob = require('buffer').Blob\n }\n resolve(new Blob(body, { type: stream[kContentType] }))\n }\n\n consumeFinish(consume)\n } catch (err) {\n stream.destroy(err)\n }\n}\n\nfunction consumePush (consume, chunk) {\n consume.length += chunk.length\n consume.body.push(chunk)\n}\n\nfunction consumeFinish (consume, err) {\n if (consume.body === null) {\n return\n }\n\n if (err) {\n consume.reject(err)\n } else {\n consume.resolve()\n }\n\n consume.type = null\n consume.stream = null\n consume.resolve = null\n consume.reject = null\n consume.length = 0\n consume.body = null\n}\n","const assert = require('assert')\nconst {\n ResponseStatusCodeError\n} = require('../core/errors')\nconst { toUSVString } = require('../core/util')\n\nasync function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) {\n assert(body)\n\n let chunks = []\n let limit = 0\n\n for await (const chunk of body) {\n chunks.push(chunk)\n limit += chunk.length\n if (limit > 128 * 1024) {\n chunks = null\n break\n }\n }\n\n if (statusCode === 204 || !contentType || !chunks) {\n process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers))\n return\n }\n\n try {\n if (contentType.startsWith('application/json')) {\n const payload = JSON.parse(toUSVString(Buffer.concat(chunks)))\n process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload))\n return\n }\n\n if (contentType.startsWith('text/')) {\n const payload = toUSVString(Buffer.concat(chunks))\n process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload))\n return\n }\n } catch (err) {\n // Process in a fallback if error\n }\n\n process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers))\n}\n\nmodule.exports = { getResolveErrorBodyCallback }\n","'use strict'\n\nconst {\n BalancedPoolMissingUpstreamError,\n InvalidArgumentError\n} = require('./core/errors')\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kRemoveClient,\n kGetDispatcher\n} = require('./pool-base')\nconst Pool = require('./pool')\nconst { kUrl, kInterceptors } = require('./core/symbols')\nconst { parseOrigin } = require('./core/util')\nconst kFactory = Symbol('factory')\n\nconst kOptions = Symbol('options')\nconst kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor')\nconst kCurrentWeight = Symbol('kCurrentWeight')\nconst kIndex = Symbol('kIndex')\nconst kWeight = Symbol('kWeight')\nconst kMaxWeightPerServer = Symbol('kMaxWeightPerServer')\nconst kErrorPenalty = Symbol('kErrorPenalty')\n\nfunction getGreatestCommonDivisor (a, b) {\n if (b === 0) return a\n return getGreatestCommonDivisor(b, a % b)\n}\n\nfunction defaultFactory (origin, opts) {\n return new Pool(origin, opts)\n}\n\nclass BalancedPool extends PoolBase {\n constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) {\n super()\n\n this[kOptions] = opts\n this[kIndex] = -1\n this[kCurrentWeight] = 0\n\n this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100\n this[kErrorPenalty] = this[kOptions].errorPenalty || 15\n\n if (!Array.isArray(upstreams)) {\n upstreams = [upstreams]\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool)\n ? opts.interceptors.BalancedPool\n : []\n this[kFactory] = factory\n\n for (const upstream of upstreams) {\n this.addUpstream(upstream)\n }\n this._updateBalancedPoolStats()\n }\n\n addUpstream (upstream) {\n const upstreamOrigin = parseOrigin(upstream).origin\n\n if (this[kClients].find((pool) => (\n pool[kUrl].origin === upstreamOrigin &&\n pool.closed !== true &&\n pool.destroyed !== true\n ))) {\n return this\n }\n const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions]))\n\n this[kAddClient](pool)\n pool.on('connect', () => {\n pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty])\n })\n\n pool.on('connectionError', () => {\n pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty])\n this._updateBalancedPoolStats()\n })\n\n pool.on('disconnect', (...args) => {\n const err = args[2]\n if (err && err.code === 'UND_ERR_SOCKET') {\n // decrease the weight of the pool.\n pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty])\n this._updateBalancedPoolStats()\n }\n })\n\n for (const client of this[kClients]) {\n client[kWeight] = this[kMaxWeightPerServer]\n }\n\n this._updateBalancedPoolStats()\n\n return this\n }\n\n _updateBalancedPoolStats () {\n this[kGreatestCommonDivisor] = this[kClients].map(p => p[kWeight]).reduce(getGreatestCommonDivisor, 0)\n }\n\n removeUpstream (upstream) {\n const upstreamOrigin = parseOrigin(upstream).origin\n\n const pool = this[kClients].find((pool) => (\n pool[kUrl].origin === upstreamOrigin &&\n pool.closed !== true &&\n pool.destroyed !== true\n ))\n\n if (pool) {\n this[kRemoveClient](pool)\n }\n\n return this\n }\n\n get upstreams () {\n return this[kClients]\n .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true)\n .map((p) => p[kUrl].origin)\n }\n\n [kGetDispatcher] () {\n // We validate that pools is greater than 0,\n // otherwise we would have to wait until an upstream\n // is added, which might never happen.\n if (this[kClients].length === 0) {\n throw new BalancedPoolMissingUpstreamError()\n }\n\n const dispatcher = this[kClients].find(dispatcher => (\n !dispatcher[kNeedDrain] &&\n dispatcher.closed !== true &&\n dispatcher.destroyed !== true\n ))\n\n if (!dispatcher) {\n return\n }\n\n const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true)\n\n if (allClientsBusy) {\n return\n }\n\n let counter = 0\n\n let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain])\n\n while (counter++ < this[kClients].length) {\n this[kIndex] = (this[kIndex] + 1) % this[kClients].length\n const pool = this[kClients][this[kIndex]]\n\n // find pool index with the largest weight\n if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) {\n maxWeightIndex = this[kIndex]\n }\n\n // decrease the current weight every `this[kClients].length`.\n if (this[kIndex] === 0) {\n // Set the current weight to the next lower weight.\n this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]\n\n if (this[kCurrentWeight] <= 0) {\n this[kCurrentWeight] = this[kMaxWeightPerServer]\n }\n }\n if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) {\n return pool\n }\n }\n\n this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]\n this[kIndex] = maxWeightIndex\n return this[kClients][maxWeightIndex]\n }\n}\n\nmodule.exports = BalancedPool\n","'use strict'\n\nconst { kConstruct } = require('./symbols')\nconst { urlEquals, fieldValues: getFieldValues } = require('./util')\nconst { kEnumerableProperty, isDisturbed } = require('../core/util')\nconst { kHeadersList } = require('../core/symbols')\nconst { webidl } = require('../fetch/webidl')\nconst { Response, cloneResponse } = require('../fetch/response')\nconst { Request } = require('../fetch/request')\nconst { kState, kHeaders, kGuard, kRealm } = require('../fetch/symbols')\nconst { fetching } = require('../fetch/index')\nconst { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require('../fetch/util')\nconst assert = require('assert')\nconst { getGlobalDispatcher } = require('../global')\n\n/**\n * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation\n * @typedef {Object} CacheBatchOperation\n * @property {'delete' | 'put'} type\n * @property {any} request\n * @property {any} response\n * @property {import('../../types/cache').CacheQueryOptions} options\n */\n\n/**\n * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list\n * @typedef {[any, any][]} requestResponseList\n */\n\nclass Cache {\n /**\n * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list\n * @type {requestResponseList}\n */\n #relevantRequestResponseList\n\n constructor () {\n if (arguments[0] !== kConstruct) {\n webidl.illegalConstructor()\n }\n\n this.#relevantRequestResponseList = arguments[1]\n }\n\n async match (request, options = {}) {\n webidl.brandCheck(this, Cache)\n webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.match' })\n\n request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options)\n\n const p = await this.matchAll(request, options)\n\n if (p.length === 0) {\n return\n }\n\n return p[0]\n }\n\n async matchAll (request = undefined, options = {}) {\n webidl.brandCheck(this, Cache)\n\n if (request !== undefined) request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options)\n\n // 1.\n let r = null\n\n // 2.\n if (request !== undefined) {\n if (request instanceof Request) {\n // 2.1.1\n r = request[kState]\n\n // 2.1.2\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return []\n }\n } else if (typeof request === 'string') {\n // 2.2.1\n r = new Request(request)[kState]\n }\n }\n\n // 5.\n // 5.1\n const responses = []\n\n // 5.2\n if (request === undefined) {\n // 5.2.1\n for (const requestResponse of this.#relevantRequestResponseList) {\n responses.push(requestResponse[1])\n }\n } else { // 5.3\n // 5.3.1\n const requestResponses = this.#queryCache(r, options)\n\n // 5.3.2\n for (const requestResponse of requestResponses) {\n responses.push(requestResponse[1])\n }\n }\n\n // 5.4\n // We don't implement CORs so we don't need to loop over the responses, yay!\n\n // 5.5.1\n const responseList = []\n\n // 5.5.2\n for (const response of responses) {\n // 5.5.2.1\n const responseObject = new Response(response.body?.source ?? null)\n const body = responseObject[kState].body\n responseObject[kState] = response\n responseObject[kState].body = body\n responseObject[kHeaders][kHeadersList] = response.headersList\n responseObject[kHeaders][kGuard] = 'immutable'\n\n responseList.push(responseObject)\n }\n\n // 6.\n return Object.freeze(responseList)\n }\n\n async add (request) {\n webidl.brandCheck(this, Cache)\n webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.add' })\n\n request = webidl.converters.RequestInfo(request)\n\n // 1.\n const requests = [request]\n\n // 2.\n const responseArrayPromise = this.addAll(requests)\n\n // 3.\n return await responseArrayPromise\n }\n\n async addAll (requests) {\n webidl.brandCheck(this, Cache)\n webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.addAll' })\n\n requests = webidl.converters['sequence'](requests)\n\n // 1.\n const responsePromises = []\n\n // 2.\n const requestList = []\n\n // 3.\n for (const request of requests) {\n if (typeof request === 'string') {\n continue\n }\n\n // 3.1\n const r = request[kState]\n\n // 3.2\n if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') {\n throw webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'Expected http/s scheme when method is not GET.'\n })\n }\n }\n\n // 4.\n /** @type {ReturnType[]} */\n const fetchControllers = []\n\n // 5.\n for (const request of requests) {\n // 5.1\n const r = new Request(request)[kState]\n\n // 5.2\n if (!urlIsHttpHttpsScheme(r.url)) {\n throw webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'Expected http/s scheme.'\n })\n }\n\n // 5.4\n r.initiator = 'fetch'\n r.destination = 'subresource'\n\n // 5.5\n requestList.push(r)\n\n // 5.6\n const responsePromise = createDeferredPromise()\n\n // 5.7\n fetchControllers.push(fetching({\n request: r,\n dispatcher: getGlobalDispatcher(),\n processResponse (response) {\n // 1.\n if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) {\n responsePromise.reject(webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'Received an invalid status code or the request failed.'\n }))\n } else if (response.headersList.contains('vary')) { // 2.\n // 2.1\n const fieldValues = getFieldValues(response.headersList.get('vary'))\n\n // 2.2\n for (const fieldValue of fieldValues) {\n // 2.2.1\n if (fieldValue === '*') {\n responsePromise.reject(webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'invalid vary field value'\n }))\n\n for (const controller of fetchControllers) {\n controller.abort()\n }\n\n return\n }\n }\n }\n },\n processResponseEndOfBody (response) {\n // 1.\n if (response.aborted) {\n responsePromise.reject(new DOMException('aborted', 'AbortError'))\n return\n }\n\n // 2.\n responsePromise.resolve(response)\n }\n }))\n\n // 5.8\n responsePromises.push(responsePromise.promise)\n }\n\n // 6.\n const p = Promise.all(responsePromises)\n\n // 7.\n const responses = await p\n\n // 7.1\n const operations = []\n\n // 7.2\n let index = 0\n\n // 7.3\n for (const response of responses) {\n // 7.3.1\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'put', // 7.3.2\n request: requestList[index], // 7.3.3\n response // 7.3.4\n }\n\n operations.push(operation) // 7.3.5\n\n index++ // 7.3.6\n }\n\n // 7.5\n const cacheJobPromise = createDeferredPromise()\n\n // 7.6.1\n let errorData = null\n\n // 7.6.2\n try {\n this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n // 7.6.3\n queueMicrotask(() => {\n // 7.6.3.1\n if (errorData === null) {\n cacheJobPromise.resolve(undefined)\n } else {\n // 7.6.3.2\n cacheJobPromise.reject(errorData)\n }\n })\n\n // 7.7\n return cacheJobPromise.promise\n }\n\n async put (request, response) {\n webidl.brandCheck(this, Cache)\n webidl.argumentLengthCheck(arguments, 2, { header: 'Cache.put' })\n\n request = webidl.converters.RequestInfo(request)\n response = webidl.converters.Response(response)\n\n // 1.\n let innerRequest = null\n\n // 2.\n if (request instanceof Request) {\n innerRequest = request[kState]\n } else { // 3.\n innerRequest = new Request(request)[kState]\n }\n\n // 4.\n if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') {\n throw webidl.errors.exception({\n header: 'Cache.put',\n message: 'Expected an http/s scheme when method is not GET'\n })\n }\n\n // 5.\n const innerResponse = response[kState]\n\n // 6.\n if (innerResponse.status === 206) {\n throw webidl.errors.exception({\n header: 'Cache.put',\n message: 'Got 206 status'\n })\n }\n\n // 7.\n if (innerResponse.headersList.contains('vary')) {\n // 7.1.\n const fieldValues = getFieldValues(innerResponse.headersList.get('vary'))\n\n // 7.2.\n for (const fieldValue of fieldValues) {\n // 7.2.1\n if (fieldValue === '*') {\n throw webidl.errors.exception({\n header: 'Cache.put',\n message: 'Got * vary field value'\n })\n }\n }\n }\n\n // 8.\n if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) {\n throw webidl.errors.exception({\n header: 'Cache.put',\n message: 'Response body is locked or disturbed'\n })\n }\n\n // 9.\n const clonedResponse = cloneResponse(innerResponse)\n\n // 10.\n const bodyReadPromise = createDeferredPromise()\n\n // 11.\n if (innerResponse.body != null) {\n // 11.1\n const stream = innerResponse.body.stream\n\n // 11.2\n const reader = stream.getReader()\n\n // 11.3\n readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject)\n } else {\n bodyReadPromise.resolve(undefined)\n }\n\n // 12.\n /** @type {CacheBatchOperation[]} */\n const operations = []\n\n // 13.\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'put', // 14.\n request: innerRequest, // 15.\n response: clonedResponse // 16.\n }\n\n // 17.\n operations.push(operation)\n\n // 19.\n const bytes = await bodyReadPromise.promise\n\n if (clonedResponse.body != null) {\n clonedResponse.body.source = bytes\n }\n\n // 19.1\n const cacheJobPromise = createDeferredPromise()\n\n // 19.2.1\n let errorData = null\n\n // 19.2.2\n try {\n this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n // 19.2.3\n queueMicrotask(() => {\n // 19.2.3.1\n if (errorData === null) {\n cacheJobPromise.resolve()\n } else { // 19.2.3.2\n cacheJobPromise.reject(errorData)\n }\n })\n\n return cacheJobPromise.promise\n }\n\n async delete (request, options = {}) {\n webidl.brandCheck(this, Cache)\n webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.delete' })\n\n request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options)\n\n /**\n * @type {Request}\n */\n let r = null\n\n if (request instanceof Request) {\n r = request[kState]\n\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return false\n }\n } else {\n assert(typeof request === 'string')\n\n r = new Request(request)[kState]\n }\n\n /** @type {CacheBatchOperation[]} */\n const operations = []\n\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'delete',\n request: r,\n options\n }\n\n operations.push(operation)\n\n const cacheJobPromise = createDeferredPromise()\n\n let errorData = null\n let requestResponses\n\n try {\n requestResponses = this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n queueMicrotask(() => {\n if (errorData === null) {\n cacheJobPromise.resolve(!!requestResponses?.length)\n } else {\n cacheJobPromise.reject(errorData)\n }\n })\n\n return cacheJobPromise.promise\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys\n * @param {any} request\n * @param {import('../../types/cache').CacheQueryOptions} options\n * @returns {readonly Request[]}\n */\n async keys (request = undefined, options = {}) {\n webidl.brandCheck(this, Cache)\n\n if (request !== undefined) request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options)\n\n // 1.\n let r = null\n\n // 2.\n if (request !== undefined) {\n // 2.1\n if (request instanceof Request) {\n // 2.1.1\n r = request[kState]\n\n // 2.1.2\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return []\n }\n } else if (typeof request === 'string') { // 2.2\n r = new Request(request)[kState]\n }\n }\n\n // 4.\n const promise = createDeferredPromise()\n\n // 5.\n // 5.1\n const requests = []\n\n // 5.2\n if (request === undefined) {\n // 5.2.1\n for (const requestResponse of this.#relevantRequestResponseList) {\n // 5.2.1.1\n requests.push(requestResponse[0])\n }\n } else { // 5.3\n // 5.3.1\n const requestResponses = this.#queryCache(r, options)\n\n // 5.3.2\n for (const requestResponse of requestResponses) {\n // 5.3.2.1\n requests.push(requestResponse[0])\n }\n }\n\n // 5.4\n queueMicrotask(() => {\n // 5.4.1\n const requestList = []\n\n // 5.4.2\n for (const request of requests) {\n const requestObject = new Request('https://a')\n requestObject[kState] = request\n requestObject[kHeaders][kHeadersList] = request.headersList\n requestObject[kHeaders][kGuard] = 'immutable'\n requestObject[kRealm] = request.client\n\n // 5.4.2.1\n requestList.push(requestObject)\n }\n\n // 5.4.3\n promise.resolve(Object.freeze(requestList))\n })\n\n return promise.promise\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm\n * @param {CacheBatchOperation[]} operations\n * @returns {requestResponseList}\n */\n #batchCacheOperations (operations) {\n // 1.\n const cache = this.#relevantRequestResponseList\n\n // 2.\n const backupCache = [...cache]\n\n // 3.\n const addedItems = []\n\n // 4.1\n const resultList = []\n\n try {\n // 4.2\n for (const operation of operations) {\n // 4.2.1\n if (operation.type !== 'delete' && operation.type !== 'put') {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'operation type does not match \"delete\" or \"put\"'\n })\n }\n\n // 4.2.2\n if (operation.type === 'delete' && operation.response != null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'delete operation should not have an associated response'\n })\n }\n\n // 4.2.3\n if (this.#queryCache(operation.request, operation.options, addedItems).length) {\n throw new DOMException('???', 'InvalidStateError')\n }\n\n // 4.2.4\n let requestResponses\n\n // 4.2.5\n if (operation.type === 'delete') {\n // 4.2.5.1\n requestResponses = this.#queryCache(operation.request, operation.options)\n\n // TODO: the spec is wrong, this is needed to pass WPTs\n if (requestResponses.length === 0) {\n return []\n }\n\n // 4.2.5.2\n for (const requestResponse of requestResponses) {\n const idx = cache.indexOf(requestResponse)\n assert(idx !== -1)\n\n // 4.2.5.2.1\n cache.splice(idx, 1)\n }\n } else if (operation.type === 'put') { // 4.2.6\n // 4.2.6.1\n if (operation.response == null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'put operation should have an associated response'\n })\n }\n\n // 4.2.6.2\n const r = operation.request\n\n // 4.2.6.3\n if (!urlIsHttpHttpsScheme(r.url)) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'expected http or https scheme'\n })\n }\n\n // 4.2.6.4\n if (r.method !== 'GET') {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'not get method'\n })\n }\n\n // 4.2.6.5\n if (operation.options != null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'options must not be defined'\n })\n }\n\n // 4.2.6.6\n requestResponses = this.#queryCache(operation.request)\n\n // 4.2.6.7\n for (const requestResponse of requestResponses) {\n const idx = cache.indexOf(requestResponse)\n assert(idx !== -1)\n\n // 4.2.6.7.1\n cache.splice(idx, 1)\n }\n\n // 4.2.6.8\n cache.push([operation.request, operation.response])\n\n // 4.2.6.10\n addedItems.push([operation.request, operation.response])\n }\n\n // 4.2.7\n resultList.push([operation.request, operation.response])\n }\n\n // 4.3\n return resultList\n } catch (e) { // 5.\n // 5.1\n this.#relevantRequestResponseList.length = 0\n\n // 5.2\n this.#relevantRequestResponseList = backupCache\n\n // 5.3\n throw e\n }\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#query-cache\n * @param {any} requestQuery\n * @param {import('../../types/cache').CacheQueryOptions} options\n * @param {requestResponseList} targetStorage\n * @returns {requestResponseList}\n */\n #queryCache (requestQuery, options, targetStorage) {\n /** @type {requestResponseList} */\n const resultList = []\n\n const storage = targetStorage ?? this.#relevantRequestResponseList\n\n for (const requestResponse of storage) {\n const [cachedRequest, cachedResponse] = requestResponse\n if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) {\n resultList.push(requestResponse)\n }\n }\n\n return resultList\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm\n * @param {any} requestQuery\n * @param {any} request\n * @param {any | null} response\n * @param {import('../../types/cache').CacheQueryOptions | undefined} options\n * @returns {boolean}\n */\n #requestMatchesCachedItem (requestQuery, request, response = null, options) {\n // if (options?.ignoreMethod === false && request.method === 'GET') {\n // return false\n // }\n\n const queryURL = new URL(requestQuery.url)\n\n const cachedURL = new URL(request.url)\n\n if (options?.ignoreSearch) {\n cachedURL.search = ''\n\n queryURL.search = ''\n }\n\n if (!urlEquals(queryURL, cachedURL, true)) {\n return false\n }\n\n if (\n response == null ||\n options?.ignoreVary ||\n !response.headersList.contains('vary')\n ) {\n return true\n }\n\n const fieldValues = getFieldValues(response.headersList.get('vary'))\n\n for (const fieldValue of fieldValues) {\n if (fieldValue === '*') {\n return false\n }\n\n const requestValue = request.headersList.get(fieldValue)\n const queryValue = requestQuery.headersList.get(fieldValue)\n\n // If one has the header and the other doesn't, or one has\n // a different value than the other, return false\n if (requestValue !== queryValue) {\n return false\n }\n }\n\n return true\n }\n}\n\nObject.defineProperties(Cache.prototype, {\n [Symbol.toStringTag]: {\n value: 'Cache',\n configurable: true\n },\n match: kEnumerableProperty,\n matchAll: kEnumerableProperty,\n add: kEnumerableProperty,\n addAll: kEnumerableProperty,\n put: kEnumerableProperty,\n delete: kEnumerableProperty,\n keys: kEnumerableProperty\n})\n\nconst cacheQueryOptionConverters = [\n {\n key: 'ignoreSearch',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'ignoreMethod',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'ignoreVary',\n converter: webidl.converters.boolean,\n defaultValue: false\n }\n]\n\nwebidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters)\n\nwebidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([\n ...cacheQueryOptionConverters,\n {\n key: 'cacheName',\n converter: webidl.converters.DOMString\n }\n])\n\nwebidl.converters.Response = webidl.interfaceConverter(Response)\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.RequestInfo\n)\n\nmodule.exports = {\n Cache\n}\n","'use strict'\n\nconst { kConstruct } = require('./symbols')\nconst { Cache } = require('./cache')\nconst { webidl } = require('../fetch/webidl')\nconst { kEnumerableProperty } = require('../core/util')\n\nclass CacheStorage {\n /**\n * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map\n * @type {Map}\n */\n async has (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.has' })\n\n cacheName = webidl.converters.DOMString(cacheName)\n\n // 2.1.1\n // 2.2\n return this.#caches.has(cacheName)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open\n * @param {string} cacheName\n * @returns {Promise}\n */\n async open (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.open' })\n\n cacheName = webidl.converters.DOMString(cacheName)\n\n // 2.1\n if (this.#caches.has(cacheName)) {\n // await caches.open('v1') !== await caches.open('v1')\n\n // 2.1.1\n const cache = this.#caches.get(cacheName)\n\n // 2.1.1.1\n return new Cache(kConstruct, cache)\n }\n\n // 2.2\n const cache = []\n\n // 2.3\n this.#caches.set(cacheName, cache)\n\n // 2.4\n return new Cache(kConstruct, cache)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete\n * @param {string} cacheName\n * @returns {Promise}\n */\n async delete (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.delete' })\n\n cacheName = webidl.converters.DOMString(cacheName)\n\n return this.#caches.delete(cacheName)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys\n * @returns {string[]}\n */\n async keys () {\n webidl.brandCheck(this, CacheStorage)\n\n // 2.1\n const keys = this.#caches.keys()\n\n // 2.2\n return [...keys]\n }\n}\n\nObject.defineProperties(CacheStorage.prototype, {\n [Symbol.toStringTag]: {\n value: 'CacheStorage',\n configurable: true\n },\n match: kEnumerableProperty,\n has: kEnumerableProperty,\n open: kEnumerableProperty,\n delete: kEnumerableProperty,\n keys: kEnumerableProperty\n})\n\nmodule.exports = {\n CacheStorage\n}\n","'use strict'\n\nmodule.exports = {\n kConstruct: Symbol('constructable')\n}\n","'use strict'\n\nconst assert = require('assert')\nconst { URLSerializer } = require('../fetch/dataURL')\nconst { isValidHeaderName } = require('../fetch/util')\n\n/**\n * @see https://url.spec.whatwg.org/#concept-url-equals\n * @param {URL} A\n * @param {URL} B\n * @param {boolean | undefined} excludeFragment\n * @returns {boolean}\n */\nfunction urlEquals (A, B, excludeFragment = false) {\n const serializedA = URLSerializer(A, excludeFragment)\n\n const serializedB = URLSerializer(B, excludeFragment)\n\n return serializedA === serializedB\n}\n\n/**\n * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262\n * @param {string} header\n */\nfunction fieldValues (header) {\n assert(header !== null)\n\n const values = []\n\n for (let value of header.split(',')) {\n value = value.trim()\n\n if (!value.length) {\n continue\n } else if (!isValidHeaderName(value)) {\n continue\n }\n\n values.push(value)\n }\n\n return values\n}\n\nmodule.exports = {\n urlEquals,\n fieldValues\n}\n","// @ts-check\n\n'use strict'\n\n/* global WebAssembly */\n\nconst assert = require('assert')\nconst net = require('net')\nconst http = require('http')\nconst { pipeline } = require('stream')\nconst util = require('./core/util')\nconst timers = require('./timers')\nconst Request = require('./core/request')\nconst DispatcherBase = require('./dispatcher-base')\nconst {\n RequestContentLengthMismatchError,\n ResponseContentLengthMismatchError,\n InvalidArgumentError,\n RequestAbortedError,\n HeadersTimeoutError,\n HeadersOverflowError,\n SocketError,\n InformationalError,\n BodyTimeoutError,\n HTTPParserError,\n ResponseExceededMaxSizeError,\n ClientDestroyedError\n} = require('./core/errors')\nconst buildConnector = require('./core/connect')\nconst {\n kUrl,\n kReset,\n kServerName,\n kClient,\n kBusy,\n kParser,\n kConnect,\n kBlocking,\n kResuming,\n kRunning,\n kPending,\n kSize,\n kWriting,\n kQueue,\n kConnected,\n kConnecting,\n kNeedDrain,\n kNoRef,\n kKeepAliveDefaultTimeout,\n kHostHeader,\n kPendingIdx,\n kRunningIdx,\n kError,\n kPipelining,\n kSocket,\n kKeepAliveTimeoutValue,\n kMaxHeadersSize,\n kKeepAliveMaxTimeout,\n kKeepAliveTimeoutThreshold,\n kHeadersTimeout,\n kBodyTimeout,\n kStrictContentLength,\n kConnector,\n kMaxRedirections,\n kMaxRequests,\n kCounter,\n kClose,\n kDestroy,\n kDispatch,\n kInterceptors,\n kLocalAddress,\n kMaxResponseSize,\n kHTTPConnVersion,\n // HTTP2\n kHost,\n kHTTP2Session,\n kHTTP2SessionState,\n kHTTP2BuildRequest,\n kHTTP2CopyHeaders,\n kHTTP1BuildRequest\n} = require('./core/symbols')\n\n/** @type {import('http2')} */\nlet http2\ntry {\n http2 = require('http2')\n} catch {\n // @ts-ignore\n http2 = { constants: {} }\n}\n\nconst {\n constants: {\n HTTP2_HEADER_AUTHORITY,\n HTTP2_HEADER_METHOD,\n HTTP2_HEADER_PATH,\n HTTP2_HEADER_SCHEME,\n HTTP2_HEADER_CONTENT_LENGTH,\n HTTP2_HEADER_EXPECT,\n HTTP2_HEADER_STATUS\n }\n} = http2\n\n// Experimental\nlet h2ExperimentalWarned = false\n\nconst FastBuffer = Buffer[Symbol.species]\n\nconst kClosedResolve = Symbol('kClosedResolve')\n\nconst channels = {}\n\ntry {\n const diagnosticsChannel = require('diagnostics_channel')\n channels.sendHeaders = diagnosticsChannel.channel('undici:client:sendHeaders')\n channels.beforeConnect = diagnosticsChannel.channel('undici:client:beforeConnect')\n channels.connectError = diagnosticsChannel.channel('undici:client:connectError')\n channels.connected = diagnosticsChannel.channel('undici:client:connected')\n} catch {\n channels.sendHeaders = { hasSubscribers: false }\n channels.beforeConnect = { hasSubscribers: false }\n channels.connectError = { hasSubscribers: false }\n channels.connected = { hasSubscribers: false }\n}\n\n/**\n * @type {import('../types/client').default}\n */\nclass Client extends DispatcherBase {\n /**\n *\n * @param {string|URL} url\n * @param {import('../types/client').Client.Options} options\n */\n constructor (url, {\n interceptors,\n maxHeaderSize,\n headersTimeout,\n socketTimeout,\n requestTimeout,\n connectTimeout,\n bodyTimeout,\n idleTimeout,\n keepAlive,\n keepAliveTimeout,\n maxKeepAliveTimeout,\n keepAliveMaxTimeout,\n keepAliveTimeoutThreshold,\n socketPath,\n pipelining,\n tls,\n strictContentLength,\n maxCachedSessions,\n maxRedirections,\n connect,\n maxRequestsPerClient,\n localAddress,\n maxResponseSize,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n // h2\n allowH2,\n maxConcurrentStreams\n } = {}) {\n super()\n\n if (keepAlive !== undefined) {\n throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead')\n }\n\n if (socketTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead')\n }\n\n if (requestTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead')\n }\n\n if (idleTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead')\n }\n\n if (maxKeepAliveTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead')\n }\n\n if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) {\n throw new InvalidArgumentError('invalid maxHeaderSize')\n }\n\n if (socketPath != null && typeof socketPath !== 'string') {\n throw new InvalidArgumentError('invalid socketPath')\n }\n\n if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) {\n throw new InvalidArgumentError('invalid connectTimeout')\n }\n\n if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) {\n throw new InvalidArgumentError('invalid keepAliveTimeout')\n }\n\n if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) {\n throw new InvalidArgumentError('invalid keepAliveMaxTimeout')\n }\n\n if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) {\n throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold')\n }\n\n if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) {\n throw new InvalidArgumentError('headersTimeout must be a positive integer or zero')\n }\n\n if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) {\n throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {\n throw new InvalidArgumentError('maxRedirections must be a positive number')\n }\n\n if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) {\n throw new InvalidArgumentError('maxRequestsPerClient must be a positive number')\n }\n\n if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) {\n throw new InvalidArgumentError('localAddress must be valid string IP address')\n }\n\n if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) {\n throw new InvalidArgumentError('maxResponseSize must be a positive number')\n }\n\n if (\n autoSelectFamilyAttemptTimeout != null &&\n (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)\n ) {\n throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number')\n }\n\n // h2\n if (allowH2 != null && typeof allowH2 !== 'boolean') {\n throw new InvalidArgumentError('allowH2 must be a valid boolean value')\n }\n\n if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) {\n throw new InvalidArgumentError('maxConcurrentStreams must be a possitive integer, greater than 0')\n }\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n socketPath,\n timeout: connectTimeout,\n ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n }\n\n this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client)\n ? interceptors.Client\n : [createRedirectInterceptor({ maxRedirections })]\n this[kUrl] = util.parseOrigin(url)\n this[kConnector] = connect\n this[kSocket] = null\n this[kPipelining] = pipelining != null ? pipelining : 1\n this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize\n this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout\n this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout\n this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold\n this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]\n this[kServerName] = null\n this[kLocalAddress] = localAddress != null ? localAddress : null\n this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming\n this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming\n this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\\r\\n`\n this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3\n this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3\n this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength\n this[kMaxRedirections] = maxRedirections\n this[kMaxRequests] = maxRequestsPerClient\n this[kClosedResolve] = null\n this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1\n this[kHTTPConnVersion] = 'h1'\n\n // HTTP/2\n this[kHTTP2Session] = null\n this[kHTTP2SessionState] = !allowH2\n ? null\n : {\n // streams: null, // Fixed queue of streams - For future support of `push`\n openStreams: 0, // Keep track of them to decide wether or not unref the session\n maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server\n }\n this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}`\n\n // kQueue is built up of 3 sections separated by\n // the kRunningIdx and kPendingIdx indices.\n // | complete | running | pending |\n // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length\n // kRunningIdx points to the first running element.\n // kPendingIdx points to the first pending element.\n // This implements a fast queue with an amortized\n // time of O(1).\n\n this[kQueue] = []\n this[kRunningIdx] = 0\n this[kPendingIdx] = 0\n }\n\n get pipelining () {\n return this[kPipelining]\n }\n\n set pipelining (value) {\n this[kPipelining] = value\n resume(this, true)\n }\n\n get [kPending] () {\n return this[kQueue].length - this[kPendingIdx]\n }\n\n get [kRunning] () {\n return this[kPendingIdx] - this[kRunningIdx]\n }\n\n get [kSize] () {\n return this[kQueue].length - this[kRunningIdx]\n }\n\n get [kConnected] () {\n return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed\n }\n\n get [kBusy] () {\n const socket = this[kSocket]\n return (\n (socket && (socket[kReset] || socket[kWriting] || socket[kBlocking])) ||\n (this[kSize] >= (this[kPipelining] || 1)) ||\n this[kPending] > 0\n )\n }\n\n /* istanbul ignore: only used for test */\n [kConnect] (cb) {\n connect(this)\n this.once('connect', cb)\n }\n\n [kDispatch] (opts, handler) {\n const origin = opts.origin || this[kUrl].origin\n\n const request = this[kHTTPConnVersion] === 'h2'\n ? Request[kHTTP2BuildRequest](origin, opts, handler)\n : Request[kHTTP1BuildRequest](origin, opts, handler)\n\n this[kQueue].push(request)\n if (this[kResuming]) {\n // Do nothing.\n } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) {\n // Wait a tick in case stream/iterator is ended in the same tick.\n this[kResuming] = 1\n process.nextTick(resume, this)\n } else {\n resume(this, true)\n }\n\n if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) {\n this[kNeedDrain] = 2\n }\n\n return this[kNeedDrain] < 2\n }\n\n async [kClose] () {\n // TODO: for H2 we need to gracefully flush the remaining enqueued\n // request and close each stream.\n return new Promise((resolve) => {\n if (!this[kSize]) {\n resolve(null)\n } else {\n this[kClosedResolve] = resolve\n }\n })\n }\n\n async [kDestroy] (err) {\n return new Promise((resolve) => {\n const requests = this[kQueue].splice(this[kPendingIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n errorRequest(this, request, err)\n }\n\n const callback = () => {\n if (this[kClosedResolve]) {\n // TODO (fix): Should we error here with ClientDestroyedError?\n this[kClosedResolve]()\n this[kClosedResolve] = null\n }\n resolve()\n }\n\n if (this[kHTTP2Session] != null) {\n util.destroy(this[kHTTP2Session], err)\n this[kHTTP2Session] = null\n this[kHTTP2SessionState] = null\n }\n\n if (!this[kSocket]) {\n queueMicrotask(callback)\n } else {\n util.destroy(this[kSocket].on('close', callback), err)\n }\n\n resume(this)\n })\n }\n}\n\nfunction onHttp2SessionError (err) {\n assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n this[kSocket][kError] = err\n\n onError(this[kClient], err)\n}\n\nfunction onHttp2FrameError (type, code, id) {\n const err = new InformationalError(`HTTP/2: \"frameError\" received - type ${type}, code ${code}`)\n\n if (id === 0) {\n this[kSocket][kError] = err\n onError(this[kClient], err)\n }\n}\n\nfunction onHttp2SessionEnd () {\n util.destroy(this, new SocketError('other side closed'))\n util.destroy(this[kSocket], new SocketError('other side closed'))\n}\n\nfunction onHTTP2GoAway (code) {\n const client = this[kClient]\n const err = new InformationalError(`HTTP/2: \"GOAWAY\" frame received with code ${code}`)\n client[kSocket] = null\n client[kHTTP2Session] = null\n\n if (client.destroyed) {\n assert(this[kPending] === 0)\n\n // Fail entire queue.\n const requests = client[kQueue].splice(client[kRunningIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n errorRequest(this, request, err)\n }\n } else if (client[kRunning] > 0) {\n // Fail head of pipeline.\n const request = client[kQueue][client[kRunningIdx]]\n client[kQueue][client[kRunningIdx]++] = null\n\n errorRequest(client, request, err)\n }\n\n client[kPendingIdx] = client[kRunningIdx]\n\n assert(client[kRunning] === 0)\n\n client.emit('disconnect',\n client[kUrl],\n [client],\n err\n )\n\n resume(client)\n}\n\nconst constants = require('./llhttp/constants')\nconst createRedirectInterceptor = require('./interceptor/redirectInterceptor')\nconst EMPTY_BUF = Buffer.alloc(0)\n\nasync function lazyllhttp () {\n const llhttpWasmData = process.env.JEST_WORKER_ID ? require('./llhttp/llhttp-wasm.js') : undefined\n\n let mod\n try {\n mod = await WebAssembly.compile(Buffer.from(require('./llhttp/llhttp_simd-wasm.js'), 'base64'))\n } catch (e) {\n /* istanbul ignore next */\n\n // We could check if the error was caused by the simd option not\n // being enabled, but the occurring of this other error\n // * https://github.com/emscripten-core/emscripten/issues/11495\n // got me to remove that check to avoid breaking Node 12.\n mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || require('./llhttp/llhttp-wasm.js'), 'base64'))\n }\n\n return await WebAssembly.instantiate(mod, {\n env: {\n /* eslint-disable camelcase */\n\n wasm_on_url: (p, at, len) => {\n /* istanbul ignore next */\n return 0\n },\n wasm_on_status: (p, at, len) => {\n assert.strictEqual(currentParser.ptr, p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0\n },\n wasm_on_message_begin: (p) => {\n assert.strictEqual(currentParser.ptr, p)\n return currentParser.onMessageBegin() || 0\n },\n wasm_on_header_field: (p, at, len) => {\n assert.strictEqual(currentParser.ptr, p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0\n },\n wasm_on_header_value: (p, at, len) => {\n assert.strictEqual(currentParser.ptr, p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0\n },\n wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => {\n assert.strictEqual(currentParser.ptr, p)\n return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0\n },\n wasm_on_body: (p, at, len) => {\n assert.strictEqual(currentParser.ptr, p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0\n },\n wasm_on_message_complete: (p) => {\n assert.strictEqual(currentParser.ptr, p)\n return currentParser.onMessageComplete() || 0\n }\n\n /* eslint-enable camelcase */\n }\n })\n}\n\nlet llhttpInstance = null\nlet llhttpPromise = lazyllhttp()\nllhttpPromise.catch()\n\nlet currentParser = null\nlet currentBufferRef = null\nlet currentBufferSize = 0\nlet currentBufferPtr = null\n\nconst TIMEOUT_HEADERS = 1\nconst TIMEOUT_BODY = 2\nconst TIMEOUT_IDLE = 3\n\nclass Parser {\n constructor (client, socket, { exports }) {\n assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0)\n\n this.llhttp = exports\n this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE)\n this.client = client\n this.socket = socket\n this.timeout = null\n this.timeoutValue = null\n this.timeoutType = null\n this.statusCode = null\n this.statusText = ''\n this.upgrade = false\n this.headers = []\n this.headersSize = 0\n this.headersMaxSize = client[kMaxHeadersSize]\n this.shouldKeepAlive = false\n this.paused = false\n this.resume = this.resume.bind(this)\n\n this.bytesRead = 0\n\n this.keepAlive = ''\n this.contentLength = ''\n this.connection = ''\n this.maxResponseSize = client[kMaxResponseSize]\n }\n\n setTimeout (value, type) {\n this.timeoutType = type\n if (value !== this.timeoutValue) {\n timers.clearTimeout(this.timeout)\n if (value) {\n this.timeout = timers.setTimeout(onParserTimeout, value, this)\n // istanbul ignore else: only for jest\n if (this.timeout.unref) {\n this.timeout.unref()\n }\n } else {\n this.timeout = null\n }\n this.timeoutValue = value\n } else if (this.timeout) {\n // istanbul ignore else: only for jest\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n }\n\n resume () {\n if (this.socket.destroyed || !this.paused) {\n return\n }\n\n assert(this.ptr != null)\n assert(currentParser == null)\n\n this.llhttp.llhttp_resume(this.ptr)\n\n assert(this.timeoutType === TIMEOUT_BODY)\n if (this.timeout) {\n // istanbul ignore else: only for jest\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n this.paused = false\n this.execute(this.socket.read() || EMPTY_BUF) // Flush parser.\n this.readMore()\n }\n\n readMore () {\n while (!this.paused && this.ptr) {\n const chunk = this.socket.read()\n if (chunk === null) {\n break\n }\n this.execute(chunk)\n }\n }\n\n execute (data) {\n assert(this.ptr != null)\n assert(currentParser == null)\n assert(!this.paused)\n\n const { socket, llhttp } = this\n\n if (data.length > currentBufferSize) {\n if (currentBufferPtr) {\n llhttp.free(currentBufferPtr)\n }\n currentBufferSize = Math.ceil(data.length / 4096) * 4096\n currentBufferPtr = llhttp.malloc(currentBufferSize)\n }\n\n new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data)\n\n // Call `execute` on the wasm parser.\n // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data,\n // and finally the length of bytes to parse.\n // The return value is an error code or `constants.ERROR.OK`.\n try {\n let ret\n\n try {\n currentBufferRef = data\n currentParser = this\n ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length)\n /* eslint-disable-next-line no-useless-catch */\n } catch (err) {\n /* istanbul ignore next: difficult to make a test case for */\n throw err\n } finally {\n currentParser = null\n currentBufferRef = null\n }\n\n const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr\n\n if (ret === constants.ERROR.PAUSED_UPGRADE) {\n this.onUpgrade(data.slice(offset))\n } else if (ret === constants.ERROR.PAUSED) {\n this.paused = true\n socket.unshift(data.slice(offset))\n } else if (ret !== constants.ERROR.OK) {\n const ptr = llhttp.llhttp_get_error_reason(this.ptr)\n let message = ''\n /* istanbul ignore else: difficult to make a test case for */\n if (ptr) {\n const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0)\n message =\n 'Response does not match the HTTP/1.1 protocol (' +\n Buffer.from(llhttp.memory.buffer, ptr, len).toString() +\n ')'\n }\n throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset))\n }\n } catch (err) {\n util.destroy(socket, err)\n }\n }\n\n destroy () {\n assert(this.ptr != null)\n assert(currentParser == null)\n\n this.llhttp.llhttp_free(this.ptr)\n this.ptr = null\n\n timers.clearTimeout(this.timeout)\n this.timeout = null\n this.timeoutValue = null\n this.timeoutType = null\n\n this.paused = false\n }\n\n onStatus (buf) {\n this.statusText = buf.toString()\n }\n\n onMessageBegin () {\n const { socket, client } = this\n\n /* istanbul ignore next: difficult to make a test case for */\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n if (!request) {\n return -1\n }\n }\n\n onHeaderField (buf) {\n const len = this.headers.length\n\n if ((len & 1) === 0) {\n this.headers.push(buf)\n } else {\n this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])\n }\n\n this.trackHeader(buf.length)\n }\n\n onHeaderValue (buf) {\n let len = this.headers.length\n\n if ((len & 1) === 1) {\n this.headers.push(buf)\n len += 1\n } else {\n this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])\n }\n\n const key = this.headers[len - 2]\n if (key.length === 10 && key.toString().toLowerCase() === 'keep-alive') {\n this.keepAlive += buf.toString()\n } else if (key.length === 10 && key.toString().toLowerCase() === 'connection') {\n this.connection += buf.toString()\n } else if (key.length === 14 && key.toString().toLowerCase() === 'content-length') {\n this.contentLength += buf.toString()\n }\n\n this.trackHeader(buf.length)\n }\n\n trackHeader (len) {\n this.headersSize += len\n if (this.headersSize >= this.headersMaxSize) {\n util.destroy(this.socket, new HeadersOverflowError())\n }\n }\n\n onUpgrade (head) {\n const { upgrade, client, socket, headers, statusCode } = this\n\n assert(upgrade)\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n\n assert(!socket.destroyed)\n assert(socket === client[kSocket])\n assert(!this.paused)\n assert(request.upgrade || request.method === 'CONNECT')\n\n this.statusCode = null\n this.statusText = ''\n this.shouldKeepAlive = null\n\n assert(this.headers.length % 2 === 0)\n this.headers = []\n this.headersSize = 0\n\n socket.unshift(head)\n\n socket[kParser].destroy()\n socket[kParser] = null\n\n socket[kClient] = null\n socket[kError] = null\n socket\n .removeListener('error', onSocketError)\n .removeListener('readable', onSocketReadable)\n .removeListener('end', onSocketEnd)\n .removeListener('close', onSocketClose)\n\n client[kSocket] = null\n client[kQueue][client[kRunningIdx]++] = null\n client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade'))\n\n try {\n request.onUpgrade(statusCode, headers, socket)\n } catch (err) {\n util.destroy(socket, err)\n }\n\n resume(client)\n }\n\n onHeadersComplete (statusCode, upgrade, shouldKeepAlive) {\n const { client, socket, headers, statusText } = this\n\n /* istanbul ignore next: difficult to make a test case for */\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n\n /* istanbul ignore next: difficult to make a test case for */\n if (!request) {\n return -1\n }\n\n assert(!this.upgrade)\n assert(this.statusCode < 200)\n\n if (statusCode === 100) {\n util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)))\n return -1\n }\n\n /* this can only happen if server is misbehaving */\n if (upgrade && !request.upgrade) {\n util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket)))\n return -1\n }\n\n assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS)\n\n this.statusCode = statusCode\n this.shouldKeepAlive = (\n shouldKeepAlive ||\n // Override llhttp value which does not allow keepAlive for HEAD.\n (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive')\n )\n\n if (this.statusCode >= 200) {\n const bodyTimeout = request.bodyTimeout != null\n ? request.bodyTimeout\n : client[kBodyTimeout]\n this.setTimeout(bodyTimeout, TIMEOUT_BODY)\n } else if (this.timeout) {\n // istanbul ignore else: only for jest\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n if (request.method === 'CONNECT') {\n assert(client[kRunning] === 1)\n this.upgrade = true\n return 2\n }\n\n if (upgrade) {\n assert(client[kRunning] === 1)\n this.upgrade = true\n return 2\n }\n\n assert(this.headers.length % 2 === 0)\n this.headers = []\n this.headersSize = 0\n\n if (this.shouldKeepAlive && client[kPipelining]) {\n const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null\n\n if (keepAliveTimeout != null) {\n const timeout = Math.min(\n keepAliveTimeout - client[kKeepAliveTimeoutThreshold],\n client[kKeepAliveMaxTimeout]\n )\n if (timeout <= 0) {\n socket[kReset] = true\n } else {\n client[kKeepAliveTimeoutValue] = timeout\n }\n } else {\n client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]\n }\n } else {\n // Stop more requests from being dispatched.\n socket[kReset] = true\n }\n\n let pause\n try {\n pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false\n } catch (err) {\n util.destroy(socket, err)\n return -1\n }\n\n if (request.method === 'HEAD') {\n return 1\n }\n\n if (statusCode < 200) {\n return 1\n }\n\n if (socket[kBlocking]) {\n socket[kBlocking] = false\n resume(client)\n }\n\n return pause ? constants.ERROR.PAUSED : 0\n }\n\n onBody (buf) {\n const { client, socket, statusCode, maxResponseSize } = this\n\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n\n assert.strictEqual(this.timeoutType, TIMEOUT_BODY)\n if (this.timeout) {\n // istanbul ignore else: only for jest\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n assert(statusCode >= 200)\n\n if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) {\n util.destroy(socket, new ResponseExceededMaxSizeError())\n return -1\n }\n\n this.bytesRead += buf.length\n\n try {\n if (request.onData(buf) === false) {\n return constants.ERROR.PAUSED\n }\n } catch (err) {\n util.destroy(socket, err)\n return -1\n }\n }\n\n onMessageComplete () {\n const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this\n\n if (socket.destroyed && (!statusCode || shouldKeepAlive)) {\n return -1\n }\n\n if (upgrade) {\n return\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n\n assert(statusCode >= 100)\n\n this.statusCode = null\n this.statusText = ''\n this.bytesRead = 0\n this.contentLength = ''\n this.keepAlive = ''\n this.connection = ''\n\n assert(this.headers.length % 2 === 0)\n this.headers = []\n this.headersSize = 0\n\n if (statusCode < 200) {\n return\n }\n\n /* istanbul ignore next: should be handled by llhttp? */\n if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) {\n util.destroy(socket, new ResponseContentLengthMismatchError())\n return -1\n }\n\n try {\n request.onComplete(headers)\n } catch (err) {\n errorRequest(client, request, err)\n }\n\n client[kQueue][client[kRunningIdx]++] = null\n\n if (socket[kWriting]) {\n assert.strictEqual(client[kRunning], 0)\n // Response completed before request.\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (!shouldKeepAlive) {\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (socket[kReset] && client[kRunning] === 0) {\n // Destroy socket once all requests have completed.\n // The request at the tail of the pipeline is the one\n // that requested reset and no further requests should\n // have been queued since then.\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (client[kPipelining] === 1) {\n // We must wait a full event loop cycle to reuse this socket to make sure\n // that non-spec compliant servers are not closing the connection even if they\n // said they won't.\n setImmediate(resume, client)\n } else {\n resume(client)\n }\n }\n}\n\nfunction onParserTimeout (parser) {\n const { socket, timeoutType, client } = parser\n\n /* istanbul ignore else */\n if (timeoutType === TIMEOUT_HEADERS) {\n if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) {\n assert(!parser.paused, 'cannot be paused while waiting for headers')\n util.destroy(socket, new HeadersTimeoutError())\n }\n } else if (timeoutType === TIMEOUT_BODY) {\n if (!parser.paused) {\n util.destroy(socket, new BodyTimeoutError())\n }\n } else if (timeoutType === TIMEOUT_IDLE) {\n assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue])\n util.destroy(socket, new InformationalError('socket idle timeout'))\n }\n}\n\nfunction onSocketReadable () {\n const { [kParser]: parser } = this\n if (parser) {\n parser.readMore()\n }\n}\n\nfunction onSocketError (err) {\n const { [kClient]: client, [kParser]: parser } = this\n\n assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n if (client[kHTTPConnVersion] !== 'h2') {\n // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded\n // to the user.\n if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so for as a valid response.\n parser.onMessageComplete()\n return\n }\n }\n\n this[kError] = err\n\n onError(this[kClient], err)\n}\n\nfunction onError (client, err) {\n if (\n client[kRunning] === 0 &&\n err.code !== 'UND_ERR_INFO' &&\n err.code !== 'UND_ERR_SOCKET'\n ) {\n // Error is not caused by running request and not a recoverable\n // socket error.\n\n assert(client[kPendingIdx] === client[kRunningIdx])\n\n const requests = client[kQueue].splice(client[kRunningIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n errorRequest(client, request, err)\n }\n assert(client[kSize] === 0)\n }\n}\n\nfunction onSocketEnd () {\n const { [kParser]: parser, [kClient]: client } = this\n\n if (client[kHTTPConnVersion] !== 'h2') {\n if (parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so far as a valid response.\n parser.onMessageComplete()\n return\n }\n }\n\n util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))\n}\n\nfunction onSocketClose () {\n const { [kClient]: client, [kParser]: parser } = this\n\n if (client[kHTTPConnVersion] === 'h1' && parser) {\n if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so far as a valid response.\n parser.onMessageComplete()\n }\n\n this[kParser].destroy()\n this[kParser] = null\n }\n\n const err = this[kError] || new SocketError('closed', util.getSocketInfo(this))\n\n client[kSocket] = null\n\n if (client.destroyed) {\n assert(client[kPending] === 0)\n\n // Fail entire queue.\n const requests = client[kQueue].splice(client[kRunningIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n errorRequest(client, request, err)\n }\n } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') {\n // Fail head of pipeline.\n const request = client[kQueue][client[kRunningIdx]]\n client[kQueue][client[kRunningIdx]++] = null\n\n errorRequest(client, request, err)\n }\n\n client[kPendingIdx] = client[kRunningIdx]\n\n assert(client[kRunning] === 0)\n\n client.emit('disconnect', client[kUrl], [client], err)\n\n resume(client)\n}\n\nasync function connect (client) {\n assert(!client[kConnecting])\n assert(!client[kSocket])\n\n let { host, hostname, protocol, port } = client[kUrl]\n\n // Resolve ipv6\n if (hostname[0] === '[') {\n const idx = hostname.indexOf(']')\n\n assert(idx !== -1)\n const ip = hostname.substr(1, idx - 1)\n\n assert(net.isIP(ip))\n hostname = ip\n }\n\n client[kConnecting] = true\n\n if (channels.beforeConnect.hasSubscribers) {\n channels.beforeConnect.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector]\n })\n }\n\n try {\n const socket = await new Promise((resolve, reject) => {\n client[kConnector]({\n host,\n hostname,\n protocol,\n port,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n }, (err, socket) => {\n if (err) {\n reject(err)\n } else {\n resolve(socket)\n }\n })\n })\n\n if (client.destroyed) {\n util.destroy(socket.on('error', () => {}), new ClientDestroyedError())\n return\n }\n\n client[kConnecting] = false\n\n assert(socket)\n\n const isH2 = socket.alpnProtocol === 'h2'\n if (isH2) {\n if (!h2ExperimentalWarned) {\n h2ExperimentalWarned = true\n process.emitWarning('H2 support is experimental, expect them to change at any time.', {\n code: 'UNDICI-H2'\n })\n }\n\n const session = http2.connect(client[kUrl], {\n createConnection: () => socket,\n peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams\n })\n\n client[kHTTPConnVersion] = 'h2'\n session[kClient] = client\n session[kSocket] = socket\n session.on('error', onHttp2SessionError)\n session.on('frameError', onHttp2FrameError)\n session.on('end', onHttp2SessionEnd)\n session.on('goaway', onHTTP2GoAway)\n session.on('close', onSocketClose)\n session.unref()\n\n client[kHTTP2Session] = session\n socket[kHTTP2Session] = session\n } else {\n if (!llhttpInstance) {\n llhttpInstance = await llhttpPromise\n llhttpPromise = null\n }\n\n socket[kNoRef] = false\n socket[kWriting] = false\n socket[kReset] = false\n socket[kBlocking] = false\n socket[kParser] = new Parser(client, socket, llhttpInstance)\n }\n\n socket[kCounter] = 0\n socket[kMaxRequests] = client[kMaxRequests]\n socket[kClient] = client\n socket[kError] = null\n\n socket\n .on('error', onSocketError)\n .on('readable', onSocketReadable)\n .on('end', onSocketEnd)\n .on('close', onSocketClose)\n\n client[kSocket] = socket\n\n if (channels.connected.hasSubscribers) {\n channels.connected.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector],\n socket\n })\n }\n client.emit('connect', client[kUrl], [client])\n } catch (err) {\n if (client.destroyed) {\n return\n }\n\n client[kConnecting] = false\n\n if (channels.connectError.hasSubscribers) {\n channels.connectError.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector],\n error: err\n })\n }\n\n if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {\n assert(client[kRunning] === 0)\n while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {\n const request = client[kQueue][client[kPendingIdx]++]\n errorRequest(client, request, err)\n }\n } else {\n onError(client, err)\n }\n\n client.emit('connectionError', client[kUrl], [client], err)\n }\n\n resume(client)\n}\n\nfunction emitDrain (client) {\n client[kNeedDrain] = 0\n client.emit('drain', client[kUrl], [client])\n}\n\nfunction resume (client, sync) {\n if (client[kResuming] === 2) {\n return\n }\n\n client[kResuming] = 2\n\n _resume(client, sync)\n client[kResuming] = 0\n\n if (client[kRunningIdx] > 256) {\n client[kQueue].splice(0, client[kRunningIdx])\n client[kPendingIdx] -= client[kRunningIdx]\n client[kRunningIdx] = 0\n }\n}\n\nfunction _resume (client, sync) {\n while (true) {\n if (client.destroyed) {\n assert(client[kPending] === 0)\n return\n }\n\n if (client[kClosedResolve] && !client[kSize]) {\n client[kClosedResolve]()\n client[kClosedResolve] = null\n return\n }\n\n const socket = client[kSocket]\n\n if (socket && !socket.destroyed && socket.alpnProtocol !== 'h2') {\n if (client[kSize] === 0) {\n if (!socket[kNoRef] && socket.unref) {\n socket.unref()\n socket[kNoRef] = true\n }\n } else if (socket[kNoRef] && socket.ref) {\n socket.ref()\n socket[kNoRef] = false\n }\n\n if (client[kSize] === 0) {\n if (socket[kParser].timeoutType !== TIMEOUT_IDLE) {\n socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE)\n }\n } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) {\n if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) {\n const request = client[kQueue][client[kRunningIdx]]\n const headersTimeout = request.headersTimeout != null\n ? request.headersTimeout\n : client[kHeadersTimeout]\n socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS)\n }\n }\n }\n\n if (client[kBusy]) {\n client[kNeedDrain] = 2\n } else if (client[kNeedDrain] === 2) {\n if (sync) {\n client[kNeedDrain] = 1\n process.nextTick(emitDrain, client)\n } else {\n emitDrain(client)\n }\n continue\n }\n\n if (client[kPending] === 0) {\n return\n }\n\n if (client[kRunning] >= (client[kPipelining] || 1)) {\n return\n }\n\n const request = client[kQueue][client[kPendingIdx]]\n\n if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) {\n if (client[kRunning] > 0) {\n return\n }\n\n client[kServerName] = request.servername\n\n if (socket && socket.servername !== request.servername) {\n util.destroy(socket, new InformationalError('servername changed'))\n return\n }\n }\n\n if (client[kConnecting]) {\n return\n }\n\n if (!socket && !client[kHTTP2Session]) {\n connect(client)\n return\n }\n\n if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) {\n return\n }\n\n if (client[kRunning] > 0 && !request.idempotent) {\n // Non-idempotent request cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n return\n }\n\n if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) {\n // Don't dispatch an upgrade until all preceding requests have completed.\n // A misbehaving server might upgrade the connection before all pipelined\n // request has completed.\n return\n }\n\n if (util.isStream(request.body) && util.bodyLength(request.body) === 0) {\n request.body\n .on('data', /* istanbul ignore next */ function () {\n /* istanbul ignore next */\n assert(false)\n })\n .on('error', function (err) {\n errorRequest(client, request, err)\n })\n .on('end', function () {\n util.destroy(this)\n })\n\n request.body = null\n }\n\n if (client[kRunning] > 0 &&\n (util.isStream(request.body) || util.isAsyncIterable(request.body))) {\n // Request with stream or iterator body can error while other requests\n // are inflight and indirectly error those as well.\n // Ensure this doesn't happen by waiting for inflight\n // to complete before dispatching.\n\n // Request with stream or iterator body cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n return\n }\n\n if (!request.aborted && write(client, request)) {\n client[kPendingIdx]++\n } else {\n client[kQueue].splice(client[kPendingIdx], 1)\n }\n }\n}\n\nfunction write (client, request) {\n if (client[kHTTPConnVersion] === 'h2') {\n writeH2(client, client[kHTTP2Session], request)\n return\n }\n\n const { body, method, path, host, upgrade, headers, blocking, reset } = request\n\n // https://tools.ietf.org/html/rfc7231#section-4.3.1\n // https://tools.ietf.org/html/rfc7231#section-4.3.2\n // https://tools.ietf.org/html/rfc7231#section-4.3.5\n\n // Sending a payload body on a request that does not\n // expect it can cause undefined behavior on some\n // servers and corrupt connection state. Do not\n // re-use the connection for further requests.\n\n const expectsPayload = (\n method === 'PUT' ||\n method === 'POST' ||\n method === 'PATCH'\n )\n\n if (body && typeof body.read === 'function') {\n // Try to read EOF in order to get length.\n body.read(0)\n }\n\n let contentLength = util.bodyLength(body)\n\n if (contentLength === null) {\n contentLength = request.contentLength\n }\n\n if (contentLength === 0 && !expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD NOT send a Content-Length header field when\n // the request message does not contain a payload body and the method\n // semantics do not anticipate such a body.\n\n contentLength = null\n }\n\n if (request.contentLength !== null && request.contentLength !== contentLength) {\n if (client[kStrictContentLength]) {\n errorRequest(client, request, new RequestContentLengthMismatchError())\n return false\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n const socket = client[kSocket]\n\n try {\n request.onConnect((err) => {\n if (request.aborted || request.completed) {\n return\n }\n\n errorRequest(client, request, err || new RequestAbortedError())\n\n util.destroy(socket, new InformationalError('aborted'))\n })\n } catch (err) {\n errorRequest(client, request, err)\n }\n\n if (request.aborted) {\n return false\n }\n\n if (method === 'HEAD') {\n // https://github.com/mcollina/undici/issues/258\n // Close after a HEAD request to interop with misbehaving servers\n // that may send a body in the response.\n\n socket[kReset] = true\n }\n\n if (upgrade || method === 'CONNECT') {\n // On CONNECT or upgrade, block pipeline from dispatching further\n // requests on this connection.\n\n socket[kReset] = true\n }\n\n if (reset != null) {\n socket[kReset] = reset\n }\n\n if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) {\n socket[kReset] = true\n }\n\n if (blocking) {\n socket[kBlocking] = true\n }\n\n let header = `${method} ${path} HTTP/1.1\\r\\n`\n\n if (typeof host === 'string') {\n header += `host: ${host}\\r\\n`\n } else {\n header += client[kHostHeader]\n }\n\n if (upgrade) {\n header += `connection: upgrade\\r\\nupgrade: ${upgrade}\\r\\n`\n } else if (client[kPipelining] && !socket[kReset]) {\n header += 'connection: keep-alive\\r\\n'\n } else {\n header += 'connection: close\\r\\n'\n }\n\n if (headers) {\n header += headers\n }\n\n if (channels.sendHeaders.hasSubscribers) {\n channels.sendHeaders.publish({ request, headers: header, socket })\n }\n\n /* istanbul ignore else: assertion */\n if (!body) {\n if (contentLength === 0) {\n socket.write(`${header}content-length: 0\\r\\n\\r\\n`, 'latin1')\n } else {\n assert(contentLength === null, 'no body must not have content length')\n socket.write(`${header}\\r\\n`, 'latin1')\n }\n request.onRequestSent()\n } else if (util.isBuffer(body)) {\n assert(contentLength === body.byteLength, 'buffer body must have content length')\n\n socket.cork()\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n socket.write(body)\n socket.uncork()\n request.onBodySent(body)\n request.onRequestSent()\n if (!expectsPayload) {\n socket[kReset] = true\n }\n } else if (util.isBlobLike(body)) {\n if (typeof body.stream === 'function') {\n writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload })\n } else {\n writeBlob({ body, client, request, socket, contentLength, header, expectsPayload })\n }\n } else if (util.isStream(body)) {\n writeStream({ body, client, request, socket, contentLength, header, expectsPayload })\n } else if (util.isIterable(body)) {\n writeIterable({ body, client, request, socket, contentLength, header, expectsPayload })\n } else {\n assert(false)\n }\n\n return true\n}\n\nfunction writeH2 (client, session, request) {\n const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request\n\n let headers\n if (typeof reqHeaders === 'string') headers = Request[kHTTP2CopyHeaders](reqHeaders.trim())\n else headers = reqHeaders\n\n if (upgrade) {\n errorRequest(client, request, new Error('Upgrade not supported for H2'))\n return false\n }\n\n try {\n // TODO(HTTP/2): Should we call onConnect immediately or on stream ready event?\n request.onConnect((err) => {\n if (request.aborted || request.completed) {\n return\n }\n\n errorRequest(client, request, err || new RequestAbortedError())\n })\n } catch (err) {\n errorRequest(client, request, err)\n }\n\n if (request.aborted) {\n return false\n }\n\n let stream\n const h2State = client[kHTTP2SessionState]\n\n headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost]\n headers[HTTP2_HEADER_METHOD] = method\n\n if (method === 'CONNECT') {\n session.ref()\n // we are already connected, streams are pending, first request\n // will create a new stream. We trigger a request to create the stream and wait until\n // `ready` event is triggered\n // We disabled endStream to allow the user to write to the stream\n stream = session.request(headers, { endStream: false, signal })\n\n if (stream.id && !stream.pending) {\n request.onUpgrade(null, null, stream)\n ++h2State.openStreams\n } else {\n stream.once('ready', () => {\n request.onUpgrade(null, null, stream)\n ++h2State.openStreams\n })\n }\n\n stream.once('close', () => {\n h2State.openStreams -= 1\n // TODO(HTTP/2): unref only if current streams count is 0\n if (h2State.openStreams === 0) session.unref()\n })\n\n return true\n }\n\n // https://tools.ietf.org/html/rfc7540#section-8.3\n // :path and :scheme headers must be omited when sending CONNECT\n\n headers[HTTP2_HEADER_PATH] = path\n headers[HTTP2_HEADER_SCHEME] = 'https'\n\n // https://tools.ietf.org/html/rfc7231#section-4.3.1\n // https://tools.ietf.org/html/rfc7231#section-4.3.2\n // https://tools.ietf.org/html/rfc7231#section-4.3.5\n\n // Sending a payload body on a request that does not\n // expect it can cause undefined behavior on some\n // servers and corrupt connection state. Do not\n // re-use the connection for further requests.\n\n const expectsPayload = (\n method === 'PUT' ||\n method === 'POST' ||\n method === 'PATCH'\n )\n\n if (body && typeof body.read === 'function') {\n // Try to read EOF in order to get length.\n body.read(0)\n }\n\n let contentLength = util.bodyLength(body)\n\n if (contentLength == null) {\n contentLength = request.contentLength\n }\n\n if (contentLength === 0 || !expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD NOT send a Content-Length header field when\n // the request message does not contain a payload body and the method\n // semantics do not anticipate such a body.\n\n contentLength = null\n }\n\n if (request.contentLength != null && request.contentLength !== contentLength) {\n if (client[kStrictContentLength]) {\n errorRequest(client, request, new RequestContentLengthMismatchError())\n return false\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n if (contentLength != null) {\n assert(body, 'no body must not have content length')\n headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`\n }\n\n session.ref()\n\n const shouldEndStream = method === 'GET' || method === 'HEAD'\n if (expectContinue) {\n headers[HTTP2_HEADER_EXPECT] = '100-continue'\n /**\n * @type {import('node:http2').ClientHttp2Stream}\n */\n stream = session.request(headers, { endStream: shouldEndStream, signal })\n\n stream.once('continue', writeBodyH2)\n } else {\n /** @type {import('node:http2').ClientHttp2Stream} */\n stream = session.request(headers, {\n endStream: shouldEndStream,\n signal\n })\n writeBodyH2()\n }\n\n // Increment counter as we have new several streams open\n ++h2State.openStreams\n\n stream.once('response', headers => {\n if (request.onHeaders(Number(headers[HTTP2_HEADER_STATUS]), headers, stream.resume.bind(stream), '') === false) {\n stream.pause()\n }\n })\n\n stream.once('end', () => {\n request.onComplete([])\n })\n\n stream.on('data', (chunk) => {\n if (request.onData(chunk) === false) stream.pause()\n })\n\n stream.once('close', () => {\n h2State.openStreams -= 1\n // TODO(HTTP/2): unref only if current streams count is 0\n if (h2State.openStreams === 0) session.unref()\n })\n\n stream.once('error', function (err) {\n if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) {\n h2State.streams -= 1\n util.destroy(stream, err)\n }\n })\n\n stream.once('frameError', (type, code) => {\n const err = new InformationalError(`HTTP/2: \"frameError\" received - type ${type}, code ${code}`)\n errorRequest(client, request, err)\n\n if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) {\n h2State.streams -= 1\n util.destroy(stream, err)\n }\n })\n\n // stream.on('aborted', () => {\n // // TODO(HTTP/2): Support aborted\n // })\n\n // stream.on('timeout', () => {\n // // TODO(HTTP/2): Support timeout\n // })\n\n // stream.on('push', headers => {\n // // TODO(HTTP/2): Suppor push\n // })\n\n // stream.on('trailers', headers => {\n // // TODO(HTTP/2): Support trailers\n // })\n\n return true\n\n function writeBodyH2 () {\n /* istanbul ignore else: assertion */\n if (!body) {\n request.onRequestSent()\n } else if (util.isBuffer(body)) {\n assert(contentLength === body.byteLength, 'buffer body must have content length')\n stream.cork()\n stream.write(body)\n stream.uncork()\n stream.end()\n request.onBodySent(body)\n request.onRequestSent()\n } else if (util.isBlobLike(body)) {\n if (typeof body.stream === 'function') {\n writeIterable({\n client,\n request,\n contentLength,\n h2stream: stream,\n expectsPayload,\n body: body.stream(),\n socket: client[kSocket],\n header: ''\n })\n } else {\n writeBlob({\n body,\n client,\n request,\n contentLength,\n expectsPayload,\n h2stream: stream,\n header: '',\n socket: client[kSocket]\n })\n }\n } else if (util.isStream(body)) {\n writeStream({\n body,\n client,\n request,\n contentLength,\n expectsPayload,\n socket: client[kSocket],\n h2stream: stream,\n header: ''\n })\n } else if (util.isIterable(body)) {\n writeIterable({\n body,\n client,\n request,\n contentLength,\n expectsPayload,\n header: '',\n h2stream: stream,\n socket: client[kSocket]\n })\n } else {\n assert(false)\n }\n }\n}\n\nfunction writeStream ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined')\n\n if (client[kHTTPConnVersion] === 'h2') {\n // For HTTP/2, is enough to pipe the stream\n const pipe = pipeline(\n body,\n h2stream,\n (err) => {\n if (err) {\n util.destroy(body, err)\n util.destroy(h2stream, err)\n } else {\n request.onRequestSent()\n }\n }\n )\n\n pipe.on('data', onPipeData)\n pipe.once('end', () => {\n pipe.removeListener('data', onPipeData)\n util.destroy(pipe)\n })\n\n function onPipeData (chunk) {\n request.onBodySent(chunk)\n }\n\n return\n }\n\n let finished = false\n\n const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header })\n\n const onData = function (chunk) {\n if (finished) {\n return\n }\n\n try {\n if (!writer.write(chunk) && this.pause) {\n this.pause()\n }\n } catch (err) {\n util.destroy(this, err)\n }\n }\n const onDrain = function () {\n if (finished) {\n return\n }\n\n if (body.resume) {\n body.resume()\n }\n }\n const onAbort = function () {\n onFinished(new RequestAbortedError())\n }\n const onFinished = function (err) {\n if (finished) {\n return\n }\n\n finished = true\n\n assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1))\n\n socket\n .off('drain', onDrain)\n .off('error', onFinished)\n\n body\n .removeListener('data', onData)\n .removeListener('end', onFinished)\n .removeListener('error', onFinished)\n .removeListener('close', onAbort)\n\n if (!err) {\n try {\n writer.end()\n } catch (er) {\n err = er\n }\n }\n\n writer.destroy(err)\n\n if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) {\n util.destroy(body, err)\n } else {\n util.destroy(body)\n }\n }\n\n body\n .on('data', onData)\n .on('end', onFinished)\n .on('error', onFinished)\n .on('close', onAbort)\n\n if (body.resume) {\n body.resume()\n }\n\n socket\n .on('drain', onDrain)\n .on('error', onFinished)\n}\n\nasync function writeBlob ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {\n assert(contentLength === body.size, 'blob body must have content length')\n\n const isH2 = client[kHTTPConnVersion] === 'h2'\n try {\n if (contentLength != null && contentLength !== body.size) {\n throw new RequestContentLengthMismatchError()\n }\n\n const buffer = Buffer.from(await body.arrayBuffer())\n\n if (isH2) {\n h2stream.cork()\n h2stream.write(buffer)\n h2stream.uncork()\n } else {\n socket.cork()\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n socket.write(buffer)\n socket.uncork()\n }\n\n request.onBodySent(buffer)\n request.onRequestSent()\n\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n resume(client)\n } catch (err) {\n util.destroy(isH2 ? h2stream : socket, err)\n }\n}\n\nasync function writeIterable ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined')\n\n let callback = null\n function onDrain () {\n if (callback) {\n const cb = callback\n callback = null\n cb()\n }\n }\n\n const waitForDrain = () => new Promise((resolve, reject) => {\n assert(callback === null)\n\n if (socket[kError]) {\n reject(socket[kError])\n } else {\n callback = resolve\n }\n })\n\n if (client[kHTTPConnVersion] === 'h2') {\n h2stream\n .on('close', onDrain)\n .on('drain', onDrain)\n\n try {\n // It's up to the user to somehow abort the async iterable.\n for await (const chunk of body) {\n if (socket[kError]) {\n throw socket[kError]\n }\n\n const res = h2stream.write(chunk)\n request.onBodySent(chunk)\n if (!res) {\n await waitForDrain()\n }\n }\n } catch (err) {\n h2stream.destroy(err)\n } finally {\n request.onRequestSent()\n h2stream.end()\n h2stream\n .off('close', onDrain)\n .off('drain', onDrain)\n }\n\n return\n }\n\n socket\n .on('close', onDrain)\n .on('drain', onDrain)\n\n const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header })\n try {\n // It's up to the user to somehow abort the async iterable.\n for await (const chunk of body) {\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (!writer.write(chunk)) {\n await waitForDrain()\n }\n }\n\n writer.end()\n } catch (err) {\n writer.destroy(err)\n } finally {\n socket\n .off('close', onDrain)\n .off('drain', onDrain)\n }\n}\n\nclass AsyncWriter {\n constructor ({ socket, request, contentLength, client, expectsPayload, header }) {\n this.socket = socket\n this.request = request\n this.contentLength = contentLength\n this.client = client\n this.bytesWritten = 0\n this.expectsPayload = expectsPayload\n this.header = header\n\n socket[kWriting] = true\n }\n\n write (chunk) {\n const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this\n\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (socket.destroyed) {\n return false\n }\n\n const len = Buffer.byteLength(chunk)\n if (!len) {\n return true\n }\n\n // We should defer writing chunks.\n if (contentLength !== null && bytesWritten + len > contentLength) {\n if (client[kStrictContentLength]) {\n throw new RequestContentLengthMismatchError()\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n socket.cork()\n\n if (bytesWritten === 0) {\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n if (contentLength === null) {\n socket.write(`${header}transfer-encoding: chunked\\r\\n`, 'latin1')\n } else {\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n }\n }\n\n if (contentLength === null) {\n socket.write(`\\r\\n${len.toString(16)}\\r\\n`, 'latin1')\n }\n\n this.bytesWritten += len\n\n const ret = socket.write(chunk)\n\n socket.uncork()\n\n request.onBodySent(chunk)\n\n if (!ret) {\n if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {\n // istanbul ignore else: only for jest\n if (socket[kParser].timeout.refresh) {\n socket[kParser].timeout.refresh()\n }\n }\n }\n\n return ret\n }\n\n end () {\n const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this\n request.onRequestSent()\n\n socket[kWriting] = false\n\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (socket.destroyed) {\n return\n }\n\n if (bytesWritten === 0) {\n if (expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD send a Content-Length in a request message when\n // no Transfer-Encoding is sent and the request method defines a meaning\n // for an enclosed payload body.\n\n socket.write(`${header}content-length: 0\\r\\n\\r\\n`, 'latin1')\n } else {\n socket.write(`${header}\\r\\n`, 'latin1')\n }\n } else if (contentLength === null) {\n socket.write('\\r\\n0\\r\\n\\r\\n', 'latin1')\n }\n\n if (contentLength !== null && bytesWritten !== contentLength) {\n if (client[kStrictContentLength]) {\n throw new RequestContentLengthMismatchError()\n } else {\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n }\n\n if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {\n // istanbul ignore else: only for jest\n if (socket[kParser].timeout.refresh) {\n socket[kParser].timeout.refresh()\n }\n }\n\n resume(client)\n }\n\n destroy (err) {\n const { socket, client } = this\n\n socket[kWriting] = false\n\n if (err) {\n assert(client[kRunning] <= 1, 'pipeline should only contain this request')\n util.destroy(socket, err)\n }\n }\n}\n\nfunction errorRequest (client, request, err) {\n try {\n request.onError(err)\n assert(request.aborted)\n } catch (err) {\n client.emit('error', err)\n }\n}\n\nmodule.exports = Client\n","'use strict'\n\n/* istanbul ignore file: only for Node 12 */\n\nconst { kConnected, kSize } = require('../core/symbols')\n\nclass CompatWeakRef {\n constructor (value) {\n this.value = value\n }\n\n deref () {\n return this.value[kConnected] === 0 && this.value[kSize] === 0\n ? undefined\n : this.value\n }\n}\n\nclass CompatFinalizer {\n constructor (finalizer) {\n this.finalizer = finalizer\n }\n\n register (dispatcher, key) {\n if (dispatcher.on) {\n dispatcher.on('disconnect', () => {\n if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) {\n this.finalizer(key)\n }\n })\n }\n }\n}\n\nmodule.exports = function () {\n // FIXME: remove workaround when the Node bug is fixed\n // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308\n if (process.env.NODE_V8_COVERAGE) {\n return {\n WeakRef: CompatWeakRef,\n FinalizationRegistry: CompatFinalizer\n }\n }\n return {\n WeakRef: global.WeakRef || CompatWeakRef,\n FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer\n }\n}\n","'use strict'\n\n// https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size\nconst maxAttributeValueSize = 1024\n\n// https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size\nconst maxNameValuePairSize = 4096\n\nmodule.exports = {\n maxAttributeValueSize,\n maxNameValuePairSize\n}\n","'use strict'\n\nconst { parseSetCookie } = require('./parse')\nconst { stringify, getHeadersList } = require('./util')\nconst { webidl } = require('../fetch/webidl')\nconst { Headers } = require('../fetch/headers')\n\n/**\n * @typedef {Object} Cookie\n * @property {string} name\n * @property {string} value\n * @property {Date|number|undefined} expires\n * @property {number|undefined} maxAge\n * @property {string|undefined} domain\n * @property {string|undefined} path\n * @property {boolean|undefined} secure\n * @property {boolean|undefined} httpOnly\n * @property {'Strict'|'Lax'|'None'} sameSite\n * @property {string[]} unparsed\n */\n\n/**\n * @param {Headers} headers\n * @returns {Record}\n */\nfunction getCookies (headers) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'getCookies' })\n\n webidl.brandCheck(headers, Headers, { strict: false })\n\n const cookie = headers.get('cookie')\n const out = {}\n\n if (!cookie) {\n return out\n }\n\n for (const piece of cookie.split(';')) {\n const [name, ...value] = piece.split('=')\n\n out[name.trim()] = value.join('=')\n }\n\n return out\n}\n\n/**\n * @param {Headers} headers\n * @param {string} name\n * @param {{ path?: string, domain?: string }|undefined} attributes\n * @returns {void}\n */\nfunction deleteCookie (headers, name, attributes) {\n webidl.argumentLengthCheck(arguments, 2, { header: 'deleteCookie' })\n\n webidl.brandCheck(headers, Headers, { strict: false })\n\n name = webidl.converters.DOMString(name)\n attributes = webidl.converters.DeleteCookieAttributes(attributes)\n\n // Matches behavior of\n // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278\n setCookie(headers, {\n name,\n value: '',\n expires: new Date(0),\n ...attributes\n })\n}\n\n/**\n * @param {Headers} headers\n * @returns {Cookie[]}\n */\nfunction getSetCookies (headers) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'getSetCookies' })\n\n webidl.brandCheck(headers, Headers, { strict: false })\n\n const cookies = getHeadersList(headers).cookies\n\n if (!cookies) {\n return []\n }\n\n // In older versions of undici, cookies is a list of name:value.\n return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair))\n}\n\n/**\n * @param {Headers} headers\n * @param {Cookie} cookie\n * @returns {void}\n */\nfunction setCookie (headers, cookie) {\n webidl.argumentLengthCheck(arguments, 2, { header: 'setCookie' })\n\n webidl.brandCheck(headers, Headers, { strict: false })\n\n cookie = webidl.converters.Cookie(cookie)\n\n const str = stringify(cookie)\n\n if (str) {\n headers.append('Set-Cookie', stringify(cookie))\n }\n}\n\nwebidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'path',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'domain',\n defaultValue: null\n }\n])\n\nwebidl.converters.Cookie = webidl.dictionaryConverter([\n {\n converter: webidl.converters.DOMString,\n key: 'name'\n },\n {\n converter: webidl.converters.DOMString,\n key: 'value'\n },\n {\n converter: webidl.nullableConverter((value) => {\n if (typeof value === 'number') {\n return webidl.converters['unsigned long long'](value)\n }\n\n return new Date(value)\n }),\n key: 'expires',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters['long long']),\n key: 'maxAge',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'domain',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'path',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.boolean),\n key: 'secure',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.boolean),\n key: 'httpOnly',\n defaultValue: null\n },\n {\n converter: webidl.converters.USVString,\n key: 'sameSite',\n allowedValues: ['Strict', 'Lax', 'None']\n },\n {\n converter: webidl.sequenceConverter(webidl.converters.DOMString),\n key: 'unparsed',\n defaultValue: []\n }\n])\n\nmodule.exports = {\n getCookies,\n deleteCookie,\n getSetCookies,\n setCookie\n}\n","'use strict'\n\nconst { maxNameValuePairSize, maxAttributeValueSize } = require('./constants')\nconst { isCTLExcludingHtab } = require('./util')\nconst { collectASequenceOfCodePointsFast } = require('../fetch/dataURL')\nconst assert = require('assert')\n\n/**\n * @description Parses the field-value attributes of a set-cookie header string.\n * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4\n * @param {string} header\n * @returns if the header is invalid, null will be returned\n */\nfunction parseSetCookie (header) {\n // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F\n // character (CTL characters excluding HTAB): Abort these steps and\n // ignore the set-cookie-string entirely.\n if (isCTLExcludingHtab(header)) {\n return null\n }\n\n let nameValuePair = ''\n let unparsedAttributes = ''\n let name = ''\n let value = ''\n\n // 2. If the set-cookie-string contains a %x3B (\";\") character:\n if (header.includes(';')) {\n // 1. The name-value-pair string consists of the characters up to,\n // but not including, the first %x3B (\";\"), and the unparsed-\n // attributes consist of the remainder of the set-cookie-string\n // (including the %x3B (\";\") in question).\n const position = { position: 0 }\n\n nameValuePair = collectASequenceOfCodePointsFast(';', header, position)\n unparsedAttributes = header.slice(position.position)\n } else {\n // Otherwise:\n\n // 1. The name-value-pair string consists of all the characters\n // contained in the set-cookie-string, and the unparsed-\n // attributes is the empty string.\n nameValuePair = header\n }\n\n // 3. If the name-value-pair string lacks a %x3D (\"=\") character, then\n // the name string is empty, and the value string is the value of\n // name-value-pair.\n if (!nameValuePair.includes('=')) {\n value = nameValuePair\n } else {\n // Otherwise, the name string consists of the characters up to, but\n // not including, the first %x3D (\"=\") character, and the (possibly\n // empty) value string consists of the characters after the first\n // %x3D (\"=\") character.\n const position = { position: 0 }\n name = collectASequenceOfCodePointsFast(\n '=',\n nameValuePair,\n position\n )\n value = nameValuePair.slice(position.position + 1)\n }\n\n // 4. Remove any leading or trailing WSP characters from the name\n // string and the value string.\n name = name.trim()\n value = value.trim()\n\n // 5. If the sum of the lengths of the name string and the value string\n // is more than 4096 octets, abort these steps and ignore the set-\n // cookie-string entirely.\n if (name.length + value.length > maxNameValuePairSize) {\n return null\n }\n\n // 6. The cookie-name is the name string, and the cookie-value is the\n // value string.\n return {\n name, value, ...parseUnparsedAttributes(unparsedAttributes)\n }\n}\n\n/**\n * Parses the remaining attributes of a set-cookie header\n * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4\n * @param {string} unparsedAttributes\n * @param {[Object.]={}} cookieAttributeList\n */\nfunction parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) {\n // 1. If the unparsed-attributes string is empty, skip the rest of\n // these steps.\n if (unparsedAttributes.length === 0) {\n return cookieAttributeList\n }\n\n // 2. Discard the first character of the unparsed-attributes (which\n // will be a %x3B (\";\") character).\n assert(unparsedAttributes[0] === ';')\n unparsedAttributes = unparsedAttributes.slice(1)\n\n let cookieAv = ''\n\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n if (unparsedAttributes.includes(';')) {\n // 1. Consume the characters of the unparsed-attributes up to, but\n // not including, the first %x3B (\";\") character.\n cookieAv = collectASequenceOfCodePointsFast(\n ';',\n unparsedAttributes,\n { position: 0 }\n )\n unparsedAttributes = unparsedAttributes.slice(cookieAv.length)\n } else {\n // Otherwise:\n\n // 1. Consume the remainder of the unparsed-attributes.\n cookieAv = unparsedAttributes\n unparsedAttributes = ''\n }\n\n // Let the cookie-av string be the characters consumed in this step.\n\n let attributeName = ''\n let attributeValue = ''\n\n // 4. If the cookie-av string contains a %x3D (\"=\") character:\n if (cookieAv.includes('=')) {\n // 1. The (possibly empty) attribute-name string consists of the\n // characters up to, but not including, the first %x3D (\"=\")\n // character, and the (possibly empty) attribute-value string\n // consists of the characters after the first %x3D (\"=\")\n // character.\n const position = { position: 0 }\n\n attributeName = collectASequenceOfCodePointsFast(\n '=',\n cookieAv,\n position\n )\n attributeValue = cookieAv.slice(position.position + 1)\n } else {\n // Otherwise:\n\n // 1. The attribute-name string consists of the entire cookie-av\n // string, and the attribute-value string is empty.\n attributeName = cookieAv\n }\n\n // 5. Remove any leading or trailing WSP characters from the attribute-\n // name string and the attribute-value string.\n attributeName = attributeName.trim()\n attributeValue = attributeValue.trim()\n\n // 6. If the attribute-value is longer than 1024 octets, ignore the\n // cookie-av string and return to Step 1 of this algorithm.\n if (attributeValue.length > maxAttributeValueSize) {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 7. Process the attribute-name and attribute-value according to the\n // requirements in the following subsections. (Notice that\n // attributes with unrecognized attribute-names are ignored.)\n const attributeNameLowercase = attributeName.toLowerCase()\n\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1\n // If the attribute-name case-insensitively matches the string\n // \"Expires\", the user agent MUST process the cookie-av as follows.\n if (attributeNameLowercase === 'expires') {\n // 1. Let the expiry-time be the result of parsing the attribute-value\n // as cookie-date (see Section 5.1.1).\n const expiryTime = new Date(attributeValue)\n\n // 2. If the attribute-value failed to parse as a cookie date, ignore\n // the cookie-av.\n\n cookieAttributeList.expires = expiryTime\n } else if (attributeNameLowercase === 'max-age') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2\n // If the attribute-name case-insensitively matches the string \"Max-\n // Age\", the user agent MUST process the cookie-av as follows.\n\n // 1. If the first character of the attribute-value is not a DIGIT or a\n // \"-\" character, ignore the cookie-av.\n const charCode = attributeValue.charCodeAt(0)\n\n if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 2. If the remainder of attribute-value contains a non-DIGIT\n // character, ignore the cookie-av.\n if (!/^\\d+$/.test(attributeValue)) {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 3. Let delta-seconds be the attribute-value converted to an integer.\n const deltaSeconds = Number(attributeValue)\n\n // 4. Let cookie-age-limit be the maximum age of the cookie (which\n // SHOULD be 400 days or less, see Section 4.1.2.2).\n\n // 5. Set delta-seconds to the smaller of its present value and cookie-\n // age-limit.\n // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs)\n\n // 6. If delta-seconds is less than or equal to zero (0), let expiry-\n // time be the earliest representable date and time. Otherwise, let\n // the expiry-time be the current date and time plus delta-seconds\n // seconds.\n // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds\n\n // 7. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Max-Age and an attribute-value of expiry-time.\n cookieAttributeList.maxAge = deltaSeconds\n } else if (attributeNameLowercase === 'domain') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3\n // If the attribute-name case-insensitively matches the string \"Domain\",\n // the user agent MUST process the cookie-av as follows.\n\n // 1. Let cookie-domain be the attribute-value.\n let cookieDomain = attributeValue\n\n // 2. If cookie-domain starts with %x2E (\".\"), let cookie-domain be\n // cookie-domain without its leading %x2E (\".\").\n if (cookieDomain[0] === '.') {\n cookieDomain = cookieDomain.slice(1)\n }\n\n // 3. Convert the cookie-domain to lower case.\n cookieDomain = cookieDomain.toLowerCase()\n\n // 4. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Domain and an attribute-value of cookie-domain.\n cookieAttributeList.domain = cookieDomain\n } else if (attributeNameLowercase === 'path') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4\n // If the attribute-name case-insensitively matches the string \"Path\",\n // the user agent MUST process the cookie-av as follows.\n\n // 1. If the attribute-value is empty or if the first character of the\n // attribute-value is not %x2F (\"/\"):\n let cookiePath = ''\n if (attributeValue.length === 0 || attributeValue[0] !== '/') {\n // 1. Let cookie-path be the default-path.\n cookiePath = '/'\n } else {\n // Otherwise:\n\n // 1. Let cookie-path be the attribute-value.\n cookiePath = attributeValue\n }\n\n // 2. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Path and an attribute-value of cookie-path.\n cookieAttributeList.path = cookiePath\n } else if (attributeNameLowercase === 'secure') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5\n // If the attribute-name case-insensitively matches the string \"Secure\",\n // the user agent MUST append an attribute to the cookie-attribute-list\n // with an attribute-name of Secure and an empty attribute-value.\n\n cookieAttributeList.secure = true\n } else if (attributeNameLowercase === 'httponly') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6\n // If the attribute-name case-insensitively matches the string\n // \"HttpOnly\", the user agent MUST append an attribute to the cookie-\n // attribute-list with an attribute-name of HttpOnly and an empty\n // attribute-value.\n\n cookieAttributeList.httpOnly = true\n } else if (attributeNameLowercase === 'samesite') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7\n // If the attribute-name case-insensitively matches the string\n // \"SameSite\", the user agent MUST process the cookie-av as follows:\n\n // 1. Let enforcement be \"Default\".\n let enforcement = 'Default'\n\n const attributeValueLowercase = attributeValue.toLowerCase()\n // 2. If cookie-av's attribute-value is a case-insensitive match for\n // \"None\", set enforcement to \"None\".\n if (attributeValueLowercase.includes('none')) {\n enforcement = 'None'\n }\n\n // 3. If cookie-av's attribute-value is a case-insensitive match for\n // \"Strict\", set enforcement to \"Strict\".\n if (attributeValueLowercase.includes('strict')) {\n enforcement = 'Strict'\n }\n\n // 4. If cookie-av's attribute-value is a case-insensitive match for\n // \"Lax\", set enforcement to \"Lax\".\n if (attributeValueLowercase.includes('lax')) {\n enforcement = 'Lax'\n }\n\n // 5. Append an attribute to the cookie-attribute-list with an\n // attribute-name of \"SameSite\" and an attribute-value of\n // enforcement.\n cookieAttributeList.sameSite = enforcement\n } else {\n cookieAttributeList.unparsed ??= []\n\n cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`)\n }\n\n // 8. Return to Step 1 of this algorithm.\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n}\n\nmodule.exports = {\n parseSetCookie,\n parseUnparsedAttributes\n}\n","'use strict'\n\nconst assert = require('assert')\nconst { kHeadersList } = require('../core/symbols')\n\nfunction isCTLExcludingHtab (value) {\n if (value.length === 0) {\n return false\n }\n\n for (const char of value) {\n const code = char.charCodeAt(0)\n\n if (\n (code >= 0x00 || code <= 0x08) ||\n (code >= 0x0A || code <= 0x1F) ||\n code === 0x7F\n ) {\n return false\n }\n }\n}\n\n/**\n CHAR = \n token = 1*\n separators = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n | \",\" | \";\" | \":\" | \"\\\" | <\">\n | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n | \"{\" | \"}\" | SP | HT\n * @param {string} name\n */\nfunction validateCookieName (name) {\n for (const char of name) {\n const code = char.charCodeAt(0)\n\n if (\n (code <= 0x20 || code > 0x7F) ||\n char === '(' ||\n char === ')' ||\n char === '>' ||\n char === '<' ||\n char === '@' ||\n char === ',' ||\n char === ';' ||\n char === ':' ||\n char === '\\\\' ||\n char === '\"' ||\n char === '/' ||\n char === '[' ||\n char === ']' ||\n char === '?' ||\n char === '=' ||\n char === '{' ||\n char === '}'\n ) {\n throw new Error('Invalid cookie name')\n }\n }\n}\n\n/**\n cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n ; US-ASCII characters excluding CTLs,\n ; whitespace DQUOTE, comma, semicolon,\n ; and backslash\n * @param {string} value\n */\nfunction validateCookieValue (value) {\n for (const char of value) {\n const code = char.charCodeAt(0)\n\n if (\n code < 0x21 || // exclude CTLs (0-31)\n code === 0x22 ||\n code === 0x2C ||\n code === 0x3B ||\n code === 0x5C ||\n code > 0x7E // non-ascii\n ) {\n throw new Error('Invalid header value')\n }\n }\n}\n\n/**\n * path-value = \n * @param {string} path\n */\nfunction validateCookiePath (path) {\n for (const char of path) {\n const code = char.charCodeAt(0)\n\n if (code < 0x21 || char === ';') {\n throw new Error('Invalid cookie path')\n }\n }\n}\n\n/**\n * I have no idea why these values aren't allowed to be honest,\n * but Deno tests these. - Khafra\n * @param {string} domain\n */\nfunction validateCookieDomain (domain) {\n if (\n domain.startsWith('-') ||\n domain.endsWith('.') ||\n domain.endsWith('-')\n ) {\n throw new Error('Invalid cookie domain')\n }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1\n * @param {number|Date} date\n IMF-fixdate = day-name \",\" SP date1 SP time-of-day SP GMT\n ; fixed length/zone/capitalization subset of the format\n ; see Section 3.3 of [RFC5322]\n\n day-name = %x4D.6F.6E ; \"Mon\", case-sensitive\n / %x54.75.65 ; \"Tue\", case-sensitive\n / %x57.65.64 ; \"Wed\", case-sensitive\n / %x54.68.75 ; \"Thu\", case-sensitive\n / %x46.72.69 ; \"Fri\", case-sensitive\n / %x53.61.74 ; \"Sat\", case-sensitive\n / %x53.75.6E ; \"Sun\", case-sensitive\n date1 = day SP month SP year\n ; e.g., 02 Jun 1982\n\n day = 2DIGIT\n month = %x4A.61.6E ; \"Jan\", case-sensitive\n / %x46.65.62 ; \"Feb\", case-sensitive\n / %x4D.61.72 ; \"Mar\", case-sensitive\n / %x41.70.72 ; \"Apr\", case-sensitive\n / %x4D.61.79 ; \"May\", case-sensitive\n / %x4A.75.6E ; \"Jun\", case-sensitive\n / %x4A.75.6C ; \"Jul\", case-sensitive\n / %x41.75.67 ; \"Aug\", case-sensitive\n / %x53.65.70 ; \"Sep\", case-sensitive\n / %x4F.63.74 ; \"Oct\", case-sensitive\n / %x4E.6F.76 ; \"Nov\", case-sensitive\n / %x44.65.63 ; \"Dec\", case-sensitive\n year = 4DIGIT\n\n GMT = %x47.4D.54 ; \"GMT\", case-sensitive\n\n time-of-day = hour \":\" minute \":\" second\n ; 00:00:00 - 23:59:60 (leap second)\n\n hour = 2DIGIT\n minute = 2DIGIT\n second = 2DIGIT\n */\nfunction toIMFDate (date) {\n if (typeof date === 'number') {\n date = new Date(date)\n }\n\n const days = [\n 'Sun', 'Mon', 'Tue', 'Wed',\n 'Thu', 'Fri', 'Sat'\n ]\n\n const months = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n ]\n\n const dayName = days[date.getUTCDay()]\n const day = date.getUTCDate().toString().padStart(2, '0')\n const month = months[date.getUTCMonth()]\n const year = date.getUTCFullYear()\n const hour = date.getUTCHours().toString().padStart(2, '0')\n const minute = date.getUTCMinutes().toString().padStart(2, '0')\n const second = date.getUTCSeconds().toString().padStart(2, '0')\n\n return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT`\n}\n\n/**\n max-age-av = \"Max-Age=\" non-zero-digit *DIGIT\n ; In practice, both expires-av and max-age-av\n ; are limited to dates representable by the\n ; user agent.\n * @param {number} maxAge\n */\nfunction validateCookieMaxAge (maxAge) {\n if (maxAge < 0) {\n throw new Error('Invalid cookie max-age')\n }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1\n * @param {import('./index').Cookie} cookie\n */\nfunction stringify (cookie) {\n if (cookie.name.length === 0) {\n return null\n }\n\n validateCookieName(cookie.name)\n validateCookieValue(cookie.value)\n\n const out = [`${cookie.name}=${cookie.value}`]\n\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2\n if (cookie.name.startsWith('__Secure-')) {\n cookie.secure = true\n }\n\n if (cookie.name.startsWith('__Host-')) {\n cookie.secure = true\n cookie.domain = null\n cookie.path = '/'\n }\n\n if (cookie.secure) {\n out.push('Secure')\n }\n\n if (cookie.httpOnly) {\n out.push('HttpOnly')\n }\n\n if (typeof cookie.maxAge === 'number') {\n validateCookieMaxAge(cookie.maxAge)\n out.push(`Max-Age=${cookie.maxAge}`)\n }\n\n if (cookie.domain) {\n validateCookieDomain(cookie.domain)\n out.push(`Domain=${cookie.domain}`)\n }\n\n if (cookie.path) {\n validateCookiePath(cookie.path)\n out.push(`Path=${cookie.path}`)\n }\n\n if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') {\n out.push(`Expires=${toIMFDate(cookie.expires)}`)\n }\n\n if (cookie.sameSite) {\n out.push(`SameSite=${cookie.sameSite}`)\n }\n\n for (const part of cookie.unparsed) {\n if (!part.includes('=')) {\n throw new Error('Invalid unparsed')\n }\n\n const [key, ...value] = part.split('=')\n\n out.push(`${key.trim()}=${value.join('=')}`)\n }\n\n return out.join('; ')\n}\n\nlet kHeadersListNode\n\nfunction getHeadersList (headers) {\n if (headers[kHeadersList]) {\n return headers[kHeadersList]\n }\n\n if (!kHeadersListNode) {\n kHeadersListNode = Object.getOwnPropertySymbols(headers).find(\n (symbol) => symbol.description === 'headers list'\n )\n\n assert(kHeadersListNode, 'Headers cannot be parsed')\n }\n\n const headersList = headers[kHeadersListNode]\n assert(headersList)\n\n return headersList\n}\n\nmodule.exports = {\n isCTLExcludingHtab,\n stringify,\n getHeadersList\n}\n","'use strict'\n\nconst net = require('net')\nconst assert = require('assert')\nconst util = require('./util')\nconst { InvalidArgumentError, ConnectTimeoutError } = require('./errors')\n\nlet tls // include tls conditionally since it is not always available\n\n// TODO: session re-use does not wait for the first\n// connection to resolve the session and might therefore\n// resolve the same servername multiple times even when\n// re-use is enabled.\n\nlet SessionCache\n// FIXME: remove workaround when the Node bug is fixed\n// https://github.com/nodejs/node/issues/49344#issuecomment-1741776308\nif (global.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) {\n SessionCache = class WeakSessionCache {\n constructor (maxCachedSessions) {\n this._maxCachedSessions = maxCachedSessions\n this._sessionCache = new Map()\n this._sessionRegistry = new global.FinalizationRegistry((key) => {\n if (this._sessionCache.size < this._maxCachedSessions) {\n return\n }\n\n const ref = this._sessionCache.get(key)\n if (ref !== undefined && ref.deref() === undefined) {\n this._sessionCache.delete(key)\n }\n })\n }\n\n get (sessionKey) {\n const ref = this._sessionCache.get(sessionKey)\n return ref ? ref.deref() : null\n }\n\n set (sessionKey, session) {\n if (this._maxCachedSessions === 0) {\n return\n }\n\n this._sessionCache.set(sessionKey, new WeakRef(session))\n this._sessionRegistry.register(session, sessionKey)\n }\n }\n} else {\n SessionCache = class SimpleSessionCache {\n constructor (maxCachedSessions) {\n this._maxCachedSessions = maxCachedSessions\n this._sessionCache = new Map()\n }\n\n get (sessionKey) {\n return this._sessionCache.get(sessionKey)\n }\n\n set (sessionKey, session) {\n if (this._maxCachedSessions === 0) {\n return\n }\n\n if (this._sessionCache.size >= this._maxCachedSessions) {\n // remove the oldest session\n const { value: oldestKey } = this._sessionCache.keys().next()\n this._sessionCache.delete(oldestKey)\n }\n\n this._sessionCache.set(sessionKey, session)\n }\n }\n}\n\nfunction buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) {\n if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) {\n throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero')\n }\n\n const options = { path: socketPath, ...opts }\n const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions)\n timeout = timeout == null ? 10e3 : timeout\n allowH2 = allowH2 != null ? allowH2 : false\n return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {\n let socket\n if (protocol === 'https:') {\n if (!tls) {\n tls = require('tls')\n }\n servername = servername || options.servername || util.getServerName(host) || null\n\n const sessionKey = servername || hostname\n const session = sessionCache.get(sessionKey) || null\n\n assert(sessionKey)\n\n socket = tls.connect({\n highWaterMark: 16384, // TLS in node can't have bigger HWM anyway...\n ...options,\n servername,\n session,\n localAddress,\n // TODO(HTTP/2): Add support for h2c\n ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'],\n socket: httpSocket, // upgrade socket connection\n port: port || 443,\n host: hostname\n })\n\n socket\n .on('session', function (session) {\n // TODO (fix): Can a session become invalid once established? Don't think so?\n sessionCache.set(sessionKey, session)\n })\n } else {\n assert(!httpSocket, 'httpSocket can only be sent on TLS update')\n socket = net.connect({\n highWaterMark: 64 * 1024, // Same as nodejs fs streams.\n ...options,\n localAddress,\n port: port || 80,\n host: hostname\n })\n }\n\n // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket\n if (options.keepAlive == null || options.keepAlive) {\n const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay\n socket.setKeepAlive(true, keepAliveInitialDelay)\n }\n\n const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout)\n\n socket\n .setNoDelay(true)\n .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () {\n cancelTimeout()\n\n if (callback) {\n const cb = callback\n callback = null\n cb(null, this)\n }\n })\n .on('error', function (err) {\n cancelTimeout()\n\n if (callback) {\n const cb = callback\n callback = null\n cb(err)\n }\n })\n\n return socket\n }\n}\n\nfunction setupTimeout (onConnectTimeout, timeout) {\n if (!timeout) {\n return () => {}\n }\n\n let s1 = null\n let s2 = null\n const timeoutId = setTimeout(() => {\n // setImmediate is added to make sure that we priotorise socket error events over timeouts\n s1 = setImmediate(() => {\n if (process.platform === 'win32') {\n // Windows needs an extra setImmediate probably due to implementation differences in the socket logic\n s2 = setImmediate(() => onConnectTimeout())\n } else {\n onConnectTimeout()\n }\n })\n }, timeout)\n return () => {\n clearTimeout(timeoutId)\n clearImmediate(s1)\n clearImmediate(s2)\n }\n}\n\nfunction onConnectTimeout (socket) {\n util.destroy(socket, new ConnectTimeoutError())\n}\n\nmodule.exports = buildConnector\n","'use strict'\n\nclass UndiciError extends Error {\n constructor (message) {\n super(message)\n this.name = 'UndiciError'\n this.code = 'UND_ERR'\n }\n}\n\nclass ConnectTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, ConnectTimeoutError)\n this.name = 'ConnectTimeoutError'\n this.message = message || 'Connect Timeout Error'\n this.code = 'UND_ERR_CONNECT_TIMEOUT'\n }\n}\n\nclass HeadersTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, HeadersTimeoutError)\n this.name = 'HeadersTimeoutError'\n this.message = message || 'Headers Timeout Error'\n this.code = 'UND_ERR_HEADERS_TIMEOUT'\n }\n}\n\nclass HeadersOverflowError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, HeadersOverflowError)\n this.name = 'HeadersOverflowError'\n this.message = message || 'Headers Overflow Error'\n this.code = 'UND_ERR_HEADERS_OVERFLOW'\n }\n}\n\nclass BodyTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, BodyTimeoutError)\n this.name = 'BodyTimeoutError'\n this.message = message || 'Body Timeout Error'\n this.code = 'UND_ERR_BODY_TIMEOUT'\n }\n}\n\nclass ResponseStatusCodeError extends UndiciError {\n constructor (message, statusCode, headers, body) {\n super(message)\n Error.captureStackTrace(this, ResponseStatusCodeError)\n this.name = 'ResponseStatusCodeError'\n this.message = message || 'Response Status Code Error'\n this.code = 'UND_ERR_RESPONSE_STATUS_CODE'\n this.body = body\n this.status = statusCode\n this.statusCode = statusCode\n this.headers = headers\n }\n}\n\nclass InvalidArgumentError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, InvalidArgumentError)\n this.name = 'InvalidArgumentError'\n this.message = message || 'Invalid Argument Error'\n this.code = 'UND_ERR_INVALID_ARG'\n }\n}\n\nclass InvalidReturnValueError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, InvalidReturnValueError)\n this.name = 'InvalidReturnValueError'\n this.message = message || 'Invalid Return Value Error'\n this.code = 'UND_ERR_INVALID_RETURN_VALUE'\n }\n}\n\nclass RequestAbortedError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, RequestAbortedError)\n this.name = 'AbortError'\n this.message = message || 'Request aborted'\n this.code = 'UND_ERR_ABORTED'\n }\n}\n\nclass InformationalError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, InformationalError)\n this.name = 'InformationalError'\n this.message = message || 'Request information'\n this.code = 'UND_ERR_INFO'\n }\n}\n\nclass RequestContentLengthMismatchError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, RequestContentLengthMismatchError)\n this.name = 'RequestContentLengthMismatchError'\n this.message = message || 'Request body length does not match content-length header'\n this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'\n }\n}\n\nclass ResponseContentLengthMismatchError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, ResponseContentLengthMismatchError)\n this.name = 'ResponseContentLengthMismatchError'\n this.message = message || 'Response body length does not match content-length header'\n this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'\n }\n}\n\nclass ClientDestroyedError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, ClientDestroyedError)\n this.name = 'ClientDestroyedError'\n this.message = message || 'The client is destroyed'\n this.code = 'UND_ERR_DESTROYED'\n }\n}\n\nclass ClientClosedError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, ClientClosedError)\n this.name = 'ClientClosedError'\n this.message = message || 'The client is closed'\n this.code = 'UND_ERR_CLOSED'\n }\n}\n\nclass SocketError extends UndiciError {\n constructor (message, socket) {\n super(message)\n Error.captureStackTrace(this, SocketError)\n this.name = 'SocketError'\n this.message = message || 'Socket error'\n this.code = 'UND_ERR_SOCKET'\n this.socket = socket\n }\n}\n\nclass NotSupportedError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, NotSupportedError)\n this.name = 'NotSupportedError'\n this.message = message || 'Not supported error'\n this.code = 'UND_ERR_NOT_SUPPORTED'\n }\n}\n\nclass BalancedPoolMissingUpstreamError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, NotSupportedError)\n this.name = 'MissingUpstreamError'\n this.message = message || 'No upstream has been added to the BalancedPool'\n this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'\n }\n}\n\nclass HTTPParserError extends Error {\n constructor (message, code, data) {\n super(message)\n Error.captureStackTrace(this, HTTPParserError)\n this.name = 'HTTPParserError'\n this.code = code ? `HPE_${code}` : undefined\n this.data = data ? data.toString() : undefined\n }\n}\n\nclass ResponseExceededMaxSizeError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, ResponseExceededMaxSizeError)\n this.name = 'ResponseExceededMaxSizeError'\n this.message = message || 'Response content exceeded max size'\n this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE'\n }\n}\n\nmodule.exports = {\n HTTPParserError,\n UndiciError,\n HeadersTimeoutError,\n HeadersOverflowError,\n BodyTimeoutError,\n RequestContentLengthMismatchError,\n ConnectTimeoutError,\n ResponseStatusCodeError,\n InvalidArgumentError,\n InvalidReturnValueError,\n RequestAbortedError,\n ClientDestroyedError,\n ClientClosedError,\n InformationalError,\n SocketError,\n NotSupportedError,\n ResponseContentLengthMismatchError,\n BalancedPoolMissingUpstreamError,\n ResponseExceededMaxSizeError\n}\n","'use strict'\n\nconst {\n InvalidArgumentError,\n NotSupportedError\n} = require('./errors')\nconst assert = require('assert')\nconst { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require('./symbols')\nconst util = require('./util')\n\n// tokenRegExp and headerCharRegex have been lifted from\n// https://github.com/nodejs/node/blob/main/lib/_http_common.js\n\n/**\n * Verifies that the given val is a valid HTTP token\n * per the rules defined in RFC 7230\n * See https://tools.ietf.org/html/rfc7230#section-3.2.6\n */\nconst tokenRegExp = /^[\\^_`a-zA-Z\\-0-9!#$%&'*+.|~]+$/\n\n/**\n * Matches if val contains an invalid field-vchar\n * field-value = *( field-content / obs-fold )\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n */\nconst headerCharRegex = /[^\\t\\x20-\\x7e\\x80-\\xff]/\n\n// Verifies that a given path is valid does not contain control chars \\x00 to \\x20\nconst invalidPathRegex = /[^\\u0021-\\u00ff]/\n\nconst kHandler = Symbol('handler')\n\nconst channels = {}\n\nlet extractBody\n\ntry {\n const diagnosticsChannel = require('diagnostics_channel')\n channels.create = diagnosticsChannel.channel('undici:request:create')\n channels.bodySent = diagnosticsChannel.channel('undici:request:bodySent')\n channels.headers = diagnosticsChannel.channel('undici:request:headers')\n channels.trailers = diagnosticsChannel.channel('undici:request:trailers')\n channels.error = diagnosticsChannel.channel('undici:request:error')\n} catch {\n channels.create = { hasSubscribers: false }\n channels.bodySent = { hasSubscribers: false }\n channels.headers = { hasSubscribers: false }\n channels.trailers = { hasSubscribers: false }\n channels.error = { hasSubscribers: false }\n}\n\nclass Request {\n constructor (origin, {\n path,\n method,\n body,\n headers,\n query,\n idempotent,\n blocking,\n upgrade,\n headersTimeout,\n bodyTimeout,\n reset,\n throwOnError,\n expectContinue\n }, handler) {\n if (typeof path !== 'string') {\n throw new InvalidArgumentError('path must be a string')\n } else if (\n path[0] !== '/' &&\n !(path.startsWith('http://') || path.startsWith('https://')) &&\n method !== 'CONNECT'\n ) {\n throw new InvalidArgumentError('path must be an absolute URL or start with a slash')\n } else if (invalidPathRegex.exec(path) !== null) {\n throw new InvalidArgumentError('invalid request path')\n }\n\n if (typeof method !== 'string') {\n throw new InvalidArgumentError('method must be a string')\n } else if (tokenRegExp.exec(method) === null) {\n throw new InvalidArgumentError('invalid request method')\n }\n\n if (upgrade && typeof upgrade !== 'string') {\n throw new InvalidArgumentError('upgrade must be a string')\n }\n\n if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {\n throw new InvalidArgumentError('invalid headersTimeout')\n }\n\n if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) {\n throw new InvalidArgumentError('invalid bodyTimeout')\n }\n\n if (reset != null && typeof reset !== 'boolean') {\n throw new InvalidArgumentError('invalid reset')\n }\n\n if (expectContinue != null && typeof expectContinue !== 'boolean') {\n throw new InvalidArgumentError('invalid expectContinue')\n }\n\n this.headersTimeout = headersTimeout\n\n this.bodyTimeout = bodyTimeout\n\n this.throwOnError = throwOnError === true\n\n this.method = method\n\n if (body == null) {\n this.body = null\n } else if (util.isStream(body)) {\n this.body = body\n } else if (util.isBuffer(body)) {\n this.body = body.byteLength ? body : null\n } else if (ArrayBuffer.isView(body)) {\n this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null\n } else if (body instanceof ArrayBuffer) {\n this.body = body.byteLength ? Buffer.from(body) : null\n } else if (typeof body === 'string') {\n this.body = body.length ? Buffer.from(body) : null\n } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) {\n this.body = body\n } else {\n throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable')\n }\n\n this.completed = false\n\n this.aborted = false\n\n this.upgrade = upgrade || null\n\n this.path = query ? util.buildURL(path, query) : path\n\n this.origin = origin\n\n this.idempotent = idempotent == null\n ? method === 'HEAD' || method === 'GET'\n : idempotent\n\n this.blocking = blocking == null ? false : blocking\n\n this.reset = reset == null ? null : reset\n\n this.host = null\n\n this.contentLength = null\n\n this.contentType = null\n\n this.headers = ''\n\n // Only for H2\n this.expectContinue = expectContinue != null ? expectContinue : false\n\n if (Array.isArray(headers)) {\n if (headers.length % 2 !== 0) {\n throw new InvalidArgumentError('headers array must be even')\n }\n for (let i = 0; i < headers.length; i += 2) {\n processHeader(this, headers[i], headers[i + 1])\n }\n } else if (headers && typeof headers === 'object') {\n const keys = Object.keys(headers)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n processHeader(this, key, headers[key])\n }\n } else if (headers != null) {\n throw new InvalidArgumentError('headers must be an object or an array')\n }\n\n if (util.isFormDataLike(this.body)) {\n if (util.nodeMajor < 16 || (util.nodeMajor === 16 && util.nodeMinor < 8)) {\n throw new InvalidArgumentError('Form-Data bodies are only supported in node v16.8 and newer.')\n }\n\n if (!extractBody) {\n extractBody = require('../fetch/body.js').extractBody\n }\n\n const [bodyStream, contentType] = extractBody(body)\n if (this.contentType == null) {\n this.contentType = contentType\n this.headers += `content-type: ${contentType}\\r\\n`\n }\n this.body = bodyStream.stream\n this.contentLength = bodyStream.length\n } else if (util.isBlobLike(body) && this.contentType == null && body.type) {\n this.contentType = body.type\n this.headers += `content-type: ${body.type}\\r\\n`\n }\n\n util.validateHandler(handler, method, upgrade)\n\n this.servername = util.getServerName(this.host)\n\n this[kHandler] = handler\n\n if (channels.create.hasSubscribers) {\n channels.create.publish({ request: this })\n }\n }\n\n onBodySent (chunk) {\n if (this[kHandler].onBodySent) {\n try {\n this[kHandler].onBodySent(chunk)\n } catch (err) {\n this.onError(err)\n }\n }\n }\n\n onRequestSent () {\n if (channels.bodySent.hasSubscribers) {\n channels.bodySent.publish({ request: this })\n }\n }\n\n onConnect (abort) {\n assert(!this.aborted)\n assert(!this.completed)\n\n return this[kHandler].onConnect(abort)\n }\n\n onHeaders (statusCode, headers, resume, statusText) {\n assert(!this.aborted)\n assert(!this.completed)\n\n if (channels.headers.hasSubscribers) {\n channels.headers.publish({ request: this, response: { statusCode, headers, statusText } })\n }\n\n return this[kHandler].onHeaders(statusCode, headers, resume, statusText)\n }\n\n onData (chunk) {\n assert(!this.aborted)\n assert(!this.completed)\n\n return this[kHandler].onData(chunk)\n }\n\n onUpgrade (statusCode, headers, socket) {\n assert(!this.aborted)\n assert(!this.completed)\n\n return this[kHandler].onUpgrade(statusCode, headers, socket)\n }\n\n onComplete (trailers) {\n assert(!this.aborted)\n\n this.completed = true\n if (channels.trailers.hasSubscribers) {\n channels.trailers.publish({ request: this, trailers })\n }\n return this[kHandler].onComplete(trailers)\n }\n\n onError (error) {\n if (channels.error.hasSubscribers) {\n channels.error.publish({ request: this, error })\n }\n\n if (this.aborted) {\n return\n }\n this.aborted = true\n return this[kHandler].onError(error)\n }\n\n // TODO: adjust to support H2\n addHeader (key, value) {\n processHeader(this, key, value)\n return this\n }\n\n static [kHTTP1BuildRequest] (origin, opts, handler) {\n // TODO: Migrate header parsing here, to make Requests\n // HTTP agnostic\n return new Request(origin, opts, handler)\n }\n\n static [kHTTP2BuildRequest] (origin, opts, handler) {\n const headers = opts.headers\n opts = { ...opts, headers: null }\n\n const request = new Request(origin, opts, handler)\n\n request.headers = {}\n\n if (Array.isArray(headers)) {\n if (headers.length % 2 !== 0) {\n throw new InvalidArgumentError('headers array must be even')\n }\n for (let i = 0; i < headers.length; i += 2) {\n processHeader(request, headers[i], headers[i + 1], true)\n }\n } else if (headers && typeof headers === 'object') {\n const keys = Object.keys(headers)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n processHeader(request, key, headers[key], true)\n }\n } else if (headers != null) {\n throw new InvalidArgumentError('headers must be an object or an array')\n }\n\n return request\n }\n\n static [kHTTP2CopyHeaders] (raw) {\n const rawHeaders = raw.split('\\r\\n')\n const headers = {}\n\n for (const header of rawHeaders) {\n const [key, value] = header.split(': ')\n\n if (value == null || value.length === 0) continue\n\n if (headers[key]) headers[key] += `,${value}`\n else headers[key] = value\n }\n\n return headers\n }\n}\n\nfunction processHeaderValue (key, val, skipAppend) {\n if (val && typeof val === 'object') {\n throw new InvalidArgumentError(`invalid ${key} header`)\n }\n\n val = val != null ? `${val}` : ''\n\n if (headerCharRegex.exec(val) !== null) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n }\n\n return skipAppend ? val : `${key}: ${val}\\r\\n`\n}\n\nfunction processHeader (request, key, val, skipAppend = false) {\n if (val && (typeof val === 'object' && !Array.isArray(val))) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n } else if (val === undefined) {\n return\n }\n\n if (\n request.host === null &&\n key.length === 4 &&\n key.toLowerCase() === 'host'\n ) {\n if (headerCharRegex.exec(val) !== null) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n }\n // Consumed by Client\n request.host = val\n } else if (\n request.contentLength === null &&\n key.length === 14 &&\n key.toLowerCase() === 'content-length'\n ) {\n request.contentLength = parseInt(val, 10)\n if (!Number.isFinite(request.contentLength)) {\n throw new InvalidArgumentError('invalid content-length header')\n }\n } else if (\n request.contentType === null &&\n key.length === 12 &&\n key.toLowerCase() === 'content-type'\n ) {\n request.contentType = val\n if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend)\n else request.headers += processHeaderValue(key, val)\n } else if (\n key.length === 17 &&\n key.toLowerCase() === 'transfer-encoding'\n ) {\n throw new InvalidArgumentError('invalid transfer-encoding header')\n } else if (\n key.length === 10 &&\n key.toLowerCase() === 'connection'\n ) {\n const value = typeof val === 'string' ? val.toLowerCase() : null\n if (value !== 'close' && value !== 'keep-alive') {\n throw new InvalidArgumentError('invalid connection header')\n } else if (value === 'close') {\n request.reset = true\n }\n } else if (\n key.length === 10 &&\n key.toLowerCase() === 'keep-alive'\n ) {\n throw new InvalidArgumentError('invalid keep-alive header')\n } else if (\n key.length === 7 &&\n key.toLowerCase() === 'upgrade'\n ) {\n throw new InvalidArgumentError('invalid upgrade header')\n } else if (\n key.length === 6 &&\n key.toLowerCase() === 'expect'\n ) {\n throw new NotSupportedError('expect header not supported')\n } else if (tokenRegExp.exec(key) === null) {\n throw new InvalidArgumentError('invalid header key')\n } else {\n if (Array.isArray(val)) {\n for (let i = 0; i < val.length; i++) {\n if (skipAppend) {\n if (request.headers[key]) request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`\n else request.headers[key] = processHeaderValue(key, val[i], skipAppend)\n } else {\n request.headers += processHeaderValue(key, val[i])\n }\n }\n } else {\n if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend)\n else request.headers += processHeaderValue(key, val)\n }\n }\n}\n\nmodule.exports = Request\n","module.exports = {\n kClose: Symbol('close'),\n kDestroy: Symbol('destroy'),\n kDispatch: Symbol('dispatch'),\n kUrl: Symbol('url'),\n kWriting: Symbol('writing'),\n kResuming: Symbol('resuming'),\n kQueue: Symbol('queue'),\n kConnect: Symbol('connect'),\n kConnecting: Symbol('connecting'),\n kHeadersList: Symbol('headers list'),\n kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'),\n kKeepAliveMaxTimeout: Symbol('max keep alive timeout'),\n kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'),\n kKeepAliveTimeoutValue: Symbol('keep alive timeout'),\n kKeepAlive: Symbol('keep alive'),\n kHeadersTimeout: Symbol('headers timeout'),\n kBodyTimeout: Symbol('body timeout'),\n kServerName: Symbol('server name'),\n kLocalAddress: Symbol('local address'),\n kHost: Symbol('host'),\n kNoRef: Symbol('no ref'),\n kBodyUsed: Symbol('used'),\n kRunning: Symbol('running'),\n kBlocking: Symbol('blocking'),\n kPending: Symbol('pending'),\n kSize: Symbol('size'),\n kBusy: Symbol('busy'),\n kQueued: Symbol('queued'),\n kFree: Symbol('free'),\n kConnected: Symbol('connected'),\n kClosed: Symbol('closed'),\n kNeedDrain: Symbol('need drain'),\n kReset: Symbol('reset'),\n kDestroyed: Symbol.for('nodejs.stream.destroyed'),\n kMaxHeadersSize: Symbol('max headers size'),\n kRunningIdx: Symbol('running index'),\n kPendingIdx: Symbol('pending index'),\n kError: Symbol('error'),\n kClients: Symbol('clients'),\n kClient: Symbol('client'),\n kParser: Symbol('parser'),\n kOnDestroyed: Symbol('destroy callbacks'),\n kPipelining: Symbol('pipelining'),\n kSocket: Symbol('socket'),\n kHostHeader: Symbol('host header'),\n kConnector: Symbol('connector'),\n kStrictContentLength: Symbol('strict content length'),\n kMaxRedirections: Symbol('maxRedirections'),\n kMaxRequests: Symbol('maxRequestsPerClient'),\n kProxy: Symbol('proxy agent options'),\n kCounter: Symbol('socket request counter'),\n kInterceptors: Symbol('dispatch interceptors'),\n kMaxResponseSize: Symbol('max response size'),\n kHTTP2Session: Symbol('http2Session'),\n kHTTP2SessionState: Symbol('http2Session state'),\n kHTTP2BuildRequest: Symbol('http2 build request'),\n kHTTP1BuildRequest: Symbol('http1 build request'),\n kHTTP2CopyHeaders: Symbol('http2 copy headers'),\n kHTTPConnVersion: Symbol('http connection version')\n}\n","'use strict'\n\nconst assert = require('assert')\nconst { kDestroyed, kBodyUsed } = require('./symbols')\nconst { IncomingMessage } = require('http')\nconst stream = require('stream')\nconst net = require('net')\nconst { InvalidArgumentError } = require('./errors')\nconst { Blob } = require('buffer')\nconst nodeUtil = require('util')\nconst { stringify } = require('querystring')\n\nconst [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v))\n\nfunction nop () {}\n\nfunction isStream (obj) {\n return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function'\n}\n\n// based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License)\nfunction isBlobLike (object) {\n return (Blob && object instanceof Blob) || (\n object &&\n typeof object === 'object' &&\n (typeof object.stream === 'function' ||\n typeof object.arrayBuffer === 'function') &&\n /^(Blob|File)$/.test(object[Symbol.toStringTag])\n )\n}\n\nfunction buildURL (url, queryParams) {\n if (url.includes('?') || url.includes('#')) {\n throw new Error('Query params cannot be passed when url already contains \"?\" or \"#\".')\n }\n\n const stringified = stringify(queryParams)\n\n if (stringified) {\n url += '?' + stringified\n }\n\n return url\n}\n\nfunction parseURL (url) {\n if (typeof url === 'string') {\n url = new URL(url)\n\n if (!/^https?:/.test(url.origin || url.protocol)) {\n throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n }\n\n return url\n }\n\n if (!url || typeof url !== 'object') {\n throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.')\n }\n\n if (!/^https?:/.test(url.origin || url.protocol)) {\n throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n }\n\n if (!(url instanceof URL)) {\n if (url.port != null && url.port !== '' && !Number.isFinite(parseInt(url.port))) {\n throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.')\n }\n\n if (url.path != null && typeof url.path !== 'string') {\n throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.')\n }\n\n if (url.pathname != null && typeof url.pathname !== 'string') {\n throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.')\n }\n\n if (url.hostname != null && typeof url.hostname !== 'string') {\n throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.')\n }\n\n if (url.origin != null && typeof url.origin !== 'string') {\n throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.')\n }\n\n const port = url.port != null\n ? url.port\n : (url.protocol === 'https:' ? 443 : 80)\n let origin = url.origin != null\n ? url.origin\n : `${url.protocol}//${url.hostname}:${port}`\n let path = url.path != null\n ? url.path\n : `${url.pathname || ''}${url.search || ''}`\n\n if (origin.endsWith('/')) {\n origin = origin.substring(0, origin.length - 1)\n }\n\n if (path && !path.startsWith('/')) {\n path = `/${path}`\n }\n // new URL(path, origin) is unsafe when `path` contains an absolute URL\n // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL:\n // If first parameter is a relative URL, second param is required, and will be used as the base URL.\n // If first parameter is an absolute URL, a given second param will be ignored.\n url = new URL(origin + path)\n }\n\n return url\n}\n\nfunction parseOrigin (url) {\n url = parseURL(url)\n\n if (url.pathname !== '/' || url.search || url.hash) {\n throw new InvalidArgumentError('invalid url')\n }\n\n return url\n}\n\nfunction getHostname (host) {\n if (host[0] === '[') {\n const idx = host.indexOf(']')\n\n assert(idx !== -1)\n return host.substr(1, idx - 1)\n }\n\n const idx = host.indexOf(':')\n if (idx === -1) return host\n\n return host.substr(0, idx)\n}\n\n// IP addresses are not valid server names per RFC6066\n// > Currently, the only server names supported are DNS hostnames\nfunction getServerName (host) {\n if (!host) {\n return null\n }\n\n assert.strictEqual(typeof host, 'string')\n\n const servername = getHostname(host)\n if (net.isIP(servername)) {\n return ''\n }\n\n return servername\n}\n\nfunction deepClone (obj) {\n return JSON.parse(JSON.stringify(obj))\n}\n\nfunction isAsyncIterable (obj) {\n return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function')\n}\n\nfunction isIterable (obj) {\n return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function'))\n}\n\nfunction bodyLength (body) {\n if (body == null) {\n return 0\n } else if (isStream(body)) {\n const state = body._readableState\n return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length)\n ? state.length\n : null\n } else if (isBlobLike(body)) {\n return body.size != null ? body.size : null\n } else if (isBuffer(body)) {\n return body.byteLength\n }\n\n return null\n}\n\nfunction isDestroyed (stream) {\n return !stream || !!(stream.destroyed || stream[kDestroyed])\n}\n\nfunction isReadableAborted (stream) {\n const state = stream && stream._readableState\n return isDestroyed(stream) && state && !state.endEmitted\n}\n\nfunction destroy (stream, err) {\n if (!isStream(stream) || isDestroyed(stream)) {\n return\n }\n\n if (typeof stream.destroy === 'function') {\n if (Object.getPrototypeOf(stream).constructor === IncomingMessage) {\n // See: https://github.com/nodejs/node/pull/38505/files\n stream.socket = null\n }\n\n stream.destroy(err)\n } else if (err) {\n process.nextTick((stream, err) => {\n stream.emit('error', err)\n }, stream, err)\n }\n\n if (stream.destroyed !== true) {\n stream[kDestroyed] = true\n }\n}\n\nconst KEEPALIVE_TIMEOUT_EXPR = /timeout=(\\d+)/\nfunction parseKeepAliveTimeout (val) {\n const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR)\n return m ? parseInt(m[1], 10) * 1000 : null\n}\n\nfunction parseHeaders (headers, obj = {}) {\n // For H2 support\n if (!Array.isArray(headers)) return headers\n\n for (let i = 0; i < headers.length; i += 2) {\n const key = headers[i].toString().toLowerCase()\n let val = obj[key]\n\n if (!val) {\n if (Array.isArray(headers[i + 1])) {\n obj[key] = headers[i + 1]\n } else {\n obj[key] = headers[i + 1].toString('utf8')\n }\n } else {\n if (!Array.isArray(val)) {\n val = [val]\n obj[key] = val\n }\n val.push(headers[i + 1].toString('utf8'))\n }\n }\n\n // See https://github.com/nodejs/node/pull/46528\n if ('content-length' in obj && 'content-disposition' in obj) {\n obj['content-disposition'] = Buffer.from(obj['content-disposition']).toString('latin1')\n }\n\n return obj\n}\n\nfunction parseRawHeaders (headers) {\n const ret = []\n let hasContentLength = false\n let contentDispositionIdx = -1\n\n for (let n = 0; n < headers.length; n += 2) {\n const key = headers[n + 0].toString()\n const val = headers[n + 1].toString('utf8')\n\n if (key.length === 14 && (key === 'content-length' || key.toLowerCase() === 'content-length')) {\n ret.push(key, val)\n hasContentLength = true\n } else if (key.length === 19 && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) {\n contentDispositionIdx = ret.push(key, val) - 1\n } else {\n ret.push(key, val)\n }\n }\n\n // See https://github.com/nodejs/node/pull/46528\n if (hasContentLength && contentDispositionIdx !== -1) {\n ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString('latin1')\n }\n\n return ret\n}\n\nfunction isBuffer (buffer) {\n // See, https://github.com/mcollina/undici/pull/319\n return buffer instanceof Uint8Array || Buffer.isBuffer(buffer)\n}\n\nfunction validateHandler (handler, method, upgrade) {\n if (!handler || typeof handler !== 'object') {\n throw new InvalidArgumentError('handler must be an object')\n }\n\n if (typeof handler.onConnect !== 'function') {\n throw new InvalidArgumentError('invalid onConnect method')\n }\n\n if (typeof handler.onError !== 'function') {\n throw new InvalidArgumentError('invalid onError method')\n }\n\n if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) {\n throw new InvalidArgumentError('invalid onBodySent method')\n }\n\n if (upgrade || method === 'CONNECT') {\n if (typeof handler.onUpgrade !== 'function') {\n throw new InvalidArgumentError('invalid onUpgrade method')\n }\n } else {\n if (typeof handler.onHeaders !== 'function') {\n throw new InvalidArgumentError('invalid onHeaders method')\n }\n\n if (typeof handler.onData !== 'function') {\n throw new InvalidArgumentError('invalid onData method')\n }\n\n if (typeof handler.onComplete !== 'function') {\n throw new InvalidArgumentError('invalid onComplete method')\n }\n }\n}\n\n// A body is disturbed if it has been read from and it cannot\n// be re-used without losing state or data.\nfunction isDisturbed (body) {\n return !!(body && (\n stream.isDisturbed\n ? stream.isDisturbed(body) || body[kBodyUsed] // TODO (fix): Why is body[kBodyUsed] needed?\n : body[kBodyUsed] ||\n body.readableDidRead ||\n (body._readableState && body._readableState.dataEmitted) ||\n isReadableAborted(body)\n ))\n}\n\nfunction isErrored (body) {\n return !!(body && (\n stream.isErrored\n ? stream.isErrored(body)\n : /state: 'errored'/.test(nodeUtil.inspect(body)\n )))\n}\n\nfunction isReadable (body) {\n return !!(body && (\n stream.isReadable\n ? stream.isReadable(body)\n : /state: 'readable'/.test(nodeUtil.inspect(body)\n )))\n}\n\nfunction getSocketInfo (socket) {\n return {\n localAddress: socket.localAddress,\n localPort: socket.localPort,\n remoteAddress: socket.remoteAddress,\n remotePort: socket.remotePort,\n remoteFamily: socket.remoteFamily,\n timeout: socket.timeout,\n bytesWritten: socket.bytesWritten,\n bytesRead: socket.bytesRead\n }\n}\n\nasync function * convertIterableToBuffer (iterable) {\n for await (const chunk of iterable) {\n yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n }\n}\n\nlet ReadableStream\nfunction ReadableStreamFrom (iterable) {\n if (!ReadableStream) {\n ReadableStream = require('stream/web').ReadableStream\n }\n\n if (ReadableStream.from) {\n return ReadableStream.from(convertIterableToBuffer(iterable))\n }\n\n let iterator\n return new ReadableStream(\n {\n async start () {\n iterator = iterable[Symbol.asyncIterator]()\n },\n async pull (controller) {\n const { done, value } = await iterator.next()\n if (done) {\n queueMicrotask(() => {\n controller.close()\n })\n } else {\n const buf = Buffer.isBuffer(value) ? value : Buffer.from(value)\n controller.enqueue(new Uint8Array(buf))\n }\n return controller.desiredSize > 0\n },\n async cancel (reason) {\n await iterator.return()\n }\n },\n 0\n )\n}\n\n// The chunk should be a FormData instance and contains\n// all the required methods.\nfunction isFormDataLike (object) {\n return (\n object &&\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.has === 'function' &&\n typeof object.set === 'function' &&\n object[Symbol.toStringTag] === 'FormData'\n )\n}\n\nfunction throwIfAborted (signal) {\n if (!signal) { return }\n if (typeof signal.throwIfAborted === 'function') {\n signal.throwIfAborted()\n } else {\n if (signal.aborted) {\n // DOMException not available < v17.0.0\n const err = new Error('The operation was aborted')\n err.name = 'AbortError'\n throw err\n }\n }\n}\n\nlet events\nfunction addAbortListener (signal, listener) {\n if (typeof Symbol.dispose === 'symbol') {\n if (!events) {\n events = require('events')\n }\n if (typeof events.addAbortListener === 'function' && 'aborted' in signal) {\n return events.addAbortListener(signal, listener)\n }\n }\n if ('addEventListener' in signal) {\n signal.addEventListener('abort', listener, { once: true })\n return () => signal.removeEventListener('abort', listener)\n }\n signal.addListener('abort', listener)\n return () => signal.removeListener('abort', listener)\n}\n\nconst hasToWellFormed = !!String.prototype.toWellFormed\n\n/**\n * @param {string} val\n */\nfunction toUSVString (val) {\n if (hasToWellFormed) {\n return `${val}`.toWellFormed()\n } else if (nodeUtil.toUSVString) {\n return nodeUtil.toUSVString(val)\n }\n\n return `${val}`\n}\n\nconst kEnumerableProperty = Object.create(null)\nkEnumerableProperty.enumerable = true\n\nmodule.exports = {\n kEnumerableProperty,\n nop,\n isDisturbed,\n isErrored,\n isReadable,\n toUSVString,\n isReadableAborted,\n isBlobLike,\n parseOrigin,\n parseURL,\n getServerName,\n isStream,\n isIterable,\n isAsyncIterable,\n isDestroyed,\n parseRawHeaders,\n parseHeaders,\n parseKeepAliveTimeout,\n destroy,\n bodyLength,\n deepClone,\n ReadableStreamFrom,\n isBuffer,\n validateHandler,\n getSocketInfo,\n isFormDataLike,\n buildURL,\n throwIfAborted,\n addAbortListener,\n nodeMajor,\n nodeMinor,\n nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13)\n}\n","'use strict'\n\nconst Dispatcher = require('./dispatcher')\nconst {\n ClientDestroyedError,\n ClientClosedError,\n InvalidArgumentError\n} = require('./core/errors')\nconst { kDestroy, kClose, kDispatch, kInterceptors } = require('./core/symbols')\n\nconst kDestroyed = Symbol('destroyed')\nconst kClosed = Symbol('closed')\nconst kOnDestroyed = Symbol('onDestroyed')\nconst kOnClosed = Symbol('onClosed')\nconst kInterceptedDispatch = Symbol('Intercepted Dispatch')\n\nclass DispatcherBase extends Dispatcher {\n constructor () {\n super()\n\n this[kDestroyed] = false\n this[kOnDestroyed] = null\n this[kClosed] = false\n this[kOnClosed] = []\n }\n\n get destroyed () {\n return this[kDestroyed]\n }\n\n get closed () {\n return this[kClosed]\n }\n\n get interceptors () {\n return this[kInterceptors]\n }\n\n set interceptors (newInterceptors) {\n if (newInterceptors) {\n for (let i = newInterceptors.length - 1; i >= 0; i--) {\n const interceptor = this[kInterceptors][i]\n if (typeof interceptor !== 'function') {\n throw new InvalidArgumentError('interceptor must be an function')\n }\n }\n }\n\n this[kInterceptors] = newInterceptors\n }\n\n close (callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n this.close((err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (this[kDestroyed]) {\n queueMicrotask(() => callback(new ClientDestroyedError(), null))\n return\n }\n\n if (this[kClosed]) {\n if (this[kOnClosed]) {\n this[kOnClosed].push(callback)\n } else {\n queueMicrotask(() => callback(null, null))\n }\n return\n }\n\n this[kClosed] = true\n this[kOnClosed].push(callback)\n\n const onClosed = () => {\n const callbacks = this[kOnClosed]\n this[kOnClosed] = null\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i](null, null)\n }\n }\n\n // Should not error.\n this[kClose]()\n .then(() => this.destroy())\n .then(() => {\n queueMicrotask(onClosed)\n })\n }\n\n destroy (err, callback) {\n if (typeof err === 'function') {\n callback = err\n err = null\n }\n\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n this.destroy(err, (err, data) => {\n return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data)\n })\n })\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (this[kDestroyed]) {\n if (this[kOnDestroyed]) {\n this[kOnDestroyed].push(callback)\n } else {\n queueMicrotask(() => callback(null, null))\n }\n return\n }\n\n if (!err) {\n err = new ClientDestroyedError()\n }\n\n this[kDestroyed] = true\n this[kOnDestroyed] = this[kOnDestroyed] || []\n this[kOnDestroyed].push(callback)\n\n const onDestroyed = () => {\n const callbacks = this[kOnDestroyed]\n this[kOnDestroyed] = null\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i](null, null)\n }\n }\n\n // Should not error.\n this[kDestroy](err).then(() => {\n queueMicrotask(onDestroyed)\n })\n }\n\n [kInterceptedDispatch] (opts, handler) {\n if (!this[kInterceptors] || this[kInterceptors].length === 0) {\n this[kInterceptedDispatch] = this[kDispatch]\n return this[kDispatch](opts, handler)\n }\n\n let dispatch = this[kDispatch].bind(this)\n for (let i = this[kInterceptors].length - 1; i >= 0; i--) {\n dispatch = this[kInterceptors][i](dispatch)\n }\n this[kInterceptedDispatch] = dispatch\n return dispatch(opts, handler)\n }\n\n dispatch (opts, handler) {\n if (!handler || typeof handler !== 'object') {\n throw new InvalidArgumentError('handler must be an object')\n }\n\n try {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('opts must be an object.')\n }\n\n if (this[kDestroyed] || this[kOnDestroyed]) {\n throw new ClientDestroyedError()\n }\n\n if (this[kClosed]) {\n throw new ClientClosedError()\n }\n\n return this[kInterceptedDispatch](opts, handler)\n } catch (err) {\n if (typeof handler.onError !== 'function') {\n throw new InvalidArgumentError('invalid onError method')\n }\n\n handler.onError(err)\n\n return false\n }\n }\n}\n\nmodule.exports = DispatcherBase\n","'use strict'\n\nconst EventEmitter = require('events')\n\nclass Dispatcher extends EventEmitter {\n dispatch () {\n throw new Error('not implemented')\n }\n\n close () {\n throw new Error('not implemented')\n }\n\n destroy () {\n throw new Error('not implemented')\n }\n}\n\nmodule.exports = Dispatcher\n","'use strict'\n\nconst Busboy = require('@fastify/busboy')\nconst util = require('../core/util')\nconst {\n ReadableStreamFrom,\n isBlobLike,\n isReadableStreamLike,\n readableStreamClose,\n createDeferredPromise,\n fullyReadBody\n} = require('./util')\nconst { FormData } = require('./formdata')\nconst { kState } = require('./symbols')\nconst { webidl } = require('./webidl')\nconst { DOMException, structuredClone } = require('./constants')\nconst { Blob, File: NativeFile } = require('buffer')\nconst { kBodyUsed } = require('../core/symbols')\nconst assert = require('assert')\nconst { isErrored } = require('../core/util')\nconst { isUint8Array, isArrayBuffer } = require('util/types')\nconst { File: UndiciFile } = require('./file')\nconst { parseMIMEType, serializeAMimeType } = require('./dataURL')\n\nlet ReadableStream = globalThis.ReadableStream\n\n/** @type {globalThis['File']} */\nconst File = NativeFile ?? UndiciFile\n\n// https://fetch.spec.whatwg.org/#concept-bodyinit-extract\nfunction extractBody (object, keepalive = false) {\n if (!ReadableStream) {\n ReadableStream = require('stream/web').ReadableStream\n }\n\n // 1. Let stream be null.\n let stream = null\n\n // 2. If object is a ReadableStream object, then set stream to object.\n if (object instanceof ReadableStream) {\n stream = object\n } else if (isBlobLike(object)) {\n // 3. Otherwise, if object is a Blob object, set stream to the\n // result of running object’s get stream.\n stream = object.stream()\n } else {\n // 4. Otherwise, set stream to a new ReadableStream object, and set\n // up stream.\n stream = new ReadableStream({\n async pull (controller) {\n controller.enqueue(\n typeof source === 'string' ? new TextEncoder().encode(source) : source\n )\n queueMicrotask(() => readableStreamClose(controller))\n },\n start () {},\n type: undefined\n })\n }\n\n // 5. Assert: stream is a ReadableStream object.\n assert(isReadableStreamLike(stream))\n\n // 6. Let action be null.\n let action = null\n\n // 7. Let source be null.\n let source = null\n\n // 8. Let length be null.\n let length = null\n\n // 9. Let type be null.\n let type = null\n\n // 10. Switch on object:\n if (typeof object === 'string') {\n // Set source to the UTF-8 encoding of object.\n // Note: setting source to a Uint8Array here breaks some mocking assumptions.\n source = object\n\n // Set type to `text/plain;charset=UTF-8`.\n type = 'text/plain;charset=UTF-8'\n } else if (object instanceof URLSearchParams) {\n // URLSearchParams\n\n // spec says to run application/x-www-form-urlencoded on body.list\n // this is implemented in Node.js as apart of an URLSearchParams instance toString method\n // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490\n // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100\n\n // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list.\n source = object.toString()\n\n // Set type to `application/x-www-form-urlencoded;charset=UTF-8`.\n type = 'application/x-www-form-urlencoded;charset=UTF-8'\n } else if (isArrayBuffer(object)) {\n // BufferSource/ArrayBuffer\n\n // Set source to a copy of the bytes held by object.\n source = new Uint8Array(object.slice())\n } else if (ArrayBuffer.isView(object)) {\n // BufferSource/ArrayBufferView\n\n // Set source to a copy of the bytes held by object.\n source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength))\n } else if (util.isFormDataLike(object)) {\n const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '0')}`\n const prefix = `--${boundary}\\r\\nContent-Disposition: form-data`\n\n /*! formdata-polyfill. MIT License. Jimmy Wärting */\n const escape = (str) =>\n str.replace(/\\n/g, '%0A').replace(/\\r/g, '%0D').replace(/\"/g, '%22')\n const normalizeLinefeeds = (value) => value.replace(/\\r?\\n|\\r/g, '\\r\\n')\n\n // Set action to this step: run the multipart/form-data\n // encoding algorithm, with object’s entry list and UTF-8.\n // - This ensures that the body is immutable and can't be changed afterwords\n // - That the content-length is calculated in advance.\n // - And that all parts are pre-encoded and ready to be sent.\n\n const enc = new TextEncoder()\n const blobParts = []\n const rn = new Uint8Array([13, 10]) // '\\r\\n'\n length = 0\n let hasUnknownSizeValue = false\n\n for (const [name, value] of object) {\n if (typeof value === 'string') {\n const chunk = enc.encode(prefix +\n `; name=\"${escape(normalizeLinefeeds(name))}\"` +\n `\\r\\n\\r\\n${normalizeLinefeeds(value)}\\r\\n`)\n blobParts.push(chunk)\n length += chunk.byteLength\n } else {\n const chunk = enc.encode(`${prefix}; name=\"${escape(normalizeLinefeeds(name))}\"` +\n (value.name ? `; filename=\"${escape(value.name)}\"` : '') + '\\r\\n' +\n `Content-Type: ${\n value.type || 'application/octet-stream'\n }\\r\\n\\r\\n`)\n blobParts.push(chunk, value, rn)\n if (typeof value.size === 'number') {\n length += chunk.byteLength + value.size + rn.byteLength\n } else {\n hasUnknownSizeValue = true\n }\n }\n }\n\n const chunk = enc.encode(`--${boundary}--`)\n blobParts.push(chunk)\n length += chunk.byteLength\n if (hasUnknownSizeValue) {\n length = null\n }\n\n // Set source to object.\n source = object\n\n action = async function * () {\n for (const part of blobParts) {\n if (part.stream) {\n yield * part.stream()\n } else {\n yield part\n }\n }\n }\n\n // Set type to `multipart/form-data; boundary=`,\n // followed by the multipart/form-data boundary string generated\n // by the multipart/form-data encoding algorithm.\n type = 'multipart/form-data; boundary=' + boundary\n } else if (isBlobLike(object)) {\n // Blob\n\n // Set source to object.\n source = object\n\n // Set length to object’s size.\n length = object.size\n\n // If object’s type attribute is not the empty byte sequence, set\n // type to its value.\n if (object.type) {\n type = object.type\n }\n } else if (typeof object[Symbol.asyncIterator] === 'function') {\n // If keepalive is true, then throw a TypeError.\n if (keepalive) {\n throw new TypeError('keepalive')\n }\n\n // If object is disturbed or locked, then throw a TypeError.\n if (util.isDisturbed(object) || object.locked) {\n throw new TypeError(\n 'Response body object should not be disturbed or locked'\n )\n }\n\n stream =\n object instanceof ReadableStream ? object : ReadableStreamFrom(object)\n }\n\n // 11. If source is a byte sequence, then set action to a\n // step that returns source and length to source’s length.\n if (typeof source === 'string' || util.isBuffer(source)) {\n length = Buffer.byteLength(source)\n }\n\n // 12. If action is non-null, then run these steps in in parallel:\n if (action != null) {\n // Run action.\n let iterator\n stream = new ReadableStream({\n async start () {\n iterator = action(object)[Symbol.asyncIterator]()\n },\n async pull (controller) {\n const { value, done } = await iterator.next()\n if (done) {\n // When running action is done, close stream.\n queueMicrotask(() => {\n controller.close()\n })\n } else {\n // Whenever one or more bytes are available and stream is not errored,\n // enqueue a Uint8Array wrapping an ArrayBuffer containing the available\n // bytes into stream.\n if (!isErrored(stream)) {\n controller.enqueue(new Uint8Array(value))\n }\n }\n return controller.desiredSize > 0\n },\n async cancel (reason) {\n await iterator.return()\n },\n type: undefined\n })\n }\n\n // 13. Let body be a body whose stream is stream, source is source,\n // and length is length.\n const body = { stream, source, length }\n\n // 14. Return (body, type).\n return [body, type]\n}\n\n// https://fetch.spec.whatwg.org/#bodyinit-safely-extract\nfunction safelyExtractBody (object, keepalive = false) {\n if (!ReadableStream) {\n // istanbul ignore next\n ReadableStream = require('stream/web').ReadableStream\n }\n\n // To safely extract a body and a `Content-Type` value from\n // a byte sequence or BodyInit object object, run these steps:\n\n // 1. If object is a ReadableStream object, then:\n if (object instanceof ReadableStream) {\n // Assert: object is neither disturbed nor locked.\n // istanbul ignore next\n assert(!util.isDisturbed(object), 'The body has already been consumed.')\n // istanbul ignore next\n assert(!object.locked, 'The stream is locked.')\n }\n\n // 2. Return the results of extracting object.\n return extractBody(object, keepalive)\n}\n\nfunction cloneBody (body) {\n // To clone a body body, run these steps:\n\n // https://fetch.spec.whatwg.org/#concept-body-clone\n\n // 1. Let « out1, out2 » be the result of teeing body’s stream.\n const [out1, out2] = body.stream.tee()\n const out2Clone = structuredClone(out2, { transfer: [out2] })\n // This, for whatever reasons, unrefs out2Clone which allows\n // the process to exit by itself.\n const [, finalClone] = out2Clone.tee()\n\n // 2. Set body’s stream to out1.\n body.stream = out1\n\n // 3. Return a body whose stream is out2 and other members are copied from body.\n return {\n stream: finalClone,\n length: body.length,\n source: body.source\n }\n}\n\nasync function * consumeBody (body) {\n if (body) {\n if (isUint8Array(body)) {\n yield body\n } else {\n const stream = body.stream\n\n if (util.isDisturbed(stream)) {\n throw new TypeError('The body has already been consumed.')\n }\n\n if (stream.locked) {\n throw new TypeError('The stream is locked.')\n }\n\n // Compat.\n stream[kBodyUsed] = true\n\n yield * stream\n }\n }\n}\n\nfunction throwIfAborted (state) {\n if (state.aborted) {\n throw new DOMException('The operation was aborted.', 'AbortError')\n }\n}\n\nfunction bodyMixinMethods (instance) {\n const methods = {\n blob () {\n // The blob() method steps are to return the result of\n // running consume body with this and the following step\n // given a byte sequence bytes: return a Blob whose\n // contents are bytes and whose type attribute is this’s\n // MIME type.\n return specConsumeBody(this, (bytes) => {\n let mimeType = bodyMimeType(this)\n\n if (mimeType === 'failure') {\n mimeType = ''\n } else if (mimeType) {\n mimeType = serializeAMimeType(mimeType)\n }\n\n // Return a Blob whose contents are bytes and type attribute\n // is mimeType.\n return new Blob([bytes], { type: mimeType })\n }, instance)\n },\n\n arrayBuffer () {\n // The arrayBuffer() method steps are to return the result\n // of running consume body with this and the following step\n // given a byte sequence bytes: return a new ArrayBuffer\n // whose contents are bytes.\n return specConsumeBody(this, (bytes) => {\n return new Uint8Array(bytes).buffer\n }, instance)\n },\n\n text () {\n // The text() method steps are to return the result of running\n // consume body with this and UTF-8 decode.\n return specConsumeBody(this, utf8DecodeBytes, instance)\n },\n\n json () {\n // The json() method steps are to return the result of running\n // consume body with this and parse JSON from bytes.\n return specConsumeBody(this, parseJSONFromBytes, instance)\n },\n\n async formData () {\n webidl.brandCheck(this, instance)\n\n throwIfAborted(this[kState])\n\n const contentType = this.headers.get('Content-Type')\n\n // If mimeType’s essence is \"multipart/form-data\", then:\n if (/multipart\\/form-data/.test(contentType)) {\n const headers = {}\n for (const [key, value] of this.headers) headers[key.toLowerCase()] = value\n\n const responseFormData = new FormData()\n\n let busboy\n\n try {\n busboy = new Busboy({\n headers,\n preservePath: true\n })\n } catch (err) {\n throw new DOMException(`${err}`, 'AbortError')\n }\n\n busboy.on('field', (name, value) => {\n responseFormData.append(name, value)\n })\n busboy.on('file', (name, value, filename, encoding, mimeType) => {\n const chunks = []\n\n if (encoding === 'base64' || encoding.toLowerCase() === 'base64') {\n let base64chunk = ''\n\n value.on('data', (chunk) => {\n base64chunk += chunk.toString().replace(/[\\r\\n]/gm, '')\n\n const end = base64chunk.length - base64chunk.length % 4\n chunks.push(Buffer.from(base64chunk.slice(0, end), 'base64'))\n\n base64chunk = base64chunk.slice(end)\n })\n value.on('end', () => {\n chunks.push(Buffer.from(base64chunk, 'base64'))\n responseFormData.append(name, new File(chunks, filename, { type: mimeType }))\n })\n } else {\n value.on('data', (chunk) => {\n chunks.push(chunk)\n })\n value.on('end', () => {\n responseFormData.append(name, new File(chunks, filename, { type: mimeType }))\n })\n }\n })\n\n const busboyResolve = new Promise((resolve, reject) => {\n busboy.on('finish', resolve)\n busboy.on('error', (err) => reject(new TypeError(err)))\n })\n\n if (this.body !== null) for await (const chunk of consumeBody(this[kState].body)) busboy.write(chunk)\n busboy.end()\n await busboyResolve\n\n return responseFormData\n } else if (/application\\/x-www-form-urlencoded/.test(contentType)) {\n // Otherwise, if mimeType’s essence is \"application/x-www-form-urlencoded\", then:\n\n // 1. Let entries be the result of parsing bytes.\n let entries\n try {\n let text = ''\n // application/x-www-form-urlencoded parser will keep the BOM.\n // https://url.spec.whatwg.org/#concept-urlencoded-parser\n const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true })\n for await (const chunk of consumeBody(this[kState].body)) {\n if (!isUint8Array(chunk)) {\n throw new TypeError('Expected Uint8Array chunk')\n }\n text += textDecoder.decode(chunk, { stream: true })\n }\n text += textDecoder.decode()\n entries = new URLSearchParams(text)\n } catch (err) {\n // istanbul ignore next: Unclear when new URLSearchParams can fail on a string.\n // 2. If entries is failure, then throw a TypeError.\n throw Object.assign(new TypeError(), { cause: err })\n }\n\n // 3. Return a new FormData object whose entries are entries.\n const formData = new FormData()\n for (const [name, value] of entries) {\n formData.append(name, value)\n }\n return formData\n } else {\n // Wait a tick before checking if the request has been aborted.\n // Otherwise, a TypeError can be thrown when an AbortError should.\n await Promise.resolve()\n\n throwIfAborted(this[kState])\n\n // Otherwise, throw a TypeError.\n throw webidl.errors.exception({\n header: `${instance.name}.formData`,\n message: 'Could not parse content as FormData.'\n })\n }\n }\n }\n\n return methods\n}\n\nfunction mixinBody (prototype) {\n Object.assign(prototype.prototype, bodyMixinMethods(prototype))\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-body-consume-body\n * @param {Response|Request} object\n * @param {(value: unknown) => unknown} convertBytesToJSValue\n * @param {Response|Request} instance\n */\nasync function specConsumeBody (object, convertBytesToJSValue, instance) {\n webidl.brandCheck(object, instance)\n\n throwIfAborted(object[kState])\n\n // 1. If object is unusable, then return a promise rejected\n // with a TypeError.\n if (bodyUnusable(object[kState].body)) {\n throw new TypeError('Body is unusable')\n }\n\n // 2. Let promise be a new promise.\n const promise = createDeferredPromise()\n\n // 3. Let errorSteps given error be to reject promise with error.\n const errorSteps = (error) => promise.reject(error)\n\n // 4. Let successSteps given a byte sequence data be to resolve\n // promise with the result of running convertBytesToJSValue\n // with data. If that threw an exception, then run errorSteps\n // with that exception.\n const successSteps = (data) => {\n try {\n promise.resolve(convertBytesToJSValue(data))\n } catch (e) {\n errorSteps(e)\n }\n }\n\n // 5. If object’s body is null, then run successSteps with an\n // empty byte sequence.\n if (object[kState].body == null) {\n successSteps(new Uint8Array())\n return promise.promise\n }\n\n // 6. Otherwise, fully read object’s body given successSteps,\n // errorSteps, and object’s relevant global object.\n await fullyReadBody(object[kState].body, successSteps, errorSteps)\n\n // 7. Return promise.\n return promise.promise\n}\n\n// https://fetch.spec.whatwg.org/#body-unusable\nfunction bodyUnusable (body) {\n // An object including the Body interface mixin is\n // said to be unusable if its body is non-null and\n // its body’s stream is disturbed or locked.\n return body != null && (body.stream.locked || util.isDisturbed(body.stream))\n}\n\n/**\n * @see https://encoding.spec.whatwg.org/#utf-8-decode\n * @param {Buffer} buffer\n */\nfunction utf8DecodeBytes (buffer) {\n if (buffer.length === 0) {\n return ''\n }\n\n // 1. Let buffer be the result of peeking three bytes from\n // ioQueue, converted to a byte sequence.\n\n // 2. If buffer is 0xEF 0xBB 0xBF, then read three\n // bytes from ioQueue. (Do nothing with those bytes.)\n if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {\n buffer = buffer.subarray(3)\n }\n\n // 3. Process a queue with an instance of UTF-8’s\n // decoder, ioQueue, output, and \"replacement\".\n const output = new TextDecoder().decode(buffer)\n\n // 4. Return output.\n return output\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value\n * @param {Uint8Array} bytes\n */\nfunction parseJSONFromBytes (bytes) {\n return JSON.parse(utf8DecodeBytes(bytes))\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-body-mime-type\n * @param {import('./response').Response|import('./request').Request} object\n */\nfunction bodyMimeType (object) {\n const { headersList } = object[kState]\n const contentType = headersList.get('content-type')\n\n if (contentType === null) {\n return 'failure'\n }\n\n return parseMIMEType(contentType)\n}\n\nmodule.exports = {\n extractBody,\n safelyExtractBody,\n cloneBody,\n mixinBody\n}\n","'use strict'\n\nconst { MessageChannel, receiveMessageOnPort } = require('worker_threads')\n\nconst corsSafeListedMethods = ['GET', 'HEAD', 'POST']\n\nconst nullBodyStatus = [101, 204, 205, 304]\n\nconst redirectStatus = [301, 302, 303, 307, 308]\n\n// https://fetch.spec.whatwg.org/#block-bad-port\nconst badPorts = [\n '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79',\n '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137',\n '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532',\n '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723',\n '2049', '3659', '4045', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6697',\n '10080'\n]\n\n// https://w3c.github.io/webappsec-referrer-policy/#referrer-policies\nconst referrerPolicy = [\n '',\n 'no-referrer',\n 'no-referrer-when-downgrade',\n 'same-origin',\n 'origin',\n 'strict-origin',\n 'origin-when-cross-origin',\n 'strict-origin-when-cross-origin',\n 'unsafe-url'\n]\n\nconst requestRedirect = ['follow', 'manual', 'error']\n\nconst safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE']\n\nconst requestMode = ['navigate', 'same-origin', 'no-cors', 'cors']\n\nconst requestCredentials = ['omit', 'same-origin', 'include']\n\nconst requestCache = [\n 'default',\n 'no-store',\n 'reload',\n 'no-cache',\n 'force-cache',\n 'only-if-cached'\n]\n\n// https://fetch.spec.whatwg.org/#request-body-header-name\nconst requestBodyHeader = [\n 'content-encoding',\n 'content-language',\n 'content-location',\n 'content-type',\n // See https://github.com/nodejs/undici/issues/2021\n // 'Content-Length' is a forbidden header name, which is typically\n // removed in the Headers implementation. However, undici doesn't\n // filter out headers, so we add it here.\n 'content-length'\n]\n\n// https://fetch.spec.whatwg.org/#enumdef-requestduplex\nconst requestDuplex = [\n 'half'\n]\n\n// http://fetch.spec.whatwg.org/#forbidden-method\nconst forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK']\n\nconst subresource = [\n 'audio',\n 'audioworklet',\n 'font',\n 'image',\n 'manifest',\n 'paintworklet',\n 'script',\n 'style',\n 'track',\n 'video',\n 'xslt',\n ''\n]\n\n/** @type {globalThis['DOMException']} */\nconst DOMException = globalThis.DOMException ?? (() => {\n // DOMException was only made a global in Node v17.0.0,\n // but fetch supports >= v16.8.\n try {\n atob('~')\n } catch (err) {\n return Object.getPrototypeOf(err).constructor\n }\n})()\n\nlet channel\n\n/** @type {globalThis['structuredClone']} */\nconst structuredClone =\n globalThis.structuredClone ??\n // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js\n // structuredClone was added in v17.0.0, but fetch supports v16.8\n function structuredClone (value, options = undefined) {\n if (arguments.length === 0) {\n throw new TypeError('missing argument')\n }\n\n if (!channel) {\n channel = new MessageChannel()\n }\n channel.port1.unref()\n channel.port2.unref()\n channel.port1.postMessage(value, options?.transfer)\n return receiveMessageOnPort(channel.port2).message\n }\n\nmodule.exports = {\n DOMException,\n structuredClone,\n subresource,\n forbiddenMethods,\n requestBodyHeader,\n referrerPolicy,\n requestRedirect,\n requestMode,\n requestCredentials,\n requestCache,\n redirectStatus,\n corsSafeListedMethods,\n nullBodyStatus,\n safeMethods,\n badPorts,\n requestDuplex\n}\n","const assert = require('assert')\nconst { atob } = require('buffer')\nconst { isomorphicDecode } = require('./util')\n\nconst encoder = new TextEncoder()\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#http-token-code-point\n */\nconst HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/\nconst HTTP_WHITESPACE_REGEX = /(\\u000A|\\u000D|\\u0009|\\u0020)/ // eslint-disable-line\n/**\n * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point\n */\nconst HTTP_QUOTED_STRING_TOKENS = /[\\u0009|\\u0020-\\u007E|\\u0080-\\u00FF]/ // eslint-disable-line\n\n// https://fetch.spec.whatwg.org/#data-url-processor\n/** @param {URL} dataURL */\nfunction dataURLProcessor (dataURL) {\n // 1. Assert: dataURL’s scheme is \"data\".\n assert(dataURL.protocol === 'data:')\n\n // 2. Let input be the result of running the URL\n // serializer on dataURL with exclude fragment\n // set to true.\n let input = URLSerializer(dataURL, true)\n\n // 3. Remove the leading \"data:\" string from input.\n input = input.slice(5)\n\n // 4. Let position point at the start of input.\n const position = { position: 0 }\n\n // 5. Let mimeType be the result of collecting a\n // sequence of code points that are not equal\n // to U+002C (,), given position.\n let mimeType = collectASequenceOfCodePointsFast(\n ',',\n input,\n position\n )\n\n // 6. Strip leading and trailing ASCII whitespace\n // from mimeType.\n // Undici implementation note: we need to store the\n // length because if the mimetype has spaces removed,\n // the wrong amount will be sliced from the input in\n // step #9\n const mimeTypeLength = mimeType.length\n mimeType = removeASCIIWhitespace(mimeType, true, true)\n\n // 7. If position is past the end of input, then\n // return failure\n if (position.position >= input.length) {\n return 'failure'\n }\n\n // 8. Advance position by 1.\n position.position++\n\n // 9. Let encodedBody be the remainder of input.\n const encodedBody = input.slice(mimeTypeLength + 1)\n\n // 10. Let body be the percent-decoding of encodedBody.\n let body = stringPercentDecode(encodedBody)\n\n // 11. If mimeType ends with U+003B (;), followed by\n // zero or more U+0020 SPACE, followed by an ASCII\n // case-insensitive match for \"base64\", then:\n if (/;(\\u0020){0,}base64$/i.test(mimeType)) {\n // 1. Let stringBody be the isomorphic decode of body.\n const stringBody = isomorphicDecode(body)\n\n // 2. Set body to the forgiving-base64 decode of\n // stringBody.\n body = forgivingBase64(stringBody)\n\n // 3. If body is failure, then return failure.\n if (body === 'failure') {\n return 'failure'\n }\n\n // 4. Remove the last 6 code points from mimeType.\n mimeType = mimeType.slice(0, -6)\n\n // 5. Remove trailing U+0020 SPACE code points from mimeType,\n // if any.\n mimeType = mimeType.replace(/(\\u0020)+$/, '')\n\n // 6. Remove the last U+003B (;) code point from mimeType.\n mimeType = mimeType.slice(0, -1)\n }\n\n // 12. If mimeType starts with U+003B (;), then prepend\n // \"text/plain\" to mimeType.\n if (mimeType.startsWith(';')) {\n mimeType = 'text/plain' + mimeType\n }\n\n // 13. Let mimeTypeRecord be the result of parsing\n // mimeType.\n let mimeTypeRecord = parseMIMEType(mimeType)\n\n // 14. If mimeTypeRecord is failure, then set\n // mimeTypeRecord to text/plain;charset=US-ASCII.\n if (mimeTypeRecord === 'failure') {\n mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII')\n }\n\n // 15. Return a new data: URL struct whose MIME\n // type is mimeTypeRecord and body is body.\n // https://fetch.spec.whatwg.org/#data-url-struct\n return { mimeType: mimeTypeRecord, body }\n}\n\n// https://url.spec.whatwg.org/#concept-url-serializer\n/**\n * @param {URL} url\n * @param {boolean} excludeFragment\n */\nfunction URLSerializer (url, excludeFragment = false) {\n const href = url.href\n\n if (!excludeFragment) {\n return href\n }\n\n const hash = href.lastIndexOf('#')\n if (hash === -1) {\n return href\n }\n return href.slice(0, hash)\n}\n\n// https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points\n/**\n * @param {(char: string) => boolean} condition\n * @param {string} input\n * @param {{ position: number }} position\n */\nfunction collectASequenceOfCodePoints (condition, input, position) {\n // 1. Let result be the empty string.\n let result = ''\n\n // 2. While position doesn’t point past the end of input and the\n // code point at position within input meets the condition condition:\n while (position.position < input.length && condition(input[position.position])) {\n // 1. Append that code point to the end of result.\n result += input[position.position]\n\n // 2. Advance position by 1.\n position.position++\n }\n\n // 3. Return result.\n return result\n}\n\n/**\n * A faster collectASequenceOfCodePoints that only works when comparing a single character.\n * @param {string} char\n * @param {string} input\n * @param {{ position: number }} position\n */\nfunction collectASequenceOfCodePointsFast (char, input, position) {\n const idx = input.indexOf(char, position.position)\n const start = position.position\n\n if (idx === -1) {\n position.position = input.length\n return input.slice(start)\n }\n\n position.position = idx\n return input.slice(start, position.position)\n}\n\n// https://url.spec.whatwg.org/#string-percent-decode\n/** @param {string} input */\nfunction stringPercentDecode (input) {\n // 1. Let bytes be the UTF-8 encoding of input.\n const bytes = encoder.encode(input)\n\n // 2. Return the percent-decoding of bytes.\n return percentDecode(bytes)\n}\n\n// https://url.spec.whatwg.org/#percent-decode\n/** @param {Uint8Array} input */\nfunction percentDecode (input) {\n // 1. Let output be an empty byte sequence.\n /** @type {number[]} */\n const output = []\n\n // 2. For each byte byte in input:\n for (let i = 0; i < input.length; i++) {\n const byte = input[i]\n\n // 1. If byte is not 0x25 (%), then append byte to output.\n if (byte !== 0x25) {\n output.push(byte)\n\n // 2. Otherwise, if byte is 0x25 (%) and the next two bytes\n // after byte in input are not in the ranges\n // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F),\n // and 0x61 (a) to 0x66 (f), all inclusive, append byte\n // to output.\n } else if (\n byte === 0x25 &&\n !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2]))\n ) {\n output.push(0x25)\n\n // 3. Otherwise:\n } else {\n // 1. Let bytePoint be the two bytes after byte in input,\n // decoded, and then interpreted as hexadecimal number.\n const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2])\n const bytePoint = Number.parseInt(nextTwoBytes, 16)\n\n // 2. Append a byte whose value is bytePoint to output.\n output.push(bytePoint)\n\n // 3. Skip the next two bytes in input.\n i += 2\n }\n }\n\n // 3. Return output.\n return Uint8Array.from(output)\n}\n\n// https://mimesniff.spec.whatwg.org/#parse-a-mime-type\n/** @param {string} input */\nfunction parseMIMEType (input) {\n // 1. Remove any leading and trailing HTTP whitespace\n // from input.\n input = removeHTTPWhitespace(input, true, true)\n\n // 2. Let position be a position variable for input,\n // initially pointing at the start of input.\n const position = { position: 0 }\n\n // 3. Let type be the result of collecting a sequence\n // of code points that are not U+002F (/) from\n // input, given position.\n const type = collectASequenceOfCodePointsFast(\n '/',\n input,\n position\n )\n\n // 4. If type is the empty string or does not solely\n // contain HTTP token code points, then return failure.\n // https://mimesniff.spec.whatwg.org/#http-token-code-point\n if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) {\n return 'failure'\n }\n\n // 5. If position is past the end of input, then return\n // failure\n if (position.position > input.length) {\n return 'failure'\n }\n\n // 6. Advance position by 1. (This skips past U+002F (/).)\n position.position++\n\n // 7. Let subtype be the result of collecting a sequence of\n // code points that are not U+003B (;) from input, given\n // position.\n let subtype = collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 8. Remove any trailing HTTP whitespace from subtype.\n subtype = removeHTTPWhitespace(subtype, false, true)\n\n // 9. If subtype is the empty string or does not solely\n // contain HTTP token code points, then return failure.\n if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) {\n return 'failure'\n }\n\n const typeLowercase = type.toLowerCase()\n const subtypeLowercase = subtype.toLowerCase()\n\n // 10. Let mimeType be a new MIME type record whose type\n // is type, in ASCII lowercase, and subtype is subtype,\n // in ASCII lowercase.\n // https://mimesniff.spec.whatwg.org/#mime-type\n const mimeType = {\n type: typeLowercase,\n subtype: subtypeLowercase,\n /** @type {Map} */\n parameters: new Map(),\n // https://mimesniff.spec.whatwg.org/#mime-type-essence\n essence: `${typeLowercase}/${subtypeLowercase}`\n }\n\n // 11. While position is not past the end of input:\n while (position.position < input.length) {\n // 1. Advance position by 1. (This skips past U+003B (;).)\n position.position++\n\n // 2. Collect a sequence of code points that are HTTP\n // whitespace from input given position.\n collectASequenceOfCodePoints(\n // https://fetch.spec.whatwg.org/#http-whitespace\n char => HTTP_WHITESPACE_REGEX.test(char),\n input,\n position\n )\n\n // 3. Let parameterName be the result of collecting a\n // sequence of code points that are not U+003B (;)\n // or U+003D (=) from input, given position.\n let parameterName = collectASequenceOfCodePoints(\n (char) => char !== ';' && char !== '=',\n input,\n position\n )\n\n // 4. Set parameterName to parameterName, in ASCII\n // lowercase.\n parameterName = parameterName.toLowerCase()\n\n // 5. If position is not past the end of input, then:\n if (position.position < input.length) {\n // 1. If the code point at position within input is\n // U+003B (;), then continue.\n if (input[position.position] === ';') {\n continue\n }\n\n // 2. Advance position by 1. (This skips past U+003D (=).)\n position.position++\n }\n\n // 6. If position is past the end of input, then break.\n if (position.position > input.length) {\n break\n }\n\n // 7. Let parameterValue be null.\n let parameterValue = null\n\n // 8. If the code point at position within input is\n // U+0022 (\"), then:\n if (input[position.position] === '\"') {\n // 1. Set parameterValue to the result of collecting\n // an HTTP quoted string from input, given position\n // and the extract-value flag.\n parameterValue = collectAnHTTPQuotedString(input, position, true)\n\n // 2. Collect a sequence of code points that are not\n // U+003B (;) from input, given position.\n collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 9. Otherwise:\n } else {\n // 1. Set parameterValue to the result of collecting\n // a sequence of code points that are not U+003B (;)\n // from input, given position.\n parameterValue = collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 2. Remove any trailing HTTP whitespace from parameterValue.\n parameterValue = removeHTTPWhitespace(parameterValue, false, true)\n\n // 3. If parameterValue is the empty string, then continue.\n if (parameterValue.length === 0) {\n continue\n }\n }\n\n // 10. If all of the following are true\n // - parameterName is not the empty string\n // - parameterName solely contains HTTP token code points\n // - parameterValue solely contains HTTP quoted-string token code points\n // - mimeType’s parameters[parameterName] does not exist\n // then set mimeType’s parameters[parameterName] to parameterValue.\n if (\n parameterName.length !== 0 &&\n HTTP_TOKEN_CODEPOINTS.test(parameterName) &&\n (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) &&\n !mimeType.parameters.has(parameterName)\n ) {\n mimeType.parameters.set(parameterName, parameterValue)\n }\n }\n\n // 12. Return mimeType.\n return mimeType\n}\n\n// https://infra.spec.whatwg.org/#forgiving-base64-decode\n/** @param {string} data */\nfunction forgivingBase64 (data) {\n // 1. Remove all ASCII whitespace from data.\n data = data.replace(/[\\u0009\\u000A\\u000C\\u000D\\u0020]/g, '') // eslint-disable-line\n\n // 2. If data’s code point length divides by 4 leaving\n // no remainder, then:\n if (data.length % 4 === 0) {\n // 1. If data ends with one or two U+003D (=) code points,\n // then remove them from data.\n data = data.replace(/=?=$/, '')\n }\n\n // 3. If data’s code point length divides by 4 leaving\n // a remainder of 1, then return failure.\n if (data.length % 4 === 1) {\n return 'failure'\n }\n\n // 4. If data contains a code point that is not one of\n // U+002B (+)\n // U+002F (/)\n // ASCII alphanumeric\n // then return failure.\n if (/[^+/0-9A-Za-z]/.test(data)) {\n return 'failure'\n }\n\n const binary = atob(data)\n const bytes = new Uint8Array(binary.length)\n\n for (let byte = 0; byte < binary.length; byte++) {\n bytes[byte] = binary.charCodeAt(byte)\n }\n\n return bytes\n}\n\n// https://fetch.spec.whatwg.org/#collect-an-http-quoted-string\n// tests: https://fetch.spec.whatwg.org/#example-http-quoted-string\n/**\n * @param {string} input\n * @param {{ position: number }} position\n * @param {boolean?} extractValue\n */\nfunction collectAnHTTPQuotedString (input, position, extractValue) {\n // 1. Let positionStart be position.\n const positionStart = position.position\n\n // 2. Let value be the empty string.\n let value = ''\n\n // 3. Assert: the code point at position within input\n // is U+0022 (\").\n assert(input[position.position] === '\"')\n\n // 4. Advance position by 1.\n position.position++\n\n // 5. While true:\n while (true) {\n // 1. Append the result of collecting a sequence of code points\n // that are not U+0022 (\") or U+005C (\\) from input, given\n // position, to value.\n value += collectASequenceOfCodePoints(\n (char) => char !== '\"' && char !== '\\\\',\n input,\n position\n )\n\n // 2. If position is past the end of input, then break.\n if (position.position >= input.length) {\n break\n }\n\n // 3. Let quoteOrBackslash be the code point at position within\n // input.\n const quoteOrBackslash = input[position.position]\n\n // 4. Advance position by 1.\n position.position++\n\n // 5. If quoteOrBackslash is U+005C (\\), then:\n if (quoteOrBackslash === '\\\\') {\n // 1. If position is past the end of input, then append\n // U+005C (\\) to value and break.\n if (position.position >= input.length) {\n value += '\\\\'\n break\n }\n\n // 2. Append the code point at position within input to value.\n value += input[position.position]\n\n // 3. Advance position by 1.\n position.position++\n\n // 6. Otherwise:\n } else {\n // 1. Assert: quoteOrBackslash is U+0022 (\").\n assert(quoteOrBackslash === '\"')\n\n // 2. Break.\n break\n }\n }\n\n // 6. If the extract-value flag is set, then return value.\n if (extractValue) {\n return value\n }\n\n // 7. Return the code points from positionStart to position,\n // inclusive, within input.\n return input.slice(positionStart, position.position)\n}\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type\n */\nfunction serializeAMimeType (mimeType) {\n assert(mimeType !== 'failure')\n const { parameters, essence } = mimeType\n\n // 1. Let serialization be the concatenation of mimeType’s\n // type, U+002F (/), and mimeType’s subtype.\n let serialization = essence\n\n // 2. For each name → value of mimeType’s parameters:\n for (let [name, value] of parameters.entries()) {\n // 1. Append U+003B (;) to serialization.\n serialization += ';'\n\n // 2. Append name to serialization.\n serialization += name\n\n // 3. Append U+003D (=) to serialization.\n serialization += '='\n\n // 4. If value does not solely contain HTTP token code\n // points or value is the empty string, then:\n if (!HTTP_TOKEN_CODEPOINTS.test(value)) {\n // 1. Precede each occurence of U+0022 (\") or\n // U+005C (\\) in value with U+005C (\\).\n value = value.replace(/(\\\\|\")/g, '\\\\$1')\n\n // 2. Prepend U+0022 (\") to value.\n value = '\"' + value\n\n // 3. Append U+0022 (\") to value.\n value += '\"'\n }\n\n // 5. Append value to serialization.\n serialization += value\n }\n\n // 3. Return serialization.\n return serialization\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-whitespace\n * @param {string} char\n */\nfunction isHTTPWhiteSpace (char) {\n return char === '\\r' || char === '\\n' || char === '\\t' || char === ' '\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-whitespace\n * @param {string} str\n */\nfunction removeHTTPWhitespace (str, leading = true, trailing = true) {\n let lead = 0\n let trail = str.length - 1\n\n if (leading) {\n for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++);\n }\n\n if (trailing) {\n for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--);\n }\n\n return str.slice(lead, trail + 1)\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#ascii-whitespace\n * @param {string} char\n */\nfunction isASCIIWhitespace (char) {\n return char === '\\r' || char === '\\n' || char === '\\t' || char === '\\f' || char === ' '\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace\n */\nfunction removeASCIIWhitespace (str, leading = true, trailing = true) {\n let lead = 0\n let trail = str.length - 1\n\n if (leading) {\n for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++);\n }\n\n if (trailing) {\n for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--);\n }\n\n return str.slice(lead, trail + 1)\n}\n\nmodule.exports = {\n dataURLProcessor,\n URLSerializer,\n collectASequenceOfCodePoints,\n collectASequenceOfCodePointsFast,\n stringPercentDecode,\n parseMIMEType,\n collectAnHTTPQuotedString,\n serializeAMimeType\n}\n","'use strict'\n\nconst { Blob, File: NativeFile } = require('buffer')\nconst { types } = require('util')\nconst { kState } = require('./symbols')\nconst { isBlobLike } = require('./util')\nconst { webidl } = require('./webidl')\nconst { parseMIMEType, serializeAMimeType } = require('./dataURL')\nconst { kEnumerableProperty } = require('../core/util')\n\nclass File extends Blob {\n constructor (fileBits, fileName, options = {}) {\n // The File constructor is invoked with two or three parameters, depending\n // on whether the optional dictionary parameter is used. When the File()\n // constructor is invoked, user agents must run the following steps:\n webidl.argumentLengthCheck(arguments, 2, { header: 'File constructor' })\n\n fileBits = webidl.converters['sequence'](fileBits)\n fileName = webidl.converters.USVString(fileName)\n options = webidl.converters.FilePropertyBag(options)\n\n // 1. Let bytes be the result of processing blob parts given fileBits and\n // options.\n // Note: Blob handles this for us\n\n // 2. Let n be the fileName argument to the constructor.\n const n = fileName\n\n // 3. Process FilePropertyBag dictionary argument by running the following\n // substeps:\n\n // 1. If the type member is provided and is not the empty string, let t\n // be set to the type dictionary member. If t contains any characters\n // outside the range U+0020 to U+007E, then set t to the empty string\n // and return from these substeps.\n // 2. Convert every character in t to ASCII lowercase.\n let t = options.type\n let d\n\n // eslint-disable-next-line no-labels\n substep: {\n if (t) {\n t = parseMIMEType(t)\n\n if (t === 'failure') {\n t = ''\n // eslint-disable-next-line no-labels\n break substep\n }\n\n t = serializeAMimeType(t).toLowerCase()\n }\n\n // 3. If the lastModified member is provided, let d be set to the\n // lastModified dictionary member. If it is not provided, set d to the\n // current date and time represented as the number of milliseconds since\n // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]).\n d = options.lastModified\n }\n\n // 4. Return a new File object F such that:\n // F refers to the bytes byte sequence.\n // F.size is set to the number of total bytes in bytes.\n // F.name is set to n.\n // F.type is set to t.\n // F.lastModified is set to d.\n\n super(processBlobParts(fileBits, options), { type: t })\n this[kState] = {\n name: n,\n lastModified: d,\n type: t\n }\n }\n\n get name () {\n webidl.brandCheck(this, File)\n\n return this[kState].name\n }\n\n get lastModified () {\n webidl.brandCheck(this, File)\n\n return this[kState].lastModified\n }\n\n get type () {\n webidl.brandCheck(this, File)\n\n return this[kState].type\n }\n}\n\nclass FileLike {\n constructor (blobLike, fileName, options = {}) {\n // TODO: argument idl type check\n\n // The File constructor is invoked with two or three parameters, depending\n // on whether the optional dictionary parameter is used. When the File()\n // constructor is invoked, user agents must run the following steps:\n\n // 1. Let bytes be the result of processing blob parts given fileBits and\n // options.\n\n // 2. Let n be the fileName argument to the constructor.\n const n = fileName\n\n // 3. Process FilePropertyBag dictionary argument by running the following\n // substeps:\n\n // 1. If the type member is provided and is not the empty string, let t\n // be set to the type dictionary member. If t contains any characters\n // outside the range U+0020 to U+007E, then set t to the empty string\n // and return from these substeps.\n // TODO\n const t = options.type\n\n // 2. Convert every character in t to ASCII lowercase.\n // TODO\n\n // 3. If the lastModified member is provided, let d be set to the\n // lastModified dictionary member. If it is not provided, set d to the\n // current date and time represented as the number of milliseconds since\n // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]).\n const d = options.lastModified ?? Date.now()\n\n // 4. Return a new File object F such that:\n // F refers to the bytes byte sequence.\n // F.size is set to the number of total bytes in bytes.\n // F.name is set to n.\n // F.type is set to t.\n // F.lastModified is set to d.\n\n this[kState] = {\n blobLike,\n name: n,\n type: t,\n lastModified: d\n }\n }\n\n stream (...args) {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.stream(...args)\n }\n\n arrayBuffer (...args) {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.arrayBuffer(...args)\n }\n\n slice (...args) {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.slice(...args)\n }\n\n text (...args) {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.text(...args)\n }\n\n get size () {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.size\n }\n\n get type () {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.type\n }\n\n get name () {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].name\n }\n\n get lastModified () {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].lastModified\n }\n\n get [Symbol.toStringTag] () {\n return 'File'\n }\n}\n\nObject.defineProperties(File.prototype, {\n [Symbol.toStringTag]: {\n value: 'File',\n configurable: true\n },\n name: kEnumerableProperty,\n lastModified: kEnumerableProperty\n})\n\nwebidl.converters.Blob = webidl.interfaceConverter(Blob)\n\nwebidl.converters.BlobPart = function (V, opts) {\n if (webidl.util.Type(V) === 'Object') {\n if (isBlobLike(V)) {\n return webidl.converters.Blob(V, { strict: false })\n }\n\n if (\n ArrayBuffer.isView(V) ||\n types.isAnyArrayBuffer(V)\n ) {\n return webidl.converters.BufferSource(V, opts)\n }\n }\n\n return webidl.converters.USVString(V, opts)\n}\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.BlobPart\n)\n\n// https://www.w3.org/TR/FileAPI/#dfn-FilePropertyBag\nwebidl.converters.FilePropertyBag = webidl.dictionaryConverter([\n {\n key: 'lastModified',\n converter: webidl.converters['long long'],\n get defaultValue () {\n return Date.now()\n }\n },\n {\n key: 'type',\n converter: webidl.converters.DOMString,\n defaultValue: ''\n },\n {\n key: 'endings',\n converter: (value) => {\n value = webidl.converters.DOMString(value)\n value = value.toLowerCase()\n\n if (value !== 'native') {\n value = 'transparent'\n }\n\n return value\n },\n defaultValue: 'transparent'\n }\n])\n\n/**\n * @see https://www.w3.org/TR/FileAPI/#process-blob-parts\n * @param {(NodeJS.TypedArray|Blob|string)[]} parts\n * @param {{ type: string, endings: string }} options\n */\nfunction processBlobParts (parts, options) {\n // 1. Let bytes be an empty sequence of bytes.\n /** @type {NodeJS.TypedArray[]} */\n const bytes = []\n\n // 2. For each element in parts:\n for (const element of parts) {\n // 1. If element is a USVString, run the following substeps:\n if (typeof element === 'string') {\n // 1. Let s be element.\n let s = element\n\n // 2. If the endings member of options is \"native\", set s\n // to the result of converting line endings to native\n // of element.\n if (options.endings === 'native') {\n s = convertLineEndingsNative(s)\n }\n\n // 3. Append the result of UTF-8 encoding s to bytes.\n bytes.push(new TextEncoder().encode(s))\n } else if (\n types.isAnyArrayBuffer(element) ||\n types.isTypedArray(element)\n ) {\n // 2. If element is a BufferSource, get a copy of the\n // bytes held by the buffer source, and append those\n // bytes to bytes.\n if (!element.buffer) { // ArrayBuffer\n bytes.push(new Uint8Array(element))\n } else {\n bytes.push(\n new Uint8Array(element.buffer, element.byteOffset, element.byteLength)\n )\n }\n } else if (isBlobLike(element)) {\n // 3. If element is a Blob, append the bytes it represents\n // to bytes.\n bytes.push(element)\n }\n }\n\n // 3. Return bytes.\n return bytes\n}\n\n/**\n * @see https://www.w3.org/TR/FileAPI/#convert-line-endings-to-native\n * @param {string} s\n */\nfunction convertLineEndingsNative (s) {\n // 1. Let native line ending be be the code point U+000A LF.\n let nativeLineEnding = '\\n'\n\n // 2. If the underlying platform’s conventions are to\n // represent newlines as a carriage return and line feed\n // sequence, set native line ending to the code point\n // U+000D CR followed by the code point U+000A LF.\n if (process.platform === 'win32') {\n nativeLineEnding = '\\r\\n'\n }\n\n return s.replace(/\\r?\\n/g, nativeLineEnding)\n}\n\n// If this function is moved to ./util.js, some tools (such as\n// rollup) will warn about circular dependencies. See:\n// https://github.com/nodejs/undici/issues/1629\nfunction isFileLike (object) {\n return (\n (NativeFile && object instanceof NativeFile) ||\n object instanceof File || (\n object &&\n (typeof object.stream === 'function' ||\n typeof object.arrayBuffer === 'function') &&\n object[Symbol.toStringTag] === 'File'\n )\n )\n}\n\nmodule.exports = { File, FileLike, isFileLike }\n","'use strict'\n\nconst { isBlobLike, toUSVString, makeIterator } = require('./util')\nconst { kState } = require('./symbols')\nconst { File: UndiciFile, FileLike, isFileLike } = require('./file')\nconst { webidl } = require('./webidl')\nconst { Blob, File: NativeFile } = require('buffer')\n\n/** @type {globalThis['File']} */\nconst File = NativeFile ?? UndiciFile\n\n// https://xhr.spec.whatwg.org/#formdata\nclass FormData {\n constructor (form) {\n if (form !== undefined) {\n throw webidl.errors.conversionFailed({\n prefix: 'FormData constructor',\n argument: 'Argument 1',\n types: ['undefined']\n })\n }\n\n this[kState] = []\n }\n\n append (name, value, filename = undefined) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.append' })\n\n if (arguments.length === 3 && !isBlobLike(value)) {\n throw new TypeError(\n \"Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'\"\n )\n }\n\n // 1. Let value be value if given; otherwise blobValue.\n\n name = webidl.converters.USVString(name)\n value = isBlobLike(value)\n ? webidl.converters.Blob(value, { strict: false })\n : webidl.converters.USVString(value)\n filename = arguments.length === 3\n ? webidl.converters.USVString(filename)\n : undefined\n\n // 2. Let entry be the result of creating an entry with\n // name, value, and filename if given.\n const entry = makeEntry(name, value, filename)\n\n // 3. Append entry to this’s entry list.\n this[kState].push(entry)\n }\n\n delete (name) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.delete' })\n\n name = webidl.converters.USVString(name)\n\n // The delete(name) method steps are to remove all entries whose name\n // is name from this’s entry list.\n this[kState] = this[kState].filter(entry => entry.name !== name)\n }\n\n get (name) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.get' })\n\n name = webidl.converters.USVString(name)\n\n // 1. If there is no entry whose name is name in this’s entry list,\n // then return null.\n const idx = this[kState].findIndex((entry) => entry.name === name)\n if (idx === -1) {\n return null\n }\n\n // 2. Return the value of the first entry whose name is name from\n // this’s entry list.\n return this[kState][idx].value\n }\n\n getAll (name) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.getAll' })\n\n name = webidl.converters.USVString(name)\n\n // 1. If there is no entry whose name is name in this’s entry list,\n // then return the empty list.\n // 2. Return the values of all entries whose name is name, in order,\n // from this’s entry list.\n return this[kState]\n .filter((entry) => entry.name === name)\n .map((entry) => entry.value)\n }\n\n has (name) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.has' })\n\n name = webidl.converters.USVString(name)\n\n // The has(name) method steps are to return true if there is an entry\n // whose name is name in this’s entry list; otherwise false.\n return this[kState].findIndex((entry) => entry.name === name) !== -1\n }\n\n set (name, value, filename = undefined) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.set' })\n\n if (arguments.length === 3 && !isBlobLike(value)) {\n throw new TypeError(\n \"Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'\"\n )\n }\n\n // The set(name, value) and set(name, blobValue, filename) method steps\n // are:\n\n // 1. Let value be value if given; otherwise blobValue.\n\n name = webidl.converters.USVString(name)\n value = isBlobLike(value)\n ? webidl.converters.Blob(value, { strict: false })\n : webidl.converters.USVString(value)\n filename = arguments.length === 3\n ? toUSVString(filename)\n : undefined\n\n // 2. Let entry be the result of creating an entry with name, value, and\n // filename if given.\n const entry = makeEntry(name, value, filename)\n\n // 3. If there are entries in this’s entry list whose name is name, then\n // replace the first such entry with entry and remove the others.\n const idx = this[kState].findIndex((entry) => entry.name === name)\n if (idx !== -1) {\n this[kState] = [\n ...this[kState].slice(0, idx),\n entry,\n ...this[kState].slice(idx + 1).filter((entry) => entry.name !== name)\n ]\n } else {\n // 4. Otherwise, append entry to this’s entry list.\n this[kState].push(entry)\n }\n }\n\n entries () {\n webidl.brandCheck(this, FormData)\n\n return makeIterator(\n () => this[kState].map(pair => [pair.name, pair.value]),\n 'FormData',\n 'key+value'\n )\n }\n\n keys () {\n webidl.brandCheck(this, FormData)\n\n return makeIterator(\n () => this[kState].map(pair => [pair.name, pair.value]),\n 'FormData',\n 'key'\n )\n }\n\n values () {\n webidl.brandCheck(this, FormData)\n\n return makeIterator(\n () => this[kState].map(pair => [pair.name, pair.value]),\n 'FormData',\n 'value'\n )\n }\n\n /**\n * @param {(value: string, key: string, self: FormData) => void} callbackFn\n * @param {unknown} thisArg\n */\n forEach (callbackFn, thisArg = globalThis) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.forEach' })\n\n if (typeof callbackFn !== 'function') {\n throw new TypeError(\n \"Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'.\"\n )\n }\n\n for (const [key, value] of this) {\n callbackFn.apply(thisArg, [value, key, this])\n }\n }\n}\n\nFormData.prototype[Symbol.iterator] = FormData.prototype.entries\n\nObject.defineProperties(FormData.prototype, {\n [Symbol.toStringTag]: {\n value: 'FormData',\n configurable: true\n }\n})\n\n/**\n * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry\n * @param {string} name\n * @param {string|Blob} value\n * @param {?string} filename\n * @returns\n */\nfunction makeEntry (name, value, filename) {\n // 1. Set name to the result of converting name into a scalar value string.\n // \"To convert a string into a scalar value string, replace any surrogates\n // with U+FFFD.\"\n // see: https://nodejs.org/dist/latest-v18.x/docs/api/buffer.html#buftostringencoding-start-end\n name = Buffer.from(name).toString('utf8')\n\n // 2. If value is a string, then set value to the result of converting\n // value into a scalar value string.\n if (typeof value === 'string') {\n value = Buffer.from(value).toString('utf8')\n } else {\n // 3. Otherwise:\n\n // 1. If value is not a File object, then set value to a new File object,\n // representing the same bytes, whose name attribute value is \"blob\"\n if (!isFileLike(value)) {\n value = value instanceof Blob\n ? new File([value], 'blob', { type: value.type })\n : new FileLike(value, 'blob', { type: value.type })\n }\n\n // 2. If filename is given, then set value to a new File object,\n // representing the same bytes, whose name attribute is filename.\n if (filename !== undefined) {\n /** @type {FilePropertyBag} */\n const options = {\n type: value.type,\n lastModified: value.lastModified\n }\n\n value = (NativeFile && value instanceof NativeFile) || value instanceof UndiciFile\n ? new File([value], filename, options)\n : new FileLike(value, filename, options)\n }\n }\n\n // 4. Return an entry whose name is name and whose value is value.\n return { name, value }\n}\n\nmodule.exports = { FormData }\n","'use strict'\n\n// In case of breaking changes, increase the version\n// number to avoid conflicts.\nconst globalOrigin = Symbol.for('undici.globalOrigin.1')\n\nfunction getGlobalOrigin () {\n return globalThis[globalOrigin]\n}\n\nfunction setGlobalOrigin (newOrigin) {\n if (newOrigin === undefined) {\n Object.defineProperty(globalThis, globalOrigin, {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: false\n })\n\n return\n }\n\n const parsedURL = new URL(newOrigin)\n\n if (parsedURL.protocol !== 'http:' && parsedURL.protocol !== 'https:') {\n throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`)\n }\n\n Object.defineProperty(globalThis, globalOrigin, {\n value: parsedURL,\n writable: true,\n enumerable: false,\n configurable: false\n })\n}\n\nmodule.exports = {\n getGlobalOrigin,\n setGlobalOrigin\n}\n","// https://github.com/Ethan-Arrowood/undici-fetch\n\n'use strict'\n\nconst { kHeadersList } = require('../core/symbols')\nconst { kGuard } = require('./symbols')\nconst { kEnumerableProperty } = require('../core/util')\nconst {\n makeIterator,\n isValidHeaderName,\n isValidHeaderValue\n} = require('./util')\nconst { webidl } = require('./webidl')\nconst assert = require('assert')\n\nconst kHeadersMap = Symbol('headers map')\nconst kHeadersSortedMap = Symbol('headers map sorted')\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize\n * @param {string} potentialValue\n */\nfunction headerValueNormalize (potentialValue) {\n // To normalize a byte sequence potentialValue, remove\n // any leading and trailing HTTP whitespace bytes from\n // potentialValue.\n\n // Trimming the end with `.replace()` and a RegExp is typically subject to\n // ReDoS. This is safer and faster.\n let i = potentialValue.length\n while (/[\\r\\n\\t ]/.test(potentialValue.charAt(--i)));\n return potentialValue.slice(0, i + 1).replace(/^[\\r\\n\\t ]+/, '')\n}\n\nfunction fill (headers, object) {\n // To fill a Headers object headers with a given object object, run these steps:\n\n // 1. If object is a sequence, then for each header in object:\n // Note: webidl conversion to array has already been done.\n if (Array.isArray(object)) {\n for (const header of object) {\n // 1. If header does not contain exactly two items, then throw a TypeError.\n if (header.length !== 2) {\n throw webidl.errors.exception({\n header: 'Headers constructor',\n message: `expected name/value pair to be length 2, found ${header.length}.`\n })\n }\n\n // 2. Append (header’s first item, header’s second item) to headers.\n headers.append(header[0], header[1])\n }\n } else if (typeof object === 'object' && object !== null) {\n // Note: null should throw\n\n // 2. Otherwise, object is a record, then for each key → value in object,\n // append (key, value) to headers\n for (const [key, value] of Object.entries(object)) {\n headers.append(key, value)\n }\n } else {\n throw webidl.errors.conversionFailed({\n prefix: 'Headers constructor',\n argument: 'Argument 1',\n types: ['sequence>', 'record']\n })\n }\n}\n\nclass HeadersList {\n /** @type {[string, string][]|null} */\n cookies = null\n\n constructor (init) {\n if (init instanceof HeadersList) {\n this[kHeadersMap] = new Map(init[kHeadersMap])\n this[kHeadersSortedMap] = init[kHeadersSortedMap]\n this.cookies = init.cookies\n } else {\n this[kHeadersMap] = new Map(init)\n this[kHeadersSortedMap] = null\n }\n }\n\n // https://fetch.spec.whatwg.org/#header-list-contains\n contains (name) {\n // A header list list contains a header name name if list\n // contains a header whose name is a byte-case-insensitive\n // match for name.\n name = name.toLowerCase()\n\n return this[kHeadersMap].has(name)\n }\n\n clear () {\n this[kHeadersMap].clear()\n this[kHeadersSortedMap] = null\n this.cookies = null\n }\n\n // https://fetch.spec.whatwg.org/#concept-header-list-append\n append (name, value) {\n this[kHeadersSortedMap] = null\n\n // 1. If list contains name, then set name to the first such\n // header’s name.\n const lowercaseName = name.toLowerCase()\n const exists = this[kHeadersMap].get(lowercaseName)\n\n // 2. Append (name, value) to list.\n if (exists) {\n const delimiter = lowercaseName === 'cookie' ? '; ' : ', '\n this[kHeadersMap].set(lowercaseName, {\n name: exists.name,\n value: `${exists.value}${delimiter}${value}`\n })\n } else {\n this[kHeadersMap].set(lowercaseName, { name, value })\n }\n\n if (lowercaseName === 'set-cookie') {\n this.cookies ??= []\n this.cookies.push(value)\n }\n }\n\n // https://fetch.spec.whatwg.org/#concept-header-list-set\n set (name, value) {\n this[kHeadersSortedMap] = null\n const lowercaseName = name.toLowerCase()\n\n if (lowercaseName === 'set-cookie') {\n this.cookies = [value]\n }\n\n // 1. If list contains name, then set the value of\n // the first such header to value and remove the\n // others.\n // 2. Otherwise, append header (name, value) to list.\n return this[kHeadersMap].set(lowercaseName, { name, value })\n }\n\n // https://fetch.spec.whatwg.org/#concept-header-list-delete\n delete (name) {\n this[kHeadersSortedMap] = null\n\n name = name.toLowerCase()\n\n if (name === 'set-cookie') {\n this.cookies = null\n }\n\n return this[kHeadersMap].delete(name)\n }\n\n // https://fetch.spec.whatwg.org/#concept-header-list-get\n get (name) {\n // 1. If list does not contain name, then return null.\n if (!this.contains(name)) {\n return null\n }\n\n // 2. Return the values of all headers in list whose name\n // is a byte-case-insensitive match for name,\n // separated from each other by 0x2C 0x20, in order.\n return this[kHeadersMap].get(name.toLowerCase())?.value ?? null\n }\n\n * [Symbol.iterator] () {\n // use the lowercased name\n for (const [name, { value }] of this[kHeadersMap]) {\n yield [name, value]\n }\n }\n\n get entries () {\n const headers = {}\n\n if (this[kHeadersMap].size) {\n for (const { name, value } of this[kHeadersMap].values()) {\n headers[name] = value\n }\n }\n\n return headers\n }\n}\n\n// https://fetch.spec.whatwg.org/#headers-class\nclass Headers {\n constructor (init = undefined) {\n this[kHeadersList] = new HeadersList()\n\n // The new Headers(init) constructor steps are:\n\n // 1. Set this’s guard to \"none\".\n this[kGuard] = 'none'\n\n // 2. If init is given, then fill this with init.\n if (init !== undefined) {\n init = webidl.converters.HeadersInit(init)\n fill(this, init)\n }\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-append\n append (name, value) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.append' })\n\n name = webidl.converters.ByteString(name)\n value = webidl.converters.ByteString(value)\n\n // 1. Normalize value.\n value = headerValueNormalize(value)\n\n // 2. If name is not a header name or value is not a\n // header value, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.append',\n value: name,\n type: 'header name'\n })\n } else if (!isValidHeaderValue(value)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.append',\n value,\n type: 'header value'\n })\n }\n\n // 3. If headers’s guard is \"immutable\", then throw a TypeError.\n // 4. Otherwise, if headers’s guard is \"request\" and name is a\n // forbidden header name, return.\n // Note: undici does not implement forbidden header names\n if (this[kGuard] === 'immutable') {\n throw new TypeError('immutable')\n } else if (this[kGuard] === 'request-no-cors') {\n // 5. Otherwise, if headers’s guard is \"request-no-cors\":\n // TODO\n }\n\n // 6. Otherwise, if headers’s guard is \"response\" and name is a\n // forbidden response-header name, return.\n\n // 7. Append (name, value) to headers’s header list.\n // 8. If headers’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from headers\n return this[kHeadersList].append(name, value)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-delete\n delete (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.delete' })\n\n name = webidl.converters.ByteString(name)\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.delete',\n value: name,\n type: 'header name'\n })\n }\n\n // 2. If this’s guard is \"immutable\", then throw a TypeError.\n // 3. Otherwise, if this’s guard is \"request\" and name is a\n // forbidden header name, return.\n // 4. Otherwise, if this’s guard is \"request-no-cors\", name\n // is not a no-CORS-safelisted request-header name, and\n // name is not a privileged no-CORS request-header name,\n // return.\n // 5. Otherwise, if this’s guard is \"response\" and name is\n // a forbidden response-header name, return.\n // Note: undici does not implement forbidden header names\n if (this[kGuard] === 'immutable') {\n throw new TypeError('immutable')\n } else if (this[kGuard] === 'request-no-cors') {\n // TODO\n }\n\n // 6. If this’s header list does not contain name, then\n // return.\n if (!this[kHeadersList].contains(name)) {\n return\n }\n\n // 7. Delete name from this’s header list.\n // 8. If this’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from this.\n return this[kHeadersList].delete(name)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-get\n get (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.get' })\n\n name = webidl.converters.ByteString(name)\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.get',\n value: name,\n type: 'header name'\n })\n }\n\n // 2. Return the result of getting name from this’s header\n // list.\n return this[kHeadersList].get(name)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-has\n has (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.has' })\n\n name = webidl.converters.ByteString(name)\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.has',\n value: name,\n type: 'header name'\n })\n }\n\n // 2. Return true if this’s header list contains name;\n // otherwise false.\n return this[kHeadersList].contains(name)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-set\n set (name, value) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.set' })\n\n name = webidl.converters.ByteString(name)\n value = webidl.converters.ByteString(value)\n\n // 1. Normalize value.\n value = headerValueNormalize(value)\n\n // 2. If name is not a header name or value is not a\n // header value, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.set',\n value: name,\n type: 'header name'\n })\n } else if (!isValidHeaderValue(value)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.set',\n value,\n type: 'header value'\n })\n }\n\n // 3. If this’s guard is \"immutable\", then throw a TypeError.\n // 4. Otherwise, if this’s guard is \"request\" and name is a\n // forbidden header name, return.\n // 5. Otherwise, if this’s guard is \"request-no-cors\" and\n // name/value is not a no-CORS-safelisted request-header,\n // return.\n // 6. Otherwise, if this’s guard is \"response\" and name is a\n // forbidden response-header name, return.\n // Note: undici does not implement forbidden header names\n if (this[kGuard] === 'immutable') {\n throw new TypeError('immutable')\n } else if (this[kGuard] === 'request-no-cors') {\n // TODO\n }\n\n // 7. Set (name, value) in this’s header list.\n // 8. If this’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from this\n return this[kHeadersList].set(name, value)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie\n getSetCookie () {\n webidl.brandCheck(this, Headers)\n\n // 1. If this’s header list does not contain `Set-Cookie`, then return « ».\n // 2. Return the values of all headers in this’s header list whose name is\n // a byte-case-insensitive match for `Set-Cookie`, in order.\n\n const list = this[kHeadersList].cookies\n\n if (list) {\n return [...list]\n }\n\n return []\n }\n\n // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n get [kHeadersSortedMap] () {\n if (this[kHeadersList][kHeadersSortedMap]) {\n return this[kHeadersList][kHeadersSortedMap]\n }\n\n // 1. Let headers be an empty list of headers with the key being the name\n // and value the value.\n const headers = []\n\n // 2. Let names be the result of convert header names to a sorted-lowercase\n // set with all the names of the headers in list.\n const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1)\n const cookies = this[kHeadersList].cookies\n\n // 3. For each name of names:\n for (const [name, value] of names) {\n // 1. If name is `set-cookie`, then:\n if (name === 'set-cookie') {\n // 1. Let values be a list of all values of headers in list whose name\n // is a byte-case-insensitive match for name, in order.\n\n // 2. For each value of values:\n // 1. Append (name, value) to headers.\n for (const value of cookies) {\n headers.push([name, value])\n }\n } else {\n // 2. Otherwise:\n\n // 1. Let value be the result of getting name from list.\n\n // 2. Assert: value is non-null.\n assert(value !== null)\n\n // 3. Append (name, value) to headers.\n headers.push([name, value])\n }\n }\n\n this[kHeadersList][kHeadersSortedMap] = headers\n\n // 4. Return headers.\n return headers\n }\n\n keys () {\n webidl.brandCheck(this, Headers)\n\n return makeIterator(\n () => [...this[kHeadersSortedMap].values()],\n 'Headers',\n 'key'\n )\n }\n\n values () {\n webidl.brandCheck(this, Headers)\n\n return makeIterator(\n () => [...this[kHeadersSortedMap].values()],\n 'Headers',\n 'value'\n )\n }\n\n entries () {\n webidl.brandCheck(this, Headers)\n\n return makeIterator(\n () => [...this[kHeadersSortedMap].values()],\n 'Headers',\n 'key+value'\n )\n }\n\n /**\n * @param {(value: string, key: string, self: Headers) => void} callbackFn\n * @param {unknown} thisArg\n */\n forEach (callbackFn, thisArg = globalThis) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.forEach' })\n\n if (typeof callbackFn !== 'function') {\n throw new TypeError(\n \"Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'.\"\n )\n }\n\n for (const [key, value] of this) {\n callbackFn.apply(thisArg, [value, key, this])\n }\n }\n\n [Symbol.for('nodejs.util.inspect.custom')] () {\n webidl.brandCheck(this, Headers)\n\n return this[kHeadersList]\n }\n}\n\nHeaders.prototype[Symbol.iterator] = Headers.prototype.entries\n\nObject.defineProperties(Headers.prototype, {\n append: kEnumerableProperty,\n delete: kEnumerableProperty,\n get: kEnumerableProperty,\n has: kEnumerableProperty,\n set: kEnumerableProperty,\n getSetCookie: kEnumerableProperty,\n keys: kEnumerableProperty,\n values: kEnumerableProperty,\n entries: kEnumerableProperty,\n forEach: kEnumerableProperty,\n [Symbol.iterator]: { enumerable: false },\n [Symbol.toStringTag]: {\n value: 'Headers',\n configurable: true\n }\n})\n\nwebidl.converters.HeadersInit = function (V) {\n if (webidl.util.Type(V) === 'Object') {\n if (V[Symbol.iterator]) {\n return webidl.converters['sequence>'](V)\n }\n\n return webidl.converters['record'](V)\n }\n\n throw webidl.errors.conversionFailed({\n prefix: 'Headers constructor',\n argument: 'Argument 1',\n types: ['sequence>', 'record']\n })\n}\n\nmodule.exports = {\n fill,\n Headers,\n HeadersList\n}\n","// https://github.com/Ethan-Arrowood/undici-fetch\n\n'use strict'\n\nconst {\n Response,\n makeNetworkError,\n makeAppropriateNetworkError,\n filterResponse,\n makeResponse\n} = require('./response')\nconst { Headers } = require('./headers')\nconst { Request, makeRequest } = require('./request')\nconst zlib = require('zlib')\nconst {\n bytesMatch,\n makePolicyContainer,\n clonePolicyContainer,\n requestBadPort,\n TAOCheck,\n appendRequestOriginHeader,\n responseLocationURL,\n requestCurrentURL,\n setRequestReferrerPolicyOnRedirect,\n tryUpgradeRequestToAPotentiallyTrustworthyURL,\n createOpaqueTimingInfo,\n appendFetchMetadata,\n corsCheck,\n crossOriginResourcePolicyCheck,\n determineRequestsReferrer,\n coarsenedSharedCurrentTime,\n createDeferredPromise,\n isBlobLike,\n sameOrigin,\n isCancelled,\n isAborted,\n isErrorLike,\n fullyReadBody,\n readableStreamClose,\n isomorphicEncode,\n urlIsLocal,\n urlIsHttpHttpsScheme,\n urlHasHttpsScheme\n} = require('./util')\nconst { kState, kHeaders, kGuard, kRealm } = require('./symbols')\nconst assert = require('assert')\nconst { safelyExtractBody } = require('./body')\nconst {\n redirectStatus,\n nullBodyStatus,\n safeMethods,\n requestBodyHeader,\n subresource,\n DOMException\n} = require('./constants')\nconst { kHeadersList } = require('../core/symbols')\nconst EE = require('events')\nconst { Readable, pipeline } = require('stream')\nconst { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = require('../core/util')\nconst { dataURLProcessor, serializeAMimeType } = require('./dataURL')\nconst { TransformStream } = require('stream/web')\nconst { getGlobalDispatcher } = require('../global')\nconst { webidl } = require('./webidl')\nconst { STATUS_CODES } = require('http')\n\n/** @type {import('buffer').resolveObjectURL} */\nlet resolveObjectURL\nlet ReadableStream = globalThis.ReadableStream\n\nclass Fetch extends EE {\n constructor (dispatcher) {\n super()\n\n this.dispatcher = dispatcher\n this.connection = null\n this.dump = false\n this.state = 'ongoing'\n // 2 terminated listeners get added per request,\n // but only 1 gets removed. If there are 20 redirects,\n // 21 listeners will be added.\n // See https://github.com/nodejs/undici/issues/1711\n // TODO (fix): Find and fix root cause for leaked listener.\n this.setMaxListeners(21)\n }\n\n terminate (reason) {\n if (this.state !== 'ongoing') {\n return\n }\n\n this.state = 'terminated'\n this.connection?.destroy(reason)\n this.emit('terminated', reason)\n }\n\n // https://fetch.spec.whatwg.org/#fetch-controller-abort\n abort (error) {\n if (this.state !== 'ongoing') {\n return\n }\n\n // 1. Set controller’s state to \"aborted\".\n this.state = 'aborted'\n\n // 2. Let fallbackError be an \"AbortError\" DOMException.\n // 3. Set error to fallbackError if it is not given.\n if (!error) {\n error = new DOMException('The operation was aborted.', 'AbortError')\n }\n\n // 4. Let serializedError be StructuredSerialize(error).\n // If that threw an exception, catch it, and let\n // serializedError be StructuredSerialize(fallbackError).\n\n // 5. Set controller’s serialized abort reason to serializedError.\n this.serializedAbortReason = error\n\n this.connection?.destroy(error)\n this.emit('terminated', error)\n }\n}\n\n// https://fetch.spec.whatwg.org/#fetch-method\nasync function fetch (input, init = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' })\n\n // 1. Let p be a new promise.\n const p = createDeferredPromise()\n\n // 2. Let requestObject be the result of invoking the initial value of\n // Request as constructor with input and init as arguments. If this throws\n // an exception, reject p with it and return p.\n let requestObject\n\n try {\n requestObject = new Request(input, init)\n } catch (e) {\n p.reject(e)\n return p.promise\n }\n\n // 3. Let request be requestObject’s request.\n const request = requestObject[kState]\n\n // 4. If requestObject’s signal’s aborted flag is set, then:\n if (requestObject.signal.aborted) {\n // 1. Abort the fetch() call with p, request, null, and\n // requestObject’s signal’s abort reason.\n abortFetch(p, request, null, requestObject.signal.reason)\n\n // 2. Return p.\n return p.promise\n }\n\n // 5. Let globalObject be request’s client’s global object.\n const globalObject = request.client.globalObject\n\n // 6. If globalObject is a ServiceWorkerGlobalScope object, then set\n // request’s service-workers mode to \"none\".\n if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') {\n request.serviceWorkers = 'none'\n }\n\n // 7. Let responseObject be null.\n let responseObject = null\n\n // 8. Let relevantRealm be this’s relevant Realm.\n const relevantRealm = null\n\n // 9. Let locallyAborted be false.\n let locallyAborted = false\n\n // 10. Let controller be null.\n let controller = null\n\n // 11. Add the following abort steps to requestObject’s signal:\n addAbortListener(\n requestObject.signal,\n () => {\n // 1. Set locallyAborted to true.\n locallyAborted = true\n\n // 2. Assert: controller is non-null.\n assert(controller != null)\n\n // 3. Abort controller with requestObject’s signal’s abort reason.\n controller.abort(requestObject.signal.reason)\n\n // 4. Abort the fetch() call with p, request, responseObject,\n // and requestObject’s signal’s abort reason.\n abortFetch(p, request, responseObject, requestObject.signal.reason)\n }\n )\n\n // 12. Let handleFetchDone given response response be to finalize and\n // report timing with response, globalObject, and \"fetch\".\n const handleFetchDone = (response) =>\n finalizeAndReportTiming(response, 'fetch')\n\n // 13. Set controller to the result of calling fetch given request,\n // with processResponseEndOfBody set to handleFetchDone, and processResponse\n // given response being these substeps:\n\n const processResponse = (response) => {\n // 1. If locallyAborted is true, terminate these substeps.\n if (locallyAborted) {\n return\n }\n\n // 2. If response’s aborted flag is set, then:\n if (response.aborted) {\n // 1. Let deserializedError be the result of deserialize a serialized\n // abort reason given controller’s serialized abort reason and\n // relevantRealm.\n\n // 2. Abort the fetch() call with p, request, responseObject, and\n // deserializedError.\n\n abortFetch(p, request, responseObject, controller.serializedAbortReason)\n return\n }\n\n // 3. If response is a network error, then reject p with a TypeError\n // and terminate these substeps.\n if (response.type === 'error') {\n p.reject(\n Object.assign(new TypeError('fetch failed'), { cause: response.error })\n )\n return\n }\n\n // 4. Set responseObject to the result of creating a Response object,\n // given response, \"immutable\", and relevantRealm.\n responseObject = new Response()\n responseObject[kState] = response\n responseObject[kRealm] = relevantRealm\n responseObject[kHeaders][kHeadersList] = response.headersList\n responseObject[kHeaders][kGuard] = 'immutable'\n responseObject[kHeaders][kRealm] = relevantRealm\n\n // 5. Resolve p with responseObject.\n p.resolve(responseObject)\n }\n\n controller = fetching({\n request,\n processResponseEndOfBody: handleFetchDone,\n processResponse,\n dispatcher: init.dispatcher ?? getGlobalDispatcher() // undici\n })\n\n // 14. Return p.\n return p.promise\n}\n\n// https://fetch.spec.whatwg.org/#finalize-and-report-timing\nfunction finalizeAndReportTiming (response, initiatorType = 'other') {\n // 1. If response is an aborted network error, then return.\n if (response.type === 'error' && response.aborted) {\n return\n }\n\n // 2. If response’s URL list is null or empty, then return.\n if (!response.urlList?.length) {\n return\n }\n\n // 3. Let originalURL be response’s URL list[0].\n const originalURL = response.urlList[0]\n\n // 4. Let timingInfo be response’s timing info.\n let timingInfo = response.timingInfo\n\n // 5. Let cacheState be response’s cache state.\n let cacheState = response.cacheState\n\n // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return.\n if (!urlIsHttpHttpsScheme(originalURL)) {\n return\n }\n\n // 7. If timingInfo is null, then return.\n if (timingInfo === null) {\n return\n }\n\n // 8. If response’s timing allow passed flag is not set, then:\n if (!timingInfo.timingAllowPassed) {\n // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo.\n timingInfo = createOpaqueTimingInfo({\n startTime: timingInfo.startTime\n })\n\n // 2. Set cacheState to the empty string.\n cacheState = ''\n }\n\n // 9. Set timingInfo’s end time to the coarsened shared current time\n // given global’s relevant settings object’s cross-origin isolated\n // capability.\n // TODO: given global’s relevant settings object’s cross-origin isolated\n // capability?\n timingInfo.endTime = coarsenedSharedCurrentTime()\n\n // 10. Set response’s timing info to timingInfo.\n response.timingInfo = timingInfo\n\n // 11. Mark resource timing for timingInfo, originalURL, initiatorType,\n // global, and cacheState.\n markResourceTiming(\n timingInfo,\n originalURL,\n initiatorType,\n globalThis,\n cacheState\n )\n}\n\n// https://w3c.github.io/resource-timing/#dfn-mark-resource-timing\nfunction markResourceTiming (timingInfo, originalURL, initiatorType, globalThis, cacheState) {\n if (nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 2)) {\n performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis, cacheState)\n }\n}\n\n// https://fetch.spec.whatwg.org/#abort-fetch\nfunction abortFetch (p, request, responseObject, error) {\n // Note: AbortSignal.reason was added in node v17.2.0\n // which would give us an undefined error to reject with.\n // Remove this once node v16 is no longer supported.\n if (!error) {\n error = new DOMException('The operation was aborted.', 'AbortError')\n }\n\n // 1. Reject promise with error.\n p.reject(error)\n\n // 2. If request’s body is not null and is readable, then cancel request’s\n // body with error.\n if (request.body != null && isReadable(request.body?.stream)) {\n request.body.stream.cancel(error).catch((err) => {\n if (err.code === 'ERR_INVALID_STATE') {\n // Node bug?\n return\n }\n throw err\n })\n }\n\n // 3. If responseObject is null, then return.\n if (responseObject == null) {\n return\n }\n\n // 4. Let response be responseObject’s response.\n const response = responseObject[kState]\n\n // 5. If response’s body is not null and is readable, then error response’s\n // body with error.\n if (response.body != null && isReadable(response.body?.stream)) {\n response.body.stream.cancel(error).catch((err) => {\n if (err.code === 'ERR_INVALID_STATE') {\n // Node bug?\n return\n }\n throw err\n })\n }\n}\n\n// https://fetch.spec.whatwg.org/#fetching\nfunction fetching ({\n request,\n processRequestBodyChunkLength,\n processRequestEndOfBody,\n processResponse,\n processResponseEndOfBody,\n processResponseConsumeBody,\n useParallelQueue = false,\n dispatcher // undici\n}) {\n // 1. Let taskDestination be null.\n let taskDestination = null\n\n // 2. Let crossOriginIsolatedCapability be false.\n let crossOriginIsolatedCapability = false\n\n // 3. If request’s client is non-null, then:\n if (request.client != null) {\n // 1. Set taskDestination to request’s client’s global object.\n taskDestination = request.client.globalObject\n\n // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin\n // isolated capability.\n crossOriginIsolatedCapability =\n request.client.crossOriginIsolatedCapability\n }\n\n // 4. If useParallelQueue is true, then set taskDestination to the result of\n // starting a new parallel queue.\n // TODO\n\n // 5. Let timingInfo be a new fetch timing info whose start time and\n // post-redirect start time are the coarsened shared current time given\n // crossOriginIsolatedCapability.\n const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability)\n const timingInfo = createOpaqueTimingInfo({\n startTime: currenTime\n })\n\n // 6. Let fetchParams be a new fetch params whose\n // request is request,\n // timing info is timingInfo,\n // process request body chunk length is processRequestBodyChunkLength,\n // process request end-of-body is processRequestEndOfBody,\n // process response is processResponse,\n // process response consume body is processResponseConsumeBody,\n // process response end-of-body is processResponseEndOfBody,\n // task destination is taskDestination,\n // and cross-origin isolated capability is crossOriginIsolatedCapability.\n const fetchParams = {\n controller: new Fetch(dispatcher),\n request,\n timingInfo,\n processRequestBodyChunkLength,\n processRequestEndOfBody,\n processResponse,\n processResponseConsumeBody,\n processResponseEndOfBody,\n taskDestination,\n crossOriginIsolatedCapability\n }\n\n // 7. If request’s body is a byte sequence, then set request’s body to\n // request’s body as a body.\n // NOTE: Since fetching is only called from fetch, body should already be\n // extracted.\n assert(!request.body || request.body.stream)\n\n // 8. If request’s window is \"client\", then set request’s window to request’s\n // client, if request’s client’s global object is a Window object; otherwise\n // \"no-window\".\n if (request.window === 'client') {\n // TODO: What if request.client is null?\n request.window =\n request.client?.globalObject?.constructor?.name === 'Window'\n ? request.client\n : 'no-window'\n }\n\n // 9. If request’s origin is \"client\", then set request’s origin to request’s\n // client’s origin.\n if (request.origin === 'client') {\n // TODO: What if request.client is null?\n request.origin = request.client?.origin\n }\n\n // 10. If all of the following conditions are true:\n // TODO\n\n // 11. If request’s policy container is \"client\", then:\n if (request.policyContainer === 'client') {\n // 1. If request’s client is non-null, then set request’s policy\n // container to a clone of request’s client’s policy container. [HTML]\n if (request.client != null) {\n request.policyContainer = clonePolicyContainer(\n request.client.policyContainer\n )\n } else {\n // 2. Otherwise, set request’s policy container to a new policy\n // container.\n request.policyContainer = makePolicyContainer()\n }\n }\n\n // 12. If request’s header list does not contain `Accept`, then:\n if (!request.headersList.contains('accept')) {\n // 1. Let value be `*/*`.\n const value = '*/*'\n\n // 2. A user agent should set value to the first matching statement, if\n // any, switching on request’s destination:\n // \"document\"\n // \"frame\"\n // \"iframe\"\n // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`\n // \"image\"\n // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5`\n // \"style\"\n // `text/css,*/*;q=0.1`\n // TODO\n\n // 3. Append `Accept`/value to request’s header list.\n request.headersList.append('accept', value)\n }\n\n // 13. If request’s header list does not contain `Accept-Language`, then\n // user agents should append `Accept-Language`/an appropriate value to\n // request’s header list.\n if (!request.headersList.contains('accept-language')) {\n request.headersList.append('accept-language', '*')\n }\n\n // 14. If request’s priority is null, then use request’s initiator and\n // destination appropriately in setting request’s priority to a\n // user-agent-defined object.\n if (request.priority === null) {\n // TODO\n }\n\n // 15. If request is a subresource request, then:\n if (subresource.includes(request.destination)) {\n // TODO\n }\n\n // 16. Run main fetch given fetchParams.\n mainFetch(fetchParams)\n .catch(err => {\n fetchParams.controller.terminate(err)\n })\n\n // 17. Return fetchParam's controller\n return fetchParams.controller\n}\n\n// https://fetch.spec.whatwg.org/#concept-main-fetch\nasync function mainFetch (fetchParams, recursive = false) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. If request’s local-URLs-only flag is set and request’s current URL is\n // not local, then set response to a network error.\n if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) {\n response = makeNetworkError('local URLs only')\n }\n\n // 4. Run report Content Security Policy violations for request.\n // TODO\n\n // 5. Upgrade request to a potentially trustworthy URL, if appropriate.\n tryUpgradeRequestToAPotentiallyTrustworthyURL(request)\n\n // 6. If should request be blocked due to a bad port, should fetching request\n // be blocked as mixed content, or should request be blocked by Content\n // Security Policy returns blocked, then set response to a network error.\n if (requestBadPort(request) === 'blocked') {\n response = makeNetworkError('bad port')\n }\n // TODO: should fetching request be blocked as mixed content?\n // TODO: should request be blocked by Content Security Policy?\n\n // 7. If request’s referrer policy is the empty string, then set request’s\n // referrer policy to request’s policy container’s referrer policy.\n if (request.referrerPolicy === '') {\n request.referrerPolicy = request.policyContainer.referrerPolicy\n }\n\n // 8. If request’s referrer is not \"no-referrer\", then set request’s\n // referrer to the result of invoking determine request’s referrer.\n if (request.referrer !== 'no-referrer') {\n request.referrer = determineRequestsReferrer(request)\n }\n\n // 9. Set request’s current URL’s scheme to \"https\" if all of the following\n // conditions are true:\n // - request’s current URL’s scheme is \"http\"\n // - request’s current URL’s host is a domain\n // - Matching request’s current URL’s host per Known HSTS Host Domain Name\n // Matching results in either a superdomain match with an asserted\n // includeSubDomains directive or a congruent match (with or without an\n // asserted includeSubDomains directive). [HSTS]\n // TODO\n\n // 10. If recursive is false, then run the remaining steps in parallel.\n // TODO\n\n // 11. If response is null, then set response to the result of running\n // the steps corresponding to the first matching statement:\n if (response === null) {\n response = await (async () => {\n const currentURL = requestCurrentURL(request)\n\n if (\n // - request’s current URL’s origin is same origin with request’s origin,\n // and request’s response tainting is \"basic\"\n (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') ||\n // request’s current URL’s scheme is \"data\"\n (currentURL.protocol === 'data:') ||\n // - request’s mode is \"navigate\" or \"websocket\"\n (request.mode === 'navigate' || request.mode === 'websocket')\n ) {\n // 1. Set request’s response tainting to \"basic\".\n request.responseTainting = 'basic'\n\n // 2. Return the result of running scheme fetch given fetchParams.\n return await schemeFetch(fetchParams)\n }\n\n // request’s mode is \"same-origin\"\n if (request.mode === 'same-origin') {\n // 1. Return a network error.\n return makeNetworkError('request mode cannot be \"same-origin\"')\n }\n\n // request’s mode is \"no-cors\"\n if (request.mode === 'no-cors') {\n // 1. If request’s redirect mode is not \"follow\", then return a network\n // error.\n if (request.redirect !== 'follow') {\n return makeNetworkError(\n 'redirect mode cannot be \"follow\" for \"no-cors\" request'\n )\n }\n\n // 2. Set request’s response tainting to \"opaque\".\n request.responseTainting = 'opaque'\n\n // 3. Return the result of running scheme fetch given fetchParams.\n return await schemeFetch(fetchParams)\n }\n\n // request’s current URL’s scheme is not an HTTP(S) scheme\n if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) {\n // Return a network error.\n return makeNetworkError('URL scheme must be a HTTP(S) scheme')\n }\n\n // - request’s use-CORS-preflight flag is set\n // - request’s unsafe-request flag is set and either request’s method is\n // not a CORS-safelisted method or CORS-unsafe request-header names with\n // request’s header list is not empty\n // 1. Set request’s response tainting to \"cors\".\n // 2. Let corsWithPreflightResponse be the result of running HTTP fetch\n // given fetchParams and true.\n // 3. If corsWithPreflightResponse is a network error, then clear cache\n // entries using request.\n // 4. Return corsWithPreflightResponse.\n // TODO\n\n // Otherwise\n // 1. Set request’s response tainting to \"cors\".\n request.responseTainting = 'cors'\n\n // 2. Return the result of running HTTP fetch given fetchParams.\n return await httpFetch(fetchParams)\n })()\n }\n\n // 12. If recursive is true, then return response.\n if (recursive) {\n return response\n }\n\n // 13. If response is not a network error and response is not a filtered\n // response, then:\n if (response.status !== 0 && !response.internalResponse) {\n // If request’s response tainting is \"cors\", then:\n if (request.responseTainting === 'cors') {\n // 1. Let headerNames be the result of extracting header list values\n // given `Access-Control-Expose-Headers` and response’s header list.\n // TODO\n // 2. If request’s credentials mode is not \"include\" and headerNames\n // contains `*`, then set response’s CORS-exposed header-name list to\n // all unique header names in response’s header list.\n // TODO\n // 3. Otherwise, if headerNames is not null or failure, then set\n // response’s CORS-exposed header-name list to headerNames.\n // TODO\n }\n\n // Set response to the following filtered response with response as its\n // internal response, depending on request’s response tainting:\n if (request.responseTainting === 'basic') {\n response = filterResponse(response, 'basic')\n } else if (request.responseTainting === 'cors') {\n response = filterResponse(response, 'cors')\n } else if (request.responseTainting === 'opaque') {\n response = filterResponse(response, 'opaque')\n } else {\n assert(false)\n }\n }\n\n // 14. Let internalResponse be response, if response is a network error,\n // and response’s internal response otherwise.\n let internalResponse =\n response.status === 0 ? response : response.internalResponse\n\n // 15. If internalResponse’s URL list is empty, then set it to a clone of\n // request’s URL list.\n if (internalResponse.urlList.length === 0) {\n internalResponse.urlList.push(...request.urlList)\n }\n\n // 16. If request’s timing allow failed flag is unset, then set\n // internalResponse’s timing allow passed flag.\n if (!request.timingAllowFailed) {\n response.timingAllowPassed = true\n }\n\n // 17. If response is not a network error and any of the following returns\n // blocked\n // - should internalResponse to request be blocked as mixed content\n // - should internalResponse to request be blocked by Content Security Policy\n // - should internalResponse to request be blocked due to its MIME type\n // - should internalResponse to request be blocked due to nosniff\n // TODO\n\n // 18. If response’s type is \"opaque\", internalResponse’s status is 206,\n // internalResponse’s range-requested flag is set, and request’s header\n // list does not contain `Range`, then set response and internalResponse\n // to a network error.\n if (\n response.type === 'opaque' &&\n internalResponse.status === 206 &&\n internalResponse.rangeRequested &&\n !request.headers.contains('range')\n ) {\n response = internalResponse = makeNetworkError()\n }\n\n // 19. If response is not a network error and either request’s method is\n // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status,\n // set internalResponse’s body to null and disregard any enqueuing toward\n // it (if any).\n if (\n response.status !== 0 &&\n (request.method === 'HEAD' ||\n request.method === 'CONNECT' ||\n nullBodyStatus.includes(internalResponse.status))\n ) {\n internalResponse.body = null\n fetchParams.controller.dump = true\n }\n\n // 20. If request’s integrity metadata is not the empty string, then:\n if (request.integrity) {\n // 1. Let processBodyError be this step: run fetch finale given fetchParams\n // and a network error.\n const processBodyError = (reason) =>\n fetchFinale(fetchParams, makeNetworkError(reason))\n\n // 2. If request’s response tainting is \"opaque\", or response’s body is null,\n // then run processBodyError and abort these steps.\n if (request.responseTainting === 'opaque' || response.body == null) {\n processBodyError(response.error)\n return\n }\n\n // 3. Let processBody given bytes be these steps:\n const processBody = (bytes) => {\n // 1. If bytes do not match request’s integrity metadata,\n // then run processBodyError and abort these steps. [SRI]\n if (!bytesMatch(bytes, request.integrity)) {\n processBodyError('integrity mismatch')\n return\n }\n\n // 2. Set response’s body to bytes as a body.\n response.body = safelyExtractBody(bytes)[0]\n\n // 3. Run fetch finale given fetchParams and response.\n fetchFinale(fetchParams, response)\n }\n\n // 4. Fully read response’s body given processBody and processBodyError.\n await fullyReadBody(response.body, processBody, processBodyError)\n } else {\n // 21. Otherwise, run fetch finale given fetchParams and response.\n fetchFinale(fetchParams, response)\n }\n}\n\n// https://fetch.spec.whatwg.org/#concept-scheme-fetch\n// given a fetch params fetchParams\nasync function schemeFetch (fetchParams) {\n // Note: since the connection is destroyed on redirect, which sets fetchParams to a\n // cancelled state, we do not want this condition to trigger *unless* there have been\n // no redirects. See https://github.com/nodejs/undici/issues/1776\n // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {\n return makeAppropriateNetworkError(fetchParams)\n }\n\n // 2. Let request be fetchParams’s request.\n const { request } = fetchParams\n\n const { protocol: scheme } = requestCurrentURL(request)\n\n // 3. Switch on request’s current URL’s scheme and run the associated steps:\n switch (scheme) {\n case 'about:': {\n // If request’s current URL’s path is the string \"blank\", then return a new response\n // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) »,\n // and body is the empty byte sequence as a body.\n\n // Otherwise, return a network error.\n return makeNetworkError('about scheme is not supported')\n }\n case 'blob:': {\n if (!resolveObjectURL) {\n resolveObjectURL = require('buffer').resolveObjectURL\n }\n\n // 1. Let blobURLEntry be request’s current URL’s blob URL entry.\n const blobURLEntry = requestCurrentURL(request)\n\n // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56\n // Buffer.resolveObjectURL does not ignore URL queries.\n if (blobURLEntry.search.length !== 0) {\n return makeNetworkError('NetworkError when attempting to fetch resource.')\n }\n\n const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString())\n\n // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s\n // object is not a Blob object, then return a network error.\n if (request.method !== 'GET' || !isBlobLike(blobURLEntryObject)) {\n return makeNetworkError('invalid method')\n }\n\n // 3. Let bodyWithType be the result of safely extracting blobURLEntry’s object.\n const bodyWithType = safelyExtractBody(blobURLEntryObject)\n\n // 4. Let body be bodyWithType’s body.\n const body = bodyWithType[0]\n\n // 5. Let length be body’s length, serialized and isomorphic encoded.\n const length = isomorphicEncode(`${body.length}`)\n\n // 6. Let type be bodyWithType’s type if it is non-null; otherwise the empty byte sequence.\n const type = bodyWithType[1] ?? ''\n\n // 7. Return a new response whose status message is `OK`, header list is\n // « (`Content-Length`, length), (`Content-Type`, type) », and body is body.\n const response = makeResponse({\n statusText: 'OK',\n headersList: [\n ['content-length', { name: 'Content-Length', value: length }],\n ['content-type', { name: 'Content-Type', value: type }]\n ]\n })\n\n response.body = body\n\n return response\n }\n case 'data:': {\n // 1. Let dataURLStruct be the result of running the\n // data: URL processor on request’s current URL.\n const currentURL = requestCurrentURL(request)\n const dataURLStruct = dataURLProcessor(currentURL)\n\n // 2. If dataURLStruct is failure, then return a\n // network error.\n if (dataURLStruct === 'failure') {\n return makeNetworkError('failed to fetch the data URL')\n }\n\n // 3. Let mimeType be dataURLStruct’s MIME type, serialized.\n const mimeType = serializeAMimeType(dataURLStruct.mimeType)\n\n // 4. Return a response whose status message is `OK`,\n // header list is « (`Content-Type`, mimeType) »,\n // and body is dataURLStruct’s body as a body.\n return makeResponse({\n statusText: 'OK',\n headersList: [\n ['content-type', { name: 'Content-Type', value: mimeType }]\n ],\n body: safelyExtractBody(dataURLStruct.body)[0]\n })\n }\n case 'file:': {\n // For now, unfortunate as it is, file URLs are left as an exercise for the reader.\n // When in doubt, return a network error.\n return makeNetworkError('not implemented... yet...')\n }\n case 'http:':\n case 'https:': {\n // Return the result of running HTTP fetch given fetchParams.\n\n return await httpFetch(fetchParams)\n .catch((err) => makeNetworkError(err))\n }\n default: {\n return makeNetworkError('unknown scheme')\n }\n }\n}\n\n// https://fetch.spec.whatwg.org/#finalize-response\nfunction finalizeResponse (fetchParams, response) {\n // 1. Set fetchParams’s request’s done flag.\n fetchParams.request.done = true\n\n // 2, If fetchParams’s process response done is not null, then queue a fetch\n // task to run fetchParams’s process response done given response, with\n // fetchParams’s task destination.\n if (fetchParams.processResponseDone != null) {\n queueMicrotask(() => fetchParams.processResponseDone(response))\n }\n}\n\n// https://fetch.spec.whatwg.org/#fetch-finale\nasync function fetchFinale (fetchParams, response) {\n // 1. If response is a network error, then:\n if (response.type === 'error') {\n // 1. Set response’s URL list to « fetchParams’s request’s URL list[0] ».\n response.urlList = [fetchParams.request.urlList[0]]\n\n // 2. Set response’s timing info to the result of creating an opaque timing\n // info for fetchParams’s timing info.\n response.timingInfo = createOpaqueTimingInfo({\n startTime: fetchParams.timingInfo.startTime\n })\n }\n\n // 2. Let processResponseEndOfBody be the following steps:\n const processResponseEndOfBody = () => {\n // 1. Set fetchParams’s request’s done flag.\n fetchParams.request.done = true\n\n // If fetchParams’s process response end-of-body is not null,\n // then queue a fetch task to run fetchParams’s process response\n // end-of-body given response with fetchParams’s task destination.\n if (fetchParams.processResponseEndOfBody != null) {\n queueMicrotask(() => fetchParams.processResponseEndOfBody(response))\n }\n }\n\n // 3. If fetchParams’s process response is non-null, then queue a fetch task\n // to run fetchParams’s process response given response, with fetchParams’s\n // task destination.\n if (fetchParams.processResponse != null) {\n queueMicrotask(() => fetchParams.processResponse(response))\n }\n\n // 4. If response’s body is null, then run processResponseEndOfBody.\n if (response.body == null) {\n processResponseEndOfBody()\n } else {\n // 5. Otherwise:\n\n // 1. Let transformStream be a new a TransformStream.\n\n // 2. Let identityTransformAlgorithm be an algorithm which, given chunk,\n // enqueues chunk in transformStream.\n const identityTransformAlgorithm = (chunk, controller) => {\n controller.enqueue(chunk)\n }\n\n // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm\n // and flushAlgorithm set to processResponseEndOfBody.\n const transformStream = new TransformStream({\n start () {},\n transform: identityTransformAlgorithm,\n flush: processResponseEndOfBody\n }, {\n size () {\n return 1\n }\n }, {\n size () {\n return 1\n }\n })\n\n // 4. Set response’s body to the result of piping response’s body through transformStream.\n response.body = { stream: response.body.stream.pipeThrough(transformStream) }\n }\n\n // 6. If fetchParams’s process response consume body is non-null, then:\n if (fetchParams.processResponseConsumeBody != null) {\n // 1. Let processBody given nullOrBytes be this step: run fetchParams’s\n // process response consume body given response and nullOrBytes.\n const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes)\n\n // 2. Let processBodyError be this step: run fetchParams’s process\n // response consume body given response and failure.\n const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure)\n\n // 3. If response’s body is null, then queue a fetch task to run processBody\n // given null, with fetchParams’s task destination.\n if (response.body == null) {\n queueMicrotask(() => processBody(null))\n } else {\n // 4. Otherwise, fully read response’s body given processBody, processBodyError,\n // and fetchParams’s task destination.\n await fullyReadBody(response.body, processBody, processBodyError)\n }\n }\n}\n\n// https://fetch.spec.whatwg.org/#http-fetch\nasync function httpFetch (fetchParams) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. Let actualResponse be null.\n let actualResponse = null\n\n // 4. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 5. If request’s service-workers mode is \"all\", then:\n if (request.serviceWorkers === 'all') {\n // TODO\n }\n\n // 6. If response is null, then:\n if (response === null) {\n // 1. If makeCORSPreflight is true and one of these conditions is true:\n // TODO\n\n // 2. If request’s redirect mode is \"follow\", then set request’s\n // service-workers mode to \"none\".\n if (request.redirect === 'follow') {\n request.serviceWorkers = 'none'\n }\n\n // 3. Set response and actualResponse to the result of running\n // HTTP-network-or-cache fetch given fetchParams.\n actualResponse = response = await httpNetworkOrCacheFetch(fetchParams)\n\n // 4. If request’s response tainting is \"cors\" and a CORS check\n // for request and response returns failure, then return a network error.\n if (\n request.responseTainting === 'cors' &&\n corsCheck(request, response) === 'failure'\n ) {\n return makeNetworkError('cors failure')\n }\n\n // 5. If the TAO check for request and response returns failure, then set\n // request’s timing allow failed flag.\n if (TAOCheck(request, response) === 'failure') {\n request.timingAllowFailed = true\n }\n }\n\n // 7. If either request’s response tainting or response’s type\n // is \"opaque\", and the cross-origin resource policy check with\n // request’s origin, request’s client, request’s destination,\n // and actualResponse returns blocked, then return a network error.\n if (\n (request.responseTainting === 'opaque' || response.type === 'opaque') &&\n crossOriginResourcePolicyCheck(\n request.origin,\n request.client,\n request.destination,\n actualResponse\n ) === 'blocked'\n ) {\n return makeNetworkError('blocked')\n }\n\n // 8. If actualResponse’s status is a redirect status, then:\n if (redirectStatus.includes(actualResponse.status)) {\n // 1. If actualResponse’s status is not 303, request’s body is not null,\n // and the connection uses HTTP/2, then user agents may, and are even\n // encouraged to, transmit an RST_STREAM frame.\n // See, https://github.com/whatwg/fetch/issues/1288\n if (request.redirect !== 'manual') {\n fetchParams.controller.connection.destroy()\n }\n\n // 2. Switch on request’s redirect mode:\n if (request.redirect === 'error') {\n // Set response to a network error.\n response = makeNetworkError('unexpected redirect')\n } else if (request.redirect === 'manual') {\n // Set response to an opaque-redirect filtered response whose internal\n // response is actualResponse.\n // NOTE(spec): On the web this would return an `opaqueredirect` response,\n // but that doesn't make sense server side.\n // See https://github.com/nodejs/undici/issues/1193.\n response = actualResponse\n } else if (request.redirect === 'follow') {\n // Set response to the result of running HTTP-redirect fetch given\n // fetchParams and response.\n response = await httpRedirectFetch(fetchParams, response)\n } else {\n assert(false)\n }\n }\n\n // 9. Set response’s timing info to timingInfo.\n response.timingInfo = timingInfo\n\n // 10. Return response.\n return response\n}\n\n// https://fetch.spec.whatwg.org/#http-redirect-fetch\nasync function httpRedirectFetch (fetchParams, response) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let actualResponse be response, if response is not a filtered response,\n // and response’s internal response otherwise.\n const actualResponse = response.internalResponse\n ? response.internalResponse\n : response\n\n // 3. Let locationURL be actualResponse’s location URL given request’s current\n // URL’s fragment.\n let locationURL\n\n try {\n locationURL = responseLocationURL(\n actualResponse,\n requestCurrentURL(request).hash\n )\n\n // 4. If locationURL is null, then return response.\n if (locationURL == null) {\n return response\n }\n } catch (err) {\n // 5. If locationURL is failure, then return a network error.\n return makeNetworkError(err)\n }\n\n // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network\n // error.\n if (!urlIsHttpHttpsScheme(locationURL)) {\n return makeNetworkError('URL scheme must be a HTTP(S) scheme')\n }\n\n // 7. If request’s redirect count is 20, then return a network error.\n if (request.redirectCount === 20) {\n return makeNetworkError('redirect count exceeded')\n }\n\n // 8. Increase request’s redirect count by 1.\n request.redirectCount += 1\n\n // 9. If request’s mode is \"cors\", locationURL includes credentials, and\n // request’s origin is not same origin with locationURL’s origin, then return\n // a network error.\n if (\n request.mode === 'cors' &&\n (locationURL.username || locationURL.password) &&\n !sameOrigin(request, locationURL)\n ) {\n return makeNetworkError('cross origin not allowed for request mode \"cors\"')\n }\n\n // 10. If request’s response tainting is \"cors\" and locationURL includes\n // credentials, then return a network error.\n if (\n request.responseTainting === 'cors' &&\n (locationURL.username || locationURL.password)\n ) {\n return makeNetworkError(\n 'URL cannot contain credentials for request mode \"cors\"'\n )\n }\n\n // 11. If actualResponse’s status is not 303, request’s body is non-null,\n // and request’s body’s source is null, then return a network error.\n if (\n actualResponse.status !== 303 &&\n request.body != null &&\n request.body.source == null\n ) {\n return makeNetworkError()\n }\n\n // 12. If one of the following is true\n // - actualResponse’s status is 301 or 302 and request’s method is `POST`\n // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD`\n if (\n ([301, 302].includes(actualResponse.status) && request.method === 'POST') ||\n (actualResponse.status === 303 &&\n !['GET', 'HEAD'].includes(request.method))\n ) {\n // then:\n // 1. Set request’s method to `GET` and request’s body to null.\n request.method = 'GET'\n request.body = null\n\n // 2. For each headerName of request-body-header name, delete headerName from\n // request’s header list.\n for (const headerName of requestBodyHeader) {\n request.headersList.delete(headerName)\n }\n }\n\n // 13. If request’s current URL’s origin is not same origin with locationURL’s\n // origin, then for each headerName of CORS non-wildcard request-header name,\n // delete headerName from request’s header list.\n if (!sameOrigin(requestCurrentURL(request), locationURL)) {\n // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name\n request.headersList.delete('authorization')\n\n // \"Cookie\" and \"Host\" are forbidden request-headers, which undici doesn't implement.\n request.headersList.delete('cookie')\n request.headersList.delete('host')\n }\n\n // 14. If request’s body is non-null, then set request’s body to the first return\n // value of safely extracting request’s body’s source.\n if (request.body != null) {\n assert(request.body.source != null)\n request.body = safelyExtractBody(request.body.source)[0]\n }\n\n // 15. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 16. Set timingInfo’s redirect end time and post-redirect start time to the\n // coarsened shared current time given fetchParams’s cross-origin isolated\n // capability.\n timingInfo.redirectEndTime = timingInfo.postRedirectStartTime =\n coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)\n\n // 17. If timingInfo’s redirect start time is 0, then set timingInfo’s\n // redirect start time to timingInfo’s start time.\n if (timingInfo.redirectStartTime === 0) {\n timingInfo.redirectStartTime = timingInfo.startTime\n }\n\n // 18. Append locationURL to request’s URL list.\n request.urlList.push(locationURL)\n\n // 19. Invoke set request’s referrer policy on redirect on request and\n // actualResponse.\n setRequestReferrerPolicyOnRedirect(request, actualResponse)\n\n // 20. Return the result of running main fetch given fetchParams and true.\n return mainFetch(fetchParams, true)\n}\n\n// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch\nasync function httpNetworkOrCacheFetch (\n fetchParams,\n isAuthenticationFetch = false,\n isNewConnectionFetch = false\n) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let httpFetchParams be null.\n let httpFetchParams = null\n\n // 3. Let httpRequest be null.\n let httpRequest = null\n\n // 4. Let response be null.\n let response = null\n\n // 5. Let storedResponse be null.\n // TODO: cache\n\n // 6. Let httpCache be null.\n const httpCache = null\n\n // 7. Let the revalidatingFlag be unset.\n const revalidatingFlag = false\n\n // 8. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. If request’s window is \"no-window\" and request’s redirect mode is\n // \"error\", then set httpFetchParams to fetchParams and httpRequest to\n // request.\n if (request.window === 'no-window' && request.redirect === 'error') {\n httpFetchParams = fetchParams\n httpRequest = request\n } else {\n // Otherwise:\n\n // 1. Set httpRequest to a clone of request.\n httpRequest = makeRequest(request)\n\n // 2. Set httpFetchParams to a copy of fetchParams.\n httpFetchParams = { ...fetchParams }\n\n // 3. Set httpFetchParams’s request to httpRequest.\n httpFetchParams.request = httpRequest\n }\n\n // 3. Let includeCredentials be true if one of\n const includeCredentials =\n request.credentials === 'include' ||\n (request.credentials === 'same-origin' &&\n request.responseTainting === 'basic')\n\n // 4. Let contentLength be httpRequest’s body’s length, if httpRequest’s\n // body is non-null; otherwise null.\n const contentLength = httpRequest.body ? httpRequest.body.length : null\n\n // 5. Let contentLengthHeaderValue be null.\n let contentLengthHeaderValue = null\n\n // 6. If httpRequest’s body is null and httpRequest’s method is `POST` or\n // `PUT`, then set contentLengthHeaderValue to `0`.\n if (\n httpRequest.body == null &&\n ['POST', 'PUT'].includes(httpRequest.method)\n ) {\n contentLengthHeaderValue = '0'\n }\n\n // 7. If contentLength is non-null, then set contentLengthHeaderValue to\n // contentLength, serialized and isomorphic encoded.\n if (contentLength != null) {\n contentLengthHeaderValue = isomorphicEncode(`${contentLength}`)\n }\n\n // 8. If contentLengthHeaderValue is non-null, then append\n // `Content-Length`/contentLengthHeaderValue to httpRequest’s header\n // list.\n if (contentLengthHeaderValue != null) {\n httpRequest.headersList.append('content-length', contentLengthHeaderValue)\n }\n\n // 9. If contentLengthHeaderValue is non-null, then append (`Content-Length`,\n // contentLengthHeaderValue) to httpRequest’s header list.\n\n // 10. If contentLength is non-null and httpRequest’s keepalive is true,\n // then:\n if (contentLength != null && httpRequest.keepalive) {\n // NOTE: keepalive is a noop outside of browser context.\n }\n\n // 11. If httpRequest’s referrer is a URL, then append\n // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded,\n // to httpRequest’s header list.\n if (httpRequest.referrer instanceof URL) {\n httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href))\n }\n\n // 12. Append a request `Origin` header for httpRequest.\n appendRequestOriginHeader(httpRequest)\n\n // 13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA]\n appendFetchMetadata(httpRequest)\n\n // 14. If httpRequest’s header list does not contain `User-Agent`, then\n // user agents should append `User-Agent`/default `User-Agent` value to\n // httpRequest’s header list.\n if (!httpRequest.headersList.contains('user-agent')) {\n httpRequest.headersList.append('user-agent', typeof esbuildDetection === 'undefined' ? 'undici' : 'node')\n }\n\n // 15. If httpRequest’s cache mode is \"default\" and httpRequest’s header\n // list contains `If-Modified-Since`, `If-None-Match`,\n // `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set\n // httpRequest’s cache mode to \"no-store\".\n if (\n httpRequest.cache === 'default' &&\n (httpRequest.headersList.contains('if-modified-since') ||\n httpRequest.headersList.contains('if-none-match') ||\n httpRequest.headersList.contains('if-unmodified-since') ||\n httpRequest.headersList.contains('if-match') ||\n httpRequest.headersList.contains('if-range'))\n ) {\n httpRequest.cache = 'no-store'\n }\n\n // 16. If httpRequest’s cache mode is \"no-cache\", httpRequest’s prevent\n // no-cache cache-control header modification flag is unset, and\n // httpRequest’s header list does not contain `Cache-Control`, then append\n // `Cache-Control`/`max-age=0` to httpRequest’s header list.\n if (\n httpRequest.cache === 'no-cache' &&\n !httpRequest.preventNoCacheCacheControlHeaderModification &&\n !httpRequest.headersList.contains('cache-control')\n ) {\n httpRequest.headersList.append('cache-control', 'max-age=0')\n }\n\n // 17. If httpRequest’s cache mode is \"no-store\" or \"reload\", then:\n if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') {\n // 1. If httpRequest’s header list does not contain `Pragma`, then append\n // `Pragma`/`no-cache` to httpRequest’s header list.\n if (!httpRequest.headersList.contains('pragma')) {\n httpRequest.headersList.append('pragma', 'no-cache')\n }\n\n // 2. If httpRequest’s header list does not contain `Cache-Control`,\n // then append `Cache-Control`/`no-cache` to httpRequest’s header list.\n if (!httpRequest.headersList.contains('cache-control')) {\n httpRequest.headersList.append('cache-control', 'no-cache')\n }\n }\n\n // 18. If httpRequest’s header list contains `Range`, then append\n // `Accept-Encoding`/`identity` to httpRequest’s header list.\n if (httpRequest.headersList.contains('range')) {\n httpRequest.headersList.append('accept-encoding', 'identity')\n }\n\n // 19. Modify httpRequest’s header list per HTTP. Do not append a given\n // header if httpRequest’s header list contains that header’s name.\n // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129\n if (!httpRequest.headersList.contains('accept-encoding')) {\n if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) {\n httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate')\n } else {\n httpRequest.headersList.append('accept-encoding', 'gzip, deflate')\n }\n }\n\n httpRequest.headersList.delete('host')\n\n // 20. If includeCredentials is true, then:\n if (includeCredentials) {\n // 1. If the user agent is not configured to block cookies for httpRequest\n // (see section 7 of [COOKIES]), then:\n // TODO: credentials\n // 2. If httpRequest’s header list does not contain `Authorization`, then:\n // TODO: credentials\n }\n\n // 21. If there’s a proxy-authentication entry, use it as appropriate.\n // TODO: proxy-authentication\n\n // 22. Set httpCache to the result of determining the HTTP cache\n // partition, given httpRequest.\n // TODO: cache\n\n // 23. If httpCache is null, then set httpRequest’s cache mode to\n // \"no-store\".\n if (httpCache == null) {\n httpRequest.cache = 'no-store'\n }\n\n // 24. If httpRequest’s cache mode is neither \"no-store\" nor \"reload\",\n // then:\n if (httpRequest.mode !== 'no-store' && httpRequest.mode !== 'reload') {\n // TODO: cache\n }\n\n // 9. If aborted, then return the appropriate network error for fetchParams.\n // TODO\n\n // 10. If response is null, then:\n if (response == null) {\n // 1. If httpRequest’s cache mode is \"only-if-cached\", then return a\n // network error.\n if (httpRequest.mode === 'only-if-cached') {\n return makeNetworkError('only if cached')\n }\n\n // 2. Let forwardResponse be the result of running HTTP-network fetch\n // given httpFetchParams, includeCredentials, and isNewConnectionFetch.\n const forwardResponse = await httpNetworkFetch(\n httpFetchParams,\n includeCredentials,\n isNewConnectionFetch\n )\n\n // 3. If httpRequest’s method is unsafe and forwardResponse’s status is\n // in the range 200 to 399, inclusive, invalidate appropriate stored\n // responses in httpCache, as per the \"Invalidation\" chapter of HTTP\n // Caching, and set storedResponse to null. [HTTP-CACHING]\n if (\n !safeMethods.includes(httpRequest.method) &&\n forwardResponse.status >= 200 &&\n forwardResponse.status <= 399\n ) {\n // TODO: cache\n }\n\n // 4. If the revalidatingFlag is set and forwardResponse’s status is 304,\n // then:\n if (revalidatingFlag && forwardResponse.status === 304) {\n // TODO: cache\n }\n\n // 5. If response is null, then:\n if (response == null) {\n // 1. Set response to forwardResponse.\n response = forwardResponse\n\n // 2. Store httpRequest and forwardResponse in httpCache, as per the\n // \"Storing Responses in Caches\" chapter of HTTP Caching. [HTTP-CACHING]\n // TODO: cache\n }\n }\n\n // 11. Set response’s URL list to a clone of httpRequest’s URL list.\n response.urlList = [...httpRequest.urlList]\n\n // 12. If httpRequest’s header list contains `Range`, then set response’s\n // range-requested flag.\n if (httpRequest.headersList.contains('range')) {\n response.rangeRequested = true\n }\n\n // 13. Set response’s request-includes-credentials to includeCredentials.\n response.requestIncludesCredentials = includeCredentials\n\n // 14. If response’s status is 401, httpRequest’s response tainting is not\n // \"cors\", includeCredentials is true, and request’s window is an environment\n // settings object, then:\n // TODO\n\n // 15. If response’s status is 407, then:\n if (response.status === 407) {\n // 1. If request’s window is \"no-window\", then return a network error.\n if (request.window === 'no-window') {\n return makeNetworkError()\n }\n\n // 2. ???\n\n // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams)) {\n return makeAppropriateNetworkError(fetchParams)\n }\n\n // 4. Prompt the end user as appropriate in request’s window and store\n // the result as a proxy-authentication entry. [HTTP-AUTH]\n // TODO: Invoke some kind of callback?\n\n // 5. Set response to the result of running HTTP-network-or-cache fetch given\n // fetchParams.\n // TODO\n return makeNetworkError('proxy authentication required')\n }\n\n // 16. If all of the following are true\n if (\n // response’s status is 421\n response.status === 421 &&\n // isNewConnectionFetch is false\n !isNewConnectionFetch &&\n // request’s body is null, or request’s body is non-null and request’s body’s source is non-null\n (request.body == null || request.body.source != null)\n ) {\n // then:\n\n // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams)) {\n return makeAppropriateNetworkError(fetchParams)\n }\n\n // 2. Set response to the result of running HTTP-network-or-cache\n // fetch given fetchParams, isAuthenticationFetch, and true.\n\n // TODO (spec): The spec doesn't specify this but we need to cancel\n // the active response before we can start a new one.\n // https://github.com/whatwg/fetch/issues/1293\n fetchParams.controller.connection.destroy()\n\n response = await httpNetworkOrCacheFetch(\n fetchParams,\n isAuthenticationFetch,\n true\n )\n }\n\n // 17. If isAuthenticationFetch is true, then create an authentication entry\n if (isAuthenticationFetch) {\n // TODO\n }\n\n // 18. Return response.\n return response\n}\n\n// https://fetch.spec.whatwg.org/#http-network-fetch\nasync function httpNetworkFetch (\n fetchParams,\n includeCredentials = false,\n forceNewConnection = false\n) {\n assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed)\n\n fetchParams.controller.connection = {\n abort: null,\n destroyed: false,\n destroy (err) {\n if (!this.destroyed) {\n this.destroyed = true\n this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError'))\n }\n }\n }\n\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 4. Let httpCache be the result of determining the HTTP cache partition,\n // given request.\n // TODO: cache\n const httpCache = null\n\n // 5. If httpCache is null, then set request’s cache mode to \"no-store\".\n if (httpCache == null) {\n request.cache = 'no-store'\n }\n\n // 6. Let networkPartitionKey be the result of determining the network\n // partition key given request.\n // TODO\n\n // 7. Let newConnection be \"yes\" if forceNewConnection is true; otherwise\n // \"no\".\n const newConnection = forceNewConnection ? 'yes' : 'no' // eslint-disable-line no-unused-vars\n\n // 8. Switch on request’s mode:\n if (request.mode === 'websocket') {\n // Let connection be the result of obtaining a WebSocket connection,\n // given request’s current URL.\n // TODO\n } else {\n // Let connection be the result of obtaining a connection, given\n // networkPartitionKey, request’s current URL’s origin,\n // includeCredentials, and forceNewConnection.\n // TODO\n }\n\n // 9. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. If connection is failure, then return a network error.\n\n // 2. Set timingInfo’s final connection timing info to the result of\n // calling clamp and coarsen connection timing info with connection’s\n // timing info, timingInfo’s post-redirect start time, and fetchParams’s\n // cross-origin isolated capability.\n\n // 3. If connection is not an HTTP/2 connection, request’s body is non-null,\n // and request’s body’s source is null, then append (`Transfer-Encoding`,\n // `chunked`) to request’s header list.\n\n // 4. Set timingInfo’s final network-request start time to the coarsened\n // shared current time given fetchParams’s cross-origin isolated\n // capability.\n\n // 5. Set response to the result of making an HTTP request over connection\n // using request with the following caveats:\n\n // - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS]\n // [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH]\n\n // - If request’s body is non-null, and request’s body’s source is null,\n // then the user agent may have a buffer of up to 64 kibibytes and store\n // a part of request’s body in that buffer. If the user agent reads from\n // request’s body beyond that buffer’s size and the user agent needs to\n // resend request, then instead return a network error.\n\n // - Set timingInfo’s final network-response start time to the coarsened\n // shared current time given fetchParams’s cross-origin isolated capability,\n // immediately after the user agent’s HTTP parser receives the first byte\n // of the response (e.g., frame header bytes for HTTP/2 or response status\n // line for HTTP/1.x).\n\n // - Wait until all the headers are transmitted.\n\n // - Any responses whose status is in the range 100 to 199, inclusive,\n // and is not 101, are to be ignored, except for the purposes of setting\n // timingInfo’s final network-response start time above.\n\n // - If request’s header list contains `Transfer-Encoding`/`chunked` and\n // response is transferred via HTTP/1.0 or older, then return a network\n // error.\n\n // - If the HTTP request results in a TLS client certificate dialog, then:\n\n // 1. If request’s window is an environment settings object, make the\n // dialog available in request’s window.\n\n // 2. Otherwise, return a network error.\n\n // To transmit request’s body body, run these steps:\n let requestBody = null\n // 1. If body is null and fetchParams’s process request end-of-body is\n // non-null, then queue a fetch task given fetchParams’s process request\n // end-of-body and fetchParams’s task destination.\n if (request.body == null && fetchParams.processRequestEndOfBody) {\n queueMicrotask(() => fetchParams.processRequestEndOfBody())\n } else if (request.body != null) {\n // 2. Otherwise, if body is non-null:\n\n // 1. Let processBodyChunk given bytes be these steps:\n const processBodyChunk = async function * (bytes) {\n // 1. If the ongoing fetch is terminated, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. Run this step in parallel: transmit bytes.\n yield bytes\n\n // 3. If fetchParams’s process request body is non-null, then run\n // fetchParams’s process request body given bytes’s length.\n fetchParams.processRequestBodyChunkLength?.(bytes.byteLength)\n }\n\n // 2. Let processEndOfBody be these steps:\n const processEndOfBody = () => {\n // 1. If fetchParams is canceled, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. If fetchParams’s process request end-of-body is non-null,\n // then run fetchParams’s process request end-of-body.\n if (fetchParams.processRequestEndOfBody) {\n fetchParams.processRequestEndOfBody()\n }\n }\n\n // 3. Let processBodyError given e be these steps:\n const processBodyError = (e) => {\n // 1. If fetchParams is canceled, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. If e is an \"AbortError\" DOMException, then abort fetchParams’s controller.\n if (e.name === 'AbortError') {\n fetchParams.controller.abort()\n } else {\n fetchParams.controller.terminate(e)\n }\n }\n\n // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody,\n // processBodyError, and fetchParams’s task destination.\n requestBody = (async function * () {\n try {\n for await (const bytes of request.body.stream) {\n yield * processBodyChunk(bytes)\n }\n processEndOfBody()\n } catch (err) {\n processBodyError(err)\n }\n })()\n }\n\n try {\n // socket is only provided for websockets\n const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody })\n\n if (socket) {\n response = makeResponse({ status, statusText, headersList, socket })\n } else {\n const iterator = body[Symbol.asyncIterator]()\n fetchParams.controller.next = () => iterator.next()\n\n response = makeResponse({ status, statusText, headersList })\n }\n } catch (err) {\n // 10. If aborted, then:\n if (err.name === 'AbortError') {\n // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame.\n fetchParams.controller.connection.destroy()\n\n // 2. Return the appropriate network error for fetchParams.\n return makeAppropriateNetworkError(fetchParams, err)\n }\n\n return makeNetworkError(err)\n }\n\n // 11. Let pullAlgorithm be an action that resumes the ongoing fetch\n // if it is suspended.\n const pullAlgorithm = () => {\n fetchParams.controller.resume()\n }\n\n // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s\n // controller with reason, given reason.\n const cancelAlgorithm = (reason) => {\n fetchParams.controller.abort(reason)\n }\n\n // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by\n // the user agent.\n // TODO\n\n // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object\n // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent.\n // TODO\n\n // 15. Let stream be a new ReadableStream.\n // 16. Set up stream with pullAlgorithm set to pullAlgorithm,\n // cancelAlgorithm set to cancelAlgorithm, highWaterMark set to\n // highWaterMark, and sizeAlgorithm set to sizeAlgorithm.\n if (!ReadableStream) {\n ReadableStream = require('stream/web').ReadableStream\n }\n\n const stream = new ReadableStream(\n {\n async start (controller) {\n fetchParams.controller.controller = controller\n },\n async pull (controller) {\n await pullAlgorithm(controller)\n },\n async cancel (reason) {\n await cancelAlgorithm(reason)\n }\n },\n {\n highWaterMark: 0,\n size () {\n return 1\n }\n }\n )\n\n // 17. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. Set response’s body to a new body whose stream is stream.\n response.body = { stream }\n\n // 2. If response is not a network error and request’s cache mode is\n // not \"no-store\", then update response in httpCache for request.\n // TODO\n\n // 3. If includeCredentials is true and the user agent is not configured\n // to block cookies for request (see section 7 of [COOKIES]), then run the\n // \"set-cookie-string\" parsing algorithm (see section 5.2 of [COOKIES]) on\n // the value of each header whose name is a byte-case-insensitive match for\n // `Set-Cookie` in response’s header list, if any, and request’s current URL.\n // TODO\n\n // 18. If aborted, then:\n // TODO\n\n // 19. Run these steps in parallel:\n\n // 1. Run these steps, but abort when fetchParams is canceled:\n fetchParams.controller.on('terminated', onAborted)\n fetchParams.controller.resume = async () => {\n // 1. While true\n while (true) {\n // 1-3. See onData...\n\n // 4. Set bytes to the result of handling content codings given\n // codings and bytes.\n let bytes\n let isFailure\n try {\n const { done, value } = await fetchParams.controller.next()\n\n if (isAborted(fetchParams)) {\n break\n }\n\n bytes = done ? undefined : value\n } catch (err) {\n if (fetchParams.controller.ended && !timingInfo.encodedBodySize) {\n // zlib doesn't like empty streams.\n bytes = undefined\n } else {\n bytes = err\n\n // err may be propagated from the result of calling readablestream.cancel,\n // which might not be an error. https://github.com/nodejs/undici/issues/2009\n isFailure = true\n }\n }\n\n if (bytes === undefined) {\n // 2. Otherwise, if the bytes transmission for response’s message\n // body is done normally and stream is readable, then close\n // stream, finalize response for fetchParams and response, and\n // abort these in-parallel steps.\n readableStreamClose(fetchParams.controller.controller)\n\n finalizeResponse(fetchParams, response)\n\n return\n }\n\n // 5. Increase timingInfo’s decoded body size by bytes’s length.\n timingInfo.decodedBodySize += bytes?.byteLength ?? 0\n\n // 6. If bytes is failure, then terminate fetchParams’s controller.\n if (isFailure) {\n fetchParams.controller.terminate(bytes)\n return\n }\n\n // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes\n // into stream.\n fetchParams.controller.controller.enqueue(new Uint8Array(bytes))\n\n // 8. If stream is errored, then terminate the ongoing fetch.\n if (isErrored(stream)) {\n fetchParams.controller.terminate()\n return\n }\n\n // 9. If stream doesn’t need more data ask the user agent to suspend\n // the ongoing fetch.\n if (!fetchParams.controller.controller.desiredSize) {\n return\n }\n }\n }\n\n // 2. If aborted, then:\n function onAborted (reason) {\n // 2. If fetchParams is aborted, then:\n if (isAborted(fetchParams)) {\n // 1. Set response’s aborted flag.\n response.aborted = true\n\n // 2. If stream is readable, then error stream with the result of\n // deserialize a serialized abort reason given fetchParams’s\n // controller’s serialized abort reason and an\n // implementation-defined realm.\n if (isReadable(stream)) {\n fetchParams.controller.controller.error(\n fetchParams.controller.serializedAbortReason\n )\n }\n } else {\n // 3. Otherwise, if stream is readable, error stream with a TypeError.\n if (isReadable(stream)) {\n fetchParams.controller.controller.error(new TypeError('terminated', {\n cause: isErrorLike(reason) ? reason : undefined\n }))\n }\n }\n\n // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame.\n // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so.\n fetchParams.controller.connection.destroy()\n }\n\n // 20. Return response.\n return response\n\n async function dispatch ({ body }) {\n const url = requestCurrentURL(request)\n /** @type {import('../..').Agent} */\n const agent = fetchParams.controller.dispatcher\n\n return new Promise((resolve, reject) => agent.dispatch(\n {\n path: url.pathname + url.search,\n origin: url.origin,\n method: request.method,\n body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body,\n headers: request.headersList.entries,\n maxRedirections: 0,\n upgrade: request.mode === 'websocket' ? 'websocket' : undefined\n },\n {\n body: null,\n abort: null,\n\n onConnect (abort) {\n // TODO (fix): Do we need connection here?\n const { connection } = fetchParams.controller\n\n if (connection.destroyed) {\n abort(new DOMException('The operation was aborted.', 'AbortError'))\n } else {\n fetchParams.controller.on('terminated', abort)\n this.abort = connection.abort = abort\n }\n },\n\n onHeaders (status, headersList, resume, statusText) {\n if (status < 200) {\n return\n }\n\n let codings = []\n let location = ''\n\n const headers = new Headers()\n\n // For H2, the headers are a plain JS object\n // We distinguish between them and iterate accordingly\n if (Array.isArray(headersList)) {\n for (let n = 0; n < headersList.length; n += 2) {\n const key = headersList[n + 0].toString('latin1')\n const val = headersList[n + 1].toString('latin1')\n if (key.toLowerCase() === 'content-encoding') {\n // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1\n // \"All content-coding values are case-insensitive...\"\n codings = val.toLowerCase().split(',').map((x) => x.trim())\n } else if (key.toLowerCase() === 'location') {\n location = val\n }\n\n headers.append(key, val)\n }\n } else {\n const keys = Object.keys(headersList)\n for (const key of keys) {\n const val = headersList[key]\n if (key.toLowerCase() === 'content-encoding') {\n // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1\n // \"All content-coding values are case-insensitive...\"\n codings = val.toLowerCase().split(',').map((x) => x.trim()).reverse()\n } else if (key.toLowerCase() === 'location') {\n location = val\n }\n\n headers.append(key, val)\n }\n }\n\n this.body = new Readable({ read: resume })\n\n const decoders = []\n\n const willFollow = request.redirect === 'follow' &&\n location &&\n redirectStatus.includes(status)\n\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding\n if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {\n for (const coding of codings) {\n // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2\n if (coding === 'x-gzip' || coding === 'gzip') {\n decoders.push(zlib.createGunzip({\n // Be less strict when decoding compressed responses, since sometimes\n // servers send slightly invalid responses that are still accepted\n // by common browsers.\n // Always using Z_SYNC_FLUSH is what cURL does.\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n }))\n } else if (coding === 'deflate') {\n decoders.push(zlib.createInflate())\n } else if (coding === 'br') {\n decoders.push(zlib.createBrotliDecompress())\n } else {\n decoders.length = 0\n break\n }\n }\n }\n\n resolve({\n status,\n statusText,\n headersList: headers[kHeadersList],\n body: decoders.length\n ? pipeline(this.body, ...decoders, () => { })\n : this.body.on('error', () => {})\n })\n\n return true\n },\n\n onData (chunk) {\n if (fetchParams.controller.dump) {\n return\n }\n\n // 1. If one or more bytes have been transmitted from response’s\n // message body, then:\n\n // 1. Let bytes be the transmitted bytes.\n const bytes = chunk\n\n // 2. Let codings be the result of extracting header list values\n // given `Content-Encoding` and response’s header list.\n // See pullAlgorithm.\n\n // 3. Increase timingInfo’s encoded body size by bytes’s length.\n timingInfo.encodedBodySize += bytes.byteLength\n\n // 4. See pullAlgorithm...\n\n return this.body.push(bytes)\n },\n\n onComplete () {\n if (this.abort) {\n fetchParams.controller.off('terminated', this.abort)\n }\n\n fetchParams.controller.ended = true\n\n this.body.push(null)\n },\n\n onError (error) {\n if (this.abort) {\n fetchParams.controller.off('terminated', this.abort)\n }\n\n this.body?.destroy(error)\n\n fetchParams.controller.terminate(error)\n\n reject(error)\n },\n\n onUpgrade (status, headersList, socket) {\n if (status !== 101) {\n return\n }\n\n const headers = new Headers()\n\n for (let n = 0; n < headersList.length; n += 2) {\n const key = headersList[n + 0].toString('latin1')\n const val = headersList[n + 1].toString('latin1')\n\n headers.append(key, val)\n }\n\n resolve({\n status,\n statusText: STATUS_CODES[status],\n headersList: headers[kHeadersList],\n socket\n })\n\n return true\n }\n }\n ))\n }\n}\n\nmodule.exports = {\n fetch,\n Fetch,\n fetching,\n finalizeAndReportTiming\n}\n","/* globals AbortController */\n\n'use strict'\n\nconst { extractBody, mixinBody, cloneBody } = require('./body')\nconst { Headers, fill: fillHeaders, HeadersList } = require('./headers')\nconst { FinalizationRegistry } = require('../compat/dispatcher-weakref')()\nconst util = require('../core/util')\nconst {\n isValidHTTPToken,\n sameOrigin,\n normalizeMethod,\n makePolicyContainer\n} = require('./util')\nconst {\n forbiddenMethods,\n corsSafeListedMethods,\n referrerPolicy,\n requestRedirect,\n requestMode,\n requestCredentials,\n requestCache,\n requestDuplex\n} = require('./constants')\nconst { kEnumerableProperty } = util\nconst { kHeaders, kSignal, kState, kGuard, kRealm } = require('./symbols')\nconst { webidl } = require('./webidl')\nconst { getGlobalOrigin } = require('./global')\nconst { URLSerializer } = require('./dataURL')\nconst { kHeadersList } = require('../core/symbols')\nconst assert = require('assert')\nconst { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require('events')\n\nlet TransformStream = globalThis.TransformStream\n\nconst kInit = Symbol('init')\nconst kAbortController = Symbol('abortController')\n\nconst requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {\n signal.removeEventListener('abort', abort)\n})\n\n// https://fetch.spec.whatwg.org/#request-class\nclass Request {\n // https://fetch.spec.whatwg.org/#dom-request\n constructor (input, init = {}) {\n if (input === kInit) {\n return\n }\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Request constructor' })\n\n input = webidl.converters.RequestInfo(input)\n init = webidl.converters.RequestInit(init)\n\n // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object\n this[kRealm] = {\n settingsObject: {\n baseUrl: getGlobalOrigin(),\n get origin () {\n return this.baseUrl?.origin\n },\n policyContainer: makePolicyContainer()\n }\n }\n\n // 1. Let request be null.\n let request = null\n\n // 2. Let fallbackMode be null.\n let fallbackMode = null\n\n // 3. Let baseURL be this’s relevant settings object’s API base URL.\n const baseUrl = this[kRealm].settingsObject.baseUrl\n\n // 4. Let signal be null.\n let signal = null\n\n // 5. If input is a string, then:\n if (typeof input === 'string') {\n // 1. Let parsedURL be the result of parsing input with baseURL.\n // 2. If parsedURL is failure, then throw a TypeError.\n let parsedURL\n try {\n parsedURL = new URL(input, baseUrl)\n } catch (err) {\n throw new TypeError('Failed to parse URL from ' + input, { cause: err })\n }\n\n // 3. If parsedURL includes credentials, then throw a TypeError.\n if (parsedURL.username || parsedURL.password) {\n throw new TypeError(\n 'Request cannot be constructed from a URL that includes credentials: ' +\n input\n )\n }\n\n // 4. Set request to a new request whose URL is parsedURL.\n request = makeRequest({ urlList: [parsedURL] })\n\n // 5. Set fallbackMode to \"cors\".\n fallbackMode = 'cors'\n } else {\n // 6. Otherwise:\n\n // 7. Assert: input is a Request object.\n assert(input instanceof Request)\n\n // 8. Set request to input’s request.\n request = input[kState]\n\n // 9. Set signal to input’s signal.\n signal = input[kSignal]\n }\n\n // 7. Let origin be this’s relevant settings object’s origin.\n const origin = this[kRealm].settingsObject.origin\n\n // 8. Let window be \"client\".\n let window = 'client'\n\n // 9. If request’s window is an environment settings object and its origin\n // is same origin with origin, then set window to request’s window.\n if (\n request.window?.constructor?.name === 'EnvironmentSettingsObject' &&\n sameOrigin(request.window, origin)\n ) {\n window = request.window\n }\n\n // 10. If init[\"window\"] exists and is non-null, then throw a TypeError.\n if (init.window != null) {\n throw new TypeError(`'window' option '${window}' must be null`)\n }\n\n // 11. If init[\"window\"] exists, then set window to \"no-window\".\n if ('window' in init) {\n window = 'no-window'\n }\n\n // 12. Set request to a new request with the following properties:\n request = makeRequest({\n // URL request’s URL.\n // undici implementation note: this is set as the first item in request's urlList in makeRequest\n // method request’s method.\n method: request.method,\n // header list A copy of request’s header list.\n // undici implementation note: headersList is cloned in makeRequest\n headersList: request.headersList,\n // unsafe-request flag Set.\n unsafeRequest: request.unsafeRequest,\n // client This’s relevant settings object.\n client: this[kRealm].settingsObject,\n // window window.\n window,\n // priority request’s priority.\n priority: request.priority,\n // origin request’s origin. The propagation of the origin is only significant for navigation requests\n // being handled by a service worker. In this scenario a request can have an origin that is different\n // from the current client.\n origin: request.origin,\n // referrer request’s referrer.\n referrer: request.referrer,\n // referrer policy request’s referrer policy.\n referrerPolicy: request.referrerPolicy,\n // mode request’s mode.\n mode: request.mode,\n // credentials mode request’s credentials mode.\n credentials: request.credentials,\n // cache mode request’s cache mode.\n cache: request.cache,\n // redirect mode request’s redirect mode.\n redirect: request.redirect,\n // integrity metadata request’s integrity metadata.\n integrity: request.integrity,\n // keepalive request’s keepalive.\n keepalive: request.keepalive,\n // reload-navigation flag request’s reload-navigation flag.\n reloadNavigation: request.reloadNavigation,\n // history-navigation flag request’s history-navigation flag.\n historyNavigation: request.historyNavigation,\n // URL list A clone of request’s URL list.\n urlList: [...request.urlList]\n })\n\n // 13. If init is not empty, then:\n if (Object.keys(init).length > 0) {\n // 1. If request’s mode is \"navigate\", then set it to \"same-origin\".\n if (request.mode === 'navigate') {\n request.mode = 'same-origin'\n }\n\n // 2. Unset request’s reload-navigation flag.\n request.reloadNavigation = false\n\n // 3. Unset request’s history-navigation flag.\n request.historyNavigation = false\n\n // 4. Set request’s origin to \"client\".\n request.origin = 'client'\n\n // 5. Set request’s referrer to \"client\"\n request.referrer = 'client'\n\n // 6. Set request’s referrer policy to the empty string.\n request.referrerPolicy = ''\n\n // 7. Set request’s URL to request’s current URL.\n request.url = request.urlList[request.urlList.length - 1]\n\n // 8. Set request’s URL list to « request’s URL ».\n request.urlList = [request.url]\n }\n\n // 14. If init[\"referrer\"] exists, then:\n if (init.referrer !== undefined) {\n // 1. Let referrer be init[\"referrer\"].\n const referrer = init.referrer\n\n // 2. If referrer is the empty string, then set request’s referrer to \"no-referrer\".\n if (referrer === '') {\n request.referrer = 'no-referrer'\n } else {\n // 1. Let parsedReferrer be the result of parsing referrer with\n // baseURL.\n // 2. If parsedReferrer is failure, then throw a TypeError.\n let parsedReferrer\n try {\n parsedReferrer = new URL(referrer, baseUrl)\n } catch (err) {\n throw new TypeError(`Referrer \"${referrer}\" is not a valid URL.`, { cause: err })\n }\n\n // 3. If one of the following is true\n // - parsedReferrer’s scheme is \"about\" and path is the string \"client\"\n // - parsedReferrer’s origin is not same origin with origin\n // then set request’s referrer to \"client\".\n if (\n (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') ||\n (origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl))\n ) {\n request.referrer = 'client'\n } else {\n // 4. Otherwise, set request’s referrer to parsedReferrer.\n request.referrer = parsedReferrer\n }\n }\n }\n\n // 15. If init[\"referrerPolicy\"] exists, then set request’s referrer policy\n // to it.\n if (init.referrerPolicy !== undefined) {\n request.referrerPolicy = init.referrerPolicy\n }\n\n // 16. Let mode be init[\"mode\"] if it exists, and fallbackMode otherwise.\n let mode\n if (init.mode !== undefined) {\n mode = init.mode\n } else {\n mode = fallbackMode\n }\n\n // 17. If mode is \"navigate\", then throw a TypeError.\n if (mode === 'navigate') {\n throw webidl.errors.exception({\n header: 'Request constructor',\n message: 'invalid request mode navigate.'\n })\n }\n\n // 18. If mode is non-null, set request’s mode to mode.\n if (mode != null) {\n request.mode = mode\n }\n\n // 19. If init[\"credentials\"] exists, then set request’s credentials mode\n // to it.\n if (init.credentials !== undefined) {\n request.credentials = init.credentials\n }\n\n // 18. If init[\"cache\"] exists, then set request’s cache mode to it.\n if (init.cache !== undefined) {\n request.cache = init.cache\n }\n\n // 21. If request’s cache mode is \"only-if-cached\" and request’s mode is\n // not \"same-origin\", then throw a TypeError.\n if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {\n throw new TypeError(\n \"'only-if-cached' can be set only with 'same-origin' mode\"\n )\n }\n\n // 22. If init[\"redirect\"] exists, then set request’s redirect mode to it.\n if (init.redirect !== undefined) {\n request.redirect = init.redirect\n }\n\n // 23. If init[\"integrity\"] exists, then set request’s integrity metadata to it.\n if (init.integrity !== undefined && init.integrity != null) {\n request.integrity = String(init.integrity)\n }\n\n // 24. If init[\"keepalive\"] exists, then set request’s keepalive to it.\n if (init.keepalive !== undefined) {\n request.keepalive = Boolean(init.keepalive)\n }\n\n // 25. If init[\"method\"] exists, then:\n if (init.method !== undefined) {\n // 1. Let method be init[\"method\"].\n let method = init.method\n\n // 2. If method is not a method or method is a forbidden method, then\n // throw a TypeError.\n if (!isValidHTTPToken(init.method)) {\n throw TypeError(`'${init.method}' is not a valid HTTP method.`)\n }\n\n if (forbiddenMethods.indexOf(method.toUpperCase()) !== -1) {\n throw TypeError(`'${init.method}' HTTP method is unsupported.`)\n }\n\n // 3. Normalize method.\n method = normalizeMethod(init.method)\n\n // 4. Set request’s method to method.\n request.method = method\n }\n\n // 26. If init[\"signal\"] exists, then set signal to it.\n if (init.signal !== undefined) {\n signal = init.signal\n }\n\n // 27. Set this’s request to request.\n this[kState] = request\n\n // 28. Set this’s signal to a new AbortSignal object with this’s relevant\n // Realm.\n // TODO: could this be simplified with AbortSignal.any\n // (https://dom.spec.whatwg.org/#dom-abortsignal-any)\n const ac = new AbortController()\n this[kSignal] = ac.signal\n this[kSignal][kRealm] = this[kRealm]\n\n // 29. If signal is not null, then make this’s signal follow signal.\n if (signal != null) {\n if (\n !signal ||\n typeof signal.aborted !== 'boolean' ||\n typeof signal.addEventListener !== 'function'\n ) {\n throw new TypeError(\n \"Failed to construct 'Request': member signal is not of type AbortSignal.\"\n )\n }\n\n if (signal.aborted) {\n ac.abort(signal.reason)\n } else {\n // Keep a strong ref to ac while request object\n // is alive. This is needed to prevent AbortController\n // from being prematurely garbage collected.\n // See, https://github.com/nodejs/undici/issues/1926.\n this[kAbortController] = ac\n\n const acRef = new WeakRef(ac)\n const abort = function () {\n const ac = acRef.deref()\n if (ac !== undefined) {\n ac.abort(this.reason)\n }\n }\n\n // Third-party AbortControllers may not work with these.\n // See, https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619.\n try {\n // If the max amount of listeners is equal to the default, increase it\n // This is only available in node >= v19.9.0\n if (typeof getMaxListeners === 'function' && getMaxListeners(signal) === defaultMaxListeners) {\n setMaxListeners(100, signal)\n } else if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) {\n setMaxListeners(100, signal)\n }\n } catch {}\n\n util.addAbortListener(signal, abort)\n requestFinalizer.register(ac, { signal, abort })\n }\n }\n\n // 30. Set this’s headers to a new Headers object with this’s relevant\n // Realm, whose header list is request’s header list and guard is\n // \"request\".\n this[kHeaders] = new Headers()\n this[kHeaders][kHeadersList] = request.headersList\n this[kHeaders][kGuard] = 'request'\n this[kHeaders][kRealm] = this[kRealm]\n\n // 31. If this’s request’s mode is \"no-cors\", then:\n if (mode === 'no-cors') {\n // 1. If this’s request’s method is not a CORS-safelisted method,\n // then throw a TypeError.\n if (!corsSafeListedMethods.includes(request.method)) {\n throw new TypeError(\n `'${request.method} is unsupported in no-cors mode.`\n )\n }\n\n // 2. Set this’s headers’s guard to \"request-no-cors\".\n this[kHeaders][kGuard] = 'request-no-cors'\n }\n\n // 32. If init is not empty, then:\n if (Object.keys(init).length !== 0) {\n // 1. Let headers be a copy of this’s headers and its associated header\n // list.\n let headers = new Headers(this[kHeaders])\n\n // 2. If init[\"headers\"] exists, then set headers to init[\"headers\"].\n if (init.headers !== undefined) {\n headers = init.headers\n }\n\n // 3. Empty this’s headers’s header list.\n this[kHeaders][kHeadersList].clear()\n\n // 4. If headers is a Headers object, then for each header in its header\n // list, append header’s name/header’s value to this’s headers.\n if (headers.constructor.name === 'Headers') {\n for (const [key, val] of headers) {\n this[kHeaders].append(key, val)\n }\n } else {\n // 5. Otherwise, fill this’s headers with headers.\n fillHeaders(this[kHeaders], headers)\n }\n }\n\n // 33. Let inputBody be input’s request’s body if input is a Request\n // object; otherwise null.\n const inputBody = input instanceof Request ? input[kState].body : null\n\n // 34. If either init[\"body\"] exists and is non-null or inputBody is\n // non-null, and request’s method is `GET` or `HEAD`, then throw a\n // TypeError.\n if (\n (init.body != null || inputBody != null) &&\n (request.method === 'GET' || request.method === 'HEAD')\n ) {\n throw new TypeError('Request with GET/HEAD method cannot have body.')\n }\n\n // 35. Let initBody be null.\n let initBody = null\n\n // 36. If init[\"body\"] exists and is non-null, then:\n if (init.body != null) {\n // 1. Let Content-Type be null.\n // 2. Set initBody and Content-Type to the result of extracting\n // init[\"body\"], with keepalive set to request’s keepalive.\n const [extractedBody, contentType] = extractBody(\n init.body,\n request.keepalive\n )\n initBody = extractedBody\n\n // 3, If Content-Type is non-null and this’s headers’s header list does\n // not contain `Content-Type`, then append `Content-Type`/Content-Type to\n // this’s headers.\n if (contentType && !this[kHeaders][kHeadersList].contains('content-type')) {\n this[kHeaders].append('content-type', contentType)\n }\n }\n\n // 37. Let inputOrInitBody be initBody if it is non-null; otherwise\n // inputBody.\n const inputOrInitBody = initBody ?? inputBody\n\n // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is\n // null, then:\n if (inputOrInitBody != null && inputOrInitBody.source == null) {\n // 1. If initBody is non-null and init[\"duplex\"] does not exist,\n // then throw a TypeError.\n if (initBody != null && init.duplex == null) {\n throw new TypeError('RequestInit: duplex option is required when sending a body.')\n }\n\n // 2. If this’s request’s mode is neither \"same-origin\" nor \"cors\",\n // then throw a TypeError.\n if (request.mode !== 'same-origin' && request.mode !== 'cors') {\n throw new TypeError(\n 'If request is made from ReadableStream, mode should be \"same-origin\" or \"cors\"'\n )\n }\n\n // 3. Set this’s request’s use-CORS-preflight flag.\n request.useCORSPreflightFlag = true\n }\n\n // 39. Let finalBody be inputOrInitBody.\n let finalBody = inputOrInitBody\n\n // 40. If initBody is null and inputBody is non-null, then:\n if (initBody == null && inputBody != null) {\n // 1. If input is unusable, then throw a TypeError.\n if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) {\n throw new TypeError(\n 'Cannot construct a Request with a Request object that has already been used.'\n )\n }\n\n // 2. Set finalBody to the result of creating a proxy for inputBody.\n if (!TransformStream) {\n TransformStream = require('stream/web').TransformStream\n }\n\n // https://streams.spec.whatwg.org/#readablestream-create-a-proxy\n const identityTransform = new TransformStream()\n inputBody.stream.pipeThrough(identityTransform)\n finalBody = {\n source: inputBody.source,\n length: inputBody.length,\n stream: identityTransform.readable\n }\n }\n\n // 41. Set this’s request’s body to finalBody.\n this[kState].body = finalBody\n }\n\n // Returns request’s HTTP method, which is \"GET\" by default.\n get method () {\n webidl.brandCheck(this, Request)\n\n // The method getter steps are to return this’s request’s method.\n return this[kState].method\n }\n\n // Returns the URL of request as a string.\n get url () {\n webidl.brandCheck(this, Request)\n\n // The url getter steps are to return this’s request’s URL, serialized.\n return URLSerializer(this[kState].url)\n }\n\n // Returns a Headers object consisting of the headers associated with request.\n // Note that headers added in the network layer by the user agent will not\n // be accounted for in this object, e.g., the \"Host\" header.\n get headers () {\n webidl.brandCheck(this, Request)\n\n // The headers getter steps are to return this’s headers.\n return this[kHeaders]\n }\n\n // Returns the kind of resource requested by request, e.g., \"document\"\n // or \"script\".\n get destination () {\n webidl.brandCheck(this, Request)\n\n // The destination getter are to return this’s request’s destination.\n return this[kState].destination\n }\n\n // Returns the referrer of request. Its value can be a same-origin URL if\n // explicitly set in init, the empty string to indicate no referrer, and\n // \"about:client\" when defaulting to the global’s default. This is used\n // during fetching to determine the value of the `Referer` header of the\n // request being made.\n get referrer () {\n webidl.brandCheck(this, Request)\n\n // 1. If this’s request’s referrer is \"no-referrer\", then return the\n // empty string.\n if (this[kState].referrer === 'no-referrer') {\n return ''\n }\n\n // 2. If this’s request’s referrer is \"client\", then return\n // \"about:client\".\n if (this[kState].referrer === 'client') {\n return 'about:client'\n }\n\n // Return this’s request’s referrer, serialized.\n return this[kState].referrer.toString()\n }\n\n // Returns the referrer policy associated with request.\n // This is used during fetching to compute the value of the request’s\n // referrer.\n get referrerPolicy () {\n webidl.brandCheck(this, Request)\n\n // The referrerPolicy getter steps are to return this’s request’s referrer policy.\n return this[kState].referrerPolicy\n }\n\n // Returns the mode associated with request, which is a string indicating\n // whether the request will use CORS, or will be restricted to same-origin\n // URLs.\n get mode () {\n webidl.brandCheck(this, Request)\n\n // The mode getter steps are to return this’s request’s mode.\n return this[kState].mode\n }\n\n // Returns the credentials mode associated with request,\n // which is a string indicating whether credentials will be sent with the\n // request always, never, or only when sent to a same-origin URL.\n get credentials () {\n // The credentials getter steps are to return this’s request’s credentials mode.\n return this[kState].credentials\n }\n\n // Returns the cache mode associated with request,\n // which is a string indicating how the request will\n // interact with the browser’s cache when fetching.\n get cache () {\n webidl.brandCheck(this, Request)\n\n // The cache getter steps are to return this’s request’s cache mode.\n return this[kState].cache\n }\n\n // Returns the redirect mode associated with request,\n // which is a string indicating how redirects for the\n // request will be handled during fetching. A request\n // will follow redirects by default.\n get redirect () {\n webidl.brandCheck(this, Request)\n\n // The redirect getter steps are to return this’s request’s redirect mode.\n return this[kState].redirect\n }\n\n // Returns request’s subresource integrity metadata, which is a\n // cryptographic hash of the resource being fetched. Its value\n // consists of multiple hashes separated by whitespace. [SRI]\n get integrity () {\n webidl.brandCheck(this, Request)\n\n // The integrity getter steps are to return this’s request’s integrity\n // metadata.\n return this[kState].integrity\n }\n\n // Returns a boolean indicating whether or not request can outlive the\n // global in which it was created.\n get keepalive () {\n webidl.brandCheck(this, Request)\n\n // The keepalive getter steps are to return this’s request’s keepalive.\n return this[kState].keepalive\n }\n\n // Returns a boolean indicating whether or not request is for a reload\n // navigation.\n get isReloadNavigation () {\n webidl.brandCheck(this, Request)\n\n // The isReloadNavigation getter steps are to return true if this’s\n // request’s reload-navigation flag is set; otherwise false.\n return this[kState].reloadNavigation\n }\n\n // Returns a boolean indicating whether or not request is for a history\n // navigation (a.k.a. back-foward navigation).\n get isHistoryNavigation () {\n webidl.brandCheck(this, Request)\n\n // The isHistoryNavigation getter steps are to return true if this’s request’s\n // history-navigation flag is set; otherwise false.\n return this[kState].historyNavigation\n }\n\n // Returns the signal associated with request, which is an AbortSignal\n // object indicating whether or not request has been aborted, and its\n // abort event handler.\n get signal () {\n webidl.brandCheck(this, Request)\n\n // The signal getter steps are to return this’s signal.\n return this[kSignal]\n }\n\n get body () {\n webidl.brandCheck(this, Request)\n\n return this[kState].body ? this[kState].body.stream : null\n }\n\n get bodyUsed () {\n webidl.brandCheck(this, Request)\n\n return !!this[kState].body && util.isDisturbed(this[kState].body.stream)\n }\n\n get duplex () {\n webidl.brandCheck(this, Request)\n\n return 'half'\n }\n\n // Returns a clone of request.\n clone () {\n webidl.brandCheck(this, Request)\n\n // 1. If this is unusable, then throw a TypeError.\n if (this.bodyUsed || this.body?.locked) {\n throw new TypeError('unusable')\n }\n\n // 2. Let clonedRequest be the result of cloning this’s request.\n const clonedRequest = cloneRequest(this[kState])\n\n // 3. Let clonedRequestObject be the result of creating a Request object,\n // given clonedRequest, this’s headers’s guard, and this’s relevant Realm.\n const clonedRequestObject = new Request(kInit)\n clonedRequestObject[kState] = clonedRequest\n clonedRequestObject[kRealm] = this[kRealm]\n clonedRequestObject[kHeaders] = new Headers()\n clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList\n clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]\n clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]\n\n // 4. Make clonedRequestObject’s signal follow this’s signal.\n const ac = new AbortController()\n if (this.signal.aborted) {\n ac.abort(this.signal.reason)\n } else {\n util.addAbortListener(\n this.signal,\n () => {\n ac.abort(this.signal.reason)\n }\n )\n }\n clonedRequestObject[kSignal] = ac.signal\n\n // 4. Return clonedRequestObject.\n return clonedRequestObject\n }\n}\n\nmixinBody(Request)\n\nfunction makeRequest (init) {\n // https://fetch.spec.whatwg.org/#requests\n const request = {\n method: 'GET',\n localURLsOnly: false,\n unsafeRequest: false,\n body: null,\n client: null,\n reservedClient: null,\n replacesClientId: '',\n window: 'client',\n keepalive: false,\n serviceWorkers: 'all',\n initiator: '',\n destination: '',\n priority: null,\n origin: 'client',\n policyContainer: 'client',\n referrer: 'client',\n referrerPolicy: '',\n mode: 'no-cors',\n useCORSPreflightFlag: false,\n credentials: 'same-origin',\n useCredentials: false,\n cache: 'default',\n redirect: 'follow',\n integrity: '',\n cryptoGraphicsNonceMetadata: '',\n parserMetadata: '',\n reloadNavigation: false,\n historyNavigation: false,\n userActivation: false,\n taintedOrigin: false,\n redirectCount: 0,\n responseTainting: 'basic',\n preventNoCacheCacheControlHeaderModification: false,\n done: false,\n timingAllowFailed: false,\n ...init,\n headersList: init.headersList\n ? new HeadersList(init.headersList)\n : new HeadersList()\n }\n request.url = request.urlList[0]\n return request\n}\n\n// https://fetch.spec.whatwg.org/#concept-request-clone\nfunction cloneRequest (request) {\n // To clone a request request, run these steps:\n\n // 1. Let newRequest be a copy of request, except for its body.\n const newRequest = makeRequest({ ...request, body: null })\n\n // 2. If request’s body is non-null, set newRequest’s body to the\n // result of cloning request’s body.\n if (request.body != null) {\n newRequest.body = cloneBody(request.body)\n }\n\n // 3. Return newRequest.\n return newRequest\n}\n\nObject.defineProperties(Request.prototype, {\n method: kEnumerableProperty,\n url: kEnumerableProperty,\n headers: kEnumerableProperty,\n redirect: kEnumerableProperty,\n clone: kEnumerableProperty,\n signal: kEnumerableProperty,\n duplex: kEnumerableProperty,\n destination: kEnumerableProperty,\n body: kEnumerableProperty,\n bodyUsed: kEnumerableProperty,\n isHistoryNavigation: kEnumerableProperty,\n isReloadNavigation: kEnumerableProperty,\n keepalive: kEnumerableProperty,\n integrity: kEnumerableProperty,\n cache: kEnumerableProperty,\n credentials: kEnumerableProperty,\n attribute: kEnumerableProperty,\n referrerPolicy: kEnumerableProperty,\n referrer: kEnumerableProperty,\n mode: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'Request',\n configurable: true\n }\n})\n\nwebidl.converters.Request = webidl.interfaceConverter(\n Request\n)\n\n// https://fetch.spec.whatwg.org/#requestinfo\nwebidl.converters.RequestInfo = function (V) {\n if (typeof V === 'string') {\n return webidl.converters.USVString(V)\n }\n\n if (V instanceof Request) {\n return webidl.converters.Request(V)\n }\n\n return webidl.converters.USVString(V)\n}\n\nwebidl.converters.AbortSignal = webidl.interfaceConverter(\n AbortSignal\n)\n\n// https://fetch.spec.whatwg.org/#requestinit\nwebidl.converters.RequestInit = webidl.dictionaryConverter([\n {\n key: 'method',\n converter: webidl.converters.ByteString\n },\n {\n key: 'headers',\n converter: webidl.converters.HeadersInit\n },\n {\n key: 'body',\n converter: webidl.nullableConverter(\n webidl.converters.BodyInit\n )\n },\n {\n key: 'referrer',\n converter: webidl.converters.USVString\n },\n {\n key: 'referrerPolicy',\n converter: webidl.converters.DOMString,\n // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy\n allowedValues: referrerPolicy\n },\n {\n key: 'mode',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#concept-request-mode\n allowedValues: requestMode\n },\n {\n key: 'credentials',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestcredentials\n allowedValues: requestCredentials\n },\n {\n key: 'cache',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestcache\n allowedValues: requestCache\n },\n {\n key: 'redirect',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestredirect\n allowedValues: requestRedirect\n },\n {\n key: 'integrity',\n converter: webidl.converters.DOMString\n },\n {\n key: 'keepalive',\n converter: webidl.converters.boolean\n },\n {\n key: 'signal',\n converter: webidl.nullableConverter(\n (signal) => webidl.converters.AbortSignal(\n signal,\n { strict: false }\n )\n )\n },\n {\n key: 'window',\n converter: webidl.converters.any\n },\n {\n key: 'duplex',\n converter: webidl.converters.DOMString,\n allowedValues: requestDuplex\n }\n])\n\nmodule.exports = { Request, makeRequest }\n","'use strict'\n\nconst { Headers, HeadersList, fill } = require('./headers')\nconst { extractBody, cloneBody, mixinBody } = require('./body')\nconst util = require('../core/util')\nconst { kEnumerableProperty } = util\nconst {\n isValidReasonPhrase,\n isCancelled,\n isAborted,\n isBlobLike,\n serializeJavascriptValueToJSONString,\n isErrorLike,\n isomorphicEncode\n} = require('./util')\nconst {\n redirectStatus,\n nullBodyStatus,\n DOMException\n} = require('./constants')\nconst { kState, kHeaders, kGuard, kRealm } = require('./symbols')\nconst { webidl } = require('./webidl')\nconst { FormData } = require('./formdata')\nconst { getGlobalOrigin } = require('./global')\nconst { URLSerializer } = require('./dataURL')\nconst { kHeadersList } = require('../core/symbols')\nconst assert = require('assert')\nconst { types } = require('util')\n\nconst ReadableStream = globalThis.ReadableStream || require('stream/web').ReadableStream\n\n// https://fetch.spec.whatwg.org/#response-class\nclass Response {\n // Creates network error Response.\n static error () {\n // TODO\n const relevantRealm = { settingsObject: {} }\n\n // The static error() method steps are to return the result of creating a\n // Response object, given a new network error, \"immutable\", and this’s\n // relevant Realm.\n const responseObject = new Response()\n responseObject[kState] = makeNetworkError()\n responseObject[kRealm] = relevantRealm\n responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList\n responseObject[kHeaders][kGuard] = 'immutable'\n responseObject[kHeaders][kRealm] = relevantRealm\n return responseObject\n }\n\n // https://fetch.spec.whatwg.org/#dom-response-json\n static json (data, init = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'Response.json' })\n\n if (init !== null) {\n init = webidl.converters.ResponseInit(init)\n }\n\n // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data.\n const bytes = new TextEncoder('utf-8').encode(\n serializeJavascriptValueToJSONString(data)\n )\n\n // 2. Let body be the result of extracting bytes.\n const body = extractBody(bytes)\n\n // 3. Let responseObject be the result of creating a Response object, given a new response,\n // \"response\", and this’s relevant Realm.\n const relevantRealm = { settingsObject: {} }\n const responseObject = new Response()\n responseObject[kRealm] = relevantRealm\n responseObject[kHeaders][kGuard] = 'response'\n responseObject[kHeaders][kRealm] = relevantRealm\n\n // 4. Perform initialize a response given responseObject, init, and (body, \"application/json\").\n initializeResponse(responseObject, init, { body: body[0], type: 'application/json' })\n\n // 5. Return responseObject.\n return responseObject\n }\n\n // Creates a redirect Response that redirects to url with status status.\n static redirect (url, status = 302) {\n const relevantRealm = { settingsObject: {} }\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Response.redirect' })\n\n url = webidl.converters.USVString(url)\n status = webidl.converters['unsigned short'](status)\n\n // 1. Let parsedURL be the result of parsing url with current settings\n // object’s API base URL.\n // 2. If parsedURL is failure, then throw a TypeError.\n // TODO: base-URL?\n let parsedURL\n try {\n parsedURL = new URL(url, getGlobalOrigin())\n } catch (err) {\n throw Object.assign(new TypeError('Failed to parse URL from ' + url), {\n cause: err\n })\n }\n\n // 3. If status is not a redirect status, then throw a RangeError.\n if (!redirectStatus.includes(status)) {\n throw new RangeError('Invalid status code ' + status)\n }\n\n // 4. Let responseObject be the result of creating a Response object,\n // given a new response, \"immutable\", and this’s relevant Realm.\n const responseObject = new Response()\n responseObject[kRealm] = relevantRealm\n responseObject[kHeaders][kGuard] = 'immutable'\n responseObject[kHeaders][kRealm] = relevantRealm\n\n // 5. Set responseObject’s response’s status to status.\n responseObject[kState].status = status\n\n // 6. Let value be parsedURL, serialized and isomorphic encoded.\n const value = isomorphicEncode(URLSerializer(parsedURL))\n\n // 7. Append `Location`/value to responseObject’s response’s header list.\n responseObject[kState].headersList.append('location', value)\n\n // 8. Return responseObject.\n return responseObject\n }\n\n // https://fetch.spec.whatwg.org/#dom-response\n constructor (body = null, init = {}) {\n if (body !== null) {\n body = webidl.converters.BodyInit(body)\n }\n\n init = webidl.converters.ResponseInit(init)\n\n // TODO\n this[kRealm] = { settingsObject: {} }\n\n // 1. Set this’s response to a new response.\n this[kState] = makeResponse({})\n\n // 2. Set this’s headers to a new Headers object with this’s relevant\n // Realm, whose header list is this’s response’s header list and guard\n // is \"response\".\n this[kHeaders] = new Headers()\n this[kHeaders][kGuard] = 'response'\n this[kHeaders][kHeadersList] = this[kState].headersList\n this[kHeaders][kRealm] = this[kRealm]\n\n // 3. Let bodyWithType be null.\n let bodyWithType = null\n\n // 4. If body is non-null, then set bodyWithType to the result of extracting body.\n if (body != null) {\n const [extractedBody, type] = extractBody(body)\n bodyWithType = { body: extractedBody, type }\n }\n\n // 5. Perform initialize a response given this, init, and bodyWithType.\n initializeResponse(this, init, bodyWithType)\n }\n\n // Returns response’s type, e.g., \"cors\".\n get type () {\n webidl.brandCheck(this, Response)\n\n // The type getter steps are to return this’s response’s type.\n return this[kState].type\n }\n\n // Returns response’s URL, if it has one; otherwise the empty string.\n get url () {\n webidl.brandCheck(this, Response)\n\n const urlList = this[kState].urlList\n\n // The url getter steps are to return the empty string if this’s\n // response’s URL is null; otherwise this’s response’s URL,\n // serialized with exclude fragment set to true.\n const url = urlList[urlList.length - 1] ?? null\n\n if (url === null) {\n return ''\n }\n\n return URLSerializer(url, true)\n }\n\n // Returns whether response was obtained through a redirect.\n get redirected () {\n webidl.brandCheck(this, Response)\n\n // The redirected getter steps are to return true if this’s response’s URL\n // list has more than one item; otherwise false.\n return this[kState].urlList.length > 1\n }\n\n // Returns response’s status.\n get status () {\n webidl.brandCheck(this, Response)\n\n // The status getter steps are to return this’s response’s status.\n return this[kState].status\n }\n\n // Returns whether response’s status is an ok status.\n get ok () {\n webidl.brandCheck(this, Response)\n\n // The ok getter steps are to return true if this’s response’s status is an\n // ok status; otherwise false.\n return this[kState].status >= 200 && this[kState].status <= 299\n }\n\n // Returns response’s status message.\n get statusText () {\n webidl.brandCheck(this, Response)\n\n // The statusText getter steps are to return this’s response’s status\n // message.\n return this[kState].statusText\n }\n\n // Returns response’s headers as Headers.\n get headers () {\n webidl.brandCheck(this, Response)\n\n // The headers getter steps are to return this’s headers.\n return this[kHeaders]\n }\n\n get body () {\n webidl.brandCheck(this, Response)\n\n return this[kState].body ? this[kState].body.stream : null\n }\n\n get bodyUsed () {\n webidl.brandCheck(this, Response)\n\n return !!this[kState].body && util.isDisturbed(this[kState].body.stream)\n }\n\n // Returns a clone of response.\n clone () {\n webidl.brandCheck(this, Response)\n\n // 1. If this is unusable, then throw a TypeError.\n if (this.bodyUsed || (this.body && this.body.locked)) {\n throw webidl.errors.exception({\n header: 'Response.clone',\n message: 'Body has already been consumed.'\n })\n }\n\n // 2. Let clonedResponse be the result of cloning this’s response.\n const clonedResponse = cloneResponse(this[kState])\n\n // 3. Return the result of creating a Response object, given\n // clonedResponse, this’s headers’s guard, and this’s relevant Realm.\n const clonedResponseObject = new Response()\n clonedResponseObject[kState] = clonedResponse\n clonedResponseObject[kRealm] = this[kRealm]\n clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList\n clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]\n clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]\n\n return clonedResponseObject\n }\n}\n\nmixinBody(Response)\n\nObject.defineProperties(Response.prototype, {\n type: kEnumerableProperty,\n url: kEnumerableProperty,\n status: kEnumerableProperty,\n ok: kEnumerableProperty,\n redirected: kEnumerableProperty,\n statusText: kEnumerableProperty,\n headers: kEnumerableProperty,\n clone: kEnumerableProperty,\n body: kEnumerableProperty,\n bodyUsed: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'Response',\n configurable: true\n }\n})\n\nObject.defineProperties(Response, {\n json: kEnumerableProperty,\n redirect: kEnumerableProperty,\n error: kEnumerableProperty\n})\n\n// https://fetch.spec.whatwg.org/#concept-response-clone\nfunction cloneResponse (response) {\n // To clone a response response, run these steps:\n\n // 1. If response is a filtered response, then return a new identical\n // filtered response whose internal response is a clone of response’s\n // internal response.\n if (response.internalResponse) {\n return filterResponse(\n cloneResponse(response.internalResponse),\n response.type\n )\n }\n\n // 2. Let newResponse be a copy of response, except for its body.\n const newResponse = makeResponse({ ...response, body: null })\n\n // 3. If response’s body is non-null, then set newResponse’s body to the\n // result of cloning response’s body.\n if (response.body != null) {\n newResponse.body = cloneBody(response.body)\n }\n\n // 4. Return newResponse.\n return newResponse\n}\n\nfunction makeResponse (init) {\n return {\n aborted: false,\n rangeRequested: false,\n timingAllowPassed: false,\n requestIncludesCredentials: false,\n type: 'default',\n status: 200,\n timingInfo: null,\n cacheState: '',\n statusText: '',\n ...init,\n headersList: init.headersList\n ? new HeadersList(init.headersList)\n : new HeadersList(),\n urlList: init.urlList ? [...init.urlList] : []\n }\n}\n\nfunction makeNetworkError (reason) {\n const isError = isErrorLike(reason)\n return makeResponse({\n type: 'error',\n status: 0,\n error: isError\n ? reason\n : new Error(reason ? String(reason) : reason),\n aborted: reason && reason.name === 'AbortError'\n })\n}\n\nfunction makeFilteredResponse (response, state) {\n state = {\n internalResponse: response,\n ...state\n }\n\n return new Proxy(response, {\n get (target, p) {\n return p in state ? state[p] : target[p]\n },\n set (target, p, value) {\n assert(!(p in state))\n target[p] = value\n return true\n }\n })\n}\n\n// https://fetch.spec.whatwg.org/#concept-filtered-response\nfunction filterResponse (response, type) {\n // Set response to the following filtered response with response as its\n // internal response, depending on request’s response tainting:\n if (type === 'basic') {\n // A basic filtered response is a filtered response whose type is \"basic\"\n // and header list excludes any headers in internal response’s header list\n // whose name is a forbidden response-header name.\n\n // Note: undici does not implement forbidden response-header names\n return makeFilteredResponse(response, {\n type: 'basic',\n headersList: response.headersList\n })\n } else if (type === 'cors') {\n // A CORS filtered response is a filtered response whose type is \"cors\"\n // and header list excludes any headers in internal response’s header\n // list whose name is not a CORS-safelisted response-header name, given\n // internal response’s CORS-exposed header-name list.\n\n // Note: undici does not implement CORS-safelisted response-header names\n return makeFilteredResponse(response, {\n type: 'cors',\n headersList: response.headersList\n })\n } else if (type === 'opaque') {\n // An opaque filtered response is a filtered response whose type is\n // \"opaque\", URL list is the empty list, status is 0, status message\n // is the empty byte sequence, header list is empty, and body is null.\n\n return makeFilteredResponse(response, {\n type: 'opaque',\n urlList: Object.freeze([]),\n status: 0,\n statusText: '',\n body: null\n })\n } else if (type === 'opaqueredirect') {\n // An opaque-redirect filtered response is a filtered response whose type\n // is \"opaqueredirect\", status is 0, status message is the empty byte\n // sequence, header list is empty, and body is null.\n\n return makeFilteredResponse(response, {\n type: 'opaqueredirect',\n status: 0,\n statusText: '',\n headersList: [],\n body: null\n })\n } else {\n assert(false)\n }\n}\n\n// https://fetch.spec.whatwg.org/#appropriate-network-error\nfunction makeAppropriateNetworkError (fetchParams, err = null) {\n // 1. Assert: fetchParams is canceled.\n assert(isCancelled(fetchParams))\n\n // 2. Return an aborted network error if fetchParams is aborted;\n // otherwise return a network error.\n return isAborted(fetchParams)\n ? makeNetworkError(Object.assign(new DOMException('The operation was aborted.', 'AbortError'), { cause: err }))\n : makeNetworkError(Object.assign(new DOMException('Request was cancelled.'), { cause: err }))\n}\n\n// https://whatpr.org/fetch/1392.html#initialize-a-response\nfunction initializeResponse (response, init, body) {\n // 1. If init[\"status\"] is not in the range 200 to 599, inclusive, then\n // throw a RangeError.\n if (init.status !== null && (init.status < 200 || init.status > 599)) {\n throw new RangeError('init[\"status\"] must be in the range of 200 to 599, inclusive.')\n }\n\n // 2. If init[\"statusText\"] does not match the reason-phrase token production,\n // then throw a TypeError.\n if ('statusText' in init && init.statusText != null) {\n // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2:\n // reason-phrase = *( HTAB / SP / VCHAR / obs-text )\n if (!isValidReasonPhrase(String(init.statusText))) {\n throw new TypeError('Invalid statusText')\n }\n }\n\n // 3. Set response’s response’s status to init[\"status\"].\n if ('status' in init && init.status != null) {\n response[kState].status = init.status\n }\n\n // 4. Set response’s response’s status message to init[\"statusText\"].\n if ('statusText' in init && init.statusText != null) {\n response[kState].statusText = init.statusText\n }\n\n // 5. If init[\"headers\"] exists, then fill response’s headers with init[\"headers\"].\n if ('headers' in init && init.headers != null) {\n fill(response[kHeaders], init.headers)\n }\n\n // 6. If body was given, then:\n if (body) {\n // 1. If response's status is a null body status, then throw a TypeError.\n if (nullBodyStatus.includes(response.status)) {\n throw webidl.errors.exception({\n header: 'Response constructor',\n message: 'Invalid response status code ' + response.status\n })\n }\n\n // 2. Set response's body to body's body.\n response[kState].body = body.body\n\n // 3. If body's type is non-null and response's header list does not contain\n // `Content-Type`, then append (`Content-Type`, body's type) to response's header list.\n if (body.type != null && !response[kState].headersList.contains('Content-Type')) {\n response[kState].headersList.append('content-type', body.type)\n }\n }\n}\n\nwebidl.converters.ReadableStream = webidl.interfaceConverter(\n ReadableStream\n)\n\nwebidl.converters.FormData = webidl.interfaceConverter(\n FormData\n)\n\nwebidl.converters.URLSearchParams = webidl.interfaceConverter(\n URLSearchParams\n)\n\n// https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit\nwebidl.converters.XMLHttpRequestBodyInit = function (V) {\n if (typeof V === 'string') {\n return webidl.converters.USVString(V)\n }\n\n if (isBlobLike(V)) {\n return webidl.converters.Blob(V, { strict: false })\n }\n\n if (\n types.isAnyArrayBuffer(V) ||\n types.isTypedArray(V) ||\n types.isDataView(V)\n ) {\n return webidl.converters.BufferSource(V)\n }\n\n if (util.isFormDataLike(V)) {\n return webidl.converters.FormData(V, { strict: false })\n }\n\n if (V instanceof URLSearchParams) {\n return webidl.converters.URLSearchParams(V)\n }\n\n return webidl.converters.DOMString(V)\n}\n\n// https://fetch.spec.whatwg.org/#bodyinit\nwebidl.converters.BodyInit = function (V) {\n if (V instanceof ReadableStream) {\n return webidl.converters.ReadableStream(V)\n }\n\n // Note: the spec doesn't include async iterables,\n // this is an undici extension.\n if (V?.[Symbol.asyncIterator]) {\n return V\n }\n\n return webidl.converters.XMLHttpRequestBodyInit(V)\n}\n\nwebidl.converters.ResponseInit = webidl.dictionaryConverter([\n {\n key: 'status',\n converter: webidl.converters['unsigned short'],\n defaultValue: 200\n },\n {\n key: 'statusText',\n converter: webidl.converters.ByteString,\n defaultValue: ''\n },\n {\n key: 'headers',\n converter: webidl.converters.HeadersInit\n }\n])\n\nmodule.exports = {\n makeNetworkError,\n makeResponse,\n makeAppropriateNetworkError,\n filterResponse,\n Response,\n cloneResponse\n}\n","'use strict'\n\nmodule.exports = {\n kUrl: Symbol('url'),\n kHeaders: Symbol('headers'),\n kSignal: Symbol('signal'),\n kState: Symbol('state'),\n kGuard: Symbol('guard'),\n kRealm: Symbol('realm')\n}\n","'use strict'\n\nconst { redirectStatus, badPorts, referrerPolicy: referrerPolicyTokens } = require('./constants')\nconst { getGlobalOrigin } = require('./global')\nconst { performance } = require('perf_hooks')\nconst { isBlobLike, toUSVString, ReadableStreamFrom } = require('../core/util')\nconst assert = require('assert')\nconst { isUint8Array } = require('util/types')\n\n// https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable\n/** @type {import('crypto')|undefined} */\nlet crypto\n\ntry {\n crypto = require('crypto')\n} catch {\n\n}\n\nfunction responseURL (response) {\n // https://fetch.spec.whatwg.org/#responses\n // A response has an associated URL. It is a pointer to the last URL\n // in response’s URL list and null if response’s URL list is empty.\n const urlList = response.urlList\n const length = urlList.length\n return length === 0 ? null : urlList[length - 1].toString()\n}\n\n// https://fetch.spec.whatwg.org/#concept-response-location-url\nfunction responseLocationURL (response, requestFragment) {\n // 1. If response’s status is not a redirect status, then return null.\n if (!redirectStatus.includes(response.status)) {\n return null\n }\n\n // 2. Let location be the result of extracting header list values given\n // `Location` and response’s header list.\n let location = response.headersList.get('location')\n\n // 3. If location is a header value, then set location to the result of\n // parsing location with response’s URL.\n if (location !== null && isValidHeaderValue(location)) {\n location = new URL(location, responseURL(response))\n }\n\n // 4. If location is a URL whose fragment is null, then set location’s\n // fragment to requestFragment.\n if (location && !location.hash) {\n location.hash = requestFragment\n }\n\n // 5. Return location.\n return location\n}\n\n/** @returns {URL} */\nfunction requestCurrentURL (request) {\n return request.urlList[request.urlList.length - 1]\n}\n\nfunction requestBadPort (request) {\n // 1. Let url be request’s current URL.\n const url = requestCurrentURL(request)\n\n // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port,\n // then return blocked.\n if (urlIsHttpHttpsScheme(url) && badPorts.includes(url.port)) {\n return 'blocked'\n }\n\n // 3. Return allowed.\n return 'allowed'\n}\n\nfunction isErrorLike (object) {\n return object instanceof Error || (\n object?.constructor?.name === 'Error' ||\n object?.constructor?.name === 'DOMException'\n )\n}\n\n// Check whether |statusText| is a ByteString and\n// matches the Reason-Phrase token production.\n// RFC 2616: https://tools.ietf.org/html/rfc2616\n// RFC 7230: https://tools.ietf.org/html/rfc7230\n// \"reason-phrase = *( HTAB / SP / VCHAR / obs-text )\"\n// https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116\nfunction isValidReasonPhrase (statusText) {\n for (let i = 0; i < statusText.length; ++i) {\n const c = statusText.charCodeAt(i)\n if (\n !(\n (\n c === 0x09 || // HTAB\n (c >= 0x20 && c <= 0x7e) || // SP / VCHAR\n (c >= 0x80 && c <= 0xff)\n ) // obs-text\n )\n ) {\n return false\n }\n }\n return true\n}\n\nfunction isTokenChar (c) {\n return !(\n c >= 0x7f ||\n c <= 0x20 ||\n c === '(' ||\n c === ')' ||\n c === '<' ||\n c === '>' ||\n c === '@' ||\n c === ',' ||\n c === ';' ||\n c === ':' ||\n c === '\\\\' ||\n c === '\"' ||\n c === '/' ||\n c === '[' ||\n c === ']' ||\n c === '?' ||\n c === '=' ||\n c === '{' ||\n c === '}'\n )\n}\n\n// See RFC 7230, Section 3.2.6.\n// https://github.com/chromium/chromium/blob/d7da0240cae77824d1eda25745c4022757499131/third_party/blink/renderer/platform/network/http_parsers.cc#L321\nfunction isValidHTTPToken (characters) {\n if (!characters || typeof characters !== 'string') {\n return false\n }\n for (let i = 0; i < characters.length; ++i) {\n const c = characters.charCodeAt(i)\n if (c > 0x7f || !isTokenChar(c)) {\n return false\n }\n }\n return true\n}\n\n// https://fetch.spec.whatwg.org/#header-name\n// https://github.com/chromium/chromium/blob/b3d37e6f94f87d59e44662d6078f6a12de845d17/net/http/http_util.cc#L342\nfunction isValidHeaderName (potentialValue) {\n if (potentialValue.length === 0) {\n return false\n }\n\n return isValidHTTPToken(potentialValue)\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#header-value\n * @param {string} potentialValue\n */\nfunction isValidHeaderValue (potentialValue) {\n // - Has no leading or trailing HTTP tab or space bytes.\n // - Contains no 0x00 (NUL) or HTTP newline bytes.\n if (\n potentialValue.startsWith('\\t') ||\n potentialValue.startsWith(' ') ||\n potentialValue.endsWith('\\t') ||\n potentialValue.endsWith(' ')\n ) {\n return false\n }\n\n if (\n potentialValue.includes('\\0') ||\n potentialValue.includes('\\r') ||\n potentialValue.includes('\\n')\n ) {\n return false\n }\n\n return true\n}\n\n// https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect\nfunction setRequestReferrerPolicyOnRedirect (request, actualResponse) {\n // Given a request request and a response actualResponse, this algorithm\n // updates request’s referrer policy according to the Referrer-Policy\n // header (if any) in actualResponse.\n\n // 1. Let policy be the result of executing § 8.1 Parse a referrer policy\n // from a Referrer-Policy header on actualResponse.\n\n // 8.1 Parse a referrer policy from a Referrer-Policy header\n // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list.\n const { headersList } = actualResponse\n // 2. Let policy be the empty string.\n // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token.\n // 4. Return policy.\n const policyHeader = (headersList.get('referrer-policy') ?? '').split(',')\n\n // Note: As the referrer-policy can contain multiple policies\n // separated by comma, we need to loop through all of them\n // and pick the first valid one.\n // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy\n let policy = ''\n if (policyHeader.length > 0) {\n // The right-most policy takes precedence.\n // The left-most policy is the fallback.\n for (let i = policyHeader.length; i !== 0; i--) {\n const token = policyHeader[i - 1].trim()\n if (referrerPolicyTokens.includes(token)) {\n policy = token\n break\n }\n }\n }\n\n // 2. If policy is not the empty string, then set request’s referrer policy to policy.\n if (policy !== '') {\n request.referrerPolicy = policy\n }\n}\n\n// https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check\nfunction crossOriginResourcePolicyCheck () {\n // TODO\n return 'allowed'\n}\n\n// https://fetch.spec.whatwg.org/#concept-cors-check\nfunction corsCheck () {\n // TODO\n return 'success'\n}\n\n// https://fetch.spec.whatwg.org/#concept-tao-check\nfunction TAOCheck () {\n // TODO\n return 'success'\n}\n\nfunction appendFetchMetadata (httpRequest) {\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header\n // TODO\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header\n\n // 1. Assert: r’s url is a potentially trustworthy URL.\n // TODO\n\n // 2. Let header be a Structured Header whose value is a token.\n let header = null\n\n // 3. Set header’s value to r’s mode.\n header = httpRequest.mode\n\n // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list.\n httpRequest.headersList.set('sec-fetch-mode', header)\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header\n // TODO\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header\n // TODO\n}\n\n// https://fetch.spec.whatwg.org/#append-a-request-origin-header\nfunction appendRequestOriginHeader (request) {\n // 1. Let serializedOrigin be the result of byte-serializing a request origin with request.\n let serializedOrigin = request.origin\n\n // 2. If request’s response tainting is \"cors\" or request’s mode is \"websocket\", then append (`Origin`, serializedOrigin) to request’s header list.\n if (request.responseTainting === 'cors' || request.mode === 'websocket') {\n if (serializedOrigin) {\n request.headersList.append('origin', serializedOrigin)\n }\n\n // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then:\n } else if (request.method !== 'GET' && request.method !== 'HEAD') {\n // 1. Switch on request’s referrer policy:\n switch (request.referrerPolicy) {\n case 'no-referrer':\n // Set serializedOrigin to `null`.\n serializedOrigin = null\n break\n case 'no-referrer-when-downgrade':\n case 'strict-origin':\n case 'strict-origin-when-cross-origin':\n // If request’s origin is a tuple origin, its scheme is \"https\", and request’s current URL’s scheme is not \"https\", then set serializedOrigin to `null`.\n if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) {\n serializedOrigin = null\n }\n break\n case 'same-origin':\n // If request’s origin is not same origin with request’s current URL’s origin, then set serializedOrigin to `null`.\n if (!sameOrigin(request, requestCurrentURL(request))) {\n serializedOrigin = null\n }\n break\n default:\n // Do nothing.\n }\n\n if (serializedOrigin) {\n // 2. Append (`Origin`, serializedOrigin) to request’s header list.\n request.headersList.append('origin', serializedOrigin)\n }\n }\n}\n\nfunction coarsenedSharedCurrentTime (crossOriginIsolatedCapability) {\n // TODO\n return performance.now()\n}\n\n// https://fetch.spec.whatwg.org/#create-an-opaque-timing-info\nfunction createOpaqueTimingInfo (timingInfo) {\n return {\n startTime: timingInfo.startTime ?? 0,\n redirectStartTime: 0,\n redirectEndTime: 0,\n postRedirectStartTime: timingInfo.startTime ?? 0,\n finalServiceWorkerStartTime: 0,\n finalNetworkResponseStartTime: 0,\n finalNetworkRequestStartTime: 0,\n endTime: 0,\n encodedBodySize: 0,\n decodedBodySize: 0,\n finalConnectionTimingInfo: null\n }\n}\n\n// https://html.spec.whatwg.org/multipage/origin.html#policy-container\nfunction makePolicyContainer () {\n // Note: the fetch spec doesn't make use of embedder policy or CSP list\n return {\n referrerPolicy: 'strict-origin-when-cross-origin'\n }\n}\n\n// https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container\nfunction clonePolicyContainer (policyContainer) {\n return {\n referrerPolicy: policyContainer.referrerPolicy\n }\n}\n\n// https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer\nfunction determineRequestsReferrer (request) {\n // 1. Let policy be request's referrer policy.\n const policy = request.referrerPolicy\n\n // Note: policy cannot (shouldn't) be null or an empty string.\n assert(policy)\n\n // 2. Let environment be request’s client.\n\n let referrerSource = null\n\n // 3. Switch on request’s referrer:\n if (request.referrer === 'client') {\n // Note: node isn't a browser and doesn't implement document/iframes,\n // so we bypass this step and replace it with our own.\n\n const globalOrigin = getGlobalOrigin()\n\n if (!globalOrigin || globalOrigin.origin === 'null') {\n return 'no-referrer'\n }\n\n // note: we need to clone it as it's mutated\n referrerSource = new URL(globalOrigin)\n } else if (request.referrer instanceof URL) {\n // Let referrerSource be request’s referrer.\n referrerSource = request.referrer\n }\n\n // 4. Let request’s referrerURL be the result of stripping referrerSource for\n // use as a referrer.\n let referrerURL = stripURLForReferrer(referrerSource)\n\n // 5. Let referrerOrigin be the result of stripping referrerSource for use as\n // a referrer, with the origin-only flag set to true.\n const referrerOrigin = stripURLForReferrer(referrerSource, true)\n\n // 6. If the result of serializing referrerURL is a string whose length is\n // greater than 4096, set referrerURL to referrerOrigin.\n if (referrerURL.toString().length > 4096) {\n referrerURL = referrerOrigin\n }\n\n const areSameOrigin = sameOrigin(request, referrerURL)\n const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) &&\n !isURLPotentiallyTrustworthy(request.url)\n\n // 8. Execute the switch statements corresponding to the value of policy:\n switch (policy) {\n case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true)\n case 'unsafe-url': return referrerURL\n case 'same-origin':\n return areSameOrigin ? referrerOrigin : 'no-referrer'\n case 'origin-when-cross-origin':\n return areSameOrigin ? referrerURL : referrerOrigin\n case 'strict-origin-when-cross-origin': {\n const currentURL = requestCurrentURL(request)\n\n // 1. If the origin of referrerURL and the origin of request’s current\n // URL are the same, then return referrerURL.\n if (sameOrigin(referrerURL, currentURL)) {\n return referrerURL\n }\n\n // 2. If referrerURL is a potentially trustworthy URL and request’s\n // current URL is not a potentially trustworthy URL, then return no\n // referrer.\n if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {\n return 'no-referrer'\n }\n\n // 3. Return referrerOrigin.\n return referrerOrigin\n }\n case 'strict-origin': // eslint-disable-line\n /**\n * 1. If referrerURL is a potentially trustworthy URL and\n * request’s current URL is not a potentially trustworthy URL,\n * then return no referrer.\n * 2. Return referrerOrigin\n */\n case 'no-referrer-when-downgrade': // eslint-disable-line\n /**\n * 1. If referrerURL is a potentially trustworthy URL and\n * request’s current URL is not a potentially trustworthy URL,\n * then return no referrer.\n * 2. Return referrerOrigin\n */\n\n default: // eslint-disable-line\n return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin\n }\n}\n\n/**\n * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url\n * @param {URL} url\n * @param {boolean|undefined} originOnly\n */\nfunction stripURLForReferrer (url, originOnly) {\n // 1. Assert: url is a URL.\n assert(url instanceof URL)\n\n // 2. If url’s scheme is a local scheme, then return no referrer.\n if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') {\n return 'no-referrer'\n }\n\n // 3. Set url’s username to the empty string.\n url.username = ''\n\n // 4. Set url’s password to the empty string.\n url.password = ''\n\n // 5. Set url’s fragment to null.\n url.hash = ''\n\n // 6. If the origin-only flag is true, then:\n if (originOnly) {\n // 1. Set url’s path to « the empty string ».\n url.pathname = ''\n\n // 2. Set url’s query to null.\n url.search = ''\n }\n\n // 7. Return url.\n return url\n}\n\nfunction isURLPotentiallyTrustworthy (url) {\n if (!(url instanceof URL)) {\n return false\n }\n\n // If child of about, return true\n if (url.href === 'about:blank' || url.href === 'about:srcdoc') {\n return true\n }\n\n // If scheme is data, return true\n if (url.protocol === 'data:') return true\n\n // If file, return true\n if (url.protocol === 'file:') return true\n\n return isOriginPotentiallyTrustworthy(url.origin)\n\n function isOriginPotentiallyTrustworthy (origin) {\n // If origin is explicitly null, return false\n if (origin == null || origin === 'null') return false\n\n const originAsURL = new URL(origin)\n\n // If secure, return true\n if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') {\n return true\n }\n\n // If localhost or variants, return true\n if (/^127(?:\\.[0-9]+){0,2}\\.[0-9]+$|^\\[(?:0*:)*?:?0*1\\]$/.test(originAsURL.hostname) ||\n (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) ||\n (originAsURL.hostname.endsWith('.localhost'))) {\n return true\n }\n\n // If any other, return false\n return false\n }\n}\n\n/**\n * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist\n * @param {Uint8Array} bytes\n * @param {string} metadataList\n */\nfunction bytesMatch (bytes, metadataList) {\n // If node is not built with OpenSSL support, we cannot check\n // a request's integrity, so allow it by default (the spec will\n // allow requests if an invalid hash is given, as precedence).\n /* istanbul ignore if: only if node is built with --without-ssl */\n if (crypto === undefined) {\n return true\n }\n\n // 1. Let parsedMetadata be the result of parsing metadataList.\n const parsedMetadata = parseMetadata(metadataList)\n\n // 2. If parsedMetadata is no metadata, return true.\n if (parsedMetadata === 'no metadata') {\n return true\n }\n\n // 3. If parsedMetadata is the empty set, return true.\n if (parsedMetadata.length === 0) {\n return true\n }\n\n // 4. Let metadata be the result of getting the strongest\n // metadata from parsedMetadata.\n const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo))\n // get the strongest algorithm\n const strongest = list[0].algo\n // get all entries that use the strongest algorithm; ignore weaker\n const metadata = list.filter((item) => item.algo === strongest)\n\n // 5. For each item in metadata:\n for (const item of metadata) {\n // 1. Let algorithm be the alg component of item.\n const algorithm = item.algo\n\n // 2. Let expectedValue be the val component of item.\n let expectedValue = item.hash\n\n // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e\n // \"be liberal with padding\". This is annoying, and it's not even in the spec.\n\n if (expectedValue.endsWith('==')) {\n expectedValue = expectedValue.slice(0, -2)\n }\n\n // 3. Let actualValue be the result of applying algorithm to bytes.\n let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64')\n\n if (actualValue.endsWith('==')) {\n actualValue = actualValue.slice(0, -2)\n }\n\n // 4. If actualValue is a case-sensitive match for expectedValue,\n // return true.\n if (actualValue === expectedValue) {\n return true\n }\n\n let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest('base64url')\n\n if (actualBase64URL.endsWith('==')) {\n actualBase64URL = actualBase64URL.slice(0, -2)\n }\n\n if (actualBase64URL === expectedValue) {\n return true\n }\n }\n\n // 6. Return false.\n return false\n}\n\n// https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options\n// https://www.w3.org/TR/CSP2/#source-list-syntax\n// https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1\nconst parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\\x21-\\x7e]?)?/i\n\n/**\n * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata\n * @param {string} metadata\n */\nfunction parseMetadata (metadata) {\n // 1. Let result be the empty set.\n /** @type {{ algo: string, hash: string }[]} */\n const result = []\n\n // 2. Let empty be equal to true.\n let empty = true\n\n const supportedHashes = crypto.getHashes()\n\n // 3. For each token returned by splitting metadata on spaces:\n for (const token of metadata.split(' ')) {\n // 1. Set empty to false.\n empty = false\n\n // 2. Parse token as a hash-with-options.\n const parsedToken = parseHashWithOptions.exec(token)\n\n // 3. If token does not parse, continue to the next token.\n if (parsedToken === null || parsedToken.groups === undefined) {\n // Note: Chromium blocks the request at this point, but Firefox\n // gives a warning that an invalid integrity was given. The\n // correct behavior is to ignore these, and subsequently not\n // check the integrity of the resource.\n continue\n }\n\n // 4. Let algorithm be the hash-algo component of token.\n const algorithm = parsedToken.groups.algo\n\n // 5. If algorithm is a hash function recognized by the user\n // agent, add the parsed token to result.\n if (supportedHashes.includes(algorithm.toLowerCase())) {\n result.push(parsedToken.groups)\n }\n }\n\n // 4. Return no metadata if empty is true, otherwise return result.\n if (empty === true) {\n return 'no metadata'\n }\n\n return result\n}\n\n// https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request\nfunction tryUpgradeRequestToAPotentiallyTrustworthyURL (request) {\n // TODO\n}\n\n/**\n * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin}\n * @param {URL} A\n * @param {URL} B\n */\nfunction sameOrigin (A, B) {\n // 1. If A and B are the same opaque origin, then return true.\n if (A.origin === B.origin && A.origin === 'null') {\n return true\n }\n\n // 2. If A and B are both tuple origins and their schemes,\n // hosts, and port are identical, then return true.\n if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) {\n return true\n }\n\n // 3. Return false.\n return false\n}\n\nfunction createDeferredPromise () {\n let res\n let rej\n const promise = new Promise((resolve, reject) => {\n res = resolve\n rej = reject\n })\n\n return { promise, resolve: res, reject: rej }\n}\n\nfunction isAborted (fetchParams) {\n return fetchParams.controller.state === 'aborted'\n}\n\nfunction isCancelled (fetchParams) {\n return fetchParams.controller.state === 'aborted' ||\n fetchParams.controller.state === 'terminated'\n}\n\n// https://fetch.spec.whatwg.org/#concept-method-normalize\nfunction normalizeMethod (method) {\n return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method)\n ? method.toUpperCase()\n : method\n}\n\n// https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string\nfunction serializeJavascriptValueToJSONString (value) {\n // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »).\n const result = JSON.stringify(value)\n\n // 2. If result is undefined, then throw a TypeError.\n if (result === undefined) {\n throw new TypeError('Value is not JSON serializable')\n }\n\n // 3. Assert: result is a string.\n assert(typeof result === 'string')\n\n // 4. Return result.\n return result\n}\n\n// https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object\nconst esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))\n\n/**\n * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object\n * @param {() => unknown[]} iterator\n * @param {string} name name of the instance\n * @param {'key'|'value'|'key+value'} kind\n */\nfunction makeIterator (iterator, name, kind) {\n const object = {\n index: 0,\n kind,\n target: iterator\n }\n\n const i = {\n next () {\n // 1. Let interface be the interface for which the iterator prototype object exists.\n\n // 2. Let thisValue be the this value.\n\n // 3. Let object be ? ToObject(thisValue).\n\n // 4. If object is a platform object, then perform a security\n // check, passing:\n\n // 5. If object is not a default iterator object for interface,\n // then throw a TypeError.\n if (Object.getPrototypeOf(this) !== i) {\n throw new TypeError(\n `'next' called on an object that does not implement interface ${name} Iterator.`\n )\n }\n\n // 6. Let index be object’s index.\n // 7. Let kind be object’s kind.\n // 8. Let values be object’s target's value pairs to iterate over.\n const { index, kind, target } = object\n const values = target()\n\n // 9. Let len be the length of values.\n const len = values.length\n\n // 10. If index is greater than or equal to len, then return\n // CreateIterResultObject(undefined, true).\n if (index >= len) {\n return { value: undefined, done: true }\n }\n\n // 11. Let pair be the entry in values at index index.\n const pair = values[index]\n\n // 12. Set object’s index to index + 1.\n object.index = index + 1\n\n // 13. Return the iterator result for pair and kind.\n return iteratorResult(pair, kind)\n },\n // The class string of an iterator prototype object for a given interface is the\n // result of concatenating the identifier of the interface and the string \" Iterator\".\n [Symbol.toStringTag]: `${name} Iterator`\n }\n\n // The [[Prototype]] internal slot of an iterator prototype object must be %IteratorPrototype%.\n Object.setPrototypeOf(i, esIteratorPrototype)\n // esIteratorPrototype needs to be the prototype of i\n // which is the prototype of an empty object. Yes, it's confusing.\n return Object.setPrototypeOf({}, i)\n}\n\n// https://webidl.spec.whatwg.org/#iterator-result\nfunction iteratorResult (pair, kind) {\n let result\n\n // 1. Let result be a value determined by the value of kind:\n switch (kind) {\n case 'key': {\n // 1. Let idlKey be pair’s key.\n // 2. Let key be the result of converting idlKey to an\n // ECMAScript value.\n // 3. result is key.\n result = pair[0]\n break\n }\n case 'value': {\n // 1. Let idlValue be pair’s value.\n // 2. Let value be the result of converting idlValue to\n // an ECMAScript value.\n // 3. result is value.\n result = pair[1]\n break\n }\n case 'key+value': {\n // 1. Let idlKey be pair’s key.\n // 2. Let idlValue be pair’s value.\n // 3. Let key be the result of converting idlKey to an\n // ECMAScript value.\n // 4. Let value be the result of converting idlValue to\n // an ECMAScript value.\n // 5. Let array be ! ArrayCreate(2).\n // 6. Call ! CreateDataProperty(array, \"0\", key).\n // 7. Call ! CreateDataProperty(array, \"1\", value).\n // 8. result is array.\n result = pair\n break\n }\n }\n\n // 2. Return CreateIterResultObject(result, false).\n return { value: result, done: false }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#body-fully-read\n */\nasync function fullyReadBody (body, processBody, processBodyError) {\n // 1. If taskDestination is null, then set taskDestination to\n // the result of starting a new parallel queue.\n\n // 2. Let successSteps given a byte sequence bytes be to queue a\n // fetch task to run processBody given bytes, with taskDestination.\n const successSteps = processBody\n\n // 3. Let errorSteps be to queue a fetch task to run processBodyError,\n // with taskDestination.\n const errorSteps = processBodyError\n\n // 4. Let reader be the result of getting a reader for body’s stream.\n // If that threw an exception, then run errorSteps with that\n // exception and return.\n let reader\n\n try {\n reader = body.stream.getReader()\n } catch (e) {\n errorSteps(e)\n return\n }\n\n // 5. Read all bytes from reader, given successSteps and errorSteps.\n try {\n const result = await readAllBytes(reader)\n successSteps(result)\n } catch (e) {\n errorSteps(e)\n }\n}\n\n/** @type {ReadableStream} */\nlet ReadableStream = globalThis.ReadableStream\n\nfunction isReadableStreamLike (stream) {\n if (!ReadableStream) {\n ReadableStream = require('stream/web').ReadableStream\n }\n\n return stream instanceof ReadableStream || (\n stream[Symbol.toStringTag] === 'ReadableStream' &&\n typeof stream.tee === 'function'\n )\n}\n\nconst MAXIMUM_ARGUMENT_LENGTH = 65535\n\n/**\n * @see https://infra.spec.whatwg.org/#isomorphic-decode\n * @param {number[]|Uint8Array} input\n */\nfunction isomorphicDecode (input) {\n // 1. To isomorphic decode a byte sequence input, return a string whose code point\n // length is equal to input’s length and whose code points have the same values\n // as the values of input’s bytes, in the same order.\n\n if (input.length < MAXIMUM_ARGUMENT_LENGTH) {\n return String.fromCharCode(...input)\n }\n\n return input.reduce((previous, current) => previous + String.fromCharCode(current), '')\n}\n\n/**\n * @param {ReadableStreamController} controller\n */\nfunction readableStreamClose (controller) {\n try {\n controller.close()\n } catch (err) {\n // TODO: add comment explaining why this error occurs.\n if (!err.message.includes('Controller is already closed')) {\n throw err\n }\n }\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#isomorphic-encode\n * @param {string} input\n */\nfunction isomorphicEncode (input) {\n // 1. Assert: input contains no code points greater than U+00FF.\n for (let i = 0; i < input.length; i++) {\n assert(input.charCodeAt(i) <= 0xFF)\n }\n\n // 2. Return a byte sequence whose length is equal to input’s code\n // point length and whose bytes have the same values as the\n // values of input’s code points, in the same order\n return input\n}\n\n/**\n * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes\n * @see https://streams.spec.whatwg.org/#read-loop\n * @param {ReadableStreamDefaultReader} reader\n */\nasync function readAllBytes (reader) {\n const bytes = []\n let byteLength = 0\n\n while (true) {\n const { done, value: chunk } = await reader.read()\n\n if (done) {\n // 1. Call successSteps with bytes.\n return Buffer.concat(bytes, byteLength)\n }\n\n // 1. If chunk is not a Uint8Array object, call failureSteps\n // with a TypeError and abort these steps.\n if (!isUint8Array(chunk)) {\n throw new TypeError('Received non-Uint8Array chunk')\n }\n\n // 2. Append the bytes represented by chunk to bytes.\n bytes.push(chunk)\n byteLength += chunk.length\n\n // 3. Read-loop given reader, bytes, successSteps, and failureSteps.\n }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#is-local\n * @param {URL} url\n */\nfunction urlIsLocal (url) {\n assert('protocol' in url) // ensure it's a url object\n\n const protocol = url.protocol\n\n return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:'\n}\n\n/**\n * @param {string|URL} url\n */\nfunction urlHasHttpsScheme (url) {\n if (typeof url === 'string') {\n return url.startsWith('https:')\n }\n\n return url.protocol === 'https:'\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-scheme\n * @param {URL} url\n */\nfunction urlIsHttpHttpsScheme (url) {\n assert('protocol' in url) // ensure it's a url object\n\n const protocol = url.protocol\n\n return protocol === 'http:' || protocol === 'https:'\n}\n\n/**\n * Fetch supports node >= 16.8.0, but Object.hasOwn was added in v16.9.0.\n */\nconst hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key))\n\nmodule.exports = {\n isAborted,\n isCancelled,\n createDeferredPromise,\n ReadableStreamFrom,\n toUSVString,\n tryUpgradeRequestToAPotentiallyTrustworthyURL,\n coarsenedSharedCurrentTime,\n determineRequestsReferrer,\n makePolicyContainer,\n clonePolicyContainer,\n appendFetchMetadata,\n appendRequestOriginHeader,\n TAOCheck,\n corsCheck,\n crossOriginResourcePolicyCheck,\n createOpaqueTimingInfo,\n setRequestReferrerPolicyOnRedirect,\n isValidHTTPToken,\n requestBadPort,\n requestCurrentURL,\n responseURL,\n responseLocationURL,\n isBlobLike,\n isURLPotentiallyTrustworthy,\n isValidReasonPhrase,\n sameOrigin,\n normalizeMethod,\n serializeJavascriptValueToJSONString,\n makeIterator,\n isValidHeaderName,\n isValidHeaderValue,\n hasOwn,\n isErrorLike,\n fullyReadBody,\n bytesMatch,\n isReadableStreamLike,\n readableStreamClose,\n isomorphicEncode,\n isomorphicDecode,\n urlIsLocal,\n urlHasHttpsScheme,\n urlIsHttpHttpsScheme,\n readAllBytes\n}\n","'use strict'\n\nconst { types } = require('util')\nconst { hasOwn, toUSVString } = require('./util')\n\n/** @type {import('../../types/webidl').Webidl} */\nconst webidl = {}\nwebidl.converters = {}\nwebidl.util = {}\nwebidl.errors = {}\n\nwebidl.errors.exception = function (message) {\n return new TypeError(`${message.header}: ${message.message}`)\n}\n\nwebidl.errors.conversionFailed = function (context) {\n const plural = context.types.length === 1 ? '' : ' one of'\n const message =\n `${context.argument} could not be converted to` +\n `${plural}: ${context.types.join(', ')}.`\n\n return webidl.errors.exception({\n header: context.prefix,\n message\n })\n}\n\nwebidl.errors.invalidArgument = function (context) {\n return webidl.errors.exception({\n header: context.prefix,\n message: `\"${context.value}\" is an invalid ${context.type}.`\n })\n}\n\n// https://webidl.spec.whatwg.org/#implements\nwebidl.brandCheck = function (V, I, opts = undefined) {\n if (opts?.strict !== false && !(V instanceof I)) {\n throw new TypeError('Illegal invocation')\n } else {\n return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag]\n }\n}\n\nwebidl.argumentLengthCheck = function ({ length }, min, ctx) {\n if (length < min) {\n throw webidl.errors.exception({\n message: `${min} argument${min !== 1 ? 's' : ''} required, ` +\n `but${length ? ' only' : ''} ${length} found.`,\n ...ctx\n })\n }\n}\n\nwebidl.illegalConstructor = function () {\n throw webidl.errors.exception({\n header: 'TypeError',\n message: 'Illegal constructor'\n })\n}\n\n// https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values\nwebidl.util.Type = function (V) {\n switch (typeof V) {\n case 'undefined': return 'Undefined'\n case 'boolean': return 'Boolean'\n case 'string': return 'String'\n case 'symbol': return 'Symbol'\n case 'number': return 'Number'\n case 'bigint': return 'BigInt'\n case 'function':\n case 'object': {\n if (V === null) {\n return 'Null'\n }\n\n return 'Object'\n }\n }\n}\n\n// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint\nwebidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) {\n let upperBound\n let lowerBound\n\n // 1. If bitLength is 64, then:\n if (bitLength === 64) {\n // 1. Let upperBound be 2^53 − 1.\n upperBound = Math.pow(2, 53) - 1\n\n // 2. If signedness is \"unsigned\", then let lowerBound be 0.\n if (signedness === 'unsigned') {\n lowerBound = 0\n } else {\n // 3. Otherwise let lowerBound be −2^53 + 1.\n lowerBound = Math.pow(-2, 53) + 1\n }\n } else if (signedness === 'unsigned') {\n // 2. Otherwise, if signedness is \"unsigned\", then:\n\n // 1. Let lowerBound be 0.\n lowerBound = 0\n\n // 2. Let upperBound be 2^bitLength − 1.\n upperBound = Math.pow(2, bitLength) - 1\n } else {\n // 3. Otherwise:\n\n // 1. Let lowerBound be -2^bitLength − 1.\n lowerBound = Math.pow(-2, bitLength) - 1\n\n // 2. Let upperBound be 2^bitLength − 1 − 1.\n upperBound = Math.pow(2, bitLength - 1) - 1\n }\n\n // 4. Let x be ? ToNumber(V).\n let x = Number(V)\n\n // 5. If x is −0, then set x to +0.\n if (x === 0) {\n x = 0\n }\n\n // 6. If the conversion is to an IDL type associated\n // with the [EnforceRange] extended attribute, then:\n if (opts.enforceRange === true) {\n // 1. If x is NaN, +∞, or −∞, then throw a TypeError.\n if (\n Number.isNaN(x) ||\n x === Number.POSITIVE_INFINITY ||\n x === Number.NEGATIVE_INFINITY\n ) {\n throw webidl.errors.exception({\n header: 'Integer conversion',\n message: `Could not convert ${V} to an integer.`\n })\n }\n\n // 2. Set x to IntegerPart(x).\n x = webidl.util.IntegerPart(x)\n\n // 3. If x < lowerBound or x > upperBound, then\n // throw a TypeError.\n if (x < lowerBound || x > upperBound) {\n throw webidl.errors.exception({\n header: 'Integer conversion',\n message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.`\n })\n }\n\n // 4. Return x.\n return x\n }\n\n // 7. If x is not NaN and the conversion is to an IDL\n // type associated with the [Clamp] extended\n // attribute, then:\n if (!Number.isNaN(x) && opts.clamp === true) {\n // 1. Set x to min(max(x, lowerBound), upperBound).\n x = Math.min(Math.max(x, lowerBound), upperBound)\n\n // 2. Round x to the nearest integer, choosing the\n // even integer if it lies halfway between two,\n // and choosing +0 rather than −0.\n if (Math.floor(x) % 2 === 0) {\n x = Math.floor(x)\n } else {\n x = Math.ceil(x)\n }\n\n // 3. Return x.\n return x\n }\n\n // 8. If x is NaN, +0, +∞, or −∞, then return +0.\n if (\n Number.isNaN(x) ||\n (x === 0 && Object.is(0, x)) ||\n x === Number.POSITIVE_INFINITY ||\n x === Number.NEGATIVE_INFINITY\n ) {\n return 0\n }\n\n // 9. Set x to IntegerPart(x).\n x = webidl.util.IntegerPart(x)\n\n // 10. Set x to x modulo 2^bitLength.\n x = x % Math.pow(2, bitLength)\n\n // 11. If signedness is \"signed\" and x ≥ 2^bitLength − 1,\n // then return x − 2^bitLength.\n if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) {\n return x - Math.pow(2, bitLength)\n }\n\n // 12. Otherwise, return x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#abstract-opdef-integerpart\nwebidl.util.IntegerPart = function (n) {\n // 1. Let r be floor(abs(n)).\n const r = Math.floor(Math.abs(n))\n\n // 2. If n < 0, then return -1 × r.\n if (n < 0) {\n return -1 * r\n }\n\n // 3. Otherwise, return r.\n return r\n}\n\n// https://webidl.spec.whatwg.org/#es-sequence\nwebidl.sequenceConverter = function (converter) {\n return (V) => {\n // 1. If Type(V) is not Object, throw a TypeError.\n if (webidl.util.Type(V) !== 'Object') {\n throw webidl.errors.exception({\n header: 'Sequence',\n message: `Value of type ${webidl.util.Type(V)} is not an Object.`\n })\n }\n\n // 2. Let method be ? GetMethod(V, @@iterator).\n /** @type {Generator} */\n const method = V?.[Symbol.iterator]?.()\n const seq = []\n\n // 3. If method is undefined, throw a TypeError.\n if (\n method === undefined ||\n typeof method.next !== 'function'\n ) {\n throw webidl.errors.exception({\n header: 'Sequence',\n message: 'Object is not an iterator.'\n })\n }\n\n // https://webidl.spec.whatwg.org/#create-sequence-from-iterable\n while (true) {\n const { done, value } = method.next()\n\n if (done) {\n break\n }\n\n seq.push(converter(value))\n }\n\n return seq\n }\n}\n\n// https://webidl.spec.whatwg.org/#es-to-record\nwebidl.recordConverter = function (keyConverter, valueConverter) {\n return (O) => {\n // 1. If Type(O) is not Object, throw a TypeError.\n if (webidl.util.Type(O) !== 'Object') {\n throw webidl.errors.exception({\n header: 'Record',\n message: `Value of type ${webidl.util.Type(O)} is not an Object.`\n })\n }\n\n // 2. Let result be a new empty instance of record.\n const result = {}\n\n if (!types.isProxy(O)) {\n // Object.keys only returns enumerable properties\n const keys = Object.keys(O)\n\n for (const key of keys) {\n // 1. Let typedKey be key converted to an IDL value of type K.\n const typedKey = keyConverter(key)\n\n // 2. Let value be ? Get(O, key).\n // 3. Let typedValue be value converted to an IDL value of type V.\n const typedValue = valueConverter(O[key])\n\n // 4. Set result[typedKey] to typedValue.\n result[typedKey] = typedValue\n }\n\n // 5. Return result.\n return result\n }\n\n // 3. Let keys be ? O.[[OwnPropertyKeys]]().\n const keys = Reflect.ownKeys(O)\n\n // 4. For each key of keys.\n for (const key of keys) {\n // 1. Let desc be ? O.[[GetOwnProperty]](key).\n const desc = Reflect.getOwnPropertyDescriptor(O, key)\n\n // 2. If desc is not undefined and desc.[[Enumerable]] is true:\n if (desc?.enumerable) {\n // 1. Let typedKey be key converted to an IDL value of type K.\n const typedKey = keyConverter(key)\n\n // 2. Let value be ? Get(O, key).\n // 3. Let typedValue be value converted to an IDL value of type V.\n const typedValue = valueConverter(O[key])\n\n // 4. Set result[typedKey] to typedValue.\n result[typedKey] = typedValue\n }\n }\n\n // 5. Return result.\n return result\n }\n}\n\nwebidl.interfaceConverter = function (i) {\n return (V, opts = {}) => {\n if (opts.strict !== false && !(V instanceof i)) {\n throw webidl.errors.exception({\n header: i.name,\n message: `Expected ${V} to be an instance of ${i.name}.`\n })\n }\n\n return V\n }\n}\n\nwebidl.dictionaryConverter = function (converters) {\n return (dictionary) => {\n const type = webidl.util.Type(dictionary)\n const dict = {}\n\n if (type === 'Null' || type === 'Undefined') {\n return dict\n } else if (type !== 'Object') {\n throw webidl.errors.exception({\n header: 'Dictionary',\n message: `Expected ${dictionary} to be one of: Null, Undefined, Object.`\n })\n }\n\n for (const options of converters) {\n const { key, defaultValue, required, converter } = options\n\n if (required === true) {\n if (!hasOwn(dictionary, key)) {\n throw webidl.errors.exception({\n header: 'Dictionary',\n message: `Missing required key \"${key}\".`\n })\n }\n }\n\n let value = dictionary[key]\n const hasDefault = hasOwn(options, 'defaultValue')\n\n // Only use defaultValue if value is undefined and\n // a defaultValue options was provided.\n if (hasDefault && value !== null) {\n value = value ?? defaultValue\n }\n\n // A key can be optional and have no default value.\n // When this happens, do not perform a conversion,\n // and do not assign the key a value.\n if (required || hasDefault || value !== undefined) {\n value = converter(value)\n\n if (\n options.allowedValues &&\n !options.allowedValues.includes(value)\n ) {\n throw webidl.errors.exception({\n header: 'Dictionary',\n message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.`\n })\n }\n\n dict[key] = value\n }\n }\n\n return dict\n }\n}\n\nwebidl.nullableConverter = function (converter) {\n return (V) => {\n if (V === null) {\n return V\n }\n\n return converter(V)\n }\n}\n\n// https://webidl.spec.whatwg.org/#es-DOMString\nwebidl.converters.DOMString = function (V, opts = {}) {\n // 1. If V is null and the conversion is to an IDL type\n // associated with the [LegacyNullToEmptyString]\n // extended attribute, then return the DOMString value\n // that represents the empty string.\n if (V === null && opts.legacyNullToEmptyString) {\n return ''\n }\n\n // 2. Let x be ? ToString(V).\n if (typeof V === 'symbol') {\n throw new TypeError('Could not convert argument of type symbol to string.')\n }\n\n // 3. Return the IDL DOMString value that represents the\n // same sequence of code units as the one the\n // ECMAScript String value x represents.\n return String(V)\n}\n\n// https://webidl.spec.whatwg.org/#es-ByteString\nwebidl.converters.ByteString = function (V) {\n // 1. Let x be ? ToString(V).\n // Note: DOMString converter perform ? ToString(V)\n const x = webidl.converters.DOMString(V)\n\n // 2. If the value of any element of x is greater than\n // 255, then throw a TypeError.\n for (let index = 0; index < x.length; index++) {\n const charCode = x.charCodeAt(index)\n\n if (charCode > 255) {\n throw new TypeError(\n 'Cannot convert argument to a ByteString because the character at ' +\n `index ${index} has a value of ${charCode} which is greater than 255.`\n )\n }\n }\n\n // 3. Return an IDL ByteString value whose length is the\n // length of x, and where the value of each element is\n // the value of the corresponding element of x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-USVString\nwebidl.converters.USVString = toUSVString\n\n// https://webidl.spec.whatwg.org/#es-boolean\nwebidl.converters.boolean = function (V) {\n // 1. Let x be the result of computing ToBoolean(V).\n const x = Boolean(V)\n\n // 2. Return the IDL boolean value that is the one that represents\n // the same truth value as the ECMAScript Boolean value x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-any\nwebidl.converters.any = function (V) {\n return V\n}\n\n// https://webidl.spec.whatwg.org/#es-long-long\nwebidl.converters['long long'] = function (V) {\n // 1. Let x be ? ConvertToInt(V, 64, \"signed\").\n const x = webidl.util.ConvertToInt(V, 64, 'signed')\n\n // 2. Return the IDL long long value that represents\n // the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-long-long\nwebidl.converters['unsigned long long'] = function (V) {\n // 1. Let x be ? ConvertToInt(V, 64, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 64, 'unsigned')\n\n // 2. Return the IDL unsigned long long value that\n // represents the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-long\nwebidl.converters['unsigned long'] = function (V) {\n // 1. Let x be ? ConvertToInt(V, 32, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 32, 'unsigned')\n\n // 2. Return the IDL unsigned long value that\n // represents the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-short\nwebidl.converters['unsigned short'] = function (V, opts) {\n // 1. Let x be ? ConvertToInt(V, 16, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts)\n\n // 2. Return the IDL unsigned short value that represents\n // the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#idl-ArrayBuffer\nwebidl.converters.ArrayBuffer = function (V, opts = {}) {\n // 1. If Type(V) is not Object, or V does not have an\n // [[ArrayBufferData]] internal slot, then throw a\n // TypeError.\n // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances\n // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances\n if (\n webidl.util.Type(V) !== 'Object' ||\n !types.isAnyArrayBuffer(V)\n ) {\n throw webidl.errors.conversionFailed({\n prefix: `${V}`,\n argument: `${V}`,\n types: ['ArrayBuffer']\n })\n }\n\n // 2. If the conversion is not to an IDL type associated\n // with the [AllowShared] extended attribute, and\n // IsSharedArrayBuffer(V) is true, then throw a\n // TypeError.\n if (opts.allowShared === false && types.isSharedArrayBuffer(V)) {\n throw webidl.errors.exception({\n header: 'ArrayBuffer',\n message: 'SharedArrayBuffer is not allowed.'\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V) is true, then throw a\n // TypeError.\n // Note: resizable ArrayBuffers are currently a proposal.\n\n // 4. Return the IDL ArrayBuffer value that is a\n // reference to the same object as V.\n return V\n}\n\nwebidl.converters.TypedArray = function (V, T, opts = {}) {\n // 1. Let T be the IDL type V is being converted to.\n\n // 2. If Type(V) is not Object, or V does not have a\n // [[TypedArrayName]] internal slot with a value\n // equal to T’s name, then throw a TypeError.\n if (\n webidl.util.Type(V) !== 'Object' ||\n !types.isTypedArray(V) ||\n V.constructor.name !== T.name\n ) {\n throw webidl.errors.conversionFailed({\n prefix: `${T.name}`,\n argument: `${V}`,\n types: [T.name]\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowShared] extended attribute, and\n // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: 'ArrayBuffer',\n message: 'SharedArrayBuffer is not allowed.'\n })\n }\n\n // 4. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n // Note: resizable array buffers are currently a proposal\n\n // 5. Return the IDL value of type T that is a reference\n // to the same object as V.\n return V\n}\n\nwebidl.converters.DataView = function (V, opts = {}) {\n // 1. If Type(V) is not Object, or V does not have a\n // [[DataView]] internal slot, then throw a TypeError.\n if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) {\n throw webidl.errors.exception({\n header: 'DataView',\n message: 'Object is not a DataView.'\n })\n }\n\n // 2. If the conversion is not to an IDL type associated\n // with the [AllowShared] extended attribute, and\n // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true,\n // then throw a TypeError.\n if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: 'ArrayBuffer',\n message: 'SharedArrayBuffer is not allowed.'\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n // Note: resizable ArrayBuffers are currently a proposal\n\n // 4. Return the IDL DataView value that is a reference\n // to the same object as V.\n return V\n}\n\n// https://webidl.spec.whatwg.org/#BufferSource\nwebidl.converters.BufferSource = function (V, opts = {}) {\n if (types.isAnyArrayBuffer(V)) {\n return webidl.converters.ArrayBuffer(V, opts)\n }\n\n if (types.isTypedArray(V)) {\n return webidl.converters.TypedArray(V, V.constructor)\n }\n\n if (types.isDataView(V)) {\n return webidl.converters.DataView(V, opts)\n }\n\n throw new TypeError(`Could not convert ${V} to a BufferSource.`)\n}\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.ByteString\n)\n\nwebidl.converters['sequence>'] = webidl.sequenceConverter(\n webidl.converters['sequence']\n)\n\nwebidl.converters['record'] = webidl.recordConverter(\n webidl.converters.ByteString,\n webidl.converters.ByteString\n)\n\nmodule.exports = {\n webidl\n}\n","'use strict'\n\n/**\n * @see https://encoding.spec.whatwg.org/#concept-encoding-get\n * @param {string|undefined} label\n */\nfunction getEncoding (label) {\n if (!label) {\n return 'failure'\n }\n\n // 1. Remove any leading and trailing ASCII whitespace from label.\n // 2. If label is an ASCII case-insensitive match for any of the\n // labels listed in the table below, then return the\n // corresponding encoding; otherwise return failure.\n switch (label.trim().toLowerCase()) {\n case 'unicode-1-1-utf-8':\n case 'unicode11utf8':\n case 'unicode20utf8':\n case 'utf-8':\n case 'utf8':\n case 'x-unicode20utf8':\n return 'UTF-8'\n case '866':\n case 'cp866':\n case 'csibm866':\n case 'ibm866':\n return 'IBM866'\n case 'csisolatin2':\n case 'iso-8859-2':\n case 'iso-ir-101':\n case 'iso8859-2':\n case 'iso88592':\n case 'iso_8859-2':\n case 'iso_8859-2:1987':\n case 'l2':\n case 'latin2':\n return 'ISO-8859-2'\n case 'csisolatin3':\n case 'iso-8859-3':\n case 'iso-ir-109':\n case 'iso8859-3':\n case 'iso88593':\n case 'iso_8859-3':\n case 'iso_8859-3:1988':\n case 'l3':\n case 'latin3':\n return 'ISO-8859-3'\n case 'csisolatin4':\n case 'iso-8859-4':\n case 'iso-ir-110':\n case 'iso8859-4':\n case 'iso88594':\n case 'iso_8859-4':\n case 'iso_8859-4:1988':\n case 'l4':\n case 'latin4':\n return 'ISO-8859-4'\n case 'csisolatincyrillic':\n case 'cyrillic':\n case 'iso-8859-5':\n case 'iso-ir-144':\n case 'iso8859-5':\n case 'iso88595':\n case 'iso_8859-5':\n case 'iso_8859-5:1988':\n return 'ISO-8859-5'\n case 'arabic':\n case 'asmo-708':\n case 'csiso88596e':\n case 'csiso88596i':\n case 'csisolatinarabic':\n case 'ecma-114':\n case 'iso-8859-6':\n case 'iso-8859-6-e':\n case 'iso-8859-6-i':\n case 'iso-ir-127':\n case 'iso8859-6':\n case 'iso88596':\n case 'iso_8859-6':\n case 'iso_8859-6:1987':\n return 'ISO-8859-6'\n case 'csisolatingreek':\n case 'ecma-118':\n case 'elot_928':\n case 'greek':\n case 'greek8':\n case 'iso-8859-7':\n case 'iso-ir-126':\n case 'iso8859-7':\n case 'iso88597':\n case 'iso_8859-7':\n case 'iso_8859-7:1987':\n case 'sun_eu_greek':\n return 'ISO-8859-7'\n case 'csiso88598e':\n case 'csisolatinhebrew':\n case 'hebrew':\n case 'iso-8859-8':\n case 'iso-8859-8-e':\n case 'iso-ir-138':\n case 'iso8859-8':\n case 'iso88598':\n case 'iso_8859-8':\n case 'iso_8859-8:1988':\n case 'visual':\n return 'ISO-8859-8'\n case 'csiso88598i':\n case 'iso-8859-8-i':\n case 'logical':\n return 'ISO-8859-8-I'\n case 'csisolatin6':\n case 'iso-8859-10':\n case 'iso-ir-157':\n case 'iso8859-10':\n case 'iso885910':\n case 'l6':\n case 'latin6':\n return 'ISO-8859-10'\n case 'iso-8859-13':\n case 'iso8859-13':\n case 'iso885913':\n return 'ISO-8859-13'\n case 'iso-8859-14':\n case 'iso8859-14':\n case 'iso885914':\n return 'ISO-8859-14'\n case 'csisolatin9':\n case 'iso-8859-15':\n case 'iso8859-15':\n case 'iso885915':\n case 'iso_8859-15':\n case 'l9':\n return 'ISO-8859-15'\n case 'iso-8859-16':\n return 'ISO-8859-16'\n case 'cskoi8r':\n case 'koi':\n case 'koi8':\n case 'koi8-r':\n case 'koi8_r':\n return 'KOI8-R'\n case 'koi8-ru':\n case 'koi8-u':\n return 'KOI8-U'\n case 'csmacintosh':\n case 'mac':\n case 'macintosh':\n case 'x-mac-roman':\n return 'macintosh'\n case 'iso-8859-11':\n case 'iso8859-11':\n case 'iso885911':\n case 'tis-620':\n case 'windows-874':\n return 'windows-874'\n case 'cp1250':\n case 'windows-1250':\n case 'x-cp1250':\n return 'windows-1250'\n case 'cp1251':\n case 'windows-1251':\n case 'x-cp1251':\n return 'windows-1251'\n case 'ansi_x3.4-1968':\n case 'ascii':\n case 'cp1252':\n case 'cp819':\n case 'csisolatin1':\n case 'ibm819':\n case 'iso-8859-1':\n case 'iso-ir-100':\n case 'iso8859-1':\n case 'iso88591':\n case 'iso_8859-1':\n case 'iso_8859-1:1987':\n case 'l1':\n case 'latin1':\n case 'us-ascii':\n case 'windows-1252':\n case 'x-cp1252':\n return 'windows-1252'\n case 'cp1253':\n case 'windows-1253':\n case 'x-cp1253':\n return 'windows-1253'\n case 'cp1254':\n case 'csisolatin5':\n case 'iso-8859-9':\n case 'iso-ir-148':\n case 'iso8859-9':\n case 'iso88599':\n case 'iso_8859-9':\n case 'iso_8859-9:1989':\n case 'l5':\n case 'latin5':\n case 'windows-1254':\n case 'x-cp1254':\n return 'windows-1254'\n case 'cp1255':\n case 'windows-1255':\n case 'x-cp1255':\n return 'windows-1255'\n case 'cp1256':\n case 'windows-1256':\n case 'x-cp1256':\n return 'windows-1256'\n case 'cp1257':\n case 'windows-1257':\n case 'x-cp1257':\n return 'windows-1257'\n case 'cp1258':\n case 'windows-1258':\n case 'x-cp1258':\n return 'windows-1258'\n case 'x-mac-cyrillic':\n case 'x-mac-ukrainian':\n return 'x-mac-cyrillic'\n case 'chinese':\n case 'csgb2312':\n case 'csiso58gb231280':\n case 'gb2312':\n case 'gb_2312':\n case 'gb_2312-80':\n case 'gbk':\n case 'iso-ir-58':\n case 'x-gbk':\n return 'GBK'\n case 'gb18030':\n return 'gb18030'\n case 'big5':\n case 'big5-hkscs':\n case 'cn-big5':\n case 'csbig5':\n case 'x-x-big5':\n return 'Big5'\n case 'cseucpkdfmtjapanese':\n case 'euc-jp':\n case 'x-euc-jp':\n return 'EUC-JP'\n case 'csiso2022jp':\n case 'iso-2022-jp':\n return 'ISO-2022-JP'\n case 'csshiftjis':\n case 'ms932':\n case 'ms_kanji':\n case 'shift-jis':\n case 'shift_jis':\n case 'sjis':\n case 'windows-31j':\n case 'x-sjis':\n return 'Shift_JIS'\n case 'cseuckr':\n case 'csksc56011987':\n case 'euc-kr':\n case 'iso-ir-149':\n case 'korean':\n case 'ks_c_5601-1987':\n case 'ks_c_5601-1989':\n case 'ksc5601':\n case 'ksc_5601':\n case 'windows-949':\n return 'EUC-KR'\n case 'csiso2022kr':\n case 'hz-gb-2312':\n case 'iso-2022-cn':\n case 'iso-2022-cn-ext':\n case 'iso-2022-kr':\n case 'replacement':\n return 'replacement'\n case 'unicodefffe':\n case 'utf-16be':\n return 'UTF-16BE'\n case 'csunicode':\n case 'iso-10646-ucs-2':\n case 'ucs-2':\n case 'unicode':\n case 'unicodefeff':\n case 'utf-16':\n case 'utf-16le':\n return 'UTF-16LE'\n case 'x-user-defined':\n return 'x-user-defined'\n default: return 'failure'\n }\n}\n\nmodule.exports = {\n getEncoding\n}\n","'use strict'\n\nconst {\n staticPropertyDescriptors,\n readOperation,\n fireAProgressEvent\n} = require('./util')\nconst {\n kState,\n kError,\n kResult,\n kEvents,\n kAborted\n} = require('./symbols')\nconst { webidl } = require('../fetch/webidl')\nconst { kEnumerableProperty } = require('../core/util')\n\nclass FileReader extends EventTarget {\n constructor () {\n super()\n\n this[kState] = 'empty'\n this[kResult] = null\n this[kError] = null\n this[kEvents] = {\n loadend: null,\n error: null,\n abort: null,\n load: null,\n progress: null,\n loadstart: null\n }\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer\n * @param {import('buffer').Blob} blob\n */\n readAsArrayBuffer (blob) {\n webidl.brandCheck(this, FileReader)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsArrayBuffer' })\n\n blob = webidl.converters.Blob(blob, { strict: false })\n\n // The readAsArrayBuffer(blob) method, when invoked,\n // must initiate a read operation for blob with ArrayBuffer.\n readOperation(this, blob, 'ArrayBuffer')\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#readAsBinaryString\n * @param {import('buffer').Blob} blob\n */\n readAsBinaryString (blob) {\n webidl.brandCheck(this, FileReader)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsBinaryString' })\n\n blob = webidl.converters.Blob(blob, { strict: false })\n\n // The readAsBinaryString(blob) method, when invoked,\n // must initiate a read operation for blob with BinaryString.\n readOperation(this, blob, 'BinaryString')\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#readAsDataText\n * @param {import('buffer').Blob} blob\n * @param {string?} encoding\n */\n readAsText (blob, encoding = undefined) {\n webidl.brandCheck(this, FileReader)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsText' })\n\n blob = webidl.converters.Blob(blob, { strict: false })\n\n if (encoding !== undefined) {\n encoding = webidl.converters.DOMString(encoding)\n }\n\n // The readAsText(blob, encoding) method, when invoked,\n // must initiate a read operation for blob with Text and encoding.\n readOperation(this, blob, 'Text', encoding)\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL\n * @param {import('buffer').Blob} blob\n */\n readAsDataURL (blob) {\n webidl.brandCheck(this, FileReader)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsDataURL' })\n\n blob = webidl.converters.Blob(blob, { strict: false })\n\n // The readAsDataURL(blob) method, when invoked, must\n // initiate a read operation for blob with DataURL.\n readOperation(this, blob, 'DataURL')\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dfn-abort\n */\n abort () {\n // 1. If this's state is \"empty\" or if this's state is\n // \"done\" set this's result to null and terminate\n // this algorithm.\n if (this[kState] === 'empty' || this[kState] === 'done') {\n this[kResult] = null\n return\n }\n\n // 2. If this's state is \"loading\" set this's state to\n // \"done\" and set this's result to null.\n if (this[kState] === 'loading') {\n this[kState] = 'done'\n this[kResult] = null\n }\n\n // 3. If there are any tasks from this on the file reading\n // task source in an affiliated task queue, then remove\n // those tasks from that task queue.\n this[kAborted] = true\n\n // 4. Terminate the algorithm for the read method being processed.\n // TODO\n\n // 5. Fire a progress event called abort at this.\n fireAProgressEvent('abort', this)\n\n // 6. If this's state is not \"loading\", fire a progress\n // event called loadend at this.\n if (this[kState] !== 'loading') {\n fireAProgressEvent('loadend', this)\n }\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate\n */\n get readyState () {\n webidl.brandCheck(this, FileReader)\n\n switch (this[kState]) {\n case 'empty': return this.EMPTY\n case 'loading': return this.LOADING\n case 'done': return this.DONE\n }\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dom-filereader-result\n */\n get result () {\n webidl.brandCheck(this, FileReader)\n\n // The result attribute’s getter, when invoked, must return\n // this's result.\n return this[kResult]\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dom-filereader-error\n */\n get error () {\n webidl.brandCheck(this, FileReader)\n\n // The error attribute’s getter, when invoked, must return\n // this's error.\n return this[kError]\n }\n\n get onloadend () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].loadend\n }\n\n set onloadend (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].loadend) {\n this.removeEventListener('loadend', this[kEvents].loadend)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].loadend = fn\n this.addEventListener('loadend', fn)\n } else {\n this[kEvents].loadend = null\n }\n }\n\n get onerror () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].error\n }\n\n set onerror (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].error) {\n this.removeEventListener('error', this[kEvents].error)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].error = fn\n this.addEventListener('error', fn)\n } else {\n this[kEvents].error = null\n }\n }\n\n get onloadstart () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].loadstart\n }\n\n set onloadstart (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].loadstart) {\n this.removeEventListener('loadstart', this[kEvents].loadstart)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].loadstart = fn\n this.addEventListener('loadstart', fn)\n } else {\n this[kEvents].loadstart = null\n }\n }\n\n get onprogress () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].progress\n }\n\n set onprogress (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].progress) {\n this.removeEventListener('progress', this[kEvents].progress)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].progress = fn\n this.addEventListener('progress', fn)\n } else {\n this[kEvents].progress = null\n }\n }\n\n get onload () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].load\n }\n\n set onload (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].load) {\n this.removeEventListener('load', this[kEvents].load)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].load = fn\n this.addEventListener('load', fn)\n } else {\n this[kEvents].load = null\n }\n }\n\n get onabort () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].abort\n }\n\n set onabort (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].abort) {\n this.removeEventListener('abort', this[kEvents].abort)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].abort = fn\n this.addEventListener('abort', fn)\n } else {\n this[kEvents].abort = null\n }\n }\n}\n\n// https://w3c.github.io/FileAPI/#dom-filereader-empty\nFileReader.EMPTY = FileReader.prototype.EMPTY = 0\n// https://w3c.github.io/FileAPI/#dom-filereader-loading\nFileReader.LOADING = FileReader.prototype.LOADING = 1\n// https://w3c.github.io/FileAPI/#dom-filereader-done\nFileReader.DONE = FileReader.prototype.DONE = 2\n\nObject.defineProperties(FileReader.prototype, {\n EMPTY: staticPropertyDescriptors,\n LOADING: staticPropertyDescriptors,\n DONE: staticPropertyDescriptors,\n readAsArrayBuffer: kEnumerableProperty,\n readAsBinaryString: kEnumerableProperty,\n readAsText: kEnumerableProperty,\n readAsDataURL: kEnumerableProperty,\n abort: kEnumerableProperty,\n readyState: kEnumerableProperty,\n result: kEnumerableProperty,\n error: kEnumerableProperty,\n onloadstart: kEnumerableProperty,\n onprogress: kEnumerableProperty,\n onload: kEnumerableProperty,\n onabort: kEnumerableProperty,\n onerror: kEnumerableProperty,\n onloadend: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'FileReader',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nObject.defineProperties(FileReader, {\n EMPTY: staticPropertyDescriptors,\n LOADING: staticPropertyDescriptors,\n DONE: staticPropertyDescriptors\n})\n\nmodule.exports = {\n FileReader\n}\n","'use strict'\n\nconst { webidl } = require('../fetch/webidl')\n\nconst kState = Symbol('ProgressEvent state')\n\n/**\n * @see https://xhr.spec.whatwg.org/#progressevent\n */\nclass ProgressEvent extends Event {\n constructor (type, eventInitDict = {}) {\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {})\n\n super(type, eventInitDict)\n\n this[kState] = {\n lengthComputable: eventInitDict.lengthComputable,\n loaded: eventInitDict.loaded,\n total: eventInitDict.total\n }\n }\n\n get lengthComputable () {\n webidl.brandCheck(this, ProgressEvent)\n\n return this[kState].lengthComputable\n }\n\n get loaded () {\n webidl.brandCheck(this, ProgressEvent)\n\n return this[kState].loaded\n }\n\n get total () {\n webidl.brandCheck(this, ProgressEvent)\n\n return this[kState].total\n }\n}\n\nwebidl.converters.ProgressEventInit = webidl.dictionaryConverter([\n {\n key: 'lengthComputable',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'loaded',\n converter: webidl.converters['unsigned long long'],\n defaultValue: 0\n },\n {\n key: 'total',\n converter: webidl.converters['unsigned long long'],\n defaultValue: 0\n },\n {\n key: 'bubbles',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'cancelable',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'composed',\n converter: webidl.converters.boolean,\n defaultValue: false\n }\n])\n\nmodule.exports = {\n ProgressEvent\n}\n","'use strict'\n\nmodule.exports = {\n kState: Symbol('FileReader state'),\n kResult: Symbol('FileReader result'),\n kError: Symbol('FileReader error'),\n kLastProgressEventFired: Symbol('FileReader last progress event fired timestamp'),\n kEvents: Symbol('FileReader events'),\n kAborted: Symbol('FileReader aborted')\n}\n","'use strict'\n\nconst {\n kState,\n kError,\n kResult,\n kAborted,\n kLastProgressEventFired\n} = require('./symbols')\nconst { ProgressEvent } = require('./progressevent')\nconst { getEncoding } = require('./encoding')\nconst { DOMException } = require('../fetch/constants')\nconst { serializeAMimeType, parseMIMEType } = require('../fetch/dataURL')\nconst { types } = require('util')\nconst { StringDecoder } = require('string_decoder')\nconst { btoa } = require('buffer')\n\n/** @type {PropertyDescriptor} */\nconst staticPropertyDescriptors = {\n enumerable: true,\n writable: false,\n configurable: false\n}\n\n/**\n * @see https://w3c.github.io/FileAPI/#readOperation\n * @param {import('./filereader').FileReader} fr\n * @param {import('buffer').Blob} blob\n * @param {string} type\n * @param {string?} encodingName\n */\nfunction readOperation (fr, blob, type, encodingName) {\n // 1. If fr’s state is \"loading\", throw an InvalidStateError\n // DOMException.\n if (fr[kState] === 'loading') {\n throw new DOMException('Invalid state', 'InvalidStateError')\n }\n\n // 2. Set fr’s state to \"loading\".\n fr[kState] = 'loading'\n\n // 3. Set fr’s result to null.\n fr[kResult] = null\n\n // 4. Set fr’s error to null.\n fr[kError] = null\n\n // 5. Let stream be the result of calling get stream on blob.\n /** @type {import('stream/web').ReadableStream} */\n const stream = blob.stream()\n\n // 6. Let reader be the result of getting a reader from stream.\n const reader = stream.getReader()\n\n // 7. Let bytes be an empty byte sequence.\n /** @type {Uint8Array[]} */\n const bytes = []\n\n // 8. Let chunkPromise be the result of reading a chunk from\n // stream with reader.\n let chunkPromise = reader.read()\n\n // 9. Let isFirstChunk be true.\n let isFirstChunk = true\n\n // 10. In parallel, while true:\n // Note: \"In parallel\" just means non-blocking\n // Note 2: readOperation itself cannot be async as double\n // reading the body would then reject the promise, instead\n // of throwing an error.\n ;(async () => {\n while (!fr[kAborted]) {\n // 1. Wait for chunkPromise to be fulfilled or rejected.\n try {\n const { done, value } = await chunkPromise\n\n // 2. If chunkPromise is fulfilled, and isFirstChunk is\n // true, queue a task to fire a progress event called\n // loadstart at fr.\n if (isFirstChunk && !fr[kAborted]) {\n queueMicrotask(() => {\n fireAProgressEvent('loadstart', fr)\n })\n }\n\n // 3. Set isFirstChunk to false.\n isFirstChunk = false\n\n // 4. If chunkPromise is fulfilled with an object whose\n // done property is false and whose value property is\n // a Uint8Array object, run these steps:\n if (!done && types.isUint8Array(value)) {\n // 1. Let bs be the byte sequence represented by the\n // Uint8Array object.\n\n // 2. Append bs to bytes.\n bytes.push(value)\n\n // 3. If roughly 50ms have passed since these steps\n // were last invoked, queue a task to fire a\n // progress event called progress at fr.\n if (\n (\n fr[kLastProgressEventFired] === undefined ||\n Date.now() - fr[kLastProgressEventFired] >= 50\n ) &&\n !fr[kAborted]\n ) {\n fr[kLastProgressEventFired] = Date.now()\n queueMicrotask(() => {\n fireAProgressEvent('progress', fr)\n })\n }\n\n // 4. Set chunkPromise to the result of reading a\n // chunk from stream with reader.\n chunkPromise = reader.read()\n } else if (done) {\n // 5. Otherwise, if chunkPromise is fulfilled with an\n // object whose done property is true, queue a task\n // to run the following steps and abort this algorithm:\n queueMicrotask(() => {\n // 1. Set fr’s state to \"done\".\n fr[kState] = 'done'\n\n // 2. Let result be the result of package data given\n // bytes, type, blob’s type, and encodingName.\n try {\n const result = packageData(bytes, type, blob.type, encodingName)\n\n // 4. Else:\n\n if (fr[kAborted]) {\n return\n }\n\n // 1. Set fr’s result to result.\n fr[kResult] = result\n\n // 2. Fire a progress event called load at the fr.\n fireAProgressEvent('load', fr)\n } catch (error) {\n // 3. If package data threw an exception error:\n\n // 1. Set fr’s error to error.\n fr[kError] = error\n\n // 2. Fire a progress event called error at fr.\n fireAProgressEvent('error', fr)\n }\n\n // 5. If fr’s state is not \"loading\", fire a progress\n // event called loadend at the fr.\n if (fr[kState] !== 'loading') {\n fireAProgressEvent('loadend', fr)\n }\n })\n\n break\n }\n } catch (error) {\n if (fr[kAborted]) {\n return\n }\n\n // 6. Otherwise, if chunkPromise is rejected with an\n // error error, queue a task to run the following\n // steps and abort this algorithm:\n queueMicrotask(() => {\n // 1. Set fr’s state to \"done\".\n fr[kState] = 'done'\n\n // 2. Set fr’s error to error.\n fr[kError] = error\n\n // 3. Fire a progress event called error at fr.\n fireAProgressEvent('error', fr)\n\n // 4. If fr’s state is not \"loading\", fire a progress\n // event called loadend at fr.\n if (fr[kState] !== 'loading') {\n fireAProgressEvent('loadend', fr)\n }\n })\n\n break\n }\n }\n })()\n}\n\n/**\n * @see https://w3c.github.io/FileAPI/#fire-a-progress-event\n * @see https://dom.spec.whatwg.org/#concept-event-fire\n * @param {string} e The name of the event\n * @param {import('./filereader').FileReader} reader\n */\nfunction fireAProgressEvent (e, reader) {\n // The progress event e does not bubble. e.bubbles must be false\n // The progress event e is NOT cancelable. e.cancelable must be false\n const event = new ProgressEvent(e, {\n bubbles: false,\n cancelable: false\n })\n\n reader.dispatchEvent(event)\n}\n\n/**\n * @see https://w3c.github.io/FileAPI/#blob-package-data\n * @param {Uint8Array[]} bytes\n * @param {string} type\n * @param {string?} mimeType\n * @param {string?} encodingName\n */\nfunction packageData (bytes, type, mimeType, encodingName) {\n // 1. A Blob has an associated package data algorithm, given\n // bytes, a type, a optional mimeType, and a optional\n // encodingName, which switches on type and runs the\n // associated steps:\n\n switch (type) {\n case 'DataURL': {\n // 1. Return bytes as a DataURL [RFC2397] subject to\n // the considerations below:\n // * Use mimeType as part of the Data URL if it is\n // available in keeping with the Data URL\n // specification [RFC2397].\n // * If mimeType is not available return a Data URL\n // without a media-type. [RFC2397].\n\n // https://datatracker.ietf.org/doc/html/rfc2397#section-3\n // dataurl := \"data:\" [ mediatype ] [ \";base64\" ] \",\" data\n // mediatype := [ type \"/\" subtype ] *( \";\" parameter )\n // data := *urlchar\n // parameter := attribute \"=\" value\n let dataURL = 'data:'\n\n const parsed = parseMIMEType(mimeType || 'application/octet-stream')\n\n if (parsed !== 'failure') {\n dataURL += serializeAMimeType(parsed)\n }\n\n dataURL += ';base64,'\n\n const decoder = new StringDecoder('latin1')\n\n for (const chunk of bytes) {\n dataURL += btoa(decoder.write(chunk))\n }\n\n dataURL += btoa(decoder.end())\n\n return dataURL\n }\n case 'Text': {\n // 1. Let encoding be failure\n let encoding = 'failure'\n\n // 2. If the encodingName is present, set encoding to the\n // result of getting an encoding from encodingName.\n if (encodingName) {\n encoding = getEncoding(encodingName)\n }\n\n // 3. If encoding is failure, and mimeType is present:\n if (encoding === 'failure' && mimeType) {\n // 1. Let type be the result of parse a MIME type\n // given mimeType.\n const type = parseMIMEType(mimeType)\n\n // 2. If type is not failure, set encoding to the result\n // of getting an encoding from type’s parameters[\"charset\"].\n if (type !== 'failure') {\n encoding = getEncoding(type.parameters.get('charset'))\n }\n }\n\n // 4. If encoding is failure, then set encoding to UTF-8.\n if (encoding === 'failure') {\n encoding = 'UTF-8'\n }\n\n // 5. Decode bytes using fallback encoding encoding, and\n // return the result.\n return decode(bytes, encoding)\n }\n case 'ArrayBuffer': {\n // Return a new ArrayBuffer whose contents are bytes.\n const sequence = combineByteSequences(bytes)\n\n return sequence.buffer\n }\n case 'BinaryString': {\n // Return bytes as a binary string, in which every byte\n // is represented by a code unit of equal value [0..255].\n let binaryString = ''\n\n const decoder = new StringDecoder('latin1')\n\n for (const chunk of bytes) {\n binaryString += decoder.write(chunk)\n }\n\n binaryString += decoder.end()\n\n return binaryString\n }\n }\n}\n\n/**\n * @see https://encoding.spec.whatwg.org/#decode\n * @param {Uint8Array[]} ioQueue\n * @param {string} encoding\n */\nfunction decode (ioQueue, encoding) {\n const bytes = combineByteSequences(ioQueue)\n\n // 1. Let BOMEncoding be the result of BOM sniffing ioQueue.\n const BOMEncoding = BOMSniffing(bytes)\n\n let slice = 0\n\n // 2. If BOMEncoding is non-null:\n if (BOMEncoding !== null) {\n // 1. Set encoding to BOMEncoding.\n encoding = BOMEncoding\n\n // 2. Read three bytes from ioQueue, if BOMEncoding is\n // UTF-8; otherwise read two bytes.\n // (Do nothing with those bytes.)\n slice = BOMEncoding === 'UTF-8' ? 3 : 2\n }\n\n // 3. Process a queue with an instance of encoding’s\n // decoder, ioQueue, output, and \"replacement\".\n\n // 4. Return output.\n\n const sliced = bytes.slice(slice)\n return new TextDecoder(encoding).decode(sliced)\n}\n\n/**\n * @see https://encoding.spec.whatwg.org/#bom-sniff\n * @param {Uint8Array} ioQueue\n */\nfunction BOMSniffing (ioQueue) {\n // 1. Let BOM be the result of peeking 3 bytes from ioQueue,\n // converted to a byte sequence.\n const [a, b, c] = ioQueue\n\n // 2. For each of the rows in the table below, starting with\n // the first one and going down, if BOM starts with the\n // bytes given in the first column, then return the\n // encoding given in the cell in the second column of that\n // row. Otherwise, return null.\n if (a === 0xEF && b === 0xBB && c === 0xBF) {\n return 'UTF-8'\n } else if (a === 0xFE && b === 0xFF) {\n return 'UTF-16BE'\n } else if (a === 0xFF && b === 0xFE) {\n return 'UTF-16LE'\n }\n\n return null\n}\n\n/**\n * @param {Uint8Array[]} sequences\n */\nfunction combineByteSequences (sequences) {\n const size = sequences.reduce((a, b) => {\n return a + b.byteLength\n }, 0)\n\n let offset = 0\n\n return sequences.reduce((a, b) => {\n a.set(b, offset)\n offset += b.byteLength\n return a\n }, new Uint8Array(size))\n}\n\nmodule.exports = {\n staticPropertyDescriptors,\n readOperation,\n fireAProgressEvent\n}\n","'use strict'\n\n// We include a version number for the Dispatcher API. In case of breaking changes,\n// this version number must be increased to avoid conflicts.\nconst globalDispatcher = Symbol.for('undici.globalDispatcher.1')\nconst { InvalidArgumentError } = require('./core/errors')\nconst Agent = require('./agent')\n\nif (getGlobalDispatcher() === undefined) {\n setGlobalDispatcher(new Agent())\n}\n\nfunction setGlobalDispatcher (agent) {\n if (!agent || typeof agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument agent must implement Agent')\n }\n Object.defineProperty(globalThis, globalDispatcher, {\n value: agent,\n writable: true,\n enumerable: false,\n configurable: false\n })\n}\n\nfunction getGlobalDispatcher () {\n return globalThis[globalDispatcher]\n}\n\nmodule.exports = {\n setGlobalDispatcher,\n getGlobalDispatcher\n}\n","'use strict'\n\nmodule.exports = class DecoratorHandler {\n constructor (handler) {\n this.handler = handler\n }\n\n onConnect (...args) {\n return this.handler.onConnect(...args)\n }\n\n onError (...args) {\n return this.handler.onError(...args)\n }\n\n onUpgrade (...args) {\n return this.handler.onUpgrade(...args)\n }\n\n onHeaders (...args) {\n return this.handler.onHeaders(...args)\n }\n\n onData (...args) {\n return this.handler.onData(...args)\n }\n\n onComplete (...args) {\n return this.handler.onComplete(...args)\n }\n\n onBodySent (...args) {\n return this.handler.onBodySent(...args)\n }\n}\n","'use strict'\n\nconst util = require('../core/util')\nconst { kBodyUsed } = require('../core/symbols')\nconst assert = require('assert')\nconst { InvalidArgumentError } = require('../core/errors')\nconst EE = require('events')\n\nconst redirectableStatusCodes = [300, 301, 302, 303, 307, 308]\n\nconst kBody = Symbol('body')\n\nclass BodyAsyncIterable {\n constructor (body) {\n this[kBody] = body\n this[kBodyUsed] = false\n }\n\n async * [Symbol.asyncIterator] () {\n assert(!this[kBodyUsed], 'disturbed')\n this[kBodyUsed] = true\n yield * this[kBody]\n }\n}\n\nclass RedirectHandler {\n constructor (dispatch, maxRedirections, opts, handler) {\n if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {\n throw new InvalidArgumentError('maxRedirections must be a positive number')\n }\n\n util.validateHandler(handler, opts.method, opts.upgrade)\n\n this.dispatch = dispatch\n this.location = null\n this.abort = null\n this.opts = { ...opts, maxRedirections: 0 } // opts must be a copy\n this.maxRedirections = maxRedirections\n this.handler = handler\n this.history = []\n\n if (util.isStream(this.opts.body)) {\n // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp\n // so that it can be dispatched again?\n // TODO (fix): Do we need 100-expect support to provide a way to do this properly?\n if (util.bodyLength(this.opts.body) === 0) {\n this.opts.body\n .on('data', function () {\n assert(false)\n })\n }\n\n if (typeof this.opts.body.readableDidRead !== 'boolean') {\n this.opts.body[kBodyUsed] = false\n EE.prototype.on.call(this.opts.body, 'data', function () {\n this[kBodyUsed] = true\n })\n }\n } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') {\n // TODO (fix): We can't access ReadableStream internal state\n // to determine whether or not it has been disturbed. This is just\n // a workaround.\n this.opts.body = new BodyAsyncIterable(this.opts.body)\n } else if (\n this.opts.body &&\n typeof this.opts.body !== 'string' &&\n !ArrayBuffer.isView(this.opts.body) &&\n util.isIterable(this.opts.body)\n ) {\n // TODO: Should we allow re-using iterable if !this.opts.idempotent\n // or through some other flag?\n this.opts.body = new BodyAsyncIterable(this.opts.body)\n }\n }\n\n onConnect (abort) {\n this.abort = abort\n this.handler.onConnect(abort, { history: this.history })\n }\n\n onUpgrade (statusCode, headers, socket) {\n this.handler.onUpgrade(statusCode, headers, socket)\n }\n\n onError (error) {\n this.handler.onError(error)\n }\n\n onHeaders (statusCode, headers, resume, statusText) {\n this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body)\n ? null\n : parseLocation(statusCode, headers)\n\n if (this.opts.origin) {\n this.history.push(new URL(this.opts.path, this.opts.origin))\n }\n\n if (!this.location) {\n return this.handler.onHeaders(statusCode, headers, resume, statusText)\n }\n\n const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)))\n const path = search ? `${pathname}${search}` : pathname\n\n // Remove headers referring to the original URL.\n // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers.\n // https://tools.ietf.org/html/rfc7231#section-6.4\n this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin)\n this.opts.path = path\n this.opts.origin = origin\n this.opts.maxRedirections = 0\n this.opts.query = null\n\n // https://tools.ietf.org/html/rfc7231#section-6.4.4\n // In case of HTTP 303, always replace method to be either HEAD or GET\n if (statusCode === 303 && this.opts.method !== 'HEAD') {\n this.opts.method = 'GET'\n this.opts.body = null\n }\n }\n\n onData (chunk) {\n if (this.location) {\n /*\n https://tools.ietf.org/html/rfc7231#section-6.4\n\n TLDR: undici always ignores 3xx response bodies.\n\n Redirection is used to serve the requested resource from another URL, so it is assumes that\n no body is generated (and thus can be ignored). Even though generating a body is not prohibited.\n\n For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually\n (which means it's optional and not mandated) contain just an hyperlink to the value of\n the Location response header, so the body can be ignored safely.\n\n For status 300, which is \"Multiple Choices\", the spec mentions both generating a Location\n response header AND a response body with the other possible location to follow.\n Since the spec explicitily chooses not to specify a format for such body and leave it to\n servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it.\n */\n } else {\n return this.handler.onData(chunk)\n }\n }\n\n onComplete (trailers) {\n if (this.location) {\n /*\n https://tools.ietf.org/html/rfc7231#section-6.4\n\n TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections\n and neither are useful if present.\n\n See comment on onData method above for more detailed informations.\n */\n\n this.location = null\n this.abort = null\n\n this.dispatch(this.opts, this)\n } else {\n this.handler.onComplete(trailers)\n }\n }\n\n onBodySent (chunk) {\n if (this.handler.onBodySent) {\n this.handler.onBodySent(chunk)\n }\n }\n}\n\nfunction parseLocation (statusCode, headers) {\n if (redirectableStatusCodes.indexOf(statusCode) === -1) {\n return null\n }\n\n for (let i = 0; i < headers.length; i += 2) {\n if (headers[i].toString().toLowerCase() === 'location') {\n return headers[i + 1]\n }\n }\n}\n\n// https://tools.ietf.org/html/rfc7231#section-6.4.4\nfunction shouldRemoveHeader (header, removeContent, unknownOrigin) {\n return (\n (header.length === 4 && header.toString().toLowerCase() === 'host') ||\n (removeContent && header.toString().toLowerCase().indexOf('content-') === 0) ||\n (unknownOrigin && header.length === 13 && header.toString().toLowerCase() === 'authorization') ||\n (unknownOrigin && header.length === 6 && header.toString().toLowerCase() === 'cookie')\n )\n}\n\n// https://tools.ietf.org/html/rfc7231#section-6.4\nfunction cleanRequestHeaders (headers, removeContent, unknownOrigin) {\n const ret = []\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i += 2) {\n if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) {\n ret.push(headers[i], headers[i + 1])\n }\n }\n } else if (headers && typeof headers === 'object') {\n for (const key of Object.keys(headers)) {\n if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {\n ret.push(key, headers[key])\n }\n }\n } else {\n assert(headers == null, 'headers must be an object or an array')\n }\n return ret\n}\n\nmodule.exports = RedirectHandler\n","'use strict'\n\nconst RedirectHandler = require('../handler/RedirectHandler')\n\nfunction createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) {\n return (dispatch) => {\n return function Intercept (opts, handler) {\n const { maxRedirections = defaultMaxRedirections } = opts\n\n if (!maxRedirections) {\n return dispatch(opts, handler)\n }\n\n const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler)\n opts = { ...opts, maxRedirections: 0 } // Stop sub dispatcher from also redirecting.\n return dispatch(opts, redirectHandler)\n }\n }\n}\n\nmodule.exports = createRedirectInterceptor\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0;\nconst utils_1 = require(\"./utils\");\n// C headers\nvar ERROR;\n(function (ERROR) {\n ERROR[ERROR[\"OK\"] = 0] = \"OK\";\n ERROR[ERROR[\"INTERNAL\"] = 1] = \"INTERNAL\";\n ERROR[ERROR[\"STRICT\"] = 2] = \"STRICT\";\n ERROR[ERROR[\"LF_EXPECTED\"] = 3] = \"LF_EXPECTED\";\n ERROR[ERROR[\"UNEXPECTED_CONTENT_LENGTH\"] = 4] = \"UNEXPECTED_CONTENT_LENGTH\";\n ERROR[ERROR[\"CLOSED_CONNECTION\"] = 5] = \"CLOSED_CONNECTION\";\n ERROR[ERROR[\"INVALID_METHOD\"] = 6] = \"INVALID_METHOD\";\n ERROR[ERROR[\"INVALID_URL\"] = 7] = \"INVALID_URL\";\n ERROR[ERROR[\"INVALID_CONSTANT\"] = 8] = \"INVALID_CONSTANT\";\n ERROR[ERROR[\"INVALID_VERSION\"] = 9] = \"INVALID_VERSION\";\n ERROR[ERROR[\"INVALID_HEADER_TOKEN\"] = 10] = \"INVALID_HEADER_TOKEN\";\n ERROR[ERROR[\"INVALID_CONTENT_LENGTH\"] = 11] = \"INVALID_CONTENT_LENGTH\";\n ERROR[ERROR[\"INVALID_CHUNK_SIZE\"] = 12] = \"INVALID_CHUNK_SIZE\";\n ERROR[ERROR[\"INVALID_STATUS\"] = 13] = \"INVALID_STATUS\";\n ERROR[ERROR[\"INVALID_EOF_STATE\"] = 14] = \"INVALID_EOF_STATE\";\n ERROR[ERROR[\"INVALID_TRANSFER_ENCODING\"] = 15] = \"INVALID_TRANSFER_ENCODING\";\n ERROR[ERROR[\"CB_MESSAGE_BEGIN\"] = 16] = \"CB_MESSAGE_BEGIN\";\n ERROR[ERROR[\"CB_HEADERS_COMPLETE\"] = 17] = \"CB_HEADERS_COMPLETE\";\n ERROR[ERROR[\"CB_MESSAGE_COMPLETE\"] = 18] = \"CB_MESSAGE_COMPLETE\";\n ERROR[ERROR[\"CB_CHUNK_HEADER\"] = 19] = \"CB_CHUNK_HEADER\";\n ERROR[ERROR[\"CB_CHUNK_COMPLETE\"] = 20] = \"CB_CHUNK_COMPLETE\";\n ERROR[ERROR[\"PAUSED\"] = 21] = \"PAUSED\";\n ERROR[ERROR[\"PAUSED_UPGRADE\"] = 22] = \"PAUSED_UPGRADE\";\n ERROR[ERROR[\"PAUSED_H2_UPGRADE\"] = 23] = \"PAUSED_H2_UPGRADE\";\n ERROR[ERROR[\"USER\"] = 24] = \"USER\";\n})(ERROR = exports.ERROR || (exports.ERROR = {}));\nvar TYPE;\n(function (TYPE) {\n TYPE[TYPE[\"BOTH\"] = 0] = \"BOTH\";\n TYPE[TYPE[\"REQUEST\"] = 1] = \"REQUEST\";\n TYPE[TYPE[\"RESPONSE\"] = 2] = \"RESPONSE\";\n})(TYPE = exports.TYPE || (exports.TYPE = {}));\nvar FLAGS;\n(function (FLAGS) {\n FLAGS[FLAGS[\"CONNECTION_KEEP_ALIVE\"] = 1] = \"CONNECTION_KEEP_ALIVE\";\n FLAGS[FLAGS[\"CONNECTION_CLOSE\"] = 2] = \"CONNECTION_CLOSE\";\n FLAGS[FLAGS[\"CONNECTION_UPGRADE\"] = 4] = \"CONNECTION_UPGRADE\";\n FLAGS[FLAGS[\"CHUNKED\"] = 8] = \"CHUNKED\";\n FLAGS[FLAGS[\"UPGRADE\"] = 16] = \"UPGRADE\";\n FLAGS[FLAGS[\"CONTENT_LENGTH\"] = 32] = \"CONTENT_LENGTH\";\n FLAGS[FLAGS[\"SKIPBODY\"] = 64] = \"SKIPBODY\";\n FLAGS[FLAGS[\"TRAILING\"] = 128] = \"TRAILING\";\n // 1 << 8 is unused\n FLAGS[FLAGS[\"TRANSFER_ENCODING\"] = 512] = \"TRANSFER_ENCODING\";\n})(FLAGS = exports.FLAGS || (exports.FLAGS = {}));\nvar LENIENT_FLAGS;\n(function (LENIENT_FLAGS) {\n LENIENT_FLAGS[LENIENT_FLAGS[\"HEADERS\"] = 1] = \"HEADERS\";\n LENIENT_FLAGS[LENIENT_FLAGS[\"CHUNKED_LENGTH\"] = 2] = \"CHUNKED_LENGTH\";\n LENIENT_FLAGS[LENIENT_FLAGS[\"KEEP_ALIVE\"] = 4] = \"KEEP_ALIVE\";\n})(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {}));\nvar METHODS;\n(function (METHODS) {\n METHODS[METHODS[\"DELETE\"] = 0] = \"DELETE\";\n METHODS[METHODS[\"GET\"] = 1] = \"GET\";\n METHODS[METHODS[\"HEAD\"] = 2] = \"HEAD\";\n METHODS[METHODS[\"POST\"] = 3] = \"POST\";\n METHODS[METHODS[\"PUT\"] = 4] = \"PUT\";\n /* pathological */\n METHODS[METHODS[\"CONNECT\"] = 5] = \"CONNECT\";\n METHODS[METHODS[\"OPTIONS\"] = 6] = \"OPTIONS\";\n METHODS[METHODS[\"TRACE\"] = 7] = \"TRACE\";\n /* WebDAV */\n METHODS[METHODS[\"COPY\"] = 8] = \"COPY\";\n METHODS[METHODS[\"LOCK\"] = 9] = \"LOCK\";\n METHODS[METHODS[\"MKCOL\"] = 10] = \"MKCOL\";\n METHODS[METHODS[\"MOVE\"] = 11] = \"MOVE\";\n METHODS[METHODS[\"PROPFIND\"] = 12] = \"PROPFIND\";\n METHODS[METHODS[\"PROPPATCH\"] = 13] = \"PROPPATCH\";\n METHODS[METHODS[\"SEARCH\"] = 14] = \"SEARCH\";\n METHODS[METHODS[\"UNLOCK\"] = 15] = \"UNLOCK\";\n METHODS[METHODS[\"BIND\"] = 16] = \"BIND\";\n METHODS[METHODS[\"REBIND\"] = 17] = \"REBIND\";\n METHODS[METHODS[\"UNBIND\"] = 18] = \"UNBIND\";\n METHODS[METHODS[\"ACL\"] = 19] = \"ACL\";\n /* subversion */\n METHODS[METHODS[\"REPORT\"] = 20] = \"REPORT\";\n METHODS[METHODS[\"MKACTIVITY\"] = 21] = \"MKACTIVITY\";\n METHODS[METHODS[\"CHECKOUT\"] = 22] = \"CHECKOUT\";\n METHODS[METHODS[\"MERGE\"] = 23] = \"MERGE\";\n /* upnp */\n METHODS[METHODS[\"M-SEARCH\"] = 24] = \"M-SEARCH\";\n METHODS[METHODS[\"NOTIFY\"] = 25] = \"NOTIFY\";\n METHODS[METHODS[\"SUBSCRIBE\"] = 26] = \"SUBSCRIBE\";\n METHODS[METHODS[\"UNSUBSCRIBE\"] = 27] = \"UNSUBSCRIBE\";\n /* RFC-5789 */\n METHODS[METHODS[\"PATCH\"] = 28] = \"PATCH\";\n METHODS[METHODS[\"PURGE\"] = 29] = \"PURGE\";\n /* CalDAV */\n METHODS[METHODS[\"MKCALENDAR\"] = 30] = \"MKCALENDAR\";\n /* RFC-2068, section 19.6.1.2 */\n METHODS[METHODS[\"LINK\"] = 31] = \"LINK\";\n METHODS[METHODS[\"UNLINK\"] = 32] = \"UNLINK\";\n /* icecast */\n METHODS[METHODS[\"SOURCE\"] = 33] = \"SOURCE\";\n /* RFC-7540, section 11.6 */\n METHODS[METHODS[\"PRI\"] = 34] = \"PRI\";\n /* RFC-2326 RTSP */\n METHODS[METHODS[\"DESCRIBE\"] = 35] = \"DESCRIBE\";\n METHODS[METHODS[\"ANNOUNCE\"] = 36] = \"ANNOUNCE\";\n METHODS[METHODS[\"SETUP\"] = 37] = \"SETUP\";\n METHODS[METHODS[\"PLAY\"] = 38] = \"PLAY\";\n METHODS[METHODS[\"PAUSE\"] = 39] = \"PAUSE\";\n METHODS[METHODS[\"TEARDOWN\"] = 40] = \"TEARDOWN\";\n METHODS[METHODS[\"GET_PARAMETER\"] = 41] = \"GET_PARAMETER\";\n METHODS[METHODS[\"SET_PARAMETER\"] = 42] = \"SET_PARAMETER\";\n METHODS[METHODS[\"REDIRECT\"] = 43] = \"REDIRECT\";\n METHODS[METHODS[\"RECORD\"] = 44] = \"RECORD\";\n /* RAOP */\n METHODS[METHODS[\"FLUSH\"] = 45] = \"FLUSH\";\n})(METHODS = exports.METHODS || (exports.METHODS = {}));\nexports.METHODS_HTTP = [\n METHODS.DELETE,\n METHODS.GET,\n METHODS.HEAD,\n METHODS.POST,\n METHODS.PUT,\n METHODS.CONNECT,\n METHODS.OPTIONS,\n METHODS.TRACE,\n METHODS.COPY,\n METHODS.LOCK,\n METHODS.MKCOL,\n METHODS.MOVE,\n METHODS.PROPFIND,\n METHODS.PROPPATCH,\n METHODS.SEARCH,\n METHODS.UNLOCK,\n METHODS.BIND,\n METHODS.REBIND,\n METHODS.UNBIND,\n METHODS.ACL,\n METHODS.REPORT,\n METHODS.MKACTIVITY,\n METHODS.CHECKOUT,\n METHODS.MERGE,\n METHODS['M-SEARCH'],\n METHODS.NOTIFY,\n METHODS.SUBSCRIBE,\n METHODS.UNSUBSCRIBE,\n METHODS.PATCH,\n METHODS.PURGE,\n METHODS.MKCALENDAR,\n METHODS.LINK,\n METHODS.UNLINK,\n METHODS.PRI,\n // TODO(indutny): should we allow it with HTTP?\n METHODS.SOURCE,\n];\nexports.METHODS_ICE = [\n METHODS.SOURCE,\n];\nexports.METHODS_RTSP = [\n METHODS.OPTIONS,\n METHODS.DESCRIBE,\n METHODS.ANNOUNCE,\n METHODS.SETUP,\n METHODS.PLAY,\n METHODS.PAUSE,\n METHODS.TEARDOWN,\n METHODS.GET_PARAMETER,\n METHODS.SET_PARAMETER,\n METHODS.REDIRECT,\n METHODS.RECORD,\n METHODS.FLUSH,\n // For AirPlay\n METHODS.GET,\n METHODS.POST,\n];\nexports.METHOD_MAP = utils_1.enumToMap(METHODS);\nexports.H_METHOD_MAP = {};\nObject.keys(exports.METHOD_MAP).forEach((key) => {\n if (/^H/.test(key)) {\n exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key];\n }\n});\nvar FINISH;\n(function (FINISH) {\n FINISH[FINISH[\"SAFE\"] = 0] = \"SAFE\";\n FINISH[FINISH[\"SAFE_WITH_CB\"] = 1] = \"SAFE_WITH_CB\";\n FINISH[FINISH[\"UNSAFE\"] = 2] = \"UNSAFE\";\n})(FINISH = exports.FINISH || (exports.FINISH = {}));\nexports.ALPHA = [];\nfor (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) {\n // Upper case\n exports.ALPHA.push(String.fromCharCode(i));\n // Lower case\n exports.ALPHA.push(String.fromCharCode(i + 0x20));\n}\nexports.NUM_MAP = {\n 0: 0, 1: 1, 2: 2, 3: 3, 4: 4,\n 5: 5, 6: 6, 7: 7, 8: 8, 9: 9,\n};\nexports.HEX_MAP = {\n 0: 0, 1: 1, 2: 2, 3: 3, 4: 4,\n 5: 5, 6: 6, 7: 7, 8: 8, 9: 9,\n A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF,\n a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf,\n};\nexports.NUM = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n];\nexports.ALPHANUM = exports.ALPHA.concat(exports.NUM);\nexports.MARK = ['-', '_', '.', '!', '~', '*', '\\'', '(', ')'];\nexports.USERINFO_CHARS = exports.ALPHANUM\n .concat(exports.MARK)\n .concat(['%', ';', ':', '&', '=', '+', '$', ',']);\n// TODO(indutny): use RFC\nexports.STRICT_URL_CHAR = [\n '!', '\"', '$', '%', '&', '\\'',\n '(', ')', '*', '+', ',', '-', '.', '/',\n ':', ';', '<', '=', '>',\n '@', '[', '\\\\', ']', '^', '_',\n '`',\n '{', '|', '}', '~',\n].concat(exports.ALPHANUM);\nexports.URL_CHAR = exports.STRICT_URL_CHAR\n .concat(['\\t', '\\f']);\n// All characters with 0x80 bit set to 1\nfor (let i = 0x80; i <= 0xff; i++) {\n exports.URL_CHAR.push(i);\n}\nexports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']);\n/* Tokens as defined by rfc 2616. Also lowercases them.\n * token = 1*\n * separators = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n * | \",\" | \";\" | \":\" | \"\\\" | <\">\n * | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n * | \"{\" | \"}\" | SP | HT\n */\nexports.STRICT_TOKEN = [\n '!', '#', '$', '%', '&', '\\'',\n '*', '+', '-', '.',\n '^', '_', '`',\n '|', '~',\n].concat(exports.ALPHANUM);\nexports.TOKEN = exports.STRICT_TOKEN.concat([' ']);\n/*\n * Verify that a char is a valid visible (printable) US-ASCII\n * character or %x80-FF\n */\nexports.HEADER_CHARS = ['\\t'];\nfor (let i = 32; i <= 255; i++) {\n if (i !== 127) {\n exports.HEADER_CHARS.push(i);\n }\n}\n// ',' = \\x44\nexports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44);\nexports.MAJOR = exports.NUM_MAP;\nexports.MINOR = exports.MAJOR;\nvar HEADER_STATE;\n(function (HEADER_STATE) {\n HEADER_STATE[HEADER_STATE[\"GENERAL\"] = 0] = \"GENERAL\";\n HEADER_STATE[HEADER_STATE[\"CONNECTION\"] = 1] = \"CONNECTION\";\n HEADER_STATE[HEADER_STATE[\"CONTENT_LENGTH\"] = 2] = \"CONTENT_LENGTH\";\n HEADER_STATE[HEADER_STATE[\"TRANSFER_ENCODING\"] = 3] = \"TRANSFER_ENCODING\";\n HEADER_STATE[HEADER_STATE[\"UPGRADE\"] = 4] = \"UPGRADE\";\n HEADER_STATE[HEADER_STATE[\"CONNECTION_KEEP_ALIVE\"] = 5] = \"CONNECTION_KEEP_ALIVE\";\n HEADER_STATE[HEADER_STATE[\"CONNECTION_CLOSE\"] = 6] = \"CONNECTION_CLOSE\";\n HEADER_STATE[HEADER_STATE[\"CONNECTION_UPGRADE\"] = 7] = \"CONNECTION_UPGRADE\";\n HEADER_STATE[HEADER_STATE[\"TRANSFER_ENCODING_CHUNKED\"] = 8] = \"TRANSFER_ENCODING_CHUNKED\";\n})(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {}));\nexports.SPECIAL_HEADERS = {\n 'connection': HEADER_STATE.CONNECTION,\n 'content-length': HEADER_STATE.CONTENT_LENGTH,\n 'proxy-connection': HEADER_STATE.CONNECTION,\n 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING,\n 'upgrade': HEADER_STATE.UPGRADE,\n};\n//# sourceMappingURL=constants.js.map","module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCsLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC1kAIABBGGpCADcDACAAQgA3AwAgAEE4akIANwMAIABBMGpCADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwHLAcoBuAHJAbkByAG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAQDcAQtBACEQDMYBC0EOIRAMxQELQQ0hEAzEAQtBDyEQDMMBC0EQIRAMwgELQRMhEAzBAQtBFCEQDMABC0EVIRAMvwELQRYhEAy+AQtBFyEQDL0BC0EYIRAMvAELQRkhEAy7AQtBGiEQDLoBC0EbIRAMuQELQRwhEAy4AQtBCCEQDLcBC0EdIRAMtgELQSAhEAy1AQtBHyEQDLQBC0EHIRAMswELQSEhEAyyAQtBIiEQDLEBC0EeIRAMsAELQSMhEAyvAQtBEiEQDK4BC0ERIRAMrQELQSQhEAysAQtBJSEQDKsBC0EmIRAMqgELQSchEAypAQtBwwEhEAyoAQtBKSEQDKcBC0ErIRAMpgELQSwhEAylAQtBLSEQDKQBC0EuIRAMowELQS8hEAyiAQtBxAEhEAyhAQtBMCEQDKABC0E0IRAMnwELQQwhEAyeAQtBMSEQDJ0BC0EyIRAMnAELQTMhEAybAQtBOSEQDJoBC0E1IRAMmQELQcUBIRAMmAELQQshEAyXAQtBOiEQDJYBC0E2IRAMlQELQQohEAyUAQtBNyEQDJMBC0E4IRAMkgELQTwhEAyRAQtBOyEQDJABC0E9IRAMjwELQQkhEAyOAQtBKCEQDI0BC0E+IRAMjAELQT8hEAyLAQtBwAAhEAyKAQtBwQAhEAyJAQtBwgAhEAyIAQtBwwAhEAyHAQtBxAAhEAyGAQtBxQAhEAyFAQtBxgAhEAyEAQtBKiEQDIMBC0HHACEQDIIBC0HIACEQDIEBC0HJACEQDIABC0HKACEQDH8LQcsAIRAMfgtBzQAhEAx9C0HMACEQDHwLQc4AIRAMewtBzwAhEAx6C0HQACEQDHkLQdEAIRAMeAtB0gAhEAx3C0HTACEQDHYLQdQAIRAMdQtB1gAhEAx0C0HVACEQDHMLQQYhEAxyC0HXACEQDHELQQUhEAxwC0HYACEQDG8LQQQhEAxuC0HZACEQDG0LQdoAIRAMbAtB2wAhEAxrC0HcACEQDGoLQQMhEAxpC0HdACEQDGgLQd4AIRAMZwtB3wAhEAxmC0HhACEQDGULQeAAIRAMZAtB4gAhEAxjC0HjACEQDGILQQIhEAxhC0HkACEQDGALQeUAIRAMXwtB5gAhEAxeC0HnACEQDF0LQegAIRAMXAtB6QAhEAxbC0HqACEQDFoLQesAIRAMWQtB7AAhEAxYC0HtACEQDFcLQe4AIRAMVgtB7wAhEAxVC0HwACEQDFQLQfEAIRAMUwtB8gAhEAxSC0HzACEQDFELQfQAIRAMUAtB9QAhEAxPC0H2ACEQDE4LQfcAIRAMTQtB+AAhEAxMC0H5ACEQDEsLQfoAIRAMSgtB+wAhEAxJC0H8ACEQDEgLQf0AIRAMRwtB/gAhEAxGC0H/ACEQDEULQYABIRAMRAtBgQEhEAxDC0GCASEQDEILQYMBIRAMQQtBhAEhEAxAC0GFASEQDD8LQYYBIRAMPgtBhwEhEAw9C0GIASEQDDwLQYkBIRAMOwtBigEhEAw6C0GLASEQDDkLQYwBIRAMOAtBjQEhEAw3C0GOASEQDDYLQY8BIRAMNQtBkAEhEAw0C0GRASEQDDMLQZIBIRAMMgtBkwEhEAwxC0GUASEQDDALQZUBIRAMLwtBlgEhEAwuC0GXASEQDC0LQZgBIRAMLAtBmQEhEAwrC0GaASEQDCoLQZsBIRAMKQtBnAEhEAwoC0GdASEQDCcLQZ4BIRAMJgtBnwEhEAwlC0GgASEQDCQLQaEBIRAMIwtBogEhEAwiC0GjASEQDCELQaQBIRAMIAtBpQEhEAwfC0GmASEQDB4LQacBIRAMHQtBqAEhEAwcC0GpASEQDBsLQaoBIRAMGgtBqwEhEAwZC0GsASEQDBgLQa0BIRAMFwtBrgEhEAwWC0EBIRAMFQtBrwEhEAwUC0GwASEQDBMLQbEBIRAMEgtBswEhEAwRC0GyASEQDBALQbQBIRAMDwtBtQEhEAwOC0G2ASEQDA0LQbcBIRAMDAtBuAEhEAwLC0G5ASEQDAoLQboBIRAMCQtBuwEhEAwIC0HGASEQDAcLQbwBIRAMBgtBvQEhEAwFC0G+ASEQDAQLQb8BIRAMAwtBwAEhEAwCC0HCASEQDAELQcEBIRALA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQDscBAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxweHyAhIyUoP0BBREVGR0hJSktMTU9QUVJT3gNXWVtcXWBiZWZnaGlqa2xtb3BxcnN0dXZ3eHl6e3x9foABggGFAYYBhwGJAYsBjAGNAY4BjwGQAZEBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAZkCpAKwAv4C/gILIAEiBCACRw3zAUHdASEQDP8DCyABIhAgAkcN3QFBwwEhEAz+AwsgASIBIAJHDZABQfcAIRAM/QMLIAEiASACRw2GAUHvACEQDPwDCyABIgEgAkcNf0HqACEQDPsDCyABIgEgAkcNe0HoACEQDPoDCyABIgEgAkcNeEHmACEQDPkDCyABIgEgAkcNGkEYIRAM+AMLIAEiASACRw0UQRIhEAz3AwsgASIBIAJHDVlBxQAhEAz2AwsgASIBIAJHDUpBPyEQDPUDCyABIgEgAkcNSEE8IRAM9AMLIAEiASACRw1BQTEhEAzzAwsgAC0ALkEBRg3rAwyHAgsgACABIgEgAhDAgICAAEEBRw3mASAAQgA3AyAM5wELIAAgASIBIAIQtICAgAAiEA3nASABIQEM9QILAkAgASIBIAJHDQBBBiEQDPADCyAAIAFBAWoiASACELuAgIAAIhAN6AEgASEBDDELIABCADcDIEESIRAM1QMLIAEiECACRw0rQR0hEAztAwsCQCABIgEgAkYNACABQQFqIQFBECEQDNQDC0EHIRAM7AMLIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN5QFBCCEQDOsDCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEUIRAM0gMLQQkhEAzqAwsgASEBIAApAyBQDeQBIAEhAQzyAgsCQCABIgEgAkcNAEELIRAM6QMLIAAgAUEBaiIBIAIQtoCAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3mASABIQEMDQsgACABIgEgAhC6gICAACIQDecBIAEhAQzwAgsCQCABIgEgAkcNAEEPIRAM5QMLIAEtAAAiEEE7Rg0IIBBBDUcN6AEgAUEBaiEBDO8CCyAAIAEiASACELqAgIAAIhAN6AEgASEBDPICCwNAAkAgAS0AAEHwtYCAAGotAAAiEEEBRg0AIBBBAkcN6wEgACgCBCEQIABBADYCBCAAIBAgAUEBaiIBELmAgIAAIhAN6gEgASEBDPQCCyABQQFqIgEgAkcNAAtBEiEQDOIDCyAAIAEiASACELqAgIAAIhAN6QEgASEBDAoLIAEiASACRw0GQRshEAzgAwsCQCABIgEgAkcNAEEWIRAM4AMLIABBioCAgAA2AgggACABNgIEIAAgASACELiAgIAAIhAN6gEgASEBQSAhEAzGAwsCQCABIgEgAkYNAANAAkAgAS0AAEHwt4CAAGotAAAiEEECRg0AAkAgEEF/ag4E5QHsAQDrAewBCyABQQFqIQFBCCEQDMgDCyABQQFqIgEgAkcNAAtBFSEQDN8DC0EVIRAM3gMLA0ACQCABLQAAQfC5gIAAai0AACIQQQJGDQAgEEF/ag4E3gHsAeAB6wHsAQsgAUEBaiIBIAJHDQALQRghEAzdAwsCQCABIgEgAkYNACAAQYuAgIAANgIIIAAgATYCBCABIQFBByEQDMQDC0EZIRAM3AMLIAFBAWohAQwCCwJAIAEiFCACRw0AQRohEAzbAwsgFCEBAkAgFC0AAEFzag4U3QLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gIA7gILQQAhECAAQQA2AhwgAEGvi4CAADYCECAAQQI2AgwgACAUQQFqNgIUDNoDCwJAIAEtAAAiEEE7Rg0AIBBBDUcN6AEgAUEBaiEBDOUCCyABQQFqIQELQSIhEAy/AwsCQCABIhAgAkcNAEEcIRAM2AMLQgAhESAQIQEgEC0AAEFQag435wHmAQECAwQFBgcIAAAAAAAAAAkKCwwNDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAREhMUAAtBHiEQDL0DC0ICIREM5QELQgMhEQzkAQtCBCERDOMBC0IFIREM4gELQgYhEQzhAQtCByERDOABC0IIIREM3wELQgkhEQzeAQtCCiERDN0BC0ILIREM3AELQgwhEQzbAQtCDSERDNoBC0IOIREM2QELQg8hEQzYAQtCCiERDNcBC0ILIREM1gELQgwhEQzVAQtCDSERDNQBC0IOIREM0wELQg8hEQzSAQtCACERAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQLQAAQVBqDjflAeQBAAECAwQFBgfmAeYB5gHmAeYB5gHmAQgJCgsMDeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gEODxAREhPmAQtCAiERDOQBC0IDIREM4wELQgQhEQziAQtCBSERDOEBC0IGIREM4AELQgchEQzfAQtCCCERDN4BC0IJIREM3QELQgohEQzcAQtCCyERDNsBC0IMIREM2gELQg0hEQzZAQtCDiERDNgBC0IPIREM1wELQgohEQzWAQtCCyERDNUBC0IMIREM1AELQg0hEQzTAQtCDiERDNIBC0IPIREM0QELIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN0gFBHyEQDMADCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEkIRAMpwMLQSAhEAy/AwsgACABIhAgAhC+gICAAEF/ag4FtgEAxQIB0QHSAQtBESEQDKQDCyAAQQE6AC8gECEBDLsDCyABIgEgAkcN0gFBJCEQDLsDCyABIg0gAkcNHkHGACEQDLoDCyAAIAEiASACELKAgIAAIhAN1AEgASEBDLUBCyABIhAgAkcNJkHQACEQDLgDCwJAIAEiASACRw0AQSghEAy4AwsgAEEANgIEIABBjICAgAA2AgggACABIAEQsYCAgAAiEA3TASABIQEM2AELAkAgASIQIAJHDQBBKSEQDLcDCyAQLQAAIgFBIEYNFCABQQlHDdMBIBBBAWohAQwVCwJAIAEiASACRg0AIAFBAWohAQwXC0EqIRAMtQMLAkAgASIQIAJHDQBBKyEQDLUDCwJAIBAtAAAiAUEJRg0AIAFBIEcN1QELIAAtACxBCEYN0wEgECEBDJEDCwJAIAEiASACRw0AQSwhEAy0AwsgAS0AAEEKRw3VASABQQFqIQEMyQILIAEiDiACRw3VAUEvIRAMsgMLA0ACQCABLQAAIhBBIEYNAAJAIBBBdmoOBADcAdwBANoBCyABIQEM4AELIAFBAWoiASACRw0AC0ExIRAMsQMLQTIhECABIhQgAkYNsAMgAiAUayAAKAIAIgFqIRUgFCABa0EDaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfC7gIAAai0AAEcNAQJAIAFBA0cNAEEGIQEMlgMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLEDCyAAQQA2AgAgFCEBDNkBC0EzIRAgASIUIAJGDa8DIAIgFGsgACgCACIBaiEVIBQgAWtBCGohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUH0u4CAAGotAABHDQECQCABQQhHDQBBBSEBDJUDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAywAwsgAEEANgIAIBQhAQzYAQtBNCEQIAEiFCACRg2uAyACIBRrIAAoAgAiAWohFSAUIAFrQQVqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw0BAkAgAUEFRw0AQQchAQyUAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMrwMLIABBADYCACAUIQEM1wELAkAgASIBIAJGDQADQAJAIAEtAABBgL6AgABqLQAAIhBBAUYNACAQQQJGDQogASEBDN0BCyABQQFqIgEgAkcNAAtBMCEQDK4DC0EwIRAMrQMLAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AIBBBdmoOBNkB2gHaAdkB2gELIAFBAWoiASACRw0AC0E4IRAMrQMLQTghEAysAwsDQAJAIAEtAAAiEEEgRg0AIBBBCUcNAwsgAUEBaiIBIAJHDQALQTwhEAyrAwsDQAJAIAEtAAAiEEEgRg0AAkACQCAQQXZqDgTaAQEB2gEACyAQQSxGDdsBCyABIQEMBAsgAUEBaiIBIAJHDQALQT8hEAyqAwsgASEBDNsBC0HAACEQIAEiFCACRg2oAyACIBRrIAAoAgAiAWohFiAUIAFrQQZqIRcCQANAIBQtAABBIHIgAUGAwICAAGotAABHDQEgAUEGRg2OAyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAypAwsgAEEANgIAIBQhAQtBNiEQDI4DCwJAIAEiDyACRw0AQcEAIRAMpwMLIABBjICAgAA2AgggACAPNgIEIA8hASAALQAsQX9qDgTNAdUB1wHZAYcDCyABQQFqIQEMzAELAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgciAQIBBBv39qQf8BcUEaSRtB/wFxIhBBCUYNACAQQSBGDQACQAJAAkACQCAQQZ1/ag4TAAMDAwMDAwMBAwMDAwMDAwMDAgMLIAFBAWohAUExIRAMkQMLIAFBAWohAUEyIRAMkAMLIAFBAWohAUEzIRAMjwMLIAEhAQzQAQsgAUEBaiIBIAJHDQALQTUhEAylAwtBNSEQDKQDCwJAIAEiASACRg0AA0ACQCABLQAAQYC8gIAAai0AAEEBRg0AIAEhAQzTAQsgAUEBaiIBIAJHDQALQT0hEAykAwtBPSEQDKMDCyAAIAEiASACELCAgIAAIhAN1gEgASEBDAELIBBBAWohAQtBPCEQDIcDCwJAIAEiASACRw0AQcIAIRAMoAMLAkADQAJAIAEtAABBd2oOGAAC/gL+AoQD/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4CAP4CCyABQQFqIgEgAkcNAAtBwgAhEAygAwsgAUEBaiEBIAAtAC1BAXFFDb0BIAEhAQtBLCEQDIUDCyABIgEgAkcN0wFBxAAhEAydAwsDQAJAIAEtAABBkMCAgABqLQAAQQFGDQAgASEBDLcCCyABQQFqIgEgAkcNAAtBxQAhEAycAwsgDS0AACIQQSBGDbMBIBBBOkcNgQMgACgCBCEBIABBADYCBCAAIAEgDRCvgICAACIBDdABIA1BAWohAQyzAgtBxwAhECABIg0gAkYNmgMgAiANayAAKAIAIgFqIRYgDSABa0EFaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGQwoCAAGotAABHDYADIAFBBUYN9AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmgMLQcgAIRAgASINIAJGDZkDIAIgDWsgACgCACIBaiEWIA0gAWtBCWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBlsKAgABqLQAARw3/AgJAIAFBCUcNAEECIQEM9QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJkDCwJAIAEiDSACRw0AQckAIRAMmQMLAkACQCANLQAAIgFBIHIgASABQb9/akH/AXFBGkkbQf8BcUGSf2oOBwCAA4ADgAOAA4ADAYADCyANQQFqIQFBPiEQDIADCyANQQFqIQFBPyEQDP8CC0HKACEQIAEiDSACRg2XAyACIA1rIAAoAgAiAWohFiANIAFrQQFqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaDCgIAAai0AAEcN/QIgAUEBRg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyXAwtBywAhECABIg0gAkYNlgMgAiANayAAKAIAIgFqIRYgDSABa0EOaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGiwoCAAGotAABHDfwCIAFBDkYN8AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlgMLQcwAIRAgASINIAJGDZUDIAIgDWsgACgCACIBaiEWIA0gAWtBD2ohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBwMKAgABqLQAARw37AgJAIAFBD0cNAEEDIQEM8QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJUDC0HNACEQIAEiDSACRg2UAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQdDCgIAAai0AAEcN+gICQCABQQVHDQBBBCEBDPACCyABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyUAwsCQCABIg0gAkcNAEHOACEQDJQDCwJAAkACQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZ1/ag4TAP0C/QL9Av0C/QL9Av0C/QL9Av0C/QL9AgH9Av0C/QICA/0CCyANQQFqIQFBwQAhEAz9AgsgDUEBaiEBQcIAIRAM/AILIA1BAWohAUHDACEQDPsCCyANQQFqIQFBxAAhEAz6AgsCQCABIgEgAkYNACAAQY2AgIAANgIIIAAgATYCBCABIQFBxQAhEAz6AgtBzwAhEAySAwsgECEBAkACQCAQLQAAQXZqDgQBqAKoAgCoAgsgEEEBaiEBC0EnIRAM+AILAkAgASIBIAJHDQBB0QAhEAyRAwsCQCABLQAAQSBGDQAgASEBDI0BCyABQQFqIQEgAC0ALUEBcUUNxwEgASEBDIwBCyABIhcgAkcNyAFB0gAhEAyPAwtB0wAhECABIhQgAkYNjgMgAiAUayAAKAIAIgFqIRYgFCABa0EBaiEXA0AgFC0AACABQdbCgIAAai0AAEcNzAEgAUEBRg3HASABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAyOAwsCQCABIgEgAkcNAEHVACEQDI4DCyABLQAAQQpHDcwBIAFBAWohAQzHAQsCQCABIgEgAkcNAEHWACEQDI0DCwJAAkAgAS0AAEF2ag4EAM0BzQEBzQELIAFBAWohAQzHAQsgAUEBaiEBQcoAIRAM8wILIAAgASIBIAIQroCAgAAiEA3LASABIQFBzQAhEAzyAgsgAC0AKUEiRg2FAwymAgsCQCABIgEgAkcNAEHbACEQDIoDC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgAS0AAEFQag4K1AHTAQABAgMEBQYI1QELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMzAELQQkhEEEBIRRBACEXQQAhFgzLAQsCQCABIgEgAkcNAEHdACEQDIkDCyABLQAAQS5HDcwBIAFBAWohAQymAgsgASIBIAJHDcwBQd8AIRAMhwMLAkAgASIBIAJGDQAgAEGOgICAADYCCCAAIAE2AgQgASEBQdAAIRAM7gILQeAAIRAMhgMLQeEAIRAgASIBIAJGDYUDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHiwoCAAGotAABHDc0BIBRBA0YNzAEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhQMLQeIAIRAgASIBIAJGDYQDIAIgAWsgACgCACIUaiEWIAEgFGtBAmohFwNAIAEtAAAgFEHmwoCAAGotAABHDcwBIBRBAkYNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhAMLQeMAIRAgASIBIAJGDYMDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHpwoCAAGotAABHDcsBIBRBA0YNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMgwMLAkAgASIBIAJHDQBB5QAhEAyDAwsgACABQQFqIgEgAhCogICAACIQDc0BIAEhAUHWACEQDOkCCwJAIAEiASACRg0AA0ACQCABLQAAIhBBIEYNAAJAAkACQCAQQbh/ag4LAAHPAc8BzwHPAc8BzwHPAc8BAs8BCyABQQFqIQFB0gAhEAztAgsgAUEBaiEBQdMAIRAM7AILIAFBAWohAUHUACEQDOsCCyABQQFqIgEgAkcNAAtB5AAhEAyCAwtB5AAhEAyBAwsDQAJAIAEtAABB8MKAgABqLQAAIhBBAUYNACAQQX5qDgPPAdAB0QHSAQsgAUEBaiIBIAJHDQALQeYAIRAMgAMLAkAgASIBIAJGDQAgAUEBaiEBDAMLQecAIRAM/wILA0ACQCABLQAAQfDEgIAAai0AACIQQQFGDQACQCAQQX5qDgTSAdMB1AEA1QELIAEhAUHXACEQDOcCCyABQQFqIgEgAkcNAAtB6AAhEAz+AgsCQCABIgEgAkcNAEHpACEQDP4CCwJAIAEtAAAiEEF2ag4augHVAdUBvAHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHKAdUB1QEA0wELIAFBAWohAQtBBiEQDOMCCwNAAkAgAS0AAEHwxoCAAGotAABBAUYNACABIQEMngILIAFBAWoiASACRw0AC0HqACEQDPsCCwJAIAEiASACRg0AIAFBAWohAQwDC0HrACEQDPoCCwJAIAEiASACRw0AQewAIRAM+gILIAFBAWohAQwBCwJAIAEiASACRw0AQe0AIRAM+QILIAFBAWohAQtBBCEQDN4CCwJAIAEiFCACRw0AQe4AIRAM9wILIBQhAQJAAkACQCAULQAAQfDIgIAAai0AAEF/ag4H1AHVAdYBAJwCAQLXAQsgFEEBaiEBDAoLIBRBAWohAQzNAQtBACEQIABBADYCHCAAQZuSgIAANgIQIABBBzYCDCAAIBRBAWo2AhQM9gILAkADQAJAIAEtAABB8MiAgABqLQAAIhBBBEYNAAJAAkAgEEF/ag4H0gHTAdQB2QEABAHZAQsgASEBQdoAIRAM4AILIAFBAWohAUHcACEQDN8CCyABQQFqIgEgAkcNAAtB7wAhEAz2AgsgAUEBaiEBDMsBCwJAIAEiFCACRw0AQfAAIRAM9QILIBQtAABBL0cN1AEgFEEBaiEBDAYLAkAgASIUIAJHDQBB8QAhEAz0AgsCQCAULQAAIgFBL0cNACAUQQFqIQFB3QAhEAzbAgsgAUF2aiIEQRZLDdMBQQEgBHRBiYCAAnFFDdMBDMoCCwJAIAEiASACRg0AIAFBAWohAUHeACEQDNoCC0HyACEQDPICCwJAIAEiFCACRw0AQfQAIRAM8gILIBQhAQJAIBQtAABB8MyAgABqLQAAQX9qDgPJApQCANQBC0HhACEQDNgCCwJAIAEiFCACRg0AA0ACQCAULQAAQfDKgIAAai0AACIBQQNGDQACQCABQX9qDgLLAgDVAQsgFCEBQd8AIRAM2gILIBRBAWoiFCACRw0AC0HzACEQDPECC0HzACEQDPACCwJAIAEiASACRg0AIABBj4CAgAA2AgggACABNgIEIAEhAUHgACEQDNcCC0H1ACEQDO8CCwJAIAEiASACRw0AQfYAIRAM7wILIABBj4CAgAA2AgggACABNgIEIAEhAQtBAyEQDNQCCwNAIAEtAABBIEcNwwIgAUEBaiIBIAJHDQALQfcAIRAM7AILAkAgASIBIAJHDQBB+AAhEAzsAgsgAS0AAEEgRw3OASABQQFqIQEM7wELIAAgASIBIAIQrICAgAAiEA3OASABIQEMjgILAkAgASIEIAJHDQBB+gAhEAzqAgsgBC0AAEHMAEcN0QEgBEEBaiEBQRMhEAzPAQsCQCABIgQgAkcNAEH7ACEQDOkCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRADQCAELQAAIAFB8M6AgABqLQAARw3QASABQQVGDc4BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQfsAIRAM6AILAkAgASIEIAJHDQBB/AAhEAzoAgsCQAJAIAQtAABBvX9qDgwA0QHRAdEB0QHRAdEB0QHRAdEB0QEB0QELIARBAWohAUHmACEQDM8CCyAEQQFqIQFB5wAhEAzOAgsCQCABIgQgAkcNAEH9ACEQDOcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDc8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH9ACEQDOcCCyAAQQA2AgAgEEEBaiEBQRAhEAzMAQsCQCABIgQgAkcNAEH+ACEQDOYCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUH2zoCAAGotAABHDc4BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH+ACEQDOYCCyAAQQA2AgAgEEEBaiEBQRYhEAzLAQsCQCABIgQgAkcNAEH/ACEQDOUCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUH8zoCAAGotAABHDc0BIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH/ACEQDOUCCyAAQQA2AgAgEEEBaiEBQQUhEAzKAQsCQCABIgQgAkcNAEGAASEQDOQCCyAELQAAQdkARw3LASAEQQFqIQFBCCEQDMkBCwJAIAEiBCACRw0AQYEBIRAM4wILAkACQCAELQAAQbJ/ag4DAMwBAcwBCyAEQQFqIQFB6wAhEAzKAgsgBEEBaiEBQewAIRAMyQILAkAgASIEIAJHDQBBggEhEAziAgsCQAJAIAQtAABBuH9qDggAywHLAcsBywHLAcsBAcsBCyAEQQFqIQFB6gAhEAzJAgsgBEEBaiEBQe0AIRAMyAILAkAgASIEIAJHDQBBgwEhEAzhAgsgAiAEayAAKAIAIgFqIRAgBCABa0ECaiEUAkADQCAELQAAIAFBgM+AgABqLQAARw3JASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBA2AgBBgwEhEAzhAgtBACEQIABBADYCACAUQQFqIQEMxgELAkAgASIEIAJHDQBBhAEhEAzgAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBg8+AgABqLQAARw3IASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhAEhEAzgAgsgAEEANgIAIBBBAWohAUEjIRAMxQELAkAgASIEIAJHDQBBhQEhEAzfAgsCQAJAIAQtAABBtH9qDggAyAHIAcgByAHIAcgBAcgBCyAEQQFqIQFB7wAhEAzGAgsgBEEBaiEBQfAAIRAMxQILAkAgASIEIAJHDQBBhgEhEAzeAgsgBC0AAEHFAEcNxQEgBEEBaiEBDIMCCwJAIAEiBCACRw0AQYcBIRAM3QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQYjPgIAAai0AAEcNxQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYcBIRAM3QILIABBADYCACAQQQFqIQFBLSEQDMIBCwJAIAEiBCACRw0AQYgBIRAM3AILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNxAEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYgBIRAM3AILIABBADYCACAQQQFqIQFBKSEQDMEBCwJAIAEiASACRw0AQYkBIRAM2wILQQEhECABLQAAQd8ARw3AASABQQFqIQEMgQILAkAgASIEIAJHDQBBigEhEAzaAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQA0AgBC0AACABQYzPgIAAai0AAEcNwQEgAUEBRg2vAiABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGKASEQDNkCCwJAIAEiBCACRw0AQYsBIRAM2QILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQY7PgIAAai0AAEcNwQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYsBIRAM2QILIABBADYCACAQQQFqIQFBAiEQDL4BCwJAIAEiBCACRw0AQYwBIRAM2AILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNwAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYwBIRAM2AILIABBADYCACAQQQFqIQFBHyEQDL0BCwJAIAEiBCACRw0AQY0BIRAM1wILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNvwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY0BIRAM1wILIABBADYCACAQQQFqIQFBCSEQDLwBCwJAIAEiBCACRw0AQY4BIRAM1gILAkACQCAELQAAQbd/ag4HAL8BvwG/Ab8BvwEBvwELIARBAWohAUH4ACEQDL0CCyAEQQFqIQFB+QAhEAy8AgsCQCABIgQgAkcNAEGPASEQDNUCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGRz4CAAGotAABHDb0BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGPASEQDNUCCyAAQQA2AgAgEEEBaiEBQRghEAy6AQsCQCABIgQgAkcNAEGQASEQDNQCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUGXz4CAAGotAABHDbwBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGQASEQDNQCCyAAQQA2AgAgEEEBaiEBQRchEAy5AQsCQCABIgQgAkcNAEGRASEQDNMCCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUGaz4CAAGotAABHDbsBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGRASEQDNMCCyAAQQA2AgAgEEEBaiEBQRUhEAy4AQsCQCABIgQgAkcNAEGSASEQDNICCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGhz4CAAGotAABHDboBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGSASEQDNICCyAAQQA2AgAgEEEBaiEBQR4hEAy3AQsCQCABIgQgAkcNAEGTASEQDNECCyAELQAAQcwARw24ASAEQQFqIQFBCiEQDLYBCwJAIAQgAkcNAEGUASEQDNACCwJAAkAgBC0AAEG/f2oODwC5AbkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AQG5AQsgBEEBaiEBQf4AIRAMtwILIARBAWohAUH/ACEQDLYCCwJAIAQgAkcNAEGVASEQDM8CCwJAAkAgBC0AAEG/f2oOAwC4AQG4AQsgBEEBaiEBQf0AIRAMtgILIARBAWohBEGAASEQDLUCCwJAIAQgAkcNAEGWASEQDM4CCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUGnz4CAAGotAABHDbYBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGWASEQDM4CCyAAQQA2AgAgEEEBaiEBQQshEAyzAQsCQCAEIAJHDQBBlwEhEAzNAgsCQAJAAkACQCAELQAAQVNqDiMAuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AQG4AbgBuAG4AbgBArgBuAG4AQO4AQsgBEEBaiEBQfsAIRAMtgILIARBAWohAUH8ACEQDLUCCyAEQQFqIQRBgQEhEAy0AgsgBEEBaiEEQYIBIRAMswILAkAgBCACRw0AQZgBIRAMzAILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQanPgIAAai0AAEcNtAEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZgBIRAMzAILIABBADYCACAQQQFqIQFBGSEQDLEBCwJAIAQgAkcNAEGZASEQDMsCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGuz4CAAGotAABHDbMBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGZASEQDMsCCyAAQQA2AgAgEEEBaiEBQQYhEAywAQsCQCAEIAJHDQBBmgEhEAzKAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBtM+AgABqLQAARw2yASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmgEhEAzKAgsgAEEANgIAIBBBAWohAUEcIRAMrwELAkAgBCACRw0AQZsBIRAMyQILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbbPgIAAai0AAEcNsQEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZsBIRAMyQILIABBADYCACAQQQFqIQFBJyEQDK4BCwJAIAQgAkcNAEGcASEQDMgCCwJAAkAgBC0AAEGsf2oOAgABsQELIARBAWohBEGGASEQDK8CCyAEQQFqIQRBhwEhEAyuAgsCQCAEIAJHDQBBnQEhEAzHAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBuM+AgABqLQAARw2vASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBnQEhEAzHAgsgAEEANgIAIBBBAWohAUEmIRAMrAELAkAgBCACRw0AQZ4BIRAMxgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbrPgIAAai0AAEcNrgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ4BIRAMxgILIABBADYCACAQQQFqIQFBAyEQDKsBCwJAIAQgAkcNAEGfASEQDMUCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDa0BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGfASEQDMUCCyAAQQA2AgAgEEEBaiEBQQwhEAyqAQsCQCAEIAJHDQBBoAEhEAzEAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBvM+AgABqLQAARw2sASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBoAEhEAzEAgsgAEEANgIAIBBBAWohAUENIRAMqQELAkAgBCACRw0AQaEBIRAMwwILAkACQCAELQAAQbp/ag4LAKwBrAGsAawBrAGsAawBrAGsAQGsAQsgBEEBaiEEQYsBIRAMqgILIARBAWohBEGMASEQDKkCCwJAIAQgAkcNAEGiASEQDMICCyAELQAAQdAARw2pASAEQQFqIQQM6QELAkAgBCACRw0AQaMBIRAMwQILAkACQCAELQAAQbd/ag4HAaoBqgGqAaoBqgEAqgELIARBAWohBEGOASEQDKgCCyAEQQFqIQFBIiEQDKYBCwJAIAQgAkcNAEGkASEQDMACCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHAz4CAAGotAABHDagBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGkASEQDMACCyAAQQA2AgAgEEEBaiEBQR0hEAylAQsCQCAEIAJHDQBBpQEhEAy/AgsCQAJAIAQtAABBrn9qDgMAqAEBqAELIARBAWohBEGQASEQDKYCCyAEQQFqIQFBBCEQDKQBCwJAIAQgAkcNAEGmASEQDL4CCwJAAkACQAJAAkAgBC0AAEG/f2oOFQCqAaoBqgGqAaoBqgGqAaoBqgGqAQGqAaoBAqoBqgEDqgGqAQSqAQsgBEEBaiEEQYgBIRAMqAILIARBAWohBEGJASEQDKcCCyAEQQFqIQRBigEhEAymAgsgBEEBaiEEQY8BIRAMpQILIARBAWohBEGRASEQDKQCCwJAIAQgAkcNAEGnASEQDL0CCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDaUBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGnASEQDL0CCyAAQQA2AgAgEEEBaiEBQREhEAyiAQsCQCAEIAJHDQBBqAEhEAy8AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBws+AgABqLQAARw2kASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqAEhEAy8AgsgAEEANgIAIBBBAWohAUEsIRAMoQELAkAgBCACRw0AQakBIRAMuwILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQcXPgIAAai0AAEcNowEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQakBIRAMuwILIABBADYCACAQQQFqIQFBKyEQDKABCwJAIAQgAkcNAEGqASEQDLoCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHKz4CAAGotAABHDaIBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGqASEQDLoCCyAAQQA2AgAgEEEBaiEBQRQhEAyfAQsCQCAEIAJHDQBBqwEhEAy5AgsCQAJAAkACQCAELQAAQb5/ag4PAAECpAGkAaQBpAGkAaQBpAGkAaQBpAGkAQOkAQsgBEEBaiEEQZMBIRAMogILIARBAWohBEGUASEQDKECCyAEQQFqIQRBlQEhEAygAgsgBEEBaiEEQZYBIRAMnwILAkAgBCACRw0AQawBIRAMuAILIAQtAABBxQBHDZ8BIARBAWohBAzgAQsCQCAEIAJHDQBBrQEhEAy3AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBzc+AgABqLQAARw2fASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrQEhEAy3AgsgAEEANgIAIBBBAWohAUEOIRAMnAELAkAgBCACRw0AQa4BIRAMtgILIAQtAABB0ABHDZ0BIARBAWohAUElIRAMmwELAkAgBCACRw0AQa8BIRAMtQILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNnQEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQa8BIRAMtQILIABBADYCACAQQQFqIQFBKiEQDJoBCwJAIAQgAkcNAEGwASEQDLQCCwJAAkAgBC0AAEGrf2oOCwCdAZ0BnQGdAZ0BnQGdAZ0BnQEBnQELIARBAWohBEGaASEQDJsCCyAEQQFqIQRBmwEhEAyaAgsCQCAEIAJHDQBBsQEhEAyzAgsCQAJAIAQtAABBv39qDhQAnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBAZwBCyAEQQFqIQRBmQEhEAyaAgsgBEEBaiEEQZwBIRAMmQILAkAgBCACRw0AQbIBIRAMsgILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQdnPgIAAai0AAEcNmgEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbIBIRAMsgILIABBADYCACAQQQFqIQFBISEQDJcBCwJAIAQgAkcNAEGzASEQDLECCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUHdz4CAAGotAABHDZkBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGzASEQDLECCyAAQQA2AgAgEEEBaiEBQRohEAyWAQsCQCAEIAJHDQBBtAEhEAywAgsCQAJAAkAgBC0AAEG7f2oOEQCaAZoBmgGaAZoBmgGaAZoBmgEBmgGaAZoBmgGaAQKaAQsgBEEBaiEEQZ0BIRAMmAILIARBAWohBEGeASEQDJcCCyAEQQFqIQRBnwEhEAyWAgsCQCAEIAJHDQBBtQEhEAyvAgsgAiAEayAAKAIAIgFqIRQgBCABa0EFaiEQAkADQCAELQAAIAFB5M+AgABqLQAARw2XASABQQVGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtQEhEAyvAgsgAEEANgIAIBBBAWohAUEoIRAMlAELAkAgBCACRw0AQbYBIRAMrgILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQerPgIAAai0AAEcNlgEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbYBIRAMrgILIABBADYCACAQQQFqIQFBByEQDJMBCwJAIAQgAkcNAEG3ASEQDK0CCwJAAkAgBC0AAEG7f2oODgCWAZYBlgGWAZYBlgGWAZYBlgGWAZYBlgEBlgELIARBAWohBEGhASEQDJQCCyAEQQFqIQRBogEhEAyTAgsCQCAEIAJHDQBBuAEhEAysAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB7c+AgABqLQAARw2UASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuAEhEAysAgsgAEEANgIAIBBBAWohAUESIRAMkQELAkAgBCACRw0AQbkBIRAMqwILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNkwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbkBIRAMqwILIABBADYCACAQQQFqIQFBICEQDJABCwJAIAQgAkcNAEG6ASEQDKoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHyz4CAAGotAABHDZIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG6ASEQDKoCCyAAQQA2AgAgEEEBaiEBQQ8hEAyPAQsCQCAEIAJHDQBBuwEhEAypAgsCQAJAIAQtAABBt39qDgcAkgGSAZIBkgGSAQGSAQsgBEEBaiEEQaUBIRAMkAILIARBAWohBEGmASEQDI8CCwJAIAQgAkcNAEG8ASEQDKgCCyACIARrIAAoAgAiAWohFCAEIAFrQQdqIRACQANAIAQtAAAgAUH0z4CAAGotAABHDZABIAFBB0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG8ASEQDKgCCyAAQQA2AgAgEEEBaiEBQRshEAyNAQsCQCAEIAJHDQBBvQEhEAynAgsCQAJAAkAgBC0AAEG+f2oOEgCRAZEBkQGRAZEBkQGRAZEBkQEBkQGRAZEBkQGRAZEBApEBCyAEQQFqIQRBpAEhEAyPAgsgBEEBaiEEQacBIRAMjgILIARBAWohBEGoASEQDI0CCwJAIAQgAkcNAEG+ASEQDKYCCyAELQAAQc4ARw2NASAEQQFqIQQMzwELAkAgBCACRw0AQb8BIRAMpQILAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBC0AAEG/f2oOFQABAgOcAQQFBpwBnAGcAQcICQoLnAEMDQ4PnAELIARBAWohAUHoACEQDJoCCyAEQQFqIQFB6QAhEAyZAgsgBEEBaiEBQe4AIRAMmAILIARBAWohAUHyACEQDJcCCyAEQQFqIQFB8wAhEAyWAgsgBEEBaiEBQfYAIRAMlQILIARBAWohAUH3ACEQDJQCCyAEQQFqIQFB+gAhEAyTAgsgBEEBaiEEQYMBIRAMkgILIARBAWohBEGEASEQDJECCyAEQQFqIQRBhQEhEAyQAgsgBEEBaiEEQZIBIRAMjwILIARBAWohBEGYASEQDI4CCyAEQQFqIQRBoAEhEAyNAgsgBEEBaiEEQaMBIRAMjAILIARBAWohBEGqASEQDIsCCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEGrASEQDIsCC0HAASEQDKMCCyAAIAUgAhCqgICAACIBDYsBIAUhAQxcCwJAIAYgAkYNACAGQQFqIQUMjQELQcIBIRAMoQILA0ACQCAQLQAAQXZqDgSMAQAAjwEACyAQQQFqIhAgAkcNAAtBwwEhEAygAgsCQCAHIAJGDQAgAEGRgICAADYCCCAAIAc2AgQgByEBQQEhEAyHAgtBxAEhEAyfAgsCQCAHIAJHDQBBxQEhEAyfAgsCQAJAIActAABBdmoOBAHOAc4BAM4BCyAHQQFqIQYMjQELIAdBAWohBQyJAQsCQCAHIAJHDQBBxgEhEAyeAgsCQAJAIActAABBdmoOFwGPAY8BAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAQCPAQsgB0EBaiEHC0GwASEQDIQCCwJAIAggAkcNAEHIASEQDJ0CCyAILQAAQSBHDY0BIABBADsBMiAIQQFqIQFBswEhEAyDAgsgASEXAkADQCAXIgcgAkYNASAHLQAAQVBqQf8BcSIQQQpPDcwBAkAgAC8BMiIUQZkzSw0AIAAgFEEKbCIUOwEyIBBB//8DcyAUQf7/A3FJDQAgB0EBaiEXIAAgFCAQaiIQOwEyIBBB//8DcUHoB0kNAQsLQQAhECAAQQA2AhwgAEHBiYCAADYCECAAQQ02AgwgACAHQQFqNgIUDJwCC0HHASEQDJsCCyAAIAggAhCugICAACIQRQ3KASAQQRVHDYwBIABByAE2AhwgACAINgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAyaAgsCQCAJIAJHDQBBzAEhEAyaAgtBACEUQQEhF0EBIRZBACEQAkACQAJAAkACQAJAAkACQAJAIAktAABBUGoOCpYBlQEAAQIDBAUGCJcBC0ECIRAMBgtBAyEQDAULQQQhEAwEC0EFIRAMAwtBBiEQDAILQQchEAwBC0EIIRALQQAhF0EAIRZBACEUDI4BC0EJIRBBASEUQQAhF0EAIRYMjQELAkAgCiACRw0AQc4BIRAMmQILIAotAABBLkcNjgEgCkEBaiEJDMoBCyALIAJHDY4BQdABIRAMlwILAkAgCyACRg0AIABBjoCAgAA2AgggACALNgIEQbcBIRAM/gELQdEBIRAMlgILAkAgBCACRw0AQdIBIRAMlgILIAIgBGsgACgCACIQaiEUIAQgEGtBBGohCwNAIAQtAAAgEEH8z4CAAGotAABHDY4BIBBBBEYN6QEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB0gEhEAyVAgsgACAMIAIQrICAgAAiAQ2NASAMIQEMuAELAkAgBCACRw0AQdQBIRAMlAILIAIgBGsgACgCACIQaiEUIAQgEGtBAWohDANAIAQtAAAgEEGB0ICAAGotAABHDY8BIBBBAUYNjgEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB1AEhEAyTAgsCQCAEIAJHDQBB1gEhEAyTAgsgAiAEayAAKAIAIhBqIRQgBCAQa0ECaiELA0AgBC0AACAQQYPQgIAAai0AAEcNjgEgEEECRg2QASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHWASEQDJICCwJAIAQgAkcNAEHXASEQDJICCwJAAkAgBC0AAEG7f2oOEACPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAY8BCyAEQQFqIQRBuwEhEAz5AQsgBEEBaiEEQbwBIRAM+AELAkAgBCACRw0AQdgBIRAMkQILIAQtAABByABHDYwBIARBAWohBAzEAQsCQCAEIAJGDQAgAEGQgICAADYCCCAAIAQ2AgRBvgEhEAz3AQtB2QEhEAyPAgsCQCAEIAJHDQBB2gEhEAyPAgsgBC0AAEHIAEYNwwEgAEEBOgAoDLkBCyAAQQI6AC8gACAEIAIQpoCAgAAiEA2NAUHCASEQDPQBCyAALQAoQX9qDgK3AbkBuAELA0ACQCAELQAAQXZqDgQAjgGOAQCOAQsgBEEBaiIEIAJHDQALQd0BIRAMiwILIABBADoALyAALQAtQQRxRQ2EAgsgAEEAOgAvIABBAToANCABIQEMjAELIBBBFUYN2gEgAEEANgIcIAAgATYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMiAILAkAgACAQIAIQtICAgAAiBA0AIBAhAQyBAgsCQCAEQRVHDQAgAEEDNgIcIAAgEDYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMiAILIABBADYCHCAAIBA2AhQgAEGnjoCAADYCECAAQRI2AgxBACEQDIcCCyAQQRVGDdYBIABBADYCHCAAIAE2AhQgAEHajYCAADYCECAAQRQ2AgxBACEQDIYCCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNjQEgAEEHNgIcIAAgEDYCFCAAIBQ2AgxBACEQDIUCCyAAIAAvATBBgAFyOwEwIAEhAQtBKiEQDOoBCyAQQRVGDdEBIABBADYCHCAAIAE2AhQgAEGDjICAADYCECAAQRM2AgxBACEQDIICCyAQQRVGDc8BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDIECCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyNAQsgAEEMNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDIACCyAQQRVGDcwBIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDP8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyMAQsgAEENNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDP4BCyAQQRVGDckBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDP0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyLAQsgAEEONgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPwBCyAAQQA2AhwgACABNgIUIABBwJWAgAA2AhAgAEECNgIMQQAhEAz7AQsgEEEVRg3FASAAQQA2AhwgACABNgIUIABBxoyAgAA2AhAgAEEjNgIMQQAhEAz6AQsgAEEQNgIcIAAgATYCFCAAIBA2AgxBACEQDPkBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQzxAQsgAEERNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPgBCyAQQRVGDcEBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPcBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyIAQsgAEETNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPYBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQztAQsgAEEUNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPUBCyAQQRVGDb0BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDPQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyGAQsgAEEWNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPMBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQt4CAgAAiBA0AIAFBAWohAQzpAQsgAEEXNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPIBCyAAQQA2AhwgACABNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzxAQtCASERCyAQQQFqIQECQCAAKQMgIhJC//////////8PVg0AIAAgEkIEhiARhDcDICABIQEMhAELIABBADYCHCAAIAE2AhQgAEGtiYCAADYCECAAQQw2AgxBACEQDO8BCyAAQQA2AhwgACAQNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzuAQsgACgCBCEXIABBADYCBCAQIBGnaiIWIQEgACAXIBAgFiAUGyIQELWAgIAAIhRFDXMgAEEFNgIcIAAgEDYCFCAAIBQ2AgxBACEQDO0BCyAAQQA2AhwgACAQNgIUIABBqpyAgAA2AhAgAEEPNgIMQQAhEAzsAQsgACAQIAIQtICAgAAiAQ0BIBAhAQtBDiEQDNEBCwJAIAFBFUcNACAAQQI2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAzqAQsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAM6QELIAFBAWohEAJAIAAvATAiAUGAAXFFDQACQCAAIBAgAhC7gICAACIBDQAgECEBDHALIAFBFUcNugEgAEEFNgIcIAAgEDYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAM6QELAkAgAUGgBHFBoARHDQAgAC0ALUECcQ0AIABBADYCHCAAIBA2AhQgAEGWk4CAADYCECAAQQQ2AgxBACEQDOkBCyAAIBAgAhC9gICAABogECEBAkACQAJAAkACQCAAIBAgAhCzgICAAA4WAgEABAQEBAQEBAQEBAQEBAQEBAQEAwQLIABBAToALgsgACAALwEwQcAAcjsBMCAQIQELQSYhEAzRAQsgAEEjNgIcIAAgEDYCFCAAQaWWgIAANgIQIABBFTYCDEEAIRAM6QELIABBADYCHCAAIBA2AhQgAEHVi4CAADYCECAAQRE2AgxBACEQDOgBCyAALQAtQQFxRQ0BQcMBIRAMzgELAkAgDSACRg0AA0ACQCANLQAAQSBGDQAgDSEBDMQBCyANQQFqIg0gAkcNAAtBJSEQDOcBC0ElIRAM5gELIAAoAgQhBCAAQQA2AgQgACAEIA0Qr4CAgAAiBEUNrQEgAEEmNgIcIAAgBDYCDCAAIA1BAWo2AhRBACEQDOUBCyAQQRVGDasBIABBADYCHCAAIAE2AhQgAEH9jYCAADYCECAAQR02AgxBACEQDOQBCyAAQSc2AhwgACABNgIUIAAgEDYCDEEAIRAM4wELIBAhAUEBIRQCQAJAAkACQAJAAkACQCAALQAsQX5qDgcGBQUDAQIABQsgACAALwEwQQhyOwEwDAMLQQIhFAwBC0EEIRQLIABBAToALCAAIAAvATAgFHI7ATALIBAhAQtBKyEQDMoBCyAAQQA2AhwgACAQNgIUIABBq5KAgAA2AhAgAEELNgIMQQAhEAziAQsgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDEEAIRAM4QELIABBADoALCAQIQEMvQELIBAhAUEBIRQCQAJAAkACQAJAIAAtACxBe2oOBAMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0EpIRAMxQELIABBADYCHCAAIAE2AhQgAEHwlICAADYCECAAQQM2AgxBACEQDN0BCwJAIA4tAABBDUcNACAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA5BAWohAQx1CyAAQSw2AhwgACABNgIMIAAgDkEBajYCFEEAIRAM3QELIAAtAC1BAXFFDQFBxAEhEAzDAQsCQCAOIAJHDQBBLSEQDNwBCwJAAkADQAJAIA4tAABBdmoOBAIAAAMACyAOQQFqIg4gAkcNAAtBLSEQDN0BCyAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA4hAQx0CyAAQSw2AhwgACAONgIUIAAgATYCDEEAIRAM3AELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHMLIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzbAQsgACgCBCEEIABBADYCBCAAIAQgDhCxgICAACIEDaABIA4hAQzOAQsgEEEsRw0BIAFBAWohEEEBIQECQAJAAkACQAJAIAAtACxBe2oOBAMBAgQACyAQIQEMBAtBAiEBDAELQQQhAQsgAEEBOgAsIAAgAC8BMCABcjsBMCAQIQEMAQsgACAALwEwQQhyOwEwIBAhAQtBOSEQDL8BCyAAQQA6ACwgASEBC0E0IRAMvQELIAAgAC8BMEEgcjsBMCABIQEMAgsgACgCBCEEIABBADYCBAJAIAAgBCABELGAgIAAIgQNACABIQEMxwELIABBNzYCHCAAIAE2AhQgACAENgIMQQAhEAzUAQsgAEEIOgAsIAEhAQtBMCEQDLkBCwJAIAAtAChBAUYNACABIQEMBAsgAC0ALUEIcUUNkwEgASEBDAMLIAAtADBBIHENlAFBxQEhEAy3AQsCQCAPIAJGDQACQANAAkAgDy0AAEFQaiIBQf8BcUEKSQ0AIA8hAUE1IRAMugELIAApAyAiEUKZs+bMmbPmzBlWDQEgACARQgp+IhE3AyAgESABrUL/AYMiEkJ/hVYNASAAIBEgEnw3AyAgD0EBaiIPIAJHDQALQTkhEAzRAQsgACgCBCECIABBADYCBCAAIAIgD0EBaiIEELGAgIAAIgINlQEgBCEBDMMBC0E5IRAMzwELAkAgAC8BMCIBQQhxRQ0AIAAtAChBAUcNACAALQAtQQhxRQ2QAQsgACABQff7A3FBgARyOwEwIA8hAQtBNyEQDLQBCyAAIAAvATBBEHI7ATAMqwELIBBBFUYNiwEgAEEANgIcIAAgATYCFCAAQfCOgIAANgIQIABBHDYCDEEAIRAMywELIABBwwA2AhwgACABNgIMIAAgDUEBajYCFEEAIRAMygELAkAgAS0AAEE6Rw0AIAAoAgQhECAAQQA2AgQCQCAAIBAgARCvgICAACIQDQAgAUEBaiEBDGMLIABBwwA2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMygELIABBADYCHCAAIAE2AhQgAEGxkYCAADYCECAAQQo2AgxBACEQDMkBCyAAQQA2AhwgACABNgIUIABBoJmAgAA2AhAgAEEeNgIMQQAhEAzIAQsgAEEANgIACyAAQYASOwEqIAAgF0EBaiIBIAIQqICAgAAiEA0BIAEhAQtBxwAhEAysAQsgEEEVRw2DASAAQdEANgIcIAAgATYCFCAAQeOXgIAANgIQIABBFTYCDEEAIRAMxAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDF4LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMwwELIABBADYCHCAAIBQ2AhQgAEHBqICAADYCECAAQQc2AgwgAEEANgIAQQAhEAzCAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAzBAQtBACEQIABBADYCHCAAIAE2AhQgAEGAkYCAADYCECAAQQk2AgwMwAELIBBBFUYNfSAAQQA2AhwgACABNgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAy/AQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgAUEBaiEBAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBAJAIAAgECABEK2AgIAAIhANACABIQEMXAsgAEHYADYCHCAAIAE2AhQgACAQNgIMQQAhEAy+AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMrQELIABB2QA2AhwgACABNgIUIAAgBDYCDEEAIRAMvQELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKsBCyAAQdoANgIcIAAgATYCFCAAIAQ2AgxBACEQDLwBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQypAQsgAEHcADYCHCAAIAE2AhQgACAENgIMQQAhEAy7AQsCQCABLQAAQVBqIhBB/wFxQQpPDQAgACAQOgAqIAFBAWohAUHPACEQDKIBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQynAQsgAEHeADYCHCAAIAE2AhQgACAENgIMQQAhEAy6AQsgAEEANgIAIBdBAWohAQJAIAAtAClBI08NACABIQEMWQsgAEEANgIcIAAgATYCFCAAQdOJgIAANgIQIABBCDYCDEEAIRAMuQELIABBADYCAAtBACEQIABBADYCHCAAIAE2AhQgAEGQs4CAADYCECAAQQg2AgwMtwELIABBADYCACAXQQFqIQECQCAALQApQSFHDQAgASEBDFYLIABBADYCHCAAIAE2AhQgAEGbioCAADYCECAAQQg2AgxBACEQDLYBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKSIQQV1qQQtPDQAgASEBDFULAkAgEEEGSw0AQQEgEHRBygBxRQ0AIAEhAQxVC0EAIRAgAEEANgIcIAAgATYCFCAAQfeJgIAANgIQIABBCDYCDAy1AQsgEEEVRg1xIABBADYCHCAAIAE2AhQgAEG5jYCAADYCECAAQRo2AgxBACEQDLQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxUCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLMBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAUNgIUIAAgATYCDEEAIRAMogELIABBADYCHCAAIBQ2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKEBCyAAQQA2AhwgACABNgIUIABBw4+AgAA2AhAgAEEHNgIMQQAhEAygAQtBACEQIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgwMnwELIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgxBACEQDJ4BCyAAQQA2AhwgACAUNgIUIABB/pGAgAA2AhAgAEEHNgIMQQAhEAydAQsgAEEANgIcIAAgATYCFCAAQY6bgIAANgIQIABBBjYCDEEAIRAMnAELIBBBFUYNVyAAQQA2AhwgACABNgIUIABBzI6AgAA2AhAgAEEgNgIMQQAhEAybAQsgAEEANgIAIBBBAWohAUEkIRALIAAgEDoAKSAAKAIEIRAgAEEANgIEIAAgECABEKuAgIAAIhANVCABIQEMPgsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQfGbgIAANgIQIABBBjYCDAyXAQsgAUEVRg1QIABBADYCHCAAIAU2AhQgAEHwjICAADYCECAAQRs2AgxBACEQDJYBCyAAKAIEIQUgAEEANgIEIAAgBSAQEKmAgIAAIgUNASAQQQFqIQULQa0BIRAMewsgAEHBATYCHCAAIAU2AgwgACAQQQFqNgIUQQAhEAyTAQsgACgCBCEGIABBADYCBCAAIAYgEBCpgICAACIGDQEgEEEBaiEGC0GuASEQDHgLIABBwgE2AhwgACAGNgIMIAAgEEEBajYCFEEAIRAMkAELIABBADYCHCAAIAc2AhQgAEGXi4CAADYCECAAQQ02AgxBACEQDI8BCyAAQQA2AhwgACAINgIUIABB45CAgAA2AhAgAEEJNgIMQQAhEAyOAQsgAEEANgIcIAAgCDYCFCAAQZSNgIAANgIQIABBITYCDEEAIRAMjQELQQEhFkEAIRdBACEUQQEhEAsgACAQOgArIAlBAWohCAJAAkAgAC0ALUEQcQ0AAkACQAJAIAAtACoOAwEAAgQLIBZFDQMMAgsgFA0BDAILIBdFDQELIAAoAgQhECAAQQA2AgQgACAQIAgQrYCAgAAiEEUNPSAAQckBNgIcIAAgCDYCFCAAIBA2AgxBACEQDIwBCyAAKAIEIQQgAEEANgIEIAAgBCAIEK2AgIAAIgRFDXYgAEHKATYCHCAAIAg2AhQgACAENgIMQQAhEAyLAQsgACgCBCEEIABBADYCBCAAIAQgCRCtgICAACIERQ10IABBywE2AhwgACAJNgIUIAAgBDYCDEEAIRAMigELIAAoAgQhBCAAQQA2AgQgACAEIAoQrYCAgAAiBEUNciAAQc0BNgIcIAAgCjYCFCAAIAQ2AgxBACEQDIkBCwJAIAstAABBUGoiEEH/AXFBCk8NACAAIBA6ACogC0EBaiEKQbYBIRAMcAsgACgCBCEEIABBADYCBCAAIAQgCxCtgICAACIERQ1wIABBzwE2AhwgACALNgIUIAAgBDYCDEEAIRAMiAELIABBADYCHCAAIAQ2AhQgAEGQs4CAADYCECAAQQg2AgwgAEEANgIAQQAhEAyHAQsgAUEVRg0/IABBADYCHCAAIAw2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDIYBCyAAQYEEOwEoIAAoAgQhECAAQgA3AwAgACAQIAxBAWoiDBCrgICAACIQRQ04IABB0wE2AhwgACAMNgIUIAAgEDYCDEEAIRAMhQELIABBADYCAAtBACEQIABBADYCHCAAIAQ2AhQgAEHYm4CAADYCECAAQQg2AgwMgwELIAAoAgQhECAAQgA3AwAgACAQIAtBAWoiCxCrgICAACIQDQFBxgEhEAxpCyAAQQI6ACgMVQsgAEHVATYCHCAAIAs2AhQgACAQNgIMQQAhEAyAAQsgEEEVRg03IABBADYCHCAAIAQ2AhQgAEGkjICAADYCECAAQRA2AgxBACEQDH8LIAAtADRBAUcNNCAAIAQgAhC8gICAACIQRQ00IBBBFUcNNSAAQdwBNgIcIAAgBDYCFCAAQdWWgIAANgIQIABBFTYCDEEAIRAMfgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQMfQtBACEQDGMLQQIhEAxiC0ENIRAMYQtBDyEQDGALQSUhEAxfC0ETIRAMXgtBFSEQDF0LQRYhEAxcC0EXIRAMWwtBGCEQDFoLQRkhEAxZC0EaIRAMWAtBGyEQDFcLQRwhEAxWC0EdIRAMVQtBHyEQDFQLQSEhEAxTC0EjIRAMUgtBxgAhEAxRC0EuIRAMUAtBLyEQDE8LQTshEAxOC0E9IRAMTQtByAAhEAxMC0HJACEQDEsLQcsAIRAMSgtBzAAhEAxJC0HOACEQDEgLQdEAIRAMRwtB1QAhEAxGC0HYACEQDEULQdkAIRAMRAtB2wAhEAxDC0HkACEQDEILQeUAIRAMQQtB8QAhEAxAC0H0ACEQDD8LQY0BIRAMPgtBlwEhEAw9C0GpASEQDDwLQawBIRAMOwtBwAEhEAw6C0G5ASEQDDkLQa8BIRAMOAtBsQEhEAw3C0GyASEQDDYLQbQBIRAMNQtBtQEhEAw0C0G6ASEQDDMLQb0BIRAMMgtBvwEhEAwxC0HBASEQDDALIABBADYCHCAAIAQ2AhQgAEHpi4CAADYCECAAQR82AgxBACEQDEgLIABB2wE2AhwgACAENgIUIABB+paAgAA2AhAgAEEVNgIMQQAhEAxHCyAAQfgANgIcIAAgDDYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMRgsgAEHRADYCHCAAIAU2AhQgAEGwl4CAADYCECAAQRU2AgxBACEQDEULIABB+QA2AhwgACABNgIUIAAgEDYCDEEAIRAMRAsgAEH4ADYCHCAAIAE2AhQgAEHKmICAADYCECAAQRU2AgxBACEQDEMLIABB5AA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAxCCyAAQdcANgIcIAAgATYCFCAAQcmXgIAANgIQIABBFTYCDEEAIRAMQQsgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMQAsgAEHCADYCHCAAIAE2AhQgAEHjmICAADYCECAAQRU2AgxBACEQDD8LIABBADYCBCAAIA8gDxCxgICAACIERQ0BIABBOjYCHCAAIAQ2AgwgACAPQQFqNgIUQQAhEAw+CyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBEUNACAAQTs2AhwgACAENgIMIAAgAUEBajYCFEEAIRAMPgsgAUEBaiEBDC0LIA9BAWohAQwtCyAAQQA2AhwgACAPNgIUIABB5JKAgAA2AhAgAEEENgIMQQAhEAw7CyAAQTY2AhwgACAENgIUIAAgAjYCDEEAIRAMOgsgAEEuNgIcIAAgDjYCFCAAIAQ2AgxBACEQDDkLIABB0AA2AhwgACABNgIUIABBkZiAgAA2AhAgAEEVNgIMQQAhEAw4CyANQQFqIQEMLAsgAEEVNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMNgsgAEEbNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNQsgAEEPNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNAsgAEELNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMMwsgAEEaNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMgsgAEELNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMQsgAEEKNgIcIAAgATYCFCAAQeSWgIAANgIQIABBFTYCDEEAIRAMMAsgAEEeNgIcIAAgATYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAMLwsgAEEANgIcIAAgEDYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMLgsgAEEENgIcIAAgATYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMLQsgAEEANgIAIAtBAWohCwtBuAEhEAwSCyAAQQA2AgAgEEEBaiEBQfUAIRAMEQsgASEBAkAgAC0AKUEFRw0AQeMAIRAMEQtB4gAhEAwQC0EAIRAgAEEANgIcIABB5JGAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAwoCyAAQQA2AgAgF0EBaiEBQcAAIRAMDgtBASEBCyAAIAE6ACwgAEEANgIAIBdBAWohAQtBKCEQDAsLIAEhAQtBOCEQDAkLAkAgASIPIAJGDQADQAJAIA8tAABBgL6AgABqLQAAIgFBAUYNACABQQJHDQMgD0EBaiEBDAQLIA9BAWoiDyACRw0AC0E+IRAMIgtBPiEQDCELIABBADoALCAPIQEMAQtBCyEQDAYLQTohEAwFCyABQQFqIQFBLSEQDAQLIAAgAToALCAAQQA2AgAgFkEBaiEBQQwhEAwDCyAAQQA2AgAgF0EBaiEBQQohEAwCCyAAQQA2AgALIABBADoALCANIQFBCSEQDAALC0EAIRAgAEEANgIcIAAgCzYCFCAAQc2QgIAANgIQIABBCTYCDAwXC0EAIRAgAEEANgIcIAAgCjYCFCAAQemKgIAANgIQIABBCTYCDAwWC0EAIRAgAEEANgIcIAAgCTYCFCAAQbeQgIAANgIQIABBCTYCDAwVC0EAIRAgAEEANgIcIAAgCDYCFCAAQZyRgIAANgIQIABBCTYCDAwUC0EAIRAgAEEANgIcIAAgATYCFCAAQc2QgIAANgIQIABBCTYCDAwTC0EAIRAgAEEANgIcIAAgATYCFCAAQemKgIAANgIQIABBCTYCDAwSC0EAIRAgAEEANgIcIAAgATYCFCAAQbeQgIAANgIQIABBCTYCDAwRC0EAIRAgAEEANgIcIAAgATYCFCAAQZyRgIAANgIQIABBCTYCDAwQC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwPC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwOC0EAIRAgAEEANgIcIAAgATYCFCAAQcCSgIAANgIQIABBCzYCDAwNC0EAIRAgAEEANgIcIAAgATYCFCAAQZWJgIAANgIQIABBCzYCDAwMC0EAIRAgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDAwLC0EAIRAgAEEANgIcIAAgATYCFCAAQfuPgIAANgIQIABBCjYCDAwKC0EAIRAgAEEANgIcIAAgATYCFCAAQfGZgIAANgIQIABBAjYCDAwJC0EAIRAgAEEANgIcIAAgATYCFCAAQcSUgIAANgIQIABBAjYCDAwIC0EAIRAgAEEANgIcIAAgATYCFCAAQfKVgIAANgIQIABBAjYCDAwHCyAAQQI2AhwgACABNgIUIABBnJqAgAA2AhAgAEEWNgIMQQAhEAwGC0EBIRAMBQtB1AAhECABIgQgAkYNBCADQQhqIAAgBCACQdjCgIAAQQoQxYCAgAAgAygCDCEEIAMoAggOAwEEAgALEMqAgIAAAAsgAEEANgIcIABBtZqAgAA2AhAgAEEXNgIMIAAgBEEBajYCFEEAIRAMAgsgAEEANgIcIAAgBDYCFCAAQcqagIAANgIQIABBCTYCDEEAIRAMAQsCQCABIgQgAkcNAEEiIRAMAQsgAEGJgICAADYCCCAAIAQ2AgRBISEQCyADQRBqJICAgIAAIBALrwEBAn8gASgCACEGAkACQCACIANGDQAgBCAGaiEEIAYgA2ogAmshByACIAZBf3MgBWoiBmohBQNAAkAgAi0AACAELQAARg0AQQIhBAwDCwJAIAYNAEEAIQQgBSECDAMLIAZBf2ohBiAEQQFqIQQgAkEBaiICIANHDQALIAchBiADIQILIABBATYCACABIAY2AgAgACACNgIEDwsgAUEANgIAIAAgBDYCACAAIAI2AgQLCgAgABDHgICAAAvyNgELfyOAgICAAEEQayIBJICAgIAAAkBBACgCoNCAgAANAEEAEMuAgIAAQYDUhIAAayICQdkASQ0AQQAhAwJAQQAoAuDTgIAAIgQNAEEAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEIakFwcUHYqtWqBXMiBDYC4NOAgABBAEEANgL004CAAEEAQQA2AsTTgIAAC0EAIAI2AszTgIAAQQBBgNSEgAA2AsjTgIAAQQBBgNSEgAA2ApjQgIAAQQAgBDYCrNCAgABBAEF/NgKo0ICAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALQYDUhIAAQXhBgNSEgABrQQ9xQQBBgNSEgABBCGpBD3EbIgNqIgRBBGogAkFIaiIFIANrIgNBAXI2AgBBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAQYDUhIAAIAVqQTg2AgQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFLDQACQEEAKAKI0ICAACIGQRAgAEETakFwcSAAQQtJGyICQQN2IgR2IgNBA3FFDQACQAJAIANBAXEgBHJBAXMiBUEDdCIEQbDQgIAAaiIDIARBuNCAgABqKAIAIgQoAggiAkcNAEEAIAZBfiAFd3E2AojQgIAADAELIAMgAjYCCCACIAM2AgwLIARBCGohAyAEIAVBA3QiBUEDcjYCBCAEIAVqIgQgBCgCBEEBcjYCBAwMCyACQQAoApDQgIAAIgdNDQECQCADRQ0AAkACQCADIAR0QQIgBHQiA0EAIANrcnEiA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqIgRBA3QiA0Gw0ICAAGoiBSADQbjQgIAAaigCACIDKAIIIgBHDQBBACAGQX4gBHdxIgY2AojQgIAADAELIAUgADYCCCAAIAU2AgwLIAMgAkEDcjYCBCADIARBA3QiBGogBCACayIFNgIAIAMgAmoiACAFQQFyNgIEAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQQCQAJAIAZBASAHQQN2dCIIcQ0AQQAgBiAIcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCAENgIMIAIgBDYCCCAEIAI2AgwgBCAINgIICyADQQhqIQNBACAANgKc0ICAAEEAIAU2ApDQgIAADAwLQQAoAozQgIAAIglFDQEgCUEAIAlrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqQQJ0QbjSgIAAaigCACIAKAIEQXhxIAJrIQQgACEFAkADQAJAIAUoAhAiAw0AIAVBFGooAgAiA0UNAgsgAygCBEF4cSACayIFIAQgBSAESSIFGyEEIAMgACAFGyEAIAMhBQwACwsgACgCGCEKAkAgACgCDCIIIABGDQAgACgCCCIDQQAoApjQgIAASRogCCADNgIIIAMgCDYCDAwLCwJAIABBFGoiBSgCACIDDQAgACgCECIDRQ0DIABBEGohBQsDQCAFIQsgAyIIQRRqIgUoAgAiAw0AIAhBEGohBSAIKAIQIgMNAAsgC0EANgIADAoLQX8hAiAAQb9/Sw0AIABBE2oiA0FwcSECQQAoAozQgIAAIgdFDQBBACELAkAgAkGAAkkNAEEfIQsgAkH///8HSw0AIANBCHYiAyADQYD+P2pBEHZBCHEiA3QiBCAEQYDgH2pBEHZBBHEiBHQiBSAFQYCAD2pBEHZBAnEiBXRBD3YgAyAEciAFcmsiA0EBdCACIANBFWp2QQFxckEcaiELC0EAIAJrIQQCQAJAAkACQCALQQJ0QbjSgIAAaigCACIFDQBBACEDQQAhCAwBC0EAIQMgAkEAQRkgC0EBdmsgC0EfRht0IQBBACEIA0ACQCAFKAIEQXhxIAJrIgYgBE8NACAGIQQgBSEIIAYNAEEAIQQgBSEIIAUhAwwDCyADIAVBFGooAgAiBiAGIAUgAEEddkEEcWpBEGooAgAiBUYbIAMgBhshAyAAQQF0IQAgBQ0ACwsCQCADIAhyDQBBACEIQQIgC3QiA0EAIANrciAHcSIDRQ0DIANBACADa3FBf2oiAyADQQx2QRBxIgN2IgVBBXZBCHEiACADciAFIAB2IgNBAnZBBHEiBXIgAyAFdiIDQQF2QQJxIgVyIAMgBXYiA0EBdkEBcSIFciADIAV2akECdEG40oCAAGooAgAhAwsgA0UNAQsDQCADKAIEQXhxIAJrIgYgBEkhAAJAIAMoAhAiBQ0AIANBFGooAgAhBQsgBiAEIAAbIQQgAyAIIAAbIQggBSEDIAUNAAsLIAhFDQAgBEEAKAKQ0ICAACACa08NACAIKAIYIQsCQCAIKAIMIgAgCEYNACAIKAIIIgNBACgCmNCAgABJGiAAIAM2AgggAyAANgIMDAkLAkAgCEEUaiIFKAIAIgMNACAIKAIQIgNFDQMgCEEQaiEFCwNAIAUhBiADIgBBFGoiBSgCACIDDQAgAEEQaiEFIAAoAhAiAw0ACyAGQQA2AgAMCAsCQEEAKAKQ0ICAACIDIAJJDQBBACgCnNCAgAAhBAJAAkAgAyACayIFQRBJDQAgBCACaiIAIAVBAXI2AgRBACAFNgKQ0ICAAEEAIAA2ApzQgIAAIAQgA2ogBTYCACAEIAJBA3I2AgQMAQsgBCADQQNyNgIEIAQgA2oiAyADKAIEQQFyNgIEQQBBADYCnNCAgABBAEEANgKQ0ICAAAsgBEEIaiEDDAoLAkBBACgClNCAgAAiACACTQ0AQQAoAqDQgIAAIgMgAmoiBCAAIAJrIgVBAXI2AgRBACAFNgKU0ICAAEEAIAQ2AqDQgIAAIAMgAkEDcjYCBCADQQhqIQMMCgsCQAJAQQAoAuDTgIAARQ0AQQAoAujTgIAAIQQMAQtBAEJ/NwLs04CAAEEAQoCAhICAgMAANwLk04CAAEEAIAFBDGpBcHFB2KrVqgVzNgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgABBgIAEIQQLQQAhAwJAIAQgAkHHAGoiB2oiBkEAIARrIgtxIgggAksNAEEAQTA2AvjTgIAADAoLAkBBACgCwNOAgAAiA0UNAAJAQQAoArjTgIAAIgQgCGoiBSAETQ0AIAUgA00NAQtBACEDQQBBMDYC+NOAgAAMCgtBAC0AxNOAgABBBHENBAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQAJAIAMoAgAiBSAESw0AIAUgAygCBGogBEsNAwsgAygCCCIDDQALC0EAEMuAgIAAIgBBf0YNBSAIIQYCQEEAKALk04CAACIDQX9qIgQgAHFFDQAgCCAAayAEIABqQQAgA2txaiEGCyAGIAJNDQUgBkH+////B0sNBQJAQQAoAsDTgIAAIgNFDQBBACgCuNOAgAAiBCAGaiIFIARNDQYgBSADSw0GCyAGEMuAgIAAIgMgAEcNAQwHCyAGIABrIAtxIgZB/v///wdLDQQgBhDLgICAACIAIAMoAgAgAygCBGpGDQMgACEDCwJAIANBf0YNACACQcgAaiAGTQ0AAkAgByAGa0EAKALo04CAACIEakEAIARrcSIEQf7///8HTQ0AIAMhAAwHCwJAIAQQy4CAgABBf0YNACAEIAZqIQYgAyEADAcLQQAgBmsQy4CAgAAaDAQLIAMhACADQX9HDQUMAwtBACEIDAcLQQAhAAwFCyAAQX9HDQILQQBBACgCxNOAgABBBHI2AsTTgIAACyAIQf7///8HSw0BIAgQy4CAgAAhAEEAEMuAgIAAIQMgAEF/Rg0BIANBf0YNASAAIANPDQEgAyAAayIGIAJBOGpNDQELQQBBACgCuNOAgAAgBmoiAzYCuNOAgAACQCADQQAoArzTgIAATQ0AQQAgAzYCvNOAgAALAkACQAJAAkBBACgCoNCAgAAiBEUNAEHI04CAACEDA0AgACADKAIAIgUgAygCBCIIakYNAiADKAIIIgMNAAwDCwsCQAJAQQAoApjQgIAAIgNFDQAgACADTw0BC0EAIAA2ApjQgIAAC0EAIQNBACAGNgLM04CAAEEAIAA2AsjTgIAAQQBBfzYCqNCAgABBAEEAKALg04CAADYCrNCAgABBAEEANgLU04CAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgQgBkFIaiIFIANrIgNBAXI2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAIAAgBWpBODYCBAwCCyADLQAMQQhxDQAgBCAFSQ0AIAQgAE8NACAEQXggBGtBD3FBACAEQQhqQQ9xGyIFaiIAQQAoApTQgIAAIAZqIgsgBWsiBUEBcjYCBCADIAggBmo2AgRBAEEAKALw04CAADYCpNCAgABBACAFNgKU0ICAAEEAIAA2AqDQgIAAIAQgC2pBODYCBAwBCwJAIABBACgCmNCAgAAiCE8NAEEAIAA2ApjQgIAAIAAhCAsgACAGaiEFQcjTgIAAIQMCQAJAAkACQAJAAkACQANAIAMoAgAgBUYNASADKAIIIgMNAAwCCwsgAy0ADEEIcUUNAQtByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiIFIARLDQMLIAMoAgghAwwACwsgAyAANgIAIAMgAygCBCAGajYCBCAAQXggAGtBD3FBACAAQQhqQQ9xG2oiCyACQQNyNgIEIAVBeCAFa0EPcUEAIAVBCGpBD3EbaiIGIAsgAmoiAmshAwJAIAYgBEcNAEEAIAI2AqDQgIAAQQBBACgClNCAgAAgA2oiAzYClNCAgAAgAiADQQFyNgIEDAMLAkAgBkEAKAKc0ICAAEcNAEEAIAI2ApzQgIAAQQBBACgCkNCAgAAgA2oiAzYCkNCAgAAgAiADQQFyNgIEIAIgA2ogAzYCAAwDCwJAIAYoAgQiBEEDcUEBRw0AIARBeHEhBwJAAkAgBEH/AUsNACAGKAIIIgUgBEEDdiIIQQN0QbDQgIAAaiIARhoCQCAGKAIMIgQgBUcNAEEAQQAoAojQgIAAQX4gCHdxNgKI0ICAAAwCCyAEIABGGiAEIAU2AgggBSAENgIMDAELIAYoAhghCQJAAkAgBigCDCIAIAZGDQAgBigCCCIEIAhJGiAAIAQ2AgggBCAANgIMDAELAkAgBkEUaiIEKAIAIgUNACAGQRBqIgQoAgAiBQ0AQQAhAAwBCwNAIAQhCCAFIgBBFGoiBCgCACIFDQAgAEEQaiEEIAAoAhAiBQ0ACyAIQQA2AgALIAlFDQACQAJAIAYgBigCHCIFQQJ0QbjSgIAAaiIEKAIARw0AIAQgADYCACAADQFBAEEAKAKM0ICAAEF+IAV3cTYCjNCAgAAMAgsgCUEQQRQgCSgCECAGRhtqIAA2AgAgAEUNAQsgACAJNgIYAkAgBigCECIERQ0AIAAgBDYCECAEIAA2AhgLIAYoAhQiBEUNACAAQRRqIAQ2AgAgBCAANgIYCyAHIANqIQMgBiAHaiIGKAIEIQQLIAYgBEF+cTYCBCACIANqIAM2AgAgAiADQQFyNgIEAkAgA0H/AUsNACADQXhxQbDQgIAAaiEEAkACQEEAKAKI0ICAACIFQQEgA0EDdnQiA3ENAEEAIAUgA3I2AojQgIAAIAQhAwwBCyAEKAIIIQMLIAMgAjYCDCAEIAI2AgggAiAENgIMIAIgAzYCCAwDC0EfIQQCQCADQf///wdLDQAgA0EIdiIEIARBgP4/akEQdkEIcSIEdCIFIAVBgOAfakEQdkEEcSIFdCIAIABBgIAPakEQdkECcSIAdEEPdiAEIAVyIAByayIEQQF0IAMgBEEVanZBAXFyQRxqIQQLIAIgBDYCHCACQgA3AhAgBEECdEG40oCAAGohBQJAQQAoAozQgIAAIgBBASAEdCIIcQ0AIAUgAjYCAEEAIAAgCHI2AozQgIAAIAIgBTYCGCACIAI2AgggAiACNgIMDAMLIANBAEEZIARBAXZrIARBH0YbdCEEIAUoAgAhAANAIAAiBSgCBEF4cSADRg0CIARBHXYhACAEQQF0IQQgBSAAQQRxakEQaiIIKAIAIgANAAsgCCACNgIAIAIgBTYCGCACIAI2AgwgAiACNgIIDAILIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgsgBkFIaiIIIANrIgNBAXI2AgQgACAIakE4NgIEIAQgBUE3IAVrQQ9xQQAgBUFJakEPcRtqQUFqIgggCCAEQRBqSRsiCEEjNgIEQQBBACgC8NOAgAA2AqTQgIAAQQAgAzYClNCAgABBACALNgKg0ICAACAIQRBqQQApAtDTgIAANwIAIAhBACkCyNOAgAA3AghBACAIQQhqNgLQ04CAAEEAIAY2AszTgIAAQQAgADYCyNOAgABBAEEANgLU04CAACAIQSRqIQMDQCADQQc2AgAgA0EEaiIDIAVJDQALIAggBEYNAyAIIAgoAgRBfnE2AgQgCCAIIARrIgA2AgAgBCAAQQFyNgIEAkAgAEH/AUsNACAAQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgAEEDdnQiAHENAEEAIAUgAHI2AojQgIAAIAMhBQwBCyADKAIIIQULIAUgBDYCDCADIAQ2AgggBCADNgIMIAQgBTYCCAwEC0EfIQMCQCAAQf///wdLDQAgAEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCIIIAhBgIAPakEQdkECcSIIdEEPdiADIAVyIAhyayIDQQF0IAAgA0EVanZBAXFyQRxqIQMLIAQgAzYCHCAEQgA3AhAgA0ECdEG40oCAAGohBQJAQQAoAozQgIAAIghBASADdCIGcQ0AIAUgBDYCAEEAIAggBnI2AozQgIAAIAQgBTYCGCAEIAQ2AgggBCAENgIMDAQLIABBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhCANAIAgiBSgCBEF4cSAARg0DIANBHXYhCCADQQF0IQMgBSAIQQRxakEQaiIGKAIAIggNAAsgBiAENgIAIAQgBTYCGCAEIAQ2AgwgBCAENgIIDAMLIAUoAggiAyACNgIMIAUgAjYCCCACQQA2AhggAiAFNgIMIAIgAzYCCAsgC0EIaiEDDAULIAUoAggiAyAENgIMIAUgBDYCCCAEQQA2AhggBCAFNgIMIAQgAzYCCAtBACgClNCAgAAiAyACTQ0AQQAoAqDQgIAAIgQgAmoiBSADIAJrIgNBAXI2AgRBACADNgKU0ICAAEEAIAU2AqDQgIAAIAQgAkEDcjYCBCAEQQhqIQMMAwtBACEDQQBBMDYC+NOAgAAMAgsCQCALRQ0AAkACQCAIIAgoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAA2AgAgAA0BQQAgB0F+IAV3cSIHNgKM0ICAAAwCCyALQRBBFCALKAIQIAhGG2ogADYCACAARQ0BCyAAIAs2AhgCQCAIKAIQIgNFDQAgACADNgIQIAMgADYCGAsgCEEUaigCACIDRQ0AIABBFGogAzYCACADIAA2AhgLAkACQCAEQQ9LDQAgCCAEIAJqIgNBA3I2AgQgCCADaiIDIAMoAgRBAXI2AgQMAQsgCCACaiIAIARBAXI2AgQgCCACQQNyNgIEIAAgBGogBDYCAAJAIARB/wFLDQAgBEF4cUGw0ICAAGohAwJAAkBBACgCiNCAgAAiBUEBIARBA3Z0IgRxDQBBACAFIARyNgKI0ICAACADIQQMAQsgAygCCCEECyAEIAA2AgwgAyAANgIIIAAgAzYCDCAAIAQ2AggMAQtBHyEDAkAgBEH///8HSw0AIARBCHYiAyADQYD+P2pBEHZBCHEiA3QiBSAFQYDgH2pBEHZBBHEiBXQiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAFciACcmsiA0EBdCAEIANBFWp2QQFxckEcaiEDCyAAIAM2AhwgAEIANwIQIANBAnRBuNKAgABqIQUCQCAHQQEgA3QiAnENACAFIAA2AgBBACAHIAJyNgKM0ICAACAAIAU2AhggACAANgIIIAAgADYCDAwBCyAEQQBBGSADQQF2ayADQR9GG3QhAyAFKAIAIQICQANAIAIiBSgCBEF4cSAERg0BIANBHXYhAiADQQF0IQMgBSACQQRxakEQaiIGKAIAIgINAAsgBiAANgIAIAAgBTYCGCAAIAA2AgwgACAANgIIDAELIAUoAggiAyAANgIMIAUgADYCCCAAQQA2AhggACAFNgIMIAAgAzYCCAsgCEEIaiEDDAELAkAgCkUNAAJAAkAgACAAKAIcIgVBAnRBuNKAgABqIgMoAgBHDQAgAyAINgIAIAgNAUEAIAlBfiAFd3E2AozQgIAADAILIApBEEEUIAooAhAgAEYbaiAINgIAIAhFDQELIAggCjYCGAJAIAAoAhAiA0UNACAIIAM2AhAgAyAINgIYCyAAQRRqKAIAIgNFDQAgCEEUaiADNgIAIAMgCDYCGAsCQAJAIARBD0sNACAAIAQgAmoiA0EDcjYCBCAAIANqIgMgAygCBEEBcjYCBAwBCyAAIAJqIgUgBEEBcjYCBCAAIAJBA3I2AgQgBSAEaiAENgIAAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQMCQAJAQQEgB0EDdnQiCCAGcQ0AQQAgCCAGcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCADNgIMIAIgAzYCCCADIAI2AgwgAyAINgIIC0EAIAU2ApzQgIAAQQAgBDYCkNCAgAALIABBCGohAwsgAUEQaiSAgICAACADCwoAIAAQyYCAgAAL4g0BB38CQCAARQ0AIABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAIAJBAXENACACQQNxRQ0BIAEgASgCACICayIBQQAoApjQgIAAIgRJDQEgAiAAaiEAAkAgAUEAKAKc0ICAAEYNAAJAIAJB/wFLDQAgASgCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgASgCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAwsgAiAGRhogAiAENgIIIAQgAjYCDAwCCyABKAIYIQcCQAJAIAEoAgwiBiABRg0AIAEoAggiAiAESRogBiACNgIIIAIgBjYCDAwBCwJAIAFBFGoiAigCACIEDQAgAUEQaiICKAIAIgQNAEEAIQYMAQsDQCACIQUgBCIGQRRqIgIoAgAiBA0AIAZBEGohAiAGKAIQIgQNAAsgBUEANgIACyAHRQ0BAkACQCABIAEoAhwiBEECdEG40oCAAGoiAigCAEcNACACIAY2AgAgBg0BQQBBACgCjNCAgABBfiAEd3E2AozQgIAADAMLIAdBEEEUIAcoAhAgAUYbaiAGNgIAIAZFDQILIAYgBzYCGAJAIAEoAhAiAkUNACAGIAI2AhAgAiAGNgIYCyABKAIUIgJFDQEgBkEUaiACNgIAIAIgBjYCGAwBCyADKAIEIgJBA3FBA0cNACADIAJBfnE2AgRBACAANgKQ0ICAACABIABqIAA2AgAgASAAQQFyNgIEDwsgASADTw0AIAMoAgQiAkEBcUUNAAJAAkAgAkECcQ0AAkAgA0EAKAKg0ICAAEcNAEEAIAE2AqDQgIAAQQBBACgClNCAgAAgAGoiADYClNCAgAAgASAAQQFyNgIEIAFBACgCnNCAgABHDQNBAEEANgKQ0ICAAEEAQQA2ApzQgIAADwsCQCADQQAoApzQgIAARw0AQQAgATYCnNCAgABBAEEAKAKQ0ICAACAAaiIANgKQ0ICAACABIABBAXI2AgQgASAAaiAANgIADwsgAkF4cSAAaiEAAkACQCACQf8BSw0AIAMoAggiBCACQQN2IgVBA3RBsNCAgABqIgZGGgJAIAMoAgwiAiAERw0AQQBBACgCiNCAgABBfiAFd3E2AojQgIAADAILIAIgBkYaIAIgBDYCCCAEIAI2AgwMAQsgAygCGCEHAkACQCADKAIMIgYgA0YNACADKAIIIgJBACgCmNCAgABJGiAGIAI2AgggAiAGNgIMDAELAkAgA0EUaiICKAIAIgQNACADQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQACQAJAIAMgAygCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAgsgB0EQQRQgBygCECADRhtqIAY2AgAgBkUNAQsgBiAHNgIYAkAgAygCECICRQ0AIAYgAjYCECACIAY2AhgLIAMoAhQiAkUNACAGQRRqIAI2AgAgAiAGNgIYCyABIABqIAA2AgAgASAAQQFyNgIEIAFBACgCnNCAgABHDQFBACAANgKQ0ICAAA8LIAMgAkF+cTYCBCABIABqIAA2AgAgASAAQQFyNgIECwJAIABB/wFLDQAgAEF4cUGw0ICAAGohAgJAAkBBACgCiNCAgAAiBEEBIABBA3Z0IgBxDQBBACAEIAByNgKI0ICAACACIQAMAQsgAigCCCEACyAAIAE2AgwgAiABNgIIIAEgAjYCDCABIAA2AggPC0EfIQICQCAAQf///wdLDQAgAEEIdiICIAJBgP4/akEQdkEIcSICdCIEIARBgOAfakEQdkEEcSIEdCIGIAZBgIAPakEQdkECcSIGdEEPdiACIARyIAZyayICQQF0IAAgAkEVanZBAXFyQRxqIQILIAEgAjYCHCABQgA3AhAgAkECdEG40oCAAGohBAJAAkBBACgCjNCAgAAiBkEBIAJ0IgNxDQAgBCABNgIAQQAgBiADcjYCjNCAgAAgASAENgIYIAEgATYCCCABIAE2AgwMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgBCgCACEGAkADQCAGIgQoAgRBeHEgAEYNASACQR12IQYgAkEBdCECIAQgBkEEcWpBEGoiAygCACIGDQALIAMgATYCACABIAQ2AhggASABNgIMIAEgATYCCAwBCyAEKAIIIgAgATYCDCAEIAE2AgggAUEANgIYIAEgBDYCDCABIAA2AggLQQBBACgCqNCAgABBf2oiAUF/IAEbNgKo0ICAAAsLBAAAAAtOAAJAIAANAD8AQRB0DwsCQCAAQf//A3ENACAAQX9MDQACQCAAQRB2QAAiAEF/Rw0AQQBBMDYC+NOAgABBfw8LIABBEHQPCxDKgICAAAAL8gICA38BfgJAIAJFDQAgACABOgAAIAIgAGoiA0F/aiABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBfWogAToAACADQX5qIAE6AAAgAkEHSQ0AIAAgAToAAyADQXxqIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIFayICQSBJDQAgAa1CgYCAgBB+IQYgAyAFaiEBA0AgASAGNwMYIAEgBjcDECABIAY3AwggASAGNwMAIAFBIGohASACQWBqIgJBH0sNAAsLIAALC45IAQBBgAgLhkgBAAAAAgAAAAMAAAAAAAAAAAAAAAQAAAAFAAAAAAAAAAAAAAAGAAAABwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEludmFsaWQgY2hhciBpbiB1cmwgcXVlcnkAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9ib2R5AENvbnRlbnQtTGVuZ3RoIG92ZXJmbG93AENodW5rIHNpemUgb3ZlcmZsb3cAUmVzcG9uc2Ugb3ZlcmZsb3cASW52YWxpZCBtZXRob2QgZm9yIEhUVFAveC54IHJlcXVlc3QASW52YWxpZCBtZXRob2QgZm9yIFJUU1AveC54IHJlcXVlc3QARXhwZWN0ZWQgU09VUkNFIG1ldGhvZCBmb3IgSUNFL3gueCByZXF1ZXN0AEludmFsaWQgY2hhciBpbiB1cmwgZnJhZ21lbnQgc3RhcnQARXhwZWN0ZWQgZG90AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fc3RhdHVzAEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8='\n","module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCrLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC0kBAXsgAEEQav0MAAAAAAAAAAAAAAAAAAAAACIB/QsDACAAIAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AcsBygG4AckBuQHIAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBANwBC0EAIRAMxgELQQ4hEAzFAQtBDSEQDMQBC0EPIRAMwwELQRAhEAzCAQtBEyEQDMEBC0EUIRAMwAELQRUhEAy/AQtBFiEQDL4BC0EXIRAMvQELQRghEAy8AQtBGSEQDLsBC0EaIRAMugELQRshEAy5AQtBHCEQDLgBC0EIIRAMtwELQR0hEAy2AQtBICEQDLUBC0EfIRAMtAELQQchEAyzAQtBISEQDLIBC0EiIRAMsQELQR4hEAywAQtBIyEQDK8BC0ESIRAMrgELQREhEAytAQtBJCEQDKwBC0ElIRAMqwELQSYhEAyqAQtBJyEQDKkBC0HDASEQDKgBC0EpIRAMpwELQSshEAymAQtBLCEQDKUBC0EtIRAMpAELQS4hEAyjAQtBLyEQDKIBC0HEASEQDKEBC0EwIRAMoAELQTQhEAyfAQtBDCEQDJ4BC0ExIRAMnQELQTIhEAycAQtBMyEQDJsBC0E5IRAMmgELQTUhEAyZAQtBxQEhEAyYAQtBCyEQDJcBC0E6IRAMlgELQTYhEAyVAQtBCiEQDJQBC0E3IRAMkwELQTghEAySAQtBPCEQDJEBC0E7IRAMkAELQT0hEAyPAQtBCSEQDI4BC0EoIRAMjQELQT4hEAyMAQtBPyEQDIsBC0HAACEQDIoBC0HBACEQDIkBC0HCACEQDIgBC0HDACEQDIcBC0HEACEQDIYBC0HFACEQDIUBC0HGACEQDIQBC0EqIRAMgwELQccAIRAMggELQcgAIRAMgQELQckAIRAMgAELQcoAIRAMfwtBywAhEAx+C0HNACEQDH0LQcwAIRAMfAtBzgAhEAx7C0HPACEQDHoLQdAAIRAMeQtB0QAhEAx4C0HSACEQDHcLQdMAIRAMdgtB1AAhEAx1C0HWACEQDHQLQdUAIRAMcwtBBiEQDHILQdcAIRAMcQtBBSEQDHALQdgAIRAMbwtBBCEQDG4LQdkAIRAMbQtB2gAhEAxsC0HbACEQDGsLQdwAIRAMagtBAyEQDGkLQd0AIRAMaAtB3gAhEAxnC0HfACEQDGYLQeEAIRAMZQtB4AAhEAxkC0HiACEQDGMLQeMAIRAMYgtBAiEQDGELQeQAIRAMYAtB5QAhEAxfC0HmACEQDF4LQecAIRAMXQtB6AAhEAxcC0HpACEQDFsLQeoAIRAMWgtB6wAhEAxZC0HsACEQDFgLQe0AIRAMVwtB7gAhEAxWC0HvACEQDFULQfAAIRAMVAtB8QAhEAxTC0HyACEQDFILQfMAIRAMUQtB9AAhEAxQC0H1ACEQDE8LQfYAIRAMTgtB9wAhEAxNC0H4ACEQDEwLQfkAIRAMSwtB+gAhEAxKC0H7ACEQDEkLQfwAIRAMSAtB/QAhEAxHC0H+ACEQDEYLQf8AIRAMRQtBgAEhEAxEC0GBASEQDEMLQYIBIRAMQgtBgwEhEAxBC0GEASEQDEALQYUBIRAMPwtBhgEhEAw+C0GHASEQDD0LQYgBIRAMPAtBiQEhEAw7C0GKASEQDDoLQYsBIRAMOQtBjAEhEAw4C0GNASEQDDcLQY4BIRAMNgtBjwEhEAw1C0GQASEQDDQLQZEBIRAMMwtBkgEhEAwyC0GTASEQDDELQZQBIRAMMAtBlQEhEAwvC0GWASEQDC4LQZcBIRAMLQtBmAEhEAwsC0GZASEQDCsLQZoBIRAMKgtBmwEhEAwpC0GcASEQDCgLQZ0BIRAMJwtBngEhEAwmC0GfASEQDCULQaABIRAMJAtBoQEhEAwjC0GiASEQDCILQaMBIRAMIQtBpAEhEAwgC0GlASEQDB8LQaYBIRAMHgtBpwEhEAwdC0GoASEQDBwLQakBIRAMGwtBqgEhEAwaC0GrASEQDBkLQawBIRAMGAtBrQEhEAwXC0GuASEQDBYLQQEhEAwVC0GvASEQDBQLQbABIRAMEwtBsQEhEAwSC0GzASEQDBELQbIBIRAMEAtBtAEhEAwPC0G1ASEQDA4LQbYBIRAMDQtBtwEhEAwMC0G4ASEQDAsLQbkBIRAMCgtBugEhEAwJC0G7ASEQDAgLQcYBIRAMBwtBvAEhEAwGC0G9ASEQDAULQb4BIRAMBAtBvwEhEAwDC0HAASEQDAILQcIBIRAMAQtBwQEhEAsDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB4fICEjJSg/QEFERUZHSElKS0xNT1BRUlPeA1dZW1xdYGJlZmdoaWprbG1vcHFyc3R1dnd4eXp7fH1+gAGCAYUBhgGHAYkBiwGMAY0BjgGPAZABkQGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMBmQKkArAC/gL+AgsgASIEIAJHDfMBQd0BIRAM/wMLIAEiECACRw3dAUHDASEQDP4DCyABIgEgAkcNkAFB9wAhEAz9AwsgASIBIAJHDYYBQe8AIRAM/AMLIAEiASACRw1/QeoAIRAM+wMLIAEiASACRw17QegAIRAM+gMLIAEiASACRw14QeYAIRAM+QMLIAEiASACRw0aQRghEAz4AwsgASIBIAJHDRRBEiEQDPcDCyABIgEgAkcNWUHFACEQDPYDCyABIgEgAkcNSkE/IRAM9QMLIAEiASACRw1IQTwhEAz0AwsgASIBIAJHDUFBMSEQDPMDCyAALQAuQQFGDesDDIcCCyAAIAEiASACEMCAgIAAQQFHDeYBIABCADcDIAznAQsgACABIgEgAhC0gICAACIQDecBIAEhAQz1AgsCQCABIgEgAkcNAEEGIRAM8AMLIAAgAUEBaiIBIAIQu4CAgAAiEA3oASABIQEMMQsgAEIANwMgQRIhEAzVAwsgASIQIAJHDStBHSEQDO0DCwJAIAEiASACRg0AIAFBAWohAUEQIRAM1AMLQQchEAzsAwsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3lAUEIIRAM6wMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQRQhEAzSAwtBCSEQDOoDCyABIQEgACkDIFAN5AEgASEBDPICCwJAIAEiASACRw0AQQshEAzpAwsgACABQQFqIgEgAhC2gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeYBIAEhAQwNCyAAIAEiASACELqAgIAAIhAN5wEgASEBDPACCwJAIAEiASACRw0AQQ8hEAzlAwsgAS0AACIQQTtGDQggEEENRw3oASABQQFqIQEM7wILIAAgASIBIAIQuoCAgAAiEA3oASABIQEM8gILA0ACQCABLQAAQfC1gIAAai0AACIQQQFGDQAgEEECRw3rASAAKAIEIRAgAEEANgIEIAAgECABQQFqIgEQuYCAgAAiEA3qASABIQEM9AILIAFBAWoiASACRw0AC0ESIRAM4gMLIAAgASIBIAIQuoCAgAAiEA3pASABIQEMCgsgASIBIAJHDQZBGyEQDOADCwJAIAEiASACRw0AQRYhEAzgAwsgAEGKgICAADYCCCAAIAE2AgQgACABIAIQuICAgAAiEA3qASABIQFBICEQDMYDCwJAIAEiASACRg0AA0ACQCABLQAAQfC3gIAAai0AACIQQQJGDQACQCAQQX9qDgTlAewBAOsB7AELIAFBAWohAUEIIRAMyAMLIAFBAWoiASACRw0AC0EVIRAM3wMLQRUhEAzeAwsDQAJAIAEtAABB8LmAgABqLQAAIhBBAkYNACAQQX9qDgTeAewB4AHrAewBCyABQQFqIgEgAkcNAAtBGCEQDN0DCwJAIAEiASACRg0AIABBi4CAgAA2AgggACABNgIEIAEhAUEHIRAMxAMLQRkhEAzcAwsgAUEBaiEBDAILAkAgASIUIAJHDQBBGiEQDNsDCyAUIQECQCAULQAAQXNqDhTdAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAgDuAgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQM2gMLAkAgAS0AACIQQTtGDQAgEEENRw3oASABQQFqIQEM5QILIAFBAWohAQtBIiEQDL8DCwJAIAEiECACRw0AQRwhEAzYAwtCACERIBAhASAQLQAAQVBqDjfnAeYBAQIDBAUGBwgAAAAAAAAACQoLDA0OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBESExQAC0EeIRAMvQMLQgIhEQzlAQtCAyERDOQBC0IEIREM4wELQgUhEQziAQtCBiERDOEBC0IHIREM4AELQgghEQzfAQtCCSERDN4BC0IKIREM3QELQgshEQzcAQtCDCERDNsBC0INIREM2gELQg4hEQzZAQtCDyERDNgBC0IKIREM1wELQgshEQzWAQtCDCERDNUBC0INIREM1AELQg4hEQzTAQtCDyERDNIBC0IAIRECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAtAABBUGoON+UB5AEAAQIDBAUGB+YB5gHmAeYB5gHmAeYBCAkKCwwN5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAQ4PEBESE+YBC0ICIREM5AELQgMhEQzjAQtCBCERDOIBC0IFIREM4QELQgYhEQzgAQtCByERDN8BC0IIIREM3gELQgkhEQzdAQtCCiERDNwBC0ILIREM2wELQgwhEQzaAQtCDSERDNkBC0IOIREM2AELQg8hEQzXAQtCCiERDNYBC0ILIREM1QELQgwhEQzUAQtCDSERDNMBC0IOIREM0gELQg8hEQzRAQsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3SAUEfIRAMwAMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQSQhEAynAwtBICEQDL8DCyAAIAEiECACEL6AgIAAQX9qDgW2AQDFAgHRAdIBC0ERIRAMpAMLIABBAToALyAQIQEMuwMLIAEiASACRw3SAUEkIRAMuwMLIAEiDSACRw0eQcYAIRAMugMLIAAgASIBIAIQsoCAgAAiEA3UASABIQEMtQELIAEiECACRw0mQdAAIRAMuAMLAkAgASIBIAJHDQBBKCEQDLgDCyAAQQA2AgQgAEGMgICAADYCCCAAIAEgARCxgICAACIQDdMBIAEhAQzYAQsCQCABIhAgAkcNAEEpIRAMtwMLIBAtAAAiAUEgRg0UIAFBCUcN0wEgEEEBaiEBDBULAkAgASIBIAJGDQAgAUEBaiEBDBcLQSohEAy1AwsCQCABIhAgAkcNAEErIRAMtQMLAkAgEC0AACIBQQlGDQAgAUEgRw3VAQsgAC0ALEEIRg3TASAQIQEMkQMLAkAgASIBIAJHDQBBLCEQDLQDCyABLQAAQQpHDdUBIAFBAWohAQzJAgsgASIOIAJHDdUBQS8hEAyyAwsDQAJAIAEtAAAiEEEgRg0AAkAgEEF2ag4EANwB3AEA2gELIAEhAQzgAQsgAUEBaiIBIAJHDQALQTEhEAyxAwtBMiEQIAEiFCACRg2wAyACIBRrIAAoAgAiAWohFSAUIAFrQQNqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB8LuAgABqLQAARw0BAkAgAUEDRw0AQQYhAQyWAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMsQMLIABBADYCACAUIQEM2QELQTMhECABIhQgAkYNrwMgAiAUayAAKAIAIgFqIRUgFCABa0EIaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfS7gIAAai0AAEcNAQJAIAFBCEcNAEEFIQEMlQMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLADCyAAQQA2AgAgFCEBDNgBC0E0IRAgASIUIAJGDa4DIAIgFGsgACgCACIBaiEVIBQgAWtBBWohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUHQwoCAAGotAABHDQECQCABQQVHDQBBByEBDJQDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAyvAwsgAEEANgIAIBQhAQzXAQsCQCABIgEgAkYNAANAAkAgAS0AAEGAvoCAAGotAAAiEEEBRg0AIBBBAkYNCiABIQEM3QELIAFBAWoiASACRw0AC0EwIRAMrgMLQTAhEAytAwsCQCABIgEgAkYNAANAAkAgAS0AACIQQSBGDQAgEEF2ag4E2QHaAdoB2QHaAQsgAUEBaiIBIAJHDQALQTghEAytAwtBOCEQDKwDCwNAAkAgAS0AACIQQSBGDQAgEEEJRw0DCyABQQFqIgEgAkcNAAtBPCEQDKsDCwNAAkAgAS0AACIQQSBGDQACQAJAIBBBdmoOBNoBAQHaAQALIBBBLEYN2wELIAEhAQwECyABQQFqIgEgAkcNAAtBPyEQDKoDCyABIQEM2wELQcAAIRAgASIUIAJGDagDIAIgFGsgACgCACIBaiEWIBQgAWtBBmohFwJAA0AgFC0AAEEgciABQYDAgIAAai0AAEcNASABQQZGDY4DIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADKkDCyAAQQA2AgAgFCEBC0E2IRAMjgMLAkAgASIPIAJHDQBBwQAhEAynAwsgAEGMgICAADYCCCAAIA82AgQgDyEBIAAtACxBf2oOBM0B1QHXAdkBhwMLIAFBAWohAQzMAQsCQCABIgEgAkYNAANAAkAgAS0AACIQQSByIBAgEEG/f2pB/wFxQRpJG0H/AXEiEEEJRg0AIBBBIEYNAAJAAkACQAJAIBBBnX9qDhMAAwMDAwMDAwEDAwMDAwMDAwMCAwsgAUEBaiEBQTEhEAyRAwsgAUEBaiEBQTIhEAyQAwsgAUEBaiEBQTMhEAyPAwsgASEBDNABCyABQQFqIgEgAkcNAAtBNSEQDKUDC0E1IRAMpAMLAkAgASIBIAJGDQADQAJAIAEtAABBgLyAgABqLQAAQQFGDQAgASEBDNMBCyABQQFqIgEgAkcNAAtBPSEQDKQDC0E9IRAMowMLIAAgASIBIAIQsICAgAAiEA3WASABIQEMAQsgEEEBaiEBC0E8IRAMhwMLAkAgASIBIAJHDQBBwgAhEAygAwsCQANAAkAgAS0AAEF3ag4YAAL+Av4ChAP+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gIA/gILIAFBAWoiASACRw0AC0HCACEQDKADCyABQQFqIQEgAC0ALUEBcUUNvQEgASEBC0EsIRAMhQMLIAEiASACRw3TAUHEACEQDJ0DCwNAAkAgAS0AAEGQwICAAGotAABBAUYNACABIQEMtwILIAFBAWoiASACRw0AC0HFACEQDJwDCyANLQAAIhBBIEYNswEgEEE6Rw2BAyAAKAIEIQEgAEEANgIEIAAgASANEK+AgIAAIgEN0AEgDUEBaiEBDLMCC0HHACEQIAEiDSACRg2aAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQZDCgIAAai0AAEcNgAMgAUEFRg30AiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyaAwtByAAhECABIg0gAkYNmQMgAiANayAAKAIAIgFqIRYgDSABa0EJaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGWwoCAAGotAABHDf8CAkAgAUEJRw0AQQIhAQz1AgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmQMLAkAgASINIAJHDQBByQAhEAyZAwsCQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZJ/ag4HAIADgAOAA4ADgAMBgAMLIA1BAWohAUE+IRAMgAMLIA1BAWohAUE/IRAM/wILQcoAIRAgASINIAJGDZcDIAIgDWsgACgCACIBaiEWIA0gAWtBAWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBoMKAgABqLQAARw39AiABQQFGDfACIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJcDC0HLACEQIAEiDSACRg2WAyACIA1rIAAoAgAiAWohFiANIAFrQQ5qIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaLCgIAAai0AAEcN/AIgAUEORg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyWAwtBzAAhECABIg0gAkYNlQMgAiANayAAKAIAIgFqIRYgDSABa0EPaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUHAwoCAAGotAABHDfsCAkAgAUEPRw0AQQMhAQzxAgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlQMLQc0AIRAgASINIAJGDZQDIAIgDWsgACgCACIBaiEWIA0gAWtBBWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw36AgJAIAFBBUcNAEEEIQEM8AILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJQDCwJAIAEiDSACRw0AQc4AIRAMlAMLAkACQAJAAkAgDS0AACIBQSByIAEgAUG/f2pB/wFxQRpJG0H/AXFBnX9qDhMA/QL9Av0C/QL9Av0C/QL9Av0C/QL9Av0CAf0C/QL9AgID/QILIA1BAWohAUHBACEQDP0CCyANQQFqIQFBwgAhEAz8AgsgDUEBaiEBQcMAIRAM+wILIA1BAWohAUHEACEQDPoCCwJAIAEiASACRg0AIABBjYCAgAA2AgggACABNgIEIAEhAUHFACEQDPoCC0HPACEQDJIDCyAQIQECQAJAIBAtAABBdmoOBAGoAqgCAKgCCyAQQQFqIQELQSchEAz4AgsCQCABIgEgAkcNAEHRACEQDJEDCwJAIAEtAABBIEYNACABIQEMjQELIAFBAWohASAALQAtQQFxRQ3HASABIQEMjAELIAEiFyACRw3IAUHSACEQDI8DC0HTACEQIAEiFCACRg2OAyACIBRrIAAoAgAiAWohFiAUIAFrQQFqIRcDQCAULQAAIAFB1sKAgABqLQAARw3MASABQQFGDccBIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADI4DCwJAIAEiASACRw0AQdUAIRAMjgMLIAEtAABBCkcNzAEgAUEBaiEBDMcBCwJAIAEiASACRw0AQdYAIRAMjQMLAkACQCABLQAAQXZqDgQAzQHNAQHNAQsgAUEBaiEBDMcBCyABQQFqIQFBygAhEAzzAgsgACABIgEgAhCugICAACIQDcsBIAEhAUHNACEQDPICCyAALQApQSJGDYUDDKYCCwJAIAEiASACRw0AQdsAIRAMigMLQQAhFEEBIRdBASEWQQAhEAJAAkACQAJAAkACQAJAAkACQCABLQAAQVBqDgrUAdMBAAECAwQFBgjVAQtBAiEQDAYLQQMhEAwFC0EEIRAMBAtBBSEQDAMLQQYhEAwCC0EHIRAMAQtBCCEQC0EAIRdBACEWQQAhFAzMAQtBCSEQQQEhFEEAIRdBACEWDMsBCwJAIAEiASACRw0AQd0AIRAMiQMLIAEtAABBLkcNzAEgAUEBaiEBDKYCCyABIgEgAkcNzAFB3wAhEAyHAwsCQCABIgEgAkYNACAAQY6AgIAANgIIIAAgATYCBCABIQFB0AAhEAzuAgtB4AAhEAyGAwtB4QAhECABIgEgAkYNhQMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQeLCgIAAai0AAEcNzQEgFEEDRg3MASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyFAwtB4gAhECABIgEgAkYNhAMgAiABayAAKAIAIhRqIRYgASAUa0ECaiEXA0AgAS0AACAUQebCgIAAai0AAEcNzAEgFEECRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyEAwtB4wAhECABIgEgAkYNgwMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQenCgIAAai0AAEcNywEgFEEDRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyDAwsCQCABIgEgAkcNAEHlACEQDIMDCyAAIAFBAWoiASACEKiAgIAAIhANzQEgASEBQdYAIRAM6QILAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AAkACQAJAIBBBuH9qDgsAAc8BzwHPAc8BzwHPAc8BzwECzwELIAFBAWohAUHSACEQDO0CCyABQQFqIQFB0wAhEAzsAgsgAUEBaiEBQdQAIRAM6wILIAFBAWoiASACRw0AC0HkACEQDIIDC0HkACEQDIEDCwNAAkAgAS0AAEHwwoCAAGotAAAiEEEBRg0AIBBBfmoOA88B0AHRAdIBCyABQQFqIgEgAkcNAAtB5gAhEAyAAwsCQCABIgEgAkYNACABQQFqIQEMAwtB5wAhEAz/AgsDQAJAIAEtAABB8MSAgABqLQAAIhBBAUYNAAJAIBBBfmoOBNIB0wHUAQDVAQsgASEBQdcAIRAM5wILIAFBAWoiASACRw0AC0HoACEQDP4CCwJAIAEiASACRw0AQekAIRAM/gILAkAgAS0AACIQQXZqDhq6AdUB1QG8AdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAcoB1QHVAQDTAQsgAUEBaiEBC0EGIRAM4wILA0ACQCABLQAAQfDGgIAAai0AAEEBRg0AIAEhAQyeAgsgAUEBaiIBIAJHDQALQeoAIRAM+wILAkAgASIBIAJGDQAgAUEBaiEBDAMLQesAIRAM+gILAkAgASIBIAJHDQBB7AAhEAz6AgsgAUEBaiEBDAELAkAgASIBIAJHDQBB7QAhEAz5AgsgAUEBaiEBC0EEIRAM3gILAkAgASIUIAJHDQBB7gAhEAz3AgsgFCEBAkACQAJAIBQtAABB8MiAgABqLQAAQX9qDgfUAdUB1gEAnAIBAtcBCyAUQQFqIQEMCgsgFEEBaiEBDM0BC0EAIRAgAEEANgIcIABBm5KAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAz2AgsCQANAAkAgAS0AAEHwyICAAGotAAAiEEEERg0AAkACQCAQQX9qDgfSAdMB1AHZAQAEAdkBCyABIQFB2gAhEAzgAgsgAUEBaiEBQdwAIRAM3wILIAFBAWoiASACRw0AC0HvACEQDPYCCyABQQFqIQEMywELAkAgASIUIAJHDQBB8AAhEAz1AgsgFC0AAEEvRw3UASAUQQFqIQEMBgsCQCABIhQgAkcNAEHxACEQDPQCCwJAIBQtAAAiAUEvRw0AIBRBAWohAUHdACEQDNsCCyABQXZqIgRBFksN0wFBASAEdEGJgIACcUUN0wEMygILAkAgASIBIAJGDQAgAUEBaiEBQd4AIRAM2gILQfIAIRAM8gILAkAgASIUIAJHDQBB9AAhEAzyAgsgFCEBAkAgFC0AAEHwzICAAGotAABBf2oOA8kClAIA1AELQeEAIRAM2AILAkAgASIUIAJGDQADQAJAIBQtAABB8MqAgABqLQAAIgFBA0YNAAJAIAFBf2oOAssCANUBCyAUIQFB3wAhEAzaAgsgFEEBaiIUIAJHDQALQfMAIRAM8QILQfMAIRAM8AILAkAgASIBIAJGDQAgAEGPgICAADYCCCAAIAE2AgQgASEBQeAAIRAM1wILQfUAIRAM7wILAkAgASIBIAJHDQBB9gAhEAzvAgsgAEGPgICAADYCCCAAIAE2AgQgASEBC0EDIRAM1AILA0AgAS0AAEEgRw3DAiABQQFqIgEgAkcNAAtB9wAhEAzsAgsCQCABIgEgAkcNAEH4ACEQDOwCCyABLQAAQSBHDc4BIAFBAWohAQzvAQsgACABIgEgAhCsgICAACIQDc4BIAEhAQyOAgsCQCABIgQgAkcNAEH6ACEQDOoCCyAELQAAQcwARw3RASAEQQFqIQFBEyEQDM8BCwJAIAEiBCACRw0AQfsAIRAM6QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEANAIAQtAAAgAUHwzoCAAGotAABHDdABIAFBBUYNzgEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBB+wAhEAzoAgsCQCABIgQgAkcNAEH8ACEQDOgCCwJAAkAgBC0AAEG9f2oODADRAdEB0QHRAdEB0QHRAdEB0QHRAQHRAQsgBEEBaiEBQeYAIRAMzwILIARBAWohAUHnACEQDM4CCwJAIAEiBCACRw0AQf0AIRAM5wILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNzwEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf0AIRAM5wILIABBADYCACAQQQFqIQFBECEQDMwBCwJAIAEiBCACRw0AQf4AIRAM5gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQfbOgIAAai0AAEcNzgEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf4AIRAM5gILIABBADYCACAQQQFqIQFBFiEQDMsBCwJAIAEiBCACRw0AQf8AIRAM5QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQfzOgIAAai0AAEcNzQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf8AIRAM5QILIABBADYCACAQQQFqIQFBBSEQDMoBCwJAIAEiBCACRw0AQYABIRAM5AILIAQtAABB2QBHDcsBIARBAWohAUEIIRAMyQELAkAgASIEIAJHDQBBgQEhEAzjAgsCQAJAIAQtAABBsn9qDgMAzAEBzAELIARBAWohAUHrACEQDMoCCyAEQQFqIQFB7AAhEAzJAgsCQCABIgQgAkcNAEGCASEQDOICCwJAAkAgBC0AAEG4f2oOCADLAcsBywHLAcsBywEBywELIARBAWohAUHqACEQDMkCCyAEQQFqIQFB7QAhEAzIAgsCQCABIgQgAkcNAEGDASEQDOECCyACIARrIAAoAgAiAWohECAEIAFrQQJqIRQCQANAIAQtAAAgAUGAz4CAAGotAABHDckBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgEDYCAEGDASEQDOECC0EAIRAgAEEANgIAIBRBAWohAQzGAQsCQCABIgQgAkcNAEGEASEQDOACCyACIARrIAAoAgAiAWohFCAEIAFrQQRqIRACQANAIAQtAAAgAUGDz4CAAGotAABHDcgBIAFBBEYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGEASEQDOACCyAAQQA2AgAgEEEBaiEBQSMhEAzFAQsCQCABIgQgAkcNAEGFASEQDN8CCwJAAkAgBC0AAEG0f2oOCADIAcgByAHIAcgByAEByAELIARBAWohAUHvACEQDMYCCyAEQQFqIQFB8AAhEAzFAgsCQCABIgQgAkcNAEGGASEQDN4CCyAELQAAQcUARw3FASAEQQFqIQEMgwILAkAgASIEIAJHDQBBhwEhEAzdAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBiM+AgABqLQAARw3FASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhwEhEAzdAgsgAEEANgIAIBBBAWohAUEtIRAMwgELAkAgASIEIAJHDQBBiAEhEAzcAgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw3EASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiAEhEAzcAgsgAEEANgIAIBBBAWohAUEpIRAMwQELAkAgASIBIAJHDQBBiQEhEAzbAgtBASEQIAEtAABB3wBHDcABIAFBAWohAQyBAgsCQCABIgQgAkcNAEGKASEQDNoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRADQCAELQAAIAFBjM+AgABqLQAARw3BASABQQFGDa8CIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYoBIRAM2QILAkAgASIEIAJHDQBBiwEhEAzZAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBjs+AgABqLQAARw3BASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiwEhEAzZAgsgAEEANgIAIBBBAWohAUECIRAMvgELAkAgASIEIAJHDQBBjAEhEAzYAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw3AASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjAEhEAzYAgsgAEEANgIAIBBBAWohAUEfIRAMvQELAkAgASIEIAJHDQBBjQEhEAzXAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8s+AgABqLQAARw2/ASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjQEhEAzXAgsgAEEANgIAIBBBAWohAUEJIRAMvAELAkAgASIEIAJHDQBBjgEhEAzWAgsCQAJAIAQtAABBt39qDgcAvwG/Ab8BvwG/AQG/AQsgBEEBaiEBQfgAIRAMvQILIARBAWohAUH5ACEQDLwCCwJAIAEiBCACRw0AQY8BIRAM1QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQZHPgIAAai0AAEcNvQEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY8BIRAM1QILIABBADYCACAQQQFqIQFBGCEQDLoBCwJAIAEiBCACRw0AQZABIRAM1AILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQZfPgIAAai0AAEcNvAEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZABIRAM1AILIABBADYCACAQQQFqIQFBFyEQDLkBCwJAIAEiBCACRw0AQZEBIRAM0wILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQZrPgIAAai0AAEcNuwEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZEBIRAM0wILIABBADYCACAQQQFqIQFBFSEQDLgBCwJAIAEiBCACRw0AQZIBIRAM0gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQaHPgIAAai0AAEcNugEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZIBIRAM0gILIABBADYCACAQQQFqIQFBHiEQDLcBCwJAIAEiBCACRw0AQZMBIRAM0QILIAQtAABBzABHDbgBIARBAWohAUEKIRAMtgELAkAgBCACRw0AQZQBIRAM0AILAkACQCAELQAAQb9/ag4PALkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AbkBAbkBCyAEQQFqIQFB/gAhEAy3AgsgBEEBaiEBQf8AIRAMtgILAkAgBCACRw0AQZUBIRAMzwILAkACQCAELQAAQb9/ag4DALgBAbgBCyAEQQFqIQFB/QAhEAy2AgsgBEEBaiEEQYABIRAMtQILAkAgBCACRw0AQZYBIRAMzgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQafPgIAAai0AAEcNtgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZYBIRAMzgILIABBADYCACAQQQFqIQFBCyEQDLMBCwJAIAQgAkcNAEGXASEQDM0CCwJAAkACQAJAIAQtAABBU2oOIwC4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBAbgBuAG4AbgBuAECuAG4AbgBA7gBCyAEQQFqIQFB+wAhEAy2AgsgBEEBaiEBQfwAIRAMtQILIARBAWohBEGBASEQDLQCCyAEQQFqIQRBggEhEAyzAgsCQCAEIAJHDQBBmAEhEAzMAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBqc+AgABqLQAARw20ASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmAEhEAzMAgsgAEEANgIAIBBBAWohAUEZIRAMsQELAkAgBCACRw0AQZkBIRAMywILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQa7PgIAAai0AAEcNswEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZkBIRAMywILIABBADYCACAQQQFqIQFBBiEQDLABCwJAIAQgAkcNAEGaASEQDMoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG0z4CAAGotAABHDbIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGaASEQDMoCCyAAQQA2AgAgEEEBaiEBQRwhEAyvAQsCQCAEIAJHDQBBmwEhEAzJAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBts+AgABqLQAARw2xASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmwEhEAzJAgsgAEEANgIAIBBBAWohAUEnIRAMrgELAkAgBCACRw0AQZwBIRAMyAILAkACQCAELQAAQax/ag4CAAGxAQsgBEEBaiEEQYYBIRAMrwILIARBAWohBEGHASEQDK4CCwJAIAQgAkcNAEGdASEQDMcCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG4z4CAAGotAABHDa8BIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGdASEQDMcCCyAAQQA2AgAgEEEBaiEBQSYhEAysAQsCQCAEIAJHDQBBngEhEAzGAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBus+AgABqLQAARw2uASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBngEhEAzGAgsgAEEANgIAIBBBAWohAUEDIRAMqwELAkAgBCACRw0AQZ8BIRAMxQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNrQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ8BIRAMxQILIABBADYCACAQQQFqIQFBDCEQDKoBCwJAIAQgAkcNAEGgASEQDMQCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUG8z4CAAGotAABHDawBIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGgASEQDMQCCyAAQQA2AgAgEEEBaiEBQQ0hEAypAQsCQCAEIAJHDQBBoQEhEAzDAgsCQAJAIAQtAABBun9qDgsArAGsAawBrAGsAawBrAGsAawBAawBCyAEQQFqIQRBiwEhEAyqAgsgBEEBaiEEQYwBIRAMqQILAkAgBCACRw0AQaIBIRAMwgILIAQtAABB0ABHDakBIARBAWohBAzpAQsCQCAEIAJHDQBBowEhEAzBAgsCQAJAIAQtAABBt39qDgcBqgGqAaoBqgGqAQCqAQsgBEEBaiEEQY4BIRAMqAILIARBAWohAUEiIRAMpgELAkAgBCACRw0AQaQBIRAMwAILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQcDPgIAAai0AAEcNqAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaQBIRAMwAILIABBADYCACAQQQFqIQFBHSEQDKUBCwJAIAQgAkcNAEGlASEQDL8CCwJAAkAgBC0AAEGuf2oOAwCoAQGoAQsgBEEBaiEEQZABIRAMpgILIARBAWohAUEEIRAMpAELAkAgBCACRw0AQaYBIRAMvgILAkACQAJAAkACQCAELQAAQb9/ag4VAKoBqgGqAaoBqgGqAaoBqgGqAaoBAaoBqgECqgGqAQOqAaoBBKoBCyAEQQFqIQRBiAEhEAyoAgsgBEEBaiEEQYkBIRAMpwILIARBAWohBEGKASEQDKYCCyAEQQFqIQRBjwEhEAylAgsgBEEBaiEEQZEBIRAMpAILAkAgBCACRw0AQacBIRAMvQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNpQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQacBIRAMvQILIABBADYCACAQQQFqIQFBESEQDKIBCwJAIAQgAkcNAEGoASEQDLwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHCz4CAAGotAABHDaQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGoASEQDLwCCyAAQQA2AgAgEEEBaiEBQSwhEAyhAQsCQCAEIAJHDQBBqQEhEAy7AgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBxc+AgABqLQAARw2jASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqQEhEAy7AgsgAEEANgIAIBBBAWohAUErIRAMoAELAkAgBCACRw0AQaoBIRAMugILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQcrPgIAAai0AAEcNogEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaoBIRAMugILIABBADYCACAQQQFqIQFBFCEQDJ8BCwJAIAQgAkcNAEGrASEQDLkCCwJAAkACQAJAIAQtAABBvn9qDg8AAQKkAaQBpAGkAaQBpAGkAaQBpAGkAaQBA6QBCyAEQQFqIQRBkwEhEAyiAgsgBEEBaiEEQZQBIRAMoQILIARBAWohBEGVASEQDKACCyAEQQFqIQRBlgEhEAyfAgsCQCAEIAJHDQBBrAEhEAy4AgsgBC0AAEHFAEcNnwEgBEEBaiEEDOABCwJAIAQgAkcNAEGtASEQDLcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHNz4CAAGotAABHDZ8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGtASEQDLcCCyAAQQA2AgAgEEEBaiEBQQ4hEAycAQsCQCAEIAJHDQBBrgEhEAy2AgsgBC0AAEHQAEcNnQEgBEEBaiEBQSUhEAybAQsCQCAEIAJHDQBBrwEhEAy1AgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw2dASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrwEhEAy1AgsgAEEANgIAIBBBAWohAUEqIRAMmgELAkAgBCACRw0AQbABIRAMtAILAkACQCAELQAAQat/ag4LAJ0BnQGdAZ0BnQGdAZ0BnQGdAQGdAQsgBEEBaiEEQZoBIRAMmwILIARBAWohBEGbASEQDJoCCwJAIAQgAkcNAEGxASEQDLMCCwJAAkAgBC0AAEG/f2oOFACcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAEBnAELIARBAWohBEGZASEQDJoCCyAEQQFqIQRBnAEhEAyZAgsCQCAEIAJHDQBBsgEhEAyyAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFB2c+AgABqLQAARw2aASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBsgEhEAyyAgsgAEEANgIAIBBBAWohAUEhIRAMlwELAkAgBCACRw0AQbMBIRAMsQILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQd3PgIAAai0AAEcNmQEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbMBIRAMsQILIABBADYCACAQQQFqIQFBGiEQDJYBCwJAIAQgAkcNAEG0ASEQDLACCwJAAkACQCAELQAAQbt/ag4RAJoBmgGaAZoBmgGaAZoBmgGaAQGaAZoBmgGaAZoBApoBCyAEQQFqIQRBnQEhEAyYAgsgBEEBaiEEQZ4BIRAMlwILIARBAWohBEGfASEQDJYCCwJAIAQgAkcNAEG1ASEQDK8CCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUHkz4CAAGotAABHDZcBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG1ASEQDK8CCyAAQQA2AgAgEEEBaiEBQSghEAyUAQsCQCAEIAJHDQBBtgEhEAyuAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB6s+AgABqLQAARw2WASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtgEhEAyuAgsgAEEANgIAIBBBAWohAUEHIRAMkwELAkAgBCACRw0AQbcBIRAMrQILAkACQCAELQAAQbt/ag4OAJYBlgGWAZYBlgGWAZYBlgGWAZYBlgGWAQGWAQsgBEEBaiEEQaEBIRAMlAILIARBAWohBEGiASEQDJMCCwJAIAQgAkcNAEG4ASEQDKwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDZQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG4ASEQDKwCCyAAQQA2AgAgEEEBaiEBQRIhEAyRAQsCQCAEIAJHDQBBuQEhEAyrAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw2TASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuQEhEAyrAgsgAEEANgIAIBBBAWohAUEgIRAMkAELAkAgBCACRw0AQboBIRAMqgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNkgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQboBIRAMqgILIABBADYCACAQQQFqIQFBDyEQDI8BCwJAIAQgAkcNAEG7ASEQDKkCCwJAAkAgBC0AAEG3f2oOBwCSAZIBkgGSAZIBAZIBCyAEQQFqIQRBpQEhEAyQAgsgBEEBaiEEQaYBIRAMjwILAkAgBCACRw0AQbwBIRAMqAILIAIgBGsgACgCACIBaiEUIAQgAWtBB2ohEAJAA0AgBC0AACABQfTPgIAAai0AAEcNkAEgAUEHRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbwBIRAMqAILIABBADYCACAQQQFqIQFBGyEQDI0BCwJAIAQgAkcNAEG9ASEQDKcCCwJAAkACQCAELQAAQb5/ag4SAJEBkQGRAZEBkQGRAZEBkQGRAQGRAZEBkQGRAZEBkQECkQELIARBAWohBEGkASEQDI8CCyAEQQFqIQRBpwEhEAyOAgsgBEEBaiEEQagBIRAMjQILAkAgBCACRw0AQb4BIRAMpgILIAQtAABBzgBHDY0BIARBAWohBAzPAQsCQCAEIAJHDQBBvwEhEAylAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAELQAAQb9/ag4VAAECA5wBBAUGnAGcAZwBBwgJCgucAQwNDg+cAQsgBEEBaiEBQegAIRAMmgILIARBAWohAUHpACEQDJkCCyAEQQFqIQFB7gAhEAyYAgsgBEEBaiEBQfIAIRAMlwILIARBAWohAUHzACEQDJYCCyAEQQFqIQFB9gAhEAyVAgsgBEEBaiEBQfcAIRAMlAILIARBAWohAUH6ACEQDJMCCyAEQQFqIQRBgwEhEAySAgsgBEEBaiEEQYQBIRAMkQILIARBAWohBEGFASEQDJACCyAEQQFqIQRBkgEhEAyPAgsgBEEBaiEEQZgBIRAMjgILIARBAWohBEGgASEQDI0CCyAEQQFqIQRBowEhEAyMAgsgBEEBaiEEQaoBIRAMiwILAkAgBCACRg0AIABBkICAgAA2AgggACAENgIEQasBIRAMiwILQcABIRAMowILIAAgBSACEKqAgIAAIgENiwEgBSEBDFwLAkAgBiACRg0AIAZBAWohBQyNAQtBwgEhEAyhAgsDQAJAIBAtAABBdmoOBIwBAACPAQALIBBBAWoiECACRw0AC0HDASEQDKACCwJAIAcgAkYNACAAQZGAgIAANgIIIAAgBzYCBCAHIQFBASEQDIcCC0HEASEQDJ8CCwJAIAcgAkcNAEHFASEQDJ8CCwJAAkAgBy0AAEF2ag4EAc4BzgEAzgELIAdBAWohBgyNAQsgB0EBaiEFDIkBCwJAIAcgAkcNAEHGASEQDJ4CCwJAAkAgBy0AAEF2ag4XAY8BjwEBjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAI8BCyAHQQFqIQcLQbABIRAMhAILAkAgCCACRw0AQcgBIRAMnQILIAgtAABBIEcNjQEgAEEAOwEyIAhBAWohAUGzASEQDIMCCyABIRcCQANAIBciByACRg0BIActAABBUGpB/wFxIhBBCk8NzAECQCAALwEyIhRBmTNLDQAgACAUQQpsIhQ7ATIgEEH//wNzIBRB/v8DcUkNACAHQQFqIRcgACAUIBBqIhA7ATIgEEH//wNxQegHSQ0BCwtBACEQIABBADYCHCAAQcGJgIAANgIQIABBDTYCDCAAIAdBAWo2AhQMnAILQccBIRAMmwILIAAgCCACEK6AgIAAIhBFDcoBIBBBFUcNjAEgAEHIATYCHCAAIAg2AhQgAEHJl4CAADYCECAAQRU2AgxBACEQDJoCCwJAIAkgAkcNAEHMASEQDJoCC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgCS0AAEFQag4KlgGVAQABAgMEBQYIlwELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMjgELQQkhEEEBIRRBACEXQQAhFgyNAQsCQCAKIAJHDQBBzgEhEAyZAgsgCi0AAEEuRw2OASAKQQFqIQkMygELIAsgAkcNjgFB0AEhEAyXAgsCQCALIAJGDQAgAEGOgICAADYCCCAAIAs2AgRBtwEhEAz+AQtB0QEhEAyWAgsCQCAEIAJHDQBB0gEhEAyWAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EEaiELA0AgBC0AACAQQfzPgIAAai0AAEcNjgEgEEEERg3pASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHSASEQDJUCCyAAIAwgAhCsgICAACIBDY0BIAwhAQy4AQsCQCAEIAJHDQBB1AEhEAyUAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EBaiEMA0AgBC0AACAQQYHQgIAAai0AAEcNjwEgEEEBRg2OASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHUASEQDJMCCwJAIAQgAkcNAEHWASEQDJMCCyACIARrIAAoAgAiEGohFCAEIBBrQQJqIQsDQCAELQAAIBBBg9CAgABqLQAARw2OASAQQQJGDZABIBBBAWohECAEQQFqIgQgAkcNAAsgACAUNgIAQdYBIRAMkgILAkAgBCACRw0AQdcBIRAMkgILAkACQCAELQAAQbt/ag4QAI8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwEBjwELIARBAWohBEG7ASEQDPkBCyAEQQFqIQRBvAEhEAz4AQsCQCAEIAJHDQBB2AEhEAyRAgsgBC0AAEHIAEcNjAEgBEEBaiEEDMQBCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEG+ASEQDPcBC0HZASEQDI8CCwJAIAQgAkcNAEHaASEQDI8CCyAELQAAQcgARg3DASAAQQE6ACgMuQELIABBAjoALyAAIAQgAhCmgICAACIQDY0BQcIBIRAM9AELIAAtAChBf2oOArcBuQG4AQsDQAJAIAQtAABBdmoOBACOAY4BAI4BCyAEQQFqIgQgAkcNAAtB3QEhEAyLAgsgAEEAOgAvIAAtAC1BBHFFDYQCCyAAQQA6AC8gAEEBOgA0IAEhAQyMAQsgEEEVRg3aASAAQQA2AhwgACABNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAyIAgsCQCAAIBAgAhC0gICAACIEDQAgECEBDIECCwJAIARBFUcNACAAQQM2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAyIAgsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMhwILIBBBFUYN1gEgAEEANgIcIAAgATYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMhgILIAAoAgQhFyAAQQA2AgQgECARp2oiFiEBIAAgFyAQIBYgFBsiEBC1gICAACIURQ2NASAAQQc2AhwgACAQNgIUIAAgFDYCDEEAIRAMhQILIAAgAC8BMEGAAXI7ATAgASEBC0EqIRAM6gELIBBBFUYN0QEgAEEANgIcIAAgATYCFCAAQYOMgIAANgIQIABBEzYCDEEAIRAMggILIBBBFUYNzwEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAMgQILIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDI0BCyAAQQw2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMgAILIBBBFUYNzAEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM/wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIwBCyAAQQ02AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/gELIBBBFUYNyQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM/QELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIsBCyAAQQ42AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/AELIABBADYCHCAAIAE2AhQgAEHAlYCAADYCECAAQQI2AgxBACEQDPsBCyAQQRVGDcUBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPoBCyAAQRA2AhwgACABNgIUIAAgEDYCDEEAIRAM+QELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDPEBCyAAQRE2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM+AELIBBBFUYNwQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM9wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIgBCyAAQRM2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM9gELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDO0BCyAAQRQ2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM9QELIBBBFUYNvQEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM9AELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIYBCyAAQRY2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM8wELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC3gICAACIEDQAgAUEBaiEBDOkBCyAAQRc2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM8gELIABBADYCHCAAIAE2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDPEBC0IBIRELIBBBAWohAQJAIAApAyAiEkL//////////w9WDQAgACASQgSGIBGENwMgIAEhAQyEAQsgAEEANgIcIAAgATYCFCAAQa2JgIAANgIQIABBDDYCDEEAIRAM7wELIABBADYCHCAAIBA2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDO4BCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNcyAAQQU2AhwgACAQNgIUIAAgFDYCDEEAIRAM7QELIABBADYCHCAAIBA2AhQgAEGqnICAADYCECAAQQ82AgxBACEQDOwBCyAAIBAgAhC0gICAACIBDQEgECEBC0EOIRAM0QELAkAgAUEVRw0AIABBAjYCHCAAIBA2AhQgAEGwmICAADYCECAAQRU2AgxBACEQDOoBCyAAQQA2AhwgACAQNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAzpAQsgAUEBaiEQAkAgAC8BMCIBQYABcUUNAAJAIAAgECACELuAgIAAIgENACAQIQEMcAsgAUEVRw26ASAAQQU2AhwgACAQNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAzpAQsCQCABQaAEcUGgBEcNACAALQAtQQJxDQAgAEEANgIcIAAgEDYCFCAAQZaTgIAANgIQIABBBDYCDEEAIRAM6QELIAAgECACEL2AgIAAGiAQIQECQAJAAkACQAJAIAAgECACELOAgIAADhYCAQAEBAQEBAQEBAQEBAQEBAQEBAQDBAsgAEEBOgAuCyAAIAAvATBBwAByOwEwIBAhAQtBJiEQDNEBCyAAQSM2AhwgACAQNgIUIABBpZaAgAA2AhAgAEEVNgIMQQAhEAzpAQsgAEEANgIcIAAgEDYCFCAAQdWLgIAANgIQIABBETYCDEEAIRAM6AELIAAtAC1BAXFFDQFBwwEhEAzOAQsCQCANIAJGDQADQAJAIA0tAABBIEYNACANIQEMxAELIA1BAWoiDSACRw0AC0ElIRAM5wELQSUhEAzmAQsgACgCBCEEIABBADYCBCAAIAQgDRCvgICAACIERQ2tASAAQSY2AhwgACAENgIMIAAgDUEBajYCFEEAIRAM5QELIBBBFUYNqwEgAEEANgIcIAAgATYCFCAAQf2NgIAANgIQIABBHTYCDEEAIRAM5AELIABBJzYCHCAAIAE2AhQgACAQNgIMQQAhEAzjAQsgECEBQQEhFAJAAkACQAJAAkACQAJAIAAtACxBfmoOBwYFBQMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0ErIRAMygELIABBADYCHCAAIBA2AhQgAEGrkoCAADYCECAAQQs2AgxBACEQDOIBCyAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMQQAhEAzhAQsgAEEAOgAsIBAhAQy9AQsgECEBQQEhFAJAAkACQAJAAkAgAC0ALEF7ag4EAwECAAULIAAgAC8BMEEIcjsBMAwDC0ECIRQMAQtBBCEUCyAAQQE6ACwgACAALwEwIBRyOwEwCyAQIQELQSkhEAzFAQsgAEEANgIcIAAgATYCFCAAQfCUgIAANgIQIABBAzYCDEEAIRAM3QELAkAgDi0AAEENRw0AIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHULIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzdAQsgAC0ALUEBcUUNAUHEASEQDMMBCwJAIA4gAkcNAEEtIRAM3AELAkACQANAAkAgDi0AAEF2ag4EAgAAAwALIA5BAWoiDiACRw0AC0EtIRAM3QELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDiEBDHQLIABBLDYCHCAAIA42AhQgACABNgIMQQAhEAzcAQsgACgCBCEBIABBADYCBAJAIAAgASAOELGAgIAAIgENACAOQQFqIQEMcwsgAEEsNgIcIAAgATYCDCAAIA5BAWo2AhRBACEQDNsBCyAAKAIEIQQgAEEANgIEIAAgBCAOELGAgIAAIgQNoAEgDiEBDM4BCyAQQSxHDQEgAUEBaiEQQQEhAQJAAkACQAJAAkAgAC0ALEF7ag4EAwECBAALIBAhAQwEC0ECIQEMAQtBBCEBCyAAQQE6ACwgACAALwEwIAFyOwEwIBAhAQwBCyAAIAAvATBBCHI7ATAgECEBC0E5IRAMvwELIABBADoALCABIQELQTQhEAy9AQsgACAALwEwQSByOwEwIAEhAQwCCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBA0AIAEhAQzHAQsgAEE3NgIcIAAgATYCFCAAIAQ2AgxBACEQDNQBCyAAQQg6ACwgASEBC0EwIRAMuQELAkAgAC0AKEEBRg0AIAEhAQwECyAALQAtQQhxRQ2TASABIQEMAwsgAC0AMEEgcQ2UAUHFASEQDLcBCwJAIA8gAkYNAAJAA0ACQCAPLQAAQVBqIgFB/wFxQQpJDQAgDyEBQTUhEAy6AQsgACkDICIRQpmz5syZs+bMGVYNASAAIBFCCn4iETcDICARIAGtQv8BgyISQn+FVg0BIAAgESASfDcDICAPQQFqIg8gAkcNAAtBOSEQDNEBCyAAKAIEIQIgAEEANgIEIAAgAiAPQQFqIgQQsYCAgAAiAg2VASAEIQEMwwELQTkhEAzPAQsCQCAALwEwIgFBCHFFDQAgAC0AKEEBRw0AIAAtAC1BCHFFDZABCyAAIAFB9/sDcUGABHI7ATAgDyEBC0E3IRAMtAELIAAgAC8BMEEQcjsBMAyrAQsgEEEVRg2LASAAQQA2AhwgACABNgIUIABB8I6AgAA2AhAgAEEcNgIMQQAhEAzLAQsgAEHDADYCHCAAIAE2AgwgACANQQFqNgIUQQAhEAzKAQsCQCABLQAAQTpHDQAgACgCBCEQIABBADYCBAJAIAAgECABEK+AgIAAIhANACABQQFqIQEMYwsgAEHDADYCHCAAIBA2AgwgACABQQFqNgIUQQAhEAzKAQsgAEEANgIcIAAgATYCFCAAQbGRgIAANgIQIABBCjYCDEEAIRAMyQELIABBADYCHCAAIAE2AhQgAEGgmYCAADYCECAAQR42AgxBACEQDMgBCyAAQQA2AgALIABBgBI7ASogACAXQQFqIgEgAhCogICAACIQDQEgASEBC0HHACEQDKwBCyAQQRVHDYMBIABB0QA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAzEAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAzDAQsgAEEANgIcIAAgFDYCFCAAQcGogIAANgIQIABBBzYCDCAAQQA2AgBBACEQDMIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxdCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDMEBC0EAIRAgAEEANgIcIAAgATYCFCAAQYCRgIAANgIQIABBCTYCDAzAAQsgEEEVRg19IABBADYCHCAAIAE2AhQgAEGUjYCAADYCECAAQSE2AgxBACEQDL8BC0EBIRZBACEXQQAhFEEBIRALIAAgEDoAKyABQQFqIQECQAJAIAAtAC1BEHENAAJAAkACQCAALQAqDgMBAAIECyAWRQ0DDAILIBQNAQwCCyAXRQ0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQrYCAgAAiEA0AIAEhAQxcCyAAQdgANgIcIAAgATYCFCAAIBA2AgxBACEQDL4BCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQytAQsgAEHZADYCHCAAIAE2AhQgACAENgIMQQAhEAy9AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMqwELIABB2gA2AhwgACABNgIUIAAgBDYCDEEAIRAMvAELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKkBCyAAQdwANgIcIAAgATYCFCAAIAQ2AgxBACEQDLsBCwJAIAEtAABBUGoiEEH/AXFBCk8NACAAIBA6ACogAUEBaiEBQc8AIRAMogELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKcBCyAAQd4ANgIcIAAgATYCFCAAIAQ2AgxBACEQDLoBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKUEjTw0AIAEhAQxZCyAAQQA2AhwgACABNgIUIABB04mAgAA2AhAgAEEINgIMQQAhEAy5AQsgAEEANgIAC0EAIRAgAEEANgIcIAAgATYCFCAAQZCzgIAANgIQIABBCDYCDAy3AQsgAEEANgIAIBdBAWohAQJAIAAtAClBIUcNACABIQEMVgsgAEEANgIcIAAgATYCFCAAQZuKgIAANgIQIABBCDYCDEEAIRAMtgELIABBADYCACAXQQFqIQECQCAALQApIhBBXWpBC08NACABIQEMVQsCQCAQQQZLDQBBASAQdEHKAHFFDQAgASEBDFULQQAhECAAQQA2AhwgACABNgIUIABB94mAgAA2AhAgAEEINgIMDLUBCyAQQRVGDXEgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMtAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFQLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMswELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMsgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMsQELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFELIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMsAELIABBADYCHCAAIAE2AhQgAEHGioCAADYCECAAQQc2AgxBACEQDK8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDK4BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDK0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDKwBCyAAQQA2AhwgACABNgIUIABB3IiAgAA2AhAgAEEHNgIMQQAhEAyrAQsgEEE/Rw0BIAFBAWohAQtBBSEQDJABC0EAIRAgAEEANgIcIAAgATYCFCAAQf2SgIAANgIQIABBBzYCDAyoAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAynAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAymAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMRgsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAylAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHSADYCHCAAIBQ2AhQgACABNgIMQQAhEAykAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHTADYCHCAAIBQ2AhQgACABNgIMQQAhEAyjAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMQwsgAEHlADYCHCAAIBQ2AhQgACABNgIMQQAhEAyiAQsgAEEANgIcIAAgFDYCFCAAQcOPgIAANgIQIABBBzYCDEEAIRAMoQELIABBADYCHCAAIAE2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKABC0EAIRAgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDAyfAQsgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDEEAIRAMngELIABBADYCHCAAIBQ2AhQgAEH+kYCAADYCECAAQQc2AgxBACEQDJ0BCyAAQQA2AhwgACABNgIUIABBjpuAgAA2AhAgAEEGNgIMQQAhEAycAQsgEEEVRg1XIABBADYCHCAAIAE2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDJsBCyAAQQA2AgAgEEEBaiEBQSQhEAsgACAQOgApIAAoAgQhECAAQQA2AgQgACAQIAEQq4CAgAAiEA1UIAEhAQw+CyAAQQA2AgALQQAhECAAQQA2AhwgACAENgIUIABB8ZuAgAA2AhAgAEEGNgIMDJcBCyABQRVGDVAgAEEANgIcIAAgBTYCFCAAQfCMgIAANgIQIABBGzYCDEEAIRAMlgELIAAoAgQhBSAAQQA2AgQgACAFIBAQqYCAgAAiBQ0BIBBBAWohBQtBrQEhEAx7CyAAQcEBNgIcIAAgBTYCDCAAIBBBAWo2AhRBACEQDJMBCyAAKAIEIQYgAEEANgIEIAAgBiAQEKmAgIAAIgYNASAQQQFqIQYLQa4BIRAMeAsgAEHCATYCHCAAIAY2AgwgACAQQQFqNgIUQQAhEAyQAQsgAEEANgIcIAAgBzYCFCAAQZeLgIAANgIQIABBDTYCDEEAIRAMjwELIABBADYCHCAAIAg2AhQgAEHjkICAADYCECAAQQk2AgxBACEQDI4BCyAAQQA2AhwgACAINgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAyNAQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgCUEBaiEIAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBCAAIBAgCBCtgICAACIQRQ09IABByQE2AhwgACAINgIUIAAgEDYCDEEAIRAMjAELIAAoAgQhBCAAQQA2AgQgACAEIAgQrYCAgAAiBEUNdiAAQcoBNgIcIAAgCDYCFCAAIAQ2AgxBACEQDIsBCyAAKAIEIQQgAEEANgIEIAAgBCAJEK2AgIAAIgRFDXQgAEHLATYCHCAAIAk2AhQgACAENgIMQQAhEAyKAQsgACgCBCEEIABBADYCBCAAIAQgChCtgICAACIERQ1yIABBzQE2AhwgACAKNgIUIAAgBDYCDEEAIRAMiQELAkAgCy0AAEFQaiIQQf8BcUEKTw0AIAAgEDoAKiALQQFqIQpBtgEhEAxwCyAAKAIEIQQgAEEANgIEIAAgBCALEK2AgIAAIgRFDXAgAEHPATYCHCAAIAs2AhQgACAENgIMQQAhEAyIAQsgAEEANgIcIAAgBDYCFCAAQZCzgIAANgIQIABBCDYCDCAAQQA2AgBBACEQDIcBCyABQRVGDT8gAEEANgIcIAAgDDYCFCAAQcyOgIAANgIQIABBIDYCDEEAIRAMhgELIABBgQQ7ASggACgCBCEQIABCADcDACAAIBAgDEEBaiIMEKuAgIAAIhBFDTggAEHTATYCHCAAIAw2AhQgACAQNgIMQQAhEAyFAQsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQdibgIAANgIQIABBCDYCDAyDAQsgACgCBCEQIABCADcDACAAIBAgC0EBaiILEKuAgIAAIhANAUHGASEQDGkLIABBAjoAKAxVCyAAQdUBNgIcIAAgCzYCFCAAIBA2AgxBACEQDIABCyAQQRVGDTcgAEEANgIcIAAgBDYCFCAAQaSMgIAANgIQIABBEDYCDEEAIRAMfwsgAC0ANEEBRw00IAAgBCACELyAgIAAIhBFDTQgEEEVRw01IABB3AE2AhwgACAENgIUIABB1ZaAgAA2AhAgAEEVNgIMQQAhEAx+C0EAIRAgAEEANgIcIABBr4uAgAA2AhAgAEECNgIMIAAgFEEBajYCFAx9C0EAIRAMYwtBAiEQDGILQQ0hEAxhC0EPIRAMYAtBJSEQDF8LQRMhEAxeC0EVIRAMXQtBFiEQDFwLQRchEAxbC0EYIRAMWgtBGSEQDFkLQRohEAxYC0EbIRAMVwtBHCEQDFYLQR0hEAxVC0EfIRAMVAtBISEQDFMLQSMhEAxSC0HGACEQDFELQS4hEAxQC0EvIRAMTwtBOyEQDE4LQT0hEAxNC0HIACEQDEwLQckAIRAMSwtBywAhEAxKC0HMACEQDEkLQc4AIRAMSAtB0QAhEAxHC0HVACEQDEYLQdgAIRAMRQtB2QAhEAxEC0HbACEQDEMLQeQAIRAMQgtB5QAhEAxBC0HxACEQDEALQfQAIRAMPwtBjQEhEAw+C0GXASEQDD0LQakBIRAMPAtBrAEhEAw7C0HAASEQDDoLQbkBIRAMOQtBrwEhEAw4C0GxASEQDDcLQbIBIRAMNgtBtAEhEAw1C0G1ASEQDDQLQboBIRAMMwtBvQEhEAwyC0G/ASEQDDELQcEBIRAMMAsgAEEANgIcIAAgBDYCFCAAQemLgIAANgIQIABBHzYCDEEAIRAMSAsgAEHbATYCHCAAIAQ2AhQgAEH6loCAADYCECAAQRU2AgxBACEQDEcLIABB+AA2AhwgACAMNgIUIABBypiAgAA2AhAgAEEVNgIMQQAhEAxGCyAAQdEANgIcIAAgBTYCFCAAQbCXgIAANgIQIABBFTYCDEEAIRAMRQsgAEH5ADYCHCAAIAE2AhQgACAQNgIMQQAhEAxECyAAQfgANgIcIAAgATYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMQwsgAEHkADYCHCAAIAE2AhQgAEHjl4CAADYCECAAQRU2AgxBACEQDEILIABB1wA2AhwgACABNgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAxBCyAAQQA2AhwgACABNgIUIABBuY2AgAA2AhAgAEEaNgIMQQAhEAxACyAAQcIANgIcIAAgATYCFCAAQeOYgIAANgIQIABBFTYCDEEAIRAMPwsgAEEANgIEIAAgDyAPELGAgIAAIgRFDQEgAEE6NgIcIAAgBDYCDCAAIA9BAWo2AhRBACEQDD4LIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCxgICAACIERQ0AIABBOzYCHCAAIAQ2AgwgACABQQFqNgIUQQAhEAw+CyABQQFqIQEMLQsgD0EBaiEBDC0LIABBADYCHCAAIA82AhQgAEHkkoCAADYCECAAQQQ2AgxBACEQDDsLIABBNjYCHCAAIAQ2AhQgACACNgIMQQAhEAw6CyAAQS42AhwgACAONgIUIAAgBDYCDEEAIRAMOQsgAEHQADYCHCAAIAE2AhQgAEGRmICAADYCECAAQRU2AgxBACEQDDgLIA1BAWohAQwsCyAAQRU2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAw2CyAAQRs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw1CyAAQQ82AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw0CyAAQQs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAwzCyAAQRo2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwyCyAAQQs2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwxCyAAQQo2AhwgACABNgIUIABB5JaAgAA2AhAgAEEVNgIMQQAhEAwwCyAAQR42AhwgACABNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAwvCyAAQQA2AhwgACAQNgIUIABB2o2AgAA2AhAgAEEUNgIMQQAhEAwuCyAAQQQ2AhwgACABNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAwtCyAAQQA2AgAgC0EBaiELC0G4ASEQDBILIABBADYCACAQQQFqIQFB9QAhEAwRCyABIQECQCAALQApQQVHDQBB4wAhEAwRC0HiACEQDBALQQAhECAAQQA2AhwgAEHkkYCAADYCECAAQQc2AgwgACAUQQFqNgIUDCgLIABBADYCACAXQQFqIQFBwAAhEAwOC0EBIQELIAAgAToALCAAQQA2AgAgF0EBaiEBC0EoIRAMCwsgASEBC0E4IRAMCQsCQCABIg8gAkYNAANAAkAgDy0AAEGAvoCAAGotAAAiAUEBRg0AIAFBAkcNAyAPQQFqIQEMBAsgD0EBaiIPIAJHDQALQT4hEAwiC0E+IRAMIQsgAEEAOgAsIA8hAQwBC0ELIRAMBgtBOiEQDAULIAFBAWohAUEtIRAMBAsgACABOgAsIABBADYCACAWQQFqIQFBDCEQDAMLIABBADYCACAXQQFqIQFBCiEQDAILIABBADYCAAsgAEEAOgAsIA0hAUEJIRAMAAsLQQAhECAAQQA2AhwgACALNgIUIABBzZCAgAA2AhAgAEEJNgIMDBcLQQAhECAAQQA2AhwgACAKNgIUIABB6YqAgAA2AhAgAEEJNgIMDBYLQQAhECAAQQA2AhwgACAJNgIUIABBt5CAgAA2AhAgAEEJNgIMDBULQQAhECAAQQA2AhwgACAINgIUIABBnJGAgAA2AhAgAEEJNgIMDBQLQQAhECAAQQA2AhwgACABNgIUIABBzZCAgAA2AhAgAEEJNgIMDBMLQQAhECAAQQA2AhwgACABNgIUIABB6YqAgAA2AhAgAEEJNgIMDBILQQAhECAAQQA2AhwgACABNgIUIABBt5CAgAA2AhAgAEEJNgIMDBELQQAhECAAQQA2AhwgACABNgIUIABBnJGAgAA2AhAgAEEJNgIMDBALQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA8LQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA4LQQAhECAAQQA2AhwgACABNgIUIABBwJKAgAA2AhAgAEELNgIMDA0LQQAhECAAQQA2AhwgACABNgIUIABBlYmAgAA2AhAgAEELNgIMDAwLQQAhECAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMDAsLQQAhECAAQQA2AhwgACABNgIUIABB+4+AgAA2AhAgAEEKNgIMDAoLQQAhECAAQQA2AhwgACABNgIUIABB8ZmAgAA2AhAgAEECNgIMDAkLQQAhECAAQQA2AhwgACABNgIUIABBxJSAgAA2AhAgAEECNgIMDAgLQQAhECAAQQA2AhwgACABNgIUIABB8pWAgAA2AhAgAEECNgIMDAcLIABBAjYCHCAAIAE2AhQgAEGcmoCAADYCECAAQRY2AgxBACEQDAYLQQEhEAwFC0HUACEQIAEiBCACRg0EIANBCGogACAEIAJB2MKAgABBChDFgICAACADKAIMIQQgAygCCA4DAQQCAAsQyoCAgAAACyAAQQA2AhwgAEG1moCAADYCECAAQRc2AgwgACAEQQFqNgIUQQAhEAwCCyAAQQA2AhwgACAENgIUIABBypqAgAA2AhAgAEEJNgIMQQAhEAwBCwJAIAEiBCACRw0AQSIhEAwBCyAAQYmAgIAANgIIIAAgBDYCBEEhIRALIANBEGokgICAgAAgEAuvAQECfyABKAIAIQYCQAJAIAIgA0YNACAEIAZqIQQgBiADaiACayEHIAIgBkF/cyAFaiIGaiEFA0ACQCACLQAAIAQtAABGDQBBAiEEDAMLAkAgBg0AQQAhBCAFIQIMAwsgBkF/aiEGIARBAWohBCACQQFqIgIgA0cNAAsgByEGIAMhAgsgAEEBNgIAIAEgBjYCACAAIAI2AgQPCyABQQA2AgAgACAENgIAIAAgAjYCBAsKACAAEMeAgIAAC/I2AQt/I4CAgIAAQRBrIgEkgICAgAACQEEAKAKg0ICAAA0AQQAQy4CAgABBgNSEgABrIgJB2QBJDQBBACEDAkBBACgC4NOAgAAiBA0AQQBCfzcC7NOAgABBAEKAgISAgIDAADcC5NOAgABBACABQQhqQXBxQdiq1aoFcyIENgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgAALQQAgAjYCzNOAgABBAEGA1ISAADYCyNOAgABBAEGA1ISAADYCmNCAgABBACAENgKs0ICAAEEAQX82AqjQgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAtBgNSEgABBeEGA1ISAAGtBD3FBAEGA1ISAAEEIakEPcRsiA2oiBEEEaiACQUhqIgUgA2siA0EBcjYCAEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgABBgNSEgAAgBWpBODYCBAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEHsAUsNAAJAQQAoAojQgIAAIgZBECAAQRNqQXBxIABBC0kbIgJBA3YiBHYiA0EDcUUNAAJAAkAgA0EBcSAEckEBcyIFQQN0IgRBsNCAgABqIgMgBEG40ICAAGooAgAiBCgCCCICRw0AQQAgBkF+IAV3cTYCiNCAgAAMAQsgAyACNgIIIAIgAzYCDAsgBEEIaiEDIAQgBUEDdCIFQQNyNgIEIAQgBWoiBCAEKAIEQQFyNgIEDAwLIAJBACgCkNCAgAAiB00NAQJAIANFDQACQAJAIAMgBHRBAiAEdCIDQQAgA2tycSIDQQAgA2txQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmoiBEEDdCIDQbDQgIAAaiIFIANBuNCAgABqKAIAIgMoAggiAEcNAEEAIAZBfiAEd3EiBjYCiNCAgAAMAQsgBSAANgIIIAAgBTYCDAsgAyACQQNyNgIEIAMgBEEDdCIEaiAEIAJrIgU2AgAgAyACaiIAIAVBAXI2AgQCQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhBAJAAkAgBkEBIAdBA3Z0IghxDQBBACAGIAhyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAQ2AgwgAiAENgIIIAQgAjYCDCAEIAg2AggLIANBCGohA0EAIAA2ApzQgIAAQQAgBTYCkNCAgAAMDAtBACgCjNCAgAAiCUUNASAJQQAgCWtxQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmpBAnRBuNKAgABqKAIAIgAoAgRBeHEgAmshBCAAIQUCQANAAkAgBSgCECIDDQAgBUEUaigCACIDRQ0CCyADKAIEQXhxIAJrIgUgBCAFIARJIgUbIQQgAyAAIAUbIQAgAyEFDAALCyAAKAIYIQoCQCAAKAIMIgggAEYNACAAKAIIIgNBACgCmNCAgABJGiAIIAM2AgggAyAINgIMDAsLAkAgAEEUaiIFKAIAIgMNACAAKAIQIgNFDQMgAEEQaiEFCwNAIAUhCyADIghBFGoiBSgCACIDDQAgCEEQaiEFIAgoAhAiAw0ACyALQQA2AgAMCgtBfyECIABBv39LDQAgAEETaiIDQXBxIQJBACgCjNCAgAAiB0UNAEEAIQsCQCACQYACSQ0AQR8hCyACQf///wdLDQAgA0EIdiIDIANBgP4/akEQdkEIcSIDdCIEIARBgOAfakEQdkEEcSIEdCIFIAVBgIAPakEQdkECcSIFdEEPdiADIARyIAVyayIDQQF0IAIgA0EVanZBAXFyQRxqIQsLQQAgAmshBAJAAkACQAJAIAtBAnRBuNKAgABqKAIAIgUNAEEAIQNBACEIDAELQQAhAyACQQBBGSALQQF2ayALQR9GG3QhAEEAIQgDQAJAIAUoAgRBeHEgAmsiBiAETw0AIAYhBCAFIQggBg0AQQAhBCAFIQggBSEDDAMLIAMgBUEUaigCACIGIAYgBSAAQR12QQRxakEQaigCACIFRhsgAyAGGyEDIABBAXQhACAFDQALCwJAIAMgCHINAEEAIQhBAiALdCIDQQAgA2tyIAdxIgNFDQMgA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBUEFdkEIcSIAIANyIAUgAHYiA0ECdkEEcSIFciADIAV2IgNBAXZBAnEiBXIgAyAFdiIDQQF2QQFxIgVyIAMgBXZqQQJ0QbjSgIAAaigCACEDCyADRQ0BCwNAIAMoAgRBeHEgAmsiBiAESSEAAkAgAygCECIFDQAgA0EUaigCACEFCyAGIAQgABshBCADIAggABshCCAFIQMgBQ0ACwsgCEUNACAEQQAoApDQgIAAIAJrTw0AIAgoAhghCwJAIAgoAgwiACAIRg0AIAgoAggiA0EAKAKY0ICAAEkaIAAgAzYCCCADIAA2AgwMCQsCQCAIQRRqIgUoAgAiAw0AIAgoAhAiA0UNAyAIQRBqIQULA0AgBSEGIAMiAEEUaiIFKAIAIgMNACAAQRBqIQUgACgCECIDDQALIAZBADYCAAwICwJAQQAoApDQgIAAIgMgAkkNAEEAKAKc0ICAACEEAkACQCADIAJrIgVBEEkNACAEIAJqIgAgBUEBcjYCBEEAIAU2ApDQgIAAQQAgADYCnNCAgAAgBCADaiAFNgIAIAQgAkEDcjYCBAwBCyAEIANBA3I2AgQgBCADaiIDIAMoAgRBAXI2AgRBAEEANgKc0ICAAEEAQQA2ApDQgIAACyAEQQhqIQMMCgsCQEEAKAKU0ICAACIAIAJNDQBBACgCoNCAgAAiAyACaiIEIAAgAmsiBUEBcjYCBEEAIAU2ApTQgIAAQQAgBDYCoNCAgAAgAyACQQNyNgIEIANBCGohAwwKCwJAAkBBACgC4NOAgABFDQBBACgC6NOAgAAhBAwBC0EAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEMakFwcUHYqtWqBXM2AuDTgIAAQQBBADYC9NOAgABBAEEANgLE04CAAEGAgAQhBAtBACEDAkAgBCACQccAaiIHaiIGQQAgBGsiC3EiCCACSw0AQQBBMDYC+NOAgAAMCgsCQEEAKALA04CAACIDRQ0AAkBBACgCuNOAgAAiBCAIaiIFIARNDQAgBSADTQ0BC0EAIQNBAEEwNgL404CAAAwKC0EALQDE04CAAEEEcQ0EAkACQAJAQQAoAqDQgIAAIgRFDQBByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiAESw0DCyADKAIIIgMNAAsLQQAQy4CAgAAiAEF/Rg0FIAghBgJAQQAoAuTTgIAAIgNBf2oiBCAAcUUNACAIIABrIAQgAGpBACADa3FqIQYLIAYgAk0NBSAGQf7///8HSw0FAkBBACgCwNOAgAAiA0UNAEEAKAK404CAACIEIAZqIgUgBE0NBiAFIANLDQYLIAYQy4CAgAAiAyAARw0BDAcLIAYgAGsgC3EiBkH+////B0sNBCAGEMuAgIAAIgAgAygCACADKAIEakYNAyAAIQMLAkAgA0F/Rg0AIAJByABqIAZNDQACQCAHIAZrQQAoAujTgIAAIgRqQQAgBGtxIgRB/v///wdNDQAgAyEADAcLAkAgBBDLgICAAEF/Rg0AIAQgBmohBiADIQAMBwtBACAGaxDLgICAABoMBAsgAyEAIANBf0cNBQwDC0EAIQgMBwtBACEADAULIABBf0cNAgtBAEEAKALE04CAAEEEcjYCxNOAgAALIAhB/v///wdLDQEgCBDLgICAACEAQQAQy4CAgAAhAyAAQX9GDQEgA0F/Rg0BIAAgA08NASADIABrIgYgAkE4ak0NAQtBAEEAKAK404CAACAGaiIDNgK404CAAAJAIANBACgCvNOAgABNDQBBACADNgK804CAAAsCQAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQCAAIAMoAgAiBSADKAIEIghqRg0CIAMoAggiAw0ADAMLCwJAAkBBACgCmNCAgAAiA0UNACAAIANPDQELQQAgADYCmNCAgAALQQAhA0EAIAY2AszTgIAAQQAgADYCyNOAgABBAEF/NgKo0ICAAEEAQQAoAuDTgIAANgKs0ICAAEEAQQA2AtTTgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiBCAGQUhqIgUgA2siA0EBcjYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgAAgACAFakE4NgIEDAILIAMtAAxBCHENACAEIAVJDQAgBCAATw0AIARBeCAEa0EPcUEAIARBCGpBD3EbIgVqIgBBACgClNCAgAAgBmoiCyAFayIFQQFyNgIEIAMgCCAGajYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAU2ApTQgIAAQQAgADYCoNCAgAAgBCALakE4NgIEDAELAkAgAEEAKAKY0ICAACIITw0AQQAgADYCmNCAgAAgACEICyAAIAZqIQVByNOAgAAhAwJAAkACQAJAAkACQAJAA0AgAygCACAFRg0BIAMoAggiAw0ADAILCyADLQAMQQhxRQ0BC0HI04CAACEDA0ACQCADKAIAIgUgBEsNACAFIAMoAgRqIgUgBEsNAwsgAygCCCEDDAALCyADIAA2AgAgAyADKAIEIAZqNgIEIABBeCAAa0EPcUEAIABBCGpBD3EbaiILIAJBA3I2AgQgBUF4IAVrQQ9xQQAgBUEIakEPcRtqIgYgCyACaiICayEDAkAgBiAERw0AQQAgAjYCoNCAgABBAEEAKAKU0ICAACADaiIDNgKU0ICAACACIANBAXI2AgQMAwsCQCAGQQAoApzQgIAARw0AQQAgAjYCnNCAgABBAEEAKAKQ0ICAACADaiIDNgKQ0ICAACACIANBAXI2AgQgAiADaiADNgIADAMLAkAgBigCBCIEQQNxQQFHDQAgBEF4cSEHAkACQCAEQf8BSw0AIAYoAggiBSAEQQN2IghBA3RBsNCAgABqIgBGGgJAIAYoAgwiBCAFRw0AQQBBACgCiNCAgABBfiAId3E2AojQgIAADAILIAQgAEYaIAQgBTYCCCAFIAQ2AgwMAQsgBigCGCEJAkACQCAGKAIMIgAgBkYNACAGKAIIIgQgCEkaIAAgBDYCCCAEIAA2AgwMAQsCQCAGQRRqIgQoAgAiBQ0AIAZBEGoiBCgCACIFDQBBACEADAELA0AgBCEIIAUiAEEUaiIEKAIAIgUNACAAQRBqIQQgACgCECIFDQALIAhBADYCAAsgCUUNAAJAAkAgBiAGKAIcIgVBAnRBuNKAgABqIgQoAgBHDQAgBCAANgIAIAANAUEAQQAoAozQgIAAQX4gBXdxNgKM0ICAAAwCCyAJQRBBFCAJKAIQIAZGG2ogADYCACAARQ0BCyAAIAk2AhgCQCAGKAIQIgRFDQAgACAENgIQIAQgADYCGAsgBigCFCIERQ0AIABBFGogBDYCACAEIAA2AhgLIAcgA2ohAyAGIAdqIgYoAgQhBAsgBiAEQX5xNgIEIAIgA2ogAzYCACACIANBAXI2AgQCQCADQf8BSw0AIANBeHFBsNCAgABqIQQCQAJAQQAoAojQgIAAIgVBASADQQN2dCIDcQ0AQQAgBSADcjYCiNCAgAAgBCEDDAELIAQoAgghAwsgAyACNgIMIAQgAjYCCCACIAQ2AgwgAiADNgIIDAMLQR8hBAJAIANB////B0sNACADQQh2IgQgBEGA/j9qQRB2QQhxIgR0IgUgBUGA4B9qQRB2QQRxIgV0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAQgBXIgAHJrIgRBAXQgAyAEQRVqdkEBcXJBHGohBAsgAiAENgIcIAJCADcCECAEQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiAEEBIAR0IghxDQAgBSACNgIAQQAgACAIcjYCjNCAgAAgAiAFNgIYIAIgAjYCCCACIAI2AgwMAwsgA0EAQRkgBEEBdmsgBEEfRht0IQQgBSgCACEAA0AgACIFKAIEQXhxIANGDQIgBEEddiEAIARBAXQhBCAFIABBBHFqQRBqIggoAgAiAA0ACyAIIAI2AgAgAiAFNgIYIAIgAjYCDCACIAI2AggMAgsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiCyAGQUhqIgggA2siA0EBcjYCBCAAIAhqQTg2AgQgBCAFQTcgBWtBD3FBACAFQUlqQQ9xG2pBQWoiCCAIIARBEGpJGyIIQSM2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAs2AqDQgIAAIAhBEGpBACkC0NOAgAA3AgAgCEEAKQLI04CAADcCCEEAIAhBCGo2AtDTgIAAQQAgBjYCzNOAgABBACAANgLI04CAAEEAQQA2AtTTgIAAIAhBJGohAwNAIANBBzYCACADQQRqIgMgBUkNAAsgCCAERg0DIAggCCgCBEF+cTYCBCAIIAggBGsiADYCACAEIABBAXI2AgQCQCAAQf8BSw0AIABBeHFBsNCAgABqIQMCQAJAQQAoAojQgIAAIgVBASAAQQN2dCIAcQ0AQQAgBSAAcjYCiNCAgAAgAyEFDAELIAMoAgghBQsgBSAENgIMIAMgBDYCCCAEIAM2AgwgBCAFNgIIDAQLQR8hAwJAIABB////B0sNACAAQQh2IgMgA0GA/j9qQRB2QQhxIgN0IgUgBUGA4B9qQRB2QQRxIgV0IgggCEGAgA9qQRB2QQJxIgh0QQ92IAMgBXIgCHJrIgNBAXQgACADQRVqdkEBcXJBHGohAwsgBCADNgIcIARCADcCECADQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiCEEBIAN0IgZxDQAgBSAENgIAQQAgCCAGcjYCjNCAgAAgBCAFNgIYIAQgBDYCCCAEIAQ2AgwMBAsgAEEAQRkgA0EBdmsgA0EfRht0IQMgBSgCACEIA0AgCCIFKAIEQXhxIABGDQMgA0EddiEIIANBAXQhAyAFIAhBBHFqQRBqIgYoAgAiCA0ACyAGIAQ2AgAgBCAFNgIYIAQgBDYCDCAEIAQ2AggMAwsgBSgCCCIDIAI2AgwgBSACNgIIIAJBADYCGCACIAU2AgwgAiADNgIICyALQQhqIQMMBQsgBSgCCCIDIAQ2AgwgBSAENgIIIARBADYCGCAEIAU2AgwgBCADNgIIC0EAKAKU0ICAACIDIAJNDQBBACgCoNCAgAAiBCACaiIFIAMgAmsiA0EBcjYCBEEAIAM2ApTQgIAAQQAgBTYCoNCAgAAgBCACQQNyNgIEIARBCGohAwwDC0EAIQNBAEEwNgL404CAAAwCCwJAIAtFDQACQAJAIAggCCgCHCIFQQJ0QbjSgIAAaiIDKAIARw0AIAMgADYCACAADQFBACAHQX4gBXdxIgc2AozQgIAADAILIAtBEEEUIAsoAhAgCEYbaiAANgIAIABFDQELIAAgCzYCGAJAIAgoAhAiA0UNACAAIAM2AhAgAyAANgIYCyAIQRRqKAIAIgNFDQAgAEEUaiADNgIAIAMgADYCGAsCQAJAIARBD0sNACAIIAQgAmoiA0EDcjYCBCAIIANqIgMgAygCBEEBcjYCBAwBCyAIIAJqIgAgBEEBcjYCBCAIIAJBA3I2AgQgACAEaiAENgIAAkAgBEH/AUsNACAEQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgBEEDdnQiBHENAEEAIAUgBHI2AojQgIAAIAMhBAwBCyADKAIIIQQLIAQgADYCDCADIAA2AgggACADNgIMIAAgBDYCCAwBC0EfIQMCQCAEQf///wdLDQAgBEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCICIAJBgIAPakEQdkECcSICdEEPdiADIAVyIAJyayIDQQF0IAQgA0EVanZBAXFyQRxqIQMLIAAgAzYCHCAAQgA3AhAgA0ECdEG40oCAAGohBQJAIAdBASADdCICcQ0AIAUgADYCAEEAIAcgAnI2AozQgIAAIAAgBTYCGCAAIAA2AgggACAANgIMDAELIARBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhAgJAA0AgAiIFKAIEQXhxIARGDQEgA0EddiECIANBAXQhAyAFIAJBBHFqQRBqIgYoAgAiAg0ACyAGIAA2AgAgACAFNgIYIAAgADYCDCAAIAA2AggMAQsgBSgCCCIDIAA2AgwgBSAANgIIIABBADYCGCAAIAU2AgwgACADNgIICyAIQQhqIQMMAQsCQCAKRQ0AAkACQCAAIAAoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAg2AgAgCA0BQQAgCUF+IAV3cTYCjNCAgAAMAgsgCkEQQRQgCigCECAARhtqIAg2AgAgCEUNAQsgCCAKNgIYAkAgACgCECIDRQ0AIAggAzYCECADIAg2AhgLIABBFGooAgAiA0UNACAIQRRqIAM2AgAgAyAINgIYCwJAAkAgBEEPSw0AIAAgBCACaiIDQQNyNgIEIAAgA2oiAyADKAIEQQFyNgIEDAELIAAgAmoiBSAEQQFyNgIEIAAgAkEDcjYCBCAFIARqIAQ2AgACQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhAwJAAkBBASAHQQN2dCIIIAZxDQBBACAIIAZyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAM2AgwgAiADNgIIIAMgAjYCDCADIAg2AggLQQAgBTYCnNCAgABBACAENgKQ0ICAAAsgAEEIaiEDCyABQRBqJICAgIAAIAMLCgAgABDJgICAAAviDQEHfwJAIABFDQAgAEF4aiIBIABBfGooAgAiAkF4cSIAaiEDAkAgAkEBcQ0AIAJBA3FFDQEgASABKAIAIgJrIgFBACgCmNCAgAAiBEkNASACIABqIQACQCABQQAoApzQgIAARg0AAkAgAkH/AUsNACABKAIIIgQgAkEDdiIFQQN0QbDQgIAAaiIGRhoCQCABKAIMIgIgBEcNAEEAQQAoAojQgIAAQX4gBXdxNgKI0ICAAAwDCyACIAZGGiACIAQ2AgggBCACNgIMDAILIAEoAhghBwJAAkAgASgCDCIGIAFGDQAgASgCCCICIARJGiAGIAI2AgggAiAGNgIMDAELAkAgAUEUaiICKAIAIgQNACABQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQECQAJAIAEgASgCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAwsgB0EQQRQgBygCECABRhtqIAY2AgAgBkUNAgsgBiAHNgIYAkAgASgCECICRQ0AIAYgAjYCECACIAY2AhgLIAEoAhQiAkUNASAGQRRqIAI2AgAgAiAGNgIYDAELIAMoAgQiAkEDcUEDRw0AIAMgAkF+cTYCBEEAIAA2ApDQgIAAIAEgAGogADYCACABIABBAXI2AgQPCyABIANPDQAgAygCBCICQQFxRQ0AAkACQCACQQJxDQACQCADQQAoAqDQgIAARw0AQQAgATYCoNCAgABBAEEAKAKU0ICAACAAaiIANgKU0ICAACABIABBAXI2AgQgAUEAKAKc0ICAAEcNA0EAQQA2ApDQgIAAQQBBADYCnNCAgAAPCwJAIANBACgCnNCAgABHDQBBACABNgKc0ICAAEEAQQAoApDQgIAAIABqIgA2ApDQgIAAIAEgAEEBcjYCBCABIABqIAA2AgAPCyACQXhxIABqIQACQAJAIAJB/wFLDQAgAygCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgAygCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAgsgAiAGRhogAiAENgIIIAQgAjYCDAwBCyADKAIYIQcCQAJAIAMoAgwiBiADRg0AIAMoAggiAkEAKAKY0ICAAEkaIAYgAjYCCCACIAY2AgwMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEGDAELA0AgAiEFIAQiBkEUaiICKAIAIgQNACAGQRBqIQIgBigCECIEDQALIAVBADYCAAsgB0UNAAJAAkAgAyADKAIcIgRBAnRBuNKAgABqIgIoAgBHDQAgAiAGNgIAIAYNAUEAQQAoAozQgIAAQX4gBHdxNgKM0ICAAAwCCyAHQRBBFCAHKAIQIANGG2ogBjYCACAGRQ0BCyAGIAc2AhgCQCADKAIQIgJFDQAgBiACNgIQIAIgBjYCGAsgAygCFCICRQ0AIAZBFGogAjYCACACIAY2AhgLIAEgAGogADYCACABIABBAXI2AgQgAUEAKAKc0ICAAEcNAUEAIAA2ApDQgIAADwsgAyACQX5xNgIEIAEgAGogADYCACABIABBAXI2AgQLAkAgAEH/AUsNACAAQXhxQbDQgIAAaiECAkACQEEAKAKI0ICAACIEQQEgAEEDdnQiAHENAEEAIAQgAHI2AojQgIAAIAIhAAwBCyACKAIIIQALIAAgATYCDCACIAE2AgggASACNgIMIAEgADYCCA8LQR8hAgJAIABB////B0sNACAAQQh2IgIgAkGA/j9qQRB2QQhxIgJ0IgQgBEGA4B9qQRB2QQRxIgR0IgYgBkGAgA9qQRB2QQJxIgZ0QQ92IAIgBHIgBnJrIgJBAXQgACACQRVqdkEBcXJBHGohAgsgASACNgIcIAFCADcCECACQQJ0QbjSgIAAaiEEAkACQEEAKAKM0ICAACIGQQEgAnQiA3ENACAEIAE2AgBBACAGIANyNgKM0ICAACABIAQ2AhggASABNgIIIAEgATYCDAwBCyAAQQBBGSACQQF2ayACQR9GG3QhAiAEKAIAIQYCQANAIAYiBCgCBEF4cSAARg0BIAJBHXYhBiACQQF0IQIgBCAGQQRxakEQaiIDKAIAIgYNAAsgAyABNgIAIAEgBDYCGCABIAE2AgwgASABNgIIDAELIAQoAggiACABNgIMIAQgATYCCCABQQA2AhggASAENgIMIAEgADYCCAtBAEEAKAKo0ICAAEF/aiIBQX8gARs2AqjQgIAACwsEAAAAC04AAkAgAA0APwBBEHQPCwJAIABB//8DcQ0AIABBf0wNAAJAIABBEHZAACIAQX9HDQBBAEEwNgL404CAAEF/DwsgAEEQdA8LEMqAgIAAAAvyAgIDfwF+AkAgAkUNACAAIAE6AAAgAiAAaiIDQX9qIAE6AAAgAkEDSQ0AIAAgAToAAiAAIAE6AAEgA0F9aiABOgAAIANBfmogAToAACACQQdJDQAgACABOgADIANBfGogAToAACACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiATYCACADIAIgBGtBfHEiBGoiAkF8aiABNgIAIARBCUkNACADIAE2AgggAyABNgIEIAJBeGogATYCACACQXRqIAE2AgAgBEEZSQ0AIAMgATYCGCADIAE2AhQgAyABNgIQIAMgATYCDCACQXBqIAE2AgAgAkFsaiABNgIAIAJBaGogATYCACACQWRqIAE2AgAgBCADQQRxQRhyIgVrIgJBIEkNACABrUKBgICAEH4hBiADIAVqIQEDQCABIAY3AxggASAGNwMQIAEgBjcDCCABIAY3AwAgAUEgaiEBIAJBYGoiAkEfSw0ACwsgAAsLjkgBAEGACAuGSAEAAAACAAAAAwAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAYAAAAHAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=='\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.enumToMap = void 0;\nfunction enumToMap(obj) {\n const res = {};\n Object.keys(obj).forEach((key) => {\n const value = obj[key];\n if (typeof value === 'number') {\n res[key] = value;\n }\n });\n return res;\n}\nexports.enumToMap = enumToMap;\n//# sourceMappingURL=utils.js.map","'use strict'\n\nconst { kClients } = require('../core/symbols')\nconst Agent = require('../agent')\nconst {\n kAgent,\n kMockAgentSet,\n kMockAgentGet,\n kDispatches,\n kIsMockActive,\n kNetConnect,\n kGetNetConnect,\n kOptions,\n kFactory\n} = require('./mock-symbols')\nconst MockClient = require('./mock-client')\nconst MockPool = require('./mock-pool')\nconst { matchValue, buildMockOptions } = require('./mock-utils')\nconst { InvalidArgumentError, UndiciError } = require('../core/errors')\nconst Dispatcher = require('../dispatcher')\nconst Pluralizer = require('./pluralizer')\nconst PendingInterceptorsFormatter = require('./pending-interceptors-formatter')\n\nclass FakeWeakRef {\n constructor (value) {\n this.value = value\n }\n\n deref () {\n return this.value\n }\n}\n\nclass MockAgent extends Dispatcher {\n constructor (opts) {\n super(opts)\n\n this[kNetConnect] = true\n this[kIsMockActive] = true\n\n // Instantiate Agent and encapsulate\n if ((opts && opts.agent && typeof opts.agent.dispatch !== 'function')) {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n const agent = opts && opts.agent ? opts.agent : new Agent(opts)\n this[kAgent] = agent\n\n this[kClients] = agent[kClients]\n this[kOptions] = buildMockOptions(opts)\n }\n\n get (origin) {\n let dispatcher = this[kMockAgentGet](origin)\n\n if (!dispatcher) {\n dispatcher = this[kFactory](origin)\n this[kMockAgentSet](origin, dispatcher)\n }\n return dispatcher\n }\n\n dispatch (opts, handler) {\n // Call MockAgent.get to perform additional setup before dispatching as normal\n this.get(opts.origin)\n return this[kAgent].dispatch(opts, handler)\n }\n\n async close () {\n await this[kAgent].close()\n this[kClients].clear()\n }\n\n deactivate () {\n this[kIsMockActive] = false\n }\n\n activate () {\n this[kIsMockActive] = true\n }\n\n enableNetConnect (matcher) {\n if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) {\n if (Array.isArray(this[kNetConnect])) {\n this[kNetConnect].push(matcher)\n } else {\n this[kNetConnect] = [matcher]\n }\n } else if (typeof matcher === 'undefined') {\n this[kNetConnect] = true\n } else {\n throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.')\n }\n }\n\n disableNetConnect () {\n this[kNetConnect] = false\n }\n\n // This is required to bypass issues caused by using global symbols - see:\n // https://github.com/nodejs/undici/issues/1447\n get isMockActive () {\n return this[kIsMockActive]\n }\n\n [kMockAgentSet] (origin, dispatcher) {\n this[kClients].set(origin, new FakeWeakRef(dispatcher))\n }\n\n [kFactory] (origin) {\n const mockOptions = Object.assign({ agent: this }, this[kOptions])\n return this[kOptions] && this[kOptions].connections === 1\n ? new MockClient(origin, mockOptions)\n : new MockPool(origin, mockOptions)\n }\n\n [kMockAgentGet] (origin) {\n // First check if we can immediately find it\n const ref = this[kClients].get(origin)\n if (ref) {\n return ref.deref()\n }\n\n // If the origin is not a string create a dummy parent pool and return to user\n if (typeof origin !== 'string') {\n const dispatcher = this[kFactory]('http://localhost:9999')\n this[kMockAgentSet](origin, dispatcher)\n return dispatcher\n }\n\n // If we match, create a pool and assign the same dispatches\n for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) {\n const nonExplicitDispatcher = nonExplicitRef.deref()\n if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) {\n const dispatcher = this[kFactory](origin)\n this[kMockAgentSet](origin, dispatcher)\n dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches]\n return dispatcher\n }\n }\n }\n\n [kGetNetConnect] () {\n return this[kNetConnect]\n }\n\n pendingInterceptors () {\n const mockAgentClients = this[kClients]\n\n return Array.from(mockAgentClients.entries())\n .flatMap(([origin, scope]) => scope.deref()[kDispatches].map(dispatch => ({ ...dispatch, origin })))\n .filter(({ pending }) => pending)\n }\n\n assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) {\n const pending = this.pendingInterceptors()\n\n if (pending.length === 0) {\n return\n }\n\n const pluralizer = new Pluralizer('interceptor', 'interceptors').pluralize(pending.length)\n\n throw new UndiciError(`\n${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending:\n\n${pendingInterceptorsFormatter.format(pending)}\n`.trim())\n }\n}\n\nmodule.exports = MockAgent\n","'use strict'\n\nconst { promisify } = require('util')\nconst Client = require('../client')\nconst { buildMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kMockAgent,\n kClose,\n kOriginalClose,\n kOrigin,\n kOriginalDispatch,\n kConnected\n} = require('./mock-symbols')\nconst { MockInterceptor } = require('./mock-interceptor')\nconst Symbols = require('../core/symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\n/**\n * MockClient provides an API that extends the Client to influence the mockDispatches.\n */\nclass MockClient extends Client {\n constructor (origin, opts) {\n super(origin, opts)\n\n if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n\n this[kMockAgent] = opts.agent\n this[kOrigin] = origin\n this[kDispatches] = []\n this[kConnected] = 1\n this[kOriginalDispatch] = this.dispatch\n this[kOriginalClose] = this.close.bind(this)\n\n this.dispatch = buildMockDispatch.call(this)\n this.close = this[kClose]\n }\n\n get [Symbols.kConnected] () {\n return this[kConnected]\n }\n\n /**\n * Sets up the base interceptor for mocking replies from undici.\n */\n intercept (opts) {\n return new MockInterceptor(opts, this[kDispatches])\n }\n\n async [kClose] () {\n await promisify(this[kOriginalClose])()\n this[kConnected] = 0\n this[kMockAgent][Symbols.kClients].delete(this[kOrigin])\n }\n}\n\nmodule.exports = MockClient\n","'use strict'\n\nconst { UndiciError } = require('../core/errors')\n\nclass MockNotMatchedError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, MockNotMatchedError)\n this.name = 'MockNotMatchedError'\n this.message = message || 'The request does not match any registered mock dispatches'\n this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'\n }\n}\n\nmodule.exports = {\n MockNotMatchedError\n}\n","'use strict'\n\nconst { getResponseData, buildKey, addMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kDispatchKey,\n kDefaultHeaders,\n kDefaultTrailers,\n kContentLength,\n kMockDispatch\n} = require('./mock-symbols')\nconst { InvalidArgumentError } = require('../core/errors')\nconst { buildURL } = require('../core/util')\n\n/**\n * Defines the scope API for an interceptor reply\n */\nclass MockScope {\n constructor (mockDispatch) {\n this[kMockDispatch] = mockDispatch\n }\n\n /**\n * Delay a reply by a set amount in ms.\n */\n delay (waitInMs) {\n if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) {\n throw new InvalidArgumentError('waitInMs must be a valid integer > 0')\n }\n\n this[kMockDispatch].delay = waitInMs\n return this\n }\n\n /**\n * For a defined reply, never mark as consumed.\n */\n persist () {\n this[kMockDispatch].persist = true\n return this\n }\n\n /**\n * Allow one to define a reply for a set amount of matching requests.\n */\n times (repeatTimes) {\n if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) {\n throw new InvalidArgumentError('repeatTimes must be a valid integer > 0')\n }\n\n this[kMockDispatch].times = repeatTimes\n return this\n }\n}\n\n/**\n * Defines an interceptor for a Mock\n */\nclass MockInterceptor {\n constructor (opts, mockDispatches) {\n if (typeof opts !== 'object') {\n throw new InvalidArgumentError('opts must be an object')\n }\n if (typeof opts.path === 'undefined') {\n throw new InvalidArgumentError('opts.path must be defined')\n }\n if (typeof opts.method === 'undefined') {\n opts.method = 'GET'\n }\n // See https://github.com/nodejs/undici/issues/1245\n // As per RFC 3986, clients are not supposed to send URI\n // fragments to servers when they retrieve a document,\n if (typeof opts.path === 'string') {\n if (opts.query) {\n opts.path = buildURL(opts.path, opts.query)\n } else {\n // Matches https://github.com/nodejs/undici/blob/main/lib/fetch/index.js#L1811\n const parsedURL = new URL(opts.path, 'data://')\n opts.path = parsedURL.pathname + parsedURL.search\n }\n }\n if (typeof opts.method === 'string') {\n opts.method = opts.method.toUpperCase()\n }\n\n this[kDispatchKey] = buildKey(opts)\n this[kDispatches] = mockDispatches\n this[kDefaultHeaders] = {}\n this[kDefaultTrailers] = {}\n this[kContentLength] = false\n }\n\n createMockScopeDispatchData (statusCode, data, responseOptions = {}) {\n const responseData = getResponseData(data)\n const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {}\n const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }\n const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }\n\n return { statusCode, data, headers, trailers }\n }\n\n validateReplyParameters (statusCode, data, responseOptions) {\n if (typeof statusCode === 'undefined') {\n throw new InvalidArgumentError('statusCode must be defined')\n }\n if (typeof data === 'undefined') {\n throw new InvalidArgumentError('data must be defined')\n }\n if (typeof responseOptions !== 'object') {\n throw new InvalidArgumentError('responseOptions must be an object')\n }\n }\n\n /**\n * Mock an undici request with a defined reply.\n */\n reply (replyData) {\n // Values of reply aren't available right now as they\n // can only be available when the reply callback is invoked.\n if (typeof replyData === 'function') {\n // We'll first wrap the provided callback in another function,\n // this function will properly resolve the data from the callback\n // when invoked.\n const wrappedDefaultsCallback = (opts) => {\n // Our reply options callback contains the parameter for statusCode, data and options.\n const resolvedData = replyData(opts)\n\n // Check if it is in the right format\n if (typeof resolvedData !== 'object') {\n throw new InvalidArgumentError('reply options callback must return an object')\n }\n\n const { statusCode, data = '', responseOptions = {} } = resolvedData\n this.validateReplyParameters(statusCode, data, responseOptions)\n // Since the values can be obtained immediately we return them\n // from this higher order function that will be resolved later.\n return {\n ...this.createMockScopeDispatchData(statusCode, data, responseOptions)\n }\n }\n\n // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data.\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback)\n return new MockScope(newMockDispatch)\n }\n\n // We can have either one or three parameters, if we get here,\n // we should have 1-3 parameters. So we spread the arguments of\n // this function to obtain the parameters, since replyData will always\n // just be the statusCode.\n const [statusCode, data = '', responseOptions = {}] = [...arguments]\n this.validateReplyParameters(statusCode, data, responseOptions)\n\n // Send in-already provided data like usual\n const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions)\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData)\n return new MockScope(newMockDispatch)\n }\n\n /**\n * Mock an undici request with a defined error.\n */\n replyWithError (error) {\n if (typeof error === 'undefined') {\n throw new InvalidArgumentError('error must be defined')\n }\n\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error })\n return new MockScope(newMockDispatch)\n }\n\n /**\n * Set default reply headers on the interceptor for subsequent replies\n */\n defaultReplyHeaders (headers) {\n if (typeof headers === 'undefined') {\n throw new InvalidArgumentError('headers must be defined')\n }\n\n this[kDefaultHeaders] = headers\n return this\n }\n\n /**\n * Set default reply trailers on the interceptor for subsequent replies\n */\n defaultReplyTrailers (trailers) {\n if (typeof trailers === 'undefined') {\n throw new InvalidArgumentError('trailers must be defined')\n }\n\n this[kDefaultTrailers] = trailers\n return this\n }\n\n /**\n * Set reply content length header for replies on the interceptor\n */\n replyContentLength () {\n this[kContentLength] = true\n return this\n }\n}\n\nmodule.exports.MockInterceptor = MockInterceptor\nmodule.exports.MockScope = MockScope\n","'use strict'\n\nconst { promisify } = require('util')\nconst Pool = require('../pool')\nconst { buildMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kMockAgent,\n kClose,\n kOriginalClose,\n kOrigin,\n kOriginalDispatch,\n kConnected\n} = require('./mock-symbols')\nconst { MockInterceptor } = require('./mock-interceptor')\nconst Symbols = require('../core/symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\n/**\n * MockPool provides an API that extends the Pool to influence the mockDispatches.\n */\nclass MockPool extends Pool {\n constructor (origin, opts) {\n super(origin, opts)\n\n if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n\n this[kMockAgent] = opts.agent\n this[kOrigin] = origin\n this[kDispatches] = []\n this[kConnected] = 1\n this[kOriginalDispatch] = this.dispatch\n this[kOriginalClose] = this.close.bind(this)\n\n this.dispatch = buildMockDispatch.call(this)\n this.close = this[kClose]\n }\n\n get [Symbols.kConnected] () {\n return this[kConnected]\n }\n\n /**\n * Sets up the base interceptor for mocking replies from undici.\n */\n intercept (opts) {\n return new MockInterceptor(opts, this[kDispatches])\n }\n\n async [kClose] () {\n await promisify(this[kOriginalClose])()\n this[kConnected] = 0\n this[kMockAgent][Symbols.kClients].delete(this[kOrigin])\n }\n}\n\nmodule.exports = MockPool\n","'use strict'\n\nmodule.exports = {\n kAgent: Symbol('agent'),\n kOptions: Symbol('options'),\n kFactory: Symbol('factory'),\n kDispatches: Symbol('dispatches'),\n kDispatchKey: Symbol('dispatch key'),\n kDefaultHeaders: Symbol('default headers'),\n kDefaultTrailers: Symbol('default trailers'),\n kContentLength: Symbol('content length'),\n kMockAgent: Symbol('mock agent'),\n kMockAgentSet: Symbol('mock agent set'),\n kMockAgentGet: Symbol('mock agent get'),\n kMockDispatch: Symbol('mock dispatch'),\n kClose: Symbol('close'),\n kOriginalClose: Symbol('original agent close'),\n kOrigin: Symbol('origin'),\n kIsMockActive: Symbol('is mock active'),\n kNetConnect: Symbol('net connect'),\n kGetNetConnect: Symbol('get net connect'),\n kConnected: Symbol('connected')\n}\n","'use strict'\n\nconst { MockNotMatchedError } = require('./mock-errors')\nconst {\n kDispatches,\n kMockAgent,\n kOriginalDispatch,\n kOrigin,\n kGetNetConnect\n} = require('./mock-symbols')\nconst { buildURL, nop } = require('../core/util')\nconst { STATUS_CODES } = require('http')\nconst {\n types: {\n isPromise\n }\n} = require('util')\n\nfunction matchValue (match, value) {\n if (typeof match === 'string') {\n return match === value\n }\n if (match instanceof RegExp) {\n return match.test(value)\n }\n if (typeof match === 'function') {\n return match(value) === true\n }\n return false\n}\n\nfunction lowerCaseEntries (headers) {\n return Object.fromEntries(\n Object.entries(headers).map(([headerName, headerValue]) => {\n return [headerName.toLocaleLowerCase(), headerValue]\n })\n )\n}\n\n/**\n * @param {import('../../index').Headers|string[]|Record} headers\n * @param {string} key\n */\nfunction getHeaderByName (headers, key) {\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i += 2) {\n if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) {\n return headers[i + 1]\n }\n }\n\n return undefined\n } else if (typeof headers.get === 'function') {\n return headers.get(key)\n } else {\n return lowerCaseEntries(headers)[key.toLocaleLowerCase()]\n }\n}\n\n/** @param {string[]} headers */\nfunction buildHeadersFromArray (headers) { // fetch HeadersList\n const clone = headers.slice()\n const entries = []\n for (let index = 0; index < clone.length; index += 2) {\n entries.push([clone[index], clone[index + 1]])\n }\n return Object.fromEntries(entries)\n}\n\nfunction matchHeaders (mockDispatch, headers) {\n if (typeof mockDispatch.headers === 'function') {\n if (Array.isArray(headers)) { // fetch HeadersList\n headers = buildHeadersFromArray(headers)\n }\n return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {})\n }\n if (typeof mockDispatch.headers === 'undefined') {\n return true\n }\n if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') {\n return false\n }\n\n for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) {\n const headerValue = getHeaderByName(headers, matchHeaderName)\n\n if (!matchValue(matchHeaderValue, headerValue)) {\n return false\n }\n }\n return true\n}\n\nfunction safeUrl (path) {\n if (typeof path !== 'string') {\n return path\n }\n\n const pathSegments = path.split('?')\n\n if (pathSegments.length !== 2) {\n return path\n }\n\n const qp = new URLSearchParams(pathSegments.pop())\n qp.sort()\n return [...pathSegments, qp.toString()].join('?')\n}\n\nfunction matchKey (mockDispatch, { path, method, body, headers }) {\n const pathMatch = matchValue(mockDispatch.path, path)\n const methodMatch = matchValue(mockDispatch.method, method)\n const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true\n const headersMatch = matchHeaders(mockDispatch, headers)\n return pathMatch && methodMatch && bodyMatch && headersMatch\n}\n\nfunction getResponseData (data) {\n if (Buffer.isBuffer(data)) {\n return data\n } else if (typeof data === 'object') {\n return JSON.stringify(data)\n } else {\n return data.toString()\n }\n}\n\nfunction getMockDispatch (mockDispatches, key) {\n const basePath = key.query ? buildURL(key.path, key.query) : key.path\n const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath\n\n // Match path\n let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath))\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`)\n }\n\n // Match method\n matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method))\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`)\n }\n\n // Match body\n matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true)\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`)\n }\n\n // Match headers\n matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers))\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers}'`)\n }\n\n return matchedMockDispatches[0]\n}\n\nfunction addMockDispatch (mockDispatches, key, data) {\n const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false }\n const replyData = typeof data === 'function' ? { callback: data } : { ...data }\n const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }\n mockDispatches.push(newMockDispatch)\n return newMockDispatch\n}\n\nfunction deleteMockDispatch (mockDispatches, key) {\n const index = mockDispatches.findIndex(dispatch => {\n if (!dispatch.consumed) {\n return false\n }\n return matchKey(dispatch, key)\n })\n if (index !== -1) {\n mockDispatches.splice(index, 1)\n }\n}\n\nfunction buildKey (opts) {\n const { path, method, body, headers, query } = opts\n return {\n path,\n method,\n body,\n headers,\n query\n }\n}\n\nfunction generateKeyValues (data) {\n return Object.entries(data).reduce((keyValuePairs, [key, value]) => [\n ...keyValuePairs,\n Buffer.from(`${key}`),\n Array.isArray(value) ? value.map(x => Buffer.from(`${x}`)) : Buffer.from(`${value}`)\n ], [])\n}\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status\n * @param {number} statusCode\n */\nfunction getStatusText (statusCode) {\n return STATUS_CODES[statusCode] || 'unknown'\n}\n\nasync function getResponse (body) {\n const buffers = []\n for await (const data of body) {\n buffers.push(data)\n }\n return Buffer.concat(buffers).toString('utf8')\n}\n\n/**\n * Mock dispatch function used to simulate undici dispatches\n */\nfunction mockDispatch (opts, handler) {\n // Get mock dispatch from built key\n const key = buildKey(opts)\n const mockDispatch = getMockDispatch(this[kDispatches], key)\n\n mockDispatch.timesInvoked++\n\n // Here's where we resolve a callback if a callback is present for the dispatch data.\n if (mockDispatch.data.callback) {\n mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) }\n }\n\n // Parse mockDispatch data\n const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch\n const { timesInvoked, times } = mockDispatch\n\n // If it's used up and not persistent, mark as consumed\n mockDispatch.consumed = !persist && timesInvoked >= times\n mockDispatch.pending = timesInvoked < times\n\n // If specified, trigger dispatch error\n if (error !== null) {\n deleteMockDispatch(this[kDispatches], key)\n handler.onError(error)\n return true\n }\n\n // Handle the request with a delay if necessary\n if (typeof delay === 'number' && delay > 0) {\n setTimeout(() => {\n handleReply(this[kDispatches])\n }, delay)\n } else {\n handleReply(this[kDispatches])\n }\n\n function handleReply (mockDispatches, _data = data) {\n // fetch's HeadersList is a 1D string array\n const optsHeaders = Array.isArray(opts.headers)\n ? buildHeadersFromArray(opts.headers)\n : opts.headers\n const body = typeof _data === 'function'\n ? _data({ ...opts, headers: optsHeaders })\n : _data\n\n // util.types.isPromise is likely needed for jest.\n if (isPromise(body)) {\n // If handleReply is asynchronous, throwing an error\n // in the callback will reject the promise, rather than\n // synchronously throw the error, which breaks some tests.\n // Rather, we wait for the callback to resolve if it is a\n // promise, and then re-run handleReply with the new body.\n body.then((newData) => handleReply(mockDispatches, newData))\n return\n }\n\n const responseData = getResponseData(body)\n const responseHeaders = generateKeyValues(headers)\n const responseTrailers = generateKeyValues(trailers)\n\n handler.abort = nop\n handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode))\n handler.onData(Buffer.from(responseData))\n handler.onComplete(responseTrailers)\n deleteMockDispatch(mockDispatches, key)\n }\n\n function resume () {}\n\n return true\n}\n\nfunction buildMockDispatch () {\n const agent = this[kMockAgent]\n const origin = this[kOrigin]\n const originalDispatch = this[kOriginalDispatch]\n\n return function dispatch (opts, handler) {\n if (agent.isMockActive) {\n try {\n mockDispatch.call(this, opts, handler)\n } catch (error) {\n if (error instanceof MockNotMatchedError) {\n const netConnect = agent[kGetNetConnect]()\n if (netConnect === false) {\n throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`)\n }\n if (checkNetConnect(netConnect, origin)) {\n originalDispatch.call(this, opts, handler)\n } else {\n throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`)\n }\n } else {\n throw error\n }\n }\n } else {\n originalDispatch.call(this, opts, handler)\n }\n }\n}\n\nfunction checkNetConnect (netConnect, origin) {\n const url = new URL(origin)\n if (netConnect === true) {\n return true\n } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) {\n return true\n }\n return false\n}\n\nfunction buildMockOptions (opts) {\n if (opts) {\n const { agent, ...mockOptions } = opts\n return mockOptions\n }\n}\n\nmodule.exports = {\n getResponseData,\n getMockDispatch,\n addMockDispatch,\n deleteMockDispatch,\n buildKey,\n generateKeyValues,\n matchValue,\n getResponse,\n getStatusText,\n mockDispatch,\n buildMockDispatch,\n checkNetConnect,\n buildMockOptions,\n getHeaderByName\n}\n","'use strict'\n\nconst { Transform } = require('stream')\nconst { Console } = require('console')\n\n/**\n * Gets the output of `console.table(…)` as a string.\n */\nmodule.exports = class PendingInterceptorsFormatter {\n constructor ({ disableColors } = {}) {\n this.transform = new Transform({\n transform (chunk, _enc, cb) {\n cb(null, chunk)\n }\n })\n\n this.logger = new Console({\n stdout: this.transform,\n inspectOptions: {\n colors: !disableColors && !process.env.CI\n }\n })\n }\n\n format (pendingInterceptors) {\n const withPrettyHeaders = pendingInterceptors.map(\n ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({\n Method: method,\n Origin: origin,\n Path: path,\n 'Status code': statusCode,\n Persistent: persist ? '✅' : '❌',\n Invocations: timesInvoked,\n Remaining: persist ? Infinity : times - timesInvoked\n }))\n\n this.logger.table(withPrettyHeaders)\n return this.transform.read().toString()\n }\n}\n","'use strict'\n\nconst singulars = {\n pronoun: 'it',\n is: 'is',\n was: 'was',\n this: 'this'\n}\n\nconst plurals = {\n pronoun: 'they',\n is: 'are',\n was: 'were',\n this: 'these'\n}\n\nmodule.exports = class Pluralizer {\n constructor (singular, plural) {\n this.singular = singular\n this.plural = plural\n }\n\n pluralize (count) {\n const one = count === 1\n const keys = one ? singulars : plurals\n const noun = one ? this.singular : this.plural\n return { ...keys, count, noun }\n }\n}\n","/* eslint-disable */\n\n'use strict'\n\n// Extracted from node/lib/internal/fixed_queue.js\n\n// Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two.\nconst kSize = 2048;\nconst kMask = kSize - 1;\n\n// The FixedQueue is implemented as a singly-linked list of fixed-size\n// circular buffers. It looks something like this:\n//\n// head tail\n// | |\n// v v\n// +-----------+ <-----\\ +-----------+ <------\\ +-----------+\n// | [null] | \\----- | next | \\------- | next |\n// +-----------+ +-----------+ +-----------+\n// | item | <-- bottom | item | <-- bottom | [empty] |\n// | item | | item | | [empty] |\n// | item | | item | | [empty] |\n// | item | | item | | [empty] |\n// | item | | item | bottom --> | item |\n// | item | | item | | item |\n// | ... | | ... | | ... |\n// | item | | item | | item |\n// | item | | item | | item |\n// | [empty] | <-- top | item | | item |\n// | [empty] | | item | | item |\n// | [empty] | | [empty] | <-- top top --> | [empty] |\n// +-----------+ +-----------+ +-----------+\n//\n// Or, if there is only one circular buffer, it looks something\n// like either of these:\n//\n// head tail head tail\n// | | | |\n// v v v v\n// +-----------+ +-----------+\n// | [null] | | [null] |\n// +-----------+ +-----------+\n// | [empty] | | item |\n// | [empty] | | item |\n// | item | <-- bottom top --> | [empty] |\n// | item | | [empty] |\n// | [empty] | <-- top bottom --> | item |\n// | [empty] | | item |\n// +-----------+ +-----------+\n//\n// Adding a value means moving `top` forward by one, removing means\n// moving `bottom` forward by one. After reaching the end, the queue\n// wraps around.\n//\n// When `top === bottom` the current queue is empty and when\n// `top + 1 === bottom` it's full. This wastes a single space of storage\n// but allows much quicker checks.\n\nclass FixedCircularBuffer {\n constructor() {\n this.bottom = 0;\n this.top = 0;\n this.list = new Array(kSize);\n this.next = null;\n }\n\n isEmpty() {\n return this.top === this.bottom;\n }\n\n isFull() {\n return ((this.top + 1) & kMask) === this.bottom;\n }\n\n push(data) {\n this.list[this.top] = data;\n this.top = (this.top + 1) & kMask;\n }\n\n shift() {\n const nextItem = this.list[this.bottom];\n if (nextItem === undefined)\n return null;\n this.list[this.bottom] = undefined;\n this.bottom = (this.bottom + 1) & kMask;\n return nextItem;\n }\n}\n\nmodule.exports = class FixedQueue {\n constructor() {\n this.head = this.tail = new FixedCircularBuffer();\n }\n\n isEmpty() {\n return this.head.isEmpty();\n }\n\n push(data) {\n if (this.head.isFull()) {\n // Head is full: Creates a new queue, sets the old queue's `.next` to it,\n // and sets it as the new main queue.\n this.head = this.head.next = new FixedCircularBuffer();\n }\n this.head.push(data);\n }\n\n shift() {\n const tail = this.tail;\n const next = tail.shift();\n if (tail.isEmpty() && tail.next !== null) {\n // If there is another queue, it forms the new tail.\n this.tail = tail.next;\n }\n return next;\n }\n};\n","'use strict'\n\nconst DispatcherBase = require('./dispatcher-base')\nconst FixedQueue = require('./node/fixed-queue')\nconst { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require('./core/symbols')\nconst PoolStats = require('./pool-stats')\n\nconst kClients = Symbol('clients')\nconst kNeedDrain = Symbol('needDrain')\nconst kQueue = Symbol('queue')\nconst kClosedResolve = Symbol('closed resolve')\nconst kOnDrain = Symbol('onDrain')\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kGetDispatcher = Symbol('get dispatcher')\nconst kAddClient = Symbol('add client')\nconst kRemoveClient = Symbol('remove client')\nconst kStats = Symbol('stats')\n\nclass PoolBase extends DispatcherBase {\n constructor () {\n super()\n\n this[kQueue] = new FixedQueue()\n this[kClients] = []\n this[kQueued] = 0\n\n const pool = this\n\n this[kOnDrain] = function onDrain (origin, targets) {\n const queue = pool[kQueue]\n\n let needDrain = false\n\n while (!needDrain) {\n const item = queue.shift()\n if (!item) {\n break\n }\n pool[kQueued]--\n needDrain = !this.dispatch(item.opts, item.handler)\n }\n\n this[kNeedDrain] = needDrain\n\n if (!this[kNeedDrain] && pool[kNeedDrain]) {\n pool[kNeedDrain] = false\n pool.emit('drain', origin, [pool, ...targets])\n }\n\n if (pool[kClosedResolve] && queue.isEmpty()) {\n Promise\n .all(pool[kClients].map(c => c.close()))\n .then(pool[kClosedResolve])\n }\n }\n\n this[kOnConnect] = (origin, targets) => {\n pool.emit('connect', origin, [pool, ...targets])\n }\n\n this[kOnDisconnect] = (origin, targets, err) => {\n pool.emit('disconnect', origin, [pool, ...targets], err)\n }\n\n this[kOnConnectionError] = (origin, targets, err) => {\n pool.emit('connectionError', origin, [pool, ...targets], err)\n }\n\n this[kStats] = new PoolStats(this)\n }\n\n get [kBusy] () {\n return this[kNeedDrain]\n }\n\n get [kConnected] () {\n return this[kClients].filter(client => client[kConnected]).length\n }\n\n get [kFree] () {\n return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length\n }\n\n get [kPending] () {\n let ret = this[kQueued]\n for (const { [kPending]: pending } of this[kClients]) {\n ret += pending\n }\n return ret\n }\n\n get [kRunning] () {\n let ret = 0\n for (const { [kRunning]: running } of this[kClients]) {\n ret += running\n }\n return ret\n }\n\n get [kSize] () {\n let ret = this[kQueued]\n for (const { [kSize]: size } of this[kClients]) {\n ret += size\n }\n return ret\n }\n\n get stats () {\n return this[kStats]\n }\n\n async [kClose] () {\n if (this[kQueue].isEmpty()) {\n return Promise.all(this[kClients].map(c => c.close()))\n } else {\n return new Promise((resolve) => {\n this[kClosedResolve] = resolve\n })\n }\n }\n\n async [kDestroy] (err) {\n while (true) {\n const item = this[kQueue].shift()\n if (!item) {\n break\n }\n item.handler.onError(err)\n }\n\n return Promise.all(this[kClients].map(c => c.destroy(err)))\n }\n\n [kDispatch] (opts, handler) {\n const dispatcher = this[kGetDispatcher]()\n\n if (!dispatcher) {\n this[kNeedDrain] = true\n this[kQueue].push({ opts, handler })\n this[kQueued]++\n } else if (!dispatcher.dispatch(opts, handler)) {\n dispatcher[kNeedDrain] = true\n this[kNeedDrain] = !this[kGetDispatcher]()\n }\n\n return !this[kNeedDrain]\n }\n\n [kAddClient] (client) {\n client\n .on('drain', this[kOnDrain])\n .on('connect', this[kOnConnect])\n .on('disconnect', this[kOnDisconnect])\n .on('connectionError', this[kOnConnectionError])\n\n this[kClients].push(client)\n\n if (this[kNeedDrain]) {\n process.nextTick(() => {\n if (this[kNeedDrain]) {\n this[kOnDrain](client[kUrl], [this, client])\n }\n })\n }\n\n return this\n }\n\n [kRemoveClient] (client) {\n client.close(() => {\n const idx = this[kClients].indexOf(client)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n })\n\n this[kNeedDrain] = this[kClients].some(dispatcher => (\n !dispatcher[kNeedDrain] &&\n dispatcher.closed !== true &&\n dispatcher.destroyed !== true\n ))\n }\n}\n\nmodule.exports = {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kRemoveClient,\n kGetDispatcher\n}\n","const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require('./core/symbols')\nconst kPool = Symbol('pool')\n\nclass PoolStats {\n constructor (pool) {\n this[kPool] = pool\n }\n\n get connected () {\n return this[kPool][kConnected]\n }\n\n get free () {\n return this[kPool][kFree]\n }\n\n get pending () {\n return this[kPool][kPending]\n }\n\n get queued () {\n return this[kPool][kQueued]\n }\n\n get running () {\n return this[kPool][kRunning]\n }\n\n get size () {\n return this[kPool][kSize]\n }\n}\n\nmodule.exports = PoolStats\n","'use strict'\n\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kGetDispatcher\n} = require('./pool-base')\nconst Client = require('./client')\nconst {\n InvalidArgumentError\n} = require('./core/errors')\nconst util = require('./core/util')\nconst { kUrl, kInterceptors } = require('./core/symbols')\nconst buildConnector = require('./core/connect')\n\nconst kOptions = Symbol('options')\nconst kConnections = Symbol('connections')\nconst kFactory = Symbol('factory')\n\nfunction defaultFactory (origin, opts) {\n return new Client(origin, opts)\n}\n\nclass Pool extends PoolBase {\n constructor (origin, {\n connections,\n factory = defaultFactory,\n connect,\n connectTimeout,\n tls,\n maxCachedSessions,\n socketPath,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n allowH2,\n ...options\n } = {}) {\n super()\n\n if (connections != null && (!Number.isFinite(connections) || connections < 0)) {\n throw new InvalidArgumentError('invalid connections')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n socketPath,\n timeout: connectTimeout == null ? 10e3 : connectTimeout,\n ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n }\n\n this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool)\n ? options.interceptors.Pool\n : []\n this[kConnections] = connections || null\n this[kUrl] = util.parseOrigin(origin)\n this[kOptions] = { ...util.deepClone(options), connect, allowH2 }\n this[kOptions].interceptors = options.interceptors\n ? { ...options.interceptors }\n : undefined\n this[kFactory] = factory\n }\n\n [kGetDispatcher] () {\n let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain])\n\n if (dispatcher) {\n return dispatcher\n }\n\n if (!this[kConnections] || this[kClients].length < this[kConnections]) {\n dispatcher = this[kFactory](this[kUrl], this[kOptions])\n this[kAddClient](dispatcher)\n }\n\n return dispatcher\n }\n}\n\nmodule.exports = Pool\n","'use strict'\n\nconst { kProxy, kClose, kDestroy, kInterceptors } = require('./core/symbols')\nconst { URL } = require('url')\nconst Agent = require('./agent')\nconst Pool = require('./pool')\nconst DispatcherBase = require('./dispatcher-base')\nconst { InvalidArgumentError, RequestAbortedError } = require('./core/errors')\nconst buildConnector = require('./core/connect')\n\nconst kAgent = Symbol('proxy agent')\nconst kClient = Symbol('proxy client')\nconst kProxyHeaders = Symbol('proxy headers')\nconst kRequestTls = Symbol('request tls settings')\nconst kProxyTls = Symbol('proxy tls settings')\nconst kConnectEndpoint = Symbol('connect endpoint function')\n\nfunction defaultProtocolPort (protocol) {\n return protocol === 'https:' ? 443 : 80\n}\n\nfunction buildProxyOptions (opts) {\n if (typeof opts === 'string') {\n opts = { uri: opts }\n }\n\n if (!opts || !opts.uri) {\n throw new InvalidArgumentError('Proxy opts.uri is mandatory')\n }\n\n return {\n uri: opts.uri,\n protocol: opts.protocol || 'https'\n }\n}\n\nfunction defaultFactory (origin, opts) {\n return new Pool(origin, opts)\n}\n\nclass ProxyAgent extends DispatcherBase {\n constructor (opts) {\n super(opts)\n this[kProxy] = buildProxyOptions(opts)\n this[kAgent] = new Agent(opts)\n this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent)\n ? opts.interceptors.ProxyAgent\n : []\n\n if (typeof opts === 'string') {\n opts = { uri: opts }\n }\n\n if (!opts || !opts.uri) {\n throw new InvalidArgumentError('Proxy opts.uri is mandatory')\n }\n\n const { clientFactory = defaultFactory } = opts\n\n if (typeof clientFactory !== 'function') {\n throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')\n }\n\n this[kRequestTls] = opts.requestTls\n this[kProxyTls] = opts.proxyTls\n this[kProxyHeaders] = opts.headers || {}\n\n if (opts.auth && opts.token) {\n throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')\n } else if (opts.auth) {\n /* @deprecated in favour of opts.token */\n this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`\n } else if (opts.token) {\n this[kProxyHeaders]['proxy-authorization'] = opts.token\n }\n\n const resolvedUrl = new URL(opts.uri)\n const { origin, port, host } = resolvedUrl\n\n const connect = buildConnector({ ...opts.proxyTls })\n this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })\n this[kClient] = clientFactory(resolvedUrl, { connect })\n this[kAgent] = new Agent({\n ...opts,\n connect: async (opts, callback) => {\n let requestedHost = opts.host\n if (!opts.port) {\n requestedHost += `:${defaultProtocolPort(opts.protocol)}`\n }\n try {\n const { socket, statusCode } = await this[kClient].connect({\n origin,\n port,\n path: requestedHost,\n signal: opts.signal,\n headers: {\n ...this[kProxyHeaders],\n host\n }\n })\n if (statusCode !== 200) {\n socket.on('error', () => {}).destroy()\n callback(new RequestAbortedError('Proxy response !== 200 when HTTP Tunneling'))\n }\n if (opts.protocol !== 'https:') {\n callback(null, socket)\n return\n }\n let servername\n if (this[kRequestTls]) {\n servername = this[kRequestTls].servername\n } else {\n servername = opts.servername\n }\n this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback)\n } catch (err) {\n callback(err)\n }\n }\n })\n }\n\n dispatch (opts, handler) {\n const { host } = new URL(opts.origin)\n const headers = buildHeaders(opts.headers)\n throwIfProxyAuthIsSent(headers)\n return this[kAgent].dispatch(\n {\n ...opts,\n headers: {\n ...headers,\n host\n }\n },\n handler\n )\n }\n\n async [kClose] () {\n await this[kAgent].close()\n await this[kClient].close()\n }\n\n async [kDestroy] () {\n await this[kAgent].destroy()\n await this[kClient].destroy()\n }\n}\n\n/**\n * @param {string[] | Record} headers\n * @returns {Record}\n */\nfunction buildHeaders (headers) {\n // When using undici.fetch, the headers list is stored\n // as an array.\n if (Array.isArray(headers)) {\n /** @type {Record} */\n const headersPair = {}\n\n for (let i = 0; i < headers.length; i += 2) {\n headersPair[headers[i]] = headers[i + 1]\n }\n\n return headersPair\n }\n\n return headers\n}\n\n/**\n * @param {Record} headers\n *\n * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers\n * Nevertheless, it was changed and to avoid a security vulnerability by end users\n * this check was created.\n * It should be removed in the next major version for performance reasons\n */\nfunction throwIfProxyAuthIsSent (headers) {\n const existProxyAuth = headers && Object.keys(headers)\n .find((key) => key.toLowerCase() === 'proxy-authorization')\n if (existProxyAuth) {\n throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor')\n }\n}\n\nmodule.exports = ProxyAgent\n","'use strict'\n\nlet fastNow = Date.now()\nlet fastNowTimeout\n\nconst fastTimers = []\n\nfunction onTimeout () {\n fastNow = Date.now()\n\n let len = fastTimers.length\n let idx = 0\n while (idx < len) {\n const timer = fastTimers[idx]\n\n if (timer.state === 0) {\n timer.state = fastNow + timer.delay\n } else if (timer.state > 0 && fastNow >= timer.state) {\n timer.state = -1\n timer.callback(timer.opaque)\n }\n\n if (timer.state === -1) {\n timer.state = -2\n if (idx !== len - 1) {\n fastTimers[idx] = fastTimers.pop()\n } else {\n fastTimers.pop()\n }\n len -= 1\n } else {\n idx += 1\n }\n }\n\n if (fastTimers.length > 0) {\n refreshTimeout()\n }\n}\n\nfunction refreshTimeout () {\n if (fastNowTimeout && fastNowTimeout.refresh) {\n fastNowTimeout.refresh()\n } else {\n clearTimeout(fastNowTimeout)\n fastNowTimeout = setTimeout(onTimeout, 1e3)\n if (fastNowTimeout.unref) {\n fastNowTimeout.unref()\n }\n }\n}\n\nclass Timeout {\n constructor (callback, delay, opaque) {\n this.callback = callback\n this.delay = delay\n this.opaque = opaque\n\n // -2 not in timer list\n // -1 in timer list but inactive\n // 0 in timer list waiting for time\n // > 0 in timer list waiting for time to expire\n this.state = -2\n\n this.refresh()\n }\n\n refresh () {\n if (this.state === -2) {\n fastTimers.push(this)\n if (!fastNowTimeout || fastTimers.length === 1) {\n refreshTimeout()\n }\n }\n\n this.state = 0\n }\n\n clear () {\n this.state = -1\n }\n}\n\nmodule.exports = {\n setTimeout (callback, delay, opaque) {\n return delay < 1e3\n ? setTimeout(callback, delay, opaque)\n : new Timeout(callback, delay, opaque)\n },\n clearTimeout (timeout) {\n if (timeout instanceof Timeout) {\n timeout.clear()\n } else {\n clearTimeout(timeout)\n }\n }\n}\n","'use strict'\n\nconst diagnosticsChannel = require('diagnostics_channel')\nconst { uid, states } = require('./constants')\nconst {\n kReadyState,\n kSentClose,\n kByteParser,\n kReceivedClose\n} = require('./symbols')\nconst { fireEvent, failWebsocketConnection } = require('./util')\nconst { CloseEvent } = require('./events')\nconst { makeRequest } = require('../fetch/request')\nconst { fetching } = require('../fetch/index')\nconst { Headers } = require('../fetch/headers')\nconst { getGlobalDispatcher } = require('../global')\nconst { kHeadersList } = require('../core/symbols')\n\nconst channels = {}\nchannels.open = diagnosticsChannel.channel('undici:websocket:open')\nchannels.close = diagnosticsChannel.channel('undici:websocket:close')\nchannels.socketError = diagnosticsChannel.channel('undici:websocket:socket_error')\n\n/** @type {import('crypto')} */\nlet crypto\ntry {\n crypto = require('crypto')\n} catch {\n\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#concept-websocket-establish\n * @param {URL} url\n * @param {string|string[]} protocols\n * @param {import('./websocket').WebSocket} ws\n * @param {(response: any) => void} onEstablish\n * @param {Partial} options\n */\nfunction establishWebSocketConnection (url, protocols, ws, onEstablish, options) {\n // 1. Let requestURL be a copy of url, with its scheme set to \"http\", if url’s\n // scheme is \"ws\", and to \"https\" otherwise.\n const requestURL = url\n\n requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:'\n\n // 2. Let request be a new request, whose URL is requestURL, client is client,\n // service-workers mode is \"none\", referrer is \"no-referrer\", mode is\n // \"websocket\", credentials mode is \"include\", cache mode is \"no-store\" ,\n // and redirect mode is \"error\".\n const request = makeRequest({\n urlList: [requestURL],\n serviceWorkers: 'none',\n referrer: 'no-referrer',\n mode: 'websocket',\n credentials: 'include',\n cache: 'no-store',\n redirect: 'error'\n })\n\n // Note: undici extension, allow setting custom headers.\n if (options.headers) {\n const headersList = new Headers(options.headers)[kHeadersList]\n\n request.headersList = headersList\n }\n\n // 3. Append (`Upgrade`, `websocket`) to request’s header list.\n // 4. Append (`Connection`, `Upgrade`) to request’s header list.\n // Note: both of these are handled by undici currently.\n // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397\n\n // 5. Let keyValue be a nonce consisting of a randomly selected\n // 16-byte value that has been forgiving-base64-encoded and\n // isomorphic encoded.\n const keyValue = crypto.randomBytes(16).toString('base64')\n\n // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s\n // header list.\n request.headersList.append('sec-websocket-key', keyValue)\n\n // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s\n // header list.\n request.headersList.append('sec-websocket-version', '13')\n\n // 8. For each protocol in protocols, combine\n // (`Sec-WebSocket-Protocol`, protocol) in request’s header\n // list.\n for (const protocol of protocols) {\n request.headersList.append('sec-websocket-protocol', protocol)\n }\n\n // 9. Let permessageDeflate be a user-agent defined\n // \"permessage-deflate\" extension header value.\n // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673\n // TODO: enable once permessage-deflate is supported\n const permessageDeflate = '' // 'permessage-deflate; 15'\n\n // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to\n // request’s header list.\n // request.headersList.append('sec-websocket-extensions', permessageDeflate)\n\n // 11. Fetch request with useParallelQueue set to true, and\n // processResponse given response being these steps:\n const controller = fetching({\n request,\n useParallelQueue: true,\n dispatcher: options.dispatcher ?? getGlobalDispatcher(),\n processResponse (response) {\n // 1. If response is a network error or its status is not 101,\n // fail the WebSocket connection.\n if (response.type === 'error' || response.status !== 101) {\n failWebsocketConnection(ws, 'Received network error or non-101 status code.')\n return\n }\n\n // 2. If protocols is not the empty list and extracting header\n // list values given `Sec-WebSocket-Protocol` and response’s\n // header list results in null, failure, or the empty byte\n // sequence, then fail the WebSocket connection.\n if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) {\n failWebsocketConnection(ws, 'Server did not respond with sent protocols.')\n return\n }\n\n // 3. Follow the requirements stated step 2 to step 6, inclusive,\n // of the last set of steps in section 4.1 of The WebSocket\n // Protocol to validate response. This either results in fail\n // the WebSocket connection or the WebSocket connection is\n // established.\n\n // 2. If the response lacks an |Upgrade| header field or the |Upgrade|\n // header field contains a value that is not an ASCII case-\n // insensitive match for the value \"websocket\", the client MUST\n // _Fail the WebSocket Connection_.\n if (response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') {\n failWebsocketConnection(ws, 'Server did not set Upgrade header to \"websocket\".')\n return\n }\n\n // 3. If the response lacks a |Connection| header field or the\n // |Connection| header field doesn't contain a token that is an\n // ASCII case-insensitive match for the value \"Upgrade\", the client\n // MUST _Fail the WebSocket Connection_.\n if (response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') {\n failWebsocketConnection(ws, 'Server did not set Connection header to \"upgrade\".')\n return\n }\n\n // 4. If the response lacks a |Sec-WebSocket-Accept| header field or\n // the |Sec-WebSocket-Accept| contains a value other than the\n // base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket-\n // Key| (as a string, not base64-decoded) with the string \"258EAFA5-\n // E914-47DA-95CA-C5AB0DC85B11\" but ignoring any leading and\n // trailing whitespace, the client MUST _Fail the WebSocket\n // Connection_.\n const secWSAccept = response.headersList.get('Sec-WebSocket-Accept')\n const digest = crypto.createHash('sha1').update(keyValue + uid).digest('base64')\n if (secWSAccept !== digest) {\n failWebsocketConnection(ws, 'Incorrect hash received in Sec-WebSocket-Accept header.')\n return\n }\n\n // 5. If the response includes a |Sec-WebSocket-Extensions| header\n // field and this header field indicates the use of an extension\n // that was not present in the client's handshake (the server has\n // indicated an extension not requested by the client), the client\n // MUST _Fail the WebSocket Connection_. (The parsing of this\n // header field to determine which extensions are requested is\n // discussed in Section 9.1.)\n const secExtension = response.headersList.get('Sec-WebSocket-Extensions')\n\n if (secExtension !== null && secExtension !== permessageDeflate) {\n failWebsocketConnection(ws, 'Received different permessage-deflate than the one set.')\n return\n }\n\n // 6. If the response includes a |Sec-WebSocket-Protocol| header field\n // and this header field indicates the use of a subprotocol that was\n // not present in the client's handshake (the server has indicated a\n // subprotocol not requested by the client), the client MUST _Fail\n // the WebSocket Connection_.\n const secProtocol = response.headersList.get('Sec-WebSocket-Protocol')\n\n if (secProtocol !== null && secProtocol !== request.headersList.get('Sec-WebSocket-Protocol')) {\n failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.')\n return\n }\n\n response.socket.on('data', onSocketData)\n response.socket.on('close', onSocketClose)\n response.socket.on('error', onSocketError)\n\n if (channels.open.hasSubscribers) {\n channels.open.publish({\n address: response.socket.address(),\n protocol: secProtocol,\n extensions: secExtension\n })\n }\n\n onEstablish(response)\n }\n })\n\n return controller\n}\n\n/**\n * @param {Buffer} chunk\n */\nfunction onSocketData (chunk) {\n if (!this.ws[kByteParser].write(chunk)) {\n this.pause()\n }\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4\n */\nfunction onSocketClose () {\n const { ws } = this\n\n // If the TCP connection was closed after the\n // WebSocket closing handshake was completed, the WebSocket connection\n // is said to have been closed _cleanly_.\n const wasClean = ws[kSentClose] && ws[kReceivedClose]\n\n let code = 1005\n let reason = ''\n\n const result = ws[kByteParser].closingInfo\n\n if (result) {\n code = result.code ?? 1005\n reason = result.reason\n } else if (!ws[kSentClose]) {\n // If _The WebSocket\n // Connection is Closed_ and no Close control frame was received by the\n // endpoint (such as could occur if the underlying transport connection\n // is lost), _The WebSocket Connection Close Code_ is considered to be\n // 1006.\n code = 1006\n }\n\n // 1. Change the ready state to CLOSED (3).\n ws[kReadyState] = states.CLOSED\n\n // 2. If the user agent was required to fail the WebSocket\n // connection, or if the WebSocket connection was closed\n // after being flagged as full, fire an event named error\n // at the WebSocket object.\n // TODO\n\n // 3. Fire an event named close at the WebSocket object,\n // using CloseEvent, with the wasClean attribute\n // initialized to true if the connection closed cleanly\n // and false otherwise, the code attribute initialized to\n // the WebSocket connection close code, and the reason\n // attribute initialized to the result of applying UTF-8\n // decode without BOM to the WebSocket connection close\n // reason.\n fireEvent('close', ws, CloseEvent, {\n wasClean, code, reason\n })\n\n if (channels.close.hasSubscribers) {\n channels.close.publish({\n websocket: ws,\n code,\n reason\n })\n }\n}\n\nfunction onSocketError (error) {\n const { ws } = this\n\n ws[kReadyState] = states.CLOSING\n\n if (channels.socketError.hasSubscribers) {\n channels.socketError.publish(error)\n }\n\n this.destroy()\n}\n\nmodule.exports = {\n establishWebSocketConnection\n}\n","'use strict'\n\n// This is a Globally Unique Identifier unique used\n// to validate that the endpoint accepts websocket\n// connections.\n// See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3\nconst uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'\n\n/** @type {PropertyDescriptor} */\nconst staticPropertyDescriptors = {\n enumerable: true,\n writable: false,\n configurable: false\n}\n\nconst states = {\n CONNECTING: 0,\n OPEN: 1,\n CLOSING: 2,\n CLOSED: 3\n}\n\nconst opcodes = {\n CONTINUATION: 0x0,\n TEXT: 0x1,\n BINARY: 0x2,\n CLOSE: 0x8,\n PING: 0x9,\n PONG: 0xA\n}\n\nconst maxUnsigned16Bit = 2 ** 16 - 1 // 65535\n\nconst parserStates = {\n INFO: 0,\n PAYLOADLENGTH_16: 2,\n PAYLOADLENGTH_64: 3,\n READ_DATA: 4\n}\n\nconst emptyBuffer = Buffer.allocUnsafe(0)\n\nmodule.exports = {\n uid,\n staticPropertyDescriptors,\n states,\n opcodes,\n maxUnsigned16Bit,\n parserStates,\n emptyBuffer\n}\n","'use strict'\n\nconst { webidl } = require('../fetch/webidl')\nconst { kEnumerableProperty } = require('../core/util')\nconst { MessagePort } = require('worker_threads')\n\n/**\n * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent\n */\nclass MessageEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' })\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.MessageEventInit(eventInitDict)\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n }\n\n get data () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.data\n }\n\n get origin () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.origin\n }\n\n get lastEventId () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.lastEventId\n }\n\n get source () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.source\n }\n\n get ports () {\n webidl.brandCheck(this, MessageEvent)\n\n if (!Object.isFrozen(this.#eventInit.ports)) {\n Object.freeze(this.#eventInit.ports)\n }\n\n return this.#eventInit.ports\n }\n\n initMessageEvent (\n type,\n bubbles = false,\n cancelable = false,\n data = null,\n origin = '',\n lastEventId = '',\n source = null,\n ports = []\n ) {\n webidl.brandCheck(this, MessageEvent)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent.initMessageEvent' })\n\n return new MessageEvent(type, {\n bubbles, cancelable, data, origin, lastEventId, source, ports\n })\n }\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#the-closeevent-interface\n */\nclass CloseEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' })\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.CloseEventInit(eventInitDict)\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n }\n\n get wasClean () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.wasClean\n }\n\n get code () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.code\n }\n\n get reason () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.reason\n }\n}\n\n// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface\nclass ErrorEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'ErrorEvent constructor' })\n\n super(type, eventInitDict)\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {})\n\n this.#eventInit = eventInitDict\n }\n\n get message () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.message\n }\n\n get filename () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.filename\n }\n\n get lineno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.lineno\n }\n\n get colno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.colno\n }\n\n get error () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.error\n }\n}\n\nObject.defineProperties(MessageEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'MessageEvent',\n configurable: true\n },\n data: kEnumerableProperty,\n origin: kEnumerableProperty,\n lastEventId: kEnumerableProperty,\n source: kEnumerableProperty,\n ports: kEnumerableProperty,\n initMessageEvent: kEnumerableProperty\n})\n\nObject.defineProperties(CloseEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'CloseEvent',\n configurable: true\n },\n reason: kEnumerableProperty,\n code: kEnumerableProperty,\n wasClean: kEnumerableProperty\n})\n\nObject.defineProperties(ErrorEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'ErrorEvent',\n configurable: true\n },\n message: kEnumerableProperty,\n filename: kEnumerableProperty,\n lineno: kEnumerableProperty,\n colno: kEnumerableProperty,\n error: kEnumerableProperty\n})\n\nwebidl.converters.MessagePort = webidl.interfaceConverter(MessagePort)\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.MessagePort\n)\n\nconst eventInit = [\n {\n key: 'bubbles',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'cancelable',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'composed',\n converter: webidl.converters.boolean,\n defaultValue: false\n }\n]\n\nwebidl.converters.MessageEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'data',\n converter: webidl.converters.any,\n defaultValue: null\n },\n {\n key: 'origin',\n converter: webidl.converters.USVString,\n defaultValue: ''\n },\n {\n key: 'lastEventId',\n converter: webidl.converters.DOMString,\n defaultValue: ''\n },\n {\n key: 'source',\n // Node doesn't implement WindowProxy or ServiceWorker, so the only\n // valid value for source is a MessagePort.\n converter: webidl.nullableConverter(webidl.converters.MessagePort),\n defaultValue: null\n },\n {\n key: 'ports',\n converter: webidl.converters['sequence'],\n get defaultValue () {\n return []\n }\n }\n])\n\nwebidl.converters.CloseEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'wasClean',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'code',\n converter: webidl.converters['unsigned short'],\n defaultValue: 0\n },\n {\n key: 'reason',\n converter: webidl.converters.USVString,\n defaultValue: ''\n }\n])\n\nwebidl.converters.ErrorEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'message',\n converter: webidl.converters.DOMString,\n defaultValue: ''\n },\n {\n key: 'filename',\n converter: webidl.converters.USVString,\n defaultValue: ''\n },\n {\n key: 'lineno',\n converter: webidl.converters['unsigned long'],\n defaultValue: 0\n },\n {\n key: 'colno',\n converter: webidl.converters['unsigned long'],\n defaultValue: 0\n },\n {\n key: 'error',\n converter: webidl.converters.any\n }\n])\n\nmodule.exports = {\n MessageEvent,\n CloseEvent,\n ErrorEvent\n}\n","'use strict'\n\nconst { maxUnsigned16Bit } = require('./constants')\n\n/** @type {import('crypto')} */\nlet crypto\ntry {\n crypto = require('crypto')\n} catch {\n\n}\n\nclass WebsocketFrameSend {\n /**\n * @param {Buffer|undefined} data\n */\n constructor (data) {\n this.frameData = data\n this.maskKey = crypto.randomBytes(4)\n }\n\n createFrame (opcode) {\n const bodyLength = this.frameData?.byteLength ?? 0\n\n /** @type {number} */\n let payloadLength = bodyLength // 0-125\n let offset = 6\n\n if (bodyLength > maxUnsigned16Bit) {\n offset += 8 // payload length is next 8 bytes\n payloadLength = 127\n } else if (bodyLength > 125) {\n offset += 2 // payload length is next 2 bytes\n payloadLength = 126\n }\n\n const buffer = Buffer.allocUnsafe(bodyLength + offset)\n\n // Clear first 2 bytes, everything else is overwritten\n buffer[0] = buffer[1] = 0\n buffer[0] |= 0x80 // FIN\n buffer[0] = (buffer[0] & 0xF0) + opcode // opcode\n\n /*! ws. MIT License. Einar Otto Stangvik */\n buffer[offset - 4] = this.maskKey[0]\n buffer[offset - 3] = this.maskKey[1]\n buffer[offset - 2] = this.maskKey[2]\n buffer[offset - 1] = this.maskKey[3]\n\n buffer[1] = payloadLength\n\n if (payloadLength === 126) {\n buffer.writeUInt16BE(bodyLength, 2)\n } else if (payloadLength === 127) {\n // Clear extended payload length\n buffer[2] = buffer[3] = 0\n buffer.writeUIntBE(bodyLength, 4, 6)\n }\n\n buffer[1] |= 0x80 // MASK\n\n // mask body\n for (let i = 0; i < bodyLength; i++) {\n buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]\n }\n\n return buffer\n }\n}\n\nmodule.exports = {\n WebsocketFrameSend\n}\n","'use strict'\n\nconst { Writable } = require('stream')\nconst diagnosticsChannel = require('diagnostics_channel')\nconst { parserStates, opcodes, states, emptyBuffer } = require('./constants')\nconst { kReadyState, kSentClose, kResponse, kReceivedClose } = require('./symbols')\nconst { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = require('./util')\nconst { WebsocketFrameSend } = require('./frame')\n\n// This code was influenced by ws released under the MIT license.\n// Copyright (c) 2011 Einar Otto Stangvik \n// Copyright (c) 2013 Arnout Kazemier and contributors\n// Copyright (c) 2016 Luigi Pinca and contributors\n\nconst channels = {}\nchannels.ping = diagnosticsChannel.channel('undici:websocket:ping')\nchannels.pong = diagnosticsChannel.channel('undici:websocket:pong')\n\nclass ByteParser extends Writable {\n #buffers = []\n #byteOffset = 0\n\n #state = parserStates.INFO\n\n #info = {}\n #fragments = []\n\n constructor (ws) {\n super()\n\n this.ws = ws\n }\n\n /**\n * @param {Buffer} chunk\n * @param {() => void} callback\n */\n _write (chunk, _, callback) {\n this.#buffers.push(chunk)\n this.#byteOffset += chunk.length\n\n this.run(callback)\n }\n\n /**\n * Runs whenever a new chunk is received.\n * Callback is called whenever there are no more chunks buffering,\n * or not enough bytes are buffered to parse.\n */\n run (callback) {\n while (true) {\n if (this.#state === parserStates.INFO) {\n // If there aren't enough bytes to parse the payload length, etc.\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n\n this.#info.fin = (buffer[0] & 0x80) !== 0\n this.#info.opcode = buffer[0] & 0x0F\n\n // If we receive a fragmented message, we use the type of the first\n // frame to parse the full message as binary/text, when it's terminated\n this.#info.originalOpcode ??= this.#info.opcode\n\n this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION\n\n if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) {\n // Only text and binary frames can be fragmented\n failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.')\n return\n }\n\n const payloadLength = buffer[1] & 0x7F\n\n if (payloadLength <= 125) {\n this.#info.payloadLength = payloadLength\n this.#state = parserStates.READ_DATA\n } else if (payloadLength === 126) {\n this.#state = parserStates.PAYLOADLENGTH_16\n } else if (payloadLength === 127) {\n this.#state = parserStates.PAYLOADLENGTH_64\n }\n\n if (this.#info.fragmented && payloadLength > 125) {\n // A fragmented frame can't be fragmented itself\n failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.')\n return\n } else if (\n (this.#info.opcode === opcodes.PING ||\n this.#info.opcode === opcodes.PONG ||\n this.#info.opcode === opcodes.CLOSE) &&\n payloadLength > 125\n ) {\n // Control frames can have a payload length of 125 bytes MAX\n failWebsocketConnection(this.ws, 'Payload length for control frame exceeded 125 bytes.')\n return\n } else if (this.#info.opcode === opcodes.CLOSE) {\n if (payloadLength === 1) {\n failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.')\n return\n }\n\n const body = this.consume(payloadLength)\n\n this.#info.closeInfo = this.parseCloseBody(false, body)\n\n if (!this.ws[kSentClose]) {\n // If an endpoint receives a Close frame and did not previously send a\n // Close frame, the endpoint MUST send a Close frame in response. (When\n // sending a Close frame in response, the endpoint typically echos the\n // status code it received.)\n const body = Buffer.allocUnsafe(2)\n body.writeUInt16BE(this.#info.closeInfo.code, 0)\n const closeFrame = new WebsocketFrameSend(body)\n\n this.ws[kResponse].socket.write(\n closeFrame.createFrame(opcodes.CLOSE),\n (err) => {\n if (!err) {\n this.ws[kSentClose] = true\n }\n }\n )\n }\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n this.ws[kReadyState] = states.CLOSING\n this.ws[kReceivedClose] = true\n\n this.end()\n\n return\n } else if (this.#info.opcode === opcodes.PING) {\n // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in\n // response, unless it already received a Close frame.\n // A Pong frame sent in response to a Ping frame must have identical\n // \"Application data\"\n\n const body = this.consume(payloadLength)\n\n if (!this.ws[kReceivedClose]) {\n const frame = new WebsocketFrameSend(body)\n\n this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG))\n\n if (channels.ping.hasSubscribers) {\n channels.ping.publish({\n payload: body\n })\n }\n }\n\n this.#state = parserStates.INFO\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n return\n }\n } else if (this.#info.opcode === opcodes.PONG) {\n // A Pong frame MAY be sent unsolicited. This serves as a\n // unidirectional heartbeat. A response to an unsolicited Pong frame is\n // not expected.\n\n const body = this.consume(payloadLength)\n\n if (channels.pong.hasSubscribers) {\n channels.pong.publish({\n payload: body\n })\n }\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n return\n }\n }\n } else if (this.#state === parserStates.PAYLOADLENGTH_16) {\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n\n this.#info.payloadLength = buffer.readUInt16BE(0)\n this.#state = parserStates.READ_DATA\n } else if (this.#state === parserStates.PAYLOADLENGTH_64) {\n if (this.#byteOffset < 8) {\n return callback()\n }\n\n const buffer = this.consume(8)\n const upper = buffer.readUInt32BE(0)\n\n // 2^31 is the maxinimum bytes an arraybuffer can contain\n // on 32-bit systems. Although, on 64-bit systems, this is\n // 2^53-1 bytes.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e\n if (upper > 2 ** 31 - 1) {\n failWebsocketConnection(this.ws, 'Received payload length > 2^31 bytes.')\n return\n }\n\n const lower = buffer.readUInt32BE(4)\n\n this.#info.payloadLength = (upper << 8) + lower\n this.#state = parserStates.READ_DATA\n } else if (this.#state === parserStates.READ_DATA) {\n if (this.#byteOffset < this.#info.payloadLength) {\n // If there is still more data in this chunk that needs to be read\n return callback()\n } else if (this.#byteOffset >= this.#info.payloadLength) {\n // If the server sent multiple frames in a single chunk\n\n const body = this.consume(this.#info.payloadLength)\n\n this.#fragments.push(body)\n\n // If the frame is unfragmented, or a fragmented frame was terminated,\n // a message was received\n if (!this.#info.fragmented || (this.#info.fin && this.#info.opcode === opcodes.CONTINUATION)) {\n const fullMessage = Buffer.concat(this.#fragments)\n\n websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage)\n\n this.#info = {}\n this.#fragments.length = 0\n }\n\n this.#state = parserStates.INFO\n }\n }\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n break\n }\n }\n }\n\n /**\n * Take n bytes from the buffered Buffers\n * @param {number} n\n * @returns {Buffer|null}\n */\n consume (n) {\n if (n > this.#byteOffset) {\n return null\n } else if (n === 0) {\n return emptyBuffer\n }\n\n if (this.#buffers[0].length === n) {\n this.#byteOffset -= this.#buffers[0].length\n return this.#buffers.shift()\n }\n\n const buffer = Buffer.allocUnsafe(n)\n let offset = 0\n\n while (offset !== n) {\n const next = this.#buffers[0]\n const { length } = next\n\n if (length + offset === n) {\n buffer.set(this.#buffers.shift(), offset)\n break\n } else if (length + offset > n) {\n buffer.set(next.subarray(0, n - offset), offset)\n this.#buffers[0] = next.subarray(n - offset)\n break\n } else {\n buffer.set(this.#buffers.shift(), offset)\n offset += next.length\n }\n }\n\n this.#byteOffset -= n\n\n return buffer\n }\n\n parseCloseBody (onlyCode, data) {\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5\n /** @type {number|undefined} */\n let code\n\n if (data.length >= 2) {\n // _The WebSocket Connection Close Code_ is\n // defined as the status code (Section 7.4) contained in the first Close\n // control frame received by the application\n code = data.readUInt16BE(0)\n }\n\n if (onlyCode) {\n if (!isValidStatusCode(code)) {\n return null\n }\n\n return { code }\n }\n\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6\n /** @type {Buffer} */\n let reason = data.subarray(2)\n\n // Remove BOM\n if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) {\n reason = reason.subarray(3)\n }\n\n if (code !== undefined && !isValidStatusCode(code)) {\n return null\n }\n\n try {\n // TODO: optimize this\n reason = new TextDecoder('utf-8', { fatal: true }).decode(reason)\n } catch {\n return null\n }\n\n return { code, reason }\n }\n\n get closingInfo () {\n return this.#info.closeInfo\n }\n}\n\nmodule.exports = {\n ByteParser\n}\n","'use strict'\n\nmodule.exports = {\n kWebSocketURL: Symbol('url'),\n kReadyState: Symbol('ready state'),\n kController: Symbol('controller'),\n kResponse: Symbol('response'),\n kBinaryType: Symbol('binary type'),\n kSentClose: Symbol('sent close'),\n kReceivedClose: Symbol('received close'),\n kByteParser: Symbol('byte parser')\n}\n","'use strict'\n\nconst { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require('./symbols')\nconst { states, opcodes } = require('./constants')\nconst { MessageEvent, ErrorEvent } = require('./events')\n\n/* globals Blob */\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isEstablished (ws) {\n // If the server's response is validated as provided for above, it is\n // said that _The WebSocket Connection is Established_ and that the\n // WebSocket Connection is in the OPEN state.\n return ws[kReadyState] === states.OPEN\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isClosing (ws) {\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n return ws[kReadyState] === states.CLOSING\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isClosed (ws) {\n return ws[kReadyState] === states.CLOSED\n}\n\n/**\n * @see https://dom.spec.whatwg.org/#concept-event-fire\n * @param {string} e\n * @param {EventTarget} target\n * @param {EventInit | undefined} eventInitDict\n */\nfunction fireEvent (e, target, eventConstructor = Event, eventInitDict) {\n // 1. If eventConstructor is not given, then let eventConstructor be Event.\n\n // 2. Let event be the result of creating an event given eventConstructor,\n // in the relevant realm of target.\n // 3. Initialize event’s type attribute to e.\n const event = new eventConstructor(e, eventInitDict) // eslint-disable-line new-cap\n\n // 4. Initialize any other IDL attributes of event as described in the\n // invocation of this algorithm.\n\n // 5. Return the result of dispatching event at target, with legacy target\n // override flag set if set.\n target.dispatchEvent(event)\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @param {import('./websocket').WebSocket} ws\n * @param {number} type Opcode\n * @param {Buffer} data application data\n */\nfunction websocketMessageReceived (ws, type, data) {\n // 1. If ready state is not OPEN (1), then return.\n if (ws[kReadyState] !== states.OPEN) {\n return\n }\n\n // 2. Let dataForEvent be determined by switching on type and binary type:\n let dataForEvent\n\n if (type === opcodes.TEXT) {\n // -> type indicates that the data is Text\n // a new DOMString containing data\n try {\n dataForEvent = new TextDecoder('utf-8', { fatal: true }).decode(data)\n } catch {\n failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.')\n return\n }\n } else if (type === opcodes.BINARY) {\n if (ws[kBinaryType] === 'blob') {\n // -> type indicates that the data is Binary and binary type is \"blob\"\n // a new Blob object, created in the relevant Realm of the WebSocket\n // object, that represents data as its raw data\n dataForEvent = new Blob([data])\n } else {\n // -> type indicates that the data is Binary and binary type is \"arraybuffer\"\n // a new ArrayBuffer object, created in the relevant Realm of the\n // WebSocket object, whose contents are data\n dataForEvent = new Uint8Array(data).buffer\n }\n }\n\n // 3. Fire an event named message at the WebSocket object, using MessageEvent,\n // with the origin attribute initialized to the serialization of the WebSocket\n // object’s url's origin, and the data attribute initialized to dataForEvent.\n fireEvent('message', ws, MessageEvent, {\n origin: ws[kWebSocketURL].origin,\n data: dataForEvent\n })\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455\n * @see https://datatracker.ietf.org/doc/html/rfc2616\n * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407\n * @param {string} protocol\n */\nfunction isValidSubprotocol (protocol) {\n // If present, this value indicates one\n // or more comma-separated subprotocol the client wishes to speak,\n // ordered by preference. The elements that comprise this value\n // MUST be non-empty strings with characters in the range U+0021 to\n // U+007E not including separator characters as defined in\n // [RFC2616] and MUST all be unique strings.\n if (protocol.length === 0) {\n return false\n }\n\n for (const char of protocol) {\n const code = char.charCodeAt(0)\n\n if (\n code < 0x21 ||\n code > 0x7E ||\n char === '(' ||\n char === ')' ||\n char === '<' ||\n char === '>' ||\n char === '@' ||\n char === ',' ||\n char === ';' ||\n char === ':' ||\n char === '\\\\' ||\n char === '\"' ||\n char === '/' ||\n char === '[' ||\n char === ']' ||\n char === '?' ||\n char === '=' ||\n char === '{' ||\n char === '}' ||\n code === 32 || // SP\n code === 9 // HT\n ) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4\n * @param {number} code\n */\nfunction isValidStatusCode (code) {\n if (code >= 1000 && code < 1015) {\n return (\n code !== 1004 && // reserved\n code !== 1005 && // \"MUST NOT be set as a status code\"\n code !== 1006 // \"MUST NOT be set as a status code\"\n )\n }\n\n return code >= 3000 && code <= 4999\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n * @param {string|undefined} reason\n */\nfunction failWebsocketConnection (ws, reason) {\n const { [kController]: controller, [kResponse]: response } = ws\n\n controller.abort()\n\n if (response?.socket && !response.socket.destroyed) {\n response.socket.destroy()\n }\n\n if (reason) {\n fireEvent('error', ws, ErrorEvent, {\n error: new Error(reason)\n })\n }\n}\n\nmodule.exports = {\n isEstablished,\n isClosing,\n isClosed,\n fireEvent,\n isValidSubprotocol,\n isValidStatusCode,\n failWebsocketConnection,\n websocketMessageReceived\n}\n","'use strict'\n\nconst { webidl } = require('../fetch/webidl')\nconst { DOMException } = require('../fetch/constants')\nconst { URLSerializer } = require('../fetch/dataURL')\nconst { getGlobalOrigin } = require('../fetch/global')\nconst { staticPropertyDescriptors, states, opcodes, emptyBuffer } = require('./constants')\nconst {\n kWebSocketURL,\n kReadyState,\n kController,\n kBinaryType,\n kResponse,\n kSentClose,\n kByteParser\n} = require('./symbols')\nconst { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = require('./util')\nconst { establishWebSocketConnection } = require('./connection')\nconst { WebsocketFrameSend } = require('./frame')\nconst { ByteParser } = require('./receiver')\nconst { kEnumerableProperty, isBlobLike } = require('../core/util')\nconst { getGlobalDispatcher } = require('../global')\nconst { types } = require('util')\n\nlet experimentalWarned = false\n\n// https://websockets.spec.whatwg.org/#interface-definition\nclass WebSocket extends EventTarget {\n #events = {\n open: null,\n error: null,\n close: null,\n message: null\n }\n\n #bufferedAmount = 0\n #protocol = ''\n #extensions = ''\n\n /**\n * @param {string} url\n * @param {string|string[]} protocols\n */\n constructor (url, protocols = []) {\n super()\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket constructor' })\n\n if (!experimentalWarned) {\n experimentalWarned = true\n process.emitWarning('WebSockets are experimental, expect them to change at any time.', {\n code: 'UNDICI-WS'\n })\n }\n\n const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols)\n\n url = webidl.converters.USVString(url)\n protocols = options.protocols\n\n // 1. Let baseURL be this's relevant settings object's API base URL.\n const baseURL = getGlobalOrigin()\n\n // 1. Let urlRecord be the result of applying the URL parser to url with baseURL.\n let urlRecord\n\n try {\n urlRecord = new URL(url, baseURL)\n } catch (e) {\n // 3. If urlRecord is failure, then throw a \"SyntaxError\" DOMException.\n throw new DOMException(e, 'SyntaxError')\n }\n\n // 4. If urlRecord’s scheme is \"http\", then set urlRecord’s scheme to \"ws\".\n if (urlRecord.protocol === 'http:') {\n urlRecord.protocol = 'ws:'\n } else if (urlRecord.protocol === 'https:') {\n // 5. Otherwise, if urlRecord’s scheme is \"https\", set urlRecord’s scheme to \"wss\".\n urlRecord.protocol = 'wss:'\n }\n\n // 6. If urlRecord’s scheme is not \"ws\" or \"wss\", then throw a \"SyntaxError\" DOMException.\n if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') {\n throw new DOMException(\n `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`,\n 'SyntaxError'\n )\n }\n\n // 7. If urlRecord’s fragment is non-null, then throw a \"SyntaxError\"\n // DOMException.\n if (urlRecord.hash || urlRecord.href.endsWith('#')) {\n throw new DOMException('Got fragment', 'SyntaxError')\n }\n\n // 8. If protocols is a string, set protocols to a sequence consisting\n // of just that string.\n if (typeof protocols === 'string') {\n protocols = [protocols]\n }\n\n // 9. If any of the values in protocols occur more than once or otherwise\n // fail to match the requirements for elements that comprise the value\n // of `Sec-WebSocket-Protocol` fields as defined by The WebSocket\n // protocol, then throw a \"SyntaxError\" DOMException.\n if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n // 10. Set this's url to urlRecord.\n this[kWebSocketURL] = new URL(urlRecord.href)\n\n // 11. Let client be this's relevant settings object.\n\n // 12. Run this step in parallel:\n\n // 1. Establish a WebSocket connection given urlRecord, protocols,\n // and client.\n this[kController] = establishWebSocketConnection(\n urlRecord,\n protocols,\n this,\n (response) => this.#onConnectionEstablished(response),\n options\n )\n\n // Each WebSocket object has an associated ready state, which is a\n // number representing the state of the connection. Initially it must\n // be CONNECTING (0).\n this[kReadyState] = WebSocket.CONNECTING\n\n // The extensions attribute must initially return the empty string.\n\n // The protocol attribute must initially return the empty string.\n\n // Each WebSocket object has an associated binary type, which is a\n // BinaryType. Initially it must be \"blob\".\n this[kBinaryType] = 'blob'\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-close\n * @param {number|undefined} code\n * @param {string|undefined} reason\n */\n close (code = undefined, reason = undefined) {\n webidl.brandCheck(this, WebSocket)\n\n if (code !== undefined) {\n code = webidl.converters['unsigned short'](code, { clamp: true })\n }\n\n if (reason !== undefined) {\n reason = webidl.converters.USVString(reason)\n }\n\n // 1. If code is present, but is neither an integer equal to 1000 nor an\n // integer in the range 3000 to 4999, inclusive, throw an\n // \"InvalidAccessError\" DOMException.\n if (code !== undefined) {\n if (code !== 1000 && (code < 3000 || code > 4999)) {\n throw new DOMException('invalid code', 'InvalidAccessError')\n }\n }\n\n let reasonByteLength = 0\n\n // 2. If reason is present, then run these substeps:\n if (reason !== undefined) {\n // 1. Let reasonBytes be the result of encoding reason.\n // 2. If reasonBytes is longer than 123 bytes, then throw a\n // \"SyntaxError\" DOMException.\n reasonByteLength = Buffer.byteLength(reason)\n\n if (reasonByteLength > 123) {\n throw new DOMException(\n `Reason must be less than 123 bytes; received ${reasonByteLength}`,\n 'SyntaxError'\n )\n }\n }\n\n // 3. Run the first matching steps from the following list:\n if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) {\n // If this's ready state is CLOSING (2) or CLOSED (3)\n // Do nothing.\n } else if (!isEstablished(this)) {\n // If the WebSocket connection is not yet established\n // Fail the WebSocket connection and set this's ready state\n // to CLOSING (2).\n failWebsocketConnection(this, 'Connection was closed before it was established.')\n this[kReadyState] = WebSocket.CLOSING\n } else if (!isClosing(this)) {\n // If the WebSocket closing handshake has not yet been started\n // Start the WebSocket closing handshake and set this's ready\n // state to CLOSING (2).\n // - If neither code nor reason is present, the WebSocket Close\n // message must not have a body.\n // - If code is present, then the status code to use in the\n // WebSocket Close message must be the integer given by code.\n // - If reason is also present, then reasonBytes must be\n // provided in the Close message after the status code.\n\n const frame = new WebsocketFrameSend()\n\n // If neither code nor reason is present, the WebSocket Close\n // message must not have a body.\n\n // If code is present, then the status code to use in the\n // WebSocket Close message must be the integer given by code.\n if (code !== undefined && reason === undefined) {\n frame.frameData = Buffer.allocUnsafe(2)\n frame.frameData.writeUInt16BE(code, 0)\n } else if (code !== undefined && reason !== undefined) {\n // If reason is also present, then reasonBytes must be\n // provided in the Close message after the status code.\n frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength)\n frame.frameData.writeUInt16BE(code, 0)\n // the body MAY contain UTF-8-encoded data with value /reason/\n frame.frameData.write(reason, 2, 'utf-8')\n } else {\n frame.frameData = emptyBuffer\n }\n\n /** @type {import('stream').Duplex} */\n const socket = this[kResponse].socket\n\n socket.write(frame.createFrame(opcodes.CLOSE), (err) => {\n if (!err) {\n this[kSentClose] = true\n }\n })\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n this[kReadyState] = states.CLOSING\n } else {\n // Otherwise\n // Set this's ready state to CLOSING (2).\n this[kReadyState] = WebSocket.CLOSING\n }\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-send\n * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data\n */\n send (data) {\n webidl.brandCheck(this, WebSocket)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket.send' })\n\n data = webidl.converters.WebSocketSendData(data)\n\n // 1. If this's ready state is CONNECTING, then throw an\n // \"InvalidStateError\" DOMException.\n if (this[kReadyState] === WebSocket.CONNECTING) {\n throw new DOMException('Sent before connected.', 'InvalidStateError')\n }\n\n // 2. Run the appropriate set of steps from the following list:\n // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1\n // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n\n if (!isEstablished(this) || isClosing(this)) {\n return\n }\n\n /** @type {import('stream').Duplex} */\n const socket = this[kResponse].socket\n\n // If data is a string\n if (typeof data === 'string') {\n // If the WebSocket connection is established and the WebSocket\n // closing handshake has not yet started, then the user agent\n // must send a WebSocket Message comprised of the data argument\n // using a text frame opcode; if the data cannot be sent, e.g.\n // because it would need to be buffered but the buffer is full,\n // the user agent must flag the WebSocket as full and then close\n // the WebSocket connection. Any invocation of this method with a\n // string argument that does not throw an exception must increase\n // the bufferedAmount attribute by the number of bytes needed to\n // express the argument as UTF-8.\n\n const value = Buffer.from(data)\n const frame = new WebsocketFrameSend(value)\n const buffer = frame.createFrame(opcodes.TEXT)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n } else if (types.isArrayBuffer(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need\n // to be buffered but the buffer is full, the user agent must flag\n // the WebSocket as full and then close the WebSocket connection.\n // The data to be sent is the data stored in the buffer described\n // by the ArrayBuffer object. Any invocation of this method with an\n // ArrayBuffer argument that does not throw an exception must\n // increase the bufferedAmount attribute by the length of the\n // ArrayBuffer in bytes.\n\n const value = Buffer.from(data)\n const frame = new WebsocketFrameSend(value)\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n } else if (ArrayBuffer.isView(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The\n // data to be sent is the data stored in the section of the buffer\n // described by the ArrayBuffer object that data references. Any\n // invocation of this method with this kind of argument that does\n // not throw an exception must increase the bufferedAmount attribute\n // by the length of data’s buffer in bytes.\n\n const ab = Buffer.from(data, data.byteOffset, data.byteLength)\n\n const frame = new WebsocketFrameSend(ab)\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += ab.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= ab.byteLength\n })\n } else if (isBlobLike(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The data\n // to be sent is the raw data represented by the Blob object. Any\n // invocation of this method with a Blob argument that does not throw\n // an exception must increase the bufferedAmount attribute by the size\n // of the Blob object’s raw data, in bytes.\n\n const frame = new WebsocketFrameSend()\n\n data.arrayBuffer().then((ab) => {\n const value = Buffer.from(ab)\n frame.frameData = value\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n })\n }\n }\n\n get readyState () {\n webidl.brandCheck(this, WebSocket)\n\n // The readyState getter steps are to return this's ready state.\n return this[kReadyState]\n }\n\n get bufferedAmount () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#bufferedAmount\n }\n\n get url () {\n webidl.brandCheck(this, WebSocket)\n\n // The url getter steps are to return this's url, serialized.\n return URLSerializer(this[kWebSocketURL])\n }\n\n get extensions () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#extensions\n }\n\n get protocol () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#protocol\n }\n\n get onopen () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.open\n }\n\n set onopen (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.open) {\n this.removeEventListener('open', this.#events.open)\n }\n\n if (typeof fn === 'function') {\n this.#events.open = fn\n this.addEventListener('open', fn)\n } else {\n this.#events.open = null\n }\n }\n\n get onerror () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.error\n }\n\n set onerror (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.error) {\n this.removeEventListener('error', this.#events.error)\n }\n\n if (typeof fn === 'function') {\n this.#events.error = fn\n this.addEventListener('error', fn)\n } else {\n this.#events.error = null\n }\n }\n\n get onclose () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.close\n }\n\n set onclose (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.close) {\n this.removeEventListener('close', this.#events.close)\n }\n\n if (typeof fn === 'function') {\n this.#events.close = fn\n this.addEventListener('close', fn)\n } else {\n this.#events.close = null\n }\n }\n\n get onmessage () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.message\n }\n\n set onmessage (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.message) {\n this.removeEventListener('message', this.#events.message)\n }\n\n if (typeof fn === 'function') {\n this.#events.message = fn\n this.addEventListener('message', fn)\n } else {\n this.#events.message = null\n }\n }\n\n get binaryType () {\n webidl.brandCheck(this, WebSocket)\n\n return this[kBinaryType]\n }\n\n set binaryType (type) {\n webidl.brandCheck(this, WebSocket)\n\n if (type !== 'blob' && type !== 'arraybuffer') {\n this[kBinaryType] = 'blob'\n } else {\n this[kBinaryType] = type\n }\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n */\n #onConnectionEstablished (response) {\n // processResponse is called when the \"response’s header list has been received and initialized.\"\n // once this happens, the connection is open\n this[kResponse] = response\n\n const parser = new ByteParser(this)\n parser.on('drain', function onParserDrain () {\n this.ws[kResponse].socket.resume()\n })\n\n response.socket.ws = this\n this[kByteParser] = parser\n\n // 1. Change the ready state to OPEN (1).\n this[kReadyState] = states.OPEN\n\n // 2. Change the extensions attribute’s value to the extensions in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1\n const extensions = response.headersList.get('sec-websocket-extensions')\n\n if (extensions !== null) {\n this.#extensions = extensions\n }\n\n // 3. Change the protocol attribute’s value to the subprotocol in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9\n const protocol = response.headersList.get('sec-websocket-protocol')\n\n if (protocol !== null) {\n this.#protocol = protocol\n }\n\n // 4. Fire an event named open at the WebSocket object.\n fireEvent('open', this)\n }\n}\n\n// https://websockets.spec.whatwg.org/#dom-websocket-connecting\nWebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING\n// https://websockets.spec.whatwg.org/#dom-websocket-open\nWebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN\n// https://websockets.spec.whatwg.org/#dom-websocket-closing\nWebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING\n// https://websockets.spec.whatwg.org/#dom-websocket-closed\nWebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED\n\nObject.defineProperties(WebSocket.prototype, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors,\n url: kEnumerableProperty,\n readyState: kEnumerableProperty,\n bufferedAmount: kEnumerableProperty,\n onopen: kEnumerableProperty,\n onerror: kEnumerableProperty,\n onclose: kEnumerableProperty,\n close: kEnumerableProperty,\n onmessage: kEnumerableProperty,\n binaryType: kEnumerableProperty,\n send: kEnumerableProperty,\n extensions: kEnumerableProperty,\n protocol: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'WebSocket',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nObject.defineProperties(WebSocket, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors\n})\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.DOMString\n)\n\nwebidl.converters['DOMString or sequence'] = function (V) {\n if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) {\n return webidl.converters['sequence'](V)\n }\n\n return webidl.converters.DOMString(V)\n}\n\n// This implements the propsal made in https://github.com/whatwg/websockets/issues/42\nwebidl.converters.WebSocketInit = webidl.dictionaryConverter([\n {\n key: 'protocols',\n converter: webidl.converters['DOMString or sequence'],\n get defaultValue () {\n return []\n }\n },\n {\n key: 'dispatcher',\n converter: (V) => V,\n get defaultValue () {\n return getGlobalDispatcher()\n }\n },\n {\n key: 'headers',\n converter: webidl.nullableConverter(webidl.converters.HeadersInit)\n }\n])\n\nwebidl.converters['DOMString or sequence or WebSocketInit'] = function (V) {\n if (webidl.util.Type(V) === 'Object' && !(Symbol.iterator in V)) {\n return webidl.converters.WebSocketInit(V)\n }\n\n return { protocols: webidl.converters['DOMString or sequence'](V) }\n}\n\nwebidl.converters.WebSocketSendData = function (V) {\n if (webidl.util.Type(V) === 'Object') {\n if (isBlobLike(V)) {\n return webidl.converters.Blob(V, { strict: false })\n }\n\n if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) {\n return webidl.converters.BufferSource(V)\n }\n }\n\n return webidl.converters.USVString(V)\n}\n\nmodule.exports = {\n WebSocket\n}\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction getUserAgent() {\n if (typeof navigator === \"object\" && \"userAgent\" in navigator) {\n return navigator.userAgent;\n }\n\n if (typeof process === \"object\" && \"version\" in process) {\n return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`;\n }\n\n return \"\";\n}\n\nexports.getUserAgent = getUserAgent;\n//# sourceMappingURL=index.js.map\n","'use strict'\n\nexports.fromCallback = function (fn) {\n return Object.defineProperty(function (...args) {\n if (typeof args[args.length - 1] === 'function') fn.apply(this, args)\n else {\n return new Promise((resolve, reject) => {\n fn.call(\n this,\n ...args,\n (err, res) => (err != null) ? reject(err) : resolve(res)\n )\n })\n }\n }, 'name', { value: fn.name })\n}\n\nexports.fromPromise = function (fn) {\n return Object.defineProperty(function (...args) {\n const cb = args[args.length - 1]\n if (typeof cb !== 'function') return fn.apply(this, args)\n else fn.apply(this, args.slice(0, -1)).then(r => cb(null, r), cb)\n }, 'name', { value: fn.name })\n}\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"v1\", {\n enumerable: true,\n get: function () {\n return _v.default;\n }\n});\nObject.defineProperty(exports, \"v3\", {\n enumerable: true,\n get: function () {\n return _v2.default;\n }\n});\nObject.defineProperty(exports, \"v4\", {\n enumerable: true,\n get: function () {\n return _v3.default;\n }\n});\nObject.defineProperty(exports, \"v5\", {\n enumerable: true,\n get: function () {\n return _v4.default;\n }\n});\nObject.defineProperty(exports, \"NIL\", {\n enumerable: true,\n get: function () {\n return _nil.default;\n }\n});\nObject.defineProperty(exports, \"version\", {\n enumerable: true,\n get: function () {\n return _version.default;\n }\n});\nObject.defineProperty(exports, \"validate\", {\n enumerable: true,\n get: function () {\n return _validate.default;\n }\n});\nObject.defineProperty(exports, \"stringify\", {\n enumerable: true,\n get: function () {\n return _stringify.default;\n }\n});\nObject.defineProperty(exports, \"parse\", {\n enumerable: true,\n get: function () {\n return _parse.default;\n }\n});\n\nvar _v = _interopRequireDefault(require(\"./v1.js\"));\n\nvar _v2 = _interopRequireDefault(require(\"./v3.js\"));\n\nvar _v3 = _interopRequireDefault(require(\"./v4.js\"));\n\nvar _v4 = _interopRequireDefault(require(\"./v5.js\"));\n\nvar _nil = _interopRequireDefault(require(\"./nil.js\"));\n\nvar _version = _interopRequireDefault(require(\"./version.js\"));\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nvar _parse = _interopRequireDefault(require(\"./parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction md5(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n } else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n\n return _crypto.default.createHash('md5').update(bytes).digest();\n}\n\nvar _default = md5;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _default = '00000000-0000-0000-0000-000000000000';\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction parse(uuid) {\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n let v;\n const arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nvar _default = parse;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = rng;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\n\nfunction rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n _crypto.default.randomFillSync(rnds8Pool);\n\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction sha1(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n } else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n\n return _crypto.default.createHash('sha1').update(bytes).digest();\n}\n\nvar _default = sha1;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nvar _default = stringify;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _rng = _interopRequireDefault(require(\"./rng.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\nlet _nodeId;\n\nlet _clockseq; // Previous uuid creation time\n\n\nlet _lastMSecs = 0;\nlet _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n let i = buf && offset || 0;\n const b = buf || new Array(16);\n options = options || {};\n let node = options.node || _nodeId;\n let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n const seedBytes = options.random || (options.rng || _rng.default)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (let n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || (0, _stringify.default)(b);\n}\n\nvar _default = v1;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _v = _interopRequireDefault(require(\"./v35.js\"));\n\nvar _md = _interopRequireDefault(require(\"./md5.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst v3 = (0, _v.default)('v3', 0x30, _md.default);\nvar _default = v3;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = _default;\nexports.URL = exports.DNS = void 0;\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nvar _parse = _interopRequireDefault(require(\"./parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n const bytes = [];\n\n for (let i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nconst DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexports.DNS = DNS;\nconst URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexports.URL = URL;\n\nfunction _default(name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = (0, _parse.default)(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n let bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return (0, _stringify.default)(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _rng = _interopRequireDefault(require(\"./rng.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction v4(options, buf, offset) {\n options = options || {};\n\n const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return (0, _stringify.default)(rnds);\n}\n\nvar _default = v4;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _v = _interopRequireDefault(require(\"./v35.js\"));\n\nvar _sha = _interopRequireDefault(require(\"./sha1.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst v5 = (0, _v.default)('v5', 0x50, _sha.default);\nvar _default = v5;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _regex = _interopRequireDefault(require(\"./regex.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && _regex.default.test(uuid);\n}\n\nvar _default = validate;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction version(uuid) {\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nvar _default = version;\nexports.default = _default;","// Returns a wrapper function that returns a wrapped callback\n// The wrapper function should do some stuff, and return a\n// presumably different callback function.\n// This makes sure that own properties are retained, so that\n// decorations and such are not lost along the way.\nmodule.exports = wrappy\nfunction wrappy (fn, cb) {\n if (fn && cb) return wrappy(fn)(cb)\n\n if (typeof fn !== 'function')\n throw new TypeError('need wrapper function')\n\n Object.keys(fn).forEach(function (k) {\n wrapper[k] = fn[k]\n })\n\n return wrapper\n\n function wrapper() {\n var args = new Array(arguments.length)\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i]\n }\n var ret = fn.apply(this, args)\n var cb = args[args.length-1]\n if (typeof ret === 'function' && ret !== cb) {\n Object.keys(cb).forEach(function (k) {\n ret[k] = cb[k]\n })\n }\n return ret\n }\n}\n","module.exports = require(\"assert\");","module.exports = require(\"async_hooks\");","module.exports = require(\"buffer\");","module.exports = require(\"child_process\");","module.exports = require(\"console\");","module.exports = require(\"constants\");","module.exports = require(\"crypto\");","module.exports = require(\"diagnostics_channel\");","module.exports = require(\"events\");","module.exports = require(\"fs\");","module.exports = require(\"fs/promises\");","module.exports = require(\"http\");","module.exports = require(\"http2\");","module.exports = require(\"https\");","module.exports = require(\"net\");","module.exports = require(\"node:events\");","module.exports = require(\"node:stream\");","module.exports = require(\"node:util\");","module.exports = require(\"os\");","module.exports = require(\"path\");","module.exports = require(\"perf_hooks\");","module.exports = require(\"process\");","module.exports = require(\"querystring\");","module.exports = require(\"stream\");","module.exports = require(\"stream/web\");","module.exports = require(\"string_decoder\");","module.exports = require(\"tls\");","module.exports = require(\"tty\");","module.exports = require(\"url\");","module.exports = require(\"util\");","module.exports = require(\"util/types\");","module.exports = require(\"worker_threads\");","module.exports = require(\"zlib\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tvar threw = true;\n\ttry {\n\t\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\t\tthrew = false;\n\t} finally {\n\t\tif(threw) delete __webpack_module_cache__[moduleId];\n\t}\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","\nif (typeof __webpack_require__ !== 'undefined') __webpack_require__.ab = __dirname + \"/\";","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(94822);\n",""],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"index.js","mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/oBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtZA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpBA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrBA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnBA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACj9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1hBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7SA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACNA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChEA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClBA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACfA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACLA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACTA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnNA;AACA;AACA;AACA;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACNA;AACA;AACA;AACA;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrBA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5/PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpKA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACl7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvFA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACngCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtEA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtCA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7gCA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9CA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClCA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1CA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9RA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpCA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxDA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACRA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClKA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACt0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3kBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7OA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/bA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9CA;AACA;AACA;AACA;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACroFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpaA;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACr0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/IA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9uEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACleA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACviBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/6BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrRA;;;;;;;;ACAA;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChCA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AChCA;AACA;AACA;AACA;AACA;;;;ACJA;AACA;;;;AEDA;AACA;AACA;AACA","sources":[".././lib/action.js",".././lib/assembly.js",".././lib/comment.js",".././lib/diff.js",".././lib/index.js",".././lib/stage-processor.js",".././node_modules/@actions/core/lib/command.js",".././node_modules/@actions/core/lib/core.js",".././node_modules/@actions/core/lib/file-command.js",".././node_modules/@actions/core/lib/oidc-utils.js",".././node_modules/@actions/core/lib/path-utils.js",".././node_modules/@actions/core/lib/summary.js",".././node_modules/@actions/core/lib/utils.js",".././node_modules/@actions/github/lib/context.js",".././node_modules/@actions/github/lib/github.js",".././node_modules/@actions/github/lib/internal/utils.js",".././node_modules/@actions/github/lib/utils.js",".././node_modules/@actions/http-client/lib/auth.js",".././node_modules/@actions/http-client/lib/index.js",".././node_modules/@actions/http-client/lib/proxy.js",".././node_modules/@aws-cdk/aws-service-spec/lib/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/.warnings.jsii.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/assets/aws-destination.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/assets/docker-image-asset.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/assets/file-asset.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/assets/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/assets/schema.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/cloud-assembly/artifact-schema.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/cloud-assembly/context-queries.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/cloud-assembly/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/cloud-assembly/metadata-schema.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/cloud-assembly/schema.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/commands/common.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/commands/deploy.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/commands/destroy.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/commands/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/schema.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/integ-tests/test-case.js",".././node_modules/@aws-cdk/cloud-assembly-schema/lib/manifest.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema/lib/attribute.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema/lib/helpers.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema/lib/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema/lib/scan.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema/lib/validator.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/lru-cache/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/classes/comparator.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/classes/range.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/classes/semver.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/clean.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/cmp.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/coerce.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/compare-build.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/compare-loose.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/compare.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/diff.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/eq.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/gt.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/gte.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/inc.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/lt.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/lte.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/major.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/minor.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/neq.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/parse.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/patch.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/prerelease.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/rcompare.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/rsort.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/satisfies.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/sort.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/functions/valid.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/index.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/internal/constants.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/internal/debug.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/internal/identifiers.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/internal/parse-options.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/internal/re.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/gtr.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/intersects.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/ltr.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/max-satisfying.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/min-satisfying.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/min-version.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/outside.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/simplify.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/subset.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/to-comparators.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver/ranges/valid.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist/iterator.js",".././node_modules/@aws-cdk/cloud-assembly-schema/node_modules/yallist/yallist.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diff-template.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diff/index.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diff/maybe-parsed.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diff/types.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diff/util.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/diffable.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/format-table.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/format.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/iam/iam-changes.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/iam/managed-policy.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/iam/statement.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/index.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/network/security-group-changes.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/network/security-group-rule.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/render-intrinsics.js",".././node_modules/@aws-cdk/cloudformation-diff/lib/util.js",".././node_modules/@aws-cdk/service-spec-types/lib/index.js",".././node_modules/@aws-cdk/service-spec-types/lib/types/augmentations.js",".././node_modules/@aws-cdk/service-spec-types/lib/types/database.js",".././node_modules/@aws-cdk/service-spec-types/lib/types/diff.js",".././node_modules/@aws-cdk/service-spec-types/lib/types/metrics.js",".././node_modules/@aws-cdk/service-spec-types/lib/types/resource.js",".././node_modules/@aws-cdk/service-spec-types/lib/util/sorting.js",".././node_modules/@aws-crypto/crc32/build/aws_crc32.js",".././node_modules/@aws-crypto/crc32/build/index.js",".././node_modules/@aws-crypto/crc32/node_modules/tslib/tslib.js",".././node_modules/@aws-crypto/util/build/convertToBuffer.js",".././node_modules/@aws-crypto/util/build/index.js",".././node_modules/@aws-crypto/util/build/isEmptyData.js",".././node_modules/@aws-crypto/util/build/numToUint8.js",".././node_modules/@aws-crypto/util/build/uint32ArrayFrom.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/CloudFormation.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/CloudFormationClient.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ActivateOrganizationsAccessCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ActivateTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/BatchDescribeTypeConfigurationsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/CancelUpdateStackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ContinueUpdateRollbackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/CreateChangeSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/CreateStackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/CreateStackInstancesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/CreateStackSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeactivateOrganizationsAccessCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeactivateTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeleteChangeSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeleteStackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeleteStackInstancesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeleteStackSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DeregisterTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeAccountLimitsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeChangeSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeChangeSetHooksCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeOrganizationsAccessCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribePublisherCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackDriftDetectionStatusCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackEventsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackInstanceCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackResourceCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackResourceDriftsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackResourcesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStackSetOperationCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeStacksCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DescribeTypeRegistrationCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DetectStackDriftCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DetectStackResourceDriftCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/DetectStackSetDriftCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/EstimateTemplateCostCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ExecuteChangeSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/GetStackPolicyCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/GetTemplateCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/GetTemplateSummaryCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ImportStacksToStackSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListChangeSetsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListExportsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListImportsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackInstanceResourceDriftsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackInstancesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackResourcesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackSetOperationResultsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackSetOperationsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStackSetsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListStacksCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListTypeRegistrationsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListTypeVersionsCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ListTypesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/PublishTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/RecordHandlerProgressCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/RegisterPublisherCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/RegisterTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/RollbackStackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/SetStackPolicyCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/SetTypeConfigurationCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/SetTypeDefaultVersionCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/SignalResourceCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/StopStackSetOperationCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/TestTypeCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/UpdateStackCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/UpdateStackInstancesCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/UpdateStackSetCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/UpdateTerminationProtectionCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/ValidateTemplateCommand.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/commands/index.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/endpoint/EndpointParameters.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/endpoint/endpointResolver.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/endpoint/ruleset.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/index.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/models/CloudFormationServiceException.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/models/index.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/models/models_0.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/DescribeAccountLimitsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/DescribeStackEventsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/DescribeStackResourceDriftsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/DescribeStacksPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/Interfaces.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListChangeSetsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListExportsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListImportsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStackInstancesPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStackResourcesPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStackSetOperationResultsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStackSetOperationsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStackSetsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListStacksPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListTypeRegistrationsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListTypeVersionsPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/ListTypesPaginator.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/pagination/index.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/protocols/Aws_query.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/runtimeConfig.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/runtimeConfig.shared.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/runtimeExtensions.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/index.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForChangeSetCreateComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackCreateComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackDeleteComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackExists.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackImportComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackRollbackComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForStackUpdateComplete.js",".././node_modules/@aws-sdk/client-cloudformation/dist-cjs/waiters/waitForTypeRegistrationComplete.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/CognitoIdentity.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/CognitoIdentityClient.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/CreateIdentityPoolCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/DeleteIdentitiesCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/DeleteIdentityPoolCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/DescribeIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/DescribeIdentityPoolCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetCredentialsForIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetIdCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetIdentityPoolRolesCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetOpenIdTokenCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetOpenIdTokenForDeveloperIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/GetPrincipalTagAttributeMapCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/ListIdentitiesCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/ListIdentityPoolsCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/ListTagsForResourceCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/LookupDeveloperIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/MergeDeveloperIdentitiesCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/SetIdentityPoolRolesCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/SetPrincipalTagAttributeMapCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/TagResourceCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/UnlinkDeveloperIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/UnlinkIdentityCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/UntagResourceCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/UpdateIdentityPoolCommand.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/commands/index.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/endpoint/EndpointParameters.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/endpoint/endpointResolver.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/endpoint/ruleset.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/index.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/models/CognitoIdentityServiceException.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/models/index.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/models/models_0.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/pagination/Interfaces.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/pagination/ListIdentityPoolsPaginator.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/pagination/index.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/protocols/Aws_json1_1.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/runtimeConfig.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/runtimeConfig.shared.js",".././node_modules/@aws-sdk/client-cognito-identity/dist-cjs/runtimeExtensions.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/SSO.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/SSOClient.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/commands/GetRoleCredentialsCommand.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/commands/ListAccountRolesCommand.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/commands/ListAccountsCommand.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/commands/LogoutCommand.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/commands/index.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/endpoint/EndpointParameters.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/endpoint/endpointResolver.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/endpoint/ruleset.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/index.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/models/SSOServiceException.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/models/index.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/models/models_0.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/pagination/Interfaces.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/pagination/ListAccountRolesPaginator.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/pagination/ListAccountsPaginator.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/pagination/index.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/protocols/Aws_restJson1.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/runtimeConfig.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/runtimeConfig.shared.js",".././node_modules/@aws-sdk/client-sso/dist-cjs/runtimeExtensions.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/STS.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/STSClient.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/AssumeRoleCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/AssumeRoleWithSAMLCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/AssumeRoleWithWebIdentityCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/DecodeAuthorizationMessageCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/GetAccessKeyInfoCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/GetCallerIdentityCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/GetFederationTokenCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/GetSessionTokenCommand.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/commands/index.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/defaultRoleAssumers.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/defaultStsRoleAssumers.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/EndpointParameters.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/endpointResolver.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/ruleset.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/index.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/models/STSServiceException.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/models/index.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/models/models_0.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/protocols/Aws_query.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.shared.js",".././node_modules/@aws-sdk/client-sts/dist-cjs/runtimeExtensions.js",".././node_modules/@aws-sdk/core/dist-cjs/client/emitWarningIfUnsupportedVersion.js",".././node_modules/@aws-sdk/core/dist-cjs/client/index.js",".././node_modules/@aws-sdk/core/dist-cjs/index.js",".././node_modules/@aws-sdk/core/dist-cjs/protocols/coercing-serializers.js",".././node_modules/@aws-sdk/core/dist-cjs/protocols/index.js",".././node_modules/@aws-sdk/core/dist-cjs/protocols/json/awsExpectUnion.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/CognitoProviderParameters.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/InMemoryStorage.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/IndexedDbStorage.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/Logins.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/Storage.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/fromCognitoIdentity.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/fromCognitoIdentityPool.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/localStorage.js",".././node_modules/@aws-sdk/credential-provider-cognito-identity/dist-cjs/resolveLogins.js",".././node_modules/@aws-sdk/credential-provider-env/dist-cjs/fromEnv.js",".././node_modules/@aws-sdk/credential-provider-env/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/checkUrl.js",".././node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/fromHttp.js",".././node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/requestHelpers.js",".././node_modules/@aws-sdk/credential-provider-http/dist-cjs/fromHttp/retry-wrapper.js",".././node_modules/@aws-sdk/credential-provider-http/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/fromIni.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveAssumeRoleCredentials.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveCredentialSource.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveProcessCredentials.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveProfileData.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveSsoCredentials.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveStaticCredentials.js",".././node_modules/@aws-sdk/credential-provider-ini/dist-cjs/resolveWebIdentityCredentials.js",".././node_modules/@aws-sdk/credential-provider-node/dist-cjs/defaultProvider.js",".././node_modules/@aws-sdk/credential-provider-node/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-node/dist-cjs/remoteProvider.js",".././node_modules/@aws-sdk/credential-provider-process/dist-cjs/fromProcess.js",".././node_modules/@aws-sdk/credential-provider-process/dist-cjs/getValidatedProcessCredentials.js",".././node_modules/@aws-sdk/credential-provider-process/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-process/dist-cjs/resolveProcessCredentials.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/fromSSO.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/isSsoProfile.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/resolveSSOCredentials.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/types.js",".././node_modules/@aws-sdk/credential-provider-sso/dist-cjs/validateSsoProfile.js",".././node_modules/@aws-sdk/credential-provider-web-identity/dist-cjs/fromTokenFile.js",".././node_modules/@aws-sdk/credential-provider-web-identity/dist-cjs/fromWebToken.js",".././node_modules/@aws-sdk/credential-provider-web-identity/dist-cjs/index.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromCognitoIdentity.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromCognitoIdentityPool.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromContainerMetadata.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromEnv.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromIni.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromInstanceMetadata.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromNodeProviderChain.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromProcess.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromSSO.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromTemporaryCredentials.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromTokenFile.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/fromWebToken.js",".././node_modules/@aws-sdk/credential-providers/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-host-header/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-logger/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-logger/dist-cjs/loggerMiddleware.js",".././node_modules/@aws-sdk/middleware-recursion-detection/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-sdk-sts/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/awsAuthConfiguration.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/awsAuthMiddleware.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/utils/getSkewCorrectedDate.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/utils/getUpdatedSystemClockOffset.js",".././node_modules/@aws-sdk/middleware-signing/dist-cjs/utils/isClockSkewed.js",".././node_modules/@aws-sdk/middleware-user-agent/dist-cjs/configurations.js",".././node_modules/@aws-sdk/middleware-user-agent/dist-cjs/constants.js",".././node_modules/@aws-sdk/middleware-user-agent/dist-cjs/index.js",".././node_modules/@aws-sdk/middleware-user-agent/dist-cjs/user-agent-middleware.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/extensions/index.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/index.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/regionConfig/config.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/regionConfig/getRealRegion.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/regionConfig/index.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/regionConfig/isFipsRegion.js",".././node_modules/@aws-sdk/region-config-resolver/dist-cjs/regionConfig/resolveRegionConfig.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/bundle/client-sso-oidc-node.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/constants.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/fromSso.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/fromStatic.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/getNewSsoOidcToken.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/getSsoOidcClient.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/index.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/nodeProvider.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/validateTokenExpiry.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/validateTokenKey.js",".././node_modules/@aws-sdk/token-providers/dist-cjs/writeSSOTokenToFile.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/aws.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/index.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/aws/isVirtualHostableS3Bucket.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/aws/parseArn.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/aws/partition.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/lib/isIpAddress.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/resolveEndpoint.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/EndpointError.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/EndpointRuleObject.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/ErrorRuleObject.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/RuleSetObject.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/TreeRuleObject.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/index.js",".././node_modules/@aws-sdk/util-endpoints/dist-cjs/types/shared.js",".././node_modules/@aws-sdk/util-user-agent-node/dist-cjs/crt-availability.js",".././node_modules/@aws-sdk/util-user-agent-node/dist-cjs/index.js",".././node_modules/@aws-sdk/util-user-agent-node/dist-cjs/is-crt-available.js",".././node_modules/@aws-sdk/util-utf8-browser/dist-cjs/index.js",".././node_modules/@aws-sdk/util-utf8-browser/dist-cjs/pureJs.js",".././node_modules/@aws-sdk/util-utf8-browser/dist-cjs/whatwgEncodingApi.js",".././node_modules/@cdklabs/tskb/lib/database.js",".././node_modules/@cdklabs/tskb/lib/entity.js",".././node_modules/@cdklabs/tskb/lib/index.js",".././node_modules/@cdklabs/tskb/lib/invariant.js",".././node_modules/@cdklabs/tskb/lib/relationship.js",".././node_modules/@cdklabs/tskb/lib/result.js",".././node_modules/@cdklabs/tskb/lib/sorted-map.js",".././node_modules/@octokit/auth-token/dist-node/index.js",".././node_modules/@octokit/core/dist-node/index.js",".././node_modules/@octokit/endpoint/dist-node/index.js",".././node_modules/@octokit/graphql/dist-node/index.js",".././node_modules/@octokit/plugin-paginate-rest/dist-node/index.js",".././node_modules/@octokit/plugin-rest-endpoint-methods/dist-node/index.js",".././node_modules/@octokit/request-error/dist-node/index.js",".././node_modules/@octokit/request/dist-node/index.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/NodeUseDualstackEndpointConfigOptions.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/NodeUseFipsEndpointConfigOptions.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/index.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/resolveCustomEndpointsConfig.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/resolveEndpointsConfig.js",".././node_modules/@smithy/config-resolver/dist-cjs/endpointsConfig/utils/getEndpointFromRegion.js",".././node_modules/@smithy/config-resolver/dist-cjs/index.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionConfig/config.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionConfig/getRealRegion.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionConfig/index.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionConfig/isFipsRegion.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionConfig/resolveRegionConfig.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/PartitionHash.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/RegionHash.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/getHostnameFromVariants.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/getRegionInfo.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/getResolvedHostname.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/getResolvedPartition.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/getResolvedSigningRegion.js",".././node_modules/@smithy/config-resolver/dist-cjs/regionInfo/index.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/config/Endpoint.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/config/EndpointConfigOptions.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/config/EndpointMode.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/config/EndpointModeConfigOptions.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/error/InstanceMetadataV1FallbackError.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/fromContainerMetadata.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/fromInstanceMetadata.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/index.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/remoteProvider/ImdsCredentials.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/remoteProvider/RemoteProviderInit.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/remoteProvider/httpRequest.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/remoteProvider/retry.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/types.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/utils/getExtendedInstanceMetadataCredentials.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/utils/getInstanceMetadataEndpoint.js",".././node_modules/@smithy/credential-provider-imds/dist-cjs/utils/staticStabilityProvider.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/EventStreamCodec.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/HeaderMarshaller.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/Int64.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/Message.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/MessageDecoderStream.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/MessageEncoderStream.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/SmithyMessageDecoderStream.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/SmithyMessageEncoderStream.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/index.js",".././node_modules/@smithy/eventstream-codec/dist-cjs/splitMessage.js",".././node_modules/@smithy/hash-node/dist-cjs/index.js",".././node_modules/@smithy/is-array-buffer/dist-cjs/index.js",".././node_modules/@smithy/middleware-content-length/dist-cjs/index.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/createConfigValueProvider.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/getEndpointFromConfig.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/getEndpointFromInstructions.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/getEndpointUrlConfig.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/index.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/adaptors/toEndpointV1.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/endpointMiddleware.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/getEndpointPlugin.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/index.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/resolveEndpointConfig.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/service-customizations/index.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/service-customizations/s3.js",".././node_modules/@smithy/middleware-endpoint/dist-cjs/types.js",".././node_modules/@smithy/middleware-retry/dist-cjs/AdaptiveRetryStrategy.js",".././node_modules/@smithy/middleware-retry/dist-cjs/StandardRetryStrategy.js",".././node_modules/@smithy/middleware-retry/dist-cjs/configurations.js",".././node_modules/@smithy/middleware-retry/dist-cjs/defaultRetryQuota.js",".././node_modules/@smithy/middleware-retry/dist-cjs/delayDecider.js",".././node_modules/@smithy/middleware-retry/dist-cjs/index.js",".././node_modules/@smithy/middleware-retry/dist-cjs/omitRetryHeadersMiddleware.js",".././node_modules/@smithy/middleware-retry/dist-cjs/retryDecider.js",".././node_modules/@smithy/middleware-retry/dist-cjs/retryMiddleware.js",".././node_modules/@smithy/middleware-retry/dist-cjs/util.js",".././node_modules/@smithy/middleware-serde/dist-cjs/deserializerMiddleware.js",".././node_modules/@smithy/middleware-serde/dist-cjs/index.js",".././node_modules/@smithy/middleware-serde/dist-cjs/serdePlugin.js",".././node_modules/@smithy/middleware-serde/dist-cjs/serializerMiddleware.js",".././node_modules/@smithy/middleware-stack/dist-cjs/MiddlewareStack.js",".././node_modules/@smithy/middleware-stack/dist-cjs/index.js",".././node_modules/@smithy/node-config-provider/dist-cjs/configLoader.js",".././node_modules/@smithy/node-config-provider/dist-cjs/fromEnv.js",".././node_modules/@smithy/node-config-provider/dist-cjs/fromSharedConfigFiles.js",".././node_modules/@smithy/node-config-provider/dist-cjs/fromStatic.js",".././node_modules/@smithy/node-config-provider/dist-cjs/index.js",".././node_modules/@smithy/node-http-handler/dist-cjs/constants.js",".././node_modules/@smithy/node-http-handler/dist-cjs/get-transformed-headers.js",".././node_modules/@smithy/node-http-handler/dist-cjs/index.js",".././node_modules/@smithy/node-http-handler/dist-cjs/node-http-handler.js",".././node_modules/@smithy/node-http-handler/dist-cjs/node-http2-connection-manager.js",".././node_modules/@smithy/node-http-handler/dist-cjs/node-http2-connection-pool.js",".././node_modules/@smithy/node-http-handler/dist-cjs/node-http2-handler.js",".././node_modules/@smithy/node-http-handler/dist-cjs/set-connection-timeout.js",".././node_modules/@smithy/node-http-handler/dist-cjs/set-socket-keep-alive.js",".././node_modules/@smithy/node-http-handler/dist-cjs/set-socket-timeout.js",".././node_modules/@smithy/node-http-handler/dist-cjs/stream-collector/collector.js",".././node_modules/@smithy/node-http-handler/dist-cjs/stream-collector/index.js",".././node_modules/@smithy/node-http-handler/dist-cjs/write-request-body.js",".././node_modules/@smithy/property-provider/dist-cjs/CredentialsProviderError.js",".././node_modules/@smithy/property-provider/dist-cjs/ProviderError.js",".././node_modules/@smithy/property-provider/dist-cjs/TokenProviderError.js",".././node_modules/@smithy/property-provider/dist-cjs/chain.js",".././node_modules/@smithy/property-provider/dist-cjs/fromStatic.js",".././node_modules/@smithy/property-provider/dist-cjs/index.js",".././node_modules/@smithy/property-provider/dist-cjs/memoize.js",".././node_modules/@smithy/protocol-http/dist-cjs/Field.js",".././node_modules/@smithy/protocol-http/dist-cjs/Fields.js",".././node_modules/@smithy/protocol-http/dist-cjs/extensions/httpExtensionConfiguration.js",".././node_modules/@smithy/protocol-http/dist-cjs/extensions/index.js",".././node_modules/@smithy/protocol-http/dist-cjs/httpHandler.js",".././node_modules/@smithy/protocol-http/dist-cjs/httpRequest.js",".././node_modules/@smithy/protocol-http/dist-cjs/httpResponse.js",".././node_modules/@smithy/protocol-http/dist-cjs/index.js",".././node_modules/@smithy/protocol-http/dist-cjs/isValidHostname.js",".././node_modules/@smithy/protocol-http/dist-cjs/types.js",".././node_modules/@smithy/querystring-builder/dist-cjs/index.js",".././node_modules/@smithy/querystring-parser/dist-cjs/index.js",".././node_modules/@smithy/service-error-classification/dist-cjs/constants.js",".././node_modules/@smithy/service-error-classification/dist-cjs/index.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getConfigData.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getConfigFilepath.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getCredentialsFilepath.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getHomeDir.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getProfileName.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getSSOTokenFilepath.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getSSOTokenFromFile.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/getSsoSessionData.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/index.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/loadSharedConfigFiles.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/loadSsoSessionData.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/mergeConfigFiles.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/parseIni.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/parseKnownFiles.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/slurpFile.js",".././node_modules/@smithy/shared-ini-file-loader/dist-cjs/types.js",".././node_modules/@smithy/signature-v4/dist-cjs/SignatureV4.js",".././node_modules/@smithy/signature-v4/dist-cjs/cloneRequest.js",".././node_modules/@smithy/signature-v4/dist-cjs/constants.js",".././node_modules/@smithy/signature-v4/dist-cjs/credentialDerivation.js",".././node_modules/@smithy/signature-v4/dist-cjs/getCanonicalHeaders.js",".././node_modules/@smithy/signature-v4/dist-cjs/getCanonicalQuery.js",".././node_modules/@smithy/signature-v4/dist-cjs/getPayloadHash.js",".././node_modules/@smithy/signature-v4/dist-cjs/headerUtil.js",".././node_modules/@smithy/signature-v4/dist-cjs/index.js",".././node_modules/@smithy/signature-v4/dist-cjs/moveHeadersToQuery.js",".././node_modules/@smithy/signature-v4/dist-cjs/prepareRequest.js",".././node_modules/@smithy/signature-v4/dist-cjs/utilDate.js",".././node_modules/@smithy/smithy-client/dist-cjs/NoOpLogger.js",".././node_modules/@smithy/smithy-client/dist-cjs/client.js",".././node_modules/@smithy/smithy-client/dist-cjs/collect-stream-body.js",".././node_modules/@smithy/smithy-client/dist-cjs/command.js",".././node_modules/@smithy/smithy-client/dist-cjs/constants.js",".././node_modules/@smithy/smithy-client/dist-cjs/create-aggregated-client.js",".././node_modules/@smithy/smithy-client/dist-cjs/date-utils.js",".././node_modules/@smithy/smithy-client/dist-cjs/default-error-handler.js",".././node_modules/@smithy/smithy-client/dist-cjs/defaults-mode.js",".././node_modules/@smithy/smithy-client/dist-cjs/emitWarningIfUnsupportedVersion.js",".././node_modules/@smithy/smithy-client/dist-cjs/exceptions.js",".././node_modules/@smithy/smithy-client/dist-cjs/extended-encode-uri-component.js",".././node_modules/@smithy/smithy-client/dist-cjs/extensions/checksum.js",".././node_modules/@smithy/smithy-client/dist-cjs/extensions/defaultExtensionConfiguration.js",".././node_modules/@smithy/smithy-client/dist-cjs/extensions/index.js",".././node_modules/@smithy/smithy-client/dist-cjs/extensions/retry.js",".././node_modules/@smithy/smithy-client/dist-cjs/get-array-if-single-item.js",".././node_modules/@smithy/smithy-client/dist-cjs/get-value-from-text-node.js",".././node_modules/@smithy/smithy-client/dist-cjs/index.js",".././node_modules/@smithy/smithy-client/dist-cjs/lazy-json.js",".././node_modules/@smithy/smithy-client/dist-cjs/object-mapping.js",".././node_modules/@smithy/smithy-client/dist-cjs/parse-utils.js",".././node_modules/@smithy/smithy-client/dist-cjs/resolve-path.js",".././node_modules/@smithy/smithy-client/dist-cjs/ser-utils.js",".././node_modules/@smithy/smithy-client/dist-cjs/serde-json.js",".././node_modules/@smithy/smithy-client/dist-cjs/split-every.js",".././node_modules/@smithy/types/dist-cjs/abort.js",".././node_modules/@smithy/types/dist-cjs/auth/HttpApiKeyAuth.js",".././node_modules/@smithy/types/dist-cjs/auth/HttpAuthScheme.js",".././node_modules/@smithy/types/dist-cjs/auth/HttpAuthSchemeProvider.js",".././node_modules/@smithy/types/dist-cjs/auth/HttpSigner.js",".././node_modules/@smithy/types/dist-cjs/auth/IdentityProviderConfig.js",".././node_modules/@smithy/types/dist-cjs/auth/auth.js",".././node_modules/@smithy/types/dist-cjs/auth/index.js",".././node_modules/@smithy/types/dist-cjs/blob/blob-payload-input-types.js",".././node_modules/@smithy/types/dist-cjs/checksum.js",".././node_modules/@smithy/types/dist-cjs/client.js",".././node_modules/@smithy/types/dist-cjs/command.js",".././node_modules/@smithy/types/dist-cjs/connection/config.js",".././node_modules/@smithy/types/dist-cjs/connection/index.js",".././node_modules/@smithy/types/dist-cjs/connection/manager.js",".././node_modules/@smithy/types/dist-cjs/connection/pool.js",".././node_modules/@smithy/types/dist-cjs/crypto.js",".././node_modules/@smithy/types/dist-cjs/encode.js",".././node_modules/@smithy/types/dist-cjs/endpoint.js",".././node_modules/@smithy/types/dist-cjs/endpoints/EndpointRuleObject.js",".././node_modules/@smithy/types/dist-cjs/endpoints/ErrorRuleObject.js",".././node_modules/@smithy/types/dist-cjs/endpoints/RuleSetObject.js",".././node_modules/@smithy/types/dist-cjs/endpoints/TreeRuleObject.js",".././node_modules/@smithy/types/dist-cjs/endpoints/index.js",".././node_modules/@smithy/types/dist-cjs/endpoints/shared.js",".././node_modules/@smithy/types/dist-cjs/eventStream.js",".././node_modules/@smithy/types/dist-cjs/extensions/checksum.js",".././node_modules/@smithy/types/dist-cjs/extensions/defaultClientConfiguration.js",".././node_modules/@smithy/types/dist-cjs/extensions/defaultExtensionConfiguration.js",".././node_modules/@smithy/types/dist-cjs/extensions/index.js",".././node_modules/@smithy/types/dist-cjs/http.js",".././node_modules/@smithy/types/dist-cjs/identity/apiKeyIdentity.js",".././node_modules/@smithy/types/dist-cjs/identity/awsCredentialIdentity.js",".././node_modules/@smithy/types/dist-cjs/identity/identity.js",".././node_modules/@smithy/types/dist-cjs/identity/index.js",".././node_modules/@smithy/types/dist-cjs/identity/tokenIdentity.js",".././node_modules/@smithy/types/dist-cjs/index.js",".././node_modules/@smithy/types/dist-cjs/logger.js",".././node_modules/@smithy/types/dist-cjs/middleware.js",".././node_modules/@smithy/types/dist-cjs/pagination.js",".././node_modules/@smithy/types/dist-cjs/profile.js",".././node_modules/@smithy/types/dist-cjs/response.js",".././node_modules/@smithy/types/dist-cjs/retry.js",".././node_modules/@smithy/types/dist-cjs/serde.js",".././node_modules/@smithy/types/dist-cjs/shapes.js",".././node_modules/@smithy/types/dist-cjs/signature.js",".././node_modules/@smithy/types/dist-cjs/stream.js",".././node_modules/@smithy/types/dist-cjs/streaming-payload/streaming-blob-common-types.js",".././node_modules/@smithy/types/dist-cjs/streaming-payload/streaming-blob-payload-input-types.js",".././node_modules/@smithy/types/dist-cjs/streaming-payload/streaming-blob-payload-output-types.js",".././node_modules/@smithy/types/dist-cjs/transfer.js",".././node_modules/@smithy/types/dist-cjs/transform/client-payload-blob-type-narrow.js",".././node_modules/@smithy/types/dist-cjs/transform/type-transform.js",".././node_modules/@smithy/types/dist-cjs/uri.js",".././node_modules/@smithy/types/dist-cjs/util.js",".././node_modules/@smithy/types/dist-cjs/waiter.js",".././node_modules/@smithy/url-parser/dist-cjs/index.js",".././node_modules/@smithy/util-base64/dist-cjs/fromBase64.js",".././node_modules/@smithy/util-base64/dist-cjs/index.js",".././node_modules/@smithy/util-base64/dist-cjs/toBase64.js",".././node_modules/@smithy/util-body-length-node/dist-cjs/calculateBodyLength.js",".././node_modules/@smithy/util-body-length-node/dist-cjs/index.js",".././node_modules/@smithy/util-buffer-from/dist-cjs/index.js",".././node_modules/@smithy/util-config-provider/dist-cjs/booleanSelector.js",".././node_modules/@smithy/util-config-provider/dist-cjs/index.js",".././node_modules/@smithy/util-defaults-mode-node/dist-cjs/constants.js",".././node_modules/@smithy/util-defaults-mode-node/dist-cjs/defaultsModeConfig.js",".././node_modules/@smithy/util-defaults-mode-node/dist-cjs/index.js",".././node_modules/@smithy/util-defaults-mode-node/dist-cjs/resolveDefaultsModeConfig.js",".././node_modules/@smithy/util-endpoints/dist-cjs/debug/debugId.js",".././node_modules/@smithy/util-endpoints/dist-cjs/debug/index.js",".././node_modules/@smithy/util-endpoints/dist-cjs/debug/toDebugString.js",".././node_modules/@smithy/util-endpoints/dist-cjs/index.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/booleanEquals.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/getAttr.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/getAttrPathList.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/index.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/isIpAddress.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/isSet.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/isValidHostLabel.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/not.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/parseURL.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/stringEquals.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/substring.js",".././node_modules/@smithy/util-endpoints/dist-cjs/lib/uriEncode.js",".././node_modules/@smithy/util-endpoints/dist-cjs/resolveEndpoint.js",".././node_modules/@smithy/util-endpoints/dist-cjs/types/EndpointError.js",".././node_modules/@smithy/util-endpoints/dist-cjs/types/EndpointFunctions.js",".././node_modules/@smithy/util-endpoints/dist-cjs/types/EndpointRuleObject.js",".././node_modules/@smithy/util-endpoints/dist-cjs/types/ErrorRuleObject.js",".././node_modules/@smithy/util-endpoints/dist-cjs/types/RuleSetObject.js",".././node_modules/@smithy/util-endpoints/dist-cjs/types/TreeRuleObject.js",".././node_modules/@smithy/util-endpoints/dist-cjs/types/index.js",".././node_modules/@smithy/util-endpoints/dist-cjs/types/shared.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/callFunction.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/customEndpointFunctions.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/endpointFunctions.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/evaluateCondition.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/evaluateConditions.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/evaluateEndpointRule.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/evaluateErrorRule.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/evaluateExpression.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/evaluateRules.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/evaluateTemplate.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/evaluateTreeRule.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/getEndpointHeaders.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/getEndpointProperties.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/getEndpointProperty.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/getEndpointUrl.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/getReferenceValue.js",".././node_modules/@smithy/util-endpoints/dist-cjs/utils/index.js",".././node_modules/@smithy/util-hex-encoding/dist-cjs/index.js",".././node_modules/@smithy/util-middleware/dist-cjs/getSmithyContext.js",".././node_modules/@smithy/util-middleware/dist-cjs/index.js",".././node_modules/@smithy/util-middleware/dist-cjs/normalizeProvider.js",".././node_modules/@smithy/util-retry/dist-cjs/AdaptiveRetryStrategy.js",".././node_modules/@smithy/util-retry/dist-cjs/ConfiguredRetryStrategy.js",".././node_modules/@smithy/util-retry/dist-cjs/DefaultRateLimiter.js",".././node_modules/@smithy/util-retry/dist-cjs/StandardRetryStrategy.js",".././node_modules/@smithy/util-retry/dist-cjs/config.js",".././node_modules/@smithy/util-retry/dist-cjs/constants.js",".././node_modules/@smithy/util-retry/dist-cjs/defaultRetryBackoffStrategy.js",".././node_modules/@smithy/util-retry/dist-cjs/defaultRetryToken.js",".././node_modules/@smithy/util-retry/dist-cjs/index.js",".././node_modules/@smithy/util-retry/dist-cjs/types.js",".././node_modules/@smithy/util-stream/dist-cjs/blob/Uint8ArrayBlobAdapter.js",".././node_modules/@smithy/util-stream/dist-cjs/blob/transforms.js",".././node_modules/@smithy/util-stream/dist-cjs/getAwsChunkedEncodingStream.js",".././node_modules/@smithy/util-stream/dist-cjs/index.js",".././node_modules/@smithy/util-stream/dist-cjs/sdk-stream-mixin.js",".././node_modules/@smithy/util-uri-escape/dist-cjs/escape-uri-path.js",".././node_modules/@smithy/util-uri-escape/dist-cjs/escape-uri.js",".././node_modules/@smithy/util-uri-escape/dist-cjs/index.js",".././node_modules/@smithy/util-utf8/dist-cjs/fromUtf8.js",".././node_modules/@smithy/util-utf8/dist-cjs/index.js",".././node_modules/@smithy/util-utf8/dist-cjs/toUint8Array.js",".././node_modules/@smithy/util-utf8/dist-cjs/toUtf8.js",".././node_modules/@smithy/util-waiter/dist-cjs/createWaiter.js",".././node_modules/@smithy/util-waiter/dist-cjs/index.js",".././node_modules/@smithy/util-waiter/dist-cjs/poller.js",".././node_modules/@smithy/util-waiter/dist-cjs/utils/index.js",".././node_modules/@smithy/util-waiter/dist-cjs/utils/sleep.js",".././node_modules/@smithy/util-waiter/dist-cjs/utils/validate.js",".././node_modules/@smithy/util-waiter/dist-cjs/waiter.js",".././node_modules/ansi-regex/index.js",".././node_modules/ansi-styles/index.js",".././node_modules/astral-regex/index.js",".././node_modules/before-after-hook/index.js",".././node_modules/before-after-hook/lib/add.js",".././node_modules/before-after-hook/lib/register.js",".././node_modules/before-after-hook/lib/remove.js",".././node_modules/chalk/source/index.js",".././node_modules/chalk/source/templates.js",".././node_modules/chalk/source/util.js",".././node_modules/color-convert/conversions.js",".././node_modules/color-convert/index.js",".././node_modules/color-convert/route.js",".././node_modules/color-name/index.js",".././node_modules/deprecation/dist-node/index.js",".././node_modules/diff/lib/convert/dmp.js",".././node_modules/diff/lib/convert/xml.js",".././node_modules/diff/lib/diff/array.js",".././node_modules/diff/lib/diff/base.js",".././node_modules/diff/lib/diff/character.js",".././node_modules/diff/lib/diff/css.js",".././node_modules/diff/lib/diff/json.js",".././node_modules/diff/lib/diff/line.js",".././node_modules/diff/lib/diff/sentence.js",".././node_modules/diff/lib/diff/word.js",".././node_modules/diff/lib/index.js",".././node_modules/diff/lib/patch/apply.js",".././node_modules/diff/lib/patch/create.js",".././node_modules/diff/lib/patch/merge.js",".././node_modules/diff/lib/patch/parse.js",".././node_modules/diff/lib/util/array.js",".././node_modules/diff/lib/util/distance-iterator.js",".././node_modules/diff/lib/util/params.js",".././node_modules/emoji-regex/index.js",".././node_modules/fast-deep-equal/index.js",".././node_modules/fast-xml-parser/src/fxp.js",".././node_modules/fast-xml-parser/src/util.js",".././node_modules/fast-xml-parser/src/validator.js",".././node_modules/fast-xml-parser/src/xmlbuilder/json2xml.js",".././node_modules/fast-xml-parser/src/xmlbuilder/orderedJs2Xml.js",".././node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js",".././node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js",".././node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js",".././node_modules/fast-xml-parser/src/xmlparser/XMLParser.js",".././node_modules/fast-xml-parser/src/xmlparser/node2json.js",".././node_modules/fast-xml-parser/src/xmlparser/xmlNode.js",".././node_modules/fs-extra/lib/copy/copy-sync.js",".././node_modules/fs-extra/lib/copy/copy.js",".././node_modules/fs-extra/lib/copy/index.js",".././node_modules/fs-extra/lib/empty/index.js",".././node_modules/fs-extra/lib/ensure/file.js",".././node_modules/fs-extra/lib/ensure/index.js",".././node_modules/fs-extra/lib/ensure/link.js",".././node_modules/fs-extra/lib/ensure/symlink-paths.js",".././node_modules/fs-extra/lib/ensure/symlink-type.js",".././node_modules/fs-extra/lib/ensure/symlink.js",".././node_modules/fs-extra/lib/fs/index.js",".././node_modules/fs-extra/lib/index.js",".././node_modules/fs-extra/lib/json/index.js",".././node_modules/fs-extra/lib/json/jsonfile.js",".././node_modules/fs-extra/lib/json/output-json-sync.js",".././node_modules/fs-extra/lib/json/output-json.js",".././node_modules/fs-extra/lib/mkdirs/index.js",".././node_modules/fs-extra/lib/mkdirs/make-dir.js",".././node_modules/fs-extra/lib/mkdirs/utils.js",".././node_modules/fs-extra/lib/move/index.js",".././node_modules/fs-extra/lib/move/move-sync.js",".././node_modules/fs-extra/lib/move/move.js",".././node_modules/fs-extra/lib/output-file/index.js",".././node_modules/fs-extra/lib/path-exists/index.js",".././node_modules/fs-extra/lib/remove/index.js",".././node_modules/fs-extra/lib/util/stat.js",".././node_modules/fs-extra/lib/util/utimes.js",".././node_modules/graceful-fs/clone.js",".././node_modules/graceful-fs/graceful-fs.js",".././node_modules/graceful-fs/legacy-streams.js",".././node_modules/graceful-fs/polyfills.js",".././node_modules/has-flag/index.js",".././node_modules/is-fullwidth-code-point/index.js",".././node_modules/is-plain-object/dist/is-plain-object.js",".././node_modules/jsonfile/index.js",".././node_modules/jsonfile/utils.js",".././node_modules/lodash.truncate/index.js",".././node_modules/once/once.js",".././node_modules/slice-ansi/index.js",".././node_modules/string-width/index.js",".././node_modules/strip-ansi/index.js",".././node_modules/strnum/strnum.js",".././node_modules/supports-color/index.js",".././node_modules/table/dist/src/alignSpanningCell.js",".././node_modules/table/dist/src/alignString.js",".././node_modules/table/dist/src/alignTableData.js",".././node_modules/table/dist/src/calculateCellHeight.js",".././node_modules/table/dist/src/calculateMaximumColumnWidths.js",".././node_modules/table/dist/src/calculateOutputColumnWidths.js",".././node_modules/table/dist/src/calculateRowHeights.js",".././node_modules/table/dist/src/calculateSpanningCellWidth.js",".././node_modules/table/dist/src/createStream.js",".././node_modules/table/dist/src/drawBorder.js",".././node_modules/table/dist/src/drawContent.js",".././node_modules/table/dist/src/drawRow.js",".././node_modules/table/dist/src/drawTable.js",".././node_modules/table/dist/src/generated/validators.js",".././node_modules/table/dist/src/getBorderCharacters.js",".././node_modules/table/dist/src/index.js",".././node_modules/table/dist/src/injectHeaderConfig.js",".././node_modules/table/dist/src/makeRangeConfig.js",".././node_modules/table/dist/src/makeStreamConfig.js",".././node_modules/table/dist/src/makeTableConfig.js",".././node_modules/table/dist/src/mapDataUsingRowHeights.js",".././node_modules/table/dist/src/padTableData.js",".././node_modules/table/dist/src/spanningCellManager.js",".././node_modules/table/dist/src/stringifyTableData.js",".././node_modules/table/dist/src/table.js",".././node_modules/table/dist/src/truncateTableData.js",".././node_modules/table/dist/src/types/api.js",".././node_modules/table/dist/src/utils.js",".././node_modules/table/dist/src/validateConfig.js",".././node_modules/table/dist/src/validateSpanningCellConfig.js",".././node_modules/table/dist/src/validateTableData.js",".././node_modules/table/dist/src/wrapCell.js",".././node_modules/table/dist/src/wrapString.js",".././node_modules/table/dist/src/wrapWord.js",".././node_modules/table/node_modules/ajv/dist/runtime/equal.js",".././node_modules/tslib/tslib.js",".././node_modules/tunnel/index.js",".././node_modules/tunnel/lib/tunnel.js",".././node_modules/undici/index.js",".././node_modules/undici/lib/agent.js",".././node_modules/undici/lib/api/abort-signal.js",".././node_modules/undici/lib/api/api-connect.js",".././node_modules/undici/lib/api/api-pipeline.js",".././node_modules/undici/lib/api/api-request.js",".././node_modules/undici/lib/api/api-stream.js",".././node_modules/undici/lib/api/api-upgrade.js",".././node_modules/undici/lib/api/index.js",".././node_modules/undici/lib/api/readable.js",".././node_modules/undici/lib/api/util.js",".././node_modules/undici/lib/balanced-pool.js",".././node_modules/undici/lib/cache/cache.js",".././node_modules/undici/lib/cache/cachestorage.js",".././node_modules/undici/lib/cache/symbols.js",".././node_modules/undici/lib/cache/util.js",".././node_modules/undici/lib/client.js",".././node_modules/undici/lib/compat/dispatcher-weakref.js",".././node_modules/undici/lib/cookies/constants.js",".././node_modules/undici/lib/cookies/index.js",".././node_modules/undici/lib/cookies/parse.js",".././node_modules/undici/lib/cookies/util.js",".././node_modules/undici/lib/core/connect.js",".././node_modules/undici/lib/core/errors.js",".././node_modules/undici/lib/core/request.js",".././node_modules/undici/lib/core/symbols.js",".././node_modules/undici/lib/core/util.js",".././node_modules/undici/lib/dispatcher-base.js",".././node_modules/undici/lib/dispatcher.js",".././node_modules/undici/lib/fetch/body.js",".././node_modules/undici/lib/fetch/constants.js",".././node_modules/undici/lib/fetch/dataURL.js",".././node_modules/undici/lib/fetch/file.js",".././node_modules/undici/lib/fetch/formdata.js",".././node_modules/undici/lib/fetch/global.js",".././node_modules/undici/lib/fetch/headers.js",".././node_modules/undici/lib/fetch/index.js",".././node_modules/undici/lib/fetch/request.js",".././node_modules/undici/lib/fetch/response.js",".././node_modules/undici/lib/fetch/symbols.js",".././node_modules/undici/lib/fetch/util.js",".././node_modules/undici/lib/fetch/webidl.js",".././node_modules/undici/lib/fileapi/encoding.js",".././node_modules/undici/lib/fileapi/filereader.js",".././node_modules/undici/lib/fileapi/progressevent.js",".././node_modules/undici/lib/fileapi/symbols.js",".././node_modules/undici/lib/fileapi/util.js",".././node_modules/undici/lib/global.js",".././node_modules/undici/lib/handler/DecoratorHandler.js",".././node_modules/undici/lib/handler/RedirectHandler.js",".././node_modules/undici/lib/interceptor/redirectInterceptor.js",".././node_modules/undici/lib/llhttp/constants.js",".././node_modules/undici/lib/llhttp/llhttp-wasm.js",".././node_modules/undici/lib/llhttp/llhttp_simd-wasm.js",".././node_modules/undici/lib/llhttp/utils.js",".././node_modules/undici/lib/mock/mock-agent.js",".././node_modules/undici/lib/mock/mock-client.js",".././node_modules/undici/lib/mock/mock-errors.js",".././node_modules/undici/lib/mock/mock-interceptor.js",".././node_modules/undici/lib/mock/mock-pool.js",".././node_modules/undici/lib/mock/mock-symbols.js",".././node_modules/undici/lib/mock/mock-utils.js",".././node_modules/undici/lib/mock/pending-interceptors-formatter.js",".././node_modules/undici/lib/mock/pluralizer.js",".././node_modules/undici/lib/node/fixed-queue.js",".././node_modules/undici/lib/pool-base.js",".././node_modules/undici/lib/pool-stats.js",".././node_modules/undici/lib/pool.js",".././node_modules/undici/lib/proxy-agent.js",".././node_modules/undici/lib/timers.js",".././node_modules/undici/lib/websocket/connection.js",".././node_modules/undici/lib/websocket/constants.js",".././node_modules/undici/lib/websocket/events.js",".././node_modules/undici/lib/websocket/frame.js",".././node_modules/undici/lib/websocket/receiver.js",".././node_modules/undici/lib/websocket/symbols.js",".././node_modules/undici/lib/websocket/util.js",".././node_modules/undici/lib/websocket/websocket.js",".././node_modules/universal-user-agent/dist-node/index.js",".././node_modules/universalify/index.js",".././node_modules/uuid/dist/index.js",".././node_modules/uuid/dist/md5.js",".././node_modules/uuid/dist/nil.js",".././node_modules/uuid/dist/parse.js",".././node_modules/uuid/dist/regex.js",".././node_modules/uuid/dist/rng.js",".././node_modules/uuid/dist/sha1.js",".././node_modules/uuid/dist/stringify.js",".././node_modules/uuid/dist/v1.js",".././node_modules/uuid/dist/v3.js",".././node_modules/uuid/dist/v35.js",".././node_modules/uuid/dist/v4.js",".././node_modules/uuid/dist/v5.js",".././node_modules/uuid/dist/validate.js",".././node_modules/uuid/dist/version.js",".././node_modules/wrappy/wrappy.js","../external node-commonjs \"assert\"","../external node-commonjs \"async_hooks\"","../external node-commonjs \"buffer\"","../external node-commonjs \"child_process\"","../external node-commonjs \"console\"","../external node-commonjs \"constants\"","../external node-commonjs \"crypto\"","../external node-commonjs \"diagnostics_channel\"","../external node-commonjs \"events\"","../external node-commonjs \"fs\"","../external node-commonjs \"fs/promises\"","../external node-commonjs \"http\"","../external node-commonjs \"http2\"","../external node-commonjs \"https\"","../external node-commonjs \"net\"","../external node-commonjs \"node:events\"","../external node-commonjs \"node:fs\"","../external node-commonjs \"node:path\"","../external node-commonjs \"node:stream\"","../external node-commonjs \"node:util\"","../external node-commonjs \"node:zlib\"","../external node-commonjs \"os\"","../external node-commonjs \"path\"","../external node-commonjs \"perf_hooks\"","../external node-commonjs \"process\"","../external node-commonjs \"querystring\"","../external node-commonjs \"stream\"","../external node-commonjs \"stream/web\"","../external node-commonjs \"string_decoder\"","../external node-commonjs \"tls\"","../external node-commonjs \"tty\"","../external node-commonjs \"url\"","../external node-commonjs \"util\"","../external node-commonjs \"util/types\"","../external node-commonjs \"worker_threads\"","../external node-commonjs \"zlib\"",".././node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js",".././node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js",".././node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js",".././node_modules/@fastify/busboy/deps/streamsearch/sbmh.js",".././node_modules/@fastify/busboy/lib/main.js",".././node_modules/@fastify/busboy/lib/types/multipart.js",".././node_modules/@fastify/busboy/lib/types/urlencoded.js",".././node_modules/@fastify/busboy/lib/utils/Decoder.js",".././node_modules/@fastify/busboy/lib/utils/basename.js",".././node_modules/@fastify/busboy/lib/utils/decodeText.js",".././node_modules/@fastify/busboy/lib/utils/getLimit.js",".././node_modules/@fastify/busboy/lib/utils/parseParams.js","../webpack/bootstrap","../webpack/runtime/node module decorator","../webpack/runtime/compat","../webpack/before-startup","../webpack/startup","../webpack/after-startup"],"sourcesContent":["\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.run = void 0;\nconst core_1 = require(\"@actions/core\");\nconst github = __importStar(require(\"@actions/github\"));\nconst assembly_1 = require(\"./assembly\");\nconst comment_1 = require(\"./comment\");\nconst stage_processor_1 = require(\"./stage-processor\");\nasync function run() {\n const inputs = {\n allowedDestroyTypes: (0, core_1.getInput)('allowedDestroyTypes').split(','),\n failOnDestructiveChanges: (0, core_1.getBooleanInput)('failOnDestructiveChanges'),\n githubToken: (0, core_1.getInput)('githubToken'),\n };\n const octokit = github.getOctokit(inputs.githubToken);\n const context = github.context;\n try {\n const assembly = assembly_1.AssemblyManifestReader.fromPath('cdk.out');\n let stages = assembly.stages;\n if (!stages.length) {\n stages = [{\n name: 'DefaultStage',\n stacks: assembly.stacks,\n }];\n }\n const comments = new comment_1.Comments(octokit, context);\n const processor = new stage_processor_1.StageProcessor(stages, inputs.allowedDestroyTypes);\n try {\n await processor.processStages();\n }\n catch (e) {\n console.error('Error running process stages: ', e);\n throw e;\n }\n try {\n await processor.commentStages(comments);\n }\n catch (e) {\n console.error('Error commenting stages: ', e);\n throw e;\n }\n if (processor.hasDestructiveChanges && inputs.failOnDestructiveChanges) {\n throw new Error('There are destructive changes! See PR comment for details.');\n }\n }\n catch (e) {\n console.error('Error performing diff: ', e);\n throw e;\n }\n return;\n}\nexports.run = run;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUEwRDtBQUMxRCx3REFBMEM7QUFDMUMseUNBQW9EO0FBQ3BELHVDQUFxQztBQUVyQyx1REFBbUQ7QUFFNUMsS0FBSyxVQUFVLEdBQUc7SUFDdkIsTUFBTSxNQUFNLEdBQVc7UUFDckIsbUJBQW1CLEVBQUUsSUFBQSxlQUFRLEVBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQy9ELHdCQUF3QixFQUFFLElBQUEsc0JBQWUsRUFBQywwQkFBMEIsQ0FBQztRQUNyRSxXQUFXLEVBQUUsSUFBQSxlQUFRLEVBQUMsYUFBYSxDQUFDO0tBQ3JDLENBQUM7SUFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQy9CLElBQUk7UUFDRixNQUFNLFFBQVEsR0FBRyxpQ0FBc0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUQsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNsQixNQUFNLEdBQUcsQ0FBQztvQkFDUixJQUFJLEVBQUUsY0FBYztvQkFDcEIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2lCQUN4QixDQUFDLENBQUM7U0FDSjtRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksa0JBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxnQ0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN6RSxJQUFJO1lBQ0YsTUFBTSxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDakM7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLENBQUM7U0FDVDtRQUVELElBQUk7WUFDRixNQUFNLFNBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7U0FFekM7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLENBQUM7U0FDVDtRQUVELElBQUksU0FBUyxDQUFDLHFCQUFxQixJQUFJLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRTtZQUN0RSxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7U0FDL0U7S0FDRjtJQUFDLE9BQU8sQ0FBTSxFQUFFO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsQ0FBQztLQUNUO0lBQ0QsT0FBTztBQUNULENBQUM7QUExQ0Qsa0JBMENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0SW5wdXQsIGdldEJvb2xlYW5JbnB1dCB9IGZyb20gJ0BhY3Rpb25zL2NvcmUnO1xuaW1wb3J0ICogYXMgZ2l0aHViIGZyb20gJ0BhY3Rpb25zL2dpdGh1Yic7XG5pbXBvcnQgeyBBc3NlbWJseU1hbmlmZXN0UmVhZGVyIH0gZnJvbSAnLi9hc3NlbWJseSc7XG5pbXBvcnQgeyBDb21tZW50cyB9IGZyb20gJy4vY29tbWVudCc7XG5pbXBvcnQgeyBJbnB1dHMgfSBmcm9tICcuL2lucHV0cyc7XG5pbXBvcnQgeyBTdGFnZVByb2Nlc3NvciB9IGZyb20gJy4vc3RhZ2UtcHJvY2Vzc29yJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgY29uc3QgaW5wdXRzOiBJbnB1dHMgPSB7XG4gICAgYWxsb3dlZERlc3Ryb3lUeXBlczogZ2V0SW5wdXQoJ2FsbG93ZWREZXN0cm95VHlwZXMnKS5zcGxpdCgnLCcpLFxuICAgIGZhaWxPbkRlc3RydWN0aXZlQ2hhbmdlczogZ2V0Qm9vbGVhbklucHV0KCdmYWlsT25EZXN0cnVjdGl2ZUNoYW5nZXMnKSxcbiAgICBnaXRodWJUb2tlbjogZ2V0SW5wdXQoJ2dpdGh1YlRva2VuJyksXG4gIH07XG4gIGNvbnN0IG9jdG9raXQgPSBnaXRodWIuZ2V0T2N0b2tpdChpbnB1dHMuZ2l0aHViVG9rZW4pO1xuICBjb25zdCBjb250ZXh0ID0gZ2l0aHViLmNvbnRleHQ7XG4gIHRyeSB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLmZyb21QYXRoKCdjZGsub3V0Jyk7XG4gICAgbGV0IHN0YWdlcyA9IGFzc2VtYmx5LnN0YWdlcztcbiAgICBpZiAoIXN0YWdlcy5sZW5ndGgpIHtcbiAgICAgIHN0YWdlcyA9IFt7XG4gICAgICAgIG5hbWU6ICdEZWZhdWx0U3RhZ2UnLFxuICAgICAgICBzdGFja3M6IGFzc2VtYmx5LnN0YWNrcyxcbiAgICAgIH1dO1xuICAgIH1cbiAgICBjb25zdCBjb21tZW50cyA9IG5ldyBDb21tZW50cyhvY3Rva2l0LCBjb250ZXh0KTtcbiAgICBjb25zdCBwcm9jZXNzb3IgPSBuZXcgU3RhZ2VQcm9jZXNzb3Ioc3RhZ2VzLCBpbnB1dHMuYWxsb3dlZERlc3Ryb3lUeXBlcyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHByb2Nlc3Nvci5wcm9jZXNzU3RhZ2VzKCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBydW5uaW5nIHByb2Nlc3Mgc3RhZ2VzOiAnLCBlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHByb2Nlc3Nvci5jb21tZW50U3RhZ2VzKGNvbW1lbnRzKTtcblxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY29tbWVudGluZyBzdGFnZXM6ICcsIGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzc29yLmhhc0Rlc3RydWN0aXZlQ2hhbmdlcyAmJiBpbnB1dHMuZmFpbE9uRGVzdHJ1Y3RpdmVDaGFuZ2VzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGFyZSBkZXN0cnVjdGl2ZSBjaGFuZ2VzISBTZWUgUFIgY29tbWVudCBmb3IgZGV0YWlscy4nKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBlcmZvcm1pbmcgZGlmZjogJywgZSk7XG4gICAgdGhyb3cgZTtcbiAgfVxuICByZXR1cm47XG59XG5cbiJdfQ==","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AssemblyManifestReader = void 0;\nconst path = __importStar(require(\"path\"));\nconst cloud_assembly_schema_1 = require(\"@aws-cdk/cloud-assembly-schema\");\nconst fs = __importStar(require(\"fs-extra\"));\n/**\n * Reads a Cloud Assembly manifest\n */\nclass AssemblyManifestReader {\n /**\n * Reads a Cloud Assembly manifest from a file\n */\n static fromFile(fileName) {\n try {\n const obj = cloud_assembly_schema_1.Manifest.loadAssemblyManifest(fileName);\n return new AssemblyManifestReader(path.dirname(fileName), obj);\n }\n catch (e) {\n throw new Error(`Cannot read integ manifest '${fileName}': ${e.message}`);\n }\n }\n /**\n * Reads a Cloud Assembly manifest from a file or a directory\n * If the given filePath is a directory then it will look for\n * a file within the directory with the DEFAULT_FILENAME\n */\n static fromPath(filePath) {\n let st;\n try {\n st = fs.statSync(filePath);\n }\n catch (e) {\n throw new Error(`Cannot read integ manifest at '${filePath}': ${e.message}`);\n }\n if (st.isDirectory()) {\n return AssemblyManifestReader.fromFile(path.join(filePath, AssemblyManifestReader.DEFAULT_FILENAME));\n }\n return AssemblyManifestReader.fromFile(filePath);\n }\n constructor(directory, manifest) {\n this.manifest = manifest;\n this.directory = directory;\n }\n /**\n * Get the stacks from the manifest\n * returns a map of artifactId to CloudFormation template\n */\n get stacks() {\n var _a, _b, _c;\n const stacks = [];\n for (const [artifactId, artifact] of Object.entries((_a = this.manifest.artifacts) !== null && _a !== void 0 ? _a : {})) {\n if (artifact.type !== cloud_assembly_schema_1.ArtifactType.AWS_CLOUDFORMATION_STACK) {\n continue;\n }\n const props = artifact.properties;\n const template = fs.readJSONSync(path.resolve(this.directory, props.templateFile));\n const env = (_b = artifact.environment) === null || _b === void 0 ? void 0 : _b.split(/\\/\\/?/);\n let region = env && env.length === 3 ? env[2] : undefined;\n if (region === 'unknown-region') {\n region = undefined;\n }\n stacks.push({\n content: template,\n region,\n lookupRole: props.lookupRole,\n name: (_c = props.stackName) !== null && _c !== void 0 ? _c : artifactId,\n });\n }\n return stacks;\n }\n /**\n * Get the stages in the assembly\n */\n get stages() {\n var _a, _b;\n const stages = [];\n for (const [artifactId, artifact] of Object.entries((_a = this.manifest.artifacts) !== null && _a !== void 0 ? _a : {})) {\n if (artifact.type !== cloud_assembly_schema_1.ArtifactType.NESTED_CLOUD_ASSEMBLY) {\n continue;\n }\n const props = artifact.properties;\n const nestedAssembly = AssemblyManifestReader.fromPath(path.join(this.directory, props.directoryName));\n stages.push({\n name: (_b = props.displayName) !== null && _b !== void 0 ? _b : artifactId,\n stacks: nestedAssembly.stacks,\n });\n }\n return stages;\n }\n}\nexports.AssemblyManifestReader = AssemblyManifestReader;\nAssemblyManifestReader.DEFAULT_FILENAME = 'manifest.json';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXNzZW1ibHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsMEVBQTBLO0FBQzFLLDZDQUErQjtBQThDL0I7O0dBRUc7QUFDSCxNQUFhLHNCQUFzQjtJQUdqQzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBZ0I7UUFDckMsSUFBSTtZQUNGLE1BQU0sR0FBRyxHQUFHLGdDQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEQsT0FBTyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FFaEU7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLFFBQVEsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUMzRTtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFnQjtRQUNyQyxJQUFJLEVBQUUsQ0FBQztRQUNQLElBQUk7WUFDRixFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM1QjtRQUFDLE9BQU8sQ0FBTSxFQUFFO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsUUFBUSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzlFO1FBQ0QsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDcEIsT0FBTyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1NBQ3RHO1FBQ0QsT0FBTyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQU9ELFlBQVksU0FBaUIsRUFBbUIsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFDeEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsTUFBTTs7UUFDZixNQUFNLE1BQU0sR0FBZ0IsRUFBRSxDQUFDO1FBQy9CLEtBQUssTUFBTSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLG1DQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQ2xGLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxvQ0FBWSxDQUFDLHdCQUF3QixFQUFFO2dCQUFFLFNBQVM7YUFBRTtZQUMxRSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsVUFBOEMsQ0FBQztZQUN0RSxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNuRixNQUFNLEdBQUcsR0FBRyxNQUFBLFFBQVEsQ0FBQyxXQUFXLDBDQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRCxJQUFJLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFELElBQUksTUFBTSxLQUFLLGdCQUFnQixFQUFFO2dCQUMvQixNQUFNLEdBQUcsU0FBUyxDQUFDO2FBQ3BCO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixPQUFPLEVBQUUsUUFBUTtnQkFDakIsTUFBTTtnQkFDTixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLElBQUksRUFBRSxNQUFBLEtBQUssQ0FBQyxTQUFTLG1DQUFJLFVBQVU7YUFDcEMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLE1BQU07O1FBQ2YsTUFBTSxNQUFNLEdBQWdCLEVBQUUsQ0FBQztRQUMvQixLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxtQ0FBSSxFQUFFLENBQUMsRUFBRTtZQUNsRixJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssb0NBQVksQ0FBQyxxQkFBcUIsRUFBRTtnQkFBRSxTQUFTO2FBQUU7WUFDdkUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFVBQTJDLENBQUM7WUFDbkUsTUFBTSxjQUFjLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUN2RyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLElBQUksRUFBRSxNQUFBLEtBQUssQ0FBQyxXQUFXLG1DQUFJLFVBQVU7Z0JBQ3JDLE1BQU0sRUFBRSxjQUFjLENBQUMsTUFBTTthQUM5QixDQUFDLENBQUM7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O0FBbkZILHdEQW9GQztBQW5Gd0IsdUNBQWdCLEdBQUcsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFzc2VtYmx5TWFuaWZlc3QsIE1hbmlmZXN0LCBBcnRpZmFjdFR5cGUsIEF3c0Nsb3VkRm9ybWF0aW9uU3RhY2tQcm9wZXJ0aWVzLCBOZXN0ZWRDbG91ZEFzc2VtYmx5UHJvcGVydGllcywgQm9vdHN0cmFwUm9sZSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5cbi8qKlxuICogSW5mb3JtYXRpb24gb24gdGhlIENESyBTdGFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc3RhZ2VcbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YWNrcyB3aXRoaW4gdGhlIHN0YWdlXG4gICAqL1xuICBzdGFja3M6IFN0YWNrSW5mb1tdO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIG9uIGEgc3RhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFja0luZm8ge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHN0YWNrXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhlIHN0YWNrIGlzIGRlcGxveWVkIHRvXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5rbm93bi1yZWdpb25cbiAgICovXG4gIHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvb2t1cCByb2xlIHRvIHVzZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxvb2t1cCByb2xlXG4gICAqL1xuICBsb29rdXBSb2xlPzogQm9vdHN0cmFwUm9sZTtcblxuICAvKipcbiAgICogVGhlIEpTT04gY29udGVudCBvZiB0aGUgc3RhY2tcbiAgICovXG4gIGNvbnRlbnQ6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59XG5cbi8qKlxuICogUmVhZHMgYSBDbG91ZCBBc3NlbWJseSBtYW5pZmVzdFxuICovXG5leHBvcnQgY2xhc3MgQXNzZW1ibHlNYW5pZmVzdFJlYWRlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GSUxFTkFNRSA9ICdtYW5pZmVzdC5qc29uJztcblxuICAvKipcbiAgICogUmVhZHMgYSBDbG91ZCBBc3NlbWJseSBtYW5pZmVzdCBmcm9tIGEgZmlsZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRmlsZShmaWxlTmFtZTogc3RyaW5nKTogQXNzZW1ibHlNYW5pZmVzdFJlYWRlciB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9iaiA9IE1hbmlmZXN0LmxvYWRBc3NlbWJseU1hbmlmZXN0KGZpbGVOYW1lKTtcbiAgICAgIHJldHVybiBuZXcgQXNzZW1ibHlNYW5pZmVzdFJlYWRlcihwYXRoLmRpcm5hbWUoZmlsZU5hbWUpLCBvYmopO1xuXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGludGVnIG1hbmlmZXN0ICcke2ZpbGVOYW1lfSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIENsb3VkIEFzc2VtYmx5IG1hbmlmZXN0IGZyb20gYSBmaWxlIG9yIGEgZGlyZWN0b3J5XG4gICAqIElmIHRoZSBnaXZlbiBmaWxlUGF0aCBpcyBhIGRpcmVjdG9yeSB0aGVuIGl0IHdpbGwgbG9vayBmb3JcbiAgICogYSBmaWxlIHdpdGhpbiB0aGUgZGlyZWN0b3J5IHdpdGggdGhlIERFRkFVTFRfRklMRU5BTUVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIge1xuICAgIGxldCBzdDtcbiAgICB0cnkge1xuICAgICAgc3QgPSBmcy5zdGF0U3luYyhmaWxlUGF0aCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGludGVnIG1hbmlmZXN0IGF0ICcke2ZpbGVQYXRofSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoc3QuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcmV0dXJuIEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbUZpbGUocGF0aC5qb2luKGZpbGVQYXRoLCBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLkRFRkFVTFRfRklMRU5BTUUpKTtcbiAgICB9XG4gICAgcmV0dXJuIEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbUZpbGUoZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1hbmlmZXN0IHdhcyBmb3VuZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpcmVjdG9yeTogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0OiBBc3NlbWJseU1hbmlmZXN0KSB7XG4gICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdGFja3MgZnJvbSB0aGUgbWFuaWZlc3RcbiAgICogcmV0dXJucyBhIG1hcCBvZiBhcnRpZmFjdElkIHRvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YWNrcygpOiBTdGFja0luZm9bXSB7XG4gICAgY29uc3Qgc3RhY2tzOiBTdGFja0luZm9bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2FydGlmYWN0SWQsIGFydGlmYWN0XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm1hbmlmZXN0LmFydGlmYWN0cyA/PyB7fSkpIHtcbiAgICAgIGlmIChhcnRpZmFjdC50eXBlICE9PSBBcnRpZmFjdFR5cGUuQVdTX0NMT1VERk9STUFUSU9OX1NUQUNLKSB7IGNvbnRpbnVlOyB9XG4gICAgICBjb25zdCBwcm9wcyA9IGFydGlmYWN0LnByb3BlcnRpZXMgYXMgQXdzQ2xvdWRGb3JtYXRpb25TdGFja1Byb3BlcnRpZXM7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZzLnJlYWRKU09OU3luYyhwYXRoLnJlc29sdmUodGhpcy5kaXJlY3RvcnksIHByb3BzLnRlbXBsYXRlRmlsZSkpO1xuICAgICAgY29uc3QgZW52ID0gYXJ0aWZhY3QuZW52aXJvbm1lbnQ/LnNwbGl0KC9cXC9cXC8/Lyk7XG4gICAgICBsZXQgcmVnaW9uID0gZW52ICYmIGVudi5sZW5ndGggPT09IDMgPyBlbnZbMl0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocmVnaW9uID09PSAndW5rbm93bi1yZWdpb24nKSB7XG4gICAgICAgIHJlZ2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHN0YWNrcy5wdXNoKHtcbiAgICAgICAgY29udGVudDogdGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgbG9va3VwUm9sZTogcHJvcHMubG9va3VwUm9sZSxcbiAgICAgICAgbmFtZTogcHJvcHMuc3RhY2tOYW1lID8/IGFydGlmYWN0SWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0YWdlcyBpbiB0aGUgYXNzZW1ibHlcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhZ2VzKCk6IFN0YWdlSW5mb1tdIHtcbiAgICBjb25zdCBzdGFnZXM6IFN0YWdlSW5mb1tdID0gW107XG4gICAgZm9yIChjb25zdCBbYXJ0aWZhY3RJZCwgYXJ0aWZhY3RdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMubWFuaWZlc3QuYXJ0aWZhY3RzID8/IHt9KSkge1xuICAgICAgaWYgKGFydGlmYWN0LnR5cGUgIT09IEFydGlmYWN0VHlwZS5ORVNURURfQ0xPVURfQVNTRU1CTFkpIHsgY29udGludWU7IH1cbiAgICAgIGNvbnN0IHByb3BzID0gYXJ0aWZhY3QucHJvcGVydGllcyBhcyBOZXN0ZWRDbG91ZEFzc2VtYmx5UHJvcGVydGllcztcbiAgICAgIGNvbnN0IG5lc3RlZEFzc2VtYmx5ID0gQXNzZW1ibHlNYW5pZmVzdFJlYWRlci5mcm9tUGF0aChwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIHByb3BzLmRpcmVjdG9yeU5hbWUpKTtcbiAgICAgIHN0YWdlcy5wdXNoKHtcbiAgICAgICAgbmFtZTogcHJvcHMuZGlzcGxheU5hbWUgPz8gYXJ0aWZhY3RJZCxcbiAgICAgICAgc3RhY2tzOiBuZXN0ZWRBc3NlbWJseS5zdGFja3MsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YWdlcztcbiAgfVxufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Comments = void 0;\n/**\n * Comments controls interacting with GitHub to make comments\n */\nclass Comments {\n constructor(octokit, context) {\n var _a;\n this.octokit = octokit;\n this.context = context;\n const payload = context.payload;\n this.commitSha = payload.pull_request.head.sha;\n if (!payload.pull_request.number) {\n throw new Error('Cannot find PR number, is this from a pull request?');\n }\n this.issueNumber = (_a = this.context.payload.pull_request) === null || _a === void 0 ? void 0 : _a.number;\n }\n /**\n * Find the previous comment with the given hash\n *\n * @param hash the unique hash identifying the stage comment to look for\n * @returns the PR comment id or undefined if there is no previous comment\n */\n async findPrevious(hash) {\n var _a;\n const comments = await this.octokit.rest.issues.listComments({\n ...this.context.repo,\n issue_number: this.issueNumber,\n });\n return (_a = comments.data.find(comment => { var _a; return (_a = comment.body) === null || _a === void 0 ? void 0 : _a.includes(hash); })) === null || _a === void 0 ? void 0 : _a.id;\n }\n /**\n * Update an existing comment\n *\n * @param hash the unique hash identifying the stage comment to look for\n * @param content the content of the comment\n * @param commentId the id of the comment to update\n */\n async updateComment(commentId, hash, content) {\n await this.octokit.rest.issues.updateComment({\n ...this.context.repo,\n body: [\n ``,\n ...content,\n '',\n `_Generated for commit ${this.commitSha}_`,\n ].join('\\n'),\n comment_id: commentId,\n });\n }\n /**\n * Create a new comment\n *\n * @param hash the unique hash identifying the stage comment to look for\n * @param content the content of the comment\n */\n async createComment(hash, content) {\n await this.octokit.rest.issues.createComment({\n ...this.context.repo,\n body: [\n ``,\n ...content,\n '',\n `_Generated for commit ${this.commitSha}_`,\n ].join('\\n'),\n issue_number: this.issueNumber,\n });\n }\n}\nexports.Comments = Comments;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBOztHQUVHO0FBQ0gsTUFBYSxRQUFRO0lBR25CLFlBQ21CLE9BQW9DLEVBQ3BDLE9BQWdCOztRQURoQixZQUFPLEdBQVAsT0FBTyxDQUE2QjtRQUNwQyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBRWpDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUEyQixDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7U0FDeEU7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSwwQ0FBRSxNQUFPLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFZOztRQUNwQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFDM0QsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7WUFDcEIsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQy9CLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxXQUFDLE9BQUEsTUFBQSxPQUFPLENBQUMsSUFBSSwwQ0FBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBQSxDQUFDLDBDQUFFLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFpQixFQUFFLElBQVksRUFBRSxPQUFpQjtRQUMzRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFDM0MsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7WUFDcEIsSUFBSSxFQUFFO2dCQUNKLGtDQUFrQyxJQUFJLE1BQU07Z0JBQzVDLEdBQUcsT0FBTztnQkFDVixFQUFFO2dCQUNGLHlCQUF5QixJQUFJLENBQUMsU0FBUyxHQUFHO2FBQzNDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNaLFVBQVUsRUFBRSxTQUFTO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBWSxFQUFFLE9BQWlCO1FBQ3hELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUMzQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUNwQixJQUFJLEVBQUU7Z0JBQ0osa0NBQWtDLElBQUksTUFBTTtnQkFDNUMsR0FBRyxPQUFPO2dCQUNWLEVBQUU7Z0JBQ0YseUJBQXlCLElBQUksQ0FBQyxTQUFTLEdBQUc7YUFDM0MsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ1osWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQW5FRCw0QkFtRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnQGFjdGlvbnMvZ2l0aHViL2xpYi9jb250ZXh0JztcbmltcG9ydCB7IEdpdEh1YiB9IGZyb20gJ0BhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgUHVsbFJlcXVlc3RFdmVudCB9IGZyb20gJ0BvY3Rva2l0L3dlYmhvb2tzLWRlZmluaXRpb25zL3NjaGVtYSc7XG5cbi8qKlxuICogQ29tbWVudHMgY29udHJvbHMgaW50ZXJhY3Rpbmcgd2l0aCBHaXRIdWIgdG8gbWFrZSBjb21tZW50c1xuICovXG5leHBvcnQgY2xhc3MgQ29tbWVudHMge1xuICBwcml2YXRlIHJlYWRvbmx5IGlzc3VlTnVtYmVyOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWl0U2hhOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb2N0b2tpdDogSW5zdGFuY2VUeXBlPHR5cGVvZiBHaXRIdWI+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogQ29udGV4dCxcbiAgKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IGNvbnRleHQucGF5bG9hZCBhcyBQdWxsUmVxdWVzdEV2ZW50O1xuICAgIHRoaXMuY29tbWl0U2hhID0gcGF5bG9hZC5wdWxsX3JlcXVlc3QuaGVhZC5zaGE7XG4gICAgaWYgKCFwYXlsb2FkLnB1bGxfcmVxdWVzdC5udW1iZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgUFIgbnVtYmVyLCBpcyB0aGlzIGZyb20gYSBwdWxsIHJlcXVlc3Q/Jyk7XG4gICAgfVxuICAgIHRoaXMuaXNzdWVOdW1iZXIgPSB0aGlzLmNvbnRleHQucGF5bG9hZC5wdWxsX3JlcXVlc3Q/Lm51bWJlciE7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgcHJldmlvdXMgY29tbWVudCB3aXRoIHRoZSBnaXZlbiBoYXNoXG4gICAqXG4gICAqIEBwYXJhbSBoYXNoIHRoZSB1bmlxdWUgaGFzaCBpZGVudGlmeWluZyB0aGUgc3RhZ2UgY29tbWVudCB0byBsb29rIGZvclxuICAgKiBAcmV0dXJucyB0aGUgUFIgY29tbWVudCBpZCBvciB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgY29tbWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZpbmRQcmV2aW91cyhoYXNoOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGNvbW1lbnRzID0gYXdhaXQgdGhpcy5vY3Rva2l0LnJlc3QuaXNzdWVzLmxpc3RDb21tZW50cyh7XG4gICAgICAuLi50aGlzLmNvbnRleHQucmVwbyxcbiAgICAgIGlzc3VlX251bWJlcjogdGhpcy5pc3N1ZU51bWJlcixcbiAgICB9KTtcbiAgICByZXR1cm4gY29tbWVudHMuZGF0YS5maW5kKGNvbW1lbnQgPT4gY29tbWVudC5ib2R5Py5pbmNsdWRlcyhoYXNoKSk/LmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBjb21tZW50XG4gICAqXG4gICAqIEBwYXJhbSBoYXNoIHRoZSB1bmlxdWUgaGFzaCBpZGVudGlmeWluZyB0aGUgc3RhZ2UgY29tbWVudCB0byBsb29rIGZvclxuICAgKiBAcGFyYW0gY29udGVudCB0aGUgY29udGVudCBvZiB0aGUgY29tbWVudFxuICAgKiBAcGFyYW0gY29tbWVudElkIHRoZSBpZCBvZiB0aGUgY29tbWVudCB0byB1cGRhdGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVDb21tZW50KGNvbW1lbnRJZDogbnVtYmVyLCBoYXNoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZ1tdKSB7XG4gICAgYXdhaXQgdGhpcy5vY3Rva2l0LnJlc3QuaXNzdWVzLnVwZGF0ZUNvbW1lbnQoe1xuICAgICAgLi4udGhpcy5jb250ZXh0LnJlcG8sXG4gICAgICBib2R5OiBbXG4gICAgICAgIGA8IS0tIGNkayBkaWZmIGFjdGlvbiB3aXRoIGhhc2ggJHtoYXNofSAtLT5gLFxuICAgICAgICAuLi5jb250ZW50LFxuICAgICAgICAnJyxcbiAgICAgICAgYF9HZW5lcmF0ZWQgZm9yIGNvbW1pdCAke3RoaXMuY29tbWl0U2hhfV9gLFxuICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgIGNvbW1lbnRfaWQ6IGNvbW1lbnRJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgY29tbWVudFxuICAgKlxuICAgKiBAcGFyYW0gaGFzaCB0aGUgdW5pcXVlIGhhc2ggaWRlbnRpZnlpbmcgdGhlIHN0YWdlIGNvbW1lbnQgdG8gbG9vayBmb3JcbiAgICogQHBhcmFtIGNvbnRlbnQgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbW1lbnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVDb21tZW50KGhhc2g6IHN0cmluZywgY29udGVudDogc3RyaW5nW10pIHtcbiAgICBhd2FpdCB0aGlzLm9jdG9raXQucmVzdC5pc3N1ZXMuY3JlYXRlQ29tbWVudCh7XG4gICAgICAuLi50aGlzLmNvbnRleHQucmVwbyxcbiAgICAgIGJvZHk6IFtcbiAgICAgICAgYDwhLS0gY2RrIGRpZmYgYWN0aW9uIHdpdGggaGFzaCAke2hhc2h9IC0tPmAsXG4gICAgICAgIC4uLmNvbnRlbnQsXG4gICAgICAgICcnLFxuICAgICAgICBgX0dlbmVyYXRlZCBmb3IgY29tbWl0ICR7dGhpcy5jb21taXRTaGF9X2AsXG4gICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgaXNzdWVfbnVtYmVyOiB0aGlzLmlzc3VlTnVtYmVyLFxuICAgIH0pO1xuICB9XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StackDiff = void 0;\nconst cloudformation_diff_1 = require(\"@aws-cdk/cloudformation-diff\");\nconst client_cloudformation_1 = require(\"@aws-sdk/client-cloudformation\");\nconst credential_providers_1 = require(\"@aws-sdk/credential-providers\");\n/**\n * StackDiff performs the diff on a stack\n */\nclass StackDiff {\n constructor(stack, allowedDestroyTypes) {\n this.stack = stack;\n this.allowedDestroyTypes = allowedDestroyTypes;\n let credentials;\n // if there is a lookup role then assume that, otherwise\n // just use the default credentials\n credentials = stack.lookupRole ? (0, credential_providers_1.fromTemporaryCredentials)({\n params: {\n RoleArn: stack.lookupRole.arn.replace('${AWS::Partition}', 'aws'),\n RoleSessionName: 'cdk-diff-action',\n ExternalId: stack.lookupRole.assumeRoleExternalId,\n DurationSeconds: 900,\n },\n }) : undefined;\n this.client = new client_cloudformation_1.CloudFormationClient({\n credentials,\n region: this.stack.region,\n });\n }\n /** Performs the diff on the CloudFormation stack\n * This reads the existing stack from CFN and then uses the cloudformation-diff\n * package to perform the diff and collect additional information on the type of changes\n */\n async diffStack() {\n const cmd = new client_cloudformation_1.GetTemplateCommand({\n StackName: this.stack.name,\n });\n let existingTemplate = {};\n try {\n const res = await this.client.send(cmd);\n existingTemplate = res.TemplateBody ? JSON.parse(res.TemplateBody) : {};\n }\n catch (e) {\n if (e instanceof client_cloudformation_1.StackNotFoundException) {\n existingTemplate = {};\n }\n }\n try {\n const diff = (0, cloudformation_diff_1.diffTemplate)(existingTemplate, this.stack.content);\n const changes = this.evaluateDiff(this.stack.name, diff);\n return {\n diff,\n changes,\n };\n }\n catch (e) {\n console.error('Error getting remote template: ', e);\n throw e;\n }\n }\n evaluateDiff(templateId, templateDiff) {\n const changes = {\n createdResources: 0,\n removedResources: 0,\n updatedResources: 0,\n destructiveChanges: [],\n };\n // go through all the resource differences and check for any\n // \"destructive\" changes\n templateDiff.resources.forEachDifference((logicalId, change) => {\n var _a, _b, _c;\n // if the change is a removal it will not show up as a 'changeImpact'\n // so need to check for it separately, unless it is a resourceType that\n // has been \"allowed\" to be destroyed\n const resourceType = (_b = (_a = change.oldValue) === null || _a === void 0 ? void 0 : _a.Type) !== null && _b !== void 0 ? _b : (_c = change.newValue) === null || _c === void 0 ? void 0 : _c.Type;\n switch (resourceType) {\n case 'AWS::CDK::Metadata':\n return;\n case 'AWS::Lambda::Function':\n const keys = Object.keys(change.propertyUpdates);\n if (keys.length <= 2 &&\n keys.includes('Code') ||\n keys.includes('Metadata')) {\n return;\n }\n }\n if (change.isUpdate) {\n changes.updatedResources += 1;\n }\n else if (change.isRemoval) {\n changes.removedResources += 1;\n }\n else if (change.isAddition) {\n changes.createdResources += 1;\n }\n if (resourceType && this.allowedDestroyTypes.includes(resourceType)) {\n return;\n }\n if (change.isRemoval) {\n changes.destructiveChanges.push({\n impact: cloudformation_diff_1.ResourceImpact.WILL_DESTROY,\n logicalId,\n stackName: templateId,\n });\n }\n else {\n switch (change.changeImpact) {\n case cloudformation_diff_1.ResourceImpact.MAY_REPLACE:\n case cloudformation_diff_1.ResourceImpact.WILL_ORPHAN:\n case cloudformation_diff_1.ResourceImpact.WILL_DESTROY:\n case cloudformation_diff_1.ResourceImpact.WILL_REPLACE:\n changes.destructiveChanges.push({\n impact: change.changeImpact,\n logicalId,\n stackName: templateId,\n });\n break;\n }\n }\n });\n return changes;\n }\n}\nexports.StackDiff = StackDiff;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kaWZmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNFQUE4RztBQUM5RywwRUFBa0g7QUFDbEgsd0VBQXlFO0FBaUR6RTs7R0FFRztBQUNILE1BQWEsU0FBUztJQUVwQixZQUNtQixLQUFnQixFQUNoQixtQkFBNkI7UUFEN0IsVUFBSyxHQUFMLEtBQUssQ0FBVztRQUNoQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQVU7UUFFOUMsSUFBSSxXQUFzRCxDQUFDO1FBQzNELHdEQUF3RDtRQUN4RCxtQ0FBbUM7UUFDbkMsV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUEsK0NBQXdCLEVBQUM7WUFDeEQsTUFBTSxFQUFFO2dCQUNOLE9BQU8sRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDO2dCQUNqRSxlQUFlLEVBQUUsaUJBQWlCO2dCQUNsQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0I7Z0JBQ2pELGVBQWUsRUFBRSxHQUFHO2FBQ3JCO1NBQ0YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksNENBQW9CLENBQUM7WUFDckMsV0FBVztZQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUksMENBQWtCLENBQUM7WUFDakMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtTQUMzQixDQUFDLENBQUM7UUFDSCxJQUFJLGdCQUFnQixHQUEyQixFQUFFLENBQUM7UUFDbEQsSUFBSTtZQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN6RTtRQUFDLE9BQU8sQ0FBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFlBQVksOENBQXNCLEVBQUU7Z0JBQ3ZDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQzthQUN2QjtTQUNGO1FBQ0QsSUFBSTtZQUNGLE1BQU0sSUFBSSxHQUFHLElBQUEsa0NBQVksRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekQsT0FBTztnQkFDTCxJQUFJO2dCQUNKLE9BQU87YUFDUixDQUFDO1NBRUg7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEQsTUFBTSxDQUFDLENBQUM7U0FDVDtJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsVUFBa0IsRUFBRSxZQUEwQjtRQUNqRSxNQUFNLE9BQU8sR0FBa0I7WUFDN0IsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLGdCQUFnQixFQUFFLENBQUM7WUFDbkIsa0JBQWtCLEVBQUUsRUFBRTtTQUN2QixDQUFDO1FBQ0YsNERBQTREO1FBQzVELHdCQUF3QjtRQUN4QixZQUFZLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUMsU0FBaUIsRUFBRSxNQUEwQixFQUFFLEVBQUU7O1lBQ3pGLHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUscUNBQXFDO1lBQ3JDLE1BQU0sWUFBWSxHQUFHLE1BQUEsTUFBQSxNQUFNLENBQUMsUUFBUSwwQ0FBRSxJQUFJLG1DQUFJLE1BQUEsTUFBTSxDQUFDLFFBQVEsMENBQUUsSUFBSSxDQUFDO1lBQ3BFLFFBQVEsWUFBWSxFQUFFO2dCQUNwQixLQUFLLG9CQUFvQjtvQkFDdkIsT0FBTztnQkFDVCxLQUFLLHVCQUF1QjtvQkFDMUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ2pELElBQ0UsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDO3dCQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQzt3QkFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFDekI7d0JBQ0EsT0FBTztxQkFDUjthQUNKO1lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUNuQixPQUFPLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxDQUFDO2FBQy9CO2lCQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDM0IsT0FBTyxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FBQzthQUMvQjtpQkFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JBQzVCLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7YUFDL0I7WUFDRCxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNuRSxPQUFPO2FBQ1I7WUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Z0JBQ3BCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7b0JBQzlCLE1BQU0sRUFBRSxvQ0FBYyxDQUFDLFlBQVk7b0JBQ25DLFNBQVM7b0JBQ1QsU0FBUyxFQUFFLFVBQVU7aUJBQ3RCLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLFFBQVEsTUFBTSxDQUFDLFlBQVksRUFBRTtvQkFDM0IsS0FBSyxvQ0FBYyxDQUFDLFdBQVcsQ0FBQztvQkFDaEMsS0FBSyxvQ0FBYyxDQUFDLFdBQVcsQ0FBQztvQkFDaEMsS0FBSyxvQ0FBYyxDQUFDLFlBQVksQ0FBQztvQkFDakMsS0FBSyxvQ0FBYyxDQUFDLFlBQVk7d0JBQzlCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7NEJBQzlCLE1BQU0sRUFBRSxNQUFNLENBQUMsWUFBWTs0QkFDM0IsU0FBUzs0QkFDVCxTQUFTLEVBQUUsVUFBVTt5QkFDdEIsQ0FBQyxDQUFDO3dCQUNILE1BQU07aUJBQ1Q7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBbkhELDhCQW1IQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlRGlmZmVyZW5jZSwgUmVzb3VyY2VJbXBhY3QsIFRlbXBsYXRlRGlmZiwgZGlmZlRlbXBsYXRlIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvbkNsaWVudCwgR2V0VGVtcGxhdGVDb21tYW5kLCBTdGFja05vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IGZyb21UZW1wb3JhcnlDcmVkZW50aWFscyB9IGZyb20gJ0Bhd3Mtc2RrL2NyZWRlbnRpYWwtcHJvdmlkZXJzJztcbmltcG9ydCB7IEF3c0NyZWRlbnRpYWxJZGVudGl0eVByb3ZpZGVyIH0gZnJvbSAnQHNtaXRoeS90eXBlcyc7XG5pbXBvcnQgeyBTdGFja0luZm8gfSBmcm9tICcuL2Fzc2VtYmx5JztcblxuLyoqXG4gKiBEZXRhaWxzIG9uIHdoYXQgY2hhbmdlcyBhcmUgb2NjdXJyaW5nIGluIHRoaXMgc3RhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2VEZXRhaWxzIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIGJlaW5nIHVwZGF0ZWRcbiAgICovXG4gIHVwZGF0ZWRSZXNvdXJjZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByZXNvdXJjZXMgdGhhdCBhcmUgYmVpbmcgcmVtb3ZlZFxuICAgKi9cbiAgcmVtb3ZlZFJlc291cmNlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHJlc291cmNlcyB0aGF0IGFyZSBiZWluZyBjcmVhdGVkXG4gICAqL1xuICBjcmVhdGVkUmVzb3VyY2VzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIG9uIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzXG4gICAqL1xuICBkZXN0cnVjdGl2ZUNoYW5nZXM6IERlc3RydWN0aXZlQ2hhbmdlW107XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gb24gYW55IGRlc3RydWN0aXZlIGNoYW5nZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXN0cnVjdGl2ZUNoYW5nZSB7XG4gIC8qKlxuICAgKiBUaGUgbG9naWNhbElkIG9mIHRoZSByZXNvdXJjZSB3aXRoIGEgZGVzdHJ1Y3RpdmUgY2hhbmdlXG4gICAqL1xuICByZWFkb25seSBsb2dpY2FsSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHN0YWNrIHRoYXQgY29udGFpbnMgdGhlIGRlc3RydWN0aXZlIGNoYW5nZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbXBhY3Qgb2YgdGhlIGRlc3RydWN0aXZlIGNoYW5nZVxuICAgKi9cbiAgcmVhZG9ubHkgaW1wYWN0OiBSZXNvdXJjZUltcGFjdDtcbn1cblxuLyoqXG4gKiBTdGFja0RpZmYgcGVyZm9ybXMgdGhlIGRpZmYgb24gYSBzdGFja1xuICovXG5leHBvcnQgY2xhc3MgU3RhY2tEaWZmIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IENsb3VkRm9ybWF0aW9uQ2xpZW50O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrOiBTdGFja0luZm8sXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGxvd2VkRGVzdHJveVR5cGVzOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgbGV0IGNyZWRlbnRpYWxzOiBBd3NDcmVkZW50aWFsSWRlbnRpdHlQcm92aWRlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBpZiB0aGVyZSBpcyBhIGxvb2t1cCByb2xlIHRoZW4gYXNzdW1lIHRoYXQsIG90aGVyd2lzZVxuICAgIC8vIGp1c3QgdXNlIHRoZSBkZWZhdWx0IGNyZWRlbnRpYWxzXG4gICAgY3JlZGVudGlhbHMgPSBzdGFjay5sb29rdXBSb2xlID8gZnJvbVRlbXBvcmFyeUNyZWRlbnRpYWxzKHtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBSb2xlQXJuOiBzdGFjay5sb29rdXBSb2xlLmFybi5yZXBsYWNlKCcke0FXUzo6UGFydGl0aW9ufScsICdhd3MnKSxcbiAgICAgICAgUm9sZVNlc3Npb25OYW1lOiAnY2RrLWRpZmYtYWN0aW9uJyxcbiAgICAgICAgRXh0ZXJuYWxJZDogc3RhY2subG9va3VwUm9sZS5hc3N1bWVSb2xlRXh0ZXJuYWxJZCxcbiAgICAgICAgRHVyYXRpb25TZWNvbmRzOiA5MDAsXG4gICAgICB9LFxuICAgIH0pIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xpZW50ID0gbmV3IENsb3VkRm9ybWF0aW9uQ2xpZW50KHtcbiAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgcmVnaW9uOiB0aGlzLnN0YWNrLnJlZ2lvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBQZXJmb3JtcyB0aGUgZGlmZiBvbiB0aGUgQ2xvdWRGb3JtYXRpb24gc3RhY2tcbiAgICogVGhpcyByZWFkcyB0aGUgZXhpc3Rpbmcgc3RhY2sgZnJvbSBDRk4gYW5kIHRoZW4gdXNlcyB0aGUgY2xvdWRmb3JtYXRpb24tZGlmZlxuICAgKiBwYWNrYWdlIHRvIHBlcmZvcm0gdGhlIGRpZmYgYW5kIGNvbGxlY3QgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgdHlwZSBvZiBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlmZlN0YWNrKCk6IFByb21pc2U8eyBkaWZmOiBUZW1wbGF0ZURpZmY7IGNoYW5nZXM6IENoYW5nZURldGFpbHMgfT4ge1xuICAgIGNvbnN0IGNtZCA9IG5ldyBHZXRUZW1wbGF0ZUNvbW1hbmQoe1xuICAgICAgU3RhY2tOYW1lOiB0aGlzLnN0YWNrLm5hbWUsXG4gICAgfSk7XG4gICAgbGV0IGV4aXN0aW5nVGVtcGxhdGU6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChjbWQpO1xuICAgICAgZXhpc3RpbmdUZW1wbGF0ZSA9IHJlcy5UZW1wbGF0ZUJvZHkgPyBKU09OLnBhcnNlKHJlcy5UZW1wbGF0ZUJvZHkpIDoge307XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0YWNrTm90Rm91bmRFeGNlcHRpb24pIHtcbiAgICAgICAgZXhpc3RpbmdUZW1wbGF0ZSA9IHt9O1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlmZiA9IGRpZmZUZW1wbGF0ZShleGlzdGluZ1RlbXBsYXRlLCB0aGlzLnN0YWNrLmNvbnRlbnQpO1xuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuZXZhbHVhdGVEaWZmKHRoaXMuc3RhY2submFtZSwgZGlmZik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaWZmLFxuICAgICAgICBjaGFuZ2VzLFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0dGluZyByZW1vdGUgdGVtcGxhdGU6ICcsIGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlRGlmZih0ZW1wbGF0ZUlkOiBzdHJpbmcsIHRlbXBsYXRlRGlmZjogVGVtcGxhdGVEaWZmKTogQ2hhbmdlRGV0YWlscyB7XG4gICAgY29uc3QgY2hhbmdlczogQ2hhbmdlRGV0YWlscyA9IHtcbiAgICAgIGNyZWF0ZWRSZXNvdXJjZXM6IDAsXG4gICAgICByZW1vdmVkUmVzb3VyY2VzOiAwLFxuICAgICAgdXBkYXRlZFJlc291cmNlczogMCxcbiAgICAgIGRlc3RydWN0aXZlQ2hhbmdlczogW10sXG4gICAgfTtcbiAgICAvLyBnbyB0aHJvdWdoIGFsbCB0aGUgcmVzb3VyY2UgZGlmZmVyZW5jZXMgYW5kIGNoZWNrIGZvciBhbnlcbiAgICAvLyBcImRlc3RydWN0aXZlXCIgY2hhbmdlc1xuICAgIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMuZm9yRWFjaERpZmZlcmVuY2UoKGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFJlc291cmNlRGlmZmVyZW5jZSkgPT4ge1xuICAgICAgLy8gaWYgdGhlIGNoYW5nZSBpcyBhIHJlbW92YWwgaXQgd2lsbCBub3Qgc2hvdyB1cCBhcyBhICdjaGFuZ2VJbXBhY3QnXG4gICAgICAvLyBzbyBuZWVkIHRvIGNoZWNrIGZvciBpdCBzZXBhcmF0ZWx5LCB1bmxlc3MgaXQgaXMgYSByZXNvdXJjZVR5cGUgdGhhdFxuICAgICAgLy8gaGFzIGJlZW4gXCJhbGxvd2VkXCIgdG8gYmUgZGVzdHJveWVkXG4gICAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBjaGFuZ2Uub2xkVmFsdWU/LlR5cGUgPz8gY2hhbmdlLm5ld1ZhbHVlPy5UeXBlO1xuICAgICAgc3dpdGNoIChyZXNvdXJjZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnQVdTOjpDREs6Ok1ldGFkYXRhJzpcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbic6XG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNoYW5nZS5wcm9wZXJ0eVVwZGF0ZXMpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGtleXMubGVuZ3RoIDw9IDIgJiZcbiAgICAgICAgICAgIGtleXMuaW5jbHVkZXMoJ0NvZGUnKSB8fFxuICAgICAgICAgICAga2V5cy5pbmNsdWRlcygnTWV0YWRhdGEnKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2UuaXNVcGRhdGUpIHtcbiAgICAgICAgY2hhbmdlcy51cGRhdGVkUmVzb3VyY2VzICs9IDE7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZS5pc1JlbW92YWwpIHtcbiAgICAgICAgY2hhbmdlcy5yZW1vdmVkUmVzb3VyY2VzICs9IDE7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZS5pc0FkZGl0aW9uKSB7XG4gICAgICAgIGNoYW5nZXMuY3JlYXRlZFJlc291cmNlcyArPSAxO1xuICAgICAgfVxuICAgICAgaWYgKHJlc291cmNlVHlwZSAmJiB0aGlzLmFsbG93ZWREZXN0cm95VHlwZXMuaW5jbHVkZXMocmVzb3VyY2VUeXBlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuaXNSZW1vdmFsKSB7XG4gICAgICAgIGNoYW5nZXMuZGVzdHJ1Y3RpdmVDaGFuZ2VzLnB1c2goe1xuICAgICAgICAgIGltcGFjdDogUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZLFxuICAgICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoIChjaGFuZ2UuY2hhbmdlSW1wYWN0KSB7XG4gICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5NQVlfUkVQTEFDRTpcbiAgICAgICAgICBjYXNlIFJlc291cmNlSW1wYWN0LldJTExfT1JQSEFOOlxuICAgICAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZOlxuICAgICAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9SRVBMQUNFOlxuICAgICAgICAgICAgY2hhbmdlcy5kZXN0cnVjdGl2ZUNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgICAgIGltcGFjdDogY2hhbmdlLmNoYW5nZUltcGFjdCxcbiAgICAgICAgICAgICAgbG9naWNhbElkLFxuICAgICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cbn1cbiJdfQ==","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst core = __importStar(require(\"@actions/core\"));\nconst action_1 = require(\"./action\");\n(0, action_1.run)().catch((error) => {\n core.setFailed(error.message);\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUFzQztBQUN0QyxxQ0FBK0I7QUFFL0IsSUFBQSxZQUFHLEdBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtJQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvcmUgZnJvbSAnQGFjdGlvbnMvY29yZSc7XG5pbXBvcnQgeyBydW4gfSBmcm9tICcuL2FjdGlvbic7XG5cbnJ1bigpLmNhdGNoKChlcnJvcjogYW55KSA9PiB7XG4gIGNvcmUuc2V0RmFpbGVkKGVycm9yLm1lc3NhZ2UpO1xufSk7XG4iXX0=","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StageProcessor = void 0;\nconst crypto = __importStar(require(\"crypto\"));\nconst stream_1 = require(\"stream\");\nconst string_decoder_1 = require(\"string_decoder\");\nconst cloudformation_diff_1 = require(\"@aws-cdk/cloudformation-diff\");\nconst diff_1 = require(\"./diff\");\n/**\n * StageProcessor processes a CDK stage and creates a comment on the GitHub PR\n * detailing the stack diffs\n */\nclass StageProcessor {\n constructor(stages, allowedDestroyTypes) {\n this.stages = stages;\n this.allowedDestroyTypes = allowedDestroyTypes;\n this.stageComments = {};\n this.stages.forEach(stage => {\n this.stageComments[stage.name] = {\n destructiveChanges: 0,\n comment: [],\n hash: md5Hash(JSON.stringify({\n stageName: stage.name,\n ...stage.stacks.reduce((prev, curr) => {\n prev.stacks.push({\n name: curr.name,\n lookupRole: curr.lookupRole,\n region: curr.region,\n });\n return prev;\n }, { stacks: [] }), // we don't want the content to be part of the hash\n })),\n };\n });\n }\n /**\n * Process all of the stages. Once this has been run\n * the comment can be created with `commentStages()`\n */\n async processStages() {\n for (const stage of this.stages) {\n for (const stack of stage.stacks) {\n try {\n const { comment, changes } = await this.diffStack(stack);\n this.stageComments[stage.name].comment.push(...comment);\n this.stageComments[stage.name].destructiveChanges += changes;\n }\n catch (e) {\n console.error('Error processing stages: ', e);\n throw e;\n }\n }\n }\n }\n /**\n * Create the GitHub comment for the stage\n */\n async commentStages(comments) {\n for (const [stageName, info] of Object.entries(this.stageComments)) {\n const stageComment = this.getCommentForStage(stageName);\n const previous = await comments.findPrevious(info.hash);\n if (previous) {\n await comments.updateComment(previous, info.hash, stageComment);\n }\n else {\n await comments.createComment(info.hash, stageComment);\n }\n }\n }\n /**\n * Returns whether or not there are destructive changes in this stage\n */\n get hasDestructiveChanges() {\n for (const comments of Object.values(this.stageComments)) {\n if (comments.destructiveChanges) {\n return true;\n }\n }\n return false;\n }\n async diffStack(stack) {\n try {\n const stackDiff = new diff_1.StackDiff(stack, this.allowedDestroyTypes);\n const { diff, changes } = await stackDiff.diffStack();\n return {\n comment: this.formatStackComment(stack.name, diff, changes),\n changes: changes.destructiveChanges.length,\n };\n }\n catch (e) {\n console.error('Error performing stack diff: ', e);\n throw e;\n }\n }\n getEmoji(changes) {\n if (changes.destructiveChanges.length || changes.removedResources) {\n return ':x:';\n }\n else if (changes.updatedResources) {\n return ':yellow_circle:';\n }\n else if (changes.createdResources) {\n return ':sparkle:';\n }\n return ':white_check_mark:';\n }\n formatStackComment(stackName, diff, changes) {\n const output = [];\n const emoji = this.getEmoji(changes);\n if (diff.isEmpty) {\n output.push(`No Changes for stack: ${stackName}`);\n return output;\n }\n output.push(...[\n `#### Diff for stack: ${stackName} - ` +\n `***${changes.createdResources} to add, ${changes.updatedResources} to update, ${changes.removedResources} to destroy*** ` +\n emoji,\n '
Details',\n '',\n ]);\n if (changes.destructiveChanges.length) {\n output.push('> [!WARNING]\\n> ***Destructive Changes*** :bangbang:'),\n changes.destructiveChanges.forEach(change => {\n output.push(`> **Stack: ${change.stackName} - Resource: ${change.logicalId} - Impact:** ***${change.impact}***`);\n });\n }\n const writable = new StringWritable({});\n (0, cloudformation_diff_1.formatDifferences)(writable, diff);\n output.push('```shell');\n output.push(writable.data);\n output.push('```');\n output.push('
');\n output.push('');\n return output;\n }\n getCommentForStage(stageName) {\n const output = [];\n const stageComments = this.stageComments[stageName];\n if (!stageComments.comment.length) {\n return output;\n }\n output.push(`### Diff for stage: ${stageName}`);\n if (stageComments.destructiveChanges) {\n output.push(`> [!WARNING]\\n> ${stageComments.destructiveChanges} Destructive Changes`);\n }\n return output.concat(stageComments.comment);\n }\n}\nexports.StageProcessor = StageProcessor;\nclass StringWritable extends stream_1.Writable {\n constructor(options) {\n super(options);\n this._decoder = new string_decoder_1.StringDecoder();\n this.data = '';\n }\n _write(chunk, encoding, callback) {\n if (encoding === 'buffer') {\n chunk = this._decoder.write(chunk);\n }\n this.data += chunk;\n callback();\n }\n _final(callback) {\n this.data += this._decoder.end();\n callback();\n }\n}\nfunction md5Hash(val) {\n return crypto.createHash('md5').update(val).digest('hex');\n}\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2UtcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YWdlLXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyxtQ0FBbUQ7QUFDbkQsbURBQStDO0FBQy9DLHNFQUErRTtBQUcvRSxpQ0FBa0Q7QUF3QmxEOzs7R0FHRztBQUNILE1BQWEsY0FBYztJQUV6QixZQUNtQixNQUFtQixFQUNuQixtQkFBNkI7UUFEN0IsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUNuQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQVU7UUFIL0Isa0JBQWEsR0FBMEMsRUFBRSxDQUFDO1FBS3pFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHO2dCQUMvQixrQkFBa0IsRUFBRSxDQUFDO2dCQUNyQixPQUFPLEVBQUUsRUFBRTtnQkFDWCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDckIsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTt3QkFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7NEJBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJOzRCQUNmLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTs0QkFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO3lCQUNwQixDQUFDLENBQUM7d0JBQ0gsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBOEMsQ0FBQyxFQUFFLG1EQUFtRDtpQkFDcEgsQ0FBQyxDQUFDO2FBQ0osQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxhQUFhO1FBQ3hCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMvQixLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ2hDLElBQUk7b0JBQ0YsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3pELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztvQkFDeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsa0JBQWtCLElBQUksT0FBTyxDQUFDO2lCQUM5RDtnQkFBQyxPQUFPLENBQU0sRUFBRTtvQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM5QyxNQUFNLENBQUMsQ0FBQztpQkFDVDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQWtCO1FBQzNDLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNsRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLFFBQVEsRUFBRTtnQkFDWixNQUFNLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDakU7aUJBQU07Z0JBQ0wsTUFBTSxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDdkQ7U0FDRjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcscUJBQXFCO1FBQzlCLEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDeEQsSUFBSSxRQUFRLENBQUMsa0JBQWtCLEVBQUU7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBZ0I7UUFDdEMsSUFBSTtZQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksZ0JBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDakUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0RCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO2dCQUMzRCxPQUFPLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU07YUFDM0MsQ0FBQztTQUVIO1FBQUMsT0FBTyxDQUFNLEVBQUU7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sQ0FBQyxDQUFDO1NBQ1Q7SUFDSCxDQUFDO0lBRU8sUUFBUSxDQUFDLE9BQXNCO1FBQ3JDLElBQUksT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7WUFDakUsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFO1lBQ25DLE9BQU8saUJBQWlCLENBQUM7U0FDMUI7YUFBTSxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtZQUNuQyxPQUFPLFdBQVcsQ0FBQztTQUNwQjtRQUNELE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFNBQWlCLEVBQUUsSUFBa0IsRUFBRSxPQUFzQjtRQUN0RixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNsRCxPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQ2Isd0JBQXdCLFNBQVMsS0FBSztnQkFDcEMsTUFBTSxPQUFPLENBQUMsZ0JBQWdCLFlBQVksT0FBTyxDQUFDLGdCQUFnQixlQUFlLE9BQU8sQ0FBQyxnQkFBZ0Isa0JBQWtCO2dCQUMzSCxLQUFLO1lBQ1AscUNBQXFDO1lBQ3JDLEVBQUU7U0FDSCxDQUFDLENBQUM7UUFDSCxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7WUFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxzREFBc0QsQ0FBQztnQkFDbkUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDMUMsTUFBTSxDQUFDLElBQUksQ0FDVCxjQUFjLE1BQU0sQ0FBQyxTQUFTLGdCQUFnQixNQUFNLENBQUMsU0FBUyxtQkFBbUIsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUNwRyxDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxJQUFBLHVDQUFpQixFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVsQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFHTyxrQkFBa0IsQ0FBQyxTQUFpQjtRQUMxQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDakMsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFaEQsSUFBSSxhQUFhLENBQUMsa0JBQWtCLEVBQUU7WUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsYUFBYSxDQUFDLGtCQUFrQixzQkFBc0IsQ0FBQyxDQUFDO1NBQ3hGO1FBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUFoSkQsd0NBZ0pDO0FBRUQsTUFBTSxjQUFlLFNBQVEsaUJBQVE7SUFHbkMsWUFBWSxPQUF3QjtRQUNsQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksOEJBQWEsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBVSxFQUFFLFFBQWdCLEVBQUUsUUFBd0M7UUFDM0UsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ3pCLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQztRQUVELElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDO1FBQ25CLFFBQVEsRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUF3QztRQUM3QyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakMsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUFFRCxTQUFTLE9BQU8sQ0FBQyxHQUFXO0lBQzFCLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBXcml0YWJsZSwgV3JpdGFibGVPcHRpb25zIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tICdzdHJpbmdfZGVjb2Rlcic7XG5pbXBvcnQgeyBUZW1wbGF0ZURpZmYsIGZvcm1hdERpZmZlcmVuY2VzIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgeyBTdGFja0luZm8sIFN0YWdlSW5mbyB9IGZyb20gJy4vYXNzZW1ibHknO1xuaW1wb3J0IHsgQ29tbWVudHMgfSBmcm9tICcuL2NvbW1lbnQnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0YWlscywgU3RhY2tEaWZmIH0gZnJvbSAnLi9kaWZmJztcblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBuZWVkZWQgdG8gbWFrZSBhIGNvbW1lbnQgZm9yIGEgQ0RLIFN0YWdlXG4gKi9cbmludGVyZmFjZSBTdGFnZUNvbW1lbnQge1xuICAvKipcbiAgICogVGhlIGZ1bGwgY29tbWVudC4gVGhlIGxpc3Qgd2lsbCBiZSBqb2luZWQgd2l0aCBcXG5cbiAgICovXG4gIGNvbW1lbnQ6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGhhc2ggZm9yIHRoZSBzdGFnZSBjb21tZW50XG4gICAqIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGxvb2t1cCB0aGUgc3RhZ2UgY29tbWVudCBvbiB0aGUgUFJcbiAgICogc28gdGhhdCBpdCBjYW4gYmUgb3ZlcndyaXR0ZW5cbiAgICovXG4gIGhhc2g6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkZXN0cnVjdGl2ZSBjaGFuZ2VzIGluIHRoaXMgc3RhZ2VcbiAgICovXG4gIGRlc3RydWN0aXZlQ2hhbmdlczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFN0YWdlUHJvY2Vzc29yIHByb2Nlc3NlcyBhIENESyBzdGFnZSBhbmQgY3JlYXRlcyBhIGNvbW1lbnQgb24gdGhlIEdpdEh1YiBQUlxuICogZGV0YWlsaW5nIHRoZSBzdGFjayBkaWZmc1xuICovXG5leHBvcnQgY2xhc3MgU3RhZ2VQcm9jZXNzb3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWdlQ29tbWVudHM6IHsgW3N0YWdlTmFtZTogc3RyaW5nXTogU3RhZ2VDb21tZW50IH0gPSB7fTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGFnZXM6IFN0YWdlSW5mb1tdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dlZERlc3Ryb3lUeXBlczogc3RyaW5nW10sXG4gICkge1xuICAgIHRoaXMuc3RhZ2VzLmZvckVhY2goc3RhZ2UgPT4ge1xuICAgICAgdGhpcy5zdGFnZUNvbW1lbnRzW3N0YWdlLm5hbWVdID0ge1xuICAgICAgICBkZXN0cnVjdGl2ZUNoYW5nZXM6IDAsXG4gICAgICAgIGNvbW1lbnQ6IFtdLFxuICAgICAgICBoYXNoOiBtZDVIYXNoKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBzdGFnZU5hbWU6IHN0YWdlLm5hbWUsXG4gICAgICAgICAgLi4uc3RhZ2Uuc3RhY2tzLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgICAgcHJldi5zdGFja3MucHVzaCh7XG4gICAgICAgICAgICAgIG5hbWU6IGN1cnIubmFtZSxcbiAgICAgICAgICAgICAgbG9va3VwUm9sZTogY3Vyci5sb29rdXBSb2xlLFxuICAgICAgICAgICAgICByZWdpb246IGN1cnIucmVnaW9uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgICB9LCB7IHN0YWNrczogW10gfSBhcyB7IHN0YWNrczogT21pdDxTdGFja0luZm8sICdjb250ZW50Jz5bXSB9KSwgLy8gd2UgZG9uJ3Qgd2FudCB0aGUgY29udGVudCB0byBiZSBwYXJ0IG9mIHRoZSBoYXNoXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhbGwgb2YgdGhlIHN0YWdlcy4gT25jZSB0aGlzIGhhcyBiZWVuIHJ1blxuICAgKiB0aGUgY29tbWVudCBjYW4gYmUgY3JlYXRlZCB3aXRoIGBjb21tZW50U3RhZ2VzKClgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJvY2Vzc1N0YWdlcygpIHtcbiAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIHRoaXMuc3RhZ2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIHN0YWdlLnN0YWNrcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgY29tbWVudCwgY2hhbmdlcyB9ID0gYXdhaXQgdGhpcy5kaWZmU3RhY2soc3RhY2spO1xuICAgICAgICAgIHRoaXMuc3RhZ2VDb21tZW50c1tzdGFnZS5uYW1lXS5jb21tZW50LnB1c2goLi4uY29tbWVudCk7XG4gICAgICAgICAgdGhpcy5zdGFnZUNvbW1lbnRzW3N0YWdlLm5hbWVdLmRlc3RydWN0aXZlQ2hhbmdlcyArPSBjaGFuZ2VzO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIHN0YWdlczogJywgZSk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIEdpdEh1YiBjb21tZW50IGZvciB0aGUgc3RhZ2VcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb21tZW50U3RhZ2VzKGNvbW1lbnRzOiBDb21tZW50cykge1xuICAgIGZvciAoY29uc3QgW3N0YWdlTmFtZSwgaW5mb10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdGFnZUNvbW1lbnRzKSkge1xuICAgICAgY29uc3Qgc3RhZ2VDb21tZW50ID0gdGhpcy5nZXRDb21tZW50Rm9yU3RhZ2Uoc3RhZ2VOYW1lKTtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gYXdhaXQgY29tbWVudHMuZmluZFByZXZpb3VzKGluZm8uaGFzaCk7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgYXdhaXQgY29tbWVudHMudXBkYXRlQ29tbWVudChwcmV2aW91cywgaW5mby5oYXNoLCBzdGFnZUNvbW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgY29tbWVudHMuY3JlYXRlQ29tbWVudChpbmZvLmhhc2gsIHN0YWdlQ29tbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlcmUgYXJlIGRlc3RydWN0aXZlIGNoYW5nZXMgaW4gdGhpcyBzdGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBoYXNEZXN0cnVjdGl2ZUNoYW5nZXMoKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBjb21tZW50cyBvZiBPYmplY3QudmFsdWVzKHRoaXMuc3RhZ2VDb21tZW50cykpIHtcbiAgICAgIGlmIChjb21tZW50cy5kZXN0cnVjdGl2ZUNoYW5nZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlmZlN0YWNrKHN0YWNrOiBTdGFja0luZm8pOiBQcm9taXNlPHtjb21tZW50OiBzdHJpbmdbXTsgY2hhbmdlczogbnVtYmVyfT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFja0RpZmYgPSBuZXcgU3RhY2tEaWZmKHN0YWNrLCB0aGlzLmFsbG93ZWREZXN0cm95VHlwZXMpO1xuICAgICAgY29uc3QgeyBkaWZmLCBjaGFuZ2VzIH0gPSBhd2FpdCBzdGFja0RpZmYuZGlmZlN0YWNrKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tZW50OiB0aGlzLmZvcm1hdFN0YWNrQ29tbWVudChzdGFjay5uYW1lLCBkaWZmLCBjaGFuZ2VzKSxcbiAgICAgICAgY2hhbmdlczogY2hhbmdlcy5kZXN0cnVjdGl2ZUNoYW5nZXMubGVuZ3RoLFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGVyZm9ybWluZyBzdGFjayBkaWZmOiAnLCBlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbW9qaShjaGFuZ2VzOiBDaGFuZ2VEZXRhaWxzKTogc3RyaW5nIHtcbiAgICBpZiAoY2hhbmdlcy5kZXN0cnVjdGl2ZUNoYW5nZXMubGVuZ3RoIHx8IGNoYW5nZXMucmVtb3ZlZFJlc291cmNlcykge1xuICAgICAgcmV0dXJuICc6eDonO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlcy51cGRhdGVkUmVzb3VyY2VzKSB7XG4gICAgICByZXR1cm4gJzp5ZWxsb3dfY2lyY2xlOic7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VzLmNyZWF0ZWRSZXNvdXJjZXMpIHtcbiAgICAgIHJldHVybiAnOnNwYXJrbGU6JztcbiAgICB9XG4gICAgcmV0dXJuICc6d2hpdGVfY2hlY2tfbWFyazonO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRTdGFja0NvbW1lbnQoc3RhY2tOYW1lOiBzdHJpbmcsIGRpZmY6IFRlbXBsYXRlRGlmZiwgY2hhbmdlczogQ2hhbmdlRGV0YWlscyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBvdXRwdXQ6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZW1vamkgPSB0aGlzLmdldEVtb2ppKGNoYW5nZXMpO1xuICAgIGlmIChkaWZmLmlzRW1wdHkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGBObyBDaGFuZ2VzIGZvciBzdGFjazogJHtzdGFja05hbWV9YCk7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbiAgICBvdXRwdXQucHVzaCguLi5bXG4gICAgICBgIyMjIyBEaWZmIGZvciBzdGFjazogJHtzdGFja05hbWV9IC0gYCtcbiAgICAgICAgYCoqKiR7Y2hhbmdlcy5jcmVhdGVkUmVzb3VyY2VzfSB0byBhZGQsICR7Y2hhbmdlcy51cGRhdGVkUmVzb3VyY2VzfSB0byB1cGRhdGUsICR7Y2hhbmdlcy5yZW1vdmVkUmVzb3VyY2VzfSB0byBkZXN0cm95KioqICBgK1xuICAgICAgICBlbW9qaSxcbiAgICAgICc8ZGV0YWlscz48c3VtbWFyeT5EZXRhaWxzPC9zdW1tYXJ5PicsXG4gICAgICAnJyxcbiAgICBdKTtcbiAgICBpZiAoY2hhbmdlcy5kZXN0cnVjdGl2ZUNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICBvdXRwdXQucHVzaCgnPiBbIVdBUk5JTkddXFxuPiAqKipEZXN0cnVjdGl2ZSBDaGFuZ2VzKioqIDpiYW5nYmFuZzonKSxcbiAgICAgIGNoYW5nZXMuZGVzdHJ1Y3RpdmVDaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgICAgb3V0cHV0LnB1c2goXG4gICAgICAgICAgYD4gKipTdGFjazogJHtjaGFuZ2Uuc3RhY2tOYW1lfSAtIFJlc291cmNlOiAke2NoYW5nZS5sb2dpY2FsSWR9IC0gSW1wYWN0OioqICoqKiR7Y2hhbmdlLmltcGFjdH0qKipgLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFN0cmluZ1dyaXRhYmxlKHt9KTtcbiAgICBmb3JtYXREaWZmZXJlbmNlcyh3cml0YWJsZSwgZGlmZik7XG5cbiAgICBvdXRwdXQucHVzaCgnYGBgc2hlbGwnKTtcbiAgICBvdXRwdXQucHVzaCh3cml0YWJsZS5kYXRhKTtcbiAgICBvdXRwdXQucHVzaCgnYGBgJyk7XG4gICAgb3V0cHV0LnB1c2goJzwvZGV0YWlscz4nKTtcbiAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBnZXRDb21tZW50Rm9yU3RhZ2Uoc3RhZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgb3V0cHV0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHN0YWdlQ29tbWVudHMgPSB0aGlzLnN0YWdlQ29tbWVudHNbc3RhZ2VOYW1lXTtcbiAgICBpZiAoIXN0YWdlQ29tbWVudHMuY29tbWVudC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICAgIG91dHB1dC5wdXNoKGAjIyMgRGlmZiBmb3Igc3RhZ2U6ICR7c3RhZ2VOYW1lfWApO1xuXG4gICAgaWYgKHN0YWdlQ29tbWVudHMuZGVzdHJ1Y3RpdmVDaGFuZ2VzKSB7XG4gICAgICBvdXRwdXQucHVzaChgPiBbIVdBUk5JTkddXFxuPiAke3N0YWdlQ29tbWVudHMuZGVzdHJ1Y3RpdmVDaGFuZ2VzfSBEZXN0cnVjdGl2ZSBDaGFuZ2VzYCk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQuY29uY2F0KHN0YWdlQ29tbWVudHMuY29tbWVudCk7XG4gIH1cbn1cblxuY2xhc3MgU3RyaW5nV3JpdGFibGUgZXh0ZW5kcyBXcml0YWJsZSB7XG4gIHB1YmxpYyBkYXRhOiBzdHJpbmc7XG4gIHByaXZhdGUgX2RlY29kZXI6IFN0cmluZ0RlY29kZXI7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFdyaXRhYmxlT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcigpO1xuICAgIHRoaXMuZGF0YSA9ICcnO1xuICB9XG5cbiAgX3dyaXRlKGNodW5rOiBhbnksIGVuY29kaW5nOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICdidWZmZXInKSB7XG4gICAgICBjaHVuayA9IHRoaXMuX2RlY29kZXIud3JpdGUoY2h1bmspO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YSArPSBjaHVuaztcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX2ZpbmFsKGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEgKz0gdGhpcy5fZGVjb2Rlci5lbmQoKTtcbiAgICBjYWxsYmFjaygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1kNUhhc2godmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZSh2YWwpLmRpZ2VzdCgnaGV4Jyk7XG59O1xuIl19","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.issue = exports.issueCommand = void 0;\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\n/**\n * Commands\n *\n * Command Format:\n * ::name key=value,key=value::message\n *\n * Examples:\n * ::warning::This is the message\n * ::set-env name=MY_VAR::some value\n */\nfunction issueCommand(command, properties, message) {\n const cmd = new Command(command, properties, message);\n process.stdout.write(cmd.toString() + os.EOL);\n}\nexports.issueCommand = issueCommand;\nfunction issue(name, message = '') {\n issueCommand(name, {}, message);\n}\nexports.issue = issue;\nconst CMD_STRING = '::';\nclass Command {\n constructor(command, properties, message) {\n if (!command) {\n command = 'missing.command';\n }\n this.command = command;\n this.properties = properties;\n this.message = message;\n }\n toString() {\n let cmdStr = CMD_STRING + this.command;\n if (this.properties && Object.keys(this.properties).length > 0) {\n cmdStr += ' ';\n let first = true;\n for (const key in this.properties) {\n if (this.properties.hasOwnProperty(key)) {\n const val = this.properties[key];\n if (val) {\n if (first) {\n first = false;\n }\n else {\n cmdStr += ',';\n }\n cmdStr += `${key}=${escapeProperty(val)}`;\n }\n }\n }\n }\n cmdStr += `${CMD_STRING}${escapeData(this.message)}`;\n return cmdStr;\n }\n}\nfunction escapeData(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A');\n}\nfunction escapeProperty(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n//# sourceMappingURL=command.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0;\nconst command_1 = require(\"./command\");\nconst file_command_1 = require(\"./file-command\");\nconst utils_1 = require(\"./utils\");\nconst os = __importStar(require(\"os\"));\nconst path = __importStar(require(\"path\"));\nconst oidc_utils_1 = require(\"./oidc-utils\");\n/**\n * The code to exit an action\n */\nvar ExitCode;\n(function (ExitCode) {\n /**\n * A code indicating that the action was successful\n */\n ExitCode[ExitCode[\"Success\"] = 0] = \"Success\";\n /**\n * A code indicating that the action was a failure\n */\n ExitCode[ExitCode[\"Failure\"] = 1] = \"Failure\";\n})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));\n//-----------------------------------------------------------------------\n// Variables\n//-----------------------------------------------------------------------\n/**\n * Sets env variable for this action and future actions in the job\n * @param name the name of the variable to set\n * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction exportVariable(name, val) {\n const convertedVal = utils_1.toCommandValue(val);\n process.env[name] = convertedVal;\n const filePath = process.env['GITHUB_ENV'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));\n }\n command_1.issueCommand('set-env', { name }, convertedVal);\n}\nexports.exportVariable = exportVariable;\n/**\n * Registers a secret which will get masked from logs\n * @param secret value of the secret\n */\nfunction setSecret(secret) {\n command_1.issueCommand('add-mask', {}, secret);\n}\nexports.setSecret = setSecret;\n/**\n * Prepends inputPath to the PATH (for this action and future actions)\n * @param inputPath\n */\nfunction addPath(inputPath) {\n const filePath = process.env['GITHUB_PATH'] || '';\n if (filePath) {\n file_command_1.issueFileCommand('PATH', inputPath);\n }\n else {\n command_1.issueCommand('add-path', {}, inputPath);\n }\n process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;\n}\nexports.addPath = addPath;\n/**\n * Gets the value of an input.\n * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed.\n * Returns an empty string if the value is not defined.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string\n */\nfunction getInput(name, options) {\n const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';\n if (options && options.required && !val) {\n throw new Error(`Input required and not supplied: ${name}`);\n }\n if (options && options.trimWhitespace === false) {\n return val;\n }\n return val.trim();\n}\nexports.getInput = getInput;\n/**\n * Gets the values of an multiline input. Each value is also trimmed.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string[]\n *\n */\nfunction getMultilineInput(name, options) {\n const inputs = getInput(name, options)\n .split('\\n')\n .filter(x => x !== '');\n if (options && options.trimWhitespace === false) {\n return inputs;\n }\n return inputs.map(input => input.trim());\n}\nexports.getMultilineInput = getMultilineInput;\n/**\n * Gets the input value of the boolean type in the YAML 1.2 \"core schema\" specification.\n * Support boolean input list: `true | True | TRUE | false | False | FALSE` .\n * The return value is also in boolean type.\n * ref: https://yaml.org/spec/1.2/spec.html#id2804923\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns boolean\n */\nfunction getBooleanInput(name, options) {\n const trueValue = ['true', 'True', 'TRUE'];\n const falseValue = ['false', 'False', 'FALSE'];\n const val = getInput(name, options);\n if (trueValue.includes(val))\n return true;\n if (falseValue.includes(val))\n return false;\n throw new TypeError(`Input does not meet YAML 1.2 \"Core Schema\" specification: ${name}\\n` +\n `Support boolean input list: \\`true | True | TRUE | false | False | FALSE\\``);\n}\nexports.getBooleanInput = getBooleanInput;\n/**\n * Sets the value of an output.\n *\n * @param name name of the output to set\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setOutput(name, value) {\n const filePath = process.env['GITHUB_OUTPUT'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));\n }\n process.stdout.write(os.EOL);\n command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));\n}\nexports.setOutput = setOutput;\n/**\n * Enables or disables the echoing of commands into stdout for the rest of the step.\n * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set.\n *\n */\nfunction setCommandEcho(enabled) {\n command_1.issue('echo', enabled ? 'on' : 'off');\n}\nexports.setCommandEcho = setCommandEcho;\n//-----------------------------------------------------------------------\n// Results\n//-----------------------------------------------------------------------\n/**\n * Sets the action status to failed.\n * When the action exits it will be with an exit code of 1\n * @param message add error issue message\n */\nfunction setFailed(message) {\n process.exitCode = ExitCode.Failure;\n error(message);\n}\nexports.setFailed = setFailed;\n//-----------------------------------------------------------------------\n// Logging Commands\n//-----------------------------------------------------------------------\n/**\n * Gets whether Actions Step Debug is on or not\n */\nfunction isDebug() {\n return process.env['RUNNER_DEBUG'] === '1';\n}\nexports.isDebug = isDebug;\n/**\n * Writes debug message to user log\n * @param message debug message\n */\nfunction debug(message) {\n command_1.issueCommand('debug', {}, message);\n}\nexports.debug = debug;\n/**\n * Adds an error issue\n * @param message error issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction error(message, properties = {}) {\n command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.error = error;\n/**\n * Adds a warning issue\n * @param message warning issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction warning(message, properties = {}) {\n command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.warning = warning;\n/**\n * Adds a notice issue\n * @param message notice issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction notice(message, properties = {}) {\n command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.notice = notice;\n/**\n * Writes info to log with console.log.\n * @param message info message\n */\nfunction info(message) {\n process.stdout.write(message + os.EOL);\n}\nexports.info = info;\n/**\n * Begin an output group.\n *\n * Output until the next `groupEnd` will be foldable in this group\n *\n * @param name The name of the output group\n */\nfunction startGroup(name) {\n command_1.issue('group', name);\n}\nexports.startGroup = startGroup;\n/**\n * End an output group.\n */\nfunction endGroup() {\n command_1.issue('endgroup');\n}\nexports.endGroup = endGroup;\n/**\n * Wrap an asynchronous function call in a group.\n *\n * Returns the same type as the function itself.\n *\n * @param name The name of the group\n * @param fn The function to wrap in the group\n */\nfunction group(name, fn) {\n return __awaiter(this, void 0, void 0, function* () {\n startGroup(name);\n let result;\n try {\n result = yield fn();\n }\n finally {\n endGroup();\n }\n return result;\n });\n}\nexports.group = group;\n//-----------------------------------------------------------------------\n// Wrapper action state\n//-----------------------------------------------------------------------\n/**\n * Saves state for current action, the state can only be retrieved by this action's post job execution.\n *\n * @param name name of the state to store\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction saveState(name, value) {\n const filePath = process.env['GITHUB_STATE'] || '';\n if (filePath) {\n return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));\n }\n command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));\n}\nexports.saveState = saveState;\n/**\n * Gets the value of an state set by this action's main execution.\n *\n * @param name name of the state to get\n * @returns string\n */\nfunction getState(name) {\n return process.env[`STATE_${name}`] || '';\n}\nexports.getState = getState;\nfunction getIDToken(aud) {\n return __awaiter(this, void 0, void 0, function* () {\n return yield oidc_utils_1.OidcClient.getIDToken(aud);\n });\n}\nexports.getIDToken = getIDToken;\n/**\n * Summary exports\n */\nvar summary_1 = require(\"./summary\");\nObject.defineProperty(exports, \"summary\", { enumerable: true, get: function () { return summary_1.summary; } });\n/**\n * @deprecated use core.summary\n */\nvar summary_2 = require(\"./summary\");\nObject.defineProperty(exports, \"markdownSummary\", { enumerable: true, get: function () { return summary_2.markdownSummary; } });\n/**\n * Path exports\n */\nvar path_utils_1 = require(\"./path-utils\");\nObject.defineProperty(exports, \"toPosixPath\", { enumerable: true, get: function () { return path_utils_1.toPosixPath; } });\nObject.defineProperty(exports, \"toWin32Path\", { enumerable: true, get: function () { return path_utils_1.toWin32Path; } });\nObject.defineProperty(exports, \"toPlatformPath\", { enumerable: true, get: function () { return path_utils_1.toPlatformPath; } });\n//# sourceMappingURL=core.js.map","\"use strict\";\n// For internal use, subject to change.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.prepareKeyValueMessage = exports.issueFileCommand = void 0;\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst fs = __importStar(require(\"fs\"));\nconst os = __importStar(require(\"os\"));\nconst uuid_1 = require(\"uuid\");\nconst utils_1 = require(\"./utils\");\nfunction issueFileCommand(command, message) {\n const filePath = process.env[`GITHUB_${command}`];\n if (!filePath) {\n throw new Error(`Unable to find environment variable for file command ${command}`);\n }\n if (!fs.existsSync(filePath)) {\n throw new Error(`Missing file at path: ${filePath}`);\n }\n fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, {\n encoding: 'utf8'\n });\n}\nexports.issueFileCommand = issueFileCommand;\nfunction prepareKeyValueMessage(key, value) {\n const delimiter = `ghadelimiter_${uuid_1.v4()}`;\n const convertedValue = utils_1.toCommandValue(value);\n // These should realistically never happen, but just in case someone finds a\n // way to exploit uuid generation let's not allow keys or values that contain\n // the delimiter.\n if (key.includes(delimiter)) {\n throw new Error(`Unexpected input: name should not contain the delimiter \"${delimiter}\"`);\n }\n if (convertedValue.includes(delimiter)) {\n throw new Error(`Unexpected input: value should not contain the delimiter \"${delimiter}\"`);\n }\n return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;\n}\nexports.prepareKeyValueMessage = prepareKeyValueMessage;\n//# sourceMappingURL=file-command.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OidcClient = void 0;\nconst http_client_1 = require(\"@actions/http-client\");\nconst auth_1 = require(\"@actions/http-client/lib/auth\");\nconst core_1 = require(\"./core\");\nclass OidcClient {\n static createHttpClient(allowRetry = true, maxRetry = 10) {\n const requestOptions = {\n allowRetries: allowRetry,\n maxRetries: maxRetry\n };\n return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions);\n }\n static getRequestToken() {\n const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN'];\n if (!token) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable');\n }\n return token;\n }\n static getIDTokenUrl() {\n const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL'];\n if (!runtimeUrl) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable');\n }\n return runtimeUrl;\n }\n static getCall(id_token_url) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const httpclient = OidcClient.createHttpClient();\n const res = yield httpclient\n .getJson(id_token_url)\n .catch(error => {\n throw new Error(`Failed to get ID Token. \\n \n Error Code : ${error.statusCode}\\n \n Error Message: ${error.message}`);\n });\n const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;\n if (!id_token) {\n throw new Error('Response json body do not have ID Token field');\n }\n return id_token;\n });\n }\n static getIDToken(audience) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n // New ID Token is requested from action service\n let id_token_url = OidcClient.getIDTokenUrl();\n if (audience) {\n const encodedAudience = encodeURIComponent(audience);\n id_token_url = `${id_token_url}&audience=${encodedAudience}`;\n }\n core_1.debug(`ID token url is ${id_token_url}`);\n const id_token = yield OidcClient.getCall(id_token_url);\n core_1.setSecret(id_token);\n return id_token;\n }\n catch (error) {\n throw new Error(`Error message: ${error.message}`);\n }\n });\n }\n}\nexports.OidcClient = OidcClient;\n//# sourceMappingURL=oidc-utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0;\nconst path = __importStar(require(\"path\"));\n/**\n * toPosixPath converts the given path to the posix form. On Windows, \\\\ will be\n * replaced with /.\n *\n * @param pth. Path to transform.\n * @return string Posix path.\n */\nfunction toPosixPath(pth) {\n return pth.replace(/[\\\\]/g, '/');\n}\nexports.toPosixPath = toPosixPath;\n/**\n * toWin32Path converts the given path to the win32 form. On Linux, / will be\n * replaced with \\\\.\n *\n * @param pth. Path to transform.\n * @return string Win32 path.\n */\nfunction toWin32Path(pth) {\n return pth.replace(/[/]/g, '\\\\');\n}\nexports.toWin32Path = toWin32Path;\n/**\n * toPlatformPath converts the given path to a platform-specific path. It does\n * this by replacing instances of / and \\ with the platform-specific path\n * separator.\n *\n * @param pth The path to platformize.\n * @return string The platform-specific path.\n */\nfunction toPlatformPath(pth) {\n return pth.replace(/[/\\\\]/g, path.sep);\n}\nexports.toPlatformPath = toPlatformPath;\n//# sourceMappingURL=path-utils.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0;\nconst os_1 = require(\"os\");\nconst fs_1 = require(\"fs\");\nconst { access, appendFile, writeFile } = fs_1.promises;\nexports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY';\nexports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary';\nclass Summary {\n constructor() {\n this._buffer = '';\n }\n /**\n * Finds the summary file path from the environment, rejects if env var is not found or file does not exist\n * Also checks r/w permissions.\n *\n * @returns step summary file path\n */\n filePath() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._filePath) {\n return this._filePath;\n }\n const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR];\n if (!pathFromEnv) {\n throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`);\n }\n try {\n yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK);\n }\n catch (_a) {\n throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`);\n }\n this._filePath = pathFromEnv;\n return this._filePath;\n });\n }\n /**\n * Wraps content in an HTML tag, adding any HTML attributes\n *\n * @param {string} tag HTML tag to wrap\n * @param {string | null} content content within the tag\n * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add\n *\n * @returns {string} content wrapped in HTML element\n */\n wrap(tag, content, attrs = {}) {\n const htmlAttrs = Object.entries(attrs)\n .map(([key, value]) => ` ${key}=\"${value}\"`)\n .join('');\n if (!content) {\n return `<${tag}${htmlAttrs}>`;\n }\n return `<${tag}${htmlAttrs}>${content}`;\n }\n /**\n * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default.\n *\n * @param {SummaryWriteOptions} [options] (optional) options for write operation\n *\n * @returns {Promise} summary instance\n */\n write(options) {\n return __awaiter(this, void 0, void 0, function* () {\n const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite);\n const filePath = yield this.filePath();\n const writeFunc = overwrite ? writeFile : appendFile;\n yield writeFunc(filePath, this._buffer, { encoding: 'utf8' });\n return this.emptyBuffer();\n });\n }\n /**\n * Clears the summary buffer and wipes the summary file\n *\n * @returns {Summary} summary instance\n */\n clear() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.emptyBuffer().write({ overwrite: true });\n });\n }\n /**\n * Returns the current summary buffer as a string\n *\n * @returns {string} string of summary buffer\n */\n stringify() {\n return this._buffer;\n }\n /**\n * If the summary buffer is empty\n *\n * @returns {boolen} true if the buffer is empty\n */\n isEmptyBuffer() {\n return this._buffer.length === 0;\n }\n /**\n * Resets the summary buffer without writing to summary file\n *\n * @returns {Summary} summary instance\n */\n emptyBuffer() {\n this._buffer = '';\n return this;\n }\n /**\n * Adds raw text to the summary buffer\n *\n * @param {string} text content to add\n * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false)\n *\n * @returns {Summary} summary instance\n */\n addRaw(text, addEOL = false) {\n this._buffer += text;\n return addEOL ? this.addEOL() : this;\n }\n /**\n * Adds the operating system-specific end-of-line marker to the buffer\n *\n * @returns {Summary} summary instance\n */\n addEOL() {\n return this.addRaw(os_1.EOL);\n }\n /**\n * Adds an HTML codeblock to the summary buffer\n *\n * @param {string} code content to render within fenced code block\n * @param {string} lang (optional) language to syntax highlight code\n *\n * @returns {Summary} summary instance\n */\n addCodeBlock(code, lang) {\n const attrs = Object.assign({}, (lang && { lang }));\n const element = this.wrap('pre', this.wrap('code', code), attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML list to the summary buffer\n *\n * @param {string[]} items list of items to render\n * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false)\n *\n * @returns {Summary} summary instance\n */\n addList(items, ordered = false) {\n const tag = ordered ? 'ol' : 'ul';\n const listItems = items.map(item => this.wrap('li', item)).join('');\n const element = this.wrap(tag, listItems);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML table to the summary buffer\n *\n * @param {SummaryTableCell[]} rows table rows\n *\n * @returns {Summary} summary instance\n */\n addTable(rows) {\n const tableBody = rows\n .map(row => {\n const cells = row\n .map(cell => {\n if (typeof cell === 'string') {\n return this.wrap('td', cell);\n }\n const { header, data, colspan, rowspan } = cell;\n const tag = header ? 'th' : 'td';\n const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan }));\n return this.wrap(tag, data, attrs);\n })\n .join('');\n return this.wrap('tr', cells);\n })\n .join('');\n const element = this.wrap('table', tableBody);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds a collapsable HTML details element to the summary buffer\n *\n * @param {string} label text for the closed state\n * @param {string} content collapsable content\n *\n * @returns {Summary} summary instance\n */\n addDetails(label, content) {\n const element = this.wrap('details', this.wrap('summary', label) + content);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML image tag to the summary buffer\n *\n * @param {string} src path to the image you to embed\n * @param {string} alt text description of the image\n * @param {SummaryImageOptions} options (optional) addition image attributes\n *\n * @returns {Summary} summary instance\n */\n addImage(src, alt, options) {\n const { width, height } = options || {};\n const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height }));\n const element = this.wrap('img', null, Object.assign({ src, alt }, attrs));\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML section heading element\n *\n * @param {string} text heading text\n * @param {number | string} [level=1] (optional) the heading level, default: 1\n *\n * @returns {Summary} summary instance\n */\n addHeading(text, level) {\n const tag = `h${level}`;\n const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag)\n ? tag\n : 'h1';\n const element = this.wrap(allowedTag, text);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML thematic break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addSeparator() {\n const element = this.wrap('hr', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML line break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addBreak() {\n const element = this.wrap('br', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML blockquote to the summary buffer\n *\n * @param {string} text quote text\n * @param {string} cite (optional) citation url\n *\n * @returns {Summary} summary instance\n */\n addQuote(text, cite) {\n const attrs = Object.assign({}, (cite && { cite }));\n const element = this.wrap('blockquote', text, attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML anchor tag to the summary buffer\n *\n * @param {string} text link text/content\n * @param {string} href hyperlink\n *\n * @returns {Summary} summary instance\n */\n addLink(text, href) {\n const element = this.wrap('a', text, { href });\n return this.addRaw(element).addEOL();\n }\n}\nconst _summary = new Summary();\n/**\n * @deprecated use `core.summary`\n */\nexports.markdownSummary = _summary;\nexports.summary = _summary;\n//# sourceMappingURL=summary.js.map","\"use strict\";\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toCommandProperties = exports.toCommandValue = void 0;\n/**\n * Sanitizes an input into a string so it can be passed into issueCommand safely\n * @param input input to sanitize into a string\n */\nfunction toCommandValue(input) {\n if (input === null || input === undefined) {\n return '';\n }\n else if (typeof input === 'string' || input instanceof String) {\n return input;\n }\n return JSON.stringify(input);\n}\nexports.toCommandValue = toCommandValue;\n/**\n *\n * @param annotationProperties\n * @returns The command properties to send with the actual annotation command\n * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646\n */\nfunction toCommandProperties(annotationProperties) {\n if (!Object.keys(annotationProperties).length) {\n return {};\n }\n return {\n title: annotationProperties.title,\n file: annotationProperties.file,\n line: annotationProperties.startLine,\n endLine: annotationProperties.endLine,\n col: annotationProperties.startColumn,\n endColumn: annotationProperties.endColumn\n };\n}\nexports.toCommandProperties = toCommandProperties;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Context = void 0;\nconst fs_1 = require(\"fs\");\nconst os_1 = require(\"os\");\nclass Context {\n /**\n * Hydrate the context from the environment\n */\n constructor() {\n var _a, _b, _c;\n this.payload = {};\n if (process.env.GITHUB_EVENT_PATH) {\n if ((0, fs_1.existsSync)(process.env.GITHUB_EVENT_PATH)) {\n this.payload = JSON.parse((0, fs_1.readFileSync)(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' }));\n }\n else {\n const path = process.env.GITHUB_EVENT_PATH;\n process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`);\n }\n }\n this.eventName = process.env.GITHUB_EVENT_NAME;\n this.sha = process.env.GITHUB_SHA;\n this.ref = process.env.GITHUB_REF;\n this.workflow = process.env.GITHUB_WORKFLOW;\n this.action = process.env.GITHUB_ACTION;\n this.actor = process.env.GITHUB_ACTOR;\n this.job = process.env.GITHUB_JOB;\n this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10);\n this.runId = parseInt(process.env.GITHUB_RUN_ID, 10);\n this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`;\n this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`;\n this.graphqlUrl =\n (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`;\n }\n get issue() {\n const payload = this.payload;\n return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number });\n }\n get repo() {\n if (process.env.GITHUB_REPOSITORY) {\n const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');\n return { owner, repo };\n }\n if (this.payload.repository) {\n return {\n owner: this.payload.repository.owner.login,\n repo: this.payload.repository.name\n };\n }\n throw new Error(\"context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'\");\n }\n}\nexports.Context = Context;\n//# sourceMappingURL=context.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getOctokit = exports.context = void 0;\nconst Context = __importStar(require(\"./context\"));\nconst utils_1 = require(\"./utils\");\nexports.context = new Context.Context();\n/**\n * Returns a hydrated octokit ready to use for GitHub Actions\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokit(token, options, ...additionalPlugins) {\n const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins);\n return new GitHubWithPlugins((0, utils_1.getOctokitOptions)(token, options));\n}\nexports.getOctokit = getOctokit;\n//# sourceMappingURL=github.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getApiBaseUrl = exports.getProxyFetch = exports.getProxyAgentDispatcher = exports.getProxyAgent = exports.getAuthString = void 0;\nconst httpClient = __importStar(require(\"@actions/http-client\"));\nconst undici_1 = require(\"undici\");\nfunction getAuthString(token, options) {\n if (!token && !options.auth) {\n throw new Error('Parameter token or opts.auth is required');\n }\n else if (token && options.auth) {\n throw new Error('Parameters token and opts.auth may not both be specified');\n }\n return typeof options.auth === 'string' ? options.auth : `token ${token}`;\n}\nexports.getAuthString = getAuthString;\nfunction getProxyAgent(destinationUrl) {\n const hc = new httpClient.HttpClient();\n return hc.getAgent(destinationUrl);\n}\nexports.getProxyAgent = getProxyAgent;\nfunction getProxyAgentDispatcher(destinationUrl) {\n const hc = new httpClient.HttpClient();\n return hc.getAgentDispatcher(destinationUrl);\n}\nexports.getProxyAgentDispatcher = getProxyAgentDispatcher;\nfunction getProxyFetch(destinationUrl) {\n const httpDispatcher = getProxyAgentDispatcher(destinationUrl);\n const proxyFetch = (url, opts) => __awaiter(this, void 0, void 0, function* () {\n return (0, undici_1.fetch)(url, Object.assign(Object.assign({}, opts), { dispatcher: httpDispatcher }));\n });\n return proxyFetch;\n}\nexports.getProxyFetch = getProxyFetch;\nfunction getApiBaseUrl() {\n return process.env['GITHUB_API_URL'] || 'https://api.github.com';\n}\nexports.getApiBaseUrl = getApiBaseUrl;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0;\nconst Context = __importStar(require(\"./context\"));\nconst Utils = __importStar(require(\"./internal/utils\"));\n// octokit + plugins\nconst core_1 = require(\"@octokit/core\");\nconst plugin_rest_endpoint_methods_1 = require(\"@octokit/plugin-rest-endpoint-methods\");\nconst plugin_paginate_rest_1 = require(\"@octokit/plugin-paginate-rest\");\nexports.context = new Context.Context();\nconst baseUrl = Utils.getApiBaseUrl();\nexports.defaults = {\n baseUrl,\n request: {\n agent: Utils.getProxyAgent(baseUrl),\n fetch: Utils.getProxyFetch(baseUrl)\n }\n};\nexports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults);\n/**\n * Convience function to correctly format Octokit Options to pass into the constructor.\n *\n * @param token the repo PAT or GITHUB_TOKEN\n * @param options other options to set\n */\nfunction getOctokitOptions(token, options) {\n const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller\n // Auth\n const auth = Utils.getAuthString(token, opts);\n if (auth) {\n opts.auth = auth;\n }\n return opts;\n}\nexports.getOctokitOptions = getOctokitOptions;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0;\nclass BasicCredentialHandler {\n constructor(username, password) {\n this.username = username;\n this.password = password;\n }\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BasicCredentialHandler = BasicCredentialHandler;\nclass BearerCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Bearer ${this.token}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BearerCredentialHandler = BearerCredentialHandler;\nclass PersonalAccessTokenCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;\n//# sourceMappingURL=auth.js.map","\"use strict\";\n/* eslint-disable @typescript-eslint/no-explicit-any */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0;\nconst http = __importStar(require(\"http\"));\nconst https = __importStar(require(\"https\"));\nconst pm = __importStar(require(\"./proxy\"));\nconst tunnel = __importStar(require(\"tunnel\"));\nconst undici_1 = require(\"undici\");\nvar HttpCodes;\n(function (HttpCodes) {\n HttpCodes[HttpCodes[\"OK\"] = 200] = \"OK\";\n HttpCodes[HttpCodes[\"MultipleChoices\"] = 300] = \"MultipleChoices\";\n HttpCodes[HttpCodes[\"MovedPermanently\"] = 301] = \"MovedPermanently\";\n HttpCodes[HttpCodes[\"ResourceMoved\"] = 302] = \"ResourceMoved\";\n HttpCodes[HttpCodes[\"SeeOther\"] = 303] = \"SeeOther\";\n HttpCodes[HttpCodes[\"NotModified\"] = 304] = \"NotModified\";\n HttpCodes[HttpCodes[\"UseProxy\"] = 305] = \"UseProxy\";\n HttpCodes[HttpCodes[\"SwitchProxy\"] = 306] = \"SwitchProxy\";\n HttpCodes[HttpCodes[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\n HttpCodes[HttpCodes[\"PermanentRedirect\"] = 308] = \"PermanentRedirect\";\n HttpCodes[HttpCodes[\"BadRequest\"] = 400] = \"BadRequest\";\n HttpCodes[HttpCodes[\"Unauthorized\"] = 401] = \"Unauthorized\";\n HttpCodes[HttpCodes[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n HttpCodes[HttpCodes[\"Forbidden\"] = 403] = \"Forbidden\";\n HttpCodes[HttpCodes[\"NotFound\"] = 404] = \"NotFound\";\n HttpCodes[HttpCodes[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\n HttpCodes[HttpCodes[\"NotAcceptable\"] = 406] = \"NotAcceptable\";\n HttpCodes[HttpCodes[\"ProxyAuthenticationRequired\"] = 407] = \"ProxyAuthenticationRequired\";\n HttpCodes[HttpCodes[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\n HttpCodes[HttpCodes[\"Conflict\"] = 409] = \"Conflict\";\n HttpCodes[HttpCodes[\"Gone\"] = 410] = \"Gone\";\n HttpCodes[HttpCodes[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\n HttpCodes[HttpCodes[\"InternalServerError\"] = 500] = \"InternalServerError\";\n HttpCodes[HttpCodes[\"NotImplemented\"] = 501] = \"NotImplemented\";\n HttpCodes[HttpCodes[\"BadGateway\"] = 502] = \"BadGateway\";\n HttpCodes[HttpCodes[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\n HttpCodes[HttpCodes[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\n})(HttpCodes || (exports.HttpCodes = HttpCodes = {}));\nvar Headers;\n(function (Headers) {\n Headers[\"Accept\"] = \"accept\";\n Headers[\"ContentType\"] = \"content-type\";\n})(Headers || (exports.Headers = Headers = {}));\nvar MediaTypes;\n(function (MediaTypes) {\n MediaTypes[\"ApplicationJson\"] = \"application/json\";\n})(MediaTypes || (exports.MediaTypes = MediaTypes = {}));\n/**\n * Returns the proxy URL, depending upon the supplied url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\nfunction getProxyUrl(serverUrl) {\n const proxyUrl = pm.getProxyUrl(new URL(serverUrl));\n return proxyUrl ? proxyUrl.href : '';\n}\nexports.getProxyUrl = getProxyUrl;\nconst HttpRedirectCodes = [\n HttpCodes.MovedPermanently,\n HttpCodes.ResourceMoved,\n HttpCodes.SeeOther,\n HttpCodes.TemporaryRedirect,\n HttpCodes.PermanentRedirect\n];\nconst HttpResponseRetryCodes = [\n HttpCodes.BadGateway,\n HttpCodes.ServiceUnavailable,\n HttpCodes.GatewayTimeout\n];\nconst RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];\nconst ExponentialBackoffCeiling = 10;\nconst ExponentialBackoffTimeSlice = 5;\nclass HttpClientError extends Error {\n constructor(message, statusCode) {\n super(message);\n this.name = 'HttpClientError';\n this.statusCode = statusCode;\n Object.setPrototypeOf(this, HttpClientError.prototype);\n }\n}\nexports.HttpClientError = HttpClientError;\nclass HttpClientResponse {\n constructor(message) {\n this.message = message;\n }\n readBody() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n let output = Buffer.alloc(0);\n this.message.on('data', (chunk) => {\n output = Buffer.concat([output, chunk]);\n });\n this.message.on('end', () => {\n resolve(output.toString());\n });\n }));\n });\n }\n readBodyBuffer() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n const chunks = [];\n this.message.on('data', (chunk) => {\n chunks.push(chunk);\n });\n this.message.on('end', () => {\n resolve(Buffer.concat(chunks));\n });\n }));\n });\n }\n}\nexports.HttpClientResponse = HttpClientResponse;\nfunction isHttps(requestUrl) {\n const parsedUrl = new URL(requestUrl);\n return parsedUrl.protocol === 'https:';\n}\nexports.isHttps = isHttps;\nclass HttpClient {\n constructor(userAgent, handlers, requestOptions) {\n this._ignoreSslError = false;\n this._allowRedirects = true;\n this._allowRedirectDowngrade = false;\n this._maxRedirects = 50;\n this._allowRetries = false;\n this._maxRetries = 1;\n this._keepAlive = false;\n this._disposed = false;\n this.userAgent = userAgent;\n this.handlers = handlers || [];\n this.requestOptions = requestOptions;\n if (requestOptions) {\n if (requestOptions.ignoreSslError != null) {\n this._ignoreSslError = requestOptions.ignoreSslError;\n }\n this._socketTimeout = requestOptions.socketTimeout;\n if (requestOptions.allowRedirects != null) {\n this._allowRedirects = requestOptions.allowRedirects;\n }\n if (requestOptions.allowRedirectDowngrade != null) {\n this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;\n }\n if (requestOptions.maxRedirects != null) {\n this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);\n }\n if (requestOptions.keepAlive != null) {\n this._keepAlive = requestOptions.keepAlive;\n }\n if (requestOptions.allowRetries != null) {\n this._allowRetries = requestOptions.allowRetries;\n }\n if (requestOptions.maxRetries != null) {\n this._maxRetries = requestOptions.maxRetries;\n }\n }\n }\n options(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});\n });\n }\n get(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('GET', requestUrl, null, additionalHeaders || {});\n });\n }\n del(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('DELETE', requestUrl, null, additionalHeaders || {});\n });\n }\n post(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('POST', requestUrl, data, additionalHeaders || {});\n });\n }\n patch(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('PATCH', requestUrl, data, additionalHeaders || {});\n });\n }\n put(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('PUT', requestUrl, data, additionalHeaders || {});\n });\n }\n head(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('HEAD', requestUrl, null, additionalHeaders || {});\n });\n }\n sendStream(verb, requestUrl, stream, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(verb, requestUrl, stream, additionalHeaders);\n });\n }\n /**\n * Gets a typed object from an endpoint\n * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise\n */\n getJson(requestUrl, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n const res = yield this.get(requestUrl, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n postJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.post(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n putJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.put(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n patchJson(requestUrl, obj, additionalHeaders = {}) {\n return __awaiter(this, void 0, void 0, function* () {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n const res = yield this.patch(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n /**\n * Makes a raw http request.\n * All other methods such as get, post, patch, and request ultimately call this.\n * Prefer get, del, post and patch\n */\n request(verb, requestUrl, data, headers) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._disposed) {\n throw new Error('Client has already been disposed.');\n }\n const parsedUrl = new URL(requestUrl);\n let info = this._prepareRequest(verb, parsedUrl, headers);\n // Only perform retries on reads since writes may not be idempotent.\n const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb)\n ? this._maxRetries + 1\n : 1;\n let numTries = 0;\n let response;\n do {\n response = yield this.requestRaw(info, data);\n // Check if it's an authentication challenge\n if (response &&\n response.message &&\n response.message.statusCode === HttpCodes.Unauthorized) {\n let authenticationHandler;\n for (const handler of this.handlers) {\n if (handler.canHandleAuthentication(response)) {\n authenticationHandler = handler;\n break;\n }\n }\n if (authenticationHandler) {\n return authenticationHandler.handleAuthentication(this, info, data);\n }\n else {\n // We have received an unauthorized response but have no handlers to handle it.\n // Let the response return to the caller.\n return response;\n }\n }\n let redirectsRemaining = this._maxRedirects;\n while (response.message.statusCode &&\n HttpRedirectCodes.includes(response.message.statusCode) &&\n this._allowRedirects &&\n redirectsRemaining > 0) {\n const redirectUrl = response.message.headers['location'];\n if (!redirectUrl) {\n // if there's no location to redirect to, we won't\n break;\n }\n const parsedRedirectUrl = new URL(redirectUrl);\n if (parsedUrl.protocol === 'https:' &&\n parsedUrl.protocol !== parsedRedirectUrl.protocol &&\n !this._allowRedirectDowngrade) {\n throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');\n }\n // we need to finish reading the response before reassigning response\n // which will leak the open socket.\n yield response.readBody();\n // strip authorization header if redirected to a different hostname\n if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {\n for (const header in headers) {\n // header names are case insensitive\n if (header.toLowerCase() === 'authorization') {\n delete headers[header];\n }\n }\n }\n // let's make the request with the new redirectUrl\n info = this._prepareRequest(verb, parsedRedirectUrl, headers);\n response = yield this.requestRaw(info, data);\n redirectsRemaining--;\n }\n if (!response.message.statusCode ||\n !HttpResponseRetryCodes.includes(response.message.statusCode)) {\n // If not a retry code, return immediately instead of retrying\n return response;\n }\n numTries += 1;\n if (numTries < maxTries) {\n yield response.readBody();\n yield this._performExponentialBackoff(numTries);\n }\n } while (numTries < maxTries);\n return response;\n });\n }\n /**\n * Needs to be called if keepAlive is set to true in request options.\n */\n dispose() {\n if (this._agent) {\n this._agent.destroy();\n }\n this._disposed = true;\n }\n /**\n * Raw request.\n * @param info\n * @param data\n */\n requestRaw(info, data) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n function callbackForResult(err, res) {\n if (err) {\n reject(err);\n }\n else if (!res) {\n // If `err` is not passed, then `res` must be passed.\n reject(new Error('Unknown error'));\n }\n else {\n resolve(res);\n }\n }\n this.requestRawWithCallback(info, data, callbackForResult);\n });\n });\n }\n /**\n * Raw request with callback.\n * @param info\n * @param data\n * @param onResult\n */\n requestRawWithCallback(info, data, onResult) {\n if (typeof data === 'string') {\n if (!info.options.headers) {\n info.options.headers = {};\n }\n info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');\n }\n let callbackCalled = false;\n function handleResult(err, res) {\n if (!callbackCalled) {\n callbackCalled = true;\n onResult(err, res);\n }\n }\n const req = info.httpModule.request(info.options, (msg) => {\n const res = new HttpClientResponse(msg);\n handleResult(undefined, res);\n });\n let socket;\n req.on('socket', sock => {\n socket = sock;\n });\n // If we ever get disconnected, we want the socket to timeout eventually\n req.setTimeout(this._socketTimeout || 3 * 60000, () => {\n if (socket) {\n socket.end();\n }\n handleResult(new Error(`Request timeout: ${info.options.path}`));\n });\n req.on('error', function (err) {\n // err has statusCode property\n // res should have headers\n handleResult(err);\n });\n if (data && typeof data === 'string') {\n req.write(data, 'utf8');\n }\n if (data && typeof data !== 'string') {\n data.on('close', function () {\n req.end();\n });\n data.pipe(req);\n }\n else {\n req.end();\n }\n }\n /**\n * Gets an http agent. This function is useful when you need an http agent that handles\n * routing through a proxy server - depending upon the url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\n getAgent(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n return this._getAgent(parsedUrl);\n }\n getAgentDispatcher(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (!useProxy) {\n return;\n }\n return this._getProxyAgentDispatcher(parsedUrl, proxyUrl);\n }\n _prepareRequest(method, requestUrl, headers) {\n const info = {};\n info.parsedUrl = requestUrl;\n const usingSsl = info.parsedUrl.protocol === 'https:';\n info.httpModule = usingSsl ? https : http;\n const defaultPort = usingSsl ? 443 : 80;\n info.options = {};\n info.options.host = info.parsedUrl.hostname;\n info.options.port = info.parsedUrl.port\n ? parseInt(info.parsedUrl.port)\n : defaultPort;\n info.options.path =\n (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');\n info.options.method = method;\n info.options.headers = this._mergeHeaders(headers);\n if (this.userAgent != null) {\n info.options.headers['user-agent'] = this.userAgent;\n }\n info.options.agent = this._getAgent(info.parsedUrl);\n // gives handlers an opportunity to participate\n if (this.handlers) {\n for (const handler of this.handlers) {\n handler.prepareRequest(info.options);\n }\n }\n return info;\n }\n _mergeHeaders(headers) {\n if (this.requestOptions && this.requestOptions.headers) {\n return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {}));\n }\n return lowercaseKeys(headers || {});\n }\n _getExistingOrDefaultHeader(additionalHeaders, header, _default) {\n let clientHeader;\n if (this.requestOptions && this.requestOptions.headers) {\n clientHeader = lowercaseKeys(this.requestOptions.headers)[header];\n }\n return additionalHeaders[header] || clientHeader || _default;\n }\n _getAgent(parsedUrl) {\n let agent;\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (this._keepAlive && useProxy) {\n agent = this._proxyAgent;\n }\n if (this._keepAlive && !useProxy) {\n agent = this._agent;\n }\n // if agent is already assigned use that agent.\n if (agent) {\n return agent;\n }\n const usingSsl = parsedUrl.protocol === 'https:';\n let maxSockets = 100;\n if (this.requestOptions) {\n maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;\n }\n // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis.\n if (proxyUrl && proxyUrl.hostname) {\n const agentOptions = {\n maxSockets,\n keepAlive: this._keepAlive,\n proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && {\n proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`\n })), { host: proxyUrl.hostname, port: proxyUrl.port })\n };\n let tunnelAgent;\n const overHttps = proxyUrl.protocol === 'https:';\n if (usingSsl) {\n tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;\n }\n else {\n tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;\n }\n agent = tunnelAgent(agentOptions);\n this._proxyAgent = agent;\n }\n // if reusing agent across request and tunneling agent isn't assigned create a new agent\n if (this._keepAlive && !agent) {\n const options = { keepAlive: this._keepAlive, maxSockets };\n agent = usingSsl ? new https.Agent(options) : new http.Agent(options);\n this._agent = agent;\n }\n // if not using private agent and tunnel agent isn't setup then use global agent\n if (!agent) {\n agent = usingSsl ? https.globalAgent : http.globalAgent;\n }\n if (usingSsl && this._ignoreSslError) {\n // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n agent.options = Object.assign(agent.options || {}, {\n rejectUnauthorized: false\n });\n }\n return agent;\n }\n _getProxyAgentDispatcher(parsedUrl, proxyUrl) {\n let proxyAgent;\n if (this._keepAlive) {\n proxyAgent = this._proxyAgentDispatcher;\n }\n // if agent is already assigned use that agent.\n if (proxyAgent) {\n return proxyAgent;\n }\n const usingSsl = parsedUrl.protocol === 'https:';\n proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && {\n token: `${proxyUrl.username}:${proxyUrl.password}`\n })));\n this._proxyAgentDispatcher = proxyAgent;\n if (usingSsl && this._ignoreSslError) {\n // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, {\n rejectUnauthorized: false\n });\n }\n return proxyAgent;\n }\n _performExponentialBackoff(retryNumber) {\n return __awaiter(this, void 0, void 0, function* () {\n retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);\n const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);\n return new Promise(resolve => setTimeout(() => resolve(), ms));\n });\n }\n _processResponse(res, options) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n const statusCode = res.message.statusCode || 0;\n const response = {\n statusCode,\n result: null,\n headers: {}\n };\n // not found leads to null obj returned\n if (statusCode === HttpCodes.NotFound) {\n resolve(response);\n }\n // get the result from the body\n function dateTimeDeserializer(key, value) {\n if (typeof value === 'string') {\n const a = new Date(value);\n if (!isNaN(a.valueOf())) {\n return a;\n }\n }\n return value;\n }\n let obj;\n let contents;\n try {\n contents = yield res.readBody();\n if (contents && contents.length > 0) {\n if (options && options.deserializeDates) {\n obj = JSON.parse(contents, dateTimeDeserializer);\n }\n else {\n obj = JSON.parse(contents);\n }\n response.result = obj;\n }\n response.headers = res.message.headers;\n }\n catch (err) {\n // Invalid resource (contents not json); leaving result obj null\n }\n // note that 3xx redirects are handled by the http layer.\n if (statusCode > 299) {\n let msg;\n // if exception/error in body, attempt to get better error\n if (obj && obj.message) {\n msg = obj.message;\n }\n else if (contents && contents.length > 0) {\n // it may be the case that the exception is in the body message as string\n msg = contents;\n }\n else {\n msg = `Failed request: (${statusCode})`;\n }\n const err = new HttpClientError(msg, statusCode);\n err.result = response.result;\n reject(err);\n }\n else {\n resolve(response);\n }\n }));\n });\n }\n}\nexports.HttpClient = HttpClient;\nconst lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.checkBypass = exports.getProxyUrl = void 0;\nfunction getProxyUrl(reqUrl) {\n const usingSsl = reqUrl.protocol === 'https:';\n if (checkBypass(reqUrl)) {\n return undefined;\n }\n const proxyVar = (() => {\n if (usingSsl) {\n return process.env['https_proxy'] || process.env['HTTPS_PROXY'];\n }\n else {\n return process.env['http_proxy'] || process.env['HTTP_PROXY'];\n }\n })();\n if (proxyVar) {\n try {\n return new URL(proxyVar);\n }\n catch (_a) {\n if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://'))\n return new URL(`http://${proxyVar}`);\n }\n }\n else {\n return undefined;\n }\n}\nexports.getProxyUrl = getProxyUrl;\nfunction checkBypass(reqUrl) {\n if (!reqUrl.hostname) {\n return false;\n }\n const reqHost = reqUrl.hostname;\n if (isLoopbackAddress(reqHost)) {\n return true;\n }\n const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';\n if (!noProxy) {\n return false;\n }\n // Determine the request port\n let reqPort;\n if (reqUrl.port) {\n reqPort = Number(reqUrl.port);\n }\n else if (reqUrl.protocol === 'http:') {\n reqPort = 80;\n }\n else if (reqUrl.protocol === 'https:') {\n reqPort = 443;\n }\n // Format the request hostname and hostname with port\n const upperReqHosts = [reqUrl.hostname.toUpperCase()];\n if (typeof reqPort === 'number') {\n upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);\n }\n // Compare request host against noproxy\n for (const upperNoProxyItem of noProxy\n .split(',')\n .map(x => x.trim().toUpperCase())\n .filter(x => x)) {\n if (upperNoProxyItem === '*' ||\n upperReqHosts.some(x => x === upperNoProxyItem ||\n x.endsWith(`.${upperNoProxyItem}`) ||\n (upperNoProxyItem.startsWith('.') &&\n x.endsWith(`${upperNoProxyItem}`)))) {\n return true;\n }\n }\n return false;\n}\nexports.checkBypass = checkBypass;\nfunction isLoopbackAddress(host) {\n const hostLower = host.toLowerCase();\n return (hostLower === 'localhost' ||\n hostLower.startsWith('127.') ||\n hostLower.startsWith('[::1]') ||\n hostLower.startsWith('[0:0:0:0:0:0:0:1]'));\n}\n//# sourceMappingURL=proxy.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadAwsServiceSpecSync = exports.loadAwsServiceSpec = void 0;\nconst node_fs_1 = require(\"node:fs\");\nconst path = __importStar(require(\"node:path\"));\nconst node_zlib_1 = require(\"node:zlib\");\nconst service_spec_types_1 = require(\"@aws-cdk/service-spec-types\");\nconst DB_COMPRESSED = 'db.json.gz';\nconst DB_PATH = path.join(__dirname, '..', DB_COMPRESSED);\n/**\n * Load the provided built-in database\n */\nasync function loadAwsServiceSpec() {\n return loadBufferIntoDatabase(await node_fs_1.promises.readFile(DB_PATH));\n}\nexports.loadAwsServiceSpec = loadAwsServiceSpec;\n/**\n * Synchronously load the provided built-in database\n */\nfunction loadAwsServiceSpecSync() {\n return loadBufferIntoDatabase((0, node_fs_1.readFileSync)(DB_PATH));\n}\nexports.loadAwsServiceSpecSync = loadAwsServiceSpecSync;\nfunction loadBufferIntoDatabase(spec) {\n const db = (0, service_spec_types_1.emptyDatabase)();\n db.load(JSON.parse((0, node_zlib_1.gunzipSync)(spec).toString('utf-8')));\n return db;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBdUQ7QUFDdkQsZ0RBQWtDO0FBQ2xDLHlDQUF1QztBQUN2QyxvRUFBMEU7QUFFMUUsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDO0FBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztBQUUxRDs7R0FFRztBQUNJLEtBQUssVUFBVSxrQkFBa0I7SUFDdEMsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLGtCQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUZELGdEQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixzQkFBc0I7SUFDcEMsT0FBTyxzQkFBc0IsQ0FBQyxJQUFBLHNCQUFZLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRkQsd0RBRUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLElBQVk7SUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBQSxrQ0FBYSxHQUFFLENBQUM7SUFDM0IsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUEsc0JBQVUsRUFBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzLCByZWFkRmlsZVN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuaW1wb3J0IHsgZW1wdHlEYXRhYmFzZSwgU3BlY0RhdGFiYXNlIH0gZnJvbSAnQGF3cy1jZGsvc2VydmljZS1zcGVjLXR5cGVzJztcblxuY29uc3QgREJfQ09NUFJFU1NFRCA9ICdkYi5qc29uLmd6JztcbmNvbnN0IERCX1BBVEggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCBEQl9DT01QUkVTU0VEKTtcblxuLyoqXG4gKiBMb2FkIHRoZSBwcm92aWRlZCBidWlsdC1pbiBkYXRhYmFzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEF3c1NlcnZpY2VTcGVjKCk6IFByb21pc2U8U3BlY0RhdGFiYXNlPiB7XG4gIHJldHVybiBsb2FkQnVmZmVySW50b0RhdGFiYXNlKGF3YWl0IGZzLnJlYWRGaWxlKERCX1BBVEgpKTtcbn1cblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGxvYWQgdGhlIHByb3ZpZGVkIGJ1aWx0LWluIGRhdGFiYXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQXdzU2VydmljZVNwZWNTeW5jKCk6IFNwZWNEYXRhYmFzZSB7XG4gIHJldHVybiBsb2FkQnVmZmVySW50b0RhdGFiYXNlKHJlYWRGaWxlU3luYyhEQl9QQVRIKSk7XG59XG5cbmZ1bmN0aW9uIGxvYWRCdWZmZXJJbnRvRGF0YWJhc2Uoc3BlYzogQnVmZmVyKTogU3BlY0RhdGFiYXNlIHtcbiAgY29uc3QgZGIgPSBlbXB0eURhdGFiYXNlKCk7XG4gIGRiLmxvYWQoSlNPTi5wYXJzZShndW56aXBTeW5jKHNwZWMpLnRvU3RyaW5nKCd1dGYtOCcpKSk7XG4gIHJldHVybiBkYjtcbn1cbiJdfQ==","function _aws_cdk_cloud_assembly_schema_ArtifactType(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_RuntimeInfo(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_MissingContext(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.props))\n _aws_cdk_cloud_assembly_schema_AmiContextQuery(p.props);\n if (!visitedObjects.has(p.provider))\n _aws_cdk_cloud_assembly_schema_ContextProvider(p.provider);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_ArtifactManifest(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.type))\n _aws_cdk_cloud_assembly_schema_ArtifactType(p.type);\n if (!visitedObjects.has(p.properties))\n _aws_cdk_cloud_assembly_schema_AwsCloudFormationStackProperties(p.properties);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_AssemblyManifest(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.artifacts != null)\n for (const o of Object.values(p.artifacts))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_ArtifactManifest(o);\n if (p.missing != null)\n for (const o of p.missing)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_MissingContext(o);\n if (!visitedObjects.has(p.runtime))\n _aws_cdk_cloud_assembly_schema_RuntimeInfo(p.runtime);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_FileAssetMetadataEntry(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_Tag(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_ContainerImageAssetCacheOption(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_ContainerImageAssetMetadataEntry(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.cacheFrom != null)\n for (const o of p.cacheFrom)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_ContainerImageAssetCacheOption(o);\n if (!visitedObjects.has(p.cacheTo))\n _aws_cdk_cloud_assembly_schema_ContainerImageAssetCacheOption(p.cacheTo);\n if (\"imageNameParameter\" in p)\n print(\"@aws-cdk/cloud-assembly-schema.ContainerImageAssetMetadataEntry#imageNameParameter\", \"specify `repositoryName` and `imageTag` instead, and then you\\nknow where the image will go.\");\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_ArtifactMetadataEntryType(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_MetadataEntry(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_BootstrapRole(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AwsCloudFormationStackProperties(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.lookupRole))\n _aws_cdk_cloud_assembly_schema_BootstrapRole(p.lookupRole);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_AssetManifestOptions(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AssetManifestProperties(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_TreeArtifactProperties(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_NestedCloudAssemblyProperties(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_ContextProvider(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AmiContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AvailabilityZonesContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_HostedZoneContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_SSMParameterContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_VpcContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_EndpointServiceAvailabilityZonesContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadBalancerType(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadBalancerFilter(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.loadBalancerType))\n _aws_cdk_cloud_assembly_schema_LoadBalancerType(p.loadBalancerType);\n if (p.loadBalancerTags != null)\n for (const o of p.loadBalancerTags)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_Tag(o);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadBalancerContextQuery(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.loadBalancerType))\n _aws_cdk_cloud_assembly_schema_LoadBalancerType(p.loadBalancerType);\n if (p.loadBalancerTags != null)\n for (const o of p.loadBalancerTags)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_Tag(o);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadBalancerListenerProtocol(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadBalancerListenerContextQuery(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.listenerProtocol))\n _aws_cdk_cloud_assembly_schema_LoadBalancerListenerProtocol(p.listenerProtocol);\n if (!visitedObjects.has(p.loadBalancerType))\n _aws_cdk_cloud_assembly_schema_LoadBalancerType(p.loadBalancerType);\n if (p.loadBalancerTags != null)\n for (const o of p.loadBalancerTags)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_Tag(o);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_SecurityGroupContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_KeyContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_PluginContextQuery(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AssetManifest(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.dockerImages != null)\n for (const o of Object.values(p.dockerImages))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_DockerImageAsset(o);\n if (p.files != null)\n for (const o of Object.values(p.files))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_FileAsset(o);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_DockerImageAsset(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.destinations != null)\n for (const o of Object.values(p.destinations))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_DockerImageDestination(o);\n if (!visitedObjects.has(p.source))\n _aws_cdk_cloud_assembly_schema_DockerImageSource(p.source);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_DockerImageSource(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.cacheFrom != null)\n for (const o of p.cacheFrom)\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_DockerCacheOption(o);\n if (!visitedObjects.has(p.cacheTo))\n _aws_cdk_cloud_assembly_schema_DockerCacheOption(p.cacheTo);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_DockerImageDestination(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_DockerCacheOption(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_FileAsset(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.destinations != null)\n for (const o of Object.values(p.destinations))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_FileDestination(o);\n if (!visitedObjects.has(p.source))\n _aws_cdk_cloud_assembly_schema_FileSource(p.source);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_FileAssetPackaging(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_FileSource(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.packaging))\n _aws_cdk_cloud_assembly_schema_FileAssetPackaging(p.packaging);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_FileDestination(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_AwsDestination(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_LoadManifestOptions(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_Manifest(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_IntegManifest(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (p.testCases != null)\n for (const o of Object.values(p.testCases))\n if (!visitedObjects.has(o))\n _aws_cdk_cloud_assembly_schema_TestCase(o);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_RequireApproval(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_DefaultCdkOptions(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_DeployOptions(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.requireApproval))\n _aws_cdk_cloud_assembly_schema_RequireApproval(p.requireApproval);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_DestroyOptions(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_TestOptions(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.cdkCommandOptions))\n _aws_cdk_cloud_assembly_schema_CdkCommands(p.cdkCommandOptions);\n if (!visitedObjects.has(p.hooks))\n _aws_cdk_cloud_assembly_schema_Hooks(p.hooks);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_TestCase(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.cdkCommandOptions))\n _aws_cdk_cloud_assembly_schema_CdkCommands(p.cdkCommandOptions);\n if (!visitedObjects.has(p.hooks))\n _aws_cdk_cloud_assembly_schema_Hooks(p.hooks);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_Hooks(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_CdkCommand(p) {\n}\nfunction _aws_cdk_cloud_assembly_schema_DeployCommand(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.args))\n _aws_cdk_cloud_assembly_schema_DeployOptions(p.args);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_DestroyCommand(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.args))\n _aws_cdk_cloud_assembly_schema_DestroyOptions(p.args);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction _aws_cdk_cloud_assembly_schema_CdkCommands(p) {\n if (p == null)\n return;\n visitedObjects.add(p);\n try {\n if (!visitedObjects.has(p.deploy))\n _aws_cdk_cloud_assembly_schema_DeployCommand(p.deploy);\n if (!visitedObjects.has(p.destroy))\n _aws_cdk_cloud_assembly_schema_DestroyCommand(p.destroy);\n }\n finally {\n visitedObjects.delete(p);\n }\n}\nfunction print(name, deprecationMessage) {\n const deprecated = process.env.JSII_DEPRECATED;\n const deprecationMode = [\"warn\", \"fail\", \"quiet\"].includes(deprecated) ? deprecated : \"warn\";\n const message = `${name} is deprecated.\\n ${deprecationMessage.trim()}\\n This API will be removed in the next major release.`;\n switch (deprecationMode) {\n case \"fail\":\n throw new DeprecationError(message);\n case \"warn\":\n console.warn(\"[WARNING]\", message);\n break;\n }\n}\nfunction getPropertyDescriptor(obj, prop) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor) {\n return descriptor;\n }\n const proto = Object.getPrototypeOf(obj);\n const prototypeDescriptor = proto && getPropertyDescriptor(proto, prop);\n if (prototypeDescriptor) {\n return prototypeDescriptor;\n }\n return {};\n}\nconst visitedObjects = new Set();\nclass DeprecationError extends Error {\n constructor(...args) {\n super(...args);\n Object.defineProperty(this, \"name\", {\n configurable: false,\n enumerable: true,\n value: \"DeprecationError\",\n writable: false,\n });\n }\n}\nmodule.exports = { print, getPropertyDescriptor, DeprecationError, _aws_cdk_cloud_assembly_schema_ArtifactType, _aws_cdk_cloud_assembly_schema_RuntimeInfo, _aws_cdk_cloud_assembly_schema_MissingContext, _aws_cdk_cloud_assembly_schema_ArtifactManifest, _aws_cdk_cloud_assembly_schema_AssemblyManifest, _aws_cdk_cloud_assembly_schema_FileAssetMetadataEntry, _aws_cdk_cloud_assembly_schema_Tag, _aws_cdk_cloud_assembly_schema_ContainerImageAssetCacheOption, _aws_cdk_cloud_assembly_schema_ContainerImageAssetMetadataEntry, _aws_cdk_cloud_assembly_schema_ArtifactMetadataEntryType, _aws_cdk_cloud_assembly_schema_MetadataEntry, _aws_cdk_cloud_assembly_schema_BootstrapRole, _aws_cdk_cloud_assembly_schema_AwsCloudFormationStackProperties, _aws_cdk_cloud_assembly_schema_AssetManifestOptions, _aws_cdk_cloud_assembly_schema_AssetManifestProperties, _aws_cdk_cloud_assembly_schema_TreeArtifactProperties, _aws_cdk_cloud_assembly_schema_NestedCloudAssemblyProperties, _aws_cdk_cloud_assembly_schema_ContextProvider, _aws_cdk_cloud_assembly_schema_AmiContextQuery, _aws_cdk_cloud_assembly_schema_AvailabilityZonesContextQuery, _aws_cdk_cloud_assembly_schema_HostedZoneContextQuery, _aws_cdk_cloud_assembly_schema_SSMParameterContextQuery, _aws_cdk_cloud_assembly_schema_VpcContextQuery, _aws_cdk_cloud_assembly_schema_EndpointServiceAvailabilityZonesContextQuery, _aws_cdk_cloud_assembly_schema_LoadBalancerType, _aws_cdk_cloud_assembly_schema_LoadBalancerFilter, _aws_cdk_cloud_assembly_schema_LoadBalancerContextQuery, _aws_cdk_cloud_assembly_schema_LoadBalancerListenerProtocol, _aws_cdk_cloud_assembly_schema_LoadBalancerListenerContextQuery, _aws_cdk_cloud_assembly_schema_SecurityGroupContextQuery, _aws_cdk_cloud_assembly_schema_KeyContextQuery, _aws_cdk_cloud_assembly_schema_PluginContextQuery, _aws_cdk_cloud_assembly_schema_AssetManifest, _aws_cdk_cloud_assembly_schema_DockerImageAsset, _aws_cdk_cloud_assembly_schema_DockerImageSource, _aws_cdk_cloud_assembly_schema_DockerImageDestination, _aws_cdk_cloud_assembly_schema_DockerCacheOption, _aws_cdk_cloud_assembly_schema_FileAsset, _aws_cdk_cloud_assembly_schema_FileAssetPackaging, _aws_cdk_cloud_assembly_schema_FileSource, _aws_cdk_cloud_assembly_schema_FileDestination, _aws_cdk_cloud_assembly_schema_AwsDestination, _aws_cdk_cloud_assembly_schema_LoadManifestOptions, _aws_cdk_cloud_assembly_schema_Manifest, _aws_cdk_cloud_assembly_schema_IntegManifest, _aws_cdk_cloud_assembly_schema_RequireApproval, _aws_cdk_cloud_assembly_schema_DefaultCdkOptions, _aws_cdk_cloud_assembly_schema_DeployOptions, _aws_cdk_cloud_assembly_schema_DestroyOptions, _aws_cdk_cloud_assembly_schema_TestOptions, _aws_cdk_cloud_assembly_schema_TestCase, _aws_cdk_cloud_assembly_schema_Hooks, _aws_cdk_cloud_assembly_schema_CdkCommand, _aws_cdk_cloud_assembly_schema_DeployCommand, _aws_cdk_cloud_assembly_schema_DestroyCommand, _aws_cdk_cloud_assembly_schema_CdkCommands };\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWRlc3RpbmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXdzLWRlc3RpbmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlc3RpbmF0aW9uIGZvciBhc3NldHMgdGhhdCBuZWVkIHRvIGJlIHVwbG9hZGVkIHRvIEFXU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF3c0Rlc3RpbmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSByZWdpb24gd2hlcmUgdGhpcyBhc3NldCB3aWxsIG5lZWQgdG8gYmUgcHVibGlzaGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ3VycmVudCByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvbGUgdGhhdCBuZWVkcyB0byBiZSBhc3N1bWVkIHdoaWxlIHB1Ymxpc2hpbmcgdGhpcyBhc3NldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHJvbGUgd2lsbCBiZSBhc3N1bWVkXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRXh0ZXJuYWxJZCB0aGF0IG5lZWRzIHRvIGJlIHN1cHBsaWVkIHdoaWxlIGFzc3VtaW5nIHRoaXMgcm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIEV4dGVybmFsSWQgd2lsbCBiZSBzdXBwbGllZFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzdW1lUm9sZUV4dGVybmFsSWQ/OiBzdHJpbmc7XG59Il19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9ja2VyLWltYWdlLWFzc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG9ja2VyLWltYWdlLWFzc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBd3NEZXN0aW5hdGlvbiB9IGZyb20gJy4vYXdzLWRlc3RpbmF0aW9uJztcblxuLyoqXG4gKiBBIGZpbGUgYXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NrZXJJbWFnZUFzc2V0IHtcbiAgLyoqXG4gICAqIFNvdXJjZSBkZXNjcmlwdGlvbiBmb3IgZmlsZSBhc3NldHNcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZTogRG9ja2VySW1hZ2VTb3VyY2U7XG5cbiAgLyoqXG4gICAqIERlc3RpbmF0aW9ucyBmb3IgdGhpcyBmaWxlIGFzc2V0XG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbnM6IHsgW2lkOiBzdHJpbmddOiBEb2NrZXJJbWFnZURlc3RpbmF0aW9uIH07XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgaG93IHRvIHByb2R1Y2UgYSBEb2NrZXIgaW1hZ2UgZnJvbSBhIHNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY2tlckltYWdlU291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgRG9ja2VyIGltYWdlIGJ1aWxkIGluc3RydWN0aW9ucy5cbiAgICpcbiAgICogVGhpcyBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBhc3NldCBtYW5pZmVzdCBsb2NhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBFeGFjdGx5IG9uZSBvZiBgZGlyZWN0b3J5YCBhbmQgYGV4ZWN1dGFibGVgIGlzIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSBkaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY29tbWFuZC1saW5lIGV4ZWN1dGFibGUgdGhhdCByZXR1cm5zIHRoZSBuYW1lIG9mIGEgbG9jYWxcbiAgICogRG9ja2VyIGltYWdlIG9uIHN0ZG91dCBhZnRlciBiZWluZyBydW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRXhhY3RseSBvbmUgb2YgYGRpcmVjdG9yeWAgYW5kIGBleGVjdXRhYmxlYCBpcyByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0YWJsZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSB3aXRoIGJ1aWxkIGluc3RydWN0aW9uc1xuICAgKlxuICAgKiBPbmx5IGFsbG93ZWQgd2hlbiBgZGlyZWN0b3J5YCBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiRG9ja2VyZmlsZVwiXG4gICAqL1xuICByZWFkb25seSBkb2NrZXJGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXJnZXQgYnVpbGQgc3RhZ2UgaW4gYSBEb2NrZXJmaWxlIHdpdGggbXVsdGlwbGUgYnVpbGQgc3RhZ2VzXG4gICAqXG4gICAqIE9ubHkgYWxsb3dlZCB3aGVuIGBkaXJlY3RvcnlgIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgbGFzdCBzdGFnZSBpbiB0aGUgRG9ja2VyZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyQnVpbGRUYXJnZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgYnVpbGQgYXJndW1lbnRzXG4gICAqXG4gICAqIE9ubHkgYWxsb3dlZCB3aGVuIGBkaXJlY3RvcnlgIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBhZGRpdGlvbmFsIGJ1aWxkIGFyZ3VtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyQnVpbGRBcmdzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFNTSCBhZ2VudCBzb2NrZXQgb3Iga2V5c1xuICAgKlxuICAgKiBSZXF1aXJlcyBidWlsZGluZyB3aXRoIGRvY2tlciBidWlsZGtpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzc2ggZmxhZyBpcyBzZXRcbiAgICovXG4gIHJlYWRvbmx5IGRvY2tlckJ1aWxkU3NoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGJ1aWxkIHNlY3JldHNcbiAgICpcbiAgICogT25seSBhbGxvd2VkIHdoZW4gYGRpcmVjdG9yeWAgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGFkZGl0aW9uYWwgYnVpbGQgc2VjcmV0c1xuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyQnVpbGRTZWNyZXRzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIE5ldHdvcmtpbmcgbW9kZSBmb3IgdGhlIFJVTiBjb21tYW5kcyBkdXJpbmcgYnVpbGQuIF9SZXF1aXJlcyBEb2NrZXIgRW5naW5lIEFQSSB2MS4yNStfLlxuICAgKlxuICAgKiBTcGVjaWZ5IHRoaXMgcHJvcGVydHkgdG8gYnVpbGQgaW1hZ2VzIG9uIGEgc3BlY2lmaWMgbmV0d29ya2luZyBtb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG5ldHdvcmtpbmcgbW9kZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtNb2RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbGF0Zm9ybSB0byBidWlsZCBmb3IuIF9SZXF1aXJlcyBEb2NrZXIgQnVpbGR4Xy5cbiAgICpcbiAgICogU3BlY2lmeSB0aGlzIHByb3BlcnR5IHRvIGJ1aWxkIGltYWdlcyBvbiBhIHNwZWNpZmljIHBsYXRmb3JtL2FyY2hpdGVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBjdXJyZW50IG1hY2hpbmUgcGxhdGZvcm1cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdXRwdXRzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gb3V0cHV0cyBhcmUgcGFzc2VkIHRvIHRoZSBidWlsZCBjb21tYW5kIChkZWZhdWx0IG91dHB1dHMgYXJlIHVzZWQpXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9jb21tYW5kbGluZS9idWlsZC8jY3VzdG9tLWJ1aWxkLW91dHB1dHNcbiAgICovXG4gIHJlYWRvbmx5IGRvY2tlck91dHB1dHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ2FjaGUgZnJvbSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIGBkb2NrZXIgYnVpbGRgIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY2FjaGUgZnJvbSBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIGJ1aWxkIGNvbW1hbmRcbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9idWlsZC9jYWNoZS9iYWNrZW5kcy9cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRnJvbT86IERvY2tlckNhY2hlT3B0aW9uW107XG5cbiAgLyoqXG4gICAqIENhY2hlIHRvIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgYGRvY2tlciBidWlsZGAgY29tbWFuZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjYWNoZSB0byBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIGJ1aWxkIGNvbW1hbmRcbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9idWlsZC9jYWNoZS9iYWNrZW5kcy9cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlVG8/OiBEb2NrZXJDYWNoZU9wdGlvbjtcbn1cblxuLyoqXG4gKiBXaGVyZSB0byBwdWJsaXNoIGRvY2tlciBpbWFnZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NrZXJJbWFnZURlc3RpbmF0aW9uIGV4dGVuZHMgQXdzRGVzdGluYXRpb24ge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgRUNSIHJlcG9zaXRvcnkgdG8gcHVibGlzaCB0b1xuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGFnIG9mIHRoZSBpbWFnZSB0byBwdWJsaXNoXG4gICAqL1xuICByZWFkb25seSBpbWFnZVRhZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBEb2NrZXIgY2FjaGUgYmFja2VuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY2tlckNhY2hlT3B0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS5cbiAgICogUmVmZXIgdG8gaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vYnVpbGQvY2FjaGUvYmFja2VuZHMvIGZvciBmdWxsIGxpc3Qgb2YgYmFja2VuZHMuXG4gICAqIEBkZWZhdWx0IC0gdW5zcGVjaWZpZWRcbiAgICpcbiAgICogQGV4YW1wbGUgJ3JlZ2lzdHJ5J1xuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuICAvKipcbiAgICogQW55IHBhcmFtZXRlcnMgdG8gcGFzcyBpbnRvIHRoZSBkb2NrZXIgY2FjaGUgYmFja2VuZCBjb25maWd1cmF0aW9uLlxuICAgKiBSZWZlciB0byBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9idWlsZC9jYWNoZS9iYWNrZW5kcy8gZm9yIGNhY2hlIGJhY2tlbmQgY29uZmlndXJhdGlvbi5cbiAgICogQGRlZmF1bHQge30gTm8gb3B0aW9ucyBwcm92aWRlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBkZWNsYXJlIGNvbnN0IGJyYW5jaDogc3RyaW5nO1xuICAgKlxuICAgKiBjb25zdCBwYXJhbXMgPSB7XG4gICAqICAgcmVmOiBgMTIzNDU2NzguZGtyLmVjci51cy13ZXN0LTIuYW1hem9uYXdzLmNvbS9jYWNoZToke2JyYW5jaH1gLFxuICAgKiAgIG1vZGU6IFwibWF4XCIsXG4gICAqIH07XG4gICAqL1xuICByZWFkb25seSBwYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FileAssetPackaging = void 0;\n/**\n * Packaging strategy for file assets\n */\nvar FileAssetPackaging;\n(function (FileAssetPackaging) {\n /**\n * Upload the given path as a file\n */\n FileAssetPackaging[\"FILE\"] = \"file\";\n /**\n * The given path is a directory, zip it and upload\n */\n FileAssetPackaging[\"ZIP_DIRECTORY\"] = \"zip\";\n})(FileAssetPackaging || (exports.FileAssetPackaging = FileAssetPackaging = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1hc3NldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZpbGUtYXNzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaUJBOztHQUVHO0FBQ0gsSUFBWSxrQkFVWDtBQVZELFdBQVksa0JBQWtCO0lBQzVCOztPQUVHO0lBQ0gsbUNBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsMkNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVZXLGtCQUFrQixrQ0FBbEIsa0JBQWtCLFFBVTdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXdzRGVzdGluYXRpb24gfSBmcm9tICcuL2F3cy1kZXN0aW5hdGlvbic7XG5cbi8qKlxuICogQSBmaWxlIGFzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUFzc2V0IHtcbiAgLyoqXG4gICAqIFNvdXJjZSBkZXNjcmlwdGlvbiBmb3IgZmlsZSBhc3NldHNcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZTogRmlsZVNvdXJjZTtcblxuICAvKipcbiAgICogRGVzdGluYXRpb25zIGZvciB0aGlzIGZpbGUgYXNzZXRcbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uczogeyBbaWQ6IHN0cmluZ106IEZpbGVEZXN0aW5hdGlvbiB9O1xufVxuXG4vKipcbiAqIFBhY2thZ2luZyBzdHJhdGVneSBmb3IgZmlsZSBhc3NldHNcbiAqL1xuZXhwb3J0IGVudW0gRmlsZUFzc2V0UGFja2FnaW5nIHtcbiAgLyoqXG4gICAqIFVwbG9hZCB0aGUgZ2l2ZW4gcGF0aCBhcyBhIGZpbGVcbiAgICovXG4gIEZJTEUgPSAnZmlsZScsXG5cbiAgLyoqXG4gICAqIFRoZSBnaXZlbiBwYXRoIGlzIGEgZGlyZWN0b3J5LCB6aXAgaXQgYW5kIHVwbG9hZFxuICAgKi9cbiAgWklQX0RJUkVDVE9SWSA9ICd6aXAnLFxufVxuXG4vKipcbiAqIERlc2NyaWJlIHRoZSBzb3VyY2Ugb2YgYSBmaWxlIGFzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNvdXJjZSB7XG4gIC8qKlxuICAgKiBFeHRlcm5hbCBjb21tYW5kIHdoaWNoIHdpbGwgcHJvZHVjZSB0aGUgZmlsZSBhc3NldCB0byB1cGxvYWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRXhhY3RseSBvbmUgb2YgYGV4ZWN1dGFibGVgIGFuZCBgcGF0aGAgaXMgcmVxdWlyZWQuXG4gICAqL1xuICByZWFkb25seSBleGVjdXRhYmxlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlc3lzdGVtIG9iamVjdCB0byB1cGxvYWRcbiAgICpcbiAgICogVGhpcyBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBhc3NldCBtYW5pZmVzdCBsb2NhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBFeGFjdGx5IG9uZSBvZiBgZXhlY3V0YWJsZWAgYW5kIGBwYXRoYCBpcyByZXF1aXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhY2thZ2luZyBtZXRob2RcbiAgICpcbiAgICogT25seSBhbGxvd2VkIHdoZW4gYHBhdGhgIGlzIHNwZWNpZmllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgRklMRVxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnaW5nPzogRmlsZUFzc2V0UGFja2FnaW5nO1xufVxuXG4vKipcbiAqIFdoZXJlIGluIFMzIGEgZmlsZSBhc3NldCBuZWVkcyB0byBiZSBwdWJsaXNoZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlRGVzdGluYXRpb24gZXh0ZW5kcyBBd3NEZXN0aW5hdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYnVja2V0XG4gICAqL1xuICByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXN0aW5hdGlvbiBvYmplY3Qga2V5XG4gICAqL1xuICByZWFkb25seSBvYmplY3RLZXk6IHN0cmluZztcbn1cbiJdfQ==","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./schema\"), exports);\n__exportStar(require(\"./docker-image-asset\"), exports);\n__exportStar(require(\"./file-asset\"), exports);\n__exportStar(require(\"./aws-destination\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLHVEQUFxQztBQUNyQywrQ0FBNkI7QUFDN0Isb0RBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zY2hlbWEnO1xuZXhwb3J0ICogZnJvbSAnLi9kb2NrZXItaW1hZ2UtYXNzZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9maWxlLWFzc2V0JztcbmV4cG9ydCAqIGZyb20gJy4vYXdzLWRlc3RpbmF0aW9uJztcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2NrZXJJbWFnZUFzc2V0IH0gZnJvbSAnLi9kb2NrZXItaW1hZ2UtYXNzZXQnO1xuaW1wb3J0IHsgRmlsZUFzc2V0IH0gZnJvbSAnLi9maWxlLWFzc2V0JztcblxuLyoqXG4gKiBEZWZpbml0aW9ucyBmb3IgdGhlIGFzc2V0IG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBtYW5pZmVzdFxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSBhc3NldHMgaW4gdGhpcyBtYW5pZmVzdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGZpbGVzXG4gICAqL1xuICByZWFkb25seSBmaWxlcz86IHsgW2lkOiBzdHJpbmddOiBGaWxlQXNzZXQgfTtcblxuICAvKipcbiAgICogVGhlIERvY2tlciBpbWFnZSBhc3NldHMgaW4gdGhpcyBtYW5pZmVzdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIERvY2tlciBpbWFnZXNcbiAgICovXG4gIHJlYWRvbmx5IGRvY2tlckltYWdlcz86IHsgW2lkOiBzdHJpbmddOiBEb2NrZXJJbWFnZUFzc2V0IH07XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3Qtc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXJ0aWZhY3Qtc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogSW5mb3JtYXRpb24gbmVlZGVkIHRvIGFjY2VzcyBhbiBJQU0gcm9sZSBjcmVhdGVkXG4gKiBhcyBwYXJ0IG9mIHRoZSBib290c3RyYXAgcHJvY2Vzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJvb3RzdHJhcFJvbGUge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgSUFNIHJvbGUgY3JlYXRlZCBhcyBwYXJ0IG9mIGJvb3RyYXBwaW5nXG4gICAqIGUuZy4gbG9va3VwUm9sZUFyblxuICAgKi9cbiAgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4dGVybmFsIElEIHRvIHVzZSB3aGVuIGFzc3VtaW5nIHRoZSBib290c3RyYXAgcm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGV4dGVybmFsIElEXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVSb2xlRXh0ZXJuYWxJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVmVyc2lvbiBvZiBib290c3RyYXAgc3RhY2sgcmVxdWlyZWQgdG8gdXNlIHRoaXMgcm9sZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGJvb3RzdHJhcCBzdGFjayByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgU1NNIHBhcmFtZXRlciB3aXRoIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRGlzY292ZXIgU1NNIHBhcmFtZXRlciBieSByZWFkaW5nIHN0YWNrXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXJ0aWZhY3QgcHJvcGVydGllcyBmb3IgQ2xvdWRGb3JtYXRpb24gc3RhY2tzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF3c0Nsb3VkRm9ybWF0aW9uU3RhY2tQcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIEEgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXNzZW1ibHkgcm9vdCB3aGljaCBjb250YWlucyB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgZm9yIHRoaXMgc3RhY2suXG4gICAqL1xuICByZWFkb25seSB0ZW1wbGF0ZUZpbGU6IHN0cmluZztcblxuICAvKipcbiAgICogVmFsdWVzIGZvciBDbG91ZEZvcm1hdGlvbiBzdGFjayBwYXJhbWV0ZXJzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB3aGVuIHRoZSBzdGFjayBpcyBkZXBsb3llZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwYXJhbWV0ZXJzXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzPzogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBWYWx1ZXMgZm9yIENsb3VkRm9ybWF0aW9uIHN0YWNrIHRhZ3MgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHdoZW4gdGhlIHN0YWNrIGlzIGRlcGxveWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIENsb3VkRm9ybWF0aW9uIHN0YWNrLlxuICAgKiBAZGVmYXVsdCAtIG5hbWUgZGVyaXZlZCBmcm9tIGFydGlmYWN0IElEXG4gICAqL1xuICByZWFkb25seSBzdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRlcm1pbmF0aW9uIHByb3RlY3Rpb24gZm9yIHRoaXMgc3RhY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB0ZXJtaW5hdGlvblByb3RlY3Rpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSB0aGF0IG5lZWRzIHRvIGJlIGFzc3VtZWQgdG8gZGVwbG95IHRoZSBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHJvbGUgaXMgYXNzdW1lZCAoY3VycmVudCBjcmVkZW50aWFscyBhcmUgdXNlZClcbiAgICovXG4gIHJlYWRvbmx5IGFzc3VtZVJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4dGVybmFsIElEIHRvIHVzZSB3aGVuIGFzc3VtaW5nIHJvbGUgZm9yIGNsb3VkZm9ybWF0aW9uIGRlcGxveW1lbnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZXh0ZXJuYWwgSURcbiAgICovXG4gIHJlYWRvbmx5IGFzc3VtZVJvbGVFeHRlcm5hbElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSB0aGF0IGlzIHBhc3NlZCB0byBDbG91ZEZvcm1hdGlvbiB0byBleGVjdXRlIHRoZSBjaGFuZ2Ugc2V0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcm9sZSBpcyBwYXNzZWQgKGN1cnJlbnRseSBhc3N1bWVkIHJvbGUvY3JlZGVudGlhbHMgYXJlIHVzZWQpXG4gICAqL1xuICByZWFkb25seSBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIHRvIHVzZSB0byBsb29rIHVwIHZhbHVlcyBmcm9tIHRoZSB0YXJnZXQgQVdTIGFjY291bnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyByb2xlIGlzIGFzc3VtZWQgKGN1cnJlbnQgY3JlZGVudGlhbHMgYXJlIHVzZWQpXG4gICAqL1xuICByZWFkb25seSBsb29rdXBSb2xlPzogQm9vdHN0cmFwUm9sZTtcblxuICAvKipcbiAgICogSWYgdGhlIHN0YWNrIHRlbXBsYXRlIGhhcyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgaW4gdGhlIGFzc2V0IG1hbmlmZXN0LCBpdHMgYXNzZXQgVVJMXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm90IHVwbG9hZGVkIHlldCwgdXBsb2FkIGp1c3QgYmVmb3JlIGRlcGxveWluZ1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tUZW1wbGF0ZUFzc2V0T2JqZWN0VXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIGJvb3RzdHJhcCBzdGFjayByZXF1aXJlZCB0byBkZXBsb3kgdGhpcyBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGJvb3RzdHJhcCBzdGFjayByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNTTSBwYXJhbWV0ZXIgd2hlcmUgdGhlIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uIG51bWJlciBjYW4gYmUgZm91bmRcbiAgICpcbiAgICogT25seSB1c2VkIGlmIGByZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbmAgaXMgc2V0LlxuICAgKlxuICAgKiAtIElmIHRoaXMgdmFsdWUgaXMgbm90IHNldCwgdGhlIGJvb3RzdHJhcCBzdGFjayBuYW1lIG11c3QgYmUga25vd24gYXRcbiAgICogICBkZXBsb3ltZW50IHRpbWUgc28gdGhlIHN0YWNrIHZlcnNpb24gY2FuIGJlIGxvb2tlZCB1cCBmcm9tIHRoZSBzdGFja1xuICAgKiAgIG91dHB1dHMuXG4gICAqIC0gSWYgdGhpcyB2YWx1ZSBpcyBzZXQsIHRoZSBib290c3RyYXAgc3RhY2sgY2FuIGhhdmUgYW55IG5hbWUgYmVjYXVzZVxuICAgKiAgIHdlIHdvbid0IG5lZWQgdG8gbG9vayBpdCB1cC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBCb290c3RyYXAgc3RhY2sgdmVyc2lvbiBudW1iZXIgbG9va2VkIHVwXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBzdGFjayBzaG91bGQgYmUgdmFsaWRhdGVkIGJ5IHRoZSBDTEkgYWZ0ZXIgc3ludGhlc2lzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkYXRlT25TeW50aD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXNzZXQgTWFuaWZlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldE1hbmlmZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIGJvb3RzdHJhcCBzdGFjayByZXF1aXJlZCB0byBkZXBsb3kgdGhpcyBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIFZlcnNpb24gMSAoYmFzaWMgbW9kZXJuIGJvb3RzdHJhcCBzdGFjaylcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTU00gcGFyYW1ldGVyIHdoZXJlIHRoZSBib290c3RyYXAgc3RhY2sgdmVyc2lvbiBudW1iZXIgY2FuIGJlIGZvdW5kXG4gICAqXG4gICAqIC0gSWYgdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCB0aGUgYm9vdHN0cmFwIHN0YWNrIG5hbWUgbXVzdCBiZSBrbm93biBhdFxuICAgKiAgIGRlcGxveW1lbnQgdGltZSBzbyB0aGUgc3RhY2sgdmVyc2lvbiBjYW4gYmUgbG9va2VkIHVwIGZyb20gdGhlIHN0YWNrXG4gICAqICAgb3V0cHV0cy5cbiAgICogLSBJZiB0aGlzIHZhbHVlIGlzIHNldCwgdGhlIGJvb3RzdHJhcCBzdGFjayBjYW4gaGF2ZSBhbnkgbmFtZSBiZWNhdXNlXG4gICAqICAgd2Ugd29uJ3QgbmVlZCB0byBsb29rIGl0IHVwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uIG51bWJlciBsb29rZWQgdXBcbiAgICovXG4gIHJlYWRvbmx5IGJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcnRpZmFjdCBwcm9wZXJ0aWVzIGZvciB0aGUgQXNzZXQgTWFuaWZlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldE1hbmlmZXN0UHJvcGVydGllcyBleHRlbmRzIEFzc2V0TWFuaWZlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIEZpbGVuYW1lIG9mIHRoZSBhc3NldCBtYW5pZmVzdFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFydGlmYWN0IHByb3BlcnRpZXMgZm9yIHRoZSBDb25zdHJ1Y3QgVHJlZSBBcnRpZmFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVBcnRpZmFjdFByb3BlcnRpZXMge1xuICAvKipcbiAgICogRmlsZW5hbWUgb2YgdGhlIHRyZWUgYXJ0aWZhY3RcbiAgICovXG4gIHJlYWRvbmx5IGZpbGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcnRpZmFjdCBwcm9wZXJ0aWVzIGZvciBuZXN0ZWQgY2xvdWQgYXNzZW1ibGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5lc3RlZENsb3VkQXNzZW1ibHlQcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIFJlbGF0aXZlIHBhdGggdG8gdGhlIG5lc3RlZCBjbG91ZCBhc3NlbWJseVxuICAgKi9cbiAgcmVhZG9ubHkgZGlyZWN0b3J5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IG5hbWUgZm9yIHRoZSBjbG91ZCBhc3NlbWJseVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBhcnRpZmFjdCBJRFxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgbWFuaWZlc3QgYXJ0aWZhY3RzXG4gKi9cbmV4cG9ydCB0eXBlIEFydGlmYWN0UHJvcGVydGllcyA9IEF3c0Nsb3VkRm9ybWF0aW9uU3RhY2tQcm9wZXJ0aWVzXG58IEFzc2V0TWFuaWZlc3RQcm9wZXJ0aWVzXG58IFRyZWVBcnRpZmFjdFByb3BlcnRpZXNcbnwgTmVzdGVkQ2xvdWRBc3NlbWJseVByb3BlcnRpZXM7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LoadBalancerListenerProtocol = exports.LoadBalancerType = exports.ContextProvider = void 0;\n/**\n * Identifier for the context provider\n */\nvar ContextProvider;\n(function (ContextProvider) {\n /**\n * AMI provider\n */\n ContextProvider[\"AMI_PROVIDER\"] = \"ami\";\n /**\n * AZ provider\n */\n ContextProvider[\"AVAILABILITY_ZONE_PROVIDER\"] = \"availability-zones\";\n /**\n * Route53 Hosted Zone provider\n */\n ContextProvider[\"HOSTED_ZONE_PROVIDER\"] = \"hosted-zone\";\n /**\n * SSM Parameter Provider\n */\n ContextProvider[\"SSM_PARAMETER_PROVIDER\"] = \"ssm\";\n /**\n * VPC Provider\n */\n ContextProvider[\"VPC_PROVIDER\"] = \"vpc-provider\";\n /**\n * VPC Endpoint Service AZ Provider\n */\n ContextProvider[\"ENDPOINT_SERVICE_AVAILABILITY_ZONE_PROVIDER\"] = \"endpoint-service-availability-zones\";\n /**\n * Load balancer provider\n */\n ContextProvider[\"LOAD_BALANCER_PROVIDER\"] = \"load-balancer\";\n /**\n * Load balancer listener provider\n */\n ContextProvider[\"LOAD_BALANCER_LISTENER_PROVIDER\"] = \"load-balancer-listener\";\n /**\n * Security group provider\n */\n ContextProvider[\"SECURITY_GROUP_PROVIDER\"] = \"security-group\";\n /**\n * KMS Key Provider\n */\n ContextProvider[\"KEY_PROVIDER\"] = \"key-provider\";\n /**\n * A plugin provider (the actual plugin name will be in the properties)\n */\n ContextProvider[\"PLUGIN\"] = \"plugin\";\n})(ContextProvider || (exports.ContextProvider = ContextProvider = {}));\n/**\n * Type of load balancer\n */\nvar LoadBalancerType;\n(function (LoadBalancerType) {\n /**\n * Network load balancer\n */\n LoadBalancerType[\"NETWORK\"] = \"network\";\n /**\n * Application load balancer\n */\n LoadBalancerType[\"APPLICATION\"] = \"application\";\n})(LoadBalancerType || (exports.LoadBalancerType = LoadBalancerType = {}));\n/**\n * The protocol for connections from clients to the load balancer\n */\nvar LoadBalancerListenerProtocol;\n(function (LoadBalancerListenerProtocol) {\n /**\n * HTTP protocol\n */\n LoadBalancerListenerProtocol[\"HTTP\"] = \"HTTP\";\n /**\n * HTTPS protocol\n */\n LoadBalancerListenerProtocol[\"HTTPS\"] = \"HTTPS\";\n /**\n * TCP protocol\n */\n LoadBalancerListenerProtocol[\"TCP\"] = \"TCP\";\n /**\n * TLS protocol\n */\n LoadBalancerListenerProtocol[\"TLS\"] = \"TLS\";\n /**\n * UDP protocol\n * */\n LoadBalancerListenerProtocol[\"UDP\"] = \"UDP\";\n /**\n * TCP and UDP protocol\n * */\n LoadBalancerListenerProtocol[\"TCP_UDP\"] = \"TCP_UDP\";\n})(LoadBalancerListenerProtocol || (exports.LoadBalancerListenerProtocol = LoadBalancerListenerProtocol = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1xdWVyaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29udGV4dC1xdWVyaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOztHQUVHO0FBQ0gsSUFBWSxlQXVEWDtBQXZERCxXQUFZLGVBQWU7SUFDekI7O09BRUc7SUFDSCx1Q0FBb0IsQ0FBQTtJQUVwQjs7T0FFRztJQUNILG9FQUFpRCxDQUFBO0lBRWpEOztPQUVHO0lBQ0gsdURBQW9DLENBQUE7SUFFcEM7O09BRUc7SUFDSCxpREFBOEIsQ0FBQTtJQUU5Qjs7T0FFRztJQUNILGdEQUE2QixDQUFBO0lBRTdCOztPQUVHO0lBQ0gsc0dBQW1GLENBQUE7SUFFbkY7O09BRUc7SUFDSCwyREFBd0MsQ0FBQTtJQUV4Qzs7T0FFRztJQUNILDZFQUEwRCxDQUFBO0lBRTFEOztPQUVHO0lBQ0gsNkRBQTBDLENBQUE7SUFFMUM7O09BRUc7SUFDSCxnREFBNkIsQ0FBQTtJQUU3Qjs7T0FFRztJQUNILG9DQUFpQixDQUFBO0FBQ25CLENBQUMsRUF2RFcsZUFBZSwrQkFBZixlQUFlLFFBdUQxQjtBQXdORDs7R0FFRztBQUNILElBQVksZ0JBVVg7QUFWRCxXQUFZLGdCQUFnQjtJQUMxQjs7T0FFRztJQUNILHVDQUFtQixDQUFBO0lBRW5COztPQUVHO0lBQ0gsK0NBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQVZXLGdCQUFnQixnQ0FBaEIsZ0JBQWdCLFFBVTNCO0FBOENEOztHQUVHO0FBQ0gsSUFBWSw0QkE4Qlg7QUE5QkQsV0FBWSw0QkFBNEI7SUFDdEM7O09BRUc7SUFDSCw2Q0FBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCwrQ0FBZSxDQUFBO0lBRWY7O09BRUc7SUFDSCwyQ0FBVyxDQUFBO0lBRVg7O09BRUc7SUFDSCwyQ0FBVyxDQUFBO0lBRVg7O1NBRUs7SUFDTCwyQ0FBVyxDQUFBO0lBRVg7O1NBRUs7SUFDTCxtREFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBOUJXLDRCQUE0Qiw0Q0FBNUIsNEJBQTRCLFFBOEJ2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhZyB9IGZyb20gJy4vbWV0YWRhdGEtc2NoZW1hJztcblxuLyoqXG4gKiBJZGVudGlmaWVyIGZvciB0aGUgY29udGV4dCBwcm92aWRlclxuICovXG5leHBvcnQgZW51bSBDb250ZXh0UHJvdmlkZXIge1xuICAvKipcbiAgICogQU1JIHByb3ZpZGVyXG4gICAqL1xuICBBTUlfUFJPVklERVIgPSAnYW1pJyxcblxuICAvKipcbiAgICogQVogcHJvdmlkZXJcbiAgICovXG4gIEFWQUlMQUJJTElUWV9aT05FX1BST1ZJREVSID0gJ2F2YWlsYWJpbGl0eS16b25lcycsXG5cbiAgLyoqXG4gICAqIFJvdXRlNTMgSG9zdGVkIFpvbmUgcHJvdmlkZXJcbiAgICovXG4gIEhPU1RFRF9aT05FX1BST1ZJREVSID0gJ2hvc3RlZC16b25lJyxcblxuICAvKipcbiAgICogU1NNIFBhcmFtZXRlciBQcm92aWRlclxuICAgKi9cbiAgU1NNX1BBUkFNRVRFUl9QUk9WSURFUiA9ICdzc20nLFxuXG4gIC8qKlxuICAgKiBWUEMgUHJvdmlkZXJcbiAgICovXG4gIFZQQ19QUk9WSURFUiA9ICd2cGMtcHJvdmlkZXInLFxuXG4gIC8qKlxuICAgKiBWUEMgRW5kcG9pbnQgU2VydmljZSBBWiBQcm92aWRlclxuICAgKi9cbiAgRU5EUE9JTlRfU0VSVklDRV9BVkFJTEFCSUxJVFlfWk9ORV9QUk9WSURFUiA9ICdlbmRwb2ludC1zZXJ2aWNlLWF2YWlsYWJpbGl0eS16b25lcycsXG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgcHJvdmlkZXJcbiAgICovXG4gIExPQURfQkFMQU5DRVJfUFJPVklERVIgPSAnbG9hZC1iYWxhbmNlcicsXG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgbGlzdGVuZXIgcHJvdmlkZXJcbiAgICovXG4gIExPQURfQkFMQU5DRVJfTElTVEVORVJfUFJPVklERVIgPSAnbG9hZC1iYWxhbmNlci1saXN0ZW5lcicsXG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IGdyb3VwIHByb3ZpZGVyXG4gICAqL1xuICBTRUNVUklUWV9HUk9VUF9QUk9WSURFUiA9ICdzZWN1cml0eS1ncm91cCcsXG5cbiAgLyoqXG4gICAqIEtNUyBLZXkgUHJvdmlkZXJcbiAgICovXG4gIEtFWV9QUk9WSURFUiA9ICdrZXktcHJvdmlkZXInLFxuXG4gIC8qKlxuICAgKiBBIHBsdWdpbiBwcm92aWRlciAodGhlIGFjdHVhbCBwbHVnaW4gbmFtZSB3aWxsIGJlIGluIHRoZSBwcm9wZXJ0aWVzKVxuICAgKi9cbiAgUExVR0lOID0gJ3BsdWdpbicsXG59XG5cbi8qKlxuICogUXVlcnkgdG8gQU1JIGNvbnRleHQgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbWlDb250ZXh0UXVlcnkge1xuICAvKipcbiAgICogQWNjb3VudCB0byBxdWVyeVxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWdpb24gdG8gcXVlcnlcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSByb2xlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gbG9vayB1cCB0aGUgbWlzc2luZyB2YWx1ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBsb29rdXBSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPd25lcnMgdG8gRGVzY3JpYmVJbWFnZXMgY2FsbFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFsbCBvd25lcnNcbiAgICovXG4gIHJlYWRvbmx5IG93bmVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHRvIERlc2NyaWJlSW1hZ2VzIGNhbGxcbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcnM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmdbXX07XG59XG5cbi8qKlxuICogUXVlcnkgdG8gYXZhaWxhYmlsaXR5IHpvbmUgY29udGV4dCBwcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF2YWlsYWJpbGl0eVpvbmVzQ29udGV4dFF1ZXJ5IHtcbiAgLyoqXG4gICAqIFF1ZXJ5IGFjY291bnRcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogUXVlcnkgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcm9sZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIG1pc3NpbmcgdmFsdWVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZUFybj86IHN0cmluZztcblxufVxuXG4vKipcbiAqIFF1ZXJ5IHRvIGhvc3RlZCB6b25lIGNvbnRleHQgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0ZWRab25lQ29udGV4dFF1ZXJ5IHtcbiAgLyoqXG4gICAqIFF1ZXJ5IGFjY291bnRcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogUXVlcnkgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcm9sZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIG1pc3NpbmcgdmFsdWVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvbWFpbiBuYW1lIGUuZy4gZXhhbXBsZS5jb20gdG8gbG9va3VwXG4gICAqL1xuICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRydWUgaWYgdGhlIHpvbmUgeW91IHdhbnQgdG8gZmluZCBpcyBhIHByaXZhdGUgaG9zdGVkIHpvbmVcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGVab25lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIFZQQyBJRCB0byB0aGF0IHRoZSBwcml2YXRlIHpvbmUgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICpcbiAgICogSWYgeW91IHByb3ZpZGUgVlBDIElEIGFuZCBwcml2YXRlWm9uZSBpcyBmYWxzZSwgdGhpcyB3aWxsIHJldHVybiBubyByZXN1bHRzXG4gICAqIGFuZCByYWlzZSBhbiBlcnJvci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBSZXF1aXJlZCBpZiBwcml2YXRlWm9uZT10cnVlXG4gICAqL1xuICByZWFkb25seSB2cGNJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBRdWVyeSB0byBTU00gUGFyYW1ldGVyIENvbnRleHQgUHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTU01QYXJhbWV0ZXJDb250ZXh0UXVlcnkge1xuICAvKipcbiAgICogUXVlcnkgYWNjb3VudFxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBRdWVyeSByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSByb2xlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gbG9vayB1cCB0aGUgbWlzc2luZyB2YWx1ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBsb29rdXBSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXJhbWV0ZXIgbmFtZSB0byBxdWVyeVxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFF1ZXJ5IGlucHV0IGZvciBsb29raW5nIHVwIGEgVlBDXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjQ29udGV4dFF1ZXJ5IHtcbiAgLyoqXG4gICAqIFF1ZXJ5IGFjY291bnRcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogUXVlcnkgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcm9sZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIG1pc3NpbmcgdmFsdWVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsdGVycyB0byBhcHBseSB0byB0aGUgVlBDXG4gICAqXG4gICAqIEZpbHRlciBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyBwYXNzZWQgdG8gRGVzY3JpYmVWcGNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVWcGNzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcjoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcG9wdWxhdGUgdGhlIHN1Ym5ldEdyb3VwcyBmaWVsZCBvZiB0aGUgYFZwY0NvbnRleHRSZXNwb25zZWAsXG4gICAqIHdoaWNoIGNvbnRhaW5zIHBvdGVudGlhbGx5IGFzeW1tZXRyaWMgc3VibmV0IGdyb3Vwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJldHVybkFzeW1tZXRyaWNTdWJuZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgdGFnIGZvciBzdWJuZXQgZ3JvdXAgbmFtZS5cbiAgICogSWYgbm90IHByb3ZpZGVkLCB3ZSdsbCBsb29rIGF0IHRoZSBhd3MtY2RrOnN1Ym5ldC1uYW1lIHRhZy5cbiAgICogSWYgdGhlIHN1Ym5ldCBkb2VzIG5vdCBoYXZlIHRoZSBzcGVjaWZpZWQgdGFnLFxuICAgKiB3ZSdsbCB1c2UgaXRzIHR5cGUgYXMgdGhlIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdhd3MtY2RrOnN1Ym5ldC1uYW1lJ1xuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0R3JvdXBOYW1lVGFnPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHBvcHVsYXRlIHRoZSBgdnBuR2F0ZXdheUlkYCBmaWVsZCBvZiB0aGUgYFZwY0NvbnRleHRSZXNwb25zZWAsXG4gICAqIHdoaWNoIGNvbnRhaW5zIHRoZSBWUE4gR2F0ZXdheSBJRCwgaWYgb25lIGV4aXN0cy4gWW91IGNhbiBleHBsaWNpdGx5XG4gICAqIGRpc2FibGUgdGhpcyBpbiBvcmRlciB0byBhdm9pZCB0aGUgbG9va3VwIGlmIHlvdSBrbm93IHRoZSBWUEMgZG9lcyBub3QgaGF2ZVxuICAgKiBhIFZQTiBHYXR3YXkgYXR0YWNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJldHVyblZwbkdhdGV3YXlzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBRdWVyeSB0byBlbmRwb2ludCBzZXJ2aWNlIGNvbnRleHQgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmRwb2ludFNlcnZpY2VBdmFpbGFiaWxpdHlab25lc0NvbnRleHRRdWVyeSB7XG4gIC8qKlxuICAgKiBRdWVyeSBhY2NvdW50XG4gICAqL1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHJvbGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBsb29rIHVwIHRoZSBtaXNzaW5nIHZhbHVlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cFJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHNlcnZpY2UgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlIG9mIGxvYWQgYmFsYW5jZXJcbiAqL1xuZXhwb3J0IGVudW0gTG9hZEJhbGFuY2VyVHlwZSB7XG4gIC8qKlxuICAgKiBOZXR3b3JrIGxvYWQgYmFsYW5jZXJcbiAgICovXG4gIE5FVFdPUksgPSAnbmV0d29yaycsXG5cbiAgLyoqXG4gICAqIEFwcGxpY2F0aW9uIGxvYWQgYmFsYW5jZXJcbiAgICovXG4gIEFQUExJQ0FUSU9OID0gJ2FwcGxpY2F0aW9uJyxcbn1cblxuLyoqXG4gKiBGaWx0ZXJzIGZvciBzZWxlY3RpbmcgbG9hZCBiYWxhbmNlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkQmFsYW5jZXJGaWx0ZXIge1xuICAvKipcbiAgICogRmlsdGVyIGxvYWQgYmFsYW5jZXJzIGJ5IHRoZWlyIHR5cGVcbiAgICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlclR5cGU6IExvYWRCYWxhbmNlclR5cGU7XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbG9hZCBiYWxhbmNlcidzIEFSTlxuICAgKiBAZGVmYXVsdCAtIGRvZXMgbm90IHNlYXJjaCBieSBsb2FkIGJhbGFuY2VyIGFyblxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXRjaCBsb2FkIGJhbGFuY2VyIHRhZ3NcbiAgICogQGRlZmF1bHQgLSBkb2VzIG5vdCBtYXRjaCBsb2FkIGJhbGFuY2VycyBieSB0YWdzXG4gICAqL1xuICByZWFkb25seSBsb2FkQmFsYW5jZXJUYWdzPzogVGFnW107XG59XG5cbi8qKlxuICogUXVlcnkgaW5wdXQgZm9yIGxvb2tpbmcgdXAgYSBsb2FkIGJhbGFuY2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZEJhbGFuY2VyQ29udGV4dFF1ZXJ5IGV4dGVuZHMgTG9hZEJhbGFuY2VyRmlsdGVyIHtcbiAgLyoqXG4gICAqIFF1ZXJ5IGFjY291bnRcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcblxuICAvKipcbiAgICogUXVlcnkgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcm9sZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIG1pc3NpbmcgdmFsdWVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwUm9sZUFybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcHJvdG9jb2wgZm9yIGNvbm5lY3Rpb25zIGZyb20gY2xpZW50cyB0byB0aGUgbG9hZCBiYWxhbmNlclxuICovXG5leHBvcnQgZW51bSBMb2FkQmFsYW5jZXJMaXN0ZW5lclByb3RvY29sIHtcbiAgLyoqXG4gICAqIEhUVFAgcHJvdG9jb2xcbiAgICovXG4gIEhUVFAgPSAnSFRUUCcsXG5cbiAgLyoqXG4gICAqIEhUVFBTIHByb3RvY29sXG4gICAqL1xuICBIVFRQUyA9ICdIVFRQUycsXG5cbiAgLyoqXG4gICAqIFRDUCBwcm90b2NvbFxuICAgKi9cbiAgVENQID0gJ1RDUCcsXG5cbiAgLyoqXG4gICAqIFRMUyBwcm90b2NvbFxuICAgKi9cbiAgVExTID0gJ1RMUycsXG5cbiAgLyoqXG4gICAqIFVEUCBwcm90b2NvbFxuICAgKiAqL1xuICBVRFAgPSAnVURQJyxcblxuICAvKipcbiAgICogVENQIGFuZCBVRFAgcHJvdG9jb2xcbiAgICogKi9cbiAgVENQX1VEUCA9ICdUQ1BfVURQJyxcbn1cblxuLyoqXG4gKiBRdWVyeSBpbnB1dCBmb3IgbG9va2luZyB1cCBhIGxvYWQgYmFsYW5jZXIgbGlzdGVuZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkQmFsYW5jZXJMaXN0ZW5lckNvbnRleHRRdWVyeSBleHRlbmRzIExvYWRCYWxhbmNlckZpbHRlciB7XG4gIC8qKlxuICAgKiBRdWVyeSBhY2NvdW50XG4gICAqL1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHJvbGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBsb29rIHVwIHRoZSBtaXNzaW5nIHZhbHVlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cFJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbGlzdGVuZXIncyBhcm5cbiAgICogQGRlZmF1bHQgLSBkb2VzIG5vdCBmaW5kIGJ5IGxpc3RlbmVyIGFyblxuICAgKi9cbiAgcmVhZG9ubHkgbGlzdGVuZXJBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBsaXN0ZW5lciBwcm90b2NvbFxuICAgKiBAZGVmYXVsdCAtIGRvZXMgbm90IGZpbHRlciBieSBsaXN0ZW5lciBwcm90b2NvbFxuICAgKi9cbiAgcmVhZG9ubHkgbGlzdGVuZXJQcm90b2NvbD86IExvYWRCYWxhbmNlckxpc3RlbmVyUHJvdG9jb2w7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBsaXN0ZW5lcnMgYnkgbGlzdGVuZXIgcG9ydFxuICAgKiBAZGVmYXVsdCAtIGRvZXMgbm90IGZpbHRlciBieSBhIGxpc3RlbmVyIHBvcnRcbiAgICovXG4gIHJlYWRvbmx5IGxpc3RlbmVyUG9ydD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBRdWVyeSBpbnB1dCBmb3IgbG9va2luZyB1cCBhIHNlY3VyaXR5IGdyb3VwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlHcm91cENvbnRleHRRdWVyeSB7XG4gIC8qKlxuICAgKiBRdWVyeSBhY2NvdW50XG4gICAqL1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHJvbGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBsb29rIHVwIHRoZSBtaXNzaW5nIHZhbHVlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cFJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IGdyb3VwIGlkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZQQyBJRFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHZwY0lkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFF1ZXJ5IGlucHV0IGZvciBsb29raW5nIHVwIGEgS01TIEtleVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtleUNvbnRleHRRdWVyeSB7XG4gIC8qKlxuICAgKiBRdWVyeSBhY2NvdW50XG4gICAqL1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHJvbGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBsb29rIHVwIHRoZSBtaXNzaW5nIHZhbHVlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cFJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsaWFzIG5hbWUgdXNlZCB0byBzZWFyY2ggdGhlIEtleVxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUXVlcnkgaW5wdXQgZm9yIHBsdWdpbnNcbiAqXG4gKiBUaGlzIGFsdGVybmF0ZSBicmFuY2ggaXMgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgYWJsZSB0byBlc2NhcGUgYWxsIHR5cGUgY2hlY2tpbmdcbiAqIHdlIGRvIG9uIG9uIHRoZSBjbG91ZCBhc3NlbWJseSAtLSB3ZSBjYW5ub3Qga25vdyB0aGUgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgdXNlZCBhIHByaW9yaS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Db250ZXh0UXVlcnkge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHBsdWdpblxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcmJpdHJhcnkgb3RoZXIgYXJndW1lbnRzIGZvciB0aGUgcGx1Z2luLlxuICAgKlxuICAgKiBUaGlzIGluZGV4IHNpZ25hdHVyZSBpcyBub3QgdXNhYmxlIGluIG5vbi1UeXBlU2NyaXB0L0phdmFTY3JpcHQgbGFuZ3VhZ2VzLlxuICAgKlxuICAgKiBAanNpaSBpZ25vcmVcbiAgICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgQ29udGV4dFF1ZXJ5UHJvcGVydGllcyA9IEFtaUNvbnRleHRRdWVyeVxufCBBdmFpbGFiaWxpdHlab25lc0NvbnRleHRRdWVyeVxufCBIb3N0ZWRab25lQ29udGV4dFF1ZXJ5XG58IFNTTVBhcmFtZXRlckNvbnRleHRRdWVyeVxufCBWcGNDb250ZXh0UXVlcnlcbnwgRW5kcG9pbnRTZXJ2aWNlQXZhaWxhYmlsaXR5Wm9uZXNDb250ZXh0UXVlcnlcbnwgTG9hZEJhbGFuY2VyQ29udGV4dFF1ZXJ5XG58IExvYWRCYWxhbmNlckxpc3RlbmVyQ29udGV4dFF1ZXJ5XG58IFNlY3VyaXR5R3JvdXBDb250ZXh0UXVlcnlcbnwgS2V5Q29udGV4dFF1ZXJ5XG58IFBsdWdpbkNvbnRleHRRdWVyeTtcblxuIl19","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./schema\"), exports);\n__exportStar(require(\"./metadata-schema\"), exports);\n__exportStar(require(\"./artifact-schema\"), exports);\n__exportStar(require(\"./context-queries\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLG9EQUFrQztBQUNsQyxvREFBa0M7QUFDbEMsb0RBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zY2hlbWEnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRhZGF0YS1zY2hlbWEnO1xuZXhwb3J0ICogZnJvbSAnLi9hcnRpZmFjdC1zY2hlbWEnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250ZXh0LXF1ZXJpZXMnO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ArtifactMetadataEntryType = void 0;\n/**\n * Type of artifact metadata entry.\n */\nvar ArtifactMetadataEntryType;\n(function (ArtifactMetadataEntryType) {\n /**\n * Asset in metadata.\n */\n ArtifactMetadataEntryType[\"ASSET\"] = \"aws:cdk:asset\";\n /**\n * Metadata key used to print INFO-level messages by the toolkit when an app is syntheized.\n */\n ArtifactMetadataEntryType[\"INFO\"] = \"aws:cdk:info\";\n /**\n * Metadata key used to print WARNING-level messages by the toolkit when an app is syntheized.\n */\n ArtifactMetadataEntryType[\"WARN\"] = \"aws:cdk:warning\";\n /**\n * Metadata key used to print ERROR-level messages by the toolkit when an app is syntheized.\n */\n ArtifactMetadataEntryType[\"ERROR\"] = \"aws:cdk:error\";\n /**\n * Represents the CloudFormation logical ID of a resource at a certain path.\n */\n ArtifactMetadataEntryType[\"LOGICAL_ID\"] = \"aws:cdk:logicalId\";\n /**\n * Represents tags of a stack.\n */\n ArtifactMetadataEntryType[\"STACK_TAGS\"] = \"aws:cdk:stack-tags\";\n})(ArtifactMetadataEntryType || (exports.ArtifactMetadataEntryType = ArtifactMetadataEntryType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWV0YWRhdGEtc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW9RQTs7R0FFRztBQUNILElBQVkseUJBOEJYO0FBOUJELFdBQVkseUJBQXlCO0lBQ25DOztPQUVHO0lBQ0gsb0RBQXVCLENBQUE7SUFFdkI7O09BRUc7SUFDSCxrREFBcUIsQ0FBQTtJQUVyQjs7T0FFRztJQUNILHFEQUF3QixDQUFBO0lBRXhCOztPQUVHO0lBQ0gsb0RBQXVCLENBQUE7SUFFdkI7O09BRUc7SUFDSCw2REFBZ0MsQ0FBQTtJQUVoQzs7T0FFRztJQUNILDhEQUFpQyxDQUFBO0FBQ25DLENBQUMsRUE5QlcseUJBQXlCLHlDQUF6Qix5QkFBeUIsUUE4QnBDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21tb24gcHJvcGVydGllcyBmb3IgYXNzZXQgbWV0YWRhdGEuXG4gKi9cbmludGVyZmFjZSBCYXNlQXNzZXRNZXRhZGF0YUVudHJ5IHtcbiAgLyoqXG4gICAqIFJlcXVlc3RlZCBwYWNrYWdpbmcgc3R5bGVcbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2luZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMb2dpY2FsIGlkZW50aWZpZXIgZm9yIHRoZSBhc3NldFxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGhhc2ggb2YgdGhlIGFzc2V0IHNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUhhc2g6IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCBvbiBkaXNrIHRvIHRoZSBhc3NldFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIEVudHJ5IHNwZWMgZm9yIGZpbGVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBlbnRyeSA9IHtcbiAqICAgcGFja2FnaW5nOiAnZmlsZScsXG4gKiAgIHMzQnVja2V0UGFyYW1ldGVyOiAnYnVja2V0LXBhcmFtZXRlcicsXG4gKiAgIHMzS2V5UGFyYW1lbnRlcjogJ2tleS1wYXJhbWV0ZXInLFxuICogICBhcnRpZmFjdEhhc2hQYXJhbWV0ZXI6ICdoYXNoLXBhcmFtZXRlcicsXG4gKiB9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUFzc2V0TWV0YWRhdGFFbnRyeSBleHRlbmRzIEJhc2VBc3NldE1ldGFkYXRhRW50cnkge1xuICAvKipcbiAgICogUmVxdWVzdGVkIHBhY2thZ2luZyBzdHlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnaW5nOiAnemlwJyB8ICdmaWxlJztcblxuICAvKipcbiAgICogTmFtZSBvZiBwYXJhbWV0ZXIgd2hlcmUgUzMgYnVja2V0IHNob3VsZCBiZSBwYXNzZWQgaW5cbiAgICovXG4gIHJlYWRvbmx5IHMzQnVja2V0UGFyYW1ldGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgcGFyYW1ldGVyIHdoZXJlIFMzIGtleSBzaG91bGQgYmUgcGFzc2VkIGluXG4gICAqL1xuICByZWFkb25seSBzM0tleVBhcmFtZXRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHdoZXJlIHRoZSBoYXNoIG9mIHRoZSBidW5kbGVkIGFzc2V0IHNob3VsZCBiZSBwYXNzZWQgaW4uXG4gICAqL1xuICByZWFkb25seSBhcnRpZmFjdEhhc2hQYXJhbWV0ZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBNZXRhZGF0YSBFbnRyeSBzcGVjIGZvciBzdGFjayB0YWcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFnIHtcbiAgLyoqXG4gICAqIFRhZyBrZXkuXG4gICAqXG4gICAqIChJbiB0aGUgYWN0dWFsIGZpbGUgb24gZGlzayB0aGlzIHdpbGwgYmUgY2FzZWQgYXMgXCJLZXlcIiwgYW5kIHRoZSBzdHJ1Y3R1cmUgaXNcbiAgICogcGF0Y2hlZCB0byBtYXRjaCB0aGlzIHN0cnVjdHVyZSB1cG9uIGxvYWRpbmc6XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iLzRhYWRhYTc3OWI0OGYzNTgzOGNjY2Q0ZTI1MTA3YjIzMzhmMDU1NDcvcGFja2FnZXMvJTQwYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEvbGliL21hbmlmZXN0LnRzI0wxMzcpXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUYWcgdmFsdWUuXG4gICAqXG4gICAqIChJbiB0aGUgYWN0dWFsIGZpbGUgb24gZGlzayB0aGlzIHdpbGwgYmUgY2FzZWQgYXMgXCJWYWx1ZVwiLCBhbmQgdGhlIHN0cnVjdHVyZSBpc1xuICAgKiBwYXRjaGVkIHRvIG1hdGNoIHRoaXMgc3RydWN0dXJlIHVwb24gbG9hZGluZzpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvNGFhZGFhNzc5YjQ4ZjM1ODM4Y2NjZDRlMjUxMDdiMjMzOGYwNTU0Ny9wYWNrYWdlcy8lNDBhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYS9saWIvbWFuaWZlc3QudHMjTDEzNylcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgRG9ja2VyIGNhY2hlIGJhY2tlbmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJJbWFnZUFzc2V0Q2FjaGVPcHRpb24ge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLlxuICAgKiBSZWZlciB0byBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9idWlsZC9jYWNoZS9iYWNrZW5kcy8gZm9yIGZ1bGwgbGlzdCBvZiBiYWNrZW5kcy5cbiAgICogQGRlZmF1bHQgLSB1bnNwZWNpZmllZFxuICAgKlxuICAgKiBAZXhhbXBsZSAncmVnaXN0cnknXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbnkgcGFyYW1ldGVycyB0byBwYXNzIGludG8gdGhlIGRvY2tlciBjYWNoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24uXG4gICAqIFJlZmVyIHRvIGh0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2J1aWxkL2NhY2hlL2JhY2tlbmRzLyBmb3IgY2FjaGUgYmFja2VuZCBjb25maWd1cmF0aW9uLlxuICAgKiBAZGVmYXVsdCB7fSBObyBvcHRpb25zIHByb3ZpZGVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGRlY2xhcmUgY29uc3QgYnJhbmNoOiBzdHJpbmc7XG4gICAqXG4gICAqIGNvbnN0IHBhcmFtcyA9IHtcbiAgICogICByZWY6IGAxMjM0NTY3OC5ka3IuZWNyLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL2NhY2hlOiR7YnJhbmNofWAsXG4gICAqICAgbW9kZTogXCJtYXhcIixcbiAgICogfTtcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogTWV0YWRhdGEgRW50cnkgc3BlYyBmb3IgY29udGFpbmVyIGltYWdlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZW50cnkgPSB7XG4gKiAgIHBhY2thZ2luZzogJ2NvbnRhaW5lci1pbWFnZScsXG4gKiAgIHJlcG9zaXRvcnlOYW1lOiAncmVwb3NpdG9yeS1uYW1lJyxcbiAqICAgaW1hZ2VUYWc6ICd0YWcnLFxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lckltYWdlQXNzZXRNZXRhZGF0YUVudHJ5IGV4dGVuZHMgQmFzZUFzc2V0TWV0YWRhdGFFbnRyeSB7XG4gIC8qKlxuICAgKiBUeXBlIG9mIGFzc2V0XG4gICAqL1xuICByZWFkb25seSBwYWNrYWdpbmc6ICdjb250YWluZXItaW1hZ2UnO1xuXG4gIC8qKlxuICAgKiBFQ1IgUmVwb3NpdG9yeSBuYW1lIGFuZCByZXBvIGRpZ2VzdCAoc2VwYXJhdGVkIGJ5IFwiQHNoYTI1NjpcIikgd2hlcmUgdGhpc1xuICAgKiBpbWFnZSBpcyBzdG9yZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCBJZiBub3Qgc3BlY2lmaWVkLCBgcmVwb3NpdG9yeU5hbWVgIGFuZCBgaW1hZ2VUYWdgIGFyZVxuICAgKiByZXF1aXJlZCBiZWNhdXNlIG90aGVyd2lzZSBob3cgd2lsbCB0aGUgc3RhY2sga25vdyB3aGVyZSB0byBmaW5kIHRoZSBhc3NldCxcbiAgICogaGE/XG4gICAqIEBkZXByZWNhdGVkIHNwZWNpZnkgYHJlcG9zaXRvcnlOYW1lYCBhbmQgYGltYWdlVGFnYCBpbnN0ZWFkLCBhbmQgdGhlbiB5b3VcbiAgICoga25vdyB3aGVyZSB0aGUgaW1hZ2Ugd2lsbCBnby5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlTmFtZVBhcmFtZXRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogRUNSIHJlcG9zaXRvcnkgbmFtZSwgaWYgb21pdHRlZCBhIGRlZmF1bHQgbmFtZSBiYXNlZCBvbiB0aGUgYXNzZXQncyBJRCBpc1xuICAgKiB1c2VkIGluc3RlYWQuIFNwZWNpZnkgdGhpcyBwcm9wZXJ0eSBpZiB5b3UgbmVlZCB0byBzdGF0aWNhbGx5IGFkZHJlc3MgdGhlXG4gICAqIGltYWdlLCBlLmcuIGZyb20gYSBLdWJlcm5ldGVzIFBvZC4gTm90ZSwgdGhpcyBpcyBvbmx5IHRoZSByZXBvc2l0b3J5IG5hbWUsXG4gICAqIHdpdGhvdXQgdGhlIHJlZ2lzdHJ5IGFuZCB0aGUgdGFnIHBhcnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoaXMgcGFyYW1ldGVyIGlzIFJFUVVJUkVEIGFmdGVyIDEuMjEuMFxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2NrZXIgaW1hZ2UgdGFnIHRvIHVzZSBmb3IgdGFnZ2luZyBwdXNoZWQgaW1hZ2VzLiBUaGlzIGZpZWxkIGlzXG4gICAqIHJlcXVpcmVkIGlmIGBpbWFnZVBhcmFtZXRlck5hbWVgIGlzIG9tbWl0ZWQgKG90aGVyd2lzZSwgdGhlIGFwcCB3b24ndCBiZVxuICAgKiBhYmxlIHRvIGZpbmQgdGhlIGltYWdlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGlzIHBhcmFtZXRlciBpcyBSRVFVSVJFRCBhZnRlciAxLjIxLjBcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlVGFnPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBhcmdzIHRvIHBhc3MgdG8gdGhlIGBkb2NrZXIgYnVpbGRgIGNvbW1hbmRcbiAgICpcbiAgICogQGRlZmF1bHQgbm8gYnVpbGQgYXJncyBhcmUgcGFzc2VkXG4gICAqL1xuICByZWFkb25seSBidWlsZEFyZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBTU0ggYWdlbnQgc29ja2V0IG9yIGtleXMgdG8gcGFzcyB0byB0aGUgYGRvY2tlciBidWlsZGAgY29tbWFuZFxuICAgKlxuICAgKiBAZGVmYXVsdCBubyBzc2ggYXJnIGlzIHBhc3NlZFxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRTc2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHNlY3JldHMgdG8gcGFzcyB0byB0aGUgYGRvY2tlciBidWlsZGAgY29tbWFuZFxuICAgKlxuICAgKiBAZGVmYXVsdCBubyBidWlsZCBzZWNyZXRzIGFyZSBwYXNzZWRcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkU2VjcmV0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIERvY2tlciB0YXJnZXQgdG8gYnVpbGQgdG9cbiAgICpcbiAgICogQGRlZmF1bHQgbm8gYnVpbGQgdGFyZ2V0XG4gICAqL1xuICByZWFkb25seSB0YXJnZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gdGhlIERvY2tlcmZpbGUgKHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGZpbGUgaXMgcGFzc2VkXG4gICAqL1xuICByZWFkb25seSBmaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOZXR3b3JraW5nIG1vZGUgZm9yIHRoZSBSVU4gY29tbWFuZHMgZHVyaW5nIGJ1aWxkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG5ldHdvcmtpbmcgbW9kZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtNb2RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbGF0Zm9ybSB0byBidWlsZCBmb3IuIF9SZXF1aXJlcyBEb2NrZXIgQnVpbGR4Xy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBjdXJyZW50IG1hY2hpbmUgcGxhdGZvcm1cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdXRwdXRzIHRvIHBhc3MgdG8gdGhlIGBkb2NrZXIgYnVpbGRgIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gb3V0cHV0cyBhcmUgcGFzc2VkIHRvIHRoZSBidWlsZCBjb21tYW5kIChkZWZhdWx0IG91dHB1dHMgYXJlIHVzZWQpXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9jb21tYW5kbGluZS9idWlsZC8jY3VzdG9tLWJ1aWxkLW91dHB1dHNcbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ2FjaGUgZnJvbSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIGBkb2NrZXIgYnVpbGRgIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY2FjaGUgZnJvbSBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIGJ1aWxkIGNvbW1hbmRcbiAgICogQHNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9idWlsZC9jYWNoZS9iYWNrZW5kcy9cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRnJvbT86IENvbnRhaW5lckltYWdlQXNzZXRDYWNoZU9wdGlvbltdO1xuXG4gIC8qKlxuICAgKiBDYWNoZSB0byBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIGBkb2NrZXIgYnVpbGRgIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY2FjaGUgdG8gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSBidWlsZCBjb21tYW5kXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vYnVpbGQvY2FjaGUvYmFja2VuZHMvXG4gICAqL1xuICByZWFkb25seSBjYWNoZVRvPzogQ29udGFpbmVySW1hZ2VBc3NldENhY2hlT3B0aW9uO1xufVxuXG4vKipcbiAqIEBzZWUgQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5BU1NFVFxuICovXG5leHBvcnQgdHlwZSBBc3NldE1ldGFkYXRhRW50cnkgPSBGaWxlQXNzZXRNZXRhZGF0YUVudHJ5IHwgQ29udGFpbmVySW1hZ2VBc3NldE1ldGFkYXRhRW50cnk7XG5cbi8vIFR5cGUgYWxpYXNlcyBmb3IgbWV0YWRhdGEgZW50cmllcy5cbi8vIFVzZWQgc2ltcGx5IHRvIGFzc2lnbiBuYW1lcyB0byBkYXRhIHR5cGVzIGZvciBtb3JlIGNsYXJpdHkuXG5cbi8qKlxuICogQHNlZSBBcnRpZmFjdE1ldGFkYXRhRW50cnlUeXBlLklORk9cbiAqIEBzZWUgQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5XQVJOXG4gKiBAc2VlIEFydGlmYWN0TWV0YWRhdGFFbnRyeVR5cGUuRVJST1JcbiAqL1xuZXhwb3J0IHR5cGUgTG9nTWVzc2FnZU1ldGFkYXRhRW50cnkgPSBzdHJpbmc7XG5cbi8qKlxuICogQHNlZSBBcnRpZmFjdE1ldGFkYXRhRW50cnlUeXBlLkxPR0lDQUxfSURcbiAqL1xuZXhwb3J0IHR5cGUgTG9naWNhbElkTWV0YWRhdGFFbnRyeSA9IHN0cmluZztcblxuLyoqXG4gKiBAc2VlIEFydGlmYWN0TWV0YWRhdGFFbnRyeVR5cGUuU1RBQ0tfVEFHU1xuICovXG5leHBvcnQgdHlwZSBTdGFja1RhZ3NNZXRhZGF0YUVudHJ5ID0gVGFnW107XG5cbi8qKlxuICogVW5pb24gdHlwZSBmb3IgYWxsIG1ldGFkYXRhIGVudHJpZXMgdGhhdCBtaWdodCBleGlzdCBpbiB0aGUgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCB0eXBlIE1ldGFkYXRhRW50cnlEYXRhID0gQXNzZXRNZXRhZGF0YUVudHJ5IHwgTG9nTWVzc2FnZU1ldGFkYXRhRW50cnkgfCBMb2dpY2FsSWRNZXRhZGF0YUVudHJ5IHwgU3RhY2tUYWdzTWV0YWRhdGFFbnRyeTtcblxuLyoqXG4gKiBUeXBlIG9mIGFydGlmYWN0IG1ldGFkYXRhIGVudHJ5LlxuICovXG5leHBvcnQgZW51bSBBcnRpZmFjdE1ldGFkYXRhRW50cnlUeXBlIHtcbiAgLyoqXG4gICAqIEFzc2V0IGluIG1ldGFkYXRhLlxuICAgKi9cbiAgQVNTRVQgPSAnYXdzOmNkazphc3NldCcsXG5cbiAgLyoqXG4gICAqIE1ldGFkYXRhIGtleSB1c2VkIHRvIHByaW50IElORk8tbGV2ZWwgbWVzc2FnZXMgYnkgdGhlIHRvb2xraXQgd2hlbiBhbiBhcHAgaXMgc3ludGhlaXplZC5cbiAgICovXG4gIElORk8gPSAnYXdzOmNkazppbmZvJyxcblxuICAvKipcbiAgICogTWV0YWRhdGEga2V5IHVzZWQgdG8gcHJpbnQgV0FSTklORy1sZXZlbCBtZXNzYWdlcyBieSB0aGUgdG9vbGtpdCB3aGVuIGFuIGFwcCBpcyBzeW50aGVpemVkLlxuICAgKi9cbiAgV0FSTiA9ICdhd3M6Y2RrOndhcm5pbmcnLFxuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBrZXkgdXNlZCB0byBwcmludCBFUlJPUi1sZXZlbCBtZXNzYWdlcyBieSB0aGUgdG9vbGtpdCB3aGVuIGFuIGFwcCBpcyBzeW50aGVpemVkLlxuICAgKi9cbiAgRVJST1IgPSAnYXdzOmNkazplcnJvcicsXG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIENsb3VkRm9ybWF0aW9uIGxvZ2ljYWwgSUQgb2YgYSByZXNvdXJjZSBhdCBhIGNlcnRhaW4gcGF0aC5cbiAgICovXG4gIExPR0lDQUxfSUQgPSAnYXdzOmNkazpsb2dpY2FsSWQnLFxuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHRhZ3Mgb2YgYSBzdGFjay5cbiAgICovXG4gIFNUQUNLX1RBR1MgPSAnYXdzOmNkazpzdGFjay10YWdzJ1xufVxuXG4vKipcbiAqIEEgbWV0YWRhdGEgZW50cnkgaW4gYSBjbG91ZCBhc3NlbWJseSBhcnRpZmFjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUVudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGF0YS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiBNZXRhZGF0YUVudHJ5RGF0YTtcblxuICAvKipcbiAgICogQSBzdGFjayB0cmFjZSBmb3Igd2hlbiB0aGUgZW50cnkgd2FzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdHJhY2UuXG4gICAqL1xuICByZWFkb25seSB0cmFjZT86IHN0cmluZ1tdO1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ArtifactType = void 0;\n/**\n * Type of cloud artifact.\n */\nvar ArtifactType;\n(function (ArtifactType) {\n /**\n * Stub required because of JSII.\n */\n ArtifactType[\"NONE\"] = \"none\";\n /**\n * The artifact is an AWS CloudFormation stack.\n */\n ArtifactType[\"AWS_CLOUDFORMATION_STACK\"] = \"aws:cloudformation:stack\";\n /**\n * The artifact contains the CDK application's construct tree.\n */\n ArtifactType[\"CDK_TREE\"] = \"cdk:tree\";\n /**\n * Manifest for all assets in the Cloud Assembly\n */\n ArtifactType[\"ASSET_MANIFEST\"] = \"cdk:asset-manifest\";\n /**\n * Nested Cloud Assembly\n */\n ArtifactType[\"NESTED_CLOUD_ASSEMBLY\"] = \"cdk:cloud-assembly\";\n})(ArtifactType || (exports.ArtifactType = ArtifactType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBOztHQUVHO0FBQ0gsSUFBWSxZQXlCWDtBQXpCRCxXQUFZLFlBQVk7SUFDdEI7O09BRUc7SUFDSCw2QkFBYSxDQUFBO0lBRWI7O09BRUc7SUFDSCxxRUFBcUQsQ0FBQTtJQUVyRDs7T0FFRztJQUNILHFDQUFxQixDQUFBO0lBRXJCOztPQUVHO0lBQ0gscURBQXFDLENBQUE7SUFFckM7O09BRUc7SUFDSCw0REFBNEMsQ0FBQTtBQUM5QyxDQUFDLEVBekJXLFlBQVksNEJBQVosWUFBWSxRQXlCdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcnRpZmFjdFByb3BlcnRpZXMgfSBmcm9tICcuL2FydGlmYWN0LXNjaGVtYSc7XG5pbXBvcnQgeyBDb250ZXh0UHJvdmlkZXIsIENvbnRleHRRdWVyeVByb3BlcnRpZXMgfSBmcm9tICcuL2NvbnRleHQtcXVlcmllcyc7XG5pbXBvcnQgeyBNZXRhZGF0YUVudHJ5IH0gZnJvbSAnLi9tZXRhZGF0YS1zY2hlbWEnO1xuXG4vKipcbiAqIFR5cGUgb2YgY2xvdWQgYXJ0aWZhY3QuXG4gKi9cbmV4cG9ydCBlbnVtIEFydGlmYWN0VHlwZSB7XG4gIC8qKlxuICAgKiBTdHViIHJlcXVpcmVkIGJlY2F1c2Ugb2YgSlNJSS5cbiAgICovXG4gIE5PTkUgPSAnbm9uZScsIC8vIHJlcXVpcmVkIGR1ZSB0byBhIGpzaWkgYnVnXG5cbiAgLyoqXG4gICAqIFRoZSBhcnRpZmFjdCBpcyBhbiBBV1MgQ2xvdWRGb3JtYXRpb24gc3RhY2suXG4gICAqL1xuICBBV1NfQ0xPVURGT1JNQVRJT05fU1RBQ0sgPSAnYXdzOmNsb3VkZm9ybWF0aW9uOnN0YWNrJyxcblxuICAvKipcbiAgICogVGhlIGFydGlmYWN0IGNvbnRhaW5zIHRoZSBDREsgYXBwbGljYXRpb24ncyBjb25zdHJ1Y3QgdHJlZS5cbiAgICovXG4gIENES19UUkVFID0gJ2Nkazp0cmVlJyxcblxuICAvKipcbiAgICogTWFuaWZlc3QgZm9yIGFsbCBhc3NldHMgaW4gdGhlIENsb3VkIEFzc2VtYmx5XG4gICAqL1xuICBBU1NFVF9NQU5JRkVTVCA9ICdjZGs6YXNzZXQtbWFuaWZlc3QnLFxuXG4gIC8qKlxuICAgKiBOZXN0ZWQgQ2xvdWQgQXNzZW1ibHlcbiAgICovXG4gIE5FU1RFRF9DTE9VRF9BU1NFTUJMWSA9ICdjZGs6Y2xvdWQtYXNzZW1ibHknLFxufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBhcHBsaWNhdGlvbidzIHJ1bnRpbWUgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBsaWJyYXJpZXMgbG9hZGVkIGluIHRoZSBhcHBsaWNhdGlvbiwgYXNzb2NpYXRlZCB3aXRoIHRoZWlyIHZlcnNpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlicmFyaWVzOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWlzc2luZyBwaWVjZSBvZiBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1pc3NpbmdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBtaXNzaW5nIGNvbnRleHQga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm92aWRlciBmcm9tIHdoaWNoIHdlIGV4cGVjdCB0aGlzIGNvbnRleHQga2V5IHRvIGJlIG9idGFpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI6IENvbnRleHRQcm92aWRlcjtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcHJvdmlkZXItc3BlY2lmaWMgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BzOiBDb250ZXh0UXVlcnlQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIEEgbWFuaWZlc3QgZm9yIGEgc2luZ2xlIGFydGlmYWN0IHdpdGhpbiB0aGUgY2xvdWQgYXNzZW1ibHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJ0aWZhY3RNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBhcnRpZmFjdC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IEFydGlmYWN0VHlwZTtcblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IGludG8gd2hpY2ggdGhpcyBhcnRpZmFjdCBpcyBkZXBsb3llZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBlbnZyaW9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50Pzogc3RyaW5nOyAvLyBmb3JtYXQ6IGF3czovL2FjY291bnQvcmVnaW9uXG5cbiAgLyoqXG4gICAqIEFzc29jaWF0ZWQgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbWV0YWRhdGEuXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IHsgW3BhdGg6IHN0cmluZ106IE1ldGFkYXRhRW50cnlbXSB9O1xuXG4gIC8qKlxuICAgKiBJRHMgb2YgYXJ0aWZhY3RzIHRoYXQgbXVzdCBiZSBkZXBsb3llZCBiZWZvcmUgdGhpcyBhcnRpZmFjdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICByZWFkb25seSBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHNldCBvZiBwcm9wZXJ0aWVzIGZvciB0aGlzIGFydGlmYWN0IChkZXBlbmRzIG9uIHR5cGUpXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJvcGVydGllcy5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnRpZXM/OiBBcnRpZmFjdFByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGlzIGFydGlmYWN0LiBTaG91bGQgb25seSBiZSB1c2VkIGluIHVzZXIgaW50ZXJmYWNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkaXNwbGF5IG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbWFuaWZlc3Qgd2hpY2ggZGVzY3JpYmVzIHRoZSBjbG91ZCBhc3NlbWJseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NlbWJseU1hbmlmZXN0IHtcbiAgLyoqXG4gICAqIFByb3RvY29sIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNldCBvZiBhcnRpZmFjdHMgaW4gdGhpcyBhc3NlbWJseS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhcnRpZmFjdHMuXG4gICAqL1xuICByZWFkb25seSBhcnRpZmFjdHM/OiB7IFtpZDogc3RyaW5nXTogQXJ0aWZhY3RNYW5pZmVzdCB9O1xuXG4gIC8qKlxuICAgKiBNaXNzaW5nIGNvbnRleHQgaW5mb3JtYXRpb24uIElmIHRoaXMgZmllbGQgaGFzIHZhbHVlcywgaXQgbWVhbnMgdGhhdCB0aGVcbiAgICogY2xvdWQgYXNzZW1ibHkgaXMgbm90IGNvbXBsZXRlIGFuZCBzaG91bGQgbm90IGJlIGRlcGxveWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG1pc3NpbmcgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IG1pc3Npbmc/OiBNaXNzaW5nQ29udGV4dFtdO1xuXG4gIC8qKlxuICAgKiBSdW50aW1lIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGluZm8uXG4gICAqL1xuICByZWFkb25seSBydW50aW1lPzogUnVudGltZUluZm87XG59XG4iXX0=","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./cloud-assembly\"), exports);\n__exportStar(require(\"./assets\"), exports);\n__exportStar(require(\"./manifest\"), exports);\n__exportStar(require(\"./integ-tests\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBQWlDO0FBQ2pDLDJDQUF5QjtBQUN6Qiw2Q0FBMkI7QUFDM0IsZ0RBQThCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jbG91ZC1hc3NlbWJseSc7XG5leHBvcnQgKiBmcm9tICcuL2Fzc2V0cyc7XG5leHBvcnQgKiBmcm9tICcuL21hbmlmZXN0JztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZWctdGVzdHMnO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RequireApproval = void 0;\n/**\n * In what scenarios should the CLI ask for approval\n */\nvar RequireApproval;\n(function (RequireApproval) {\n /**\n * Never ask for approval\n */\n RequireApproval[\"NEVER\"] = \"never\";\n /**\n * Prompt for approval for any type of change to the stack\n */\n RequireApproval[\"ANYCHANGE\"] = \"any-change\";\n /**\n * Only prompt for approval if there are security related changes\n */\n RequireApproval[\"BROADENING\"] = \"broadening\";\n})(RequireApproval || (exports.RequireApproval = RequireApproval = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsSUFBWSxlQWVYO0FBZkQsV0FBWSxlQUFlO0lBQ3pCOztPQUVHO0lBQ0gsa0NBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gsMkNBQXdCLENBQUE7SUFFeEI7O09BRUc7SUFDSCw0Q0FBeUIsQ0FBQTtBQUMzQixDQUFDLEVBZlcsZUFBZSwrQkFBZixlQUFlLFFBZTFCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbiB3aGF0IHNjZW5hcmlvcyBzaG91bGQgdGhlIENMSSBhc2sgZm9yIGFwcHJvdmFsXG4gKi9cbmV4cG9ydCBlbnVtIFJlcXVpcmVBcHByb3ZhbCB7XG4gIC8qKlxuICAgKiBOZXZlciBhc2sgZm9yIGFwcHJvdmFsXG4gICAqL1xuICBORVZFUiA9ICduZXZlcicsXG5cbiAgLyoqXG4gICAqIFByb21wdCBmb3IgYXBwcm92YWwgZm9yIGFueSB0eXBlICBvZiBjaGFuZ2UgdG8gdGhlIHN0YWNrXG4gICAqL1xuICBBTllDSEFOR0UgPSAnYW55LWNoYW5nZScsXG5cbiAgLyoqXG4gICAqIE9ubHkgcHJvbXB0IGZvciBhcHByb3ZhbCBpZiB0aGVyZSBhcmUgc2VjdXJpdHkgcmVsYXRlZCBjaGFuZ2VzXG4gICAqL1xuICBCUk9BREVOSU5HID0gJ2Jyb2FkZW5pbmcnXG59XG5cbi8qKlxuICogRGVmYXVsdCBDREsgQ0xJIG9wdGlvbnMgdGhhdCBhcHBseSB0byBhbGwgY29tbWFuZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0Q2RrT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHN0YWNrcyB0byBkZXBsb3lcbiAgICpcbiAgICogUmVxdXJpZWQgaWYgYGFsbGAgaXMgbm90IHNldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFtdXG4gICAqL1xuICByZWFkb25seSBzdGFja3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRGVwbG95IGFsbCBzdGFja3NcbiAgICpcbiAgICogUmVxdXJpZWQgaWYgYHN0YWNrc2AgaXMgbm90IHNldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbGw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBjb21tYW5kLWxpbmUgZm9yIGV4ZWN1dGluZyB5b3VyIGFwcCBvciBhIGNsb3VkIGFzc2VtYmx5IGRpcmVjdG9yeVxuICAgKiBlLmcuIFwibm9kZSBiaW4vbXktYXBwLmpzXCJcbiAgICogb3JcbiAgICogXCJjZGsub3V0XCJcbiAgICpcbiAgICogQGRlZmF1bHQgLSByZWFkIGZyb20gY2RrLmpzb25cbiAgICovXG4gIHJlYWRvbmx5IGFwcD86IHN0cmluZztcblxuICAvKipcbiAgICogUm9sZSB0byBwYXNzIHRvIENsb3VkRm9ybWF0aW9uIGZvciBkZXBsb3ltZW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIHRoZSBib290c3RyYXAgY2ZuLWV4ZWMgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBjb250ZXh0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBjb250ZXh0XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFByaW50IHRyYWNlIGZvciBzdGFjayB3YXJuaW5nc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEbyBub3QgY29uc3RydWN0IHN0YWNrcyB3aXRoIHdhcm5pbmdzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzdHJpY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGNvbnRleHQgbG9va3Vwcy5cbiAgICpcbiAgICogU3ludGhlc2lzIGZhaWxzIGlmIHRoaXMgaXMgZGlzYWJsZWQgYW5kIGNvbnRleHQgbG9va3VwcyBuZWVkXG4gICAqIHRvIGJlIHBlcmZvcm1lZFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBsb29rdXBzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICAqIElnbm9yZXMgc3ludGhlc2lzIGVycm9ycywgd2hpY2ggd2lsbCBsaWtlbHkgcHJvZHVjZSBhbiBpbnZhbGlkIG91dHB1dFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlRXJyb3JzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNlIEpTT04gb3V0cHV0IGluc3RlYWQgb2YgWUFNTCB3aGVuIHRlbXBsYXRlcyBhcmUgcHJpbnRlZFxuICAgKiB0byBTVERPVVRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGpzb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBzaG93IGRlYnVnIGxvZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcmJvc2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBlbmFibGUgZW1pc3Npb24gb2YgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHN1Y2ggYXMgY3JlYXRpb24gc3RhY2tcbiAgICogdHJhY2VzIG9mIHRva2Vuc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGluZGljYXRlZCBBV1MgcHJvZmlsZSBhcyB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb2ZpbGUgaXMgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVXNlIHRoZSBpbmRpY2F0ZWQgcHJveHkuIFdpbGwgcmVhZCBmcm9tXG4gICAqIEhUVFBTX1BST1hZIGVudmlyb25tZW50IGlmIHNwZWNpZmllZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb3h5XG4gICAqL1xuICByZWFkb25seSBwcm94eT86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBDQSBjZXJ0aWZpY2F0ZSB0byB1c2Ugd2hlbiB2YWxpZGF0aW5nIEhUVFBTXG4gICAqIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHJlYWQgZnJvbSBBV1NfQ0FfQlVORExFIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAqL1xuICByZWFkb25seSBjYUJ1bmRsZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZvcmNlIHRyeWluZyB0byBmZXRjaCBFQzIgaW5zdGFuY2UgY3JlZGVudGlhbHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBndWVzcyBFQzIgaW5zdGFuY2Ugc3RhdHVzXG4gICAqL1xuICByZWFkb25seSBlYzJDcmVkcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluY2x1ZGUgXCJBV1M6OkNESzo6TWV0YWRhdGFcIiByZXNvdXJjZSBpbiBzeW50aGVzaXplZCB0ZW1wbGF0ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvblJlcG9ydGluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluY2x1ZGUgXCJhd3M6Y2RrOnBhdGhcIiBDbG91ZEZvcm1hdGlvbiBtZXRhZGF0YSBmb3IgZWFjaCByZXNvdXJjZVxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBwYXRoTWV0YWRhdGE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIFwiYXdzOmFzc2V0OipcIiBDbG91ZEZvcm1hdGlvbiBtZXRhZGF0YSBmb3IgcmVzb3VyY2VzIHRoYXQgdXNlIGFzc2V0c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhc3NldE1ldGFkYXRhPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29weSBhc3NldHMgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnlcbiAgICpcbiAgICogTmVlZGVkIGZvciBsb2NhbCBkZWJ1Z2dpbmcgdGhlIHNvdXJjZSBmaWxlcyB3aXRoIFNBTSBDTElcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHN0YWdpbmc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgc3ludGhlc2l6ZWQgY2xvdWQgYXNzZW1ibHkgaW50byBhIGRpcmVjdG9yeVxuICAgKlxuICAgKiBAZGVmYXVsdCBjZGsub3V0XG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNob3cgcmVsZXZhbnQgbm90aWNlc1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBub3RpY2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2hvdyBjb2xvcnMgYW5kIG90aGVyIHN0eWxlIGZyb20gY29uc29sZSBvdXRwdXRcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29sb3I/OiBib29sZWFuO1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVwbG95LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0Q2RrT3B0aW9ucywgUmVxdWlyZUFwcHJvdmFsIH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIE9wdGlvbnMgdG8gdXNlIHdpdGggY2RrIGRlcGxveVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveU9wdGlvbnMgZXh0ZW5kcyBEZWZhdWx0Q2RrT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPbmx5IHBlcmZvcm0gYWN0aW9uIG9uIHRoZSBnaXZlbiBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVzaXZlbHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0b29sa2l0IHN0YWNrIHRvIHVzZS9kZXBsb3lcbiAgICpcbiAgICogQGRlZmF1bHQgQ0RLVG9vbGtpdFxuICAgKi9cbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmV1c2UgdGhlIGFzc2V0cyB3aXRoIHRoZSBnaXZlbiBhc3NldCBJRHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkbyBub3QgcmV1c2UgYXNzZXRzXG4gICAqL1xuICByZWFkb25seSByZXVzZUFzc2V0cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBuYW1lIHRvIHVzZSBmb3IgdGhlIENsb3VkRm9ybWF0aW9uIGNoYW5nZSBzZXQuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYSBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0byBnZW5lcmF0ZSBhIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZVNldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBkZXBsb3ksIGV2ZW4gaWYgdGVtcGxhdGVzIGFyZSBpZGVudGljYWwuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIGZhaWxlZCBkZXBsb3ltZW50c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSByb2xsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFSTnMgb2YgU05TIHRvcGljcyB0aGF0IENsb3VkRm9ybWF0aW9uIHdpbGwgbm90aWZ5IHdpdGggc3RhY2sgcmVsYXRlZCBldmVudHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBub3RpZmljYXRpb25zXG4gICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Bcm5zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoYXQga2luZCBvZiBzZWN1cml0eSBjaGFuZ2VzIHJlcXVpcmUgYXBwcm92YWxcbiAgICpcbiAgICogQGRlZmF1bHQgUmVxdWlyZUFwcHJvdmFsLk5ldmVyXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlQXBwcm92YWw/OiBSZXF1aXJlQXBwcm92YWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXhlY3V0ZSB0aGUgQ2hhbmdlU2V0XG4gICAqIE5vdCBwcm92aWRpbmcgYGV4ZWN1dGVgIHBhcmFtZXRlciB3aWxsIHJlc3VsdCBpbiBleGVjdXRpb24gb2YgQ2hhbmdlU2V0XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIENsb3VkRm9ybWF0aW9uIGF0IGRlcGxveSB0aW1lXG4gICAqIEBkZWZhdWx0IHt9XG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFVzZSBwcmV2aW91cyB2YWx1ZXMgZm9yIHVuc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAgICpcbiAgICogSWYgbm90IHNldCwgYWxsIHBhcmFtZXRlcnMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGV2ZXJ5IGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHVzZVByZXZpb3VzUGFyYW1ldGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZmlsZSB3aGVyZSBzdGFjayBvdXRwdXRzIHdpbGwgYmUgd3JpdHRlbiBhZnRlciBhIHN1Y2Nlc3NmdWwgZGVwbG95IGFzIEpTT05cbiAgICogQGRlZmF1bHQgLSBPdXRwdXRzIGFyZSBub3Qgd3JpdHRlbiB0byBhbnkgZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0c0ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2UgYXJlIG9uIGEgQ0kgc3lzdGVtXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjaT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlcGxveSBtdWx0aXBsZSBzdGFja3MgaW4gcGFyYWxsZWxcbiAgICpcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgY29uY3VycmVuY3k/OiBudW1iZXI7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzdHJveS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRlc3Ryb3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlZmF1bHRDZGtPcHRpb25zIH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIE9wdGlvbnMgdG8gdXNlIHdpdGggY2RrIGRlc3Ryb3lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXN0cm95T3B0aW9ucyBleHRlbmRzIERlZmF1bHRDZGtPcHRpb25zIHtcbiAgLyoqXG4gICAqIERvIG5vdCBhc2sgZm9yIHBlcm1pc3Npb24gYmVmb3JlIGRlc3Ryb3lpbmcgc3RhY2tzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9ubHkgZGVzdHJveSB0aGUgZ2l2ZW4gc3RhY2tcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1c2l2ZWx5PzogYm9vbGVhbjtcbn1cbiJdfQ==","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./common\"), exports);\n__exportStar(require(\"./deploy\"), exports);\n__exportStar(require(\"./destroy\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLDJDQUF5QjtBQUN6Qiw0Q0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NvbW1vbic7XG5leHBvcnQgKiBmcm9tICcuL2RlcGxveSc7XG5leHBvcnQgKiBmcm9tICcuL2Rlc3Ryb3knO1xuIl19","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./schema\"), exports);\n__exportStar(require(\"./commands\"), exports);\n__exportStar(require(\"./test-case\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLDZDQUEyQjtBQUMzQiw4Q0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NjaGVtYSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbW1hbmRzJztcbmV4cG9ydCAqIGZyb20gJy4vdGVzdC1jYXNlJztcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXN0Q2FzZSB9IGZyb20gJy4vdGVzdC1jYXNlJztcbi8qKlxuICogRGVmaW5pdGlvbnMgZm9yIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0aW5nIG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBtYW5pZmVzdFxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgbG9va3VwcyBmb3IgdGhpcyB0ZXN0LiBJZiBsb29rdXBzIGFyZSBlbmFibGVkXG4gICAqIHRoZW4gYHN0YWNrVXBkYXRlV29ya2Zsb3dgIG11c3QgYmUgc2V0IHRvIGZhbHNlLlxuICAgKiBMb29rdXBzIHNob3VsZCBvbmx5IGJlIGVuYWJsZWQgd2hlbiB5b3UgYXJlIGV4cGxpY2l0ZWx5IHRlc3RpbmdcbiAgICogbG9va3Vwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUxvb2t1cHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGNvbnRleHQgdG8gdXNlIHdoZW4gcGVyZm9ybWluZ1xuICAgKiBhIHN5bnRoLiBBbnkgY29udGV4dCBwcm92aWRlZCBoZXJlIHdpbGwgb3ZlcnJpZGVcbiAgICogYW55IGRlZmF1bHQgY29udGV4dFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgY29udGV4dFxuICAgKi9cbiAgcmVhZG9ubHkgc3ludGhDb250ZXh0PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIHRlc3QgY2FzZXNcbiAgICovXG4gIHJlYWRvbmx5IHRlc3RDYXNlczogeyBbdGVzdE5hbWU6IHN0cmluZ106IFRlc3RDYXNlIH07XG59XG5cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidGVzdC1jYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXBsb3lPcHRpb25zLCBEZXN0cm95T3B0aW9ucyB9IGZyb20gJy4vY29tbWFuZHMnO1xuXG4vKipcbiAqIFRoZSBzZXQgb2Ygb3B0aW9ucyB0byBjb250cm9sIHRoZSB3b3JrZmxvdyBvZiB0aGUgdGVzdCBydW5uZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSdW4gdXBkYXRlIHdvcmtmbG93IG9uIHRoaXMgdGVzdCBjYXNlXG4gICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgc2V0IHRvIGZhbHNlIHRvIHRlc3Qgc2NlbmFyaW9zXG4gICAqIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSB0byB0ZXN0IGFzIHBhcnQgb2YgdGhlIHVwZGF0ZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzdGFja1VwZGF0ZVdvcmtmbG93PzogYm9vbGVhbjtcblxuICAvKipcbiAgICAqIEFkZGl0aW9uYWwgb3B0aW9ucyB0byB1c2UgZm9yIGVhY2ggQ0RLIGNvbW1hbmRcbiAgICAqXG4gICAgKiBAZGVmYXVsdCAtIHJ1bm5lciBkZWZhdWx0IG9wdGlvbnNcbiAgICAqL1xuICByZWFkb25seSBjZGtDb21tYW5kT3B0aW9ucz86IENka0NvbW1hbmRzO1xuXG4gIC8qKlxuICAgICogQWRkaXRpb25hbCBjb21tYW5kcyB0byBydW4gYXQgcHJlZGVmaW5lZCBwb2ludHMgaW4gdGhlIHRlc3Qgd29ya2Zsb3dcbiAgICAqXG4gICAgKiBlLmcuIHsgcG9zdERlcGxveTogWyd5YXJuJywgJ3Rlc3QnXSB9XG4gICAgKlxuICAgICogQGRlZmF1bHQgLSBubyBob29rc1xuICAgICovXG4gIHJlYWRvbmx5IGhvb2tzPzogSG9va3M7XG5cbiAgLyoqXG4gICAgKiBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIGFzc2V0IGhhc2hlcyBpbiB0aGUgZGlmZlxuICAgICogQXNzZXQgaGFzaGVzIGNhbiBpbnRyb2R1Y2VzIGEgbG90IG9mIHVubmVjY2Vzc2FyeSBub2lzZSBpbnRvIHRlc3RzLFxuICAgICogYnV0IHRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIGFzc2V0IGhhc2hlcyBfc2hvdWxkXyBiZSBpbmNsdWRlZC4gRm9yIGV4YW1wbGVcbiAgICAqIGFueSB0ZXN0cyBpbnZvbHZpbmcgY3VzdG9tIHJlc291cmNlcyBvciBidW5kbGluZ1xuICAgICpcbiAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgKi9cbiAgcmVhZG9ubHkgZGlmZkFzc2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAgKiBMaXN0IG9mIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGVzIGluIHRoaXMgc3RhY2sgdGhhdCBjYW5cbiAgICAqIGJlIGRlc3Ryb3llZCBhcyBwYXJ0IG9mIGFuIHVwZGF0ZSB3aXRob3V0IGZhaWxpbmcgdGhlIHRlc3QuXG4gICAgKlxuICAgICogVGhpcyBsaXN0IHNob3VsZCBvbmx5IGluY2x1ZGUgcmVzb3VyY2VzIHRoYXQgZm9yIHRoaXMgc3BlY2lmaWNcbiAgICAqIGludGVncmF0aW9uIHRlc3Qgd2UgYXJlIHN1cmUgd2lsbCBub3QgY2F1c2UgZXJyb3JzIG9yIGFuIG91dGFnZSBpZlxuICAgICogZGVzdHJveWVkLiBGb3IgZXhhbXBsZSwgbWF5YmUgd2Uga25vdyB0aGF0IGEgbmV3IHJlc291cmNlIHdpbGwgYmUgY3JlYXRlZFxuICAgICogZmlyc3QgYmVmb3JlIHRoZSBvbGQgcmVzb3VyY2UgaXMgZGVzdHJveWVkIHdoaWNoIHByZXZlbnRzIGFueSBvdXRhZ2UuXG4gICAgKlxuICAgICogZS5nLiBbJ0FXUzo6SUFNOjpSb2xlJ11cbiAgICAqXG4gICAgKiBAZGVmYXVsdCAtIGRvIG5vdCBhbGxvdyBkZXN0cnVjdGlvbiBvZiBhbnkgcmVzb3VyY2VzIG9uIHVwZGF0ZVxuICAgICovXG4gIHJlYWRvbmx5IGFsbG93RGVzdHJveT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgICogTGltaXQgZGVwbG95bWVudCB0byB0aGVzZSByZWdpb25zXG4gICAgKlxuICAgICogQGRlZmF1bHQgLSBjYW4gcnVuIGluIGFueSByZWdpb25cbiAgICAqL1xuICByZWFkb25seSByZWdpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbnRlZ3JhdGlvbiB0ZXN0IGNhc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXN0Q2FzZSBleHRlbmRzIFRlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrcyB0aGF0IHNob3VsZCBiZSB0ZXN0ZWQgYXMgcGFydCBvZiB0aGlzIHRlc3QgY2FzZVxuICAgKiBUaGUgc3RhY2tOYW1lcyB3aWxsIGJlIHBhc3NlZCBhcyBhcmdzIHRvIHRoZSBjZGsgY29tbWFuZHNcbiAgICogc28gZGVwZW5kZW50IHN0YWNrcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGVwbG95ZWQgdW5sZXNzXG4gICAqIGBleGNsdXNpdmVseWAgaXMgcGFzc2VkXG4gICAqL1xuICByZWFkb25seSBzdGFja3M6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbm9kZSBpZCBvZiB0aGUgc3RhY2sgdGhhdCBjb250YWlucyBhc3NlcnRpb25zLlxuICAgKiBUaGlzIGlzIHRoZSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlcGxveSB0aGUgc3RhY2sgd2l0aCB0aGUgQ0RLIENMSVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFzc2VydGlvbiBzdGFja1xuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXJ0aW9uU3RhY2s/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzdGFjayB0aGF0IGNvbnRhaW5zIGFzc2VydGlvbnNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhc3NlcnRpb24gc3RhY2tcbiAgICovXG4gIHJlYWRvbmx5IGFzc2VydGlvblN0YWNrTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21tYW5kcyB0byBydW4gYXQgcHJlZGVmaW5lZCBwb2ludHMgZHVyaW5nIHRoZVxuICogaW50ZWdyYXRpb24gdGVzdCB3b3JrZmxvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tzIHtcbiAgLyoqXG4gICAqIENvbW1hbmRzIHRvIHJ1biBwcmlvciB0byBkZXBsb3lpbmcgdGhlIGNkayBzdGFja3NcbiAgICogaW4gdGhlIGludGVncmF0aW9uIHRlc3RcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb21tYW5kc1xuICAgKi9cbiAgcmVhZG9ubHkgcHJlRGVwbG95Pzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIENvbW1hbmRzIHRvIHJ1biBwcmlvciBhZnRlciBkZXBsb3lpbmcgdGhlIGNkayBzdGFja3NcbiAgICogaW4gdGhlIGludGVncmF0aW9uIHRlc3RcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb21tYW5kc1xuICAgKi9cbiAgcmVhZG9ubHkgcG9zdERlcGxveT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBDb21tYW5kcyB0byBydW4gcHJpb3IgdG8gZGVzdHJveWluZyB0aGUgY2RrIHN0YWNrc1xuICAgKiBpbiB0aGUgaW50ZWdyYXRpb24gdGVzdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbW1hbmRzXG4gICAqL1xuICByZWFkb25seSBwcmVEZXN0cm95Pzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIENvbW1hbmRzIHRvIHJ1biBhZnRlciBkZXN0cm95aW5nIHRoZSBjZGsgc3RhY2tzXG4gICAqIGluIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29tbWFuZHNcbiAgICovXG4gIHJlYWRvbmx5IHBvc3REZXN0cm95Pzogc3RyaW5nW107XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNkayBjb21tYW5kXG4gKiBpLmUuIGBzeW50aGAsIGBkZXBsb3lgLCAmIGBkZXN0cm95YFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENka0NvbW1hbmQge1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gcnVuIHRoaXMgY29tbWFuZCBhcyBwYXJ0IG9mIHRoZSB3b3JrZmxvd1xuICAgKiBUaGlzIGNhbiBiZSB1c2VkIGlmIHlvdSBvbmx5IHdhbnQgdG8gdGVzdCBzb21lIG9mIHRoZSB3b3JrZmxvd1xuICAgKiBmb3IgZXhhbXBsZSBlbmFibGUgYHN5bnRoYCBhbmQgZGlzYWJsZSBgZGVwbG95YCAmIGBkZXN0cm95YCBpbiBvcmRlclxuICAgKiB0byBsaW1pdCB0aGUgdGVzdCB0byBzeW50aGVzaXNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRoZSBydW5uZXIgc2hvdWxkIGV4cGVjdCB0aGlzIGNvbW1hbmQgdG8gZmFpbFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZWN0RXJyb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggYGV4cGVjdGVkRXJyb3JgXG4gICAqIHRvIHZhbGlkYXRlIHRoYXQgYSBzcGVjaWZpYyBtZXNzYWdlIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRvIG5vdCB2YWxpZGF0ZSBtZXNzYWdlXG4gICAqL1xuICByZWFkb25seSBleHBlY3RlZE1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNkayBkZXBsb3kgY29tbWFuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveUNvbW1hbmQgZXh0ZW5kcyBDZGtDb21tYW5kIHtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNvbW1hbmRcbiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byB0ZXN0IHNwZWNpZmljIENMSSBmdW5jdGlvbmFsaXR5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gb25seSBkZWZhdWx0IGFyZ3MgYXJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M/OiBEZXBsb3lPcHRpb25zO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjZGsgZGVzdHJveSBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVzdHJveUNvbW1hbmQgZXh0ZW5kcyBDZGtDb21tYW5kIHtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNvbW1hbmRcbiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byB0ZXN0IHNwZWNpZmljIENMSSBmdW5jdGlvbmFsaXR5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gb25seSBkZWZhdWx0IGFyZ3MgYXJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGFyZ3M/OiBEZXN0cm95T3B0aW9ucztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGVjaWZpYyBjZGsgY29tbWFuZHMgdGhhdCBhcmUgcnVuXG4gKiBhcyBwYXJ0IG9mIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IHdvcmtmbG93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrQ29tbWFuZHMge1xuICAvKipcbiAgICogT3B0aW9ucyB0byBmb3IgdGhlIGNkayBkZXBsb3kgY29tbWFuZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgZGVwbG95IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveT86IERlcGxveUNvbW1hbmQ7XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgdG8gZm9yIHRoZSBjZGsgZGVzdHJveSBjb21tYW5kXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBkZXN0cm95IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRlc3Ryb3k/OiBEZXN0cm95Q29tbWFuZDtcbn1cbiJdfQ==","\"use strict\";\nvar _a;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Manifest = exports.VERSION_MISMATCH = void 0;\nconst jsiiDeprecationWarnings = require(\"../.warnings.jsii.js\");\nconst JSII_RTTI_SYMBOL_1 = Symbol.for(\"jsii.rtti\");\nconst fs = require(\"fs\");\nconst jsonschema = require(\"jsonschema\");\nconst semver = require(\"semver\");\nconst assembly = require(\"./cloud-assembly\");\n/* eslint-disable @typescript-eslint/no-var-requires */\n/* eslint-disable @typescript-eslint/no-require-imports */\n// this prefix is used by the CLI to identify this specific error.\n// in which case we want to instruct the user to upgrade his CLI.\n// see exec.ts#createAssembly\nexports.VERSION_MISMATCH = 'Cloud assembly schema version mismatch';\nconst ASSETS_SCHEMA = require('../schema/assets.schema.json');\nconst ASSEMBLY_SCHEMA = require('../schema/cloud-assembly.schema.json');\n/**\n * Version is shared for both manifests\n */\nconst SCHEMA_VERSION = require('../schema/cloud-assembly.version.json').version;\nconst INTEG_SCHEMA = require('../schema/integ.schema.json');\n/**\n * Protocol utility class.\n */\nclass Manifest {\n /**\n * Validates and saves the cloud assembly manifest to file.\n *\n * @param manifest - manifest.\n * @param filePath - output file path.\n */\n static saveAssemblyManifest(manifest, filePath) {\n try {\n jsiiDeprecationWarnings._aws_cdk_cloud_assembly_schema_AssemblyManifest(manifest);\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.saveAssemblyManifest);\n }\n throw error;\n }\n Manifest.saveManifest(manifest, filePath, ASSEMBLY_SCHEMA, Manifest.patchStackTagsOnWrite);\n }\n /**\n * Load and validates the cloud assembly manifest from file.\n *\n * @param filePath - path to the manifest file.\n */\n static loadAssemblyManifest(filePath, options) {\n try {\n jsiiDeprecationWarnings._aws_cdk_cloud_assembly_schema_LoadManifestOptions(options);\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.loadAssemblyManifest);\n }\n throw error;\n }\n return Manifest.loadManifest(filePath, ASSEMBLY_SCHEMA, Manifest.patchStackTagsOnRead, options);\n }\n /**\n * Validates and saves the asset manifest to file.\n *\n * @param manifest - manifest.\n * @param filePath - output file path.\n */\n static saveAssetManifest(manifest, filePath) {\n try {\n jsiiDeprecationWarnings._aws_cdk_cloud_assembly_schema_AssetManifest(manifest);\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.saveAssetManifest);\n }\n throw error;\n }\n Manifest.saveManifest(manifest, filePath, ASSETS_SCHEMA, Manifest.patchStackTagsOnRead);\n }\n /**\n * Load and validates the asset manifest from file.\n *\n * @param filePath - path to the manifest file.\n */\n static loadAssetManifest(filePath) {\n return this.loadManifest(filePath, ASSETS_SCHEMA);\n }\n /**\n * Validates and saves the integ manifest to file.\n *\n * @param manifest - manifest.\n * @param filePath - output file path.\n */\n static saveIntegManifest(manifest, filePath) {\n try {\n jsiiDeprecationWarnings._aws_cdk_cloud_assembly_schema_IntegManifest(manifest);\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.saveIntegManifest);\n }\n throw error;\n }\n Manifest.saveManifest(manifest, filePath, INTEG_SCHEMA);\n }\n /**\n * Load and validates the integ manifest from file.\n *\n * @param filePath - path to the manifest file.\n */\n static loadIntegManifest(filePath) {\n return this.loadManifest(filePath, INTEG_SCHEMA);\n }\n /**\n * Fetch the current schema version number.\n */\n static version() {\n return SCHEMA_VERSION;\n }\n /**\n * Deprecated\n * @deprecated use `saveAssemblyManifest()`\n */\n static save(manifest, filePath) { try {\n jsiiDeprecationWarnings.print(\"@aws-cdk/cloud-assembly-schema.Manifest#save\", \"use `saveAssemblyManifest()`\");\n jsiiDeprecationWarnings._aws_cdk_cloud_assembly_schema_AssemblyManifest(manifest);\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.save);\n }\n throw error;\n } return this.saveAssemblyManifest(manifest, filePath); }\n /**\n * Deprecated\n * @deprecated use `loadAssemblyManifest()`\n */\n static load(filePath) { try {\n jsiiDeprecationWarnings.print(\"@aws-cdk/cloud-assembly-schema.Manifest#load\", \"use `loadAssemblyManifest()`\");\n }\n catch (error) {\n if (process.env.JSII_DEBUG !== \"1\" && error.name === \"DeprecationError\") {\n Error.captureStackTrace(error, this.load);\n }\n throw error;\n } return this.loadAssemblyManifest(filePath); }\n static validate(manifest, schema, options) {\n function parseVersion(version) {\n const ver = semver.valid(version);\n if (!ver) {\n throw new Error(`Invalid semver string: \"${version}\"`);\n }\n return ver;\n }\n const maxSupported = parseVersion(Manifest.version());\n const actual = parseVersion(manifest.version);\n // first validate the version should be accepted.\n if (semver.gt(actual, maxSupported) && !options?.skipVersionCheck) {\n // we use a well known error prefix so that the CLI can identify this specific error\n // and print some more context to the user.\n throw new Error(`${exports.VERSION_MISMATCH}: Maximum schema version supported is ${maxSupported}, but found ${actual}`);\n }\n // now validate the format is good.\n const validator = new jsonschema.Validator();\n const result = validator.validate(manifest, schema, {\n // does exist but is not in the TypeScript definitions\n nestedErrors: true,\n allowUnknownAttributes: false,\n });\n let errors = result.errors;\n if (options?.skipEnumCheck) {\n // Enum validations aren't useful when\n errors = stripEnumErrors(errors);\n }\n if (errors.length > 0) {\n throw new Error(`Invalid assembly manifest:\\n${errors.map(e => e.stack).join('\\n')}`);\n }\n }\n static saveManifest(manifest, filePath, schema, preprocess) {\n let withVersion = { ...manifest, version: Manifest.version() };\n Manifest.validate(withVersion, schema);\n if (preprocess) {\n withVersion = preprocess(withVersion);\n }\n fs.writeFileSync(filePath, JSON.stringify(withVersion, undefined, 2));\n }\n static loadManifest(filePath, schema, preprocess, options) {\n const contents = fs.readFileSync(filePath, { encoding: 'utf-8' });\n let obj;\n try {\n obj = JSON.parse(contents);\n }\n catch (e) {\n throw new Error(`${e.message}, while parsing ${JSON.stringify(contents)}`);\n }\n if (preprocess) {\n obj = preprocess(obj);\n }\n Manifest.validate(obj, schema, options);\n return obj;\n }\n /**\n * This requires some explaining...\n *\n * We previously used `{ Key, Value }` for the object that represents a stack tag. (Notice the casing)\n * @link https://github.com/aws/aws-cdk/blob/v1.27.0/packages/aws-cdk/lib/api/cxapp/stacks.ts#L427.\n *\n * When that object moved to this package, it had to be JSII compliant, which meant the property\n * names must be `camelCased`, and not `PascalCased`. This meant it no longer matches the structure in the `manifest.json` file.\n * In order to support current manifest files, we have to translate the `PascalCased` representation to the new `camelCased` one.\n *\n * Note that the serialization itself still writes `PascalCased` because it relates to how CloudFormation expects it.\n *\n * Ideally, we would start writing the `camelCased` and translate to how CloudFormation expects it when needed. But this requires nasty\n * backwards-compatibility code and it just doesn't seem to be worth the effort.\n */\n static patchStackTagsOnRead(manifest) {\n return Manifest.replaceStackTags(manifest, tags => tags.map((diskTag) => ({\n key: diskTag.Key,\n value: diskTag.Value,\n })));\n }\n /**\n * See explanation on `patchStackTagsOnRead`\n *\n * Translate stack tags metadata if it has the \"right\" casing.\n */\n static patchStackTagsOnWrite(manifest) {\n return Manifest.replaceStackTags(manifest, tags => tags.map(memTag => \n // Might already be uppercased (because stack synthesis generates it in final form yet)\n ('Key' in memTag ? memTag : { Key: memTag.key, Value: memTag.value })));\n }\n /**\n * Recursively replace stack tags in the stack metadata\n */\n static replaceStackTags(manifest, fn) {\n // Need to add in the `noUndefined`s because otherwise jest snapshot tests are going to freak out\n // about the keys with values that are `undefined` (even though they would never be JSON.stringified)\n return noUndefined({\n ...manifest,\n artifacts: mapValues(manifest.artifacts, artifact => {\n if (artifact.type !== assembly.ArtifactType.AWS_CLOUDFORMATION_STACK) {\n return artifact;\n }\n return noUndefined({\n ...artifact,\n metadata: mapValues(artifact.metadata, metadataEntries => metadataEntries.map(metadataEntry => {\n if (metadataEntry.type !== assembly.ArtifactMetadataEntryType.STACK_TAGS || !metadataEntry.data) {\n return metadataEntry;\n }\n return {\n ...metadataEntry,\n data: fn(metadataEntry.data),\n };\n })),\n });\n }),\n });\n }\n constructor() { }\n}\nexports.Manifest = Manifest;\n_a = JSII_RTTI_SYMBOL_1;\nManifest[_a] = { fqn: \"@aws-cdk/cloud-assembly-schema.Manifest\", version: \"2.107.0\" };\nfunction mapValues(xs, fn) {\n if (!xs) {\n return undefined;\n }\n const ret = {};\n for (const [k, v] of Object.entries(xs)) {\n ret[k] = fn(v);\n }\n return ret;\n}\nfunction noUndefined(xs) {\n const ret = {};\n for (const [k, v] of Object.entries(xs)) {\n if (v !== undefined) {\n ret[k] = v;\n }\n }\n return ret;\n}\nfunction stripEnumErrors(errors) {\n return errors.filter(e => typeof e.schema === 'string' || !('enum' in e.schema));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx5QkFBeUI7QUFDekIseUNBQXlDO0FBQ3pDLGlDQUFpQztBQUVqQyw2Q0FBNkM7QUFHN0MsdURBQXVEO0FBQ3ZELDBEQUEwRDtBQUUxRCxrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLDZCQUE2QjtBQUNoQixRQUFBLGdCQUFnQixHQUFXLHdDQUF3QyxDQUFDO0FBRWpGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBRTlELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0FBRXhFOztHQUVHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBRWhGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBc0M1RDs7R0FFRztBQUNILE1BQWEsUUFBUTtJQUNuQjs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxRQUFtQyxFQUFFLFFBQWdCOzs7Ozs7Ozs7O1FBQ3RGLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7S0FDNUY7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsT0FBNkI7Ozs7Ozs7Ozs7UUFDaEYsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ2pHO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBOEIsRUFBRSxRQUFnQjs7Ozs7Ozs7OztRQUM5RSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0tBQ3pGO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFnQjtRQUM5QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0tBQ25EO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBNkIsRUFBRSxRQUFnQjs7Ozs7Ozs7OztRQUM3RSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDekQ7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQWdCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDbEQ7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxPQUFPO1FBQ25CLE9BQU8sY0FBYyxDQUFDO0tBQ3ZCO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFtQyxFQUFFLFFBQWdCOzs7Ozs7Ozs7TUFBSSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtJQUVuSTs7O09BR0c7SUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQWdCOzs7Ozs7OztNQUErQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFO0lBRXZHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBNkIsRUFBRSxNQUF5QixFQUFFLE9BQTZCO1FBQzdHLFNBQVMsWUFBWSxDQUFDLE9BQWU7WUFDbkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE9BQU8sR0FBRyxDQUFDLENBQUM7YUFDeEQ7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5QyxpREFBaUQ7UUFDakQsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRTtZQUNqRSxvRkFBb0Y7WUFDcEYsMkNBQTJDO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyx3QkFBZ0IseUNBQXlDLFlBQVksZUFBZSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ2xIO1FBRUQsbUNBQW1DO1FBQ25DLE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRTtZQUVsRCxzREFBc0Q7WUFDdEQsWUFBWSxFQUFFLElBQUk7WUFFbEIsc0JBQXNCLEVBQUUsS0FBSztTQUV2QixDQUFDLENBQUM7UUFFVixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksT0FBTyxFQUFFLGFBQWEsRUFBRTtZQUMxQixzQ0FBc0M7WUFDdEMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNsQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZGO0tBQ0Y7SUFFTyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQWEsRUFBRSxRQUFnQixFQUFFLE1BQXlCLEVBQUUsVUFBOEI7UUFDcEgsSUFBSSxXQUFXLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDL0QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxVQUFVLEVBQUU7WUFDZCxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3ZDO1FBQ0QsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkU7SUFFTyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQWdCLEVBQUUsTUFBeUIsRUFBRSxVQUE4QixFQUFFLE9BQTZCO1FBQ3BJLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxHQUFHLENBQUM7UUFDUixJQUFJO1lBQ0YsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDNUI7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxtQkFBbUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDNUU7UUFDRCxJQUFJLFVBQVUsRUFBRTtZQUNkLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdkI7UUFDRCxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEMsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0ssTUFBTSxDQUFDLG9CQUFvQixDQUFDLFFBQW1DO1FBQ3JFLE9BQU8sUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0UsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQ2hCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztTQUNyQixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ047SUFFRDs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLHFCQUFxQixDQUFDLFFBQW1DO1FBQ3RFLE9BQU8sUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbkUsdUZBQXVGO1FBQ3ZGLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQVEsQ0FDN0UsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFtQyxFQUFFLEVBQWdEO1FBQ25ILGlHQUFpRztRQUNqRyxxR0FBcUc7UUFDckcsT0FBTyxXQUFXLENBQUM7WUFDakIsR0FBRyxRQUFRO1lBQ1gsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsRUFBRTtvQkFBRSxPQUFPLFFBQVEsQ0FBQztpQkFBRTtnQkFDMUYsT0FBTyxXQUFXLENBQUM7b0JBQ2pCLEdBQUcsUUFBUTtvQkFDWCxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFO3dCQUM1RixJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7NEJBQUUsT0FBTyxhQUFhLENBQUM7eUJBQUU7d0JBQzFILE9BQU87NEJBQ0wsR0FBRyxhQUFhOzRCQUNoQixJQUFJLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUF1QyxDQUFDO3lCQUNoRSxDQUFDO29CQUNKLENBQUMsQ0FBQyxDQUFDO2lCQUN5QixDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDO1NBQ0gsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxpQkFBd0I7O0FBeE0xQiw0QkF5TUM7OztBQUlELFNBQVMsU0FBUyxDQUFPLEVBQWlDLEVBQUUsRUFBZTtJQUN6RSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUM7S0FBRTtJQUM5QixNQUFNLEdBQUcsR0FBa0MsRUFBRSxDQUFDO0lBQzlDLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEI7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBbUIsRUFBSztJQUMxQyxNQUFNLEdBQUcsR0FBUSxFQUFFLENBQUM7SUFDcEIsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDdkMsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ25CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDWjtLQUNGO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsTUFBb0M7SUFDM0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFJLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBqc29uc2NoZW1hIGZyb20gJ2pzb25zY2hlbWEnO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgKiBhcyBhc3NldHMgZnJvbSAnLi9hc3NldHMnO1xuaW1wb3J0ICogYXMgYXNzZW1ibHkgZnJvbSAnLi9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgKiBhcyBpbnRlZyBmcm9tICcuL2ludGVnLXRlc3RzJztcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuXG4vLyB0aGlzIHByZWZpeCBpcyB1c2VkIGJ5IHRoZSBDTEkgdG8gaWRlbnRpZnkgdGhpcyBzcGVjaWZpYyBlcnJvci5cbi8vIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBpbnN0cnVjdCB0aGUgdXNlciB0byB1cGdyYWRlIGhpcyBDTEkuXG4vLyBzZWUgZXhlYy50cyNjcmVhdGVBc3NlbWJseVxuZXhwb3J0IGNvbnN0IFZFUlNJT05fTUlTTUFUQ0g6IHN0cmluZyA9ICdDbG91ZCBhc3NlbWJseSBzY2hlbWEgdmVyc2lvbiBtaXNtYXRjaCc7XG5cbmNvbnN0IEFTU0VUU19TQ0hFTUEgPSByZXF1aXJlKCcuLi9zY2hlbWEvYXNzZXRzLnNjaGVtYS5qc29uJyk7XG5cbmNvbnN0IEFTU0VNQkxZX1NDSEVNQSA9IHJlcXVpcmUoJy4uL3NjaGVtYS9jbG91ZC1hc3NlbWJseS5zY2hlbWEuanNvbicpO1xuXG4vKipcbiAqIFZlcnNpb24gaXMgc2hhcmVkIGZvciBib3RoIG1hbmlmZXN0c1xuICovXG5jb25zdCBTQ0hFTUFfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL3NjaGVtYS9jbG91ZC1hc3NlbWJseS52ZXJzaW9uLmpzb24nKS52ZXJzaW9uO1xuXG5jb25zdCBJTlRFR19TQ0hFTUEgPSByZXF1aXJlKCcuLi9zY2hlbWEvaW50ZWcuc2NoZW1hLmpzb24nKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgbG9hZE1hbmlmZXN0IG9wZXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRNYW5pZmVzdE9wdGlvbnMge1xuICAvKipcbiAgICogU2tpcCB0aGUgdmVyc2lvbiBjaGVja1xuICAgKlxuICAgKiBUaGlzIG1lYW5zIHlvdSBtYXkgcmVhZCBhIG5ld2VyIGNsb3VkIGFzc2VtYmx5IHRoYW4gdGhlIENYIEFQSSBpcyBkZXNpZ25lZFxuICAgKiB0byBzdXBwb3J0LCBhbmQgeW91ciBhcHBsaWNhdGlvbiBtYXkgbm90IGJlIGF3YXJlIG9mIGFsbCBmZWF0dXJlcyB0aGF0IGluIHVzZVxuICAgKiBpbiB0aGUgQ2xvdWQgQXNzZW1ibHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBza2lwVmVyc2lvbkNoZWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2tpcCBlbnVtIGNoZWNrc1xuICAgKlxuICAgKiBUaGlzIG1lYW5zIHlvdSBtYXkgcmVhZCBlbnVtIHZhbHVlcyB5b3UgZG9uJ3Qga25vdyBhYm91dCB5ZXQuIE1ha2Ugc3VyZSB0byBhbHdheXNcbiAgICogY2hlY2sgdGhlIHZhbHVlcyBvZiBlbnVtcyB5b3UgZW5jb3VudGVyIGluIHRoZSBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBFbnVtQ2hlY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUb3BvbG9naWNhbGx5IHNvcnQgYWxsIGFydGlmYWN0c1xuICAgKlxuICAgKiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHJlc3BlY3RlZCBieSB0aGUgY29uc3RydWN0b3Igb2YgYENsb3VkQXNzZW1ibHlgLiBUaGVcbiAgICogcHJvcGVydHkgbGl2ZXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdG9wb1NvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3RvY29sIHV0aWxpdHkgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIHNhdmVzIHRoZSBjbG91ZCBhc3NlbWJseSBtYW5pZmVzdCB0byBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gbWFuaWZlc3QgLSBtYW5pZmVzdC5cbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gb3V0cHV0IGZpbGUgcGF0aC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2F2ZUFzc2VtYmx5TWFuaWZlc3QobWFuaWZlc3Q6IGFzc2VtYmx5LkFzc2VtYmx5TWFuaWZlc3QsIGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBNYW5pZmVzdC5zYXZlTWFuaWZlc3QobWFuaWZlc3QsIGZpbGVQYXRoLCBBU1NFTUJMWV9TQ0hFTUEsIE1hbmlmZXN0LnBhdGNoU3RhY2tUYWdzT25Xcml0ZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbmQgdmFsaWRhdGVzIHRoZSBjbG91ZCBhc3NlbWJseSBtYW5pZmVzdCBmcm9tIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIHBhdGggdG8gdGhlIG1hbmlmZXN0IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxvYWRBc3NlbWJseU1hbmlmZXN0KGZpbGVQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBMb2FkTWFuaWZlc3RPcHRpb25zKTogYXNzZW1ibHkuQXNzZW1ibHlNYW5pZmVzdCB7XG4gICAgcmV0dXJuIE1hbmlmZXN0LmxvYWRNYW5pZmVzdChmaWxlUGF0aCwgQVNTRU1CTFlfU0NIRU1BLCBNYW5pZmVzdC5wYXRjaFN0YWNrVGFnc09uUmVhZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBzYXZlcyB0aGUgYXNzZXQgbWFuaWZlc3QgdG8gZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIG1hbmlmZXN0IC0gbWFuaWZlc3QuXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIG91dHB1dCBmaWxlIHBhdGguXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNhdmVBc3NldE1hbmlmZXN0KG1hbmlmZXN0OiBhc3NldHMuQXNzZXRNYW5pZmVzdCwgZmlsZVBhdGg6IHN0cmluZykge1xuICAgIE1hbmlmZXN0LnNhdmVNYW5pZmVzdChtYW5pZmVzdCwgZmlsZVBhdGgsIEFTU0VUU19TQ0hFTUEsIE1hbmlmZXN0LnBhdGNoU3RhY2tUYWdzT25SZWFkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuZCB2YWxpZGF0ZXMgdGhlIGFzc2V0IG1hbmlmZXN0IGZyb20gZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gcGF0aCB0byB0aGUgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbG9hZEFzc2V0TWFuaWZlc3QoZmlsZVBhdGg6IHN0cmluZyk6IGFzc2V0cy5Bc3NldE1hbmlmZXN0IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkTWFuaWZlc3QoZmlsZVBhdGgsIEFTU0VUU19TQ0hFTUEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbmQgc2F2ZXMgdGhlIGludGVnIG1hbmlmZXN0IHRvIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBtYW5pZmVzdCAtIG1hbmlmZXN0LlxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBvdXRwdXQgZmlsZSBwYXRoLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzYXZlSW50ZWdNYW5pZmVzdChtYW5pZmVzdDogaW50ZWcuSW50ZWdNYW5pZmVzdCwgZmlsZVBhdGg6IHN0cmluZykge1xuICAgIE1hbmlmZXN0LnNhdmVNYW5pZmVzdChtYW5pZmVzdCwgZmlsZVBhdGgsIElOVEVHX1NDSEVNQSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbmQgdmFsaWRhdGVzIHRoZSBpbnRlZyBtYW5pZmVzdCBmcm9tIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIHBhdGggdG8gdGhlIG1hbmlmZXN0IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxvYWRJbnRlZ01hbmlmZXN0KGZpbGVQYXRoOiBzdHJpbmcpOiBpbnRlZy5JbnRlZ01hbmlmZXN0IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkTWFuaWZlc3QoZmlsZVBhdGgsIElOVEVHX1NDSEVNQSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGN1cnJlbnQgc2NoZW1hIHZlcnNpb24gbnVtYmVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNDSEVNQV9WRVJTSU9OO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWRcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBzYXZlQXNzZW1ibHlNYW5pZmVzdCgpYFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzYXZlKG1hbmlmZXN0OiBhc3NlbWJseS5Bc3NlbWJseU1hbmlmZXN0LCBmaWxlUGF0aDogc3RyaW5nKSB7IHJldHVybiB0aGlzLnNhdmVBc3NlbWJseU1hbmlmZXN0KG1hbmlmZXN0LCBmaWxlUGF0aCk7IH1cblxuICAvKipcbiAgICogRGVwcmVjYXRlZFxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYGxvYWRBc3NlbWJseU1hbmlmZXN0KClgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxvYWQoZmlsZVBhdGg6IHN0cmluZyk6IGFzc2VtYmx5LkFzc2VtYmx5TWFuaWZlc3QgeyByZXR1cm4gdGhpcy5sb2FkQXNzZW1ibHlNYW5pZmVzdChmaWxlUGF0aCk7IH1cblxuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZShtYW5pZmVzdDogeyB2ZXJzaW9uOiBzdHJpbmcgfSwgc2NoZW1hOiBqc29uc2NoZW1hLlNjaGVtYSwgb3B0aW9ucz86IExvYWRNYW5pZmVzdE9wdGlvbnMpIHtcbiAgICBmdW5jdGlvbiBwYXJzZVZlcnNpb24odmVyc2lvbjogc3RyaW5nKSB7XG4gICAgICBjb25zdCB2ZXIgPSBzZW12ZXIudmFsaWQodmVyc2lvbik7XG4gICAgICBpZiAoIXZlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2VtdmVyIHN0cmluZzogXCIke3ZlcnNpb259XCJgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2ZXI7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4U3VwcG9ydGVkID0gcGFyc2VWZXJzaW9uKE1hbmlmZXN0LnZlcnNpb24oKSk7XG4gICAgY29uc3QgYWN0dWFsID0gcGFyc2VWZXJzaW9uKG1hbmlmZXN0LnZlcnNpb24pO1xuXG4gICAgLy8gZmlyc3QgdmFsaWRhdGUgdGhlIHZlcnNpb24gc2hvdWxkIGJlIGFjY2VwdGVkLlxuICAgIGlmIChzZW12ZXIuZ3QoYWN0dWFsLCBtYXhTdXBwb3J0ZWQpICYmICFvcHRpb25zPy5za2lwVmVyc2lvbkNoZWNrKSB7XG4gICAgICAvLyB3ZSB1c2UgYSB3ZWxsIGtub3duIGVycm9yIHByZWZpeCBzbyB0aGF0IHRoZSBDTEkgY2FuIGlkZW50aWZ5IHRoaXMgc3BlY2lmaWMgZXJyb3JcbiAgICAgIC8vIGFuZCBwcmludCBzb21lIG1vcmUgY29udGV4dCB0byB0aGUgdXNlci5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtWRVJTSU9OX01JU01BVENIfTogTWF4aW11bSBzY2hlbWEgdmVyc2lvbiBzdXBwb3J0ZWQgaXMgJHttYXhTdXBwb3J0ZWR9LCBidXQgZm91bmQgJHthY3R1YWx9YCk7XG4gICAgfVxuXG4gICAgLy8gbm93IHZhbGlkYXRlIHRoZSBmb3JtYXQgaXMgZ29vZC5cbiAgICBjb25zdCB2YWxpZGF0b3IgPSBuZXcganNvbnNjaGVtYS5WYWxpZGF0b3IoKTtcbiAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0b3IudmFsaWRhdGUobWFuaWZlc3QsIHNjaGVtYSwge1xuXG4gICAgICAvLyBkb2VzIGV4aXN0IGJ1dCBpcyBub3QgaW4gdGhlIFR5cGVTY3JpcHQgZGVmaW5pdGlvbnNcbiAgICAgIG5lc3RlZEVycm9yczogdHJ1ZSxcblxuICAgICAgYWxsb3dVbmtub3duQXR0cmlidXRlczogZmFsc2UsXG5cbiAgICB9IGFzIGFueSk7XG5cbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0LmVycm9ycztcbiAgICBpZiAob3B0aW9ucz8uc2tpcEVudW1DaGVjaykge1xuICAgICAgLy8gRW51bSB2YWxpZGF0aW9ucyBhcmVuJ3QgdXNlZnVsIHdoZW5cbiAgICAgIGVycm9ycyA9IHN0cmlwRW51bUVycm9ycyhlcnJvcnMpO1xuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzc2VtYmx5IG1hbmlmZXN0OlxcbiR7ZXJyb3JzLm1hcChlID0+IGUuc3RhY2spLmpvaW4oJ1xcbicpfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNhdmVNYW5pZmVzdChtYW5pZmVzdDogYW55LCBmaWxlUGF0aDogc3RyaW5nLCBzY2hlbWE6IGpzb25zY2hlbWEuU2NoZW1hLCBwcmVwcm9jZXNzPzogKG9iajogYW55KSA9PiBhbnkpIHtcbiAgICBsZXQgd2l0aFZlcnNpb24gPSB7IC4uLm1hbmlmZXN0LCB2ZXJzaW9uOiBNYW5pZmVzdC52ZXJzaW9uKCkgfTtcbiAgICBNYW5pZmVzdC52YWxpZGF0ZSh3aXRoVmVyc2lvbiwgc2NoZW1hKTtcbiAgICBpZiAocHJlcHJvY2Vzcykge1xuICAgICAgd2l0aFZlcnNpb24gPSBwcmVwcm9jZXNzKHdpdGhWZXJzaW9uKTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkod2l0aFZlcnNpb24sIHVuZGVmaW5lZCwgMikpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbG9hZE1hbmlmZXN0KGZpbGVQYXRoOiBzdHJpbmcsIHNjaGVtYToganNvbnNjaGVtYS5TY2hlbWEsIHByZXByb2Nlc3M/OiAob2JqOiBhbnkpID0+IGFueSwgb3B0aW9ucz86IExvYWRNYW5pZmVzdE9wdGlvbnMpIHtcbiAgICBjb25zdCBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICBsZXQgb2JqO1xuICAgIHRyeSB7XG4gICAgICBvYmogPSBKU09OLnBhcnNlKGNvbnRlbnRzKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlLm1lc3NhZ2V9LCB3aGlsZSBwYXJzaW5nICR7SlNPTi5zdHJpbmdpZnkoY29udGVudHMpfWApO1xuICAgIH1cbiAgICBpZiAocHJlcHJvY2Vzcykge1xuICAgICAgb2JqID0gcHJlcHJvY2VzcyhvYmopO1xuICAgIH1cbiAgICBNYW5pZmVzdC52YWxpZGF0ZShvYmosIHNjaGVtYSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHJlcXVpcmVzIHNvbWUgZXhwbGFpbmluZy4uLlxuICAgKlxuICAgKiBXZSBwcmV2aW91c2x5IHVzZWQgYHsgS2V5LCBWYWx1ZSB9YCBmb3IgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBzdGFjayB0YWcuIChOb3RpY2UgdGhlIGNhc2luZylcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjEuMjcuMC9wYWNrYWdlcy9hd3MtY2RrL2xpYi9hcGkvY3hhcHAvc3RhY2tzLnRzI0w0MjcuXG4gICAqXG4gICAqIFdoZW4gdGhhdCBvYmplY3QgbW92ZWQgdG8gdGhpcyBwYWNrYWdlLCBpdCBoYWQgdG8gYmUgSlNJSSBjb21wbGlhbnQsIHdoaWNoIG1lYW50IHRoZSBwcm9wZXJ0eVxuICAgKiBuYW1lcyBtdXN0IGJlIGBjYW1lbENhc2VkYCwgYW5kIG5vdCBgUGFzY2FsQ2FzZWRgLiBUaGlzIG1lYW50IGl0IG5vIGxvbmdlciBtYXRjaGVzIHRoZSBzdHJ1Y3R1cmUgaW4gdGhlIGBtYW5pZmVzdC5qc29uYCBmaWxlLlxuICAgKiBJbiBvcmRlciB0byBzdXBwb3J0IGN1cnJlbnQgbWFuaWZlc3QgZmlsZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZSBgUGFzY2FsQ2FzZWRgIHJlcHJlc2VudGF0aW9uIHRvIHRoZSBuZXcgYGNhbWVsQ2FzZWRgIG9uZS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBzZXJpYWxpemF0aW9uIGl0c2VsZiBzdGlsbCB3cml0ZXMgYFBhc2NhbENhc2VkYCBiZWNhdXNlIGl0IHJlbGF0ZXMgdG8gaG93IENsb3VkRm9ybWF0aW9uIGV4cGVjdHMgaXQuXG4gICAqXG4gICAqIElkZWFsbHksIHdlIHdvdWxkIHN0YXJ0IHdyaXRpbmcgdGhlIGBjYW1lbENhc2VkYCBhbmQgdHJhbnNsYXRlIHRvIGhvdyBDbG91ZEZvcm1hdGlvbiBleHBlY3RzIGl0IHdoZW4gbmVlZGVkLiBCdXQgdGhpcyByZXF1aXJlcyBuYXN0eVxuICAgKiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBjb2RlIGFuZCBpdCBqdXN0IGRvZXNuJ3Qgc2VlbSB0byBiZSB3b3J0aCB0aGUgZWZmb3J0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGF0Y2hTdGFja1RhZ3NPblJlYWQobWFuaWZlc3Q6IGFzc2VtYmx5LkFzc2VtYmx5TWFuaWZlc3QpIHtcbiAgICByZXR1cm4gTWFuaWZlc3QucmVwbGFjZVN0YWNrVGFncyhtYW5pZmVzdCwgdGFncyA9PiB0YWdzLm1hcCgoZGlza1RhZzogYW55KSA9PiAoe1xuICAgICAga2V5OiBkaXNrVGFnLktleSxcbiAgICAgIHZhbHVlOiBkaXNrVGFnLlZhbHVlLFxuICAgIH0pKSk7XG4gIH1cblxuICAvKipcbiAgICogU2VlIGV4cGxhbmF0aW9uIG9uIGBwYXRjaFN0YWNrVGFnc09uUmVhZGBcbiAgICpcbiAgICogVHJhbnNsYXRlIHN0YWNrIHRhZ3MgbWV0YWRhdGEgaWYgaXQgaGFzIHRoZSBcInJpZ2h0XCIgY2FzaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGF0Y2hTdGFja1RhZ3NPbldyaXRlKG1hbmlmZXN0OiBhc3NlbWJseS5Bc3NlbWJseU1hbmlmZXN0KSB7XG4gICAgcmV0dXJuIE1hbmlmZXN0LnJlcGxhY2VTdGFja1RhZ3MobWFuaWZlc3QsIHRhZ3MgPT4gdGFncy5tYXAobWVtVGFnID0+XG4gICAgICAvLyBNaWdodCBhbHJlYWR5IGJlIHVwcGVyY2FzZWQgKGJlY2F1c2Ugc3RhY2sgc3ludGhlc2lzIGdlbmVyYXRlcyBpdCBpbiBmaW5hbCBmb3JtIHlldClcbiAgICAgICgnS2V5JyBpbiBtZW1UYWcgPyBtZW1UYWcgOiB7IEtleTogbWVtVGFnLmtleSwgVmFsdWU6IG1lbVRhZy52YWx1ZSB9KSBhcyBhbnksXG4gICAgKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgcmVwbGFjZSBzdGFjayB0YWdzIGluIHRoZSBzdGFjayBtZXRhZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVwbGFjZVN0YWNrVGFncyhtYW5pZmVzdDogYXNzZW1ibHkuQXNzZW1ibHlNYW5pZmVzdCwgZm46IEVuZG9mdW5jdG9yPGFzc2VtYmx5LlN0YWNrVGFnc01ldGFkYXRhRW50cnk+KTogYXNzZW1ibHkuQXNzZW1ibHlNYW5pZmVzdCB7XG4gICAgLy8gTmVlZCB0byBhZGQgaW4gdGhlIGBub1VuZGVmaW5lZGBzIGJlY2F1c2Ugb3RoZXJ3aXNlIGplc3Qgc25hcHNob3QgdGVzdHMgYXJlIGdvaW5nIHRvIGZyZWFrIG91dFxuICAgIC8vIGFib3V0IHRoZSBrZXlzIHdpdGggdmFsdWVzIHRoYXQgYXJlIGB1bmRlZmluZWRgIChldmVuIHRob3VnaCB0aGV5IHdvdWxkIG5ldmVyIGJlIEpTT04uc3RyaW5naWZpZWQpXG4gICAgcmV0dXJuIG5vVW5kZWZpbmVkKHtcbiAgICAgIC4uLm1hbmlmZXN0LFxuICAgICAgYXJ0aWZhY3RzOiBtYXBWYWx1ZXMobWFuaWZlc3QuYXJ0aWZhY3RzLCBhcnRpZmFjdCA9PiB7XG4gICAgICAgIGlmIChhcnRpZmFjdC50eXBlICE9PSBhc3NlbWJseS5BcnRpZmFjdFR5cGUuQVdTX0NMT1VERk9STUFUSU9OX1NUQUNLKSB7IHJldHVybiBhcnRpZmFjdDsgfVxuICAgICAgICByZXR1cm4gbm9VbmRlZmluZWQoe1xuICAgICAgICAgIC4uLmFydGlmYWN0LFxuICAgICAgICAgIG1ldGFkYXRhOiBtYXBWYWx1ZXMoYXJ0aWZhY3QubWV0YWRhdGEsIG1ldGFkYXRhRW50cmllcyA9PiBtZXRhZGF0YUVudHJpZXMubWFwKG1ldGFkYXRhRW50cnkgPT4ge1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhRW50cnkudHlwZSAhPT0gYXNzZW1ibHkuQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5TVEFDS19UQUdTIHx8ICFtZXRhZGF0YUVudHJ5LmRhdGEpIHsgcmV0dXJuIG1ldGFkYXRhRW50cnk7IH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLm1ldGFkYXRhRW50cnksXG4gICAgICAgICAgICAgIGRhdGE6IGZuKG1ldGFkYXRhRW50cnkuZGF0YSBhcyBhc3NlbWJseS5TdGFja1RhZ3NNZXRhZGF0YUVudHJ5KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkpLFxuICAgICAgICB9IGFzIGFzc2VtYmx5LkFydGlmYWN0TWFuaWZlc3QpO1xuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cblxudHlwZSBFbmRvZnVuY3RvcjxBPiA9ICh4OiBBKSA9PiBBO1xuXG5mdW5jdGlvbiBtYXBWYWx1ZXM8QSwgQj4oeHM6IFJlY29yZDxzdHJpbmcsIEE+IHwgdW5kZWZpbmVkLCBmbjogKHg6IEEpID0+IEIpOiBSZWNvcmQ8c3RyaW5nLCBCPiB8IHVuZGVmaW5lZCB7XG4gIGlmICgheHMpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXQ6IFJlY29yZDxzdHJpbmcsIEI+IHwgdW5kZWZpbmVkID0ge307XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHhzKSkge1xuICAgIHJldFtrXSA9IGZuKHYpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG5vVW5kZWZpbmVkPEEgZXh0ZW5kcyBvYmplY3Q+KHhzOiBBKTogQSB7XG4gIGNvbnN0IHJldDogYW55ID0ge307XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHhzKSkge1xuICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldFtrXSA9IHY7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHN0cmlwRW51bUVycm9ycyhlcnJvcnM6IGpzb25zY2hlbWEuVmFsaWRhdGlvbkVycm9yW10pIHtcbiAgcmV0dXJuIGVycm9ycy5maWx0ZXIoZSA9PiB0eXBlb2YgZS5zY2hlbWEgPT09J3N0cmluZycgfHwgISgnZW51bScgaW4gZS5zY2hlbWEpKTtcbn1cbiJdfQ==","'use strict';\n\nvar helpers = require('./helpers');\n\n/** @type ValidatorResult */\nvar ValidatorResult = helpers.ValidatorResult;\n/** @type SchemaError */\nvar SchemaError = helpers.SchemaError;\n\nvar attribute = {};\n\nattribute.ignoreProperties = {\n // informative properties\n 'id': true,\n 'default': true,\n 'description': true,\n 'title': true,\n // arguments to other properties\n 'additionalItems': true,\n 'then': true,\n 'else': true,\n // special-handled properties\n '$schema': true,\n '$ref': true,\n 'extends': true,\n};\n\n/**\n * @name validators\n */\nvar validators = attribute.validators = {};\n\n/**\n * Validates whether the instance if of a certain type\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {ValidatorResult|null}\n */\nvalidators.type = function validateType (instance, schema, options, ctx) {\n // Ignore undefined instances\n if (instance === undefined) {\n return null;\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n var types = Array.isArray(schema.type) ? schema.type : [schema.type];\n if (!types.some(this.testType.bind(this, instance, schema, options, ctx))) {\n var list = types.map(function (v) {\n if(!v) return;\n var id = v.$id || v.id;\n return id ? ('<' + id + '>') : (v+'');\n });\n result.addError({\n name: 'type',\n argument: list,\n message: \"is not of a type(s) \" + list,\n });\n }\n return result;\n};\n\nfunction testSchemaNoThrow(instance, options, ctx, callback, schema){\n var throwError = options.throwError;\n var throwAll = options.throwAll;\n options.throwError = false;\n options.throwAll = false;\n var res = this.validateSchema(instance, schema, options, ctx);\n options.throwError = throwError;\n options.throwAll = throwAll;\n\n if (!res.valid && callback instanceof Function) {\n callback(res);\n }\n return res.valid;\n}\n\n/**\n * Validates whether the instance matches some of the given schemas\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {ValidatorResult|null}\n */\nvalidators.anyOf = function validateAnyOf (instance, schema, options, ctx) {\n // Ignore undefined instances\n if (instance === undefined) {\n return null;\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n var inner = new ValidatorResult(instance, schema, options, ctx);\n if (!Array.isArray(schema.anyOf)){\n throw new SchemaError(\"anyOf must be an array\");\n }\n if (!schema.anyOf.some(\n testSchemaNoThrow.bind(\n this, instance, options, ctx, function(res){inner.importErrors(res);}\n ))) {\n var list = schema.anyOf.map(function (v, i) {\n var id = v.$id || v.id;\n if(id) return '<' + id + '>';\n return(v.title && JSON.stringify(v.title)) || (v['$ref'] && ('<' + v['$ref'] + '>')) || '[subschema '+i+']';\n });\n if (options.nestedErrors) {\n result.importErrors(inner);\n }\n result.addError({\n name: 'anyOf',\n argument: list,\n message: \"is not any of \" + list.join(','),\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance matches every given schema\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null}\n */\nvalidators.allOf = function validateAllOf (instance, schema, options, ctx) {\n // Ignore undefined instances\n if (instance === undefined) {\n return null;\n }\n if (!Array.isArray(schema.allOf)){\n throw new SchemaError(\"allOf must be an array\");\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n var self = this;\n schema.allOf.forEach(function(v, i){\n var valid = self.validateSchema(instance, v, options, ctx);\n if(!valid.valid){\n var id = v.$id || v.id;\n var msg = id || (v.title && JSON.stringify(v.title)) || (v['$ref'] && ('<' + v['$ref'] + '>')) || '[subschema '+i+']';\n result.addError({\n name: 'allOf',\n argument: { id: msg, length: valid.errors.length, valid: valid },\n message: 'does not match allOf schema ' + msg + ' with ' + valid.errors.length + ' error[s]:',\n });\n result.importErrors(valid);\n }\n });\n return result;\n};\n\n/**\n * Validates whether the instance matches exactly one of the given schemas\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null}\n */\nvalidators.oneOf = function validateOneOf (instance, schema, options, ctx) {\n // Ignore undefined instances\n if (instance === undefined) {\n return null;\n }\n if (!Array.isArray(schema.oneOf)){\n throw new SchemaError(\"oneOf must be an array\");\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n var inner = new ValidatorResult(instance, schema, options, ctx);\n var count = schema.oneOf.filter(\n testSchemaNoThrow.bind(\n this, instance, options, ctx, function(res) {inner.importErrors(res);}\n ) ).length;\n var list = schema.oneOf.map(function (v, i) {\n var id = v.$id || v.id;\n return id || (v.title && JSON.stringify(v.title)) || (v['$ref'] && ('<' + v['$ref'] + '>')) || '[subschema '+i+']';\n });\n if (count!==1) {\n if (options.nestedErrors) {\n result.importErrors(inner);\n }\n result.addError({\n name: 'oneOf',\n argument: list,\n message: \"is not exactly one from \" + list.join(','),\n });\n }\n return result;\n};\n\n/**\n * Validates \"then\" or \"else\" depending on the result of validating \"if\"\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null}\n */\nvalidators.if = function validateIf (instance, schema, options, ctx) {\n // Ignore undefined instances\n if (instance === undefined) return null;\n if (!helpers.isSchema(schema.if)) throw new Error('Expected \"if\" keyword to be a schema');\n var ifValid = testSchemaNoThrow.call(this, instance, options, ctx, null, schema.if);\n var result = new ValidatorResult(instance, schema, options, ctx);\n var res;\n if(ifValid){\n if (schema.then === undefined) return;\n if (!helpers.isSchema(schema.then)) throw new Error('Expected \"then\" keyword to be a schema');\n res = this.validateSchema(instance, schema.then, options, ctx.makeChild(schema.then));\n result.importErrors(res);\n }else{\n if (schema.else === undefined) return;\n if (!helpers.isSchema(schema.else)) throw new Error('Expected \"else\" keyword to be a schema');\n res = this.validateSchema(instance, schema.else, options, ctx.makeChild(schema.else));\n result.importErrors(res);\n }\n return result;\n};\n\nfunction getEnumerableProperty(object, key){\n // Determine if `key` shows up in `for(var key in object)`\n // First test Object.hasOwnProperty.call as an optimization: that guarantees it does\n if(Object.hasOwnProperty.call(object, key)) return object[key];\n // Test `key in object` as an optimization; false means it won't\n if(!(key in object)) return;\n while( (object = Object.getPrototypeOf(object)) ){\n if(Object.propertyIsEnumerable.call(object, key)) return object[key];\n }\n}\n\n/**\n * Validates propertyNames\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.propertyNames = function validatePropertyNames (instance, schema, options, ctx) {\n if(!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var subschema = schema.propertyNames!==undefined ? schema.propertyNames : {};\n if(!helpers.isSchema(subschema)) throw new SchemaError('Expected \"propertyNames\" to be a schema (object or boolean)');\n\n for (var property in instance) {\n if(getEnumerableProperty(instance, property) !== undefined){\n var res = this.validateSchema(property, subschema, options, ctx.makeChild(subschema));\n result.importErrors(res);\n }\n }\n\n return result;\n};\n\n/**\n * Validates properties\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.properties = function validateProperties (instance, schema, options, ctx) {\n if(!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var properties = schema.properties || {};\n for (var property in properties) {\n var subschema = properties[property];\n if(subschema===undefined){\n continue;\n }else if(subschema===null){\n throw new SchemaError('Unexpected null, expected schema in \"properties\"');\n }\n if (typeof options.preValidateProperty == 'function') {\n options.preValidateProperty(instance, property, subschema, options, ctx);\n }\n var prop = getEnumerableProperty(instance, property);\n var res = this.validateSchema(prop, subschema, options, ctx.makeChild(subschema, property));\n if(res.instance !== result.instance[property]) result.instance[property] = res.instance;\n result.importErrors(res);\n }\n return result;\n};\n\n/**\n * Test a specific property within in instance against the additionalProperties schema attribute\n * This ignores properties with definitions in the properties schema attribute, but no other attributes.\n * If too many more types of property-existence tests pop up they may need their own class of tests (like `type` has)\n * @private\n * @return {boolean}\n */\nfunction testAdditionalProperty (instance, schema, options, ctx, property, result) {\n if(!this.types.object(instance)) return;\n if (schema.properties && schema.properties[property] !== undefined) {\n return;\n }\n if (schema.additionalProperties === false) {\n result.addError({\n name: 'additionalProperties',\n argument: property,\n message: \"is not allowed to have the additional property \" + JSON.stringify(property),\n });\n } else {\n var additionalProperties = schema.additionalProperties || {};\n\n if (typeof options.preValidateProperty == 'function') {\n options.preValidateProperty(instance, property, additionalProperties, options, ctx);\n }\n\n var res = this.validateSchema(instance[property], additionalProperties, options, ctx.makeChild(additionalProperties, property));\n if(res.instance !== result.instance[property]) result.instance[property] = res.instance;\n result.importErrors(res);\n }\n}\n\n/**\n * Validates patternProperties\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.patternProperties = function validatePatternProperties (instance, schema, options, ctx) {\n if(!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var patternProperties = schema.patternProperties || {};\n\n for (var property in instance) {\n var test = true;\n for (var pattern in patternProperties) {\n var subschema = patternProperties[pattern];\n if(subschema===undefined){\n continue;\n }else if(subschema===null){\n throw new SchemaError('Unexpected null, expected schema in \"patternProperties\"');\n }\n try {\n var regexp = new RegExp(pattern, 'u');\n } catch(_e) {\n // In the event the stricter handling causes an error, fall back on the forgiving handling\n // DEPRECATED\n regexp = new RegExp(pattern);\n }\n if (!regexp.test(property)) {\n continue;\n }\n test = false;\n\n if (typeof options.preValidateProperty == 'function') {\n options.preValidateProperty(instance, property, subschema, options, ctx);\n }\n\n var res = this.validateSchema(instance[property], subschema, options, ctx.makeChild(subschema, property));\n if(res.instance !== result.instance[property]) result.instance[property] = res.instance;\n result.importErrors(res);\n }\n if (test) {\n testAdditionalProperty.call(this, instance, schema, options, ctx, property, result);\n }\n }\n\n return result;\n};\n\n/**\n * Validates additionalProperties\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.additionalProperties = function validateAdditionalProperties (instance, schema, options, ctx) {\n if(!this.types.object(instance)) return;\n // if patternProperties is defined then we'll test when that one is called instead\n if (schema.patternProperties) {\n return null;\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n for (var property in instance) {\n testAdditionalProperty.call(this, instance, schema, options, ctx, property, result);\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is at least of a certain length, when the instance value is a string.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.minProperties = function validateMinProperties (instance, schema, options, ctx) {\n if (!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var keys = Object.keys(instance);\n if (!(keys.length >= schema.minProperties)) {\n result.addError({\n name: 'minProperties',\n argument: schema.minProperties,\n message: \"does not meet minimum property length of \" + schema.minProperties,\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is at most of a certain length, when the instance value is a string.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.maxProperties = function validateMaxProperties (instance, schema, options, ctx) {\n if (!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var keys = Object.keys(instance);\n if (!(keys.length <= schema.maxProperties)) {\n result.addError({\n name: 'maxProperties',\n argument: schema.maxProperties,\n message: \"does not meet maximum property length of \" + schema.maxProperties,\n });\n }\n return result;\n};\n\n/**\n * Validates items when instance is an array\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.items = function validateItems (instance, schema, options, ctx) {\n var self = this;\n if (!this.types.array(instance)) return;\n if (schema.items===undefined) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n instance.every(function (value, i) {\n if(Array.isArray(schema.items)){\n var items = schema.items[i]===undefined ? schema.additionalItems : schema.items[i];\n }else{\n var items = schema.items;\n }\n if (items === undefined) {\n return true;\n }\n if (items === false) {\n result.addError({\n name: 'items',\n message: \"additionalItems not permitted\",\n });\n return false;\n }\n var res = self.validateSchema(value, items, options, ctx.makeChild(items, i));\n if(res.instance !== result.instance[i]) result.instance[i] = res.instance;\n result.importErrors(res);\n return true;\n });\n return result;\n};\n\n/**\n * Validates the \"contains\" keyword\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {String|null|ValidatorResult}\n */\nvalidators.contains = function validateContains (instance, schema, options, ctx) {\n var self = this;\n if (!this.types.array(instance)) return;\n if (schema.contains===undefined) return;\n if (!helpers.isSchema(schema.contains)) throw new Error('Expected \"contains\" keyword to be a schema');\n var result = new ValidatorResult(instance, schema, options, ctx);\n var count = instance.some(function (value, i) {\n var res = self.validateSchema(value, schema.contains, options, ctx.makeChild(schema.contains, i));\n return res.errors.length===0;\n });\n if(count===false){\n result.addError({\n name: 'contains',\n argument: schema.contains,\n message: \"must contain an item matching given schema\",\n });\n }\n return result;\n};\n\n/**\n * Validates minimum and exclusiveMinimum when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.minimum = function validateMinimum (instance, schema, options, ctx) {\n if (!this.types.number(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (schema.exclusiveMinimum && schema.exclusiveMinimum === true) {\n if(!(instance > schema.minimum)){\n result.addError({\n name: 'minimum',\n argument: schema.minimum,\n message: \"must be greater than \" + schema.minimum,\n });\n }\n } else {\n if(!(instance >= schema.minimum)){\n result.addError({\n name: 'minimum',\n argument: schema.minimum,\n message: \"must be greater than or equal to \" + schema.minimum,\n });\n }\n }\n return result;\n};\n\n/**\n * Validates maximum and exclusiveMaximum when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.maximum = function validateMaximum (instance, schema, options, ctx) {\n if (!this.types.number(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (schema.exclusiveMaximum && schema.exclusiveMaximum === true) {\n if(!(instance < schema.maximum)){\n result.addError({\n name: 'maximum',\n argument: schema.maximum,\n message: \"must be less than \" + schema.maximum,\n });\n }\n } else {\n if(!(instance <= schema.maximum)){\n result.addError({\n name: 'maximum',\n argument: schema.maximum,\n message: \"must be less than or equal to \" + schema.maximum,\n });\n }\n }\n return result;\n};\n\n/**\n * Validates the number form of exclusiveMinimum when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.exclusiveMinimum = function validateExclusiveMinimum (instance, schema, options, ctx) {\n // Support the boolean form of exclusiveMinimum, which is handled by the \"minimum\" keyword.\n if(typeof schema.exclusiveMinimum === 'boolean') return;\n if (!this.types.number(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var valid = instance > schema.exclusiveMinimum;\n if (!valid) {\n result.addError({\n name: 'exclusiveMinimum',\n argument: schema.exclusiveMinimum,\n message: \"must be strictly greater than \" + schema.exclusiveMinimum,\n });\n }\n return result;\n};\n\n/**\n * Validates the number form of exclusiveMaximum when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.exclusiveMaximum = function validateExclusiveMaximum (instance, schema, options, ctx) {\n // Support the boolean form of exclusiveMaximum, which is handled by the \"maximum\" keyword.\n if(typeof schema.exclusiveMaximum === 'boolean') return;\n if (!this.types.number(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var valid = instance < schema.exclusiveMaximum;\n if (!valid) {\n result.addError({\n name: 'exclusiveMaximum',\n argument: schema.exclusiveMaximum,\n message: \"must be strictly less than \" + schema.exclusiveMaximum,\n });\n }\n return result;\n};\n\n/**\n * Perform validation for multipleOf and divisibleBy, which are essentially the same.\n * @param instance\n * @param schema\n * @param validationType\n * @param errorMessage\n * @returns {String|null}\n */\nvar validateMultipleOfOrDivisbleBy = function validateMultipleOfOrDivisbleBy (instance, schema, options, ctx, validationType, errorMessage) {\n if (!this.types.number(instance)) return;\n\n var validationArgument = schema[validationType];\n if (validationArgument == 0) {\n throw new SchemaError(validationType + \" cannot be zero\");\n }\n\n var result = new ValidatorResult(instance, schema, options, ctx);\n\n var instanceDecimals = helpers.getDecimalPlaces(instance);\n var divisorDecimals = helpers.getDecimalPlaces(validationArgument);\n\n var maxDecimals = Math.max(instanceDecimals , divisorDecimals);\n var multiplier = Math.pow(10, maxDecimals);\n\n if (Math.round(instance * multiplier) % Math.round(validationArgument * multiplier) !== 0) {\n result.addError({\n name: validationType,\n argument: validationArgument,\n message: errorMessage + JSON.stringify(validationArgument),\n });\n }\n\n return result;\n};\n\n/**\n * Validates divisibleBy when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.multipleOf = function validateMultipleOf (instance, schema, options, ctx) {\n return validateMultipleOfOrDivisbleBy.call(this, instance, schema, options, ctx, \"multipleOf\", \"is not a multiple of (divisible by) \");\n};\n\n/**\n * Validates multipleOf when the type of the instance value is a number.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.divisibleBy = function validateDivisibleBy (instance, schema, options, ctx) {\n return validateMultipleOfOrDivisbleBy.call(this, instance, schema, options, ctx, \"divisibleBy\", \"is not divisible by (multiple of) \");\n};\n\n/**\n * Validates whether the instance value is present.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.required = function validateRequired (instance, schema, options, ctx) {\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (instance === undefined && schema.required === true) {\n // A boolean form is implemented for reverse-compatibility with schemas written against older drafts\n result.addError({\n name: 'required',\n message: \"is required\",\n });\n } else if (this.types.object(instance) && Array.isArray(schema.required)) {\n schema.required.forEach(function(n){\n if(getEnumerableProperty(instance, n)===undefined){\n result.addError({\n name: 'required',\n argument: n,\n message: \"requires property \" + JSON.stringify(n),\n });\n }\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance value matches the regular expression, when the instance value is a string.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.pattern = function validatePattern (instance, schema, options, ctx) {\n if (!this.types.string(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var pattern = schema.pattern;\n try {\n var regexp = new RegExp(pattern, 'u');\n } catch(_e) {\n // In the event the stricter handling causes an error, fall back on the forgiving handling\n // DEPRECATED\n regexp = new RegExp(pattern);\n }\n if (!instance.match(regexp)) {\n result.addError({\n name: 'pattern',\n argument: schema.pattern,\n message: \"does not match pattern \" + JSON.stringify(schema.pattern.toString()),\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is of a certain defined format or a custom\n * format.\n * The following formats are supported for string types:\n * - date-time\n * - date\n * - time\n * - ip-address\n * - ipv6\n * - uri\n * - color\n * - host-name\n * - alpha\n * - alpha-numeric\n * - utc-millisec\n * @param instance\n * @param schema\n * @param [options]\n * @param [ctx]\n * @return {String|null}\n */\nvalidators.format = function validateFormat (instance, schema, options, ctx) {\n if (instance===undefined) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!result.disableFormat && !helpers.isFormat(instance, schema.format, this)) {\n result.addError({\n name: 'format',\n argument: schema.format,\n message: \"does not conform to the \" + JSON.stringify(schema.format) + \" format\",\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is at least of a certain length, when the instance value is a string.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.minLength = function validateMinLength (instance, schema, options, ctx) {\n if (!this.types.string(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var hsp = instance.match(/[\\uDC00-\\uDFFF]/g);\n var length = instance.length - (hsp ? hsp.length : 0);\n if (!(length >= schema.minLength)) {\n result.addError({\n name: 'minLength',\n argument: schema.minLength,\n message: \"does not meet minimum length of \" + schema.minLength,\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is at most of a certain length, when the instance value is a string.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.maxLength = function validateMaxLength (instance, schema, options, ctx) {\n if (!this.types.string(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n // TODO if this was already computed in \"minLength\", use that value instead of re-computing\n var hsp = instance.match(/[\\uDC00-\\uDFFF]/g);\n var length = instance.length - (hsp ? hsp.length : 0);\n if (!(length <= schema.maxLength)) {\n result.addError({\n name: 'maxLength',\n argument: schema.maxLength,\n message: \"does not meet maximum length of \" + schema.maxLength,\n });\n }\n return result;\n};\n\n/**\n * Validates whether instance contains at least a minimum number of items, when the instance is an Array.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.minItems = function validateMinItems (instance, schema, options, ctx) {\n if (!this.types.array(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!(instance.length >= schema.minItems)) {\n result.addError({\n name: 'minItems',\n argument: schema.minItems,\n message: \"does not meet minimum length of \" + schema.minItems,\n });\n }\n return result;\n};\n\n/**\n * Validates whether instance contains no more than a maximum number of items, when the instance is an Array.\n * @param instance\n * @param schema\n * @return {String|null}\n */\nvalidators.maxItems = function validateMaxItems (instance, schema, options, ctx) {\n if (!this.types.array(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!(instance.length <= schema.maxItems)) {\n result.addError({\n name: 'maxItems',\n argument: schema.maxItems,\n message: \"does not meet maximum length of \" + schema.maxItems,\n });\n }\n return result;\n};\n\n/**\n * Deep compares arrays for duplicates\n * @param v\n * @param i\n * @param a\n * @private\n * @return {boolean}\n */\nfunction testArrays (v, i, a) {\n var j, len = a.length;\n for (j = i + 1, len; j < len; j++) {\n if (helpers.deepCompareStrict(v, a[j])) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Validates whether there are no duplicates, when the instance is an Array.\n * @param instance\n * @return {String|null}\n */\nvalidators.uniqueItems = function validateUniqueItems (instance, schema, options, ctx) {\n if (schema.uniqueItems!==true) return;\n if (!this.types.array(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!instance.every(testArrays)) {\n result.addError({\n name: 'uniqueItems',\n message: \"contains duplicate item\",\n });\n }\n return result;\n};\n\n/**\n * Validate for the presence of dependency properties, if the instance is an object.\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {null|ValidatorResult}\n */\nvalidators.dependencies = function validateDependencies (instance, schema, options, ctx) {\n if (!this.types.object(instance)) return;\n var result = new ValidatorResult(instance, schema, options, ctx);\n for (var property in schema.dependencies) {\n if (instance[property] === undefined) {\n continue;\n }\n var dep = schema.dependencies[property];\n var childContext = ctx.makeChild(dep, property);\n if (typeof dep == 'string') {\n dep = [dep];\n }\n if (Array.isArray(dep)) {\n dep.forEach(function (prop) {\n if (instance[prop] === undefined) {\n result.addError({\n // FIXME there's two different \"dependencies\" errors here with slightly different outputs\n // Can we make these the same? Or should we create different error types?\n name: 'dependencies',\n argument: childContext.propertyPath,\n message: \"property \" + prop + \" not found, required by \" + childContext.propertyPath,\n });\n }\n });\n } else {\n var res = this.validateSchema(instance, dep, options, childContext);\n if(result.instance !== res.instance) result.instance = res.instance;\n if (res && res.errors.length) {\n result.addError({\n name: 'dependencies',\n argument: childContext.propertyPath,\n message: \"does not meet dependency required by \" + childContext.propertyPath,\n });\n result.importErrors(res);\n }\n }\n }\n return result;\n};\n\n/**\n * Validates whether the instance value is one of the enumerated values.\n *\n * @param instance\n * @param schema\n * @return {ValidatorResult|null}\n */\nvalidators['enum'] = function validateEnum (instance, schema, options, ctx) {\n if (instance === undefined) {\n return null;\n }\n if (!Array.isArray(schema['enum'])) {\n throw new SchemaError(\"enum expects an array\", schema);\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!schema['enum'].some(helpers.deepCompareStrict.bind(null, instance))) {\n result.addError({\n name: 'enum',\n argument: schema['enum'],\n message: \"is not one of enum values: \" + schema['enum'].map(String).join(','),\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance exactly matches a given value\n *\n * @param instance\n * @param schema\n * @return {ValidatorResult|null}\n */\nvalidators['const'] = function validateEnum (instance, schema, options, ctx) {\n if (instance === undefined) {\n return null;\n }\n var result = new ValidatorResult(instance, schema, options, ctx);\n if (!helpers.deepCompareStrict(schema['const'], instance)) {\n result.addError({\n name: 'const',\n argument: schema['const'],\n message: \"does not exactly match expected constant: \" + schema['const'],\n });\n }\n return result;\n};\n\n/**\n * Validates whether the instance if of a prohibited type.\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @return {null|ValidatorResult}\n */\nvalidators.not = validators.disallow = function validateNot (instance, schema, options, ctx) {\n var self = this;\n if(instance===undefined) return null;\n var result = new ValidatorResult(instance, schema, options, ctx);\n var notTypes = schema.not || schema.disallow;\n if(!notTypes) return null;\n if(!Array.isArray(notTypes)) notTypes=[notTypes];\n notTypes.forEach(function (type) {\n if (self.testType(instance, schema, options, ctx, type)) {\n var id = type && (type.$id || type.id);\n var schemaId = id || type;\n result.addError({\n name: 'not',\n argument: schemaId,\n message: \"is of prohibited type \" + schemaId,\n });\n }\n });\n return result;\n};\n\nmodule.exports = attribute;\n","'use strict';\n\nvar uri = require('url');\n\nvar ValidationError = exports.ValidationError = function ValidationError (message, instance, schema, path, name, argument) {\n if(Array.isArray(path)){\n this.path = path;\n this.property = path.reduce(function(sum, item){\n return sum + makeSuffix(item);\n }, 'instance');\n }else if(path !== undefined){\n this.property = path;\n }\n if (message) {\n this.message = message;\n }\n if (schema) {\n var id = schema.$id || schema.id;\n this.schema = id || schema;\n }\n if (instance !== undefined) {\n this.instance = instance;\n }\n this.name = name;\n this.argument = argument;\n this.stack = this.toString();\n};\n\nValidationError.prototype.toString = function toString() {\n return this.property + ' ' + this.message;\n};\n\nvar ValidatorResult = exports.ValidatorResult = function ValidatorResult(instance, schema, options, ctx) {\n this.instance = instance;\n this.schema = schema;\n this.options = options;\n this.path = ctx.path;\n this.propertyPath = ctx.propertyPath;\n this.errors = [];\n this.throwError = options && options.throwError;\n this.throwFirst = options && options.throwFirst;\n this.throwAll = options && options.throwAll;\n this.disableFormat = options && options.disableFormat === true;\n};\n\nValidatorResult.prototype.addError = function addError(detail) {\n var err;\n if (typeof detail == 'string') {\n err = new ValidationError(detail, this.instance, this.schema, this.path);\n } else {\n if (!detail) throw new Error('Missing error detail');\n if (!detail.message) throw new Error('Missing error message');\n if (!detail.name) throw new Error('Missing validator type');\n err = new ValidationError(detail.message, this.instance, this.schema, this.path, detail.name, detail.argument);\n }\n\n this.errors.push(err);\n if (this.throwFirst) {\n throw new ValidatorResultError(this);\n }else if(this.throwError){\n throw err;\n }\n return err;\n};\n\nValidatorResult.prototype.importErrors = function importErrors(res) {\n if (typeof res == 'string' || (res && res.validatorType)) {\n this.addError(res);\n } else if (res && res.errors) {\n this.errors = this.errors.concat(res.errors);\n }\n};\n\nfunction stringizer (v,i){\n return i+': '+v.toString()+'\\n';\n}\nValidatorResult.prototype.toString = function toString(res) {\n return this.errors.map(stringizer).join('');\n};\n\nObject.defineProperty(ValidatorResult.prototype, \"valid\", { get: function() {\n return !this.errors.length;\n} });\n\nmodule.exports.ValidatorResultError = ValidatorResultError;\nfunction ValidatorResultError(result) {\n if(Error.captureStackTrace){\n Error.captureStackTrace(this, ValidatorResultError);\n }\n this.instance = result.instance;\n this.schema = result.schema;\n this.options = result.options;\n this.errors = result.errors;\n}\nValidatorResultError.prototype = new Error();\nValidatorResultError.prototype.constructor = ValidatorResultError;\nValidatorResultError.prototype.name = \"Validation Error\";\n\n/**\n * Describes a problem with a Schema which prevents validation of an instance\n * @name SchemaError\n * @constructor\n */\nvar SchemaError = exports.SchemaError = function SchemaError (msg, schema) {\n this.message = msg;\n this.schema = schema;\n Error.call(this, msg);\n Error.captureStackTrace(this, SchemaError);\n};\nSchemaError.prototype = Object.create(Error.prototype,\n {\n constructor: {value: SchemaError, enumerable: false},\n name: {value: 'SchemaError', enumerable: false},\n });\n\nvar SchemaContext = exports.SchemaContext = function SchemaContext (schema, options, path, base, schemas) {\n this.schema = schema;\n this.options = options;\n if(Array.isArray(path)){\n this.path = path;\n this.propertyPath = path.reduce(function(sum, item){\n return sum + makeSuffix(item);\n }, 'instance');\n }else{\n this.propertyPath = path;\n }\n this.base = base;\n this.schemas = schemas;\n};\n\nSchemaContext.prototype.resolve = function resolve (target) {\n return uri.resolve(this.base, target);\n};\n\nSchemaContext.prototype.makeChild = function makeChild(schema, propertyName){\n var path = (propertyName===undefined) ? this.path : this.path.concat([propertyName]);\n var id = schema.$id || schema.id;\n var base = uri.resolve(this.base, id||'');\n var ctx = new SchemaContext(schema, this.options, path, base, Object.create(this.schemas));\n if(id && !ctx.schemas[base]){\n ctx.schemas[base] = schema;\n }\n return ctx;\n};\n\nvar FORMAT_REGEXPS = exports.FORMAT_REGEXPS = {\n // 7.3.1. Dates, Times, and Duration\n 'date-time': /^\\d{4}-(?:0[0-9]{1}|1[0-2]{1})-(3[01]|0[1-9]|[12][0-9])[tT ](2[0-4]|[01][0-9]):([0-5][0-9]):(60|[0-5][0-9])(\\.\\d+)?([zZ]|[+-]([0-5][0-9]):(60|[0-5][0-9]))$/,\n 'date': /^\\d{4}-(?:0[0-9]{1}|1[0-2]{1})-(3[01]|0[1-9]|[12][0-9])$/,\n 'time': /^(2[0-4]|[01][0-9]):([0-5][0-9]):(60|[0-5][0-9])$/,\n 'duration': /P(T\\d+(H(\\d+M(\\d+S)?)?|M(\\d+S)?|S)|\\d+(D|M(\\d+D)?|Y(\\d+M(\\d+D)?)?)(T\\d+(H(\\d+M(\\d+S)?)?|M(\\d+S)?|S))?|\\d+W)/i,\n\n // 7.3.2. Email Addresses\n // TODO: fix the email production\n 'email': /^(?:[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+\\.)*[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!\\.)){0,61}[a-zA-Z0-9]?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\\[(?:(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\]))$/,\n 'idn-email': /^(\"(?:[!#-\\[\\]-\\u{10FFFF}]|\\\\[\\t -\\u{10FFFF}])*\"|[!#-'*+\\-/-9=?A-Z\\^-\\u{10FFFF}](?:\\.?[!#-'*+\\-/-9=?A-Z\\^-\\u{10FFFF}])*)@([!#-'*+\\-/-9=?A-Z\\^-\\u{10FFFF}](?:\\.?[!#-'*+\\-/-9=?A-Z\\^-\\u{10FFFF}])*|\\[[!-Z\\^-\\u{10FFFF}]*\\])$/u,\n\n // 7.3.3. Hostnames\n\n // 7.3.4. IP Addresses\n 'ip-address': /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\n // FIXME whitespace is invalid\n 'ipv6': /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/,\n\n // 7.3.5. Resource Identifiers\n // TODO: A more accurate regular expression for \"uri\" goes:\n // [A-Za-z][+\\-.0-9A-Za-z]*:((/(/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?)?)?#(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|(/(/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?[/?]|[!$&-.0-;=?-Z_a-z~])|/?%[0-9A-Fa-f]{2}|[!$&-.0-;=?-Z_a-z~])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*(#(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*)?|/(/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+(:\\d*)?|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?:\\d*|\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)?)?\n 'uri': /^[a-zA-Z][a-zA-Z0-9+.-]*:[^\\s]*$/,\n 'uri-reference': /^(((([A-Za-z][+\\-.0-9A-Za-z]*(:%[0-9A-Fa-f]{2}|:[!$&-.0-;=?-Z_a-z~]|[/?])|\\?)(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|([A-Za-z][+\\-.0-9A-Za-z]*:?)?)|([A-Za-z][+\\-.0-9A-Za-z]*:)?\\/((%[0-9A-Fa-f]{2}|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?[/?]|[!$&-.0-;=?-Z_a-z~])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|(\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?)?))#(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|(([A-Za-z][+\\-.0-9A-Za-z]*)?%[0-9A-Fa-f]{2}|[!$&-.0-9;=@_~]|[A-Za-z][+\\-.0-9A-Za-z]*[!$&-*,;=@_~])(%[0-9A-Fa-f]{2}|[!$&-.0-9;=@-Z_a-z~])*((([/?](%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*)?#|[/?])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*)?|([A-Za-z][+\\-.0-9A-Za-z]*(:%[0-9A-Fa-f]{2}|:[!$&-.0-;=?-Z_a-z~]|[/?])|\\?)(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|([A-Za-z][+\\-.0-9A-Za-z]*:)?\\/((%[0-9A-Fa-f]{2}|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?[/?]|[!$&-.0-;=?-Z_a-z~])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~])*|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~])+(:\\d*)?|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?:\\d*|\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~]+)?|[.0-:A-Fa-f]+)\\])?)?|[A-Za-z][+\\-.0-9A-Za-z]*:?)?$/,\n 'iri': /^[a-zA-Z][a-zA-Z0-9+.-]*:[^\\s]*$/,\n 'iri-reference': /^(((([A-Za-z][+\\-.0-9A-Za-z]*(:%[0-9A-Fa-f]{2}|:[!$&-.0-;=?-Z_a-z~-\\u{10FFFF}]|[/?])|\\?)(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*|([A-Za-z][+\\-.0-9A-Za-z]*:?)?)|([A-Za-z][+\\-.0-9A-Za-z]*:)?\\/((%[0-9A-Fa-f]{2}|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~-\\u{10FFFF}])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~-\\u{10FFFF}]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?[/?]|[!$&-.0-;=?-Z_a-z~-\\u{10FFFF}])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*|(\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~-\\u{10FFFF}])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~-\\u{10FFFF}]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?)?))#(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*|(([A-Za-z][+\\-.0-9A-Za-z]*)?%[0-9A-Fa-f]{2}|[!$&-.0-9;=@_~-\\u{10FFFF}]|[A-Za-z][+\\-.0-9A-Za-z]*[!$&-*,;=@_~-\\u{10FFFF}])(%[0-9A-Fa-f]{2}|[!$&-.0-9;=@-Z_a-z~-\\u{10FFFF}])*((([/?](%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*)?#|[/?])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*)?|([A-Za-z][+\\-.0-9A-Za-z]*(:%[0-9A-Fa-f]{2}|:[!$&-.0-;=?-Z_a-z~-\\u{10FFFF}]|[/?])|\\?)(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*|([A-Za-z][+\\-.0-9A-Za-z]*:)?\\/((%[0-9A-Fa-f]{2}|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~-\\u{10FFFF}])+|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~-\\u{10FFFF}]+)?|[.0-:A-Fa-f]+)\\])?)(:\\d*)?[/?]|[!$&-.0-;=?-Z_a-z~-\\u{10FFFF}])(%[0-9A-Fa-f]{2}|[!$&-;=?-Z_a-z~-\\u{10FFFF}])*|\\/((%[0-9A-Fa-f]{2}|[!$&-.0-9;=A-Z_a-z~-\\u{10FFFF}])+(:\\d*)?|(\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~-\\u{10FFFF}]+)?|[.0-:A-Fa-f]+)\\])?:\\d*|\\[(([Vv][0-9A-Fa-f]+\\.[!$&-.0-;=A-Z_a-z~-\\u{10FFFF}]+)?|[.0-:A-Fa-f]+)\\])?)?|[A-Za-z][+\\-.0-9A-Za-z]*:?)?$/u,\n 'uuid': /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i,\n\n // 7.3.6. uri-template\n 'uri-template': /(%[0-9a-f]{2}|[!#$&(-;=?@\\[\\]_a-z~]|\\{[!#&+,./;=?@|]?(%[0-9a-f]{2}|[0-9_a-z])(\\.?(%[0-9a-f]{2}|[0-9_a-z]))*(:[1-9]\\d{0,3}|\\*)?(,(%[0-9a-f]{2}|[0-9_a-z])(\\.?(%[0-9a-f]{2}|[0-9_a-z]))*(:[1-9]\\d{0,3}|\\*)?)*\\})*/iu,\n\n // 7.3.7. JSON Pointers\n 'json-pointer': /^(\\/([\\x00-\\x2e0-@\\[-}\\x7f]|~[01])*)*$/iu,\n 'relative-json-pointer': /^\\d+(#|(\\/([\\x00-\\x2e0-@\\[-}\\x7f]|~[01])*)*)$/iu,\n\n // hostname regex from: http://stackoverflow.com/a/1420225/5628\n 'hostname': /^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?$/,\n 'host-name': /^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\\.?$/,\n\n 'utc-millisec': function (input) {\n return (typeof input === 'string') && parseFloat(input) === parseInt(input, 10) && !isNaN(input);\n },\n\n // 7.3.8. regex\n 'regex': function (input) {\n var result = true;\n try {\n new RegExp(input);\n } catch (e) {\n result = false;\n }\n return result;\n },\n\n // Other definitions\n // \"style\" was removed from JSON Schema in draft-4 and is deprecated\n 'style': /[\\r\\n\\t ]*[^\\r\\n\\t ][^:]*:[\\r\\n\\t ]*[^\\r\\n\\t ;]*[\\r\\n\\t ]*;?/,\n // \"color\" was removed from JSON Schema in draft-4 and is deprecated\n 'color': /^(#?([0-9A-Fa-f]{3}){1,2}\\b|aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow|(rgb\\(\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*,\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*,\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*\\))|(rgb\\(\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*\\)))$/,\n 'phone': /^\\+(?:[0-9] ?){6,14}[0-9]$/,\n 'alpha': /^[a-zA-Z]+$/,\n 'alphanumeric': /^[a-zA-Z0-9]+$/,\n};\n\nFORMAT_REGEXPS.regexp = FORMAT_REGEXPS.regex;\nFORMAT_REGEXPS.pattern = FORMAT_REGEXPS.regex;\nFORMAT_REGEXPS.ipv4 = FORMAT_REGEXPS['ip-address'];\n\nexports.isFormat = function isFormat (input, format, validator) {\n if (typeof input === 'string' && FORMAT_REGEXPS[format] !== undefined) {\n if (FORMAT_REGEXPS[format] instanceof RegExp) {\n return FORMAT_REGEXPS[format].test(input);\n }\n if (typeof FORMAT_REGEXPS[format] === 'function') {\n return FORMAT_REGEXPS[format](input);\n }\n } else if (validator && validator.customFormats &&\n typeof validator.customFormats[format] === 'function') {\n return validator.customFormats[format](input);\n }\n return true;\n};\n\nvar makeSuffix = exports.makeSuffix = function makeSuffix (key) {\n key = key.toString();\n // This function could be capable of outputting valid a ECMAScript string, but the\n // resulting code for testing which form to use would be tens of thousands of characters long\n // That means this will use the name form for some illegal forms\n if (!key.match(/[.\\s\\[\\]]/) && !key.match(/^[\\d]/)) {\n return '.' + key;\n }\n if (key.match(/^\\d+$/)) {\n return '[' + key + ']';\n }\n return '[' + JSON.stringify(key) + ']';\n};\n\nexports.deepCompareStrict = function deepCompareStrict (a, b) {\n if (typeof a !== typeof b) {\n return false;\n }\n if (Array.isArray(a)) {\n if (!Array.isArray(b)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n return a.every(function (v, i) {\n return deepCompareStrict(a[i], b[i]);\n });\n }\n if (typeof a === 'object') {\n if (!a || !b) {\n return a === b;\n }\n var aKeys = Object.keys(a);\n var bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every(function (v) {\n return deepCompareStrict(a[v], b[v]);\n });\n }\n return a === b;\n};\n\nfunction deepMerger (target, dst, e, i) {\n if (typeof e === 'object') {\n dst[i] = deepMerge(target[i], e);\n } else {\n if (target.indexOf(e) === -1) {\n dst.push(e);\n }\n }\n}\n\nfunction copyist (src, dst, key) {\n dst[key] = src[key];\n}\n\nfunction copyistWithDeepMerge (target, src, dst, key) {\n if (typeof src[key] !== 'object' || !src[key]) {\n dst[key] = src[key];\n }\n else {\n if (!target[key]) {\n dst[key] = src[key];\n } else {\n dst[key] = deepMerge(target[key], src[key]);\n }\n }\n}\n\nfunction deepMerge (target, src) {\n var array = Array.isArray(src);\n var dst = array && [] || {};\n\n if (array) {\n target = target || [];\n dst = dst.concat(target);\n src.forEach(deepMerger.bind(null, target, dst));\n } else {\n if (target && typeof target === 'object') {\n Object.keys(target).forEach(copyist.bind(null, target, dst));\n }\n Object.keys(src).forEach(copyistWithDeepMerge.bind(null, target, src, dst));\n }\n\n return dst;\n}\n\nmodule.exports.deepMerge = deepMerge;\n\n/**\n * Validates instance against the provided schema\n * Implements URI+JSON Pointer encoding, e.g. \"%7e\"=\"~0\"=>\"~\", \"~1\"=\"%2f\"=>\"/\"\n * @param o\n * @param s The path to walk o along\n * @return any\n */\nexports.objectGetPath = function objectGetPath(o, s) {\n var parts = s.split('/').slice(1);\n var k;\n while (typeof (k=parts.shift()) == 'string') {\n var n = decodeURIComponent(k.replace(/~0/,'~').replace(/~1/g,'/'));\n if (!(n in o)) return;\n o = o[n];\n }\n return o;\n};\n\nfunction pathEncoder (v) {\n return '/'+encodeURIComponent(v).replace(/~/g,'%7E');\n}\n/**\n * Accept an Array of property names and return a JSON Pointer URI fragment\n * @param Array a\n * @return {String}\n */\nexports.encodePath = function encodePointer(a){\n // ~ must be encoded explicitly because hacks\n // the slash is encoded by encodeURIComponent\n return a.map(pathEncoder).join('');\n};\n\n\n/**\n * Calculate the number of decimal places a number uses\n * We need this to get correct results out of multipleOf and divisibleBy\n * when either figure is has decimal places, due to IEEE-754 float issues.\n * @param number\n * @returns {number}\n */\nexports.getDecimalPlaces = function getDecimalPlaces(number) {\n\n var decimalPlaces = 0;\n if (isNaN(number)) return decimalPlaces;\n\n if (typeof number !== 'number') {\n number = Number(number);\n }\n\n var parts = number.toString().split('e');\n if (parts.length === 2) {\n if (parts[1][0] !== '-') {\n return decimalPlaces;\n } else {\n decimalPlaces = Number(parts[1].slice(1));\n }\n }\n\n var decimalParts = parts[0].split('.');\n if (decimalParts.length === 2) {\n decimalPlaces += decimalParts[1].length;\n }\n\n return decimalPlaces;\n};\n\nexports.isSchema = function isSchema(val){\n return (typeof val === 'object' && val) || (typeof val === 'boolean');\n};\n\n","'use strict';\n\nvar Validator = module.exports.Validator = require('./validator');\n\nmodule.exports.ValidatorResult = require('./helpers').ValidatorResult;\nmodule.exports.ValidatorResultError = require('./helpers').ValidatorResultError;\nmodule.exports.ValidationError = require('./helpers').ValidationError;\nmodule.exports.SchemaError = require('./helpers').SchemaError;\nmodule.exports.SchemaScanResult = require('./scan').SchemaScanResult;\nmodule.exports.scan = require('./scan').scan;\n\nmodule.exports.validate = function (instance, schema, options) {\n var v = new Validator();\n return v.validate(instance, schema, options);\n};\n","\"use strict\";\n\nvar urilib = require('url');\nvar helpers = require('./helpers');\n\nmodule.exports.SchemaScanResult = SchemaScanResult;\nfunction SchemaScanResult(found, ref){\n this.id = found;\n this.ref = ref;\n}\n\n/**\n * Adds a schema with a certain urn to the Validator instance.\n * @param string uri\n * @param object schema\n * @return {Object}\n */\nmodule.exports.scan = function scan(base, schema){\n function scanSchema(baseuri, schema){\n if(!schema || typeof schema!='object') return;\n // Mark all referenced schemas so we can tell later which schemas are referred to, but never defined\n if(schema.$ref){\n var resolvedUri = urilib.resolve(baseuri, schema.$ref);\n ref[resolvedUri] = ref[resolvedUri] ? ref[resolvedUri]+1 : 0;\n return;\n }\n var id = schema.$id || schema.id;\n var ourBase = id ? urilib.resolve(baseuri, id) : baseuri;\n if (ourBase) {\n // If there's no fragment, append an empty one\n if(ourBase.indexOf('#')<0) ourBase += '#';\n if(found[ourBase]){\n if(!helpers.deepCompareStrict(found[ourBase], schema)){\n throw new Error('Schema <'+ourBase+'> already exists with different definition');\n }\n return found[ourBase];\n }\n found[ourBase] = schema;\n // strip trailing fragment\n if(ourBase[ourBase.length-1]=='#'){\n found[ourBase.substring(0, ourBase.length-1)] = schema;\n }\n }\n scanArray(ourBase+'/items', (Array.isArray(schema.items)?schema.items:[schema.items]));\n scanArray(ourBase+'/extends', (Array.isArray(schema.extends)?schema.extends:[schema.extends]));\n scanSchema(ourBase+'/additionalItems', schema.additionalItems);\n scanObject(ourBase+'/properties', schema.properties);\n scanSchema(ourBase+'/additionalProperties', schema.additionalProperties);\n scanObject(ourBase+'/definitions', schema.definitions);\n scanObject(ourBase+'/patternProperties', schema.patternProperties);\n scanObject(ourBase+'/dependencies', schema.dependencies);\n scanArray(ourBase+'/disallow', schema.disallow);\n scanArray(ourBase+'/allOf', schema.allOf);\n scanArray(ourBase+'/anyOf', schema.anyOf);\n scanArray(ourBase+'/oneOf', schema.oneOf);\n scanSchema(ourBase+'/not', schema.not);\n }\n function scanArray(baseuri, schemas){\n if(!Array.isArray(schemas)) return;\n for(var i=0; i\", schema);\n }\n var subschema = helpers.objectGetPath(ctx.schemas[document], fragment.substr(1));\n if(subschema===undefined){\n throw new SchemaError(\"no such schema \" + fragment + \" located in <\" + document + \">\", schema);\n }\n return {subschema: subschema, switchSchema: switchSchema};\n};\n\n/**\n * Tests whether the instance if of a certain type.\n * @private\n * @param instance\n * @param schema\n * @param options\n * @param ctx\n * @param type\n * @return {boolean}\n */\nValidator.prototype.testType = function validateType (instance, schema, options, ctx, type) {\n if(type===undefined){\n return;\n }else if(type===null){\n throw new SchemaError('Unexpected null in \"type\" keyword');\n }\n if (typeof this.types[type] == 'function') {\n return this.types[type].call(this, instance);\n }\n if (type && typeof type == 'object') {\n var res = this.validateSchema(instance, type, options, ctx);\n return res === undefined || !(res && res.errors.length);\n }\n // Undefined or properties not on the list are acceptable, same as not being defined\n return true;\n};\n\nvar types = Validator.prototype.types = {};\ntypes.string = function testString (instance) {\n return typeof instance == 'string';\n};\ntypes.number = function testNumber (instance) {\n // isFinite returns false for NaN, Infinity, and -Infinity\n return typeof instance == 'number' && isFinite(instance);\n};\ntypes.integer = function testInteger (instance) {\n return (typeof instance == 'number') && instance % 1 === 0;\n};\ntypes.boolean = function testBoolean (instance) {\n return typeof instance == 'boolean';\n};\ntypes.array = function testArray (instance) {\n return Array.isArray(instance);\n};\ntypes['null'] = function testNull (instance) {\n return instance === null;\n};\ntypes.date = function testDate (instance) {\n return instance instanceof Date;\n};\ntypes.any = function testAny (instance) {\n return true;\n};\ntypes.object = function testObject (instance) {\n // TODO: fix this - see #15\n return instance && (typeof instance === 'object') && !(Array.isArray(instance)) && !(instance instanceof Date);\n};\n\nmodule.exports = Validator;\n","'use strict'\n\n// A linked list to keep track of recently-used-ness\nconst Yallist = require('yallist')\n\nconst MAX = Symbol('max')\nconst LENGTH = Symbol('length')\nconst LENGTH_CALCULATOR = Symbol('lengthCalculator')\nconst ALLOW_STALE = Symbol('allowStale')\nconst MAX_AGE = Symbol('maxAge')\nconst DISPOSE = Symbol('dispose')\nconst NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet')\nconst LRU_LIST = Symbol('lruList')\nconst CACHE = Symbol('cache')\nconst UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet')\n\nconst naiveLength = () => 1\n\n// lruList is a yallist where the head is the youngest\n// item, and the tail is the oldest. the list contains the Hit\n// objects as the entries.\n// Each Hit object has a reference to its Yallist.Node. This\n// never changes.\n//\n// cache is a Map (or PseudoMap) that matches the keys to\n// the Yallist.Node object.\nclass LRUCache {\n constructor (options) {\n if (typeof options === 'number')\n options = { max: options }\n\n if (!options)\n options = {}\n\n if (options.max && (typeof options.max !== 'number' || options.max < 0))\n throw new TypeError('max must be a non-negative number')\n // Kind of weird to have a default max of Infinity, but oh well.\n const max = this[MAX] = options.max || Infinity\n\n const lc = options.length || naiveLength\n this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc\n this[ALLOW_STALE] = options.stale || false\n if (options.maxAge && typeof options.maxAge !== 'number')\n throw new TypeError('maxAge must be a number')\n this[MAX_AGE] = options.maxAge || 0\n this[DISPOSE] = options.dispose\n this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false\n this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false\n this.reset()\n }\n\n // resize the cache when the max changes.\n set max (mL) {\n if (typeof mL !== 'number' || mL < 0)\n throw new TypeError('max must be a non-negative number')\n\n this[MAX] = mL || Infinity\n trim(this)\n }\n get max () {\n return this[MAX]\n }\n\n set allowStale (allowStale) {\n this[ALLOW_STALE] = !!allowStale\n }\n get allowStale () {\n return this[ALLOW_STALE]\n }\n\n set maxAge (mA) {\n if (typeof mA !== 'number')\n throw new TypeError('maxAge must be a non-negative number')\n\n this[MAX_AGE] = mA\n trim(this)\n }\n get maxAge () {\n return this[MAX_AGE]\n }\n\n // resize the cache when the lengthCalculator changes.\n set lengthCalculator (lC) {\n if (typeof lC !== 'function')\n lC = naiveLength\n\n if (lC !== this[LENGTH_CALCULATOR]) {\n this[LENGTH_CALCULATOR] = lC\n this[LENGTH] = 0\n this[LRU_LIST].forEach(hit => {\n hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key)\n this[LENGTH] += hit.length\n })\n }\n trim(this)\n }\n get lengthCalculator () { return this[LENGTH_CALCULATOR] }\n\n get length () { return this[LENGTH] }\n get itemCount () { return this[LRU_LIST].length }\n\n rforEach (fn, thisp) {\n thisp = thisp || this\n for (let walker = this[LRU_LIST].tail; walker !== null;) {\n const prev = walker.prev\n forEachStep(this, fn, walker, thisp)\n walker = prev\n }\n }\n\n forEach (fn, thisp) {\n thisp = thisp || this\n for (let walker = this[LRU_LIST].head; walker !== null;) {\n const next = walker.next\n forEachStep(this, fn, walker, thisp)\n walker = next\n }\n }\n\n keys () {\n return this[LRU_LIST].toArray().map(k => k.key)\n }\n\n values () {\n return this[LRU_LIST].toArray().map(k => k.value)\n }\n\n reset () {\n if (this[DISPOSE] &&\n this[LRU_LIST] &&\n this[LRU_LIST].length) {\n this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value))\n }\n\n this[CACHE] = new Map() // hash of items by key\n this[LRU_LIST] = new Yallist() // list of items in order of use recency\n this[LENGTH] = 0 // length of items in the list\n }\n\n dump () {\n return this[LRU_LIST].map(hit =>\n isStale(this, hit) ? false : {\n k: hit.key,\n v: hit.value,\n e: hit.now + (hit.maxAge || 0)\n }).toArray().filter(h => h)\n }\n\n dumpLru () {\n return this[LRU_LIST]\n }\n\n set (key, value, maxAge) {\n maxAge = maxAge || this[MAX_AGE]\n\n if (maxAge && typeof maxAge !== 'number')\n throw new TypeError('maxAge must be a number')\n\n const now = maxAge ? Date.now() : 0\n const len = this[LENGTH_CALCULATOR](value, key)\n\n if (this[CACHE].has(key)) {\n if (len > this[MAX]) {\n del(this, this[CACHE].get(key))\n return false\n }\n\n const node = this[CACHE].get(key)\n const item = node.value\n\n // dispose of the old one before overwriting\n // split out into 2 ifs for better coverage tracking\n if (this[DISPOSE]) {\n if (!this[NO_DISPOSE_ON_SET])\n this[DISPOSE](key, item.value)\n }\n\n item.now = now\n item.maxAge = maxAge\n item.value = value\n this[LENGTH] += len - item.length\n item.length = len\n this.get(key)\n trim(this)\n return true\n }\n\n const hit = new Entry(key, value, len, now, maxAge)\n\n // oversized objects fall out of cache automatically.\n if (hit.length > this[MAX]) {\n if (this[DISPOSE])\n this[DISPOSE](key, value)\n\n return false\n }\n\n this[LENGTH] += hit.length\n this[LRU_LIST].unshift(hit)\n this[CACHE].set(key, this[LRU_LIST].head)\n trim(this)\n return true\n }\n\n has (key) {\n if (!this[CACHE].has(key)) return false\n const hit = this[CACHE].get(key).value\n return !isStale(this, hit)\n }\n\n get (key) {\n return get(this, key, true)\n }\n\n peek (key) {\n return get(this, key, false)\n }\n\n pop () {\n const node = this[LRU_LIST].tail\n if (!node)\n return null\n\n del(this, node)\n return node.value\n }\n\n del (key) {\n del(this, this[CACHE].get(key))\n }\n\n load (arr) {\n // reset the cache\n this.reset()\n\n const now = Date.now()\n // A previous serialized cache has the most recent items first\n for (let l = arr.length - 1; l >= 0; l--) {\n const hit = arr[l]\n const expiresAt = hit.e || 0\n if (expiresAt === 0)\n // the item was created without expiration in a non aged cache\n this.set(hit.k, hit.v)\n else {\n const maxAge = expiresAt - now\n // dont add already expired items\n if (maxAge > 0) {\n this.set(hit.k, hit.v, maxAge)\n }\n }\n }\n }\n\n prune () {\n this[CACHE].forEach((value, key) => get(this, key, false))\n }\n}\n\nconst get = (self, key, doUse) => {\n const node = self[CACHE].get(key)\n if (node) {\n const hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!self[ALLOW_STALE])\n return undefined\n } else {\n if (doUse) {\n if (self[UPDATE_AGE_ON_GET])\n node.value.now = Date.now()\n self[LRU_LIST].unshiftNode(node)\n }\n }\n return hit.value\n }\n}\n\nconst isStale = (self, hit) => {\n if (!hit || (!hit.maxAge && !self[MAX_AGE]))\n return false\n\n const diff = Date.now() - hit.now\n return hit.maxAge ? diff > hit.maxAge\n : self[MAX_AGE] && (diff > self[MAX_AGE])\n}\n\nconst trim = self => {\n if (self[LENGTH] > self[MAX]) {\n for (let walker = self[LRU_LIST].tail;\n self[LENGTH] > self[MAX] && walker !== null;) {\n // We know that we're about to delete this one, and also\n // what the next least recently used key will be, so just\n // go ahead and set it now.\n const prev = walker.prev\n del(self, walker)\n walker = prev\n }\n }\n}\n\nconst del = (self, node) => {\n if (node) {\n const hit = node.value\n if (self[DISPOSE])\n self[DISPOSE](hit.key, hit.value)\n\n self[LENGTH] -= hit.length\n self[CACHE].delete(hit.key)\n self[LRU_LIST].removeNode(node)\n }\n}\n\nclass Entry {\n constructor (key, value, length, now, maxAge) {\n this.key = key\n this.value = value\n this.length = length\n this.now = now\n this.maxAge = maxAge || 0\n }\n}\n\nconst forEachStep = (self, fn, node, thisp) => {\n let hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!self[ALLOW_STALE])\n hit = undefined\n }\n if (hit)\n fn.call(thisp, hit.value, hit.key, self)\n}\n\nmodule.exports = LRUCache\n","const ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.format()\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range\n .trim()\n .split(/\\s+/)\n .join(' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.format()\n }\n\n format () {\n this.range = this.set\n .map((comps) => comps.join(' ').trim())\n .join('||')\n .trim()\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('lru-cache')\nconst cache = new LRU({ max: 1000 })\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr, tb) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","const debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","const parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","const eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","const SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n let next\n while ((next = re[t.COERCERTL].exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n re[t.COERCERTL].lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options)\n}\nmodule.exports = coerce\n","const SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","const compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","const SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","const parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // Otherwise it can be determined by checking the high version\n\n if (highVersion.patch) {\n // anything higher than a patch bump would result in the wrong version\n return 'patch'\n }\n\n if (highVersion.minor) {\n // anything higher than a minor bump would result in the wrong version\n return 'minor'\n }\n\n // bumping major/minor/patch all have same result\n return 'major'\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","const compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","const compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","const compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","const SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","const compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","const compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","const SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","const SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","const compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","const SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","const SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","const parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","const compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","const compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","const Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","const compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","const parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","const debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","const numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","const {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCE', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","const Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","const outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","const SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","const Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","const Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","const Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\nmodule.exports = function (Yallist) {\n Yallist.prototype[Symbol.iterator] = function* () {\n for (let walker = this.head; walker; walker = walker.next) {\n yield walker.value\n }\n }\n}\n","'use strict'\nmodule.exports = Yallist\n\nYallist.Node = Node\nYallist.create = Yallist\n\nfunction Yallist (list) {\n var self = this\n if (!(self instanceof Yallist)) {\n self = new Yallist()\n }\n\n self.tail = null\n self.head = null\n self.length = 0\n\n if (list && typeof list.forEach === 'function') {\n list.forEach(function (item) {\n self.push(item)\n })\n } else if (arguments.length > 0) {\n for (var i = 0, l = arguments.length; i < l; i++) {\n self.push(arguments[i])\n }\n }\n\n return self\n}\n\nYallist.prototype.removeNode = function (node) {\n if (node.list !== this) {\n throw new Error('removing node which does not belong to this list')\n }\n\n var next = node.next\n var prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n node.list.length--\n node.next = null\n node.prev = null\n node.list = null\n\n return next\n}\n\nYallist.prototype.unshiftNode = function (node) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length++\n}\n\nYallist.prototype.pushNode = function (node) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length++\n}\n\nYallist.prototype.push = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n push(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.unshift = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n unshift(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.pop = function () {\n if (!this.tail) {\n return undefined\n }\n\n var res = this.tail.value\n this.tail = this.tail.prev\n if (this.tail) {\n this.tail.next = null\n } else {\n this.head = null\n }\n this.length--\n return res\n}\n\nYallist.prototype.shift = function () {\n if (!this.head) {\n return undefined\n }\n\n var res = this.head.value\n this.head = this.head.next\n if (this.head) {\n this.head.prev = null\n } else {\n this.tail = null\n }\n this.length--\n return res\n}\n\nYallist.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.head, i = 0; walker !== null; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n}\n\nYallist.prototype.forEachReverse = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n}\n\nYallist.prototype.get = function (n) {\n for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.next\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.getReverse = function (n) {\n for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.map = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.head; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n}\n\nYallist.prototype.mapReverse = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.tail; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n}\n\nYallist.prototype.reduce = function (fn, initial) {\n var acc\n var walker = this.head\n if (arguments.length > 1) {\n acc = initial\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = 0; walker !== null; i++) {\n acc = fn(acc, walker.value, i)\n walker = walker.next\n }\n\n return acc\n}\n\nYallist.prototype.reduceReverse = function (fn, initial) {\n var acc\n var walker = this.tail\n if (arguments.length > 1) {\n acc = initial\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = this.length - 1; walker !== null; i--) {\n acc = fn(acc, walker.value, i)\n walker = walker.prev\n }\n\n return acc\n}\n\nYallist.prototype.toArray = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.head; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n}\n\nYallist.prototype.toArrayReverse = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.tail; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n}\n\nYallist.prototype.slice = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n walker = walker.next\n }\n for (; walker !== null && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.sliceReverse = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n walker = walker.prev\n }\n for (; walker !== null && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.splice = function (start, deleteCount, ...nodes) {\n if (start > this.length) {\n start = this.length - 1\n }\n if (start < 0) {\n start = this.length + start;\n }\n\n for (var i = 0, walker = this.head; walker !== null && i < start; i++) {\n walker = walker.next\n }\n\n var ret = []\n for (var i = 0; walker && i < deleteCount; i++) {\n ret.push(walker.value)\n walker = this.removeNode(walker)\n }\n if (walker === null) {\n walker = this.tail\n }\n\n if (walker !== this.head && walker !== this.tail) {\n walker = walker.prev\n }\n\n for (var i = 0; i < nodes.length; i++) {\n walker = insert(this, walker, nodes[i])\n }\n return ret;\n}\n\nYallist.prototype.reverse = function () {\n var head = this.head\n var tail = this.tail\n for (var walker = head; walker !== null; walker = walker.prev) {\n var p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n}\n\nfunction insert (self, node, value) {\n var inserted = node === self.head ?\n new Node(value, null, node, self) :\n new Node(value, node, node.next, self)\n\n if (inserted.next === null) {\n self.tail = inserted\n }\n if (inserted.prev === null) {\n self.head = inserted\n }\n\n self.length++\n\n return inserted\n}\n\nfunction push (self, item) {\n self.tail = new Node(item, self.tail, null, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length++\n}\n\nfunction unshift (self, item) {\n self.head = new Node(item, null, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length++\n}\n\nfunction Node (value, prev, next, list) {\n if (!(this instanceof Node)) {\n return new Node(value, prev, next, list)\n }\n\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = null\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = null\n }\n}\n\ntry {\n // add if support for Symbol.iterator is present\n require('./iterator.js')(Yallist)\n} catch (er) {}\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.diffResource = exports.diffTemplate = void 0;\nconst impl = require(\"./diff\");\nconst types = require(\"./diff/types\");\nconst util_1 = require(\"./diff/util\");\n__exportStar(require(\"./diff/types\"), exports);\nconst DIFF_HANDLERS = {\n AWSTemplateFormatVersion: (diff, oldValue, newValue) => diff.awsTemplateFormatVersion = impl.diffAttribute(oldValue, newValue),\n Description: (diff, oldValue, newValue) => diff.description = impl.diffAttribute(oldValue, newValue),\n Metadata: (diff, oldValue, newValue) => diff.metadata = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffMetadata)),\n Parameters: (diff, oldValue, newValue) => diff.parameters = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffParameter)),\n Mappings: (diff, oldValue, newValue) => diff.mappings = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffMapping)),\n Conditions: (diff, oldValue, newValue) => diff.conditions = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffCondition)),\n Transform: (diff, oldValue, newValue) => diff.transform = impl.diffAttribute(oldValue, newValue),\n Resources: (diff, oldValue, newValue) => diff.resources = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffResource)),\n Outputs: (diff, oldValue, newValue) => diff.outputs = new types.DifferenceCollection((0, util_1.diffKeyedEntities)(oldValue, newValue, impl.diffOutput)),\n};\n/**\n * Compare two CloudFormation templates and return semantic differences between them.\n *\n * @param currentTemplate the current state of the stack.\n * @param newTemplate the target state of the stack.\n *\n * @returns a +types.TemplateDiff+ object that represents the changes that will happen if\n * a stack which current state is described by +currentTemplate+ is updated with\n * the template +newTemplate+.\n */\nfunction diffTemplate(currentTemplate, newTemplate) {\n // Base diff\n const theDiff = calculateTemplateDiff(currentTemplate, newTemplate);\n // We're going to modify this in-place\n const newTemplateCopy = deepCopy(newTemplate);\n let didPropagateReferenceChanges;\n let diffWithReplacements;\n do {\n diffWithReplacements = calculateTemplateDiff(currentTemplate, newTemplateCopy);\n // Propagate replacements for replaced resources\n didPropagateReferenceChanges = false;\n if (diffWithReplacements.resources) {\n diffWithReplacements.resources.forEachDifference((logicalId, change) => {\n if (change.changeImpact === types.ResourceImpact.WILL_REPLACE) {\n if (propagateReplacedReferences(newTemplateCopy, logicalId)) {\n didPropagateReferenceChanges = true;\n }\n }\n });\n }\n } while (didPropagateReferenceChanges);\n // Copy \"replaced\" states from `diffWithReplacements` to `theDiff`.\n diffWithReplacements.resources\n .filter(r => isReplacement(r.changeImpact))\n .forEachDifference((logicalId, downstreamReplacement) => {\n const resource = theDiff.resources.get(logicalId);\n if (resource.changeImpact !== downstreamReplacement.changeImpact) {\n propagatePropertyReplacement(downstreamReplacement, resource);\n }\n });\n return theDiff;\n}\nexports.diffTemplate = diffTemplate;\nfunction isReplacement(impact) {\n return impact === types.ResourceImpact.MAY_REPLACE || impact === types.ResourceImpact.WILL_REPLACE;\n}\n/**\n * For all properties in 'source' that have a \"replacement\" impact, propagate that impact to \"dest\"\n */\nfunction propagatePropertyReplacement(source, dest) {\n for (const [propertyName, diff] of Object.entries(source.propertyUpdates)) {\n if (diff.changeImpact && isReplacement(diff.changeImpact)) {\n // Use the propertydiff of source in target. The result of this happens to be clear enough.\n dest.setPropertyChange(propertyName, diff);\n }\n }\n}\nfunction calculateTemplateDiff(currentTemplate, newTemplate) {\n const differences = {};\n const unknown = {};\n for (const key of (0, util_1.unionOf)(Object.keys(currentTemplate), Object.keys(newTemplate)).sort()) {\n const oldValue = currentTemplate[key];\n const newValue = newTemplate[key];\n if ((0, util_1.deepEqual)(oldValue, newValue)) {\n continue;\n }\n const handler = DIFF_HANDLERS[key]\n || ((_diff, oldV, newV) => unknown[key] = impl.diffUnknown(oldV, newV));\n handler(differences, oldValue, newValue);\n }\n if (Object.keys(unknown).length > 0) {\n differences.unknown = new types.DifferenceCollection(unknown);\n }\n return new types.TemplateDiff(differences);\n}\n/**\n * Compare two CloudFormation resources and return semantic differences between them\n */\nfunction diffResource(oldValue, newValue) {\n return impl.diffResource(oldValue, newValue);\n}\nexports.diffResource = diffResource;\n/**\n * Replace all references to the given logicalID on the given template, in-place\n *\n * Returns true iff any references were replaced.\n */\nfunction propagateReplacedReferences(template, logicalId) {\n let ret = false;\n function recurse(obj) {\n if (Array.isArray(obj)) {\n obj.forEach(recurse);\n }\n if (typeof obj === 'object' && obj !== null) {\n if (!replaceReference(obj)) {\n Object.values(obj).forEach(recurse);\n }\n }\n }\n function replaceReference(obj) {\n const keys = Object.keys(obj);\n if (keys.length !== 1) {\n return false;\n }\n const key = keys[0];\n if (key === 'Ref') {\n if (obj.Ref === logicalId) {\n obj.Ref = logicalId + ' (replaced)';\n ret = true;\n }\n return true;\n }\n if (key.startsWith('Fn::')) {\n if (Array.isArray(obj[key]) && obj[key].length > 0 && obj[key][0] === logicalId) {\n obj[key][0] = logicalId + '(replaced)';\n ret = true;\n }\n return true;\n }\n return false;\n }\n recurse(template);\n return ret;\n}\nfunction deepCopy(x) {\n if (Array.isArray(x)) {\n return x.map(deepCopy);\n }\n if (typeof x === 'object' && x !== null) {\n const ret = {};\n for (const key of Object.keys(x)) {\n ret[key] = deepCopy(x[key]);\n }\n return ret;\n }\n return x;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi10ZW1wbGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRpZmYtdGVtcGxhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0Isc0NBQXNDO0FBQ3RDLHNDQUFvRTtBQUVwRSwrQ0FBNkI7QUFLN0IsTUFBTSxhQUFhLEdBQW9CO0lBQ3JDLHdCQUF3QixFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUNyRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0lBQ3hFLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7SUFDM0QsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUEsd0JBQWlCLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUcsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUEsd0JBQWlCLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0csUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUEsd0JBQWlCLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekcsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUEsd0JBQWlCLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0csU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUN6RCxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBQSx3QkFBaUIsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzRyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBQSx3QkFBaUIsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztDQUN4RyxDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLGVBQXVDLEVBQUUsV0FBbUM7SUFDdkcsWUFBWTtJQUNaLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVwRSxzQ0FBc0M7SUFDdEMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTlDLElBQUksNEJBQTRCLENBQUM7SUFDakMsSUFBSSxvQkFBb0IsQ0FBQztJQUN6QixHQUFHO1FBQ0Qsb0JBQW9CLEdBQUcscUJBQXFCLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRS9FLGdEQUFnRDtRQUNoRCw0QkFBNEIsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLEVBQUU7WUFDbEMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyRSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUU7b0JBQzdELElBQUksMkJBQTJCLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxFQUFFO3dCQUMzRCw0QkFBNEIsR0FBRyxJQUFJLENBQUM7cUJBQ3JDO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtLQUNGLFFBQVEsNEJBQTRCLEVBQUU7SUFFdkMsbUVBQW1FO0lBQ25FLG9CQUFvQixDQUFDLFNBQVM7U0FDM0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMzQyxpQkFBaUIsQ0FBQyxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxFQUFFO1FBQ3RELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxELElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUU7WUFDaEUsNEJBQTRCLENBQUMscUJBQXFCLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDL0Q7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFyQ0Qsb0NBcUNDO0FBRUQsU0FBUyxhQUFhLENBQUMsTUFBNEI7SUFDakQsT0FBTyxNQUFNLEtBQUssS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFXLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO0FBQ3JHLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsNEJBQTRCLENBQUMsTUFBZ0MsRUFBRSxJQUE4QjtJQUNwRyxLQUFLLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDekUsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDekQsMkZBQTJGO1lBQzNGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDNUM7S0FDRjtBQUNILENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLGVBQXVDLEVBQUUsV0FBbUM7SUFDekcsTUFBTSxXQUFXLEdBQXdCLEVBQUUsQ0FBQztJQUM1QyxNQUFNLE9BQU8sR0FBNkMsRUFBRSxDQUFDO0lBQzdELEtBQUssTUFBTSxHQUFHLElBQUksSUFBQSxjQUFPLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDeEYsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLElBQUEsZ0JBQVMsRUFBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDakMsU0FBUztTQUNWO1FBQ0QsTUFBTSxPQUFPLEdBQWdCLGFBQWEsQ0FBQyxHQUFHLENBQUM7ZUFDOUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RixPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztLQUUxQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ25DLFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDL0Q7SUFFRCxPQUFPLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixZQUFZLENBQUMsUUFBd0IsRUFBRSxRQUF3QjtJQUM3RSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFGRCxvQ0FFQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLDJCQUEyQixDQUFDLFFBQWdCLEVBQUUsU0FBaUI7SUFDdEUsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBRWhCLFNBQVMsT0FBTyxDQUFDLEdBQVE7UUFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEI7UUFFRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDckM7U0FDRjtJQUNILENBQUM7SUFFRCxTQUFTLGdCQUFnQixDQUFDLEdBQVE7UUFDaEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7U0FBRTtRQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEIsSUFBSSxHQUFHLEtBQUssS0FBSyxFQUFFO1lBQ2pCLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUU7Z0JBQ3pCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLGFBQWEsQ0FBQztnQkFDcEMsR0FBRyxHQUFHLElBQUksQ0FBQzthQUNaO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMxQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDL0UsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxZQUFZLENBQUM7Z0JBQ3ZDLEdBQUcsR0FBRyxJQUFJLENBQUM7YUFDWjtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBTTtJQUN0QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDcEIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3hCO0lBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN2QyxNQUFNLEdBQUcsR0FBUSxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2hDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFDRCxPQUFPLEdBQUcsQ0FBQztLQUNaO0lBRUQsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaW1wbCBmcm9tICcuL2RpZmYnO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi9kaWZmL3R5cGVzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgZGlmZktleWVkRW50aXRpZXMsIHVuaW9uT2YgfSBmcm9tICcuL2RpZmYvdXRpbCc7XG5cbmV4cG9ydCAqIGZyb20gJy4vZGlmZi90eXBlcyc7XG5cbnR5cGUgRGlmZkhhbmRsZXIgPSAoZGlmZjogdHlwZXMuSVRlbXBsYXRlRGlmZiwgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkgPT4gdm9pZDtcbnR5cGUgSGFuZGxlclJlZ2lzdHJ5ID0geyBbc2VjdGlvbjogc3RyaW5nXTogRGlmZkhhbmRsZXIgfTtcblxuY29uc3QgRElGRl9IQU5ETEVSUzogSGFuZGxlclJlZ2lzdHJ5ID0ge1xuICBBV1NUZW1wbGF0ZUZvcm1hdFZlcnNpb246IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5hd3NUZW1wbGF0ZUZvcm1hdFZlcnNpb24gPSBpbXBsLmRpZmZBdHRyaWJ1dGUob2xkVmFsdWUsIG5ld1ZhbHVlKSxcbiAgRGVzY3JpcHRpb246IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5kZXNjcmlwdGlvbiA9IGltcGwuZGlmZkF0dHJpYnV0ZShvbGRWYWx1ZSwgbmV3VmFsdWUpLFxuICBNZXRhZGF0YTogKGRpZmYsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT5cbiAgICBkaWZmLm1ldGFkYXRhID0gbmV3IHR5cGVzLkRpZmZlcmVuY2VDb2xsZWN0aW9uKGRpZmZLZXllZEVudGl0aWVzKG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW1wbC5kaWZmTWV0YWRhdGEpKSxcbiAgUGFyYW1ldGVyczogKGRpZmYsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT5cbiAgICBkaWZmLnBhcmFtZXRlcnMgPSBuZXcgdHlwZXMuRGlmZmVyZW5jZUNvbGxlY3Rpb24oZGlmZktleWVkRW50aXRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCBpbXBsLmRpZmZQYXJhbWV0ZXIpKSxcbiAgTWFwcGluZ3M6IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5tYXBwaW5ncyA9IG5ldyB0eXBlcy5EaWZmZXJlbmNlQ29sbGVjdGlvbihkaWZmS2V5ZWRFbnRpdGllcyhvbGRWYWx1ZSwgbmV3VmFsdWUsIGltcGwuZGlmZk1hcHBpbmcpKSxcbiAgQ29uZGl0aW9uczogKGRpZmYsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT5cbiAgICBkaWZmLmNvbmRpdGlvbnMgPSBuZXcgdHlwZXMuRGlmZmVyZW5jZUNvbGxlY3Rpb24oZGlmZktleWVkRW50aXRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCBpbXBsLmRpZmZDb25kaXRpb24pKSxcbiAgVHJhbnNmb3JtOiAoZGlmZiwgb2xkVmFsdWUsIG5ld1ZhbHVlKSA9PlxuICAgIGRpZmYudHJhbnNmb3JtID0gaW1wbC5kaWZmQXR0cmlidXRlKG9sZFZhbHVlLCBuZXdWYWx1ZSksXG4gIFJlc291cmNlczogKGRpZmYsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgPT5cbiAgICBkaWZmLnJlc291cmNlcyA9IG5ldyB0eXBlcy5EaWZmZXJlbmNlQ29sbGVjdGlvbihkaWZmS2V5ZWRFbnRpdGllcyhvbGRWYWx1ZSwgbmV3VmFsdWUsIGltcGwuZGlmZlJlc291cmNlKSksXG4gIE91dHB1dHM6IChkaWZmLCBvbGRWYWx1ZSwgbmV3VmFsdWUpID0+XG4gICAgZGlmZi5vdXRwdXRzID0gbmV3IHR5cGVzLkRpZmZlcmVuY2VDb2xsZWN0aW9uKGRpZmZLZXllZEVudGl0aWVzKG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW1wbC5kaWZmT3V0cHV0KSksXG59O1xuXG4vKipcbiAqIENvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcyBhbmQgcmV0dXJuIHNlbWFudGljIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlbS5cbiAqXG4gKiBAcGFyYW0gY3VycmVudFRlbXBsYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzdGFjay5cbiAqIEBwYXJhbSBuZXdUZW1wbGF0ZSAgICAgdGhlIHRhcmdldCBzdGF0ZSBvZiB0aGUgc3RhY2suXG4gKlxuICogQHJldHVybnMgYSArdHlwZXMuVGVtcGxhdGVEaWZmKyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjaGFuZ2VzIHRoYXQgd2lsbCBoYXBwZW4gaWZcbiAqICAgICAgYSBzdGFjayB3aGljaCBjdXJyZW50IHN0YXRlIGlzIGRlc2NyaWJlZCBieSArY3VycmVudFRlbXBsYXRlKyBpcyB1cGRhdGVkIHdpdGhcbiAqICAgICAgdGhlIHRlbXBsYXRlICtuZXdUZW1wbGF0ZSsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmVGVtcGxhdGUoY3VycmVudFRlbXBsYXRlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBuZXdUZW1wbGF0ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHR5cGVzLlRlbXBsYXRlRGlmZiB7XG4gIC8vIEJhc2UgZGlmZlxuICBjb25zdCB0aGVEaWZmID0gY2FsY3VsYXRlVGVtcGxhdGVEaWZmKGN1cnJlbnRUZW1wbGF0ZSwgbmV3VGVtcGxhdGUpO1xuXG4gIC8vIFdlJ3JlIGdvaW5nIHRvIG1vZGlmeSB0aGlzIGluLXBsYWNlXG4gIGNvbnN0IG5ld1RlbXBsYXRlQ29weSA9IGRlZXBDb3B5KG5ld1RlbXBsYXRlKTtcblxuICBsZXQgZGlkUHJvcGFnYXRlUmVmZXJlbmNlQ2hhbmdlcztcbiAgbGV0IGRpZmZXaXRoUmVwbGFjZW1lbnRzO1xuICBkbyB7XG4gICAgZGlmZldpdGhSZXBsYWNlbWVudHMgPSBjYWxjdWxhdGVUZW1wbGF0ZURpZmYoY3VycmVudFRlbXBsYXRlLCBuZXdUZW1wbGF0ZUNvcHkpO1xuXG4gICAgLy8gUHJvcGFnYXRlIHJlcGxhY2VtZW50cyBmb3IgcmVwbGFjZWQgcmVzb3VyY2VzXG4gICAgZGlkUHJvcGFnYXRlUmVmZXJlbmNlQ2hhbmdlcyA9IGZhbHNlO1xuICAgIGlmIChkaWZmV2l0aFJlcGxhY2VtZW50cy5yZXNvdXJjZXMpIHtcbiAgICAgIGRpZmZXaXRoUmVwbGFjZW1lbnRzLnJlc291cmNlcy5mb3JFYWNoRGlmZmVyZW5jZSgobG9naWNhbElkLCBjaGFuZ2UpID0+IHtcbiAgICAgICAgaWYgKGNoYW5nZS5jaGFuZ2VJbXBhY3QgPT09IHR5cGVzLlJlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRSkge1xuICAgICAgICAgIGlmIChwcm9wYWdhdGVSZXBsYWNlZFJlZmVyZW5jZXMobmV3VGVtcGxhdGVDb3B5LCBsb2dpY2FsSWQpKSB7XG4gICAgICAgICAgICBkaWRQcm9wYWdhdGVSZWZlcmVuY2VDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSB3aGlsZSAoZGlkUHJvcGFnYXRlUmVmZXJlbmNlQ2hhbmdlcyk7XG5cbiAgLy8gQ29weSBcInJlcGxhY2VkXCIgc3RhdGVzIGZyb20gYGRpZmZXaXRoUmVwbGFjZW1lbnRzYCB0byBgdGhlRGlmZmAuXG4gIGRpZmZXaXRoUmVwbGFjZW1lbnRzLnJlc291cmNlc1xuICAgIC5maWx0ZXIociA9PiBpc1JlcGxhY2VtZW50KHIhLmNoYW5nZUltcGFjdCkpXG4gICAgLmZvckVhY2hEaWZmZXJlbmNlKChsb2dpY2FsSWQsIGRvd25zdHJlYW1SZXBsYWNlbWVudCkgPT4ge1xuICAgICAgY29uc3QgcmVzb3VyY2UgPSB0aGVEaWZmLnJlc291cmNlcy5nZXQobG9naWNhbElkKTtcblxuICAgICAgaWYgKHJlc291cmNlLmNoYW5nZUltcGFjdCAhPT0gZG93bnN0cmVhbVJlcGxhY2VtZW50LmNoYW5nZUltcGFjdCkge1xuICAgICAgICBwcm9wYWdhdGVQcm9wZXJ0eVJlcGxhY2VtZW50KGRvd25zdHJlYW1SZXBsYWNlbWVudCwgcmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHJldHVybiB0aGVEaWZmO1xufVxuXG5mdW5jdGlvbiBpc1JlcGxhY2VtZW50KGltcGFjdDogdHlwZXMuUmVzb3VyY2VJbXBhY3QpIHtcbiAgcmV0dXJuIGltcGFjdCA9PT0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuTUFZX1JFUExBQ0UgfHwgaW1wYWN0ID09PSB0eXBlcy5SZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0U7XG59XG5cbi8qKlxuICogRm9yIGFsbCBwcm9wZXJ0aWVzIGluICdzb3VyY2UnIHRoYXQgaGF2ZSBhIFwicmVwbGFjZW1lbnRcIiBpbXBhY3QsIHByb3BhZ2F0ZSB0aGF0IGltcGFjdCB0byBcImRlc3RcIlxuICovXG5mdW5jdGlvbiBwcm9wYWdhdGVQcm9wZXJ0eVJlcGxhY2VtZW50KHNvdXJjZTogdHlwZXMuUmVzb3VyY2VEaWZmZXJlbmNlLCBkZXN0OiB0eXBlcy5SZXNvdXJjZURpZmZlcmVuY2UpIHtcbiAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCBkaWZmXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UucHJvcGVydHlVcGRhdGVzKSkge1xuICAgIGlmIChkaWZmLmNoYW5nZUltcGFjdCAmJiBpc1JlcGxhY2VtZW50KGRpZmYuY2hhbmdlSW1wYWN0KSkge1xuICAgICAgLy8gVXNlIHRoZSBwcm9wZXJ0eWRpZmYgb2Ygc291cmNlIGluIHRhcmdldC4gVGhlIHJlc3VsdCBvZiB0aGlzIGhhcHBlbnMgdG8gYmUgY2xlYXIgZW5vdWdoLlxuICAgICAgZGVzdC5zZXRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWUsIGRpZmYpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVUZW1wbGF0ZURpZmYoY3VycmVudFRlbXBsYXRlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBuZXdUZW1wbGF0ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHR5cGVzLlRlbXBsYXRlRGlmZiB7XG4gIGNvbnN0IGRpZmZlcmVuY2VzOiB0eXBlcy5JVGVtcGxhdGVEaWZmID0ge307XG4gIGNvbnN0IHVua25vd246IHsgW2tleTogc3RyaW5nXTogdHlwZXMuRGlmZmVyZW5jZTxhbnk+IH0gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgdW5pb25PZihPYmplY3Qua2V5cyhjdXJyZW50VGVtcGxhdGUpLCBPYmplY3Qua2V5cyhuZXdUZW1wbGF0ZSkpLnNvcnQoKSkge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gY3VycmVudFRlbXBsYXRlW2tleV07XG4gICAgY29uc3QgbmV3VmFsdWUgPSBuZXdUZW1wbGF0ZVtrZXldO1xuICAgIGlmIChkZWVwRXF1YWwob2xkVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXI6IERpZmZIYW5kbGVyID0gRElGRl9IQU5ETEVSU1trZXldXG4gICAgICAgICAgICAgICAgICB8fCAoKF9kaWZmLCBvbGRWLCBuZXdWKSA9PiB1bmtub3duW2tleV0gPSBpbXBsLmRpZmZVbmtub3duKG9sZFYsIG5ld1YpKTtcbiAgICBoYW5kbGVyKGRpZmZlcmVuY2VzLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuXG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKHVua25vd24pLmxlbmd0aCA+IDApIHtcbiAgICBkaWZmZXJlbmNlcy51bmtub3duID0gbmV3IHR5cGVzLkRpZmZlcmVuY2VDb2xsZWN0aW9uKHVua25vd24pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyB0eXBlcy5UZW1wbGF0ZURpZmYoZGlmZmVyZW5jZXMpO1xufVxuXG4vKipcbiAqIENvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHJlc291cmNlcyBhbmQgcmV0dXJuIHNlbWFudGljIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZlJlc291cmNlKG9sZFZhbHVlOiB0eXBlcy5SZXNvdXJjZSwgbmV3VmFsdWU6IHR5cGVzLlJlc291cmNlKTogdHlwZXMuUmVzb3VyY2VEaWZmZXJlbmNlIHtcbiAgcmV0dXJuIGltcGwuZGlmZlJlc291cmNlKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4gbG9naWNhbElEIG9uIHRoZSBnaXZlbiB0ZW1wbGF0ZSwgaW4tcGxhY2VcbiAqXG4gKiBSZXR1cm5zIHRydWUgaWZmIGFueSByZWZlcmVuY2VzIHdlcmUgcmVwbGFjZWQuXG4gKi9cbmZ1bmN0aW9uIHByb3BhZ2F0ZVJlcGxhY2VkUmVmZXJlbmNlcyh0ZW1wbGF0ZTogb2JqZWN0LCBsb2dpY2FsSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgcmV0ID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gcmVjdXJzZShvYmo6IGFueSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIG9iai5mb3JFYWNoKHJlY3Vyc2UpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcbiAgICAgIGlmICghcmVwbGFjZVJlZmVyZW5jZShvYmopKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXMob2JqKS5mb3JFYWNoKHJlY3Vyc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlcGxhY2VSZWZlcmVuY2Uob2JqOiBhbnkpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY29uc3Qga2V5ID0ga2V5c1swXTtcblxuICAgIGlmIChrZXkgPT09ICdSZWYnKSB7XG4gICAgICBpZiAob2JqLlJlZiA9PT0gbG9naWNhbElkKSB7XG4gICAgICAgIG9iai5SZWYgPSBsb2dpY2FsSWQgKyAnIChyZXBsYWNlZCknO1xuICAgICAgICByZXQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGtleS5zdGFydHNXaXRoKCdGbjo6JykpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ialtrZXldKSAmJiBvYmpba2V5XS5sZW5ndGggPiAwICYmIG9ialtrZXldWzBdID09PSBsb2dpY2FsSWQpIHtcbiAgICAgICAgb2JqW2tleV1bMF0gPSBsb2dpY2FsSWQgKyAnKHJlcGxhY2VkKSc7XG4gICAgICAgIHJldCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZWN1cnNlKHRlbXBsYXRlKTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZGVlcENvcHkoeDogYW55KTogYW55IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4geC5tYXAoZGVlcENvcHkpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKSB7XG4gICAgY29uc3QgcmV0OiBhbnkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh4KSkge1xuICAgICAgcmV0W2tleV0gPSBkZWVwQ29weSh4W2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcmV0dXJuIHg7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.diffUnknown = exports.diffResource = exports.diffParameter = exports.diffOutput = exports.diffMetadata = exports.diffMapping = exports.diffCondition = exports.diffAttribute = void 0;\nconst types = require(\"./types\");\nconst util_1 = require(\"./util\");\nfunction diffAttribute(oldValue, newValue) {\n return new types.Difference(_asString(oldValue), _asString(newValue));\n}\nexports.diffAttribute = diffAttribute;\nfunction diffCondition(oldValue, newValue) {\n return new types.ConditionDifference(oldValue, newValue);\n}\nexports.diffCondition = diffCondition;\nfunction diffMapping(oldValue, newValue) {\n return new types.MappingDifference(oldValue, newValue);\n}\nexports.diffMapping = diffMapping;\nfunction diffMetadata(oldValue, newValue) {\n return new types.MetadataDifference(oldValue, newValue);\n}\nexports.diffMetadata = diffMetadata;\nfunction diffOutput(oldValue, newValue) {\n return new types.OutputDifference(oldValue, newValue);\n}\nexports.diffOutput = diffOutput;\nfunction diffParameter(oldValue, newValue) {\n return new types.ParameterDifference(oldValue, newValue);\n}\nexports.diffParameter = diffParameter;\nfunction diffResource(oldValue, newValue) {\n const resourceType = {\n oldType: oldValue && oldValue.Type,\n newType: newValue && newValue.Type,\n };\n let propertyDiffs = {};\n let otherDiffs = {};\n if (resourceType.oldType !== undefined && resourceType.oldType === resourceType.newType) {\n // Only makes sense to inspect deeper if the types stayed the same\n const impl = (0, util_1.loadResourceModel)(resourceType.oldType);\n propertyDiffs = (0, util_1.diffKeyedEntities)(oldValue.Properties, newValue.Properties, (oldVal, newVal, key) => _diffProperty(oldVal, newVal, key, impl));\n otherDiffs = (0, util_1.diffKeyedEntities)(oldValue, newValue, _diffOther);\n delete otherDiffs.Properties;\n }\n return new types.ResourceDifference(oldValue, newValue, {\n resourceType, propertyDiffs, otherDiffs,\n });\n function _diffProperty(oldV, newV, key, resourceSpec) {\n let changeImpact = types.ResourceImpact.NO_CHANGE;\n const spec = resourceSpec?.properties?.[key];\n if (spec && !(0, util_1.deepEqual)(oldV, newV)) {\n switch (spec.causesReplacement) {\n case 'yes':\n changeImpact = types.ResourceImpact.WILL_REPLACE;\n break;\n case 'maybe':\n changeImpact = types.ResourceImpact.MAY_REPLACE;\n break;\n default:\n // In those cases, whatever is the current value is what we should keep\n changeImpact = types.ResourceImpact.WILL_UPDATE;\n }\n }\n return new types.PropertyDifference(oldV, newV, { changeImpact });\n }\n function _diffOther(oldV, newV) {\n return new types.Difference(oldV, newV);\n }\n}\nexports.diffResource = diffResource;\nfunction diffUnknown(oldValue, newValue) {\n return new types.Difference(oldValue, newValue);\n}\nexports.diffUnknown = diffUnknown;\n/**\n * Coerces a given value to +string | undefined+.\n *\n * @param value the value to be coerced.\n *\n * @returns +undefined+ if +value+ is +null+ or +undefined+,\n * +value+ if it is a +string+,\n * a compact JSON representation of +value+ otherwise.\n */\nfunction _asString(value) {\n if (value == null) {\n return undefined;\n }\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxpQ0FBaUM7QUFDakMsaUNBQXlFO0FBRXpFLFNBQWdCLGFBQWEsQ0FBQyxRQUFhLEVBQUUsUUFBYTtJQUN4RCxPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBUyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUZELHNDQUVDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7SUFDaEYsT0FBTyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUZELHNDQUVDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLFFBQXVCLEVBQUUsUUFBdUI7SUFDMUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUZELGtDQUVDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLFFBQXdCLEVBQUUsUUFBd0I7SUFDN0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUZELG9DQUVDO0FBRUQsU0FBZ0IsVUFBVSxDQUFDLFFBQXNCLEVBQUUsUUFBc0I7SUFDdkUsT0FBTyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUZELGdDQUVDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7SUFDaEYsT0FBTyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUZELHNDQUVDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7SUFDL0UsTUFBTSxZQUFZLEdBQUc7UUFDbkIsT0FBTyxFQUFFLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSTtRQUNsQyxPQUFPLEVBQUUsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJO0tBQ25DLENBQUM7SUFDRixJQUFJLGFBQWEsR0FBcUQsRUFBRSxDQUFDO0lBQ3pFLElBQUksVUFBVSxHQUE2QyxFQUFFLENBQUM7SUFFOUQsSUFBSSxZQUFZLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxZQUFZLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxPQUFPLEVBQUU7UUFDdkYsa0VBQWtFO1FBQ2xFLE1BQU0sSUFBSSxHQUFHLElBQUEsd0JBQWlCLEVBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELGFBQWEsR0FBRyxJQUFBLHdCQUFpQixFQUFDLFFBQVMsQ0FBQyxVQUFVLEVBQ3BELFFBQVMsQ0FBQyxVQUFVLEVBQ3BCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXJFLFVBQVUsR0FBRyxJQUFBLHdCQUFpQixFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0QsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDO0tBQzlCO0lBRUQsT0FBTyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFO1FBQ3RELFlBQVksRUFBRSxhQUFhLEVBQUUsVUFBVTtLQUN4QyxDQUFDLENBQUM7SUFFSCxTQUFTLGFBQWEsQ0FBQyxJQUFTLEVBQUUsSUFBUyxFQUFFLEdBQVcsRUFBRSxZQUF1QjtRQUMvRSxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUVsRCxNQUFNLElBQUksR0FBRyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFBLGdCQUFTLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ2xDLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUM5QixLQUFLLEtBQUs7b0JBQ1IsWUFBWSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO29CQUNqRCxNQUFNO2dCQUNSLEtBQUssT0FBTztvQkFDVixZQUFZLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7b0JBQ2hELE1BQU07Z0JBQ1I7b0JBQ0UsdUVBQXVFO29CQUN2RSxZQUFZLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7YUFDbkQ7U0FDRjtRQUVELE9BQU8sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELFNBQVMsVUFBVSxDQUFDLElBQVMsRUFBRSxJQUFTO1FBQ3RDLE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0FBQ0gsQ0FBQztBQS9DRCxvQ0ErQ0M7QUFFRCxTQUFnQixXQUFXLENBQUMsUUFBYSxFQUFFLFFBQWE7SUFDdEQsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFGRCxrQ0FFQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBVTtJQUMzQixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7UUFDakIsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM3QixPQUFPLEtBQWUsQ0FBQztLQUN4QjtJQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVzb3VyY2UgfSBmcm9tICdAYXdzLWNkay9zZXJ2aWNlLXNwZWMtdHlwZXMnO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBkZWVwRXF1YWwsIGRpZmZLZXllZEVudGl0aWVzLCBsb2FkUmVzb3VyY2VNb2RlbCB9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQXR0cmlidXRlKG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB0eXBlcy5EaWZmZXJlbmNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IHR5cGVzLkRpZmZlcmVuY2U8c3RyaW5nPihfYXNTdHJpbmcob2xkVmFsdWUpLCBfYXNTdHJpbmcobmV3VmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZDb25kaXRpb24ob2xkVmFsdWU6IHR5cGVzLkNvbmRpdGlvbiwgbmV3VmFsdWU6IHR5cGVzLkNvbmRpdGlvbik6IHR5cGVzLkNvbmRpdGlvbkRpZmZlcmVuY2Uge1xuICByZXR1cm4gbmV3IHR5cGVzLkNvbmRpdGlvbkRpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZNYXBwaW5nKG9sZFZhbHVlOiB0eXBlcy5NYXBwaW5nLCBuZXdWYWx1ZTogdHlwZXMuTWFwcGluZyk6IHR5cGVzLk1hcHBpbmdEaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5NYXBwaW5nRGlmZmVyZW5jZShvbGRWYWx1ZSwgbmV3VmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlmZk1ldGFkYXRhKG9sZFZhbHVlOiB0eXBlcy5NZXRhZGF0YSwgbmV3VmFsdWU6IHR5cGVzLk1ldGFkYXRhKTogdHlwZXMuTWV0YWRhdGFEaWZmZXJlbmNlIHtcbiAgcmV0dXJuIG5ldyB0eXBlcy5NZXRhZGF0YURpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZPdXRwdXQob2xkVmFsdWU6IHR5cGVzLk91dHB1dCwgbmV3VmFsdWU6IHR5cGVzLk91dHB1dCk6IHR5cGVzLk91dHB1dERpZmZlcmVuY2Uge1xuICByZXR1cm4gbmV3IHR5cGVzLk91dHB1dERpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZQYXJhbWV0ZXIob2xkVmFsdWU6IHR5cGVzLlBhcmFtZXRlciwgbmV3VmFsdWU6IHR5cGVzLlBhcmFtZXRlcik6IHR5cGVzLlBhcmFtZXRlckRpZmZlcmVuY2Uge1xuICByZXR1cm4gbmV3IHR5cGVzLlBhcmFtZXRlckRpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZSZXNvdXJjZShvbGRWYWx1ZT86IHR5cGVzLlJlc291cmNlLCBuZXdWYWx1ZT86IHR5cGVzLlJlc291cmNlKTogdHlwZXMuUmVzb3VyY2VEaWZmZXJlbmNlIHtcbiAgY29uc3QgcmVzb3VyY2VUeXBlID0ge1xuICAgIG9sZFR5cGU6IG9sZFZhbHVlICYmIG9sZFZhbHVlLlR5cGUsXG4gICAgbmV3VHlwZTogbmV3VmFsdWUgJiYgbmV3VmFsdWUuVHlwZSxcbiAgfTtcbiAgbGV0IHByb3BlcnR5RGlmZnM6IHsgW2tleTogc3RyaW5nXTogdHlwZXMuUHJvcGVydHlEaWZmZXJlbmNlPGFueT4gfSA9IHt9O1xuICBsZXQgb3RoZXJEaWZmczogeyBba2V5OiBzdHJpbmddOiB0eXBlcy5EaWZmZXJlbmNlPGFueT4gfSA9IHt9O1xuXG4gIGlmIChyZXNvdXJjZVR5cGUub2xkVHlwZSAhPT0gdW5kZWZpbmVkICYmIHJlc291cmNlVHlwZS5vbGRUeXBlID09PSByZXNvdXJjZVR5cGUubmV3VHlwZSkge1xuICAgIC8vIE9ubHkgbWFrZXMgc2Vuc2UgdG8gaW5zcGVjdCBkZWVwZXIgaWYgdGhlIHR5cGVzIHN0YXllZCB0aGUgc2FtZVxuICAgIGNvbnN0IGltcGwgPSBsb2FkUmVzb3VyY2VNb2RlbChyZXNvdXJjZVR5cGUub2xkVHlwZSk7XG4gICAgcHJvcGVydHlEaWZmcyA9IGRpZmZLZXllZEVudGl0aWVzKG9sZFZhbHVlIS5Qcm9wZXJ0aWVzLFxuICAgICAgbmV3VmFsdWUhLlByb3BlcnRpZXMsXG4gICAgICAob2xkVmFsLCBuZXdWYWwsIGtleSkgPT4gX2RpZmZQcm9wZXJ0eShvbGRWYWwsIG5ld1ZhbCwga2V5LCBpbXBsKSk7XG5cbiAgICBvdGhlckRpZmZzID0gZGlmZktleWVkRW50aXRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCBfZGlmZk90aGVyKTtcbiAgICBkZWxldGUgb3RoZXJEaWZmcy5Qcm9wZXJ0aWVzO1xuICB9XG5cbiAgcmV0dXJuIG5ldyB0eXBlcy5SZXNvdXJjZURpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlLCB7XG4gICAgcmVzb3VyY2VUeXBlLCBwcm9wZXJ0eURpZmZzLCBvdGhlckRpZmZzLFxuICB9KTtcblxuICBmdW5jdGlvbiBfZGlmZlByb3BlcnR5KG9sZFY6IGFueSwgbmV3VjogYW55LCBrZXk6IHN0cmluZywgcmVzb3VyY2VTcGVjPzogUmVzb3VyY2UpIHtcbiAgICBsZXQgY2hhbmdlSW1wYWN0ID0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuTk9fQ0hBTkdFO1xuXG4gICAgY29uc3Qgc3BlYyA9IHJlc291cmNlU3BlYz8ucHJvcGVydGllcz8uW2tleV07XG4gICAgaWYgKHNwZWMgJiYgIWRlZXBFcXVhbChvbGRWLCBuZXdWKSkge1xuICAgICAgc3dpdGNoIChzcGVjLmNhdXNlc1JlcGxhY2VtZW50KSB7XG4gICAgICAgIGNhc2UgJ3llcyc6XG4gICAgICAgICAgY2hhbmdlSW1wYWN0ID0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuV0lMTF9SRVBMQUNFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtYXliZSc6XG4gICAgICAgICAgY2hhbmdlSW1wYWN0ID0gdHlwZXMuUmVzb3VyY2VJbXBhY3QuTUFZX1JFUExBQ0U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW4gdGhvc2UgY2FzZXMsIHdoYXRldmVyIGlzIHRoZSBjdXJyZW50IHZhbHVlIGlzIHdoYXQgd2Ugc2hvdWxkIGtlZXBcbiAgICAgICAgICBjaGFuZ2VJbXBhY3QgPSB0eXBlcy5SZXNvdXJjZUltcGFjdC5XSUxMX1VQREFURTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHR5cGVzLlByb3BlcnR5RGlmZmVyZW5jZShvbGRWLCBuZXdWLCB7IGNoYW5nZUltcGFjdCB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9kaWZmT3RoZXIob2xkVjogYW55LCBuZXdWOiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IHR5cGVzLkRpZmZlcmVuY2Uob2xkViwgbmV3Vik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZVbmtub3duKG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB0eXBlcy5EaWZmZXJlbmNlPGFueT4ge1xuICByZXR1cm4gbmV3IHR5cGVzLkRpZmZlcmVuY2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDb2VyY2VzIGEgZ2l2ZW4gdmFsdWUgdG8gK3N0cmluZyB8IHVuZGVmaW5lZCsuXG4gKlxuICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjb2VyY2VkLlxuICpcbiAqIEByZXR1cm5zICt1bmRlZmluZWQrIGlmICt2YWx1ZSsgaXMgK251bGwrIG9yICt1bmRlZmluZWQrLFxuICogICAgICArdmFsdWUrIGlmIGl0IGlzIGEgK3N0cmluZyssXG4gKiAgICAgIGEgY29tcGFjdCBKU09OIHJlcHJlc2VudGF0aW9uIG9mICt2YWx1ZSsgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBfYXNTdHJpbmcodmFsdWU6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSBhcyBzdHJpbmc7XG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mkUnparseable = exports.mkParsed = void 0;\nfunction mkParsed(value) {\n return { type: 'parsed', value };\n}\nexports.mkParsed = mkParsed;\nfunction mkUnparseable(value) {\n return {\n type: 'unparseable',\n repr: typeof value === 'string' ? value : JSON.stringify(value),\n };\n}\nexports.mkUnparseable = mkUnparseable;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF5YmUtcGFyc2VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWF5YmUtcGFyc2VkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWVBLFNBQWdCLFFBQVEsQ0FBSSxLQUFRO0lBQ2xDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ25DLENBQUM7QUFGRCw0QkFFQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxLQUFVO0lBQ3RDLE9BQU87UUFDTCxJQUFJLEVBQUUsYUFBYTtRQUNuQixJQUFJLEVBQUUsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0tBQ2hFLENBQUM7QUFDSixDQUFDO0FBTEQsc0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgdmFsdWUgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBwYXJzZWFibGVcbiAqL1xuZXhwb3J0IHR5cGUgTWF5YmVQYXJzZWQ8QT4gPSBQYXJzZWQ8QT4gfCBVbnBhcnNlYWJsZUNmbjtcblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWQ8QT4ge1xuICByZWFkb25seSB0eXBlOiAncGFyc2VkJztcbiAgcmVhZG9ubHkgdmFsdWU6IEE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVW5wYXJzZWFibGVDZm4ge1xuICByZWFkb25seSB0eXBlOiAndW5wYXJzZWFibGUnO1xuICByZWFkb25seSByZXByOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBta1BhcnNlZDxBPih2YWx1ZTogQSk6IFBhcnNlZDxBPiB7XG4gIHJldHVybiB7IHR5cGU6ICdwYXJzZWQnLCB2YWx1ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWtVbnBhcnNlYWJsZSh2YWx1ZTogYW55KTogVW5wYXJzZWFibGVDZm4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1bnBhcnNlYWJsZScsXG4gICAgcmVwcjogdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpLFxuICB9O1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isPropertyDifference = exports.ResourceDifference = exports.ResourceImpact = exports.ParameterDifference = exports.OutputDifference = exports.MetadataDifference = exports.MappingDifference = exports.ConditionDifference = exports.DifferenceCollection = exports.PropertyDifference = exports.Difference = exports.TemplateDiff = void 0;\nconst assert_1 = require(\"assert\");\nconst service_spec_types_1 = require(\"@aws-cdk/service-spec-types\");\nconst util_1 = require(\"./util\");\nconst iam_changes_1 = require(\"../iam/iam-changes\");\nconst security_group_changes_1 = require(\"../network/security-group-changes\");\n/** Semantic differences between two CloudFormation templates. */\nclass TemplateDiff {\n constructor(args) {\n if (args.awsTemplateFormatVersion !== undefined) {\n this.awsTemplateFormatVersion = args.awsTemplateFormatVersion;\n }\n if (args.description !== undefined) {\n this.description = args.description;\n }\n if (args.transform !== undefined) {\n this.transform = args.transform;\n }\n this.conditions = args.conditions || new DifferenceCollection({});\n this.mappings = args.mappings || new DifferenceCollection({});\n this.metadata = args.metadata || new DifferenceCollection({});\n this.outputs = args.outputs || new DifferenceCollection({});\n this.parameters = args.parameters || new DifferenceCollection({});\n this.resources = args.resources || new DifferenceCollection({});\n this.unknown = args.unknown || new DifferenceCollection({});\n this.iamChanges = new iam_changes_1.IamChanges({\n propertyChanges: this.scrutinizablePropertyChanges(iam_changes_1.IamChanges.IamPropertyScrutinies),\n resourceChanges: this.scrutinizableResourceChanges(iam_changes_1.IamChanges.IamResourceScrutinies),\n });\n this.securityGroupChanges = new security_group_changes_1.SecurityGroupChanges({\n egressRulePropertyChanges: this.scrutinizablePropertyChanges([service_spec_types_1.PropertyScrutinyType.EgressRules]),\n ingressRulePropertyChanges: this.scrutinizablePropertyChanges([service_spec_types_1.PropertyScrutinyType.IngressRules]),\n egressRuleResourceChanges: this.scrutinizableResourceChanges([service_spec_types_1.ResourceScrutinyType.EgressRuleResource]),\n ingressRuleResourceChanges: this.scrutinizableResourceChanges([service_spec_types_1.ResourceScrutinyType.IngressRuleResource]),\n });\n }\n get differenceCount() {\n let count = 0;\n if (this.awsTemplateFormatVersion !== undefined) {\n count += 1;\n }\n if (this.description !== undefined) {\n count += 1;\n }\n if (this.transform !== undefined) {\n count += 1;\n }\n count += this.conditions.differenceCount;\n count += this.mappings.differenceCount;\n count += this.metadata.differenceCount;\n count += this.outputs.differenceCount;\n count += this.parameters.differenceCount;\n count += this.resources.differenceCount;\n count += this.unknown.differenceCount;\n return count;\n }\n get isEmpty() {\n return this.differenceCount === 0;\n }\n /**\n * Return true if any of the permissions objects involve a broadening of permissions\n */\n get permissionsBroadened() {\n return this.iamChanges.permissionsBroadened || this.securityGroupChanges.rulesAdded;\n }\n /**\n * Return true if any of the permissions objects have changed\n */\n get permissionsAnyChanges() {\n return this.iamChanges.hasChanges || this.securityGroupChanges.hasChanges;\n }\n /**\n * Return all property changes of a given scrutiny type\n *\n * We don't just look at property updates; we also look at resource additions and deletions (in which\n * case there is no further detail on property values), and resource type changes.\n */\n scrutinizablePropertyChanges(scrutinyTypes) {\n const ret = new Array();\n for (const [resourceLogicalId, resourceChange] of Object.entries(this.resources.changes)) {\n if (resourceChange.resourceTypeChanged) {\n // we ignore resource type changes here, and handle them in scrutinizableResourceChanges()\n continue;\n }\n if (!resourceChange.newResourceType) {\n continue;\n }\n const newTypeProps = (0, util_1.loadResourceModel)(resourceChange.newResourceType)?.properties || {};\n for (const [propertyName, prop] of Object.entries(newTypeProps)) {\n const propScrutinyType = prop.scrutinizable || service_spec_types_1.PropertyScrutinyType.None;\n if (scrutinyTypes.includes(propScrutinyType)) {\n ret.push({\n resourceLogicalId,\n propertyName,\n resourceType: resourceChange.resourceType,\n scrutinyType: propScrutinyType,\n oldValue: resourceChange.oldProperties?.[propertyName],\n newValue: resourceChange.newProperties?.[propertyName],\n });\n }\n }\n }\n return ret;\n }\n /**\n * Return all resource changes of a given scrutiny type\n *\n * We don't just look at resource updates; we also look at resource additions and deletions (in which\n * case there is no further detail on property values), and resource type changes.\n */\n scrutinizableResourceChanges(scrutinyTypes) {\n const ret = new Array();\n for (const [resourceLogicalId, resourceChange] of Object.entries(this.resources.changes)) {\n if (!resourceChange) {\n continue;\n }\n const commonProps = {\n oldProperties: resourceChange.oldProperties,\n newProperties: resourceChange.newProperties,\n resourceLogicalId,\n };\n // changes to the Type of resources can happen when migrating from CFN templates that use Transforms\n if (resourceChange.resourceTypeChanged) {\n // Treat as DELETE+ADD\n if (resourceChange.oldResourceType) {\n const oldResourceModel = (0, util_1.loadResourceModel)(resourceChange.oldResourceType);\n if (oldResourceModel && this.resourceIsScrutinizable(oldResourceModel, scrutinyTypes)) {\n ret.push({\n ...commonProps,\n newProperties: undefined,\n resourceType: resourceChange.oldResourceType,\n scrutinyType: oldResourceModel.scrutinizable,\n });\n }\n }\n if (resourceChange.newResourceType) {\n const newResourceModel = (0, util_1.loadResourceModel)(resourceChange.newResourceType);\n if (newResourceModel && this.resourceIsScrutinizable(newResourceModel, scrutinyTypes)) {\n ret.push({\n ...commonProps,\n oldProperties: undefined,\n resourceType: resourceChange.newResourceType,\n scrutinyType: newResourceModel.scrutinizable,\n });\n }\n }\n }\n else {\n const resourceModel = (0, util_1.loadResourceModel)(resourceChange.resourceType);\n if (resourceModel && this.resourceIsScrutinizable(resourceModel, scrutinyTypes)) {\n ret.push({\n ...commonProps,\n resourceType: resourceChange.resourceType,\n scrutinyType: resourceModel.scrutinizable,\n });\n }\n }\n }\n return ret;\n }\n resourceIsScrutinizable(res, scrutinyTypes) {\n return scrutinyTypes.includes(res.scrutinizable || service_spec_types_1.ResourceScrutinyType.None);\n }\n}\nexports.TemplateDiff = TemplateDiff;\n/**\n * Models an entity that changed between two versions of a CloudFormation template.\n */\nclass Difference {\n /**\n * @param oldValue the old value, cannot be equal (to the sense of +deepEqual+) to +newValue+.\n * @param newValue the new value, cannot be equal (to the sense of +deepEqual+) to +oldValue+.\n */\n constructor(oldValue, newValue) {\n this.oldValue = oldValue;\n this.newValue = newValue;\n if (oldValue === undefined && newValue === undefined) {\n throw new assert_1.AssertionError({ message: 'oldValue and newValue are both undefined!' });\n }\n this.isDifferent = !(0, util_1.deepEqual)(oldValue, newValue);\n }\n /** @returns +true+ if the element is new to the template. */\n get isAddition() {\n return this.oldValue === undefined;\n }\n /** @returns +true+ if the element was removed from the template. */\n get isRemoval() {\n return this.newValue === undefined;\n }\n /** @returns +true+ if the element was already in the template and is updated. */\n get isUpdate() {\n return this.oldValue !== undefined\n && this.newValue !== undefined;\n }\n}\nexports.Difference = Difference;\nclass PropertyDifference extends Difference {\n constructor(oldValue, newValue, args) {\n super(oldValue, newValue);\n this.changeImpact = args.changeImpact;\n }\n}\nexports.PropertyDifference = PropertyDifference;\nclass DifferenceCollection {\n constructor(diffs) {\n this.diffs = diffs;\n }\n get changes() {\n return onlyChanges(this.diffs);\n }\n get differenceCount() {\n return Object.values(this.changes).length;\n }\n get(logicalId) {\n const ret = this.diffs[logicalId];\n if (!ret) {\n throw new Error(`No object with logical ID '${logicalId}'`);\n }\n return ret;\n }\n get logicalIds() {\n return Object.keys(this.changes);\n }\n /**\n * Returns a new TemplateDiff which only contains changes for which `predicate`\n * returns `true`.\n */\n filter(predicate) {\n const newChanges = {};\n for (const id of Object.keys(this.changes)) {\n const diff = this.changes[id];\n if (predicate(diff)) {\n newChanges[id] = diff;\n }\n }\n return new DifferenceCollection(newChanges);\n }\n /**\n * Invokes `cb` for all changes in this collection.\n *\n * Changes will be sorted as follows:\n * - Removed\n * - Added\n * - Updated\n * - Others\n *\n * @param cb\n */\n forEachDifference(cb) {\n const removed = new Array();\n const added = new Array();\n const updated = new Array();\n const others = new Array();\n for (const logicalId of this.logicalIds) {\n const change = this.changes[logicalId];\n if (change.isAddition) {\n added.push({ logicalId, change });\n }\n else if (change.isRemoval) {\n removed.push({ logicalId, change });\n }\n else if (change.isUpdate) {\n updated.push({ logicalId, change });\n }\n else if (change.isDifferent) {\n others.push({ logicalId, change });\n }\n }\n removed.forEach(v => cb(v.logicalId, v.change));\n added.forEach(v => cb(v.logicalId, v.change));\n updated.forEach(v => cb(v.logicalId, v.change));\n others.forEach(v => cb(v.logicalId, v.change));\n }\n}\nexports.DifferenceCollection = DifferenceCollection;\nclass ConditionDifference extends Difference {\n}\nexports.ConditionDifference = ConditionDifference;\nclass MappingDifference extends Difference {\n}\nexports.MappingDifference = MappingDifference;\nclass MetadataDifference extends Difference {\n}\nexports.MetadataDifference = MetadataDifference;\nclass OutputDifference extends Difference {\n}\nexports.OutputDifference = OutputDifference;\nclass ParameterDifference extends Difference {\n}\nexports.ParameterDifference = ParameterDifference;\nvar ResourceImpact;\n(function (ResourceImpact) {\n /** The existing physical resource will be updated */\n ResourceImpact[\"WILL_UPDATE\"] = \"WILL_UPDATE\";\n /** A new physical resource will be created */\n ResourceImpact[\"WILL_CREATE\"] = \"WILL_CREATE\";\n /** The existing physical resource will be replaced */\n ResourceImpact[\"WILL_REPLACE\"] = \"WILL_REPLACE\";\n /** The existing physical resource may be replaced */\n ResourceImpact[\"MAY_REPLACE\"] = \"MAY_REPLACE\";\n /** The existing physical resource will be destroyed */\n ResourceImpact[\"WILL_DESTROY\"] = \"WILL_DESTROY\";\n /** The existing physical resource will be removed from CloudFormation supervision */\n ResourceImpact[\"WILL_ORPHAN\"] = \"WILL_ORPHAN\";\n /** There is no change in this resource */\n ResourceImpact[\"NO_CHANGE\"] = \"NO_CHANGE\";\n})(ResourceImpact || (exports.ResourceImpact = ResourceImpact = {}));\n/**\n * This function can be used as a reducer to obtain the resource-level impact of a list\n * of property-level impacts.\n * @param one the current worst impact so far.\n * @param two the new impact being considered (can be undefined, as we may not always be\n * able to determine some peroperty's impact).\n */\nfunction worstImpact(one, two) {\n if (!two) {\n return one;\n }\n const badness = {\n [ResourceImpact.NO_CHANGE]: 0,\n [ResourceImpact.WILL_UPDATE]: 1,\n [ResourceImpact.WILL_CREATE]: 2,\n [ResourceImpact.WILL_ORPHAN]: 3,\n [ResourceImpact.MAY_REPLACE]: 4,\n [ResourceImpact.WILL_REPLACE]: 5,\n [ResourceImpact.WILL_DESTROY]: 6,\n };\n return badness[one] > badness[two] ? one : two;\n}\n/**\n * Change to a single resource between two CloudFormation templates\n *\n * This class can be mutated after construction.\n */\nclass ResourceDifference {\n constructor(oldValue, newValue, args) {\n this.oldValue = oldValue;\n this.newValue = newValue;\n this.resourceTypes = args.resourceType;\n this.propertyDiffs = args.propertyDiffs;\n this.otherDiffs = args.otherDiffs;\n this.isAddition = oldValue === undefined;\n this.isRemoval = newValue === undefined;\n }\n get oldProperties() {\n return this.oldValue && this.oldValue.Properties;\n }\n get newProperties() {\n return this.newValue && this.newValue.Properties;\n }\n /**\n * Whether this resource was modified at all\n */\n get isDifferent() {\n return this.differenceCount > 0 || this.oldResourceType !== this.newResourceType;\n }\n /**\n * Whether the resource was updated in-place\n */\n get isUpdate() {\n return this.isDifferent && !this.isAddition && !this.isRemoval;\n }\n get oldResourceType() {\n return this.resourceTypes.oldType;\n }\n get newResourceType() {\n return this.resourceTypes.newType;\n }\n /**\n * All actual property updates\n */\n get propertyUpdates() {\n return onlyChanges(this.propertyDiffs);\n }\n /**\n * All actual \"other\" updates\n */\n get otherChanges() {\n return onlyChanges(this.otherDiffs);\n }\n /**\n * Return whether the resource type was changed in this diff\n *\n * This is not a valid operation in CloudFormation but to be defensive we're going\n * to be aware of it anyway.\n */\n get resourceTypeChanged() {\n return (this.resourceTypes.oldType !== undefined\n && this.resourceTypes.newType !== undefined\n && this.resourceTypes.oldType !== this.resourceTypes.newType);\n }\n /**\n * Return the resource type if it was unchanged\n *\n * If the resource type was changed, it's an error to call this.\n */\n get resourceType() {\n if (this.resourceTypeChanged) {\n throw new Error('Cannot get .resourceType, because the type was changed');\n }\n return this.resourceTypes.oldType || this.resourceTypes.newType;\n }\n /**\n * Replace a PropertyChange in this object\n *\n * This affects the property diff as it is summarized to users, but it DOES\n * NOT affect either the \"oldValue\" or \"newValue\" values; those still contain\n * the actual template values as provided by the user (they might still be\n * used for downstream processing).\n */\n setPropertyChange(propertyName, change) {\n this.propertyDiffs[propertyName] = change;\n }\n get changeImpact() {\n // Check the Type first\n if (this.resourceTypes.oldType !== this.resourceTypes.newType) {\n if (this.resourceTypes.oldType === undefined) {\n return ResourceImpact.WILL_CREATE;\n }\n if (this.resourceTypes.newType === undefined) {\n return this.oldValue.DeletionPolicy === 'Retain'\n ? ResourceImpact.WILL_ORPHAN\n : ResourceImpact.WILL_DESTROY;\n }\n return ResourceImpact.WILL_REPLACE;\n }\n // Base impact (before we mix in the worst of the property impacts);\n // WILL_UPDATE if we have \"other\" changes, NO_CHANGE if there are no \"other\" changes.\n const baseImpact = Object.keys(this.otherChanges).length > 0 ? ResourceImpact.WILL_UPDATE : ResourceImpact.NO_CHANGE;\n return Object.values(this.propertyDiffs)\n .map(elt => elt.changeImpact)\n .reduce(worstImpact, baseImpact);\n }\n /**\n * Count of actual differences (not of elements)\n */\n get differenceCount() {\n return Object.values(this.propertyUpdates).length\n + Object.values(this.otherChanges).length;\n }\n /**\n * Invoke a callback for each actual difference\n */\n forEachDifference(cb) {\n for (const key of Object.keys(this.propertyUpdates).sort()) {\n cb('Property', key, this.propertyUpdates[key]);\n }\n for (const key of Object.keys(this.otherChanges).sort()) {\n cb('Other', key, this.otherDiffs[key]);\n }\n }\n}\nexports.ResourceDifference = ResourceDifference;\nfunction isPropertyDifference(diff) {\n return diff.changeImpact !== undefined;\n}\nexports.isPropertyDifference = isPropertyDifference;\n/**\n * Filter a map of IDifferences down to only retain the actual changes\n */\nfunction onlyChanges(xs) {\n const ret = {};\n for (const [key, diff] of Object.entries(xs)) {\n if (diff.isDifferent) {\n ret[key] = diff;\n }\n }\n return ret;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBd0M7QUFDeEMsb0VBQW9IO0FBQ3BILGlDQUFzRDtBQUN0RCxvREFBZ0Q7QUFDaEQsOEVBQXlFO0FBSXpFLGlFQUFpRTtBQUNqRSxNQUFhLFlBQVk7SUF1QnZCLFlBQVksSUFBbUI7UUFDN0IsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUssU0FBUyxFQUFFO1lBQy9DLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7U0FDL0Q7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUNyQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHdCQUFVLENBQUM7WUFDL0IsZUFBZSxFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyx3QkFBVSxDQUFDLHFCQUFxQixDQUFDO1lBQ3BGLGVBQWUsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsd0JBQVUsQ0FBQyxxQkFBcUIsQ0FBQztTQUNyRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSw2Q0FBb0IsQ0FBQztZQUNuRCx5QkFBeUIsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyx5Q0FBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRywwQkFBMEIsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyx5Q0FBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsRyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyx5Q0FBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZHLDBCQUEwQixFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLHlDQUFvQixDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDMUcsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN4QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFFZCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxTQUFTLEVBQUU7WUFDL0MsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUNaO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNsQyxLQUFLLElBQUksQ0FBQyxDQUFDO1NBQ1o7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQ2hDLEtBQUssSUFBSSxDQUFDLENBQUM7U0FDWjtRQUVELEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN6QyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDdkMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ3ZDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUN0QyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUM7UUFDekMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO1FBQ3hDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztRQUV0QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLG9CQUFvQjtRQUM3QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztJQUN0RixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLHFCQUFxQjtRQUM5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssNEJBQTRCLENBQUMsYUFBcUM7UUFDeEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQWtCLENBQUM7UUFFeEMsS0FBSyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3hGLElBQUksY0FBYyxDQUFDLG1CQUFtQixFQUFFO2dCQUN0QywwRkFBMEY7Z0JBQzFGLFNBQVM7YUFDVjtZQUVELElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFO2dCQUNuQyxTQUFTO2FBQ1Y7WUFFRCxNQUFNLFlBQVksR0FBRyxJQUFBLHdCQUFpQixFQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDO1lBQ3pGLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMvRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLElBQUkseUNBQW9CLENBQUMsSUFBSSxDQUFDO2dCQUN6RSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtvQkFDNUMsR0FBRyxDQUFDLElBQUksQ0FBQzt3QkFDUCxpQkFBaUI7d0JBQ2pCLFlBQVk7d0JBQ1osWUFBWSxFQUFFLGNBQWMsQ0FBQyxZQUFZO3dCQUN6QyxZQUFZLEVBQUUsZ0JBQWdCO3dCQUM5QixRQUFRLEVBQUUsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDLFlBQVksQ0FBQzt3QkFDdEQsUUFBUSxFQUFFLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxZQUFZLENBQUM7cUJBQ3ZELENBQUMsQ0FBQztpQkFDSjthQUNGO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLDRCQUE0QixDQUFDLGFBQXFDO1FBQ3hFLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFrQixDQUFDO1FBRXhDLEtBQUssTUFBTSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN4RixJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUFFLFNBQVM7YUFBRTtZQUVsQyxNQUFNLFdBQVcsR0FBRztnQkFDbEIsYUFBYSxFQUFFLGNBQWMsQ0FBQyxhQUFhO2dCQUMzQyxhQUFhLEVBQUUsY0FBYyxDQUFDLGFBQWE7Z0JBQzNDLGlCQUFpQjthQUNsQixDQUFDO1lBRUYsb0dBQW9HO1lBQ3BHLElBQUksY0FBYyxDQUFDLG1CQUFtQixFQUFFO2dCQUN0QyxzQkFBc0I7Z0JBQ3RCLElBQUksY0FBYyxDQUFDLGVBQWUsRUFBRTtvQkFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLHdCQUFpQixFQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDM0UsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLEVBQUU7d0JBQ3JGLEdBQUcsQ0FBQyxJQUFJLENBQUM7NEJBQ1AsR0FBRyxXQUFXOzRCQUNkLGFBQWEsRUFBRSxTQUFTOzRCQUN4QixZQUFZLEVBQUUsY0FBYyxDQUFDLGVBQWdCOzRCQUM3QyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsYUFBYzt5QkFDOUMsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO2dCQUVELElBQUksY0FBYyxDQUFDLGVBQWUsRUFBRTtvQkFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLHdCQUFpQixFQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDM0UsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLEVBQUU7d0JBQ3JGLEdBQUcsQ0FBQyxJQUFJLENBQUM7NEJBQ1AsR0FBRyxXQUFXOzRCQUNkLGFBQWEsRUFBRSxTQUFTOzRCQUN4QixZQUFZLEVBQUUsY0FBYyxDQUFDLGVBQWdCOzRCQUM3QyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsYUFBYzt5QkFDOUMsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxhQUFhLEdBQUcsSUFBQSx3QkFBaUIsRUFBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JFLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQUU7b0JBQy9FLEdBQUcsQ0FBQyxJQUFJLENBQUM7d0JBQ1AsR0FBRyxXQUFXO3dCQUNkLFlBQVksRUFBRSxjQUFjLENBQUMsWUFBWTt3QkFDekMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxhQUFjO3FCQUMzQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtTQUNGO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU8sdUJBQXVCLENBQUMsR0FBa0IsRUFBRSxhQUEwQztRQUM1RixPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSx5Q0FBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRixDQUFDO0NBQ0Y7QUFyTUQsb0NBcU1DO0FBbUZEOztHQUVHO0FBQ0gsTUFBYSxVQUFVO0lBUXJCOzs7T0FHRztJQUNILFlBQTRCLFFBQStCLEVBQWtCLFFBQStCO1FBQWhGLGFBQVEsR0FBUixRQUFRLENBQXVCO1FBQWtCLGFBQVEsR0FBUixRQUFRLENBQXVCO1FBQzFHLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3BELE1BQU0sSUFBSSx1QkFBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLDJDQUEyQyxFQUFFLENBQUMsQ0FBQztTQUNwRjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFBLGdCQUFTLEVBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7SUFDckMsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsaUZBQWlGO0lBQ2pGLElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUztlQUM3QixJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFsQ0QsZ0NBa0NDO0FBRUQsTUFBYSxrQkFBOEIsU0FBUSxVQUFxQjtJQUd0RSxZQUFZLFFBQStCLEVBQUUsUUFBK0IsRUFBRSxJQUF1QztRQUNuSCxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUFQRCxnREFPQztBQUVELE1BQWEsb0JBQW9CO0lBQy9CLFlBQTZCLEtBQWlDO1FBQWpDLFVBQUssR0FBTCxLQUFLLENBQTRCO0lBQUcsQ0FBQztJQUVsRSxJQUFXLE9BQU87UUFDaEIsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDNUMsQ0FBQztJQUVNLEdBQUcsQ0FBQyxTQUFpQjtRQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixTQUFTLEdBQUcsQ0FBQyxDQUFDO1NBQUU7UUFDMUUsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxTQUEyQztRQUN2RCxNQUFNLFVBQVUsR0FBK0IsRUFBRyxDQUFDO1FBQ25ELEtBQUssTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUU5QixJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkIsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUN2QjtTQUNGO1FBRUQsT0FBTyxJQUFJLG9CQUFvQixDQUFPLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksaUJBQWlCLENBQUMsRUFBeUM7UUFDaEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQW9DLENBQUM7UUFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQW9DLENBQUM7UUFDNUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQW9DLENBQUM7UUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQW9DLENBQUM7UUFFN0QsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3ZDLE1BQU0sTUFBTSxHQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFFLENBQUM7WUFDM0MsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUNyQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDbkM7aUJBQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDckM7aUJBQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDckM7aUJBQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO2dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDcEM7U0FDRjtRQUVELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0Y7QUF6RUQsb0RBeUVDO0FBc0JELE1BQWEsbUJBQW9CLFNBQVEsVUFBcUI7Q0FFN0Q7QUFGRCxrREFFQztBQUdELE1BQWEsaUJBQWtCLFNBQVEsVUFBbUI7Q0FFekQ7QUFGRCw4Q0FFQztBQUdELE1BQWEsa0JBQW1CLFNBQVEsVUFBb0I7Q0FFM0Q7QUFGRCxnREFFQztBQUdELE1BQWEsZ0JBQWlCLFNBQVEsVUFBa0I7Q0FFdkQ7QUFGRCw0Q0FFQztBQUdELE1BQWEsbUJBQW9CLFNBQVEsVUFBcUI7Q0FFN0Q7QUFGRCxrREFFQztBQUVELElBQVksY0FlWDtBQWZELFdBQVksY0FBYztJQUN4QixxREFBcUQ7SUFDckQsNkNBQTJCLENBQUE7SUFDM0IsOENBQThDO0lBQzlDLDZDQUEyQixDQUFBO0lBQzNCLHNEQUFzRDtJQUN0RCwrQ0FBNkIsQ0FBQTtJQUM3QixxREFBcUQ7SUFDckQsNkNBQTJCLENBQUE7SUFDM0IsdURBQXVEO0lBQ3ZELCtDQUE2QixDQUFBO0lBQzdCLHFGQUFxRjtJQUNyRiw2Q0FBMkIsQ0FBQTtJQUMzQiwwQ0FBMEM7SUFDMUMseUNBQXVCLENBQUE7QUFDekIsQ0FBQyxFQWZXLGNBQWMsOEJBQWQsY0FBYyxRQWV6QjtBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsV0FBVyxDQUFDLEdBQW1CLEVBQUUsR0FBb0I7SUFDNUQsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUFFLE9BQU8sR0FBRyxDQUFDO0tBQUU7SUFDekIsTUFBTSxPQUFPLEdBQUc7UUFDZCxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzdCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMvQixDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQy9CLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNoQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0tBQ2pDLENBQUM7SUFDRixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ2pELENBQUM7QUFTRDs7OztHQUlHO0FBQ0gsTUFBYSxrQkFBa0I7SUFvQjdCLFlBQ2tCLFFBQThCLEVBQzlCLFFBQThCLEVBQzlDLElBSUM7UUFOZSxhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQU85QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUVsQyxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUM7UUFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLEtBQUssU0FBUyxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUNuRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDakUsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsWUFBWTtRQUNyQixPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxLQUFLLFNBQVM7ZUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssU0FBUztlQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyxZQUFZO1FBQ3JCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztTQUMzRTtRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFRLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxpQkFBaUIsQ0FBQyxZQUFvQixFQUFFLE1BQStCO1FBQzVFLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFXLFlBQVk7UUFDckIsdUJBQXVCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUU7WUFDN0QsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7Z0JBQUUsT0FBTyxjQUFjLENBQUMsV0FBVyxDQUFDO2FBQUU7WUFDcEYsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7Z0JBQzVDLE9BQU8sSUFBSSxDQUFDLFFBQVMsQ0FBQyxjQUFjLEtBQUssUUFBUTtvQkFDL0MsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxXQUFXO29CQUM1QixDQUFDLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQzthQUNqQztZQUNELE9BQU8sY0FBYyxDQUFDLFlBQVksQ0FBQztTQUNwQztRQUVELG9FQUFvRTtRQUNwRSxxRkFBcUY7UUFDckYsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUVySCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzthQUNyQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO2FBQzVCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTTtjQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCLENBQUMsRUFBdUc7UUFDOUgsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMxRCxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3ZELEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7Q0FDRjtBQTdKRCxnREE2SkM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBSSxJQUFtQjtJQUN6RCxPQUFRLElBQThCLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQztBQUNwRSxDQUFDO0FBRkQsb0RBRUM7QUFFRDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUE4QixFQUFzQjtJQUN0RSxNQUFNLEdBQUcsR0FBeUIsRUFBRSxDQUFDO0lBQ3JDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQzVDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ2pCO0tBQ0Y7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3NlcnRpb25FcnJvciB9IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBQcm9wZXJ0eVNjcnV0aW55VHlwZSwgUmVzb3VyY2VTY3J1dGlueVR5cGUsIFJlc291cmNlIGFzIFJlc291cmNlTW9kZWwgfSBmcm9tICdAYXdzLWNkay9zZXJ2aWNlLXNwZWMtdHlwZXMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBsb2FkUmVzb3VyY2VNb2RlbCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBJYW1DaGFuZ2VzIH0gZnJvbSAnLi4vaWFtL2lhbS1jaGFuZ2VzJztcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXBDaGFuZ2VzIH0gZnJvbSAnLi4vbmV0d29yay9zZWN1cml0eS1ncm91cC1jaGFuZ2VzJztcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlNYXAgPSB7W2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKiBTZW1hbnRpYyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZXMuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVEaWZmIGltcGxlbWVudHMgSVRlbXBsYXRlRGlmZiB7XG4gIHB1YmxpYyBhd3NUZW1wbGF0ZUZvcm1hdFZlcnNpb24/OiBEaWZmZXJlbmNlPHN0cmluZz47XG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IERpZmZlcmVuY2U8c3RyaW5nPjtcbiAgcHVibGljIHRyYW5zZm9ybT86IERpZmZlcmVuY2U8c3RyaW5nPjtcbiAgcHVibGljIGNvbmRpdGlvbnM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPENvbmRpdGlvbiwgQ29uZGl0aW9uRGlmZmVyZW5jZT47XG4gIHB1YmxpYyBtYXBwaW5nczogRGlmZmVyZW5jZUNvbGxlY3Rpb248TWFwcGluZywgTWFwcGluZ0RpZmZlcmVuY2U+O1xuICBwdWJsaWMgbWV0YWRhdGE6IERpZmZlcmVuY2VDb2xsZWN0aW9uPE1ldGFkYXRhLCBNZXRhZGF0YURpZmZlcmVuY2U+O1xuICBwdWJsaWMgb3V0cHV0czogRGlmZmVyZW5jZUNvbGxlY3Rpb248T3V0cHV0LCBPdXRwdXREaWZmZXJlbmNlPjtcbiAgcHVibGljIHBhcmFtZXRlcnM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPFBhcmFtZXRlciwgUGFyYW1ldGVyRGlmZmVyZW5jZT47XG4gIHB1YmxpYyByZXNvdXJjZXM6IERpZmZlcmVuY2VDb2xsZWN0aW9uPFJlc291cmNlLCBSZXNvdXJjZURpZmZlcmVuY2U+O1xuICAvKiogVGhlIGRpZmZlcmVuY2VzIGluIHVua25vd24vdW5leHBlY3RlZCBwYXJ0cyBvZiB0aGUgdGVtcGxhdGUgKi9cbiAgcHVibGljIHVua25vd246IERpZmZlcmVuY2VDb2xsZWN0aW9uPGFueSwgRGlmZmVyZW5jZTxhbnk+PjtcblxuICAvKipcbiAgICogQ2hhbmdlcyB0byBJQU0gcG9saWNpZXNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpYW1DaGFuZ2VzOiBJYW1DaGFuZ2VzO1xuXG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRvIFNlY3VyaXR5IEdyb3VwIGluZ3Jlc3MgYW5kIGVncmVzcyBydWxlc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBDaGFuZ2VzOiBTZWN1cml0eUdyb3VwQ2hhbmdlcztcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBJVGVtcGxhdGVEaWZmKSB7XG4gICAgaWYgKGFyZ3MuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uID0gYXJncy5hd3NUZW1wbGF0ZUZvcm1hdFZlcnNpb247XG4gICAgfVxuICAgIGlmIChhcmdzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBhcmdzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAoYXJncy50cmFuc2Zvcm0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy50cmFuc2Zvcm0gPSBhcmdzLnRyYW5zZm9ybTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmRpdGlvbnMgPSBhcmdzLmNvbmRpdGlvbnMgfHwgbmV3IERpZmZlcmVuY2VDb2xsZWN0aW9uKHt9KTtcbiAgICB0aGlzLm1hcHBpbmdzID0gYXJncy5tYXBwaW5ncyB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuICAgIHRoaXMubWV0YWRhdGEgPSBhcmdzLm1ldGFkYXRhIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5vdXRwdXRzID0gYXJncy5vdXRwdXRzIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5wYXJhbWV0ZXJzID0gYXJncy5wYXJhbWV0ZXJzIHx8IG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbih7fSk7XG4gICAgdGhpcy5yZXNvdXJjZXMgPSBhcmdzLnJlc291cmNlcyB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuICAgIHRoaXMudW5rbm93biA9IGFyZ3MudW5rbm93biB8fCBuZXcgRGlmZmVyZW5jZUNvbGxlY3Rpb24oe30pO1xuXG4gICAgdGhpcy5pYW1DaGFuZ2VzID0gbmV3IElhbUNoYW5nZXMoe1xuICAgICAgcHJvcGVydHlDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVQcm9wZXJ0eUNoYW5nZXMoSWFtQ2hhbmdlcy5JYW1Qcm9wZXJ0eVNjcnV0aW5pZXMpLFxuICAgICAgcmVzb3VyY2VDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVSZXNvdXJjZUNoYW5nZXMoSWFtQ2hhbmdlcy5JYW1SZXNvdXJjZVNjcnV0aW5pZXMpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWN1cml0eUdyb3VwQ2hhbmdlcyA9IG5ldyBTZWN1cml0eUdyb3VwQ2hhbmdlcyh7XG4gICAgICBlZ3Jlc3NSdWxlUHJvcGVydHlDaGFuZ2VzOiB0aGlzLnNjcnV0aW5pemFibGVQcm9wZXJ0eUNoYW5nZXMoW1Byb3BlcnR5U2NydXRpbnlUeXBlLkVncmVzc1J1bGVzXSksXG4gICAgICBpbmdyZXNzUnVsZVByb3BlcnR5Q2hhbmdlczogdGhpcy5zY3J1dGluaXphYmxlUHJvcGVydHlDaGFuZ2VzKFtQcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmdyZXNzUnVsZXNdKSxcbiAgICAgIGVncmVzc1J1bGVSZXNvdXJjZUNoYW5nZXM6IHRoaXMuc2NydXRpbml6YWJsZVJlc291cmNlQ2hhbmdlcyhbUmVzb3VyY2VTY3J1dGlueVR5cGUuRWdyZXNzUnVsZVJlc291cmNlXSksXG4gICAgICBpbmdyZXNzUnVsZVJlc291cmNlQ2hhbmdlczogdGhpcy5zY3J1dGluaXphYmxlUmVzb3VyY2VDaGFuZ2VzKFtSZXNvdXJjZVNjcnV0aW55VHlwZS5JbmdyZXNzUnVsZVJlc291cmNlXSksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuXG4gICAgaWYgKHRoaXMuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLnRyYW5zZm9ybSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cblxuICAgIGNvdW50ICs9IHRoaXMuY29uZGl0aW9ucy5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5tYXBwaW5ncy5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5tZXRhZGF0YS5kaWZmZXJlbmNlQ291bnQ7XG4gICAgY291bnQgKz0gdGhpcy5vdXRwdXRzLmRpZmZlcmVuY2VDb3VudDtcbiAgICBjb3VudCArPSB0aGlzLnBhcmFtZXRlcnMuZGlmZmVyZW5jZUNvdW50O1xuICAgIGNvdW50ICs9IHRoaXMucmVzb3VyY2VzLmRpZmZlcmVuY2VDb3VudDtcbiAgICBjb3VudCArPSB0aGlzLnVua25vd24uZGlmZmVyZW5jZUNvdW50O1xuXG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpZmZlcmVuY2VDb3VudCA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIHBlcm1pc3Npb25zIG9iamVjdHMgaW52b2x2ZSBhIGJyb2FkZW5pbmcgb2YgcGVybWlzc2lvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnNCcm9hZGVuZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWFtQ2hhbmdlcy5wZXJtaXNzaW9uc0Jyb2FkZW5lZCB8fCB0aGlzLnNlY3VyaXR5R3JvdXBDaGFuZ2VzLnJ1bGVzQWRkZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBwZXJtaXNzaW9ucyBvYmplY3RzIGhhdmUgY2hhbmdlZFxuICAgKi9cbiAgcHVibGljIGdldCBwZXJtaXNzaW9uc0FueUNoYW5nZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWFtQ2hhbmdlcy5oYXNDaGFuZ2VzIHx8IHRoaXMuc2VjdXJpdHlHcm91cENoYW5nZXMuaGFzQ2hhbmdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIHByb3BlcnR5IGNoYW5nZXMgb2YgYSBnaXZlbiBzY3J1dGlueSB0eXBlXG4gICAqXG4gICAqIFdlIGRvbid0IGp1c3QgbG9vayBhdCBwcm9wZXJ0eSB1cGRhdGVzOyB3ZSBhbHNvIGxvb2sgYXQgcmVzb3VyY2UgYWRkaXRpb25zIGFuZCBkZWxldGlvbnMgKGluIHdoaWNoXG4gICAqIGNhc2UgdGhlcmUgaXMgbm8gZnVydGhlciBkZXRhaWwgb24gcHJvcGVydHkgdmFsdWVzKSwgYW5kIHJlc291cmNlIHR5cGUgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgc2NydXRpbml6YWJsZVByb3BlcnR5Q2hhbmdlcyhzY3J1dGlueVR5cGVzOiBQcm9wZXJ0eVNjcnV0aW55VHlwZVtdKTogUHJvcGVydHlDaGFuZ2VbXSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFByb3BlcnR5Q2hhbmdlPigpO1xuXG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2VMb2dpY2FsSWQsIHJlc291cmNlQ2hhbmdlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnJlc291cmNlcy5jaGFuZ2VzKSkge1xuICAgICAgaWYgKHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgICAgLy8gd2UgaWdub3JlIHJlc291cmNlIHR5cGUgY2hhbmdlcyBoZXJlLCBhbmQgaGFuZGxlIHRoZW0gaW4gc2NydXRpbml6YWJsZVJlc291cmNlQ2hhbmdlcygpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc291cmNlQ2hhbmdlLm5ld1Jlc291cmNlVHlwZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3VHlwZVByb3BzID0gbG9hZFJlc291cmNlTW9kZWwocmVzb3VyY2VDaGFuZ2UubmV3UmVzb3VyY2VUeXBlKT8ucHJvcGVydGllcyB8fCB7fTtcbiAgICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgcHJvcF0gb2YgT2JqZWN0LmVudHJpZXMobmV3VHlwZVByb3BzKSkge1xuICAgICAgICBjb25zdCBwcm9wU2NydXRpbnlUeXBlID0gcHJvcC5zY3J1dGluaXphYmxlIHx8IFByb3BlcnR5U2NydXRpbnlUeXBlLk5vbmU7XG4gICAgICAgIGlmIChzY3J1dGlueVR5cGVzLmluY2x1ZGVzKHByb3BTY3J1dGlueVR5cGUpKSB7XG4gICAgICAgICAgcmV0LnB1c2goe1xuICAgICAgICAgICAgcmVzb3VyY2VMb2dpY2FsSWQsXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICByZXNvdXJjZVR5cGU6IHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZSxcbiAgICAgICAgICAgIHNjcnV0aW55VHlwZTogcHJvcFNjcnV0aW55VHlwZSxcbiAgICAgICAgICAgIG9sZFZhbHVlOiByZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzPy5bcHJvcGVydHlOYW1lXSxcbiAgICAgICAgICAgIG5ld1ZhbHVlOiByZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzPy5bcHJvcGVydHlOYW1lXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFsbCByZXNvdXJjZSBjaGFuZ2VzIG9mIGEgZ2l2ZW4gc2NydXRpbnkgdHlwZVxuICAgKlxuICAgKiBXZSBkb24ndCBqdXN0IGxvb2sgYXQgcmVzb3VyY2UgdXBkYXRlczsgd2UgYWxzbyBsb29rIGF0IHJlc291cmNlIGFkZGl0aW9ucyBhbmQgZGVsZXRpb25zIChpbiB3aGljaFxuICAgKiBjYXNlIHRoZXJlIGlzIG5vIGZ1cnRoZXIgZGV0YWlsIG9uIHByb3BlcnR5IHZhbHVlcyksIGFuZCByZXNvdXJjZSB0eXBlIGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIHNjcnV0aW5pemFibGVSZXNvdXJjZUNoYW5nZXMoc2NydXRpbnlUeXBlczogUmVzb3VyY2VTY3J1dGlueVR5cGVbXSk6IFJlc291cmNlQ2hhbmdlW10ge1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxSZXNvdXJjZUNoYW5nZT4oKTtcblxuICAgIGZvciAoY29uc3QgW3Jlc291cmNlTG9naWNhbElkLCByZXNvdXJjZUNoYW5nZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZXNvdXJjZXMuY2hhbmdlcykpIHtcbiAgICAgIGlmICghcmVzb3VyY2VDaGFuZ2UpIHsgY29udGludWU7IH1cblxuICAgICAgY29uc3QgY29tbW9uUHJvcHMgPSB7XG4gICAgICAgIG9sZFByb3BlcnRpZXM6IHJlc291cmNlQ2hhbmdlLm9sZFByb3BlcnRpZXMsXG4gICAgICAgIG5ld1Byb3BlcnRpZXM6IHJlc291cmNlQ2hhbmdlLm5ld1Byb3BlcnRpZXMsXG4gICAgICAgIHJlc291cmNlTG9naWNhbElkLFxuICAgICAgfTtcblxuICAgICAgLy8gY2hhbmdlcyB0byB0aGUgVHlwZSBvZiByZXNvdXJjZXMgY2FuIGhhcHBlbiB3aGVuIG1pZ3JhdGluZyBmcm9tIENGTiB0ZW1wbGF0ZXMgdGhhdCB1c2UgVHJhbnNmb3Jtc1xuICAgICAgaWYgKHJlc291cmNlQ2hhbmdlLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgICAgLy8gVHJlYXQgYXMgREVMRVRFK0FERFxuICAgICAgICBpZiAocmVzb3VyY2VDaGFuZ2Uub2xkUmVzb3VyY2VUeXBlKSB7XG4gICAgICAgICAgY29uc3Qgb2xkUmVzb3VyY2VNb2RlbCA9IGxvYWRSZXNvdXJjZU1vZGVsKHJlc291cmNlQ2hhbmdlLm9sZFJlc291cmNlVHlwZSk7XG4gICAgICAgICAgaWYgKG9sZFJlc291cmNlTW9kZWwgJiYgdGhpcy5yZXNvdXJjZUlzU2NydXRpbml6YWJsZShvbGRSZXNvdXJjZU1vZGVsLCBzY3J1dGlueVR5cGVzKSkge1xuICAgICAgICAgICAgcmV0LnB1c2goe1xuICAgICAgICAgICAgICAuLi5jb21tb25Qcm9wcyxcbiAgICAgICAgICAgICAgbmV3UHJvcGVydGllczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICByZXNvdXJjZVR5cGU6IHJlc291cmNlQ2hhbmdlLm9sZFJlc291cmNlVHlwZSEsXG4gICAgICAgICAgICAgIHNjcnV0aW55VHlwZTogb2xkUmVzb3VyY2VNb2RlbC5zY3J1dGluaXphYmxlISxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNvdXJjZUNoYW5nZS5uZXdSZXNvdXJjZVR5cGUpIHtcbiAgICAgICAgICBjb25zdCBuZXdSZXNvdXJjZU1vZGVsID0gbG9hZFJlc291cmNlTW9kZWwocmVzb3VyY2VDaGFuZ2UubmV3UmVzb3VyY2VUeXBlKTtcbiAgICAgICAgICBpZiAobmV3UmVzb3VyY2VNb2RlbCAmJiB0aGlzLnJlc291cmNlSXNTY3J1dGluaXphYmxlKG5ld1Jlc291cmNlTW9kZWwsIHNjcnV0aW55VHlwZXMpKSB7XG4gICAgICAgICAgICByZXQucHVzaCh7XG4gICAgICAgICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICAgICAgICBvbGRQcm9wZXJ0aWVzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJlc291cmNlVHlwZTogcmVzb3VyY2VDaGFuZ2UubmV3UmVzb3VyY2VUeXBlISxcbiAgICAgICAgICAgICAgc2NydXRpbnlUeXBlOiBuZXdSZXNvdXJjZU1vZGVsLnNjcnV0aW5pemFibGUhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXNvdXJjZU1vZGVsID0gbG9hZFJlc291cmNlTW9kZWwocmVzb3VyY2VDaGFuZ2UucmVzb3VyY2VUeXBlKTtcbiAgICAgICAgaWYgKHJlc291cmNlTW9kZWwgJiYgdGhpcy5yZXNvdXJjZUlzU2NydXRpbml6YWJsZShyZXNvdXJjZU1vZGVsLCBzY3J1dGlueVR5cGVzKSkge1xuICAgICAgICAgIHJldC5wdXNoKHtcbiAgICAgICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICAgICAgcmVzb3VyY2VUeXBlOiByZXNvdXJjZUNoYW5nZS5yZXNvdXJjZVR5cGUsXG4gICAgICAgICAgICBzY3J1dGlueVR5cGU6IHJlc291cmNlTW9kZWwuc2NydXRpbml6YWJsZSEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvdXJjZUlzU2NydXRpbml6YWJsZShyZXM6IFJlc291cmNlTW9kZWwsIHNjcnV0aW55VHlwZXM6IEFycmF5PFJlc291cmNlU2NydXRpbnlUeXBlPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzY3J1dGlueVR5cGVzLmluY2x1ZGVzKHJlcy5zY3J1dGluaXphYmxlIHx8IFJlc291cmNlU2NydXRpbnlUeXBlLk5vbmUpO1xuICB9XG59XG5cbi8qKlxuICogQSBjaGFuZ2UgaW4gcHJvcGVydHkgdmFsdWVzXG4gKlxuICogTm90IG5lY2Vzc2FyaWx5IGFuIHVwZGF0ZSwgaXQgY291bGQgYmUgdGhhdCB0aGVyZSB1c2VkIHRvIGJlIG5vIHZhbHVlIHRoZXJlXG4gKiBiZWNhdXNlIHRoZXJlIHdhcyBubyByZXNvdXJjZSwgYW5kIG5vdyB0aGVyZSBpcyAob3IgdmljZSB2ZXJzYSkuXG4gKlxuICogVGhlcmVmb3JlLCB3ZSBqdXN0IGNvbnRhaW4gcGxhaW4gdmFsdWVzIGFuZCBub3QgYSBQcm9wZXJ0eURpZmZlcmVuY2U8YW55Pi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eUNoYW5nZSB7XG4gIC8qKlxuICAgKiBMb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZSB3aGVyZSB0aGlzIHByb3BlcnR5IGNoYW5nZSB3YXMgZm91bmRcbiAgICovXG4gIHJlc291cmNlTG9naWNhbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogU2NydXRpbnkgdHlwZSBmb3IgdGhpcyBwcm9wZXJ0eSBjaGFuZ2VcbiAgICovXG4gIHNjcnV0aW55VHlwZTogUHJvcGVydHlTY3J1dGlueVR5cGU7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgaXMgY2hhbmdpbmdcbiAgICovXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHByb3BlcnR5IHZhbHVlXG4gICAqL1xuICBvbGRWYWx1ZT86IGFueTtcblxuICAvKipcbiAgICogVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZVxuICAgKi9cbiAgbmV3VmFsdWU/OiBhbnk7XG59XG5cbi8qKlxuICogQSByZXNvdXJjZSBjaGFuZ2VcbiAqXG4gKiBFaXRoZXIgYSBjcmVhdGlvbiwgZGVsZXRpb24gb3IgdXBkYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlQ2hhbmdlIHtcbiAgLyoqXG4gICAqIExvZ2ljYWwgSUQgb2YgdGhlIHJlc291cmNlIHdoZXJlIHRoaXMgcHJvcGVydHkgY2hhbmdlIHdhcyBmb3VuZFxuICAgKi9cbiAgcmVzb3VyY2VMb2dpY2FsSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU2NydXRpbnkgdHlwZSBmb3IgdGhpcyByZXNvdXJjZSBjaGFuZ2VcbiAgICovXG4gIHNjcnV0aW55VHlwZTogUmVzb3VyY2VTY3J1dGlueVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcHJvcGVydGllcyB2YWx1ZSAobWlnaHQgYmUgdW5kZWZpbmVkIGluIGNhc2Ugb2YgY3JlYXRpb24pXG4gICAqL1xuICBvbGRQcm9wZXJ0aWVzPzogUHJvcGVydHlNYXA7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgcHJvcGVydGllcyB2YWx1ZSAobWlnaHQgYmUgdW5kZWZpbmVkIGluIGNhc2Ugb2YgZGVsZXRpb24pXG4gICAqL1xuICBuZXdQcm9wZXJ0aWVzPzogUHJvcGVydHlNYXA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpZmZlcmVuY2U8VmFsdWVUeXBlPiB7XG4gIHJlYWRvbmx5IG9sZFZhbHVlOiBWYWx1ZVR5cGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG5ld1ZhbHVlOiBWYWx1ZVR5cGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGlzRGlmZmVyZW50OiBib29sZWFuO1xuICByZWFkb25seSBpc0FkZGl0aW9uOiBib29sZWFuO1xuICByZWFkb25seSBpc1JlbW92YWw6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzVXBkYXRlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vZGVscyBhbiBlbnRpdHkgdGhhdCBjaGFuZ2VkIGJldHdlZW4gdHdvIHZlcnNpb25zIG9mIGEgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaWZmZXJlbmNlPFZhbHVlVHlwZT4gaW1wbGVtZW50cyBJRGlmZmVyZW5jZTxWYWx1ZVR5cGU+IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpcyBhbiBhY3R1YWwgZGlmZmVyZW50IG9yIHRoZSB2YWx1ZXMgYXJlIGFjdHVhbGx5IHRoZSBzYW1lXG4gICAqXG4gICAqIGlzRGlmZmVyZW50ID0+IChpc1VwZGF0ZSB8IGlzUmVtb3ZlZCB8IGlzVXBkYXRlKVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzRGlmZmVyZW50OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCB2YWx1ZSwgY2Fubm90IGJlIGVxdWFsICh0byB0aGUgc2Vuc2Ugb2YgK2RlZXBFcXVhbCspIHRvICtuZXdWYWx1ZSsuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlLCBjYW5ub3QgYmUgZXF1YWwgKHRvIHRoZSBzZW5zZSBvZiArZGVlcEVxdWFsKykgdG8gK29sZFZhbHVlKy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBvbGRWYWx1ZTogVmFsdWVUeXBlIHwgdW5kZWZpbmVkLCBwdWJsaWMgcmVhZG9ubHkgbmV3VmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6ICdvbGRWYWx1ZSBhbmQgbmV3VmFsdWUgYXJlIGJvdGggdW5kZWZpbmVkIScgfSk7XG4gICAgfVxuICAgIHRoaXMuaXNEaWZmZXJlbnQgPSAhZGVlcEVxdWFsKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gIH1cblxuICAvKiogQHJldHVybnMgK3RydWUrIGlmIHRoZSBlbGVtZW50IGlzIG5ldyB0byB0aGUgdGVtcGxhdGUuICovXG4gIHB1YmxpYyBnZXQgaXNBZGRpdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vbGRWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEByZXR1cm5zICt0cnVlKyBpZiB0aGUgZWxlbWVudCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB0ZW1wbGF0ZS4gKi9cbiAgcHVibGljIGdldCBpc1JlbW92YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyArdHJ1ZSsgaWYgdGhlIGVsZW1lbnQgd2FzIGFscmVhZHkgaW4gdGhlIHRlbXBsYXRlIGFuZCBpcyB1cGRhdGVkLiAqL1xuICBwdWJsaWMgZ2V0IGlzVXBkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9sZFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICYmIHRoaXMubmV3VmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlEaWZmZXJlbmNlPFZhbHVlVHlwZT4gZXh0ZW5kcyBEaWZmZXJlbmNlPFZhbHVlVHlwZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlSW1wYWN0PzogUmVzb3VyY2VJbXBhY3Q7XG5cbiAgY29uc3RydWN0b3Iob2xkVmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IFZhbHVlVHlwZSB8IHVuZGVmaW5lZCwgYXJnczogeyBjaGFuZ2VJbXBhY3Q/OiBSZXNvdXJjZUltcGFjdCB9KSB7XG4gICAgc3VwZXIob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLmNoYW5nZUltcGFjdCA9IGFyZ3MuY2hhbmdlSW1wYWN0O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUIGV4dGVuZHMgSURpZmZlcmVuY2U8Vj4+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkaWZmczogeyBbbG9naWNhbElkOiBzdHJpbmddOiBUIH0pIHt9XG5cbiAgcHVibGljIGdldCBjaGFuZ2VzKCk6IHsgW2xvZ2ljYWxJZDogc3RyaW5nXTogVCB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5kaWZmcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY2hhbmdlcykubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGdldChsb2dpY2FsSWQ6IHN0cmluZyk6IFQge1xuICAgIGNvbnN0IHJldCA9IHRoaXMuZGlmZnNbbG9naWNhbElkXTtcbiAgICBpZiAoIXJldCkgeyB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCB3aXRoIGxvZ2ljYWwgSUQgJyR7bG9naWNhbElkfSdgKTsgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvZ2ljYWxJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgVGVtcGxhdGVEaWZmIHdoaWNoIG9ubHkgY29udGFpbnMgY2hhbmdlcyBmb3Igd2hpY2ggYHByZWRpY2F0ZWBcbiAgICogcmV0dXJucyBgdHJ1ZWAuXG4gICAqL1xuICBwdWJsaWMgZmlsdGVyKHByZWRpY2F0ZTogKGRpZmY6IFQgfCB1bmRlZmluZWQpID0+IGJvb2xlYW4pOiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUPiB7XG4gICAgY29uc3QgbmV3Q2hhbmdlczogeyBbbG9naWNhbElkOiBzdHJpbmddOiBUIH0gPSB7IH07XG4gICAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpKSB7XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5jaGFuZ2VzW2lkXTtcblxuICAgICAgaWYgKHByZWRpY2F0ZShkaWZmKSkge1xuICAgICAgICBuZXdDaGFuZ2VzW2lkXSA9IGRpZmY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEaWZmZXJlbmNlQ29sbGVjdGlvbjxWLCBUPihuZXdDaGFuZ2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGBjYmAgZm9yIGFsbCBjaGFuZ2VzIGluIHRoaXMgY29sbGVjdGlvbi5cbiAgICpcbiAgICogQ2hhbmdlcyB3aWxsIGJlIHNvcnRlZCBhcyBmb2xsb3dzOlxuICAgKiAgLSBSZW1vdmVkXG4gICAqICAtIEFkZGVkXG4gICAqICAtIFVwZGF0ZWRcbiAgICogIC0gT3RoZXJzXG4gICAqXG4gICAqIEBwYXJhbSBjYlxuICAgKi9cbiAgcHVibGljIGZvckVhY2hEaWZmZXJlbmNlKGNiOiAobG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogVCkgPT4gYW55KTogdm9pZCB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcbiAgICBjb25zdCBhZGRlZCA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcbiAgICBjb25zdCB1cGRhdGVkID0gbmV3IEFycmF5PHsgbG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogVCB9PigpO1xuICAgIGNvbnN0IG90aGVycyA9IG5ldyBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFQgfT4oKTtcblxuICAgIGZvciAoY29uc3QgbG9naWNhbElkIG9mIHRoaXMubG9naWNhbElkcykge1xuICAgICAgY29uc3QgY2hhbmdlOiBUID0gdGhpcy5jaGFuZ2VzW2xvZ2ljYWxJZF0hO1xuICAgICAgaWYgKGNoYW5nZS5pc0FkZGl0aW9uKSB7XG4gICAgICAgIGFkZGVkLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmlzUmVtb3ZhbCkge1xuICAgICAgICByZW1vdmVkLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmlzVXBkYXRlKSB7XG4gICAgICAgIHVwZGF0ZWQucHVzaCh7IGxvZ2ljYWxJZCwgY2hhbmdlIH0pO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2UuaXNEaWZmZXJlbnQpIHtcbiAgICAgICAgb3RoZXJzLnB1c2goeyBsb2dpY2FsSWQsIGNoYW5nZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVkLmZvckVhY2godiA9PiBjYih2LmxvZ2ljYWxJZCwgdi5jaGFuZ2UpKTtcbiAgICBhZGRlZC5mb3JFYWNoKHYgPT4gY2Iodi5sb2dpY2FsSWQsIHYuY2hhbmdlKSk7XG4gICAgdXBkYXRlZC5mb3JFYWNoKHYgPT4gY2Iodi5sb2dpY2FsSWQsIHYuY2hhbmdlKSk7XG4gICAgb3RoZXJzLmZvckVhY2godiA9PiBjYih2LmxvZ2ljYWxJZCwgdi5jaGFuZ2UpKTtcbiAgfVxufVxuXG4vKipcbiAqIEFyZ3VtZW50cyBleHBlY3RlZCBieSB0aGUgY29uc3RydWN0b3Igb2YgK1RlbXBsYXRlRGlmZissIGV4dHJhY3RlZCBhcyBhbiBpbnRlcmZhY2UgZm9yIHRoZSBzYWtlXG4gKiBvZiAocmVsYXRpdmUpIGNvbmNpc2VuZXNzIG9mIHRoZSBjb25zdHJ1Y3RvcidzIHNpZ25hdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVGVtcGxhdGVEaWZmIHtcbiAgYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uPzogSURpZmZlcmVuY2U8c3RyaW5nPjtcbiAgZGVzY3JpcHRpb24/OiBJRGlmZmVyZW5jZTxzdHJpbmc+O1xuICB0cmFuc2Zvcm0/OiBJRGlmZmVyZW5jZTxzdHJpbmc+O1xuXG4gIGNvbmRpdGlvbnM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxDb25kaXRpb24sIENvbmRpdGlvbkRpZmZlcmVuY2U+O1xuICBtYXBwaW5ncz86IERpZmZlcmVuY2VDb2xsZWN0aW9uPE1hcHBpbmcsIE1hcHBpbmdEaWZmZXJlbmNlPjtcbiAgbWV0YWRhdGE/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxNZXRhZGF0YSwgTWV0YWRhdGFEaWZmZXJlbmNlPjtcbiAgb3V0cHV0cz86IERpZmZlcmVuY2VDb2xsZWN0aW9uPE91dHB1dCwgT3V0cHV0RGlmZmVyZW5jZT47XG4gIHBhcmFtZXRlcnM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxQYXJhbWV0ZXIsIFBhcmFtZXRlckRpZmZlcmVuY2U+O1xuICByZXNvdXJjZXM/OiBEaWZmZXJlbmNlQ29sbGVjdGlvbjxSZXNvdXJjZSwgUmVzb3VyY2VEaWZmZXJlbmNlPjtcblxuICB1bmtub3duPzogRGlmZmVyZW5jZUNvbGxlY3Rpb248YW55LCBJRGlmZmVyZW5jZTxhbnk+Pjtcbn1cblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uID0gYW55O1xuZXhwb3J0IGNsYXNzIENvbmRpdGlvbkRpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPENvbmRpdGlvbj4ge1xuICAvLyBUT0RPOiBkZWZpbmUgc3BlY2lmaWMgZGlmZmVyZW5jZSBhdHRyaWJ1dGVzXG59XG5cbmV4cG9ydCB0eXBlIE1hcHBpbmcgPSBhbnk7XG5leHBvcnQgY2xhc3MgTWFwcGluZ0RpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE1hcHBpbmc+IHtcbiAgLy8gVE9ETzogZGVmaW5lIHNwZWNpZmljIGRpZmZlcmVuY2UgYXR0cmlidXRlc1xufVxuXG5leHBvcnQgdHlwZSBNZXRhZGF0YSA9IGFueTtcbmV4cG9ydCBjbGFzcyBNZXRhZGF0YURpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE1ldGFkYXRhPiB7XG4gIC8vIFRPRE86IGRlZmluZSBzcGVjaWZpYyBkaWZmZXJlbmNlIGF0dHJpYnV0ZXNcbn1cblxuZXhwb3J0IHR5cGUgT3V0cHV0ID0gYW55O1xuZXhwb3J0IGNsYXNzIE91dHB1dERpZmZlcmVuY2UgZXh0ZW5kcyBEaWZmZXJlbmNlPE91dHB1dD4ge1xuICAvLyBUT0RPOiBkZWZpbmUgc3BlY2lmaWMgZGlmZmVyZW5jZSBhdHRyaWJ1dGVzXG59XG5cbmV4cG9ydCB0eXBlIFBhcmFtZXRlciA9IGFueTtcbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJEaWZmZXJlbmNlIGV4dGVuZHMgRGlmZmVyZW5jZTxQYXJhbWV0ZXI+IHtcbiAgLy8gVE9ETzogZGVmaW5lIHNwZWNpZmljIGRpZmZlcmVuY2UgYXR0cmlidXRlc1xufVxuXG5leHBvcnQgZW51bSBSZXNvdXJjZUltcGFjdCB7XG4gIC8qKiBUaGUgZXhpc3RpbmcgcGh5c2ljYWwgcmVzb3VyY2Ugd2lsbCBiZSB1cGRhdGVkICovXG4gIFdJTExfVVBEQVRFID0gJ1dJTExfVVBEQVRFJyxcbiAgLyoqIEEgbmV3IHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgY3JlYXRlZCAqL1xuICBXSUxMX0NSRUFURSA9ICdXSUxMX0NSRUFURScsXG4gIC8qKiBUaGUgZXhpc3RpbmcgcGh5c2ljYWwgcmVzb3VyY2Ugd2lsbCBiZSByZXBsYWNlZCAqL1xuICBXSUxMX1JFUExBQ0UgPSAnV0lMTF9SRVBMQUNFJyxcbiAgLyoqIFRoZSBleGlzdGluZyBwaHlzaWNhbCByZXNvdXJjZSBtYXkgYmUgcmVwbGFjZWQgKi9cbiAgTUFZX1JFUExBQ0UgPSAnTUFZX1JFUExBQ0UnLFxuICAvKiogVGhlIGV4aXN0aW5nIHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgZGVzdHJveWVkICovXG4gIFdJTExfREVTVFJPWSA9ICdXSUxMX0RFU1RST1knLFxuICAvKiogVGhlIGV4aXN0aW5nIHBoeXNpY2FsIHJlc291cmNlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIENsb3VkRm9ybWF0aW9uIHN1cGVydmlzaW9uICovXG4gIFdJTExfT1JQSEFOID0gJ1dJTExfT1JQSEFOJyxcbiAgLyoqIFRoZXJlIGlzIG5vIGNoYW5nZSBpbiB0aGlzIHJlc291cmNlICovXG4gIE5PX0NIQU5HRSA9ICdOT19DSEFOR0UnLFxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYXMgYSByZWR1Y2VyIHRvIG9idGFpbiB0aGUgcmVzb3VyY2UtbGV2ZWwgaW1wYWN0IG9mIGEgbGlzdFxuICogb2YgcHJvcGVydHktbGV2ZWwgaW1wYWN0cy5cbiAqIEBwYXJhbSBvbmUgdGhlIGN1cnJlbnQgd29yc3QgaW1wYWN0IHNvIGZhci5cbiAqIEBwYXJhbSB0d28gdGhlIG5ldyBpbXBhY3QgYmVpbmcgY29uc2lkZXJlZCAoY2FuIGJlIHVuZGVmaW5lZCwgYXMgd2UgbWF5IG5vdCBhbHdheXMgYmVcbiAqICAgICAgYWJsZSB0byBkZXRlcm1pbmUgc29tZSBwZXJvcGVydHkncyBpbXBhY3QpLlxuICovXG5mdW5jdGlvbiB3b3JzdEltcGFjdChvbmU6IFJlc291cmNlSW1wYWN0LCB0d28/OiBSZXNvdXJjZUltcGFjdCk6IFJlc291cmNlSW1wYWN0IHtcbiAgaWYgKCF0d28pIHsgcmV0dXJuIG9uZTsgfVxuICBjb25zdCBiYWRuZXNzID0ge1xuICAgIFtSZXNvdXJjZUltcGFjdC5OT19DSEFOR0VdOiAwLFxuICAgIFtSZXNvdXJjZUltcGFjdC5XSUxMX1VQREFURV06IDEsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFXTogMixcbiAgICBbUmVzb3VyY2VJbXBhY3QuV0lMTF9PUlBIQU5dOiAzLFxuICAgIFtSZXNvdXJjZUltcGFjdC5NQVlfUkVQTEFDRV06IDQsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRV06IDUsXG4gICAgW1Jlc291cmNlSW1wYWN0LldJTExfREVTVFJPWV06IDYsXG4gIH07XG4gIHJldHVybiBiYWRuZXNzW29uZV0gPiBiYWRuZXNzW3R3b10gPyBvbmUgOiB0d287XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2Uge1xuICBUeXBlOiBzdHJpbmc7XG4gIFByb3BlcnRpZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ2hhbmdlIHRvIGEgc2luZ2xlIHJlc291cmNlIGJldHdlZW4gdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlc1xuICpcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIG11dGF0ZWQgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VEaWZmZXJlbmNlIGltcGxlbWVudHMgSURpZmZlcmVuY2U8UmVzb3VyY2U+IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyByZXNvdXJjZSB3YXMgYWRkZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc0FkZGl0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcmVzb3VyY2Ugd2FzIHJlbW92ZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc1JlbW92YWw6IGJvb2xlYW47XG5cbiAgLyoqIFByb3BlcnR5LWxldmVsIGNoYW5nZXMgb24gdGhlIHJlc291cmNlICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlEaWZmczogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9O1xuXG4gIC8qKiBDaGFuZ2VzIHRvIG5vbi1wcm9wZXJ0eSBsZXZlbCBhdHRyaWJ1dGVzIG9mIHRoZSByZXNvdXJjZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG90aGVyRGlmZnM6IHsgW2tleTogc3RyaW5nXTogRGlmZmVyZW5jZTxhbnk+IH07XG5cbiAgLyoqIFRoZSByZXNvdXJjZSB0eXBlIChvciBvbGQgYW5kIG5ldyB0eXBlIGlmIGl0IGhhcyBjaGFuZ2VkKSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlVHlwZXM6IHsgcmVhZG9ubHkgb2xkVHlwZT86IHN0cmluZywgcmVhZG9ubHkgbmV3VHlwZT86IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBvbGRWYWx1ZTogUmVzb3VyY2UgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IG5ld1ZhbHVlOiBSZXNvdXJjZSB8IHVuZGVmaW5lZCxcbiAgICBhcmdzOiB7XG4gICAgICByZXNvdXJjZVR5cGU6IHsgb2xkVHlwZT86IHN0cmluZywgbmV3VHlwZT86IHN0cmluZyB9LFxuICAgICAgcHJvcGVydHlEaWZmczogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9LFxuICAgICAgb3RoZXJEaWZmczogeyBba2V5OiBzdHJpbmddOiBEaWZmZXJlbmNlPGFueT4gfVxuICAgIH0sXG4gICkge1xuICAgIHRoaXMucmVzb3VyY2VUeXBlcyA9IGFyZ3MucmVzb3VyY2VUeXBlO1xuICAgIHRoaXMucHJvcGVydHlEaWZmcyA9IGFyZ3MucHJvcGVydHlEaWZmcztcbiAgICB0aGlzLm90aGVyRGlmZnMgPSBhcmdzLm90aGVyRGlmZnM7XG5cbiAgICB0aGlzLmlzQWRkaXRpb24gPSBvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNSZW1vdmFsID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2xkUHJvcGVydGllcygpOiBQcm9wZXJ0eU1hcCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub2xkVmFsdWUgJiYgdGhpcy5vbGRWYWx1ZS5Qcm9wZXJ0aWVzO1xuICB9XG5cbiAgcHVibGljIGdldCBuZXdQcm9wZXJ0aWVzKCk6IFByb3BlcnR5TWFwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5uZXdWYWx1ZSAmJiB0aGlzLm5ld1ZhbHVlLlByb3BlcnRpZXM7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHJlc291cmNlIHdhcyBtb2RpZmllZCBhdCBhbGxcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEaWZmZXJlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlmZmVyZW5jZUNvdW50ID4gMCB8fCB0aGlzLm9sZFJlc291cmNlVHlwZSAhPT0gdGhpcy5uZXdSZXNvdXJjZVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVzb3VyY2Ugd2FzIHVwZGF0ZWQgaW4tcGxhY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNVcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaWZmZXJlbnQgJiYgIXRoaXMuaXNBZGRpdGlvbiAmJiAhdGhpcy5pc1JlbW92YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9sZFJlc291cmNlVHlwZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmV3UmVzb3VyY2VUeXBlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBhY3R1YWwgcHJvcGVydHkgdXBkYXRlc1xuICAgKi9cbiAgcHVibGljIGdldCBwcm9wZXJ0eVVwZGF0ZXMoKTogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55PiB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5wcm9wZXJ0eURpZmZzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgYWN0dWFsIFwib3RoZXJcIiB1cGRhdGVzXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVyQ2hhbmdlcygpOiB7IFtrZXk6IHN0cmluZ106IERpZmZlcmVuY2U8YW55PiB9IHtcbiAgICByZXR1cm4gb25seUNoYW5nZXModGhpcy5vdGhlckRpZmZzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgcmVzb3VyY2UgdHlwZSB3YXMgY2hhbmdlZCBpbiB0aGlzIGRpZmZcbiAgICpcbiAgICogVGhpcyBpcyBub3QgYSB2YWxpZCBvcGVyYXRpb24gaW4gQ2xvdWRGb3JtYXRpb24gYnV0IHRvIGJlIGRlZmVuc2l2ZSB3ZSdyZSBnb2luZ1xuICAgKiB0byBiZSBhd2FyZSBvZiBpdCBhbnl3YXkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlVHlwZUNoYW5nZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlICE9PSB1bmRlZmluZWRcbiAgICAgICAgJiYgdGhpcy5yZXNvdXJjZVR5cGVzLm9sZFR5cGUgIT09IHRoaXMucmVzb3VyY2VUeXBlcy5uZXdUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgaWYgaXQgd2FzIHVuY2hhbmdlZFxuICAgKlxuICAgKiBJZiB0aGUgcmVzb3VyY2UgdHlwZSB3YXMgY2hhbmdlZCwgaXQncyBhbiBlcnJvciB0byBjYWxsIHRoaXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlVHlwZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnJlc291cmNlVHlwZUNoYW5nZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCAucmVzb3VyY2VUeXBlLCBiZWNhdXNlIHRoZSB0eXBlIHdhcyBjaGFuZ2VkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZXMub2xkVHlwZSB8fCB0aGlzLnJlc291cmNlVHlwZXMubmV3VHlwZSE7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBhIFByb3BlcnR5Q2hhbmdlIGluIHRoaXMgb2JqZWN0XG4gICAqXG4gICAqIFRoaXMgYWZmZWN0cyB0aGUgcHJvcGVydHkgZGlmZiBhcyBpdCBpcyBzdW1tYXJpemVkIHRvIHVzZXJzLCBidXQgaXQgRE9FU1xuICAgKiBOT1QgYWZmZWN0IGVpdGhlciB0aGUgXCJvbGRWYWx1ZVwiIG9yIFwibmV3VmFsdWVcIiB2YWx1ZXM7IHRob3NlIHN0aWxsIGNvbnRhaW5cbiAgICogdGhlIGFjdHVhbCB0ZW1wbGF0ZSB2YWx1ZXMgYXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgKHRoZXkgbWlnaHQgc3RpbGwgYmVcbiAgICogdXNlZCBmb3IgZG93bnN0cmVhbSBwcm9jZXNzaW5nKS5cbiAgICovXG4gIHB1YmxpYyBzZXRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eU5hbWU6IHN0cmluZywgY2hhbmdlOiBQcm9wZXJ0eURpZmZlcmVuY2U8YW55Pikge1xuICAgIHRoaXMucHJvcGVydHlEaWZmc1twcm9wZXJ0eU5hbWVdID0gY2hhbmdlO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGFuZ2VJbXBhY3QoKTogUmVzb3VyY2VJbXBhY3Qge1xuICAgIC8vIENoZWNrIHRoZSBUeXBlIGZpcnN0XG4gICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlcy5vbGRUeXBlICE9PSB0aGlzLnJlc291cmNlVHlwZXMubmV3VHlwZSkge1xuICAgICAgaWYgKHRoaXMucmVzb3VyY2VUeXBlcy5vbGRUeXBlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIFJlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFOyB9XG4gICAgICBpZiAodGhpcy5yZXNvdXJjZVR5cGVzLm5ld1R5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbGRWYWx1ZSEuRGVsZXRpb25Qb2xpY3kgPT09ICdSZXRhaW4nXG4gICAgICAgICAgPyBSZXNvdXJjZUltcGFjdC5XSUxMX09SUEhBTlxuICAgICAgICAgIDogUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRTtcbiAgICB9XG5cbiAgICAvLyBCYXNlIGltcGFjdCAoYmVmb3JlIHdlIG1peCBpbiB0aGUgd29yc3Qgb2YgdGhlIHByb3BlcnR5IGltcGFjdHMpO1xuICAgIC8vIFdJTExfVVBEQVRFIGlmIHdlIGhhdmUgXCJvdGhlclwiIGNoYW5nZXMsIE5PX0NIQU5HRSBpZiB0aGVyZSBhcmUgbm8gXCJvdGhlclwiIGNoYW5nZXMuXG4gICAgY29uc3QgYmFzZUltcGFjdCA9IE9iamVjdC5rZXlzKHRoaXMub3RoZXJDaGFuZ2VzKS5sZW5ndGggPiAwID8gUmVzb3VyY2VJbXBhY3QuV0lMTF9VUERBVEUgOiBSZXNvdXJjZUltcGFjdC5OT19DSEFOR0U7XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnByb3BlcnR5RGlmZnMpXG4gICAgICAubWFwKGVsdCA9PiBlbHQuY2hhbmdlSW1wYWN0KVxuICAgICAgLnJlZHVjZSh3b3JzdEltcGFjdCwgYmFzZUltcGFjdCk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgb2YgYWN0dWFsIGRpZmZlcmVuY2VzIChub3Qgb2YgZWxlbWVudHMpXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpZmZlcmVuY2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMucHJvcGVydHlVcGRhdGVzKS5sZW5ndGhcbiAgICAgICsgT2JqZWN0LnZhbHVlcyh0aGlzLm90aGVyQ2hhbmdlcykubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBhIGNhbGxiYWNrIGZvciBlYWNoIGFjdHVhbCBkaWZmZXJlbmNlXG4gICAqL1xuICBwdWJsaWMgZm9yRWFjaERpZmZlcmVuY2UoY2I6ICh0eXBlOiAnUHJvcGVydHknIHwgJ090aGVyJywgbmFtZTogc3RyaW5nLCB2YWx1ZTogRGlmZmVyZW5jZTxhbnk+IHwgUHJvcGVydHlEaWZmZXJlbmNlPGFueT4pID0+IGFueSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMucHJvcGVydHlVcGRhdGVzKS5zb3J0KCkpIHtcbiAgICAgIGNiKCdQcm9wZXJ0eScsIGtleSwgdGhpcy5wcm9wZXJ0eVVwZGF0ZXNba2V5XSk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMub3RoZXJDaGFuZ2VzKS5zb3J0KCkpIHtcbiAgICAgIGNiKCdPdGhlcicsIGtleSwgdGhpcy5vdGhlckRpZmZzW2tleV0pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wZXJ0eURpZmZlcmVuY2U8VD4oZGlmZjogRGlmZmVyZW5jZTxUPik6IGRpZmYgaXMgUHJvcGVydHlEaWZmZXJlbmNlPFQ+IHtcbiAgcmV0dXJuIChkaWZmIGFzIFByb3BlcnR5RGlmZmVyZW5jZTxUPikuY2hhbmdlSW1wYWN0ICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmlsdGVyIGEgbWFwIG9mIElEaWZmZXJlbmNlcyBkb3duIHRvIG9ubHkgcmV0YWluIHRoZSBhY3R1YWwgY2hhbmdlc1xuICovXG5mdW5jdGlvbiBvbmx5Q2hhbmdlczxWLCBUIGV4dGVuZHMgSURpZmZlcmVuY2U8Vj4+KHhzOiB7W2tleTogc3RyaW5nXTogVH0pOiB7W2tleTogc3RyaW5nXTogVH0ge1xuICBjb25zdCByZXQ6IHsgW2tleTogc3RyaW5nXTogVCB9ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgZGlmZl0gb2YgT2JqZWN0LmVudHJpZXMoeHMpKSB7XG4gICAgaWYgKGRpZmYuaXNEaWZmZXJlbnQpIHtcbiAgICAgIHJldFtrZXldID0gZGlmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadResourceModel = exports.mangleLikeCloudFormation = exports.unionOf = exports.diffKeyedEntities = exports.deepEqual = void 0;\nconst aws_service_spec_1 = require(\"@aws-cdk/aws-service-spec\");\n/**\n * Compares two objects for equality, deeply. The function handles arguments that are\n * +null+, +undefined+, arrays and objects. For objects, the function will not take the\n * object prototype into account for the purpose of the comparison, only the values of\n * properties reported by +Object.keys+.\n *\n * If both operands can be parsed to equivalent numbers, will return true.\n * This makes diff consistent with CloudFormation, where a numeric 10 and a literal \"10\"\n * are considered equivalent.\n *\n * @param lvalue the left operand of the equality comparison.\n * @param rvalue the right operand of the equality comparison.\n *\n * @returns +true+ if both +lvalue+ and +rvalue+ are equivalent to each other.\n */\nfunction deepEqual(lvalue, rvalue) {\n if (lvalue === rvalue) {\n return true;\n }\n // CloudFormation allows passing strings into boolean-typed fields\n if (((typeof lvalue === 'string' && typeof rvalue === 'boolean') ||\n (typeof lvalue === 'boolean' && typeof rvalue === 'string')) &&\n lvalue.toString() === rvalue.toString()) {\n return true;\n }\n // allows a numeric 10 and a literal \"10\" to be equivalent;\n // this is consistent with CloudFormation.\n if ((typeof lvalue === 'string' || typeof rvalue === 'string') &&\n safeParseFloat(lvalue) === safeParseFloat(rvalue)) {\n return true;\n }\n if (typeof lvalue !== typeof rvalue) {\n return false;\n }\n if (Array.isArray(lvalue) !== Array.isArray(rvalue)) {\n return false;\n }\n if (Array.isArray(lvalue) /* && Array.isArray(rvalue) */) {\n if (lvalue.length !== rvalue.length) {\n return false;\n }\n for (let i = 0; i < lvalue.length; i++) {\n if (!deepEqual(lvalue[i], rvalue[i])) {\n return false;\n }\n }\n return true;\n }\n if (typeof lvalue === 'object' /* && typeof rvalue === 'object' */) {\n if (lvalue === null || rvalue === null) {\n // If both were null, they'd have been ===\n return false;\n }\n const keys = Object.keys(lvalue);\n if (keys.length !== Object.keys(rvalue).length) {\n return false;\n }\n for (const key of keys) {\n if (!rvalue.hasOwnProperty(key)) {\n return false;\n }\n if (key === 'DependsOn') {\n if (!dependsOnEqual(lvalue[key], rvalue[key])) {\n return false;\n }\n ;\n // check differences other than `DependsOn`\n continue;\n }\n if (!deepEqual(lvalue[key], rvalue[key])) {\n return false;\n }\n }\n return true;\n }\n // Neither object, nor array: I deduce this is primitive type\n // Primitive type and not ===, so I deduce not deepEqual\n return false;\n}\nexports.deepEqual = deepEqual;\n/**\n * Compares two arguments to DependsOn for equality.\n *\n * @param lvalue the left operand of the equality comparison.\n * @param rvalue the right operand of the equality comparison.\n *\n * @returns +true+ if both +lvalue+ and +rvalue+ are equivalent to each other.\n */\nfunction dependsOnEqual(lvalue, rvalue) {\n // allows ['Value'] and 'Value' to be equal\n if (Array.isArray(lvalue) !== Array.isArray(rvalue)) {\n const array = Array.isArray(lvalue) ? lvalue : rvalue;\n const nonArray = Array.isArray(lvalue) ? rvalue : lvalue;\n if (array.length === 1 && deepEqual(array[0], nonArray)) {\n return true;\n }\n return false;\n }\n // allows arrays passed to DependsOn to be equivalent irrespective of element order\n if (Array.isArray(lvalue) && Array.isArray(rvalue)) {\n if (lvalue.length !== rvalue.length) {\n return false;\n }\n for (let i = 0; i < lvalue.length; i++) {\n for (let j = 0; j < lvalue.length; j++) {\n if ((!deepEqual(lvalue[i], rvalue[j])) && (j === lvalue.length - 1)) {\n return false;\n }\n break;\n }\n }\n return true;\n }\n return false;\n}\n/**\n * Produce the differences between two maps, as a map, using a specified diff function.\n *\n * @param oldValue the old map.\n * @param newValue the new map.\n * @param elementDiff the diff function.\n *\n * @returns a map representing the differences between +oldValue+ and +newValue+.\n */\nfunction diffKeyedEntities(oldValue, newValue, elementDiff) {\n const result = {};\n for (const logicalId of unionOf(Object.keys(oldValue || {}), Object.keys(newValue || {}))) {\n const oldElement = oldValue && oldValue[logicalId];\n const newElement = newValue && newValue[logicalId];\n if (oldElement === undefined && newElement === undefined) {\n // Shouldn't happen in reality, but may happen in tests. Skip.\n continue;\n }\n result[logicalId] = elementDiff(oldElement, newElement, logicalId);\n }\n return result;\n}\nexports.diffKeyedEntities = diffKeyedEntities;\n/**\n * Computes the union of two sets of strings.\n *\n * @param lv the left set of strings.\n * @param rv the right set of strings.\n *\n * @returns a new array containing all elemebts from +lv+ and +rv+, with no duplicates.\n */\nfunction unionOf(lv, rv) {\n const result = new Set(lv);\n for (const v of rv) {\n result.add(v);\n }\n return new Array(...result);\n}\nexports.unionOf = unionOf;\n/**\n * GetStackTemplate flattens any codepoint greater than \"\\u7f\" to \"?\". This is\n * true even for codepoints in the supplemental planes which are represented\n * in JS as surrogate pairs, all the way up to \"\\u{10ffff}\".\n *\n * This function implements the same mangling in order to provide diagnostic\n * information in `cdk diff`.\n */\nfunction mangleLikeCloudFormation(payload) {\n return payload.replace(/[\\u{80}-\\u{10ffff}]/gu, '?');\n}\nexports.mangleLikeCloudFormation = mangleLikeCloudFormation;\n/**\n * A parseFloat implementation that does the right thing for\n * strings like '0.0.0'\n * (for which JavaScript's parseFloat() returns 0).\n * We return NaN for all of these strings that do not represent numbers,\n * and so comparing them fails,\n * and doesn't short-circuit the diff logic.\n */\nfunction safeParseFloat(str) {\n return Number(str);\n}\n/**\n * Lazily load the service spec database and cache the loaded db\n*/\nlet DATABASE;\nfunction database() {\n if (!DATABASE) {\n DATABASE = (0, aws_service_spec_1.loadAwsServiceSpecSync)();\n }\n return DATABASE;\n}\n/**\n * Load a Resource model from the Service Spec Database\n *\n * The database is loaded lazily and cached across multiple calls to `loadResourceModel`.\n */\nfunction loadResourceModel(type) {\n return database().lookup('resource', 'cloudFormationType', 'equals', type).at(0);\n}\nexports.loadResourceModel = loadResourceModel;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0VBQW1FO0FBR25FOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLE1BQVcsRUFBRSxNQUFXO0lBQ2hELElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRTtRQUFFLE9BQU8sSUFBSSxDQUFDO0tBQUU7SUFDdkMsa0VBQWtFO0lBQ2xFLElBQUksQ0FBQyxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sS0FBSyxTQUFTLENBQUM7UUFDNUQsQ0FBQyxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUMzQyxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsMkRBQTJEO0lBQzNELDBDQUEwQztJQUMxQyxJQUFJLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQztRQUMxRCxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3JELE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxJQUFJLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7S0FBRTtJQUN0RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0tBQUU7SUFDdEUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLDhCQUE4QixFQUFFO1FBQ3hELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7U0FBRTtRQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRyxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFBRSxPQUFPLEtBQUssQ0FBQzthQUFFO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLG1DQUFtQyxFQUFFO1FBQ2xFLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ3RDLDBDQUEwQztZQUMxQyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO1FBQ2pFLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUFFLE9BQU8sS0FBSyxDQUFDO2FBQUU7WUFDbEQsSUFBSSxHQUFHLEtBQUssV0FBVyxFQUFFO2dCQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFBRSxPQUFPLEtBQUssQ0FBQztpQkFBRTtnQkFBQSxDQUFDO2dCQUNqRSwyQ0FBMkM7Z0JBQzNDLFNBQVM7YUFDVjtZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUFFLE9BQU8sS0FBSyxDQUFDO2FBQUU7U0FDNUQ7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsNkRBQTZEO0lBQzdELHdEQUF3RDtJQUN4RCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUE1Q0QsOEJBNENDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQVcsRUFBRSxNQUFXO0lBQzlDLDJDQUEyQztJQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNuRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUV6RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDdkQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxtRkFBbUY7SUFDbkYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO1FBQ3RELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFHLENBQUMsRUFBRSxFQUFFO1lBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFHLENBQUMsRUFBRSxFQUFFO2dCQUN4QyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDbkUsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsTUFBTTthQUNQO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FDL0IsUUFBNEMsRUFDNUMsUUFBNEMsRUFDNUMsV0FBaUU7SUFDakUsTUFBTSxNQUFNLEdBQTBCLEVBQUUsQ0FBQztJQUN6QyxLQUFLLE1BQU0sU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ3pGLE1BQU0sVUFBVSxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVuRCxJQUFJLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUN4RCw4REFBOEQ7WUFDOUQsU0FBUztTQUNWO1FBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ3BFO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQWpCRCw4Q0FpQkM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsT0FBTyxDQUFDLEVBQTBCLEVBQUUsRUFBMEI7SUFDNUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNmO0lBQ0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFORCwwQkFNQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxPQUFlO0lBQ3RELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRkQsNERBRUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxjQUFjLENBQUMsR0FBVztJQUNqQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQ7O0VBRUU7QUFDRixJQUFJLFFBQWtDLENBQUM7QUFDdkMsU0FBUyxRQUFRO0lBQ2YsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNiLFFBQVEsR0FBRyxJQUFBLHlDQUFzQixHQUFFLENBQUM7S0FDckM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLElBQVk7SUFDNUMsT0FBTyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQUZELDhDQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9hZEF3c1NlcnZpY2VTcGVjU3luYyB9IGZyb20gJ0Bhd3MtY2RrL2F3cy1zZXJ2aWNlLXNwZWMnO1xuaW1wb3J0IHsgUmVzb3VyY2UsIFNwZWNEYXRhYmFzZSB9IGZyb20gJ0Bhd3MtY2RrL3NlcnZpY2Utc3BlYy10eXBlcyc7XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCBkZWVwbHkuIFRoZSBmdW5jdGlvbiBoYW5kbGVzIGFyZ3VtZW50cyB0aGF0IGFyZVxuICogK251bGwrLCArdW5kZWZpbmVkKywgYXJyYXlzIGFuZCBvYmplY3RzLiBGb3Igb2JqZWN0cywgdGhlIGZ1bmN0aW9uIHdpbGwgbm90IHRha2UgdGhlXG4gKiBvYmplY3QgcHJvdG90eXBlIGludG8gYWNjb3VudCBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhlIGNvbXBhcmlzb24sIG9ubHkgdGhlIHZhbHVlcyBvZlxuICogcHJvcGVydGllcyByZXBvcnRlZCBieSArT2JqZWN0LmtleXMrLlxuICpcbiAqIElmIGJvdGggb3BlcmFuZHMgY2FuIGJlIHBhcnNlZCB0byBlcXVpdmFsZW50IG51bWJlcnMsIHdpbGwgcmV0dXJuIHRydWUuXG4gKiBUaGlzIG1ha2VzIGRpZmYgY29uc2lzdGVudCB3aXRoIENsb3VkRm9ybWF0aW9uLCB3aGVyZSBhIG51bWVyaWMgMTAgYW5kIGEgbGl0ZXJhbCBcIjEwXCJcbiAqIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQuXG4gKlxuICogQHBhcmFtIGx2YWx1ZSB0aGUgbGVmdCBvcGVyYW5kIG9mIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uLlxuICogQHBhcmFtIHJ2YWx1ZSB0aGUgcmlnaHQgb3BlcmFuZCBvZiB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqXG4gKiBAcmV0dXJucyArdHJ1ZSsgaWYgYm90aCArbHZhbHVlKyBhbmQgK3J2YWx1ZSsgYXJlIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChsdmFsdWU6IGFueSwgcnZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKGx2YWx1ZSA9PT0gcnZhbHVlKSB7IHJldHVybiB0cnVlOyB9XG4gIC8vIENsb3VkRm9ybWF0aW9uIGFsbG93cyBwYXNzaW5nIHN0cmluZ3MgaW50byBib29sZWFuLXR5cGVkIGZpZWxkc1xuICBpZiAoKCh0eXBlb2YgbHZhbHVlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgcnZhbHVlID09PSAnYm9vbGVhbicpIHx8XG4gICAgICAodHlwZW9mIGx2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiBydmFsdWUgPT09ICdzdHJpbmcnKSkgJiZcbiAgICAgIGx2YWx1ZS50b1N0cmluZygpID09PSBydmFsdWUudG9TdHJpbmcoKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIGFsbG93cyBhIG51bWVyaWMgMTAgYW5kIGEgbGl0ZXJhbCBcIjEwXCIgdG8gYmUgZXF1aXZhbGVudDtcbiAgLy8gdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggQ2xvdWRGb3JtYXRpb24uXG4gIGlmICgodHlwZW9mIGx2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHJ2YWx1ZSA9PT0gJ3N0cmluZycpICYmXG4gICAgICBzYWZlUGFyc2VGbG9hdChsdmFsdWUpID09PSBzYWZlUGFyc2VGbG9hdChydmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBsdmFsdWUgIT09IHR5cGVvZiBydmFsdWUpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChBcnJheS5pc0FycmF5KGx2YWx1ZSkgIT09IEFycmF5LmlzQXJyYXkocnZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgaWYgKEFycmF5LmlzQXJyYXkobHZhbHVlKSAvKiAmJiBBcnJheS5pc0FycmF5KHJ2YWx1ZSkgKi8pIHtcbiAgICBpZiAobHZhbHVlLmxlbmd0aCAhPT0gcnZhbHVlLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGxldCBpID0gMCA7IGkgPCBsdmFsdWUubGVuZ3RoIDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChsdmFsdWVbaV0sIHJ2YWx1ZVtpXSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgbHZhbHVlID09PSAnb2JqZWN0JyAvKiAmJiB0eXBlb2YgcnZhbHVlID09PSAnb2JqZWN0JyAqLykge1xuICAgIGlmIChsdmFsdWUgPT09IG51bGwgfHwgcnZhbHVlID09PSBudWxsKSB7XG4gICAgICAvLyBJZiBib3RoIHdlcmUgbnVsbCwgdGhleSdkIGhhdmUgYmVlbiA9PT1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGx2YWx1ZSk7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhydmFsdWUpLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoIXJ2YWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgaWYgKGtleSA9PT0gJ0RlcGVuZHNPbicpIHtcbiAgICAgICAgaWYgKCFkZXBlbmRzT25FcXVhbChsdmFsdWVba2V5XSwgcnZhbHVlW2tleV0pKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICAgICAgLy8gY2hlY2sgZGlmZmVyZW5jZXMgb3RoZXIgdGhhbiBgRGVwZW5kc09uYFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghZGVlcEVxdWFsKGx2YWx1ZVtrZXldLCBydmFsdWVba2V5XSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIE5laXRoZXIgb2JqZWN0LCBub3IgYXJyYXk6IEkgZGVkdWNlIHRoaXMgaXMgcHJpbWl0aXZlIHR5cGVcbiAgLy8gUHJpbWl0aXZlIHR5cGUgYW5kIG5vdCA9PT0sIHNvIEkgZGVkdWNlIG5vdCBkZWVwRXF1YWxcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBhcmd1bWVudHMgdG8gRGVwZW5kc09uIGZvciBlcXVhbGl0eS5cbiAqXG4gKiBAcGFyYW0gbHZhbHVlIHRoZSBsZWZ0IG9wZXJhbmQgb2YgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24uXG4gKiBAcGFyYW0gcnZhbHVlIHRoZSByaWdodCBvcGVyYW5kIG9mIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uLlxuICpcbiAqIEByZXR1cm5zICt0cnVlKyBpZiBib3RoICtsdmFsdWUrIGFuZCArcnZhbHVlKyBhcmUgZXF1aXZhbGVudCB0byBlYWNoIG90aGVyLlxuICovXG5mdW5jdGlvbiBkZXBlbmRzT25FcXVhbChsdmFsdWU6IGFueSwgcnZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgLy8gYWxsb3dzIFsnVmFsdWUnXSBhbmQgJ1ZhbHVlJyB0byBiZSBlcXVhbFxuICBpZiAoQXJyYXkuaXNBcnJheShsdmFsdWUpICE9PSBBcnJheS5pc0FycmF5KHJ2YWx1ZSkpIHtcbiAgICBjb25zdCBhcnJheSA9IEFycmF5LmlzQXJyYXkobHZhbHVlKSA/IGx2YWx1ZSA6IHJ2YWx1ZTtcbiAgICBjb25zdCBub25BcnJheSA9IEFycmF5LmlzQXJyYXkobHZhbHVlKSA/IHJ2YWx1ZSA6IGx2YWx1ZTtcblxuICAgIGlmIChhcnJheS5sZW5ndGggPT09IDEgJiYgZGVlcEVxdWFsKGFycmF5WzBdLCBub25BcnJheSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBhbGxvd3MgYXJyYXlzIHBhc3NlZCB0byBEZXBlbmRzT24gdG8gYmUgZXF1aXZhbGVudCBpcnJlc3BlY3RpdmUgb2YgZWxlbWVudCBvcmRlclxuICBpZiAoQXJyYXkuaXNBcnJheShsdmFsdWUpICYmIEFycmF5LmlzQXJyYXkocnZhbHVlKSkge1xuICAgIGlmIChsdmFsdWUubGVuZ3RoICE9PSBydmFsdWUubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGZvciAobGV0IGkgPSAwIDsgaSA8IGx2YWx1ZS5sZW5ndGggOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwIDsgaiA8IGx2YWx1ZS5sZW5ndGggOyBqKyspIHtcbiAgICAgICAgaWYgKCghZGVlcEVxdWFsKGx2YWx1ZVtpXSwgcnZhbHVlW2pdKSkgJiYgKGogPT09IGx2YWx1ZS5sZW5ndGggLSAxKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUHJvZHVjZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gbWFwcywgYXMgYSBtYXAsIHVzaW5nIGEgc3BlY2lmaWVkIGRpZmYgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIG9sZFZhbHVlICB0aGUgb2xkIG1hcC5cbiAqIEBwYXJhbSBuZXdWYWx1ZSAgdGhlIG5ldyBtYXAuXG4gKiBAcGFyYW0gZWxlbWVudERpZmYgdGhlIGRpZmYgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMgYSBtYXAgcmVwcmVzZW50aW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuICtvbGRWYWx1ZSsgYW5kICtuZXdWYWx1ZSsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmS2V5ZWRFbnRpdGllczxUPihcbiAgb2xkVmFsdWU6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQsXG4gIG5ld1ZhbHVlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkLFxuICBlbGVtZW50RGlmZjogKG9sZEVsZW1lbnQ6IGFueSwgbmV3RWxlbWVudDogYW55LCBrZXk6IHN0cmluZykgPT4gVCk6IHsgW25hbWU6IHN0cmluZ106IFQgfSB7XG4gIGNvbnN0IHJlc3VsdDogeyBbbmFtZTogc3RyaW5nXTogVCB9ID0ge307XG4gIGZvciAoY29uc3QgbG9naWNhbElkIG9mIHVuaW9uT2YoT2JqZWN0LmtleXMob2xkVmFsdWUgfHwge30pLCBPYmplY3Qua2V5cyhuZXdWYWx1ZSB8fCB7fSkpKSB7XG4gICAgY29uc3Qgb2xkRWxlbWVudCA9IG9sZFZhbHVlICYmIG9sZFZhbHVlW2xvZ2ljYWxJZF07XG4gICAgY29uc3QgbmV3RWxlbWVudCA9IG5ld1ZhbHVlICYmIG5ld1ZhbHVlW2xvZ2ljYWxJZF07XG5cbiAgICBpZiAob2xkRWxlbWVudCA9PT0gdW5kZWZpbmVkICYmIG5ld0VsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU2hvdWxkbid0IGhhcHBlbiBpbiByZWFsaXR5LCBidXQgbWF5IGhhcHBlbiBpbiB0ZXN0cy4gU2tpcC5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc3VsdFtsb2dpY2FsSWRdID0gZWxlbWVudERpZmYob2xkRWxlbWVudCwgbmV3RWxlbWVudCwgbG9naWNhbElkKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSB1bmlvbiBvZiB0d28gc2V0cyBvZiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSBsdiB0aGUgbGVmdCBzZXQgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSBydiB0aGUgcmlnaHQgc2V0IG9mIHN0cmluZ3MuXG4gKlxuICogQHJldHVybnMgYSBuZXcgYXJyYXkgY29udGFpbmluZyBhbGwgZWxlbWVidHMgZnJvbSArbHYrIGFuZCArcnYrLCB3aXRoIG5vIGR1cGxpY2F0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlvbk9mKGx2OiBzdHJpbmdbXSB8IFNldDxzdHJpbmc+LCBydjogc3RyaW5nW10gfCBTZXQ8c3RyaW5nPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFNldChsdik7XG4gIGZvciAoY29uc3QgdiBvZiBydikge1xuICAgIHJlc3VsdC5hZGQodik7XG4gIH1cbiAgcmV0dXJuIG5ldyBBcnJheSguLi5yZXN1bHQpO1xufVxuXG4vKipcbiAqIEdldFN0YWNrVGVtcGxhdGUgZmxhdHRlbnMgYW55IGNvZGVwb2ludCBncmVhdGVyIHRoYW4gXCJcXHU3ZlwiIHRvIFwiP1wiLiBUaGlzIGlzXG4gKiB0cnVlIGV2ZW4gZm9yIGNvZGVwb2ludHMgaW4gdGhlIHN1cHBsZW1lbnRhbCBwbGFuZXMgd2hpY2ggYXJlIHJlcHJlc2VudGVkXG4gKiBpbiBKUyBhcyBzdXJyb2dhdGUgcGFpcnMsIGFsbCB0aGUgd2F5IHVwIHRvIFwiXFx1ezEwZmZmZn1cIi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIHNhbWUgbWFuZ2xpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZSBkaWFnbm9zdGljXG4gKiBpbmZvcm1hdGlvbiBpbiBgY2RrIGRpZmZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFuZ2xlTGlrZUNsb3VkRm9ybWF0aW9uKHBheWxvYWQ6IHN0cmluZykge1xuICByZXR1cm4gcGF5bG9hZC5yZXBsYWNlKC9bXFx1ezgwfS1cXHV7MTBmZmZmfV0vZ3UsICc/Jyk7XG59XG5cbi8qKlxuICogQSBwYXJzZUZsb2F0IGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyB0aGUgcmlnaHQgdGhpbmcgZm9yXG4gKiBzdHJpbmdzIGxpa2UgJzAuMC4wJ1xuICogKGZvciB3aGljaCBKYXZhU2NyaXB0J3MgcGFyc2VGbG9hdCgpIHJldHVybnMgMCkuXG4gKiBXZSByZXR1cm4gTmFOIGZvciBhbGwgb2YgdGhlc2Ugc3RyaW5ncyB0aGF0IGRvIG5vdCByZXByZXNlbnQgbnVtYmVycyxcbiAqIGFuZCBzbyBjb21wYXJpbmcgdGhlbSBmYWlscyxcbiAqIGFuZCBkb2Vzbid0IHNob3J0LWNpcmN1aXQgdGhlIGRpZmYgbG9naWMuXG4gKi9cbmZ1bmN0aW9uIHNhZmVQYXJzZUZsb2F0KHN0cjogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIE51bWJlcihzdHIpO1xufVxuXG4vKipcbiAqIExhemlseSBsb2FkIHRoZSBzZXJ2aWNlIHNwZWMgZGF0YWJhc2UgYW5kIGNhY2hlIHRoZSBsb2FkZWQgZGJcbiovXG5sZXQgREFUQUJBU0U6IFNwZWNEYXRhYmFzZSB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGRhdGFiYXNlKCk6IFNwZWNEYXRhYmFzZSB7XG4gIGlmICghREFUQUJBU0UpIHtcbiAgICBEQVRBQkFTRSA9IGxvYWRBd3NTZXJ2aWNlU3BlY1N5bmMoKTtcbiAgfVxuICByZXR1cm4gREFUQUJBU0U7XG59XG5cbi8qKlxuICogTG9hZCBhIFJlc291cmNlIG1vZGVsIGZyb20gdGhlIFNlcnZpY2UgU3BlYyBEYXRhYmFzZVxuICpcbiAqIFRoZSBkYXRhYmFzZSBpcyBsb2FkZWQgbGF6aWx5IGFuZCBjYWNoZWQgYWNyb3NzIG11bHRpcGxlIGNhbGxzIHRvIGBsb2FkUmVzb3VyY2VNb2RlbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUmVzb3VyY2VNb2RlbCh0eXBlOiBzdHJpbmcpOiBSZXNvdXJjZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBkYXRhYmFzZSgpLmxvb2t1cCgncmVzb3VyY2UnLCAnY2xvdWRGb3JtYXRpb25UeXBlJywgJ2VxdWFscycsIHR5cGUpLmF0KDApO1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DiffableCollection = void 0;\n/**\n * Calculate differences of immutable elements\n */\nclass DiffableCollection {\n constructor() {\n this.additions = [];\n this.removals = [];\n this.oldElements = [];\n this.newElements = [];\n }\n addOld(...elements) {\n this.oldElements.push(...elements);\n }\n addNew(...elements) {\n this.newElements.push(...elements);\n }\n calculateDiff() {\n this.additions.push(...difference(this.newElements, this.oldElements));\n this.removals.push(...difference(this.oldElements, this.newElements));\n }\n get hasChanges() {\n return this.additions.length + this.removals.length > 0;\n }\n get hasAdditions() {\n return this.additions.length > 0;\n }\n get hasRemovals() {\n return this.removals.length > 0;\n }\n}\nexports.DiffableCollection = DiffableCollection;\n/**\n * Whether a collection contains some element (by value)\n */\nfunction contains(element, xs) {\n return xs.some(x => x.equal(element));\n}\n/**\n * Return collection except for elements\n */\nfunction difference(collection, elements) {\n return collection.filter(x => !contains(x, elements));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZmFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7R0FFRztBQUNILE1BQWEsa0JBQWtCO0lBQS9CO1FBQ2tCLGNBQVMsR0FBUSxFQUFFLENBQUM7UUFDcEIsYUFBUSxHQUFRLEVBQUUsQ0FBQztRQUVsQixnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUN0QixnQkFBVyxHQUFRLEVBQUUsQ0FBQztJQTBCekMsQ0FBQztJQXhCUSxNQUFNLENBQUMsR0FBRyxRQUFhO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxHQUFHLFFBQWE7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU0sYUFBYTtRQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBL0JELGdEQStCQztBQVNEOztHQUVHO0FBQ0gsU0FBUyxRQUFRLENBQWtCLE9BQVUsRUFBRSxFQUFPO0lBQ3BELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFVBQVUsQ0FBa0IsVUFBZSxFQUFFLFFBQWE7SUFDakUsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2FsY3VsYXRlIGRpZmZlcmVuY2VzIG9mIGltbXV0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgY2xhc3MgRGlmZmFibGVDb2xsZWN0aW9uPFQgZXh0ZW5kcyBFcTxUPj4ge1xuICBwdWJsaWMgcmVhZG9ubHkgYWRkaXRpb25zOiBUW10gPSBbXTtcbiAgcHVibGljIHJlYWRvbmx5IHJlbW92YWxzOiBUW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9sZEVsZW1lbnRzOiBUW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdFbGVtZW50czogVFtdID0gW107XG5cbiAgcHVibGljIGFkZE9sZCguLi5lbGVtZW50czogVFtdKSB7XG4gICAgdGhpcy5vbGRFbGVtZW50cy5wdXNoKC4uLmVsZW1lbnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGROZXcoLi4uZWxlbWVudHM6IFRbXSkge1xuICAgIHRoaXMubmV3RWxlbWVudHMucHVzaCguLi5lbGVtZW50cyk7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlRGlmZigpIHtcbiAgICB0aGlzLmFkZGl0aW9ucy5wdXNoKC4uLmRpZmZlcmVuY2UodGhpcy5uZXdFbGVtZW50cywgdGhpcy5vbGRFbGVtZW50cykpO1xuICAgIHRoaXMucmVtb3ZhbHMucHVzaCguLi5kaWZmZXJlbmNlKHRoaXMub2xkRWxlbWVudHMsIHRoaXMubmV3RWxlbWVudHMpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQ2hhbmdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRpdGlvbnMubGVuZ3RoICsgdGhpcy5yZW1vdmFscy5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNBZGRpdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkaXRpb25zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc1JlbW92YWxzKCkge1xuICAgIHJldHVybiB0aGlzLnJlbW92YWxzLmxlbmd0aCA+IDA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGluZ3MgdGhhdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlbXNlbHZlcyAoYnkgdmFsdWUpXG4gKi9cbmludGVyZmFjZSBFcTxUPiB7XG4gIGVxdWFsKG90aGVyOiBUKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgY29sbGVjdGlvbiBjb250YWlucyBzb21lIGVsZW1lbnQgKGJ5IHZhbHVlKVxuICovXG5mdW5jdGlvbiBjb250YWluczxUIGV4dGVuZHMgRXE8VD4+KGVsZW1lbnQ6IFQsIHhzOiBUW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHhzLnNvbWUoeCA9PiB4LmVxdWFsKGVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gY29sbGVjdGlvbiBleGNlcHQgZm9yIGVsZW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGRpZmZlcmVuY2U8VCBleHRlbmRzIEVxPFQ+Pihjb2xsZWN0aW9uOiBUW10sIGVsZW1lbnRzOiBUW10pOiBUW10ge1xuICByZXR1cm4gY29sbGVjdGlvbi5maWx0ZXIoeCA9PiAhY29udGFpbnMoeCwgZWxlbWVudHMpKTtcbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.formatTable = void 0;\nconst chalk = require(\"chalk\");\nconst string_width_1 = require(\"string-width\");\nconst table = require(\"table\");\n/**\n * Render a two-dimensional array to a visually attractive table\n *\n * First row is considered the table header.\n */\nfunction formatTable(cells, columns) {\n return table.table(cells, {\n border: TABLE_BORDER_CHARACTERS,\n columns: buildColumnConfig(columns !== undefined ? calculateColumnWidths(cells, columns) : undefined),\n drawHorizontalLine: (line) => {\n // Numbering like this: [line 0] [header = row[0]] [line 1] [row 1] [line 2] [content 2] [line 3]\n return (line < 2 || line === cells.length) || lineBetween(cells[line - 1], cells[line]);\n },\n }).trimRight();\n}\nexports.formatTable = formatTable;\n/**\n * Whether we should draw a line between two rows\n *\n * Draw horizontal line if 2nd column values are different.\n */\nfunction lineBetween(rowA, rowB) {\n return rowA[1] !== rowB[1];\n}\nfunction buildColumnConfig(widths) {\n if (widths === undefined) {\n return undefined;\n }\n const ret = {};\n widths.forEach((width, i) => {\n if (width === undefined) {\n return;\n }\n ret[i] = { width };\n });\n return ret;\n}\n/**\n * Calculate column widths given a terminal width\n *\n * We do this by calculating a fair share for every column. Extra width smaller\n * than the fair share is evenly distributed over all columns that exceed their\n * fair share.\n */\nfunction calculateColumnWidths(rows, terminalWidth) {\n // The terminal is sometimes reported to be 0. Also if the terminal is VERY narrow,\n // just assume a reasonable minimum size.\n terminalWidth = Math.max(terminalWidth, 40);\n // use 'string-width' to not count ANSI chars as actual character width\n const columns = rows[0].map((_, i) => Math.max(...rows.map(row => (0, string_width_1.default)(String(row[i])))));\n // If we have no terminal width, do nothing\n const contentWidth = terminalWidth - 2 - columns.length * 3;\n // If we don't exceed the terminal width, do nothing\n if (sum(columns) <= contentWidth) {\n return columns;\n }\n const fairShare = Math.min(contentWidth / columns.length);\n const smallColumns = columns.filter(w => w < fairShare);\n let distributableWidth = contentWidth - sum(smallColumns);\n const fairDistributable = Math.floor(distributableWidth / (columns.length - smallColumns.length));\n const ret = new Array();\n for (const requestedWidth of columns) {\n if (requestedWidth < fairShare) {\n // Small column gets what they want\n ret.push(requestedWidth);\n }\n else {\n // Last column gets all remaining, otherwise get fair redist share\n const width = distributableWidth < 2 * fairDistributable ? distributableWidth : fairDistributable;\n ret.push(width);\n distributableWidth -= width;\n }\n }\n return ret;\n}\nfunction sum(xs) {\n let total = 0;\n for (const x of xs) {\n total += x;\n }\n return total;\n}\n// What color the table is going to be\nconst tableColor = chalk.gray;\n// Unicode table characters with a color\nconst TABLE_BORDER_CHARACTERS = {\n topBody: tableColor('─'),\n topJoin: tableColor('┬'),\n topLeft: tableColor('┌'),\n topRight: tableColor('┐'),\n bottomBody: tableColor('─'),\n bottomJoin: tableColor('┴'),\n bottomLeft: tableColor('└'),\n bottomRight: tableColor('┘'),\n bodyLeft: tableColor('│'),\n bodyRight: tableColor('│'),\n bodyJoin: tableColor('│'),\n joinBody: tableColor('─'),\n joinLeft: tableColor('├'),\n joinRight: tableColor('┤'),\n joinJoin: tableColor('┼'),\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LXRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZm9ybWF0LXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUErQjtBQUMvQiwrQ0FBdUM7QUFDdkMsK0JBQStCO0FBRS9COzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQUMsS0FBaUIsRUFBRSxPQUEyQjtJQUN4RSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQ3hCLE1BQU0sRUFBRSx1QkFBdUI7UUFDL0IsT0FBTyxFQUFFLGlCQUFpQixDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3JHLGtCQUFrQixFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDM0IsaUdBQWlHO1lBQ2pHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUYsQ0FBQztLQUNGLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNqQixDQUFDO0FBVEQsa0NBU0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxXQUFXLENBQUMsSUFBYyxFQUFFLElBQWM7SUFDakQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE1BQTRCO0lBQ3JELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0tBQUU7SUFFL0MsTUFBTSxHQUFHLEdBQWdELEVBQUUsQ0FBQztJQUM1RCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixPQUFPO1NBQ1I7UUFDRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMscUJBQXFCLENBQUMsSUFBZ0IsRUFBRSxhQUFxQjtJQUNwRSxtRkFBbUY7SUFDbkYseUNBQXlDO0lBQ3pDLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUU1Qyx1RUFBdUU7SUFDdkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBQSxzQkFBVyxFQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWpHLDJDQUEyQztJQUMzQyxNQUFNLFlBQVksR0FBRyxhQUFhLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRTVELG9EQUFvRDtJQUNwRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxZQUFZLEVBQUU7UUFBRSxPQUFPLE9BQU8sQ0FBQztLQUFFO0lBRXJELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRXhELElBQUksa0JBQWtCLEdBQUcsWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRWxHLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFDaEMsS0FBSyxNQUFNLGNBQWMsSUFBSSxPQUFPLEVBQUU7UUFDcEMsSUFBSSxjQUFjLEdBQUcsU0FBUyxFQUFFO1lBQzlCLG1DQUFtQztZQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQzFCO2FBQU07WUFDTCxrRUFBa0U7WUFDbEUsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7WUFDbEcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixrQkFBa0IsSUFBSSxLQUFLLENBQUM7U0FDN0I7S0FDRjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsR0FBRyxDQUFDLEVBQVk7SUFDdkIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsS0FBSyxJQUFJLENBQUMsQ0FBQztLQUNaO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsc0NBQXNDO0FBQ3RDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFFOUIsd0NBQXdDO0FBQ3hDLE1BQU0sdUJBQXVCLEdBQUc7SUFDOUIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDeEIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDeEIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDeEIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDekIsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDM0IsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDM0IsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDM0IsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDNUIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDekIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDMUIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDekIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDekIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDekIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDMUIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7Q0FDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBzdHJpbmdXaWR0aCBmcm9tICdzdHJpbmctd2lkdGgnO1xuaW1wb3J0ICogYXMgdGFibGUgZnJvbSAndGFibGUnO1xuXG4vKipcbiAqIFJlbmRlciBhIHR3by1kaW1lbnNpb25hbCBhcnJheSB0byBhIHZpc3VhbGx5IGF0dHJhY3RpdmUgdGFibGVcbiAqXG4gKiBGaXJzdCByb3cgaXMgY29uc2lkZXJlZCB0aGUgdGFibGUgaGVhZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGFibGUoY2VsbHM6IHN0cmluZ1tdW10sIGNvbHVtbnM6IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiB0YWJsZS50YWJsZShjZWxscywge1xuICAgIGJvcmRlcjogVEFCTEVfQk9SREVSX0NIQVJBQ1RFUlMsXG4gICAgY29sdW1uczogYnVpbGRDb2x1bW5Db25maWcoY29sdW1ucyAhPT0gdW5kZWZpbmVkID8gY2FsY3VsYXRlQ29sdW1uV2lkdGhzKGNlbGxzLCBjb2x1bW5zKSA6IHVuZGVmaW5lZCksXG4gICAgZHJhd0hvcml6b250YWxMaW5lOiAobGluZSkgPT4ge1xuICAgICAgLy8gTnVtYmVyaW5nIGxpa2UgdGhpczogW2xpbmUgMF0gW2hlYWRlciA9IHJvd1swXV0gW2xpbmUgMV0gW3JvdyAxXSBbbGluZSAyXSBbY29udGVudCAyXSBbbGluZSAzXVxuICAgICAgcmV0dXJuIChsaW5lIDwgMiB8fCBsaW5lID09PSBjZWxscy5sZW5ndGgpIHx8IGxpbmVCZXR3ZWVuKGNlbGxzW2xpbmUgLSAxXSwgY2VsbHNbbGluZV0pO1xuICAgIH0sXG4gIH0pLnRyaW1SaWdodCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgd2Ugc2hvdWxkIGRyYXcgYSBsaW5lIGJldHdlZW4gdHdvIHJvd3NcbiAqXG4gKiBEcmF3IGhvcml6b250YWwgbGluZSBpZiAybmQgY29sdW1uIHZhbHVlcyBhcmUgZGlmZmVyZW50LlxuICovXG5mdW5jdGlvbiBsaW5lQmV0d2Vlbihyb3dBOiBzdHJpbmdbXSwgcm93Qjogc3RyaW5nW10pIHtcbiAgcmV0dXJuIHJvd0FbMV0gIT09IHJvd0JbMV07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29sdW1uQ29uZmlnKHdpZHRoczogbnVtYmVyW10gfCB1bmRlZmluZWQpOiB7IFtpbmRleDogbnVtYmVyXTogdGFibGUuQ29sdW1uVXNlckNvbmZpZyB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHdpZHRocyA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cblxuICBjb25zdCByZXQ6IHsgW2luZGV4OiBudW1iZXJdOiB0YWJsZS5Db2x1bW5Vc2VyQ29uZmlnIH0gPSB7fTtcbiAgd2lkdGhzLmZvckVhY2goKHdpZHRoLCBpKSA9PiB7XG4gICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0W2ldID0geyB3aWR0aCB9O1xuICB9KTtcblxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBjb2x1bW4gd2lkdGhzIGdpdmVuIGEgdGVybWluYWwgd2lkdGhcbiAqXG4gKiBXZSBkbyB0aGlzIGJ5IGNhbGN1bGF0aW5nIGEgZmFpciBzaGFyZSBmb3IgZXZlcnkgY29sdW1uLiBFeHRyYSB3aWR0aCBzbWFsbGVyXG4gKiB0aGFuIHRoZSBmYWlyIHNoYXJlIGlzIGV2ZW5seSBkaXN0cmlidXRlZCBvdmVyIGFsbCBjb2x1bW5zIHRoYXQgZXhjZWVkIHRoZWlyXG4gKiBmYWlyIHNoYXJlLlxuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVDb2x1bW5XaWR0aHMocm93czogc3RyaW5nW11bXSwgdGVybWluYWxXaWR0aDogbnVtYmVyKTogbnVtYmVyW10ge1xuICAvLyBUaGUgdGVybWluYWwgaXMgc29tZXRpbWVzIHJlcG9ydGVkIHRvIGJlIDAuIEFsc28gaWYgdGhlIHRlcm1pbmFsIGlzIFZFUlkgbmFycm93LFxuICAvLyBqdXN0IGFzc3VtZSBhIHJlYXNvbmFibGUgbWluaW11bSBzaXplLlxuICB0ZXJtaW5hbFdpZHRoID0gTWF0aC5tYXgodGVybWluYWxXaWR0aCwgNDApO1xuXG4gIC8vIHVzZSAnc3RyaW5nLXdpZHRoJyB0byBub3QgY291bnQgQU5TSSBjaGFycyBhcyBhY3R1YWwgY2hhcmFjdGVyIHdpZHRoXG4gIGNvbnN0IGNvbHVtbnMgPSByb3dzWzBdLm1hcCgoXywgaSkgPT4gTWF0aC5tYXgoLi4ucm93cy5tYXAocm93ID0+IHN0cmluZ1dpZHRoKFN0cmluZyhyb3dbaV0pKSkpKTtcblxuICAvLyBJZiB3ZSBoYXZlIG5vIHRlcm1pbmFsIHdpZHRoLCBkbyBub3RoaW5nXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IHRlcm1pbmFsV2lkdGggLSAyIC0gY29sdW1ucy5sZW5ndGggKiAzO1xuXG4gIC8vIElmIHdlIGRvbid0IGV4Y2VlZCB0aGUgdGVybWluYWwgd2lkdGgsIGRvIG5vdGhpbmdcbiAgaWYgKHN1bShjb2x1bW5zKSA8PSBjb250ZW50V2lkdGgpIHsgcmV0dXJuIGNvbHVtbnM7IH1cblxuICBjb25zdCBmYWlyU2hhcmUgPSBNYXRoLm1pbihjb250ZW50V2lkdGggLyBjb2x1bW5zLmxlbmd0aCk7XG4gIGNvbnN0IHNtYWxsQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKHcgPT4gdyA8IGZhaXJTaGFyZSk7XG5cbiAgbGV0IGRpc3RyaWJ1dGFibGVXaWR0aCA9IGNvbnRlbnRXaWR0aCAtIHN1bShzbWFsbENvbHVtbnMpO1xuICBjb25zdCBmYWlyRGlzdHJpYnV0YWJsZSA9IE1hdGguZmxvb3IoZGlzdHJpYnV0YWJsZVdpZHRoIC8gKGNvbHVtbnMubGVuZ3RoIC0gc21hbGxDb2x1bW5zLmxlbmd0aCkpO1xuXG4gIGNvbnN0IHJldCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgcmVxdWVzdGVkV2lkdGggb2YgY29sdW1ucykge1xuICAgIGlmIChyZXF1ZXN0ZWRXaWR0aCA8IGZhaXJTaGFyZSkge1xuICAgICAgLy8gU21hbGwgY29sdW1uIGdldHMgd2hhdCB0aGV5IHdhbnRcbiAgICAgIHJldC5wdXNoKHJlcXVlc3RlZFdpZHRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGFzdCBjb2x1bW4gZ2V0cyBhbGwgcmVtYWluaW5nLCBvdGhlcndpc2UgZ2V0IGZhaXIgcmVkaXN0IHNoYXJlXG4gICAgICBjb25zdCB3aWR0aCA9IGRpc3RyaWJ1dGFibGVXaWR0aCA8IDIgKiBmYWlyRGlzdHJpYnV0YWJsZSA/IGRpc3RyaWJ1dGFibGVXaWR0aCA6IGZhaXJEaXN0cmlidXRhYmxlO1xuICAgICAgcmV0LnB1c2god2lkdGgpO1xuICAgICAgZGlzdHJpYnV0YWJsZVdpZHRoIC09IHdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHN1bSh4czogbnVtYmVyW10pOiBudW1iZXIge1xuICBsZXQgdG90YWwgPSAwO1xuICBmb3IgKGNvbnN0IHggb2YgeHMpIHtcbiAgICB0b3RhbCArPSB4O1xuICB9XG4gIHJldHVybiB0b3RhbDtcbn1cblxuLy8gV2hhdCBjb2xvciB0aGUgdGFibGUgaXMgZ29pbmcgdG8gYmVcbmNvbnN0IHRhYmxlQ29sb3IgPSBjaGFsay5ncmF5O1xuXG4vLyBVbmljb2RlIHRhYmxlIGNoYXJhY3RlcnMgd2l0aCBhIGNvbG9yXG5jb25zdCBUQUJMRV9CT1JERVJfQ0hBUkFDVEVSUyA9IHtcbiAgdG9wQm9keTogdGFibGVDb2xvcign4pSAJyksXG4gIHRvcEpvaW46IHRhYmxlQ29sb3IoJ+KUrCcpLFxuICB0b3BMZWZ0OiB0YWJsZUNvbG9yKCfilIwnKSxcbiAgdG9wUmlnaHQ6IHRhYmxlQ29sb3IoJ+KUkCcpLFxuICBib3R0b21Cb2R5OiB0YWJsZUNvbG9yKCfilIAnKSxcbiAgYm90dG9tSm9pbjogdGFibGVDb2xvcign4pS0JyksXG4gIGJvdHRvbUxlZnQ6IHRhYmxlQ29sb3IoJ+KUlCcpLFxuICBib3R0b21SaWdodDogdGFibGVDb2xvcign4pSYJyksXG4gIGJvZHlMZWZ0OiB0YWJsZUNvbG9yKCfilIInKSxcbiAgYm9keVJpZ2h0OiB0YWJsZUNvbG9yKCfilIInKSxcbiAgYm9keUpvaW46IHRhYmxlQ29sb3IoJ+KUgicpLFxuICBqb2luQm9keTogdGFibGVDb2xvcign4pSAJyksXG4gIGpvaW5MZWZ0OiB0YWJsZUNvbG9yKCfilJwnKSxcbiAgam9pblJpZ2h0OiB0YWJsZUNvbG9yKCfilKQnKSxcbiAgam9pbkpvaW46IHRhYmxlQ29sb3IoJ+KUvCcpLFxufTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.formatSecurityChanges = exports.formatDifferences = void 0;\nconst util_1 = require(\"util\");\nconst chalk = require(\"chalk\");\nconst util_2 = require(\"./diff/util\");\nconst diff_template_1 = require(\"./diff-template\");\nconst format_table_1 = require(\"./format-table\");\n// from cx-api\nconst PATH_METADATA_KEY = 'aws:cdk:path';\n/* eslint-disable @typescript-eslint/no-require-imports */\nconst { structuredPatch } = require('diff');\n/**\n * Renders template differences to the process' console.\n *\n * @param stream The IO stream where to output the rendered diff.\n * @param templateDiff TemplateDiff to be rendered to the console.\n * @param logicalToPathMap A map from logical ID to construct path. Useful in\n * case there is no aws:cdk:path metadata in the template.\n * @param context the number of context lines to use in arbitrary JSON diff (defaults to 3).\n */\nfunction formatDifferences(stream, templateDiff, logicalToPathMap = {}, context = 3) {\n const formatter = new Formatter(stream, logicalToPathMap, templateDiff, context);\n if (templateDiff.awsTemplateFormatVersion || templateDiff.transform || templateDiff.description) {\n formatter.printSectionHeader('Template');\n formatter.formatDifference('AWSTemplateFormatVersion', 'AWSTemplateFormatVersion', templateDiff.awsTemplateFormatVersion);\n formatter.formatDifference('Transform', 'Transform', templateDiff.transform);\n formatter.formatDifference('Description', 'Description', templateDiff.description);\n formatter.printSectionFooter();\n }\n formatSecurityChangesWithBanner(formatter, templateDiff);\n formatter.formatSection('Parameters', 'Parameter', templateDiff.parameters);\n formatter.formatSection('Metadata', 'Metadata', templateDiff.metadata);\n formatter.formatSection('Mappings', 'Mapping', templateDiff.mappings);\n formatter.formatSection('Conditions', 'Condition', templateDiff.conditions);\n formatter.formatSection('Resources', 'Resource', templateDiff.resources, formatter.formatResourceDifference.bind(formatter));\n formatter.formatSection('Outputs', 'Output', templateDiff.outputs);\n formatter.formatSection('Other Changes', 'Unknown', templateDiff.unknown);\n}\nexports.formatDifferences = formatDifferences;\n/**\n * Renders a diff of security changes to the given stream\n */\nfunction formatSecurityChanges(stream, templateDiff, logicalToPathMap = {}, context) {\n const formatter = new Formatter(stream, logicalToPathMap, templateDiff, context);\n formatSecurityChangesWithBanner(formatter, templateDiff);\n}\nexports.formatSecurityChanges = formatSecurityChanges;\nfunction formatSecurityChangesWithBanner(formatter, templateDiff) {\n if (!templateDiff.iamChanges.hasChanges && !templateDiff.securityGroupChanges.hasChanges) {\n return;\n }\n formatter.formatIamChanges(templateDiff.iamChanges);\n formatter.formatSecurityGroupChanges(templateDiff.securityGroupChanges);\n formatter.warning('(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)');\n formatter.printSectionFooter();\n}\nconst ADDITION = chalk.green('[+]');\nconst CONTEXT = chalk.grey('[ ]');\nconst UPDATE = chalk.yellow('[~]');\nconst REMOVAL = chalk.red('[-]');\nclass Formatter {\n constructor(stream, logicalToPathMap, diff, context = 3) {\n this.stream = stream;\n this.logicalToPathMap = logicalToPathMap;\n this.context = context;\n // Read additional construct paths from the diff if it is supplied\n if (diff) {\n this.readConstructPathsFrom(diff);\n }\n }\n print(fmt, ...args) {\n this.stream.write(chalk.white((0, util_1.format)(fmt, ...args)) + '\\n');\n }\n warning(fmt, ...args) {\n this.stream.write(chalk.yellow((0, util_1.format)(fmt, ...args)) + '\\n');\n }\n formatSection(title, entryType, collection, formatter = this.formatDifference.bind(this)) {\n if (collection.differenceCount === 0) {\n return;\n }\n this.printSectionHeader(title);\n collection.forEachDifference((id, diff) => formatter(entryType, id, diff));\n this.printSectionFooter();\n }\n printSectionHeader(title) {\n this.print(chalk.underline(chalk.bold(title)));\n }\n printSectionFooter() {\n this.print('');\n }\n /**\n * Print a simple difference for a given named entity.\n *\n * @param logicalId the name of the entity that is different.\n * @param diff the difference to be rendered.\n */\n formatDifference(type, logicalId, diff) {\n if (!diff || !diff.isDifferent) {\n return;\n }\n let value;\n const oldValue = this.formatValue(diff.oldValue, chalk.red);\n const newValue = this.formatValue(diff.newValue, chalk.green);\n if (diff.isAddition) {\n value = newValue;\n }\n else if (diff.isUpdate) {\n value = `${oldValue} to ${newValue}`;\n }\n else if (diff.isRemoval) {\n value = oldValue;\n }\n this.print(`${this.formatPrefix(diff)} ${chalk.cyan(type)} ${this.formatLogicalId(logicalId)}: ${value}`);\n }\n /**\n * Print a resource difference for a given logical ID.\n *\n * @param logicalId the logical ID of the resource that changed.\n * @param diff the change to be rendered.\n */\n formatResourceDifference(_type, logicalId, diff) {\n if (!diff.isDifferent) {\n return;\n }\n const resourceType = diff.isRemoval ? diff.oldResourceType : diff.newResourceType;\n // eslint-disable-next-line max-len\n this.print(`${this.formatPrefix(diff)} ${this.formatValue(resourceType, chalk.cyan)} ${this.formatLogicalId(logicalId)} ${this.formatImpact(diff.changeImpact)}`);\n if (diff.isUpdate) {\n const differenceCount = diff.differenceCount;\n let processedCount = 0;\n diff.forEachDifference((_, name, values) => {\n processedCount += 1;\n this.formatTreeDiff(name, values, processedCount === differenceCount);\n });\n }\n }\n formatPrefix(diff) {\n if (diff.isAddition) {\n return ADDITION;\n }\n if (diff.isUpdate) {\n return UPDATE;\n }\n if (diff.isRemoval) {\n return REMOVAL;\n }\n return chalk.white('[?]');\n }\n /**\n * @param value the value to be formatted.\n * @param color the color to be used.\n *\n * @returns the formatted string, with color applied.\n */\n formatValue(value, color) {\n if (value == null) {\n return undefined;\n }\n if (typeof value === 'string') {\n return color(value);\n }\n return color(JSON.stringify(value));\n }\n /**\n * @param impact the impact to be formatted\n * @returns a user-friendly, colored string representing the impact.\n */\n formatImpact(impact) {\n switch (impact) {\n case diff_template_1.ResourceImpact.MAY_REPLACE:\n return chalk.italic(chalk.yellow('may be replaced'));\n case diff_template_1.ResourceImpact.WILL_REPLACE:\n return chalk.italic(chalk.bold(chalk.red('replace')));\n case diff_template_1.ResourceImpact.WILL_DESTROY:\n return chalk.italic(chalk.bold(chalk.red('destroy')));\n case diff_template_1.ResourceImpact.WILL_ORPHAN:\n return chalk.italic(chalk.yellow('orphan'));\n case diff_template_1.ResourceImpact.WILL_UPDATE:\n case diff_template_1.ResourceImpact.WILL_CREATE:\n case diff_template_1.ResourceImpact.NO_CHANGE:\n return ''; // no extra info is gained here\n }\n }\n /**\n * Renders a tree of differences under a particular name.\n * @param name the name of the root of the tree.\n * @param diff the difference on the tree.\n * @param last whether this is the last node of a parent tree.\n */\n formatTreeDiff(name, diff, last) {\n let additionalInfo = '';\n if ((0, diff_template_1.isPropertyDifference)(diff)) {\n if (diff.changeImpact === diff_template_1.ResourceImpact.MAY_REPLACE) {\n additionalInfo = ' (may cause replacement)';\n }\n else if (diff.changeImpact === diff_template_1.ResourceImpact.WILL_REPLACE) {\n additionalInfo = ' (requires replacement)';\n }\n }\n this.print(' %s─ %s %s%s', last ? '└' : '├', this.changeTag(diff.oldValue, diff.newValue), name, additionalInfo);\n return this.formatObjectDiff(diff.oldValue, diff.newValue, ` ${last ? ' ' : '│'}`);\n }\n /**\n * Renders the difference between two objects, looking for the differences as deep as possible,\n * and rendering a tree graph of the path until the difference is found.\n *\n * @param oldObject the old object.\n * @param newObject the new object.\n * @param linePrefix a prefix (indent-like) to be used on every line.\n */\n formatObjectDiff(oldObject, newObject, linePrefix) {\n if ((typeof oldObject !== typeof newObject) || Array.isArray(oldObject) || typeof oldObject === 'string' || typeof oldObject === 'number') {\n if (oldObject !== undefined && newObject !== undefined) {\n if (typeof oldObject === 'object' || typeof newObject === 'object') {\n const oldStr = JSON.stringify(oldObject, null, 2);\n const newStr = JSON.stringify(newObject, null, 2);\n const diff = _diffStrings(oldStr, newStr, this.context);\n for (let i = 0; i < diff.length; i++) {\n this.print('%s %s %s', linePrefix, i === 0 ? '└─' : ' ', diff[i]);\n }\n }\n else {\n this.print('%s ├─ %s %s', linePrefix, REMOVAL, this.formatValue(oldObject, chalk.red));\n this.print('%s └─ %s %s', linePrefix, ADDITION, this.formatValue(newObject, chalk.green));\n }\n }\n else if (oldObject !== undefined /* && newObject === undefined */) {\n this.print('%s └─ %s', linePrefix, this.formatValue(oldObject, chalk.red));\n }\n else /* if (oldObject === undefined && newObject !== undefined) */ {\n this.print('%s └─ %s', linePrefix, this.formatValue(newObject, chalk.green));\n }\n return;\n }\n const keySet = new Set(Object.keys(oldObject));\n Object.keys(newObject).forEach(k => keySet.add(k));\n const keys = new Array(...keySet).filter(k => !(0, util_2.deepEqual)(oldObject[k], newObject[k])).sort();\n const lastKey = keys[keys.length - 1];\n for (const key of keys) {\n const oldValue = oldObject[key];\n const newValue = newObject[key];\n const treePrefix = key === lastKey ? '└' : '├';\n if (oldValue !== undefined && newValue !== undefined) {\n this.print('%s %s─ %s %s:', linePrefix, treePrefix, this.changeTag(oldValue, newValue), chalk.blue(`.${key}`));\n this.formatObjectDiff(oldValue, newValue, `${linePrefix} ${key === lastKey ? ' ' : '│'}`);\n }\n else if (oldValue !== undefined /* && newValue === undefined */) {\n this.print('%s %s─ %s Removed: %s', linePrefix, treePrefix, REMOVAL, chalk.blue(`.${key}`));\n }\n else /* if (oldValue === undefined && newValue !== undefined */ {\n this.print('%s %s─ %s Added: %s', linePrefix, treePrefix, ADDITION, chalk.blue(`.${key}`));\n }\n }\n }\n /**\n * @param oldValue the old value of a difference.\n * @param newValue the new value of a difference.\n *\n * @returns a tag to be rendered in the diff, reflecting whether the difference\n * was an ADDITION, UPDATE or REMOVAL.\n */\n changeTag(oldValue, newValue) {\n if (oldValue !== undefined && newValue !== undefined) {\n return UPDATE;\n }\n else if (oldValue !== undefined /* && newValue === undefined*/) {\n return REMOVAL;\n }\n else /* if (oldValue === undefined && newValue !== undefined) */ {\n return ADDITION;\n }\n }\n /**\n * Find 'aws:cdk:path' metadata in the diff and add it to the logicalToPathMap\n *\n * There are multiple sources of logicalID -> path mappings: synth metadata\n * and resource metadata, and we combine all sources into a single map.\n */\n readConstructPathsFrom(templateDiff) {\n for (const [logicalId, resourceDiff] of Object.entries(templateDiff.resources)) {\n if (!resourceDiff) {\n continue;\n }\n const oldPathMetadata = resourceDiff.oldValue?.Metadata?.[PATH_METADATA_KEY];\n if (oldPathMetadata && !(logicalId in this.logicalToPathMap)) {\n this.logicalToPathMap[logicalId] = oldPathMetadata;\n }\n const newPathMetadata = resourceDiff.newValue?.Metadata?.[PATH_METADATA_KEY];\n if (newPathMetadata && !(logicalId in this.logicalToPathMap)) {\n this.logicalToPathMap[logicalId] = newPathMetadata;\n }\n }\n }\n formatLogicalId(logicalId) {\n // if we have a path in the map, return it\n const normalized = this.normalizedLogicalIdPath(logicalId);\n if (normalized) {\n return `${normalized} ${chalk.gray(logicalId)}`;\n }\n return logicalId;\n }\n normalizedLogicalIdPath(logicalId) {\n // if we have a path in the map, return it\n const path = this.logicalToPathMap[logicalId];\n return path ? normalizePath(path) : undefined;\n /**\n * Path is supposed to start with \"/stack-name\". If this is the case (i.e. path has more than\n * two components, we remove the first part. Otherwise, we just use the full path.\n * @param p\n */\n function normalizePath(p) {\n if (p.startsWith('/')) {\n p = p.slice(1);\n }\n let parts = p.split('/');\n if (parts.length > 1) {\n parts = parts.slice(1);\n // remove the last component if it's \"Resource\" or \"Default\" (if we have more than a single component)\n if (parts.length > 1) {\n const last = parts[parts.length - 1];\n if (last === 'Resource' || last === 'Default') {\n parts = parts.slice(0, parts.length - 1);\n }\n }\n p = parts.join('/');\n }\n return p;\n }\n }\n formatIamChanges(changes) {\n if (!changes.hasChanges) {\n return;\n }\n if (changes.statements.hasChanges) {\n this.printSectionHeader('IAM Statement Changes');\n this.print((0, format_table_1.formatTable)(this.deepSubstituteBracedLogicalIds(changes.summarizeStatements()), this.stream.columns));\n }\n if (changes.managedPolicies.hasChanges) {\n this.printSectionHeader('IAM Policy Changes');\n this.print((0, format_table_1.formatTable)(this.deepSubstituteBracedLogicalIds(changes.summarizeManagedPolicies()), this.stream.columns));\n }\n }\n formatSecurityGroupChanges(changes) {\n if (!changes.hasChanges) {\n return;\n }\n this.printSectionHeader('Security Group Changes');\n this.print((0, format_table_1.formatTable)(this.deepSubstituteBracedLogicalIds(changes.summarize()), this.stream.columns));\n }\n deepSubstituteBracedLogicalIds(rows) {\n return rows.map(row => row.map(this.substituteBracedLogicalIds.bind(this)));\n }\n /**\n * Substitute all strings like ${LogId.xxx} with the path instead of the logical ID\n */\n substituteBracedLogicalIds(source) {\n return source.replace(/\\$\\{([^.}]+)(.[^}]+)?\\}/ig, (_match, logId, suffix) => {\n return '${' + (this.normalizedLogicalIdPath(logId) || logId) + (suffix || '') + '}';\n });\n }\n}\n/**\n * Creates a unified diff of two strings.\n *\n * @param oldStr the \"old\" version of the string.\n * @param newStr the \"new\" version of the string.\n * @param context the number of context lines to use in arbitrary JSON diff.\n *\n * @returns an array of diff lines.\n */\nfunction _diffStrings(oldStr, newStr, context) {\n const patch = structuredPatch(null, null, oldStr, newStr, null, null, { context });\n const result = new Array();\n for (const hunk of patch.hunks) {\n result.push(chalk.magenta(`@@ -${hunk.oldStart},${hunk.oldLines} +${hunk.newStart},${hunk.newLines} @@`));\n const baseIndent = _findIndent(hunk.lines);\n for (const line of hunk.lines) {\n // Don't care about termination newline.\n if (line === '\\\\ No newline at end of file') {\n continue;\n }\n const marker = line.charAt(0);\n const text = line.slice(1 + baseIndent);\n switch (marker) {\n case ' ':\n result.push(`${CONTEXT} ${text}`);\n break;\n case '+':\n result.push(chalk.bold(`${ADDITION} ${chalk.green(text)}`));\n break;\n case '-':\n result.push(chalk.bold(`${REMOVAL} ${chalk.red(text)}`));\n break;\n default:\n throw new Error(`Unexpected diff marker: ${marker} (full line: ${line})`);\n }\n }\n }\n return result;\n function _findIndent(lines) {\n let indent = Number.MAX_SAFE_INTEGER;\n for (const line of lines) {\n for (let i = 1; i < line.length; i++) {\n if (line.charAt(i) !== ' ') {\n indent = indent > i - 1 ? i - 1 : indent;\n break;\n }\n }\n }\n return indent;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUE4QjtBQUM5QiwrQkFBK0I7QUFFL0Isc0NBQXdDO0FBQ3hDLG1EQUF1RztBQUN2RyxpREFBNkM7QUFJN0MsY0FBYztBQUNkLE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDO0FBRXpDLDBEQUEwRDtBQUMxRCxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBTzVDOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLE1BQW9CLEVBQ3BCLFlBQTBCLEVBQzFCLG1CQUFvRCxFQUFHLEVBQ3ZELFVBQWtCLENBQUM7SUFDbkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVqRixJQUFJLFlBQVksQ0FBQyx3QkFBd0IsSUFBSSxZQUFZLENBQUMsU0FBUyxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUU7UUFDL0YsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsRUFBRSwwQkFBMEIsRUFBRSxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUMxSCxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0UsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25GLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0tBQ2hDO0lBRUQsK0JBQStCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRXpELFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RSxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RFLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzdILFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBeEJELDhDQXdCQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQ25DLE1BQTZCLEVBQzdCLFlBQTBCLEVBQzFCLG1CQUFrRCxFQUFFLEVBQ3BELE9BQWdCO0lBQ2hCLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFakYsK0JBQStCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFSRCxzREFRQztBQUVELFNBQVMsK0JBQStCLENBQUMsU0FBb0IsRUFBRSxZQUEwQjtJQUN2RixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFO1FBQUUsT0FBTztLQUFFO0lBQ3JHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEQsU0FBUyxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRXhFLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0hBQWdILENBQUMsQ0FBQztJQUNwSSxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUVqQyxNQUFNLFNBQVM7SUFDYixZQUNtQixNQUFvQixFQUNwQixnQkFBaUQsRUFDbEUsSUFBbUIsRUFDRixVQUFrQixDQUFDO1FBSG5CLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQztRQUVqRCxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ3BDLGtFQUFrRTtRQUNsRSxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsR0FBVyxFQUFFLEdBQUcsSUFBVztRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUEsYUFBTSxFQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBQSxhQUFNLEVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU0sYUFBYSxDQUNsQixLQUFhLEVBQ2IsU0FBaUIsRUFDakIsVUFBc0MsRUFDdEMsWUFBeUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFekYsSUFBSSxVQUFVLENBQUMsZUFBZSxLQUFLLENBQUMsRUFBRTtZQUNwQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sa0JBQWtCLENBQUMsS0FBYTtRQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGdCQUFnQixDQUFDLElBQVksRUFBRSxTQUFpQixFQUFFLElBQWlDO1FBQ3hGLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRTNDLElBQUksS0FBSyxDQUFDO1FBRVYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ2xCO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3hCLEtBQUssR0FBRyxHQUFHLFFBQVEsT0FBTyxRQUFRLEVBQUUsQ0FBQztTQUN0QzthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN6QixLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksd0JBQXdCLENBQUMsS0FBYSxFQUFFLFNBQWlCLEVBQUUsSUFBd0I7UUFDeEYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUVsRixtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWxLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzdDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUN6QyxjQUFjLElBQUksQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxLQUFLLGVBQWUsQ0FBQyxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU0sWUFBWSxDQUFJLElBQW1CO1FBQ3hDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU8sUUFBUSxDQUFDO1NBQUU7UUFDekMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQUUsT0FBTyxNQUFNLENBQUM7U0FBRTtRQUNyQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPLE9BQU8sQ0FBQztTQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxXQUFXLENBQUMsS0FBVSxFQUFFLEtBQThCO1FBQzNELElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtZQUFFLE9BQU8sU0FBUyxDQUFDO1NBQUU7UUFDeEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUFFO1FBQ3ZELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksWUFBWSxDQUFDLE1BQXNCO1FBQ3hDLFFBQVEsTUFBTSxFQUFFO1lBQ2QsS0FBSyw4QkFBYyxDQUFDLFdBQVc7Z0JBQzdCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUN2RCxLQUFLLDhCQUFjLENBQUMsWUFBWTtnQkFDOUIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsS0FBSyw4QkFBYyxDQUFDLFlBQVk7Z0JBQzlCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELEtBQUssOEJBQWMsQ0FBQyxXQUFXO2dCQUM3QixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzlDLEtBQUssOEJBQWMsQ0FBQyxXQUFXLENBQUM7WUFDaEMsS0FBSyw4QkFBYyxDQUFDLFdBQVcsQ0FBQztZQUNoQyxLQUFLLDhCQUFjLENBQUMsU0FBUztnQkFDM0IsT0FBTyxFQUFFLENBQUMsQ0FBQywrQkFBK0I7U0FDN0M7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxjQUFjLENBQUMsSUFBWSxFQUFFLElBQXFCLEVBQUUsSUFBYTtRQUN0RSxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFBLG9DQUFvQixFQUFDLElBQUksQ0FBQyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyw4QkFBYyxDQUFDLFdBQVcsRUFBRTtnQkFDcEQsY0FBYyxHQUFHLDBCQUEwQixDQUFDO2FBQzdDO2lCQUFNLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyw4QkFBYyxDQUFDLFlBQVksRUFBRTtnQkFDNUQsY0FBYyxHQUFHLHlCQUF5QixDQUFDO2FBQzVDO1NBQ0Y7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2pILE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZ0JBQWdCLENBQUMsU0FBYyxFQUFFLFNBQWMsRUFBRSxVQUFrQjtRQUN4RSxJQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssT0FBTyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDekksSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7Z0JBQ3RELElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtvQkFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUcsQ0FBQyxFQUFFLEVBQUU7d0JBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdEU7aUJBQ0Y7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDekYsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDN0Y7YUFDRjtpQkFBTSxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsZ0NBQWdDLEVBQUU7Z0JBQ25FLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM5RTtpQkFBTSw2REFBNkQsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsT0FBTztTQUNSO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFBLGdCQUFTLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDdEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLFVBQVUsR0FBRyxHQUFHLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMvQyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtnQkFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsVUFBVSxNQUFNLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQzthQUM3RjtpQkFBTSxJQUFJLFFBQVEsS0FBSyxTQUFTLENBQUMsK0JBQStCLEVBQUU7Z0JBQ2pFLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMvRjtpQkFBTSwwREFBMEQsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzlGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksU0FBUyxDQUFDLFFBQXlCLEVBQUUsUUFBeUI7UUFDbkUsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDcEQsT0FBTyxNQUFNLENBQUM7U0FDZjthQUFNLElBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQyw4QkFBOEIsRUFBRTtZQUNoRSxPQUFPLE9BQU8sQ0FBQztTQUNoQjthQUFNLDJEQUEyRCxDQUFDO1lBQ2pFLE9BQU8sUUFBUSxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksc0JBQXNCLENBQUMsWUFBMEI7UUFDdEQsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzlFLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBRWhDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM3RSxJQUFJLGVBQWUsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsZUFBZSxDQUFDO2FBQ3BEO1lBRUQsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdFLElBQUksZUFBZSxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxlQUFlLENBQUM7YUFDcEQ7U0FDRjtJQUNILENBQUM7SUFFTSxlQUFlLENBQUMsU0FBaUI7UUFDdEMsMENBQTBDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUzRCxJQUFJLFVBQVUsRUFBRTtZQUNkLE9BQU8sR0FBRyxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1NBQ2pEO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVNLHVCQUF1QixDQUFDLFNBQWlCO1FBQzlDLDBDQUEwQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlDOzs7O1dBSUc7UUFDSCxTQUFTLGFBQWEsQ0FBQyxDQUFTO1lBQzlCLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDckIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEI7WUFFRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BCLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2QixzR0FBc0c7Z0JBQ3RHLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3BCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTt3QkFDN0MsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQzFDO2lCQUNGO2dCQUVELENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3JCO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVNLGdCQUFnQixDQUFDLE9BQW1CO1FBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRXBDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7WUFDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLDBCQUFXLEVBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ2xIO1FBRUQsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRTtZQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUEsMEJBQVcsRUFBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDdkg7SUFDSCxDQUFDO0lBRU0sMEJBQTBCLENBQUMsT0FBNkI7UUFDN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLDBCQUFXLEVBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRU0sOEJBQThCLENBQUMsSUFBZ0I7UUFDcEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSwwQkFBMEIsQ0FBQyxNQUFjO1FBQzlDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0UsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBdUJEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxPQUFlO0lBQ25FLE1BQU0sS0FBSyxHQUFVLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUNuQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7UUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxRyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM3Qix3Q0FBd0M7WUFDeEMsSUFBSSxJQUFJLEtBQUssOEJBQThCLEVBQUU7Z0JBQUUsU0FBUzthQUFFO1lBQzFELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7WUFDeEMsUUFBUSxNQUFNLEVBQUU7Z0JBQ2QsS0FBSyxHQUFHO29CQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDbEMsTUFBTTtnQkFDUixLQUFLLEdBQUc7b0JBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzVELE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN6RCxNQUFNO2dCQUNSO29CQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE1BQU0sZ0JBQWdCLElBQUksR0FBRyxDQUFDLENBQUM7YUFDN0U7U0FDRjtLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUM7SUFFZCxTQUFTLFdBQVcsQ0FBQyxLQUFlO1FBQ2xDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRyxDQUFDLEVBQUUsRUFBRTtnQkFDdEMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtvQkFDMUIsTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7b0JBQ3pDLE1BQU07aUJBQ1A7YUFDRjtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IERpZmZlcmVuY2VDb2xsZWN0aW9uLCBUZW1wbGF0ZURpZmYgfSBmcm9tICcuL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9kaWZmL3V0aWwnO1xuaW1wb3J0IHsgRGlmZmVyZW5jZSwgaXNQcm9wZXJ0eURpZmZlcmVuY2UsIFJlc291cmNlRGlmZmVyZW5jZSwgUmVzb3VyY2VJbXBhY3QgfSBmcm9tICcuL2RpZmYtdGVtcGxhdGUnO1xuaW1wb3J0IHsgZm9ybWF0VGFibGUgfSBmcm9tICcuL2Zvcm1hdC10YWJsZSc7XG5pbXBvcnQgeyBJYW1DaGFuZ2VzIH0gZnJvbSAnLi9pYW0vaWFtLWNoYW5nZXMnO1xuaW1wb3J0IHsgU2VjdXJpdHlHcm91cENoYW5nZXMgfSBmcm9tICcuL25ldHdvcmsvc2VjdXJpdHktZ3JvdXAtY2hhbmdlcyc7XG5cbi8vIGZyb20gY3gtYXBpXG5jb25zdCBQQVRIX01FVEFEQVRBX0tFWSA9ICdhd3M6Y2RrOnBhdGgnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5jb25zdCB7IHN0cnVjdHVyZWRQYXRjaCB9ID0gcmVxdWlyZSgnZGlmZicpO1xuLyogZXNsaW50LWVuYWJsZSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdFN0cmVhbSBleHRlbmRzIE5vZGVKUy5Xcml0YWJsZVN0cmVhbSB7XG4gIGNvbHVtbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVuZGVycyB0ZW1wbGF0ZSBkaWZmZXJlbmNlcyB0byB0aGUgcHJvY2VzcycgY29uc29sZS5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtICAgICAgICAgICBUaGUgSU8gc3RyZWFtIHdoZXJlIHRvIG91dHB1dCB0aGUgcmVuZGVyZWQgZGlmZi5cbiAqIEBwYXJhbSB0ZW1wbGF0ZURpZmYgICAgIFRlbXBsYXRlRGlmZiB0byBiZSByZW5kZXJlZCB0byB0aGUgY29uc29sZS5cbiAqIEBwYXJhbSBsb2dpY2FsVG9QYXRoTWFwIEEgbWFwIGZyb20gbG9naWNhbCBJRCB0byBjb25zdHJ1Y3QgcGF0aC4gVXNlZnVsIGluXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoZXJlIGlzIG5vIGF3czpjZGs6cGF0aCBtZXRhZGF0YSBpbiB0aGUgdGVtcGxhdGUuXG4gKiBAcGFyYW0gY29udGV4dCAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gdXNlIGluIGFyYml0cmFyeSBKU09OIGRpZmYgKGRlZmF1bHRzIHRvIDMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGlmZmVyZW5jZXMoXG4gIHN0cmVhbTogRm9ybWF0U3RyZWFtLFxuICB0ZW1wbGF0ZURpZmY6IFRlbXBsYXRlRGlmZixcbiAgbG9naWNhbFRvUGF0aE1hcDogeyBbbG9naWNhbElkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHsgfSxcbiAgY29udGV4dDogbnVtYmVyID0gMykge1xuICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKHN0cmVhbSwgbG9naWNhbFRvUGF0aE1hcCwgdGVtcGxhdGVEaWZmLCBjb250ZXh0KTtcblxuICBpZiAodGVtcGxhdGVEaWZmLmF3c1RlbXBsYXRlRm9ybWF0VmVyc2lvbiB8fCB0ZW1wbGF0ZURpZmYudHJhbnNmb3JtIHx8IHRlbXBsYXRlRGlmZi5kZXNjcmlwdGlvbikge1xuICAgIGZvcm1hdHRlci5wcmludFNlY3Rpb25IZWFkZXIoJ1RlbXBsYXRlJyk7XG4gICAgZm9ybWF0dGVyLmZvcm1hdERpZmZlcmVuY2UoJ0FXU1RlbXBsYXRlRm9ybWF0VmVyc2lvbicsICdBV1NUZW1wbGF0ZUZvcm1hdFZlcnNpb24nLCB0ZW1wbGF0ZURpZmYuYXdzVGVtcGxhdGVGb3JtYXRWZXJzaW9uKTtcbiAgICBmb3JtYXR0ZXIuZm9ybWF0RGlmZmVyZW5jZSgnVHJhbnNmb3JtJywgJ1RyYW5zZm9ybScsIHRlbXBsYXRlRGlmZi50cmFuc2Zvcm0pO1xuICAgIGZvcm1hdHRlci5mb3JtYXREaWZmZXJlbmNlKCdEZXNjcmlwdGlvbicsICdEZXNjcmlwdGlvbicsIHRlbXBsYXRlRGlmZi5kZXNjcmlwdGlvbik7XG4gICAgZm9ybWF0dGVyLnByaW50U2VjdGlvbkZvb3RlcigpO1xuICB9XG5cbiAgZm9ybWF0U2VjdXJpdHlDaGFuZ2VzV2l0aEJhbm5lcihmb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZik7XG5cbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ1BhcmFtZXRlcnMnLCAnUGFyYW1ldGVyJywgdGVtcGxhdGVEaWZmLnBhcmFtZXRlcnMpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignTWV0YWRhdGEnLCAnTWV0YWRhdGEnLCB0ZW1wbGF0ZURpZmYubWV0YWRhdGEpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignTWFwcGluZ3MnLCAnTWFwcGluZycsIHRlbXBsYXRlRGlmZi5tYXBwaW5ncyk7XG4gIGZvcm1hdHRlci5mb3JtYXRTZWN0aW9uKCdDb25kaXRpb25zJywgJ0NvbmRpdGlvbicsIHRlbXBsYXRlRGlmZi5jb25kaXRpb25zKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ1Jlc291cmNlcycsICdSZXNvdXJjZScsIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMsIGZvcm1hdHRlci5mb3JtYXRSZXNvdXJjZURpZmZlcmVuY2UuYmluZChmb3JtYXR0ZXIpKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3Rpb24oJ091dHB1dHMnLCAnT3V0cHV0JywgdGVtcGxhdGVEaWZmLm91dHB1dHMpO1xuICBmb3JtYXR0ZXIuZm9ybWF0U2VjdGlvbignT3RoZXIgQ2hhbmdlcycsICdVbmtub3duJywgdGVtcGxhdGVEaWZmLnVua25vd24pO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBkaWZmIG9mIHNlY3VyaXR5IGNoYW5nZXMgdG8gdGhlIGdpdmVuIHN0cmVhbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2VjdXJpdHlDaGFuZ2VzKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0YWJsZVN0cmVhbSxcbiAgdGVtcGxhdGVEaWZmOiBUZW1wbGF0ZURpZmYsXG4gIGxvZ2ljYWxUb1BhdGhNYXA6IHtbbG9naWNhbElkOiBzdHJpbmddOiBzdHJpbmd9ID0ge30sXG4gIGNvbnRleHQ/OiBudW1iZXIpIHtcbiAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcihzdHJlYW0sIGxvZ2ljYWxUb1BhdGhNYXAsIHRlbXBsYXRlRGlmZiwgY29udGV4dCk7XG5cbiAgZm9ybWF0U2VjdXJpdHlDaGFuZ2VzV2l0aEJhbm5lcihmb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlY3VyaXR5Q2hhbmdlc1dpdGhCYW5uZXIoZm9ybWF0dGVyOiBGb3JtYXR0ZXIsIHRlbXBsYXRlRGlmZjogVGVtcGxhdGVEaWZmKSB7XG4gIGlmICghdGVtcGxhdGVEaWZmLmlhbUNoYW5nZXMuaGFzQ2hhbmdlcyAmJiAhdGVtcGxhdGVEaWZmLnNlY3VyaXR5R3JvdXBDaGFuZ2VzLmhhc0NoYW5nZXMpIHsgcmV0dXJuOyB9XG4gIGZvcm1hdHRlci5mb3JtYXRJYW1DaGFuZ2VzKHRlbXBsYXRlRGlmZi5pYW1DaGFuZ2VzKTtcbiAgZm9ybWF0dGVyLmZvcm1hdFNlY3VyaXR5R3JvdXBDaGFuZ2VzKHRlbXBsYXRlRGlmZi5zZWN1cml0eUdyb3VwQ2hhbmdlcyk7XG5cbiAgZm9ybWF0dGVyLndhcm5pbmcoJyhOT1RFOiBUaGVyZSBtYXkgYmUgc2VjdXJpdHktcmVsYXRlZCBjaGFuZ2VzIG5vdCBpbiB0aGlzIGxpc3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzEyOTkpJyk7XG4gIGZvcm1hdHRlci5wcmludFNlY3Rpb25Gb290ZXIoKTtcbn1cblxuY29uc3QgQURESVRJT04gPSBjaGFsay5ncmVlbignWytdJyk7XG5jb25zdCBDT05URVhUID0gY2hhbGsuZ3JleSgnWyBdJyk7XG5jb25zdCBVUERBVEUgPSBjaGFsay55ZWxsb3coJ1t+XScpO1xuY29uc3QgUkVNT1ZBTCA9IGNoYWxrLnJlZCgnWy1dJyk7XG5cbmNsYXNzIEZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyZWFtOiBGb3JtYXRTdHJlYW0sXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dpY2FsVG9QYXRoTWFwOiB7IFtsb2dpY2FsSWQ6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIGRpZmY/OiBUZW1wbGF0ZURpZmYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBudW1iZXIgPSAzKSB7XG4gICAgLy8gUmVhZCBhZGRpdGlvbmFsIGNvbnN0cnVjdCBwYXRocyBmcm9tIHRoZSBkaWZmIGlmIGl0IGlzIHN1cHBsaWVkXG4gICAgaWYgKGRpZmYpIHtcbiAgICAgIHRoaXMucmVhZENvbnN0cnVjdFBhdGhzRnJvbShkaWZmKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJpbnQoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5zdHJlYW0ud3JpdGUoY2hhbGsud2hpdGUoZm9ybWF0KGZtdCwgLi4uYXJncykpICsgJ1xcbicpO1xuICB9XG5cbiAgcHVibGljIHdhcm5pbmcoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5zdHJlYW0ud3JpdGUoY2hhbGsueWVsbG93KGZvcm1hdChmbXQsIC4uLmFyZ3MpKSArICdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXRTZWN0aW9uPFYsIFQgZXh0ZW5kcyBEaWZmZXJlbmNlPFY+PihcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGVudHJ5VHlwZTogc3RyaW5nLFxuICAgIGNvbGxlY3Rpb246IERpZmZlcmVuY2VDb2xsZWN0aW9uPFYsIFQ+LFxuICAgIGZvcm1hdHRlcjogKHR5cGU6IHN0cmluZywgaWQ6IHN0cmluZywgZGlmZjogVCkgPT4gdm9pZCA9IHRoaXMuZm9ybWF0RGlmZmVyZW5jZS5iaW5kKHRoaXMpKSB7XG5cbiAgICBpZiAoY29sbGVjdGlvbi5kaWZmZXJlbmNlQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByaW50U2VjdGlvbkhlYWRlcih0aXRsZSk7XG4gICAgY29sbGVjdGlvbi5mb3JFYWNoRGlmZmVyZW5jZSgoaWQsIGRpZmYpID0+IGZvcm1hdHRlcihlbnRyeVR5cGUsIGlkLCBkaWZmKSk7XG4gICAgdGhpcy5wcmludFNlY3Rpb25Gb290ZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmludFNlY3Rpb25IZWFkZXIodGl0bGU6IHN0cmluZykge1xuICAgIHRoaXMucHJpbnQoY2hhbGsudW5kZXJsaW5lKGNoYWxrLmJvbGQodGl0bGUpKSk7XG4gIH1cblxuICBwdWJsaWMgcHJpbnRTZWN0aW9uRm9vdGVyKCkge1xuICAgIHRoaXMucHJpbnQoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IGEgc2ltcGxlIGRpZmZlcmVuY2UgZm9yIGEgZ2l2ZW4gbmFtZWQgZW50aXR5LlxuICAgKlxuICAgKiBAcGFyYW0gbG9naWNhbElkIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBkaWZmZXJlbnQuXG4gICAqIEBwYXJhbSBkaWZmIHRoZSBkaWZmZXJlbmNlIHRvIGJlIHJlbmRlcmVkLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdERpZmZlcmVuY2UodHlwZTogc3RyaW5nLCBsb2dpY2FsSWQ6IHN0cmluZywgZGlmZjogRGlmZmVyZW5jZTxhbnk+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFkaWZmIHx8ICFkaWZmLmlzRGlmZmVyZW50KSB7IHJldHVybjsgfVxuXG4gICAgbGV0IHZhbHVlO1xuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKGRpZmYub2xkVmFsdWUsIGNoYWxrLnJlZCk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKGRpZmYubmV3VmFsdWUsIGNoYWxrLmdyZWVuKTtcbiAgICBpZiAoZGlmZi5pc0FkZGl0aW9uKSB7XG4gICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH0gZWxzZSBpZiAoZGlmZi5pc1VwZGF0ZSkge1xuICAgICAgdmFsdWUgPSBgJHtvbGRWYWx1ZX0gdG8gJHtuZXdWYWx1ZX1gO1xuICAgIH0gZWxzZSBpZiAoZGlmZi5pc1JlbW92YWwpIHtcbiAgICAgIHZhbHVlID0gb2xkVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5wcmludChgJHt0aGlzLmZvcm1hdFByZWZpeChkaWZmKX0gJHtjaGFsay5jeWFuKHR5cGUpfSAke3RoaXMuZm9ybWF0TG9naWNhbElkKGxvZ2ljYWxJZCl9OiAke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IGEgcmVzb3VyY2UgZGlmZmVyZW5jZSBmb3IgYSBnaXZlbiBsb2dpY2FsIElELlxuICAgKlxuICAgKiBAcGFyYW0gbG9naWNhbElkIHRoZSBsb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZSB0aGF0IGNoYW5nZWQuXG4gICAqIEBwYXJhbSBkaWZmICAgICAgdGhlIGNoYW5nZSB0byBiZSByZW5kZXJlZC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRSZXNvdXJjZURpZmZlcmVuY2UoX3R5cGU6IHN0cmluZywgbG9naWNhbElkOiBzdHJpbmcsIGRpZmY6IFJlc291cmNlRGlmZmVyZW5jZSkge1xuICAgIGlmICghZGlmZi5pc0RpZmZlcmVudCkgeyByZXR1cm47IH1cblxuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGRpZmYuaXNSZW1vdmFsID8gZGlmZi5vbGRSZXNvdXJjZVR5cGUgOiBkaWZmLm5ld1Jlc291cmNlVHlwZTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgdGhpcy5wcmludChgJHt0aGlzLmZvcm1hdFByZWZpeChkaWZmKX0gJHt0aGlzLmZvcm1hdFZhbHVlKHJlc291cmNlVHlwZSwgY2hhbGsuY3lhbil9ICR7dGhpcy5mb3JtYXRMb2dpY2FsSWQobG9naWNhbElkKX0gJHt0aGlzLmZvcm1hdEltcGFjdChkaWZmLmNoYW5nZUltcGFjdCl9YCk7XG5cbiAgICBpZiAoZGlmZi5pc1VwZGF0ZSkge1xuICAgICAgY29uc3QgZGlmZmVyZW5jZUNvdW50ID0gZGlmZi5kaWZmZXJlbmNlQ291bnQ7XG4gICAgICBsZXQgcHJvY2Vzc2VkQ291bnQgPSAwO1xuICAgICAgZGlmZi5mb3JFYWNoRGlmZmVyZW5jZSgoXywgbmFtZSwgdmFsdWVzKSA9PiB7XG4gICAgICAgIHByb2Nlc3NlZENvdW50ICs9IDE7XG4gICAgICAgIHRoaXMuZm9ybWF0VHJlZURpZmYobmFtZSwgdmFsdWVzLCBwcm9jZXNzZWRDb3VudCA9PT0gZGlmZmVyZW5jZUNvdW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXRQcmVmaXg8VD4oZGlmZjogRGlmZmVyZW5jZTxUPikge1xuICAgIGlmIChkaWZmLmlzQWRkaXRpb24pIHsgcmV0dXJuIEFERElUSU9OOyB9XG4gICAgaWYgKGRpZmYuaXNVcGRhdGUpIHsgcmV0dXJuIFVQREFURTsgfVxuICAgIGlmIChkaWZmLmlzUmVtb3ZhbCkgeyByZXR1cm4gUkVNT1ZBTDsgfVxuICAgIHJldHVybiBjaGFsay53aGl0ZSgnWz9dJyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBmb3JtYXR0ZWQuXG4gICAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgdG8gYmUgdXNlZC5cbiAgICpcbiAgICogQHJldHVybnMgdGhlIGZvcm1hdHRlZCBzdHJpbmcsIHdpdGggY29sb3IgYXBwbGllZC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRWYWx1ZSh2YWx1ZTogYW55LCBjb2xvcjogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGNvbG9yKHZhbHVlKTsgfVxuICAgIHJldHVybiBjb2xvcihKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbXBhY3QgdGhlIGltcGFjdCB0byBiZSBmb3JtYXR0ZWRcbiAgICogQHJldHVybnMgYSB1c2VyLWZyaWVuZGx5LCBjb2xvcmVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGltcGFjdC5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRJbXBhY3QoaW1wYWN0OiBSZXNvdXJjZUltcGFjdCkge1xuICAgIHN3aXRjaCAoaW1wYWN0KSB7XG4gICAgICBjYXNlIFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFOlxuICAgICAgICByZXR1cm4gY2hhbGsuaXRhbGljKGNoYWxrLnllbGxvdygnbWF5IGJlIHJlcGxhY2VkJykpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0U6XG4gICAgICAgIHJldHVybiBjaGFsay5pdGFsaWMoY2hhbGsuYm9sZChjaGFsay5yZWQoJ3JlcGxhY2UnKSkpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX0RFU1RST1k6XG4gICAgICAgIHJldHVybiBjaGFsay5pdGFsaWMoY2hhbGsuYm9sZChjaGFsay5yZWQoJ2Rlc3Ryb3knKSkpO1xuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX09SUEhBTjpcbiAgICAgICAgcmV0dXJuIGNoYWxrLml0YWxpYyhjaGFsay55ZWxsb3coJ29ycGhhbicpKTtcbiAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9VUERBVEU6XG4gICAgICBjYXNlIFJlc291cmNlSW1wYWN0LldJTExfQ1JFQVRFOlxuICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5OT19DSEFOR0U6XG4gICAgICAgIHJldHVybiAnJzsgLy8gbm8gZXh0cmEgaW5mbyBpcyBnYWluZWQgaGVyZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgdHJlZSBvZiBkaWZmZXJlbmNlcyB1bmRlciBhIHBhcnRpY3VsYXIgbmFtZS5cbiAgICogQHBhcmFtIG5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuXG4gICAqIEBwYXJhbSBkaWZmICAgIHRoZSBkaWZmZXJlbmNlIG9uIHRoZSB0cmVlLlxuICAgKiBAcGFyYW0gbGFzdCAgICB3aGV0aGVyIHRoaXMgaXMgdGhlIGxhc3Qgbm9kZSBvZiBhIHBhcmVudCB0cmVlLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdFRyZWVEaWZmKG5hbWU6IHN0cmluZywgZGlmZjogRGlmZmVyZW5jZTxhbnk+LCBsYXN0OiBib29sZWFuKSB7XG4gICAgbGV0IGFkZGl0aW9uYWxJbmZvID0gJyc7XG4gICAgaWYgKGlzUHJvcGVydHlEaWZmZXJlbmNlKGRpZmYpKSB7XG4gICAgICBpZiAoZGlmZi5jaGFuZ2VJbXBhY3QgPT09IFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFKSB7XG4gICAgICAgIGFkZGl0aW9uYWxJbmZvID0gJyAobWF5IGNhdXNlIHJlcGxhY2VtZW50KSc7XG4gICAgICB9IGVsc2UgaWYgKGRpZmYuY2hhbmdlSW1wYWN0ID09PSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0UpIHtcbiAgICAgICAgYWRkaXRpb25hbEluZm8gPSAnIChyZXF1aXJlcyByZXBsYWNlbWVudCknO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnByaW50KCcgJXPilIAgJXMgJXMlcycsIGxhc3QgPyAn4pSUJyA6ICfilJwnLCB0aGlzLmNoYW5nZVRhZyhkaWZmLm9sZFZhbHVlLCBkaWZmLm5ld1ZhbHVlKSwgbmFtZSwgYWRkaXRpb25hbEluZm8pO1xuICAgIHJldHVybiB0aGlzLmZvcm1hdE9iamVjdERpZmYoZGlmZi5vbGRWYWx1ZSwgZGlmZi5uZXdWYWx1ZSwgYCAke2xhc3QgPyAnICcgOiAn4pSCJ31gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIG9iamVjdHMsIGxvb2tpbmcgZm9yIHRoZSBkaWZmZXJlbmNlcyBhcyBkZWVwIGFzIHBvc3NpYmxlLFxuICAgKiBhbmQgcmVuZGVyaW5nIGEgdHJlZSBncmFwaCBvZiB0aGUgcGF0aCB1bnRpbCB0aGUgZGlmZmVyZW5jZSBpcyBmb3VuZC5cbiAgICpcbiAgICogQHBhcmFtIG9sZE9iamVjdCAgdGhlIG9sZCBvYmplY3QuXG4gICAqIEBwYXJhbSBuZXdPYmplY3QgIHRoZSBuZXcgb2JqZWN0LlxuICAgKiBAcGFyYW0gbGluZVByZWZpeCBhIHByZWZpeCAoaW5kZW50LWxpa2UpIHRvIGJlIHVzZWQgb24gZXZlcnkgbGluZS5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRPYmplY3REaWZmKG9sZE9iamVjdDogYW55LCBuZXdPYmplY3Q6IGFueSwgbGluZVByZWZpeDogc3RyaW5nKSB7XG4gICAgaWYgKCh0eXBlb2Ygb2xkT2JqZWN0ICE9PSB0eXBlb2YgbmV3T2JqZWN0KSB8fCBBcnJheS5pc0FycmF5KG9sZE9iamVjdCkgfHwgdHlwZW9mIG9sZE9iamVjdCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9sZE9iamVjdCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChvbGRPYmplY3QgIT09IHVuZGVmaW5lZCAmJiBuZXdPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIG9sZE9iamVjdCA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ld09iamVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBjb25zdCBvbGRTdHIgPSBKU09OLnN0cmluZ2lmeShvbGRPYmplY3QsIG51bGwsIDIpO1xuICAgICAgICAgIGNvbnN0IG5ld1N0ciA9IEpTT04uc3RyaW5naWZ5KG5ld09iamVjdCwgbnVsbCwgMik7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IF9kaWZmU3RyaW5ncyhvbGRTdHIsIG5ld1N0ciwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMCA7IGkgPCBkaWZmLmxlbmd0aCA7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5wcmludCgnJXMgICAlcyAlcycsIGxpbmVQcmVmaXgsIGkgPT09IDAgPyAn4pSU4pSAJyA6ICcgICcsIGRpZmZbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUnOKUgCAlcyAlcycsIGxpbmVQcmVmaXgsIFJFTU9WQUwsIHRoaXMuZm9ybWF0VmFsdWUob2xkT2JqZWN0LCBjaGFsay5yZWQpKTtcbiAgICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUlOKUgCAlcyAlcycsIGxpbmVQcmVmaXgsIEFERElUSU9OLCB0aGlzLmZvcm1hdFZhbHVlKG5ld09iamVjdCwgY2hhbGsuZ3JlZW4pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvbGRPYmplY3QgIT09IHVuZGVmaW5lZCAvKiAmJiBuZXdPYmplY3QgPT09IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB0aGlzLnByaW50KCclcyAgIOKUlOKUgCAlcycsIGxpbmVQcmVmaXgsIHRoaXMuZm9ybWF0VmFsdWUob2xkT2JqZWN0LCBjaGFsay5yZWQpKTtcbiAgICAgIH0gZWxzZSAvKiBpZiAob2xkT2JqZWN0ID09PSB1bmRlZmluZWQgJiYgbmV3T2JqZWN0ICE9PSB1bmRlZmluZWQpICovIHtcbiAgICAgICAgdGhpcy5wcmludCgnJXMgICDilJTilIAgJXMnLCBsaW5lUHJlZml4LCB0aGlzLmZvcm1hdFZhbHVlKG5ld09iamVjdCwgY2hhbGsuZ3JlZW4pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5U2V0ID0gbmV3IFNldChPYmplY3Qua2V5cyhvbGRPYmplY3QpKTtcbiAgICBPYmplY3Qua2V5cyhuZXdPYmplY3QpLmZvckVhY2goayA9PiBrZXlTZXQuYWRkKGspKTtcbiAgICBjb25zdCBrZXlzID0gbmV3IEFycmF5KC4uLmtleVNldCkuZmlsdGVyKGsgPT4gIWRlZXBFcXVhbChvbGRPYmplY3Rba10sIG5ld09iamVjdFtrXSkpLnNvcnQoKTtcbiAgICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkT2JqZWN0W2tleV07XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld09iamVjdFtrZXldO1xuICAgICAgY29uc3QgdHJlZVByZWZpeCA9IGtleSA9PT0gbGFzdEtleSA/ICfilJQnIDogJ+KUnCc7XG4gICAgICBpZiAob2xkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBuZXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucHJpbnQoJyVzICAgJXPilIAgJXMgJXM6JywgbGluZVByZWZpeCwgdHJlZVByZWZpeCwgdGhpcy5jaGFuZ2VUYWcob2xkVmFsdWUsIG5ld1ZhbHVlKSwgY2hhbGsuYmx1ZShgLiR7a2V5fWApKTtcbiAgICAgICAgdGhpcy5mb3JtYXRPYmplY3REaWZmKG9sZFZhbHVlLCBuZXdWYWx1ZSwgYCR7bGluZVByZWZpeH0gICAke2tleSA9PT0gbGFzdEtleSA/ICcgJyA6ICfilIInfWApO1xuICAgICAgfSBlbHNlIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkIC8qICYmIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKi8pIHtcbiAgICAgICAgdGhpcy5wcmludCgnJXMgICAlc+KUgCAlcyBSZW1vdmVkOiAlcycsIGxpbmVQcmVmaXgsIHRyZWVQcmVmaXgsIFJFTU9WQUwsIGNoYWxrLmJsdWUoYC4ke2tleX1gKSk7XG4gICAgICB9IGVsc2UgLyogaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCAqLyB7XG4gICAgICAgIHRoaXMucHJpbnQoJyVzICAgJXPilIAgJXMgQWRkZWQ6ICVzJywgbGluZVByZWZpeCwgdHJlZVByZWZpeCwgQURESVRJT04sIGNoYWxrLmJsdWUoYC4ke2tleX1gKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlIG9mIGEgZGlmZmVyZW5jZS5cbiAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgYSBkaWZmZXJlbmNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIHRhZyB0byBiZSByZW5kZXJlZCBpbiB0aGUgZGlmZiwgcmVmbGVjdGluZyB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlXG4gICAqICAgICAgd2FzIGFuIEFERElUSU9OLCBVUERBVEUgb3IgUkVNT1ZBTC5cbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VUYWcob2xkVmFsdWU6IGFueSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IGFueSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFVQREFURTtcbiAgICB9IGVsc2UgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQgLyogJiYgbmV3VmFsdWUgPT09IHVuZGVmaW5lZCovKSB7XG4gICAgICByZXR1cm4gUkVNT1ZBTDtcbiAgICB9IGVsc2UgLyogaWYgKG9sZFZhbHVlID09PSB1bmRlZmluZWQgJiYgbmV3VmFsdWUgIT09IHVuZGVmaW5lZCkgKi8ge1xuICAgICAgcmV0dXJuIEFERElUSU9OO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kICdhd3M6Y2RrOnBhdGgnIG1ldGFkYXRhIGluIHRoZSBkaWZmIGFuZCBhZGQgaXQgdG8gdGhlIGxvZ2ljYWxUb1BhdGhNYXBcbiAgICpcbiAgICogVGhlcmUgYXJlIG11bHRpcGxlIHNvdXJjZXMgb2YgbG9naWNhbElEIC0+IHBhdGggbWFwcGluZ3M6IHN5bnRoIG1ldGFkYXRhXG4gICAqIGFuZCByZXNvdXJjZSBtZXRhZGF0YSwgYW5kIHdlIGNvbWJpbmUgYWxsIHNvdXJjZXMgaW50byBhIHNpbmdsZSBtYXAuXG4gICAqL1xuICBwdWJsaWMgcmVhZENvbnN0cnVjdFBhdGhzRnJvbSh0ZW1wbGF0ZURpZmY6IFRlbXBsYXRlRGlmZikge1xuICAgIGZvciAoY29uc3QgW2xvZ2ljYWxJZCwgcmVzb3VyY2VEaWZmXSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURpZmYucmVzb3VyY2VzKSkge1xuICAgICAgaWYgKCFyZXNvdXJjZURpZmYpIHsgY29udGludWU7IH1cblxuICAgICAgY29uc3Qgb2xkUGF0aE1ldGFkYXRhID0gcmVzb3VyY2VEaWZmLm9sZFZhbHVlPy5NZXRhZGF0YT8uW1BBVEhfTUVUQURBVEFfS0VZXTtcbiAgICAgIGlmIChvbGRQYXRoTWV0YWRhdGEgJiYgIShsb2dpY2FsSWQgaW4gdGhpcy5sb2dpY2FsVG9QYXRoTWFwKSkge1xuICAgICAgICB0aGlzLmxvZ2ljYWxUb1BhdGhNYXBbbG9naWNhbElkXSA9IG9sZFBhdGhNZXRhZGF0YTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3UGF0aE1ldGFkYXRhID0gcmVzb3VyY2VEaWZmLm5ld1ZhbHVlPy5NZXRhZGF0YT8uW1BBVEhfTUVUQURBVEFfS0VZXTtcbiAgICAgIGlmIChuZXdQYXRoTWV0YWRhdGEgJiYgIShsb2dpY2FsSWQgaW4gdGhpcy5sb2dpY2FsVG9QYXRoTWFwKSkge1xuICAgICAgICB0aGlzLmxvZ2ljYWxUb1BhdGhNYXBbbG9naWNhbElkXSA9IG5ld1BhdGhNZXRhZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9ybWF0TG9naWNhbElkKGxvZ2ljYWxJZDogc3RyaW5nKSB7XG4gICAgLy8gaWYgd2UgaGF2ZSBhIHBhdGggaW4gdGhlIG1hcCwgcmV0dXJuIGl0XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplZExvZ2ljYWxJZFBhdGgobG9naWNhbElkKTtcblxuICAgIGlmIChub3JtYWxpemVkKSB7XG4gICAgICByZXR1cm4gYCR7bm9ybWFsaXplZH0gJHtjaGFsay5ncmF5KGxvZ2ljYWxJZCl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9naWNhbElkO1xuICB9XG5cbiAgcHVibGljIG5vcm1hbGl6ZWRMb2dpY2FsSWRQYXRoKGxvZ2ljYWxJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGEgcGF0aCBpbiB0aGUgbWFwLCByZXR1cm4gaXRcbiAgICBjb25zdCBwYXRoID0gdGhpcy5sb2dpY2FsVG9QYXRoTWFwW2xvZ2ljYWxJZF07XG4gICAgcmV0dXJuIHBhdGggPyBub3JtYWxpemVQYXRoKHBhdGgpIDogdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogUGF0aCBpcyBzdXBwb3NlZCB0byBzdGFydCB3aXRoIFwiL3N0YWNrLW5hbWVcIi4gSWYgdGhpcyBpcyB0aGUgY2FzZSAoaS5lLiBwYXRoIGhhcyBtb3JlIHRoYW5cbiAgICAgKiB0d28gY29tcG9uZW50cywgd2UgcmVtb3ZlIHRoZSBmaXJzdCBwYXJ0LiBPdGhlcndpc2UsIHdlIGp1c3QgdXNlIHRoZSBmdWxsIHBhdGguXG4gICAgICogQHBhcmFtIHBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHA6IHN0cmluZykge1xuICAgICAgaWYgKHAuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgIHAgPSBwLnNsaWNlKDEpO1xuICAgICAgfVxuXG4gICAgICBsZXQgcGFydHMgPSBwLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICBwYXJ0cyA9IHBhcnRzLnNsaWNlKDEpO1xuXG4gICAgICAgIC8vIHJlbW92ZSB0aGUgbGFzdCBjb21wb25lbnQgaWYgaXQncyBcIlJlc291cmNlXCIgb3IgXCJEZWZhdWx0XCIgKGlmIHdlIGhhdmUgbW9yZSB0aGFuIGEgc2luZ2xlIGNvbXBvbmVudClcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBjb25zdCBsYXN0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgaWYgKGxhc3QgPT09ICdSZXNvdXJjZScgfHwgbGFzdCA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIHBhcnRzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHAgPSBwYXJ0cy5qb2luKCcvJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9ybWF0SWFtQ2hhbmdlcyhjaGFuZ2VzOiBJYW1DaGFuZ2VzKSB7XG4gICAgaWYgKCFjaGFuZ2VzLmhhc0NoYW5nZXMpIHsgcmV0dXJuOyB9XG5cbiAgICBpZiAoY2hhbmdlcy5zdGF0ZW1lbnRzLmhhc0NoYW5nZXMpIHtcbiAgICAgIHRoaXMucHJpbnRTZWN0aW9uSGVhZGVyKCdJQU0gU3RhdGVtZW50IENoYW5nZXMnKTtcbiAgICAgIHRoaXMucHJpbnQoZm9ybWF0VGFibGUodGhpcy5kZWVwU3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMoY2hhbmdlcy5zdW1tYXJpemVTdGF0ZW1lbnRzKCkpLCB0aGlzLnN0cmVhbS5jb2x1bW5zKSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMubWFuYWdlZFBvbGljaWVzLmhhc0NoYW5nZXMpIHtcbiAgICAgIHRoaXMucHJpbnRTZWN0aW9uSGVhZGVyKCdJQU0gUG9saWN5IENoYW5nZXMnKTtcbiAgICAgIHRoaXMucHJpbnQoZm9ybWF0VGFibGUodGhpcy5kZWVwU3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMoY2hhbmdlcy5zdW1tYXJpemVNYW5hZ2VkUG9saWNpZXMoKSksIHRoaXMuc3RyZWFtLmNvbHVtbnMpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9ybWF0U2VjdXJpdHlHcm91cENoYW5nZXMoY2hhbmdlczogU2VjdXJpdHlHcm91cENoYW5nZXMpIHtcbiAgICBpZiAoIWNoYW5nZXMuaGFzQ2hhbmdlcykgeyByZXR1cm47IH1cblxuICAgIHRoaXMucHJpbnRTZWN0aW9uSGVhZGVyKCdTZWN1cml0eSBHcm91cCBDaGFuZ2VzJyk7XG4gICAgdGhpcy5wcmludChmb3JtYXRUYWJsZSh0aGlzLmRlZXBTdWJzdGl0dXRlQnJhY2VkTG9naWNhbElkcyhjaGFuZ2VzLnN1bW1hcml6ZSgpKSwgdGhpcy5zdHJlYW0uY29sdW1ucykpO1xuICB9XG5cbiAgcHVibGljIGRlZXBTdWJzdGl0dXRlQnJhY2VkTG9naWNhbElkcyhyb3dzOiBzdHJpbmdbXVtdKTogc3RyaW5nW11bXSB7XG4gICAgcmV0dXJuIHJvd3MubWFwKHJvdyA9PiByb3cubWFwKHRoaXMuc3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMuYmluZCh0aGlzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnN0aXR1dGUgYWxsIHN0cmluZ3MgbGlrZSAke0xvZ0lkLnh4eH0gd2l0aCB0aGUgcGF0aCBpbnN0ZWFkIG9mIHRoZSBsb2dpY2FsIElEXG4gICAqL1xuICBwdWJsaWMgc3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzb3VyY2UucmVwbGFjZSgvXFwkXFx7KFteLn1dKykoLltefV0rKT9cXH0vaWcsIChfbWF0Y2gsIGxvZ0lkLCBzdWZmaXgpID0+IHtcbiAgICAgIHJldHVybiAnJHsnICsgKHRoaXMubm9ybWFsaXplZExvZ2ljYWxJZFBhdGgobG9nSWQpIHx8IGxvZ0lkKSArIChzdWZmaXggfHwgJycpICsgJ30nO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQSBwYXRjaCBhcyByZXR1cm5lZCBieSBgYGRpZmYuc3RydWN0dXJlZFBhdGNoYGAuXG4gKi9cbmludGVyZmFjZSBQYXRjaCB7XG4gIC8qKlxuICAgKiBIdW5rcyBpbiB0aGUgcGF0Y2guXG4gICAqL1xuICBodW5rczogUmVhZG9ubHlBcnJheTxQYXRjaEh1bms+O1xufVxuXG4vKipcbiAqIEEgaHVuayBpbiBhIHBhdGNoIHByb2R1Y2VkIGJ5IGBgZGlmZi5zdHJ1Y3R1cmVkUGF0Y2hgYC5cbiAqL1xuaW50ZXJmYWNlIFBhdGNoSHVuayB7XG4gIG9sZFN0YXJ0OiBudW1iZXI7XG4gIG9sZExpbmVzOiBudW1iZXI7XG4gIG5ld1N0YXJ0OiBudW1iZXI7XG4gIG5ld0xpbmVzOiBudW1iZXI7XG4gIGxpbmVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdW5pZmllZCBkaWZmIG9mIHR3byBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSBvbGRTdHIgIHRoZSBcIm9sZFwiIHZlcnNpb24gb2YgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSBuZXdTdHIgIHRoZSBcIm5ld1wiIHZlcnNpb24gb2YgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSBjb250ZXh0IHRoZSBudW1iZXIgb2YgY29udGV4dCBsaW5lcyB0byB1c2UgaW4gYXJiaXRyYXJ5IEpTT04gZGlmZi5cbiAqXG4gKiBAcmV0dXJucyBhbiBhcnJheSBvZiBkaWZmIGxpbmVzLlxuICovXG5mdW5jdGlvbiBfZGlmZlN0cmluZ3Mob2xkU3RyOiBzdHJpbmcsIG5ld1N0cjogc3RyaW5nLCBjb250ZXh0OiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhdGNoOiBQYXRjaCA9IHN0cnVjdHVyZWRQYXRjaChudWxsLCBudWxsLCBvbGRTdHIsIG5ld1N0ciwgbnVsbCwgbnVsbCwgeyBjb250ZXh0IH0pO1xuICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGh1bmsgb2YgcGF0Y2guaHVua3MpIHtcbiAgICByZXN1bHQucHVzaChjaGFsay5tYWdlbnRhKGBAQCAtJHtodW5rLm9sZFN0YXJ0fSwke2h1bmsub2xkTGluZXN9ICske2h1bmsubmV3U3RhcnR9LCR7aHVuay5uZXdMaW5lc30gQEBgKSk7XG4gICAgY29uc3QgYmFzZUluZGVudCA9IF9maW5kSW5kZW50KGh1bmsubGluZXMpO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBodW5rLmxpbmVzKSB7XG4gICAgICAvLyBEb24ndCBjYXJlIGFib3V0IHRlcm1pbmF0aW9uIG5ld2xpbmUuXG4gICAgICBpZiAobGluZSA9PT0gJ1xcXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZScpIHsgY29udGludWU7IH1cbiAgICAgIGNvbnN0IG1hcmtlciA9IGxpbmUuY2hhckF0KDApO1xuICAgICAgY29uc3QgdGV4dCA9IGxpbmUuc2xpY2UoMSArIGJhc2VJbmRlbnQpO1xuICAgICAgc3dpdGNoIChtYXJrZXIpIHtcbiAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgcmVzdWx0LnB1c2goYCR7Q09OVEVYVH0gJHt0ZXh0fWApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICByZXN1bHQucHVzaChjaGFsay5ib2xkKGAke0FERElUSU9OfSAke2NoYWxrLmdyZWVuKHRleHQpfWApKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgcmVzdWx0LnB1c2goY2hhbGsuYm9sZChgJHtSRU1PVkFMfSAke2NoYWxrLnJlZCh0ZXh0KX1gKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGRpZmYgbWFya2VyOiAke21hcmtlcn0gKGZ1bGwgbGluZTogJHtsaW5lfSlgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcblxuICBmdW5jdGlvbiBfZmluZEluZGVudChsaW5lczogc3RyaW5nW10pOiBudW1iZXIge1xuICAgIGxldCBpbmRlbnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAxIDsgaSA8IGxpbmUubGVuZ3RoIDsgaSsrKSB7XG4gICAgICAgIGlmIChsaW5lLmNoYXJBdChpKSAhPT0gJyAnKSB7XG4gICAgICAgICAgaW5kZW50ID0gaW5kZW50ID4gaSAtIDEgPyBpIC0gMSA6IGluZGVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZW50O1xuICB9XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IamChanges = void 0;\nconst service_spec_types_1 = require(\"@aws-cdk/service-spec-types\");\nconst chalk = require(\"chalk\");\nconst managed_policy_1 = require(\"./managed-policy\");\nconst statement_1 = require(\"./statement\");\nconst diffable_1 = require(\"../diffable\");\nconst render_intrinsics_1 = require(\"../render-intrinsics\");\nconst util_1 = require(\"../util\");\n/**\n * Changes to IAM statements\n */\nclass IamChanges {\n constructor(props) {\n this.statements = new diffable_1.DiffableCollection();\n this.managedPolicies = new diffable_1.DiffableCollection();\n for (const propertyChange of props.propertyChanges) {\n this.readPropertyChange(propertyChange);\n }\n for (const resourceChange of props.resourceChanges) {\n this.readResourceChange(resourceChange);\n }\n this.statements.calculateDiff();\n this.managedPolicies.calculateDiff();\n }\n get hasChanges() {\n return this.statements.hasChanges || this.managedPolicies.hasChanges;\n }\n /**\n * Return whether the changes include broadened permissions\n *\n * Permissions are broadened if positive statements are added or\n * negative statements are removed, or if managed policies are added.\n */\n get permissionsBroadened() {\n return this.statements.additions.some(s => !s.isNegativeStatement)\n || this.statements.removals.some(s => s.isNegativeStatement)\n || this.managedPolicies.hasAdditions;\n }\n /**\n * Return a summary table of changes\n */\n summarizeStatements() {\n const ret = [];\n const header = ['', 'Resource', 'Effect', 'Action', 'Principal', 'Condition'];\n // First generate all lines, then sort on Resource so that similar resources are together\n for (const statement of this.statements.additions) {\n const renderedStatement = statement.render();\n ret.push([\n '+',\n renderedStatement.resource,\n renderedStatement.effect,\n renderedStatement.action,\n renderedStatement.principal,\n renderedStatement.condition,\n ].map(s => chalk.green(s)));\n }\n for (const statement of this.statements.removals) {\n const renderedStatement = statement.render();\n ret.push([\n chalk.red('-'),\n renderedStatement.resource,\n renderedStatement.effect,\n renderedStatement.action,\n renderedStatement.principal,\n renderedStatement.condition,\n ].map(s => chalk.red(s)));\n }\n // Sort by 2nd column\n ret.sort((0, util_1.makeComparator)((row) => [row[1]]));\n ret.splice(0, 0, header);\n return ret;\n }\n summarizeManagedPolicies() {\n const ret = [];\n const header = ['', 'Resource', 'Managed Policy ARN'];\n for (const att of this.managedPolicies.additions) {\n ret.push([\n '+',\n att.identityArn,\n att.managedPolicyArn,\n ].map(s => chalk.green(s)));\n }\n for (const att of this.managedPolicies.removals) {\n ret.push([\n '-',\n att.identityArn,\n att.managedPolicyArn,\n ].map(s => chalk.red(s)));\n }\n // Sort by 2nd column\n ret.sort((0, util_1.makeComparator)((row) => [row[1]]));\n ret.splice(0, 0, header);\n return ret;\n }\n /**\n * Return a machine-readable version of the changes.\n * This is only used in tests.\n *\n * @internal\n */\n _toJson() {\n return (0, util_1.deepRemoveUndefined)({\n statementAdditions: (0, util_1.dropIfEmpty)(this.statements.additions.map(s => s._toJson())),\n statementRemovals: (0, util_1.dropIfEmpty)(this.statements.removals.map(s => s._toJson())),\n managedPolicyAdditions: (0, util_1.dropIfEmpty)(this.managedPolicies.additions.map(s => s._toJson())),\n managedPolicyRemovals: (0, util_1.dropIfEmpty)(this.managedPolicies.removals.map(s => s._toJson())),\n });\n }\n readPropertyChange(propertyChange) {\n switch (propertyChange.scrutinyType) {\n case service_spec_types_1.PropertyScrutinyType.InlineIdentityPolicies:\n // AWS::IAM::{ Role | User | Group }.Policies\n this.statements.addOld(...this.readIdentityPolicies(propertyChange.oldValue, propertyChange.resourceLogicalId));\n this.statements.addNew(...this.readIdentityPolicies(propertyChange.newValue, propertyChange.resourceLogicalId));\n break;\n case service_spec_types_1.PropertyScrutinyType.InlineResourcePolicy:\n // Any PolicyDocument on a resource (including AssumeRolePolicyDocument)\n this.statements.addOld(...this.readResourceStatements(propertyChange.oldValue, propertyChange.resourceLogicalId));\n this.statements.addNew(...this.readResourceStatements(propertyChange.newValue, propertyChange.resourceLogicalId));\n break;\n case service_spec_types_1.PropertyScrutinyType.ManagedPolicies:\n // Just a list of managed policies\n this.managedPolicies.addOld(...this.readManagedPolicies(propertyChange.oldValue, propertyChange.resourceLogicalId));\n this.managedPolicies.addNew(...this.readManagedPolicies(propertyChange.newValue, propertyChange.resourceLogicalId));\n break;\n }\n }\n readResourceChange(resourceChange) {\n switch (resourceChange.scrutinyType) {\n case service_spec_types_1.ResourceScrutinyType.IdentityPolicyResource:\n // AWS::IAM::Policy\n this.statements.addOld(...this.readIdentityPolicyResource(resourceChange.oldProperties));\n this.statements.addNew(...this.readIdentityPolicyResource(resourceChange.newProperties));\n break;\n case service_spec_types_1.ResourceScrutinyType.ResourcePolicyResource:\n // AWS::*::{Bucket,Queue,Topic}Policy\n this.statements.addOld(...this.readResourcePolicyResource(resourceChange.oldProperties));\n this.statements.addNew(...this.readResourcePolicyResource(resourceChange.newProperties));\n break;\n case service_spec_types_1.ResourceScrutinyType.LambdaPermission:\n this.statements.addOld(...this.readLambdaStatements(resourceChange.oldProperties));\n this.statements.addNew(...this.readLambdaStatements(resourceChange.newProperties));\n break;\n }\n }\n /**\n * Parse a list of policies on an identity\n */\n readIdentityPolicies(policies, logicalId) {\n if (policies === undefined || !Array.isArray(policies)) {\n return [];\n }\n const appliesToPrincipal = 'AWS:${' + logicalId + '}';\n return (0, util_1.flatMap)(policies, (policy) => {\n // check if the Policy itself is not an intrinsic, like an Fn::If\n const unparsedStatement = policy.PolicyDocument?.Statement\n ? policy.PolicyDocument.Statement\n : policy;\n return defaultPrincipal(appliesToPrincipal, (0, statement_1.parseStatements)((0, render_intrinsics_1.renderIntrinsics)(unparsedStatement)));\n });\n }\n /**\n * Parse an IAM::Policy resource\n */\n readIdentityPolicyResource(properties) {\n if (properties === undefined) {\n return [];\n }\n properties = (0, render_intrinsics_1.renderIntrinsics)(properties);\n const principals = (properties.Groups || []).concat(properties.Users || []).concat(properties.Roles || []);\n return (0, util_1.flatMap)(principals, (principal) => {\n const ref = 'AWS:' + principal;\n return defaultPrincipal(ref, (0, statement_1.parseStatements)(properties.PolicyDocument.Statement));\n });\n }\n readResourceStatements(policy, logicalId) {\n if (policy === undefined) {\n return [];\n }\n const appliesToResource = '${' + logicalId + '.Arn}';\n return defaultResource(appliesToResource, (0, statement_1.parseStatements)((0, render_intrinsics_1.renderIntrinsics)(policy.Statement)));\n }\n /**\n * Parse an AWS::*::{Bucket,Topic,Queue}policy\n */\n readResourcePolicyResource(properties) {\n if (properties === undefined) {\n return [];\n }\n properties = (0, render_intrinsics_1.renderIntrinsics)(properties);\n const policyKeys = Object.keys(properties).filter(key => key.indexOf('Policy') > -1);\n // Find the key that identifies the resource(s) this policy applies to\n const resourceKeys = Object.keys(properties).filter(key => !policyKeys.includes(key) && !key.endsWith('Name'));\n let resources = resourceKeys.length === 1 ? properties[resourceKeys[0]] : ['???'];\n // For some resources, this is a singleton string, for some it's an array\n if (!Array.isArray(resources)) {\n resources = [resources];\n }\n return (0, util_1.flatMap)(resources, (resource) => {\n return defaultResource(resource, (0, statement_1.parseStatements)(properties[policyKeys[0]].Statement));\n });\n }\n readManagedPolicies(policyArns, logicalId) {\n if (!policyArns) {\n return [];\n }\n const rep = '${' + logicalId + '}';\n return managed_policy_1.ManagedPolicyAttachment.parseManagedPolicies(rep, (0, render_intrinsics_1.renderIntrinsics)(policyArns));\n }\n readLambdaStatements(properties) {\n if (!properties) {\n return [];\n }\n return [(0, statement_1.parseLambdaPermission)((0, render_intrinsics_1.renderIntrinsics)(properties))];\n }\n}\nexports.IamChanges = IamChanges;\nIamChanges.IamPropertyScrutinies = [\n service_spec_types_1.PropertyScrutinyType.InlineIdentityPolicies,\n service_spec_types_1.PropertyScrutinyType.InlineResourcePolicy,\n service_spec_types_1.PropertyScrutinyType.ManagedPolicies,\n];\nIamChanges.IamResourceScrutinies = [\n service_spec_types_1.ResourceScrutinyType.ResourcePolicyResource,\n service_spec_types_1.ResourceScrutinyType.IdentityPolicyResource,\n service_spec_types_1.ResourceScrutinyType.LambdaPermission,\n];\n/**\n * Set an undefined or wildcarded principal on these statements\n */\nfunction defaultPrincipal(principal, statements) {\n statements.forEach(s => s.principals.replaceEmpty(principal));\n statements.forEach(s => s.principals.replaceStar(principal));\n return statements;\n}\n/**\n * Set an undefined or wildcarded resource on these statements\n */\nfunction defaultResource(resource, statements) {\n statements.forEach(s => s.resources.replaceEmpty(resource));\n statements.forEach(s => s.resources.replaceStar(resource));\n return statements;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWFtLWNoYW5nZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpYW0tY2hhbmdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvRUFBeUY7QUFDekYsK0JBQStCO0FBQy9CLHFEQUE4RTtBQUM5RSwyQ0FBK0Y7QUFHL0YsMENBQWlEO0FBQ2pELDREQUF3RDtBQUN4RCxrQ0FBb0Y7QUFPcEY7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFnQnJCLFlBQVksS0FBc0I7UUFIbEIsZUFBVSxHQUFHLElBQUksNkJBQWtCLEVBQWEsQ0FBQztRQUNqRCxvQkFBZSxHQUFHLElBQUksNkJBQWtCLEVBQTJCLENBQUM7UUFHbEYsS0FBSyxNQUFNLGNBQWMsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFO1lBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN6QztRQUNELEtBQUssTUFBTSxjQUFjLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDekM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7ZUFDM0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO2VBQ3pELElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNJLG1CQUFtQjtRQUN4QixNQUFNLEdBQUcsR0FBZSxFQUFFLENBQUM7UUFFM0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTlFLHlGQUF5RjtRQUN6RixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFO1lBQ2pELE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxpQkFBaUIsQ0FBQyxRQUFRO2dCQUMxQixpQkFBaUIsQ0FBQyxNQUFNO2dCQUN4QixpQkFBaUIsQ0FBQyxNQUFNO2dCQUN4QixpQkFBaUIsQ0FBQyxTQUFTO2dCQUMzQixpQkFBaUIsQ0FBQyxTQUFTO2FBQzVCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFDRCxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1lBQ2hELE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsaUJBQWlCLENBQUMsUUFBUTtnQkFDMUIsaUJBQWlCLENBQUMsTUFBTTtnQkFDeEIsaUJBQWlCLENBQUMsTUFBTTtnQkFDeEIsaUJBQWlCLENBQUMsU0FBUztnQkFDM0IsaUJBQWlCLENBQUMsU0FBUzthQUM1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCO1FBRUQscUJBQXFCO1FBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSxxQkFBYyxFQUFDLENBQUMsR0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFekIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sd0JBQXdCO1FBQzdCLE1BQU0sR0FBRyxHQUFlLEVBQUUsQ0FBQztRQUMzQixNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUV0RCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFO1lBQ2hELEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxHQUFHLENBQUMsV0FBVztnQkFDZixHQUFHLENBQUMsZ0JBQWdCO2FBQ3JCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQy9DLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsR0FBRztnQkFDSCxHQUFHLENBQUMsV0FBVztnQkFDZixHQUFHLENBQUMsZ0JBQWdCO2FBQ3JCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFFRCxxQkFBcUI7UUFDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFBLHFCQUFjLEVBQUMsQ0FBQyxHQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRELEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUEsMEJBQW1CLEVBQUM7WUFDekIsa0JBQWtCLEVBQUUsSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLGlCQUFpQixFQUFFLElBQUEsa0JBQVcsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM5RSxzQkFBc0IsRUFBRSxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDekYscUJBQXFCLEVBQUUsSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3hGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxjQUE4QjtRQUN2RCxRQUFRLGNBQWMsQ0FBQyxZQUFZLEVBQUU7WUFDbkMsS0FBSyx5Q0FBb0IsQ0FBQyxzQkFBc0I7Z0JBQzlDLDZDQUE2QztnQkFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUNoSCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hILE1BQU07WUFDUixLQUFLLHlDQUFvQixDQUFDLG9CQUFvQjtnQkFDNUMsd0VBQXdFO2dCQUN4RSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xILElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDbEgsTUFBTTtZQUNSLEtBQUsseUNBQW9CLENBQUMsZUFBZTtnQkFDdkMsa0NBQWtDO2dCQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BILElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDcEgsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLGNBQThCO1FBQ3ZELFFBQVEsY0FBYyxDQUFDLFlBQVksRUFBRTtZQUNuQyxLQUFLLHlDQUFvQixDQUFDLHNCQUFzQjtnQkFDOUMsbUJBQW1CO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDekYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLE1BQU07WUFDUixLQUFLLHlDQUFvQixDQUFDLHNCQUFzQjtnQkFDOUMscUNBQXFDO2dCQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDekYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLE1BQU07WUFDUixLQUFLLHlDQUFvQixDQUFDLGdCQUFnQjtnQkFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ25GLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FBQyxRQUFhLEVBQUUsU0FBaUI7UUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFdEUsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUV0RCxPQUFPLElBQUEsY0FBTyxFQUFDLFFBQVEsRUFBRSxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ3ZDLGlFQUFpRTtZQUNqRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsU0FBUztnQkFDeEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUztnQkFDakMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNYLE9BQU8sZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsSUFBQSwyQkFBZSxFQUFDLElBQUEsb0NBQWdCLEVBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSywwQkFBMEIsQ0FBQyxVQUFlO1FBQ2hELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFNUMsVUFBVSxHQUFHLElBQUEsb0NBQWdCLEVBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLE9BQU8sSUFBQSxjQUFPLEVBQUMsVUFBVSxFQUFFLENBQUMsU0FBaUIsRUFBRSxFQUFFO1lBQy9DLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUM7WUFDL0IsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBQSwyQkFBZSxFQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFXLEVBQUUsU0FBaUI7UUFDM0QsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7U0FBRTtRQUV4QyxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ3JELE9BQU8sZUFBZSxDQUFDLGlCQUFpQixFQUFFLElBQUEsMkJBQWUsRUFBQyxJQUFBLG9DQUFnQixFQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVEOztPQUVHO0lBQ0ssMEJBQTBCLENBQUMsVUFBZTtRQUNoRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBRTVDLFVBQVUsR0FBRyxJQUFBLG9DQUFnQixFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJGLHNFQUFzRTtRQUN0RSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMvRyxJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxGLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM3QixTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN6QjtRQUVELE9BQU8sSUFBQSxjQUFPLEVBQUMsU0FBUyxFQUFFLENBQUMsUUFBZ0IsRUFBRSxFQUFFO1lBQzdDLE9BQU8sZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFBLDJCQUFlLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsVUFBZSxFQUFFLFNBQWlCO1FBQzVELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBRS9CLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ25DLE9BQU8sd0NBQXVCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLElBQUEsb0NBQWdCLEVBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRU8sb0JBQW9CLENBQUMsVUFBd0I7UUFDbkQsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFL0IsT0FBTyxDQUFDLElBQUEsaUNBQXFCLEVBQUMsSUFBQSxvQ0FBZ0IsRUFBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7QUEvT0gsZ0NBZ1BDO0FBL09lLGdDQUFxQixHQUFHO0lBQ3BDLHlDQUFvQixDQUFDLHNCQUFzQjtJQUMzQyx5Q0FBb0IsQ0FBQyxvQkFBb0I7SUFDekMseUNBQW9CLENBQUMsZUFBZTtDQUNyQyxBQUprQyxDQUlqQztBQUVZLGdDQUFxQixHQUFHO0lBQ3BDLHlDQUFvQixDQUFDLHNCQUFzQjtJQUMzQyx5Q0FBb0IsQ0FBQyxzQkFBc0I7SUFDM0MseUNBQW9CLENBQUMsZ0JBQWdCO0NBQ3RDLEFBSmtDLENBSWpDO0FBdU9KOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxTQUFpQixFQUFFLFVBQXVCO0lBQ2xFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzlELFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzdELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLFFBQWdCLEVBQUUsVUFBdUI7SUFDaEUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDNUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3BlcnR5U2NydXRpbnlUeXBlLCBSZXNvdXJjZVNjcnV0aW55VHlwZSB9IGZyb20gJ0Bhd3MtY2RrL3NlcnZpY2Utc3BlYy10eXBlcyc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBNYW5hZ2VkUG9saWN5QXR0YWNobWVudCwgTWFuYWdlZFBvbGljeUpzb24gfSBmcm9tICcuL21hbmFnZWQtcG9saWN5JztcbmltcG9ydCB7IHBhcnNlTGFtYmRhUGVybWlzc2lvbiwgcGFyc2VTdGF0ZW1lbnRzLCBTdGF0ZW1lbnQsIFN0YXRlbWVudEpzb24gfSBmcm9tICcuL3N0YXRlbWVudCc7XG5pbXBvcnQgeyBNYXliZVBhcnNlZCB9IGZyb20gJy4uL2RpZmYvbWF5YmUtcGFyc2VkJztcbmltcG9ydCB7IFByb3BlcnR5Q2hhbmdlLCBQcm9wZXJ0eU1hcCwgUmVzb3VyY2VDaGFuZ2UgfSBmcm9tICcuLi9kaWZmL3R5cGVzJztcbmltcG9ydCB7IERpZmZhYmxlQ29sbGVjdGlvbiB9IGZyb20gJy4uL2RpZmZhYmxlJztcbmltcG9ydCB7IHJlbmRlckludHJpbnNpY3MgfSBmcm9tICcuLi9yZW5kZXItaW50cmluc2ljcyc7XG5pbXBvcnQgeyBkZWVwUmVtb3ZlVW5kZWZpbmVkLCBkcm9wSWZFbXB0eSwgZmxhdE1hcCwgbWFrZUNvbXBhcmF0b3IgfSBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBJYW1DaGFuZ2VzUHJvcHMge1xuICBwcm9wZXJ0eUNoYW5nZXM6IFByb3BlcnR5Q2hhbmdlW107XG4gIHJlc291cmNlQ2hhbmdlczogUmVzb3VyY2VDaGFuZ2VbXTtcbn1cblxuLyoqXG4gKiBDaGFuZ2VzIHRvIElBTSBzdGF0ZW1lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBJYW1DaGFuZ2VzIHtcbiAgcHVibGljIHN0YXRpYyBJYW1Qcm9wZXJ0eVNjcnV0aW5pZXMgPSBbXG4gICAgUHJvcGVydHlTY3J1dGlueVR5cGUuSW5saW5lSWRlbnRpdHlQb2xpY2llcyxcbiAgICBQcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVSZXNvdXJjZVBvbGljeSxcbiAgICBQcm9wZXJ0eVNjcnV0aW55VHlwZS5NYW5hZ2VkUG9saWNpZXMsXG4gIF07XG5cbiAgcHVibGljIHN0YXRpYyBJYW1SZXNvdXJjZVNjcnV0aW5pZXMgPSBbXG4gICAgUmVzb3VyY2VTY3J1dGlueVR5cGUuUmVzb3VyY2VQb2xpY3lSZXNvdXJjZSxcbiAgICBSZXNvdXJjZVNjcnV0aW55VHlwZS5JZGVudGl0eVBvbGljeVJlc291cmNlLFxuICAgIFJlc291cmNlU2NydXRpbnlUeXBlLkxhbWJkYVBlcm1pc3Npb24sXG4gIF07XG5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlbWVudHMgPSBuZXcgRGlmZmFibGVDb2xsZWN0aW9uPFN0YXRlbWVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IG1hbmFnZWRQb2xpY2llcyA9IG5ldyBEaWZmYWJsZUNvbGxlY3Rpb248TWFuYWdlZFBvbGljeUF0dGFjaG1lbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IElhbUNoYW5nZXNQcm9wcykge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlDaGFuZ2Ugb2YgcHJvcHMucHJvcGVydHlDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUNoYW5nZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VDaGFuZ2Ugb2YgcHJvcHMucmVzb3VyY2VDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnJlYWRSZXNvdXJjZUNoYW5nZShyZXNvdXJjZUNoYW5nZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZW1lbnRzLmNhbGN1bGF0ZURpZmYoKTtcbiAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5jYWxjdWxhdGVEaWZmKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50cy5oYXNDaGFuZ2VzIHx8IHRoaXMubWFuYWdlZFBvbGljaWVzLmhhc0NoYW5nZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGNoYW5nZXMgaW5jbHVkZSBicm9hZGVuZWQgcGVybWlzc2lvbnNcbiAgICpcbiAgICogUGVybWlzc2lvbnMgYXJlIGJyb2FkZW5lZCBpZiBwb3NpdGl2ZSBzdGF0ZW1lbnRzIGFyZSBhZGRlZCBvclxuICAgKiBuZWdhdGl2ZSBzdGF0ZW1lbnRzIGFyZSByZW1vdmVkLCBvciBpZiBtYW5hZ2VkIHBvbGljaWVzIGFyZSBhZGRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGVybWlzc2lvbnNCcm9hZGVuZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50cy5hZGRpdGlvbnMuc29tZShzID0+ICFzLmlzTmVnYXRpdmVTdGF0ZW1lbnQpXG4gICAgICAgIHx8IHRoaXMuc3RhdGVtZW50cy5yZW1vdmFscy5zb21lKHMgPT4gcy5pc05lZ2F0aXZlU3RhdGVtZW50KVxuICAgICAgICB8fCB0aGlzLm1hbmFnZWRQb2xpY2llcy5oYXNBZGRpdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3VtbWFyeSB0YWJsZSBvZiBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgc3VtbWFyaXplU3RhdGVtZW50cygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcblxuICAgIGNvbnN0IGhlYWRlciA9IFsnJywgJ1Jlc291cmNlJywgJ0VmZmVjdCcsICdBY3Rpb24nLCAnUHJpbmNpcGFsJywgJ0NvbmRpdGlvbiddO1xuXG4gICAgLy8gRmlyc3QgZ2VuZXJhdGUgYWxsIGxpbmVzLCB0aGVuIHNvcnQgb24gUmVzb3VyY2Ugc28gdGhhdCBzaW1pbGFyIHJlc291cmNlcyBhcmUgdG9nZXRoZXJcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMuYWRkaXRpb25zKSB7XG4gICAgICBjb25zdCByZW5kZXJlZFN0YXRlbWVudCA9IHN0YXRlbWVudC5yZW5kZXIoKTtcbiAgICAgIHJldC5wdXNoKFtcbiAgICAgICAgJysnLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5yZXNvdXJjZSxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuZWZmZWN0LFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5hY3Rpb24sXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LnByaW5jaXBhbCxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuY29uZGl0aW9uLFxuICAgICAgXS5tYXAocyA9PiBjaGFsay5ncmVlbihzKSkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiB0aGlzLnN0YXRlbWVudHMucmVtb3ZhbHMpIHtcbiAgICAgIGNvbnN0IHJlbmRlcmVkU3RhdGVtZW50ID0gc3RhdGVtZW50LnJlbmRlcigpO1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICBjaGFsay5yZWQoJy0nKSxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQucmVzb3VyY2UsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LmVmZmVjdCxcbiAgICAgICAgcmVuZGVyZWRTdGF0ZW1lbnQuYWN0aW9uLFxuICAgICAgICByZW5kZXJlZFN0YXRlbWVudC5wcmluY2lwYWwsXG4gICAgICAgIHJlbmRlcmVkU3RhdGVtZW50LmNvbmRpdGlvbixcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsucmVkKHMpKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSAybmQgY29sdW1uXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV1dKSk7XG5cbiAgICByZXQuc3BsaWNlKDAsIDAsIGhlYWRlcik7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIHN1bW1hcml6ZU1hbmFnZWRQb2xpY2llcygpOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdW10gPSBbXTtcbiAgICBjb25zdCBoZWFkZXIgPSBbJycsICdSZXNvdXJjZScsICdNYW5hZ2VkIFBvbGljeSBBUk4nXTtcblxuICAgIGZvciAoY29uc3QgYXR0IG9mIHRoaXMubWFuYWdlZFBvbGljaWVzLmFkZGl0aW9ucykge1xuICAgICAgcmV0LnB1c2goW1xuICAgICAgICAnKycsXG4gICAgICAgIGF0dC5pZGVudGl0eUFybixcbiAgICAgICAgYXR0Lm1hbmFnZWRQb2xpY3lBcm4sXG4gICAgICBdLm1hcChzID0+IGNoYWxrLmdyZWVuKHMpKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgYXR0IG9mIHRoaXMubWFuYWdlZFBvbGljaWVzLnJlbW92YWxzKSB7XG4gICAgICByZXQucHVzaChbXG4gICAgICAgICctJyxcbiAgICAgICAgYXR0LmlkZW50aXR5QXJuLFxuICAgICAgICBhdHQubWFuYWdlZFBvbGljeUFybixcbiAgICAgIF0ubWFwKHMgPT4gY2hhbGsucmVkKHMpKSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSAybmQgY29sdW1uXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV1dKSk7XG5cbiAgICByZXQuc3BsaWNlKDAsIDAsIGhlYWRlcik7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY2hhbmdlcy5cbiAgICogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGVzdHMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0pzb24oKTogSWFtQ2hhbmdlc0pzb24ge1xuICAgIHJldHVybiBkZWVwUmVtb3ZlVW5kZWZpbmVkKHtcbiAgICAgIHN0YXRlbWVudEFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5zdGF0ZW1lbnRzLmFkZGl0aW9ucy5tYXAocyA9PiBzLl90b0pzb24oKSkpLFxuICAgICAgc3RhdGVtZW50UmVtb3ZhbHM6IGRyb3BJZkVtcHR5KHRoaXMuc3RhdGVtZW50cy5yZW1vdmFscy5tYXAocyA9PiBzLl90b0pzb24oKSkpLFxuICAgICAgbWFuYWdlZFBvbGljeUFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5tYW5hZ2VkUG9saWNpZXMuYWRkaXRpb25zLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgICBtYW5hZ2VkUG9saWN5UmVtb3ZhbHM6IGRyb3BJZkVtcHR5KHRoaXMubWFuYWdlZFBvbGljaWVzLnJlbW92YWxzLm1hcChzID0+IHMuX3RvSnNvbigpKSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eUNoYW5nZTogUHJvcGVydHlDaGFuZ2UpIHtcbiAgICBzd2l0Y2ggKHByb3BlcnR5Q2hhbmdlLnNjcnV0aW55VHlwZSkge1xuICAgICAgY2FzZSBQcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVJZGVudGl0eVBvbGljaWVzOlxuICAgICAgICAvLyBBV1M6OklBTTo6eyBSb2xlIHwgVXNlciB8IEdyb3VwIH0uUG9saWNpZXNcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLmFkZE9sZCguLi50aGlzLnJlYWRJZGVudGl0eVBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZElkZW50aXR5UG9saWNpZXMocHJvcGVydHlDaGFuZ2UubmV3VmFsdWUsIHByb3BlcnR5Q2hhbmdlLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcm9wZXJ0eVNjcnV0aW55VHlwZS5JbmxpbmVSZXNvdXJjZVBvbGljeTpcbiAgICAgICAgLy8gQW55IFBvbGljeURvY3VtZW50IG9uIGEgcmVzb3VyY2UgKGluY2x1ZGluZyBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQpXG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkUmVzb3VyY2VTdGF0ZW1lbnRzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZFJlc291cmNlU3RhdGVtZW50cyhwcm9wZXJ0eUNoYW5nZS5uZXdWYWx1ZSwgcHJvcGVydHlDaGFuZ2UucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByb3BlcnR5U2NydXRpbnlUeXBlLk1hbmFnZWRQb2xpY2llczpcbiAgICAgICAgLy8gSnVzdCBhIGxpc3Qgb2YgbWFuYWdlZCBwb2xpY2llc1xuICAgICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGRPbGQoLi4udGhpcy5yZWFkTWFuYWdlZFBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm9sZFZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICB0aGlzLm1hbmFnZWRQb2xpY2llcy5hZGROZXcoLi4udGhpcy5yZWFkTWFuYWdlZFBvbGljaWVzKHByb3BlcnR5Q2hhbmdlLm5ld1ZhbHVlLCBwcm9wZXJ0eUNoYW5nZS5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRSZXNvdXJjZUNoYW5nZShyZXNvdXJjZUNoYW5nZTogUmVzb3VyY2VDaGFuZ2UpIHtcbiAgICBzd2l0Y2ggKHJlc291cmNlQ2hhbmdlLnNjcnV0aW55VHlwZSkge1xuICAgICAgY2FzZSBSZXNvdXJjZVNjcnV0aW55VHlwZS5JZGVudGl0eVBvbGljeVJlc291cmNlOlxuICAgICAgICAvLyBBV1M6OklBTTo6UG9saWN5XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSZXNvdXJjZVNjcnV0aW55VHlwZS5SZXNvdXJjZVBvbGljeVJlc291cmNlOlxuICAgICAgICAvLyBBV1M6Oio6OntCdWNrZXQsUXVldWUsVG9waWN9UG9saWN5XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRPbGQoLi4udGhpcy5yZWFkUmVzb3VyY2VQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGROZXcoLi4udGhpcy5yZWFkUmVzb3VyY2VQb2xpY3lSZXNvdXJjZShyZXNvdXJjZUNoYW5nZS5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSZXNvdXJjZVNjcnV0aW55VHlwZS5MYW1iZGFQZXJtaXNzaW9uOlxuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkT2xkKC4uLnRoaXMucmVhZExhbWJkYVN0YXRlbWVudHMocmVzb3VyY2VDaGFuZ2Uub2xkUHJvcGVydGllcykpO1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMuYWRkTmV3KC4uLnRoaXMucmVhZExhbWJkYVN0YXRlbWVudHMocmVzb3VyY2VDaGFuZ2UubmV3UHJvcGVydGllcykpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYSBsaXN0IG9mIHBvbGljaWVzIG9uIGFuIGlkZW50aXR5XG4gICAqL1xuICBwcml2YXRlIHJlYWRJZGVudGl0eVBvbGljaWVzKHBvbGljaWVzOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwb2xpY2llcyA9PT0gdW5kZWZpbmVkIHx8ICFBcnJheS5pc0FycmF5KHBvbGljaWVzKSkgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IGFwcGxpZXNUb1ByaW5jaXBhbCA9ICdBV1M6JHsnICsgbG9naWNhbElkICsgJ30nO1xuXG4gICAgcmV0dXJuIGZsYXRNYXAocG9saWNpZXMsIChwb2xpY3k6IGFueSkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIFBvbGljeSBpdHNlbGYgaXMgbm90IGFuIGludHJpbnNpYywgbGlrZSBhbiBGbjo6SWZcbiAgICAgIGNvbnN0IHVucGFyc2VkU3RhdGVtZW50ID0gcG9saWN5LlBvbGljeURvY3VtZW50Py5TdGF0ZW1lbnRcbiAgICAgICAgPyBwb2xpY3kuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50XG4gICAgICAgIDogcG9saWN5O1xuICAgICAgcmV0dXJuIGRlZmF1bHRQcmluY2lwYWwoYXBwbGllc1RvUHJpbmNpcGFsLCBwYXJzZVN0YXRlbWVudHMocmVuZGVySW50cmluc2ljcyh1bnBhcnNlZFN0YXRlbWVudCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbiBJQU06OlBvbGljeSByZXNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkSWRlbnRpdHlQb2xpY3lSZXNvdXJjZShwcm9wZXJ0aWVzOiBhbnkpOiBTdGF0ZW1lbnRbXSB7XG4gICAgaWYgKHByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIHByb3BlcnRpZXMgPSByZW5kZXJJbnRyaW5zaWNzKHByb3BlcnRpZXMpO1xuXG4gICAgY29uc3QgcHJpbmNpcGFscyA9IChwcm9wZXJ0aWVzLkdyb3VwcyB8fCBbXSkuY29uY2F0KHByb3BlcnRpZXMuVXNlcnMgfHwgW10pLmNvbmNhdChwcm9wZXJ0aWVzLlJvbGVzIHx8IFtdKTtcbiAgICByZXR1cm4gZmxhdE1hcChwcmluY2lwYWxzLCAocHJpbmNpcGFsOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHJlZiA9ICdBV1M6JyArIHByaW5jaXBhbDtcbiAgICAgIHJldHVybiBkZWZhdWx0UHJpbmNpcGFsKHJlZiwgcGFyc2VTdGF0ZW1lbnRzKHByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50KSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRSZXNvdXJjZVN0YXRlbWVudHMocG9saWN5OiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU3RhdGVtZW50W10ge1xuICAgIGlmIChwb2xpY3kgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IGFwcGxpZXNUb1Jlc291cmNlID0gJyR7JyArIGxvZ2ljYWxJZCArICcuQXJufSc7XG4gICAgcmV0dXJuIGRlZmF1bHRSZXNvdXJjZShhcHBsaWVzVG9SZXNvdXJjZSwgcGFyc2VTdGF0ZW1lbnRzKHJlbmRlckludHJpbnNpY3MocG9saWN5LlN0YXRlbWVudCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbiBBV1M6Oio6OntCdWNrZXQsVG9waWMsUXVldWV9cG9saWN5XG4gICAqL1xuICBwcml2YXRlIHJlYWRSZXNvdXJjZVBvbGljeVJlc291cmNlKHByb3BlcnRpZXM6IGFueSk6IFN0YXRlbWVudFtdIHtcbiAgICBpZiAocHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiBbXTsgfVxuXG4gICAgcHJvcGVydGllcyA9IHJlbmRlckludHJpbnNpY3MocHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBwb2xpY3lLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykuZmlsdGVyKGtleSA9PiBrZXkuaW5kZXhPZignUG9saWN5JykgPiAtMSk7XG5cbiAgICAvLyBGaW5kIHRoZSBrZXkgdGhhdCBpZGVudGlmaWVzIHRoZSByZXNvdXJjZShzKSB0aGlzIHBvbGljeSBhcHBsaWVzIHRvXG4gICAgY29uc3QgcmVzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcykuZmlsdGVyKGtleSA9PiAhcG9saWN5S2V5cy5pbmNsdWRlcyhrZXkpICYmICFrZXkuZW5kc1dpdGgoJ05hbWUnKSk7XG4gICAgbGV0IHJlc291cmNlcyA9IHJlc291cmNlS2V5cy5sZW5ndGggPT09IDEgPyBwcm9wZXJ0aWVzW3Jlc291cmNlS2V5c1swXV0gOiBbJz8/PyddO1xuXG4gICAgLy8gRm9yIHNvbWUgcmVzb3VyY2VzLCB0aGlzIGlzIGEgc2luZ2xldG9uIHN0cmluZywgZm9yIHNvbWUgaXQncyBhbiBhcnJheVxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZXNvdXJjZXMpKSB7XG4gICAgICByZXNvdXJjZXMgPSBbcmVzb3VyY2VzXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdE1hcChyZXNvdXJjZXMsIChyZXNvdXJjZTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gZGVmYXVsdFJlc291cmNlKHJlc291cmNlLCBwYXJzZVN0YXRlbWVudHMocHJvcGVydGllc1twb2xpY3lLZXlzWzBdXS5TdGF0ZW1lbnQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZE1hbmFnZWRQb2xpY2llcyhwb2xpY3lBcm5zOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogTWFuYWdlZFBvbGljeUF0dGFjaG1lbnRbXSB7XG4gICAgaWYgKCFwb2xpY3lBcm5zKSB7IHJldHVybiBbXTsgfVxuXG4gICAgY29uc3QgcmVwID0gJyR7JyArIGxvZ2ljYWxJZCArICd9JztcbiAgICByZXR1cm4gTWFuYWdlZFBvbGljeUF0dGFjaG1lbnQucGFyc2VNYW5hZ2VkUG9saWNpZXMocmVwLCByZW5kZXJJbnRyaW5zaWNzKHBvbGljeUFybnMpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZExhbWJkYVN0YXRlbWVudHMocHJvcGVydGllcz86IFByb3BlcnR5TWFwKTogU3RhdGVtZW50W10ge1xuICAgIGlmICghcHJvcGVydGllcykgeyByZXR1cm4gW107IH1cblxuICAgIHJldHVybiBbcGFyc2VMYW1iZGFQZXJtaXNzaW9uKHJlbmRlckludHJpbnNpY3MocHJvcGVydGllcykpXTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBhbiB1bmRlZmluZWQgb3Igd2lsZGNhcmRlZCBwcmluY2lwYWwgb24gdGhlc2Ugc3RhdGVtZW50c1xuICovXG5mdW5jdGlvbiBkZWZhdWx0UHJpbmNpcGFsKHByaW5jaXBhbDogc3RyaW5nLCBzdGF0ZW1lbnRzOiBTdGF0ZW1lbnRbXSkge1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnByaW5jaXBhbHMucmVwbGFjZUVtcHR5KHByaW5jaXBhbCkpO1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnByaW5jaXBhbHMucmVwbGFjZVN0YXIocHJpbmNpcGFsKSk7XG4gIHJldHVybiBzdGF0ZW1lbnRzO1xufVxuXG4vKipcbiAqIFNldCBhbiB1bmRlZmluZWQgb3Igd2lsZGNhcmRlZCByZXNvdXJjZSBvbiB0aGVzZSBzdGF0ZW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRSZXNvdXJjZShyZXNvdXJjZTogc3RyaW5nLCBzdGF0ZW1lbnRzOiBTdGF0ZW1lbnRbXSkge1xuICBzdGF0ZW1lbnRzLmZvckVhY2gocyA9PiBzLnJlc291cmNlcy5yZXBsYWNlRW1wdHkocmVzb3VyY2UpKTtcbiAgc3RhdGVtZW50cy5mb3JFYWNoKHMgPT4gcy5yZXNvdXJjZXMucmVwbGFjZVN0YXIocmVzb3VyY2UpKTtcbiAgcmV0dXJuIHN0YXRlbWVudHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWFtQ2hhbmdlc0pzb24ge1xuICBzdGF0ZW1lbnRBZGRpdGlvbnM/OiBBcnJheTxNYXliZVBhcnNlZDxTdGF0ZW1lbnRKc29uPj47XG4gIHN0YXRlbWVudFJlbW92YWxzPzogQXJyYXk8TWF5YmVQYXJzZWQ8U3RhdGVtZW50SnNvbj4+O1xuICBtYW5hZ2VkUG9saWN5QWRkaXRpb25zPzogQXJyYXk8TWF5YmVQYXJzZWQ8TWFuYWdlZFBvbGljeUpzb24+PjtcbiAgbWFuYWdlZFBvbGljeVJlbW92YWxzPzogQXJyYXk8TWF5YmVQYXJzZWQ8TWFuYWdlZFBvbGljeUpzb24+Pjtcbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ManagedPolicyAttachment = void 0;\nconst maybe_parsed_1 = require(\"../diff/maybe-parsed\");\nclass ManagedPolicyAttachment {\n static parseManagedPolicies(identityArn, arns) {\n return typeof arns === 'string'\n ? [new ManagedPolicyAttachment(identityArn, arns)]\n : arns.map((arn) => new ManagedPolicyAttachment(identityArn, arn));\n }\n constructor(identityArn, managedPolicyArn) {\n this.identityArn = identityArn;\n this.managedPolicyArn = managedPolicyArn;\n }\n equal(other) {\n return this.identityArn === other.identityArn\n && this.managedPolicyArn === other.managedPolicyArn;\n }\n /**\n * Return a machine-readable version of the changes.\n * This is only used in tests.\n *\n * @internal\n */\n _toJson() {\n return (0, maybe_parsed_1.mkParsed)({\n identityArn: this.identityArn,\n managedPolicyArn: this.managedPolicyArn,\n });\n }\n}\nexports.ManagedPolicyAttachment = ManagedPolicyAttachment;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYW5hZ2VkLXBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1REFBNkQ7QUFFN0QsTUFBYSx1QkFBdUI7SUFDM0IsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFdBQW1CLEVBQUUsSUFBdUI7UUFDN0UsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRO1lBQzdCLENBQUMsQ0FBQyxDQUFDLElBQUksdUJBQXVCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xELENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxZQUE0QixXQUFtQixFQUFrQixnQkFBd0I7UUFBN0QsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFBa0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO0lBQ3pGLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBOEI7UUFDekMsT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxXQUFXO2VBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksT0FBTztRQUNaLE9BQU8sSUFBQSx1QkFBUSxFQUFDO1lBQ2QsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7U0FDeEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBM0JELDBEQTJCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1heWJlUGFyc2VkLCBta1BhcnNlZCB9IGZyb20gJy4uL2RpZmYvbWF5YmUtcGFyc2VkJztcblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRQb2xpY3lBdHRhY2htZW50IHtcbiAgcHVibGljIHN0YXRpYyBwYXJzZU1hbmFnZWRQb2xpY2llcyhpZGVudGl0eUFybjogc3RyaW5nLCBhcm5zOiBzdHJpbmcgfCBzdHJpbmdbXSk6IE1hbmFnZWRQb2xpY3lBdHRhY2htZW50W10ge1xuICAgIHJldHVybiB0eXBlb2YgYXJucyA9PT0gJ3N0cmluZydcbiAgICAgID8gW25ldyBNYW5hZ2VkUG9saWN5QXR0YWNobWVudChpZGVudGl0eUFybiwgYXJucyldXG4gICAgICA6IGFybnMubWFwKChhcm46IHN0cmluZykgPT4gbmV3IE1hbmFnZWRQb2xpY3lBdHRhY2htZW50KGlkZW50aXR5QXJuLCBhcm4pKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBpZGVudGl0eUFybjogc3RyaW5nLCBwdWJsaWMgcmVhZG9ubHkgbWFuYWdlZFBvbGljeUFybjogc3RyaW5nKSB7XG4gIH1cblxuICBwdWJsaWMgZXF1YWwob3RoZXI6IE1hbmFnZWRQb2xpY3lBdHRhY2htZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlBcm4gPT09IG90aGVyLmlkZW50aXR5QXJuXG4gICAgICAgICYmIHRoaXMubWFuYWdlZFBvbGljeUFybiA9PT0gb3RoZXIubWFuYWdlZFBvbGljeUFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGNoYW5nZXMuXG4gICAqIFRoaXMgaXMgb25seSB1c2VkIGluIHRlc3RzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9Kc29uKCk6IE1heWJlUGFyc2VkPE1hbmFnZWRQb2xpY3lKc29uPiB7XG4gICAgcmV0dXJuIG1rUGFyc2VkKHtcbiAgICAgIGlkZW50aXR5QXJuOiB0aGlzLmlkZW50aXR5QXJuLFxuICAgICAgbWFuYWdlZFBvbGljeUFybjogdGhpcy5tYW5hZ2VkUG9saWN5QXJuLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlZFBvbGljeUpzb24ge1xuICBpZGVudGl0eUFybjogc3RyaW5nO1xuICBtYW5hZ2VkUG9saWN5QXJuOiBzdHJpbmc7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.renderCondition = exports.Effect = exports.Targets = exports.parseLambdaPermission = exports.parseStatements = exports.Statement = void 0;\nconst maybe_parsed_1 = require(\"../diff/maybe-parsed\");\nconst util_1 = require(\"../util\");\n// namespace object imports won't work in the bundle for function exports\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst deepEqual = require('fast-deep-equal');\nclass Statement {\n constructor(statement) {\n if (typeof statement === 'string') {\n this.sid = undefined;\n this.effect = Effect.Unknown;\n this.resources = new Targets({}, '', '');\n this.actions = new Targets({}, '', '');\n this.principals = new Targets({}, '', '');\n this.condition = undefined;\n this.serializedIntrinsic = statement;\n }\n else {\n this.sid = expectString(statement.Sid);\n this.effect = expectEffect(statement.Effect);\n this.resources = new Targets(statement, 'Resource', 'NotResource');\n this.actions = new Targets(statement, 'Action', 'NotAction');\n this.principals = new Targets(statement, 'Principal', 'NotPrincipal');\n this.condition = statement.Condition;\n this.serializedIntrinsic = undefined;\n }\n }\n /**\n * Whether this statement is equal to the other statement\n */\n equal(other) {\n return (this.sid === other.sid\n && this.effect === other.effect\n && this.serializedIntrinsic === other.serializedIntrinsic\n && this.resources.equal(other.resources)\n && this.actions.equal(other.actions)\n && this.principals.equal(other.principals)\n && deepEqual(this.condition, other.condition));\n }\n render() {\n return this.serializedIntrinsic\n ? {\n resource: this.serializedIntrinsic,\n effect: '',\n action: '',\n principal: this.principals.render(),\n condition: '',\n }\n : {\n resource: this.resources.render(),\n effect: this.effect,\n action: this.actions.render(),\n principal: this.principals.render(),\n condition: renderCondition(this.condition),\n };\n }\n /**\n * Return a machine-readable version of the changes.\n * This is only used in tests.\n *\n * @internal\n */\n _toJson() {\n return this.serializedIntrinsic\n ? (0, maybe_parsed_1.mkUnparseable)(this.serializedIntrinsic)\n : (0, maybe_parsed_1.mkParsed)((0, util_1.deepRemoveUndefined)({\n sid: this.sid,\n effect: this.effect,\n resources: this.resources._toJson(),\n principals: this.principals._toJson(),\n actions: this.actions._toJson(),\n condition: this.condition,\n }));\n }\n /**\n * Whether this is a negative statement\n *\n * A statement is negative if any of its targets are negative, inverted\n * if the Effect is Deny.\n */\n get isNegativeStatement() {\n const notTarget = this.actions.not || this.principals.not || this.resources.not;\n return this.effect === Effect.Allow ? notTarget : !notTarget;\n }\n}\nexports.Statement = Statement;\n/**\n * Parse a list of statements from undefined, a Statement, or a list of statements\n */\nfunction parseStatements(x) {\n if (x === undefined) {\n x = [];\n }\n if (!Array.isArray(x)) {\n x = [x];\n }\n return x.map((s) => new Statement(s));\n}\nexports.parseStatements = parseStatements;\n/**\n * Parse a Statement from a Lambda::Permission object\n *\n * This is actually what Lambda adds to the policy document if you call AddPermission.\n */\nfunction parseLambdaPermission(x) {\n // Construct a statement from\n const statement = {\n Effect: 'Allow',\n Action: x.Action,\n Resource: x.FunctionName,\n };\n if (x.Principal !== undefined) {\n if (x.Principal === '*') {\n // *\n statement.Principal = '*';\n }\n else if (/^\\d{12}$/.test(x.Principal)) {\n // Account number\n // eslint-disable-next-line @aws-cdk/no-literal-partition\n statement.Principal = { AWS: `arn:aws:iam::${x.Principal}:root` };\n }\n else {\n // Assume it's a service principal\n // We might get this wrong vs. the previous one for tokens. Nothing to be done\n // about that. It's only for human readable consumption after all.\n statement.Principal = { Service: x.Principal };\n }\n }\n if (x.SourceArn !== undefined) {\n if (statement.Condition === undefined) {\n statement.Condition = {};\n }\n statement.Condition.ArnLike = { 'AWS:SourceArn': x.SourceArn };\n }\n if (x.SourceAccount !== undefined) {\n if (statement.Condition === undefined) {\n statement.Condition = {};\n }\n statement.Condition.StringEquals = { 'AWS:SourceAccount': x.SourceAccount };\n }\n if (x.EventSourceToken !== undefined) {\n if (statement.Condition === undefined) {\n statement.Condition = {};\n }\n statement.Condition.StringEquals = { 'lambda:EventSourceToken': x.EventSourceToken };\n }\n return new Statement(statement);\n}\nexports.parseLambdaPermission = parseLambdaPermission;\n/**\n * Targets for a field\n */\nclass Targets {\n constructor(statement, positiveKey, negativeKey) {\n if (negativeKey in statement) {\n this.values = forceListOfStrings(statement[negativeKey]);\n this.not = true;\n }\n else {\n this.values = forceListOfStrings(statement[positiveKey]);\n this.not = false;\n }\n this.values.sort();\n }\n get empty() {\n return this.values.length === 0;\n }\n /**\n * Whether this set of targets is equal to the other set of targets\n */\n equal(other) {\n return this.not === other.not && deepEqual(this.values.sort(), other.values.sort());\n }\n /**\n * If the current value set is empty, put this in it\n */\n replaceEmpty(replacement) {\n if (this.empty) {\n this.values.push(replacement);\n }\n }\n /**\n * If the actions contains a '*', replace with this string.\n */\n replaceStar(replacement) {\n for (let i = 0; i < this.values.length; i++) {\n if (this.values[i] === '*') {\n this.values[i] = replacement;\n }\n }\n this.values.sort();\n }\n /**\n * Render into a summary table cell\n */\n render() {\n return this.not\n ? this.values.map(s => `NOT ${s}`).join('\\n')\n : this.values.join('\\n');\n }\n /**\n * Return a machine-readable version of the changes.\n * This is only used in tests.\n *\n * @internal\n */\n _toJson() {\n return { not: this.not, values: this.values };\n }\n}\nexports.Targets = Targets;\nvar Effect;\n(function (Effect) {\n Effect[\"Unknown\"] = \"Unknown\";\n Effect[\"Allow\"] = \"Allow\";\n Effect[\"Deny\"] = \"Deny\";\n})(Effect || (exports.Effect = Effect = {}));\nfunction expectString(x) {\n return typeof x === 'string' ? x : undefined;\n}\nfunction expectEffect(x) {\n if (x === Effect.Allow || x === Effect.Deny) {\n return x;\n }\n return Effect.Unknown;\n}\nfunction forceListOfStrings(x) {\n if (typeof x === 'string') {\n return [x];\n }\n if (typeof x === 'undefined' || x === null) {\n return [];\n }\n if (Array.isArray(x)) {\n return x.map(e => forceListOfStrings(e).join(','));\n }\n if (typeof x === 'object' && x !== null) {\n const ret = [];\n for (const [key, value] of Object.entries(x)) {\n ret.push(...forceListOfStrings(value).map(s => `${key}:${s}`));\n }\n return ret;\n }\n return [`${x}`];\n}\n/**\n * Render the Condition column\n */\nfunction renderCondition(condition) {\n if (!condition || Object.keys(condition).length === 0) {\n return '';\n }\n const jsonRepresentation = JSON.stringify(condition, undefined, 2);\n // The JSON representation looks like this:\n //\n // {\n // \"ArnLike\": {\n // \"AWS:SourceArn\": \"${MyTopic86869434}\"\n // }\n // }\n //\n // We can make it more compact without losing information by getting rid of the outermost braces\n // and the indentation.\n const lines = jsonRepresentation.split('\\n');\n return lines.slice(1, lines.length - 1).map(s => s.slice(2)).join('\\n');\n}\nexports.renderCondition = renderCondition;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhdGVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUE0RTtBQUM1RSxrQ0FBOEM7QUFFOUMseUVBQXlFO0FBQ3pFLGlFQUFpRTtBQUNqRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUU3QyxNQUFhLFNBQVM7SUFpQ3BCLFlBQVksU0FBOEI7UUFDeEMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDakMsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7WUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7U0FDdEM7YUFBTTtZQUNMLElBQUksQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBZ0I7UUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUc7ZUFDekIsSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtlQUM1QixJQUFJLENBQUMsbUJBQW1CLEtBQUssS0FBSyxDQUFDLG1CQUFtQjtlQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO2VBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7ZUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztlQUN2QyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRU0sTUFBTTtRQUNYLE9BQU8sSUFBSSxDQUFDLG1CQUFtQjtZQUM3QixDQUFDLENBQUM7Z0JBQ0EsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ2xDLE1BQU0sRUFBRSxFQUFFO2dCQUNWLE1BQU0sRUFBRSxFQUFFO2dCQUNWLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDbkMsU0FBUyxFQUFFLEVBQUU7YUFDZDtZQUNELENBQUMsQ0FBQztnQkFDQSxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO2dCQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ25DLFNBQVMsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUMzQyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksT0FBTztRQUNaLE9BQU8sSUFBSSxDQUFDLG1CQUFtQjtZQUM3QixDQUFDLENBQUMsSUFBQSw0QkFBYSxFQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUN6QyxDQUFDLENBQUMsSUFBQSx1QkFBUSxFQUFDLElBQUEsMEJBQW1CLEVBQUM7Z0JBQzdCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtnQkFDbkMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFO2dCQUNyQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQy9CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUzthQUMxQixDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsbUJBQW1CO1FBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ2hGLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQy9ELENBQUM7Q0FDRjtBQWpIRCw4QkFpSEM7QUF3QkQ7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQUMsQ0FBTTtJQUNwQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7UUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQUU7SUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUFFO0lBQ25DLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBSkQsMENBSUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsQ0FBTTtJQUMxQyw2QkFBNkI7SUFDN0IsTUFBTSxTQUFTLEdBQVE7UUFDckIsTUFBTSxFQUFFLE9BQU87UUFDZixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07UUFDaEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxZQUFZO0tBQ3pCLENBQUM7SUFFRixJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO1FBQzdCLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxHQUFHLEVBQUU7WUFDdkIsSUFBSTtZQUNKLFNBQVMsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1NBQzNCO2FBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN2QyxpQkFBaUI7WUFDakIseURBQXlEO1lBQ3pELFNBQVMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLE9BQU8sRUFBRSxDQUFDO1NBQ25FO2FBQU07WUFDTCxrQ0FBa0M7WUFDbEMsOEVBQThFO1lBQzlFLGtFQUFrRTtZQUNsRSxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNoRDtLQUNGO0lBQ0QsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtRQUM3QixJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQUUsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7U0FBRTtRQUNwRSxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDaEU7SUFDRCxJQUFJLENBQUMsQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFO1FBQ2pDLElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFBRSxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztTQUFFO1FBQ3BFLFNBQVMsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO0tBQzdFO0lBQ0QsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFO1FBQ3BDLElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFBRSxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztTQUFFO1FBQ3BFLFNBQVMsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7S0FDdEY7SUFFRCxPQUFPLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFyQ0Qsc0RBcUNDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLE9BQU87SUFXbEIsWUFBWSxTQUFxQixFQUFFLFdBQW1CLEVBQUUsV0FBbUI7UUFDekUsSUFBSSxXQUFXLElBQUksU0FBUyxFQUFFO1lBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7U0FDakI7YUFBTTtZQUNMLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7U0FDbEI7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBYztRQUN6QixPQUFPLElBQUksQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLFdBQW1CO1FBQ3JDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFDLFdBQW1CO1FBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQzthQUM5QjtTQUNGO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRztZQUNiLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxPQUFPO1FBQ1osT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEQsQ0FBQztDQUNGO0FBeEVELDBCQXdFQztBQUlELElBQVksTUFJWDtBQUpELFdBQVksTUFBTTtJQUNoQiw2QkFBbUIsQ0FBQTtJQUNuQix5QkFBZSxDQUFBO0lBQ2YsdUJBQWEsQ0FBQTtBQUNmLENBQUMsRUFKVyxNQUFNLHNCQUFOLE1BQU0sUUFJakI7QUFFRCxTQUFTLFlBQVksQ0FBQyxDQUFVO0lBQzlCLE9BQU8sT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsQ0FBVTtJQUM5QixJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFO1FBQUUsT0FBTyxDQUFXLENBQUM7S0FBRTtJQUNwRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsQ0FBVTtJQUNwQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUFFO0lBQzFDLElBQUksT0FBTyxDQUFDLEtBQUssV0FBVyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFBRSxPQUFPLEVBQUUsQ0FBQztLQUFFO0lBRTFELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNwQixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUNwRDtJQUVELElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDdkMsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzVDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDaEU7UUFDRCxPQUFPLEdBQUcsQ0FBQztLQUNaO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQUMsU0FBYztJQUM1QyxJQUFJLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUFFLE9BQU8sRUFBRSxDQUFDO0tBQUU7SUFDckUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFbkUsMkNBQTJDO0lBQzNDLEVBQUU7SUFDRixLQUFLO0lBQ0wsa0JBQWtCO0lBQ2xCLDZDQUE2QztJQUM3QyxPQUFPO0lBQ1AsS0FBSztJQUNMLEVBQUU7SUFDRixnR0FBZ0c7SUFDaEcsdUJBQXVCO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBaEJELDBDQWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1heWJlUGFyc2VkLCBta1BhcnNlZCwgbWtVbnBhcnNlYWJsZSB9IGZyb20gJy4uL2RpZmYvbWF5YmUtcGFyc2VkJztcbmltcG9ydCB7IGRlZXBSZW1vdmVVbmRlZmluZWQgfSBmcm9tICcuLi91dGlsJztcblxuLy8gbmFtZXNwYWNlIG9iamVjdCBpbXBvcnRzIHdvbid0IHdvcmsgaW4gdGhlIGJ1bmRsZSBmb3IgZnVuY3Rpb24gZXhwb3J0c1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IGRlZXBFcXVhbCA9IHJlcXVpcmUoJ2Zhc3QtZGVlcC1lcXVhbCcpO1xuXG5leHBvcnQgY2xhc3MgU3RhdGVtZW50IHtcbiAgLyoqXG4gICAqIFN0YXRlbWVudCBJRFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgZWZmZWN0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZWZmZWN0OiBFZmZlY3Q7XG5cbiAgLyoqXG4gICAqIFJlc291cmNlc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlczogVGFyZ2V0cztcblxuICAvKipcbiAgICogUHJpbmNpcGFsc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbHM6IFRhcmdldHM7XG5cbiAgLyoqXG4gICAqIEFjdGlvbnNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhY3Rpb25zOiBUYXJnZXRzO1xuXG4gIC8qKlxuICAgKiBPYmplY3Qgd2l0aCBjb25kaXRpb25zXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZGl0aW9uPzogYW55O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VyaWFsaXplZEludHJpbnNpYzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHN0YXRlbWVudDogVW5rbm93bk1hcCB8IHN0cmluZykge1xuICAgIGlmICh0eXBlb2Ygc3RhdGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5zaWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmVmZmVjdCA9IEVmZmVjdC5Vbmtub3duO1xuICAgICAgdGhpcy5yZXNvdXJjZXMgPSBuZXcgVGFyZ2V0cyh7fSwgJycsICcnKTtcbiAgICAgIHRoaXMuYWN0aW9ucyA9IG5ldyBUYXJnZXRzKHt9LCAnJywgJycpO1xuICAgICAgdGhpcy5wcmluY2lwYWxzID0gbmV3IFRhcmdldHMoe30sICcnLCAnJyk7XG4gICAgICB0aGlzLmNvbmRpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc2VyaWFsaXplZEludHJpbnNpYyA9IHN0YXRlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaWQgPSBleHBlY3RTdHJpbmcoc3RhdGVtZW50LlNpZCk7XG4gICAgICB0aGlzLmVmZmVjdCA9IGV4cGVjdEVmZmVjdChzdGF0ZW1lbnQuRWZmZWN0KTtcbiAgICAgIHRoaXMucmVzb3VyY2VzID0gbmV3IFRhcmdldHMoc3RhdGVtZW50LCAnUmVzb3VyY2UnLCAnTm90UmVzb3VyY2UnKTtcbiAgICAgIHRoaXMuYWN0aW9ucyA9IG5ldyBUYXJnZXRzKHN0YXRlbWVudCwgJ0FjdGlvbicsICdOb3RBY3Rpb24nKTtcbiAgICAgIHRoaXMucHJpbmNpcGFscyA9IG5ldyBUYXJnZXRzKHN0YXRlbWVudCwgJ1ByaW5jaXBhbCcsICdOb3RQcmluY2lwYWwnKTtcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gc3RhdGVtZW50LkNvbmRpdGlvbjtcbiAgICAgIHRoaXMuc2VyaWFsaXplZEludHJpbnNpYyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN0YXRlbWVudCBpcyBlcXVhbCB0byB0aGUgb3RoZXIgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgZXF1YWwob3RoZXI6IFN0YXRlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5zaWQgPT09IG90aGVyLnNpZFxuICAgICAgJiYgdGhpcy5lZmZlY3QgPT09IG90aGVyLmVmZmVjdFxuICAgICAgJiYgdGhpcy5zZXJpYWxpemVkSW50cmluc2ljID09PSBvdGhlci5zZXJpYWxpemVkSW50cmluc2ljXG4gICAgICAmJiB0aGlzLnJlc291cmNlcy5lcXVhbChvdGhlci5yZXNvdXJjZXMpXG4gICAgICAmJiB0aGlzLmFjdGlvbnMuZXF1YWwob3RoZXIuYWN0aW9ucylcbiAgICAgICYmIHRoaXMucHJpbmNpcGFscy5lcXVhbChvdGhlci5wcmluY2lwYWxzKVxuICAgICAgJiYgZGVlcEVxdWFsKHRoaXMuY29uZGl0aW9uLCBvdGhlci5jb25kaXRpb24pKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKTogUmVuZGVyZWRTdGF0ZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZWRJbnRyaW5zaWNcbiAgICAgID8ge1xuICAgICAgICByZXNvdXJjZTogdGhpcy5zZXJpYWxpemVkSW50cmluc2ljLFxuICAgICAgICBlZmZlY3Q6ICcnLFxuICAgICAgICBhY3Rpb246ICcnLFxuICAgICAgICBwcmluY2lwYWw6IHRoaXMucHJpbmNpcGFscy5yZW5kZXIoKSwgLy8gdGhlc2Ugd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgY2FsbCB0byByZXBsYWNlRW1wdHkoKSBmcm9tIElhbUNoYW5nZXNcbiAgICAgICAgY29uZGl0aW9uOiAnJyxcbiAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICByZXNvdXJjZTogdGhpcy5yZXNvdXJjZXMucmVuZGVyKCksXG4gICAgICAgIGVmZmVjdDogdGhpcy5lZmZlY3QsXG4gICAgICAgIGFjdGlvbjogdGhpcy5hY3Rpb25zLnJlbmRlcigpLFxuICAgICAgICBwcmluY2lwYWw6IHRoaXMucHJpbmNpcGFscy5yZW5kZXIoKSxcbiAgICAgICAgY29uZGl0aW9uOiByZW5kZXJDb25kaXRpb24odGhpcy5jb25kaXRpb24pLFxuICAgICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGNoYW5nZXMuXG4gICAqIFRoaXMgaXMgb25seSB1c2VkIGluIHRlc3RzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9Kc29uKCk6IE1heWJlUGFyc2VkPFN0YXRlbWVudEpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVkSW50cmluc2ljXG4gICAgICA/IG1rVW5wYXJzZWFibGUodGhpcy5zZXJpYWxpemVkSW50cmluc2ljKVxuICAgICAgOiBta1BhcnNlZChkZWVwUmVtb3ZlVW5kZWZpbmVkKHtcbiAgICAgICAgc2lkOiB0aGlzLnNpZCxcbiAgICAgICAgZWZmZWN0OiB0aGlzLmVmZmVjdCxcbiAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcy5fdG9Kc29uKCksXG4gICAgICAgIHByaW5jaXBhbHM6IHRoaXMucHJpbmNpcGFscy5fdG9Kc29uKCksXG4gICAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucy5fdG9Kc29uKCksXG4gICAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGlzIGEgbmVnYXRpdmUgc3RhdGVtZW50XG4gICAqXG4gICAqIEEgc3RhdGVtZW50IGlzIG5lZ2F0aXZlIGlmIGFueSBvZiBpdHMgdGFyZ2V0cyBhcmUgbmVnYXRpdmUsIGludmVydGVkXG4gICAqIGlmIHRoZSBFZmZlY3QgaXMgRGVueS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNOZWdhdGl2ZVN0YXRlbWVudCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3RUYXJnZXQgPSB0aGlzLmFjdGlvbnMubm90IHx8IHRoaXMucHJpbmNpcGFscy5ub3QgfHwgdGhpcy5yZXNvdXJjZXMubm90O1xuICAgIHJldHVybiB0aGlzLmVmZmVjdCA9PT0gRWZmZWN0LkFsbG93ID8gbm90VGFyZ2V0IDogIW5vdFRhcmdldDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlcmVkU3RhdGVtZW50IHtcbiAgcmVhZG9ubHkgcmVzb3VyY2U6IHN0cmluZztcbiAgcmVhZG9ubHkgZWZmZWN0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFjdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBwcmluY2lwYWw6IHN0cmluZztcbiAgcmVhZG9ubHkgY29uZGl0aW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50SnNvbiB7XG4gIHNpZD86IHN0cmluZztcbiAgZWZmZWN0OiBzdHJpbmc7XG4gIHJlc291cmNlczogVGFyZ2V0c0pzb247XG4gIGFjdGlvbnM6IFRhcmdldHNKc29uO1xuICBwcmluY2lwYWxzOiBUYXJnZXRzSnNvbjtcbiAgY29uZGl0aW9uPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldHNKc29uIHtcbiAgbm90OiBib29sZWFuO1xuICB2YWx1ZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIGZyb20gdW5kZWZpbmVkLCBhIFN0YXRlbWVudCwgb3IgYSBsaXN0IG9mIHN0YXRlbWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RhdGVtZW50cyh4OiBhbnkpOiBTdGF0ZW1lbnRbXSB7XG4gIGlmICh4ID09PSB1bmRlZmluZWQpIHsgeCA9IFtdOyB9XG4gIGlmICghQXJyYXkuaXNBcnJheSh4KSkgeyB4ID0gW3hdOyB9XG4gIHJldHVybiB4Lm1hcCgoczogYW55KSA9PiBuZXcgU3RhdGVtZW50KHMpKTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIFN0YXRlbWVudCBmcm9tIGEgTGFtYmRhOjpQZXJtaXNzaW9uIG9iamVjdFxuICpcbiAqIFRoaXMgaXMgYWN0dWFsbHkgd2hhdCBMYW1iZGEgYWRkcyB0byB0aGUgcG9saWN5IGRvY3VtZW50IGlmIHlvdSBjYWxsIEFkZFBlcm1pc3Npb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxhbWJkYVBlcm1pc3Npb24oeDogYW55KTogU3RhdGVtZW50IHtcbiAgLy8gQ29uc3RydWN0IGEgc3RhdGVtZW50IGZyb21cbiAgY29uc3Qgc3RhdGVtZW50OiBhbnkgPSB7XG4gICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgIEFjdGlvbjogeC5BY3Rpb24sXG4gICAgUmVzb3VyY2U6IHguRnVuY3Rpb25OYW1lLFxuICB9O1xuXG4gIGlmICh4LlByaW5jaXBhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHguUHJpbmNpcGFsID09PSAnKicpIHtcbiAgICAgIC8vICpcbiAgICAgIHN0YXRlbWVudC5QcmluY2lwYWwgPSAnKic7XG4gICAgfSBlbHNlIGlmICgvXlxcZHsxMn0kLy50ZXN0KHguUHJpbmNpcGFsKSkge1xuICAgICAgLy8gQWNjb3VudCBudW1iZXJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXdzLWNkay9uby1saXRlcmFsLXBhcnRpdGlvblxuICAgICAgc3RhdGVtZW50LlByaW5jaXBhbCA9IHsgQVdTOiBgYXJuOmF3czppYW06OiR7eC5QcmluY2lwYWx9OnJvb3RgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFzc3VtZSBpdCdzIGEgc2VydmljZSBwcmluY2lwYWxcbiAgICAgIC8vIFdlIG1pZ2h0IGdldCB0aGlzIHdyb25nIHZzLiB0aGUgcHJldmlvdXMgb25lIGZvciB0b2tlbnMuIE5vdGhpbmcgdG8gYmUgZG9uZVxuICAgICAgLy8gYWJvdXQgdGhhdC4gSXQncyBvbmx5IGZvciBodW1hbiByZWFkYWJsZSBjb25zdW1wdGlvbiBhZnRlciBhbGwuXG4gICAgICBzdGF0ZW1lbnQuUHJpbmNpcGFsID0geyBTZXJ2aWNlOiB4LlByaW5jaXBhbCB9O1xuICAgIH1cbiAgfVxuICBpZiAoeC5Tb3VyY2VBcm4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0ZW1lbnQuQ29uZGl0aW9uID09PSB1bmRlZmluZWQpIHsgc3RhdGVtZW50LkNvbmRpdGlvbiA9IHt9OyB9XG4gICAgc3RhdGVtZW50LkNvbmRpdGlvbi5Bcm5MaWtlID0geyAnQVdTOlNvdXJjZUFybic6IHguU291cmNlQXJuIH07XG4gIH1cbiAgaWYgKHguU291cmNlQWNjb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0YXRlbWVudC5Db25kaXRpb24gPT09IHVuZGVmaW5lZCkgeyBzdGF0ZW1lbnQuQ29uZGl0aW9uID0ge307IH1cbiAgICBzdGF0ZW1lbnQuQ29uZGl0aW9uLlN0cmluZ0VxdWFscyA9IHsgJ0FXUzpTb3VyY2VBY2NvdW50JzogeC5Tb3VyY2VBY2NvdW50IH07XG4gIH1cbiAgaWYgKHguRXZlbnRTb3VyY2VUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0YXRlbWVudC5Db25kaXRpb24gPT09IHVuZGVmaW5lZCkgeyBzdGF0ZW1lbnQuQ29uZGl0aW9uID0ge307IH1cbiAgICBzdGF0ZW1lbnQuQ29uZGl0aW9uLlN0cmluZ0VxdWFscyA9IHsgJ2xhbWJkYTpFdmVudFNvdXJjZVRva2VuJzogeC5FdmVudFNvdXJjZVRva2VuIH07XG4gIH1cblxuICByZXR1cm4gbmV3IFN0YXRlbWVudChzdGF0ZW1lbnQpO1xufVxuXG4vKipcbiAqIFRhcmdldHMgZm9yIGEgZmllbGRcbiAqL1xuZXhwb3J0IGNsYXNzIFRhcmdldHMge1xuICAvKipcbiAgICogVGhlIHZhbHVlcyBvZiB0aGUgdGFyZ2V0c1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUgbWF0Y2hlcnNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBub3Q6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioc3RhdGVtZW50OiBVbmtub3duTWFwLCBwb3NpdGl2ZUtleTogc3RyaW5nLCBuZWdhdGl2ZUtleTogc3RyaW5nKSB7XG4gICAgaWYgKG5lZ2F0aXZlS2V5IGluIHN0YXRlbWVudCkge1xuICAgICAgdGhpcy52YWx1ZXMgPSBmb3JjZUxpc3RPZlN0cmluZ3Moc3RhdGVtZW50W25lZ2F0aXZlS2V5XSk7XG4gICAgICB0aGlzLm5vdCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVzID0gZm9yY2VMaXN0T2ZTdHJpbmdzKHN0YXRlbWVudFtwb3NpdGl2ZUtleV0pO1xuICAgICAgdGhpcy5ub3QgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZXMuc29ydCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBlbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBzZXQgb2YgdGFyZ2V0cyBpcyBlcXVhbCB0byB0aGUgb3RoZXIgc2V0IG9mIHRhcmdldHNcbiAgICovXG4gIHB1YmxpYyBlcXVhbChvdGhlcjogVGFyZ2V0cykge1xuICAgIHJldHVybiB0aGlzLm5vdCA9PT0gb3RoZXIubm90ICYmIGRlZXBFcXVhbCh0aGlzLnZhbHVlcy5zb3J0KCksIG90aGVyLnZhbHVlcy5zb3J0KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBjdXJyZW50IHZhbHVlIHNldCBpcyBlbXB0eSwgcHV0IHRoaXMgaW4gaXRcbiAgICovXG4gIHB1YmxpYyByZXBsYWNlRW1wdHkocmVwbGFjZW1lbnQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmVtcHR5KSB7XG4gICAgICB0aGlzLnZhbHVlcy5wdXNoKHJlcGxhY2VtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGFjdGlvbnMgY29udGFpbnMgYSAnKicsIHJlcGxhY2Ugd2l0aCB0aGlzIHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyByZXBsYWNlU3RhcihyZXBsYWNlbWVudDogc3RyaW5nKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMudmFsdWVzW2ldID09PSAnKicpIHtcbiAgICAgICAgdGhpcy52YWx1ZXNbaV0gPSByZXBsYWNlbWVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWx1ZXMuc29ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBpbnRvIGEgc3VtbWFyeSB0YWJsZSBjZWxsXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubm90XG4gICAgICA/IHRoaXMudmFsdWVzLm1hcChzID0+IGBOT1QgJHtzfWApLmpvaW4oJ1xcbicpXG4gICAgICA6IHRoaXMudmFsdWVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY2hhbmdlcy5cbiAgICogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGVzdHMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0pzb24oKTogVGFyZ2V0c0pzb24ge1xuICAgIHJldHVybiB7IG5vdDogdGhpcy5ub3QsIHZhbHVlczogdGhpcy52YWx1ZXMgfTtcbiAgfVxufVxuXG50eXBlIFVua25vd25NYXAgPSB7W2tleTogc3RyaW5nXTogdW5rbm93bn07XG5cbmV4cG9ydCBlbnVtIEVmZmVjdCB7XG4gIFVua25vd24gPSAnVW5rbm93bicsXG4gIEFsbG93ID0gJ0FsbG93JyxcbiAgRGVueSA9ICdEZW55Jyxcbn1cblxuZnVuY3Rpb24gZXhwZWN0U3RyaW5nKHg6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnID8geCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXhwZWN0RWZmZWN0KHg6IHVua25vd24pOiBFZmZlY3Qge1xuICBpZiAoeCA9PT0gRWZmZWN0LkFsbG93IHx8IHggPT09IEVmZmVjdC5EZW55KSB7IHJldHVybiB4IGFzIEVmZmVjdDsgfVxuICByZXR1cm4gRWZmZWN0LlVua25vd247XG59XG5cbmZ1bmN0aW9uIGZvcmNlTGlzdE9mU3RyaW5ncyh4OiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHggPT09ICdzdHJpbmcnKSB7IHJldHVybiBbeF07IH1cbiAgaWYgKHR5cGVvZiB4ID09PSAndW5kZWZpbmVkJyB8fCB4ID09PSBudWxsKSB7IHJldHVybiBbXTsgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIHgubWFwKGUgPT4gZm9yY2VMaXN0T2ZTdHJpbmdzKGUpLmpvaW4oJywnKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGwpIHtcbiAgICBjb25zdCByZXQ6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoeCkpIHtcbiAgICAgIHJldC5wdXNoKC4uLmZvcmNlTGlzdE9mU3RyaW5ncyh2YWx1ZSkubWFwKHMgPT4gYCR7a2V5fToke3N9YCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcmV0dXJuIFtgJHt4fWBdO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgQ29uZGl0aW9uIGNvbHVtblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29uZGl0aW9uKGNvbmRpdGlvbjogYW55KTogc3RyaW5nIHtcbiAgaWYgKCFjb25kaXRpb24gfHwgT2JqZWN0LmtleXMoY29uZGl0aW9uKS5sZW5ndGggPT09IDApIHsgcmV0dXJuICcnOyB9XG4gIGNvbnN0IGpzb25SZXByZXNlbnRhdGlvbiA9IEpTT04uc3RyaW5naWZ5KGNvbmRpdGlvbiwgdW5kZWZpbmVkLCAyKTtcblxuICAvLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBsb29rcyBsaWtlIHRoaXM6XG4gIC8vXG4gIC8vICB7XG4gIC8vICAgIFwiQXJuTGlrZVwiOiB7XG4gIC8vICAgICAgXCJBV1M6U291cmNlQXJuXCI6IFwiJHtNeVRvcGljODY4Njk0MzR9XCJcbiAgLy8gICAgfVxuICAvLyAgfVxuICAvL1xuICAvLyBXZSBjYW4gbWFrZSBpdCBtb3JlIGNvbXBhY3Qgd2l0aG91dCBsb3NpbmcgaW5mb3JtYXRpb24gYnkgZ2V0dGluZyByaWQgb2YgdGhlIG91dGVybW9zdCBicmFjZXNcbiAgLy8gYW5kIHRoZSBpbmRlbnRhdGlvbi5cbiAgY29uc3QgbGluZXMgPSBqc29uUmVwcmVzZW50YXRpb24uc3BsaXQoJ1xcbicpO1xuICByZXR1cm4gbGluZXMuc2xpY2UoMSwgbGluZXMubGVuZ3RoIC0gMSkubWFwKHMgPT4gcy5zbGljZSgyKSkuam9pbignXFxuJyk7XG59XG4iXX0=","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mangleLikeCloudFormation = exports.deepEqual = void 0;\n__exportStar(require(\"./diff-template\"), exports);\n__exportStar(require(\"./format\"), exports);\n__exportStar(require(\"./format-table\"), exports);\nvar util_1 = require(\"./diff/util\");\nObject.defineProperty(exports, \"deepEqual\", { enumerable: true, get: function () { return util_1.deepEqual; } });\nObject.defineProperty(exports, \"mangleLikeCloudFormation\", { enumerable: true, get: function () { return util_1.mangleLikeCloudFormation; } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUFnQztBQUNoQywyQ0FBeUI7QUFDekIsaURBQStCO0FBQy9CLG9DQUFrRTtBQUF6RCxpR0FBQSxTQUFTLE9BQUE7QUFBRSxnSEFBQSx3QkFBd0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGlmZi10ZW1wbGF0ZSc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdCc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdC10YWJsZSc7XG5leHBvcnQgeyBkZWVwRXF1YWwsIG1hbmdsZUxpa2VDbG91ZEZvcm1hdGlvbiB9IGZyb20gJy4vZGlmZi91dGlsJztcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SecurityGroupChanges = void 0;\nconst chalk = require(\"chalk\");\nconst security_group_rule_1 = require(\"./security-group-rule\");\nconst diffable_1 = require(\"../diffable\");\nconst render_intrinsics_1 = require(\"../render-intrinsics\");\nconst util_1 = require(\"../util\");\n/**\n * Changes to IAM statements\n */\nclass SecurityGroupChanges {\n constructor(props) {\n this.ingress = new diffable_1.DiffableCollection();\n this.egress = new diffable_1.DiffableCollection();\n // Group rules\n for (const ingressProp of props.ingressRulePropertyChanges) {\n this.ingress.addOld(...this.readInlineRules(ingressProp.oldValue, ingressProp.resourceLogicalId));\n this.ingress.addNew(...this.readInlineRules(ingressProp.newValue, ingressProp.resourceLogicalId));\n }\n for (const egressProp of props.egressRulePropertyChanges) {\n this.egress.addOld(...this.readInlineRules(egressProp.oldValue, egressProp.resourceLogicalId));\n this.egress.addNew(...this.readInlineRules(egressProp.newValue, egressProp.resourceLogicalId));\n }\n // Rule resources\n for (const ingressRes of props.ingressRuleResourceChanges) {\n this.ingress.addOld(...this.readRuleResource(ingressRes.oldProperties));\n this.ingress.addNew(...this.readRuleResource(ingressRes.newProperties));\n }\n for (const egressRes of props.egressRuleResourceChanges) {\n this.egress.addOld(...this.readRuleResource(egressRes.oldProperties));\n this.egress.addNew(...this.readRuleResource(egressRes.newProperties));\n }\n this.ingress.calculateDiff();\n this.egress.calculateDiff();\n }\n get hasChanges() {\n return this.ingress.hasChanges || this.egress.hasChanges;\n }\n /**\n * Return a summary table of changes\n */\n summarize() {\n const ret = [];\n const header = ['', 'Group', 'Dir', 'Protocol', 'Peer'];\n const inWord = 'In';\n const outWord = 'Out';\n // Render a single rule to the table (curried function so we can map it across rules easily--thank you JavaScript!)\n const renderRule = (plusMin, inOut) => (rule) => [\n plusMin,\n rule.groupId,\n inOut,\n rule.describeProtocol(),\n rule.describePeer(),\n ].map(s => plusMin === '+' ? chalk.green(s) : chalk.red(s));\n // First generate all lines, sort later\n ret.push(...this.ingress.additions.map(renderRule('+', inWord)));\n ret.push(...this.egress.additions.map(renderRule('+', outWord)));\n ret.push(...this.ingress.removals.map(renderRule('-', inWord)));\n ret.push(...this.egress.removals.map(renderRule('-', outWord)));\n // Sort by group name then ingress/egress (ingress first)\n ret.sort((0, util_1.makeComparator)((row) => [row[1], row[2].indexOf(inWord) > -1 ? 0 : 1]));\n ret.splice(0, 0, header);\n return ret;\n }\n toJson() {\n return (0, util_1.deepRemoveUndefined)({\n ingressRuleAdditions: (0, util_1.dropIfEmpty)(this.ingress.additions.map(s => s.toJson())),\n ingressRuleRemovals: (0, util_1.dropIfEmpty)(this.ingress.removals.map(s => s.toJson())),\n egressRuleAdditions: (0, util_1.dropIfEmpty)(this.egress.additions.map(s => s.toJson())),\n egressRuleRemovals: (0, util_1.dropIfEmpty)(this.egress.removals.map(s => s.toJson())),\n });\n }\n get rulesAdded() {\n return this.ingress.hasAdditions\n || this.egress.hasAdditions;\n }\n readInlineRules(rules, logicalId) {\n if (!rules || !Array.isArray(rules)) {\n return [];\n }\n // UnCloudFormation so the parser works in an easier domain\n const ref = '${' + logicalId + '.GroupId}';\n return rules.flatMap((r) => {\n const rendered = (0, render_intrinsics_1.renderIntrinsics)(r);\n // SecurityGroupRule is not robust against unparsed objects\n return typeof rendered === 'object' ? [new security_group_rule_1.SecurityGroupRule(rendered, ref)] : [];\n });\n }\n readRuleResource(resource) {\n if (!resource) {\n return [];\n }\n // UnCloudFormation so the parser works in an easier domain\n return [new security_group_rule_1.SecurityGroupRule((0, render_intrinsics_1.renderIntrinsics)(resource))];\n }\n}\nexports.SecurityGroupChanges = SecurityGroupChanges;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktZ3JvdXAtY2hhbmdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlY3VyaXR5LWdyb3VwLWNoYW5nZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQy9CLCtEQUFvRTtBQUVwRSwwQ0FBaUQ7QUFDakQsNERBQXdEO0FBQ3hELGtDQUEyRTtBQVMzRTs7R0FFRztBQUNILE1BQWEsb0JBQW9CO0lBSS9CLFlBQVksS0FBZ0M7UUFINUIsWUFBTyxHQUFHLElBQUksNkJBQWtCLEVBQXFCLENBQUM7UUFDdEQsV0FBTSxHQUFHLElBQUksNkJBQWtCLEVBQXFCLENBQUM7UUFHbkUsY0FBYztRQUNkLEtBQUssTUFBTSxXQUFXLElBQUksS0FBSyxDQUFDLDBCQUEwQixFQUFFO1lBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDbEcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztTQUNuRztRQUNELEtBQUssTUFBTSxVQUFVLElBQUksS0FBSyxDQUFDLHlCQUF5QixFQUFFO1lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDL0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztTQUNoRztRQUVELGlCQUFpQjtRQUNqQixLQUFLLE1BQU0sVUFBVSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsRUFBRTtZQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztTQUN6RTtRQUNELEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxDQUFDLHlCQUF5QixFQUFFO1lBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ2QsTUFBTSxHQUFHLEdBQWUsRUFBRSxDQUFDO1FBRTNCLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXhELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQztRQUNwQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFdEIsbUhBQW1IO1FBQ25ILE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBZSxFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUF1QixFQUFFLEVBQUUsQ0FBQztZQUNsRixPQUFPO1lBQ1AsSUFBSSxDQUFDLE9BQU87WUFDWixLQUFLO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUU7U0FDcEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUQsdUNBQXVDO1FBQ3ZDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEUseURBQXlEO1FBQ3pELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSxxQkFBYyxFQUFDLENBQUMsR0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFekIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sTUFBTTtRQUNYLE9BQU8sSUFBQSwwQkFBbUIsRUFBQztZQUN6QixvQkFBb0IsRUFBRSxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDOUUsbUJBQW1CLEVBQUUsSUFBQSxrQkFBVyxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzVFLG1CQUFtQixFQUFFLElBQUEsa0JBQVcsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUM1RSxrQkFBa0IsRUFBRSxJQUFBLGtCQUFXLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDM0UsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWTtlQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUNsQyxDQUFDO0lBRU8sZUFBZSxDQUFDLEtBQVUsRUFBRSxTQUFpQjtRQUNuRCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFFbkQsMkRBQTJEO1FBRTNELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzNDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUEsb0NBQWdCLEVBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsMkRBQTJEO1lBQzNELE9BQU8sT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksdUNBQWlCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxRQUFhO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBRTdCLDJEQUEyRDtRQUUzRCxPQUFPLENBQUMsSUFBSSx1Q0FBaUIsQ0FBQyxJQUFBLG9DQUFnQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUFyR0Qsb0RBcUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgUnVsZUpzb24sIFNlY3VyaXR5R3JvdXBSdWxlIH0gZnJvbSAnLi9zZWN1cml0eS1ncm91cC1ydWxlJztcbmltcG9ydCB7IFByb3BlcnR5Q2hhbmdlLCBSZXNvdXJjZUNoYW5nZSB9IGZyb20gJy4uL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgRGlmZmFibGVDb2xsZWN0aW9uIH0gZnJvbSAnLi4vZGlmZmFibGUnO1xuaW1wb3J0IHsgcmVuZGVySW50cmluc2ljcyB9IGZyb20gJy4uL3JlbmRlci1pbnRyaW5zaWNzJztcbmltcG9ydCB7IGRlZXBSZW1vdmVVbmRlZmluZWQsIGRyb3BJZkVtcHR5LCBtYWtlQ29tcGFyYXRvciB9IGZyb20gJy4uL3V0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5R3JvdXBDaGFuZ2VzUHJvcHMge1xuICBpbmdyZXNzUnVsZVByb3BlcnR5Q2hhbmdlczogUHJvcGVydHlDaGFuZ2VbXTtcbiAgaW5ncmVzc1J1bGVSZXNvdXJjZUNoYW5nZXM6IFJlc291cmNlQ2hhbmdlW107XG4gIGVncmVzc1J1bGVSZXNvdXJjZUNoYW5nZXM6IFJlc291cmNlQ2hhbmdlW107XG4gIGVncmVzc1J1bGVQcm9wZXJ0eUNoYW5nZXM6IFByb3BlcnR5Q2hhbmdlW107XG59XG5cbi8qKlxuICogQ2hhbmdlcyB0byBJQU0gc3RhdGVtZW50c1xuICovXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlHcm91cENoYW5nZXMge1xuICBwdWJsaWMgcmVhZG9ubHkgaW5ncmVzcyA9IG5ldyBEaWZmYWJsZUNvbGxlY3Rpb248U2VjdXJpdHlHcm91cFJ1bGU+KCk7XG4gIHB1YmxpYyByZWFkb25seSBlZ3Jlc3MgPSBuZXcgRGlmZmFibGVDb2xsZWN0aW9uPFNlY3VyaXR5R3JvdXBSdWxlPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTZWN1cml0eUdyb3VwQ2hhbmdlc1Byb3BzKSB7XG4gICAgLy8gR3JvdXAgcnVsZXNcbiAgICBmb3IgKGNvbnN0IGluZ3Jlc3NQcm9wIG9mIHByb3BzLmluZ3Jlc3NSdWxlUHJvcGVydHlDaGFuZ2VzKSB7XG4gICAgICB0aGlzLmluZ3Jlc3MuYWRkT2xkKC4uLnRoaXMucmVhZElubGluZVJ1bGVzKGluZ3Jlc3NQcm9wLm9sZFZhbHVlLCBpbmdyZXNzUHJvcC5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgICAgdGhpcy5pbmdyZXNzLmFkZE5ldyguLi50aGlzLnJlYWRJbmxpbmVSdWxlcyhpbmdyZXNzUHJvcC5uZXdWYWx1ZSwgaW5ncmVzc1Byb3AucmVzb3VyY2VMb2dpY2FsSWQpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZ3Jlc3NQcm9wIG9mIHByb3BzLmVncmVzc1J1bGVQcm9wZXJ0eUNoYW5nZXMpIHtcbiAgICAgIHRoaXMuZWdyZXNzLmFkZE9sZCguLi50aGlzLnJlYWRJbmxpbmVSdWxlcyhlZ3Jlc3NQcm9wLm9sZFZhbHVlLCBlZ3Jlc3NQcm9wLnJlc291cmNlTG9naWNhbElkKSk7XG4gICAgICB0aGlzLmVncmVzcy5hZGROZXcoLi4udGhpcy5yZWFkSW5saW5lUnVsZXMoZWdyZXNzUHJvcC5uZXdWYWx1ZSwgZWdyZXNzUHJvcC5yZXNvdXJjZUxvZ2ljYWxJZCkpO1xuICAgIH1cblxuICAgIC8vIFJ1bGUgcmVzb3VyY2VzXG4gICAgZm9yIChjb25zdCBpbmdyZXNzUmVzIG9mIHByb3BzLmluZ3Jlc3NSdWxlUmVzb3VyY2VDaGFuZ2VzKSB7XG4gICAgICB0aGlzLmluZ3Jlc3MuYWRkT2xkKC4uLnRoaXMucmVhZFJ1bGVSZXNvdXJjZShpbmdyZXNzUmVzLm9sZFByb3BlcnRpZXMpKTtcbiAgICAgIHRoaXMuaW5ncmVzcy5hZGROZXcoLi4udGhpcy5yZWFkUnVsZVJlc291cmNlKGluZ3Jlc3NSZXMubmV3UHJvcGVydGllcykpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVncmVzc1JlcyBvZiBwcm9wcy5lZ3Jlc3NSdWxlUmVzb3VyY2VDaGFuZ2VzKSB7XG4gICAgICB0aGlzLmVncmVzcy5hZGRPbGQoLi4udGhpcy5yZWFkUnVsZVJlc291cmNlKGVncmVzc1Jlcy5vbGRQcm9wZXJ0aWVzKSk7XG4gICAgICB0aGlzLmVncmVzcy5hZGROZXcoLi4udGhpcy5yZWFkUnVsZVJlc291cmNlKGVncmVzc1Jlcy5uZXdQcm9wZXJ0aWVzKSk7XG4gICAgfVxuXG4gICAgdGhpcy5pbmdyZXNzLmNhbGN1bGF0ZURpZmYoKTtcbiAgICB0aGlzLmVncmVzcy5jYWxjdWxhdGVEaWZmKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5ncmVzcy5oYXNDaGFuZ2VzIHx8IHRoaXMuZWdyZXNzLmhhc0NoYW5nZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3VtbWFyeSB0YWJsZSBvZiBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgc3VtbWFyaXplKCk6IHN0cmluZ1tdW10ge1xuICAgIGNvbnN0IHJldDogc3RyaW5nW11bXSA9IFtdO1xuXG4gICAgY29uc3QgaGVhZGVyID0gWycnLCAnR3JvdXAnLCAnRGlyJywgJ1Byb3RvY29sJywgJ1BlZXInXTtcblxuICAgIGNvbnN0IGluV29yZCA9ICdJbic7XG4gICAgY29uc3Qgb3V0V29yZCA9ICdPdXQnO1xuXG4gICAgLy8gUmVuZGVyIGEgc2luZ2xlIHJ1bGUgdG8gdGhlIHRhYmxlIChjdXJyaWVkIGZ1bmN0aW9uIHNvIHdlIGNhbiBtYXAgaXQgYWNyb3NzIHJ1bGVzIGVhc2lseS0tdGhhbmsgeW91IEphdmFTY3JpcHQhKVxuICAgIGNvbnN0IHJlbmRlclJ1bGUgPSAocGx1c01pbjogc3RyaW5nLCBpbk91dDogc3RyaW5nKSA9PiAocnVsZTogU2VjdXJpdHlHcm91cFJ1bGUpID0+IFtcbiAgICAgIHBsdXNNaW4sXG4gICAgICBydWxlLmdyb3VwSWQsXG4gICAgICBpbk91dCxcbiAgICAgIHJ1bGUuZGVzY3JpYmVQcm90b2NvbCgpLFxuICAgICAgcnVsZS5kZXNjcmliZVBlZXIoKSxcbiAgICBdLm1hcChzID0+IHBsdXNNaW4gPT09ICcrJyA/IGNoYWxrLmdyZWVuKHMpIDogY2hhbGsucmVkKHMpKTtcblxuICAgIC8vIEZpcnN0IGdlbmVyYXRlIGFsbCBsaW5lcywgc29ydCBsYXRlclxuICAgIHJldC5wdXNoKC4uLnRoaXMuaW5ncmVzcy5hZGRpdGlvbnMubWFwKHJlbmRlclJ1bGUoJysnLCBpbldvcmQpKSk7XG4gICAgcmV0LnB1c2goLi4udGhpcy5lZ3Jlc3MuYWRkaXRpb25zLm1hcChyZW5kZXJSdWxlKCcrJywgb3V0V29yZCkpKTtcbiAgICByZXQucHVzaCguLi50aGlzLmluZ3Jlc3MucmVtb3ZhbHMubWFwKHJlbmRlclJ1bGUoJy0nLCBpbldvcmQpKSk7XG4gICAgcmV0LnB1c2goLi4udGhpcy5lZ3Jlc3MucmVtb3ZhbHMubWFwKHJlbmRlclJ1bGUoJy0nLCBvdXRXb3JkKSkpO1xuXG4gICAgLy8gU29ydCBieSBncm91cCBuYW1lIHRoZW4gaW5ncmVzcy9lZ3Jlc3MgKGluZ3Jlc3MgZmlyc3QpXG4gICAgcmV0LnNvcnQobWFrZUNvbXBhcmF0b3IoKHJvdzogc3RyaW5nW10pID0+IFtyb3dbMV0sIHJvd1syXS5pbmRleE9mKGluV29yZCkgPiAtMSA/IDAgOiAxXSkpO1xuXG4gICAgcmV0LnNwbGljZSgwLCAwLCBoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyB0b0pzb24oKTogU2VjdXJpdHlHcm91cENoYW5nZXNKc29uIHtcbiAgICByZXR1cm4gZGVlcFJlbW92ZVVuZGVmaW5lZCh7XG4gICAgICBpbmdyZXNzUnVsZUFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5pbmdyZXNzLmFkZGl0aW9ucy5tYXAocyA9PiBzLnRvSnNvbigpKSksXG4gICAgICBpbmdyZXNzUnVsZVJlbW92YWxzOiBkcm9wSWZFbXB0eSh0aGlzLmluZ3Jlc3MucmVtb3ZhbHMubWFwKHMgPT4gcy50b0pzb24oKSkpLFxuICAgICAgZWdyZXNzUnVsZUFkZGl0aW9uczogZHJvcElmRW1wdHkodGhpcy5lZ3Jlc3MuYWRkaXRpb25zLm1hcChzID0+IHMudG9Kc29uKCkpKSxcbiAgICAgIGVncmVzc1J1bGVSZW1vdmFsczogZHJvcElmRW1wdHkodGhpcy5lZ3Jlc3MucmVtb3ZhbHMubWFwKHMgPT4gcy50b0pzb24oKSkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBydWxlc0FkZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluZ3Jlc3MuaGFzQWRkaXRpb25zXG4gICAgICAgIHx8IHRoaXMuZWdyZXNzLmhhc0FkZGl0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgcmVhZElubGluZVJ1bGVzKHJ1bGVzOiBhbnksIGxvZ2ljYWxJZDogc3RyaW5nKTogU2VjdXJpdHlHcm91cFJ1bGVbXSB7XG4gICAgaWYgKCFydWxlcyB8fCAhQXJyYXkuaXNBcnJheShydWxlcykpIHsgcmV0dXJuIFtdOyB9XG5cbiAgICAvLyBVbkNsb3VkRm9ybWF0aW9uIHNvIHRoZSBwYXJzZXIgd29ya3MgaW4gYW4gZWFzaWVyIGRvbWFpblxuXG4gICAgY29uc3QgcmVmID0gJyR7JyArIGxvZ2ljYWxJZCArICcuR3JvdXBJZH0nO1xuICAgIHJldHVybiBydWxlcy5mbGF0TWFwKChyOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gcmVuZGVySW50cmluc2ljcyhyKTtcbiAgICAgIC8vIFNlY3VyaXR5R3JvdXBSdWxlIGlzIG5vdCByb2J1c3QgYWdhaW5zdCB1bnBhcnNlZCBvYmplY3RzXG4gICAgICByZXR1cm4gdHlwZW9mIHJlbmRlcmVkID09PSAnb2JqZWN0JyA/IFtuZXcgU2VjdXJpdHlHcm91cFJ1bGUocmVuZGVyZWQsIHJlZildIDogW107XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRSdWxlUmVzb3VyY2UocmVzb3VyY2U6IGFueSk6IFNlY3VyaXR5R3JvdXBSdWxlW10ge1xuICAgIGlmICghcmVzb3VyY2UpIHsgcmV0dXJuIFtdOyB9XG5cbiAgICAvLyBVbkNsb3VkRm9ybWF0aW9uIHNvIHRoZSBwYXJzZXIgd29ya3MgaW4gYW4gZWFzaWVyIGRvbWFpblxuXG4gICAgcmV0dXJuIFtuZXcgU2VjdXJpdHlHcm91cFJ1bGUocmVuZGVySW50cmluc2ljcyhyZXNvdXJjZSkpXTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5R3JvdXBDaGFuZ2VzSnNvbiB7XG4gIGluZ3Jlc3NSdWxlQWRkaXRpb25zPzogUnVsZUpzb25bXTtcbiAgaW5ncmVzc1J1bGVSZW1vdmFscz86IFJ1bGVKc29uW107XG4gIGVncmVzc1J1bGVBZGRpdGlvbnM/OiBSdWxlSnNvbltdO1xuICBlZ3Jlc3NSdWxlUmVtb3ZhbHM/OiBSdWxlSnNvbltdO1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SecurityGroupRule = void 0;\n/**\n * A single security group rule, either egress or ingress\n */\nclass SecurityGroupRule {\n constructor(ruleObject, groupRef) {\n this.ipProtocol = ruleObject.IpProtocol || '*unknown*';\n this.fromPort = ruleObject.FromPort;\n this.toPort = ruleObject.ToPort;\n this.groupId = ruleObject.GroupId || groupRef || '*unknown*'; // In case of an inline rule\n this.peer =\n findFirst(ruleObject, ['CidrIp', 'CidrIpv6'], (ip) => ({ kind: 'cidr-ip', ip }))\n ||\n findFirst(ruleObject, ['DestinationSecurityGroupId', 'SourceSecurityGroupId'], (securityGroupId) => ({ kind: 'security-group', securityGroupId }))\n ||\n findFirst(ruleObject, ['DestinationPrefixListId', 'SourcePrefixListId'], (prefixListId) => ({ kind: 'prefix-list', prefixListId }));\n }\n equal(other) {\n return this.ipProtocol === other.ipProtocol\n && this.fromPort === other.fromPort\n && this.toPort === other.toPort\n && peerEqual(this.peer, other.peer);\n }\n describeProtocol() {\n if (this.ipProtocol === '-1') {\n return 'Everything';\n }\n const ipProtocol = this.ipProtocol.toUpperCase();\n if (this.fromPort === -1) {\n return `All ${ipProtocol}`;\n }\n if (this.fromPort === this.toPort) {\n return `${ipProtocol} ${this.fromPort}`;\n }\n return `${ipProtocol} ${this.fromPort}-${this.toPort}`;\n }\n describePeer() {\n if (this.peer) {\n switch (this.peer.kind) {\n case 'cidr-ip':\n if (this.peer.ip === '0.0.0.0/0') {\n return 'Everyone (IPv4)';\n }\n if (this.peer.ip === '::/0') {\n return 'Everyone (IPv6)';\n }\n return `${this.peer.ip}`;\n case 'prefix-list': return `${this.peer.prefixListId}`;\n case 'security-group': return `${this.peer.securityGroupId}`;\n }\n }\n return '?';\n }\n toJson() {\n return {\n groupId: this.groupId,\n ipProtocol: this.ipProtocol,\n fromPort: this.fromPort,\n toPort: this.toPort,\n peer: this.peer,\n };\n }\n}\nexports.SecurityGroupRule = SecurityGroupRule;\nfunction peerEqual(a, b) {\n if ((a === undefined) !== (b === undefined)) {\n return false;\n }\n if (a === undefined) {\n return true;\n }\n if (a.kind !== b.kind) {\n return false;\n }\n switch (a.kind) {\n case 'cidr-ip': return a.ip === b.ip;\n case 'security-group': return a.securityGroupId === b.securityGroupId;\n case 'prefix-list': return a.prefixListId === b.prefixListId;\n }\n}\nfunction findFirst(obj, keys, fn) {\n for (const key of keys) {\n try {\n if (key in obj) {\n return fn(obj[key]);\n }\n }\n catch (e) {\n debugger;\n }\n }\n return undefined;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktZ3JvdXAtcnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlY3VyaXR5LWdyb3VwLXJ1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQTBCNUIsWUFBWSxVQUFlLEVBQUUsUUFBaUI7UUFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxJQUFJLFdBQVcsQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSxRQUFRLElBQUksV0FBVyxDQUFDLENBQUMsNEJBQTRCO1FBRTFGLElBQUksQ0FBQyxJQUFJO1lBQ0wsU0FBUyxDQUFDLFVBQVUsRUFDbEIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQ3RCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQWlCLENBQUEsQ0FBQzs7b0JBRWxELFNBQVMsQ0FBQyxVQUFVLEVBQ2xCLENBQUMsNEJBQTRCLEVBQUUsdUJBQXVCLENBQUMsRUFDdkQsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUF3QixDQUFBLENBQUM7O29CQUUxRixTQUFTLENBQUMsVUFBVSxFQUNsQixDQUFDLHlCQUF5QixFQUFFLG9CQUFvQixDQUFDLEVBQ2pELENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQXFCLENBQUEsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBd0I7UUFDbkMsT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxVQUFVO2VBQ3BDLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLFFBQVE7ZUFDaEMsSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtlQUM1QixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQUUsT0FBTyxZQUFZLENBQUM7U0FBRTtRQUV0RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWpELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUFFLE9BQU8sT0FBTyxVQUFVLEVBQUUsQ0FBQztTQUFFO1FBQ3pELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQUUsT0FBTyxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FBRTtRQUMvRSxPQUFPLEdBQUcsVUFBVSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFTSxZQUFZO1FBQ2pCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3RCLEtBQUssU0FBUztvQkFDWixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFdBQVcsRUFBRTt3QkFBRSxPQUFPLGlCQUFpQixDQUFDO3FCQUFFO29CQUMvRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLE1BQU0sRUFBRTt3QkFBRSxPQUFPLGlCQUFpQixDQUFDO3FCQUFFO29CQUMxRCxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDM0IsS0FBSyxhQUFhLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdkQsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQzlEO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxNQUFNO1FBQ1gsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDaEIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXZGRCw4Q0F1RkM7QUFtQkQsU0FBUyxTQUFTLENBQUMsQ0FBWSxFQUFFLENBQVk7SUFDM0MsSUFBSSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0tBQUU7SUFDOUQsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUM7S0FBRTtJQUVyQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBRSxDQUFDLElBQUksRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0tBQUU7SUFDekMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFO1FBQ2QsS0FBSyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQU0sQ0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxLQUFLLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxLQUFNLENBQWMsQ0FBQyxlQUFlLENBQUM7UUFDcEYsS0FBSyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEtBQU0sQ0FBYyxDQUFDLFlBQVksQ0FBQztLQUM1RTtBQUNILENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBSSxHQUFRLEVBQUUsSUFBYyxFQUFFLEVBQW9CO0lBQ2xFLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3RCLElBQUk7WUFDRixJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7Z0JBQ2QsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDckI7U0FDRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsUUFBUSxDQUFDO1NBQ1Y7S0FDRjtJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc2luZ2xlIHNlY3VyaXR5IGdyb3VwIHJ1bGUsIGVpdGhlciBlZ3Jlc3Mgb3IgaW5ncmVzc1xuICovXG5leHBvcnQgY2xhc3MgU2VjdXJpdHlHcm91cFJ1bGUge1xuICAvKipcbiAgICogR3JvdXAgSUQgb2YgdGhlIGdyb3VwIHRoaXMgcnVsZSBhcHBsaWVzIHRvXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JvdXBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJUCBwcm90b2NvbCB0aGlzIHJ1bGUgYXBwbGllcyB0b1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwUHJvdG9jb2w6IHN0cmluZztcblxuICAvKipcbiAgICogU3RhcnQgb2YgcG9ydCByYW5nZSB0aGlzIHJ1bGUgYXBwbGllcyB0bywgb3IgSUNNUCB0eXBlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZnJvbVBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEVuZCBvZiBwb3J0IHJhbmdlIHRoaXMgcnVsZSBhcHBsaWVzIHRvLCBvciBJQ01QIGNvZGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0b1BvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFBlZXIgb2YgdGhpcyBydWxlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGVlcj86IFJ1bGVQZWVyO1xuXG4gIGNvbnN0cnVjdG9yKHJ1bGVPYmplY3Q6IGFueSwgZ3JvdXBSZWY/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmlwUHJvdG9jb2wgPSBydWxlT2JqZWN0LklwUHJvdG9jb2wgfHwgJyp1bmtub3duKic7XG4gICAgdGhpcy5mcm9tUG9ydCA9IHJ1bGVPYmplY3QuRnJvbVBvcnQ7XG4gICAgdGhpcy50b1BvcnQgPSBydWxlT2JqZWN0LlRvUG9ydDtcbiAgICB0aGlzLmdyb3VwSWQgPSBydWxlT2JqZWN0Lkdyb3VwSWQgfHwgZ3JvdXBSZWYgfHwgJyp1bmtub3duKic7IC8vIEluIGNhc2Ugb2YgYW4gaW5saW5lIHJ1bGVcblxuICAgIHRoaXMucGVlciA9XG4gICAgICAgIGZpbmRGaXJzdChydWxlT2JqZWN0LFxuICAgICAgICAgIFsnQ2lkcklwJywgJ0NpZHJJcHY2J10sXG4gICAgICAgICAgKGlwKSA9PiAoeyBraW5kOiAnY2lkci1pcCcsIGlwIH0gYXMgQ2lkcklwUGVlcikpXG4gICAgICAgIHx8XG4gICAgICAgIGZpbmRGaXJzdChydWxlT2JqZWN0LFxuICAgICAgICAgIFsnRGVzdGluYXRpb25TZWN1cml0eUdyb3VwSWQnLCAnU291cmNlU2VjdXJpdHlHcm91cElkJ10sXG4gICAgICAgICAgKHNlY3VyaXR5R3JvdXBJZCkgPT4gKHsga2luZDogJ3NlY3VyaXR5LWdyb3VwJywgc2VjdXJpdHlHcm91cElkIH0gYXMgU2VjdXJpdHlHcm91cFBlZXIpKVxuICAgICAgICB8fFxuICAgICAgICBmaW5kRmlyc3QocnVsZU9iamVjdCxcbiAgICAgICAgICBbJ0Rlc3RpbmF0aW9uUHJlZml4TGlzdElkJywgJ1NvdXJjZVByZWZpeExpc3RJZCddLFxuICAgICAgICAgIChwcmVmaXhMaXN0SWQpID0+ICh7IGtpbmQ6ICdwcmVmaXgtbGlzdCcsIHByZWZpeExpc3RJZCB9IGFzIFByZWZpeExpc3RQZWVyKSk7XG4gIH1cblxuICBwdWJsaWMgZXF1YWwob3RoZXI6IFNlY3VyaXR5R3JvdXBSdWxlKSB7XG4gICAgcmV0dXJuIHRoaXMuaXBQcm90b2NvbCA9PT0gb3RoZXIuaXBQcm90b2NvbFxuICAgICAgICAmJiB0aGlzLmZyb21Qb3J0ID09PSBvdGhlci5mcm9tUG9ydFxuICAgICAgICAmJiB0aGlzLnRvUG9ydCA9PT0gb3RoZXIudG9Qb3J0XG4gICAgICAgICYmIHBlZXJFcXVhbCh0aGlzLnBlZXIsIG90aGVyLnBlZXIpO1xuICB9XG5cbiAgcHVibGljIGRlc2NyaWJlUHJvdG9jb2woKSB7XG4gICAgaWYgKHRoaXMuaXBQcm90b2NvbCA9PT0gJy0xJykgeyByZXR1cm4gJ0V2ZXJ5dGhpbmcnOyB9XG5cbiAgICBjb25zdCBpcFByb3RvY29sID0gdGhpcy5pcFByb3RvY29sLnRvVXBwZXJDYXNlKCk7XG5cbiAgICBpZiAodGhpcy5mcm9tUG9ydCA9PT0gLTEpIHsgcmV0dXJuIGBBbGwgJHtpcFByb3RvY29sfWA7IH1cbiAgICBpZiAodGhpcy5mcm9tUG9ydCA9PT0gdGhpcy50b1BvcnQpIHsgcmV0dXJuIGAke2lwUHJvdG9jb2x9ICR7dGhpcy5mcm9tUG9ydH1gOyB9XG4gICAgcmV0dXJuIGAke2lwUHJvdG9jb2x9ICR7dGhpcy5mcm9tUG9ydH0tJHt0aGlzLnRvUG9ydH1gO1xuICB9XG5cbiAgcHVibGljIGRlc2NyaWJlUGVlcigpIHtcbiAgICBpZiAodGhpcy5wZWVyKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMucGVlci5raW5kKSB7XG4gICAgICAgIGNhc2UgJ2NpZHItaXAnOlxuICAgICAgICAgIGlmICh0aGlzLnBlZXIuaXAgPT09ICcwLjAuMC4wLzAnKSB7IHJldHVybiAnRXZlcnlvbmUgKElQdjQpJzsgfVxuICAgICAgICAgIGlmICh0aGlzLnBlZXIuaXAgPT09ICc6Oi8wJykgeyByZXR1cm4gJ0V2ZXJ5b25lIChJUHY2KSc7IH1cbiAgICAgICAgICByZXR1cm4gYCR7dGhpcy5wZWVyLmlwfWA7XG4gICAgICAgIGNhc2UgJ3ByZWZpeC1saXN0JzogcmV0dXJuIGAke3RoaXMucGVlci5wcmVmaXhMaXN0SWR9YDtcbiAgICAgICAgY2FzZSAnc2VjdXJpdHktZ3JvdXAnOiByZXR1cm4gYCR7dGhpcy5wZWVyLnNlY3VyaXR5R3JvdXBJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnPyc7XG4gIH1cblxuICBwdWJsaWMgdG9Kc29uKCk6IFJ1bGVKc29uIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ3JvdXBJZDogdGhpcy5ncm91cElkLFxuICAgICAgaXBQcm90b2NvbDogdGhpcy5pcFByb3RvY29sLFxuICAgICAgZnJvbVBvcnQ6IHRoaXMuZnJvbVBvcnQsXG4gICAgICB0b1BvcnQ6IHRoaXMudG9Qb3J0LFxuICAgICAgcGVlcjogdGhpcy5wZWVyLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaWRySXBQZWVyIHtcbiAga2luZDogJ2NpZHItaXAnO1xuICBpcDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5R3JvdXBQZWVyIHtcbiAga2luZDogJ3NlY3VyaXR5LWdyb3VwJztcbiAgc2VjdXJpdHlHcm91cElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlZml4TGlzdFBlZXIge1xuICBraW5kOiAncHJlZml4LWxpc3QnO1xuICBwcmVmaXhMaXN0SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUnVsZVBlZXIgPSBDaWRySXBQZWVyIHwgU2VjdXJpdHlHcm91cFBlZXIgfCBQcmVmaXhMaXN0UGVlcjtcblxuZnVuY3Rpb24gcGVlckVxdWFsKGE/OiBSdWxlUGVlciwgYj86IFJ1bGVQZWVyKSB7XG4gIGlmICgoYSA9PT0gdW5kZWZpbmVkKSAhPT0gKGIgPT09IHVuZGVmaW5lZCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChhID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHRydWU7IH1cblxuICBpZiAoYS5raW5kICE9PSBiIS5raW5kKSB7IHJldHVybiBmYWxzZTsgfVxuICBzd2l0Y2ggKGEua2luZCkge1xuICAgIGNhc2UgJ2NpZHItaXAnOiByZXR1cm4gYS5pcCA9PT0gKGIgYXMgdHlwZW9mIGEpLmlwO1xuICAgIGNhc2UgJ3NlY3VyaXR5LWdyb3VwJzogcmV0dXJuIGEuc2VjdXJpdHlHcm91cElkID09PSAoYiBhcyB0eXBlb2YgYSkuc2VjdXJpdHlHcm91cElkO1xuICAgIGNhc2UgJ3ByZWZpeC1saXN0JzogcmV0dXJuIGEucHJlZml4TGlzdElkID09PSAoYiBhcyB0eXBlb2YgYSkucHJlZml4TGlzdElkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRGaXJzdDxUPihvYmo6IGFueSwga2V5czogc3RyaW5nW10sIGZuOiAoeDogc3RyaW5nKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAgICAgcmV0dXJuIGZuKG9ialtrZXldKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWxlSnNvbiB7XG4gIGdyb3VwSWQ6IHN0cmluZztcbiAgaXBQcm90b2NvbDogc3RyaW5nO1xuICBmcm9tUG9ydD86IG51bWJlcjtcbiAgdG9Qb3J0PzogbnVtYmVyO1xuICBwZWVyPzogUnVsZVBlZXI7XG59Il19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.renderIntrinsics = void 0;\n/**\n * Turn CloudFormation intrinsics into strings\n *\n * ------\n *\n * This stringification is not intended to be mechanically reversible! It's intended\n * to be understood by humans!\n *\n * ------\n *\n * Turns Fn::GetAtt and Fn::Ref objects into the same strings that can be\n * parsed by Fn::Sub, but without the surrounding intrinsics.\n *\n * Evaluates Fn::Join directly if the second argument is a literal list of strings.\n *\n * Removes list and object values evaluating to { Ref: 'AWS::NoValue' }.\n *\n * For other intrinsics we choose a string representation that CloudFormation\n * cannot actually parse, but is comprehensible to humans.\n */\nfunction renderIntrinsics(x) {\n if (Array.isArray(x)) {\n return x.filter(el => !isNoValue(el)).map(renderIntrinsics);\n }\n if (isNoValue(x)) {\n return undefined;\n }\n const intrinsic = getIntrinsic(x);\n if (intrinsic) {\n if (intrinsic.fn === 'Ref') {\n return '${' + intrinsic.args + '}';\n }\n if (intrinsic.fn === 'Fn::GetAtt') {\n return '${' + intrinsic.args[0] + '.' + intrinsic.args[1] + '}';\n }\n if (intrinsic.fn === 'Fn::Join') {\n return unCloudFormationFnJoin(intrinsic.args[0], intrinsic.args[1]);\n }\n return stringifyIntrinsic(intrinsic.fn, intrinsic.args);\n }\n if (typeof x === 'object' && x !== null) {\n const ret = {};\n for (const [key, value] of Object.entries(x)) {\n if (!isNoValue(value)) {\n ret[key] = renderIntrinsics(value);\n }\n }\n return ret;\n }\n return x;\n}\nexports.renderIntrinsics = renderIntrinsics;\nfunction unCloudFormationFnJoin(separator, args) {\n if (Array.isArray(args)) {\n return args.filter(el => !isNoValue(el)).map(renderIntrinsics).join(separator);\n }\n return stringifyIntrinsic('Fn::Join', [separator, args]);\n}\nfunction stringifyIntrinsic(fn, args) {\n return JSON.stringify({ [fn]: renderIntrinsics(args) });\n}\nfunction getIntrinsic(x) {\n if (x === undefined || x === null || Array.isArray(x)) {\n return undefined;\n }\n if (typeof x !== 'object') {\n return undefined;\n }\n const keys = Object.keys(x);\n return keys.length === 1 && (keys[0] === 'Ref' || keys[0].startsWith('Fn::')) ? { fn: keys[0], args: x[keys[0]] } : undefined;\n}\nfunction isNoValue(x) {\n const int = getIntrinsic(x);\n return int && int.fn === 'Ref' && int.args === 'AWS::NoValue';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWludHJpbnNpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyZW5kZXItaW50cmluc2ljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLENBQU07SUFDckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7S0FDN0Q7SUFFRCxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0tBQUU7SUFFdkMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLElBQUksU0FBUyxFQUFFO1FBQ2IsSUFBSSxTQUFTLENBQUMsRUFBRSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU8sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1NBQUU7UUFDbkUsSUFBSSxTQUFTLENBQUMsRUFBRSxLQUFLLFlBQVksRUFBRTtZQUFFLE9BQU8sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQUU7UUFDdkcsSUFBSSxTQUFTLENBQUMsRUFBRSxLQUFLLFVBQVUsRUFBRTtZQUFFLE9BQU8sc0JBQXNCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FBRTtRQUN6RyxPQUFPLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN2QyxNQUFNLEdBQUcsR0FBUSxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDckIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BDO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztLQUNaO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBekJELDRDQXlCQztBQUVELFNBQVMsc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxJQUFTO0lBQzFELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNoRjtJQUNELE9BQU8sa0JBQWtCLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsRUFBVSxFQUFFLElBQVM7SUFDL0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLENBQU07SUFDMUIsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0tBQUU7SUFDNUUsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztLQUFFO0lBQ2hELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEksQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLENBQU07SUFDdkIsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssS0FBSyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDO0FBQ2hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR1cm4gQ2xvdWRGb3JtYXRpb24gaW50cmluc2ljcyBpbnRvIHN0cmluZ3NcbiAqXG4gKiAtLS0tLS1cbiAqXG4gKiBUaGlzIHN0cmluZ2lmaWNhdGlvbiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgbWVjaGFuaWNhbGx5IHJldmVyc2libGUhIEl0J3MgaW50ZW5kZWRcbiAqIHRvIGJlIHVuZGVyc3Rvb2QgYnkgaHVtYW5zIVxuICpcbiAqIC0tLS0tLVxuICpcbiAqIFR1cm5zIEZuOjpHZXRBdHQgYW5kIEZuOjpSZWYgb2JqZWN0cyBpbnRvIHRoZSBzYW1lIHN0cmluZ3MgdGhhdCBjYW4gYmVcbiAqIHBhcnNlZCBieSBGbjo6U3ViLCBidXQgd2l0aG91dCB0aGUgc3Vycm91bmRpbmcgaW50cmluc2ljcy5cbiAqXG4gKiBFdmFsdWF0ZXMgRm46OkpvaW4gZGlyZWN0bHkgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBhIGxpdGVyYWwgbGlzdCBvZiBzdHJpbmdzLlxuICpcbiAqIFJlbW92ZXMgbGlzdCBhbmQgb2JqZWN0IHZhbHVlcyBldmFsdWF0aW5nIHRvIHsgUmVmOiAnQVdTOjpOb1ZhbHVlJyB9LlxuICpcbiAqIEZvciBvdGhlciBpbnRyaW5zaWNzIHdlIGNob29zZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB0aGF0IENsb3VkRm9ybWF0aW9uXG4gKiBjYW5ub3QgYWN0dWFsbHkgcGFyc2UsIGJ1dCBpcyBjb21wcmVoZW5zaWJsZSB0byBodW1hbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJJbnRyaW5zaWNzKHg6IGFueSk6IGFueSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIHguZmlsdGVyKGVsID0+ICFpc05vVmFsdWUoZWwpKS5tYXAocmVuZGVySW50cmluc2ljcyk7XG4gIH1cblxuICBpZiAoaXNOb1ZhbHVlKHgpKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cblxuICBjb25zdCBpbnRyaW5zaWMgPSBnZXRJbnRyaW5zaWMoeCk7XG4gIGlmIChpbnRyaW5zaWMpIHtcbiAgICBpZiAoaW50cmluc2ljLmZuID09PSAnUmVmJykgeyByZXR1cm4gJyR7JyArIGludHJpbnNpYy5hcmdzICsgJ30nOyB9XG4gICAgaWYgKGludHJpbnNpYy5mbiA9PT0gJ0ZuOjpHZXRBdHQnKSB7IHJldHVybiAnJHsnICsgaW50cmluc2ljLmFyZ3NbMF0gKyAnLicgKyBpbnRyaW5zaWMuYXJnc1sxXSArICd9JzsgfVxuICAgIGlmIChpbnRyaW5zaWMuZm4gPT09ICdGbjo6Sm9pbicpIHsgcmV0dXJuIHVuQ2xvdWRGb3JtYXRpb25GbkpvaW4oaW50cmluc2ljLmFyZ3NbMF0sIGludHJpbnNpYy5hcmdzWzFdKTsgfVxuICAgIHJldHVybiBzdHJpbmdpZnlJbnRyaW5zaWMoaW50cmluc2ljLmZuLCBpbnRyaW5zaWMuYXJncyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGwpIHtcbiAgICBjb25zdCByZXQ6IGFueSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHgpKSB7XG4gICAgICBpZiAoIWlzTm9WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0W2tleV0gPSByZW5kZXJJbnRyaW5zaWNzKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gdW5DbG91ZEZvcm1hdGlvbkZuSm9pbihzZXBhcmF0b3I6IHN0cmluZywgYXJnczogYW55KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG4gICAgcmV0dXJuIGFyZ3MuZmlsdGVyKGVsID0+ICFpc05vVmFsdWUoZWwpKS5tYXAocmVuZGVySW50cmluc2ljcykuam9pbihzZXBhcmF0b3IpO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZnlJbnRyaW5zaWMoJ0ZuOjpKb2luJywgW3NlcGFyYXRvciwgYXJnc10pO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlJbnRyaW5zaWMoZm46IHN0cmluZywgYXJnczogYW55KSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IFtmbl06IHJlbmRlckludHJpbnNpY3MoYXJncykgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEludHJpbnNpYyh4OiBhbnkpOiBJbnRyaW5zaWMgfCB1bmRlZmluZWQge1xuICBpZiAoeCA9PT0gdW5kZWZpbmVkIHx8IHggPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheSh4KSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGlmICh0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoeCk7XG4gIHJldHVybiBrZXlzLmxlbmd0aCA9PT0gMSAmJiAoa2V5c1swXSA9PT0gJ1JlZicgfHwga2V5c1swXS5zdGFydHNXaXRoKCdGbjo6JykpID8geyBmbjoga2V5c1swXSwgYXJnczogeFtrZXlzWzBdXSB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc05vVmFsdWUoeDogYW55KSB7XG4gIGNvbnN0IGludCA9IGdldEludHJpbnNpYyh4KTtcbiAgcmV0dXJuIGludCAmJiBpbnQuZm4gPT09ICdSZWYnICYmIGludC5hcmdzID09PSAnQVdTOjpOb1ZhbHVlJztcbn1cblxuaW50ZXJmYWNlIEludHJpbnNpYyB7XG4gIGZuOiBzdHJpbmc7XG4gIGFyZ3M6IGFueTtcbn0iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.flatMap = exports.deepRemoveUndefined = exports.dropIfEmpty = exports.makeComparator = void 0;\n/**\n * Turn a (multi-key) extraction function into a comparator for use in Array.sort()\n */\nfunction makeComparator(keyFn) {\n return (a, b) => {\n const keyA = keyFn(a);\n const keyB = keyFn(b);\n const len = Math.min(keyA.length, keyB.length);\n for (let i = 0; i < len; i++) {\n const c = compare(keyA[i], keyB[i]);\n if (c !== 0) {\n return c;\n }\n }\n // Arrays are the same up to the min length -- shorter array sorts first\n return keyA.length - keyB.length;\n };\n}\nexports.makeComparator = makeComparator;\nfunction compare(a, b) {\n if (a < b) {\n return -1;\n }\n if (b < a) {\n return 1;\n }\n return 0;\n}\nfunction dropIfEmpty(xs) {\n return xs.length > 0 ? xs : undefined;\n}\nexports.dropIfEmpty = dropIfEmpty;\nfunction deepRemoveUndefined(x) {\n if (typeof x === undefined || x === null) {\n return x;\n }\n if (Array.isArray(x)) {\n return x.map(deepRemoveUndefined);\n }\n if (typeof x === 'object') {\n for (const [key, value] of Object.entries(x)) {\n x[key] = deepRemoveUndefined(value);\n if (x[key] === undefined) {\n delete x[key];\n }\n }\n return x;\n }\n return x;\n}\nexports.deepRemoveUndefined = deepRemoveUndefined;\nfunction flatMap(xs, f) {\n const ret = new Array();\n for (const x of xs) {\n ret.push(...f(x));\n }\n return ret;\n}\nexports.flatMap = flatMap;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQU8sS0FBb0I7SUFDdkQsT0FBTyxDQUFDLENBQUksRUFBRSxDQUFJLEVBQUUsRUFBRTtRQUNwQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFBRSxPQUFPLENBQUMsQ0FBQzthQUFFO1NBQzNCO1FBRUQsd0VBQXdFO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ25DLENBQUMsQ0FBQztBQUNKLENBQUM7QUFkRCx3Q0FjQztBQUVELFNBQVMsT0FBTyxDQUFJLENBQUksRUFBRSxDQUFJO0lBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FBRTtJQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFBRSxPQUFPLENBQUMsQ0FBQztLQUFFO0lBQ3hCLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBSSxFQUFPO0lBQ3BDLE9BQU8sRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3hDLENBQUM7QUFGRCxrQ0FFQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLENBQU07SUFDeEMsSUFBSSxPQUFPLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQUU7SUFDdkQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0FBRTtJQUM1RCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUN6QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQUU7U0FDN0M7UUFDRCxPQUFPLENBQUMsQ0FBQztLQUNWO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBWEQsa0RBV0M7QUFFRCxTQUFnQixPQUFPLENBQU8sRUFBTyxFQUFFLENBQWdCO0lBQ3JELE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFLLENBQUM7SUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBTkQsMEJBTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR1cm4gYSAobXVsdGkta2V5KSBleHRyYWN0aW9uIGZ1bmN0aW9uIGludG8gYSBjb21wYXJhdG9yIGZvciB1c2UgaW4gQXJyYXkuc29ydCgpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ29tcGFyYXRvcjxULCBVPihrZXlGbjogKHg6IFQpID0+IFVbXSkge1xuICByZXR1cm4gKGE6IFQsIGI6IFQpID0+IHtcbiAgICBjb25zdCBrZXlBID0ga2V5Rm4oYSk7XG4gICAgY29uc3Qga2V5QiA9IGtleUZuKGIpO1xuICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGtleUEubGVuZ3RoLCBrZXlCLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gY29tcGFyZShrZXlBW2ldLCBrZXlCW2ldKTtcbiAgICAgIGlmIChjICE9PSAwKSB7IHJldHVybiBjOyB9XG4gICAgfVxuXG4gICAgLy8gQXJyYXlzIGFyZSB0aGUgc2FtZSB1cCB0byB0aGUgbWluIGxlbmd0aCAtLSBzaG9ydGVyIGFycmF5IHNvcnRzIGZpcnN0XG4gICAgcmV0dXJuIGtleUEubGVuZ3RoIC0ga2V5Qi5sZW5ndGg7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmU8VD4oYTogVCwgYjogVCkge1xuICBpZiAoYSA8IGIpIHsgcmV0dXJuIC0xOyB9XG4gIGlmIChiIDwgYSkgeyByZXR1cm4gMTsgfVxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyb3BJZkVtcHR5PFQ+KHhzOiBUW10pOiBUW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4geHMubGVuZ3RoID4gMCA/IHhzIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFJlbW92ZVVuZGVmaW5lZCh4OiBhbnkpOiBhbnkge1xuICBpZiAodHlwZW9mIHggPT09IHVuZGVmaW5lZCB8fCB4ID09PSBudWxsKSB7IHJldHVybiB4OyB9XG4gIGlmIChBcnJheS5pc0FycmF5KHgpKSB7IHJldHVybiB4Lm1hcChkZWVwUmVtb3ZlVW5kZWZpbmVkKTsgfVxuICBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoeCkpIHtcbiAgICAgIHhba2V5XSA9IGRlZXBSZW1vdmVVbmRlZmluZWQodmFsdWUpO1xuICAgICAgaWYgKHhba2V5XSA9PT0gdW5kZWZpbmVkKSB7IGRlbGV0ZSB4W2tleV07IH1cbiAgICB9XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0TWFwPFQsIFU+KHhzOiBUW10sIGY6ICh4OiBUKSA9PiBVW10pOiBVW10ge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8VT4oKTtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgcmV0LnB1c2goLi4uZih4KSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ==","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./types/database\"), exports);\n__exportStar(require(\"./types/resource\"), exports);\n__exportStar(require(\"./types/augmentations\"), exports);\n__exportStar(require(\"./types/metrics\"), exports);\n__exportStar(require(\"./types/diff\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFpQztBQUNqQyxtREFBaUM7QUFDakMsd0RBQXNDO0FBQ3RDLGtEQUFnQztBQUNoQywrQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3R5cGVzL2RhdGFiYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvcmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy9hdWdtZW50YXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvbWV0cmljcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL2RpZmYnO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVnbWVudGF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9hdWdtZW50YXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIFJlbGF0aW9uc2hpcCB9IGZyb20gJ0BjZGtsYWJzL3Rza2InO1xuaW1wb3J0IHsgUmVzb3VyY2UgfSBmcm9tICcuL3Jlc291cmNlJztcblxuLyoqXG4gKiBBdWdtZW50YXRpb25zIGZvciBhIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGVcbiAqXG4gKiBBdWdtZW50YXRpb25zIGFyZSBhIGRlcHJlY2F0ZWQgbWVjaGFuaXNtIGZvciBhdXRvbWF0aWNhbGx5IGdlbmVyYXRpbmcgbWV0cmljc1xuICogZnVuY3Rpb25zIGZvciBjZXJ0YWluIHJlc291cmNlcywgdXRpbGl6aW5nIFR5cGVTY3JpcHQgbWl4aW5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlQXVnbWVudGF0aW9uIGV4dGVuZHMgRW50aXR5IHtcbiAgLyoqXG4gICAqIE1ldHJpYyBhdWdtZW50YXRpb25zIGZvciB0aGlzIHJlc291cmNlIHR5cGVcbiAgICovXG4gIG1ldHJpY3M/OiBSZXNvdXJjZU1ldHJpY0F1Z21lbnRhdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIHRvIGJlIFwiYXVnbWVudGVkXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGtlYmFiIGNhc2VkIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIG5hbWUgKyAnLWJhc2UnXG4gICAqL1xuICBiYXNlQ2xhc3NGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgXCJhdWdtZW50ZWRcIi5cbiAgICpcbiAgICogQGRlZmF1bHQgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgbmFtZSArICdCYXNlJ1xuICAgKi9cbiAgYmFzZUNsYXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbnRlcmZhY2UgdG8gYmUgXCJhdWdtZW50ZWRcIi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzYW1lIGFzIGBgY2xhc3NGaWxlYGAuXG4gICAqL1xuICBpbnRlcmZhY2VGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRvIGJlIFwiYXVnbWVudGVkXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdJJyArIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIG5hbWVcbiAgICovXG4gIGludGVyZmFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgSXNBdWdtZW50ZWRSZXNvdXJjZSA9IFJlbGF0aW9uc2hpcDxSZXNvdXJjZSwgUmVzb3VyY2VBdWdtZW50YXRpb24+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlTWV0cmljQXVnbWVudGF0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIG9mIG1ldHJpY3MgZm9yIHRoaXMgc2VydmljZVxuICAgKi9cbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXNvdXJjZSBjbGFzcyB0aGF0IHByb3ZpZGUgdmFsdWVzIGZvciB0aGUgZGltZW5zaW9uc1xuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgYHsgUXVldWVOYW1lOiAncXVldWVOYW1lJyB9YCBzYXlzIHRoYXQgdGhlIG1ldHJpYyBoYXMgYSBgUXVldWVOYW1lYFxuICAgKiBkaW1lbnNpb24sIGZvciB3aGljaCB0aGUgdmFsdWUgY2FuIGJlIG9idGFpbmVkIGJ5IHJlYWRpbmcgYHRoaXMucXVldWVOYW1lYC5cbiAgICovXG4gIGRpbWVuc2lvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRyaWNzIGZvciB0aGlzIHJlc291cmNlXG4gICAqL1xuICBtZXRyaWNzOiBSZXNvdXJjZU1ldHJpY1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlTWV0cmljIHtcbiAgLyoqXG4gICAqIFVwcGVyY2FzZS1maXJzdCBtZXRyaWMgbmFtZVxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEb2N1bWVudGF0aW9uIGxpbmVcbiAgICovXG4gIGRvY3VtZW50YXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGlzIGFuIGV2ZW4gY291bnQgKDEgZ2V0cyBlbWl0dGVkIGV2ZXJ5IHRpbWUgc29tZXRoaW5nIG9jY3VycylcbiAgICpcbiAgICogQGRlZmF1bHQgTWV0cmljVHlwZS5BdHRyaWJcbiAgICovXG4gIHR5cGU/OiBNZXRyaWNUeXBlO1xufVxuXG5leHBvcnQgdHlwZSBNZXRyaWNUeXBlID1cbiAgLyoqXG4gICAqIFRoaXMgbWV0cmljIGlzIGVtaXR0ZWQgZm9yIGV2ZW50cywgbWVhc3VyaW5nIGEgYXR0cmlidXRlIG9mIHRoZSBldmVudC5cbiAgICpcbiAgICogVHlwaWNhbCBleGFtcGxlcyBvZiB0aGlzIHdvdWxkIGJlIGR1cmF0aW9uLCBvciByZXF1ZXN0IHNpemUsIG9yIHNpbWlsYXIuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGFnZ3JlZ2F0ZSBmb3IgdGhpcyB0eXBlIG9mIGV2ZW50IGlzIFwiQXZnXCIuXG4gICAqL1xuICB8ICdhdHRyaWInXG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0cmljIGlzIGVtaXR0ZWQgZm9yIGV2ZW50cywgYW5kIHRoZSB2YWx1ZSBpcyBhbHdheXMgYDFgLlxuICAgKlxuICAgKiBPbmx5IFwiU3VtXCIgaXMgYSBtZWFuaW5nZnVsIGFnZ3JlZ2F0ZSBvZiB0aGlzIHR5cGUgb2YgbWV0cmljOyBhbGwgb3RoZXJcbiAgICogYWdncmVnYXRpb25zIHdpbGwgb25seSBldmVyIHByb2R1Y2UgdGhlIHZhbHVlIGAxYC5cbiAgICovXG4gIHwgJ2NvdW50J1xuXG4gIC8qKlxuICAgKiBUaGlzIG1ldHJpYyBpcyBlbWl0dGVkIHBlcmlvZGljYWxseSwgcmVwcmVzZW50aW5nIGEgc3lzdGVtIHByb3BlcnR5LlxuICAgKlxuICAgKiBUaGUgbWV0cmljIG1lYXN1cmVzIHNvbWUgZ2xvYmFsIGV2ZXItY2hhbmdpbmcgcHJvcGVydHksIGFuZCBkb2VzIG5vdFxuICAgKiBtZWFzdXJlIGV2ZW50cy4gVGhlIG1vc3QgdXNlZnVsIGFnZ3JlZ2F0ZSBvZiB0aGlzIHR5cGUgb2YgbWV0cmljIGlzIFwiTWF4XCIuXG4gICAqL1xuICB8ICdnYXVnZSc7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RichSpecDatabase = exports.loadDatabase = exports.emptyDatabase = void 0;\nconst fs_1 = require(\"fs\");\nconst zlib_1 = require(\"zlib\");\nconst tskb_1 = require(\"@cdklabs/tskb\");\nfunction emptyDatabase() {\n return new tskb_1.Database({\n resource: (0, tskb_1.entityCollection)().index({\n cloudFormationType: (0, tskb_1.fieldIndex)('cloudFormationType', tskb_1.stringCmp),\n }),\n region: (0, tskb_1.entityCollection)().index({\n name: (0, tskb_1.fieldIndex)('name', tskb_1.stringCmp),\n }),\n service: (0, tskb_1.entityCollection)().index({\n name: (0, tskb_1.fieldIndex)('name', tskb_1.stringCmp),\n cloudFormationNamespace: (0, tskb_1.fieldIndex)('cloudFormationNamespace', tskb_1.stringCmp),\n }),\n typeDefinition: (0, tskb_1.entityCollection)(),\n augmentations: (0, tskb_1.entityCollection)(),\n metric: (0, tskb_1.entityCollection)().index({\n name: (0, tskb_1.fieldIndex)('name', tskb_1.stringCmp),\n namespace: (0, tskb_1.fieldIndex)('namespace', tskb_1.stringCmp),\n dedupKey: (0, tskb_1.fieldIndex)('dedupKey', tskb_1.stringCmp),\n }),\n dimensionSet: (0, tskb_1.entityCollection)().index({\n dedupKey: (0, tskb_1.fieldIndex)('dedupKey', tskb_1.stringCmp),\n }),\n }, (r) => ({\n hasResource: r.relationship('service', 'resource'),\n regionHasResource: r.relationship('region', 'resource'),\n regionHasService: r.relationship('region', 'service'),\n usesType: r.relationship('resource', 'typeDefinition'),\n isAugmented: r.relationship('resource', 'augmentations'),\n usesDimensionSet: r.relationship('metric', 'dimensionSet'),\n resourceHasMetric: r.relationship('resource', 'metric'),\n serviceHasMetric: r.relationship('service', 'metric'),\n resourceHasDimensionSet: r.relationship('resource', 'dimensionSet'),\n serviceHasDimensionSet: r.relationship('service', 'dimensionSet'),\n }));\n}\nexports.emptyDatabase = emptyDatabase;\nasync function loadDatabase(pathToDb) {\n const db = emptyDatabase();\n const contents = await fs_1.promises.readFile(pathToDb);\n const json = pathToDb.endsWith('.gz') ? (0, zlib_1.gunzipSync)(contents).toString('utf-8') : contents.toString('utf-8');\n db.load(JSON.parse(json));\n return db;\n}\nexports.loadDatabase = loadDatabase;\n/**\n * Helpers for working with a SpecDatabase\n */\nclass RichSpecDatabase {\n constructor(db) {\n this.db = db;\n }\n /**\n * Find all resources of a given type\n */\n resourceByType(cfnType, operation = 'resourceByType') {\n const res = this.db.lookup('resource', 'cloudFormationType', 'equals', cfnType);\n if (res.length === 0) {\n throw new Error(`${operation}: no such resource: ${cfnType}`);\n }\n return res[0];\n }\n /**\n * All type definitions used by a certain resource\n */\n resourceTypeDefs(cfnType) {\n const resource = this.db.lookup('resource', 'cloudFormationType', 'equals', cfnType).only();\n return this.db.follow('usesType', resource).map((x) => x.entity);\n }\n /**\n * Find a type definition from a given property type\n */\n tryFindDef(type) {\n return type.type === 'ref' ? this.db.get('typeDefinition', type.reference.$ref) : undefined;\n }\n}\nexports.RichSpecDatabase = RichSpecDatabase;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQW9DO0FBQ3BDLCtCQUFrQztBQUNsQyx3Q0FBa0Y7QUF1QmxGLFNBQWdCLGFBQWE7SUFDM0IsT0FBTyxJQUFJLGVBQVEsQ0FDakI7UUFDRSxRQUFRLEVBQUUsSUFBQSx1QkFBZ0IsR0FBWSxDQUFDLEtBQUssQ0FBQztZQUMzQyxrQkFBa0IsRUFBRSxJQUFBLGlCQUFVLEVBQUMsb0JBQW9CLEVBQUUsZ0JBQVMsQ0FBQztTQUNoRSxDQUFDO1FBQ0YsTUFBTSxFQUFFLElBQUEsdUJBQWdCLEdBQVUsQ0FBQyxLQUFLLENBQUM7WUFDdkMsSUFBSSxFQUFFLElBQUEsaUJBQVUsRUFBQyxNQUFNLEVBQUUsZ0JBQVMsQ0FBQztTQUNwQyxDQUFDO1FBQ0YsT0FBTyxFQUFFLElBQUEsdUJBQWdCLEdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDekMsSUFBSSxFQUFFLElBQUEsaUJBQVUsRUFBQyxNQUFNLEVBQUUsZ0JBQVMsQ0FBQztZQUNuQyx1QkFBdUIsRUFBRSxJQUFBLGlCQUFVLEVBQUMseUJBQXlCLEVBQUUsZ0JBQVMsQ0FBQztTQUMxRSxDQUFDO1FBQ0YsY0FBYyxFQUFFLElBQUEsdUJBQWdCLEdBQWtCO1FBQ2xELGFBQWEsRUFBRSxJQUFBLHVCQUFnQixHQUF3QjtRQUN2RCxNQUFNLEVBQUUsSUFBQSx1QkFBZ0IsR0FBVSxDQUFDLEtBQUssQ0FBQztZQUN2QyxJQUFJLEVBQUUsSUFBQSxpQkFBVSxFQUFDLE1BQU0sRUFBRSxnQkFBUyxDQUFDO1lBQ25DLFNBQVMsRUFBRSxJQUFBLGlCQUFVLEVBQUMsV0FBVyxFQUFFLGdCQUFTLENBQUM7WUFDN0MsUUFBUSxFQUFFLElBQUEsaUJBQVUsRUFBQyxVQUFVLEVBQUUsZ0JBQVMsQ0FBQztTQUM1QyxDQUFDO1FBQ0YsWUFBWSxFQUFFLElBQUEsdUJBQWdCLEdBQWdCLENBQUMsS0FBSyxDQUFDO1lBQ25ELFFBQVEsRUFBRSxJQUFBLGlCQUFVLEVBQUMsVUFBVSxFQUFFLGdCQUFTLENBQUM7U0FDNUMsQ0FBQztLQUNILEVBQ0QsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDTixXQUFXLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBYyxTQUFTLEVBQUUsVUFBVSxDQUFDO1FBQy9ELGlCQUFpQixFQUFFLENBQUMsQ0FBQyxZQUFZLENBQW9CLFFBQVEsRUFBRSxVQUFVLENBQUM7UUFDMUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBbUIsUUFBUSxFQUFFLFNBQVMsQ0FBQztRQUN2RSxRQUFRLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBVyxVQUFVLEVBQUUsZ0JBQWdCLENBQUM7UUFDaEUsV0FBVyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQXNCLFVBQVUsRUFBRSxlQUFlLENBQUM7UUFDN0UsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBbUIsUUFBUSxFQUFFLGNBQWMsQ0FBQztRQUM1RSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFvQixVQUFVLEVBQUUsUUFBUSxDQUFDO1FBQzFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxZQUFZLENBQW1CLFNBQVMsRUFBRSxRQUFRLENBQUM7UUFDdkUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBMEIsVUFBVSxFQUFFLGNBQWMsQ0FBQztRQUM1RixzQkFBc0IsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUF5QixTQUFTLEVBQUUsY0FBYyxDQUFDO0tBQzFGLENBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQztBQXJDRCxzQ0FxQ0M7QUFFTSxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCO0lBQ2pELE1BQU0sRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQzNCLE1BQU0sUUFBUSxHQUFHLE1BQU0sYUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGlCQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQU5ELG9DQU1DO0FBSUQ7O0dBRUc7QUFDSCxNQUFhLGdCQUFnQjtJQUMzQixZQUE2QixFQUFnQjtRQUFoQixPQUFFLEdBQUYsRUFBRSxDQUFjO0lBQUcsQ0FBQztJQUVqRDs7T0FFRztJQUNJLGNBQWMsQ0FBQyxPQUFlLEVBQUUsU0FBUyxHQUFHLGdCQUFnQjtRQUNqRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hGLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFNBQVMsdUJBQXVCLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDL0Q7UUFDRCxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBQyxPQUFlO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUYsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVSxDQUFDLElBQWtCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RixDQUFDO0NBQ0Y7QUE1QkQsNENBNEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBndW56aXBTeW5jIH0gZnJvbSAnemxpYic7XG5pbXBvcnQgeyBEYXRhYmFzZSwgZW50aXR5Q29sbGVjdGlvbiwgZmllbGRJbmRleCwgc3RyaW5nQ21wIH0gZnJvbSAnQGNka2xhYnMvdHNrYic7XG5pbXBvcnQgeyBJc0F1Z21lbnRlZFJlc291cmNlLCBSZXNvdXJjZUF1Z21lbnRhdGlvbiB9IGZyb20gJy4vYXVnbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBEaW1lbnNpb25TZXQsXG4gIE1ldHJpYyxcbiAgUmVzb3VyY2VIYXNEaW1lbnNpb25TZXQsXG4gIFNlcnZpY2VIYXNEaW1lbnNpb25TZXQsXG4gIFVzZXNEaW1lbnNpb25TZXQsXG4gIFJlc291cmNlSGFzTWV0cmljLFxuICBTZXJ2aWNlSGFzTWV0cmljLFxufSBmcm9tICcuL21ldHJpY3MnO1xuaW1wb3J0IHtcbiAgUmVzb3VyY2UsXG4gIFNlcnZpY2UsXG4gIFR5cGVEZWZpbml0aW9uLFxuICBQcm9wZXJ0eVR5cGUsXG4gIFJlZ2lvbixcbiAgSGFzUmVzb3VyY2UsXG4gIFJlZ2lvbkhhc1Jlc291cmNlLFxuICBSZWdpb25IYXNTZXJ2aWNlLFxuICBVc2VzVHlwZSxcbn0gZnJvbSAnLi9yZXNvdXJjZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbXB0eURhdGFiYXNlKCkge1xuICByZXR1cm4gbmV3IERhdGFiYXNlKFxuICAgIHtcbiAgICAgIHJlc291cmNlOiBlbnRpdHlDb2xsZWN0aW9uPFJlc291cmNlPigpLmluZGV4KHtcbiAgICAgICAgY2xvdWRGb3JtYXRpb25UeXBlOiBmaWVsZEluZGV4KCdjbG91ZEZvcm1hdGlvblR5cGUnLCBzdHJpbmdDbXApLFxuICAgICAgfSksXG4gICAgICByZWdpb246IGVudGl0eUNvbGxlY3Rpb248UmVnaW9uPigpLmluZGV4KHtcbiAgICAgICAgbmFtZTogZmllbGRJbmRleCgnbmFtZScsIHN0cmluZ0NtcCksXG4gICAgICB9KSxcbiAgICAgIHNlcnZpY2U6IGVudGl0eUNvbGxlY3Rpb248U2VydmljZT4oKS5pbmRleCh7XG4gICAgICAgIG5hbWU6IGZpZWxkSW5kZXgoJ25hbWUnLCBzdHJpbmdDbXApLFxuICAgICAgICBjbG91ZEZvcm1hdGlvbk5hbWVzcGFjZTogZmllbGRJbmRleCgnY2xvdWRGb3JtYXRpb25OYW1lc3BhY2UnLCBzdHJpbmdDbXApLFxuICAgICAgfSksXG4gICAgICB0eXBlRGVmaW5pdGlvbjogZW50aXR5Q29sbGVjdGlvbjxUeXBlRGVmaW5pdGlvbj4oKSxcbiAgICAgIGF1Z21lbnRhdGlvbnM6IGVudGl0eUNvbGxlY3Rpb248UmVzb3VyY2VBdWdtZW50YXRpb24+KCksXG4gICAgICBtZXRyaWM6IGVudGl0eUNvbGxlY3Rpb248TWV0cmljPigpLmluZGV4KHtcbiAgICAgICAgbmFtZTogZmllbGRJbmRleCgnbmFtZScsIHN0cmluZ0NtcCksXG4gICAgICAgIG5hbWVzcGFjZTogZmllbGRJbmRleCgnbmFtZXNwYWNlJywgc3RyaW5nQ21wKSxcbiAgICAgICAgZGVkdXBLZXk6IGZpZWxkSW5kZXgoJ2RlZHVwS2V5Jywgc3RyaW5nQ21wKSxcbiAgICAgIH0pLFxuICAgICAgZGltZW5zaW9uU2V0OiBlbnRpdHlDb2xsZWN0aW9uPERpbWVuc2lvblNldD4oKS5pbmRleCh7XG4gICAgICAgIGRlZHVwS2V5OiBmaWVsZEluZGV4KCdkZWR1cEtleScsIHN0cmluZ0NtcCksXG4gICAgICB9KSxcbiAgICB9LFxuICAgIChyKSA9PiAoe1xuICAgICAgaGFzUmVzb3VyY2U6IHIucmVsYXRpb25zaGlwPEhhc1Jlc291cmNlPignc2VydmljZScsICdyZXNvdXJjZScpLFxuICAgICAgcmVnaW9uSGFzUmVzb3VyY2U6IHIucmVsYXRpb25zaGlwPFJlZ2lvbkhhc1Jlc291cmNlPigncmVnaW9uJywgJ3Jlc291cmNlJyksXG4gICAgICByZWdpb25IYXNTZXJ2aWNlOiByLnJlbGF0aW9uc2hpcDxSZWdpb25IYXNTZXJ2aWNlPigncmVnaW9uJywgJ3NlcnZpY2UnKSxcbiAgICAgIHVzZXNUeXBlOiByLnJlbGF0aW9uc2hpcDxVc2VzVHlwZT4oJ3Jlc291cmNlJywgJ3R5cGVEZWZpbml0aW9uJyksXG4gICAgICBpc0F1Z21lbnRlZDogci5yZWxhdGlvbnNoaXA8SXNBdWdtZW50ZWRSZXNvdXJjZT4oJ3Jlc291cmNlJywgJ2F1Z21lbnRhdGlvbnMnKSxcbiAgICAgIHVzZXNEaW1lbnNpb25TZXQ6IHIucmVsYXRpb25zaGlwPFVzZXNEaW1lbnNpb25TZXQ+KCdtZXRyaWMnLCAnZGltZW5zaW9uU2V0JyksXG4gICAgICByZXNvdXJjZUhhc01ldHJpYzogci5yZWxhdGlvbnNoaXA8UmVzb3VyY2VIYXNNZXRyaWM+KCdyZXNvdXJjZScsICdtZXRyaWMnKSxcbiAgICAgIHNlcnZpY2VIYXNNZXRyaWM6IHIucmVsYXRpb25zaGlwPFNlcnZpY2VIYXNNZXRyaWM+KCdzZXJ2aWNlJywgJ21ldHJpYycpLFxuICAgICAgcmVzb3VyY2VIYXNEaW1lbnNpb25TZXQ6IHIucmVsYXRpb25zaGlwPFJlc291cmNlSGFzRGltZW5zaW9uU2V0PigncmVzb3VyY2UnLCAnZGltZW5zaW9uU2V0JyksXG4gICAgICBzZXJ2aWNlSGFzRGltZW5zaW9uU2V0OiByLnJlbGF0aW9uc2hpcDxTZXJ2aWNlSGFzRGltZW5zaW9uU2V0Pignc2VydmljZScsICdkaW1lbnNpb25TZXQnKSxcbiAgICB9KSxcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWREYXRhYmFzZShwYXRoVG9EYjogc3RyaW5nKSB7XG4gIGNvbnN0IGRiID0gZW1wdHlEYXRhYmFzZSgpO1xuICBjb25zdCBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGhUb0RiKTtcbiAgY29uc3QganNvbiA9IHBhdGhUb0RiLmVuZHNXaXRoKCcuZ3onKSA/IGd1bnppcFN5bmMoY29udGVudHMpLnRvU3RyaW5nKCd1dGYtOCcpIDogY29udGVudHMudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIGRiLmxvYWQoSlNPTi5wYXJzZShqc29uKSk7XG4gIHJldHVybiBkYjtcbn1cblxuZXhwb3J0IHR5cGUgU3BlY0RhdGFiYXNlID0gUmV0dXJuVHlwZTx0eXBlb2YgZW1wdHlEYXRhYmFzZT47XG5cbi8qKlxuICogSGVscGVycyBmb3Igd29ya2luZyB3aXRoIGEgU3BlY0RhdGFiYXNlXG4gKi9cbmV4cG9ydCBjbGFzcyBSaWNoU3BlY0RhdGFiYXNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkYjogU3BlY0RhdGFiYXNlKSB7fVxuXG4gIC8qKlxuICAgKiBGaW5kIGFsbCByZXNvdXJjZXMgb2YgYSBnaXZlbiB0eXBlXG4gICAqL1xuICBwdWJsaWMgcmVzb3VyY2VCeVR5cGUoY2ZuVHlwZTogc3RyaW5nLCBvcGVyYXRpb24gPSAncmVzb3VyY2VCeVR5cGUnKTogUmVzb3VyY2Uge1xuICAgIGNvbnN0IHJlcyA9IHRoaXMuZGIubG9va3VwKCdyZXNvdXJjZScsICdjbG91ZEZvcm1hdGlvblR5cGUnLCAnZXF1YWxzJywgY2ZuVHlwZSk7XG4gICAgaWYgKHJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvcGVyYXRpb259OiBubyBzdWNoIHJlc291cmNlOiAke2NmblR5cGV9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXNbMF07XG4gIH1cblxuICAvKipcbiAgICogQWxsIHR5cGUgZGVmaW5pdGlvbnMgdXNlZCBieSBhIGNlcnRhaW4gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyByZXNvdXJjZVR5cGVEZWZzKGNmblR5cGU6IHN0cmluZyk6IHJlYWRvbmx5IFR5cGVEZWZpbml0aW9uW10ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5kYi5sb29rdXAoJ3Jlc291cmNlJywgJ2Nsb3VkRm9ybWF0aW9uVHlwZScsICdlcXVhbHMnLCBjZm5UeXBlKS5vbmx5KCk7XG4gICAgcmV0dXJuIHRoaXMuZGIuZm9sbG93KCd1c2VzVHlwZScsIHJlc291cmNlKS5tYXAoKHgpID0+IHguZW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgdHlwZSBkZWZpbml0aW9uIGZyb20gYSBnaXZlbiBwcm9wZXJ0eSB0eXBlXG4gICAqL1xuICBwdWJsaWMgdHJ5RmluZERlZih0eXBlOiBQcm9wZXJ0eVR5cGUpOiBUeXBlRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHR5cGUudHlwZSA9PT0gJ3JlZicgPyB0aGlzLmRiLmdldCgndHlwZURlZmluaXRpb24nLCB0eXBlLnJlZmVyZW5jZS4kcmVmKSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9kaWZmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdHRyaWJ1dGUsIFByb3BlcnR5LCBSZXNvdXJjZSwgU2VydmljZSwgVHlwZURlZmluaXRpb24gfSBmcm9tICcuL3Jlc291cmNlJztcblxuZXhwb3J0IGludGVyZmFjZSBTcGVjRGF0YWJhc2VEaWZmIHtcbiAgc2VydmljZXM6IE1hcERpZmY8U2VydmljZSwgVXBkYXRlZFNlcnZpY2U+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3REaWZmPEUsIEVEPiB7XG4gIHJlYWRvbmx5IGFkZGVkPzogRVtdO1xuICByZWFkb25seSByZW1vdmVkPzogRVtdO1xuICByZWFkb25seSB1cGRhdGVkPzogRURbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXBEaWZmPEUsIEVEPiB7XG4gIHJlYWRvbmx5IGFkZGVkPzogUmVjb3JkPHN0cmluZywgRT47XG4gIHJlYWRvbmx5IHJlbW92ZWQ/OiBSZWNvcmQ8c3RyaW5nLCBFPjtcbiAgcmVhZG9ubHkgdXBkYXRlZD86IFJlY29yZDxzdHJpbmcsIEVEPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVkU2VydmljZSB7XG4gIHJlYWRvbmx5IG5hbWU/OiBTY2FsYXJEaWZmPFNlcnZpY2VbJ25hbWUnXT47XG4gIHJlYWRvbmx5IHNob3J0TmFtZT86IFNjYWxhckRpZmY8U2VydmljZVsnc2hvcnROYW1lJ10+O1xuICByZWFkb25seSBjYXBpdGFsaXplZD86IFNjYWxhckRpZmY8U2VydmljZVsnY2FwaXRhbGl6ZWQnXT47XG4gIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uTmFtZXNwYWNlPzogU2NhbGFyRGlmZjxTZXJ2aWNlWydjbG91ZEZvcm1hdGlvbk5hbWVzcGFjZSddPjtcbiAgcmVhZG9ubHkgcmVzb3VyY2VEaWZmPzogTWFwRGlmZjxSZXNvdXJjZSwgVXBkYXRlZFJlc291cmNlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVkUmVzb3VyY2Uge1xuICByZWFkb25seSBuYW1lPzogU2NhbGFyRGlmZjxzdHJpbmc+O1xuICByZWFkb25seSBjbG91ZEZvcm1hdGlvblR5cGU/OiBTY2FsYXJEaWZmPHN0cmluZz47XG4gIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uVHJhbnNmb3JtPzogU2NhbGFyRGlmZjxzdHJpbmc+O1xuICByZWFkb25seSBkb2N1bWVudGF0aW9uPzogU2NhbGFyRGlmZjxzdHJpbmc+O1xuICByZWFkb25seSBwcm9wZXJ0aWVzPzogTWFwRGlmZjxQcm9wZXJ0eSwgVXBkYXRlZFByb3BlcnR5PjtcbiAgcmVhZG9ubHkgYXR0cmlidXRlcz86IE1hcERpZmY8QXR0cmlidXRlLCBVcGRhdGVkQXR0cmlidXRlPjtcbiAgcmVhZG9ubHkgaWRlbnRpZmllcj86IFNjYWxhckRpZmY8UmVzb3VyY2VbJ2lkZW50aWZpZXInXT47XG4gIHJlYWRvbmx5IGlzU3RhdGVmdWw/OiBTY2FsYXJEaWZmPGJvb2xlYW4+O1xuICByZWFkb25seSB0YWdJbmZvcm1hdGlvbj86IFNjYWxhckRpZmY8UmVzb3VyY2VbJ3RhZ0luZm9ybWF0aW9uJ10+O1xuICByZWFkb25seSBzY3J1dGluaXphYmxlPzogU2NhbGFyRGlmZjxSZXNvdXJjZVsnc2NydXRpbml6YWJsZSddPjtcbiAgcmVhZG9ubHkgdHlwZURlZmluaXRpb25EaWZmPzogTWFwRGlmZjxUeXBlRGVmaW5pdGlvbiwgVXBkYXRlZFR5cGVEZWZpbml0aW9uPjtcbiAgcmVhZG9ubHkgcHJpbWFyeUlkZW50aWZpZXI/OiBMaXN0RGlmZjxzdHJpbmcsIHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZWRQcm9wZXJ0eSB7XG4gIHJlYWRvbmx5IG9sZDogUHJvcGVydHk7XG4gIHJlYWRvbmx5IG5ldzogUHJvcGVydHk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlZEF0dHJpYnV0ZSB7XG4gIHJlYWRvbmx5IG9sZDogQXR0cmlidXRlO1xuICByZWFkb25seSBuZXc6IEF0dHJpYnV0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVkVHlwZURlZmluaXRpb24ge1xuICByZWFkb25seSBuYW1lPzogU2NhbGFyRGlmZjxzdHJpbmc+O1xuICByZWFkb25seSBkb2N1bWVudGF0aW9uPzogU2NhbGFyRGlmZjxzdHJpbmc+O1xuICByZWFkb25seSBwcm9wZXJ0aWVzPzogTWFwRGlmZjxQcm9wZXJ0eSwgVXBkYXRlZFByb3BlcnR5PjtcbiAgcmVhZG9ubHkgbXVzdFJlbmRlckZvckJ3Q29tcGF0PzogU2NhbGFyRGlmZjxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2FsYXJEaWZmPEE+IHtcbiAgcmVhZG9ubHkgb2xkPzogQTtcbiAgcmVhZG9ubHkgbmV3PzogQTtcbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIFJlbGF0aW9uc2hpcCB9IGZyb20gJ0BjZGtsYWJzL3Rza2InO1xuaW1wb3J0IHsgUmVzb3VyY2UsIFNlcnZpY2UgfSBmcm9tICcuL3Jlc291cmNlJztcblxuLyoqXG4gKiBBIE1ldHJpYyBEaW1lbnNpb24gKG5vdCBhbiBlbnRpdHkpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9uIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGRpbWVuc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogQSBwb3RlbnRpYWwgdmFsdWUgZm9yIHRoaXMgZGltZW5zaW9uXG4gICAqL1xuICByZWFkb25seSB2YWx1ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNldCBvZiBNZXRyaWMgRGltZW5zaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9uU2V0IGV4dGVuZHMgRW50aXR5IHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIHZhbHVlIHVzZWQgdG8gZGVkdXBsaWNhdGUgdGhlIGVudGl0eVxuICAgKi9cbiAgZGVkdXBLZXk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkaW1lbnNpb25zIGluIHRoaXMgc2V0XG4gICAqL1xuICBkaW1lbnNpb25zOiBEaW1lbnNpb25bXTtcbn1cbmV4cG9ydCB0eXBlIFJlc291cmNlSGFzRGltZW5zaW9uU2V0ID0gUmVsYXRpb25zaGlwPFJlc291cmNlLCBEaW1lbnNpb25TZXQ+O1xuZXhwb3J0IHR5cGUgU2VydmljZUhhc0RpbWVuc2lvblNldCA9IFJlbGF0aW9uc2hpcDxTZXJ2aWNlLCBEaW1lbnNpb25TZXQ+O1xuXG4vKipcbiAqIEEgQ2xvdWRXYXRjaCBNZXRyaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWMgZXh0ZW5kcyBFbnRpdHkge1xuICAvKipcbiAgICogTWV0cmljIG5hbWVzcGFjZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBtZXRyaWNcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIERlZmF1bHQgKHN1Z2dlc3RlZCkgc3RhdGlzdGljIGZvciB0aGlzIG1ldHJpY1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGlzdGljOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSB2YWx1ZSB1c2VkIHRvIGRlZHVwbGljYXRlIHRoZSBlbnRpdHlcbiAgICovXG4gIHJlYWRvbmx5IGRlZHVwS2V5OiBzdHJpbmc7XG59XG5leHBvcnQgdHlwZSBVc2VzRGltZW5zaW9uU2V0ID0gUmVsYXRpb25zaGlwPE1ldHJpYywgRGltZW5zaW9uU2V0PjtcbmV4cG9ydCB0eXBlIFJlc291cmNlSGFzTWV0cmljID0gUmVsYXRpb25zaGlwPFJlc291cmNlLCBNZXRyaWM+O1xuZXhwb3J0IHR5cGUgU2VydmljZUhhc01ldHJpYyA9IFJlbGF0aW9uc2hpcDxTZXJ2aWNlLCBNZXRyaWM+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RichPropertyType = exports.PropertyScrutinyType = exports.ResourceScrutinyType = exports.isCollectionType = exports.Deprecation = exports.RichAttribute = exports.RichProperty = exports.RichTypedField = void 0;\nconst sorting_1 = require(\"../util/sorting\");\nclass RichTypedField {\n constructor(field) {\n this.field = field;\n if (field === undefined) {\n throw new Error('Field is undefined');\n }\n }\n types() {\n var _a;\n return [...((_a = this.field.previousTypes) !== null && _a !== void 0 ? _a : []), this.field.type];\n }\n /**\n * Update the type of this property with a new type\n *\n * Only if it's not in the set of types already.\n */\n updateType(type) {\n const richType = new RichPropertyType(type);\n // Only add this type if we don't already have it. We are only doing comparisons where 'integer' and 'number'\n // are treated the same, for all other types we need strict equality. We used to use 'assignableTo' as a\n // condition, but these types will be rendered in both co- and contravariant positions, and so we really can't\n // do much better than full equality.\n if (this.types().some((t) => richType.equals(t))) {\n // Nothing to do, type is already in there.\n return false;\n }\n // Special case: if the new type is `string` and the old type is `date-time`, we assume this is\n // the same type but we dropped some formatting information. No need to make this a separate type.\n if (type.type === 'string' && this.types().some((t) => t.type === 'date-time')) {\n return false;\n }\n if (!this.field.previousTypes) {\n this.field.previousTypes = [];\n }\n this.field.previousTypes.push(this.field.type);\n this.field.type = type;\n return true;\n }\n}\nexports.RichTypedField = RichTypedField;\nclass RichProperty extends RichTypedField {\n constructor(property) {\n super(property);\n }\n}\nexports.RichProperty = RichProperty;\nclass RichAttribute extends RichTypedField {\n constructor(attr) {\n super(attr);\n }\n}\nexports.RichAttribute = RichAttribute;\nvar Deprecation;\n(function (Deprecation) {\n /**\n * Not deprecated\n */\n Deprecation[\"NONE\"] = \"NONE\";\n /**\n * Warn about use\n */\n Deprecation[\"WARN\"] = \"WARN\";\n /**\n * Do not emit the value at all\n *\n * (Handle properties that were incorrectly added to the spec)\n */\n Deprecation[\"IGNORE\"] = \"IGNORE\";\n})(Deprecation = exports.Deprecation || (exports.Deprecation = {}));\nfunction isCollectionType(x) {\n return x.type === 'array' || x.type === 'map';\n}\nexports.isCollectionType = isCollectionType;\n/**\n * Mark a resource as a resource that needs additional scrutiy when added, removed or changed\n *\n * Used to mark resources that represent security policies.\n */\nvar ResourceScrutinyType;\n(function (ResourceScrutinyType) {\n /**\n * No additional scrutiny\n */\n ResourceScrutinyType[\"None\"] = \"None\";\n /**\n * An externally attached policy document to a resource\n *\n * (Common for SQS, SNS, S3, ...)\n */\n ResourceScrutinyType[\"ResourcePolicyResource\"] = \"ResourcePolicyResource\";\n /**\n * This is an IAM policy on an identity resource\n *\n * (Basically saying: this is AWS::IAM::Policy)\n */\n ResourceScrutinyType[\"IdentityPolicyResource\"] = \"IdentityPolicyResource\";\n /**\n * This is a Lambda Permission policy\n */\n ResourceScrutinyType[\"LambdaPermission\"] = \"LambdaPermission\";\n /**\n * An ingress rule object\n */\n ResourceScrutinyType[\"IngressRuleResource\"] = \"IngressRuleResource\";\n /**\n * A set of egress rules\n */\n ResourceScrutinyType[\"EgressRuleResource\"] = \"EgressRuleResource\";\n})(ResourceScrutinyType = exports.ResourceScrutinyType || (exports.ResourceScrutinyType = {}));\n/**\n * Mark a property as a property that needs additional scrutiny when it changes\n *\n * Used to mark sensitive properties that have security-related implications.\n */\nvar PropertyScrutinyType;\n(function (PropertyScrutinyType) {\n /**\n * No additional scrutiny\n */\n PropertyScrutinyType[\"None\"] = \"None\";\n /**\n * This is an IAM policy directly on a resource\n */\n PropertyScrutinyType[\"InlineResourcePolicy\"] = \"InlineResourcePolicy\";\n /**\n * Either an AssumeRolePolicyDocument or a dictionary of policy documents\n */\n PropertyScrutinyType[\"InlineIdentityPolicies\"] = \"InlineIdentityPolicies\";\n /**\n * A list of managed policies (on an identity resource)\n */\n PropertyScrutinyType[\"ManagedPolicies\"] = \"ManagedPolicies\";\n /**\n * A set of ingress rules (on a security group)\n */\n PropertyScrutinyType[\"IngressRules\"] = \"IngressRules\";\n /**\n * A set of egress rules (on a security group)\n */\n PropertyScrutinyType[\"EgressRules\"] = \"EgressRules\";\n})(PropertyScrutinyType = exports.PropertyScrutinyType || (exports.PropertyScrutinyType = {}));\nclass RichPropertyType {\n constructor(type) {\n this.type = type;\n }\n equals(rhs) {\n switch (this.type.type) {\n case 'integer':\n case 'boolean':\n case 'date-time':\n case 'json':\n case 'null':\n case 'number':\n case 'string':\n case 'tag':\n return rhs.type === this.type.type;\n case 'array':\n case 'map':\n return rhs.type === this.type.type && new RichPropertyType(this.type.element).equals(rhs.element);\n case 'ref':\n return rhs.type === 'ref' && this.type.reference.$ref === rhs.reference.$ref;\n case 'union':\n const lhsKey = this.sortKey();\n const rhsKey = new RichPropertyType(rhs).sortKey();\n return lhsKey.length === rhsKey.length && lhsKey.every((l, i) => l === rhsKey[i]);\n }\n }\n /**\n * Whether the current type is JavaScript-equal to the RHS type\n *\n * Same as normal equality, but consider `integer` and `number` the same types.\n */\n javascriptEquals(rhs) {\n switch (this.type.type) {\n case 'number':\n case 'integer':\n // Widening\n return rhs.type === 'integer' || rhs.type === 'number';\n case 'array':\n case 'map':\n return rhs.type === this.type.type && new RichPropertyType(this.type.element).javascriptEquals(rhs.element);\n case 'union':\n if (rhs.type !== 'union') {\n return false;\n }\n // Every type in this union needs to be equal one type in RHS\n return this.type.types.every((t1) => rhs.types.some((t2) => new RichPropertyType(t1).javascriptEquals(t2)));\n default:\n // For anything else, need strict equality\n return this.equals(rhs);\n }\n }\n /**\n * Whether the current type is assignable to the RHS type.\n *\n * This is means every type member of the LHS must be present in the RHS type\n */\n assignableTo(rhs) {\n const extractMembers = (type) => (type.type == 'union' ? type.types : [type]);\n const asRichType = (type) => new RichPropertyType(type);\n const rhsMembers = extractMembers(rhs);\n for (const lhsMember of extractMembers(this.type).map(asRichType)) {\n if (!rhsMembers.some((type) => lhsMember.equals(type))) {\n return false;\n }\n }\n return true;\n }\n /**\n * Return a version of this type, but with all type unions in a regularized order\n */\n normalize(db) {\n switch (this.type.type) {\n case 'array':\n case 'map':\n return new RichPropertyType({\n type: this.type.type,\n element: new RichPropertyType(this.type.element).normalize(db).type,\n });\n case 'union':\n const types = this.type.types\n .map((t) => new RichPropertyType(t).normalize(db))\n .map((t) => [t, t.sortKey(db)]);\n types.sort((0, sorting_1.sortKeyComparator)(([_, sortKey]) => sortKey));\n return new RichPropertyType({\n type: 'union',\n types: types.map(([t, _]) => t.type),\n });\n default:\n return this;\n }\n }\n stringify(db, withId = true) {\n switch (this.type.type) {\n case 'integer':\n case 'boolean':\n case 'date-time':\n case 'json':\n case 'null':\n case 'number':\n case 'string':\n case 'tag':\n return this.type.type;\n case 'array':\n return `Array<${new RichPropertyType(this.type.element).stringify(db, withId)}>`;\n case 'map':\n return `Map`;\n case 'ref':\n const type = db.get('typeDefinition', this.type.reference);\n return withId ? `${type.name}(${this.type.reference.$ref})` : type.name;\n case 'union':\n return this.type.types.map((t) => new RichPropertyType(t).stringify(db, withId)).join(' | ');\n }\n }\n /**\n * Return a sortable key based on this type\n *\n * If a database is given, type definitions will be sorted based on type name,\n * otherwise on identifier\n */\n sortKey(db) {\n var _a, _b;\n switch (this.type.type) {\n case 'integer':\n case 'boolean':\n case 'date-time':\n case 'json':\n case 'null':\n case 'number':\n case 'string':\n case 'tag':\n return ['0', this.type.type];\n case 'array':\n case 'map':\n return ['1', this.type.type, ...new RichPropertyType(this.type.element).sortKey(db)];\n case 'ref':\n return ['2', this.type.type, (_b = (_a = db === null || db === void 0 ? void 0 : db.get('typeDefinition', this.type.reference)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : this.type.reference.$ref];\n case 'union':\n const typeKeys = this.type.types.map((t) => new RichPropertyType(t).sortKey(db));\n typeKeys.sort((0, sorting_1.sortKeyComparator)((x) => x));\n return ['3', this.type.type, ...typeKeys.flatMap((x) => x)];\n }\n }\n}\nexports.RichPropertyType = RichPropertyType;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsNkNBQW9EO0FBdUtwRCxNQUFhLGNBQWM7SUFDekIsWUFBNkIsS0FBK0M7UUFBL0MsVUFBSyxHQUFMLEtBQUssQ0FBMEM7UUFDMUUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUN2QztJQUNILENBQUM7SUFFTSxLQUFLOztRQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsbUNBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFVBQVUsQ0FBQyxJQUFrQjtRQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVDLDZHQUE2RztRQUM3Ryx3R0FBd0c7UUFDeEcsOEdBQThHO1FBQzlHLHFDQUFxQztRQUNyQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNoRCwyQ0FBMkM7WUFDM0MsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELCtGQUErRjtRQUMvRixrR0FBa0c7UUFDbEcsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxFQUFFO1lBQzlFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBekNELHdDQXlDQztBQUVELE1BQWEsWUFBYSxTQUFRLGNBQWM7SUFDOUMsWUFBWSxRQUFrQjtRQUM1QixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBSkQsb0NBSUM7QUFFRCxNQUFhLGFBQWMsU0FBUSxjQUFjO0lBQy9DLFlBQVksSUFBZTtRQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFKRCxzQ0FJQztBQWFELElBQVksV0FpQlg7QUFqQkQsV0FBWSxXQUFXO0lBQ3JCOztPQUVHO0lBQ0gsNEJBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsNEJBQWEsQ0FBQTtJQUViOzs7O09BSUc7SUFDSCxnQ0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBakJXLFdBQVcsR0FBWCxtQkFBVyxLQUFYLG1CQUFXLFFBaUJ0QjtBQW9CRCxTQUFnQixnQkFBZ0IsQ0FBQyxDQUFlO0lBQzlDLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUM7QUFDaEQsQ0FBQztBQUZELDRDQUVDO0FBeUZEOzs7O0dBSUc7QUFDSCxJQUFZLG9CQWtDWDtBQWxDRCxXQUFZLG9CQUFvQjtJQUM5Qjs7T0FFRztJQUNILHFDQUFhLENBQUE7SUFFYjs7OztPQUlHO0lBQ0gseUVBQWlELENBQUE7SUFFakQ7Ozs7T0FJRztJQUNILHlFQUFpRCxDQUFBO0lBRWpEOztPQUVHO0lBQ0gsNkRBQXFDLENBQUE7SUFFckM7O09BRUc7SUFDSCxtRUFBMkMsQ0FBQTtJQUUzQzs7T0FFRztJQUNILGlFQUF5QyxDQUFBO0FBQzNDLENBQUMsRUFsQ1csb0JBQW9CLEdBQXBCLDRCQUFvQixLQUFwQiw0QkFBb0IsUUFrQy9CO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksb0JBOEJYO0FBOUJELFdBQVksb0JBQW9CO0lBQzlCOztPQUVHO0lBQ0gscUNBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gscUVBQTZDLENBQUE7SUFFN0M7O09BRUc7SUFDSCx5RUFBaUQsQ0FBQTtJQUVqRDs7T0FFRztJQUNILDJEQUFtQyxDQUFBO0lBRW5DOztPQUVHO0lBQ0gscURBQTZCLENBQUE7SUFFN0I7O09BRUc7SUFDSCxtREFBMkIsQ0FBQTtBQUM3QixDQUFDLEVBOUJXLG9CQUFvQixHQUFwQiw0QkFBb0IsS0FBcEIsNEJBQW9CLFFBOEIvQjtBQUVELE1BQWEsZ0JBQWdCO0lBQzNCLFlBQTZCLElBQWtCO1FBQWxCLFNBQUksR0FBSixJQUFJLENBQWM7SUFBRyxDQUFDO0lBRTVDLE1BQU0sQ0FBQyxHQUFpQjtRQUM3QixRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3RCLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssS0FBSztnQkFDUixPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDckMsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BHLEtBQUssS0FBSztnQkFDUixPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUMvRSxLQUFLLE9BQU87Z0JBQ1YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JGO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxnQkFBZ0IsQ0FBQyxHQUFpQjtRQUN2QyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3RCLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxTQUFTO2dCQUNaLFdBQVc7Z0JBQ1gsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztZQUV6RCxLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssS0FBSztnQkFDUixPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU5RyxLQUFLLE9BQU87Z0JBQ1YsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtvQkFDeEIsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsNkRBQTZEO2dCQUM3RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTlHO2dCQUNFLDBDQUEwQztnQkFDMUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxZQUFZLENBQUMsR0FBaUI7UUFDbkMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFrQixFQUFrQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVHLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBa0IsRUFBb0IsRUFBRSxDQUFDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEYsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssTUFBTSxTQUFTLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDakUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDdEQsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQUMsRUFBZ0I7UUFDL0IsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUN0QixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssS0FBSztnQkFDUixPQUFPLElBQUksZ0JBQWdCLENBQUM7b0JBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7b0JBQ3BCLE9BQU8sRUFBRSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUk7aUJBQ3BFLENBQUMsQ0FBQztZQUNMLEtBQUssT0FBTztnQkFDVixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7cUJBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQ2pELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBVSxDQUFDLENBQUM7Z0JBQzNDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBQSwyQkFBaUIsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLElBQUksZ0JBQWdCLENBQUM7b0JBQzFCLElBQUksRUFBRSxPQUFPO29CQUNiLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7aUJBQ3JDLENBQUMsQ0FBQztZQUNMO2dCQUNFLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBRU0sU0FBUyxDQUFDLEVBQWdCLEVBQUUsTUFBTSxHQUFHLElBQUk7UUFDOUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUN0QixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN4QixLQUFLLE9BQU87Z0JBQ1YsT0FBTyxTQUFTLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDbkYsS0FBSyxLQUFLO2dCQUNSLE9BQU8sZUFBZSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQ3pGLEtBQUssS0FBSztnQkFDUixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzNELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDMUUsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEc7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxPQUFPLENBQUMsRUFBaUI7O1FBQzlCLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDdEIsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssV0FBVyxDQUFDO1lBQ2pCLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxNQUFNLENBQUM7WUFDWixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxLQUFLO2dCQUNSLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssS0FBSztnQkFDUixPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLEtBQUssS0FBSztnQkFDUixPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQUEsTUFBQSxFQUFFLGFBQUYsRUFBRSx1QkFBRixFQUFFLENBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLDBDQUFFLElBQUksbUNBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakgsS0FBSyxPQUFPO2dCQUNWLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDakYsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFBLDJCQUFpQixFQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7Q0FDRjtBQXRKRCw0Q0FzSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIFJlZmVyZW5jZSwgUmVsYXRpb25zaGlwIH0gZnJvbSAnQGNka2xhYnMvdHNrYic7XG5pbXBvcnQgeyBTcGVjRGF0YWJhc2UgfSBmcm9tICcuL2RhdGFiYXNlJztcbmltcG9ydCB7IHNvcnRLZXlDb21wYXJhdG9yIH0gZnJvbSAnLi4vdXRpbC9zb3J0aW5nJztcblxuZXhwb3J0IGludGVyZmFjZSBQYXJ0aXRpb24gZXh0ZW5kcyBFbnRpdHkge1xuICByZWFkb25seSBwYXJ0aXRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgSGFzUmVnaW9uID0gUmVsYXRpb25zaGlwPFBhcnRpdGlvbiwgUmVnaW9uLCB7IGlzUHJpbWFyeT86IGJvb2xlYW4gfT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSBleHRlbmRzIEVudGl0eSB7XG4gIC8qKlxuICAgKiBUaGUgZnVsbCBuYW1lIG9mIHRoZSBzZXJ2aWNlIGluY2x1ZGluZyB0aGUgZ3JvdXAgcHJlZml4LCBsb3dlcmNhc2VkIGFuZCBoeXBoZW5hdGVkLlxuICAgKlxuICAgKiBFLmcuIGBBV1M6OkR5bmFtb0RCYCAtPiBgYXdzLWR5bmFtb2RiYFxuICAgKlxuICAgKiBAZXhhbXBsZSBhd3MtZHluYW1vZGJcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIE9ubHkgdGhlIHNlcnZpY2UgcGFydCBvZiB0aGUgbmFtZSwgbG93ZXJjYXNlZC5cbiAgICpcbiAgICogRS5nLiBgQVdTOjpEeW5hbW9EQmAgLT4gYGR5bmFtb2RiYFxuICAgKlxuICAgKiBAZXhhbXBsZSBkeW5hbW9kYlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvcnROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2hvcnRuYW1lIG9mIHRoZSBzZXJ2aWNlIGluIGNhcGl0YWxpemVkIGZvcm1cbiAgICpcbiAgICogRS5nLiBgQVdTOjpEeW5hbW9EQmAgLT4gYER5bmFtb0RCYFxuICAgKlxuICAgKiBAZXhhbXBsZSBkeW5hbW9kYlxuICAgKi9cbiAgcmVhZG9ubHkgY2FwaXRhbGl6ZWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb21wbGV0ZSBjbG91ZGZvcm1hdGlvbiBzdHlsZSBuYW1lc3BhY2Ugb2YgdGhlIHNlcnZpY2VcbiAgICpcbiAgICogRS5nLiBgQVdTOjpEeW5hbW9EQmBcbiAgICpcbiAgICogQGV4YW1wbGUgZHluYW1vZGJcbiAgICovXG4gIHJlYWRvbmx5IGNsb3VkRm9ybWF0aW9uTmFtZXNwYWNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uIGV4dGVuZHMgRW50aXR5IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudGF0aW9uIGV4dGVuZHMgRW50aXR5IHtcbiAgcmVhZG9ubHkgbWFya2Rvd246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZSBleHRlbmRzIEVudGl0eSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgY2xvdWRGb3JtYXRpb25UeXBlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJZiBzZXQsIHRoaXMgQ2xvdWRGb3JtYXRpb24gVHJhbnNmb3JtIGlzIHJlcXVpcmVkIGJ5IHRoZSByZXNvdXJjZVxuICAgKi9cbiAgY2xvdWRGb3JtYXRpb25UcmFuc2Zvcm0/OiBzdHJpbmc7XG4gIGRvY3VtZW50YXRpb24/OiBzdHJpbmc7XG4gIHByaW1hcnlJZGVudGlmaWVyPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IHByb3BlcnRpZXM6IFJlc291cmNlUHJvcGVydGllcztcbiAgcmVhZG9ubHkgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlPjtcbiAgcmVhZG9ubHkgdmFsaWRhdGlvbnM/OiB1bmtub3duO1xuICBpZGVudGlmaWVyPzogUmVzb3VyY2VJZGVudGlmaWVyO1xuICBpc1N0YXRlZnVsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZ2dhYmlsaXR5IG9mIHRoaXMgcmVzb3VyY2VcbiAgICpcbiAgICogVW5kZWZpbmVkIGlmIHRoZSByZXNvdXJjZSBpcyBub3QgdGFnZ2FibGUuXG4gICAqL1xuICB0YWdJbmZvcm1hdGlvbj86IFRhZ0luZm9ybWF0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNoYW5nZXMgdG8gdGhpcyByZXNvdXJjZSBuZWVkIHRvIGJlIHNjcnV0aW5pemVkXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlc291cmNlU2NydXRpbnlUeXBlLk5PTkVcbiAgICovXG4gIHNjcnV0aW5pemFibGU/OiBSZXNvdXJjZVNjcnV0aW55VHlwZTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBwYXRocyB0byBwcm9wZXJ0aWVzIHRoYXQgYWxzbyBjYXVzZSByZXBsYWNlbWVudC5cbiAgICpcbiAgICogVGhpcyBpcyB0byBpbmRpY2F0ZSB0aGF0IGNlcnRhaW4gcHJvcGVydHkgcGF0aHMgaW50byB0aGlzIHJlc291cmNlXG4gICAqIHdpbGwgY2F1c2UgcmVwbGFjZW1lbnQ7IG9ubHkgcmVwbGFjZW1lbnRzIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkXG4gICAqIGJ5IHRhZ2dpbmcgdGhlIHByb3BlcnR5IGluIGEgdHlwZSBkZWZpbml0aW9uIHdpbGwgYmUgaW5jbHVkZWQgaGVyZVxuICAgKiAoZm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhlIHRhZ2dlZCBwcm9wZXJ0eSB3b3VsZCBiZSBpbiBhIHByZWRlZmluZWRcbiAgICogdHlwZSBsaWtlIGB0YWdgKS5cbiAgICpcbiAgICogQWxsIHByb3BlcnRpZXMgaW4gdGhpcyBsaXN0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGBjYXVzZXNSZXBsYWNlbWVudDogJ3llcydgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtXG4gICAqL1xuICBhZGRpdGlvbmFsUmVwbGFjZW1lbnRQcm9wZXJ0aWVzPzogc3RyaW5nW11bXTtcbn1cblxuZXhwb3J0IHR5cGUgUmVzb3VyY2VQcm9wZXJ0aWVzID0gUmVjb3JkPHN0cmluZywgUHJvcGVydHk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVEZWZpbml0aW9uIGV4dGVuZHMgRW50aXR5IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBkb2N1bWVudGF0aW9uPzogc3RyaW5nO1xuICByZWFkb25seSBwcm9wZXJ0aWVzOiBSZXNvdXJjZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHJlbmRlciB0aGlzIHR5cGUgZXZlbiBpZiBpdCBpcyB1bnVzZWQuXG4gICAqL1xuICBtdXN0UmVuZGVyRm9yQndDb21wYXQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5IHtcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBwcm9wZXJ0eVxuICAgKi9cbiAgZG9jdW1lbnRhdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogSXMgdGhpcyBwcm9wZXJ0eSByZXF1aXJlZFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB0eXBlIG9mIHRoaXMgcHJvcGVydHlcbiAgICovXG4gIHR5cGU6IFByb3BlcnR5VHlwZTtcblxuICAvKipcbiAgICogQW4gb3JkZXJlZCBsaXN0IG9mIHByZXZpb3VzIHR5cGVzIG9mIHRoaXMgcHJvcGVydHkgaW4gYXNjZW5kaW5nIG9yZGVyXG4gICAqXG4gICAqIERvZXMgbm90IGluY2x1ZGUgdGhlIGN1cnJlbnQgdHlwZSwgdXNlIGB0eXBlYCBmb3IgdGhpcy5cbiAgICovXG4gIHByZXZpb3VzVHlwZXM/OiBQcm9wZXJ0eVR5cGVbXTtcblxuICAvKipcbiAgICogQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eVxuICAgKlxuICAgKiBUaGlzIHZhbHVlIGlzIG5vdCBkaXJlY3RseSBmdW5jdGlvbmFsOyBpdCBkZXNjcmliZXMgaG93IHRoZSB1bmRlcmx5aW5nIHJlc291cmNlXG4gICAqIHdpbGwgYmVoYXZlIGlmIHRoZSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgdW5rbm93blxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vdCBkZXByZWNhdGVkXG4gICAqL1xuICBkZXByZWNhdGVkPzogRGVwcmVjYXRpb247XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgY2hhbmdlcyB0byB0aGlzIHByb3BlcnR5IG5lZWRzIHRvIGJlIHNjcnV0aW5pemVkIHNwZWNpYWxseVxuICAgKlxuICAgKiBAZGVmYXVsdCBQcm9wZXJ0eVNjcnV0aW55VHlwZS5OT05FXG4gICAqL1xuICBzY3J1dGluaXphYmxlPzogUHJvcGVydHlTY3J1dGlueVR5cGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbnRhaW5pbmcgcmVzb3VyY2Ugd2lsbCBiZSByZXBsYWNlZCBpZiB0aGlzIHByb3BlcnR5IGlzIGNoYW5nZWRcbiAgICpcbiAgICogQGRlZmF1bHQgJ25vJ1xuICAgKi9cbiAgY2F1c2VzUmVwbGFjZW1lbnQ/OiAneWVzJyB8ICdubycgfCAnbWF5YmUnO1xufVxuXG5leHBvcnQgY2xhc3MgUmljaFR5cGVkRmllbGQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZpZWxkOiBQaWNrPFByb3BlcnR5LCAndHlwZScgfCAncHJldmlvdXNUeXBlcyc+KSB7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmllbGQgaXMgdW5kZWZpbmVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHR5cGVzKCk6IFByb3BlcnR5VHlwZVtdIHtcbiAgICByZXR1cm4gWy4uLih0aGlzLmZpZWxkLnByZXZpb3VzVHlwZXMgPz8gW10pLCB0aGlzLmZpZWxkLnR5cGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdHlwZSBvZiB0aGlzIHByb3BlcnR5IHdpdGggYSBuZXcgdHlwZVxuICAgKlxuICAgKiBPbmx5IGlmIGl0J3Mgbm90IGluIHRoZSBzZXQgb2YgdHlwZXMgYWxyZWFkeS5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVUeXBlKHR5cGU6IFByb3BlcnR5VHlwZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJpY2hUeXBlID0gbmV3IFJpY2hQcm9wZXJ0eVR5cGUodHlwZSk7XG5cbiAgICAvLyBPbmx5IGFkZCB0aGlzIHR5cGUgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGl0LiBXZSBhcmUgb25seSBkb2luZyBjb21wYXJpc29ucyB3aGVyZSAnaW50ZWdlcicgYW5kICdudW1iZXInXG4gICAgLy8gYXJlIHRyZWF0ZWQgdGhlIHNhbWUsIGZvciBhbGwgb3RoZXIgdHlwZXMgd2UgbmVlZCBzdHJpY3QgZXF1YWxpdHkuIFdlIHVzZWQgdG8gdXNlICdhc3NpZ25hYmxlVG8nIGFzIGFcbiAgICAvLyBjb25kaXRpb24sIGJ1dCB0aGVzZSB0eXBlcyB3aWxsIGJlIHJlbmRlcmVkIGluIGJvdGggY28tIGFuZCBjb250cmF2YXJpYW50IHBvc2l0aW9ucywgYW5kIHNvIHdlIHJlYWxseSBjYW4ndFxuICAgIC8vIGRvIG11Y2ggYmV0dGVyIHRoYW4gZnVsbCBlcXVhbGl0eS5cbiAgICBpZiAodGhpcy50eXBlcygpLnNvbWUoKHQpID0+IHJpY2hUeXBlLmVxdWFscyh0KSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gZG8sIHR5cGUgaXMgYWxyZWFkeSBpbiB0aGVyZS5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IGlmIHRoZSBuZXcgdHlwZSBpcyBgc3RyaW5nYCBhbmQgdGhlIG9sZCB0eXBlIGlzIGBkYXRlLXRpbWVgLCB3ZSBhc3N1bWUgdGhpcyBpc1xuICAgIC8vIHRoZSBzYW1lIHR5cGUgYnV0IHdlIGRyb3BwZWQgc29tZSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uLiBObyBuZWVkIHRvIG1ha2UgdGhpcyBhIHNlcGFyYXRlIHR5cGUuXG4gICAgaWYgKHR5cGUudHlwZSA9PT0gJ3N0cmluZycgJiYgdGhpcy50eXBlcygpLnNvbWUoKHQpID0+IHQudHlwZSA9PT0gJ2RhdGUtdGltZScpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpZWxkLnByZXZpb3VzVHlwZXMpIHtcbiAgICAgIHRoaXMuZmllbGQucHJldmlvdXNUeXBlcyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmZpZWxkLnByZXZpb3VzVHlwZXMucHVzaCh0aGlzLmZpZWxkLnR5cGUpO1xuICAgIHRoaXMuZmllbGQudHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJpY2hQcm9wZXJ0eSBleHRlbmRzIFJpY2hUeXBlZEZpZWxkIHtcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSaWNoQXR0cmlidXRlIGV4dGVuZHMgUmljaFR5cGVkRmllbGQge1xuICBjb25zdHJ1Y3RvcihhdHRyOiBBdHRyaWJ1dGUpIHtcbiAgICBzdXBlcihhdHRyKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZSB7XG4gIGRvY3VtZW50YXRpb24/OiBzdHJpbmc7XG4gIHR5cGU6IFByb3BlcnR5VHlwZTtcbiAgLyoqXG4gICAqIEFuIG9yZGVyZWQgbGlzdCBvZiBwcmV2aW91cyB0eXBlcyBvZiB0aGlzIHByb3BlcnR5IGluIGFzY2VuZGluZyBvcmRlclxuICAgKlxuICAgKiBEb2VzIG5vdCBpbmNsdWRlIHRoZSBjdXJyZW50IHR5cGUsIHVzZSBgdHlwZWAgZm9yIHRoaXMuXG4gICAqL1xuICBwcmV2aW91c1R5cGVzPzogUHJvcGVydHlUeXBlW107XG59XG5cbmV4cG9ydCBlbnVtIERlcHJlY2F0aW9uIHtcbiAgLyoqXG4gICAqIE5vdCBkZXByZWNhdGVkXG4gICAqL1xuICBOT05FID0gJ05PTkUnLFxuXG4gIC8qKlxuICAgKiBXYXJuIGFib3V0IHVzZVxuICAgKi9cbiAgV0FSTiA9ICdXQVJOJyxcblxuICAvKipcbiAgICogRG8gbm90IGVtaXQgdGhlIHZhbHVlIGF0IGFsbFxuICAgKlxuICAgKiAoSGFuZGxlIHByb3BlcnRpZXMgdGhhdCB3ZXJlIGluY29ycmVjdGx5IGFkZGVkIHRvIHRoZSBzcGVjKVxuICAgKi9cbiAgSUdOT1JFID0gJ0lHTk9SRScsXG59XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5VHlwZSA9XG4gIHwgUHJpbWl0aXZlVHlwZVxuICB8IERlZmluaXRpb25SZWZlcmVuY2VcbiAgfCBCdWlsdGluVGFnVHlwZVxuICB8IEFycmF5VHlwZTxQcm9wZXJ0eVR5cGU+XG4gIHwgTWFwVHlwZTxQcm9wZXJ0eVR5cGU+XG4gIHwgVHlwZVVuaW9uPFByb3BlcnR5VHlwZT47XG5cbmV4cG9ydCB0eXBlIFByaW1pdGl2ZVR5cGUgPVxuICB8IFN0cmluZ1R5cGVcbiAgfCBOdW1iZXJUeXBlXG4gIHwgSW50ZWdlclR5cGVcbiAgfCBCb29sZWFuVHlwZVxuICB8IEpzb25UeXBlXG4gIHwgRGF0ZVRpbWVUeXBlXG4gIHwgTnVsbFR5cGVcbiAgfCBCdWlsdGluVGFnVHlwZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sbGVjdGlvblR5cGUoeDogUHJvcGVydHlUeXBlKTogeCBpcyBBcnJheVR5cGU8YW55PiB8IE1hcFR5cGU8YW55PiB7XG4gIHJldHVybiB4LnR5cGUgPT09ICdhcnJheScgfHwgeC50eXBlID09PSAnbWFwJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYWdJbmZvcm1hdGlvbiB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGhvbGRzIHRoZSB0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdQcm9wZXJ0eU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVXNlZCB0byBpbnN0cnVjdCBjZGsuVGFnTWFuYWdlciBob3cgdG8gaGFuZGxlIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHZhcmlhbnQ6IFRhZ1ZhcmlhbnQ7XG59XG5cbmV4cG9ydCB0eXBlIFRhZ1ZhcmlhbnQgPSAnc3RhbmRhcmQnIHwgJ2FzZycgfCAnbWFwJztcblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdUeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ3N0cmluZyc7XG59XG5leHBvcnQgaW50ZXJmYWNlIEJ1aWx0aW5UYWdUeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ3RhZyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyVHlwZSB7XG4gIHJlYWRvbmx5IHR5cGU6ICdudW1iZXInO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVnZXJUeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ2ludGVnZXInO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvb2xlYW5UeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ2Jvb2xlYW4nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpzb25UeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ2pzb24nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE51bGxUeXBlIHtcbiAgcmVhZG9ubHkgdHlwZTogJ251bGwnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVUaW1lVHlwZSB7XG4gIHJlYWRvbmx5IHR5cGU6ICdkYXRlLXRpbWUnO1xufVxuXG4vKipcbiAqIFRoZSBcImxlZ2FjeVwiIHRhZyB0eXBlICh1c2VkIGluIHRoZSBvbGQgcmVzb3VyY2Ugc3BlYylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsdGluVGFnVHlwZSB7XG4gIHJlYWRvbmx5IHR5cGU6ICd0YWcnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmluaXRpb25SZWZlcmVuY2Uge1xuICByZWFkb25seSB0eXBlOiAncmVmJztcbiAgcmVhZG9ubHkgcmVmZXJlbmNlOiBSZWZlcmVuY2U8VHlwZURlZmluaXRpb24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFycmF5VHlwZTxFPiB7XG4gIHJlYWRvbmx5IHR5cGU6ICdhcnJheSc7XG4gIHJlYWRvbmx5IGVsZW1lbnQ6IEU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFwVHlwZTxFPiB7XG4gIHJlYWRvbmx5IHR5cGU6ICdtYXAnO1xuICByZWFkb25seSBlbGVtZW50OiBFO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVVbmlvbjxFPiB7XG4gIHJlYWRvbmx5IHR5cGU6ICd1bmlvbic7XG4gIHJlYWRvbmx5IHR5cGVzOiBFW107XG59XG5cbmV4cG9ydCB0eXBlIEhhc1Jlc291cmNlID0gUmVsYXRpb25zaGlwPFNlcnZpY2UsIFJlc291cmNlPjtcbmV4cG9ydCB0eXBlIFJlZ2lvbkhhc1Jlc291cmNlID0gUmVsYXRpb25zaGlwPFJlZ2lvbiwgUmVzb3VyY2U+O1xuZXhwb3J0IHR5cGUgUmVnaW9uSGFzU2VydmljZSA9IFJlbGF0aW9uc2hpcDxSZWdpb24sIFNlcnZpY2U+O1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VEb2MgPSBSZWxhdGlvbnNoaXA8UmVzb3VyY2UsIERvY3VtZW50YXRpb24+O1xuXG5leHBvcnQgdHlwZSBTZXJ2aWNlSW5SZWdpb24gPSBSZWxhdGlvbnNoaXA8UmVnaW9uLCBTZXJ2aWNlPjtcbmV4cG9ydCB0eXBlIFJlc291cmNlSW5SZWdpb24gPSBSZWxhdGlvbnNoaXA8UmVnaW9uLCBSZXNvdXJjZT47XG5cbmV4cG9ydCB0eXBlIFVzZXNUeXBlID0gUmVsYXRpb25zaGlwPFJlc291cmNlLCBUeXBlRGVmaW5pdGlvbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VJZGVudGlmaWVyIGV4dGVuZHMgRW50aXR5IHtcbiAgcmVhZG9ubHkgYXJuVGVtcGxhdGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByaW1hcnlJZGVudGlmaWVyPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogTWFyayBhIHJlc291cmNlIGFzIGEgcmVzb3VyY2UgdGhhdCBuZWVkcyBhZGRpdGlvbmFsIHNjcnV0aXkgd2hlbiBhZGRlZCwgcmVtb3ZlZCBvciBjaGFuZ2VkXG4gKlxuICogVXNlZCB0byBtYXJrIHJlc291cmNlcyB0aGF0IHJlcHJlc2VudCBzZWN1cml0eSBwb2xpY2llcy5cbiAqL1xuZXhwb3J0IGVudW0gUmVzb3VyY2VTY3J1dGlueVR5cGUge1xuICAvKipcbiAgICogTm8gYWRkaXRpb25hbCBzY3J1dGlueVxuICAgKi9cbiAgTm9uZSA9ICdOb25lJyxcblxuICAvKipcbiAgICogQW4gZXh0ZXJuYWxseSBhdHRhY2hlZCBwb2xpY3kgZG9jdW1lbnQgdG8gYSByZXNvdXJjZVxuICAgKlxuICAgKiAoQ29tbW9uIGZvciBTUVMsIFNOUywgUzMsIC4uLilcbiAgICovXG4gIFJlc291cmNlUG9saWN5UmVzb3VyY2UgPSAnUmVzb3VyY2VQb2xpY3lSZXNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYW4gSUFNIHBvbGljeSBvbiBhbiBpZGVudGl0eSByZXNvdXJjZVxuICAgKlxuICAgKiAoQmFzaWNhbGx5IHNheWluZzogdGhpcyBpcyBBV1M6OklBTTo6UG9saWN5KVxuICAgKi9cbiAgSWRlbnRpdHlQb2xpY3lSZXNvdXJjZSA9ICdJZGVudGl0eVBvbGljeVJlc291cmNlJyxcblxuICAvKipcbiAgICogVGhpcyBpcyBhIExhbWJkYSBQZXJtaXNzaW9uIHBvbGljeVxuICAgKi9cbiAgTGFtYmRhUGVybWlzc2lvbiA9ICdMYW1iZGFQZXJtaXNzaW9uJyxcblxuICAvKipcbiAgICogQW4gaW5ncmVzcyBydWxlIG9iamVjdFxuICAgKi9cbiAgSW5ncmVzc1J1bGVSZXNvdXJjZSA9ICdJbmdyZXNzUnVsZVJlc291cmNlJyxcblxuICAvKipcbiAgICogQSBzZXQgb2YgZWdyZXNzIHJ1bGVzXG4gICAqL1xuICBFZ3Jlc3NSdWxlUmVzb3VyY2UgPSAnRWdyZXNzUnVsZVJlc291cmNlJyxcbn1cblxuLyoqXG4gKiBNYXJrIGEgcHJvcGVydHkgYXMgYSBwcm9wZXJ0eSB0aGF0IG5lZWRzIGFkZGl0aW9uYWwgc2NydXRpbnkgd2hlbiBpdCBjaGFuZ2VzXG4gKlxuICogVXNlZCB0byBtYXJrIHNlbnNpdGl2ZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBzZWN1cml0eS1yZWxhdGVkIGltcGxpY2F0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gUHJvcGVydHlTY3J1dGlueVR5cGUge1xuICAvKipcbiAgICogTm8gYWRkaXRpb25hbCBzY3J1dGlueVxuICAgKi9cbiAgTm9uZSA9ICdOb25lJyxcblxuICAvKipcbiAgICogVGhpcyBpcyBhbiBJQU0gcG9saWN5IGRpcmVjdGx5IG9uIGEgcmVzb3VyY2VcbiAgICovXG4gIElubGluZVJlc291cmNlUG9saWN5ID0gJ0lubGluZVJlc291cmNlUG9saWN5JyxcblxuICAvKipcbiAgICogRWl0aGVyIGFuIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudCBvciBhIGRpY3Rpb25hcnkgb2YgcG9saWN5IGRvY3VtZW50c1xuICAgKi9cbiAgSW5saW5lSWRlbnRpdHlQb2xpY2llcyA9ICdJbmxpbmVJZGVudGl0eVBvbGljaWVzJyxcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG1hbmFnZWQgcG9saWNpZXMgKG9uIGFuIGlkZW50aXR5IHJlc291cmNlKVxuICAgKi9cbiAgTWFuYWdlZFBvbGljaWVzID0gJ01hbmFnZWRQb2xpY2llcycsXG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIGluZ3Jlc3MgcnVsZXMgKG9uIGEgc2VjdXJpdHkgZ3JvdXApXG4gICAqL1xuICBJbmdyZXNzUnVsZXMgPSAnSW5ncmVzc1J1bGVzJyxcblxuICAvKipcbiAgICogQSBzZXQgb2YgZWdyZXNzIHJ1bGVzIChvbiBhIHNlY3VyaXR5IGdyb3VwKVxuICAgKi9cbiAgRWdyZXNzUnVsZXMgPSAnRWdyZXNzUnVsZXMnLFxufVxuXG5leHBvcnQgY2xhc3MgUmljaFByb3BlcnR5VHlwZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdHlwZTogUHJvcGVydHlUeXBlKSB7fVxuXG4gIHB1YmxpYyBlcXVhbHMocmhzOiBQcm9wZXJ0eVR5cGUpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZS10aW1lJzpcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgIHJldHVybiByaHMudHlwZSA9PT0gdGhpcy50eXBlLnR5cGU7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdtYXAnOlxuICAgICAgICByZXR1cm4gcmhzLnR5cGUgPT09IHRoaXMudHlwZS50eXBlICYmIG5ldyBSaWNoUHJvcGVydHlUeXBlKHRoaXMudHlwZS5lbGVtZW50KS5lcXVhbHMocmhzLmVsZW1lbnQpO1xuICAgICAgY2FzZSAncmVmJzpcbiAgICAgICAgcmV0dXJuIHJocy50eXBlID09PSAncmVmJyAmJiB0aGlzLnR5cGUucmVmZXJlbmNlLiRyZWYgPT09IHJocy5yZWZlcmVuY2UuJHJlZjtcbiAgICAgIGNhc2UgJ3VuaW9uJzpcbiAgICAgICAgY29uc3QgbGhzS2V5ID0gdGhpcy5zb3J0S2V5KCk7XG4gICAgICAgIGNvbnN0IHJoc0tleSA9IG5ldyBSaWNoUHJvcGVydHlUeXBlKHJocykuc29ydEtleSgpO1xuICAgICAgICByZXR1cm4gbGhzS2V5Lmxlbmd0aCA9PT0gcmhzS2V5Lmxlbmd0aCAmJiBsaHNLZXkuZXZlcnkoKGwsIGkpID0+IGwgPT09IHJoc0tleVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgdHlwZSBpcyBKYXZhU2NyaXB0LWVxdWFsIHRvIHRoZSBSSFMgdHlwZVxuICAgKlxuICAgKiBTYW1lIGFzIG5vcm1hbCBlcXVhbGl0eSwgYnV0IGNvbnNpZGVyIGBpbnRlZ2VyYCBhbmQgYG51bWJlcmAgdGhlIHNhbWUgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgamF2YXNjcmlwdEVxdWFscyhyaHM6IFByb3BlcnR5VHlwZSk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAodGhpcy50eXBlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgICAgLy8gV2lkZW5pbmdcbiAgICAgICAgcmV0dXJuIHJocy50eXBlID09PSAnaW50ZWdlcicgfHwgcmhzLnR5cGUgPT09ICdudW1iZXInO1xuXG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdtYXAnOlxuICAgICAgICByZXR1cm4gcmhzLnR5cGUgPT09IHRoaXMudHlwZS50eXBlICYmIG5ldyBSaWNoUHJvcGVydHlUeXBlKHRoaXMudHlwZS5lbGVtZW50KS5qYXZhc2NyaXB0RXF1YWxzKHJocy5lbGVtZW50KTtcblxuICAgICAgY2FzZSAndW5pb24nOlxuICAgICAgICBpZiAocmhzLnR5cGUgIT09ICd1bmlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXZlcnkgdHlwZSBpbiB0aGlzIHVuaW9uIG5lZWRzIHRvIGJlIGVxdWFsIG9uZSB0eXBlIGluIFJIU1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLnR5cGVzLmV2ZXJ5KCh0MSkgPT4gcmhzLnR5cGVzLnNvbWUoKHQyKSA9PiBuZXcgUmljaFByb3BlcnR5VHlwZSh0MSkuamF2YXNjcmlwdEVxdWFscyh0MikpKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRm9yIGFueXRoaW5nIGVsc2UsIG5lZWQgc3RyaWN0IGVxdWFsaXR5XG4gICAgICAgIHJldHVybiB0aGlzLmVxdWFscyhyaHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHR5cGUgaXMgYXNzaWduYWJsZSB0byB0aGUgUkhTIHR5cGUuXG4gICAqXG4gICAqIFRoaXMgaXMgbWVhbnMgZXZlcnkgdHlwZSBtZW1iZXIgb2YgdGhlIExIUyBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIFJIUyB0eXBlXG4gICAqL1xuICBwdWJsaWMgYXNzaWduYWJsZVRvKHJoczogUHJvcGVydHlUeXBlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXh0cmFjdE1lbWJlcnMgPSAodHlwZTogUHJvcGVydHlUeXBlKTogUHJvcGVydHlUeXBlW10gPT4gKHR5cGUudHlwZSA9PSAndW5pb24nID8gdHlwZS50eXBlcyA6IFt0eXBlXSk7XG4gICAgY29uc3QgYXNSaWNoVHlwZSA9ICh0eXBlOiBQcm9wZXJ0eVR5cGUpOiBSaWNoUHJvcGVydHlUeXBlID0+IG5ldyBSaWNoUHJvcGVydHlUeXBlKHR5cGUpO1xuXG4gICAgY29uc3QgcmhzTWVtYmVycyA9IGV4dHJhY3RNZW1iZXJzKHJocyk7XG4gICAgZm9yIChjb25zdCBsaHNNZW1iZXIgb2YgZXh0cmFjdE1lbWJlcnModGhpcy50eXBlKS5tYXAoYXNSaWNoVHlwZSkpIHtcbiAgICAgIGlmICghcmhzTWVtYmVycy5zb21lKCh0eXBlKSA9PiBsaHNNZW1iZXIuZXF1YWxzKHR5cGUpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgdmVyc2lvbiBvZiB0aGlzIHR5cGUsIGJ1dCB3aXRoIGFsbCB0eXBlIHVuaW9ucyBpbiBhIHJlZ3VsYXJpemVkIG9yZGVyXG4gICAqL1xuICBwdWJsaWMgbm9ybWFsaXplKGRiOiBTcGVjRGF0YWJhc2UpOiBSaWNoUHJvcGVydHlUeXBlIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdtYXAnOlxuICAgICAgICByZXR1cm4gbmV3IFJpY2hQcm9wZXJ0eVR5cGUoe1xuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZS50eXBlLFxuICAgICAgICAgIGVsZW1lbnQ6IG5ldyBSaWNoUHJvcGVydHlUeXBlKHRoaXMudHlwZS5lbGVtZW50KS5ub3JtYWxpemUoZGIpLnR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSAndW5pb24nOlxuICAgICAgICBjb25zdCB0eXBlcyA9IHRoaXMudHlwZS50eXBlc1xuICAgICAgICAgIC5tYXAoKHQpID0+IG5ldyBSaWNoUHJvcGVydHlUeXBlKHQpLm5vcm1hbGl6ZShkYikpXG4gICAgICAgICAgLm1hcCgodCkgPT4gW3QsIHQuc29ydEtleShkYildIGFzIGNvbnN0KTtcbiAgICAgICAgdHlwZXMuc29ydChzb3J0S2V5Q29tcGFyYXRvcigoW18sIHNvcnRLZXldKSA9PiBzb3J0S2V5KSk7XG4gICAgICAgIHJldHVybiBuZXcgUmljaFByb3BlcnR5VHlwZSh7XG4gICAgICAgICAgdHlwZTogJ3VuaW9uJyxcbiAgICAgICAgICB0eXBlczogdHlwZXMubWFwKChbdCwgX10pID0+IHQudHlwZSksXG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0cmluZ2lmeShkYjogU3BlY0RhdGFiYXNlLCB3aXRoSWQgPSB0cnVlKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZS10aW1lJzpcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUudHlwZTtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgICAgcmV0dXJuIGBBcnJheTwke25ldyBSaWNoUHJvcGVydHlUeXBlKHRoaXMudHlwZS5lbGVtZW50KS5zdHJpbmdpZnkoZGIsIHdpdGhJZCl9PmA7XG4gICAgICBjYXNlICdtYXAnOlxuICAgICAgICByZXR1cm4gYE1hcDxzdHJpbmcsICR7bmV3IFJpY2hQcm9wZXJ0eVR5cGUodGhpcy50eXBlLmVsZW1lbnQpLnN0cmluZ2lmeShkYiwgd2l0aElkKX0+YDtcbiAgICAgIGNhc2UgJ3JlZic6XG4gICAgICAgIGNvbnN0IHR5cGUgPSBkYi5nZXQoJ3R5cGVEZWZpbml0aW9uJywgdGhpcy50eXBlLnJlZmVyZW5jZSk7XG4gICAgICAgIHJldHVybiB3aXRoSWQgPyBgJHt0eXBlLm5hbWV9KCR7dGhpcy50eXBlLnJlZmVyZW5jZS4kcmVmfSlgIDogdHlwZS5uYW1lO1xuICAgICAgY2FzZSAndW5pb24nOlxuICAgICAgICByZXR1cm4gdGhpcy50eXBlLnR5cGVzLm1hcCgodCkgPT4gbmV3IFJpY2hQcm9wZXJ0eVR5cGUodCkuc3RyaW5naWZ5KGRiLCB3aXRoSWQpKS5qb2luKCcgfCAnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc29ydGFibGUga2V5IGJhc2VkIG9uIHRoaXMgdHlwZVxuICAgKlxuICAgKiBJZiBhIGRhdGFiYXNlIGlzIGdpdmVuLCB0eXBlIGRlZmluaXRpb25zIHdpbGwgYmUgc29ydGVkIGJhc2VkIG9uIHR5cGUgbmFtZSxcbiAgICogb3RoZXJ3aXNlIG9uIGlkZW50aWZpZXJcbiAgICovXG4gIHB1YmxpYyBzb3J0S2V5KGRiPzogU3BlY0RhdGFiYXNlKTogc3RyaW5nW10ge1xuICAgIHN3aXRjaCAodGhpcy50eXBlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdkYXRlLXRpbWUnOlxuICAgICAgY2FzZSAnanNvbic6XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAndGFnJzpcbiAgICAgICAgcmV0dXJuIFsnMCcsIHRoaXMudHlwZS50eXBlXTtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ21hcCc6XG4gICAgICAgIHJldHVybiBbJzEnLCB0aGlzLnR5cGUudHlwZSwgLi4ubmV3IFJpY2hQcm9wZXJ0eVR5cGUodGhpcy50eXBlLmVsZW1lbnQpLnNvcnRLZXkoZGIpXTtcbiAgICAgIGNhc2UgJ3JlZic6XG4gICAgICAgIHJldHVybiBbJzInLCB0aGlzLnR5cGUudHlwZSwgZGI/LmdldCgndHlwZURlZmluaXRpb24nLCB0aGlzLnR5cGUucmVmZXJlbmNlKT8ubmFtZSA/PyB0aGlzLnR5cGUucmVmZXJlbmNlLiRyZWZdO1xuICAgICAgY2FzZSAndW5pb24nOlxuICAgICAgICBjb25zdCB0eXBlS2V5cyA9IHRoaXMudHlwZS50eXBlcy5tYXAoKHQpID0+IG5ldyBSaWNoUHJvcGVydHlUeXBlKHQpLnNvcnRLZXkoZGIpKTtcbiAgICAgICAgdHlwZUtleXMuc29ydChzb3J0S2V5Q29tcGFyYXRvcigoeCkgPT4geCkpO1xuICAgICAgICByZXR1cm4gWyczJywgdGhpcy50eXBlLnR5cGUsIC4uLnR5cGVLZXlzLmZsYXRNYXAoKHgpID0+IHgpXTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sortKeyComparator = void 0;\n/**\n * Make a sorting comparator that will sort by a given sort key\n */\nfunction sortKeyComparator(keyFn) {\n return (a, b) => {\n const ak = keyFn(a);\n const bk = keyFn(b);\n for (let i = 0; i < ak.length && i < bk.length; i++) {\n const av = ak[i];\n const bv = bk[i];\n let diff = 0;\n if (typeof av === 'number' && typeof bv === 'number') {\n diff = av - bv;\n }\n else if (typeof av === 'string' && typeof bv === 'string') {\n diff = av.localeCompare(bv);\n }\n if (diff !== 0) {\n return diff;\n }\n }\n return bk.length - ak.length;\n };\n}\nexports.sortKeyComparator = sortKeyComparator;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3NvcnRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBSSxLQUF1QztJQUMxRSxPQUFPLENBQUMsQ0FBSSxFQUFFLENBQUksRUFBVSxFQUFFO1FBQzVCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkQsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVqQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLE9BQU8sRUFBRSxLQUFLLFFBQVEsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUU7Z0JBQ3BELElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2FBQ2hCO2lCQUFNLElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxJQUFJLE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRTtnQkFDM0QsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDN0I7WUFFRCxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7Z0JBQ2QsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBRUQsT0FBTyxFQUFFLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDL0IsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXZCRCw4Q0F1QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1ha2UgYSBzb3J0aW5nIGNvbXBhcmF0b3IgdGhhdCB3aWxsIHNvcnQgYnkgYSBnaXZlbiBzb3J0IGtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleUNvbXBhcmF0b3I8QT4oa2V5Rm46ICh4OiBBKSA9PiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSB7XG4gIHJldHVybiAoYTogQSwgYjogQSk6IG51bWJlciA9PiB7XG4gICAgY29uc3QgYWsgPSBrZXlGbihhKTtcbiAgICBjb25zdCBiayA9IGtleUZuKGIpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhay5sZW5ndGggJiYgaSA8IGJrLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhdiA9IGFrW2ldO1xuICAgICAgY29uc3QgYnYgPSBia1tpXTtcblxuICAgICAgbGV0IGRpZmYgPSAwO1xuICAgICAgaWYgKHR5cGVvZiBhdiA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGJ2ID09PSAnbnVtYmVyJykge1xuICAgICAgICBkaWZmID0gYXYgLSBidjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGF2ID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgYnYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRpZmYgPSBhdi5sb2NhbGVDb21wYXJlKGJ2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpZmYgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJrLmxlbmd0aCAtIGFrLmxlbmd0aDtcbiAgfTtcbn1cbiJdfQ==","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AwsCrc32 = void 0;\nvar tslib_1 = require(\"tslib\");\nvar util_1 = require(\"@aws-crypto/util\");\nvar index_1 = require(\"./index\");\nvar AwsCrc32 = /** @class */ (function () {\n function AwsCrc32() {\n this.crc32 = new index_1.Crc32();\n }\n AwsCrc32.prototype.update = function (toHash) {\n if ((0, util_1.isEmptyData)(toHash))\n return;\n this.crc32.update((0, util_1.convertToBuffer)(toHash));\n };\n AwsCrc32.prototype.digest = function () {\n return tslib_1.__awaiter(this, void 0, void 0, function () {\n return tslib_1.__generator(this, function (_a) {\n return [2 /*return*/, (0, util_1.numToUint8)(this.crc32.digest())];\n });\n });\n };\n AwsCrc32.prototype.reset = function () {\n this.crc32 = new index_1.Crc32();\n };\n return AwsCrc32;\n}());\nexports.AwsCrc32 = AwsCrc32;\n//# sourceMappingURL=aws_crc32.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AwsCrc32 = exports.Crc32 = exports.crc32 = void 0;\nvar tslib_1 = require(\"tslib\");\nvar util_1 = require(\"@aws-crypto/util\");\nfunction crc32(data) {\n return new Crc32().update(data).digest();\n}\nexports.crc32 = crc32;\nvar Crc32 = /** @class */ (function () {\n function Crc32() {\n this.checksum = 0xffffffff;\n }\n Crc32.prototype.update = function (data) {\n var e_1, _a;\n try {\n for (var data_1 = tslib_1.__values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) {\n var byte = data_1_1.value;\n this.checksum =\n (this.checksum >>> 8) ^ lookupTable[(this.checksum ^ byte) & 0xff];\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return this;\n };\n Crc32.prototype.digest = function () {\n return (this.checksum ^ 0xffffffff) >>> 0;\n };\n return Crc32;\n}());\nexports.Crc32 = Crc32;\n// prettier-ignore\nvar a_lookUpTable = [\n 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,\n 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,\n 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\n 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,\n 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,\n 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\n 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,\n 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,\n 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\n 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,\n 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,\n 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,\n 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,\n 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\n 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,\n 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\n 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,\n 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\n 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,\n 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\n 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,\n 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\n 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,\n 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,\n 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\n 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,\n 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\n 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,\n 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\n 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,\n 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\n 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,\n 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,\n 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\n 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,\n 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\n 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,\n 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\n 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,\n 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\n 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,\n 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\n 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,\n 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\n 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,\n 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\n 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,\n 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\n 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,\n 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\n 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,\n 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,\n 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\n 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,\n 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,\n];\nvar lookupTable = (0, util_1.uint32ArrayFrom)(a_lookUpTable);\nvar aws_crc32_1 = require(\"./aws_crc32\");\nObject.defineProperty(exports, \"AwsCrc32\", { enumerable: true, get: function () { return aws_crc32_1.AwsCrc32; } });\n//# sourceMappingURL=index.js.map","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __createBinding = function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n };\r\n\r\n __exportStar = function (m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n };\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result[\"default\"] = mod;\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n});\r\n","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.convertToBuffer = void 0;\nvar util_utf8_browser_1 = require(\"@aws-sdk/util-utf8-browser\");\n// Quick polyfill\nvar fromUtf8 = typeof Buffer !== \"undefined\" && Buffer.from\n ? function (input) { return Buffer.from(input, \"utf8\"); }\n : util_utf8_browser_1.fromUtf8;\nfunction convertToBuffer(data) {\n // Already a Uint8, do nothing\n if (data instanceof Uint8Array)\n return data;\n if (typeof data === \"string\") {\n return fromUtf8(data);\n }\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT);\n }\n return new Uint8Array(data);\n}\nexports.convertToBuffer = convertToBuffer;\n//# sourceMappingURL=convertToBuffer.js.map","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.uint32ArrayFrom = exports.numToUint8 = exports.isEmptyData = exports.convertToBuffer = void 0;\nvar convertToBuffer_1 = require(\"./convertToBuffer\");\nObject.defineProperty(exports, \"convertToBuffer\", { enumerable: true, get: function () { return convertToBuffer_1.convertToBuffer; } });\nvar isEmptyData_1 = require(\"./isEmptyData\");\nObject.defineProperty(exports, \"isEmptyData\", { enumerable: true, get: function () { return isEmptyData_1.isEmptyData; } });\nvar numToUint8_1 = require(\"./numToUint8\");\nObject.defineProperty(exports, \"numToUint8\", { enumerable: true, get: function () { return numToUint8_1.numToUint8; } });\nvar uint32ArrayFrom_1 = require(\"./uint32ArrayFrom\");\nObject.defineProperty(exports, \"uint32ArrayFrom\", { enumerable: true, get: function () { return uint32ArrayFrom_1.uint32ArrayFrom; } });\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isEmptyData = void 0;\nfunction isEmptyData(data) {\n if (typeof data === \"string\") {\n return data.length === 0;\n }\n return data.byteLength === 0;\n}\nexports.isEmptyData = isEmptyData;\n//# sourceMappingURL=isEmptyData.js.map","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.numToUint8 = void 0;\nfunction numToUint8(num) {\n return new Uint8Array([\n (num & 0xff000000) >> 24,\n (num & 0x00ff0000) >> 16,\n (num & 0x0000ff00) >> 8,\n num & 0x000000ff,\n ]);\n}\nexports.numToUint8 = numToUint8;\n//# sourceMappingURL=numToUint8.js.map","\"use strict\";\n// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.uint32ArrayFrom = void 0;\n// IE 11 does not support Array.from, so we do it manually\nfunction uint32ArrayFrom(a_lookUpTable) {\n if (!Uint32Array.from) {\n var return_array = new Uint32Array(a_lookUpTable.length);\n var a_index = 0;\n while (a_index < a_lookUpTable.length) {\n return_array[a_index] = a_lookUpTable[a_index];\n a_index += 1;\n }\n return return_array;\n }\n return Uint32Array.from(a_lookUpTable);\n}\nexports.uint32ArrayFrom = uint32ArrayFrom;\n//# sourceMappingURL=uint32ArrayFrom.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CloudFormation = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst CloudFormationClient_1 = require(\"./CloudFormationClient\");\nconst ActivateOrganizationsAccessCommand_1 = require(\"./commands/ActivateOrganizationsAccessCommand\");\nconst ActivateTypeCommand_1 = require(\"./commands/ActivateTypeCommand\");\nconst BatchDescribeTypeConfigurationsCommand_1 = require(\"./commands/BatchDescribeTypeConfigurationsCommand\");\nconst CancelUpdateStackCommand_1 = require(\"./commands/CancelUpdateStackCommand\");\nconst ContinueUpdateRollbackCommand_1 = require(\"./commands/ContinueUpdateRollbackCommand\");\nconst CreateChangeSetCommand_1 = require(\"./commands/CreateChangeSetCommand\");\nconst CreateStackCommand_1 = require(\"./commands/CreateStackCommand\");\nconst CreateStackInstancesCommand_1 = require(\"./commands/CreateStackInstancesCommand\");\nconst CreateStackSetCommand_1 = require(\"./commands/CreateStackSetCommand\");\nconst DeactivateOrganizationsAccessCommand_1 = require(\"./commands/DeactivateOrganizationsAccessCommand\");\nconst DeactivateTypeCommand_1 = require(\"./commands/DeactivateTypeCommand\");\nconst DeleteChangeSetCommand_1 = require(\"./commands/DeleteChangeSetCommand\");\nconst DeleteStackCommand_1 = require(\"./commands/DeleteStackCommand\");\nconst DeleteStackInstancesCommand_1 = require(\"./commands/DeleteStackInstancesCommand\");\nconst DeleteStackSetCommand_1 = require(\"./commands/DeleteStackSetCommand\");\nconst DeregisterTypeCommand_1 = require(\"./commands/DeregisterTypeCommand\");\nconst DescribeAccountLimitsCommand_1 = require(\"./commands/DescribeAccountLimitsCommand\");\nconst DescribeChangeSetCommand_1 = require(\"./commands/DescribeChangeSetCommand\");\nconst DescribeChangeSetHooksCommand_1 = require(\"./commands/DescribeChangeSetHooksCommand\");\nconst DescribeOrganizationsAccessCommand_1 = require(\"./commands/DescribeOrganizationsAccessCommand\");\nconst DescribePublisherCommand_1 = require(\"./commands/DescribePublisherCommand\");\nconst DescribeStackDriftDetectionStatusCommand_1 = require(\"./commands/DescribeStackDriftDetectionStatusCommand\");\nconst DescribeStackEventsCommand_1 = require(\"./commands/DescribeStackEventsCommand\");\nconst DescribeStackInstanceCommand_1 = require(\"./commands/DescribeStackInstanceCommand\");\nconst DescribeStackResourceCommand_1 = require(\"./commands/DescribeStackResourceCommand\");\nconst DescribeStackResourceDriftsCommand_1 = require(\"./commands/DescribeStackResourceDriftsCommand\");\nconst DescribeStackResourcesCommand_1 = require(\"./commands/DescribeStackResourcesCommand\");\nconst DescribeStacksCommand_1 = require(\"./commands/DescribeStacksCommand\");\nconst DescribeStackSetCommand_1 = require(\"./commands/DescribeStackSetCommand\");\nconst DescribeStackSetOperationCommand_1 = require(\"./commands/DescribeStackSetOperationCommand\");\nconst DescribeTypeCommand_1 = require(\"./commands/DescribeTypeCommand\");\nconst DescribeTypeRegistrationCommand_1 = require(\"./commands/DescribeTypeRegistrationCommand\");\nconst DetectStackDriftCommand_1 = require(\"./commands/DetectStackDriftCommand\");\nconst DetectStackResourceDriftCommand_1 = require(\"./commands/DetectStackResourceDriftCommand\");\nconst DetectStackSetDriftCommand_1 = require(\"./commands/DetectStackSetDriftCommand\");\nconst EstimateTemplateCostCommand_1 = require(\"./commands/EstimateTemplateCostCommand\");\nconst ExecuteChangeSetCommand_1 = require(\"./commands/ExecuteChangeSetCommand\");\nconst GetStackPolicyCommand_1 = require(\"./commands/GetStackPolicyCommand\");\nconst GetTemplateCommand_1 = require(\"./commands/GetTemplateCommand\");\nconst GetTemplateSummaryCommand_1 = require(\"./commands/GetTemplateSummaryCommand\");\nconst ImportStacksToStackSetCommand_1 = require(\"./commands/ImportStacksToStackSetCommand\");\nconst ListChangeSetsCommand_1 = require(\"./commands/ListChangeSetsCommand\");\nconst ListExportsCommand_1 = require(\"./commands/ListExportsCommand\");\nconst ListImportsCommand_1 = require(\"./commands/ListImportsCommand\");\nconst ListStackInstanceResourceDriftsCommand_1 = require(\"./commands/ListStackInstanceResourceDriftsCommand\");\nconst ListStackInstancesCommand_1 = require(\"./commands/ListStackInstancesCommand\");\nconst ListStackResourcesCommand_1 = require(\"./commands/ListStackResourcesCommand\");\nconst ListStacksCommand_1 = require(\"./commands/ListStacksCommand\");\nconst ListStackSetOperationResultsCommand_1 = require(\"./commands/ListStackSetOperationResultsCommand\");\nconst ListStackSetOperationsCommand_1 = require(\"./commands/ListStackSetOperationsCommand\");\nconst ListStackSetsCommand_1 = require(\"./commands/ListStackSetsCommand\");\nconst ListTypeRegistrationsCommand_1 = require(\"./commands/ListTypeRegistrationsCommand\");\nconst ListTypesCommand_1 = require(\"./commands/ListTypesCommand\");\nconst ListTypeVersionsCommand_1 = require(\"./commands/ListTypeVersionsCommand\");\nconst PublishTypeCommand_1 = require(\"./commands/PublishTypeCommand\");\nconst RecordHandlerProgressCommand_1 = require(\"./commands/RecordHandlerProgressCommand\");\nconst RegisterPublisherCommand_1 = require(\"./commands/RegisterPublisherCommand\");\nconst RegisterTypeCommand_1 = require(\"./commands/RegisterTypeCommand\");\nconst RollbackStackCommand_1 = require(\"./commands/RollbackStackCommand\");\nconst SetStackPolicyCommand_1 = require(\"./commands/SetStackPolicyCommand\");\nconst SetTypeConfigurationCommand_1 = require(\"./commands/SetTypeConfigurationCommand\");\nconst SetTypeDefaultVersionCommand_1 = require(\"./commands/SetTypeDefaultVersionCommand\");\nconst SignalResourceCommand_1 = require(\"./commands/SignalResourceCommand\");\nconst StopStackSetOperationCommand_1 = require(\"./commands/StopStackSetOperationCommand\");\nconst TestTypeCommand_1 = require(\"./commands/TestTypeCommand\");\nconst UpdateStackCommand_1 = require(\"./commands/UpdateStackCommand\");\nconst UpdateStackInstancesCommand_1 = require(\"./commands/UpdateStackInstancesCommand\");\nconst UpdateStackSetCommand_1 = require(\"./commands/UpdateStackSetCommand\");\nconst UpdateTerminationProtectionCommand_1 = require(\"./commands/UpdateTerminationProtectionCommand\");\nconst ValidateTemplateCommand_1 = require(\"./commands/ValidateTemplateCommand\");\nconst commands = {\n ActivateOrganizationsAccessCommand: ActivateOrganizationsAccessCommand_1.ActivateOrganizationsAccessCommand,\n ActivateTypeCommand: ActivateTypeCommand_1.ActivateTypeCommand,\n BatchDescribeTypeConfigurationsCommand: BatchDescribeTypeConfigurationsCommand_1.BatchDescribeTypeConfigurationsCommand,\n CancelUpdateStackCommand: CancelUpdateStackCommand_1.CancelUpdateStackCommand,\n ContinueUpdateRollbackCommand: ContinueUpdateRollbackCommand_1.ContinueUpdateRollbackCommand,\n CreateChangeSetCommand: CreateChangeSetCommand_1.CreateChangeSetCommand,\n CreateStackCommand: CreateStackCommand_1.CreateStackCommand,\n CreateStackInstancesCommand: CreateStackInstancesCommand_1.CreateStackInstancesCommand,\n CreateStackSetCommand: CreateStackSetCommand_1.CreateStackSetCommand,\n DeactivateOrganizationsAccessCommand: DeactivateOrganizationsAccessCommand_1.DeactivateOrganizationsAccessCommand,\n DeactivateTypeCommand: DeactivateTypeCommand_1.DeactivateTypeCommand,\n DeleteChangeSetCommand: DeleteChangeSetCommand_1.DeleteChangeSetCommand,\n DeleteStackCommand: DeleteStackCommand_1.DeleteStackCommand,\n DeleteStackInstancesCommand: DeleteStackInstancesCommand_1.DeleteStackInstancesCommand,\n DeleteStackSetCommand: DeleteStackSetCommand_1.DeleteStackSetCommand,\n DeregisterTypeCommand: DeregisterTypeCommand_1.DeregisterTypeCommand,\n DescribeAccountLimitsCommand: DescribeAccountLimitsCommand_1.DescribeAccountLimitsCommand,\n DescribeChangeSetCommand: DescribeChangeSetCommand_1.DescribeChangeSetCommand,\n DescribeChangeSetHooksCommand: DescribeChangeSetHooksCommand_1.DescribeChangeSetHooksCommand,\n DescribeOrganizationsAccessCommand: DescribeOrganizationsAccessCommand_1.DescribeOrganizationsAccessCommand,\n DescribePublisherCommand: DescribePublisherCommand_1.DescribePublisherCommand,\n DescribeStackDriftDetectionStatusCommand: DescribeStackDriftDetectionStatusCommand_1.DescribeStackDriftDetectionStatusCommand,\n DescribeStackEventsCommand: DescribeStackEventsCommand_1.DescribeStackEventsCommand,\n DescribeStackInstanceCommand: DescribeStackInstanceCommand_1.DescribeStackInstanceCommand,\n DescribeStackResourceCommand: DescribeStackResourceCommand_1.DescribeStackResourceCommand,\n DescribeStackResourceDriftsCommand: DescribeStackResourceDriftsCommand_1.DescribeStackResourceDriftsCommand,\n DescribeStackResourcesCommand: DescribeStackResourcesCommand_1.DescribeStackResourcesCommand,\n DescribeStacksCommand: DescribeStacksCommand_1.DescribeStacksCommand,\n DescribeStackSetCommand: DescribeStackSetCommand_1.DescribeStackSetCommand,\n DescribeStackSetOperationCommand: DescribeStackSetOperationCommand_1.DescribeStackSetOperationCommand,\n DescribeTypeCommand: DescribeTypeCommand_1.DescribeTypeCommand,\n DescribeTypeRegistrationCommand: DescribeTypeRegistrationCommand_1.DescribeTypeRegistrationCommand,\n DetectStackDriftCommand: DetectStackDriftCommand_1.DetectStackDriftCommand,\n DetectStackResourceDriftCommand: DetectStackResourceDriftCommand_1.DetectStackResourceDriftCommand,\n DetectStackSetDriftCommand: DetectStackSetDriftCommand_1.DetectStackSetDriftCommand,\n EstimateTemplateCostCommand: EstimateTemplateCostCommand_1.EstimateTemplateCostCommand,\n ExecuteChangeSetCommand: ExecuteChangeSetCommand_1.ExecuteChangeSetCommand,\n GetStackPolicyCommand: GetStackPolicyCommand_1.GetStackPolicyCommand,\n GetTemplateCommand: GetTemplateCommand_1.GetTemplateCommand,\n GetTemplateSummaryCommand: GetTemplateSummaryCommand_1.GetTemplateSummaryCommand,\n ImportStacksToStackSetCommand: ImportStacksToStackSetCommand_1.ImportStacksToStackSetCommand,\n ListChangeSetsCommand: ListChangeSetsCommand_1.ListChangeSetsCommand,\n ListExportsCommand: ListExportsCommand_1.ListExportsCommand,\n ListImportsCommand: ListImportsCommand_1.ListImportsCommand,\n ListStackInstanceResourceDriftsCommand: ListStackInstanceResourceDriftsCommand_1.ListStackInstanceResourceDriftsCommand,\n ListStackInstancesCommand: ListStackInstancesCommand_1.ListStackInstancesCommand,\n ListStackResourcesCommand: ListStackResourcesCommand_1.ListStackResourcesCommand,\n ListStacksCommand: ListStacksCommand_1.ListStacksCommand,\n ListStackSetOperationResultsCommand: ListStackSetOperationResultsCommand_1.ListStackSetOperationResultsCommand,\n ListStackSetOperationsCommand: ListStackSetOperationsCommand_1.ListStackSetOperationsCommand,\n ListStackSetsCommand: ListStackSetsCommand_1.ListStackSetsCommand,\n ListTypeRegistrationsCommand: ListTypeRegistrationsCommand_1.ListTypeRegistrationsCommand,\n ListTypesCommand: ListTypesCommand_1.ListTypesCommand,\n ListTypeVersionsCommand: ListTypeVersionsCommand_1.ListTypeVersionsCommand,\n PublishTypeCommand: PublishTypeCommand_1.PublishTypeCommand,\n RecordHandlerProgressCommand: RecordHandlerProgressCommand_1.RecordHandlerProgressCommand,\n RegisterPublisherCommand: RegisterPublisherCommand_1.RegisterPublisherCommand,\n RegisterTypeCommand: RegisterTypeCommand_1.RegisterTypeCommand,\n RollbackStackCommand: RollbackStackCommand_1.RollbackStackCommand,\n SetStackPolicyCommand: SetStackPolicyCommand_1.SetStackPolicyCommand,\n SetTypeConfigurationCommand: SetTypeConfigurationCommand_1.SetTypeConfigurationCommand,\n SetTypeDefaultVersionCommand: SetTypeDefaultVersionCommand_1.SetTypeDefaultVersionCommand,\n SignalResourceCommand: SignalResourceCommand_1.SignalResourceCommand,\n StopStackSetOperationCommand: StopStackSetOperationCommand_1.StopStackSetOperationCommand,\n TestTypeCommand: TestTypeCommand_1.TestTypeCommand,\n UpdateStackCommand: UpdateStackCommand_1.UpdateStackCommand,\n UpdateStackInstancesCommand: UpdateStackInstancesCommand_1.UpdateStackInstancesCommand,\n UpdateStackSetCommand: UpdateStackSetCommand_1.UpdateStackSetCommand,\n UpdateTerminationProtectionCommand: UpdateTerminationProtectionCommand_1.UpdateTerminationProtectionCommand,\n ValidateTemplateCommand: ValidateTemplateCommand_1.ValidateTemplateCommand,\n};\nclass CloudFormation extends CloudFormationClient_1.CloudFormationClient {\n}\nexports.CloudFormation = CloudFormation;\n(0, smithy_client_1.createAggregatedClient)(commands, CloudFormation);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CloudFormationClient = exports.__Client = void 0;\nconst middleware_host_header_1 = require(\"@aws-sdk/middleware-host-header\");\nconst middleware_logger_1 = require(\"@aws-sdk/middleware-logger\");\nconst middleware_recursion_detection_1 = require(\"@aws-sdk/middleware-recursion-detection\");\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_user_agent_1 = require(\"@aws-sdk/middleware-user-agent\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst middleware_content_length_1 = require(\"@smithy/middleware-content-length\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__Client\", { enumerable: true, get: function () { return smithy_client_1.Client; } });\nconst EndpointParameters_1 = require(\"./endpoint/EndpointParameters\");\nconst runtimeConfig_1 = require(\"./runtimeConfig\");\nconst runtimeExtensions_1 = require(\"./runtimeExtensions\");\nclass CloudFormationClient extends smithy_client_1.Client {\n constructor(...[configuration]) {\n const _config_0 = (0, runtimeConfig_1.getRuntimeConfig)(configuration || {});\n const _config_1 = (0, EndpointParameters_1.resolveClientEndpointParameters)(_config_0);\n const _config_2 = (0, config_resolver_1.resolveRegionConfig)(_config_1);\n const _config_3 = (0, middleware_endpoint_1.resolveEndpointConfig)(_config_2);\n const _config_4 = (0, middleware_retry_1.resolveRetryConfig)(_config_3);\n const _config_5 = (0, middleware_host_header_1.resolveHostHeaderConfig)(_config_4);\n const _config_6 = (0, middleware_signing_1.resolveAwsAuthConfig)(_config_5);\n const _config_7 = (0, middleware_user_agent_1.resolveUserAgentConfig)(_config_6);\n const _config_8 = (0, runtimeExtensions_1.resolveRuntimeExtensions)(_config_7, configuration?.extensions || []);\n super(_config_8);\n this.config = _config_8;\n this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));\n this.middlewareStack.use((0, middleware_content_length_1.getContentLengthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_host_header_1.getHostHeaderPlugin)(this.config));\n this.middlewareStack.use((0, middleware_logger_1.getLoggerPlugin)(this.config));\n this.middlewareStack.use((0, middleware_recursion_detection_1.getRecursionDetectionPlugin)(this.config));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));\n }\n destroy() {\n super.destroy();\n }\n}\nexports.CloudFormationClient = CloudFormationClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ActivateOrganizationsAccessCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ActivateOrganizationsAccessCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ActivateOrganizationsAccessCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ActivateOrganizationsAccessCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ActivateOrganizationsAccess\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ActivateOrganizationsAccessCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ActivateOrganizationsAccessCommand)(output, context);\n }\n}\nexports.ActivateOrganizationsAccessCommand = ActivateOrganizationsAccessCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ActivateTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ActivateTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ActivateTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ActivateTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ActivateType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ActivateTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ActivateTypeCommand)(output, context);\n }\n}\nexports.ActivateTypeCommand = ActivateTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BatchDescribeTypeConfigurationsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass BatchDescribeTypeConfigurationsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, BatchDescribeTypeConfigurationsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"BatchDescribeTypeConfigurationsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"BatchDescribeTypeConfigurations\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_BatchDescribeTypeConfigurationsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_BatchDescribeTypeConfigurationsCommand)(output, context);\n }\n}\nexports.BatchDescribeTypeConfigurationsCommand = BatchDescribeTypeConfigurationsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancelUpdateStackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass CancelUpdateStackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CancelUpdateStackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"CancelUpdateStackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"CancelUpdateStack\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_CancelUpdateStackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_CancelUpdateStackCommand)(output, context);\n }\n}\nexports.CancelUpdateStackCommand = CancelUpdateStackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ContinueUpdateRollbackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ContinueUpdateRollbackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ContinueUpdateRollbackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ContinueUpdateRollbackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ContinueUpdateRollback\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ContinueUpdateRollbackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ContinueUpdateRollbackCommand)(output, context);\n }\n}\nexports.ContinueUpdateRollbackCommand = ContinueUpdateRollbackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CreateChangeSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass CreateChangeSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CreateChangeSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"CreateChangeSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"CreateChangeSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_CreateChangeSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_CreateChangeSetCommand)(output, context);\n }\n}\nexports.CreateChangeSetCommand = CreateChangeSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CreateStackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass CreateStackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CreateStackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"CreateStackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"CreateStack\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_CreateStackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_CreateStackCommand)(output, context);\n }\n}\nexports.CreateStackCommand = CreateStackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CreateStackInstancesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass CreateStackInstancesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CreateStackInstancesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"CreateStackInstancesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"CreateStackInstances\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_CreateStackInstancesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_CreateStackInstancesCommand)(output, context);\n }\n}\nexports.CreateStackInstancesCommand = CreateStackInstancesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CreateStackSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass CreateStackSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CreateStackSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"CreateStackSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"CreateStackSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_CreateStackSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_CreateStackSetCommand)(output, context);\n }\n}\nexports.CreateStackSetCommand = CreateStackSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeactivateOrganizationsAccessCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeactivateOrganizationsAccessCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeactivateOrganizationsAccessCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeactivateOrganizationsAccessCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeactivateOrganizationsAccess\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeactivateOrganizationsAccessCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeactivateOrganizationsAccessCommand)(output, context);\n }\n}\nexports.DeactivateOrganizationsAccessCommand = DeactivateOrganizationsAccessCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeactivateTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeactivateTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeactivateTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeactivateTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeactivateType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeactivateTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeactivateTypeCommand)(output, context);\n }\n}\nexports.DeactivateTypeCommand = DeactivateTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteChangeSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeleteChangeSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteChangeSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeleteChangeSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeleteChangeSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeleteChangeSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeleteChangeSetCommand)(output, context);\n }\n}\nexports.DeleteChangeSetCommand = DeleteChangeSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteStackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeleteStackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteStackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeleteStackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeleteStack\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeleteStackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeleteStackCommand)(output, context);\n }\n}\nexports.DeleteStackCommand = DeleteStackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteStackInstancesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeleteStackInstancesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteStackInstancesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeleteStackInstancesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeleteStackInstances\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeleteStackInstancesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeleteStackInstancesCommand)(output, context);\n }\n}\nexports.DeleteStackInstancesCommand = DeleteStackInstancesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteStackSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeleteStackSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteStackSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeleteStackSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeleteStackSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeleteStackSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeleteStackSetCommand)(output, context);\n }\n}\nexports.DeleteStackSetCommand = DeleteStackSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeregisterTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DeregisterTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeregisterTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DeregisterTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DeregisterType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DeregisterTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DeregisterTypeCommand)(output, context);\n }\n}\nexports.DeregisterTypeCommand = DeregisterTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeAccountLimitsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeAccountLimitsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeAccountLimitsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeAccountLimitsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeAccountLimits\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeAccountLimitsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeAccountLimitsCommand)(output, context);\n }\n}\nexports.DescribeAccountLimitsCommand = DescribeAccountLimitsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeChangeSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeChangeSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeChangeSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeChangeSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeChangeSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeChangeSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeChangeSetCommand)(output, context);\n }\n}\nexports.DescribeChangeSetCommand = DescribeChangeSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeChangeSetHooksCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeChangeSetHooksCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeChangeSetHooksCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeChangeSetHooksCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeChangeSetHooks\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeChangeSetHooksCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeChangeSetHooksCommand)(output, context);\n }\n}\nexports.DescribeChangeSetHooksCommand = DescribeChangeSetHooksCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeOrganizationsAccessCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeOrganizationsAccessCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeOrganizationsAccessCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeOrganizationsAccessCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeOrganizationsAccess\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeOrganizationsAccessCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeOrganizationsAccessCommand)(output, context);\n }\n}\nexports.DescribeOrganizationsAccessCommand = DescribeOrganizationsAccessCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribePublisherCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribePublisherCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribePublisherCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribePublisherCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribePublisher\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribePublisherCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribePublisherCommand)(output, context);\n }\n}\nexports.DescribePublisherCommand = DescribePublisherCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackDriftDetectionStatusCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackDriftDetectionStatusCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackDriftDetectionStatusCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackDriftDetectionStatusCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackDriftDetectionStatus\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackDriftDetectionStatusCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackDriftDetectionStatusCommand)(output, context);\n }\n}\nexports.DescribeStackDriftDetectionStatusCommand = DescribeStackDriftDetectionStatusCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackEventsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackEventsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackEventsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackEventsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackEvents\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackEventsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackEventsCommand)(output, context);\n }\n}\nexports.DescribeStackEventsCommand = DescribeStackEventsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackInstanceCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackInstanceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackInstanceCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackInstanceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackInstance\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackInstanceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackInstanceCommand)(output, context);\n }\n}\nexports.DescribeStackInstanceCommand = DescribeStackInstanceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackResourceCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackResourceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackResourceCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackResourceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackResource\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackResourceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackResourceCommand)(output, context);\n }\n}\nexports.DescribeStackResourceCommand = DescribeStackResourceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackResourceDriftsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackResourceDriftsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackResourceDriftsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackResourceDriftsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackResourceDrifts\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackResourceDriftsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackResourceDriftsCommand)(output, context);\n }\n}\nexports.DescribeStackResourceDriftsCommand = DescribeStackResourceDriftsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackResourcesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackResourcesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackResourcesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackResourcesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackResources\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackResourcesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackResourcesCommand)(output, context);\n }\n}\nexports.DescribeStackResourcesCommand = DescribeStackResourcesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackSetCommand)(output, context);\n }\n}\nexports.DescribeStackSetCommand = DescribeStackSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStackSetOperationCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStackSetOperationCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStackSetOperationCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStackSetOperationCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStackSetOperation\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStackSetOperationCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStackSetOperationCommand)(output, context);\n }\n}\nexports.DescribeStackSetOperationCommand = DescribeStackSetOperationCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeStacksCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeStacksCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeStacksCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeStacksCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeStacks\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeStacksCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeStacksCommand)(output, context);\n }\n}\nexports.DescribeStacksCommand = DescribeStacksCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeTypeCommand)(output, context);\n }\n}\nexports.DescribeTypeCommand = DescribeTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeTypeRegistrationCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DescribeTypeRegistrationCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeTypeRegistrationCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DescribeTypeRegistrationCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DescribeTypeRegistration\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DescribeTypeRegistrationCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DescribeTypeRegistrationCommand)(output, context);\n }\n}\nexports.DescribeTypeRegistrationCommand = DescribeTypeRegistrationCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DetectStackDriftCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DetectStackDriftCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DetectStackDriftCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DetectStackDriftCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DetectStackDrift\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DetectStackDriftCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DetectStackDriftCommand)(output, context);\n }\n}\nexports.DetectStackDriftCommand = DetectStackDriftCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DetectStackResourceDriftCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DetectStackResourceDriftCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DetectStackResourceDriftCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DetectStackResourceDriftCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DetectStackResourceDrift\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DetectStackResourceDriftCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DetectStackResourceDriftCommand)(output, context);\n }\n}\nexports.DetectStackResourceDriftCommand = DetectStackResourceDriftCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DetectStackSetDriftCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DetectStackSetDriftCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DetectStackSetDriftCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"DetectStackSetDriftCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"DetectStackSetDrift\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DetectStackSetDriftCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DetectStackSetDriftCommand)(output, context);\n }\n}\nexports.DetectStackSetDriftCommand = DetectStackSetDriftCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EstimateTemplateCostCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass EstimateTemplateCostCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, EstimateTemplateCostCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"EstimateTemplateCostCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"EstimateTemplateCost\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_EstimateTemplateCostCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_EstimateTemplateCostCommand)(output, context);\n }\n}\nexports.EstimateTemplateCostCommand = EstimateTemplateCostCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExecuteChangeSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ExecuteChangeSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ExecuteChangeSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ExecuteChangeSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ExecuteChangeSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ExecuteChangeSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ExecuteChangeSetCommand)(output, context);\n }\n}\nexports.ExecuteChangeSetCommand = ExecuteChangeSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetStackPolicyCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetStackPolicyCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetStackPolicyCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"GetStackPolicyCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"GetStackPolicy\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetStackPolicyCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetStackPolicyCommand)(output, context);\n }\n}\nexports.GetStackPolicyCommand = GetStackPolicyCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetTemplateCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetTemplateCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetTemplateCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"GetTemplateCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"GetTemplate\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetTemplateCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetTemplateCommand)(output, context);\n }\n}\nexports.GetTemplateCommand = GetTemplateCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetTemplateSummaryCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetTemplateSummaryCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetTemplateSummaryCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"GetTemplateSummaryCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"GetTemplateSummary\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetTemplateSummaryCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetTemplateSummaryCommand)(output, context);\n }\n}\nexports.GetTemplateSummaryCommand = GetTemplateSummaryCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ImportStacksToStackSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ImportStacksToStackSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ImportStacksToStackSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ImportStacksToStackSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ImportStacksToStackSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ImportStacksToStackSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ImportStacksToStackSetCommand)(output, context);\n }\n}\nexports.ImportStacksToStackSetCommand = ImportStacksToStackSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListChangeSetsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListChangeSetsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListChangeSetsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListChangeSetsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListChangeSets\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListChangeSetsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListChangeSetsCommand)(output, context);\n }\n}\nexports.ListChangeSetsCommand = ListChangeSetsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListExportsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListExportsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListExportsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListExportsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListExports\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListExportsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListExportsCommand)(output, context);\n }\n}\nexports.ListExportsCommand = ListExportsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListImportsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListImportsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListImportsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListImportsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListImports\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListImportsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListImportsCommand)(output, context);\n }\n}\nexports.ListImportsCommand = ListImportsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackInstanceResourceDriftsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackInstanceResourceDriftsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackInstanceResourceDriftsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackInstanceResourceDriftsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackInstanceResourceDrifts\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackInstanceResourceDriftsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackInstanceResourceDriftsCommand)(output, context);\n }\n}\nexports.ListStackInstanceResourceDriftsCommand = ListStackInstanceResourceDriftsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackInstancesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackInstancesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackInstancesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackInstancesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackInstances\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackInstancesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackInstancesCommand)(output, context);\n }\n}\nexports.ListStackInstancesCommand = ListStackInstancesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackResourcesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackResourcesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackResourcesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackResourcesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackResources\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackResourcesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackResourcesCommand)(output, context);\n }\n}\nexports.ListStackResourcesCommand = ListStackResourcesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackSetOperationResultsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackSetOperationResultsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackSetOperationResultsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackSetOperationResultsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackSetOperationResults\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackSetOperationResultsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackSetOperationResultsCommand)(output, context);\n }\n}\nexports.ListStackSetOperationResultsCommand = ListStackSetOperationResultsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackSetOperationsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackSetOperationsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackSetOperationsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackSetOperationsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackSetOperations\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackSetOperationsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackSetOperationsCommand)(output, context);\n }\n}\nexports.ListStackSetOperationsCommand = ListStackSetOperationsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStackSetsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStackSetsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStackSetsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStackSetsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStackSets\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStackSetsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStackSetsCommand)(output, context);\n }\n}\nexports.ListStackSetsCommand = ListStackSetsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListStacksCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListStacksCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListStacksCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListStacksCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListStacks\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListStacksCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListStacksCommand)(output, context);\n }\n}\nexports.ListStacksCommand = ListStacksCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListTypeRegistrationsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListTypeRegistrationsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListTypeRegistrationsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListTypeRegistrationsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListTypeRegistrations\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListTypeRegistrationsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListTypeRegistrationsCommand)(output, context);\n }\n}\nexports.ListTypeRegistrationsCommand = ListTypeRegistrationsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListTypeVersionsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListTypeVersionsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListTypeVersionsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListTypeVersionsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListTypeVersions\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListTypeVersionsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListTypeVersionsCommand)(output, context);\n }\n}\nexports.ListTypeVersionsCommand = ListTypeVersionsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListTypesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ListTypesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListTypesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ListTypesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ListTypes\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ListTypesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ListTypesCommand)(output, context);\n }\n}\nexports.ListTypesCommand = ListTypesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PublishTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass PublishTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, PublishTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"PublishTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"PublishType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_PublishTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_PublishTypeCommand)(output, context);\n }\n}\nexports.PublishTypeCommand = PublishTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RecordHandlerProgressCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass RecordHandlerProgressCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, RecordHandlerProgressCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"RecordHandlerProgressCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"RecordHandlerProgress\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_RecordHandlerProgressCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_RecordHandlerProgressCommand)(output, context);\n }\n}\nexports.RecordHandlerProgressCommand = RecordHandlerProgressCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RegisterPublisherCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass RegisterPublisherCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, RegisterPublisherCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"RegisterPublisherCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"RegisterPublisher\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_RegisterPublisherCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_RegisterPublisherCommand)(output, context);\n }\n}\nexports.RegisterPublisherCommand = RegisterPublisherCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RegisterTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass RegisterTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, RegisterTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"RegisterTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"RegisterType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_RegisterTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_RegisterTypeCommand)(output, context);\n }\n}\nexports.RegisterTypeCommand = RegisterTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RollbackStackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass RollbackStackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, RollbackStackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"RollbackStackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"RollbackStack\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_RollbackStackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_RollbackStackCommand)(output, context);\n }\n}\nexports.RollbackStackCommand = RollbackStackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SetStackPolicyCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass SetStackPolicyCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SetStackPolicyCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"SetStackPolicyCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"SetStackPolicy\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_SetStackPolicyCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_SetStackPolicyCommand)(output, context);\n }\n}\nexports.SetStackPolicyCommand = SetStackPolicyCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SetTypeConfigurationCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass SetTypeConfigurationCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SetTypeConfigurationCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"SetTypeConfigurationCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"SetTypeConfiguration\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_SetTypeConfigurationCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_SetTypeConfigurationCommand)(output, context);\n }\n}\nexports.SetTypeConfigurationCommand = SetTypeConfigurationCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SetTypeDefaultVersionCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass SetTypeDefaultVersionCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SetTypeDefaultVersionCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"SetTypeDefaultVersionCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"SetTypeDefaultVersion\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_SetTypeDefaultVersionCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_SetTypeDefaultVersionCommand)(output, context);\n }\n}\nexports.SetTypeDefaultVersionCommand = SetTypeDefaultVersionCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SignalResourceCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass SignalResourceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SignalResourceCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"SignalResourceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"SignalResource\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_SignalResourceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_SignalResourceCommand)(output, context);\n }\n}\nexports.SignalResourceCommand = SignalResourceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StopStackSetOperationCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass StopStackSetOperationCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, StopStackSetOperationCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"StopStackSetOperationCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"StopStackSetOperation\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_StopStackSetOperationCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_StopStackSetOperationCommand)(output, context);\n }\n}\nexports.StopStackSetOperationCommand = StopStackSetOperationCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TestTypeCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass TestTypeCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, TestTypeCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"TestTypeCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"TestType\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_TestTypeCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_TestTypeCommand)(output, context);\n }\n}\nexports.TestTypeCommand = TestTypeCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UpdateStackCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass UpdateStackCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UpdateStackCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"UpdateStackCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"UpdateStack\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_UpdateStackCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_UpdateStackCommand)(output, context);\n }\n}\nexports.UpdateStackCommand = UpdateStackCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UpdateStackInstancesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass UpdateStackInstancesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UpdateStackInstancesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"UpdateStackInstancesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"UpdateStackInstances\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_UpdateStackInstancesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_UpdateStackInstancesCommand)(output, context);\n }\n}\nexports.UpdateStackInstancesCommand = UpdateStackInstancesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UpdateStackSetCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass UpdateStackSetCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UpdateStackSetCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"UpdateStackSetCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"UpdateStackSet\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_UpdateStackSetCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_UpdateStackSetCommand)(output, context);\n }\n}\nexports.UpdateStackSetCommand = UpdateStackSetCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UpdateTerminationProtectionCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass UpdateTerminationProtectionCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UpdateTerminationProtectionCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"UpdateTerminationProtectionCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"UpdateTerminationProtection\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_UpdateTerminationProtectionCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_UpdateTerminationProtectionCommand)(output, context);\n }\n}\nexports.UpdateTerminationProtectionCommand = UpdateTerminationProtectionCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ValidateTemplateCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass ValidateTemplateCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ValidateTemplateCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CloudFormationClient\";\n const commandName = \"ValidateTemplateCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"CloudFormation\",\n operation: \"ValidateTemplate\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_ValidateTemplateCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_ValidateTemplateCommand)(output, context);\n }\n}\nexports.ValidateTemplateCommand = ValidateTemplateCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./ActivateOrganizationsAccessCommand\"), exports);\ntslib_1.__exportStar(require(\"./ActivateTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./BatchDescribeTypeConfigurationsCommand\"), exports);\ntslib_1.__exportStar(require(\"./CancelUpdateStackCommand\"), exports);\ntslib_1.__exportStar(require(\"./ContinueUpdateRollbackCommand\"), exports);\ntslib_1.__exportStar(require(\"./CreateChangeSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./CreateStackCommand\"), exports);\ntslib_1.__exportStar(require(\"./CreateStackInstancesCommand\"), exports);\ntslib_1.__exportStar(require(\"./CreateStackSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeactivateOrganizationsAccessCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeactivateTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteChangeSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteStackCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteStackInstancesCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteStackSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeregisterTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeAccountLimitsCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeChangeSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeChangeSetHooksCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeOrganizationsAccessCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribePublisherCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackDriftDetectionStatusCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackEventsCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackInstanceCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackResourceCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackResourceDriftsCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackResourcesCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackSetOperationCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStacksCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeTypeRegistrationCommand\"), exports);\ntslib_1.__exportStar(require(\"./DetectStackDriftCommand\"), exports);\ntslib_1.__exportStar(require(\"./DetectStackResourceDriftCommand\"), exports);\ntslib_1.__exportStar(require(\"./DetectStackSetDriftCommand\"), exports);\ntslib_1.__exportStar(require(\"./EstimateTemplateCostCommand\"), exports);\ntslib_1.__exportStar(require(\"./ExecuteChangeSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetStackPolicyCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetTemplateCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetTemplateSummaryCommand\"), exports);\ntslib_1.__exportStar(require(\"./ImportStacksToStackSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListChangeSetsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListExportsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListImportsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackInstanceResourceDriftsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackInstancesCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackResourcesCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetOperationResultsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetOperationsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListStacksCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListTypeRegistrationsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListTypeVersionsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListTypesCommand\"), exports);\ntslib_1.__exportStar(require(\"./PublishTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./RecordHandlerProgressCommand\"), exports);\ntslib_1.__exportStar(require(\"./RegisterPublisherCommand\"), exports);\ntslib_1.__exportStar(require(\"./RegisterTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./RollbackStackCommand\"), exports);\ntslib_1.__exportStar(require(\"./SetStackPolicyCommand\"), exports);\ntslib_1.__exportStar(require(\"./SetTypeConfigurationCommand\"), exports);\ntslib_1.__exportStar(require(\"./SetTypeDefaultVersionCommand\"), exports);\ntslib_1.__exportStar(require(\"./SignalResourceCommand\"), exports);\ntslib_1.__exportStar(require(\"./StopStackSetOperationCommand\"), exports);\ntslib_1.__exportStar(require(\"./TestTypeCommand\"), exports);\ntslib_1.__exportStar(require(\"./UpdateStackCommand\"), exports);\ntslib_1.__exportStar(require(\"./UpdateStackInstancesCommand\"), exports);\ntslib_1.__exportStar(require(\"./UpdateStackSetCommand\"), exports);\ntslib_1.__exportStar(require(\"./UpdateTerminationProtectionCommand\"), exports);\ntslib_1.__exportStar(require(\"./ValidateTemplateCommand\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveClientEndpointParameters = void 0;\nconst resolveClientEndpointParameters = (options) => {\n return {\n ...options,\n useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n useFipsEndpoint: options.useFipsEndpoint ?? false,\n defaultSigningName: \"cloudformation\",\n };\n};\nexports.resolveClientEndpointParameters = resolveClientEndpointParameters;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultEndpointResolver = void 0;\nconst util_endpoints_1 = require(\"@smithy/util-endpoints\");\nconst ruleset_1 = require(\"./ruleset\");\nconst defaultEndpointResolver = (endpointParams, context = {}) => {\n return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, {\n endpointParams: endpointParams,\n logger: context.logger,\n });\n};\nexports.defaultEndpointResolver = defaultEndpointResolver;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ruleSet = void 0;\nconst u = \"required\", v = \"fn\", w = \"argv\", x = \"ref\";\nconst a = true, b = \"isSet\", c = \"booleanEquals\", d = \"error\", e = \"endpoint\", f = \"tree\", g = \"PartitionResult\", h = \"getAttr\", i = { [u]: false, \"type\": \"String\" }, j = { [u]: true, \"default\": false, \"type\": \"Boolean\" }, k = { [x]: \"Endpoint\" }, l = { [v]: c, [w]: [{ [x]: \"UseFIPS\" }, true] }, m = { [v]: c, [w]: [{ [x]: \"UseDualStack\" }, true] }, n = {}, o = { [v]: h, [w]: [{ [x]: g }, \"supportsFIPS\"] }, p = { [x]: g }, q = { [v]: c, [w]: [true, { [v]: h, [w]: [p, \"supportsDualStack\"] }] }, r = [l], s = [m], t = [{ [x]: \"Region\" }];\nconst _data = { version: \"1.0\", parameters: { Region: i, UseDualStack: j, UseFIPS: j, Endpoint: i }, rules: [{ conditions: [{ [v]: b, [w]: [k] }], rules: [{ conditions: r, error: \"Invalid Configuration: FIPS and custom endpoint are not supported\", type: d }, { conditions: s, error: \"Invalid Configuration: Dualstack and custom endpoint are not supported\", type: d }, { endpoint: { url: k, properties: n, headers: n }, type: e }], type: f }, { conditions: [{ [v]: b, [w]: t }], rules: [{ conditions: [{ [v]: \"aws.partition\", [w]: t, assign: g }], rules: [{ conditions: [l, m], rules: [{ conditions: [{ [v]: c, [w]: [a, o] }, q], rules: [{ endpoint: { url: \"https://cloudformation-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"FIPS and DualStack are enabled, but this partition does not support one or both\", type: d }], type: f }, { conditions: r, rules: [{ conditions: [{ [v]: c, [w]: [o, a] }], rules: [{ conditions: [{ [v]: \"stringEquals\", [w]: [{ [v]: h, [w]: [p, \"name\"] }, \"aws-us-gov\"] }], endpoint: { url: \"https://cloudformation.{Region}.amazonaws.com\", properties: n, headers: n }, type: e }, { endpoint: { url: \"https://cloudformation-fips.{Region}.{PartitionResult#dnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"FIPS is enabled but this partition does not support FIPS\", type: d }], type: f }, { conditions: s, rules: [{ conditions: [q], rules: [{ endpoint: { url: \"https://cloudformation.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"DualStack is enabled but this partition does not support DualStack\", type: d }], type: f }, { endpoint: { url: \"https://cloudformation.{Region}.{PartitionResult#dnsSuffix}\", properties: n, headers: n }, type: e }], type: f }], type: f }, { error: \"Invalid Configuration: Missing Region\", type: d }] };\nexports.ruleSet = _data;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CloudFormationServiceException = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./CloudFormationClient\"), exports);\ntslib_1.__exportStar(require(\"./CloudFormation\"), exports);\ntslib_1.__exportStar(require(\"./commands\"), exports);\ntslib_1.__exportStar(require(\"./pagination\"), exports);\ntslib_1.__exportStar(require(\"./waiters\"), exports);\ntslib_1.__exportStar(require(\"./models\"), exports);\nrequire(\"@aws-sdk/util-endpoints\");\nvar CloudFormationServiceException_1 = require(\"./models/CloudFormationServiceException\");\nObject.defineProperty(exports, \"CloudFormationServiceException\", { enumerable: true, get: function () { return CloudFormationServiceException_1.CloudFormationServiceException; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CloudFormationServiceException = exports.__ServiceException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__ServiceException\", { enumerable: true, get: function () { return smithy_client_1.ServiceException; } });\nclass CloudFormationServiceException extends smithy_client_1.ServiceException {\n constructor(options) {\n super(options);\n Object.setPrototypeOf(this, CloudFormationServiceException.prototype);\n }\n}\nexports.CloudFormationServiceException = CloudFormationServiceException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./models_0\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StackDriftStatus = exports.StackDriftDetectionStatus = exports.PublisherStatus = exports.IdentityProvider = exports.OrganizationStatus = exports.RegistryType = exports.StackSetNotEmptyException = exports.InvalidChangeSetStatusException = exports.NameAlreadyExistsException = exports.PermissionModels = exports.CreatedButModifiedException = exports.StaleRequestException = exports.StackSetNotFoundException = exports.OperationInProgressException = exports.OperationIdAlreadyExistsException = exports.RegionConcurrencyType = exports.ConcurrencyMode = exports.OnFailure = exports.LimitExceededException = exports.InsufficientCapabilitiesException = exports.OnStackFailure = exports.ChangeSetType = exports.ExecutionStatus = exports.ChangeSetStatus = exports.ChangeSetNotFoundException = exports.ChangeSetHooksStatus = exports.HookTargetType = exports.HookInvocationPoint = exports.HookFailureMode = exports.ChangeType = exports.Replacement = exports.RequiresRecreation = exports.ResourceAttribute = exports.EvaluationType = exports.ChangeSource = exports.ChangeAction = exports.Category = exports.Capability = exports.TokenAlreadyExistsException = exports.CallAs = exports.TypeConfigurationNotFoundException = exports.AlreadyExistsException = exports.TypeNotFoundException = exports.CFNRegistryException = exports.VersionBump = exports.ThirdPartyType = exports.OperationNotFoundException = exports.InvalidOperationException = exports.AccountGateStatus = exports.AccountFilterType = void 0;\nexports.ResourceSignalStatus = exports.HandlerErrorCode = exports.OperationStatus = exports.OperationStatusCheckFailedException = exports.InvalidStateTransitionException = exports.StackSetOperationResultStatus = exports.OperationResultFilterName = exports.StackInstanceFilterName = exports.StackNotFoundException = exports.TemplateStage = exports.RegistrationStatus = exports.Visibility = exports.TypeTestsStatus = exports.ProvisioningType = exports.DeprecatedStatus = exports.StackSetOperationStatus = exports.StackSetOperationAction = exports.StackSetStatus = exports.StackSetDriftStatus = exports.StackSetDriftDetectionStatus = exports.StackStatus = exports.DifferenceType = exports.StackResourceDriftStatus = exports.StackInstanceNotFoundException = exports.StackInstanceStatus = exports.StackInstanceDetailedStatus = exports.ResourceStatus = exports.HookStatus = void 0;\nconst CloudFormationServiceException_1 = require(\"./CloudFormationServiceException\");\nexports.AccountFilterType = {\n DIFFERENCE: \"DIFFERENCE\",\n INTERSECTION: \"INTERSECTION\",\n NONE: \"NONE\",\n UNION: \"UNION\",\n};\nexports.AccountGateStatus = {\n FAILED: \"FAILED\",\n SKIPPED: \"SKIPPED\",\n SUCCEEDED: \"SUCCEEDED\",\n};\nclass InvalidOperationException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"InvalidOperationException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidOperationException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidOperationException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.InvalidOperationException = InvalidOperationException;\nclass OperationNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"OperationNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"OperationNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, OperationNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.OperationNotFoundException = OperationNotFoundException;\nexports.ThirdPartyType = {\n HOOK: \"HOOK\",\n MODULE: \"MODULE\",\n RESOURCE: \"RESOURCE\",\n};\nexports.VersionBump = {\n MAJOR: \"MAJOR\",\n MINOR: \"MINOR\",\n};\nclass CFNRegistryException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"CFNRegistryException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"CFNRegistryException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, CFNRegistryException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.CFNRegistryException = CFNRegistryException;\nclass TypeNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"TypeNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"TypeNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, TypeNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.TypeNotFoundException = TypeNotFoundException;\nclass AlreadyExistsException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"AlreadyExistsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"AlreadyExistsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, AlreadyExistsException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.AlreadyExistsException = AlreadyExistsException;\nclass TypeConfigurationNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"TypeConfigurationNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"TypeConfigurationNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, TypeConfigurationNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.TypeConfigurationNotFoundException = TypeConfigurationNotFoundException;\nexports.CallAs = {\n DELEGATED_ADMIN: \"DELEGATED_ADMIN\",\n SELF: \"SELF\",\n};\nclass TokenAlreadyExistsException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"TokenAlreadyExistsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"TokenAlreadyExistsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, TokenAlreadyExistsException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.TokenAlreadyExistsException = TokenAlreadyExistsException;\nexports.Capability = {\n CAPABILITY_AUTO_EXPAND: \"CAPABILITY_AUTO_EXPAND\",\n CAPABILITY_IAM: \"CAPABILITY_IAM\",\n CAPABILITY_NAMED_IAM: \"CAPABILITY_NAMED_IAM\",\n};\nexports.Category = {\n ACTIVATED: \"ACTIVATED\",\n AWS_TYPES: \"AWS_TYPES\",\n REGISTERED: \"REGISTERED\",\n THIRD_PARTY: \"THIRD_PARTY\",\n};\nexports.ChangeAction = {\n Add: \"Add\",\n Dynamic: \"Dynamic\",\n Import: \"Import\",\n Modify: \"Modify\",\n Remove: \"Remove\",\n};\nexports.ChangeSource = {\n Automatic: \"Automatic\",\n DirectModification: \"DirectModification\",\n ParameterReference: \"ParameterReference\",\n ResourceAttribute: \"ResourceAttribute\",\n ResourceReference: \"ResourceReference\",\n};\nexports.EvaluationType = {\n Dynamic: \"Dynamic\",\n Static: \"Static\",\n};\nexports.ResourceAttribute = {\n CreationPolicy: \"CreationPolicy\",\n DeletionPolicy: \"DeletionPolicy\",\n Metadata: \"Metadata\",\n Properties: \"Properties\",\n Tags: \"Tags\",\n UpdatePolicy: \"UpdatePolicy\",\n UpdateReplacePolicy: \"UpdateReplacePolicy\",\n};\nexports.RequiresRecreation = {\n Always: \"Always\",\n Conditionally: \"Conditionally\",\n Never: \"Never\",\n};\nexports.Replacement = {\n Conditional: \"Conditional\",\n False: \"False\",\n True: \"True\",\n};\nexports.ChangeType = {\n Resource: \"Resource\",\n};\nexports.HookFailureMode = {\n FAIL: \"FAIL\",\n WARN: \"WARN\",\n};\nexports.HookInvocationPoint = {\n PRE_PROVISION: \"PRE_PROVISION\",\n};\nexports.HookTargetType = {\n RESOURCE: \"RESOURCE\",\n};\nexports.ChangeSetHooksStatus = {\n PLANNED: \"PLANNED\",\n PLANNING: \"PLANNING\",\n UNAVAILABLE: \"UNAVAILABLE\",\n};\nclass ChangeSetNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"ChangeSetNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ChangeSetNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ChangeSetNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.ChangeSetNotFoundException = ChangeSetNotFoundException;\nexports.ChangeSetStatus = {\n CREATE_COMPLETE: \"CREATE_COMPLETE\",\n CREATE_IN_PROGRESS: \"CREATE_IN_PROGRESS\",\n CREATE_PENDING: \"CREATE_PENDING\",\n DELETE_COMPLETE: \"DELETE_COMPLETE\",\n DELETE_FAILED: \"DELETE_FAILED\",\n DELETE_IN_PROGRESS: \"DELETE_IN_PROGRESS\",\n DELETE_PENDING: \"DELETE_PENDING\",\n FAILED: \"FAILED\",\n};\nexports.ExecutionStatus = {\n AVAILABLE: \"AVAILABLE\",\n EXECUTE_COMPLETE: \"EXECUTE_COMPLETE\",\n EXECUTE_FAILED: \"EXECUTE_FAILED\",\n EXECUTE_IN_PROGRESS: \"EXECUTE_IN_PROGRESS\",\n OBSOLETE: \"OBSOLETE\",\n UNAVAILABLE: \"UNAVAILABLE\",\n};\nexports.ChangeSetType = {\n CREATE: \"CREATE\",\n IMPORT: \"IMPORT\",\n UPDATE: \"UPDATE\",\n};\nexports.OnStackFailure = {\n DELETE: \"DELETE\",\n DO_NOTHING: \"DO_NOTHING\",\n ROLLBACK: \"ROLLBACK\",\n};\nclass InsufficientCapabilitiesException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"InsufficientCapabilitiesException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InsufficientCapabilitiesException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InsufficientCapabilitiesException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.InsufficientCapabilitiesException = InsufficientCapabilitiesException;\nclass LimitExceededException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"LimitExceededException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"LimitExceededException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, LimitExceededException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.LimitExceededException = LimitExceededException;\nexports.OnFailure = {\n DELETE: \"DELETE\",\n DO_NOTHING: \"DO_NOTHING\",\n ROLLBACK: \"ROLLBACK\",\n};\nexports.ConcurrencyMode = {\n SOFT_FAILURE_TOLERANCE: \"SOFT_FAILURE_TOLERANCE\",\n STRICT_FAILURE_TOLERANCE: \"STRICT_FAILURE_TOLERANCE\",\n};\nexports.RegionConcurrencyType = {\n PARALLEL: \"PARALLEL\",\n SEQUENTIAL: \"SEQUENTIAL\",\n};\nclass OperationIdAlreadyExistsException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"OperationIdAlreadyExistsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"OperationIdAlreadyExistsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, OperationIdAlreadyExistsException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.OperationIdAlreadyExistsException = OperationIdAlreadyExistsException;\nclass OperationInProgressException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"OperationInProgressException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"OperationInProgressException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, OperationInProgressException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.OperationInProgressException = OperationInProgressException;\nclass StackSetNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"StackSetNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"StackSetNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, StackSetNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.StackSetNotFoundException = StackSetNotFoundException;\nclass StaleRequestException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"StaleRequestException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"StaleRequestException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, StaleRequestException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.StaleRequestException = StaleRequestException;\nclass CreatedButModifiedException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"CreatedButModifiedException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"CreatedButModifiedException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, CreatedButModifiedException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.CreatedButModifiedException = CreatedButModifiedException;\nexports.PermissionModels = {\n SELF_MANAGED: \"SELF_MANAGED\",\n SERVICE_MANAGED: \"SERVICE_MANAGED\",\n};\nclass NameAlreadyExistsException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"NameAlreadyExistsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"NameAlreadyExistsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, NameAlreadyExistsException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.NameAlreadyExistsException = NameAlreadyExistsException;\nclass InvalidChangeSetStatusException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"InvalidChangeSetStatusException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidChangeSetStatusException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidChangeSetStatusException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.InvalidChangeSetStatusException = InvalidChangeSetStatusException;\nclass StackSetNotEmptyException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"StackSetNotEmptyException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"StackSetNotEmptyException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, StackSetNotEmptyException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.StackSetNotEmptyException = StackSetNotEmptyException;\nexports.RegistryType = {\n HOOK: \"HOOK\",\n MODULE: \"MODULE\",\n RESOURCE: \"RESOURCE\",\n};\nexports.OrganizationStatus = {\n DISABLED: \"DISABLED\",\n DISABLED_PERMANENTLY: \"DISABLED_PERMANENTLY\",\n ENABLED: \"ENABLED\",\n};\nexports.IdentityProvider = {\n AWS_Marketplace: \"AWS_Marketplace\",\n Bitbucket: \"Bitbucket\",\n GitHub: \"GitHub\",\n};\nexports.PublisherStatus = {\n UNVERIFIED: \"UNVERIFIED\",\n VERIFIED: \"VERIFIED\",\n};\nexports.StackDriftDetectionStatus = {\n DETECTION_COMPLETE: \"DETECTION_COMPLETE\",\n DETECTION_FAILED: \"DETECTION_FAILED\",\n DETECTION_IN_PROGRESS: \"DETECTION_IN_PROGRESS\",\n};\nexports.StackDriftStatus = {\n DRIFTED: \"DRIFTED\",\n IN_SYNC: \"IN_SYNC\",\n NOT_CHECKED: \"NOT_CHECKED\",\n UNKNOWN: \"UNKNOWN\",\n};\nexports.HookStatus = {\n HOOK_COMPLETE_FAILED: \"HOOK_COMPLETE_FAILED\",\n HOOK_COMPLETE_SUCCEEDED: \"HOOK_COMPLETE_SUCCEEDED\",\n HOOK_FAILED: \"HOOK_FAILED\",\n HOOK_IN_PROGRESS: \"HOOK_IN_PROGRESS\",\n};\nexports.ResourceStatus = {\n CREATE_COMPLETE: \"CREATE_COMPLETE\",\n CREATE_FAILED: \"CREATE_FAILED\",\n CREATE_IN_PROGRESS: \"CREATE_IN_PROGRESS\",\n DELETE_COMPLETE: \"DELETE_COMPLETE\",\n DELETE_FAILED: \"DELETE_FAILED\",\n DELETE_IN_PROGRESS: \"DELETE_IN_PROGRESS\",\n DELETE_SKIPPED: \"DELETE_SKIPPED\",\n IMPORT_COMPLETE: \"IMPORT_COMPLETE\",\n IMPORT_FAILED: \"IMPORT_FAILED\",\n IMPORT_IN_PROGRESS: \"IMPORT_IN_PROGRESS\",\n IMPORT_ROLLBACK_COMPLETE: \"IMPORT_ROLLBACK_COMPLETE\",\n IMPORT_ROLLBACK_FAILED: \"IMPORT_ROLLBACK_FAILED\",\n IMPORT_ROLLBACK_IN_PROGRESS: \"IMPORT_ROLLBACK_IN_PROGRESS\",\n ROLLBACK_COMPLETE: \"ROLLBACK_COMPLETE\",\n ROLLBACK_FAILED: \"ROLLBACK_FAILED\",\n ROLLBACK_IN_PROGRESS: \"ROLLBACK_IN_PROGRESS\",\n UPDATE_COMPLETE: \"UPDATE_COMPLETE\",\n UPDATE_FAILED: \"UPDATE_FAILED\",\n UPDATE_IN_PROGRESS: \"UPDATE_IN_PROGRESS\",\n UPDATE_ROLLBACK_COMPLETE: \"UPDATE_ROLLBACK_COMPLETE\",\n UPDATE_ROLLBACK_FAILED: \"UPDATE_ROLLBACK_FAILED\",\n UPDATE_ROLLBACK_IN_PROGRESS: \"UPDATE_ROLLBACK_IN_PROGRESS\",\n};\nexports.StackInstanceDetailedStatus = {\n CANCELLED: \"CANCELLED\",\n FAILED: \"FAILED\",\n INOPERABLE: \"INOPERABLE\",\n PENDING: \"PENDING\",\n RUNNING: \"RUNNING\",\n SKIPPED_SUSPENDED_ACCOUNT: \"SKIPPED_SUSPENDED_ACCOUNT\",\n SUCCEEDED: \"SUCCEEDED\",\n};\nexports.StackInstanceStatus = {\n CURRENT: \"CURRENT\",\n INOPERABLE: \"INOPERABLE\",\n OUTDATED: \"OUTDATED\",\n};\nclass StackInstanceNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"StackInstanceNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"StackInstanceNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, StackInstanceNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.StackInstanceNotFoundException = StackInstanceNotFoundException;\nexports.StackResourceDriftStatus = {\n DELETED: \"DELETED\",\n IN_SYNC: \"IN_SYNC\",\n MODIFIED: \"MODIFIED\",\n NOT_CHECKED: \"NOT_CHECKED\",\n};\nexports.DifferenceType = {\n ADD: \"ADD\",\n NOT_EQUAL: \"NOT_EQUAL\",\n REMOVE: \"REMOVE\",\n};\nexports.StackStatus = {\n CREATE_COMPLETE: \"CREATE_COMPLETE\",\n CREATE_FAILED: \"CREATE_FAILED\",\n CREATE_IN_PROGRESS: \"CREATE_IN_PROGRESS\",\n DELETE_COMPLETE: \"DELETE_COMPLETE\",\n DELETE_FAILED: \"DELETE_FAILED\",\n DELETE_IN_PROGRESS: \"DELETE_IN_PROGRESS\",\n IMPORT_COMPLETE: \"IMPORT_COMPLETE\",\n IMPORT_IN_PROGRESS: \"IMPORT_IN_PROGRESS\",\n IMPORT_ROLLBACK_COMPLETE: \"IMPORT_ROLLBACK_COMPLETE\",\n IMPORT_ROLLBACK_FAILED: \"IMPORT_ROLLBACK_FAILED\",\n IMPORT_ROLLBACK_IN_PROGRESS: \"IMPORT_ROLLBACK_IN_PROGRESS\",\n REVIEW_IN_PROGRESS: \"REVIEW_IN_PROGRESS\",\n ROLLBACK_COMPLETE: \"ROLLBACK_COMPLETE\",\n ROLLBACK_FAILED: \"ROLLBACK_FAILED\",\n ROLLBACK_IN_PROGRESS: \"ROLLBACK_IN_PROGRESS\",\n UPDATE_COMPLETE: \"UPDATE_COMPLETE\",\n UPDATE_COMPLETE_CLEANUP_IN_PROGRESS: \"UPDATE_COMPLETE_CLEANUP_IN_PROGRESS\",\n UPDATE_FAILED: \"UPDATE_FAILED\",\n UPDATE_IN_PROGRESS: \"UPDATE_IN_PROGRESS\",\n UPDATE_ROLLBACK_COMPLETE: \"UPDATE_ROLLBACK_COMPLETE\",\n UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS: \"UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS\",\n UPDATE_ROLLBACK_FAILED: \"UPDATE_ROLLBACK_FAILED\",\n UPDATE_ROLLBACK_IN_PROGRESS: \"UPDATE_ROLLBACK_IN_PROGRESS\",\n};\nexports.StackSetDriftDetectionStatus = {\n COMPLETED: \"COMPLETED\",\n FAILED: \"FAILED\",\n IN_PROGRESS: \"IN_PROGRESS\",\n PARTIAL_SUCCESS: \"PARTIAL_SUCCESS\",\n STOPPED: \"STOPPED\",\n};\nexports.StackSetDriftStatus = {\n DRIFTED: \"DRIFTED\",\n IN_SYNC: \"IN_SYNC\",\n NOT_CHECKED: \"NOT_CHECKED\",\n};\nexports.StackSetStatus = {\n ACTIVE: \"ACTIVE\",\n DELETED: \"DELETED\",\n};\nexports.StackSetOperationAction = {\n CREATE: \"CREATE\",\n DELETE: \"DELETE\",\n DETECT_DRIFT: \"DETECT_DRIFT\",\n UPDATE: \"UPDATE\",\n};\nexports.StackSetOperationStatus = {\n FAILED: \"FAILED\",\n QUEUED: \"QUEUED\",\n RUNNING: \"RUNNING\",\n STOPPED: \"STOPPED\",\n STOPPING: \"STOPPING\",\n SUCCEEDED: \"SUCCEEDED\",\n};\nexports.DeprecatedStatus = {\n DEPRECATED: \"DEPRECATED\",\n LIVE: \"LIVE\",\n};\nexports.ProvisioningType = {\n FULLY_MUTABLE: \"FULLY_MUTABLE\",\n IMMUTABLE: \"IMMUTABLE\",\n NON_PROVISIONABLE: \"NON_PROVISIONABLE\",\n};\nexports.TypeTestsStatus = {\n FAILED: \"FAILED\",\n IN_PROGRESS: \"IN_PROGRESS\",\n NOT_TESTED: \"NOT_TESTED\",\n PASSED: \"PASSED\",\n};\nexports.Visibility = {\n PRIVATE: \"PRIVATE\",\n PUBLIC: \"PUBLIC\",\n};\nexports.RegistrationStatus = {\n COMPLETE: \"COMPLETE\",\n FAILED: \"FAILED\",\n IN_PROGRESS: \"IN_PROGRESS\",\n};\nexports.TemplateStage = {\n Original: \"Original\",\n Processed: \"Processed\",\n};\nclass StackNotFoundException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"StackNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"StackNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, StackNotFoundException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.StackNotFoundException = StackNotFoundException;\nexports.StackInstanceFilterName = {\n DETAILED_STATUS: \"DETAILED_STATUS\",\n DRIFT_STATUS: \"DRIFT_STATUS\",\n LAST_OPERATION_ID: \"LAST_OPERATION_ID\",\n};\nexports.OperationResultFilterName = {\n OPERATION_RESULT_STATUS: \"OPERATION_RESULT_STATUS\",\n};\nexports.StackSetOperationResultStatus = {\n CANCELLED: \"CANCELLED\",\n FAILED: \"FAILED\",\n PENDING: \"PENDING\",\n RUNNING: \"RUNNING\",\n SUCCEEDED: \"SUCCEEDED\",\n};\nclass InvalidStateTransitionException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"InvalidStateTransitionException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidStateTransitionException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidStateTransitionException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.InvalidStateTransitionException = InvalidStateTransitionException;\nclass OperationStatusCheckFailedException extends CloudFormationServiceException_1.CloudFormationServiceException {\n constructor(opts) {\n super({\n name: \"OperationStatusCheckFailedException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"OperationStatusCheckFailedException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, OperationStatusCheckFailedException.prototype);\n this.Message = opts.Message;\n }\n}\nexports.OperationStatusCheckFailedException = OperationStatusCheckFailedException;\nexports.OperationStatus = {\n FAILED: \"FAILED\",\n IN_PROGRESS: \"IN_PROGRESS\",\n PENDING: \"PENDING\",\n SUCCESS: \"SUCCESS\",\n};\nexports.HandlerErrorCode = {\n AccessDenied: \"AccessDenied\",\n AlreadyExists: \"AlreadyExists\",\n GeneralServiceException: \"GeneralServiceException\",\n HandlerInternalFailure: \"HandlerInternalFailure\",\n InternalFailure: \"InternalFailure\",\n InvalidCredentials: \"InvalidCredentials\",\n InvalidRequest: \"InvalidRequest\",\n InvalidTypeConfiguration: \"InvalidTypeConfiguration\",\n NetworkFailure: \"NetworkFailure\",\n NonCompliant: \"NonCompliant\",\n NotFound: \"NotFound\",\n NotUpdatable: \"NotUpdatable\",\n ResourceConflict: \"ResourceConflict\",\n ServiceInternalError: \"ServiceInternalError\",\n ServiceLimitExceeded: \"ServiceLimitExceeded\",\n ServiceTimeout: \"NotStabilized\",\n Throttling: \"Throttling\",\n Unknown: \"Unknown\",\n UnsupportedTarget: \"UnsupportedTarget\",\n};\nexports.ResourceSignalStatus = {\n FAILURE: \"FAILURE\",\n SUCCESS: \"SUCCESS\",\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateDescribeAccountLimits = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst DescribeAccountLimitsCommand_1 = require(\"../commands/DescribeAccountLimitsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new DescribeAccountLimitsCommand_1.DescribeAccountLimitsCommand(input), ...args);\n};\nasync function* paginateDescribeAccountLimits(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateDescribeAccountLimits = paginateDescribeAccountLimits;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateDescribeStackEvents = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst DescribeStackEventsCommand_1 = require(\"../commands/DescribeStackEventsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new DescribeStackEventsCommand_1.DescribeStackEventsCommand(input), ...args);\n};\nasync function* paginateDescribeStackEvents(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateDescribeStackEvents = paginateDescribeStackEvents;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateDescribeStackResourceDrifts = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst DescribeStackResourceDriftsCommand_1 = require(\"../commands/DescribeStackResourceDriftsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new DescribeStackResourceDriftsCommand_1.DescribeStackResourceDriftsCommand(input), ...args);\n};\nasync function* paginateDescribeStackResourceDrifts(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateDescribeStackResourceDrifts = paginateDescribeStackResourceDrifts;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateDescribeStacks = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input), ...args);\n};\nasync function* paginateDescribeStacks(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateDescribeStacks = paginateDescribeStacks;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListChangeSets = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListChangeSetsCommand_1 = require(\"../commands/ListChangeSetsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListChangeSetsCommand_1.ListChangeSetsCommand(input), ...args);\n};\nasync function* paginateListChangeSets(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListChangeSets = paginateListChangeSets;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListExports = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListExportsCommand_1 = require(\"../commands/ListExportsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListExportsCommand_1.ListExportsCommand(input), ...args);\n};\nasync function* paginateListExports(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListExports = paginateListExports;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListImports = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListImportsCommand_1 = require(\"../commands/ListImportsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListImportsCommand_1.ListImportsCommand(input), ...args);\n};\nasync function* paginateListImports(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListImports = paginateListImports;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStackInstances = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStackInstancesCommand_1 = require(\"../commands/ListStackInstancesCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStackInstancesCommand_1.ListStackInstancesCommand(input), ...args);\n};\nasync function* paginateListStackInstances(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStackInstances = paginateListStackInstances;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStackResources = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStackResourcesCommand_1 = require(\"../commands/ListStackResourcesCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStackResourcesCommand_1.ListStackResourcesCommand(input), ...args);\n};\nasync function* paginateListStackResources(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStackResources = paginateListStackResources;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStackSetOperationResults = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStackSetOperationResultsCommand_1 = require(\"../commands/ListStackSetOperationResultsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStackSetOperationResultsCommand_1.ListStackSetOperationResultsCommand(input), ...args);\n};\nasync function* paginateListStackSetOperationResults(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStackSetOperationResults = paginateListStackSetOperationResults;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStackSetOperations = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStackSetOperationsCommand_1 = require(\"../commands/ListStackSetOperationsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStackSetOperationsCommand_1.ListStackSetOperationsCommand(input), ...args);\n};\nasync function* paginateListStackSetOperations(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStackSetOperations = paginateListStackSetOperations;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStackSets = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStackSetsCommand_1 = require(\"../commands/ListStackSetsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStackSetsCommand_1.ListStackSetsCommand(input), ...args);\n};\nasync function* paginateListStackSets(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStackSets = paginateListStackSets;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListStacks = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListStacksCommand_1 = require(\"../commands/ListStacksCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListStacksCommand_1.ListStacksCommand(input), ...args);\n};\nasync function* paginateListStacks(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListStacks = paginateListStacks;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListTypeRegistrations = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListTypeRegistrationsCommand_1 = require(\"../commands/ListTypeRegistrationsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListTypeRegistrationsCommand_1.ListTypeRegistrationsCommand(input), ...args);\n};\nasync function* paginateListTypeRegistrations(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListTypeRegistrations = paginateListTypeRegistrations;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListTypeVersions = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListTypeVersionsCommand_1 = require(\"../commands/ListTypeVersionsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListTypeVersionsCommand_1.ListTypeVersionsCommand(input), ...args);\n};\nasync function* paginateListTypeVersions(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListTypeVersions = paginateListTypeVersions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListTypes = void 0;\nconst CloudFormationClient_1 = require(\"../CloudFormationClient\");\nconst ListTypesCommand_1 = require(\"../commands/ListTypesCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListTypesCommand_1.ListTypesCommand(input), ...args);\n};\nasync function* paginateListTypes(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CloudFormationClient_1.CloudFormationClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CloudFormation | CloudFormationClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListTypes = paginateListTypes;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./DescribeAccountLimitsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackEventsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStackResourceDriftsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./DescribeStacksPaginator\"), exports);\ntslib_1.__exportStar(require(\"./Interfaces\"), exports);\ntslib_1.__exportStar(require(\"./ListChangeSetsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListExportsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListImportsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStackInstancesPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStackResourcesPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetOperationResultsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetOperationsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStackSetsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListStacksPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListTypeRegistrationsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListTypeVersionsPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListTypesPaginator\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.se_ListStackSetOperationsCommand = exports.se_ListStackSetOperationResultsCommand = exports.se_ListStacksCommand = exports.se_ListStackResourcesCommand = exports.se_ListStackInstancesCommand = exports.se_ListStackInstanceResourceDriftsCommand = exports.se_ListImportsCommand = exports.se_ListExportsCommand = exports.se_ListChangeSetsCommand = exports.se_ImportStacksToStackSetCommand = exports.se_GetTemplateSummaryCommand = exports.se_GetTemplateCommand = exports.se_GetStackPolicyCommand = exports.se_ExecuteChangeSetCommand = exports.se_EstimateTemplateCostCommand = exports.se_DetectStackSetDriftCommand = exports.se_DetectStackResourceDriftCommand = exports.se_DetectStackDriftCommand = exports.se_DescribeTypeRegistrationCommand = exports.se_DescribeTypeCommand = exports.se_DescribeStackSetOperationCommand = exports.se_DescribeStackSetCommand = exports.se_DescribeStacksCommand = exports.se_DescribeStackResourcesCommand = exports.se_DescribeStackResourceDriftsCommand = exports.se_DescribeStackResourceCommand = exports.se_DescribeStackInstanceCommand = exports.se_DescribeStackEventsCommand = exports.se_DescribeStackDriftDetectionStatusCommand = exports.se_DescribePublisherCommand = exports.se_DescribeOrganizationsAccessCommand = exports.se_DescribeChangeSetHooksCommand = exports.se_DescribeChangeSetCommand = exports.se_DescribeAccountLimitsCommand = exports.se_DeregisterTypeCommand = exports.se_DeleteStackSetCommand = exports.se_DeleteStackInstancesCommand = exports.se_DeleteStackCommand = exports.se_DeleteChangeSetCommand = exports.se_DeactivateTypeCommand = exports.se_DeactivateOrganizationsAccessCommand = exports.se_CreateStackSetCommand = exports.se_CreateStackInstancesCommand = exports.se_CreateStackCommand = exports.se_CreateChangeSetCommand = exports.se_ContinueUpdateRollbackCommand = exports.se_CancelUpdateStackCommand = exports.se_BatchDescribeTypeConfigurationsCommand = exports.se_ActivateTypeCommand = exports.se_ActivateOrganizationsAccessCommand = void 0;\nexports.de_DescribeStackSetOperationCommand = exports.de_DescribeStackSetCommand = exports.de_DescribeStacksCommand = exports.de_DescribeStackResourcesCommand = exports.de_DescribeStackResourceDriftsCommand = exports.de_DescribeStackResourceCommand = exports.de_DescribeStackInstanceCommand = exports.de_DescribeStackEventsCommand = exports.de_DescribeStackDriftDetectionStatusCommand = exports.de_DescribePublisherCommand = exports.de_DescribeOrganizationsAccessCommand = exports.de_DescribeChangeSetHooksCommand = exports.de_DescribeChangeSetCommand = exports.de_DescribeAccountLimitsCommand = exports.de_DeregisterTypeCommand = exports.de_DeleteStackSetCommand = exports.de_DeleteStackInstancesCommand = exports.de_DeleteStackCommand = exports.de_DeleteChangeSetCommand = exports.de_DeactivateTypeCommand = exports.de_DeactivateOrganizationsAccessCommand = exports.de_CreateStackSetCommand = exports.de_CreateStackInstancesCommand = exports.de_CreateStackCommand = exports.de_CreateChangeSetCommand = exports.de_ContinueUpdateRollbackCommand = exports.de_CancelUpdateStackCommand = exports.de_BatchDescribeTypeConfigurationsCommand = exports.de_ActivateTypeCommand = exports.de_ActivateOrganizationsAccessCommand = exports.se_ValidateTemplateCommand = exports.se_UpdateTerminationProtectionCommand = exports.se_UpdateStackSetCommand = exports.se_UpdateStackInstancesCommand = exports.se_UpdateStackCommand = exports.se_TestTypeCommand = exports.se_StopStackSetOperationCommand = exports.se_SignalResourceCommand = exports.se_SetTypeDefaultVersionCommand = exports.se_SetTypeConfigurationCommand = exports.se_SetStackPolicyCommand = exports.se_RollbackStackCommand = exports.se_RegisterTypeCommand = exports.se_RegisterPublisherCommand = exports.se_RecordHandlerProgressCommand = exports.se_PublishTypeCommand = exports.se_ListTypeVersionsCommand = exports.se_ListTypesCommand = exports.se_ListTypeRegistrationsCommand = exports.se_ListStackSetsCommand = void 0;\nexports.de_ValidateTemplateCommand = exports.de_UpdateTerminationProtectionCommand = exports.de_UpdateStackSetCommand = exports.de_UpdateStackInstancesCommand = exports.de_UpdateStackCommand = exports.de_TestTypeCommand = exports.de_StopStackSetOperationCommand = exports.de_SignalResourceCommand = exports.de_SetTypeDefaultVersionCommand = exports.de_SetTypeConfigurationCommand = exports.de_SetStackPolicyCommand = exports.de_RollbackStackCommand = exports.de_RegisterTypeCommand = exports.de_RegisterPublisherCommand = exports.de_RecordHandlerProgressCommand = exports.de_PublishTypeCommand = exports.de_ListTypeVersionsCommand = exports.de_ListTypesCommand = exports.de_ListTypeRegistrationsCommand = exports.de_ListStackSetsCommand = exports.de_ListStackSetOperationsCommand = exports.de_ListStackSetOperationResultsCommand = exports.de_ListStacksCommand = exports.de_ListStackResourcesCommand = exports.de_ListStackInstancesCommand = exports.de_ListStackInstanceResourceDriftsCommand = exports.de_ListImportsCommand = exports.de_ListExportsCommand = exports.de_ListChangeSetsCommand = exports.de_ImportStacksToStackSetCommand = exports.de_GetTemplateSummaryCommand = exports.de_GetTemplateCommand = exports.de_GetStackPolicyCommand = exports.de_ExecuteChangeSetCommand = exports.de_EstimateTemplateCostCommand = exports.de_DetectStackSetDriftCommand = exports.de_DetectStackResourceDriftCommand = exports.de_DetectStackDriftCommand = exports.de_DescribeTypeRegistrationCommand = exports.de_DescribeTypeCommand = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst fast_xml_parser_1 = require(\"fast-xml-parser\");\nconst uuid_1 = require(\"uuid\");\nconst CloudFormationServiceException_1 = require(\"../models/CloudFormationServiceException\");\nconst models_0_1 = require(\"../models/models_0\");\nconst se_ActivateOrganizationsAccessCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ActivateOrganizationsAccessInput(input, context),\n Action: \"ActivateOrganizationsAccess\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ActivateOrganizationsAccessCommand = se_ActivateOrganizationsAccessCommand;\nconst se_ActivateTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ActivateTypeInput(input, context),\n Action: \"ActivateType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ActivateTypeCommand = se_ActivateTypeCommand;\nconst se_BatchDescribeTypeConfigurationsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_BatchDescribeTypeConfigurationsInput(input, context),\n Action: \"BatchDescribeTypeConfigurations\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_BatchDescribeTypeConfigurationsCommand = se_BatchDescribeTypeConfigurationsCommand;\nconst se_CancelUpdateStackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_CancelUpdateStackInput(input, context),\n Action: \"CancelUpdateStack\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CancelUpdateStackCommand = se_CancelUpdateStackCommand;\nconst se_ContinueUpdateRollbackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ContinueUpdateRollbackInput(input, context),\n Action: \"ContinueUpdateRollback\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ContinueUpdateRollbackCommand = se_ContinueUpdateRollbackCommand;\nconst se_CreateChangeSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_CreateChangeSetInput(input, context),\n Action: \"CreateChangeSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CreateChangeSetCommand = se_CreateChangeSetCommand;\nconst se_CreateStackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_CreateStackInput(input, context),\n Action: \"CreateStack\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CreateStackCommand = se_CreateStackCommand;\nconst se_CreateStackInstancesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_CreateStackInstancesInput(input, context),\n Action: \"CreateStackInstances\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CreateStackInstancesCommand = se_CreateStackInstancesCommand;\nconst se_CreateStackSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_CreateStackSetInput(input, context),\n Action: \"CreateStackSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CreateStackSetCommand = se_CreateStackSetCommand;\nconst se_DeactivateOrganizationsAccessCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeactivateOrganizationsAccessInput(input, context),\n Action: \"DeactivateOrganizationsAccess\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeactivateOrganizationsAccessCommand = se_DeactivateOrganizationsAccessCommand;\nconst se_DeactivateTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeactivateTypeInput(input, context),\n Action: \"DeactivateType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeactivateTypeCommand = se_DeactivateTypeCommand;\nconst se_DeleteChangeSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeleteChangeSetInput(input, context),\n Action: \"DeleteChangeSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteChangeSetCommand = se_DeleteChangeSetCommand;\nconst se_DeleteStackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeleteStackInput(input, context),\n Action: \"DeleteStack\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteStackCommand = se_DeleteStackCommand;\nconst se_DeleteStackInstancesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeleteStackInstancesInput(input, context),\n Action: \"DeleteStackInstances\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteStackInstancesCommand = se_DeleteStackInstancesCommand;\nconst se_DeleteStackSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeleteStackSetInput(input, context),\n Action: \"DeleteStackSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteStackSetCommand = se_DeleteStackSetCommand;\nconst se_DeregisterTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DeregisterTypeInput(input, context),\n Action: \"DeregisterType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeregisterTypeCommand = se_DeregisterTypeCommand;\nconst se_DescribeAccountLimitsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeAccountLimitsInput(input, context),\n Action: \"DescribeAccountLimits\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeAccountLimitsCommand = se_DescribeAccountLimitsCommand;\nconst se_DescribeChangeSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeChangeSetInput(input, context),\n Action: \"DescribeChangeSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeChangeSetCommand = se_DescribeChangeSetCommand;\nconst se_DescribeChangeSetHooksCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeChangeSetHooksInput(input, context),\n Action: \"DescribeChangeSetHooks\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeChangeSetHooksCommand = se_DescribeChangeSetHooksCommand;\nconst se_DescribeOrganizationsAccessCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeOrganizationsAccessInput(input, context),\n Action: \"DescribeOrganizationsAccess\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeOrganizationsAccessCommand = se_DescribeOrganizationsAccessCommand;\nconst se_DescribePublisherCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribePublisherInput(input, context),\n Action: \"DescribePublisher\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribePublisherCommand = se_DescribePublisherCommand;\nconst se_DescribeStackDriftDetectionStatusCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackDriftDetectionStatusInput(input, context),\n Action: \"DescribeStackDriftDetectionStatus\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackDriftDetectionStatusCommand = se_DescribeStackDriftDetectionStatusCommand;\nconst se_DescribeStackEventsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackEventsInput(input, context),\n Action: \"DescribeStackEvents\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackEventsCommand = se_DescribeStackEventsCommand;\nconst se_DescribeStackInstanceCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackInstanceInput(input, context),\n Action: \"DescribeStackInstance\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackInstanceCommand = se_DescribeStackInstanceCommand;\nconst se_DescribeStackResourceCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackResourceInput(input, context),\n Action: \"DescribeStackResource\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackResourceCommand = se_DescribeStackResourceCommand;\nconst se_DescribeStackResourceDriftsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackResourceDriftsInput(input, context),\n Action: \"DescribeStackResourceDrifts\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackResourceDriftsCommand = se_DescribeStackResourceDriftsCommand;\nconst se_DescribeStackResourcesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackResourcesInput(input, context),\n Action: \"DescribeStackResources\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackResourcesCommand = se_DescribeStackResourcesCommand;\nconst se_DescribeStacksCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStacksInput(input, context),\n Action: \"DescribeStacks\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStacksCommand = se_DescribeStacksCommand;\nconst se_DescribeStackSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackSetInput(input, context),\n Action: \"DescribeStackSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackSetCommand = se_DescribeStackSetCommand;\nconst se_DescribeStackSetOperationCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeStackSetOperationInput(input, context),\n Action: \"DescribeStackSetOperation\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeStackSetOperationCommand = se_DescribeStackSetOperationCommand;\nconst se_DescribeTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeTypeInput(input, context),\n Action: \"DescribeType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeTypeCommand = se_DescribeTypeCommand;\nconst se_DescribeTypeRegistrationCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DescribeTypeRegistrationInput(input, context),\n Action: \"DescribeTypeRegistration\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeTypeRegistrationCommand = se_DescribeTypeRegistrationCommand;\nconst se_DetectStackDriftCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DetectStackDriftInput(input, context),\n Action: \"DetectStackDrift\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DetectStackDriftCommand = se_DetectStackDriftCommand;\nconst se_DetectStackResourceDriftCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DetectStackResourceDriftInput(input, context),\n Action: \"DetectStackResourceDrift\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DetectStackResourceDriftCommand = se_DetectStackResourceDriftCommand;\nconst se_DetectStackSetDriftCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DetectStackSetDriftInput(input, context),\n Action: \"DetectStackSetDrift\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DetectStackSetDriftCommand = se_DetectStackSetDriftCommand;\nconst se_EstimateTemplateCostCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_EstimateTemplateCostInput(input, context),\n Action: \"EstimateTemplateCost\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_EstimateTemplateCostCommand = se_EstimateTemplateCostCommand;\nconst se_ExecuteChangeSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ExecuteChangeSetInput(input, context),\n Action: \"ExecuteChangeSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ExecuteChangeSetCommand = se_ExecuteChangeSetCommand;\nconst se_GetStackPolicyCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetStackPolicyInput(input, context),\n Action: \"GetStackPolicy\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetStackPolicyCommand = se_GetStackPolicyCommand;\nconst se_GetTemplateCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetTemplateInput(input, context),\n Action: \"GetTemplate\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetTemplateCommand = se_GetTemplateCommand;\nconst se_GetTemplateSummaryCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetTemplateSummaryInput(input, context),\n Action: \"GetTemplateSummary\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetTemplateSummaryCommand = se_GetTemplateSummaryCommand;\nconst se_ImportStacksToStackSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ImportStacksToStackSetInput(input, context),\n Action: \"ImportStacksToStackSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ImportStacksToStackSetCommand = se_ImportStacksToStackSetCommand;\nconst se_ListChangeSetsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListChangeSetsInput(input, context),\n Action: \"ListChangeSets\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListChangeSetsCommand = se_ListChangeSetsCommand;\nconst se_ListExportsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListExportsInput(input, context),\n Action: \"ListExports\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListExportsCommand = se_ListExportsCommand;\nconst se_ListImportsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListImportsInput(input, context),\n Action: \"ListImports\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListImportsCommand = se_ListImportsCommand;\nconst se_ListStackInstanceResourceDriftsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackInstanceResourceDriftsInput(input, context),\n Action: \"ListStackInstanceResourceDrifts\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackInstanceResourceDriftsCommand = se_ListStackInstanceResourceDriftsCommand;\nconst se_ListStackInstancesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackInstancesInput(input, context),\n Action: \"ListStackInstances\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackInstancesCommand = se_ListStackInstancesCommand;\nconst se_ListStackResourcesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackResourcesInput(input, context),\n Action: \"ListStackResources\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackResourcesCommand = se_ListStackResourcesCommand;\nconst se_ListStacksCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStacksInput(input, context),\n Action: \"ListStacks\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStacksCommand = se_ListStacksCommand;\nconst se_ListStackSetOperationResultsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackSetOperationResultsInput(input, context),\n Action: \"ListStackSetOperationResults\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackSetOperationResultsCommand = se_ListStackSetOperationResultsCommand;\nconst se_ListStackSetOperationsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackSetOperationsInput(input, context),\n Action: \"ListStackSetOperations\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackSetOperationsCommand = se_ListStackSetOperationsCommand;\nconst se_ListStackSetsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListStackSetsInput(input, context),\n Action: \"ListStackSets\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListStackSetsCommand = se_ListStackSetsCommand;\nconst se_ListTypeRegistrationsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListTypeRegistrationsInput(input, context),\n Action: \"ListTypeRegistrations\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListTypeRegistrationsCommand = se_ListTypeRegistrationsCommand;\nconst se_ListTypesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListTypesInput(input, context),\n Action: \"ListTypes\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListTypesCommand = se_ListTypesCommand;\nconst se_ListTypeVersionsCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ListTypeVersionsInput(input, context),\n Action: \"ListTypeVersions\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListTypeVersionsCommand = se_ListTypeVersionsCommand;\nconst se_PublishTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_PublishTypeInput(input, context),\n Action: \"PublishType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_PublishTypeCommand = se_PublishTypeCommand;\nconst se_RecordHandlerProgressCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_RecordHandlerProgressInput(input, context),\n Action: \"RecordHandlerProgress\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_RecordHandlerProgressCommand = se_RecordHandlerProgressCommand;\nconst se_RegisterPublisherCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_RegisterPublisherInput(input, context),\n Action: \"RegisterPublisher\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_RegisterPublisherCommand = se_RegisterPublisherCommand;\nconst se_RegisterTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_RegisterTypeInput(input, context),\n Action: \"RegisterType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_RegisterTypeCommand = se_RegisterTypeCommand;\nconst se_RollbackStackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_RollbackStackInput(input, context),\n Action: \"RollbackStack\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_RollbackStackCommand = se_RollbackStackCommand;\nconst se_SetStackPolicyCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_SetStackPolicyInput(input, context),\n Action: \"SetStackPolicy\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SetStackPolicyCommand = se_SetStackPolicyCommand;\nconst se_SetTypeConfigurationCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_SetTypeConfigurationInput(input, context),\n Action: \"SetTypeConfiguration\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SetTypeConfigurationCommand = se_SetTypeConfigurationCommand;\nconst se_SetTypeDefaultVersionCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_SetTypeDefaultVersionInput(input, context),\n Action: \"SetTypeDefaultVersion\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SetTypeDefaultVersionCommand = se_SetTypeDefaultVersionCommand;\nconst se_SignalResourceCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_SignalResourceInput(input, context),\n Action: \"SignalResource\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SignalResourceCommand = se_SignalResourceCommand;\nconst se_StopStackSetOperationCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_StopStackSetOperationInput(input, context),\n Action: \"StopStackSetOperation\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_StopStackSetOperationCommand = se_StopStackSetOperationCommand;\nconst se_TestTypeCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_TestTypeInput(input, context),\n Action: \"TestType\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_TestTypeCommand = se_TestTypeCommand;\nconst se_UpdateStackCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_UpdateStackInput(input, context),\n Action: \"UpdateStack\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UpdateStackCommand = se_UpdateStackCommand;\nconst se_UpdateStackInstancesCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_UpdateStackInstancesInput(input, context),\n Action: \"UpdateStackInstances\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UpdateStackInstancesCommand = se_UpdateStackInstancesCommand;\nconst se_UpdateStackSetCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_UpdateStackSetInput(input, context),\n Action: \"UpdateStackSet\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UpdateStackSetCommand = se_UpdateStackSetCommand;\nconst se_UpdateTerminationProtectionCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_UpdateTerminationProtectionInput(input, context),\n Action: \"UpdateTerminationProtection\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UpdateTerminationProtectionCommand = se_UpdateTerminationProtectionCommand;\nconst se_ValidateTemplateCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_ValidateTemplateInput(input, context),\n Action: \"ValidateTemplate\",\n Version: \"2010-05-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ValidateTemplateCommand = se_ValidateTemplateCommand;\nconst de_ActivateOrganizationsAccessCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ActivateOrganizationsAccessCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ActivateOrganizationsAccessOutput(data.ActivateOrganizationsAccessResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ActivateOrganizationsAccessCommand = de_ActivateOrganizationsAccessCommand;\nconst de_ActivateOrganizationsAccessCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ActivateTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ActivateTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ActivateTypeOutput(data.ActivateTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ActivateTypeCommand = de_ActivateTypeCommand;\nconst de_ActivateTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_BatchDescribeTypeConfigurationsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_BatchDescribeTypeConfigurationsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_BatchDescribeTypeConfigurationsOutput(data.BatchDescribeTypeConfigurationsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_BatchDescribeTypeConfigurationsCommand = de_BatchDescribeTypeConfigurationsCommand;\nconst de_BatchDescribeTypeConfigurationsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeConfigurationNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeConfigurationNotFoundException\":\n throw await de_TypeConfigurationNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_CancelUpdateStackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CancelUpdateStackCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_CancelUpdateStackCommand = de_CancelUpdateStackCommand;\nconst de_CancelUpdateStackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ContinueUpdateRollbackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ContinueUpdateRollbackCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ContinueUpdateRollbackOutput(data.ContinueUpdateRollbackResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ContinueUpdateRollbackCommand = de_ContinueUpdateRollbackCommand;\nconst de_ContinueUpdateRollbackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_CreateChangeSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CreateChangeSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_CreateChangeSetOutput(data.CreateChangeSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_CreateChangeSetCommand = de_CreateChangeSetCommand;\nconst de_CreateChangeSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"AlreadyExistsException\":\n case \"com.amazonaws.cloudformation#AlreadyExistsException\":\n throw await de_AlreadyExistsExceptionRes(parsedOutput, context);\n case \"InsufficientCapabilitiesException\":\n case \"com.amazonaws.cloudformation#InsufficientCapabilitiesException\":\n throw await de_InsufficientCapabilitiesExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cloudformation#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_CreateStackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CreateStackCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_CreateStackOutput(data.CreateStackResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_CreateStackCommand = de_CreateStackCommand;\nconst de_CreateStackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"AlreadyExistsException\":\n case \"com.amazonaws.cloudformation#AlreadyExistsException\":\n throw await de_AlreadyExistsExceptionRes(parsedOutput, context);\n case \"InsufficientCapabilitiesException\":\n case \"com.amazonaws.cloudformation#InsufficientCapabilitiesException\":\n throw await de_InsufficientCapabilitiesExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cloudformation#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_CreateStackInstancesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CreateStackInstancesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_CreateStackInstancesOutput(data.CreateStackInstancesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_CreateStackInstancesCommand = de_CreateStackInstancesCommand;\nconst de_CreateStackInstancesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cloudformation#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"OperationIdAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#OperationIdAlreadyExistsException\":\n throw await de_OperationIdAlreadyExistsExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n case \"StaleRequestException\":\n case \"com.amazonaws.cloudformation#StaleRequestException\":\n throw await de_StaleRequestExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_CreateStackSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CreateStackSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_CreateStackSetOutput(data.CreateStackSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_CreateStackSetCommand = de_CreateStackSetCommand;\nconst de_CreateStackSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CreatedButModifiedException\":\n case \"com.amazonaws.cloudformation#CreatedButModifiedException\":\n throw await de_CreatedButModifiedExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cloudformation#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"NameAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#NameAlreadyExistsException\":\n throw await de_NameAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeactivateOrganizationsAccessCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeactivateOrganizationsAccessCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeactivateOrganizationsAccessOutput(data.DeactivateOrganizationsAccessResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeactivateOrganizationsAccessCommand = de_DeactivateOrganizationsAccessCommand;\nconst de_DeactivateOrganizationsAccessCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeactivateTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeactivateTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeactivateTypeOutput(data.DeactivateTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeactivateTypeCommand = de_DeactivateTypeCommand;\nconst de_DeactivateTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeleteChangeSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteChangeSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeleteChangeSetOutput(data.DeleteChangeSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeleteChangeSetCommand = de_DeleteChangeSetCommand;\nconst de_DeleteChangeSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidChangeSetStatus\":\n case \"com.amazonaws.cloudformation#InvalidChangeSetStatusException\":\n throw await de_InvalidChangeSetStatusExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeleteStackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteStackCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_DeleteStackCommand = de_DeleteStackCommand;\nconst de_DeleteStackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeleteStackInstancesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteStackInstancesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeleteStackInstancesOutput(data.DeleteStackInstancesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeleteStackInstancesCommand = de_DeleteStackInstancesCommand;\nconst de_DeleteStackInstancesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationIdAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#OperationIdAlreadyExistsException\":\n throw await de_OperationIdAlreadyExistsExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n case \"StaleRequestException\":\n case \"com.amazonaws.cloudformation#StaleRequestException\":\n throw await de_StaleRequestExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeleteStackSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteStackSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeleteStackSetOutput(data.DeleteStackSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeleteStackSetCommand = de_DeleteStackSetCommand;\nconst de_DeleteStackSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackSetNotEmptyException\":\n case \"com.amazonaws.cloudformation#StackSetNotEmptyException\":\n throw await de_StackSetNotEmptyExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DeregisterTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeregisterTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DeregisterTypeOutput(data.DeregisterTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeregisterTypeCommand = de_DeregisterTypeCommand;\nconst de_DeregisterTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeAccountLimitsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeAccountLimitsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeAccountLimitsOutput(data.DescribeAccountLimitsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeAccountLimitsCommand = de_DescribeAccountLimitsCommand;\nconst de_DescribeAccountLimitsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeChangeSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeChangeSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeChangeSetOutput(data.DescribeChangeSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeChangeSetCommand = de_DescribeChangeSetCommand;\nconst de_DescribeChangeSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ChangeSetNotFound\":\n case \"com.amazonaws.cloudformation#ChangeSetNotFoundException\":\n throw await de_ChangeSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeChangeSetHooksCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeChangeSetHooksCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeChangeSetHooksOutput(data.DescribeChangeSetHooksResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeChangeSetHooksCommand = de_DescribeChangeSetHooksCommand;\nconst de_DescribeChangeSetHooksCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ChangeSetNotFound\":\n case \"com.amazonaws.cloudformation#ChangeSetNotFoundException\":\n throw await de_ChangeSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeOrganizationsAccessCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeOrganizationsAccessCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeOrganizationsAccessOutput(data.DescribeOrganizationsAccessResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeOrganizationsAccessCommand = de_DescribeOrganizationsAccessCommand;\nconst de_DescribeOrganizationsAccessCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribePublisherCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribePublisherCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribePublisherOutput(data.DescribePublisherResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribePublisherCommand = de_DescribePublisherCommand;\nconst de_DescribePublisherCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeStackDriftDetectionStatusCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackDriftDetectionStatusCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackDriftDetectionStatusOutput(data.DescribeStackDriftDetectionStatusResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackDriftDetectionStatusCommand = de_DescribeStackDriftDetectionStatusCommand;\nconst de_DescribeStackDriftDetectionStatusCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStackEventsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackEventsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackEventsOutput(data.DescribeStackEventsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackEventsCommand = de_DescribeStackEventsCommand;\nconst de_DescribeStackEventsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStackInstanceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackInstanceCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackInstanceOutput(data.DescribeStackInstanceResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackInstanceCommand = de_DescribeStackInstanceCommand;\nconst de_DescribeStackInstanceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"StackInstanceNotFoundException\":\n case \"com.amazonaws.cloudformation#StackInstanceNotFoundException\":\n throw await de_StackInstanceNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeStackResourceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackResourceCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackResourceOutput(data.DescribeStackResourceResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackResourceCommand = de_DescribeStackResourceCommand;\nconst de_DescribeStackResourceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStackResourceDriftsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackResourceDriftsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackResourceDriftsOutput(data.DescribeStackResourceDriftsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackResourceDriftsCommand = de_DescribeStackResourceDriftsCommand;\nconst de_DescribeStackResourceDriftsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStackResourcesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackResourcesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackResourcesOutput(data.DescribeStackResourcesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackResourcesCommand = de_DescribeStackResourcesCommand;\nconst de_DescribeStackResourcesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStacksCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStacksCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStacksOutput(data.DescribeStacksResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStacksCommand = de_DescribeStacksCommand;\nconst de_DescribeStacksCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DescribeStackSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackSetOutput(data.DescribeStackSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackSetCommand = de_DescribeStackSetCommand;\nconst de_DescribeStackSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeStackSetOperationCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeStackSetOperationCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeStackSetOperationOutput(data.DescribeStackSetOperationResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeStackSetOperationCommand = de_DescribeStackSetOperationCommand;\nconst de_DescribeStackSetOperationCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeTypeOutput(data.DescribeTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeTypeCommand = de_DescribeTypeCommand;\nconst de_DescribeTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DescribeTypeRegistrationCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeTypeRegistrationCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DescribeTypeRegistrationOutput(data.DescribeTypeRegistrationResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeTypeRegistrationCommand = de_DescribeTypeRegistrationCommand;\nconst de_DescribeTypeRegistrationCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DetectStackDriftCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DetectStackDriftCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DetectStackDriftOutput(data.DetectStackDriftResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DetectStackDriftCommand = de_DetectStackDriftCommand;\nconst de_DetectStackDriftCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DetectStackResourceDriftCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DetectStackResourceDriftCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DetectStackResourceDriftOutput(data.DetectStackResourceDriftResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DetectStackResourceDriftCommand = de_DetectStackResourceDriftCommand;\nconst de_DetectStackResourceDriftCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_DetectStackSetDriftCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DetectStackSetDriftCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DetectStackSetDriftOutput(data.DetectStackSetDriftResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DetectStackSetDriftCommand = de_DetectStackSetDriftCommand;\nconst de_DetectStackSetDriftCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_EstimateTemplateCostCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_EstimateTemplateCostCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_EstimateTemplateCostOutput(data.EstimateTemplateCostResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_EstimateTemplateCostCommand = de_EstimateTemplateCostCommand;\nconst de_EstimateTemplateCostCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ExecuteChangeSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ExecuteChangeSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ExecuteChangeSetOutput(data.ExecuteChangeSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ExecuteChangeSetCommand = de_ExecuteChangeSetCommand;\nconst de_ExecuteChangeSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ChangeSetNotFound\":\n case \"com.amazonaws.cloudformation#ChangeSetNotFoundException\":\n throw await de_ChangeSetNotFoundExceptionRes(parsedOutput, context);\n case \"InsufficientCapabilitiesException\":\n case \"com.amazonaws.cloudformation#InsufficientCapabilitiesException\":\n throw await de_InsufficientCapabilitiesExceptionRes(parsedOutput, context);\n case \"InvalidChangeSetStatus\":\n case \"com.amazonaws.cloudformation#InvalidChangeSetStatusException\":\n throw await de_InvalidChangeSetStatusExceptionRes(parsedOutput, context);\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_GetStackPolicyCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetStackPolicyCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetStackPolicyOutput(data.GetStackPolicyResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetStackPolicyCommand = de_GetStackPolicyCommand;\nconst de_GetStackPolicyCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_GetTemplateCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetTemplateCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetTemplateOutput(data.GetTemplateResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetTemplateCommand = de_GetTemplateCommand;\nconst de_GetTemplateCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ChangeSetNotFound\":\n case \"com.amazonaws.cloudformation#ChangeSetNotFoundException\":\n throw await de_ChangeSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_GetTemplateSummaryCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetTemplateSummaryCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetTemplateSummaryOutput(data.GetTemplateSummaryResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetTemplateSummaryCommand = de_GetTemplateSummaryCommand;\nconst de_GetTemplateSummaryCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ImportStacksToStackSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ImportStacksToStackSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ImportStacksToStackSetOutput(data.ImportStacksToStackSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ImportStacksToStackSetCommand = de_ImportStacksToStackSetCommand;\nconst de_ImportStacksToStackSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cloudformation#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"OperationIdAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#OperationIdAlreadyExistsException\":\n throw await de_OperationIdAlreadyExistsExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackNotFoundException\":\n case \"com.amazonaws.cloudformation#StackNotFoundException\":\n throw await de_StackNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n case \"StaleRequestException\":\n case \"com.amazonaws.cloudformation#StaleRequestException\":\n throw await de_StaleRequestExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListChangeSetsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListChangeSetsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListChangeSetsOutput(data.ListChangeSetsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListChangeSetsCommand = de_ListChangeSetsCommand;\nconst de_ListChangeSetsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListExportsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListExportsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListExportsOutput(data.ListExportsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListExportsCommand = de_ListExportsCommand;\nconst de_ListExportsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListImportsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListImportsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListImportsOutput(data.ListImportsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListImportsCommand = de_ListImportsCommand;\nconst de_ListImportsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListStackInstanceResourceDriftsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackInstanceResourceDriftsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackInstanceResourceDriftsOutput(data.ListStackInstanceResourceDriftsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackInstanceResourceDriftsCommand = de_ListStackInstanceResourceDriftsCommand;\nconst de_ListStackInstanceResourceDriftsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n case \"StackInstanceNotFoundException\":\n case \"com.amazonaws.cloudformation#StackInstanceNotFoundException\":\n throw await de_StackInstanceNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListStackInstancesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackInstancesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackInstancesOutput(data.ListStackInstancesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackInstancesCommand = de_ListStackInstancesCommand;\nconst de_ListStackInstancesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListStackResourcesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackResourcesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackResourcesOutput(data.ListStackResourcesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackResourcesCommand = de_ListStackResourcesCommand;\nconst de_ListStackResourcesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListStacksCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStacksCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStacksOutput(data.ListStacksResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStacksCommand = de_ListStacksCommand;\nconst de_ListStacksCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListStackSetOperationResultsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackSetOperationResultsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackSetOperationResultsOutput(data.ListStackSetOperationResultsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackSetOperationResultsCommand = de_ListStackSetOperationResultsCommand;\nconst de_ListStackSetOperationResultsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListStackSetOperationsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackSetOperationsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackSetOperationsOutput(data.ListStackSetOperationsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackSetOperationsCommand = de_ListStackSetOperationsCommand;\nconst de_ListStackSetOperationsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListStackSetsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListStackSetsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListStackSetsOutput(data.ListStackSetsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListStackSetsCommand = de_ListStackSetsCommand;\nconst de_ListStackSetsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ListTypeRegistrationsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListTypeRegistrationsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListTypeRegistrationsOutput(data.ListTypeRegistrationsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListTypeRegistrationsCommand = de_ListTypeRegistrationsCommand;\nconst de_ListTypeRegistrationsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListTypesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListTypesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListTypesOutput(data.ListTypesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListTypesCommand = de_ListTypesCommand;\nconst de_ListTypesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ListTypeVersionsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListTypeVersionsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListTypeVersionsOutput(data.ListTypeVersionsResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListTypeVersionsCommand = de_ListTypeVersionsCommand;\nconst de_ListTypeVersionsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_PublishTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_PublishTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_PublishTypeOutput(data.PublishTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_PublishTypeCommand = de_PublishTypeCommand;\nconst de_PublishTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_RecordHandlerProgressCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_RecordHandlerProgressCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_RecordHandlerProgressOutput(data.RecordHandlerProgressResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_RecordHandlerProgressCommand = de_RecordHandlerProgressCommand;\nconst de_RecordHandlerProgressCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ConditionalCheckFailed\":\n case \"com.amazonaws.cloudformation#OperationStatusCheckFailedException\":\n throw await de_OperationStatusCheckFailedExceptionRes(parsedOutput, context);\n case \"InvalidStateTransition\":\n case \"com.amazonaws.cloudformation#InvalidStateTransitionException\":\n throw await de_InvalidStateTransitionExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_RegisterPublisherCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_RegisterPublisherCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_RegisterPublisherOutput(data.RegisterPublisherResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_RegisterPublisherCommand = de_RegisterPublisherCommand;\nconst de_RegisterPublisherCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_RegisterTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_RegisterTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_RegisterTypeOutput(data.RegisterTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_RegisterTypeCommand = de_RegisterTypeCommand;\nconst de_RegisterTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_RollbackStackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_RollbackStackCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_RollbackStackOutput(data.RollbackStackResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_RollbackStackCommand = de_RollbackStackCommand;\nconst de_RollbackStackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_SetStackPolicyCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SetStackPolicyCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_SetStackPolicyCommand = de_SetStackPolicyCommand;\nconst de_SetStackPolicyCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_SetTypeConfigurationCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SetTypeConfigurationCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_SetTypeConfigurationOutput(data.SetTypeConfigurationResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_SetTypeConfigurationCommand = de_SetTypeConfigurationCommand;\nconst de_SetTypeConfigurationCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_SetTypeDefaultVersionCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SetTypeDefaultVersionCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_SetTypeDefaultVersionOutput(data.SetTypeDefaultVersionResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_SetTypeDefaultVersionCommand = de_SetTypeDefaultVersionCommand;\nconst de_SetTypeDefaultVersionCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_SignalResourceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SignalResourceCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_SignalResourceCommand = de_SignalResourceCommand;\nconst de_SignalResourceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_StopStackSetOperationCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_StopStackSetOperationCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_StopStackSetOperationOutput(data.StopStackSetOperationResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_StopStackSetOperationCommand = de_StopStackSetOperationCommand;\nconst de_StopStackSetOperationCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationNotFoundException\":\n case \"com.amazonaws.cloudformation#OperationNotFoundException\":\n throw await de_OperationNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_TestTypeCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_TestTypeCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_TestTypeOutput(data.TestTypeResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_TestTypeCommand = de_TestTypeCommand;\nconst de_TestTypeCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"CFNRegistryException\":\n case \"com.amazonaws.cloudformation#CFNRegistryException\":\n throw await de_CFNRegistryExceptionRes(parsedOutput, context);\n case \"TypeNotFoundException\":\n case \"com.amazonaws.cloudformation#TypeNotFoundException\":\n throw await de_TypeNotFoundExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_UpdateStackCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UpdateStackCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_UpdateStackOutput(data.UpdateStackResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UpdateStackCommand = de_UpdateStackCommand;\nconst de_UpdateStackCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InsufficientCapabilitiesException\":\n case \"com.amazonaws.cloudformation#InsufficientCapabilitiesException\":\n throw await de_InsufficientCapabilitiesExceptionRes(parsedOutput, context);\n case \"TokenAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#TokenAlreadyExistsException\":\n throw await de_TokenAlreadyExistsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_UpdateStackInstancesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UpdateStackInstancesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_UpdateStackInstancesOutput(data.UpdateStackInstancesResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UpdateStackInstancesCommand = de_UpdateStackInstancesCommand;\nconst de_UpdateStackInstancesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationIdAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#OperationIdAlreadyExistsException\":\n throw await de_OperationIdAlreadyExistsExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackInstanceNotFoundException\":\n case \"com.amazonaws.cloudformation#StackInstanceNotFoundException\":\n throw await de_StackInstanceNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n case \"StaleRequestException\":\n case \"com.amazonaws.cloudformation#StaleRequestException\":\n throw await de_StaleRequestExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_UpdateStackSetCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UpdateStackSetCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_UpdateStackSetOutput(data.UpdateStackSetResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UpdateStackSetCommand = de_UpdateStackSetCommand;\nconst de_UpdateStackSetCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidOperationException\":\n case \"com.amazonaws.cloudformation#InvalidOperationException\":\n throw await de_InvalidOperationExceptionRes(parsedOutput, context);\n case \"OperationIdAlreadyExistsException\":\n case \"com.amazonaws.cloudformation#OperationIdAlreadyExistsException\":\n throw await de_OperationIdAlreadyExistsExceptionRes(parsedOutput, context);\n case \"OperationInProgressException\":\n case \"com.amazonaws.cloudformation#OperationInProgressException\":\n throw await de_OperationInProgressExceptionRes(parsedOutput, context);\n case \"StackInstanceNotFoundException\":\n case \"com.amazonaws.cloudformation#StackInstanceNotFoundException\":\n throw await de_StackInstanceNotFoundExceptionRes(parsedOutput, context);\n case \"StackSetNotFoundException\":\n case \"com.amazonaws.cloudformation#StackSetNotFoundException\":\n throw await de_StackSetNotFoundExceptionRes(parsedOutput, context);\n case \"StaleRequestException\":\n case \"com.amazonaws.cloudformation#StaleRequestException\":\n throw await de_StaleRequestExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_UpdateTerminationProtectionCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UpdateTerminationProtectionCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_UpdateTerminationProtectionOutput(data.UpdateTerminationProtectionResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UpdateTerminationProtectionCommand = de_UpdateTerminationProtectionCommand;\nconst de_UpdateTerminationProtectionCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_ValidateTemplateCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ValidateTemplateCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ValidateTemplateOutput(data.ValidateTemplateResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ValidateTemplateCommand = de_ValidateTemplateCommand;\nconst de_ValidateTemplateCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_AlreadyExistsExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_AlreadyExistsException(body.Error, context);\n const exception = new models_0_1.AlreadyExistsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_CFNRegistryExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_CFNRegistryException(body.Error, context);\n const exception = new models_0_1.CFNRegistryException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_ChangeSetNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_ChangeSetNotFoundException(body.Error, context);\n const exception = new models_0_1.ChangeSetNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_CreatedButModifiedExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_CreatedButModifiedException(body.Error, context);\n const exception = new models_0_1.CreatedButModifiedException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InsufficientCapabilitiesExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InsufficientCapabilitiesException(body.Error, context);\n const exception = new models_0_1.InsufficientCapabilitiesException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidChangeSetStatusExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InvalidChangeSetStatusException(body.Error, context);\n const exception = new models_0_1.InvalidChangeSetStatusException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidOperationExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InvalidOperationException(body.Error, context);\n const exception = new models_0_1.InvalidOperationException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidStateTransitionExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InvalidStateTransitionException(body.Error, context);\n const exception = new models_0_1.InvalidStateTransitionException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_LimitExceededExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_LimitExceededException(body.Error, context);\n const exception = new models_0_1.LimitExceededException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_NameAlreadyExistsExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_NameAlreadyExistsException(body.Error, context);\n const exception = new models_0_1.NameAlreadyExistsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_OperationIdAlreadyExistsExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_OperationIdAlreadyExistsException(body.Error, context);\n const exception = new models_0_1.OperationIdAlreadyExistsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_OperationInProgressExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_OperationInProgressException(body.Error, context);\n const exception = new models_0_1.OperationInProgressException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_OperationNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_OperationNotFoundException(body.Error, context);\n const exception = new models_0_1.OperationNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_OperationStatusCheckFailedExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_OperationStatusCheckFailedException(body.Error, context);\n const exception = new models_0_1.OperationStatusCheckFailedException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_StackInstanceNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_StackInstanceNotFoundException(body.Error, context);\n const exception = new models_0_1.StackInstanceNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_StackNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_StackNotFoundException(body.Error, context);\n const exception = new models_0_1.StackNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_StackSetNotEmptyExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_StackSetNotEmptyException(body.Error, context);\n const exception = new models_0_1.StackSetNotEmptyException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_StackSetNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_StackSetNotFoundException(body.Error, context);\n const exception = new models_0_1.StackSetNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_StaleRequestExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_StaleRequestException(body.Error, context);\n const exception = new models_0_1.StaleRequestException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_TokenAlreadyExistsExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_TokenAlreadyExistsException(body.Error, context);\n const exception = new models_0_1.TokenAlreadyExistsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_TypeConfigurationNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_TypeConfigurationNotFoundException(body.Error, context);\n const exception = new models_0_1.TypeConfigurationNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_TypeNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_TypeNotFoundException(body.Error, context);\n const exception = new models_0_1.TypeNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst se_AccountList = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_ActivateOrganizationsAccessInput = (input, context) => {\n const entries = {};\n return entries;\n};\nconst se_ActivateTypeInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.PublicTypeArn != null) {\n entries[\"PublicTypeArn\"] = input.PublicTypeArn;\n }\n if (input.PublisherId != null) {\n entries[\"PublisherId\"] = input.PublisherId;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.TypeNameAlias != null) {\n entries[\"TypeNameAlias\"] = input.TypeNameAlias;\n }\n if (input.AutoUpdate != null) {\n entries[\"AutoUpdate\"] = input.AutoUpdate;\n }\n if (input.LoggingConfig != null) {\n const memberEntries = se_LoggingConfig(input.LoggingConfig, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `LoggingConfig.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ExecutionRoleArn != null) {\n entries[\"ExecutionRoleArn\"] = input.ExecutionRoleArn;\n }\n if (input.VersionBump != null) {\n entries[\"VersionBump\"] = input.VersionBump;\n }\n if (input.MajorVersion != null) {\n entries[\"MajorVersion\"] = input.MajorVersion;\n }\n return entries;\n};\nconst se_AutoDeployment = (input, context) => {\n const entries = {};\n if (input.Enabled != null) {\n entries[\"Enabled\"] = input.Enabled;\n }\n if (input.RetainStacksOnAccountRemoval != null) {\n entries[\"RetainStacksOnAccountRemoval\"] = input.RetainStacksOnAccountRemoval;\n }\n return entries;\n};\nconst se_BatchDescribeTypeConfigurationsInput = (input, context) => {\n const entries = {};\n if (input.TypeConfigurationIdentifiers != null) {\n const memberEntries = se_TypeConfigurationIdentifiers(input.TypeConfigurationIdentifiers, context);\n if (input.TypeConfigurationIdentifiers?.length === 0) {\n entries.TypeConfigurationIdentifiers = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `TypeConfigurationIdentifiers.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_CancelUpdateStackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n return entries;\n};\nconst se_Capabilities = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_ContinueUpdateRollbackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.ResourcesToSkip != null) {\n const memberEntries = se_ResourcesToSkip(input.ResourcesToSkip, context);\n if (input.ResourcesToSkip?.length === 0) {\n entries.ResourcesToSkip = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourcesToSkip.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n return entries;\n};\nconst se_CreateChangeSetInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.UsePreviousTemplate != null) {\n entries[\"UsePreviousTemplate\"] = input.UsePreviousTemplate;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Capabilities != null) {\n const memberEntries = se_Capabilities(input.Capabilities, context);\n if (input.Capabilities?.length === 0) {\n entries.Capabilities = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Capabilities.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ResourceTypes != null) {\n const memberEntries = se_ResourceTypes(input.ResourceTypes, context);\n if (input.ResourceTypes?.length === 0) {\n entries.ResourceTypes = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourceTypes.${key}`;\n entries[loc] = value;\n });\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.RollbackConfiguration != null) {\n const memberEntries = se_RollbackConfiguration(input.RollbackConfiguration, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RollbackConfiguration.${key}`;\n entries[loc] = value;\n });\n }\n if (input.NotificationARNs != null) {\n const memberEntries = se_NotificationARNs(input.NotificationARNs, context);\n if (input.NotificationARNs?.length === 0) {\n entries.NotificationARNs = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `NotificationARNs.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Tags != null) {\n const memberEntries = se_Tags(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.ClientToken != null) {\n entries[\"ClientToken\"] = input.ClientToken;\n }\n if (input.Description != null) {\n entries[\"Description\"] = input.Description;\n }\n if (input.ChangeSetType != null) {\n entries[\"ChangeSetType\"] = input.ChangeSetType;\n }\n if (input.ResourcesToImport != null) {\n const memberEntries = se_ResourcesToImport(input.ResourcesToImport, context);\n if (input.ResourcesToImport?.length === 0) {\n entries.ResourcesToImport = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourcesToImport.${key}`;\n entries[loc] = value;\n });\n }\n if (input.IncludeNestedStacks != null) {\n entries[\"IncludeNestedStacks\"] = input.IncludeNestedStacks;\n }\n if (input.OnStackFailure != null) {\n entries[\"OnStackFailure\"] = input.OnStackFailure;\n }\n return entries;\n};\nconst se_CreateStackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DisableRollback != null) {\n entries[\"DisableRollback\"] = input.DisableRollback;\n }\n if (input.RollbackConfiguration != null) {\n const memberEntries = se_RollbackConfiguration(input.RollbackConfiguration, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RollbackConfiguration.${key}`;\n entries[loc] = value;\n });\n }\n if (input.TimeoutInMinutes != null) {\n entries[\"TimeoutInMinutes\"] = input.TimeoutInMinutes;\n }\n if (input.NotificationARNs != null) {\n const memberEntries = se_NotificationARNs(input.NotificationARNs, context);\n if (input.NotificationARNs?.length === 0) {\n entries.NotificationARNs = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `NotificationARNs.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Capabilities != null) {\n const memberEntries = se_Capabilities(input.Capabilities, context);\n if (input.Capabilities?.length === 0) {\n entries.Capabilities = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Capabilities.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ResourceTypes != null) {\n const memberEntries = se_ResourceTypes(input.ResourceTypes, context);\n if (input.ResourceTypes?.length === 0) {\n entries.ResourceTypes = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourceTypes.${key}`;\n entries[loc] = value;\n });\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.OnFailure != null) {\n entries[\"OnFailure\"] = input.OnFailure;\n }\n if (input.StackPolicyBody != null) {\n entries[\"StackPolicyBody\"] = input.StackPolicyBody;\n }\n if (input.StackPolicyURL != null) {\n entries[\"StackPolicyURL\"] = input.StackPolicyURL;\n }\n if (input.Tags != null) {\n const memberEntries = se_Tags(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n if (input.EnableTerminationProtection != null) {\n entries[\"EnableTerminationProtection\"] = input.EnableTerminationProtection;\n }\n if (input.RetainExceptOnCreate != null) {\n entries[\"RetainExceptOnCreate\"] = input.RetainExceptOnCreate;\n }\n return entries;\n};\nconst se_CreateStackInstancesInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.Accounts != null) {\n const memberEntries = se_AccountList(input.Accounts, context);\n if (input.Accounts?.length === 0) {\n entries.Accounts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Accounts.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DeploymentTargets != null) {\n const memberEntries = se_DeploymentTargets(input.DeploymentTargets, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `DeploymentTargets.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Regions != null) {\n const memberEntries = se_RegionList(input.Regions, context);\n if (input.Regions?.length === 0) {\n entries.Regions = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Regions.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ParameterOverrides != null) {\n const memberEntries = se_Parameters(input.ParameterOverrides, context);\n if (input.ParameterOverrides?.length === 0) {\n entries.ParameterOverrides = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ParameterOverrides.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_CreateStackSetInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.Description != null) {\n entries[\"Description\"] = input.Description;\n }\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.StackId != null) {\n entries[\"StackId\"] = input.StackId;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Capabilities != null) {\n const memberEntries = se_Capabilities(input.Capabilities, context);\n if (input.Capabilities?.length === 0) {\n entries.Capabilities = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Capabilities.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Tags != null) {\n const memberEntries = se_Tags(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.AdministrationRoleARN != null) {\n entries[\"AdministrationRoleARN\"] = input.AdministrationRoleARN;\n }\n if (input.ExecutionRoleName != null) {\n entries[\"ExecutionRoleName\"] = input.ExecutionRoleName;\n }\n if (input.PermissionModel != null) {\n entries[\"PermissionModel\"] = input.PermissionModel;\n }\n if (input.AutoDeployment != null) {\n const memberEntries = se_AutoDeployment(input.AutoDeployment, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `AutoDeployment.${key}`;\n entries[loc] = value;\n });\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n if (input.ClientRequestToken === undefined) {\n input.ClientRequestToken = (0, uuid_1.v4)();\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n if (input.ManagedExecution != null) {\n const memberEntries = se_ManagedExecution(input.ManagedExecution, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ManagedExecution.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_DeactivateOrganizationsAccessInput = (input, context) => {\n const entries = {};\n return entries;\n};\nconst se_DeactivateTypeInput = (input, context) => {\n const entries = {};\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n return entries;\n};\nconst se_DeleteChangeSetInput = (input, context) => {\n const entries = {};\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n return entries;\n};\nconst se_DeleteStackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.RetainResources != null) {\n const memberEntries = se_RetainResources(input.RetainResources, context);\n if (input.RetainResources?.length === 0) {\n entries.RetainResources = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RetainResources.${key}`;\n entries[loc] = value;\n });\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n return entries;\n};\nconst se_DeleteStackInstancesInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.Accounts != null) {\n const memberEntries = se_AccountList(input.Accounts, context);\n if (input.Accounts?.length === 0) {\n entries.Accounts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Accounts.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DeploymentTargets != null) {\n const memberEntries = se_DeploymentTargets(input.DeploymentTargets, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `DeploymentTargets.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Regions != null) {\n const memberEntries = se_RegionList(input.Regions, context);\n if (input.Regions?.length === 0) {\n entries.Regions = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Regions.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.RetainStacks != null) {\n entries[\"RetainStacks\"] = input.RetainStacks;\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DeleteStackSetInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DeploymentTargets = (input, context) => {\n const entries = {};\n if (input.Accounts != null) {\n const memberEntries = se_AccountList(input.Accounts, context);\n if (input.Accounts?.length === 0) {\n entries.Accounts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Accounts.${key}`;\n entries[loc] = value;\n });\n }\n if (input.AccountsUrl != null) {\n entries[\"AccountsUrl\"] = input.AccountsUrl;\n }\n if (input.OrganizationalUnitIds != null) {\n const memberEntries = se_OrganizationalUnitIdList(input.OrganizationalUnitIds, context);\n if (input.OrganizationalUnitIds?.length === 0) {\n entries.OrganizationalUnitIds = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OrganizationalUnitIds.${key}`;\n entries[loc] = value;\n });\n }\n if (input.AccountFilterType != null) {\n entries[\"AccountFilterType\"] = input.AccountFilterType;\n }\n return entries;\n};\nconst se_DeregisterTypeInput = (input, context) => {\n const entries = {};\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.VersionId != null) {\n entries[\"VersionId\"] = input.VersionId;\n }\n return entries;\n};\nconst se_DescribeAccountLimitsInput = (input, context) => {\n const entries = {};\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_DescribeChangeSetHooksInput = (input, context) => {\n const entries = {};\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n return entries;\n};\nconst se_DescribeChangeSetInput = (input, context) => {\n const entries = {};\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_DescribeOrganizationsAccessInput = (input, context) => {\n const entries = {};\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DescribePublisherInput = (input, context) => {\n const entries = {};\n if (input.PublisherId != null) {\n entries[\"PublisherId\"] = input.PublisherId;\n }\n return entries;\n};\nconst se_DescribeStackDriftDetectionStatusInput = (input, context) => {\n const entries = {};\n if (input.StackDriftDetectionId != null) {\n entries[\"StackDriftDetectionId\"] = input.StackDriftDetectionId;\n }\n return entries;\n};\nconst se_DescribeStackEventsInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_DescribeStackInstanceInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.StackInstanceAccount != null) {\n entries[\"StackInstanceAccount\"] = input.StackInstanceAccount;\n }\n if (input.StackInstanceRegion != null) {\n entries[\"StackInstanceRegion\"] = input.StackInstanceRegion;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DescribeStackResourceDriftsInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.StackResourceDriftStatusFilters != null) {\n const memberEntries = se_StackResourceDriftStatusFilters(input.StackResourceDriftStatusFilters, context);\n if (input.StackResourceDriftStatusFilters?.length === 0) {\n entries.StackResourceDriftStatusFilters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `StackResourceDriftStatusFilters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n return entries;\n};\nconst se_DescribeStackResourceInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n return entries;\n};\nconst se_DescribeStackResourcesInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n if (input.PhysicalResourceId != null) {\n entries[\"PhysicalResourceId\"] = input.PhysicalResourceId;\n }\n return entries;\n};\nconst se_DescribeStackSetInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DescribeStackSetOperationInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_DescribeStacksInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_DescribeTypeInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.VersionId != null) {\n entries[\"VersionId\"] = input.VersionId;\n }\n if (input.PublisherId != null) {\n entries[\"PublisherId\"] = input.PublisherId;\n }\n if (input.PublicVersionNumber != null) {\n entries[\"PublicVersionNumber\"] = input.PublicVersionNumber;\n }\n return entries;\n};\nconst se_DescribeTypeRegistrationInput = (input, context) => {\n const entries = {};\n if (input.RegistrationToken != null) {\n entries[\"RegistrationToken\"] = input.RegistrationToken;\n }\n return entries;\n};\nconst se_DetectStackDriftInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.LogicalResourceIds != null) {\n const memberEntries = se_LogicalResourceIds(input.LogicalResourceIds, context);\n if (input.LogicalResourceIds?.length === 0) {\n entries.LogicalResourceIds = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `LogicalResourceIds.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_DetectStackResourceDriftInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n return entries;\n};\nconst se_DetectStackSetDriftInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_EstimateTemplateCostInput = (input, context) => {\n const entries = {};\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_ExecuteChangeSetInput = (input, context) => {\n const entries = {};\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n if (input.DisableRollback != null) {\n entries[\"DisableRollback\"] = input.DisableRollback;\n }\n if (input.RetainExceptOnCreate != null) {\n entries[\"RetainExceptOnCreate\"] = input.RetainExceptOnCreate;\n }\n return entries;\n};\nconst se_GetStackPolicyInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n return entries;\n};\nconst se_GetTemplateInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.ChangeSetName != null) {\n entries[\"ChangeSetName\"] = input.ChangeSetName;\n }\n if (input.TemplateStage != null) {\n entries[\"TemplateStage\"] = input.TemplateStage;\n }\n return entries;\n};\nconst se_GetTemplateSummaryInput = (input, context) => {\n const entries = {};\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n if (input.TemplateSummaryConfig != null) {\n const memberEntries = se_TemplateSummaryConfig(input.TemplateSummaryConfig, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `TemplateSummaryConfig.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_ImportStacksToStackSetInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.StackIds != null) {\n const memberEntries = se_StackIdList(input.StackIds, context);\n if (input.StackIds?.length === 0) {\n entries.StackIds = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `StackIds.${key}`;\n entries[loc] = value;\n });\n }\n if (input.StackIdsUrl != null) {\n entries[\"StackIdsUrl\"] = input.StackIdsUrl;\n }\n if (input.OrganizationalUnitIds != null) {\n const memberEntries = se_OrganizationalUnitIdList(input.OrganizationalUnitIds, context);\n if (input.OrganizationalUnitIds?.length === 0) {\n entries.OrganizationalUnitIds = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OrganizationalUnitIds.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_ListChangeSetsInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListExportsInput = (input, context) => {\n const entries = {};\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListImportsInput = (input, context) => {\n const entries = {};\n if (input.ExportName != null) {\n entries[\"ExportName\"] = input.ExportName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListStackInstanceResourceDriftsInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.StackInstanceResourceDriftStatuses != null) {\n const memberEntries = se_StackResourceDriftStatusFilters(input.StackInstanceResourceDriftStatuses, context);\n if (input.StackInstanceResourceDriftStatuses?.length === 0) {\n entries.StackInstanceResourceDriftStatuses = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `StackInstanceResourceDriftStatuses.${key}`;\n entries[loc] = value;\n });\n }\n if (input.StackInstanceAccount != null) {\n entries[\"StackInstanceAccount\"] = input.StackInstanceAccount;\n }\n if (input.StackInstanceRegion != null) {\n entries[\"StackInstanceRegion\"] = input.StackInstanceRegion;\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_ListStackInstancesInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.Filters != null) {\n const memberEntries = se_StackInstanceFilters(input.Filters, context);\n if (input.Filters?.length === 0) {\n entries.Filters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Filters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.StackInstanceAccount != null) {\n entries[\"StackInstanceAccount\"] = input.StackInstanceAccount;\n }\n if (input.StackInstanceRegion != null) {\n entries[\"StackInstanceRegion\"] = input.StackInstanceRegion;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_ListStackResourcesInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListStackSetOperationResultsInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n if (input.Filters != null) {\n const memberEntries = se_OperationResultFilters(input.Filters, context);\n if (input.Filters?.length === 0) {\n entries.Filters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Filters.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_ListStackSetOperationsInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_ListStackSetsInput = (input, context) => {\n const entries = {};\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.Status != null) {\n entries[\"Status\"] = input.Status;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_ListStacksInput = (input, context) => {\n const entries = {};\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.StackStatusFilter != null) {\n const memberEntries = se_StackStatusFilter(input.StackStatusFilter, context);\n if (input.StackStatusFilter?.length === 0) {\n entries.StackStatusFilter = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `StackStatusFilter.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_ListTypeRegistrationsInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.TypeArn != null) {\n entries[\"TypeArn\"] = input.TypeArn;\n }\n if (input.RegistrationStatusFilter != null) {\n entries[\"RegistrationStatusFilter\"] = input.RegistrationStatusFilter;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListTypesInput = (input, context) => {\n const entries = {};\n if (input.Visibility != null) {\n entries[\"Visibility\"] = input.Visibility;\n }\n if (input.ProvisioningType != null) {\n entries[\"ProvisioningType\"] = input.ProvisioningType;\n }\n if (input.DeprecatedStatus != null) {\n entries[\"DeprecatedStatus\"] = input.DeprecatedStatus;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.Filters != null) {\n const memberEntries = se_TypeFilters(input.Filters, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Filters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n return entries;\n};\nconst se_ListTypeVersionsInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.MaxResults != null) {\n entries[\"MaxResults\"] = input.MaxResults;\n }\n if (input.NextToken != null) {\n entries[\"NextToken\"] = input.NextToken;\n }\n if (input.DeprecatedStatus != null) {\n entries[\"DeprecatedStatus\"] = input.DeprecatedStatus;\n }\n if (input.PublisherId != null) {\n entries[\"PublisherId\"] = input.PublisherId;\n }\n return entries;\n};\nconst se_LoggingConfig = (input, context) => {\n const entries = {};\n if (input.LogRoleArn != null) {\n entries[\"LogRoleArn\"] = input.LogRoleArn;\n }\n if (input.LogGroupName != null) {\n entries[\"LogGroupName\"] = input.LogGroupName;\n }\n return entries;\n};\nconst se_LogicalResourceIds = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_ManagedExecution = (input, context) => {\n const entries = {};\n if (input.Active != null) {\n entries[\"Active\"] = input.Active;\n }\n return entries;\n};\nconst se_NotificationARNs = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_OperationResultFilter = (input, context) => {\n const entries = {};\n if (input.Name != null) {\n entries[\"Name\"] = input.Name;\n }\n if (input.Values != null) {\n entries[\"Values\"] = input.Values;\n }\n return entries;\n};\nconst se_OperationResultFilters = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_OperationResultFilter(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_OrganizationalUnitIdList = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_Parameter = (input, context) => {\n const entries = {};\n if (input.ParameterKey != null) {\n entries[\"ParameterKey\"] = input.ParameterKey;\n }\n if (input.ParameterValue != null) {\n entries[\"ParameterValue\"] = input.ParameterValue;\n }\n if (input.UsePreviousValue != null) {\n entries[\"UsePreviousValue\"] = input.UsePreviousValue;\n }\n if (input.ResolvedValue != null) {\n entries[\"ResolvedValue\"] = input.ResolvedValue;\n }\n return entries;\n};\nconst se_Parameters = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_Parameter(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_PublishTypeInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.PublicVersionNumber != null) {\n entries[\"PublicVersionNumber\"] = input.PublicVersionNumber;\n }\n return entries;\n};\nconst se_RecordHandlerProgressInput = (input, context) => {\n const entries = {};\n if (input.BearerToken != null) {\n entries[\"BearerToken\"] = input.BearerToken;\n }\n if (input.OperationStatus != null) {\n entries[\"OperationStatus\"] = input.OperationStatus;\n }\n if (input.CurrentOperationStatus != null) {\n entries[\"CurrentOperationStatus\"] = input.CurrentOperationStatus;\n }\n if (input.StatusMessage != null) {\n entries[\"StatusMessage\"] = input.StatusMessage;\n }\n if (input.ErrorCode != null) {\n entries[\"ErrorCode\"] = input.ErrorCode;\n }\n if (input.ResourceModel != null) {\n entries[\"ResourceModel\"] = input.ResourceModel;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n return entries;\n};\nconst se_RegionList = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_RegisterPublisherInput = (input, context) => {\n const entries = {};\n if (input.AcceptTermsAndConditions != null) {\n entries[\"AcceptTermsAndConditions\"] = input.AcceptTermsAndConditions;\n }\n if (input.ConnectionArn != null) {\n entries[\"ConnectionArn\"] = input.ConnectionArn;\n }\n return entries;\n};\nconst se_RegisterTypeInput = (input, context) => {\n const entries = {};\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.SchemaHandlerPackage != null) {\n entries[\"SchemaHandlerPackage\"] = input.SchemaHandlerPackage;\n }\n if (input.LoggingConfig != null) {\n const memberEntries = se_LoggingConfig(input.LoggingConfig, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `LoggingConfig.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ExecutionRoleArn != null) {\n entries[\"ExecutionRoleArn\"] = input.ExecutionRoleArn;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n return entries;\n};\nconst se_ResourceIdentifierProperties = (input, context) => {\n const entries = {};\n let counter = 1;\n Object.keys(input)\n .filter((key) => input[key] != null)\n .forEach((key) => {\n entries[`entry.${counter}.key`] = key;\n entries[`entry.${counter}.value`] = input[key];\n counter++;\n });\n return entries;\n};\nconst se_ResourcesToImport = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_ResourceToImport(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_ResourcesToSkip = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_ResourceToImport = (input, context) => {\n const entries = {};\n if (input.ResourceType != null) {\n entries[\"ResourceType\"] = input.ResourceType;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n if (input.ResourceIdentifier != null) {\n const memberEntries = se_ResourceIdentifierProperties(input.ResourceIdentifier, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourceIdentifier.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_ResourceTypes = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_RetainResources = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_RollbackConfiguration = (input, context) => {\n const entries = {};\n if (input.RollbackTriggers != null) {\n const memberEntries = se_RollbackTriggers(input.RollbackTriggers, context);\n if (input.RollbackTriggers?.length === 0) {\n entries.RollbackTriggers = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RollbackTriggers.${key}`;\n entries[loc] = value;\n });\n }\n if (input.MonitoringTimeInMinutes != null) {\n entries[\"MonitoringTimeInMinutes\"] = input.MonitoringTimeInMinutes;\n }\n return entries;\n};\nconst se_RollbackStackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n if (input.RetainExceptOnCreate != null) {\n entries[\"RetainExceptOnCreate\"] = input.RetainExceptOnCreate;\n }\n return entries;\n};\nconst se_RollbackTrigger = (input, context) => {\n const entries = {};\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n return entries;\n};\nconst se_RollbackTriggers = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_RollbackTrigger(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_SetStackPolicyInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.StackPolicyBody != null) {\n entries[\"StackPolicyBody\"] = input.StackPolicyBody;\n }\n if (input.StackPolicyURL != null) {\n entries[\"StackPolicyURL\"] = input.StackPolicyURL;\n }\n return entries;\n};\nconst se_SetTypeConfigurationInput = (input, context) => {\n const entries = {};\n if (input.TypeArn != null) {\n entries[\"TypeArn\"] = input.TypeArn;\n }\n if (input.Configuration != null) {\n entries[\"Configuration\"] = input.Configuration;\n }\n if (input.ConfigurationAlias != null) {\n entries[\"ConfigurationAlias\"] = input.ConfigurationAlias;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n return entries;\n};\nconst se_SetTypeDefaultVersionInput = (input, context) => {\n const entries = {};\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.VersionId != null) {\n entries[\"VersionId\"] = input.VersionId;\n }\n return entries;\n};\nconst se_SignalResourceInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.LogicalResourceId != null) {\n entries[\"LogicalResourceId\"] = input.LogicalResourceId;\n }\n if (input.UniqueId != null) {\n entries[\"UniqueId\"] = input.UniqueId;\n }\n if (input.Status != null) {\n entries[\"Status\"] = input.Status;\n }\n return entries;\n};\nconst se_StackIdList = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_StackInstanceFilter = (input, context) => {\n const entries = {};\n if (input.Name != null) {\n entries[\"Name\"] = input.Name;\n }\n if (input.Values != null) {\n entries[\"Values\"] = input.Values;\n }\n return entries;\n};\nconst se_StackInstanceFilters = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_StackInstanceFilter(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_StackResourceDriftStatusFilters = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_StackSetOperationPreferences = (input, context) => {\n const entries = {};\n if (input.RegionConcurrencyType != null) {\n entries[\"RegionConcurrencyType\"] = input.RegionConcurrencyType;\n }\n if (input.RegionOrder != null) {\n const memberEntries = se_RegionList(input.RegionOrder, context);\n if (input.RegionOrder?.length === 0) {\n entries.RegionOrder = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RegionOrder.${key}`;\n entries[loc] = value;\n });\n }\n if (input.FailureToleranceCount != null) {\n entries[\"FailureToleranceCount\"] = input.FailureToleranceCount;\n }\n if (input.FailureTolerancePercentage != null) {\n entries[\"FailureTolerancePercentage\"] = input.FailureTolerancePercentage;\n }\n if (input.MaxConcurrentCount != null) {\n entries[\"MaxConcurrentCount\"] = input.MaxConcurrentCount;\n }\n if (input.MaxConcurrentPercentage != null) {\n entries[\"MaxConcurrentPercentage\"] = input.MaxConcurrentPercentage;\n }\n if (input.ConcurrencyMode != null) {\n entries[\"ConcurrencyMode\"] = input.ConcurrencyMode;\n }\n return entries;\n};\nconst se_StackStatusFilter = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_StopStackSetOperationInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_Tag = (input, context) => {\n const entries = {};\n if (input.Key != null) {\n entries[\"Key\"] = input.Key;\n }\n if (input.Value != null) {\n entries[\"Value\"] = input.Value;\n }\n return entries;\n};\nconst se_Tags = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_Tag(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_TemplateSummaryConfig = (input, context) => {\n const entries = {};\n if (input.TreatUnrecognizedResourceTypesAsWarnings != null) {\n entries[\"TreatUnrecognizedResourceTypesAsWarnings\"] = input.TreatUnrecognizedResourceTypesAsWarnings;\n }\n return entries;\n};\nconst se_TestTypeInput = (input, context) => {\n const entries = {};\n if (input.Arn != null) {\n entries[\"Arn\"] = input.Arn;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n if (input.VersionId != null) {\n entries[\"VersionId\"] = input.VersionId;\n }\n if (input.LogDeliveryBucket != null) {\n entries[\"LogDeliveryBucket\"] = input.LogDeliveryBucket;\n }\n return entries;\n};\nconst se_TypeConfigurationIdentifier = (input, context) => {\n const entries = {};\n if (input.TypeArn != null) {\n entries[\"TypeArn\"] = input.TypeArn;\n }\n if (input.TypeConfigurationAlias != null) {\n entries[\"TypeConfigurationAlias\"] = input.TypeConfigurationAlias;\n }\n if (input.TypeConfigurationArn != null) {\n entries[\"TypeConfigurationArn\"] = input.TypeConfigurationArn;\n }\n if (input.Type != null) {\n entries[\"Type\"] = input.Type;\n }\n if (input.TypeName != null) {\n entries[\"TypeName\"] = input.TypeName;\n }\n return entries;\n};\nconst se_TypeConfigurationIdentifiers = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_TypeConfigurationIdentifier(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_TypeFilters = (input, context) => {\n const entries = {};\n if (input.Category != null) {\n entries[\"Category\"] = input.Category;\n }\n if (input.PublisherId != null) {\n entries[\"PublisherId\"] = input.PublisherId;\n }\n if (input.TypeNamePrefix != null) {\n entries[\"TypeNamePrefix\"] = input.TypeNamePrefix;\n }\n return entries;\n};\nconst se_UpdateStackInput = (input, context) => {\n const entries = {};\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.UsePreviousTemplate != null) {\n entries[\"UsePreviousTemplate\"] = input.UsePreviousTemplate;\n }\n if (input.StackPolicyDuringUpdateBody != null) {\n entries[\"StackPolicyDuringUpdateBody\"] = input.StackPolicyDuringUpdateBody;\n }\n if (input.StackPolicyDuringUpdateURL != null) {\n entries[\"StackPolicyDuringUpdateURL\"] = input.StackPolicyDuringUpdateURL;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Capabilities != null) {\n const memberEntries = se_Capabilities(input.Capabilities, context);\n if (input.Capabilities?.length === 0) {\n entries.Capabilities = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Capabilities.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ResourceTypes != null) {\n const memberEntries = se_ResourceTypes(input.ResourceTypes, context);\n if (input.ResourceTypes?.length === 0) {\n entries.ResourceTypes = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ResourceTypes.${key}`;\n entries[loc] = value;\n });\n }\n if (input.RoleARN != null) {\n entries[\"RoleARN\"] = input.RoleARN;\n }\n if (input.RollbackConfiguration != null) {\n const memberEntries = se_RollbackConfiguration(input.RollbackConfiguration, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `RollbackConfiguration.${key}`;\n entries[loc] = value;\n });\n }\n if (input.StackPolicyBody != null) {\n entries[\"StackPolicyBody\"] = input.StackPolicyBody;\n }\n if (input.StackPolicyURL != null) {\n entries[\"StackPolicyURL\"] = input.StackPolicyURL;\n }\n if (input.NotificationARNs != null) {\n const memberEntries = se_NotificationARNs(input.NotificationARNs, context);\n if (input.NotificationARNs?.length === 0) {\n entries.NotificationARNs = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `NotificationARNs.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Tags != null) {\n const memberEntries = se_Tags(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DisableRollback != null) {\n entries[\"DisableRollback\"] = input.DisableRollback;\n }\n if (input.ClientRequestToken != null) {\n entries[\"ClientRequestToken\"] = input.ClientRequestToken;\n }\n if (input.RetainExceptOnCreate != null) {\n entries[\"RetainExceptOnCreate\"] = input.RetainExceptOnCreate;\n }\n return entries;\n};\nconst se_UpdateStackInstancesInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.Accounts != null) {\n const memberEntries = se_AccountList(input.Accounts, context);\n if (input.Accounts?.length === 0) {\n entries.Accounts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Accounts.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DeploymentTargets != null) {\n const memberEntries = se_DeploymentTargets(input.DeploymentTargets, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `DeploymentTargets.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Regions != null) {\n const memberEntries = se_RegionList(input.Regions, context);\n if (input.Regions?.length === 0) {\n entries.Regions = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Regions.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ParameterOverrides != null) {\n const memberEntries = se_Parameters(input.ParameterOverrides, context);\n if (input.ParameterOverrides?.length === 0) {\n entries.ParameterOverrides = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ParameterOverrides.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n return entries;\n};\nconst se_UpdateStackSetInput = (input, context) => {\n const entries = {};\n if (input.StackSetName != null) {\n entries[\"StackSetName\"] = input.StackSetName;\n }\n if (input.Description != null) {\n entries[\"Description\"] = input.Description;\n }\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n if (input.UsePreviousTemplate != null) {\n entries[\"UsePreviousTemplate\"] = input.UsePreviousTemplate;\n }\n if (input.Parameters != null) {\n const memberEntries = se_Parameters(input.Parameters, context);\n if (input.Parameters?.length === 0) {\n entries.Parameters = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Parameters.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Capabilities != null) {\n const memberEntries = se_Capabilities(input.Capabilities, context);\n if (input.Capabilities?.length === 0) {\n entries.Capabilities = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Capabilities.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Tags != null) {\n const memberEntries = se_Tags(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationPreferences != null) {\n const memberEntries = se_StackSetOperationPreferences(input.OperationPreferences, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `OperationPreferences.${key}`;\n entries[loc] = value;\n });\n }\n if (input.AdministrationRoleARN != null) {\n entries[\"AdministrationRoleARN\"] = input.AdministrationRoleARN;\n }\n if (input.ExecutionRoleName != null) {\n entries[\"ExecutionRoleName\"] = input.ExecutionRoleName;\n }\n if (input.DeploymentTargets != null) {\n const memberEntries = se_DeploymentTargets(input.DeploymentTargets, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `DeploymentTargets.${key}`;\n entries[loc] = value;\n });\n }\n if (input.PermissionModel != null) {\n entries[\"PermissionModel\"] = input.PermissionModel;\n }\n if (input.AutoDeployment != null) {\n const memberEntries = se_AutoDeployment(input.AutoDeployment, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `AutoDeployment.${key}`;\n entries[loc] = value;\n });\n }\n if (input.OperationId === undefined) {\n input.OperationId = (0, uuid_1.v4)();\n }\n if (input.OperationId != null) {\n entries[\"OperationId\"] = input.OperationId;\n }\n if (input.Accounts != null) {\n const memberEntries = se_AccountList(input.Accounts, context);\n if (input.Accounts?.length === 0) {\n entries.Accounts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Accounts.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Regions != null) {\n const memberEntries = se_RegionList(input.Regions, context);\n if (input.Regions?.length === 0) {\n entries.Regions = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Regions.${key}`;\n entries[loc] = value;\n });\n }\n if (input.CallAs != null) {\n entries[\"CallAs\"] = input.CallAs;\n }\n if (input.ManagedExecution != null) {\n const memberEntries = se_ManagedExecution(input.ManagedExecution, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ManagedExecution.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_UpdateTerminationProtectionInput = (input, context) => {\n const entries = {};\n if (input.EnableTerminationProtection != null) {\n entries[\"EnableTerminationProtection\"] = input.EnableTerminationProtection;\n }\n if (input.StackName != null) {\n entries[\"StackName\"] = input.StackName;\n }\n return entries;\n};\nconst se_ValidateTemplateInput = (input, context) => {\n const entries = {};\n if (input.TemplateBody != null) {\n entries[\"TemplateBody\"] = input.TemplateBody;\n }\n if (input.TemplateURL != null) {\n entries[\"TemplateURL\"] = input.TemplateURL;\n }\n return entries;\n};\nconst de_AccountGateResult = (output, context) => {\n const contents = {};\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n return contents;\n};\nconst de_AccountLimit = (output, context) => {\n const contents = {};\n if (output[\"Name\"] !== undefined) {\n contents.Name = (0, smithy_client_1.expectString)(output[\"Name\"]);\n }\n if (output[\"Value\"] !== undefined) {\n contents.Value = (0, smithy_client_1.strictParseInt32)(output[\"Value\"]);\n }\n return contents;\n};\nconst de_AccountLimitList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_AccountLimit(entry, context);\n });\n};\nconst de_AccountList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_ActivateOrganizationsAccessOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_ActivateTypeOutput = (output, context) => {\n const contents = {};\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n return contents;\n};\nconst de_AllowedValues = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_AlreadyExistsException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_AutoDeployment = (output, context) => {\n const contents = {};\n if (output[\"Enabled\"] !== undefined) {\n contents.Enabled = (0, smithy_client_1.parseBoolean)(output[\"Enabled\"]);\n }\n if (output[\"RetainStacksOnAccountRemoval\"] !== undefined) {\n contents.RetainStacksOnAccountRemoval = (0, smithy_client_1.parseBoolean)(output[\"RetainStacksOnAccountRemoval\"]);\n }\n return contents;\n};\nconst de_BatchDescribeTypeConfigurationsError = (output, context) => {\n const contents = {};\n if (output[\"ErrorCode\"] !== undefined) {\n contents.ErrorCode = (0, smithy_client_1.expectString)(output[\"ErrorCode\"]);\n }\n if (output[\"ErrorMessage\"] !== undefined) {\n contents.ErrorMessage = (0, smithy_client_1.expectString)(output[\"ErrorMessage\"]);\n }\n if (output[\"TypeConfigurationIdentifier\"] !== undefined) {\n contents.TypeConfigurationIdentifier = de_TypeConfigurationIdentifier(output[\"TypeConfigurationIdentifier\"], context);\n }\n return contents;\n};\nconst de_BatchDescribeTypeConfigurationsErrors = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_BatchDescribeTypeConfigurationsError(entry, context);\n });\n};\nconst de_BatchDescribeTypeConfigurationsOutput = (output, context) => {\n const contents = {};\n if (output.Errors === \"\") {\n contents.Errors = [];\n }\n else if (output[\"Errors\"] !== undefined && output[\"Errors\"][\"member\"] !== undefined) {\n contents.Errors = de_BatchDescribeTypeConfigurationsErrors((0, smithy_client_1.getArrayIfSingleItem)(output[\"Errors\"][\"member\"]), context);\n }\n if (output.UnprocessedTypeConfigurations === \"\") {\n contents.UnprocessedTypeConfigurations = [];\n }\n else if (output[\"UnprocessedTypeConfigurations\"] !== undefined &&\n output[\"UnprocessedTypeConfigurations\"][\"member\"] !== undefined) {\n contents.UnprocessedTypeConfigurations = de_UnprocessedTypeConfigurations((0, smithy_client_1.getArrayIfSingleItem)(output[\"UnprocessedTypeConfigurations\"][\"member\"]), context);\n }\n if (output.TypeConfigurations === \"\") {\n contents.TypeConfigurations = [];\n }\n else if (output[\"TypeConfigurations\"] !== undefined && output[\"TypeConfigurations\"][\"member\"] !== undefined) {\n contents.TypeConfigurations = de_TypeConfigurationDetailsList((0, smithy_client_1.getArrayIfSingleItem)(output[\"TypeConfigurations\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_Capabilities = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_CFNRegistryException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_Change = (output, context) => {\n const contents = {};\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n if (output[\"HookInvocationCount\"] !== undefined) {\n contents.HookInvocationCount = (0, smithy_client_1.strictParseInt32)(output[\"HookInvocationCount\"]);\n }\n if (output[\"ResourceChange\"] !== undefined) {\n contents.ResourceChange = de_ResourceChange(output[\"ResourceChange\"], context);\n }\n return contents;\n};\nconst de_Changes = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Change(entry, context);\n });\n};\nconst de_ChangeSetHook = (output, context) => {\n const contents = {};\n if (output[\"InvocationPoint\"] !== undefined) {\n contents.InvocationPoint = (0, smithy_client_1.expectString)(output[\"InvocationPoint\"]);\n }\n if (output[\"FailureMode\"] !== undefined) {\n contents.FailureMode = (0, smithy_client_1.expectString)(output[\"FailureMode\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n if (output[\"TypeVersionId\"] !== undefined) {\n contents.TypeVersionId = (0, smithy_client_1.expectString)(output[\"TypeVersionId\"]);\n }\n if (output[\"TypeConfigurationVersionId\"] !== undefined) {\n contents.TypeConfigurationVersionId = (0, smithy_client_1.expectString)(output[\"TypeConfigurationVersionId\"]);\n }\n if (output[\"TargetDetails\"] !== undefined) {\n contents.TargetDetails = de_ChangeSetHookTargetDetails(output[\"TargetDetails\"], context);\n }\n return contents;\n};\nconst de_ChangeSetHookResourceTargetDetails = (output, context) => {\n const contents = {};\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"ResourceAction\"] !== undefined) {\n contents.ResourceAction = (0, smithy_client_1.expectString)(output[\"ResourceAction\"]);\n }\n return contents;\n};\nconst de_ChangeSetHooks = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_ChangeSetHook(entry, context);\n });\n};\nconst de_ChangeSetHookTargetDetails = (output, context) => {\n const contents = {};\n if (output[\"TargetType\"] !== undefined) {\n contents.TargetType = (0, smithy_client_1.expectString)(output[\"TargetType\"]);\n }\n if (output[\"ResourceTargetDetails\"] !== undefined) {\n contents.ResourceTargetDetails = de_ChangeSetHookResourceTargetDetails(output[\"ResourceTargetDetails\"], context);\n }\n return contents;\n};\nconst de_ChangeSetNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_ChangeSetSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_ChangeSetSummary(entry, context);\n });\n};\nconst de_ChangeSetSummary = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"ChangeSetId\"] !== undefined) {\n contents.ChangeSetId = (0, smithy_client_1.expectString)(output[\"ChangeSetId\"]);\n }\n if (output[\"ChangeSetName\"] !== undefined) {\n contents.ChangeSetName = (0, smithy_client_1.expectString)(output[\"ChangeSetName\"]);\n }\n if (output[\"ExecutionStatus\"] !== undefined) {\n contents.ExecutionStatus = (0, smithy_client_1.expectString)(output[\"ExecutionStatus\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"CreationTime\"] !== undefined) {\n contents.CreationTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTime\"]));\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"IncludeNestedStacks\"] !== undefined) {\n contents.IncludeNestedStacks = (0, smithy_client_1.parseBoolean)(output[\"IncludeNestedStacks\"]);\n }\n if (output[\"ParentChangeSetId\"] !== undefined) {\n contents.ParentChangeSetId = (0, smithy_client_1.expectString)(output[\"ParentChangeSetId\"]);\n }\n if (output[\"RootChangeSetId\"] !== undefined) {\n contents.RootChangeSetId = (0, smithy_client_1.expectString)(output[\"RootChangeSetId\"]);\n }\n return contents;\n};\nconst de_ContinueUpdateRollbackOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_CreateChangeSetOutput = (output, context) => {\n const contents = {};\n if (output[\"Id\"] !== undefined) {\n contents.Id = (0, smithy_client_1.expectString)(output[\"Id\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n return contents;\n};\nconst de_CreatedButModifiedException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_CreateStackInstancesOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_CreateStackOutput = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n return contents;\n};\nconst de_CreateStackSetOutput = (output, context) => {\n const contents = {};\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n return contents;\n};\nconst de_DeactivateOrganizationsAccessOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_DeactivateTypeOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_DeleteChangeSetOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_DeleteStackInstancesOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_DeleteStackSetOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_DeploymentTargets = (output, context) => {\n const contents = {};\n if (output.Accounts === \"\") {\n contents.Accounts = [];\n }\n else if (output[\"Accounts\"] !== undefined && output[\"Accounts\"][\"member\"] !== undefined) {\n contents.Accounts = de_AccountList((0, smithy_client_1.getArrayIfSingleItem)(output[\"Accounts\"][\"member\"]), context);\n }\n if (output[\"AccountsUrl\"] !== undefined) {\n contents.AccountsUrl = (0, smithy_client_1.expectString)(output[\"AccountsUrl\"]);\n }\n if (output.OrganizationalUnitIds === \"\") {\n contents.OrganizationalUnitIds = [];\n }\n else if (output[\"OrganizationalUnitIds\"] !== undefined && output[\"OrganizationalUnitIds\"][\"member\"] !== undefined) {\n contents.OrganizationalUnitIds = de_OrganizationalUnitIdList((0, smithy_client_1.getArrayIfSingleItem)(output[\"OrganizationalUnitIds\"][\"member\"]), context);\n }\n if (output[\"AccountFilterType\"] !== undefined) {\n contents.AccountFilterType = (0, smithy_client_1.expectString)(output[\"AccountFilterType\"]);\n }\n return contents;\n};\nconst de_DeregisterTypeOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_DescribeAccountLimitsOutput = (output, context) => {\n const contents = {};\n if (output.AccountLimits === \"\") {\n contents.AccountLimits = [];\n }\n else if (output[\"AccountLimits\"] !== undefined && output[\"AccountLimits\"][\"member\"] !== undefined) {\n contents.AccountLimits = de_AccountLimitList((0, smithy_client_1.getArrayIfSingleItem)(output[\"AccountLimits\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_DescribeChangeSetHooksOutput = (output, context) => {\n const contents = {};\n if (output[\"ChangeSetId\"] !== undefined) {\n contents.ChangeSetId = (0, smithy_client_1.expectString)(output[\"ChangeSetId\"]);\n }\n if (output[\"ChangeSetName\"] !== undefined) {\n contents.ChangeSetName = (0, smithy_client_1.expectString)(output[\"ChangeSetName\"]);\n }\n if (output.Hooks === \"\") {\n contents.Hooks = [];\n }\n else if (output[\"Hooks\"] !== undefined && output[\"Hooks\"][\"member\"] !== undefined) {\n contents.Hooks = de_ChangeSetHooks((0, smithy_client_1.getArrayIfSingleItem)(output[\"Hooks\"][\"member\"]), context);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n return contents;\n};\nconst de_DescribeChangeSetOutput = (output, context) => {\n const contents = {};\n if (output[\"ChangeSetName\"] !== undefined) {\n contents.ChangeSetName = (0, smithy_client_1.expectString)(output[\"ChangeSetName\"]);\n }\n if (output[\"ChangeSetId\"] !== undefined) {\n contents.ChangeSetId = (0, smithy_client_1.expectString)(output[\"ChangeSetId\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output.Parameters === \"\") {\n contents.Parameters = [];\n }\n else if (output[\"Parameters\"] !== undefined && output[\"Parameters\"][\"member\"] !== undefined) {\n contents.Parameters = de_Parameters((0, smithy_client_1.getArrayIfSingleItem)(output[\"Parameters\"][\"member\"]), context);\n }\n if (output[\"CreationTime\"] !== undefined) {\n contents.CreationTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTime\"]));\n }\n if (output[\"ExecutionStatus\"] !== undefined) {\n contents.ExecutionStatus = (0, smithy_client_1.expectString)(output[\"ExecutionStatus\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output.NotificationARNs === \"\") {\n contents.NotificationARNs = [];\n }\n else if (output[\"NotificationARNs\"] !== undefined && output[\"NotificationARNs\"][\"member\"] !== undefined) {\n contents.NotificationARNs = de_NotificationARNs((0, smithy_client_1.getArrayIfSingleItem)(output[\"NotificationARNs\"][\"member\"]), context);\n }\n if (output[\"RollbackConfiguration\"] !== undefined) {\n contents.RollbackConfiguration = de_RollbackConfiguration(output[\"RollbackConfiguration\"], context);\n }\n if (output.Capabilities === \"\") {\n contents.Capabilities = [];\n }\n else if (output[\"Capabilities\"] !== undefined && output[\"Capabilities\"][\"member\"] !== undefined) {\n contents.Capabilities = de_Capabilities((0, smithy_client_1.getArrayIfSingleItem)(output[\"Capabilities\"][\"member\"]), context);\n }\n if (output.Tags === \"\") {\n contents.Tags = [];\n }\n else if (output[\"Tags\"] !== undefined && output[\"Tags\"][\"member\"] !== undefined) {\n contents.Tags = de_Tags((0, smithy_client_1.getArrayIfSingleItem)(output[\"Tags\"][\"member\"]), context);\n }\n if (output.Changes === \"\") {\n contents.Changes = [];\n }\n else if (output[\"Changes\"] !== undefined && output[\"Changes\"][\"member\"] !== undefined) {\n contents.Changes = de_Changes((0, smithy_client_1.getArrayIfSingleItem)(output[\"Changes\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n if (output[\"IncludeNestedStacks\"] !== undefined) {\n contents.IncludeNestedStacks = (0, smithy_client_1.parseBoolean)(output[\"IncludeNestedStacks\"]);\n }\n if (output[\"ParentChangeSetId\"] !== undefined) {\n contents.ParentChangeSetId = (0, smithy_client_1.expectString)(output[\"ParentChangeSetId\"]);\n }\n if (output[\"RootChangeSetId\"] !== undefined) {\n contents.RootChangeSetId = (0, smithy_client_1.expectString)(output[\"RootChangeSetId\"]);\n }\n if (output[\"OnStackFailure\"] !== undefined) {\n contents.OnStackFailure = (0, smithy_client_1.expectString)(output[\"OnStackFailure\"]);\n }\n return contents;\n};\nconst de_DescribeOrganizationsAccessOutput = (output, context) => {\n const contents = {};\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n return contents;\n};\nconst de_DescribePublisherOutput = (output, context) => {\n const contents = {};\n if (output[\"PublisherId\"] !== undefined) {\n contents.PublisherId = (0, smithy_client_1.expectString)(output[\"PublisherId\"]);\n }\n if (output[\"PublisherStatus\"] !== undefined) {\n contents.PublisherStatus = (0, smithy_client_1.expectString)(output[\"PublisherStatus\"]);\n }\n if (output[\"IdentityProvider\"] !== undefined) {\n contents.IdentityProvider = (0, smithy_client_1.expectString)(output[\"IdentityProvider\"]);\n }\n if (output[\"PublisherProfile\"] !== undefined) {\n contents.PublisherProfile = (0, smithy_client_1.expectString)(output[\"PublisherProfile\"]);\n }\n return contents;\n};\nconst de_DescribeStackDriftDetectionStatusOutput = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackDriftDetectionId\"] !== undefined) {\n contents.StackDriftDetectionId = (0, smithy_client_1.expectString)(output[\"StackDriftDetectionId\"]);\n }\n if (output[\"StackDriftStatus\"] !== undefined) {\n contents.StackDriftStatus = (0, smithy_client_1.expectString)(output[\"StackDriftStatus\"]);\n }\n if (output[\"DetectionStatus\"] !== undefined) {\n contents.DetectionStatus = (0, smithy_client_1.expectString)(output[\"DetectionStatus\"]);\n }\n if (output[\"DetectionStatusReason\"] !== undefined) {\n contents.DetectionStatusReason = (0, smithy_client_1.expectString)(output[\"DetectionStatusReason\"]);\n }\n if (output[\"DriftedStackResourceCount\"] !== undefined) {\n contents.DriftedStackResourceCount = (0, smithy_client_1.strictParseInt32)(output[\"DriftedStackResourceCount\"]);\n }\n if (output[\"Timestamp\"] !== undefined) {\n contents.Timestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Timestamp\"]));\n }\n return contents;\n};\nconst de_DescribeStackEventsOutput = (output, context) => {\n const contents = {};\n if (output.StackEvents === \"\") {\n contents.StackEvents = [];\n }\n else if (output[\"StackEvents\"] !== undefined && output[\"StackEvents\"][\"member\"] !== undefined) {\n contents.StackEvents = de_StackEvents((0, smithy_client_1.getArrayIfSingleItem)(output[\"StackEvents\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_DescribeStackInstanceOutput = (output, context) => {\n const contents = {};\n if (output[\"StackInstance\"] !== undefined) {\n contents.StackInstance = de_StackInstance(output[\"StackInstance\"], context);\n }\n return contents;\n};\nconst de_DescribeStackResourceDriftsOutput = (output, context) => {\n const contents = {};\n if (output.StackResourceDrifts === \"\") {\n contents.StackResourceDrifts = [];\n }\n else if (output[\"StackResourceDrifts\"] !== undefined && output[\"StackResourceDrifts\"][\"member\"] !== undefined) {\n contents.StackResourceDrifts = de_StackResourceDrifts((0, smithy_client_1.getArrayIfSingleItem)(output[\"StackResourceDrifts\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_DescribeStackResourceOutput = (output, context) => {\n const contents = {};\n if (output[\"StackResourceDetail\"] !== undefined) {\n contents.StackResourceDetail = de_StackResourceDetail(output[\"StackResourceDetail\"], context);\n }\n return contents;\n};\nconst de_DescribeStackResourcesOutput = (output, context) => {\n const contents = {};\n if (output.StackResources === \"\") {\n contents.StackResources = [];\n }\n else if (output[\"StackResources\"] !== undefined && output[\"StackResources\"][\"member\"] !== undefined) {\n contents.StackResources = de_StackResources((0, smithy_client_1.getArrayIfSingleItem)(output[\"StackResources\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_DescribeStackSetOperationOutput = (output, context) => {\n const contents = {};\n if (output[\"StackSetOperation\"] !== undefined) {\n contents.StackSetOperation = de_StackSetOperation(output[\"StackSetOperation\"], context);\n }\n return contents;\n};\nconst de_DescribeStackSetOutput = (output, context) => {\n const contents = {};\n if (output[\"StackSet\"] !== undefined) {\n contents.StackSet = de_StackSet(output[\"StackSet\"], context);\n }\n return contents;\n};\nconst de_DescribeStacksOutput = (output, context) => {\n const contents = {};\n if (output.Stacks === \"\") {\n contents.Stacks = [];\n }\n else if (output[\"Stacks\"] !== undefined && output[\"Stacks\"][\"member\"] !== undefined) {\n contents.Stacks = de_Stacks((0, smithy_client_1.getArrayIfSingleItem)(output[\"Stacks\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_DescribeTypeOutput = (output, context) => {\n const contents = {};\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n if (output[\"DefaultVersionId\"] !== undefined) {\n contents.DefaultVersionId = (0, smithy_client_1.expectString)(output[\"DefaultVersionId\"]);\n }\n if (output[\"IsDefaultVersion\"] !== undefined) {\n contents.IsDefaultVersion = (0, smithy_client_1.parseBoolean)(output[\"IsDefaultVersion\"]);\n }\n if (output[\"TypeTestsStatus\"] !== undefined) {\n contents.TypeTestsStatus = (0, smithy_client_1.expectString)(output[\"TypeTestsStatus\"]);\n }\n if (output[\"TypeTestsStatusDescription\"] !== undefined) {\n contents.TypeTestsStatusDescription = (0, smithy_client_1.expectString)(output[\"TypeTestsStatusDescription\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"Schema\"] !== undefined) {\n contents.Schema = (0, smithy_client_1.expectString)(output[\"Schema\"]);\n }\n if (output[\"ProvisioningType\"] !== undefined) {\n contents.ProvisioningType = (0, smithy_client_1.expectString)(output[\"ProvisioningType\"]);\n }\n if (output[\"DeprecatedStatus\"] !== undefined) {\n contents.DeprecatedStatus = (0, smithy_client_1.expectString)(output[\"DeprecatedStatus\"]);\n }\n if (output[\"LoggingConfig\"] !== undefined) {\n contents.LoggingConfig = de_LoggingConfig(output[\"LoggingConfig\"], context);\n }\n if (output.RequiredActivatedTypes === \"\") {\n contents.RequiredActivatedTypes = [];\n }\n else if (output[\"RequiredActivatedTypes\"] !== undefined &&\n output[\"RequiredActivatedTypes\"][\"member\"] !== undefined) {\n contents.RequiredActivatedTypes = de_RequiredActivatedTypes((0, smithy_client_1.getArrayIfSingleItem)(output[\"RequiredActivatedTypes\"][\"member\"]), context);\n }\n if (output[\"ExecutionRoleArn\"] !== undefined) {\n contents.ExecutionRoleArn = (0, smithy_client_1.expectString)(output[\"ExecutionRoleArn\"]);\n }\n if (output[\"Visibility\"] !== undefined) {\n contents.Visibility = (0, smithy_client_1.expectString)(output[\"Visibility\"]);\n }\n if (output[\"SourceUrl\"] !== undefined) {\n contents.SourceUrl = (0, smithy_client_1.expectString)(output[\"SourceUrl\"]);\n }\n if (output[\"DocumentationUrl\"] !== undefined) {\n contents.DocumentationUrl = (0, smithy_client_1.expectString)(output[\"DocumentationUrl\"]);\n }\n if (output[\"LastUpdated\"] !== undefined) {\n contents.LastUpdated = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdated\"]));\n }\n if (output[\"TimeCreated\"] !== undefined) {\n contents.TimeCreated = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"TimeCreated\"]));\n }\n if (output[\"ConfigurationSchema\"] !== undefined) {\n contents.ConfigurationSchema = (0, smithy_client_1.expectString)(output[\"ConfigurationSchema\"]);\n }\n if (output[\"PublisherId\"] !== undefined) {\n contents.PublisherId = (0, smithy_client_1.expectString)(output[\"PublisherId\"]);\n }\n if (output[\"OriginalTypeName\"] !== undefined) {\n contents.OriginalTypeName = (0, smithy_client_1.expectString)(output[\"OriginalTypeName\"]);\n }\n if (output[\"OriginalTypeArn\"] !== undefined) {\n contents.OriginalTypeArn = (0, smithy_client_1.expectString)(output[\"OriginalTypeArn\"]);\n }\n if (output[\"PublicVersionNumber\"] !== undefined) {\n contents.PublicVersionNumber = (0, smithy_client_1.expectString)(output[\"PublicVersionNumber\"]);\n }\n if (output[\"LatestPublicVersion\"] !== undefined) {\n contents.LatestPublicVersion = (0, smithy_client_1.expectString)(output[\"LatestPublicVersion\"]);\n }\n if (output[\"IsActivated\"] !== undefined) {\n contents.IsActivated = (0, smithy_client_1.parseBoolean)(output[\"IsActivated\"]);\n }\n if (output[\"AutoUpdate\"] !== undefined) {\n contents.AutoUpdate = (0, smithy_client_1.parseBoolean)(output[\"AutoUpdate\"]);\n }\n return contents;\n};\nconst de_DescribeTypeRegistrationOutput = (output, context) => {\n const contents = {};\n if (output[\"ProgressStatus\"] !== undefined) {\n contents.ProgressStatus = (0, smithy_client_1.expectString)(output[\"ProgressStatus\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"TypeArn\"] !== undefined) {\n contents.TypeArn = (0, smithy_client_1.expectString)(output[\"TypeArn\"]);\n }\n if (output[\"TypeVersionArn\"] !== undefined) {\n contents.TypeVersionArn = (0, smithy_client_1.expectString)(output[\"TypeVersionArn\"]);\n }\n return contents;\n};\nconst de_DetectStackDriftOutput = (output, context) => {\n const contents = {};\n if (output[\"StackDriftDetectionId\"] !== undefined) {\n contents.StackDriftDetectionId = (0, smithy_client_1.expectString)(output[\"StackDriftDetectionId\"]);\n }\n return contents;\n};\nconst de_DetectStackResourceDriftOutput = (output, context) => {\n const contents = {};\n if (output[\"StackResourceDrift\"] !== undefined) {\n contents.StackResourceDrift = de_StackResourceDrift(output[\"StackResourceDrift\"], context);\n }\n return contents;\n};\nconst de_DetectStackSetDriftOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_EstimateTemplateCostOutput = (output, context) => {\n const contents = {};\n if (output[\"Url\"] !== undefined) {\n contents.Url = (0, smithy_client_1.expectString)(output[\"Url\"]);\n }\n return contents;\n};\nconst de_ExecuteChangeSetOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_Export = (output, context) => {\n const contents = {};\n if (output[\"ExportingStackId\"] !== undefined) {\n contents.ExportingStackId = (0, smithy_client_1.expectString)(output[\"ExportingStackId\"]);\n }\n if (output[\"Name\"] !== undefined) {\n contents.Name = (0, smithy_client_1.expectString)(output[\"Name\"]);\n }\n if (output[\"Value\"] !== undefined) {\n contents.Value = (0, smithy_client_1.expectString)(output[\"Value\"]);\n }\n return contents;\n};\nconst de_Exports = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Export(entry, context);\n });\n};\nconst de_GetStackPolicyOutput = (output, context) => {\n const contents = {};\n if (output[\"StackPolicyBody\"] !== undefined) {\n contents.StackPolicyBody = (0, smithy_client_1.expectString)(output[\"StackPolicyBody\"]);\n }\n return contents;\n};\nconst de_GetTemplateOutput = (output, context) => {\n const contents = {};\n if (output[\"TemplateBody\"] !== undefined) {\n contents.TemplateBody = (0, smithy_client_1.expectString)(output[\"TemplateBody\"]);\n }\n if (output.StagesAvailable === \"\") {\n contents.StagesAvailable = [];\n }\n else if (output[\"StagesAvailable\"] !== undefined && output[\"StagesAvailable\"][\"member\"] !== undefined) {\n contents.StagesAvailable = de_StageList((0, smithy_client_1.getArrayIfSingleItem)(output[\"StagesAvailable\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_GetTemplateSummaryOutput = (output, context) => {\n const contents = {};\n if (output.Parameters === \"\") {\n contents.Parameters = [];\n }\n else if (output[\"Parameters\"] !== undefined && output[\"Parameters\"][\"member\"] !== undefined) {\n contents.Parameters = de_ParameterDeclarations((0, smithy_client_1.getArrayIfSingleItem)(output[\"Parameters\"][\"member\"]), context);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output.Capabilities === \"\") {\n contents.Capabilities = [];\n }\n else if (output[\"Capabilities\"] !== undefined && output[\"Capabilities\"][\"member\"] !== undefined) {\n contents.Capabilities = de_Capabilities((0, smithy_client_1.getArrayIfSingleItem)(output[\"Capabilities\"][\"member\"]), context);\n }\n if (output[\"CapabilitiesReason\"] !== undefined) {\n contents.CapabilitiesReason = (0, smithy_client_1.expectString)(output[\"CapabilitiesReason\"]);\n }\n if (output.ResourceTypes === \"\") {\n contents.ResourceTypes = [];\n }\n else if (output[\"ResourceTypes\"] !== undefined && output[\"ResourceTypes\"][\"member\"] !== undefined) {\n contents.ResourceTypes = de_ResourceTypes((0, smithy_client_1.getArrayIfSingleItem)(output[\"ResourceTypes\"][\"member\"]), context);\n }\n if (output[\"Version\"] !== undefined) {\n contents.Version = (0, smithy_client_1.expectString)(output[\"Version\"]);\n }\n if (output[\"Metadata\"] !== undefined) {\n contents.Metadata = (0, smithy_client_1.expectString)(output[\"Metadata\"]);\n }\n if (output.DeclaredTransforms === \"\") {\n contents.DeclaredTransforms = [];\n }\n else if (output[\"DeclaredTransforms\"] !== undefined && output[\"DeclaredTransforms\"][\"member\"] !== undefined) {\n contents.DeclaredTransforms = de_TransformsList((0, smithy_client_1.getArrayIfSingleItem)(output[\"DeclaredTransforms\"][\"member\"]), context);\n }\n if (output.ResourceIdentifierSummaries === \"\") {\n contents.ResourceIdentifierSummaries = [];\n }\n else if (output[\"ResourceIdentifierSummaries\"] !== undefined &&\n output[\"ResourceIdentifierSummaries\"][\"member\"] !== undefined) {\n contents.ResourceIdentifierSummaries = de_ResourceIdentifierSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"ResourceIdentifierSummaries\"][\"member\"]), context);\n }\n if (output[\"Warnings\"] !== undefined) {\n contents.Warnings = de_Warnings(output[\"Warnings\"], context);\n }\n return contents;\n};\nconst de_Imports = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_ImportStacksToStackSetOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_InsufficientCapabilitiesException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_InvalidChangeSetStatusException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_InvalidOperationException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_InvalidStateTransitionException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_LimitExceededException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_ListChangeSetsOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_ChangeSetSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListExportsOutput = (output, context) => {\n const contents = {};\n if (output.Exports === \"\") {\n contents.Exports = [];\n }\n else if (output[\"Exports\"] !== undefined && output[\"Exports\"][\"member\"] !== undefined) {\n contents.Exports = de_Exports((0, smithy_client_1.getArrayIfSingleItem)(output[\"Exports\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListImportsOutput = (output, context) => {\n const contents = {};\n if (output.Imports === \"\") {\n contents.Imports = [];\n }\n else if (output[\"Imports\"] !== undefined && output[\"Imports\"][\"member\"] !== undefined) {\n contents.Imports = de_Imports((0, smithy_client_1.getArrayIfSingleItem)(output[\"Imports\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackInstanceResourceDriftsOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_StackInstanceResourceDriftsSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackInstancesOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_StackInstanceSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackResourcesOutput = (output, context) => {\n const contents = {};\n if (output.StackResourceSummaries === \"\") {\n contents.StackResourceSummaries = [];\n }\n else if (output[\"StackResourceSummaries\"] !== undefined &&\n output[\"StackResourceSummaries\"][\"member\"] !== undefined) {\n contents.StackResourceSummaries = de_StackResourceSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"StackResourceSummaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackSetOperationResultsOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_StackSetOperationResultSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackSetOperationsOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_StackSetOperationSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStackSetsOutput = (output, context) => {\n const contents = {};\n if (output.Summaries === \"\") {\n contents.Summaries = [];\n }\n else if (output[\"Summaries\"] !== undefined && output[\"Summaries\"][\"member\"] !== undefined) {\n contents.Summaries = de_StackSetSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"Summaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListStacksOutput = (output, context) => {\n const contents = {};\n if (output.StackSummaries === \"\") {\n contents.StackSummaries = [];\n }\n else if (output[\"StackSummaries\"] !== undefined && output[\"StackSummaries\"][\"member\"] !== undefined) {\n contents.StackSummaries = de_StackSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"StackSummaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListTypeRegistrationsOutput = (output, context) => {\n const contents = {};\n if (output.RegistrationTokenList === \"\") {\n contents.RegistrationTokenList = [];\n }\n else if (output[\"RegistrationTokenList\"] !== undefined && output[\"RegistrationTokenList\"][\"member\"] !== undefined) {\n contents.RegistrationTokenList = de_RegistrationTokenList((0, smithy_client_1.getArrayIfSingleItem)(output[\"RegistrationTokenList\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListTypesOutput = (output, context) => {\n const contents = {};\n if (output.TypeSummaries === \"\") {\n contents.TypeSummaries = [];\n }\n else if (output[\"TypeSummaries\"] !== undefined && output[\"TypeSummaries\"][\"member\"] !== undefined) {\n contents.TypeSummaries = de_TypeSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"TypeSummaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_ListTypeVersionsOutput = (output, context) => {\n const contents = {};\n if (output.TypeVersionSummaries === \"\") {\n contents.TypeVersionSummaries = [];\n }\n else if (output[\"TypeVersionSummaries\"] !== undefined && output[\"TypeVersionSummaries\"][\"member\"] !== undefined) {\n contents.TypeVersionSummaries = de_TypeVersionSummaries((0, smithy_client_1.getArrayIfSingleItem)(output[\"TypeVersionSummaries\"][\"member\"]), context);\n }\n if (output[\"NextToken\"] !== undefined) {\n contents.NextToken = (0, smithy_client_1.expectString)(output[\"NextToken\"]);\n }\n return contents;\n};\nconst de_LoggingConfig = (output, context) => {\n const contents = {};\n if (output[\"LogRoleArn\"] !== undefined) {\n contents.LogRoleArn = (0, smithy_client_1.expectString)(output[\"LogRoleArn\"]);\n }\n if (output[\"LogGroupName\"] !== undefined) {\n contents.LogGroupName = (0, smithy_client_1.expectString)(output[\"LogGroupName\"]);\n }\n return contents;\n};\nconst de_LogicalResourceIds = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_ManagedExecution = (output, context) => {\n const contents = {};\n if (output[\"Active\"] !== undefined) {\n contents.Active = (0, smithy_client_1.parseBoolean)(output[\"Active\"]);\n }\n return contents;\n};\nconst de_ModuleInfo = (output, context) => {\n const contents = {};\n if (output[\"TypeHierarchy\"] !== undefined) {\n contents.TypeHierarchy = (0, smithy_client_1.expectString)(output[\"TypeHierarchy\"]);\n }\n if (output[\"LogicalIdHierarchy\"] !== undefined) {\n contents.LogicalIdHierarchy = (0, smithy_client_1.expectString)(output[\"LogicalIdHierarchy\"]);\n }\n return contents;\n};\nconst de_NameAlreadyExistsException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_NotificationARNs = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_OperationIdAlreadyExistsException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_OperationInProgressException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_OperationNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_OperationStatusCheckFailedException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_OrganizationalUnitIdList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_Output = (output, context) => {\n const contents = {};\n if (output[\"OutputKey\"] !== undefined) {\n contents.OutputKey = (0, smithy_client_1.expectString)(output[\"OutputKey\"]);\n }\n if (output[\"OutputValue\"] !== undefined) {\n contents.OutputValue = (0, smithy_client_1.expectString)(output[\"OutputValue\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"ExportName\"] !== undefined) {\n contents.ExportName = (0, smithy_client_1.expectString)(output[\"ExportName\"]);\n }\n return contents;\n};\nconst de_Outputs = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Output(entry, context);\n });\n};\nconst de_Parameter = (output, context) => {\n const contents = {};\n if (output[\"ParameterKey\"] !== undefined) {\n contents.ParameterKey = (0, smithy_client_1.expectString)(output[\"ParameterKey\"]);\n }\n if (output[\"ParameterValue\"] !== undefined) {\n contents.ParameterValue = (0, smithy_client_1.expectString)(output[\"ParameterValue\"]);\n }\n if (output[\"UsePreviousValue\"] !== undefined) {\n contents.UsePreviousValue = (0, smithy_client_1.parseBoolean)(output[\"UsePreviousValue\"]);\n }\n if (output[\"ResolvedValue\"] !== undefined) {\n contents.ResolvedValue = (0, smithy_client_1.expectString)(output[\"ResolvedValue\"]);\n }\n return contents;\n};\nconst de_ParameterConstraints = (output, context) => {\n const contents = {};\n if (output.AllowedValues === \"\") {\n contents.AllowedValues = [];\n }\n else if (output[\"AllowedValues\"] !== undefined && output[\"AllowedValues\"][\"member\"] !== undefined) {\n contents.AllowedValues = de_AllowedValues((0, smithy_client_1.getArrayIfSingleItem)(output[\"AllowedValues\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_ParameterDeclaration = (output, context) => {\n const contents = {};\n if (output[\"ParameterKey\"] !== undefined) {\n contents.ParameterKey = (0, smithy_client_1.expectString)(output[\"ParameterKey\"]);\n }\n if (output[\"DefaultValue\"] !== undefined) {\n contents.DefaultValue = (0, smithy_client_1.expectString)(output[\"DefaultValue\"]);\n }\n if (output[\"ParameterType\"] !== undefined) {\n contents.ParameterType = (0, smithy_client_1.expectString)(output[\"ParameterType\"]);\n }\n if (output[\"NoEcho\"] !== undefined) {\n contents.NoEcho = (0, smithy_client_1.parseBoolean)(output[\"NoEcho\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"ParameterConstraints\"] !== undefined) {\n contents.ParameterConstraints = de_ParameterConstraints(output[\"ParameterConstraints\"], context);\n }\n return contents;\n};\nconst de_ParameterDeclarations = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_ParameterDeclaration(entry, context);\n });\n};\nconst de_Parameters = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Parameter(entry, context);\n });\n};\nconst de_PhysicalResourceIdContext = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_PhysicalResourceIdContextKeyValuePair(entry, context);\n });\n};\nconst de_PhysicalResourceIdContextKeyValuePair = (output, context) => {\n const contents = {};\n if (output[\"Key\"] !== undefined) {\n contents.Key = (0, smithy_client_1.expectString)(output[\"Key\"]);\n }\n if (output[\"Value\"] !== undefined) {\n contents.Value = (0, smithy_client_1.expectString)(output[\"Value\"]);\n }\n return contents;\n};\nconst de_PropertyDifference = (output, context) => {\n const contents = {};\n if (output[\"PropertyPath\"] !== undefined) {\n contents.PropertyPath = (0, smithy_client_1.expectString)(output[\"PropertyPath\"]);\n }\n if (output[\"ExpectedValue\"] !== undefined) {\n contents.ExpectedValue = (0, smithy_client_1.expectString)(output[\"ExpectedValue\"]);\n }\n if (output[\"ActualValue\"] !== undefined) {\n contents.ActualValue = (0, smithy_client_1.expectString)(output[\"ActualValue\"]);\n }\n if (output[\"DifferenceType\"] !== undefined) {\n contents.DifferenceType = (0, smithy_client_1.expectString)(output[\"DifferenceType\"]);\n }\n return contents;\n};\nconst de_PropertyDifferences = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_PropertyDifference(entry, context);\n });\n};\nconst de_PublishTypeOutput = (output, context) => {\n const contents = {};\n if (output[\"PublicTypeArn\"] !== undefined) {\n contents.PublicTypeArn = (0, smithy_client_1.expectString)(output[\"PublicTypeArn\"]);\n }\n return contents;\n};\nconst de_RecordHandlerProgressOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_RegionList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_RegisterPublisherOutput = (output, context) => {\n const contents = {};\n if (output[\"PublisherId\"] !== undefined) {\n contents.PublisherId = (0, smithy_client_1.expectString)(output[\"PublisherId\"]);\n }\n return contents;\n};\nconst de_RegisterTypeOutput = (output, context) => {\n const contents = {};\n if (output[\"RegistrationToken\"] !== undefined) {\n contents.RegistrationToken = (0, smithy_client_1.expectString)(output[\"RegistrationToken\"]);\n }\n return contents;\n};\nconst de_RegistrationTokenList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_RequiredActivatedType = (output, context) => {\n const contents = {};\n if (output[\"TypeNameAlias\"] !== undefined) {\n contents.TypeNameAlias = (0, smithy_client_1.expectString)(output[\"TypeNameAlias\"]);\n }\n if (output[\"OriginalTypeName\"] !== undefined) {\n contents.OriginalTypeName = (0, smithy_client_1.expectString)(output[\"OriginalTypeName\"]);\n }\n if (output[\"PublisherId\"] !== undefined) {\n contents.PublisherId = (0, smithy_client_1.expectString)(output[\"PublisherId\"]);\n }\n if (output.SupportedMajorVersions === \"\") {\n contents.SupportedMajorVersions = [];\n }\n else if (output[\"SupportedMajorVersions\"] !== undefined &&\n output[\"SupportedMajorVersions\"][\"member\"] !== undefined) {\n contents.SupportedMajorVersions = de_SupportedMajorVersions((0, smithy_client_1.getArrayIfSingleItem)(output[\"SupportedMajorVersions\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_RequiredActivatedTypes = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_RequiredActivatedType(entry, context);\n });\n};\nconst de_ResourceChange = (output, context) => {\n const contents = {};\n if (output[\"Action\"] !== undefined) {\n contents.Action = (0, smithy_client_1.expectString)(output[\"Action\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"Replacement\"] !== undefined) {\n contents.Replacement = (0, smithy_client_1.expectString)(output[\"Replacement\"]);\n }\n if (output.Scope === \"\") {\n contents.Scope = [];\n }\n else if (output[\"Scope\"] !== undefined && output[\"Scope\"][\"member\"] !== undefined) {\n contents.Scope = de_Scope((0, smithy_client_1.getArrayIfSingleItem)(output[\"Scope\"][\"member\"]), context);\n }\n if (output.Details === \"\") {\n contents.Details = [];\n }\n else if (output[\"Details\"] !== undefined && output[\"Details\"][\"member\"] !== undefined) {\n contents.Details = de_ResourceChangeDetails((0, smithy_client_1.getArrayIfSingleItem)(output[\"Details\"][\"member\"]), context);\n }\n if (output[\"ChangeSetId\"] !== undefined) {\n contents.ChangeSetId = (0, smithy_client_1.expectString)(output[\"ChangeSetId\"]);\n }\n if (output[\"ModuleInfo\"] !== undefined) {\n contents.ModuleInfo = de_ModuleInfo(output[\"ModuleInfo\"], context);\n }\n return contents;\n};\nconst de_ResourceChangeDetail = (output, context) => {\n const contents = {};\n if (output[\"Target\"] !== undefined) {\n contents.Target = de_ResourceTargetDefinition(output[\"Target\"], context);\n }\n if (output[\"Evaluation\"] !== undefined) {\n contents.Evaluation = (0, smithy_client_1.expectString)(output[\"Evaluation\"]);\n }\n if (output[\"ChangeSource\"] !== undefined) {\n contents.ChangeSource = (0, smithy_client_1.expectString)(output[\"ChangeSource\"]);\n }\n if (output[\"CausingEntity\"] !== undefined) {\n contents.CausingEntity = (0, smithy_client_1.expectString)(output[\"CausingEntity\"]);\n }\n return contents;\n};\nconst de_ResourceChangeDetails = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_ResourceChangeDetail(entry, context);\n });\n};\nconst de_ResourceIdentifiers = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_ResourceIdentifierSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_ResourceIdentifierSummary(entry, context);\n });\n};\nconst de_ResourceIdentifierSummary = (output, context) => {\n const contents = {};\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output.LogicalResourceIds === \"\") {\n contents.LogicalResourceIds = [];\n }\n else if (output[\"LogicalResourceIds\"] !== undefined && output[\"LogicalResourceIds\"][\"member\"] !== undefined) {\n contents.LogicalResourceIds = de_LogicalResourceIds((0, smithy_client_1.getArrayIfSingleItem)(output[\"LogicalResourceIds\"][\"member\"]), context);\n }\n if (output.ResourceIdentifiers === \"\") {\n contents.ResourceIdentifiers = [];\n }\n else if (output[\"ResourceIdentifiers\"] !== undefined && output[\"ResourceIdentifiers\"][\"member\"] !== undefined) {\n contents.ResourceIdentifiers = de_ResourceIdentifiers((0, smithy_client_1.getArrayIfSingleItem)(output[\"ResourceIdentifiers\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_ResourceTargetDefinition = (output, context) => {\n const contents = {};\n if (output[\"Attribute\"] !== undefined) {\n contents.Attribute = (0, smithy_client_1.expectString)(output[\"Attribute\"]);\n }\n if (output[\"Name\"] !== undefined) {\n contents.Name = (0, smithy_client_1.expectString)(output[\"Name\"]);\n }\n if (output[\"RequiresRecreation\"] !== undefined) {\n contents.RequiresRecreation = (0, smithy_client_1.expectString)(output[\"RequiresRecreation\"]);\n }\n return contents;\n};\nconst de_ResourceTypes = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_RollbackConfiguration = (output, context) => {\n const contents = {};\n if (output.RollbackTriggers === \"\") {\n contents.RollbackTriggers = [];\n }\n else if (output[\"RollbackTriggers\"] !== undefined && output[\"RollbackTriggers\"][\"member\"] !== undefined) {\n contents.RollbackTriggers = de_RollbackTriggers((0, smithy_client_1.getArrayIfSingleItem)(output[\"RollbackTriggers\"][\"member\"]), context);\n }\n if (output[\"MonitoringTimeInMinutes\"] !== undefined) {\n contents.MonitoringTimeInMinutes = (0, smithy_client_1.strictParseInt32)(output[\"MonitoringTimeInMinutes\"]);\n }\n return contents;\n};\nconst de_RollbackStackOutput = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n return contents;\n};\nconst de_RollbackTrigger = (output, context) => {\n const contents = {};\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n return contents;\n};\nconst de_RollbackTriggers = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_RollbackTrigger(entry, context);\n });\n};\nconst de_Scope = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_SetTypeConfigurationOutput = (output, context) => {\n const contents = {};\n if (output[\"ConfigurationArn\"] !== undefined) {\n contents.ConfigurationArn = (0, smithy_client_1.expectString)(output[\"ConfigurationArn\"]);\n }\n return contents;\n};\nconst de_SetTypeDefaultVersionOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_Stack = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"ChangeSetId\"] !== undefined) {\n contents.ChangeSetId = (0, smithy_client_1.expectString)(output[\"ChangeSetId\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output.Parameters === \"\") {\n contents.Parameters = [];\n }\n else if (output[\"Parameters\"] !== undefined && output[\"Parameters\"][\"member\"] !== undefined) {\n contents.Parameters = de_Parameters((0, smithy_client_1.getArrayIfSingleItem)(output[\"Parameters\"][\"member\"]), context);\n }\n if (output[\"CreationTime\"] !== undefined) {\n contents.CreationTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTime\"]));\n }\n if (output[\"DeletionTime\"] !== undefined) {\n contents.DeletionTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"DeletionTime\"]));\n }\n if (output[\"LastUpdatedTime\"] !== undefined) {\n contents.LastUpdatedTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdatedTime\"]));\n }\n if (output[\"RollbackConfiguration\"] !== undefined) {\n contents.RollbackConfiguration = de_RollbackConfiguration(output[\"RollbackConfiguration\"], context);\n }\n if (output[\"StackStatus\"] !== undefined) {\n contents.StackStatus = (0, smithy_client_1.expectString)(output[\"StackStatus\"]);\n }\n if (output[\"StackStatusReason\"] !== undefined) {\n contents.StackStatusReason = (0, smithy_client_1.expectString)(output[\"StackStatusReason\"]);\n }\n if (output[\"DisableRollback\"] !== undefined) {\n contents.DisableRollback = (0, smithy_client_1.parseBoolean)(output[\"DisableRollback\"]);\n }\n if (output.NotificationARNs === \"\") {\n contents.NotificationARNs = [];\n }\n else if (output[\"NotificationARNs\"] !== undefined && output[\"NotificationARNs\"][\"member\"] !== undefined) {\n contents.NotificationARNs = de_NotificationARNs((0, smithy_client_1.getArrayIfSingleItem)(output[\"NotificationARNs\"][\"member\"]), context);\n }\n if (output[\"TimeoutInMinutes\"] !== undefined) {\n contents.TimeoutInMinutes = (0, smithy_client_1.strictParseInt32)(output[\"TimeoutInMinutes\"]);\n }\n if (output.Capabilities === \"\") {\n contents.Capabilities = [];\n }\n else if (output[\"Capabilities\"] !== undefined && output[\"Capabilities\"][\"member\"] !== undefined) {\n contents.Capabilities = de_Capabilities((0, smithy_client_1.getArrayIfSingleItem)(output[\"Capabilities\"][\"member\"]), context);\n }\n if (output.Outputs === \"\") {\n contents.Outputs = [];\n }\n else if (output[\"Outputs\"] !== undefined && output[\"Outputs\"][\"member\"] !== undefined) {\n contents.Outputs = de_Outputs((0, smithy_client_1.getArrayIfSingleItem)(output[\"Outputs\"][\"member\"]), context);\n }\n if (output[\"RoleARN\"] !== undefined) {\n contents.RoleARN = (0, smithy_client_1.expectString)(output[\"RoleARN\"]);\n }\n if (output.Tags === \"\") {\n contents.Tags = [];\n }\n else if (output[\"Tags\"] !== undefined && output[\"Tags\"][\"member\"] !== undefined) {\n contents.Tags = de_Tags((0, smithy_client_1.getArrayIfSingleItem)(output[\"Tags\"][\"member\"]), context);\n }\n if (output[\"EnableTerminationProtection\"] !== undefined) {\n contents.EnableTerminationProtection = (0, smithy_client_1.parseBoolean)(output[\"EnableTerminationProtection\"]);\n }\n if (output[\"ParentId\"] !== undefined) {\n contents.ParentId = (0, smithy_client_1.expectString)(output[\"ParentId\"]);\n }\n if (output[\"RootId\"] !== undefined) {\n contents.RootId = (0, smithy_client_1.expectString)(output[\"RootId\"]);\n }\n if (output[\"DriftInformation\"] !== undefined) {\n contents.DriftInformation = de_StackDriftInformation(output[\"DriftInformation\"], context);\n }\n if (output[\"RetainExceptOnCreate\"] !== undefined) {\n contents.RetainExceptOnCreate = (0, smithy_client_1.parseBoolean)(output[\"RetainExceptOnCreate\"]);\n }\n return contents;\n};\nconst de_StackDriftInformation = (output, context) => {\n const contents = {};\n if (output[\"StackDriftStatus\"] !== undefined) {\n contents.StackDriftStatus = (0, smithy_client_1.expectString)(output[\"StackDriftStatus\"]);\n }\n if (output[\"LastCheckTimestamp\"] !== undefined) {\n contents.LastCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastCheckTimestamp\"]));\n }\n return contents;\n};\nconst de_StackDriftInformationSummary = (output, context) => {\n const contents = {};\n if (output[\"StackDriftStatus\"] !== undefined) {\n contents.StackDriftStatus = (0, smithy_client_1.expectString)(output[\"StackDriftStatus\"]);\n }\n if (output[\"LastCheckTimestamp\"] !== undefined) {\n contents.LastCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastCheckTimestamp\"]));\n }\n return contents;\n};\nconst de_StackEvent = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"EventId\"] !== undefined) {\n contents.EventId = (0, smithy_client_1.expectString)(output[\"EventId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"Timestamp\"] !== undefined) {\n contents.Timestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Timestamp\"]));\n }\n if (output[\"ResourceStatus\"] !== undefined) {\n contents.ResourceStatus = (0, smithy_client_1.expectString)(output[\"ResourceStatus\"]);\n }\n if (output[\"ResourceStatusReason\"] !== undefined) {\n contents.ResourceStatusReason = (0, smithy_client_1.expectString)(output[\"ResourceStatusReason\"]);\n }\n if (output[\"ResourceProperties\"] !== undefined) {\n contents.ResourceProperties = (0, smithy_client_1.expectString)(output[\"ResourceProperties\"]);\n }\n if (output[\"ClientRequestToken\"] !== undefined) {\n contents.ClientRequestToken = (0, smithy_client_1.expectString)(output[\"ClientRequestToken\"]);\n }\n if (output[\"HookType\"] !== undefined) {\n contents.HookType = (0, smithy_client_1.expectString)(output[\"HookType\"]);\n }\n if (output[\"HookStatus\"] !== undefined) {\n contents.HookStatus = (0, smithy_client_1.expectString)(output[\"HookStatus\"]);\n }\n if (output[\"HookStatusReason\"] !== undefined) {\n contents.HookStatusReason = (0, smithy_client_1.expectString)(output[\"HookStatusReason\"]);\n }\n if (output[\"HookInvocationPoint\"] !== undefined) {\n contents.HookInvocationPoint = (0, smithy_client_1.expectString)(output[\"HookInvocationPoint\"]);\n }\n if (output[\"HookFailureMode\"] !== undefined) {\n contents.HookFailureMode = (0, smithy_client_1.expectString)(output[\"HookFailureMode\"]);\n }\n return contents;\n};\nconst de_StackEvents = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackEvent(entry, context);\n });\n};\nconst de_StackInstance = (output, context) => {\n const contents = {};\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n if (output[\"Region\"] !== undefined) {\n contents.Region = (0, smithy_client_1.expectString)(output[\"Region\"]);\n }\n if (output[\"Account\"] !== undefined) {\n contents.Account = (0, smithy_client_1.expectString)(output[\"Account\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output.ParameterOverrides === \"\") {\n contents.ParameterOverrides = [];\n }\n else if (output[\"ParameterOverrides\"] !== undefined && output[\"ParameterOverrides\"][\"member\"] !== undefined) {\n contents.ParameterOverrides = de_Parameters((0, smithy_client_1.getArrayIfSingleItem)(output[\"ParameterOverrides\"][\"member\"]), context);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StackInstanceStatus\"] !== undefined) {\n contents.StackInstanceStatus = de_StackInstanceComprehensiveStatus(output[\"StackInstanceStatus\"], context);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"OrganizationalUnitId\"] !== undefined) {\n contents.OrganizationalUnitId = (0, smithy_client_1.expectString)(output[\"OrganizationalUnitId\"]);\n }\n if (output[\"DriftStatus\"] !== undefined) {\n contents.DriftStatus = (0, smithy_client_1.expectString)(output[\"DriftStatus\"]);\n }\n if (output[\"LastDriftCheckTimestamp\"] !== undefined) {\n contents.LastDriftCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastDriftCheckTimestamp\"]));\n }\n if (output[\"LastOperationId\"] !== undefined) {\n contents.LastOperationId = (0, smithy_client_1.expectString)(output[\"LastOperationId\"]);\n }\n return contents;\n};\nconst de_StackInstanceComprehensiveStatus = (output, context) => {\n const contents = {};\n if (output[\"DetailedStatus\"] !== undefined) {\n contents.DetailedStatus = (0, smithy_client_1.expectString)(output[\"DetailedStatus\"]);\n }\n return contents;\n};\nconst de_StackInstanceNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_StackInstanceResourceDriftsSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackInstanceResourceDriftsSummary(entry, context);\n });\n};\nconst de_StackInstanceResourceDriftsSummary = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output.PhysicalResourceIdContext === \"\") {\n contents.PhysicalResourceIdContext = [];\n }\n else if (output[\"PhysicalResourceIdContext\"] !== undefined &&\n output[\"PhysicalResourceIdContext\"][\"member\"] !== undefined) {\n contents.PhysicalResourceIdContext = de_PhysicalResourceIdContext((0, smithy_client_1.getArrayIfSingleItem)(output[\"PhysicalResourceIdContext\"][\"member\"]), context);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output.PropertyDifferences === \"\") {\n contents.PropertyDifferences = [];\n }\n else if (output[\"PropertyDifferences\"] !== undefined && output[\"PropertyDifferences\"][\"member\"] !== undefined) {\n contents.PropertyDifferences = de_PropertyDifferences((0, smithy_client_1.getArrayIfSingleItem)(output[\"PropertyDifferences\"][\"member\"]), context);\n }\n if (output[\"StackResourceDriftStatus\"] !== undefined) {\n contents.StackResourceDriftStatus = (0, smithy_client_1.expectString)(output[\"StackResourceDriftStatus\"]);\n }\n if (output[\"Timestamp\"] !== undefined) {\n contents.Timestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Timestamp\"]));\n }\n return contents;\n};\nconst de_StackInstanceSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackInstanceSummary(entry, context);\n });\n};\nconst de_StackInstanceSummary = (output, context) => {\n const contents = {};\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n if (output[\"Region\"] !== undefined) {\n contents.Region = (0, smithy_client_1.expectString)(output[\"Region\"]);\n }\n if (output[\"Account\"] !== undefined) {\n contents.Account = (0, smithy_client_1.expectString)(output[\"Account\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"StackInstanceStatus\"] !== undefined) {\n contents.StackInstanceStatus = de_StackInstanceComprehensiveStatus(output[\"StackInstanceStatus\"], context);\n }\n if (output[\"OrganizationalUnitId\"] !== undefined) {\n contents.OrganizationalUnitId = (0, smithy_client_1.expectString)(output[\"OrganizationalUnitId\"]);\n }\n if (output[\"DriftStatus\"] !== undefined) {\n contents.DriftStatus = (0, smithy_client_1.expectString)(output[\"DriftStatus\"]);\n }\n if (output[\"LastDriftCheckTimestamp\"] !== undefined) {\n contents.LastDriftCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastDriftCheckTimestamp\"]));\n }\n if (output[\"LastOperationId\"] !== undefined) {\n contents.LastOperationId = (0, smithy_client_1.expectString)(output[\"LastOperationId\"]);\n }\n return contents;\n};\nconst de_StackNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_StackResource = (output, context) => {\n const contents = {};\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"Timestamp\"] !== undefined) {\n contents.Timestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Timestamp\"]));\n }\n if (output[\"ResourceStatus\"] !== undefined) {\n contents.ResourceStatus = (0, smithy_client_1.expectString)(output[\"ResourceStatus\"]);\n }\n if (output[\"ResourceStatusReason\"] !== undefined) {\n contents.ResourceStatusReason = (0, smithy_client_1.expectString)(output[\"ResourceStatusReason\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"DriftInformation\"] !== undefined) {\n contents.DriftInformation = de_StackResourceDriftInformation(output[\"DriftInformation\"], context);\n }\n if (output[\"ModuleInfo\"] !== undefined) {\n contents.ModuleInfo = de_ModuleInfo(output[\"ModuleInfo\"], context);\n }\n return contents;\n};\nconst de_StackResourceDetail = (output, context) => {\n const contents = {};\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"LastUpdatedTimestamp\"] !== undefined) {\n contents.LastUpdatedTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdatedTimestamp\"]));\n }\n if (output[\"ResourceStatus\"] !== undefined) {\n contents.ResourceStatus = (0, smithy_client_1.expectString)(output[\"ResourceStatus\"]);\n }\n if (output[\"ResourceStatusReason\"] !== undefined) {\n contents.ResourceStatusReason = (0, smithy_client_1.expectString)(output[\"ResourceStatusReason\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"Metadata\"] !== undefined) {\n contents.Metadata = (0, smithy_client_1.expectString)(output[\"Metadata\"]);\n }\n if (output[\"DriftInformation\"] !== undefined) {\n contents.DriftInformation = de_StackResourceDriftInformation(output[\"DriftInformation\"], context);\n }\n if (output[\"ModuleInfo\"] !== undefined) {\n contents.ModuleInfo = de_ModuleInfo(output[\"ModuleInfo\"], context);\n }\n return contents;\n};\nconst de_StackResourceDrift = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output.PhysicalResourceIdContext === \"\") {\n contents.PhysicalResourceIdContext = [];\n }\n else if (output[\"PhysicalResourceIdContext\"] !== undefined &&\n output[\"PhysicalResourceIdContext\"][\"member\"] !== undefined) {\n contents.PhysicalResourceIdContext = de_PhysicalResourceIdContext((0, smithy_client_1.getArrayIfSingleItem)(output[\"PhysicalResourceIdContext\"][\"member\"]), context);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"ExpectedProperties\"] !== undefined) {\n contents.ExpectedProperties = (0, smithy_client_1.expectString)(output[\"ExpectedProperties\"]);\n }\n if (output[\"ActualProperties\"] !== undefined) {\n contents.ActualProperties = (0, smithy_client_1.expectString)(output[\"ActualProperties\"]);\n }\n if (output.PropertyDifferences === \"\") {\n contents.PropertyDifferences = [];\n }\n else if (output[\"PropertyDifferences\"] !== undefined && output[\"PropertyDifferences\"][\"member\"] !== undefined) {\n contents.PropertyDifferences = de_PropertyDifferences((0, smithy_client_1.getArrayIfSingleItem)(output[\"PropertyDifferences\"][\"member\"]), context);\n }\n if (output[\"StackResourceDriftStatus\"] !== undefined) {\n contents.StackResourceDriftStatus = (0, smithy_client_1.expectString)(output[\"StackResourceDriftStatus\"]);\n }\n if (output[\"Timestamp\"] !== undefined) {\n contents.Timestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Timestamp\"]));\n }\n if (output[\"ModuleInfo\"] !== undefined) {\n contents.ModuleInfo = de_ModuleInfo(output[\"ModuleInfo\"], context);\n }\n return contents;\n};\nconst de_StackResourceDriftInformation = (output, context) => {\n const contents = {};\n if (output[\"StackResourceDriftStatus\"] !== undefined) {\n contents.StackResourceDriftStatus = (0, smithy_client_1.expectString)(output[\"StackResourceDriftStatus\"]);\n }\n if (output[\"LastCheckTimestamp\"] !== undefined) {\n contents.LastCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastCheckTimestamp\"]));\n }\n return contents;\n};\nconst de_StackResourceDriftInformationSummary = (output, context) => {\n const contents = {};\n if (output[\"StackResourceDriftStatus\"] !== undefined) {\n contents.StackResourceDriftStatus = (0, smithy_client_1.expectString)(output[\"StackResourceDriftStatus\"]);\n }\n if (output[\"LastCheckTimestamp\"] !== undefined) {\n contents.LastCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastCheckTimestamp\"]));\n }\n return contents;\n};\nconst de_StackResourceDrifts = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackResourceDrift(entry, context);\n });\n};\nconst de_StackResources = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackResource(entry, context);\n });\n};\nconst de_StackResourceSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackResourceSummary(entry, context);\n });\n};\nconst de_StackResourceSummary = (output, context) => {\n const contents = {};\n if (output[\"LogicalResourceId\"] !== undefined) {\n contents.LogicalResourceId = (0, smithy_client_1.expectString)(output[\"LogicalResourceId\"]);\n }\n if (output[\"PhysicalResourceId\"] !== undefined) {\n contents.PhysicalResourceId = (0, smithy_client_1.expectString)(output[\"PhysicalResourceId\"]);\n }\n if (output[\"ResourceType\"] !== undefined) {\n contents.ResourceType = (0, smithy_client_1.expectString)(output[\"ResourceType\"]);\n }\n if (output[\"LastUpdatedTimestamp\"] !== undefined) {\n contents.LastUpdatedTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdatedTimestamp\"]));\n }\n if (output[\"ResourceStatus\"] !== undefined) {\n contents.ResourceStatus = (0, smithy_client_1.expectString)(output[\"ResourceStatus\"]);\n }\n if (output[\"ResourceStatusReason\"] !== undefined) {\n contents.ResourceStatusReason = (0, smithy_client_1.expectString)(output[\"ResourceStatusReason\"]);\n }\n if (output[\"DriftInformation\"] !== undefined) {\n contents.DriftInformation = de_StackResourceDriftInformationSummary(output[\"DriftInformation\"], context);\n }\n if (output[\"ModuleInfo\"] !== undefined) {\n contents.ModuleInfo = de_ModuleInfo(output[\"ModuleInfo\"], context);\n }\n return contents;\n};\nconst de_Stacks = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Stack(entry, context);\n });\n};\nconst de_StackSet = (output, context) => {\n const contents = {};\n if (output[\"StackSetName\"] !== undefined) {\n contents.StackSetName = (0, smithy_client_1.expectString)(output[\"StackSetName\"]);\n }\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"TemplateBody\"] !== undefined) {\n contents.TemplateBody = (0, smithy_client_1.expectString)(output[\"TemplateBody\"]);\n }\n if (output.Parameters === \"\") {\n contents.Parameters = [];\n }\n else if (output[\"Parameters\"] !== undefined && output[\"Parameters\"][\"member\"] !== undefined) {\n contents.Parameters = de_Parameters((0, smithy_client_1.getArrayIfSingleItem)(output[\"Parameters\"][\"member\"]), context);\n }\n if (output.Capabilities === \"\") {\n contents.Capabilities = [];\n }\n else if (output[\"Capabilities\"] !== undefined && output[\"Capabilities\"][\"member\"] !== undefined) {\n contents.Capabilities = de_Capabilities((0, smithy_client_1.getArrayIfSingleItem)(output[\"Capabilities\"][\"member\"]), context);\n }\n if (output.Tags === \"\") {\n contents.Tags = [];\n }\n else if (output[\"Tags\"] !== undefined && output[\"Tags\"][\"member\"] !== undefined) {\n contents.Tags = de_Tags((0, smithy_client_1.getArrayIfSingleItem)(output[\"Tags\"][\"member\"]), context);\n }\n if (output[\"StackSetARN\"] !== undefined) {\n contents.StackSetARN = (0, smithy_client_1.expectString)(output[\"StackSetARN\"]);\n }\n if (output[\"AdministrationRoleARN\"] !== undefined) {\n contents.AdministrationRoleARN = (0, smithy_client_1.expectString)(output[\"AdministrationRoleARN\"]);\n }\n if (output[\"ExecutionRoleName\"] !== undefined) {\n contents.ExecutionRoleName = (0, smithy_client_1.expectString)(output[\"ExecutionRoleName\"]);\n }\n if (output[\"StackSetDriftDetectionDetails\"] !== undefined) {\n contents.StackSetDriftDetectionDetails = de_StackSetDriftDetectionDetails(output[\"StackSetDriftDetectionDetails\"], context);\n }\n if (output[\"AutoDeployment\"] !== undefined) {\n contents.AutoDeployment = de_AutoDeployment(output[\"AutoDeployment\"], context);\n }\n if (output[\"PermissionModel\"] !== undefined) {\n contents.PermissionModel = (0, smithy_client_1.expectString)(output[\"PermissionModel\"]);\n }\n if (output.OrganizationalUnitIds === \"\") {\n contents.OrganizationalUnitIds = [];\n }\n else if (output[\"OrganizationalUnitIds\"] !== undefined && output[\"OrganizationalUnitIds\"][\"member\"] !== undefined) {\n contents.OrganizationalUnitIds = de_OrganizationalUnitIdList((0, smithy_client_1.getArrayIfSingleItem)(output[\"OrganizationalUnitIds\"][\"member\"]), context);\n }\n if (output[\"ManagedExecution\"] !== undefined) {\n contents.ManagedExecution = de_ManagedExecution(output[\"ManagedExecution\"], context);\n }\n if (output.Regions === \"\") {\n contents.Regions = [];\n }\n else if (output[\"Regions\"] !== undefined && output[\"Regions\"][\"member\"] !== undefined) {\n contents.Regions = de_RegionList((0, smithy_client_1.getArrayIfSingleItem)(output[\"Regions\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_StackSetDriftDetectionDetails = (output, context) => {\n const contents = {};\n if (output[\"DriftStatus\"] !== undefined) {\n contents.DriftStatus = (0, smithy_client_1.expectString)(output[\"DriftStatus\"]);\n }\n if (output[\"DriftDetectionStatus\"] !== undefined) {\n contents.DriftDetectionStatus = (0, smithy_client_1.expectString)(output[\"DriftDetectionStatus\"]);\n }\n if (output[\"LastDriftCheckTimestamp\"] !== undefined) {\n contents.LastDriftCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastDriftCheckTimestamp\"]));\n }\n if (output[\"TotalStackInstancesCount\"] !== undefined) {\n contents.TotalStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"TotalStackInstancesCount\"]);\n }\n if (output[\"DriftedStackInstancesCount\"] !== undefined) {\n contents.DriftedStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"DriftedStackInstancesCount\"]);\n }\n if (output[\"InSyncStackInstancesCount\"] !== undefined) {\n contents.InSyncStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"InSyncStackInstancesCount\"]);\n }\n if (output[\"InProgressStackInstancesCount\"] !== undefined) {\n contents.InProgressStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"InProgressStackInstancesCount\"]);\n }\n if (output[\"FailedStackInstancesCount\"] !== undefined) {\n contents.FailedStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"FailedStackInstancesCount\"]);\n }\n return contents;\n};\nconst de_StackSetNotEmptyException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_StackSetNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_StackSetOperation = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n if (output[\"Action\"] !== undefined) {\n contents.Action = (0, smithy_client_1.expectString)(output[\"Action\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"OperationPreferences\"] !== undefined) {\n contents.OperationPreferences = de_StackSetOperationPreferences(output[\"OperationPreferences\"], context);\n }\n if (output[\"RetainStacks\"] !== undefined) {\n contents.RetainStacks = (0, smithy_client_1.parseBoolean)(output[\"RetainStacks\"]);\n }\n if (output[\"AdministrationRoleARN\"] !== undefined) {\n contents.AdministrationRoleARN = (0, smithy_client_1.expectString)(output[\"AdministrationRoleARN\"]);\n }\n if (output[\"ExecutionRoleName\"] !== undefined) {\n contents.ExecutionRoleName = (0, smithy_client_1.expectString)(output[\"ExecutionRoleName\"]);\n }\n if (output[\"CreationTimestamp\"] !== undefined) {\n contents.CreationTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTimestamp\"]));\n }\n if (output[\"EndTimestamp\"] !== undefined) {\n contents.EndTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"EndTimestamp\"]));\n }\n if (output[\"DeploymentTargets\"] !== undefined) {\n contents.DeploymentTargets = de_DeploymentTargets(output[\"DeploymentTargets\"], context);\n }\n if (output[\"StackSetDriftDetectionDetails\"] !== undefined) {\n contents.StackSetDriftDetectionDetails = de_StackSetDriftDetectionDetails(output[\"StackSetDriftDetectionDetails\"], context);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"StatusDetails\"] !== undefined) {\n contents.StatusDetails = de_StackSetOperationStatusDetails(output[\"StatusDetails\"], context);\n }\n return contents;\n};\nconst de_StackSetOperationPreferences = (output, context) => {\n const contents = {};\n if (output[\"RegionConcurrencyType\"] !== undefined) {\n contents.RegionConcurrencyType = (0, smithy_client_1.expectString)(output[\"RegionConcurrencyType\"]);\n }\n if (output.RegionOrder === \"\") {\n contents.RegionOrder = [];\n }\n else if (output[\"RegionOrder\"] !== undefined && output[\"RegionOrder\"][\"member\"] !== undefined) {\n contents.RegionOrder = de_RegionList((0, smithy_client_1.getArrayIfSingleItem)(output[\"RegionOrder\"][\"member\"]), context);\n }\n if (output[\"FailureToleranceCount\"] !== undefined) {\n contents.FailureToleranceCount = (0, smithy_client_1.strictParseInt32)(output[\"FailureToleranceCount\"]);\n }\n if (output[\"FailureTolerancePercentage\"] !== undefined) {\n contents.FailureTolerancePercentage = (0, smithy_client_1.strictParseInt32)(output[\"FailureTolerancePercentage\"]);\n }\n if (output[\"MaxConcurrentCount\"] !== undefined) {\n contents.MaxConcurrentCount = (0, smithy_client_1.strictParseInt32)(output[\"MaxConcurrentCount\"]);\n }\n if (output[\"MaxConcurrentPercentage\"] !== undefined) {\n contents.MaxConcurrentPercentage = (0, smithy_client_1.strictParseInt32)(output[\"MaxConcurrentPercentage\"]);\n }\n if (output[\"ConcurrencyMode\"] !== undefined) {\n contents.ConcurrencyMode = (0, smithy_client_1.expectString)(output[\"ConcurrencyMode\"]);\n }\n return contents;\n};\nconst de_StackSetOperationResultSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackSetOperationResultSummary(entry, context);\n });\n};\nconst de_StackSetOperationResultSummary = (output, context) => {\n const contents = {};\n if (output[\"Account\"] !== undefined) {\n contents.Account = (0, smithy_client_1.expectString)(output[\"Account\"]);\n }\n if (output[\"Region\"] !== undefined) {\n contents.Region = (0, smithy_client_1.expectString)(output[\"Region\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"AccountGateResult\"] !== undefined) {\n contents.AccountGateResult = de_AccountGateResult(output[\"AccountGateResult\"], context);\n }\n if (output[\"OrganizationalUnitId\"] !== undefined) {\n contents.OrganizationalUnitId = (0, smithy_client_1.expectString)(output[\"OrganizationalUnitId\"]);\n }\n return contents;\n};\nconst de_StackSetOperationStatusDetails = (output, context) => {\n const contents = {};\n if (output[\"FailedStackInstancesCount\"] !== undefined) {\n contents.FailedStackInstancesCount = (0, smithy_client_1.strictParseInt32)(output[\"FailedStackInstancesCount\"]);\n }\n return contents;\n};\nconst de_StackSetOperationSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackSetOperationSummary(entry, context);\n });\n};\nconst de_StackSetOperationSummary = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n if (output[\"Action\"] !== undefined) {\n contents.Action = (0, smithy_client_1.expectString)(output[\"Action\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"CreationTimestamp\"] !== undefined) {\n contents.CreationTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTimestamp\"]));\n }\n if (output[\"EndTimestamp\"] !== undefined) {\n contents.EndTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"EndTimestamp\"]));\n }\n if (output[\"StatusReason\"] !== undefined) {\n contents.StatusReason = (0, smithy_client_1.expectString)(output[\"StatusReason\"]);\n }\n if (output[\"StatusDetails\"] !== undefined) {\n contents.StatusDetails = de_StackSetOperationStatusDetails(output[\"StatusDetails\"], context);\n }\n if (output[\"OperationPreferences\"] !== undefined) {\n contents.OperationPreferences = de_StackSetOperationPreferences(output[\"OperationPreferences\"], context);\n }\n return contents;\n};\nconst de_StackSetSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackSetSummary(entry, context);\n });\n};\nconst de_StackSetSummary = (output, context) => {\n const contents = {};\n if (output[\"StackSetName\"] !== undefined) {\n contents.StackSetName = (0, smithy_client_1.expectString)(output[\"StackSetName\"]);\n }\n if (output[\"StackSetId\"] !== undefined) {\n contents.StackSetId = (0, smithy_client_1.expectString)(output[\"StackSetId\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"Status\"] !== undefined) {\n contents.Status = (0, smithy_client_1.expectString)(output[\"Status\"]);\n }\n if (output[\"AutoDeployment\"] !== undefined) {\n contents.AutoDeployment = de_AutoDeployment(output[\"AutoDeployment\"], context);\n }\n if (output[\"PermissionModel\"] !== undefined) {\n contents.PermissionModel = (0, smithy_client_1.expectString)(output[\"PermissionModel\"]);\n }\n if (output[\"DriftStatus\"] !== undefined) {\n contents.DriftStatus = (0, smithy_client_1.expectString)(output[\"DriftStatus\"]);\n }\n if (output[\"LastDriftCheckTimestamp\"] !== undefined) {\n contents.LastDriftCheckTimestamp = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastDriftCheckTimestamp\"]));\n }\n if (output[\"ManagedExecution\"] !== undefined) {\n contents.ManagedExecution = de_ManagedExecution(output[\"ManagedExecution\"], context);\n }\n return contents;\n};\nconst de_StackSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_StackSummary(entry, context);\n });\n};\nconst de_StackSummary = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n if (output[\"StackName\"] !== undefined) {\n contents.StackName = (0, smithy_client_1.expectString)(output[\"StackName\"]);\n }\n if (output[\"TemplateDescription\"] !== undefined) {\n contents.TemplateDescription = (0, smithy_client_1.expectString)(output[\"TemplateDescription\"]);\n }\n if (output[\"CreationTime\"] !== undefined) {\n contents.CreationTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"CreationTime\"]));\n }\n if (output[\"LastUpdatedTime\"] !== undefined) {\n contents.LastUpdatedTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdatedTime\"]));\n }\n if (output[\"DeletionTime\"] !== undefined) {\n contents.DeletionTime = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"DeletionTime\"]));\n }\n if (output[\"StackStatus\"] !== undefined) {\n contents.StackStatus = (0, smithy_client_1.expectString)(output[\"StackStatus\"]);\n }\n if (output[\"StackStatusReason\"] !== undefined) {\n contents.StackStatusReason = (0, smithy_client_1.expectString)(output[\"StackStatusReason\"]);\n }\n if (output[\"ParentId\"] !== undefined) {\n contents.ParentId = (0, smithy_client_1.expectString)(output[\"ParentId\"]);\n }\n if (output[\"RootId\"] !== undefined) {\n contents.RootId = (0, smithy_client_1.expectString)(output[\"RootId\"]);\n }\n if (output[\"DriftInformation\"] !== undefined) {\n contents.DriftInformation = de_StackDriftInformationSummary(output[\"DriftInformation\"], context);\n }\n return contents;\n};\nconst de_StageList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_StaleRequestException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_StopStackSetOperationOutput = (output, context) => {\n const contents = {};\n return contents;\n};\nconst de_SupportedMajorVersions = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.strictParseInt32)(entry);\n });\n};\nconst de_Tag = (output, context) => {\n const contents = {};\n if (output[\"Key\"] !== undefined) {\n contents.Key = (0, smithy_client_1.expectString)(output[\"Key\"]);\n }\n if (output[\"Value\"] !== undefined) {\n contents.Value = (0, smithy_client_1.expectString)(output[\"Value\"]);\n }\n return contents;\n};\nconst de_Tags = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_Tag(entry, context);\n });\n};\nconst de_TemplateParameter = (output, context) => {\n const contents = {};\n if (output[\"ParameterKey\"] !== undefined) {\n contents.ParameterKey = (0, smithy_client_1.expectString)(output[\"ParameterKey\"]);\n }\n if (output[\"DefaultValue\"] !== undefined) {\n contents.DefaultValue = (0, smithy_client_1.expectString)(output[\"DefaultValue\"]);\n }\n if (output[\"NoEcho\"] !== undefined) {\n contents.NoEcho = (0, smithy_client_1.parseBoolean)(output[\"NoEcho\"]);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n return contents;\n};\nconst de_TemplateParameters = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_TemplateParameter(entry, context);\n });\n};\nconst de_TestTypeOutput = (output, context) => {\n const contents = {};\n if (output[\"TypeVersionArn\"] !== undefined) {\n contents.TypeVersionArn = (0, smithy_client_1.expectString)(output[\"TypeVersionArn\"]);\n }\n return contents;\n};\nconst de_TokenAlreadyExistsException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_TransformsList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return (0, smithy_client_1.expectString)(entry);\n });\n};\nconst de_TypeConfigurationDetails = (output, context) => {\n const contents = {};\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n if (output[\"Alias\"] !== undefined) {\n contents.Alias = (0, smithy_client_1.expectString)(output[\"Alias\"]);\n }\n if (output[\"Configuration\"] !== undefined) {\n contents.Configuration = (0, smithy_client_1.expectString)(output[\"Configuration\"]);\n }\n if (output[\"LastUpdated\"] !== undefined) {\n contents.LastUpdated = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdated\"]));\n }\n if (output[\"TypeArn\"] !== undefined) {\n contents.TypeArn = (0, smithy_client_1.expectString)(output[\"TypeArn\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n if (output[\"IsDefaultConfiguration\"] !== undefined) {\n contents.IsDefaultConfiguration = (0, smithy_client_1.parseBoolean)(output[\"IsDefaultConfiguration\"]);\n }\n return contents;\n};\nconst de_TypeConfigurationDetailsList = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_TypeConfigurationDetails(entry, context);\n });\n};\nconst de_TypeConfigurationIdentifier = (output, context) => {\n const contents = {};\n if (output[\"TypeArn\"] !== undefined) {\n contents.TypeArn = (0, smithy_client_1.expectString)(output[\"TypeArn\"]);\n }\n if (output[\"TypeConfigurationAlias\"] !== undefined) {\n contents.TypeConfigurationAlias = (0, smithy_client_1.expectString)(output[\"TypeConfigurationAlias\"]);\n }\n if (output[\"TypeConfigurationArn\"] !== undefined) {\n contents.TypeConfigurationArn = (0, smithy_client_1.expectString)(output[\"TypeConfigurationArn\"]);\n }\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n return contents;\n};\nconst de_TypeConfigurationNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_TypeNotFoundException = (output, context) => {\n const contents = {};\n if (output[\"Message\"] !== undefined) {\n contents.Message = (0, smithy_client_1.expectString)(output[\"Message\"]);\n }\n return contents;\n};\nconst de_TypeSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_TypeSummary(entry, context);\n });\n};\nconst de_TypeSummary = (output, context) => {\n const contents = {};\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n if (output[\"DefaultVersionId\"] !== undefined) {\n contents.DefaultVersionId = (0, smithy_client_1.expectString)(output[\"DefaultVersionId\"]);\n }\n if (output[\"TypeArn\"] !== undefined) {\n contents.TypeArn = (0, smithy_client_1.expectString)(output[\"TypeArn\"]);\n }\n if (output[\"LastUpdated\"] !== undefined) {\n contents.LastUpdated = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"LastUpdated\"]));\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"PublisherId\"] !== undefined) {\n contents.PublisherId = (0, smithy_client_1.expectString)(output[\"PublisherId\"]);\n }\n if (output[\"OriginalTypeName\"] !== undefined) {\n contents.OriginalTypeName = (0, smithy_client_1.expectString)(output[\"OriginalTypeName\"]);\n }\n if (output[\"PublicVersionNumber\"] !== undefined) {\n contents.PublicVersionNumber = (0, smithy_client_1.expectString)(output[\"PublicVersionNumber\"]);\n }\n if (output[\"LatestPublicVersion\"] !== undefined) {\n contents.LatestPublicVersion = (0, smithy_client_1.expectString)(output[\"LatestPublicVersion\"]);\n }\n if (output[\"PublisherIdentity\"] !== undefined) {\n contents.PublisherIdentity = (0, smithy_client_1.expectString)(output[\"PublisherIdentity\"]);\n }\n if (output[\"PublisherName\"] !== undefined) {\n contents.PublisherName = (0, smithy_client_1.expectString)(output[\"PublisherName\"]);\n }\n if (output[\"IsActivated\"] !== undefined) {\n contents.IsActivated = (0, smithy_client_1.parseBoolean)(output[\"IsActivated\"]);\n }\n return contents;\n};\nconst de_TypeVersionSummaries = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_TypeVersionSummary(entry, context);\n });\n};\nconst de_TypeVersionSummary = (output, context) => {\n const contents = {};\n if (output[\"Type\"] !== undefined) {\n contents.Type = (0, smithy_client_1.expectString)(output[\"Type\"]);\n }\n if (output[\"TypeName\"] !== undefined) {\n contents.TypeName = (0, smithy_client_1.expectString)(output[\"TypeName\"]);\n }\n if (output[\"VersionId\"] !== undefined) {\n contents.VersionId = (0, smithy_client_1.expectString)(output[\"VersionId\"]);\n }\n if (output[\"IsDefaultVersion\"] !== undefined) {\n contents.IsDefaultVersion = (0, smithy_client_1.parseBoolean)(output[\"IsDefaultVersion\"]);\n }\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n if (output[\"TimeCreated\"] !== undefined) {\n contents.TimeCreated = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"TimeCreated\"]));\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output[\"PublicVersionNumber\"] !== undefined) {\n contents.PublicVersionNumber = (0, smithy_client_1.expectString)(output[\"PublicVersionNumber\"]);\n }\n return contents;\n};\nconst de_UnprocessedTypeConfigurations = (output, context) => {\n return (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_TypeConfigurationIdentifier(entry, context);\n });\n};\nconst de_UpdateStackInstancesOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_UpdateStackOutput = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n return contents;\n};\nconst de_UpdateStackSetOutput = (output, context) => {\n const contents = {};\n if (output[\"OperationId\"] !== undefined) {\n contents.OperationId = (0, smithy_client_1.expectString)(output[\"OperationId\"]);\n }\n return contents;\n};\nconst de_UpdateTerminationProtectionOutput = (output, context) => {\n const contents = {};\n if (output[\"StackId\"] !== undefined) {\n contents.StackId = (0, smithy_client_1.expectString)(output[\"StackId\"]);\n }\n return contents;\n};\nconst de_ValidateTemplateOutput = (output, context) => {\n const contents = {};\n if (output.Parameters === \"\") {\n contents.Parameters = [];\n }\n else if (output[\"Parameters\"] !== undefined && output[\"Parameters\"][\"member\"] !== undefined) {\n contents.Parameters = de_TemplateParameters((0, smithy_client_1.getArrayIfSingleItem)(output[\"Parameters\"][\"member\"]), context);\n }\n if (output[\"Description\"] !== undefined) {\n contents.Description = (0, smithy_client_1.expectString)(output[\"Description\"]);\n }\n if (output.Capabilities === \"\") {\n contents.Capabilities = [];\n }\n else if (output[\"Capabilities\"] !== undefined && output[\"Capabilities\"][\"member\"] !== undefined) {\n contents.Capabilities = de_Capabilities((0, smithy_client_1.getArrayIfSingleItem)(output[\"Capabilities\"][\"member\"]), context);\n }\n if (output[\"CapabilitiesReason\"] !== undefined) {\n contents.CapabilitiesReason = (0, smithy_client_1.expectString)(output[\"CapabilitiesReason\"]);\n }\n if (output.DeclaredTransforms === \"\") {\n contents.DeclaredTransforms = [];\n }\n else if (output[\"DeclaredTransforms\"] !== undefined && output[\"DeclaredTransforms\"][\"member\"] !== undefined) {\n contents.DeclaredTransforms = de_TransformsList((0, smithy_client_1.getArrayIfSingleItem)(output[\"DeclaredTransforms\"][\"member\"]), context);\n }\n return contents;\n};\nconst de_Warnings = (output, context) => {\n const contents = {};\n if (output.UnrecognizedResourceTypes === \"\") {\n contents.UnrecognizedResourceTypes = [];\n }\n else if (output[\"UnrecognizedResourceTypes\"] !== undefined &&\n output[\"UnrecognizedResourceTypes\"][\"member\"] !== undefined) {\n contents.UnrecognizedResourceTypes = de_ResourceTypes((0, smithy_client_1.getArrayIfSingleItem)(output[\"UnrecognizedResourceTypes\"][\"member\"]), context);\n }\n return contents;\n};\nconst deserializeMetadata = (output) => ({\n httpStatusCode: output.statusCode,\n requestId: output.headers[\"x-amzn-requestid\"] ?? output.headers[\"x-amzn-request-id\"] ?? output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n});\nconst collectBodyString = (streamBody, context) => (0, smithy_client_1.collectBody)(streamBody, context).then((body) => context.utf8Encoder(body));\nconst throwDefaultError = (0, smithy_client_1.withBaseException)(CloudFormationServiceException_1.CloudFormationServiceException);\nconst buildHttpRpcRequest = async (context, headers, path, resolvedHostname, body) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const contents = {\n protocol,\n hostname,\n port,\n method: \"POST\",\n path: basePath.endsWith(\"/\") ? basePath.slice(0, -1) + path : basePath + path,\n headers,\n };\n if (resolvedHostname !== undefined) {\n contents.hostname = resolvedHostname;\n }\n if (body !== undefined) {\n contents.body = body;\n }\n return new protocol_http_1.HttpRequest(contents);\n};\nconst SHARED_HEADERS = {\n \"content-type\": \"application/x-www-form-urlencoded\",\n};\nconst parseBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n if (encoded.length) {\n const parser = new fast_xml_parser_1.XMLParser({\n attributeNamePrefix: \"\",\n htmlEntities: true,\n ignoreAttributes: false,\n ignoreDeclaration: true,\n parseTagValue: false,\n trimValues: false,\n tagValueProcessor: (_, val) => (val.trim() === \"\" && val.includes(\"\\n\") ? \"\" : undefined),\n });\n parser.addEntity(\"#xD\", \"\\r\");\n parser.addEntity(\"#10\", \"\\n\");\n const parsedObj = parser.parse(encoded);\n const textNodeName = \"#text\";\n const key = Object.keys(parsedObj)[0];\n const parsedObjToReturn = parsedObj[key];\n if (parsedObjToReturn[textNodeName]) {\n parsedObjToReturn[key] = parsedObjToReturn[textNodeName];\n delete parsedObjToReturn[textNodeName];\n }\n return (0, smithy_client_1.getValueFromTextNode)(parsedObjToReturn);\n }\n return {};\n});\nconst parseErrorBody = async (errorBody, context) => {\n const value = await parseBody(errorBody, context);\n if (value.Error) {\n value.Error.message = value.Error.message ?? value.Error.Message;\n }\n return value;\n};\nconst buildFormUrlencodedString = (formEntries) => Object.entries(formEntries)\n .map(([key, value]) => (0, smithy_client_1.extendedEncodeURIComponent)(key) + \"=\" + (0, smithy_client_1.extendedEncodeURIComponent)(value))\n .join(\"&\");\nconst loadQueryErrorCode = (output, data) => {\n if (data.Error?.Code !== undefined) {\n return data.Error.Code;\n }\n if (output.statusCode == 404) {\n return \"NotFound\";\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst tslib_1 = require(\"tslib\");\nconst package_json_1 = tslib_1.__importDefault(require(\"../package.json\"));\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst core_1 = require(\"@aws-sdk/core\");\nconst credential_provider_node_1 = require(\"@aws-sdk/credential-provider-node\");\nconst util_user_agent_node_1 = require(\"@aws-sdk/util-user-agent-node\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst hash_node_1 = require(\"@smithy/hash-node\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_body_length_node_1 = require(\"@smithy/util-body-length-node\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst runtimeConfig_shared_1 = require(\"./runtimeConfig.shared\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst util_defaults_mode_node_1 = require(\"@smithy/util-defaults-mode-node\");\nconst smithy_client_2 = require(\"@smithy/smithy-client\");\nconst getRuntimeConfig = (config) => {\n (0, smithy_client_2.emitWarningIfUnsupportedVersion)(process.version);\n const defaultsMode = (0, util_defaults_mode_node_1.resolveDefaultsModeConfig)(config);\n const defaultConfigProvider = () => defaultsMode().then(smithy_client_1.loadConfigsForDefaultMode);\n const clientSharedValues = (0, runtimeConfig_shared_1.getRuntimeConfig)(config);\n (0, core_1.emitWarningIfUnsupportedVersion)(process.version);\n return {\n ...clientSharedValues,\n ...config,\n runtime: \"node\",\n defaultsMode,\n bodyLengthChecker: config?.bodyLengthChecker ?? util_body_length_node_1.calculateBodyLength,\n credentialDefaultProvider: config?.credentialDefaultProvider ?? (0, client_sts_1.decorateDefaultCredentialProvider)(credential_provider_node_1.defaultProvider),\n defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n (0, util_user_agent_node_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_json_1.default.version }),\n maxAttempts: config?.maxAttempts ?? (0, node_config_provider_1.loadConfig)(middleware_retry_1.NODE_MAX_ATTEMPT_CONFIG_OPTIONS),\n region: config?.region ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS, config_resolver_1.NODE_REGION_CONFIG_FILE_OPTIONS),\n requestHandler: config?.requestHandler ?? new node_http_handler_1.NodeHttpHandler(defaultConfigProvider),\n retryMode: config?.retryMode ??\n (0, node_config_provider_1.loadConfig)({\n ...middleware_retry_1.NODE_RETRY_MODE_CONFIG_OPTIONS,\n default: async () => (await defaultConfigProvider()).retryMode || util_retry_1.DEFAULT_RETRY_MODE,\n }),\n sha256: config?.sha256 ?? hash_node_1.Hash.bind(null, \"sha256\"),\n streamCollector: config?.streamCollector ?? node_http_handler_1.streamCollector,\n useDualstackEndpoint: config?.useDualstackEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS),\n useFipsEndpoint: config?.useFipsEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS),\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst endpointResolver_1 = require(\"./endpoint/endpointResolver\");\nconst getRuntimeConfig = (config) => {\n return {\n apiVersion: \"2010-05-15\",\n base64Decoder: config?.base64Decoder ?? util_base64_1.fromBase64,\n base64Encoder: config?.base64Encoder ?? util_base64_1.toBase64,\n disableHostPrefix: config?.disableHostPrefix ?? false,\n endpointProvider: config?.endpointProvider ?? endpointResolver_1.defaultEndpointResolver,\n extensions: config?.extensions ?? [],\n logger: config?.logger ?? new smithy_client_1.NoOpLogger(),\n serviceId: config?.serviceId ?? \"CloudFormation\",\n urlParser: config?.urlParser ?? url_parser_1.parseUrl,\n utf8Decoder: config?.utf8Decoder ?? util_utf8_1.fromUtf8,\n utf8Encoder: config?.utf8Encoder ?? util_utf8_1.toUtf8,\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRuntimeExtensions = void 0;\nconst region_config_resolver_1 = require(\"@aws-sdk/region-config-resolver\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst asPartial = (t) => t;\nconst resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n const extensionConfiguration = {\n ...asPartial((0, region_config_resolver_1.getAwsRegionExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, smithy_client_1.getDefaultExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, protocol_http_1.getHttpHandlerExtensionConfiguration)(runtimeConfig)),\n };\n extensions.forEach((extension) => extension.configure(extensionConfiguration));\n return {\n ...runtimeConfig,\n ...(0, region_config_resolver_1.resolveAwsRegionExtensionConfiguration)(extensionConfiguration),\n ...(0, smithy_client_1.resolveDefaultRuntimeConfig)(extensionConfiguration),\n ...(0, protocol_http_1.resolveHttpHandlerRuntimeConfig)(extensionConfiguration),\n };\n};\nexports.resolveRuntimeExtensions = resolveRuntimeExtensions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./waitForChangeSetCreateComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackCreateComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackDeleteComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackExists\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackImportComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackRollbackComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForStackUpdateComplete\"), exports);\ntslib_1.__exportStar(require(\"./waitForTypeRegistrationComplete\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilChangeSetCreateComplete = exports.waitForChangeSetCreateComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeChangeSetCommand_1 = require(\"../commands/DescribeChangeSetCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeChangeSetCommand_1.DescribeChangeSetCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n return result.Status;\n };\n if (returnComparator() === \"CREATE_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n return result.Status;\n };\n if (returnComparator() === \"FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForChangeSetCreateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForChangeSetCreateComplete = waitForChangeSetCreateComplete;\nconst waitUntilChangeSetCreateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilChangeSetCreateComplete = waitUntilChangeSetCreateComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackCreateComplete = exports.waitForStackCreateComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n let allStringEq_5 = returnComparator().length > 0;\n for (const element_4 of returnComparator()) {\n allStringEq_5 = allStringEq_5 && element_4 == \"CREATE_COMPLETE\";\n }\n if (allStringEq_5) {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"CREATE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"DELETE_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"DELETE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"ROLLBACK_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackCreateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackCreateComplete = waitForStackCreateComplete;\nconst waitUntilStackCreateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackCreateComplete = waitUntilStackCreateComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackDeleteComplete = exports.waitForStackDeleteComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n let allStringEq_5 = returnComparator().length > 0;\n for (const element_4 of returnComparator()) {\n allStringEq_5 = allStringEq_5 && element_4 == \"DELETE_COMPLETE\";\n }\n if (allStringEq_5) {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"DELETE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"CREATE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_IN_PROGRESS\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackDeleteComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackDeleteComplete = waitForStackDeleteComplete;\nconst waitUntilStackDeleteComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackDeleteComplete = waitUntilStackDeleteComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackExists = exports.waitForStackExists = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackExists = async (params, input) => {\n const serviceDefaults = { minDelay: 5, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackExists = waitForStackExists;\nconst waitUntilStackExists = async (params, input) => {\n const serviceDefaults = { minDelay: 5, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackExists = waitUntilStackExists;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackImportComplete = exports.waitForStackImportComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n let allStringEq_5 = returnComparator().length > 0;\n for (const element_4 of returnComparator()) {\n allStringEq_5 = allStringEq_5 && element_4 == \"IMPORT_COMPLETE\";\n }\n if (allStringEq_5) {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"ROLLBACK_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"IMPORT_ROLLBACK_IN_PROGRESS\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"IMPORT_ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"IMPORT_ROLLBACK_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackImportComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackImportComplete = waitForStackImportComplete;\nconst waitUntilStackImportComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackImportComplete = waitUntilStackImportComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackRollbackComplete = exports.waitForStackRollbackComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n let allStringEq_5 = returnComparator().length > 0;\n for (const element_4 of returnComparator()) {\n allStringEq_5 = allStringEq_5 && element_4 == \"UPDATE_ROLLBACK_COMPLETE\";\n }\n if (allStringEq_5) {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"DELETE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackRollbackComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackRollbackComplete = waitForStackRollbackComplete;\nconst waitUntilStackRollbackComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackRollbackComplete = waitUntilStackRollbackComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilStackUpdateComplete = exports.waitForStackUpdateComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeStacksCommand_1 = require(\"../commands/DescribeStacksCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeStacksCommand_1.DescribeStacksCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n let allStringEq_5 = returnComparator().length > 0;\n for (const element_4 of returnComparator()) {\n allStringEq_5 = allStringEq_5 && element_4 == \"UPDATE_COMPLETE\";\n }\n if (allStringEq_5) {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n const flat_1 = [].concat(...result.Stacks);\n const projection_3 = flat_1.map((element_2) => {\n return element_2.StackStatus;\n });\n return projection_3;\n };\n for (const anyStringEq_4 of returnComparator()) {\n if (anyStringEq_4 == \"UPDATE_ROLLBACK_COMPLETE\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n if (exception.name && exception.name == \"ValidationError\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForStackUpdateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForStackUpdateComplete = waitForStackUpdateComplete;\nconst waitUntilStackUpdateComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilStackUpdateComplete = waitUntilStackUpdateComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.waitUntilTypeRegistrationComplete = exports.waitForTypeRegistrationComplete = void 0;\nconst util_waiter_1 = require(\"@smithy/util-waiter\");\nconst DescribeTypeRegistrationCommand_1 = require(\"../commands/DescribeTypeRegistrationCommand\");\nconst checkState = async (client, input) => {\n let reason;\n try {\n const result = await client.send(new DescribeTypeRegistrationCommand_1.DescribeTypeRegistrationCommand(input));\n reason = result;\n try {\n const returnComparator = () => {\n return result.ProgressStatus;\n };\n if (returnComparator() === \"COMPLETE\") {\n return { state: util_waiter_1.WaiterState.SUCCESS, reason };\n }\n }\n catch (e) { }\n try {\n const returnComparator = () => {\n return result.ProgressStatus;\n };\n if (returnComparator() === \"FAILED\") {\n return { state: util_waiter_1.WaiterState.FAILURE, reason };\n }\n }\n catch (e) { }\n }\n catch (exception) {\n reason = exception;\n }\n return { state: util_waiter_1.WaiterState.RETRY, reason };\n};\nconst waitForTypeRegistrationComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n return (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n};\nexports.waitForTypeRegistrationComplete = waitForTypeRegistrationComplete;\nconst waitUntilTypeRegistrationComplete = async (params, input) => {\n const serviceDefaults = { minDelay: 30, maxDelay: 120 };\n const result = await (0, util_waiter_1.createWaiter)({ ...serviceDefaults, ...params }, input, checkState);\n return (0, util_waiter_1.checkExceptions)(result);\n};\nexports.waitUntilTypeRegistrationComplete = waitUntilTypeRegistrationComplete;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CognitoIdentity = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst CognitoIdentityClient_1 = require(\"./CognitoIdentityClient\");\nconst CreateIdentityPoolCommand_1 = require(\"./commands/CreateIdentityPoolCommand\");\nconst DeleteIdentitiesCommand_1 = require(\"./commands/DeleteIdentitiesCommand\");\nconst DeleteIdentityPoolCommand_1 = require(\"./commands/DeleteIdentityPoolCommand\");\nconst DescribeIdentityCommand_1 = require(\"./commands/DescribeIdentityCommand\");\nconst DescribeIdentityPoolCommand_1 = require(\"./commands/DescribeIdentityPoolCommand\");\nconst GetCredentialsForIdentityCommand_1 = require(\"./commands/GetCredentialsForIdentityCommand\");\nconst GetIdCommand_1 = require(\"./commands/GetIdCommand\");\nconst GetIdentityPoolRolesCommand_1 = require(\"./commands/GetIdentityPoolRolesCommand\");\nconst GetOpenIdTokenCommand_1 = require(\"./commands/GetOpenIdTokenCommand\");\nconst GetOpenIdTokenForDeveloperIdentityCommand_1 = require(\"./commands/GetOpenIdTokenForDeveloperIdentityCommand\");\nconst GetPrincipalTagAttributeMapCommand_1 = require(\"./commands/GetPrincipalTagAttributeMapCommand\");\nconst ListIdentitiesCommand_1 = require(\"./commands/ListIdentitiesCommand\");\nconst ListIdentityPoolsCommand_1 = require(\"./commands/ListIdentityPoolsCommand\");\nconst ListTagsForResourceCommand_1 = require(\"./commands/ListTagsForResourceCommand\");\nconst LookupDeveloperIdentityCommand_1 = require(\"./commands/LookupDeveloperIdentityCommand\");\nconst MergeDeveloperIdentitiesCommand_1 = require(\"./commands/MergeDeveloperIdentitiesCommand\");\nconst SetIdentityPoolRolesCommand_1 = require(\"./commands/SetIdentityPoolRolesCommand\");\nconst SetPrincipalTagAttributeMapCommand_1 = require(\"./commands/SetPrincipalTagAttributeMapCommand\");\nconst TagResourceCommand_1 = require(\"./commands/TagResourceCommand\");\nconst UnlinkDeveloperIdentityCommand_1 = require(\"./commands/UnlinkDeveloperIdentityCommand\");\nconst UnlinkIdentityCommand_1 = require(\"./commands/UnlinkIdentityCommand\");\nconst UntagResourceCommand_1 = require(\"./commands/UntagResourceCommand\");\nconst UpdateIdentityPoolCommand_1 = require(\"./commands/UpdateIdentityPoolCommand\");\nconst commands = {\n CreateIdentityPoolCommand: CreateIdentityPoolCommand_1.CreateIdentityPoolCommand,\n DeleteIdentitiesCommand: DeleteIdentitiesCommand_1.DeleteIdentitiesCommand,\n DeleteIdentityPoolCommand: DeleteIdentityPoolCommand_1.DeleteIdentityPoolCommand,\n DescribeIdentityCommand: DescribeIdentityCommand_1.DescribeIdentityCommand,\n DescribeIdentityPoolCommand: DescribeIdentityPoolCommand_1.DescribeIdentityPoolCommand,\n GetCredentialsForIdentityCommand: GetCredentialsForIdentityCommand_1.GetCredentialsForIdentityCommand,\n GetIdCommand: GetIdCommand_1.GetIdCommand,\n GetIdentityPoolRolesCommand: GetIdentityPoolRolesCommand_1.GetIdentityPoolRolesCommand,\n GetOpenIdTokenCommand: GetOpenIdTokenCommand_1.GetOpenIdTokenCommand,\n GetOpenIdTokenForDeveloperIdentityCommand: GetOpenIdTokenForDeveloperIdentityCommand_1.GetOpenIdTokenForDeveloperIdentityCommand,\n GetPrincipalTagAttributeMapCommand: GetPrincipalTagAttributeMapCommand_1.GetPrincipalTagAttributeMapCommand,\n ListIdentitiesCommand: ListIdentitiesCommand_1.ListIdentitiesCommand,\n ListIdentityPoolsCommand: ListIdentityPoolsCommand_1.ListIdentityPoolsCommand,\n ListTagsForResourceCommand: ListTagsForResourceCommand_1.ListTagsForResourceCommand,\n LookupDeveloperIdentityCommand: LookupDeveloperIdentityCommand_1.LookupDeveloperIdentityCommand,\n MergeDeveloperIdentitiesCommand: MergeDeveloperIdentitiesCommand_1.MergeDeveloperIdentitiesCommand,\n SetIdentityPoolRolesCommand: SetIdentityPoolRolesCommand_1.SetIdentityPoolRolesCommand,\n SetPrincipalTagAttributeMapCommand: SetPrincipalTagAttributeMapCommand_1.SetPrincipalTagAttributeMapCommand,\n TagResourceCommand: TagResourceCommand_1.TagResourceCommand,\n UnlinkDeveloperIdentityCommand: UnlinkDeveloperIdentityCommand_1.UnlinkDeveloperIdentityCommand,\n UnlinkIdentityCommand: UnlinkIdentityCommand_1.UnlinkIdentityCommand,\n UntagResourceCommand: UntagResourceCommand_1.UntagResourceCommand,\n UpdateIdentityPoolCommand: UpdateIdentityPoolCommand_1.UpdateIdentityPoolCommand,\n};\nclass CognitoIdentity extends CognitoIdentityClient_1.CognitoIdentityClient {\n}\nexports.CognitoIdentity = CognitoIdentity;\n(0, smithy_client_1.createAggregatedClient)(commands, CognitoIdentity);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CognitoIdentityClient = exports.__Client = void 0;\nconst middleware_host_header_1 = require(\"@aws-sdk/middleware-host-header\");\nconst middleware_logger_1 = require(\"@aws-sdk/middleware-logger\");\nconst middleware_recursion_detection_1 = require(\"@aws-sdk/middleware-recursion-detection\");\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_user_agent_1 = require(\"@aws-sdk/middleware-user-agent\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst middleware_content_length_1 = require(\"@smithy/middleware-content-length\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__Client\", { enumerable: true, get: function () { return smithy_client_1.Client; } });\nconst EndpointParameters_1 = require(\"./endpoint/EndpointParameters\");\nconst runtimeConfig_1 = require(\"./runtimeConfig\");\nconst runtimeExtensions_1 = require(\"./runtimeExtensions\");\nclass CognitoIdentityClient extends smithy_client_1.Client {\n constructor(...[configuration]) {\n const _config_0 = (0, runtimeConfig_1.getRuntimeConfig)(configuration || {});\n const _config_1 = (0, EndpointParameters_1.resolveClientEndpointParameters)(_config_0);\n const _config_2 = (0, config_resolver_1.resolveRegionConfig)(_config_1);\n const _config_3 = (0, middleware_endpoint_1.resolveEndpointConfig)(_config_2);\n const _config_4 = (0, middleware_retry_1.resolveRetryConfig)(_config_3);\n const _config_5 = (0, middleware_host_header_1.resolveHostHeaderConfig)(_config_4);\n const _config_6 = (0, middleware_signing_1.resolveAwsAuthConfig)(_config_5);\n const _config_7 = (0, middleware_user_agent_1.resolveUserAgentConfig)(_config_6);\n const _config_8 = (0, runtimeExtensions_1.resolveRuntimeExtensions)(_config_7, configuration?.extensions || []);\n super(_config_8);\n this.config = _config_8;\n this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));\n this.middlewareStack.use((0, middleware_content_length_1.getContentLengthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_host_header_1.getHostHeaderPlugin)(this.config));\n this.middlewareStack.use((0, middleware_logger_1.getLoggerPlugin)(this.config));\n this.middlewareStack.use((0, middleware_recursion_detection_1.getRecursionDetectionPlugin)(this.config));\n this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));\n }\n destroy() {\n super.destroy();\n }\n}\nexports.CognitoIdentityClient = CognitoIdentityClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CreateIdentityPoolCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass CreateIdentityPoolCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, CreateIdentityPoolCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"CreateIdentityPoolCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"CreateIdentityPool\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_CreateIdentityPoolCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_CreateIdentityPoolCommand)(output, context);\n }\n}\nexports.CreateIdentityPoolCommand = CreateIdentityPoolCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteIdentitiesCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass DeleteIdentitiesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteIdentitiesCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"DeleteIdentitiesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"DeleteIdentities\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_DeleteIdentitiesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_DeleteIdentitiesCommand)(output, context);\n }\n}\nexports.DeleteIdentitiesCommand = DeleteIdentitiesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeleteIdentityPoolCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass DeleteIdentityPoolCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DeleteIdentityPoolCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"DeleteIdentityPoolCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"DeleteIdentityPool\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_DeleteIdentityPoolCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_DeleteIdentityPoolCommand)(output, context);\n }\n}\nexports.DeleteIdentityPoolCommand = DeleteIdentityPoolCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeIdentityCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass DescribeIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeIdentityCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"DescribeIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"DescribeIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_DescribeIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_DescribeIdentityCommand)(output, context);\n }\n}\nexports.DescribeIdentityCommand = DescribeIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DescribeIdentityPoolCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass DescribeIdentityPoolCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DescribeIdentityPoolCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"DescribeIdentityPoolCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"DescribeIdentityPool\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_DescribeIdentityPoolCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_DescribeIdentityPoolCommand)(output, context);\n }\n}\nexports.DescribeIdentityPoolCommand = DescribeIdentityPoolCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetCredentialsForIdentityCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetCredentialsForIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetCredentialsForIdentityCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetCredentialsForIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetCredentialsForIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetCredentialsForIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetCredentialsForIdentityCommand)(output, context);\n }\n}\nexports.GetCredentialsForIdentityCommand = GetCredentialsForIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetIdCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetIdCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetIdCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetIdCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetId\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetIdCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetIdCommand)(output, context);\n }\n}\nexports.GetIdCommand = GetIdCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetIdentityPoolRolesCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetIdentityPoolRolesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetIdentityPoolRolesCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetIdentityPoolRolesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetIdentityPoolRoles\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetIdentityPoolRolesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetIdentityPoolRolesCommand)(output, context);\n }\n}\nexports.GetIdentityPoolRolesCommand = GetIdentityPoolRolesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetOpenIdTokenCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetOpenIdTokenCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetOpenIdTokenCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetOpenIdTokenCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetOpenIdToken\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetOpenIdTokenCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetOpenIdTokenCommand)(output, context);\n }\n}\nexports.GetOpenIdTokenCommand = GetOpenIdTokenCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetOpenIdTokenForDeveloperIdentityCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetOpenIdTokenForDeveloperIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetOpenIdTokenForDeveloperIdentityCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetOpenIdTokenForDeveloperIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetOpenIdTokenForDeveloperIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetOpenIdTokenForDeveloperIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetOpenIdTokenForDeveloperIdentityCommand)(output, context);\n }\n}\nexports.GetOpenIdTokenForDeveloperIdentityCommand = GetOpenIdTokenForDeveloperIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetPrincipalTagAttributeMapCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass GetPrincipalTagAttributeMapCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetPrincipalTagAttributeMapCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"GetPrincipalTagAttributeMapCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"GetPrincipalTagAttributeMap\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_GetPrincipalTagAttributeMapCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_GetPrincipalTagAttributeMapCommand)(output, context);\n }\n}\nexports.GetPrincipalTagAttributeMapCommand = GetPrincipalTagAttributeMapCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListIdentitiesCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass ListIdentitiesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListIdentitiesCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"ListIdentitiesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"ListIdentities\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_ListIdentitiesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_ListIdentitiesCommand)(output, context);\n }\n}\nexports.ListIdentitiesCommand = ListIdentitiesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListIdentityPoolsCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass ListIdentityPoolsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListIdentityPoolsCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"ListIdentityPoolsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"ListIdentityPools\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_ListIdentityPoolsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_ListIdentityPoolsCommand)(output, context);\n }\n}\nexports.ListIdentityPoolsCommand = ListIdentityPoolsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListTagsForResourceCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass ListTagsForResourceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListTagsForResourceCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"ListTagsForResourceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"ListTagsForResource\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_ListTagsForResourceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_ListTagsForResourceCommand)(output, context);\n }\n}\nexports.ListTagsForResourceCommand = ListTagsForResourceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LookupDeveloperIdentityCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass LookupDeveloperIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, LookupDeveloperIdentityCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"LookupDeveloperIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"LookupDeveloperIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_LookupDeveloperIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_LookupDeveloperIdentityCommand)(output, context);\n }\n}\nexports.LookupDeveloperIdentityCommand = LookupDeveloperIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MergeDeveloperIdentitiesCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass MergeDeveloperIdentitiesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, MergeDeveloperIdentitiesCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"MergeDeveloperIdentitiesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"MergeDeveloperIdentities\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_MergeDeveloperIdentitiesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_MergeDeveloperIdentitiesCommand)(output, context);\n }\n}\nexports.MergeDeveloperIdentitiesCommand = MergeDeveloperIdentitiesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SetIdentityPoolRolesCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass SetIdentityPoolRolesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SetIdentityPoolRolesCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"SetIdentityPoolRolesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"SetIdentityPoolRoles\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_SetIdentityPoolRolesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_SetIdentityPoolRolesCommand)(output, context);\n }\n}\nexports.SetIdentityPoolRolesCommand = SetIdentityPoolRolesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SetPrincipalTagAttributeMapCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass SetPrincipalTagAttributeMapCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, SetPrincipalTagAttributeMapCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"SetPrincipalTagAttributeMapCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"SetPrincipalTagAttributeMap\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_SetPrincipalTagAttributeMapCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_SetPrincipalTagAttributeMapCommand)(output, context);\n }\n}\nexports.SetPrincipalTagAttributeMapCommand = SetPrincipalTagAttributeMapCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TagResourceCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass TagResourceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, TagResourceCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"TagResourceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"TagResource\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_TagResourceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_TagResourceCommand)(output, context);\n }\n}\nexports.TagResourceCommand = TagResourceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UnlinkDeveloperIdentityCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass UnlinkDeveloperIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UnlinkDeveloperIdentityCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"UnlinkDeveloperIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"UnlinkDeveloperIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_UnlinkDeveloperIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_UnlinkDeveloperIdentityCommand)(output, context);\n }\n}\nexports.UnlinkDeveloperIdentityCommand = UnlinkDeveloperIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UnlinkIdentityCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass UnlinkIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UnlinkIdentityCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"UnlinkIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"UnlinkIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_UnlinkIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_UnlinkIdentityCommand)(output, context);\n }\n}\nexports.UnlinkIdentityCommand = UnlinkIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UntagResourceCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass UntagResourceCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UntagResourceCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"UntagResourceCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"UntagResource\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_UntagResourceCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_UntagResourceCommand)(output, context);\n }\n}\nexports.UntagResourceCommand = UntagResourceCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UpdateIdentityPoolCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_json1_1_1 = require(\"../protocols/Aws_json1_1\");\nclass UpdateIdentityPoolCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, UpdateIdentityPoolCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"CognitoIdentityClient\";\n const commandName = \"UpdateIdentityPoolCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSCognitoIdentityService\",\n operation: \"UpdateIdentityPool\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_json1_1_1.se_UpdateIdentityPoolCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_json1_1_1.de_UpdateIdentityPoolCommand)(output, context);\n }\n}\nexports.UpdateIdentityPoolCommand = UpdateIdentityPoolCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./CreateIdentityPoolCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteIdentitiesCommand\"), exports);\ntslib_1.__exportStar(require(\"./DeleteIdentityPoolCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./DescribeIdentityPoolCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetCredentialsForIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetIdCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetIdentityPoolRolesCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetOpenIdTokenCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetOpenIdTokenForDeveloperIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetPrincipalTagAttributeMapCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListIdentitiesCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListIdentityPoolsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListTagsForResourceCommand\"), exports);\ntslib_1.__exportStar(require(\"./LookupDeveloperIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./MergeDeveloperIdentitiesCommand\"), exports);\ntslib_1.__exportStar(require(\"./SetIdentityPoolRolesCommand\"), exports);\ntslib_1.__exportStar(require(\"./SetPrincipalTagAttributeMapCommand\"), exports);\ntslib_1.__exportStar(require(\"./TagResourceCommand\"), exports);\ntslib_1.__exportStar(require(\"./UnlinkDeveloperIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./UnlinkIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./UntagResourceCommand\"), exports);\ntslib_1.__exportStar(require(\"./UpdateIdentityPoolCommand\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveClientEndpointParameters = void 0;\nconst resolveClientEndpointParameters = (options) => {\n return {\n ...options,\n useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n useFipsEndpoint: options.useFipsEndpoint ?? false,\n defaultSigningName: \"cognito-identity\",\n };\n};\nexports.resolveClientEndpointParameters = resolveClientEndpointParameters;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultEndpointResolver = void 0;\nconst util_endpoints_1 = require(\"@smithy/util-endpoints\");\nconst ruleset_1 = require(\"./ruleset\");\nconst defaultEndpointResolver = (endpointParams, context = {}) => {\n return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, {\n endpointParams: endpointParams,\n logger: context.logger,\n });\n};\nexports.defaultEndpointResolver = defaultEndpointResolver;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ruleSet = void 0;\nconst s = \"required\", t = \"fn\", u = \"argv\", v = \"ref\";\nconst a = true, b = \"isSet\", c = \"booleanEquals\", d = \"error\", e = \"endpoint\", f = \"tree\", g = \"PartitionResult\", h = { [s]: false, \"type\": \"String\" }, i = { [s]: true, \"default\": false, \"type\": \"Boolean\" }, j = { [v]: \"Endpoint\" }, k = { [t]: c, [u]: [{ [v]: \"UseFIPS\" }, true] }, l = { [t]: c, [u]: [{ [v]: \"UseDualStack\" }, true] }, m = {}, n = { [t]: \"getAttr\", [u]: [{ [v]: g }, \"supportsFIPS\"] }, o = { [t]: c, [u]: [true, { [t]: \"getAttr\", [u]: [{ [v]: g }, \"supportsDualStack\"] }] }, p = [k], q = [l], r = [{ [v]: \"Region\" }];\nconst _data = { version: \"1.0\", parameters: { Region: h, UseDualStack: i, UseFIPS: i, Endpoint: h }, rules: [{ conditions: [{ [t]: b, [u]: [j] }], rules: [{ conditions: p, error: \"Invalid Configuration: FIPS and custom endpoint are not supported\", type: d }, { conditions: q, error: \"Invalid Configuration: Dualstack and custom endpoint are not supported\", type: d }, { endpoint: { url: j, properties: m, headers: m }, type: e }], type: f }, { conditions: [{ [t]: b, [u]: r }], rules: [{ conditions: [{ [t]: \"aws.partition\", [u]: r, assign: g }], rules: [{ conditions: [k, l], rules: [{ conditions: [{ [t]: c, [u]: [a, n] }, o], rules: [{ endpoint: { url: \"https://cognito-identity-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: m, headers: m }, type: e }], type: f }, { error: \"FIPS and DualStack are enabled, but this partition does not support one or both\", type: d }], type: f }, { conditions: p, rules: [{ conditions: [{ [t]: c, [u]: [n, a] }], rules: [{ endpoint: { url: \"https://cognito-identity-fips.{Region}.{PartitionResult#dnsSuffix}\", properties: m, headers: m }, type: e }], type: f }, { error: \"FIPS is enabled but this partition does not support FIPS\", type: d }], type: f }, { conditions: q, rules: [{ conditions: [o], rules: [{ endpoint: { url: \"https://cognito-identity.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: m, headers: m }, type: e }], type: f }, { error: \"DualStack is enabled but this partition does not support DualStack\", type: d }], type: f }, { endpoint: { url: \"https://cognito-identity.{Region}.{PartitionResult#dnsSuffix}\", properties: m, headers: m }, type: e }], type: f }], type: f }, { error: \"Invalid Configuration: Missing Region\", type: d }] };\nexports.ruleSet = _data;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CognitoIdentityServiceException = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./CognitoIdentityClient\"), exports);\ntslib_1.__exportStar(require(\"./CognitoIdentity\"), exports);\ntslib_1.__exportStar(require(\"./commands\"), exports);\ntslib_1.__exportStar(require(\"./pagination\"), exports);\ntslib_1.__exportStar(require(\"./models\"), exports);\nrequire(\"@aws-sdk/util-endpoints\");\nvar CognitoIdentityServiceException_1 = require(\"./models/CognitoIdentityServiceException\");\nObject.defineProperty(exports, \"CognitoIdentityServiceException\", { enumerable: true, get: function () { return CognitoIdentityServiceException_1.CognitoIdentityServiceException; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CognitoIdentityServiceException = exports.__ServiceException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__ServiceException\", { enumerable: true, get: function () { return smithy_client_1.ServiceException; } });\nclass CognitoIdentityServiceException extends smithy_client_1.ServiceException {\n constructor(options) {\n super(options);\n Object.setPrototypeOf(this, CognitoIdentityServiceException.prototype);\n }\n}\nexports.CognitoIdentityServiceException = CognitoIdentityServiceException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./models_0\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConcurrentModificationException = exports.DeveloperUserAlreadyRegisteredException = exports.RoleMappingType = exports.MappingRuleMatchType = exports.InvalidIdentityPoolConfigurationException = exports.ExternalServiceException = exports.ResourceNotFoundException = exports.ErrorCode = exports.TooManyRequestsException = exports.ResourceConflictException = exports.NotAuthorizedException = exports.LimitExceededException = exports.InvalidParameterException = exports.InternalErrorException = exports.AmbiguousRoleResolutionType = void 0;\nconst CognitoIdentityServiceException_1 = require(\"./CognitoIdentityServiceException\");\nexports.AmbiguousRoleResolutionType = {\n AUTHENTICATED_ROLE: \"AuthenticatedRole\",\n DENY: \"Deny\",\n};\nclass InternalErrorException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"InternalErrorException\",\n $fault: \"server\",\n ...opts,\n });\n this.name = \"InternalErrorException\";\n this.$fault = \"server\";\n Object.setPrototypeOf(this, InternalErrorException.prototype);\n }\n}\nexports.InternalErrorException = InternalErrorException;\nclass InvalidParameterException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"InvalidParameterException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidParameterException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidParameterException.prototype);\n }\n}\nexports.InvalidParameterException = InvalidParameterException;\nclass LimitExceededException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"LimitExceededException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"LimitExceededException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, LimitExceededException.prototype);\n }\n}\nexports.LimitExceededException = LimitExceededException;\nclass NotAuthorizedException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"NotAuthorizedException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"NotAuthorizedException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, NotAuthorizedException.prototype);\n }\n}\nexports.NotAuthorizedException = NotAuthorizedException;\nclass ResourceConflictException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"ResourceConflictException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ResourceConflictException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ResourceConflictException.prototype);\n }\n}\nexports.ResourceConflictException = ResourceConflictException;\nclass TooManyRequestsException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"TooManyRequestsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"TooManyRequestsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, TooManyRequestsException.prototype);\n }\n}\nexports.TooManyRequestsException = TooManyRequestsException;\nexports.ErrorCode = {\n ACCESS_DENIED: \"AccessDenied\",\n INTERNAL_SERVER_ERROR: \"InternalServerError\",\n};\nclass ResourceNotFoundException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"ResourceNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ResourceNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ResourceNotFoundException.prototype);\n }\n}\nexports.ResourceNotFoundException = ResourceNotFoundException;\nclass ExternalServiceException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"ExternalServiceException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ExternalServiceException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ExternalServiceException.prototype);\n }\n}\nexports.ExternalServiceException = ExternalServiceException;\nclass InvalidIdentityPoolConfigurationException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"InvalidIdentityPoolConfigurationException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidIdentityPoolConfigurationException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidIdentityPoolConfigurationException.prototype);\n }\n}\nexports.InvalidIdentityPoolConfigurationException = InvalidIdentityPoolConfigurationException;\nexports.MappingRuleMatchType = {\n CONTAINS: \"Contains\",\n EQUALS: \"Equals\",\n NOT_EQUAL: \"NotEqual\",\n STARTS_WITH: \"StartsWith\",\n};\nexports.RoleMappingType = {\n RULES: \"Rules\",\n TOKEN: \"Token\",\n};\nclass DeveloperUserAlreadyRegisteredException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"DeveloperUserAlreadyRegisteredException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"DeveloperUserAlreadyRegisteredException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, DeveloperUserAlreadyRegisteredException.prototype);\n }\n}\nexports.DeveloperUserAlreadyRegisteredException = DeveloperUserAlreadyRegisteredException;\nclass ConcurrentModificationException extends CognitoIdentityServiceException_1.CognitoIdentityServiceException {\n constructor(opts) {\n super({\n name: \"ConcurrentModificationException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ConcurrentModificationException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ConcurrentModificationException.prototype);\n }\n}\nexports.ConcurrentModificationException = ConcurrentModificationException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListIdentityPools = void 0;\nconst CognitoIdentityClient_1 = require(\"../CognitoIdentityClient\");\nconst ListIdentityPoolsCommand_1 = require(\"../commands/ListIdentityPoolsCommand\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListIdentityPoolsCommand_1.ListIdentityPoolsCommand(input), ...args);\n};\nasync function* paginateListIdentityPools(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.NextToken = token;\n input[\"MaxResults\"] = config.pageSize;\n if (config.client instanceof CognitoIdentityClient_1.CognitoIdentityClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected CognitoIdentity | CognitoIdentityClient\");\n }\n yield page;\n const prevToken = token;\n token = page.NextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListIdentityPools = paginateListIdentityPools;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./Interfaces\"), exports);\ntslib_1.__exportStar(require(\"./ListIdentityPoolsPaginator\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.de_UpdateIdentityPoolCommand = exports.de_UntagResourceCommand = exports.de_UnlinkIdentityCommand = exports.de_UnlinkDeveloperIdentityCommand = exports.de_TagResourceCommand = exports.de_SetPrincipalTagAttributeMapCommand = exports.de_SetIdentityPoolRolesCommand = exports.de_MergeDeveloperIdentitiesCommand = exports.de_LookupDeveloperIdentityCommand = exports.de_ListTagsForResourceCommand = exports.de_ListIdentityPoolsCommand = exports.de_ListIdentitiesCommand = exports.de_GetPrincipalTagAttributeMapCommand = exports.de_GetOpenIdTokenForDeveloperIdentityCommand = exports.de_GetOpenIdTokenCommand = exports.de_GetIdentityPoolRolesCommand = exports.de_GetIdCommand = exports.de_GetCredentialsForIdentityCommand = exports.de_DescribeIdentityPoolCommand = exports.de_DescribeIdentityCommand = exports.de_DeleteIdentityPoolCommand = exports.de_DeleteIdentitiesCommand = exports.de_CreateIdentityPoolCommand = exports.se_UpdateIdentityPoolCommand = exports.se_UntagResourceCommand = exports.se_UnlinkIdentityCommand = exports.se_UnlinkDeveloperIdentityCommand = exports.se_TagResourceCommand = exports.se_SetPrincipalTagAttributeMapCommand = exports.se_SetIdentityPoolRolesCommand = exports.se_MergeDeveloperIdentitiesCommand = exports.se_LookupDeveloperIdentityCommand = exports.se_ListTagsForResourceCommand = exports.se_ListIdentityPoolsCommand = exports.se_ListIdentitiesCommand = exports.se_GetPrincipalTagAttributeMapCommand = exports.se_GetOpenIdTokenForDeveloperIdentityCommand = exports.se_GetOpenIdTokenCommand = exports.se_GetIdentityPoolRolesCommand = exports.se_GetIdCommand = exports.se_GetCredentialsForIdentityCommand = exports.se_DescribeIdentityPoolCommand = exports.se_DescribeIdentityCommand = exports.se_DeleteIdentityPoolCommand = exports.se_DeleteIdentitiesCommand = exports.se_CreateIdentityPoolCommand = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst CognitoIdentityServiceException_1 = require(\"../models/CognitoIdentityServiceException\");\nconst models_0_1 = require(\"../models/models_0\");\nconst se_CreateIdentityPoolCommand = async (input, context) => {\n const headers = sharedHeaders(\"CreateIdentityPool\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_CreateIdentityPoolCommand = se_CreateIdentityPoolCommand;\nconst se_DeleteIdentitiesCommand = async (input, context) => {\n const headers = sharedHeaders(\"DeleteIdentities\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteIdentitiesCommand = se_DeleteIdentitiesCommand;\nconst se_DeleteIdentityPoolCommand = async (input, context) => {\n const headers = sharedHeaders(\"DeleteIdentityPool\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DeleteIdentityPoolCommand = se_DeleteIdentityPoolCommand;\nconst se_DescribeIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"DescribeIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeIdentityCommand = se_DescribeIdentityCommand;\nconst se_DescribeIdentityPoolCommand = async (input, context) => {\n const headers = sharedHeaders(\"DescribeIdentityPool\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DescribeIdentityPoolCommand = se_DescribeIdentityPoolCommand;\nconst se_GetCredentialsForIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetCredentialsForIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetCredentialsForIdentityCommand = se_GetCredentialsForIdentityCommand;\nconst se_GetIdCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetId\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetIdCommand = se_GetIdCommand;\nconst se_GetIdentityPoolRolesCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetIdentityPoolRoles\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetIdentityPoolRolesCommand = se_GetIdentityPoolRolesCommand;\nconst se_GetOpenIdTokenCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetOpenIdToken\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetOpenIdTokenCommand = se_GetOpenIdTokenCommand;\nconst se_GetOpenIdTokenForDeveloperIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetOpenIdTokenForDeveloperIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetOpenIdTokenForDeveloperIdentityCommand = se_GetOpenIdTokenForDeveloperIdentityCommand;\nconst se_GetPrincipalTagAttributeMapCommand = async (input, context) => {\n const headers = sharedHeaders(\"GetPrincipalTagAttributeMap\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetPrincipalTagAttributeMapCommand = se_GetPrincipalTagAttributeMapCommand;\nconst se_ListIdentitiesCommand = async (input, context) => {\n const headers = sharedHeaders(\"ListIdentities\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListIdentitiesCommand = se_ListIdentitiesCommand;\nconst se_ListIdentityPoolsCommand = async (input, context) => {\n const headers = sharedHeaders(\"ListIdentityPools\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListIdentityPoolsCommand = se_ListIdentityPoolsCommand;\nconst se_ListTagsForResourceCommand = async (input, context) => {\n const headers = sharedHeaders(\"ListTagsForResource\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_ListTagsForResourceCommand = se_ListTagsForResourceCommand;\nconst se_LookupDeveloperIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"LookupDeveloperIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_LookupDeveloperIdentityCommand = se_LookupDeveloperIdentityCommand;\nconst se_MergeDeveloperIdentitiesCommand = async (input, context) => {\n const headers = sharedHeaders(\"MergeDeveloperIdentities\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_MergeDeveloperIdentitiesCommand = se_MergeDeveloperIdentitiesCommand;\nconst se_SetIdentityPoolRolesCommand = async (input, context) => {\n const headers = sharedHeaders(\"SetIdentityPoolRoles\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SetIdentityPoolRolesCommand = se_SetIdentityPoolRolesCommand;\nconst se_SetPrincipalTagAttributeMapCommand = async (input, context) => {\n const headers = sharedHeaders(\"SetPrincipalTagAttributeMap\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_SetPrincipalTagAttributeMapCommand = se_SetPrincipalTagAttributeMapCommand;\nconst se_TagResourceCommand = async (input, context) => {\n const headers = sharedHeaders(\"TagResource\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_TagResourceCommand = se_TagResourceCommand;\nconst se_UnlinkDeveloperIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"UnlinkDeveloperIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UnlinkDeveloperIdentityCommand = se_UnlinkDeveloperIdentityCommand;\nconst se_UnlinkIdentityCommand = async (input, context) => {\n const headers = sharedHeaders(\"UnlinkIdentity\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UnlinkIdentityCommand = se_UnlinkIdentityCommand;\nconst se_UntagResourceCommand = async (input, context) => {\n const headers = sharedHeaders(\"UntagResource\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UntagResourceCommand = se_UntagResourceCommand;\nconst se_UpdateIdentityPoolCommand = async (input, context) => {\n const headers = sharedHeaders(\"UpdateIdentityPool\");\n let body;\n body = JSON.stringify((0, smithy_client_1._json)(input));\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_UpdateIdentityPoolCommand = se_UpdateIdentityPoolCommand;\nconst de_CreateIdentityPoolCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_CreateIdentityPoolCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_CreateIdentityPoolCommand = de_CreateIdentityPoolCommand;\nconst de_CreateIdentityPoolCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cognitoidentity#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_DeleteIdentitiesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteIdentitiesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DeleteIdentitiesCommand = de_DeleteIdentitiesCommand;\nconst de_DeleteIdentitiesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_DeleteIdentityPoolCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DeleteIdentityPoolCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_DeleteIdentityPoolCommand = de_DeleteIdentityPoolCommand;\nconst de_DeleteIdentityPoolCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_DescribeIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_IdentityDescription(data, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeIdentityCommand = de_DescribeIdentityCommand;\nconst de_DescribeIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_DescribeIdentityPoolCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DescribeIdentityPoolCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DescribeIdentityPoolCommand = de_DescribeIdentityPoolCommand;\nconst de_DescribeIdentityPoolCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetCredentialsForIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetCredentialsForIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetCredentialsForIdentityResponse(data, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetCredentialsForIdentityCommand = de_GetCredentialsForIdentityCommand;\nconst de_GetCredentialsForIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExternalServiceException\":\n case \"com.amazonaws.cognitoidentity#ExternalServiceException\":\n throw await de_ExternalServiceExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidIdentityPoolConfigurationException\":\n case \"com.amazonaws.cognitoidentity#InvalidIdentityPoolConfigurationException\":\n throw await de_InvalidIdentityPoolConfigurationExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetIdCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetIdCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetIdCommand = de_GetIdCommand;\nconst de_GetIdCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExternalServiceException\":\n case \"com.amazonaws.cognitoidentity#ExternalServiceException\":\n throw await de_ExternalServiceExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cognitoidentity#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetIdentityPoolRolesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetIdentityPoolRolesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetIdentityPoolRolesCommand = de_GetIdentityPoolRolesCommand;\nconst de_GetIdentityPoolRolesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetOpenIdTokenCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetOpenIdTokenCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetOpenIdTokenCommand = de_GetOpenIdTokenCommand;\nconst de_GetOpenIdTokenCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExternalServiceException\":\n case \"com.amazonaws.cognitoidentity#ExternalServiceException\":\n throw await de_ExternalServiceExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetOpenIdTokenForDeveloperIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetOpenIdTokenForDeveloperIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetOpenIdTokenForDeveloperIdentityCommand = de_GetOpenIdTokenForDeveloperIdentityCommand;\nconst de_GetOpenIdTokenForDeveloperIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"DeveloperUserAlreadyRegisteredException\":\n case \"com.amazonaws.cognitoidentity#DeveloperUserAlreadyRegisteredException\":\n throw await de_DeveloperUserAlreadyRegisteredExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_GetPrincipalTagAttributeMapCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetPrincipalTagAttributeMapCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetPrincipalTagAttributeMapCommand = de_GetPrincipalTagAttributeMapCommand;\nconst de_GetPrincipalTagAttributeMapCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ListIdentitiesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListIdentitiesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_ListIdentitiesResponse(data, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListIdentitiesCommand = de_ListIdentitiesCommand;\nconst de_ListIdentitiesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ListIdentityPoolsCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListIdentityPoolsCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListIdentityPoolsCommand = de_ListIdentityPoolsCommand;\nconst de_ListIdentityPoolsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ListTagsForResourceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_ListTagsForResourceCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_ListTagsForResourceCommand = de_ListTagsForResourceCommand;\nconst de_ListTagsForResourceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_LookupDeveloperIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_LookupDeveloperIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_LookupDeveloperIdentityCommand = de_LookupDeveloperIdentityCommand;\nconst de_LookupDeveloperIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_MergeDeveloperIdentitiesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_MergeDeveloperIdentitiesCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_MergeDeveloperIdentitiesCommand = de_MergeDeveloperIdentitiesCommand;\nconst de_MergeDeveloperIdentitiesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_SetIdentityPoolRolesCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SetIdentityPoolRolesCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_SetIdentityPoolRolesCommand = de_SetIdentityPoolRolesCommand;\nconst de_SetIdentityPoolRolesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ConcurrentModificationException\":\n case \"com.amazonaws.cognitoidentity#ConcurrentModificationException\":\n throw await de_ConcurrentModificationExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_SetPrincipalTagAttributeMapCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_SetPrincipalTagAttributeMapCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_SetPrincipalTagAttributeMapCommand = de_SetPrincipalTagAttributeMapCommand;\nconst de_SetPrincipalTagAttributeMapCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_TagResourceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_TagResourceCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_TagResourceCommand = de_TagResourceCommand;\nconst de_TagResourceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_UnlinkDeveloperIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UnlinkDeveloperIdentityCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_UnlinkDeveloperIdentityCommand = de_UnlinkDeveloperIdentityCommand;\nconst de_UnlinkDeveloperIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_UnlinkIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UnlinkIdentityCommandError(output, context);\n }\n await (0, smithy_client_1.collectBody)(output.body, context);\n const response = {\n $metadata: deserializeMetadata(output),\n };\n return response;\n};\nexports.de_UnlinkIdentityCommand = de_UnlinkIdentityCommand;\nconst de_UnlinkIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExternalServiceException\":\n case \"com.amazonaws.cognitoidentity#ExternalServiceException\":\n throw await de_ExternalServiceExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_UntagResourceCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UntagResourceCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UntagResourceCommand = de_UntagResourceCommand;\nconst de_UntagResourceCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_UpdateIdentityPoolCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_UpdateIdentityPoolCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = (0, smithy_client_1._json)(data);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_UpdateIdentityPoolCommand = de_UpdateIdentityPoolCommand;\nconst de_UpdateIdentityPoolCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ConcurrentModificationException\":\n case \"com.amazonaws.cognitoidentity#ConcurrentModificationException\":\n throw await de_ConcurrentModificationExceptionRes(parsedOutput, context);\n case \"InternalErrorException\":\n case \"com.amazonaws.cognitoidentity#InternalErrorException\":\n throw await de_InternalErrorExceptionRes(parsedOutput, context);\n case \"InvalidParameterException\":\n case \"com.amazonaws.cognitoidentity#InvalidParameterException\":\n throw await de_InvalidParameterExceptionRes(parsedOutput, context);\n case \"LimitExceededException\":\n case \"com.amazonaws.cognitoidentity#LimitExceededException\":\n throw await de_LimitExceededExceptionRes(parsedOutput, context);\n case \"NotAuthorizedException\":\n case \"com.amazonaws.cognitoidentity#NotAuthorizedException\":\n throw await de_NotAuthorizedExceptionRes(parsedOutput, context);\n case \"ResourceConflictException\":\n case \"com.amazonaws.cognitoidentity#ResourceConflictException\":\n throw await de_ResourceConflictExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.cognitoidentity#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.cognitoidentity#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ConcurrentModificationExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.ConcurrentModificationException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_DeveloperUserAlreadyRegisteredExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.DeveloperUserAlreadyRegisteredException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_ExternalServiceExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.ExternalServiceException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InternalErrorExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.InternalErrorException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidIdentityPoolConfigurationExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.InvalidIdentityPoolConfigurationException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidParameterExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.InvalidParameterException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_LimitExceededExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.LimitExceededException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_NotAuthorizedExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.NotAuthorizedException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_ResourceConflictExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.ResourceConflictException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_ResourceNotFoundExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.ResourceNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_TooManyRequestsExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = (0, smithy_client_1._json)(body);\n const exception = new models_0_1.TooManyRequestsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_Credentials = (output, context) => {\n return (0, smithy_client_1.take)(output, {\n AccessKeyId: smithy_client_1.expectString,\n Expiration: (_) => (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseEpochTimestamp)((0, smithy_client_1.expectNumber)(_))),\n SecretKey: smithy_client_1.expectString,\n SessionToken: smithy_client_1.expectString,\n });\n};\nconst de_GetCredentialsForIdentityResponse = (output, context) => {\n return (0, smithy_client_1.take)(output, {\n Credentials: (_) => de_Credentials(_, context),\n IdentityId: smithy_client_1.expectString,\n });\n};\nconst de_IdentitiesList = (output, context) => {\n const retVal = (output || [])\n .filter((e) => e != null)\n .map((entry) => {\n return de_IdentityDescription(entry, context);\n });\n return retVal;\n};\nconst de_IdentityDescription = (output, context) => {\n return (0, smithy_client_1.take)(output, {\n CreationDate: (_) => (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseEpochTimestamp)((0, smithy_client_1.expectNumber)(_))),\n IdentityId: smithy_client_1.expectString,\n LastModifiedDate: (_) => (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseEpochTimestamp)((0, smithy_client_1.expectNumber)(_))),\n Logins: smithy_client_1._json,\n });\n};\nconst de_ListIdentitiesResponse = (output, context) => {\n return (0, smithy_client_1.take)(output, {\n Identities: (_) => de_IdentitiesList(_, context),\n IdentityPoolId: smithy_client_1.expectString,\n NextToken: smithy_client_1.expectString,\n });\n};\nconst deserializeMetadata = (output) => ({\n httpStatusCode: output.statusCode,\n requestId: output.headers[\"x-amzn-requestid\"] ?? output.headers[\"x-amzn-request-id\"] ?? output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n});\nconst collectBodyString = (streamBody, context) => (0, smithy_client_1.collectBody)(streamBody, context).then((body) => context.utf8Encoder(body));\nconst throwDefaultError = (0, smithy_client_1.withBaseException)(CognitoIdentityServiceException_1.CognitoIdentityServiceException);\nconst buildHttpRpcRequest = async (context, headers, path, resolvedHostname, body) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const contents = {\n protocol,\n hostname,\n port,\n method: \"POST\",\n path: basePath.endsWith(\"/\") ? basePath.slice(0, -1) + path : basePath + path,\n headers,\n };\n if (resolvedHostname !== undefined) {\n contents.hostname = resolvedHostname;\n }\n if (body !== undefined) {\n contents.body = body;\n }\n return new protocol_http_1.HttpRequest(contents);\n};\nfunction sharedHeaders(operation) {\n return {\n \"content-type\": \"application/x-amz-json-1.1\",\n \"x-amz-target\": `AWSCognitoIdentityService.${operation}`,\n };\n}\nconst parseBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n if (encoded.length) {\n return JSON.parse(encoded);\n }\n return {};\n});\nconst parseErrorBody = async (errorBody, context) => {\n const value = await parseBody(errorBody, context);\n value.message = value.message ?? value.Message;\n return value;\n};\nconst loadRestJsonErrorCode = (output, data) => {\n const findKey = (object, key) => Object.keys(object).find((k) => k.toLowerCase() === key.toLowerCase());\n const sanitizeErrorCode = (rawValue) => {\n let cleanValue = rawValue;\n if (typeof cleanValue === \"number\") {\n cleanValue = cleanValue.toString();\n }\n if (cleanValue.indexOf(\",\") >= 0) {\n cleanValue = cleanValue.split(\",\")[0];\n }\n if (cleanValue.indexOf(\":\") >= 0) {\n cleanValue = cleanValue.split(\":\")[0];\n }\n if (cleanValue.indexOf(\"#\") >= 0) {\n cleanValue = cleanValue.split(\"#\")[1];\n }\n return cleanValue;\n };\n const headerKey = findKey(output.headers, \"x-amzn-errortype\");\n if (headerKey !== undefined) {\n return sanitizeErrorCode(output.headers[headerKey]);\n }\n if (data.code !== undefined) {\n return sanitizeErrorCode(data.code);\n }\n if (data[\"__type\"] !== undefined) {\n return sanitizeErrorCode(data[\"__type\"]);\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst tslib_1 = require(\"tslib\");\nconst package_json_1 = tslib_1.__importDefault(require(\"../package.json\"));\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst core_1 = require(\"@aws-sdk/core\");\nconst credential_provider_node_1 = require(\"@aws-sdk/credential-provider-node\");\nconst util_user_agent_node_1 = require(\"@aws-sdk/util-user-agent-node\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst hash_node_1 = require(\"@smithy/hash-node\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_body_length_node_1 = require(\"@smithy/util-body-length-node\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst runtimeConfig_shared_1 = require(\"./runtimeConfig.shared\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst util_defaults_mode_node_1 = require(\"@smithy/util-defaults-mode-node\");\nconst smithy_client_2 = require(\"@smithy/smithy-client\");\nconst getRuntimeConfig = (config) => {\n (0, smithy_client_2.emitWarningIfUnsupportedVersion)(process.version);\n const defaultsMode = (0, util_defaults_mode_node_1.resolveDefaultsModeConfig)(config);\n const defaultConfigProvider = () => defaultsMode().then(smithy_client_1.loadConfigsForDefaultMode);\n const clientSharedValues = (0, runtimeConfig_shared_1.getRuntimeConfig)(config);\n (0, core_1.emitWarningIfUnsupportedVersion)(process.version);\n return {\n ...clientSharedValues,\n ...config,\n runtime: \"node\",\n defaultsMode,\n bodyLengthChecker: config?.bodyLengthChecker ?? util_body_length_node_1.calculateBodyLength,\n credentialDefaultProvider: config?.credentialDefaultProvider ?? (0, client_sts_1.decorateDefaultCredentialProvider)(credential_provider_node_1.defaultProvider),\n defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n (0, util_user_agent_node_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_json_1.default.version }),\n maxAttempts: config?.maxAttempts ?? (0, node_config_provider_1.loadConfig)(middleware_retry_1.NODE_MAX_ATTEMPT_CONFIG_OPTIONS),\n region: config?.region ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS, config_resolver_1.NODE_REGION_CONFIG_FILE_OPTIONS),\n requestHandler: config?.requestHandler ?? new node_http_handler_1.NodeHttpHandler(defaultConfigProvider),\n retryMode: config?.retryMode ??\n (0, node_config_provider_1.loadConfig)({\n ...middleware_retry_1.NODE_RETRY_MODE_CONFIG_OPTIONS,\n default: async () => (await defaultConfigProvider()).retryMode || util_retry_1.DEFAULT_RETRY_MODE,\n }),\n sha256: config?.sha256 ?? hash_node_1.Hash.bind(null, \"sha256\"),\n streamCollector: config?.streamCollector ?? node_http_handler_1.streamCollector,\n useDualstackEndpoint: config?.useDualstackEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS),\n useFipsEndpoint: config?.useFipsEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS),\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst endpointResolver_1 = require(\"./endpoint/endpointResolver\");\nconst getRuntimeConfig = (config) => {\n return {\n apiVersion: \"2014-06-30\",\n base64Decoder: config?.base64Decoder ?? util_base64_1.fromBase64,\n base64Encoder: config?.base64Encoder ?? util_base64_1.toBase64,\n disableHostPrefix: config?.disableHostPrefix ?? false,\n endpointProvider: config?.endpointProvider ?? endpointResolver_1.defaultEndpointResolver,\n extensions: config?.extensions ?? [],\n logger: config?.logger ?? new smithy_client_1.NoOpLogger(),\n serviceId: config?.serviceId ?? \"Cognito Identity\",\n urlParser: config?.urlParser ?? url_parser_1.parseUrl,\n utf8Decoder: config?.utf8Decoder ?? util_utf8_1.fromUtf8,\n utf8Encoder: config?.utf8Encoder ?? util_utf8_1.toUtf8,\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRuntimeExtensions = void 0;\nconst region_config_resolver_1 = require(\"@aws-sdk/region-config-resolver\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst asPartial = (t) => t;\nconst resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n const extensionConfiguration = {\n ...asPartial((0, region_config_resolver_1.getAwsRegionExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, smithy_client_1.getDefaultExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, protocol_http_1.getHttpHandlerExtensionConfiguration)(runtimeConfig)),\n };\n extensions.forEach((extension) => extension.configure(extensionConfiguration));\n return {\n ...runtimeConfig,\n ...(0, region_config_resolver_1.resolveAwsRegionExtensionConfiguration)(extensionConfiguration),\n ...(0, smithy_client_1.resolveDefaultRuntimeConfig)(extensionConfiguration),\n ...(0, protocol_http_1.resolveHttpHandlerRuntimeConfig)(extensionConfiguration),\n };\n};\nexports.resolveRuntimeExtensions = resolveRuntimeExtensions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SSO = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst GetRoleCredentialsCommand_1 = require(\"./commands/GetRoleCredentialsCommand\");\nconst ListAccountRolesCommand_1 = require(\"./commands/ListAccountRolesCommand\");\nconst ListAccountsCommand_1 = require(\"./commands/ListAccountsCommand\");\nconst LogoutCommand_1 = require(\"./commands/LogoutCommand\");\nconst SSOClient_1 = require(\"./SSOClient\");\nconst commands = {\n GetRoleCredentialsCommand: GetRoleCredentialsCommand_1.GetRoleCredentialsCommand,\n ListAccountRolesCommand: ListAccountRolesCommand_1.ListAccountRolesCommand,\n ListAccountsCommand: ListAccountsCommand_1.ListAccountsCommand,\n LogoutCommand: LogoutCommand_1.LogoutCommand,\n};\nclass SSO extends SSOClient_1.SSOClient {\n}\nexports.SSO = SSO;\n(0, smithy_client_1.createAggregatedClient)(commands, SSO);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SSOClient = exports.__Client = void 0;\nconst middleware_host_header_1 = require(\"@aws-sdk/middleware-host-header\");\nconst middleware_logger_1 = require(\"@aws-sdk/middleware-logger\");\nconst middleware_recursion_detection_1 = require(\"@aws-sdk/middleware-recursion-detection\");\nconst middleware_user_agent_1 = require(\"@aws-sdk/middleware-user-agent\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst middleware_content_length_1 = require(\"@smithy/middleware-content-length\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__Client\", { enumerable: true, get: function () { return smithy_client_1.Client; } });\nconst EndpointParameters_1 = require(\"./endpoint/EndpointParameters\");\nconst runtimeConfig_1 = require(\"./runtimeConfig\");\nconst runtimeExtensions_1 = require(\"./runtimeExtensions\");\nclass SSOClient extends smithy_client_1.Client {\n constructor(...[configuration]) {\n const _config_0 = (0, runtimeConfig_1.getRuntimeConfig)(configuration || {});\n const _config_1 = (0, EndpointParameters_1.resolveClientEndpointParameters)(_config_0);\n const _config_2 = (0, config_resolver_1.resolveRegionConfig)(_config_1);\n const _config_3 = (0, middleware_endpoint_1.resolveEndpointConfig)(_config_2);\n const _config_4 = (0, middleware_retry_1.resolveRetryConfig)(_config_3);\n const _config_5 = (0, middleware_host_header_1.resolveHostHeaderConfig)(_config_4);\n const _config_6 = (0, middleware_user_agent_1.resolveUserAgentConfig)(_config_5);\n const _config_7 = (0, runtimeExtensions_1.resolveRuntimeExtensions)(_config_6, configuration?.extensions || []);\n super(_config_7);\n this.config = _config_7;\n this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));\n this.middlewareStack.use((0, middleware_content_length_1.getContentLengthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_host_header_1.getHostHeaderPlugin)(this.config));\n this.middlewareStack.use((0, middleware_logger_1.getLoggerPlugin)(this.config));\n this.middlewareStack.use((0, middleware_recursion_detection_1.getRecursionDetectionPlugin)(this.config));\n this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));\n }\n destroy() {\n super.destroy();\n }\n}\nexports.SSOClient = SSOClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetRoleCredentialsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_restJson1_1 = require(\"../protocols/Aws_restJson1\");\nclass GetRoleCredentialsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetRoleCredentialsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOClient\";\n const commandName = \"GetRoleCredentialsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.GetRoleCredentialsRequestFilterSensitiveLog,\n outputFilterSensitiveLog: models_0_1.GetRoleCredentialsResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"SWBPortalService\",\n operation: \"GetRoleCredentials\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_restJson1_1.se_GetRoleCredentialsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_restJson1_1.de_GetRoleCredentialsCommand)(output, context);\n }\n}\nexports.GetRoleCredentialsCommand = GetRoleCredentialsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListAccountRolesCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_restJson1_1 = require(\"../protocols/Aws_restJson1\");\nclass ListAccountRolesCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListAccountRolesCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOClient\";\n const commandName = \"ListAccountRolesCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.ListAccountRolesRequestFilterSensitiveLog,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"SWBPortalService\",\n operation: \"ListAccountRoles\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_restJson1_1.se_ListAccountRolesCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_restJson1_1.de_ListAccountRolesCommand)(output, context);\n }\n}\nexports.ListAccountRolesCommand = ListAccountRolesCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ListAccountsCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_restJson1_1 = require(\"../protocols/Aws_restJson1\");\nclass ListAccountsCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, ListAccountsCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOClient\";\n const commandName = \"ListAccountsCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.ListAccountsRequestFilterSensitiveLog,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"SWBPortalService\",\n operation: \"ListAccounts\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_restJson1_1.se_ListAccountsCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_restJson1_1.de_ListAccountsCommand)(output, context);\n }\n}\nexports.ListAccountsCommand = ListAccountsCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LogoutCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_restJson1_1 = require(\"../protocols/Aws_restJson1\");\nclass LogoutCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, LogoutCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOClient\";\n const commandName = \"LogoutCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.LogoutRequestFilterSensitiveLog,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"SWBPortalService\",\n operation: \"Logout\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_restJson1_1.se_LogoutCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_restJson1_1.de_LogoutCommand)(output, context);\n }\n}\nexports.LogoutCommand = LogoutCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./GetRoleCredentialsCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListAccountRolesCommand\"), exports);\ntslib_1.__exportStar(require(\"./ListAccountsCommand\"), exports);\ntslib_1.__exportStar(require(\"./LogoutCommand\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveClientEndpointParameters = void 0;\nconst resolveClientEndpointParameters = (options) => {\n return {\n ...options,\n useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n useFipsEndpoint: options.useFipsEndpoint ?? false,\n defaultSigningName: \"awsssoportal\",\n };\n};\nexports.resolveClientEndpointParameters = resolveClientEndpointParameters;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultEndpointResolver = void 0;\nconst util_endpoints_1 = require(\"@smithy/util-endpoints\");\nconst ruleset_1 = require(\"./ruleset\");\nconst defaultEndpointResolver = (endpointParams, context = {}) => {\n return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, {\n endpointParams: endpointParams,\n logger: context.logger,\n });\n};\nexports.defaultEndpointResolver = defaultEndpointResolver;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ruleSet = void 0;\nconst u = \"required\", v = \"fn\", w = \"argv\", x = \"ref\";\nconst a = true, b = \"isSet\", c = \"booleanEquals\", d = \"error\", e = \"endpoint\", f = \"tree\", g = \"PartitionResult\", h = \"getAttr\", i = { [u]: false, \"type\": \"String\" }, j = { [u]: true, \"default\": false, \"type\": \"Boolean\" }, k = { [x]: \"Endpoint\" }, l = { [v]: c, [w]: [{ [x]: \"UseFIPS\" }, true] }, m = { [v]: c, [w]: [{ [x]: \"UseDualStack\" }, true] }, n = {}, o = { [v]: h, [w]: [{ [x]: g }, \"supportsFIPS\"] }, p = { [x]: g }, q = { [v]: c, [w]: [true, { [v]: h, [w]: [p, \"supportsDualStack\"] }] }, r = [l], s = [m], t = [{ [x]: \"Region\" }];\nconst _data = { version: \"1.0\", parameters: { Region: i, UseDualStack: j, UseFIPS: j, Endpoint: i }, rules: [{ conditions: [{ [v]: b, [w]: [k] }], rules: [{ conditions: r, error: \"Invalid Configuration: FIPS and custom endpoint are not supported\", type: d }, { conditions: s, error: \"Invalid Configuration: Dualstack and custom endpoint are not supported\", type: d }, { endpoint: { url: k, properties: n, headers: n }, type: e }], type: f }, { conditions: [{ [v]: b, [w]: t }], rules: [{ conditions: [{ [v]: \"aws.partition\", [w]: t, assign: g }], rules: [{ conditions: [l, m], rules: [{ conditions: [{ [v]: c, [w]: [a, o] }, q], rules: [{ endpoint: { url: \"https://portal.sso-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"FIPS and DualStack are enabled, but this partition does not support one or both\", type: d }], type: f }, { conditions: r, rules: [{ conditions: [{ [v]: c, [w]: [o, a] }], rules: [{ conditions: [{ [v]: \"stringEquals\", [w]: [{ [v]: h, [w]: [p, \"name\"] }, \"aws-us-gov\"] }], endpoint: { url: \"https://portal.sso.{Region}.amazonaws.com\", properties: n, headers: n }, type: e }, { endpoint: { url: \"https://portal.sso-fips.{Region}.{PartitionResult#dnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"FIPS is enabled but this partition does not support FIPS\", type: d }], type: f }, { conditions: s, rules: [{ conditions: [q], rules: [{ endpoint: { url: \"https://portal.sso.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: n, headers: n }, type: e }], type: f }, { error: \"DualStack is enabled but this partition does not support DualStack\", type: d }], type: f }, { endpoint: { url: \"https://portal.sso.{Region}.{PartitionResult#dnsSuffix}\", properties: n, headers: n }, type: e }], type: f }], type: f }, { error: \"Invalid Configuration: Missing Region\", type: d }] };\nexports.ruleSet = _data;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SSOServiceException = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./SSOClient\"), exports);\ntslib_1.__exportStar(require(\"./SSO\"), exports);\ntslib_1.__exportStar(require(\"./commands\"), exports);\ntslib_1.__exportStar(require(\"./pagination\"), exports);\ntslib_1.__exportStar(require(\"./models\"), exports);\nrequire(\"@aws-sdk/util-endpoints\");\nvar SSOServiceException_1 = require(\"./models/SSOServiceException\");\nObject.defineProperty(exports, \"SSOServiceException\", { enumerable: true, get: function () { return SSOServiceException_1.SSOServiceException; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SSOServiceException = exports.__ServiceException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__ServiceException\", { enumerable: true, get: function () { return smithy_client_1.ServiceException; } });\nclass SSOServiceException extends smithy_client_1.ServiceException {\n constructor(options) {\n super(options);\n Object.setPrototypeOf(this, SSOServiceException.prototype);\n }\n}\nexports.SSOServiceException = SSOServiceException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./models_0\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LogoutRequestFilterSensitiveLog = exports.ListAccountsRequestFilterSensitiveLog = exports.ListAccountRolesRequestFilterSensitiveLog = exports.GetRoleCredentialsResponseFilterSensitiveLog = exports.RoleCredentialsFilterSensitiveLog = exports.GetRoleCredentialsRequestFilterSensitiveLog = exports.UnauthorizedException = exports.TooManyRequestsException = exports.ResourceNotFoundException = exports.InvalidRequestException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst SSOServiceException_1 = require(\"./SSOServiceException\");\nclass InvalidRequestException extends SSOServiceException_1.SSOServiceException {\n constructor(opts) {\n super({\n name: \"InvalidRequestException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidRequestException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidRequestException.prototype);\n }\n}\nexports.InvalidRequestException = InvalidRequestException;\nclass ResourceNotFoundException extends SSOServiceException_1.SSOServiceException {\n constructor(opts) {\n super({\n name: \"ResourceNotFoundException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ResourceNotFoundException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ResourceNotFoundException.prototype);\n }\n}\nexports.ResourceNotFoundException = ResourceNotFoundException;\nclass TooManyRequestsException extends SSOServiceException_1.SSOServiceException {\n constructor(opts) {\n super({\n name: \"TooManyRequestsException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"TooManyRequestsException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, TooManyRequestsException.prototype);\n }\n}\nexports.TooManyRequestsException = TooManyRequestsException;\nclass UnauthorizedException extends SSOServiceException_1.SSOServiceException {\n constructor(opts) {\n super({\n name: \"UnauthorizedException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"UnauthorizedException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, UnauthorizedException.prototype);\n }\n}\nexports.UnauthorizedException = UnauthorizedException;\nconst GetRoleCredentialsRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.accessToken && { accessToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.GetRoleCredentialsRequestFilterSensitiveLog = GetRoleCredentialsRequestFilterSensitiveLog;\nconst RoleCredentialsFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.secretAccessKey && { secretAccessKey: smithy_client_1.SENSITIVE_STRING }),\n ...(obj.sessionToken && { sessionToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.RoleCredentialsFilterSensitiveLog = RoleCredentialsFilterSensitiveLog;\nconst GetRoleCredentialsResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.roleCredentials && { roleCredentials: (0, exports.RoleCredentialsFilterSensitiveLog)(obj.roleCredentials) }),\n});\nexports.GetRoleCredentialsResponseFilterSensitiveLog = GetRoleCredentialsResponseFilterSensitiveLog;\nconst ListAccountRolesRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.accessToken && { accessToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.ListAccountRolesRequestFilterSensitiveLog = ListAccountRolesRequestFilterSensitiveLog;\nconst ListAccountsRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.accessToken && { accessToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.ListAccountsRequestFilterSensitiveLog = ListAccountsRequestFilterSensitiveLog;\nconst LogoutRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.accessToken && { accessToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.LogoutRequestFilterSensitiveLog = LogoutRequestFilterSensitiveLog;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListAccountRoles = void 0;\nconst ListAccountRolesCommand_1 = require(\"../commands/ListAccountRolesCommand\");\nconst SSOClient_1 = require(\"../SSOClient\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListAccountRolesCommand_1.ListAccountRolesCommand(input), ...args);\n};\nasync function* paginateListAccountRoles(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.nextToken = token;\n input[\"maxResults\"] = config.pageSize;\n if (config.client instanceof SSOClient_1.SSOClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected SSO | SSOClient\");\n }\n yield page;\n const prevToken = token;\n token = page.nextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListAccountRoles = paginateListAccountRoles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.paginateListAccounts = void 0;\nconst ListAccountsCommand_1 = require(\"../commands/ListAccountsCommand\");\nconst SSOClient_1 = require(\"../SSOClient\");\nconst makePagedClientRequest = async (client, input, ...args) => {\n return await client.send(new ListAccountsCommand_1.ListAccountsCommand(input), ...args);\n};\nasync function* paginateListAccounts(config, input, ...additionalArguments) {\n let token = config.startingToken || undefined;\n let hasNext = true;\n let page;\n while (hasNext) {\n input.nextToken = token;\n input[\"maxResults\"] = config.pageSize;\n if (config.client instanceof SSOClient_1.SSOClient) {\n page = await makePagedClientRequest(config.client, input, ...additionalArguments);\n }\n else {\n throw new Error(\"Invalid client, expected SSO | SSOClient\");\n }\n yield page;\n const prevToken = token;\n token = page.nextToken;\n hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));\n }\n return undefined;\n}\nexports.paginateListAccounts = paginateListAccounts;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./Interfaces\"), exports);\ntslib_1.__exportStar(require(\"./ListAccountRolesPaginator\"), exports);\ntslib_1.__exportStar(require(\"./ListAccountsPaginator\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.de_LogoutCommand = exports.de_ListAccountsCommand = exports.de_ListAccountRolesCommand = exports.de_GetRoleCredentialsCommand = exports.se_LogoutCommand = exports.se_ListAccountsCommand = exports.se_ListAccountRolesCommand = exports.se_GetRoleCredentialsCommand = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst models_0_1 = require(\"../models/models_0\");\nconst SSOServiceException_1 = require(\"../models/SSOServiceException\");\nconst se_GetRoleCredentialsCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = (0, smithy_client_1.map)({}, isSerializableHeaderValue, {\n \"x-amz-sso_bearer_token\": input.accessToken,\n });\n const resolvedPath = `${basePath?.endsWith(\"/\") ? basePath.slice(0, -1) : basePath || \"\"}` + \"/federation/credentials\";\n const query = (0, smithy_client_1.map)({\n role_name: [, (0, smithy_client_1.expectNonNull)(input.roleName, `roleName`)],\n account_id: [, (0, smithy_client_1.expectNonNull)(input.accountId, `accountId`)],\n });\n let body;\n return new protocol_http_1.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"GET\",\n headers,\n path: resolvedPath,\n query,\n body,\n });\n};\nexports.se_GetRoleCredentialsCommand = se_GetRoleCredentialsCommand;\nconst se_ListAccountRolesCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = (0, smithy_client_1.map)({}, isSerializableHeaderValue, {\n \"x-amz-sso_bearer_token\": input.accessToken,\n });\n const resolvedPath = `${basePath?.endsWith(\"/\") ? basePath.slice(0, -1) : basePath || \"\"}` + \"/assignment/roles\";\n const query = (0, smithy_client_1.map)({\n next_token: [, input.nextToken],\n max_result: [() => input.maxResults !== void 0, () => input.maxResults.toString()],\n account_id: [, (0, smithy_client_1.expectNonNull)(input.accountId, `accountId`)],\n });\n let body;\n return new protocol_http_1.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"GET\",\n headers,\n path: resolvedPath,\n query,\n body,\n });\n};\nexports.se_ListAccountRolesCommand = se_ListAccountRolesCommand;\nconst se_ListAccountsCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = (0, smithy_client_1.map)({}, isSerializableHeaderValue, {\n \"x-amz-sso_bearer_token\": input.accessToken,\n });\n const resolvedPath = `${basePath?.endsWith(\"/\") ? basePath.slice(0, -1) : basePath || \"\"}` + \"/assignment/accounts\";\n const query = (0, smithy_client_1.map)({\n next_token: [, input.nextToken],\n max_result: [() => input.maxResults !== void 0, () => input.maxResults.toString()],\n });\n let body;\n return new protocol_http_1.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"GET\",\n headers,\n path: resolvedPath,\n query,\n body,\n });\n};\nexports.se_ListAccountsCommand = se_ListAccountsCommand;\nconst se_LogoutCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = (0, smithy_client_1.map)({}, isSerializableHeaderValue, {\n \"x-amz-sso_bearer_token\": input.accessToken,\n });\n const resolvedPath = `${basePath?.endsWith(\"/\") ? basePath.slice(0, -1) : basePath || \"\"}` + \"/logout\";\n let body;\n return new protocol_http_1.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"POST\",\n headers,\n path: resolvedPath,\n body,\n });\n};\nexports.se_LogoutCommand = se_LogoutCommand;\nconst de_GetRoleCredentialsCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_GetRoleCredentialsCommandError(output, context);\n }\n const contents = (0, smithy_client_1.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_1.take)(data, {\n roleCredentials: smithy_client_1._json,\n });\n Object.assign(contents, doc);\n return contents;\n};\nexports.de_GetRoleCredentialsCommand = de_GetRoleCredentialsCommand;\nconst de_GetRoleCredentialsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidRequestException\":\n case \"com.amazonaws.sso#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.sso#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.sso#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n case \"UnauthorizedException\":\n case \"com.amazonaws.sso#UnauthorizedException\":\n throw await de_UnauthorizedExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ListAccountRolesCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_ListAccountRolesCommandError(output, context);\n }\n const contents = (0, smithy_client_1.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_1.take)(data, {\n nextToken: smithy_client_1.expectString,\n roleList: smithy_client_1._json,\n });\n Object.assign(contents, doc);\n return contents;\n};\nexports.de_ListAccountRolesCommand = de_ListAccountRolesCommand;\nconst de_ListAccountRolesCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidRequestException\":\n case \"com.amazonaws.sso#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.sso#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.sso#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n case \"UnauthorizedException\":\n case \"com.amazonaws.sso#UnauthorizedException\":\n throw await de_UnauthorizedExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_ListAccountsCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_ListAccountsCommandError(output, context);\n }\n const contents = (0, smithy_client_1.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_1.take)(data, {\n accountList: smithy_client_1._json,\n nextToken: smithy_client_1.expectString,\n });\n Object.assign(contents, doc);\n return contents;\n};\nexports.de_ListAccountsCommand = de_ListAccountsCommand;\nconst de_ListAccountsCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidRequestException\":\n case \"com.amazonaws.sso#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"ResourceNotFoundException\":\n case \"com.amazonaws.sso#ResourceNotFoundException\":\n throw await de_ResourceNotFoundExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.sso#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n case \"UnauthorizedException\":\n case \"com.amazonaws.sso#UnauthorizedException\":\n throw await de_UnauthorizedExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst de_LogoutCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_LogoutCommandError(output, context);\n }\n const contents = (0, smithy_client_1.map)({\n $metadata: deserializeMetadata(output),\n });\n await (0, smithy_client_1.collectBody)(output.body, context);\n return contents;\n};\nexports.de_LogoutCommand = de_LogoutCommand;\nconst de_LogoutCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidRequestException\":\n case \"com.amazonaws.sso#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"TooManyRequestsException\":\n case \"com.amazonaws.sso#TooManyRequestsException\":\n throw await de_TooManyRequestsExceptionRes(parsedOutput, context);\n case \"UnauthorizedException\":\n case \"com.amazonaws.sso#UnauthorizedException\":\n throw await de_UnauthorizedExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nconst throwDefaultError = (0, smithy_client_1.withBaseException)(SSOServiceException_1.SSOServiceException);\nconst de_InvalidRequestExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_1.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_1.take)(data, {\n message: smithy_client_1.expectString,\n });\n Object.assign(contents, doc);\n const exception = new models_0_1.InvalidRequestException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, parsedOutput.body);\n};\nconst de_ResourceNotFoundExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_1.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_1.take)(data, {\n message: smithy_client_1.expectString,\n });\n Object.assign(contents, doc);\n const exception = new models_0_1.ResourceNotFoundException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, parsedOutput.body);\n};\nconst de_TooManyRequestsExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_1.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_1.take)(data, {\n message: smithy_client_1.expectString,\n });\n Object.assign(contents, doc);\n const exception = new models_0_1.TooManyRequestsException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, parsedOutput.body);\n};\nconst de_UnauthorizedExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_1.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_1.take)(data, {\n message: smithy_client_1.expectString,\n });\n Object.assign(contents, doc);\n const exception = new models_0_1.UnauthorizedException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, parsedOutput.body);\n};\nconst deserializeMetadata = (output) => ({\n httpStatusCode: output.statusCode,\n requestId: output.headers[\"x-amzn-requestid\"] ?? output.headers[\"x-amzn-request-id\"] ?? output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n});\nconst collectBodyString = (streamBody, context) => (0, smithy_client_1.collectBody)(streamBody, context).then((body) => context.utf8Encoder(body));\nconst isSerializableHeaderValue = (value) => value !== undefined &&\n value !== null &&\n value !== \"\" &&\n (!Object.getOwnPropertyNames(value).includes(\"length\") || value.length != 0) &&\n (!Object.getOwnPropertyNames(value).includes(\"size\") || value.size != 0);\nconst parseBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n if (encoded.length) {\n return JSON.parse(encoded);\n }\n return {};\n});\nconst parseErrorBody = async (errorBody, context) => {\n const value = await parseBody(errorBody, context);\n value.message = value.message ?? value.Message;\n return value;\n};\nconst loadRestJsonErrorCode = (output, data) => {\n const findKey = (object, key) => Object.keys(object).find((k) => k.toLowerCase() === key.toLowerCase());\n const sanitizeErrorCode = (rawValue) => {\n let cleanValue = rawValue;\n if (typeof cleanValue === \"number\") {\n cleanValue = cleanValue.toString();\n }\n if (cleanValue.indexOf(\",\") >= 0) {\n cleanValue = cleanValue.split(\",\")[0];\n }\n if (cleanValue.indexOf(\":\") >= 0) {\n cleanValue = cleanValue.split(\":\")[0];\n }\n if (cleanValue.indexOf(\"#\") >= 0) {\n cleanValue = cleanValue.split(\"#\")[1];\n }\n return cleanValue;\n };\n const headerKey = findKey(output.headers, \"x-amzn-errortype\");\n if (headerKey !== undefined) {\n return sanitizeErrorCode(output.headers[headerKey]);\n }\n if (data.code !== undefined) {\n return sanitizeErrorCode(data.code);\n }\n if (data[\"__type\"] !== undefined) {\n return sanitizeErrorCode(data[\"__type\"]);\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst tslib_1 = require(\"tslib\");\nconst package_json_1 = tslib_1.__importDefault(require(\"../package.json\"));\nconst core_1 = require(\"@aws-sdk/core\");\nconst util_user_agent_node_1 = require(\"@aws-sdk/util-user-agent-node\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst hash_node_1 = require(\"@smithy/hash-node\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_body_length_node_1 = require(\"@smithy/util-body-length-node\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst runtimeConfig_shared_1 = require(\"./runtimeConfig.shared\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst util_defaults_mode_node_1 = require(\"@smithy/util-defaults-mode-node\");\nconst smithy_client_2 = require(\"@smithy/smithy-client\");\nconst getRuntimeConfig = (config) => {\n (0, smithy_client_2.emitWarningIfUnsupportedVersion)(process.version);\n const defaultsMode = (0, util_defaults_mode_node_1.resolveDefaultsModeConfig)(config);\n const defaultConfigProvider = () => defaultsMode().then(smithy_client_1.loadConfigsForDefaultMode);\n const clientSharedValues = (0, runtimeConfig_shared_1.getRuntimeConfig)(config);\n (0, core_1.emitWarningIfUnsupportedVersion)(process.version);\n return {\n ...clientSharedValues,\n ...config,\n runtime: \"node\",\n defaultsMode,\n bodyLengthChecker: config?.bodyLengthChecker ?? util_body_length_node_1.calculateBodyLength,\n defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n (0, util_user_agent_node_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_json_1.default.version }),\n maxAttempts: config?.maxAttempts ?? (0, node_config_provider_1.loadConfig)(middleware_retry_1.NODE_MAX_ATTEMPT_CONFIG_OPTIONS),\n region: config?.region ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS, config_resolver_1.NODE_REGION_CONFIG_FILE_OPTIONS),\n requestHandler: config?.requestHandler ?? new node_http_handler_1.NodeHttpHandler(defaultConfigProvider),\n retryMode: config?.retryMode ??\n (0, node_config_provider_1.loadConfig)({\n ...middleware_retry_1.NODE_RETRY_MODE_CONFIG_OPTIONS,\n default: async () => (await defaultConfigProvider()).retryMode || util_retry_1.DEFAULT_RETRY_MODE,\n }),\n sha256: config?.sha256 ?? hash_node_1.Hash.bind(null, \"sha256\"),\n streamCollector: config?.streamCollector ?? node_http_handler_1.streamCollector,\n useDualstackEndpoint: config?.useDualstackEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS),\n useFipsEndpoint: config?.useFipsEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS),\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst endpointResolver_1 = require(\"./endpoint/endpointResolver\");\nconst getRuntimeConfig = (config) => {\n return {\n apiVersion: \"2019-06-10\",\n base64Decoder: config?.base64Decoder ?? util_base64_1.fromBase64,\n base64Encoder: config?.base64Encoder ?? util_base64_1.toBase64,\n disableHostPrefix: config?.disableHostPrefix ?? false,\n endpointProvider: config?.endpointProvider ?? endpointResolver_1.defaultEndpointResolver,\n extensions: config?.extensions ?? [],\n logger: config?.logger ?? new smithy_client_1.NoOpLogger(),\n serviceId: config?.serviceId ?? \"SSO\",\n urlParser: config?.urlParser ?? url_parser_1.parseUrl,\n utf8Decoder: config?.utf8Decoder ?? util_utf8_1.fromUtf8,\n utf8Encoder: config?.utf8Encoder ?? util_utf8_1.toUtf8,\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRuntimeExtensions = void 0;\nconst region_config_resolver_1 = require(\"@aws-sdk/region-config-resolver\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst asPartial = (t) => t;\nconst resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n const extensionConfiguration = {\n ...asPartial((0, region_config_resolver_1.getAwsRegionExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, smithy_client_1.getDefaultExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, protocol_http_1.getHttpHandlerExtensionConfiguration)(runtimeConfig)),\n };\n extensions.forEach((extension) => extension.configure(extensionConfiguration));\n return {\n ...runtimeConfig,\n ...(0, region_config_resolver_1.resolveAwsRegionExtensionConfiguration)(extensionConfiguration),\n ...(0, smithy_client_1.resolveDefaultRuntimeConfig)(extensionConfiguration),\n ...(0, protocol_http_1.resolveHttpHandlerRuntimeConfig)(extensionConfiguration),\n };\n};\nexports.resolveRuntimeExtensions = resolveRuntimeExtensions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.STS = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst AssumeRoleCommand_1 = require(\"./commands/AssumeRoleCommand\");\nconst AssumeRoleWithSAMLCommand_1 = require(\"./commands/AssumeRoleWithSAMLCommand\");\nconst AssumeRoleWithWebIdentityCommand_1 = require(\"./commands/AssumeRoleWithWebIdentityCommand\");\nconst DecodeAuthorizationMessageCommand_1 = require(\"./commands/DecodeAuthorizationMessageCommand\");\nconst GetAccessKeyInfoCommand_1 = require(\"./commands/GetAccessKeyInfoCommand\");\nconst GetCallerIdentityCommand_1 = require(\"./commands/GetCallerIdentityCommand\");\nconst GetFederationTokenCommand_1 = require(\"./commands/GetFederationTokenCommand\");\nconst GetSessionTokenCommand_1 = require(\"./commands/GetSessionTokenCommand\");\nconst STSClient_1 = require(\"./STSClient\");\nconst commands = {\n AssumeRoleCommand: AssumeRoleCommand_1.AssumeRoleCommand,\n AssumeRoleWithSAMLCommand: AssumeRoleWithSAMLCommand_1.AssumeRoleWithSAMLCommand,\n AssumeRoleWithWebIdentityCommand: AssumeRoleWithWebIdentityCommand_1.AssumeRoleWithWebIdentityCommand,\n DecodeAuthorizationMessageCommand: DecodeAuthorizationMessageCommand_1.DecodeAuthorizationMessageCommand,\n GetAccessKeyInfoCommand: GetAccessKeyInfoCommand_1.GetAccessKeyInfoCommand,\n GetCallerIdentityCommand: GetCallerIdentityCommand_1.GetCallerIdentityCommand,\n GetFederationTokenCommand: GetFederationTokenCommand_1.GetFederationTokenCommand,\n GetSessionTokenCommand: GetSessionTokenCommand_1.GetSessionTokenCommand,\n};\nclass STS extends STSClient_1.STSClient {\n}\nexports.STS = STS;\n(0, smithy_client_1.createAggregatedClient)(commands, STS);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.STSClient = exports.__Client = void 0;\nconst middleware_host_header_1 = require(\"@aws-sdk/middleware-host-header\");\nconst middleware_logger_1 = require(\"@aws-sdk/middleware-logger\");\nconst middleware_recursion_detection_1 = require(\"@aws-sdk/middleware-recursion-detection\");\nconst middleware_sdk_sts_1 = require(\"@aws-sdk/middleware-sdk-sts\");\nconst middleware_user_agent_1 = require(\"@aws-sdk/middleware-user-agent\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst middleware_content_length_1 = require(\"@smithy/middleware-content-length\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__Client\", { enumerable: true, get: function () { return smithy_client_1.Client; } });\nconst EndpointParameters_1 = require(\"./endpoint/EndpointParameters\");\nconst runtimeConfig_1 = require(\"./runtimeConfig\");\nconst runtimeExtensions_1 = require(\"./runtimeExtensions\");\nclass STSClient extends smithy_client_1.Client {\n constructor(...[configuration]) {\n const _config_0 = (0, runtimeConfig_1.getRuntimeConfig)(configuration || {});\n const _config_1 = (0, EndpointParameters_1.resolveClientEndpointParameters)(_config_0);\n const _config_2 = (0, config_resolver_1.resolveRegionConfig)(_config_1);\n const _config_3 = (0, middleware_endpoint_1.resolveEndpointConfig)(_config_2);\n const _config_4 = (0, middleware_retry_1.resolveRetryConfig)(_config_3);\n const _config_5 = (0, middleware_host_header_1.resolveHostHeaderConfig)(_config_4);\n const _config_6 = (0, middleware_sdk_sts_1.resolveStsAuthConfig)(_config_5, { stsClientCtor: STSClient });\n const _config_7 = (0, middleware_user_agent_1.resolveUserAgentConfig)(_config_6);\n const _config_8 = (0, runtimeExtensions_1.resolveRuntimeExtensions)(_config_7, configuration?.extensions || []);\n super(_config_8);\n this.config = _config_8;\n this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));\n this.middlewareStack.use((0, middleware_content_length_1.getContentLengthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_host_header_1.getHostHeaderPlugin)(this.config));\n this.middlewareStack.use((0, middleware_logger_1.getLoggerPlugin)(this.config));\n this.middlewareStack.use((0, middleware_recursion_detection_1.getRecursionDetectionPlugin)(this.config));\n this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));\n }\n destroy() {\n super.destroy();\n }\n}\nexports.STSClient = STSClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AssumeRoleCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass AssumeRoleCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, AssumeRoleCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"AssumeRoleCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: models_0_1.AssumeRoleResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"AssumeRole\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_AssumeRoleCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_AssumeRoleCommand)(output, context);\n }\n}\nexports.AssumeRoleCommand = AssumeRoleCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AssumeRoleWithSAMLCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass AssumeRoleWithSAMLCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, AssumeRoleWithSAMLCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"AssumeRoleWithSAMLCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.AssumeRoleWithSAMLRequestFilterSensitiveLog,\n outputFilterSensitiveLog: models_0_1.AssumeRoleWithSAMLResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"AssumeRoleWithSAML\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_AssumeRoleWithSAMLCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_AssumeRoleWithSAMLCommand)(output, context);\n }\n}\nexports.AssumeRoleWithSAMLCommand = AssumeRoleWithSAMLCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AssumeRoleWithWebIdentityCommand = exports.$Command = void 0;\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass AssumeRoleWithWebIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, AssumeRoleWithWebIdentityCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"AssumeRoleWithWebIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: models_0_1.AssumeRoleWithWebIdentityRequestFilterSensitiveLog,\n outputFilterSensitiveLog: models_0_1.AssumeRoleWithWebIdentityResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"AssumeRoleWithWebIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_AssumeRoleWithWebIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_AssumeRoleWithWebIdentityCommand)(output, context);\n }\n}\nexports.AssumeRoleWithWebIdentityCommand = AssumeRoleWithWebIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DecodeAuthorizationMessageCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass DecodeAuthorizationMessageCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, DecodeAuthorizationMessageCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"DecodeAuthorizationMessageCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"DecodeAuthorizationMessage\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_DecodeAuthorizationMessageCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_DecodeAuthorizationMessageCommand)(output, context);\n }\n}\nexports.DecodeAuthorizationMessageCommand = DecodeAuthorizationMessageCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetAccessKeyInfoCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetAccessKeyInfoCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetAccessKeyInfoCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"GetAccessKeyInfoCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"GetAccessKeyInfo\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetAccessKeyInfoCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetAccessKeyInfoCommand)(output, context);\n }\n}\nexports.GetAccessKeyInfoCommand = GetAccessKeyInfoCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetCallerIdentityCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetCallerIdentityCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetCallerIdentityCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"GetCallerIdentityCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"GetCallerIdentity\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetCallerIdentityCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetCallerIdentityCommand)(output, context);\n }\n}\nexports.GetCallerIdentityCommand = GetCallerIdentityCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetFederationTokenCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetFederationTokenCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetFederationTokenCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"GetFederationTokenCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: models_0_1.GetFederationTokenResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"GetFederationToken\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetFederationTokenCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetFederationTokenCommand)(output, context);\n }\n}\nexports.GetFederationTokenCommand = GetFederationTokenCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetSessionTokenCommand = exports.$Command = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"$Command\", { enumerable: true, get: function () { return smithy_client_1.Command; } });\nconst types_1 = require(\"@smithy/types\");\nconst models_0_1 = require(\"../models/models_0\");\nconst Aws_query_1 = require(\"../protocols/Aws_query\");\nclass GetSessionTokenCommand extends smithy_client_1.Command {\n static getEndpointParameterInstructions() {\n return {\n UseGlobalEndpoint: { type: \"builtInParams\", name: \"useGlobalEndpoint\" },\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n constructor(input) {\n super();\n this.input = input;\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_1.getEndpointPlugin)(configuration, GetSessionTokenCommand.getEndpointParameterInstructions()));\n this.middlewareStack.use((0, middleware_signing_1.getAwsAuthPlugin)(configuration));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"STSClient\";\n const commandName = \"GetSessionTokenCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: models_0_1.GetSessionTokenResponseFilterSensitiveLog,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSecurityTokenServiceV20110615\",\n operation: \"GetSessionToken\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return (0, Aws_query_1.se_GetSessionTokenCommand)(input, context);\n }\n deserialize(output, context) {\n return (0, Aws_query_1.de_GetSessionTokenCommand)(output, context);\n }\n}\nexports.GetSessionTokenCommand = GetSessionTokenCommand;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./AssumeRoleCommand\"), exports);\ntslib_1.__exportStar(require(\"./AssumeRoleWithSAMLCommand\"), exports);\ntslib_1.__exportStar(require(\"./AssumeRoleWithWebIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./DecodeAuthorizationMessageCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetAccessKeyInfoCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetCallerIdentityCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetFederationTokenCommand\"), exports);\ntslib_1.__exportStar(require(\"./GetSessionTokenCommand\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decorateDefaultCredentialProvider = exports.getDefaultRoleAssumerWithWebIdentity = exports.getDefaultRoleAssumer = void 0;\nconst defaultStsRoleAssumers_1 = require(\"./defaultStsRoleAssumers\");\nconst STSClient_1 = require(\"./STSClient\");\nconst getCustomizableStsClientCtor = (baseCtor, customizations) => {\n if (!customizations)\n return baseCtor;\n else\n return class CustomizableSTSClient extends baseCtor {\n constructor(config) {\n super(config);\n for (const customization of customizations) {\n this.middlewareStack.use(customization);\n }\n }\n };\n};\nconst getDefaultRoleAssumer = (stsOptions = {}, stsPlugins) => (0, defaultStsRoleAssumers_1.getDefaultRoleAssumer)(stsOptions, getCustomizableStsClientCtor(STSClient_1.STSClient, stsPlugins));\nexports.getDefaultRoleAssumer = getDefaultRoleAssumer;\nconst getDefaultRoleAssumerWithWebIdentity = (stsOptions = {}, stsPlugins) => (0, defaultStsRoleAssumers_1.getDefaultRoleAssumerWithWebIdentity)(stsOptions, getCustomizableStsClientCtor(STSClient_1.STSClient, stsPlugins));\nexports.getDefaultRoleAssumerWithWebIdentity = getDefaultRoleAssumerWithWebIdentity;\nconst decorateDefaultCredentialProvider = (provider) => (input) => provider({\n roleAssumer: (0, exports.getDefaultRoleAssumer)(input),\n roleAssumerWithWebIdentity: (0, exports.getDefaultRoleAssumerWithWebIdentity)(input),\n ...input,\n});\nexports.decorateDefaultCredentialProvider = decorateDefaultCredentialProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decorateDefaultCredentialProvider = exports.getDefaultRoleAssumerWithWebIdentity = exports.getDefaultRoleAssumer = void 0;\nconst AssumeRoleCommand_1 = require(\"./commands/AssumeRoleCommand\");\nconst AssumeRoleWithWebIdentityCommand_1 = require(\"./commands/AssumeRoleWithWebIdentityCommand\");\nconst ASSUME_ROLE_DEFAULT_REGION = \"us-east-1\";\nconst decorateDefaultRegion = (region) => {\n if (typeof region !== \"function\") {\n return region === undefined ? ASSUME_ROLE_DEFAULT_REGION : region;\n }\n return async () => {\n try {\n return await region();\n }\n catch (e) {\n return ASSUME_ROLE_DEFAULT_REGION;\n }\n };\n};\nconst getDefaultRoleAssumer = (stsOptions, stsClientCtor) => {\n let stsClient;\n let closureSourceCreds;\n return async (sourceCreds, params) => {\n closureSourceCreds = sourceCreds;\n if (!stsClient) {\n const { logger, region, requestHandler } = stsOptions;\n stsClient = new stsClientCtor({\n logger,\n credentialDefaultProvider: () => async () => closureSourceCreds,\n region: decorateDefaultRegion(region || stsOptions.region),\n ...(requestHandler ? { requestHandler } : {}),\n });\n }\n const { Credentials } = await stsClient.send(new AssumeRoleCommand_1.AssumeRoleCommand(params));\n if (!Credentials || !Credentials.AccessKeyId || !Credentials.SecretAccessKey) {\n throw new Error(`Invalid response from STS.assumeRole call with role ${params.RoleArn}`);\n }\n return {\n accessKeyId: Credentials.AccessKeyId,\n secretAccessKey: Credentials.SecretAccessKey,\n sessionToken: Credentials.SessionToken,\n expiration: Credentials.Expiration,\n };\n };\n};\nexports.getDefaultRoleAssumer = getDefaultRoleAssumer;\nconst getDefaultRoleAssumerWithWebIdentity = (stsOptions, stsClientCtor) => {\n let stsClient;\n return async (params) => {\n if (!stsClient) {\n const { logger, region, requestHandler } = stsOptions;\n stsClient = new stsClientCtor({\n logger,\n region: decorateDefaultRegion(region || stsOptions.region),\n ...(requestHandler ? { requestHandler } : {}),\n });\n }\n const { Credentials } = await stsClient.send(new AssumeRoleWithWebIdentityCommand_1.AssumeRoleWithWebIdentityCommand(params));\n if (!Credentials || !Credentials.AccessKeyId || !Credentials.SecretAccessKey) {\n throw new Error(`Invalid response from STS.assumeRoleWithWebIdentity call with role ${params.RoleArn}`);\n }\n return {\n accessKeyId: Credentials.AccessKeyId,\n secretAccessKey: Credentials.SecretAccessKey,\n sessionToken: Credentials.SessionToken,\n expiration: Credentials.Expiration,\n };\n };\n};\nexports.getDefaultRoleAssumerWithWebIdentity = getDefaultRoleAssumerWithWebIdentity;\nconst decorateDefaultCredentialProvider = (provider) => (input) => provider({\n roleAssumer: (0, exports.getDefaultRoleAssumer)(input, input.stsClientCtor),\n roleAssumerWithWebIdentity: (0, exports.getDefaultRoleAssumerWithWebIdentity)(input, input.stsClientCtor),\n ...input,\n});\nexports.decorateDefaultCredentialProvider = decorateDefaultCredentialProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveClientEndpointParameters = void 0;\nconst resolveClientEndpointParameters = (options) => {\n return {\n ...options,\n useDualstackEndpoint: options.useDualstackEndpoint ?? false,\n useFipsEndpoint: options.useFipsEndpoint ?? false,\n useGlobalEndpoint: options.useGlobalEndpoint ?? false,\n defaultSigningName: \"sts\",\n };\n};\nexports.resolveClientEndpointParameters = resolveClientEndpointParameters;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultEndpointResolver = void 0;\nconst util_endpoints_1 = require(\"@smithy/util-endpoints\");\nconst ruleset_1 = require(\"./ruleset\");\nconst defaultEndpointResolver = (endpointParams, context = {}) => {\n return (0, util_endpoints_1.resolveEndpoint)(ruleset_1.ruleSet, {\n endpointParams: endpointParams,\n logger: context.logger,\n });\n};\nexports.defaultEndpointResolver = defaultEndpointResolver;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ruleSet = void 0;\nconst F = \"required\", G = \"type\", H = \"fn\", I = \"argv\", J = \"ref\";\nconst a = false, b = true, c = \"booleanEquals\", d = \"stringEquals\", e = \"sigv4\", f = \"sts\", g = \"us-east-1\", h = \"endpoint\", i = \"https://sts.{Region}.{PartitionResult#dnsSuffix}\", j = \"tree\", k = \"error\", l = \"getAttr\", m = { [F]: false, [G]: \"String\" }, n = { [F]: true, \"default\": false, [G]: \"Boolean\" }, o = { [J]: \"Endpoint\" }, p = { [H]: \"isSet\", [I]: [{ [J]: \"Region\" }] }, q = { [J]: \"Region\" }, r = { [H]: \"aws.partition\", [I]: [q], \"assign\": \"PartitionResult\" }, s = { [J]: \"UseFIPS\" }, t = { [J]: \"UseDualStack\" }, u = { \"url\": \"https://sts.amazonaws.com\", \"properties\": { \"authSchemes\": [{ \"name\": e, \"signingName\": f, \"signingRegion\": g }] }, \"headers\": {} }, v = {}, w = { \"conditions\": [{ [H]: d, [I]: [q, \"aws-global\"] }], [h]: u, [G]: h }, x = { [H]: c, [I]: [s, true] }, y = { [H]: c, [I]: [t, true] }, z = { [H]: l, [I]: [{ [J]: \"PartitionResult\" }, \"supportsFIPS\"] }, A = { [J]: \"PartitionResult\" }, B = { [H]: c, [I]: [true, { [H]: l, [I]: [A, \"supportsDualStack\"] }] }, C = [{ [H]: \"isSet\", [I]: [o] }], D = [x], E = [y];\nconst _data = { version: \"1.0\", parameters: { Region: m, UseDualStack: n, UseFIPS: n, Endpoint: m, UseGlobalEndpoint: n }, rules: [{ conditions: [{ [H]: c, [I]: [{ [J]: \"UseGlobalEndpoint\" }, b] }, { [H]: \"not\", [I]: C }, p, r, { [H]: c, [I]: [s, a] }, { [H]: c, [I]: [t, a] }], rules: [{ conditions: [{ [H]: d, [I]: [q, \"ap-northeast-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"ap-south-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"ap-southeast-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"ap-southeast-2\"] }], endpoint: u, [G]: h }, w, { conditions: [{ [H]: d, [I]: [q, \"ca-central-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"eu-central-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"eu-north-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"eu-west-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"eu-west-2\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"eu-west-3\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"sa-east-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, g] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"us-east-2\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"us-west-1\"] }], endpoint: u, [G]: h }, { conditions: [{ [H]: d, [I]: [q, \"us-west-2\"] }], endpoint: u, [G]: h }, { endpoint: { url: i, properties: { authSchemes: [{ name: e, signingName: f, signingRegion: \"{Region}\" }] }, headers: v }, [G]: h }], [G]: j }, { conditions: C, rules: [{ conditions: D, error: \"Invalid Configuration: FIPS and custom endpoint are not supported\", [G]: k }, { conditions: E, error: \"Invalid Configuration: Dualstack and custom endpoint are not supported\", [G]: k }, { endpoint: { url: o, properties: v, headers: v }, [G]: h }], [G]: j }, { conditions: [p], rules: [{ conditions: [r], rules: [{ conditions: [x, y], rules: [{ conditions: [{ [H]: c, [I]: [b, z] }, B], rules: [{ endpoint: { url: \"https://sts-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: v, headers: v }, [G]: h }], [G]: j }, { error: \"FIPS and DualStack are enabled, but this partition does not support one or both\", [G]: k }], [G]: j }, { conditions: D, rules: [{ conditions: [{ [H]: c, [I]: [z, b] }], rules: [{ conditions: [{ [H]: d, [I]: [{ [H]: l, [I]: [A, \"name\"] }, \"aws-us-gov\"] }], endpoint: { url: \"https://sts.{Region}.amazonaws.com\", properties: v, headers: v }, [G]: h }, { endpoint: { url: \"https://sts-fips.{Region}.{PartitionResult#dnsSuffix}\", properties: v, headers: v }, [G]: h }], [G]: j }, { error: \"FIPS is enabled but this partition does not support FIPS\", [G]: k }], [G]: j }, { conditions: E, rules: [{ conditions: [B], rules: [{ endpoint: { url: \"https://sts.{Region}.{PartitionResult#dualStackDnsSuffix}\", properties: v, headers: v }, [G]: h }], [G]: j }, { error: \"DualStack is enabled but this partition does not support DualStack\", [G]: k }], [G]: j }, w, { endpoint: { url: i, properties: v, headers: v }, [G]: h }], [G]: j }], [G]: j }, { error: \"Invalid Configuration: Missing Region\", [G]: k }] };\nexports.ruleSet = _data;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.STSServiceException = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./STSClient\"), exports);\ntslib_1.__exportStar(require(\"./STS\"), exports);\ntslib_1.__exportStar(require(\"./commands\"), exports);\ntslib_1.__exportStar(require(\"./models\"), exports);\ntslib_1.__exportStar(require(\"./defaultRoleAssumers\"), exports);\nrequire(\"@aws-sdk/util-endpoints\");\nvar STSServiceException_1 = require(\"./models/STSServiceException\");\nObject.defineProperty(exports, \"STSServiceException\", { enumerable: true, get: function () { return STSServiceException_1.STSServiceException; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.STSServiceException = exports.__ServiceException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nObject.defineProperty(exports, \"__ServiceException\", { enumerable: true, get: function () { return smithy_client_1.ServiceException; } });\nclass STSServiceException extends smithy_client_1.ServiceException {\n constructor(options) {\n super(options);\n Object.setPrototypeOf(this, STSServiceException.prototype);\n }\n}\nexports.STSServiceException = STSServiceException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./models_0\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetSessionTokenResponseFilterSensitiveLog = exports.GetFederationTokenResponseFilterSensitiveLog = exports.AssumeRoleWithWebIdentityResponseFilterSensitiveLog = exports.AssumeRoleWithWebIdentityRequestFilterSensitiveLog = exports.AssumeRoleWithSAMLResponseFilterSensitiveLog = exports.AssumeRoleWithSAMLRequestFilterSensitiveLog = exports.AssumeRoleResponseFilterSensitiveLog = exports.CredentialsFilterSensitiveLog = exports.InvalidAuthorizationMessageException = exports.IDPCommunicationErrorException = exports.InvalidIdentityTokenException = exports.IDPRejectedClaimException = exports.RegionDisabledException = exports.PackedPolicyTooLargeException = exports.MalformedPolicyDocumentException = exports.ExpiredTokenException = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst STSServiceException_1 = require(\"./STSServiceException\");\nclass ExpiredTokenException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"ExpiredTokenException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ExpiredTokenException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, ExpiredTokenException.prototype);\n }\n}\nexports.ExpiredTokenException = ExpiredTokenException;\nclass MalformedPolicyDocumentException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"MalformedPolicyDocumentException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"MalformedPolicyDocumentException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, MalformedPolicyDocumentException.prototype);\n }\n}\nexports.MalformedPolicyDocumentException = MalformedPolicyDocumentException;\nclass PackedPolicyTooLargeException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"PackedPolicyTooLargeException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"PackedPolicyTooLargeException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, PackedPolicyTooLargeException.prototype);\n }\n}\nexports.PackedPolicyTooLargeException = PackedPolicyTooLargeException;\nclass RegionDisabledException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"RegionDisabledException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"RegionDisabledException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, RegionDisabledException.prototype);\n }\n}\nexports.RegionDisabledException = RegionDisabledException;\nclass IDPRejectedClaimException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"IDPRejectedClaimException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"IDPRejectedClaimException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, IDPRejectedClaimException.prototype);\n }\n}\nexports.IDPRejectedClaimException = IDPRejectedClaimException;\nclass InvalidIdentityTokenException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"InvalidIdentityTokenException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidIdentityTokenException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidIdentityTokenException.prototype);\n }\n}\nexports.InvalidIdentityTokenException = InvalidIdentityTokenException;\nclass IDPCommunicationErrorException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"IDPCommunicationErrorException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"IDPCommunicationErrorException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, IDPCommunicationErrorException.prototype);\n }\n}\nexports.IDPCommunicationErrorException = IDPCommunicationErrorException;\nclass InvalidAuthorizationMessageException extends STSServiceException_1.STSServiceException {\n constructor(opts) {\n super({\n name: \"InvalidAuthorizationMessageException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidAuthorizationMessageException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, InvalidAuthorizationMessageException.prototype);\n }\n}\nexports.InvalidAuthorizationMessageException = InvalidAuthorizationMessageException;\nconst CredentialsFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.SecretAccessKey && { SecretAccessKey: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.CredentialsFilterSensitiveLog = CredentialsFilterSensitiveLog;\nconst AssumeRoleResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.Credentials && { Credentials: (0, exports.CredentialsFilterSensitiveLog)(obj.Credentials) }),\n});\nexports.AssumeRoleResponseFilterSensitiveLog = AssumeRoleResponseFilterSensitiveLog;\nconst AssumeRoleWithSAMLRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.SAMLAssertion && { SAMLAssertion: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.AssumeRoleWithSAMLRequestFilterSensitiveLog = AssumeRoleWithSAMLRequestFilterSensitiveLog;\nconst AssumeRoleWithSAMLResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.Credentials && { Credentials: (0, exports.CredentialsFilterSensitiveLog)(obj.Credentials) }),\n});\nexports.AssumeRoleWithSAMLResponseFilterSensitiveLog = AssumeRoleWithSAMLResponseFilterSensitiveLog;\nconst AssumeRoleWithWebIdentityRequestFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.WebIdentityToken && { WebIdentityToken: smithy_client_1.SENSITIVE_STRING }),\n});\nexports.AssumeRoleWithWebIdentityRequestFilterSensitiveLog = AssumeRoleWithWebIdentityRequestFilterSensitiveLog;\nconst AssumeRoleWithWebIdentityResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.Credentials && { Credentials: (0, exports.CredentialsFilterSensitiveLog)(obj.Credentials) }),\n});\nexports.AssumeRoleWithWebIdentityResponseFilterSensitiveLog = AssumeRoleWithWebIdentityResponseFilterSensitiveLog;\nconst GetFederationTokenResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.Credentials && { Credentials: (0, exports.CredentialsFilterSensitiveLog)(obj.Credentials) }),\n});\nexports.GetFederationTokenResponseFilterSensitiveLog = GetFederationTokenResponseFilterSensitiveLog;\nconst GetSessionTokenResponseFilterSensitiveLog = (obj) => ({\n ...obj,\n ...(obj.Credentials && { Credentials: (0, exports.CredentialsFilterSensitiveLog)(obj.Credentials) }),\n});\nexports.GetSessionTokenResponseFilterSensitiveLog = GetSessionTokenResponseFilterSensitiveLog;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.de_GetSessionTokenCommand = exports.de_GetFederationTokenCommand = exports.de_GetCallerIdentityCommand = exports.de_GetAccessKeyInfoCommand = exports.de_DecodeAuthorizationMessageCommand = exports.de_AssumeRoleWithWebIdentityCommand = exports.de_AssumeRoleWithSAMLCommand = exports.de_AssumeRoleCommand = exports.se_GetSessionTokenCommand = exports.se_GetFederationTokenCommand = exports.se_GetCallerIdentityCommand = exports.se_GetAccessKeyInfoCommand = exports.se_DecodeAuthorizationMessageCommand = exports.se_AssumeRoleWithWebIdentityCommand = exports.se_AssumeRoleWithSAMLCommand = exports.se_AssumeRoleCommand = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst fast_xml_parser_1 = require(\"fast-xml-parser\");\nconst models_0_1 = require(\"../models/models_0\");\nconst STSServiceException_1 = require(\"../models/STSServiceException\");\nconst se_AssumeRoleCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_AssumeRoleRequest(input, context),\n Action: \"AssumeRole\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_AssumeRoleCommand = se_AssumeRoleCommand;\nconst se_AssumeRoleWithSAMLCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_AssumeRoleWithSAMLRequest(input, context),\n Action: \"AssumeRoleWithSAML\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_AssumeRoleWithSAMLCommand = se_AssumeRoleWithSAMLCommand;\nconst se_AssumeRoleWithWebIdentityCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_AssumeRoleWithWebIdentityRequest(input, context),\n Action: \"AssumeRoleWithWebIdentity\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_AssumeRoleWithWebIdentityCommand = se_AssumeRoleWithWebIdentityCommand;\nconst se_DecodeAuthorizationMessageCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_DecodeAuthorizationMessageRequest(input, context),\n Action: \"DecodeAuthorizationMessage\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_DecodeAuthorizationMessageCommand = se_DecodeAuthorizationMessageCommand;\nconst se_GetAccessKeyInfoCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetAccessKeyInfoRequest(input, context),\n Action: \"GetAccessKeyInfo\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetAccessKeyInfoCommand = se_GetAccessKeyInfoCommand;\nconst se_GetCallerIdentityCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetCallerIdentityRequest(input, context),\n Action: \"GetCallerIdentity\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetCallerIdentityCommand = se_GetCallerIdentityCommand;\nconst se_GetFederationTokenCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetFederationTokenRequest(input, context),\n Action: \"GetFederationToken\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetFederationTokenCommand = se_GetFederationTokenCommand;\nconst se_GetSessionTokenCommand = async (input, context) => {\n const headers = SHARED_HEADERS;\n let body;\n body = buildFormUrlencodedString({\n ...se_GetSessionTokenRequest(input, context),\n Action: \"GetSessionToken\",\n Version: \"2011-06-15\",\n });\n return buildHttpRpcRequest(context, headers, \"/\", undefined, body);\n};\nexports.se_GetSessionTokenCommand = se_GetSessionTokenCommand;\nconst de_AssumeRoleCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_AssumeRoleCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_AssumeRoleResponse(data.AssumeRoleResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_AssumeRoleCommand = de_AssumeRoleCommand;\nconst de_AssumeRoleCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExpiredTokenException\":\n case \"com.amazonaws.sts#ExpiredTokenException\":\n throw await de_ExpiredTokenExceptionRes(parsedOutput, context);\n case \"MalformedPolicyDocument\":\n case \"com.amazonaws.sts#MalformedPolicyDocumentException\":\n throw await de_MalformedPolicyDocumentExceptionRes(parsedOutput, context);\n case \"PackedPolicyTooLarge\":\n case \"com.amazonaws.sts#PackedPolicyTooLargeException\":\n throw await de_PackedPolicyTooLargeExceptionRes(parsedOutput, context);\n case \"RegionDisabledException\":\n case \"com.amazonaws.sts#RegionDisabledException\":\n throw await de_RegionDisabledExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_AssumeRoleWithSAMLCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_AssumeRoleWithSAMLCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_AssumeRoleWithSAMLResponse(data.AssumeRoleWithSAMLResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_AssumeRoleWithSAMLCommand = de_AssumeRoleWithSAMLCommand;\nconst de_AssumeRoleWithSAMLCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExpiredTokenException\":\n case \"com.amazonaws.sts#ExpiredTokenException\":\n throw await de_ExpiredTokenExceptionRes(parsedOutput, context);\n case \"IDPRejectedClaim\":\n case \"com.amazonaws.sts#IDPRejectedClaimException\":\n throw await de_IDPRejectedClaimExceptionRes(parsedOutput, context);\n case \"InvalidIdentityToken\":\n case \"com.amazonaws.sts#InvalidIdentityTokenException\":\n throw await de_InvalidIdentityTokenExceptionRes(parsedOutput, context);\n case \"MalformedPolicyDocument\":\n case \"com.amazonaws.sts#MalformedPolicyDocumentException\":\n throw await de_MalformedPolicyDocumentExceptionRes(parsedOutput, context);\n case \"PackedPolicyTooLarge\":\n case \"com.amazonaws.sts#PackedPolicyTooLargeException\":\n throw await de_PackedPolicyTooLargeExceptionRes(parsedOutput, context);\n case \"RegionDisabledException\":\n case \"com.amazonaws.sts#RegionDisabledException\":\n throw await de_RegionDisabledExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_AssumeRoleWithWebIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_AssumeRoleWithWebIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_AssumeRoleWithWebIdentityResponse(data.AssumeRoleWithWebIdentityResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_AssumeRoleWithWebIdentityCommand = de_AssumeRoleWithWebIdentityCommand;\nconst de_AssumeRoleWithWebIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"ExpiredTokenException\":\n case \"com.amazonaws.sts#ExpiredTokenException\":\n throw await de_ExpiredTokenExceptionRes(parsedOutput, context);\n case \"IDPCommunicationError\":\n case \"com.amazonaws.sts#IDPCommunicationErrorException\":\n throw await de_IDPCommunicationErrorExceptionRes(parsedOutput, context);\n case \"IDPRejectedClaim\":\n case \"com.amazonaws.sts#IDPRejectedClaimException\":\n throw await de_IDPRejectedClaimExceptionRes(parsedOutput, context);\n case \"InvalidIdentityToken\":\n case \"com.amazonaws.sts#InvalidIdentityTokenException\":\n throw await de_InvalidIdentityTokenExceptionRes(parsedOutput, context);\n case \"MalformedPolicyDocument\":\n case \"com.amazonaws.sts#MalformedPolicyDocumentException\":\n throw await de_MalformedPolicyDocumentExceptionRes(parsedOutput, context);\n case \"PackedPolicyTooLarge\":\n case \"com.amazonaws.sts#PackedPolicyTooLargeException\":\n throw await de_PackedPolicyTooLargeExceptionRes(parsedOutput, context);\n case \"RegionDisabledException\":\n case \"com.amazonaws.sts#RegionDisabledException\":\n throw await de_RegionDisabledExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_DecodeAuthorizationMessageCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_DecodeAuthorizationMessageCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_DecodeAuthorizationMessageResponse(data.DecodeAuthorizationMessageResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_DecodeAuthorizationMessageCommand = de_DecodeAuthorizationMessageCommand;\nconst de_DecodeAuthorizationMessageCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InvalidAuthorizationMessageException\":\n case \"com.amazonaws.sts#InvalidAuthorizationMessageException\":\n throw await de_InvalidAuthorizationMessageExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_GetAccessKeyInfoCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetAccessKeyInfoCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetAccessKeyInfoResponse(data.GetAccessKeyInfoResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetAccessKeyInfoCommand = de_GetAccessKeyInfoCommand;\nconst de_GetAccessKeyInfoCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_GetCallerIdentityCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetCallerIdentityCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetCallerIdentityResponse(data.GetCallerIdentityResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetCallerIdentityCommand = de_GetCallerIdentityCommand;\nconst de_GetCallerIdentityCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n};\nconst de_GetFederationTokenCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetFederationTokenCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetFederationTokenResponse(data.GetFederationTokenResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetFederationTokenCommand = de_GetFederationTokenCommand;\nconst de_GetFederationTokenCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"MalformedPolicyDocument\":\n case \"com.amazonaws.sts#MalformedPolicyDocumentException\":\n throw await de_MalformedPolicyDocumentExceptionRes(parsedOutput, context);\n case \"PackedPolicyTooLarge\":\n case \"com.amazonaws.sts#PackedPolicyTooLargeException\":\n throw await de_PackedPolicyTooLargeExceptionRes(parsedOutput, context);\n case \"RegionDisabledException\":\n case \"com.amazonaws.sts#RegionDisabledException\":\n throw await de_RegionDisabledExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_GetSessionTokenCommand = async (output, context) => {\n if (output.statusCode >= 300) {\n return de_GetSessionTokenCommandError(output, context);\n }\n const data = await parseBody(output.body, context);\n let contents = {};\n contents = de_GetSessionTokenResponse(data.GetSessionTokenResult, context);\n const response = {\n $metadata: deserializeMetadata(output),\n ...contents,\n };\n return response;\n};\nexports.de_GetSessionTokenCommand = de_GetSessionTokenCommand;\nconst de_GetSessionTokenCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadQueryErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"RegionDisabledException\":\n case \"com.amazonaws.sts#RegionDisabledException\":\n throw await de_RegionDisabledExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody: parsedBody.Error,\n errorCode,\n });\n }\n};\nconst de_ExpiredTokenExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_ExpiredTokenException(body.Error, context);\n const exception = new models_0_1.ExpiredTokenException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_IDPCommunicationErrorExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_IDPCommunicationErrorException(body.Error, context);\n const exception = new models_0_1.IDPCommunicationErrorException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_IDPRejectedClaimExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_IDPRejectedClaimException(body.Error, context);\n const exception = new models_0_1.IDPRejectedClaimException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidAuthorizationMessageExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InvalidAuthorizationMessageException(body.Error, context);\n const exception = new models_0_1.InvalidAuthorizationMessageException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_InvalidIdentityTokenExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_InvalidIdentityTokenException(body.Error, context);\n const exception = new models_0_1.InvalidIdentityTokenException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_MalformedPolicyDocumentExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_MalformedPolicyDocumentException(body.Error, context);\n const exception = new models_0_1.MalformedPolicyDocumentException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_PackedPolicyTooLargeExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_PackedPolicyTooLargeException(body.Error, context);\n const exception = new models_0_1.PackedPolicyTooLargeException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst de_RegionDisabledExceptionRes = async (parsedOutput, context) => {\n const body = parsedOutput.body;\n const deserialized = de_RegionDisabledException(body.Error, context);\n const exception = new models_0_1.RegionDisabledException({\n $metadata: deserializeMetadata(parsedOutput),\n ...deserialized,\n });\n return (0, smithy_client_1.decorateServiceException)(exception, body);\n};\nconst se_AssumeRoleRequest = (input, context) => {\n const entries = {};\n if (input.RoleArn != null) {\n entries[\"RoleArn\"] = input.RoleArn;\n }\n if (input.RoleSessionName != null) {\n entries[\"RoleSessionName\"] = input.RoleSessionName;\n }\n if (input.PolicyArns != null) {\n const memberEntries = se_policyDescriptorListType(input.PolicyArns, context);\n if (input.PolicyArns?.length === 0) {\n entries.PolicyArns = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `PolicyArns.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Policy != null) {\n entries[\"Policy\"] = input.Policy;\n }\n if (input.DurationSeconds != null) {\n entries[\"DurationSeconds\"] = input.DurationSeconds;\n }\n if (input.Tags != null) {\n const memberEntries = se_tagListType(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n if (input.TransitiveTagKeys != null) {\n const memberEntries = se_tagKeyListType(input.TransitiveTagKeys, context);\n if (input.TransitiveTagKeys?.length === 0) {\n entries.TransitiveTagKeys = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `TransitiveTagKeys.${key}`;\n entries[loc] = value;\n });\n }\n if (input.ExternalId != null) {\n entries[\"ExternalId\"] = input.ExternalId;\n }\n if (input.SerialNumber != null) {\n entries[\"SerialNumber\"] = input.SerialNumber;\n }\n if (input.TokenCode != null) {\n entries[\"TokenCode\"] = input.TokenCode;\n }\n if (input.SourceIdentity != null) {\n entries[\"SourceIdentity\"] = input.SourceIdentity;\n }\n if (input.ProvidedContexts != null) {\n const memberEntries = se_ProvidedContextsListType(input.ProvidedContexts, context);\n if (input.ProvidedContexts?.length === 0) {\n entries.ProvidedContexts = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `ProvidedContexts.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_AssumeRoleWithSAMLRequest = (input, context) => {\n const entries = {};\n if (input.RoleArn != null) {\n entries[\"RoleArn\"] = input.RoleArn;\n }\n if (input.PrincipalArn != null) {\n entries[\"PrincipalArn\"] = input.PrincipalArn;\n }\n if (input.SAMLAssertion != null) {\n entries[\"SAMLAssertion\"] = input.SAMLAssertion;\n }\n if (input.PolicyArns != null) {\n const memberEntries = se_policyDescriptorListType(input.PolicyArns, context);\n if (input.PolicyArns?.length === 0) {\n entries.PolicyArns = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `PolicyArns.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Policy != null) {\n entries[\"Policy\"] = input.Policy;\n }\n if (input.DurationSeconds != null) {\n entries[\"DurationSeconds\"] = input.DurationSeconds;\n }\n return entries;\n};\nconst se_AssumeRoleWithWebIdentityRequest = (input, context) => {\n const entries = {};\n if (input.RoleArn != null) {\n entries[\"RoleArn\"] = input.RoleArn;\n }\n if (input.RoleSessionName != null) {\n entries[\"RoleSessionName\"] = input.RoleSessionName;\n }\n if (input.WebIdentityToken != null) {\n entries[\"WebIdentityToken\"] = input.WebIdentityToken;\n }\n if (input.ProviderId != null) {\n entries[\"ProviderId\"] = input.ProviderId;\n }\n if (input.PolicyArns != null) {\n const memberEntries = se_policyDescriptorListType(input.PolicyArns, context);\n if (input.PolicyArns?.length === 0) {\n entries.PolicyArns = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `PolicyArns.${key}`;\n entries[loc] = value;\n });\n }\n if (input.Policy != null) {\n entries[\"Policy\"] = input.Policy;\n }\n if (input.DurationSeconds != null) {\n entries[\"DurationSeconds\"] = input.DurationSeconds;\n }\n return entries;\n};\nconst se_DecodeAuthorizationMessageRequest = (input, context) => {\n const entries = {};\n if (input.EncodedMessage != null) {\n entries[\"EncodedMessage\"] = input.EncodedMessage;\n }\n return entries;\n};\nconst se_GetAccessKeyInfoRequest = (input, context) => {\n const entries = {};\n if (input.AccessKeyId != null) {\n entries[\"AccessKeyId\"] = input.AccessKeyId;\n }\n return entries;\n};\nconst se_GetCallerIdentityRequest = (input, context) => {\n const entries = {};\n return entries;\n};\nconst se_GetFederationTokenRequest = (input, context) => {\n const entries = {};\n if (input.Name != null) {\n entries[\"Name\"] = input.Name;\n }\n if (input.Policy != null) {\n entries[\"Policy\"] = input.Policy;\n }\n if (input.PolicyArns != null) {\n const memberEntries = se_policyDescriptorListType(input.PolicyArns, context);\n if (input.PolicyArns?.length === 0) {\n entries.PolicyArns = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `PolicyArns.${key}`;\n entries[loc] = value;\n });\n }\n if (input.DurationSeconds != null) {\n entries[\"DurationSeconds\"] = input.DurationSeconds;\n }\n if (input.Tags != null) {\n const memberEntries = se_tagListType(input.Tags, context);\n if (input.Tags?.length === 0) {\n entries.Tags = [];\n }\n Object.entries(memberEntries).forEach(([key, value]) => {\n const loc = `Tags.${key}`;\n entries[loc] = value;\n });\n }\n return entries;\n};\nconst se_GetSessionTokenRequest = (input, context) => {\n const entries = {};\n if (input.DurationSeconds != null) {\n entries[\"DurationSeconds\"] = input.DurationSeconds;\n }\n if (input.SerialNumber != null) {\n entries[\"SerialNumber\"] = input.SerialNumber;\n }\n if (input.TokenCode != null) {\n entries[\"TokenCode\"] = input.TokenCode;\n }\n return entries;\n};\nconst se_policyDescriptorListType = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_PolicyDescriptorType(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_PolicyDescriptorType = (input, context) => {\n const entries = {};\n if (input.arn != null) {\n entries[\"arn\"] = input.arn;\n }\n return entries;\n};\nconst se_ProvidedContext = (input, context) => {\n const entries = {};\n if (input.ProviderArn != null) {\n entries[\"ProviderArn\"] = input.ProviderArn;\n }\n if (input.ContextAssertion != null) {\n entries[\"ContextAssertion\"] = input.ContextAssertion;\n }\n return entries;\n};\nconst se_ProvidedContextsListType = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_ProvidedContext(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst se_Tag = (input, context) => {\n const entries = {};\n if (input.Key != null) {\n entries[\"Key\"] = input.Key;\n }\n if (input.Value != null) {\n entries[\"Value\"] = input.Value;\n }\n return entries;\n};\nconst se_tagKeyListType = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n entries[`member.${counter}`] = entry;\n counter++;\n }\n return entries;\n};\nconst se_tagListType = (input, context) => {\n const entries = {};\n let counter = 1;\n for (const entry of input) {\n if (entry === null) {\n continue;\n }\n const memberEntries = se_Tag(entry, context);\n Object.entries(memberEntries).forEach(([key, value]) => {\n entries[`member.${counter}.${key}`] = value;\n });\n counter++;\n }\n return entries;\n};\nconst de_AssumedRoleUser = (output, context) => {\n const contents = {};\n if (output[\"AssumedRoleId\"] !== undefined) {\n contents.AssumedRoleId = (0, smithy_client_1.expectString)(output[\"AssumedRoleId\"]);\n }\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n return contents;\n};\nconst de_AssumeRoleResponse = (output, context) => {\n const contents = {};\n if (output[\"Credentials\"] !== undefined) {\n contents.Credentials = de_Credentials(output[\"Credentials\"], context);\n }\n if (output[\"AssumedRoleUser\"] !== undefined) {\n contents.AssumedRoleUser = de_AssumedRoleUser(output[\"AssumedRoleUser\"], context);\n }\n if (output[\"PackedPolicySize\"] !== undefined) {\n contents.PackedPolicySize = (0, smithy_client_1.strictParseInt32)(output[\"PackedPolicySize\"]);\n }\n if (output[\"SourceIdentity\"] !== undefined) {\n contents.SourceIdentity = (0, smithy_client_1.expectString)(output[\"SourceIdentity\"]);\n }\n return contents;\n};\nconst de_AssumeRoleWithSAMLResponse = (output, context) => {\n const contents = {};\n if (output[\"Credentials\"] !== undefined) {\n contents.Credentials = de_Credentials(output[\"Credentials\"], context);\n }\n if (output[\"AssumedRoleUser\"] !== undefined) {\n contents.AssumedRoleUser = de_AssumedRoleUser(output[\"AssumedRoleUser\"], context);\n }\n if (output[\"PackedPolicySize\"] !== undefined) {\n contents.PackedPolicySize = (0, smithy_client_1.strictParseInt32)(output[\"PackedPolicySize\"]);\n }\n if (output[\"Subject\"] !== undefined) {\n contents.Subject = (0, smithy_client_1.expectString)(output[\"Subject\"]);\n }\n if (output[\"SubjectType\"] !== undefined) {\n contents.SubjectType = (0, smithy_client_1.expectString)(output[\"SubjectType\"]);\n }\n if (output[\"Issuer\"] !== undefined) {\n contents.Issuer = (0, smithy_client_1.expectString)(output[\"Issuer\"]);\n }\n if (output[\"Audience\"] !== undefined) {\n contents.Audience = (0, smithy_client_1.expectString)(output[\"Audience\"]);\n }\n if (output[\"NameQualifier\"] !== undefined) {\n contents.NameQualifier = (0, smithy_client_1.expectString)(output[\"NameQualifier\"]);\n }\n if (output[\"SourceIdentity\"] !== undefined) {\n contents.SourceIdentity = (0, smithy_client_1.expectString)(output[\"SourceIdentity\"]);\n }\n return contents;\n};\nconst de_AssumeRoleWithWebIdentityResponse = (output, context) => {\n const contents = {};\n if (output[\"Credentials\"] !== undefined) {\n contents.Credentials = de_Credentials(output[\"Credentials\"], context);\n }\n if (output[\"SubjectFromWebIdentityToken\"] !== undefined) {\n contents.SubjectFromWebIdentityToken = (0, smithy_client_1.expectString)(output[\"SubjectFromWebIdentityToken\"]);\n }\n if (output[\"AssumedRoleUser\"] !== undefined) {\n contents.AssumedRoleUser = de_AssumedRoleUser(output[\"AssumedRoleUser\"], context);\n }\n if (output[\"PackedPolicySize\"] !== undefined) {\n contents.PackedPolicySize = (0, smithy_client_1.strictParseInt32)(output[\"PackedPolicySize\"]);\n }\n if (output[\"Provider\"] !== undefined) {\n contents.Provider = (0, smithy_client_1.expectString)(output[\"Provider\"]);\n }\n if (output[\"Audience\"] !== undefined) {\n contents.Audience = (0, smithy_client_1.expectString)(output[\"Audience\"]);\n }\n if (output[\"SourceIdentity\"] !== undefined) {\n contents.SourceIdentity = (0, smithy_client_1.expectString)(output[\"SourceIdentity\"]);\n }\n return contents;\n};\nconst de_Credentials = (output, context) => {\n const contents = {};\n if (output[\"AccessKeyId\"] !== undefined) {\n contents.AccessKeyId = (0, smithy_client_1.expectString)(output[\"AccessKeyId\"]);\n }\n if (output[\"SecretAccessKey\"] !== undefined) {\n contents.SecretAccessKey = (0, smithy_client_1.expectString)(output[\"SecretAccessKey\"]);\n }\n if (output[\"SessionToken\"] !== undefined) {\n contents.SessionToken = (0, smithy_client_1.expectString)(output[\"SessionToken\"]);\n }\n if (output[\"Expiration\"] !== undefined) {\n contents.Expiration = (0, smithy_client_1.expectNonNull)((0, smithy_client_1.parseRfc3339DateTimeWithOffset)(output[\"Expiration\"]));\n }\n return contents;\n};\nconst de_DecodeAuthorizationMessageResponse = (output, context) => {\n const contents = {};\n if (output[\"DecodedMessage\"] !== undefined) {\n contents.DecodedMessage = (0, smithy_client_1.expectString)(output[\"DecodedMessage\"]);\n }\n return contents;\n};\nconst de_ExpiredTokenException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_FederatedUser = (output, context) => {\n const contents = {};\n if (output[\"FederatedUserId\"] !== undefined) {\n contents.FederatedUserId = (0, smithy_client_1.expectString)(output[\"FederatedUserId\"]);\n }\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n return contents;\n};\nconst de_GetAccessKeyInfoResponse = (output, context) => {\n const contents = {};\n if (output[\"Account\"] !== undefined) {\n contents.Account = (0, smithy_client_1.expectString)(output[\"Account\"]);\n }\n return contents;\n};\nconst de_GetCallerIdentityResponse = (output, context) => {\n const contents = {};\n if (output[\"UserId\"] !== undefined) {\n contents.UserId = (0, smithy_client_1.expectString)(output[\"UserId\"]);\n }\n if (output[\"Account\"] !== undefined) {\n contents.Account = (0, smithy_client_1.expectString)(output[\"Account\"]);\n }\n if (output[\"Arn\"] !== undefined) {\n contents.Arn = (0, smithy_client_1.expectString)(output[\"Arn\"]);\n }\n return contents;\n};\nconst de_GetFederationTokenResponse = (output, context) => {\n const contents = {};\n if (output[\"Credentials\"] !== undefined) {\n contents.Credentials = de_Credentials(output[\"Credentials\"], context);\n }\n if (output[\"FederatedUser\"] !== undefined) {\n contents.FederatedUser = de_FederatedUser(output[\"FederatedUser\"], context);\n }\n if (output[\"PackedPolicySize\"] !== undefined) {\n contents.PackedPolicySize = (0, smithy_client_1.strictParseInt32)(output[\"PackedPolicySize\"]);\n }\n return contents;\n};\nconst de_GetSessionTokenResponse = (output, context) => {\n const contents = {};\n if (output[\"Credentials\"] !== undefined) {\n contents.Credentials = de_Credentials(output[\"Credentials\"], context);\n }\n return contents;\n};\nconst de_IDPCommunicationErrorException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_IDPRejectedClaimException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_InvalidAuthorizationMessageException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_InvalidIdentityTokenException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_MalformedPolicyDocumentException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_PackedPolicyTooLargeException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst de_RegionDisabledException = (output, context) => {\n const contents = {};\n if (output[\"message\"] !== undefined) {\n contents.message = (0, smithy_client_1.expectString)(output[\"message\"]);\n }\n return contents;\n};\nconst deserializeMetadata = (output) => ({\n httpStatusCode: output.statusCode,\n requestId: output.headers[\"x-amzn-requestid\"] ?? output.headers[\"x-amzn-request-id\"] ?? output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n});\nconst collectBodyString = (streamBody, context) => (0, smithy_client_1.collectBody)(streamBody, context).then((body) => context.utf8Encoder(body));\nconst throwDefaultError = (0, smithy_client_1.withBaseException)(STSServiceException_1.STSServiceException);\nconst buildHttpRpcRequest = async (context, headers, path, resolvedHostname, body) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const contents = {\n protocol,\n hostname,\n port,\n method: \"POST\",\n path: basePath.endsWith(\"/\") ? basePath.slice(0, -1) + path : basePath + path,\n headers,\n };\n if (resolvedHostname !== undefined) {\n contents.hostname = resolvedHostname;\n }\n if (body !== undefined) {\n contents.body = body;\n }\n return new protocol_http_1.HttpRequest(contents);\n};\nconst SHARED_HEADERS = {\n \"content-type\": \"application/x-www-form-urlencoded\",\n};\nconst parseBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n if (encoded.length) {\n const parser = new fast_xml_parser_1.XMLParser({\n attributeNamePrefix: \"\",\n htmlEntities: true,\n ignoreAttributes: false,\n ignoreDeclaration: true,\n parseTagValue: false,\n trimValues: false,\n tagValueProcessor: (_, val) => (val.trim() === \"\" && val.includes(\"\\n\") ? \"\" : undefined),\n });\n parser.addEntity(\"#xD\", \"\\r\");\n parser.addEntity(\"#10\", \"\\n\");\n const parsedObj = parser.parse(encoded);\n const textNodeName = \"#text\";\n const key = Object.keys(parsedObj)[0];\n const parsedObjToReturn = parsedObj[key];\n if (parsedObjToReturn[textNodeName]) {\n parsedObjToReturn[key] = parsedObjToReturn[textNodeName];\n delete parsedObjToReturn[textNodeName];\n }\n return (0, smithy_client_1.getValueFromTextNode)(parsedObjToReturn);\n }\n return {};\n});\nconst parseErrorBody = async (errorBody, context) => {\n const value = await parseBody(errorBody, context);\n if (value.Error) {\n value.Error.message = value.Error.message ?? value.Error.Message;\n }\n return value;\n};\nconst buildFormUrlencodedString = (formEntries) => Object.entries(formEntries)\n .map(([key, value]) => (0, smithy_client_1.extendedEncodeURIComponent)(key) + \"=\" + (0, smithy_client_1.extendedEncodeURIComponent)(value))\n .join(\"&\");\nconst loadQueryErrorCode = (output, data) => {\n if (data.Error?.Code !== undefined) {\n return data.Error.Code;\n }\n if (output.statusCode == 404) {\n return \"NotFound\";\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst tslib_1 = require(\"tslib\");\nconst package_json_1 = tslib_1.__importDefault(require(\"../package.json\"));\nconst defaultStsRoleAssumers_1 = require(\"./defaultStsRoleAssumers\");\nconst core_1 = require(\"@aws-sdk/core\");\nconst credential_provider_node_1 = require(\"@aws-sdk/credential-provider-node\");\nconst util_user_agent_node_1 = require(\"@aws-sdk/util-user-agent-node\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst hash_node_1 = require(\"@smithy/hash-node\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_body_length_node_1 = require(\"@smithy/util-body-length-node\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst runtimeConfig_shared_1 = require(\"./runtimeConfig.shared\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst util_defaults_mode_node_1 = require(\"@smithy/util-defaults-mode-node\");\nconst smithy_client_2 = require(\"@smithy/smithy-client\");\nconst getRuntimeConfig = (config) => {\n (0, smithy_client_2.emitWarningIfUnsupportedVersion)(process.version);\n const defaultsMode = (0, util_defaults_mode_node_1.resolveDefaultsModeConfig)(config);\n const defaultConfigProvider = () => defaultsMode().then(smithy_client_1.loadConfigsForDefaultMode);\n const clientSharedValues = (0, runtimeConfig_shared_1.getRuntimeConfig)(config);\n (0, core_1.emitWarningIfUnsupportedVersion)(process.version);\n return {\n ...clientSharedValues,\n ...config,\n runtime: \"node\",\n defaultsMode,\n bodyLengthChecker: config?.bodyLengthChecker ?? util_body_length_node_1.calculateBodyLength,\n credentialDefaultProvider: config?.credentialDefaultProvider ?? (0, defaultStsRoleAssumers_1.decorateDefaultCredentialProvider)(credential_provider_node_1.defaultProvider),\n defaultUserAgentProvider: config?.defaultUserAgentProvider ??\n (0, util_user_agent_node_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_json_1.default.version }),\n maxAttempts: config?.maxAttempts ?? (0, node_config_provider_1.loadConfig)(middleware_retry_1.NODE_MAX_ATTEMPT_CONFIG_OPTIONS),\n region: config?.region ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS, config_resolver_1.NODE_REGION_CONFIG_FILE_OPTIONS),\n requestHandler: config?.requestHandler ?? new node_http_handler_1.NodeHttpHandler(defaultConfigProvider),\n retryMode: config?.retryMode ??\n (0, node_config_provider_1.loadConfig)({\n ...middleware_retry_1.NODE_RETRY_MODE_CONFIG_OPTIONS,\n default: async () => (await defaultConfigProvider()).retryMode || util_retry_1.DEFAULT_RETRY_MODE,\n }),\n sha256: config?.sha256 ?? hash_node_1.Hash.bind(null, \"sha256\"),\n streamCollector: config?.streamCollector ?? node_http_handler_1.streamCollector,\n useDualstackEndpoint: config?.useDualstackEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS),\n useFipsEndpoint: config?.useFipsEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS),\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRuntimeConfig = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst endpointResolver_1 = require(\"./endpoint/endpointResolver\");\nconst getRuntimeConfig = (config) => {\n return {\n apiVersion: \"2011-06-15\",\n base64Decoder: config?.base64Decoder ?? util_base64_1.fromBase64,\n base64Encoder: config?.base64Encoder ?? util_base64_1.toBase64,\n disableHostPrefix: config?.disableHostPrefix ?? false,\n endpointProvider: config?.endpointProvider ?? endpointResolver_1.defaultEndpointResolver,\n extensions: config?.extensions ?? [],\n logger: config?.logger ?? new smithy_client_1.NoOpLogger(),\n serviceId: config?.serviceId ?? \"STS\",\n urlParser: config?.urlParser ?? url_parser_1.parseUrl,\n utf8Decoder: config?.utf8Decoder ?? util_utf8_1.fromUtf8,\n utf8Encoder: config?.utf8Encoder ?? util_utf8_1.toUtf8,\n };\n};\nexports.getRuntimeConfig = getRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRuntimeExtensions = void 0;\nconst region_config_resolver_1 = require(\"@aws-sdk/region-config-resolver\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst asPartial = (t) => t;\nconst resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n const extensionConfiguration = {\n ...asPartial((0, region_config_resolver_1.getAwsRegionExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, smithy_client_1.getDefaultExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, protocol_http_1.getHttpHandlerExtensionConfiguration)(runtimeConfig)),\n };\n extensions.forEach((extension) => extension.configure(extensionConfiguration));\n return {\n ...runtimeConfig,\n ...(0, region_config_resolver_1.resolveAwsRegionExtensionConfiguration)(extensionConfiguration),\n ...(0, smithy_client_1.resolveDefaultRuntimeConfig)(extensionConfiguration),\n ...(0, protocol_http_1.resolveHttpHandlerRuntimeConfig)(extensionConfiguration),\n };\n};\nexports.resolveRuntimeExtensions = resolveRuntimeExtensions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.emitWarningIfUnsupportedVersion = void 0;\nlet warningEmitted = false;\nconst emitWarningIfUnsupportedVersion = (version) => {\n if (version && !warningEmitted && parseInt(version.substring(1, version.indexOf(\".\"))) < 16) {\n warningEmitted = true;\n process.emitWarning(`NodeDeprecationWarning: The AWS SDK for JavaScript (v3) will\nno longer support Node.js 14.x on May 1, 2024.\n\nTo continue receiving updates to AWS services, bug fixes, and security\nupdates please upgrade to an active Node.js LTS version.\n\nMore information can be found at: https://a.co/dzr2AJd`);\n }\n};\nexports.emitWarningIfUnsupportedVersion = emitWarningIfUnsupportedVersion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./emitWarningIfUnsupportedVersion\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./client/index\"), exports);\ntslib_1.__exportStar(require(\"./protocols/index\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports._toNum = exports._toBool = exports._toStr = void 0;\nconst _toStr = (val) => {\n if (val == null) {\n return val;\n }\n if (typeof val === \"number\" || typeof val === \"bigint\") {\n const warning = new Error(`Received number ${val} where a string was expected.`);\n warning.name = \"Warning\";\n console.warn(warning);\n return String(val);\n }\n if (typeof val === \"boolean\") {\n const warning = new Error(`Received boolean ${val} where a string was expected.`);\n warning.name = \"Warning\";\n console.warn(warning);\n return String(val);\n }\n return val;\n};\nexports._toStr = _toStr;\nconst _toBool = (val) => {\n if (val == null) {\n return val;\n }\n if (typeof val === \"number\") {\n }\n if (typeof val === \"string\") {\n const lowercase = val.toLowerCase();\n if (val !== \"\" && lowercase !== \"false\" && lowercase !== \"true\") {\n const warning = new Error(`Received string \"${val}\" where a boolean was expected.`);\n warning.name = \"Warning\";\n console.warn(warning);\n }\n return val !== \"\" && lowercase !== \"false\";\n }\n return val;\n};\nexports._toBool = _toBool;\nconst _toNum = (val) => {\n if (val == null) {\n return val;\n }\n if (typeof val === \"boolean\") {\n }\n if (typeof val === \"string\") {\n const num = Number(val);\n if (num.toString() !== val) {\n const warning = new Error(`Received string \"${val}\" where a number was expected.`);\n warning.name = \"Warning\";\n console.warn(warning);\n return val;\n }\n return num;\n }\n return val;\n};\nexports._toNum = _toNum;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./coercing-serializers\"), exports);\ntslib_1.__exportStar(require(\"./json/awsExpectUnion\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.awsExpectUnion = void 0;\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst awsExpectUnion = (value) => {\n if (value == null) {\n return undefined;\n }\n if (typeof value === \"object\" && \"__type\" in value) {\n delete value.__type;\n }\n return (0, smithy_client_1.expectUnion)(value);\n};\nexports.awsExpectUnion = awsExpectUnion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InMemoryStorage = void 0;\nclass InMemoryStorage {\n constructor(store = {}) {\n this.store = store;\n }\n getItem(key) {\n if (key in this.store) {\n return this.store[key];\n }\n return null;\n }\n removeItem(key) {\n delete this.store[key];\n }\n setItem(key, value) {\n this.store[key] = value;\n }\n}\nexports.InMemoryStorage = InMemoryStorage;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IndexedDbStorage = void 0;\nconst STORE_NAME = \"IdentityIds\";\nclass IndexedDbStorage {\n constructor(dbName = \"aws:cognito-identity-ids\") {\n this.dbName = dbName;\n }\n getItem(key) {\n return this.withObjectStore(\"readonly\", (store) => {\n const req = store.get(key);\n return new Promise((resolve) => {\n req.onerror = () => resolve(null);\n req.onsuccess = () => resolve(req.result ? req.result.value : null);\n });\n }).catch(() => null);\n }\n removeItem(key) {\n return this.withObjectStore(\"readwrite\", (store) => {\n const req = store.delete(key);\n return new Promise((resolve, reject) => {\n req.onerror = () => reject(req.error);\n req.onsuccess = () => resolve();\n });\n });\n }\n setItem(id, value) {\n return this.withObjectStore(\"readwrite\", (store) => {\n const req = store.put({ id, value });\n return new Promise((resolve, reject) => {\n req.onerror = () => reject(req.error);\n req.onsuccess = () => resolve();\n });\n });\n }\n getDb() {\n const openDbRequest = self.indexedDB.open(this.dbName, 1);\n return new Promise((resolve, reject) => {\n openDbRequest.onsuccess = () => {\n resolve(openDbRequest.result);\n };\n openDbRequest.onerror = () => {\n reject(openDbRequest.error);\n };\n openDbRequest.onblocked = () => {\n reject(new Error(\"Unable to access DB\"));\n };\n openDbRequest.onupgradeneeded = () => {\n const db = openDbRequest.result;\n db.onerror = () => {\n reject(new Error(\"Failed to create object store\"));\n };\n db.createObjectStore(STORE_NAME, { keyPath: \"id\" });\n };\n });\n }\n withObjectStore(mode, action) {\n return this.getDb().then((db) => {\n const tx = db.transaction(STORE_NAME, mode);\n tx.oncomplete = () => db.close();\n return new Promise((resolve, reject) => {\n tx.onerror = () => reject(tx.error);\n resolve(action(tx.objectStore(STORE_NAME)));\n }).catch((err) => {\n db.close();\n throw err;\n });\n });\n }\n}\nexports.IndexedDbStorage = IndexedDbStorage;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromCognitoIdentity = void 0;\nconst client_cognito_identity_1 = require(\"@aws-sdk/client-cognito-identity\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst resolveLogins_1 = require(\"./resolveLogins\");\nfunction fromCognitoIdentity(parameters) {\n return async () => {\n const { Credentials: { AccessKeyId = throwOnMissingAccessKeyId(), Expiration, SecretKey = throwOnMissingSecretKey(), SessionToken, } = throwOnMissingCredentials(), } = await parameters.client.send(new client_cognito_identity_1.GetCredentialsForIdentityCommand({\n CustomRoleArn: parameters.customRoleArn,\n IdentityId: parameters.identityId,\n Logins: parameters.logins ? await (0, resolveLogins_1.resolveLogins)(parameters.logins) : undefined,\n }));\n return {\n identityId: parameters.identityId,\n accessKeyId: AccessKeyId,\n secretAccessKey: SecretKey,\n sessionToken: SessionToken,\n expiration: Expiration,\n };\n };\n}\nexports.fromCognitoIdentity = fromCognitoIdentity;\nfunction throwOnMissingAccessKeyId() {\n throw new property_provider_1.CredentialsProviderError(\"Response from Amazon Cognito contained no access key ID\");\n}\nfunction throwOnMissingCredentials() {\n throw new property_provider_1.CredentialsProviderError(\"Response from Amazon Cognito contained no credentials\");\n}\nfunction throwOnMissingSecretKey() {\n throw new property_provider_1.CredentialsProviderError(\"Response from Amazon Cognito contained no secret key\");\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromCognitoIdentityPool = void 0;\nconst client_cognito_identity_1 = require(\"@aws-sdk/client-cognito-identity\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromCognitoIdentity_1 = require(\"./fromCognitoIdentity\");\nconst localStorage_1 = require(\"./localStorage\");\nconst resolveLogins_1 = require(\"./resolveLogins\");\nfunction fromCognitoIdentityPool({ accountId, cache = (0, localStorage_1.localStorage)(), client, customRoleArn, identityPoolId, logins, userIdentifier = !logins || Object.keys(logins).length === 0 ? \"ANONYMOUS\" : undefined, }) {\n const cacheKey = userIdentifier ? `aws:cognito-identity-credentials:${identityPoolId}:${userIdentifier}` : undefined;\n let provider = async () => {\n let identityId = cacheKey && (await cache.getItem(cacheKey));\n if (!identityId) {\n const { IdentityId = throwOnMissingId() } = await client.send(new client_cognito_identity_1.GetIdCommand({\n AccountId: accountId,\n IdentityPoolId: identityPoolId,\n Logins: logins ? await (0, resolveLogins_1.resolveLogins)(logins) : undefined,\n }));\n identityId = IdentityId;\n if (cacheKey) {\n Promise.resolve(cache.setItem(cacheKey, identityId)).catch(() => { });\n }\n }\n provider = (0, fromCognitoIdentity_1.fromCognitoIdentity)({\n client,\n customRoleArn,\n logins,\n identityId,\n });\n return provider();\n };\n return () => provider().catch(async (err) => {\n if (cacheKey) {\n Promise.resolve(cache.removeItem(cacheKey)).catch(() => { });\n }\n throw err;\n });\n}\nexports.fromCognitoIdentityPool = fromCognitoIdentityPool;\nfunction throwOnMissingId() {\n throw new property_provider_1.CredentialsProviderError(\"Response from Amazon Cognito contained no identity ID\");\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./CognitoProviderParameters\"), exports);\ntslib_1.__exportStar(require(\"./Logins\"), exports);\ntslib_1.__exportStar(require(\"./Storage\"), exports);\ntslib_1.__exportStar(require(\"./fromCognitoIdentity\"), exports);\ntslib_1.__exportStar(require(\"./fromCognitoIdentityPool\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.localStorage = void 0;\nconst IndexedDbStorage_1 = require(\"./IndexedDbStorage\");\nconst InMemoryStorage_1 = require(\"./InMemoryStorage\");\nconst inMemoryStorage = new InMemoryStorage_1.InMemoryStorage();\nfunction localStorage() {\n if (typeof self === \"object\" && self.indexedDB) {\n return new IndexedDbStorage_1.IndexedDbStorage();\n }\n if (typeof window === \"object\" && window.localStorage) {\n return window.localStorage;\n }\n return inMemoryStorage;\n}\nexports.localStorage = localStorage;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveLogins = void 0;\nfunction resolveLogins(logins) {\n return Promise.all(Object.keys(logins).reduce((arr, name) => {\n const tokenOrProvider = logins[name];\n if (typeof tokenOrProvider === \"string\") {\n arr.push([name, tokenOrProvider]);\n }\n else {\n arr.push(tokenOrProvider().then((token) => [name, token]));\n }\n return arr;\n }, [])).then((resolvedPairs) => resolvedPairs.reduce((logins, [key, value]) => {\n logins[key] = value;\n return logins;\n }, {}));\n}\nexports.resolveLogins = resolveLogins;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromEnv = exports.ENV_EXPIRATION = exports.ENV_SESSION = exports.ENV_SECRET = exports.ENV_KEY = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nexports.ENV_KEY = \"AWS_ACCESS_KEY_ID\";\nexports.ENV_SECRET = \"AWS_SECRET_ACCESS_KEY\";\nexports.ENV_SESSION = \"AWS_SESSION_TOKEN\";\nexports.ENV_EXPIRATION = \"AWS_CREDENTIAL_EXPIRATION\";\nconst fromEnv = () => async () => {\n const accessKeyId = process.env[exports.ENV_KEY];\n const secretAccessKey = process.env[exports.ENV_SECRET];\n const sessionToken = process.env[exports.ENV_SESSION];\n const expiry = process.env[exports.ENV_EXPIRATION];\n if (accessKeyId && secretAccessKey) {\n return {\n accessKeyId,\n secretAccessKey,\n ...(sessionToken && { sessionToken }),\n ...(expiry && { expiration: new Date(expiry) }),\n };\n }\n throw new property_provider_1.CredentialsProviderError(\"Unable to find environment variable credentials.\");\n};\nexports.fromEnv = fromEnv;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromEnv\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.checkUrl = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst LOOPBACK_CIDR_IPv4 = \"127.0.0.0/8\";\nconst LOOPBACK_CIDR_IPv6 = \"::1/128\";\nconst ECS_CONTAINER_HOST = \"169.254.170.2\";\nconst EKS_CONTAINER_HOST_IPv4 = \"169.254.170.23\";\nconst EKS_CONTAINER_HOST_IPv6 = \"[fd00:ec2::23]\";\nconst checkUrl = (url) => {\n if (url.protocol === \"https:\") {\n return;\n }\n if (url.hostname === ECS_CONTAINER_HOST ||\n url.hostname === EKS_CONTAINER_HOST_IPv4 ||\n url.hostname === EKS_CONTAINER_HOST_IPv6) {\n return;\n }\n if (url.hostname.includes(\"[\")) {\n if (url.hostname === \"[::1]\" || url.hostname === \"[0000:0000:0000:0000:0000:0000:0000:0001]\") {\n return;\n }\n }\n else {\n if (url.hostname === \"localhost\") {\n return;\n }\n const ipComponents = url.hostname.split(\".\");\n const inRange = (component) => {\n const num = parseInt(component, 10);\n return 0 <= num && num <= 255;\n };\n if (ipComponents[0] === \"127\" &&\n inRange(ipComponents[1]) &&\n inRange(ipComponents[2]) &&\n inRange(ipComponents[3]) &&\n ipComponents.length === 4) {\n return;\n }\n }\n throw new property_provider_1.CredentialsProviderError(`URL not accepted. It must either be HTTPS or match one of the following:\n - loopback CIDR 127.0.0.0/8 or [::1/128]\n - ECS container host 169.254.170.2\n - EKS container host 169.254.170.23 or [fd00:ec2::23]`);\n};\nexports.checkUrl = checkUrl;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromHttp = void 0;\nconst tslib_1 = require(\"tslib\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst promises_1 = tslib_1.__importDefault(require(\"fs/promises\"));\nconst checkUrl_1 = require(\"./checkUrl\");\nconst requestHelpers_1 = require(\"./requestHelpers\");\nconst retry_wrapper_1 = require(\"./retry-wrapper\");\nconst AWS_CONTAINER_CREDENTIALS_RELATIVE_URI = \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\";\nconst DEFAULT_LINK_LOCAL_HOST = \"http://169.254.170.2\";\nconst AWS_CONTAINER_CREDENTIALS_FULL_URI = \"AWS_CONTAINER_CREDENTIALS_FULL_URI\";\nconst AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE = \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\";\nconst AWS_CONTAINER_AUTHORIZATION_TOKEN = \"AWS_CONTAINER_AUTHORIZATION_TOKEN\";\nconst fromHttp = (options) => {\n var _a, _b, _c, _d, _e, _f;\n let host;\n const relative = (_a = options.awsContainerCredentialsRelativeUri) !== null && _a !== void 0 ? _a : process.env[AWS_CONTAINER_CREDENTIALS_RELATIVE_URI];\n const full = (_b = options.awsContainerCredentialsFullUri) !== null && _b !== void 0 ? _b : process.env[AWS_CONTAINER_CREDENTIALS_FULL_URI];\n const token = (_c = options.awsContainerAuthorizationToken) !== null && _c !== void 0 ? _c : process.env[AWS_CONTAINER_AUTHORIZATION_TOKEN];\n const tokenFile = (_d = options.awsContainerAuthorizationTokenFile) !== null && _d !== void 0 ? _d : process.env[AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE];\n if (relative && full) {\n console.warn(\"AWS SDK HTTP credentials provider:\", \"you have set both awsContainerCredentialsRelativeUri and awsContainerCredentialsFullUri.\");\n console.warn(\"awsContainerCredentialsFullUri will take precedence.\");\n }\n if (token && tokenFile) {\n console.warn(\"AWS SDK HTTP credentials provider:\", \"you have set both awsContainerAuthorizationToken and awsContainerAuthorizationTokenFile.\");\n console.warn(\"awsContainerAuthorizationToken will take precedence.\");\n }\n if (full) {\n host = full;\n }\n else if (relative) {\n host = `${DEFAULT_LINK_LOCAL_HOST}${relative}`;\n }\n else {\n throw new property_provider_1.CredentialsProviderError(\"No HTTP credential provider host provided.\");\n }\n const url = new URL(host);\n (0, checkUrl_1.checkUrl)(url);\n const requestHandler = new node_http_handler_1.NodeHttpHandler();\n return (0, retry_wrapper_1.retryWrapper)(async () => {\n const request = (0, requestHelpers_1.createGetRequest)(url);\n if (token) {\n request.headers.Authorization = token;\n }\n else if (tokenFile) {\n request.headers.Authorization = (await promises_1.default.readFile(tokenFile)).toString();\n }\n const result = await requestHandler.handle(request);\n return (0, requestHelpers_1.getCredentials)(result.response);\n }, (_e = options.maxRetries) !== null && _e !== void 0 ? _e : 3, (_f = options.timeout) !== null && _f !== void 0 ? _f : 1000);\n};\nexports.fromHttp = fromHttp;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getCredentials = exports.createGetRequest = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nconst util_stream_1 = require(\"@smithy/util-stream\");\nfunction createGetRequest(url) {\n return new protocol_http_1.HttpRequest({\n protocol: url.protocol,\n hostname: url.hostname,\n port: Number(url.port),\n path: url.pathname,\n query: Array.from(url.searchParams.entries()).reduce((acc, [k, v]) => {\n acc[k] = v;\n return acc;\n }, {}),\n fragment: url.hash,\n });\n}\nexports.createGetRequest = createGetRequest;\nasync function getCredentials(response) {\n var _a, _b;\n const contentType = (_b = (_a = response === null || response === void 0 ? void 0 : response.headers[\"content-type\"]) !== null && _a !== void 0 ? _a : response === null || response === void 0 ? void 0 : response.headers[\"Content-Type\"]) !== null && _b !== void 0 ? _b : \"\";\n if (!contentType.includes(\"json\")) {\n console.warn(\"HTTP credential provider response header content-type was not application/json. Observed: \" + contentType + \".\");\n }\n const stream = (0, util_stream_1.sdkStreamMixin)(response.body);\n const str = await stream.transformToString();\n if (response.statusCode === 200) {\n const parsed = JSON.parse(str);\n if (typeof parsed.AccessKeyId !== \"string\" ||\n typeof parsed.SecretAccessKey !== \"string\" ||\n typeof parsed.Token !== \"string\" ||\n typeof parsed.Expiration !== \"string\") {\n throw new property_provider_1.CredentialsProviderError(\"HTTP credential provider response not of the required format, an object matching: \" +\n \"{ AccessKeyId: string, SecretAccessKey: string, Token: string, Expiration: string(rfc3339) }\");\n }\n return {\n accessKeyId: parsed.AccessKeyId,\n secretAccessKey: parsed.SecretAccessKey,\n sessionToken: parsed.Token,\n expiration: (0, smithy_client_1.parseRfc3339DateTime)(parsed.Expiration),\n };\n }\n if (response.statusCode >= 400 && response.statusCode < 500) {\n let parsedBody = {};\n try {\n parsedBody = JSON.parse(str);\n }\n catch (e) { }\n throw Object.assign(new property_provider_1.CredentialsProviderError(`Server responded with status: ${response.statusCode}`), {\n Code: parsedBody.Code,\n Message: parsedBody.Message,\n });\n }\n throw new property_provider_1.CredentialsProviderError(`Server responded with status: ${response.statusCode}`);\n}\nexports.getCredentials = getCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.retryWrapper = void 0;\nconst retryWrapper = (toRetry, maxRetries, delayMs) => {\n return async () => {\n for (let i = 0; i < maxRetries; ++i) {\n try {\n return await toRetry();\n }\n catch (e) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n return await toRetry();\n };\n};\nexports.retryWrapper = retryWrapper;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromHttp = void 0;\nvar fromHttp_1 = require(\"./fromHttp/fromHttp\");\nObject.defineProperty(exports, \"fromHttp\", { enumerable: true, get: function () { return fromHttp_1.fromHttp; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromIni = void 0;\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst resolveProfileData_1 = require(\"./resolveProfileData\");\nconst fromIni = (init = {}) => async () => {\n const profiles = await (0, shared_ini_file_loader_1.parseKnownFiles)(init);\n return (0, resolveProfileData_1.resolveProfileData)((0, shared_ini_file_loader_1.getProfileName)(init), profiles, init);\n};\nexports.fromIni = fromIni;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromIni\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveAssumeRoleCredentials = exports.isAssumeRoleProfile = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst resolveCredentialSource_1 = require(\"./resolveCredentialSource\");\nconst resolveProfileData_1 = require(\"./resolveProfileData\");\nconst isAssumeRoleProfile = (arg) => Boolean(arg) &&\n typeof arg === \"object\" &&\n typeof arg.role_arn === \"string\" &&\n [\"undefined\", \"string\"].indexOf(typeof arg.role_session_name) > -1 &&\n [\"undefined\", \"string\"].indexOf(typeof arg.external_id) > -1 &&\n [\"undefined\", \"string\"].indexOf(typeof arg.mfa_serial) > -1 &&\n (isAssumeRoleWithSourceProfile(arg) || isAssumeRoleWithProviderProfile(arg));\nexports.isAssumeRoleProfile = isAssumeRoleProfile;\nconst isAssumeRoleWithSourceProfile = (arg) => typeof arg.source_profile === \"string\" && typeof arg.credential_source === \"undefined\";\nconst isAssumeRoleWithProviderProfile = (arg) => typeof arg.credential_source === \"string\" && typeof arg.source_profile === \"undefined\";\nconst resolveAssumeRoleCredentials = async (profileName, profiles, options, visitedProfiles = {}) => {\n const data = profiles[profileName];\n if (!options.roleAssumer) {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} requires a role to be assumed, but no role assumption callback was provided.`, false);\n }\n const { source_profile } = data;\n if (source_profile && source_profile in visitedProfiles) {\n throw new property_provider_1.CredentialsProviderError(`Detected a cycle attempting to resolve credentials for profile` +\n ` ${(0, shared_ini_file_loader_1.getProfileName)(options)}. Profiles visited: ` +\n Object.keys(visitedProfiles).join(\", \"), false);\n }\n const sourceCredsProvider = source_profile\n ? (0, resolveProfileData_1.resolveProfileData)(source_profile, profiles, options, {\n ...visitedProfiles,\n [source_profile]: true,\n })\n : (0, resolveCredentialSource_1.resolveCredentialSource)(data.credential_source, profileName)();\n const params = {\n RoleArn: data.role_arn,\n RoleSessionName: data.role_session_name || `aws-sdk-js-${Date.now()}`,\n ExternalId: data.external_id,\n DurationSeconds: parseInt(data.duration_seconds || \"3600\", 10),\n };\n const { mfa_serial } = data;\n if (mfa_serial) {\n if (!options.mfaCodeProvider) {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} requires multi-factor authentication, but no MFA code callback was provided.`, false);\n }\n params.SerialNumber = mfa_serial;\n params.TokenCode = await options.mfaCodeProvider(mfa_serial);\n }\n const sourceCreds = await sourceCredsProvider;\n return options.roleAssumer(sourceCreds, params);\n};\nexports.resolveAssumeRoleCredentials = resolveAssumeRoleCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveCredentialSource = void 0;\nconst credential_provider_env_1 = require(\"@aws-sdk/credential-provider-env\");\nconst credential_provider_imds_1 = require(\"@smithy/credential-provider-imds\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst resolveCredentialSource = (credentialSource, profileName) => {\n const sourceProvidersMap = {\n EcsContainer: credential_provider_imds_1.fromContainerMetadata,\n Ec2InstanceMetadata: credential_provider_imds_1.fromInstanceMetadata,\n Environment: credential_provider_env_1.fromEnv,\n };\n if (credentialSource in sourceProvidersMap) {\n return sourceProvidersMap[credentialSource]();\n }\n else {\n throw new property_provider_1.CredentialsProviderError(`Unsupported credential source in profile ${profileName}. Got ${credentialSource}, ` +\n `expected EcsContainer or Ec2InstanceMetadata or Environment.`);\n }\n};\nexports.resolveCredentialSource = resolveCredentialSource;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveProcessCredentials = exports.isProcessProfile = void 0;\nconst credential_provider_process_1 = require(\"@aws-sdk/credential-provider-process\");\nconst isProcessProfile = (arg) => Boolean(arg) && typeof arg === \"object\" && typeof arg.credential_process === \"string\";\nexports.isProcessProfile = isProcessProfile;\nconst resolveProcessCredentials = async (options, profile) => (0, credential_provider_process_1.fromProcess)({\n ...options,\n profile,\n})();\nexports.resolveProcessCredentials = resolveProcessCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveProfileData = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst resolveAssumeRoleCredentials_1 = require(\"./resolveAssumeRoleCredentials\");\nconst resolveProcessCredentials_1 = require(\"./resolveProcessCredentials\");\nconst resolveSsoCredentials_1 = require(\"./resolveSsoCredentials\");\nconst resolveStaticCredentials_1 = require(\"./resolveStaticCredentials\");\nconst resolveWebIdentityCredentials_1 = require(\"./resolveWebIdentityCredentials\");\nconst resolveProfileData = async (profileName, profiles, options, visitedProfiles = {}) => {\n const data = profiles[profileName];\n if (Object.keys(visitedProfiles).length > 0 && (0, resolveStaticCredentials_1.isStaticCredsProfile)(data)) {\n return (0, resolveStaticCredentials_1.resolveStaticCredentials)(data);\n }\n if ((0, resolveAssumeRoleCredentials_1.isAssumeRoleProfile)(data)) {\n return (0, resolveAssumeRoleCredentials_1.resolveAssumeRoleCredentials)(profileName, profiles, options, visitedProfiles);\n }\n if ((0, resolveStaticCredentials_1.isStaticCredsProfile)(data)) {\n return (0, resolveStaticCredentials_1.resolveStaticCredentials)(data);\n }\n if ((0, resolveWebIdentityCredentials_1.isWebIdentityProfile)(data)) {\n return (0, resolveWebIdentityCredentials_1.resolveWebIdentityCredentials)(data, options);\n }\n if ((0, resolveProcessCredentials_1.isProcessProfile)(data)) {\n return (0, resolveProcessCredentials_1.resolveProcessCredentials)(options, profileName);\n }\n if ((0, resolveSsoCredentials_1.isSsoProfile)(data)) {\n return (0, resolveSsoCredentials_1.resolveSsoCredentials)(data);\n }\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} could not be found or parsed in shared credentials file.`);\n};\nexports.resolveProfileData = resolveProfileData;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveSsoCredentials = exports.isSsoProfile = void 0;\nconst credential_provider_sso_1 = require(\"@aws-sdk/credential-provider-sso\");\nvar credential_provider_sso_2 = require(\"@aws-sdk/credential-provider-sso\");\nObject.defineProperty(exports, \"isSsoProfile\", { enumerable: true, get: function () { return credential_provider_sso_2.isSsoProfile; } });\nconst resolveSsoCredentials = (data) => {\n const { sso_start_url, sso_account_id, sso_session, sso_region, sso_role_name } = (0, credential_provider_sso_1.validateSsoProfile)(data);\n return (0, credential_provider_sso_1.fromSSO)({\n ssoStartUrl: sso_start_url,\n ssoAccountId: sso_account_id,\n ssoSession: sso_session,\n ssoRegion: sso_region,\n ssoRoleName: sso_role_name,\n })();\n};\nexports.resolveSsoCredentials = resolveSsoCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveStaticCredentials = exports.isStaticCredsProfile = void 0;\nconst isStaticCredsProfile = (arg) => Boolean(arg) &&\n typeof arg === \"object\" &&\n typeof arg.aws_access_key_id === \"string\" &&\n typeof arg.aws_secret_access_key === \"string\" &&\n [\"undefined\", \"string\"].indexOf(typeof arg.aws_session_token) > -1;\nexports.isStaticCredsProfile = isStaticCredsProfile;\nconst resolveStaticCredentials = (profile) => Promise.resolve({\n accessKeyId: profile.aws_access_key_id,\n secretAccessKey: profile.aws_secret_access_key,\n sessionToken: profile.aws_session_token,\n});\nexports.resolveStaticCredentials = resolveStaticCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveWebIdentityCredentials = exports.isWebIdentityProfile = void 0;\nconst credential_provider_web_identity_1 = require(\"@aws-sdk/credential-provider-web-identity\");\nconst isWebIdentityProfile = (arg) => Boolean(arg) &&\n typeof arg === \"object\" &&\n typeof arg.web_identity_token_file === \"string\" &&\n typeof arg.role_arn === \"string\" &&\n [\"undefined\", \"string\"].indexOf(typeof arg.role_session_name) > -1;\nexports.isWebIdentityProfile = isWebIdentityProfile;\nconst resolveWebIdentityCredentials = async (profile, options) => (0, credential_provider_web_identity_1.fromTokenFile)({\n webIdentityTokenFile: profile.web_identity_token_file,\n roleArn: profile.role_arn,\n roleSessionName: profile.role_session_name,\n roleAssumerWithWebIdentity: options.roleAssumerWithWebIdentity,\n})();\nexports.resolveWebIdentityCredentials = resolveWebIdentityCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultProvider = void 0;\nconst credential_provider_env_1 = require(\"@aws-sdk/credential-provider-env\");\nconst credential_provider_ini_1 = require(\"@aws-sdk/credential-provider-ini\");\nconst credential_provider_process_1 = require(\"@aws-sdk/credential-provider-process\");\nconst credential_provider_sso_1 = require(\"@aws-sdk/credential-provider-sso\");\nconst credential_provider_web_identity_1 = require(\"@aws-sdk/credential-provider-web-identity\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst remoteProvider_1 = require(\"./remoteProvider\");\nconst defaultProvider = (init = {}) => (0, property_provider_1.memoize)((0, property_provider_1.chain)(...(init.profile || process.env[shared_ini_file_loader_1.ENV_PROFILE] ? [] : [(0, credential_provider_env_1.fromEnv)()]), (0, credential_provider_sso_1.fromSSO)(init), (0, credential_provider_ini_1.fromIni)(init), (0, credential_provider_process_1.fromProcess)(init), (0, credential_provider_web_identity_1.fromTokenFile)(init), (0, remoteProvider_1.remoteProvider)(init), async () => {\n throw new property_provider_1.CredentialsProviderError(\"Could not load credentials from any providers\", false);\n}), (credentials) => credentials.expiration !== undefined && credentials.expiration.getTime() - Date.now() < 300000, (credentials) => credentials.expiration !== undefined);\nexports.defaultProvider = defaultProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./defaultProvider\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.remoteProvider = exports.ENV_IMDS_DISABLED = void 0;\nconst credential_provider_imds_1 = require(\"@smithy/credential-provider-imds\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nexports.ENV_IMDS_DISABLED = \"AWS_EC2_METADATA_DISABLED\";\nconst remoteProvider = (init) => {\n if (process.env[credential_provider_imds_1.ENV_CMDS_RELATIVE_URI] || process.env[credential_provider_imds_1.ENV_CMDS_FULL_URI]) {\n return (0, credential_provider_imds_1.fromContainerMetadata)(init);\n }\n if (process.env[exports.ENV_IMDS_DISABLED]) {\n return async () => {\n throw new property_provider_1.CredentialsProviderError(\"EC2 Instance Metadata Service access disabled\");\n };\n }\n return (0, credential_provider_imds_1.fromInstanceMetadata)(init);\n};\nexports.remoteProvider = remoteProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromProcess = void 0;\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst resolveProcessCredentials_1 = require(\"./resolveProcessCredentials\");\nconst fromProcess = (init = {}) => async () => {\n const profiles = await (0, shared_ini_file_loader_1.parseKnownFiles)(init);\n return (0, resolveProcessCredentials_1.resolveProcessCredentials)((0, shared_ini_file_loader_1.getProfileName)(init), profiles);\n};\nexports.fromProcess = fromProcess;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getValidatedProcessCredentials = void 0;\nconst getValidatedProcessCredentials = (profileName, data) => {\n if (data.Version !== 1) {\n throw Error(`Profile ${profileName} credential_process did not return Version 1.`);\n }\n if (data.AccessKeyId === undefined || data.SecretAccessKey === undefined) {\n throw Error(`Profile ${profileName} credential_process returned invalid credentials.`);\n }\n if (data.Expiration) {\n const currentTime = new Date();\n const expireTime = new Date(data.Expiration);\n if (expireTime < currentTime) {\n throw Error(`Profile ${profileName} credential_process returned expired credentials.`);\n }\n }\n return {\n accessKeyId: data.AccessKeyId,\n secretAccessKey: data.SecretAccessKey,\n ...(data.SessionToken && { sessionToken: data.SessionToken }),\n ...(data.Expiration && { expiration: new Date(data.Expiration) }),\n };\n};\nexports.getValidatedProcessCredentials = getValidatedProcessCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromProcess\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveProcessCredentials = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst child_process_1 = require(\"child_process\");\nconst util_1 = require(\"util\");\nconst getValidatedProcessCredentials_1 = require(\"./getValidatedProcessCredentials\");\nconst resolveProcessCredentials = async (profileName, profiles) => {\n const profile = profiles[profileName];\n if (profiles[profileName]) {\n const credentialProcess = profile[\"credential_process\"];\n if (credentialProcess !== undefined) {\n const execPromise = (0, util_1.promisify)(child_process_1.exec);\n try {\n const { stdout } = await execPromise(credentialProcess);\n let data;\n try {\n data = JSON.parse(stdout.trim());\n }\n catch (_a) {\n throw Error(`Profile ${profileName} credential_process returned invalid JSON.`);\n }\n return (0, getValidatedProcessCredentials_1.getValidatedProcessCredentials)(profileName, data);\n }\n catch (error) {\n throw new property_provider_1.CredentialsProviderError(error.message);\n }\n }\n else {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} did not contain credential_process.`);\n }\n }\n else {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} could not be found in shared credentials file.`);\n }\n};\nexports.resolveProcessCredentials = resolveProcessCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromSSO = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst isSsoProfile_1 = require(\"./isSsoProfile\");\nconst resolveSSOCredentials_1 = require(\"./resolveSSOCredentials\");\nconst validateSsoProfile_1 = require(\"./validateSsoProfile\");\nconst fromSSO = (init = {}) => async () => {\n const { ssoStartUrl, ssoAccountId, ssoRegion, ssoRoleName, ssoClient, ssoSession } = init;\n const profileName = (0, shared_ini_file_loader_1.getProfileName)(init);\n if (!ssoStartUrl && !ssoAccountId && !ssoRegion && !ssoRoleName && !ssoSession) {\n const profiles = await (0, shared_ini_file_loader_1.parseKnownFiles)(init);\n const profile = profiles[profileName];\n if (!profile) {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} was not found.`);\n }\n if (!(0, isSsoProfile_1.isSsoProfile)(profile)) {\n throw new property_provider_1.CredentialsProviderError(`Profile ${profileName} is not configured with SSO credentials.`);\n }\n if (profile === null || profile === void 0 ? void 0 : profile.sso_session) {\n const ssoSessions = await (0, shared_ini_file_loader_1.loadSsoSessionData)(init);\n const session = ssoSessions[profile.sso_session];\n const conflictMsg = ` configurations in profile ${profileName} and sso-session ${profile.sso_session}`;\n if (ssoRegion && ssoRegion !== session.sso_region) {\n throw new property_provider_1.CredentialsProviderError(`Conflicting SSO region` + conflictMsg, false);\n }\n if (ssoStartUrl && ssoStartUrl !== session.sso_start_url) {\n throw new property_provider_1.CredentialsProviderError(`Conflicting SSO start_url` + conflictMsg, false);\n }\n profile.sso_region = session.sso_region;\n profile.sso_start_url = session.sso_start_url;\n }\n const { sso_start_url, sso_account_id, sso_region, sso_role_name, sso_session } = (0, validateSsoProfile_1.validateSsoProfile)(profile);\n return (0, resolveSSOCredentials_1.resolveSSOCredentials)({\n ssoStartUrl: sso_start_url,\n ssoSession: sso_session,\n ssoAccountId: sso_account_id,\n ssoRegion: sso_region,\n ssoRoleName: sso_role_name,\n ssoClient: ssoClient,\n profile: profileName,\n });\n }\n else if (!ssoStartUrl || !ssoAccountId || !ssoRegion || !ssoRoleName) {\n throw new property_provider_1.CredentialsProviderError(\"Incomplete configuration. The fromSSO() argument hash must include \" +\n '\"ssoStartUrl\", \"ssoAccountId\", \"ssoRegion\", \"ssoRoleName\"');\n }\n else {\n return (0, resolveSSOCredentials_1.resolveSSOCredentials)({\n ssoStartUrl,\n ssoSession,\n ssoAccountId,\n ssoRegion,\n ssoRoleName,\n ssoClient,\n profile: profileName,\n });\n }\n};\nexports.fromSSO = fromSSO;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromSSO\"), exports);\ntslib_1.__exportStar(require(\"./isSsoProfile\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\ntslib_1.__exportStar(require(\"./validateSsoProfile\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isSsoProfile = void 0;\nconst isSsoProfile = (arg) => arg &&\n (typeof arg.sso_start_url === \"string\" ||\n typeof arg.sso_account_id === \"string\" ||\n typeof arg.sso_session === \"string\" ||\n typeof arg.sso_region === \"string\" ||\n typeof arg.sso_role_name === \"string\");\nexports.isSsoProfile = isSsoProfile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveSSOCredentials = void 0;\nconst client_sso_1 = require(\"@aws-sdk/client-sso\");\nconst token_providers_1 = require(\"@aws-sdk/token-providers\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst SHOULD_FAIL_CREDENTIAL_CHAIN = false;\nconst resolveSSOCredentials = async ({ ssoStartUrl, ssoSession, ssoAccountId, ssoRegion, ssoRoleName, ssoClient, profile, }) => {\n let token;\n const refreshMessage = `To refresh this SSO session run aws sso login with the corresponding profile.`;\n if (ssoSession) {\n try {\n const _token = await (0, token_providers_1.fromSso)({ profile })();\n token = {\n accessToken: _token.token,\n expiresAt: new Date(_token.expiration).toISOString(),\n };\n }\n catch (e) {\n throw new property_provider_1.CredentialsProviderError(e.message, SHOULD_FAIL_CREDENTIAL_CHAIN);\n }\n }\n else {\n try {\n token = await (0, shared_ini_file_loader_1.getSSOTokenFromFile)(ssoStartUrl);\n }\n catch (e) {\n throw new property_provider_1.CredentialsProviderError(`The SSO session associated with this profile is invalid. ${refreshMessage}`, SHOULD_FAIL_CREDENTIAL_CHAIN);\n }\n }\n if (new Date(token.expiresAt).getTime() - Date.now() <= 0) {\n throw new property_provider_1.CredentialsProviderError(`The SSO session associated with this profile has expired. ${refreshMessage}`, SHOULD_FAIL_CREDENTIAL_CHAIN);\n }\n const { accessToken } = token;\n const sso = ssoClient || new client_sso_1.SSOClient({ region: ssoRegion });\n let ssoResp;\n try {\n ssoResp = await sso.send(new client_sso_1.GetRoleCredentialsCommand({\n accountId: ssoAccountId,\n roleName: ssoRoleName,\n accessToken,\n }));\n }\n catch (e) {\n throw property_provider_1.CredentialsProviderError.from(e, SHOULD_FAIL_CREDENTIAL_CHAIN);\n }\n const { roleCredentials: { accessKeyId, secretAccessKey, sessionToken, expiration } = {} } = ssoResp;\n if (!accessKeyId || !secretAccessKey || !sessionToken || !expiration) {\n throw new property_provider_1.CredentialsProviderError(\"SSO returns an invalid temporary credential.\", SHOULD_FAIL_CREDENTIAL_CHAIN);\n }\n return { accessKeyId, secretAccessKey, sessionToken, expiration: new Date(expiration) };\n};\nexports.resolveSSOCredentials = resolveSSOCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateSsoProfile = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst validateSsoProfile = (profile) => {\n const { sso_start_url, sso_account_id, sso_region, sso_role_name } = profile;\n if (!sso_start_url || !sso_account_id || !sso_region || !sso_role_name) {\n throw new property_provider_1.CredentialsProviderError(`Profile is configured with invalid SSO credentials. Required parameters \"sso_account_id\", ` +\n `\"sso_region\", \"sso_role_name\", \"sso_start_url\". Got ${Object.keys(profile).join(\", \")}\\nReference: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html`, false);\n }\n return profile;\n};\nexports.validateSsoProfile = validateSsoProfile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromTokenFile = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fs_1 = require(\"fs\");\nconst fromWebToken_1 = require(\"./fromWebToken\");\nconst ENV_TOKEN_FILE = \"AWS_WEB_IDENTITY_TOKEN_FILE\";\nconst ENV_ROLE_ARN = \"AWS_ROLE_ARN\";\nconst ENV_ROLE_SESSION_NAME = \"AWS_ROLE_SESSION_NAME\";\nconst fromTokenFile = (init = {}) => async () => {\n var _a, _b, _c;\n const webIdentityTokenFile = (_a = init === null || init === void 0 ? void 0 : init.webIdentityTokenFile) !== null && _a !== void 0 ? _a : process.env[ENV_TOKEN_FILE];\n const roleArn = (_b = init === null || init === void 0 ? void 0 : init.roleArn) !== null && _b !== void 0 ? _b : process.env[ENV_ROLE_ARN];\n const roleSessionName = (_c = init === null || init === void 0 ? void 0 : init.roleSessionName) !== null && _c !== void 0 ? _c : process.env[ENV_ROLE_SESSION_NAME];\n if (!webIdentityTokenFile || !roleArn) {\n throw new property_provider_1.CredentialsProviderError(\"Web identity configuration not specified\");\n }\n return (0, fromWebToken_1.fromWebToken)({\n ...init,\n webIdentityToken: (0, fs_1.readFileSync)(webIdentityTokenFile, { encoding: \"ascii\" }),\n roleArn,\n roleSessionName,\n })();\n};\nexports.fromTokenFile = fromTokenFile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromWebToken = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromWebToken = (init) => () => {\n const { roleArn, roleSessionName, webIdentityToken, providerId, policyArns, policy, durationSeconds, roleAssumerWithWebIdentity, } = init;\n if (!roleAssumerWithWebIdentity) {\n throw new property_provider_1.CredentialsProviderError(`Role Arn '${roleArn}' needs to be assumed with web identity,` +\n ` but no role assumption callback was provided.`, false);\n }\n return roleAssumerWithWebIdentity({\n RoleArn: roleArn,\n RoleSessionName: roleSessionName !== null && roleSessionName !== void 0 ? roleSessionName : `aws-sdk-js-session-${Date.now()}`,\n WebIdentityToken: webIdentityToken,\n ProviderId: providerId,\n PolicyArns: policyArns,\n Policy: policy,\n DurationSeconds: durationSeconds,\n });\n};\nexports.fromWebToken = fromWebToken;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromTokenFile\"), exports);\ntslib_1.__exportStar(require(\"./fromWebToken\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromCognitoIdentity = void 0;\nconst client_cognito_identity_1 = require(\"@aws-sdk/client-cognito-identity\");\nconst credential_provider_cognito_identity_1 = require(\"@aws-sdk/credential-provider-cognito-identity\");\nconst fromCognitoIdentity = (options) => {\n var _a;\n return (0, credential_provider_cognito_identity_1.fromCognitoIdentity)({\n ...options,\n client: new client_cognito_identity_1.CognitoIdentityClient((_a = options.clientConfig) !== null && _a !== void 0 ? _a : {}),\n });\n};\nexports.fromCognitoIdentity = fromCognitoIdentity;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromCognitoIdentityPool = void 0;\nconst client_cognito_identity_1 = require(\"@aws-sdk/client-cognito-identity\");\nconst credential_provider_cognito_identity_1 = require(\"@aws-sdk/credential-provider-cognito-identity\");\nconst fromCognitoIdentityPool = (options) => {\n var _a;\n return (0, credential_provider_cognito_identity_1.fromCognitoIdentityPool)({\n ...options,\n client: new client_cognito_identity_1.CognitoIdentityClient((_a = options.clientConfig) !== null && _a !== void 0 ? _a : {}),\n });\n};\nexports.fromCognitoIdentityPool = fromCognitoIdentityPool;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromContainerMetadata = void 0;\nconst credential_provider_imds_1 = require(\"@smithy/credential-provider-imds\");\nconst fromContainerMetadata = (init) => (0, credential_provider_imds_1.fromContainerMetadata)(init);\nexports.fromContainerMetadata = fromContainerMetadata;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromEnv = void 0;\nconst credential_provider_env_1 = require(\"@aws-sdk/credential-provider-env\");\nconst fromEnv = () => (0, credential_provider_env_1.fromEnv)();\nexports.fromEnv = fromEnv;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromIni = void 0;\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst credential_provider_ini_1 = require(\"@aws-sdk/credential-provider-ini\");\nconst fromIni = (init = {}) => {\n var _a, _b;\n return (0, credential_provider_ini_1.fromIni)({\n ...init,\n roleAssumer: (_a = init.roleAssumer) !== null && _a !== void 0 ? _a : (0, client_sts_1.getDefaultRoleAssumer)(init.clientConfig, init.clientPlugins),\n roleAssumerWithWebIdentity: (_b = init.roleAssumerWithWebIdentity) !== null && _b !== void 0 ? _b : (0, client_sts_1.getDefaultRoleAssumerWithWebIdentity)(init.clientConfig, init.clientPlugins),\n });\n};\nexports.fromIni = fromIni;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromInstanceMetadata = void 0;\nconst credential_provider_imds_1 = require(\"@smithy/credential-provider-imds\");\nconst fromInstanceMetadata = (init) => (0, credential_provider_imds_1.fromInstanceMetadata)(init);\nexports.fromInstanceMetadata = fromInstanceMetadata;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromNodeProviderChain = void 0;\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst credential_provider_node_1 = require(\"@aws-sdk/credential-provider-node\");\nconst fromNodeProviderChain = (init = {}) => {\n var _a, _b;\n return (0, credential_provider_node_1.defaultProvider)({\n ...init,\n roleAssumer: (_a = init.roleAssumer) !== null && _a !== void 0 ? _a : (0, client_sts_1.getDefaultRoleAssumer)(init.clientConfig, init.clientPlugins),\n roleAssumerWithWebIdentity: (_b = init.roleAssumerWithWebIdentity) !== null && _b !== void 0 ? _b : (0, client_sts_1.getDefaultRoleAssumerWithWebIdentity)(init.clientConfig, init.clientPlugins),\n });\n};\nexports.fromNodeProviderChain = fromNodeProviderChain;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromProcess = void 0;\nconst credential_provider_process_1 = require(\"@aws-sdk/credential-provider-process\");\nconst fromProcess = (init) => (0, credential_provider_process_1.fromProcess)(init);\nexports.fromProcess = fromProcess;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromSSO = void 0;\nconst client_sso_1 = require(\"@aws-sdk/client-sso\");\nconst credential_provider_sso_1 = require(\"@aws-sdk/credential-provider-sso\");\nconst fromSSO = (init = {}) => (0, credential_provider_sso_1.fromSSO)({ ...{ ssoClient: init.clientConfig ? new client_sso_1.SSOClient(init.clientConfig) : undefined }, ...init });\nexports.fromSSO = fromSSO;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromTemporaryCredentials = void 0;\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromTemporaryCredentials = (options) => {\n let stsClient;\n return async () => {\n var _a;\n const params = { ...options.params, RoleSessionName: (_a = options.params.RoleSessionName) !== null && _a !== void 0 ? _a : \"aws-sdk-js-\" + Date.now() };\n if (params === null || params === void 0 ? void 0 : params.SerialNumber) {\n if (!options.mfaCodeProvider) {\n throw new property_provider_1.CredentialsProviderError(`Temporary credential requires multi-factor authentication,` + ` but no MFA code callback was provided.`, false);\n }\n params.TokenCode = await options.mfaCodeProvider(params === null || params === void 0 ? void 0 : params.SerialNumber);\n }\n if (!stsClient)\n stsClient = new client_sts_1.STSClient({ ...options.clientConfig, credentials: options.masterCredentials });\n if (options.clientPlugins) {\n for (const plugin of options.clientPlugins) {\n stsClient.middlewareStack.use(plugin);\n }\n }\n const { Credentials } = await stsClient.send(new client_sts_1.AssumeRoleCommand(params));\n if (!Credentials || !Credentials.AccessKeyId || !Credentials.SecretAccessKey) {\n throw new property_provider_1.CredentialsProviderError(`Invalid response from STS.assumeRole call with role ${params.RoleArn}`);\n }\n return {\n accessKeyId: Credentials.AccessKeyId,\n secretAccessKey: Credentials.SecretAccessKey,\n sessionToken: Credentials.SessionToken,\n expiration: Credentials.Expiration,\n };\n };\n};\nexports.fromTemporaryCredentials = fromTemporaryCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromTokenFile = void 0;\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst credential_provider_web_identity_1 = require(\"@aws-sdk/credential-provider-web-identity\");\nconst fromTokenFile = (init = {}) => {\n var _a;\n return (0, credential_provider_web_identity_1.fromTokenFile)({\n ...init,\n roleAssumerWithWebIdentity: (_a = init.roleAssumerWithWebIdentity) !== null && _a !== void 0 ? _a : (0, client_sts_1.getDefaultRoleAssumerWithWebIdentity)(init.clientConfig, init.clientPlugins),\n });\n};\nexports.fromTokenFile = fromTokenFile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromWebToken = void 0;\nconst client_sts_1 = require(\"@aws-sdk/client-sts\");\nconst credential_provider_web_identity_1 = require(\"@aws-sdk/credential-provider-web-identity\");\nconst fromWebToken = (init) => {\n var _a;\n return (0, credential_provider_web_identity_1.fromWebToken)({\n ...init,\n roleAssumerWithWebIdentity: (_a = init.roleAssumerWithWebIdentity) !== null && _a !== void 0 ? _a : (0, client_sts_1.getDefaultRoleAssumerWithWebIdentity)(init.clientConfig, init.clientPlugins),\n });\n};\nexports.fromWebToken = fromWebToken;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromHttp = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromCognitoIdentity\"), exports);\ntslib_1.__exportStar(require(\"./fromCognitoIdentityPool\"), exports);\ntslib_1.__exportStar(require(\"./fromContainerMetadata\"), exports);\ntslib_1.__exportStar(require(\"./fromEnv\"), exports);\nvar credential_provider_http_1 = require(\"@aws-sdk/credential-provider-http\");\nObject.defineProperty(exports, \"fromHttp\", { enumerable: true, get: function () { return credential_provider_http_1.fromHttp; } });\ntslib_1.__exportStar(require(\"./fromIni\"), exports);\ntslib_1.__exportStar(require(\"./fromInstanceMetadata\"), exports);\ntslib_1.__exportStar(require(\"./fromNodeProviderChain\"), exports);\ntslib_1.__exportStar(require(\"./fromProcess\"), exports);\ntslib_1.__exportStar(require(\"./fromSSO\"), exports);\ntslib_1.__exportStar(require(\"./fromTemporaryCredentials\"), exports);\ntslib_1.__exportStar(require(\"./fromTokenFile\"), exports);\ntslib_1.__exportStar(require(\"./fromWebToken\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getHostHeaderPlugin = exports.hostHeaderMiddlewareOptions = exports.hostHeaderMiddleware = exports.resolveHostHeaderConfig = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nfunction resolveHostHeaderConfig(input) {\n return input;\n}\nexports.resolveHostHeaderConfig = resolveHostHeaderConfig;\nconst hostHeaderMiddleware = (options) => (next) => async (args) => {\n if (!protocol_http_1.HttpRequest.isInstance(args.request))\n return next(args);\n const { request } = args;\n const { handlerProtocol = \"\" } = options.requestHandler.metadata || {};\n if (handlerProtocol.indexOf(\"h2\") >= 0 && !request.headers[\":authority\"]) {\n delete request.headers[\"host\"];\n request.headers[\":authority\"] = request.hostname + (request.port ? \":\" + request.port : \"\");\n }\n else if (!request.headers[\"host\"]) {\n let host = request.hostname;\n if (request.port != null)\n host += `:${request.port}`;\n request.headers[\"host\"] = host;\n }\n return next(args);\n};\nexports.hostHeaderMiddleware = hostHeaderMiddleware;\nexports.hostHeaderMiddlewareOptions = {\n name: \"hostHeaderMiddleware\",\n step: \"build\",\n priority: \"low\",\n tags: [\"HOST\"],\n override: true,\n};\nconst getHostHeaderPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.add((0, exports.hostHeaderMiddleware)(options), exports.hostHeaderMiddlewareOptions);\n },\n});\nexports.getHostHeaderPlugin = getHostHeaderPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./loggerMiddleware\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getLoggerPlugin = exports.loggerMiddlewareOptions = exports.loggerMiddleware = void 0;\nconst loggerMiddleware = () => (next, context) => async (args) => {\n var _a, _b;\n try {\n const response = await next(args);\n const { clientName, commandName, logger, dynamoDbDocumentClientOptions = {} } = context;\n const { overrideInputFilterSensitiveLog, overrideOutputFilterSensitiveLog } = dynamoDbDocumentClientOptions;\n const inputFilterSensitiveLog = overrideInputFilterSensitiveLog !== null && overrideInputFilterSensitiveLog !== void 0 ? overrideInputFilterSensitiveLog : context.inputFilterSensitiveLog;\n const outputFilterSensitiveLog = overrideOutputFilterSensitiveLog !== null && overrideOutputFilterSensitiveLog !== void 0 ? overrideOutputFilterSensitiveLog : context.outputFilterSensitiveLog;\n const { $metadata, ...outputWithoutMetadata } = response.output;\n (_a = logger === null || logger === void 0 ? void 0 : logger.info) === null || _a === void 0 ? void 0 : _a.call(logger, {\n clientName,\n commandName,\n input: inputFilterSensitiveLog(args.input),\n output: outputFilterSensitiveLog(outputWithoutMetadata),\n metadata: $metadata,\n });\n return response;\n }\n catch (error) {\n const { clientName, commandName, logger, dynamoDbDocumentClientOptions = {} } = context;\n const { overrideInputFilterSensitiveLog } = dynamoDbDocumentClientOptions;\n const inputFilterSensitiveLog = overrideInputFilterSensitiveLog !== null && overrideInputFilterSensitiveLog !== void 0 ? overrideInputFilterSensitiveLog : context.inputFilterSensitiveLog;\n (_b = logger === null || logger === void 0 ? void 0 : logger.error) === null || _b === void 0 ? void 0 : _b.call(logger, {\n clientName,\n commandName,\n input: inputFilterSensitiveLog(args.input),\n error,\n metadata: error.$metadata,\n });\n throw error;\n }\n};\nexports.loggerMiddleware = loggerMiddleware;\nexports.loggerMiddlewareOptions = {\n name: \"loggerMiddleware\",\n tags: [\"LOGGER\"],\n step: \"initialize\",\n override: true,\n};\nconst getLoggerPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.add((0, exports.loggerMiddleware)(), exports.loggerMiddlewareOptions);\n },\n});\nexports.getLoggerPlugin = getLoggerPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRecursionDetectionPlugin = exports.addRecursionDetectionMiddlewareOptions = exports.recursionDetectionMiddleware = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst TRACE_ID_HEADER_NAME = \"X-Amzn-Trace-Id\";\nconst ENV_LAMBDA_FUNCTION_NAME = \"AWS_LAMBDA_FUNCTION_NAME\";\nconst ENV_TRACE_ID = \"_X_AMZN_TRACE_ID\";\nconst recursionDetectionMiddleware = (options) => (next) => async (args) => {\n const { request } = args;\n if (!protocol_http_1.HttpRequest.isInstance(request) ||\n options.runtime !== \"node\" ||\n request.headers.hasOwnProperty(TRACE_ID_HEADER_NAME)) {\n return next(args);\n }\n const functionName = process.env[ENV_LAMBDA_FUNCTION_NAME];\n const traceId = process.env[ENV_TRACE_ID];\n const nonEmptyString = (str) => typeof str === \"string\" && str.length > 0;\n if (nonEmptyString(functionName) && nonEmptyString(traceId)) {\n request.headers[TRACE_ID_HEADER_NAME] = traceId;\n }\n return next({\n ...args,\n request,\n });\n};\nexports.recursionDetectionMiddleware = recursionDetectionMiddleware;\nexports.addRecursionDetectionMiddlewareOptions = {\n step: \"build\",\n tags: [\"RECURSION_DETECTION\"],\n name: \"recursionDetectionMiddleware\",\n override: true,\n priority: \"low\",\n};\nconst getRecursionDetectionPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.add((0, exports.recursionDetectionMiddleware)(options), exports.addRecursionDetectionMiddlewareOptions);\n },\n});\nexports.getRecursionDetectionPlugin = getRecursionDetectionPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveStsAuthConfig = void 0;\nconst middleware_signing_1 = require(\"@aws-sdk/middleware-signing\");\nconst resolveStsAuthConfig = (input, { stsClientCtor }) => (0, middleware_signing_1.resolveAwsAuthConfig)({\n ...input,\n stsClientCtor,\n});\nexports.resolveStsAuthConfig = resolveStsAuthConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveSigV4AuthConfig = exports.resolveAwsAuthConfig = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst signature_v4_1 = require(\"@smithy/signature-v4\");\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst CREDENTIAL_EXPIRE_WINDOW = 300000;\nconst resolveAwsAuthConfig = (input) => {\n const normalizedCreds = input.credentials\n ? normalizeCredentialProvider(input.credentials)\n : input.credentialDefaultProvider(input);\n const { signingEscapePath = true, systemClockOffset = input.systemClockOffset || 0, sha256 } = input;\n let signer;\n if (input.signer) {\n signer = (0, util_middleware_1.normalizeProvider)(input.signer);\n }\n else if (input.regionInfoProvider) {\n signer = () => (0, util_middleware_1.normalizeProvider)(input.region)()\n .then(async (region) => [\n (await input.regionInfoProvider(region, {\n useFipsEndpoint: await input.useFipsEndpoint(),\n useDualstackEndpoint: await input.useDualstackEndpoint(),\n })) || {},\n region,\n ])\n .then(([regionInfo, region]) => {\n const { signingRegion, signingService } = regionInfo;\n input.signingRegion = input.signingRegion || signingRegion || region;\n input.signingName = input.signingName || signingService || input.serviceId;\n const params = {\n ...input,\n credentials: normalizedCreds,\n region: input.signingRegion,\n service: input.signingName,\n sha256,\n uriEscapePath: signingEscapePath,\n };\n const SignerCtor = input.signerConstructor || signature_v4_1.SignatureV4;\n return new SignerCtor(params);\n });\n }\n else {\n signer = async (authScheme) => {\n authScheme = Object.assign({}, {\n name: \"sigv4\",\n signingName: input.signingName || input.defaultSigningName,\n signingRegion: await (0, util_middleware_1.normalizeProvider)(input.region)(),\n properties: {},\n }, authScheme);\n const signingRegion = authScheme.signingRegion;\n const signingService = authScheme.signingName;\n input.signingRegion = input.signingRegion || signingRegion;\n input.signingName = input.signingName || signingService || input.serviceId;\n const params = {\n ...input,\n credentials: normalizedCreds,\n region: input.signingRegion,\n service: input.signingName,\n sha256,\n uriEscapePath: signingEscapePath,\n };\n const SignerCtor = input.signerConstructor || signature_v4_1.SignatureV4;\n return new SignerCtor(params);\n };\n }\n return {\n ...input,\n systemClockOffset,\n signingEscapePath,\n credentials: normalizedCreds,\n signer,\n };\n};\nexports.resolveAwsAuthConfig = resolveAwsAuthConfig;\nconst resolveSigV4AuthConfig = (input) => {\n const normalizedCreds = input.credentials\n ? normalizeCredentialProvider(input.credentials)\n : input.credentialDefaultProvider(input);\n const { signingEscapePath = true, systemClockOffset = input.systemClockOffset || 0, sha256 } = input;\n let signer;\n if (input.signer) {\n signer = (0, util_middleware_1.normalizeProvider)(input.signer);\n }\n else {\n signer = (0, util_middleware_1.normalizeProvider)(new signature_v4_1.SignatureV4({\n credentials: normalizedCreds,\n region: input.region,\n service: input.signingName,\n sha256,\n uriEscapePath: signingEscapePath,\n }));\n }\n return {\n ...input,\n systemClockOffset,\n signingEscapePath,\n credentials: normalizedCreds,\n signer,\n };\n};\nexports.resolveSigV4AuthConfig = resolveSigV4AuthConfig;\nconst normalizeCredentialProvider = (credentials) => {\n if (typeof credentials === \"function\") {\n return (0, property_provider_1.memoize)(credentials, (credentials) => credentials.expiration !== undefined &&\n credentials.expiration.getTime() - Date.now() < CREDENTIAL_EXPIRE_WINDOW, (credentials) => credentials.expiration !== undefined);\n }\n return (0, util_middleware_1.normalizeProvider)(credentials);\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSigV4AuthPlugin = exports.getAwsAuthPlugin = exports.awsAuthMiddlewareOptions = exports.awsAuthMiddleware = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst getSkewCorrectedDate_1 = require(\"./utils/getSkewCorrectedDate\");\nconst getUpdatedSystemClockOffset_1 = require(\"./utils/getUpdatedSystemClockOffset\");\nconst awsAuthMiddleware = (options) => (next, context) => async function (args) {\n var _a, _b, _c, _d;\n if (!protocol_http_1.HttpRequest.isInstance(args.request))\n return next(args);\n const authScheme = (_c = (_b = (_a = context.endpointV2) === null || _a === void 0 ? void 0 : _a.properties) === null || _b === void 0 ? void 0 : _b.authSchemes) === null || _c === void 0 ? void 0 : _c[0];\n const multiRegionOverride = (authScheme === null || authScheme === void 0 ? void 0 : authScheme.name) === \"sigv4a\" ? (_d = authScheme === null || authScheme === void 0 ? void 0 : authScheme.signingRegionSet) === null || _d === void 0 ? void 0 : _d.join(\",\") : undefined;\n const signer = await options.signer(authScheme);\n const output = await next({\n ...args,\n request: await signer.sign(args.request, {\n signingDate: (0, getSkewCorrectedDate_1.getSkewCorrectedDate)(options.systemClockOffset),\n signingRegion: multiRegionOverride || context[\"signing_region\"],\n signingService: context[\"signing_service\"],\n }),\n }).catch((error) => {\n var _a;\n const serverTime = (_a = error.ServerTime) !== null && _a !== void 0 ? _a : getDateHeader(error.$response);\n if (serverTime) {\n options.systemClockOffset = (0, getUpdatedSystemClockOffset_1.getUpdatedSystemClockOffset)(serverTime, options.systemClockOffset);\n }\n throw error;\n });\n const dateHeader = getDateHeader(output.response);\n if (dateHeader) {\n options.systemClockOffset = (0, getUpdatedSystemClockOffset_1.getUpdatedSystemClockOffset)(dateHeader, options.systemClockOffset);\n }\n return output;\n};\nexports.awsAuthMiddleware = awsAuthMiddleware;\nconst getDateHeader = (response) => { var _a, _b, _c; return protocol_http_1.HttpResponse.isInstance(response) ? (_b = (_a = response.headers) === null || _a === void 0 ? void 0 : _a.date) !== null && _b !== void 0 ? _b : (_c = response.headers) === null || _c === void 0 ? void 0 : _c.Date : undefined; };\nexports.awsAuthMiddlewareOptions = {\n name: \"awsAuthMiddleware\",\n tags: [\"SIGNATURE\", \"AWSAUTH\"],\n relation: \"after\",\n toMiddleware: \"retryMiddleware\",\n override: true,\n};\nconst getAwsAuthPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.addRelativeTo((0, exports.awsAuthMiddleware)(options), exports.awsAuthMiddlewareOptions);\n },\n});\nexports.getAwsAuthPlugin = getAwsAuthPlugin;\nexports.getSigV4AuthPlugin = exports.getAwsAuthPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./awsAuthConfiguration\"), exports);\ntslib_1.__exportStar(require(\"./awsAuthMiddleware\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSkewCorrectedDate = void 0;\nconst getSkewCorrectedDate = (systemClockOffset) => new Date(Date.now() + systemClockOffset);\nexports.getSkewCorrectedDate = getSkewCorrectedDate;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getUpdatedSystemClockOffset = void 0;\nconst isClockSkewed_1 = require(\"./isClockSkewed\");\nconst getUpdatedSystemClockOffset = (clockTime, currentSystemClockOffset) => {\n const clockTimeInMs = Date.parse(clockTime);\n if ((0, isClockSkewed_1.isClockSkewed)(clockTimeInMs, currentSystemClockOffset)) {\n return clockTimeInMs - Date.now();\n }\n return currentSystemClockOffset;\n};\nexports.getUpdatedSystemClockOffset = getUpdatedSystemClockOffset;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isClockSkewed = void 0;\nconst getSkewCorrectedDate_1 = require(\"./getSkewCorrectedDate\");\nconst isClockSkewed = (clockTime, systemClockOffset) => Math.abs((0, getSkewCorrectedDate_1.getSkewCorrectedDate)(systemClockOffset).getTime() - clockTime) >= 300000;\nexports.isClockSkewed = isClockSkewed;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveUserAgentConfig = void 0;\nfunction resolveUserAgentConfig(input) {\n return {\n ...input,\n customUserAgent: typeof input.customUserAgent === \"string\" ? [[input.customUserAgent]] : input.customUserAgent,\n };\n}\nexports.resolveUserAgentConfig = resolveUserAgentConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UA_ESCAPE_CHAR = exports.UA_VALUE_ESCAPE_REGEX = exports.UA_NAME_ESCAPE_REGEX = exports.UA_NAME_SEPARATOR = exports.SPACE = exports.X_AMZ_USER_AGENT = exports.USER_AGENT = void 0;\nexports.USER_AGENT = \"user-agent\";\nexports.X_AMZ_USER_AGENT = \"x-amz-user-agent\";\nexports.SPACE = \" \";\nexports.UA_NAME_SEPARATOR = \"/\";\nexports.UA_NAME_ESCAPE_REGEX = /[^\\!\\$\\%\\&\\'\\*\\+\\-\\.\\^\\_\\`\\|\\~\\d\\w]/g;\nexports.UA_VALUE_ESCAPE_REGEX = /[^\\!\\$\\%\\&\\'\\*\\+\\-\\.\\^\\_\\`\\|\\~\\d\\w\\#]/g;\nexports.UA_ESCAPE_CHAR = \"-\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./configurations\"), exports);\ntslib_1.__exportStar(require(\"./user-agent-middleware\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getUserAgentPlugin = exports.getUserAgentMiddlewareOptions = exports.userAgentMiddleware = void 0;\nconst util_endpoints_1 = require(\"@aws-sdk/util-endpoints\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst constants_1 = require(\"./constants\");\nconst userAgentMiddleware = (options) => (next, context) => async (args) => {\n var _a, _b;\n const { request } = args;\n if (!protocol_http_1.HttpRequest.isInstance(request))\n return next(args);\n const { headers } = request;\n const userAgent = ((_a = context === null || context === void 0 ? void 0 : context.userAgent) === null || _a === void 0 ? void 0 : _a.map(escapeUserAgent)) || [];\n const defaultUserAgent = (await options.defaultUserAgentProvider()).map(escapeUserAgent);\n const customUserAgent = ((_b = options === null || options === void 0 ? void 0 : options.customUserAgent) === null || _b === void 0 ? void 0 : _b.map(escapeUserAgent)) || [];\n const prefix = (0, util_endpoints_1.getUserAgentPrefix)();\n const sdkUserAgentValue = (prefix ? [prefix] : [])\n .concat([...defaultUserAgent, ...userAgent, ...customUserAgent])\n .join(constants_1.SPACE);\n const normalUAValue = [\n ...defaultUserAgent.filter((section) => section.startsWith(\"aws-sdk-\")),\n ...customUserAgent,\n ].join(constants_1.SPACE);\n if (options.runtime !== \"browser\") {\n if (normalUAValue) {\n headers[constants_1.X_AMZ_USER_AGENT] = headers[constants_1.X_AMZ_USER_AGENT]\n ? `${headers[constants_1.USER_AGENT]} ${normalUAValue}`\n : normalUAValue;\n }\n headers[constants_1.USER_AGENT] = sdkUserAgentValue;\n }\n else {\n headers[constants_1.X_AMZ_USER_AGENT] = sdkUserAgentValue;\n }\n return next({\n ...args,\n request,\n });\n};\nexports.userAgentMiddleware = userAgentMiddleware;\nconst escapeUserAgent = (userAgentPair) => {\n var _a;\n const name = userAgentPair[0]\n .split(constants_1.UA_NAME_SEPARATOR)\n .map((part) => part.replace(constants_1.UA_NAME_ESCAPE_REGEX, constants_1.UA_ESCAPE_CHAR))\n .join(constants_1.UA_NAME_SEPARATOR);\n const version = (_a = userAgentPair[1]) === null || _a === void 0 ? void 0 : _a.replace(constants_1.UA_VALUE_ESCAPE_REGEX, constants_1.UA_ESCAPE_CHAR);\n const prefixSeparatorIndex = name.indexOf(constants_1.UA_NAME_SEPARATOR);\n const prefix = name.substring(0, prefixSeparatorIndex);\n let uaName = name.substring(prefixSeparatorIndex + 1);\n if (prefix === \"api\") {\n uaName = uaName.toLowerCase();\n }\n return [prefix, uaName, version]\n .filter((item) => item && item.length > 0)\n .reduce((acc, item, index) => {\n switch (index) {\n case 0:\n return item;\n case 1:\n return `${acc}/${item}`;\n default:\n return `${acc}#${item}`;\n }\n }, \"\");\n};\nexports.getUserAgentMiddlewareOptions = {\n name: \"getUserAgentMiddleware\",\n step: \"build\",\n priority: \"low\",\n tags: [\"SET_USER_AGENT\", \"USER_AGENT\"],\n override: true,\n};\nconst getUserAgentPlugin = (config) => ({\n applyToStack: (clientStack) => {\n clientStack.add((0, exports.userAgentMiddleware)(config), exports.getUserAgentMiddlewareOptions);\n },\n});\nexports.getUserAgentPlugin = getUserAgentPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveAwsRegionExtensionConfiguration = exports.getAwsRegionExtensionConfiguration = void 0;\nconst getAwsRegionExtensionConfiguration = (runtimeConfig) => {\n let runtimeConfigRegion = async () => {\n if (runtimeConfig.region === undefined) {\n throw new Error(\"Region is missing from runtimeConfig\");\n }\n const region = runtimeConfig.region;\n if (typeof region === \"string\") {\n return region;\n }\n return region();\n };\n return {\n setRegion(region) {\n runtimeConfigRegion = region;\n },\n region() {\n return runtimeConfigRegion;\n },\n };\n};\nexports.getAwsRegionExtensionConfiguration = getAwsRegionExtensionConfiguration;\nconst resolveAwsRegionExtensionConfiguration = (awsRegionExtensionConfiguration) => {\n return {\n region: awsRegionExtensionConfiguration.region(),\n };\n};\nexports.resolveAwsRegionExtensionConfiguration = resolveAwsRegionExtensionConfiguration;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./extensions\"), exports);\ntslib_1.__exportStar(require(\"./regionConfig\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_REGION_CONFIG_FILE_OPTIONS = exports.NODE_REGION_CONFIG_OPTIONS = exports.REGION_INI_NAME = exports.REGION_ENV_NAME = void 0;\nexports.REGION_ENV_NAME = \"AWS_REGION\";\nexports.REGION_INI_NAME = \"region\";\nexports.NODE_REGION_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => env[exports.REGION_ENV_NAME],\n configFileSelector: (profile) => profile[exports.REGION_INI_NAME],\n default: () => {\n throw new Error(\"Region is missing\");\n },\n};\nexports.NODE_REGION_CONFIG_FILE_OPTIONS = {\n preferredFile: \"credentials\",\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRealRegion = void 0;\nconst isFipsRegion_1 = require(\"./isFipsRegion\");\nconst getRealRegion = (region) => (0, isFipsRegion_1.isFipsRegion)(region)\n ? [\"fips-aws-global\", \"aws-fips\"].includes(region)\n ? \"us-east-1\"\n : region.replace(/fips-(dkr-|prod-)?|-fips/, \"\")\n : region;\nexports.getRealRegion = getRealRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./config\"), exports);\ntslib_1.__exportStar(require(\"./resolveRegionConfig\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isFipsRegion = void 0;\nconst isFipsRegion = (region) => typeof region === \"string\" && (region.startsWith(\"fips-\") || region.endsWith(\"-fips\"));\nexports.isFipsRegion = isFipsRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRegionConfig = void 0;\nconst getRealRegion_1 = require(\"./getRealRegion\");\nconst isFipsRegion_1 = require(\"./isFipsRegion\");\nconst resolveRegionConfig = (input) => {\n const { region, useFipsEndpoint } = input;\n if (!region) {\n throw new Error(\"Region is missing\");\n }\n return {\n ...input,\n region: async () => {\n if (typeof region === \"string\") {\n return (0, getRealRegion_1.getRealRegion)(region);\n }\n const providedRegion = await region();\n return (0, getRealRegion_1.getRealRegion)(providedRegion);\n },\n useFipsEndpoint: async () => {\n const providedRegion = typeof region === \"string\" ? region : await region();\n if ((0, isFipsRegion_1.isFipsRegion)(providedRegion)) {\n return true;\n }\n return typeof useFipsEndpoint !== \"function\" ? Promise.resolve(!!useFipsEndpoint) : useFipsEndpoint();\n },\n };\n};\nexports.resolveRegionConfig = resolveRegionConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UnsupportedGrantTypeException = exports.UnauthorizedClientException = exports.SlowDownException = exports.SSOOIDCClient = exports.InvalidScopeException = exports.InvalidRequestException = exports.InvalidClientException = exports.InternalServerException = exports.ExpiredTokenException = exports.CreateTokenCommand = exports.AuthorizationPendingException = exports.AccessDeniedException = void 0;\nconst middleware_host_header_1 = require(\"@aws-sdk/middleware-host-header\");\nconst middleware_logger_1 = require(\"@aws-sdk/middleware-logger\");\nconst middleware_recursion_detection_1 = require(\"@aws-sdk/middleware-recursion-detection\");\nconst middleware_user_agent_1 = require(\"@aws-sdk/middleware-user-agent\");\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst middleware_content_length_1 = require(\"@smithy/middleware-content-length\");\nconst middleware_endpoint_1 = require(\"@smithy/middleware-endpoint\");\nconst middleware_retry_1 = require(\"@smithy/middleware-retry\");\nconst smithy_client_1 = require(\"@smithy/smithy-client\");\nvar resolveClientEndpointParameters = (options) => {\n var _a, _b;\n return {\n ...options,\n useDualstackEndpoint: (_a = options.useDualstackEndpoint) !== null && _a !== void 0 ? _a : false,\n useFipsEndpoint: (_b = options.useFipsEndpoint) !== null && _b !== void 0 ? _b : false,\n defaultSigningName: \"awsssooidc\",\n };\n};\nvar package_default = { version: \"3.429.0\" };\nconst util_user_agent_node_1 = require(\"@aws-sdk/util-user-agent-node\");\nconst config_resolver_2 = require(\"@smithy/config-resolver\");\nconst hash_node_1 = require(\"@smithy/hash-node\");\nconst middleware_retry_2 = require(\"@smithy/middleware-retry\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_body_length_node_1 = require(\"@smithy/util-body-length-node\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst smithy_client_2 = require(\"@smithy/smithy-client\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst util_endpoints_1 = require(\"@smithy/util-endpoints\");\nvar s = \"required\";\nvar t = \"fn\";\nvar u = \"argv\";\nvar v = \"ref\";\nvar a = \"isSet\";\nvar b = \"tree\";\nvar c = \"error\";\nvar d = \"endpoint\";\nvar e = \"PartitionResult\";\nvar f = \"getAttr\";\nvar g = { [s]: false, type: \"String\" };\nvar h = { [s]: true, default: false, type: \"Boolean\" };\nvar i = { [v]: \"Endpoint\" };\nvar j = { [t]: \"booleanEquals\", [u]: [{ [v]: \"UseFIPS\" }, true] };\nvar k = { [t]: \"booleanEquals\", [u]: [{ [v]: \"UseDualStack\" }, true] };\nvar l = {};\nvar m = { [t]: \"booleanEquals\", [u]: [true, { [t]: f, [u]: [{ [v]: e }, \"supportsFIPS\"] }] };\nvar n = { [v]: e };\nvar o = { [t]: \"booleanEquals\", [u]: [true, { [t]: f, [u]: [n, \"supportsDualStack\"] }] };\nvar p = [j];\nvar q = [k];\nvar r = [{ [v]: \"Region\" }];\nvar _data = {\n version: \"1.0\",\n parameters: { Region: g, UseDualStack: h, UseFIPS: h, Endpoint: g },\n rules: [\n {\n conditions: [{ [t]: a, [u]: [i] }],\n type: b,\n rules: [\n { conditions: p, error: \"Invalid Configuration: FIPS and custom endpoint are not supported\", type: c },\n { conditions: q, error: \"Invalid Configuration: Dualstack and custom endpoint are not supported\", type: c },\n { endpoint: { url: i, properties: l, headers: l }, type: d },\n ],\n },\n {\n conditions: [{ [t]: a, [u]: r }],\n type: b,\n rules: [\n {\n conditions: [{ [t]: \"aws.partition\", [u]: r, assign: e }],\n type: b,\n rules: [\n {\n conditions: [j, k],\n type: b,\n rules: [\n {\n conditions: [m, o],\n type: b,\n rules: [\n {\n endpoint: {\n url: \"https://oidc-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n properties: l,\n headers: l,\n },\n type: d,\n },\n ],\n },\n { error: \"FIPS and DualStack are enabled, but this partition does not support one or both\", type: c },\n ],\n },\n {\n conditions: p,\n type: b,\n rules: [\n {\n conditions: [m],\n type: b,\n rules: [\n {\n conditions: [{ [t]: \"stringEquals\", [u]: [\"aws-us-gov\", { [t]: f, [u]: [n, \"name\"] }] }],\n endpoint: { url: \"https://oidc.{Region}.amazonaws.com\", properties: l, headers: l },\n type: d,\n },\n {\n endpoint: {\n url: \"https://oidc-fips.{Region}.{PartitionResult#dnsSuffix}\",\n properties: l,\n headers: l,\n },\n type: d,\n },\n ],\n },\n { error: \"FIPS is enabled but this partition does not support FIPS\", type: c },\n ],\n },\n {\n conditions: q,\n type: b,\n rules: [\n {\n conditions: [o],\n type: b,\n rules: [\n {\n endpoint: {\n url: \"https://oidc.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n properties: l,\n headers: l,\n },\n type: d,\n },\n ],\n },\n { error: \"DualStack is enabled but this partition does not support DualStack\", type: c },\n ],\n },\n {\n endpoint: { url: \"https://oidc.{Region}.{PartitionResult#dnsSuffix}\", properties: l, headers: l },\n type: d,\n },\n ],\n },\n ],\n },\n { error: \"Invalid Configuration: Missing Region\", type: c },\n ],\n};\nvar ruleSet = _data;\nvar defaultEndpointResolver = (endpointParams, context = {}) => {\n return (0, util_endpoints_1.resolveEndpoint)(ruleSet, {\n endpointParams,\n logger: context.logger,\n });\n};\nvar getRuntimeConfig = (config) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n return ({\n apiVersion: \"2019-06-10\",\n base64Decoder: (_a = config === null || config === void 0 ? void 0 : config.base64Decoder) !== null && _a !== void 0 ? _a : util_base64_1.fromBase64,\n base64Encoder: (_b = config === null || config === void 0 ? void 0 : config.base64Encoder) !== null && _b !== void 0 ? _b : util_base64_1.toBase64,\n disableHostPrefix: (_c = config === null || config === void 0 ? void 0 : config.disableHostPrefix) !== null && _c !== void 0 ? _c : false,\n endpointProvider: (_d = config === null || config === void 0 ? void 0 : config.endpointProvider) !== null && _d !== void 0 ? _d : defaultEndpointResolver,\n extensions: (_e = config === null || config === void 0 ? void 0 : config.extensions) !== null && _e !== void 0 ? _e : [],\n logger: (_f = config === null || config === void 0 ? void 0 : config.logger) !== null && _f !== void 0 ? _f : new smithy_client_2.NoOpLogger(),\n serviceId: (_g = config === null || config === void 0 ? void 0 : config.serviceId) !== null && _g !== void 0 ? _g : \"SSO OIDC\",\n urlParser: (_h = config === null || config === void 0 ? void 0 : config.urlParser) !== null && _h !== void 0 ? _h : url_parser_1.parseUrl,\n utf8Decoder: (_j = config === null || config === void 0 ? void 0 : config.utf8Decoder) !== null && _j !== void 0 ? _j : util_utf8_1.fromUtf8,\n utf8Encoder: (_k = config === null || config === void 0 ? void 0 : config.utf8Encoder) !== null && _k !== void 0 ? _k : util_utf8_1.toUtf8,\n });\n};\nconst smithy_client_3 = require(\"@smithy/smithy-client\");\nconst util_defaults_mode_node_1 = require(\"@smithy/util-defaults-mode-node\");\nconst smithy_client_4 = require(\"@smithy/smithy-client\");\nvar getRuntimeConfig2 = (config) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n (0, smithy_client_4.emitWarningIfUnsupportedVersion)(process.version);\n const defaultsMode = (0, util_defaults_mode_node_1.resolveDefaultsModeConfig)(config);\n const defaultConfigProvider = () => defaultsMode().then(smithy_client_3.loadConfigsForDefaultMode);\n const clientSharedValues = getRuntimeConfig(config);\n return {\n ...clientSharedValues,\n ...config,\n runtime: \"node\",\n defaultsMode,\n bodyLengthChecker: (_a = config === null || config === void 0 ? void 0 : config.bodyLengthChecker) !== null && _a !== void 0 ? _a : util_body_length_node_1.calculateBodyLength,\n defaultUserAgentProvider: (_b = config === null || config === void 0 ? void 0 : config.defaultUserAgentProvider) !== null && _b !== void 0 ? _b : (0, util_user_agent_node_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_default.version }),\n maxAttempts: (_c = config === null || config === void 0 ? void 0 : config.maxAttempts) !== null && _c !== void 0 ? _c : (0, node_config_provider_1.loadConfig)(middleware_retry_2.NODE_MAX_ATTEMPT_CONFIG_OPTIONS),\n region: (_d = config === null || config === void 0 ? void 0 : config.region) !== null && _d !== void 0 ? _d : (0, node_config_provider_1.loadConfig)(config_resolver_2.NODE_REGION_CONFIG_OPTIONS, config_resolver_2.NODE_REGION_CONFIG_FILE_OPTIONS),\n requestHandler: (_e = config === null || config === void 0 ? void 0 : config.requestHandler) !== null && _e !== void 0 ? _e : new node_http_handler_1.NodeHttpHandler(defaultConfigProvider),\n retryMode: (_f = config === null || config === void 0 ? void 0 : config.retryMode) !== null && _f !== void 0 ? _f : (0, node_config_provider_1.loadConfig)({\n ...middleware_retry_2.NODE_RETRY_MODE_CONFIG_OPTIONS,\n default: async () => (await defaultConfigProvider()).retryMode || util_retry_1.DEFAULT_RETRY_MODE,\n }),\n sha256: (_g = config === null || config === void 0 ? void 0 : config.sha256) !== null && _g !== void 0 ? _g : hash_node_1.Hash.bind(null, \"sha256\"),\n streamCollector: (_h = config === null || config === void 0 ? void 0 : config.streamCollector) !== null && _h !== void 0 ? _h : node_http_handler_1.streamCollector,\n useDualstackEndpoint: (_j = config === null || config === void 0 ? void 0 : config.useDualstackEndpoint) !== null && _j !== void 0 ? _j : (0, node_config_provider_1.loadConfig)(config_resolver_2.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS),\n useFipsEndpoint: (_k = config === null || config === void 0 ? void 0 : config.useFipsEndpoint) !== null && _k !== void 0 ? _k : (0, node_config_provider_1.loadConfig)(config_resolver_2.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS),\n };\n};\nconst region_config_resolver_1 = require(\"@aws-sdk/region-config-resolver\");\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst smithy_client_5 = require(\"@smithy/smithy-client\");\nvar asPartial = (t2) => t2;\nvar resolveRuntimeExtensions = (runtimeConfig, extensions) => {\n const extensionConfiguration = {\n ...asPartial((0, region_config_resolver_1.getAwsRegionExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, smithy_client_5.getDefaultExtensionConfiguration)(runtimeConfig)),\n ...asPartial((0, protocol_http_1.getHttpHandlerExtensionConfiguration)(runtimeConfig)),\n };\n extensions.forEach((extension) => extension.configure(extensionConfiguration));\n return {\n ...runtimeConfig,\n ...(0, region_config_resolver_1.resolveAwsRegionExtensionConfiguration)(extensionConfiguration),\n ...(0, smithy_client_5.resolveDefaultRuntimeConfig)(extensionConfiguration),\n ...(0, protocol_http_1.resolveHttpHandlerRuntimeConfig)(extensionConfiguration),\n };\n};\nvar SSOOIDCClient = class extends smithy_client_1.Client {\n constructor(...[configuration]) {\n const _config_0 = getRuntimeConfig2(configuration || {});\n const _config_1 = resolveClientEndpointParameters(_config_0);\n const _config_2 = (0, config_resolver_1.resolveRegionConfig)(_config_1);\n const _config_3 = (0, middleware_endpoint_1.resolveEndpointConfig)(_config_2);\n const _config_4 = (0, middleware_retry_1.resolveRetryConfig)(_config_3);\n const _config_5 = (0, middleware_host_header_1.resolveHostHeaderConfig)(_config_4);\n const _config_6 = (0, middleware_user_agent_1.resolveUserAgentConfig)(_config_5);\n const _config_7 = resolveRuntimeExtensions(_config_6, (configuration === null || configuration === void 0 ? void 0 : configuration.extensions) || []);\n super(_config_7);\n this.config = _config_7;\n this.middlewareStack.use((0, middleware_retry_1.getRetryPlugin)(this.config));\n this.middlewareStack.use((0, middleware_content_length_1.getContentLengthPlugin)(this.config));\n this.middlewareStack.use((0, middleware_host_header_1.getHostHeaderPlugin)(this.config));\n this.middlewareStack.use((0, middleware_logger_1.getLoggerPlugin)(this.config));\n this.middlewareStack.use((0, middleware_recursion_detection_1.getRecursionDetectionPlugin)(this.config));\n this.middlewareStack.use((0, middleware_user_agent_1.getUserAgentPlugin)(this.config));\n }\n destroy() {\n super.destroy();\n }\n};\nexports.SSOOIDCClient = SSOOIDCClient;\nconst smithy_client_6 = require(\"@smithy/smithy-client\");\nconst middleware_endpoint_2 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst smithy_client_7 = require(\"@smithy/smithy-client\");\nconst types_1 = require(\"@smithy/types\");\nconst protocol_http_2 = require(\"@smithy/protocol-http\");\nconst smithy_client_8 = require(\"@smithy/smithy-client\");\nconst smithy_client_9 = require(\"@smithy/smithy-client\");\nvar SSOOIDCServiceException = class _SSOOIDCServiceException extends smithy_client_9.ServiceException {\n constructor(options) {\n super(options);\n Object.setPrototypeOf(this, _SSOOIDCServiceException.prototype);\n }\n};\nvar AccessDeniedException = class _AccessDeniedException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"AccessDeniedException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"AccessDeniedException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _AccessDeniedException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.AccessDeniedException = AccessDeniedException;\nvar AuthorizationPendingException = class _AuthorizationPendingException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"AuthorizationPendingException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"AuthorizationPendingException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _AuthorizationPendingException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.AuthorizationPendingException = AuthorizationPendingException;\nvar ExpiredTokenException = class _ExpiredTokenException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"ExpiredTokenException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"ExpiredTokenException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _ExpiredTokenException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.ExpiredTokenException = ExpiredTokenException;\nvar InternalServerException = class _InternalServerException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InternalServerException\",\n $fault: \"server\",\n ...opts,\n });\n this.name = \"InternalServerException\";\n this.$fault = \"server\";\n Object.setPrototypeOf(this, _InternalServerException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.InternalServerException = InternalServerException;\nvar InvalidClientException = class _InvalidClientException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InvalidClientException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidClientException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _InvalidClientException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.InvalidClientException = InvalidClientException;\nvar InvalidGrantException = class _InvalidGrantException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InvalidGrantException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidGrantException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _InvalidGrantException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nvar InvalidRequestException = class _InvalidRequestException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InvalidRequestException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidRequestException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _InvalidRequestException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.InvalidRequestException = InvalidRequestException;\nvar InvalidScopeException = class _InvalidScopeException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InvalidScopeException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidScopeException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _InvalidScopeException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.InvalidScopeException = InvalidScopeException;\nvar SlowDownException = class _SlowDownException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"SlowDownException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"SlowDownException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _SlowDownException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.SlowDownException = SlowDownException;\nvar UnauthorizedClientException = class _UnauthorizedClientException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"UnauthorizedClientException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"UnauthorizedClientException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _UnauthorizedClientException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.UnauthorizedClientException = UnauthorizedClientException;\nvar UnsupportedGrantTypeException = class _UnsupportedGrantTypeException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"UnsupportedGrantTypeException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"UnsupportedGrantTypeException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _UnsupportedGrantTypeException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nexports.UnsupportedGrantTypeException = UnsupportedGrantTypeException;\nvar InvalidClientMetadataException = class _InvalidClientMetadataException extends SSOOIDCServiceException {\n constructor(opts) {\n super({\n name: \"InvalidClientMetadataException\",\n $fault: \"client\",\n ...opts,\n });\n this.name = \"InvalidClientMetadataException\";\n this.$fault = \"client\";\n Object.setPrototypeOf(this, _InvalidClientMetadataException.prototype);\n this.error = opts.error;\n this.error_description = opts.error_description;\n }\n};\nvar se_CreateTokenCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = {\n \"content-type\": \"application/json\",\n };\n const resolvedPath = `${(basePath === null || basePath === void 0 ? void 0 : basePath.endsWith(\"/\")) ? basePath.slice(0, -1) : basePath || \"\"}/token`;\n let body;\n body = JSON.stringify((0, smithy_client_8.take)(input, {\n clientId: [],\n clientSecret: [],\n code: [],\n deviceCode: [],\n grantType: [],\n redirectUri: [],\n refreshToken: [],\n scope: (_) => (0, smithy_client_8._json)(_),\n }));\n return new protocol_http_2.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"POST\",\n headers,\n path: resolvedPath,\n body,\n });\n};\nvar se_RegisterClientCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = {\n \"content-type\": \"application/json\",\n };\n const resolvedPath = `${(basePath === null || basePath === void 0 ? void 0 : basePath.endsWith(\"/\")) ? basePath.slice(0, -1) : basePath || \"\"}/client/register`;\n let body;\n body = JSON.stringify((0, smithy_client_8.take)(input, {\n clientName: [],\n clientType: [],\n scopes: (_) => (0, smithy_client_8._json)(_),\n }));\n return new protocol_http_2.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"POST\",\n headers,\n path: resolvedPath,\n body,\n });\n};\nvar se_StartDeviceAuthorizationCommand = async (input, context) => {\n const { hostname, protocol = \"https\", port, path: basePath } = await context.endpoint();\n const headers = {\n \"content-type\": \"application/json\",\n };\n const resolvedPath = `${(basePath === null || basePath === void 0 ? void 0 : basePath.endsWith(\"/\")) ? basePath.slice(0, -1) : basePath || \"\"}/device_authorization`;\n let body;\n body = JSON.stringify((0, smithy_client_8.take)(input, {\n clientId: [],\n clientSecret: [],\n startUrl: [],\n }));\n return new protocol_http_2.HttpRequest({\n protocol,\n hostname,\n port,\n method: \"POST\",\n headers,\n path: resolvedPath,\n body,\n });\n};\nvar de_CreateTokenCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_CreateTokenCommandError(output, context);\n }\n const contents = (0, smithy_client_8.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_8.expectNonNull)((0, smithy_client_8.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_8.take)(data, {\n accessToken: smithy_client_8.expectString,\n expiresIn: smithy_client_8.expectInt32,\n idToken: smithy_client_8.expectString,\n refreshToken: smithy_client_8.expectString,\n tokenType: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n return contents;\n};\nvar de_CreateTokenCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"AccessDeniedException\":\n case \"com.amazonaws.ssooidc#AccessDeniedException\":\n throw await de_AccessDeniedExceptionRes(parsedOutput, context);\n case \"AuthorizationPendingException\":\n case \"com.amazonaws.ssooidc#AuthorizationPendingException\":\n throw await de_AuthorizationPendingExceptionRes(parsedOutput, context);\n case \"ExpiredTokenException\":\n case \"com.amazonaws.ssooidc#ExpiredTokenException\":\n throw await de_ExpiredTokenExceptionRes(parsedOutput, context);\n case \"InternalServerException\":\n case \"com.amazonaws.ssooidc#InternalServerException\":\n throw await de_InternalServerExceptionRes(parsedOutput, context);\n case \"InvalidClientException\":\n case \"com.amazonaws.ssooidc#InvalidClientException\":\n throw await de_InvalidClientExceptionRes(parsedOutput, context);\n case \"InvalidGrantException\":\n case \"com.amazonaws.ssooidc#InvalidGrantException\":\n throw await de_InvalidGrantExceptionRes(parsedOutput, context);\n case \"InvalidRequestException\":\n case \"com.amazonaws.ssooidc#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"InvalidScopeException\":\n case \"com.amazonaws.ssooidc#InvalidScopeException\":\n throw await de_InvalidScopeExceptionRes(parsedOutput, context);\n case \"SlowDownException\":\n case \"com.amazonaws.ssooidc#SlowDownException\":\n throw await de_SlowDownExceptionRes(parsedOutput, context);\n case \"UnauthorizedClientException\":\n case \"com.amazonaws.ssooidc#UnauthorizedClientException\":\n throw await de_UnauthorizedClientExceptionRes(parsedOutput, context);\n case \"UnsupportedGrantTypeException\":\n case \"com.amazonaws.ssooidc#UnsupportedGrantTypeException\":\n throw await de_UnsupportedGrantTypeExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nvar de_RegisterClientCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_RegisterClientCommandError(output, context);\n }\n const contents = (0, smithy_client_8.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_8.expectNonNull)((0, smithy_client_8.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_8.take)(data, {\n authorizationEndpoint: smithy_client_8.expectString,\n clientId: smithy_client_8.expectString,\n clientIdIssuedAt: smithy_client_8.expectLong,\n clientSecret: smithy_client_8.expectString,\n clientSecretExpiresAt: smithy_client_8.expectLong,\n tokenEndpoint: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n return contents;\n};\nvar de_RegisterClientCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalServerException\":\n case \"com.amazonaws.ssooidc#InternalServerException\":\n throw await de_InternalServerExceptionRes(parsedOutput, context);\n case \"InvalidClientMetadataException\":\n case \"com.amazonaws.ssooidc#InvalidClientMetadataException\":\n throw await de_InvalidClientMetadataExceptionRes(parsedOutput, context);\n case \"InvalidRequestException\":\n case \"com.amazonaws.ssooidc#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"InvalidScopeException\":\n case \"com.amazonaws.ssooidc#InvalidScopeException\":\n throw await de_InvalidScopeExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nvar de_StartDeviceAuthorizationCommand = async (output, context) => {\n if (output.statusCode !== 200 && output.statusCode >= 300) {\n return de_StartDeviceAuthorizationCommandError(output, context);\n }\n const contents = (0, smithy_client_8.map)({\n $metadata: deserializeMetadata(output),\n });\n const data = (0, smithy_client_8.expectNonNull)((0, smithy_client_8.expectObject)(await parseBody(output.body, context)), \"body\");\n const doc = (0, smithy_client_8.take)(data, {\n deviceCode: smithy_client_8.expectString,\n expiresIn: smithy_client_8.expectInt32,\n interval: smithy_client_8.expectInt32,\n userCode: smithy_client_8.expectString,\n verificationUri: smithy_client_8.expectString,\n verificationUriComplete: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n return contents;\n};\nvar de_StartDeviceAuthorizationCommandError = async (output, context) => {\n const parsedOutput = {\n ...output,\n body: await parseErrorBody(output.body, context),\n };\n const errorCode = loadRestJsonErrorCode(output, parsedOutput.body);\n switch (errorCode) {\n case \"InternalServerException\":\n case \"com.amazonaws.ssooidc#InternalServerException\":\n throw await de_InternalServerExceptionRes(parsedOutput, context);\n case \"InvalidClientException\":\n case \"com.amazonaws.ssooidc#InvalidClientException\":\n throw await de_InvalidClientExceptionRes(parsedOutput, context);\n case \"InvalidRequestException\":\n case \"com.amazonaws.ssooidc#InvalidRequestException\":\n throw await de_InvalidRequestExceptionRes(parsedOutput, context);\n case \"SlowDownException\":\n case \"com.amazonaws.ssooidc#SlowDownException\":\n throw await de_SlowDownExceptionRes(parsedOutput, context);\n case \"UnauthorizedClientException\":\n case \"com.amazonaws.ssooidc#UnauthorizedClientException\":\n throw await de_UnauthorizedClientExceptionRes(parsedOutput, context);\n default:\n const parsedBody = parsedOutput.body;\n return throwDefaultError({\n output,\n parsedBody,\n errorCode,\n });\n }\n};\nvar throwDefaultError = (0, smithy_client_8.withBaseException)(SSOOIDCServiceException);\nvar de_AccessDeniedExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new AccessDeniedException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_AuthorizationPendingExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new AuthorizationPendingException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_ExpiredTokenExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new ExpiredTokenException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InternalServerExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InternalServerException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InvalidClientExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InvalidClientException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InvalidClientMetadataExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InvalidClientMetadataException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InvalidGrantExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InvalidGrantException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InvalidRequestExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InvalidRequestException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_InvalidScopeExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new InvalidScopeException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_SlowDownExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new SlowDownException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_UnauthorizedClientExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new UnauthorizedClientException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar de_UnsupportedGrantTypeExceptionRes = async (parsedOutput, context) => {\n const contents = (0, smithy_client_8.map)({});\n const data = parsedOutput.body;\n const doc = (0, smithy_client_8.take)(data, {\n error: smithy_client_8.expectString,\n error_description: smithy_client_8.expectString,\n });\n Object.assign(contents, doc);\n const exception = new UnsupportedGrantTypeException({\n $metadata: deserializeMetadata(parsedOutput),\n ...contents,\n });\n return (0, smithy_client_8.decorateServiceException)(exception, parsedOutput.body);\n};\nvar deserializeMetadata = (output) => {\n var _a, _b;\n return ({\n httpStatusCode: output.statusCode,\n requestId: (_b = (_a = output.headers[\"x-amzn-requestid\"]) !== null && _a !== void 0 ? _a : output.headers[\"x-amzn-request-id\"]) !== null && _b !== void 0 ? _b : output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n });\n};\nvar collectBodyString = (streamBody, context) => (0, smithy_client_8.collectBody)(streamBody, context).then((body) => context.utf8Encoder(body));\nvar parseBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {\n if (encoded.length) {\n return JSON.parse(encoded);\n }\n return {};\n});\nvar parseErrorBody = async (errorBody, context) => {\n var _a;\n const value = await parseBody(errorBody, context);\n value.message = (_a = value.message) !== null && _a !== void 0 ? _a : value.Message;\n return value;\n};\nvar loadRestJsonErrorCode = (output, data) => {\n const findKey = (object, key) => Object.keys(object).find((k2) => k2.toLowerCase() === key.toLowerCase());\n const sanitizeErrorCode = (rawValue) => {\n let cleanValue = rawValue;\n if (typeof cleanValue === \"number\") {\n cleanValue = cleanValue.toString();\n }\n if (cleanValue.indexOf(\",\") >= 0) {\n cleanValue = cleanValue.split(\",\")[0];\n }\n if (cleanValue.indexOf(\":\") >= 0) {\n cleanValue = cleanValue.split(\":\")[0];\n }\n if (cleanValue.indexOf(\"#\") >= 0) {\n cleanValue = cleanValue.split(\"#\")[1];\n }\n return cleanValue;\n };\n const headerKey = findKey(output.headers, \"x-amzn-errortype\");\n if (headerKey !== void 0) {\n return sanitizeErrorCode(output.headers[headerKey]);\n }\n if (data.code !== void 0) {\n return sanitizeErrorCode(data.code);\n }\n if (data[\"__type\"] !== void 0) {\n return sanitizeErrorCode(data[\"__type\"]);\n }\n};\nvar CreateTokenCommand = class _CreateTokenCommand extends smithy_client_7.Command {\n constructor(input) {\n super();\n this.input = input;\n }\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_1.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_2.getEndpointPlugin)(configuration, _CreateTokenCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOOIDCClient\";\n const commandName = \"CreateTokenCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_1.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSSOOIDCService\",\n operation: \"CreateToken\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return se_CreateTokenCommand(input, context);\n }\n deserialize(output, context) {\n return de_CreateTokenCommand(output, context);\n }\n};\nexports.CreateTokenCommand = CreateTokenCommand;\nconst middleware_endpoint_3 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_2 = require(\"@smithy/middleware-serde\");\nconst smithy_client_10 = require(\"@smithy/smithy-client\");\nconst types_2 = require(\"@smithy/types\");\nvar RegisterClientCommand = class _RegisterClientCommand extends smithy_client_10.Command {\n constructor(input) {\n super();\n this.input = input;\n }\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_2.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_3.getEndpointPlugin)(configuration, _RegisterClientCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOOIDCClient\";\n const commandName = \"RegisterClientCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_2.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSSOOIDCService\",\n operation: \"RegisterClient\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return se_RegisterClientCommand(input, context);\n }\n deserialize(output, context) {\n return de_RegisterClientCommand(output, context);\n }\n};\nconst middleware_endpoint_4 = require(\"@smithy/middleware-endpoint\");\nconst middleware_serde_3 = require(\"@smithy/middleware-serde\");\nconst smithy_client_11 = require(\"@smithy/smithy-client\");\nconst types_3 = require(\"@smithy/types\");\nvar StartDeviceAuthorizationCommand = class _StartDeviceAuthorizationCommand extends smithy_client_11.Command {\n constructor(input) {\n super();\n this.input = input;\n }\n static getEndpointParameterInstructions() {\n return {\n UseFIPS: { type: \"builtInParams\", name: \"useFipsEndpoint\" },\n Endpoint: { type: \"builtInParams\", name: \"endpoint\" },\n Region: { type: \"builtInParams\", name: \"region\" },\n UseDualStack: { type: \"builtInParams\", name: \"useDualstackEndpoint\" },\n };\n }\n resolveMiddleware(clientStack, configuration, options) {\n this.middlewareStack.use((0, middleware_serde_3.getSerdePlugin)(configuration, this.serialize, this.deserialize));\n this.middlewareStack.use((0, middleware_endpoint_4.getEndpointPlugin)(configuration, _StartDeviceAuthorizationCommand.getEndpointParameterInstructions()));\n const stack = clientStack.concat(this.middlewareStack);\n const { logger } = configuration;\n const clientName = \"SSOOIDCClient\";\n const commandName = \"StartDeviceAuthorizationCommand\";\n const handlerExecutionContext = {\n logger,\n clientName,\n commandName,\n inputFilterSensitiveLog: (_) => _,\n outputFilterSensitiveLog: (_) => _,\n [types_3.SMITHY_CONTEXT_KEY]: {\n service: \"AWSSSOOIDCService\",\n operation: \"StartDeviceAuthorization\",\n },\n };\n const { requestHandler } = configuration;\n return stack.resolve((request) => requestHandler.handle(request.request, options || {}), handlerExecutionContext);\n }\n serialize(input, context) {\n return se_StartDeviceAuthorizationCommand(input, context);\n }\n deserialize(output, context) {\n return de_StartDeviceAuthorizationCommand(output, context);\n }\n};\nvar commands = {\n CreateTokenCommand,\n RegisterClientCommand,\n StartDeviceAuthorizationCommand,\n};\nvar SSOOIDC = class extends SSOOIDCClient {\n};\n(0, smithy_client_6.createAggregatedClient)(commands, SSOOIDC);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.REFRESH_MESSAGE = exports.EXPIRE_WINDOW_MS = void 0;\nexports.EXPIRE_WINDOW_MS = 5 * 60 * 1000;\nexports.REFRESH_MESSAGE = `To refresh this SSO session run 'aws sso login' with the corresponding profile.`;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromSso = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst constants_1 = require(\"./constants\");\nconst getNewSsoOidcToken_1 = require(\"./getNewSsoOidcToken\");\nconst validateTokenExpiry_1 = require(\"./validateTokenExpiry\");\nconst validateTokenKey_1 = require(\"./validateTokenKey\");\nconst writeSSOTokenToFile_1 = require(\"./writeSSOTokenToFile\");\nconst lastRefreshAttemptTime = new Date(0);\nconst fromSso = (init = {}) => async () => {\n const profiles = await (0, shared_ini_file_loader_1.parseKnownFiles)(init);\n const profileName = (0, shared_ini_file_loader_1.getProfileName)(init);\n const profile = profiles[profileName];\n if (!profile) {\n throw new property_provider_1.TokenProviderError(`Profile '${profileName}' could not be found in shared credentials file.`, false);\n }\n else if (!profile[\"sso_session\"]) {\n throw new property_provider_1.TokenProviderError(`Profile '${profileName}' is missing required property 'sso_session'.`);\n }\n const ssoSessionName = profile[\"sso_session\"];\n const ssoSessions = await (0, shared_ini_file_loader_1.loadSsoSessionData)(init);\n const ssoSession = ssoSessions[ssoSessionName];\n if (!ssoSession) {\n throw new property_provider_1.TokenProviderError(`Sso session '${ssoSessionName}' could not be found in shared credentials file.`, false);\n }\n for (const ssoSessionRequiredKey of [\"sso_start_url\", \"sso_region\"]) {\n if (!ssoSession[ssoSessionRequiredKey]) {\n throw new property_provider_1.TokenProviderError(`Sso session '${ssoSessionName}' is missing required property '${ssoSessionRequiredKey}'.`, false);\n }\n }\n const ssoStartUrl = ssoSession[\"sso_start_url\"];\n const ssoRegion = ssoSession[\"sso_region\"];\n let ssoToken;\n try {\n ssoToken = await (0, shared_ini_file_loader_1.getSSOTokenFromFile)(ssoSessionName);\n }\n catch (e) {\n throw new property_provider_1.TokenProviderError(`The SSO session token associated with profile=${profileName} was not found or is invalid. ${constants_1.REFRESH_MESSAGE}`, false);\n }\n (0, validateTokenKey_1.validateTokenKey)(\"accessToken\", ssoToken.accessToken);\n (0, validateTokenKey_1.validateTokenKey)(\"expiresAt\", ssoToken.expiresAt);\n const { accessToken, expiresAt } = ssoToken;\n const existingToken = { token: accessToken, expiration: new Date(expiresAt) };\n if (existingToken.expiration.getTime() - Date.now() > constants_1.EXPIRE_WINDOW_MS) {\n return existingToken;\n }\n if (Date.now() - lastRefreshAttemptTime.getTime() < 30 * 1000) {\n (0, validateTokenExpiry_1.validateTokenExpiry)(existingToken);\n return existingToken;\n }\n (0, validateTokenKey_1.validateTokenKey)(\"clientId\", ssoToken.clientId, true);\n (0, validateTokenKey_1.validateTokenKey)(\"clientSecret\", ssoToken.clientSecret, true);\n (0, validateTokenKey_1.validateTokenKey)(\"refreshToken\", ssoToken.refreshToken, true);\n try {\n lastRefreshAttemptTime.setTime(Date.now());\n const newSsoOidcToken = await (0, getNewSsoOidcToken_1.getNewSsoOidcToken)(ssoToken, ssoRegion);\n (0, validateTokenKey_1.validateTokenKey)(\"accessToken\", newSsoOidcToken.accessToken);\n (0, validateTokenKey_1.validateTokenKey)(\"expiresIn\", newSsoOidcToken.expiresIn);\n const newTokenExpiration = new Date(Date.now() + newSsoOidcToken.expiresIn * 1000);\n try {\n await (0, writeSSOTokenToFile_1.writeSSOTokenToFile)(ssoSessionName, {\n ...ssoToken,\n accessToken: newSsoOidcToken.accessToken,\n expiresAt: newTokenExpiration.toISOString(),\n refreshToken: newSsoOidcToken.refreshToken,\n });\n }\n catch (error) {\n }\n return {\n token: newSsoOidcToken.accessToken,\n expiration: newTokenExpiration,\n };\n }\n catch (error) {\n (0, validateTokenExpiry_1.validateTokenExpiry)(existingToken);\n return existingToken;\n }\n};\nexports.fromSso = fromSso;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromStatic = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromStatic = ({ token }) => async () => {\n if (!token || !token.token) {\n throw new property_provider_1.TokenProviderError(`Please pass a valid token to fromStatic`, false);\n }\n return token;\n};\nexports.fromStatic = fromStatic;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getNewSsoOidcToken = void 0;\nconst client_sso_oidc_node_1 = require(\"./bundle/client-sso-oidc-node\");\nconst getSsoOidcClient_1 = require(\"./getSsoOidcClient\");\nconst getNewSsoOidcToken = (ssoToken, ssoRegion) => {\n const ssoOidcClient = (0, getSsoOidcClient_1.getSsoOidcClient)(ssoRegion);\n return ssoOidcClient.send(new client_sso_oidc_node_1.CreateTokenCommand({\n clientId: ssoToken.clientId,\n clientSecret: ssoToken.clientSecret,\n refreshToken: ssoToken.refreshToken,\n grantType: \"refresh_token\",\n }));\n};\nexports.getNewSsoOidcToken = getNewSsoOidcToken;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSsoOidcClient = void 0;\nconst client_sso_oidc_node_1 = require(\"./bundle/client-sso-oidc-node\");\nconst ssoOidcClientsHash = {};\nconst getSsoOidcClient = (ssoRegion) => {\n if (ssoOidcClientsHash[ssoRegion]) {\n return ssoOidcClientsHash[ssoRegion];\n }\n const ssoOidcClient = new client_sso_oidc_node_1.SSOOIDCClient({ region: ssoRegion });\n ssoOidcClientsHash[ssoRegion] = ssoOidcClient;\n return ssoOidcClient;\n};\nexports.getSsoOidcClient = getSsoOidcClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./bundle/client-sso-oidc-node\"), exports);\ntslib_1.__exportStar(require(\"./fromSso\"), exports);\ntslib_1.__exportStar(require(\"./fromStatic\"), exports);\ntslib_1.__exportStar(require(\"./nodeProvider\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.nodeProvider = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromSso_1 = require(\"./fromSso\");\nconst nodeProvider = (init = {}) => (0, property_provider_1.memoize)((0, property_provider_1.chain)((0, fromSso_1.fromSso)(init), async () => {\n throw new property_provider_1.TokenProviderError(\"Could not load token from any providers\", false);\n}), (token) => token.expiration !== undefined && token.expiration.getTime() - Date.now() < 300000, (token) => token.expiration !== undefined);\nexports.nodeProvider = nodeProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateTokenExpiry = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst constants_1 = require(\"./constants\");\nconst validateTokenExpiry = (token) => {\n if (token.expiration && token.expiration.getTime() < Date.now()) {\n throw new property_provider_1.TokenProviderError(`Token is expired. ${constants_1.REFRESH_MESSAGE}`, false);\n }\n};\nexports.validateTokenExpiry = validateTokenExpiry;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateTokenKey = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst constants_1 = require(\"./constants\");\nconst validateTokenKey = (key, value, forRefresh = false) => {\n if (typeof value === \"undefined\") {\n throw new property_provider_1.TokenProviderError(`Value not present for '${key}' in SSO Token${forRefresh ? \". Cannot refresh\" : \"\"}. ${constants_1.REFRESH_MESSAGE}`, false);\n }\n};\nexports.validateTokenKey = validateTokenKey;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.writeSSOTokenToFile = void 0;\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst fs_1 = require(\"fs\");\nconst { writeFile } = fs_1.promises;\nconst writeSSOTokenToFile = (id, ssoToken) => {\n const tokenFilepath = (0, shared_ini_file_loader_1.getSSOTokenFilepath)(id);\n const tokenString = JSON.stringify(ssoToken, null, 2);\n return writeFile(tokenFilepath, tokenString);\n};\nexports.writeSSOTokenToFile = writeSSOTokenToFile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst util_endpoints_1 = require(\"@smithy/util-endpoints\");\nconst isVirtualHostableS3Bucket_1 = require(\"./lib/aws/isVirtualHostableS3Bucket\");\nconst parseArn_1 = require(\"./lib/aws/parseArn\");\nconst partition_1 = require(\"./lib/aws/partition\");\nconst awsEndpointFunctions = {\n isVirtualHostableS3Bucket: isVirtualHostableS3Bucket_1.isVirtualHostableS3Bucket,\n parseArn: parseArn_1.parseArn,\n partition: partition_1.partition,\n};\nutil_endpoints_1.customEndpointFunctions.aws = awsEndpointFunctions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./aws\"), exports);\ntslib_1.__exportStar(require(\"./lib/aws/partition\"), exports);\ntslib_1.__exportStar(require(\"./lib/isIpAddress\"), exports);\ntslib_1.__exportStar(require(\"./resolveEndpoint\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isVirtualHostableS3Bucket = void 0;\nconst util_endpoints_1 = require(\"@smithy/util-endpoints\");\nconst isIpAddress_1 = require(\"../isIpAddress\");\nconst isVirtualHostableS3Bucket = (value, allowSubDomains = false) => {\n if (allowSubDomains) {\n for (const label of value.split(\".\")) {\n if (!(0, exports.isVirtualHostableS3Bucket)(label)) {\n return false;\n }\n }\n return true;\n }\n if (!(0, util_endpoints_1.isValidHostLabel)(value)) {\n return false;\n }\n if (value.length < 3 || value.length > 63) {\n return false;\n }\n if (value !== value.toLowerCase()) {\n return false;\n }\n if ((0, isIpAddress_1.isIpAddress)(value)) {\n return false;\n }\n return true;\n};\nexports.isVirtualHostableS3Bucket = isVirtualHostableS3Bucket;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseArn = void 0;\nconst parseArn = (value) => {\n const segments = value.split(\":\");\n if (segments.length < 6)\n return null;\n const [arn, partition, service, region, accountId, ...resourceId] = segments;\n if (arn !== \"arn\" || partition === \"\" || service === \"\" || resourceId[0] === \"\")\n return null;\n return {\n partition,\n service,\n region,\n accountId,\n resourceId: resourceId[0].includes(\"/\") ? resourceId[0].split(\"/\") : resourceId,\n };\n};\nexports.parseArn = parseArn;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getUserAgentPrefix = exports.useDefaultPartitionInfo = exports.setPartitionInfo = exports.partition = void 0;\nconst tslib_1 = require(\"tslib\");\nconst partitions_json_1 = tslib_1.__importDefault(require(\"./partitions.json\"));\nlet selectedPartitionsInfo = partitions_json_1.default;\nlet selectedUserAgentPrefix = \"\";\nconst partition = (value) => {\n const { partitions } = selectedPartitionsInfo;\n for (const partition of partitions) {\n const { regions, outputs } = partition;\n for (const [region, regionData] of Object.entries(regions)) {\n if (region === value) {\n return {\n ...outputs,\n ...regionData,\n };\n }\n }\n }\n for (const partition of partitions) {\n const { regionRegex, outputs } = partition;\n if (new RegExp(regionRegex).test(value)) {\n return {\n ...outputs,\n };\n }\n }\n const DEFAULT_PARTITION = partitions.find((partition) => partition.id === \"aws\");\n if (!DEFAULT_PARTITION) {\n throw new Error(\"Provided region was not found in the partition array or regex,\" +\n \" and default partition with id 'aws' doesn't exist.\");\n }\n return {\n ...DEFAULT_PARTITION.outputs,\n };\n};\nexports.partition = partition;\nconst setPartitionInfo = (partitionsInfo, userAgentPrefix = \"\") => {\n selectedPartitionsInfo = partitionsInfo;\n selectedUserAgentPrefix = userAgentPrefix;\n};\nexports.setPartitionInfo = setPartitionInfo;\nconst useDefaultPartitionInfo = () => {\n (0, exports.setPartitionInfo)(partitions_json_1.default, \"\");\n};\nexports.useDefaultPartitionInfo = useDefaultPartitionInfo;\nconst getUserAgentPrefix = () => selectedUserAgentPrefix;\nexports.getUserAgentPrefix = getUserAgentPrefix;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isIpAddress = void 0;\nvar util_endpoints_1 = require(\"@smithy/util-endpoints\");\nObject.defineProperty(exports, \"isIpAddress\", { enumerable: true, get: function () { return util_endpoints_1.isIpAddress; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveEndpoint = void 0;\nvar util_endpoints_1 = require(\"@smithy/util-endpoints\");\nObject.defineProperty(exports, \"resolveEndpoint\", { enumerable: true, get: function () { return util_endpoints_1.resolveEndpoint; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EndpointError = void 0;\nvar util_endpoints_1 = require(\"@smithy/util-endpoints\");\nObject.defineProperty(exports, \"EndpointError\", { enumerable: true, get: function () { return util_endpoints_1.EndpointError; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./EndpointError\"), exports);\ntslib_1.__exportStar(require(\"./EndpointRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./ErrorRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./RuleSetObject\"), exports);\ntslib_1.__exportStar(require(\"./TreeRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./shared\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.crtAvailability = void 0;\nexports.crtAvailability = {\n isCrtAvailable: false,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultUserAgent = exports.UA_APP_ID_INI_NAME = exports.UA_APP_ID_ENV_NAME = exports.crtAvailability = void 0;\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst os_1 = require(\"os\");\nconst process_1 = require(\"process\");\nconst is_crt_available_1 = require(\"./is-crt-available\");\nvar crt_availability_1 = require(\"./crt-availability\");\nObject.defineProperty(exports, \"crtAvailability\", { enumerable: true, get: function () { return crt_availability_1.crtAvailability; } });\nexports.UA_APP_ID_ENV_NAME = \"AWS_SDK_UA_APP_ID\";\nexports.UA_APP_ID_INI_NAME = \"sdk-ua-app-id\";\nconst defaultUserAgent = ({ serviceId, clientVersion }) => {\n const sections = [\n [\"aws-sdk-js\", clientVersion],\n [\"ua\", \"2.0\"],\n [`os/${(0, os_1.platform)()}`, (0, os_1.release)()],\n [\"lang/js\"],\n [\"md/nodejs\", `${process_1.versions.node}`],\n ];\n const crtAvailable = (0, is_crt_available_1.isCrtAvailable)();\n if (crtAvailable) {\n sections.push(crtAvailable);\n }\n if (serviceId) {\n sections.push([`api/${serviceId}`, clientVersion]);\n }\n if (process_1.env.AWS_EXECUTION_ENV) {\n sections.push([`exec-env/${process_1.env.AWS_EXECUTION_ENV}`]);\n }\n const appIdPromise = (0, node_config_provider_1.loadConfig)({\n environmentVariableSelector: (env) => env[exports.UA_APP_ID_ENV_NAME],\n configFileSelector: (profile) => profile[exports.UA_APP_ID_INI_NAME],\n default: undefined,\n })();\n let resolvedUserAgent = undefined;\n return async () => {\n if (!resolvedUserAgent) {\n const appId = await appIdPromise;\n resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections];\n }\n return resolvedUserAgent;\n };\n};\nexports.defaultUserAgent = defaultUserAgent;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isCrtAvailable = void 0;\nconst crt_availability_1 = require(\"./crt-availability\");\nconst isCrtAvailable = () => {\n if (crt_availability_1.crtAvailability.isCrtAvailable) {\n return [\"md/crt-avail\"];\n }\n return null;\n};\nexports.isCrtAvailable = isCrtAvailable;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nconst pureJs_1 = require(\"./pureJs\");\nconst whatwgEncodingApi_1 = require(\"./whatwgEncodingApi\");\nconst fromUtf8 = (input) => typeof TextEncoder === \"function\" ? (0, whatwgEncodingApi_1.fromUtf8)(input) : (0, pureJs_1.fromUtf8)(input);\nexports.fromUtf8 = fromUtf8;\nconst toUtf8 = (input) => typeof TextDecoder === \"function\" ? (0, whatwgEncodingApi_1.toUtf8)(input) : (0, pureJs_1.toUtf8)(input);\nexports.toUtf8 = toUtf8;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nconst fromUtf8 = (input) => {\n const bytes = [];\n for (let i = 0, len = input.length; i < len; i++) {\n const value = input.charCodeAt(i);\n if (value < 0x80) {\n bytes.push(value);\n }\n else if (value < 0x800) {\n bytes.push((value >> 6) | 0b11000000, (value & 0b111111) | 0b10000000);\n }\n else if (i + 1 < input.length && (value & 0xfc00) === 0xd800 && (input.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\n const surrogatePair = 0x10000 + ((value & 0b1111111111) << 10) + (input.charCodeAt(++i) & 0b1111111111);\n bytes.push((surrogatePair >> 18) | 0b11110000, ((surrogatePair >> 12) & 0b111111) | 0b10000000, ((surrogatePair >> 6) & 0b111111) | 0b10000000, (surrogatePair & 0b111111) | 0b10000000);\n }\n else {\n bytes.push((value >> 12) | 0b11100000, ((value >> 6) & 0b111111) | 0b10000000, (value & 0b111111) | 0b10000000);\n }\n }\n return Uint8Array.from(bytes);\n};\nexports.fromUtf8 = fromUtf8;\nconst toUtf8 = (input) => {\n let decoded = \"\";\n for (let i = 0, len = input.length; i < len; i++) {\n const byte = input[i];\n if (byte < 0x80) {\n decoded += String.fromCharCode(byte);\n }\n else if (0b11000000 <= byte && byte < 0b11100000) {\n const nextByte = input[++i];\n decoded += String.fromCharCode(((byte & 0b11111) << 6) | (nextByte & 0b111111));\n }\n else if (0b11110000 <= byte && byte < 0b101101101) {\n const surrogatePair = [byte, input[++i], input[++i], input[++i]];\n const encoded = \"%\" + surrogatePair.map((byteValue) => byteValue.toString(16)).join(\"%\");\n decoded += decodeURIComponent(encoded);\n }\n else {\n decoded += String.fromCharCode(((byte & 0b1111) << 12) | ((input[++i] & 0b111111) << 6) | (input[++i] & 0b111111));\n }\n }\n return decoded;\n};\nexports.toUtf8 = toUtf8;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = exports.fromUtf8 = void 0;\nfunction fromUtf8(input) {\n return new TextEncoder().encode(input);\n}\nexports.fromUtf8 = fromUtf8;\nfunction toUtf8(input) {\n return new TextDecoder(\"utf-8\").decode(input);\n}\nexports.toUtf8 = toUtf8;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Database = void 0;\nconst entity_1 = require(\"./entity\");\nconst relationship_1 = require(\"./relationship\");\nclass Database {\n static entitiesOnly(entities) {\n return new Database(entities, relationship_1.NO_RELATIONSHIPS);\n }\n constructor(entities, relationships) {\n this.idCtr = 0;\n this.schema = {\n ...entities,\n ...relationships({\n relationship: (fromKey, toKey) => (0, relationship_1.relationshipCollection)((id) => this.get(fromKey, id), (id) => this.get(toKey, id)),\n }),\n };\n }\n id() {\n return `${this.idCtr++}`;\n }\n /**\n * Allocate an ID and store\n */\n allocate(key, entity) {\n return this.store(key, this.e(entity));\n }\n /**\n * Store with a preallocated ID\n */\n store(key, entity) {\n const coll = this.schema[key];\n coll.add(entity);\n return entity;\n }\n /**\n * Get an entity by key\n */\n get(key, id) {\n const coll = this.schema[key];\n const ret = coll.entities.get(typeof id === 'string' ? id : id.$ref);\n if (!ret) {\n throw new Error(`No such ${String(key)}: ${id}`);\n }\n return ret;\n }\n /**\n * All entities of a given type\n */\n all(key) {\n const coll = this.schema[key];\n return Array.from(coll.entities.values());\n }\n /**\n * Lookup an entity by index\n */\n lookup(key, index, lookup, value) {\n const coll = this.schema[key];\n const ids = coll.indexes[index].lookups[lookup](value);\n return addOnlyMethod(ids.map((id) => coll.entities.get(id)), `${String(key)} with ${String(index)} ${String(lookup)} ${JSON.stringify(value)}`);\n }\n /**\n * Allocate an ID and store if the entity does not yet exist\n */\n findOrAllocate(key, index, lookup, entity) {\n const res = this.lookup(key, index, lookup, entity[index]);\n if (res.length) {\n return res.only();\n }\n return this.allocate(key, entity);\n }\n link(key, from, to, attributes) {\n const col = this.schema[key];\n col.add(from, to, attributes);\n }\n /**\n * Follow a link\n */\n follow(key, from) {\n var _a;\n const col = this.schema[key];\n const toLinks = (_a = col.forward.get(from.$id)) !== null && _a !== void 0 ? _a : [];\n const ret = toLinks.map((i) => ({ entity: col.toColl(i.$id), ...removeId(i) }));\n return addOnlyMethod(ret, `${String(key)} from ${from}`);\n }\n /**\n * Follow incoming links backwards\n */\n incoming(key, to) {\n var _a;\n const col = this.schema[key];\n const fromIds = (_a = col.backward.get(to.$id)) !== null && _a !== void 0 ? _a : [];\n const ret = fromIds.map((i) => ({ entity: col.fromColl(i.$id), ...removeId(i) }));\n return addOnlyMethod(ret, `${String(key)} to ${to}`);\n }\n e(entity) {\n return {\n $id: this.id(),\n ...entity,\n };\n }\n /**\n * Turn the current database collection into something that can be stored.\n */\n save() {\n return {\n idCtr: this.idCtr,\n schema: dehydrate(this.schema),\n };\n function dehydrate(x) {\n if ((0, entity_1.isEntityCollection)(x)) {\n return x.dehydrate();\n }\n if ((0, relationship_1.isRelationshipCollection)(x)) {\n return x.dehydrate();\n }\n if (Array.isArray(x)) {\n return x.map(dehydrate);\n }\n if (!!x && typeof x === 'object') {\n return Object.fromEntries(Object.entries(x).map(([k, v]) => [k, dehydrate(v)]));\n }\n return x;\n }\n }\n load(db) {\n this.idCtr = db.idCtr;\n hydrate(this.schema, db.schema);\n function hydrate(proto, x) {\n if ((0, entity_1.isEntityCollection)(proto)) {\n proto.hydrateFrom(x);\n }\n if ((0, relationship_1.isRelationshipCollection)(proto)) {\n proto.hydrateFrom(x);\n }\n if (Array.isArray(x)) {\n x.forEach(hydrate);\n }\n if (!!proto && typeof proto === 'object' && !!x && typeof x === 'object') {\n for (const [k, v] of Object.entries(proto)) {\n hydrate(v, x[k]);\n }\n }\n }\n }\n}\nexports.Database = Database;\nfunction removeId(x) {\n const ret = { ...x };\n delete ret.$id;\n return ret;\n}\nfunction addOnlyMethod(xs, description) {\n return Object.defineProperties(xs, {\n only: {\n enumerable: false,\n value: () => {\n if (xs.length !== 1) {\n throw new Error(`Expected exactly 1 ${description}, found ${xs.length}`);\n }\n return xs[0];\n },\n },\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUNBQXVHO0FBQ3ZHLGlEQU13QjtBQVN4QixNQUFhLFFBQVE7SUFDWixNQUFNLENBQUMsWUFBWSxDQUFvQixRQUFZO1FBQ3hELE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLCtCQUFnQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUtELFlBQVksUUFBWSxFQUFFLGFBQWtEO1FBRnBFLFVBQUssR0FBRyxDQUFDLENBQUM7UUFHaEIsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLEdBQUcsUUFBUTtZQUNYLEdBQUcsYUFBYSxDQUFDO2dCQUNmLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUMvQixJQUFBLHFDQUFzQixFQUNwQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQzdCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FDNUI7YUFDSixDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTSxFQUFFO1FBQ1AsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBcUIsR0FBTSxFQUFFLE1BQWdDO1FBQzFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBcUIsR0FBTSxFQUFFLE1BQXlCO1FBQ2hFLE1BQU0sSUFBSSxHQUEwQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBUSxDQUFDO1FBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakIsT0FBTyxNQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksR0FBRyxDQUFxQixHQUFNLEVBQUUsRUFBeUM7UUFDOUUsTUFBTSxJQUFJLEdBQTBCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFRLENBQUM7UUFDNUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7O09BRUc7SUFDSSxHQUFHLENBQXFCLEdBQU07UUFDbkMsTUFBTSxJQUFJLEdBQTBCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFRLENBQUM7UUFDNUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQ1gsR0FBTSxFQUNOLEtBQVEsRUFDUixNQUFvQyxFQUNwQyxLQUFxQztRQUVyQyxNQUFNLElBQUksR0FBMEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVEsQ0FBQztRQUM1RCxNQUFNLEdBQUcsR0FBSSxJQUFJLENBQUMsT0FBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRSxPQUFPLGFBQWEsQ0FDbEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDOUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ2xGLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxjQUFjLENBQ25CLEdBQU0sRUFDTixLQUFRLEVBQ1IsTUFBb0MsRUFDcEMsTUFBZ0M7UUFFaEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7WUFDZCxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNuQjtRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQWNNLElBQUksQ0FDVCxHQUFNLEVBQ04sSUFBNEIsRUFDNUIsRUFBd0IsRUFDeEIsVUFBbUM7UUFFbkMsTUFBTSxHQUFHLEdBQWdDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFRLENBQUM7UUFDakUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FDWCxHQUFNLEVBQ04sSUFBNEI7O1FBRTVCLE1BQU0sR0FBRyxHQUFnQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBUSxDQUFDO1FBQ2pFLE1BQU0sT0FBTyxHQUFHLE1BQUEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQ0FBSSxFQUFFLENBQUM7UUFDaEQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBVSxDQUFBLENBQUMsQ0FBQztRQUV2RixPQUFPLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQ2IsR0FBTSxFQUNOLEVBQXdCOztRQUV4QixNQUFNLEdBQUcsR0FBZ0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVEsQ0FBQztRQUNqRSxNQUFNLE9BQU8sR0FBRyxNQUFBLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsbUNBQUksRUFBRSxDQUFDO1FBQy9DLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQVUsQ0FBQSxDQUFDLENBQUM7UUFFekYsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLENBQUMsQ0FBbUIsTUFBZ0I7UUFDekMsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2QsR0FBRyxNQUFNO1NBQ0gsQ0FBQztJQUNYLENBQUM7SUFFRDs7T0FFRztJQUNJLElBQUk7UUFDVCxPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUMvQixDQUFDO1FBRUYsU0FBUyxTQUFTLENBQUMsQ0FBVTtZQUMzQixJQUFJLElBQUEsMkJBQWtCLEVBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxJQUFBLHVDQUF3QixFQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUMvQixPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUN0QjtZQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3pCO1lBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDaEMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqRjtZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFFTSxJQUFJLENBQUMsRUFBc0I7UUFDaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVoQyxTQUFTLE9BQU8sQ0FBQyxLQUFjLEVBQUUsQ0FBVTtZQUN6QyxJQUFJLElBQUEsMkJBQWtCLEVBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzdCLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEI7WUFDRCxJQUFJLElBQUEsdUNBQXdCLEVBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ25DLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEI7WUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDcEI7WUFDRCxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO2dCQUN4RSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDMUMsT0FBTyxDQUFDLENBQUMsRUFBRyxDQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0I7YUFDRjtRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF0TUQsNEJBc01DO0FBT0QsU0FBUyxRQUFRLENBQW1CLENBQUk7SUFDdEMsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ3JCLE9BQVEsR0FBVyxDQUFDLEdBQUcsQ0FBQztJQUN4QixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFzQ0QsU0FBUyxhQUFhLENBQUksRUFBTyxFQUFFLFdBQW1CO0lBQ3BELE9BQU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRTtRQUNqQyxJQUFJLEVBQUU7WUFDSixVQUFVLEVBQUUsS0FBSztZQUNqQixLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLFdBQVcsV0FBVyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDMUU7Z0JBQ0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixDQUFDO1NBQ0Y7S0FDRixDQUFRLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlDb2xsZWN0aW9uLCBFbnRpdHlJbmRleCwgaXNFbnRpdHlDb2xsZWN0aW9uLCBQbGFpbiwgUmVmZXJlbmNlIH0gZnJvbSAnLi9lbnRpdHknO1xuaW1wb3J0IHtcbiAgaXNSZWxhdGlvbnNoaXBDb2xsZWN0aW9uLFxuICBOT19SRUxBVElPTlNISVBTLFxuICBSZWxhdGlvbnNoaXAsXG4gIHJlbGF0aW9uc2hpcENvbGxlY3Rpb24sXG4gIFJlbGF0aW9uc2hpcENvbGxlY3Rpb24sXG59IGZyb20gJy4vcmVsYXRpb25zaGlwJztcblxuZXhwb3J0IGludGVyZmFjZSBSZWxhdGlvbnNoaXBzQnVpbGRlcjxFUyBleHRlbmRzIG9iamVjdD4ge1xuICByZWxhdGlvbnNoaXA8UiBleHRlbmRzIFJlbGF0aW9uc2hpcDxhbnksIGFueSwgYW55Pj4oXG4gICAgZnJvbUtleTogS2V5c0ZvcjxFUywgRW50aXR5Q29sbGVjdGlvbjxSWydmcm9tJ10sIGFueT4+LFxuICAgIHRvS2V5OiBLZXlzRm9yPEVTLCBFbnRpdHlDb2xsZWN0aW9uPFJbJ3RvJ10sIGFueT4+LFxuICApOiBSZWxhdGlvbnNoaXBDb2xsZWN0aW9uPFI+O1xufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2U8RVMgZXh0ZW5kcyBvYmplY3QsIFJTIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHB1YmxpYyBzdGF0aWMgZW50aXRpZXNPbmx5PEVTIGV4dGVuZHMgb2JqZWN0PihlbnRpdGllczogRVMpOiBEYXRhYmFzZTxFUywge30+IHtcbiAgICByZXR1cm4gbmV3IERhdGFiYXNlKGVudGl0aWVzLCBOT19SRUxBVElPTlNISVBTKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hOiBFUyAmIFJTO1xuICBwcml2YXRlIGlkQ3RyID0gMDtcblxuICBjb25zdHJ1Y3RvcihlbnRpdGllczogRVMsIHJlbGF0aW9uc2hpcHM6ICh4OiBSZWxhdGlvbnNoaXBzQnVpbGRlcjxFUz4pID0+IFJTKSB7XG4gICAgdGhpcy5zY2hlbWEgPSB7XG4gICAgICAuLi5lbnRpdGllcyxcbiAgICAgIC4uLnJlbGF0aW9uc2hpcHMoe1xuICAgICAgICByZWxhdGlvbnNoaXA6IChmcm9tS2V5LCB0b0tleSkgPT5cbiAgICAgICAgICByZWxhdGlvbnNoaXBDb2xsZWN0aW9uKFxuICAgICAgICAgICAgKGlkKSA9PiB0aGlzLmdldChmcm9tS2V5LCBpZCksXG4gICAgICAgICAgICAoaWQpID0+IHRoaXMuZ2V0KHRvS2V5LCBpZCksXG4gICAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgaWQoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuaWRDdHIrK31gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG9jYXRlIGFuIElEIGFuZCBzdG9yZVxuICAgKi9cbiAgcHVibGljIGFsbG9jYXRlPEsgZXh0ZW5kcyBrZXlvZiBFUz4oa2V5OiBLLCBlbnRpdHk6IFBsYWluPEVudGl0eVR5cGU8RVNbS10+Pik6IEVudGl0eVR5cGU8RVNbS10+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZShrZXksIHRoaXMuZShlbnRpdHkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSB3aXRoIGEgcHJlYWxsb2NhdGVkIElEXG4gICAqL1xuICBwdWJsaWMgc3RvcmU8SyBleHRlbmRzIGtleW9mIEVTPihrZXk6IEssIGVudGl0eTogRW50aXR5VHlwZTxFU1tLXT4pOiBFbnRpdHlUeXBlPEVTW0tdPiB7XG4gICAgY29uc3QgY29sbDogRW50aXR5Q29sbGVjdGlvbjxhbnk+ID0gdGhpcy5zY2hlbWFba2V5XSBhcyBhbnk7XG4gICAgY29sbC5hZGQoZW50aXR5KTtcbiAgICByZXR1cm4gZW50aXR5IGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gZW50aXR5IGJ5IGtleVxuICAgKi9cbiAgcHVibGljIGdldDxLIGV4dGVuZHMga2V5b2YgRVM+KGtleTogSywgaWQ6IHN0cmluZyB8IFJlZmVyZW5jZTxFbnRpdHlUeXBlPEVTW0tdPj4pOiBFbnRpdHlUeXBlPEVTW0tdPiB7XG4gICAgY29uc3QgY29sbDogRW50aXR5Q29sbGVjdGlvbjxhbnk+ID0gdGhpcy5zY2hlbWFba2V5XSBhcyBhbnk7XG4gICAgY29uc3QgcmV0ID0gY29sbC5lbnRpdGllcy5nZXQodHlwZW9mIGlkID09PSAnc3RyaW5nJyA/IGlkIDogaWQuJHJlZik7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCAke1N0cmluZyhrZXkpfTogJHtpZH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgZW50aXRpZXMgb2YgYSBnaXZlbiB0eXBlXG4gICAqL1xuICBwdWJsaWMgYWxsPEsgZXh0ZW5kcyBrZXlvZiBFUz4oa2V5OiBLKTogQXJyYXk8RW50aXR5VHlwZTxFU1tLXT4+IHtcbiAgICBjb25zdCBjb2xsOiBFbnRpdHlDb2xsZWN0aW9uPGFueT4gPSB0aGlzLnNjaGVtYVtrZXldIGFzIGFueTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShjb2xsLmVudGl0aWVzLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rdXAgYW4gZW50aXR5IGJ5IGluZGV4XG4gICAqL1xuICBwdWJsaWMgbG9va3VwPEsgZXh0ZW5kcyBrZXlvZiBFUywgSSBleHRlbmRzIEluZGV4TmFtZXNPZjxFU1tLXT4+KFxuICAgIGtleTogSyxcbiAgICBpbmRleDogSSxcbiAgICBsb29rdXA6IEluZGV4T2Y8RVNbS10sIEk+Wydsb29rdXBzJ10sXG4gICAgdmFsdWU6IEluZGV4T2Y8RVNbS10sIEk+Wyd2YWx1ZVR5cGUnXSxcbiAgKTogUmljaFJlYWRvbmx5QXJyYXk8RW50aXR5VHlwZTxFU1tLXT4+IHtcbiAgICBjb25zdCBjb2xsOiBFbnRpdHlDb2xsZWN0aW9uPGFueT4gPSB0aGlzLnNjaGVtYVtrZXldIGFzIGFueTtcbiAgICBjb25zdCBpZHMgPSAoY29sbC5pbmRleGVzIGFzIGFueSlbaW5kZXhdLmxvb2t1cHNbbG9va3VwXSh2YWx1ZSk7XG4gICAgcmV0dXJuIGFkZE9ubHlNZXRob2QoXG4gICAgICBpZHMubWFwKChpZDogc3RyaW5nKSA9PiBjb2xsLmVudGl0aWVzLmdldChpZCkpLFxuICAgICAgYCR7U3RyaW5nKGtleSl9IHdpdGggJHtTdHJpbmcoaW5kZXgpfSAke1N0cmluZyhsb29rdXApfSAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb2NhdGUgYW4gSUQgYW5kIHN0b3JlIGlmIHRoZSBlbnRpdHkgZG9lcyBub3QgeWV0IGV4aXN0XG4gICAqL1xuICBwdWJsaWMgZmluZE9yQWxsb2NhdGU8SyBleHRlbmRzIGtleW9mIEVTLCBJIGV4dGVuZHMga2V5b2YgUGxhaW48RW50aXR5VHlwZTxFU1tLXT4+ICYgSW5kZXhOYW1lc09mPEVTW0tdPj4oXG4gICAga2V5OiBLLFxuICAgIGluZGV4OiBJLFxuICAgIGxvb2t1cDogSW5kZXhPZjxFU1tLXSwgST5bJ2xvb2t1cHMnXSxcbiAgICBlbnRpdHk6IFBsYWluPEVudGl0eVR5cGU8RVNbS10+PixcbiAgKTogRW50aXR5VHlwZTxFU1tLXT4ge1xuICAgIGNvbnN0IHJlcyA9IHRoaXMubG9va3VwKGtleSwgaW5kZXgsIGxvb2t1cCwgZW50aXR5W2luZGV4XSk7XG4gICAgaWYgKHJlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiByZXMub25seSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hbGxvY2F0ZShrZXksIGVudGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGVudGl0aWVzXG4gICAqXG4gICAqIE92ZXJsb2FkIHRvIGFjY291bnQgZm9yIHdoZXRoZXIgd2UgaGF2ZSBhdHRyaWJ1dGVzIG9yIG5vdC5cbiAgICovXG4gIHB1YmxpYyBsaW5rPEsgZXh0ZW5kcyBSZWxXQXR0cnM8UlM+PihcbiAgICBrZXk6IEssXG4gICAgZnJvbTogUmVsVHlwZTxSU1tLXT5bJ2Zyb20nXSxcbiAgICB0bzogUmVsVHlwZTxSU1tLXT5bJ3RvJ10sXG4gICAgYXR0cmlidXRlczogUmVsVHlwZTxSU1tLXT5bJ2F0dHInXSxcbiAgKTogdm9pZDtcbiAgcHVibGljIGxpbms8SyBleHRlbmRzIFJlbFdvQXR0cnM8UlM+PihrZXk6IEssIGZyb206IFJlbFR5cGU8UlNbS10+Wydmcm9tJ10sIHRvOiBSZWxUeXBlPFJTW0tdPlsndG8nXSk6IHZvaWQ7XG4gIHB1YmxpYyBsaW5rPEsgZXh0ZW5kcyBrZXlvZiBSUz4oXG4gICAga2V5OiBLLFxuICAgIGZyb206IFJlbFR5cGU8UlNbS10+Wydmcm9tJ10sXG4gICAgdG86IFJlbFR5cGU8UlNbS10+Wyd0byddLFxuICAgIGF0dHJpYnV0ZXM/OiBSZWxUeXBlPFJTW0tdPlsnYXR0ciddLFxuICApIHtcbiAgICBjb25zdCBjb2w6IFJlbGF0aW9uc2hpcENvbGxlY3Rpb248YW55PiA9IHRoaXMuc2NoZW1hW2tleV0gYXMgYW55O1xuICAgIGNvbC5hZGQoZnJvbSwgdG8sIGF0dHJpYnV0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvbGxvdyBhIGxpbmtcbiAgICovXG4gIHB1YmxpYyBmb2xsb3c8SyBleHRlbmRzIGtleW9mIFJTPihcbiAgICBrZXk6IEssXG4gICAgZnJvbTogUmVsVHlwZTxSU1tLXT5bJ2Zyb20nXSxcbiAgKTogUmljaFJlYWRvbmx5QXJyYXk8TGluazxSZWxUeXBlPFJTW0tdPlsndG8nXSwgUmVsVHlwZTxSU1tLXT5bJ2F0dHInXT4+IHtcbiAgICBjb25zdCBjb2w6IFJlbGF0aW9uc2hpcENvbGxlY3Rpb248YW55PiA9IHRoaXMuc2NoZW1hW2tleV0gYXMgYW55O1xuICAgIGNvbnN0IHRvTGlua3MgPSBjb2wuZm9yd2FyZC5nZXQoZnJvbS4kaWQpID8/IFtdO1xuICAgIGNvbnN0IHJldCA9IHRvTGlua3MubWFwKChpKSA9PiAoeyBlbnRpdHk6IGNvbC50b0NvbGwoaS4kaWQpLCAuLi5yZW1vdmVJZChpKSB9IGFzIGFueSkpO1xuXG4gICAgcmV0dXJuIGFkZE9ubHlNZXRob2QocmV0LCBgJHtTdHJpbmcoa2V5KX0gZnJvbSAke2Zyb219YCk7XG4gIH1cblxuICAvKipcbiAgICogRm9sbG93IGluY29taW5nIGxpbmtzIGJhY2t3YXJkc1xuICAgKi9cbiAgcHVibGljIGluY29taW5nPEsgZXh0ZW5kcyBrZXlvZiBSUz4oXG4gICAga2V5OiBLLFxuICAgIHRvOiBSZWxUeXBlPFJTW0tdPlsndG8nXSxcbiAgKTogUmljaFJlYWRvbmx5QXJyYXk8TGluazxSZWxUeXBlPFJTW0tdPlsnZnJvbSddLCBSZWxUeXBlPFJTW0tdPlsnYXR0ciddPj4ge1xuICAgIGNvbnN0IGNvbDogUmVsYXRpb25zaGlwQ29sbGVjdGlvbjxhbnk+ID0gdGhpcy5zY2hlbWFba2V5XSBhcyBhbnk7XG4gICAgY29uc3QgZnJvbUlkcyA9IGNvbC5iYWNrd2FyZC5nZXQodG8uJGlkKSA/PyBbXTtcbiAgICBjb25zdCByZXQgPSBmcm9tSWRzLm1hcCgoaSkgPT4gKHsgZW50aXR5OiBjb2wuZnJvbUNvbGwoaS4kaWQpLCAuLi5yZW1vdmVJZChpKSB9IGFzIGFueSkpO1xuXG4gICAgcmV0dXJuIGFkZE9ubHlNZXRob2QocmV0LCBgJHtTdHJpbmcoa2V5KX0gdG8gJHt0b31gKTtcbiAgfVxuXG4gIHB1YmxpYyBlPEUgZXh0ZW5kcyBFbnRpdHk+KGVudGl0eTogUGxhaW48RT4pOiBFIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGlkOiB0aGlzLmlkKCksXG4gICAgICAuLi5lbnRpdHksXG4gICAgfSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogVHVybiB0aGUgY3VycmVudCBkYXRhYmFzZSBjb2xsZWN0aW9uIGludG8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIHN0b3JlZC5cbiAgICovXG4gIHB1YmxpYyBzYXZlKCk6IERlaHlkcmF0ZWREYXRhYmFzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkQ3RyOiB0aGlzLmlkQ3RyLFxuICAgICAgc2NoZW1hOiBkZWh5ZHJhdGUodGhpcy5zY2hlbWEpLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBkZWh5ZHJhdGUoeDogdW5rbm93bik6IGFueSB7XG4gICAgICBpZiAoaXNFbnRpdHlDb2xsZWN0aW9uKHgpKSB7XG4gICAgICAgIHJldHVybiB4LmRlaHlkcmF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25zaGlwQ29sbGVjdGlvbih4KSkge1xuICAgICAgICByZXR1cm4geC5kZWh5ZHJhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICAgIHJldHVybiB4Lm1hcChkZWh5ZHJhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKCEheCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh4KS5tYXAoKFtrLCB2XSkgPT4gW2ssIGRlaHlkcmF0ZSh2KV0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb2FkKGRiOiBEZWh5ZHJhdGVkRGF0YWJhc2UpIHtcbiAgICB0aGlzLmlkQ3RyID0gZGIuaWRDdHI7XG4gICAgaHlkcmF0ZSh0aGlzLnNjaGVtYSwgZGIuc2NoZW1hKTtcblxuICAgIGZ1bmN0aW9uIGh5ZHJhdGUocHJvdG86IHVua25vd24sIHg6IHVua25vd24pOiB2b2lkIHtcbiAgICAgIGlmIChpc0VudGl0eUNvbGxlY3Rpb24ocHJvdG8pKSB7XG4gICAgICAgIHByb3RvLmh5ZHJhdGVGcm9tKHgpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25zaGlwQ29sbGVjdGlvbihwcm90bykpIHtcbiAgICAgICAgcHJvdG8uaHlkcmF0ZUZyb20oeCk7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgICB4LmZvckVhY2goaHlkcmF0ZSk7XG4gICAgICB9XG4gICAgICBpZiAoISFwcm90byAmJiB0eXBlb2YgcHJvdG8gPT09ICdvYmplY3QnICYmICEheCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMocHJvdG8pKSB7XG4gICAgICAgICAgaHlkcmF0ZSh2LCAoeCBhcyBhbnkpW2tdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgRGVoeWRyYXRlZERhdGFiYXNlIHtcbiAgcmVhZG9ubHkgaWRDdHI6IG51bWJlcjtcbiAgcmVhZG9ubHkgc2NoZW1hOiBhbnk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUlkPEEgZXh0ZW5kcyBvYmplY3Q+KHg6IEEpOiBPbWl0PEEsICckaWQnPiB7XG4gIGNvbnN0IHJldCA9IHsgLi4ueCB9O1xuICBkZWxldGUgKHJldCBhcyBhbnkpLiRpZDtcbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IHR5cGUgTGluazxFLCBBPiA9IHsgcmVhZG9ubHkgZW50aXR5OiBFIH0gJiBBO1xuXG50eXBlIFJlbFdBdHRyczxSUz4gPSB7IFtLIGluIGtleW9mIFJTXToge30gZXh0ZW5kcyBSZWxUeXBlPFJTW0tdPlsnYXR0ciddID8gbmV2ZXIgOiBLIH1ba2V5b2YgUlNdO1xudHlwZSBSZWxXb0F0dHJzPFJTPiA9IHsgW0sgaW4ga2V5b2YgUlNdOiB7fSBleHRlbmRzIFJlbFR5cGU8UlNbS10+WydhdHRyJ10gPyBLIDogbmV2ZXIgfVtrZXlvZiBSU107XG5cbi8vIE5lY2Vzc2FyeSBiZWNhdXNlIHRoaXMgdHlwZSBtaWdodCBiZSBhIHVuaW9uXG50eXBlIEluZGV4TmFtZXNPZjxBPiA9IEEgZXh0ZW5kcyBFbnRpdHlDb2xsZWN0aW9uPGFueT4gPyBLZXlzT2ZVbmlvbjxBWydpbmRleGVzJ10+IDogbmV2ZXI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmV0dGllci9wcmV0dGllclxudHlwZSBJbmRleE9mPEVDLCBJIGV4dGVuZHMgSW5kZXhOYW1lc09mPEVDPj4gPVxuICBFQyBleHRlbmRzIEVudGl0eUNvbGxlY3Rpb248YW55PlxuICA/IEVDWydpbmRleGVzJ11bSV0gZXh0ZW5kcyBFbnRpdHlJbmRleDxhbnksIGluZmVyIEluZGV4VHlwZT5cbiAgICA/IHtcbiAgICAgICAgdmFsdWVUeXBlOiBJbmRleFR5cGU7XG4gICAgICAgIGxvb2t1cHM6IGtleW9mIEVDWydpbmRleGVzJ11bSV1bJ2xvb2t1cHMnXTtcbiAgICAgIH1cbiAgICA6IG5ldmVyXG4gIDogbmV2ZXI7XG5cbnR5cGUgRW50aXR5VHlwZTxBPiA9IEEgZXh0ZW5kcyBFbnRpdHlDb2xsZWN0aW9uPGluZmVyIEI+ID8gQiA6IG5ldmVyO1xuXG50eXBlIFJlbFR5cGU8QT4gPSBBIGV4dGVuZHMgUmVsYXRpb25zaGlwQ29sbGVjdGlvbjxpbmZlciBSPiA/IFIgOiBuZXZlcjtcblxudHlwZSBSZXNvbHZlVW5pb248VD4gPSBUIGV4dGVuZHMgVCA/IFQgOiBuZXZlcjtcblxudHlwZSBLZXlzT2ZVbmlvbjxUPiA9IGtleW9mIFJlc29sdmVVbmlvbjxUPjtcblxuZXhwb3J0IHR5cGUgRW50aXRpZXNPZjxEQj4gPSBEQiBleHRlbmRzIERhdGFiYXNlPGluZmVyIEVTLCBhbnk+ID8geyBbayBpbiBrZXlvZiBFU106IEVudGl0eVR5cGU8RVNba10+IH0gOiB7fTtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoUmVhZG9ubHlBcnJheTxBPiBleHRlbmRzIFJlYWRvbmx5QXJyYXk8QT4ge1xuICAvKipcbiAgICogUmV0dXJuIHRoZSBmaXJzdCBhbmQgb25seSBlbGVtZW50LCB0aHJvd2luZyBpZiB0aGVyZSBhcmUgIT0gMSBlbGVtZW50c1xuICAgKi9cbiAgb25seSgpOiBBO1xufVxuXG5mdW5jdGlvbiBhZGRPbmx5TWV0aG9kPEE+KHhzOiBBW10sIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBSaWNoUmVhZG9ubHlBcnJheTxBPiB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4cywge1xuICAgIG9ubHk6IHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6ICgpID0+IHtcbiAgICAgICAgaWYgKHhzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSAxICR7ZGVzY3JpcHRpb259LCBmb3VuZCAke3hzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geHNbMF07XG4gICAgICB9LFxuICAgIH0sXG4gIH0pIGFzIGFueTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGtleXMgb2YgYW4gb2JqZWN0IHRoYXQgbWFwIHRvIGEgcGFydGljdWxhciB0eXBlXG4gKi9cbnR5cGUgS2V5c0ZvcjxPIGV4dGVuZHMgb2JqZWN0LCBUPiA9IHsgW2sgaW4ga2V5b2YgT106IE9ba10gZXh0ZW5kcyBUID8gayA6IG5ldmVyIH1ba2V5b2YgT107XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.optionalCmp = exports.numberCmp = exports.stringCmp = exports.ref = exports.isEntityCollection = exports.calculatedIndex = exports.fieldIndex = exports.entityCollection = void 0;\nconst sorted_map_1 = require(\"./sorted-map\");\nfunction entityCollection() {\n const entities = new Map();\n const _indexes = {};\n function add(x) {\n entities.set(x.$id, x);\n for (const index of Object.values(_indexes)) {\n // FIXME: why can't we type this?\n index.add(x);\n }\n }\n return {\n type: 'entities',\n entities,\n indexes: _indexes,\n add,\n dehydrate: () => ({\n type: 'entities',\n entities: Array.from(validatePlainObjects(entities).values()),\n }),\n hydrateFrom: (x) => {\n entities.clear();\n for (const e of Object.values(x.entities)) {\n add(e);\n }\n },\n index(indexes) {\n // This limitation exists purely because I couldn't type it otherwise.\n // Declaring a return type of `EntityCollection` would make a lot\n // of our other type inspection code stop working (the union is hard to pick\n // apart). Since adding indexes in multiple goes is not really a use case,\n // the simpler solution is just to type it as if we replaced all indexes\n // and add a runtime check to make sure the types aren't lying.\n if (Object.keys(_indexes).length > 0) {\n throw new Error('You may only call .index() once on a new collection');\n }\n Object.assign(_indexes, indexes);\n return this;\n },\n };\n}\nexports.entityCollection = entityCollection;\n/**\n * An index that uses the value of an entity's field\n */\nfunction fieldIndex(propName, comparator) {\n return calculatedIndex((x) => x[propName], comparator);\n}\nexports.fieldIndex = fieldIndex;\n/**\n * An index that is calculated based on a function applied to an entity\n */\nfunction calculatedIndex(fn, comparator) {\n const index = [];\n return {\n add: (x) => sorted_map_1.sortedMap.add(index, comparator, fn(x), x.$id),\n lookups: {\n equals: (value) => sorted_map_1.sortedMap.findAll(index, comparator, value),\n },\n index,\n };\n}\nexports.calculatedIndex = calculatedIndex;\nfunction isEntityCollection(x) {\n return typeof x === 'object' && !!x && x.type === 'entities';\n}\nexports.isEntityCollection = isEntityCollection;\nfunction validatePlainObjects(xs) {\n for (const x of xs.values()) {\n if (x.constructor !== Object) {\n throw new Error(`Entities should be plain-text objects, got instance of ${x.constructor}`);\n }\n }\n return xs;\n}\nfunction ref(x) {\n return typeof x === 'string' ? { $ref: x } : { $ref: x.$id };\n}\nexports.ref = ref;\n/**\n * Determines whether two strings are equivalent in the current or specified locale.\n */\nfunction stringCmp(a, b) {\n return a.localeCompare(b);\n}\nexports.stringCmp = stringCmp;\n/**\n * Determines whether two numbers are equivalent.\n */\nfunction numberCmp(a, b) {\n return a - b;\n}\nexports.numberCmp = numberCmp;\n/**\n * Creates a comparator to determine equivalent of two values, using a given comparator, but allows values to be optional.\n *\n * @param frontOrder If `true`, returns so that undefined values are ordered at the front. If `false`, undefined values are ordered at the back.\n */\nfunction optionalCmp(cmp, frontOrder = true) {\n return (a, b) => {\n if (a == undefined && b != undefined) {\n return frontOrder ? -1 : 1;\n }\n if (a != undefined && b == undefined) {\n return frontOrder ? 1 : -1;\n }\n if (a == undefined && b == undefined) {\n return 0;\n }\n return cmp(a, b);\n };\n}\nexports.optionalCmp = optionalCmp;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2VudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBeUQ7QUE0RXpELFNBQWdCLGdCQUFnQjtJQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBYSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUVwQixTQUFTLEdBQUcsQ0FBQyxDQUFJO1FBQ2YsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzQyxpQ0FBaUM7WUFDaEMsS0FBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVU7UUFDaEIsUUFBUTtRQUNSLE9BQU8sRUFBRSxRQUFlO1FBQ3hCLEdBQUc7UUFDSCxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNoQixJQUFJLEVBQUUsVUFBVTtZQUNoQixRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM5RCxDQUFDO1FBQ0YsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDakIsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3pDLEdBQUcsQ0FBQyxDQUFRLENBQUMsQ0FBQzthQUNmO1FBQ0gsQ0FBQztRQUNELEtBQUssQ0FBQyxPQUFPO1lBQ1gsc0VBQXNFO1lBQ3RFLDRFQUE0RTtZQUM1RSw0RUFBNEU7WUFDNUUsMEVBQTBFO1lBQzFFLHdFQUF3RTtZQUN4RSwrREFBK0Q7WUFDL0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQzthQUN4RTtZQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sSUFBVyxDQUFDO1FBQ3JCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQXpDRCw0Q0F5Q0M7QUFFRDs7R0FFRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsUUFBVyxFQUNYLFVBQXNDO0lBRXRDLE9BQU8sZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUxELGdDQUtDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQXNCLEVBQWUsRUFBRSxVQUFtQztJQUN2RyxNQUFNLEtBQUssR0FBOEIsRUFBRSxDQUFDO0lBQzVDLE9BQU87UUFDTCxHQUFHLEVBQUUsQ0FBQyxDQUFJLEVBQUUsRUFBRSxDQUFDLHNCQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDN0QsT0FBTyxFQUFFO1lBQ1AsTUFBTSxFQUFFLENBQUMsS0FBUSxFQUFFLEVBQUUsQ0FBQyxzQkFBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQztTQUMzRDtRQUNSLEtBQUs7S0FDTixDQUFDO0FBQ0osQ0FBQztBQVRELDBDQVNDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsQ0FBVTtJQUMzQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQVMsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0FBQ3hFLENBQUM7QUFGRCxnREFFQztBQUVELFNBQVMsb0JBQW9CLENBQW1CLEVBQWtCO0lBQ2hFLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQzNCLElBQUksQ0FBQyxDQUFDLFdBQVcsS0FBSyxNQUFNLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDNUY7S0FDRjtJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQU1ELFNBQWdCLEdBQUcsQ0FBbUIsQ0FBYTtJQUNqRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMvRCxDQUFDO0FBRkQsa0JBRUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUM1QyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUZELDhCQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixTQUFTLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsQ0FBQztBQUZELDhCQUVDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVcsQ0FBSSxHQUEyQixFQUFFLFVBQVUsR0FBRyxJQUFJO0lBQzNFLE9BQU8sQ0FBQyxDQUFnQixFQUFFLENBQWdCLEVBQUUsRUFBRTtRQUM1QyxJQUFJLENBQUMsSUFBSSxTQUFTLElBQUksQ0FBQyxJQUFJLFNBQVMsRUFBRTtZQUNwQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QjtRQUNELElBQUksQ0FBQyxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksU0FBUyxFQUFFO1lBQ3BDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxTQUFTLEVBQUU7WUFDcEMsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUVELE9BQU8sR0FBRyxDQUFDLENBQUUsRUFBRSxDQUFFLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUM7QUFDSixDQUFDO0FBZEQsa0NBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3J0ZWRNYXAsIFNvcnRlZE11bHRpTWFwIH0gZnJvbSAnLi9zb3J0ZWQtbWFwJztcblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHkge1xuICByZWFkb25seSAkaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUGxhaW48RSBleHRlbmRzIEVudGl0eT4gPSBPbWl0PEUsICckaWQnPjtcblxudHlwZSBJbmRleGVzPEEgZXh0ZW5kcyBFbnRpdHk+ID0geyBbSyBpbiBQcm9wZXJ0eUtleV06IEVudGl0eUluZGV4PEEsIGFueT4gfTtcblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlDb2xsZWN0aW9uPEEgZXh0ZW5kcyBFbnRpdHksIEkgZXh0ZW5kcyBJbmRleGVzPEVudGl0eT4gPSB7fT4ge1xuICByZWFkb25seSB0eXBlOiAnZW50aXRpZXMnO1xuICByZWFkb25seSBlbnRpdGllczogTWFwPHN0cmluZywgQT47XG4gIHJlYWRvbmx5IGluZGV4ZXM6IEk7XG5cbiAgYWRkKHg6IEEpOiB2b2lkO1xuICBkZWh5ZHJhdGUoKTogYW55O1xuICBoeWRyYXRlRnJvbSh4OiBhbnkpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGQgaW5kZXhlcyB0byB0aGlzIGNvbGxlY3Rpb25cbiAgICpcbiAgICogQ3JlYXRpbmcgYW4gaW5kZXhlZCBjb2xsZWN0aW9uIGlzIGEgdHdvLXN0ZXAgb3BlcmF0aW9uIHNvIHRoYXQgd2UgY2FuIHNwZWNpZnkgdGhlXG4gICAqIEVudGl0eSB0eXBlLCBidXQgaW5mZXIgdGhlIGluZGV4IHR5cGVzIChUeXBlU2NyaXB0IGRvZXMgbm90IGFsbG93IGJvdGggc3BlY2lmeWluZyBBTkRcbiAgICogaW5mZXJyaW5nIGdlbmVyaWMgYXJndW1lbnRzIGluIGEgc2luZ2xlIGNhbGwpLlxuICAgKi9cbiAgaW5kZXg8SUkgZXh0ZW5kcyBJbmRleGVzPEE+PihpbmRleGVzOiBJSSk6IEVudGl0eUNvbGxlY3Rpb248QSwgSUk+O1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgaW5kZXggb2JqZWN0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUluZGV4PEEgZXh0ZW5kcyBFbnRpdHksIEluZGV4VHlwZT4ge1xuICAvKipcbiAgICogVGhlIGxvb2t1cHMgdGhhdCB0aGUgaW5kZXhlZCBmaWVsZCB0eXBlIGFmZm9yZHNcbiAgICpcbiAgICogRm9yIGV4YW1wbGUsICdlcXVhbHMnLCAnbGVzc1RoYW4nLCAncHJlZml4JywgZXRjLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9va3VwczogSW5kZXhMb29rdXBzPEluZGV4VHlwZT47XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRleCBkYXRhIHN0b3JlXG4gICAqL1xuICByZWFkb25seSBpbmRleDogU29ydGVkTXVsdGlNYXA8SW5kZXhUeXBlLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gZW50aXR5IHRvIHRoZSBpbmRleFxuICAgKi9cbiAgYWRkKHg6IEEpOiB2b2lkO1xufVxuXG4vKipcbiAqIE1hcCBhIHR5cGUgdGhlIHR5cGVzIG9mIGxvb2t1cHMgd2UgY2FuIGRvIG9uIHRoYXQgdHlwZVxuICovXG5leHBvcnQgdHlwZSBJbmRleExvb2t1cHM8UD4gPSBbUF0gZXh0ZW5kcyBbc3RyaW5nXVxuICA/IFN0cmluZ0luZGV4TG9va3Vwc1xuICA6IFtQXSBleHRlbmRzIFtzdHJpbmcgfCB1bmRlZmluZWRdXG4gID8gT3B0aW9uYWxTdHJpbmdJbmRleExvb2t1cHNcbiAgOiB7fTtcblxuLyoqXG4gKiBBbGwgdGhlIGxvb2t1cHMgb24gJ3N0cmluZycgdHlwZXNcbiAqXG4gKiBXZSBjdXJyZW50bHkgb25seSBoYXZlICdlcXVhbHMnIGJ1dCB3ZSBjb3VsZCBoYXZlIG1vcmUgOilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdJbmRleExvb2t1cHMge1xuICBlcXVhbHMoeDogc3RyaW5nKTogc3RyaW5nW107XG59XG5cbi8qKlxuICogQWxsIHRoZSBsb29rdXBzIG9uICdzdHJpbmcgfCB1bmRlZmluZWQnIHR5cGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uYWxTdHJpbmdJbmRleExvb2t1cHMge1xuICBlcXVhbHMoeDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnRpdHlDb2xsZWN0aW9uPEEgZXh0ZW5kcyBFbnRpdHk+KCk6IEVudGl0eUNvbGxlY3Rpb248QSwge30+IHtcbiAgY29uc3QgZW50aXRpZXMgPSBuZXcgTWFwPHN0cmluZywgQT4oKTtcbiAgY29uc3QgX2luZGV4ZXMgPSB7fTtcblxuICBmdW5jdGlvbiBhZGQoeDogQSkge1xuICAgIGVudGl0aWVzLnNldCh4LiRpZCwgeCk7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBPYmplY3QudmFsdWVzKF9pbmRleGVzKSkge1xuICAgICAgLy8gRklYTUU6IHdoeSBjYW4ndCB3ZSB0eXBlIHRoaXM/XG4gICAgICAoaW5kZXggYXMgYW55KS5hZGQoeCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnZW50aXRpZXMnLFxuICAgIGVudGl0aWVzLFxuICAgIGluZGV4ZXM6IF9pbmRleGVzIGFzIGFueSxcbiAgICBhZGQsXG4gICAgZGVoeWRyYXRlOiAoKSA9PiAoe1xuICAgICAgdHlwZTogJ2VudGl0aWVzJyxcbiAgICAgIGVudGl0aWVzOiBBcnJheS5mcm9tKHZhbGlkYXRlUGxhaW5PYmplY3RzKGVudGl0aWVzKS52YWx1ZXMoKSksXG4gICAgfSksXG4gICAgaHlkcmF0ZUZyb206ICh4KSA9PiB7XG4gICAgICBlbnRpdGllcy5jbGVhcigpO1xuICAgICAgZm9yIChjb25zdCBlIG9mIE9iamVjdC52YWx1ZXMoeC5lbnRpdGllcykpIHtcbiAgICAgICAgYWRkKGUgYXMgYW55KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluZGV4KGluZGV4ZXMpIHtcbiAgICAgIC8vIFRoaXMgbGltaXRhdGlvbiBleGlzdHMgcHVyZWx5IGJlY2F1c2UgSSBjb3VsZG4ndCB0eXBlIGl0IG90aGVyd2lzZS5cbiAgICAgIC8vIERlY2xhcmluZyBhIHJldHVybiB0eXBlIG9mIGBFbnRpdHlDb2xsZWN0aW9uPEEsIEkgfCBJST5gIHdvdWxkIG1ha2UgYSBsb3RcbiAgICAgIC8vIG9mIG91ciBvdGhlciB0eXBlIGluc3BlY3Rpb24gY29kZSBzdG9wIHdvcmtpbmcgKHRoZSB1bmlvbiBpcyBoYXJkIHRvIHBpY2tcbiAgICAgIC8vIGFwYXJ0KS4gU2luY2UgYWRkaW5nIGluZGV4ZXMgaW4gbXVsdGlwbGUgZ29lcyBpcyBub3QgcmVhbGx5IGEgdXNlIGNhc2UsXG4gICAgICAvLyB0aGUgc2ltcGxlciBzb2x1dGlvbiBpcyBqdXN0IHRvIHR5cGUgaXQgYXMgaWYgd2UgcmVwbGFjZWQgYWxsIGluZGV4ZXNcbiAgICAgIC8vIGFuZCBhZGQgYSBydW50aW1lIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgdHlwZXMgYXJlbid0IGx5aW5nLlxuICAgICAgaWYgKE9iamVjdC5rZXlzKF9pbmRleGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG1heSBvbmx5IGNhbGwgLmluZGV4KCkgb25jZSBvbiBhIG5ldyBjb2xsZWN0aW9uJyk7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKF9pbmRleGVzLCBpbmRleGVzKTtcbiAgICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEFuIGluZGV4IHRoYXQgdXNlcyB0aGUgdmFsdWUgb2YgYW4gZW50aXR5J3MgZmllbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkSW5kZXg8QSBleHRlbmRzIEVudGl0eSwgUCBleHRlbmRzIGtleW9mIEE+KFxuICBwcm9wTmFtZTogUCxcbiAgY29tcGFyYXRvcjogc29ydGVkTWFwLkNvbXBhcmF0b3I8QVtQXT4sXG4pOiBFbnRpdHlJbmRleDxBLCBBW1BdPiB7XG4gIHJldHVybiBjYWxjdWxhdGVkSW5kZXgoKHgpID0+IHhbcHJvcE5hbWVdLCBjb21wYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBBbiBpbmRleCB0aGF0IGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gYSBmdW5jdGlvbiBhcHBsaWVkIHRvIGFuIGVudGl0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlZEluZGV4PEEgZXh0ZW5kcyBFbnRpdHksIEI+KGZuOiAoeDogQSkgPT4gQiwgY29tcGFyYXRvcjogc29ydGVkTWFwLkNvbXBhcmF0b3I8Qj4pIHtcbiAgY29uc3QgaW5kZXg6IFNvcnRlZE11bHRpTWFwPEIsIHN0cmluZz4gPSBbXTtcbiAgcmV0dXJuIHtcbiAgICBhZGQ6ICh4OiBBKSA9PiBzb3J0ZWRNYXAuYWRkKGluZGV4LCBjb21wYXJhdG9yLCBmbih4KSwgeC4kaWQpLFxuICAgIGxvb2t1cHM6IHtcbiAgICAgIGVxdWFsczogKHZhbHVlOiBCKSA9PiBzb3J0ZWRNYXAuZmluZEFsbChpbmRleCwgY29tcGFyYXRvciwgdmFsdWUpLFxuICAgIH0gYXMgYW55LFxuICAgIGluZGV4LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbnRpdHlDb2xsZWN0aW9uKHg6IHVua25vd24pOiB4IGlzIEVudGl0eUNvbGxlY3Rpb248YW55PiB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgISF4ICYmICh4IGFzIGFueSkudHlwZSA9PT0gJ2VudGl0aWVzJztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQbGFpbk9iamVjdHM8QSBleHRlbmRzIG9iamVjdD4oeHM6IE1hcDxzdHJpbmcsIEE+KTogTWFwPHN0cmluZywgQT4ge1xuICBmb3IgKGNvbnN0IHggb2YgeHMudmFsdWVzKCkpIHtcbiAgICBpZiAoeC5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0aWVzIHNob3VsZCBiZSBwbGFpbi10ZXh0IG9iamVjdHMsIGdvdCBpbnN0YW5jZSBvZiAke3guY29uc3RydWN0b3J9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB4cztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWZlcmVuY2U8RSBleHRlbmRzIEVudGl0eT4ge1xuICByZWFkb25seSAkcmVmOiBFWyckaWQnXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZjxFIGV4dGVuZHMgRW50aXR5Pih4OiBFIHwgc3RyaW5nKTogUmVmZXJlbmNlPEU+IHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnc3RyaW5nJyA/IHsgJHJlZjogeCB9IDogeyAkcmVmOiB4LiRpZCB9O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0d28gc3RyaW5ncyBhcmUgZXF1aXZhbGVudCBpbiB0aGUgY3VycmVudCBvciBzcGVjaWZpZWQgbG9jYWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nQ21wKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIG51bWJlcnMgYXJlIGVxdWl2YWxlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJDbXAoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gYSAtIGI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBhcmF0b3IgdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnQgb2YgdHdvIHZhbHVlcywgdXNpbmcgYSBnaXZlbiBjb21wYXJhdG9yLCBidXQgYWxsb3dzIHZhbHVlcyB0byBiZSBvcHRpb25hbC5cbiAqXG4gKiBAcGFyYW0gZnJvbnRPcmRlciBJZiBgdHJ1ZWAsIHJldHVybnMgc28gdGhhdCB1bmRlZmluZWQgdmFsdWVzIGFyZSBvcmRlcmVkIGF0IHRoZSBmcm9udC4gSWYgYGZhbHNlYCwgdW5kZWZpbmVkIHZhbHVlcyBhcmUgb3JkZXJlZCBhdCB0aGUgYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsQ21wPEE+KGNtcDogKGE6IEEsIGI6IEEpID0+IG51bWJlciwgZnJvbnRPcmRlciA9IHRydWUpIHtcbiAgcmV0dXJuIChhOiBBIHwgdW5kZWZpbmVkLCBiOiBBIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKGEgPT0gdW5kZWZpbmVkICYmIGIgIT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJvbnRPcmRlciA/IC0xIDogMTtcbiAgICB9XG4gICAgaWYgKGEgIT0gdW5kZWZpbmVkICYmIGIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJvbnRPcmRlciA/IDEgOiAtMTtcbiAgICB9XG4gICAgaWYgKGEgPT0gdW5kZWZpbmVkICYmIGIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gY21wKGEhLCBiISk7XG4gIH07XG59XG4iXX0=","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./entity\"), exports);\n__exportStar(require(\"./relationship\"), exports);\n__exportStar(require(\"./database\"), exports);\n__exportStar(require(\"./invariant\"), exports);\n__exportStar(require(\"./result\"), exports);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUF5QjtBQUN6QixpREFBK0I7QUFDL0IsNkNBQTJCO0FBQzNCLDhDQUE0QjtBQUM1QiwyQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2VudGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL3JlbGF0aW9uc2hpcCc7XG5leHBvcnQgKiBmcm9tICcuL2RhdGFiYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW52YXJpYW50JztcbmV4cG9ydCAqIGZyb20gJy4vcmVzdWx0JztcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.impliesU = exports.implies = exports.evolutionInvariant = void 0;\nfunction evolutionInvariant(description, pred) {\n // TODO: Find a way\n Array.isArray(description);\n Array.isArray(pred);\n}\nexports.evolutionInvariant = evolutionInvariant;\nfunction implies(x, y) {\n return !x || y;\n}\nexports.implies = implies;\n/**\n * Implies, but treats 'undefined' as 'false'\n */\nfunction impliesU(x, y) {\n return !x || !!y;\n}\nexports.impliesU = impliesU;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52YXJpYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ludmFyaWFudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxTQUFnQixrQkFBa0IsQ0FBSSxXQUFtQixFQUFFLElBQStCO0lBQ3hGLG1CQUFtQjtJQUNuQixLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEIsQ0FBQztBQUpELGdEQUlDO0FBRUQsU0FBZ0IsT0FBTyxDQUFDLENBQVUsRUFBRSxDQUFVO0lBQzVDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pCLENBQUM7QUFGRCwwQkFFQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLENBQXNCLEVBQUUsQ0FBc0I7SUFDckUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFGRCw0QkFFQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEludmFyaWFudCA9IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIEV2b2x1dGlvbkludmFyaWFudFByZWQ8QT4gPSAocHJldmlvdXM6IEEsIGN1cnJlbnQ6IEEpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBmdW5jdGlvbiBldm9sdXRpb25JbnZhcmlhbnQ8QT4oZGVzY3JpcHRpb246IHN0cmluZywgcHJlZDogRXZvbHV0aW9uSW52YXJpYW50UHJlZDxBPik6IEludmFyaWFudCB7XG4gIC8vIFRPRE86IEZpbmQgYSB3YXlcbiAgQXJyYXkuaXNBcnJheShkZXNjcmlwdGlvbik7XG4gIEFycmF5LmlzQXJyYXkocHJlZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbXBsaWVzKHg6IGJvb2xlYW4sIHk6IGJvb2xlYW4pIHtcbiAgcmV0dXJuICF4IHx8IHk7XG59XG5cbi8qKlxuICogSW1wbGllcywgYnV0IHRyZWF0cyAndW5kZWZpbmVkJyBhcyAnZmFsc2UnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBsaWVzVSh4OiBib29sZWFuIHwgdW5kZWZpbmVkLCB5OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gIHJldHVybiAheCB8fCAhIXk7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isRelationshipCollection = exports.relationshipCollection = exports.NO_RELATIONSHIPS = void 0;\nconst NO_RELATIONSHIPS = () => ({});\nexports.NO_RELATIONSHIPS = NO_RELATIONSHIPS;\nfunction relationshipCollection(fromField, toField) {\n const forward = new Map();\n const backward = new Map();\n function add(fromId, toId, attrs) {\n let f = forward.get(fromId);\n if (!f) {\n f = [];\n forward.set(fromId, f);\n }\n let b = backward.get(toId);\n if (!b) {\n b = [];\n backward.set(toId, b);\n }\n // Behaves like a set, only add new relationship if it is structurally distinct\n const forwardRel = { $id: toId, ...attrs };\n const forwardRelStr = JSON.stringify(forwardRel);\n const existingRelationship = f.find((x) => JSON.stringify(x) === forwardRelStr);\n if (!existingRelationship) {\n f.push(forwardRel);\n b.push({ $id: fromId, ...attrs });\n }\n }\n return {\n type: 'rel',\n fromColl: fromField,\n toColl: toField,\n forward,\n backward,\n add(from, to, attributes) {\n add(from.$id, to.$id, attributes);\n },\n dehydrate() {\n return {\n type: 'rel',\n forward: Object.fromEntries(forward.entries()),\n };\n },\n hydrateFrom(x) {\n forward.clear();\n backward.clear();\n for (const [fromId, targets] of Object.entries(x.forward)) {\n for (const target of targets) {\n add(fromId, target.$id, removeId(target));\n }\n }\n },\n };\n}\nexports.relationshipCollection = relationshipCollection;\nfunction isRelationshipCollection(x) {\n return typeof x === 'object' && !!x && x.type === 'rel';\n}\nexports.isRelationshipCollection = isRelationshipCollection;\nfunction removeId(x) {\n const ret = { ...x };\n delete ret.$id;\n return ret;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb25zaGlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlbGF0aW9uc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2Qk8sTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQTlCLFFBQUEsZ0JBQWdCLG9CQUFjO0FBRTNDLFNBQWdCLHNCQUFzQixDQUNwQyxTQUF3QixFQUN4QixPQUFvQjtJQUVwQixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUNuRCxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUVwRCxTQUFTLEdBQUcsQ0FBQyxNQUFjLEVBQUUsSUFBWSxFQUFFLEtBQVU7UUFDbkQsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ04sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ04sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCO1FBRUQsK0VBQStFO1FBQy9FLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQzNDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakQsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxDQUFDO1FBRWhGLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLEtBQUs7UUFDWCxRQUFRLEVBQUUsU0FBUztRQUNuQixNQUFNLEVBQUUsT0FBTztRQUNmLE9BQU87UUFDUCxRQUFRO1FBQ1IsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsVUFBZTtZQUMzQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxTQUFTO1lBQ1AsT0FBTztnQkFDTCxJQUFJLEVBQUUsS0FBSztnQkFDWCxPQUFPLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDL0MsQ0FBQztRQUNKLENBQUM7UUFDRCxXQUFXLENBQUMsQ0FBTTtZQUNoQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRWpCLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDekQsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUEwQixFQUFFO29CQUMvQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQzNDO2FBQ0Y7UUFDSCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUF4REQsd0RBd0RDO0FBRUQsU0FBZ0Isd0JBQXdCLENBQUMsQ0FBVTtJQUNqRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQVMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDO0FBQ25FLENBQUM7QUFGRCw0REFFQztBQUVELFNBQVMsUUFBUSxDQUFtQixDQUFJO0lBQ3RDLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNyQixPQUFRLEdBQVcsQ0FBQyxHQUFHLENBQUM7SUFDeEIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlDb2xsZWN0aW9uIH0gZnJvbSAnLi9lbnRpdHknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcDxGcm9tIGV4dGVuZHMgRW50aXR5LCBUbyBleHRlbmRzIEVudGl0eSwgQXR0cmlidXRlcyA9IHt9PiB7XG4gIHJlYWRvbmx5IGZyb206IEZyb207XG4gIHJlYWRvbmx5IHRvOiBUbztcbiAgcmVhZG9ubHkgYXR0cjogQXR0cmlidXRlcztcbn1cblxudHlwZSBGcm9tR2V0dGVyPFIgZXh0ZW5kcyBSZWxhdGlvbnNoaXA8YW55LCBhbnksIGFueT4+ID0gKGlkOiBzdHJpbmcpID0+IFJbJ2Zyb20nXTtcbnR5cGUgVG9HZXR0ZXI8UiBleHRlbmRzIFJlbGF0aW9uc2hpcDxhbnksIGFueSwgYW55Pj4gPSAoaWQ6IHN0cmluZykgPT4gUlsndG8nXTtcblxuZXhwb3J0IGludGVyZmFjZSBSZWxhdGlvbnNoaXBDb2xsZWN0aW9uPFIgZXh0ZW5kcyBSZWxhdGlvbnNoaXA8YW55LCBhbnksIGFueT4+IHtcbiAgcmVhZG9ubHkgdHlwZTogJ3JlbCc7XG4gIHJlYWRvbmx5IGZyb21Db2xsOiBGcm9tR2V0dGVyPFI+O1xuICByZWFkb25seSB0b0NvbGw6IFRvR2V0dGVyPFI+O1xuICByZWFkb25seSBmb3J3YXJkOiBNYXA8c3RyaW5nLCBSZWw8UlsnYXR0ciddPltdPjtcbiAgcmVhZG9ubHkgYmFja3dhcmQ6IE1hcDxzdHJpbmcsIFJlbDxSWydhdHRyJ10+W10+O1xuXG4gIGFkZChmcm9tOiBSWydmcm9tJ10sIHRvOiBSWyd0byddLCBhdHRyaWJ1dGVzOiBSWydhdHRyJ10pOiB2b2lkO1xuICBkZWh5ZHJhdGUoKTogYW55O1xuICBoeWRyYXRlRnJvbSh4OiBhbnkpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBSZWw8QXR0cmlidXRlcz4gPSB7IHJlYWRvbmx5ICRpZDogc3RyaW5nIH0gJiBBdHRyaWJ1dGVzO1xuXG5leHBvcnQgdHlwZSBLZXlGb3JFbnRpdHlDb2xsZWN0aW9uPFMsIEUgZXh0ZW5kcyBFbnRpdHk+ID0ge1xuICBbSyBpbiBrZXlvZiBTXTogU1tLXSBleHRlbmRzIEVudGl0eUNvbGxlY3Rpb248RT4gPyBLIDogbmV2ZXI7XG59W2tleW9mIFNdO1xuXG5leHBvcnQgY29uc3QgTk9fUkVMQVRJT05TSElQUyA9ICgpID0+ICh7fSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGlvbnNoaXBDb2xsZWN0aW9uPFIgZXh0ZW5kcyBSZWxhdGlvbnNoaXA8YW55LCBhbnksIGFueT4+KFxuICBmcm9tRmllbGQ6IEZyb21HZXR0ZXI8Uj4sXG4gIHRvRmllbGQ6IFRvR2V0dGVyPFI+LFxuKTogUmVsYXRpb25zaGlwQ29sbGVjdGlvbjxSPiB7XG4gIGNvbnN0IGZvcndhcmQgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8UmVsPGFueT4+PigpO1xuICBjb25zdCBiYWNrd2FyZCA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxSZWw8YW55Pj4+KCk7XG5cbiAgZnVuY3Rpb24gYWRkKGZyb21JZDogc3RyaW5nLCB0b0lkOiBzdHJpbmcsIGF0dHJzOiBhbnkpIHtcbiAgICBsZXQgZiA9IGZvcndhcmQuZ2V0KGZyb21JZCk7XG4gICAgaWYgKCFmKSB7XG4gICAgICBmID0gW107XG4gICAgICBmb3J3YXJkLnNldChmcm9tSWQsIGYpO1xuICAgIH1cbiAgICBsZXQgYiA9IGJhY2t3YXJkLmdldCh0b0lkKTtcbiAgICBpZiAoIWIpIHtcbiAgICAgIGIgPSBbXTtcbiAgICAgIGJhY2t3YXJkLnNldCh0b0lkLCBiKTtcbiAgICB9XG5cbiAgICAvLyBCZWhhdmVzIGxpa2UgYSBzZXQsIG9ubHkgYWRkIG5ldyByZWxhdGlvbnNoaXAgaWYgaXQgaXMgc3RydWN0dXJhbGx5IGRpc3RpbmN0XG4gICAgY29uc3QgZm9yd2FyZFJlbCA9IHsgJGlkOiB0b0lkLCAuLi5hdHRycyB9O1xuICAgIGNvbnN0IGZvcndhcmRSZWxTdHIgPSBKU09OLnN0cmluZ2lmeShmb3J3YXJkUmVsKTtcbiAgICBjb25zdCBleGlzdGluZ1JlbGF0aW9uc2hpcCA9IGYuZmluZCgoeCkgPT4gSlNPTi5zdHJpbmdpZnkoeCkgPT09IGZvcndhcmRSZWxTdHIpO1xuXG4gICAgaWYgKCFleGlzdGluZ1JlbGF0aW9uc2hpcCkge1xuICAgICAgZi5wdXNoKGZvcndhcmRSZWwpO1xuICAgICAgYi5wdXNoKHsgJGlkOiBmcm9tSWQsIC4uLmF0dHJzIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3JlbCcsXG4gICAgZnJvbUNvbGw6IGZyb21GaWVsZCxcbiAgICB0b0NvbGw6IHRvRmllbGQsXG4gICAgZm9yd2FyZCxcbiAgICBiYWNrd2FyZCxcbiAgICBhZGQoZnJvbTogRW50aXR5LCB0bzogRW50aXR5LCBhdHRyaWJ1dGVzOiBhbnkpIHtcbiAgICAgIGFkZChmcm9tLiRpZCwgdG8uJGlkLCBhdHRyaWJ1dGVzKTtcbiAgICB9LFxuICAgIGRlaHlkcmF0ZSgpOiBhbnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3JlbCcsXG4gICAgICAgIGZvcndhcmQ6IE9iamVjdC5mcm9tRW50cmllcyhmb3J3YXJkLmVudHJpZXMoKSksXG4gICAgICB9O1xuICAgIH0sXG4gICAgaHlkcmF0ZUZyb20oeDogYW55KTogdm9pZCB7XG4gICAgICBmb3J3YXJkLmNsZWFyKCk7XG4gICAgICBiYWNrd2FyZC5jbGVhcigpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtmcm9tSWQsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKHguZm9yd2FyZCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cyBhcyBBcnJheTxSZWw8YW55Pj4pIHtcbiAgICAgICAgICBhZGQoZnJvbUlkLCB0YXJnZXQuJGlkLCByZW1vdmVJZCh0YXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGF0aW9uc2hpcENvbGxlY3Rpb24oeDogdW5rbm93bik6IHggaXMgUmVsYXRpb25zaGlwQ29sbGVjdGlvbjxhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiAhIXggJiYgKHggYXMgYW55KS50eXBlID09PSAncmVsJztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlSWQ8QSBleHRlbmRzIG9iamVjdD4oeDogQSk6IE9taXQ8QSwgJyRpZCc+IHtcbiAgY29uc3QgcmV0ID0geyAuLi54IH07XG4gIGRlbGV0ZSAocmV0IGFzIGFueSkuJGlkO1xuICByZXR1cm4gcmV0O1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.liftUndefined = exports.liftResult = exports.locateFailure = exports.chain = exports.using = exports.tryCatch = exports.assertSuccess = exports.errorFrom = exports.errorMessage = exports.unpackOr = exports.unpack = exports.isSuccess = exports.isFailure = exports.failure = void 0;\n// Ensures you must use `fail()` to construct an instance of type Failure\nconst errorSym = Symbol('error');\nfunction mkLocate(prefix) {\n const ret = (error) => failure(`${prefix}: ${error}`);\n ret.in = (prefix2) => mkLocate(`${prefix}: ${prefix2}`);\n ret.locate = locateFailure(prefix);\n return ret;\n}\nfunction failure(error) {\n return { [errorSym]: error };\n}\nexports.failure = failure;\nfailure.in = (prefix) => mkLocate(prefix);\nfailure.locate = (x) => x;\nfunction isFailure(x) {\n return !!x && typeof x === 'object' && x[errorSym];\n}\nexports.isFailure = isFailure;\nfunction isSuccess(x) {\n return !isFailure(x);\n}\nexports.isSuccess = isSuccess;\nfunction unpack(x) {\n if (isFailure(x)) {\n throw new Error(`unpack: ${x[errorSym]}`);\n }\n return x;\n}\nexports.unpack = unpack;\nfunction unpackOr(x, def) {\n return (isFailure(x) ? def : x);\n}\nexports.unpackOr = unpackOr;\nfunction errorMessage(x) {\n return x[errorSym];\n}\nexports.errorMessage = errorMessage;\nfunction errorFrom(x) {\n return new Error(errorMessage(x));\n}\nexports.errorFrom = errorFrom;\nfunction assertSuccess(x) {\n if (isFailure(x)) {\n throw errorFrom(x);\n }\n}\nexports.assertSuccess = assertSuccess;\nfunction tryCatch(failOrBlock, maybeBlock) {\n const block = (maybeBlock !== null && maybeBlock !== void 0 ? maybeBlock : failOrBlock);\n const f = (maybeBlock ? failOrBlock : failure);\n try {\n return block();\n }\n catch (e) {\n return f(`Error: ${e.message}\\n${e.stack}`);\n }\n}\nexports.tryCatch = tryCatch;\nfunction using(value, block) {\n if (isFailure(value)) {\n return value;\n }\n return block(value);\n}\nexports.using = using;\nfunction chain(value, ...fns) {\n for (const fn of fns) {\n if (isFailure(value)) {\n return value;\n }\n value = fn(value);\n }\n return value;\n}\nexports.chain = chain;\n/* eslint-enable prettier/prettier */\n/**\n * Make a function that will prepend a prefix to error messages\n *\n * This is one way to be specific about the location where errors originate, by prefixing\n * errors as the call stack unwinds.\n *\n * A different method is to pass in a modified failure function using `failure.in(...)`,\n * to build the error message as the call stack deepens.\n */\nfunction locateFailure(prefix) {\n return (x) => (isFailure(x) ? failure(`${prefix}: ${x[errorSym]}`) : x);\n}\nexports.locateFailure = locateFailure;\nfunction liftResult(xs) {\n const failures = Array.isArray(xs) ? xs.filter(isFailure) : Object.values(xs).filter(isFailure);\n if (failures.length > 0) {\n return failure(failures.map(errorMessage).join(', '));\n }\n return xs;\n}\nexports.liftResult = liftResult;\nfunction liftUndefined(valueOrFunction) {\n if (typeof valueOrFunction === 'function') {\n return (...args) => {\n const value = valueOrFunction(...args);\n return value !== undefined ? value : failure('value is undefined');\n };\n }\n return valueOrFunction !== undefined ? valueOrFunction : failure('value is undefined');\n}\nexports.liftUndefined = liftUndefined;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBeUU7QUFDekUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBYWpDLFNBQVMsUUFBUSxDQUFDLE1BQWM7SUFDOUIsTUFBTSxHQUFHLEdBQVMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUlELFNBQWdCLE9BQU8sQ0FBQyxLQUFhO0lBQ25DLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFGRCwwQkFFQztBQUNELE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsRCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUksQ0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFeEMsU0FBZ0IsU0FBUyxDQUFJLENBQVk7SUFDdkMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSyxDQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUZELDhCQUVDO0FBRUQsU0FBZ0IsU0FBUyxDQUFJLENBQVk7SUFDdkMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRkQsOEJBRUM7QUFFRCxTQUFnQixNQUFNLENBQUksQ0FBWTtJQUNwQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUMzQztJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUxELHdCQUtDO0FBRUQsU0FBZ0IsUUFBUSxDQUFPLENBQVksRUFBRSxHQUFNO0lBQ2pELE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFRLENBQUM7QUFDekMsQ0FBQztBQUZELDRCQUVDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLENBQVU7SUFDckMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckIsQ0FBQztBQUZELG9DQUVDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLENBQVU7SUFDbEMsT0FBTyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRkQsOEJBRUM7QUFJRCxTQUFnQixhQUFhLENBQUMsQ0FBVTtJQUN0QyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNoQixNQUFNLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNwQjtBQUNILENBQUM7QUFKRCxzQ0FJQztBQUlELFNBQWdCLFFBQVEsQ0FBSSxXQUE2QixFQUFFLFVBQW9CO0lBQzdFLE1BQU0sS0FBSyxHQUFZLENBQUMsVUFBVSxhQUFWLFVBQVUsY0FBVixVQUFVLEdBQUksV0FBVyxDQUFRLENBQUM7SUFDMUQsTUFBTSxDQUFDLEdBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFRLENBQUM7SUFFNUQsSUFBSTtRQUNGLE9BQU8sS0FBSyxFQUFFLENBQUM7S0FDaEI7SUFBQyxPQUFPLENBQU0sRUFBRTtRQUNmLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM3QztBQUNILENBQUM7QUFURCw0QkFTQztBQUVELFNBQWdCLEtBQUssQ0FBTyxLQUFnQixFQUFFLEtBQTBCO0lBQ3RFLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBTEQsc0JBS0M7QUFZRCxTQUFnQixLQUFLLENBQUMsS0FBa0IsRUFBRSxHQUFHLEdBQW1DO0lBQzlFLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3BCLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBUkQsc0JBUUM7QUFDRCxxQ0FBcUM7QUFFckM7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixhQUFhLENBQUMsTUFBYztJQUMxQyxPQUFPLENBQUksQ0FBWSxFQUFhLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25HLENBQUM7QUFGRCxzQ0FFQztBQU1ELFNBQWdCLFVBQVUsQ0FDeEIsRUFBZ0Q7SUFFaEQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEcsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN2QixPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ3ZEO0lBQ0QsT0FBTyxFQUFTLENBQUM7QUFDbkIsQ0FBQztBQVJELGdDQVFDO0FBT0QsU0FBZ0IsYUFBYSxDQUFDLGVBQW9CO0lBQ2hELElBQUksT0FBTyxlQUFlLEtBQUssVUFBVSxFQUFFO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLElBQVcsRUFBRSxFQUFFO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUM7S0FDSDtJQUNELE9BQU8sZUFBZSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBUkQsc0NBUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBFbnN1cmVzIHlvdSBtdXN0IHVzZSBgZmFpbCgpYCB0byBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdHlwZSBGYWlsdXJlXG5jb25zdCBlcnJvclN5bSA9IFN5bWJvbCgnZXJyb3InKTtcblxuZXhwb3J0IHR5cGUgUmVzdWx0PEE+ID0gQSB8IEZhaWx1cmU7XG5leHBvcnQgaW50ZXJmYWNlIEZhaWx1cmUge1xuICByZWFkb25seSBbZXJyb3JTeW1dOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbCB7XG4gIChlcnJvcjogc3RyaW5nKTogRmFpbHVyZTtcbiAgaW4ocHJlZml4OiBzdHJpbmcpOiBGYWlsO1xuICBsb2NhdGU8QT4oeDogUmVzdWx0PEE+KTogUmVzdWx0PEE+O1xufVxuXG5mdW5jdGlvbiBta0xvY2F0ZShwcmVmaXg6IHN0cmluZyk6IEZhaWwge1xuICBjb25zdCByZXQ6IEZhaWwgPSAoZXJyb3I6IHN0cmluZykgPT4gZmFpbHVyZShgJHtwcmVmaXh9OiAke2Vycm9yfWApO1xuICByZXQuaW4gPSAocHJlZml4Mjogc3RyaW5nKSA9PiBta0xvY2F0ZShgJHtwcmVmaXh9OiAke3ByZWZpeDJ9YCk7XG4gIHJldC5sb2NhdGUgPSBsb2NhdGVGYWlsdXJlKHByZWZpeCk7XG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgZmFpbHVyZSBleHRlbmRzIEZhaWwge31cblxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUoZXJyb3I6IHN0cmluZyk6IEZhaWx1cmUge1xuICByZXR1cm4geyBbZXJyb3JTeW1dOiBlcnJvciB9O1xufVxuZmFpbHVyZS5pbiA9IChwcmVmaXg6IHN0cmluZykgPT4gbWtMb2NhdGUocHJlZml4KTtcbmZhaWx1cmUubG9jYXRlID0gPEE+KHg6IFJlc3VsdDxBPikgPT4geDtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbHVyZTxBPih4OiBSZXN1bHQ8QT4pOiB4IGlzIEZhaWx1cmUge1xuICByZXR1cm4gISF4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiAoeCBhcyBhbnkpW2Vycm9yU3ltXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3VjY2VzczxBPih4OiBSZXN1bHQ8QT4pOiB4IGlzIEEge1xuICByZXR1cm4gIWlzRmFpbHVyZSh4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVucGFjazxBPih4OiBSZXN1bHQ8QT4pOiBBIHtcbiAgaWYgKGlzRmFpbHVyZSh4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5wYWNrOiAke3hbZXJyb3JTeW1dfWApO1xuICB9XG4gIHJldHVybiB4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5wYWNrT3I8QSwgQj4oeDogUmVzdWx0PEE+LCBkZWY6IEIpOiBCIGV4dGVuZHMgQSA/IEEgOiBBIHwgQiB7XG4gIHJldHVybiAoaXNGYWlsdXJlKHgpID8gZGVmIDogeCkgYXMgYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKHg6IEZhaWx1cmUpOiBzdHJpbmcge1xuICByZXR1cm4geFtlcnJvclN5bV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckZyb20oeDogRmFpbHVyZSk6IEVycm9yIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UoeCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U3VjY2VzczxBPih4OiBSZXN1bHQ8QT4pOiBhc3NlcnRzIHggaXMgQTtcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdWNjZXNzKHg6IEZhaWx1cmUpOiBuZXZlcjtcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdWNjZXNzKHg6IEZhaWx1cmUpOiB2b2lkIHtcbiAgaWYgKGlzRmFpbHVyZSh4KSkge1xuICAgIHRocm93IGVycm9yRnJvbSh4KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5Q2F0Y2g8QT4oYmxvY2s6ICgpID0+IEEpOiBSZXN1bHQ8QT47XG5leHBvcnQgZnVuY3Rpb24gdHJ5Q2F0Y2g8QT4oZmFpbEZuOiBGYWlsLCBibG9jazogKCkgPT4gQSk6IFJlc3VsdDxBPjtcbmV4cG9ydCBmdW5jdGlvbiB0cnlDYXRjaDxBPihmYWlsT3JCbG9jazogRmFpbCB8ICgoKSA9PiBBKSwgbWF5YmVCbG9jaz86ICgpID0+IEEpOiBSZXN1bHQ8QT4ge1xuICBjb25zdCBibG9jazogKCkgPT4gQSA9IChtYXliZUJsb2NrID8/IGZhaWxPckJsb2NrKSBhcyBhbnk7XG4gIGNvbnN0IGY6IEZhaWwgPSAobWF5YmVCbG9jayA/IGZhaWxPckJsb2NrIDogZmFpbHVyZSkgYXMgYW55O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJsb2NrKCk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHJldHVybiBmKGBFcnJvcjogJHtlLm1lc3NhZ2V9XFxuJHtlLnN0YWNrfWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2luZzxBLCBCPih2YWx1ZTogUmVzdWx0PEE+LCBibG9jazogKHg6IEEpID0+IFJlc3VsdDxCPik6IFJlc3VsdDxCPiB7XG4gIGlmIChpc0ZhaWx1cmUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBibG9jayh2YWx1ZSk7XG59XG5cbi8qKlxuICogTGlrZSAndXNpbmcnLCBidXQgY2FuIHRha2UgYW55IG51bWJlciBvZiBmdW5jdGlvbnNcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgcHJldHRpZXIvcHJldHRpZXIgKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbjxBLCBCPih2YWx1ZTogUmVzdWx0PEE+LCBiMDogKHg6IEEpID0+IFJlc3VsdDxCPik6IFJlc3VsdDxCPjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbjxBLCBCLCBDPih2YWx1ZTogUmVzdWx0PEE+LCBiMDogKHg6IEEpID0+IFJlc3VsdDxCPiwgYjE6ICh4OiBCKSA9PiBSZXN1bHQ8Qz4pOiBSZXN1bHQ8Qz47XG5leHBvcnQgZnVuY3Rpb24gY2hhaW48QSwgQiwgQywgRD4odmFsdWU6IFJlc3VsdDxBPiwgYjA6ICh4OiBBKSA9PiBSZXN1bHQ8Qj4sIGIxOiAoeDogQikgPT4gUmVzdWx0PEM+LCBiMjogKHg6IEMpID0+IFJlc3VsdDxEPik6IFJlc3VsdDxEPjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbjxBLCBCLCBDLCBELCBFPih2YWx1ZTogUmVzdWx0PEE+LCBiMDogKHg6IEEpID0+IFJlc3VsdDxCPiwgYjE6ICh4OiBCKSA9PiBSZXN1bHQ8Qz4sIGIyOiAoeDogQykgPT4gUmVzdWx0PEQ+LCBiMzogKHg6IEQpID0+IFJlc3VsdDxFPik6IFJlc3VsdDxFPjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbjxBLCBCLCBDLCBELCBFLCBGPih2YWx1ZTogUmVzdWx0PEE+LCBiMDogKHg6IEEpID0+IFJlc3VsdDxCPiwgYjE6ICh4OiBCKSA9PiBSZXN1bHQ8Qz4sIGIyOiAoeDogQykgPT4gUmVzdWx0PEQ+LCBiMzogKHg6IEQpID0+IFJlc3VsdDxFPiwgYjQ6ICh4OiBFKSA9PiBSZXN1bHQ8Rj4pOiBSZXN1bHQ8Rj47XG5leHBvcnQgZnVuY3Rpb24gY2hhaW48QSwgQiwgQywgRCwgRSwgRiwgRz4odmFsdWU6IFJlc3VsdDxBPiwgYjA6ICh4OiBBKSA9PiBSZXN1bHQ8Qj4sIGIxOiAoeDogQikgPT4gUmVzdWx0PEM+LCBiMjogKHg6IEMpID0+IFJlc3VsdDxEPiwgYjM6ICh4OiBEKSA9PiBSZXN1bHQ8RT4sIGI0OiAoeDogRSkgPT4gUmVzdWx0PEY+LCBiNTogKHg6IEYpID0+IFJlc3VsdDxHPik6IFJlc3VsdDxHPjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbih2YWx1ZTogUmVzdWx0PGFueT4sIC4uLmZuczogQXJyYXk8KHg6IGFueSkgPT4gUmVzdWx0PGFueT4+KTogUmVzdWx0PGFueT4ge1xuICBmb3IgKGNvbnN0IGZuIG9mIGZucykge1xuICAgIGlmIChpc0ZhaWx1cmUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHZhbHVlID0gZm4odmFsdWUpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbi8qIGVzbGludC1lbmFibGUgcHJldHRpZXIvcHJldHRpZXIgKi9cblxuLyoqXG4gKiBNYWtlIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHByZXBlbmQgYSBwcmVmaXggdG8gZXJyb3IgbWVzc2FnZXNcbiAqXG4gKiBUaGlzIGlzIG9uZSB3YXkgdG8gYmUgc3BlY2lmaWMgYWJvdXQgdGhlIGxvY2F0aW9uIHdoZXJlIGVycm9ycyBvcmlnaW5hdGUsIGJ5IHByZWZpeGluZ1xuICogZXJyb3JzIGFzIHRoZSBjYWxsIHN0YWNrIHVud2luZHMuXG4gKlxuICogQSBkaWZmZXJlbnQgbWV0aG9kIGlzIHRvIHBhc3MgaW4gYSBtb2RpZmllZCBmYWlsdXJlIGZ1bmN0aW9uIHVzaW5nIGBmYWlsdXJlLmluKC4uLilgLFxuICogdG8gYnVpbGQgdGhlIGVycm9yIG1lc3NhZ2UgYXMgdGhlIGNhbGwgc3RhY2sgZGVlcGVucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2F0ZUZhaWx1cmUocHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIDxBPih4OiBSZXN1bHQ8QT4pOiBSZXN1bHQ8QT4gPT4gKGlzRmFpbHVyZSh4KSA/IGZhaWx1cmUoYCR7cHJlZml4fTogJHt4W2Vycm9yU3ltXX1gKSA6IHgpO1xufVxuXG5leHBvcnQgdHlwZSBGYWlsdXJlcyA9IEFycmF5PEZhaWx1cmU+O1xuXG5leHBvcnQgZnVuY3Rpb24gbGlmdFJlc3VsdDxBPih4czogUmVjb3JkPHN0cmluZywgUmVzdWx0PEE+Pik6IFJlc3VsdDxSZWNvcmQ8c3RyaW5nLCBBPj47XG5leHBvcnQgZnVuY3Rpb24gbGlmdFJlc3VsdDxBPih4czogQXJyYXk8UmVzdWx0PEE+Pik6IFJlc3VsdDxBcnJheTxBPj47XG5leHBvcnQgZnVuY3Rpb24gbGlmdFJlc3VsdDxBPihcbiAgeHM6IFJlY29yZDxzdHJpbmcsIFJlc3VsdDxBPj4gfCBBcnJheTxSZXN1bHQ8QT4+LFxuKTogUmVzdWx0PFJlY29yZDxzdHJpbmcsIEE+PiB8IFJlc3VsdDxBcnJheTxBPj4ge1xuICBjb25zdCBmYWlsdXJlcyA9IEFycmF5LmlzQXJyYXkoeHMpID8geHMuZmlsdGVyKGlzRmFpbHVyZSkgOiBPYmplY3QudmFsdWVzKHhzKS5maWx0ZXIoaXNGYWlsdXJlKTtcbiAgaWYgKGZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZmFpbHVyZShmYWlsdXJlcy5tYXAoZXJyb3JNZXNzYWdlKS5qb2luKCcsICcpKTtcbiAgfVxuICByZXR1cm4geHMgYXMgYW55O1xufVxuXG4vKipcbiAqIExpZnQgYSB2YWx1ZSB0aGF0IGNhbiBiZSAndW5kZWZpbmVkJyB0byBhIHJlc3VsdCwgb3IgYSBmdW5jdGlvbiB0aGF0IGNhbiByZXR1cm4gdW5kZWZpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlmdFVuZGVmaW5lZDxBPih2OiBBIHwgdW5kZWZpbmVkKTogUmVzdWx0PE5vbk51bGxhYmxlPEE+PjtcbmV4cG9ydCBmdW5jdGlvbiBsaWZ0VW5kZWZpbmVkPEEsIEYgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IEE+KHY6IEYpOiAoeDogUGFyYW1ldGVyczxGPikgPT4gUmVzdWx0PE5vbk51bGxhYmxlPEE+PjtcbmV4cG9ydCBmdW5jdGlvbiBsaWZ0VW5kZWZpbmVkKHZhbHVlT3JGdW5jdGlvbjogYW55KTogYW55IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZU9yRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlT3JGdW5jdGlvbiguLi5hcmdzKTtcbiAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBmYWlsdXJlKCd2YWx1ZSBpcyB1bmRlZmluZWQnKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiB2YWx1ZU9yRnVuY3Rpb24gIT09IHVuZGVmaW5lZCA/IHZhbHVlT3JGdW5jdGlvbiA6IGZhaWx1cmUoJ3ZhbHVlIGlzIHVuZGVmaW5lZCcpO1xufVxuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sortedMap = void 0;\n/**\n * A sorted map that may contain the same key multiple times\n *\n * Stored as a sorted array of [key, value] pairs, using binary search to locate\n * entries.\n */\nvar sortedMap;\n(function (sortedMap) {\n function add(map, cmp, key, value) {\n const i = lowerBound(map, cmp, key);\n map.splice(i, 0, [key, value]);\n }\n sortedMap.add = add;\n function find(map, cmp, key) {\n const i = lowerBound(map, cmp, key);\n if (i === map.length) {\n return undefined;\n }\n const [foundKey, value] = map[i];\n return cmp(foundKey, key) === 0 ? value : undefined;\n }\n sortedMap.find = find;\n function findAll(map, cmp, key) {\n let i = lowerBound(map, cmp, key);\n const ret = [];\n while (i < map.length && cmp(map[i][0], key) === 0) {\n ret.push(map[i][1]);\n i += 1;\n }\n return ret;\n }\n sortedMap.findAll = findAll;\n /**\n * Return the index to the first element in the the sorted map\n *\n * @see https://en.cppreference.com/w/cpp/algorithm/lower_bound#Version_2\n */\n function lowerBound(map, cmp, key) {\n let first = 0;\n let count = map.length;\n while (count > 0) {\n let it = first;\n let step = Math.floor(count / 2);\n it += step;\n if (cmp(map[it][0], key) < 0) {\n first = ++it;\n count -= step + 1;\n }\n else {\n count = step;\n }\n }\n return first;\n }\n})(sortedMap = exports.sortedMap || (exports.sortedMap = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGVkLW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zb3J0ZWQtbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOzs7OztHQUtHO0FBQ0gsSUFBaUIsU0FBUyxDQXNEekI7QUF0REQsV0FBaUIsU0FBUztJQUd4QixTQUFnQixHQUFHLENBQU8sR0FBeUIsRUFBRSxHQUFrQixFQUFFLEdBQU0sRUFBRSxLQUFRO1FBQ3ZGLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFIZSxhQUFHLE1BR2xCLENBQUE7SUFFRCxTQUFnQixJQUFJLENBQU8sR0FBeUIsRUFBRSxHQUFrQixFQUFFLEdBQU07UUFDOUUsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNwQixPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3RELENBQUM7SUFSZSxjQUFJLE9BUW5CLENBQUE7SUFFRCxTQUFnQixPQUFPLENBQU8sR0FBeUIsRUFBRSxHQUFrQixFQUFFLEdBQU07UUFDakYsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFbEMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsRCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDUjtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQVZlLGlCQUFPLFVBVXRCLENBQUE7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxVQUFVLENBQU8sR0FBeUIsRUFBRSxHQUFrQixFQUFFLEdBQU07UUFDN0UsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUV2QixPQUFPLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDaEIsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBQ2YsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakMsRUFBRSxJQUFJLElBQUksQ0FBQztZQUVYLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLEtBQUssR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDYixLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQzthQUNuQjtpQkFBTTtnQkFDTCxLQUFLLEdBQUcsSUFBSSxDQUFDO2FBQ2Q7U0FDRjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMsRUF0RGdCLFNBQVMsR0FBVCxpQkFBUyxLQUFULGlCQUFTLFFBc0R6QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFNvcnRlZE11bHRpTWFwPEEsIEI+ID0gQXJyYXk8W0EsIEJdPjtcblxuLyoqXG4gKiBBIHNvcnRlZCBtYXAgdGhhdCBtYXkgY29udGFpbiB0aGUgc2FtZSBrZXkgbXVsdGlwbGUgdGltZXNcbiAqXG4gKiBTdG9yZWQgYXMgYSBzb3J0ZWQgYXJyYXkgb2YgW2tleSwgdmFsdWVdIHBhaXJzLCB1c2luZyBiaW5hcnkgc2VhcmNoIHRvIGxvY2F0ZVxuICogZW50cmllcy5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBzb3J0ZWRNYXAge1xuICBleHBvcnQgdHlwZSBDb21wYXJhdG9yPEE+ID0gKGE6IEEsIGI6IEEpID0+IG51bWJlcjtcblxuICBleHBvcnQgZnVuY3Rpb24gYWRkPEEsIEI+KG1hcDogU29ydGVkTXVsdGlNYXA8QSwgQj4sIGNtcDogQ29tcGFyYXRvcjxBPiwga2V5OiBBLCB2YWx1ZTogQikge1xuICAgIGNvbnN0IGkgPSBsb3dlckJvdW5kKG1hcCwgY21wLCBrZXkpO1xuICAgIG1hcC5zcGxpY2UoaSwgMCwgW2tleSwgdmFsdWVdKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBmaW5kPEEsIEI+KG1hcDogU29ydGVkTXVsdGlNYXA8QSwgQj4sIGNtcDogQ29tcGFyYXRvcjxBPiwga2V5OiBBKTogQiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaSA9IGxvd2VyQm91bmQobWFwLCBjbXAsIGtleSk7XG4gICAgaWYgKGkgPT09IG1hcC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZvdW5kS2V5LCB2YWx1ZV0gPSBtYXBbaV07XG4gICAgcmV0dXJuIGNtcChmb3VuZEtleSwga2V5KSA9PT0gMCA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGZpbmRBbGw8QSwgQj4obWFwOiBTb3J0ZWRNdWx0aU1hcDxBLCBCPiwgY21wOiBDb21wYXJhdG9yPEE+LCBrZXk6IEEpOiBCW10ge1xuICAgIGxldCBpID0gbG93ZXJCb3VuZChtYXAsIGNtcCwga2V5KTtcblxuICAgIGNvbnN0IHJldCA9IFtdO1xuICAgIHdoaWxlIChpIDwgbWFwLmxlbmd0aCAmJiBjbXAobWFwW2ldWzBdLCBrZXkpID09PSAwKSB7XG4gICAgICByZXQucHVzaChtYXBbaV1bMV0pO1xuICAgICAgaSArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBpbmRleCB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgdGhlIHNvcnRlZCBtYXBcbiAgICpcbiAgICogQHNlZSBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvYWxnb3JpdGhtL2xvd2VyX2JvdW5kI1ZlcnNpb25fMlxuICAgKi9cbiAgZnVuY3Rpb24gbG93ZXJCb3VuZDxBLCBCPihtYXA6IFNvcnRlZE11bHRpTWFwPEEsIEI+LCBjbXA6IENvbXBhcmF0b3I8QT4sIGtleTogQSk6IG51bWJlciB7XG4gICAgbGV0IGZpcnN0ID0gMDtcbiAgICBsZXQgY291bnQgPSBtYXAubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGNvdW50ID4gMCkge1xuICAgICAgbGV0IGl0ID0gZmlyc3Q7XG4gICAgICBsZXQgc3RlcCA9IE1hdGguZmxvb3IoY291bnQgLyAyKTtcbiAgICAgIGl0ICs9IHN0ZXA7XG5cbiAgICAgIGlmIChjbXAobWFwW2l0XVswXSwga2V5KSA8IDApIHtcbiAgICAgICAgZmlyc3QgPSArK2l0O1xuICAgICAgICBjb3VudCAtPSBzdGVwICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvdW50ID0gc3RlcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlyc3Q7XG4gIH1cbn1cbiJdfQ==","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n createTokenAuth: () => createTokenAuth\n});\nmodule.exports = __toCommonJS(dist_src_exports);\n\n// pkg/dist-src/auth.js\nvar REGEX_IS_INSTALLATION_LEGACY = /^v1\\./;\nvar REGEX_IS_INSTALLATION = /^ghs_/;\nvar REGEX_IS_USER_TO_SERVER = /^ghu_/;\nasync function auth(token) {\n const isApp = token.split(/\\./).length === 3;\n const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token);\n const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token);\n const tokenType = isApp ? \"app\" : isInstallation ? \"installation\" : isUserToServer ? \"user-to-server\" : \"oauth\";\n return {\n type: \"token\",\n token,\n tokenType\n };\n}\n\n// pkg/dist-src/with-authorization-prefix.js\nfunction withAuthorizationPrefix(token) {\n if (token.split(/\\./).length === 3) {\n return `bearer ${token}`;\n }\n return `token ${token}`;\n}\n\n// pkg/dist-src/hook.js\nasync function hook(token, request, route, parameters) {\n const endpoint = request.endpoint.merge(\n route,\n parameters\n );\n endpoint.headers.authorization = withAuthorizationPrefix(token);\n return request(endpoint);\n}\n\n// pkg/dist-src/index.js\nvar createTokenAuth = function createTokenAuth2(token) {\n if (!token) {\n throw new Error(\"[@octokit/auth-token] No token passed to createTokenAuth\");\n }\n if (typeof token !== \"string\") {\n throw new Error(\n \"[@octokit/auth-token] Token passed to createTokenAuth is not a string\"\n );\n }\n token = token.replace(/^(token|bearer) +/i, \"\");\n return Object.assign(auth.bind(null, token), {\n hook: hook.bind(null, token)\n });\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createTokenAuth\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n Octokit: () => Octokit\n});\nmodule.exports = __toCommonJS(dist_src_exports);\nvar import_universal_user_agent = require(\"universal-user-agent\");\nvar import_before_after_hook = require(\"before-after-hook\");\nvar import_request = require(\"@octokit/request\");\nvar import_graphql = require(\"@octokit/graphql\");\nvar import_auth_token = require(\"@octokit/auth-token\");\n\n// pkg/dist-src/version.js\nvar VERSION = \"5.0.1\";\n\n// pkg/dist-src/index.js\nvar Octokit = class {\n static {\n this.VERSION = VERSION;\n }\n static defaults(defaults) {\n const OctokitWithDefaults = class extends this {\n constructor(...args) {\n const options = args[0] || {};\n if (typeof defaults === \"function\") {\n super(defaults(options));\n return;\n }\n super(\n Object.assign(\n {},\n defaults,\n options,\n options.userAgent && defaults.userAgent ? {\n userAgent: `${options.userAgent} ${defaults.userAgent}`\n } : null\n )\n );\n }\n };\n return OctokitWithDefaults;\n }\n static {\n this.plugins = [];\n }\n /**\n * Attach a plugin (or many) to your Octokit instance.\n *\n * @example\n * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)\n */\n static plugin(...newPlugins) {\n const currentPlugins = this.plugins;\n const NewOctokit = class extends this {\n static {\n this.plugins = currentPlugins.concat(\n newPlugins.filter((plugin) => !currentPlugins.includes(plugin))\n );\n }\n };\n return NewOctokit;\n }\n constructor(options = {}) {\n const hook = new import_before_after_hook.Collection();\n const requestDefaults = {\n baseUrl: import_request.request.endpoint.DEFAULTS.baseUrl,\n headers: {},\n request: Object.assign({}, options.request, {\n // @ts-ignore internal usage only, no need to type\n hook: hook.bind(null, \"request\")\n }),\n mediaType: {\n previews: [],\n format: \"\"\n }\n };\n requestDefaults.headers[\"user-agent\"] = [\n options.userAgent,\n `octokit-core.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`\n ].filter(Boolean).join(\" \");\n if (options.baseUrl) {\n requestDefaults.baseUrl = options.baseUrl;\n }\n if (options.previews) {\n requestDefaults.mediaType.previews = options.previews;\n }\n if (options.timeZone) {\n requestDefaults.headers[\"time-zone\"] = options.timeZone;\n }\n this.request = import_request.request.defaults(requestDefaults);\n this.graphql = (0, import_graphql.withCustomRequest)(this.request).defaults(requestDefaults);\n this.log = Object.assign(\n {\n debug: () => {\n },\n info: () => {\n },\n warn: console.warn.bind(console),\n error: console.error.bind(console)\n },\n options.log\n );\n this.hook = hook;\n if (!options.authStrategy) {\n if (!options.auth) {\n this.auth = async () => ({\n type: \"unauthenticated\"\n });\n } else {\n const auth = (0, import_auth_token.createTokenAuth)(options.auth);\n hook.wrap(\"request\", auth.hook);\n this.auth = auth;\n }\n } else {\n const { authStrategy, ...otherOptions } = options;\n const auth = authStrategy(\n Object.assign(\n {\n request: this.request,\n log: this.log,\n // we pass the current octokit instance as well as its constructor options\n // to allow for authentication strategies that return a new octokit instance\n // that shares the same internal state as the current one. The original\n // requirement for this was the \"event-octokit\" authentication strategy\n // of https://github.com/probot/octokit-auth-probot.\n octokit: this,\n octokitOptions: otherOptions\n },\n options.auth\n )\n );\n hook.wrap(\"request\", auth.hook);\n this.auth = auth;\n }\n const classConstructor = this.constructor;\n classConstructor.plugins.forEach((plugin) => {\n Object.assign(this, plugin(this, options));\n });\n }\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n Octokit\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n endpoint: () => endpoint\n});\nmodule.exports = __toCommonJS(dist_src_exports);\n\n// pkg/dist-src/defaults.js\nvar import_universal_user_agent = require(\"universal-user-agent\");\n\n// pkg/dist-src/version.js\nvar VERSION = \"9.0.2\";\n\n// pkg/dist-src/defaults.js\nvar userAgent = `octokit-endpoint.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`;\nvar DEFAULTS = {\n method: \"GET\",\n baseUrl: \"https://api.github.com\",\n headers: {\n accept: \"application/vnd.github.v3+json\",\n \"user-agent\": userAgent\n },\n mediaType: {\n format: \"\"\n }\n};\n\n// pkg/dist-src/util/lowercase-keys.js\nfunction lowercaseKeys(object) {\n if (!object) {\n return {};\n }\n return Object.keys(object).reduce((newObj, key) => {\n newObj[key.toLowerCase()] = object[key];\n return newObj;\n }, {});\n}\n\n// pkg/dist-src/util/merge-deep.js\nvar import_is_plain_object = require(\"is-plain-object\");\nfunction mergeDeep(defaults, options) {\n const result = Object.assign({}, defaults);\n Object.keys(options).forEach((key) => {\n if ((0, import_is_plain_object.isPlainObject)(options[key])) {\n if (!(key in defaults))\n Object.assign(result, { [key]: options[key] });\n else\n result[key] = mergeDeep(defaults[key], options[key]);\n } else {\n Object.assign(result, { [key]: options[key] });\n }\n });\n return result;\n}\n\n// pkg/dist-src/util/remove-undefined-properties.js\nfunction removeUndefinedProperties(obj) {\n for (const key in obj) {\n if (obj[key] === void 0) {\n delete obj[key];\n }\n }\n return obj;\n}\n\n// pkg/dist-src/merge.js\nfunction merge(defaults, route, options) {\n if (typeof route === \"string\") {\n let [method, url] = route.split(\" \");\n options = Object.assign(url ? { method, url } : { url: method }, options);\n } else {\n options = Object.assign({}, route);\n }\n options.headers = lowercaseKeys(options.headers);\n removeUndefinedProperties(options);\n removeUndefinedProperties(options.headers);\n const mergedOptions = mergeDeep(defaults || {}, options);\n if (options.url === \"/graphql\") {\n if (defaults && defaults.mediaType.previews?.length) {\n mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(\n (preview) => !mergedOptions.mediaType.previews.includes(preview)\n ).concat(mergedOptions.mediaType.previews);\n }\n mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, \"\"));\n }\n return mergedOptions;\n}\n\n// pkg/dist-src/util/add-query-parameters.js\nfunction addQueryParameters(url, parameters) {\n const separator = /\\?/.test(url) ? \"&\" : \"?\";\n const names = Object.keys(parameters);\n if (names.length === 0) {\n return url;\n }\n return url + separator + names.map((name) => {\n if (name === \"q\") {\n return \"q=\" + parameters.q.split(\"+\").map(encodeURIComponent).join(\"+\");\n }\n return `${name}=${encodeURIComponent(parameters[name])}`;\n }).join(\"&\");\n}\n\n// pkg/dist-src/util/extract-url-variable-names.js\nvar urlVariableRegex = /\\{[^}]+\\}/g;\nfunction removeNonChars(variableName) {\n return variableName.replace(/^\\W+|\\W+$/g, \"\").split(/,/);\n}\nfunction extractUrlVariableNames(url) {\n const matches = url.match(urlVariableRegex);\n if (!matches) {\n return [];\n }\n return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);\n}\n\n// pkg/dist-src/util/omit.js\nfunction omit(object, keysToOmit) {\n return Object.keys(object).filter((option) => !keysToOmit.includes(option)).reduce((obj, key) => {\n obj[key] = object[key];\n return obj;\n }, {});\n}\n\n// pkg/dist-src/util/url-template.js\nfunction encodeReserved(str) {\n return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {\n if (!/%[0-9A-Fa-f]/.test(part)) {\n part = encodeURI(part).replace(/%5B/g, \"[\").replace(/%5D/g, \"]\");\n }\n return part;\n }).join(\"\");\n}\nfunction encodeUnreserved(str) {\n return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {\n return \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\nfunction encodeValue(operator, value, key) {\n value = operator === \"+\" || operator === \"#\" ? encodeReserved(value) : encodeUnreserved(value);\n if (key) {\n return encodeUnreserved(key) + \"=\" + value;\n } else {\n return value;\n }\n}\nfunction isDefined(value) {\n return value !== void 0 && value !== null;\n}\nfunction isKeyOperator(operator) {\n return operator === \";\" || operator === \"&\" || operator === \"?\";\n}\nfunction getValues(context, operator, key, modifier) {\n var value = context[key], result = [];\n if (isDefined(value) && value !== \"\") {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n value = value.toString();\n if (modifier && modifier !== \"*\") {\n value = value.substring(0, parseInt(modifier, 10));\n }\n result.push(\n encodeValue(operator, value, isKeyOperator(operator) ? key : \"\")\n );\n } else {\n if (modifier === \"*\") {\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n result.push(\n encodeValue(operator, value2, isKeyOperator(operator) ? key : \"\")\n );\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n result.push(encodeValue(operator, value[k], k));\n }\n });\n }\n } else {\n const tmp = [];\n if (Array.isArray(value)) {\n value.filter(isDefined).forEach(function(value2) {\n tmp.push(encodeValue(operator, value2));\n });\n } else {\n Object.keys(value).forEach(function(k) {\n if (isDefined(value[k])) {\n tmp.push(encodeUnreserved(k));\n tmp.push(encodeValue(operator, value[k].toString()));\n }\n });\n }\n if (isKeyOperator(operator)) {\n result.push(encodeUnreserved(key) + \"=\" + tmp.join(\",\"));\n } else if (tmp.length !== 0) {\n result.push(tmp.join(\",\"));\n }\n }\n }\n } else {\n if (operator === \";\") {\n if (isDefined(value)) {\n result.push(encodeUnreserved(key));\n }\n } else if (value === \"\" && (operator === \"&\" || operator === \"?\")) {\n result.push(encodeUnreserved(key) + \"=\");\n } else if (value === \"\") {\n result.push(\"\");\n }\n }\n return result;\n}\nfunction parseUrl(template) {\n return {\n expand: expand.bind(null, template)\n };\n}\nfunction expand(template, context) {\n var operators = [\"+\", \"#\", \".\", \"/\", \";\", \"?\", \"&\"];\n template = template.replace(\n /\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g,\n function(_, expression, literal) {\n if (expression) {\n let operator = \"\";\n const values = [];\n if (operators.indexOf(expression.charAt(0)) !== -1) {\n operator = expression.charAt(0);\n expression = expression.substr(1);\n }\n expression.split(/,/g).forEach(function(variable) {\n var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n });\n if (operator && operator !== \"+\") {\n var separator = \",\";\n if (operator === \"?\") {\n separator = \"&\";\n } else if (operator !== \"#\") {\n separator = operator;\n }\n return (values.length !== 0 ? operator : \"\") + values.join(separator);\n } else {\n return values.join(\",\");\n }\n } else {\n return encodeReserved(literal);\n }\n }\n );\n if (template === \"/\") {\n return template;\n } else {\n return template.replace(/\\/$/, \"\");\n }\n}\n\n// pkg/dist-src/parse.js\nfunction parse(options) {\n let method = options.method.toUpperCase();\n let url = (options.url || \"/\").replace(/:([a-z]\\w+)/g, \"{$1}\");\n let headers = Object.assign({}, options.headers);\n let body;\n let parameters = omit(options, [\n \"method\",\n \"baseUrl\",\n \"url\",\n \"headers\",\n \"request\",\n \"mediaType\"\n ]);\n const urlVariableNames = extractUrlVariableNames(url);\n url = parseUrl(url).expand(parameters);\n if (!/^http/.test(url)) {\n url = options.baseUrl + url;\n }\n const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat(\"baseUrl\");\n const remainingParameters = omit(parameters, omittedParameters);\n const isBinaryRequest = /application\\/octet-stream/i.test(headers.accept);\n if (!isBinaryRequest) {\n if (options.mediaType.format) {\n headers.accept = headers.accept.split(/,/).map(\n (format) => format.replace(\n /application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/,\n `application/vnd$1$2.${options.mediaType.format}`\n )\n ).join(\",\");\n }\n if (url.endsWith(\"/graphql\")) {\n if (options.mediaType.previews?.length) {\n const previewsFromAcceptHeader = headers.accept.match(/[\\w-]+(?=-preview)/g) || [];\n headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map((preview) => {\n const format = options.mediaType.format ? `.${options.mediaType.format}` : \"+json\";\n return `application/vnd.github.${preview}-preview${format}`;\n }).join(\",\");\n }\n }\n }\n if ([\"GET\", \"HEAD\"].includes(method)) {\n url = addQueryParameters(url, remainingParameters);\n } else {\n if (\"data\" in remainingParameters) {\n body = remainingParameters.data;\n } else {\n if (Object.keys(remainingParameters).length) {\n body = remainingParameters;\n }\n }\n }\n if (!headers[\"content-type\"] && typeof body !== \"undefined\") {\n headers[\"content-type\"] = \"application/json; charset=utf-8\";\n }\n if ([\"PATCH\", \"PUT\"].includes(method) && typeof body === \"undefined\") {\n body = \"\";\n }\n return Object.assign(\n { method, url, headers },\n typeof body !== \"undefined\" ? { body } : null,\n options.request ? { request: options.request } : null\n );\n}\n\n// pkg/dist-src/endpoint-with-defaults.js\nfunction endpointWithDefaults(defaults, route, options) {\n return parse(merge(defaults, route, options));\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(oldDefaults, newDefaults) {\n const DEFAULTS2 = merge(oldDefaults, newDefaults);\n const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2);\n return Object.assign(endpoint2, {\n DEFAULTS: DEFAULTS2,\n defaults: withDefaults.bind(null, DEFAULTS2),\n merge: merge.bind(null, DEFAULTS2),\n parse\n });\n}\n\n// pkg/dist-src/index.js\nvar endpoint = withDefaults(null, DEFAULTS);\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n endpoint\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n GraphqlResponseError: () => GraphqlResponseError,\n graphql: () => graphql2,\n withCustomRequest: () => withCustomRequest\n});\nmodule.exports = __toCommonJS(dist_src_exports);\nvar import_request3 = require(\"@octokit/request\");\nvar import_universal_user_agent = require(\"universal-user-agent\");\n\n// pkg/dist-src/version.js\nvar VERSION = \"7.0.2\";\n\n// pkg/dist-src/with-defaults.js\nvar import_request2 = require(\"@octokit/request\");\n\n// pkg/dist-src/graphql.js\nvar import_request = require(\"@octokit/request\");\n\n// pkg/dist-src/error.js\nfunction _buildMessageForResponseErrors(data) {\n return `Request failed due to following response errors:\n` + data.errors.map((e) => ` - ${e.message}`).join(\"\\n\");\n}\nvar GraphqlResponseError = class extends Error {\n constructor(request2, headers, response) {\n super(_buildMessageForResponseErrors(response));\n this.request = request2;\n this.headers = headers;\n this.response = response;\n this.name = \"GraphqlResponseError\";\n this.errors = response.errors;\n this.data = response.data;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n};\n\n// pkg/dist-src/graphql.js\nvar NON_VARIABLE_OPTIONS = [\n \"method\",\n \"baseUrl\",\n \"url\",\n \"headers\",\n \"request\",\n \"query\",\n \"mediaType\"\n];\nvar FORBIDDEN_VARIABLE_OPTIONS = [\"query\", \"method\", \"url\"];\nvar GHES_V3_SUFFIX_REGEX = /\\/api\\/v3\\/?$/;\nfunction graphql(request2, query, options) {\n if (options) {\n if (typeof query === \"string\" && \"query\" in options) {\n return Promise.reject(\n new Error(`[@octokit/graphql] \"query\" cannot be used as variable name`)\n );\n }\n for (const key in options) {\n if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key))\n continue;\n return Promise.reject(\n new Error(\n `[@octokit/graphql] \"${key}\" cannot be used as variable name`\n )\n );\n }\n }\n const parsedOptions = typeof query === \"string\" ? Object.assign({ query }, options) : query;\n const requestOptions = Object.keys(\n parsedOptions\n ).reduce((result, key) => {\n if (NON_VARIABLE_OPTIONS.includes(key)) {\n result[key] = parsedOptions[key];\n return result;\n }\n if (!result.variables) {\n result.variables = {};\n }\n result.variables[key] = parsedOptions[key];\n return result;\n }, {});\n const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl;\n if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {\n requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, \"/api/graphql\");\n }\n return request2(requestOptions).then((response) => {\n if (response.data.errors) {\n const headers = {};\n for (const key of Object.keys(response.headers)) {\n headers[key] = response.headers[key];\n }\n throw new GraphqlResponseError(\n requestOptions,\n headers,\n response.data\n );\n }\n return response.data.data;\n });\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(request2, newDefaults) {\n const newRequest = request2.defaults(newDefaults);\n const newApi = (query, options) => {\n return graphql(newRequest, query, options);\n };\n return Object.assign(newApi, {\n defaults: withDefaults.bind(null, newRequest),\n endpoint: newRequest.endpoint\n });\n}\n\n// pkg/dist-src/index.js\nvar graphql2 = withDefaults(import_request3.request, {\n headers: {\n \"user-agent\": `octokit-graphql.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`\n },\n method: \"POST\",\n url: \"/graphql\"\n});\nfunction withCustomRequest(customRequest) {\n return withDefaults(customRequest, {\n method: \"POST\",\n url: \"/graphql\"\n });\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n GraphqlResponseError,\n graphql,\n withCustomRequest\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n composePaginateRest: () => composePaginateRest,\n isPaginatingEndpoint: () => isPaginatingEndpoint,\n paginateRest: () => paginateRest,\n paginatingEndpoints: () => paginatingEndpoints\n});\nmodule.exports = __toCommonJS(dist_src_exports);\n\n// pkg/dist-src/version.js\nvar VERSION = \"9.1.4\";\n\n// pkg/dist-src/normalize-paginated-list-response.js\nfunction normalizePaginatedListResponse(response) {\n if (!response.data) {\n return {\n ...response,\n data: []\n };\n }\n const responseNeedsNormalization = \"total_count\" in response.data && !(\"url\" in response.data);\n if (!responseNeedsNormalization)\n return response;\n const incompleteResults = response.data.incomplete_results;\n const repositorySelection = response.data.repository_selection;\n const totalCount = response.data.total_count;\n delete response.data.incomplete_results;\n delete response.data.repository_selection;\n delete response.data.total_count;\n const namespaceKey = Object.keys(response.data)[0];\n const data = response.data[namespaceKey];\n response.data = data;\n if (typeof incompleteResults !== \"undefined\") {\n response.data.incomplete_results = incompleteResults;\n }\n if (typeof repositorySelection !== \"undefined\") {\n response.data.repository_selection = repositorySelection;\n }\n response.data.total_count = totalCount;\n return response;\n}\n\n// pkg/dist-src/iterator.js\nfunction iterator(octokit, route, parameters) {\n const options = typeof route === \"function\" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters);\n const requestMethod = typeof route === \"function\" ? route : octokit.request;\n const method = options.method;\n const headers = options.headers;\n let url = options.url;\n return {\n [Symbol.asyncIterator]: () => ({\n async next() {\n if (!url)\n return { done: true };\n try {\n const response = await requestMethod({ method, url, headers });\n const normalizedResponse = normalizePaginatedListResponse(response);\n url = ((normalizedResponse.headers.link || \"\").match(\n /<([^>]+)>;\\s*rel=\"next\"/\n ) || [])[1];\n return { value: normalizedResponse };\n } catch (error) {\n if (error.status !== 409)\n throw error;\n url = \"\";\n return {\n value: {\n status: 200,\n headers: {},\n data: []\n }\n };\n }\n }\n })\n };\n}\n\n// pkg/dist-src/paginate.js\nfunction paginate(octokit, route, parameters, mapFn) {\n if (typeof parameters === \"function\") {\n mapFn = parameters;\n parameters = void 0;\n }\n return gather(\n octokit,\n [],\n iterator(octokit, route, parameters)[Symbol.asyncIterator](),\n mapFn\n );\n}\nfunction gather(octokit, results, iterator2, mapFn) {\n return iterator2.next().then((result) => {\n if (result.done) {\n return results;\n }\n let earlyExit = false;\n function done() {\n earlyExit = true;\n }\n results = results.concat(\n mapFn ? mapFn(result.value, done) : result.value.data\n );\n if (earlyExit) {\n return results;\n }\n return gather(octokit, results, iterator2, mapFn);\n });\n}\n\n// pkg/dist-src/compose-paginate.js\nvar composePaginateRest = Object.assign(paginate, {\n iterator\n});\n\n// pkg/dist-src/generated/paginating-endpoints.js\nvar paginatingEndpoints = [\n \"GET /advisories\",\n \"GET /app/hook/deliveries\",\n \"GET /app/installation-requests\",\n \"GET /app/installations\",\n \"GET /assignments/{assignment_id}/accepted_assignments\",\n \"GET /classrooms\",\n \"GET /classrooms/{classroom_id}/assignments\",\n \"GET /enterprises/{enterprise}/dependabot/alerts\",\n \"GET /enterprises/{enterprise}/secret-scanning/alerts\",\n \"GET /events\",\n \"GET /gists\",\n \"GET /gists/public\",\n \"GET /gists/starred\",\n \"GET /gists/{gist_id}/comments\",\n \"GET /gists/{gist_id}/commits\",\n \"GET /gists/{gist_id}/forks\",\n \"GET /installation/repositories\",\n \"GET /issues\",\n \"GET /licenses\",\n \"GET /marketplace_listing/plans\",\n \"GET /marketplace_listing/plans/{plan_id}/accounts\",\n \"GET /marketplace_listing/stubbed/plans\",\n \"GET /marketplace_listing/stubbed/plans/{plan_id}/accounts\",\n \"GET /networks/{owner}/{repo}/events\",\n \"GET /notifications\",\n \"GET /organizations\",\n \"GET /orgs/{org}/actions/cache/usage-by-repository\",\n \"GET /orgs/{org}/actions/permissions/repositories\",\n \"GET /orgs/{org}/actions/runners\",\n \"GET /orgs/{org}/actions/secrets\",\n \"GET /orgs/{org}/actions/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/actions/variables\",\n \"GET /orgs/{org}/actions/variables/{name}/repositories\",\n \"GET /orgs/{org}/blocks\",\n \"GET /orgs/{org}/code-scanning/alerts\",\n \"GET /orgs/{org}/codespaces\",\n \"GET /orgs/{org}/codespaces/secrets\",\n \"GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/copilot/billing/seats\",\n \"GET /orgs/{org}/dependabot/alerts\",\n \"GET /orgs/{org}/dependabot/secrets\",\n \"GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories\",\n \"GET /orgs/{org}/events\",\n \"GET /orgs/{org}/failed_invitations\",\n \"GET /orgs/{org}/hooks\",\n \"GET /orgs/{org}/hooks/{hook_id}/deliveries\",\n \"GET /orgs/{org}/installations\",\n \"GET /orgs/{org}/invitations\",\n \"GET /orgs/{org}/invitations/{invitation_id}/teams\",\n \"GET /orgs/{org}/issues\",\n \"GET /orgs/{org}/members\",\n \"GET /orgs/{org}/members/{username}/codespaces\",\n \"GET /orgs/{org}/migrations\",\n \"GET /orgs/{org}/migrations/{migration_id}/repositories\",\n \"GET /orgs/{org}/outside_collaborators\",\n \"GET /orgs/{org}/packages\",\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\",\n \"GET /orgs/{org}/personal-access-token-requests\",\n \"GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories\",\n \"GET /orgs/{org}/personal-access-tokens\",\n \"GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories\",\n \"GET /orgs/{org}/projects\",\n \"GET /orgs/{org}/properties/values\",\n \"GET /orgs/{org}/public_members\",\n \"GET /orgs/{org}/repos\",\n \"GET /orgs/{org}/rulesets\",\n \"GET /orgs/{org}/rulesets/rule-suites\",\n \"GET /orgs/{org}/secret-scanning/alerts\",\n \"GET /orgs/{org}/security-advisories\",\n \"GET /orgs/{org}/teams\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\",\n \"GET /orgs/{org}/teams/{team_slug}/invitations\",\n \"GET /orgs/{org}/teams/{team_slug}/members\",\n \"GET /orgs/{org}/teams/{team_slug}/projects\",\n \"GET /orgs/{org}/teams/{team_slug}/repos\",\n \"GET /orgs/{org}/teams/{team_slug}/teams\",\n \"GET /projects/columns/{column_id}/cards\",\n \"GET /projects/{project_id}/collaborators\",\n \"GET /projects/{project_id}/columns\",\n \"GET /repos/{owner}/{repo}/actions/artifacts\",\n \"GET /repos/{owner}/{repo}/actions/caches\",\n \"GET /repos/{owner}/{repo}/actions/organization-secrets\",\n \"GET /repos/{owner}/{repo}/actions/organization-variables\",\n \"GET /repos/{owner}/{repo}/actions/runners\",\n \"GET /repos/{owner}/{repo}/actions/runs\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs\",\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs\",\n \"GET /repos/{owner}/{repo}/actions/secrets\",\n \"GET /repos/{owner}/{repo}/actions/variables\",\n \"GET /repos/{owner}/{repo}/actions/workflows\",\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs\",\n \"GET /repos/{owner}/{repo}/activity\",\n \"GET /repos/{owner}/{repo}/assignees\",\n \"GET /repos/{owner}/{repo}/branches\",\n \"GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations\",\n \"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs\",\n \"GET /repos/{owner}/{repo}/code-scanning/alerts\",\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\",\n \"GET /repos/{owner}/{repo}/code-scanning/analyses\",\n \"GET /repos/{owner}/{repo}/codespaces\",\n \"GET /repos/{owner}/{repo}/codespaces/devcontainers\",\n \"GET /repos/{owner}/{repo}/codespaces/secrets\",\n \"GET /repos/{owner}/{repo}/collaborators\",\n \"GET /repos/{owner}/{repo}/comments\",\n \"GET /repos/{owner}/{repo}/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/commits\",\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/comments\",\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/check-runs\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/check-suites\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/status\",\n \"GET /repos/{owner}/{repo}/commits/{ref}/statuses\",\n \"GET /repos/{owner}/{repo}/contributors\",\n \"GET /repos/{owner}/{repo}/dependabot/alerts\",\n \"GET /repos/{owner}/{repo}/dependabot/secrets\",\n \"GET /repos/{owner}/{repo}/deployments\",\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\",\n \"GET /repos/{owner}/{repo}/environments\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\",\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps\",\n \"GET /repos/{owner}/{repo}/events\",\n \"GET /repos/{owner}/{repo}/forks\",\n \"GET /repos/{owner}/{repo}/hooks\",\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries\",\n \"GET /repos/{owner}/{repo}/invitations\",\n \"GET /repos/{owner}/{repo}/issues\",\n \"GET /repos/{owner}/{repo}/issues/comments\",\n \"GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/issues/events\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/comments\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/events\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/labels\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/reactions\",\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/timeline\",\n \"GET /repos/{owner}/{repo}/keys\",\n \"GET /repos/{owner}/{repo}/labels\",\n \"GET /repos/{owner}/{repo}/milestones\",\n \"GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels\",\n \"GET /repos/{owner}/{repo}/notifications\",\n \"GET /repos/{owner}/{repo}/pages/builds\",\n \"GET /repos/{owner}/{repo}/projects\",\n \"GET /repos/{owner}/{repo}/pulls\",\n \"GET /repos/{owner}/{repo}/pulls/comments\",\n \"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/comments\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/commits\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/files\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews\",\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments\",\n \"GET /repos/{owner}/{repo}/releases\",\n \"GET /repos/{owner}/{repo}/releases/{release_id}/assets\",\n \"GET /repos/{owner}/{repo}/releases/{release_id}/reactions\",\n \"GET /repos/{owner}/{repo}/rules/branches/{branch}\",\n \"GET /repos/{owner}/{repo}/rulesets\",\n \"GET /repos/{owner}/{repo}/rulesets/rule-suites\",\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts\",\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations\",\n \"GET /repos/{owner}/{repo}/security-advisories\",\n \"GET /repos/{owner}/{repo}/stargazers\",\n \"GET /repos/{owner}/{repo}/subscribers\",\n \"GET /repos/{owner}/{repo}/tags\",\n \"GET /repos/{owner}/{repo}/teams\",\n \"GET /repos/{owner}/{repo}/topics\",\n \"GET /repositories\",\n \"GET /repositories/{repository_id}/environments/{environment_name}/secrets\",\n \"GET /repositories/{repository_id}/environments/{environment_name}/variables\",\n \"GET /search/code\",\n \"GET /search/commits\",\n \"GET /search/issues\",\n \"GET /search/labels\",\n \"GET /search/repositories\",\n \"GET /search/topics\",\n \"GET /search/users\",\n \"GET /teams/{team_id}/discussions\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/comments\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions\",\n \"GET /teams/{team_id}/discussions/{discussion_number}/reactions\",\n \"GET /teams/{team_id}/invitations\",\n \"GET /teams/{team_id}/members\",\n \"GET /teams/{team_id}/projects\",\n \"GET /teams/{team_id}/repos\",\n \"GET /teams/{team_id}/teams\",\n \"GET /user/blocks\",\n \"GET /user/codespaces\",\n \"GET /user/codespaces/secrets\",\n \"GET /user/emails\",\n \"GET /user/followers\",\n \"GET /user/following\",\n \"GET /user/gpg_keys\",\n \"GET /user/installations\",\n \"GET /user/installations/{installation_id}/repositories\",\n \"GET /user/issues\",\n \"GET /user/keys\",\n \"GET /user/marketplace_purchases\",\n \"GET /user/marketplace_purchases/stubbed\",\n \"GET /user/memberships/orgs\",\n \"GET /user/migrations\",\n \"GET /user/migrations/{migration_id}/repositories\",\n \"GET /user/orgs\",\n \"GET /user/packages\",\n \"GET /user/packages/{package_type}/{package_name}/versions\",\n \"GET /user/public_emails\",\n \"GET /user/repos\",\n \"GET /user/repository_invitations\",\n \"GET /user/social_accounts\",\n \"GET /user/ssh_signing_keys\",\n \"GET /user/starred\",\n \"GET /user/subscriptions\",\n \"GET /user/teams\",\n \"GET /users\",\n \"GET /users/{username}/events\",\n \"GET /users/{username}/events/orgs/{org}\",\n \"GET /users/{username}/events/public\",\n \"GET /users/{username}/followers\",\n \"GET /users/{username}/following\",\n \"GET /users/{username}/gists\",\n \"GET /users/{username}/gpg_keys\",\n \"GET /users/{username}/keys\",\n \"GET /users/{username}/orgs\",\n \"GET /users/{username}/packages\",\n \"GET /users/{username}/projects\",\n \"GET /users/{username}/received_events\",\n \"GET /users/{username}/received_events/public\",\n \"GET /users/{username}/repos\",\n \"GET /users/{username}/social_accounts\",\n \"GET /users/{username}/ssh_signing_keys\",\n \"GET /users/{username}/starred\",\n \"GET /users/{username}/subscriptions\"\n];\n\n// pkg/dist-src/paginating-endpoints.js\nfunction isPaginatingEndpoint(arg) {\n if (typeof arg === \"string\") {\n return paginatingEndpoints.includes(arg);\n } else {\n return false;\n }\n}\n\n// pkg/dist-src/index.js\nfunction paginateRest(octokit) {\n return {\n paginate: Object.assign(paginate.bind(null, octokit), {\n iterator: iterator.bind(null, octokit)\n })\n };\n}\npaginateRest.VERSION = VERSION;\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n composePaginateRest,\n isPaginatingEndpoint,\n paginateRest,\n paginatingEndpoints\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n legacyRestEndpointMethods: () => legacyRestEndpointMethods,\n restEndpointMethods: () => restEndpointMethods\n});\nmodule.exports = __toCommonJS(dist_src_exports);\n\n// pkg/dist-src/version.js\nvar VERSION = \"10.1.4\";\n\n// pkg/dist-src/generated/endpoints.js\nvar Endpoints = {\n actions: {\n addCustomLabelsToSelfHostedRunnerForOrg: [\n \"POST /orgs/{org}/actions/runners/{runner_id}/labels\"\n ],\n addCustomLabelsToSelfHostedRunnerForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\"\n ],\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n addSelectedRepoToOrgVariable: [\n \"PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}\"\n ],\n approveWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve\"\n ],\n cancelWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel\"\n ],\n createEnvironmentVariable: [\n \"POST /repositories/{repository_id}/environments/{environment_name}/variables\"\n ],\n createOrUpdateEnvironmentSecret: [\n \"PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}\"\n ],\n createOrUpdateOrgSecret: [\"PUT /orgs/{org}/actions/secrets/{secret_name}\"],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}\"\n ],\n createOrgVariable: [\"POST /orgs/{org}/actions/variables\"],\n createRegistrationTokenForOrg: [\n \"POST /orgs/{org}/actions/runners/registration-token\"\n ],\n createRegistrationTokenForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/registration-token\"\n ],\n createRemoveTokenForOrg: [\"POST /orgs/{org}/actions/runners/remove-token\"],\n createRemoveTokenForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/remove-token\"\n ],\n createRepoVariable: [\"POST /repos/{owner}/{repo}/actions/variables\"],\n createWorkflowDispatch: [\n \"POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches\"\n ],\n deleteActionsCacheById: [\n \"DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}\"\n ],\n deleteActionsCacheByKey: [\n \"DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}\"\n ],\n deleteArtifact: [\n \"DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}\"\n ],\n deleteEnvironmentSecret: [\n \"DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}\"\n ],\n deleteEnvironmentVariable: [\n \"DELETE /repositories/{repository_id}/environments/{environment_name}/variables/{name}\"\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/actions/secrets/{secret_name}\"],\n deleteOrgVariable: [\"DELETE /orgs/{org}/actions/variables/{name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}\"\n ],\n deleteRepoVariable: [\n \"DELETE /repos/{owner}/{repo}/actions/variables/{name}\"\n ],\n deleteSelfHostedRunnerFromOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}\"\n ],\n deleteSelfHostedRunnerFromRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}\"\n ],\n deleteWorkflowRun: [\"DELETE /repos/{owner}/{repo}/actions/runs/{run_id}\"],\n deleteWorkflowRunLogs: [\n \"DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs\"\n ],\n disableSelectedRepositoryGithubActionsOrganization: [\n \"DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}\"\n ],\n disableWorkflow: [\n \"PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable\"\n ],\n downloadArtifact: [\n \"GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}\"\n ],\n downloadJobLogsForWorkflowRun: [\n \"GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs\"\n ],\n downloadWorkflowRunAttemptLogs: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs\"\n ],\n downloadWorkflowRunLogs: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs\"\n ],\n enableSelectedRepositoryGithubActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/repositories/{repository_id}\"\n ],\n enableWorkflow: [\n \"PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable\"\n ],\n forceCancelWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel\"\n ],\n generateRunnerJitconfigForOrg: [\n \"POST /orgs/{org}/actions/runners/generate-jitconfig\"\n ],\n generateRunnerJitconfigForRepo: [\n \"POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig\"\n ],\n getActionsCacheList: [\"GET /repos/{owner}/{repo}/actions/caches\"],\n getActionsCacheUsage: [\"GET /repos/{owner}/{repo}/actions/cache/usage\"],\n getActionsCacheUsageByRepoForOrg: [\n \"GET /orgs/{org}/actions/cache/usage-by-repository\"\n ],\n getActionsCacheUsageForOrg: [\"GET /orgs/{org}/actions/cache/usage\"],\n getAllowedActionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/selected-actions\"\n ],\n getAllowedActionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/selected-actions\"\n ],\n getArtifact: [\"GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}\"],\n getEnvironmentPublicKey: [\n \"GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key\"\n ],\n getEnvironmentSecret: [\n \"GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}\"\n ],\n getEnvironmentVariable: [\n \"GET /repositories/{repository_id}/environments/{environment_name}/variables/{name}\"\n ],\n getGithubActionsDefaultWorkflowPermissionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/workflow\"\n ],\n getGithubActionsDefaultWorkflowPermissionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/workflow\"\n ],\n getGithubActionsPermissionsOrganization: [\n \"GET /orgs/{org}/actions/permissions\"\n ],\n getGithubActionsPermissionsRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions\"\n ],\n getJobForWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/jobs/{job_id}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/actions/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/actions/secrets/{secret_name}\"],\n getOrgVariable: [\"GET /orgs/{org}/actions/variables/{name}\"],\n getPendingDeploymentsForRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments\"\n ],\n getRepoPermissions: [\n \"GET /repos/{owner}/{repo}/actions/permissions\",\n {},\n { renamed: [\"actions\", \"getGithubActionsPermissionsRepository\"] }\n ],\n getRepoPublicKey: [\"GET /repos/{owner}/{repo}/actions/secrets/public-key\"],\n getRepoSecret: [\"GET /repos/{owner}/{repo}/actions/secrets/{secret_name}\"],\n getRepoVariable: [\"GET /repos/{owner}/{repo}/actions/variables/{name}\"],\n getReviewsForRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals\"\n ],\n getSelfHostedRunnerForOrg: [\"GET /orgs/{org}/actions/runners/{runner_id}\"],\n getSelfHostedRunnerForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/{runner_id}\"\n ],\n getWorkflow: [\"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}\"],\n getWorkflowAccessToRepository: [\n \"GET /repos/{owner}/{repo}/actions/permissions/access\"\n ],\n getWorkflowRun: [\"GET /repos/{owner}/{repo}/actions/runs/{run_id}\"],\n getWorkflowRunAttempt: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}\"\n ],\n getWorkflowRunUsage: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing\"\n ],\n getWorkflowUsage: [\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing\"\n ],\n listArtifactsForRepo: [\"GET /repos/{owner}/{repo}/actions/artifacts\"],\n listEnvironmentSecrets: [\n \"GET /repositories/{repository_id}/environments/{environment_name}/secrets\"\n ],\n listEnvironmentVariables: [\n \"GET /repositories/{repository_id}/environments/{environment_name}/variables\"\n ],\n listJobsForWorkflowRun: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs\"\n ],\n listJobsForWorkflowRunAttempt: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs\"\n ],\n listLabelsForSelfHostedRunnerForOrg: [\n \"GET /orgs/{org}/actions/runners/{runner_id}/labels\"\n ],\n listLabelsForSelfHostedRunnerForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\"\n ],\n listOrgSecrets: [\"GET /orgs/{org}/actions/secrets\"],\n listOrgVariables: [\"GET /orgs/{org}/actions/variables\"],\n listRepoOrganizationSecrets: [\n \"GET /repos/{owner}/{repo}/actions/organization-secrets\"\n ],\n listRepoOrganizationVariables: [\n \"GET /repos/{owner}/{repo}/actions/organization-variables\"\n ],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/actions/secrets\"],\n listRepoVariables: [\"GET /repos/{owner}/{repo}/actions/variables\"],\n listRepoWorkflows: [\"GET /repos/{owner}/{repo}/actions/workflows\"],\n listRunnerApplicationsForOrg: [\"GET /orgs/{org}/actions/runners/downloads\"],\n listRunnerApplicationsForRepo: [\n \"GET /repos/{owner}/{repo}/actions/runners/downloads\"\n ],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/actions/secrets/{secret_name}/repositories\"\n ],\n listSelectedReposForOrgVariable: [\n \"GET /orgs/{org}/actions/variables/{name}/repositories\"\n ],\n listSelectedRepositoriesEnabledGithubActionsOrganization: [\n \"GET /orgs/{org}/actions/permissions/repositories\"\n ],\n listSelfHostedRunnersForOrg: [\"GET /orgs/{org}/actions/runners\"],\n listSelfHostedRunnersForRepo: [\"GET /repos/{owner}/{repo}/actions/runners\"],\n listWorkflowRunArtifacts: [\n \"GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts\"\n ],\n listWorkflowRuns: [\n \"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs\"\n ],\n listWorkflowRunsForRepo: [\"GET /repos/{owner}/{repo}/actions/runs\"],\n reRunJobForWorkflowRun: [\n \"POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun\"\n ],\n reRunWorkflow: [\"POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun\"],\n reRunWorkflowFailedJobs: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs\"\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}/labels\"\n ],\n removeAllCustomLabelsFromSelfHostedRunnerForRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\"\n ],\n removeCustomLabelFromSelfHostedRunnerForOrg: [\n \"DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}\"\n ],\n removeCustomLabelFromSelfHostedRunnerForRepo: [\n \"DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}\"\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n removeSelectedRepoFromOrgVariable: [\n \"DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}\"\n ],\n reviewCustomGatesForRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule\"\n ],\n reviewPendingDeploymentsForRun: [\n \"POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments\"\n ],\n setAllowedActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/selected-actions\"\n ],\n setAllowedActionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/selected-actions\"\n ],\n setCustomLabelsForSelfHostedRunnerForOrg: [\n \"PUT /orgs/{org}/actions/runners/{runner_id}/labels\"\n ],\n setCustomLabelsForSelfHostedRunnerForRepo: [\n \"PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels\"\n ],\n setGithubActionsDefaultWorkflowPermissionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/workflow\"\n ],\n setGithubActionsDefaultWorkflowPermissionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/workflow\"\n ],\n setGithubActionsPermissionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions\"\n ],\n setGithubActionsPermissionsRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions\"\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/actions/secrets/{secret_name}/repositories\"\n ],\n setSelectedReposForOrgVariable: [\n \"PUT /orgs/{org}/actions/variables/{name}/repositories\"\n ],\n setSelectedRepositoriesEnabledGithubActionsOrganization: [\n \"PUT /orgs/{org}/actions/permissions/repositories\"\n ],\n setWorkflowAccessToRepository: [\n \"PUT /repos/{owner}/{repo}/actions/permissions/access\"\n ],\n updateEnvironmentVariable: [\n \"PATCH /repositories/{repository_id}/environments/{environment_name}/variables/{name}\"\n ],\n updateOrgVariable: [\"PATCH /orgs/{org}/actions/variables/{name}\"],\n updateRepoVariable: [\n \"PATCH /repos/{owner}/{repo}/actions/variables/{name}\"\n ]\n },\n activity: {\n checkRepoIsStarredByAuthenticatedUser: [\"GET /user/starred/{owner}/{repo}\"],\n deleteRepoSubscription: [\"DELETE /repos/{owner}/{repo}/subscription\"],\n deleteThreadSubscription: [\n \"DELETE /notifications/threads/{thread_id}/subscription\"\n ],\n getFeeds: [\"GET /feeds\"],\n getRepoSubscription: [\"GET /repos/{owner}/{repo}/subscription\"],\n getThread: [\"GET /notifications/threads/{thread_id}\"],\n getThreadSubscriptionForAuthenticatedUser: [\n \"GET /notifications/threads/{thread_id}/subscription\"\n ],\n listEventsForAuthenticatedUser: [\"GET /users/{username}/events\"],\n listNotificationsForAuthenticatedUser: [\"GET /notifications\"],\n listOrgEventsForAuthenticatedUser: [\n \"GET /users/{username}/events/orgs/{org}\"\n ],\n listPublicEvents: [\"GET /events\"],\n listPublicEventsForRepoNetwork: [\"GET /networks/{owner}/{repo}/events\"],\n listPublicEventsForUser: [\"GET /users/{username}/events/public\"],\n listPublicOrgEvents: [\"GET /orgs/{org}/events\"],\n listReceivedEventsForUser: [\"GET /users/{username}/received_events\"],\n listReceivedPublicEventsForUser: [\n \"GET /users/{username}/received_events/public\"\n ],\n listRepoEvents: [\"GET /repos/{owner}/{repo}/events\"],\n listRepoNotificationsForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/notifications\"\n ],\n listReposStarredByAuthenticatedUser: [\"GET /user/starred\"],\n listReposStarredByUser: [\"GET /users/{username}/starred\"],\n listReposWatchedByUser: [\"GET /users/{username}/subscriptions\"],\n listStargazersForRepo: [\"GET /repos/{owner}/{repo}/stargazers\"],\n listWatchedReposForAuthenticatedUser: [\"GET /user/subscriptions\"],\n listWatchersForRepo: [\"GET /repos/{owner}/{repo}/subscribers\"],\n markNotificationsAsRead: [\"PUT /notifications\"],\n markRepoNotificationsAsRead: [\"PUT /repos/{owner}/{repo}/notifications\"],\n markThreadAsRead: [\"PATCH /notifications/threads/{thread_id}\"],\n setRepoSubscription: [\"PUT /repos/{owner}/{repo}/subscription\"],\n setThreadSubscription: [\n \"PUT /notifications/threads/{thread_id}/subscription\"\n ],\n starRepoForAuthenticatedUser: [\"PUT /user/starred/{owner}/{repo}\"],\n unstarRepoForAuthenticatedUser: [\"DELETE /user/starred/{owner}/{repo}\"]\n },\n apps: {\n addRepoToInstallation: [\n \"PUT /user/installations/{installation_id}/repositories/{repository_id}\",\n {},\n { renamed: [\"apps\", \"addRepoToInstallationForAuthenticatedUser\"] }\n ],\n addRepoToInstallationForAuthenticatedUser: [\n \"PUT /user/installations/{installation_id}/repositories/{repository_id}\"\n ],\n checkToken: [\"POST /applications/{client_id}/token\"],\n createFromManifest: [\"POST /app-manifests/{code}/conversions\"],\n createInstallationAccessToken: [\n \"POST /app/installations/{installation_id}/access_tokens\"\n ],\n deleteAuthorization: [\"DELETE /applications/{client_id}/grant\"],\n deleteInstallation: [\"DELETE /app/installations/{installation_id}\"],\n deleteToken: [\"DELETE /applications/{client_id}/token\"],\n getAuthenticated: [\"GET /app\"],\n getBySlug: [\"GET /apps/{app_slug}\"],\n getInstallation: [\"GET /app/installations/{installation_id}\"],\n getOrgInstallation: [\"GET /orgs/{org}/installation\"],\n getRepoInstallation: [\"GET /repos/{owner}/{repo}/installation\"],\n getSubscriptionPlanForAccount: [\n \"GET /marketplace_listing/accounts/{account_id}\"\n ],\n getSubscriptionPlanForAccountStubbed: [\n \"GET /marketplace_listing/stubbed/accounts/{account_id}\"\n ],\n getUserInstallation: [\"GET /users/{username}/installation\"],\n getWebhookConfigForApp: [\"GET /app/hook/config\"],\n getWebhookDelivery: [\"GET /app/hook/deliveries/{delivery_id}\"],\n listAccountsForPlan: [\"GET /marketplace_listing/plans/{plan_id}/accounts\"],\n listAccountsForPlanStubbed: [\n \"GET /marketplace_listing/stubbed/plans/{plan_id}/accounts\"\n ],\n listInstallationReposForAuthenticatedUser: [\n \"GET /user/installations/{installation_id}/repositories\"\n ],\n listInstallationRequestsForAuthenticatedApp: [\n \"GET /app/installation-requests\"\n ],\n listInstallations: [\"GET /app/installations\"],\n listInstallationsForAuthenticatedUser: [\"GET /user/installations\"],\n listPlans: [\"GET /marketplace_listing/plans\"],\n listPlansStubbed: [\"GET /marketplace_listing/stubbed/plans\"],\n listReposAccessibleToInstallation: [\"GET /installation/repositories\"],\n listSubscriptionsForAuthenticatedUser: [\"GET /user/marketplace_purchases\"],\n listSubscriptionsForAuthenticatedUserStubbed: [\n \"GET /user/marketplace_purchases/stubbed\"\n ],\n listWebhookDeliveries: [\"GET /app/hook/deliveries\"],\n redeliverWebhookDelivery: [\n \"POST /app/hook/deliveries/{delivery_id}/attempts\"\n ],\n removeRepoFromInstallation: [\n \"DELETE /user/installations/{installation_id}/repositories/{repository_id}\",\n {},\n { renamed: [\"apps\", \"removeRepoFromInstallationForAuthenticatedUser\"] }\n ],\n removeRepoFromInstallationForAuthenticatedUser: [\n \"DELETE /user/installations/{installation_id}/repositories/{repository_id}\"\n ],\n resetToken: [\"PATCH /applications/{client_id}/token\"],\n revokeInstallationAccessToken: [\"DELETE /installation/token\"],\n scopeToken: [\"POST /applications/{client_id}/token/scoped\"],\n suspendInstallation: [\"PUT /app/installations/{installation_id}/suspended\"],\n unsuspendInstallation: [\n \"DELETE /app/installations/{installation_id}/suspended\"\n ],\n updateWebhookConfigForApp: [\"PATCH /app/hook/config\"]\n },\n billing: {\n getGithubActionsBillingOrg: [\"GET /orgs/{org}/settings/billing/actions\"],\n getGithubActionsBillingUser: [\n \"GET /users/{username}/settings/billing/actions\"\n ],\n getGithubPackagesBillingOrg: [\"GET /orgs/{org}/settings/billing/packages\"],\n getGithubPackagesBillingUser: [\n \"GET /users/{username}/settings/billing/packages\"\n ],\n getSharedStorageBillingOrg: [\n \"GET /orgs/{org}/settings/billing/shared-storage\"\n ],\n getSharedStorageBillingUser: [\n \"GET /users/{username}/settings/billing/shared-storage\"\n ]\n },\n checks: {\n create: [\"POST /repos/{owner}/{repo}/check-runs\"],\n createSuite: [\"POST /repos/{owner}/{repo}/check-suites\"],\n get: [\"GET /repos/{owner}/{repo}/check-runs/{check_run_id}\"],\n getSuite: [\"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}\"],\n listAnnotations: [\n \"GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations\"\n ],\n listForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/check-runs\"],\n listForSuite: [\n \"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs\"\n ],\n listSuitesForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/check-suites\"],\n rerequestRun: [\n \"POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest\"\n ],\n rerequestSuite: [\n \"POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest\"\n ],\n setSuitesPreferences: [\n \"PATCH /repos/{owner}/{repo}/check-suites/preferences\"\n ],\n update: [\"PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}\"]\n },\n codeScanning: {\n deleteAnalysis: [\n \"DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}\"\n ],\n getAlert: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}\",\n {},\n { renamedParameters: { alert_id: \"alert_number\" } }\n ],\n getAnalysis: [\n \"GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}\"\n ],\n getCodeqlDatabase: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}\"\n ],\n getDefaultSetup: [\"GET /repos/{owner}/{repo}/code-scanning/default-setup\"],\n getSarif: [\"GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}\"],\n listAlertInstances: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\"\n ],\n listAlertsForOrg: [\"GET /orgs/{org}/code-scanning/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/code-scanning/alerts\"],\n listAlertsInstances: [\n \"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances\",\n {},\n { renamed: [\"codeScanning\", \"listAlertInstances\"] }\n ],\n listCodeqlDatabases: [\n \"GET /repos/{owner}/{repo}/code-scanning/codeql/databases\"\n ],\n listRecentAnalyses: [\"GET /repos/{owner}/{repo}/code-scanning/analyses\"],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}\"\n ],\n updateDefaultSetup: [\n \"PATCH /repos/{owner}/{repo}/code-scanning/default-setup\"\n ],\n uploadSarif: [\"POST /repos/{owner}/{repo}/code-scanning/sarifs\"]\n },\n codesOfConduct: {\n getAllCodesOfConduct: [\"GET /codes_of_conduct\"],\n getConductCode: [\"GET /codes_of_conduct/{key}\"]\n },\n codespaces: {\n addRepositoryForSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n checkPermissionsForDevcontainer: [\n \"GET /repos/{owner}/{repo}/codespaces/permissions_check\"\n ],\n codespaceMachinesForAuthenticatedUser: [\n \"GET /user/codespaces/{codespace_name}/machines\"\n ],\n createForAuthenticatedUser: [\"POST /user/codespaces\"],\n createOrUpdateOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}\"\n ],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\"\n ],\n createOrUpdateSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}\"\n ],\n createWithPrForAuthenticatedUser: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces\"\n ],\n createWithRepoForAuthenticatedUser: [\n \"POST /repos/{owner}/{repo}/codespaces\"\n ],\n deleteForAuthenticatedUser: [\"DELETE /user/codespaces/{codespace_name}\"],\n deleteFromOrganization: [\n \"DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}\"\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/codespaces/secrets/{secret_name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\"\n ],\n deleteSecretForAuthenticatedUser: [\n \"DELETE /user/codespaces/secrets/{secret_name}\"\n ],\n exportForAuthenticatedUser: [\n \"POST /user/codespaces/{codespace_name}/exports\"\n ],\n getCodespacesForUserInOrg: [\n \"GET /orgs/{org}/members/{username}/codespaces\"\n ],\n getExportDetailsForAuthenticatedUser: [\n \"GET /user/codespaces/{codespace_name}/exports/{export_id}\"\n ],\n getForAuthenticatedUser: [\"GET /user/codespaces/{codespace_name}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/codespaces/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/codespaces/secrets/{secret_name}\"],\n getPublicKeyForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/public-key\"\n ],\n getRepoPublicKey: [\n \"GET /repos/{owner}/{repo}/codespaces/secrets/public-key\"\n ],\n getRepoSecret: [\n \"GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}\"\n ],\n getSecretForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/{secret_name}\"\n ],\n listDevcontainersInRepositoryForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/devcontainers\"\n ],\n listForAuthenticatedUser: [\"GET /user/codespaces\"],\n listInOrganization: [\n \"GET /orgs/{org}/codespaces\",\n {},\n { renamedParameters: { org_id: \"org\" } }\n ],\n listInRepositoryForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces\"\n ],\n listOrgSecrets: [\"GET /orgs/{org}/codespaces/secrets\"],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/codespaces/secrets\"],\n listRepositoriesForSecretForAuthenticatedUser: [\n \"GET /user/codespaces/secrets/{secret_name}/repositories\"\n ],\n listSecretsForAuthenticatedUser: [\"GET /user/codespaces/secrets\"],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories\"\n ],\n preFlightWithRepoForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/new\"\n ],\n publishForAuthenticatedUser: [\n \"POST /user/codespaces/{codespace_name}/publish\"\n ],\n removeRepositoryForSecretForAuthenticatedUser: [\n \"DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n repoMachinesForAuthenticatedUser: [\n \"GET /repos/{owner}/{repo}/codespaces/machines\"\n ],\n setRepositoriesForSecretForAuthenticatedUser: [\n \"PUT /user/codespaces/secrets/{secret_name}/repositories\"\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories\"\n ],\n startForAuthenticatedUser: [\"POST /user/codespaces/{codespace_name}/start\"],\n stopForAuthenticatedUser: [\"POST /user/codespaces/{codespace_name}/stop\"],\n stopInOrganization: [\n \"POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop\"\n ],\n updateForAuthenticatedUser: [\"PATCH /user/codespaces/{codespace_name}\"]\n },\n copilot: {\n addCopilotForBusinessSeatsForTeams: [\n \"POST /orgs/{org}/copilot/billing/selected_teams\"\n ],\n addCopilotForBusinessSeatsForUsers: [\n \"POST /orgs/{org}/copilot/billing/selected_users\"\n ],\n cancelCopilotSeatAssignmentForTeams: [\n \"DELETE /orgs/{org}/copilot/billing/selected_teams\"\n ],\n cancelCopilotSeatAssignmentForUsers: [\n \"DELETE /orgs/{org}/copilot/billing/selected_users\"\n ],\n getCopilotOrganizationDetails: [\"GET /orgs/{org}/copilot/billing\"],\n getCopilotSeatDetailsForUser: [\n \"GET /orgs/{org}/members/{username}/copilot\"\n ],\n listCopilotSeats: [\"GET /orgs/{org}/copilot/billing/seats\"]\n },\n dependabot: {\n addSelectedRepoToOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n createOrUpdateOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}\"\n ],\n createOrUpdateRepoSecret: [\n \"PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\"\n ],\n deleteOrgSecret: [\"DELETE /orgs/{org}/dependabot/secrets/{secret_name}\"],\n deleteRepoSecret: [\n \"DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\"\n ],\n getAlert: [\"GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}\"],\n getOrgPublicKey: [\"GET /orgs/{org}/dependabot/secrets/public-key\"],\n getOrgSecret: [\"GET /orgs/{org}/dependabot/secrets/{secret_name}\"],\n getRepoPublicKey: [\n \"GET /repos/{owner}/{repo}/dependabot/secrets/public-key\"\n ],\n getRepoSecret: [\n \"GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}\"\n ],\n listAlertsForEnterprise: [\n \"GET /enterprises/{enterprise}/dependabot/alerts\"\n ],\n listAlertsForOrg: [\"GET /orgs/{org}/dependabot/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/dependabot/alerts\"],\n listOrgSecrets: [\"GET /orgs/{org}/dependabot/secrets\"],\n listRepoSecrets: [\"GET /repos/{owner}/{repo}/dependabot/secrets\"],\n listSelectedReposForOrgSecret: [\n \"GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories\"\n ],\n removeSelectedRepoFromOrgSecret: [\n \"DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}\"\n ],\n setSelectedReposForOrgSecret: [\n \"PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories\"\n ],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}\"\n ]\n },\n dependencyGraph: {\n createRepositorySnapshot: [\n \"POST /repos/{owner}/{repo}/dependency-graph/snapshots\"\n ],\n diffRange: [\n \"GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}\"\n ],\n exportSbom: [\"GET /repos/{owner}/{repo}/dependency-graph/sbom\"]\n },\n emojis: { get: [\"GET /emojis\"] },\n gists: {\n checkIsStarred: [\"GET /gists/{gist_id}/star\"],\n create: [\"POST /gists\"],\n createComment: [\"POST /gists/{gist_id}/comments\"],\n delete: [\"DELETE /gists/{gist_id}\"],\n deleteComment: [\"DELETE /gists/{gist_id}/comments/{comment_id}\"],\n fork: [\"POST /gists/{gist_id}/forks\"],\n get: [\"GET /gists/{gist_id}\"],\n getComment: [\"GET /gists/{gist_id}/comments/{comment_id}\"],\n getRevision: [\"GET /gists/{gist_id}/{sha}\"],\n list: [\"GET /gists\"],\n listComments: [\"GET /gists/{gist_id}/comments\"],\n listCommits: [\"GET /gists/{gist_id}/commits\"],\n listForUser: [\"GET /users/{username}/gists\"],\n listForks: [\"GET /gists/{gist_id}/forks\"],\n listPublic: [\"GET /gists/public\"],\n listStarred: [\"GET /gists/starred\"],\n star: [\"PUT /gists/{gist_id}/star\"],\n unstar: [\"DELETE /gists/{gist_id}/star\"],\n update: [\"PATCH /gists/{gist_id}\"],\n updateComment: [\"PATCH /gists/{gist_id}/comments/{comment_id}\"]\n },\n git: {\n createBlob: [\"POST /repos/{owner}/{repo}/git/blobs\"],\n createCommit: [\"POST /repos/{owner}/{repo}/git/commits\"],\n createRef: [\"POST /repos/{owner}/{repo}/git/refs\"],\n createTag: [\"POST /repos/{owner}/{repo}/git/tags\"],\n createTree: [\"POST /repos/{owner}/{repo}/git/trees\"],\n deleteRef: [\"DELETE /repos/{owner}/{repo}/git/refs/{ref}\"],\n getBlob: [\"GET /repos/{owner}/{repo}/git/blobs/{file_sha}\"],\n getCommit: [\"GET /repos/{owner}/{repo}/git/commits/{commit_sha}\"],\n getRef: [\"GET /repos/{owner}/{repo}/git/ref/{ref}\"],\n getTag: [\"GET /repos/{owner}/{repo}/git/tags/{tag_sha}\"],\n getTree: [\"GET /repos/{owner}/{repo}/git/trees/{tree_sha}\"],\n listMatchingRefs: [\"GET /repos/{owner}/{repo}/git/matching-refs/{ref}\"],\n updateRef: [\"PATCH /repos/{owner}/{repo}/git/refs/{ref}\"]\n },\n gitignore: {\n getAllTemplates: [\"GET /gitignore/templates\"],\n getTemplate: [\"GET /gitignore/templates/{name}\"]\n },\n interactions: {\n getRestrictionsForAuthenticatedUser: [\"GET /user/interaction-limits\"],\n getRestrictionsForOrg: [\"GET /orgs/{org}/interaction-limits\"],\n getRestrictionsForRepo: [\"GET /repos/{owner}/{repo}/interaction-limits\"],\n getRestrictionsForYourPublicRepos: [\n \"GET /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"getRestrictionsForAuthenticatedUser\"] }\n ],\n removeRestrictionsForAuthenticatedUser: [\"DELETE /user/interaction-limits\"],\n removeRestrictionsForOrg: [\"DELETE /orgs/{org}/interaction-limits\"],\n removeRestrictionsForRepo: [\n \"DELETE /repos/{owner}/{repo}/interaction-limits\"\n ],\n removeRestrictionsForYourPublicRepos: [\n \"DELETE /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"removeRestrictionsForAuthenticatedUser\"] }\n ],\n setRestrictionsForAuthenticatedUser: [\"PUT /user/interaction-limits\"],\n setRestrictionsForOrg: [\"PUT /orgs/{org}/interaction-limits\"],\n setRestrictionsForRepo: [\"PUT /repos/{owner}/{repo}/interaction-limits\"],\n setRestrictionsForYourPublicRepos: [\n \"PUT /user/interaction-limits\",\n {},\n { renamed: [\"interactions\", \"setRestrictionsForAuthenticatedUser\"] }\n ]\n },\n issues: {\n addAssignees: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/assignees\"\n ],\n addLabels: [\"POST /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n checkUserCanBeAssigned: [\"GET /repos/{owner}/{repo}/assignees/{assignee}\"],\n checkUserCanBeAssignedToIssue: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}\"\n ],\n create: [\"POST /repos/{owner}/{repo}/issues\"],\n createComment: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/comments\"\n ],\n createLabel: [\"POST /repos/{owner}/{repo}/labels\"],\n createMilestone: [\"POST /repos/{owner}/{repo}/milestones\"],\n deleteComment: [\n \"DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}\"\n ],\n deleteLabel: [\"DELETE /repos/{owner}/{repo}/labels/{name}\"],\n deleteMilestone: [\n \"DELETE /repos/{owner}/{repo}/milestones/{milestone_number}\"\n ],\n get: [\"GET /repos/{owner}/{repo}/issues/{issue_number}\"],\n getComment: [\"GET /repos/{owner}/{repo}/issues/comments/{comment_id}\"],\n getEvent: [\"GET /repos/{owner}/{repo}/issues/events/{event_id}\"],\n getLabel: [\"GET /repos/{owner}/{repo}/labels/{name}\"],\n getMilestone: [\"GET /repos/{owner}/{repo}/milestones/{milestone_number}\"],\n list: [\"GET /issues\"],\n listAssignees: [\"GET /repos/{owner}/{repo}/assignees\"],\n listComments: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/comments\"],\n listCommentsForRepo: [\"GET /repos/{owner}/{repo}/issues/comments\"],\n listEvents: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/events\"],\n listEventsForRepo: [\"GET /repos/{owner}/{repo}/issues/events\"],\n listEventsForTimeline: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/timeline\"\n ],\n listForAuthenticatedUser: [\"GET /user/issues\"],\n listForOrg: [\"GET /orgs/{org}/issues\"],\n listForRepo: [\"GET /repos/{owner}/{repo}/issues\"],\n listLabelsForMilestone: [\n \"GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels\"\n ],\n listLabelsForRepo: [\"GET /repos/{owner}/{repo}/labels\"],\n listLabelsOnIssue: [\n \"GET /repos/{owner}/{repo}/issues/{issue_number}/labels\"\n ],\n listMilestones: [\"GET /repos/{owner}/{repo}/milestones\"],\n lock: [\"PUT /repos/{owner}/{repo}/issues/{issue_number}/lock\"],\n removeAllLabels: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels\"\n ],\n removeAssignees: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees\"\n ],\n removeLabel: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}\"\n ],\n setLabels: [\"PUT /repos/{owner}/{repo}/issues/{issue_number}/labels\"],\n unlock: [\"DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock\"],\n update: [\"PATCH /repos/{owner}/{repo}/issues/{issue_number}\"],\n updateComment: [\"PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}\"],\n updateLabel: [\"PATCH /repos/{owner}/{repo}/labels/{name}\"],\n updateMilestone: [\n \"PATCH /repos/{owner}/{repo}/milestones/{milestone_number}\"\n ]\n },\n licenses: {\n get: [\"GET /licenses/{license}\"],\n getAllCommonlyUsed: [\"GET /licenses\"],\n getForRepo: [\"GET /repos/{owner}/{repo}/license\"]\n },\n markdown: {\n render: [\"POST /markdown\"],\n renderRaw: [\n \"POST /markdown/raw\",\n { headers: { \"content-type\": \"text/plain; charset=utf-8\" } }\n ]\n },\n meta: {\n get: [\"GET /meta\"],\n getAllVersions: [\"GET /versions\"],\n getOctocat: [\"GET /octocat\"],\n getZen: [\"GET /zen\"],\n root: [\"GET /\"]\n },\n migrations: {\n cancelImport: [\n \"DELETE /repos/{owner}/{repo}/import\",\n {},\n {\n deprecated: \"octokit.rest.migrations.cancelImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#cancel-an-import\"\n }\n ],\n deleteArchiveForAuthenticatedUser: [\n \"DELETE /user/migrations/{migration_id}/archive\"\n ],\n deleteArchiveForOrg: [\n \"DELETE /orgs/{org}/migrations/{migration_id}/archive\"\n ],\n downloadArchiveForOrg: [\n \"GET /orgs/{org}/migrations/{migration_id}/archive\"\n ],\n getArchiveForAuthenticatedUser: [\n \"GET /user/migrations/{migration_id}/archive\"\n ],\n getCommitAuthors: [\n \"GET /repos/{owner}/{repo}/import/authors\",\n {},\n {\n deprecated: \"octokit.rest.migrations.getCommitAuthors() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-commit-authors\"\n }\n ],\n getImportStatus: [\n \"GET /repos/{owner}/{repo}/import\",\n {},\n {\n deprecated: \"octokit.rest.migrations.getImportStatus() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-an-import-status\"\n }\n ],\n getLargeFiles: [\n \"GET /repos/{owner}/{repo}/import/large_files\",\n {},\n {\n deprecated: \"octokit.rest.migrations.getLargeFiles() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-large-files\"\n }\n ],\n getStatusForAuthenticatedUser: [\"GET /user/migrations/{migration_id}\"],\n getStatusForOrg: [\"GET /orgs/{org}/migrations/{migration_id}\"],\n listForAuthenticatedUser: [\"GET /user/migrations\"],\n listForOrg: [\"GET /orgs/{org}/migrations\"],\n listReposForAuthenticatedUser: [\n \"GET /user/migrations/{migration_id}/repositories\"\n ],\n listReposForOrg: [\"GET /orgs/{org}/migrations/{migration_id}/repositories\"],\n listReposForUser: [\n \"GET /user/migrations/{migration_id}/repositories\",\n {},\n { renamed: [\"migrations\", \"listReposForAuthenticatedUser\"] }\n ],\n mapCommitAuthor: [\n \"PATCH /repos/{owner}/{repo}/import/authors/{author_id}\",\n {},\n {\n deprecated: \"octokit.rest.migrations.mapCommitAuthor() is deprecated, see https://docs.github.com/rest/migrations/source-imports#map-a-commit-author\"\n }\n ],\n setLfsPreference: [\n \"PATCH /repos/{owner}/{repo}/import/lfs\",\n {},\n {\n deprecated: \"octokit.rest.migrations.setLfsPreference() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-git-lfs-preference\"\n }\n ],\n startForAuthenticatedUser: [\"POST /user/migrations\"],\n startForOrg: [\"POST /orgs/{org}/migrations\"],\n startImport: [\n \"PUT /repos/{owner}/{repo}/import\",\n {},\n {\n deprecated: \"octokit.rest.migrations.startImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#start-an-import\"\n }\n ],\n unlockRepoForAuthenticatedUser: [\n \"DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock\"\n ],\n unlockRepoForOrg: [\n \"DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock\"\n ],\n updateImport: [\n \"PATCH /repos/{owner}/{repo}/import\",\n {},\n {\n deprecated: \"octokit.rest.migrations.updateImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-an-import\"\n }\n ]\n },\n orgs: {\n addSecurityManagerTeam: [\n \"PUT /orgs/{org}/security-managers/teams/{team_slug}\"\n ],\n blockUser: [\"PUT /orgs/{org}/blocks/{username}\"],\n cancelInvitation: [\"DELETE /orgs/{org}/invitations/{invitation_id}\"],\n checkBlockedUser: [\"GET /orgs/{org}/blocks/{username}\"],\n checkMembershipForUser: [\"GET /orgs/{org}/members/{username}\"],\n checkPublicMembershipForUser: [\"GET /orgs/{org}/public_members/{username}\"],\n convertMemberToOutsideCollaborator: [\n \"PUT /orgs/{org}/outside_collaborators/{username}\"\n ],\n createInvitation: [\"POST /orgs/{org}/invitations\"],\n createOrUpdateCustomProperties: [\"PATCH /orgs/{org}/properties/schema\"],\n createOrUpdateCustomPropertiesValuesForRepos: [\n \"PATCH /orgs/{org}/properties/values\"\n ],\n createOrUpdateCustomProperty: [\n \"PUT /orgs/{org}/properties/schema/{custom_property_name}\"\n ],\n createWebhook: [\"POST /orgs/{org}/hooks\"],\n delete: [\"DELETE /orgs/{org}\"],\n deleteWebhook: [\"DELETE /orgs/{org}/hooks/{hook_id}\"],\n enableOrDisableSecurityProductOnAllOrgRepos: [\n \"POST /orgs/{org}/{security_product}/{enablement}\"\n ],\n get: [\"GET /orgs/{org}\"],\n getAllCustomProperties: [\"GET /orgs/{org}/properties/schema\"],\n getCustomProperty: [\n \"GET /orgs/{org}/properties/schema/{custom_property_name}\"\n ],\n getMembershipForAuthenticatedUser: [\"GET /user/memberships/orgs/{org}\"],\n getMembershipForUser: [\"GET /orgs/{org}/memberships/{username}\"],\n getWebhook: [\"GET /orgs/{org}/hooks/{hook_id}\"],\n getWebhookConfigForOrg: [\"GET /orgs/{org}/hooks/{hook_id}/config\"],\n getWebhookDelivery: [\n \"GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}\"\n ],\n list: [\"GET /organizations\"],\n listAppInstallations: [\"GET /orgs/{org}/installations\"],\n listBlockedUsers: [\"GET /orgs/{org}/blocks\"],\n listCustomPropertiesValuesForRepos: [\"GET /orgs/{org}/properties/values\"],\n listFailedInvitations: [\"GET /orgs/{org}/failed_invitations\"],\n listForAuthenticatedUser: [\"GET /user/orgs\"],\n listForUser: [\"GET /users/{username}/orgs\"],\n listInvitationTeams: [\"GET /orgs/{org}/invitations/{invitation_id}/teams\"],\n listMembers: [\"GET /orgs/{org}/members\"],\n listMembershipsForAuthenticatedUser: [\"GET /user/memberships/orgs\"],\n listOutsideCollaborators: [\"GET /orgs/{org}/outside_collaborators\"],\n listPatGrantRepositories: [\n \"GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories\"\n ],\n listPatGrantRequestRepositories: [\n \"GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories\"\n ],\n listPatGrantRequests: [\"GET /orgs/{org}/personal-access-token-requests\"],\n listPatGrants: [\"GET /orgs/{org}/personal-access-tokens\"],\n listPendingInvitations: [\"GET /orgs/{org}/invitations\"],\n listPublicMembers: [\"GET /orgs/{org}/public_members\"],\n listSecurityManagerTeams: [\"GET /orgs/{org}/security-managers\"],\n listWebhookDeliveries: [\"GET /orgs/{org}/hooks/{hook_id}/deliveries\"],\n listWebhooks: [\"GET /orgs/{org}/hooks\"],\n pingWebhook: [\"POST /orgs/{org}/hooks/{hook_id}/pings\"],\n redeliverWebhookDelivery: [\n \"POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts\"\n ],\n removeCustomProperty: [\n \"DELETE /orgs/{org}/properties/schema/{custom_property_name}\"\n ],\n removeMember: [\"DELETE /orgs/{org}/members/{username}\"],\n removeMembershipForUser: [\"DELETE /orgs/{org}/memberships/{username}\"],\n removeOutsideCollaborator: [\n \"DELETE /orgs/{org}/outside_collaborators/{username}\"\n ],\n removePublicMembershipForAuthenticatedUser: [\n \"DELETE /orgs/{org}/public_members/{username}\"\n ],\n removeSecurityManagerTeam: [\n \"DELETE /orgs/{org}/security-managers/teams/{team_slug}\"\n ],\n reviewPatGrantRequest: [\n \"POST /orgs/{org}/personal-access-token-requests/{pat_request_id}\"\n ],\n reviewPatGrantRequestsInBulk: [\n \"POST /orgs/{org}/personal-access-token-requests\"\n ],\n setMembershipForUser: [\"PUT /orgs/{org}/memberships/{username}\"],\n setPublicMembershipForAuthenticatedUser: [\n \"PUT /orgs/{org}/public_members/{username}\"\n ],\n unblockUser: [\"DELETE /orgs/{org}/blocks/{username}\"],\n update: [\"PATCH /orgs/{org}\"],\n updateMembershipForAuthenticatedUser: [\n \"PATCH /user/memberships/orgs/{org}\"\n ],\n updatePatAccess: [\"POST /orgs/{org}/personal-access-tokens/{pat_id}\"],\n updatePatAccesses: [\"POST /orgs/{org}/personal-access-tokens\"],\n updateWebhook: [\"PATCH /orgs/{org}/hooks/{hook_id}\"],\n updateWebhookConfigForOrg: [\"PATCH /orgs/{org}/hooks/{hook_id}/config\"]\n },\n packages: {\n deletePackageForAuthenticatedUser: [\n \"DELETE /user/packages/{package_type}/{package_name}\"\n ],\n deletePackageForOrg: [\n \"DELETE /orgs/{org}/packages/{package_type}/{package_name}\"\n ],\n deletePackageForUser: [\n \"DELETE /users/{username}/packages/{package_type}/{package_name}\"\n ],\n deletePackageVersionForAuthenticatedUser: [\n \"DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n deletePackageVersionForOrg: [\n \"DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n deletePackageVersionForUser: [\n \"DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n getAllPackageVersionsForAPackageOwnedByAnOrg: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\",\n {},\n { renamed: [\"packages\", \"getAllPackageVersionsForPackageOwnedByOrg\"] }\n ],\n getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions\",\n {},\n {\n renamed: [\n \"packages\",\n \"getAllPackageVersionsForPackageOwnedByAuthenticatedUser\"\n ]\n }\n ],\n getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions\"\n ],\n getAllPackageVersionsForPackageOwnedByOrg: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions\"\n ],\n getAllPackageVersionsForPackageOwnedByUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}/versions\"\n ],\n getPackageForAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}\"\n ],\n getPackageForOrganization: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}\"\n ],\n getPackageForUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}\"\n ],\n getPackageVersionForAuthenticatedUser: [\n \"GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n getPackageVersionForOrganization: [\n \"GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n getPackageVersionForUser: [\n \"GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}\"\n ],\n listDockerMigrationConflictingPackagesForAuthenticatedUser: [\n \"GET /user/docker/conflicts\"\n ],\n listDockerMigrationConflictingPackagesForOrganization: [\n \"GET /orgs/{org}/docker/conflicts\"\n ],\n listDockerMigrationConflictingPackagesForUser: [\n \"GET /users/{username}/docker/conflicts\"\n ],\n listPackagesForAuthenticatedUser: [\"GET /user/packages\"],\n listPackagesForOrganization: [\"GET /orgs/{org}/packages\"],\n listPackagesForUser: [\"GET /users/{username}/packages\"],\n restorePackageForAuthenticatedUser: [\n \"POST /user/packages/{package_type}/{package_name}/restore{?token}\"\n ],\n restorePackageForOrg: [\n \"POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}\"\n ],\n restorePackageForUser: [\n \"POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}\"\n ],\n restorePackageVersionForAuthenticatedUser: [\n \"POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\"\n ],\n restorePackageVersionForOrg: [\n \"POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\"\n ],\n restorePackageVersionForUser: [\n \"POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore\"\n ]\n },\n projects: {\n addCollaborator: [\"PUT /projects/{project_id}/collaborators/{username}\"],\n createCard: [\"POST /projects/columns/{column_id}/cards\"],\n createColumn: [\"POST /projects/{project_id}/columns\"],\n createForAuthenticatedUser: [\"POST /user/projects\"],\n createForOrg: [\"POST /orgs/{org}/projects\"],\n createForRepo: [\"POST /repos/{owner}/{repo}/projects\"],\n delete: [\"DELETE /projects/{project_id}\"],\n deleteCard: [\"DELETE /projects/columns/cards/{card_id}\"],\n deleteColumn: [\"DELETE /projects/columns/{column_id}\"],\n get: [\"GET /projects/{project_id}\"],\n getCard: [\"GET /projects/columns/cards/{card_id}\"],\n getColumn: [\"GET /projects/columns/{column_id}\"],\n getPermissionForUser: [\n \"GET /projects/{project_id}/collaborators/{username}/permission\"\n ],\n listCards: [\"GET /projects/columns/{column_id}/cards\"],\n listCollaborators: [\"GET /projects/{project_id}/collaborators\"],\n listColumns: [\"GET /projects/{project_id}/columns\"],\n listForOrg: [\"GET /orgs/{org}/projects\"],\n listForRepo: [\"GET /repos/{owner}/{repo}/projects\"],\n listForUser: [\"GET /users/{username}/projects\"],\n moveCard: [\"POST /projects/columns/cards/{card_id}/moves\"],\n moveColumn: [\"POST /projects/columns/{column_id}/moves\"],\n removeCollaborator: [\n \"DELETE /projects/{project_id}/collaborators/{username}\"\n ],\n update: [\"PATCH /projects/{project_id}\"],\n updateCard: [\"PATCH /projects/columns/cards/{card_id}\"],\n updateColumn: [\"PATCH /projects/columns/{column_id}\"]\n },\n pulls: {\n checkIfMerged: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/merge\"],\n create: [\"POST /repos/{owner}/{repo}/pulls\"],\n createReplyForReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies\"\n ],\n createReview: [\"POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews\"],\n createReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/comments\"\n ],\n deletePendingReview: [\n \"DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\"\n ],\n deleteReviewComment: [\n \"DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}\"\n ],\n dismissReview: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals\"\n ],\n get: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}\"],\n getReview: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\"\n ],\n getReviewComment: [\"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}\"],\n list: [\"GET /repos/{owner}/{repo}/pulls\"],\n listCommentsForReview: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments\"\n ],\n listCommits: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/commits\"],\n listFiles: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/files\"],\n listRequestedReviewers: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\"\n ],\n listReviewComments: [\n \"GET /repos/{owner}/{repo}/pulls/{pull_number}/comments\"\n ],\n listReviewCommentsForRepo: [\"GET /repos/{owner}/{repo}/pulls/comments\"],\n listReviews: [\"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews\"],\n merge: [\"PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge\"],\n removeRequestedReviewers: [\n \"DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\"\n ],\n requestReviewers: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers\"\n ],\n submitReview: [\n \"POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events\"\n ],\n update: [\"PATCH /repos/{owner}/{repo}/pulls/{pull_number}\"],\n updateBranch: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch\"\n ],\n updateReview: [\n \"PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}\"\n ],\n updateReviewComment: [\n \"PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}\"\n ]\n },\n rateLimit: { get: [\"GET /rate_limit\"] },\n reactions: {\n createForCommitComment: [\n \"POST /repos/{owner}/{repo}/comments/{comment_id}/reactions\"\n ],\n createForIssue: [\n \"POST /repos/{owner}/{repo}/issues/{issue_number}/reactions\"\n ],\n createForIssueComment: [\n \"POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\"\n ],\n createForPullRequestReviewComment: [\n \"POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\"\n ],\n createForRelease: [\n \"POST /repos/{owner}/{repo}/releases/{release_id}/reactions\"\n ],\n createForTeamDiscussionCommentInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\"\n ],\n createForTeamDiscussionInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\"\n ],\n deleteForCommitComment: [\n \"DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}\"\n ],\n deleteForIssue: [\n \"DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}\"\n ],\n deleteForIssueComment: [\n \"DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}\"\n ],\n deleteForPullRequestComment: [\n \"DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}\"\n ],\n deleteForRelease: [\n \"DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}\"\n ],\n deleteForTeamDiscussion: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}\"\n ],\n deleteForTeamDiscussionComment: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}\"\n ],\n listForCommitComment: [\n \"GET /repos/{owner}/{repo}/comments/{comment_id}/reactions\"\n ],\n listForIssue: [\"GET /repos/{owner}/{repo}/issues/{issue_number}/reactions\"],\n listForIssueComment: [\n \"GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions\"\n ],\n listForPullRequestReviewComment: [\n \"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions\"\n ],\n listForRelease: [\n \"GET /repos/{owner}/{repo}/releases/{release_id}/reactions\"\n ],\n listForTeamDiscussionCommentInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions\"\n ],\n listForTeamDiscussionInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions\"\n ]\n },\n repos: {\n acceptInvitation: [\n \"PATCH /user/repository_invitations/{invitation_id}\",\n {},\n { renamed: [\"repos\", \"acceptInvitationForAuthenticatedUser\"] }\n ],\n acceptInvitationForAuthenticatedUser: [\n \"PATCH /user/repository_invitations/{invitation_id}\"\n ],\n addAppAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" }\n ],\n addCollaborator: [\"PUT /repos/{owner}/{repo}/collaborators/{username}\"],\n addStatusCheckContexts: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" }\n ],\n addTeamAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" }\n ],\n addUserAccessRestrictions: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" }\n ],\n checkAutomatedSecurityFixes: [\n \"GET /repos/{owner}/{repo}/automated-security-fixes\"\n ],\n checkCollaborator: [\"GET /repos/{owner}/{repo}/collaborators/{username}\"],\n checkVulnerabilityAlerts: [\n \"GET /repos/{owner}/{repo}/vulnerability-alerts\"\n ],\n codeownersErrors: [\"GET /repos/{owner}/{repo}/codeowners/errors\"],\n compareCommits: [\"GET /repos/{owner}/{repo}/compare/{base}...{head}\"],\n compareCommitsWithBasehead: [\n \"GET /repos/{owner}/{repo}/compare/{basehead}\"\n ],\n createAutolink: [\"POST /repos/{owner}/{repo}/autolinks\"],\n createCommitComment: [\n \"POST /repos/{owner}/{repo}/commits/{commit_sha}/comments\"\n ],\n createCommitSignatureProtection: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\"\n ],\n createCommitStatus: [\"POST /repos/{owner}/{repo}/statuses/{sha}\"],\n createDeployKey: [\"POST /repos/{owner}/{repo}/keys\"],\n createDeployment: [\"POST /repos/{owner}/{repo}/deployments\"],\n createDeploymentBranchPolicy: [\n \"POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\"\n ],\n createDeploymentProtectionRule: [\n \"POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules\"\n ],\n createDeploymentStatus: [\n \"POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\"\n ],\n createDispatchEvent: [\"POST /repos/{owner}/{repo}/dispatches\"],\n createForAuthenticatedUser: [\"POST /user/repos\"],\n createFork: [\"POST /repos/{owner}/{repo}/forks\"],\n createInOrg: [\"POST /orgs/{org}/repos\"],\n createOrUpdateEnvironment: [\n \"PUT /repos/{owner}/{repo}/environments/{environment_name}\"\n ],\n createOrUpdateFileContents: [\"PUT /repos/{owner}/{repo}/contents/{path}\"],\n createOrgRuleset: [\"POST /orgs/{org}/rulesets\"],\n createPagesDeployment: [\"POST /repos/{owner}/{repo}/pages/deployment\"],\n createPagesSite: [\"POST /repos/{owner}/{repo}/pages\"],\n createRelease: [\"POST /repos/{owner}/{repo}/releases\"],\n createRepoRuleset: [\"POST /repos/{owner}/{repo}/rulesets\"],\n createTagProtection: [\"POST /repos/{owner}/{repo}/tags/protection\"],\n createUsingTemplate: [\n \"POST /repos/{template_owner}/{template_repo}/generate\"\n ],\n createWebhook: [\"POST /repos/{owner}/{repo}/hooks\"],\n declineInvitation: [\n \"DELETE /user/repository_invitations/{invitation_id}\",\n {},\n { renamed: [\"repos\", \"declineInvitationForAuthenticatedUser\"] }\n ],\n declineInvitationForAuthenticatedUser: [\n \"DELETE /user/repository_invitations/{invitation_id}\"\n ],\n delete: [\"DELETE /repos/{owner}/{repo}\"],\n deleteAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions\"\n ],\n deleteAdminBranchProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\"\n ],\n deleteAnEnvironment: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}\"\n ],\n deleteAutolink: [\"DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}\"],\n deleteBranchProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection\"\n ],\n deleteCommitComment: [\"DELETE /repos/{owner}/{repo}/comments/{comment_id}\"],\n deleteCommitSignatureProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\"\n ],\n deleteDeployKey: [\"DELETE /repos/{owner}/{repo}/keys/{key_id}\"],\n deleteDeployment: [\n \"DELETE /repos/{owner}/{repo}/deployments/{deployment_id}\"\n ],\n deleteDeploymentBranchPolicy: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\"\n ],\n deleteFile: [\"DELETE /repos/{owner}/{repo}/contents/{path}\"],\n deleteInvitation: [\n \"DELETE /repos/{owner}/{repo}/invitations/{invitation_id}\"\n ],\n deleteOrgRuleset: [\"DELETE /orgs/{org}/rulesets/{ruleset_id}\"],\n deletePagesSite: [\"DELETE /repos/{owner}/{repo}/pages\"],\n deletePullRequestReviewProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\"\n ],\n deleteRelease: [\"DELETE /repos/{owner}/{repo}/releases/{release_id}\"],\n deleteReleaseAsset: [\n \"DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}\"\n ],\n deleteRepoRuleset: [\"DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n deleteTagProtection: [\n \"DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}\"\n ],\n deleteWebhook: [\"DELETE /repos/{owner}/{repo}/hooks/{hook_id}\"],\n disableAutomatedSecurityFixes: [\n \"DELETE /repos/{owner}/{repo}/automated-security-fixes\"\n ],\n disableDeploymentProtectionRule: [\n \"DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}\"\n ],\n disablePrivateVulnerabilityReporting: [\n \"DELETE /repos/{owner}/{repo}/private-vulnerability-reporting\"\n ],\n disableVulnerabilityAlerts: [\n \"DELETE /repos/{owner}/{repo}/vulnerability-alerts\"\n ],\n downloadArchive: [\n \"GET /repos/{owner}/{repo}/zipball/{ref}\",\n {},\n { renamed: [\"repos\", \"downloadZipballArchive\"] }\n ],\n downloadTarballArchive: [\"GET /repos/{owner}/{repo}/tarball/{ref}\"],\n downloadZipballArchive: [\"GET /repos/{owner}/{repo}/zipball/{ref}\"],\n enableAutomatedSecurityFixes: [\n \"PUT /repos/{owner}/{repo}/automated-security-fixes\"\n ],\n enablePrivateVulnerabilityReporting: [\n \"PUT /repos/{owner}/{repo}/private-vulnerability-reporting\"\n ],\n enableVulnerabilityAlerts: [\n \"PUT /repos/{owner}/{repo}/vulnerability-alerts\"\n ],\n generateReleaseNotes: [\n \"POST /repos/{owner}/{repo}/releases/generate-notes\"\n ],\n get: [\"GET /repos/{owner}/{repo}\"],\n getAccessRestrictions: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions\"\n ],\n getAdminBranchProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\"\n ],\n getAllDeploymentProtectionRules: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules\"\n ],\n getAllEnvironments: [\"GET /repos/{owner}/{repo}/environments\"],\n getAllStatusCheckContexts: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\"\n ],\n getAllTopics: [\"GET /repos/{owner}/{repo}/topics\"],\n getAppsWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\"\n ],\n getAutolink: [\"GET /repos/{owner}/{repo}/autolinks/{autolink_id}\"],\n getBranch: [\"GET /repos/{owner}/{repo}/branches/{branch}\"],\n getBranchProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection\"\n ],\n getBranchRules: [\"GET /repos/{owner}/{repo}/rules/branches/{branch}\"],\n getClones: [\"GET /repos/{owner}/{repo}/traffic/clones\"],\n getCodeFrequencyStats: [\"GET /repos/{owner}/{repo}/stats/code_frequency\"],\n getCollaboratorPermissionLevel: [\n \"GET /repos/{owner}/{repo}/collaborators/{username}/permission\"\n ],\n getCombinedStatusForRef: [\"GET /repos/{owner}/{repo}/commits/{ref}/status\"],\n getCommit: [\"GET /repos/{owner}/{repo}/commits/{ref}\"],\n getCommitActivityStats: [\"GET /repos/{owner}/{repo}/stats/commit_activity\"],\n getCommitComment: [\"GET /repos/{owner}/{repo}/comments/{comment_id}\"],\n getCommitSignatureProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures\"\n ],\n getCommunityProfileMetrics: [\"GET /repos/{owner}/{repo}/community/profile\"],\n getContent: [\"GET /repos/{owner}/{repo}/contents/{path}\"],\n getContributorsStats: [\"GET /repos/{owner}/{repo}/stats/contributors\"],\n getCustomDeploymentProtectionRule: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}\"\n ],\n getCustomPropertiesValues: [\"GET /repos/{owner}/{repo}/properties/values\"],\n getDeployKey: [\"GET /repos/{owner}/{repo}/keys/{key_id}\"],\n getDeployment: [\"GET /repos/{owner}/{repo}/deployments/{deployment_id}\"],\n getDeploymentBranchPolicy: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\"\n ],\n getDeploymentStatus: [\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}\"\n ],\n getEnvironment: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}\"\n ],\n getLatestPagesBuild: [\"GET /repos/{owner}/{repo}/pages/builds/latest\"],\n getLatestRelease: [\"GET /repos/{owner}/{repo}/releases/latest\"],\n getOrgRuleSuite: [\"GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}\"],\n getOrgRuleSuites: [\"GET /orgs/{org}/rulesets/rule-suites\"],\n getOrgRuleset: [\"GET /orgs/{org}/rulesets/{ruleset_id}\"],\n getOrgRulesets: [\"GET /orgs/{org}/rulesets\"],\n getPages: [\"GET /repos/{owner}/{repo}/pages\"],\n getPagesBuild: [\"GET /repos/{owner}/{repo}/pages/builds/{build_id}\"],\n getPagesHealthCheck: [\"GET /repos/{owner}/{repo}/pages/health\"],\n getParticipationStats: [\"GET /repos/{owner}/{repo}/stats/participation\"],\n getPullRequestReviewProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\"\n ],\n getPunchCardStats: [\"GET /repos/{owner}/{repo}/stats/punch_card\"],\n getReadme: [\"GET /repos/{owner}/{repo}/readme\"],\n getReadmeInDirectory: [\"GET /repos/{owner}/{repo}/readme/{dir}\"],\n getRelease: [\"GET /repos/{owner}/{repo}/releases/{release_id}\"],\n getReleaseAsset: [\"GET /repos/{owner}/{repo}/releases/assets/{asset_id}\"],\n getReleaseByTag: [\"GET /repos/{owner}/{repo}/releases/tags/{tag}\"],\n getRepoRuleSuite: [\n \"GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}\"\n ],\n getRepoRuleSuites: [\"GET /repos/{owner}/{repo}/rulesets/rule-suites\"],\n getRepoRuleset: [\"GET /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n getRepoRulesets: [\"GET /repos/{owner}/{repo}/rulesets\"],\n getStatusChecksProtection: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\"\n ],\n getTeamsWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\"\n ],\n getTopPaths: [\"GET /repos/{owner}/{repo}/traffic/popular/paths\"],\n getTopReferrers: [\"GET /repos/{owner}/{repo}/traffic/popular/referrers\"],\n getUsersWithAccessToProtectedBranch: [\n \"GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\"\n ],\n getViews: [\"GET /repos/{owner}/{repo}/traffic/views\"],\n getWebhook: [\"GET /repos/{owner}/{repo}/hooks/{hook_id}\"],\n getWebhookConfigForRepo: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/config\"\n ],\n getWebhookDelivery: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}\"\n ],\n listActivities: [\"GET /repos/{owner}/{repo}/activity\"],\n listAutolinks: [\"GET /repos/{owner}/{repo}/autolinks\"],\n listBranches: [\"GET /repos/{owner}/{repo}/branches\"],\n listBranchesForHeadCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head\"\n ],\n listCollaborators: [\"GET /repos/{owner}/{repo}/collaborators\"],\n listCommentsForCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/comments\"\n ],\n listCommitCommentsForRepo: [\"GET /repos/{owner}/{repo}/comments\"],\n listCommitStatusesForRef: [\n \"GET /repos/{owner}/{repo}/commits/{ref}/statuses\"\n ],\n listCommits: [\"GET /repos/{owner}/{repo}/commits\"],\n listContributors: [\"GET /repos/{owner}/{repo}/contributors\"],\n listCustomDeploymentRuleIntegrations: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps\"\n ],\n listDeployKeys: [\"GET /repos/{owner}/{repo}/keys\"],\n listDeploymentBranchPolicies: [\n \"GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies\"\n ],\n listDeploymentStatuses: [\n \"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses\"\n ],\n listDeployments: [\"GET /repos/{owner}/{repo}/deployments\"],\n listForAuthenticatedUser: [\"GET /user/repos\"],\n listForOrg: [\"GET /orgs/{org}/repos\"],\n listForUser: [\"GET /users/{username}/repos\"],\n listForks: [\"GET /repos/{owner}/{repo}/forks\"],\n listInvitations: [\"GET /repos/{owner}/{repo}/invitations\"],\n listInvitationsForAuthenticatedUser: [\"GET /user/repository_invitations\"],\n listLanguages: [\"GET /repos/{owner}/{repo}/languages\"],\n listPagesBuilds: [\"GET /repos/{owner}/{repo}/pages/builds\"],\n listPublic: [\"GET /repositories\"],\n listPullRequestsAssociatedWithCommit: [\n \"GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls\"\n ],\n listReleaseAssets: [\n \"GET /repos/{owner}/{repo}/releases/{release_id}/assets\"\n ],\n listReleases: [\"GET /repos/{owner}/{repo}/releases\"],\n listTagProtection: [\"GET /repos/{owner}/{repo}/tags/protection\"],\n listTags: [\"GET /repos/{owner}/{repo}/tags\"],\n listTeams: [\"GET /repos/{owner}/{repo}/teams\"],\n listWebhookDeliveries: [\n \"GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries\"\n ],\n listWebhooks: [\"GET /repos/{owner}/{repo}/hooks\"],\n merge: [\"POST /repos/{owner}/{repo}/merges\"],\n mergeUpstream: [\"POST /repos/{owner}/{repo}/merge-upstream\"],\n pingWebhook: [\"POST /repos/{owner}/{repo}/hooks/{hook_id}/pings\"],\n redeliverWebhookDelivery: [\n \"POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts\"\n ],\n removeAppAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" }\n ],\n removeCollaborator: [\n \"DELETE /repos/{owner}/{repo}/collaborators/{username}\"\n ],\n removeStatusCheckContexts: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" }\n ],\n removeStatusCheckProtection: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\"\n ],\n removeTeamAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" }\n ],\n removeUserAccessRestrictions: [\n \"DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" }\n ],\n renameBranch: [\"POST /repos/{owner}/{repo}/branches/{branch}/rename\"],\n replaceAllTopics: [\"PUT /repos/{owner}/{repo}/topics\"],\n requestPagesBuild: [\"POST /repos/{owner}/{repo}/pages/builds\"],\n setAdminBranchProtection: [\n \"POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins\"\n ],\n setAppAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps\",\n {},\n { mapToData: \"apps\" }\n ],\n setStatusCheckContexts: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts\",\n {},\n { mapToData: \"contexts\" }\n ],\n setTeamAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams\",\n {},\n { mapToData: \"teams\" }\n ],\n setUserAccessRestrictions: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users\",\n {},\n { mapToData: \"users\" }\n ],\n testPushWebhook: [\"POST /repos/{owner}/{repo}/hooks/{hook_id}/tests\"],\n transfer: [\"POST /repos/{owner}/{repo}/transfer\"],\n update: [\"PATCH /repos/{owner}/{repo}\"],\n updateBranchProtection: [\n \"PUT /repos/{owner}/{repo}/branches/{branch}/protection\"\n ],\n updateCommitComment: [\"PATCH /repos/{owner}/{repo}/comments/{comment_id}\"],\n updateDeploymentBranchPolicy: [\n \"PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}\"\n ],\n updateInformationAboutPagesSite: [\"PUT /repos/{owner}/{repo}/pages\"],\n updateInvitation: [\n \"PATCH /repos/{owner}/{repo}/invitations/{invitation_id}\"\n ],\n updateOrgRuleset: [\"PUT /orgs/{org}/rulesets/{ruleset_id}\"],\n updatePullRequestReviewProtection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews\"\n ],\n updateRelease: [\"PATCH /repos/{owner}/{repo}/releases/{release_id}\"],\n updateReleaseAsset: [\n \"PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}\"\n ],\n updateRepoRuleset: [\"PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}\"],\n updateStatusCheckPotection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\",\n {},\n { renamed: [\"repos\", \"updateStatusCheckProtection\"] }\n ],\n updateStatusCheckProtection: [\n \"PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks\"\n ],\n updateWebhook: [\"PATCH /repos/{owner}/{repo}/hooks/{hook_id}\"],\n updateWebhookConfigForRepo: [\n \"PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config\"\n ],\n uploadReleaseAsset: [\n \"POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}\",\n { baseUrl: \"https://uploads.github.com\" }\n ]\n },\n search: {\n code: [\"GET /search/code\"],\n commits: [\"GET /search/commits\"],\n issuesAndPullRequests: [\"GET /search/issues\"],\n labels: [\"GET /search/labels\"],\n repos: [\"GET /search/repositories\"],\n topics: [\"GET /search/topics\"],\n users: [\"GET /search/users\"]\n },\n secretScanning: {\n getAlert: [\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}\"\n ],\n listAlertsForEnterprise: [\n \"GET /enterprises/{enterprise}/secret-scanning/alerts\"\n ],\n listAlertsForOrg: [\"GET /orgs/{org}/secret-scanning/alerts\"],\n listAlertsForRepo: [\"GET /repos/{owner}/{repo}/secret-scanning/alerts\"],\n listLocationsForAlert: [\n \"GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations\"\n ],\n updateAlert: [\n \"PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}\"\n ]\n },\n securityAdvisories: {\n createPrivateVulnerabilityReport: [\n \"POST /repos/{owner}/{repo}/security-advisories/reports\"\n ],\n createRepositoryAdvisory: [\n \"POST /repos/{owner}/{repo}/security-advisories\"\n ],\n createRepositoryAdvisoryCveRequest: [\n \"POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve\"\n ],\n getGlobalAdvisory: [\"GET /advisories/{ghsa_id}\"],\n getRepositoryAdvisory: [\n \"GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}\"\n ],\n listGlobalAdvisories: [\"GET /advisories\"],\n listOrgRepositoryAdvisories: [\"GET /orgs/{org}/security-advisories\"],\n listRepositoryAdvisories: [\"GET /repos/{owner}/{repo}/security-advisories\"],\n updateRepositoryAdvisory: [\n \"PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}\"\n ]\n },\n teams: {\n addOrUpdateMembershipForUserInOrg: [\n \"PUT /orgs/{org}/teams/{team_slug}/memberships/{username}\"\n ],\n addOrUpdateProjectPermissionsInOrg: [\n \"PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}\"\n ],\n addOrUpdateRepoPermissionsInOrg: [\n \"PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\"\n ],\n checkPermissionsForProjectInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/projects/{project_id}\"\n ],\n checkPermissionsForRepoInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\"\n ],\n create: [\"POST /orgs/{org}/teams\"],\n createDiscussionCommentInOrg: [\n \"POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\"\n ],\n createDiscussionInOrg: [\"POST /orgs/{org}/teams/{team_slug}/discussions\"],\n deleteDiscussionCommentInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\"\n ],\n deleteDiscussionInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\"\n ],\n deleteInOrg: [\"DELETE /orgs/{org}/teams/{team_slug}\"],\n getByName: [\"GET /orgs/{org}/teams/{team_slug}\"],\n getDiscussionCommentInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\"\n ],\n getDiscussionInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\"\n ],\n getMembershipForUserInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/memberships/{username}\"\n ],\n list: [\"GET /orgs/{org}/teams\"],\n listChildInOrg: [\"GET /orgs/{org}/teams/{team_slug}/teams\"],\n listDiscussionCommentsInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments\"\n ],\n listDiscussionsInOrg: [\"GET /orgs/{org}/teams/{team_slug}/discussions\"],\n listForAuthenticatedUser: [\"GET /user/teams\"],\n listMembersInOrg: [\"GET /orgs/{org}/teams/{team_slug}/members\"],\n listPendingInvitationsInOrg: [\n \"GET /orgs/{org}/teams/{team_slug}/invitations\"\n ],\n listProjectsInOrg: [\"GET /orgs/{org}/teams/{team_slug}/projects\"],\n listReposInOrg: [\"GET /orgs/{org}/teams/{team_slug}/repos\"],\n removeMembershipForUserInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}\"\n ],\n removeProjectInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}\"\n ],\n removeRepoInOrg: [\n \"DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}\"\n ],\n updateDiscussionCommentInOrg: [\n \"PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}\"\n ],\n updateDiscussionInOrg: [\n \"PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}\"\n ],\n updateInOrg: [\"PATCH /orgs/{org}/teams/{team_slug}\"]\n },\n users: {\n addEmailForAuthenticated: [\n \"POST /user/emails\",\n {},\n { renamed: [\"users\", \"addEmailForAuthenticatedUser\"] }\n ],\n addEmailForAuthenticatedUser: [\"POST /user/emails\"],\n addSocialAccountForAuthenticatedUser: [\"POST /user/social_accounts\"],\n block: [\"PUT /user/blocks/{username}\"],\n checkBlocked: [\"GET /user/blocks/{username}\"],\n checkFollowingForUser: [\"GET /users/{username}/following/{target_user}\"],\n checkPersonIsFollowedByAuthenticated: [\"GET /user/following/{username}\"],\n createGpgKeyForAuthenticated: [\n \"POST /user/gpg_keys\",\n {},\n { renamed: [\"users\", \"createGpgKeyForAuthenticatedUser\"] }\n ],\n createGpgKeyForAuthenticatedUser: [\"POST /user/gpg_keys\"],\n createPublicSshKeyForAuthenticated: [\n \"POST /user/keys\",\n {},\n { renamed: [\"users\", \"createPublicSshKeyForAuthenticatedUser\"] }\n ],\n createPublicSshKeyForAuthenticatedUser: [\"POST /user/keys\"],\n createSshSigningKeyForAuthenticatedUser: [\"POST /user/ssh_signing_keys\"],\n deleteEmailForAuthenticated: [\n \"DELETE /user/emails\",\n {},\n { renamed: [\"users\", \"deleteEmailForAuthenticatedUser\"] }\n ],\n deleteEmailForAuthenticatedUser: [\"DELETE /user/emails\"],\n deleteGpgKeyForAuthenticated: [\n \"DELETE /user/gpg_keys/{gpg_key_id}\",\n {},\n { renamed: [\"users\", \"deleteGpgKeyForAuthenticatedUser\"] }\n ],\n deleteGpgKeyForAuthenticatedUser: [\"DELETE /user/gpg_keys/{gpg_key_id}\"],\n deletePublicSshKeyForAuthenticated: [\n \"DELETE /user/keys/{key_id}\",\n {},\n { renamed: [\"users\", \"deletePublicSshKeyForAuthenticatedUser\"] }\n ],\n deletePublicSshKeyForAuthenticatedUser: [\"DELETE /user/keys/{key_id}\"],\n deleteSocialAccountForAuthenticatedUser: [\"DELETE /user/social_accounts\"],\n deleteSshSigningKeyForAuthenticatedUser: [\n \"DELETE /user/ssh_signing_keys/{ssh_signing_key_id}\"\n ],\n follow: [\"PUT /user/following/{username}\"],\n getAuthenticated: [\"GET /user\"],\n getByUsername: [\"GET /users/{username}\"],\n getContextForUser: [\"GET /users/{username}/hovercard\"],\n getGpgKeyForAuthenticated: [\n \"GET /user/gpg_keys/{gpg_key_id}\",\n {},\n { renamed: [\"users\", \"getGpgKeyForAuthenticatedUser\"] }\n ],\n getGpgKeyForAuthenticatedUser: [\"GET /user/gpg_keys/{gpg_key_id}\"],\n getPublicSshKeyForAuthenticated: [\n \"GET /user/keys/{key_id}\",\n {},\n { renamed: [\"users\", \"getPublicSshKeyForAuthenticatedUser\"] }\n ],\n getPublicSshKeyForAuthenticatedUser: [\"GET /user/keys/{key_id}\"],\n getSshSigningKeyForAuthenticatedUser: [\n \"GET /user/ssh_signing_keys/{ssh_signing_key_id}\"\n ],\n list: [\"GET /users\"],\n listBlockedByAuthenticated: [\n \"GET /user/blocks\",\n {},\n { renamed: [\"users\", \"listBlockedByAuthenticatedUser\"] }\n ],\n listBlockedByAuthenticatedUser: [\"GET /user/blocks\"],\n listEmailsForAuthenticated: [\n \"GET /user/emails\",\n {},\n { renamed: [\"users\", \"listEmailsForAuthenticatedUser\"] }\n ],\n listEmailsForAuthenticatedUser: [\"GET /user/emails\"],\n listFollowedByAuthenticated: [\n \"GET /user/following\",\n {},\n { renamed: [\"users\", \"listFollowedByAuthenticatedUser\"] }\n ],\n listFollowedByAuthenticatedUser: [\"GET /user/following\"],\n listFollowersForAuthenticatedUser: [\"GET /user/followers\"],\n listFollowersForUser: [\"GET /users/{username}/followers\"],\n listFollowingForUser: [\"GET /users/{username}/following\"],\n listGpgKeysForAuthenticated: [\n \"GET /user/gpg_keys\",\n {},\n { renamed: [\"users\", \"listGpgKeysForAuthenticatedUser\"] }\n ],\n listGpgKeysForAuthenticatedUser: [\"GET /user/gpg_keys\"],\n listGpgKeysForUser: [\"GET /users/{username}/gpg_keys\"],\n listPublicEmailsForAuthenticated: [\n \"GET /user/public_emails\",\n {},\n { renamed: [\"users\", \"listPublicEmailsForAuthenticatedUser\"] }\n ],\n listPublicEmailsForAuthenticatedUser: [\"GET /user/public_emails\"],\n listPublicKeysForUser: [\"GET /users/{username}/keys\"],\n listPublicSshKeysForAuthenticated: [\n \"GET /user/keys\",\n {},\n { renamed: [\"users\", \"listPublicSshKeysForAuthenticatedUser\"] }\n ],\n listPublicSshKeysForAuthenticatedUser: [\"GET /user/keys\"],\n listSocialAccountsForAuthenticatedUser: [\"GET /user/social_accounts\"],\n listSocialAccountsForUser: [\"GET /users/{username}/social_accounts\"],\n listSshSigningKeysForAuthenticatedUser: [\"GET /user/ssh_signing_keys\"],\n listSshSigningKeysForUser: [\"GET /users/{username}/ssh_signing_keys\"],\n setPrimaryEmailVisibilityForAuthenticated: [\n \"PATCH /user/email/visibility\",\n {},\n { renamed: [\"users\", \"setPrimaryEmailVisibilityForAuthenticatedUser\"] }\n ],\n setPrimaryEmailVisibilityForAuthenticatedUser: [\n \"PATCH /user/email/visibility\"\n ],\n unblock: [\"DELETE /user/blocks/{username}\"],\n unfollow: [\"DELETE /user/following/{username}\"],\n updateAuthenticated: [\"PATCH /user\"]\n }\n};\nvar endpoints_default = Endpoints;\n\n// pkg/dist-src/endpoints-to-methods.js\nvar endpointMethodsMap = /* @__PURE__ */ new Map();\nfor (const [scope, endpoints] of Object.entries(endpoints_default)) {\n for (const [methodName, endpoint] of Object.entries(endpoints)) {\n const [route, defaults, decorations] = endpoint;\n const [method, url] = route.split(/ /);\n const endpointDefaults = Object.assign(\n {\n method,\n url\n },\n defaults\n );\n if (!endpointMethodsMap.has(scope)) {\n endpointMethodsMap.set(scope, /* @__PURE__ */ new Map());\n }\n endpointMethodsMap.get(scope).set(methodName, {\n scope,\n methodName,\n endpointDefaults,\n decorations\n });\n }\n}\nvar handler = {\n has({ scope }, methodName) {\n return endpointMethodsMap.get(scope).has(methodName);\n },\n getOwnPropertyDescriptor(target, methodName) {\n return {\n value: this.get(target, methodName),\n // ensures method is in the cache\n configurable: true,\n writable: true,\n enumerable: true\n };\n },\n defineProperty(target, methodName, descriptor) {\n Object.defineProperty(target.cache, methodName, descriptor);\n return true;\n },\n deleteProperty(target, methodName) {\n delete target.cache[methodName];\n return true;\n },\n ownKeys({ scope }) {\n return [...endpointMethodsMap.get(scope).keys()];\n },\n set(target, methodName, value) {\n return target.cache[methodName] = value;\n },\n get({ octokit, scope, cache }, methodName) {\n if (cache[methodName]) {\n return cache[methodName];\n }\n const method = endpointMethodsMap.get(scope).get(methodName);\n if (!method) {\n return void 0;\n }\n const { endpointDefaults, decorations } = method;\n if (decorations) {\n cache[methodName] = decorate(\n octokit,\n scope,\n methodName,\n endpointDefaults,\n decorations\n );\n } else {\n cache[methodName] = octokit.request.defaults(endpointDefaults);\n }\n return cache[methodName];\n }\n};\nfunction endpointsToMethods(octokit) {\n const newMethods = {};\n for (const scope of endpointMethodsMap.keys()) {\n newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler);\n }\n return newMethods;\n}\nfunction decorate(octokit, scope, methodName, defaults, decorations) {\n const requestWithDefaults = octokit.request.defaults(defaults);\n function withDecorations(...args) {\n let options = requestWithDefaults.endpoint.merge(...args);\n if (decorations.mapToData) {\n options = Object.assign({}, options, {\n data: options[decorations.mapToData],\n [decorations.mapToData]: void 0\n });\n return requestWithDefaults(options);\n }\n if (decorations.renamed) {\n const [newScope, newMethodName] = decorations.renamed;\n octokit.log.warn(\n `octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`\n );\n }\n if (decorations.deprecated) {\n octokit.log.warn(decorations.deprecated);\n }\n if (decorations.renamedParameters) {\n const options2 = requestWithDefaults.endpoint.merge(...args);\n for (const [name, alias] of Object.entries(\n decorations.renamedParameters\n )) {\n if (name in options2) {\n octokit.log.warn(\n `\"${name}\" parameter is deprecated for \"octokit.${scope}.${methodName}()\". Use \"${alias}\" instead`\n );\n if (!(alias in options2)) {\n options2[alias] = options2[name];\n }\n delete options2[name];\n }\n }\n return requestWithDefaults(options2);\n }\n return requestWithDefaults(...args);\n }\n return Object.assign(withDecorations, requestWithDefaults);\n}\n\n// pkg/dist-src/index.js\nfunction restEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit);\n return {\n rest: api\n };\n}\nrestEndpointMethods.VERSION = VERSION;\nfunction legacyRestEndpointMethods(octokit) {\n const api = endpointsToMethods(octokit);\n return {\n ...api,\n rest: api\n };\n}\nlegacyRestEndpointMethods.VERSION = VERSION;\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n legacyRestEndpointMethods,\n restEndpointMethods\n});\n","\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n RequestError: () => RequestError\n});\nmodule.exports = __toCommonJS(dist_src_exports);\nvar import_deprecation = require(\"deprecation\");\nvar import_once = __toESM(require(\"once\"));\nvar logOnceCode = (0, import_once.default)((deprecation) => console.warn(deprecation));\nvar logOnceHeaders = (0, import_once.default)((deprecation) => console.warn(deprecation));\nvar RequestError = class extends Error {\n constructor(message, statusCode, options) {\n super(message);\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n this.name = \"HttpError\";\n this.status = statusCode;\n let headers;\n if (\"headers\" in options && typeof options.headers !== \"undefined\") {\n headers = options.headers;\n }\n if (\"response\" in options) {\n this.response = options.response;\n headers = options.response.headers;\n }\n const requestCopy = Object.assign({}, options.request);\n if (options.request.headers.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(\n / .*$/,\n \" [REDACTED]\"\n )\n });\n }\n requestCopy.url = requestCopy.url.replace(/\\bclient_secret=\\w+/g, \"client_secret=[REDACTED]\").replace(/\\baccess_token=\\w+/g, \"access_token=[REDACTED]\");\n this.request = requestCopy;\n Object.defineProperty(this, \"code\", {\n get() {\n logOnceCode(\n new import_deprecation.Deprecation(\n \"[@octokit/request-error] `error.code` is deprecated, use `error.status`.\"\n )\n );\n return statusCode;\n }\n });\n Object.defineProperty(this, \"headers\", {\n get() {\n logOnceHeaders(\n new import_deprecation.Deprecation(\n \"[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`.\"\n )\n );\n return headers || {};\n }\n });\n }\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n RequestError\n});\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// pkg/dist-src/index.js\nvar dist_src_exports = {};\n__export(dist_src_exports, {\n request: () => request\n});\nmodule.exports = __toCommonJS(dist_src_exports);\nvar import_endpoint = require(\"@octokit/endpoint\");\nvar import_universal_user_agent = require(\"universal-user-agent\");\n\n// pkg/dist-src/version.js\nvar VERSION = \"8.1.5\";\n\n// pkg/dist-src/fetch-wrapper.js\nvar import_is_plain_object = require(\"is-plain-object\");\nvar import_request_error = require(\"@octokit/request-error\");\n\n// pkg/dist-src/get-buffer-response.js\nfunction getBufferResponse(response) {\n return response.arrayBuffer();\n}\n\n// pkg/dist-src/fetch-wrapper.js\nfunction fetchWrapper(requestOptions) {\n var _a, _b, _c;\n const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console;\n const parseSuccessResponseBody = ((_a = requestOptions.request) == null ? void 0 : _a.parseSuccessResponseBody) !== false;\n if ((0, import_is_plain_object.isPlainObject)(requestOptions.body) || Array.isArray(requestOptions.body)) {\n requestOptions.body = JSON.stringify(requestOptions.body);\n }\n let headers = {};\n let status;\n let url;\n let { fetch } = globalThis;\n if ((_b = requestOptions.request) == null ? void 0 : _b.fetch) {\n fetch = requestOptions.request.fetch;\n }\n if (!fetch) {\n throw new Error(\n \"fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing\"\n );\n }\n return fetch(requestOptions.url, {\n method: requestOptions.method,\n body: requestOptions.body,\n headers: requestOptions.headers,\n signal: (_c = requestOptions.request) == null ? void 0 : _c.signal,\n // duplex must be set if request.body is ReadableStream or Async Iterables.\n // See https://fetch.spec.whatwg.org/#dom-requestinit-duplex.\n ...requestOptions.body && { duplex: \"half\" }\n }).then(async (response) => {\n url = response.url;\n status = response.status;\n for (const keyAndValue of response.headers) {\n headers[keyAndValue[0]] = keyAndValue[1];\n }\n if (\"deprecation\" in headers) {\n const matches = headers.link && headers.link.match(/<([^>]+)>; rel=\"deprecation\"/);\n const deprecationLink = matches && matches.pop();\n log.warn(\n `[@octokit/request] \"${requestOptions.method} ${requestOptions.url}\" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : \"\"}`\n );\n }\n if (status === 204 || status === 205) {\n return;\n }\n if (requestOptions.method === \"HEAD\") {\n if (status < 400) {\n return;\n }\n throw new import_request_error.RequestError(response.statusText, status, {\n response: {\n url,\n status,\n headers,\n data: void 0\n },\n request: requestOptions\n });\n }\n if (status === 304) {\n throw new import_request_error.RequestError(\"Not modified\", status, {\n response: {\n url,\n status,\n headers,\n data: await getResponseData(response)\n },\n request: requestOptions\n });\n }\n if (status >= 400) {\n const data = await getResponseData(response);\n const error = new import_request_error.RequestError(toErrorMessage(data), status, {\n response: {\n url,\n status,\n headers,\n data\n },\n request: requestOptions\n });\n throw error;\n }\n return parseSuccessResponseBody ? await getResponseData(response) : response.body;\n }).then((data) => {\n return {\n status,\n url,\n headers,\n data\n };\n }).catch((error) => {\n if (error instanceof import_request_error.RequestError)\n throw error;\n else if (error.name === \"AbortError\")\n throw error;\n let message = error.message;\n if (error.name === \"TypeError\" && \"cause\" in error) {\n if (error.cause instanceof Error) {\n message = error.cause.message;\n } else if (typeof error.cause === \"string\") {\n message = error.cause;\n }\n }\n throw new import_request_error.RequestError(message, 500, {\n request: requestOptions\n });\n });\n}\nasync function getResponseData(response) {\n const contentType = response.headers.get(\"content-type\");\n if (/application\\/json/.test(contentType)) {\n return response.json().catch(() => response.text()).catch(() => \"\");\n }\n if (!contentType || /^text\\/|charset=utf-8$/.test(contentType)) {\n return response.text();\n }\n return getBufferResponse(response);\n}\nfunction toErrorMessage(data) {\n if (typeof data === \"string\")\n return data;\n if (\"message\" in data) {\n if (Array.isArray(data.errors)) {\n return `${data.message}: ${data.errors.map(JSON.stringify).join(\", \")}`;\n }\n return data.message;\n }\n return `Unknown error: ${JSON.stringify(data)}`;\n}\n\n// pkg/dist-src/with-defaults.js\nfunction withDefaults(oldEndpoint, newDefaults) {\n const endpoint2 = oldEndpoint.defaults(newDefaults);\n const newApi = function(route, parameters) {\n const endpointOptions = endpoint2.merge(route, parameters);\n if (!endpointOptions.request || !endpointOptions.request.hook) {\n return fetchWrapper(endpoint2.parse(endpointOptions));\n }\n const request2 = (route2, parameters2) => {\n return fetchWrapper(\n endpoint2.parse(endpoint2.merge(route2, parameters2))\n );\n };\n Object.assign(request2, {\n endpoint: endpoint2,\n defaults: withDefaults.bind(null, endpoint2)\n });\n return endpointOptions.request.hook(request2, endpointOptions);\n };\n return Object.assign(newApi, {\n endpoint: endpoint2,\n defaults: withDefaults.bind(null, endpoint2)\n });\n}\n\n// pkg/dist-src/index.js\nvar request = withDefaults(import_endpoint.endpoint, {\n headers: {\n \"user-agent\": `octokit-request.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`\n }\n});\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n request\n});\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = exports.DEFAULT_USE_DUALSTACK_ENDPOINT = exports.CONFIG_USE_DUALSTACK_ENDPOINT = exports.ENV_USE_DUALSTACK_ENDPOINT = void 0;\nconst util_config_provider_1 = require(\"@smithy/util-config-provider\");\nexports.ENV_USE_DUALSTACK_ENDPOINT = \"AWS_USE_DUALSTACK_ENDPOINT\";\nexports.CONFIG_USE_DUALSTACK_ENDPOINT = \"use_dualstack_endpoint\";\nexports.DEFAULT_USE_DUALSTACK_ENDPOINT = false;\nexports.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => (0, util_config_provider_1.booleanSelector)(env, exports.ENV_USE_DUALSTACK_ENDPOINT, util_config_provider_1.SelectorType.ENV),\n configFileSelector: (profile) => (0, util_config_provider_1.booleanSelector)(profile, exports.CONFIG_USE_DUALSTACK_ENDPOINT, util_config_provider_1.SelectorType.CONFIG),\n default: false,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = exports.DEFAULT_USE_FIPS_ENDPOINT = exports.CONFIG_USE_FIPS_ENDPOINT = exports.ENV_USE_FIPS_ENDPOINT = void 0;\nconst util_config_provider_1 = require(\"@smithy/util-config-provider\");\nexports.ENV_USE_FIPS_ENDPOINT = \"AWS_USE_FIPS_ENDPOINT\";\nexports.CONFIG_USE_FIPS_ENDPOINT = \"use_fips_endpoint\";\nexports.DEFAULT_USE_FIPS_ENDPOINT = false;\nexports.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => (0, util_config_provider_1.booleanSelector)(env, exports.ENV_USE_FIPS_ENDPOINT, util_config_provider_1.SelectorType.ENV),\n configFileSelector: (profile) => (0, util_config_provider_1.booleanSelector)(profile, exports.CONFIG_USE_FIPS_ENDPOINT, util_config_provider_1.SelectorType.CONFIG),\n default: false,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./NodeUseDualstackEndpointConfigOptions\"), exports);\ntslib_1.__exportStar(require(\"./NodeUseFipsEndpointConfigOptions\"), exports);\ntslib_1.__exportStar(require(\"./resolveCustomEndpointsConfig\"), exports);\ntslib_1.__exportStar(require(\"./resolveEndpointsConfig\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveCustomEndpointsConfig = void 0;\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst resolveCustomEndpointsConfig = (input) => {\n var _a, _b;\n const { endpoint, urlParser } = input;\n return {\n ...input,\n tls: (_a = input.tls) !== null && _a !== void 0 ? _a : true,\n endpoint: (0, util_middleware_1.normalizeProvider)(typeof endpoint === \"string\" ? urlParser(endpoint) : endpoint),\n isCustomEndpoint: true,\n useDualstackEndpoint: (0, util_middleware_1.normalizeProvider)((_b = input.useDualstackEndpoint) !== null && _b !== void 0 ? _b : false),\n };\n};\nexports.resolveCustomEndpointsConfig = resolveCustomEndpointsConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveEndpointsConfig = void 0;\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst getEndpointFromRegion_1 = require(\"./utils/getEndpointFromRegion\");\nconst resolveEndpointsConfig = (input) => {\n var _a, _b;\n const useDualstackEndpoint = (0, util_middleware_1.normalizeProvider)((_a = input.useDualstackEndpoint) !== null && _a !== void 0 ? _a : false);\n const { endpoint, useFipsEndpoint, urlParser } = input;\n return {\n ...input,\n tls: (_b = input.tls) !== null && _b !== void 0 ? _b : true,\n endpoint: endpoint\n ? (0, util_middleware_1.normalizeProvider)(typeof endpoint === \"string\" ? urlParser(endpoint) : endpoint)\n : () => (0, getEndpointFromRegion_1.getEndpointFromRegion)({ ...input, useDualstackEndpoint, useFipsEndpoint }),\n isCustomEndpoint: !!endpoint,\n useDualstackEndpoint,\n };\n};\nexports.resolveEndpointsConfig = resolveEndpointsConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointFromRegion = void 0;\nconst getEndpointFromRegion = async (input) => {\n var _a;\n const { tls = true } = input;\n const region = await input.region();\n const dnsHostRegex = new RegExp(/^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$/);\n if (!dnsHostRegex.test(region)) {\n throw new Error(\"Invalid region in client config\");\n }\n const useDualstackEndpoint = await input.useDualstackEndpoint();\n const useFipsEndpoint = await input.useFipsEndpoint();\n const { hostname } = (_a = (await input.regionInfoProvider(region, { useDualstackEndpoint, useFipsEndpoint }))) !== null && _a !== void 0 ? _a : {};\n if (!hostname) {\n throw new Error(\"Cannot resolve hostname from client config\");\n }\n return input.urlParser(`${tls ? \"https:\" : \"http:\"}//${hostname}`);\n};\nexports.getEndpointFromRegion = getEndpointFromRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./endpointsConfig\"), exports);\ntslib_1.__exportStar(require(\"./regionConfig\"), exports);\ntslib_1.__exportStar(require(\"./regionInfo\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_REGION_CONFIG_FILE_OPTIONS = exports.NODE_REGION_CONFIG_OPTIONS = exports.REGION_INI_NAME = exports.REGION_ENV_NAME = void 0;\nexports.REGION_ENV_NAME = \"AWS_REGION\";\nexports.REGION_INI_NAME = \"region\";\nexports.NODE_REGION_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => env[exports.REGION_ENV_NAME],\n configFileSelector: (profile) => profile[exports.REGION_INI_NAME],\n default: () => {\n throw new Error(\"Region is missing\");\n },\n};\nexports.NODE_REGION_CONFIG_FILE_OPTIONS = {\n preferredFile: \"credentials\",\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRealRegion = void 0;\nconst isFipsRegion_1 = require(\"./isFipsRegion\");\nconst getRealRegion = (region) => (0, isFipsRegion_1.isFipsRegion)(region)\n ? [\"fips-aws-global\", \"aws-fips\"].includes(region)\n ? \"us-east-1\"\n : region.replace(/fips-(dkr-|prod-)?|-fips/, \"\")\n : region;\nexports.getRealRegion = getRealRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./config\"), exports);\ntslib_1.__exportStar(require(\"./resolveRegionConfig\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isFipsRegion = void 0;\nconst isFipsRegion = (region) => typeof region === \"string\" && (region.startsWith(\"fips-\") || region.endsWith(\"-fips\"));\nexports.isFipsRegion = isFipsRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRegionConfig = void 0;\nconst getRealRegion_1 = require(\"./getRealRegion\");\nconst isFipsRegion_1 = require(\"./isFipsRegion\");\nconst resolveRegionConfig = (input) => {\n const { region, useFipsEndpoint } = input;\n if (!region) {\n throw new Error(\"Region is missing\");\n }\n return {\n ...input,\n region: async () => {\n if (typeof region === \"string\") {\n return (0, getRealRegion_1.getRealRegion)(region);\n }\n const providedRegion = await region();\n return (0, getRealRegion_1.getRealRegion)(providedRegion);\n },\n useFipsEndpoint: async () => {\n const providedRegion = typeof region === \"string\" ? region : await region();\n if ((0, isFipsRegion_1.isFipsRegion)(providedRegion)) {\n return true;\n }\n return typeof useFipsEndpoint !== \"function\" ? Promise.resolve(!!useFipsEndpoint) : useFipsEndpoint();\n },\n };\n};\nexports.resolveRegionConfig = resolveRegionConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getHostnameFromVariants = void 0;\nconst getHostnameFromVariants = (variants = [], { useFipsEndpoint, useDualstackEndpoint }) => {\n var _a;\n return (_a = variants.find(({ tags }) => useFipsEndpoint === tags.includes(\"fips\") && useDualstackEndpoint === tags.includes(\"dualstack\"))) === null || _a === void 0 ? void 0 : _a.hostname;\n};\nexports.getHostnameFromVariants = getHostnameFromVariants;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRegionInfo = void 0;\nconst getHostnameFromVariants_1 = require(\"./getHostnameFromVariants\");\nconst getResolvedHostname_1 = require(\"./getResolvedHostname\");\nconst getResolvedPartition_1 = require(\"./getResolvedPartition\");\nconst getResolvedSigningRegion_1 = require(\"./getResolvedSigningRegion\");\nconst getRegionInfo = (region, { useFipsEndpoint = false, useDualstackEndpoint = false, signingService, regionHash, partitionHash, }) => {\n var _a, _b, _c, _d, _e, _f;\n const partition = (0, getResolvedPartition_1.getResolvedPartition)(region, { partitionHash });\n const resolvedRegion = region in regionHash ? region : (_b = (_a = partitionHash[partition]) === null || _a === void 0 ? void 0 : _a.endpoint) !== null && _b !== void 0 ? _b : region;\n const hostnameOptions = { useFipsEndpoint, useDualstackEndpoint };\n const regionHostname = (0, getHostnameFromVariants_1.getHostnameFromVariants)((_c = regionHash[resolvedRegion]) === null || _c === void 0 ? void 0 : _c.variants, hostnameOptions);\n const partitionHostname = (0, getHostnameFromVariants_1.getHostnameFromVariants)((_d = partitionHash[partition]) === null || _d === void 0 ? void 0 : _d.variants, hostnameOptions);\n const hostname = (0, getResolvedHostname_1.getResolvedHostname)(resolvedRegion, { regionHostname, partitionHostname });\n if (hostname === undefined) {\n throw new Error(`Endpoint resolution failed for: ${{ resolvedRegion, useFipsEndpoint, useDualstackEndpoint }}`);\n }\n const signingRegion = (0, getResolvedSigningRegion_1.getResolvedSigningRegion)(hostname, {\n signingRegion: (_e = regionHash[resolvedRegion]) === null || _e === void 0 ? void 0 : _e.signingRegion,\n regionRegex: partitionHash[partition].regionRegex,\n useFipsEndpoint,\n });\n return {\n partition,\n signingService,\n hostname,\n ...(signingRegion && { signingRegion }),\n ...(((_f = regionHash[resolvedRegion]) === null || _f === void 0 ? void 0 : _f.signingService) && {\n signingService: regionHash[resolvedRegion].signingService,\n }),\n };\n};\nexports.getRegionInfo = getRegionInfo;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getResolvedHostname = void 0;\nconst getResolvedHostname = (resolvedRegion, { regionHostname, partitionHostname }) => regionHostname\n ? regionHostname\n : partitionHostname\n ? partitionHostname.replace(\"{region}\", resolvedRegion)\n : undefined;\nexports.getResolvedHostname = getResolvedHostname;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getResolvedPartition = void 0;\nconst getResolvedPartition = (region, { partitionHash }) => { var _a; return (_a = Object.keys(partitionHash || {}).find((key) => partitionHash[key].regions.includes(region))) !== null && _a !== void 0 ? _a : \"aws\"; };\nexports.getResolvedPartition = getResolvedPartition;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getResolvedSigningRegion = void 0;\nconst getResolvedSigningRegion = (hostname, { signingRegion, regionRegex, useFipsEndpoint }) => {\n if (signingRegion) {\n return signingRegion;\n }\n else if (useFipsEndpoint) {\n const regionRegexJs = regionRegex.replace(\"\\\\\\\\\", \"\\\\\").replace(/^\\^/g, \"\\\\.\").replace(/\\$$/g, \"\\\\.\");\n const regionRegexmatchArray = hostname.match(regionRegexJs);\n if (regionRegexmatchArray) {\n return regionRegexmatchArray[0].slice(1, -1);\n }\n }\n};\nexports.getResolvedSigningRegion = getResolvedSigningRegion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./PartitionHash\"), exports);\ntslib_1.__exportStar(require(\"./RegionHash\"), exports);\ntslib_1.__exportStar(require(\"./getRegionInfo\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Endpoint = void 0;\nvar Endpoint;\n(function (Endpoint) {\n Endpoint[\"IPv4\"] = \"http://169.254.169.254\";\n Endpoint[\"IPv6\"] = \"http://[fd00:ec2::254]\";\n})(Endpoint = exports.Endpoint || (exports.Endpoint = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ENDPOINT_CONFIG_OPTIONS = exports.CONFIG_ENDPOINT_NAME = exports.ENV_ENDPOINT_NAME = void 0;\nexports.ENV_ENDPOINT_NAME = \"AWS_EC2_METADATA_SERVICE_ENDPOINT\";\nexports.CONFIG_ENDPOINT_NAME = \"ec2_metadata_service_endpoint\";\nexports.ENDPOINT_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => env[exports.ENV_ENDPOINT_NAME],\n configFileSelector: (profile) => profile[exports.CONFIG_ENDPOINT_NAME],\n default: undefined,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EndpointMode = void 0;\nvar EndpointMode;\n(function (EndpointMode) {\n EndpointMode[\"IPv4\"] = \"IPv4\";\n EndpointMode[\"IPv6\"] = \"IPv6\";\n})(EndpointMode = exports.EndpointMode || (exports.EndpointMode = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ENDPOINT_MODE_CONFIG_OPTIONS = exports.CONFIG_ENDPOINT_MODE_NAME = exports.ENV_ENDPOINT_MODE_NAME = void 0;\nconst EndpointMode_1 = require(\"./EndpointMode\");\nexports.ENV_ENDPOINT_MODE_NAME = \"AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE\";\nexports.CONFIG_ENDPOINT_MODE_NAME = \"ec2_metadata_service_endpoint_mode\";\nexports.ENDPOINT_MODE_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => env[exports.ENV_ENDPOINT_MODE_NAME],\n configFileSelector: (profile) => profile[exports.CONFIG_ENDPOINT_MODE_NAME],\n default: EndpointMode_1.EndpointMode.IPv4,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InstanceMetadataV1FallbackError = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nclass InstanceMetadataV1FallbackError extends property_provider_1.CredentialsProviderError {\n constructor(message, tryNextLink = true) {\n super(message, tryNextLink);\n this.tryNextLink = tryNextLink;\n this.name = \"InstanceMetadataV1FallbackError\";\n Object.setPrototypeOf(this, InstanceMetadataV1FallbackError.prototype);\n }\n}\nexports.InstanceMetadataV1FallbackError = InstanceMetadataV1FallbackError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromContainerMetadata = exports.ENV_CMDS_AUTH_TOKEN = exports.ENV_CMDS_RELATIVE_URI = exports.ENV_CMDS_FULL_URI = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst url_1 = require(\"url\");\nconst httpRequest_1 = require(\"./remoteProvider/httpRequest\");\nconst ImdsCredentials_1 = require(\"./remoteProvider/ImdsCredentials\");\nconst RemoteProviderInit_1 = require(\"./remoteProvider/RemoteProviderInit\");\nconst retry_1 = require(\"./remoteProvider/retry\");\nexports.ENV_CMDS_FULL_URI = \"AWS_CONTAINER_CREDENTIALS_FULL_URI\";\nexports.ENV_CMDS_RELATIVE_URI = \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\";\nexports.ENV_CMDS_AUTH_TOKEN = \"AWS_CONTAINER_AUTHORIZATION_TOKEN\";\nconst fromContainerMetadata = (init = {}) => {\n const { timeout, maxRetries } = (0, RemoteProviderInit_1.providerConfigFromInit)(init);\n return () => (0, retry_1.retry)(async () => {\n const requestOptions = await getCmdsUri();\n const credsResponse = JSON.parse(await requestFromEcsImds(timeout, requestOptions));\n if (!(0, ImdsCredentials_1.isImdsCredentials)(credsResponse)) {\n throw new property_provider_1.CredentialsProviderError(\"Invalid response received from instance metadata service.\");\n }\n return (0, ImdsCredentials_1.fromImdsCredentials)(credsResponse);\n }, maxRetries);\n};\nexports.fromContainerMetadata = fromContainerMetadata;\nconst requestFromEcsImds = async (timeout, options) => {\n if (process.env[exports.ENV_CMDS_AUTH_TOKEN]) {\n options.headers = {\n ...options.headers,\n Authorization: process.env[exports.ENV_CMDS_AUTH_TOKEN],\n };\n }\n const buffer = await (0, httpRequest_1.httpRequest)({\n ...options,\n timeout,\n });\n return buffer.toString();\n};\nconst CMDS_IP = \"169.254.170.2\";\nconst GREENGRASS_HOSTS = {\n localhost: true,\n \"127.0.0.1\": true,\n};\nconst GREENGRASS_PROTOCOLS = {\n \"http:\": true,\n \"https:\": true,\n};\nconst getCmdsUri = async () => {\n if (process.env[exports.ENV_CMDS_RELATIVE_URI]) {\n return {\n hostname: CMDS_IP,\n path: process.env[exports.ENV_CMDS_RELATIVE_URI],\n };\n }\n if (process.env[exports.ENV_CMDS_FULL_URI]) {\n const parsed = (0, url_1.parse)(process.env[exports.ENV_CMDS_FULL_URI]);\n if (!parsed.hostname || !(parsed.hostname in GREENGRASS_HOSTS)) {\n throw new property_provider_1.CredentialsProviderError(`${parsed.hostname} is not a valid container metadata service hostname`, false);\n }\n if (!parsed.protocol || !(parsed.protocol in GREENGRASS_PROTOCOLS)) {\n throw new property_provider_1.CredentialsProviderError(`${parsed.protocol} is not a valid container metadata service protocol`, false);\n }\n return {\n ...parsed,\n port: parsed.port ? parseInt(parsed.port, 10) : undefined,\n };\n }\n throw new property_provider_1.CredentialsProviderError(\"The container metadata credential provider cannot be used unless\" +\n ` the ${exports.ENV_CMDS_RELATIVE_URI} or ${exports.ENV_CMDS_FULL_URI} environment` +\n \" variable is set\", false);\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromInstanceMetadata = void 0;\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst InstanceMetadataV1FallbackError_1 = require(\"./error/InstanceMetadataV1FallbackError\");\nconst httpRequest_1 = require(\"./remoteProvider/httpRequest\");\nconst ImdsCredentials_1 = require(\"./remoteProvider/ImdsCredentials\");\nconst RemoteProviderInit_1 = require(\"./remoteProvider/RemoteProviderInit\");\nconst retry_1 = require(\"./remoteProvider/retry\");\nconst getInstanceMetadataEndpoint_1 = require(\"./utils/getInstanceMetadataEndpoint\");\nconst staticStabilityProvider_1 = require(\"./utils/staticStabilityProvider\");\nconst IMDS_PATH = \"/latest/meta-data/iam/security-credentials/\";\nconst IMDS_TOKEN_PATH = \"/latest/api/token\";\nconst AWS_EC2_METADATA_V1_DISABLED = \"AWS_EC2_METADATA_V1_DISABLED\";\nconst PROFILE_AWS_EC2_METADATA_V1_DISABLED = \"ec2_metadata_v1_disabled\";\nconst X_AWS_EC2_METADATA_TOKEN = \"x-aws-ec2-metadata-token\";\nconst fromInstanceMetadata = (init = {}) => (0, staticStabilityProvider_1.staticStabilityProvider)(getInstanceImdsProvider(init), { logger: init.logger });\nexports.fromInstanceMetadata = fromInstanceMetadata;\nconst getInstanceImdsProvider = (init) => {\n let disableFetchToken = false;\n const { logger, profile } = init;\n const { timeout, maxRetries } = (0, RemoteProviderInit_1.providerConfigFromInit)(init);\n const getCredentials = async (maxRetries, options) => {\n var _a;\n const isImdsV1Fallback = disableFetchToken || ((_a = options.headers) === null || _a === void 0 ? void 0 : _a[X_AWS_EC2_METADATA_TOKEN]) == null;\n if (isImdsV1Fallback) {\n let fallbackBlockedFromProfile = false;\n let fallbackBlockedFromProcessEnv = false;\n const configValue = await (0, node_config_provider_1.loadConfig)({\n environmentVariableSelector: (env) => {\n const envValue = env[AWS_EC2_METADATA_V1_DISABLED];\n fallbackBlockedFromProcessEnv = !!envValue && envValue !== \"false\";\n if (envValue === undefined) {\n throw new property_provider_1.CredentialsProviderError(`${AWS_EC2_METADATA_V1_DISABLED} not set in env, checking config file next.`);\n }\n return fallbackBlockedFromProcessEnv;\n },\n configFileSelector: (profile) => {\n const profileValue = profile[PROFILE_AWS_EC2_METADATA_V1_DISABLED];\n fallbackBlockedFromProfile = !!profileValue && profileValue !== \"false\";\n return fallbackBlockedFromProfile;\n },\n default: false,\n }, {\n profile,\n })();\n if (init.ec2MetadataV1Disabled || configValue) {\n const causes = [];\n if (init.ec2MetadataV1Disabled)\n causes.push(\"credential provider initialization (runtime option ec2MetadataV1Disabled)\");\n if (fallbackBlockedFromProfile)\n causes.push(`config file profile (${PROFILE_AWS_EC2_METADATA_V1_DISABLED})`);\n if (fallbackBlockedFromProcessEnv)\n causes.push(`process environment variable (${AWS_EC2_METADATA_V1_DISABLED})`);\n throw new InstanceMetadataV1FallbackError_1.InstanceMetadataV1FallbackError(`AWS EC2 Metadata v1 fallback has been blocked by AWS SDK configuration in the following: [${causes.join(\", \")}].`);\n }\n }\n const imdsProfile = (await (0, retry_1.retry)(async () => {\n let profile;\n try {\n profile = await getProfile(options);\n }\n catch (err) {\n if (err.statusCode === 401) {\n disableFetchToken = false;\n }\n throw err;\n }\n return profile;\n }, maxRetries)).trim();\n return (0, retry_1.retry)(async () => {\n let creds;\n try {\n creds = await getCredentialsFromProfile(imdsProfile, options);\n }\n catch (err) {\n if (err.statusCode === 401) {\n disableFetchToken = false;\n }\n throw err;\n }\n return creds;\n }, maxRetries);\n };\n return async () => {\n const endpoint = await (0, getInstanceMetadataEndpoint_1.getInstanceMetadataEndpoint)();\n if (disableFetchToken) {\n logger === null || logger === void 0 ? void 0 : logger.debug(\"AWS SDK Instance Metadata\", \"using v1 fallback (no token fetch)\");\n return getCredentials(maxRetries, { ...endpoint, timeout });\n }\n else {\n let token;\n try {\n token = (await getMetadataToken({ ...endpoint, timeout })).toString();\n }\n catch (error) {\n if ((error === null || error === void 0 ? void 0 : error.statusCode) === 400) {\n throw Object.assign(error, {\n message: \"EC2 Metadata token request returned error\",\n });\n }\n else if (error.message === \"TimeoutError\" || [403, 404, 405].includes(error.statusCode)) {\n disableFetchToken = true;\n }\n logger === null || logger === void 0 ? void 0 : logger.debug(\"AWS SDK Instance Metadata\", \"using v1 fallback (initial)\");\n return getCredentials(maxRetries, { ...endpoint, timeout });\n }\n return getCredentials(maxRetries, {\n ...endpoint,\n headers: {\n [X_AWS_EC2_METADATA_TOKEN]: token,\n },\n timeout,\n });\n }\n };\n};\nconst getMetadataToken = async (options) => (0, httpRequest_1.httpRequest)({\n ...options,\n path: IMDS_TOKEN_PATH,\n method: \"PUT\",\n headers: {\n \"x-aws-ec2-metadata-token-ttl-seconds\": \"21600\",\n },\n});\nconst getProfile = async (options) => (await (0, httpRequest_1.httpRequest)({ ...options, path: IMDS_PATH })).toString();\nconst getCredentialsFromProfile = async (profile, options) => {\n const credsResponse = JSON.parse((await (0, httpRequest_1.httpRequest)({\n ...options,\n path: IMDS_PATH + profile,\n })).toString());\n if (!(0, ImdsCredentials_1.isImdsCredentials)(credsResponse)) {\n throw new property_provider_1.CredentialsProviderError(\"Invalid response received from instance metadata service.\");\n }\n return (0, ImdsCredentials_1.fromImdsCredentials)(credsResponse);\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getInstanceMetadataEndpoint = exports.httpRequest = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromContainerMetadata\"), exports);\ntslib_1.__exportStar(require(\"./fromInstanceMetadata\"), exports);\ntslib_1.__exportStar(require(\"./remoteProvider/RemoteProviderInit\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\nvar httpRequest_1 = require(\"./remoteProvider/httpRequest\");\nObject.defineProperty(exports, \"httpRequest\", { enumerable: true, get: function () { return httpRequest_1.httpRequest; } });\nvar getInstanceMetadataEndpoint_1 = require(\"./utils/getInstanceMetadataEndpoint\");\nObject.defineProperty(exports, \"getInstanceMetadataEndpoint\", { enumerable: true, get: function () { return getInstanceMetadataEndpoint_1.getInstanceMetadataEndpoint; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromImdsCredentials = exports.isImdsCredentials = void 0;\nconst isImdsCredentials = (arg) => Boolean(arg) &&\n typeof arg === \"object\" &&\n typeof arg.AccessKeyId === \"string\" &&\n typeof arg.SecretAccessKey === \"string\" &&\n typeof arg.Token === \"string\" &&\n typeof arg.Expiration === \"string\";\nexports.isImdsCredentials = isImdsCredentials;\nconst fromImdsCredentials = (creds) => ({\n accessKeyId: creds.AccessKeyId,\n secretAccessKey: creds.SecretAccessKey,\n sessionToken: creds.Token,\n expiration: new Date(creds.Expiration),\n});\nexports.fromImdsCredentials = fromImdsCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.providerConfigFromInit = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_TIMEOUT = void 0;\nexports.DEFAULT_TIMEOUT = 1000;\nexports.DEFAULT_MAX_RETRIES = 0;\nconst providerConfigFromInit = ({ maxRetries = exports.DEFAULT_MAX_RETRIES, timeout = exports.DEFAULT_TIMEOUT, }) => ({ maxRetries, timeout });\nexports.providerConfigFromInit = providerConfigFromInit;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.httpRequest = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst buffer_1 = require(\"buffer\");\nconst http_1 = require(\"http\");\nfunction httpRequest(options) {\n return new Promise((resolve, reject) => {\n var _a;\n const req = (0, http_1.request)({\n method: \"GET\",\n ...options,\n hostname: (_a = options.hostname) === null || _a === void 0 ? void 0 : _a.replace(/^\\[(.+)\\]$/, \"$1\"),\n });\n req.on(\"error\", (err) => {\n reject(Object.assign(new property_provider_1.ProviderError(\"Unable to connect to instance metadata service\"), err));\n req.destroy();\n });\n req.on(\"timeout\", () => {\n reject(new property_provider_1.ProviderError(\"TimeoutError from instance metadata service\"));\n req.destroy();\n });\n req.on(\"response\", (res) => {\n const { statusCode = 400 } = res;\n if (statusCode < 200 || 300 <= statusCode) {\n reject(Object.assign(new property_provider_1.ProviderError(\"Error response received from instance metadata service\"), { statusCode }));\n req.destroy();\n }\n const chunks = [];\n res.on(\"data\", (chunk) => {\n chunks.push(chunk);\n });\n res.on(\"end\", () => {\n resolve(buffer_1.Buffer.concat(chunks));\n req.destroy();\n });\n });\n req.end();\n });\n}\nexports.httpRequest = httpRequest;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.retry = void 0;\nconst retry = (toRetry, maxRetries) => {\n let promise = toRetry();\n for (let i = 0; i < maxRetries; i++) {\n promise = promise.catch(toRetry);\n }\n return promise;\n};\nexports.retry = retry;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getExtendedInstanceMetadataCredentials = void 0;\nconst STATIC_STABILITY_REFRESH_INTERVAL_SECONDS = 5 * 60;\nconst STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS = 5 * 60;\nconst STATIC_STABILITY_DOC_URL = \"https://docs.aws.amazon.com/sdkref/latest/guide/feature-static-credentials.html\";\nconst getExtendedInstanceMetadataCredentials = (credentials, logger) => {\n var _a;\n const refreshInterval = STATIC_STABILITY_REFRESH_INTERVAL_SECONDS +\n Math.floor(Math.random() * STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS);\n const newExpiration = new Date(Date.now() + refreshInterval * 1000);\n logger.warn(\"Attempting credential expiration extension due to a credential service availability issue. A refresh of these \" +\n \"credentials will be attempted after ${new Date(newExpiration)}.\\nFor more information, please visit: \" +\n STATIC_STABILITY_DOC_URL);\n const originalExpiration = (_a = credentials.originalExpiration) !== null && _a !== void 0 ? _a : credentials.expiration;\n return {\n ...credentials,\n ...(originalExpiration ? { originalExpiration } : {}),\n expiration: newExpiration,\n };\n};\nexports.getExtendedInstanceMetadataCredentials = getExtendedInstanceMetadataCredentials;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getInstanceMetadataEndpoint = void 0;\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst Endpoint_1 = require(\"../config/Endpoint\");\nconst EndpointConfigOptions_1 = require(\"../config/EndpointConfigOptions\");\nconst EndpointMode_1 = require(\"../config/EndpointMode\");\nconst EndpointModeConfigOptions_1 = require(\"../config/EndpointModeConfigOptions\");\nconst getInstanceMetadataEndpoint = async () => (0, url_parser_1.parseUrl)((await getFromEndpointConfig()) || (await getFromEndpointModeConfig()));\nexports.getInstanceMetadataEndpoint = getInstanceMetadataEndpoint;\nconst getFromEndpointConfig = async () => (0, node_config_provider_1.loadConfig)(EndpointConfigOptions_1.ENDPOINT_CONFIG_OPTIONS)();\nconst getFromEndpointModeConfig = async () => {\n const endpointMode = await (0, node_config_provider_1.loadConfig)(EndpointModeConfigOptions_1.ENDPOINT_MODE_CONFIG_OPTIONS)();\n switch (endpointMode) {\n case EndpointMode_1.EndpointMode.IPv4:\n return Endpoint_1.Endpoint.IPv4;\n case EndpointMode_1.EndpointMode.IPv6:\n return Endpoint_1.Endpoint.IPv6;\n default:\n throw new Error(`Unsupported endpoint mode: ${endpointMode}.` + ` Select from ${Object.values(EndpointMode_1.EndpointMode)}`);\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.staticStabilityProvider = void 0;\nconst getExtendedInstanceMetadataCredentials_1 = require(\"./getExtendedInstanceMetadataCredentials\");\nconst staticStabilityProvider = (provider, options = {}) => {\n const logger = (options === null || options === void 0 ? void 0 : options.logger) || console;\n let pastCredentials;\n return async () => {\n let credentials;\n try {\n credentials = await provider();\n if (credentials.expiration && credentials.expiration.getTime() < Date.now()) {\n credentials = (0, getExtendedInstanceMetadataCredentials_1.getExtendedInstanceMetadataCredentials)(credentials, logger);\n }\n }\n catch (e) {\n if (pastCredentials) {\n logger.warn(\"Credential renew failed: \", e);\n credentials = (0, getExtendedInstanceMetadataCredentials_1.getExtendedInstanceMetadataCredentials)(pastCredentials, logger);\n }\n else {\n throw e;\n }\n }\n pastCredentials = credentials;\n return credentials;\n };\n};\nexports.staticStabilityProvider = staticStabilityProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EventStreamCodec = void 0;\nconst crc32_1 = require(\"@aws-crypto/crc32\");\nconst HeaderMarshaller_1 = require(\"./HeaderMarshaller\");\nconst splitMessage_1 = require(\"./splitMessage\");\nclass EventStreamCodec {\n constructor(toUtf8, fromUtf8) {\n this.headerMarshaller = new HeaderMarshaller_1.HeaderMarshaller(toUtf8, fromUtf8);\n this.messageBuffer = [];\n this.isEndOfStream = false;\n }\n feed(message) {\n this.messageBuffer.push(this.decode(message));\n }\n endOfStream() {\n this.isEndOfStream = true;\n }\n getMessage() {\n const message = this.messageBuffer.pop();\n const isEndOfStream = this.isEndOfStream;\n return {\n getMessage() {\n return message;\n },\n isEndOfStream() {\n return isEndOfStream;\n },\n };\n }\n getAvailableMessages() {\n const messages = this.messageBuffer;\n this.messageBuffer = [];\n const isEndOfStream = this.isEndOfStream;\n return {\n getMessages() {\n return messages;\n },\n isEndOfStream() {\n return isEndOfStream;\n },\n };\n }\n encode({ headers: rawHeaders, body }) {\n const headers = this.headerMarshaller.format(rawHeaders);\n const length = headers.byteLength + body.byteLength + 16;\n const out = new Uint8Array(length);\n const view = new DataView(out.buffer, out.byteOffset, out.byteLength);\n const checksum = new crc32_1.Crc32();\n view.setUint32(0, length, false);\n view.setUint32(4, headers.byteLength, false);\n view.setUint32(8, checksum.update(out.subarray(0, 8)).digest(), false);\n out.set(headers, 12);\n out.set(body, headers.byteLength + 12);\n view.setUint32(length - 4, checksum.update(out.subarray(8, length - 4)).digest(), false);\n return out;\n }\n decode(message) {\n const { headers, body } = (0, splitMessage_1.splitMessage)(message);\n return { headers: this.headerMarshaller.parse(headers), body };\n }\n formatHeaders(rawHeaders) {\n return this.headerMarshaller.format(rawHeaders);\n }\n}\nexports.EventStreamCodec = EventStreamCodec;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HeaderMarshaller = void 0;\nconst util_hex_encoding_1 = require(\"@smithy/util-hex-encoding\");\nconst Int64_1 = require(\"./Int64\");\nclass HeaderMarshaller {\n constructor(toUtf8, fromUtf8) {\n this.toUtf8 = toUtf8;\n this.fromUtf8 = fromUtf8;\n }\n format(headers) {\n const chunks = [];\n for (const headerName of Object.keys(headers)) {\n const bytes = this.fromUtf8(headerName);\n chunks.push(Uint8Array.from([bytes.byteLength]), bytes, this.formatHeaderValue(headers[headerName]));\n }\n const out = new Uint8Array(chunks.reduce((carry, bytes) => carry + bytes.byteLength, 0));\n let position = 0;\n for (const chunk of chunks) {\n out.set(chunk, position);\n position += chunk.byteLength;\n }\n return out;\n }\n formatHeaderValue(header) {\n switch (header.type) {\n case \"boolean\":\n return Uint8Array.from([header.value ? 0 : 1]);\n case \"byte\":\n return Uint8Array.from([2, header.value]);\n case \"short\":\n const shortView = new DataView(new ArrayBuffer(3));\n shortView.setUint8(0, 3);\n shortView.setInt16(1, header.value, false);\n return new Uint8Array(shortView.buffer);\n case \"integer\":\n const intView = new DataView(new ArrayBuffer(5));\n intView.setUint8(0, 4);\n intView.setInt32(1, header.value, false);\n return new Uint8Array(intView.buffer);\n case \"long\":\n const longBytes = new Uint8Array(9);\n longBytes[0] = 5;\n longBytes.set(header.value.bytes, 1);\n return longBytes;\n case \"binary\":\n const binView = new DataView(new ArrayBuffer(3 + header.value.byteLength));\n binView.setUint8(0, 6);\n binView.setUint16(1, header.value.byteLength, false);\n const binBytes = new Uint8Array(binView.buffer);\n binBytes.set(header.value, 3);\n return binBytes;\n case \"string\":\n const utf8Bytes = this.fromUtf8(header.value);\n const strView = new DataView(new ArrayBuffer(3 + utf8Bytes.byteLength));\n strView.setUint8(0, 7);\n strView.setUint16(1, utf8Bytes.byteLength, false);\n const strBytes = new Uint8Array(strView.buffer);\n strBytes.set(utf8Bytes, 3);\n return strBytes;\n case \"timestamp\":\n const tsBytes = new Uint8Array(9);\n tsBytes[0] = 8;\n tsBytes.set(Int64_1.Int64.fromNumber(header.value.valueOf()).bytes, 1);\n return tsBytes;\n case \"uuid\":\n if (!UUID_PATTERN.test(header.value)) {\n throw new Error(`Invalid UUID received: ${header.value}`);\n }\n const uuidBytes = new Uint8Array(17);\n uuidBytes[0] = 9;\n uuidBytes.set((0, util_hex_encoding_1.fromHex)(header.value.replace(/\\-/g, \"\")), 1);\n return uuidBytes;\n }\n }\n parse(headers) {\n const out = {};\n let position = 0;\n while (position < headers.byteLength) {\n const nameLength = headers.getUint8(position++);\n const name = this.toUtf8(new Uint8Array(headers.buffer, headers.byteOffset + position, nameLength));\n position += nameLength;\n switch (headers.getUint8(position++)) {\n case 0:\n out[name] = {\n type: BOOLEAN_TAG,\n value: true,\n };\n break;\n case 1:\n out[name] = {\n type: BOOLEAN_TAG,\n value: false,\n };\n break;\n case 2:\n out[name] = {\n type: BYTE_TAG,\n value: headers.getInt8(position++),\n };\n break;\n case 3:\n out[name] = {\n type: SHORT_TAG,\n value: headers.getInt16(position, false),\n };\n position += 2;\n break;\n case 4:\n out[name] = {\n type: INT_TAG,\n value: headers.getInt32(position, false),\n };\n position += 4;\n break;\n case 5:\n out[name] = {\n type: LONG_TAG,\n value: new Int64_1.Int64(new Uint8Array(headers.buffer, headers.byteOffset + position, 8)),\n };\n position += 8;\n break;\n case 6:\n const binaryLength = headers.getUint16(position, false);\n position += 2;\n out[name] = {\n type: BINARY_TAG,\n value: new Uint8Array(headers.buffer, headers.byteOffset + position, binaryLength),\n };\n position += binaryLength;\n break;\n case 7:\n const stringLength = headers.getUint16(position, false);\n position += 2;\n out[name] = {\n type: STRING_TAG,\n value: this.toUtf8(new Uint8Array(headers.buffer, headers.byteOffset + position, stringLength)),\n };\n position += stringLength;\n break;\n case 8:\n out[name] = {\n type: TIMESTAMP_TAG,\n value: new Date(new Int64_1.Int64(new Uint8Array(headers.buffer, headers.byteOffset + position, 8)).valueOf()),\n };\n position += 8;\n break;\n case 9:\n const uuidBytes = new Uint8Array(headers.buffer, headers.byteOffset + position, 16);\n position += 16;\n out[name] = {\n type: UUID_TAG,\n value: `${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(0, 4))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(4, 6))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(6, 8))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(8, 10))}-${(0, util_hex_encoding_1.toHex)(uuidBytes.subarray(10))}`,\n };\n break;\n default:\n throw new Error(`Unrecognized header type tag`);\n }\n }\n return out;\n }\n}\nexports.HeaderMarshaller = HeaderMarshaller;\nvar HEADER_VALUE_TYPE;\n(function (HEADER_VALUE_TYPE) {\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"boolTrue\"] = 0] = \"boolTrue\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"boolFalse\"] = 1] = \"boolFalse\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"byte\"] = 2] = \"byte\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"short\"] = 3] = \"short\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"integer\"] = 4] = \"integer\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"long\"] = 5] = \"long\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"byteArray\"] = 6] = \"byteArray\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"string\"] = 7] = \"string\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"timestamp\"] = 8] = \"timestamp\";\n HEADER_VALUE_TYPE[HEADER_VALUE_TYPE[\"uuid\"] = 9] = \"uuid\";\n})(HEADER_VALUE_TYPE || (HEADER_VALUE_TYPE = {}));\nconst BOOLEAN_TAG = \"boolean\";\nconst BYTE_TAG = \"byte\";\nconst SHORT_TAG = \"short\";\nconst INT_TAG = \"integer\";\nconst LONG_TAG = \"long\";\nconst BINARY_TAG = \"binary\";\nconst STRING_TAG = \"string\";\nconst TIMESTAMP_TAG = \"timestamp\";\nconst UUID_TAG = \"uuid\";\nconst UUID_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Int64 = void 0;\nconst util_hex_encoding_1 = require(\"@smithy/util-hex-encoding\");\nclass Int64 {\n constructor(bytes) {\n this.bytes = bytes;\n if (bytes.byteLength !== 8) {\n throw new Error(\"Int64 buffers must be exactly 8 bytes\");\n }\n }\n static fromNumber(number) {\n if (number > 9223372036854776000 || number < -9223372036854776000) {\n throw new Error(`${number} is too large (or, if negative, too small) to represent as an Int64`);\n }\n const bytes = new Uint8Array(8);\n for (let i = 7, remaining = Math.abs(Math.round(number)); i > -1 && remaining > 0; i--, remaining /= 256) {\n bytes[i] = remaining;\n }\n if (number < 0) {\n negate(bytes);\n }\n return new Int64(bytes);\n }\n valueOf() {\n const bytes = this.bytes.slice(0);\n const negative = bytes[0] & 0b10000000;\n if (negative) {\n negate(bytes);\n }\n return parseInt((0, util_hex_encoding_1.toHex)(bytes), 16) * (negative ? -1 : 1);\n }\n toString() {\n return String(this.valueOf());\n }\n}\nexports.Int64 = Int64;\nfunction negate(bytes) {\n for (let i = 0; i < 8; i++) {\n bytes[i] ^= 0xff;\n }\n for (let i = 7; i > -1; i--) {\n bytes[i]++;\n if (bytes[i] !== 0)\n break;\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MessageDecoderStream = void 0;\nclass MessageDecoderStream {\n constructor(options) {\n this.options = options;\n }\n [Symbol.asyncIterator]() {\n return this.asyncIterator();\n }\n async *asyncIterator() {\n for await (const bytes of this.options.inputStream) {\n const decoded = this.options.decoder.decode(bytes);\n yield decoded;\n }\n }\n}\nexports.MessageDecoderStream = MessageDecoderStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MessageEncoderStream = void 0;\nclass MessageEncoderStream {\n constructor(options) {\n this.options = options;\n }\n [Symbol.asyncIterator]() {\n return this.asyncIterator();\n }\n async *asyncIterator() {\n for await (const msg of this.options.messageStream) {\n const encoded = this.options.encoder.encode(msg);\n yield encoded;\n }\n if (this.options.includeEndFrame) {\n yield new Uint8Array(0);\n }\n }\n}\nexports.MessageEncoderStream = MessageEncoderStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SmithyMessageDecoderStream = void 0;\nclass SmithyMessageDecoderStream {\n constructor(options) {\n this.options = options;\n }\n [Symbol.asyncIterator]() {\n return this.asyncIterator();\n }\n async *asyncIterator() {\n for await (const message of this.options.messageStream) {\n const deserialized = await this.options.deserializer(message);\n if (deserialized === undefined)\n continue;\n yield deserialized;\n }\n }\n}\nexports.SmithyMessageDecoderStream = SmithyMessageDecoderStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SmithyMessageEncoderStream = void 0;\nclass SmithyMessageEncoderStream {\n constructor(options) {\n this.options = options;\n }\n [Symbol.asyncIterator]() {\n return this.asyncIterator();\n }\n async *asyncIterator() {\n for await (const chunk of this.options.inputStream) {\n const payloadBuf = this.options.serializer(chunk);\n yield payloadBuf;\n }\n }\n}\nexports.SmithyMessageEncoderStream = SmithyMessageEncoderStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./EventStreamCodec\"), exports);\ntslib_1.__exportStar(require(\"./HeaderMarshaller\"), exports);\ntslib_1.__exportStar(require(\"./Int64\"), exports);\ntslib_1.__exportStar(require(\"./Message\"), exports);\ntslib_1.__exportStar(require(\"./MessageDecoderStream\"), exports);\ntslib_1.__exportStar(require(\"./MessageEncoderStream\"), exports);\ntslib_1.__exportStar(require(\"./SmithyMessageDecoderStream\"), exports);\ntslib_1.__exportStar(require(\"./SmithyMessageEncoderStream\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.splitMessage = void 0;\nconst crc32_1 = require(\"@aws-crypto/crc32\");\nconst PRELUDE_MEMBER_LENGTH = 4;\nconst PRELUDE_LENGTH = PRELUDE_MEMBER_LENGTH * 2;\nconst CHECKSUM_LENGTH = 4;\nconst MINIMUM_MESSAGE_LENGTH = PRELUDE_LENGTH + CHECKSUM_LENGTH * 2;\nfunction splitMessage({ byteLength, byteOffset, buffer }) {\n if (byteLength < MINIMUM_MESSAGE_LENGTH) {\n throw new Error(\"Provided message too short to accommodate event stream message overhead\");\n }\n const view = new DataView(buffer, byteOffset, byteLength);\n const messageLength = view.getUint32(0, false);\n if (byteLength !== messageLength) {\n throw new Error(\"Reported message length does not match received message length\");\n }\n const headerLength = view.getUint32(PRELUDE_MEMBER_LENGTH, false);\n const expectedPreludeChecksum = view.getUint32(PRELUDE_LENGTH, false);\n const expectedMessageChecksum = view.getUint32(byteLength - CHECKSUM_LENGTH, false);\n const checksummer = new crc32_1.Crc32().update(new Uint8Array(buffer, byteOffset, PRELUDE_LENGTH));\n if (expectedPreludeChecksum !== checksummer.digest()) {\n throw new Error(`The prelude checksum specified in the message (${expectedPreludeChecksum}) does not match the calculated CRC32 checksum (${checksummer.digest()})`);\n }\n checksummer.update(new Uint8Array(buffer, byteOffset + PRELUDE_LENGTH, byteLength - (PRELUDE_LENGTH + CHECKSUM_LENGTH)));\n if (expectedMessageChecksum !== checksummer.digest()) {\n throw new Error(`The message checksum (${checksummer.digest()}) did not match the expected value of ${expectedMessageChecksum}`);\n }\n return {\n headers: new DataView(buffer, byteOffset + PRELUDE_LENGTH + CHECKSUM_LENGTH, headerLength),\n body: new Uint8Array(buffer, byteOffset + PRELUDE_LENGTH + CHECKSUM_LENGTH + headerLength, messageLength - headerLength - (PRELUDE_LENGTH + CHECKSUM_LENGTH + CHECKSUM_LENGTH)),\n };\n}\nexports.splitMessage = splitMessage;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Hash = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst buffer_1 = require(\"buffer\");\nconst crypto_1 = require(\"crypto\");\nclass Hash {\n constructor(algorithmIdentifier, secret) {\n this.algorithmIdentifier = algorithmIdentifier;\n this.secret = secret;\n this.reset();\n }\n update(toHash, encoding) {\n this.hash.update((0, util_utf8_1.toUint8Array)(castSourceData(toHash, encoding)));\n }\n digest() {\n return Promise.resolve(this.hash.digest());\n }\n reset() {\n this.hash = this.secret\n ? (0, crypto_1.createHmac)(this.algorithmIdentifier, castSourceData(this.secret))\n : (0, crypto_1.createHash)(this.algorithmIdentifier);\n }\n}\nexports.Hash = Hash;\nfunction castSourceData(toCast, encoding) {\n if (buffer_1.Buffer.isBuffer(toCast)) {\n return toCast;\n }\n if (typeof toCast === \"string\") {\n return (0, util_buffer_from_1.fromString)(toCast, encoding);\n }\n if (ArrayBuffer.isView(toCast)) {\n return (0, util_buffer_from_1.fromArrayBuffer)(toCast.buffer, toCast.byteOffset, toCast.byteLength);\n }\n return (0, util_buffer_from_1.fromArrayBuffer)(toCast);\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isArrayBuffer = void 0;\nconst isArrayBuffer = (arg) => (typeof ArrayBuffer === \"function\" && arg instanceof ArrayBuffer) ||\n Object.prototype.toString.call(arg) === \"[object ArrayBuffer]\";\nexports.isArrayBuffer = isArrayBuffer;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getContentLengthPlugin = exports.contentLengthMiddlewareOptions = exports.contentLengthMiddleware = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst CONTENT_LENGTH_HEADER = \"content-length\";\nfunction contentLengthMiddleware(bodyLengthChecker) {\n return (next) => async (args) => {\n const request = args.request;\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n const { body, headers } = request;\n if (body &&\n Object.keys(headers)\n .map((str) => str.toLowerCase())\n .indexOf(CONTENT_LENGTH_HEADER) === -1) {\n try {\n const length = bodyLengthChecker(body);\n request.headers = {\n ...request.headers,\n [CONTENT_LENGTH_HEADER]: String(length),\n };\n }\n catch (error) {\n }\n }\n }\n return next({\n ...args,\n request,\n });\n };\n}\nexports.contentLengthMiddleware = contentLengthMiddleware;\nexports.contentLengthMiddlewareOptions = {\n step: \"build\",\n tags: [\"SET_CONTENT_LENGTH\", \"CONTENT_LENGTH\"],\n name: \"contentLengthMiddleware\",\n override: true,\n};\nconst getContentLengthPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.add(contentLengthMiddleware(options.bodyLengthChecker), exports.contentLengthMiddlewareOptions);\n },\n});\nexports.getContentLengthPlugin = getContentLengthPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createConfigValueProvider = void 0;\nconst createConfigValueProvider = (configKey, canonicalEndpointParamKey, config) => {\n const configProvider = async () => {\n var _a;\n const configValue = (_a = config[configKey]) !== null && _a !== void 0 ? _a : config[canonicalEndpointParamKey];\n if (typeof configValue === \"function\") {\n return configValue();\n }\n return configValue;\n };\n if (configKey === \"endpoint\" || canonicalEndpointParamKey === \"endpoint\") {\n return async () => {\n const endpoint = await configProvider();\n if (endpoint && typeof endpoint === \"object\") {\n if (\"url\" in endpoint) {\n return endpoint.url.href;\n }\n if (\"hostname\" in endpoint) {\n const { protocol, hostname, port, path } = endpoint;\n return `${protocol}//${hostname}${port ? \":\" + port : \"\"}${path}`;\n }\n }\n return endpoint;\n };\n }\n return configProvider;\n};\nexports.createConfigValueProvider = createConfigValueProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointFromConfig = void 0;\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst getEndpointUrlConfig_1 = require(\"./getEndpointUrlConfig\");\nconst getEndpointFromConfig = async (serviceId) => (0, node_config_provider_1.loadConfig)((0, getEndpointUrlConfig_1.getEndpointUrlConfig)(serviceId))();\nexports.getEndpointFromConfig = getEndpointFromConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveParams = exports.getEndpointFromInstructions = void 0;\nconst service_customizations_1 = require(\"../service-customizations\");\nconst createConfigValueProvider_1 = require(\"./createConfigValueProvider\");\nconst getEndpointFromConfig_1 = require(\"./getEndpointFromConfig\");\nconst toEndpointV1_1 = require(\"./toEndpointV1\");\nconst getEndpointFromInstructions = async (commandInput, instructionsSupplier, clientConfig, context) => {\n if (!clientConfig.endpoint) {\n const endpointFromConfig = await (0, getEndpointFromConfig_1.getEndpointFromConfig)(clientConfig.serviceId || \"\");\n if (endpointFromConfig) {\n clientConfig.endpoint = () => Promise.resolve((0, toEndpointV1_1.toEndpointV1)(endpointFromConfig));\n }\n }\n const endpointParams = await (0, exports.resolveParams)(commandInput, instructionsSupplier, clientConfig);\n if (typeof clientConfig.endpointProvider !== \"function\") {\n throw new Error(\"config.endpointProvider is not set.\");\n }\n const endpoint = clientConfig.endpointProvider(endpointParams, context);\n return endpoint;\n};\nexports.getEndpointFromInstructions = getEndpointFromInstructions;\nconst resolveParams = async (commandInput, instructionsSupplier, clientConfig) => {\n var _a;\n const endpointParams = {};\n const instructions = ((_a = instructionsSupplier === null || instructionsSupplier === void 0 ? void 0 : instructionsSupplier.getEndpointParameterInstructions) === null || _a === void 0 ? void 0 : _a.call(instructionsSupplier)) || {};\n for (const [name, instruction] of Object.entries(instructions)) {\n switch (instruction.type) {\n case \"staticContextParams\":\n endpointParams[name] = instruction.value;\n break;\n case \"contextParams\":\n endpointParams[name] = commandInput[instruction.name];\n break;\n case \"clientContextParams\":\n case \"builtInParams\":\n endpointParams[name] = await (0, createConfigValueProvider_1.createConfigValueProvider)(instruction.name, name, clientConfig)();\n break;\n default:\n throw new Error(\"Unrecognized endpoint parameter instruction: \" + JSON.stringify(instruction));\n }\n }\n if (Object.keys(instructions).length === 0) {\n Object.assign(endpointParams, clientConfig);\n }\n if (String(clientConfig.serviceId).toLowerCase() === \"s3\") {\n await (0, service_customizations_1.resolveParamsForS3)(endpointParams);\n }\n return endpointParams;\n};\nexports.resolveParams = resolveParams;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointUrlConfig = void 0;\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst ENV_ENDPOINT_URL = \"AWS_ENDPOINT_URL\";\nconst CONFIG_ENDPOINT_URL = \"endpoint_url\";\nconst getEndpointUrlConfig = (serviceId) => ({\n environmentVariableSelector: (env) => {\n const serviceSuffixParts = serviceId.split(\" \").map((w) => w.toUpperCase());\n const serviceEndpointUrl = env[[ENV_ENDPOINT_URL, ...serviceSuffixParts].join(\"_\")];\n if (serviceEndpointUrl)\n return serviceEndpointUrl;\n const endpointUrl = env[ENV_ENDPOINT_URL];\n if (endpointUrl)\n return endpointUrl;\n return undefined;\n },\n configFileSelector: (profile, config) => {\n if (config && profile.services) {\n const servicesSection = config[[\"services\", profile.services].join(shared_ini_file_loader_1.CONFIG_PREFIX_SEPARATOR)];\n if (servicesSection) {\n const servicePrefixParts = serviceId.split(\" \").map((w) => w.toLowerCase());\n const endpointUrl = servicesSection[[servicePrefixParts.join(\"_\"), CONFIG_ENDPOINT_URL].join(shared_ini_file_loader_1.CONFIG_PREFIX_SEPARATOR)];\n if (endpointUrl)\n return endpointUrl;\n }\n }\n const endpointUrl = profile[CONFIG_ENDPOINT_URL];\n if (endpointUrl)\n return endpointUrl;\n return undefined;\n },\n default: undefined,\n});\nexports.getEndpointUrlConfig = getEndpointUrlConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./getEndpointFromInstructions\"), exports);\ntslib_1.__exportStar(require(\"./toEndpointV1\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toEndpointV1 = void 0;\nconst url_parser_1 = require(\"@smithy/url-parser\");\nconst toEndpointV1 = (endpoint) => {\n if (typeof endpoint === \"object\") {\n if (\"url\" in endpoint) {\n return (0, url_parser_1.parseUrl)(endpoint.url);\n }\n return endpoint;\n }\n return (0, url_parser_1.parseUrl)(endpoint);\n};\nexports.toEndpointV1 = toEndpointV1;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.endpointMiddleware = void 0;\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst getEndpointFromInstructions_1 = require(\"./adaptors/getEndpointFromInstructions\");\nconst endpointMiddleware = ({ config, instructions, }) => {\n return (next, context) => async (args) => {\n var _a, _b, _c;\n const endpoint = await (0, getEndpointFromInstructions_1.getEndpointFromInstructions)(args.input, {\n getEndpointParameterInstructions() {\n return instructions;\n },\n }, { ...config }, context);\n context.endpointV2 = endpoint;\n context.authSchemes = (_a = endpoint.properties) === null || _a === void 0 ? void 0 : _a.authSchemes;\n const authScheme = (_b = context.authSchemes) === null || _b === void 0 ? void 0 : _b[0];\n if (authScheme) {\n context[\"signing_region\"] = authScheme.signingRegion;\n context[\"signing_service\"] = authScheme.signingName;\n const smithyContext = (0, util_middleware_1.getSmithyContext)(context);\n const httpAuthOption = (_c = smithyContext === null || smithyContext === void 0 ? void 0 : smithyContext.selectedHttpAuthScheme) === null || _c === void 0 ? void 0 : _c.httpAuthOption;\n if (httpAuthOption) {\n httpAuthOption.signingProperties = Object.assign(httpAuthOption.signingProperties || {}, {\n signing_region: authScheme.signingRegion,\n signingRegion: authScheme.signingRegion,\n signing_service: authScheme.signingName,\n signingName: authScheme.signingName,\n signingRegionSet: authScheme.signingRegionSet,\n }, authScheme.properties);\n }\n }\n return next({\n ...args,\n });\n };\n};\nexports.endpointMiddleware = endpointMiddleware;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointPlugin = exports.endpointMiddlewareOptions = void 0;\nconst middleware_serde_1 = require(\"@smithy/middleware-serde\");\nconst endpointMiddleware_1 = require(\"./endpointMiddleware\");\nexports.endpointMiddlewareOptions = {\n step: \"serialize\",\n tags: [\"ENDPOINT_PARAMETERS\", \"ENDPOINT_V2\", \"ENDPOINT\"],\n name: \"endpointV2Middleware\",\n override: true,\n relation: \"before\",\n toMiddleware: middleware_serde_1.serializerMiddlewareOption.name,\n};\nconst getEndpointPlugin = (config, instructions) => ({\n applyToStack: (clientStack) => {\n clientStack.addRelativeTo((0, endpointMiddleware_1.endpointMiddleware)({\n config,\n instructions,\n }), exports.endpointMiddlewareOptions);\n },\n});\nexports.getEndpointPlugin = getEndpointPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./adaptors\"), exports);\ntslib_1.__exportStar(require(\"./endpointMiddleware\"), exports);\ntslib_1.__exportStar(require(\"./getEndpointPlugin\"), exports);\ntslib_1.__exportStar(require(\"./resolveEndpointConfig\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveEndpointConfig = void 0;\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst toEndpointV1_1 = require(\"./adaptors/toEndpointV1\");\nconst resolveEndpointConfig = (input) => {\n var _a, _b, _c;\n const tls = (_a = input.tls) !== null && _a !== void 0 ? _a : true;\n const { endpoint } = input;\n const customEndpointProvider = endpoint != null ? async () => (0, toEndpointV1_1.toEndpointV1)(await (0, util_middleware_1.normalizeProvider)(endpoint)()) : undefined;\n const isCustomEndpoint = !!endpoint;\n return {\n ...input,\n endpoint: customEndpointProvider,\n tls,\n isCustomEndpoint,\n useDualstackEndpoint: (0, util_middleware_1.normalizeProvider)((_b = input.useDualstackEndpoint) !== null && _b !== void 0 ? _b : false),\n useFipsEndpoint: (0, util_middleware_1.normalizeProvider)((_c = input.useFipsEndpoint) !== null && _c !== void 0 ? _c : false),\n };\n};\nexports.resolveEndpointConfig = resolveEndpointConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./s3\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isArnBucketName = exports.isDnsCompatibleBucketName = exports.S3_HOSTNAME_PATTERN = exports.DOT_PATTERN = exports.resolveParamsForS3 = void 0;\nconst resolveParamsForS3 = async (endpointParams) => {\n const bucket = (endpointParams === null || endpointParams === void 0 ? void 0 : endpointParams.Bucket) || \"\";\n if (typeof endpointParams.Bucket === \"string\") {\n endpointParams.Bucket = bucket.replace(/#/g, encodeURIComponent(\"#\")).replace(/\\?/g, encodeURIComponent(\"?\"));\n }\n if ((0, exports.isArnBucketName)(bucket)) {\n if (endpointParams.ForcePathStyle === true) {\n throw new Error(\"Path-style addressing cannot be used with ARN buckets\");\n }\n }\n else if (!(0, exports.isDnsCompatibleBucketName)(bucket) ||\n (bucket.indexOf(\".\") !== -1 && !String(endpointParams.Endpoint).startsWith(\"http:\")) ||\n bucket.toLowerCase() !== bucket ||\n bucket.length < 3) {\n endpointParams.ForcePathStyle = true;\n }\n if (endpointParams.DisableMultiRegionAccessPoints) {\n endpointParams.disableMultiRegionAccessPoints = true;\n endpointParams.DisableMRAP = true;\n }\n return endpointParams;\n};\nexports.resolveParamsForS3 = resolveParamsForS3;\nconst DOMAIN_PATTERN = /^[a-z0-9][a-z0-9\\.\\-]{1,61}[a-z0-9]$/;\nconst IP_ADDRESS_PATTERN = /(\\d+\\.){3}\\d+/;\nconst DOTS_PATTERN = /\\.\\./;\nexports.DOT_PATTERN = /\\./;\nexports.S3_HOSTNAME_PATTERN = /^(.+\\.)?s3(-fips)?(\\.dualstack)?[.-]([a-z0-9-]+)\\./;\nconst isDnsCompatibleBucketName = (bucketName) => DOMAIN_PATTERN.test(bucketName) && !IP_ADDRESS_PATTERN.test(bucketName) && !DOTS_PATTERN.test(bucketName);\nexports.isDnsCompatibleBucketName = isDnsCompatibleBucketName;\nconst isArnBucketName = (bucketName) => {\n const [arn, partition, service, region, account, typeOrId] = bucketName.split(\":\");\n const isArn = arn === \"arn\" && bucketName.split(\":\").length >= 6;\n const isValidArn = [arn, partition, service, account, typeOrId].filter(Boolean).length === 5;\n if (isArn && !isValidArn) {\n throw new Error(`Invalid ARN: ${bucketName} was an invalid ARN.`);\n }\n return arn === \"arn\" && !!partition && !!service && !!account && !!typeOrId;\n};\nexports.isArnBucketName = isArnBucketName;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AdaptiveRetryStrategy = void 0;\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst StandardRetryStrategy_1 = require(\"./StandardRetryStrategy\");\nclass AdaptiveRetryStrategy extends StandardRetryStrategy_1.StandardRetryStrategy {\n constructor(maxAttemptsProvider, options) {\n const { rateLimiter, ...superOptions } = options !== null && options !== void 0 ? options : {};\n super(maxAttemptsProvider, superOptions);\n this.rateLimiter = rateLimiter !== null && rateLimiter !== void 0 ? rateLimiter : new util_retry_1.DefaultRateLimiter();\n this.mode = util_retry_1.RETRY_MODES.ADAPTIVE;\n }\n async retry(next, args) {\n return super.retry(next, args, {\n beforeRequest: async () => {\n return this.rateLimiter.getSendToken();\n },\n afterRequest: (response) => {\n this.rateLimiter.updateClientSendingRate(response);\n },\n });\n }\n}\nexports.AdaptiveRetryStrategy = AdaptiveRetryStrategy;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StandardRetryStrategy = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst service_error_classification_1 = require(\"@smithy/service-error-classification\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst uuid_1 = require(\"uuid\");\nconst defaultRetryQuota_1 = require(\"./defaultRetryQuota\");\nconst delayDecider_1 = require(\"./delayDecider\");\nconst retryDecider_1 = require(\"./retryDecider\");\nconst util_1 = require(\"./util\");\nclass StandardRetryStrategy {\n constructor(maxAttemptsProvider, options) {\n var _a, _b, _c;\n this.maxAttemptsProvider = maxAttemptsProvider;\n this.mode = util_retry_1.RETRY_MODES.STANDARD;\n this.retryDecider = (_a = options === null || options === void 0 ? void 0 : options.retryDecider) !== null && _a !== void 0 ? _a : retryDecider_1.defaultRetryDecider;\n this.delayDecider = (_b = options === null || options === void 0 ? void 0 : options.delayDecider) !== null && _b !== void 0 ? _b : delayDecider_1.defaultDelayDecider;\n this.retryQuota = (_c = options === null || options === void 0 ? void 0 : options.retryQuota) !== null && _c !== void 0 ? _c : (0, defaultRetryQuota_1.getDefaultRetryQuota)(util_retry_1.INITIAL_RETRY_TOKENS);\n }\n shouldRetry(error, attempts, maxAttempts) {\n return attempts < maxAttempts && this.retryDecider(error) && this.retryQuota.hasRetryTokens(error);\n }\n async getMaxAttempts() {\n let maxAttempts;\n try {\n maxAttempts = await this.maxAttemptsProvider();\n }\n catch (error) {\n maxAttempts = util_retry_1.DEFAULT_MAX_ATTEMPTS;\n }\n return maxAttempts;\n }\n async retry(next, args, options) {\n let retryTokenAmount;\n let attempts = 0;\n let totalDelay = 0;\n const maxAttempts = await this.getMaxAttempts();\n const { request } = args;\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n request.headers[util_retry_1.INVOCATION_ID_HEADER] = (0, uuid_1.v4)();\n }\n while (true) {\n try {\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n request.headers[util_retry_1.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`;\n }\n if (options === null || options === void 0 ? void 0 : options.beforeRequest) {\n await options.beforeRequest();\n }\n const { response, output } = await next(args);\n if (options === null || options === void 0 ? void 0 : options.afterRequest) {\n options.afterRequest(response);\n }\n this.retryQuota.releaseRetryTokens(retryTokenAmount);\n output.$metadata.attempts = attempts + 1;\n output.$metadata.totalRetryDelay = totalDelay;\n return { response, output };\n }\n catch (e) {\n const err = (0, util_1.asSdkError)(e);\n attempts++;\n if (this.shouldRetry(err, attempts, maxAttempts)) {\n retryTokenAmount = this.retryQuota.retrieveRetryTokens(err);\n const delayFromDecider = this.delayDecider((0, service_error_classification_1.isThrottlingError)(err) ? util_retry_1.THROTTLING_RETRY_DELAY_BASE : util_retry_1.DEFAULT_RETRY_DELAY_BASE, attempts);\n const delayFromResponse = getDelayFromRetryAfterHeader(err.$response);\n const delay = Math.max(delayFromResponse || 0, delayFromDecider);\n totalDelay += delay;\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n if (!err.$metadata) {\n err.$metadata = {};\n }\n err.$metadata.attempts = attempts;\n err.$metadata.totalRetryDelay = totalDelay;\n throw err;\n }\n }\n }\n}\nexports.StandardRetryStrategy = StandardRetryStrategy;\nconst getDelayFromRetryAfterHeader = (response) => {\n if (!protocol_http_1.HttpResponse.isInstance(response))\n return;\n const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === \"retry-after\");\n if (!retryAfterHeaderName)\n return;\n const retryAfter = response.headers[retryAfterHeaderName];\n const retryAfterSeconds = Number(retryAfter);\n if (!Number.isNaN(retryAfterSeconds))\n return retryAfterSeconds * 1000;\n const retryAfterDate = new Date(retryAfter);\n return retryAfterDate.getTime() - Date.now();\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_RETRY_MODE_CONFIG_OPTIONS = exports.CONFIG_RETRY_MODE = exports.ENV_RETRY_MODE = exports.resolveRetryConfig = exports.NODE_MAX_ATTEMPT_CONFIG_OPTIONS = exports.CONFIG_MAX_ATTEMPTS = exports.ENV_MAX_ATTEMPTS = void 0;\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nexports.ENV_MAX_ATTEMPTS = \"AWS_MAX_ATTEMPTS\";\nexports.CONFIG_MAX_ATTEMPTS = \"max_attempts\";\nexports.NODE_MAX_ATTEMPT_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => {\n const value = env[exports.ENV_MAX_ATTEMPTS];\n if (!value)\n return undefined;\n const maxAttempt = parseInt(value);\n if (Number.isNaN(maxAttempt)) {\n throw new Error(`Environment variable ${exports.ENV_MAX_ATTEMPTS} mast be a number, got \"${value}\"`);\n }\n return maxAttempt;\n },\n configFileSelector: (profile) => {\n const value = profile[exports.CONFIG_MAX_ATTEMPTS];\n if (!value)\n return undefined;\n const maxAttempt = parseInt(value);\n if (Number.isNaN(maxAttempt)) {\n throw new Error(`Shared config file entry ${exports.CONFIG_MAX_ATTEMPTS} mast be a number, got \"${value}\"`);\n }\n return maxAttempt;\n },\n default: util_retry_1.DEFAULT_MAX_ATTEMPTS,\n};\nconst resolveRetryConfig = (input) => {\n var _a;\n const { retryStrategy } = input;\n const maxAttempts = (0, util_middleware_1.normalizeProvider)((_a = input.maxAttempts) !== null && _a !== void 0 ? _a : util_retry_1.DEFAULT_MAX_ATTEMPTS);\n return {\n ...input,\n maxAttempts,\n retryStrategy: async () => {\n if (retryStrategy) {\n return retryStrategy;\n }\n const retryMode = await (0, util_middleware_1.normalizeProvider)(input.retryMode)();\n if (retryMode === util_retry_1.RETRY_MODES.ADAPTIVE) {\n return new util_retry_1.AdaptiveRetryStrategy(maxAttempts);\n }\n return new util_retry_1.StandardRetryStrategy(maxAttempts);\n },\n };\n};\nexports.resolveRetryConfig = resolveRetryConfig;\nexports.ENV_RETRY_MODE = \"AWS_RETRY_MODE\";\nexports.CONFIG_RETRY_MODE = \"retry_mode\";\nexports.NODE_RETRY_MODE_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => env[exports.ENV_RETRY_MODE],\n configFileSelector: (profile) => profile[exports.CONFIG_RETRY_MODE],\n default: util_retry_1.DEFAULT_RETRY_MODE,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getDefaultRetryQuota = void 0;\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst getDefaultRetryQuota = (initialRetryTokens, options) => {\n var _a, _b, _c;\n const MAX_CAPACITY = initialRetryTokens;\n const noRetryIncrement = (_a = options === null || options === void 0 ? void 0 : options.noRetryIncrement) !== null && _a !== void 0 ? _a : util_retry_1.NO_RETRY_INCREMENT;\n const retryCost = (_b = options === null || options === void 0 ? void 0 : options.retryCost) !== null && _b !== void 0 ? _b : util_retry_1.RETRY_COST;\n const timeoutRetryCost = (_c = options === null || options === void 0 ? void 0 : options.timeoutRetryCost) !== null && _c !== void 0 ? _c : util_retry_1.TIMEOUT_RETRY_COST;\n let availableCapacity = initialRetryTokens;\n const getCapacityAmount = (error) => (error.name === \"TimeoutError\" ? timeoutRetryCost : retryCost);\n const hasRetryTokens = (error) => getCapacityAmount(error) <= availableCapacity;\n const retrieveRetryTokens = (error) => {\n if (!hasRetryTokens(error)) {\n throw new Error(\"No retry token available\");\n }\n const capacityAmount = getCapacityAmount(error);\n availableCapacity -= capacityAmount;\n return capacityAmount;\n };\n const releaseRetryTokens = (capacityReleaseAmount) => {\n availableCapacity += capacityReleaseAmount !== null && capacityReleaseAmount !== void 0 ? capacityReleaseAmount : noRetryIncrement;\n availableCapacity = Math.min(availableCapacity, MAX_CAPACITY);\n };\n return Object.freeze({\n hasRetryTokens,\n retrieveRetryTokens,\n releaseRetryTokens,\n });\n};\nexports.getDefaultRetryQuota = getDefaultRetryQuota;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultDelayDecider = void 0;\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst defaultDelayDecider = (delayBase, attempts) => Math.floor(Math.min(util_retry_1.MAXIMUM_RETRY_DELAY, Math.random() * 2 ** attempts * delayBase));\nexports.defaultDelayDecider = defaultDelayDecider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./AdaptiveRetryStrategy\"), exports);\ntslib_1.__exportStar(require(\"./StandardRetryStrategy\"), exports);\ntslib_1.__exportStar(require(\"./configurations\"), exports);\ntslib_1.__exportStar(require(\"./delayDecider\"), exports);\ntslib_1.__exportStar(require(\"./omitRetryHeadersMiddleware\"), exports);\ntslib_1.__exportStar(require(\"./retryDecider\"), exports);\ntslib_1.__exportStar(require(\"./retryMiddleware\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getOmitRetryHeadersPlugin = exports.omitRetryHeadersMiddlewareOptions = exports.omitRetryHeadersMiddleware = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst omitRetryHeadersMiddleware = () => (next) => async (args) => {\n const { request } = args;\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n delete request.headers[util_retry_1.INVOCATION_ID_HEADER];\n delete request.headers[util_retry_1.REQUEST_HEADER];\n }\n return next(args);\n};\nexports.omitRetryHeadersMiddleware = omitRetryHeadersMiddleware;\nexports.omitRetryHeadersMiddlewareOptions = {\n name: \"omitRetryHeadersMiddleware\",\n tags: [\"RETRY\", \"HEADERS\", \"OMIT_RETRY_HEADERS\"],\n relation: \"before\",\n toMiddleware: \"awsAuthMiddleware\",\n override: true,\n};\nconst getOmitRetryHeadersPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.addRelativeTo((0, exports.omitRetryHeadersMiddleware)(), exports.omitRetryHeadersMiddlewareOptions);\n },\n});\nexports.getOmitRetryHeadersPlugin = getOmitRetryHeadersPlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.defaultRetryDecider = void 0;\nconst service_error_classification_1 = require(\"@smithy/service-error-classification\");\nconst defaultRetryDecider = (error) => {\n if (!error) {\n return false;\n }\n return (0, service_error_classification_1.isRetryableByTrait)(error) || (0, service_error_classification_1.isClockSkewError)(error) || (0, service_error_classification_1.isThrottlingError)(error) || (0, service_error_classification_1.isTransientError)(error);\n};\nexports.defaultRetryDecider = defaultRetryDecider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRetryAfterHint = exports.getRetryPlugin = exports.retryMiddlewareOptions = exports.retryMiddleware = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst service_error_classification_1 = require(\"@smithy/service-error-classification\");\nconst util_retry_1 = require(\"@smithy/util-retry\");\nconst uuid_1 = require(\"uuid\");\nconst util_1 = require(\"./util\");\nconst retryMiddleware = (options) => (next, context) => async (args) => {\n let retryStrategy = await options.retryStrategy();\n const maxAttempts = await options.maxAttempts();\n if (isRetryStrategyV2(retryStrategy)) {\n retryStrategy = retryStrategy;\n let retryToken = await retryStrategy.acquireInitialRetryToken(context[\"partition_id\"]);\n let lastError = new Error();\n let attempts = 0;\n let totalRetryDelay = 0;\n const { request } = args;\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n request.headers[util_retry_1.INVOCATION_ID_HEADER] = (0, uuid_1.v4)();\n }\n while (true) {\n try {\n if (protocol_http_1.HttpRequest.isInstance(request)) {\n request.headers[util_retry_1.REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`;\n }\n const { response, output } = await next(args);\n retryStrategy.recordSuccess(retryToken);\n output.$metadata.attempts = attempts + 1;\n output.$metadata.totalRetryDelay = totalRetryDelay;\n return { response, output };\n }\n catch (e) {\n const retryErrorInfo = getRetryErrorInfo(e);\n lastError = (0, util_1.asSdkError)(e);\n try {\n retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo);\n }\n catch (refreshError) {\n if (!lastError.$metadata) {\n lastError.$metadata = {};\n }\n lastError.$metadata.attempts = attempts + 1;\n lastError.$metadata.totalRetryDelay = totalRetryDelay;\n throw lastError;\n }\n attempts = retryToken.getRetryCount();\n const delay = retryToken.getRetryDelay();\n totalRetryDelay += delay;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n else {\n retryStrategy = retryStrategy;\n if (retryStrategy === null || retryStrategy === void 0 ? void 0 : retryStrategy.mode)\n context.userAgent = [...(context.userAgent || []), [\"cfg/retry-mode\", retryStrategy.mode]];\n return retryStrategy.retry(next, args);\n }\n};\nexports.retryMiddleware = retryMiddleware;\nconst isRetryStrategyV2 = (retryStrategy) => typeof retryStrategy.acquireInitialRetryToken !== \"undefined\" &&\n typeof retryStrategy.refreshRetryTokenForRetry !== \"undefined\" &&\n typeof retryStrategy.recordSuccess !== \"undefined\";\nconst getRetryErrorInfo = (error) => {\n const errorInfo = {\n errorType: getRetryErrorType(error),\n };\n const retryAfterHint = (0, exports.getRetryAfterHint)(error.$response);\n if (retryAfterHint) {\n errorInfo.retryAfterHint = retryAfterHint;\n }\n return errorInfo;\n};\nconst getRetryErrorType = (error) => {\n if ((0, service_error_classification_1.isThrottlingError)(error))\n return \"THROTTLING\";\n if ((0, service_error_classification_1.isTransientError)(error))\n return \"TRANSIENT\";\n if ((0, service_error_classification_1.isServerError)(error))\n return \"SERVER_ERROR\";\n return \"CLIENT_ERROR\";\n};\nexports.retryMiddlewareOptions = {\n name: \"retryMiddleware\",\n tags: [\"RETRY\"],\n step: \"finalizeRequest\",\n priority: \"high\",\n override: true,\n};\nconst getRetryPlugin = (options) => ({\n applyToStack: (clientStack) => {\n clientStack.add((0, exports.retryMiddleware)(options), exports.retryMiddlewareOptions);\n },\n});\nexports.getRetryPlugin = getRetryPlugin;\nconst getRetryAfterHint = (response) => {\n if (!protocol_http_1.HttpResponse.isInstance(response))\n return;\n const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === \"retry-after\");\n if (!retryAfterHeaderName)\n return;\n const retryAfter = response.headers[retryAfterHeaderName];\n const retryAfterSeconds = Number(retryAfter);\n if (!Number.isNaN(retryAfterSeconds))\n return new Date(retryAfterSeconds * 1000);\n const retryAfterDate = new Date(retryAfter);\n return retryAfterDate;\n};\nexports.getRetryAfterHint = getRetryAfterHint;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.asSdkError = void 0;\nconst asSdkError = (error) => {\n if (error instanceof Error)\n return error;\n if (error instanceof Object)\n return Object.assign(new Error(), error);\n if (typeof error === \"string\")\n return new Error(error);\n return new Error(`AWS SDK error wrapper for ${error}`);\n};\nexports.asSdkError = asSdkError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.deserializerMiddleware = void 0;\nconst deserializerMiddleware = (options, deserializer) => (next, context) => async (args) => {\n const { response } = await next(args);\n try {\n const parsed = await deserializer(response, options);\n return {\n response,\n output: parsed,\n };\n }\n catch (error) {\n Object.defineProperty(error, \"$response\", {\n value: response,\n });\n if (!(\"$metadata\" in error)) {\n const hint = `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.`;\n error.message += \"\\n \" + hint;\n }\n throw error;\n }\n};\nexports.deserializerMiddleware = deserializerMiddleware;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./deserializerMiddleware\"), exports);\ntslib_1.__exportStar(require(\"./serdePlugin\"), exports);\ntslib_1.__exportStar(require(\"./serializerMiddleware\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSerdePlugin = exports.serializerMiddlewareOption = exports.deserializerMiddlewareOption = void 0;\nconst deserializerMiddleware_1 = require(\"./deserializerMiddleware\");\nconst serializerMiddleware_1 = require(\"./serializerMiddleware\");\nexports.deserializerMiddlewareOption = {\n name: \"deserializerMiddleware\",\n step: \"deserialize\",\n tags: [\"DESERIALIZER\"],\n override: true,\n};\nexports.serializerMiddlewareOption = {\n name: \"serializerMiddleware\",\n step: \"serialize\",\n tags: [\"SERIALIZER\"],\n override: true,\n};\nfunction getSerdePlugin(config, serializer, deserializer) {\n return {\n applyToStack: (commandStack) => {\n commandStack.add((0, deserializerMiddleware_1.deserializerMiddleware)(config, deserializer), exports.deserializerMiddlewareOption);\n commandStack.add((0, serializerMiddleware_1.serializerMiddleware)(config, serializer), exports.serializerMiddlewareOption);\n },\n };\n}\nexports.getSerdePlugin = getSerdePlugin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serializerMiddleware = void 0;\nconst serializerMiddleware = (options, serializer) => (next, context) => async (args) => {\n var _a;\n const endpoint = ((_a = context.endpointV2) === null || _a === void 0 ? void 0 : _a.url) && options.urlParser\n ? async () => options.urlParser(context.endpointV2.url)\n : options.endpoint;\n if (!endpoint) {\n throw new Error(\"No valid endpoint provider available.\");\n }\n const request = await serializer(args.input, { ...options, endpoint });\n return next({\n ...args,\n request,\n });\n};\nexports.serializerMiddleware = serializerMiddleware;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.constructStack = void 0;\nconst getAllAliases = (name, aliases) => {\n const _aliases = [];\n if (name) {\n _aliases.push(name);\n }\n if (aliases) {\n for (const alias of aliases) {\n _aliases.push(alias);\n }\n }\n return _aliases;\n};\nconst getMiddlewareNameWithAliases = (name, aliases) => {\n return `${name || \"anonymous\"}${aliases && aliases.length > 0 ? ` (a.k.a. ${aliases.join(\",\")})` : \"\"}`;\n};\nconst constructStack = () => {\n let absoluteEntries = [];\n let relativeEntries = [];\n let identifyOnResolve = false;\n const entriesNameSet = new Set();\n const sort = (entries) => entries.sort((a, b) => stepWeights[b.step] - stepWeights[a.step] ||\n priorityWeights[b.priority || \"normal\"] - priorityWeights[a.priority || \"normal\"]);\n const removeByName = (toRemove) => {\n let isRemoved = false;\n const filterCb = (entry) => {\n const aliases = getAllAliases(entry.name, entry.aliases);\n if (aliases.includes(toRemove)) {\n isRemoved = true;\n for (const alias of aliases) {\n entriesNameSet.delete(alias);\n }\n return false;\n }\n return true;\n };\n absoluteEntries = absoluteEntries.filter(filterCb);\n relativeEntries = relativeEntries.filter(filterCb);\n return isRemoved;\n };\n const removeByReference = (toRemove) => {\n let isRemoved = false;\n const filterCb = (entry) => {\n if (entry.middleware === toRemove) {\n isRemoved = true;\n for (const alias of getAllAliases(entry.name, entry.aliases)) {\n entriesNameSet.delete(alias);\n }\n return false;\n }\n return true;\n };\n absoluteEntries = absoluteEntries.filter(filterCb);\n relativeEntries = relativeEntries.filter(filterCb);\n return isRemoved;\n };\n const cloneTo = (toStack) => {\n var _a;\n absoluteEntries.forEach((entry) => {\n toStack.add(entry.middleware, { ...entry });\n });\n relativeEntries.forEach((entry) => {\n toStack.addRelativeTo(entry.middleware, { ...entry });\n });\n (_a = toStack.identifyOnResolve) === null || _a === void 0 ? void 0 : _a.call(toStack, stack.identifyOnResolve());\n return toStack;\n };\n const expandRelativeMiddlewareList = (from) => {\n const expandedMiddlewareList = [];\n from.before.forEach((entry) => {\n if (entry.before.length === 0 && entry.after.length === 0) {\n expandedMiddlewareList.push(entry);\n }\n else {\n expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry));\n }\n });\n expandedMiddlewareList.push(from);\n from.after.reverse().forEach((entry) => {\n if (entry.before.length === 0 && entry.after.length === 0) {\n expandedMiddlewareList.push(entry);\n }\n else {\n expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry));\n }\n });\n return expandedMiddlewareList;\n };\n const getMiddlewareList = (debug = false) => {\n const normalizedAbsoluteEntries = [];\n const normalizedRelativeEntries = [];\n const normalizedEntriesNameMap = {};\n absoluteEntries.forEach((entry) => {\n const normalizedEntry = {\n ...entry,\n before: [],\n after: [],\n };\n for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) {\n normalizedEntriesNameMap[alias] = normalizedEntry;\n }\n normalizedAbsoluteEntries.push(normalizedEntry);\n });\n relativeEntries.forEach((entry) => {\n const normalizedEntry = {\n ...entry,\n before: [],\n after: [],\n };\n for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) {\n normalizedEntriesNameMap[alias] = normalizedEntry;\n }\n normalizedRelativeEntries.push(normalizedEntry);\n });\n normalizedRelativeEntries.forEach((entry) => {\n if (entry.toMiddleware) {\n const toMiddleware = normalizedEntriesNameMap[entry.toMiddleware];\n if (toMiddleware === undefined) {\n if (debug) {\n return;\n }\n throw new Error(`${entry.toMiddleware} is not found when adding ` +\n `${getMiddlewareNameWithAliases(entry.name, entry.aliases)} ` +\n `middleware ${entry.relation} ${entry.toMiddleware}`);\n }\n if (entry.relation === \"after\") {\n toMiddleware.after.push(entry);\n }\n if (entry.relation === \"before\") {\n toMiddleware.before.push(entry);\n }\n }\n });\n const mainChain = sort(normalizedAbsoluteEntries)\n .map(expandRelativeMiddlewareList)\n .reduce((wholeList, expandedMiddlewareList) => {\n wholeList.push(...expandedMiddlewareList);\n return wholeList;\n }, []);\n return mainChain;\n };\n const stack = {\n add: (middleware, options = {}) => {\n const { name, override, aliases: _aliases } = options;\n const entry = {\n step: \"initialize\",\n priority: \"normal\",\n middleware,\n ...options,\n };\n const aliases = getAllAliases(name, _aliases);\n if (aliases.length > 0) {\n if (aliases.some((alias) => entriesNameSet.has(alias))) {\n if (!override)\n throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`);\n for (const alias of aliases) {\n const toOverrideIndex = absoluteEntries.findIndex((entry) => { var _a; return entry.name === alias || ((_a = entry.aliases) === null || _a === void 0 ? void 0 : _a.some((a) => a === alias)); });\n if (toOverrideIndex === -1) {\n continue;\n }\n const toOverride = absoluteEntries[toOverrideIndex];\n if (toOverride.step !== entry.step || entry.priority !== toOverride.priority) {\n throw new Error(`\"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}\" middleware with ` +\n `${toOverride.priority} priority in ${toOverride.step} step cannot ` +\n `be overridden by \"${getMiddlewareNameWithAliases(name, _aliases)}\" middleware with ` +\n `${entry.priority} priority in ${entry.step} step.`);\n }\n absoluteEntries.splice(toOverrideIndex, 1);\n }\n }\n for (const alias of aliases) {\n entriesNameSet.add(alias);\n }\n }\n absoluteEntries.push(entry);\n },\n addRelativeTo: (middleware, options) => {\n const { name, override, aliases: _aliases } = options;\n const entry = {\n middleware,\n ...options,\n };\n const aliases = getAllAliases(name, _aliases);\n if (aliases.length > 0) {\n if (aliases.some((alias) => entriesNameSet.has(alias))) {\n if (!override)\n throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`);\n for (const alias of aliases) {\n const toOverrideIndex = relativeEntries.findIndex((entry) => { var _a; return entry.name === alias || ((_a = entry.aliases) === null || _a === void 0 ? void 0 : _a.some((a) => a === alias)); });\n if (toOverrideIndex === -1) {\n continue;\n }\n const toOverride = relativeEntries[toOverrideIndex];\n if (toOverride.toMiddleware !== entry.toMiddleware || toOverride.relation !== entry.relation) {\n throw new Error(`\"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}\" middleware ` +\n `${toOverride.relation} \"${toOverride.toMiddleware}\" middleware cannot be overridden ` +\n `by \"${getMiddlewareNameWithAliases(name, _aliases)}\" middleware ${entry.relation} ` +\n `\"${entry.toMiddleware}\" middleware.`);\n }\n relativeEntries.splice(toOverrideIndex, 1);\n }\n }\n for (const alias of aliases) {\n entriesNameSet.add(alias);\n }\n }\n relativeEntries.push(entry);\n },\n clone: () => cloneTo((0, exports.constructStack)()),\n use: (plugin) => {\n plugin.applyToStack(stack);\n },\n remove: (toRemove) => {\n if (typeof toRemove === \"string\")\n return removeByName(toRemove);\n else\n return removeByReference(toRemove);\n },\n removeByTag: (toRemove) => {\n let isRemoved = false;\n const filterCb = (entry) => {\n const { tags, name, aliases: _aliases } = entry;\n if (tags && tags.includes(toRemove)) {\n const aliases = getAllAliases(name, _aliases);\n for (const alias of aliases) {\n entriesNameSet.delete(alias);\n }\n isRemoved = true;\n return false;\n }\n return true;\n };\n absoluteEntries = absoluteEntries.filter(filterCb);\n relativeEntries = relativeEntries.filter(filterCb);\n return isRemoved;\n },\n concat: (from) => {\n var _a, _b;\n const cloned = cloneTo((0, exports.constructStack)());\n cloned.use(from);\n cloned.identifyOnResolve(identifyOnResolve || cloned.identifyOnResolve() || ((_b = (_a = from.identifyOnResolve) === null || _a === void 0 ? void 0 : _a.call(from)) !== null && _b !== void 0 ? _b : false));\n return cloned;\n },\n applyToStack: cloneTo,\n identify: () => {\n return getMiddlewareList(true).map((mw) => {\n var _a;\n const step = (_a = mw.step) !== null && _a !== void 0 ? _a : mw.relation +\n \" \" +\n mw.toMiddleware;\n return getMiddlewareNameWithAliases(mw.name, mw.aliases) + \" - \" + step;\n });\n },\n identifyOnResolve(toggle) {\n if (typeof toggle === \"boolean\")\n identifyOnResolve = toggle;\n return identifyOnResolve;\n },\n resolve: (handler, context) => {\n for (const middleware of getMiddlewareList()\n .map((entry) => entry.middleware)\n .reverse()) {\n handler = middleware(handler, context);\n }\n if (identifyOnResolve) {\n console.log(stack.identify());\n }\n return handler;\n },\n };\n return stack;\n};\nexports.constructStack = constructStack;\nconst stepWeights = {\n initialize: 5,\n serialize: 4,\n build: 3,\n finalizeRequest: 2,\n deserialize: 1,\n};\nconst priorityWeights = {\n high: 3,\n normal: 2,\n low: 1,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./MiddlewareStack\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadConfig = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromEnv_1 = require(\"./fromEnv\");\nconst fromSharedConfigFiles_1 = require(\"./fromSharedConfigFiles\");\nconst fromStatic_1 = require(\"./fromStatic\");\nconst loadConfig = ({ environmentVariableSelector, configFileSelector, default: defaultValue }, configuration = {}) => (0, property_provider_1.memoize)((0, property_provider_1.chain)((0, fromEnv_1.fromEnv)(environmentVariableSelector), (0, fromSharedConfigFiles_1.fromSharedConfigFiles)(configFileSelector, configuration), (0, fromStatic_1.fromStatic)(defaultValue)));\nexports.loadConfig = loadConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromEnv = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst fromEnv = (envVarSelector) => async () => {\n try {\n const config = envVarSelector(process.env);\n if (config === undefined) {\n throw new Error();\n }\n return config;\n }\n catch (e) {\n throw new property_provider_1.CredentialsProviderError(e.message || `Cannot load config from environment variables with getter: ${envVarSelector}`);\n }\n};\nexports.fromEnv = fromEnv;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromSharedConfigFiles = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst shared_ini_file_loader_1 = require(\"@smithy/shared-ini-file-loader\");\nconst fromSharedConfigFiles = (configSelector, { preferredFile = \"config\", ...init } = {}) => async () => {\n const profile = (0, shared_ini_file_loader_1.getProfileName)(init);\n const { configFile, credentialsFile } = await (0, shared_ini_file_loader_1.loadSharedConfigFiles)(init);\n const profileFromCredentials = credentialsFile[profile] || {};\n const profileFromConfig = configFile[profile] || {};\n const mergedProfile = preferredFile === \"config\"\n ? { ...profileFromCredentials, ...profileFromConfig }\n : { ...profileFromConfig, ...profileFromCredentials };\n try {\n const cfgFile = preferredFile === \"config\" ? configFile : credentialsFile;\n const configValue = configSelector(mergedProfile, cfgFile);\n if (configValue === undefined) {\n throw new Error();\n }\n return configValue;\n }\n catch (e) {\n throw new property_provider_1.CredentialsProviderError(e.message || `Cannot load config for profile ${profile} in SDK configuration files with getter: ${configSelector}`);\n }\n};\nexports.fromSharedConfigFiles = fromSharedConfigFiles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromStatic = void 0;\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst isFunction = (func) => typeof func === \"function\";\nconst fromStatic = (defaultValue) => isFunction(defaultValue) ? async () => await defaultValue() : (0, property_provider_1.fromStatic)(defaultValue);\nexports.fromStatic = fromStatic;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./configLoader\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODEJS_TIMEOUT_ERROR_CODES = void 0;\nexports.NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"EPIPE\", \"ETIMEDOUT\"];\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getTransformedHeaders = void 0;\nconst getTransformedHeaders = (headers) => {\n const transformedHeaders = {};\n for (const name of Object.keys(headers)) {\n const headerValues = headers[name];\n transformedHeaders[name] = Array.isArray(headerValues) ? headerValues.join(\",\") : headerValues;\n }\n return transformedHeaders;\n};\nexports.getTransformedHeaders = getTransformedHeaders;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./node-http-handler\"), exports);\ntslib_1.__exportStar(require(\"./node-http2-handler\"), exports);\ntslib_1.__exportStar(require(\"./stream-collector\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NodeHttpHandler = exports.DEFAULT_REQUEST_TIMEOUT = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst querystring_builder_1 = require(\"@smithy/querystring-builder\");\nconst http_1 = require(\"http\");\nconst https_1 = require(\"https\");\nconst constants_1 = require(\"./constants\");\nconst get_transformed_headers_1 = require(\"./get-transformed-headers\");\nconst set_connection_timeout_1 = require(\"./set-connection-timeout\");\nconst set_socket_keep_alive_1 = require(\"./set-socket-keep-alive\");\nconst set_socket_timeout_1 = require(\"./set-socket-timeout\");\nconst write_request_body_1 = require(\"./write-request-body\");\nexports.DEFAULT_REQUEST_TIMEOUT = 0;\nclass NodeHttpHandler {\n constructor(options) {\n this.metadata = { handlerProtocol: \"http/1.1\" };\n this.configProvider = new Promise((resolve, reject) => {\n if (typeof options === \"function\") {\n options()\n .then((_options) => {\n resolve(this.resolveDefaultConfig(_options));\n })\n .catch(reject);\n }\n else {\n resolve(this.resolveDefaultConfig(options));\n }\n });\n }\n resolveDefaultConfig(options) {\n const { requestTimeout, connectionTimeout, socketTimeout, httpAgent, httpsAgent } = options || {};\n const keepAlive = true;\n const maxSockets = 50;\n return {\n connectionTimeout,\n requestTimeout: requestTimeout !== null && requestTimeout !== void 0 ? requestTimeout : socketTimeout,\n httpAgent: httpAgent || new http_1.Agent({ keepAlive, maxSockets }),\n httpsAgent: httpsAgent || new https_1.Agent({ keepAlive, maxSockets }),\n };\n }\n destroy() {\n var _a, _b, _c, _d;\n (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.httpAgent) === null || _b === void 0 ? void 0 : _b.destroy();\n (_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.httpsAgent) === null || _d === void 0 ? void 0 : _d.destroy();\n }\n async handle(request, { abortSignal } = {}) {\n if (!this.config) {\n this.config = await this.configProvider;\n }\n return new Promise((_resolve, _reject) => {\n var _a, _b;\n let writeRequestBodyPromise = undefined;\n const resolve = async (arg) => {\n await writeRequestBodyPromise;\n _resolve(arg);\n };\n const reject = async (arg) => {\n await writeRequestBodyPromise;\n _reject(arg);\n };\n if (!this.config) {\n throw new Error(\"Node HTTP request handler config is not resolved\");\n }\n if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n return;\n }\n const isSSL = request.protocol === \"https:\";\n const queryString = (0, querystring_builder_1.buildQueryString)(request.query || {});\n let auth = undefined;\n if (request.username != null || request.password != null) {\n const username = (_a = request.username) !== null && _a !== void 0 ? _a : \"\";\n const password = (_b = request.password) !== null && _b !== void 0 ? _b : \"\";\n auth = `${username}:${password}`;\n }\n let path = request.path;\n if (queryString) {\n path += `?${queryString}`;\n }\n if (request.fragment) {\n path += `#${request.fragment}`;\n }\n const nodeHttpsOptions = {\n headers: request.headers,\n host: request.hostname,\n method: request.method,\n path,\n port: request.port,\n agent: isSSL ? this.config.httpsAgent : this.config.httpAgent,\n auth,\n };\n const requestFunc = isSSL ? https_1.request : http_1.request;\n const req = requestFunc(nodeHttpsOptions, (res) => {\n const httpResponse = new protocol_http_1.HttpResponse({\n statusCode: res.statusCode || -1,\n reason: res.statusMessage,\n headers: (0, get_transformed_headers_1.getTransformedHeaders)(res.headers),\n body: res,\n });\n resolve({ response: httpResponse });\n });\n req.on(\"error\", (err) => {\n if (constants_1.NODEJS_TIMEOUT_ERROR_CODES.includes(err.code)) {\n reject(Object.assign(err, { name: \"TimeoutError\" }));\n }\n else {\n reject(err);\n }\n });\n (0, set_connection_timeout_1.setConnectionTimeout)(req, reject, this.config.connectionTimeout);\n (0, set_socket_timeout_1.setSocketTimeout)(req, reject, this.config.requestTimeout);\n if (abortSignal) {\n abortSignal.onabort = () => {\n req.abort();\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n };\n }\n const httpAgent = nodeHttpsOptions.agent;\n if (typeof httpAgent === \"object\" && \"keepAlive\" in httpAgent) {\n (0, set_socket_keep_alive_1.setSocketKeepAlive)(req, {\n keepAlive: httpAgent.keepAlive,\n keepAliveMsecs: httpAgent.keepAliveMsecs,\n });\n }\n writeRequestBodyPromise = (0, write_request_body_1.writeRequestBody)(req, request, this.config.requestTimeout).catch(_reject);\n });\n }\n updateHttpClientConfig(key, value) {\n this.config = undefined;\n this.configProvider = this.configProvider.then((config) => {\n return {\n ...config,\n [key]: value,\n };\n });\n }\n httpHandlerConfigs() {\n var _a;\n return (_a = this.config) !== null && _a !== void 0 ? _a : {};\n }\n}\nexports.NodeHttpHandler = NodeHttpHandler;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NodeHttp2ConnectionManager = void 0;\nconst tslib_1 = require(\"tslib\");\nconst http2_1 = tslib_1.__importDefault(require(\"http2\"));\nconst node_http2_connection_pool_1 = require(\"./node-http2-connection-pool\");\nclass NodeHttp2ConnectionManager {\n constructor(config) {\n this.sessionCache = new Map();\n this.config = config;\n if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) {\n throw new RangeError(\"maxConcurrency must be greater than zero.\");\n }\n }\n lease(requestContext, connectionConfiguration) {\n const url = this.getUrlString(requestContext);\n const existingPool = this.sessionCache.get(url);\n if (existingPool) {\n const existingSession = existingPool.poll();\n if (existingSession && !this.config.disableConcurrency) {\n return existingSession;\n }\n }\n const session = http2_1.default.connect(url);\n if (this.config.maxConcurrency) {\n session.settings({ maxConcurrentStreams: this.config.maxConcurrency }, (err) => {\n if (err) {\n throw new Error(\"Fail to set maxConcurrentStreams to \" +\n this.config.maxConcurrency +\n \"when creating new session for \" +\n requestContext.destination.toString());\n }\n });\n }\n session.unref();\n const destroySessionCb = () => {\n session.destroy();\n this.deleteSession(url, session);\n };\n session.on(\"goaway\", destroySessionCb);\n session.on(\"error\", destroySessionCb);\n session.on(\"frameError\", destroySessionCb);\n session.on(\"close\", () => this.deleteSession(url, session));\n if (connectionConfiguration.requestTimeout) {\n session.setTimeout(connectionConfiguration.requestTimeout, destroySessionCb);\n }\n const connectionPool = this.sessionCache.get(url) || new node_http2_connection_pool_1.NodeHttp2ConnectionPool();\n connectionPool.offerLast(session);\n this.sessionCache.set(url, connectionPool);\n return session;\n }\n deleteSession(authority, session) {\n const existingConnectionPool = this.sessionCache.get(authority);\n if (!existingConnectionPool) {\n return;\n }\n if (!existingConnectionPool.contains(session)) {\n return;\n }\n existingConnectionPool.remove(session);\n this.sessionCache.set(authority, existingConnectionPool);\n }\n release(requestContext, session) {\n var _a;\n const cacheKey = this.getUrlString(requestContext);\n (_a = this.sessionCache.get(cacheKey)) === null || _a === void 0 ? void 0 : _a.offerLast(session);\n }\n destroy() {\n for (const [key, connectionPool] of this.sessionCache) {\n for (const session of connectionPool) {\n if (!session.destroyed) {\n session.destroy();\n }\n connectionPool.remove(session);\n }\n this.sessionCache.delete(key);\n }\n }\n setMaxConcurrentStreams(maxConcurrentStreams) {\n if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) {\n throw new RangeError(\"maxConcurrentStreams must be greater than zero.\");\n }\n this.config.maxConcurrency = maxConcurrentStreams;\n }\n setDisableConcurrentStreams(disableConcurrentStreams) {\n this.config.disableConcurrency = disableConcurrentStreams;\n }\n getUrlString(request) {\n return request.destination.toString();\n }\n}\nexports.NodeHttp2ConnectionManager = NodeHttp2ConnectionManager;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NodeHttp2ConnectionPool = void 0;\nclass NodeHttp2ConnectionPool {\n constructor(sessions) {\n this.sessions = [];\n this.sessions = sessions !== null && sessions !== void 0 ? sessions : [];\n }\n poll() {\n if (this.sessions.length > 0) {\n return this.sessions.shift();\n }\n }\n offerLast(session) {\n this.sessions.push(session);\n }\n contains(session) {\n return this.sessions.includes(session);\n }\n remove(session) {\n this.sessions = this.sessions.filter((s) => s !== session);\n }\n [Symbol.iterator]() {\n return this.sessions[Symbol.iterator]();\n }\n destroy(connection) {\n for (const session of this.sessions) {\n if (session === connection) {\n if (!session.destroyed) {\n session.destroy();\n }\n }\n }\n }\n}\nexports.NodeHttp2ConnectionPool = NodeHttp2ConnectionPool;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NodeHttp2Handler = void 0;\nconst protocol_http_1 = require(\"@smithy/protocol-http\");\nconst querystring_builder_1 = require(\"@smithy/querystring-builder\");\nconst http2_1 = require(\"http2\");\nconst get_transformed_headers_1 = require(\"./get-transformed-headers\");\nconst node_http2_connection_manager_1 = require(\"./node-http2-connection-manager\");\nconst write_request_body_1 = require(\"./write-request-body\");\nclass NodeHttp2Handler {\n constructor(options) {\n this.metadata = { handlerProtocol: \"h2\" };\n this.connectionManager = new node_http2_connection_manager_1.NodeHttp2ConnectionManager({});\n this.configProvider = new Promise((resolve, reject) => {\n if (typeof options === \"function\") {\n options()\n .then((opts) => {\n resolve(opts || {});\n })\n .catch(reject);\n }\n else {\n resolve(options || {});\n }\n });\n }\n destroy() {\n this.connectionManager.destroy();\n }\n async handle(request, { abortSignal } = {}) {\n if (!this.config) {\n this.config = await this.configProvider;\n this.connectionManager.setDisableConcurrentStreams(this.config.disableConcurrentStreams || false);\n if (this.config.maxConcurrentStreams) {\n this.connectionManager.setMaxConcurrentStreams(this.config.maxConcurrentStreams);\n }\n }\n const { requestTimeout, disableConcurrentStreams } = this.config;\n return new Promise((_resolve, _reject) => {\n var _a, _b, _c;\n let fulfilled = false;\n let writeRequestBodyPromise = undefined;\n const resolve = async (arg) => {\n await writeRequestBodyPromise;\n _resolve(arg);\n };\n const reject = async (arg) => {\n await writeRequestBodyPromise;\n _reject(arg);\n };\n if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {\n fulfilled = true;\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n return;\n }\n const { hostname, method, port, protocol, query } = request;\n let auth = \"\";\n if (request.username != null || request.password != null) {\n const username = (_a = request.username) !== null && _a !== void 0 ? _a : \"\";\n const password = (_b = request.password) !== null && _b !== void 0 ? _b : \"\";\n auth = `${username}:${password}@`;\n }\n const authority = `${protocol}//${auth}${hostname}${port ? `:${port}` : \"\"}`;\n const requestContext = { destination: new URL(authority) };\n const session = this.connectionManager.lease(requestContext, {\n requestTimeout: (_c = this.config) === null || _c === void 0 ? void 0 : _c.sessionTimeout,\n disableConcurrentStreams: disableConcurrentStreams || false,\n });\n const rejectWithDestroy = (err) => {\n if (disableConcurrentStreams) {\n this.destroySession(session);\n }\n fulfilled = true;\n reject(err);\n };\n const queryString = (0, querystring_builder_1.buildQueryString)(query || {});\n let path = request.path;\n if (queryString) {\n path += `?${queryString}`;\n }\n if (request.fragment) {\n path += `#${request.fragment}`;\n }\n const req = session.request({\n ...request.headers,\n [http2_1.constants.HTTP2_HEADER_PATH]: path,\n [http2_1.constants.HTTP2_HEADER_METHOD]: method,\n });\n session.ref();\n req.on(\"response\", (headers) => {\n const httpResponse = new protocol_http_1.HttpResponse({\n statusCode: headers[\":status\"] || -1,\n headers: (0, get_transformed_headers_1.getTransformedHeaders)(headers),\n body: req,\n });\n fulfilled = true;\n resolve({ response: httpResponse });\n if (disableConcurrentStreams) {\n session.close();\n this.connectionManager.deleteSession(authority, session);\n }\n });\n if (requestTimeout) {\n req.setTimeout(requestTimeout, () => {\n req.close();\n const timeoutError = new Error(`Stream timed out because of no activity for ${requestTimeout} ms`);\n timeoutError.name = \"TimeoutError\";\n rejectWithDestroy(timeoutError);\n });\n }\n if (abortSignal) {\n abortSignal.onabort = () => {\n req.close();\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n rejectWithDestroy(abortError);\n };\n }\n req.on(\"frameError\", (type, code, id) => {\n rejectWithDestroy(new Error(`Frame type id ${type} in stream id ${id} has failed with code ${code}.`));\n });\n req.on(\"error\", rejectWithDestroy);\n req.on(\"aborted\", () => {\n rejectWithDestroy(new Error(`HTTP/2 stream is abnormally aborted in mid-communication with result code ${req.rstCode}.`));\n });\n req.on(\"close\", () => {\n session.unref();\n if (disableConcurrentStreams) {\n session.destroy();\n }\n if (!fulfilled) {\n rejectWithDestroy(new Error(\"Unexpected error: http2 request did not get a response\"));\n }\n });\n writeRequestBodyPromise = (0, write_request_body_1.writeRequestBody)(req, request, requestTimeout);\n });\n }\n updateHttpClientConfig(key, value) {\n this.config = undefined;\n this.configProvider = this.configProvider.then((config) => {\n return {\n ...config,\n [key]: value,\n };\n });\n }\n httpHandlerConfigs() {\n var _a;\n return (_a = this.config) !== null && _a !== void 0 ? _a : {};\n }\n destroySession(session) {\n if (!session.destroyed) {\n session.destroy();\n }\n }\n}\nexports.NodeHttp2Handler = NodeHttp2Handler;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.setConnectionTimeout = void 0;\nconst setConnectionTimeout = (request, reject, timeoutInMs = 0) => {\n if (!timeoutInMs) {\n return;\n }\n const timeoutId = setTimeout(() => {\n request.destroy();\n reject(Object.assign(new Error(`Socket timed out without establishing a connection within ${timeoutInMs} ms`), {\n name: \"TimeoutError\",\n }));\n }, timeoutInMs);\n request.on(\"socket\", (socket) => {\n if (socket.connecting) {\n socket.on(\"connect\", () => {\n clearTimeout(timeoutId);\n });\n }\n else {\n clearTimeout(timeoutId);\n }\n });\n};\nexports.setConnectionTimeout = setConnectionTimeout;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.setSocketKeepAlive = void 0;\nconst setSocketKeepAlive = (request, { keepAlive, keepAliveMsecs }) => {\n if (keepAlive !== true) {\n return;\n }\n request.on(\"socket\", (socket) => {\n socket.setKeepAlive(keepAlive, keepAliveMsecs || 0);\n });\n};\nexports.setSocketKeepAlive = setSocketKeepAlive;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.setSocketTimeout = void 0;\nconst setSocketTimeout = (request, reject, timeoutInMs = 0) => {\n request.setTimeout(timeoutInMs, () => {\n request.destroy();\n reject(Object.assign(new Error(`Connection timed out after ${timeoutInMs} ms`), { name: \"TimeoutError\" }));\n });\n};\nexports.setSocketTimeout = setSocketTimeout;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Collector = void 0;\nconst stream_1 = require(\"stream\");\nclass Collector extends stream_1.Writable {\n constructor() {\n super(...arguments);\n this.bufferedBytes = [];\n }\n _write(chunk, encoding, callback) {\n this.bufferedBytes.push(chunk);\n callback();\n }\n}\nexports.Collector = Collector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.streamCollector = void 0;\nconst collector_1 = require(\"./collector\");\nconst streamCollector = (stream) => new Promise((resolve, reject) => {\n const collector = new collector_1.Collector();\n stream.pipe(collector);\n stream.on(\"error\", (err) => {\n collector.end();\n reject(err);\n });\n collector.on(\"error\", reject);\n collector.on(\"finish\", function () {\n const bytes = new Uint8Array(Buffer.concat(this.bufferedBytes));\n resolve(bytes);\n });\n});\nexports.streamCollector = streamCollector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.writeRequestBody = void 0;\nconst stream_1 = require(\"stream\");\nconst MIN_WAIT_TIME = 1000;\nasync function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) {\n var _a;\n const headers = (_a = request.headers) !== null && _a !== void 0 ? _a : {};\n const expect = headers[\"Expect\"] || headers[\"expect\"];\n let timeoutId = -1;\n let hasError = false;\n if (expect === \"100-continue\") {\n await Promise.race([\n new Promise((resolve) => {\n timeoutId = Number(setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs)));\n }),\n new Promise((resolve) => {\n httpRequest.on(\"continue\", () => {\n clearTimeout(timeoutId);\n resolve();\n });\n httpRequest.on(\"error\", () => {\n hasError = true;\n clearTimeout(timeoutId);\n resolve();\n });\n }),\n ]);\n }\n if (!hasError) {\n writeBody(httpRequest, request.body);\n }\n}\nexports.writeRequestBody = writeRequestBody;\nfunction writeBody(httpRequest, body) {\n if (body instanceof stream_1.Readable) {\n body.pipe(httpRequest);\n }\n else if (body) {\n httpRequest.end(Buffer.from(body));\n }\n else {\n httpRequest.end();\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CredentialsProviderError = void 0;\nconst ProviderError_1 = require(\"./ProviderError\");\nclass CredentialsProviderError extends ProviderError_1.ProviderError {\n constructor(message, tryNextLink = true) {\n super(message, tryNextLink);\n this.tryNextLink = tryNextLink;\n this.name = \"CredentialsProviderError\";\n Object.setPrototypeOf(this, CredentialsProviderError.prototype);\n }\n}\nexports.CredentialsProviderError = CredentialsProviderError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ProviderError = void 0;\nclass ProviderError extends Error {\n constructor(message, tryNextLink = true) {\n super(message);\n this.tryNextLink = tryNextLink;\n this.name = \"ProviderError\";\n Object.setPrototypeOf(this, ProviderError.prototype);\n }\n static from(error, tryNextLink = true) {\n return Object.assign(new this(error.message, tryNextLink), error);\n }\n}\nexports.ProviderError = ProviderError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TokenProviderError = void 0;\nconst ProviderError_1 = require(\"./ProviderError\");\nclass TokenProviderError extends ProviderError_1.ProviderError {\n constructor(message, tryNextLink = true) {\n super(message, tryNextLink);\n this.tryNextLink = tryNextLink;\n this.name = \"TokenProviderError\";\n Object.setPrototypeOf(this, TokenProviderError.prototype);\n }\n}\nexports.TokenProviderError = TokenProviderError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.chain = void 0;\nconst ProviderError_1 = require(\"./ProviderError\");\nconst chain = (...providers) => async () => {\n if (providers.length === 0) {\n throw new ProviderError_1.ProviderError(\"No providers in chain\");\n }\n let lastProviderError;\n for (const provider of providers) {\n try {\n const credentials = await provider();\n return credentials;\n }\n catch (err) {\n lastProviderError = err;\n if (err === null || err === void 0 ? void 0 : err.tryNextLink) {\n continue;\n }\n throw err;\n }\n }\n throw lastProviderError;\n};\nexports.chain = chain;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromStatic = void 0;\nconst fromStatic = (staticValue) => () => Promise.resolve(staticValue);\nexports.fromStatic = fromStatic;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./CredentialsProviderError\"), exports);\ntslib_1.__exportStar(require(\"./ProviderError\"), exports);\ntslib_1.__exportStar(require(\"./TokenProviderError\"), exports);\ntslib_1.__exportStar(require(\"./chain\"), exports);\ntslib_1.__exportStar(require(\"./fromStatic\"), exports);\ntslib_1.__exportStar(require(\"./memoize\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.memoize = void 0;\nconst memoize = (provider, isExpired, requiresRefresh) => {\n let resolved;\n let pending;\n let hasResult;\n let isConstant = false;\n const coalesceProvider = async () => {\n if (!pending) {\n pending = provider();\n }\n try {\n resolved = await pending;\n hasResult = true;\n isConstant = false;\n }\n finally {\n pending = undefined;\n }\n return resolved;\n };\n if (isExpired === undefined) {\n return async (options) => {\n if (!hasResult || (options === null || options === void 0 ? void 0 : options.forceRefresh)) {\n resolved = await coalesceProvider();\n }\n return resolved;\n };\n }\n return async (options) => {\n if (!hasResult || (options === null || options === void 0 ? void 0 : options.forceRefresh)) {\n resolved = await coalesceProvider();\n }\n if (isConstant) {\n return resolved;\n }\n if (requiresRefresh && !requiresRefresh(resolved)) {\n isConstant = true;\n return resolved;\n }\n if (isExpired(resolved)) {\n await coalesceProvider();\n return resolved;\n }\n return resolved;\n };\n};\nexports.memoize = memoize;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Field = void 0;\nconst types_1 = require(\"@smithy/types\");\nclass Field {\n constructor({ name, kind = types_1.FieldPosition.HEADER, values = [] }) {\n this.name = name;\n this.kind = kind;\n this.values = values;\n }\n add(value) {\n this.values.push(value);\n }\n set(values) {\n this.values = values;\n }\n remove(value) {\n this.values = this.values.filter((v) => v !== value);\n }\n toString() {\n return this.values.map((v) => (v.includes(\",\") || v.includes(\" \") ? `\"${v}\"` : v)).join(\", \");\n }\n get() {\n return this.values;\n }\n}\nexports.Field = Field;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Fields = void 0;\nclass Fields {\n constructor({ fields = [], encoding = \"utf-8\" }) {\n this.entries = {};\n fields.forEach(this.setField.bind(this));\n this.encoding = encoding;\n }\n setField(field) {\n this.entries[field.name.toLowerCase()] = field;\n }\n getField(name) {\n return this.entries[name.toLowerCase()];\n }\n removeField(name) {\n delete this.entries[name.toLowerCase()];\n }\n getByType(kind) {\n return Object.values(this.entries).filter((field) => field.kind === kind);\n }\n}\nexports.Fields = Fields;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveHttpHandlerRuntimeConfig = exports.getHttpHandlerExtensionConfiguration = void 0;\nconst getHttpHandlerExtensionConfiguration = (runtimeConfig) => {\n let httpHandler = runtimeConfig.httpHandler;\n return {\n setHttpHandler(handler) {\n httpHandler = handler;\n },\n httpHandler() {\n return httpHandler;\n },\n updateHttpClientConfig(key, value) {\n httpHandler.updateHttpClientConfig(key, value);\n },\n httpHandlerConfigs() {\n return httpHandler.httpHandlerConfigs();\n },\n };\n};\nexports.getHttpHandlerExtensionConfiguration = getHttpHandlerExtensionConfiguration;\nconst resolveHttpHandlerRuntimeConfig = (httpHandlerExtensionConfiguration) => {\n return {\n httpHandler: httpHandlerExtensionConfiguration.httpHandler(),\n };\n};\nexports.resolveHttpHandlerRuntimeConfig = resolveHttpHandlerRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./httpExtensionConfiguration\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpRequest = void 0;\nclass HttpRequest {\n constructor(options) {\n this.method = options.method || \"GET\";\n this.hostname = options.hostname || \"localhost\";\n this.port = options.port;\n this.query = options.query || {};\n this.headers = options.headers || {};\n this.body = options.body;\n this.protocol = options.protocol\n ? options.protocol.slice(-1) !== \":\"\n ? `${options.protocol}:`\n : options.protocol\n : \"https:\";\n this.path = options.path ? (options.path.charAt(0) !== \"/\" ? `/${options.path}` : options.path) : \"/\";\n this.username = options.username;\n this.password = options.password;\n this.fragment = options.fragment;\n }\n static isInstance(request) {\n if (!request)\n return false;\n const req = request;\n return (\"method\" in req &&\n \"protocol\" in req &&\n \"hostname\" in req &&\n \"path\" in req &&\n typeof req[\"query\"] === \"object\" &&\n typeof req[\"headers\"] === \"object\");\n }\n clone() {\n const cloned = new HttpRequest({\n ...this,\n headers: { ...this.headers },\n });\n if (cloned.query)\n cloned.query = cloneQuery(cloned.query);\n return cloned;\n }\n}\nexports.HttpRequest = HttpRequest;\nfunction cloneQuery(query) {\n return Object.keys(query).reduce((carry, paramName) => {\n const param = query[paramName];\n return {\n ...carry,\n [paramName]: Array.isArray(param) ? [...param] : param,\n };\n }, {});\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpResponse = void 0;\nclass HttpResponse {\n constructor(options) {\n this.statusCode = options.statusCode;\n this.reason = options.reason;\n this.headers = options.headers || {};\n this.body = options.body;\n }\n static isInstance(response) {\n if (!response)\n return false;\n const resp = response;\n return typeof resp.statusCode === \"number\" && typeof resp.headers === \"object\";\n }\n}\nexports.HttpResponse = HttpResponse;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./extensions\"), exports);\ntslib_1.__exportStar(require(\"./Field\"), exports);\ntslib_1.__exportStar(require(\"./Fields\"), exports);\ntslib_1.__exportStar(require(\"./httpHandler\"), exports);\ntslib_1.__exportStar(require(\"./httpRequest\"), exports);\ntslib_1.__exportStar(require(\"./httpResponse\"), exports);\ntslib_1.__exportStar(require(\"./isValidHostname\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isValidHostname = void 0;\nfunction isValidHostname(hostname) {\n const hostPattern = /^[a-z0-9][a-z0-9\\.\\-]*[a-z0-9]$/;\n return hostPattern.test(hostname);\n}\nexports.isValidHostname = isValidHostname;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.buildQueryString = void 0;\nconst util_uri_escape_1 = require(\"@smithy/util-uri-escape\");\nfunction buildQueryString(query) {\n const parts = [];\n for (let key of Object.keys(query).sort()) {\n const value = query[key];\n key = (0, util_uri_escape_1.escapeUri)(key);\n if (Array.isArray(value)) {\n for (let i = 0, iLen = value.length; i < iLen; i++) {\n parts.push(`${key}=${(0, util_uri_escape_1.escapeUri)(value[i])}`);\n }\n }\n else {\n let qsEntry = key;\n if (value || typeof value === \"string\") {\n qsEntry += `=${(0, util_uri_escape_1.escapeUri)(value)}`;\n }\n parts.push(qsEntry);\n }\n }\n return parts.join(\"&\");\n}\nexports.buildQueryString = buildQueryString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseQueryString = void 0;\nfunction parseQueryString(querystring) {\n const query = {};\n querystring = querystring.replace(/^\\?/, \"\");\n if (querystring) {\n for (const pair of querystring.split(\"&\")) {\n let [key, value = null] = pair.split(\"=\");\n key = decodeURIComponent(key);\n if (value) {\n value = decodeURIComponent(value);\n }\n if (!(key in query)) {\n query[key] = value;\n }\n else if (Array.isArray(query[key])) {\n query[key].push(value);\n }\n else {\n query[key] = [query[key], value];\n }\n }\n }\n return query;\n}\nexports.parseQueryString = parseQueryString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODEJS_TIMEOUT_ERROR_CODES = exports.TRANSIENT_ERROR_STATUS_CODES = exports.TRANSIENT_ERROR_CODES = exports.THROTTLING_ERROR_CODES = exports.CLOCK_SKEW_ERROR_CODES = void 0;\nexports.CLOCK_SKEW_ERROR_CODES = [\n \"AuthFailure\",\n \"InvalidSignatureException\",\n \"RequestExpired\",\n \"RequestInTheFuture\",\n \"RequestTimeTooSkewed\",\n \"SignatureDoesNotMatch\",\n];\nexports.THROTTLING_ERROR_CODES = [\n \"BandwidthLimitExceeded\",\n \"EC2ThrottledException\",\n \"LimitExceededException\",\n \"PriorRequestNotComplete\",\n \"ProvisionedThroughputExceededException\",\n \"RequestLimitExceeded\",\n \"RequestThrottled\",\n \"RequestThrottledException\",\n \"SlowDown\",\n \"ThrottledException\",\n \"Throttling\",\n \"ThrottlingException\",\n \"TooManyRequestsException\",\n \"TransactionInProgressException\",\n];\nexports.TRANSIENT_ERROR_CODES = [\"TimeoutError\", \"RequestTimeout\", \"RequestTimeoutException\"];\nexports.TRANSIENT_ERROR_STATUS_CODES = [500, 502, 503, 504];\nexports.NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"ECONNREFUSED\", \"EPIPE\", \"ETIMEDOUT\"];\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isServerError = exports.isTransientError = exports.isThrottlingError = exports.isClockSkewError = exports.isRetryableByTrait = void 0;\nconst constants_1 = require(\"./constants\");\nconst isRetryableByTrait = (error) => error.$retryable !== undefined;\nexports.isRetryableByTrait = isRetryableByTrait;\nconst isClockSkewError = (error) => constants_1.CLOCK_SKEW_ERROR_CODES.includes(error.name);\nexports.isClockSkewError = isClockSkewError;\nconst isThrottlingError = (error) => {\n var _a, _b;\n return ((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) === 429 ||\n constants_1.THROTTLING_ERROR_CODES.includes(error.name) ||\n ((_b = error.$retryable) === null || _b === void 0 ? void 0 : _b.throttling) == true;\n};\nexports.isThrottlingError = isThrottlingError;\nconst isTransientError = (error) => {\n var _a;\n return constants_1.TRANSIENT_ERROR_CODES.includes(error.name) ||\n constants_1.NODEJS_TIMEOUT_ERROR_CODES.includes((error === null || error === void 0 ? void 0 : error.code) || \"\") ||\n constants_1.TRANSIENT_ERROR_STATUS_CODES.includes(((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) || 0);\n};\nexports.isTransientError = isTransientError;\nconst isServerError = (error) => {\n var _a;\n if (((_a = error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode) !== undefined) {\n const statusCode = error.$metadata.httpStatusCode;\n if (500 <= statusCode && statusCode <= 599 && !(0, exports.isTransientError)(error)) {\n return true;\n }\n return false;\n }\n return false;\n};\nexports.isServerError = isServerError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getConfigData = void 0;\nconst types_1 = require(\"@smithy/types\");\nconst loadSharedConfigFiles_1 = require(\"./loadSharedConfigFiles\");\nconst getConfigData = (data) => Object.entries(data)\n .filter(([key]) => {\n const sections = key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR);\n if (sections.length === 2 && Object.values(types_1.IniSectionType).includes(sections[0])) {\n return true;\n }\n return false;\n})\n .reduce((acc, [key, value]) => {\n const updatedKey = key.startsWith(types_1.IniSectionType.PROFILE) ? key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR)[1] : key;\n acc[updatedKey] = value;\n return acc;\n}, {\n ...(data.default && { default: data.default }),\n});\nexports.getConfigData = getConfigData;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getConfigFilepath = exports.ENV_CONFIG_PATH = void 0;\nconst path_1 = require(\"path\");\nconst getHomeDir_1 = require(\"./getHomeDir\");\nexports.ENV_CONFIG_PATH = \"AWS_CONFIG_FILE\";\nconst getConfigFilepath = () => process.env[exports.ENV_CONFIG_PATH] || (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), \".aws\", \"config\");\nexports.getConfigFilepath = getConfigFilepath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getCredentialsFilepath = exports.ENV_CREDENTIALS_PATH = void 0;\nconst path_1 = require(\"path\");\nconst getHomeDir_1 = require(\"./getHomeDir\");\nexports.ENV_CREDENTIALS_PATH = \"AWS_SHARED_CREDENTIALS_FILE\";\nconst getCredentialsFilepath = () => process.env[exports.ENV_CREDENTIALS_PATH] || (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), \".aws\", \"credentials\");\nexports.getCredentialsFilepath = getCredentialsFilepath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getHomeDir = void 0;\nconst os_1 = require(\"os\");\nconst path_1 = require(\"path\");\nconst homeDirCache = {};\nconst getHomeDirCacheKey = () => {\n if (process && process.geteuid) {\n return `${process.geteuid()}`;\n }\n return \"DEFAULT\";\n};\nconst getHomeDir = () => {\n const { HOME, USERPROFILE, HOMEPATH, HOMEDRIVE = `C:${path_1.sep}` } = process.env;\n if (HOME)\n return HOME;\n if (USERPROFILE)\n return USERPROFILE;\n if (HOMEPATH)\n return `${HOMEDRIVE}${HOMEPATH}`;\n const homeDirCacheKey = getHomeDirCacheKey();\n if (!homeDirCache[homeDirCacheKey])\n homeDirCache[homeDirCacheKey] = (0, os_1.homedir)();\n return homeDirCache[homeDirCacheKey];\n};\nexports.getHomeDir = getHomeDir;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getProfileName = exports.DEFAULT_PROFILE = exports.ENV_PROFILE = void 0;\nexports.ENV_PROFILE = \"AWS_PROFILE\";\nexports.DEFAULT_PROFILE = \"default\";\nconst getProfileName = (init) => init.profile || process.env[exports.ENV_PROFILE] || exports.DEFAULT_PROFILE;\nexports.getProfileName = getProfileName;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSSOTokenFilepath = void 0;\nconst crypto_1 = require(\"crypto\");\nconst path_1 = require(\"path\");\nconst getHomeDir_1 = require(\"./getHomeDir\");\nconst getSSOTokenFilepath = (id) => {\n const hasher = (0, crypto_1.createHash)(\"sha1\");\n const cacheName = hasher.update(id).digest(\"hex\");\n return (0, path_1.join)((0, getHomeDir_1.getHomeDir)(), \".aws\", \"sso\", \"cache\", `${cacheName}.json`);\n};\nexports.getSSOTokenFilepath = getSSOTokenFilepath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSSOTokenFromFile = void 0;\nconst fs_1 = require(\"fs\");\nconst getSSOTokenFilepath_1 = require(\"./getSSOTokenFilepath\");\nconst { readFile } = fs_1.promises;\nconst getSSOTokenFromFile = async (id) => {\n const ssoTokenFilepath = (0, getSSOTokenFilepath_1.getSSOTokenFilepath)(id);\n const ssoTokenText = await readFile(ssoTokenFilepath, \"utf8\");\n return JSON.parse(ssoTokenText);\n};\nexports.getSSOTokenFromFile = getSSOTokenFromFile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSsoSessionData = void 0;\nconst types_1 = require(\"@smithy/types\");\nconst loadSharedConfigFiles_1 = require(\"./loadSharedConfigFiles\");\nconst getSsoSessionData = (data) => Object.entries(data)\n .filter(([key]) => key.startsWith(types_1.IniSectionType.SSO_SESSION + loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR))\n .reduce((acc, [key, value]) => ({ ...acc, [key.split(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR)[1]]: value }), {});\nexports.getSsoSessionData = getSsoSessionData;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./getHomeDir\"), exports);\ntslib_1.__exportStar(require(\"./getProfileName\"), exports);\ntslib_1.__exportStar(require(\"./getSSOTokenFilepath\"), exports);\ntslib_1.__exportStar(require(\"./getSSOTokenFromFile\"), exports);\ntslib_1.__exportStar(require(\"./loadSharedConfigFiles\"), exports);\ntslib_1.__exportStar(require(\"./loadSsoSessionData\"), exports);\ntslib_1.__exportStar(require(\"./parseKnownFiles\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadSharedConfigFiles = exports.CONFIG_PREFIX_SEPARATOR = void 0;\nconst getConfigData_1 = require(\"./getConfigData\");\nconst getConfigFilepath_1 = require(\"./getConfigFilepath\");\nconst getCredentialsFilepath_1 = require(\"./getCredentialsFilepath\");\nconst parseIni_1 = require(\"./parseIni\");\nconst slurpFile_1 = require(\"./slurpFile\");\nconst swallowError = () => ({});\nexports.CONFIG_PREFIX_SEPARATOR = \".\";\nconst loadSharedConfigFiles = async (init = {}) => {\n const { filepath = (0, getCredentialsFilepath_1.getCredentialsFilepath)(), configFilepath = (0, getConfigFilepath_1.getConfigFilepath)() } = init;\n const parsedFiles = await Promise.all([\n (0, slurpFile_1.slurpFile)(configFilepath, {\n ignoreCache: init.ignoreCache,\n })\n .then(parseIni_1.parseIni)\n .then(getConfigData_1.getConfigData)\n .catch(swallowError),\n (0, slurpFile_1.slurpFile)(filepath, {\n ignoreCache: init.ignoreCache,\n })\n .then(parseIni_1.parseIni)\n .catch(swallowError),\n ]);\n return {\n configFile: parsedFiles[0],\n credentialsFile: parsedFiles[1],\n };\n};\nexports.loadSharedConfigFiles = loadSharedConfigFiles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadSsoSessionData = void 0;\nconst getConfigFilepath_1 = require(\"./getConfigFilepath\");\nconst getSsoSessionData_1 = require(\"./getSsoSessionData\");\nconst parseIni_1 = require(\"./parseIni\");\nconst slurpFile_1 = require(\"./slurpFile\");\nconst swallowError = () => ({});\nconst loadSsoSessionData = async (init = {}) => {\n var _a;\n return (0, slurpFile_1.slurpFile)((_a = init.configFilepath) !== null && _a !== void 0 ? _a : (0, getConfigFilepath_1.getConfigFilepath)())\n .then(parseIni_1.parseIni)\n .then(getSsoSessionData_1.getSsoSessionData)\n .catch(swallowError);\n};\nexports.loadSsoSessionData = loadSsoSessionData;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mergeConfigFiles = void 0;\nconst mergeConfigFiles = (...files) => {\n const merged = {};\n for (const file of files) {\n for (const [key, values] of Object.entries(file)) {\n if (merged[key] !== undefined) {\n Object.assign(merged[key], values);\n }\n else {\n merged[key] = values;\n }\n }\n }\n return merged;\n};\nexports.mergeConfigFiles = mergeConfigFiles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseIni = void 0;\nconst types_1 = require(\"@smithy/types\");\nconst loadSharedConfigFiles_1 = require(\"./loadSharedConfigFiles\");\nconst prefixKeyRegex = /^([\\w-]+)\\s([\"'])?([\\w-@\\+\\.%:/]+)\\2$/;\nconst profileNameBlockList = [\"__proto__\", \"profile __proto__\"];\nconst parseIni = (iniData) => {\n const map = {};\n let currentSection;\n let currentSubSection;\n for (const iniLine of iniData.split(/\\r?\\n/)) {\n const trimmedLine = iniLine.split(/(^|\\s)[;#]/)[0].trim();\n const isSection = trimmedLine[0] === \"[\" && trimmedLine[trimmedLine.length - 1] === \"]\";\n if (isSection) {\n currentSection = undefined;\n currentSubSection = undefined;\n const sectionName = trimmedLine.substring(1, trimmedLine.length - 1);\n const matches = prefixKeyRegex.exec(sectionName);\n if (matches) {\n const [, prefix, , name] = matches;\n if (Object.values(types_1.IniSectionType).includes(prefix)) {\n currentSection = [prefix, name].join(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR);\n }\n }\n else {\n currentSection = sectionName;\n }\n if (profileNameBlockList.includes(sectionName)) {\n throw new Error(`Found invalid profile name \"${sectionName}\"`);\n }\n }\n else if (currentSection) {\n const indexOfEqualsSign = trimmedLine.indexOf(\"=\");\n if (![0, -1].includes(indexOfEqualsSign)) {\n const [name, value] = [\n trimmedLine.substring(0, indexOfEqualsSign).trim(),\n trimmedLine.substring(indexOfEqualsSign + 1).trim(),\n ];\n if (value === \"\") {\n currentSubSection = name;\n }\n else {\n if (currentSubSection && iniLine.trimStart() === iniLine) {\n currentSubSection = undefined;\n }\n map[currentSection] = map[currentSection] || {};\n const key = currentSubSection ? [currentSubSection, name].join(loadSharedConfigFiles_1.CONFIG_PREFIX_SEPARATOR) : name;\n map[currentSection][key] = value;\n }\n }\n }\n }\n return map;\n};\nexports.parseIni = parseIni;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseKnownFiles = void 0;\nconst loadSharedConfigFiles_1 = require(\"./loadSharedConfigFiles\");\nconst mergeConfigFiles_1 = require(\"./mergeConfigFiles\");\nconst parseKnownFiles = async (init) => {\n const parsedFiles = await (0, loadSharedConfigFiles_1.loadSharedConfigFiles)(init);\n return (0, mergeConfigFiles_1.mergeConfigFiles)(parsedFiles.configFile, parsedFiles.credentialsFile);\n};\nexports.parseKnownFiles = parseKnownFiles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.slurpFile = void 0;\nconst fs_1 = require(\"fs\");\nconst { readFile } = fs_1.promises;\nconst filePromisesHash = {};\nconst slurpFile = (path, options) => {\n if (!filePromisesHash[path] || (options === null || options === void 0 ? void 0 : options.ignoreCache)) {\n filePromisesHash[path] = readFile(path, \"utf8\");\n }\n return filePromisesHash[path];\n};\nexports.slurpFile = slurpFile;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SignatureV4 = void 0;\nconst eventstream_codec_1 = require(\"@smithy/eventstream-codec\");\nconst util_hex_encoding_1 = require(\"@smithy/util-hex-encoding\");\nconst util_middleware_1 = require(\"@smithy/util-middleware\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst constants_1 = require(\"./constants\");\nconst credentialDerivation_1 = require(\"./credentialDerivation\");\nconst getCanonicalHeaders_1 = require(\"./getCanonicalHeaders\");\nconst getCanonicalQuery_1 = require(\"./getCanonicalQuery\");\nconst getPayloadHash_1 = require(\"./getPayloadHash\");\nconst headerUtil_1 = require(\"./headerUtil\");\nconst moveHeadersToQuery_1 = require(\"./moveHeadersToQuery\");\nconst prepareRequest_1 = require(\"./prepareRequest\");\nconst utilDate_1 = require(\"./utilDate\");\nclass SignatureV4 {\n constructor({ applyChecksum, credentials, region, service, sha256, uriEscapePath = true, }) {\n this.headerMarshaller = new eventstream_codec_1.HeaderMarshaller(util_utf8_1.toUtf8, util_utf8_1.fromUtf8);\n this.service = service;\n this.sha256 = sha256;\n this.uriEscapePath = uriEscapePath;\n this.applyChecksum = typeof applyChecksum === \"boolean\" ? applyChecksum : true;\n this.regionProvider = (0, util_middleware_1.normalizeProvider)(region);\n this.credentialProvider = (0, util_middleware_1.normalizeProvider)(credentials);\n }\n async presign(originalRequest, options = {}) {\n const { signingDate = new Date(), expiresIn = 3600, unsignableHeaders, unhoistableHeaders, signableHeaders, signingRegion, signingService, } = options;\n const credentials = await this.credentialProvider();\n this.validateResolvedCredentials(credentials);\n const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider());\n const { longDate, shortDate } = formatDate(signingDate);\n if (expiresIn > constants_1.MAX_PRESIGNED_TTL) {\n return Promise.reject(\"Signature version 4 presigned URLs\" + \" must have an expiration date less than one week in\" + \" the future\");\n }\n const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service);\n const request = (0, moveHeadersToQuery_1.moveHeadersToQuery)((0, prepareRequest_1.prepareRequest)(originalRequest), { unhoistableHeaders });\n if (credentials.sessionToken) {\n request.query[constants_1.TOKEN_QUERY_PARAM] = credentials.sessionToken;\n }\n request.query[constants_1.ALGORITHM_QUERY_PARAM] = constants_1.ALGORITHM_IDENTIFIER;\n request.query[constants_1.CREDENTIAL_QUERY_PARAM] = `${credentials.accessKeyId}/${scope}`;\n request.query[constants_1.AMZ_DATE_QUERY_PARAM] = longDate;\n request.query[constants_1.EXPIRES_QUERY_PARAM] = expiresIn.toString(10);\n const canonicalHeaders = (0, getCanonicalHeaders_1.getCanonicalHeaders)(request, unsignableHeaders, signableHeaders);\n request.query[constants_1.SIGNED_HEADERS_QUERY_PARAM] = getCanonicalHeaderList(canonicalHeaders);\n request.query[constants_1.SIGNATURE_QUERY_PARAM] = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, await (0, getPayloadHash_1.getPayloadHash)(originalRequest, this.sha256)));\n return request;\n }\n async sign(toSign, options) {\n if (typeof toSign === \"string\") {\n return this.signString(toSign, options);\n }\n else if (toSign.headers && toSign.payload) {\n return this.signEvent(toSign, options);\n }\n else if (toSign.message) {\n return this.signMessage(toSign, options);\n }\n else {\n return this.signRequest(toSign, options);\n }\n }\n async signEvent({ headers, payload }, { signingDate = new Date(), priorSignature, signingRegion, signingService }) {\n const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider());\n const { shortDate, longDate } = formatDate(signingDate);\n const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service);\n const hashedPayload = await (0, getPayloadHash_1.getPayloadHash)({ headers: {}, body: payload }, this.sha256);\n const hash = new this.sha256();\n hash.update(headers);\n const hashedHeaders = (0, util_hex_encoding_1.toHex)(await hash.digest());\n const stringToSign = [\n constants_1.EVENT_ALGORITHM_IDENTIFIER,\n longDate,\n scope,\n priorSignature,\n hashedHeaders,\n hashedPayload,\n ].join(\"\\n\");\n return this.signString(stringToSign, { signingDate, signingRegion: region, signingService });\n }\n async signMessage(signableMessage, { signingDate = new Date(), signingRegion, signingService }) {\n const promise = this.signEvent({\n headers: this.headerMarshaller.format(signableMessage.message.headers),\n payload: signableMessage.message.body,\n }, {\n signingDate,\n signingRegion,\n signingService,\n priorSignature: signableMessage.priorSignature,\n });\n return promise.then((signature) => {\n return { message: signableMessage.message, signature };\n });\n }\n async signString(stringToSign, { signingDate = new Date(), signingRegion, signingService } = {}) {\n const credentials = await this.credentialProvider();\n this.validateResolvedCredentials(credentials);\n const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider());\n const { shortDate } = formatDate(signingDate);\n const hash = new this.sha256(await this.getSigningKey(credentials, region, shortDate, signingService));\n hash.update((0, util_utf8_1.toUint8Array)(stringToSign));\n return (0, util_hex_encoding_1.toHex)(await hash.digest());\n }\n async signRequest(requestToSign, { signingDate = new Date(), signableHeaders, unsignableHeaders, signingRegion, signingService, } = {}) {\n const credentials = await this.credentialProvider();\n this.validateResolvedCredentials(credentials);\n const region = signingRegion !== null && signingRegion !== void 0 ? signingRegion : (await this.regionProvider());\n const request = (0, prepareRequest_1.prepareRequest)(requestToSign);\n const { longDate, shortDate } = formatDate(signingDate);\n const scope = (0, credentialDerivation_1.createScope)(shortDate, region, signingService !== null && signingService !== void 0 ? signingService : this.service);\n request.headers[constants_1.AMZ_DATE_HEADER] = longDate;\n if (credentials.sessionToken) {\n request.headers[constants_1.TOKEN_HEADER] = credentials.sessionToken;\n }\n const payloadHash = await (0, getPayloadHash_1.getPayloadHash)(request, this.sha256);\n if (!(0, headerUtil_1.hasHeader)(constants_1.SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants_1.SHA256_HEADER] = payloadHash;\n }\n const canonicalHeaders = (0, getCanonicalHeaders_1.getCanonicalHeaders)(request, unsignableHeaders, signableHeaders);\n const signature = await this.getSignature(longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, payloadHash));\n request.headers[constants_1.AUTH_HEADER] =\n `${constants_1.ALGORITHM_IDENTIFIER} ` +\n `Credential=${credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${getCanonicalHeaderList(canonicalHeaders)}, ` +\n `Signature=${signature}`;\n return request;\n }\n createCanonicalRequest(request, canonicalHeaders, payloadHash) {\n const sortedHeaders = Object.keys(canonicalHeaders).sort();\n return `${request.method}\n${this.getCanonicalPath(request)}\n${(0, getCanonicalQuery_1.getCanonicalQuery)(request)}\n${sortedHeaders.map((name) => `${name}:${canonicalHeaders[name]}`).join(\"\\n\")}\n\n${sortedHeaders.join(\";\")}\n${payloadHash}`;\n }\n async createStringToSign(longDate, credentialScope, canonicalRequest) {\n const hash = new this.sha256();\n hash.update((0, util_utf8_1.toUint8Array)(canonicalRequest));\n const hashedRequest = await hash.digest();\n return `${constants_1.ALGORITHM_IDENTIFIER}\n${longDate}\n${credentialScope}\n${(0, util_hex_encoding_1.toHex)(hashedRequest)}`;\n }\n getCanonicalPath({ path }) {\n if (this.uriEscapePath) {\n const normalizedPathSegments = [];\n for (const pathSegment of path.split(\"/\")) {\n if ((pathSegment === null || pathSegment === void 0 ? void 0 : pathSegment.length) === 0)\n continue;\n if (pathSegment === \".\")\n continue;\n if (pathSegment === \"..\") {\n normalizedPathSegments.pop();\n }\n else {\n normalizedPathSegments.push(pathSegment);\n }\n }\n const normalizedPath = `${(path === null || path === void 0 ? void 0 : path.startsWith(\"/\")) ? \"/\" : \"\"}${normalizedPathSegments.join(\"/\")}${normalizedPathSegments.length > 0 && (path === null || path === void 0 ? void 0 : path.endsWith(\"/\")) ? \"/\" : \"\"}`;\n const doubleEncoded = encodeURIComponent(normalizedPath);\n return doubleEncoded.replace(/%2F/g, \"/\");\n }\n return path;\n }\n async getSignature(longDate, credentialScope, keyPromise, canonicalRequest) {\n const stringToSign = await this.createStringToSign(longDate, credentialScope, canonicalRequest);\n const hash = new this.sha256(await keyPromise);\n hash.update((0, util_utf8_1.toUint8Array)(stringToSign));\n return (0, util_hex_encoding_1.toHex)(await hash.digest());\n }\n getSigningKey(credentials, region, shortDate, service) {\n return (0, credentialDerivation_1.getSigningKey)(this.sha256, credentials, shortDate, region, service || this.service);\n }\n validateResolvedCredentials(credentials) {\n if (typeof credentials !== \"object\" ||\n typeof credentials.accessKeyId !== \"string\" ||\n typeof credentials.secretAccessKey !== \"string\") {\n throw new Error(\"Resolved credential object is not valid\");\n }\n }\n}\nexports.SignatureV4 = SignatureV4;\nconst formatDate = (now) => {\n const longDate = (0, utilDate_1.iso8601)(now).replace(/[\\-:]/g, \"\");\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n };\n};\nconst getCanonicalHeaderList = (headers) => Object.keys(headers).sort().join(\";\");\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.cloneQuery = exports.cloneRequest = void 0;\nconst cloneRequest = ({ headers, query, ...rest }) => ({\n ...rest,\n headers: { ...headers },\n query: query ? (0, exports.cloneQuery)(query) : undefined,\n});\nexports.cloneRequest = cloneRequest;\nconst cloneQuery = (query) => Object.keys(query).reduce((carry, paramName) => {\n const param = query[paramName];\n return {\n ...carry,\n [paramName]: Array.isArray(param) ? [...param] : param,\n };\n}, {});\nexports.cloneQuery = cloneQuery;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MAX_PRESIGNED_TTL = exports.KEY_TYPE_IDENTIFIER = exports.MAX_CACHE_SIZE = exports.UNSIGNED_PAYLOAD = exports.EVENT_ALGORITHM_IDENTIFIER = exports.ALGORITHM_IDENTIFIER_V4A = exports.ALGORITHM_IDENTIFIER = exports.UNSIGNABLE_PATTERNS = exports.SEC_HEADER_PATTERN = exports.PROXY_HEADER_PATTERN = exports.ALWAYS_UNSIGNABLE_HEADERS = exports.HOST_HEADER = exports.TOKEN_HEADER = exports.SHA256_HEADER = exports.SIGNATURE_HEADER = exports.GENERATED_HEADERS = exports.DATE_HEADER = exports.AMZ_DATE_HEADER = exports.AUTH_HEADER = exports.REGION_SET_PARAM = exports.TOKEN_QUERY_PARAM = exports.SIGNATURE_QUERY_PARAM = exports.EXPIRES_QUERY_PARAM = exports.SIGNED_HEADERS_QUERY_PARAM = exports.AMZ_DATE_QUERY_PARAM = exports.CREDENTIAL_QUERY_PARAM = exports.ALGORITHM_QUERY_PARAM = void 0;\nexports.ALGORITHM_QUERY_PARAM = \"X-Amz-Algorithm\";\nexports.CREDENTIAL_QUERY_PARAM = \"X-Amz-Credential\";\nexports.AMZ_DATE_QUERY_PARAM = \"X-Amz-Date\";\nexports.SIGNED_HEADERS_QUERY_PARAM = \"X-Amz-SignedHeaders\";\nexports.EXPIRES_QUERY_PARAM = \"X-Amz-Expires\";\nexports.SIGNATURE_QUERY_PARAM = \"X-Amz-Signature\";\nexports.TOKEN_QUERY_PARAM = \"X-Amz-Security-Token\";\nexports.REGION_SET_PARAM = \"X-Amz-Region-Set\";\nexports.AUTH_HEADER = \"authorization\";\nexports.AMZ_DATE_HEADER = exports.AMZ_DATE_QUERY_PARAM.toLowerCase();\nexports.DATE_HEADER = \"date\";\nexports.GENERATED_HEADERS = [exports.AUTH_HEADER, exports.AMZ_DATE_HEADER, exports.DATE_HEADER];\nexports.SIGNATURE_HEADER = exports.SIGNATURE_QUERY_PARAM.toLowerCase();\nexports.SHA256_HEADER = \"x-amz-content-sha256\";\nexports.TOKEN_HEADER = exports.TOKEN_QUERY_PARAM.toLowerCase();\nexports.HOST_HEADER = \"host\";\nexports.ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n \"cache-control\": true,\n connection: true,\n expect: true,\n from: true,\n \"keep-alive\": true,\n \"max-forwards\": true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n \"transfer-encoding\": true,\n upgrade: true,\n \"user-agent\": true,\n \"x-amzn-trace-id\": true,\n};\nexports.PROXY_HEADER_PATTERN = /^proxy-/;\nexports.SEC_HEADER_PATTERN = /^sec-/;\nexports.UNSIGNABLE_PATTERNS = [/^proxy-/i, /^sec-/i];\nexports.ALGORITHM_IDENTIFIER = \"AWS4-HMAC-SHA256\";\nexports.ALGORITHM_IDENTIFIER_V4A = \"AWS4-ECDSA-P256-SHA256\";\nexports.EVENT_ALGORITHM_IDENTIFIER = \"AWS4-HMAC-SHA256-PAYLOAD\";\nexports.UNSIGNED_PAYLOAD = \"UNSIGNED-PAYLOAD\";\nexports.MAX_CACHE_SIZE = 50;\nexports.KEY_TYPE_IDENTIFIER = \"aws4_request\";\nexports.MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.clearCredentialCache = exports.getSigningKey = exports.createScope = void 0;\nconst util_hex_encoding_1 = require(\"@smithy/util-hex-encoding\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst constants_1 = require(\"./constants\");\nconst signingKeyCache = {};\nconst cacheQueue = [];\nconst createScope = (shortDate, region, service) => `${shortDate}/${region}/${service}/${constants_1.KEY_TYPE_IDENTIFIER}`;\nexports.createScope = createScope;\nconst getSigningKey = async (sha256Constructor, credentials, shortDate, region, service) => {\n const credsHash = await hmac(sha256Constructor, credentials.secretAccessKey, credentials.accessKeyId);\n const cacheKey = `${shortDate}:${region}:${service}:${(0, util_hex_encoding_1.toHex)(credsHash)}:${credentials.sessionToken}`;\n if (cacheKey in signingKeyCache) {\n return signingKeyCache[cacheKey];\n }\n cacheQueue.push(cacheKey);\n while (cacheQueue.length > constants_1.MAX_CACHE_SIZE) {\n delete signingKeyCache[cacheQueue.shift()];\n }\n let key = `AWS4${credentials.secretAccessKey}`;\n for (const signable of [shortDate, region, service, constants_1.KEY_TYPE_IDENTIFIER]) {\n key = await hmac(sha256Constructor, key, signable);\n }\n return (signingKeyCache[cacheKey] = key);\n};\nexports.getSigningKey = getSigningKey;\nconst clearCredentialCache = () => {\n cacheQueue.length = 0;\n Object.keys(signingKeyCache).forEach((cacheKey) => {\n delete signingKeyCache[cacheKey];\n });\n};\nexports.clearCredentialCache = clearCredentialCache;\nconst hmac = (ctor, secret, data) => {\n const hash = new ctor(secret);\n hash.update((0, util_utf8_1.toUint8Array)(data));\n return hash.digest();\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getCanonicalHeaders = void 0;\nconst constants_1 = require(\"./constants\");\nconst getCanonicalHeaders = ({ headers }, unsignableHeaders, signableHeaders) => {\n const canonical = {};\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue;\n }\n const canonicalHeaderName = headerName.toLowerCase();\n if (canonicalHeaderName in constants_1.ALWAYS_UNSIGNABLE_HEADERS ||\n (unsignableHeaders === null || unsignableHeaders === void 0 ? void 0 : unsignableHeaders.has(canonicalHeaderName)) ||\n constants_1.PROXY_HEADER_PATTERN.test(canonicalHeaderName) ||\n constants_1.SEC_HEADER_PATTERN.test(canonicalHeaderName)) {\n if (!signableHeaders || (signableHeaders && !signableHeaders.has(canonicalHeaderName))) {\n continue;\n }\n }\n canonical[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, \" \");\n }\n return canonical;\n};\nexports.getCanonicalHeaders = getCanonicalHeaders;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getCanonicalQuery = void 0;\nconst util_uri_escape_1 = require(\"@smithy/util-uri-escape\");\nconst constants_1 = require(\"./constants\");\nconst getCanonicalQuery = ({ query = {} }) => {\n const keys = [];\n const serialized = {};\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants_1.SIGNATURE_HEADER) {\n continue;\n }\n keys.push(key);\n const value = query[key];\n if (typeof value === \"string\") {\n serialized[key] = `${(0, util_uri_escape_1.escapeUri)(key)}=${(0, util_uri_escape_1.escapeUri)(value)}`;\n }\n else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .reduce((encoded, value) => encoded.concat([`${(0, util_uri_escape_1.escapeUri)(key)}=${(0, util_uri_escape_1.escapeUri)(value)}`]), [])\n .sort()\n .join(\"&\");\n }\n }\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join(\"&\");\n};\nexports.getCanonicalQuery = getCanonicalQuery;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getPayloadHash = void 0;\nconst is_array_buffer_1 = require(\"@smithy/is-array-buffer\");\nconst util_hex_encoding_1 = require(\"@smithy/util-hex-encoding\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst constants_1 = require(\"./constants\");\nconst getPayloadHash = async ({ headers, body }, hashConstructor) => {\n for (const headerName of Object.keys(headers)) {\n if (headerName.toLowerCase() === constants_1.SHA256_HEADER) {\n return headers[headerName];\n }\n }\n if (body == undefined) {\n return \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\";\n }\n else if (typeof body === \"string\" || ArrayBuffer.isView(body) || (0, is_array_buffer_1.isArrayBuffer)(body)) {\n const hashCtor = new hashConstructor();\n hashCtor.update((0, util_utf8_1.toUint8Array)(body));\n return (0, util_hex_encoding_1.toHex)(await hashCtor.digest());\n }\n return constants_1.UNSIGNED_PAYLOAD;\n};\nexports.getPayloadHash = getPayloadHash;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.deleteHeader = exports.getHeaderValue = exports.hasHeader = void 0;\nconst hasHeader = (soughtHeader, headers) => {\n soughtHeader = soughtHeader.toLowerCase();\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true;\n }\n }\n return false;\n};\nexports.hasHeader = hasHeader;\nconst getHeaderValue = (soughtHeader, headers) => {\n soughtHeader = soughtHeader.toLowerCase();\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return headers[headerName];\n }\n }\n return undefined;\n};\nexports.getHeaderValue = getHeaderValue;\nconst deleteHeader = (soughtHeader, headers) => {\n soughtHeader = soughtHeader.toLowerCase();\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n delete headers[headerName];\n }\n }\n};\nexports.deleteHeader = deleteHeader;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.prepareRequest = exports.moveHeadersToQuery = exports.getPayloadHash = exports.getCanonicalQuery = exports.getCanonicalHeaders = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./SignatureV4\"), exports);\nvar getCanonicalHeaders_1 = require(\"./getCanonicalHeaders\");\nObject.defineProperty(exports, \"getCanonicalHeaders\", { enumerable: true, get: function () { return getCanonicalHeaders_1.getCanonicalHeaders; } });\nvar getCanonicalQuery_1 = require(\"./getCanonicalQuery\");\nObject.defineProperty(exports, \"getCanonicalQuery\", { enumerable: true, get: function () { return getCanonicalQuery_1.getCanonicalQuery; } });\nvar getPayloadHash_1 = require(\"./getPayloadHash\");\nObject.defineProperty(exports, \"getPayloadHash\", { enumerable: true, get: function () { return getPayloadHash_1.getPayloadHash; } });\nvar moveHeadersToQuery_1 = require(\"./moveHeadersToQuery\");\nObject.defineProperty(exports, \"moveHeadersToQuery\", { enumerable: true, get: function () { return moveHeadersToQuery_1.moveHeadersToQuery; } });\nvar prepareRequest_1 = require(\"./prepareRequest\");\nObject.defineProperty(exports, \"prepareRequest\", { enumerable: true, get: function () { return prepareRequest_1.prepareRequest; } });\ntslib_1.__exportStar(require(\"./credentialDerivation\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.moveHeadersToQuery = void 0;\nconst cloneRequest_1 = require(\"./cloneRequest\");\nconst moveHeadersToQuery = (request, options = {}) => {\n var _a;\n const { headers, query = {} } = typeof request.clone === \"function\" ? request.clone() : (0, cloneRequest_1.cloneRequest)(request);\n for (const name of Object.keys(headers)) {\n const lname = name.toLowerCase();\n if (lname.slice(0, 6) === \"x-amz-\" && !((_a = options.unhoistableHeaders) === null || _a === void 0 ? void 0 : _a.has(lname))) {\n query[name] = headers[name];\n delete headers[name];\n }\n }\n return {\n ...request,\n headers,\n query,\n };\n};\nexports.moveHeadersToQuery = moveHeadersToQuery;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.prepareRequest = void 0;\nconst cloneRequest_1 = require(\"./cloneRequest\");\nconst constants_1 = require(\"./constants\");\nconst prepareRequest = (request) => {\n request = typeof request.clone === \"function\" ? request.clone() : (0, cloneRequest_1.cloneRequest)(request);\n for (const headerName of Object.keys(request.headers)) {\n if (constants_1.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName];\n }\n }\n return request;\n};\nexports.prepareRequest = prepareRequest;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toDate = exports.iso8601 = void 0;\nconst iso8601 = (time) => (0, exports.toDate)(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, \"Z\");\nexports.iso8601 = iso8601;\nconst toDate = (time) => {\n if (typeof time === \"number\") {\n return new Date(time * 1000);\n }\n if (typeof time === \"string\") {\n if (Number(time)) {\n return new Date(Number(time) * 1000);\n }\n return new Date(time);\n }\n return time;\n};\nexports.toDate = toDate;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NoOpLogger = void 0;\nclass NoOpLogger {\n trace() { }\n debug() { }\n info() { }\n warn() { }\n error() { }\n}\nexports.NoOpLogger = NoOpLogger;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Client = void 0;\nconst middleware_stack_1 = require(\"@smithy/middleware-stack\");\nclass Client {\n constructor(config) {\n this.middlewareStack = (0, middleware_stack_1.constructStack)();\n this.config = config;\n }\n send(command, optionsOrCb, cb) {\n const options = typeof optionsOrCb !== \"function\" ? optionsOrCb : undefined;\n const callback = typeof optionsOrCb === \"function\" ? optionsOrCb : cb;\n const handler = command.resolveMiddleware(this.middlewareStack, this.config, options);\n if (callback) {\n handler(command)\n .then((result) => callback(null, result.output), (err) => callback(err))\n .catch(() => { });\n }\n else {\n return handler(command).then((result) => result.output);\n }\n }\n destroy() {\n if (this.config.requestHandler.destroy)\n this.config.requestHandler.destroy();\n }\n}\nexports.Client = Client;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.collectBody = void 0;\nconst util_stream_1 = require(\"@smithy/util-stream\");\nconst collectBody = async (streamBody = new Uint8Array(), context) => {\n if (streamBody instanceof Uint8Array) {\n return util_stream_1.Uint8ArrayBlobAdapter.mutate(streamBody);\n }\n if (!streamBody) {\n return util_stream_1.Uint8ArrayBlobAdapter.mutate(new Uint8Array());\n }\n const fromContext = context.streamCollector(streamBody);\n return util_stream_1.Uint8ArrayBlobAdapter.mutate(await fromContext);\n};\nexports.collectBody = collectBody;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Command = void 0;\nconst middleware_stack_1 = require(\"@smithy/middleware-stack\");\nclass Command {\n constructor() {\n this.middlewareStack = (0, middleware_stack_1.constructStack)();\n }\n}\nexports.Command = Command;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SENSITIVE_STRING = void 0;\nexports.SENSITIVE_STRING = \"***SensitiveInformation***\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createAggregatedClient = void 0;\nconst createAggregatedClient = (commands, Client) => {\n for (const command of Object.keys(commands)) {\n const CommandCtor = commands[command];\n const methodImpl = async function (args, optionsOrCb, cb) {\n const command = new CommandCtor(args);\n if (typeof optionsOrCb === \"function\") {\n this.send(command, optionsOrCb);\n }\n else if (typeof cb === \"function\") {\n if (typeof optionsOrCb !== \"object\")\n throw new Error(`Expected http options but got ${typeof optionsOrCb}`);\n this.send(command, optionsOrCb || {}, cb);\n }\n else {\n return this.send(command, optionsOrCb);\n }\n };\n const methodName = (command[0].toLowerCase() + command.slice(1)).replace(/Command$/, \"\");\n Client.prototype[methodName] = methodImpl;\n }\n};\nexports.createAggregatedClient = createAggregatedClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseEpochTimestamp = exports.parseRfc7231DateTime = exports.parseRfc3339DateTimeWithOffset = exports.parseRfc3339DateTime = exports.dateToUtcString = void 0;\nconst parse_utils_1 = require(\"./parse-utils\");\nconst DAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\nfunction dateToUtcString(date) {\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth();\n const dayOfWeek = date.getUTCDay();\n const dayOfMonthInt = date.getUTCDate();\n const hoursInt = date.getUTCHours();\n const minutesInt = date.getUTCMinutes();\n const secondsInt = date.getUTCSeconds();\n const dayOfMonthString = dayOfMonthInt < 10 ? `0${dayOfMonthInt}` : `${dayOfMonthInt}`;\n const hoursString = hoursInt < 10 ? `0${hoursInt}` : `${hoursInt}`;\n const minutesString = minutesInt < 10 ? `0${minutesInt}` : `${minutesInt}`;\n const secondsString = secondsInt < 10 ? `0${secondsInt}` : `${secondsInt}`;\n return `${DAYS[dayOfWeek]}, ${dayOfMonthString} ${MONTHS[month]} ${year} ${hoursString}:${minutesString}:${secondsString} GMT`;\n}\nexports.dateToUtcString = dateToUtcString;\nconst RFC3339 = new RegExp(/^(\\d{4})-(\\d{2})-(\\d{2})[tT](\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?[zZ]$/);\nconst parseRfc3339DateTime = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(\"RFC-3339 date-times must be expressed as strings\");\n }\n const match = RFC3339.exec(value);\n if (!match) {\n throw new TypeError(\"Invalid RFC-3339 date-time value\");\n }\n const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n const year = (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr));\n const month = parseDateValue(monthStr, \"month\", 1, 12);\n const day = parseDateValue(dayStr, \"day\", 1, 31);\n return buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds });\n};\nexports.parseRfc3339DateTime = parseRfc3339DateTime;\nconst RFC3339_WITH_OFFSET = new RegExp(/^(\\d{4})-(\\d{2})-(\\d{2})[tT](\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))?(([-+]\\d{2}\\:\\d{2})|[zZ])$/);\nconst parseRfc3339DateTimeWithOffset = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(\"RFC-3339 date-times must be expressed as strings\");\n }\n const match = RFC3339_WITH_OFFSET.exec(value);\n if (!match) {\n throw new TypeError(\"Invalid RFC-3339 date-time value\");\n }\n const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, offsetStr] = match;\n const year = (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr));\n const month = parseDateValue(monthStr, \"month\", 1, 12);\n const day = parseDateValue(dayStr, \"day\", 1, 31);\n const date = buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds });\n if (offsetStr.toUpperCase() != \"Z\") {\n date.setTime(date.getTime() - parseOffsetToMilliseconds(offsetStr));\n }\n return date;\n};\nexports.parseRfc3339DateTimeWithOffset = parseRfc3339DateTimeWithOffset;\nconst IMF_FIXDATE = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? GMT$/);\nconst RFC_850_DATE = new RegExp(/^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d{2}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? GMT$/);\nconst ASC_TIME = new RegExp(/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( [1-9]|\\d{2}) (\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d+))? (\\d{4})$/);\nconst parseRfc7231DateTime = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(\"RFC-7231 date-times must be expressed as strings\");\n }\n let match = IMF_FIXDATE.exec(value);\n if (match) {\n const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n return buildDate((0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr, \"day\", 1, 31), { hours, minutes, seconds, fractionalMilliseconds });\n }\n match = RFC_850_DATE.exec(value);\n if (match) {\n const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match;\n return adjustRfc850Year(buildDate(parseTwoDigitYear(yearStr), parseMonthByShortName(monthStr), parseDateValue(dayStr, \"day\", 1, 31), {\n hours,\n minutes,\n seconds,\n fractionalMilliseconds,\n }));\n }\n match = ASC_TIME.exec(value);\n if (match) {\n const [_, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, yearStr] = match;\n return buildDate((0, parse_utils_1.strictParseShort)(stripLeadingZeroes(yearStr)), parseMonthByShortName(monthStr), parseDateValue(dayStr.trimLeft(), \"day\", 1, 31), { hours, minutes, seconds, fractionalMilliseconds });\n }\n throw new TypeError(\"Invalid RFC-7231 date-time value\");\n};\nexports.parseRfc7231DateTime = parseRfc7231DateTime;\nconst parseEpochTimestamp = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n let valueAsDouble;\n if (typeof value === \"number\") {\n valueAsDouble = value;\n }\n else if (typeof value === \"string\") {\n valueAsDouble = (0, parse_utils_1.strictParseDouble)(value);\n }\n else {\n throw new TypeError(\"Epoch timestamps must be expressed as floating point numbers or their string representation\");\n }\n if (Number.isNaN(valueAsDouble) || valueAsDouble === Infinity || valueAsDouble === -Infinity) {\n throw new TypeError(\"Epoch timestamps must be valid, non-Infinite, non-NaN numerics\");\n }\n return new Date(Math.round(valueAsDouble * 1000));\n};\nexports.parseEpochTimestamp = parseEpochTimestamp;\nconst buildDate = (year, month, day, time) => {\n const adjustedMonth = month - 1;\n validateDayOfMonth(year, adjustedMonth, day);\n return new Date(Date.UTC(year, adjustedMonth, day, parseDateValue(time.hours, \"hour\", 0, 23), parseDateValue(time.minutes, \"minute\", 0, 59), parseDateValue(time.seconds, \"seconds\", 0, 60), parseMilliseconds(time.fractionalMilliseconds)));\n};\nconst parseTwoDigitYear = (value) => {\n const thisYear = new Date().getUTCFullYear();\n const valueInThisCentury = Math.floor(thisYear / 100) * 100 + (0, parse_utils_1.strictParseShort)(stripLeadingZeroes(value));\n if (valueInThisCentury < thisYear) {\n return valueInThisCentury + 100;\n }\n return valueInThisCentury;\n};\nconst FIFTY_YEARS_IN_MILLIS = 50 * 365 * 24 * 60 * 60 * 1000;\nconst adjustRfc850Year = (input) => {\n if (input.getTime() - new Date().getTime() > FIFTY_YEARS_IN_MILLIS) {\n return new Date(Date.UTC(input.getUTCFullYear() - 100, input.getUTCMonth(), input.getUTCDate(), input.getUTCHours(), input.getUTCMinutes(), input.getUTCSeconds(), input.getUTCMilliseconds()));\n }\n return input;\n};\nconst parseMonthByShortName = (value) => {\n const monthIdx = MONTHS.indexOf(value);\n if (monthIdx < 0) {\n throw new TypeError(`Invalid month: ${value}`);\n }\n return monthIdx + 1;\n};\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst validateDayOfMonth = (year, month, day) => {\n let maxDays = DAYS_IN_MONTH[month];\n if (month === 1 && isLeapYear(year)) {\n maxDays = 29;\n }\n if (day > maxDays) {\n throw new TypeError(`Invalid day for ${MONTHS[month]} in ${year}: ${day}`);\n }\n};\nconst isLeapYear = (year) => {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n};\nconst parseDateValue = (value, type, lower, upper) => {\n const dateVal = (0, parse_utils_1.strictParseByte)(stripLeadingZeroes(value));\n if (dateVal < lower || dateVal > upper) {\n throw new TypeError(`${type} must be between ${lower} and ${upper}, inclusive`);\n }\n return dateVal;\n};\nconst parseMilliseconds = (value) => {\n if (value === null || value === undefined) {\n return 0;\n }\n return (0, parse_utils_1.strictParseFloat32)(\"0.\" + value) * 1000;\n};\nconst parseOffsetToMilliseconds = (value) => {\n const directionStr = value[0];\n let direction = 1;\n if (directionStr == \"+\") {\n direction = 1;\n }\n else if (directionStr == \"-\") {\n direction = -1;\n }\n else {\n throw new TypeError(`Offset direction, ${directionStr}, must be \"+\" or \"-\"`);\n }\n const hour = Number(value.substring(1, 3));\n const minute = Number(value.substring(4, 6));\n return direction * (hour * 60 + minute) * 60 * 1000;\n};\nconst stripLeadingZeroes = (value) => {\n let idx = 0;\n while (idx < value.length - 1 && value.charAt(idx) === \"0\") {\n idx++;\n }\n if (idx === 0) {\n return value;\n }\n return value.slice(idx);\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.withBaseException = exports.throwDefaultError = void 0;\nconst exceptions_1 = require(\"./exceptions\");\nconst throwDefaultError = ({ output, parsedBody, exceptionCtor, errorCode }) => {\n const $metadata = deserializeMetadata(output);\n const statusCode = $metadata.httpStatusCode ? $metadata.httpStatusCode + \"\" : undefined;\n const response = new exceptionCtor({\n name: (parsedBody === null || parsedBody === void 0 ? void 0 : parsedBody.code) || (parsedBody === null || parsedBody === void 0 ? void 0 : parsedBody.Code) || errorCode || statusCode || \"UnknownError\",\n $fault: \"client\",\n $metadata,\n });\n throw (0, exceptions_1.decorateServiceException)(response, parsedBody);\n};\nexports.throwDefaultError = throwDefaultError;\nconst withBaseException = (ExceptionCtor) => {\n return ({ output, parsedBody, errorCode }) => {\n (0, exports.throwDefaultError)({ output, parsedBody, exceptionCtor: ExceptionCtor, errorCode });\n };\n};\nexports.withBaseException = withBaseException;\nconst deserializeMetadata = (output) => {\n var _a, _b;\n return ({\n httpStatusCode: output.statusCode,\n requestId: (_b = (_a = output.headers[\"x-amzn-requestid\"]) !== null && _a !== void 0 ? _a : output.headers[\"x-amzn-request-id\"]) !== null && _b !== void 0 ? _b : output.headers[\"x-amz-request-id\"],\n extendedRequestId: output.headers[\"x-amz-id-2\"],\n cfId: output.headers[\"x-amz-cf-id\"],\n });\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadConfigsForDefaultMode = void 0;\nconst loadConfigsForDefaultMode = (mode) => {\n switch (mode) {\n case \"standard\":\n return {\n retryMode: \"standard\",\n connectionTimeout: 3100,\n };\n case \"in-region\":\n return {\n retryMode: \"standard\",\n connectionTimeout: 1100,\n };\n case \"cross-region\":\n return {\n retryMode: \"standard\",\n connectionTimeout: 3100,\n };\n case \"mobile\":\n return {\n retryMode: \"standard\",\n connectionTimeout: 30000,\n };\n default:\n return {};\n }\n};\nexports.loadConfigsForDefaultMode = loadConfigsForDefaultMode;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.emitWarningIfUnsupportedVersion = void 0;\nlet warningEmitted = false;\nconst emitWarningIfUnsupportedVersion = (version) => {\n if (version && !warningEmitted && parseInt(version.substring(1, version.indexOf(\".\"))) < 14) {\n warningEmitted = true;\n }\n};\nexports.emitWarningIfUnsupportedVersion = emitWarningIfUnsupportedVersion;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.decorateServiceException = exports.ServiceException = void 0;\nclass ServiceException extends Error {\n constructor(options) {\n super(options.message);\n Object.setPrototypeOf(this, ServiceException.prototype);\n this.name = options.name;\n this.$fault = options.$fault;\n this.$metadata = options.$metadata;\n }\n}\nexports.ServiceException = ServiceException;\nconst decorateServiceException = (exception, additions = {}) => {\n Object.entries(additions)\n .filter(([, v]) => v !== undefined)\n .forEach(([k, v]) => {\n if (exception[k] == undefined || exception[k] === \"\") {\n exception[k] = v;\n }\n });\n const message = exception.message || exception.Message || \"UnknownError\";\n exception.message = message;\n delete exception.Message;\n return exception;\n};\nexports.decorateServiceException = decorateServiceException;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.extendedEncodeURIComponent = void 0;\nfunction extendedEncodeURIComponent(str) {\n return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {\n return \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\nexports.extendedEncodeURIComponent = extendedEncodeURIComponent;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveChecksumRuntimeConfig = exports.getChecksumConfiguration = exports.AlgorithmId = void 0;\nconst types_1 = require(\"@smithy/types\");\nObject.defineProperty(exports, \"AlgorithmId\", { enumerable: true, get: function () { return types_1.AlgorithmId; } });\nconst getChecksumConfiguration = (runtimeConfig) => {\n const checksumAlgorithms = [];\n for (const id in types_1.AlgorithmId) {\n const algorithmId = types_1.AlgorithmId[id];\n if (runtimeConfig[algorithmId] === undefined) {\n continue;\n }\n checksumAlgorithms.push({\n algorithmId: () => algorithmId,\n checksumConstructor: () => runtimeConfig[algorithmId],\n });\n }\n return {\n _checksumAlgorithms: checksumAlgorithms,\n addChecksumAlgorithm(algo) {\n this._checksumAlgorithms.push(algo);\n },\n checksumAlgorithms() {\n return this._checksumAlgorithms;\n },\n };\n};\nexports.getChecksumConfiguration = getChecksumConfiguration;\nconst resolveChecksumRuntimeConfig = (clientConfig) => {\n const runtimeConfig = {};\n clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor();\n });\n return runtimeConfig;\n};\nexports.resolveChecksumRuntimeConfig = resolveChecksumRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveDefaultRuntimeConfig = exports.getDefaultClientConfiguration = exports.getDefaultExtensionConfiguration = void 0;\nconst checksum_1 = require(\"./checksum\");\nconst retry_1 = require(\"./retry\");\nconst getDefaultExtensionConfiguration = (runtimeConfig) => {\n return {\n ...(0, checksum_1.getChecksumConfiguration)(runtimeConfig),\n ...(0, retry_1.getRetryConfiguration)(runtimeConfig),\n };\n};\nexports.getDefaultExtensionConfiguration = getDefaultExtensionConfiguration;\nexports.getDefaultClientConfiguration = exports.getDefaultExtensionConfiguration;\nconst resolveDefaultRuntimeConfig = (config) => {\n return {\n ...(0, checksum_1.resolveChecksumRuntimeConfig)(config),\n ...(0, retry_1.resolveRetryRuntimeConfig)(config),\n };\n};\nexports.resolveDefaultRuntimeConfig = resolveDefaultRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./defaultExtensionConfiguration\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveRetryRuntimeConfig = exports.getRetryConfiguration = void 0;\nconst getRetryConfiguration = (runtimeConfig) => {\n let _retryStrategy = runtimeConfig.retryStrategy;\n return {\n setRetryStrategy(retryStrategy) {\n _retryStrategy = retryStrategy;\n },\n retryStrategy() {\n return _retryStrategy;\n },\n };\n};\nexports.getRetryConfiguration = getRetryConfiguration;\nconst resolveRetryRuntimeConfig = (retryStrategyConfiguration) => {\n const runtimeConfig = {};\n runtimeConfig.retryStrategy = retryStrategyConfiguration.retryStrategy();\n return runtimeConfig;\n};\nexports.resolveRetryRuntimeConfig = resolveRetryRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getArrayIfSingleItem = void 0;\nconst getArrayIfSingleItem = (mayBeArray) => Array.isArray(mayBeArray) ? mayBeArray : [mayBeArray];\nexports.getArrayIfSingleItem = getArrayIfSingleItem;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getValueFromTextNode = void 0;\nconst getValueFromTextNode = (obj) => {\n const textNodeName = \"#text\";\n for (const key in obj) {\n if (obj.hasOwnProperty(key) && obj[key][textNodeName] !== undefined) {\n obj[key] = obj[key][textNodeName];\n }\n else if (typeof obj[key] === \"object\" && obj[key] !== null) {\n obj[key] = (0, exports.getValueFromTextNode)(obj[key]);\n }\n }\n return obj;\n};\nexports.getValueFromTextNode = getValueFromTextNode;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./NoOpLogger\"), exports);\ntslib_1.__exportStar(require(\"./client\"), exports);\ntslib_1.__exportStar(require(\"./collect-stream-body\"), exports);\ntslib_1.__exportStar(require(\"./command\"), exports);\ntslib_1.__exportStar(require(\"./constants\"), exports);\ntslib_1.__exportStar(require(\"./create-aggregated-client\"), exports);\ntslib_1.__exportStar(require(\"./date-utils\"), exports);\ntslib_1.__exportStar(require(\"./default-error-handler\"), exports);\ntslib_1.__exportStar(require(\"./defaults-mode\"), exports);\ntslib_1.__exportStar(require(\"./emitWarningIfUnsupportedVersion\"), exports);\ntslib_1.__exportStar(require(\"./extensions\"), exports);\ntslib_1.__exportStar(require(\"./exceptions\"), exports);\ntslib_1.__exportStar(require(\"./extended-encode-uri-component\"), exports);\ntslib_1.__exportStar(require(\"./get-array-if-single-item\"), exports);\ntslib_1.__exportStar(require(\"./get-value-from-text-node\"), exports);\ntslib_1.__exportStar(require(\"./lazy-json\"), exports);\ntslib_1.__exportStar(require(\"./object-mapping\"), exports);\ntslib_1.__exportStar(require(\"./parse-utils\"), exports);\ntslib_1.__exportStar(require(\"./resolve-path\"), exports);\ntslib_1.__exportStar(require(\"./ser-utils\"), exports);\ntslib_1.__exportStar(require(\"./serde-json\"), exports);\ntslib_1.__exportStar(require(\"./split-every\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LazyJsonString = exports.StringWrapper = void 0;\nconst StringWrapper = function () {\n const Class = Object.getPrototypeOf(this).constructor;\n const Constructor = Function.bind.apply(String, [null, ...arguments]);\n const instance = new Constructor();\n Object.setPrototypeOf(instance, Class.prototype);\n return instance;\n};\nexports.StringWrapper = StringWrapper;\nexports.StringWrapper.prototype = Object.create(String.prototype, {\n constructor: {\n value: exports.StringWrapper,\n enumerable: false,\n writable: true,\n configurable: true,\n },\n});\nObject.setPrototypeOf(exports.StringWrapper, String);\nclass LazyJsonString extends exports.StringWrapper {\n deserializeJSON() {\n return JSON.parse(super.toString());\n }\n toJSON() {\n return super.toString();\n }\n static fromObject(object) {\n if (object instanceof LazyJsonString) {\n return object;\n }\n else if (object instanceof String || typeof object === \"string\") {\n return new LazyJsonString(object);\n }\n return new LazyJsonString(JSON.stringify(object));\n }\n}\nexports.LazyJsonString = LazyJsonString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.take = exports.convertMap = exports.map = void 0;\nfunction map(arg0, arg1, arg2) {\n let target;\n let filter;\n let instructions;\n if (typeof arg1 === \"undefined\" && typeof arg2 === \"undefined\") {\n target = {};\n instructions = arg0;\n }\n else {\n target = arg0;\n if (typeof arg1 === \"function\") {\n filter = arg1;\n instructions = arg2;\n return mapWithFilter(target, filter, instructions);\n }\n else {\n instructions = arg1;\n }\n }\n for (const key of Object.keys(instructions)) {\n if (!Array.isArray(instructions[key])) {\n target[key] = instructions[key];\n continue;\n }\n applyInstruction(target, null, instructions, key);\n }\n return target;\n}\nexports.map = map;\nconst convertMap = (target) => {\n const output = {};\n for (const [k, v] of Object.entries(target || {})) {\n output[k] = [, v];\n }\n return output;\n};\nexports.convertMap = convertMap;\nconst take = (source, instructions) => {\n const out = {};\n for (const key in instructions) {\n applyInstruction(out, source, instructions, key);\n }\n return out;\n};\nexports.take = take;\nconst mapWithFilter = (target, filter, instructions) => {\n return map(target, Object.entries(instructions).reduce((_instructions, [key, value]) => {\n if (Array.isArray(value)) {\n _instructions[key] = value;\n }\n else {\n if (typeof value === \"function\") {\n _instructions[key] = [filter, value()];\n }\n else {\n _instructions[key] = [filter, value];\n }\n }\n return _instructions;\n }, {}));\n};\nconst applyInstruction = (target, source, instructions, targetKey) => {\n if (source !== null) {\n let instruction = instructions[targetKey];\n if (typeof instruction === \"function\") {\n instruction = [, instruction];\n }\n const [filter = nonNullish, valueFn = pass, sourceKey = targetKey] = instruction;\n if ((typeof filter === \"function\" && filter(source[sourceKey])) || (typeof filter !== \"function\" && !!filter)) {\n target[targetKey] = valueFn(source[sourceKey]);\n }\n return;\n }\n let [filter, value] = instructions[targetKey];\n if (typeof value === \"function\") {\n let _value;\n const defaultFilterPassed = filter === undefined && (_value = value()) != null;\n const customFilterPassed = (typeof filter === \"function\" && !!filter(void 0)) || (typeof filter !== \"function\" && !!filter);\n if (defaultFilterPassed) {\n target[targetKey] = _value;\n }\n else if (customFilterPassed) {\n target[targetKey] = value();\n }\n }\n else {\n const defaultFilterPassed = filter === undefined && value != null;\n const customFilterPassed = (typeof filter === \"function\" && !!filter(value)) || (typeof filter !== \"function\" && !!filter);\n if (defaultFilterPassed || customFilterPassed) {\n target[targetKey] = value;\n }\n }\n};\nconst nonNullish = (_) => _ != null;\nconst pass = (_) => _;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.logger = exports.strictParseByte = exports.strictParseShort = exports.strictParseInt32 = exports.strictParseInt = exports.strictParseLong = exports.limitedParseFloat32 = exports.limitedParseFloat = exports.handleFloat = exports.limitedParseDouble = exports.strictParseFloat32 = exports.strictParseFloat = exports.strictParseDouble = exports.expectUnion = exports.expectString = exports.expectObject = exports.expectNonNull = exports.expectByte = exports.expectShort = exports.expectInt32 = exports.expectInt = exports.expectLong = exports.expectFloat32 = exports.expectNumber = exports.expectBoolean = exports.parseBoolean = void 0;\nconst parseBoolean = (value) => {\n switch (value) {\n case \"true\":\n return true;\n case \"false\":\n return false;\n default:\n throw new Error(`Unable to parse boolean value \"${value}\"`);\n }\n};\nexports.parseBoolean = parseBoolean;\nconst expectBoolean = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === \"number\") {\n if (value === 0 || value === 1) {\n exports.logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`));\n }\n if (value === 0) {\n return false;\n }\n if (value === 1) {\n return true;\n }\n }\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (lower === \"false\" || lower === \"true\") {\n exports.logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`));\n }\n if (lower === \"false\") {\n return false;\n }\n if (lower === \"true\") {\n return true;\n }\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n throw new TypeError(`Expected boolean, got ${typeof value}: ${value}`);\n};\nexports.expectBoolean = expectBoolean;\nconst expectNumber = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n const parsed = parseFloat(value);\n if (!Number.isNaN(parsed)) {\n if (String(parsed) !== String(value)) {\n exports.logger.warn(stackTraceWarning(`Expected number but observed string: ${value}`));\n }\n return parsed;\n }\n }\n if (typeof value === \"number\") {\n return value;\n }\n throw new TypeError(`Expected number, got ${typeof value}: ${value}`);\n};\nexports.expectNumber = expectNumber;\nconst MAX_FLOAT = Math.ceil(2 ** 127 * (2 - 2 ** -23));\nconst expectFloat32 = (value) => {\n const expected = (0, exports.expectNumber)(value);\n if (expected !== undefined && !Number.isNaN(expected) && expected !== Infinity && expected !== -Infinity) {\n if (Math.abs(expected) > MAX_FLOAT) {\n throw new TypeError(`Expected 32-bit float, got ${value}`);\n }\n }\n return expected;\n};\nexports.expectFloat32 = expectFloat32;\nconst expectLong = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (Number.isInteger(value) && !Number.isNaN(value)) {\n return value;\n }\n throw new TypeError(`Expected integer, got ${typeof value}: ${value}`);\n};\nexports.expectLong = expectLong;\nexports.expectInt = exports.expectLong;\nconst expectInt32 = (value) => expectSizedInt(value, 32);\nexports.expectInt32 = expectInt32;\nconst expectShort = (value) => expectSizedInt(value, 16);\nexports.expectShort = expectShort;\nconst expectByte = (value) => expectSizedInt(value, 8);\nexports.expectByte = expectByte;\nconst expectSizedInt = (value, size) => {\n const expected = (0, exports.expectLong)(value);\n if (expected !== undefined && castInt(expected, size) !== expected) {\n throw new TypeError(`Expected ${size}-bit integer, got ${value}`);\n }\n return expected;\n};\nconst castInt = (value, size) => {\n switch (size) {\n case 32:\n return Int32Array.of(value)[0];\n case 16:\n return Int16Array.of(value)[0];\n case 8:\n return Int8Array.of(value)[0];\n }\n};\nconst expectNonNull = (value, location) => {\n if (value === null || value === undefined) {\n if (location) {\n throw new TypeError(`Expected a non-null value for ${location}`);\n }\n throw new TypeError(\"Expected a non-null value\");\n }\n return value;\n};\nexports.expectNonNull = expectNonNull;\nconst expectObject = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === \"object\" && !Array.isArray(value)) {\n return value;\n }\n const receivedType = Array.isArray(value) ? \"array\" : typeof value;\n throw new TypeError(`Expected object, got ${receivedType}: ${value}`);\n};\nexports.expectObject = expectObject;\nconst expectString = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if ([\"boolean\", \"number\", \"bigint\"].includes(typeof value)) {\n exports.logger.warn(stackTraceWarning(`Expected string, got ${typeof value}: ${value}`));\n return String(value);\n }\n throw new TypeError(`Expected string, got ${typeof value}: ${value}`);\n};\nexports.expectString = expectString;\nconst expectUnion = (value) => {\n if (value === null || value === undefined) {\n return undefined;\n }\n const asObject = (0, exports.expectObject)(value);\n const setKeys = Object.entries(asObject)\n .filter(([, v]) => v != null)\n .map(([k]) => k);\n if (setKeys.length === 0) {\n throw new TypeError(`Unions must have exactly one non-null member. None were found.`);\n }\n if (setKeys.length > 1) {\n throw new TypeError(`Unions must have exactly one non-null member. Keys ${setKeys} were not null.`);\n }\n return asObject;\n};\nexports.expectUnion = expectUnion;\nconst strictParseDouble = (value) => {\n if (typeof value == \"string\") {\n return (0, exports.expectNumber)(parseNumber(value));\n }\n return (0, exports.expectNumber)(value);\n};\nexports.strictParseDouble = strictParseDouble;\nexports.strictParseFloat = exports.strictParseDouble;\nconst strictParseFloat32 = (value) => {\n if (typeof value == \"string\") {\n return (0, exports.expectFloat32)(parseNumber(value));\n }\n return (0, exports.expectFloat32)(value);\n};\nexports.strictParseFloat32 = strictParseFloat32;\nconst NUMBER_REGEX = /(-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|(-?Infinity)|(NaN)/g;\nconst parseNumber = (value) => {\n const matches = value.match(NUMBER_REGEX);\n if (matches === null || matches[0].length !== value.length) {\n throw new TypeError(`Expected real number, got implicit NaN`);\n }\n return parseFloat(value);\n};\nconst limitedParseDouble = (value) => {\n if (typeof value == \"string\") {\n return parseFloatString(value);\n }\n return (0, exports.expectNumber)(value);\n};\nexports.limitedParseDouble = limitedParseDouble;\nexports.handleFloat = exports.limitedParseDouble;\nexports.limitedParseFloat = exports.limitedParseDouble;\nconst limitedParseFloat32 = (value) => {\n if (typeof value == \"string\") {\n return parseFloatString(value);\n }\n return (0, exports.expectFloat32)(value);\n};\nexports.limitedParseFloat32 = limitedParseFloat32;\nconst parseFloatString = (value) => {\n switch (value) {\n case \"NaN\":\n return NaN;\n case \"Infinity\":\n return Infinity;\n case \"-Infinity\":\n return -Infinity;\n default:\n throw new Error(`Unable to parse float value: ${value}`);\n }\n};\nconst strictParseLong = (value) => {\n if (typeof value === \"string\") {\n return (0, exports.expectLong)(parseNumber(value));\n }\n return (0, exports.expectLong)(value);\n};\nexports.strictParseLong = strictParseLong;\nexports.strictParseInt = exports.strictParseLong;\nconst strictParseInt32 = (value) => {\n if (typeof value === \"string\") {\n return (0, exports.expectInt32)(parseNumber(value));\n }\n return (0, exports.expectInt32)(value);\n};\nexports.strictParseInt32 = strictParseInt32;\nconst strictParseShort = (value) => {\n if (typeof value === \"string\") {\n return (0, exports.expectShort)(parseNumber(value));\n }\n return (0, exports.expectShort)(value);\n};\nexports.strictParseShort = strictParseShort;\nconst strictParseByte = (value) => {\n if (typeof value === \"string\") {\n return (0, exports.expectByte)(parseNumber(value));\n }\n return (0, exports.expectByte)(value);\n};\nexports.strictParseByte = strictParseByte;\nconst stackTraceWarning = (message) => {\n return String(new TypeError(message).stack || message)\n .split(\"\\n\")\n .slice(0, 5)\n .filter((s) => !s.includes(\"stackTraceWarning\"))\n .join(\"\\n\");\n};\nexports.logger = {\n warn: console.warn,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolvedPath = void 0;\nconst extended_encode_uri_component_1 = require(\"./extended-encode-uri-component\");\nconst resolvedPath = (resolvedPath, input, memberName, labelValueProvider, uriLabel, isGreedyLabel) => {\n if (input != null && input[memberName] !== undefined) {\n const labelValue = labelValueProvider();\n if (labelValue.length <= 0) {\n throw new Error(\"Empty value provided for input HTTP label: \" + memberName + \".\");\n }\n resolvedPath = resolvedPath.replace(uriLabel, isGreedyLabel\n ? labelValue\n .split(\"/\")\n .map((segment) => (0, extended_encode_uri_component_1.extendedEncodeURIComponent)(segment))\n .join(\"/\")\n : (0, extended_encode_uri_component_1.extendedEncodeURIComponent)(labelValue));\n }\n else {\n throw new Error(\"No value provided for input HTTP label: \" + memberName + \".\");\n }\n return resolvedPath;\n};\nexports.resolvedPath = resolvedPath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serializeFloat = void 0;\nconst serializeFloat = (value) => {\n if (value !== value) {\n return \"NaN\";\n }\n switch (value) {\n case Infinity:\n return \"Infinity\";\n case -Infinity:\n return \"-Infinity\";\n default:\n return value;\n }\n};\nexports.serializeFloat = serializeFloat;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports._json = void 0;\nconst _json = (obj) => {\n if (obj == null) {\n return {};\n }\n if (Array.isArray(obj)) {\n return obj.filter((_) => _ != null);\n }\n if (typeof obj === \"object\") {\n const target = {};\n for (const key of Object.keys(obj)) {\n if (obj[key] == null) {\n continue;\n }\n target[key] = (0, exports._json)(obj[key]);\n }\n return target;\n }\n return obj;\n};\nexports._json = _json;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.splitEvery = void 0;\nfunction splitEvery(value, delimiter, numDelimiters) {\n if (numDelimiters <= 0 || !Number.isInteger(numDelimiters)) {\n throw new Error(\"Invalid number of delimiters (\" + numDelimiters + \") for splitEvery.\");\n }\n const segments = value.split(delimiter);\n if (numDelimiters === 1) {\n return segments;\n }\n const compoundSegments = [];\n let currentSegment = \"\";\n for (let i = 0; i < segments.length; i++) {\n if (currentSegment === \"\") {\n currentSegment = segments[i];\n }\n else {\n currentSegment += delimiter + segments[i];\n }\n if ((i + 1) % numDelimiters === 0) {\n compoundSegments.push(currentSegment);\n currentSegment = \"\";\n }\n }\n if (currentSegment !== \"\") {\n compoundSegments.push(currentSegment);\n }\n return compoundSegments;\n}\nexports.splitEvery = splitEvery;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpApiKeyAuthLocation = void 0;\nvar HttpApiKeyAuthLocation;\n(function (HttpApiKeyAuthLocation) {\n HttpApiKeyAuthLocation[\"HEADER\"] = \"header\";\n HttpApiKeyAuthLocation[\"QUERY\"] = \"query\";\n})(HttpApiKeyAuthLocation = exports.HttpApiKeyAuthLocation || (exports.HttpApiKeyAuthLocation = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpAuthLocation = void 0;\nvar HttpAuthLocation;\n(function (HttpAuthLocation) {\n HttpAuthLocation[\"HEADER\"] = \"header\";\n HttpAuthLocation[\"QUERY\"] = \"query\";\n})(HttpAuthLocation = exports.HttpAuthLocation || (exports.HttpAuthLocation = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./auth\"), exports);\ntslib_1.__exportStar(require(\"./HttpApiKeyAuth\"), exports);\ntslib_1.__exportStar(require(\"./HttpAuthScheme\"), exports);\ntslib_1.__exportStar(require(\"./HttpAuthSchemeProvider\"), exports);\ntslib_1.__exportStar(require(\"./HttpSigner\"), exports);\ntslib_1.__exportStar(require(\"./IdentityProviderConfig\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./config\"), exports);\ntslib_1.__exportStar(require(\"./manager\"), exports);\ntslib_1.__exportStar(require(\"./pool\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EndpointURLScheme = void 0;\nvar EndpointURLScheme;\n(function (EndpointURLScheme) {\n EndpointURLScheme[\"HTTP\"] = \"http\";\n EndpointURLScheme[\"HTTPS\"] = \"https\";\n})(EndpointURLScheme = exports.EndpointURLScheme || (exports.EndpointURLScheme = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./EndpointRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./ErrorRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./RuleSetObject\"), exports);\ntslib_1.__exportStar(require(\"./shared\"), exports);\ntslib_1.__exportStar(require(\"./TreeRuleObject\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveChecksumRuntimeConfig = exports.getChecksumConfiguration = exports.AlgorithmId = void 0;\nvar AlgorithmId;\n(function (AlgorithmId) {\n AlgorithmId[\"MD5\"] = \"md5\";\n AlgorithmId[\"CRC32\"] = \"crc32\";\n AlgorithmId[\"CRC32C\"] = \"crc32c\";\n AlgorithmId[\"SHA1\"] = \"sha1\";\n AlgorithmId[\"SHA256\"] = \"sha256\";\n})(AlgorithmId = exports.AlgorithmId || (exports.AlgorithmId = {}));\nconst getChecksumConfiguration = (runtimeConfig) => {\n const checksumAlgorithms = [];\n if (runtimeConfig.sha256 !== undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.SHA256,\n checksumConstructor: () => runtimeConfig.sha256,\n });\n }\n if (runtimeConfig.md5 != undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.MD5,\n checksumConstructor: () => runtimeConfig.md5,\n });\n }\n return {\n _checksumAlgorithms: checksumAlgorithms,\n addChecksumAlgorithm(algo) {\n this._checksumAlgorithms.push(algo);\n },\n checksumAlgorithms() {\n return this._checksumAlgorithms;\n },\n };\n};\nexports.getChecksumConfiguration = getChecksumConfiguration;\nconst resolveChecksumRuntimeConfig = (clientConfig) => {\n const runtimeConfig = {};\n clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor();\n });\n return runtimeConfig;\n};\nexports.resolveChecksumRuntimeConfig = resolveChecksumRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveDefaultRuntimeConfig = exports.getDefaultClientConfiguration = void 0;\nconst checksum_1 = require(\"./checksum\");\nconst getDefaultClientConfiguration = (runtimeConfig) => {\n return {\n ...(0, checksum_1.getChecksumConfiguration)(runtimeConfig),\n };\n};\nexports.getDefaultClientConfiguration = getDefaultClientConfiguration;\nconst resolveDefaultRuntimeConfig = (config) => {\n return {\n ...(0, checksum_1.resolveChecksumRuntimeConfig)(config),\n };\n};\nexports.resolveDefaultRuntimeConfig = resolveDefaultRuntimeConfig;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AlgorithmId = void 0;\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./defaultClientConfiguration\"), exports);\ntslib_1.__exportStar(require(\"./defaultExtensionConfiguration\"), exports);\nvar checksum_1 = require(\"./checksum\");\nObject.defineProperty(exports, \"AlgorithmId\", { enumerable: true, get: function () { return checksum_1.AlgorithmId; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FieldPosition = void 0;\nvar FieldPosition;\n(function (FieldPosition) {\n FieldPosition[FieldPosition[\"HEADER\"] = 0] = \"HEADER\";\n FieldPosition[FieldPosition[\"TRAILER\"] = 1] = \"TRAILER\";\n})(FieldPosition = exports.FieldPosition || (exports.FieldPosition = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./apiKeyIdentity\"), exports);\ntslib_1.__exportStar(require(\"./awsCredentialIdentity\"), exports);\ntslib_1.__exportStar(require(\"./identity\"), exports);\ntslib_1.__exportStar(require(\"./tokenIdentity\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./abort\"), exports);\ntslib_1.__exportStar(require(\"./auth\"), exports);\ntslib_1.__exportStar(require(\"./blob/blob-payload-input-types\"), exports);\ntslib_1.__exportStar(require(\"./checksum\"), exports);\ntslib_1.__exportStar(require(\"./client\"), exports);\ntslib_1.__exportStar(require(\"./command\"), exports);\ntslib_1.__exportStar(require(\"./connection\"), exports);\ntslib_1.__exportStar(require(\"./crypto\"), exports);\ntslib_1.__exportStar(require(\"./encode\"), exports);\ntslib_1.__exportStar(require(\"./endpoint\"), exports);\ntslib_1.__exportStar(require(\"./endpoints\"), exports);\ntslib_1.__exportStar(require(\"./eventStream\"), exports);\ntslib_1.__exportStar(require(\"./extensions\"), exports);\ntslib_1.__exportStar(require(\"./http\"), exports);\ntslib_1.__exportStar(require(\"./identity\"), exports);\ntslib_1.__exportStar(require(\"./logger\"), exports);\ntslib_1.__exportStar(require(\"./middleware\"), exports);\ntslib_1.__exportStar(require(\"./pagination\"), exports);\ntslib_1.__exportStar(require(\"./profile\"), exports);\ntslib_1.__exportStar(require(\"./response\"), exports);\ntslib_1.__exportStar(require(\"./retry\"), exports);\ntslib_1.__exportStar(require(\"./serde\"), exports);\ntslib_1.__exportStar(require(\"./shapes\"), exports);\ntslib_1.__exportStar(require(\"./signature\"), exports);\ntslib_1.__exportStar(require(\"./stream\"), exports);\ntslib_1.__exportStar(require(\"./streaming-payload/streaming-blob-common-types\"), exports);\ntslib_1.__exportStar(require(\"./streaming-payload/streaming-blob-payload-input-types\"), exports);\ntslib_1.__exportStar(require(\"./streaming-payload/streaming-blob-payload-output-types\"), exports);\ntslib_1.__exportStar(require(\"./transfer\"), exports);\ntslib_1.__exportStar(require(\"./transform/client-payload-blob-type-narrow\"), exports);\ntslib_1.__exportStar(require(\"./transform/type-transform\"), exports);\ntslib_1.__exportStar(require(\"./uri\"), exports);\ntslib_1.__exportStar(require(\"./util\"), exports);\ntslib_1.__exportStar(require(\"./waiter\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SMITHY_CONTEXT_KEY = void 0;\nexports.SMITHY_CONTEXT_KEY = \"__smithy_context\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IniSectionType = void 0;\nvar IniSectionType;\n(function (IniSectionType) {\n IniSectionType[\"PROFILE\"] = \"profile\";\n IniSectionType[\"SSO_SESSION\"] = \"sso-session\";\n IniSectionType[\"SERVICES\"] = \"services\";\n})(IniSectionType = exports.IniSectionType || (exports.IniSectionType = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RequestHandlerProtocol = void 0;\nvar RequestHandlerProtocol;\n(function (RequestHandlerProtocol) {\n RequestHandlerProtocol[\"HTTP_0_9\"] = \"http/0.9\";\n RequestHandlerProtocol[\"HTTP_1_0\"] = \"http/1.0\";\n RequestHandlerProtocol[\"TDS_8_0\"] = \"tds/8.0\";\n})(RequestHandlerProtocol = exports.RequestHandlerProtocol || (exports.RequestHandlerProtocol = {}));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseUrl = void 0;\nconst querystring_parser_1 = require(\"@smithy/querystring-parser\");\nconst parseUrl = (url) => {\n if (typeof url === \"string\") {\n return (0, exports.parseUrl)(new URL(url));\n }\n const { hostname, pathname, port, protocol, search } = url;\n let query;\n if (search) {\n query = (0, querystring_parser_1.parseQueryString)(search);\n }\n return {\n hostname,\n port: port ? parseInt(port) : undefined,\n protocol,\n path: pathname,\n query,\n };\n};\nexports.parseUrl = parseUrl;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromBase64 = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst BASE64_REGEX = /^[A-Za-z0-9+/]*={0,2}$/;\nconst fromBase64 = (input) => {\n if ((input.length * 3) % 4 !== 0) {\n throw new TypeError(`Incorrect padding on base64 string.`);\n }\n if (!BASE64_REGEX.exec(input)) {\n throw new TypeError(`Invalid base64 string.`);\n }\n const buffer = (0, util_buffer_from_1.fromString)(input, \"base64\");\n return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n};\nexports.fromBase64 = fromBase64;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromBase64\"), exports);\ntslib_1.__exportStar(require(\"./toBase64\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toBase64 = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst toBase64 = (input) => (0, util_buffer_from_1.fromArrayBuffer)(input.buffer, input.byteOffset, input.byteLength).toString(\"base64\");\nexports.toBase64 = toBase64;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateBodyLength = void 0;\nconst fs_1 = require(\"fs\");\nconst calculateBodyLength = (body) => {\n if (!body) {\n return 0;\n }\n if (typeof body === \"string\") {\n return Buffer.from(body).length;\n }\n else if (typeof body.byteLength === \"number\") {\n return body.byteLength;\n }\n else if (typeof body.size === \"number\") {\n return body.size;\n }\n else if (typeof body.start === \"number\" && typeof body.end === \"number\") {\n return body.end + 1 - body.start;\n }\n else if (typeof body.path === \"string\" || Buffer.isBuffer(body.path)) {\n return (0, fs_1.lstatSync)(body.path).size;\n }\n else if (typeof body.fd === \"number\") {\n return (0, fs_1.fstatSync)(body.fd).size;\n }\n throw new Error(`Body Length computation failed for ${body}`);\n};\nexports.calculateBodyLength = calculateBodyLength;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./calculateBodyLength\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromString = exports.fromArrayBuffer = void 0;\nconst is_array_buffer_1 = require(\"@smithy/is-array-buffer\");\nconst buffer_1 = require(\"buffer\");\nconst fromArrayBuffer = (input, offset = 0, length = input.byteLength - offset) => {\n if (!(0, is_array_buffer_1.isArrayBuffer)(input)) {\n throw new TypeError(`The \"input\" argument must be ArrayBuffer. Received type ${typeof input} (${input})`);\n }\n return buffer_1.Buffer.from(input, offset, length);\n};\nexports.fromArrayBuffer = fromArrayBuffer;\nconst fromString = (input, encoding) => {\n if (typeof input !== \"string\") {\n throw new TypeError(`The \"input\" argument must be of type string. Received type ${typeof input} (${input})`);\n }\n return encoding ? buffer_1.Buffer.from(input, encoding) : buffer_1.Buffer.from(input);\n};\nexports.fromString = fromString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.booleanSelector = exports.SelectorType = void 0;\nvar SelectorType;\n(function (SelectorType) {\n SelectorType[\"ENV\"] = \"env\";\n SelectorType[\"CONFIG\"] = \"shared config entry\";\n})(SelectorType = exports.SelectorType || (exports.SelectorType = {}));\nconst booleanSelector = (obj, key, type) => {\n if (!(key in obj))\n return undefined;\n if (obj[key] === \"true\")\n return true;\n if (obj[key] === \"false\")\n return false;\n throw new Error(`Cannot load ${type} \"${key}\". Expected \"true\" or \"false\", got ${obj[key]}.`);\n};\nexports.booleanSelector = booleanSelector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./booleanSelector\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IMDS_REGION_PATH = exports.DEFAULTS_MODE_OPTIONS = exports.ENV_IMDS_DISABLED = exports.AWS_DEFAULT_REGION_ENV = exports.AWS_REGION_ENV = exports.AWS_EXECUTION_ENV = void 0;\nexports.AWS_EXECUTION_ENV = \"AWS_EXECUTION_ENV\";\nexports.AWS_REGION_ENV = \"AWS_REGION\";\nexports.AWS_DEFAULT_REGION_ENV = \"AWS_DEFAULT_REGION\";\nexports.ENV_IMDS_DISABLED = \"AWS_EC2_METADATA_DISABLED\";\nexports.DEFAULTS_MODE_OPTIONS = [\"in-region\", \"cross-region\", \"mobile\", \"standard\", \"legacy\"];\nexports.IMDS_REGION_PATH = \"/latest/meta-data/placement/region\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NODE_DEFAULTS_MODE_CONFIG_OPTIONS = void 0;\nconst AWS_DEFAULTS_MODE_ENV = \"AWS_DEFAULTS_MODE\";\nconst AWS_DEFAULTS_MODE_CONFIG = \"defaults_mode\";\nexports.NODE_DEFAULTS_MODE_CONFIG_OPTIONS = {\n environmentVariableSelector: (env) => {\n return env[AWS_DEFAULTS_MODE_ENV];\n },\n configFileSelector: (profile) => {\n return profile[AWS_DEFAULTS_MODE_CONFIG];\n },\n default: \"legacy\",\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./resolveDefaultsModeConfig\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveDefaultsModeConfig = void 0;\nconst config_resolver_1 = require(\"@smithy/config-resolver\");\nconst credential_provider_imds_1 = require(\"@smithy/credential-provider-imds\");\nconst node_config_provider_1 = require(\"@smithy/node-config-provider\");\nconst property_provider_1 = require(\"@smithy/property-provider\");\nconst constants_1 = require(\"./constants\");\nconst defaultsModeConfig_1 = require(\"./defaultsModeConfig\");\nconst resolveDefaultsModeConfig = ({ region = (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS), defaultsMode = (0, node_config_provider_1.loadConfig)(defaultsModeConfig_1.NODE_DEFAULTS_MODE_CONFIG_OPTIONS), } = {}) => (0, property_provider_1.memoize)(async () => {\n const mode = typeof defaultsMode === \"function\" ? await defaultsMode() : defaultsMode;\n switch (mode === null || mode === void 0 ? void 0 : mode.toLowerCase()) {\n case \"auto\":\n return resolveNodeDefaultsModeAuto(region);\n case \"in-region\":\n case \"cross-region\":\n case \"mobile\":\n case \"standard\":\n case \"legacy\":\n return Promise.resolve(mode === null || mode === void 0 ? void 0 : mode.toLocaleLowerCase());\n case undefined:\n return Promise.resolve(\"legacy\");\n default:\n throw new Error(`Invalid parameter for \"defaultsMode\", expect ${constants_1.DEFAULTS_MODE_OPTIONS.join(\", \")}, got ${mode}`);\n }\n});\nexports.resolveDefaultsModeConfig = resolveDefaultsModeConfig;\nconst resolveNodeDefaultsModeAuto = async (clientRegion) => {\n if (clientRegion) {\n const resolvedRegion = typeof clientRegion === \"function\" ? await clientRegion() : clientRegion;\n const inferredRegion = await inferPhysicalRegion();\n if (!inferredRegion) {\n return \"standard\";\n }\n if (resolvedRegion === inferredRegion) {\n return \"in-region\";\n }\n else {\n return \"cross-region\";\n }\n }\n return \"standard\";\n};\nconst inferPhysicalRegion = async () => {\n var _a;\n if (process.env[constants_1.AWS_EXECUTION_ENV] && (process.env[constants_1.AWS_REGION_ENV] || process.env[constants_1.AWS_DEFAULT_REGION_ENV])) {\n return (_a = process.env[constants_1.AWS_REGION_ENV]) !== null && _a !== void 0 ? _a : process.env[constants_1.AWS_DEFAULT_REGION_ENV];\n }\n if (!process.env[constants_1.ENV_IMDS_DISABLED]) {\n try {\n const endpoint = await (0, credential_provider_imds_1.getInstanceMetadataEndpoint)();\n return (await (0, credential_provider_imds_1.httpRequest)({ ...endpoint, path: constants_1.IMDS_REGION_PATH })).toString();\n }\n catch (e) {\n }\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.debugId = void 0;\nexports.debugId = \"endpoints\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./debugId\"), exports);\ntslib_1.__exportStar(require(\"./toDebugString\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toDebugString = void 0;\nfunction toDebugString(input) {\n if (typeof input !== \"object\" || input == null) {\n return input;\n }\n if (\"ref\" in input) {\n return `$${toDebugString(input.ref)}`;\n }\n if (\"fn\" in input) {\n return `${input.fn}(${(input.argv || []).map(toDebugString).join(\", \")})`;\n }\n return JSON.stringify(input, null, 2);\n}\nexports.toDebugString = toDebugString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./lib/isIpAddress\"), exports);\ntslib_1.__exportStar(require(\"./lib/isValidHostLabel\"), exports);\ntslib_1.__exportStar(require(\"./utils/customEndpointFunctions\"), exports);\ntslib_1.__exportStar(require(\"./resolveEndpoint\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.booleanEquals = void 0;\nconst booleanEquals = (value1, value2) => value1 === value2;\nexports.booleanEquals = booleanEquals;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getAttr = void 0;\nconst types_1 = require(\"../types\");\nconst getAttrPathList_1 = require(\"./getAttrPathList\");\nconst getAttr = (value, path) => (0, getAttrPathList_1.getAttrPathList)(path).reduce((acc, index) => {\n if (typeof acc !== \"object\") {\n throw new types_1.EndpointError(`Index '${index}' in '${path}' not found in '${JSON.stringify(value)}'`);\n }\n else if (Array.isArray(acc)) {\n return acc[parseInt(index)];\n }\n return acc[index];\n}, value);\nexports.getAttr = getAttr;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getAttrPathList = void 0;\nconst types_1 = require(\"../types\");\nconst getAttrPathList = (path) => {\n const parts = path.split(\".\");\n const pathList = [];\n for (const part of parts) {\n const squareBracketIndex = part.indexOf(\"[\");\n if (squareBracketIndex !== -1) {\n if (part.indexOf(\"]\") !== part.length - 1) {\n throw new types_1.EndpointError(`Path: '${path}' does not end with ']'`);\n }\n const arrayIndex = part.slice(squareBracketIndex + 1, -1);\n if (Number.isNaN(parseInt(arrayIndex))) {\n throw new types_1.EndpointError(`Invalid array index: '${arrayIndex}' in path: '${path}'`);\n }\n if (squareBracketIndex !== 0) {\n pathList.push(part.slice(0, squareBracketIndex));\n }\n pathList.push(arrayIndex);\n }\n else {\n pathList.push(part);\n }\n }\n return pathList;\n};\nexports.getAttrPathList = getAttrPathList;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./booleanEquals\"), exports);\ntslib_1.__exportStar(require(\"./getAttr\"), exports);\ntslib_1.__exportStar(require(\"./isSet\"), exports);\ntslib_1.__exportStar(require(\"./isValidHostLabel\"), exports);\ntslib_1.__exportStar(require(\"./not\"), exports);\ntslib_1.__exportStar(require(\"./parseURL\"), exports);\ntslib_1.__exportStar(require(\"./stringEquals\"), exports);\ntslib_1.__exportStar(require(\"./substring\"), exports);\ntslib_1.__exportStar(require(\"./uriEncode\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isIpAddress = void 0;\nconst IP_V4_REGEX = new RegExp(`^(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}$`);\nconst isIpAddress = (value) => IP_V4_REGEX.test(value) || (value.startsWith(\"[\") && value.endsWith(\"]\"));\nexports.isIpAddress = isIpAddress;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isSet = void 0;\nconst isSet = (value) => value != null;\nexports.isSet = isSet;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isValidHostLabel = void 0;\nconst VALID_HOST_LABEL_REGEX = new RegExp(`^(?!.*-$)(?!-)[a-zA-Z0-9-]{1,63}$`);\nconst isValidHostLabel = (value, allowSubDomains = false) => {\n if (!allowSubDomains) {\n return VALID_HOST_LABEL_REGEX.test(value);\n }\n const labels = value.split(\".\");\n for (const label of labels) {\n if (!(0, exports.isValidHostLabel)(label)) {\n return false;\n }\n }\n return true;\n};\nexports.isValidHostLabel = isValidHostLabel;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.not = void 0;\nconst not = (value) => !value;\nexports.not = not;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseURL = void 0;\nconst types_1 = require(\"@smithy/types\");\nconst isIpAddress_1 = require(\"./isIpAddress\");\nconst DEFAULT_PORTS = {\n [types_1.EndpointURLScheme.HTTP]: 80,\n [types_1.EndpointURLScheme.HTTPS]: 443,\n};\nconst parseURL = (value) => {\n const whatwgURL = (() => {\n try {\n if (value instanceof URL) {\n return value;\n }\n if (typeof value === \"object\" && \"hostname\" in value) {\n const { hostname, port, protocol = \"\", path = \"\", query = {} } = value;\n const url = new URL(`${protocol}//${hostname}${port ? `:${port}` : \"\"}${path}`);\n url.search = Object.entries(query)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"&\");\n return url;\n }\n return new URL(value);\n }\n catch (error) {\n return null;\n }\n })();\n if (!whatwgURL) {\n console.error(`Unable to parse ${JSON.stringify(value)} as a whatwg URL.`);\n return null;\n }\n const urlString = whatwgURL.href;\n const { host, hostname, pathname, protocol, search } = whatwgURL;\n if (search) {\n return null;\n }\n const scheme = protocol.slice(0, -1);\n if (!Object.values(types_1.EndpointURLScheme).includes(scheme)) {\n return null;\n }\n const isIp = (0, isIpAddress_1.isIpAddress)(hostname);\n const inputContainsDefaultPort = urlString.includes(`${host}:${DEFAULT_PORTS[scheme]}`) ||\n (typeof value === \"string\" && value.includes(`${host}:${DEFAULT_PORTS[scheme]}`));\n const authority = `${host}${inputContainsDefaultPort ? `:${DEFAULT_PORTS[scheme]}` : ``}`;\n return {\n scheme,\n authority,\n path: pathname,\n normalizedPath: pathname.endsWith(\"/\") ? pathname : `${pathname}/`,\n isIp,\n };\n};\nexports.parseURL = parseURL;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringEquals = void 0;\nconst stringEquals = (value1, value2) => value1 === value2;\nexports.stringEquals = stringEquals;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.substring = void 0;\nconst substring = (input, start, stop, reverse) => {\n if (start >= stop || input.length < stop) {\n return null;\n }\n if (!reverse) {\n return input.substring(start, stop);\n }\n return input.substring(input.length - stop, input.length - start);\n};\nexports.substring = substring;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.uriEncode = void 0;\nconst uriEncode = (value) => encodeURIComponent(value).replace(/[!*'()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);\nexports.uriEncode = uriEncode;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveEndpoint = void 0;\nconst debug_1 = require(\"./debug\");\nconst types_1 = require(\"./types\");\nconst utils_1 = require(\"./utils\");\nconst resolveEndpoint = (ruleSetObject, options) => {\n var _a, _b, _c, _d, _e, _f;\n const { endpointParams, logger } = options;\n const { parameters, rules } = ruleSetObject;\n (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, `${debug_1.debugId} Initial EndpointParams: ${(0, debug_1.toDebugString)(endpointParams)}`);\n const paramsWithDefault = Object.entries(parameters)\n .filter(([, v]) => v.default != null)\n .map(([k, v]) => [k, v.default]);\n if (paramsWithDefault.length > 0) {\n for (const [paramKey, paramDefaultValue] of paramsWithDefault) {\n endpointParams[paramKey] = (_c = endpointParams[paramKey]) !== null && _c !== void 0 ? _c : paramDefaultValue;\n }\n }\n const requiredParams = Object.entries(parameters)\n .filter(([, v]) => v.required)\n .map(([k]) => k);\n for (const requiredParam of requiredParams) {\n if (endpointParams[requiredParam] == null) {\n throw new types_1.EndpointError(`Missing required parameter: '${requiredParam}'`);\n }\n }\n const endpoint = (0, utils_1.evaluateRules)(rules, { endpointParams, logger, referenceRecord: {} });\n if ((_d = options.endpointParams) === null || _d === void 0 ? void 0 : _d.Endpoint) {\n try {\n const givenEndpoint = new URL(options.endpointParams.Endpoint);\n const { protocol, port } = givenEndpoint;\n endpoint.url.protocol = protocol;\n endpoint.url.port = port;\n }\n catch (e) {\n }\n }\n (_f = (_e = options.logger) === null || _e === void 0 ? void 0 : _e.debug) === null || _f === void 0 ? void 0 : _f.call(_e, `${debug_1.debugId} Resolved endpoint: ${(0, debug_1.toDebugString)(endpoint)}`);\n return endpoint;\n};\nexports.resolveEndpoint = resolveEndpoint;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EndpointError = void 0;\nclass EndpointError extends Error {\n constructor(message) {\n super(message);\n this.name = \"EndpointError\";\n }\n}\nexports.EndpointError = EndpointError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./EndpointError\"), exports);\ntslib_1.__exportStar(require(\"./EndpointFunctions\"), exports);\ntslib_1.__exportStar(require(\"./EndpointRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./ErrorRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./RuleSetObject\"), exports);\ntslib_1.__exportStar(require(\"./TreeRuleObject\"), exports);\ntslib_1.__exportStar(require(\"./shared\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.callFunction = void 0;\nconst customEndpointFunctions_1 = require(\"./customEndpointFunctions\");\nconst endpointFunctions_1 = require(\"./endpointFunctions\");\nconst evaluateExpression_1 = require(\"./evaluateExpression\");\nconst callFunction = ({ fn, argv }, options) => {\n const evaluatedArgs = argv.map((arg) => [\"boolean\", \"number\"].includes(typeof arg) ? arg : (0, evaluateExpression_1.evaluateExpression)(arg, \"arg\", options));\n const fnSegments = fn.split(\".\");\n if (fnSegments[0] in customEndpointFunctions_1.customEndpointFunctions && fnSegments[1] != null) {\n return customEndpointFunctions_1.customEndpointFunctions[fnSegments[0]][fnSegments[1]](...evaluatedArgs);\n }\n return endpointFunctions_1.endpointFunctions[fn](...evaluatedArgs);\n};\nexports.callFunction = callFunction;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.customEndpointFunctions = void 0;\nexports.customEndpointFunctions = {};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.endpointFunctions = void 0;\nconst lib_1 = require(\"../lib\");\nexports.endpointFunctions = {\n booleanEquals: lib_1.booleanEquals,\n getAttr: lib_1.getAttr,\n isSet: lib_1.isSet,\n isValidHostLabel: lib_1.isValidHostLabel,\n not: lib_1.not,\n parseURL: lib_1.parseURL,\n stringEquals: lib_1.stringEquals,\n substring: lib_1.substring,\n uriEncode: lib_1.uriEncode,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateCondition = void 0;\nconst debug_1 = require(\"../debug\");\nconst types_1 = require(\"../types\");\nconst callFunction_1 = require(\"./callFunction\");\nconst evaluateCondition = ({ assign, ...fnArgs }, options) => {\n var _a, _b;\n if (assign && assign in options.referenceRecord) {\n throw new types_1.EndpointError(`'${assign}' is already defined in Reference Record.`);\n }\n const value = (0, callFunction_1.callFunction)(fnArgs, options);\n (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `evaluateCondition: ${(0, debug_1.toDebugString)(fnArgs)} = ${(0, debug_1.toDebugString)(value)}`);\n return {\n result: value === \"\" ? true : !!value,\n ...(assign != null && { toAssign: { name: assign, value } }),\n };\n};\nexports.evaluateCondition = evaluateCondition;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateConditions = void 0;\nconst debug_1 = require(\"../debug\");\nconst evaluateCondition_1 = require(\"./evaluateCondition\");\nconst evaluateConditions = (conditions = [], options) => {\n var _a, _b;\n const conditionsReferenceRecord = {};\n for (const condition of conditions) {\n const { result, toAssign } = (0, evaluateCondition_1.evaluateCondition)(condition, {\n ...options,\n referenceRecord: {\n ...options.referenceRecord,\n ...conditionsReferenceRecord,\n },\n });\n if (!result) {\n return { result };\n }\n if (toAssign) {\n conditionsReferenceRecord[toAssign.name] = toAssign.value;\n (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `assign: ${toAssign.name} := ${(0, debug_1.toDebugString)(toAssign.value)}`);\n }\n }\n return { result: true, referenceRecord: conditionsReferenceRecord };\n};\nexports.evaluateConditions = evaluateConditions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateEndpointRule = void 0;\nconst debug_1 = require(\"../debug\");\nconst evaluateConditions_1 = require(\"./evaluateConditions\");\nconst getEndpointHeaders_1 = require(\"./getEndpointHeaders\");\nconst getEndpointProperties_1 = require(\"./getEndpointProperties\");\nconst getEndpointUrl_1 = require(\"./getEndpointUrl\");\nconst evaluateEndpointRule = (endpointRule, options) => {\n var _a, _b;\n const { conditions, endpoint } = endpointRule;\n const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options);\n if (!result) {\n return;\n }\n const endpointRuleOptions = {\n ...options,\n referenceRecord: { ...options.referenceRecord, ...referenceRecord },\n };\n const { url, properties, headers } = endpoint;\n (_b = (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, debug_1.debugId, `Resolving endpoint from template: ${(0, debug_1.toDebugString)(endpoint)}`);\n return {\n ...(headers != undefined && {\n headers: (0, getEndpointHeaders_1.getEndpointHeaders)(headers, endpointRuleOptions),\n }),\n ...(properties != undefined && {\n properties: (0, getEndpointProperties_1.getEndpointProperties)(properties, endpointRuleOptions),\n }),\n url: (0, getEndpointUrl_1.getEndpointUrl)(url, endpointRuleOptions),\n };\n};\nexports.evaluateEndpointRule = evaluateEndpointRule;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateErrorRule = void 0;\nconst types_1 = require(\"../types\");\nconst evaluateConditions_1 = require(\"./evaluateConditions\");\nconst evaluateExpression_1 = require(\"./evaluateExpression\");\nconst evaluateErrorRule = (errorRule, options) => {\n const { conditions, error } = errorRule;\n const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options);\n if (!result) {\n return;\n }\n throw new types_1.EndpointError((0, evaluateExpression_1.evaluateExpression)(error, \"Error\", {\n ...options,\n referenceRecord: { ...options.referenceRecord, ...referenceRecord },\n }));\n};\nexports.evaluateErrorRule = evaluateErrorRule;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateExpression = void 0;\nconst types_1 = require(\"../types\");\nconst callFunction_1 = require(\"./callFunction\");\nconst evaluateTemplate_1 = require(\"./evaluateTemplate\");\nconst getReferenceValue_1 = require(\"./getReferenceValue\");\nconst evaluateExpression = (obj, keyName, options) => {\n if (typeof obj === \"string\") {\n return (0, evaluateTemplate_1.evaluateTemplate)(obj, options);\n }\n else if (obj[\"fn\"]) {\n return (0, callFunction_1.callFunction)(obj, options);\n }\n else if (obj[\"ref\"]) {\n return (0, getReferenceValue_1.getReferenceValue)(obj, options);\n }\n throw new types_1.EndpointError(`'${keyName}': ${String(obj)} is not a string, function or reference.`);\n};\nexports.evaluateExpression = evaluateExpression;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateRules = void 0;\nconst types_1 = require(\"../types\");\nconst evaluateEndpointRule_1 = require(\"./evaluateEndpointRule\");\nconst evaluateErrorRule_1 = require(\"./evaluateErrorRule\");\nconst evaluateTreeRule_1 = require(\"./evaluateTreeRule\");\nconst evaluateRules = (rules, options) => {\n for (const rule of rules) {\n if (rule.type === \"endpoint\") {\n const endpointOrUndefined = (0, evaluateEndpointRule_1.evaluateEndpointRule)(rule, options);\n if (endpointOrUndefined) {\n return endpointOrUndefined;\n }\n }\n else if (rule.type === \"error\") {\n (0, evaluateErrorRule_1.evaluateErrorRule)(rule, options);\n }\n else if (rule.type === \"tree\") {\n const endpointOrUndefined = (0, evaluateTreeRule_1.evaluateTreeRule)(rule, options);\n if (endpointOrUndefined) {\n return endpointOrUndefined;\n }\n }\n else {\n throw new types_1.EndpointError(`Unknown endpoint rule: ${rule}`);\n }\n }\n throw new types_1.EndpointError(`Rules evaluation failed`);\n};\nexports.evaluateRules = evaluateRules;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateTemplate = void 0;\nconst lib_1 = require(\"../lib\");\nconst evaluateTemplate = (template, options) => {\n const evaluatedTemplateArr = [];\n const templateContext = {\n ...options.endpointParams,\n ...options.referenceRecord,\n };\n let currentIndex = 0;\n while (currentIndex < template.length) {\n const openingBraceIndex = template.indexOf(\"{\", currentIndex);\n if (openingBraceIndex === -1) {\n evaluatedTemplateArr.push(template.slice(currentIndex));\n break;\n }\n evaluatedTemplateArr.push(template.slice(currentIndex, openingBraceIndex));\n const closingBraceIndex = template.indexOf(\"}\", openingBraceIndex);\n if (closingBraceIndex === -1) {\n evaluatedTemplateArr.push(template.slice(openingBraceIndex));\n break;\n }\n if (template[openingBraceIndex + 1] === \"{\" && template[closingBraceIndex + 1] === \"}\") {\n evaluatedTemplateArr.push(template.slice(openingBraceIndex + 1, closingBraceIndex));\n currentIndex = closingBraceIndex + 2;\n }\n const parameterName = template.substring(openingBraceIndex + 1, closingBraceIndex);\n if (parameterName.includes(\"#\")) {\n const [refName, attrName] = parameterName.split(\"#\");\n evaluatedTemplateArr.push((0, lib_1.getAttr)(templateContext[refName], attrName));\n }\n else {\n evaluatedTemplateArr.push(templateContext[parameterName]);\n }\n currentIndex = closingBraceIndex + 1;\n }\n return evaluatedTemplateArr.join(\"\");\n};\nexports.evaluateTemplate = evaluateTemplate;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.evaluateTreeRule = void 0;\nconst evaluateConditions_1 = require(\"./evaluateConditions\");\nconst evaluateRules_1 = require(\"./evaluateRules\");\nconst evaluateTreeRule = (treeRule, options) => {\n const { conditions, rules } = treeRule;\n const { result, referenceRecord } = (0, evaluateConditions_1.evaluateConditions)(conditions, options);\n if (!result) {\n return;\n }\n return (0, evaluateRules_1.evaluateRules)(rules, {\n ...options,\n referenceRecord: { ...options.referenceRecord, ...referenceRecord },\n });\n};\nexports.evaluateTreeRule = evaluateTreeRule;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointHeaders = void 0;\nconst types_1 = require(\"../types\");\nconst evaluateExpression_1 = require(\"./evaluateExpression\");\nconst getEndpointHeaders = (headers, options) => Object.entries(headers).reduce((acc, [headerKey, headerVal]) => ({\n ...acc,\n [headerKey]: headerVal.map((headerValEntry) => {\n const processedExpr = (0, evaluateExpression_1.evaluateExpression)(headerValEntry, \"Header value entry\", options);\n if (typeof processedExpr !== \"string\") {\n throw new types_1.EndpointError(`Header '${headerKey}' value '${processedExpr}' is not a string`);\n }\n return processedExpr;\n }),\n}), {});\nexports.getEndpointHeaders = getEndpointHeaders;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointProperties = void 0;\nconst getEndpointProperty_1 = require(\"./getEndpointProperty\");\nconst getEndpointProperties = (properties, options) => Object.entries(properties).reduce((acc, [propertyKey, propertyVal]) => ({\n ...acc,\n [propertyKey]: (0, getEndpointProperty_1.getEndpointProperty)(propertyVal, options),\n}), {});\nexports.getEndpointProperties = getEndpointProperties;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointProperty = void 0;\nconst types_1 = require(\"../types\");\nconst evaluateTemplate_1 = require(\"./evaluateTemplate\");\nconst getEndpointProperties_1 = require(\"./getEndpointProperties\");\nconst getEndpointProperty = (property, options) => {\n if (Array.isArray(property)) {\n return property.map((propertyEntry) => (0, exports.getEndpointProperty)(propertyEntry, options));\n }\n switch (typeof property) {\n case \"string\":\n return (0, evaluateTemplate_1.evaluateTemplate)(property, options);\n case \"object\":\n if (property === null) {\n throw new types_1.EndpointError(`Unexpected endpoint property: ${property}`);\n }\n return (0, getEndpointProperties_1.getEndpointProperties)(property, options);\n case \"boolean\":\n return property;\n default:\n throw new types_1.EndpointError(`Unexpected endpoint property type: ${typeof property}`);\n }\n};\nexports.getEndpointProperty = getEndpointProperty;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEndpointUrl = void 0;\nconst types_1 = require(\"../types\");\nconst evaluateExpression_1 = require(\"./evaluateExpression\");\nconst getEndpointUrl = (endpointUrl, options) => {\n const expression = (0, evaluateExpression_1.evaluateExpression)(endpointUrl, \"Endpoint URL\", options);\n if (typeof expression === \"string\") {\n try {\n return new URL(expression);\n }\n catch (error) {\n console.error(`Failed to construct URL with ${expression}`, error);\n throw error;\n }\n }\n throw new types_1.EndpointError(`Endpoint URL must be a string, got ${typeof expression}`);\n};\nexports.getEndpointUrl = getEndpointUrl;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getReferenceValue = void 0;\nconst getReferenceValue = ({ ref }, options) => {\n const referenceRecord = {\n ...options.endpointParams,\n ...options.referenceRecord,\n };\n return referenceRecord[ref];\n};\nexports.getReferenceValue = getReferenceValue;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./customEndpointFunctions\"), exports);\ntslib_1.__exportStar(require(\"./evaluateRules\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toHex = exports.fromHex = void 0;\nconst SHORT_TO_HEX = {};\nconst HEX_TO_SHORT = {};\nfor (let i = 0; i < 256; i++) {\n let encodedByte = i.toString(16).toLowerCase();\n if (encodedByte.length === 1) {\n encodedByte = `0${encodedByte}`;\n }\n SHORT_TO_HEX[i] = encodedByte;\n HEX_TO_SHORT[encodedByte] = i;\n}\nfunction fromHex(encoded) {\n if (encoded.length % 2 !== 0) {\n throw new Error(\"Hex encoded strings must have an even number length\");\n }\n const out = new Uint8Array(encoded.length / 2);\n for (let i = 0; i < encoded.length; i += 2) {\n const encodedByte = encoded.slice(i, i + 2).toLowerCase();\n if (encodedByte in HEX_TO_SHORT) {\n out[i / 2] = HEX_TO_SHORT[encodedByte];\n }\n else {\n throw new Error(`Cannot decode unrecognized sequence ${encodedByte} as hexadecimal`);\n }\n }\n return out;\n}\nexports.fromHex = fromHex;\nfunction toHex(bytes) {\n let out = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n out += SHORT_TO_HEX[bytes[i]];\n }\n return out;\n}\nexports.toHex = toHex;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSmithyContext = void 0;\nconst types_1 = require(\"@smithy/types\");\nconst getSmithyContext = (context) => context[types_1.SMITHY_CONTEXT_KEY] || (context[types_1.SMITHY_CONTEXT_KEY] = {});\nexports.getSmithyContext = getSmithyContext;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./getSmithyContext\"), exports);\ntslib_1.__exportStar(require(\"./normalizeProvider\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.normalizeProvider = void 0;\nconst normalizeProvider = (input) => {\n if (typeof input === \"function\")\n return input;\n const promisified = Promise.resolve(input);\n return () => promisified;\n};\nexports.normalizeProvider = normalizeProvider;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AdaptiveRetryStrategy = void 0;\nconst config_1 = require(\"./config\");\nconst DefaultRateLimiter_1 = require(\"./DefaultRateLimiter\");\nconst StandardRetryStrategy_1 = require(\"./StandardRetryStrategy\");\nclass AdaptiveRetryStrategy {\n constructor(maxAttemptsProvider, options) {\n this.maxAttemptsProvider = maxAttemptsProvider;\n this.mode = config_1.RETRY_MODES.ADAPTIVE;\n const { rateLimiter } = options !== null && options !== void 0 ? options : {};\n this.rateLimiter = rateLimiter !== null && rateLimiter !== void 0 ? rateLimiter : new DefaultRateLimiter_1.DefaultRateLimiter();\n this.standardRetryStrategy = new StandardRetryStrategy_1.StandardRetryStrategy(maxAttemptsProvider);\n }\n async acquireInitialRetryToken(retryTokenScope) {\n await this.rateLimiter.getSendToken();\n return this.standardRetryStrategy.acquireInitialRetryToken(retryTokenScope);\n }\n async refreshRetryTokenForRetry(tokenToRenew, errorInfo) {\n this.rateLimiter.updateClientSendingRate(errorInfo);\n return this.standardRetryStrategy.refreshRetryTokenForRetry(tokenToRenew, errorInfo);\n }\n recordSuccess(token) {\n this.rateLimiter.updateClientSendingRate({});\n this.standardRetryStrategy.recordSuccess(token);\n }\n}\nexports.AdaptiveRetryStrategy = AdaptiveRetryStrategy;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConfiguredRetryStrategy = void 0;\nconst constants_1 = require(\"./constants\");\nconst StandardRetryStrategy_1 = require(\"./StandardRetryStrategy\");\nclass ConfiguredRetryStrategy extends StandardRetryStrategy_1.StandardRetryStrategy {\n constructor(maxAttempts, computeNextBackoffDelay = constants_1.DEFAULT_RETRY_DELAY_BASE) {\n super(typeof maxAttempts === \"function\" ? maxAttempts : async () => maxAttempts);\n if (typeof computeNextBackoffDelay === \"number\") {\n this.computeNextBackoffDelay = () => computeNextBackoffDelay;\n }\n else {\n this.computeNextBackoffDelay = computeNextBackoffDelay;\n }\n }\n async refreshRetryTokenForRetry(tokenToRenew, errorInfo) {\n const token = await super.refreshRetryTokenForRetry(tokenToRenew, errorInfo);\n token.getRetryDelay = () => this.computeNextBackoffDelay(token.getRetryCount());\n return token;\n }\n}\nexports.ConfiguredRetryStrategy = ConfiguredRetryStrategy;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DefaultRateLimiter = void 0;\nconst service_error_classification_1 = require(\"@smithy/service-error-classification\");\nclass DefaultRateLimiter {\n constructor(options) {\n var _a, _b, _c, _d, _e;\n this.currentCapacity = 0;\n this.enabled = false;\n this.lastMaxRate = 0;\n this.measuredTxRate = 0;\n this.requestCount = 0;\n this.lastTimestamp = 0;\n this.timeWindow = 0;\n this.beta = (_a = options === null || options === void 0 ? void 0 : options.beta) !== null && _a !== void 0 ? _a : 0.7;\n this.minCapacity = (_b = options === null || options === void 0 ? void 0 : options.minCapacity) !== null && _b !== void 0 ? _b : 1;\n this.minFillRate = (_c = options === null || options === void 0 ? void 0 : options.minFillRate) !== null && _c !== void 0 ? _c : 0.5;\n this.scaleConstant = (_d = options === null || options === void 0 ? void 0 : options.scaleConstant) !== null && _d !== void 0 ? _d : 0.4;\n this.smooth = (_e = options === null || options === void 0 ? void 0 : options.smooth) !== null && _e !== void 0 ? _e : 0.8;\n const currentTimeInSeconds = this.getCurrentTimeInSeconds();\n this.lastThrottleTime = currentTimeInSeconds;\n this.lastTxRateBucket = Math.floor(this.getCurrentTimeInSeconds());\n this.fillRate = this.minFillRate;\n this.maxCapacity = this.minCapacity;\n }\n getCurrentTimeInSeconds() {\n return Date.now() / 1000;\n }\n async getSendToken() {\n return this.acquireTokenBucket(1);\n }\n async acquireTokenBucket(amount) {\n if (!this.enabled) {\n return;\n }\n this.refillTokenBucket();\n if (amount > this.currentCapacity) {\n const delay = ((amount - this.currentCapacity) / this.fillRate) * 1000;\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n this.currentCapacity = this.currentCapacity - amount;\n }\n refillTokenBucket() {\n const timestamp = this.getCurrentTimeInSeconds();\n if (!this.lastTimestamp) {\n this.lastTimestamp = timestamp;\n return;\n }\n const fillAmount = (timestamp - this.lastTimestamp) * this.fillRate;\n this.currentCapacity = Math.min(this.maxCapacity, this.currentCapacity + fillAmount);\n this.lastTimestamp = timestamp;\n }\n updateClientSendingRate(response) {\n let calculatedRate;\n this.updateMeasuredRate();\n if ((0, service_error_classification_1.isThrottlingError)(response)) {\n const rateToUse = !this.enabled ? this.measuredTxRate : Math.min(this.measuredTxRate, this.fillRate);\n this.lastMaxRate = rateToUse;\n this.calculateTimeWindow();\n this.lastThrottleTime = this.getCurrentTimeInSeconds();\n calculatedRate = this.cubicThrottle(rateToUse);\n this.enableTokenBucket();\n }\n else {\n this.calculateTimeWindow();\n calculatedRate = this.cubicSuccess(this.getCurrentTimeInSeconds());\n }\n const newRate = Math.min(calculatedRate, 2 * this.measuredTxRate);\n this.updateTokenBucketRate(newRate);\n }\n calculateTimeWindow() {\n this.timeWindow = this.getPrecise(Math.pow((this.lastMaxRate * (1 - this.beta)) / this.scaleConstant, 1 / 3));\n }\n cubicThrottle(rateToUse) {\n return this.getPrecise(rateToUse * this.beta);\n }\n cubicSuccess(timestamp) {\n return this.getPrecise(this.scaleConstant * Math.pow(timestamp - this.lastThrottleTime - this.timeWindow, 3) + this.lastMaxRate);\n }\n enableTokenBucket() {\n this.enabled = true;\n }\n updateTokenBucketRate(newRate) {\n this.refillTokenBucket();\n this.fillRate = Math.max(newRate, this.minFillRate);\n this.maxCapacity = Math.max(newRate, this.minCapacity);\n this.currentCapacity = Math.min(this.currentCapacity, this.maxCapacity);\n }\n updateMeasuredRate() {\n const t = this.getCurrentTimeInSeconds();\n const timeBucket = Math.floor(t * 2) / 2;\n this.requestCount++;\n if (timeBucket > this.lastTxRateBucket) {\n const currentRate = this.requestCount / (timeBucket - this.lastTxRateBucket);\n this.measuredTxRate = this.getPrecise(currentRate * this.smooth + this.measuredTxRate * (1 - this.smooth));\n this.requestCount = 0;\n this.lastTxRateBucket = timeBucket;\n }\n }\n getPrecise(num) {\n return parseFloat(num.toFixed(8));\n }\n}\nexports.DefaultRateLimiter = DefaultRateLimiter;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StandardRetryStrategy = void 0;\nconst config_1 = require(\"./config\");\nconst constants_1 = require(\"./constants\");\nconst defaultRetryBackoffStrategy_1 = require(\"./defaultRetryBackoffStrategy\");\nconst defaultRetryToken_1 = require(\"./defaultRetryToken\");\nclass StandardRetryStrategy {\n constructor(maxAttempts) {\n this.maxAttempts = maxAttempts;\n this.mode = config_1.RETRY_MODES.STANDARD;\n this.capacity = constants_1.INITIAL_RETRY_TOKENS;\n this.retryBackoffStrategy = (0, defaultRetryBackoffStrategy_1.getDefaultRetryBackoffStrategy)();\n this.maxAttemptsProvider = typeof maxAttempts === \"function\" ? maxAttempts : async () => maxAttempts;\n }\n async acquireInitialRetryToken(retryTokenScope) {\n return (0, defaultRetryToken_1.createDefaultRetryToken)({\n retryDelay: constants_1.DEFAULT_RETRY_DELAY_BASE,\n retryCount: 0,\n });\n }\n async refreshRetryTokenForRetry(token, errorInfo) {\n const maxAttempts = await this.getMaxAttempts();\n if (this.shouldRetry(token, errorInfo, maxAttempts)) {\n const errorType = errorInfo.errorType;\n this.retryBackoffStrategy.setDelayBase(errorType === \"THROTTLING\" ? constants_1.THROTTLING_RETRY_DELAY_BASE : constants_1.DEFAULT_RETRY_DELAY_BASE);\n const delayFromErrorType = this.retryBackoffStrategy.computeNextBackoffDelay(token.getRetryCount());\n const retryDelay = errorInfo.retryAfterHint\n ? Math.max(errorInfo.retryAfterHint.getTime() - Date.now() || 0, delayFromErrorType)\n : delayFromErrorType;\n const capacityCost = this.getCapacityCost(errorType);\n this.capacity -= capacityCost;\n return (0, defaultRetryToken_1.createDefaultRetryToken)({\n retryDelay,\n retryCount: token.getRetryCount() + 1,\n retryCost: capacityCost,\n });\n }\n throw new Error(\"No retry token available\");\n }\n recordSuccess(token) {\n var _a;\n this.capacity = Math.max(constants_1.INITIAL_RETRY_TOKENS, this.capacity + ((_a = token.getRetryCost()) !== null && _a !== void 0 ? _a : constants_1.NO_RETRY_INCREMENT));\n }\n getCapacity() {\n return this.capacity;\n }\n async getMaxAttempts() {\n try {\n return await this.maxAttemptsProvider();\n }\n catch (error) {\n console.warn(`Max attempts provider could not resolve. Using default of ${config_1.DEFAULT_MAX_ATTEMPTS}`);\n return config_1.DEFAULT_MAX_ATTEMPTS;\n }\n }\n shouldRetry(tokenToRenew, errorInfo, maxAttempts) {\n const attempts = tokenToRenew.getRetryCount() + 1;\n return (attempts < maxAttempts &&\n this.capacity >= this.getCapacityCost(errorInfo.errorType) &&\n this.isRetryableError(errorInfo.errorType));\n }\n getCapacityCost(errorType) {\n return errorType === \"TRANSIENT\" ? constants_1.TIMEOUT_RETRY_COST : constants_1.RETRY_COST;\n }\n isRetryableError(errorType) {\n return errorType === \"THROTTLING\" || errorType === \"TRANSIENT\";\n }\n}\nexports.StandardRetryStrategy = StandardRetryStrategy;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_RETRY_MODE = exports.DEFAULT_MAX_ATTEMPTS = exports.RETRY_MODES = void 0;\nvar RETRY_MODES;\n(function (RETRY_MODES) {\n RETRY_MODES[\"STANDARD\"] = \"standard\";\n RETRY_MODES[\"ADAPTIVE\"] = \"adaptive\";\n})(RETRY_MODES = exports.RETRY_MODES || (exports.RETRY_MODES = {}));\nexports.DEFAULT_MAX_ATTEMPTS = 3;\nexports.DEFAULT_RETRY_MODE = RETRY_MODES.STANDARD;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.REQUEST_HEADER = exports.INVOCATION_ID_HEADER = exports.NO_RETRY_INCREMENT = exports.TIMEOUT_RETRY_COST = exports.RETRY_COST = exports.INITIAL_RETRY_TOKENS = exports.THROTTLING_RETRY_DELAY_BASE = exports.MAXIMUM_RETRY_DELAY = exports.DEFAULT_RETRY_DELAY_BASE = void 0;\nexports.DEFAULT_RETRY_DELAY_BASE = 100;\nexports.MAXIMUM_RETRY_DELAY = 20 * 1000;\nexports.THROTTLING_RETRY_DELAY_BASE = 500;\nexports.INITIAL_RETRY_TOKENS = 500;\nexports.RETRY_COST = 5;\nexports.TIMEOUT_RETRY_COST = 10;\nexports.NO_RETRY_INCREMENT = 1;\nexports.INVOCATION_ID_HEADER = \"amz-sdk-invocation-id\";\nexports.REQUEST_HEADER = \"amz-sdk-request\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getDefaultRetryBackoffStrategy = void 0;\nconst constants_1 = require(\"./constants\");\nconst getDefaultRetryBackoffStrategy = () => {\n let delayBase = constants_1.DEFAULT_RETRY_DELAY_BASE;\n const computeNextBackoffDelay = (attempts) => {\n return Math.floor(Math.min(constants_1.MAXIMUM_RETRY_DELAY, Math.random() * 2 ** attempts * delayBase));\n };\n const setDelayBase = (delay) => {\n delayBase = delay;\n };\n return {\n computeNextBackoffDelay,\n setDelayBase,\n };\n};\nexports.getDefaultRetryBackoffStrategy = getDefaultRetryBackoffStrategy;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createDefaultRetryToken = void 0;\nconst constants_1 = require(\"./constants\");\nconst createDefaultRetryToken = ({ retryDelay, retryCount, retryCost, }) => {\n const getRetryCount = () => retryCount;\n const getRetryDelay = () => Math.min(constants_1.MAXIMUM_RETRY_DELAY, retryDelay);\n const getRetryCost = () => retryCost;\n return {\n getRetryCount,\n getRetryDelay,\n getRetryCost,\n };\n};\nexports.createDefaultRetryToken = createDefaultRetryToken;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./AdaptiveRetryStrategy\"), exports);\ntslib_1.__exportStar(require(\"./ConfiguredRetryStrategy\"), exports);\ntslib_1.__exportStar(require(\"./DefaultRateLimiter\"), exports);\ntslib_1.__exportStar(require(\"./StandardRetryStrategy\"), exports);\ntslib_1.__exportStar(require(\"./config\"), exports);\ntslib_1.__exportStar(require(\"./constants\"), exports);\ntslib_1.__exportStar(require(\"./types\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Uint8ArrayBlobAdapter = void 0;\nconst transforms_1 = require(\"./transforms\");\nclass Uint8ArrayBlobAdapter extends Uint8Array {\n static fromString(source, encoding = \"utf-8\") {\n switch (typeof source) {\n case \"string\":\n return (0, transforms_1.transformFromString)(source, encoding);\n default:\n throw new Error(`Unsupported conversion from ${typeof source} to Uint8ArrayBlobAdapter.`);\n }\n }\n static mutate(source) {\n Object.setPrototypeOf(source, Uint8ArrayBlobAdapter.prototype);\n return source;\n }\n transformToString(encoding = \"utf-8\") {\n return (0, transforms_1.transformToString)(this, encoding);\n }\n}\nexports.Uint8ArrayBlobAdapter = Uint8ArrayBlobAdapter;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.transformFromString = exports.transformToString = void 0;\nconst util_base64_1 = require(\"@smithy/util-base64\");\nconst util_utf8_1 = require(\"@smithy/util-utf8\");\nconst Uint8ArrayBlobAdapter_1 = require(\"./Uint8ArrayBlobAdapter\");\nfunction transformToString(payload, encoding = \"utf-8\") {\n if (encoding === \"base64\") {\n return (0, util_base64_1.toBase64)(payload);\n }\n return (0, util_utf8_1.toUtf8)(payload);\n}\nexports.transformToString = transformToString;\nfunction transformFromString(str, encoding) {\n if (encoding === \"base64\") {\n return Uint8ArrayBlobAdapter_1.Uint8ArrayBlobAdapter.mutate((0, util_base64_1.fromBase64)(str));\n }\n return Uint8ArrayBlobAdapter_1.Uint8ArrayBlobAdapter.mutate((0, util_utf8_1.fromUtf8)(str));\n}\nexports.transformFromString = transformFromString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getAwsChunkedEncodingStream = void 0;\nconst stream_1 = require(\"stream\");\nconst getAwsChunkedEncodingStream = (readableStream, options) => {\n const { base64Encoder, bodyLengthChecker, checksumAlgorithmFn, checksumLocationName, streamHasher } = options;\n const checksumRequired = base64Encoder !== undefined &&\n checksumAlgorithmFn !== undefined &&\n checksumLocationName !== undefined &&\n streamHasher !== undefined;\n const digest = checksumRequired ? streamHasher(checksumAlgorithmFn, readableStream) : undefined;\n const awsChunkedEncodingStream = new stream_1.Readable({ read: () => { } });\n readableStream.on(\"data\", (data) => {\n const length = bodyLengthChecker(data) || 0;\n awsChunkedEncodingStream.push(`${length.toString(16)}\\r\\n`);\n awsChunkedEncodingStream.push(data);\n awsChunkedEncodingStream.push(\"\\r\\n\");\n });\n readableStream.on(\"end\", async () => {\n awsChunkedEncodingStream.push(`0\\r\\n`);\n if (checksumRequired) {\n const checksum = base64Encoder(await digest);\n awsChunkedEncodingStream.push(`${checksumLocationName}:${checksum}\\r\\n`);\n awsChunkedEncodingStream.push(`\\r\\n`);\n }\n awsChunkedEncodingStream.push(null);\n });\n return awsChunkedEncodingStream;\n};\nexports.getAwsChunkedEncodingStream = getAwsChunkedEncodingStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./blob/Uint8ArrayBlobAdapter\"), exports);\ntslib_1.__exportStar(require(\"./getAwsChunkedEncodingStream\"), exports);\ntslib_1.__exportStar(require(\"./sdk-stream-mixin\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sdkStreamMixin = void 0;\nconst node_http_handler_1 = require(\"@smithy/node-http-handler\");\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst stream_1 = require(\"stream\");\nconst util_1 = require(\"util\");\nconst ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED = \"The stream has already been transformed.\";\nconst sdkStreamMixin = (stream) => {\n var _a, _b;\n if (!(stream instanceof stream_1.Readable)) {\n const name = ((_b = (_a = stream === null || stream === void 0 ? void 0 : stream.__proto__) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name) || stream;\n throw new Error(`Unexpected stream implementation, expect Stream.Readable instance, got ${name}`);\n }\n let transformed = false;\n const transformToByteArray = async () => {\n if (transformed) {\n throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED);\n }\n transformed = true;\n return await (0, node_http_handler_1.streamCollector)(stream);\n };\n return Object.assign(stream, {\n transformToByteArray,\n transformToString: async (encoding) => {\n const buf = await transformToByteArray();\n if (encoding === undefined || Buffer.isEncoding(encoding)) {\n return (0, util_buffer_from_1.fromArrayBuffer)(buf.buffer, buf.byteOffset, buf.byteLength).toString(encoding);\n }\n else {\n const decoder = new util_1.TextDecoder(encoding);\n return decoder.decode(buf);\n }\n },\n transformToWebStream: () => {\n if (transformed) {\n throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED);\n }\n if (stream.readableFlowing !== null) {\n throw new Error(\"The stream has been consumed by other callbacks.\");\n }\n if (typeof stream_1.Readable.toWeb !== \"function\") {\n throw new Error(\"Readable.toWeb() is not supported. Please make sure you are using Node.js >= 17.0.0, or polyfill is available.\");\n }\n transformed = true;\n return stream_1.Readable.toWeb(stream);\n },\n });\n};\nexports.sdkStreamMixin = sdkStreamMixin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escapeUriPath = void 0;\nconst escape_uri_1 = require(\"./escape-uri\");\nconst escapeUriPath = (uri) => uri.split(\"/\").map(escape_uri_1.escapeUri).join(\"/\");\nexports.escapeUriPath = escapeUriPath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escapeUri = void 0;\nconst escapeUri = (uri) => encodeURIComponent(uri).replace(/[!'()*]/g, hexEncode);\nexports.escapeUri = escapeUri;\nconst hexEncode = (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./escape-uri\"), exports);\ntslib_1.__exportStar(require(\"./escape-uri-path\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fromUtf8 = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst fromUtf8 = (input) => {\n const buf = (0, util_buffer_from_1.fromString)(input, \"utf8\");\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength / Uint8Array.BYTES_PER_ELEMENT);\n};\nexports.fromUtf8 = fromUtf8;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./fromUtf8\"), exports);\ntslib_1.__exportStar(require(\"./toUint8Array\"), exports);\ntslib_1.__exportStar(require(\"./toUtf8\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUint8Array = void 0;\nconst fromUtf8_1 = require(\"./fromUtf8\");\nconst toUint8Array = (data) => {\n if (typeof data === \"string\") {\n return (0, fromUtf8_1.fromUtf8)(data);\n }\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT);\n }\n return new Uint8Array(data);\n};\nexports.toUint8Array = toUint8Array;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toUtf8 = void 0;\nconst util_buffer_from_1 = require(\"@smithy/util-buffer-from\");\nconst toUtf8 = (input) => (0, util_buffer_from_1.fromArrayBuffer)(input.buffer, input.byteOffset, input.byteLength).toString(\"utf8\");\nexports.toUtf8 = toUtf8;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createWaiter = void 0;\nconst poller_1 = require(\"./poller\");\nconst utils_1 = require(\"./utils\");\nconst waiter_1 = require(\"./waiter\");\nconst abortTimeout = async (abortSignal) => {\n return new Promise((resolve) => {\n abortSignal.onabort = () => resolve({ state: waiter_1.WaiterState.ABORTED });\n });\n};\nconst createWaiter = async (options, input, acceptorChecks) => {\n const params = {\n ...waiter_1.waiterServiceDefaults,\n ...options,\n };\n (0, utils_1.validateWaiterOptions)(params);\n const exitConditions = [(0, poller_1.runPolling)(params, input, acceptorChecks)];\n if (options.abortController) {\n exitConditions.push(abortTimeout(options.abortController.signal));\n }\n if (options.abortSignal) {\n exitConditions.push(abortTimeout(options.abortSignal));\n }\n return Promise.race(exitConditions);\n};\nexports.createWaiter = createWaiter;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./createWaiter\"), exports);\ntslib_1.__exportStar(require(\"./waiter\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.runPolling = void 0;\nconst sleep_1 = require(\"./utils/sleep\");\nconst waiter_1 = require(\"./waiter\");\nconst exponentialBackoffWithJitter = (minDelay, maxDelay, attemptCeiling, attempt) => {\n if (attempt > attemptCeiling)\n return maxDelay;\n const delay = minDelay * 2 ** (attempt - 1);\n return randomInRange(minDelay, delay);\n};\nconst randomInRange = (min, max) => min + Math.random() * (max - min);\nconst runPolling = async ({ minDelay, maxDelay, maxWaitTime, abortController, client, abortSignal }, input, acceptorChecks) => {\n var _a;\n const { state, reason } = await acceptorChecks(client, input);\n if (state !== waiter_1.WaiterState.RETRY) {\n return { state, reason };\n }\n let currentAttempt = 1;\n const waitUntil = Date.now() + maxWaitTime * 1000;\n const attemptCeiling = Math.log(maxDelay / minDelay) / Math.log(2) + 1;\n while (true) {\n if (((_a = abortController === null || abortController === void 0 ? void 0 : abortController.signal) === null || _a === void 0 ? void 0 : _a.aborted) || (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted)) {\n return { state: waiter_1.WaiterState.ABORTED };\n }\n const delay = exponentialBackoffWithJitter(minDelay, maxDelay, attemptCeiling, currentAttempt);\n if (Date.now() + delay * 1000 > waitUntil) {\n return { state: waiter_1.WaiterState.TIMEOUT };\n }\n await (0, sleep_1.sleep)(delay);\n const { state, reason } = await acceptorChecks(client, input);\n if (state !== waiter_1.WaiterState.RETRY) {\n return { state, reason };\n }\n currentAttempt += 1;\n }\n};\nexports.runPolling = runPolling;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst tslib_1 = require(\"tslib\");\ntslib_1.__exportStar(require(\"./sleep\"), exports);\ntslib_1.__exportStar(require(\"./validate\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sleep = void 0;\nconst sleep = (seconds) => {\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n};\nexports.sleep = sleep;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateWaiterOptions = void 0;\nconst validateWaiterOptions = (options) => {\n if (options.maxWaitTime < 1) {\n throw new Error(`WaiterConfiguration.maxWaitTime must be greater than 0`);\n }\n else if (options.minDelay < 1) {\n throw new Error(`WaiterConfiguration.minDelay must be greater than 0`);\n }\n else if (options.maxDelay < 1) {\n throw new Error(`WaiterConfiguration.maxDelay must be greater than 0`);\n }\n else if (options.maxWaitTime <= options.minDelay) {\n throw new Error(`WaiterConfiguration.maxWaitTime [${options.maxWaitTime}] must be greater than WaiterConfiguration.minDelay [${options.minDelay}] for this waiter`);\n }\n else if (options.maxDelay < options.minDelay) {\n throw new Error(`WaiterConfiguration.maxDelay [${options.maxDelay}] must be greater than WaiterConfiguration.minDelay [${options.minDelay}] for this waiter`);\n }\n};\nexports.validateWaiterOptions = validateWaiterOptions;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.checkExceptions = exports.WaiterState = exports.waiterServiceDefaults = void 0;\nexports.waiterServiceDefaults = {\n minDelay: 2,\n maxDelay: 120,\n};\nvar WaiterState;\n(function (WaiterState) {\n WaiterState[\"ABORTED\"] = \"ABORTED\";\n WaiterState[\"FAILURE\"] = \"FAILURE\";\n WaiterState[\"SUCCESS\"] = \"SUCCESS\";\n WaiterState[\"RETRY\"] = \"RETRY\";\n WaiterState[\"TIMEOUT\"] = \"TIMEOUT\";\n})(WaiterState = exports.WaiterState || (exports.WaiterState = {}));\nconst checkExceptions = (result) => {\n if (result.state === WaiterState.ABORTED) {\n const abortError = new Error(`${JSON.stringify({\n ...result,\n reason: \"Request was aborted\",\n })}`);\n abortError.name = \"AbortError\";\n throw abortError;\n }\n else if (result.state === WaiterState.TIMEOUT) {\n const timeoutError = new Error(`${JSON.stringify({\n ...result,\n reason: \"Waiter has timed out\",\n })}`);\n timeoutError.name = \"TimeoutError\";\n throw timeoutError;\n }\n else if (result.state !== WaiterState.SUCCESS) {\n throw new Error(`${JSON.stringify({ result })}`);\n }\n return result;\n};\nexports.checkExceptions = checkExceptions;\n","'use strict';\n\nmodule.exports = ({onlyFirst = false} = {}) => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n};\n","'use strict';\n\nconst wrapAnsi16 = (fn, offset) => (...args) => {\n\tconst code = fn(...args);\n\treturn `\\u001B[${code + offset}m`;\n};\n\nconst wrapAnsi256 = (fn, offset) => (...args) => {\n\tconst code = fn(...args);\n\treturn `\\u001B[${38 + offset};5;${code}m`;\n};\n\nconst wrapAnsi16m = (fn, offset) => (...args) => {\n\tconst rgb = fn(...args);\n\treturn `\\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;\n};\n\nconst ansi2ansi = n => n;\nconst rgb2rgb = (r, g, b) => [r, g, b];\n\nconst setLazyProperty = (object, property, get) => {\n\tObject.defineProperty(object, property, {\n\t\tget: () => {\n\t\t\tconst value = get();\n\n\t\t\tObject.defineProperty(object, property, {\n\t\t\t\tvalue,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true\n\t\t\t});\n\n\t\t\treturn value;\n\t\t},\n\t\tenumerable: true,\n\t\tconfigurable: true\n\t});\n};\n\n/** @type {typeof import('color-convert')} */\nlet colorConvert;\nconst makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {\n\tif (colorConvert === undefined) {\n\t\tcolorConvert = require('color-convert');\n\t}\n\n\tconst offset = isBackground ? 10 : 0;\n\tconst styles = {};\n\n\tfor (const [sourceSpace, suite] of Object.entries(colorConvert)) {\n\t\tconst name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace;\n\t\tif (sourceSpace === targetSpace) {\n\t\t\tstyles[name] = wrap(identity, offset);\n\t\t} else if (typeof suite === 'object') {\n\t\t\tstyles[name] = wrap(suite[targetSpace], offset);\n\t\t}\n\t}\n\n\treturn styles;\n};\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\tconst styles = {\n\t\tmodifier: {\n\t\t\treset: [0, 0],\n\t\t\t// 21 isn't widely supported and 22 does the same thing\n\t\t\tbold: [1, 22],\n\t\t\tdim: [2, 22],\n\t\t\titalic: [3, 23],\n\t\t\tunderline: [4, 24],\n\t\t\tinverse: [7, 27],\n\t\t\thidden: [8, 28],\n\t\t\tstrikethrough: [9, 29]\n\t\t},\n\t\tcolor: {\n\t\t\tblack: [30, 39],\n\t\t\tred: [31, 39],\n\t\t\tgreen: [32, 39],\n\t\t\tyellow: [33, 39],\n\t\t\tblue: [34, 39],\n\t\t\tmagenta: [35, 39],\n\t\t\tcyan: [36, 39],\n\t\t\twhite: [37, 39],\n\n\t\t\t// Bright color\n\t\t\tblackBright: [90, 39],\n\t\t\tredBright: [91, 39],\n\t\t\tgreenBright: [92, 39],\n\t\t\tyellowBright: [93, 39],\n\t\t\tblueBright: [94, 39],\n\t\t\tmagentaBright: [95, 39],\n\t\t\tcyanBright: [96, 39],\n\t\t\twhiteBright: [97, 39]\n\t\t},\n\t\tbgColor: {\n\t\t\tbgBlack: [40, 49],\n\t\t\tbgRed: [41, 49],\n\t\t\tbgGreen: [42, 49],\n\t\t\tbgYellow: [43, 49],\n\t\t\tbgBlue: [44, 49],\n\t\t\tbgMagenta: [45, 49],\n\t\t\tbgCyan: [46, 49],\n\t\t\tbgWhite: [47, 49],\n\n\t\t\t// Bright color\n\t\t\tbgBlackBright: [100, 49],\n\t\t\tbgRedBright: [101, 49],\n\t\t\tbgGreenBright: [102, 49],\n\t\t\tbgYellowBright: [103, 49],\n\t\t\tbgBlueBright: [104, 49],\n\t\t\tbgMagentaBright: [105, 49],\n\t\t\tbgCyanBright: [106, 49],\n\t\t\tbgWhiteBright: [107, 49]\n\t\t}\n\t};\n\n\t// Alias bright black as gray (and grey)\n\tstyles.color.gray = styles.color.blackBright;\n\tstyles.bgColor.bgGray = styles.bgColor.bgBlackBright;\n\tstyles.color.grey = styles.color.blackBright;\n\tstyles.bgColor.bgGrey = styles.bgColor.bgBlackBright;\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tsetLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false));\n\tsetLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false));\n\tsetLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false));\n\tsetLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true));\n\tsetLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true));\n\tsetLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true));\n\n\treturn styles;\n}\n\n// Make the export immutable\nObject.defineProperty(module, 'exports', {\n\tenumerable: true,\n\tget: assembleStyles\n});\n","'use strict';\nconst regex = '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]';\n\nconst astralRegex = options => options && options.exact ? new RegExp(`^${regex}$`) : new RegExp(regex, 'g');\n\nmodule.exports = astralRegex;\n","var register = require(\"./lib/register\");\nvar addHook = require(\"./lib/add\");\nvar removeHook = require(\"./lib/remove\");\n\n// bind with array of arguments: https://stackoverflow.com/a/21792913\nvar bind = Function.bind;\nvar bindable = bind.bind(bind);\n\nfunction bindApi(hook, state, name) {\n var removeHookRef = bindable(removeHook, null).apply(\n null,\n name ? [state, name] : [state]\n );\n hook.api = { remove: removeHookRef };\n hook.remove = removeHookRef;\n [\"before\", \"error\", \"after\", \"wrap\"].forEach(function (kind) {\n var args = name ? [state, kind, name] : [state, kind];\n hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args);\n });\n}\n\nfunction HookSingular() {\n var singularHookName = \"h\";\n var singularHookState = {\n registry: {},\n };\n var singularHook = register.bind(null, singularHookState, singularHookName);\n bindApi(singularHook, singularHookState, singularHookName);\n return singularHook;\n}\n\nfunction HookCollection() {\n var state = {\n registry: {},\n };\n\n var hook = register.bind(null, state);\n bindApi(hook, state);\n\n return hook;\n}\n\nvar collectionHookDeprecationMessageDisplayed = false;\nfunction Hook() {\n if (!collectionHookDeprecationMessageDisplayed) {\n console.warn(\n '[before-after-hook]: \"Hook()\" repurposing warning, use \"Hook.Collection()\". Read more: https://git.io/upgrade-before-after-hook-to-1.4'\n );\n collectionHookDeprecationMessageDisplayed = true;\n }\n return HookCollection();\n}\n\nHook.Singular = HookSingular.bind();\nHook.Collection = HookCollection.bind();\n\nmodule.exports = Hook;\n// expose constructors as a named property for TypeScript\nmodule.exports.Hook = Hook;\nmodule.exports.Singular = Hook.Singular;\nmodule.exports.Collection = Hook.Collection;\n","module.exports = addHook;\n\nfunction addHook(state, kind, name, hook) {\n var orig = hook;\n if (!state.registry[name]) {\n state.registry[name] = [];\n }\n\n if (kind === \"before\") {\n hook = function (method, options) {\n return Promise.resolve()\n .then(orig.bind(null, options))\n .then(method.bind(null, options));\n };\n }\n\n if (kind === \"after\") {\n hook = function (method, options) {\n var result;\n return Promise.resolve()\n .then(method.bind(null, options))\n .then(function (result_) {\n result = result_;\n return orig(result, options);\n })\n .then(function () {\n return result;\n });\n };\n }\n\n if (kind === \"error\") {\n hook = function (method, options) {\n return Promise.resolve()\n .then(method.bind(null, options))\n .catch(function (error) {\n return orig(error, options);\n });\n };\n }\n\n state.registry[name].push({\n hook: hook,\n orig: orig,\n });\n}\n","module.exports = register;\n\nfunction register(state, name, method, options) {\n if (typeof method !== \"function\") {\n throw new Error(\"method for before hook must be a function\");\n }\n\n if (!options) {\n options = {};\n }\n\n if (Array.isArray(name)) {\n return name.reverse().reduce(function (callback, name) {\n return register.bind(null, state, name, callback, options);\n }, method)();\n }\n\n return Promise.resolve().then(function () {\n if (!state.registry[name]) {\n return method(options);\n }\n\n return state.registry[name].reduce(function (method, registered) {\n return registered.hook.bind(null, method, options);\n }, method)();\n });\n}\n","module.exports = removeHook;\n\nfunction removeHook(state, name, method) {\n if (!state.registry[name]) {\n return;\n }\n\n var index = state.registry[name]\n .map(function (registered) {\n return registered.orig;\n })\n .indexOf(method);\n\n if (index === -1) {\n return;\n }\n\n state.registry[name].splice(index, 1);\n}\n","'use strict';\nconst ansiStyles = require('ansi-styles');\nconst {stdout: stdoutColor, stderr: stderrColor} = require('supports-color');\nconst {\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex\n} = require('./util');\n\nconst {isArray} = Array;\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m'\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nclass ChalkClass {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = {};\n\tapplyOptions(chalk, options);\n\n\tchalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_);\n\n\tObject.setPrototypeOf(chalk, Chalk.prototype);\n\tObject.setPrototypeOf(chalk.template, chalk);\n\n\tchalk.template.constructor = () => {\n\t\tthrow new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.');\n\t};\n\n\tchalk.template.Instance = ChalkClass;\n\n\treturn chalk.template;\n};\n\nfunction Chalk(options) {\n\treturn chalkFactory(options);\n}\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t}\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this._styler, true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t}\n};\n\nconst usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler);\n\t\t\t\treturn createBuilder(this, styler, this._isEmpty);\n\t\t\t};\n\t\t}\n\t};\n}\n\nfor (const model of usedModels) {\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler);\n\t\t\t\treturn createBuilder(this, styler, this._isEmpty);\n\t\t\t};\n\t\t}\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this._generator.level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis._generator.level = level;\n\t\t}\n\t}\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\tconst builder = (...arguments_) => {\n\t\tif (isArray(arguments_[0]) && isArray(arguments_[0].raw)) {\n\t\t\t// Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}`\n\t\t\treturn applyStyle(builder, chalkTag(builder, ...arguments_));\n\t\t}\n\n\t\t// Single argument is hot path, implicit coercion is faster than anything\n\t\t// eslint-disable-next-line no-implicit-coercion\n\t\treturn applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\t};\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder._generator = self;\n\tbuilder._styler = _styler;\n\tbuilder._isEmpty = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self._isEmpty ? '' : string;\n\t}\n\n\tlet styler = self._styler;\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.indexOf('\\u001B') !== -1) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nlet template;\nconst chalkTag = (chalk, ...strings) => {\n\tconst [firstString] = strings;\n\n\tif (!isArray(firstString) || !isArray(firstString.raw)) {\n\t\t// If chalk() was called by itself or with a string,\n\t\t// return the string itself as a string.\n\t\treturn strings.join(' ');\n\t}\n\n\tconst arguments_ = strings.slice(1);\n\tconst parts = [firstString.raw[0]];\n\n\tfor (let i = 1; i < firstString.length; i++) {\n\t\tparts.push(\n\t\t\tString(arguments_[i - 1]).replace(/[{}\\\\]/g, '\\\\$&'),\n\t\t\tString(firstString.raw[i])\n\t\t);\n\t}\n\n\tif (template === undefined) {\n\t\ttemplate = require('./templates');\n\t}\n\n\treturn template(chalk, parts.join(''));\n};\n\nObject.defineProperties(Chalk.prototype, styles);\n\nconst chalk = Chalk(); // eslint-disable-line new-cap\nchalk.supportsColor = stdoutColor;\nchalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap\nchalk.stderr.supportsColor = stderrColor;\n\nmodule.exports = chalk;\n","'use strict';\nconst TEMPLATE_REGEX = /(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi;\nconst STYLE_REGEX = /(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g;\nconst STRING_REGEX = /^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/;\nconst ESCAPE_REGEX = /\\\\(u(?:[a-f\\d]{4}|{[a-f\\d]{1,6}})|x[a-f\\d]{2}|.)|([^\\\\])/gi;\n\nconst ESCAPES = new Map([\n\t['n', '\\n'],\n\t['r', '\\r'],\n\t['t', '\\t'],\n\t['b', '\\b'],\n\t['f', '\\f'],\n\t['v', '\\v'],\n\t['0', '\\0'],\n\t['\\\\', '\\\\'],\n\t['e', '\\u001B'],\n\t['a', '\\u0007']\n]);\n\nfunction unescape(c) {\n\tconst u = c[0] === 'u';\n\tconst bracket = c[1] === '{';\n\n\tif ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) {\n\t\treturn String.fromCharCode(parseInt(c.slice(1), 16));\n\t}\n\n\tif (u && bracket) {\n\t\treturn String.fromCodePoint(parseInt(c.slice(2, -1), 16));\n\t}\n\n\treturn ESCAPES.get(c) || c;\n}\n\nfunction parseArguments(name, arguments_) {\n\tconst results = [];\n\tconst chunks = arguments_.trim().split(/\\s*,\\s*/g);\n\tlet matches;\n\n\tfor (const chunk of chunks) {\n\t\tconst number = Number(chunk);\n\t\tif (!Number.isNaN(number)) {\n\t\t\tresults.push(number);\n\t\t} else if ((matches = chunk.match(STRING_REGEX))) {\n\t\t\tresults.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character));\n\t\t} else {\n\t\t\tthrow new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction parseStyle(style) {\n\tSTYLE_REGEX.lastIndex = 0;\n\n\tconst results = [];\n\tlet matches;\n\n\twhile ((matches = STYLE_REGEX.exec(style)) !== null) {\n\t\tconst name = matches[1];\n\n\t\tif (matches[2]) {\n\t\t\tconst args = parseArguments(name, matches[2]);\n\t\t\tresults.push([name].concat(args));\n\t\t} else {\n\t\t\tresults.push([name]);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction buildStyle(chalk, styles) {\n\tconst enabled = {};\n\n\tfor (const layer of styles) {\n\t\tfor (const style of layer.styles) {\n\t\t\tenabled[style[0]] = layer.inverse ? null : style.slice(1);\n\t\t}\n\t}\n\n\tlet current = chalk;\n\tfor (const [styleName, styles] of Object.entries(enabled)) {\n\t\tif (!Array.isArray(styles)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!(styleName in current)) {\n\t\t\tthrow new Error(`Unknown Chalk style: ${styleName}`);\n\t\t}\n\n\t\tcurrent = styles.length > 0 ? current[styleName](...styles) : current[styleName];\n\t}\n\n\treturn current;\n}\n\nmodule.exports = (chalk, temporary) => {\n\tconst styles = [];\n\tconst chunks = [];\n\tlet chunk = [];\n\n\t// eslint-disable-next-line max-params\n\ttemporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => {\n\t\tif (escapeCharacter) {\n\t\t\tchunk.push(unescape(escapeCharacter));\n\t\t} else if (style) {\n\t\t\tconst string = chunk.join('');\n\t\t\tchunk = [];\n\t\t\tchunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string));\n\t\t\tstyles.push({inverse, styles: parseStyle(style)});\n\t\t} else if (close) {\n\t\t\tif (styles.length === 0) {\n\t\t\t\tthrow new Error('Found extraneous } in Chalk template literal');\n\t\t\t}\n\n\t\t\tchunks.push(buildStyle(chalk, styles)(chunk.join('')));\n\t\t\tchunk = [];\n\t\t\tstyles.pop();\n\t\t} else {\n\t\t\tchunk.push(character);\n\t\t}\n\t});\n\n\tchunks.push(chunk.join(''));\n\n\tif (styles.length > 0) {\n\t\tconst errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\\`}\\`)`;\n\t\tthrow new Error(errMessage);\n\t}\n\n\treturn chunks.join('');\n};\n","'use strict';\n\nconst stringReplaceAll = (string, substring, replacer) => {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.substr(endIndex, index - endIndex) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.substr(endIndex);\n\treturn returnValue;\n};\n\nconst stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.substr(endIndex);\n\treturn returnValue;\n};\n\nmodule.exports = {\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex\n};\n","/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `typeof` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n","const conversions = require('./conversions');\nconst route = require('./route');\n\nconst convert = {};\n\nconst models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\tconst result = fn(args);\n\n\t\t// We're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (let len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(fromModel => {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tconst routes = route(fromModel);\n\tconst routeModels = Object.keys(routes);\n\n\trouteModels.forEach(toModel => {\n\t\tconst fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n","const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nclass Deprecation extends Error {\n constructor(message) {\n super(message); // Maintains proper stack trace (only available on V8)\n\n /* istanbul ignore next */\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n\n this.name = 'Deprecation';\n }\n\n}\n\nexports.Deprecation = Deprecation;\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.convertChangesToDMP = convertChangesToDMP;\n\n/*istanbul ignore end*/\n// See: http://code.google.com/p/google-diff-match-patch/wiki/API\nfunction convertChangesToDMP(changes) {\n var ret = [],\n change,\n operation;\n\n for (var i = 0; i < changes.length; i++) {\n change = changes[i];\n\n if (change.added) {\n operation = 1;\n } else if (change.removed) {\n operation = -1;\n } else {\n operation = 0;\n }\n\n ret.push([operation, change.value]);\n }\n\n return ret;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb252ZXJ0L2RtcC5qcyJdLCJuYW1lcyI6WyJjb252ZXJ0Q2hhbmdlc1RvRE1QIiwiY2hhbmdlcyIsInJldCIsImNoYW5nZSIsIm9wZXJhdGlvbiIsImkiLCJsZW5ndGgiLCJhZGRlZCIsInJlbW92ZWQiLCJwdXNoIiwidmFsdWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ08sU0FBU0EsbUJBQVQsQ0FBNkJDLE9BQTdCLEVBQXNDO0FBQzNDLE1BQUlDLEdBQUcsR0FBRyxFQUFWO0FBQUEsTUFDSUMsTUFESjtBQUFBLE1BRUlDLFNBRko7O0FBR0EsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHSixPQUFPLENBQUNLLE1BQTVCLEVBQW9DRCxDQUFDLEVBQXJDLEVBQXlDO0FBQ3ZDRixJQUFBQSxNQUFNLEdBQUdGLE9BQU8sQ0FBQ0ksQ0FBRCxDQUFoQjs7QUFDQSxRQUFJRixNQUFNLENBQUNJLEtBQVgsRUFBa0I7QUFDaEJILE1BQUFBLFNBQVMsR0FBRyxDQUFaO0FBQ0QsS0FGRCxNQUVPLElBQUlELE1BQU0sQ0FBQ0ssT0FBWCxFQUFvQjtBQUN6QkosTUFBQUEsU0FBUyxHQUFHLENBQUMsQ0FBYjtBQUNELEtBRk0sTUFFQTtBQUNMQSxNQUFBQSxTQUFTLEdBQUcsQ0FBWjtBQUNEOztBQUVERixJQUFBQSxHQUFHLENBQUNPLElBQUosQ0FBUyxDQUFDTCxTQUFELEVBQVlELE1BQU0sQ0FBQ08sS0FBbkIsQ0FBVDtBQUNEOztBQUNELFNBQU9SLEdBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIFNlZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoL3dpa2kvQVBJXG5leHBvcnQgZnVuY3Rpb24gY29udmVydENoYW5nZXNUb0RNUChjaGFuZ2VzKSB7XG4gIGxldCByZXQgPSBbXSxcbiAgICAgIGNoYW5nZSxcbiAgICAgIG9wZXJhdGlvbjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhbmdlID0gY2hhbmdlc1tpXTtcbiAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICBvcGVyYXRpb24gPSAxO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgIG9wZXJhdGlvbiA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIHJldC5wdXNoKFtvcGVyYXRpb24sIGNoYW5nZS52YWx1ZV0pO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.convertChangesToXML = convertChangesToXML;\n\n/*istanbul ignore end*/\nfunction convertChangesToXML(changes) {\n var ret = [];\n\n for (var i = 0; i < changes.length; i++) {\n var change = changes[i];\n\n if (change.added) {\n ret.push('');\n } else if (change.removed) {\n ret.push('');\n }\n\n ret.push(escapeHTML(change.value));\n\n if (change.added) {\n ret.push('');\n } else if (change.removed) {\n ret.push('');\n }\n }\n\n return ret.join('');\n}\n\nfunction escapeHTML(s) {\n var n = s;\n n = n.replace(/&/g, '&');\n n = n.replace(//g, '>');\n n = n.replace(/\"/g, '"');\n return n;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb252ZXJ0L3htbC5qcyJdLCJuYW1lcyI6WyJjb252ZXJ0Q2hhbmdlc1RvWE1MIiwiY2hhbmdlcyIsInJldCIsImkiLCJsZW5ndGgiLCJjaGFuZ2UiLCJhZGRlZCIsInB1c2giLCJyZW1vdmVkIiwiZXNjYXBlSFRNTCIsInZhbHVlIiwiam9pbiIsInMiLCJuIiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQU8sU0FBU0EsbUJBQVQsQ0FBNkJDLE9BQTdCLEVBQXNDO0FBQzNDLE1BQUlDLEdBQUcsR0FBRyxFQUFWOztBQUNBLE9BQUssSUFBSUMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0YsT0FBTyxDQUFDRyxNQUE1QixFQUFvQ0QsQ0FBQyxFQUFyQyxFQUF5QztBQUN2QyxRQUFJRSxNQUFNLEdBQUdKLE9BQU8sQ0FBQ0UsQ0FBRCxDQUFwQjs7QUFDQSxRQUFJRSxNQUFNLENBQUNDLEtBQVgsRUFBa0I7QUFDaEJKLE1BQUFBLEdBQUcsQ0FBQ0ssSUFBSixDQUFTLE9BQVQ7QUFDRCxLQUZELE1BRU8sSUFBSUYsTUFBTSxDQUFDRyxPQUFYLEVBQW9CO0FBQ3pCTixNQUFBQSxHQUFHLENBQUNLLElBQUosQ0FBUyxPQUFUO0FBQ0Q7O0FBRURMLElBQUFBLEdBQUcsQ0FBQ0ssSUFBSixDQUFTRSxVQUFVLENBQUNKLE1BQU0sQ0FBQ0ssS0FBUixDQUFuQjs7QUFFQSxRQUFJTCxNQUFNLENBQUNDLEtBQVgsRUFBa0I7QUFDaEJKLE1BQUFBLEdBQUcsQ0FBQ0ssSUFBSixDQUFTLFFBQVQ7QUFDRCxLQUZELE1BRU8sSUFBSUYsTUFBTSxDQUFDRyxPQUFYLEVBQW9CO0FBQ3pCTixNQUFBQSxHQUFHLENBQUNLLElBQUosQ0FBUyxRQUFUO0FBQ0Q7QUFDRjs7QUFDRCxTQUFPTCxHQUFHLENBQUNTLElBQUosQ0FBUyxFQUFULENBQVA7QUFDRDs7QUFFRCxTQUFTRixVQUFULENBQW9CRyxDQUFwQixFQUF1QjtBQUNyQixNQUFJQyxDQUFDLEdBQUdELENBQVI7QUFDQUMsRUFBQUEsQ0FBQyxHQUFHQSxDQUFDLENBQUNDLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLE9BQWhCLENBQUo7QUFDQUQsRUFBQUEsQ0FBQyxHQUFHQSxDQUFDLENBQUNDLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLE1BQWhCLENBQUo7QUFDQUQsRUFBQUEsQ0FBQyxHQUFHQSxDQUFDLENBQUNDLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLE1BQWhCLENBQUo7QUFDQUQsRUFBQUEsQ0FBQyxHQUFHQSxDQUFDLENBQUNDLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLFFBQWhCLENBQUo7QUFFQSxTQUFPRCxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gY29udmVydENoYW5nZXNUb1hNTChjaGFuZ2VzKSB7XG4gIGxldCByZXQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGNoYW5nZSA9IGNoYW5nZXNbaV07XG4gICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgcmV0LnB1c2goJzxpbnM+Jyk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuICAgICAgcmV0LnB1c2goJzxkZWw+Jyk7XG4gICAgfVxuXG4gICAgcmV0LnB1c2goZXNjYXBlSFRNTChjaGFuZ2UudmFsdWUpKTtcblxuICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8L2lucz4nKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICByZXQucHVzaCgnPC9kZWw+Jyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUhUTUwocykge1xuICBsZXQgbiA9IHM7XG4gIG4gPSBuLnJlcGxhY2UoLyYvZywgJyZhbXA7Jyk7XG4gIG4gPSBuLnJlcGxhY2UoLzwvZywgJyZsdDsnKTtcbiAgbiA9IG4ucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuICBuID0gbi5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG5cbiAgcmV0dXJuIG47XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffArrays = diffArrays;\nexports.arrayDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nvar arrayDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.arrayDiff = arrayDiff;\n\n/*istanbul ignore end*/\narrayDiff.tokenize = function (value) {\n return value.slice();\n};\n\narrayDiff.join = arrayDiff.removeEmpty = function (value) {\n return value;\n};\n\nfunction diffArrays(oldArr, newArr, callback) {\n return arrayDiff.diff(oldArr, newArr, callback);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2FycmF5LmpzIl0sIm5hbWVzIjpbImFycmF5RGlmZiIsIkRpZmYiLCJ0b2tlbml6ZSIsInZhbHVlIiwic2xpY2UiLCJqb2luIiwicmVtb3ZlRW1wdHkiLCJkaWZmQXJyYXlzIiwib2xkQXJyIiwibmV3QXJyIiwiY2FsbGJhY2siLCJkaWZmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxJQUFNQSxTQUFTLEdBQUc7QUFBSUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsQ0FBSixFQUFsQjs7Ozs7O0FBQ1BELFNBQVMsQ0FBQ0UsUUFBVixHQUFxQixVQUFTQyxLQUFULEVBQWdCO0FBQ25DLFNBQU9BLEtBQUssQ0FBQ0MsS0FBTixFQUFQO0FBQ0QsQ0FGRDs7QUFHQUosU0FBUyxDQUFDSyxJQUFWLEdBQWlCTCxTQUFTLENBQUNNLFdBQVYsR0FBd0IsVUFBU0gsS0FBVCxFQUFnQjtBQUN2RCxTQUFPQSxLQUFQO0FBQ0QsQ0FGRDs7QUFJTyxTQUFTSSxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsTUFBNUIsRUFBb0NDLFFBQXBDLEVBQThDO0FBQUUsU0FBT1YsU0FBUyxDQUFDVyxJQUFWLENBQWVILE1BQWYsRUFBdUJDLE1BQXZCLEVBQStCQyxRQUEvQixDQUFQO0FBQWtEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGNvbnN0IGFycmF5RGlmZiA9IG5ldyBEaWZmKCk7XG5hcnJheURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc2xpY2UoKTtcbn07XG5hcnJheURpZmYuam9pbiA9IGFycmF5RGlmZi5yZW1vdmVFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQXJyYXlzKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjaykgeyByZXR1cm4gYXJyYXlEaWZmLmRpZmYob2xkQXJyLCBuZXdBcnIsIGNhbGxiYWNrKTsgfVxuIl19\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = Diff;\n\n/*istanbul ignore end*/\nfunction Diff() {}\n\nDiff.prototype = {\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n diff: function diff(oldString, newString) {\n /*istanbul ignore start*/\n var\n /*istanbul ignore end*/\n options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var callback = options.callback;\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n this.options = options;\n var self = this;\n\n function done(value) {\n if (callback) {\n setTimeout(function () {\n callback(undefined, value);\n }, 0);\n return true;\n } else {\n return value;\n }\n } // Allow subclasses to massage the input prior to running\n\n\n oldString = this.castInput(oldString);\n newString = this.castInput(newString);\n oldString = this.removeEmpty(this.tokenize(oldString));\n newString = this.removeEmpty(this.tokenize(newString));\n var newLen = newString.length,\n oldLen = oldString.length;\n var editLength = 1;\n var maxEditLength = newLen + oldLen;\n\n if (options.maxEditLength) {\n maxEditLength = Math.min(maxEditLength, options.maxEditLength);\n }\n\n var bestPath = [{\n newPos: -1,\n components: []\n }]; // Seed editLength = 0, i.e. the content starts with the same values\n\n var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);\n\n if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\n // Identity per the equality and tokenizer\n return done([{\n value: this.join(newString),\n count: newString.length\n }]);\n } // Main worker method. checks all permutations of a given edit length for acceptance.\n\n\n function execEditLength() {\n for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {\n var basePath =\n /*istanbul ignore start*/\n void 0\n /*istanbul ignore end*/\n ;\n\n var addPath = bestPath[diagonalPath - 1],\n removePath = bestPath[diagonalPath + 1],\n _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;\n\n if (addPath) {\n // No one else is going to attempt to use this value, clear it\n bestPath[diagonalPath - 1] = undefined;\n }\n\n var canAdd = addPath && addPath.newPos + 1 < newLen,\n canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;\n\n if (!canAdd && !canRemove) {\n // If this path is a terminal then prune\n bestPath[diagonalPath] = undefined;\n continue;\n } // Select the diagonal that we want to branch from. We select the prior\n // path whose position in the new string is the farthest from the origin\n // and does not pass the bounds of the diff graph\n\n\n if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {\n basePath = clonePath(removePath);\n self.pushComponent(basePath.components, undefined, true);\n } else {\n basePath = addPath; // No need to clone, we've pulled it from the list\n\n basePath.newPos++;\n self.pushComponent(basePath.components, true, undefined);\n }\n\n _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done\n\n if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {\n return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));\n } else {\n // Otherwise track this path as a potential candidate and continue.\n bestPath[diagonalPath] = basePath;\n }\n }\n\n editLength++;\n } // Performs the length of edit iteration. Is a bit fugly as this has to support the\n // sync and async mode which is never fun. Loops over execEditLength until a value\n // is produced, or until the edit length exceeds options.maxEditLength (if given),\n // in which case it will return undefined.\n\n\n if (callback) {\n (function exec() {\n setTimeout(function () {\n if (editLength > maxEditLength) {\n return callback();\n }\n\n if (!execEditLength()) {\n exec();\n }\n }, 0);\n })();\n } else {\n while (editLength <= maxEditLength) {\n var ret = execEditLength();\n\n if (ret) {\n return ret;\n }\n }\n }\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n pushComponent: function pushComponent(components, added, removed) {\n var last = components[components.length - 1];\n\n if (last && last.added === added && last.removed === removed) {\n // We need to clone here as the component clone operation is just\n // as shallow array clone\n components[components.length - 1] = {\n count: last.count + 1,\n added: added,\n removed: removed\n };\n } else {\n components.push({\n count: 1,\n added: added,\n removed: removed\n });\n }\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {\n var newLen = newString.length,\n oldLen = oldString.length,\n newPos = basePath.newPos,\n oldPos = newPos - diagonalPath,\n commonCount = 0;\n\n while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {\n newPos++;\n oldPos++;\n commonCount++;\n }\n\n if (commonCount) {\n basePath.components.push({\n count: commonCount\n });\n }\n\n basePath.newPos = newPos;\n return oldPos;\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n equals: function equals(left, right) {\n if (this.options.comparator) {\n return this.options.comparator(left, right);\n } else {\n return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();\n }\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n removeEmpty: function removeEmpty(array) {\n var ret = [];\n\n for (var i = 0; i < array.length; i++) {\n if (array[i]) {\n ret.push(array[i]);\n }\n }\n\n return ret;\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n castInput: function castInput(value) {\n return value;\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n tokenize: function tokenize(value) {\n return value.split('');\n },\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n join: function join(chars) {\n return chars.join('');\n }\n};\n\nfunction buildValues(diff, components, newString, oldString, useLongestToken) {\n var componentPos = 0,\n componentLen = components.length,\n newPos = 0,\n oldPos = 0;\n\n for (; componentPos < componentLen; componentPos++) {\n var component = components[componentPos];\n\n if (!component.removed) {\n if (!component.added && useLongestToken) {\n var value = newString.slice(newPos, newPos + component.count);\n value = value.map(function (value, i) {\n var oldValue = oldString[oldPos + i];\n return oldValue.length > value.length ? oldValue : value;\n });\n component.value = diff.join(value);\n } else {\n component.value = diff.join(newString.slice(newPos, newPos + component.count));\n }\n\n newPos += component.count; // Common case\n\n if (!component.added) {\n oldPos += component.count;\n }\n } else {\n component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));\n oldPos += component.count; // Reverse add and remove so removes are output first to match common convention\n // The diffing algorithm is tied to add then remove output and this is the simplest\n // route to get the desired output with minimal overhead.\n\n if (componentPos && components[componentPos - 1].added) {\n var tmp = components[componentPos - 1];\n components[componentPos - 1] = components[componentPos];\n components[componentPos] = tmp;\n }\n }\n } // Special case handle for when one terminal is ignored (i.e. whitespace).\n // For this case we merge the terminal into the prior string and drop the change.\n // This is only available for string mode.\n\n\n var lastComponent = components[componentLen - 1];\n\n if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {\n components[componentLen - 2].value += lastComponent.value;\n components.pop();\n }\n\n return components;\n}\n\nfunction clonePath(path) {\n return {\n newPos: path.newPos,\n components: path.components.slice(0)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Jhc2UuanMiXSwibmFtZXMiOlsiRGlmZiIsInByb3RvdHlwZSIsImRpZmYiLCJvbGRTdHJpbmciLCJuZXdTdHJpbmciLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZWxmIiwiZG9uZSIsInZhbHVlIiwic2V0VGltZW91dCIsInVuZGVmaW5lZCIsImNhc3RJbnB1dCIsInJlbW92ZUVtcHR5IiwidG9rZW5pemUiLCJuZXdMZW4iLCJsZW5ndGgiLCJvbGRMZW4iLCJlZGl0TGVuZ3RoIiwibWF4RWRpdExlbmd0aCIsIk1hdGgiLCJtaW4iLCJiZXN0UGF0aCIsIm5ld1BvcyIsImNvbXBvbmVudHMiLCJvbGRQb3MiLCJleHRyYWN0Q29tbW9uIiwiam9pbiIsImNvdW50IiwiZXhlY0VkaXRMZW5ndGgiLCJkaWFnb25hbFBhdGgiLCJiYXNlUGF0aCIsImFkZFBhdGgiLCJyZW1vdmVQYXRoIiwiY2FuQWRkIiwiY2FuUmVtb3ZlIiwiY2xvbmVQYXRoIiwicHVzaENvbXBvbmVudCIsImJ1aWxkVmFsdWVzIiwidXNlTG9uZ2VzdFRva2VuIiwiZXhlYyIsInJldCIsImFkZGVkIiwicmVtb3ZlZCIsImxhc3QiLCJwdXNoIiwiY29tbW9uQ291bnQiLCJlcXVhbHMiLCJsZWZ0IiwicmlnaHQiLCJjb21wYXJhdG9yIiwiaWdub3JlQ2FzZSIsInRvTG93ZXJDYXNlIiwiYXJyYXkiLCJpIiwic3BsaXQiLCJjaGFycyIsImNvbXBvbmVudFBvcyIsImNvbXBvbmVudExlbiIsImNvbXBvbmVudCIsInNsaWNlIiwibWFwIiwib2xkVmFsdWUiLCJ0bXAiLCJsYXN0Q29tcG9uZW50IiwicG9wIiwicGF0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQWUsU0FBU0EsSUFBVCxHQUFnQixDQUFFOztBQUVqQ0EsSUFBSSxDQUFDQyxTQUFMLEdBQWlCO0FBQUE7O0FBQUE7QUFDZkMsRUFBQUEsSUFEZSxnQkFDVkMsU0FEVSxFQUNDQyxTQURELEVBQzBCO0FBQUE7QUFBQTtBQUFBO0FBQWRDLElBQUFBLE9BQWMsdUVBQUosRUFBSTtBQUN2QyxRQUFJQyxRQUFRLEdBQUdELE9BQU8sQ0FBQ0MsUUFBdkI7O0FBQ0EsUUFBSSxPQUFPRCxPQUFQLEtBQW1CLFVBQXZCLEVBQW1DO0FBQ2pDQyxNQUFBQSxRQUFRLEdBQUdELE9BQVg7QUFDQUEsTUFBQUEsT0FBTyxHQUFHLEVBQVY7QUFDRDs7QUFDRCxTQUFLQSxPQUFMLEdBQWVBLE9BQWY7QUFFQSxRQUFJRSxJQUFJLEdBQUcsSUFBWDs7QUFFQSxhQUFTQyxJQUFULENBQWNDLEtBQWQsRUFBcUI7QUFDbkIsVUFBSUgsUUFBSixFQUFjO0FBQ1pJLFFBQUFBLFVBQVUsQ0FBQyxZQUFXO0FBQUVKLFVBQUFBLFFBQVEsQ0FBQ0ssU0FBRCxFQUFZRixLQUFaLENBQVI7QUFBNkIsU0FBM0MsRUFBNkMsQ0FBN0MsQ0FBVjtBQUNBLGVBQU8sSUFBUDtBQUNELE9BSEQsTUFHTztBQUNMLGVBQU9BLEtBQVA7QUFDRDtBQUNGLEtBakJzQyxDQW1CdkM7OztBQUNBTixJQUFBQSxTQUFTLEdBQUcsS0FBS1MsU0FBTCxDQUFlVCxTQUFmLENBQVo7QUFDQUMsSUFBQUEsU0FBUyxHQUFHLEtBQUtRLFNBQUwsQ0FBZVIsU0FBZixDQUFaO0FBRUFELElBQUFBLFNBQVMsR0FBRyxLQUFLVSxXQUFMLENBQWlCLEtBQUtDLFFBQUwsQ0FBY1gsU0FBZCxDQUFqQixDQUFaO0FBQ0FDLElBQUFBLFNBQVMsR0FBRyxLQUFLUyxXQUFMLENBQWlCLEtBQUtDLFFBQUwsQ0FBY1YsU0FBZCxDQUFqQixDQUFaO0FBRUEsUUFBSVcsTUFBTSxHQUFHWCxTQUFTLENBQUNZLE1BQXZCO0FBQUEsUUFBK0JDLE1BQU0sR0FBR2QsU0FBUyxDQUFDYSxNQUFsRDtBQUNBLFFBQUlFLFVBQVUsR0FBRyxDQUFqQjtBQUNBLFFBQUlDLGFBQWEsR0FBR0osTUFBTSxHQUFHRSxNQUE3Qjs7QUFDQSxRQUFHWixPQUFPLENBQUNjLGFBQVgsRUFBMEI7QUFDeEJBLE1BQUFBLGFBQWEsR0FBR0MsSUFBSSxDQUFDQyxHQUFMLENBQVNGLGFBQVQsRUFBd0JkLE9BQU8sQ0FBQ2MsYUFBaEMsQ0FBaEI7QUFDRDs7QUFFRCxRQUFJRyxRQUFRLEdBQUcsQ0FBQztBQUFFQyxNQUFBQSxNQUFNLEVBQUUsQ0FBQyxDQUFYO0FBQWNDLE1BQUFBLFVBQVUsRUFBRTtBQUExQixLQUFELENBQWYsQ0FqQ3VDLENBbUN2Qzs7QUFDQSxRQUFJQyxNQUFNLEdBQUcsS0FBS0MsYUFBTCxDQUFtQkosUUFBUSxDQUFDLENBQUQsQ0FBM0IsRUFBZ0NsQixTQUFoQyxFQUEyQ0QsU0FBM0MsRUFBc0QsQ0FBdEQsQ0FBYjs7QUFDQSxRQUFJbUIsUUFBUSxDQUFDLENBQUQsQ0FBUixDQUFZQyxNQUFaLEdBQXFCLENBQXJCLElBQTBCUixNQUExQixJQUFvQ1UsTUFBTSxHQUFHLENBQVQsSUFBY1IsTUFBdEQsRUFBOEQ7QUFDNUQ7QUFDQSxhQUFPVCxJQUFJLENBQUMsQ0FBQztBQUFDQyxRQUFBQSxLQUFLLEVBQUUsS0FBS2tCLElBQUwsQ0FBVXZCLFNBQVYsQ0FBUjtBQUE4QndCLFFBQUFBLEtBQUssRUFBRXhCLFNBQVMsQ0FBQ1k7QUFBL0MsT0FBRCxDQUFELENBQVg7QUFDRCxLQXhDc0MsQ0EwQ3ZDOzs7QUFDQSxhQUFTYSxjQUFULEdBQTBCO0FBQ3hCLFdBQUssSUFBSUMsWUFBWSxHQUFHLENBQUMsQ0FBRCxHQUFLWixVQUE3QixFQUF5Q1ksWUFBWSxJQUFJWixVQUF6RCxFQUFxRVksWUFBWSxJQUFJLENBQXJGLEVBQXdGO0FBQ3RGLFlBQUlDLFFBQVE7QUFBQTtBQUFBO0FBQVo7QUFBQTs7QUFDQSxZQUFJQyxPQUFPLEdBQUdWLFFBQVEsQ0FBQ1EsWUFBWSxHQUFHLENBQWhCLENBQXRCO0FBQUEsWUFDSUcsVUFBVSxHQUFHWCxRQUFRLENBQUNRLFlBQVksR0FBRyxDQUFoQixDQUR6QjtBQUFBLFlBRUlMLE9BQU0sR0FBRyxDQUFDUSxVQUFVLEdBQUdBLFVBQVUsQ0FBQ1YsTUFBZCxHQUF1QixDQUFsQyxJQUF1Q08sWUFGcEQ7O0FBR0EsWUFBSUUsT0FBSixFQUFhO0FBQ1g7QUFDQVYsVUFBQUEsUUFBUSxDQUFDUSxZQUFZLEdBQUcsQ0FBaEIsQ0FBUixHQUE2Qm5CLFNBQTdCO0FBQ0Q7O0FBRUQsWUFBSXVCLE1BQU0sR0FBR0YsT0FBTyxJQUFJQSxPQUFPLENBQUNULE1BQVIsR0FBaUIsQ0FBakIsR0FBcUJSLE1BQTdDO0FBQUEsWUFDSW9CLFNBQVMsR0FBR0YsVUFBVSxJQUFJLEtBQUtSLE9BQW5CLElBQTZCQSxPQUFNLEdBQUdSLE1BRHREOztBQUVBLFlBQUksQ0FBQ2lCLE1BQUQsSUFBVyxDQUFDQyxTQUFoQixFQUEyQjtBQUN6QjtBQUNBYixVQUFBQSxRQUFRLENBQUNRLFlBQUQsQ0FBUixHQUF5Qm5CLFNBQXpCO0FBQ0E7QUFDRCxTQWhCcUYsQ0FrQnRGO0FBQ0E7QUFDQTs7O0FBQ0EsWUFBSSxDQUFDdUIsTUFBRCxJQUFZQyxTQUFTLElBQUlILE9BQU8sQ0FBQ1QsTUFBUixHQUFpQlUsVUFBVSxDQUFDVixNQUF6RCxFQUFrRTtBQUNoRVEsVUFBQUEsUUFBUSxHQUFHSyxTQUFTLENBQUNILFVBQUQsQ0FBcEI7QUFDQTFCLFVBQUFBLElBQUksQ0FBQzhCLGFBQUwsQ0FBbUJOLFFBQVEsQ0FBQ1AsVUFBNUIsRUFBd0NiLFNBQXhDLEVBQW1ELElBQW5EO0FBQ0QsU0FIRCxNQUdPO0FBQ0xvQixVQUFBQSxRQUFRLEdBQUdDLE9BQVgsQ0FESyxDQUNlOztBQUNwQkQsVUFBQUEsUUFBUSxDQUFDUixNQUFUO0FBQ0FoQixVQUFBQSxJQUFJLENBQUM4QixhQUFMLENBQW1CTixRQUFRLENBQUNQLFVBQTVCLEVBQXdDLElBQXhDLEVBQThDYixTQUE5QztBQUNEOztBQUVEYyxRQUFBQSxPQUFNLEdBQUdsQixJQUFJLENBQUNtQixhQUFMLENBQW1CSyxRQUFuQixFQUE2QjNCLFNBQTdCLEVBQXdDRCxTQUF4QyxFQUFtRDJCLFlBQW5ELENBQVQsQ0E5QnNGLENBZ0N0Rjs7QUFDQSxZQUFJQyxRQUFRLENBQUNSLE1BQVQsR0FBa0IsQ0FBbEIsSUFBdUJSLE1BQXZCLElBQWlDVSxPQUFNLEdBQUcsQ0FBVCxJQUFjUixNQUFuRCxFQUEyRDtBQUN6RCxpQkFBT1QsSUFBSSxDQUFDOEIsV0FBVyxDQUFDL0IsSUFBRCxFQUFPd0IsUUFBUSxDQUFDUCxVQUFoQixFQUE0QnBCLFNBQTVCLEVBQXVDRCxTQUF2QyxFQUFrREksSUFBSSxDQUFDZ0MsZUFBdkQsQ0FBWixDQUFYO0FBQ0QsU0FGRCxNQUVPO0FBQ0w7QUFDQWpCLFVBQUFBLFFBQVEsQ0FBQ1EsWUFBRCxDQUFSLEdBQXlCQyxRQUF6QjtBQUNEO0FBQ0Y7O0FBRURiLE1BQUFBLFVBQVU7QUFDWCxLQXRGc0MsQ0F3RnZDO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxRQUFJWixRQUFKLEVBQWM7QUFDWCxnQkFBU2tDLElBQVQsR0FBZ0I7QUFDZjlCLFFBQUFBLFVBQVUsQ0FBQyxZQUFXO0FBQ3BCLGNBQUlRLFVBQVUsR0FBR0MsYUFBakIsRUFBZ0M7QUFDOUIsbUJBQU9iLFFBQVEsRUFBZjtBQUNEOztBQUVELGNBQUksQ0FBQ3VCLGNBQWMsRUFBbkIsRUFBdUI7QUFDckJXLFlBQUFBLElBQUk7QUFDTDtBQUNGLFNBUlMsRUFRUCxDQVJPLENBQVY7QUFTRCxPQVZBLEdBQUQ7QUFXRCxLQVpELE1BWU87QUFDTCxhQUFPdEIsVUFBVSxJQUFJQyxhQUFyQixFQUFvQztBQUNsQyxZQUFJc0IsR0FBRyxHQUFHWixjQUFjLEVBQXhCOztBQUNBLFlBQUlZLEdBQUosRUFBUztBQUNQLGlCQUFPQSxHQUFQO0FBQ0Q7QUFDRjtBQUNGO0FBQ0YsR0FqSGM7O0FBQUE7O0FBQUE7QUFtSGZKLEVBQUFBLGFBbkhlLHlCQW1IRGIsVUFuSEMsRUFtSFdrQixLQW5IWCxFQW1Ia0JDLE9BbkhsQixFQW1IMkI7QUFDeEMsUUFBSUMsSUFBSSxHQUFHcEIsVUFBVSxDQUFDQSxVQUFVLENBQUNSLE1BQVgsR0FBb0IsQ0FBckIsQ0FBckI7O0FBQ0EsUUFBSTRCLElBQUksSUFBSUEsSUFBSSxDQUFDRixLQUFMLEtBQWVBLEtBQXZCLElBQWdDRSxJQUFJLENBQUNELE9BQUwsS0FBaUJBLE9BQXJELEVBQThEO0FBQzVEO0FBQ0E7QUFDQW5CLE1BQUFBLFVBQVUsQ0FBQ0EsVUFBVSxDQUFDUixNQUFYLEdBQW9CLENBQXJCLENBQVYsR0FBb0M7QUFBQ1ksUUFBQUEsS0FBSyxFQUFFZ0IsSUFBSSxDQUFDaEIsS0FBTCxHQUFhLENBQXJCO0FBQXdCYyxRQUFBQSxLQUFLLEVBQUVBLEtBQS9CO0FBQXNDQyxRQUFBQSxPQUFPLEVBQUVBO0FBQS9DLE9BQXBDO0FBQ0QsS0FKRCxNQUlPO0FBQ0xuQixNQUFBQSxVQUFVLENBQUNxQixJQUFYLENBQWdCO0FBQUNqQixRQUFBQSxLQUFLLEVBQUUsQ0FBUjtBQUFXYyxRQUFBQSxLQUFLLEVBQUVBLEtBQWxCO0FBQXlCQyxRQUFBQSxPQUFPLEVBQUVBO0FBQWxDLE9BQWhCO0FBQ0Q7QUFDRixHQTVIYzs7QUFBQTs7QUFBQTtBQTZIZmpCLEVBQUFBLGFBN0hlLHlCQTZIREssUUE3SEMsRUE2SFMzQixTQTdIVCxFQTZIb0JELFNBN0hwQixFQTZIK0IyQixZQTdIL0IsRUE2SDZDO0FBQzFELFFBQUlmLE1BQU0sR0FBR1gsU0FBUyxDQUFDWSxNQUF2QjtBQUFBLFFBQ0lDLE1BQU0sR0FBR2QsU0FBUyxDQUFDYSxNQUR2QjtBQUFBLFFBRUlPLE1BQU0sR0FBR1EsUUFBUSxDQUFDUixNQUZ0QjtBQUFBLFFBR0lFLE1BQU0sR0FBR0YsTUFBTSxHQUFHTyxZQUh0QjtBQUFBLFFBS0lnQixXQUFXLEdBQUcsQ0FMbEI7O0FBTUEsV0FBT3ZCLE1BQU0sR0FBRyxDQUFULEdBQWFSLE1BQWIsSUFBdUJVLE1BQU0sR0FBRyxDQUFULEdBQWFSLE1BQXBDLElBQThDLEtBQUs4QixNQUFMLENBQVkzQyxTQUFTLENBQUNtQixNQUFNLEdBQUcsQ0FBVixDQUFyQixFQUFtQ3BCLFNBQVMsQ0FBQ3NCLE1BQU0sR0FBRyxDQUFWLENBQTVDLENBQXJELEVBQWdIO0FBQzlHRixNQUFBQSxNQUFNO0FBQ05FLE1BQUFBLE1BQU07QUFDTnFCLE1BQUFBLFdBQVc7QUFDWjs7QUFFRCxRQUFJQSxXQUFKLEVBQWlCO0FBQ2ZmLE1BQUFBLFFBQVEsQ0FBQ1AsVUFBVCxDQUFvQnFCLElBQXBCLENBQXlCO0FBQUNqQixRQUFBQSxLQUFLLEVBQUVrQjtBQUFSLE9BQXpCO0FBQ0Q7O0FBRURmLElBQUFBLFFBQVEsQ0FBQ1IsTUFBVCxHQUFrQkEsTUFBbEI7QUFDQSxXQUFPRSxNQUFQO0FBQ0QsR0FoSmM7O0FBQUE7O0FBQUE7QUFrSmZzQixFQUFBQSxNQWxKZSxrQkFrSlJDLElBbEpRLEVBa0pGQyxLQWxKRSxFQWtKSztBQUNsQixRQUFJLEtBQUs1QyxPQUFMLENBQWE2QyxVQUFqQixFQUE2QjtBQUMzQixhQUFPLEtBQUs3QyxPQUFMLENBQWE2QyxVQUFiLENBQXdCRixJQUF4QixFQUE4QkMsS0FBOUIsQ0FBUDtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU9ELElBQUksS0FBS0MsS0FBVCxJQUNELEtBQUs1QyxPQUFMLENBQWE4QyxVQUFiLElBQTJCSCxJQUFJLENBQUNJLFdBQUwsT0FBdUJILEtBQUssQ0FBQ0csV0FBTixFQUR4RDtBQUVEO0FBQ0YsR0F6SmM7O0FBQUE7O0FBQUE7QUEwSmZ2QyxFQUFBQSxXQTFKZSx1QkEwSkh3QyxLQTFKRyxFQTBKSTtBQUNqQixRQUFJWixHQUFHLEdBQUcsRUFBVjs7QUFDQSxTQUFLLElBQUlhLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdELEtBQUssQ0FBQ3JDLE1BQTFCLEVBQWtDc0MsQ0FBQyxFQUFuQyxFQUF1QztBQUNyQyxVQUFJRCxLQUFLLENBQUNDLENBQUQsQ0FBVCxFQUFjO0FBQ1piLFFBQUFBLEdBQUcsQ0FBQ0ksSUFBSixDQUFTUSxLQUFLLENBQUNDLENBQUQsQ0FBZDtBQUNEO0FBQ0Y7O0FBQ0QsV0FBT2IsR0FBUDtBQUNELEdBbEtjOztBQUFBOztBQUFBO0FBbUtmN0IsRUFBQUEsU0FuS2UscUJBbUtMSCxLQW5LSyxFQW1LRTtBQUNmLFdBQU9BLEtBQVA7QUFDRCxHQXJLYzs7QUFBQTs7QUFBQTtBQXNLZkssRUFBQUEsUUF0S2Usb0JBc0tOTCxLQXRLTSxFQXNLQztBQUNkLFdBQU9BLEtBQUssQ0FBQzhDLEtBQU4sQ0FBWSxFQUFaLENBQVA7QUFDRCxHQXhLYzs7QUFBQTs7QUFBQTtBQXlLZjVCLEVBQUFBLElBektlLGdCQXlLVjZCLEtBektVLEVBeUtIO0FBQ1YsV0FBT0EsS0FBSyxDQUFDN0IsSUFBTixDQUFXLEVBQVgsQ0FBUDtBQUNEO0FBM0tjLENBQWpCOztBQThLQSxTQUFTVyxXQUFULENBQXFCcEMsSUFBckIsRUFBMkJzQixVQUEzQixFQUF1Q3BCLFNBQXZDLEVBQWtERCxTQUFsRCxFQUE2RG9DLGVBQTdELEVBQThFO0FBQzVFLE1BQUlrQixZQUFZLEdBQUcsQ0FBbkI7QUFBQSxNQUNJQyxZQUFZLEdBQUdsQyxVQUFVLENBQUNSLE1BRDlCO0FBQUEsTUFFSU8sTUFBTSxHQUFHLENBRmI7QUFBQSxNQUdJRSxNQUFNLEdBQUcsQ0FIYjs7QUFLQSxTQUFPZ0MsWUFBWSxHQUFHQyxZQUF0QixFQUFvQ0QsWUFBWSxFQUFoRCxFQUFvRDtBQUNsRCxRQUFJRSxTQUFTLEdBQUduQyxVQUFVLENBQUNpQyxZQUFELENBQTFCOztBQUNBLFFBQUksQ0FBQ0UsU0FBUyxDQUFDaEIsT0FBZixFQUF3QjtBQUN0QixVQUFJLENBQUNnQixTQUFTLENBQUNqQixLQUFYLElBQW9CSCxlQUF4QixFQUF5QztBQUN2QyxZQUFJOUIsS0FBSyxHQUFHTCxTQUFTLENBQUN3RCxLQUFWLENBQWdCckMsTUFBaEIsRUFBd0JBLE1BQU0sR0FBR29DLFNBQVMsQ0FBQy9CLEtBQTNDLENBQVo7QUFDQW5CLFFBQUFBLEtBQUssR0FBR0EsS0FBSyxDQUFDb0QsR0FBTixDQUFVLFVBQVNwRCxLQUFULEVBQWdCNkMsQ0FBaEIsRUFBbUI7QUFDbkMsY0FBSVEsUUFBUSxHQUFHM0QsU0FBUyxDQUFDc0IsTUFBTSxHQUFHNkIsQ0FBVixDQUF4QjtBQUNBLGlCQUFPUSxRQUFRLENBQUM5QyxNQUFULEdBQWtCUCxLQUFLLENBQUNPLE1BQXhCLEdBQWlDOEMsUUFBakMsR0FBNENyRCxLQUFuRDtBQUNELFNBSE8sQ0FBUjtBQUtBa0QsUUFBQUEsU0FBUyxDQUFDbEQsS0FBVixHQUFrQlAsSUFBSSxDQUFDeUIsSUFBTCxDQUFVbEIsS0FBVixDQUFsQjtBQUNELE9BUkQsTUFRTztBQUNMa0QsUUFBQUEsU0FBUyxDQUFDbEQsS0FBVixHQUFrQlAsSUFBSSxDQUFDeUIsSUFBTCxDQUFVdkIsU0FBUyxDQUFDd0QsS0FBVixDQUFnQnJDLE1BQWhCLEVBQXdCQSxNQUFNLEdBQUdvQyxTQUFTLENBQUMvQixLQUEzQyxDQUFWLENBQWxCO0FBQ0Q7O0FBQ0RMLE1BQUFBLE1BQU0sSUFBSW9DLFNBQVMsQ0FBQy9CLEtBQXBCLENBWnNCLENBY3RCOztBQUNBLFVBQUksQ0FBQytCLFNBQVMsQ0FBQ2pCLEtBQWYsRUFBc0I7QUFDcEJqQixRQUFBQSxNQUFNLElBQUlrQyxTQUFTLENBQUMvQixLQUFwQjtBQUNEO0FBQ0YsS0FsQkQsTUFrQk87QUFDTCtCLE1BQUFBLFNBQVMsQ0FBQ2xELEtBQVYsR0FBa0JQLElBQUksQ0FBQ3lCLElBQUwsQ0FBVXhCLFNBQVMsQ0FBQ3lELEtBQVYsQ0FBZ0JuQyxNQUFoQixFQUF3QkEsTUFBTSxHQUFHa0MsU0FBUyxDQUFDL0IsS0FBM0MsQ0FBVixDQUFsQjtBQUNBSCxNQUFBQSxNQUFNLElBQUlrQyxTQUFTLENBQUMvQixLQUFwQixDQUZLLENBSUw7QUFDQTtBQUNBOztBQUNBLFVBQUk2QixZQUFZLElBQUlqQyxVQUFVLENBQUNpQyxZQUFZLEdBQUcsQ0FBaEIsQ0FBVixDQUE2QmYsS0FBakQsRUFBd0Q7QUFDdEQsWUFBSXFCLEdBQUcsR0FBR3ZDLFVBQVUsQ0FBQ2lDLFlBQVksR0FBRyxDQUFoQixDQUFwQjtBQUNBakMsUUFBQUEsVUFBVSxDQUFDaUMsWUFBWSxHQUFHLENBQWhCLENBQVYsR0FBK0JqQyxVQUFVLENBQUNpQyxZQUFELENBQXpDO0FBQ0FqQyxRQUFBQSxVQUFVLENBQUNpQyxZQUFELENBQVYsR0FBMkJNLEdBQTNCO0FBQ0Q7QUFDRjtBQUNGLEdBdkMyRSxDQXlDNUU7QUFDQTtBQUNBOzs7QUFDQSxNQUFJQyxhQUFhLEdBQUd4QyxVQUFVLENBQUNrQyxZQUFZLEdBQUcsQ0FBaEIsQ0FBOUI7O0FBQ0EsTUFBSUEsWUFBWSxHQUFHLENBQWYsSUFDRyxPQUFPTSxhQUFhLENBQUN2RCxLQUFyQixLQUErQixRQURsQyxLQUVJdUQsYUFBYSxDQUFDdEIsS0FBZCxJQUF1QnNCLGFBQWEsQ0FBQ3JCLE9BRnpDLEtBR0d6QyxJQUFJLENBQUM2QyxNQUFMLENBQVksRUFBWixFQUFnQmlCLGFBQWEsQ0FBQ3ZELEtBQTlCLENBSFAsRUFHNkM7QUFDM0NlLElBQUFBLFVBQVUsQ0FBQ2tDLFlBQVksR0FBRyxDQUFoQixDQUFWLENBQTZCakQsS0FBN0IsSUFBc0N1RCxhQUFhLENBQUN2RCxLQUFwRDtBQUNBZSxJQUFBQSxVQUFVLENBQUN5QyxHQUFYO0FBQ0Q7O0FBRUQsU0FBT3pDLFVBQVA7QUFDRDs7QUFFRCxTQUFTWSxTQUFULENBQW1COEIsSUFBbkIsRUFBeUI7QUFDdkIsU0FBTztBQUFFM0MsSUFBQUEsTUFBTSxFQUFFMkMsSUFBSSxDQUFDM0MsTUFBZjtBQUF1QkMsSUFBQUEsVUFBVSxFQUFFMEMsSUFBSSxDQUFDMUMsVUFBTCxDQUFnQm9DLEtBQWhCLENBQXNCLENBQXRCO0FBQW5DLEdBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERpZmYoKSB7fVxuXG5EaWZmLnByb3RvdHlwZSA9IHtcbiAgZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvbmUodmFsdWUpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayh1bmRlZmluZWQsIHZhbHVlKTsgfSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5jYXN0SW5wdXQobmV3U3RyaW5nKTtcblxuICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUobmV3U3RyaW5nKSk7XG5cbiAgICBsZXQgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCwgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcbiAgICBsZXQgZWRpdExlbmd0aCA9IDE7XG4gICAgbGV0IG1heEVkaXRMZW5ndGggPSBuZXdMZW4gKyBvbGRMZW47XG4gICAgaWYob3B0aW9ucy5tYXhFZGl0TGVuZ3RoKSB7XG4gICAgICBtYXhFZGl0TGVuZ3RoID0gTWF0aC5taW4obWF4RWRpdExlbmd0aCwgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoKTtcbiAgICB9XG5cbiAgICBsZXQgYmVzdFBhdGggPSBbeyBuZXdQb3M6IC0xLCBjb21wb25lbnRzOiBbXSB9XTtcblxuICAgIC8vIFNlZWQgZWRpdExlbmd0aCA9IDAsIGkuZS4gdGhlIGNvbnRlbnQgc3RhcnRzIHdpdGggdGhlIHNhbWUgdmFsdWVzXG4gICAgbGV0IG9sZFBvcyA9IHRoaXMuZXh0cmFjdENvbW1vbihiZXN0UGF0aFswXSwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIDApO1xuICAgIGlmIChiZXN0UGF0aFswXS5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgLy8gSWRlbnRpdHkgcGVyIHRoZSBlcXVhbGl0eSBhbmQgdG9rZW5pemVyXG4gICAgICByZXR1cm4gZG9uZShbe3ZhbHVlOiB0aGlzLmpvaW4obmV3U3RyaW5nKSwgY291bnQ6IG5ld1N0cmluZy5sZW5ndGh9XSk7XG4gICAgfVxuXG4gICAgLy8gTWFpbiB3b3JrZXIgbWV0aG9kLiBjaGVja3MgYWxsIHBlcm11dGF0aW9ucyBvZiBhIGdpdmVuIGVkaXQgbGVuZ3RoIGZvciBhY2NlcHRhbmNlLlxuICAgIGZ1bmN0aW9uIGV4ZWNFZGl0TGVuZ3RoKCkge1xuICAgICAgZm9yIChsZXQgZGlhZ29uYWxQYXRoID0gLTEgKiBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggPD0gZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoICs9IDIpIHtcbiAgICAgICAgbGV0IGJhc2VQYXRoO1xuICAgICAgICBsZXQgYWRkUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdLFxuICAgICAgICAgICAgcmVtb3ZlUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCArIDFdLFxuICAgICAgICAgICAgb2xkUG9zID0gKHJlbW92ZVBhdGggPyByZW1vdmVQYXRoLm5ld1BvcyA6IDApIC0gZGlhZ29uYWxQYXRoO1xuICAgICAgICBpZiAoYWRkUGF0aCkge1xuICAgICAgICAgIC8vIE5vIG9uZSBlbHNlIGlzIGdvaW5nIHRvIGF0dGVtcHQgdG8gdXNlIHRoaXMgdmFsdWUsIGNsZWFyIGl0XG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FuQWRkID0gYWRkUGF0aCAmJiBhZGRQYXRoLm5ld1BvcyArIDEgPCBuZXdMZW4sXG4gICAgICAgICAgICBjYW5SZW1vdmUgPSByZW1vdmVQYXRoICYmIDAgPD0gb2xkUG9zICYmIG9sZFBvcyA8IG9sZExlbjtcbiAgICAgICAgaWYgKCFjYW5BZGQgJiYgIWNhblJlbW92ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgcGF0aCBpcyBhIHRlcm1pbmFsIHRoZW4gcHJ1bmVcbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VsZWN0IHRoZSBkaWFnb25hbCB0aGF0IHdlIHdhbnQgdG8gYnJhbmNoIGZyb20uIFdlIHNlbGVjdCB0aGUgcHJpb3JcbiAgICAgICAgLy8gcGF0aCB3aG9zZSBwb3NpdGlvbiBpbiB0aGUgbmV3IHN0cmluZyBpcyB0aGUgZmFydGhlc3QgZnJvbSB0aGUgb3JpZ2luXG4gICAgICAgIC8vIGFuZCBkb2VzIG5vdCBwYXNzIHRoZSBib3VuZHMgb2YgdGhlIGRpZmYgZ3JhcGhcbiAgICAgICAgaWYgKCFjYW5BZGQgfHwgKGNhblJlbW92ZSAmJiBhZGRQYXRoLm5ld1BvcyA8IHJlbW92ZVBhdGgubmV3UG9zKSkge1xuICAgICAgICAgIGJhc2VQYXRoID0gY2xvbmVQYXRoKHJlbW92ZVBhdGgpO1xuICAgICAgICAgIHNlbGYucHVzaENvbXBvbmVudChiYXNlUGF0aC5jb21wb25lbnRzLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhc2VQYXRoID0gYWRkUGF0aDsgLy8gTm8gbmVlZCB0byBjbG9uZSwgd2UndmUgcHVsbGVkIGl0IGZyb20gdGhlIGxpc3RcbiAgICAgICAgICBiYXNlUGF0aC5uZXdQb3MrKztcbiAgICAgICAgICBzZWxmLnB1c2hDb21wb25lbnQoYmFzZVBhdGguY29tcG9uZW50cywgdHJ1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9sZFBvcyA9IHNlbGYuZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiBib3RoIHN0cmluZ3MsIHRoZW4gd2UgYXJlIGRvbmVcbiAgICAgICAgaWYgKGJhc2VQYXRoLm5ld1BvcyArIDEgPj0gbmV3TGVuICYmIG9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAgICAgcmV0dXJuIGRvbmUoYnVpbGRWYWx1ZXMoc2VsZiwgYmFzZVBhdGguY29tcG9uZW50cywgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHNlbGYudXNlTG9uZ2VzdFRva2VuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIHRyYWNrIHRoaXMgcGF0aCBhcyBhIHBvdGVudGlhbCBjYW5kaWRhdGUgYW5kIGNvbnRpbnVlLlxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZGl0TGVuZ3RoKys7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybXMgdGhlIGxlbmd0aCBvZiBlZGl0IGl0ZXJhdGlvbi4gSXMgYSBiaXQgZnVnbHkgYXMgdGhpcyBoYXMgdG8gc3VwcG9ydCB0aGVcbiAgICAvLyBzeW5jIGFuZCBhc3luYyBtb2RlIHdoaWNoIGlzIG5ldmVyIGZ1bi4gTG9vcHMgb3ZlciBleGVjRWRpdExlbmd0aCB1bnRpbCBhIHZhbHVlXG4gICAgLy8gaXMgcHJvZHVjZWQsIG9yIHVudGlsIHRoZSBlZGl0IGxlbmd0aCBleGNlZWRzIG9wdGlvbnMubWF4RWRpdExlbmd0aCAoaWYgZ2l2ZW4pLFxuICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgKGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKGVkaXRMZW5ndGggPiBtYXhFZGl0TGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWV4ZWNFZGl0TGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIGV4ZWMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgICAgfSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKGVkaXRMZW5ndGggPD0gbWF4RWRpdExlbmd0aCkge1xuICAgICAgICBsZXQgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcHVzaENvbXBvbmVudChjb21wb25lbnRzLCBhZGRlZCwgcmVtb3ZlZCkge1xuICAgIGxldCBsYXN0ID0gY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0ICYmIGxhc3QuYWRkZWQgPT09IGFkZGVkICYmIGxhc3QucmVtb3ZlZCA9PT0gcmVtb3ZlZCkge1xuICAgICAgLy8gV2UgbmVlZCB0byBjbG9uZSBoZXJlIGFzIHRoZSBjb21wb25lbnQgY2xvbmUgb3BlcmF0aW9uIGlzIGp1c3RcbiAgICAgIC8vIGFzIHNoYWxsb3cgYXJyYXkgY2xvbmVcbiAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXSA9IHtjb3VudDogbGFzdC5jb3VudCArIDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goe2NvdW50OiAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQgfSk7XG4gICAgfVxuICB9LFxuICBleHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKSB7XG4gICAgbGV0IG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG4gICAgICAgIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGgsXG4gICAgICAgIG5ld1BvcyA9IGJhc2VQYXRoLm5ld1BvcyxcbiAgICAgICAgb2xkUG9zID0gbmV3UG9zIC0gZGlhZ29uYWxQYXRoLFxuXG4gICAgICAgIGNvbW1vbkNvdW50ID0gMDtcbiAgICB3aGlsZSAobmV3UG9zICsgMSA8IG5ld0xlbiAmJiBvbGRQb3MgKyAxIDwgb2xkTGVuICYmIHRoaXMuZXF1YWxzKG5ld1N0cmluZ1tuZXdQb3MgKyAxXSwgb2xkU3RyaW5nW29sZFBvcyArIDFdKSkge1xuICAgICAgbmV3UG9zKys7XG4gICAgICBvbGRQb3MrKztcbiAgICAgIGNvbW1vbkNvdW50Kys7XG4gICAgfVxuXG4gICAgaWYgKGNvbW1vbkNvdW50KSB7XG4gICAgICBiYXNlUGF0aC5jb21wb25lbnRzLnB1c2goe2NvdW50OiBjb21tb25Db3VudH0pO1xuICAgIH1cblxuICAgIGJhc2VQYXRoLm5ld1BvcyA9IG5ld1BvcztcbiAgICByZXR1cm4gb2xkUG9zO1xuICB9LFxuXG4gIGVxdWFscyhsZWZ0LCByaWdodCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0XG4gICAgICAgIHx8ICh0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSAmJiBsZWZ0LnRvTG93ZXJDYXNlKCkgPT09IHJpZ2h0LnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlRW1wdHkoYXJyYXkpIHtcbiAgICBsZXQgcmV0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycmF5W2ldKSB7XG4gICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcbiAgY2FzdElucHV0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICB0b2tlbml6ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnJyk7XG4gIH0sXG4gIGpvaW4oY2hhcnMpIHtcbiAgICByZXR1cm4gY2hhcnMuam9pbignJyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJ1aWxkVmFsdWVzKGRpZmYsIGNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCB1c2VMb25nZXN0VG9rZW4pIHtcbiAgbGV0IGNvbXBvbmVudFBvcyA9IDAsXG4gICAgICBjb21wb25lbnRMZW4gPSBjb21wb25lbnRzLmxlbmd0aCxcbiAgICAgIG5ld1BvcyA9IDAsXG4gICAgICBvbGRQb3MgPSAwO1xuXG4gIGZvciAoOyBjb21wb25lbnRQb3MgPCBjb21wb25lbnRMZW47IGNvbXBvbmVudFBvcysrKSB7XG4gICAgbGV0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICBpZiAoIWNvbXBvbmVudC5yZW1vdmVkKSB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCAmJiB1c2VMb25nZXN0VG9rZW4pIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24odmFsdWUsIGkpIHtcbiAgICAgICAgICBsZXQgb2xkVmFsdWUgPSBvbGRTdHJpbmdbb2xkUG9zICsgaV07XG4gICAgICAgICAgcmV0dXJuIG9sZFZhbHVlLmxlbmd0aCA+IHZhbHVlLmxlbmd0aCA/IG9sZFZhbHVlIDogdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbih2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4obmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICB9XG4gICAgICBuZXdQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuXG4gICAgICAvLyBDb21tb24gY2FzZVxuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcbiAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG9sZFN0cmluZy5zbGljZShvbGRQb3MsIG9sZFBvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuICAgICAgLy8gUmV2ZXJzZSBhZGQgYW5kIHJlbW92ZSBzbyByZW1vdmVzIGFyZSBvdXRwdXQgZmlyc3QgdG8gbWF0Y2ggY29tbW9uIGNvbnZlbnRpb25cbiAgICAgIC8vIFRoZSBkaWZmaW5nIGFsZ29yaXRobSBpcyB0aWVkIHRvIGFkZCB0aGVuIHJlbW92ZSBvdXRwdXQgYW5kIHRoaXMgaXMgdGhlIHNpbXBsZXN0XG4gICAgICAvLyByb3V0ZSB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0IHdpdGggbWluaW1hbCBvdmVyaGVhZC5cbiAgICAgIGlmIChjb21wb25lbnRQb3MgJiYgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXS5hZGRlZCkge1xuICAgICAgICBsZXQgdG1wID0gY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXSA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3NdID0gdG1wO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNwZWNpYWwgY2FzZSBoYW5kbGUgZm9yIHdoZW4gb25lIHRlcm1pbmFsIGlzIGlnbm9yZWQgKGkuZS4gd2hpdGVzcGFjZSkuXG4gIC8vIEZvciB0aGlzIGNhc2Ugd2UgbWVyZ2UgdGhlIHRlcm1pbmFsIGludG8gdGhlIHByaW9yIHN0cmluZyBhbmQgZHJvcCB0aGUgY2hhbmdlLlxuICAvLyBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdHJpbmcgbW9kZS5cbiAgbGV0IGxhc3RDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDFdO1xuICBpZiAoY29tcG9uZW50TGVuID4gMVxuICAgICAgJiYgdHlwZW9mIGxhc3RDb21wb25lbnQudmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAmJiAobGFzdENvbXBvbmVudC5hZGRlZCB8fCBsYXN0Q29tcG9uZW50LnJlbW92ZWQpXG4gICAgICAmJiBkaWZmLmVxdWFscygnJywgbGFzdENvbXBvbmVudC52YWx1ZSkpIHtcbiAgICBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDJdLnZhbHVlICs9IGxhc3RDb21wb25lbnQudmFsdWU7XG4gICAgY29tcG9uZW50cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBjb21wb25lbnRzO1xufVxuXG5mdW5jdGlvbiBjbG9uZVBhdGgocGF0aCkge1xuICByZXR1cm4geyBuZXdQb3M6IHBhdGgubmV3UG9zLCBjb21wb25lbnRzOiBwYXRoLmNvbXBvbmVudHMuc2xpY2UoMCkgfTtcbn1cbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffChars = diffChars;\nexports.characterDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nvar characterDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.characterDiff = characterDiff;\n\n/*istanbul ignore end*/\nfunction diffChars(oldStr, newStr, options) {\n return characterDiff.diff(oldStr, newStr, options);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2NoYXJhY3Rlci5qcyJdLCJuYW1lcyI6WyJjaGFyYWN0ZXJEaWZmIiwiRGlmZiIsImRpZmZDaGFycyIsIm9sZFN0ciIsIm5ld1N0ciIsIm9wdGlvbnMiLCJkaWZmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxJQUFNQSxhQUFhLEdBQUc7QUFBSUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsQ0FBSixFQUF0Qjs7Ozs7O0FBQ0EsU0FBU0MsU0FBVCxDQUFtQkMsTUFBbkIsRUFBMkJDLE1BQTNCLEVBQW1DQyxPQUFuQyxFQUE0QztBQUFFLFNBQU9MLGFBQWEsQ0FBQ00sSUFBZCxDQUFtQkgsTUFBbkIsRUFBMkJDLE1BQTNCLEVBQW1DQyxPQUFuQyxDQUFQO0FBQXFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGNvbnN0IGNoYXJhY3RlckRpZmYgPSBuZXcgRGlmZigpO1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZDaGFycyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykgeyByZXR1cm4gY2hhcmFjdGVyRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTsgfVxuIl19\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffCss = diffCss;\nexports.cssDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nvar cssDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.cssDiff = cssDiff;\n\n/*istanbul ignore end*/\ncssDiff.tokenize = function (value) {\n return value.split(/([{}:;,]|\\s+)/);\n};\n\nfunction diffCss(oldStr, newStr, callback) {\n return cssDiff.diff(oldStr, newStr, callback);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Nzcy5qcyJdLCJuYW1lcyI6WyJjc3NEaWZmIiwiRGlmZiIsInRva2VuaXplIiwidmFsdWUiLCJzcGxpdCIsImRpZmZDc3MiLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7OztBQUVPLElBQU1BLE9BQU8sR0FBRztBQUFJQztBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQSxDQUFKLEVBQWhCOzs7Ozs7QUFDUEQsT0FBTyxDQUFDRSxRQUFSLEdBQW1CLFVBQVNDLEtBQVQsRUFBZ0I7QUFDakMsU0FBT0EsS0FBSyxDQUFDQyxLQUFOLENBQVksZUFBWixDQUFQO0FBQ0QsQ0FGRDs7QUFJTyxTQUFTQyxPQUFULENBQWlCQyxNQUFqQixFQUF5QkMsTUFBekIsRUFBaUNDLFFBQWpDLEVBQTJDO0FBQUUsU0FBT1IsT0FBTyxDQUFDUyxJQUFSLENBQWFILE1BQWIsRUFBcUJDLE1BQXJCLEVBQTZCQyxRQUE3QixDQUFQO0FBQWdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGNvbnN0IGNzc0RpZmYgPSBuZXcgRGlmZigpO1xuY3NzRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5zcGxpdCgvKFt7fTo7LF18XFxzKykvKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQ3NzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykgeyByZXR1cm4gY3NzRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffJson = diffJson;\nexports.canonicalize = canonicalize;\nexports.jsonDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_line = require(\"./line\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*istanbul ignore end*/\nvar objectPrototypeToString = Object.prototype.toString;\nvar jsonDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n](); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a\n// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:\n\n/*istanbul ignore start*/\nexports.jsonDiff = jsonDiff;\n\n/*istanbul ignore end*/\njsonDiff.useLongestToken = true;\njsonDiff.tokenize =\n/*istanbul ignore start*/\n_line\n/*istanbul ignore end*/\n.\n/*istanbul ignore start*/\nlineDiff\n/*istanbul ignore end*/\n.tokenize;\n\njsonDiff.castInput = function (value) {\n /*istanbul ignore start*/\n var _this$options =\n /*istanbul ignore end*/\n this.options,\n undefinedReplacement = _this$options.undefinedReplacement,\n _this$options$stringi = _this$options.stringifyReplacer,\n stringifyReplacer = _this$options$stringi === void 0 ? function (k, v)\n /*istanbul ignore start*/\n {\n return (\n /*istanbul ignore end*/\n typeof v === 'undefined' ? undefinedReplacement : v\n );\n } : _this$options$stringi;\n return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' ');\n};\n\njsonDiff.equals = function (left, right) {\n return (\n /*istanbul ignore start*/\n _base\n /*istanbul ignore end*/\n [\n /*istanbul ignore start*/\n \"default\"\n /*istanbul ignore end*/\n ].prototype.equals.call(jsonDiff, left.replace(/,([\\r\\n])/g, '$1'), right.replace(/,([\\r\\n])/g, '$1'))\n );\n};\n\nfunction diffJson(oldObj, newObj, options) {\n return jsonDiff.diff(oldObj, newObj, options);\n} // This function handles the presence of circular references by bailing out when encountering an\n// object that is already on the \"stack\" of items being processed. Accepts an optional replacer\n\n\nfunction canonicalize(obj, stack, replacementStack, replacer, key) {\n stack = stack || [];\n replacementStack = replacementStack || [];\n\n if (replacer) {\n obj = replacer(key, obj);\n }\n\n var i;\n\n for (i = 0; i < stack.length; i += 1) {\n if (stack[i] === obj) {\n return replacementStack[i];\n }\n }\n\n var canonicalizedObj;\n\n if ('[object Array]' === objectPrototypeToString.call(obj)) {\n stack.push(obj);\n canonicalizedObj = new Array(obj.length);\n replacementStack.push(canonicalizedObj);\n\n for (i = 0; i < obj.length; i += 1) {\n canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key);\n }\n\n stack.pop();\n replacementStack.pop();\n return canonicalizedObj;\n }\n\n if (obj && obj.toJSON) {\n obj = obj.toJSON();\n }\n\n if (\n /*istanbul ignore start*/\n _typeof(\n /*istanbul ignore end*/\n obj) === 'object' && obj !== null) {\n stack.push(obj);\n canonicalizedObj = {};\n replacementStack.push(canonicalizedObj);\n\n var sortedKeys = [],\n _key;\n\n for (_key in obj) {\n /* istanbul ignore else */\n if (obj.hasOwnProperty(_key)) {\n sortedKeys.push(_key);\n }\n }\n\n sortedKeys.sort();\n\n for (i = 0; i < sortedKeys.length; i += 1) {\n _key = sortedKeys[i];\n canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);\n }\n\n stack.pop();\n replacementStack.pop();\n } else {\n canonicalizedObj = obj;\n }\n\n return canonicalizedObj;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2pzb24uanMiXSwibmFtZXMiOlsib2JqZWN0UHJvdG90eXBlVG9TdHJpbmciLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImpzb25EaWZmIiwiRGlmZiIsInVzZUxvbmdlc3RUb2tlbiIsInRva2VuaXplIiwibGluZURpZmYiLCJjYXN0SW5wdXQiLCJ2YWx1ZSIsIm9wdGlvbnMiLCJ1bmRlZmluZWRSZXBsYWNlbWVudCIsInN0cmluZ2lmeVJlcGxhY2VyIiwiayIsInYiLCJKU09OIiwic3RyaW5naWZ5IiwiY2Fub25pY2FsaXplIiwiZXF1YWxzIiwibGVmdCIsInJpZ2h0IiwiY2FsbCIsInJlcGxhY2UiLCJkaWZmSnNvbiIsIm9sZE9iaiIsIm5ld09iaiIsImRpZmYiLCJvYmoiLCJzdGFjayIsInJlcGxhY2VtZW50U3RhY2siLCJyZXBsYWNlciIsImtleSIsImkiLCJsZW5ndGgiLCJjYW5vbmljYWxpemVkT2JqIiwicHVzaCIsIkFycmF5IiwicG9wIiwidG9KU09OIiwic29ydGVkS2V5cyIsImhhc093blByb3BlcnR5Iiwic29ydCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7QUFFQSxJQUFNQSx1QkFBdUIsR0FBR0MsTUFBTSxDQUFDQyxTQUFQLENBQWlCQyxRQUFqRDtBQUdPLElBQU1DLFFBQVEsR0FBRztBQUFJQztBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQSxDQUFKLEVBQWpCLEMsQ0FDUDtBQUNBOzs7Ozs7QUFDQUQsUUFBUSxDQUFDRSxlQUFULEdBQTJCLElBQTNCO0FBRUFGLFFBQVEsQ0FBQ0csUUFBVDtBQUFvQkM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLENBQVNELFFBQTdCOztBQUNBSCxRQUFRLENBQUNLLFNBQVQsR0FBcUIsVUFBU0MsS0FBVCxFQUFnQjtBQUFBO0FBQUE7QUFBQTtBQUMrRSxPQUFLQyxPQURwRjtBQUFBLE1BQzVCQyxvQkFENEIsaUJBQzVCQSxvQkFENEI7QUFBQSw0Q0FDTkMsaUJBRE07QUFBQSxNQUNOQSxpQkFETSxzQ0FDYyxVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFVLGFBQU9BLENBQVAsS0FBYSxXQUFiLEdBQTJCSCxvQkFBM0IsR0FBa0RHO0FBQTVEO0FBQUEsR0FEZDtBQUduQyxTQUFPLE9BQU9MLEtBQVAsS0FBaUIsUUFBakIsR0FBNEJBLEtBQTVCLEdBQW9DTSxJQUFJLENBQUNDLFNBQUwsQ0FBZUMsWUFBWSxDQUFDUixLQUFELEVBQVEsSUFBUixFQUFjLElBQWQsRUFBb0JHLGlCQUFwQixDQUEzQixFQUFtRUEsaUJBQW5FLEVBQXNGLElBQXRGLENBQTNDO0FBQ0QsQ0FKRDs7QUFLQVQsUUFBUSxDQUFDZSxNQUFULEdBQWtCLFVBQVNDLElBQVQsRUFBZUMsS0FBZixFQUFzQjtBQUN0QyxTQUFPaEI7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsTUFBS0gsU0FBTCxDQUFlaUIsTUFBZixDQUFzQkcsSUFBdEIsQ0FBMkJsQixRQUEzQixFQUFxQ2dCLElBQUksQ0FBQ0csT0FBTCxDQUFhLFlBQWIsRUFBMkIsSUFBM0IsQ0FBckMsRUFBdUVGLEtBQUssQ0FBQ0UsT0FBTixDQUFjLFlBQWQsRUFBNEIsSUFBNUIsQ0FBdkU7QUFBUDtBQUNELENBRkQ7O0FBSU8sU0FBU0MsUUFBVCxDQUFrQkMsTUFBbEIsRUFBMEJDLE1BQTFCLEVBQWtDZixPQUFsQyxFQUEyQztBQUFFLFNBQU9QLFFBQVEsQ0FBQ3VCLElBQVQsQ0FBY0YsTUFBZCxFQUFzQkMsTUFBdEIsRUFBOEJmLE9BQTlCLENBQVA7QUFBZ0QsQyxDQUVwRztBQUNBOzs7QUFDTyxTQUFTTyxZQUFULENBQXNCVSxHQUF0QixFQUEyQkMsS0FBM0IsRUFBa0NDLGdCQUFsQyxFQUFvREMsUUFBcEQsRUFBOERDLEdBQTlELEVBQW1FO0FBQ3hFSCxFQUFBQSxLQUFLLEdBQUdBLEtBQUssSUFBSSxFQUFqQjtBQUNBQyxFQUFBQSxnQkFBZ0IsR0FBR0EsZ0JBQWdCLElBQUksRUFBdkM7O0FBRUEsTUFBSUMsUUFBSixFQUFjO0FBQ1pILElBQUFBLEdBQUcsR0FBR0csUUFBUSxDQUFDQyxHQUFELEVBQU1KLEdBQU4sQ0FBZDtBQUNEOztBQUVELE1BQUlLLENBQUo7O0FBRUEsT0FBS0EsQ0FBQyxHQUFHLENBQVQsRUFBWUEsQ0FBQyxHQUFHSixLQUFLLENBQUNLLE1BQXRCLEVBQThCRCxDQUFDLElBQUksQ0FBbkMsRUFBc0M7QUFDcEMsUUFBSUosS0FBSyxDQUFDSSxDQUFELENBQUwsS0FBYUwsR0FBakIsRUFBc0I7QUFDcEIsYUFBT0UsZ0JBQWdCLENBQUNHLENBQUQsQ0FBdkI7QUFDRDtBQUNGOztBQUVELE1BQUlFLGdCQUFKOztBQUVBLE1BQUkscUJBQXFCbkMsdUJBQXVCLENBQUNzQixJQUF4QixDQUE2Qk0sR0FBN0IsQ0FBekIsRUFBNEQ7QUFDMURDLElBQUFBLEtBQUssQ0FBQ08sSUFBTixDQUFXUixHQUFYO0FBQ0FPLElBQUFBLGdCQUFnQixHQUFHLElBQUlFLEtBQUosQ0FBVVQsR0FBRyxDQUFDTSxNQUFkLENBQW5CO0FBQ0FKLElBQUFBLGdCQUFnQixDQUFDTSxJQUFqQixDQUFzQkQsZ0JBQXRCOztBQUNBLFNBQUtGLENBQUMsR0FBRyxDQUFULEVBQVlBLENBQUMsR0FBR0wsR0FBRyxDQUFDTSxNQUFwQixFQUE0QkQsQ0FBQyxJQUFJLENBQWpDLEVBQW9DO0FBQ2xDRSxNQUFBQSxnQkFBZ0IsQ0FBQ0YsQ0FBRCxDQUFoQixHQUFzQmYsWUFBWSxDQUFDVSxHQUFHLENBQUNLLENBQUQsQ0FBSixFQUFTSixLQUFULEVBQWdCQyxnQkFBaEIsRUFBa0NDLFFBQWxDLEVBQTRDQyxHQUE1QyxDQUFsQztBQUNEOztBQUNESCxJQUFBQSxLQUFLLENBQUNTLEdBQU47QUFDQVIsSUFBQUEsZ0JBQWdCLENBQUNRLEdBQWpCO0FBQ0EsV0FBT0gsZ0JBQVA7QUFDRDs7QUFFRCxNQUFJUCxHQUFHLElBQUlBLEdBQUcsQ0FBQ1csTUFBZixFQUF1QjtBQUNyQlgsSUFBQUEsR0FBRyxHQUFHQSxHQUFHLENBQUNXLE1BQUosRUFBTjtBQUNEOztBQUVEO0FBQUk7QUFBQTtBQUFBO0FBQU9YLEVBQUFBLEdBQVAsTUFBZSxRQUFmLElBQTJCQSxHQUFHLEtBQUssSUFBdkMsRUFBNkM7QUFDM0NDLElBQUFBLEtBQUssQ0FBQ08sSUFBTixDQUFXUixHQUFYO0FBQ0FPLElBQUFBLGdCQUFnQixHQUFHLEVBQW5CO0FBQ0FMLElBQUFBLGdCQUFnQixDQUFDTSxJQUFqQixDQUFzQkQsZ0JBQXRCOztBQUNBLFFBQUlLLFVBQVUsR0FBRyxFQUFqQjtBQUFBLFFBQ0lSLElBREo7O0FBRUEsU0FBS0EsSUFBTCxJQUFZSixHQUFaLEVBQWlCO0FBQ2Y7QUFDQSxVQUFJQSxHQUFHLENBQUNhLGNBQUosQ0FBbUJULElBQW5CLENBQUosRUFBNkI7QUFDM0JRLFFBQUFBLFVBQVUsQ0FBQ0osSUFBWCxDQUFnQkosSUFBaEI7QUFDRDtBQUNGOztBQUNEUSxJQUFBQSxVQUFVLENBQUNFLElBQVg7O0FBQ0EsU0FBS1QsQ0FBQyxHQUFHLENBQVQsRUFBWUEsQ0FBQyxHQUFHTyxVQUFVLENBQUNOLE1BQTNCLEVBQW1DRCxDQUFDLElBQUksQ0FBeEMsRUFBMkM7QUFDekNELE1BQUFBLElBQUcsR0FBR1EsVUFBVSxDQUFDUCxDQUFELENBQWhCO0FBQ0FFLE1BQUFBLGdCQUFnQixDQUFDSCxJQUFELENBQWhCLEdBQXdCZCxZQUFZLENBQUNVLEdBQUcsQ0FBQ0ksSUFBRCxDQUFKLEVBQVdILEtBQVgsRUFBa0JDLGdCQUFsQixFQUFvQ0MsUUFBcEMsRUFBOENDLElBQTlDLENBQXBDO0FBQ0Q7O0FBQ0RILElBQUFBLEtBQUssQ0FBQ1MsR0FBTjtBQUNBUixJQUFBQSxnQkFBZ0IsQ0FBQ1EsR0FBakI7QUFDRCxHQW5CRCxNQW1CTztBQUNMSCxJQUFBQSxnQkFBZ0IsR0FBR1AsR0FBbkI7QUFDRDs7QUFDRCxTQUFPTyxnQkFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7bGluZURpZmZ9IGZyb20gJy4vbGluZSc7XG5cbmNvbnN0IG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuXG5leHBvcnQgY29uc3QganNvbkRpZmYgPSBuZXcgRGlmZigpO1xuLy8gRGlzY3JpbWluYXRlIGJldHdlZW4gdHdvIGxpbmVzIG9mIHByZXR0eS1wcmludGVkLCBzZXJpYWxpemVkIEpTT04gd2hlcmUgb25lIG9mIHRoZW0gaGFzIGFcbi8vIGRhbmdsaW5nIGNvbW1hIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4gVHVybnMgb3V0IGluY2x1ZGluZyB0aGUgZGFuZ2xpbmcgY29tbWEgeWllbGRzIHRoZSBuaWNlc3Qgb3V0cHV0OlxuanNvbkRpZmYudXNlTG9uZ2VzdFRva2VuID0gdHJ1ZTtcblxuanNvbkRpZmYudG9rZW5pemUgPSBsaW5lRGlmZi50b2tlbml6ZTtcbmpzb25EaWZmLmNhc3RJbnB1dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGNvbnN0IHt1bmRlZmluZWRSZXBsYWNlbWVudCwgc3RyaW5naWZ5UmVwbGFjZXIgPSAoaywgdikgPT4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkUmVwbGFjZW1lbnQgOiB2fSA9IHRoaXMub3B0aW9ucztcblxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsaXplKHZhbHVlLCBudWxsLCBudWxsLCBzdHJpbmdpZnlSZXBsYWNlciksIHN0cmluZ2lmeVJlcGxhY2VyLCAnICAnKTtcbn07XG5qc29uRGlmZi5lcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICByZXR1cm4gRGlmZi5wcm90b3R5cGUuZXF1YWxzLmNhbGwoanNvbkRpZmYsIGxlZnQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJyksIHJpZ2h0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmSnNvbihvbGRPYmosIG5ld09iaiwgb3B0aW9ucykgeyByZXR1cm4ganNvbkRpZmYuZGlmZihvbGRPYmosIG5ld09iaiwgb3B0aW9ucyk7IH1cblxuLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVzZW5jZSBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGJhaWxpbmcgb3V0IHdoZW4gZW5jb3VudGVyaW5nIGFuXG4vLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLiBBY2NlcHRzIGFuIG9wdGlvbmFsIHJlcGxhY2VyXG5leHBvcnQgZnVuY3Rpb24gY2Fub25pY2FsaXplKG9iaiwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpIHtcbiAgc3RhY2sgPSBzdGFjayB8fCBbXTtcbiAgcmVwbGFjZW1lbnRTdGFjayA9IHJlcGxhY2VtZW50U3RhY2sgfHwgW107XG5cbiAgaWYgKHJlcGxhY2VyKSB7XG4gICAgb2JqID0gcmVwbGFjZXIoa2V5LCBvYmopO1xuICB9XG5cbiAgbGV0IGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHN0YWNrW2ldID09PSBvYmopIHtcbiAgICAgIHJldHVybiByZXBsYWNlbWVudFN0YWNrW2ldO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjYW5vbmljYWxpemVkT2JqO1xuXG4gIGlmICgnW29iamVjdCBBcnJheV0nID09PSBvYmplY3RQcm90b3R5cGVUb1N0cmluZy5jYWxsKG9iaikpIHtcbiAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IG5ldyBBcnJheShvYmoubGVuZ3RoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG4gICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICB9XG4gICAgc3RhY2sucG9wKCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcbiAgICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcbiAgfVxuXG4gIGlmIChvYmogJiYgb2JqLnRvSlNPTikge1xuICAgIG9iaiA9IG9iai50b0pTT04oKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcbiAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IHt9O1xuICAgIHJlcGxhY2VtZW50U3RhY2sucHVzaChjYW5vbmljYWxpemVkT2JqKTtcbiAgICBsZXQgc29ydGVkS2V5cyA9IFtdLFxuICAgICAgICBrZXk7XG4gICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHNvcnRlZEtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0ZWRLZXlzLnNvcnQoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc29ydGVkS2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAga2V5ID0gc29ydGVkS2V5c1tpXTtcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmpba2V5XSA9IGNhbm9uaWNhbGl6ZShvYmpba2V5XSwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpO1xuICAgIH1cbiAgICBzdGFjay5wb3AoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBvYmo7XG4gIH1cbiAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffLines = diffLines;\nexports.diffTrimmedLines = diffTrimmedLines;\nexports.lineDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_params = require(\"../util/params\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nvar lineDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.lineDiff = lineDiff;\n\n/*istanbul ignore end*/\nlineDiff.tokenize = function (value) {\n var retLines = [],\n linesAndNewlines = value.split(/(\\n|\\r\\n)/); // Ignore the final empty token that occurs if the string ends with a new line\n\n if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n linesAndNewlines.pop();\n } // Merge the content and line separators into single tokens\n\n\n for (var i = 0; i < linesAndNewlines.length; i++) {\n var line = linesAndNewlines[i];\n\n if (i % 2 && !this.options.newlineIsToken) {\n retLines[retLines.length - 1] += line;\n } else {\n if (this.options.ignoreWhitespace) {\n line = line.trim();\n }\n\n retLines.push(line);\n }\n }\n\n return retLines;\n};\n\nfunction diffLines(oldStr, newStr, callback) {\n return lineDiff.diff(oldStr, newStr, callback);\n}\n\nfunction diffTrimmedLines(oldStr, newStr, callback) {\n var options =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _params\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n generateOptions)\n /*istanbul ignore end*/\n (callback, {\n ignoreWhitespace: true\n });\n return lineDiff.diff(oldStr, newStr, options);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2xpbmUuanMiXSwibmFtZXMiOlsibGluZURpZmYiLCJEaWZmIiwidG9rZW5pemUiLCJ2YWx1ZSIsInJldExpbmVzIiwibGluZXNBbmROZXdsaW5lcyIsInNwbGl0IiwibGVuZ3RoIiwicG9wIiwiaSIsImxpbmUiLCJvcHRpb25zIiwibmV3bGluZUlzVG9rZW4iLCJpZ25vcmVXaGl0ZXNwYWNlIiwidHJpbSIsInB1c2giLCJkaWZmTGluZXMiLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiLCJkaWZmVHJpbW1lZExpbmVzIiwiZ2VuZXJhdGVPcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxJQUFNQSxRQUFRLEdBQUc7QUFBSUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsQ0FBSixFQUFqQjs7Ozs7O0FBQ1BELFFBQVEsQ0FBQ0UsUUFBVCxHQUFvQixVQUFTQyxLQUFULEVBQWdCO0FBQ2xDLE1BQUlDLFFBQVEsR0FBRyxFQUFmO0FBQUEsTUFDSUMsZ0JBQWdCLEdBQUdGLEtBQUssQ0FBQ0csS0FBTixDQUFZLFdBQVosQ0FEdkIsQ0FEa0MsQ0FJbEM7O0FBQ0EsTUFBSSxDQUFDRCxnQkFBZ0IsQ0FBQ0EsZ0JBQWdCLENBQUNFLE1BQWpCLEdBQTBCLENBQTNCLENBQXJCLEVBQW9EO0FBQ2xERixJQUFBQSxnQkFBZ0IsQ0FBQ0csR0FBakI7QUFDRCxHQVBpQyxDQVNsQzs7O0FBQ0EsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHSixnQkFBZ0IsQ0FBQ0UsTUFBckMsRUFBNkNFLENBQUMsRUFBOUMsRUFBa0Q7QUFDaEQsUUFBSUMsSUFBSSxHQUFHTCxnQkFBZ0IsQ0FBQ0ksQ0FBRCxDQUEzQjs7QUFFQSxRQUFJQSxDQUFDLEdBQUcsQ0FBSixJQUFTLENBQUMsS0FBS0UsT0FBTCxDQUFhQyxjQUEzQixFQUEyQztBQUN6Q1IsTUFBQUEsUUFBUSxDQUFDQSxRQUFRLENBQUNHLE1BQVQsR0FBa0IsQ0FBbkIsQ0FBUixJQUFpQ0csSUFBakM7QUFDRCxLQUZELE1BRU87QUFDTCxVQUFJLEtBQUtDLE9BQUwsQ0FBYUUsZ0JBQWpCLEVBQW1DO0FBQ2pDSCxRQUFBQSxJQUFJLEdBQUdBLElBQUksQ0FBQ0ksSUFBTCxFQUFQO0FBQ0Q7O0FBQ0RWLE1BQUFBLFFBQVEsQ0FBQ1csSUFBVCxDQUFjTCxJQUFkO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPTixRQUFQO0FBQ0QsQ0F4QkQ7O0FBMEJPLFNBQVNZLFNBQVQsQ0FBbUJDLE1BQW5CLEVBQTJCQyxNQUEzQixFQUFtQ0MsUUFBbkMsRUFBNkM7QUFBRSxTQUFPbkIsUUFBUSxDQUFDb0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QkMsUUFBOUIsQ0FBUDtBQUFpRDs7QUFDaEcsU0FBU0UsZ0JBQVQsQ0FBMEJKLE1BQTFCLEVBQWtDQyxNQUFsQyxFQUEwQ0MsUUFBMUMsRUFBb0Q7QUFDekQsTUFBSVIsT0FBTztBQUFHO0FBQUE7QUFBQTs7QUFBQVc7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLEdBQWdCSCxRQUFoQixFQUEwQjtBQUFDTixJQUFBQSxnQkFBZ0IsRUFBRTtBQUFuQixHQUExQixDQUFkO0FBQ0EsU0FBT2IsUUFBUSxDQUFDb0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QlAsT0FBOUIsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7Z2VuZXJhdGVPcHRpb25zfSBmcm9tICcuLi91dGlsL3BhcmFtcyc7XG5cbmV4cG9ydCBjb25zdCBsaW5lRGlmZiA9IG5ldyBEaWZmKCk7XG5saW5lRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGxldCByZXRMaW5lcyA9IFtdLFxuICAgICAgbGluZXNBbmROZXdsaW5lcyA9IHZhbHVlLnNwbGl0KC8oXFxufFxcclxcbikvKTtcblxuICAvLyBJZ25vcmUgdGhlIGZpbmFsIGVtcHR5IHRva2VuIHRoYXQgb2NjdXJzIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGEgbmV3IGxpbmVcbiAgaWYgKCFsaW5lc0FuZE5ld2xpbmVzW2xpbmVzQW5kTmV3bGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICBsaW5lc0FuZE5ld2xpbmVzLnBvcCgpO1xuICB9XG5cbiAgLy8gTWVyZ2UgdGhlIGNvbnRlbnQgYW5kIGxpbmUgc2VwYXJhdG9ycyBpbnRvIHNpbmdsZSB0b2tlbnNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG4gICAgaWYgKGkgJSAyICYmICF0aGlzLm9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG4gICAgICB9XG4gICAgICByZXRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXRMaW5lcztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7IHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbmV4cG9ydCBmdW5jdGlvbiBkaWZmVHJpbW1lZExpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICBsZXQgb3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucyhjYWxsYmFjaywge2lnbm9yZVdoaXRlc3BhY2U6IHRydWV9KTtcbiAgcmV0dXJuIGxpbmVEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuIl19\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffSentences = diffSentences;\nexports.sentenceDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nvar sentenceDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.sentenceDiff = sentenceDiff;\n\n/*istanbul ignore end*/\nsentenceDiff.tokenize = function (value) {\n return value.split(/(\\S.+?[.!?])(?=\\s+|$)/);\n};\n\nfunction diffSentences(oldStr, newStr, callback) {\n return sentenceDiff.diff(oldStr, newStr, callback);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL3NlbnRlbmNlLmpzIl0sIm5hbWVzIjpbInNlbnRlbmNlRGlmZiIsIkRpZmYiLCJ0b2tlbml6ZSIsInZhbHVlIiwic3BsaXQiLCJkaWZmU2VudGVuY2VzIiwib2xkU3RyIiwibmV3U3RyIiwiY2FsbGJhY2siLCJkaWZmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFHTyxJQUFNQSxZQUFZLEdBQUc7QUFBSUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsQ0FBSixFQUFyQjs7Ozs7O0FBQ1BELFlBQVksQ0FBQ0UsUUFBYixHQUF3QixVQUFTQyxLQUFULEVBQWdCO0FBQ3RDLFNBQU9BLEtBQUssQ0FBQ0MsS0FBTixDQUFZLHVCQUFaLENBQVA7QUFDRCxDQUZEOztBQUlPLFNBQVNDLGFBQVQsQ0FBdUJDLE1BQXZCLEVBQStCQyxNQUEvQixFQUF1Q0MsUUFBdkMsRUFBaUQ7QUFBRSxTQUFPUixZQUFZLENBQUNTLElBQWIsQ0FBa0JILE1BQWxCLEVBQTBCQyxNQUExQixFQUFrQ0MsUUFBbEMsQ0FBUDtBQUFxRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5cblxuZXhwb3J0IGNvbnN0IHNlbnRlbmNlRGlmZiA9IG5ldyBEaWZmKCk7XG5zZW50ZW5jZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhcXFMuKz9bLiE/XSkoPz1cXHMrfCQpLyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZlNlbnRlbmNlcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHsgcmV0dXJuIHNlbnRlbmNlRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.diffWords = diffWords;\nexports.diffWordsWithSpace = diffWordsWithSpace;\nexports.wordDiff = void 0;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./base\"))\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_params = require(\"../util/params\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\n// Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode\n//\n// Ranges and exceptions:\n// Latin-1 Supplement, 0080–00FF\n// - U+00D7 × Multiplication sign\n// - U+00F7 ÷ Division sign\n// Latin Extended-A, 0100–017F\n// Latin Extended-B, 0180–024F\n// IPA Extensions, 0250–02AF\n// Spacing Modifier Letters, 02B0–02FF\n// - U+02C7 ˇ ˇ Caron\n// - U+02D8 ˘ ˘ Breve\n// - U+02D9 ˙ ˙ Dot Above\n// - U+02DA ˚ ˚ Ring Above\n// - U+02DB ˛ ˛ Ogonek\n// - U+02DC ˜ ˜ Small Tilde\n// - U+02DD ˝ ˝ Double Acute Accent\n// Latin Extended Additional, 1E00–1EFF\nvar extendedWordChars = /^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/;\nvar reWhitespace = /\\S/;\nvar wordDiff = new\n/*istanbul ignore start*/\n_base\n/*istanbul ignore end*/\n[\n/*istanbul ignore start*/\n\"default\"\n/*istanbul ignore end*/\n]();\n\n/*istanbul ignore start*/\nexports.wordDiff = wordDiff;\n\n/*istanbul ignore end*/\nwordDiff.equals = function (left, right) {\n if (this.options.ignoreCase) {\n left = left.toLowerCase();\n right = right.toLowerCase();\n }\n\n return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);\n};\n\nwordDiff.tokenize = function (value) {\n // All whitespace symbols except newline group into one token, each newline - in separate token\n var tokens = value.split(/([^\\S\\r\\n]+|[()[\\]{}'\"\\r\\n]|\\b)/); // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.\n\n for (var i = 0; i < tokens.length - 1; i++) {\n // If we have an empty string in the next field and we have only word chars before and after, merge\n if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {\n tokens[i] += tokens[i + 2];\n tokens.splice(i + 1, 2);\n i--;\n }\n }\n\n return tokens;\n};\n\nfunction diffWords(oldStr, newStr, options) {\n options =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _params\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n generateOptions)\n /*istanbul ignore end*/\n (options, {\n ignoreWhitespace: true\n });\n return wordDiff.diff(oldStr, newStr, options);\n}\n\nfunction diffWordsWithSpace(oldStr, newStr, options) {\n return wordDiff.diff(oldStr, newStr, options);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL3dvcmQuanMiXSwibmFtZXMiOlsiZXh0ZW5kZWRXb3JkQ2hhcnMiLCJyZVdoaXRlc3BhY2UiLCJ3b3JkRGlmZiIsIkRpZmYiLCJlcXVhbHMiLCJsZWZ0IiwicmlnaHQiLCJvcHRpb25zIiwiaWdub3JlQ2FzZSIsInRvTG93ZXJDYXNlIiwiaWdub3JlV2hpdGVzcGFjZSIsInRlc3QiLCJ0b2tlbml6ZSIsInZhbHVlIiwidG9rZW5zIiwic3BsaXQiLCJpIiwibGVuZ3RoIiwic3BsaWNlIiwiZGlmZldvcmRzIiwib2xkU3RyIiwibmV3U3RyIiwiZ2VuZXJhdGVPcHRpb25zIiwiZGlmZiIsImRpZmZXb3Jkc1dpdGhTcGFjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTUEsaUJBQWlCLEdBQUcsK0RBQTFCO0FBRUEsSUFBTUMsWUFBWSxHQUFHLElBQXJCO0FBRU8sSUFBTUMsUUFBUSxHQUFHO0FBQUlDO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBLENBQUosRUFBakI7Ozs7OztBQUNQRCxRQUFRLENBQUNFLE1BQVQsR0FBa0IsVUFBU0MsSUFBVCxFQUFlQyxLQUFmLEVBQXNCO0FBQ3RDLE1BQUksS0FBS0MsT0FBTCxDQUFhQyxVQUFqQixFQUE2QjtBQUMzQkgsSUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNJLFdBQUwsRUFBUDtBQUNBSCxJQUFBQSxLQUFLLEdBQUdBLEtBQUssQ0FBQ0csV0FBTixFQUFSO0FBQ0Q7O0FBQ0QsU0FBT0osSUFBSSxLQUFLQyxLQUFULElBQW1CLEtBQUtDLE9BQUwsQ0FBYUcsZ0JBQWIsSUFBaUMsQ0FBQ1QsWUFBWSxDQUFDVSxJQUFiLENBQWtCTixJQUFsQixDQUFsQyxJQUE2RCxDQUFDSixZQUFZLENBQUNVLElBQWIsQ0FBa0JMLEtBQWxCLENBQXhGO0FBQ0QsQ0FORDs7QUFPQUosUUFBUSxDQUFDVSxRQUFULEdBQW9CLFVBQVNDLEtBQVQsRUFBZ0I7QUFDbEM7QUFDQSxNQUFJQyxNQUFNLEdBQUdELEtBQUssQ0FBQ0UsS0FBTixDQUFZLGlDQUFaLENBQWIsQ0FGa0MsQ0FJbEM7O0FBQ0EsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRixNQUFNLENBQUNHLE1BQVAsR0FBZ0IsQ0FBcEMsRUFBdUNELENBQUMsRUFBeEMsRUFBNEM7QUFDMUM7QUFDQSxRQUFJLENBQUNGLE1BQU0sQ0FBQ0UsQ0FBQyxHQUFHLENBQUwsQ0FBUCxJQUFrQkYsTUFBTSxDQUFDRSxDQUFDLEdBQUcsQ0FBTCxDQUF4QixJQUNLaEIsaUJBQWlCLENBQUNXLElBQWxCLENBQXVCRyxNQUFNLENBQUNFLENBQUQsQ0FBN0IsQ0FETCxJQUVLaEIsaUJBQWlCLENBQUNXLElBQWxCLENBQXVCRyxNQUFNLENBQUNFLENBQUMsR0FBRyxDQUFMLENBQTdCLENBRlQsRUFFZ0Q7QUFDOUNGLE1BQUFBLE1BQU0sQ0FBQ0UsQ0FBRCxDQUFOLElBQWFGLE1BQU0sQ0FBQ0UsQ0FBQyxHQUFHLENBQUwsQ0FBbkI7QUFDQUYsTUFBQUEsTUFBTSxDQUFDSSxNQUFQLENBQWNGLENBQUMsR0FBRyxDQUFsQixFQUFxQixDQUFyQjtBQUNBQSxNQUFBQSxDQUFDO0FBQ0Y7QUFDRjs7QUFFRCxTQUFPRixNQUFQO0FBQ0QsQ0FqQkQ7O0FBbUJPLFNBQVNLLFNBQVQsQ0FBbUJDLE1BQW5CLEVBQTJCQyxNQUEzQixFQUFtQ2QsT0FBbkMsRUFBNEM7QUFDakRBLEVBQUFBLE9BQU87QUFBRztBQUFBO0FBQUE7O0FBQUFlO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxHQUFnQmYsT0FBaEIsRUFBeUI7QUFBQ0csSUFBQUEsZ0JBQWdCLEVBQUU7QUFBbkIsR0FBekIsQ0FBVjtBQUNBLFNBQU9SLFFBQVEsQ0FBQ3FCLElBQVQsQ0FBY0gsTUFBZCxFQUFzQkMsTUFBdEIsRUFBOEJkLE9BQTlCLENBQVA7QUFDRDs7QUFFTSxTQUFTaUIsa0JBQVQsQ0FBNEJKLE1BQTVCLEVBQW9DQyxNQUFwQyxFQUE0Q2QsT0FBNUMsRUFBcUQ7QUFDMUQsU0FBT0wsUUFBUSxDQUFDcUIsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmQsT0FBOUIsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7Z2VuZXJhdGVPcHRpb25zfSBmcm9tICcuLi91dGlsL3BhcmFtcyc7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX3NjcmlwdF9pbl9Vbmljb2RlXG4vL1xuLy8gUmFuZ2VzIGFuZCBleGNlcHRpb25zOlxuLy8gTGF0aW4tMSBTdXBwbGVtZW50LCAwMDgw4oCTMDBGRlxuLy8gIC0gVSswMEQ3ICDDlyBNdWx0aXBsaWNhdGlvbiBzaWduXG4vLyAgLSBVKzAwRjcgIMO3IERpdmlzaW9uIHNpZ25cbi8vIExhdGluIEV4dGVuZGVkLUEsIDAxMDDigJMwMTdGXG4vLyBMYXRpbiBFeHRlbmRlZC1CLCAwMTgw4oCTMDI0RlxuLy8gSVBBIEV4dGVuc2lvbnMsIDAyNTDigJMwMkFGXG4vLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMsIDAyQjDigJMwMkZGXG4vLyAgLSBVKzAyQzcgIMuHICYjNzExOyAgQ2Fyb25cbi8vICAtIFUrMDJEOCAgy5ggJiM3Mjg7ICBCcmV2ZVxuLy8gIC0gVSswMkQ5ICDLmSAmIzcyOTsgIERvdCBBYm92ZVxuLy8gIC0gVSswMkRBICDLmiAmIzczMDsgIFJpbmcgQWJvdmVcbi8vICAtIFUrMDJEQiAgy5sgJiM3MzE7ICBPZ29uZWtcbi8vICAtIFUrMDJEQyAgy5wgJiM3MzI7ICBTbWFsbCBUaWxkZVxuLy8gIC0gVSswMkREICDLnSAmIzczMzsgIERvdWJsZSBBY3V0ZSBBY2NlbnRcbi8vIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwsIDFFMDDigJMxRUZGXG5jb25zdCBleHRlbmRlZFdvcmRDaGFycyA9IC9eW2EtekEtWlxcdXtDMH0tXFx1e0ZGfVxcdXtEOH0tXFx1e0Y2fVxcdXtGOH0tXFx1ezJDNn1cXHV7MkM4fS1cXHV7MkQ3fVxcdXsyREV9LVxcdXsyRkZ9XFx1ezFFMDB9LVxcdXsxRUZGfV0rJC91O1xuXG5jb25zdCByZVdoaXRlc3BhY2UgPSAvXFxTLztcblxuZXhwb3J0IGNvbnN0IHdvcmREaWZmID0gbmV3IERpZmYoKTtcbndvcmREaWZmLmVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSkge1xuICAgIGxlZnQgPSBsZWZ0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmlnaHQgPSByaWdodC50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCAodGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UgJiYgIXJlV2hpdGVzcGFjZS50ZXN0KGxlZnQpICYmICFyZVdoaXRlc3BhY2UudGVzdChyaWdodCkpO1xufTtcbndvcmREaWZmLnRva2VuaXplID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgLy8gQWxsIHdoaXRlc3BhY2Ugc3ltYm9scyBleGNlcHQgbmV3bGluZSBncm91cCBpbnRvIG9uZSB0b2tlbiwgZWFjaCBuZXdsaW5lIC0gaW4gc2VwYXJhdGUgdG9rZW5cbiAgbGV0IHRva2VucyA9IHZhbHVlLnNwbGl0KC8oW15cXFNcXHJcXG5dK3xbKClbXFxde30nXCJcXHJcXG5dfFxcYikvKTtcblxuICAvLyBKb2luIHRoZSBib3VuZGFyeSBzcGxpdHMgdGhhdCB3ZSBkbyBub3QgY29uc2lkZXIgdG8gYmUgYm91bmRhcmllcy4gVGhpcyBpcyBwcmltYXJpbHkgdGhlIGV4dGVuZGVkIExhdGluIGNoYXJhY3RlciBzZXQuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gZW1wdHkgc3RyaW5nIGluIHRoZSBuZXh0IGZpZWxkIGFuZCB3ZSBoYXZlIG9ubHkgd29yZCBjaGFycyBiZWZvcmUgYW5kIGFmdGVyLCBtZXJnZVxuICAgIGlmICghdG9rZW5zW2kgKyAxXSAmJiB0b2tlbnNbaSArIDJdXG4gICAgICAgICAgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaV0pXG4gICAgICAgICAgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaSArIDJdKSkge1xuICAgICAgdG9rZW5zW2ldICs9IHRva2Vuc1tpICsgMl07XG4gICAgICB0b2tlbnMuc3BsaWNlKGkgKyAxLCAyKTtcbiAgICAgIGktLTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZXb3JkcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICBvcHRpb25zID0gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIHtpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlfSk7XG4gIHJldHVybiB3b3JkRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZXb3Jkc1dpdGhTcGFjZShvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"Diff\", {\n enumerable: true,\n get: function get() {\n return _base[\"default\"];\n }\n});\nObject.defineProperty(exports, \"diffChars\", {\n enumerable: true,\n get: function get() {\n return _character.diffChars;\n }\n});\nObject.defineProperty(exports, \"diffWords\", {\n enumerable: true,\n get: function get() {\n return _word.diffWords;\n }\n});\nObject.defineProperty(exports, \"diffWordsWithSpace\", {\n enumerable: true,\n get: function get() {\n return _word.diffWordsWithSpace;\n }\n});\nObject.defineProperty(exports, \"diffLines\", {\n enumerable: true,\n get: function get() {\n return _line.diffLines;\n }\n});\nObject.defineProperty(exports, \"diffTrimmedLines\", {\n enumerable: true,\n get: function get() {\n return _line.diffTrimmedLines;\n }\n});\nObject.defineProperty(exports, \"diffSentences\", {\n enumerable: true,\n get: function get() {\n return _sentence.diffSentences;\n }\n});\nObject.defineProperty(exports, \"diffCss\", {\n enumerable: true,\n get: function get() {\n return _css.diffCss;\n }\n});\nObject.defineProperty(exports, \"diffJson\", {\n enumerable: true,\n get: function get() {\n return _json.diffJson;\n }\n});\nObject.defineProperty(exports, \"canonicalize\", {\n enumerable: true,\n get: function get() {\n return _json.canonicalize;\n }\n});\nObject.defineProperty(exports, \"diffArrays\", {\n enumerable: true,\n get: function get() {\n return _array.diffArrays;\n }\n});\nObject.defineProperty(exports, \"applyPatch\", {\n enumerable: true,\n get: function get() {\n return _apply.applyPatch;\n }\n});\nObject.defineProperty(exports, \"applyPatches\", {\n enumerable: true,\n get: function get() {\n return _apply.applyPatches;\n }\n});\nObject.defineProperty(exports, \"parsePatch\", {\n enumerable: true,\n get: function get() {\n return _parse.parsePatch;\n }\n});\nObject.defineProperty(exports, \"merge\", {\n enumerable: true,\n get: function get() {\n return _merge.merge;\n }\n});\nObject.defineProperty(exports, \"structuredPatch\", {\n enumerable: true,\n get: function get() {\n return _create.structuredPatch;\n }\n});\nObject.defineProperty(exports, \"createTwoFilesPatch\", {\n enumerable: true,\n get: function get() {\n return _create.createTwoFilesPatch;\n }\n});\nObject.defineProperty(exports, \"createPatch\", {\n enumerable: true,\n get: function get() {\n return _create.createPatch;\n }\n});\nObject.defineProperty(exports, \"convertChangesToDMP\", {\n enumerable: true,\n get: function get() {\n return _dmp.convertChangesToDMP;\n }\n});\nObject.defineProperty(exports, \"convertChangesToXML\", {\n enumerable: true,\n get: function get() {\n return _xml.convertChangesToXML;\n }\n});\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_base = _interopRequireDefault(require(\"./diff/base\"))\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_character = require(\"./diff/character\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_word = require(\"./diff/word\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_line = require(\"./diff/line\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_sentence = require(\"./diff/sentence\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_css = require(\"./diff/css\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_json = require(\"./diff/json\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_array = require(\"./diff/array\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_apply = require(\"./patch/apply\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_parse = require(\"./patch/parse\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_merge = require(\"./patch/merge\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_create = require(\"./patch/create\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_dmp = require(\"./convert/dmp\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_xml = require(\"./convert/xml\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBTZWUgTElDRU5TRSBmaWxlIGZvciB0ZXJtcyBvZiB1c2UgKi9cblxuLypcbiAqIFRleHQgZGlmZiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBUElTOlxuICogSnNEaWZmLmRpZmZDaGFyczogQ2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBkaWZmXG4gKiBKc0RpZmYuZGlmZldvcmRzOiBXb3JkIChhcyBkZWZpbmVkIGJ5IFxcYiByZWdleCkgZGlmZiB3aGljaCBpZ25vcmVzIHdoaXRlc3BhY2VcbiAqIEpzRGlmZi5kaWZmTGluZXM6IExpbmUgYmFzZWQgZGlmZlxuICpcbiAqIEpzRGlmZi5kaWZmQ3NzOiBEaWZmIHRhcmdldGVkIGF0IENTUyBjb250ZW50XG4gKlxuICogVGhlc2UgbWV0aG9kcyBhcmUgYmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uIHByb3Bvc2VkIGluXG4gKiBcIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9uc1wiIChNeWVycywgMTk4NikuXG4gKiBodHRwOi8vY2l0ZXNlZXJ4LmlzdC5wc3UuZWR1L3ZpZXdkb2Mvc3VtbWFyeT9kb2k9MTAuMS4xLjQuNjkyN1xuICovXG5pbXBvcnQgRGlmZiBmcm9tICcuL2RpZmYvYmFzZSc7XG5pbXBvcnQge2RpZmZDaGFyc30gZnJvbSAnLi9kaWZmL2NoYXJhY3Rlcic7XG5pbXBvcnQge2RpZmZXb3JkcywgZGlmZldvcmRzV2l0aFNwYWNlfSBmcm9tICcuL2RpZmYvd29yZCc7XG5pbXBvcnQge2RpZmZMaW5lcywgZGlmZlRyaW1tZWRMaW5lc30gZnJvbSAnLi9kaWZmL2xpbmUnO1xuaW1wb3J0IHtkaWZmU2VudGVuY2VzfSBmcm9tICcuL2RpZmYvc2VudGVuY2UnO1xuXG5pbXBvcnQge2RpZmZDc3N9IGZyb20gJy4vZGlmZi9jc3MnO1xuaW1wb3J0IHtkaWZmSnNvbiwgY2Fub25pY2FsaXplfSBmcm9tICcuL2RpZmYvanNvbic7XG5cbmltcG9ydCB7ZGlmZkFycmF5c30gZnJvbSAnLi9kaWZmL2FycmF5JztcblxuaW1wb3J0IHthcHBseVBhdGNoLCBhcHBseVBhdGNoZXN9IGZyb20gJy4vcGF0Y2gvYXBwbHknO1xuaW1wb3J0IHtwYXJzZVBhdGNofSBmcm9tICcuL3BhdGNoL3BhcnNlJztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJy4vcGF0Y2gvbWVyZ2UnO1xuaW1wb3J0IHtzdHJ1Y3R1cmVkUGF0Y2gsIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gsIGNyZWF0ZVBhdGNofSBmcm9tICcuL3BhdGNoL2NyZWF0ZSc7XG5cbmltcG9ydCB7Y29udmVydENoYW5nZXNUb0RNUH0gZnJvbSAnLi9jb252ZXJ0L2RtcCc7XG5pbXBvcnQge2NvbnZlcnRDaGFuZ2VzVG9YTUx9IGZyb20gJy4vY29udmVydC94bWwnO1xuXG5leHBvcnQge1xuICBEaWZmLFxuXG4gIGRpZmZDaGFycyxcbiAgZGlmZldvcmRzLFxuICBkaWZmV29yZHNXaXRoU3BhY2UsXG4gIGRpZmZMaW5lcyxcbiAgZGlmZlRyaW1tZWRMaW5lcyxcbiAgZGlmZlNlbnRlbmNlcyxcblxuICBkaWZmQ3NzLFxuICBkaWZmSnNvbixcblxuICBkaWZmQXJyYXlzLFxuXG4gIHN0cnVjdHVyZWRQYXRjaCxcbiAgY3JlYXRlVHdvRmlsZXNQYXRjaCxcbiAgY3JlYXRlUGF0Y2gsXG4gIGFwcGx5UGF0Y2gsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgcGFyc2VQYXRjaCxcbiAgbWVyZ2UsXG4gIGNvbnZlcnRDaGFuZ2VzVG9ETVAsXG4gIGNvbnZlcnRDaGFuZ2VzVG9YTUwsXG4gIGNhbm9uaWNhbGl6ZVxufTtcbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.applyPatch = applyPatch;\nexports.applyPatches = applyPatches;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_parse = require(\"./parse\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_distanceIterator = _interopRequireDefault(require(\"../util/distance-iterator\"))\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\n/*istanbul ignore end*/\nfunction applyPatch(source, uniDiff) {\n /*istanbul ignore start*/\n var\n /*istanbul ignore end*/\n options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (typeof uniDiff === 'string') {\n uniDiff =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _parse\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n parsePatch)\n /*istanbul ignore end*/\n (uniDiff);\n }\n\n if (Array.isArray(uniDiff)) {\n if (uniDiff.length > 1) {\n throw new Error('applyPatch only works with a single input.');\n }\n\n uniDiff = uniDiff[0];\n } // Apply the diff to the input\n\n\n var lines = source.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n delimiters = source.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n hunks = uniDiff.hunks,\n compareLine = options.compareLine || function (lineNumber, line, operation, patchContent)\n /*istanbul ignore start*/\n {\n return (\n /*istanbul ignore end*/\n line === patchContent\n );\n },\n errorCount = 0,\n fuzzFactor = options.fuzzFactor || 0,\n minLine = 0,\n offset = 0,\n removeEOFNL,\n addEOFNL;\n /**\n * Checks if the hunk exactly fits on the provided location\n */\n\n\n function hunkFits(hunk, toPos) {\n for (var j = 0; j < hunk.lines.length; j++) {\n var line = hunk.lines[j],\n operation = line.length > 0 ? line[0] : ' ',\n content = line.length > 0 ? line.substr(1) : line;\n\n if (operation === ' ' || operation === '-') {\n // Context sanity check\n if (!compareLine(toPos + 1, lines[toPos], operation, content)) {\n errorCount++;\n\n if (errorCount > fuzzFactor) {\n return false;\n }\n }\n\n toPos++;\n }\n }\n\n return true;\n } // Search best fit offsets for each hunk based on the previous ones\n\n\n for (var i = 0; i < hunks.length; i++) {\n var hunk = hunks[i],\n maxLine = lines.length - hunk.oldLines,\n localOffset = 0,\n toPos = offset + hunk.oldStart - 1;\n var iterator =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _distanceIterator\n /*istanbul ignore end*/\n [\n /*istanbul ignore start*/\n \"default\"\n /*istanbul ignore end*/\n ])(toPos, minLine, maxLine);\n\n for (; localOffset !== undefined; localOffset = iterator()) {\n if (hunkFits(hunk, toPos + localOffset)) {\n hunk.offset = offset += localOffset;\n break;\n }\n }\n\n if (localOffset === undefined) {\n return false;\n } // Set lower text limit to end of the current hunk, so next ones don't try\n // to fit over already patched text\n\n\n minLine = hunk.offset + hunk.oldStart + hunk.oldLines;\n } // Apply patch hunks\n\n\n var diffOffset = 0;\n\n for (var _i = 0; _i < hunks.length; _i++) {\n var _hunk = hunks[_i],\n _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;\n\n diffOffset += _hunk.newLines - _hunk.oldLines;\n\n for (var j = 0; j < _hunk.lines.length; j++) {\n var line = _hunk.lines[j],\n operation = line.length > 0 ? line[0] : ' ',\n content = line.length > 0 ? line.substr(1) : line,\n delimiter = _hunk.linedelimiters[j];\n\n if (operation === ' ') {\n _toPos++;\n } else if (operation === '-') {\n lines.splice(_toPos, 1);\n delimiters.splice(_toPos, 1);\n /* istanbul ignore else */\n } else if (operation === '+') {\n lines.splice(_toPos, 0, content);\n delimiters.splice(_toPos, 0, delimiter);\n _toPos++;\n } else if (operation === '\\\\') {\n var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;\n\n if (previousOperation === '+') {\n removeEOFNL = true;\n } else if (previousOperation === '-') {\n addEOFNL = true;\n }\n }\n }\n } // Handle EOFNL insertion/removal\n\n\n if (removeEOFNL) {\n while (!lines[lines.length - 1]) {\n lines.pop();\n delimiters.pop();\n }\n } else if (addEOFNL) {\n lines.push('');\n delimiters.push('\\n');\n }\n\n for (var _k = 0; _k < lines.length - 1; _k++) {\n lines[_k] = lines[_k] + delimiters[_k];\n }\n\n return lines.join('');\n} // Wrapper that supports multiple file patches via callbacks.\n\n\nfunction applyPatches(uniDiff, options) {\n if (typeof uniDiff === 'string') {\n uniDiff =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _parse\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n parsePatch)\n /*istanbul ignore end*/\n (uniDiff);\n }\n\n var currentIndex = 0;\n\n function processIndex() {\n var index = uniDiff[currentIndex++];\n\n if (!index) {\n return options.complete();\n }\n\n options.loadFile(index, function (err, data) {\n if (err) {\n return options.complete(err);\n }\n\n var updatedContent = applyPatch(data, index, options);\n options.patched(index, updatedContent, function (err) {\n if (err) {\n return options.complete(err);\n }\n\n processIndex();\n });\n });\n }\n\n processIndex();\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6WyJhcHBseVBhdGNoIiwic291cmNlIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJwYXJzZVBhdGNoIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiRXJyb3IiLCJsaW5lcyIsInNwbGl0IiwiZGVsaW1pdGVycyIsIm1hdGNoIiwiaHVua3MiLCJjb21wYXJlTGluZSIsImxpbmVOdW1iZXIiLCJsaW5lIiwib3BlcmF0aW9uIiwicGF0Y2hDb250ZW50IiwiZXJyb3JDb3VudCIsImZ1enpGYWN0b3IiLCJtaW5MaW5lIiwib2Zmc2V0IiwicmVtb3ZlRU9GTkwiLCJhZGRFT0ZOTCIsImh1bmtGaXRzIiwiaHVuayIsInRvUG9zIiwiaiIsImNvbnRlbnQiLCJzdWJzdHIiLCJpIiwibWF4TGluZSIsIm9sZExpbmVzIiwibG9jYWxPZmZzZXQiLCJvbGRTdGFydCIsIml0ZXJhdG9yIiwiZGlzdGFuY2VJdGVyYXRvciIsInVuZGVmaW5lZCIsImRpZmZPZmZzZXQiLCJuZXdMaW5lcyIsImRlbGltaXRlciIsImxpbmVkZWxpbWl0ZXJzIiwic3BsaWNlIiwicHJldmlvdXNPcGVyYXRpb24iLCJwb3AiLCJwdXNoIiwiX2siLCJqb2luIiwiYXBwbHlQYXRjaGVzIiwiY3VycmVudEluZGV4IiwicHJvY2Vzc0luZGV4IiwiaW5kZXgiLCJjb21wbGV0ZSIsImxvYWRGaWxlIiwiZXJyIiwiZGF0YSIsInVwZGF0ZWRDb250ZW50IiwicGF0Y2hlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxTQUFTQSxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsT0FBNUIsRUFBbUQ7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJOztBQUN4RCxNQUFJLE9BQU9ELE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7QUFDL0JBLElBQUFBLE9BQU87QUFBRztBQUFBO0FBQUE7O0FBQUFFO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxLQUFXRixPQUFYLENBQVY7QUFDRDs7QUFFRCxNQUFJRyxLQUFLLENBQUNDLE9BQU4sQ0FBY0osT0FBZCxDQUFKLEVBQTRCO0FBQzFCLFFBQUlBLE9BQU8sQ0FBQ0ssTUFBUixHQUFpQixDQUFyQixFQUF3QjtBQUN0QixZQUFNLElBQUlDLEtBQUosQ0FBVSw0Q0FBVixDQUFOO0FBQ0Q7O0FBRUROLElBQUFBLE9BQU8sR0FBR0EsT0FBTyxDQUFDLENBQUQsQ0FBakI7QUFDRCxHQVh1RCxDQWF4RDs7O0FBQ0EsTUFBSU8sS0FBSyxHQUFHUixNQUFNLENBQUNTLEtBQVAsQ0FBYSxxQkFBYixDQUFaO0FBQUEsTUFDSUMsVUFBVSxHQUFHVixNQUFNLENBQUNXLEtBQVAsQ0FBYSxzQkFBYixLQUF3QyxFQUR6RDtBQUFBLE1BRUlDLEtBQUssR0FBR1gsT0FBTyxDQUFDVyxLQUZwQjtBQUFBLE1BSUlDLFdBQVcsR0FBR1gsT0FBTyxDQUFDVyxXQUFSLElBQXdCLFVBQUNDLFVBQUQsRUFBYUMsSUFBYixFQUFtQkMsU0FBbkIsRUFBOEJDLFlBQTlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0NGLE1BQUFBLElBQUksS0FBS0U7QUFBeEQ7QUFBQSxHQUoxQztBQUFBLE1BS0lDLFVBQVUsR0FBRyxDQUxqQjtBQUFBLE1BTUlDLFVBQVUsR0FBR2pCLE9BQU8sQ0FBQ2lCLFVBQVIsSUFBc0IsQ0FOdkM7QUFBQSxNQU9JQyxPQUFPLEdBQUcsQ0FQZDtBQUFBLE1BUUlDLE1BQU0sR0FBRyxDQVJiO0FBQUEsTUFVSUMsV0FWSjtBQUFBLE1BV0lDLFFBWEo7QUFhQTs7Ozs7QUFHQSxXQUFTQyxRQUFULENBQWtCQyxJQUFsQixFQUF3QkMsS0FBeEIsRUFBK0I7QUFDN0IsU0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRixJQUFJLENBQUNqQixLQUFMLENBQVdGLE1BQS9CLEVBQXVDcUIsQ0FBQyxFQUF4QyxFQUE0QztBQUMxQyxVQUFJWixJQUFJLEdBQUdVLElBQUksQ0FBQ2pCLEtBQUwsQ0FBV21CLENBQVgsQ0FBWDtBQUFBLFVBQ0lYLFNBQVMsR0FBSUQsSUFBSSxDQUFDVCxNQUFMLEdBQWMsQ0FBZCxHQUFrQlMsSUFBSSxDQUFDLENBQUQsQ0FBdEIsR0FBNEIsR0FEN0M7QUFBQSxVQUVJYSxPQUFPLEdBQUliLElBQUksQ0FBQ1QsTUFBTCxHQUFjLENBQWQsR0FBa0JTLElBQUksQ0FBQ2MsTUFBTCxDQUFZLENBQVosQ0FBbEIsR0FBbUNkLElBRmxEOztBQUlBLFVBQUlDLFNBQVMsS0FBSyxHQUFkLElBQXFCQSxTQUFTLEtBQUssR0FBdkMsRUFBNEM7QUFDMUM7QUFDQSxZQUFJLENBQUNILFdBQVcsQ0FBQ2EsS0FBSyxHQUFHLENBQVQsRUFBWWxCLEtBQUssQ0FBQ2tCLEtBQUQsQ0FBakIsRUFBMEJWLFNBQTFCLEVBQXFDWSxPQUFyQyxDQUFoQixFQUErRDtBQUM3RFYsVUFBQUEsVUFBVTs7QUFFVixjQUFJQSxVQUFVLEdBQUdDLFVBQWpCLEVBQTZCO0FBQzNCLG1CQUFPLEtBQVA7QUFDRDtBQUNGOztBQUNETyxRQUFBQSxLQUFLO0FBQ047QUFDRjs7QUFFRCxXQUFPLElBQVA7QUFDRCxHQWxEdUQsQ0FvRHhEOzs7QUFDQSxPQUFLLElBQUlJLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdsQixLQUFLLENBQUNOLE1BQTFCLEVBQWtDd0IsQ0FBQyxFQUFuQyxFQUF1QztBQUNyQyxRQUFJTCxJQUFJLEdBQUdiLEtBQUssQ0FBQ2tCLENBQUQsQ0FBaEI7QUFBQSxRQUNJQyxPQUFPLEdBQUd2QixLQUFLLENBQUNGLE1BQU4sR0FBZW1CLElBQUksQ0FBQ08sUUFEbEM7QUFBQSxRQUVJQyxXQUFXLEdBQUcsQ0FGbEI7QUFBQSxRQUdJUCxLQUFLLEdBQUdMLE1BQU0sR0FBR0ksSUFBSSxDQUFDUyxRQUFkLEdBQXlCLENBSHJDO0FBS0EsUUFBSUMsUUFBUTtBQUFHO0FBQUE7QUFBQTs7QUFBQUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsT0FBaUJWLEtBQWpCLEVBQXdCTixPQUF4QixFQUFpQ1csT0FBakMsQ0FBZjs7QUFFQSxXQUFPRSxXQUFXLEtBQUtJLFNBQXZCLEVBQWtDSixXQUFXLEdBQUdFLFFBQVEsRUFBeEQsRUFBNEQ7QUFDMUQsVUFBSVgsUUFBUSxDQUFDQyxJQUFELEVBQU9DLEtBQUssR0FBR08sV0FBZixDQUFaLEVBQXlDO0FBQ3ZDUixRQUFBQSxJQUFJLENBQUNKLE1BQUwsR0FBY0EsTUFBTSxJQUFJWSxXQUF4QjtBQUNBO0FBQ0Q7QUFDRjs7QUFFRCxRQUFJQSxXQUFXLEtBQUtJLFNBQXBCLEVBQStCO0FBQzdCLGFBQU8sS0FBUDtBQUNELEtBakJvQyxDQW1CckM7QUFDQTs7O0FBQ0FqQixJQUFBQSxPQUFPLEdBQUdLLElBQUksQ0FBQ0osTUFBTCxHQUFjSSxJQUFJLENBQUNTLFFBQW5CLEdBQThCVCxJQUFJLENBQUNPLFFBQTdDO0FBQ0QsR0EzRXVELENBNkV4RDs7O0FBQ0EsTUFBSU0sVUFBVSxHQUFHLENBQWpCOztBQUNBLE9BQUssSUFBSVIsRUFBQyxHQUFHLENBQWIsRUFBZ0JBLEVBQUMsR0FBR2xCLEtBQUssQ0FBQ04sTUFBMUIsRUFBa0N3QixFQUFDLEVBQW5DLEVBQXVDO0FBQ3JDLFFBQUlMLEtBQUksR0FBR2IsS0FBSyxDQUFDa0IsRUFBRCxDQUFoQjtBQUFBLFFBQ0lKLE1BQUssR0FBR0QsS0FBSSxDQUFDUyxRQUFMLEdBQWdCVCxLQUFJLENBQUNKLE1BQXJCLEdBQThCaUIsVUFBOUIsR0FBMkMsQ0FEdkQ7O0FBRUFBLElBQUFBLFVBQVUsSUFBSWIsS0FBSSxDQUFDYyxRQUFMLEdBQWdCZCxLQUFJLENBQUNPLFFBQW5DOztBQUVBLFNBQUssSUFBSUwsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0YsS0FBSSxDQUFDakIsS0FBTCxDQUFXRixNQUEvQixFQUF1Q3FCLENBQUMsRUFBeEMsRUFBNEM7QUFDMUMsVUFBSVosSUFBSSxHQUFHVSxLQUFJLENBQUNqQixLQUFMLENBQVdtQixDQUFYLENBQVg7QUFBQSxVQUNJWCxTQUFTLEdBQUlELElBQUksQ0FBQ1QsTUFBTCxHQUFjLENBQWQsR0FBa0JTLElBQUksQ0FBQyxDQUFELENBQXRCLEdBQTRCLEdBRDdDO0FBQUEsVUFFSWEsT0FBTyxHQUFJYixJQUFJLENBQUNULE1BQUwsR0FBYyxDQUFkLEdBQWtCUyxJQUFJLENBQUNjLE1BQUwsQ0FBWSxDQUFaLENBQWxCLEdBQW1DZCxJQUZsRDtBQUFBLFVBR0l5QixTQUFTLEdBQUdmLEtBQUksQ0FBQ2dCLGNBQUwsQ0FBb0JkLENBQXBCLENBSGhCOztBQUtBLFVBQUlYLFNBQVMsS0FBSyxHQUFsQixFQUF1QjtBQUNyQlUsUUFBQUEsTUFBSztBQUNOLE9BRkQsTUFFTyxJQUFJVixTQUFTLEtBQUssR0FBbEIsRUFBdUI7QUFDNUJSLFFBQUFBLEtBQUssQ0FBQ2tDLE1BQU4sQ0FBYWhCLE1BQWIsRUFBb0IsQ0FBcEI7QUFDQWhCLFFBQUFBLFVBQVUsQ0FBQ2dDLE1BQVgsQ0FBa0JoQixNQUFsQixFQUF5QixDQUF6QjtBQUNGO0FBQ0MsT0FKTSxNQUlBLElBQUlWLFNBQVMsS0FBSyxHQUFsQixFQUF1QjtBQUM1QlIsUUFBQUEsS0FBSyxDQUFDa0MsTUFBTixDQUFhaEIsTUFBYixFQUFvQixDQUFwQixFQUF1QkUsT0FBdkI7QUFDQWxCLFFBQUFBLFVBQVUsQ0FBQ2dDLE1BQVgsQ0FBa0JoQixNQUFsQixFQUF5QixDQUF6QixFQUE0QmMsU0FBNUI7QUFDQWQsUUFBQUEsTUFBSztBQUNOLE9BSk0sTUFJQSxJQUFJVixTQUFTLEtBQUssSUFBbEIsRUFBd0I7QUFDN0IsWUFBSTJCLGlCQUFpQixHQUFHbEIsS0FBSSxDQUFDakIsS0FBTCxDQUFXbUIsQ0FBQyxHQUFHLENBQWYsSUFBb0JGLEtBQUksQ0FBQ2pCLEtBQUwsQ0FBV21CLENBQUMsR0FBRyxDQUFmLEVBQWtCLENBQWxCLENBQXBCLEdBQTJDLElBQW5FOztBQUNBLFlBQUlnQixpQkFBaUIsS0FBSyxHQUExQixFQUErQjtBQUM3QnJCLFVBQUFBLFdBQVcsR0FBRyxJQUFkO0FBQ0QsU0FGRCxNQUVPLElBQUlxQixpQkFBaUIsS0FBSyxHQUExQixFQUErQjtBQUNwQ3BCLFVBQUFBLFFBQVEsR0FBRyxJQUFYO0FBQ0Q7QUFDRjtBQUNGO0FBQ0YsR0E3R3VELENBK0d4RDs7O0FBQ0EsTUFBSUQsV0FBSixFQUFpQjtBQUNmLFdBQU8sQ0FBQ2QsS0FBSyxDQUFDQSxLQUFLLENBQUNGLE1BQU4sR0FBZSxDQUFoQixDQUFiLEVBQWlDO0FBQy9CRSxNQUFBQSxLQUFLLENBQUNvQyxHQUFOO0FBQ0FsQyxNQUFBQSxVQUFVLENBQUNrQyxHQUFYO0FBQ0Q7QUFDRixHQUxELE1BS08sSUFBSXJCLFFBQUosRUFBYztBQUNuQmYsSUFBQUEsS0FBSyxDQUFDcUMsSUFBTixDQUFXLEVBQVg7QUFDQW5DLElBQUFBLFVBQVUsQ0FBQ21DLElBQVgsQ0FBZ0IsSUFBaEI7QUFDRDs7QUFDRCxPQUFLLElBQUlDLEVBQUUsR0FBRyxDQUFkLEVBQWlCQSxFQUFFLEdBQUd0QyxLQUFLLENBQUNGLE1BQU4sR0FBZSxDQUFyQyxFQUF3Q3dDLEVBQUUsRUFBMUMsRUFBOEM7QUFDNUN0QyxJQUFBQSxLQUFLLENBQUNzQyxFQUFELENBQUwsR0FBWXRDLEtBQUssQ0FBQ3NDLEVBQUQsQ0FBTCxHQUFZcEMsVUFBVSxDQUFDb0MsRUFBRCxDQUFsQztBQUNEOztBQUNELFNBQU90QyxLQUFLLENBQUN1QyxJQUFOLENBQVcsRUFBWCxDQUFQO0FBQ0QsQyxDQUVEOzs7QUFDTyxTQUFTQyxZQUFULENBQXNCL0MsT0FBdEIsRUFBK0JDLE9BQS9CLEVBQXdDO0FBQzdDLE1BQUksT0FBT0QsT0FBUCxLQUFtQixRQUF2QixFQUFpQztBQUMvQkEsSUFBQUEsT0FBTztBQUFHO0FBQUE7QUFBQTs7QUFBQUU7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLEtBQVdGLE9BQVgsQ0FBVjtBQUNEOztBQUVELE1BQUlnRCxZQUFZLEdBQUcsQ0FBbkI7O0FBQ0EsV0FBU0MsWUFBVCxHQUF3QjtBQUN0QixRQUFJQyxLQUFLLEdBQUdsRCxPQUFPLENBQUNnRCxZQUFZLEVBQWIsQ0FBbkI7O0FBQ0EsUUFBSSxDQUFDRSxLQUFMLEVBQVk7QUFDVixhQUFPakQsT0FBTyxDQUFDa0QsUUFBUixFQUFQO0FBQ0Q7O0FBRURsRCxJQUFBQSxPQUFPLENBQUNtRCxRQUFSLENBQWlCRixLQUFqQixFQUF3QixVQUFTRyxHQUFULEVBQWNDLElBQWQsRUFBb0I7QUFDMUMsVUFBSUQsR0FBSixFQUFTO0FBQ1AsZUFBT3BELE9BQU8sQ0FBQ2tELFFBQVIsQ0FBaUJFLEdBQWpCLENBQVA7QUFDRDs7QUFFRCxVQUFJRSxjQUFjLEdBQUd6RCxVQUFVLENBQUN3RCxJQUFELEVBQU9KLEtBQVAsRUFBY2pELE9BQWQsQ0FBL0I7QUFDQUEsTUFBQUEsT0FBTyxDQUFDdUQsT0FBUixDQUFnQk4sS0FBaEIsRUFBdUJLLGNBQXZCLEVBQXVDLFVBQVNGLEdBQVQsRUFBYztBQUNuRCxZQUFJQSxHQUFKLEVBQVM7QUFDUCxpQkFBT3BELE9BQU8sQ0FBQ2tELFFBQVIsQ0FBaUJFLEdBQWpCLENBQVA7QUFDRDs7QUFFREosUUFBQUEsWUFBWTtBQUNiLE9BTkQ7QUFPRCxLQWJEO0FBY0Q7O0FBQ0RBLEVBQUFBLFlBQVk7QUFDYiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXJzZSc7XG5pbXBvcnQgZGlzdGFuY2VJdGVyYXRvciBmcm9tICcuLi91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgIHVuaURpZmYgPSBwYXJzZVBhdGNoKHVuaURpZmYpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodW5pRGlmZikpIHtcbiAgICBpZiAodW5pRGlmZi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FwcGx5UGF0Y2ggb25seSB3b3JrcyB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuICAgIH1cblxuICAgIHVuaURpZmYgPSB1bmlEaWZmWzBdO1xuICB9XG5cbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG4gIGxldCBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcbiAgICAgIGRlbGltaXRlcnMgPSBzb3VyY2UubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgaHVua3MgPSB1bmlEaWZmLmh1bmtzLFxuXG4gICAgICBjb21wYXJlTGluZSA9IG9wdGlvbnMuY29tcGFyZUxpbmUgfHwgKChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkgPT4gbGluZSA9PT0gcGF0Y2hDb250ZW50KSxcbiAgICAgIGVycm9yQ291bnQgPSAwLFxuICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuICAgICAgbWluTGluZSA9IDAsXG4gICAgICBvZmZzZXQgPSAwLFxuXG4gICAgICByZW1vdmVFT0ZOTCxcbiAgICAgIGFkZEVPRk5MO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGh1bmsgZXhhY3RseSBmaXRzIG9uIHRoZSBwcm92aWRlZCBsb2NhdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGxldCBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSAobGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyksXG4gICAgICAgICAgY29udGVudCA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUpO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgLy8gQ29udGV4dCBzYW5pdHkgY2hlY2tcbiAgICAgICAgaWYgKCFjb21wYXJlTGluZSh0b1BvcyArIDEsIGxpbmVzW3RvUG9zXSwgb3BlcmF0aW9uLCBjb250ZW50KSkge1xuICAgICAgICAgIGVycm9yQ291bnQrKztcblxuICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gZnV6ekZhY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0b1BvcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gU2VhcmNoIGJlc3QgZml0IG9mZnNldHMgZm9yIGVhY2ggaHVuayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGh1bmsgPSBodW5rc1tpXSxcbiAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG4gICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcbiAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcblxuICAgIGxldCBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNldCBsb3dlciB0ZXh0IGxpbWl0IHRvIGVuZCBvZiB0aGUgY3VycmVudCBodW5rLCBzbyBuZXh0IG9uZXMgZG9uJ3QgdHJ5XG4gICAgLy8gdG8gZml0IG92ZXIgYWxyZWFkeSBwYXRjaGVkIHRleHRcbiAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIC8vIEFwcGx5IHBhdGNoIGh1bmtzXG4gIGxldCBkaWZmT2Zmc2V0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBodW5rID0gaHVua3NbaV0sXG4gICAgICAgIHRvUG9zID0gaHVuay5vbGRTdGFydCArIGh1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG4gICAgZGlmZk9mZnNldCArPSBodW5rLm5ld0xpbmVzIC0gaHVuay5vbGRMaW5lcztcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgbGV0IGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lWzBdIDogJyAnKSxcbiAgICAgICAgICBjb250ZW50ID0gKGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZSksXG4gICAgICAgICAgZGVsaW1pdGVyID0gaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIHRvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMSk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAxKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICB0b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBsZXQgcHJldmlvdXNPcGVyYXRpb24gPSBodW5rLmxpbmVzW2ogLSAxXSA/IGh1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcbiAgfVxuICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn1cblxuLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgbGV0IGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHByb2Nlc3NJbmRleCgpO1xufVxuIl19\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.structuredPatch = structuredPatch;\nexports.formatPatch = formatPatch;\nexports.createTwoFilesPatch = createTwoFilesPatch;\nexports.createPatch = createPatch;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_line = require(\"../diff/line\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/*istanbul ignore end*/\nfunction structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n if (!options) {\n options = {};\n }\n\n if (typeof options.context === 'undefined') {\n options.context = 4;\n }\n\n var diff =\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _line\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n diffLines)\n /*istanbul ignore end*/\n (oldStr, newStr, options);\n\n if (!diff) {\n return;\n }\n\n diff.push({\n value: '',\n lines: []\n }); // Append an empty value to make cleanup easier\n\n function contextLines(lines) {\n return lines.map(function (entry) {\n return ' ' + entry;\n });\n }\n\n var hunks = [];\n var oldRangeStart = 0,\n newRangeStart = 0,\n curRange = [],\n oldLine = 1,\n newLine = 1;\n\n /*istanbul ignore start*/\n var _loop = function _loop(\n /*istanbul ignore end*/\n i) {\n var current = diff[i],\n lines = current.lines || current.value.replace(/\\n$/, '').split('\\n');\n current.lines = lines;\n\n if (current.added || current.removed) {\n /*istanbul ignore start*/\n var _curRange;\n\n /*istanbul ignore end*/\n // If we have previous context, start with that\n if (!oldRangeStart) {\n var prev = diff[i - 1];\n oldRangeStart = oldLine;\n newRangeStart = newLine;\n\n if (prev) {\n curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];\n oldRangeStart -= curRange.length;\n newRangeStart -= curRange.length;\n }\n } // Output our changes\n\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_curRange =\n /*istanbul ignore end*/\n curRange).push.apply(\n /*istanbul ignore start*/\n _curRange\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n lines.map(function (entry) {\n return (current.added ? '+' : '-') + entry;\n }))); // Track the updated file position\n\n\n if (current.added) {\n newLine += lines.length;\n } else {\n oldLine += lines.length;\n }\n } else {\n // Identical context lines. Track line changes\n if (oldRangeStart) {\n // Close out any changes that have been output (or join overlapping)\n if (lines.length <= options.context * 2 && i < diff.length - 2) {\n /*istanbul ignore start*/\n var _curRange2;\n\n /*istanbul ignore end*/\n // Overlapping\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_curRange2 =\n /*istanbul ignore end*/\n curRange).push.apply(\n /*istanbul ignore start*/\n _curRange2\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n contextLines(lines)));\n } else {\n /*istanbul ignore start*/\n var _curRange3;\n\n /*istanbul ignore end*/\n // end the range and output\n var contextSize = Math.min(lines.length, options.context);\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_curRange3 =\n /*istanbul ignore end*/\n curRange).push.apply(\n /*istanbul ignore start*/\n _curRange3\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n contextLines(lines.slice(0, contextSize))));\n\n var hunk = {\n oldStart: oldRangeStart,\n oldLines: oldLine - oldRangeStart + contextSize,\n newStart: newRangeStart,\n newLines: newLine - newRangeStart + contextSize,\n lines: curRange\n };\n\n if (i >= diff.length - 2 && lines.length <= options.context) {\n // EOF is inside this hunk\n var oldEOFNewline = /\\n$/.test(oldStr);\n var newEOFNewline = /\\n$/.test(newStr);\n var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines;\n\n if (!oldEOFNewline && noNlBeforeAdds && oldStr.length > 0) {\n // special case: old has no eol and no trailing context; no-nl can end up before adds\n // however, if the old file is empty, do not output the no-nl line\n curRange.splice(hunk.oldLines, 0, '\\\\ No newline at end of file');\n }\n\n if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) {\n curRange.push('\\\\ No newline at end of file');\n }\n }\n\n hunks.push(hunk);\n oldRangeStart = 0;\n newRangeStart = 0;\n curRange = [];\n }\n }\n\n oldLine += lines.length;\n newLine += lines.length;\n }\n };\n\n for (var i = 0; i < diff.length; i++) {\n /*istanbul ignore start*/\n _loop(\n /*istanbul ignore end*/\n i);\n }\n\n return {\n oldFileName: oldFileName,\n newFileName: newFileName,\n oldHeader: oldHeader,\n newHeader: newHeader,\n hunks: hunks\n };\n}\n\nfunction formatPatch(diff) {\n var ret = [];\n\n if (diff.oldFileName == diff.newFileName) {\n ret.push('Index: ' + diff.oldFileName);\n }\n\n ret.push('===================================================================');\n ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\\t' + diff.oldHeader));\n ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\\t' + diff.newHeader));\n\n for (var i = 0; i < diff.hunks.length; i++) {\n var hunk = diff.hunks[i]; // Unified Diff Format quirk: If the chunk size is 0,\n // the first number is one lower than one would expect.\n // https://www.artima.com/weblogs/viewpost.jsp?thread=164293\n\n if (hunk.oldLines === 0) {\n hunk.oldStart -= 1;\n }\n\n if (hunk.newLines === 0) {\n hunk.newStart -= 1;\n }\n\n ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@');\n ret.push.apply(ret, hunk.lines);\n }\n\n return ret.join('\\n') + '\\n';\n}\n\nfunction createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n return formatPatch(structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options));\n}\n\nfunction createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {\n return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9jcmVhdGUuanMiXSwibmFtZXMiOlsic3RydWN0dXJlZFBhdGNoIiwib2xkRmlsZU5hbWUiLCJuZXdGaWxlTmFtZSIsIm9sZFN0ciIsIm5ld1N0ciIsIm9sZEhlYWRlciIsIm5ld0hlYWRlciIsIm9wdGlvbnMiLCJjb250ZXh0IiwiZGlmZiIsImRpZmZMaW5lcyIsInB1c2giLCJ2YWx1ZSIsImxpbmVzIiwiY29udGV4dExpbmVzIiwibWFwIiwiZW50cnkiLCJodW5rcyIsIm9sZFJhbmdlU3RhcnQiLCJuZXdSYW5nZVN0YXJ0IiwiY3VyUmFuZ2UiLCJvbGRMaW5lIiwibmV3TGluZSIsImkiLCJjdXJyZW50IiwicmVwbGFjZSIsInNwbGl0IiwiYWRkZWQiLCJyZW1vdmVkIiwicHJldiIsInNsaWNlIiwibGVuZ3RoIiwiY29udGV4dFNpemUiLCJNYXRoIiwibWluIiwiaHVuayIsIm9sZFN0YXJ0Iiwib2xkTGluZXMiLCJuZXdTdGFydCIsIm5ld0xpbmVzIiwib2xkRU9GTmV3bGluZSIsInRlc3QiLCJuZXdFT0ZOZXdsaW5lIiwibm9ObEJlZm9yZUFkZHMiLCJzcGxpY2UiLCJmb3JtYXRQYXRjaCIsInJldCIsImFwcGx5Iiwiam9pbiIsImNyZWF0ZVR3b0ZpbGVzUGF0Y2giLCJjcmVhdGVQYXRjaCIsImZpbGVOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULENBQXlCQyxXQUF6QixFQUFzQ0MsV0FBdEMsRUFBbURDLE1BQW5ELEVBQTJEQyxNQUEzRCxFQUFtRUMsU0FBbkUsRUFBOEVDLFNBQTlFLEVBQXlGQyxPQUF6RixFQUFrRztBQUN2RyxNQUFJLENBQUNBLE9BQUwsRUFBYztBQUNaQSxJQUFBQSxPQUFPLEdBQUcsRUFBVjtBQUNEOztBQUNELE1BQUksT0FBT0EsT0FBTyxDQUFDQyxPQUFmLEtBQTJCLFdBQS9CLEVBQTRDO0FBQzFDRCxJQUFBQSxPQUFPLENBQUNDLE9BQVIsR0FBa0IsQ0FBbEI7QUFDRDs7QUFFRCxNQUFNQyxJQUFJO0FBQUc7QUFBQTtBQUFBOztBQUFBQztBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBO0FBQUEsR0FBVVAsTUFBVixFQUFrQkMsTUFBbEIsRUFBMEJHLE9BQTFCLENBQWI7O0FBQ0EsTUFBRyxDQUFDRSxJQUFKLEVBQVU7QUFDUjtBQUNEOztBQUVEQSxFQUFBQSxJQUFJLENBQUNFLElBQUwsQ0FBVTtBQUFDQyxJQUFBQSxLQUFLLEVBQUUsRUFBUjtBQUFZQyxJQUFBQSxLQUFLLEVBQUU7QUFBbkIsR0FBVixFQWJ1RyxDQWFwRTs7QUFFbkMsV0FBU0MsWUFBVCxDQUFzQkQsS0FBdEIsRUFBNkI7QUFDM0IsV0FBT0EsS0FBSyxDQUFDRSxHQUFOLENBQVUsVUFBU0MsS0FBVCxFQUFnQjtBQUFFLGFBQU8sTUFBTUEsS0FBYjtBQUFxQixLQUFqRCxDQUFQO0FBQ0Q7O0FBRUQsTUFBSUMsS0FBSyxHQUFHLEVBQVo7QUFDQSxNQUFJQyxhQUFhLEdBQUcsQ0FBcEI7QUFBQSxNQUF1QkMsYUFBYSxHQUFHLENBQXZDO0FBQUEsTUFBMENDLFFBQVEsR0FBRyxFQUFyRDtBQUFBLE1BQ0lDLE9BQU8sR0FBRyxDQURkO0FBQUEsTUFDaUJDLE9BQU8sR0FBRyxDQUQzQjs7QUFwQnVHO0FBQUE7QUFBQTtBQXNCOUZDLEVBQUFBLENBdEI4RjtBQXVCckcsUUFBTUMsT0FBTyxHQUFHZixJQUFJLENBQUNjLENBQUQsQ0FBcEI7QUFBQSxRQUNNVixLQUFLLEdBQUdXLE9BQU8sQ0FBQ1gsS0FBUixJQUFpQlcsT0FBTyxDQUFDWixLQUFSLENBQWNhLE9BQWQsQ0FBc0IsS0FBdEIsRUFBNkIsRUFBN0IsRUFBaUNDLEtBQWpDLENBQXVDLElBQXZDLENBRC9CO0FBRUFGLElBQUFBLE9BQU8sQ0FBQ1gsS0FBUixHQUFnQkEsS0FBaEI7O0FBRUEsUUFBSVcsT0FBTyxDQUFDRyxLQUFSLElBQWlCSCxPQUFPLENBQUNJLE9BQTdCLEVBQXNDO0FBQUE7QUFBQTs7QUFBQTtBQUNwQztBQUNBLFVBQUksQ0FBQ1YsYUFBTCxFQUFvQjtBQUNsQixZQUFNVyxJQUFJLEdBQUdwQixJQUFJLENBQUNjLENBQUMsR0FBRyxDQUFMLENBQWpCO0FBQ0FMLFFBQUFBLGFBQWEsR0FBR0csT0FBaEI7QUFDQUYsUUFBQUEsYUFBYSxHQUFHRyxPQUFoQjs7QUFFQSxZQUFJTyxJQUFKLEVBQVU7QUFDUlQsVUFBQUEsUUFBUSxHQUFHYixPQUFPLENBQUNDLE9BQVIsR0FBa0IsQ0FBbEIsR0FBc0JNLFlBQVksQ0FBQ2UsSUFBSSxDQUFDaEIsS0FBTCxDQUFXaUIsS0FBWCxDQUFpQixDQUFDdkIsT0FBTyxDQUFDQyxPQUExQixDQUFELENBQWxDLEdBQXlFLEVBQXBGO0FBQ0FVLFVBQUFBLGFBQWEsSUFBSUUsUUFBUSxDQUFDVyxNQUExQjtBQUNBWixVQUFBQSxhQUFhLElBQUlDLFFBQVEsQ0FBQ1csTUFBMUI7QUFDRDtBQUNGLE9BWm1DLENBY3BDOzs7QUFDQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQVgsTUFBQUEsUUFBUSxFQUFDVCxJQUFUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBa0JFLE1BQUFBLEtBQUssQ0FBQ0UsR0FBTixDQUFVLFVBQVNDLEtBQVQsRUFBZ0I7QUFDMUMsZUFBTyxDQUFDUSxPQUFPLENBQUNHLEtBQVIsR0FBZ0IsR0FBaEIsR0FBc0IsR0FBdkIsSUFBOEJYLEtBQXJDO0FBQ0QsT0FGaUIsQ0FBbEIsR0Fmb0MsQ0FtQnBDOzs7QUFDQSxVQUFJUSxPQUFPLENBQUNHLEtBQVosRUFBbUI7QUFDakJMLFFBQUFBLE9BQU8sSUFBSVQsS0FBSyxDQUFDa0IsTUFBakI7QUFDRCxPQUZELE1BRU87QUFDTFYsUUFBQUEsT0FBTyxJQUFJUixLQUFLLENBQUNrQixNQUFqQjtBQUNEO0FBQ0YsS0F6QkQsTUF5Qk87QUFDTDtBQUNBLFVBQUliLGFBQUosRUFBbUI7QUFDakI7QUFDQSxZQUFJTCxLQUFLLENBQUNrQixNQUFOLElBQWdCeEIsT0FBTyxDQUFDQyxPQUFSLEdBQWtCLENBQWxDLElBQXVDZSxDQUFDLEdBQUdkLElBQUksQ0FBQ3NCLE1BQUwsR0FBYyxDQUE3RCxFQUFnRTtBQUFBO0FBQUE7O0FBQUE7QUFDOUQ7O0FBQ0E7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUFYLFVBQUFBLFFBQVEsRUFBQ1QsSUFBVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWtCRyxVQUFBQSxZQUFZLENBQUNELEtBQUQsQ0FBOUI7QUFDRCxTQUhELE1BR087QUFBQTtBQUFBOztBQUFBO0FBQ0w7QUFDQSxjQUFJbUIsV0FBVyxHQUFHQyxJQUFJLENBQUNDLEdBQUwsQ0FBU3JCLEtBQUssQ0FBQ2tCLE1BQWYsRUFBdUJ4QixPQUFPLENBQUNDLE9BQS9CLENBQWxCOztBQUNBOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBWSxVQUFBQSxRQUFRLEVBQUNULElBQVQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFrQkcsVUFBQUEsWUFBWSxDQUFDRCxLQUFLLENBQUNpQixLQUFOLENBQVksQ0FBWixFQUFlRSxXQUFmLENBQUQsQ0FBOUI7O0FBRUEsY0FBSUcsSUFBSSxHQUFHO0FBQ1RDLFlBQUFBLFFBQVEsRUFBRWxCLGFBREQ7QUFFVG1CLFlBQUFBLFFBQVEsRUFBR2hCLE9BQU8sR0FBR0gsYUFBVixHQUEwQmMsV0FGNUI7QUFHVE0sWUFBQUEsUUFBUSxFQUFFbkIsYUFIRDtBQUlUb0IsWUFBQUEsUUFBUSxFQUFHakIsT0FBTyxHQUFHSCxhQUFWLEdBQTBCYSxXQUo1QjtBQUtUbkIsWUFBQUEsS0FBSyxFQUFFTztBQUxFLFdBQVg7O0FBT0EsY0FBSUcsQ0FBQyxJQUFJZCxJQUFJLENBQUNzQixNQUFMLEdBQWMsQ0FBbkIsSUFBd0JsQixLQUFLLENBQUNrQixNQUFOLElBQWdCeEIsT0FBTyxDQUFDQyxPQUFwRCxFQUE2RDtBQUMzRDtBQUNBLGdCQUFJZ0MsYUFBYSxHQUFLLEtBQUQsQ0FBUUMsSUFBUixDQUFhdEMsTUFBYixDQUFyQjtBQUNBLGdCQUFJdUMsYUFBYSxHQUFLLEtBQUQsQ0FBUUQsSUFBUixDQUFhckMsTUFBYixDQUFyQjtBQUNBLGdCQUFJdUMsY0FBYyxHQUFHOUIsS0FBSyxDQUFDa0IsTUFBTixJQUFnQixDQUFoQixJQUFxQlgsUUFBUSxDQUFDVyxNQUFULEdBQWtCSSxJQUFJLENBQUNFLFFBQWpFOztBQUNBLGdCQUFJLENBQUNHLGFBQUQsSUFBa0JHLGNBQWxCLElBQW9DeEMsTUFBTSxDQUFDNEIsTUFBUCxHQUFnQixDQUF4RCxFQUEyRDtBQUN6RDtBQUNBO0FBQ0FYLGNBQUFBLFFBQVEsQ0FBQ3dCLE1BQVQsQ0FBZ0JULElBQUksQ0FBQ0UsUUFBckIsRUFBK0IsQ0FBL0IsRUFBa0MsOEJBQWxDO0FBQ0Q7O0FBQ0QsZ0JBQUssQ0FBQ0csYUFBRCxJQUFrQixDQUFDRyxjQUFwQixJQUF1QyxDQUFDRCxhQUE1QyxFQUEyRDtBQUN6RHRCLGNBQUFBLFFBQVEsQ0FBQ1QsSUFBVCxDQUFjLDhCQUFkO0FBQ0Q7QUFDRjs7QUFDRE0sVUFBQUEsS0FBSyxDQUFDTixJQUFOLENBQVd3QixJQUFYO0FBRUFqQixVQUFBQSxhQUFhLEdBQUcsQ0FBaEI7QUFDQUMsVUFBQUEsYUFBYSxHQUFHLENBQWhCO0FBQ0FDLFVBQUFBLFFBQVEsR0FBRyxFQUFYO0FBQ0Q7QUFDRjs7QUFDREMsTUFBQUEsT0FBTyxJQUFJUixLQUFLLENBQUNrQixNQUFqQjtBQUNBVCxNQUFBQSxPQUFPLElBQUlULEtBQUssQ0FBQ2tCLE1BQWpCO0FBQ0Q7QUE5Rm9HOztBQXNCdkcsT0FBSyxJQUFJUixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHZCxJQUFJLENBQUNzQixNQUF6QixFQUFpQ1IsQ0FBQyxFQUFsQyxFQUFzQztBQUFBO0FBQUE7QUFBQTtBQUE3QkEsSUFBQUEsQ0FBNkI7QUF5RXJDOztBQUVELFNBQU87QUFDTHRCLElBQUFBLFdBQVcsRUFBRUEsV0FEUjtBQUNxQkMsSUFBQUEsV0FBVyxFQUFFQSxXQURsQztBQUVMRyxJQUFBQSxTQUFTLEVBQUVBLFNBRk47QUFFaUJDLElBQUFBLFNBQVMsRUFBRUEsU0FGNUI7QUFHTFcsSUFBQUEsS0FBSyxFQUFFQTtBQUhGLEdBQVA7QUFLRDs7QUFFTSxTQUFTNEIsV0FBVCxDQUFxQnBDLElBQXJCLEVBQTJCO0FBQ2hDLE1BQU1xQyxHQUFHLEdBQUcsRUFBWjs7QUFDQSxNQUFJckMsSUFBSSxDQUFDUixXQUFMLElBQW9CUSxJQUFJLENBQUNQLFdBQTdCLEVBQTBDO0FBQ3hDNEMsSUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUFTLFlBQVlGLElBQUksQ0FBQ1IsV0FBMUI7QUFDRDs7QUFDRDZDLEVBQUFBLEdBQUcsQ0FBQ25DLElBQUosQ0FBUyxxRUFBVDtBQUNBbUMsRUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUFTLFNBQVNGLElBQUksQ0FBQ1IsV0FBZCxJQUE2QixPQUFPUSxJQUFJLENBQUNKLFNBQVosS0FBMEIsV0FBMUIsR0FBd0MsRUFBeEMsR0FBNkMsT0FBT0ksSUFBSSxDQUFDSixTQUF0RixDQUFUO0FBQ0F5QyxFQUFBQSxHQUFHLENBQUNuQyxJQUFKLENBQVMsU0FBU0YsSUFBSSxDQUFDUCxXQUFkLElBQTZCLE9BQU9PLElBQUksQ0FBQ0gsU0FBWixLQUEwQixXQUExQixHQUF3QyxFQUF4QyxHQUE2QyxPQUFPRyxJQUFJLENBQUNILFNBQXRGLENBQVQ7O0FBRUEsT0FBSyxJQUFJaUIsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR2QsSUFBSSxDQUFDUSxLQUFMLENBQVdjLE1BQS9CLEVBQXVDUixDQUFDLEVBQXhDLEVBQTRDO0FBQzFDLFFBQU1ZLElBQUksR0FBRzFCLElBQUksQ0FBQ1EsS0FBTCxDQUFXTSxDQUFYLENBQWIsQ0FEMEMsQ0FFMUM7QUFDQTtBQUNBOztBQUNBLFFBQUlZLElBQUksQ0FBQ0UsUUFBTCxLQUFrQixDQUF0QixFQUF5QjtBQUN2QkYsTUFBQUEsSUFBSSxDQUFDQyxRQUFMLElBQWlCLENBQWpCO0FBQ0Q7O0FBQ0QsUUFBSUQsSUFBSSxDQUFDSSxRQUFMLEtBQWtCLENBQXRCLEVBQXlCO0FBQ3ZCSixNQUFBQSxJQUFJLENBQUNHLFFBQUwsSUFBaUIsQ0FBakI7QUFDRDs7QUFDRFEsSUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUNFLFNBQVN3QixJQUFJLENBQUNDLFFBQWQsR0FBeUIsR0FBekIsR0FBK0JELElBQUksQ0FBQ0UsUUFBcEMsR0FDRSxJQURGLEdBQ1NGLElBQUksQ0FBQ0csUUFEZCxHQUN5QixHQUR6QixHQUMrQkgsSUFBSSxDQUFDSSxRQURwQyxHQUVFLEtBSEo7QUFLQU8sSUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUFTb0MsS0FBVCxDQUFlRCxHQUFmLEVBQW9CWCxJQUFJLENBQUN0QixLQUF6QjtBQUNEOztBQUVELFNBQU9pQyxHQUFHLENBQUNFLElBQUosQ0FBUyxJQUFULElBQWlCLElBQXhCO0FBQ0Q7O0FBRU0sU0FBU0MsbUJBQVQsQ0FBNkJoRCxXQUE3QixFQUEwQ0MsV0FBMUMsRUFBdURDLE1BQXZELEVBQStEQyxNQUEvRCxFQUF1RUMsU0FBdkUsRUFBa0ZDLFNBQWxGLEVBQTZGQyxPQUE3RixFQUFzRztBQUMzRyxTQUFPc0MsV0FBVyxDQUFDN0MsZUFBZSxDQUFDQyxXQUFELEVBQWNDLFdBQWQsRUFBMkJDLE1BQTNCLEVBQW1DQyxNQUFuQyxFQUEyQ0MsU0FBM0MsRUFBc0RDLFNBQXRELEVBQWlFQyxPQUFqRSxDQUFoQixDQUFsQjtBQUNEOztBQUVNLFNBQVMyQyxXQUFULENBQXFCQyxRQUFyQixFQUErQmhELE1BQS9CLEVBQXVDQyxNQUF2QyxFQUErQ0MsU0FBL0MsRUFBMERDLFNBQTFELEVBQXFFQyxPQUFyRSxFQUE4RTtBQUNuRixTQUFPMEMsbUJBQW1CLENBQUNFLFFBQUQsRUFBV0EsUUFBWCxFQUFxQmhELE1BQXJCLEVBQTZCQyxNQUE3QixFQUFxQ0MsU0FBckMsRUFBZ0RDLFNBQWhELEVBQTJEQyxPQUEzRCxDQUExQjtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWZmTGluZXN9IGZyb20gJy4uL2RpZmYvbGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMuY29udGV4dCA9IDQ7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgaWYoIWRpZmYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaWZmLnB1c2goe3ZhbHVlOiAnJywgbGluZXM6IFtdfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gJyAnICsgZW50cnk7IH0pO1xuICB9XG5cbiAgbGV0IGh1bmtzID0gW107XG4gIGxldCBvbGRSYW5nZVN0YXJ0ID0gMCwgbmV3UmFuZ2VTdGFydCA9IDAsIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSwgbmV3TGluZSA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuICAgICAgY3VyUmFuZ2UucHVzaCguLi4gbGluZXMubWFwKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvLyBPdmVybGFwcGluZ1xuICAgICAgICAgIGN1clJhbmdlLnB1c2goLi4uIGNvbnRleHRMaW5lcyhsaW5lcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIGxldCBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcbiAgICAgICAgICBjdXJSYW5nZS5wdXNoKC4uLiBjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSk7XG5cbiAgICAgICAgICBsZXQgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgb2xkTGluZXM6IChvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IChuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICBsZXQgb2xkRU9GTmV3bGluZSA9ICgoL1xcbiQvKS50ZXN0KG9sZFN0cikpO1xuICAgICAgICAgICAgbGV0IG5ld0VPRk5ld2xpbmUgPSAoKC9cXG4kLykudGVzdChuZXdTdHIpKTtcbiAgICAgICAgICAgIGxldCBub05sQmVmb3JlQWRkcyA9IGxpbmVzLmxlbmd0aCA9PSAwICYmIGN1clJhbmdlLmxlbmd0aCA+IGh1bmsub2xkTGluZXM7XG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoIW9sZEVPRk5ld2xpbmUgJiYgIW5vTmxCZWZvcmVBZGRzKSB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaHVua3MucHVzaChodW5rKTtcblxuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvbGRGaWxlTmFtZTogb2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lOiBuZXdGaWxlTmFtZSxcbiAgICBvbGRIZWFkZXI6IG9sZEhlYWRlciwgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYXRjaChkaWZmKSB7XG4gIGNvbnN0IHJldCA9IFtdO1xuICBpZiAoZGlmZi5vbGRGaWxlTmFtZSA9PSBkaWZmLm5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgZGlmZi5vbGRGaWxlTmFtZSk7XG4gIH1cbiAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG4gIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGh1bmsgPSBkaWZmLmh1bmtzW2ldO1xuICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0IC09IDE7XG4gICAgfVxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0IC09IDE7XG4gICAgfVxuICAgIHJldC5wdXNoKFxuICAgICAgJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXNcbiAgICAgICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzXG4gICAgICArICcgQEAnXG4gICAgKTtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICByZXR1cm4gZm9ybWF0UGF0Y2goc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.calcLineCount = calcLineCount;\nexports.merge = merge;\n\n/*istanbul ignore end*/\nvar\n/*istanbul ignore start*/\n_create = require(\"./create\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_parse = require(\"./parse\")\n/*istanbul ignore end*/\n;\n\nvar\n/*istanbul ignore start*/\n_array = require(\"../util/array\")\n/*istanbul ignore end*/\n;\n\n/*istanbul ignore start*/ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/*istanbul ignore end*/\nfunction calcLineCount(hunk) {\n /*istanbul ignore start*/\n var _calcOldNewLineCount =\n /*istanbul ignore end*/\n calcOldNewLineCount(hunk.lines),\n oldLines = _calcOldNewLineCount.oldLines,\n newLines = _calcOldNewLineCount.newLines;\n\n if (oldLines !== undefined) {\n hunk.oldLines = oldLines;\n } else {\n delete hunk.oldLines;\n }\n\n if (newLines !== undefined) {\n hunk.newLines = newLines;\n } else {\n delete hunk.newLines;\n }\n}\n\nfunction merge(mine, theirs, base) {\n mine = loadPatch(mine, base);\n theirs = loadPatch(theirs, base);\n var ret = {}; // For index we just let it pass through as it doesn't have any necessary meaning.\n // Leaving sanity checks on this to the API consumer that may know more about the\n // meaning in their own context.\n\n if (mine.index || theirs.index) {\n ret.index = mine.index || theirs.index;\n }\n\n if (mine.newFileName || theirs.newFileName) {\n if (!fileNameChanged(mine)) {\n // No header or no change in ours, use theirs (and ours if theirs does not exist)\n ret.oldFileName = theirs.oldFileName || mine.oldFileName;\n ret.newFileName = theirs.newFileName || mine.newFileName;\n ret.oldHeader = theirs.oldHeader || mine.oldHeader;\n ret.newHeader = theirs.newHeader || mine.newHeader;\n } else if (!fileNameChanged(theirs)) {\n // No header or no change in theirs, use ours\n ret.oldFileName = mine.oldFileName;\n ret.newFileName = mine.newFileName;\n ret.oldHeader = mine.oldHeader;\n ret.newHeader = mine.newHeader;\n } else {\n // Both changed... figure it out\n ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName);\n ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName);\n ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader);\n ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader);\n }\n }\n\n ret.hunks = [];\n var mineIndex = 0,\n theirsIndex = 0,\n mineOffset = 0,\n theirsOffset = 0;\n\n while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) {\n var mineCurrent = mine.hunks[mineIndex] || {\n oldStart: Infinity\n },\n theirsCurrent = theirs.hunks[theirsIndex] || {\n oldStart: Infinity\n };\n\n if (hunkBefore(mineCurrent, theirsCurrent)) {\n // This patch does not overlap with any of the others, yay.\n ret.hunks.push(cloneHunk(mineCurrent, mineOffset));\n mineIndex++;\n theirsOffset += mineCurrent.newLines - mineCurrent.oldLines;\n } else if (hunkBefore(theirsCurrent, mineCurrent)) {\n // This patch does not overlap with any of the others, yay.\n ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset));\n theirsIndex++;\n mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines;\n } else {\n // Overlap, merge as best we can\n var mergedHunk = {\n oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart),\n oldLines: 0,\n newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset),\n newLines: 0,\n lines: []\n };\n mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines);\n theirsIndex++;\n mineIndex++;\n ret.hunks.push(mergedHunk);\n }\n }\n\n return ret;\n}\n\nfunction loadPatch(param, base) {\n if (typeof param === 'string') {\n if (/^@@/m.test(param) || /^Index:/m.test(param)) {\n return (\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _parse\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n parsePatch)\n /*istanbul ignore end*/\n (param)[0]\n );\n }\n\n if (!base) {\n throw new Error('Must provide a base reference or pass in a patch');\n }\n\n return (\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _create\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n structuredPatch)\n /*istanbul ignore end*/\n (undefined, undefined, base, param)\n );\n }\n\n return param;\n}\n\nfunction fileNameChanged(patch) {\n return patch.newFileName && patch.newFileName !== patch.oldFileName;\n}\n\nfunction selectField(index, mine, theirs) {\n if (mine === theirs) {\n return mine;\n } else {\n index.conflict = true;\n return {\n mine: mine,\n theirs: theirs\n };\n }\n}\n\nfunction hunkBefore(test, check) {\n return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart;\n}\n\nfunction cloneHunk(hunk, offset) {\n return {\n oldStart: hunk.oldStart,\n oldLines: hunk.oldLines,\n newStart: hunk.newStart + offset,\n newLines: hunk.newLines,\n lines: hunk.lines\n };\n}\n\nfunction mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) {\n // This will generally result in a conflicted hunk, but there are cases where the context\n // is the only overlap where we can successfully merge the content here.\n var mine = {\n offset: mineOffset,\n lines: mineLines,\n index: 0\n },\n their = {\n offset: theirOffset,\n lines: theirLines,\n index: 0\n }; // Handle any leading content\n\n insertLeading(hunk, mine, their);\n insertLeading(hunk, their, mine); // Now in the overlap content. Scan through and select the best changes from each.\n\n while (mine.index < mine.lines.length && their.index < their.lines.length) {\n var mineCurrent = mine.lines[mine.index],\n theirCurrent = their.lines[their.index];\n\n if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) {\n // Both modified ...\n mutualChange(hunk, mine, their);\n } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') {\n /*istanbul ignore start*/\n var _hunk$lines;\n\n /*istanbul ignore end*/\n // Mine inserted\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n collectChange(mine)));\n } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') {\n /*istanbul ignore start*/\n var _hunk$lines2;\n\n /*istanbul ignore end*/\n // Theirs inserted\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines2 =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines2\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n collectChange(their)));\n } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') {\n // Mine removed or edited\n removal(hunk, mine, their);\n } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') {\n // Their removed or edited\n removal(hunk, their, mine, true);\n } else if (mineCurrent === theirCurrent) {\n // Context identity\n hunk.lines.push(mineCurrent);\n mine.index++;\n their.index++;\n } else {\n // Context mismatch\n conflict(hunk, collectChange(mine), collectChange(their));\n }\n } // Now push anything that may be remaining\n\n\n insertTrailing(hunk, mine);\n insertTrailing(hunk, their);\n calcLineCount(hunk);\n}\n\nfunction mutualChange(hunk, mine, their) {\n var myChanges = collectChange(mine),\n theirChanges = collectChange(their);\n\n if (allRemoves(myChanges) && allRemoves(theirChanges)) {\n // Special case for remove changes that are supersets of one another\n if (\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _array\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n arrayStartsWith)\n /*istanbul ignore end*/\n (myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) {\n /*istanbul ignore start*/\n var _hunk$lines3;\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines3 =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines3\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n myChanges));\n\n return;\n } else if (\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _array\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n arrayStartsWith)\n /*istanbul ignore end*/\n (theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) {\n /*istanbul ignore start*/\n var _hunk$lines4;\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines4 =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines4\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n theirChanges));\n\n return;\n }\n } else if (\n /*istanbul ignore start*/\n (0,\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n _array\n /*istanbul ignore end*/\n .\n /*istanbul ignore start*/\n arrayEqual)\n /*istanbul ignore end*/\n (myChanges, theirChanges)) {\n /*istanbul ignore start*/\n var _hunk$lines5;\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines5 =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines5\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n myChanges));\n\n return;\n }\n\n conflict(hunk, myChanges, theirChanges);\n}\n\nfunction removal(hunk, mine, their, swap) {\n var myChanges = collectChange(mine),\n theirChanges = collectContext(their, myChanges);\n\n if (theirChanges.merged) {\n /*istanbul ignore start*/\n var _hunk$lines6;\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n\n /*istanbul ignore end*/\n\n /*istanbul ignore start*/\n (_hunk$lines6 =\n /*istanbul ignore end*/\n hunk.lines).push.apply(\n /*istanbul ignore start*/\n _hunk$lines6\n /*istanbul ignore end*/\n ,\n /*istanbul ignore start*/\n _toConsumableArray(\n /*istanbul ignore end*/\n theirChanges.merged));\n } else {\n conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges);\n }\n}\n\nfunction conflict(hunk, mine, their) {\n hunk.conflict = true;\n hunk.lines.push({\n conflict: true,\n mine: mine,\n theirs: their\n });\n}\n\nfunction insertLeading(hunk, insert, their) {\n while (insert.offset < their.offset && insert.index < insert.lines.length) {\n var line = insert.lines[insert.index++];\n hunk.lines.push(line);\n insert.offset++;\n }\n}\n\nfunction insertTrailing(hunk, insert) {\n while (insert.index < insert.lines.length) {\n var line = insert.lines[insert.index++];\n hunk.lines.push(line);\n }\n}\n\nfunction collectChange(state) {\n var ret = [],\n operation = state.lines[state.index][0];\n\n while (state.index < state.lines.length) {\n var line = state.lines[state.index]; // Group additions that are immediately after subtractions and treat them as one \"atomic\" modify change.\n\n if (operation === '-' && line[0] === '+') {\n operation = '+';\n }\n\n if (operation === line[0]) {\n ret.push(line);\n state.index++;\n } else {\n break;\n }\n }\n\n return ret;\n}\n\nfunction collectContext(state, matchChanges) {\n var changes = [],\n merged = [],\n matchIndex = 0,\n contextChanges = false,\n conflicted = false;\n\n while (matchIndex < matchChanges.length && state.index < state.lines.length) {\n var change = state.lines[state.index],\n match = matchChanges[matchIndex]; // Once we've hit our add, then we are done\n\n if (match[0] === '+') {\n break;\n }\n\n contextChanges = contextChanges || change[0] !== ' ';\n merged.push(match);\n matchIndex++; // Consume any additions in the other block as a conflict to attempt\n // to pull in the remaining context after this\n\n if (change[0] === '+') {\n conflicted = true;\n\n while (change[0] === '+') {\n changes.push(change);\n change = state.lines[++state.index];\n }\n }\n\n if (match.substr(1) === change.substr(1)) {\n changes.push(change);\n state.index++;\n } else {\n conflicted = true;\n }\n }\n\n if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) {\n conflicted = true;\n }\n\n if (conflicted) {\n return changes;\n }\n\n while (matchIndex < matchChanges.length) {\n merged.push(matchChanges[matchIndex++]);\n }\n\n return {\n merged: merged,\n changes: changes\n };\n}\n\nfunction allRemoves(changes) {\n return changes.reduce(function (prev, change) {\n return prev && change[0] === '-';\n }, true);\n}\n\nfunction skipRemoveSuperset(state, removeChanges, delta) {\n for (var i = 0; i < delta; i++) {\n var changeContent = removeChanges[removeChanges.length - delta + i].substr(1);\n\n if (state.lines[state.index + i] !== ' ' + changeContent) {\n return false;\n }\n }\n\n state.index += delta;\n return true;\n}\n\nfunction calcOldNewLineCount(lines) {\n var oldLines = 0;\n var newLines = 0;\n lines.forEach(function (line) {\n if (typeof line !== 'string') {\n var myCount = calcOldNewLineCount(line.mine);\n var theirCount = calcOldNewLineCount(line.theirs);\n\n if (oldLines !== undefined) {\n if (myCount.oldLines === theirCount.oldLines) {\n oldLines += myCount.oldLines;\n } else {\n oldLines = undefined;\n }\n }\n\n if (newLines !== undefined) {\n if (myCount.newLines === theirCount.newLines) {\n newLines += myCount.newLines;\n } else {\n newLines = undefined;\n }\n }\n } else {\n if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) {\n newLines++;\n }\n\n if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) {\n oldLines++;\n }\n }\n });\n return {\n oldLines: oldLines,\n newLines: newLines\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9tZXJnZS5qcyJdLCJuYW1lcyI6WyJjYWxjTGluZUNvdW50IiwiaHVuayIsImNhbGNPbGROZXdMaW5lQ291bnQiLCJsaW5lcyIsIm9sZExpbmVzIiwibmV3TGluZXMiLCJ1bmRlZmluZWQiLCJtZXJnZSIsIm1pbmUiLCJ0aGVpcnMiLCJiYXNlIiwibG9hZFBhdGNoIiwicmV0IiwiaW5kZXgiLCJuZXdGaWxlTmFtZSIsImZpbGVOYW1lQ2hhbmdlZCIsIm9sZEZpbGVOYW1lIiwib2xkSGVhZGVyIiwibmV3SGVhZGVyIiwic2VsZWN0RmllbGQiLCJodW5rcyIsIm1pbmVJbmRleCIsInRoZWlyc0luZGV4IiwibWluZU9mZnNldCIsInRoZWlyc09mZnNldCIsImxlbmd0aCIsIm1pbmVDdXJyZW50Iiwib2xkU3RhcnQiLCJJbmZpbml0eSIsInRoZWlyc0N1cnJlbnQiLCJodW5rQmVmb3JlIiwicHVzaCIsImNsb25lSHVuayIsIm1lcmdlZEh1bmsiLCJNYXRoIiwibWluIiwibmV3U3RhcnQiLCJtZXJnZUxpbmVzIiwicGFyYW0iLCJ0ZXN0IiwicGFyc2VQYXRjaCIsIkVycm9yIiwic3RydWN0dXJlZFBhdGNoIiwicGF0Y2giLCJjb25mbGljdCIsImNoZWNrIiwib2Zmc2V0IiwibWluZUxpbmVzIiwidGhlaXJPZmZzZXQiLCJ0aGVpckxpbmVzIiwidGhlaXIiLCJpbnNlcnRMZWFkaW5nIiwidGhlaXJDdXJyZW50IiwibXV0dWFsQ2hhbmdlIiwiY29sbGVjdENoYW5nZSIsInJlbW92YWwiLCJpbnNlcnRUcmFpbGluZyIsIm15Q2hhbmdlcyIsInRoZWlyQ2hhbmdlcyIsImFsbFJlbW92ZXMiLCJhcnJheVN0YXJ0c1dpdGgiLCJza2lwUmVtb3ZlU3VwZXJzZXQiLCJhcnJheUVxdWFsIiwic3dhcCIsImNvbGxlY3RDb250ZXh0IiwibWVyZ2VkIiwiaW5zZXJ0IiwibGluZSIsInN0YXRlIiwib3BlcmF0aW9uIiwibWF0Y2hDaGFuZ2VzIiwiY2hhbmdlcyIsIm1hdGNoSW5kZXgiLCJjb250ZXh0Q2hhbmdlcyIsImNvbmZsaWN0ZWQiLCJjaGFuZ2UiLCJtYXRjaCIsInN1YnN0ciIsInJlZHVjZSIsInByZXYiLCJyZW1vdmVDaGFuZ2VzIiwiZGVsdGEiLCJpIiwiY2hhbmdlQ29udGVudCIsImZvckVhY2giLCJteUNvdW50IiwidGhlaXJDb3VudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxhQUFULENBQXVCQyxJQUF2QixFQUE2QjtBQUFBO0FBQUE7QUFBQTtBQUNMQyxFQUFBQSxtQkFBbUIsQ0FBQ0QsSUFBSSxDQUFDRSxLQUFOLENBRGQ7QUFBQSxNQUMzQkMsUUFEMkIsd0JBQzNCQSxRQUQyQjtBQUFBLE1BQ2pCQyxRQURpQix3QkFDakJBLFFBRGlCOztBQUdsQyxNQUFJRCxRQUFRLEtBQUtFLFNBQWpCLEVBQTRCO0FBQzFCTCxJQUFBQSxJQUFJLENBQUNHLFFBQUwsR0FBZ0JBLFFBQWhCO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsV0FBT0gsSUFBSSxDQUFDRyxRQUFaO0FBQ0Q7O0FBRUQsTUFBSUMsUUFBUSxLQUFLQyxTQUFqQixFQUE0QjtBQUMxQkwsSUFBQUEsSUFBSSxDQUFDSSxRQUFMLEdBQWdCQSxRQUFoQjtBQUNELEdBRkQsTUFFTztBQUNMLFdBQU9KLElBQUksQ0FBQ0ksUUFBWjtBQUNEO0FBQ0Y7O0FBRU0sU0FBU0UsS0FBVCxDQUFlQyxJQUFmLEVBQXFCQyxNQUFyQixFQUE2QkMsSUFBN0IsRUFBbUM7QUFDeENGLEVBQUFBLElBQUksR0FBR0csU0FBUyxDQUFDSCxJQUFELEVBQU9FLElBQVAsQ0FBaEI7QUFDQUQsRUFBQUEsTUFBTSxHQUFHRSxTQUFTLENBQUNGLE1BQUQsRUFBU0MsSUFBVCxDQUFsQjtBQUVBLE1BQUlFLEdBQUcsR0FBRyxFQUFWLENBSndDLENBTXhDO0FBQ0E7QUFDQTs7QUFDQSxNQUFJSixJQUFJLENBQUNLLEtBQUwsSUFBY0osTUFBTSxDQUFDSSxLQUF6QixFQUFnQztBQUM5QkQsSUFBQUEsR0FBRyxDQUFDQyxLQUFKLEdBQVlMLElBQUksQ0FBQ0ssS0FBTCxJQUFjSixNQUFNLENBQUNJLEtBQWpDO0FBQ0Q7O0FBRUQsTUFBSUwsSUFBSSxDQUFDTSxXQUFMLElBQW9CTCxNQUFNLENBQUNLLFdBQS9CLEVBQTRDO0FBQzFDLFFBQUksQ0FBQ0MsZUFBZSxDQUFDUCxJQUFELENBQXBCLEVBQTRCO0FBQzFCO0FBQ0FJLE1BQUFBLEdBQUcsQ0FBQ0ksV0FBSixHQUFrQlAsTUFBTSxDQUFDTyxXQUFQLElBQXNCUixJQUFJLENBQUNRLFdBQTdDO0FBQ0FKLE1BQUFBLEdBQUcsQ0FBQ0UsV0FBSixHQUFrQkwsTUFBTSxDQUFDSyxXQUFQLElBQXNCTixJQUFJLENBQUNNLFdBQTdDO0FBQ0FGLE1BQUFBLEdBQUcsQ0FBQ0ssU0FBSixHQUFnQlIsTUFBTSxDQUFDUSxTQUFQLElBQW9CVCxJQUFJLENBQUNTLFNBQXpDO0FBQ0FMLE1BQUFBLEdBQUcsQ0FBQ00sU0FBSixHQUFnQlQsTUFBTSxDQUFDUyxTQUFQLElBQW9CVixJQUFJLENBQUNVLFNBQXpDO0FBQ0QsS0FORCxNQU1PLElBQUksQ0FBQ0gsZUFBZSxDQUFDTixNQUFELENBQXBCLEVBQThCO0FBQ25DO0FBQ0FHLE1BQUFBLEdBQUcsQ0FBQ0ksV0FBSixHQUFrQlIsSUFBSSxDQUFDUSxXQUF2QjtBQUNBSixNQUFBQSxHQUFHLENBQUNFLFdBQUosR0FBa0JOLElBQUksQ0FBQ00sV0FBdkI7QUFDQUYsTUFBQUEsR0FBRyxDQUFDSyxTQUFKLEdBQWdCVCxJQUFJLENBQUNTLFNBQXJCO0FBQ0FMLE1BQUFBLEdBQUcsQ0FBQ00sU0FBSixHQUFnQlYsSUFBSSxDQUFDVSxTQUFyQjtBQUNELEtBTk0sTUFNQTtBQUNMO0FBQ0FOLE1BQUFBLEdBQUcsQ0FBQ0ksV0FBSixHQUFrQkcsV0FBVyxDQUFDUCxHQUFELEVBQU1KLElBQUksQ0FBQ1EsV0FBWCxFQUF3QlAsTUFBTSxDQUFDTyxXQUEvQixDQUE3QjtBQUNBSixNQUFBQSxHQUFHLENBQUNFLFdBQUosR0FBa0JLLFdBQVcsQ0FBQ1AsR0FBRCxFQUFNSixJQUFJLENBQUNNLFdBQVgsRUFBd0JMLE1BQU0sQ0FBQ0ssV0FBL0IsQ0FBN0I7QUFDQUYsTUFBQUEsR0FBRyxDQUFDSyxTQUFKLEdBQWdCRSxXQUFXLENBQUNQLEdBQUQsRUFBTUosSUFBSSxDQUFDUyxTQUFYLEVBQXNCUixNQUFNLENBQUNRLFNBQTdCLENBQTNCO0FBQ0FMLE1BQUFBLEdBQUcsQ0FBQ00sU0FBSixHQUFnQkMsV0FBVyxDQUFDUCxHQUFELEVBQU1KLElBQUksQ0FBQ1UsU0FBWCxFQUFzQlQsTUFBTSxDQUFDUyxTQUE3QixDQUEzQjtBQUNEO0FBQ0Y7O0FBRUROLEVBQUFBLEdBQUcsQ0FBQ1EsS0FBSixHQUFZLEVBQVo7QUFFQSxNQUFJQyxTQUFTLEdBQUcsQ0FBaEI7QUFBQSxNQUNJQyxXQUFXLEdBQUcsQ0FEbEI7QUFBQSxNQUVJQyxVQUFVLEdBQUcsQ0FGakI7QUFBQSxNQUdJQyxZQUFZLEdBQUcsQ0FIbkI7O0FBS0EsU0FBT0gsU0FBUyxHQUFHYixJQUFJLENBQUNZLEtBQUwsQ0FBV0ssTUFBdkIsSUFBaUNILFdBQVcsR0FBR2IsTUFBTSxDQUFDVyxLQUFQLENBQWFLLE1BQW5FLEVBQTJFO0FBQ3pFLFFBQUlDLFdBQVcsR0FBR2xCLElBQUksQ0FBQ1ksS0FBTCxDQUFXQyxTQUFYLEtBQXlCO0FBQUNNLE1BQUFBLFFBQVEsRUFBRUM7QUFBWCxLQUEzQztBQUFBLFFBQ0lDLGFBQWEsR0FBR3BCLE1BQU0sQ0FBQ1csS0FBUCxDQUFhRSxXQUFiLEtBQTZCO0FBQUNLLE1BQUFBLFFBQVEsRUFBRUM7QUFBWCxLQURqRDs7QUFHQSxRQUFJRSxVQUFVLENBQUNKLFdBQUQsRUFBY0csYUFBZCxDQUFkLEVBQTRDO0FBQzFDO0FBQ0FqQixNQUFBQSxHQUFHLENBQUNRLEtBQUosQ0FBVVcsSUFBVixDQUFlQyxTQUFTLENBQUNOLFdBQUQsRUFBY0gsVUFBZCxDQUF4QjtBQUNBRixNQUFBQSxTQUFTO0FBQ1RHLE1BQUFBLFlBQVksSUFBSUUsV0FBVyxDQUFDckIsUUFBWixHQUF1QnFCLFdBQVcsQ0FBQ3RCLFFBQW5EO0FBQ0QsS0FMRCxNQUtPLElBQUkwQixVQUFVLENBQUNELGFBQUQsRUFBZ0JILFdBQWhCLENBQWQsRUFBNEM7QUFDakQ7QUFDQWQsTUFBQUEsR0FBRyxDQUFDUSxLQUFKLENBQVVXLElBQVYsQ0FBZUMsU0FBUyxDQUFDSCxhQUFELEVBQWdCTCxZQUFoQixDQUF4QjtBQUNBRixNQUFBQSxXQUFXO0FBQ1hDLE1BQUFBLFVBQVUsSUFBSU0sYUFBYSxDQUFDeEIsUUFBZCxHQUF5QndCLGFBQWEsQ0FBQ3pCLFFBQXJEO0FBQ0QsS0FMTSxNQUtBO0FBQ0w7QUFDQSxVQUFJNkIsVUFBVSxHQUFHO0FBQ2ZOLFFBQUFBLFFBQVEsRUFBRU8sSUFBSSxDQUFDQyxHQUFMLENBQVNULFdBQVcsQ0FBQ0MsUUFBckIsRUFBK0JFLGFBQWEsQ0FBQ0YsUUFBN0MsQ0FESztBQUVmdkIsUUFBQUEsUUFBUSxFQUFFLENBRks7QUFHZmdDLFFBQUFBLFFBQVEsRUFBRUYsSUFBSSxDQUFDQyxHQUFMLENBQVNULFdBQVcsQ0FBQ1UsUUFBWixHQUF1QmIsVUFBaEMsRUFBNENNLGFBQWEsQ0FBQ0YsUUFBZCxHQUF5QkgsWUFBckUsQ0FISztBQUlmbkIsUUFBQUEsUUFBUSxFQUFFLENBSks7QUFLZkYsUUFBQUEsS0FBSyxFQUFFO0FBTFEsT0FBakI7QUFPQWtDLE1BQUFBLFVBQVUsQ0FBQ0osVUFBRCxFQUFhUCxXQUFXLENBQUNDLFFBQXpCLEVBQW1DRCxXQUFXLENBQUN2QixLQUEvQyxFQUFzRDBCLGFBQWEsQ0FBQ0YsUUFBcEUsRUFBOEVFLGFBQWEsQ0FBQzFCLEtBQTVGLENBQVY7QUFDQW1CLE1BQUFBLFdBQVc7QUFDWEQsTUFBQUEsU0FBUztBQUVUVCxNQUFBQSxHQUFHLENBQUNRLEtBQUosQ0FBVVcsSUFBVixDQUFlRSxVQUFmO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPckIsR0FBUDtBQUNEOztBQUVELFNBQVNELFNBQVQsQ0FBbUIyQixLQUFuQixFQUEwQjVCLElBQTFCLEVBQWdDO0FBQzlCLE1BQUksT0FBTzRCLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDN0IsUUFBSyxNQUFELENBQVNDLElBQVQsQ0FBY0QsS0FBZCxLQUEwQixVQUFELENBQWFDLElBQWIsQ0FBa0JELEtBQWxCLENBQTdCLEVBQXdEO0FBQ3RELGFBQU87QUFBQTtBQUFBO0FBQUE7O0FBQUFFO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxTQUFXRixLQUFYLEVBQWtCLENBQWxCO0FBQVA7QUFDRDs7QUFFRCxRQUFJLENBQUM1QixJQUFMLEVBQVc7QUFDVCxZQUFNLElBQUkrQixLQUFKLENBQVUsa0RBQVYsQ0FBTjtBQUNEOztBQUNELFdBQU87QUFBQTtBQUFBO0FBQUE7O0FBQUFDO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxPQUFnQnBDLFNBQWhCLEVBQTJCQSxTQUEzQixFQUFzQ0ksSUFBdEMsRUFBNEM0QixLQUE1QztBQUFQO0FBQ0Q7O0FBRUQsU0FBT0EsS0FBUDtBQUNEOztBQUVELFNBQVN2QixlQUFULENBQXlCNEIsS0FBekIsRUFBZ0M7QUFDOUIsU0FBT0EsS0FBSyxDQUFDN0IsV0FBTixJQUFxQjZCLEtBQUssQ0FBQzdCLFdBQU4sS0FBc0I2QixLQUFLLENBQUMzQixXQUF4RDtBQUNEOztBQUVELFNBQVNHLFdBQVQsQ0FBcUJOLEtBQXJCLEVBQTRCTCxJQUE1QixFQUFrQ0MsTUFBbEMsRUFBMEM7QUFDeEMsTUFBSUQsSUFBSSxLQUFLQyxNQUFiLEVBQXFCO0FBQ25CLFdBQU9ELElBQVA7QUFDRCxHQUZELE1BRU87QUFDTEssSUFBQUEsS0FBSyxDQUFDK0IsUUFBTixHQUFpQixJQUFqQjtBQUNBLFdBQU87QUFBQ3BDLE1BQUFBLElBQUksRUFBSkEsSUFBRDtBQUFPQyxNQUFBQSxNQUFNLEVBQU5BO0FBQVAsS0FBUDtBQUNEO0FBQ0Y7O0FBRUQsU0FBU3FCLFVBQVQsQ0FBb0JTLElBQXBCLEVBQTBCTSxLQUExQixFQUFpQztBQUMvQixTQUFPTixJQUFJLENBQUNaLFFBQUwsR0FBZ0JrQixLQUFLLENBQUNsQixRQUF0QixJQUNEWSxJQUFJLENBQUNaLFFBQUwsR0FBZ0JZLElBQUksQ0FBQ25DLFFBQXRCLEdBQWtDeUMsS0FBSyxDQUFDbEIsUUFEN0M7QUFFRDs7QUFFRCxTQUFTSyxTQUFULENBQW1CL0IsSUFBbkIsRUFBeUI2QyxNQUF6QixFQUFpQztBQUMvQixTQUFPO0FBQ0xuQixJQUFBQSxRQUFRLEVBQUUxQixJQUFJLENBQUMwQixRQURWO0FBQ29CdkIsSUFBQUEsUUFBUSxFQUFFSCxJQUFJLENBQUNHLFFBRG5DO0FBRUxnQyxJQUFBQSxRQUFRLEVBQUVuQyxJQUFJLENBQUNtQyxRQUFMLEdBQWdCVSxNQUZyQjtBQUU2QnpDLElBQUFBLFFBQVEsRUFBRUosSUFBSSxDQUFDSSxRQUY1QztBQUdMRixJQUFBQSxLQUFLLEVBQUVGLElBQUksQ0FBQ0U7QUFIUCxHQUFQO0FBS0Q7O0FBRUQsU0FBU2tDLFVBQVQsQ0FBb0JwQyxJQUFwQixFQUEwQnNCLFVBQTFCLEVBQXNDd0IsU0FBdEMsRUFBaURDLFdBQWpELEVBQThEQyxVQUE5RCxFQUEwRTtBQUN4RTtBQUNBO0FBQ0EsTUFBSXpDLElBQUksR0FBRztBQUFDc0MsSUFBQUEsTUFBTSxFQUFFdkIsVUFBVDtBQUFxQnBCLElBQUFBLEtBQUssRUFBRTRDLFNBQTVCO0FBQXVDbEMsSUFBQUEsS0FBSyxFQUFFO0FBQTlDLEdBQVg7QUFBQSxNQUNJcUMsS0FBSyxHQUFHO0FBQUNKLElBQUFBLE1BQU0sRUFBRUUsV0FBVDtBQUFzQjdDLElBQUFBLEtBQUssRUFBRThDLFVBQTdCO0FBQXlDcEMsSUFBQUEsS0FBSyxFQUFFO0FBQWhELEdBRFosQ0FId0UsQ0FNeEU7O0FBQ0FzQyxFQUFBQSxhQUFhLENBQUNsRCxJQUFELEVBQU9PLElBQVAsRUFBYTBDLEtBQWIsQ0FBYjtBQUNBQyxFQUFBQSxhQUFhLENBQUNsRCxJQUFELEVBQU9pRCxLQUFQLEVBQWMxQyxJQUFkLENBQWIsQ0FSd0UsQ0FVeEU7O0FBQ0EsU0FBT0EsSUFBSSxDQUFDSyxLQUFMLEdBQWFMLElBQUksQ0FBQ0wsS0FBTCxDQUFXc0IsTUFBeEIsSUFBa0N5QixLQUFLLENBQUNyQyxLQUFOLEdBQWNxQyxLQUFLLENBQUMvQyxLQUFOLENBQVlzQixNQUFuRSxFQUEyRTtBQUN6RSxRQUFJQyxXQUFXLEdBQUdsQixJQUFJLENBQUNMLEtBQUwsQ0FBV0ssSUFBSSxDQUFDSyxLQUFoQixDQUFsQjtBQUFBLFFBQ0l1QyxZQUFZLEdBQUdGLEtBQUssQ0FBQy9DLEtBQU4sQ0FBWStDLEtBQUssQ0FBQ3JDLEtBQWxCLENBRG5COztBQUdBLFFBQUksQ0FBQ2EsV0FBVyxDQUFDLENBQUQsQ0FBWCxLQUFtQixHQUFuQixJQUEwQkEsV0FBVyxDQUFDLENBQUQsQ0FBWCxLQUFtQixHQUE5QyxNQUNJMEIsWUFBWSxDQUFDLENBQUQsQ0FBWixLQUFvQixHQUFwQixJQUEyQkEsWUFBWSxDQUFDLENBQUQsQ0FBWixLQUFvQixHQURuRCxDQUFKLEVBQzZEO0FBQzNEO0FBQ0FDLE1BQUFBLFlBQVksQ0FBQ3BELElBQUQsRUFBT08sSUFBUCxFQUFhMEMsS0FBYixDQUFaO0FBQ0QsS0FKRCxNQUlPLElBQUl4QixXQUFXLENBQUMsQ0FBRCxDQUFYLEtBQW1CLEdBQW5CLElBQTBCMEIsWUFBWSxDQUFDLENBQUQsQ0FBWixLQUFvQixHQUFsRCxFQUF1RDtBQUFBO0FBQUE7O0FBQUE7QUFDNUQ7O0FBQ0E7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUFuRCxNQUFBQSxJQUFJLENBQUNFLEtBQUwsRUFBVzRCLElBQVg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQnVCLE1BQUFBLGFBQWEsQ0FBQzlDLElBQUQsQ0FBakM7QUFDRCxLQUhNLE1BR0EsSUFBSTRDLFlBQVksQ0FBQyxDQUFELENBQVosS0FBb0IsR0FBcEIsSUFBMkIxQixXQUFXLENBQUMsQ0FBRCxDQUFYLEtBQW1CLEdBQWxELEVBQXVEO0FBQUE7QUFBQTs7QUFBQTtBQUM1RDs7QUFDQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQXpCLE1BQUFBLElBQUksQ0FBQ0UsS0FBTCxFQUFXNEIsSUFBWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9CdUIsTUFBQUEsYUFBYSxDQUFDSixLQUFELENBQWpDO0FBQ0QsS0FITSxNQUdBLElBQUl4QixXQUFXLENBQUMsQ0FBRCxDQUFYLEtBQW1CLEdBQW5CLElBQTBCMEIsWUFBWSxDQUFDLENBQUQsQ0FBWixLQUFvQixHQUFsRCxFQUF1RDtBQUM1RDtBQUNBRyxNQUFBQSxPQUFPLENBQUN0RCxJQUFELEVBQU9PLElBQVAsRUFBYTBDLEtBQWIsQ0FBUDtBQUNELEtBSE0sTUFHQSxJQUFJRSxZQUFZLENBQUMsQ0FBRCxDQUFaLEtBQW9CLEdBQXBCLElBQTJCMUIsV0FBVyxDQUFDLENBQUQsQ0FBWCxLQUFtQixHQUFsRCxFQUF1RDtBQUM1RDtBQUNBNkIsTUFBQUEsT0FBTyxDQUFDdEQsSUFBRCxFQUFPaUQsS0FBUCxFQUFjMUMsSUFBZCxFQUFvQixJQUFwQixDQUFQO0FBQ0QsS0FITSxNQUdBLElBQUlrQixXQUFXLEtBQUswQixZQUFwQixFQUFrQztBQUN2QztBQUNBbkQsTUFBQUEsSUFBSSxDQUFDRSxLQUFMLENBQVc0QixJQUFYLENBQWdCTCxXQUFoQjtBQUNBbEIsTUFBQUEsSUFBSSxDQUFDSyxLQUFMO0FBQ0FxQyxNQUFBQSxLQUFLLENBQUNyQyxLQUFOO0FBQ0QsS0FMTSxNQUtBO0FBQ0w7QUFDQStCLE1BQUFBLFFBQVEsQ0FBQzNDLElBQUQsRUFBT3FELGFBQWEsQ0FBQzlDLElBQUQsQ0FBcEIsRUFBNEI4QyxhQUFhLENBQUNKLEtBQUQsQ0FBekMsQ0FBUjtBQUNEO0FBQ0YsR0F4Q3VFLENBMEN4RTs7O0FBQ0FNLEVBQUFBLGNBQWMsQ0FBQ3ZELElBQUQsRUFBT08sSUFBUCxDQUFkO0FBQ0FnRCxFQUFBQSxjQUFjLENBQUN2RCxJQUFELEVBQU9pRCxLQUFQLENBQWQ7QUFFQWxELEVBQUFBLGFBQWEsQ0FBQ0MsSUFBRCxDQUFiO0FBQ0Q7O0FBRUQsU0FBU29ELFlBQVQsQ0FBc0JwRCxJQUF0QixFQUE0Qk8sSUFBNUIsRUFBa0MwQyxLQUFsQyxFQUF5QztBQUN2QyxNQUFJTyxTQUFTLEdBQUdILGFBQWEsQ0FBQzlDLElBQUQsQ0FBN0I7QUFBQSxNQUNJa0QsWUFBWSxHQUFHSixhQUFhLENBQUNKLEtBQUQsQ0FEaEM7O0FBR0EsTUFBSVMsVUFBVSxDQUFDRixTQUFELENBQVYsSUFBeUJFLFVBQVUsQ0FBQ0QsWUFBRCxDQUF2QyxFQUF1RDtBQUNyRDtBQUNBO0FBQUk7QUFBQTtBQUFBOztBQUFBRTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBO0FBQUEsS0FBZ0JILFNBQWhCLEVBQTJCQyxZQUEzQixLQUNHRyxrQkFBa0IsQ0FBQ1gsS0FBRCxFQUFRTyxTQUFSLEVBQW1CQSxTQUFTLENBQUNoQyxNQUFWLEdBQW1CaUMsWUFBWSxDQUFDakMsTUFBbkQsQ0FEekIsRUFDcUY7QUFBQTtBQUFBOztBQUFBOztBQUNuRjs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQXhCLE1BQUFBLElBQUksQ0FBQ0UsS0FBTCxFQUFXNEIsSUFBWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9CMEIsTUFBQUEsU0FBcEI7O0FBQ0E7QUFDRCxLQUpELE1BSU87QUFBSTtBQUFBO0FBQUE7O0FBQUFHO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxLQUFnQkYsWUFBaEIsRUFBOEJELFNBQTlCLEtBQ0pJLGtCQUFrQixDQUFDckQsSUFBRCxFQUFPa0QsWUFBUCxFQUFxQkEsWUFBWSxDQUFDakMsTUFBYixHQUFzQmdDLFNBQVMsQ0FBQ2hDLE1BQXJELENBRGxCLEVBQ2dGO0FBQUE7QUFBQTs7QUFBQTs7QUFDckY7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUF4QixNQUFBQSxJQUFJLENBQUNFLEtBQUwsRUFBVzRCLElBQVg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQjJCLE1BQUFBLFlBQXBCOztBQUNBO0FBQ0Q7QUFDRixHQVhELE1BV087QUFBSTtBQUFBO0FBQUE7O0FBQUFJO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUE7QUFBQSxHQUFXTCxTQUFYLEVBQXNCQyxZQUF0QixDQUFKLEVBQXlDO0FBQUE7QUFBQTs7QUFBQTs7QUFDOUM7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUF6RCxJQUFBQSxJQUFJLENBQUNFLEtBQUwsRUFBVzRCLElBQVg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvQjBCLElBQUFBLFNBQXBCOztBQUNBO0FBQ0Q7O0FBRURiLEVBQUFBLFFBQVEsQ0FBQzNDLElBQUQsRUFBT3dELFNBQVAsRUFBa0JDLFlBQWxCLENBQVI7QUFDRDs7QUFFRCxTQUFTSCxPQUFULENBQWlCdEQsSUFBakIsRUFBdUJPLElBQXZCLEVBQTZCMEMsS0FBN0IsRUFBb0NhLElBQXBDLEVBQTBDO0FBQ3hDLE1BQUlOLFNBQVMsR0FBR0gsYUFBYSxDQUFDOUMsSUFBRCxDQUE3QjtBQUFBLE1BQ0lrRCxZQUFZLEdBQUdNLGNBQWMsQ0FBQ2QsS0FBRCxFQUFRTyxTQUFSLENBRGpDOztBQUVBLE1BQUlDLFlBQVksQ0FBQ08sTUFBakIsRUFBeUI7QUFBQTtBQUFBOztBQUFBOztBQUN2Qjs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQWhFLElBQUFBLElBQUksQ0FBQ0UsS0FBTCxFQUFXNEIsSUFBWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9CMkIsSUFBQUEsWUFBWSxDQUFDTyxNQUFqQztBQUNELEdBRkQsTUFFTztBQUNMckIsSUFBQUEsUUFBUSxDQUFDM0MsSUFBRCxFQUFPOEQsSUFBSSxHQUFHTCxZQUFILEdBQWtCRCxTQUE3QixFQUF3Q00sSUFBSSxHQUFHTixTQUFILEdBQWVDLFlBQTNELENBQVI7QUFDRDtBQUNGOztBQUVELFNBQVNkLFFBQVQsQ0FBa0IzQyxJQUFsQixFQUF3Qk8sSUFBeEIsRUFBOEIwQyxLQUE5QixFQUFxQztBQUNuQ2pELEVBQUFBLElBQUksQ0FBQzJDLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQTNDLEVBQUFBLElBQUksQ0FBQ0UsS0FBTCxDQUFXNEIsSUFBWCxDQUFnQjtBQUNkYSxJQUFBQSxRQUFRLEVBQUUsSUFESTtBQUVkcEMsSUFBQUEsSUFBSSxFQUFFQSxJQUZRO0FBR2RDLElBQUFBLE1BQU0sRUFBRXlDO0FBSE0sR0FBaEI7QUFLRDs7QUFFRCxTQUFTQyxhQUFULENBQXVCbEQsSUFBdkIsRUFBNkJpRSxNQUE3QixFQUFxQ2hCLEtBQXJDLEVBQTRDO0FBQzFDLFNBQU9nQixNQUFNLENBQUNwQixNQUFQLEdBQWdCSSxLQUFLLENBQUNKLE1BQXRCLElBQWdDb0IsTUFBTSxDQUFDckQsS0FBUCxHQUFlcUQsTUFBTSxDQUFDL0QsS0FBUCxDQUFhc0IsTUFBbkUsRUFBMkU7QUFDekUsUUFBSTBDLElBQUksR0FBR0QsTUFBTSxDQUFDL0QsS0FBUCxDQUFhK0QsTUFBTSxDQUFDckQsS0FBUCxFQUFiLENBQVg7QUFDQVosSUFBQUEsSUFBSSxDQUFDRSxLQUFMLENBQVc0QixJQUFYLENBQWdCb0MsSUFBaEI7QUFDQUQsSUFBQUEsTUFBTSxDQUFDcEIsTUFBUDtBQUNEO0FBQ0Y7O0FBQ0QsU0FBU1UsY0FBVCxDQUF3QnZELElBQXhCLEVBQThCaUUsTUFBOUIsRUFBc0M7QUFDcEMsU0FBT0EsTUFBTSxDQUFDckQsS0FBUCxHQUFlcUQsTUFBTSxDQUFDL0QsS0FBUCxDQUFhc0IsTUFBbkMsRUFBMkM7QUFDekMsUUFBSTBDLElBQUksR0FBR0QsTUFBTSxDQUFDL0QsS0FBUCxDQUFhK0QsTUFBTSxDQUFDckQsS0FBUCxFQUFiLENBQVg7QUFDQVosSUFBQUEsSUFBSSxDQUFDRSxLQUFMLENBQVc0QixJQUFYLENBQWdCb0MsSUFBaEI7QUFDRDtBQUNGOztBQUVELFNBQVNiLGFBQVQsQ0FBdUJjLEtBQXZCLEVBQThCO0FBQzVCLE1BQUl4RCxHQUFHLEdBQUcsRUFBVjtBQUFBLE1BQ0l5RCxTQUFTLEdBQUdELEtBQUssQ0FBQ2pFLEtBQU4sQ0FBWWlFLEtBQUssQ0FBQ3ZELEtBQWxCLEVBQXlCLENBQXpCLENBRGhCOztBQUVBLFNBQU91RCxLQUFLLENBQUN2RCxLQUFOLEdBQWN1RCxLQUFLLENBQUNqRSxLQUFOLENBQVlzQixNQUFqQyxFQUF5QztBQUN2QyxRQUFJMEMsSUFBSSxHQUFHQyxLQUFLLENBQUNqRSxLQUFOLENBQVlpRSxLQUFLLENBQUN2RCxLQUFsQixDQUFYLENBRHVDLENBR3ZDOztBQUNBLFFBQUl3RCxTQUFTLEtBQUssR0FBZCxJQUFxQkYsSUFBSSxDQUFDLENBQUQsQ0FBSixLQUFZLEdBQXJDLEVBQTBDO0FBQ3hDRSxNQUFBQSxTQUFTLEdBQUcsR0FBWjtBQUNEOztBQUVELFFBQUlBLFNBQVMsS0FBS0YsSUFBSSxDQUFDLENBQUQsQ0FBdEIsRUFBMkI7QUFDekJ2RCxNQUFBQSxHQUFHLENBQUNtQixJQUFKLENBQVNvQyxJQUFUO0FBQ0FDLE1BQUFBLEtBQUssQ0FBQ3ZELEtBQU47QUFDRCxLQUhELE1BR087QUFDTDtBQUNEO0FBQ0Y7O0FBRUQsU0FBT0QsR0FBUDtBQUNEOztBQUNELFNBQVNvRCxjQUFULENBQXdCSSxLQUF4QixFQUErQkUsWUFBL0IsRUFBNkM7QUFDM0MsTUFBSUMsT0FBTyxHQUFHLEVBQWQ7QUFBQSxNQUNJTixNQUFNLEdBQUcsRUFEYjtBQUFBLE1BRUlPLFVBQVUsR0FBRyxDQUZqQjtBQUFBLE1BR0lDLGNBQWMsR0FBRyxLQUhyQjtBQUFBLE1BSUlDLFVBQVUsR0FBRyxLQUpqQjs7QUFLQSxTQUFPRixVQUFVLEdBQUdGLFlBQVksQ0FBQzdDLE1BQTFCLElBQ0UyQyxLQUFLLENBQUN2RCxLQUFOLEdBQWN1RCxLQUFLLENBQUNqRSxLQUFOLENBQVlzQixNQURuQyxFQUMyQztBQUN6QyxRQUFJa0QsTUFBTSxHQUFHUCxLQUFLLENBQUNqRSxLQUFOLENBQVlpRSxLQUFLLENBQUN2RCxLQUFsQixDQUFiO0FBQUEsUUFDSStELEtBQUssR0FBR04sWUFBWSxDQUFDRSxVQUFELENBRHhCLENBRHlDLENBSXpDOztBQUNBLFFBQUlJLEtBQUssQ0FBQyxDQUFELENBQUwsS0FBYSxHQUFqQixFQUFzQjtBQUNwQjtBQUNEOztBQUVESCxJQUFBQSxjQUFjLEdBQUdBLGNBQWMsSUFBSUUsTUFBTSxDQUFDLENBQUQsQ0FBTixLQUFjLEdBQWpEO0FBRUFWLElBQUFBLE1BQU0sQ0FBQ2xDLElBQVAsQ0FBWTZDLEtBQVo7QUFDQUosSUFBQUEsVUFBVSxHQVorQixDQWN6QztBQUNBOztBQUNBLFFBQUlHLE1BQU0sQ0FBQyxDQUFELENBQU4sS0FBYyxHQUFsQixFQUF1QjtBQUNyQkQsTUFBQUEsVUFBVSxHQUFHLElBQWI7O0FBRUEsYUFBT0MsTUFBTSxDQUFDLENBQUQsQ0FBTixLQUFjLEdBQXJCLEVBQTBCO0FBQ3hCSixRQUFBQSxPQUFPLENBQUN4QyxJQUFSLENBQWE0QyxNQUFiO0FBQ0FBLFFBQUFBLE1BQU0sR0FBR1AsS0FBSyxDQUFDakUsS0FBTixDQUFZLEVBQUVpRSxLQUFLLENBQUN2RCxLQUFwQixDQUFUO0FBQ0Q7QUFDRjs7QUFFRCxRQUFJK0QsS0FBSyxDQUFDQyxNQUFOLENBQWEsQ0FBYixNQUFvQkYsTUFBTSxDQUFDRSxNQUFQLENBQWMsQ0FBZCxDQUF4QixFQUEwQztBQUN4Q04sTUFBQUEsT0FBTyxDQUFDeEMsSUFBUixDQUFhNEMsTUFBYjtBQUNBUCxNQUFBQSxLQUFLLENBQUN2RCxLQUFOO0FBQ0QsS0FIRCxNQUdPO0FBQ0w2RCxNQUFBQSxVQUFVLEdBQUcsSUFBYjtBQUNEO0FBQ0Y7O0FBRUQsTUFBSSxDQUFDSixZQUFZLENBQUNFLFVBQUQsQ0FBWixJQUE0QixFQUE3QixFQUFpQyxDQUFqQyxNQUF3QyxHQUF4QyxJQUNHQyxjQURQLEVBQ3VCO0FBQ3JCQyxJQUFBQSxVQUFVLEdBQUcsSUFBYjtBQUNEOztBQUVELE1BQUlBLFVBQUosRUFBZ0I7QUFDZCxXQUFPSCxPQUFQO0FBQ0Q7O0FBRUQsU0FBT0MsVUFBVSxHQUFHRixZQUFZLENBQUM3QyxNQUFqQyxFQUF5QztBQUN2Q3dDLElBQUFBLE1BQU0sQ0FBQ2xDLElBQVAsQ0FBWXVDLFlBQVksQ0FBQ0UsVUFBVSxFQUFYLENBQXhCO0FBQ0Q7O0FBRUQsU0FBTztBQUNMUCxJQUFBQSxNQUFNLEVBQU5BLE1BREs7QUFFTE0sSUFBQUEsT0FBTyxFQUFQQTtBQUZLLEdBQVA7QUFJRDs7QUFFRCxTQUFTWixVQUFULENBQW9CWSxPQUFwQixFQUE2QjtBQUMzQixTQUFPQSxPQUFPLENBQUNPLE1BQVIsQ0FBZSxVQUFTQyxJQUFULEVBQWVKLE1BQWYsRUFBdUI7QUFDM0MsV0FBT0ksSUFBSSxJQUFJSixNQUFNLENBQUMsQ0FBRCxDQUFOLEtBQWMsR0FBN0I7QUFDRCxHQUZNLEVBRUosSUFGSSxDQUFQO0FBR0Q7O0FBQ0QsU0FBU2Qsa0JBQVQsQ0FBNEJPLEtBQTVCLEVBQW1DWSxhQUFuQyxFQUFrREMsS0FBbEQsRUFBeUQ7QUFDdkQsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRCxLQUFwQixFQUEyQkMsQ0FBQyxFQUE1QixFQUFnQztBQUM5QixRQUFJQyxhQUFhLEdBQUdILGFBQWEsQ0FBQ0EsYUFBYSxDQUFDdkQsTUFBZCxHQUF1QndELEtBQXZCLEdBQStCQyxDQUFoQyxDQUFiLENBQWdETCxNQUFoRCxDQUF1RCxDQUF2RCxDQUFwQjs7QUFDQSxRQUFJVCxLQUFLLENBQUNqRSxLQUFOLENBQVlpRSxLQUFLLENBQUN2RCxLQUFOLEdBQWNxRSxDQUExQixNQUFpQyxNQUFNQyxhQUEzQyxFQUEwRDtBQUN4RCxhQUFPLEtBQVA7QUFDRDtBQUNGOztBQUVEZixFQUFBQSxLQUFLLENBQUN2RCxLQUFOLElBQWVvRSxLQUFmO0FBQ0EsU0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBUy9FLG1CQUFULENBQTZCQyxLQUE3QixFQUFvQztBQUNsQyxNQUFJQyxRQUFRLEdBQUcsQ0FBZjtBQUNBLE1BQUlDLFFBQVEsR0FBRyxDQUFmO0FBRUFGLEVBQUFBLEtBQUssQ0FBQ2lGLE9BQU4sQ0FBYyxVQUFTakIsSUFBVCxFQUFlO0FBQzNCLFFBQUksT0FBT0EsSUFBUCxLQUFnQixRQUFwQixFQUE4QjtBQUM1QixVQUFJa0IsT0FBTyxHQUFHbkYsbUJBQW1CLENBQUNpRSxJQUFJLENBQUMzRCxJQUFOLENBQWpDO0FBQ0EsVUFBSThFLFVBQVUsR0FBR3BGLG1CQUFtQixDQUFDaUUsSUFBSSxDQUFDMUQsTUFBTixDQUFwQzs7QUFFQSxVQUFJTCxRQUFRLEtBQUtFLFNBQWpCLEVBQTRCO0FBQzFCLFlBQUkrRSxPQUFPLENBQUNqRixRQUFSLEtBQXFCa0YsVUFBVSxDQUFDbEYsUUFBcEMsRUFBOEM7QUFDNUNBLFVBQUFBLFFBQVEsSUFBSWlGLE9BQU8sQ0FBQ2pGLFFBQXBCO0FBQ0QsU0FGRCxNQUVPO0FBQ0xBLFVBQUFBLFFBQVEsR0FBR0UsU0FBWDtBQUNEO0FBQ0Y7O0FBRUQsVUFBSUQsUUFBUSxLQUFLQyxTQUFqQixFQUE0QjtBQUMxQixZQUFJK0UsT0FBTyxDQUFDaEYsUUFBUixLQUFxQmlGLFVBQVUsQ0FBQ2pGLFFBQXBDLEVBQThDO0FBQzVDQSxVQUFBQSxRQUFRLElBQUlnRixPQUFPLENBQUNoRixRQUFwQjtBQUNELFNBRkQsTUFFTztBQUNMQSxVQUFBQSxRQUFRLEdBQUdDLFNBQVg7QUFDRDtBQUNGO0FBQ0YsS0FuQkQsTUFtQk87QUFDTCxVQUFJRCxRQUFRLEtBQUtDLFNBQWIsS0FBMkI2RCxJQUFJLENBQUMsQ0FBRCxDQUFKLEtBQVksR0FBWixJQUFtQkEsSUFBSSxDQUFDLENBQUQsQ0FBSixLQUFZLEdBQTFELENBQUosRUFBb0U7QUFDbEU5RCxRQUFBQSxRQUFRO0FBQ1Q7O0FBQ0QsVUFBSUQsUUFBUSxLQUFLRSxTQUFiLEtBQTJCNkQsSUFBSSxDQUFDLENBQUQsQ0FBSixLQUFZLEdBQVosSUFBbUJBLElBQUksQ0FBQyxDQUFELENBQUosS0FBWSxHQUExRCxDQUFKLEVBQW9FO0FBQ2xFL0QsUUFBQUEsUUFBUTtBQUNUO0FBQ0Y7QUFDRixHQTVCRDtBQThCQSxTQUFPO0FBQUNBLElBQUFBLFFBQVEsRUFBUkEsUUFBRDtBQUFXQyxJQUFBQSxRQUFRLEVBQVJBO0FBQVgsR0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtzdHJ1Y3R1cmVkUGF0Y2h9IGZyb20gJy4vY3JlYXRlJztcbmltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXJzZSc7XG5cbmltcG9ydCB7YXJyYXlFcXVhbCwgYXJyYXlTdGFydHNXaXRofSBmcm9tICcuLi91dGlsL2FycmF5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNMaW5lQ291bnQoaHVuaykge1xuICBjb25zdCB7b2xkTGluZXMsIG5ld0xpbmVzfSA9IGNhbGNPbGROZXdMaW5lQ291bnQoaHVuay5saW5lcyk7XG5cbiAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBodW5rLm9sZExpbmVzID0gb2xkTGluZXM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGh1bmsub2xkTGluZXM7XG4gIH1cblxuICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGh1bmsubmV3TGluZXMgPSBuZXdMaW5lcztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgaHVuay5uZXdMaW5lcztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2UobWluZSwgdGhlaXJzLCBiYXNlKSB7XG4gIG1pbmUgPSBsb2FkUGF0Y2gobWluZSwgYmFzZSk7XG4gIHRoZWlycyA9IGxvYWRQYXRjaCh0aGVpcnMsIGJhc2UpO1xuXG4gIGxldCByZXQgPSB7fTtcblxuICAvLyBGb3IgaW5kZXggd2UganVzdCBsZXQgaXQgcGFzcyB0aHJvdWdoIGFzIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgbmVjZXNzYXJ5IG1lYW5pbmcuXG4gIC8vIExlYXZpbmcgc2FuaXR5IGNoZWNrcyBvbiB0aGlzIHRvIHRoZSBBUEkgY29uc3VtZXIgdGhhdCBtYXkga25vdyBtb3JlIGFib3V0IHRoZVxuICAvLyBtZWFuaW5nIGluIHRoZWlyIG93biBjb250ZXh0LlxuICBpZiAobWluZS5pbmRleCB8fCB0aGVpcnMuaW5kZXgpIHtcbiAgICByZXQuaW5kZXggPSBtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleDtcbiAgfVxuXG4gIGlmIChtaW5lLm5ld0ZpbGVOYW1lIHx8IHRoZWlycy5uZXdGaWxlTmFtZSkge1xuICAgIGlmICghZmlsZU5hbWVDaGFuZ2VkKG1pbmUpKSB7XG4gICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIG91cnMsIHVzZSB0aGVpcnMgKGFuZCBvdXJzIGlmIHRoZWlycyBkb2VzIG5vdCBleGlzdClcbiAgICAgIHJldC5vbGRGaWxlTmFtZSA9IHRoZWlycy5vbGRGaWxlTmFtZSB8fCBtaW5lLm9sZEZpbGVOYW1lO1xuICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gdGhlaXJzLm5ld0ZpbGVOYW1lIHx8IG1pbmUubmV3RmlsZU5hbWU7XG4gICAgICByZXQub2xkSGVhZGVyID0gdGhlaXJzLm9sZEhlYWRlciB8fCBtaW5lLm9sZEhlYWRlcjtcbiAgICAgIHJldC5uZXdIZWFkZXIgPSB0aGVpcnMubmV3SGVhZGVyIHx8IG1pbmUubmV3SGVhZGVyO1xuICAgIH0gZWxzZSBpZiAoIWZpbGVOYW1lQ2hhbmdlZCh0aGVpcnMpKSB7XG4gICAgICAvLyBObyBoZWFkZXIgb3Igbm8gY2hhbmdlIGluIHRoZWlycywgdXNlIG91cnNcbiAgICAgIHJldC5vbGRGaWxlTmFtZSA9IG1pbmUub2xkRmlsZU5hbWU7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSBtaW5lLm5ld0ZpbGVOYW1lO1xuICAgICAgcmV0Lm9sZEhlYWRlciA9IG1pbmUub2xkSGVhZGVyO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IG1pbmUubmV3SGVhZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb3RoIGNoYW5nZWQuLi4gZmlndXJlIGl0IG91dFxuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEZpbGVOYW1lLCB0aGVpcnMub2xkRmlsZU5hbWUpO1xuICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0ZpbGVOYW1lLCB0aGVpcnMubmV3RmlsZU5hbWUpO1xuICAgICAgcmV0Lm9sZEhlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5vbGRIZWFkZXIsIHRoZWlycy5vbGRIZWFkZXIpO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5uZXdIZWFkZXIsIHRoZWlycy5uZXdIZWFkZXIpO1xuICAgIH1cbiAgfVxuXG4gIHJldC5odW5rcyA9IFtdO1xuXG4gIGxldCBtaW5lSW5kZXggPSAwLFxuICAgICAgdGhlaXJzSW5kZXggPSAwLFxuICAgICAgbWluZU9mZnNldCA9IDAsXG4gICAgICB0aGVpcnNPZmZzZXQgPSAwO1xuXG4gIHdoaWxlIChtaW5lSW5kZXggPCBtaW5lLmh1bmtzLmxlbmd0aCB8fCB0aGVpcnNJbmRleCA8IHRoZWlycy5odW5rcy5sZW5ndGgpIHtcbiAgICBsZXQgbWluZUN1cnJlbnQgPSBtaW5lLmh1bmtzW21pbmVJbmRleF0gfHwge29sZFN0YXJ0OiBJbmZpbml0eX0sXG4gICAgICAgIHRoZWlyc0N1cnJlbnQgPSB0aGVpcnMuaHVua3NbdGhlaXJzSW5kZXhdIHx8IHtvbGRTdGFydDogSW5maW5pdHl9O1xuXG4gICAgaWYgKGh1bmtCZWZvcmUobWluZUN1cnJlbnQsIHRoZWlyc0N1cnJlbnQpKSB7XG4gICAgICAvLyBUaGlzIHBhdGNoIGRvZXMgbm90IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIG90aGVycywgeWF5LlxuICAgICAgcmV0Lmh1bmtzLnB1c2goY2xvbmVIdW5rKG1pbmVDdXJyZW50LCBtaW5lT2Zmc2V0KSk7XG4gICAgICBtaW5lSW5kZXgrKztcbiAgICAgIHRoZWlyc09mZnNldCArPSBtaW5lQ3VycmVudC5uZXdMaW5lcyAtIG1pbmVDdXJyZW50Lm9sZExpbmVzO1xuICAgIH0gZWxzZSBpZiAoaHVua0JlZm9yZSh0aGVpcnNDdXJyZW50LCBtaW5lQ3VycmVudCkpIHtcbiAgICAgIC8vIFRoaXMgcGF0Y2ggZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgb3RoZXJzLCB5YXkuXG4gICAgICByZXQuaHVua3MucHVzaChjbG9uZUh1bmsodGhlaXJzQ3VycmVudCwgdGhlaXJzT2Zmc2V0KSk7XG4gICAgICB0aGVpcnNJbmRleCsrO1xuICAgICAgbWluZU9mZnNldCArPSB0aGVpcnNDdXJyZW50Lm5ld0xpbmVzIC0gdGhlaXJzQ3VycmVudC5vbGRMaW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3ZlcmxhcCwgbWVyZ2UgYXMgYmVzdCB3ZSBjYW5cbiAgICAgIGxldCBtZXJnZWRIdW5rID0ge1xuICAgICAgICBvbGRTdGFydDogTWF0aC5taW4obWluZUN1cnJlbnQub2xkU3RhcnQsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQpLFxuICAgICAgICBvbGRMaW5lczogMCxcbiAgICAgICAgbmV3U3RhcnQ6IE1hdGgubWluKG1pbmVDdXJyZW50Lm5ld1N0YXJ0ICsgbWluZU9mZnNldCwgdGhlaXJzQ3VycmVudC5vbGRTdGFydCArIHRoZWlyc09mZnNldCksXG4gICAgICAgIG5ld0xpbmVzOiAwLFxuICAgICAgICBsaW5lczogW11cbiAgICAgIH07XG4gICAgICBtZXJnZUxpbmVzKG1lcmdlZEh1bmssIG1pbmVDdXJyZW50Lm9sZFN0YXJ0LCBtaW5lQ3VycmVudC5saW5lcywgdGhlaXJzQ3VycmVudC5vbGRTdGFydCwgdGhlaXJzQ3VycmVudC5saW5lcyk7XG4gICAgICB0aGVpcnNJbmRleCsrO1xuICAgICAgbWluZUluZGV4Kys7XG5cbiAgICAgIHJldC5odW5rcy5wdXNoKG1lcmdlZEh1bmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGxvYWRQYXRjaChwYXJhbSwgYmFzZSkge1xuICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgIGlmICgoL15AQC9tKS50ZXN0KHBhcmFtKSB8fCAoKC9eSW5kZXg6L20pLnRlc3QocGFyYW0pKSkge1xuICAgICAgcmV0dXJuIHBhcnNlUGF0Y2gocGFyYW0pWzBdO1xuICAgIH1cblxuICAgIGlmICghYmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgYSBiYXNlIHJlZmVyZW5jZSBvciBwYXNzIGluIGEgcGF0Y2gnKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRQYXRjaCh1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmFzZSwgcGFyYW0pO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtO1xufVxuXG5mdW5jdGlvbiBmaWxlTmFtZUNoYW5nZWQocGF0Y2gpIHtcbiAgcmV0dXJuIHBhdGNoLm5ld0ZpbGVOYW1lICYmIHBhdGNoLm5ld0ZpbGVOYW1lICE9PSBwYXRjaC5vbGRGaWxlTmFtZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0RmllbGQoaW5kZXgsIG1pbmUsIHRoZWlycykge1xuICBpZiAobWluZSA9PT0gdGhlaXJzKSB7XG4gICAgcmV0dXJuIG1pbmU7XG4gIH0gZWxzZSB7XG4gICAgaW5kZXguY29uZmxpY3QgPSB0cnVlO1xuICAgIHJldHVybiB7bWluZSwgdGhlaXJzfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBodW5rQmVmb3JlKHRlc3QsIGNoZWNrKSB7XG4gIHJldHVybiB0ZXN0Lm9sZFN0YXJ0IDwgY2hlY2sub2xkU3RhcnRcbiAgICAmJiAodGVzdC5vbGRTdGFydCArIHRlc3Qub2xkTGluZXMpIDwgY2hlY2sub2xkU3RhcnQ7XG59XG5cbmZ1bmN0aW9uIGNsb25lSHVuayhodW5rLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBvbGRTdGFydDogaHVuay5vbGRTdGFydCwgb2xkTGluZXM6IGh1bmsub2xkTGluZXMsXG4gICAgbmV3U3RhcnQ6IGh1bmsubmV3U3RhcnQgKyBvZmZzZXQsIG5ld0xpbmVzOiBodW5rLm5ld0xpbmVzLFxuICAgIGxpbmVzOiBodW5rLmxpbmVzXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlTGluZXMoaHVuaywgbWluZU9mZnNldCwgbWluZUxpbmVzLCB0aGVpck9mZnNldCwgdGhlaXJMaW5lcykge1xuICAvLyBUaGlzIHdpbGwgZ2VuZXJhbGx5IHJlc3VsdCBpbiBhIGNvbmZsaWN0ZWQgaHVuaywgYnV0IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgY29udGV4dFxuICAvLyBpcyB0aGUgb25seSBvdmVybGFwIHdoZXJlIHdlIGNhbiBzdWNjZXNzZnVsbHkgbWVyZ2UgdGhlIGNvbnRlbnQgaGVyZS5cbiAgbGV0IG1pbmUgPSB7b2Zmc2V0OiBtaW5lT2Zmc2V0LCBsaW5lczogbWluZUxpbmVzLCBpbmRleDogMH0sXG4gICAgICB0aGVpciA9IHtvZmZzZXQ6IHRoZWlyT2Zmc2V0LCBsaW5lczogdGhlaXJMaW5lcywgaW5kZXg6IDB9O1xuXG4gIC8vIEhhbmRsZSBhbnkgbGVhZGluZyBjb250ZW50XG4gIGluc2VydExlYWRpbmcoaHVuaywgbWluZSwgdGhlaXIpO1xuICBpbnNlcnRMZWFkaW5nKGh1bmssIHRoZWlyLCBtaW5lKTtcblxuICAvLyBOb3cgaW4gdGhlIG92ZXJsYXAgY29udGVudC4gU2NhbiB0aHJvdWdoIGFuZCBzZWxlY3QgdGhlIGJlc3QgY2hhbmdlcyBmcm9tIGVhY2guXG4gIHdoaWxlIChtaW5lLmluZGV4IDwgbWluZS5saW5lcy5sZW5ndGggJiYgdGhlaXIuaW5kZXggPCB0aGVpci5saW5lcy5sZW5ndGgpIHtcbiAgICBsZXQgbWluZUN1cnJlbnQgPSBtaW5lLmxpbmVzW21pbmUuaW5kZXhdLFxuICAgICAgICB0aGVpckN1cnJlbnQgPSB0aGVpci5saW5lc1t0aGVpci5pbmRleF07XG5cbiAgICBpZiAoKG1pbmVDdXJyZW50WzBdID09PSAnLScgfHwgbWluZUN1cnJlbnRbMF0gPT09ICcrJylcbiAgICAgICAgJiYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nIHx8IHRoZWlyQ3VycmVudFswXSA9PT0gJysnKSkge1xuICAgICAgLy8gQm90aCBtb2RpZmllZCAuLi5cbiAgICAgIG11dHVhbENoYW5nZShodW5rLCBtaW5lLCB0aGVpcik7XG4gICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJysnICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICAvLyBNaW5lIGluc2VydGVkXG4gICAgICBodW5rLmxpbmVzLnB1c2goLi4uIGNvbGxlY3RDaGFuZ2UobWluZSkpO1xuICAgIH0gZWxzZSBpZiAodGhlaXJDdXJyZW50WzBdID09PSAnKycgJiYgbWluZUN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgLy8gVGhlaXJzIGluc2VydGVkXG4gICAgICBodW5rLmxpbmVzLnB1c2goLi4uIGNvbGxlY3RDaGFuZ2UodGhlaXIpKTtcbiAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50WzBdID09PSAnLScgJiYgdGhlaXJDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8vIE1pbmUgcmVtb3ZlZCBvciBlZGl0ZWRcbiAgICAgIHJlbW92YWwoaHVuaywgbWluZSwgdGhlaXIpO1xuICAgIH0gZWxzZSBpZiAodGhlaXJDdXJyZW50WzBdID09PSAnLScgJiYgbWluZUN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgLy8gVGhlaXIgcmVtb3ZlZCBvciBlZGl0ZWRcbiAgICAgIHJlbW92YWwoaHVuaywgdGhlaXIsIG1pbmUsIHRydWUpO1xuICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnQgPT09IHRoZWlyQ3VycmVudCkge1xuICAgICAgLy8gQ29udGV4dCBpZGVudGl0eVxuICAgICAgaHVuay5saW5lcy5wdXNoKG1pbmVDdXJyZW50KTtcbiAgICAgIG1pbmUuaW5kZXgrKztcbiAgICAgIHRoZWlyLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnRleHQgbWlzbWF0Y2hcbiAgICAgIGNvbmZsaWN0KGh1bmssIGNvbGxlY3RDaGFuZ2UobWluZSksIGNvbGxlY3RDaGFuZ2UodGhlaXIpKTtcbiAgICB9XG4gIH1cblxuICAvLyBOb3cgcHVzaCBhbnl0aGluZyB0aGF0IG1heSBiZSByZW1haW5pbmdcbiAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgbWluZSk7XG4gIGluc2VydFRyYWlsaW5nKGh1bmssIHRoZWlyKTtcblxuICBjYWxjTGluZUNvdW50KGh1bmspO1xufVxuXG5mdW5jdGlvbiBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpIHtcbiAgbGV0IG15Q2hhbmdlcyA9IGNvbGxlY3RDaGFuZ2UobWluZSksXG4gICAgICB0aGVpckNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKHRoZWlyKTtcblxuICBpZiAoYWxsUmVtb3ZlcyhteUNoYW5nZXMpICYmIGFsbFJlbW92ZXModGhlaXJDaGFuZ2VzKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgcmVtb3ZlIGNoYW5nZXMgdGhhdCBhcmUgc3VwZXJzZXRzIG9mIG9uZSBhbm90aGVyXG4gICAgaWYgKGFycmF5U3RhcnRzV2l0aChteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcylcbiAgICAgICAgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KHRoZWlyLCBteUNoYW5nZXMsIG15Q2hhbmdlcy5sZW5ndGggLSB0aGVpckNoYW5nZXMubGVuZ3RoKSkge1xuICAgICAgaHVuay5saW5lcy5wdXNoKC4uLiBteUNoYW5nZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoYXJyYXlTdGFydHNXaXRoKHRoZWlyQ2hhbmdlcywgbXlDaGFuZ2VzKVxuICAgICAgICAmJiBza2lwUmVtb3ZlU3VwZXJzZXQobWluZSwgdGhlaXJDaGFuZ2VzLCB0aGVpckNoYW5nZXMubGVuZ3RoIC0gbXlDaGFuZ2VzLmxlbmd0aCkpIHtcbiAgICAgIGh1bmsubGluZXMucHVzaCguLi4gdGhlaXJDaGFuZ2VzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXJyYXlFcXVhbChteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcykpIHtcbiAgICBodW5rLmxpbmVzLnB1c2goLi4uIG15Q2hhbmdlcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uZmxpY3QoaHVuaywgbXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmFsKGh1bmssIG1pbmUsIHRoZWlyLCBzd2FwKSB7XG4gIGxldCBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuICAgICAgdGhlaXJDaGFuZ2VzID0gY29sbGVjdENvbnRleHQodGhlaXIsIG15Q2hhbmdlcyk7XG4gIGlmICh0aGVpckNoYW5nZXMubWVyZ2VkKSB7XG4gICAgaHVuay5saW5lcy5wdXNoKC4uLiB0aGVpckNoYW5nZXMubWVyZ2VkKTtcbiAgfSBlbHNlIHtcbiAgICBjb25mbGljdChodW5rLCBzd2FwID8gdGhlaXJDaGFuZ2VzIDogbXlDaGFuZ2VzLCBzd2FwID8gbXlDaGFuZ2VzIDogdGhlaXJDaGFuZ2VzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25mbGljdChodW5rLCBtaW5lLCB0aGVpcikge1xuICBodW5rLmNvbmZsaWN0ID0gdHJ1ZTtcbiAgaHVuay5saW5lcy5wdXNoKHtcbiAgICBjb25mbGljdDogdHJ1ZSxcbiAgICBtaW5lOiBtaW5lLFxuICAgIHRoZWlyczogdGhlaXJcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydExlYWRpbmcoaHVuaywgaW5zZXJ0LCB0aGVpcikge1xuICB3aGlsZSAoaW5zZXJ0Lm9mZnNldCA8IHRoZWlyLm9mZnNldCAmJiBpbnNlcnQuaW5kZXggPCBpbnNlcnQubGluZXMubGVuZ3RoKSB7XG4gICAgbGV0IGxpbmUgPSBpbnNlcnQubGluZXNbaW5zZXJ0LmluZGV4KytdO1xuICAgIGh1bmsubGluZXMucHVzaChsaW5lKTtcbiAgICBpbnNlcnQub2Zmc2V0Kys7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc2VydFRyYWlsaW5nKGh1bmssIGluc2VydCkge1xuICB3aGlsZSAoaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgIGxldCBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcbiAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdENoYW5nZShzdGF0ZSkge1xuICBsZXQgcmV0ID0gW10sXG4gICAgICBvcGVyYXRpb24gPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF1bMF07XG4gIHdoaWxlIChzdGF0ZS5pbmRleCA8IHN0YXRlLmxpbmVzLmxlbmd0aCkge1xuICAgIGxldCBsaW5lID0gc3RhdGUubGluZXNbc3RhdGUuaW5kZXhdO1xuXG4gICAgLy8gR3JvdXAgYWRkaXRpb25zIHRoYXQgYXJlIGltbWVkaWF0ZWx5IGFmdGVyIHN1YnRyYWN0aW9ucyBhbmQgdHJlYXQgdGhlbSBhcyBvbmUgXCJhdG9taWNcIiBtb2RpZnkgY2hhbmdlLlxuICAgIGlmIChvcGVyYXRpb24gPT09ICctJyAmJiBsaW5lWzBdID09PSAnKycpIHtcbiAgICAgIG9wZXJhdGlvbiA9ICcrJztcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0aW9uID09PSBsaW5lWzBdKSB7XG4gICAgICByZXQucHVzaChsaW5lKTtcbiAgICAgIHN0YXRlLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBjb2xsZWN0Q29udGV4dChzdGF0ZSwgbWF0Y2hDaGFuZ2VzKSB7XG4gIGxldCBjaGFuZ2VzID0gW10sXG4gICAgICBtZXJnZWQgPSBbXSxcbiAgICAgIG1hdGNoSW5kZXggPSAwLFxuICAgICAgY29udGV4dENoYW5nZXMgPSBmYWxzZSxcbiAgICAgIGNvbmZsaWN0ZWQgPSBmYWxzZTtcbiAgd2hpbGUgKG1hdGNoSW5kZXggPCBtYXRjaENoYW5nZXMubGVuZ3RoXG4gICAgICAgICYmIHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG4gICAgbGV0IGNoYW5nZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XSxcbiAgICAgICAgbWF0Y2ggPSBtYXRjaENoYW5nZXNbbWF0Y2hJbmRleF07XG5cbiAgICAvLyBPbmNlIHdlJ3ZlIGhpdCBvdXIgYWRkLCB0aGVuIHdlIGFyZSBkb25lXG4gICAgaWYgKG1hdGNoWzBdID09PSAnKycpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnRleHRDaGFuZ2VzID0gY29udGV4dENoYW5nZXMgfHwgY2hhbmdlWzBdICE9PSAnICc7XG5cbiAgICBtZXJnZWQucHVzaChtYXRjaCk7XG4gICAgbWF0Y2hJbmRleCsrO1xuXG4gICAgLy8gQ29uc3VtZSBhbnkgYWRkaXRpb25zIGluIHRoZSBvdGhlciBibG9jayBhcyBhIGNvbmZsaWN0IHRvIGF0dGVtcHRcbiAgICAvLyB0byBwdWxsIGluIHRoZSByZW1haW5pbmcgY29udGV4dCBhZnRlciB0aGlzXG4gICAgaWYgKGNoYW5nZVswXSA9PT0gJysnKSB7XG4gICAgICBjb25mbGljdGVkID0gdHJ1ZTtcblxuICAgICAgd2hpbGUgKGNoYW5nZVswXSA9PT0gJysnKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaChjaGFuZ2UpO1xuICAgICAgICBjaGFuZ2UgPSBzdGF0ZS5saW5lc1srK3N0YXRlLmluZGV4XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWF0Y2guc3Vic3RyKDEpID09PSBjaGFuZ2Uuc3Vic3RyKDEpKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgIHN0YXRlLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICgobWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdIHx8ICcnKVswXSA9PT0gJysnXG4gICAgICAmJiBjb250ZXh0Q2hhbmdlcykge1xuICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGNvbmZsaWN0ZWQpIHtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aCkge1xuICAgIG1lcmdlZC5wdXNoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4KytdKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVyZ2VkLFxuICAgIGNoYW5nZXNcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWxsUmVtb3ZlcyhjaGFuZ2VzKSB7XG4gIHJldHVybiBjaGFuZ2VzLnJlZHVjZShmdW5jdGlvbihwcmV2LCBjaGFuZ2UpIHtcbiAgICByZXR1cm4gcHJldiAmJiBjaGFuZ2VbMF0gPT09ICctJztcbiAgfSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBza2lwUmVtb3ZlU3VwZXJzZXQoc3RhdGUsIHJlbW92ZUNoYW5nZXMsIGRlbHRhKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGVsdGE7IGkrKykge1xuICAgIGxldCBjaGFuZ2VDb250ZW50ID0gcmVtb3ZlQ2hhbmdlc1tyZW1vdmVDaGFuZ2VzLmxlbmd0aCAtIGRlbHRhICsgaV0uc3Vic3RyKDEpO1xuICAgIGlmIChzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleCArIGldICE9PSAnICcgKyBjaGFuZ2VDb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUuaW5kZXggKz0gZGVsdGE7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmVzKSB7XG4gIGxldCBvbGRMaW5lcyA9IDA7XG4gIGxldCBuZXdMaW5lcyA9IDA7XG5cbiAgbGluZXMuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgaWYgKHR5cGVvZiBsaW5lICE9PSAnc3RyaW5nJykge1xuICAgICAgbGV0IG15Q291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmUubWluZSk7XG4gICAgICBsZXQgdGhlaXJDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQobGluZS50aGVpcnMpO1xuXG4gICAgICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobXlDb3VudC5vbGRMaW5lcyA9PT0gdGhlaXJDb3VudC5vbGRMaW5lcykge1xuICAgICAgICAgIG9sZExpbmVzICs9IG15Q291bnQub2xkTGluZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkTGluZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG15Q291bnQubmV3TGluZXMgPT09IHRoZWlyQ291bnQubmV3TGluZXMpIHtcbiAgICAgICAgICBuZXdMaW5lcyArPSBteUNvdW50Lm5ld0xpbmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xpbmVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnKycgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuICAgICAgICBuZXdMaW5lcysrO1xuICAgICAgfVxuICAgICAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQgJiYgKGxpbmVbMF0gPT09ICctJyB8fCBsaW5lWzBdID09PSAnICcpKSB7XG4gICAgICAgIG9sZExpbmVzKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge29sZExpbmVzLCBuZXdMaW5lc307XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.parsePatch = parsePatch;\n\n/*istanbul ignore end*/\nfunction parsePatch(uniDiff) {\n /*istanbul ignore start*/\n var\n /*istanbul ignore end*/\n options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var diffstr = uniDiff.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n delimiters = uniDiff.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n list = [],\n i = 0;\n\n function parseIndex() {\n var index = {};\n list.push(index); // Parse diff metadata\n\n while (i < diffstr.length) {\n var line = diffstr[i]; // File header found, end parsing diff metadata\n\n if (/^(\\-\\-\\-|\\+\\+\\+|@@)\\s/.test(line)) {\n break;\n } // Diff index\n\n\n var header = /^(?:Index:|diff(?: -r \\w+)+)\\s+(.+?)\\s*$/.exec(line);\n\n if (header) {\n index.index = header[1];\n }\n\n i++;\n } // Parse file headers if they are defined. Unified diff requires them, but\n // there's no technical issues to have an isolated hunk without file header\n\n\n parseFileHeader(index);\n parseFileHeader(index); // Parse hunks\n\n index.hunks = [];\n\n while (i < diffstr.length) {\n var _line = diffstr[i];\n\n if (/^(Index:|diff|\\-\\-\\-|\\+\\+\\+)\\s/.test(_line)) {\n break;\n } else if (/^@@/.test(_line)) {\n index.hunks.push(parseHunk());\n } else if (_line && options.strict) {\n // Ignore unexpected content unless in strict mode\n throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line));\n } else {\n i++;\n }\n }\n } // Parses the --- and +++ headers, if none are found, no lines\n // are consumed.\n\n\n function parseFileHeader(index) {\n var fileHeader = /^(---|\\+\\+\\+)\\s+(.*)$/.exec(diffstr[i]);\n\n if (fileHeader) {\n var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new';\n var data = fileHeader[2].split('\\t', 2);\n var fileName = data[0].replace(/\\\\\\\\/g, '\\\\');\n\n if (/^\".*\"$/.test(fileName)) {\n fileName = fileName.substr(1, fileName.length - 2);\n }\n\n index[keyPrefix + 'FileName'] = fileName;\n index[keyPrefix + 'Header'] = (data[1] || '').trim();\n i++;\n }\n } // Parses a hunk\n // This assumes that we are at the start of a hunk.\n\n\n function parseHunk() {\n var chunkHeaderIndex = i,\n chunkHeaderLine = diffstr[i++],\n chunkHeader = chunkHeaderLine.split(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n var hunk = {\n oldStart: +chunkHeader[1],\n oldLines: typeof chunkHeader[2] === 'undefined' ? 1 : +chunkHeader[2],\n newStart: +chunkHeader[3],\n newLines: typeof chunkHeader[4] === 'undefined' ? 1 : +chunkHeader[4],\n lines: [],\n linedelimiters: []\n }; // Unified Diff Format quirk: If the chunk size is 0,\n // the first number is one lower than one would expect.\n // https://www.artima.com/weblogs/viewpost.jsp?thread=164293\n\n if (hunk.oldLines === 0) {\n hunk.oldStart += 1;\n }\n\n if (hunk.newLines === 0) {\n hunk.newStart += 1;\n }\n\n var addCount = 0,\n removeCount = 0;\n\n for (; i < diffstr.length; i++) {\n // Lines starting with '---' could be mistaken for the \"remove line\" operation\n // But they could be the header for the next file. Therefore prune such cases out.\n if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) {\n break;\n }\n\n var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0];\n\n if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\\\') {\n hunk.lines.push(diffstr[i]);\n hunk.linedelimiters.push(delimiters[i] || '\\n');\n\n if (operation === '+') {\n addCount++;\n } else if (operation === '-') {\n removeCount++;\n } else if (operation === ' ') {\n addCount++;\n removeCount++;\n }\n } else {\n break;\n }\n } // Handle the empty block count case\n\n\n if (!addCount && hunk.newLines === 1) {\n hunk.newLines = 0;\n }\n\n if (!removeCount && hunk.oldLines === 1) {\n hunk.oldLines = 0;\n } // Perform optional sanity checking\n\n\n if (options.strict) {\n if (addCount !== hunk.newLines) {\n throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n }\n\n if (removeCount !== hunk.oldLines) {\n throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n }\n }\n\n return hunk;\n }\n\n while (i < diffstr.length) {\n parseIndex();\n }\n\n return list;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9wYXJzZS5qcyJdLCJuYW1lcyI6WyJwYXJzZVBhdGNoIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJkaWZmc3RyIiwic3BsaXQiLCJkZWxpbWl0ZXJzIiwibWF0Y2giLCJsaXN0IiwiaSIsInBhcnNlSW5kZXgiLCJpbmRleCIsInB1c2giLCJsZW5ndGgiLCJsaW5lIiwidGVzdCIsImhlYWRlciIsImV4ZWMiLCJwYXJzZUZpbGVIZWFkZXIiLCJodW5rcyIsInBhcnNlSHVuayIsInN0cmljdCIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpbGVIZWFkZXIiLCJrZXlQcmVmaXgiLCJkYXRhIiwiZmlsZU5hbWUiLCJyZXBsYWNlIiwic3Vic3RyIiwidHJpbSIsImNodW5rSGVhZGVySW5kZXgiLCJjaHVua0hlYWRlckxpbmUiLCJjaHVua0hlYWRlciIsImh1bmsiLCJvbGRTdGFydCIsIm9sZExpbmVzIiwibmV3U3RhcnQiLCJuZXdMaW5lcyIsImxpbmVzIiwibGluZWRlbGltaXRlcnMiLCJhZGRDb3VudCIsInJlbW92ZUNvdW50IiwiaW5kZXhPZiIsIm9wZXJhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQU8sU0FBU0EsVUFBVCxDQUFvQkMsT0FBcEIsRUFBMkM7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJO0FBQ2hELE1BQUlDLE9BQU8sR0FBR0YsT0FBTyxDQUFDRyxLQUFSLENBQWMscUJBQWQsQ0FBZDtBQUFBLE1BQ0lDLFVBQVUsR0FBR0osT0FBTyxDQUFDSyxLQUFSLENBQWMsc0JBQWQsS0FBeUMsRUFEMUQ7QUFBQSxNQUVJQyxJQUFJLEdBQUcsRUFGWDtBQUFBLE1BR0lDLENBQUMsR0FBRyxDQUhSOztBQUtBLFdBQVNDLFVBQVQsR0FBc0I7QUFDcEIsUUFBSUMsS0FBSyxHQUFHLEVBQVo7QUFDQUgsSUFBQUEsSUFBSSxDQUFDSSxJQUFMLENBQVVELEtBQVYsRUFGb0IsQ0FJcEI7O0FBQ0EsV0FBT0YsQ0FBQyxHQUFHTCxPQUFPLENBQUNTLE1BQW5CLEVBQTJCO0FBQ3pCLFVBQUlDLElBQUksR0FBR1YsT0FBTyxDQUFDSyxDQUFELENBQWxCLENBRHlCLENBR3pCOztBQUNBLFVBQUssdUJBQUQsQ0FBMEJNLElBQTFCLENBQStCRCxJQUEvQixDQUFKLEVBQTBDO0FBQ3hDO0FBQ0QsT0FOd0IsQ0FRekI7OztBQUNBLFVBQUlFLE1BQU0sR0FBSSwwQ0FBRCxDQUE2Q0MsSUFBN0MsQ0FBa0RILElBQWxELENBQWI7O0FBQ0EsVUFBSUUsTUFBSixFQUFZO0FBQ1ZMLFFBQUFBLEtBQUssQ0FBQ0EsS0FBTixHQUFjSyxNQUFNLENBQUMsQ0FBRCxDQUFwQjtBQUNEOztBQUVEUCxNQUFBQSxDQUFDO0FBQ0YsS0FwQm1CLENBc0JwQjtBQUNBOzs7QUFDQVMsSUFBQUEsZUFBZSxDQUFDUCxLQUFELENBQWY7QUFDQU8sSUFBQUEsZUFBZSxDQUFDUCxLQUFELENBQWYsQ0F6Qm9CLENBMkJwQjs7QUFDQUEsSUFBQUEsS0FBSyxDQUFDUSxLQUFOLEdBQWMsRUFBZDs7QUFFQSxXQUFPVixDQUFDLEdBQUdMLE9BQU8sQ0FBQ1MsTUFBbkIsRUFBMkI7QUFDekIsVUFBSUMsS0FBSSxHQUFHVixPQUFPLENBQUNLLENBQUQsQ0FBbEI7O0FBRUEsVUFBSyxnQ0FBRCxDQUFtQ00sSUFBbkMsQ0FBd0NELEtBQXhDLENBQUosRUFBbUQ7QUFDakQ7QUFDRCxPQUZELE1BRU8sSUFBSyxLQUFELENBQVFDLElBQVIsQ0FBYUQsS0FBYixDQUFKLEVBQXdCO0FBQzdCSCxRQUFBQSxLQUFLLENBQUNRLEtBQU4sQ0FBWVAsSUFBWixDQUFpQlEsU0FBUyxFQUExQjtBQUNELE9BRk0sTUFFQSxJQUFJTixLQUFJLElBQUlYLE9BQU8sQ0FBQ2tCLE1BQXBCLEVBQTRCO0FBQ2pDO0FBQ0EsY0FBTSxJQUFJQyxLQUFKLENBQVUsbUJBQW1CYixDQUFDLEdBQUcsQ0FBdkIsSUFBNEIsR0FBNUIsR0FBa0NjLElBQUksQ0FBQ0MsU0FBTCxDQUFlVixLQUFmLENBQTVDLENBQU47QUFDRCxPQUhNLE1BR0E7QUFDTEwsUUFBQUEsQ0FBQztBQUNGO0FBQ0Y7QUFDRixHQWxEK0MsQ0FvRGhEO0FBQ0E7OztBQUNBLFdBQVNTLGVBQVQsQ0FBeUJQLEtBQXpCLEVBQWdDO0FBQzlCLFFBQU1jLFVBQVUsR0FBSSx1QkFBRCxDQUEwQlIsSUFBMUIsQ0FBK0JiLE9BQU8sQ0FBQ0ssQ0FBRCxDQUF0QyxDQUFuQjs7QUFDQSxRQUFJZ0IsVUFBSixFQUFnQjtBQUNkLFVBQUlDLFNBQVMsR0FBR0QsVUFBVSxDQUFDLENBQUQsQ0FBVixLQUFrQixLQUFsQixHQUEwQixLQUExQixHQUFrQyxLQUFsRDtBQUNBLFVBQU1FLElBQUksR0FBR0YsVUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjcEIsS0FBZCxDQUFvQixJQUFwQixFQUEwQixDQUExQixDQUFiO0FBQ0EsVUFBSXVCLFFBQVEsR0FBR0QsSUFBSSxDQUFDLENBQUQsQ0FBSixDQUFRRSxPQUFSLENBQWdCLE9BQWhCLEVBQXlCLElBQXpCLENBQWY7O0FBQ0EsVUFBSyxRQUFELENBQVdkLElBQVgsQ0FBZ0JhLFFBQWhCLENBQUosRUFBK0I7QUFDN0JBLFFBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDRSxNQUFULENBQWdCLENBQWhCLEVBQW1CRixRQUFRLENBQUNmLE1BQVQsR0FBa0IsQ0FBckMsQ0FBWDtBQUNEOztBQUNERixNQUFBQSxLQUFLLENBQUNlLFNBQVMsR0FBRyxVQUFiLENBQUwsR0FBZ0NFLFFBQWhDO0FBQ0FqQixNQUFBQSxLQUFLLENBQUNlLFNBQVMsR0FBRyxRQUFiLENBQUwsR0FBOEIsQ0FBQ0MsSUFBSSxDQUFDLENBQUQsQ0FBSixJQUFXLEVBQVosRUFBZ0JJLElBQWhCLEVBQTlCO0FBRUF0QixNQUFBQSxDQUFDO0FBQ0Y7QUFDRixHQXBFK0MsQ0FzRWhEO0FBQ0E7OztBQUNBLFdBQVNXLFNBQVQsR0FBcUI7QUFDbkIsUUFBSVksZ0JBQWdCLEdBQUd2QixDQUF2QjtBQUFBLFFBQ0l3QixlQUFlLEdBQUc3QixPQUFPLENBQUNLLENBQUMsRUFBRixDQUQ3QjtBQUFBLFFBRUl5QixXQUFXLEdBQUdELGVBQWUsQ0FBQzVCLEtBQWhCLENBQXNCLDRDQUF0QixDQUZsQjtBQUlBLFFBQUk4QixJQUFJLEdBQUc7QUFDVEMsTUFBQUEsUUFBUSxFQUFFLENBQUNGLFdBQVcsQ0FBQyxDQUFELENBRGI7QUFFVEcsTUFBQUEsUUFBUSxFQUFFLE9BQU9ILFdBQVcsQ0FBQyxDQUFELENBQWxCLEtBQTBCLFdBQTFCLEdBQXdDLENBQXhDLEdBQTRDLENBQUNBLFdBQVcsQ0FBQyxDQUFELENBRnpEO0FBR1RJLE1BQUFBLFFBQVEsRUFBRSxDQUFDSixXQUFXLENBQUMsQ0FBRCxDQUhiO0FBSVRLLE1BQUFBLFFBQVEsRUFBRSxPQUFPTCxXQUFXLENBQUMsQ0FBRCxDQUFsQixLQUEwQixXQUExQixHQUF3QyxDQUF4QyxHQUE0QyxDQUFDQSxXQUFXLENBQUMsQ0FBRCxDQUp6RDtBQUtUTSxNQUFBQSxLQUFLLEVBQUUsRUFMRTtBQU1UQyxNQUFBQSxjQUFjLEVBQUU7QUFOUCxLQUFYLENBTG1CLENBY25CO0FBQ0E7QUFDQTs7QUFDQSxRQUFJTixJQUFJLENBQUNFLFFBQUwsS0FBa0IsQ0FBdEIsRUFBeUI7QUFDdkJGLE1BQUFBLElBQUksQ0FBQ0MsUUFBTCxJQUFpQixDQUFqQjtBQUNEOztBQUNELFFBQUlELElBQUksQ0FBQ0ksUUFBTCxLQUFrQixDQUF0QixFQUF5QjtBQUN2QkosTUFBQUEsSUFBSSxDQUFDRyxRQUFMLElBQWlCLENBQWpCO0FBQ0Q7O0FBRUQsUUFBSUksUUFBUSxHQUFHLENBQWY7QUFBQSxRQUNJQyxXQUFXLEdBQUcsQ0FEbEI7O0FBRUEsV0FBT2xDLENBQUMsR0FBR0wsT0FBTyxDQUFDUyxNQUFuQixFQUEyQkosQ0FBQyxFQUE1QixFQUFnQztBQUM5QjtBQUNBO0FBQ0EsVUFBSUwsT0FBTyxDQUFDSyxDQUFELENBQVAsQ0FBV21DLE9BQVgsQ0FBbUIsTUFBbkIsTUFBK0IsQ0FBL0IsSUFDTW5DLENBQUMsR0FBRyxDQUFKLEdBQVFMLE9BQU8sQ0FBQ1MsTUFEdEIsSUFFS1QsT0FBTyxDQUFDSyxDQUFDLEdBQUcsQ0FBTCxDQUFQLENBQWVtQyxPQUFmLENBQXVCLE1BQXZCLE1BQW1DLENBRnhDLElBR0t4QyxPQUFPLENBQUNLLENBQUMsR0FBRyxDQUFMLENBQVAsQ0FBZW1DLE9BQWYsQ0FBdUIsSUFBdkIsTUFBaUMsQ0FIMUMsRUFHNkM7QUFDekM7QUFDSDs7QUFDRCxVQUFJQyxTQUFTLEdBQUl6QyxPQUFPLENBQUNLLENBQUQsQ0FBUCxDQUFXSSxNQUFYLElBQXFCLENBQXJCLElBQTBCSixDQUFDLElBQUtMLE9BQU8sQ0FBQ1MsTUFBUixHQUFpQixDQUFsRCxHQUF3RCxHQUF4RCxHQUE4RFQsT0FBTyxDQUFDSyxDQUFELENBQVAsQ0FBVyxDQUFYLENBQTlFOztBQUVBLFVBQUlvQyxTQUFTLEtBQUssR0FBZCxJQUFxQkEsU0FBUyxLQUFLLEdBQW5DLElBQTBDQSxTQUFTLEtBQUssR0FBeEQsSUFBK0RBLFNBQVMsS0FBSyxJQUFqRixFQUF1RjtBQUNyRlYsUUFBQUEsSUFBSSxDQUFDSyxLQUFMLENBQVc1QixJQUFYLENBQWdCUixPQUFPLENBQUNLLENBQUQsQ0FBdkI7QUFDQTBCLFFBQUFBLElBQUksQ0FBQ00sY0FBTCxDQUFvQjdCLElBQXBCLENBQXlCTixVQUFVLENBQUNHLENBQUQsQ0FBVixJQUFpQixJQUExQzs7QUFFQSxZQUFJb0MsU0FBUyxLQUFLLEdBQWxCLEVBQXVCO0FBQ3JCSCxVQUFBQSxRQUFRO0FBQ1QsU0FGRCxNQUVPLElBQUlHLFNBQVMsS0FBSyxHQUFsQixFQUF1QjtBQUM1QkYsVUFBQUEsV0FBVztBQUNaLFNBRk0sTUFFQSxJQUFJRSxTQUFTLEtBQUssR0FBbEIsRUFBdUI7QUFDNUJILFVBQUFBLFFBQVE7QUFDUkMsVUFBQUEsV0FBVztBQUNaO0FBQ0YsT0FaRCxNQVlPO0FBQ0w7QUFDRDtBQUNGLEtBcERrQixDQXNEbkI7OztBQUNBLFFBQUksQ0FBQ0QsUUFBRCxJQUFhUCxJQUFJLENBQUNJLFFBQUwsS0FBa0IsQ0FBbkMsRUFBc0M7QUFDcENKLE1BQUFBLElBQUksQ0FBQ0ksUUFBTCxHQUFnQixDQUFoQjtBQUNEOztBQUNELFFBQUksQ0FBQ0ksV0FBRCxJQUFnQlIsSUFBSSxDQUFDRSxRQUFMLEtBQWtCLENBQXRDLEVBQXlDO0FBQ3ZDRixNQUFBQSxJQUFJLENBQUNFLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDRCxLQTVEa0IsQ0E4RG5COzs7QUFDQSxRQUFJbEMsT0FBTyxDQUFDa0IsTUFBWixFQUFvQjtBQUNsQixVQUFJcUIsUUFBUSxLQUFLUCxJQUFJLENBQUNJLFFBQXRCLEVBQWdDO0FBQzlCLGNBQU0sSUFBSWpCLEtBQUosQ0FBVSxzREFBc0RVLGdCQUFnQixHQUFHLENBQXpFLENBQVYsQ0FBTjtBQUNEOztBQUNELFVBQUlXLFdBQVcsS0FBS1IsSUFBSSxDQUFDRSxRQUF6QixFQUFtQztBQUNqQyxjQUFNLElBQUlmLEtBQUosQ0FBVSx3REFBd0RVLGdCQUFnQixHQUFHLENBQTNFLENBQVYsQ0FBTjtBQUNEO0FBQ0Y7O0FBRUQsV0FBT0csSUFBUDtBQUNEOztBQUVELFNBQU8xQixDQUFDLEdBQUdMLE9BQU8sQ0FBQ1MsTUFBbkIsRUFBMkI7QUFDekJILElBQUFBLFVBQVU7QUFDWDs7QUFFRCxTQUFPRixJQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICBsZXQgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpO1xuXG4gICAgLy8gUGFyc2UgZGlmZiBtZXRhZGF0YVxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcbiAgICAgIGlmICgoL14oXFwtXFwtXFwtfFxcK1xcK1xcK3xAQClcXHMvKS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBEaWZmIGluZGV4XG4gICAgICBsZXQgaGVhZGVyID0gKC9eKD86SW5kZXg6fGRpZmYoPzogLXIgXFx3KykrKVxccysoLis/KVxccyokLykuZXhlYyhsaW5lKTtcbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgaW5kZXguaW5kZXggPSBoZWFkZXJbMV07XG4gICAgICB9XG5cbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBmaWxlIGhlYWRlcnMgaWYgdGhleSBhcmUgZGVmaW5lZC4gVW5pZmllZCBkaWZmIHJlcXVpcmVzIHRoZW0sIGJ1dFxuICAgIC8vIHRoZXJlJ3Mgbm8gdGVjaG5pY2FsIGlzc3VlcyB0byBoYXZlIGFuIGlzb2xhdGVkIGh1bmsgd2l0aG91dCBmaWxlIGhlYWRlclxuICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7XG4gICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcblxuICAgIC8vIFBhcnNlIGh1bmtzXG4gICAgaW5kZXguaHVua3MgPSBbXTtcblxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgaWYgKCgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8pLnRlc3QobGluZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKCgvXkBALykudGVzdChsaW5lKSkge1xuICAgICAgICBpbmRleC5odW5rcy5wdXNoKHBhcnNlSHVuaygpKTtcbiAgICAgIH0gZWxzZSBpZiAobGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KGxpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQYXJzZXMgdGhlIC0tLSBhbmQgKysrIGhlYWRlcnMsIGlmIG5vbmUgYXJlIGZvdW5kLCBubyBsaW5lc1xuICAvLyBhcmUgY29uc3VtZWQuXG4gIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuICAgIGNvbnN0IGZpbGVIZWFkZXIgPSAoL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKSQvKS5leGVjKGRpZmZzdHJbaV0pO1xuICAgIGlmIChmaWxlSGVhZGVyKSB7XG4gICAgICBsZXQga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuICAgICAgY29uc3QgZGF0YSA9IGZpbGVIZWFkZXJbMl0uc3BsaXQoJ1xcdCcsIDIpO1xuICAgICAgbGV0IGZpbGVOYW1lID0gZGF0YVswXS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpO1xuICAgICAgaWYgKCgvXlwiLipcIiQvKS50ZXN0KGZpbGVOYW1lKSkge1xuICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cigxLCBmaWxlTmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIH1cbiAgICAgIGluZGV4W2tleVByZWZpeCArICdGaWxlTmFtZSddID0gZmlsZU5hbWU7XG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnSGVhZGVyJ10gPSAoZGF0YVsxXSB8fCAnJykudHJpbSgpO1xuXG4gICAgICBpKys7XG4gICAgfVxuICB9XG5cbiAgLy8gUGFyc2VzIGEgaHVua1xuICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIGEgaHVuay5cbiAgZnVuY3Rpb24gcGFyc2VIdW5rKCkge1xuICAgIGxldCBjaHVua0hlYWRlckluZGV4ID0gaSxcbiAgICAgICAgY2h1bmtIZWFkZXJMaW5lID0gZGlmZnN0cltpKytdLFxuICAgICAgICBjaHVua0hlYWRlciA9IGNodW5rSGVhZGVyTGluZS5zcGxpdCgvQEAgLShcXGQrKSg/OiwoXFxkKykpPyBcXCsoXFxkKykoPzosKFxcZCspKT8gQEAvKTtcblxuICAgIGxldCBodW5rID0ge1xuICAgICAgb2xkU3RhcnQ6ICtjaHVua0hlYWRlclsxXSxcbiAgICAgIG9sZExpbmVzOiB0eXBlb2YgY2h1bmtIZWFkZXJbMl0gPT09ICd1bmRlZmluZWQnID8gMSA6ICtjaHVua0hlYWRlclsyXSxcbiAgICAgIG5ld1N0YXJ0OiArY2h1bmtIZWFkZXJbM10sXG4gICAgICBuZXdMaW5lczogdHlwZW9mIGNodW5rSGVhZGVyWzRdID09PSAndW5kZWZpbmVkJyA/IDEgOiArY2h1bmtIZWFkZXJbNF0sXG4gICAgICBsaW5lczogW10sXG4gICAgICBsaW5lZGVsaW1pdGVyczogW11cbiAgICB9O1xuXG4gICAgLy8gVW5pZmllZCBEaWZmIEZvcm1hdCBxdWlyazogSWYgdGhlIGNodW5rIHNpemUgaXMgMCxcbiAgICAvLyB0aGUgZmlyc3QgbnVtYmVyIGlzIG9uZSBsb3dlciB0aGFuIG9uZSB3b3VsZCBleHBlY3QuXG4gICAgLy8gaHR0cHM6Ly93d3cuYXJ0aW1hLmNvbS93ZWJsb2dzL3ZpZXdwb3N0LmpzcD90aHJlYWQ9MTY0MjkzXG4gICAgaWYgKGh1bmsub2xkTGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsub2xkU3RhcnQgKz0gMTtcbiAgICB9XG4gICAgaWYgKGh1bmsubmV3TGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsubmV3U3RhcnQgKz0gMTtcbiAgICB9XG5cbiAgICBsZXQgYWRkQ291bnQgPSAwLFxuICAgICAgICByZW1vdmVDb3VudCA9IDA7XG4gICAgZm9yICg7IGkgPCBkaWZmc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBMaW5lcyBzdGFydGluZyB3aXRoICctLS0nIGNvdWxkIGJlIG1pc3Rha2VuIGZvciB0aGUgXCJyZW1vdmUgbGluZVwiIG9wZXJhdGlvblxuICAgICAgLy8gQnV0IHRoZXkgY291bGQgYmUgdGhlIGhlYWRlciBmb3IgdGhlIG5leHQgZmlsZS4gVGhlcmVmb3JlIHBydW5lIHN1Y2ggY2FzZXMgb3V0LlxuICAgICAgaWYgKGRpZmZzdHJbaV0uaW5kZXhPZignLS0tICcpID09PSAwXG4gICAgICAgICAgICAmJiAoaSArIDIgPCBkaWZmc3RyLmxlbmd0aClcbiAgICAgICAgICAgICYmIGRpZmZzdHJbaSArIDFdLmluZGV4T2YoJysrKyAnKSA9PT0gMFxuICAgICAgICAgICAgJiYgZGlmZnN0cltpICsgMl0uaW5kZXhPZignQEAnKSA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbGV0IG9wZXJhdGlvbiA9IChkaWZmc3RyW2ldLmxlbmd0aCA9PSAwICYmIGkgIT0gKGRpZmZzdHIubGVuZ3RoIC0gMSkpID8gJyAnIDogZGlmZnN0cltpXVswXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnIHx8IG9wZXJhdGlvbiA9PT0gJy0nIHx8IG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIGh1bmsubGluZXMucHVzaChkaWZmc3RyW2ldKTtcbiAgICAgICAgaHVuay5saW5lZGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcnNbaV0gfHwgJ1xcbicpO1xuXG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgICAgYWRkQ291bnQrKztcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIGVtcHR5IGJsb2NrIGNvdW50IGNhc2VcbiAgICBpZiAoIWFkZENvdW50ICYmIGh1bmsubmV3TGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsubmV3TGluZXMgPSAwO1xuICAgIH1cbiAgICBpZiAoIXJlbW92ZUNvdW50ICYmIGh1bmsub2xkTGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsub2xkTGluZXMgPSAwO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gb3B0aW9uYWwgc2FuaXR5IGNoZWNraW5nXG4gICAgaWYgKG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZGRlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlQ291bnQgIT09IGh1bmsub2xkTGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW1vdmVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaHVuaztcbiAgfVxuXG4gIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICBwYXJzZUluZGV4KCk7XG4gIH1cblxuICByZXR1cm4gbGlzdDtcbn1cbiJdfQ==\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.arrayEqual = arrayEqual;\nexports.arrayStartsWith = arrayStartsWith;\n\n/*istanbul ignore end*/\nfunction arrayEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n\n return arrayStartsWith(a, b);\n}\n\nfunction arrayStartsWith(array, start) {\n if (start.length > array.length) {\n return false;\n }\n\n for (var i = 0; i < start.length; i++) {\n if (start[i] !== array[i]) {\n return false;\n }\n }\n\n return true;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2FycmF5LmpzIl0sIm5hbWVzIjpbImFycmF5RXF1YWwiLCJhIiwiYiIsImxlbmd0aCIsImFycmF5U3RhcnRzV2l0aCIsImFycmF5Iiwic3RhcnQiLCJpIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQU8sU0FBU0EsVUFBVCxDQUFvQkMsQ0FBcEIsRUFBdUJDLENBQXZCLEVBQTBCO0FBQy9CLE1BQUlELENBQUMsQ0FBQ0UsTUFBRixLQUFhRCxDQUFDLENBQUNDLE1BQW5CLEVBQTJCO0FBQ3pCLFdBQU8sS0FBUDtBQUNEOztBQUVELFNBQU9DLGVBQWUsQ0FBQ0gsQ0FBRCxFQUFJQyxDQUFKLENBQXRCO0FBQ0Q7O0FBRU0sU0FBU0UsZUFBVCxDQUF5QkMsS0FBekIsRUFBZ0NDLEtBQWhDLEVBQXVDO0FBQzVDLE1BQUlBLEtBQUssQ0FBQ0gsTUFBTixHQUFlRSxLQUFLLENBQUNGLE1BQXpCLEVBQWlDO0FBQy9CLFdBQU8sS0FBUDtBQUNEOztBQUVELE9BQUssSUFBSUksQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0QsS0FBSyxDQUFDSCxNQUExQixFQUFrQ0ksQ0FBQyxFQUFuQyxFQUF1QztBQUNyQyxRQUFJRCxLQUFLLENBQUNDLENBQUQsQ0FBTCxLQUFhRixLQUFLLENBQUNFLENBQUQsQ0FBdEIsRUFBMkI7QUFDekIsYUFBTyxLQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPLElBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBhcnJheUVxdWFsKGEsIGIpIHtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBhcnJheVN0YXJ0c1dpdGgoYSwgYik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVN0YXJ0c1dpdGgoYXJyYXksIHN0YXJ0KSB7XG4gIGlmIChzdGFydC5sZW5ndGggPiBhcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXJ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0YXJ0W2ldICE9PSBhcnJheVtpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIl19\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = _default;\n\n/*istanbul ignore end*/\n// Iterator that traverses in the range of [min, max], stepping\n// by distance from a given start position. I.e. for [0, 4], with\n// start of 2, this will iterate 2, 3, 1, 4, 0.\nfunction\n/*istanbul ignore start*/\n_default\n/*istanbul ignore end*/\n(start, minLine, maxLine) {\n var wantForward = true,\n backwardExhausted = false,\n forwardExhausted = false,\n localOffset = 1;\n return function iterator() {\n if (wantForward && !forwardExhausted) {\n if (backwardExhausted) {\n localOffset++;\n } else {\n wantForward = false;\n } // Check if trying to fit beyond text length, and if not, check it fits\n // after offset location (or desired location on first iteration)\n\n\n if (start + localOffset <= maxLine) {\n return localOffset;\n }\n\n forwardExhausted = true;\n }\n\n if (!backwardExhausted) {\n if (!forwardExhausted) {\n wantForward = true;\n } // Check if trying to fit before text beginning, and if not, check it fits\n // before offset location\n\n\n if (minLine <= start - localOffset) {\n return -localOffset++;\n }\n\n backwardExhausted = true;\n return iterator();\n } // We tried to fit hunk before text beginning and beyond text length, then\n // hunk can't fit on the text. Return undefined\n\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yLmpzIl0sIm5hbWVzIjpbInN0YXJ0IiwibWluTGluZSIsIm1heExpbmUiLCJ3YW50Rm9yd2FyZCIsImJhY2t3YXJkRXhoYXVzdGVkIiwiZm9yd2FyZEV4aGF1c3RlZCIsImxvY2FsT2Zmc2V0IiwiaXRlcmF0b3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNlO0FBQUE7QUFBQTtBQUFBO0FBQUEsQ0FBU0EsS0FBVCxFQUFnQkMsT0FBaEIsRUFBeUJDLE9BQXpCLEVBQWtDO0FBQy9DLE1BQUlDLFdBQVcsR0FBRyxJQUFsQjtBQUFBLE1BQ0lDLGlCQUFpQixHQUFHLEtBRHhCO0FBQUEsTUFFSUMsZ0JBQWdCLEdBQUcsS0FGdkI7QUFBQSxNQUdJQyxXQUFXLEdBQUcsQ0FIbEI7QUFLQSxTQUFPLFNBQVNDLFFBQVQsR0FBb0I7QUFDekIsUUFBSUosV0FBVyxJQUFJLENBQUNFLGdCQUFwQixFQUFzQztBQUNwQyxVQUFJRCxpQkFBSixFQUF1QjtBQUNyQkUsUUFBQUEsV0FBVztBQUNaLE9BRkQsTUFFTztBQUNMSCxRQUFBQSxXQUFXLEdBQUcsS0FBZDtBQUNELE9BTG1DLENBT3BDO0FBQ0E7OztBQUNBLFVBQUlILEtBQUssR0FBR00sV0FBUixJQUF1QkosT0FBM0IsRUFBb0M7QUFDbEMsZUFBT0ksV0FBUDtBQUNEOztBQUVERCxNQUFBQSxnQkFBZ0IsR0FBRyxJQUFuQjtBQUNEOztBQUVELFFBQUksQ0FBQ0QsaUJBQUwsRUFBd0I7QUFDdEIsVUFBSSxDQUFDQyxnQkFBTCxFQUF1QjtBQUNyQkYsUUFBQUEsV0FBVyxHQUFHLElBQWQ7QUFDRCxPQUhxQixDQUt0QjtBQUNBOzs7QUFDQSxVQUFJRixPQUFPLElBQUlELEtBQUssR0FBR00sV0FBdkIsRUFBb0M7QUFDbEMsZUFBTyxDQUFDQSxXQUFXLEVBQW5CO0FBQ0Q7O0FBRURGLE1BQUFBLGlCQUFpQixHQUFHLElBQXBCO0FBQ0EsYUFBT0csUUFBUSxFQUFmO0FBQ0QsS0E5QndCLENBZ0N6QjtBQUNBOztBQUNELEdBbENEO0FBbUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSXRlcmF0b3IgdGhhdCB0cmF2ZXJzZXMgaW4gdGhlIHJhbmdlIG9mIFttaW4sIG1heF0sIHN0ZXBwaW5nXG4vLyBieSBkaXN0YW5jZSBmcm9tIGEgZ2l2ZW4gc3RhcnQgcG9zaXRpb24uIEkuZS4gZm9yIFswLCA0XSwgd2l0aFxuLy8gc3RhcnQgb2YgMiwgdGhpcyB3aWxsIGl0ZXJhdGUgMiwgMywgMSwgNCwgMC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0YXJ0LCBtaW5MaW5lLCBtYXhMaW5lKSB7XG4gIGxldCB3YW50Rm9yd2FyZCA9IHRydWUsXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgbG9jYWxPZmZzZXQgPSAxO1xuXG4gIHJldHVybiBmdW5jdGlvbiBpdGVyYXRvcigpIHtcbiAgICBpZiAod2FudEZvcndhcmQgJiYgIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgIGlmIChiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICBsb2NhbE9mZnNldCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FudEZvcndhcmQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZXlvbmQgdGV4dCBsZW5ndGgsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgIC8vIGFmdGVyIG9mZnNldCBsb2NhdGlvbiAob3IgZGVzaXJlZCBsb2NhdGlvbiBvbiBmaXJzdCBpdGVyYXRpb24pXG4gICAgICBpZiAoc3RhcnQgKyBsb2NhbE9mZnNldCA8PSBtYXhMaW5lKSB7XG4gICAgICAgIHJldHVybiBsb2NhbE9mZnNldDtcbiAgICAgIH1cblxuICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgaWYgKCFmb3J3YXJkRXhoYXVzdGVkKSB7XG4gICAgICAgIHdhbnRGb3J3YXJkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZWZvcmUgdGV4dCBiZWdpbm5pbmcsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgIC8vIGJlZm9yZSBvZmZzZXQgbG9jYXRpb25cbiAgICAgIGlmIChtaW5MaW5lIDw9IHN0YXJ0IC0gbG9jYWxPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIC1sb2NhbE9mZnNldCsrO1xuICAgICAgfVxuXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgICByZXR1cm4gaXRlcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBXZSB0cmllZCB0byBmaXQgaHVuayBiZWZvcmUgdGV4dCBiZWdpbm5pbmcgYW5kIGJleW9uZCB0ZXh0IGxlbmd0aCwgdGhlblxuICAgIC8vIGh1bmsgY2FuJ3QgZml0IG9uIHRoZSB0ZXh0LiBSZXR1cm4gdW5kZWZpbmVkXG4gIH07XG59XG4iXX0=\n","/*istanbul ignore start*/\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.generateOptions = generateOptions;\n\n/*istanbul ignore end*/\nfunction generateOptions(options, defaults) {\n if (typeof options === 'function') {\n defaults.callback = options;\n } else if (options) {\n for (var name in options) {\n /* istanbul ignore else */\n if (options.hasOwnProperty(name)) {\n defaults[name] = options[name];\n }\n }\n }\n\n return defaults;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3BhcmFtcy5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZU9wdGlvbnMiLCJvcHRpb25zIiwiZGVmYXVsdHMiLCJjYWxsYmFjayIsIm5hbWUiLCJoYXNPd25Qcm9wZXJ0eSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQU8sU0FBU0EsZUFBVCxDQUF5QkMsT0FBekIsRUFBa0NDLFFBQWxDLEVBQTRDO0FBQ2pELE1BQUksT0FBT0QsT0FBUCxLQUFtQixVQUF2QixFQUFtQztBQUNqQ0MsSUFBQUEsUUFBUSxDQUFDQyxRQUFULEdBQW9CRixPQUFwQjtBQUNELEdBRkQsTUFFTyxJQUFJQSxPQUFKLEVBQWE7QUFDbEIsU0FBSyxJQUFJRyxJQUFULElBQWlCSCxPQUFqQixFQUEwQjtBQUN4QjtBQUNBLFVBQUlBLE9BQU8sQ0FBQ0ksY0FBUixDQUF1QkQsSUFBdkIsQ0FBSixFQUFrQztBQUNoQ0YsUUFBQUEsUUFBUSxDQUFDRSxJQUFELENBQVIsR0FBaUJILE9BQU8sQ0FBQ0csSUFBRCxDQUF4QjtBQUNEO0FBQ0Y7QUFDRjs7QUFDRCxTQUFPRixRQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRlZmF1bHRzLmNhbGxiYWNrID0gb3B0aW9ucztcbiAgfSBlbHNlIGlmIChvcHRpb25zKSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBvcHRpb25zKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgZGVmYXVsdHNbbmFtZV0gPSBvcHRpb25zW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVmYXVsdHM7XG59XG4iXX0=\n","\"use strict\";\n\nmodule.exports = function () {\n // https://mths.be/emoji\n return /\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g;\n};\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","'use strict';\n\nconst validator = require('./validator');\nconst XMLParser = require('./xmlparser/XMLParser');\nconst XMLBuilder = require('./xmlbuilder/json2xml');\n\nmodule.exports = {\n XMLParser: XMLParser,\n XMLValidator: validator,\n XMLBuilder: XMLBuilder\n}","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nconst nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*'\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nconst getAllMatches = function(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n};\n\nconst isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n};\n\nexports.isExist = function(v) {\n return typeof v !== 'undefined';\n};\n\nexports.isEmptyObject = function(obj) {\n return Object.keys(obj).length === 0;\n};\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexports.merge = function(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a); // will return an array of own properties\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n if (arrayMode === 'strict') {\n target[keys[i]] = [ a[keys[i]] ];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n};\n/* exports.merge =function (b,a){\n return Object.assign(b,a);\n} */\n\nexports.getValue = function(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n};\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};\n\nexports.isName = isName;\nexports.getAllMatches = getAllMatches;\nexports.nameRegexp = nameRegexp;\n","'use strict';\n\nconst util = require('./util');\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexports.validate = function (xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n \n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n i+=2;\n i = readPI(xmlData,i);\n if (i.err) return i;\n }else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n \n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if(options.unpairedTags.indexOf(tagName) !== -1){\n //don't push into stack\n } else {\n tags.push({tagName, tagStartPos});\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i+1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else{\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n }else{\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if ( isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n }else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n }else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\"+\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n \"' found.\", {line: 1, col: 1});\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char){\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = util.getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return util.isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return util.isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","'use strict';\n//parse Empty Node as self closing node\nconst buildFromOrderedJs = require('./orderedJs2Xml');\n\nconst defaultOptions = {\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: ' ',\n suppressEmptyNode: false,\n suppressUnpairedNode: true,\n suppressBooleanAttributes: true,\n tagValueProcessor: function(key, a) {\n return a;\n },\n attributeValueProcessor: function(attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: [\n { regex: new RegExp(\"&\", \"g\"), val: \"&\" },//it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \">\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"<\" },\n { regex: new RegExp(\"\\'\", \"g\"), val: \"'\" },\n { regex: new RegExp(\"\\\"\", \"g\"), val: \""\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false\n};\n\nfunction Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n if (this.options.ignoreAttributes || this.options.attributesGroupName) {\n this.isAttribute = function(/*a*/) {\n return false;\n };\n } else {\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n\n this.processTextOrObjNode = processTextOrObjNode\n\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = '>\\n';\n this.newLine = '\\n';\n } else {\n this.indentate = function() {\n return '';\n };\n this.tagEndChar = '>';\n this.newLine = '';\n }\n}\n\nBuilder.prototype.build = function(jObj) {\n if(this.options.preserveOrder){\n return buildFromOrderedJs(jObj, this.options);\n }else {\n if(Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1){\n jObj = {\n [this.options.arrayNodeName] : jObj\n }\n }\n return this.j2x(jObj, 0).val;\n }\n};\n\nBuilder.prototype.j2x = function(jObj, level) {\n let attrStr = '';\n let val = '';\n for (let key in jObj) {\n if (typeof jObj[key] === 'undefined') {\n // supress undefined node\n } else if (jObj[key] === null) {\n if(key[0] === \"?\") val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n else val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (jObj[key] instanceof Date) {\n val += this.buildTextValNode(jObj[key], key, '', level);\n } else if (typeof jObj[key] !== 'object') {\n //premitive type\n const attr = this.isAttribute(key);\n if (attr) {\n attrStr += this.buildAttrPairStr(attr, '' + jObj[key]);\n }else {\n //tag value\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, '' + jObj[key]);\n val += this.replaceEntitiesValue(newval);\n } else {\n val += this.buildTextValNode(jObj[key], key, '', level);\n }\n }\n } else if (Array.isArray(jObj[key])) {\n //repeated nodes\n const arrLen = jObj[key].length;\n let listTagVal = \"\";\n for (let j = 0; j < arrLen; j++) {\n const item = jObj[key][j];\n if (typeof item === 'undefined') {\n // supress undefined node\n } else if (item === null) {\n if(key[0] === \"?\") val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n else val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (typeof item === 'object') {\n if(this.options.oneListGroup ){\n listTagVal += this.j2x(item, level + 1).val;\n }else{\n listTagVal += this.processTextOrObjNode(item, key, level)\n }\n } else {\n listTagVal += this.buildTextValNode(item, key, '', level);\n }\n }\n if(this.options.oneListGroup){\n listTagVal = this.buildObjectNode(listTagVal, key, '', level);\n }\n val += listTagVal;\n } else {\n //nested node\n if (this.options.attributesGroupName && key === this.options.attributesGroupName) {\n const Ks = Object.keys(jObj[key]);\n const L = Ks.length;\n for (let j = 0; j < L; j++) {\n attrStr += this.buildAttrPairStr(Ks[j], '' + jObj[key][Ks[j]]);\n }\n } else {\n val += this.processTextOrObjNode(jObj[key], key, level)\n }\n }\n }\n return {attrStr: attrStr, val: val};\n};\n\nBuilder.prototype.buildAttrPairStr = function(attrName, val){\n val = this.options.attributeValueProcessor(attrName, '' + val);\n val = this.replaceEntitiesValue(val);\n if (this.options.suppressBooleanAttributes && val === \"true\") {\n return ' ' + attrName;\n } else return ' ' + attrName + '=\"' + val + '\"';\n}\n\nfunction processTextOrObjNode (object, key, level) {\n const result = this.j2x(object, level + 1);\n if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) {\n return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level);\n } else {\n return this.buildObjectNode(result.val, key, result.attrStr, level);\n }\n}\n\nBuilder.prototype.buildObjectNode = function(val, key, attrStr, level) {\n if(val === \"\"){\n if(key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar;\n else {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n }else{\n\n let tagEndExp = '' + val + tagEndExp );\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `` + this.newLine;\n }else {\n return (\n this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar +\n val +\n this.indentate(level) + tagEndExp );\n }\n }\n}\n\nBuilder.prototype.closeTag = function(key){\n let closeTag = \"\";\n if(this.options.unpairedTags.indexOf(key) !== -1){ //unpaired\n if(!this.options.suppressUnpairedNode) closeTag = \"/\"\n }else if(this.options.suppressEmptyNode){ //empty\n closeTag = \"/\";\n }else{\n closeTag = `>` + this.newLine;\n }else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `` + this.newLine;\n }else if(key[0] === \"?\") {//PI tag\n return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar; \n }else{\n let textValue = this.options.tagValueProcessor(key, val);\n textValue = this.replaceEntitiesValue(textValue);\n \n if( textValue === ''){\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }else{\n return this.indentate(level) + '<' + key + attrStr + '>' +\n textValue +\n ' 0 && this.options.processEntities){\n for (let i=0; i 0) {\n indentation = EOL;\n }\n return arrToStr(jArray, options, \"\", indentation);\n}\n\nfunction arrToStr(arr, options, jPath, indentation) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n let newJPath = \"\";\n if (jPath.length === 0) newJPath = tagName\n else newJPath = `${jPath}.${tagName}`;\n\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode(newJPath, options)) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += ``;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + ``;\n isPreviousElementTag = true;\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\"; //remove extra spacing\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr}?>`;\n isPreviousElementTag = true;\n continue;\n }\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tagStart = indentation + `<${tagName}${attStr}`;\n const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation);\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n else xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"`;\n }\n isPreviousElementTag = true;\n }\n\n return xmlStr;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \":@\") return key;\n }\n}\n\nfunction attr_to_str(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n let attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\n\nfunction isStopNode(jPath, options) {\n jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1);\n let tagName = jPath.substr(jPath.lastIndexOf(\".\") + 1);\n for (let index in options.stopNodes) {\n if (options.stopNodes[index] === jPath || options.stopNodes[index] === \"*.\" + tagName) return true;\n }\n return false;\n}\n\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\nmodule.exports = toXml;\n","const util = require('../util');\n\n//TODO: handle comments\nfunction readDocType(xmlData, i){\n \n const entities = {};\n if( xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E')\n { \n i = i+9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for(;i') { //Read tag content\n if(comment){\n if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n comment = false;\n angleBracketsCount--;\n }\n }else{\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n }else if( xmlData[i] === '['){\n hasBody = true;\n }else{\n exp += xmlData[i];\n }\n }\n if(angleBracketsCount !== 0){\n throw new Error(`Unclosed DOCTYPE`);\n }\n }else{\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return {entities, i};\n}\n\nfunction readEntityExp(xmlData,i){\n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n \n //read EntityName\n let entityName = \"\";\n for (; i < xmlData.length && (xmlData[i] !== \"'\" && xmlData[i] !== '\"' ); i++) {\n // if(xmlData[i] === \" \") continue;\n // else \n entityName += xmlData[i];\n }\n entityName = entityName.trim();\n if(entityName.indexOf(\" \") !== -1) throw new Error(\"External entites are not supported\");\n\n //read Entity Value\n const startChar = xmlData[i++];\n let val = \"\"\n for (; i < xmlData.length && xmlData[i] !== startChar ; i++) {\n val += xmlData[i];\n }\n return [entityName, val, i];\n}\n\nfunction isComment(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === '-' &&\n xmlData[i+3] === '-') return true\n return false\n}\nfunction isEntity(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'E' &&\n xmlData[i+3] === 'N' &&\n xmlData[i+4] === 'T' &&\n xmlData[i+5] === 'I' &&\n xmlData[i+6] === 'T' &&\n xmlData[i+7] === 'Y') return true\n return false\n}\nfunction isElement(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'E' &&\n xmlData[i+3] === 'L' &&\n xmlData[i+4] === 'E' &&\n xmlData[i+5] === 'M' &&\n xmlData[i+6] === 'E' &&\n xmlData[i+7] === 'N' &&\n xmlData[i+8] === 'T') return true\n return false\n}\n\nfunction isAttlist(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'A' &&\n xmlData[i+3] === 'T' &&\n xmlData[i+4] === 'T' &&\n xmlData[i+5] === 'L' &&\n xmlData[i+6] === 'I' &&\n xmlData[i+7] === 'S' &&\n xmlData[i+8] === 'T') return true\n return false\n}\nfunction isNotation(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'N' &&\n xmlData[i+3] === 'O' &&\n xmlData[i+4] === 'T' &&\n xmlData[i+5] === 'A' &&\n xmlData[i+6] === 'T' &&\n xmlData[i+7] === 'I' &&\n xmlData[i+8] === 'O' &&\n xmlData[i+9] === 'N') return true\n return false\n}\n\nfunction validateEntityName(name){\n if (util.isName(name))\n\treturn name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}\n\nmodule.exports = readDocType;\n","\nconst defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function(tagName, val) {\n return val;\n },\n attributeValueProcessor: function(attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function(tagName, jPath, attrs){\n return tagName\n },\n // skipEmptyListItem: false\n};\n \nconst buildOptions = function(options) {\n return Object.assign({}, defaultOptions, options);\n};\n\nexports.buildOptions = buildOptions;\nexports.defaultOptions = defaultOptions;","'use strict';\n///@ts-check\n\nconst util = require('../util');\nconst xmlNode = require('./xmlNode');\nconst readDocType = require(\"./DocTypeReader\");\nconst toNumber = require(\"strnum\");\n\nconst regx =\n '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nclass OrderedObjParser{\n constructor(options){\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n };\n this.ampEntity = { regex: /&(amp|#38|#x26);/g, val : \"&\"};\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n }\n\n}\n\nfunction addExternalEntities(externalEntities){\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\"+ent+\";\",\"g\"),\n val : externalEntities[ent]\n }\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if(val.length > 0){\n if(!escapeEntities) val = this.replaceEntitiesValue(val);\n \n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if(newval === null || newval === undefined){\n //don't parse\n return val;\n }else if(typeof newval !== typeof val || newval !== val){\n //overwrite\n return newval;\n }else if(this.options.trimValues){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n const trimmedVal = val.trim();\n if(trimmedVal === val){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else{\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath, tagName) {\n if (!this.options.ignoreAttributes && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = util.getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if(aName === \"__proto__\") aName = \"#__proto__\";\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if(newVal === null || newVal === undefined){\n //don't parse\n attrs[aName] = oldVal;\n }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n //overwrite\n attrs[aName] = newVal;\n }else{\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs\n }\n}\n\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n for(let i=0; i< xmlData.length; i++){//for each char in XML data\n const ch = xmlData[i];\n if(ch === '<'){\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if( xmlData[i+1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n if(this.options.removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n }\n }\n\n if(this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if(currentNode){\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = jPath.substring(jPath.lastIndexOf(\".\")+1);\n if(tagName && this.options.unpairedTags.indexOf(tagName) !== -1 ){\n throw new Error(`Unpaired tag can not be used as closing tag: `);\n }\n let propIndex = 0\n if(lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1 ){\n propIndex = jPath.lastIndexOf('.', jPath.lastIndexOf('.')-1)\n this.tagsNodeStack.pop();\n }else{\n propIndex = jPath.lastIndexOf(\".\");\n }\n jPath = jPath.substring(0, propIndex);\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if( xmlData[i+1] === '?') {\n\n let tagData = readTagExp(xmlData,i, false, \"?>\");\n if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n if( (this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags){\n\n }else{\n \n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n \n if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath, tagData.tagName);\n }\n this.addChild(currentNode, childNode, jPath)\n\n }\n\n\n i = tagData.closeIndex + 1;\n } else if(xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i+4, \"Comment is not closed.\")\n if(this.options.commentPropName){\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n }\n i = endIndex;\n } else if( xmlData.substr(i + 1, 2) === '!D') {\n const result = readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n }else if(xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9,closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n //cdata should be set even if it is 0 length string\n if(this.options.cdataPropName){\n // let val = this.parseTextData(tagExp, this.options.cdataPropName, jPath + \".\" + this.options.cdataPropName, true, false, true);\n // if(!val) val = \"\";\n currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n }else{\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true);\n if(val == undefined) val = \"\";\n currentNode.add(this.options.textNodeName, val);\n }\n \n i = closeIndex + 2;\n }else {//Opening tag\n let result = readTagExp(xmlData,i, this.options.removeNSPrefix);\n let tagName= result.tagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n \n //save text as child node\n if (currentNode && textData) {\n if(currentNode.tagname !== '!xml'){\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n currentNode = this.tagsNodeStack.pop();\n jPath = jPath.substring(0, jPath.lastIndexOf(\".\"));\n }\n if(tagName !== xmlObj.tagname){\n jPath += jPath ? \".\" + tagName : tagName;\n }\n if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { //TODO: namespace\n let tagContent = \"\";\n //self-closing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n i = result.closeIndex;\n }\n //unpaired tag\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){\n i = result.closeIndex;\n }\n //normal tag\n else{\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, tagName, closeIndex + 1);\n if(!result) throw new Error(`Unexpected end of ${tagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n if(tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n \n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n \n this.addChild(currentNode, childNode, jPath)\n }else{\n //selfClosing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n }else{\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n \n if(this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath)\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n }\n //opening tag\n else{\n const childNode = new xmlNode( tagName);\n this.tagsNodeStack.push(currentNode);\n \n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath)\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n }else{\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, jPath){\n const result = this.options.updateTag(childNode.tagname, jPath, childNode[\":@\"])\n if(result === false){\n }else if(typeof result === \"string\"){\n childNode.tagname = result\n currentNode.addChild(childNode);\n }else{\n currentNode.addChild(childNode);\n }\n}\n\nconst replaceEntitiesValue = function(val){\n\n if(this.options.processEntities){\n for(let entityName in this.docTypeEntities){\n const entity = this.docTypeEntities[entityName];\n val = val.replace( entity.regx, entity.val);\n }\n for(let entityName in this.lastEntities){\n const entity = this.lastEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n if(this.options.htmlEntities){\n for(let entityName in this.htmlEntities){\n const entity = this.htmlEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n }\n val = val.replace( this.ampEntity.regex, this.ampEntity.val);\n }\n return val;\n}\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if(isLeafNode === undefined) isLeafNode = Object.keys(currentNode.child).length === 0\n \n textData = this.parseTextData(textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * \n * @param {string[]} stopNodes \n * @param {string} jPath\n * @param {string} currentTagName \n */\nfunction isItStopNode(stopNodes, jPath, currentTagName){\n const allNodesExp = \"*.\" + currentTagName;\n for (const stopNodePath in stopNodes) {\n const stopNodeExp = stopNodes[stopNodePath];\n if( allNodesExp === stopNodeExp || jPath === stopNodeExp ) return true;\n }\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if(closingChar[1]){\n if(xmlData[index + 1] === closingChar[1]){\n return {\n data: tagExp,\n index: index\n }\n }\n }else{\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \"\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n const closingIndex = xmlData.indexOf(str, i);\n if(closingIndex === -1){\n throw new Error(errMsg)\n }else{\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n if(!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if(separatorIndex !== -1){//separate tag name and attributes expression\n tagName = tagExp.substr(0, separatorIndex).replace(/\\s\\s*$/, '');\n tagExp = tagExp.substr(separatorIndex + 1);\n }\n\n if(removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if( xmlData[i] === \"<\"){ \n if (xmlData[i+1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n if(closeTagName === tagName){\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i : closeIndex\n }\n }\n }\n i=closeIndex;\n } else if(xmlData[i+1] === '?') { \n const closeIndex = findClosingIndex(xmlData, \"?>\", i+1, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 3) === '!--') { \n const closeIndex = findClosingIndex(xmlData, \"-->\", i+3, \"StopNode is not closed.\")\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 2) === '![') { \n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i=closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length-1] !== \"/\") {\n openTagCount++;\n }\n i=tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if(newval === 'true' ) return true;\n else if(newval === 'false' ) return false;\n else return toNumber(val, options);\n } else {\n if (util.isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\n\nmodule.exports = OrderedObjParser;\n","const { buildOptions} = require(\"./OptionsBuilder\");\nconst OrderedObjParser = require(\"./OrderedObjParser\");\nconst { prettify} = require(\"./node2json\");\nconst validator = require('../validator');\n\nclass XMLParser{\n \n constructor(options){\n this.externalEntities = {};\n this.options = buildOptions(options);\n \n }\n /**\n * Parse XML dats to JS object \n * @param {string|Buffer} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData,validationOption){\n if(typeof xmlData === \"string\"){\n }else if( xmlData.toString){\n xmlData = xmlData.toString();\n }else{\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n if( validationOption){\n if(validationOption === true) validationOption = {}; //validate with default options\n \n const result = validator.validate(xmlData, validationOption);\n if (result !== true) {\n throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value){\n if(value.indexOf(\"&\") !== -1){\n throw new Error(\"Entity value can't have '&'\")\n }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for ' '\")\n }else if(value === \"&\"){\n throw new Error(\"An entity with value '&' is not permitted\");\n }else{\n this.externalEntities[key] = value;\n }\n }\n}\n\nmodule.exports = XMLParser;","'use strict';\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nfunction prettify(node, options){\n return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n let newJpath = \"\";\n if(jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if(property === options.textNodeName){\n if(text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n }else if(property === undefined){\n continue;\n }else if(tagObj[property]){\n \n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n\n if(tagObj[\":@\"]){\n assignAttributes( val, tagObj[\":@\"], newJpath, options);\n }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n val = val[options.textNodeName];\n }else if(Object.keys(val).length === 0){\n if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if(compressedObj[property] !== undefined && compressedObj.hasOwnProperty(property)) {\n if(!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [ compressedObj[property] ];\n }\n compressedObj[property].push(val);\n }else{\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf )) {\n compressedObj[property] = [val];\n }else{\n compressedObj[property] = val;\n }\n }\n }\n \n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if(typeof text === \"string\"){\n if(text.length > 0) compressedObj[options.textNodeName] = text;\n }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\n\nfunction propName(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [ attrMap[atrrName] ];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options){\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n \n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}\nexports.prettify = prettify;\n","'use strict';\n\nclass XmlNode{\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = {}; //attributes map\n }\n add(key,val){\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if(key === \"__proto__\") key = \"#__proto__\";\n this.child.push( {[key]: val });\n }\n addChild(node) {\n if(node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n }else{\n this.child.push( { [node.tagname]: node.child });\n }\n };\n};\n\n\nmodule.exports = XmlNode;","'use strict'\n\nconst fs = require('graceful-fs')\nconst path = require('path')\nconst mkdirsSync = require('../mkdirs').mkdirsSync\nconst utimesMillisSync = require('../util/utimes').utimesMillisSync\nconst stat = require('../util/stat')\n\nfunction copySync (src, dest, opts) {\n if (typeof opts === 'function') {\n opts = { filter: opts }\n }\n\n opts = opts || {}\n opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now\n opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber\n\n // Warn about using preserveTimestamps on 32-bit node\n if (opts.preserveTimestamps && process.arch === 'ia32') {\n process.emitWarning(\n 'Using the preserveTimestamps option in 32-bit node is not recommended;\\n\\n' +\n '\\tsee https://github.com/jprichardson/node-fs-extra/issues/269',\n 'Warning', 'fs-extra-WARN0002'\n )\n }\n\n const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy', opts)\n stat.checkParentPathsSync(src, srcStat, dest, 'copy')\n if (opts.filter && !opts.filter(src, dest)) return\n const destParent = path.dirname(dest)\n if (!fs.existsSync(destParent)) mkdirsSync(destParent)\n return getStats(destStat, src, dest, opts)\n}\n\nfunction getStats (destStat, src, dest, opts) {\n const statSync = opts.dereference ? fs.statSync : fs.lstatSync\n const srcStat = statSync(src)\n\n if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)\n else if (srcStat.isFile() ||\n srcStat.isCharacterDevice() ||\n srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)\n else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)\n else if (srcStat.isSocket()) throw new Error(`Cannot copy a socket file: ${src}`)\n else if (srcStat.isFIFO()) throw new Error(`Cannot copy a FIFO pipe: ${src}`)\n throw new Error(`Unknown file: ${src}`)\n}\n\nfunction onFile (srcStat, destStat, src, dest, opts) {\n if (!destStat) return copyFile(srcStat, src, dest, opts)\n return mayCopyFile(srcStat, src, dest, opts)\n}\n\nfunction mayCopyFile (srcStat, src, dest, opts) {\n if (opts.overwrite) {\n fs.unlinkSync(dest)\n return copyFile(srcStat, src, dest, opts)\n } else if (opts.errorOnExist) {\n throw new Error(`'${dest}' already exists`)\n }\n}\n\nfunction copyFile (srcStat, src, dest, opts) {\n fs.copyFileSync(src, dest)\n if (opts.preserveTimestamps) handleTimestamps(srcStat.mode, src, dest)\n return setDestMode(dest, srcStat.mode)\n}\n\nfunction handleTimestamps (srcMode, src, dest) {\n // Make sure the file is writable before setting the timestamp\n // otherwise open fails with EPERM when invoked with 'r+'\n // (through utimes call)\n if (fileIsNotWritable(srcMode)) makeFileWritable(dest, srcMode)\n return setDestTimestamps(src, dest)\n}\n\nfunction fileIsNotWritable (srcMode) {\n return (srcMode & 0o200) === 0\n}\n\nfunction makeFileWritable (dest, srcMode) {\n return setDestMode(dest, srcMode | 0o200)\n}\n\nfunction setDestMode (dest, srcMode) {\n return fs.chmodSync(dest, srcMode)\n}\n\nfunction setDestTimestamps (src, dest) {\n // The initial srcStat.atime cannot be trusted\n // because it is modified by the read(2) system call\n // (See https://nodejs.org/api/fs.html#fs_stat_time_values)\n const updatedSrcStat = fs.statSync(src)\n return utimesMillisSync(dest, updatedSrcStat.atime, updatedSrcStat.mtime)\n}\n\nfunction onDir (srcStat, destStat, src, dest, opts) {\n if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts)\n return copyDir(src, dest, opts)\n}\n\nfunction mkDirAndCopy (srcMode, src, dest, opts) {\n fs.mkdirSync(dest)\n copyDir(src, dest, opts)\n return setDestMode(dest, srcMode)\n}\n\nfunction copyDir (src, dest, opts) {\n fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))\n}\n\nfunction copyDirItem (item, src, dest, opts) {\n const srcItem = path.join(src, item)\n const destItem = path.join(dest, item)\n if (opts.filter && !opts.filter(srcItem, destItem)) return\n const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy', opts)\n return getStats(destStat, srcItem, destItem, opts)\n}\n\nfunction onLink (destStat, src, dest, opts) {\n let resolvedSrc = fs.readlinkSync(src)\n if (opts.dereference) {\n resolvedSrc = path.resolve(process.cwd(), resolvedSrc)\n }\n\n if (!destStat) {\n return fs.symlinkSync(resolvedSrc, dest)\n } else {\n let resolvedDest\n try {\n resolvedDest = fs.readlinkSync(dest)\n } catch (err) {\n // dest exists and is a regular file or directory,\n // Windows may throw UNKNOWN error. If dest already exists,\n // fs throws error anyway, so no need to guard against it here.\n if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)\n throw err\n }\n if (opts.dereference) {\n resolvedDest = path.resolve(process.cwd(), resolvedDest)\n }\n if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {\n throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)\n }\n\n // prevent copy if src is a subdir of dest since unlinking\n // dest in this case would result in removing src contents\n // and therefore a broken symlink would be created.\n if (stat.isSrcSubdir(resolvedDest, resolvedSrc)) {\n throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)\n }\n return copyLink(resolvedSrc, dest)\n }\n}\n\nfunction copyLink (resolvedSrc, dest) {\n fs.unlinkSync(dest)\n return fs.symlinkSync(resolvedSrc, dest)\n}\n\nmodule.exports = copySync\n","'use strict'\n\nconst fs = require('graceful-fs')\nconst path = require('path')\nconst mkdirs = require('../mkdirs').mkdirs\nconst pathExists = require('../path-exists').pathExists\nconst utimesMillis = require('../util/utimes').utimesMillis\nconst stat = require('../util/stat')\n\nfunction copy (src, dest, opts, cb) {\n if (typeof opts === 'function' && !cb) {\n cb = opts\n opts = {}\n } else if (typeof opts === 'function') {\n opts = { filter: opts }\n }\n\n cb = cb || function () {}\n opts = opts || {}\n\n opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now\n opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber\n\n // Warn about using preserveTimestamps on 32-bit node\n if (opts.preserveTimestamps && process.arch === 'ia32') {\n process.emitWarning(\n 'Using the preserveTimestamps option in 32-bit node is not recommended;\\n\\n' +\n '\\tsee https://github.com/jprichardson/node-fs-extra/issues/269',\n 'Warning', 'fs-extra-WARN0001'\n )\n }\n\n stat.checkPaths(src, dest, 'copy', opts, (err, stats) => {\n if (err) return cb(err)\n const { srcStat, destStat } = stats\n stat.checkParentPaths(src, srcStat, dest, 'copy', err => {\n if (err) return cb(err)\n runFilter(src, dest, opts, (err, include) => {\n if (err) return cb(err)\n if (!include) return cb()\n\n checkParentDir(destStat, src, dest, opts, cb)\n })\n })\n })\n}\n\nfunction checkParentDir (destStat, src, dest, opts, cb) {\n const destParent = path.dirname(dest)\n pathExists(destParent, (err, dirExists) => {\n if (err) return cb(err)\n if (dirExists) return getStats(destStat, src, dest, opts, cb)\n mkdirs(destParent, err => {\n if (err) return cb(err)\n return getStats(destStat, src, dest, opts, cb)\n })\n })\n}\n\nfunction runFilter (src, dest, opts, cb) {\n if (!opts.filter) return cb(null, true)\n Promise.resolve(opts.filter(src, dest))\n .then(include => cb(null, include), error => cb(error))\n}\n\nfunction getStats (destStat, src, dest, opts, cb) {\n const stat = opts.dereference ? fs.stat : fs.lstat\n stat(src, (err, srcStat) => {\n if (err) return cb(err)\n\n if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)\n else if (srcStat.isFile() ||\n srcStat.isCharacterDevice() ||\n srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)\n else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)\n else if (srcStat.isSocket()) return cb(new Error(`Cannot copy a socket file: ${src}`))\n else if (srcStat.isFIFO()) return cb(new Error(`Cannot copy a FIFO pipe: ${src}`))\n return cb(new Error(`Unknown file: ${src}`))\n })\n}\n\nfunction onFile (srcStat, destStat, src, dest, opts, cb) {\n if (!destStat) return copyFile(srcStat, src, dest, opts, cb)\n return mayCopyFile(srcStat, src, dest, opts, cb)\n}\n\nfunction mayCopyFile (srcStat, src, dest, opts, cb) {\n if (opts.overwrite) {\n fs.unlink(dest, err => {\n if (err) return cb(err)\n return copyFile(srcStat, src, dest, opts, cb)\n })\n } else if (opts.errorOnExist) {\n return cb(new Error(`'${dest}' already exists`))\n } else return cb()\n}\n\nfunction copyFile (srcStat, src, dest, opts, cb) {\n fs.copyFile(src, dest, err => {\n if (err) return cb(err)\n if (opts.preserveTimestamps) return handleTimestampsAndMode(srcStat.mode, src, dest, cb)\n return setDestMode(dest, srcStat.mode, cb)\n })\n}\n\nfunction handleTimestampsAndMode (srcMode, src, dest, cb) {\n // Make sure the file is writable before setting the timestamp\n // otherwise open fails with EPERM when invoked with 'r+'\n // (through utimes call)\n if (fileIsNotWritable(srcMode)) {\n return makeFileWritable(dest, srcMode, err => {\n if (err) return cb(err)\n return setDestTimestampsAndMode(srcMode, src, dest, cb)\n })\n }\n return setDestTimestampsAndMode(srcMode, src, dest, cb)\n}\n\nfunction fileIsNotWritable (srcMode) {\n return (srcMode & 0o200) === 0\n}\n\nfunction makeFileWritable (dest, srcMode, cb) {\n return setDestMode(dest, srcMode | 0o200, cb)\n}\n\nfunction setDestTimestampsAndMode (srcMode, src, dest, cb) {\n setDestTimestamps(src, dest, err => {\n if (err) return cb(err)\n return setDestMode(dest, srcMode, cb)\n })\n}\n\nfunction setDestMode (dest, srcMode, cb) {\n return fs.chmod(dest, srcMode, cb)\n}\n\nfunction setDestTimestamps (src, dest, cb) {\n // The initial srcStat.atime cannot be trusted\n // because it is modified by the read(2) system call\n // (See https://nodejs.org/api/fs.html#fs_stat_time_values)\n fs.stat(src, (err, updatedSrcStat) => {\n if (err) return cb(err)\n return utimesMillis(dest, updatedSrcStat.atime, updatedSrcStat.mtime, cb)\n })\n}\n\nfunction onDir (srcStat, destStat, src, dest, opts, cb) {\n if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts, cb)\n return copyDir(src, dest, opts, cb)\n}\n\nfunction mkDirAndCopy (srcMode, src, dest, opts, cb) {\n fs.mkdir(dest, err => {\n if (err) return cb(err)\n copyDir(src, dest, opts, err => {\n if (err) return cb(err)\n return setDestMode(dest, srcMode, cb)\n })\n })\n}\n\nfunction copyDir (src, dest, opts, cb) {\n fs.readdir(src, (err, items) => {\n if (err) return cb(err)\n return copyDirItems(items, src, dest, opts, cb)\n })\n}\n\nfunction copyDirItems (items, src, dest, opts, cb) {\n const item = items.pop()\n if (!item) return cb()\n return copyDirItem(items, item, src, dest, opts, cb)\n}\n\nfunction copyDirItem (items, item, src, dest, opts, cb) {\n const srcItem = path.join(src, item)\n const destItem = path.join(dest, item)\n runFilter(srcItem, destItem, opts, (err, include) => {\n if (err) return cb(err)\n if (!include) return copyDirItems(items, src, dest, opts, cb)\n\n stat.checkPaths(srcItem, destItem, 'copy', opts, (err, stats) => {\n if (err) return cb(err)\n const { destStat } = stats\n getStats(destStat, srcItem, destItem, opts, err => {\n if (err) return cb(err)\n return copyDirItems(items, src, dest, opts, cb)\n })\n })\n })\n}\n\nfunction onLink (destStat, src, dest, opts, cb) {\n fs.readlink(src, (err, resolvedSrc) => {\n if (err) return cb(err)\n if (opts.dereference) {\n resolvedSrc = path.resolve(process.cwd(), resolvedSrc)\n }\n\n if (!destStat) {\n return fs.symlink(resolvedSrc, dest, cb)\n } else {\n fs.readlink(dest, (err, resolvedDest) => {\n if (err) {\n // dest exists and is a regular file or directory,\n // Windows may throw UNKNOWN error. If dest already exists,\n // fs throws error anyway, so no need to guard against it here.\n if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)\n return cb(err)\n }\n if (opts.dereference) {\n resolvedDest = path.resolve(process.cwd(), resolvedDest)\n }\n if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {\n return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))\n }\n\n // do not copy if src is a subdir of dest since unlinking\n // dest in this case would result in removing src contents\n // and therefore a broken symlink would be created.\n if (stat.isSrcSubdir(resolvedDest, resolvedSrc)) {\n return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))\n }\n return copyLink(resolvedSrc, dest, cb)\n })\n }\n })\n}\n\nfunction copyLink (resolvedSrc, dest, cb) {\n fs.unlink(dest, err => {\n if (err) return cb(err)\n return fs.symlink(resolvedSrc, dest, cb)\n })\n}\n\nmodule.exports = copy\n","'use strict'\n\nconst u = require('universalify').fromCallback\nmodule.exports = {\n copy: u(require('./copy')),\n copySync: require('./copy-sync')\n}\n","'use strict'\n\nconst u = require('universalify').fromPromise\nconst fs = require('../fs')\nconst path = require('path')\nconst mkdir = require('../mkdirs')\nconst remove = require('../remove')\n\nconst emptyDir = u(async function emptyDir (dir) {\n let items\n try {\n items = await fs.readdir(dir)\n } catch {\n return mkdir.mkdirs(dir)\n }\n\n return Promise.all(items.map(item => remove.remove(path.join(dir, item))))\n})\n\nfunction emptyDirSync (dir) {\n let items\n try {\n items = fs.readdirSync(dir)\n } catch {\n return mkdir.mkdirsSync(dir)\n }\n\n items.forEach(item => {\n item = path.join(dir, item)\n remove.removeSync(item)\n })\n}\n\nmodule.exports = {\n emptyDirSync,\n emptydirSync: emptyDirSync,\n emptyDir,\n emptydir: emptyDir\n}\n","'use strict'\n\nconst u = require('universalify').fromCallback\nconst path = require('path')\nconst fs = require('graceful-fs')\nconst mkdir = require('../mkdirs')\n\nfunction createFile (file, callback) {\n function makeFile () {\n fs.writeFile(file, '', err => {\n if (err) return callback(err)\n callback()\n })\n }\n\n fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err\n if (!err && stats.isFile()) return callback()\n const dir = path.dirname(file)\n fs.stat(dir, (err, stats) => {\n if (err) {\n // if the directory doesn't exist, make it\n if (err.code === 'ENOENT') {\n return mkdir.mkdirs(dir, err => {\n if (err) return callback(err)\n makeFile()\n })\n }\n return callback(err)\n }\n\n if (stats.isDirectory()) makeFile()\n else {\n // parent is not a directory\n // This is just to cause an internal ENOTDIR error to be thrown\n fs.readdir(dir, err => {\n if (err) return callback(err)\n })\n }\n })\n })\n}\n\nfunction createFileSync (file) {\n let stats\n try {\n stats = fs.statSync(file)\n } catch {}\n if (stats && stats.isFile()) return\n\n const dir = path.dirname(file)\n try {\n if (!fs.statSync(dir).isDirectory()) {\n // parent is not a directory\n // This is just to cause an internal ENOTDIR error to be thrown\n fs.readdirSync(dir)\n }\n } catch (err) {\n // If the stat call above failed because the directory doesn't exist, create it\n if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir)\n else throw err\n }\n\n fs.writeFileSync(file, '')\n}\n\nmodule.exports = {\n createFile: u(createFile),\n createFileSync\n}\n","'use strict'\n\nconst { createFile, createFileSync } = require('./file')\nconst { createLink, createLinkSync } = require('./link')\nconst { createSymlink, createSymlinkSync } = require('./symlink')\n\nmodule.exports = {\n // file\n createFile,\n createFileSync,\n ensureFile: createFile,\n ensureFileSync: createFileSync,\n // link\n createLink,\n createLinkSync,\n ensureLink: createLink,\n ensureLinkSync: createLinkSync,\n // symlink\n createSymlink,\n createSymlinkSync,\n ensureSymlink: createSymlink,\n ensureSymlinkSync: createSymlinkSync\n}\n","'use strict'\n\nconst u = require('universalify').fromCallback\nconst path = require('path')\nconst fs = require('graceful-fs')\nconst mkdir = require('../mkdirs')\nconst pathExists = require('../path-exists').pathExists\nconst { areIdentical } = require('../util/stat')\n\nfunction createLink (srcpath, dstpath, callback) {\n function makeLink (srcpath, dstpath) {\n fs.link(srcpath, dstpath, err => {\n if (err) return callback(err)\n callback(null)\n })\n }\n\n fs.lstat(dstpath, (_, dstStat) => {\n fs.lstat(srcpath, (err, srcStat) => {\n if (err) {\n err.message = err.message.replace('lstat', 'ensureLink')\n return callback(err)\n }\n if (dstStat && areIdentical(srcStat, dstStat)) return callback(null)\n\n const dir = path.dirname(dstpath)\n pathExists(dir, (err, dirExists) => {\n if (err) return callback(err)\n if (dirExists) return makeLink(srcpath, dstpath)\n mkdir.mkdirs(dir, err => {\n if (err) return callback(err)\n makeLink(srcpath, dstpath)\n })\n })\n })\n })\n}\n\nfunction createLinkSync (srcpath, dstpath) {\n let dstStat\n try {\n dstStat = fs.lstatSync(dstpath)\n } catch {}\n\n try {\n const srcStat = fs.lstatSync(srcpath)\n if (dstStat && areIdentical(srcStat, dstStat)) return\n } catch (err) {\n err.message = err.message.replace('lstat', 'ensureLink')\n throw err\n }\n\n const dir = path.dirname(dstpath)\n const dirExists = fs.existsSync(dir)\n if (dirExists) return fs.linkSync(srcpath, dstpath)\n mkdir.mkdirsSync(dir)\n\n return fs.linkSync(srcpath, dstpath)\n}\n\nmodule.exports = {\n createLink: u(createLink),\n createLinkSync\n}\n","'use strict'\n\nconst path = require('path')\nconst fs = require('graceful-fs')\nconst pathExists = require('../path-exists').pathExists\n\n/**\n * Function that returns two types of paths, one relative to symlink, and one\n * relative to the current working directory. Checks if path is absolute or\n * relative. If the path is relative, this function checks if the path is\n * relative to symlink or relative to current working directory. This is an\n * initiative to find a smarter `srcpath` to supply when building symlinks.\n * This allows you to determine which path to use out of one of three possible\n * types of source paths. The first is an absolute path. This is detected by\n * `path.isAbsolute()`. When an absolute path is provided, it is checked to\n * see if it exists. If it does it's used, if not an error is returned\n * (callback)/ thrown (sync). The other two options for `srcpath` are a\n * relative url. By default Node's `fs.symlink` works by creating a symlink\n * using `dstpath` and expects the `srcpath` to be relative to the newly\n * created symlink. If you provide a `srcpath` that does not exist on the file\n * system it results in a broken symlink. To minimize this, the function\n * checks to see if the 'relative to symlink' source file exists, and if it\n * does it will use it. If it does not, it checks if there's a file that\n * exists that is relative to the current working directory, if does its used.\n * This preserves the expectations of the original fs.symlink spec and adds\n * the ability to pass in `relative to current working direcotry` paths.\n */\n\nfunction symlinkPaths (srcpath, dstpath, callback) {\n if (path.isAbsolute(srcpath)) {\n return fs.lstat(srcpath, (err) => {\n if (err) {\n err.message = err.message.replace('lstat', 'ensureSymlink')\n return callback(err)\n }\n return callback(null, {\n toCwd: srcpath,\n toDst: srcpath\n })\n })\n } else {\n const dstdir = path.dirname(dstpath)\n const relativeToDst = path.join(dstdir, srcpath)\n return pathExists(relativeToDst, (err, exists) => {\n if (err) return callback(err)\n if (exists) {\n return callback(null, {\n toCwd: relativeToDst,\n toDst: srcpath\n })\n } else {\n return fs.lstat(srcpath, (err) => {\n if (err) {\n err.message = err.message.replace('lstat', 'ensureSymlink')\n return callback(err)\n }\n return callback(null, {\n toCwd: srcpath,\n toDst: path.relative(dstdir, srcpath)\n })\n })\n }\n })\n }\n}\n\nfunction symlinkPathsSync (srcpath, dstpath) {\n let exists\n if (path.isAbsolute(srcpath)) {\n exists = fs.existsSync(srcpath)\n if (!exists) throw new Error('absolute srcpath does not exist')\n return {\n toCwd: srcpath,\n toDst: srcpath\n }\n } else {\n const dstdir = path.dirname(dstpath)\n const relativeToDst = path.join(dstdir, srcpath)\n exists = fs.existsSync(relativeToDst)\n if (exists) {\n return {\n toCwd: relativeToDst,\n toDst: srcpath\n }\n } else {\n exists = fs.existsSync(srcpath)\n if (!exists) throw new Error('relative srcpath does not exist')\n return {\n toCwd: srcpath,\n toDst: path.relative(dstdir, srcpath)\n }\n }\n }\n}\n\nmodule.exports = {\n symlinkPaths,\n symlinkPathsSync\n}\n","'use strict'\n\nconst fs = require('graceful-fs')\n\nfunction symlinkType (srcpath, type, callback) {\n callback = (typeof type === 'function') ? type : callback\n type = (typeof type === 'function') ? false : type\n if (type) return callback(null, type)\n fs.lstat(srcpath, (err, stats) => {\n if (err) return callback(null, 'file')\n type = (stats && stats.isDirectory()) ? 'dir' : 'file'\n callback(null, type)\n })\n}\n\nfunction symlinkTypeSync (srcpath, type) {\n let stats\n\n if (type) return type\n try {\n stats = fs.lstatSync(srcpath)\n } catch {\n return 'file'\n }\n return (stats && stats.isDirectory()) ? 'dir' : 'file'\n}\n\nmodule.exports = {\n symlinkType,\n symlinkTypeSync\n}\n","'use strict'\n\nconst u = require('universalify').fromCallback\nconst path = require('path')\nconst fs = require('../fs')\nconst _mkdirs = require('../mkdirs')\nconst mkdirs = _mkdirs.mkdirs\nconst mkdirsSync = _mkdirs.mkdirsSync\n\nconst _symlinkPaths = require('./symlink-paths')\nconst symlinkPaths = _symlinkPaths.symlinkPaths\nconst symlinkPathsSync = _symlinkPaths.symlinkPathsSync\n\nconst _symlinkType = require('./symlink-type')\nconst symlinkType = _symlinkType.symlinkType\nconst symlinkTypeSync = _symlinkType.symlinkTypeSync\n\nconst pathExists = require('../path-exists').pathExists\n\nconst { areIdentical } = require('../util/stat')\n\nfunction createSymlink (srcpath, dstpath, type, callback) {\n callback = (typeof type === 'function') ? type : callback\n type = (typeof type === 'function') ? false : type\n\n fs.lstat(dstpath, (err, stats) => {\n if (!err && stats.isSymbolicLink()) {\n Promise.all([\n fs.stat(srcpath),\n fs.stat(dstpath)\n ]).then(([srcStat, dstStat]) => {\n if (areIdentical(srcStat, dstStat)) return callback(null)\n _createSymlink(srcpath, dstpath, type, callback)\n })\n } else _createSymlink(srcpath, dstpath, type, callback)\n })\n}\n\nfunction _createSymlink (srcpath, dstpath, type, callback) {\n symlinkPaths(srcpath, dstpath, (err, relative) => {\n if (err) return callback(err)\n srcpath = relative.toDst\n symlinkType(relative.toCwd, type, (err, type) => {\n if (err) return callback(err)\n const dir = path.dirname(dstpath)\n pathExists(dir, (err, dirExists) => {\n if (err) return callback(err)\n if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)\n mkdirs(dir, err => {\n if (err) return callback(err)\n fs.symlink(srcpath, dstpath, type, callback)\n })\n })\n })\n })\n}\n\nfunction createSymlinkSync (srcpath, dstpath, type) {\n let stats\n try {\n stats = fs.lstatSync(dstpath)\n } catch {}\n if (stats && stats.isSymbolicLink()) {\n const srcStat = fs.statSync(srcpath)\n const dstStat = fs.statSync(dstpath)\n if (areIdentical(srcStat, dstStat)) return\n }\n\n const relative = symlinkPathsSync(srcpath, dstpath)\n srcpath = relative.toDst\n type = symlinkTypeSync(relative.toCwd, type)\n const dir = path.dirname(dstpath)\n const exists = fs.existsSync(dir)\n if (exists) return fs.symlinkSync(srcpath, dstpath, type)\n mkdirsSync(dir)\n return fs.symlinkSync(srcpath, dstpath, type)\n}\n\nmodule.exports = {\n createSymlink: u(createSymlink),\n createSymlinkSync\n}\n","'use strict'\n// This is adapted from https://github.com/normalize/mz\n// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors\nconst u = require('universalify').fromCallback\nconst fs = require('graceful-fs')\n\nconst api = [\n 'access',\n 'appendFile',\n 'chmod',\n 'chown',\n 'close',\n 'copyFile',\n 'fchmod',\n 'fchown',\n 'fdatasync',\n 'fstat',\n 'fsync',\n 'ftruncate',\n 'futimes',\n 'lchmod',\n 'lchown',\n 'link',\n 'lstat',\n 'mkdir',\n 'mkdtemp',\n 'open',\n 'opendir',\n 'readdir',\n 'readFile',\n 'readlink',\n 'realpath',\n 'rename',\n 'rm',\n 'rmdir',\n 'stat',\n 'symlink',\n 'truncate',\n 'unlink',\n 'utimes',\n 'writeFile'\n].filter(key => {\n // Some commands are not available on some systems. Ex:\n // fs.cp was added in Node.js v16.7.0\n // fs.lchown is not available on at least some Linux\n return typeof fs[key] === 'function'\n})\n\n// Export cloned fs:\nObject.assign(exports, fs)\n\n// Universalify async methods:\napi.forEach(method => {\n exports[method] = u(fs[method])\n})\n\n// We differ from mz/fs in that we still ship the old, broken, fs.exists()\n// since we are a drop-in replacement for the native module\nexports.exists = function (filename, callback) {\n if (typeof callback === 'function') {\n return fs.exists(filename, callback)\n }\n return new Promise(resolve => {\n return fs.exists(filename, resolve)\n })\n}\n\n// fs.read(), fs.write(), fs.readv(), & fs.writev() need special treatment due to multiple callback args\n\nexports.read = function (fd, buffer, offset, length, position, callback) {\n if (typeof callback === 'function') {\n return fs.read(fd, buffer, offset, length, position, callback)\n }\n return new Promise((resolve, reject) => {\n fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {\n if (err) return reject(err)\n resolve({ bytesRead, buffer })\n })\n })\n}\n\n// Function signature can be\n// fs.write(fd, buffer[, offset[, length[, position]]], callback)\n// OR\n// fs.write(fd, string[, position[, encoding]], callback)\n// We need to handle both cases, so we use ...args\nexports.write = function (fd, buffer, ...args) {\n if (typeof args[args.length - 1] === 'function') {\n return fs.write(fd, buffer, ...args)\n }\n\n return new Promise((resolve, reject) => {\n fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {\n if (err) return reject(err)\n resolve({ bytesWritten, buffer })\n })\n })\n}\n\n// Function signature is\n// s.readv(fd, buffers[, position], callback)\n// We need to handle the optional arg, so we use ...args\nexports.readv = function (fd, buffers, ...args) {\n if (typeof args[args.length - 1] === 'function') {\n return fs.readv(fd, buffers, ...args)\n }\n\n return new Promise((resolve, reject) => {\n fs.readv(fd, buffers, ...args, (err, bytesRead, buffers) => {\n if (err) return reject(err)\n resolve({ bytesRead, buffers })\n })\n })\n}\n\n// Function signature is\n// s.writev(fd, buffers[, position], callback)\n// We need to handle the optional arg, so we use ...args\nexports.writev = function (fd, buffers, ...args) {\n if (typeof args[args.length - 1] === 'function') {\n return fs.writev(fd, buffers, ...args)\n }\n\n return new Promise((resolve, reject) => {\n fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => {\n if (err) return reject(err)\n resolve({ bytesWritten, buffers })\n })\n })\n}\n\n// fs.realpath.native sometimes not available if fs is monkey-patched\nif (typeof fs.realpath.native === 'function') {\n exports.realpath.native = u(fs.realpath.native)\n} else {\n process.emitWarning(\n 'fs.realpath.native is not a function. Is fs being monkey-patched?',\n 'Warning', 'fs-extra-WARN0003'\n )\n}\n","'use strict'\n\nmodule.exports = {\n // Export promiseified graceful-fs:\n ...require('./fs'),\n // Export extra methods:\n ...require('./copy'),\n ...require('./empty'),\n ...require('./ensure'),\n ...require('./json'),\n ...require('./mkdirs'),\n ...require('./move'),\n ...require('./output-file'),\n ...require('./path-exists'),\n ...require('./remove')\n}\n","'use strict'\n\nconst u = require('universalify').fromPromise\nconst jsonFile = require('./jsonfile')\n\njsonFile.outputJson = u(require('./output-json'))\njsonFile.outputJsonSync = require('./output-json-sync')\n// aliases\njsonFile.outputJSON = jsonFile.outputJson\njsonFile.outputJSONSync = jsonFile.outputJsonSync\njsonFile.writeJSON = jsonFile.writeJson\njsonFile.writeJSONSync = jsonFile.writeJsonSync\njsonFile.readJSON = jsonFile.readJson\njsonFile.readJSONSync = jsonFile.readJsonSync\n\nmodule.exports = jsonFile\n","'use strict'\n\nconst jsonFile = require('jsonfile')\n\nmodule.exports = {\n // jsonfile exports\n readJson: jsonFile.readFile,\n readJsonSync: jsonFile.readFileSync,\n writeJson: jsonFile.writeFile,\n writeJsonSync: jsonFile.writeFileSync\n}\n","'use strict'\n\nconst { stringify } = require('jsonfile/utils')\nconst { outputFileSync } = require('../output-file')\n\nfunction outputJsonSync (file, data, options) {\n const str = stringify(data, options)\n\n outputFileSync(file, str, options)\n}\n\nmodule.exports = outputJsonSync\n","'use strict'\n\nconst { stringify } = require('jsonfile/utils')\nconst { outputFile } = require('../output-file')\n\nasync function outputJson (file, data, options = {}) {\n const str = stringify(data, options)\n\n await outputFile(file, str, options)\n}\n\nmodule.exports = outputJson\n","'use strict'\nconst u = require('universalify').fromPromise\nconst { makeDir: _makeDir, makeDirSync } = require('./make-dir')\nconst makeDir = u(_makeDir)\n\nmodule.exports = {\n mkdirs: makeDir,\n mkdirsSync: makeDirSync,\n // alias\n mkdirp: makeDir,\n mkdirpSync: makeDirSync,\n ensureDir: makeDir,\n ensureDirSync: makeDirSync\n}\n","'use strict'\nconst fs = require('../fs')\nconst { checkPath } = require('./utils')\n\nconst getMode = options => {\n const defaults = { mode: 0o777 }\n if (typeof options === 'number') return options\n return ({ ...defaults, ...options }).mode\n}\n\nmodule.exports.makeDir = async (dir, options) => {\n checkPath(dir)\n\n return fs.mkdir(dir, {\n mode: getMode(options),\n recursive: true\n })\n}\n\nmodule.exports.makeDirSync = (dir, options) => {\n checkPath(dir)\n\n return fs.mkdirSync(dir, {\n mode: getMode(options),\n recursive: true\n })\n}\n","// Adapted from https://github.com/sindresorhus/make-dir\n// Copyright (c) Sindre Sorhus (sindresorhus.com)\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n'use strict'\nconst path = require('path')\n\n// https://github.com/nodejs/node/issues/8987\n// https://github.com/libuv/libuv/pull/1088\nmodule.exports.checkPath = function checkPath (pth) {\n if (process.platform === 'win32') {\n const pathHasInvalidWinCharacters = /[<>:\"|?*]/.test(pth.replace(path.parse(pth).root, ''))\n\n if (pathHasInvalidWinCharacters) {\n const error = new Error(`Path contains invalid characters: ${pth}`)\n error.code = 'EINVAL'\n throw error\n }\n }\n}\n","'use strict'\n\nconst u = require('universalify').fromCallback\nmodule.exports = {\n move: u(require('./move')),\n moveSync: require('./move-sync')\n}\n","'use strict'\n\nconst fs = require('graceful-fs')\nconst path = require('path')\nconst copySync = require('../copy').copySync\nconst removeSync = require('../remove').removeSync\nconst mkdirpSync = require('../mkdirs').mkdirpSync\nconst stat = require('../util/stat')\n\nfunction moveSync (src, dest, opts) {\n opts = opts || {}\n const overwrite = opts.overwrite || opts.clobber || false\n\n const { srcStat, isChangingCase = false } = stat.checkPathsSync(src, dest, 'move', opts)\n stat.checkParentPathsSync(src, srcStat, dest, 'move')\n if (!isParentRoot(dest)) mkdirpSync(path.dirname(dest))\n return doRename(src, dest, overwrite, isChangingCase)\n}\n\nfunction isParentRoot (dest) {\n const parent = path.dirname(dest)\n const parsedPath = path.parse(parent)\n return parsedPath.root === parent\n}\n\nfunction doRename (src, dest, overwrite, isChangingCase) {\n if (isChangingCase) return rename(src, dest, overwrite)\n if (overwrite) {\n removeSync(dest)\n return rename(src, dest, overwrite)\n }\n if (fs.existsSync(dest)) throw new Error('dest already exists.')\n return rename(src, dest, overwrite)\n}\n\nfunction rename (src, dest, overwrite) {\n try {\n fs.renameSync(src, dest)\n } catch (err) {\n if (err.code !== 'EXDEV') throw err\n return moveAcrossDevice(src, dest, overwrite)\n }\n}\n\nfunction moveAcrossDevice (src, dest, overwrite) {\n const opts = {\n overwrite,\n errorOnExist: true,\n preserveTimestamps: true\n }\n copySync(src, dest, opts)\n return removeSync(src)\n}\n\nmodule.exports = moveSync\n","'use strict'\n\nconst fs = require('graceful-fs')\nconst path = require('path')\nconst copy = require('../copy').copy\nconst remove = require('../remove').remove\nconst mkdirp = require('../mkdirs').mkdirp\nconst pathExists = require('../path-exists').pathExists\nconst stat = require('../util/stat')\n\nfunction move (src, dest, opts, cb) {\n if (typeof opts === 'function') {\n cb = opts\n opts = {}\n }\n\n opts = opts || {}\n\n const overwrite = opts.overwrite || opts.clobber || false\n\n stat.checkPaths(src, dest, 'move', opts, (err, stats) => {\n if (err) return cb(err)\n const { srcStat, isChangingCase = false } = stats\n stat.checkParentPaths(src, srcStat, dest, 'move', err => {\n if (err) return cb(err)\n if (isParentRoot(dest)) return doRename(src, dest, overwrite, isChangingCase, cb)\n mkdirp(path.dirname(dest), err => {\n if (err) return cb(err)\n return doRename(src, dest, overwrite, isChangingCase, cb)\n })\n })\n })\n}\n\nfunction isParentRoot (dest) {\n const parent = path.dirname(dest)\n const parsedPath = path.parse(parent)\n return parsedPath.root === parent\n}\n\nfunction doRename (src, dest, overwrite, isChangingCase, cb) {\n if (isChangingCase) return rename(src, dest, overwrite, cb)\n if (overwrite) {\n return remove(dest, err => {\n if (err) return cb(err)\n return rename(src, dest, overwrite, cb)\n })\n }\n pathExists(dest, (err, destExists) => {\n if (err) return cb(err)\n if (destExists) return cb(new Error('dest already exists.'))\n return rename(src, dest, overwrite, cb)\n })\n}\n\nfunction rename (src, dest, overwrite, cb) {\n fs.rename(src, dest, err => {\n if (!err) return cb()\n if (err.code !== 'EXDEV') return cb(err)\n return moveAcrossDevice(src, dest, overwrite, cb)\n })\n}\n\nfunction moveAcrossDevice (src, dest, overwrite, cb) {\n const opts = {\n overwrite,\n errorOnExist: true,\n preserveTimestamps: true\n }\n copy(src, dest, opts, err => {\n if (err) return cb(err)\n return remove(src, cb)\n })\n}\n\nmodule.exports = move\n","'use strict'\n\nconst u = require('universalify').fromCallback\nconst fs = require('graceful-fs')\nconst path = require('path')\nconst mkdir = require('../mkdirs')\nconst pathExists = require('../path-exists').pathExists\n\nfunction outputFile (file, data, encoding, callback) {\n if (typeof encoding === 'function') {\n callback = encoding\n encoding = 'utf8'\n }\n\n const dir = path.dirname(file)\n pathExists(dir, (err, itDoes) => {\n if (err) return callback(err)\n if (itDoes) return fs.writeFile(file, data, encoding, callback)\n\n mkdir.mkdirs(dir, err => {\n if (err) return callback(err)\n\n fs.writeFile(file, data, encoding, callback)\n })\n })\n}\n\nfunction outputFileSync (file, ...args) {\n const dir = path.dirname(file)\n if (fs.existsSync(dir)) {\n return fs.writeFileSync(file, ...args)\n }\n mkdir.mkdirsSync(dir)\n fs.writeFileSync(file, ...args)\n}\n\nmodule.exports = {\n outputFile: u(outputFile),\n outputFileSync\n}\n","'use strict'\nconst u = require('universalify').fromPromise\nconst fs = require('../fs')\n\nfunction pathExists (path) {\n return fs.access(path).then(() => true).catch(() => false)\n}\n\nmodule.exports = {\n pathExists: u(pathExists),\n pathExistsSync: fs.existsSync\n}\n","'use strict'\n\nconst fs = require('graceful-fs')\nconst u = require('universalify').fromCallback\n\nfunction remove (path, callback) {\n fs.rm(path, { recursive: true, force: true }, callback)\n}\n\nfunction removeSync (path) {\n fs.rmSync(path, { recursive: true, force: true })\n}\n\nmodule.exports = {\n remove: u(remove),\n removeSync\n}\n","'use strict'\n\nconst fs = require('../fs')\nconst path = require('path')\nconst util = require('util')\n\nfunction getStats (src, dest, opts) {\n const statFunc = opts.dereference\n ? (file) => fs.stat(file, { bigint: true })\n : (file) => fs.lstat(file, { bigint: true })\n return Promise.all([\n statFunc(src),\n statFunc(dest).catch(err => {\n if (err.code === 'ENOENT') return null\n throw err\n })\n ]).then(([srcStat, destStat]) => ({ srcStat, destStat }))\n}\n\nfunction getStatsSync (src, dest, opts) {\n let destStat\n const statFunc = opts.dereference\n ? (file) => fs.statSync(file, { bigint: true })\n : (file) => fs.lstatSync(file, { bigint: true })\n const srcStat = statFunc(src)\n try {\n destStat = statFunc(dest)\n } catch (err) {\n if (err.code === 'ENOENT') return { srcStat, destStat: null }\n throw err\n }\n return { srcStat, destStat }\n}\n\nfunction checkPaths (src, dest, funcName, opts, cb) {\n util.callbackify(getStats)(src, dest, opts, (err, stats) => {\n if (err) return cb(err)\n const { srcStat, destStat } = stats\n\n if (destStat) {\n if (areIdentical(srcStat, destStat)) {\n const srcBaseName = path.basename(src)\n const destBaseName = path.basename(dest)\n if (funcName === 'move' &&\n srcBaseName !== destBaseName &&\n srcBaseName.toLowerCase() === destBaseName.toLowerCase()) {\n return cb(null, { srcStat, destStat, isChangingCase: true })\n }\n return cb(new Error('Source and destination must not be the same.'))\n }\n if (srcStat.isDirectory() && !destStat.isDirectory()) {\n return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))\n }\n if (!srcStat.isDirectory() && destStat.isDirectory()) {\n return cb(new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`))\n }\n }\n\n if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {\n return cb(new Error(errMsg(src, dest, funcName)))\n }\n return cb(null, { srcStat, destStat })\n })\n}\n\nfunction checkPathsSync (src, dest, funcName, opts) {\n const { srcStat, destStat } = getStatsSync(src, dest, opts)\n\n if (destStat) {\n if (areIdentical(srcStat, destStat)) {\n const srcBaseName = path.basename(src)\n const destBaseName = path.basename(dest)\n if (funcName === 'move' &&\n srcBaseName !== destBaseName &&\n srcBaseName.toLowerCase() === destBaseName.toLowerCase()) {\n return { srcStat, destStat, isChangingCase: true }\n }\n throw new Error('Source and destination must not be the same.')\n }\n if (srcStat.isDirectory() && !destStat.isDirectory()) {\n throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)\n }\n if (!srcStat.isDirectory() && destStat.isDirectory()) {\n throw new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`)\n }\n }\n\n if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {\n throw new Error(errMsg(src, dest, funcName))\n }\n return { srcStat, destStat }\n}\n\n// recursively check if dest parent is a subdirectory of src.\n// It works for all file types including symlinks since it\n// checks the src and dest inodes. It starts from the deepest\n// parent and stops once it reaches the src parent or the root path.\nfunction checkParentPaths (src, srcStat, dest, funcName, cb) {\n const srcParent = path.resolve(path.dirname(src))\n const destParent = path.resolve(path.dirname(dest))\n if (destParent === srcParent || destParent === path.parse(destParent).root) return cb()\n fs.stat(destParent, { bigint: true }, (err, destStat) => {\n if (err) {\n if (err.code === 'ENOENT') return cb()\n return cb(err)\n }\n if (areIdentical(srcStat, destStat)) {\n return cb(new Error(errMsg(src, dest, funcName)))\n }\n return checkParentPaths(src, srcStat, destParent, funcName, cb)\n })\n}\n\nfunction checkParentPathsSync (src, srcStat, dest, funcName) {\n const srcParent = path.resolve(path.dirname(src))\n const destParent = path.resolve(path.dirname(dest))\n if (destParent === srcParent || destParent === path.parse(destParent).root) return\n let destStat\n try {\n destStat = fs.statSync(destParent, { bigint: true })\n } catch (err) {\n if (err.code === 'ENOENT') return\n throw err\n }\n if (areIdentical(srcStat, destStat)) {\n throw new Error(errMsg(src, dest, funcName))\n }\n return checkParentPathsSync(src, srcStat, destParent, funcName)\n}\n\nfunction areIdentical (srcStat, destStat) {\n return destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev\n}\n\n// return true if dest is a subdir of src, otherwise false.\n// It only checks the path strings.\nfunction isSrcSubdir (src, dest) {\n const srcArr = path.resolve(src).split(path.sep).filter(i => i)\n const destArr = path.resolve(dest).split(path.sep).filter(i => i)\n return srcArr.reduce((acc, cur, i) => acc && destArr[i] === cur, true)\n}\n\nfunction errMsg (src, dest, funcName) {\n return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.`\n}\n\nmodule.exports = {\n checkPaths,\n checkPathsSync,\n checkParentPaths,\n checkParentPathsSync,\n isSrcSubdir,\n areIdentical\n}\n","'use strict'\n\nconst fs = require('graceful-fs')\n\nfunction utimesMillis (path, atime, mtime, callback) {\n // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)\n fs.open(path, 'r+', (err, fd) => {\n if (err) return callback(err)\n fs.futimes(fd, atime, mtime, futimesErr => {\n fs.close(fd, closeErr => {\n if (callback) callback(futimesErr || closeErr)\n })\n })\n })\n}\n\nfunction utimesMillisSync (path, atime, mtime) {\n const fd = fs.openSync(path, 'r+')\n fs.futimesSync(fd, atime, mtime)\n return fs.closeSync(fd)\n}\n\nmodule.exports = {\n utimesMillis,\n utimesMillisSync\n}\n","'use strict'\n\nmodule.exports = clone\n\nvar getPrototypeOf = Object.getPrototypeOf || function (obj) {\n return obj.__proto__\n}\n\nfunction clone (obj) {\n if (obj === null || typeof obj !== 'object')\n return obj\n\n if (obj instanceof Object)\n var copy = { __proto__: getPrototypeOf(obj) }\n else\n var copy = Object.create(null)\n\n Object.getOwnPropertyNames(obj).forEach(function (key) {\n Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key))\n })\n\n return copy\n}\n","var fs = require('fs')\nvar polyfills = require('./polyfills.js')\nvar legacy = require('./legacy-streams.js')\nvar clone = require('./clone.js')\n\nvar util = require('util')\n\n/* istanbul ignore next - node 0.x polyfill */\nvar gracefulQueue\nvar previousSymbol\n\n/* istanbul ignore else - node 0.x polyfill */\nif (typeof Symbol === 'function' && typeof Symbol.for === 'function') {\n gracefulQueue = Symbol.for('graceful-fs.queue')\n // This is used in testing by future versions\n previousSymbol = Symbol.for('graceful-fs.previous')\n} else {\n gracefulQueue = '___graceful-fs.queue'\n previousSymbol = '___graceful-fs.previous'\n}\n\nfunction noop () {}\n\nfunction publishQueue(context, queue) {\n Object.defineProperty(context, gracefulQueue, {\n get: function() {\n return queue\n }\n })\n}\n\nvar debug = noop\nif (util.debuglog)\n debug = util.debuglog('gfs4')\nelse if (/\\bgfs4\\b/i.test(process.env.NODE_DEBUG || ''))\n debug = function() {\n var m = util.format.apply(util, arguments)\n m = 'GFS4: ' + m.split(/\\n/).join('\\nGFS4: ')\n console.error(m)\n }\n\n// Once time initialization\nif (!fs[gracefulQueue]) {\n // This queue can be shared by multiple loaded instances\n var queue = global[gracefulQueue] || []\n publishQueue(fs, queue)\n\n // Patch fs.close/closeSync to shared queue version, because we need\n // to retry() whenever a close happens *anywhere* in the program.\n // This is essential when multiple graceful-fs instances are\n // in play at the same time.\n fs.close = (function (fs$close) {\n function close (fd, cb) {\n return fs$close.call(fs, fd, function (err) {\n // This function uses the graceful-fs shared queue\n if (!err) {\n resetQueue()\n }\n\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n })\n }\n\n Object.defineProperty(close, previousSymbol, {\n value: fs$close\n })\n return close\n })(fs.close)\n\n fs.closeSync = (function (fs$closeSync) {\n function closeSync (fd) {\n // This function uses the graceful-fs shared queue\n fs$closeSync.apply(fs, arguments)\n resetQueue()\n }\n\n Object.defineProperty(closeSync, previousSymbol, {\n value: fs$closeSync\n })\n return closeSync\n })(fs.closeSync)\n\n if (/\\bgfs4\\b/i.test(process.env.NODE_DEBUG || '')) {\n process.on('exit', function() {\n debug(fs[gracefulQueue])\n require('assert').equal(fs[gracefulQueue].length, 0)\n })\n }\n}\n\nif (!global[gracefulQueue]) {\n publishQueue(global, fs[gracefulQueue]);\n}\n\nmodule.exports = patch(clone(fs))\nif (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) {\n module.exports = patch(fs)\n fs.__patched = true;\n}\n\nfunction patch (fs) {\n // Everything that references the open() function needs to be in here\n polyfills(fs)\n fs.gracefulify = patch\n\n fs.createReadStream = createReadStream\n fs.createWriteStream = createWriteStream\n var fs$readFile = fs.readFile\n fs.readFile = readFile\n function readFile (path, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$readFile(path, options, cb)\n\n function go$readFile (path, options, cb, startTime) {\n return fs$readFile(path, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$readFile, [path, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$writeFile = fs.writeFile\n fs.writeFile = writeFile\n function writeFile (path, data, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$writeFile(path, data, options, cb)\n\n function go$writeFile (path, data, options, cb, startTime) {\n return fs$writeFile(path, data, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$writeFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$appendFile = fs.appendFile\n if (fs$appendFile)\n fs.appendFile = appendFile\n function appendFile (path, data, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n return go$appendFile(path, data, options, cb)\n\n function go$appendFile (path, data, options, cb, startTime) {\n return fs$appendFile(path, data, options, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$appendFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$copyFile = fs.copyFile\n if (fs$copyFile)\n fs.copyFile = copyFile\n function copyFile (src, dest, flags, cb) {\n if (typeof flags === 'function') {\n cb = flags\n flags = 0\n }\n return go$copyFile(src, dest, flags, cb)\n\n function go$copyFile (src, dest, flags, cb, startTime) {\n return fs$copyFile(src, dest, flags, function (err) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$copyFile, [src, dest, flags, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n var fs$readdir = fs.readdir\n fs.readdir = readdir\n var noReaddirOptionVersions = /^v[0-5]\\./\n function readdir (path, options, cb) {\n if (typeof options === 'function')\n cb = options, options = null\n\n var go$readdir = noReaddirOptionVersions.test(process.version)\n ? function go$readdir (path, options, cb, startTime) {\n return fs$readdir(path, fs$readdirCallback(\n path, options, cb, startTime\n ))\n }\n : function go$readdir (path, options, cb, startTime) {\n return fs$readdir(path, options, fs$readdirCallback(\n path, options, cb, startTime\n ))\n }\n\n return go$readdir(path, options, cb)\n\n function fs$readdirCallback (path, options, cb, startTime) {\n return function (err, files) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([\n go$readdir,\n [path, options, cb],\n err,\n startTime || Date.now(),\n Date.now()\n ])\n else {\n if (files && files.sort)\n files.sort()\n\n if (typeof cb === 'function')\n cb.call(this, err, files)\n }\n }\n }\n }\n\n if (process.version.substr(0, 4) === 'v0.8') {\n var legStreams = legacy(fs)\n ReadStream = legStreams.ReadStream\n WriteStream = legStreams.WriteStream\n }\n\n var fs$ReadStream = fs.ReadStream\n if (fs$ReadStream) {\n ReadStream.prototype = Object.create(fs$ReadStream.prototype)\n ReadStream.prototype.open = ReadStream$open\n }\n\n var fs$WriteStream = fs.WriteStream\n if (fs$WriteStream) {\n WriteStream.prototype = Object.create(fs$WriteStream.prototype)\n WriteStream.prototype.open = WriteStream$open\n }\n\n Object.defineProperty(fs, 'ReadStream', {\n get: function () {\n return ReadStream\n },\n set: function (val) {\n ReadStream = val\n },\n enumerable: true,\n configurable: true\n })\n Object.defineProperty(fs, 'WriteStream', {\n get: function () {\n return WriteStream\n },\n set: function (val) {\n WriteStream = val\n },\n enumerable: true,\n configurable: true\n })\n\n // legacy names\n var FileReadStream = ReadStream\n Object.defineProperty(fs, 'FileReadStream', {\n get: function () {\n return FileReadStream\n },\n set: function (val) {\n FileReadStream = val\n },\n enumerable: true,\n configurable: true\n })\n var FileWriteStream = WriteStream\n Object.defineProperty(fs, 'FileWriteStream', {\n get: function () {\n return FileWriteStream\n },\n set: function (val) {\n FileWriteStream = val\n },\n enumerable: true,\n configurable: true\n })\n\n function ReadStream (path, options) {\n if (this instanceof ReadStream)\n return fs$ReadStream.apply(this, arguments), this\n else\n return ReadStream.apply(Object.create(ReadStream.prototype), arguments)\n }\n\n function ReadStream$open () {\n var that = this\n open(that.path, that.flags, that.mode, function (err, fd) {\n if (err) {\n if (that.autoClose)\n that.destroy()\n\n that.emit('error', err)\n } else {\n that.fd = fd\n that.emit('open', fd)\n that.read()\n }\n })\n }\n\n function WriteStream (path, options) {\n if (this instanceof WriteStream)\n return fs$WriteStream.apply(this, arguments), this\n else\n return WriteStream.apply(Object.create(WriteStream.prototype), arguments)\n }\n\n function WriteStream$open () {\n var that = this\n open(that.path, that.flags, that.mode, function (err, fd) {\n if (err) {\n that.destroy()\n that.emit('error', err)\n } else {\n that.fd = fd\n that.emit('open', fd)\n }\n })\n }\n\n function createReadStream (path, options) {\n return new fs.ReadStream(path, options)\n }\n\n function createWriteStream (path, options) {\n return new fs.WriteStream(path, options)\n }\n\n var fs$open = fs.open\n fs.open = open\n function open (path, flags, mode, cb) {\n if (typeof mode === 'function')\n cb = mode, mode = null\n\n return go$open(path, flags, mode, cb)\n\n function go$open (path, flags, mode, cb, startTime) {\n return fs$open(path, flags, mode, function (err, fd) {\n if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n enqueue([go$open, [path, flags, mode, cb], err, startTime || Date.now(), Date.now()])\n else {\n if (typeof cb === 'function')\n cb.apply(this, arguments)\n }\n })\n }\n }\n\n return fs\n}\n\nfunction enqueue (elem) {\n debug('ENQUEUE', elem[0].name, elem[1])\n fs[gracefulQueue].push(elem)\n retry()\n}\n\n// keep track of the timeout between retry() calls\nvar retryTimer\n\n// reset the startTime and lastTime to now\n// this resets the start of the 60 second overall timeout as well as the\n// delay between attempts so that we'll retry these jobs sooner\nfunction resetQueue () {\n var now = Date.now()\n for (var i = 0; i < fs[gracefulQueue].length; ++i) {\n // entries that are only a length of 2 are from an older version, don't\n // bother modifying those since they'll be retried anyway.\n if (fs[gracefulQueue][i].length > 2) {\n fs[gracefulQueue][i][3] = now // startTime\n fs[gracefulQueue][i][4] = now // lastTime\n }\n }\n // call retry to make sure we're actively processing the queue\n retry()\n}\n\nfunction retry () {\n // clear the timer and remove it to help prevent unintended concurrency\n clearTimeout(retryTimer)\n retryTimer = undefined\n\n if (fs[gracefulQueue].length === 0)\n return\n\n var elem = fs[gracefulQueue].shift()\n var fn = elem[0]\n var args = elem[1]\n // these items may be unset if they were added by an older graceful-fs\n var err = elem[2]\n var startTime = elem[3]\n var lastTime = elem[4]\n\n // if we don't have a startTime we have no way of knowing if we've waited\n // long enough, so go ahead and retry this item now\n if (startTime === undefined) {\n debug('RETRY', fn.name, args)\n fn.apply(null, args)\n } else if (Date.now() - startTime >= 60000) {\n // it's been more than 60 seconds total, bail now\n debug('TIMEOUT', fn.name, args)\n var cb = args.pop()\n if (typeof cb === 'function')\n cb.call(null, err)\n } else {\n // the amount of time between the last attempt and right now\n var sinceAttempt = Date.now() - lastTime\n // the amount of time between when we first tried, and when we last tried\n // rounded up to at least 1\n var sinceStart = Math.max(lastTime - startTime, 1)\n // backoff. wait longer than the total time we've been retrying, but only\n // up to a maximum of 100ms\n var desiredDelay = Math.min(sinceStart * 1.2, 100)\n // it's been long enough since the last retry, do it again\n if (sinceAttempt >= desiredDelay) {\n debug('RETRY', fn.name, args)\n fn.apply(null, args.concat([startTime]))\n } else {\n // if we can't do this job yet, push it to the end of the queue\n // and let the next iteration check again\n fs[gracefulQueue].push(elem)\n }\n }\n\n // schedule our next run if one isn't already scheduled\n if (retryTimer === undefined) {\n retryTimer = setTimeout(retry, 0)\n }\n}\n","var Stream = require('stream').Stream\n\nmodule.exports = legacy\n\nfunction legacy (fs) {\n return {\n ReadStream: ReadStream,\n WriteStream: WriteStream\n }\n\n function ReadStream (path, options) {\n if (!(this instanceof ReadStream)) return new ReadStream(path, options);\n\n Stream.call(this);\n\n var self = this;\n\n this.path = path;\n this.fd = null;\n this.readable = true;\n this.paused = false;\n\n this.flags = 'r';\n this.mode = 438; /*=0666*/\n this.bufferSize = 64 * 1024;\n\n options = options || {};\n\n // Mixin options into this\n var keys = Object.keys(options);\n for (var index = 0, length = keys.length; index < length; index++) {\n var key = keys[index];\n this[key] = options[key];\n }\n\n if (this.encoding) this.setEncoding(this.encoding);\n\n if (this.start !== undefined) {\n if ('number' !== typeof this.start) {\n throw TypeError('start must be a Number');\n }\n if (this.end === undefined) {\n this.end = Infinity;\n } else if ('number' !== typeof this.end) {\n throw TypeError('end must be a Number');\n }\n\n if (this.start > this.end) {\n throw new Error('start must be <= end');\n }\n\n this.pos = this.start;\n }\n\n if (this.fd !== null) {\n process.nextTick(function() {\n self._read();\n });\n return;\n }\n\n fs.open(this.path, this.flags, this.mode, function (err, fd) {\n if (err) {\n self.emit('error', err);\n self.readable = false;\n return;\n }\n\n self.fd = fd;\n self.emit('open', fd);\n self._read();\n })\n }\n\n function WriteStream (path, options) {\n if (!(this instanceof WriteStream)) return new WriteStream(path, options);\n\n Stream.call(this);\n\n this.path = path;\n this.fd = null;\n this.writable = true;\n\n this.flags = 'w';\n this.encoding = 'binary';\n this.mode = 438; /*=0666*/\n this.bytesWritten = 0;\n\n options = options || {};\n\n // Mixin options into this\n var keys = Object.keys(options);\n for (var index = 0, length = keys.length; index < length; index++) {\n var key = keys[index];\n this[key] = options[key];\n }\n\n if (this.start !== undefined) {\n if ('number' !== typeof this.start) {\n throw TypeError('start must be a Number');\n }\n if (this.start < 0) {\n throw new Error('start must be >= zero');\n }\n\n this.pos = this.start;\n }\n\n this.busy = false;\n this._queue = [];\n\n if (this.fd === null) {\n this._open = fs.open;\n this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);\n this.flush();\n }\n }\n}\n","var constants = require('constants')\n\nvar origCwd = process.cwd\nvar cwd = null\n\nvar platform = process.env.GRACEFUL_FS_PLATFORM || process.platform\n\nprocess.cwd = function() {\n if (!cwd)\n cwd = origCwd.call(process)\n return cwd\n}\ntry {\n process.cwd()\n} catch (er) {}\n\n// This check is needed until node.js 12 is required\nif (typeof process.chdir === 'function') {\n var chdir = process.chdir\n process.chdir = function (d) {\n cwd = null\n chdir.call(process, d)\n }\n if (Object.setPrototypeOf) Object.setPrototypeOf(process.chdir, chdir)\n}\n\nmodule.exports = patch\n\nfunction patch (fs) {\n // (re-)implement some things that are known busted or missing.\n\n // lchmod, broken prior to 0.6.2\n // back-port the fix here.\n if (constants.hasOwnProperty('O_SYMLINK') &&\n process.version.match(/^v0\\.6\\.[0-2]|^v0\\.5\\./)) {\n patchLchmod(fs)\n }\n\n // lutimes implementation, or no-op\n if (!fs.lutimes) {\n patchLutimes(fs)\n }\n\n // https://github.com/isaacs/node-graceful-fs/issues/4\n // Chown should not fail on einval or eperm if non-root.\n // It should not fail on enosys ever, as this just indicates\n // that a fs doesn't support the intended operation.\n\n fs.chown = chownFix(fs.chown)\n fs.fchown = chownFix(fs.fchown)\n fs.lchown = chownFix(fs.lchown)\n\n fs.chmod = chmodFix(fs.chmod)\n fs.fchmod = chmodFix(fs.fchmod)\n fs.lchmod = chmodFix(fs.lchmod)\n\n fs.chownSync = chownFixSync(fs.chownSync)\n fs.fchownSync = chownFixSync(fs.fchownSync)\n fs.lchownSync = chownFixSync(fs.lchownSync)\n\n fs.chmodSync = chmodFixSync(fs.chmodSync)\n fs.fchmodSync = chmodFixSync(fs.fchmodSync)\n fs.lchmodSync = chmodFixSync(fs.lchmodSync)\n\n fs.stat = statFix(fs.stat)\n fs.fstat = statFix(fs.fstat)\n fs.lstat = statFix(fs.lstat)\n\n fs.statSync = statFixSync(fs.statSync)\n fs.fstatSync = statFixSync(fs.fstatSync)\n fs.lstatSync = statFixSync(fs.lstatSync)\n\n // if lchmod/lchown do not exist, then make them no-ops\n if (fs.chmod && !fs.lchmod) {\n fs.lchmod = function (path, mode, cb) {\n if (cb) process.nextTick(cb)\n }\n fs.lchmodSync = function () {}\n }\n if (fs.chown && !fs.lchown) {\n fs.lchown = function (path, uid, gid, cb) {\n if (cb) process.nextTick(cb)\n }\n fs.lchownSync = function () {}\n }\n\n // on Windows, A/V software can lock the directory, causing this\n // to fail with an EACCES or EPERM if the directory contains newly\n // created files. Try again on failure, for up to 60 seconds.\n\n // Set the timeout this long because some Windows Anti-Virus, such as Parity\n // bit9, may lock files for up to a minute, causing npm package install\n // failures. Also, take care to yield the scheduler. Windows scheduling gives\n // CPU to a busy looping process, which can cause the program causing the lock\n // contention to be starved of CPU by node, so the contention doesn't resolve.\n if (platform === \"win32\") {\n fs.rename = typeof fs.rename !== 'function' ? fs.rename\n : (function (fs$rename) {\n function rename (from, to, cb) {\n var start = Date.now()\n var backoff = 0;\n fs$rename(from, to, function CB (er) {\n if (er\n && (er.code === \"EACCES\" || er.code === \"EPERM\" || er.code === \"EBUSY\")\n && Date.now() - start < 60000) {\n setTimeout(function() {\n fs.stat(to, function (stater, st) {\n if (stater && stater.code === \"ENOENT\")\n fs$rename(from, to, CB);\n else\n cb(er)\n })\n }, backoff)\n if (backoff < 100)\n backoff += 10;\n return;\n }\n if (cb) cb(er)\n })\n }\n if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename)\n return rename\n })(fs.rename)\n }\n\n // if read() returns EAGAIN, then just try it again.\n fs.read = typeof fs.read !== 'function' ? fs.read\n : (function (fs$read) {\n function read (fd, buffer, offset, length, position, callback_) {\n var callback\n if (callback_ && typeof callback_ === 'function') {\n var eagCounter = 0\n callback = function (er, _, __) {\n if (er && er.code === 'EAGAIN' && eagCounter < 10) {\n eagCounter ++\n return fs$read.call(fs, fd, buffer, offset, length, position, callback)\n }\n callback_.apply(this, arguments)\n }\n }\n return fs$read.call(fs, fd, buffer, offset, length, position, callback)\n }\n\n // This ensures `util.promisify` works as it does for native `fs.read`.\n if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read)\n return read\n })(fs.read)\n\n fs.readSync = typeof fs.readSync !== 'function' ? fs.readSync\n : (function (fs$readSync) { return function (fd, buffer, offset, length, position) {\n var eagCounter = 0\n while (true) {\n try {\n return fs$readSync.call(fs, fd, buffer, offset, length, position)\n } catch (er) {\n if (er.code === 'EAGAIN' && eagCounter < 10) {\n eagCounter ++\n continue\n }\n throw er\n }\n }\n }})(fs.readSync)\n\n function patchLchmod (fs) {\n fs.lchmod = function (path, mode, callback) {\n fs.open( path\n , constants.O_WRONLY | constants.O_SYMLINK\n , mode\n , function (err, fd) {\n if (err) {\n if (callback) callback(err)\n return\n }\n // prefer to return the chmod error, if one occurs,\n // but still try to close, and report closing errors if they occur.\n fs.fchmod(fd, mode, function (err) {\n fs.close(fd, function(err2) {\n if (callback) callback(err || err2)\n })\n })\n })\n }\n\n fs.lchmodSync = function (path, mode) {\n var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)\n\n // prefer to return the chmod error, if one occurs,\n // but still try to close, and report closing errors if they occur.\n var threw = true\n var ret\n try {\n ret = fs.fchmodSync(fd, mode)\n threw = false\n } finally {\n if (threw) {\n try {\n fs.closeSync(fd)\n } catch (er) {}\n } else {\n fs.closeSync(fd)\n }\n }\n return ret\n }\n }\n\n function patchLutimes (fs) {\n if (constants.hasOwnProperty(\"O_SYMLINK\") && fs.futimes) {\n fs.lutimes = function (path, at, mt, cb) {\n fs.open(path, constants.O_SYMLINK, function (er, fd) {\n if (er) {\n if (cb) cb(er)\n return\n }\n fs.futimes(fd, at, mt, function (er) {\n fs.close(fd, function (er2) {\n if (cb) cb(er || er2)\n })\n })\n })\n }\n\n fs.lutimesSync = function (path, at, mt) {\n var fd = fs.openSync(path, constants.O_SYMLINK)\n var ret\n var threw = true\n try {\n ret = fs.futimesSync(fd, at, mt)\n threw = false\n } finally {\n if (threw) {\n try {\n fs.closeSync(fd)\n } catch (er) {}\n } else {\n fs.closeSync(fd)\n }\n }\n return ret\n }\n\n } else if (fs.futimes) {\n fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }\n fs.lutimesSync = function () {}\n }\n }\n\n function chmodFix (orig) {\n if (!orig) return orig\n return function (target, mode, cb) {\n return orig.call(fs, target, mode, function (er) {\n if (chownErOk(er)) er = null\n if (cb) cb.apply(this, arguments)\n })\n }\n }\n\n function chmodFixSync (orig) {\n if (!orig) return orig\n return function (target, mode) {\n try {\n return orig.call(fs, target, mode)\n } catch (er) {\n if (!chownErOk(er)) throw er\n }\n }\n }\n\n\n function chownFix (orig) {\n if (!orig) return orig\n return function (target, uid, gid, cb) {\n return orig.call(fs, target, uid, gid, function (er) {\n if (chownErOk(er)) er = null\n if (cb) cb.apply(this, arguments)\n })\n }\n }\n\n function chownFixSync (orig) {\n if (!orig) return orig\n return function (target, uid, gid) {\n try {\n return orig.call(fs, target, uid, gid)\n } catch (er) {\n if (!chownErOk(er)) throw er\n }\n }\n }\n\n function statFix (orig) {\n if (!orig) return orig\n // Older versions of Node erroneously returned signed integers for\n // uid + gid.\n return function (target, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = null\n }\n function callback (er, stats) {\n if (stats) {\n if (stats.uid < 0) stats.uid += 0x100000000\n if (stats.gid < 0) stats.gid += 0x100000000\n }\n if (cb) cb.apply(this, arguments)\n }\n return options ? orig.call(fs, target, options, callback)\n : orig.call(fs, target, callback)\n }\n }\n\n function statFixSync (orig) {\n if (!orig) return orig\n // Older versions of Node erroneously returned signed integers for\n // uid + gid.\n return function (target, options) {\n var stats = options ? orig.call(fs, target, options)\n : orig.call(fs, target)\n if (stats) {\n if (stats.uid < 0) stats.uid += 0x100000000\n if (stats.gid < 0) stats.gid += 0x100000000\n }\n return stats;\n }\n }\n\n // ENOSYS means that the fs doesn't support the op. Just ignore\n // that, because it doesn't matter.\n //\n // if there's no getuid, or if getuid() is something other\n // than 0, and the error is EINVAL or EPERM, then just ignore\n // it.\n //\n // This specific case is a silent failure in cp, install, tar,\n // and most other unix tools that manage permissions.\n //\n // When running as root, or if other types of errors are\n // encountered, then it's strict.\n function chownErOk (er) {\n if (!er)\n return true\n\n if (er.code === \"ENOSYS\")\n return true\n\n var nonroot = !process.getuid || process.getuid() !== 0\n if (nonroot) {\n if (er.code === \"EINVAL\" || er.code === \"EPERM\")\n return true\n }\n\n return false\n }\n}\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","/* eslint-disable yoda */\n'use strict';\n\nconst isFullwidthCodePoint = codePoint => {\n\tif (Number.isNaN(codePoint)) {\n\t\treturn false;\n\t}\n\n\t// Code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (\n\t\tcodePoint >= 0x1100 && (\n\t\t\tcodePoint <= 0x115F || // Hangul Jamo\n\t\t\tcodePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n\t\t\tcodePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET\n\t\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t\t(0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||\n\t\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t\t(0x3250 <= codePoint && codePoint <= 0x4DBF) ||\n\t\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t\t(0x4E00 <= codePoint && codePoint <= 0xA4C6) ||\n\t\t\t// Hangul Jamo Extended-A\n\t\t\t(0xA960 <= codePoint && codePoint <= 0xA97C) ||\n\t\t\t// Hangul Syllables\n\t\t\t(0xAC00 <= codePoint && codePoint <= 0xD7A3) ||\n\t\t\t// CJK Compatibility Ideographs\n\t\t\t(0xF900 <= codePoint && codePoint <= 0xFAFF) ||\n\t\t\t// Vertical Forms\n\t\t\t(0xFE10 <= codePoint && codePoint <= 0xFE19) ||\n\t\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t\t(0xFE30 <= codePoint && codePoint <= 0xFE6B) ||\n\t\t\t// Halfwidth and Fullwidth Forms\n\t\t\t(0xFF01 <= codePoint && codePoint <= 0xFF60) ||\n\t\t\t(0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||\n\t\t\t// Kana Supplement\n\t\t\t(0x1B000 <= codePoint && codePoint <= 0x1B001) ||\n\t\t\t// Enclosed Ideographic Supplement\n\t\t\t(0x1F200 <= codePoint && codePoint <= 0x1F251) ||\n\t\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t\t(0x20000 <= codePoint && codePoint <= 0x3FFFD)\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nmodule.exports = isFullwidthCodePoint;\nmodule.exports.default = isFullwidthCodePoint;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/*!\n * is-plain-object \n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction isPlainObject(o) {\n var ctor,prot;\n\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n\nexports.isPlainObject = isPlainObject;\n","let _fs\ntry {\n _fs = require('graceful-fs')\n} catch (_) {\n _fs = require('fs')\n}\nconst universalify = require('universalify')\nconst { stringify, stripBom } = require('./utils')\n\nasync function _readFile (file, options = {}) {\n if (typeof options === 'string') {\n options = { encoding: options }\n }\n\n const fs = options.fs || _fs\n\n const shouldThrow = 'throws' in options ? options.throws : true\n\n let data = await universalify.fromCallback(fs.readFile)(file, options)\n\n data = stripBom(data)\n\n let obj\n try {\n obj = JSON.parse(data, options ? options.reviver : null)\n } catch (err) {\n if (shouldThrow) {\n err.message = `${file}: ${err.message}`\n throw err\n } else {\n return null\n }\n }\n\n return obj\n}\n\nconst readFile = universalify.fromPromise(_readFile)\n\nfunction readFileSync (file, options = {}) {\n if (typeof options === 'string') {\n options = { encoding: options }\n }\n\n const fs = options.fs || _fs\n\n const shouldThrow = 'throws' in options ? options.throws : true\n\n try {\n let content = fs.readFileSync(file, options)\n content = stripBom(content)\n return JSON.parse(content, options.reviver)\n } catch (err) {\n if (shouldThrow) {\n err.message = `${file}: ${err.message}`\n throw err\n } else {\n return null\n }\n }\n}\n\nasync function _writeFile (file, obj, options = {}) {\n const fs = options.fs || _fs\n\n const str = stringify(obj, options)\n\n await universalify.fromCallback(fs.writeFile)(file, str, options)\n}\n\nconst writeFile = universalify.fromPromise(_writeFile)\n\nfunction writeFileSync (file, obj, options = {}) {\n const fs = options.fs || _fs\n\n const str = stringify(obj, options)\n // not sure if fs.writeFileSync returns anything, but just in case\n return fs.writeFileSync(file, str, options)\n}\n\nconst jsonfile = {\n readFile,\n readFileSync,\n writeFile,\n writeFileSync\n}\n\nmodule.exports = jsonfile\n","function stringify (obj, { EOL = '\\n', finalEOL = true, replacer = null, spaces } = {}) {\n const EOF = finalEOL ? EOL : ''\n const str = JSON.stringify(obj, replacer, spaces)\n\n return str.replace(/\\n/g, EOL) + EOF\n}\n\nfunction stripBom (content) {\n // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified\n if (Buffer.isBuffer(content)) content = content.toString('utf8')\n return content.replace(/^\\uFEFF/, '')\n}\n\nmodule.exports = { stringify, stripBom }\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as default options for `_.truncate`. */\nvar DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]',\n symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nvar asciiSize = baseProperty('length');\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\n/**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\nfunction stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\n/**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nfunction unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n result++;\n }\n return result;\n}\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n return isObject(value) && objectToString.call(value) == regexpTag;\n}\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Truncates `string` if it's longer than the given maximum string length.\n * The last characters of the truncated string are replaced with the omission\n * string which defaults to \"...\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to truncate.\n * @param {Object} [options={}] The options object.\n * @param {number} [options.length=30] The maximum string length.\n * @param {string} [options.omission='...'] The string to indicate text is omitted.\n * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n * @returns {string} Returns the truncated string.\n * @example\n *\n * _.truncate('hi-diddly-ho there, neighborino');\n * // => 'hi-diddly-ho there, neighbo...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': ' '\n * });\n * // => 'hi-diddly-ho there,...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': /,? +/\n * });\n * // => 'hi-diddly-ho there...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'omission': ' [...]'\n * });\n * // => 'hi-diddly-ho there, neig [...]'\n */\nfunction truncate(string, options) {\n var length = DEFAULT_TRUNC_LENGTH,\n omission = DEFAULT_TRUNC_OMISSION;\n\n if (isObject(options)) {\n var separator = 'separator' in options ? options.separator : separator;\n length = 'length' in options ? toInteger(options.length) : length;\n omission = 'omission' in options ? baseToString(options.omission) : omission;\n }\n string = toString(string);\n\n var strLength = string.length;\n if (hasUnicode(string)) {\n var strSymbols = stringToArray(string);\n strLength = strSymbols.length;\n }\n if (length >= strLength) {\n return string;\n }\n var end = length - stringSize(omission);\n if (end < 1) {\n return omission;\n }\n var result = strSymbols\n ? castSlice(strSymbols, 0, end).join('')\n : string.slice(0, end);\n\n if (separator === undefined) {\n return result + omission;\n }\n if (strSymbols) {\n end += (result.length - end);\n }\n if (isRegExp(separator)) {\n if (string.slice(end).search(separator)) {\n var match,\n substring = result;\n\n if (!separator.global) {\n separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n }\n separator.lastIndex = 0;\n while ((match = separator.exec(substring))) {\n var newEnd = match.index;\n }\n result = result.slice(0, newEnd === undefined ? end : newEnd);\n }\n } else if (string.indexOf(baseToString(separator), end) != end) {\n var index = result.lastIndexOf(separator);\n if (index > -1) {\n result = result.slice(0, index);\n }\n }\n return result + omission;\n}\n\nmodule.exports = truncate;\n","var wrappy = require('wrappy')\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n Object.defineProperty(Function.prototype, 'once', {\n value: function () {\n return once(this)\n },\n configurable: true\n })\n\n Object.defineProperty(Function.prototype, 'onceStrict', {\n value: function () {\n return onceStrict(this)\n },\n configurable: true\n })\n})\n\nfunction once (fn) {\n var f = function () {\n if (f.called) return f.value\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n f.called = false\n return f\n}\n\nfunction onceStrict (fn) {\n var f = function () {\n if (f.called)\n throw new Error(f.onceError)\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n var name = fn.name || 'Function wrapped with `once`'\n f.onceError = name + \" shouldn't be called more than once\"\n f.called = false\n return f\n}\n","'use strict';\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\nconst astralRegex = require('astral-regex');\nconst ansiStyles = require('ansi-styles');\n\nconst ESCAPES = [\n\t'\\u001B',\n\t'\\u009B'\n];\n\nconst wrapAnsi = code => `${ESCAPES[0]}[${code}m`;\n\nconst checkAnsi = (ansiCodes, isEscapes, endAnsiCode) => {\n\tlet output = [];\n\tansiCodes = [...ansiCodes];\n\n\tfor (let ansiCode of ansiCodes) {\n\t\tconst ansiCodeOrigin = ansiCode;\n\t\tif (ansiCode.includes(';')) {\n\t\t\tansiCode = ansiCode.split(';')[0][0] + '0';\n\t\t}\n\n\t\tconst item = ansiStyles.codes.get(Number.parseInt(ansiCode, 10));\n\t\tif (item) {\n\t\t\tconst indexEscape = ansiCodes.indexOf(item.toString());\n\t\t\tif (indexEscape === -1) {\n\t\t\t\toutput.push(wrapAnsi(isEscapes ? item : ansiCodeOrigin));\n\t\t\t} else {\n\t\t\t\tansiCodes.splice(indexEscape, 1);\n\t\t\t}\n\t\t} else if (isEscapes) {\n\t\t\toutput.push(wrapAnsi(0));\n\t\t\tbreak;\n\t\t} else {\n\t\t\toutput.push(wrapAnsi(ansiCodeOrigin));\n\t\t}\n\t}\n\n\tif (isEscapes) {\n\t\toutput = output.filter((element, index) => output.indexOf(element) === index);\n\n\t\tif (endAnsiCode !== undefined) {\n\t\t\tconst fistEscapeCode = wrapAnsi(ansiStyles.codes.get(Number.parseInt(endAnsiCode, 10)));\n\t\t\toutput = output.reduce((current, next) => next === fistEscapeCode ? [next, ...current] : [...current, next], []);\n\t\t}\n\t}\n\n\treturn output.join('');\n};\n\nmodule.exports = (string, begin, end) => {\n\tconst characters = [...string];\n\tconst ansiCodes = [];\n\n\tlet stringEnd = typeof end === 'number' ? end : characters.length;\n\tlet isInsideEscape = false;\n\tlet ansiCode;\n\tlet visible = 0;\n\tlet output = '';\n\n\tfor (const [index, character] of characters.entries()) {\n\t\tlet leftEscape = false;\n\n\t\tif (ESCAPES.includes(character)) {\n\t\t\tconst code = /\\d[^m]*/.exec(string.slice(index, index + 18));\n\t\t\tansiCode = code && code.length > 0 ? code[0] : undefined;\n\n\t\t\tif (visible < stringEnd) {\n\t\t\t\tisInsideEscape = true;\n\n\t\t\t\tif (ansiCode !== undefined) {\n\t\t\t\t\tansiCodes.push(ansiCode);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (isInsideEscape && character === 'm') {\n\t\t\tisInsideEscape = false;\n\t\t\tleftEscape = true;\n\t\t}\n\n\t\tif (!isInsideEscape && !leftEscape) {\n\t\t\tvisible++;\n\t\t}\n\n\t\tif (!astralRegex({exact: true}).test(character) && isFullwidthCodePoint(character.codePointAt())) {\n\t\t\tvisible++;\n\n\t\t\tif (typeof end !== 'number') {\n\t\t\t\tstringEnd++;\n\t\t\t}\n\t\t}\n\n\t\tif (visible > begin && visible <= stringEnd) {\n\t\t\toutput += character;\n\t\t} else if (visible === begin && !isInsideEscape && ansiCode !== undefined) {\n\t\t\toutput = checkAnsi(ansiCodes);\n\t\t} else if (visible >= stringEnd) {\n\t\t\toutput += checkAnsi(ansiCodes, true, ansiCode);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn output;\n};\n","'use strict';\nconst stripAnsi = require('strip-ansi');\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\nconst emojiRegex = require('emoji-regex');\n\nconst stringWidth = string => {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = stripAnsi(string);\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = string.replace(emojiRegex(), ' ');\n\n\tlet width = 0;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst code = string.codePointAt(i);\n\n\t\t// Ignore control characters\n\t\tif (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (code >= 0x300 && code <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Surrogates\n\t\tif (code > 0xFFFF) {\n\t\t\ti++;\n\t\t}\n\n\t\twidth += isFullwidthCodePoint(code) ? 2 : 1;\n\t}\n\n\treturn width;\n};\n\nmodule.exports = stringWidth;\n// TODO: remove this in the next major version\nmodule.exports.default = stringWidth;\n","'use strict';\nconst ansiRegex = require('ansi-regex');\n\nmodule.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;\n","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\n// const octRegex = /0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\n//polyfill\nif (!Number.parseInt && window.parseInt) {\n Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n Number.parseFloat = window.parseFloat;\n}\n\n \nconst consider = {\n hex : true,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true\n //skipLike: /regex/\n};\n\nfunction toNumber(str, options = {}){\n // const options = Object.assign({}, consider);\n // if(opt.leadingZeros === false){\n // options.leadingZeros = false;\n // }else if(opt.hex === false){\n // options.hex = false;\n // }\n\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n // if(trimmedStr === \"0.0\") return 0;\n // else if(trimmedStr === \"+0.0\") return 0;\n // else if(trimmedStr === \"-0.0\") return -0;\n\n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n // } else if (options.parseOct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n }else{\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n if(match){\n const sign = match[1];\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n //trim ending zeros for floating number\n \n const eNotation = match[4] || match[6];\n if(!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== \".\") return str; //-0123\n else if(!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== \".\") return str; //0123\n else{//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const numStr = \"\" + num;\n if(numStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(eNotation){ //given number has enotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n // const decimalPart = match[5].substr(1);\n // const intPart = trimmedStr.substr(0,trimmedStr.indexOf(\".\"));\n\n \n // const p = numStr.indexOf(\".\");\n // const givenIntPart = numStr.substr(0,p);\n // const givenDecPart = numStr.substr(p+1);\n if(numStr === \"0\" && (numTrimmedByZeros === \"\") ) return num; //0.0\n else if(numStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( sign && numStr === \"-\"+numTrimmedByZeros) return num;\n else return str;\n }\n \n if(leadingZeros){\n // if(numTrimmedByZeros === numStr){\n // if(options.leadingZeros) return num;\n // else return str;\n // }else return str;\n if(numTrimmedByZeros === numStr) return num;\n else if(sign+numTrimmedByZeros === numStr) return num;\n else return str;\n }\n\n if(trimmedStr === numStr) return num;\n else if(trimmedStr === sign+numStr) return num;\n // else{\n // //number with +/- sign\n // trimmedStr.test(/[-+][0-9]);\n\n // }\n return str;\n }\n // else if(!eNotation && trimmedStr && trimmedStr !== Number(trimmedStr) ) return str;\n \n }else{ //non-numeric string\n return str;\n }\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n if(numStr && numStr.indexOf(\".\") !== -1){//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if(numStr === \".\") numStr = \"0\";\n else if(numStr[0] === \".\") numStr = \"0\"+numStr;\n else if(numStr[numStr.length-1] === \".\") numStr = numStr.substr(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\nmodule.exports = toNumber\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.alignVerticalRangeContent = exports.wrapRangeContent = void 0;\nconst string_width_1 = __importDefault(require(\"string-width\"));\nconst alignString_1 = require(\"./alignString\");\nconst mapDataUsingRowHeights_1 = require(\"./mapDataUsingRowHeights\");\nconst padTableData_1 = require(\"./padTableData\");\nconst truncateTableData_1 = require(\"./truncateTableData\");\nconst utils_1 = require(\"./utils\");\nconst wrapCell_1 = require(\"./wrapCell\");\n/**\n * Fill content into all cells in range in order to calculate total height\n */\nconst wrapRangeContent = (rangeConfig, rangeWidth, context) => {\n const { topLeft, paddingRight, paddingLeft, truncate, wrapWord, alignment } = rangeConfig;\n const originalContent = context.rows[topLeft.row][topLeft.col];\n const contentWidth = rangeWidth - paddingLeft - paddingRight;\n return (0, wrapCell_1.wrapCell)((0, truncateTableData_1.truncateString)(originalContent, truncate), contentWidth, wrapWord).map((line) => {\n const alignedLine = (0, alignString_1.alignString)(line, contentWidth, alignment);\n return (0, padTableData_1.padString)(alignedLine, paddingLeft, paddingRight);\n });\n};\nexports.wrapRangeContent = wrapRangeContent;\nconst alignVerticalRangeContent = (range, content, context) => {\n const { rows, drawHorizontalLine, rowHeights } = context;\n const { topLeft, bottomRight, verticalAlignment } = range;\n // They are empty before calculateRowHeights function run\n if (rowHeights.length === 0) {\n return [];\n }\n const totalCellHeight = (0, utils_1.sumArray)(rowHeights.slice(topLeft.row, bottomRight.row + 1));\n const totalBorderHeight = bottomRight.row - topLeft.row;\n const hiddenHorizontalBorderCount = (0, utils_1.sequence)(topLeft.row + 1, bottomRight.row).filter((horizontalBorderIndex) => {\n return !drawHorizontalLine(horizontalBorderIndex, rows.length);\n }).length;\n const availableRangeHeight = totalCellHeight + totalBorderHeight - hiddenHorizontalBorderCount;\n return (0, mapDataUsingRowHeights_1.padCellVertically)(content, availableRangeHeight, verticalAlignment).map((line) => {\n if (line.length === 0) {\n return ' '.repeat((0, string_width_1.default)(content[0]));\n }\n return line;\n });\n};\nexports.alignVerticalRangeContent = alignVerticalRangeContent;\n//# sourceMappingURL=alignSpanningCell.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.alignString = void 0;\nconst string_width_1 = __importDefault(require(\"string-width\"));\nconst utils_1 = require(\"./utils\");\nconst alignLeft = (subject, width) => {\n return subject + ' '.repeat(width);\n};\nconst alignRight = (subject, width) => {\n return ' '.repeat(width) + subject;\n};\nconst alignCenter = (subject, width) => {\n return ' '.repeat(Math.floor(width / 2)) + subject + ' '.repeat(Math.ceil(width / 2));\n};\nconst alignJustify = (subject, width) => {\n const spaceSequenceCount = (0, utils_1.countSpaceSequence)(subject);\n if (spaceSequenceCount === 0) {\n return alignLeft(subject, width);\n }\n const addingSpaces = (0, utils_1.distributeUnevenly)(width, spaceSequenceCount);\n if (Math.max(...addingSpaces) > 3) {\n return alignLeft(subject, width);\n }\n let spaceSequenceIndex = 0;\n return subject.replace(/\\s+/g, (groupSpace) => {\n return groupSpace + ' '.repeat(addingSpaces[spaceSequenceIndex++]);\n });\n};\n/**\n * Pads a string to the left and/or right to position the subject\n * text in a desired alignment within a container.\n */\nconst alignString = (subject, containerWidth, alignment) => {\n const subjectWidth = (0, string_width_1.default)(subject);\n if (subjectWidth === containerWidth) {\n return subject;\n }\n if (subjectWidth > containerWidth) {\n throw new Error('Subject parameter value width cannot be greater than the container width.');\n }\n if (subjectWidth === 0) {\n return ' '.repeat(containerWidth);\n }\n const availableWidth = containerWidth - subjectWidth;\n if (alignment === 'left') {\n return alignLeft(subject, availableWidth);\n }\n if (alignment === 'right') {\n return alignRight(subject, availableWidth);\n }\n if (alignment === 'justify') {\n return alignJustify(subject, availableWidth);\n }\n return alignCenter(subject, availableWidth);\n};\nexports.alignString = alignString;\n//# sourceMappingURL=alignString.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.alignTableData = void 0;\nconst alignString_1 = require(\"./alignString\");\nconst alignTableData = (rows, config) => {\n return rows.map((row, rowIndex) => {\n return row.map((cell, cellIndex) => {\n var _a;\n const { width, alignment } = config.columns[cellIndex];\n const containingRange = (_a = config.spanningCellManager) === null || _a === void 0 ? void 0 : _a.getContainingRange({ col: cellIndex,\n row: rowIndex }, { mapped: true });\n if (containingRange) {\n return cell;\n }\n return (0, alignString_1.alignString)(cell, width, alignment);\n });\n });\n};\nexports.alignTableData = alignTableData;\n//# sourceMappingURL=alignTableData.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateCellHeight = void 0;\nconst wrapCell_1 = require(\"./wrapCell\");\n/**\n * Calculates height of cell content in regard to its width and word wrapping.\n */\nconst calculateCellHeight = (value, columnWidth, useWrapWord = false) => {\n return (0, wrapCell_1.wrapCell)(value, columnWidth, useWrapWord).length;\n};\nexports.calculateCellHeight = calculateCellHeight;\n//# sourceMappingURL=calculateCellHeight.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateMaximumColumnWidths = exports.calculateMaximumCellWidth = void 0;\nconst string_width_1 = __importDefault(require(\"string-width\"));\nconst utils_1 = require(\"./utils\");\nconst calculateMaximumCellWidth = (cell) => {\n return Math.max(...cell.split('\\n').map(string_width_1.default));\n};\nexports.calculateMaximumCellWidth = calculateMaximumCellWidth;\n/**\n * Produces an array of values that describe the largest value length (width) in every column.\n */\nconst calculateMaximumColumnWidths = (rows, spanningCellConfigs = []) => {\n const columnWidths = new Array(rows[0].length).fill(0);\n const rangeCoordinates = spanningCellConfigs.map(utils_1.calculateRangeCoordinate);\n const isSpanningCell = (rowIndex, columnIndex) => {\n return rangeCoordinates.some((rangeCoordinate) => {\n return (0, utils_1.isCellInRange)({ col: columnIndex,\n row: rowIndex }, rangeCoordinate);\n });\n };\n rows.forEach((row, rowIndex) => {\n row.forEach((cell, cellIndex) => {\n if (isSpanningCell(rowIndex, cellIndex)) {\n return;\n }\n columnWidths[cellIndex] = Math.max(columnWidths[cellIndex], (0, exports.calculateMaximumCellWidth)(cell));\n });\n });\n return columnWidths;\n};\nexports.calculateMaximumColumnWidths = calculateMaximumColumnWidths;\n//# sourceMappingURL=calculateMaximumColumnWidths.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateOutputColumnWidths = void 0;\nconst calculateOutputColumnWidths = (config) => {\n return config.columns.map((col) => {\n return col.paddingLeft + col.width + col.paddingRight;\n });\n};\nexports.calculateOutputColumnWidths = calculateOutputColumnWidths;\n//# sourceMappingURL=calculateOutputColumnWidths.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateRowHeights = void 0;\nconst calculateCellHeight_1 = require(\"./calculateCellHeight\");\nconst utils_1 = require(\"./utils\");\n/**\n * Produces an array of values that describe the largest value length (height) in every row.\n */\nconst calculateRowHeights = (rows, config) => {\n const rowHeights = [];\n for (const [rowIndex, row] of rows.entries()) {\n let rowHeight = 1;\n row.forEach((cell, cellIndex) => {\n var _a;\n const containingRange = (_a = config.spanningCellManager) === null || _a === void 0 ? void 0 : _a.getContainingRange({ col: cellIndex,\n row: rowIndex });\n if (!containingRange) {\n const cellHeight = (0, calculateCellHeight_1.calculateCellHeight)(cell, config.columns[cellIndex].width, config.columns[cellIndex].wrapWord);\n rowHeight = Math.max(rowHeight, cellHeight);\n return;\n }\n const { topLeft, bottomRight, height } = containingRange;\n // bottom-most cell of a range needs to contain all remain lines of spanning cells\n if (rowIndex === bottomRight.row) {\n const totalOccupiedSpanningCellHeight = (0, utils_1.sumArray)(rowHeights.slice(topLeft.row));\n const totalHorizontalBorderHeight = bottomRight.row - topLeft.row;\n const totalHiddenHorizontalBorderHeight = (0, utils_1.sequence)(topLeft.row + 1, bottomRight.row).filter((horizontalBorderIndex) => {\n var _a;\n /* istanbul ignore next */\n return !((_a = config.drawHorizontalLine) === null || _a === void 0 ? void 0 : _a.call(config, horizontalBorderIndex, rows.length));\n }).length;\n const cellHeight = height - totalOccupiedSpanningCellHeight - totalHorizontalBorderHeight + totalHiddenHorizontalBorderHeight;\n rowHeight = Math.max(rowHeight, cellHeight);\n }\n // otherwise, just depend on other sibling cell heights in the row\n });\n rowHeights.push(rowHeight);\n }\n return rowHeights;\n};\nexports.calculateRowHeights = calculateRowHeights;\n//# sourceMappingURL=calculateRowHeights.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateSpanningCellWidth = void 0;\nconst utils_1 = require(\"./utils\");\nconst calculateSpanningCellWidth = (rangeConfig, dependencies) => {\n const { columnsConfig, drawVerticalLine } = dependencies;\n const { topLeft, bottomRight } = rangeConfig;\n const totalWidth = (0, utils_1.sumArray)(columnsConfig.slice(topLeft.col, bottomRight.col + 1).map(({ width }) => {\n return width;\n }));\n const totalPadding = topLeft.col === bottomRight.col ?\n columnsConfig[topLeft.col].paddingRight +\n columnsConfig[bottomRight.col].paddingLeft :\n (0, utils_1.sumArray)(columnsConfig\n .slice(topLeft.col, bottomRight.col + 1)\n .map(({ paddingLeft, paddingRight }) => {\n return paddingLeft + paddingRight;\n }));\n const totalBorderWidths = bottomRight.col - topLeft.col;\n const totalHiddenVerticalBorders = (0, utils_1.sequence)(topLeft.col + 1, bottomRight.col).filter((verticalBorderIndex) => {\n return !drawVerticalLine(verticalBorderIndex, columnsConfig.length);\n }).length;\n return totalWidth + totalPadding + totalBorderWidths - totalHiddenVerticalBorders;\n};\nexports.calculateSpanningCellWidth = calculateSpanningCellWidth;\n//# sourceMappingURL=calculateSpanningCellWidth.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createStream = void 0;\nconst alignTableData_1 = require(\"./alignTableData\");\nconst calculateRowHeights_1 = require(\"./calculateRowHeights\");\nconst drawBorder_1 = require(\"./drawBorder\");\nconst drawRow_1 = require(\"./drawRow\");\nconst makeStreamConfig_1 = require(\"./makeStreamConfig\");\nconst mapDataUsingRowHeights_1 = require(\"./mapDataUsingRowHeights\");\nconst padTableData_1 = require(\"./padTableData\");\nconst stringifyTableData_1 = require(\"./stringifyTableData\");\nconst truncateTableData_1 = require(\"./truncateTableData\");\nconst utils_1 = require(\"./utils\");\nconst prepareData = (data, config) => {\n let rows = (0, stringifyTableData_1.stringifyTableData)(data);\n rows = (0, truncateTableData_1.truncateTableData)(rows, (0, utils_1.extractTruncates)(config));\n const rowHeights = (0, calculateRowHeights_1.calculateRowHeights)(rows, config);\n rows = (0, mapDataUsingRowHeights_1.mapDataUsingRowHeights)(rows, rowHeights, config);\n rows = (0, alignTableData_1.alignTableData)(rows, config);\n rows = (0, padTableData_1.padTableData)(rows, config);\n return rows;\n};\nconst create = (row, columnWidths, config) => {\n const rows = prepareData([row], config);\n const body = rows.map((literalRow) => {\n return (0, drawRow_1.drawRow)(literalRow, config);\n }).join('');\n let output;\n output = '';\n output += (0, drawBorder_1.drawBorderTop)(columnWidths, config);\n output += body;\n output += (0, drawBorder_1.drawBorderBottom)(columnWidths, config);\n output = output.trimEnd();\n process.stdout.write(output);\n};\nconst append = (row, columnWidths, config) => {\n const rows = prepareData([row], config);\n const body = rows.map((literalRow) => {\n return (0, drawRow_1.drawRow)(literalRow, config);\n }).join('');\n let output = '';\n const bottom = (0, drawBorder_1.drawBorderBottom)(columnWidths, config);\n if (bottom !== '\\n') {\n output = '\\r\\u001B[K';\n }\n output += (0, drawBorder_1.drawBorderJoin)(columnWidths, config);\n output += body;\n output += bottom;\n output = output.trimEnd();\n process.stdout.write(output);\n};\nconst createStream = (userConfig) => {\n const config = (0, makeStreamConfig_1.makeStreamConfig)(userConfig);\n const columnWidths = Object.values(config.columns).map((column) => {\n return column.width + column.paddingLeft + column.paddingRight;\n });\n let empty = true;\n return {\n write: (row) => {\n if (row.length !== config.columnCount) {\n throw new Error('Row cell count does not match the config.columnCount.');\n }\n if (empty) {\n empty = false;\n create(row, columnWidths, config);\n }\n else {\n append(row, columnWidths, config);\n }\n },\n };\n};\nexports.createStream = createStream;\n//# sourceMappingURL=createStream.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createTableBorderGetter = exports.drawBorderBottom = exports.drawBorderJoin = exports.drawBorderTop = exports.drawBorder = exports.createSeparatorGetter = exports.drawBorderSegments = void 0;\nconst drawContent_1 = require(\"./drawContent\");\nconst drawBorderSegments = (columnWidths, parameters) => {\n const { separator, horizontalBorderIndex, spanningCellManager } = parameters;\n return columnWidths.map((columnWidth, columnIndex) => {\n const normalSegment = separator.body.repeat(columnWidth);\n if (horizontalBorderIndex === undefined) {\n return normalSegment;\n }\n /* istanbul ignore next */\n const range = spanningCellManager === null || spanningCellManager === void 0 ? void 0 : spanningCellManager.getContainingRange({ col: columnIndex,\n row: horizontalBorderIndex });\n if (!range) {\n return normalSegment;\n }\n const { topLeft } = range;\n // draw border segments as usual for top border of spanning cell\n if (horizontalBorderIndex === topLeft.row) {\n return normalSegment;\n }\n // if for first column/row of spanning cell, just skip\n if (columnIndex !== topLeft.col) {\n return '';\n }\n return range.extractBorderContent(horizontalBorderIndex);\n });\n};\nexports.drawBorderSegments = drawBorderSegments;\nconst createSeparatorGetter = (dependencies) => {\n const { separator, spanningCellManager, horizontalBorderIndex, rowCount } = dependencies;\n // eslint-disable-next-line complexity\n return (verticalBorderIndex, columnCount) => {\n const inSameRange = spanningCellManager === null || spanningCellManager === void 0 ? void 0 : spanningCellManager.inSameRange;\n if (horizontalBorderIndex !== undefined && inSameRange) {\n const topCell = { col: verticalBorderIndex,\n row: horizontalBorderIndex - 1 };\n const leftCell = { col: verticalBorderIndex - 1,\n row: horizontalBorderIndex };\n const oppositeCell = { col: verticalBorderIndex - 1,\n row: horizontalBorderIndex - 1 };\n const currentCell = { col: verticalBorderIndex,\n row: horizontalBorderIndex };\n const pairs = [\n [oppositeCell, topCell],\n [topCell, currentCell],\n [currentCell, leftCell],\n [leftCell, oppositeCell],\n ];\n // left side of horizontal border\n if (verticalBorderIndex === 0) {\n if (inSameRange(currentCell, topCell) && separator.bodyJoinOuter) {\n return separator.bodyJoinOuter;\n }\n return separator.left;\n }\n // right side of horizontal border\n if (verticalBorderIndex === columnCount) {\n if (inSameRange(oppositeCell, leftCell) && separator.bodyJoinOuter) {\n return separator.bodyJoinOuter;\n }\n return separator.right;\n }\n // top horizontal border\n if (horizontalBorderIndex === 0) {\n if (inSameRange(currentCell, leftCell)) {\n return separator.body;\n }\n return separator.join;\n }\n // bottom horizontal border\n if (horizontalBorderIndex === rowCount) {\n if (inSameRange(topCell, oppositeCell)) {\n return separator.body;\n }\n return separator.join;\n }\n const sameRangeCount = pairs.map((pair) => {\n return inSameRange(...pair);\n }).filter(Boolean).length;\n // four cells are belongs to different spanning cells\n if (sameRangeCount === 0) {\n return separator.join;\n }\n // belong to one spanning cell\n if (sameRangeCount === 4) {\n return '';\n }\n // belongs to two spanning cell\n if (sameRangeCount === 2) {\n if (inSameRange(...pairs[1]) && inSameRange(...pairs[3]) && separator.bodyJoinInner) {\n return separator.bodyJoinInner;\n }\n return separator.body;\n }\n /* istanbul ignore next */\n if (sameRangeCount === 1) {\n if (!separator.joinRight || !separator.joinLeft || !separator.joinUp || !separator.joinDown) {\n throw new Error(`Can not get border separator for position [${horizontalBorderIndex}, ${verticalBorderIndex}]`);\n }\n if (inSameRange(...pairs[0])) {\n return separator.joinDown;\n }\n if (inSameRange(...pairs[1])) {\n return separator.joinLeft;\n }\n if (inSameRange(...pairs[2])) {\n return separator.joinUp;\n }\n return separator.joinRight;\n }\n /* istanbul ignore next */\n throw new Error('Invalid case');\n }\n if (verticalBorderIndex === 0) {\n return separator.left;\n }\n if (verticalBorderIndex === columnCount) {\n return separator.right;\n }\n return separator.join;\n };\n};\nexports.createSeparatorGetter = createSeparatorGetter;\nconst drawBorder = (columnWidths, parameters) => {\n const borderSegments = (0, exports.drawBorderSegments)(columnWidths, parameters);\n const { drawVerticalLine, horizontalBorderIndex, spanningCellManager } = parameters;\n return (0, drawContent_1.drawContent)({\n contents: borderSegments,\n drawSeparator: drawVerticalLine,\n elementType: 'border',\n rowIndex: horizontalBorderIndex,\n separatorGetter: (0, exports.createSeparatorGetter)(parameters),\n spanningCellManager,\n }) + '\\n';\n};\nexports.drawBorder = drawBorder;\nconst drawBorderTop = (columnWidths, parameters) => {\n const { border } = parameters;\n const result = (0, exports.drawBorder)(columnWidths, {\n ...parameters,\n separator: {\n body: border.topBody,\n join: border.topJoin,\n left: border.topLeft,\n right: border.topRight,\n },\n });\n if (result === '\\n') {\n return '';\n }\n return result;\n};\nexports.drawBorderTop = drawBorderTop;\nconst drawBorderJoin = (columnWidths, parameters) => {\n const { border } = parameters;\n return (0, exports.drawBorder)(columnWidths, {\n ...parameters,\n separator: {\n body: border.joinBody,\n bodyJoinInner: border.bodyJoin,\n bodyJoinOuter: border.bodyLeft,\n join: border.joinJoin,\n joinDown: border.joinMiddleDown,\n joinLeft: border.joinMiddleLeft,\n joinRight: border.joinMiddleRight,\n joinUp: border.joinMiddleUp,\n left: border.joinLeft,\n right: border.joinRight,\n },\n });\n};\nexports.drawBorderJoin = drawBorderJoin;\nconst drawBorderBottom = (columnWidths, parameters) => {\n const { border } = parameters;\n return (0, exports.drawBorder)(columnWidths, {\n ...parameters,\n separator: {\n body: border.bottomBody,\n join: border.bottomJoin,\n left: border.bottomLeft,\n right: border.bottomRight,\n },\n });\n};\nexports.drawBorderBottom = drawBorderBottom;\nconst createTableBorderGetter = (columnWidths, parameters) => {\n return (index, size) => {\n const drawBorderParameters = { ...parameters,\n horizontalBorderIndex: index };\n if (index === 0) {\n return (0, exports.drawBorderTop)(columnWidths, drawBorderParameters);\n }\n else if (index === size) {\n return (0, exports.drawBorderBottom)(columnWidths, drawBorderParameters);\n }\n return (0, exports.drawBorderJoin)(columnWidths, drawBorderParameters);\n };\n};\nexports.createTableBorderGetter = createTableBorderGetter;\n//# sourceMappingURL=drawBorder.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.drawContent = void 0;\nconst drawContent = (parameters) => {\n const { contents, separatorGetter, drawSeparator, spanningCellManager, rowIndex, elementType } = parameters;\n const contentSize = contents.length;\n const result = [];\n if (drawSeparator(0, contentSize)) {\n result.push(separatorGetter(0, contentSize));\n }\n contents.forEach((content, contentIndex) => {\n if (!elementType || elementType === 'border' || elementType === 'row') {\n result.push(content);\n }\n if (elementType === 'cell' && rowIndex === undefined) {\n result.push(content);\n }\n if (elementType === 'cell' && rowIndex !== undefined) {\n /* istanbul ignore next */\n const containingRange = spanningCellManager === null || spanningCellManager === void 0 ? void 0 : spanningCellManager.getContainingRange({ col: contentIndex,\n row: rowIndex });\n // when drawing content row, just add a cell when it is a normal cell\n // or belongs to first column of spanning cell\n if (!containingRange || contentIndex === containingRange.topLeft.col) {\n result.push(content);\n }\n }\n // Only append the middle separator if the content is not the last\n if (contentIndex + 1 < contentSize && drawSeparator(contentIndex + 1, contentSize)) {\n const separator = separatorGetter(contentIndex + 1, contentSize);\n if (elementType === 'cell' && rowIndex !== undefined) {\n const currentCell = { col: contentIndex + 1,\n row: rowIndex };\n /* istanbul ignore next */\n const containingRange = spanningCellManager === null || spanningCellManager === void 0 ? void 0 : spanningCellManager.getContainingRange(currentCell);\n if (!containingRange || containingRange.topLeft.col === currentCell.col) {\n result.push(separator);\n }\n }\n else {\n result.push(separator);\n }\n }\n });\n if (drawSeparator(contentSize, contentSize)) {\n result.push(separatorGetter(contentSize, contentSize));\n }\n return result.join('');\n};\nexports.drawContent = drawContent;\n//# sourceMappingURL=drawContent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.drawRow = void 0;\nconst drawContent_1 = require(\"./drawContent\");\nconst drawRow = (row, config) => {\n const { border, drawVerticalLine, rowIndex, spanningCellManager } = config;\n return (0, drawContent_1.drawContent)({\n contents: row,\n drawSeparator: drawVerticalLine,\n elementType: 'cell',\n rowIndex,\n separatorGetter: (index, columnCount) => {\n if (index === 0) {\n return border.bodyLeft;\n }\n if (index === columnCount) {\n return border.bodyRight;\n }\n return border.bodyJoin;\n },\n spanningCellManager,\n }) + '\\n';\n};\nexports.drawRow = drawRow;\n//# sourceMappingURL=drawRow.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.drawTable = void 0;\nconst drawBorder_1 = require(\"./drawBorder\");\nconst drawContent_1 = require(\"./drawContent\");\nconst drawRow_1 = require(\"./drawRow\");\nconst utils_1 = require(\"./utils\");\nconst drawTable = (rows, outputColumnWidths, rowHeights, config) => {\n const { drawHorizontalLine, singleLine, } = config;\n const contents = (0, utils_1.groupBySizes)(rows, rowHeights).map((group, groupIndex) => {\n return group.map((row) => {\n return (0, drawRow_1.drawRow)(row, { ...config,\n rowIndex: groupIndex });\n }).join('');\n });\n return (0, drawContent_1.drawContent)({ contents,\n drawSeparator: (index, size) => {\n // Top/bottom border\n if (index === 0 || index === size) {\n return drawHorizontalLine(index, size);\n }\n return !singleLine && drawHorizontalLine(index, size);\n },\n elementType: 'row',\n rowIndex: -1,\n separatorGetter: (0, drawBorder_1.createTableBorderGetter)(outputColumnWidths, { ...config,\n rowCount: contents.length }),\n spanningCellManager: config.spanningCellManager });\n};\nexports.drawTable = drawTable;\n//# sourceMappingURL=drawTable.js.map","\"use strict\";\nexports[\"config.json\"] = validate43;\nconst schema13 = {\n \"$id\": \"config.json\",\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"border\": {\n \"$ref\": \"shared.json#/definitions/borders\"\n },\n \"header\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\"\n },\n \"alignment\": {\n \"$ref\": \"shared.json#/definitions/alignment\"\n },\n \"wrapWord\": {\n \"type\": \"boolean\"\n },\n \"truncate\": {\n \"type\": \"integer\"\n },\n \"paddingLeft\": {\n \"type\": \"integer\"\n },\n \"paddingRight\": {\n \"type\": \"integer\"\n }\n },\n \"required\": [\"content\"],\n \"additionalProperties\": false\n },\n \"columns\": {\n \"$ref\": \"shared.json#/definitions/columns\"\n },\n \"columnDefault\": {\n \"$ref\": \"shared.json#/definitions/column\"\n },\n \"drawVerticalLine\": {\n \"typeof\": \"function\"\n },\n \"drawHorizontalLine\": {\n \"typeof\": \"function\"\n },\n \"singleLine\": {\n \"typeof\": \"boolean\"\n },\n \"spanningCells\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"col\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"row\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"colSpan\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"rowSpan\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"alignment\": {\n \"$ref\": \"shared.json#/definitions/alignment\"\n },\n \"verticalAlignment\": {\n \"$ref\": \"shared.json#/definitions/verticalAlignment\"\n },\n \"wrapWord\": {\n \"type\": \"boolean\"\n },\n \"truncate\": {\n \"type\": \"integer\"\n },\n \"paddingLeft\": {\n \"type\": \"integer\"\n },\n \"paddingRight\": {\n \"type\": \"integer\"\n }\n },\n \"required\": [\"row\", \"col\"],\n \"additionalProperties\": false\n }\n }\n },\n \"additionalProperties\": false\n};\nconst schema15 = {\n \"type\": \"object\",\n \"properties\": {\n \"topBody\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"topJoin\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"topLeft\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"topRight\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bottomBody\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bottomJoin\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bottomLeft\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bottomRight\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bodyLeft\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bodyRight\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"bodyJoin\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"headerJoin\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinBody\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinLeft\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinRight\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinJoin\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinMiddleUp\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinMiddleDown\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinMiddleLeft\": {\n \"$ref\": \"#/definitions/border\"\n },\n \"joinMiddleRight\": {\n \"$ref\": \"#/definitions/border\"\n }\n },\n \"additionalProperties\": false\n};\nconst func8 = Object.prototype.hasOwnProperty;\nconst schema16 = {\n \"type\": \"string\"\n};\nfunction validate46(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (typeof data !== \"string\") {\n const err0 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n validate46.errors = vErrors;\n return errors === 0;\n}\nfunction validate45(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(func8.call(schema15.properties, key0))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.topBody !== undefined) {\n if (!(validate46(data.topBody, {\n instancePath: instancePath + \"/topBody\",\n parentData: data,\n parentDataProperty: \"topBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topJoin !== undefined) {\n if (!(validate46(data.topJoin, {\n instancePath: instancePath + \"/topJoin\",\n parentData: data,\n parentDataProperty: \"topJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topLeft !== undefined) {\n if (!(validate46(data.topLeft, {\n instancePath: instancePath + \"/topLeft\",\n parentData: data,\n parentDataProperty: \"topLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topRight !== undefined) {\n if (!(validate46(data.topRight, {\n instancePath: instancePath + \"/topRight\",\n parentData: data,\n parentDataProperty: \"topRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomBody !== undefined) {\n if (!(validate46(data.bottomBody, {\n instancePath: instancePath + \"/bottomBody\",\n parentData: data,\n parentDataProperty: \"bottomBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomJoin !== undefined) {\n if (!(validate46(data.bottomJoin, {\n instancePath: instancePath + \"/bottomJoin\",\n parentData: data,\n parentDataProperty: \"bottomJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomLeft !== undefined) {\n if (!(validate46(data.bottomLeft, {\n instancePath: instancePath + \"/bottomLeft\",\n parentData: data,\n parentDataProperty: \"bottomLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomRight !== undefined) {\n if (!(validate46(data.bottomRight, {\n instancePath: instancePath + \"/bottomRight\",\n parentData: data,\n parentDataProperty: \"bottomRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyLeft !== undefined) {\n if (!(validate46(data.bodyLeft, {\n instancePath: instancePath + \"/bodyLeft\",\n parentData: data,\n parentDataProperty: \"bodyLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyRight !== undefined) {\n if (!(validate46(data.bodyRight, {\n instancePath: instancePath + \"/bodyRight\",\n parentData: data,\n parentDataProperty: \"bodyRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyJoin !== undefined) {\n if (!(validate46(data.bodyJoin, {\n instancePath: instancePath + \"/bodyJoin\",\n parentData: data,\n parentDataProperty: \"bodyJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.headerJoin !== undefined) {\n if (!(validate46(data.headerJoin, {\n instancePath: instancePath + \"/headerJoin\",\n parentData: data,\n parentDataProperty: \"headerJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinBody !== undefined) {\n if (!(validate46(data.joinBody, {\n instancePath: instancePath + \"/joinBody\",\n parentData: data,\n parentDataProperty: \"joinBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinLeft !== undefined) {\n if (!(validate46(data.joinLeft, {\n instancePath: instancePath + \"/joinLeft\",\n parentData: data,\n parentDataProperty: \"joinLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinRight !== undefined) {\n if (!(validate46(data.joinRight, {\n instancePath: instancePath + \"/joinRight\",\n parentData: data,\n parentDataProperty: \"joinRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinJoin !== undefined) {\n if (!(validate46(data.joinJoin, {\n instancePath: instancePath + \"/joinJoin\",\n parentData: data,\n parentDataProperty: \"joinJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleUp !== undefined) {\n if (!(validate46(data.joinMiddleUp, {\n instancePath: instancePath + \"/joinMiddleUp\",\n parentData: data,\n parentDataProperty: \"joinMiddleUp\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleDown !== undefined) {\n if (!(validate46(data.joinMiddleDown, {\n instancePath: instancePath + \"/joinMiddleDown\",\n parentData: data,\n parentDataProperty: \"joinMiddleDown\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleLeft !== undefined) {\n if (!(validate46(data.joinMiddleLeft, {\n instancePath: instancePath + \"/joinMiddleLeft\",\n parentData: data,\n parentDataProperty: \"joinMiddleLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleRight !== undefined) {\n if (!(validate46(data.joinMiddleRight, {\n instancePath: instancePath + \"/joinMiddleRight\",\n parentData: data,\n parentDataProperty: \"joinMiddleRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n }\n else {\n const err1 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate45.errors = vErrors;\n return errors === 0;\n}\nconst schema17 = {\n \"type\": \"string\",\n \"enum\": [\"left\", \"right\", \"center\", \"justify\"]\n};\nconst func0 = require(\"ajv/dist/runtime/equal\").default;\nfunction validate68(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (typeof data !== \"string\") {\n const err0 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n if (!((((data === \"left\") || (data === \"right\")) || (data === \"center\")) || (data === \"justify\"))) {\n const err1 = {\n instancePath,\n schemaPath: \"#/enum\",\n keyword: \"enum\",\n params: {\n allowedValues: schema17.enum\n },\n message: \"must be equal to one of the allowed values\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate68.errors = vErrors;\n return errors === 0;\n}\nconst schema18 = {\n \"oneOf\": [{\n \"type\": \"object\",\n \"patternProperties\": {\n \"^[0-9]+$\": {\n \"$ref\": \"#/definitions/column\"\n }\n },\n \"additionalProperties\": false\n }, {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/column\"\n }\n }]\n};\nconst pattern0 = new RegExp(\"^[0-9]+$\", \"u\");\nconst schema19 = {\n \"type\": \"object\",\n \"properties\": {\n \"alignment\": {\n \"$ref\": \"#/definitions/alignment\"\n },\n \"verticalAlignment\": {\n \"$ref\": \"#/definitions/verticalAlignment\"\n },\n \"width\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"wrapWord\": {\n \"type\": \"boolean\"\n },\n \"truncate\": {\n \"type\": \"integer\"\n },\n \"paddingLeft\": {\n \"type\": \"integer\"\n },\n \"paddingRight\": {\n \"type\": \"integer\"\n }\n },\n \"additionalProperties\": false\n};\nfunction validate72(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (typeof data !== \"string\") {\n const err0 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n if (!((((data === \"left\") || (data === \"right\")) || (data === \"center\")) || (data === \"justify\"))) {\n const err1 = {\n instancePath,\n schemaPath: \"#/enum\",\n keyword: \"enum\",\n params: {\n allowedValues: schema17.enum\n },\n message: \"must be equal to one of the allowed values\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate72.errors = vErrors;\n return errors === 0;\n}\nconst schema21 = {\n \"type\": \"string\",\n \"enum\": [\"top\", \"middle\", \"bottom\"]\n};\nfunction validate74(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (typeof data !== \"string\") {\n const err0 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n if (!(((data === \"top\") || (data === \"middle\")) || (data === \"bottom\"))) {\n const err1 = {\n instancePath,\n schemaPath: \"#/enum\",\n keyword: \"enum\",\n params: {\n allowedValues: schema21.enum\n },\n message: \"must be equal to one of the allowed values\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate74.errors = vErrors;\n return errors === 0;\n}\nfunction validate71(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(((((((key0 === \"alignment\") || (key0 === \"verticalAlignment\")) || (key0 === \"width\")) || (key0 === \"wrapWord\")) || (key0 === \"truncate\")) || (key0 === \"paddingLeft\")) || (key0 === \"paddingRight\"))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.alignment !== undefined) {\n if (!(validate72(data.alignment, {\n instancePath: instancePath + \"/alignment\",\n parentData: data,\n parentDataProperty: \"alignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate72.errors : vErrors.concat(validate72.errors);\n errors = vErrors.length;\n }\n }\n if (data.verticalAlignment !== undefined) {\n if (!(validate74(data.verticalAlignment, {\n instancePath: instancePath + \"/verticalAlignment\",\n parentData: data,\n parentDataProperty: \"verticalAlignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate74.errors : vErrors.concat(validate74.errors);\n errors = vErrors.length;\n }\n }\n if (data.width !== undefined) {\n let data2 = data.width;\n if (!(((typeof data2 == \"number\") && (!(data2 % 1) && !isNaN(data2))) && (isFinite(data2)))) {\n const err1 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n if ((typeof data2 == \"number\") && (isFinite(data2))) {\n if (data2 < 1 || isNaN(data2)) {\n const err2 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n }\n }\n if (data.wrapWord !== undefined) {\n if (typeof data.wrapWord !== \"boolean\") {\n const err3 = {\n instancePath: instancePath + \"/wrapWord\",\n schemaPath: \"#/properties/wrapWord/type\",\n keyword: \"type\",\n params: {\n type: \"boolean\"\n },\n message: \"must be boolean\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n }\n if (data.truncate !== undefined) {\n let data4 = data.truncate;\n if (!(((typeof data4 == \"number\") && (!(data4 % 1) && !isNaN(data4))) && (isFinite(data4)))) {\n const err4 = {\n instancePath: instancePath + \"/truncate\",\n schemaPath: \"#/properties/truncate/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err4];\n }\n else {\n vErrors.push(err4);\n }\n errors++;\n }\n }\n if (data.paddingLeft !== undefined) {\n let data5 = data.paddingLeft;\n if (!(((typeof data5 == \"number\") && (!(data5 % 1) && !isNaN(data5))) && (isFinite(data5)))) {\n const err5 = {\n instancePath: instancePath + \"/paddingLeft\",\n schemaPath: \"#/properties/paddingLeft/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err5];\n }\n else {\n vErrors.push(err5);\n }\n errors++;\n }\n }\n if (data.paddingRight !== undefined) {\n let data6 = data.paddingRight;\n if (!(((typeof data6 == \"number\") && (!(data6 % 1) && !isNaN(data6))) && (isFinite(data6)))) {\n const err6 = {\n instancePath: instancePath + \"/paddingRight\",\n schemaPath: \"#/properties/paddingRight/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err6];\n }\n else {\n vErrors.push(err6);\n }\n errors++;\n }\n }\n }\n else {\n const err7 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err7];\n }\n else {\n vErrors.push(err7);\n }\n errors++;\n }\n validate71.errors = vErrors;\n return errors === 0;\n}\nfunction validate70(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n const _errs0 = errors;\n let valid0 = false;\n let passing0 = null;\n const _errs1 = errors;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(pattern0.test(key0))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/oneOf/0/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n for (const key1 in data) {\n if (pattern0.test(key1)) {\n if (!(validate71(data[key1], {\n instancePath: instancePath + \"/\" + key1.replace(/~/g, \"~0\").replace(/\\//g, \"~1\"),\n parentData: data,\n parentDataProperty: key1,\n rootData\n }))) {\n vErrors = vErrors === null ? validate71.errors : vErrors.concat(validate71.errors);\n errors = vErrors.length;\n }\n }\n }\n }\n else {\n const err1 = {\n instancePath,\n schemaPath: \"#/oneOf/0/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n var _valid0 = _errs1 === errors;\n if (_valid0) {\n valid0 = true;\n passing0 = 0;\n }\n const _errs5 = errors;\n if (Array.isArray(data)) {\n const len0 = data.length;\n for (let i0 = 0; i0 < len0; i0++) {\n if (!(validate71(data[i0], {\n instancePath: instancePath + \"/\" + i0,\n parentData: data,\n parentDataProperty: i0,\n rootData\n }))) {\n vErrors = vErrors === null ? validate71.errors : vErrors.concat(validate71.errors);\n errors = vErrors.length;\n }\n }\n }\n else {\n const err2 = {\n instancePath,\n schemaPath: \"#/oneOf/1/type\",\n keyword: \"type\",\n params: {\n type: \"array\"\n },\n message: \"must be array\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n var _valid0 = _errs5 === errors;\n if (_valid0 && valid0) {\n valid0 = false;\n passing0 = [passing0, 1];\n }\n else {\n if (_valid0) {\n valid0 = true;\n passing0 = 1;\n }\n }\n if (!valid0) {\n const err3 = {\n instancePath,\n schemaPath: \"#/oneOf\",\n keyword: \"oneOf\",\n params: {\n passingSchemas: passing0\n },\n message: \"must match exactly one schema in oneOf\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n else {\n errors = _errs0;\n if (vErrors !== null) {\n if (_errs0) {\n vErrors.length = _errs0;\n }\n else {\n vErrors = null;\n }\n }\n }\n validate70.errors = vErrors;\n return errors === 0;\n}\nfunction validate79(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(((((((key0 === \"alignment\") || (key0 === \"verticalAlignment\")) || (key0 === \"width\")) || (key0 === \"wrapWord\")) || (key0 === \"truncate\")) || (key0 === \"paddingLeft\")) || (key0 === \"paddingRight\"))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.alignment !== undefined) {\n if (!(validate72(data.alignment, {\n instancePath: instancePath + \"/alignment\",\n parentData: data,\n parentDataProperty: \"alignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate72.errors : vErrors.concat(validate72.errors);\n errors = vErrors.length;\n }\n }\n if (data.verticalAlignment !== undefined) {\n if (!(validate74(data.verticalAlignment, {\n instancePath: instancePath + \"/verticalAlignment\",\n parentData: data,\n parentDataProperty: \"verticalAlignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate74.errors : vErrors.concat(validate74.errors);\n errors = vErrors.length;\n }\n }\n if (data.width !== undefined) {\n let data2 = data.width;\n if (!(((typeof data2 == \"number\") && (!(data2 % 1) && !isNaN(data2))) && (isFinite(data2)))) {\n const err1 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n if ((typeof data2 == \"number\") && (isFinite(data2))) {\n if (data2 < 1 || isNaN(data2)) {\n const err2 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n }\n }\n if (data.wrapWord !== undefined) {\n if (typeof data.wrapWord !== \"boolean\") {\n const err3 = {\n instancePath: instancePath + \"/wrapWord\",\n schemaPath: \"#/properties/wrapWord/type\",\n keyword: \"type\",\n params: {\n type: \"boolean\"\n },\n message: \"must be boolean\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n }\n if (data.truncate !== undefined) {\n let data4 = data.truncate;\n if (!(((typeof data4 == \"number\") && (!(data4 % 1) && !isNaN(data4))) && (isFinite(data4)))) {\n const err4 = {\n instancePath: instancePath + \"/truncate\",\n schemaPath: \"#/properties/truncate/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err4];\n }\n else {\n vErrors.push(err4);\n }\n errors++;\n }\n }\n if (data.paddingLeft !== undefined) {\n let data5 = data.paddingLeft;\n if (!(((typeof data5 == \"number\") && (!(data5 % 1) && !isNaN(data5))) && (isFinite(data5)))) {\n const err5 = {\n instancePath: instancePath + \"/paddingLeft\",\n schemaPath: \"#/properties/paddingLeft/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err5];\n }\n else {\n vErrors.push(err5);\n }\n errors++;\n }\n }\n if (data.paddingRight !== undefined) {\n let data6 = data.paddingRight;\n if (!(((typeof data6 == \"number\") && (!(data6 % 1) && !isNaN(data6))) && (isFinite(data6)))) {\n const err6 = {\n instancePath: instancePath + \"/paddingRight\",\n schemaPath: \"#/properties/paddingRight/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err6];\n }\n else {\n vErrors.push(err6);\n }\n errors++;\n }\n }\n }\n else {\n const err7 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err7];\n }\n else {\n vErrors.push(err7);\n }\n errors++;\n }\n validate79.errors = vErrors;\n return errors === 0;\n}\nfunction validate84(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (typeof data !== \"string\") {\n const err0 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n if (!(((data === \"top\") || (data === \"middle\")) || (data === \"bottom\"))) {\n const err1 = {\n instancePath,\n schemaPath: \"#/enum\",\n keyword: \"enum\",\n params: {\n allowedValues: schema21.enum\n },\n message: \"must be equal to one of the allowed values\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate84.errors = vErrors;\n return errors === 0;\n}\nfunction validate43(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n /*# sourceURL=\"config.json\" */ ;\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!((((((((key0 === \"border\") || (key0 === \"header\")) || (key0 === \"columns\")) || (key0 === \"columnDefault\")) || (key0 === \"drawVerticalLine\")) || (key0 === \"drawHorizontalLine\")) || (key0 === \"singleLine\")) || (key0 === \"spanningCells\"))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.border !== undefined) {\n if (!(validate45(data.border, {\n instancePath: instancePath + \"/border\",\n parentData: data,\n parentDataProperty: \"border\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate45.errors : vErrors.concat(validate45.errors);\n errors = vErrors.length;\n }\n }\n if (data.header !== undefined) {\n let data1 = data.header;\n if (data1 && typeof data1 == \"object\" && !Array.isArray(data1)) {\n if (data1.content === undefined) {\n const err1 = {\n instancePath: instancePath + \"/header\",\n schemaPath: \"#/properties/header/required\",\n keyword: \"required\",\n params: {\n missingProperty: \"content\"\n },\n message: \"must have required property '\" + \"content\" + \"'\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n for (const key1 in data1) {\n if (!((((((key1 === \"content\") || (key1 === \"alignment\")) || (key1 === \"wrapWord\")) || (key1 === \"truncate\")) || (key1 === \"paddingLeft\")) || (key1 === \"paddingRight\"))) {\n const err2 = {\n instancePath: instancePath + \"/header\",\n schemaPath: \"#/properties/header/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key1\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n }\n if (data1.content !== undefined) {\n if (typeof data1.content !== \"string\") {\n const err3 = {\n instancePath: instancePath + \"/header/content\",\n schemaPath: \"#/properties/header/properties/content/type\",\n keyword: \"type\",\n params: {\n type: \"string\"\n },\n message: \"must be string\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n }\n if (data1.alignment !== undefined) {\n if (!(validate68(data1.alignment, {\n instancePath: instancePath + \"/header/alignment\",\n parentData: data1,\n parentDataProperty: \"alignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate68.errors : vErrors.concat(validate68.errors);\n errors = vErrors.length;\n }\n }\n if (data1.wrapWord !== undefined) {\n if (typeof data1.wrapWord !== \"boolean\") {\n const err4 = {\n instancePath: instancePath + \"/header/wrapWord\",\n schemaPath: \"#/properties/header/properties/wrapWord/type\",\n keyword: \"type\",\n params: {\n type: \"boolean\"\n },\n message: \"must be boolean\"\n };\n if (vErrors === null) {\n vErrors = [err4];\n }\n else {\n vErrors.push(err4);\n }\n errors++;\n }\n }\n if (data1.truncate !== undefined) {\n let data5 = data1.truncate;\n if (!(((typeof data5 == \"number\") && (!(data5 % 1) && !isNaN(data5))) && (isFinite(data5)))) {\n const err5 = {\n instancePath: instancePath + \"/header/truncate\",\n schemaPath: \"#/properties/header/properties/truncate/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err5];\n }\n else {\n vErrors.push(err5);\n }\n errors++;\n }\n }\n if (data1.paddingLeft !== undefined) {\n let data6 = data1.paddingLeft;\n if (!(((typeof data6 == \"number\") && (!(data6 % 1) && !isNaN(data6))) && (isFinite(data6)))) {\n const err6 = {\n instancePath: instancePath + \"/header/paddingLeft\",\n schemaPath: \"#/properties/header/properties/paddingLeft/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err6];\n }\n else {\n vErrors.push(err6);\n }\n errors++;\n }\n }\n if (data1.paddingRight !== undefined) {\n let data7 = data1.paddingRight;\n if (!(((typeof data7 == \"number\") && (!(data7 % 1) && !isNaN(data7))) && (isFinite(data7)))) {\n const err7 = {\n instancePath: instancePath + \"/header/paddingRight\",\n schemaPath: \"#/properties/header/properties/paddingRight/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err7];\n }\n else {\n vErrors.push(err7);\n }\n errors++;\n }\n }\n }\n else {\n const err8 = {\n instancePath: instancePath + \"/header\",\n schemaPath: \"#/properties/header/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err8];\n }\n else {\n vErrors.push(err8);\n }\n errors++;\n }\n }\n if (data.columns !== undefined) {\n if (!(validate70(data.columns, {\n instancePath: instancePath + \"/columns\",\n parentData: data,\n parentDataProperty: \"columns\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate70.errors : vErrors.concat(validate70.errors);\n errors = vErrors.length;\n }\n }\n if (data.columnDefault !== undefined) {\n if (!(validate79(data.columnDefault, {\n instancePath: instancePath + \"/columnDefault\",\n parentData: data,\n parentDataProperty: \"columnDefault\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate79.errors : vErrors.concat(validate79.errors);\n errors = vErrors.length;\n }\n }\n if (data.drawVerticalLine !== undefined) {\n if (typeof data.drawVerticalLine != \"function\") {\n const err9 = {\n instancePath: instancePath + \"/drawVerticalLine\",\n schemaPath: \"#/properties/drawVerticalLine/typeof\",\n keyword: \"typeof\",\n params: {},\n message: \"must pass \\\"typeof\\\" keyword validation\"\n };\n if (vErrors === null) {\n vErrors = [err9];\n }\n else {\n vErrors.push(err9);\n }\n errors++;\n }\n }\n if (data.drawHorizontalLine !== undefined) {\n if (typeof data.drawHorizontalLine != \"function\") {\n const err10 = {\n instancePath: instancePath + \"/drawHorizontalLine\",\n schemaPath: \"#/properties/drawHorizontalLine/typeof\",\n keyword: \"typeof\",\n params: {},\n message: \"must pass \\\"typeof\\\" keyword validation\"\n };\n if (vErrors === null) {\n vErrors = [err10];\n }\n else {\n vErrors.push(err10);\n }\n errors++;\n }\n }\n if (data.singleLine !== undefined) {\n if (typeof data.singleLine != \"boolean\") {\n const err11 = {\n instancePath: instancePath + \"/singleLine\",\n schemaPath: \"#/properties/singleLine/typeof\",\n keyword: \"typeof\",\n params: {},\n message: \"must pass \\\"typeof\\\" keyword validation\"\n };\n if (vErrors === null) {\n vErrors = [err11];\n }\n else {\n vErrors.push(err11);\n }\n errors++;\n }\n }\n if (data.spanningCells !== undefined) {\n let data13 = data.spanningCells;\n if (Array.isArray(data13)) {\n const len0 = data13.length;\n for (let i0 = 0; i0 < len0; i0++) {\n let data14 = data13[i0];\n if (data14 && typeof data14 == \"object\" && !Array.isArray(data14)) {\n if (data14.row === undefined) {\n const err12 = {\n instancePath: instancePath + \"/spanningCells/\" + i0,\n schemaPath: \"#/properties/spanningCells/items/required\",\n keyword: \"required\",\n params: {\n missingProperty: \"row\"\n },\n message: \"must have required property '\" + \"row\" + \"'\"\n };\n if (vErrors === null) {\n vErrors = [err12];\n }\n else {\n vErrors.push(err12);\n }\n errors++;\n }\n if (data14.col === undefined) {\n const err13 = {\n instancePath: instancePath + \"/spanningCells/\" + i0,\n schemaPath: \"#/properties/spanningCells/items/required\",\n keyword: \"required\",\n params: {\n missingProperty: \"col\"\n },\n message: \"must have required property '\" + \"col\" + \"'\"\n };\n if (vErrors === null) {\n vErrors = [err13];\n }\n else {\n vErrors.push(err13);\n }\n errors++;\n }\n for (const key2 in data14) {\n if (!(func8.call(schema13.properties.spanningCells.items.properties, key2))) {\n const err14 = {\n instancePath: instancePath + \"/spanningCells/\" + i0,\n schemaPath: \"#/properties/spanningCells/items/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key2\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err14];\n }\n else {\n vErrors.push(err14);\n }\n errors++;\n }\n }\n if (data14.col !== undefined) {\n let data15 = data14.col;\n if (!(((typeof data15 == \"number\") && (!(data15 % 1) && !isNaN(data15))) && (isFinite(data15)))) {\n const err15 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/col\",\n schemaPath: \"#/properties/spanningCells/items/properties/col/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err15];\n }\n else {\n vErrors.push(err15);\n }\n errors++;\n }\n if ((typeof data15 == \"number\") && (isFinite(data15))) {\n if (data15 < 0 || isNaN(data15)) {\n const err16 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/col\",\n schemaPath: \"#/properties/spanningCells/items/properties/col/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 0\n },\n message: \"must be >= 0\"\n };\n if (vErrors === null) {\n vErrors = [err16];\n }\n else {\n vErrors.push(err16);\n }\n errors++;\n }\n }\n }\n if (data14.row !== undefined) {\n let data16 = data14.row;\n if (!(((typeof data16 == \"number\") && (!(data16 % 1) && !isNaN(data16))) && (isFinite(data16)))) {\n const err17 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/row\",\n schemaPath: \"#/properties/spanningCells/items/properties/row/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err17];\n }\n else {\n vErrors.push(err17);\n }\n errors++;\n }\n if ((typeof data16 == \"number\") && (isFinite(data16))) {\n if (data16 < 0 || isNaN(data16)) {\n const err18 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/row\",\n schemaPath: \"#/properties/spanningCells/items/properties/row/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 0\n },\n message: \"must be >= 0\"\n };\n if (vErrors === null) {\n vErrors = [err18];\n }\n else {\n vErrors.push(err18);\n }\n errors++;\n }\n }\n }\n if (data14.colSpan !== undefined) {\n let data17 = data14.colSpan;\n if (!(((typeof data17 == \"number\") && (!(data17 % 1) && !isNaN(data17))) && (isFinite(data17)))) {\n const err19 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/colSpan\",\n schemaPath: \"#/properties/spanningCells/items/properties/colSpan/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err19];\n }\n else {\n vErrors.push(err19);\n }\n errors++;\n }\n if ((typeof data17 == \"number\") && (isFinite(data17))) {\n if (data17 < 1 || isNaN(data17)) {\n const err20 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/colSpan\",\n schemaPath: \"#/properties/spanningCells/items/properties/colSpan/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err20];\n }\n else {\n vErrors.push(err20);\n }\n errors++;\n }\n }\n }\n if (data14.rowSpan !== undefined) {\n let data18 = data14.rowSpan;\n if (!(((typeof data18 == \"number\") && (!(data18 % 1) && !isNaN(data18))) && (isFinite(data18)))) {\n const err21 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/rowSpan\",\n schemaPath: \"#/properties/spanningCells/items/properties/rowSpan/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err21];\n }\n else {\n vErrors.push(err21);\n }\n errors++;\n }\n if ((typeof data18 == \"number\") && (isFinite(data18))) {\n if (data18 < 1 || isNaN(data18)) {\n const err22 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/rowSpan\",\n schemaPath: \"#/properties/spanningCells/items/properties/rowSpan/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err22];\n }\n else {\n vErrors.push(err22);\n }\n errors++;\n }\n }\n }\n if (data14.alignment !== undefined) {\n if (!(validate68(data14.alignment, {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/alignment\",\n parentData: data14,\n parentDataProperty: \"alignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate68.errors : vErrors.concat(validate68.errors);\n errors = vErrors.length;\n }\n }\n if (data14.verticalAlignment !== undefined) {\n if (!(validate84(data14.verticalAlignment, {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/verticalAlignment\",\n parentData: data14,\n parentDataProperty: \"verticalAlignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate84.errors : vErrors.concat(validate84.errors);\n errors = vErrors.length;\n }\n }\n if (data14.wrapWord !== undefined) {\n if (typeof data14.wrapWord !== \"boolean\") {\n const err23 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/wrapWord\",\n schemaPath: \"#/properties/spanningCells/items/properties/wrapWord/type\",\n keyword: \"type\",\n params: {\n type: \"boolean\"\n },\n message: \"must be boolean\"\n };\n if (vErrors === null) {\n vErrors = [err23];\n }\n else {\n vErrors.push(err23);\n }\n errors++;\n }\n }\n if (data14.truncate !== undefined) {\n let data22 = data14.truncate;\n if (!(((typeof data22 == \"number\") && (!(data22 % 1) && !isNaN(data22))) && (isFinite(data22)))) {\n const err24 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/truncate\",\n schemaPath: \"#/properties/spanningCells/items/properties/truncate/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err24];\n }\n else {\n vErrors.push(err24);\n }\n errors++;\n }\n }\n if (data14.paddingLeft !== undefined) {\n let data23 = data14.paddingLeft;\n if (!(((typeof data23 == \"number\") && (!(data23 % 1) && !isNaN(data23))) && (isFinite(data23)))) {\n const err25 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/paddingLeft\",\n schemaPath: \"#/properties/spanningCells/items/properties/paddingLeft/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err25];\n }\n else {\n vErrors.push(err25);\n }\n errors++;\n }\n }\n if (data14.paddingRight !== undefined) {\n let data24 = data14.paddingRight;\n if (!(((typeof data24 == \"number\") && (!(data24 % 1) && !isNaN(data24))) && (isFinite(data24)))) {\n const err26 = {\n instancePath: instancePath + \"/spanningCells/\" + i0 + \"/paddingRight\",\n schemaPath: \"#/properties/spanningCells/items/properties/paddingRight/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err26];\n }\n else {\n vErrors.push(err26);\n }\n errors++;\n }\n }\n }\n else {\n const err27 = {\n instancePath: instancePath + \"/spanningCells/\" + i0,\n schemaPath: \"#/properties/spanningCells/items/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err27];\n }\n else {\n vErrors.push(err27);\n }\n errors++;\n }\n }\n }\n else {\n const err28 = {\n instancePath: instancePath + \"/spanningCells\",\n schemaPath: \"#/properties/spanningCells/type\",\n keyword: \"type\",\n params: {\n type: \"array\"\n },\n message: \"must be array\"\n };\n if (vErrors === null) {\n vErrors = [err28];\n }\n else {\n vErrors.push(err28);\n }\n errors++;\n }\n }\n }\n else {\n const err29 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err29];\n }\n else {\n vErrors.push(err29);\n }\n errors++;\n }\n validate43.errors = vErrors;\n return errors === 0;\n}\nexports[\"streamConfig.json\"] = validate86;\nconst schema24 = {\n \"$id\": \"streamConfig.json\",\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"border\": {\n \"$ref\": \"shared.json#/definitions/borders\"\n },\n \"columns\": {\n \"$ref\": \"shared.json#/definitions/columns\"\n },\n \"columnDefault\": {\n \"$ref\": \"shared.json#/definitions/column\"\n },\n \"columnCount\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"drawVerticalLine\": {\n \"typeof\": \"function\"\n }\n },\n \"required\": [\"columnDefault\", \"columnCount\"],\n \"additionalProperties\": false\n};\nfunction validate87(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(func8.call(schema15.properties, key0))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.topBody !== undefined) {\n if (!(validate46(data.topBody, {\n instancePath: instancePath + \"/topBody\",\n parentData: data,\n parentDataProperty: \"topBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topJoin !== undefined) {\n if (!(validate46(data.topJoin, {\n instancePath: instancePath + \"/topJoin\",\n parentData: data,\n parentDataProperty: \"topJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topLeft !== undefined) {\n if (!(validate46(data.topLeft, {\n instancePath: instancePath + \"/topLeft\",\n parentData: data,\n parentDataProperty: \"topLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.topRight !== undefined) {\n if (!(validate46(data.topRight, {\n instancePath: instancePath + \"/topRight\",\n parentData: data,\n parentDataProperty: \"topRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomBody !== undefined) {\n if (!(validate46(data.bottomBody, {\n instancePath: instancePath + \"/bottomBody\",\n parentData: data,\n parentDataProperty: \"bottomBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomJoin !== undefined) {\n if (!(validate46(data.bottomJoin, {\n instancePath: instancePath + \"/bottomJoin\",\n parentData: data,\n parentDataProperty: \"bottomJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomLeft !== undefined) {\n if (!(validate46(data.bottomLeft, {\n instancePath: instancePath + \"/bottomLeft\",\n parentData: data,\n parentDataProperty: \"bottomLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bottomRight !== undefined) {\n if (!(validate46(data.bottomRight, {\n instancePath: instancePath + \"/bottomRight\",\n parentData: data,\n parentDataProperty: \"bottomRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyLeft !== undefined) {\n if (!(validate46(data.bodyLeft, {\n instancePath: instancePath + \"/bodyLeft\",\n parentData: data,\n parentDataProperty: \"bodyLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyRight !== undefined) {\n if (!(validate46(data.bodyRight, {\n instancePath: instancePath + \"/bodyRight\",\n parentData: data,\n parentDataProperty: \"bodyRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.bodyJoin !== undefined) {\n if (!(validate46(data.bodyJoin, {\n instancePath: instancePath + \"/bodyJoin\",\n parentData: data,\n parentDataProperty: \"bodyJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.headerJoin !== undefined) {\n if (!(validate46(data.headerJoin, {\n instancePath: instancePath + \"/headerJoin\",\n parentData: data,\n parentDataProperty: \"headerJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinBody !== undefined) {\n if (!(validate46(data.joinBody, {\n instancePath: instancePath + \"/joinBody\",\n parentData: data,\n parentDataProperty: \"joinBody\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinLeft !== undefined) {\n if (!(validate46(data.joinLeft, {\n instancePath: instancePath + \"/joinLeft\",\n parentData: data,\n parentDataProperty: \"joinLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinRight !== undefined) {\n if (!(validate46(data.joinRight, {\n instancePath: instancePath + \"/joinRight\",\n parentData: data,\n parentDataProperty: \"joinRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinJoin !== undefined) {\n if (!(validate46(data.joinJoin, {\n instancePath: instancePath + \"/joinJoin\",\n parentData: data,\n parentDataProperty: \"joinJoin\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleUp !== undefined) {\n if (!(validate46(data.joinMiddleUp, {\n instancePath: instancePath + \"/joinMiddleUp\",\n parentData: data,\n parentDataProperty: \"joinMiddleUp\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleDown !== undefined) {\n if (!(validate46(data.joinMiddleDown, {\n instancePath: instancePath + \"/joinMiddleDown\",\n parentData: data,\n parentDataProperty: \"joinMiddleDown\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleLeft !== undefined) {\n if (!(validate46(data.joinMiddleLeft, {\n instancePath: instancePath + \"/joinMiddleLeft\",\n parentData: data,\n parentDataProperty: \"joinMiddleLeft\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n if (data.joinMiddleRight !== undefined) {\n if (!(validate46(data.joinMiddleRight, {\n instancePath: instancePath + \"/joinMiddleRight\",\n parentData: data,\n parentDataProperty: \"joinMiddleRight\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate46.errors : vErrors.concat(validate46.errors);\n errors = vErrors.length;\n }\n }\n }\n else {\n const err1 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n validate87.errors = vErrors;\n return errors === 0;\n}\nfunction validate109(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n const _errs0 = errors;\n let valid0 = false;\n let passing0 = null;\n const _errs1 = errors;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(pattern0.test(key0))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/oneOf/0/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n for (const key1 in data) {\n if (pattern0.test(key1)) {\n if (!(validate71(data[key1], {\n instancePath: instancePath + \"/\" + key1.replace(/~/g, \"~0\").replace(/\\//g, \"~1\"),\n parentData: data,\n parentDataProperty: key1,\n rootData\n }))) {\n vErrors = vErrors === null ? validate71.errors : vErrors.concat(validate71.errors);\n errors = vErrors.length;\n }\n }\n }\n }\n else {\n const err1 = {\n instancePath,\n schemaPath: \"#/oneOf/0/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n var _valid0 = _errs1 === errors;\n if (_valid0) {\n valid0 = true;\n passing0 = 0;\n }\n const _errs5 = errors;\n if (Array.isArray(data)) {\n const len0 = data.length;\n for (let i0 = 0; i0 < len0; i0++) {\n if (!(validate71(data[i0], {\n instancePath: instancePath + \"/\" + i0,\n parentData: data,\n parentDataProperty: i0,\n rootData\n }))) {\n vErrors = vErrors === null ? validate71.errors : vErrors.concat(validate71.errors);\n errors = vErrors.length;\n }\n }\n }\n else {\n const err2 = {\n instancePath,\n schemaPath: \"#/oneOf/1/type\",\n keyword: \"type\",\n params: {\n type: \"array\"\n },\n message: \"must be array\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n var _valid0 = _errs5 === errors;\n if (_valid0 && valid0) {\n valid0 = false;\n passing0 = [passing0, 1];\n }\n else {\n if (_valid0) {\n valid0 = true;\n passing0 = 1;\n }\n }\n if (!valid0) {\n const err3 = {\n instancePath,\n schemaPath: \"#/oneOf\",\n keyword: \"oneOf\",\n params: {\n passingSchemas: passing0\n },\n message: \"must match exactly one schema in oneOf\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n else {\n errors = _errs0;\n if (vErrors !== null) {\n if (_errs0) {\n vErrors.length = _errs0;\n }\n else {\n vErrors = null;\n }\n }\n }\n validate109.errors = vErrors;\n return errors === 0;\n}\nfunction validate113(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n for (const key0 in data) {\n if (!(((((((key0 === \"alignment\") || (key0 === \"verticalAlignment\")) || (key0 === \"width\")) || (key0 === \"wrapWord\")) || (key0 === \"truncate\")) || (key0 === \"paddingLeft\")) || (key0 === \"paddingRight\"))) {\n const err0 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n }\n if (data.alignment !== undefined) {\n if (!(validate72(data.alignment, {\n instancePath: instancePath + \"/alignment\",\n parentData: data,\n parentDataProperty: \"alignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate72.errors : vErrors.concat(validate72.errors);\n errors = vErrors.length;\n }\n }\n if (data.verticalAlignment !== undefined) {\n if (!(validate74(data.verticalAlignment, {\n instancePath: instancePath + \"/verticalAlignment\",\n parentData: data,\n parentDataProperty: \"verticalAlignment\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate74.errors : vErrors.concat(validate74.errors);\n errors = vErrors.length;\n }\n }\n if (data.width !== undefined) {\n let data2 = data.width;\n if (!(((typeof data2 == \"number\") && (!(data2 % 1) && !isNaN(data2))) && (isFinite(data2)))) {\n const err1 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n if ((typeof data2 == \"number\") && (isFinite(data2))) {\n if (data2 < 1 || isNaN(data2)) {\n const err2 = {\n instancePath: instancePath + \"/width\",\n schemaPath: \"#/properties/width/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n }\n }\n if (data.wrapWord !== undefined) {\n if (typeof data.wrapWord !== \"boolean\") {\n const err3 = {\n instancePath: instancePath + \"/wrapWord\",\n schemaPath: \"#/properties/wrapWord/type\",\n keyword: \"type\",\n params: {\n type: \"boolean\"\n },\n message: \"must be boolean\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n }\n if (data.truncate !== undefined) {\n let data4 = data.truncate;\n if (!(((typeof data4 == \"number\") && (!(data4 % 1) && !isNaN(data4))) && (isFinite(data4)))) {\n const err4 = {\n instancePath: instancePath + \"/truncate\",\n schemaPath: \"#/properties/truncate/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err4];\n }\n else {\n vErrors.push(err4);\n }\n errors++;\n }\n }\n if (data.paddingLeft !== undefined) {\n let data5 = data.paddingLeft;\n if (!(((typeof data5 == \"number\") && (!(data5 % 1) && !isNaN(data5))) && (isFinite(data5)))) {\n const err5 = {\n instancePath: instancePath + \"/paddingLeft\",\n schemaPath: \"#/properties/paddingLeft/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err5];\n }\n else {\n vErrors.push(err5);\n }\n errors++;\n }\n }\n if (data.paddingRight !== undefined) {\n let data6 = data.paddingRight;\n if (!(((typeof data6 == \"number\") && (!(data6 % 1) && !isNaN(data6))) && (isFinite(data6)))) {\n const err6 = {\n instancePath: instancePath + \"/paddingRight\",\n schemaPath: \"#/properties/paddingRight/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err6];\n }\n else {\n vErrors.push(err6);\n }\n errors++;\n }\n }\n }\n else {\n const err7 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err7];\n }\n else {\n vErrors.push(err7);\n }\n errors++;\n }\n validate113.errors = vErrors;\n return errors === 0;\n}\nfunction validate86(data, { instancePath = \"\", parentData, parentDataProperty, rootData = data } = {}) {\n /*# sourceURL=\"streamConfig.json\" */ ;\n let vErrors = null;\n let errors = 0;\n if (data && typeof data == \"object\" && !Array.isArray(data)) {\n if (data.columnDefault === undefined) {\n const err0 = {\n instancePath,\n schemaPath: \"#/required\",\n keyword: \"required\",\n params: {\n missingProperty: \"columnDefault\"\n },\n message: \"must have required property '\" + \"columnDefault\" + \"'\"\n };\n if (vErrors === null) {\n vErrors = [err0];\n }\n else {\n vErrors.push(err0);\n }\n errors++;\n }\n if (data.columnCount === undefined) {\n const err1 = {\n instancePath,\n schemaPath: \"#/required\",\n keyword: \"required\",\n params: {\n missingProperty: \"columnCount\"\n },\n message: \"must have required property '\" + \"columnCount\" + \"'\"\n };\n if (vErrors === null) {\n vErrors = [err1];\n }\n else {\n vErrors.push(err1);\n }\n errors++;\n }\n for (const key0 in data) {\n if (!(((((key0 === \"border\") || (key0 === \"columns\")) || (key0 === \"columnDefault\")) || (key0 === \"columnCount\")) || (key0 === \"drawVerticalLine\"))) {\n const err2 = {\n instancePath,\n schemaPath: \"#/additionalProperties\",\n keyword: \"additionalProperties\",\n params: {\n additionalProperty: key0\n },\n message: \"must NOT have additional properties\"\n };\n if (vErrors === null) {\n vErrors = [err2];\n }\n else {\n vErrors.push(err2);\n }\n errors++;\n }\n }\n if (data.border !== undefined) {\n if (!(validate87(data.border, {\n instancePath: instancePath + \"/border\",\n parentData: data,\n parentDataProperty: \"border\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate87.errors : vErrors.concat(validate87.errors);\n errors = vErrors.length;\n }\n }\n if (data.columns !== undefined) {\n if (!(validate109(data.columns, {\n instancePath: instancePath + \"/columns\",\n parentData: data,\n parentDataProperty: \"columns\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate109.errors : vErrors.concat(validate109.errors);\n errors = vErrors.length;\n }\n }\n if (data.columnDefault !== undefined) {\n if (!(validate113(data.columnDefault, {\n instancePath: instancePath + \"/columnDefault\",\n parentData: data,\n parentDataProperty: \"columnDefault\",\n rootData\n }))) {\n vErrors = vErrors === null ? validate113.errors : vErrors.concat(validate113.errors);\n errors = vErrors.length;\n }\n }\n if (data.columnCount !== undefined) {\n let data3 = data.columnCount;\n if (!(((typeof data3 == \"number\") && (!(data3 % 1) && !isNaN(data3))) && (isFinite(data3)))) {\n const err3 = {\n instancePath: instancePath + \"/columnCount\",\n schemaPath: \"#/properties/columnCount/type\",\n keyword: \"type\",\n params: {\n type: \"integer\"\n },\n message: \"must be integer\"\n };\n if (vErrors === null) {\n vErrors = [err3];\n }\n else {\n vErrors.push(err3);\n }\n errors++;\n }\n if ((typeof data3 == \"number\") && (isFinite(data3))) {\n if (data3 < 1 || isNaN(data3)) {\n const err4 = {\n instancePath: instancePath + \"/columnCount\",\n schemaPath: \"#/properties/columnCount/minimum\",\n keyword: \"minimum\",\n params: {\n comparison: \">=\",\n limit: 1\n },\n message: \"must be >= 1\"\n };\n if (vErrors === null) {\n vErrors = [err4];\n }\n else {\n vErrors.push(err4);\n }\n errors++;\n }\n }\n }\n if (data.drawVerticalLine !== undefined) {\n if (typeof data.drawVerticalLine != \"function\") {\n const err5 = {\n instancePath: instancePath + \"/drawVerticalLine\",\n schemaPath: \"#/properties/drawVerticalLine/typeof\",\n keyword: \"typeof\",\n params: {},\n message: \"must pass \\\"typeof\\\" keyword validation\"\n };\n if (vErrors === null) {\n vErrors = [err5];\n }\n else {\n vErrors.push(err5);\n }\n errors++;\n }\n }\n }\n else {\n const err6 = {\n instancePath,\n schemaPath: \"#/type\",\n keyword: \"type\",\n params: {\n type: \"object\"\n },\n message: \"must be object\"\n };\n if (vErrors === null) {\n vErrors = [err6];\n }\n else {\n vErrors.push(err6);\n }\n errors++;\n }\n validate86.errors = vErrors;\n return errors === 0;\n}\n//# sourceMappingURL=validators.js.map","\"use strict\";\n/* eslint-disable sort-keys-fix/sort-keys-fix */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getBorderCharacters = void 0;\nconst getBorderCharacters = (name) => {\n if (name === 'honeywell') {\n return {\n topBody: '═',\n topJoin: '╤',\n topLeft: '╔',\n topRight: '╗',\n bottomBody: '═',\n bottomJoin: '╧',\n bottomLeft: '╚',\n bottomRight: '╝',\n bodyLeft: '║',\n bodyRight: '║',\n bodyJoin: '│',\n headerJoin: '┬',\n joinBody: '─',\n joinLeft: '╟',\n joinRight: '╢',\n joinJoin: '┼',\n joinMiddleDown: '┬',\n joinMiddleUp: '┴',\n joinMiddleLeft: '┤',\n joinMiddleRight: '├',\n };\n }\n if (name === 'norc') {\n return {\n topBody: '─',\n topJoin: '┬',\n topLeft: '┌',\n topRight: '┐',\n bottomBody: '─',\n bottomJoin: '┴',\n bottomLeft: '└',\n bottomRight: '┘',\n bodyLeft: '│',\n bodyRight: '│',\n bodyJoin: '│',\n headerJoin: '┬',\n joinBody: '─',\n joinLeft: '├',\n joinRight: '┤',\n joinJoin: '┼',\n joinMiddleDown: '┬',\n joinMiddleUp: '┴',\n joinMiddleLeft: '┤',\n joinMiddleRight: '├',\n };\n }\n if (name === 'ramac') {\n return {\n topBody: '-',\n topJoin: '+',\n topLeft: '+',\n topRight: '+',\n bottomBody: '-',\n bottomJoin: '+',\n bottomLeft: '+',\n bottomRight: '+',\n bodyLeft: '|',\n bodyRight: '|',\n bodyJoin: '|',\n headerJoin: '+',\n joinBody: '-',\n joinLeft: '|',\n joinRight: '|',\n joinJoin: '|',\n joinMiddleDown: '+',\n joinMiddleUp: '+',\n joinMiddleLeft: '+',\n joinMiddleRight: '+',\n };\n }\n if (name === 'void') {\n return {\n topBody: '',\n topJoin: '',\n topLeft: '',\n topRight: '',\n bottomBody: '',\n bottomJoin: '',\n bottomLeft: '',\n bottomRight: '',\n bodyLeft: '',\n bodyRight: '',\n bodyJoin: '',\n headerJoin: '',\n joinBody: '',\n joinLeft: '',\n joinRight: '',\n joinJoin: '',\n joinMiddleDown: '',\n joinMiddleUp: '',\n joinMiddleLeft: '',\n joinMiddleRight: '',\n };\n }\n throw new Error('Unknown border template \"' + name + '\".');\n};\nexports.getBorderCharacters = getBorderCharacters;\n//# sourceMappingURL=getBorderCharacters.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getBorderCharacters = exports.createStream = exports.table = void 0;\nconst createStream_1 = require(\"./createStream\");\nObject.defineProperty(exports, \"createStream\", { enumerable: true, get: function () { return createStream_1.createStream; } });\nconst getBorderCharacters_1 = require(\"./getBorderCharacters\");\nObject.defineProperty(exports, \"getBorderCharacters\", { enumerable: true, get: function () { return getBorderCharacters_1.getBorderCharacters; } });\nconst table_1 = require(\"./table\");\nObject.defineProperty(exports, \"table\", { enumerable: true, get: function () { return table_1.table; } });\n__exportStar(require(\"./types/api\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.injectHeaderConfig = void 0;\nconst injectHeaderConfig = (rows, config) => {\n var _a;\n let spanningCellConfig = (_a = config.spanningCells) !== null && _a !== void 0 ? _a : [];\n const headerConfig = config.header;\n const adjustedRows = [...rows];\n if (headerConfig) {\n spanningCellConfig = spanningCellConfig.map(({ row, ...rest }) => {\n return { ...rest,\n row: row + 1 };\n });\n const { content, ...headerStyles } = headerConfig;\n spanningCellConfig.unshift({ alignment: 'center',\n col: 0,\n colSpan: rows[0].length,\n paddingLeft: 1,\n paddingRight: 1,\n row: 0,\n wrapWord: false,\n ...headerStyles });\n adjustedRows.unshift([content, ...Array.from({ length: rows[0].length - 1 }).fill('')]);\n }\n return [adjustedRows,\n spanningCellConfig];\n};\nexports.injectHeaderConfig = injectHeaderConfig;\n//# sourceMappingURL=injectHeaderConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.makeRangeConfig = void 0;\nconst utils_1 = require(\"./utils\");\nconst makeRangeConfig = (spanningCellConfig, columnsConfig) => {\n var _a;\n const { topLeft, bottomRight } = (0, utils_1.calculateRangeCoordinate)(spanningCellConfig);\n const cellConfig = {\n ...columnsConfig[topLeft.col],\n ...spanningCellConfig,\n paddingRight: (_a = spanningCellConfig.paddingRight) !== null && _a !== void 0 ? _a : columnsConfig[bottomRight.col].paddingRight,\n };\n return { ...cellConfig,\n bottomRight,\n topLeft };\n};\nexports.makeRangeConfig = makeRangeConfig;\n//# sourceMappingURL=makeRangeConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.makeStreamConfig = void 0;\nconst utils_1 = require(\"./utils\");\nconst validateConfig_1 = require(\"./validateConfig\");\n/**\n * Creates a configuration for every column using default\n * values for the missing configuration properties.\n */\nconst makeColumnsConfig = (columnCount, columns = {}, columnDefault) => {\n return Array.from({ length: columnCount }).map((_, index) => {\n return {\n alignment: 'left',\n paddingLeft: 1,\n paddingRight: 1,\n truncate: Number.POSITIVE_INFINITY,\n verticalAlignment: 'top',\n wrapWord: false,\n ...columnDefault,\n ...columns[index],\n };\n });\n};\n/**\n * Makes a new configuration object out of the userConfig object\n * using default values for the missing configuration properties.\n */\nconst makeStreamConfig = (config) => {\n (0, validateConfig_1.validateConfig)('streamConfig.json', config);\n if (config.columnDefault.width === undefined) {\n throw new Error('Must provide config.columnDefault.width when creating a stream.');\n }\n return {\n drawVerticalLine: () => {\n return true;\n },\n ...config,\n border: (0, utils_1.makeBorderConfig)(config.border),\n columns: makeColumnsConfig(config.columnCount, config.columns, config.columnDefault),\n };\n};\nexports.makeStreamConfig = makeStreamConfig;\n//# sourceMappingURL=makeStreamConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.makeTableConfig = void 0;\nconst calculateMaximumColumnWidths_1 = require(\"./calculateMaximumColumnWidths\");\nconst spanningCellManager_1 = require(\"./spanningCellManager\");\nconst utils_1 = require(\"./utils\");\nconst validateConfig_1 = require(\"./validateConfig\");\nconst validateSpanningCellConfig_1 = require(\"./validateSpanningCellConfig\");\n/**\n * Creates a configuration for every column using default\n * values for the missing configuration properties.\n */\nconst makeColumnsConfig = (rows, columns, columnDefault, spanningCellConfigs) => {\n const columnWidths = (0, calculateMaximumColumnWidths_1.calculateMaximumColumnWidths)(rows, spanningCellConfigs);\n return rows[0].map((_, columnIndex) => {\n return {\n alignment: 'left',\n paddingLeft: 1,\n paddingRight: 1,\n truncate: Number.POSITIVE_INFINITY,\n verticalAlignment: 'top',\n width: columnWidths[columnIndex],\n wrapWord: false,\n ...columnDefault,\n ...columns === null || columns === void 0 ? void 0 : columns[columnIndex],\n };\n });\n};\n/**\n * Makes a new configuration object out of the userConfig object\n * using default values for the missing configuration properties.\n */\nconst makeTableConfig = (rows, config = {}, injectedSpanningCellConfig) => {\n var _a, _b, _c, _d, _e;\n (0, validateConfig_1.validateConfig)('config.json', config);\n (0, validateSpanningCellConfig_1.validateSpanningCellConfig)(rows, (_a = config.spanningCells) !== null && _a !== void 0 ? _a : []);\n const spanningCellConfigs = (_b = injectedSpanningCellConfig !== null && injectedSpanningCellConfig !== void 0 ? injectedSpanningCellConfig : config.spanningCells) !== null && _b !== void 0 ? _b : [];\n const columnsConfig = makeColumnsConfig(rows, config.columns, config.columnDefault, spanningCellConfigs);\n const drawVerticalLine = (_c = config.drawVerticalLine) !== null && _c !== void 0 ? _c : (() => {\n return true;\n });\n const drawHorizontalLine = (_d = config.drawHorizontalLine) !== null && _d !== void 0 ? _d : (() => {\n return true;\n });\n return {\n ...config,\n border: (0, utils_1.makeBorderConfig)(config.border),\n columns: columnsConfig,\n drawHorizontalLine,\n drawVerticalLine,\n singleLine: (_e = config.singleLine) !== null && _e !== void 0 ? _e : false,\n spanningCellManager: (0, spanningCellManager_1.createSpanningCellManager)({\n columnsConfig,\n drawHorizontalLine,\n drawVerticalLine,\n rows,\n spanningCellConfigs,\n }),\n };\n};\nexports.makeTableConfig = makeTableConfig;\n//# sourceMappingURL=makeTableConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mapDataUsingRowHeights = exports.padCellVertically = void 0;\nconst utils_1 = require(\"./utils\");\nconst wrapCell_1 = require(\"./wrapCell\");\nconst createEmptyStrings = (length) => {\n return new Array(length).fill('');\n};\nconst padCellVertically = (lines, rowHeight, verticalAlignment) => {\n const availableLines = rowHeight - lines.length;\n if (verticalAlignment === 'top') {\n return [...lines, ...createEmptyStrings(availableLines)];\n }\n if (verticalAlignment === 'bottom') {\n return [...createEmptyStrings(availableLines), ...lines];\n }\n return [\n ...createEmptyStrings(Math.floor(availableLines / 2)),\n ...lines,\n ...createEmptyStrings(Math.ceil(availableLines / 2)),\n ];\n};\nexports.padCellVertically = padCellVertically;\nconst mapDataUsingRowHeights = (unmappedRows, rowHeights, config) => {\n const nColumns = unmappedRows[0].length;\n const mappedRows = unmappedRows.map((unmappedRow, unmappedRowIndex) => {\n const outputRowHeight = rowHeights[unmappedRowIndex];\n const outputRow = Array.from({ length: outputRowHeight }, () => {\n return new Array(nColumns).fill('');\n });\n unmappedRow.forEach((cell, cellIndex) => {\n var _a;\n const containingRange = (_a = config.spanningCellManager) === null || _a === void 0 ? void 0 : _a.getContainingRange({ col: cellIndex,\n row: unmappedRowIndex });\n if (containingRange) {\n containingRange.extractCellContent(unmappedRowIndex).forEach((cellLine, cellLineIndex) => {\n outputRow[cellLineIndex][cellIndex] = cellLine;\n });\n return;\n }\n const cellLines = (0, wrapCell_1.wrapCell)(cell, config.columns[cellIndex].width, config.columns[cellIndex].wrapWord);\n const paddedCellLines = (0, exports.padCellVertically)(cellLines, outputRowHeight, config.columns[cellIndex].verticalAlignment);\n paddedCellLines.forEach((cellLine, cellLineIndex) => {\n outputRow[cellLineIndex][cellIndex] = cellLine;\n });\n });\n return outputRow;\n });\n return (0, utils_1.flatten)(mappedRows);\n};\nexports.mapDataUsingRowHeights = mapDataUsingRowHeights;\n//# sourceMappingURL=mapDataUsingRowHeights.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.padTableData = exports.padString = void 0;\nconst padString = (input, paddingLeft, paddingRight) => {\n return ' '.repeat(paddingLeft) + input + ' '.repeat(paddingRight);\n};\nexports.padString = padString;\nconst padTableData = (rows, config) => {\n return rows.map((cells, rowIndex) => {\n return cells.map((cell, cellIndex) => {\n var _a;\n const containingRange = (_a = config.spanningCellManager) === null || _a === void 0 ? void 0 : _a.getContainingRange({ col: cellIndex,\n row: rowIndex }, { mapped: true });\n if (containingRange) {\n return cell;\n }\n const { paddingLeft, paddingRight } = config.columns[cellIndex];\n return (0, exports.padString)(cell, paddingLeft, paddingRight);\n });\n });\n};\nexports.padTableData = padTableData;\n//# sourceMappingURL=padTableData.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createSpanningCellManager = void 0;\nconst alignSpanningCell_1 = require(\"./alignSpanningCell\");\nconst calculateSpanningCellWidth_1 = require(\"./calculateSpanningCellWidth\");\nconst makeRangeConfig_1 = require(\"./makeRangeConfig\");\nconst utils_1 = require(\"./utils\");\nconst findRangeConfig = (cell, rangeConfigs) => {\n return rangeConfigs.find((rangeCoordinate) => {\n return (0, utils_1.isCellInRange)(cell, rangeCoordinate);\n });\n};\nconst getContainingRange = (rangeConfig, context) => {\n const width = (0, calculateSpanningCellWidth_1.calculateSpanningCellWidth)(rangeConfig, context);\n const wrappedContent = (0, alignSpanningCell_1.wrapRangeContent)(rangeConfig, width, context);\n const alignedContent = (0, alignSpanningCell_1.alignVerticalRangeContent)(rangeConfig, wrappedContent, context);\n const getCellContent = (rowIndex) => {\n const { topLeft } = rangeConfig;\n const { drawHorizontalLine, rowHeights } = context;\n const totalWithinHorizontalBorderHeight = rowIndex - topLeft.row;\n const totalHiddenHorizontalBorderHeight = (0, utils_1.sequence)(topLeft.row + 1, rowIndex).filter((index) => {\n /* istanbul ignore next */\n return !(drawHorizontalLine === null || drawHorizontalLine === void 0 ? void 0 : drawHorizontalLine(index, rowHeights.length));\n }).length;\n const offset = (0, utils_1.sumArray)(rowHeights.slice(topLeft.row, rowIndex)) + totalWithinHorizontalBorderHeight - totalHiddenHorizontalBorderHeight;\n return alignedContent.slice(offset, offset + rowHeights[rowIndex]);\n };\n const getBorderContent = (borderIndex) => {\n const { topLeft } = rangeConfig;\n const offset = (0, utils_1.sumArray)(context.rowHeights.slice(topLeft.row, borderIndex)) + (borderIndex - topLeft.row - 1);\n return alignedContent[offset];\n };\n return {\n ...rangeConfig,\n extractBorderContent: getBorderContent,\n extractCellContent: getCellContent,\n height: wrappedContent.length,\n width,\n };\n};\nconst inSameRange = (cell1, cell2, ranges) => {\n const range1 = findRangeConfig(cell1, ranges);\n const range2 = findRangeConfig(cell2, ranges);\n if (range1 && range2) {\n return (0, utils_1.areCellEqual)(range1.topLeft, range2.topLeft);\n }\n return false;\n};\nconst hashRange = (range) => {\n const { row, col } = range.topLeft;\n return `${row}/${col}`;\n};\nconst createSpanningCellManager = (parameters) => {\n const { spanningCellConfigs, columnsConfig } = parameters;\n const ranges = spanningCellConfigs.map((config) => {\n return (0, makeRangeConfig_1.makeRangeConfig)(config, columnsConfig);\n });\n const rangeCache = {};\n let rowHeights = [];\n return { getContainingRange: (cell, options) => {\n var _a;\n const originalRow = (options === null || options === void 0 ? void 0 : options.mapped) ? (0, utils_1.findOriginalRowIndex)(rowHeights, cell.row) : cell.row;\n const range = findRangeConfig({ ...cell,\n row: originalRow }, ranges);\n if (!range) {\n return undefined;\n }\n if (rowHeights.length === 0) {\n return getContainingRange(range, { ...parameters,\n rowHeights });\n }\n const hash = hashRange(range);\n (_a = rangeCache[hash]) !== null && _a !== void 0 ? _a : (rangeCache[hash] = getContainingRange(range, { ...parameters,\n rowHeights }));\n return rangeCache[hash];\n },\n inSameRange: (cell1, cell2) => {\n return inSameRange(cell1, cell2, ranges);\n },\n rowHeights,\n setRowHeights: (_rowHeights) => {\n rowHeights = _rowHeights;\n } };\n};\nexports.createSpanningCellManager = createSpanningCellManager;\n//# sourceMappingURL=spanningCellManager.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringifyTableData = void 0;\nconst utils_1 = require(\"./utils\");\nconst stringifyTableData = (rows) => {\n return rows.map((cells) => {\n return cells.map((cell) => {\n return (0, utils_1.normalizeString)(String(cell));\n });\n });\n};\nexports.stringifyTableData = stringifyTableData;\n//# sourceMappingURL=stringifyTableData.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.table = void 0;\nconst alignTableData_1 = require(\"./alignTableData\");\nconst calculateOutputColumnWidths_1 = require(\"./calculateOutputColumnWidths\");\nconst calculateRowHeights_1 = require(\"./calculateRowHeights\");\nconst drawTable_1 = require(\"./drawTable\");\nconst injectHeaderConfig_1 = require(\"./injectHeaderConfig\");\nconst makeTableConfig_1 = require(\"./makeTableConfig\");\nconst mapDataUsingRowHeights_1 = require(\"./mapDataUsingRowHeights\");\nconst padTableData_1 = require(\"./padTableData\");\nconst stringifyTableData_1 = require(\"./stringifyTableData\");\nconst truncateTableData_1 = require(\"./truncateTableData\");\nconst utils_1 = require(\"./utils\");\nconst validateTableData_1 = require(\"./validateTableData\");\nconst table = (data, userConfig = {}) => {\n (0, validateTableData_1.validateTableData)(data);\n let rows = (0, stringifyTableData_1.stringifyTableData)(data);\n const [injectedRows, injectedSpanningCellConfig] = (0, injectHeaderConfig_1.injectHeaderConfig)(rows, userConfig);\n const config = (0, makeTableConfig_1.makeTableConfig)(injectedRows, userConfig, injectedSpanningCellConfig);\n rows = (0, truncateTableData_1.truncateTableData)(injectedRows, (0, utils_1.extractTruncates)(config));\n const rowHeights = (0, calculateRowHeights_1.calculateRowHeights)(rows, config);\n config.spanningCellManager.setRowHeights(rowHeights);\n rows = (0, mapDataUsingRowHeights_1.mapDataUsingRowHeights)(rows, rowHeights, config);\n rows = (0, alignTableData_1.alignTableData)(rows, config);\n rows = (0, padTableData_1.padTableData)(rows, config);\n const outputColumnWidths = (0, calculateOutputColumnWidths_1.calculateOutputColumnWidths)(config);\n return (0, drawTable_1.drawTable)(rows, outputColumnWidths, rowHeights, config);\n};\nexports.table = table;\n//# sourceMappingURL=table.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.truncateTableData = exports.truncateString = void 0;\nconst lodash_truncate_1 = __importDefault(require(\"lodash.truncate\"));\nconst truncateString = (input, length) => {\n return (0, lodash_truncate_1.default)(input, { length,\n omission: '…' });\n};\nexports.truncateString = truncateString;\n/**\n * @todo Make it work with ASCII content.\n */\nconst truncateTableData = (rows, truncates) => {\n return rows.map((cells) => {\n return cells.map((cell, cellIndex) => {\n return (0, exports.truncateString)(cell, truncates[cellIndex]);\n });\n });\n};\nexports.truncateTableData = truncateTableData;\n//# sourceMappingURL=truncateTableData.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=api.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isCellInRange = exports.areCellEqual = exports.calculateRangeCoordinate = exports.findOriginalRowIndex = exports.flatten = exports.extractTruncates = exports.sumArray = exports.sequence = exports.distributeUnevenly = exports.countSpaceSequence = exports.groupBySizes = exports.makeBorderConfig = exports.splitAnsi = exports.normalizeString = void 0;\nconst slice_ansi_1 = __importDefault(require(\"slice-ansi\"));\nconst string_width_1 = __importDefault(require(\"string-width\"));\nconst strip_ansi_1 = __importDefault(require(\"strip-ansi\"));\nconst getBorderCharacters_1 = require(\"./getBorderCharacters\");\n/**\n * Converts Windows-style newline to Unix-style\n *\n * @internal\n */\nconst normalizeString = (input) => {\n return input.replace(/\\r\\n/g, '\\n');\n};\nexports.normalizeString = normalizeString;\n/**\n * Splits ansi string by newlines\n *\n * @internal\n */\nconst splitAnsi = (input) => {\n const lengths = (0, strip_ansi_1.default)(input).split('\\n').map(string_width_1.default);\n const result = [];\n let startIndex = 0;\n lengths.forEach((length) => {\n result.push(length === 0 ? '' : (0, slice_ansi_1.default)(input, startIndex, startIndex + length));\n // Plus 1 for the newline character itself\n startIndex += length + 1;\n });\n return result;\n};\nexports.splitAnsi = splitAnsi;\n/**\n * Merges user provided border characters with the default border (\"honeywell\") characters.\n *\n * @internal\n */\nconst makeBorderConfig = (border) => {\n return {\n ...(0, getBorderCharacters_1.getBorderCharacters)('honeywell'),\n ...border,\n };\n};\nexports.makeBorderConfig = makeBorderConfig;\n/**\n * Groups the array into sub-arrays by sizes.\n *\n * @internal\n * @example\n * groupBySizes(['a', 'b', 'c', 'd', 'e'], [2, 1, 2]) = [ ['a', 'b'], ['c'], ['d', 'e'] ]\n */\nconst groupBySizes = (array, sizes) => {\n let startIndex = 0;\n return sizes.map((size) => {\n const group = array.slice(startIndex, startIndex + size);\n startIndex += size;\n return group;\n });\n};\nexports.groupBySizes = groupBySizes;\n/**\n * Counts the number of continuous spaces in a string\n *\n * @internal\n * @example\n * countGroupSpaces('a bc de f') = 3\n */\nconst countSpaceSequence = (input) => {\n var _a, _b;\n return (_b = (_a = input.match(/\\s+/g)) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0;\n};\nexports.countSpaceSequence = countSpaceSequence;\n/**\n * Creates the non-increasing number array given sum and length\n * whose the difference between maximum and minimum is not greater than 1\n *\n * @internal\n * @example\n * distributeUnevenly(6, 3) = [2, 2, 2]\n * distributeUnevenly(8, 3) = [3, 3, 2]\n */\nconst distributeUnevenly = (sum, length) => {\n const result = Array.from({ length }).fill(Math.floor(sum / length));\n return result.map((element, index) => {\n return element + (index < sum % length ? 1 : 0);\n });\n};\nexports.distributeUnevenly = distributeUnevenly;\nconst sequence = (start, end) => {\n return Array.from({ length: end - start + 1 }, (_, index) => {\n return index + start;\n });\n};\nexports.sequence = sequence;\nconst sumArray = (array) => {\n return array.reduce((accumulator, element) => {\n return accumulator + element;\n }, 0);\n};\nexports.sumArray = sumArray;\nconst extractTruncates = (config) => {\n return config.columns.map(({ truncate }) => {\n return truncate;\n });\n};\nexports.extractTruncates = extractTruncates;\nconst flatten = (array) => {\n return [].concat(...array);\n};\nexports.flatten = flatten;\nconst findOriginalRowIndex = (mappedRowHeights, mappedRowIndex) => {\n const rowIndexMapping = (0, exports.flatten)(mappedRowHeights.map((height, index) => {\n return Array.from({ length: height }, () => {\n return index;\n });\n }));\n return rowIndexMapping[mappedRowIndex];\n};\nexports.findOriginalRowIndex = findOriginalRowIndex;\nconst calculateRangeCoordinate = (spanningCellConfig) => {\n const { row, col, colSpan = 1, rowSpan = 1 } = spanningCellConfig;\n return { bottomRight: { col: col + colSpan - 1,\n row: row + rowSpan - 1 },\n topLeft: { col,\n row } };\n};\nexports.calculateRangeCoordinate = calculateRangeCoordinate;\nconst areCellEqual = (cell1, cell2) => {\n return cell1.row === cell2.row && cell1.col === cell2.col;\n};\nexports.areCellEqual = areCellEqual;\nconst isCellInRange = (cell, { topLeft, bottomRight }) => {\n return (topLeft.row <= cell.row &&\n cell.row <= bottomRight.row &&\n topLeft.col <= cell.col &&\n cell.col <= bottomRight.col);\n};\nexports.isCellInRange = isCellInRange;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateConfig = void 0;\nconst validators_1 = __importDefault(require(\"./generated/validators\"));\nconst validateConfig = (schemaId, config) => {\n const validate = validators_1.default[schemaId];\n if (!validate(config) && validate.errors) {\n // eslint-disable-next-line promise/prefer-await-to-callbacks\n const errors = validate.errors.map((error) => {\n return {\n message: error.message,\n params: error.params,\n schemaPath: error.schemaPath,\n };\n });\n /* eslint-disable no-console */\n console.log('config', config);\n console.log('errors', errors);\n /* eslint-enable no-console */\n throw new Error('Invalid config.');\n }\n};\nexports.validateConfig = validateConfig;\n//# sourceMappingURL=validateConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateSpanningCellConfig = void 0;\nconst utils_1 = require(\"./utils\");\nconst inRange = (start, end, value) => {\n return start <= value && value <= end;\n};\nconst validateSpanningCellConfig = (rows, configs) => {\n const [nRow, nCol] = [rows.length, rows[0].length];\n configs.forEach((config, configIndex) => {\n const { colSpan, rowSpan } = config;\n if (colSpan === undefined && rowSpan === undefined) {\n throw new Error(`Expect at least colSpan or rowSpan is provided in config.spanningCells[${configIndex}]`);\n }\n if (colSpan !== undefined && colSpan < 1) {\n throw new Error(`Expect colSpan is not equal zero, instead got: ${colSpan} in config.spanningCells[${configIndex}]`);\n }\n if (rowSpan !== undefined && rowSpan < 1) {\n throw new Error(`Expect rowSpan is not equal zero, instead got: ${rowSpan} in config.spanningCells[${configIndex}]`);\n }\n });\n const rangeCoordinates = configs.map(utils_1.calculateRangeCoordinate);\n rangeCoordinates.forEach(({ topLeft, bottomRight }, rangeIndex) => {\n if (!inRange(0, nCol - 1, topLeft.col) ||\n !inRange(0, nRow - 1, topLeft.row) ||\n !inRange(0, nCol - 1, bottomRight.col) ||\n !inRange(0, nRow - 1, bottomRight.row)) {\n throw new Error(`Some cells in config.spanningCells[${rangeIndex}] are out of the table`);\n }\n });\n const configOccupy = Array.from({ length: nRow }, () => {\n return Array.from({ length: nCol });\n });\n rangeCoordinates.forEach(({ topLeft, bottomRight }, rangeIndex) => {\n (0, utils_1.sequence)(topLeft.row, bottomRight.row).forEach((row) => {\n (0, utils_1.sequence)(topLeft.col, bottomRight.col).forEach((col) => {\n if (configOccupy[row][col] !== undefined) {\n throw new Error(`Spanning cells in config.spanningCells[${configOccupy[row][col]}] and config.spanningCells[${rangeIndex}] are overlap each other`);\n }\n configOccupy[row][col] = rangeIndex;\n });\n });\n });\n};\nexports.validateSpanningCellConfig = validateSpanningCellConfig;\n//# sourceMappingURL=validateSpanningCellConfig.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateTableData = void 0;\nconst utils_1 = require(\"./utils\");\nconst validateTableData = (rows) => {\n if (!Array.isArray(rows)) {\n throw new TypeError('Table data must be an array.');\n }\n if (rows.length === 0) {\n throw new Error('Table must define at least one row.');\n }\n if (rows[0].length === 0) {\n throw new Error('Table must define at least one column.');\n }\n const columnNumber = rows[0].length;\n for (const row of rows) {\n if (!Array.isArray(row)) {\n throw new TypeError('Table row data must be an array.');\n }\n if (row.length !== columnNumber) {\n throw new Error('Table must have a consistent number of cells.');\n }\n for (const cell of row) {\n // eslint-disable-next-line no-control-regex\n if (/[\\u0001-\\u0006\\u0008\\u0009\\u000B-\\u001A]/.test((0, utils_1.normalizeString)(String(cell)))) {\n throw new Error('Table data must not contain control characters.');\n }\n }\n }\n};\nexports.validateTableData = validateTableData;\n//# sourceMappingURL=validateTableData.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapCell = void 0;\nconst utils_1 = require(\"./utils\");\nconst wrapString_1 = require(\"./wrapString\");\nconst wrapWord_1 = require(\"./wrapWord\");\n/**\n * Wrap a single cell value into a list of lines\n *\n * Always wraps on newlines, for the remainder uses either word or string wrapping\n * depending on user configuration.\n *\n */\nconst wrapCell = (cellValue, cellWidth, useWrapWord) => {\n // First split on literal newlines\n const cellLines = (0, utils_1.splitAnsi)(cellValue);\n // Then iterate over the list and word-wrap every remaining line if necessary.\n for (let lineNr = 0; lineNr < cellLines.length;) {\n let lineChunks;\n if (useWrapWord) {\n lineChunks = (0, wrapWord_1.wrapWord)(cellLines[lineNr], cellWidth);\n }\n else {\n lineChunks = (0, wrapString_1.wrapString)(cellLines[lineNr], cellWidth);\n }\n // Replace our original array element with whatever the wrapping returned\n cellLines.splice(lineNr, 1, ...lineChunks);\n lineNr += lineChunks.length;\n }\n return cellLines;\n};\nexports.wrapCell = wrapCell;\n//# sourceMappingURL=wrapCell.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapString = void 0;\nconst slice_ansi_1 = __importDefault(require(\"slice-ansi\"));\nconst string_width_1 = __importDefault(require(\"string-width\"));\n/**\n * Creates an array of strings split into groups the length of size.\n * This function works with strings that contain ASCII characters.\n *\n * wrapText is different from would-be \"chunk\" implementation\n * in that whitespace characters that occur on a chunk size limit are trimmed.\n *\n */\nconst wrapString = (subject, size) => {\n let subjectSlice = subject;\n const chunks = [];\n do {\n chunks.push((0, slice_ansi_1.default)(subjectSlice, 0, size));\n subjectSlice = (0, slice_ansi_1.default)(subjectSlice, size).trim();\n } while ((0, string_width_1.default)(subjectSlice));\n return chunks;\n};\nexports.wrapString = wrapString;\n//# sourceMappingURL=wrapString.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapWord = void 0;\nconst slice_ansi_1 = __importDefault(require(\"slice-ansi\"));\nconst strip_ansi_1 = __importDefault(require(\"strip-ansi\"));\nconst calculateStringLengths = (input, size) => {\n let subject = (0, strip_ansi_1.default)(input);\n const chunks = [];\n // https://regex101.com/r/gY5kZ1/1\n const re = new RegExp('(^.{1,' + String(Math.max(size, 1)) + '}(\\\\s+|$))|(^.{1,' + String(Math.max(size - 1, 1)) + '}(\\\\\\\\|/|_|\\\\.|,|;|-))');\n do {\n let chunk;\n const match = re.exec(subject);\n if (match) {\n chunk = match[0];\n subject = subject.slice(chunk.length);\n const trimmedLength = chunk.trim().length;\n const offset = chunk.length - trimmedLength;\n chunks.push([trimmedLength, offset]);\n }\n else {\n chunk = subject.slice(0, size);\n subject = subject.slice(size);\n chunks.push([chunk.length, 0]);\n }\n } while (subject.length);\n return chunks;\n};\nconst wrapWord = (input, size) => {\n const result = [];\n let startIndex = 0;\n calculateStringLengths(input, size).forEach(([length, offset]) => {\n result.push((0, slice_ansi_1.default)(input, startIndex, startIndex + length));\n startIndex += length + offset;\n });\n return result;\n};\nexports.wrapWord = wrapWord;\n//# sourceMappingURL=wrapWord.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// https://github.com/ajv-validator/ajv/issues/889\nconst equal = require(\"fast-deep-equal\");\nequal.code = 'require(\"ajv/dist/runtime/equal\").default';\nexports.default = equal;\n//# sourceMappingURL=equal.js.map","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, Symbol, Reflect, Promise, SuppressedError */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __esDecorate;\r\nvar __runInitializers;\r\nvar __propKey;\r\nvar __setFunctionName;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __classPrivateFieldIn;\r\nvar __createBinding;\r\nvar __addDisposableResource;\r\nvar __disposeResources;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __esDecorate = function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n };\r\n\r\n __runInitializers = function (thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n };\r\n\r\n __propKey = function (x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n };\r\n\r\n __setFunctionName = function (f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n };\r\n\r\n __classPrivateFieldIn = function (state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n };\r\n\r\n __addDisposableResource = function (env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n };\r\n\r\n var _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n };\r\n\r\n __disposeResources = function (env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__esDecorate\", __esDecorate);\r\n exporter(\"__runInitializers\", __runInitializers);\r\n exporter(\"__propKey\", __propKey);\r\n exporter(\"__setFunctionName\", __setFunctionName);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n exporter(\"__classPrivateFieldIn\", __classPrivateFieldIn);\r\n exporter(\"__addDisposableResource\", __addDisposableResource);\r\n exporter(\"__disposeResources\", __disposeResources);\r\n});\r\n","module.exports = require('./lib/tunnel');\n","'use strict';\n\nvar net = require('net');\nvar tls = require('tls');\nvar http = require('http');\nvar https = require('https');\nvar events = require('events');\nvar assert = require('assert');\nvar util = require('util');\n\n\nexports.httpOverHttp = httpOverHttp;\nexports.httpsOverHttp = httpsOverHttp;\nexports.httpOverHttps = httpOverHttps;\nexports.httpsOverHttps = httpsOverHttps;\n\n\nfunction httpOverHttp(options) {\n var agent = new TunnelingAgent(options);\n agent.request = http.request;\n return agent;\n}\n\nfunction httpsOverHttp(options) {\n var agent = new TunnelingAgent(options);\n agent.request = http.request;\n agent.createSocket = createSecureSocket;\n agent.defaultPort = 443;\n return agent;\n}\n\nfunction httpOverHttps(options) {\n var agent = new TunnelingAgent(options);\n agent.request = https.request;\n return agent;\n}\n\nfunction httpsOverHttps(options) {\n var agent = new TunnelingAgent(options);\n agent.request = https.request;\n agent.createSocket = createSecureSocket;\n agent.defaultPort = 443;\n return agent;\n}\n\n\nfunction TunnelingAgent(options) {\n var self = this;\n self.options = options || {};\n self.proxyOptions = self.options.proxy || {};\n self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets;\n self.requests = [];\n self.sockets = [];\n\n self.on('free', function onFree(socket, host, port, localAddress) {\n var options = toOptions(host, port, localAddress);\n for (var i = 0, len = self.requests.length; i < len; ++i) {\n var pending = self.requests[i];\n if (pending.host === options.host && pending.port === options.port) {\n // Detect the request to connect same origin server,\n // reuse the connection.\n self.requests.splice(i, 1);\n pending.request.onSocket(socket);\n return;\n }\n }\n socket.destroy();\n self.removeSocket(socket);\n });\n}\nutil.inherits(TunnelingAgent, events.EventEmitter);\n\nTunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) {\n var self = this;\n var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress));\n\n if (self.sockets.length >= this.maxSockets) {\n // We are over limit so we'll add it to the queue.\n self.requests.push(options);\n return;\n }\n\n // If we are under maxSockets create a new one.\n self.createSocket(options, function(socket) {\n socket.on('free', onFree);\n socket.on('close', onCloseOrRemove);\n socket.on('agentRemove', onCloseOrRemove);\n req.onSocket(socket);\n\n function onFree() {\n self.emit('free', socket, options);\n }\n\n function onCloseOrRemove(err) {\n self.removeSocket(socket);\n socket.removeListener('free', onFree);\n socket.removeListener('close', onCloseOrRemove);\n socket.removeListener('agentRemove', onCloseOrRemove);\n }\n });\n};\n\nTunnelingAgent.prototype.createSocket = function createSocket(options, cb) {\n var self = this;\n var placeholder = {};\n self.sockets.push(placeholder);\n\n var connectOptions = mergeOptions({}, self.proxyOptions, {\n method: 'CONNECT',\n path: options.host + ':' + options.port,\n agent: false,\n headers: {\n host: options.host + ':' + options.port\n }\n });\n if (options.localAddress) {\n connectOptions.localAddress = options.localAddress;\n }\n if (connectOptions.proxyAuth) {\n connectOptions.headers = connectOptions.headers || {};\n connectOptions.headers['Proxy-Authorization'] = 'Basic ' +\n new Buffer(connectOptions.proxyAuth).toString('base64');\n }\n\n debug('making CONNECT request');\n var connectReq = self.request(connectOptions);\n connectReq.useChunkedEncodingByDefault = false; // for v0.6\n connectReq.once('response', onResponse); // for v0.6\n connectReq.once('upgrade', onUpgrade); // for v0.6\n connectReq.once('connect', onConnect); // for v0.7 or later\n connectReq.once('error', onError);\n connectReq.end();\n\n function onResponse(res) {\n // Very hacky. This is necessary to avoid http-parser leaks.\n res.upgrade = true;\n }\n\n function onUpgrade(res, socket, head) {\n // Hacky.\n process.nextTick(function() {\n onConnect(res, socket, head);\n });\n }\n\n function onConnect(res, socket, head) {\n connectReq.removeAllListeners();\n socket.removeAllListeners();\n\n if (res.statusCode !== 200) {\n debug('tunneling socket could not be established, statusCode=%d',\n res.statusCode);\n socket.destroy();\n var error = new Error('tunneling socket could not be established, ' +\n 'statusCode=' + res.statusCode);\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n return;\n }\n if (head.length > 0) {\n debug('got illegal response body from proxy');\n socket.destroy();\n var error = new Error('got illegal response body from proxy');\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n return;\n }\n debug('tunneling connection has established');\n self.sockets[self.sockets.indexOf(placeholder)] = socket;\n return cb(socket);\n }\n\n function onError(cause) {\n connectReq.removeAllListeners();\n\n debug('tunneling socket could not be established, cause=%s\\n',\n cause.message, cause.stack);\n var error = new Error('tunneling socket could not be established, ' +\n 'cause=' + cause.message);\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n }\n};\n\nTunnelingAgent.prototype.removeSocket = function removeSocket(socket) {\n var pos = this.sockets.indexOf(socket)\n if (pos === -1) {\n return;\n }\n this.sockets.splice(pos, 1);\n\n var pending = this.requests.shift();\n if (pending) {\n // If we have pending requests and a socket gets closed a new one\n // needs to be created to take over in the pool for the one that closed.\n this.createSocket(pending, function(socket) {\n pending.request.onSocket(socket);\n });\n }\n};\n\nfunction createSecureSocket(options, cb) {\n var self = this;\n TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {\n var hostHeader = options.request.getHeader('host');\n var tlsOptions = mergeOptions({}, self.options, {\n socket: socket,\n servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host\n });\n\n // 0 is dummy port for v0.6\n var secureSocket = tls.connect(0, tlsOptions);\n self.sockets[self.sockets.indexOf(socket)] = secureSocket;\n cb(secureSocket);\n });\n}\n\n\nfunction toOptions(host, port, localAddress) {\n if (typeof host === 'string') { // since v0.10\n return {\n host: host,\n port: port,\n localAddress: localAddress\n };\n }\n return host; // for v0.11 or later\n}\n\nfunction mergeOptions(target) {\n for (var i = 1, len = arguments.length; i < len; ++i) {\n var overrides = arguments[i];\n if (typeof overrides === 'object') {\n var keys = Object.keys(overrides);\n for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {\n var k = keys[j];\n if (overrides[k] !== undefined) {\n target[k] = overrides[k];\n }\n }\n }\n }\n return target;\n}\n\n\nvar debug;\nif (process.env.NODE_DEBUG && /\\btunnel\\b/.test(process.env.NODE_DEBUG)) {\n debug = function() {\n var args = Array.prototype.slice.call(arguments);\n if (typeof args[0] === 'string') {\n args[0] = 'TUNNEL: ' + args[0];\n } else {\n args.unshift('TUNNEL:');\n }\n console.error.apply(console, args);\n }\n} else {\n debug = function() {};\n}\nexports.debug = debug; // for test\n","'use strict'\n\nconst Client = require('./lib/client')\nconst Dispatcher = require('./lib/dispatcher')\nconst errors = require('./lib/core/errors')\nconst Pool = require('./lib/pool')\nconst BalancedPool = require('./lib/balanced-pool')\nconst Agent = require('./lib/agent')\nconst util = require('./lib/core/util')\nconst { InvalidArgumentError } = errors\nconst api = require('./lib/api')\nconst buildConnector = require('./lib/core/connect')\nconst MockClient = require('./lib/mock/mock-client')\nconst MockAgent = require('./lib/mock/mock-agent')\nconst MockPool = require('./lib/mock/mock-pool')\nconst mockErrors = require('./lib/mock/mock-errors')\nconst ProxyAgent = require('./lib/proxy-agent')\nconst { getGlobalDispatcher, setGlobalDispatcher } = require('./lib/global')\nconst DecoratorHandler = require('./lib/handler/DecoratorHandler')\nconst RedirectHandler = require('./lib/handler/RedirectHandler')\nconst createRedirectInterceptor = require('./lib/interceptor/redirectInterceptor')\n\nlet hasCrypto\ntry {\n require('crypto')\n hasCrypto = true\n} catch {\n hasCrypto = false\n}\n\nObject.assign(Dispatcher.prototype, api)\n\nmodule.exports.Dispatcher = Dispatcher\nmodule.exports.Client = Client\nmodule.exports.Pool = Pool\nmodule.exports.BalancedPool = BalancedPool\nmodule.exports.Agent = Agent\nmodule.exports.ProxyAgent = ProxyAgent\n\nmodule.exports.DecoratorHandler = DecoratorHandler\nmodule.exports.RedirectHandler = RedirectHandler\nmodule.exports.createRedirectInterceptor = createRedirectInterceptor\n\nmodule.exports.buildConnector = buildConnector\nmodule.exports.errors = errors\n\nfunction makeDispatcher (fn) {\n return (url, opts, handler) => {\n if (typeof opts === 'function') {\n handler = opts\n opts = null\n }\n\n if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) {\n throw new InvalidArgumentError('invalid url')\n }\n\n if (opts != null && typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (opts && opts.path != null) {\n if (typeof opts.path !== 'string') {\n throw new InvalidArgumentError('invalid opts.path')\n }\n\n let path = opts.path\n if (!opts.path.startsWith('/')) {\n path = `/${path}`\n }\n\n url = new URL(util.parseOrigin(url).origin + path)\n } else {\n if (!opts) {\n opts = typeof url === 'object' ? url : {}\n }\n\n url = util.parseURL(url)\n }\n\n const { agent, dispatcher = getGlobalDispatcher() } = opts\n\n if (agent) {\n throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?')\n }\n\n return fn.call(dispatcher, {\n ...opts,\n origin: url.origin,\n path: url.search ? `${url.pathname}${url.search}` : url.pathname,\n method: opts.method || (opts.body ? 'PUT' : 'GET')\n }, handler)\n }\n}\n\nmodule.exports.setGlobalDispatcher = setGlobalDispatcher\nmodule.exports.getGlobalDispatcher = getGlobalDispatcher\n\nif (util.nodeMajor > 16 || (util.nodeMajor === 16 && util.nodeMinor >= 8)) {\n let fetchImpl = null\n module.exports.fetch = async function fetch (resource) {\n if (!fetchImpl) {\n fetchImpl = require('./lib/fetch').fetch\n }\n\n try {\n return await fetchImpl(...arguments)\n } catch (err) {\n if (typeof err === 'object') {\n Error.captureStackTrace(err, this)\n }\n\n throw err\n }\n }\n module.exports.Headers = require('./lib/fetch/headers').Headers\n module.exports.Response = require('./lib/fetch/response').Response\n module.exports.Request = require('./lib/fetch/request').Request\n module.exports.FormData = require('./lib/fetch/formdata').FormData\n module.exports.File = require('./lib/fetch/file').File\n module.exports.FileReader = require('./lib/fileapi/filereader').FileReader\n\n const { setGlobalOrigin, getGlobalOrigin } = require('./lib/fetch/global')\n\n module.exports.setGlobalOrigin = setGlobalOrigin\n module.exports.getGlobalOrigin = getGlobalOrigin\n\n const { CacheStorage } = require('./lib/cache/cachestorage')\n const { kConstruct } = require('./lib/cache/symbols')\n\n // Cache & CacheStorage are tightly coupled with fetch. Even if it may run\n // in an older version of Node, it doesn't have any use without fetch.\n module.exports.caches = new CacheStorage(kConstruct)\n}\n\nif (util.nodeMajor >= 16) {\n const { deleteCookie, getCookies, getSetCookies, setCookie } = require('./lib/cookies')\n\n module.exports.deleteCookie = deleteCookie\n module.exports.getCookies = getCookies\n module.exports.getSetCookies = getSetCookies\n module.exports.setCookie = setCookie\n\n const { parseMIMEType, serializeAMimeType } = require('./lib/fetch/dataURL')\n\n module.exports.parseMIMEType = parseMIMEType\n module.exports.serializeAMimeType = serializeAMimeType\n}\n\nif (util.nodeMajor >= 18 && hasCrypto) {\n const { WebSocket } = require('./lib/websocket/websocket')\n\n module.exports.WebSocket = WebSocket\n}\n\nmodule.exports.request = makeDispatcher(api.request)\nmodule.exports.stream = makeDispatcher(api.stream)\nmodule.exports.pipeline = makeDispatcher(api.pipeline)\nmodule.exports.connect = makeDispatcher(api.connect)\nmodule.exports.upgrade = makeDispatcher(api.upgrade)\n\nmodule.exports.MockClient = MockClient\nmodule.exports.MockPool = MockPool\nmodule.exports.MockAgent = MockAgent\nmodule.exports.mockErrors = mockErrors\n","'use strict'\n\nconst { InvalidArgumentError } = require('./core/errors')\nconst { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require('./core/symbols')\nconst DispatcherBase = require('./dispatcher-base')\nconst Pool = require('./pool')\nconst Client = require('./client')\nconst util = require('./core/util')\nconst createRedirectInterceptor = require('./interceptor/redirectInterceptor')\nconst { WeakRef, FinalizationRegistry } = require('./compat/dispatcher-weakref')()\n\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kMaxRedirections = Symbol('maxRedirections')\nconst kOnDrain = Symbol('onDrain')\nconst kFactory = Symbol('factory')\nconst kFinalizer = Symbol('finalizer')\nconst kOptions = Symbol('options')\n\nfunction defaultFactory (origin, opts) {\n return opts && opts.connections === 1\n ? new Client(origin, opts)\n : new Pool(origin, opts)\n}\n\nclass Agent extends DispatcherBase {\n constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) {\n super()\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (!Number.isInteger(maxRedirections) || maxRedirections < 0) {\n throw new InvalidArgumentError('maxRedirections must be a positive number')\n }\n\n if (connect && typeof connect !== 'function') {\n connect = { ...connect }\n }\n\n this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent)\n ? options.interceptors.Agent\n : [createRedirectInterceptor({ maxRedirections })]\n\n this[kOptions] = { ...util.deepClone(options), connect }\n this[kOptions].interceptors = options.interceptors\n ? { ...options.interceptors }\n : undefined\n this[kMaxRedirections] = maxRedirections\n this[kFactory] = factory\n this[kClients] = new Map()\n this[kFinalizer] = new FinalizationRegistry(/* istanbul ignore next: gc is undeterministic */ key => {\n const ref = this[kClients].get(key)\n if (ref !== undefined && ref.deref() === undefined) {\n this[kClients].delete(key)\n }\n })\n\n const agent = this\n\n this[kOnDrain] = (origin, targets) => {\n agent.emit('drain', origin, [agent, ...targets])\n }\n\n this[kOnConnect] = (origin, targets) => {\n agent.emit('connect', origin, [agent, ...targets])\n }\n\n this[kOnDisconnect] = (origin, targets, err) => {\n agent.emit('disconnect', origin, [agent, ...targets], err)\n }\n\n this[kOnConnectionError] = (origin, targets, err) => {\n agent.emit('connectionError', origin, [agent, ...targets], err)\n }\n }\n\n get [kRunning] () {\n let ret = 0\n for (const ref of this[kClients].values()) {\n const client = ref.deref()\n /* istanbul ignore next: gc is undeterministic */\n if (client) {\n ret += client[kRunning]\n }\n }\n return ret\n }\n\n [kDispatch] (opts, handler) {\n let key\n if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) {\n key = String(opts.origin)\n } else {\n throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.')\n }\n\n const ref = this[kClients].get(key)\n\n let dispatcher = ref ? ref.deref() : null\n if (!dispatcher) {\n dispatcher = this[kFactory](opts.origin, this[kOptions])\n .on('drain', this[kOnDrain])\n .on('connect', this[kOnConnect])\n .on('disconnect', this[kOnDisconnect])\n .on('connectionError', this[kOnConnectionError])\n\n this[kClients].set(key, new WeakRef(dispatcher))\n this[kFinalizer].register(dispatcher, key)\n }\n\n return dispatcher.dispatch(opts, handler)\n }\n\n async [kClose] () {\n const closePromises = []\n for (const ref of this[kClients].values()) {\n const client = ref.deref()\n /* istanbul ignore else: gc is undeterministic */\n if (client) {\n closePromises.push(client.close())\n }\n }\n\n await Promise.all(closePromises)\n }\n\n async [kDestroy] (err) {\n const destroyPromises = []\n for (const ref of this[kClients].values()) {\n const client = ref.deref()\n /* istanbul ignore else: gc is undeterministic */\n if (client) {\n destroyPromises.push(client.destroy(err))\n }\n }\n\n await Promise.all(destroyPromises)\n }\n}\n\nmodule.exports = Agent\n","const { addAbortListener } = require('../core/util')\nconst { RequestAbortedError } = require('../core/errors')\n\nconst kListener = Symbol('kListener')\nconst kSignal = Symbol('kSignal')\n\nfunction abort (self) {\n if (self.abort) {\n self.abort()\n } else {\n self.onError(new RequestAbortedError())\n }\n}\n\nfunction addSignal (self, signal) {\n self[kSignal] = null\n self[kListener] = null\n\n if (!signal) {\n return\n }\n\n if (signal.aborted) {\n abort(self)\n return\n }\n\n self[kSignal] = signal\n self[kListener] = () => {\n abort(self)\n }\n\n addAbortListener(self[kSignal], self[kListener])\n}\n\nfunction removeSignal (self) {\n if (!self[kSignal]) {\n return\n }\n\n if ('removeEventListener' in self[kSignal]) {\n self[kSignal].removeEventListener('abort', self[kListener])\n } else {\n self[kSignal].removeListener('abort', self[kListener])\n }\n\n self[kSignal] = null\n self[kListener] = null\n}\n\nmodule.exports = {\n addSignal,\n removeSignal\n}\n","'use strict'\n\nconst { AsyncResource } = require('async_hooks')\nconst { InvalidArgumentError, RequestAbortedError, SocketError } = require('../core/errors')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass ConnectHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n const { signal, opaque, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n super('UNDICI_CONNECT')\n\n this.opaque = opaque || null\n this.responseHeaders = responseHeaders || null\n this.callback = callback\n this.abort = null\n\n addSignal(this, signal)\n }\n\n onConnect (abort, context) {\n if (!this.callback) {\n throw new RequestAbortedError()\n }\n\n this.abort = abort\n this.context = context\n }\n\n onHeaders () {\n throw new SocketError('bad connect', null)\n }\n\n onUpgrade (statusCode, rawHeaders, socket) {\n const { callback, opaque, context } = this\n\n removeSignal(this)\n\n this.callback = null\n\n let headers = rawHeaders\n // Indicates is an HTTP2Session\n if (headers != null) {\n headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n }\n\n this.runInAsyncScope(callback, null, null, {\n statusCode,\n headers,\n socket,\n opaque,\n context\n })\n }\n\n onError (err) {\n const { callback, opaque } = this\n\n removeSignal(this)\n\n if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n }\n}\n\nfunction connect (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n connect.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const connectHandler = new ConnectHandler(opts, callback)\n this.dispatch({ ...opts, method: 'CONNECT' }, connectHandler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts && opts.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = connect\n","'use strict'\n\nconst {\n Readable,\n Duplex,\n PassThrough\n} = require('stream')\nconst {\n InvalidArgumentError,\n InvalidReturnValueError,\n RequestAbortedError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { AsyncResource } = require('async_hooks')\nconst { addSignal, removeSignal } = require('./abort-signal')\nconst assert = require('assert')\n\nconst kResume = Symbol('resume')\n\nclass PipelineRequest extends Readable {\n constructor () {\n super({ autoDestroy: true })\n\n this[kResume] = null\n }\n\n _read () {\n const { [kResume]: resume } = this\n\n if (resume) {\n this[kResume] = null\n resume()\n }\n }\n\n _destroy (err, callback) {\n this._read()\n\n callback(err)\n }\n}\n\nclass PipelineResponse extends Readable {\n constructor (resume) {\n super({ autoDestroy: true })\n this[kResume] = resume\n }\n\n _read () {\n this[kResume]()\n }\n\n _destroy (err, callback) {\n if (!err && !this._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n callback(err)\n }\n}\n\nclass PipelineHandler extends AsyncResource {\n constructor (opts, handler) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof handler !== 'function') {\n throw new InvalidArgumentError('invalid handler')\n }\n\n const { signal, method, opaque, onInfo, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_PIPELINE')\n\n this.opaque = opaque || null\n this.responseHeaders = responseHeaders || null\n this.handler = handler\n this.abort = null\n this.context = null\n this.onInfo = onInfo || null\n\n this.req = new PipelineRequest().on('error', util.nop)\n\n this.ret = new Duplex({\n readableObjectMode: opts.objectMode,\n autoDestroy: true,\n read: () => {\n const { body } = this\n\n if (body && body.resume) {\n body.resume()\n }\n },\n write: (chunk, encoding, callback) => {\n const { req } = this\n\n if (req.push(chunk, encoding) || req._readableState.destroyed) {\n callback()\n } else {\n req[kResume] = callback\n }\n },\n destroy: (err, callback) => {\n const { body, req, res, ret, abort } = this\n\n if (!err && !ret._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n if (abort && err) {\n abort()\n }\n\n util.destroy(body, err)\n util.destroy(req, err)\n util.destroy(res, err)\n\n removeSignal(this)\n\n callback(err)\n }\n }).on('prefinish', () => {\n const { req } = this\n\n // Node < 15 does not call _final in same tick.\n req.push(null)\n })\n\n this.res = null\n\n addSignal(this, signal)\n }\n\n onConnect (abort, context) {\n const { ret, res } = this\n\n assert(!res, 'pipeline cannot be retried')\n\n if (ret.destroyed) {\n throw new RequestAbortedError()\n }\n\n this.abort = abort\n this.context = context\n }\n\n onHeaders (statusCode, rawHeaders, resume) {\n const { opaque, handler, context } = this\n\n if (statusCode < 200) {\n if (this.onInfo) {\n const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n this.onInfo({ statusCode, headers })\n }\n return\n }\n\n this.res = new PipelineResponse(resume)\n\n let body\n try {\n this.handler = null\n const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n body = this.runInAsyncScope(handler, null, {\n statusCode,\n headers,\n opaque,\n body: this.res,\n context\n })\n } catch (err) {\n this.res.on('error', util.nop)\n throw err\n }\n\n if (!body || typeof body.on !== 'function') {\n throw new InvalidReturnValueError('expected Readable')\n }\n\n body\n .on('data', (chunk) => {\n const { ret, body } = this\n\n if (!ret.push(chunk) && body.pause) {\n body.pause()\n }\n })\n .on('error', (err) => {\n const { ret } = this\n\n util.destroy(ret, err)\n })\n .on('end', () => {\n const { ret } = this\n\n ret.push(null)\n })\n .on('close', () => {\n const { ret } = this\n\n if (!ret._readableState.ended) {\n util.destroy(ret, new RequestAbortedError())\n }\n })\n\n this.body = body\n }\n\n onData (chunk) {\n const { res } = this\n return res.push(chunk)\n }\n\n onComplete (trailers) {\n const { res } = this\n res.push(null)\n }\n\n onError (err) {\n const { ret } = this\n this.handler = null\n util.destroy(ret, err)\n }\n}\n\nfunction pipeline (opts, handler) {\n try {\n const pipelineHandler = new PipelineHandler(opts, handler)\n this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler)\n return pipelineHandler.ret\n } catch (err) {\n return new PassThrough().destroy(err)\n }\n}\n\nmodule.exports = pipeline\n","'use strict'\n\nconst Readable = require('./readable')\nconst {\n InvalidArgumentError,\n RequestAbortedError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { getResolveErrorBodyCallback } = require('./util')\nconst { AsyncResource } = require('async_hooks')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass RequestHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts\n\n try {\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) {\n throw new InvalidArgumentError('invalid highWaterMark')\n }\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_REQUEST')\n } catch (err) {\n if (util.isStream(body)) {\n util.destroy(body.on('error', util.nop), err)\n }\n throw err\n }\n\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.callback = callback\n this.res = null\n this.abort = null\n this.body = body\n this.trailers = {}\n this.context = null\n this.onInfo = onInfo || null\n this.throwOnError = throwOnError\n this.highWaterMark = highWaterMark\n\n if (util.isStream(body)) {\n body.on('error', (err) => {\n this.onError(err)\n })\n }\n\n addSignal(this, signal)\n }\n\n onConnect (abort, context) {\n if (!this.callback) {\n throw new RequestAbortedError()\n }\n\n this.abort = abort\n this.context = context\n }\n\n onHeaders (statusCode, rawHeaders, resume, statusMessage) {\n const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this\n\n const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n\n if (statusCode < 200) {\n if (this.onInfo) {\n this.onInfo({ statusCode, headers })\n }\n return\n }\n\n const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers\n const contentType = parsedHeaders['content-type']\n const body = new Readable({ resume, abort, contentType, highWaterMark })\n\n this.callback = null\n this.res = body\n if (callback !== null) {\n if (this.throwOnError && statusCode >= 400) {\n this.runInAsyncScope(getResolveErrorBodyCallback, null,\n { callback, body, contentType, statusCode, statusMessage, headers }\n )\n } else {\n this.runInAsyncScope(callback, null, null, {\n statusCode,\n headers,\n trailers: this.trailers,\n opaque,\n body,\n context\n })\n }\n }\n }\n\n onData (chunk) {\n const { res } = this\n return res.push(chunk)\n }\n\n onComplete (trailers) {\n const { res } = this\n\n removeSignal(this)\n\n util.parseHeaders(trailers, this.trailers)\n\n res.push(null)\n }\n\n onError (err) {\n const { res, callback, body, opaque } = this\n\n removeSignal(this)\n\n if (callback) {\n // TODO: Does this need queueMicrotask?\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n\n if (res) {\n this.res = null\n // Ensure all queued handlers are invoked before destroying res.\n queueMicrotask(() => {\n util.destroy(res, err)\n })\n }\n\n if (body) {\n this.body = null\n util.destroy(body, err)\n }\n }\n}\n\nfunction request (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n request.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n this.dispatch(opts, new RequestHandler(opts, callback))\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts && opts.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = request\n","'use strict'\n\nconst { finished, PassThrough } = require('stream')\nconst {\n InvalidArgumentError,\n InvalidReturnValueError,\n RequestAbortedError\n} = require('../core/errors')\nconst util = require('../core/util')\nconst { getResolveErrorBodyCallback } = require('./util')\nconst { AsyncResource } = require('async_hooks')\nconst { addSignal, removeSignal } = require('./abort-signal')\n\nclass StreamHandler extends AsyncResource {\n constructor (opts, factory, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts\n\n try {\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('invalid factory')\n }\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n if (method === 'CONNECT') {\n throw new InvalidArgumentError('invalid method')\n }\n\n if (onInfo && typeof onInfo !== 'function') {\n throw new InvalidArgumentError('invalid onInfo callback')\n }\n\n super('UNDICI_STREAM')\n } catch (err) {\n if (util.isStream(body)) {\n util.destroy(body.on('error', util.nop), err)\n }\n throw err\n }\n\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.factory = factory\n this.callback = callback\n this.res = null\n this.abort = null\n this.context = null\n this.trailers = null\n this.body = body\n this.onInfo = onInfo || null\n this.throwOnError = throwOnError || false\n\n if (util.isStream(body)) {\n body.on('error', (err) => {\n this.onError(err)\n })\n }\n\n addSignal(this, signal)\n }\n\n onConnect (abort, context) {\n if (!this.callback) {\n throw new RequestAbortedError()\n }\n\n this.abort = abort\n this.context = context\n }\n\n onHeaders (statusCode, rawHeaders, resume, statusMessage) {\n const { factory, opaque, context, callback, responseHeaders } = this\n\n const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n\n if (statusCode < 200) {\n if (this.onInfo) {\n this.onInfo({ statusCode, headers })\n }\n return\n }\n\n this.factory = null\n\n let res\n\n if (this.throwOnError && statusCode >= 400) {\n const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers\n const contentType = parsedHeaders['content-type']\n res = new PassThrough()\n\n this.callback = null\n this.runInAsyncScope(getResolveErrorBodyCallback, null,\n { callback, body: res, contentType, statusCode, statusMessage, headers }\n )\n } else {\n if (factory === null) {\n return\n }\n\n res = this.runInAsyncScope(factory, null, {\n statusCode,\n headers,\n opaque,\n context\n })\n\n if (\n !res ||\n typeof res.write !== 'function' ||\n typeof res.end !== 'function' ||\n typeof res.on !== 'function'\n ) {\n throw new InvalidReturnValueError('expected Writable')\n }\n\n // TODO: Avoid finished. It registers an unnecessary amount of listeners.\n finished(res, { readable: false }, (err) => {\n const { callback, res, opaque, trailers, abort } = this\n\n this.res = null\n if (err || !res.readable) {\n util.destroy(res, err)\n }\n\n this.callback = null\n this.runInAsyncScope(callback, null, err || null, { opaque, trailers })\n\n if (err) {\n abort()\n }\n })\n }\n\n res.on('drain', resume)\n\n this.res = res\n\n const needDrain = res.writableNeedDrain !== undefined\n ? res.writableNeedDrain\n : res._writableState && res._writableState.needDrain\n\n return needDrain !== true\n }\n\n onData (chunk) {\n const { res } = this\n\n return res ? res.write(chunk) : true\n }\n\n onComplete (trailers) {\n const { res } = this\n\n removeSignal(this)\n\n if (!res) {\n return\n }\n\n this.trailers = util.parseHeaders(trailers)\n\n res.end()\n }\n\n onError (err) {\n const { res, callback, opaque, body } = this\n\n removeSignal(this)\n\n this.factory = null\n\n if (res) {\n this.res = null\n util.destroy(res, err)\n } else if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n\n if (body) {\n this.body = null\n util.destroy(body, err)\n }\n }\n}\n\nfunction stream (opts, factory, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n stream.call(this, opts, factory, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n this.dispatch(opts, new StreamHandler(opts, factory, callback))\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts && opts.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = stream\n","'use strict'\n\nconst { InvalidArgumentError, RequestAbortedError, SocketError } = require('../core/errors')\nconst { AsyncResource } = require('async_hooks')\nconst util = require('../core/util')\nconst { addSignal, removeSignal } = require('./abort-signal')\nconst assert = require('assert')\n\nclass UpgradeHandler extends AsyncResource {\n constructor (opts, callback) {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('invalid opts')\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n const { signal, opaque, responseHeaders } = opts\n\n if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') {\n throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget')\n }\n\n super('UNDICI_UPGRADE')\n\n this.responseHeaders = responseHeaders || null\n this.opaque = opaque || null\n this.callback = callback\n this.abort = null\n this.context = null\n\n addSignal(this, signal)\n }\n\n onConnect (abort, context) {\n if (!this.callback) {\n throw new RequestAbortedError()\n }\n\n this.abort = abort\n this.context = null\n }\n\n onHeaders () {\n throw new SocketError('bad upgrade', null)\n }\n\n onUpgrade (statusCode, rawHeaders, socket) {\n const { callback, opaque, context } = this\n\n assert.strictEqual(statusCode, 101)\n\n removeSignal(this)\n\n this.callback = null\n const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders)\n this.runInAsyncScope(callback, null, null, {\n headers,\n socket,\n opaque,\n context\n })\n }\n\n onError (err) {\n const { callback, opaque } = this\n\n removeSignal(this)\n\n if (callback) {\n this.callback = null\n queueMicrotask(() => {\n this.runInAsyncScope(callback, null, err, { opaque })\n })\n }\n }\n}\n\nfunction upgrade (opts, callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n upgrade.call(this, opts, (err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n try {\n const upgradeHandler = new UpgradeHandler(opts, callback)\n this.dispatch({\n ...opts,\n method: opts.method || 'GET',\n upgrade: opts.protocol || 'Websocket'\n }, upgradeHandler)\n } catch (err) {\n if (typeof callback !== 'function') {\n throw err\n }\n const opaque = opts && opts.opaque\n queueMicrotask(() => callback(err, { opaque }))\n }\n}\n\nmodule.exports = upgrade\n","'use strict'\n\nmodule.exports.request = require('./api-request')\nmodule.exports.stream = require('./api-stream')\nmodule.exports.pipeline = require('./api-pipeline')\nmodule.exports.upgrade = require('./api-upgrade')\nmodule.exports.connect = require('./api-connect')\n","// Ported from https://github.com/nodejs/undici/pull/907\n\n'use strict'\n\nconst assert = require('assert')\nconst { Readable } = require('stream')\nconst { RequestAbortedError, NotSupportedError, InvalidArgumentError } = require('../core/errors')\nconst util = require('../core/util')\nconst { ReadableStreamFrom, toUSVString } = require('../core/util')\n\nlet Blob\n\nconst kConsume = Symbol('kConsume')\nconst kReading = Symbol('kReading')\nconst kBody = Symbol('kBody')\nconst kAbort = Symbol('abort')\nconst kContentType = Symbol('kContentType')\n\nmodule.exports = class BodyReadable extends Readable {\n constructor ({\n resume,\n abort,\n contentType = '',\n highWaterMark = 64 * 1024 // Same as nodejs fs streams.\n }) {\n super({\n autoDestroy: true,\n read: resume,\n highWaterMark\n })\n\n this._readableState.dataEmitted = false\n\n this[kAbort] = abort\n this[kConsume] = null\n this[kBody] = null\n this[kContentType] = contentType\n\n // Is stream being consumed through Readable API?\n // This is an optimization so that we avoid checking\n // for 'data' and 'readable' listeners in the hot path\n // inside push().\n this[kReading] = false\n }\n\n destroy (err) {\n if (this.destroyed) {\n // Node < 16\n return this\n }\n\n if (!err && !this._readableState.endEmitted) {\n err = new RequestAbortedError()\n }\n\n if (err) {\n this[kAbort]()\n }\n\n return super.destroy(err)\n }\n\n emit (ev, ...args) {\n if (ev === 'data') {\n // Node < 16.7\n this._readableState.dataEmitted = true\n } else if (ev === 'error') {\n // Node < 16\n this._readableState.errorEmitted = true\n }\n return super.emit(ev, ...args)\n }\n\n on (ev, ...args) {\n if (ev === 'data' || ev === 'readable') {\n this[kReading] = true\n }\n return super.on(ev, ...args)\n }\n\n addListener (ev, ...args) {\n return this.on(ev, ...args)\n }\n\n off (ev, ...args) {\n const ret = super.off(ev, ...args)\n if (ev === 'data' || ev === 'readable') {\n this[kReading] = (\n this.listenerCount('data') > 0 ||\n this.listenerCount('readable') > 0\n )\n }\n return ret\n }\n\n removeListener (ev, ...args) {\n return this.off(ev, ...args)\n }\n\n push (chunk) {\n if (this[kConsume] && chunk !== null && this.readableLength === 0) {\n consumePush(this[kConsume], chunk)\n return this[kReading] ? super.push(chunk) : true\n }\n return super.push(chunk)\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-text\n async text () {\n return consume(this, 'text')\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-json\n async json () {\n return consume(this, 'json')\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-blob\n async blob () {\n return consume(this, 'blob')\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-arraybuffer\n async arrayBuffer () {\n return consume(this, 'arrayBuffer')\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-formdata\n async formData () {\n // TODO: Implement.\n throw new NotSupportedError()\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-bodyused\n get bodyUsed () {\n return util.isDisturbed(this)\n }\n\n // https://fetch.spec.whatwg.org/#dom-body-body\n get body () {\n if (!this[kBody]) {\n this[kBody] = ReadableStreamFrom(this)\n if (this[kConsume]) {\n // TODO: Is this the best way to force a lock?\n this[kBody].getReader() // Ensure stream is locked.\n assert(this[kBody].locked)\n }\n }\n return this[kBody]\n }\n\n async dump (opts) {\n let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144\n const signal = opts && opts.signal\n const abortFn = () => {\n this.destroy()\n }\n let signalListenerCleanup\n if (signal) {\n if (typeof signal !== 'object' || !('aborted' in signal)) {\n throw new InvalidArgumentError('signal must be an AbortSignal')\n }\n util.throwIfAborted(signal)\n signalListenerCleanup = util.addAbortListener(signal, abortFn)\n }\n try {\n for await (const chunk of this) {\n util.throwIfAborted(signal)\n limit -= Buffer.byteLength(chunk)\n if (limit < 0) {\n return\n }\n }\n } catch {\n util.throwIfAborted(signal)\n } finally {\n if (typeof signalListenerCleanup === 'function') {\n signalListenerCleanup()\n } else if (signalListenerCleanup) {\n signalListenerCleanup[Symbol.dispose]()\n }\n }\n }\n}\n\n// https://streams.spec.whatwg.org/#readablestream-locked\nfunction isLocked (self) {\n // Consume is an implicit lock.\n return (self[kBody] && self[kBody].locked === true) || self[kConsume]\n}\n\n// https://fetch.spec.whatwg.org/#body-unusable\nfunction isUnusable (self) {\n return util.isDisturbed(self) || isLocked(self)\n}\n\nasync function consume (stream, type) {\n if (isUnusable(stream)) {\n throw new TypeError('unusable')\n }\n\n assert(!stream[kConsume])\n\n return new Promise((resolve, reject) => {\n stream[kConsume] = {\n type,\n stream,\n resolve,\n reject,\n length: 0,\n body: []\n }\n\n stream\n .on('error', function (err) {\n consumeFinish(this[kConsume], err)\n })\n .on('close', function () {\n if (this[kConsume].body !== null) {\n consumeFinish(this[kConsume], new RequestAbortedError())\n }\n })\n\n process.nextTick(consumeStart, stream[kConsume])\n })\n}\n\nfunction consumeStart (consume) {\n if (consume.body === null) {\n return\n }\n\n const { _readableState: state } = consume.stream\n\n for (const chunk of state.buffer) {\n consumePush(consume, chunk)\n }\n\n if (state.endEmitted) {\n consumeEnd(this[kConsume])\n } else {\n consume.stream.on('end', function () {\n consumeEnd(this[kConsume])\n })\n }\n\n consume.stream.resume()\n\n while (consume.stream.read() != null) {\n // Loop\n }\n}\n\nfunction consumeEnd (consume) {\n const { type, body, resolve, stream, length } = consume\n\n try {\n if (type === 'text') {\n resolve(toUSVString(Buffer.concat(body)))\n } else if (type === 'json') {\n resolve(JSON.parse(Buffer.concat(body)))\n } else if (type === 'arrayBuffer') {\n const dst = new Uint8Array(length)\n\n let pos = 0\n for (const buf of body) {\n dst.set(buf, pos)\n pos += buf.byteLength\n }\n\n resolve(dst.buffer)\n } else if (type === 'blob') {\n if (!Blob) {\n Blob = require('buffer').Blob\n }\n resolve(new Blob(body, { type: stream[kContentType] }))\n }\n\n consumeFinish(consume)\n } catch (err) {\n stream.destroy(err)\n }\n}\n\nfunction consumePush (consume, chunk) {\n consume.length += chunk.length\n consume.body.push(chunk)\n}\n\nfunction consumeFinish (consume, err) {\n if (consume.body === null) {\n return\n }\n\n if (err) {\n consume.reject(err)\n } else {\n consume.resolve()\n }\n\n consume.type = null\n consume.stream = null\n consume.resolve = null\n consume.reject = null\n consume.length = 0\n consume.body = null\n}\n","const assert = require('assert')\nconst {\n ResponseStatusCodeError\n} = require('../core/errors')\nconst { toUSVString } = require('../core/util')\n\nasync function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) {\n assert(body)\n\n let chunks = []\n let limit = 0\n\n for await (const chunk of body) {\n chunks.push(chunk)\n limit += chunk.length\n if (limit > 128 * 1024) {\n chunks = null\n break\n }\n }\n\n if (statusCode === 204 || !contentType || !chunks) {\n process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers))\n return\n }\n\n try {\n if (contentType.startsWith('application/json')) {\n const payload = JSON.parse(toUSVString(Buffer.concat(chunks)))\n process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload))\n return\n }\n\n if (contentType.startsWith('text/')) {\n const payload = toUSVString(Buffer.concat(chunks))\n process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload))\n return\n }\n } catch (err) {\n // Process in a fallback if error\n }\n\n process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers))\n}\n\nmodule.exports = { getResolveErrorBodyCallback }\n","'use strict'\n\nconst {\n BalancedPoolMissingUpstreamError,\n InvalidArgumentError\n} = require('./core/errors')\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kRemoveClient,\n kGetDispatcher\n} = require('./pool-base')\nconst Pool = require('./pool')\nconst { kUrl, kInterceptors } = require('./core/symbols')\nconst { parseOrigin } = require('./core/util')\nconst kFactory = Symbol('factory')\n\nconst kOptions = Symbol('options')\nconst kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor')\nconst kCurrentWeight = Symbol('kCurrentWeight')\nconst kIndex = Symbol('kIndex')\nconst kWeight = Symbol('kWeight')\nconst kMaxWeightPerServer = Symbol('kMaxWeightPerServer')\nconst kErrorPenalty = Symbol('kErrorPenalty')\n\nfunction getGreatestCommonDivisor (a, b) {\n if (b === 0) return a\n return getGreatestCommonDivisor(b, a % b)\n}\n\nfunction defaultFactory (origin, opts) {\n return new Pool(origin, opts)\n}\n\nclass BalancedPool extends PoolBase {\n constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) {\n super()\n\n this[kOptions] = opts\n this[kIndex] = -1\n this[kCurrentWeight] = 0\n\n this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100\n this[kErrorPenalty] = this[kOptions].errorPenalty || 15\n\n if (!Array.isArray(upstreams)) {\n upstreams = [upstreams]\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool)\n ? opts.interceptors.BalancedPool\n : []\n this[kFactory] = factory\n\n for (const upstream of upstreams) {\n this.addUpstream(upstream)\n }\n this._updateBalancedPoolStats()\n }\n\n addUpstream (upstream) {\n const upstreamOrigin = parseOrigin(upstream).origin\n\n if (this[kClients].find((pool) => (\n pool[kUrl].origin === upstreamOrigin &&\n pool.closed !== true &&\n pool.destroyed !== true\n ))) {\n return this\n }\n const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions]))\n\n this[kAddClient](pool)\n pool.on('connect', () => {\n pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty])\n })\n\n pool.on('connectionError', () => {\n pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty])\n this._updateBalancedPoolStats()\n })\n\n pool.on('disconnect', (...args) => {\n const err = args[2]\n if (err && err.code === 'UND_ERR_SOCKET') {\n // decrease the weight of the pool.\n pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty])\n this._updateBalancedPoolStats()\n }\n })\n\n for (const client of this[kClients]) {\n client[kWeight] = this[kMaxWeightPerServer]\n }\n\n this._updateBalancedPoolStats()\n\n return this\n }\n\n _updateBalancedPoolStats () {\n this[kGreatestCommonDivisor] = this[kClients].map(p => p[kWeight]).reduce(getGreatestCommonDivisor, 0)\n }\n\n removeUpstream (upstream) {\n const upstreamOrigin = parseOrigin(upstream).origin\n\n const pool = this[kClients].find((pool) => (\n pool[kUrl].origin === upstreamOrigin &&\n pool.closed !== true &&\n pool.destroyed !== true\n ))\n\n if (pool) {\n this[kRemoveClient](pool)\n }\n\n return this\n }\n\n get upstreams () {\n return this[kClients]\n .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true)\n .map((p) => p[kUrl].origin)\n }\n\n [kGetDispatcher] () {\n // We validate that pools is greater than 0,\n // otherwise we would have to wait until an upstream\n // is added, which might never happen.\n if (this[kClients].length === 0) {\n throw new BalancedPoolMissingUpstreamError()\n }\n\n const dispatcher = this[kClients].find(dispatcher => (\n !dispatcher[kNeedDrain] &&\n dispatcher.closed !== true &&\n dispatcher.destroyed !== true\n ))\n\n if (!dispatcher) {\n return\n }\n\n const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true)\n\n if (allClientsBusy) {\n return\n }\n\n let counter = 0\n\n let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain])\n\n while (counter++ < this[kClients].length) {\n this[kIndex] = (this[kIndex] + 1) % this[kClients].length\n const pool = this[kClients][this[kIndex]]\n\n // find pool index with the largest weight\n if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) {\n maxWeightIndex = this[kIndex]\n }\n\n // decrease the current weight every `this[kClients].length`.\n if (this[kIndex] === 0) {\n // Set the current weight to the next lower weight.\n this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]\n\n if (this[kCurrentWeight] <= 0) {\n this[kCurrentWeight] = this[kMaxWeightPerServer]\n }\n }\n if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) {\n return pool\n }\n }\n\n this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]\n this[kIndex] = maxWeightIndex\n return this[kClients][maxWeightIndex]\n }\n}\n\nmodule.exports = BalancedPool\n","'use strict'\n\nconst { kConstruct } = require('./symbols')\nconst { urlEquals, fieldValues: getFieldValues } = require('./util')\nconst { kEnumerableProperty, isDisturbed } = require('../core/util')\nconst { kHeadersList } = require('../core/symbols')\nconst { webidl } = require('../fetch/webidl')\nconst { Response, cloneResponse } = require('../fetch/response')\nconst { Request } = require('../fetch/request')\nconst { kState, kHeaders, kGuard, kRealm } = require('../fetch/symbols')\nconst { fetching } = require('../fetch/index')\nconst { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require('../fetch/util')\nconst assert = require('assert')\nconst { getGlobalDispatcher } = require('../global')\n\n/**\n * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation\n * @typedef {Object} CacheBatchOperation\n * @property {'delete' | 'put'} type\n * @property {any} request\n * @property {any} response\n * @property {import('../../types/cache').CacheQueryOptions} options\n */\n\n/**\n * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list\n * @typedef {[any, any][]} requestResponseList\n */\n\nclass Cache {\n /**\n * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list\n * @type {requestResponseList}\n */\n #relevantRequestResponseList\n\n constructor () {\n if (arguments[0] !== kConstruct) {\n webidl.illegalConstructor()\n }\n\n this.#relevantRequestResponseList = arguments[1]\n }\n\n async match (request, options = {}) {\n webidl.brandCheck(this, Cache)\n webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.match' })\n\n request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options)\n\n const p = await this.matchAll(request, options)\n\n if (p.length === 0) {\n return\n }\n\n return p[0]\n }\n\n async matchAll (request = undefined, options = {}) {\n webidl.brandCheck(this, Cache)\n\n if (request !== undefined) request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options)\n\n // 1.\n let r = null\n\n // 2.\n if (request !== undefined) {\n if (request instanceof Request) {\n // 2.1.1\n r = request[kState]\n\n // 2.1.2\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return []\n }\n } else if (typeof request === 'string') {\n // 2.2.1\n r = new Request(request)[kState]\n }\n }\n\n // 5.\n // 5.1\n const responses = []\n\n // 5.2\n if (request === undefined) {\n // 5.2.1\n for (const requestResponse of this.#relevantRequestResponseList) {\n responses.push(requestResponse[1])\n }\n } else { // 5.3\n // 5.3.1\n const requestResponses = this.#queryCache(r, options)\n\n // 5.3.2\n for (const requestResponse of requestResponses) {\n responses.push(requestResponse[1])\n }\n }\n\n // 5.4\n // We don't implement CORs so we don't need to loop over the responses, yay!\n\n // 5.5.1\n const responseList = []\n\n // 5.5.2\n for (const response of responses) {\n // 5.5.2.1\n const responseObject = new Response(response.body?.source ?? null)\n const body = responseObject[kState].body\n responseObject[kState] = response\n responseObject[kState].body = body\n responseObject[kHeaders][kHeadersList] = response.headersList\n responseObject[kHeaders][kGuard] = 'immutable'\n\n responseList.push(responseObject)\n }\n\n // 6.\n return Object.freeze(responseList)\n }\n\n async add (request) {\n webidl.brandCheck(this, Cache)\n webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.add' })\n\n request = webidl.converters.RequestInfo(request)\n\n // 1.\n const requests = [request]\n\n // 2.\n const responseArrayPromise = this.addAll(requests)\n\n // 3.\n return await responseArrayPromise\n }\n\n async addAll (requests) {\n webidl.brandCheck(this, Cache)\n webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.addAll' })\n\n requests = webidl.converters['sequence'](requests)\n\n // 1.\n const responsePromises = []\n\n // 2.\n const requestList = []\n\n // 3.\n for (const request of requests) {\n if (typeof request === 'string') {\n continue\n }\n\n // 3.1\n const r = request[kState]\n\n // 3.2\n if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') {\n throw webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'Expected http/s scheme when method is not GET.'\n })\n }\n }\n\n // 4.\n /** @type {ReturnType[]} */\n const fetchControllers = []\n\n // 5.\n for (const request of requests) {\n // 5.1\n const r = new Request(request)[kState]\n\n // 5.2\n if (!urlIsHttpHttpsScheme(r.url)) {\n throw webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'Expected http/s scheme.'\n })\n }\n\n // 5.4\n r.initiator = 'fetch'\n r.destination = 'subresource'\n\n // 5.5\n requestList.push(r)\n\n // 5.6\n const responsePromise = createDeferredPromise()\n\n // 5.7\n fetchControllers.push(fetching({\n request: r,\n dispatcher: getGlobalDispatcher(),\n processResponse (response) {\n // 1.\n if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) {\n responsePromise.reject(webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'Received an invalid status code or the request failed.'\n }))\n } else if (response.headersList.contains('vary')) { // 2.\n // 2.1\n const fieldValues = getFieldValues(response.headersList.get('vary'))\n\n // 2.2\n for (const fieldValue of fieldValues) {\n // 2.2.1\n if (fieldValue === '*') {\n responsePromise.reject(webidl.errors.exception({\n header: 'Cache.addAll',\n message: 'invalid vary field value'\n }))\n\n for (const controller of fetchControllers) {\n controller.abort()\n }\n\n return\n }\n }\n }\n },\n processResponseEndOfBody (response) {\n // 1.\n if (response.aborted) {\n responsePromise.reject(new DOMException('aborted', 'AbortError'))\n return\n }\n\n // 2.\n responsePromise.resolve(response)\n }\n }))\n\n // 5.8\n responsePromises.push(responsePromise.promise)\n }\n\n // 6.\n const p = Promise.all(responsePromises)\n\n // 7.\n const responses = await p\n\n // 7.1\n const operations = []\n\n // 7.2\n let index = 0\n\n // 7.3\n for (const response of responses) {\n // 7.3.1\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'put', // 7.3.2\n request: requestList[index], // 7.3.3\n response // 7.3.4\n }\n\n operations.push(operation) // 7.3.5\n\n index++ // 7.3.6\n }\n\n // 7.5\n const cacheJobPromise = createDeferredPromise()\n\n // 7.6.1\n let errorData = null\n\n // 7.6.2\n try {\n this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n // 7.6.3\n queueMicrotask(() => {\n // 7.6.3.1\n if (errorData === null) {\n cacheJobPromise.resolve(undefined)\n } else {\n // 7.6.3.2\n cacheJobPromise.reject(errorData)\n }\n })\n\n // 7.7\n return cacheJobPromise.promise\n }\n\n async put (request, response) {\n webidl.brandCheck(this, Cache)\n webidl.argumentLengthCheck(arguments, 2, { header: 'Cache.put' })\n\n request = webidl.converters.RequestInfo(request)\n response = webidl.converters.Response(response)\n\n // 1.\n let innerRequest = null\n\n // 2.\n if (request instanceof Request) {\n innerRequest = request[kState]\n } else { // 3.\n innerRequest = new Request(request)[kState]\n }\n\n // 4.\n if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') {\n throw webidl.errors.exception({\n header: 'Cache.put',\n message: 'Expected an http/s scheme when method is not GET'\n })\n }\n\n // 5.\n const innerResponse = response[kState]\n\n // 6.\n if (innerResponse.status === 206) {\n throw webidl.errors.exception({\n header: 'Cache.put',\n message: 'Got 206 status'\n })\n }\n\n // 7.\n if (innerResponse.headersList.contains('vary')) {\n // 7.1.\n const fieldValues = getFieldValues(innerResponse.headersList.get('vary'))\n\n // 7.2.\n for (const fieldValue of fieldValues) {\n // 7.2.1\n if (fieldValue === '*') {\n throw webidl.errors.exception({\n header: 'Cache.put',\n message: 'Got * vary field value'\n })\n }\n }\n }\n\n // 8.\n if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) {\n throw webidl.errors.exception({\n header: 'Cache.put',\n message: 'Response body is locked or disturbed'\n })\n }\n\n // 9.\n const clonedResponse = cloneResponse(innerResponse)\n\n // 10.\n const bodyReadPromise = createDeferredPromise()\n\n // 11.\n if (innerResponse.body != null) {\n // 11.1\n const stream = innerResponse.body.stream\n\n // 11.2\n const reader = stream.getReader()\n\n // 11.3\n readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject)\n } else {\n bodyReadPromise.resolve(undefined)\n }\n\n // 12.\n /** @type {CacheBatchOperation[]} */\n const operations = []\n\n // 13.\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'put', // 14.\n request: innerRequest, // 15.\n response: clonedResponse // 16.\n }\n\n // 17.\n operations.push(operation)\n\n // 19.\n const bytes = await bodyReadPromise.promise\n\n if (clonedResponse.body != null) {\n clonedResponse.body.source = bytes\n }\n\n // 19.1\n const cacheJobPromise = createDeferredPromise()\n\n // 19.2.1\n let errorData = null\n\n // 19.2.2\n try {\n this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n // 19.2.3\n queueMicrotask(() => {\n // 19.2.3.1\n if (errorData === null) {\n cacheJobPromise.resolve()\n } else { // 19.2.3.2\n cacheJobPromise.reject(errorData)\n }\n })\n\n return cacheJobPromise.promise\n }\n\n async delete (request, options = {}) {\n webidl.brandCheck(this, Cache)\n webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.delete' })\n\n request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options)\n\n /**\n * @type {Request}\n */\n let r = null\n\n if (request instanceof Request) {\n r = request[kState]\n\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return false\n }\n } else {\n assert(typeof request === 'string')\n\n r = new Request(request)[kState]\n }\n\n /** @type {CacheBatchOperation[]} */\n const operations = []\n\n /** @type {CacheBatchOperation} */\n const operation = {\n type: 'delete',\n request: r,\n options\n }\n\n operations.push(operation)\n\n const cacheJobPromise = createDeferredPromise()\n\n let errorData = null\n let requestResponses\n\n try {\n requestResponses = this.#batchCacheOperations(operations)\n } catch (e) {\n errorData = e\n }\n\n queueMicrotask(() => {\n if (errorData === null) {\n cacheJobPromise.resolve(!!requestResponses?.length)\n } else {\n cacheJobPromise.reject(errorData)\n }\n })\n\n return cacheJobPromise.promise\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys\n * @param {any} request\n * @param {import('../../types/cache').CacheQueryOptions} options\n * @returns {readonly Request[]}\n */\n async keys (request = undefined, options = {}) {\n webidl.brandCheck(this, Cache)\n\n if (request !== undefined) request = webidl.converters.RequestInfo(request)\n options = webidl.converters.CacheQueryOptions(options)\n\n // 1.\n let r = null\n\n // 2.\n if (request !== undefined) {\n // 2.1\n if (request instanceof Request) {\n // 2.1.1\n r = request[kState]\n\n // 2.1.2\n if (r.method !== 'GET' && !options.ignoreMethod) {\n return []\n }\n } else if (typeof request === 'string') { // 2.2\n r = new Request(request)[kState]\n }\n }\n\n // 4.\n const promise = createDeferredPromise()\n\n // 5.\n // 5.1\n const requests = []\n\n // 5.2\n if (request === undefined) {\n // 5.2.1\n for (const requestResponse of this.#relevantRequestResponseList) {\n // 5.2.1.1\n requests.push(requestResponse[0])\n }\n } else { // 5.3\n // 5.3.1\n const requestResponses = this.#queryCache(r, options)\n\n // 5.3.2\n for (const requestResponse of requestResponses) {\n // 5.3.2.1\n requests.push(requestResponse[0])\n }\n }\n\n // 5.4\n queueMicrotask(() => {\n // 5.4.1\n const requestList = []\n\n // 5.4.2\n for (const request of requests) {\n const requestObject = new Request('https://a')\n requestObject[kState] = request\n requestObject[kHeaders][kHeadersList] = request.headersList\n requestObject[kHeaders][kGuard] = 'immutable'\n requestObject[kRealm] = request.client\n\n // 5.4.2.1\n requestList.push(requestObject)\n }\n\n // 5.4.3\n promise.resolve(Object.freeze(requestList))\n })\n\n return promise.promise\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm\n * @param {CacheBatchOperation[]} operations\n * @returns {requestResponseList}\n */\n #batchCacheOperations (operations) {\n // 1.\n const cache = this.#relevantRequestResponseList\n\n // 2.\n const backupCache = [...cache]\n\n // 3.\n const addedItems = []\n\n // 4.1\n const resultList = []\n\n try {\n // 4.2\n for (const operation of operations) {\n // 4.2.1\n if (operation.type !== 'delete' && operation.type !== 'put') {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'operation type does not match \"delete\" or \"put\"'\n })\n }\n\n // 4.2.2\n if (operation.type === 'delete' && operation.response != null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'delete operation should not have an associated response'\n })\n }\n\n // 4.2.3\n if (this.#queryCache(operation.request, operation.options, addedItems).length) {\n throw new DOMException('???', 'InvalidStateError')\n }\n\n // 4.2.4\n let requestResponses\n\n // 4.2.5\n if (operation.type === 'delete') {\n // 4.2.5.1\n requestResponses = this.#queryCache(operation.request, operation.options)\n\n // TODO: the spec is wrong, this is needed to pass WPTs\n if (requestResponses.length === 0) {\n return []\n }\n\n // 4.2.5.2\n for (const requestResponse of requestResponses) {\n const idx = cache.indexOf(requestResponse)\n assert(idx !== -1)\n\n // 4.2.5.2.1\n cache.splice(idx, 1)\n }\n } else if (operation.type === 'put') { // 4.2.6\n // 4.2.6.1\n if (operation.response == null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'put operation should have an associated response'\n })\n }\n\n // 4.2.6.2\n const r = operation.request\n\n // 4.2.6.3\n if (!urlIsHttpHttpsScheme(r.url)) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'expected http or https scheme'\n })\n }\n\n // 4.2.6.4\n if (r.method !== 'GET') {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'not get method'\n })\n }\n\n // 4.2.6.5\n if (operation.options != null) {\n throw webidl.errors.exception({\n header: 'Cache.#batchCacheOperations',\n message: 'options must not be defined'\n })\n }\n\n // 4.2.6.6\n requestResponses = this.#queryCache(operation.request)\n\n // 4.2.6.7\n for (const requestResponse of requestResponses) {\n const idx = cache.indexOf(requestResponse)\n assert(idx !== -1)\n\n // 4.2.6.7.1\n cache.splice(idx, 1)\n }\n\n // 4.2.6.8\n cache.push([operation.request, operation.response])\n\n // 4.2.6.10\n addedItems.push([operation.request, operation.response])\n }\n\n // 4.2.7\n resultList.push([operation.request, operation.response])\n }\n\n // 4.3\n return resultList\n } catch (e) { // 5.\n // 5.1\n this.#relevantRequestResponseList.length = 0\n\n // 5.2\n this.#relevantRequestResponseList = backupCache\n\n // 5.3\n throw e\n }\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#query-cache\n * @param {any} requestQuery\n * @param {import('../../types/cache').CacheQueryOptions} options\n * @param {requestResponseList} targetStorage\n * @returns {requestResponseList}\n */\n #queryCache (requestQuery, options, targetStorage) {\n /** @type {requestResponseList} */\n const resultList = []\n\n const storage = targetStorage ?? this.#relevantRequestResponseList\n\n for (const requestResponse of storage) {\n const [cachedRequest, cachedResponse] = requestResponse\n if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) {\n resultList.push(requestResponse)\n }\n }\n\n return resultList\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm\n * @param {any} requestQuery\n * @param {any} request\n * @param {any | null} response\n * @param {import('../../types/cache').CacheQueryOptions | undefined} options\n * @returns {boolean}\n */\n #requestMatchesCachedItem (requestQuery, request, response = null, options) {\n // if (options?.ignoreMethod === false && request.method === 'GET') {\n // return false\n // }\n\n const queryURL = new URL(requestQuery.url)\n\n const cachedURL = new URL(request.url)\n\n if (options?.ignoreSearch) {\n cachedURL.search = ''\n\n queryURL.search = ''\n }\n\n if (!urlEquals(queryURL, cachedURL, true)) {\n return false\n }\n\n if (\n response == null ||\n options?.ignoreVary ||\n !response.headersList.contains('vary')\n ) {\n return true\n }\n\n const fieldValues = getFieldValues(response.headersList.get('vary'))\n\n for (const fieldValue of fieldValues) {\n if (fieldValue === '*') {\n return false\n }\n\n const requestValue = request.headersList.get(fieldValue)\n const queryValue = requestQuery.headersList.get(fieldValue)\n\n // If one has the header and the other doesn't, or one has\n // a different value than the other, return false\n if (requestValue !== queryValue) {\n return false\n }\n }\n\n return true\n }\n}\n\nObject.defineProperties(Cache.prototype, {\n [Symbol.toStringTag]: {\n value: 'Cache',\n configurable: true\n },\n match: kEnumerableProperty,\n matchAll: kEnumerableProperty,\n add: kEnumerableProperty,\n addAll: kEnumerableProperty,\n put: kEnumerableProperty,\n delete: kEnumerableProperty,\n keys: kEnumerableProperty\n})\n\nconst cacheQueryOptionConverters = [\n {\n key: 'ignoreSearch',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'ignoreMethod',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'ignoreVary',\n converter: webidl.converters.boolean,\n defaultValue: false\n }\n]\n\nwebidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters)\n\nwebidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([\n ...cacheQueryOptionConverters,\n {\n key: 'cacheName',\n converter: webidl.converters.DOMString\n }\n])\n\nwebidl.converters.Response = webidl.interfaceConverter(Response)\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.RequestInfo\n)\n\nmodule.exports = {\n Cache\n}\n","'use strict'\n\nconst { kConstruct } = require('./symbols')\nconst { Cache } = require('./cache')\nconst { webidl } = require('../fetch/webidl')\nconst { kEnumerableProperty } = require('../core/util')\n\nclass CacheStorage {\n /**\n * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map\n * @type {Map}\n */\n async has (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.has' })\n\n cacheName = webidl.converters.DOMString(cacheName)\n\n // 2.1.1\n // 2.2\n return this.#caches.has(cacheName)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open\n * @param {string} cacheName\n * @returns {Promise}\n */\n async open (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.open' })\n\n cacheName = webidl.converters.DOMString(cacheName)\n\n // 2.1\n if (this.#caches.has(cacheName)) {\n // await caches.open('v1') !== await caches.open('v1')\n\n // 2.1.1\n const cache = this.#caches.get(cacheName)\n\n // 2.1.1.1\n return new Cache(kConstruct, cache)\n }\n\n // 2.2\n const cache = []\n\n // 2.3\n this.#caches.set(cacheName, cache)\n\n // 2.4\n return new Cache(kConstruct, cache)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete\n * @param {string} cacheName\n * @returns {Promise}\n */\n async delete (cacheName) {\n webidl.brandCheck(this, CacheStorage)\n webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.delete' })\n\n cacheName = webidl.converters.DOMString(cacheName)\n\n return this.#caches.delete(cacheName)\n }\n\n /**\n * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys\n * @returns {string[]}\n */\n async keys () {\n webidl.brandCheck(this, CacheStorage)\n\n // 2.1\n const keys = this.#caches.keys()\n\n // 2.2\n return [...keys]\n }\n}\n\nObject.defineProperties(CacheStorage.prototype, {\n [Symbol.toStringTag]: {\n value: 'CacheStorage',\n configurable: true\n },\n match: kEnumerableProperty,\n has: kEnumerableProperty,\n open: kEnumerableProperty,\n delete: kEnumerableProperty,\n keys: kEnumerableProperty\n})\n\nmodule.exports = {\n CacheStorage\n}\n","'use strict'\n\nmodule.exports = {\n kConstruct: Symbol('constructable')\n}\n","'use strict'\n\nconst assert = require('assert')\nconst { URLSerializer } = require('../fetch/dataURL')\nconst { isValidHeaderName } = require('../fetch/util')\n\n/**\n * @see https://url.spec.whatwg.org/#concept-url-equals\n * @param {URL} A\n * @param {URL} B\n * @param {boolean | undefined} excludeFragment\n * @returns {boolean}\n */\nfunction urlEquals (A, B, excludeFragment = false) {\n const serializedA = URLSerializer(A, excludeFragment)\n\n const serializedB = URLSerializer(B, excludeFragment)\n\n return serializedA === serializedB\n}\n\n/**\n * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262\n * @param {string} header\n */\nfunction fieldValues (header) {\n assert(header !== null)\n\n const values = []\n\n for (let value of header.split(',')) {\n value = value.trim()\n\n if (!value.length) {\n continue\n } else if (!isValidHeaderName(value)) {\n continue\n }\n\n values.push(value)\n }\n\n return values\n}\n\nmodule.exports = {\n urlEquals,\n fieldValues\n}\n","// @ts-check\n\n'use strict'\n\n/* global WebAssembly */\n\nconst assert = require('assert')\nconst net = require('net')\nconst http = require('http')\nconst { pipeline } = require('stream')\nconst util = require('./core/util')\nconst timers = require('./timers')\nconst Request = require('./core/request')\nconst DispatcherBase = require('./dispatcher-base')\nconst {\n RequestContentLengthMismatchError,\n ResponseContentLengthMismatchError,\n InvalidArgumentError,\n RequestAbortedError,\n HeadersTimeoutError,\n HeadersOverflowError,\n SocketError,\n InformationalError,\n BodyTimeoutError,\n HTTPParserError,\n ResponseExceededMaxSizeError,\n ClientDestroyedError\n} = require('./core/errors')\nconst buildConnector = require('./core/connect')\nconst {\n kUrl,\n kReset,\n kServerName,\n kClient,\n kBusy,\n kParser,\n kConnect,\n kBlocking,\n kResuming,\n kRunning,\n kPending,\n kSize,\n kWriting,\n kQueue,\n kConnected,\n kConnecting,\n kNeedDrain,\n kNoRef,\n kKeepAliveDefaultTimeout,\n kHostHeader,\n kPendingIdx,\n kRunningIdx,\n kError,\n kPipelining,\n kSocket,\n kKeepAliveTimeoutValue,\n kMaxHeadersSize,\n kKeepAliveMaxTimeout,\n kKeepAliveTimeoutThreshold,\n kHeadersTimeout,\n kBodyTimeout,\n kStrictContentLength,\n kConnector,\n kMaxRedirections,\n kMaxRequests,\n kCounter,\n kClose,\n kDestroy,\n kDispatch,\n kInterceptors,\n kLocalAddress,\n kMaxResponseSize,\n kHTTPConnVersion,\n // HTTP2\n kHost,\n kHTTP2Session,\n kHTTP2SessionState,\n kHTTP2BuildRequest,\n kHTTP2CopyHeaders,\n kHTTP1BuildRequest\n} = require('./core/symbols')\n\n/** @type {import('http2')} */\nlet http2\ntry {\n http2 = require('http2')\n} catch {\n // @ts-ignore\n http2 = { constants: {} }\n}\n\nconst {\n constants: {\n HTTP2_HEADER_AUTHORITY,\n HTTP2_HEADER_METHOD,\n HTTP2_HEADER_PATH,\n HTTP2_HEADER_SCHEME,\n HTTP2_HEADER_CONTENT_LENGTH,\n HTTP2_HEADER_EXPECT,\n HTTP2_HEADER_STATUS\n }\n} = http2\n\n// Experimental\nlet h2ExperimentalWarned = false\n\nconst FastBuffer = Buffer[Symbol.species]\n\nconst kClosedResolve = Symbol('kClosedResolve')\n\nconst channels = {}\n\ntry {\n const diagnosticsChannel = require('diagnostics_channel')\n channels.sendHeaders = diagnosticsChannel.channel('undici:client:sendHeaders')\n channels.beforeConnect = diagnosticsChannel.channel('undici:client:beforeConnect')\n channels.connectError = diagnosticsChannel.channel('undici:client:connectError')\n channels.connected = diagnosticsChannel.channel('undici:client:connected')\n} catch {\n channels.sendHeaders = { hasSubscribers: false }\n channels.beforeConnect = { hasSubscribers: false }\n channels.connectError = { hasSubscribers: false }\n channels.connected = { hasSubscribers: false }\n}\n\n/**\n * @type {import('../types/client').default}\n */\nclass Client extends DispatcherBase {\n /**\n *\n * @param {string|URL} url\n * @param {import('../types/client').Client.Options} options\n */\n constructor (url, {\n interceptors,\n maxHeaderSize,\n headersTimeout,\n socketTimeout,\n requestTimeout,\n connectTimeout,\n bodyTimeout,\n idleTimeout,\n keepAlive,\n keepAliveTimeout,\n maxKeepAliveTimeout,\n keepAliveMaxTimeout,\n keepAliveTimeoutThreshold,\n socketPath,\n pipelining,\n tls,\n strictContentLength,\n maxCachedSessions,\n maxRedirections,\n connect,\n maxRequestsPerClient,\n localAddress,\n maxResponseSize,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n // h2\n allowH2,\n maxConcurrentStreams\n } = {}) {\n super()\n\n if (keepAlive !== undefined) {\n throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead')\n }\n\n if (socketTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead')\n }\n\n if (requestTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead')\n }\n\n if (idleTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead')\n }\n\n if (maxKeepAliveTimeout !== undefined) {\n throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead')\n }\n\n if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) {\n throw new InvalidArgumentError('invalid maxHeaderSize')\n }\n\n if (socketPath != null && typeof socketPath !== 'string') {\n throw new InvalidArgumentError('invalid socketPath')\n }\n\n if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) {\n throw new InvalidArgumentError('invalid connectTimeout')\n }\n\n if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) {\n throw new InvalidArgumentError('invalid keepAliveTimeout')\n }\n\n if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) {\n throw new InvalidArgumentError('invalid keepAliveMaxTimeout')\n }\n\n if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) {\n throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold')\n }\n\n if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) {\n throw new InvalidArgumentError('headersTimeout must be a positive integer or zero')\n }\n\n if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) {\n throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {\n throw new InvalidArgumentError('maxRedirections must be a positive number')\n }\n\n if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) {\n throw new InvalidArgumentError('maxRequestsPerClient must be a positive number')\n }\n\n if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) {\n throw new InvalidArgumentError('localAddress must be valid string IP address')\n }\n\n if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) {\n throw new InvalidArgumentError('maxResponseSize must be a positive number')\n }\n\n if (\n autoSelectFamilyAttemptTimeout != null &&\n (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)\n ) {\n throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number')\n }\n\n // h2\n if (allowH2 != null && typeof allowH2 !== 'boolean') {\n throw new InvalidArgumentError('allowH2 must be a valid boolean value')\n }\n\n if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) {\n throw new InvalidArgumentError('maxConcurrentStreams must be a possitive integer, greater than 0')\n }\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n socketPath,\n timeout: connectTimeout,\n ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n }\n\n this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client)\n ? interceptors.Client\n : [createRedirectInterceptor({ maxRedirections })]\n this[kUrl] = util.parseOrigin(url)\n this[kConnector] = connect\n this[kSocket] = null\n this[kPipelining] = pipelining != null ? pipelining : 1\n this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize\n this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout\n this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout\n this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold\n this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]\n this[kServerName] = null\n this[kLocalAddress] = localAddress != null ? localAddress : null\n this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming\n this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming\n this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\\r\\n`\n this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3\n this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3\n this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength\n this[kMaxRedirections] = maxRedirections\n this[kMaxRequests] = maxRequestsPerClient\n this[kClosedResolve] = null\n this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1\n this[kHTTPConnVersion] = 'h1'\n\n // HTTP/2\n this[kHTTP2Session] = null\n this[kHTTP2SessionState] = !allowH2\n ? null\n : {\n // streams: null, // Fixed queue of streams - For future support of `push`\n openStreams: 0, // Keep track of them to decide wether or not unref the session\n maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server\n }\n this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}`\n\n // kQueue is built up of 3 sections separated by\n // the kRunningIdx and kPendingIdx indices.\n // | complete | running | pending |\n // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length\n // kRunningIdx points to the first running element.\n // kPendingIdx points to the first pending element.\n // This implements a fast queue with an amortized\n // time of O(1).\n\n this[kQueue] = []\n this[kRunningIdx] = 0\n this[kPendingIdx] = 0\n }\n\n get pipelining () {\n return this[kPipelining]\n }\n\n set pipelining (value) {\n this[kPipelining] = value\n resume(this, true)\n }\n\n get [kPending] () {\n return this[kQueue].length - this[kPendingIdx]\n }\n\n get [kRunning] () {\n return this[kPendingIdx] - this[kRunningIdx]\n }\n\n get [kSize] () {\n return this[kQueue].length - this[kRunningIdx]\n }\n\n get [kConnected] () {\n return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed\n }\n\n get [kBusy] () {\n const socket = this[kSocket]\n return (\n (socket && (socket[kReset] || socket[kWriting] || socket[kBlocking])) ||\n (this[kSize] >= (this[kPipelining] || 1)) ||\n this[kPending] > 0\n )\n }\n\n /* istanbul ignore: only used for test */\n [kConnect] (cb) {\n connect(this)\n this.once('connect', cb)\n }\n\n [kDispatch] (opts, handler) {\n const origin = opts.origin || this[kUrl].origin\n\n const request = this[kHTTPConnVersion] === 'h2'\n ? Request[kHTTP2BuildRequest](origin, opts, handler)\n : Request[kHTTP1BuildRequest](origin, opts, handler)\n\n this[kQueue].push(request)\n if (this[kResuming]) {\n // Do nothing.\n } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) {\n // Wait a tick in case stream/iterator is ended in the same tick.\n this[kResuming] = 1\n process.nextTick(resume, this)\n } else {\n resume(this, true)\n }\n\n if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) {\n this[kNeedDrain] = 2\n }\n\n return this[kNeedDrain] < 2\n }\n\n async [kClose] () {\n // TODO: for H2 we need to gracefully flush the remaining enqueued\n // request and close each stream.\n return new Promise((resolve) => {\n if (!this[kSize]) {\n resolve(null)\n } else {\n this[kClosedResolve] = resolve\n }\n })\n }\n\n async [kDestroy] (err) {\n return new Promise((resolve) => {\n const requests = this[kQueue].splice(this[kPendingIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n errorRequest(this, request, err)\n }\n\n const callback = () => {\n if (this[kClosedResolve]) {\n // TODO (fix): Should we error here with ClientDestroyedError?\n this[kClosedResolve]()\n this[kClosedResolve] = null\n }\n resolve()\n }\n\n if (this[kHTTP2Session] != null) {\n util.destroy(this[kHTTP2Session], err)\n this[kHTTP2Session] = null\n this[kHTTP2SessionState] = null\n }\n\n if (!this[kSocket]) {\n queueMicrotask(callback)\n } else {\n util.destroy(this[kSocket].on('close', callback), err)\n }\n\n resume(this)\n })\n }\n}\n\nfunction onHttp2SessionError (err) {\n assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n this[kSocket][kError] = err\n\n onError(this[kClient], err)\n}\n\nfunction onHttp2FrameError (type, code, id) {\n const err = new InformationalError(`HTTP/2: \"frameError\" received - type ${type}, code ${code}`)\n\n if (id === 0) {\n this[kSocket][kError] = err\n onError(this[kClient], err)\n }\n}\n\nfunction onHttp2SessionEnd () {\n util.destroy(this, new SocketError('other side closed'))\n util.destroy(this[kSocket], new SocketError('other side closed'))\n}\n\nfunction onHTTP2GoAway (code) {\n const client = this[kClient]\n const err = new InformationalError(`HTTP/2: \"GOAWAY\" frame received with code ${code}`)\n client[kSocket] = null\n client[kHTTP2Session] = null\n\n if (client.destroyed) {\n assert(this[kPending] === 0)\n\n // Fail entire queue.\n const requests = client[kQueue].splice(client[kRunningIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n errorRequest(this, request, err)\n }\n } else if (client[kRunning] > 0) {\n // Fail head of pipeline.\n const request = client[kQueue][client[kRunningIdx]]\n client[kQueue][client[kRunningIdx]++] = null\n\n errorRequest(client, request, err)\n }\n\n client[kPendingIdx] = client[kRunningIdx]\n\n assert(client[kRunning] === 0)\n\n client.emit('disconnect',\n client[kUrl],\n [client],\n err\n )\n\n resume(client)\n}\n\nconst constants = require('./llhttp/constants')\nconst createRedirectInterceptor = require('./interceptor/redirectInterceptor')\nconst EMPTY_BUF = Buffer.alloc(0)\n\nasync function lazyllhttp () {\n const llhttpWasmData = process.env.JEST_WORKER_ID ? require('./llhttp/llhttp-wasm.js') : undefined\n\n let mod\n try {\n mod = await WebAssembly.compile(Buffer.from(require('./llhttp/llhttp_simd-wasm.js'), 'base64'))\n } catch (e) {\n /* istanbul ignore next */\n\n // We could check if the error was caused by the simd option not\n // being enabled, but the occurring of this other error\n // * https://github.com/emscripten-core/emscripten/issues/11495\n // got me to remove that check to avoid breaking Node 12.\n mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || require('./llhttp/llhttp-wasm.js'), 'base64'))\n }\n\n return await WebAssembly.instantiate(mod, {\n env: {\n /* eslint-disable camelcase */\n\n wasm_on_url: (p, at, len) => {\n /* istanbul ignore next */\n return 0\n },\n wasm_on_status: (p, at, len) => {\n assert.strictEqual(currentParser.ptr, p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0\n },\n wasm_on_message_begin: (p) => {\n assert.strictEqual(currentParser.ptr, p)\n return currentParser.onMessageBegin() || 0\n },\n wasm_on_header_field: (p, at, len) => {\n assert.strictEqual(currentParser.ptr, p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0\n },\n wasm_on_header_value: (p, at, len) => {\n assert.strictEqual(currentParser.ptr, p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0\n },\n wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => {\n assert.strictEqual(currentParser.ptr, p)\n return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0\n },\n wasm_on_body: (p, at, len) => {\n assert.strictEqual(currentParser.ptr, p)\n const start = at - currentBufferPtr + currentBufferRef.byteOffset\n return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0\n },\n wasm_on_message_complete: (p) => {\n assert.strictEqual(currentParser.ptr, p)\n return currentParser.onMessageComplete() || 0\n }\n\n /* eslint-enable camelcase */\n }\n })\n}\n\nlet llhttpInstance = null\nlet llhttpPromise = lazyllhttp()\nllhttpPromise.catch()\n\nlet currentParser = null\nlet currentBufferRef = null\nlet currentBufferSize = 0\nlet currentBufferPtr = null\n\nconst TIMEOUT_HEADERS = 1\nconst TIMEOUT_BODY = 2\nconst TIMEOUT_IDLE = 3\n\nclass Parser {\n constructor (client, socket, { exports }) {\n assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0)\n\n this.llhttp = exports\n this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE)\n this.client = client\n this.socket = socket\n this.timeout = null\n this.timeoutValue = null\n this.timeoutType = null\n this.statusCode = null\n this.statusText = ''\n this.upgrade = false\n this.headers = []\n this.headersSize = 0\n this.headersMaxSize = client[kMaxHeadersSize]\n this.shouldKeepAlive = false\n this.paused = false\n this.resume = this.resume.bind(this)\n\n this.bytesRead = 0\n\n this.keepAlive = ''\n this.contentLength = ''\n this.connection = ''\n this.maxResponseSize = client[kMaxResponseSize]\n }\n\n setTimeout (value, type) {\n this.timeoutType = type\n if (value !== this.timeoutValue) {\n timers.clearTimeout(this.timeout)\n if (value) {\n this.timeout = timers.setTimeout(onParserTimeout, value, this)\n // istanbul ignore else: only for jest\n if (this.timeout.unref) {\n this.timeout.unref()\n }\n } else {\n this.timeout = null\n }\n this.timeoutValue = value\n } else if (this.timeout) {\n // istanbul ignore else: only for jest\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n }\n\n resume () {\n if (this.socket.destroyed || !this.paused) {\n return\n }\n\n assert(this.ptr != null)\n assert(currentParser == null)\n\n this.llhttp.llhttp_resume(this.ptr)\n\n assert(this.timeoutType === TIMEOUT_BODY)\n if (this.timeout) {\n // istanbul ignore else: only for jest\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n this.paused = false\n this.execute(this.socket.read() || EMPTY_BUF) // Flush parser.\n this.readMore()\n }\n\n readMore () {\n while (!this.paused && this.ptr) {\n const chunk = this.socket.read()\n if (chunk === null) {\n break\n }\n this.execute(chunk)\n }\n }\n\n execute (data) {\n assert(this.ptr != null)\n assert(currentParser == null)\n assert(!this.paused)\n\n const { socket, llhttp } = this\n\n if (data.length > currentBufferSize) {\n if (currentBufferPtr) {\n llhttp.free(currentBufferPtr)\n }\n currentBufferSize = Math.ceil(data.length / 4096) * 4096\n currentBufferPtr = llhttp.malloc(currentBufferSize)\n }\n\n new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data)\n\n // Call `execute` on the wasm parser.\n // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data,\n // and finally the length of bytes to parse.\n // The return value is an error code or `constants.ERROR.OK`.\n try {\n let ret\n\n try {\n currentBufferRef = data\n currentParser = this\n ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length)\n /* eslint-disable-next-line no-useless-catch */\n } catch (err) {\n /* istanbul ignore next: difficult to make a test case for */\n throw err\n } finally {\n currentParser = null\n currentBufferRef = null\n }\n\n const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr\n\n if (ret === constants.ERROR.PAUSED_UPGRADE) {\n this.onUpgrade(data.slice(offset))\n } else if (ret === constants.ERROR.PAUSED) {\n this.paused = true\n socket.unshift(data.slice(offset))\n } else if (ret !== constants.ERROR.OK) {\n const ptr = llhttp.llhttp_get_error_reason(this.ptr)\n let message = ''\n /* istanbul ignore else: difficult to make a test case for */\n if (ptr) {\n const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0)\n message =\n 'Response does not match the HTTP/1.1 protocol (' +\n Buffer.from(llhttp.memory.buffer, ptr, len).toString() +\n ')'\n }\n throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset))\n }\n } catch (err) {\n util.destroy(socket, err)\n }\n }\n\n destroy () {\n assert(this.ptr != null)\n assert(currentParser == null)\n\n this.llhttp.llhttp_free(this.ptr)\n this.ptr = null\n\n timers.clearTimeout(this.timeout)\n this.timeout = null\n this.timeoutValue = null\n this.timeoutType = null\n\n this.paused = false\n }\n\n onStatus (buf) {\n this.statusText = buf.toString()\n }\n\n onMessageBegin () {\n const { socket, client } = this\n\n /* istanbul ignore next: difficult to make a test case for */\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n if (!request) {\n return -1\n }\n }\n\n onHeaderField (buf) {\n const len = this.headers.length\n\n if ((len & 1) === 0) {\n this.headers.push(buf)\n } else {\n this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])\n }\n\n this.trackHeader(buf.length)\n }\n\n onHeaderValue (buf) {\n let len = this.headers.length\n\n if ((len & 1) === 1) {\n this.headers.push(buf)\n len += 1\n } else {\n this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf])\n }\n\n const key = this.headers[len - 2]\n if (key.length === 10 && key.toString().toLowerCase() === 'keep-alive') {\n this.keepAlive += buf.toString()\n } else if (key.length === 10 && key.toString().toLowerCase() === 'connection') {\n this.connection += buf.toString()\n } else if (key.length === 14 && key.toString().toLowerCase() === 'content-length') {\n this.contentLength += buf.toString()\n }\n\n this.trackHeader(buf.length)\n }\n\n trackHeader (len) {\n this.headersSize += len\n if (this.headersSize >= this.headersMaxSize) {\n util.destroy(this.socket, new HeadersOverflowError())\n }\n }\n\n onUpgrade (head) {\n const { upgrade, client, socket, headers, statusCode } = this\n\n assert(upgrade)\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n\n assert(!socket.destroyed)\n assert(socket === client[kSocket])\n assert(!this.paused)\n assert(request.upgrade || request.method === 'CONNECT')\n\n this.statusCode = null\n this.statusText = ''\n this.shouldKeepAlive = null\n\n assert(this.headers.length % 2 === 0)\n this.headers = []\n this.headersSize = 0\n\n socket.unshift(head)\n\n socket[kParser].destroy()\n socket[kParser] = null\n\n socket[kClient] = null\n socket[kError] = null\n socket\n .removeListener('error', onSocketError)\n .removeListener('readable', onSocketReadable)\n .removeListener('end', onSocketEnd)\n .removeListener('close', onSocketClose)\n\n client[kSocket] = null\n client[kQueue][client[kRunningIdx]++] = null\n client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade'))\n\n try {\n request.onUpgrade(statusCode, headers, socket)\n } catch (err) {\n util.destroy(socket, err)\n }\n\n resume(client)\n }\n\n onHeadersComplete (statusCode, upgrade, shouldKeepAlive) {\n const { client, socket, headers, statusText } = this\n\n /* istanbul ignore next: difficult to make a test case for */\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n\n /* istanbul ignore next: difficult to make a test case for */\n if (!request) {\n return -1\n }\n\n assert(!this.upgrade)\n assert(this.statusCode < 200)\n\n if (statusCode === 100) {\n util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket)))\n return -1\n }\n\n /* this can only happen if server is misbehaving */\n if (upgrade && !request.upgrade) {\n util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket)))\n return -1\n }\n\n assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS)\n\n this.statusCode = statusCode\n this.shouldKeepAlive = (\n shouldKeepAlive ||\n // Override llhttp value which does not allow keepAlive for HEAD.\n (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive')\n )\n\n if (this.statusCode >= 200) {\n const bodyTimeout = request.bodyTimeout != null\n ? request.bodyTimeout\n : client[kBodyTimeout]\n this.setTimeout(bodyTimeout, TIMEOUT_BODY)\n } else if (this.timeout) {\n // istanbul ignore else: only for jest\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n if (request.method === 'CONNECT') {\n assert(client[kRunning] === 1)\n this.upgrade = true\n return 2\n }\n\n if (upgrade) {\n assert(client[kRunning] === 1)\n this.upgrade = true\n return 2\n }\n\n assert(this.headers.length % 2 === 0)\n this.headers = []\n this.headersSize = 0\n\n if (this.shouldKeepAlive && client[kPipelining]) {\n const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null\n\n if (keepAliveTimeout != null) {\n const timeout = Math.min(\n keepAliveTimeout - client[kKeepAliveTimeoutThreshold],\n client[kKeepAliveMaxTimeout]\n )\n if (timeout <= 0) {\n socket[kReset] = true\n } else {\n client[kKeepAliveTimeoutValue] = timeout\n }\n } else {\n client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]\n }\n } else {\n // Stop more requests from being dispatched.\n socket[kReset] = true\n }\n\n let pause\n try {\n pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false\n } catch (err) {\n util.destroy(socket, err)\n return -1\n }\n\n if (request.method === 'HEAD') {\n return 1\n }\n\n if (statusCode < 200) {\n return 1\n }\n\n if (socket[kBlocking]) {\n socket[kBlocking] = false\n resume(client)\n }\n\n return pause ? constants.ERROR.PAUSED : 0\n }\n\n onBody (buf) {\n const { client, socket, statusCode, maxResponseSize } = this\n\n if (socket.destroyed) {\n return -1\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n\n assert.strictEqual(this.timeoutType, TIMEOUT_BODY)\n if (this.timeout) {\n // istanbul ignore else: only for jest\n if (this.timeout.refresh) {\n this.timeout.refresh()\n }\n }\n\n assert(statusCode >= 200)\n\n if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) {\n util.destroy(socket, new ResponseExceededMaxSizeError())\n return -1\n }\n\n this.bytesRead += buf.length\n\n try {\n if (request.onData(buf) === false) {\n return constants.ERROR.PAUSED\n }\n } catch (err) {\n util.destroy(socket, err)\n return -1\n }\n }\n\n onMessageComplete () {\n const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this\n\n if (socket.destroyed && (!statusCode || shouldKeepAlive)) {\n return -1\n }\n\n if (upgrade) {\n return\n }\n\n const request = client[kQueue][client[kRunningIdx]]\n assert(request)\n\n assert(statusCode >= 100)\n\n this.statusCode = null\n this.statusText = ''\n this.bytesRead = 0\n this.contentLength = ''\n this.keepAlive = ''\n this.connection = ''\n\n assert(this.headers.length % 2 === 0)\n this.headers = []\n this.headersSize = 0\n\n if (statusCode < 200) {\n return\n }\n\n /* istanbul ignore next: should be handled by llhttp? */\n if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) {\n util.destroy(socket, new ResponseContentLengthMismatchError())\n return -1\n }\n\n try {\n request.onComplete(headers)\n } catch (err) {\n errorRequest(client, request, err)\n }\n\n client[kQueue][client[kRunningIdx]++] = null\n\n if (socket[kWriting]) {\n assert.strictEqual(client[kRunning], 0)\n // Response completed before request.\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (!shouldKeepAlive) {\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (socket[kReset] && client[kRunning] === 0) {\n // Destroy socket once all requests have completed.\n // The request at the tail of the pipeline is the one\n // that requested reset and no further requests should\n // have been queued since then.\n util.destroy(socket, new InformationalError('reset'))\n return constants.ERROR.PAUSED\n } else if (client[kPipelining] === 1) {\n // We must wait a full event loop cycle to reuse this socket to make sure\n // that non-spec compliant servers are not closing the connection even if they\n // said they won't.\n setImmediate(resume, client)\n } else {\n resume(client)\n }\n }\n}\n\nfunction onParserTimeout (parser) {\n const { socket, timeoutType, client } = parser\n\n /* istanbul ignore else */\n if (timeoutType === TIMEOUT_HEADERS) {\n if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) {\n assert(!parser.paused, 'cannot be paused while waiting for headers')\n util.destroy(socket, new HeadersTimeoutError())\n }\n } else if (timeoutType === TIMEOUT_BODY) {\n if (!parser.paused) {\n util.destroy(socket, new BodyTimeoutError())\n }\n } else if (timeoutType === TIMEOUT_IDLE) {\n assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue])\n util.destroy(socket, new InformationalError('socket idle timeout'))\n }\n}\n\nfunction onSocketReadable () {\n const { [kParser]: parser } = this\n if (parser) {\n parser.readMore()\n }\n}\n\nfunction onSocketError (err) {\n const { [kClient]: client, [kParser]: parser } = this\n\n assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID')\n\n if (client[kHTTPConnVersion] !== 'h2') {\n // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded\n // to the user.\n if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so for as a valid response.\n parser.onMessageComplete()\n return\n }\n }\n\n this[kError] = err\n\n onError(this[kClient], err)\n}\n\nfunction onError (client, err) {\n if (\n client[kRunning] === 0 &&\n err.code !== 'UND_ERR_INFO' &&\n err.code !== 'UND_ERR_SOCKET'\n ) {\n // Error is not caused by running request and not a recoverable\n // socket error.\n\n assert(client[kPendingIdx] === client[kRunningIdx])\n\n const requests = client[kQueue].splice(client[kRunningIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n errorRequest(client, request, err)\n }\n assert(client[kSize] === 0)\n }\n}\n\nfunction onSocketEnd () {\n const { [kParser]: parser, [kClient]: client } = this\n\n if (client[kHTTPConnVersion] !== 'h2') {\n if (parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so far as a valid response.\n parser.onMessageComplete()\n return\n }\n }\n\n util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this)))\n}\n\nfunction onSocketClose () {\n const { [kClient]: client, [kParser]: parser } = this\n\n if (client[kHTTPConnVersion] === 'h1' && parser) {\n if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) {\n // We treat all incoming data so far as a valid response.\n parser.onMessageComplete()\n }\n\n this[kParser].destroy()\n this[kParser] = null\n }\n\n const err = this[kError] || new SocketError('closed', util.getSocketInfo(this))\n\n client[kSocket] = null\n\n if (client.destroyed) {\n assert(client[kPending] === 0)\n\n // Fail entire queue.\n const requests = client[kQueue].splice(client[kRunningIdx])\n for (let i = 0; i < requests.length; i++) {\n const request = requests[i]\n errorRequest(client, request, err)\n }\n } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') {\n // Fail head of pipeline.\n const request = client[kQueue][client[kRunningIdx]]\n client[kQueue][client[kRunningIdx]++] = null\n\n errorRequest(client, request, err)\n }\n\n client[kPendingIdx] = client[kRunningIdx]\n\n assert(client[kRunning] === 0)\n\n client.emit('disconnect', client[kUrl], [client], err)\n\n resume(client)\n}\n\nasync function connect (client) {\n assert(!client[kConnecting])\n assert(!client[kSocket])\n\n let { host, hostname, protocol, port } = client[kUrl]\n\n // Resolve ipv6\n if (hostname[0] === '[') {\n const idx = hostname.indexOf(']')\n\n assert(idx !== -1)\n const ip = hostname.substr(1, idx - 1)\n\n assert(net.isIP(ip))\n hostname = ip\n }\n\n client[kConnecting] = true\n\n if (channels.beforeConnect.hasSubscribers) {\n channels.beforeConnect.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector]\n })\n }\n\n try {\n const socket = await new Promise((resolve, reject) => {\n client[kConnector]({\n host,\n hostname,\n protocol,\n port,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n }, (err, socket) => {\n if (err) {\n reject(err)\n } else {\n resolve(socket)\n }\n })\n })\n\n if (client.destroyed) {\n util.destroy(socket.on('error', () => {}), new ClientDestroyedError())\n return\n }\n\n client[kConnecting] = false\n\n assert(socket)\n\n const isH2 = socket.alpnProtocol === 'h2'\n if (isH2) {\n if (!h2ExperimentalWarned) {\n h2ExperimentalWarned = true\n process.emitWarning('H2 support is experimental, expect them to change at any time.', {\n code: 'UNDICI-H2'\n })\n }\n\n const session = http2.connect(client[kUrl], {\n createConnection: () => socket,\n peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams\n })\n\n client[kHTTPConnVersion] = 'h2'\n session[kClient] = client\n session[kSocket] = socket\n session.on('error', onHttp2SessionError)\n session.on('frameError', onHttp2FrameError)\n session.on('end', onHttp2SessionEnd)\n session.on('goaway', onHTTP2GoAway)\n session.on('close', onSocketClose)\n session.unref()\n\n client[kHTTP2Session] = session\n socket[kHTTP2Session] = session\n } else {\n if (!llhttpInstance) {\n llhttpInstance = await llhttpPromise\n llhttpPromise = null\n }\n\n socket[kNoRef] = false\n socket[kWriting] = false\n socket[kReset] = false\n socket[kBlocking] = false\n socket[kParser] = new Parser(client, socket, llhttpInstance)\n }\n\n socket[kCounter] = 0\n socket[kMaxRequests] = client[kMaxRequests]\n socket[kClient] = client\n socket[kError] = null\n\n socket\n .on('error', onSocketError)\n .on('readable', onSocketReadable)\n .on('end', onSocketEnd)\n .on('close', onSocketClose)\n\n client[kSocket] = socket\n\n if (channels.connected.hasSubscribers) {\n channels.connected.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector],\n socket\n })\n }\n client.emit('connect', client[kUrl], [client])\n } catch (err) {\n if (client.destroyed) {\n return\n }\n\n client[kConnecting] = false\n\n if (channels.connectError.hasSubscribers) {\n channels.connectError.publish({\n connectParams: {\n host,\n hostname,\n protocol,\n port,\n servername: client[kServerName],\n localAddress: client[kLocalAddress]\n },\n connector: client[kConnector],\n error: err\n })\n }\n\n if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') {\n assert(client[kRunning] === 0)\n while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {\n const request = client[kQueue][client[kPendingIdx]++]\n errorRequest(client, request, err)\n }\n } else {\n onError(client, err)\n }\n\n client.emit('connectionError', client[kUrl], [client], err)\n }\n\n resume(client)\n}\n\nfunction emitDrain (client) {\n client[kNeedDrain] = 0\n client.emit('drain', client[kUrl], [client])\n}\n\nfunction resume (client, sync) {\n if (client[kResuming] === 2) {\n return\n }\n\n client[kResuming] = 2\n\n _resume(client, sync)\n client[kResuming] = 0\n\n if (client[kRunningIdx] > 256) {\n client[kQueue].splice(0, client[kRunningIdx])\n client[kPendingIdx] -= client[kRunningIdx]\n client[kRunningIdx] = 0\n }\n}\n\nfunction _resume (client, sync) {\n while (true) {\n if (client.destroyed) {\n assert(client[kPending] === 0)\n return\n }\n\n if (client[kClosedResolve] && !client[kSize]) {\n client[kClosedResolve]()\n client[kClosedResolve] = null\n return\n }\n\n const socket = client[kSocket]\n\n if (socket && !socket.destroyed && socket.alpnProtocol !== 'h2') {\n if (client[kSize] === 0) {\n if (!socket[kNoRef] && socket.unref) {\n socket.unref()\n socket[kNoRef] = true\n }\n } else if (socket[kNoRef] && socket.ref) {\n socket.ref()\n socket[kNoRef] = false\n }\n\n if (client[kSize] === 0) {\n if (socket[kParser].timeoutType !== TIMEOUT_IDLE) {\n socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE)\n }\n } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) {\n if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) {\n const request = client[kQueue][client[kRunningIdx]]\n const headersTimeout = request.headersTimeout != null\n ? request.headersTimeout\n : client[kHeadersTimeout]\n socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS)\n }\n }\n }\n\n if (client[kBusy]) {\n client[kNeedDrain] = 2\n } else if (client[kNeedDrain] === 2) {\n if (sync) {\n client[kNeedDrain] = 1\n process.nextTick(emitDrain, client)\n } else {\n emitDrain(client)\n }\n continue\n }\n\n if (client[kPending] === 0) {\n return\n }\n\n if (client[kRunning] >= (client[kPipelining] || 1)) {\n return\n }\n\n const request = client[kQueue][client[kPendingIdx]]\n\n if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) {\n if (client[kRunning] > 0) {\n return\n }\n\n client[kServerName] = request.servername\n\n if (socket && socket.servername !== request.servername) {\n util.destroy(socket, new InformationalError('servername changed'))\n return\n }\n }\n\n if (client[kConnecting]) {\n return\n }\n\n if (!socket && !client[kHTTP2Session]) {\n connect(client)\n return\n }\n\n if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) {\n return\n }\n\n if (client[kRunning] > 0 && !request.idempotent) {\n // Non-idempotent request cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n return\n }\n\n if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) {\n // Don't dispatch an upgrade until all preceding requests have completed.\n // A misbehaving server might upgrade the connection before all pipelined\n // request has completed.\n return\n }\n\n if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 &&\n (util.isStream(request.body) || util.isAsyncIterable(request.body))) {\n // Request with stream or iterator body can error while other requests\n // are inflight and indirectly error those as well.\n // Ensure this doesn't happen by waiting for inflight\n // to complete before dispatching.\n\n // Request with stream or iterator body cannot be retried.\n // Ensure that no other requests are inflight and\n // could cause failure.\n return\n }\n\n if (!request.aborted && write(client, request)) {\n client[kPendingIdx]++\n } else {\n client[kQueue].splice(client[kPendingIdx], 1)\n }\n }\n}\n\n// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2\nfunction shouldSendContentLength (method) {\n return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT'\n}\n\nfunction write (client, request) {\n if (client[kHTTPConnVersion] === 'h2') {\n writeH2(client, client[kHTTP2Session], request)\n return\n }\n\n const { body, method, path, host, upgrade, headers, blocking, reset } = request\n\n // https://tools.ietf.org/html/rfc7231#section-4.3.1\n // https://tools.ietf.org/html/rfc7231#section-4.3.2\n // https://tools.ietf.org/html/rfc7231#section-4.3.5\n\n // Sending a payload body on a request that does not\n // expect it can cause undefined behavior on some\n // servers and corrupt connection state. Do not\n // re-use the connection for further requests.\n\n const expectsPayload = (\n method === 'PUT' ||\n method === 'POST' ||\n method === 'PATCH'\n )\n\n if (body && typeof body.read === 'function') {\n // Try to read EOF in order to get length.\n body.read(0)\n }\n\n const bodyLength = util.bodyLength(body)\n\n let contentLength = bodyLength\n\n if (contentLength === null) {\n contentLength = request.contentLength\n }\n\n if (contentLength === 0 && !expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD NOT send a Content-Length header field when\n // the request message does not contain a payload body and the method\n // semantics do not anticipate such a body.\n\n contentLength = null\n }\n\n // https://github.com/nodejs/undici/issues/2046\n // A user agent may send a Content-Length header with 0 value, this should be allowed.\n if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) {\n if (client[kStrictContentLength]) {\n errorRequest(client, request, new RequestContentLengthMismatchError())\n return false\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n const socket = client[kSocket]\n\n try {\n request.onConnect((err) => {\n if (request.aborted || request.completed) {\n return\n }\n\n errorRequest(client, request, err || new RequestAbortedError())\n\n util.destroy(socket, new InformationalError('aborted'))\n })\n } catch (err) {\n errorRequest(client, request, err)\n }\n\n if (request.aborted) {\n return false\n }\n\n if (method === 'HEAD') {\n // https://github.com/mcollina/undici/issues/258\n // Close after a HEAD request to interop with misbehaving servers\n // that may send a body in the response.\n\n socket[kReset] = true\n }\n\n if (upgrade || method === 'CONNECT') {\n // On CONNECT or upgrade, block pipeline from dispatching further\n // requests on this connection.\n\n socket[kReset] = true\n }\n\n if (reset != null) {\n socket[kReset] = reset\n }\n\n if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) {\n socket[kReset] = true\n }\n\n if (blocking) {\n socket[kBlocking] = true\n }\n\n let header = `${method} ${path} HTTP/1.1\\r\\n`\n\n if (typeof host === 'string') {\n header += `host: ${host}\\r\\n`\n } else {\n header += client[kHostHeader]\n }\n\n if (upgrade) {\n header += `connection: upgrade\\r\\nupgrade: ${upgrade}\\r\\n`\n } else if (client[kPipelining] && !socket[kReset]) {\n header += 'connection: keep-alive\\r\\n'\n } else {\n header += 'connection: close\\r\\n'\n }\n\n if (headers) {\n header += headers\n }\n\n if (channels.sendHeaders.hasSubscribers) {\n channels.sendHeaders.publish({ request, headers: header, socket })\n }\n\n /* istanbul ignore else: assertion */\n if (!body || bodyLength === 0) {\n if (contentLength === 0) {\n socket.write(`${header}content-length: 0\\r\\n\\r\\n`, 'latin1')\n } else {\n assert(contentLength === null, 'no body must not have content length')\n socket.write(`${header}\\r\\n`, 'latin1')\n }\n request.onRequestSent()\n } else if (util.isBuffer(body)) {\n assert(contentLength === body.byteLength, 'buffer body must have content length')\n\n socket.cork()\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n socket.write(body)\n socket.uncork()\n request.onBodySent(body)\n request.onRequestSent()\n if (!expectsPayload) {\n socket[kReset] = true\n }\n } else if (util.isBlobLike(body)) {\n if (typeof body.stream === 'function') {\n writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload })\n } else {\n writeBlob({ body, client, request, socket, contentLength, header, expectsPayload })\n }\n } else if (util.isStream(body)) {\n writeStream({ body, client, request, socket, contentLength, header, expectsPayload })\n } else if (util.isIterable(body)) {\n writeIterable({ body, client, request, socket, contentLength, header, expectsPayload })\n } else {\n assert(false)\n }\n\n return true\n}\n\nfunction writeH2 (client, session, request) {\n const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request\n\n let headers\n if (typeof reqHeaders === 'string') headers = Request[kHTTP2CopyHeaders](reqHeaders.trim())\n else headers = reqHeaders\n\n if (upgrade) {\n errorRequest(client, request, new Error('Upgrade not supported for H2'))\n return false\n }\n\n try {\n // TODO(HTTP/2): Should we call onConnect immediately or on stream ready event?\n request.onConnect((err) => {\n if (request.aborted || request.completed) {\n return\n }\n\n errorRequest(client, request, err || new RequestAbortedError())\n })\n } catch (err) {\n errorRequest(client, request, err)\n }\n\n if (request.aborted) {\n return false\n }\n\n let stream\n const h2State = client[kHTTP2SessionState]\n\n headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost]\n headers[HTTP2_HEADER_METHOD] = method\n\n if (method === 'CONNECT') {\n session.ref()\n // we are already connected, streams are pending, first request\n // will create a new stream. We trigger a request to create the stream and wait until\n // `ready` event is triggered\n // We disabled endStream to allow the user to write to the stream\n stream = session.request(headers, { endStream: false, signal })\n\n if (stream.id && !stream.pending) {\n request.onUpgrade(null, null, stream)\n ++h2State.openStreams\n } else {\n stream.once('ready', () => {\n request.onUpgrade(null, null, stream)\n ++h2State.openStreams\n })\n }\n\n stream.once('close', () => {\n h2State.openStreams -= 1\n // TODO(HTTP/2): unref only if current streams count is 0\n if (h2State.openStreams === 0) session.unref()\n })\n\n return true\n }\n\n // https://tools.ietf.org/html/rfc7540#section-8.3\n // :path and :scheme headers must be omited when sending CONNECT\n\n headers[HTTP2_HEADER_PATH] = path\n headers[HTTP2_HEADER_SCHEME] = 'https'\n\n // https://tools.ietf.org/html/rfc7231#section-4.3.1\n // https://tools.ietf.org/html/rfc7231#section-4.3.2\n // https://tools.ietf.org/html/rfc7231#section-4.3.5\n\n // Sending a payload body on a request that does not\n // expect it can cause undefined behavior on some\n // servers and corrupt connection state. Do not\n // re-use the connection for further requests.\n\n const expectsPayload = (\n method === 'PUT' ||\n method === 'POST' ||\n method === 'PATCH'\n )\n\n if (body && typeof body.read === 'function') {\n // Try to read EOF in order to get length.\n body.read(0)\n }\n\n let contentLength = util.bodyLength(body)\n\n if (contentLength == null) {\n contentLength = request.contentLength\n }\n\n if (contentLength === 0 || !expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD NOT send a Content-Length header field when\n // the request message does not contain a payload body and the method\n // semantics do not anticipate such a body.\n\n contentLength = null\n }\n\n // https://github.com/nodejs/undici/issues/2046\n // A user agent may send a Content-Length header with 0 value, this should be allowed.\n if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) {\n if (client[kStrictContentLength]) {\n errorRequest(client, request, new RequestContentLengthMismatchError())\n return false\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n if (contentLength != null) {\n assert(body, 'no body must not have content length')\n headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`\n }\n\n session.ref()\n\n const shouldEndStream = method === 'GET' || method === 'HEAD'\n if (expectContinue) {\n headers[HTTP2_HEADER_EXPECT] = '100-continue'\n /**\n * @type {import('node:http2').ClientHttp2Stream}\n */\n stream = session.request(headers, { endStream: shouldEndStream, signal })\n\n stream.once('continue', writeBodyH2)\n } else {\n /** @type {import('node:http2').ClientHttp2Stream} */\n stream = session.request(headers, {\n endStream: shouldEndStream,\n signal\n })\n writeBodyH2()\n }\n\n // Increment counter as we have new several streams open\n ++h2State.openStreams\n\n stream.once('response', headers => {\n if (request.onHeaders(Number(headers[HTTP2_HEADER_STATUS]), headers, stream.resume.bind(stream), '') === false) {\n stream.pause()\n }\n })\n\n stream.once('end', () => {\n request.onComplete([])\n })\n\n stream.on('data', (chunk) => {\n if (request.onData(chunk) === false) stream.pause()\n })\n\n stream.once('close', () => {\n h2State.openStreams -= 1\n // TODO(HTTP/2): unref only if current streams count is 0\n if (h2State.openStreams === 0) session.unref()\n })\n\n stream.once('error', function (err) {\n if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) {\n h2State.streams -= 1\n util.destroy(stream, err)\n }\n })\n\n stream.once('frameError', (type, code) => {\n const err = new InformationalError(`HTTP/2: \"frameError\" received - type ${type}, code ${code}`)\n errorRequest(client, request, err)\n\n if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) {\n h2State.streams -= 1\n util.destroy(stream, err)\n }\n })\n\n // stream.on('aborted', () => {\n // // TODO(HTTP/2): Support aborted\n // })\n\n // stream.on('timeout', () => {\n // // TODO(HTTP/2): Support timeout\n // })\n\n // stream.on('push', headers => {\n // // TODO(HTTP/2): Suppor push\n // })\n\n // stream.on('trailers', headers => {\n // // TODO(HTTP/2): Support trailers\n // })\n\n return true\n\n function writeBodyH2 () {\n /* istanbul ignore else: assertion */\n if (!body) {\n request.onRequestSent()\n } else if (util.isBuffer(body)) {\n assert(contentLength === body.byteLength, 'buffer body must have content length')\n stream.cork()\n stream.write(body)\n stream.uncork()\n stream.end()\n request.onBodySent(body)\n request.onRequestSent()\n } else if (util.isBlobLike(body)) {\n if (typeof body.stream === 'function') {\n writeIterable({\n client,\n request,\n contentLength,\n h2stream: stream,\n expectsPayload,\n body: body.stream(),\n socket: client[kSocket],\n header: ''\n })\n } else {\n writeBlob({\n body,\n client,\n request,\n contentLength,\n expectsPayload,\n h2stream: stream,\n header: '',\n socket: client[kSocket]\n })\n }\n } else if (util.isStream(body)) {\n writeStream({\n body,\n client,\n request,\n contentLength,\n expectsPayload,\n socket: client[kSocket],\n h2stream: stream,\n header: ''\n })\n } else if (util.isIterable(body)) {\n writeIterable({\n body,\n client,\n request,\n contentLength,\n expectsPayload,\n header: '',\n h2stream: stream,\n socket: client[kSocket]\n })\n } else {\n assert(false)\n }\n }\n}\n\nfunction writeStream ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined')\n\n if (client[kHTTPConnVersion] === 'h2') {\n // For HTTP/2, is enough to pipe the stream\n const pipe = pipeline(\n body,\n h2stream,\n (err) => {\n if (err) {\n util.destroy(body, err)\n util.destroy(h2stream, err)\n } else {\n request.onRequestSent()\n }\n }\n )\n\n pipe.on('data', onPipeData)\n pipe.once('end', () => {\n pipe.removeListener('data', onPipeData)\n util.destroy(pipe)\n })\n\n function onPipeData (chunk) {\n request.onBodySent(chunk)\n }\n\n return\n }\n\n let finished = false\n\n const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header })\n\n const onData = function (chunk) {\n if (finished) {\n return\n }\n\n try {\n if (!writer.write(chunk) && this.pause) {\n this.pause()\n }\n } catch (err) {\n util.destroy(this, err)\n }\n }\n const onDrain = function () {\n if (finished) {\n return\n }\n\n if (body.resume) {\n body.resume()\n }\n }\n const onAbort = function () {\n onFinished(new RequestAbortedError())\n }\n const onFinished = function (err) {\n if (finished) {\n return\n }\n\n finished = true\n\n assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1))\n\n socket\n .off('drain', onDrain)\n .off('error', onFinished)\n\n body\n .removeListener('data', onData)\n .removeListener('end', onFinished)\n .removeListener('error', onFinished)\n .removeListener('close', onAbort)\n\n if (!err) {\n try {\n writer.end()\n } catch (er) {\n err = er\n }\n }\n\n writer.destroy(err)\n\n if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) {\n util.destroy(body, err)\n } else {\n util.destroy(body)\n }\n }\n\n body\n .on('data', onData)\n .on('end', onFinished)\n .on('error', onFinished)\n .on('close', onAbort)\n\n if (body.resume) {\n body.resume()\n }\n\n socket\n .on('drain', onDrain)\n .on('error', onFinished)\n}\n\nasync function writeBlob ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {\n assert(contentLength === body.size, 'blob body must have content length')\n\n const isH2 = client[kHTTPConnVersion] === 'h2'\n try {\n if (contentLength != null && contentLength !== body.size) {\n throw new RequestContentLengthMismatchError()\n }\n\n const buffer = Buffer.from(await body.arrayBuffer())\n\n if (isH2) {\n h2stream.cork()\n h2stream.write(buffer)\n h2stream.uncork()\n } else {\n socket.cork()\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n socket.write(buffer)\n socket.uncork()\n }\n\n request.onBodySent(buffer)\n request.onRequestSent()\n\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n resume(client)\n } catch (err) {\n util.destroy(isH2 ? h2stream : socket, err)\n }\n}\n\nasync function writeIterable ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {\n assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined')\n\n let callback = null\n function onDrain () {\n if (callback) {\n const cb = callback\n callback = null\n cb()\n }\n }\n\n const waitForDrain = () => new Promise((resolve, reject) => {\n assert(callback === null)\n\n if (socket[kError]) {\n reject(socket[kError])\n } else {\n callback = resolve\n }\n })\n\n if (client[kHTTPConnVersion] === 'h2') {\n h2stream\n .on('close', onDrain)\n .on('drain', onDrain)\n\n try {\n // It's up to the user to somehow abort the async iterable.\n for await (const chunk of body) {\n if (socket[kError]) {\n throw socket[kError]\n }\n\n const res = h2stream.write(chunk)\n request.onBodySent(chunk)\n if (!res) {\n await waitForDrain()\n }\n }\n } catch (err) {\n h2stream.destroy(err)\n } finally {\n request.onRequestSent()\n h2stream.end()\n h2stream\n .off('close', onDrain)\n .off('drain', onDrain)\n }\n\n return\n }\n\n socket\n .on('close', onDrain)\n .on('drain', onDrain)\n\n const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header })\n try {\n // It's up to the user to somehow abort the async iterable.\n for await (const chunk of body) {\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (!writer.write(chunk)) {\n await waitForDrain()\n }\n }\n\n writer.end()\n } catch (err) {\n writer.destroy(err)\n } finally {\n socket\n .off('close', onDrain)\n .off('drain', onDrain)\n }\n}\n\nclass AsyncWriter {\n constructor ({ socket, request, contentLength, client, expectsPayload, header }) {\n this.socket = socket\n this.request = request\n this.contentLength = contentLength\n this.client = client\n this.bytesWritten = 0\n this.expectsPayload = expectsPayload\n this.header = header\n\n socket[kWriting] = true\n }\n\n write (chunk) {\n const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this\n\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (socket.destroyed) {\n return false\n }\n\n const len = Buffer.byteLength(chunk)\n if (!len) {\n return true\n }\n\n // We should defer writing chunks.\n if (contentLength !== null && bytesWritten + len > contentLength) {\n if (client[kStrictContentLength]) {\n throw new RequestContentLengthMismatchError()\n }\n\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n\n socket.cork()\n\n if (bytesWritten === 0) {\n if (!expectsPayload) {\n socket[kReset] = true\n }\n\n if (contentLength === null) {\n socket.write(`${header}transfer-encoding: chunked\\r\\n`, 'latin1')\n } else {\n socket.write(`${header}content-length: ${contentLength}\\r\\n\\r\\n`, 'latin1')\n }\n }\n\n if (contentLength === null) {\n socket.write(`\\r\\n${len.toString(16)}\\r\\n`, 'latin1')\n }\n\n this.bytesWritten += len\n\n const ret = socket.write(chunk)\n\n socket.uncork()\n\n request.onBodySent(chunk)\n\n if (!ret) {\n if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {\n // istanbul ignore else: only for jest\n if (socket[kParser].timeout.refresh) {\n socket[kParser].timeout.refresh()\n }\n }\n }\n\n return ret\n }\n\n end () {\n const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this\n request.onRequestSent()\n\n socket[kWriting] = false\n\n if (socket[kError]) {\n throw socket[kError]\n }\n\n if (socket.destroyed) {\n return\n }\n\n if (bytesWritten === 0) {\n if (expectsPayload) {\n // https://tools.ietf.org/html/rfc7230#section-3.3.2\n // A user agent SHOULD send a Content-Length in a request message when\n // no Transfer-Encoding is sent and the request method defines a meaning\n // for an enclosed payload body.\n\n socket.write(`${header}content-length: 0\\r\\n\\r\\n`, 'latin1')\n } else {\n socket.write(`${header}\\r\\n`, 'latin1')\n }\n } else if (contentLength === null) {\n socket.write('\\r\\n0\\r\\n\\r\\n', 'latin1')\n }\n\n if (contentLength !== null && bytesWritten !== contentLength) {\n if (client[kStrictContentLength]) {\n throw new RequestContentLengthMismatchError()\n } else {\n process.emitWarning(new RequestContentLengthMismatchError())\n }\n }\n\n if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {\n // istanbul ignore else: only for jest\n if (socket[kParser].timeout.refresh) {\n socket[kParser].timeout.refresh()\n }\n }\n\n resume(client)\n }\n\n destroy (err) {\n const { socket, client } = this\n\n socket[kWriting] = false\n\n if (err) {\n assert(client[kRunning] <= 1, 'pipeline should only contain this request')\n util.destroy(socket, err)\n }\n }\n}\n\nfunction errorRequest (client, request, err) {\n try {\n request.onError(err)\n assert(request.aborted)\n } catch (err) {\n client.emit('error', err)\n }\n}\n\nmodule.exports = Client\n","'use strict'\n\n/* istanbul ignore file: only for Node 12 */\n\nconst { kConnected, kSize } = require('../core/symbols')\n\nclass CompatWeakRef {\n constructor (value) {\n this.value = value\n }\n\n deref () {\n return this.value[kConnected] === 0 && this.value[kSize] === 0\n ? undefined\n : this.value\n }\n}\n\nclass CompatFinalizer {\n constructor (finalizer) {\n this.finalizer = finalizer\n }\n\n register (dispatcher, key) {\n if (dispatcher.on) {\n dispatcher.on('disconnect', () => {\n if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) {\n this.finalizer(key)\n }\n })\n }\n }\n}\n\nmodule.exports = function () {\n // FIXME: remove workaround when the Node bug is fixed\n // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308\n if (process.env.NODE_V8_COVERAGE) {\n return {\n WeakRef: CompatWeakRef,\n FinalizationRegistry: CompatFinalizer\n }\n }\n return {\n WeakRef: global.WeakRef || CompatWeakRef,\n FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer\n }\n}\n","'use strict'\n\n// https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size\nconst maxAttributeValueSize = 1024\n\n// https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size\nconst maxNameValuePairSize = 4096\n\nmodule.exports = {\n maxAttributeValueSize,\n maxNameValuePairSize\n}\n","'use strict'\n\nconst { parseSetCookie } = require('./parse')\nconst { stringify, getHeadersList } = require('./util')\nconst { webidl } = require('../fetch/webidl')\nconst { Headers } = require('../fetch/headers')\n\n/**\n * @typedef {Object} Cookie\n * @property {string} name\n * @property {string} value\n * @property {Date|number|undefined} expires\n * @property {number|undefined} maxAge\n * @property {string|undefined} domain\n * @property {string|undefined} path\n * @property {boolean|undefined} secure\n * @property {boolean|undefined} httpOnly\n * @property {'Strict'|'Lax'|'None'} sameSite\n * @property {string[]} unparsed\n */\n\n/**\n * @param {Headers} headers\n * @returns {Record}\n */\nfunction getCookies (headers) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'getCookies' })\n\n webidl.brandCheck(headers, Headers, { strict: false })\n\n const cookie = headers.get('cookie')\n const out = {}\n\n if (!cookie) {\n return out\n }\n\n for (const piece of cookie.split(';')) {\n const [name, ...value] = piece.split('=')\n\n out[name.trim()] = value.join('=')\n }\n\n return out\n}\n\n/**\n * @param {Headers} headers\n * @param {string} name\n * @param {{ path?: string, domain?: string }|undefined} attributes\n * @returns {void}\n */\nfunction deleteCookie (headers, name, attributes) {\n webidl.argumentLengthCheck(arguments, 2, { header: 'deleteCookie' })\n\n webidl.brandCheck(headers, Headers, { strict: false })\n\n name = webidl.converters.DOMString(name)\n attributes = webidl.converters.DeleteCookieAttributes(attributes)\n\n // Matches behavior of\n // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278\n setCookie(headers, {\n name,\n value: '',\n expires: new Date(0),\n ...attributes\n })\n}\n\n/**\n * @param {Headers} headers\n * @returns {Cookie[]}\n */\nfunction getSetCookies (headers) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'getSetCookies' })\n\n webidl.brandCheck(headers, Headers, { strict: false })\n\n const cookies = getHeadersList(headers).cookies\n\n if (!cookies) {\n return []\n }\n\n // In older versions of undici, cookies is a list of name:value.\n return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair))\n}\n\n/**\n * @param {Headers} headers\n * @param {Cookie} cookie\n * @returns {void}\n */\nfunction setCookie (headers, cookie) {\n webidl.argumentLengthCheck(arguments, 2, { header: 'setCookie' })\n\n webidl.brandCheck(headers, Headers, { strict: false })\n\n cookie = webidl.converters.Cookie(cookie)\n\n const str = stringify(cookie)\n\n if (str) {\n headers.append('Set-Cookie', stringify(cookie))\n }\n}\n\nwebidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'path',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'domain',\n defaultValue: null\n }\n])\n\nwebidl.converters.Cookie = webidl.dictionaryConverter([\n {\n converter: webidl.converters.DOMString,\n key: 'name'\n },\n {\n converter: webidl.converters.DOMString,\n key: 'value'\n },\n {\n converter: webidl.nullableConverter((value) => {\n if (typeof value === 'number') {\n return webidl.converters['unsigned long long'](value)\n }\n\n return new Date(value)\n }),\n key: 'expires',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters['long long']),\n key: 'maxAge',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'domain',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.DOMString),\n key: 'path',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.boolean),\n key: 'secure',\n defaultValue: null\n },\n {\n converter: webidl.nullableConverter(webidl.converters.boolean),\n key: 'httpOnly',\n defaultValue: null\n },\n {\n converter: webidl.converters.USVString,\n key: 'sameSite',\n allowedValues: ['Strict', 'Lax', 'None']\n },\n {\n converter: webidl.sequenceConverter(webidl.converters.DOMString),\n key: 'unparsed',\n defaultValue: []\n }\n])\n\nmodule.exports = {\n getCookies,\n deleteCookie,\n getSetCookies,\n setCookie\n}\n","'use strict'\n\nconst { maxNameValuePairSize, maxAttributeValueSize } = require('./constants')\nconst { isCTLExcludingHtab } = require('./util')\nconst { collectASequenceOfCodePointsFast } = require('../fetch/dataURL')\nconst assert = require('assert')\n\n/**\n * @description Parses the field-value attributes of a set-cookie header string.\n * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4\n * @param {string} header\n * @returns if the header is invalid, null will be returned\n */\nfunction parseSetCookie (header) {\n // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F\n // character (CTL characters excluding HTAB): Abort these steps and\n // ignore the set-cookie-string entirely.\n if (isCTLExcludingHtab(header)) {\n return null\n }\n\n let nameValuePair = ''\n let unparsedAttributes = ''\n let name = ''\n let value = ''\n\n // 2. If the set-cookie-string contains a %x3B (\";\") character:\n if (header.includes(';')) {\n // 1. The name-value-pair string consists of the characters up to,\n // but not including, the first %x3B (\";\"), and the unparsed-\n // attributes consist of the remainder of the set-cookie-string\n // (including the %x3B (\";\") in question).\n const position = { position: 0 }\n\n nameValuePair = collectASequenceOfCodePointsFast(';', header, position)\n unparsedAttributes = header.slice(position.position)\n } else {\n // Otherwise:\n\n // 1. The name-value-pair string consists of all the characters\n // contained in the set-cookie-string, and the unparsed-\n // attributes is the empty string.\n nameValuePair = header\n }\n\n // 3. If the name-value-pair string lacks a %x3D (\"=\") character, then\n // the name string is empty, and the value string is the value of\n // name-value-pair.\n if (!nameValuePair.includes('=')) {\n value = nameValuePair\n } else {\n // Otherwise, the name string consists of the characters up to, but\n // not including, the first %x3D (\"=\") character, and the (possibly\n // empty) value string consists of the characters after the first\n // %x3D (\"=\") character.\n const position = { position: 0 }\n name = collectASequenceOfCodePointsFast(\n '=',\n nameValuePair,\n position\n )\n value = nameValuePair.slice(position.position + 1)\n }\n\n // 4. Remove any leading or trailing WSP characters from the name\n // string and the value string.\n name = name.trim()\n value = value.trim()\n\n // 5. If the sum of the lengths of the name string and the value string\n // is more than 4096 octets, abort these steps and ignore the set-\n // cookie-string entirely.\n if (name.length + value.length > maxNameValuePairSize) {\n return null\n }\n\n // 6. The cookie-name is the name string, and the cookie-value is the\n // value string.\n return {\n name, value, ...parseUnparsedAttributes(unparsedAttributes)\n }\n}\n\n/**\n * Parses the remaining attributes of a set-cookie header\n * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4\n * @param {string} unparsedAttributes\n * @param {[Object.]={}} cookieAttributeList\n */\nfunction parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) {\n // 1. If the unparsed-attributes string is empty, skip the rest of\n // these steps.\n if (unparsedAttributes.length === 0) {\n return cookieAttributeList\n }\n\n // 2. Discard the first character of the unparsed-attributes (which\n // will be a %x3B (\";\") character).\n assert(unparsedAttributes[0] === ';')\n unparsedAttributes = unparsedAttributes.slice(1)\n\n let cookieAv = ''\n\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n if (unparsedAttributes.includes(';')) {\n // 1. Consume the characters of the unparsed-attributes up to, but\n // not including, the first %x3B (\";\") character.\n cookieAv = collectASequenceOfCodePointsFast(\n ';',\n unparsedAttributes,\n { position: 0 }\n )\n unparsedAttributes = unparsedAttributes.slice(cookieAv.length)\n } else {\n // Otherwise:\n\n // 1. Consume the remainder of the unparsed-attributes.\n cookieAv = unparsedAttributes\n unparsedAttributes = ''\n }\n\n // Let the cookie-av string be the characters consumed in this step.\n\n let attributeName = ''\n let attributeValue = ''\n\n // 4. If the cookie-av string contains a %x3D (\"=\") character:\n if (cookieAv.includes('=')) {\n // 1. The (possibly empty) attribute-name string consists of the\n // characters up to, but not including, the first %x3D (\"=\")\n // character, and the (possibly empty) attribute-value string\n // consists of the characters after the first %x3D (\"=\")\n // character.\n const position = { position: 0 }\n\n attributeName = collectASequenceOfCodePointsFast(\n '=',\n cookieAv,\n position\n )\n attributeValue = cookieAv.slice(position.position + 1)\n } else {\n // Otherwise:\n\n // 1. The attribute-name string consists of the entire cookie-av\n // string, and the attribute-value string is empty.\n attributeName = cookieAv\n }\n\n // 5. Remove any leading or trailing WSP characters from the attribute-\n // name string and the attribute-value string.\n attributeName = attributeName.trim()\n attributeValue = attributeValue.trim()\n\n // 6. If the attribute-value is longer than 1024 octets, ignore the\n // cookie-av string and return to Step 1 of this algorithm.\n if (attributeValue.length > maxAttributeValueSize) {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 7. Process the attribute-name and attribute-value according to the\n // requirements in the following subsections. (Notice that\n // attributes with unrecognized attribute-names are ignored.)\n const attributeNameLowercase = attributeName.toLowerCase()\n\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1\n // If the attribute-name case-insensitively matches the string\n // \"Expires\", the user agent MUST process the cookie-av as follows.\n if (attributeNameLowercase === 'expires') {\n // 1. Let the expiry-time be the result of parsing the attribute-value\n // as cookie-date (see Section 5.1.1).\n const expiryTime = new Date(attributeValue)\n\n // 2. If the attribute-value failed to parse as a cookie date, ignore\n // the cookie-av.\n\n cookieAttributeList.expires = expiryTime\n } else if (attributeNameLowercase === 'max-age') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2\n // If the attribute-name case-insensitively matches the string \"Max-\n // Age\", the user agent MUST process the cookie-av as follows.\n\n // 1. If the first character of the attribute-value is not a DIGIT or a\n // \"-\" character, ignore the cookie-av.\n const charCode = attributeValue.charCodeAt(0)\n\n if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 2. If the remainder of attribute-value contains a non-DIGIT\n // character, ignore the cookie-av.\n if (!/^\\d+$/.test(attributeValue)) {\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n }\n\n // 3. Let delta-seconds be the attribute-value converted to an integer.\n const deltaSeconds = Number(attributeValue)\n\n // 4. Let cookie-age-limit be the maximum age of the cookie (which\n // SHOULD be 400 days or less, see Section 4.1.2.2).\n\n // 5. Set delta-seconds to the smaller of its present value and cookie-\n // age-limit.\n // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs)\n\n // 6. If delta-seconds is less than or equal to zero (0), let expiry-\n // time be the earliest representable date and time. Otherwise, let\n // the expiry-time be the current date and time plus delta-seconds\n // seconds.\n // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds\n\n // 7. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Max-Age and an attribute-value of expiry-time.\n cookieAttributeList.maxAge = deltaSeconds\n } else if (attributeNameLowercase === 'domain') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3\n // If the attribute-name case-insensitively matches the string \"Domain\",\n // the user agent MUST process the cookie-av as follows.\n\n // 1. Let cookie-domain be the attribute-value.\n let cookieDomain = attributeValue\n\n // 2. If cookie-domain starts with %x2E (\".\"), let cookie-domain be\n // cookie-domain without its leading %x2E (\".\").\n if (cookieDomain[0] === '.') {\n cookieDomain = cookieDomain.slice(1)\n }\n\n // 3. Convert the cookie-domain to lower case.\n cookieDomain = cookieDomain.toLowerCase()\n\n // 4. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Domain and an attribute-value of cookie-domain.\n cookieAttributeList.domain = cookieDomain\n } else if (attributeNameLowercase === 'path') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4\n // If the attribute-name case-insensitively matches the string \"Path\",\n // the user agent MUST process the cookie-av as follows.\n\n // 1. If the attribute-value is empty or if the first character of the\n // attribute-value is not %x2F (\"/\"):\n let cookiePath = ''\n if (attributeValue.length === 0 || attributeValue[0] !== '/') {\n // 1. Let cookie-path be the default-path.\n cookiePath = '/'\n } else {\n // Otherwise:\n\n // 1. Let cookie-path be the attribute-value.\n cookiePath = attributeValue\n }\n\n // 2. Append an attribute to the cookie-attribute-list with an\n // attribute-name of Path and an attribute-value of cookie-path.\n cookieAttributeList.path = cookiePath\n } else if (attributeNameLowercase === 'secure') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5\n // If the attribute-name case-insensitively matches the string \"Secure\",\n // the user agent MUST append an attribute to the cookie-attribute-list\n // with an attribute-name of Secure and an empty attribute-value.\n\n cookieAttributeList.secure = true\n } else if (attributeNameLowercase === 'httponly') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6\n // If the attribute-name case-insensitively matches the string\n // \"HttpOnly\", the user agent MUST append an attribute to the cookie-\n // attribute-list with an attribute-name of HttpOnly and an empty\n // attribute-value.\n\n cookieAttributeList.httpOnly = true\n } else if (attributeNameLowercase === 'samesite') {\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7\n // If the attribute-name case-insensitively matches the string\n // \"SameSite\", the user agent MUST process the cookie-av as follows:\n\n // 1. Let enforcement be \"Default\".\n let enforcement = 'Default'\n\n const attributeValueLowercase = attributeValue.toLowerCase()\n // 2. If cookie-av's attribute-value is a case-insensitive match for\n // \"None\", set enforcement to \"None\".\n if (attributeValueLowercase.includes('none')) {\n enforcement = 'None'\n }\n\n // 3. If cookie-av's attribute-value is a case-insensitive match for\n // \"Strict\", set enforcement to \"Strict\".\n if (attributeValueLowercase.includes('strict')) {\n enforcement = 'Strict'\n }\n\n // 4. If cookie-av's attribute-value is a case-insensitive match for\n // \"Lax\", set enforcement to \"Lax\".\n if (attributeValueLowercase.includes('lax')) {\n enforcement = 'Lax'\n }\n\n // 5. Append an attribute to the cookie-attribute-list with an\n // attribute-name of \"SameSite\" and an attribute-value of\n // enforcement.\n cookieAttributeList.sameSite = enforcement\n } else {\n cookieAttributeList.unparsed ??= []\n\n cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`)\n }\n\n // 8. Return to Step 1 of this algorithm.\n return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)\n}\n\nmodule.exports = {\n parseSetCookie,\n parseUnparsedAttributes\n}\n","'use strict'\n\nconst assert = require('assert')\nconst { kHeadersList } = require('../core/symbols')\n\nfunction isCTLExcludingHtab (value) {\n if (value.length === 0) {\n return false\n }\n\n for (const char of value) {\n const code = char.charCodeAt(0)\n\n if (\n (code >= 0x00 || code <= 0x08) ||\n (code >= 0x0A || code <= 0x1F) ||\n code === 0x7F\n ) {\n return false\n }\n }\n}\n\n/**\n CHAR = \n token = 1*\n separators = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n | \",\" | \";\" | \":\" | \"\\\" | <\">\n | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n | \"{\" | \"}\" | SP | HT\n * @param {string} name\n */\nfunction validateCookieName (name) {\n for (const char of name) {\n const code = char.charCodeAt(0)\n\n if (\n (code <= 0x20 || code > 0x7F) ||\n char === '(' ||\n char === ')' ||\n char === '>' ||\n char === '<' ||\n char === '@' ||\n char === ',' ||\n char === ';' ||\n char === ':' ||\n char === '\\\\' ||\n char === '\"' ||\n char === '/' ||\n char === '[' ||\n char === ']' ||\n char === '?' ||\n char === '=' ||\n char === '{' ||\n char === '}'\n ) {\n throw new Error('Invalid cookie name')\n }\n }\n}\n\n/**\n cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n ; US-ASCII characters excluding CTLs,\n ; whitespace DQUOTE, comma, semicolon,\n ; and backslash\n * @param {string} value\n */\nfunction validateCookieValue (value) {\n for (const char of value) {\n const code = char.charCodeAt(0)\n\n if (\n code < 0x21 || // exclude CTLs (0-31)\n code === 0x22 ||\n code === 0x2C ||\n code === 0x3B ||\n code === 0x5C ||\n code > 0x7E // non-ascii\n ) {\n throw new Error('Invalid header value')\n }\n }\n}\n\n/**\n * path-value = \n * @param {string} path\n */\nfunction validateCookiePath (path) {\n for (const char of path) {\n const code = char.charCodeAt(0)\n\n if (code < 0x21 || char === ';') {\n throw new Error('Invalid cookie path')\n }\n }\n}\n\n/**\n * I have no idea why these values aren't allowed to be honest,\n * but Deno tests these. - Khafra\n * @param {string} domain\n */\nfunction validateCookieDomain (domain) {\n if (\n domain.startsWith('-') ||\n domain.endsWith('.') ||\n domain.endsWith('-')\n ) {\n throw new Error('Invalid cookie domain')\n }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1\n * @param {number|Date} date\n IMF-fixdate = day-name \",\" SP date1 SP time-of-day SP GMT\n ; fixed length/zone/capitalization subset of the format\n ; see Section 3.3 of [RFC5322]\n\n day-name = %x4D.6F.6E ; \"Mon\", case-sensitive\n / %x54.75.65 ; \"Tue\", case-sensitive\n / %x57.65.64 ; \"Wed\", case-sensitive\n / %x54.68.75 ; \"Thu\", case-sensitive\n / %x46.72.69 ; \"Fri\", case-sensitive\n / %x53.61.74 ; \"Sat\", case-sensitive\n / %x53.75.6E ; \"Sun\", case-sensitive\n date1 = day SP month SP year\n ; e.g., 02 Jun 1982\n\n day = 2DIGIT\n month = %x4A.61.6E ; \"Jan\", case-sensitive\n / %x46.65.62 ; \"Feb\", case-sensitive\n / %x4D.61.72 ; \"Mar\", case-sensitive\n / %x41.70.72 ; \"Apr\", case-sensitive\n / %x4D.61.79 ; \"May\", case-sensitive\n / %x4A.75.6E ; \"Jun\", case-sensitive\n / %x4A.75.6C ; \"Jul\", case-sensitive\n / %x41.75.67 ; \"Aug\", case-sensitive\n / %x53.65.70 ; \"Sep\", case-sensitive\n / %x4F.63.74 ; \"Oct\", case-sensitive\n / %x4E.6F.76 ; \"Nov\", case-sensitive\n / %x44.65.63 ; \"Dec\", case-sensitive\n year = 4DIGIT\n\n GMT = %x47.4D.54 ; \"GMT\", case-sensitive\n\n time-of-day = hour \":\" minute \":\" second\n ; 00:00:00 - 23:59:60 (leap second)\n\n hour = 2DIGIT\n minute = 2DIGIT\n second = 2DIGIT\n */\nfunction toIMFDate (date) {\n if (typeof date === 'number') {\n date = new Date(date)\n }\n\n const days = [\n 'Sun', 'Mon', 'Tue', 'Wed',\n 'Thu', 'Fri', 'Sat'\n ]\n\n const months = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n ]\n\n const dayName = days[date.getUTCDay()]\n const day = date.getUTCDate().toString().padStart(2, '0')\n const month = months[date.getUTCMonth()]\n const year = date.getUTCFullYear()\n const hour = date.getUTCHours().toString().padStart(2, '0')\n const minute = date.getUTCMinutes().toString().padStart(2, '0')\n const second = date.getUTCSeconds().toString().padStart(2, '0')\n\n return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT`\n}\n\n/**\n max-age-av = \"Max-Age=\" non-zero-digit *DIGIT\n ; In practice, both expires-av and max-age-av\n ; are limited to dates representable by the\n ; user agent.\n * @param {number} maxAge\n */\nfunction validateCookieMaxAge (maxAge) {\n if (maxAge < 0) {\n throw new Error('Invalid cookie max-age')\n }\n}\n\n/**\n * @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1\n * @param {import('./index').Cookie} cookie\n */\nfunction stringify (cookie) {\n if (cookie.name.length === 0) {\n return null\n }\n\n validateCookieName(cookie.name)\n validateCookieValue(cookie.value)\n\n const out = [`${cookie.name}=${cookie.value}`]\n\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1\n // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2\n if (cookie.name.startsWith('__Secure-')) {\n cookie.secure = true\n }\n\n if (cookie.name.startsWith('__Host-')) {\n cookie.secure = true\n cookie.domain = null\n cookie.path = '/'\n }\n\n if (cookie.secure) {\n out.push('Secure')\n }\n\n if (cookie.httpOnly) {\n out.push('HttpOnly')\n }\n\n if (typeof cookie.maxAge === 'number') {\n validateCookieMaxAge(cookie.maxAge)\n out.push(`Max-Age=${cookie.maxAge}`)\n }\n\n if (cookie.domain) {\n validateCookieDomain(cookie.domain)\n out.push(`Domain=${cookie.domain}`)\n }\n\n if (cookie.path) {\n validateCookiePath(cookie.path)\n out.push(`Path=${cookie.path}`)\n }\n\n if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') {\n out.push(`Expires=${toIMFDate(cookie.expires)}`)\n }\n\n if (cookie.sameSite) {\n out.push(`SameSite=${cookie.sameSite}`)\n }\n\n for (const part of cookie.unparsed) {\n if (!part.includes('=')) {\n throw new Error('Invalid unparsed')\n }\n\n const [key, ...value] = part.split('=')\n\n out.push(`${key.trim()}=${value.join('=')}`)\n }\n\n return out.join('; ')\n}\n\nlet kHeadersListNode\n\nfunction getHeadersList (headers) {\n if (headers[kHeadersList]) {\n return headers[kHeadersList]\n }\n\n if (!kHeadersListNode) {\n kHeadersListNode = Object.getOwnPropertySymbols(headers).find(\n (symbol) => symbol.description === 'headers list'\n )\n\n assert(kHeadersListNode, 'Headers cannot be parsed')\n }\n\n const headersList = headers[kHeadersListNode]\n assert(headersList)\n\n return headersList\n}\n\nmodule.exports = {\n isCTLExcludingHtab,\n stringify,\n getHeadersList\n}\n","'use strict'\n\nconst net = require('net')\nconst assert = require('assert')\nconst util = require('./util')\nconst { InvalidArgumentError, ConnectTimeoutError } = require('./errors')\n\nlet tls // include tls conditionally since it is not always available\n\n// TODO: session re-use does not wait for the first\n// connection to resolve the session and might therefore\n// resolve the same servername multiple times even when\n// re-use is enabled.\n\nlet SessionCache\n// FIXME: remove workaround when the Node bug is fixed\n// https://github.com/nodejs/node/issues/49344#issuecomment-1741776308\nif (global.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) {\n SessionCache = class WeakSessionCache {\n constructor (maxCachedSessions) {\n this._maxCachedSessions = maxCachedSessions\n this._sessionCache = new Map()\n this._sessionRegistry = new global.FinalizationRegistry((key) => {\n if (this._sessionCache.size < this._maxCachedSessions) {\n return\n }\n\n const ref = this._sessionCache.get(key)\n if (ref !== undefined && ref.deref() === undefined) {\n this._sessionCache.delete(key)\n }\n })\n }\n\n get (sessionKey) {\n const ref = this._sessionCache.get(sessionKey)\n return ref ? ref.deref() : null\n }\n\n set (sessionKey, session) {\n if (this._maxCachedSessions === 0) {\n return\n }\n\n this._sessionCache.set(sessionKey, new WeakRef(session))\n this._sessionRegistry.register(session, sessionKey)\n }\n }\n} else {\n SessionCache = class SimpleSessionCache {\n constructor (maxCachedSessions) {\n this._maxCachedSessions = maxCachedSessions\n this._sessionCache = new Map()\n }\n\n get (sessionKey) {\n return this._sessionCache.get(sessionKey)\n }\n\n set (sessionKey, session) {\n if (this._maxCachedSessions === 0) {\n return\n }\n\n if (this._sessionCache.size >= this._maxCachedSessions) {\n // remove the oldest session\n const { value: oldestKey } = this._sessionCache.keys().next()\n this._sessionCache.delete(oldestKey)\n }\n\n this._sessionCache.set(sessionKey, session)\n }\n }\n}\n\nfunction buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) {\n if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) {\n throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero')\n }\n\n const options = { path: socketPath, ...opts }\n const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions)\n timeout = timeout == null ? 10e3 : timeout\n allowH2 = allowH2 != null ? allowH2 : false\n return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {\n let socket\n if (protocol === 'https:') {\n if (!tls) {\n tls = require('tls')\n }\n servername = servername || options.servername || util.getServerName(host) || null\n\n const sessionKey = servername || hostname\n const session = sessionCache.get(sessionKey) || null\n\n assert(sessionKey)\n\n socket = tls.connect({\n highWaterMark: 16384, // TLS in node can't have bigger HWM anyway...\n ...options,\n servername,\n session,\n localAddress,\n // TODO(HTTP/2): Add support for h2c\n ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'],\n socket: httpSocket, // upgrade socket connection\n port: port || 443,\n host: hostname\n })\n\n socket\n .on('session', function (session) {\n // TODO (fix): Can a session become invalid once established? Don't think so?\n sessionCache.set(sessionKey, session)\n })\n } else {\n assert(!httpSocket, 'httpSocket can only be sent on TLS update')\n socket = net.connect({\n highWaterMark: 64 * 1024, // Same as nodejs fs streams.\n ...options,\n localAddress,\n port: port || 80,\n host: hostname\n })\n }\n\n // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket\n if (options.keepAlive == null || options.keepAlive) {\n const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay\n socket.setKeepAlive(true, keepAliveInitialDelay)\n }\n\n const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout)\n\n socket\n .setNoDelay(true)\n .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () {\n cancelTimeout()\n\n if (callback) {\n const cb = callback\n callback = null\n cb(null, this)\n }\n })\n .on('error', function (err) {\n cancelTimeout()\n\n if (callback) {\n const cb = callback\n callback = null\n cb(err)\n }\n })\n\n return socket\n }\n}\n\nfunction setupTimeout (onConnectTimeout, timeout) {\n if (!timeout) {\n return () => {}\n }\n\n let s1 = null\n let s2 = null\n const timeoutId = setTimeout(() => {\n // setImmediate is added to make sure that we priotorise socket error events over timeouts\n s1 = setImmediate(() => {\n if (process.platform === 'win32') {\n // Windows needs an extra setImmediate probably due to implementation differences in the socket logic\n s2 = setImmediate(() => onConnectTimeout())\n } else {\n onConnectTimeout()\n }\n })\n }, timeout)\n return () => {\n clearTimeout(timeoutId)\n clearImmediate(s1)\n clearImmediate(s2)\n }\n}\n\nfunction onConnectTimeout (socket) {\n util.destroy(socket, new ConnectTimeoutError())\n}\n\nmodule.exports = buildConnector\n","'use strict'\n\nclass UndiciError extends Error {\n constructor (message) {\n super(message)\n this.name = 'UndiciError'\n this.code = 'UND_ERR'\n }\n}\n\nclass ConnectTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, ConnectTimeoutError)\n this.name = 'ConnectTimeoutError'\n this.message = message || 'Connect Timeout Error'\n this.code = 'UND_ERR_CONNECT_TIMEOUT'\n }\n}\n\nclass HeadersTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, HeadersTimeoutError)\n this.name = 'HeadersTimeoutError'\n this.message = message || 'Headers Timeout Error'\n this.code = 'UND_ERR_HEADERS_TIMEOUT'\n }\n}\n\nclass HeadersOverflowError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, HeadersOverflowError)\n this.name = 'HeadersOverflowError'\n this.message = message || 'Headers Overflow Error'\n this.code = 'UND_ERR_HEADERS_OVERFLOW'\n }\n}\n\nclass BodyTimeoutError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, BodyTimeoutError)\n this.name = 'BodyTimeoutError'\n this.message = message || 'Body Timeout Error'\n this.code = 'UND_ERR_BODY_TIMEOUT'\n }\n}\n\nclass ResponseStatusCodeError extends UndiciError {\n constructor (message, statusCode, headers, body) {\n super(message)\n Error.captureStackTrace(this, ResponseStatusCodeError)\n this.name = 'ResponseStatusCodeError'\n this.message = message || 'Response Status Code Error'\n this.code = 'UND_ERR_RESPONSE_STATUS_CODE'\n this.body = body\n this.status = statusCode\n this.statusCode = statusCode\n this.headers = headers\n }\n}\n\nclass InvalidArgumentError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, InvalidArgumentError)\n this.name = 'InvalidArgumentError'\n this.message = message || 'Invalid Argument Error'\n this.code = 'UND_ERR_INVALID_ARG'\n }\n}\n\nclass InvalidReturnValueError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, InvalidReturnValueError)\n this.name = 'InvalidReturnValueError'\n this.message = message || 'Invalid Return Value Error'\n this.code = 'UND_ERR_INVALID_RETURN_VALUE'\n }\n}\n\nclass RequestAbortedError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, RequestAbortedError)\n this.name = 'AbortError'\n this.message = message || 'Request aborted'\n this.code = 'UND_ERR_ABORTED'\n }\n}\n\nclass InformationalError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, InformationalError)\n this.name = 'InformationalError'\n this.message = message || 'Request information'\n this.code = 'UND_ERR_INFO'\n }\n}\n\nclass RequestContentLengthMismatchError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, RequestContentLengthMismatchError)\n this.name = 'RequestContentLengthMismatchError'\n this.message = message || 'Request body length does not match content-length header'\n this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'\n }\n}\n\nclass ResponseContentLengthMismatchError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, ResponseContentLengthMismatchError)\n this.name = 'ResponseContentLengthMismatchError'\n this.message = message || 'Response body length does not match content-length header'\n this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'\n }\n}\n\nclass ClientDestroyedError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, ClientDestroyedError)\n this.name = 'ClientDestroyedError'\n this.message = message || 'The client is destroyed'\n this.code = 'UND_ERR_DESTROYED'\n }\n}\n\nclass ClientClosedError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, ClientClosedError)\n this.name = 'ClientClosedError'\n this.message = message || 'The client is closed'\n this.code = 'UND_ERR_CLOSED'\n }\n}\n\nclass SocketError extends UndiciError {\n constructor (message, socket) {\n super(message)\n Error.captureStackTrace(this, SocketError)\n this.name = 'SocketError'\n this.message = message || 'Socket error'\n this.code = 'UND_ERR_SOCKET'\n this.socket = socket\n }\n}\n\nclass NotSupportedError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, NotSupportedError)\n this.name = 'NotSupportedError'\n this.message = message || 'Not supported error'\n this.code = 'UND_ERR_NOT_SUPPORTED'\n }\n}\n\nclass BalancedPoolMissingUpstreamError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, NotSupportedError)\n this.name = 'MissingUpstreamError'\n this.message = message || 'No upstream has been added to the BalancedPool'\n this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'\n }\n}\n\nclass HTTPParserError extends Error {\n constructor (message, code, data) {\n super(message)\n Error.captureStackTrace(this, HTTPParserError)\n this.name = 'HTTPParserError'\n this.code = code ? `HPE_${code}` : undefined\n this.data = data ? data.toString() : undefined\n }\n}\n\nclass ResponseExceededMaxSizeError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, ResponseExceededMaxSizeError)\n this.name = 'ResponseExceededMaxSizeError'\n this.message = message || 'Response content exceeded max size'\n this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE'\n }\n}\n\nmodule.exports = {\n HTTPParserError,\n UndiciError,\n HeadersTimeoutError,\n HeadersOverflowError,\n BodyTimeoutError,\n RequestContentLengthMismatchError,\n ConnectTimeoutError,\n ResponseStatusCodeError,\n InvalidArgumentError,\n InvalidReturnValueError,\n RequestAbortedError,\n ClientDestroyedError,\n ClientClosedError,\n InformationalError,\n SocketError,\n NotSupportedError,\n ResponseContentLengthMismatchError,\n BalancedPoolMissingUpstreamError,\n ResponseExceededMaxSizeError\n}\n","'use strict'\n\nconst {\n InvalidArgumentError,\n NotSupportedError\n} = require('./errors')\nconst assert = require('assert')\nconst { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require('./symbols')\nconst util = require('./util')\n\n// tokenRegExp and headerCharRegex have been lifted from\n// https://github.com/nodejs/node/blob/main/lib/_http_common.js\n\n/**\n * Verifies that the given val is a valid HTTP token\n * per the rules defined in RFC 7230\n * See https://tools.ietf.org/html/rfc7230#section-3.2.6\n */\nconst tokenRegExp = /^[\\^_`a-zA-Z\\-0-9!#$%&'*+.|~]+$/\n\n/**\n * Matches if val contains an invalid field-vchar\n * field-value = *( field-content / obs-fold )\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n */\nconst headerCharRegex = /[^\\t\\x20-\\x7e\\x80-\\xff]/\n\n// Verifies that a given path is valid does not contain control chars \\x00 to \\x20\nconst invalidPathRegex = /[^\\u0021-\\u00ff]/\n\nconst kHandler = Symbol('handler')\n\nconst channels = {}\n\nlet extractBody\n\ntry {\n const diagnosticsChannel = require('diagnostics_channel')\n channels.create = diagnosticsChannel.channel('undici:request:create')\n channels.bodySent = diagnosticsChannel.channel('undici:request:bodySent')\n channels.headers = diagnosticsChannel.channel('undici:request:headers')\n channels.trailers = diagnosticsChannel.channel('undici:request:trailers')\n channels.error = diagnosticsChannel.channel('undici:request:error')\n} catch {\n channels.create = { hasSubscribers: false }\n channels.bodySent = { hasSubscribers: false }\n channels.headers = { hasSubscribers: false }\n channels.trailers = { hasSubscribers: false }\n channels.error = { hasSubscribers: false }\n}\n\nclass Request {\n constructor (origin, {\n path,\n method,\n body,\n headers,\n query,\n idempotent,\n blocking,\n upgrade,\n headersTimeout,\n bodyTimeout,\n reset,\n throwOnError,\n expectContinue\n }, handler) {\n if (typeof path !== 'string') {\n throw new InvalidArgumentError('path must be a string')\n } else if (\n path[0] !== '/' &&\n !(path.startsWith('http://') || path.startsWith('https://')) &&\n method !== 'CONNECT'\n ) {\n throw new InvalidArgumentError('path must be an absolute URL or start with a slash')\n } else if (invalidPathRegex.exec(path) !== null) {\n throw new InvalidArgumentError('invalid request path')\n }\n\n if (typeof method !== 'string') {\n throw new InvalidArgumentError('method must be a string')\n } else if (tokenRegExp.exec(method) === null) {\n throw new InvalidArgumentError('invalid request method')\n }\n\n if (upgrade && typeof upgrade !== 'string') {\n throw new InvalidArgumentError('upgrade must be a string')\n }\n\n if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {\n throw new InvalidArgumentError('invalid headersTimeout')\n }\n\n if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) {\n throw new InvalidArgumentError('invalid bodyTimeout')\n }\n\n if (reset != null && typeof reset !== 'boolean') {\n throw new InvalidArgumentError('invalid reset')\n }\n\n if (expectContinue != null && typeof expectContinue !== 'boolean') {\n throw new InvalidArgumentError('invalid expectContinue')\n }\n\n this.headersTimeout = headersTimeout\n\n this.bodyTimeout = bodyTimeout\n\n this.throwOnError = throwOnError === true\n\n this.method = method\n\n this.abort = null\n\n if (body == null) {\n this.body = null\n } else if (util.isStream(body)) {\n this.body = body\n\n const rState = this.body._readableState\n if (!rState || !rState.autoDestroy) {\n this.endHandler = function autoDestroy () {\n util.destroy(this)\n }\n this.body.on('end', this.endHandler)\n }\n\n this.errorHandler = err => {\n if (this.abort) {\n this.abort(err)\n } else {\n this.error = err\n }\n }\n this.body.on('error', this.errorHandler)\n } else if (util.isBuffer(body)) {\n this.body = body.byteLength ? body : null\n } else if (ArrayBuffer.isView(body)) {\n this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null\n } else if (body instanceof ArrayBuffer) {\n this.body = body.byteLength ? Buffer.from(body) : null\n } else if (typeof body === 'string') {\n this.body = body.length ? Buffer.from(body) : null\n } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) {\n this.body = body\n } else {\n throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable')\n }\n\n this.completed = false\n\n this.aborted = false\n\n this.upgrade = upgrade || null\n\n this.path = query ? util.buildURL(path, query) : path\n\n this.origin = origin\n\n this.idempotent = idempotent == null\n ? method === 'HEAD' || method === 'GET'\n : idempotent\n\n this.blocking = blocking == null ? false : blocking\n\n this.reset = reset == null ? null : reset\n\n this.host = null\n\n this.contentLength = null\n\n this.contentType = null\n\n this.headers = ''\n\n // Only for H2\n this.expectContinue = expectContinue != null ? expectContinue : false\n\n if (Array.isArray(headers)) {\n if (headers.length % 2 !== 0) {\n throw new InvalidArgumentError('headers array must be even')\n }\n for (let i = 0; i < headers.length; i += 2) {\n processHeader(this, headers[i], headers[i + 1])\n }\n } else if (headers && typeof headers === 'object') {\n const keys = Object.keys(headers)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n processHeader(this, key, headers[key])\n }\n } else if (headers != null) {\n throw new InvalidArgumentError('headers must be an object or an array')\n }\n\n if (util.isFormDataLike(this.body)) {\n if (util.nodeMajor < 16 || (util.nodeMajor === 16 && util.nodeMinor < 8)) {\n throw new InvalidArgumentError('Form-Data bodies are only supported in node v16.8 and newer.')\n }\n\n if (!extractBody) {\n extractBody = require('../fetch/body.js').extractBody\n }\n\n const [bodyStream, contentType] = extractBody(body)\n if (this.contentType == null) {\n this.contentType = contentType\n this.headers += `content-type: ${contentType}\\r\\n`\n }\n this.body = bodyStream.stream\n this.contentLength = bodyStream.length\n } else if (util.isBlobLike(body) && this.contentType == null && body.type) {\n this.contentType = body.type\n this.headers += `content-type: ${body.type}\\r\\n`\n }\n\n util.validateHandler(handler, method, upgrade)\n\n this.servername = util.getServerName(this.host)\n\n this[kHandler] = handler\n\n if (channels.create.hasSubscribers) {\n channels.create.publish({ request: this })\n }\n }\n\n onBodySent (chunk) {\n if (this[kHandler].onBodySent) {\n try {\n this[kHandler].onBodySent(chunk)\n } catch (err) {\n this.onError(err)\n }\n }\n }\n\n onRequestSent () {\n if (channels.bodySent.hasSubscribers) {\n channels.bodySent.publish({ request: this })\n }\n\n if (this[kHandler].onRequestSent) {\n try {\n this[kHandler].onRequestSent()\n } catch (err) {\n this.onError(err)\n }\n }\n }\n\n onConnect (abort) {\n assert(!this.aborted)\n assert(!this.completed)\n\n if (this.error) {\n abort(this.error)\n } else {\n this.abort = abort\n return this[kHandler].onConnect(abort)\n }\n }\n\n onHeaders (statusCode, headers, resume, statusText) {\n assert(!this.aborted)\n assert(!this.completed)\n\n if (channels.headers.hasSubscribers) {\n channels.headers.publish({ request: this, response: { statusCode, headers, statusText } })\n }\n\n return this[kHandler].onHeaders(statusCode, headers, resume, statusText)\n }\n\n onData (chunk) {\n assert(!this.aborted)\n assert(!this.completed)\n\n return this[kHandler].onData(chunk)\n }\n\n onUpgrade (statusCode, headers, socket) {\n assert(!this.aborted)\n assert(!this.completed)\n\n return this[kHandler].onUpgrade(statusCode, headers, socket)\n }\n\n onComplete (trailers) {\n this.onFinally()\n\n assert(!this.aborted)\n\n this.completed = true\n if (channels.trailers.hasSubscribers) {\n channels.trailers.publish({ request: this, trailers })\n }\n return this[kHandler].onComplete(trailers)\n }\n\n onError (error) {\n this.onFinally()\n\n if (channels.error.hasSubscribers) {\n channels.error.publish({ request: this, error })\n }\n\n if (this.aborted) {\n return\n }\n this.aborted = true\n return this[kHandler].onError(error)\n }\n\n onFinally () {\n if (this.errorHandler) {\n this.body.off('error', this.errorHandler)\n this.errorHandler = null\n }\n\n if (this.endHandler) {\n this.body.off('end', this.endHandler)\n this.endHandler = null\n }\n }\n\n // TODO: adjust to support H2\n addHeader (key, value) {\n processHeader(this, key, value)\n return this\n }\n\n static [kHTTP1BuildRequest] (origin, opts, handler) {\n // TODO: Migrate header parsing here, to make Requests\n // HTTP agnostic\n return new Request(origin, opts, handler)\n }\n\n static [kHTTP2BuildRequest] (origin, opts, handler) {\n const headers = opts.headers\n opts = { ...opts, headers: null }\n\n const request = new Request(origin, opts, handler)\n\n request.headers = {}\n\n if (Array.isArray(headers)) {\n if (headers.length % 2 !== 0) {\n throw new InvalidArgumentError('headers array must be even')\n }\n for (let i = 0; i < headers.length; i += 2) {\n processHeader(request, headers[i], headers[i + 1], true)\n }\n } else if (headers && typeof headers === 'object') {\n const keys = Object.keys(headers)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n processHeader(request, key, headers[key], true)\n }\n } else if (headers != null) {\n throw new InvalidArgumentError('headers must be an object or an array')\n }\n\n return request\n }\n\n static [kHTTP2CopyHeaders] (raw) {\n const rawHeaders = raw.split('\\r\\n')\n const headers = {}\n\n for (const header of rawHeaders) {\n const [key, value] = header.split(': ')\n\n if (value == null || value.length === 0) continue\n\n if (headers[key]) headers[key] += `,${value}`\n else headers[key] = value\n }\n\n return headers\n }\n}\n\nfunction processHeaderValue (key, val, skipAppend) {\n if (val && typeof val === 'object') {\n throw new InvalidArgumentError(`invalid ${key} header`)\n }\n\n val = val != null ? `${val}` : ''\n\n if (headerCharRegex.exec(val) !== null) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n }\n\n return skipAppend ? val : `${key}: ${val}\\r\\n`\n}\n\nfunction processHeader (request, key, val, skipAppend = false) {\n if (val && (typeof val === 'object' && !Array.isArray(val))) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n } else if (val === undefined) {\n return\n }\n\n if (\n request.host === null &&\n key.length === 4 &&\n key.toLowerCase() === 'host'\n ) {\n if (headerCharRegex.exec(val) !== null) {\n throw new InvalidArgumentError(`invalid ${key} header`)\n }\n // Consumed by Client\n request.host = val\n } else if (\n request.contentLength === null &&\n key.length === 14 &&\n key.toLowerCase() === 'content-length'\n ) {\n request.contentLength = parseInt(val, 10)\n if (!Number.isFinite(request.contentLength)) {\n throw new InvalidArgumentError('invalid content-length header')\n }\n } else if (\n request.contentType === null &&\n key.length === 12 &&\n key.toLowerCase() === 'content-type'\n ) {\n request.contentType = val\n if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend)\n else request.headers += processHeaderValue(key, val)\n } else if (\n key.length === 17 &&\n key.toLowerCase() === 'transfer-encoding'\n ) {\n throw new InvalidArgumentError('invalid transfer-encoding header')\n } else if (\n key.length === 10 &&\n key.toLowerCase() === 'connection'\n ) {\n const value = typeof val === 'string' ? val.toLowerCase() : null\n if (value !== 'close' && value !== 'keep-alive') {\n throw new InvalidArgumentError('invalid connection header')\n } else if (value === 'close') {\n request.reset = true\n }\n } else if (\n key.length === 10 &&\n key.toLowerCase() === 'keep-alive'\n ) {\n throw new InvalidArgumentError('invalid keep-alive header')\n } else if (\n key.length === 7 &&\n key.toLowerCase() === 'upgrade'\n ) {\n throw new InvalidArgumentError('invalid upgrade header')\n } else if (\n key.length === 6 &&\n key.toLowerCase() === 'expect'\n ) {\n throw new NotSupportedError('expect header not supported')\n } else if (tokenRegExp.exec(key) === null) {\n throw new InvalidArgumentError('invalid header key')\n } else {\n if (Array.isArray(val)) {\n for (let i = 0; i < val.length; i++) {\n if (skipAppend) {\n if (request.headers[key]) request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`\n else request.headers[key] = processHeaderValue(key, val[i], skipAppend)\n } else {\n request.headers += processHeaderValue(key, val[i])\n }\n }\n } else {\n if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend)\n else request.headers += processHeaderValue(key, val)\n }\n }\n}\n\nmodule.exports = Request\n","module.exports = {\n kClose: Symbol('close'),\n kDestroy: Symbol('destroy'),\n kDispatch: Symbol('dispatch'),\n kUrl: Symbol('url'),\n kWriting: Symbol('writing'),\n kResuming: Symbol('resuming'),\n kQueue: Symbol('queue'),\n kConnect: Symbol('connect'),\n kConnecting: Symbol('connecting'),\n kHeadersList: Symbol('headers list'),\n kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'),\n kKeepAliveMaxTimeout: Symbol('max keep alive timeout'),\n kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'),\n kKeepAliveTimeoutValue: Symbol('keep alive timeout'),\n kKeepAlive: Symbol('keep alive'),\n kHeadersTimeout: Symbol('headers timeout'),\n kBodyTimeout: Symbol('body timeout'),\n kServerName: Symbol('server name'),\n kLocalAddress: Symbol('local address'),\n kHost: Symbol('host'),\n kNoRef: Symbol('no ref'),\n kBodyUsed: Symbol('used'),\n kRunning: Symbol('running'),\n kBlocking: Symbol('blocking'),\n kPending: Symbol('pending'),\n kSize: Symbol('size'),\n kBusy: Symbol('busy'),\n kQueued: Symbol('queued'),\n kFree: Symbol('free'),\n kConnected: Symbol('connected'),\n kClosed: Symbol('closed'),\n kNeedDrain: Symbol('need drain'),\n kReset: Symbol('reset'),\n kDestroyed: Symbol.for('nodejs.stream.destroyed'),\n kMaxHeadersSize: Symbol('max headers size'),\n kRunningIdx: Symbol('running index'),\n kPendingIdx: Symbol('pending index'),\n kError: Symbol('error'),\n kClients: Symbol('clients'),\n kClient: Symbol('client'),\n kParser: Symbol('parser'),\n kOnDestroyed: Symbol('destroy callbacks'),\n kPipelining: Symbol('pipelining'),\n kSocket: Symbol('socket'),\n kHostHeader: Symbol('host header'),\n kConnector: Symbol('connector'),\n kStrictContentLength: Symbol('strict content length'),\n kMaxRedirections: Symbol('maxRedirections'),\n kMaxRequests: Symbol('maxRequestsPerClient'),\n kProxy: Symbol('proxy agent options'),\n kCounter: Symbol('socket request counter'),\n kInterceptors: Symbol('dispatch interceptors'),\n kMaxResponseSize: Symbol('max response size'),\n kHTTP2Session: Symbol('http2Session'),\n kHTTP2SessionState: Symbol('http2Session state'),\n kHTTP2BuildRequest: Symbol('http2 build request'),\n kHTTP1BuildRequest: Symbol('http1 build request'),\n kHTTP2CopyHeaders: Symbol('http2 copy headers'),\n kHTTPConnVersion: Symbol('http connection version')\n}\n","'use strict'\n\nconst assert = require('assert')\nconst { kDestroyed, kBodyUsed } = require('./symbols')\nconst { IncomingMessage } = require('http')\nconst stream = require('stream')\nconst net = require('net')\nconst { InvalidArgumentError } = require('./errors')\nconst { Blob } = require('buffer')\nconst nodeUtil = require('util')\nconst { stringify } = require('querystring')\n\nconst [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v))\n\nfunction nop () {}\n\nfunction isStream (obj) {\n return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function'\n}\n\n// based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License)\nfunction isBlobLike (object) {\n return (Blob && object instanceof Blob) || (\n object &&\n typeof object === 'object' &&\n (typeof object.stream === 'function' ||\n typeof object.arrayBuffer === 'function') &&\n /^(Blob|File)$/.test(object[Symbol.toStringTag])\n )\n}\n\nfunction buildURL (url, queryParams) {\n if (url.includes('?') || url.includes('#')) {\n throw new Error('Query params cannot be passed when url already contains \"?\" or \"#\".')\n }\n\n const stringified = stringify(queryParams)\n\n if (stringified) {\n url += '?' + stringified\n }\n\n return url\n}\n\nfunction parseURL (url) {\n if (typeof url === 'string') {\n url = new URL(url)\n\n if (!/^https?:/.test(url.origin || url.protocol)) {\n throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n }\n\n return url\n }\n\n if (!url || typeof url !== 'object') {\n throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.')\n }\n\n if (!/^https?:/.test(url.origin || url.protocol)) {\n throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')\n }\n\n if (!(url instanceof URL)) {\n if (url.port != null && url.port !== '' && !Number.isFinite(parseInt(url.port))) {\n throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.')\n }\n\n if (url.path != null && typeof url.path !== 'string') {\n throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.')\n }\n\n if (url.pathname != null && typeof url.pathname !== 'string') {\n throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.')\n }\n\n if (url.hostname != null && typeof url.hostname !== 'string') {\n throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.')\n }\n\n if (url.origin != null && typeof url.origin !== 'string') {\n throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.')\n }\n\n const port = url.port != null\n ? url.port\n : (url.protocol === 'https:' ? 443 : 80)\n let origin = url.origin != null\n ? url.origin\n : `${url.protocol}//${url.hostname}:${port}`\n let path = url.path != null\n ? url.path\n : `${url.pathname || ''}${url.search || ''}`\n\n if (origin.endsWith('/')) {\n origin = origin.substring(0, origin.length - 1)\n }\n\n if (path && !path.startsWith('/')) {\n path = `/${path}`\n }\n // new URL(path, origin) is unsafe when `path` contains an absolute URL\n // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL:\n // If first parameter is a relative URL, second param is required, and will be used as the base URL.\n // If first parameter is an absolute URL, a given second param will be ignored.\n url = new URL(origin + path)\n }\n\n return url\n}\n\nfunction parseOrigin (url) {\n url = parseURL(url)\n\n if (url.pathname !== '/' || url.search || url.hash) {\n throw new InvalidArgumentError('invalid url')\n }\n\n return url\n}\n\nfunction getHostname (host) {\n if (host[0] === '[') {\n const idx = host.indexOf(']')\n\n assert(idx !== -1)\n return host.substr(1, idx - 1)\n }\n\n const idx = host.indexOf(':')\n if (idx === -1) return host\n\n return host.substr(0, idx)\n}\n\n// IP addresses are not valid server names per RFC6066\n// > Currently, the only server names supported are DNS hostnames\nfunction getServerName (host) {\n if (!host) {\n return null\n }\n\n assert.strictEqual(typeof host, 'string')\n\n const servername = getHostname(host)\n if (net.isIP(servername)) {\n return ''\n }\n\n return servername\n}\n\nfunction deepClone (obj) {\n return JSON.parse(JSON.stringify(obj))\n}\n\nfunction isAsyncIterable (obj) {\n return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function')\n}\n\nfunction isIterable (obj) {\n return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function'))\n}\n\nfunction bodyLength (body) {\n if (body == null) {\n return 0\n } else if (isStream(body)) {\n const state = body._readableState\n return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length)\n ? state.length\n : null\n } else if (isBlobLike(body)) {\n return body.size != null ? body.size : null\n } else if (isBuffer(body)) {\n return body.byteLength\n }\n\n return null\n}\n\nfunction isDestroyed (stream) {\n return !stream || !!(stream.destroyed || stream[kDestroyed])\n}\n\nfunction isReadableAborted (stream) {\n const state = stream && stream._readableState\n return isDestroyed(stream) && state && !state.endEmitted\n}\n\nfunction destroy (stream, err) {\n if (stream == null || !isStream(stream) || isDestroyed(stream)) {\n return\n }\n\n if (typeof stream.destroy === 'function') {\n if (Object.getPrototypeOf(stream).constructor === IncomingMessage) {\n // See: https://github.com/nodejs/node/pull/38505/files\n stream.socket = null\n }\n\n stream.destroy(err)\n } else if (err) {\n process.nextTick((stream, err) => {\n stream.emit('error', err)\n }, stream, err)\n }\n\n if (stream.destroyed !== true) {\n stream[kDestroyed] = true\n }\n}\n\nconst KEEPALIVE_TIMEOUT_EXPR = /timeout=(\\d+)/\nfunction parseKeepAliveTimeout (val) {\n const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR)\n return m ? parseInt(m[1], 10) * 1000 : null\n}\n\nfunction parseHeaders (headers, obj = {}) {\n // For H2 support\n if (!Array.isArray(headers)) return headers\n\n for (let i = 0; i < headers.length; i += 2) {\n const key = headers[i].toString().toLowerCase()\n let val = obj[key]\n\n if (!val) {\n if (Array.isArray(headers[i + 1])) {\n obj[key] = headers[i + 1]\n } else {\n obj[key] = headers[i + 1].toString('utf8')\n }\n } else {\n if (!Array.isArray(val)) {\n val = [val]\n obj[key] = val\n }\n val.push(headers[i + 1].toString('utf8'))\n }\n }\n\n // See https://github.com/nodejs/node/pull/46528\n if ('content-length' in obj && 'content-disposition' in obj) {\n obj['content-disposition'] = Buffer.from(obj['content-disposition']).toString('latin1')\n }\n\n return obj\n}\n\nfunction parseRawHeaders (headers) {\n const ret = []\n let hasContentLength = false\n let contentDispositionIdx = -1\n\n for (let n = 0; n < headers.length; n += 2) {\n const key = headers[n + 0].toString()\n const val = headers[n + 1].toString('utf8')\n\n if (key.length === 14 && (key === 'content-length' || key.toLowerCase() === 'content-length')) {\n ret.push(key, val)\n hasContentLength = true\n } else if (key.length === 19 && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) {\n contentDispositionIdx = ret.push(key, val) - 1\n } else {\n ret.push(key, val)\n }\n }\n\n // See https://github.com/nodejs/node/pull/46528\n if (hasContentLength && contentDispositionIdx !== -1) {\n ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString('latin1')\n }\n\n return ret\n}\n\nfunction isBuffer (buffer) {\n // See, https://github.com/mcollina/undici/pull/319\n return buffer instanceof Uint8Array || Buffer.isBuffer(buffer)\n}\n\nfunction validateHandler (handler, method, upgrade) {\n if (!handler || typeof handler !== 'object') {\n throw new InvalidArgumentError('handler must be an object')\n }\n\n if (typeof handler.onConnect !== 'function') {\n throw new InvalidArgumentError('invalid onConnect method')\n }\n\n if (typeof handler.onError !== 'function') {\n throw new InvalidArgumentError('invalid onError method')\n }\n\n if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) {\n throw new InvalidArgumentError('invalid onBodySent method')\n }\n\n if (upgrade || method === 'CONNECT') {\n if (typeof handler.onUpgrade !== 'function') {\n throw new InvalidArgumentError('invalid onUpgrade method')\n }\n } else {\n if (typeof handler.onHeaders !== 'function') {\n throw new InvalidArgumentError('invalid onHeaders method')\n }\n\n if (typeof handler.onData !== 'function') {\n throw new InvalidArgumentError('invalid onData method')\n }\n\n if (typeof handler.onComplete !== 'function') {\n throw new InvalidArgumentError('invalid onComplete method')\n }\n }\n}\n\n// A body is disturbed if it has been read from and it cannot\n// be re-used without losing state or data.\nfunction isDisturbed (body) {\n return !!(body && (\n stream.isDisturbed\n ? stream.isDisturbed(body) || body[kBodyUsed] // TODO (fix): Why is body[kBodyUsed] needed?\n : body[kBodyUsed] ||\n body.readableDidRead ||\n (body._readableState && body._readableState.dataEmitted) ||\n isReadableAborted(body)\n ))\n}\n\nfunction isErrored (body) {\n return !!(body && (\n stream.isErrored\n ? stream.isErrored(body)\n : /state: 'errored'/.test(nodeUtil.inspect(body)\n )))\n}\n\nfunction isReadable (body) {\n return !!(body && (\n stream.isReadable\n ? stream.isReadable(body)\n : /state: 'readable'/.test(nodeUtil.inspect(body)\n )))\n}\n\nfunction getSocketInfo (socket) {\n return {\n localAddress: socket.localAddress,\n localPort: socket.localPort,\n remoteAddress: socket.remoteAddress,\n remotePort: socket.remotePort,\n remoteFamily: socket.remoteFamily,\n timeout: socket.timeout,\n bytesWritten: socket.bytesWritten,\n bytesRead: socket.bytesRead\n }\n}\n\nasync function * convertIterableToBuffer (iterable) {\n for await (const chunk of iterable) {\n yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n }\n}\n\nlet ReadableStream\nfunction ReadableStreamFrom (iterable) {\n if (!ReadableStream) {\n ReadableStream = require('stream/web').ReadableStream\n }\n\n if (ReadableStream.from) {\n return ReadableStream.from(convertIterableToBuffer(iterable))\n }\n\n let iterator\n return new ReadableStream(\n {\n async start () {\n iterator = iterable[Symbol.asyncIterator]()\n },\n async pull (controller) {\n const { done, value } = await iterator.next()\n if (done) {\n queueMicrotask(() => {\n controller.close()\n })\n } else {\n const buf = Buffer.isBuffer(value) ? value : Buffer.from(value)\n controller.enqueue(new Uint8Array(buf))\n }\n return controller.desiredSize > 0\n },\n async cancel (reason) {\n await iterator.return()\n }\n },\n 0\n )\n}\n\n// The chunk should be a FormData instance and contains\n// all the required methods.\nfunction isFormDataLike (object) {\n return (\n object &&\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.has === 'function' &&\n typeof object.set === 'function' &&\n object[Symbol.toStringTag] === 'FormData'\n )\n}\n\nfunction throwIfAborted (signal) {\n if (!signal) { return }\n if (typeof signal.throwIfAborted === 'function') {\n signal.throwIfAborted()\n } else {\n if (signal.aborted) {\n // DOMException not available < v17.0.0\n const err = new Error('The operation was aborted')\n err.name = 'AbortError'\n throw err\n }\n }\n}\n\nlet events\nfunction addAbortListener (signal, listener) {\n if (typeof Symbol.dispose === 'symbol') {\n if (!events) {\n events = require('events')\n }\n if (typeof events.addAbortListener === 'function' && 'aborted' in signal) {\n return events.addAbortListener(signal, listener)\n }\n }\n if ('addEventListener' in signal) {\n signal.addEventListener('abort', listener, { once: true })\n return () => signal.removeEventListener('abort', listener)\n }\n signal.addListener('abort', listener)\n return () => signal.removeListener('abort', listener)\n}\n\nconst hasToWellFormed = !!String.prototype.toWellFormed\n\n/**\n * @param {string} val\n */\nfunction toUSVString (val) {\n if (hasToWellFormed) {\n return `${val}`.toWellFormed()\n } else if (nodeUtil.toUSVString) {\n return nodeUtil.toUSVString(val)\n }\n\n return `${val}`\n}\n\nconst kEnumerableProperty = Object.create(null)\nkEnumerableProperty.enumerable = true\n\nmodule.exports = {\n kEnumerableProperty,\n nop,\n isDisturbed,\n isErrored,\n isReadable,\n toUSVString,\n isReadableAborted,\n isBlobLike,\n parseOrigin,\n parseURL,\n getServerName,\n isStream,\n isIterable,\n isAsyncIterable,\n isDestroyed,\n parseRawHeaders,\n parseHeaders,\n parseKeepAliveTimeout,\n destroy,\n bodyLength,\n deepClone,\n ReadableStreamFrom,\n isBuffer,\n validateHandler,\n getSocketInfo,\n isFormDataLike,\n buildURL,\n throwIfAborted,\n addAbortListener,\n nodeMajor,\n nodeMinor,\n nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13)\n}\n","'use strict'\n\nconst Dispatcher = require('./dispatcher')\nconst {\n ClientDestroyedError,\n ClientClosedError,\n InvalidArgumentError\n} = require('./core/errors')\nconst { kDestroy, kClose, kDispatch, kInterceptors } = require('./core/symbols')\n\nconst kDestroyed = Symbol('destroyed')\nconst kClosed = Symbol('closed')\nconst kOnDestroyed = Symbol('onDestroyed')\nconst kOnClosed = Symbol('onClosed')\nconst kInterceptedDispatch = Symbol('Intercepted Dispatch')\n\nclass DispatcherBase extends Dispatcher {\n constructor () {\n super()\n\n this[kDestroyed] = false\n this[kOnDestroyed] = null\n this[kClosed] = false\n this[kOnClosed] = []\n }\n\n get destroyed () {\n return this[kDestroyed]\n }\n\n get closed () {\n return this[kClosed]\n }\n\n get interceptors () {\n return this[kInterceptors]\n }\n\n set interceptors (newInterceptors) {\n if (newInterceptors) {\n for (let i = newInterceptors.length - 1; i >= 0; i--) {\n const interceptor = this[kInterceptors][i]\n if (typeof interceptor !== 'function') {\n throw new InvalidArgumentError('interceptor must be an function')\n }\n }\n }\n\n this[kInterceptors] = newInterceptors\n }\n\n close (callback) {\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n this.close((err, data) => {\n return err ? reject(err) : resolve(data)\n })\n })\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (this[kDestroyed]) {\n queueMicrotask(() => callback(new ClientDestroyedError(), null))\n return\n }\n\n if (this[kClosed]) {\n if (this[kOnClosed]) {\n this[kOnClosed].push(callback)\n } else {\n queueMicrotask(() => callback(null, null))\n }\n return\n }\n\n this[kClosed] = true\n this[kOnClosed].push(callback)\n\n const onClosed = () => {\n const callbacks = this[kOnClosed]\n this[kOnClosed] = null\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i](null, null)\n }\n }\n\n // Should not error.\n this[kClose]()\n .then(() => this.destroy())\n .then(() => {\n queueMicrotask(onClosed)\n })\n }\n\n destroy (err, callback) {\n if (typeof err === 'function') {\n callback = err\n err = null\n }\n\n if (callback === undefined) {\n return new Promise((resolve, reject) => {\n this.destroy(err, (err, data) => {\n return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data)\n })\n })\n }\n\n if (typeof callback !== 'function') {\n throw new InvalidArgumentError('invalid callback')\n }\n\n if (this[kDestroyed]) {\n if (this[kOnDestroyed]) {\n this[kOnDestroyed].push(callback)\n } else {\n queueMicrotask(() => callback(null, null))\n }\n return\n }\n\n if (!err) {\n err = new ClientDestroyedError()\n }\n\n this[kDestroyed] = true\n this[kOnDestroyed] = this[kOnDestroyed] || []\n this[kOnDestroyed].push(callback)\n\n const onDestroyed = () => {\n const callbacks = this[kOnDestroyed]\n this[kOnDestroyed] = null\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i](null, null)\n }\n }\n\n // Should not error.\n this[kDestroy](err).then(() => {\n queueMicrotask(onDestroyed)\n })\n }\n\n [kInterceptedDispatch] (opts, handler) {\n if (!this[kInterceptors] || this[kInterceptors].length === 0) {\n this[kInterceptedDispatch] = this[kDispatch]\n return this[kDispatch](opts, handler)\n }\n\n let dispatch = this[kDispatch].bind(this)\n for (let i = this[kInterceptors].length - 1; i >= 0; i--) {\n dispatch = this[kInterceptors][i](dispatch)\n }\n this[kInterceptedDispatch] = dispatch\n return dispatch(opts, handler)\n }\n\n dispatch (opts, handler) {\n if (!handler || typeof handler !== 'object') {\n throw new InvalidArgumentError('handler must be an object')\n }\n\n try {\n if (!opts || typeof opts !== 'object') {\n throw new InvalidArgumentError('opts must be an object.')\n }\n\n if (this[kDestroyed] || this[kOnDestroyed]) {\n throw new ClientDestroyedError()\n }\n\n if (this[kClosed]) {\n throw new ClientClosedError()\n }\n\n return this[kInterceptedDispatch](opts, handler)\n } catch (err) {\n if (typeof handler.onError !== 'function') {\n throw new InvalidArgumentError('invalid onError method')\n }\n\n handler.onError(err)\n\n return false\n }\n }\n}\n\nmodule.exports = DispatcherBase\n","'use strict'\n\nconst EventEmitter = require('events')\n\nclass Dispatcher extends EventEmitter {\n dispatch () {\n throw new Error('not implemented')\n }\n\n close () {\n throw new Error('not implemented')\n }\n\n destroy () {\n throw new Error('not implemented')\n }\n}\n\nmodule.exports = Dispatcher\n","'use strict'\n\nconst Busboy = require('@fastify/busboy')\nconst util = require('../core/util')\nconst {\n ReadableStreamFrom,\n isBlobLike,\n isReadableStreamLike,\n readableStreamClose,\n createDeferredPromise,\n fullyReadBody\n} = require('./util')\nconst { FormData } = require('./formdata')\nconst { kState } = require('./symbols')\nconst { webidl } = require('./webidl')\nconst { DOMException, structuredClone } = require('./constants')\nconst { Blob, File: NativeFile } = require('buffer')\nconst { kBodyUsed } = require('../core/symbols')\nconst assert = require('assert')\nconst { isErrored } = require('../core/util')\nconst { isUint8Array, isArrayBuffer } = require('util/types')\nconst { File: UndiciFile } = require('./file')\nconst { parseMIMEType, serializeAMimeType } = require('./dataURL')\n\nlet ReadableStream = globalThis.ReadableStream\n\n/** @type {globalThis['File']} */\nconst File = NativeFile ?? UndiciFile\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder()\n\n// https://fetch.spec.whatwg.org/#concept-bodyinit-extract\nfunction extractBody (object, keepalive = false) {\n if (!ReadableStream) {\n ReadableStream = require('stream/web').ReadableStream\n }\n\n // 1. Let stream be null.\n let stream = null\n\n // 2. If object is a ReadableStream object, then set stream to object.\n if (object instanceof ReadableStream) {\n stream = object\n } else if (isBlobLike(object)) {\n // 3. Otherwise, if object is a Blob object, set stream to the\n // result of running object’s get stream.\n stream = object.stream()\n } else {\n // 4. Otherwise, set stream to a new ReadableStream object, and set\n // up stream.\n stream = new ReadableStream({\n async pull (controller) {\n controller.enqueue(\n typeof source === 'string' ? textEncoder.encode(source) : source\n )\n queueMicrotask(() => readableStreamClose(controller))\n },\n start () {},\n type: undefined\n })\n }\n\n // 5. Assert: stream is a ReadableStream object.\n assert(isReadableStreamLike(stream))\n\n // 6. Let action be null.\n let action = null\n\n // 7. Let source be null.\n let source = null\n\n // 8. Let length be null.\n let length = null\n\n // 9. Let type be null.\n let type = null\n\n // 10. Switch on object:\n if (typeof object === 'string') {\n // Set source to the UTF-8 encoding of object.\n // Note: setting source to a Uint8Array here breaks some mocking assumptions.\n source = object\n\n // Set type to `text/plain;charset=UTF-8`.\n type = 'text/plain;charset=UTF-8'\n } else if (object instanceof URLSearchParams) {\n // URLSearchParams\n\n // spec says to run application/x-www-form-urlencoded on body.list\n // this is implemented in Node.js as apart of an URLSearchParams instance toString method\n // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490\n // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100\n\n // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list.\n source = object.toString()\n\n // Set type to `application/x-www-form-urlencoded;charset=UTF-8`.\n type = 'application/x-www-form-urlencoded;charset=UTF-8'\n } else if (isArrayBuffer(object)) {\n // BufferSource/ArrayBuffer\n\n // Set source to a copy of the bytes held by object.\n source = new Uint8Array(object.slice())\n } else if (ArrayBuffer.isView(object)) {\n // BufferSource/ArrayBufferView\n\n // Set source to a copy of the bytes held by object.\n source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength))\n } else if (util.isFormDataLike(object)) {\n const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '0')}`\n const prefix = `--${boundary}\\r\\nContent-Disposition: form-data`\n\n /*! formdata-polyfill. MIT License. Jimmy Wärting */\n const escape = (str) =>\n str.replace(/\\n/g, '%0A').replace(/\\r/g, '%0D').replace(/\"/g, '%22')\n const normalizeLinefeeds = (value) => value.replace(/\\r?\\n|\\r/g, '\\r\\n')\n\n // Set action to this step: run the multipart/form-data\n // encoding algorithm, with object’s entry list and UTF-8.\n // - This ensures that the body is immutable and can't be changed afterwords\n // - That the content-length is calculated in advance.\n // - And that all parts are pre-encoded and ready to be sent.\n\n const blobParts = []\n const rn = new Uint8Array([13, 10]) // '\\r\\n'\n length = 0\n let hasUnknownSizeValue = false\n\n for (const [name, value] of object) {\n if (typeof value === 'string') {\n const chunk = textEncoder.encode(prefix +\n `; name=\"${escape(normalizeLinefeeds(name))}\"` +\n `\\r\\n\\r\\n${normalizeLinefeeds(value)}\\r\\n`)\n blobParts.push(chunk)\n length += chunk.byteLength\n } else {\n const chunk = textEncoder.encode(`${prefix}; name=\"${escape(normalizeLinefeeds(name))}\"` +\n (value.name ? `; filename=\"${escape(value.name)}\"` : '') + '\\r\\n' +\n `Content-Type: ${\n value.type || 'application/octet-stream'\n }\\r\\n\\r\\n`)\n blobParts.push(chunk, value, rn)\n if (typeof value.size === 'number') {\n length += chunk.byteLength + value.size + rn.byteLength\n } else {\n hasUnknownSizeValue = true\n }\n }\n }\n\n const chunk = textEncoder.encode(`--${boundary}--`)\n blobParts.push(chunk)\n length += chunk.byteLength\n if (hasUnknownSizeValue) {\n length = null\n }\n\n // Set source to object.\n source = object\n\n action = async function * () {\n for (const part of blobParts) {\n if (part.stream) {\n yield * part.stream()\n } else {\n yield part\n }\n }\n }\n\n // Set type to `multipart/form-data; boundary=`,\n // followed by the multipart/form-data boundary string generated\n // by the multipart/form-data encoding algorithm.\n type = 'multipart/form-data; boundary=' + boundary\n } else if (isBlobLike(object)) {\n // Blob\n\n // Set source to object.\n source = object\n\n // Set length to object’s size.\n length = object.size\n\n // If object’s type attribute is not the empty byte sequence, set\n // type to its value.\n if (object.type) {\n type = object.type\n }\n } else if (typeof object[Symbol.asyncIterator] === 'function') {\n // If keepalive is true, then throw a TypeError.\n if (keepalive) {\n throw new TypeError('keepalive')\n }\n\n // If object is disturbed or locked, then throw a TypeError.\n if (util.isDisturbed(object) || object.locked) {\n throw new TypeError(\n 'Response body object should not be disturbed or locked'\n )\n }\n\n stream =\n object instanceof ReadableStream ? object : ReadableStreamFrom(object)\n }\n\n // 11. If source is a byte sequence, then set action to a\n // step that returns source and length to source’s length.\n if (typeof source === 'string' || util.isBuffer(source)) {\n length = Buffer.byteLength(source)\n }\n\n // 12. If action is non-null, then run these steps in in parallel:\n if (action != null) {\n // Run action.\n let iterator\n stream = new ReadableStream({\n async start () {\n iterator = action(object)[Symbol.asyncIterator]()\n },\n async pull (controller) {\n const { value, done } = await iterator.next()\n if (done) {\n // When running action is done, close stream.\n queueMicrotask(() => {\n controller.close()\n })\n } else {\n // Whenever one or more bytes are available and stream is not errored,\n // enqueue a Uint8Array wrapping an ArrayBuffer containing the available\n // bytes into stream.\n if (!isErrored(stream)) {\n controller.enqueue(new Uint8Array(value))\n }\n }\n return controller.desiredSize > 0\n },\n async cancel (reason) {\n await iterator.return()\n },\n type: undefined\n })\n }\n\n // 13. Let body be a body whose stream is stream, source is source,\n // and length is length.\n const body = { stream, source, length }\n\n // 14. Return (body, type).\n return [body, type]\n}\n\n// https://fetch.spec.whatwg.org/#bodyinit-safely-extract\nfunction safelyExtractBody (object, keepalive = false) {\n if (!ReadableStream) {\n // istanbul ignore next\n ReadableStream = require('stream/web').ReadableStream\n }\n\n // To safely extract a body and a `Content-Type` value from\n // a byte sequence or BodyInit object object, run these steps:\n\n // 1. If object is a ReadableStream object, then:\n if (object instanceof ReadableStream) {\n // Assert: object is neither disturbed nor locked.\n // istanbul ignore next\n assert(!util.isDisturbed(object), 'The body has already been consumed.')\n // istanbul ignore next\n assert(!object.locked, 'The stream is locked.')\n }\n\n // 2. Return the results of extracting object.\n return extractBody(object, keepalive)\n}\n\nfunction cloneBody (body) {\n // To clone a body body, run these steps:\n\n // https://fetch.spec.whatwg.org/#concept-body-clone\n\n // 1. Let « out1, out2 » be the result of teeing body’s stream.\n const [out1, out2] = body.stream.tee()\n const out2Clone = structuredClone(out2, { transfer: [out2] })\n // This, for whatever reasons, unrefs out2Clone which allows\n // the process to exit by itself.\n const [, finalClone] = out2Clone.tee()\n\n // 2. Set body’s stream to out1.\n body.stream = out1\n\n // 3. Return a body whose stream is out2 and other members are copied from body.\n return {\n stream: finalClone,\n length: body.length,\n source: body.source\n }\n}\n\nasync function * consumeBody (body) {\n if (body) {\n if (isUint8Array(body)) {\n yield body\n } else {\n const stream = body.stream\n\n if (util.isDisturbed(stream)) {\n throw new TypeError('The body has already been consumed.')\n }\n\n if (stream.locked) {\n throw new TypeError('The stream is locked.')\n }\n\n // Compat.\n stream[kBodyUsed] = true\n\n yield * stream\n }\n }\n}\n\nfunction throwIfAborted (state) {\n if (state.aborted) {\n throw new DOMException('The operation was aborted.', 'AbortError')\n }\n}\n\nfunction bodyMixinMethods (instance) {\n const methods = {\n blob () {\n // The blob() method steps are to return the result of\n // running consume body with this and the following step\n // given a byte sequence bytes: return a Blob whose\n // contents are bytes and whose type attribute is this’s\n // MIME type.\n return specConsumeBody(this, (bytes) => {\n let mimeType = bodyMimeType(this)\n\n if (mimeType === 'failure') {\n mimeType = ''\n } else if (mimeType) {\n mimeType = serializeAMimeType(mimeType)\n }\n\n // Return a Blob whose contents are bytes and type attribute\n // is mimeType.\n return new Blob([bytes], { type: mimeType })\n }, instance)\n },\n\n arrayBuffer () {\n // The arrayBuffer() method steps are to return the result\n // of running consume body with this and the following step\n // given a byte sequence bytes: return a new ArrayBuffer\n // whose contents are bytes.\n return specConsumeBody(this, (bytes) => {\n return new Uint8Array(bytes).buffer\n }, instance)\n },\n\n text () {\n // The text() method steps are to return the result of running\n // consume body with this and UTF-8 decode.\n return specConsumeBody(this, utf8DecodeBytes, instance)\n },\n\n json () {\n // The json() method steps are to return the result of running\n // consume body with this and parse JSON from bytes.\n return specConsumeBody(this, parseJSONFromBytes, instance)\n },\n\n async formData () {\n webidl.brandCheck(this, instance)\n\n throwIfAborted(this[kState])\n\n const contentType = this.headers.get('Content-Type')\n\n // If mimeType’s essence is \"multipart/form-data\", then:\n if (/multipart\\/form-data/.test(contentType)) {\n const headers = {}\n for (const [key, value] of this.headers) headers[key.toLowerCase()] = value\n\n const responseFormData = new FormData()\n\n let busboy\n\n try {\n busboy = new Busboy({\n headers,\n preservePath: true\n })\n } catch (err) {\n throw new DOMException(`${err}`, 'AbortError')\n }\n\n busboy.on('field', (name, value) => {\n responseFormData.append(name, value)\n })\n busboy.on('file', (name, value, filename, encoding, mimeType) => {\n const chunks = []\n\n if (encoding === 'base64' || encoding.toLowerCase() === 'base64') {\n let base64chunk = ''\n\n value.on('data', (chunk) => {\n base64chunk += chunk.toString().replace(/[\\r\\n]/gm, '')\n\n const end = base64chunk.length - base64chunk.length % 4\n chunks.push(Buffer.from(base64chunk.slice(0, end), 'base64'))\n\n base64chunk = base64chunk.slice(end)\n })\n value.on('end', () => {\n chunks.push(Buffer.from(base64chunk, 'base64'))\n responseFormData.append(name, new File(chunks, filename, { type: mimeType }))\n })\n } else {\n value.on('data', (chunk) => {\n chunks.push(chunk)\n })\n value.on('end', () => {\n responseFormData.append(name, new File(chunks, filename, { type: mimeType }))\n })\n }\n })\n\n const busboyResolve = new Promise((resolve, reject) => {\n busboy.on('finish', resolve)\n busboy.on('error', (err) => reject(new TypeError(err)))\n })\n\n if (this.body !== null) for await (const chunk of consumeBody(this[kState].body)) busboy.write(chunk)\n busboy.end()\n await busboyResolve\n\n return responseFormData\n } else if (/application\\/x-www-form-urlencoded/.test(contentType)) {\n // Otherwise, if mimeType’s essence is \"application/x-www-form-urlencoded\", then:\n\n // 1. Let entries be the result of parsing bytes.\n let entries\n try {\n let text = ''\n // application/x-www-form-urlencoded parser will keep the BOM.\n // https://url.spec.whatwg.org/#concept-urlencoded-parser\n // Note that streaming decoder is stateful and cannot be reused\n const streamingDecoder = new TextDecoder('utf-8', { ignoreBOM: true })\n\n for await (const chunk of consumeBody(this[kState].body)) {\n if (!isUint8Array(chunk)) {\n throw new TypeError('Expected Uint8Array chunk')\n }\n text += streamingDecoder.decode(chunk, { stream: true })\n }\n text += streamingDecoder.decode()\n entries = new URLSearchParams(text)\n } catch (err) {\n // istanbul ignore next: Unclear when new URLSearchParams can fail on a string.\n // 2. If entries is failure, then throw a TypeError.\n throw Object.assign(new TypeError(), { cause: err })\n }\n\n // 3. Return a new FormData object whose entries are entries.\n const formData = new FormData()\n for (const [name, value] of entries) {\n formData.append(name, value)\n }\n return formData\n } else {\n // Wait a tick before checking if the request has been aborted.\n // Otherwise, a TypeError can be thrown when an AbortError should.\n await Promise.resolve()\n\n throwIfAborted(this[kState])\n\n // Otherwise, throw a TypeError.\n throw webidl.errors.exception({\n header: `${instance.name}.formData`,\n message: 'Could not parse content as FormData.'\n })\n }\n }\n }\n\n return methods\n}\n\nfunction mixinBody (prototype) {\n Object.assign(prototype.prototype, bodyMixinMethods(prototype))\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-body-consume-body\n * @param {Response|Request} object\n * @param {(value: unknown) => unknown} convertBytesToJSValue\n * @param {Response|Request} instance\n */\nasync function specConsumeBody (object, convertBytesToJSValue, instance) {\n webidl.brandCheck(object, instance)\n\n throwIfAborted(object[kState])\n\n // 1. If object is unusable, then return a promise rejected\n // with a TypeError.\n if (bodyUnusable(object[kState].body)) {\n throw new TypeError('Body is unusable')\n }\n\n // 2. Let promise be a new promise.\n const promise = createDeferredPromise()\n\n // 3. Let errorSteps given error be to reject promise with error.\n const errorSteps = (error) => promise.reject(error)\n\n // 4. Let successSteps given a byte sequence data be to resolve\n // promise with the result of running convertBytesToJSValue\n // with data. If that threw an exception, then run errorSteps\n // with that exception.\n const successSteps = (data) => {\n try {\n promise.resolve(convertBytesToJSValue(data))\n } catch (e) {\n errorSteps(e)\n }\n }\n\n // 5. If object’s body is null, then run successSteps with an\n // empty byte sequence.\n if (object[kState].body == null) {\n successSteps(new Uint8Array())\n return promise.promise\n }\n\n // 6. Otherwise, fully read object’s body given successSteps,\n // errorSteps, and object’s relevant global object.\n await fullyReadBody(object[kState].body, successSteps, errorSteps)\n\n // 7. Return promise.\n return promise.promise\n}\n\n// https://fetch.spec.whatwg.org/#body-unusable\nfunction bodyUnusable (body) {\n // An object including the Body interface mixin is\n // said to be unusable if its body is non-null and\n // its body’s stream is disturbed or locked.\n return body != null && (body.stream.locked || util.isDisturbed(body.stream))\n}\n\n/**\n * @see https://encoding.spec.whatwg.org/#utf-8-decode\n * @param {Buffer} buffer\n */\nfunction utf8DecodeBytes (buffer) {\n if (buffer.length === 0) {\n return ''\n }\n\n // 1. Let buffer be the result of peeking three bytes from\n // ioQueue, converted to a byte sequence.\n\n // 2. If buffer is 0xEF 0xBB 0xBF, then read three\n // bytes from ioQueue. (Do nothing with those bytes.)\n if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {\n buffer = buffer.subarray(3)\n }\n\n // 3. Process a queue with an instance of UTF-8’s\n // decoder, ioQueue, output, and \"replacement\".\n const output = textDecoder.decode(buffer)\n\n // 4. Return output.\n return output\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value\n * @param {Uint8Array} bytes\n */\nfunction parseJSONFromBytes (bytes) {\n return JSON.parse(utf8DecodeBytes(bytes))\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-body-mime-type\n * @param {import('./response').Response|import('./request').Request} object\n */\nfunction bodyMimeType (object) {\n const { headersList } = object[kState]\n const contentType = headersList.get('content-type')\n\n if (contentType === null) {\n return 'failure'\n }\n\n return parseMIMEType(contentType)\n}\n\nmodule.exports = {\n extractBody,\n safelyExtractBody,\n cloneBody,\n mixinBody\n}\n","'use strict'\n\nconst { MessageChannel, receiveMessageOnPort } = require('worker_threads')\n\nconst corsSafeListedMethods = ['GET', 'HEAD', 'POST']\nconst corsSafeListedMethodsSet = new Set(corsSafeListedMethods)\n\nconst nullBodyStatus = [101, 204, 205, 304]\n\nconst redirectStatus = [301, 302, 303, 307, 308]\nconst redirectStatusSet = new Set(redirectStatus)\n\n// https://fetch.spec.whatwg.org/#block-bad-port\nconst badPorts = [\n '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79',\n '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137',\n '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532',\n '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723',\n '2049', '3659', '4045', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6697',\n '10080'\n]\n\nconst badPortsSet = new Set(badPorts)\n\n// https://w3c.github.io/webappsec-referrer-policy/#referrer-policies\nconst referrerPolicy = [\n '',\n 'no-referrer',\n 'no-referrer-when-downgrade',\n 'same-origin',\n 'origin',\n 'strict-origin',\n 'origin-when-cross-origin',\n 'strict-origin-when-cross-origin',\n 'unsafe-url'\n]\nconst referrerPolicySet = new Set(referrerPolicy)\n\nconst requestRedirect = ['follow', 'manual', 'error']\n\nconst safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE']\nconst safeMethodsSet = new Set(safeMethods)\n\nconst requestMode = ['navigate', 'same-origin', 'no-cors', 'cors']\n\nconst requestCredentials = ['omit', 'same-origin', 'include']\n\nconst requestCache = [\n 'default',\n 'no-store',\n 'reload',\n 'no-cache',\n 'force-cache',\n 'only-if-cached'\n]\n\n// https://fetch.spec.whatwg.org/#request-body-header-name\nconst requestBodyHeader = [\n 'content-encoding',\n 'content-language',\n 'content-location',\n 'content-type',\n // See https://github.com/nodejs/undici/issues/2021\n // 'Content-Length' is a forbidden header name, which is typically\n // removed in the Headers implementation. However, undici doesn't\n // filter out headers, so we add it here.\n 'content-length'\n]\n\n// https://fetch.spec.whatwg.org/#enumdef-requestduplex\nconst requestDuplex = [\n 'half'\n]\n\n// http://fetch.spec.whatwg.org/#forbidden-method\nconst forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK']\nconst forbiddenMethodsSet = new Set(forbiddenMethods)\n\nconst subresource = [\n 'audio',\n 'audioworklet',\n 'font',\n 'image',\n 'manifest',\n 'paintworklet',\n 'script',\n 'style',\n 'track',\n 'video',\n 'xslt',\n ''\n]\nconst subresourceSet = new Set(subresource)\n\n/** @type {globalThis['DOMException']} */\nconst DOMException = globalThis.DOMException ?? (() => {\n // DOMException was only made a global in Node v17.0.0,\n // but fetch supports >= v16.8.\n try {\n atob('~')\n } catch (err) {\n return Object.getPrototypeOf(err).constructor\n }\n})()\n\nlet channel\n\n/** @type {globalThis['structuredClone']} */\nconst structuredClone =\n globalThis.structuredClone ??\n // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js\n // structuredClone was added in v17.0.0, but fetch supports v16.8\n function structuredClone (value, options = undefined) {\n if (arguments.length === 0) {\n throw new TypeError('missing argument')\n }\n\n if (!channel) {\n channel = new MessageChannel()\n }\n channel.port1.unref()\n channel.port2.unref()\n channel.port1.postMessage(value, options?.transfer)\n return receiveMessageOnPort(channel.port2).message\n }\n\nmodule.exports = {\n DOMException,\n structuredClone,\n subresource,\n forbiddenMethods,\n requestBodyHeader,\n referrerPolicy,\n requestRedirect,\n requestMode,\n requestCredentials,\n requestCache,\n redirectStatus,\n corsSafeListedMethods,\n nullBodyStatus,\n safeMethods,\n badPorts,\n requestDuplex,\n subresourceSet,\n badPortsSet,\n redirectStatusSet,\n corsSafeListedMethodsSet,\n safeMethodsSet,\n forbiddenMethodsSet,\n referrerPolicySet\n}\n","const assert = require('assert')\nconst { atob } = require('buffer')\nconst { isomorphicDecode } = require('./util')\n\nconst encoder = new TextEncoder()\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#http-token-code-point\n */\nconst HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/\nconst HTTP_WHITESPACE_REGEX = /(\\u000A|\\u000D|\\u0009|\\u0020)/ // eslint-disable-line\n/**\n * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point\n */\nconst HTTP_QUOTED_STRING_TOKENS = /[\\u0009|\\u0020-\\u007E|\\u0080-\\u00FF]/ // eslint-disable-line\n\n// https://fetch.spec.whatwg.org/#data-url-processor\n/** @param {URL} dataURL */\nfunction dataURLProcessor (dataURL) {\n // 1. Assert: dataURL’s scheme is \"data\".\n assert(dataURL.protocol === 'data:')\n\n // 2. Let input be the result of running the URL\n // serializer on dataURL with exclude fragment\n // set to true.\n let input = URLSerializer(dataURL, true)\n\n // 3. Remove the leading \"data:\" string from input.\n input = input.slice(5)\n\n // 4. Let position point at the start of input.\n const position = { position: 0 }\n\n // 5. Let mimeType be the result of collecting a\n // sequence of code points that are not equal\n // to U+002C (,), given position.\n let mimeType = collectASequenceOfCodePointsFast(\n ',',\n input,\n position\n )\n\n // 6. Strip leading and trailing ASCII whitespace\n // from mimeType.\n // Undici implementation note: we need to store the\n // length because if the mimetype has spaces removed,\n // the wrong amount will be sliced from the input in\n // step #9\n const mimeTypeLength = mimeType.length\n mimeType = removeASCIIWhitespace(mimeType, true, true)\n\n // 7. If position is past the end of input, then\n // return failure\n if (position.position >= input.length) {\n return 'failure'\n }\n\n // 8. Advance position by 1.\n position.position++\n\n // 9. Let encodedBody be the remainder of input.\n const encodedBody = input.slice(mimeTypeLength + 1)\n\n // 10. Let body be the percent-decoding of encodedBody.\n let body = stringPercentDecode(encodedBody)\n\n // 11. If mimeType ends with U+003B (;), followed by\n // zero or more U+0020 SPACE, followed by an ASCII\n // case-insensitive match for \"base64\", then:\n if (/;(\\u0020){0,}base64$/i.test(mimeType)) {\n // 1. Let stringBody be the isomorphic decode of body.\n const stringBody = isomorphicDecode(body)\n\n // 2. Set body to the forgiving-base64 decode of\n // stringBody.\n body = forgivingBase64(stringBody)\n\n // 3. If body is failure, then return failure.\n if (body === 'failure') {\n return 'failure'\n }\n\n // 4. Remove the last 6 code points from mimeType.\n mimeType = mimeType.slice(0, -6)\n\n // 5. Remove trailing U+0020 SPACE code points from mimeType,\n // if any.\n mimeType = mimeType.replace(/(\\u0020)+$/, '')\n\n // 6. Remove the last U+003B (;) code point from mimeType.\n mimeType = mimeType.slice(0, -1)\n }\n\n // 12. If mimeType starts with U+003B (;), then prepend\n // \"text/plain\" to mimeType.\n if (mimeType.startsWith(';')) {\n mimeType = 'text/plain' + mimeType\n }\n\n // 13. Let mimeTypeRecord be the result of parsing\n // mimeType.\n let mimeTypeRecord = parseMIMEType(mimeType)\n\n // 14. If mimeTypeRecord is failure, then set\n // mimeTypeRecord to text/plain;charset=US-ASCII.\n if (mimeTypeRecord === 'failure') {\n mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII')\n }\n\n // 15. Return a new data: URL struct whose MIME\n // type is mimeTypeRecord and body is body.\n // https://fetch.spec.whatwg.org/#data-url-struct\n return { mimeType: mimeTypeRecord, body }\n}\n\n// https://url.spec.whatwg.org/#concept-url-serializer\n/**\n * @param {URL} url\n * @param {boolean} excludeFragment\n */\nfunction URLSerializer (url, excludeFragment = false) {\n const href = url.href\n\n if (!excludeFragment) {\n return href\n }\n\n const hash = href.lastIndexOf('#')\n if (hash === -1) {\n return href\n }\n return href.slice(0, hash)\n}\n\n// https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points\n/**\n * @param {(char: string) => boolean} condition\n * @param {string} input\n * @param {{ position: number }} position\n */\nfunction collectASequenceOfCodePoints (condition, input, position) {\n // 1. Let result be the empty string.\n let result = ''\n\n // 2. While position doesn’t point past the end of input and the\n // code point at position within input meets the condition condition:\n while (position.position < input.length && condition(input[position.position])) {\n // 1. Append that code point to the end of result.\n result += input[position.position]\n\n // 2. Advance position by 1.\n position.position++\n }\n\n // 3. Return result.\n return result\n}\n\n/**\n * A faster collectASequenceOfCodePoints that only works when comparing a single character.\n * @param {string} char\n * @param {string} input\n * @param {{ position: number }} position\n */\nfunction collectASequenceOfCodePointsFast (char, input, position) {\n const idx = input.indexOf(char, position.position)\n const start = position.position\n\n if (idx === -1) {\n position.position = input.length\n return input.slice(start)\n }\n\n position.position = idx\n return input.slice(start, position.position)\n}\n\n// https://url.spec.whatwg.org/#string-percent-decode\n/** @param {string} input */\nfunction stringPercentDecode (input) {\n // 1. Let bytes be the UTF-8 encoding of input.\n const bytes = encoder.encode(input)\n\n // 2. Return the percent-decoding of bytes.\n return percentDecode(bytes)\n}\n\n// https://url.spec.whatwg.org/#percent-decode\n/** @param {Uint8Array} input */\nfunction percentDecode (input) {\n // 1. Let output be an empty byte sequence.\n /** @type {number[]} */\n const output = []\n\n // 2. For each byte byte in input:\n for (let i = 0; i < input.length; i++) {\n const byte = input[i]\n\n // 1. If byte is not 0x25 (%), then append byte to output.\n if (byte !== 0x25) {\n output.push(byte)\n\n // 2. Otherwise, if byte is 0x25 (%) and the next two bytes\n // after byte in input are not in the ranges\n // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F),\n // and 0x61 (a) to 0x66 (f), all inclusive, append byte\n // to output.\n } else if (\n byte === 0x25 &&\n !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2]))\n ) {\n output.push(0x25)\n\n // 3. Otherwise:\n } else {\n // 1. Let bytePoint be the two bytes after byte in input,\n // decoded, and then interpreted as hexadecimal number.\n const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2])\n const bytePoint = Number.parseInt(nextTwoBytes, 16)\n\n // 2. Append a byte whose value is bytePoint to output.\n output.push(bytePoint)\n\n // 3. Skip the next two bytes in input.\n i += 2\n }\n }\n\n // 3. Return output.\n return Uint8Array.from(output)\n}\n\n// https://mimesniff.spec.whatwg.org/#parse-a-mime-type\n/** @param {string} input */\nfunction parseMIMEType (input) {\n // 1. Remove any leading and trailing HTTP whitespace\n // from input.\n input = removeHTTPWhitespace(input, true, true)\n\n // 2. Let position be a position variable for input,\n // initially pointing at the start of input.\n const position = { position: 0 }\n\n // 3. Let type be the result of collecting a sequence\n // of code points that are not U+002F (/) from\n // input, given position.\n const type = collectASequenceOfCodePointsFast(\n '/',\n input,\n position\n )\n\n // 4. If type is the empty string or does not solely\n // contain HTTP token code points, then return failure.\n // https://mimesniff.spec.whatwg.org/#http-token-code-point\n if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) {\n return 'failure'\n }\n\n // 5. If position is past the end of input, then return\n // failure\n if (position.position > input.length) {\n return 'failure'\n }\n\n // 6. Advance position by 1. (This skips past U+002F (/).)\n position.position++\n\n // 7. Let subtype be the result of collecting a sequence of\n // code points that are not U+003B (;) from input, given\n // position.\n let subtype = collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 8. Remove any trailing HTTP whitespace from subtype.\n subtype = removeHTTPWhitespace(subtype, false, true)\n\n // 9. If subtype is the empty string or does not solely\n // contain HTTP token code points, then return failure.\n if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) {\n return 'failure'\n }\n\n const typeLowercase = type.toLowerCase()\n const subtypeLowercase = subtype.toLowerCase()\n\n // 10. Let mimeType be a new MIME type record whose type\n // is type, in ASCII lowercase, and subtype is subtype,\n // in ASCII lowercase.\n // https://mimesniff.spec.whatwg.org/#mime-type\n const mimeType = {\n type: typeLowercase,\n subtype: subtypeLowercase,\n /** @type {Map} */\n parameters: new Map(),\n // https://mimesniff.spec.whatwg.org/#mime-type-essence\n essence: `${typeLowercase}/${subtypeLowercase}`\n }\n\n // 11. While position is not past the end of input:\n while (position.position < input.length) {\n // 1. Advance position by 1. (This skips past U+003B (;).)\n position.position++\n\n // 2. Collect a sequence of code points that are HTTP\n // whitespace from input given position.\n collectASequenceOfCodePoints(\n // https://fetch.spec.whatwg.org/#http-whitespace\n char => HTTP_WHITESPACE_REGEX.test(char),\n input,\n position\n )\n\n // 3. Let parameterName be the result of collecting a\n // sequence of code points that are not U+003B (;)\n // or U+003D (=) from input, given position.\n let parameterName = collectASequenceOfCodePoints(\n (char) => char !== ';' && char !== '=',\n input,\n position\n )\n\n // 4. Set parameterName to parameterName, in ASCII\n // lowercase.\n parameterName = parameterName.toLowerCase()\n\n // 5. If position is not past the end of input, then:\n if (position.position < input.length) {\n // 1. If the code point at position within input is\n // U+003B (;), then continue.\n if (input[position.position] === ';') {\n continue\n }\n\n // 2. Advance position by 1. (This skips past U+003D (=).)\n position.position++\n }\n\n // 6. If position is past the end of input, then break.\n if (position.position > input.length) {\n break\n }\n\n // 7. Let parameterValue be null.\n let parameterValue = null\n\n // 8. If the code point at position within input is\n // U+0022 (\"), then:\n if (input[position.position] === '\"') {\n // 1. Set parameterValue to the result of collecting\n // an HTTP quoted string from input, given position\n // and the extract-value flag.\n parameterValue = collectAnHTTPQuotedString(input, position, true)\n\n // 2. Collect a sequence of code points that are not\n // U+003B (;) from input, given position.\n collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 9. Otherwise:\n } else {\n // 1. Set parameterValue to the result of collecting\n // a sequence of code points that are not U+003B (;)\n // from input, given position.\n parameterValue = collectASequenceOfCodePointsFast(\n ';',\n input,\n position\n )\n\n // 2. Remove any trailing HTTP whitespace from parameterValue.\n parameterValue = removeHTTPWhitespace(parameterValue, false, true)\n\n // 3. If parameterValue is the empty string, then continue.\n if (parameterValue.length === 0) {\n continue\n }\n }\n\n // 10. If all of the following are true\n // - parameterName is not the empty string\n // - parameterName solely contains HTTP token code points\n // - parameterValue solely contains HTTP quoted-string token code points\n // - mimeType’s parameters[parameterName] does not exist\n // then set mimeType’s parameters[parameterName] to parameterValue.\n if (\n parameterName.length !== 0 &&\n HTTP_TOKEN_CODEPOINTS.test(parameterName) &&\n (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) &&\n !mimeType.parameters.has(parameterName)\n ) {\n mimeType.parameters.set(parameterName, parameterValue)\n }\n }\n\n // 12. Return mimeType.\n return mimeType\n}\n\n// https://infra.spec.whatwg.org/#forgiving-base64-decode\n/** @param {string} data */\nfunction forgivingBase64 (data) {\n // 1. Remove all ASCII whitespace from data.\n data = data.replace(/[\\u0009\\u000A\\u000C\\u000D\\u0020]/g, '') // eslint-disable-line\n\n // 2. If data’s code point length divides by 4 leaving\n // no remainder, then:\n if (data.length % 4 === 0) {\n // 1. If data ends with one or two U+003D (=) code points,\n // then remove them from data.\n data = data.replace(/=?=$/, '')\n }\n\n // 3. If data’s code point length divides by 4 leaving\n // a remainder of 1, then return failure.\n if (data.length % 4 === 1) {\n return 'failure'\n }\n\n // 4. If data contains a code point that is not one of\n // U+002B (+)\n // U+002F (/)\n // ASCII alphanumeric\n // then return failure.\n if (/[^+/0-9A-Za-z]/.test(data)) {\n return 'failure'\n }\n\n const binary = atob(data)\n const bytes = new Uint8Array(binary.length)\n\n for (let byte = 0; byte < binary.length; byte++) {\n bytes[byte] = binary.charCodeAt(byte)\n }\n\n return bytes\n}\n\n// https://fetch.spec.whatwg.org/#collect-an-http-quoted-string\n// tests: https://fetch.spec.whatwg.org/#example-http-quoted-string\n/**\n * @param {string} input\n * @param {{ position: number }} position\n * @param {boolean?} extractValue\n */\nfunction collectAnHTTPQuotedString (input, position, extractValue) {\n // 1. Let positionStart be position.\n const positionStart = position.position\n\n // 2. Let value be the empty string.\n let value = ''\n\n // 3. Assert: the code point at position within input\n // is U+0022 (\").\n assert(input[position.position] === '\"')\n\n // 4. Advance position by 1.\n position.position++\n\n // 5. While true:\n while (true) {\n // 1. Append the result of collecting a sequence of code points\n // that are not U+0022 (\") or U+005C (\\) from input, given\n // position, to value.\n value += collectASequenceOfCodePoints(\n (char) => char !== '\"' && char !== '\\\\',\n input,\n position\n )\n\n // 2. If position is past the end of input, then break.\n if (position.position >= input.length) {\n break\n }\n\n // 3. Let quoteOrBackslash be the code point at position within\n // input.\n const quoteOrBackslash = input[position.position]\n\n // 4. Advance position by 1.\n position.position++\n\n // 5. If quoteOrBackslash is U+005C (\\), then:\n if (quoteOrBackslash === '\\\\') {\n // 1. If position is past the end of input, then append\n // U+005C (\\) to value and break.\n if (position.position >= input.length) {\n value += '\\\\'\n break\n }\n\n // 2. Append the code point at position within input to value.\n value += input[position.position]\n\n // 3. Advance position by 1.\n position.position++\n\n // 6. Otherwise:\n } else {\n // 1. Assert: quoteOrBackslash is U+0022 (\").\n assert(quoteOrBackslash === '\"')\n\n // 2. Break.\n break\n }\n }\n\n // 6. If the extract-value flag is set, then return value.\n if (extractValue) {\n return value\n }\n\n // 7. Return the code points from positionStart to position,\n // inclusive, within input.\n return input.slice(positionStart, position.position)\n}\n\n/**\n * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type\n */\nfunction serializeAMimeType (mimeType) {\n assert(mimeType !== 'failure')\n const { parameters, essence } = mimeType\n\n // 1. Let serialization be the concatenation of mimeType’s\n // type, U+002F (/), and mimeType’s subtype.\n let serialization = essence\n\n // 2. For each name → value of mimeType’s parameters:\n for (let [name, value] of parameters.entries()) {\n // 1. Append U+003B (;) to serialization.\n serialization += ';'\n\n // 2. Append name to serialization.\n serialization += name\n\n // 3. Append U+003D (=) to serialization.\n serialization += '='\n\n // 4. If value does not solely contain HTTP token code\n // points or value is the empty string, then:\n if (!HTTP_TOKEN_CODEPOINTS.test(value)) {\n // 1. Precede each occurence of U+0022 (\") or\n // U+005C (\\) in value with U+005C (\\).\n value = value.replace(/(\\\\|\")/g, '\\\\$1')\n\n // 2. Prepend U+0022 (\") to value.\n value = '\"' + value\n\n // 3. Append U+0022 (\") to value.\n value += '\"'\n }\n\n // 5. Append value to serialization.\n serialization += value\n }\n\n // 3. Return serialization.\n return serialization\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-whitespace\n * @param {string} char\n */\nfunction isHTTPWhiteSpace (char) {\n return char === '\\r' || char === '\\n' || char === '\\t' || char === ' '\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-whitespace\n * @param {string} str\n */\nfunction removeHTTPWhitespace (str, leading = true, trailing = true) {\n let lead = 0\n let trail = str.length - 1\n\n if (leading) {\n for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++);\n }\n\n if (trailing) {\n for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--);\n }\n\n return str.slice(lead, trail + 1)\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#ascii-whitespace\n * @param {string} char\n */\nfunction isASCIIWhitespace (char) {\n return char === '\\r' || char === '\\n' || char === '\\t' || char === '\\f' || char === ' '\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace\n */\nfunction removeASCIIWhitespace (str, leading = true, trailing = true) {\n let lead = 0\n let trail = str.length - 1\n\n if (leading) {\n for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++);\n }\n\n if (trailing) {\n for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--);\n }\n\n return str.slice(lead, trail + 1)\n}\n\nmodule.exports = {\n dataURLProcessor,\n URLSerializer,\n collectASequenceOfCodePoints,\n collectASequenceOfCodePointsFast,\n stringPercentDecode,\n parseMIMEType,\n collectAnHTTPQuotedString,\n serializeAMimeType\n}\n","'use strict'\n\nconst { Blob, File: NativeFile } = require('buffer')\nconst { types } = require('util')\nconst { kState } = require('./symbols')\nconst { isBlobLike } = require('./util')\nconst { webidl } = require('./webidl')\nconst { parseMIMEType, serializeAMimeType } = require('./dataURL')\nconst { kEnumerableProperty } = require('../core/util')\nconst encoder = new TextEncoder()\n\nclass File extends Blob {\n constructor (fileBits, fileName, options = {}) {\n // The File constructor is invoked with two or three parameters, depending\n // on whether the optional dictionary parameter is used. When the File()\n // constructor is invoked, user agents must run the following steps:\n webidl.argumentLengthCheck(arguments, 2, { header: 'File constructor' })\n\n fileBits = webidl.converters['sequence'](fileBits)\n fileName = webidl.converters.USVString(fileName)\n options = webidl.converters.FilePropertyBag(options)\n\n // 1. Let bytes be the result of processing blob parts given fileBits and\n // options.\n // Note: Blob handles this for us\n\n // 2. Let n be the fileName argument to the constructor.\n const n = fileName\n\n // 3. Process FilePropertyBag dictionary argument by running the following\n // substeps:\n\n // 1. If the type member is provided and is not the empty string, let t\n // be set to the type dictionary member. If t contains any characters\n // outside the range U+0020 to U+007E, then set t to the empty string\n // and return from these substeps.\n // 2. Convert every character in t to ASCII lowercase.\n let t = options.type\n let d\n\n // eslint-disable-next-line no-labels\n substep: {\n if (t) {\n t = parseMIMEType(t)\n\n if (t === 'failure') {\n t = ''\n // eslint-disable-next-line no-labels\n break substep\n }\n\n t = serializeAMimeType(t).toLowerCase()\n }\n\n // 3. If the lastModified member is provided, let d be set to the\n // lastModified dictionary member. If it is not provided, set d to the\n // current date and time represented as the number of milliseconds since\n // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]).\n d = options.lastModified\n }\n\n // 4. Return a new File object F such that:\n // F refers to the bytes byte sequence.\n // F.size is set to the number of total bytes in bytes.\n // F.name is set to n.\n // F.type is set to t.\n // F.lastModified is set to d.\n\n super(processBlobParts(fileBits, options), { type: t })\n this[kState] = {\n name: n,\n lastModified: d,\n type: t\n }\n }\n\n get name () {\n webidl.brandCheck(this, File)\n\n return this[kState].name\n }\n\n get lastModified () {\n webidl.brandCheck(this, File)\n\n return this[kState].lastModified\n }\n\n get type () {\n webidl.brandCheck(this, File)\n\n return this[kState].type\n }\n}\n\nclass FileLike {\n constructor (blobLike, fileName, options = {}) {\n // TODO: argument idl type check\n\n // The File constructor is invoked with two or three parameters, depending\n // on whether the optional dictionary parameter is used. When the File()\n // constructor is invoked, user agents must run the following steps:\n\n // 1. Let bytes be the result of processing blob parts given fileBits and\n // options.\n\n // 2. Let n be the fileName argument to the constructor.\n const n = fileName\n\n // 3. Process FilePropertyBag dictionary argument by running the following\n // substeps:\n\n // 1. If the type member is provided and is not the empty string, let t\n // be set to the type dictionary member. If t contains any characters\n // outside the range U+0020 to U+007E, then set t to the empty string\n // and return from these substeps.\n // TODO\n const t = options.type\n\n // 2. Convert every character in t to ASCII lowercase.\n // TODO\n\n // 3. If the lastModified member is provided, let d be set to the\n // lastModified dictionary member. If it is not provided, set d to the\n // current date and time represented as the number of milliseconds since\n // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]).\n const d = options.lastModified ?? Date.now()\n\n // 4. Return a new File object F such that:\n // F refers to the bytes byte sequence.\n // F.size is set to the number of total bytes in bytes.\n // F.name is set to n.\n // F.type is set to t.\n // F.lastModified is set to d.\n\n this[kState] = {\n blobLike,\n name: n,\n type: t,\n lastModified: d\n }\n }\n\n stream (...args) {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.stream(...args)\n }\n\n arrayBuffer (...args) {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.arrayBuffer(...args)\n }\n\n slice (...args) {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.slice(...args)\n }\n\n text (...args) {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.text(...args)\n }\n\n get size () {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.size\n }\n\n get type () {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].blobLike.type\n }\n\n get name () {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].name\n }\n\n get lastModified () {\n webidl.brandCheck(this, FileLike)\n\n return this[kState].lastModified\n }\n\n get [Symbol.toStringTag] () {\n return 'File'\n }\n}\n\nObject.defineProperties(File.prototype, {\n [Symbol.toStringTag]: {\n value: 'File',\n configurable: true\n },\n name: kEnumerableProperty,\n lastModified: kEnumerableProperty\n})\n\nwebidl.converters.Blob = webidl.interfaceConverter(Blob)\n\nwebidl.converters.BlobPart = function (V, opts) {\n if (webidl.util.Type(V) === 'Object') {\n if (isBlobLike(V)) {\n return webidl.converters.Blob(V, { strict: false })\n }\n\n if (\n ArrayBuffer.isView(V) ||\n types.isAnyArrayBuffer(V)\n ) {\n return webidl.converters.BufferSource(V, opts)\n }\n }\n\n return webidl.converters.USVString(V, opts)\n}\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.BlobPart\n)\n\n// https://www.w3.org/TR/FileAPI/#dfn-FilePropertyBag\nwebidl.converters.FilePropertyBag = webidl.dictionaryConverter([\n {\n key: 'lastModified',\n converter: webidl.converters['long long'],\n get defaultValue () {\n return Date.now()\n }\n },\n {\n key: 'type',\n converter: webidl.converters.DOMString,\n defaultValue: ''\n },\n {\n key: 'endings',\n converter: (value) => {\n value = webidl.converters.DOMString(value)\n value = value.toLowerCase()\n\n if (value !== 'native') {\n value = 'transparent'\n }\n\n return value\n },\n defaultValue: 'transparent'\n }\n])\n\n/**\n * @see https://www.w3.org/TR/FileAPI/#process-blob-parts\n * @param {(NodeJS.TypedArray|Blob|string)[]} parts\n * @param {{ type: string, endings: string }} options\n */\nfunction processBlobParts (parts, options) {\n // 1. Let bytes be an empty sequence of bytes.\n /** @type {NodeJS.TypedArray[]} */\n const bytes = []\n\n // 2. For each element in parts:\n for (const element of parts) {\n // 1. If element is a USVString, run the following substeps:\n if (typeof element === 'string') {\n // 1. Let s be element.\n let s = element\n\n // 2. If the endings member of options is \"native\", set s\n // to the result of converting line endings to native\n // of element.\n if (options.endings === 'native') {\n s = convertLineEndingsNative(s)\n }\n\n // 3. Append the result of UTF-8 encoding s to bytes.\n bytes.push(encoder.encode(s))\n } else if (\n types.isAnyArrayBuffer(element) ||\n types.isTypedArray(element)\n ) {\n // 2. If element is a BufferSource, get a copy of the\n // bytes held by the buffer source, and append those\n // bytes to bytes.\n if (!element.buffer) { // ArrayBuffer\n bytes.push(new Uint8Array(element))\n } else {\n bytes.push(\n new Uint8Array(element.buffer, element.byteOffset, element.byteLength)\n )\n }\n } else if (isBlobLike(element)) {\n // 3. If element is a Blob, append the bytes it represents\n // to bytes.\n bytes.push(element)\n }\n }\n\n // 3. Return bytes.\n return bytes\n}\n\n/**\n * @see https://www.w3.org/TR/FileAPI/#convert-line-endings-to-native\n * @param {string} s\n */\nfunction convertLineEndingsNative (s) {\n // 1. Let native line ending be be the code point U+000A LF.\n let nativeLineEnding = '\\n'\n\n // 2. If the underlying platform’s conventions are to\n // represent newlines as a carriage return and line feed\n // sequence, set native line ending to the code point\n // U+000D CR followed by the code point U+000A LF.\n if (process.platform === 'win32') {\n nativeLineEnding = '\\r\\n'\n }\n\n return s.replace(/\\r?\\n/g, nativeLineEnding)\n}\n\n// If this function is moved to ./util.js, some tools (such as\n// rollup) will warn about circular dependencies. See:\n// https://github.com/nodejs/undici/issues/1629\nfunction isFileLike (object) {\n return (\n (NativeFile && object instanceof NativeFile) ||\n object instanceof File || (\n object &&\n (typeof object.stream === 'function' ||\n typeof object.arrayBuffer === 'function') &&\n object[Symbol.toStringTag] === 'File'\n )\n )\n}\n\nmodule.exports = { File, FileLike, isFileLike }\n","'use strict'\n\nconst { isBlobLike, toUSVString, makeIterator } = require('./util')\nconst { kState } = require('./symbols')\nconst { File: UndiciFile, FileLike, isFileLike } = require('./file')\nconst { webidl } = require('./webidl')\nconst { Blob, File: NativeFile } = require('buffer')\n\n/** @type {globalThis['File']} */\nconst File = NativeFile ?? UndiciFile\n\n// https://xhr.spec.whatwg.org/#formdata\nclass FormData {\n constructor (form) {\n if (form !== undefined) {\n throw webidl.errors.conversionFailed({\n prefix: 'FormData constructor',\n argument: 'Argument 1',\n types: ['undefined']\n })\n }\n\n this[kState] = []\n }\n\n append (name, value, filename = undefined) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.append' })\n\n if (arguments.length === 3 && !isBlobLike(value)) {\n throw new TypeError(\n \"Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'\"\n )\n }\n\n // 1. Let value be value if given; otherwise blobValue.\n\n name = webidl.converters.USVString(name)\n value = isBlobLike(value)\n ? webidl.converters.Blob(value, { strict: false })\n : webidl.converters.USVString(value)\n filename = arguments.length === 3\n ? webidl.converters.USVString(filename)\n : undefined\n\n // 2. Let entry be the result of creating an entry with\n // name, value, and filename if given.\n const entry = makeEntry(name, value, filename)\n\n // 3. Append entry to this’s entry list.\n this[kState].push(entry)\n }\n\n delete (name) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.delete' })\n\n name = webidl.converters.USVString(name)\n\n // The delete(name) method steps are to remove all entries whose name\n // is name from this’s entry list.\n this[kState] = this[kState].filter(entry => entry.name !== name)\n }\n\n get (name) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.get' })\n\n name = webidl.converters.USVString(name)\n\n // 1. If there is no entry whose name is name in this’s entry list,\n // then return null.\n const idx = this[kState].findIndex((entry) => entry.name === name)\n if (idx === -1) {\n return null\n }\n\n // 2. Return the value of the first entry whose name is name from\n // this’s entry list.\n return this[kState][idx].value\n }\n\n getAll (name) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.getAll' })\n\n name = webidl.converters.USVString(name)\n\n // 1. If there is no entry whose name is name in this’s entry list,\n // then return the empty list.\n // 2. Return the values of all entries whose name is name, in order,\n // from this’s entry list.\n return this[kState]\n .filter((entry) => entry.name === name)\n .map((entry) => entry.value)\n }\n\n has (name) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.has' })\n\n name = webidl.converters.USVString(name)\n\n // The has(name) method steps are to return true if there is an entry\n // whose name is name in this’s entry list; otherwise false.\n return this[kState].findIndex((entry) => entry.name === name) !== -1\n }\n\n set (name, value, filename = undefined) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.set' })\n\n if (arguments.length === 3 && !isBlobLike(value)) {\n throw new TypeError(\n \"Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'\"\n )\n }\n\n // The set(name, value) and set(name, blobValue, filename) method steps\n // are:\n\n // 1. Let value be value if given; otherwise blobValue.\n\n name = webidl.converters.USVString(name)\n value = isBlobLike(value)\n ? webidl.converters.Blob(value, { strict: false })\n : webidl.converters.USVString(value)\n filename = arguments.length === 3\n ? toUSVString(filename)\n : undefined\n\n // 2. Let entry be the result of creating an entry with name, value, and\n // filename if given.\n const entry = makeEntry(name, value, filename)\n\n // 3. If there are entries in this’s entry list whose name is name, then\n // replace the first such entry with entry and remove the others.\n const idx = this[kState].findIndex((entry) => entry.name === name)\n if (idx !== -1) {\n this[kState] = [\n ...this[kState].slice(0, idx),\n entry,\n ...this[kState].slice(idx + 1).filter((entry) => entry.name !== name)\n ]\n } else {\n // 4. Otherwise, append entry to this’s entry list.\n this[kState].push(entry)\n }\n }\n\n entries () {\n webidl.brandCheck(this, FormData)\n\n return makeIterator(\n () => this[kState].map(pair => [pair.name, pair.value]),\n 'FormData',\n 'key+value'\n )\n }\n\n keys () {\n webidl.brandCheck(this, FormData)\n\n return makeIterator(\n () => this[kState].map(pair => [pair.name, pair.value]),\n 'FormData',\n 'key'\n )\n }\n\n values () {\n webidl.brandCheck(this, FormData)\n\n return makeIterator(\n () => this[kState].map(pair => [pair.name, pair.value]),\n 'FormData',\n 'value'\n )\n }\n\n /**\n * @param {(value: string, key: string, self: FormData) => void} callbackFn\n * @param {unknown} thisArg\n */\n forEach (callbackFn, thisArg = globalThis) {\n webidl.brandCheck(this, FormData)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.forEach' })\n\n if (typeof callbackFn !== 'function') {\n throw new TypeError(\n \"Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'.\"\n )\n }\n\n for (const [key, value] of this) {\n callbackFn.apply(thisArg, [value, key, this])\n }\n }\n}\n\nFormData.prototype[Symbol.iterator] = FormData.prototype.entries\n\nObject.defineProperties(FormData.prototype, {\n [Symbol.toStringTag]: {\n value: 'FormData',\n configurable: true\n }\n})\n\n/**\n * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry\n * @param {string} name\n * @param {string|Blob} value\n * @param {?string} filename\n * @returns\n */\nfunction makeEntry (name, value, filename) {\n // 1. Set name to the result of converting name into a scalar value string.\n // \"To convert a string into a scalar value string, replace any surrogates\n // with U+FFFD.\"\n // see: https://nodejs.org/dist/latest-v18.x/docs/api/buffer.html#buftostringencoding-start-end\n name = Buffer.from(name).toString('utf8')\n\n // 2. If value is a string, then set value to the result of converting\n // value into a scalar value string.\n if (typeof value === 'string') {\n value = Buffer.from(value).toString('utf8')\n } else {\n // 3. Otherwise:\n\n // 1. If value is not a File object, then set value to a new File object,\n // representing the same bytes, whose name attribute value is \"blob\"\n if (!isFileLike(value)) {\n value = value instanceof Blob\n ? new File([value], 'blob', { type: value.type })\n : new FileLike(value, 'blob', { type: value.type })\n }\n\n // 2. If filename is given, then set value to a new File object,\n // representing the same bytes, whose name attribute is filename.\n if (filename !== undefined) {\n /** @type {FilePropertyBag} */\n const options = {\n type: value.type,\n lastModified: value.lastModified\n }\n\n value = (NativeFile && value instanceof NativeFile) || value instanceof UndiciFile\n ? new File([value], filename, options)\n : new FileLike(value, filename, options)\n }\n }\n\n // 4. Return an entry whose name is name and whose value is value.\n return { name, value }\n}\n\nmodule.exports = { FormData }\n","'use strict'\n\n// In case of breaking changes, increase the version\n// number to avoid conflicts.\nconst globalOrigin = Symbol.for('undici.globalOrigin.1')\n\nfunction getGlobalOrigin () {\n return globalThis[globalOrigin]\n}\n\nfunction setGlobalOrigin (newOrigin) {\n if (newOrigin === undefined) {\n Object.defineProperty(globalThis, globalOrigin, {\n value: undefined,\n writable: true,\n enumerable: false,\n configurable: false\n })\n\n return\n }\n\n const parsedURL = new URL(newOrigin)\n\n if (parsedURL.protocol !== 'http:' && parsedURL.protocol !== 'https:') {\n throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`)\n }\n\n Object.defineProperty(globalThis, globalOrigin, {\n value: parsedURL,\n writable: true,\n enumerable: false,\n configurable: false\n })\n}\n\nmodule.exports = {\n getGlobalOrigin,\n setGlobalOrigin\n}\n","// https://github.com/Ethan-Arrowood/undici-fetch\n\n'use strict'\n\nconst { kHeadersList } = require('../core/symbols')\nconst { kGuard } = require('./symbols')\nconst { kEnumerableProperty } = require('../core/util')\nconst {\n makeIterator,\n isValidHeaderName,\n isValidHeaderValue\n} = require('./util')\nconst { webidl } = require('./webidl')\nconst assert = require('assert')\n\nconst kHeadersMap = Symbol('headers map')\nconst kHeadersSortedMap = Symbol('headers map sorted')\n\n/**\n * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize\n * @param {string} potentialValue\n */\nfunction headerValueNormalize (potentialValue) {\n // To normalize a byte sequence potentialValue, remove\n // any leading and trailing HTTP whitespace bytes from\n // potentialValue.\n\n // Trimming the end with `.replace()` and a RegExp is typically subject to\n // ReDoS. This is safer and faster.\n let i = potentialValue.length\n while (/[\\r\\n\\t ]/.test(potentialValue.charAt(--i)));\n return potentialValue.slice(0, i + 1).replace(/^[\\r\\n\\t ]+/, '')\n}\n\nfunction fill (headers, object) {\n // To fill a Headers object headers with a given object object, run these steps:\n\n // 1. If object is a sequence, then for each header in object:\n // Note: webidl conversion to array has already been done.\n if (Array.isArray(object)) {\n for (const header of object) {\n // 1. If header does not contain exactly two items, then throw a TypeError.\n if (header.length !== 2) {\n throw webidl.errors.exception({\n header: 'Headers constructor',\n message: `expected name/value pair to be length 2, found ${header.length}.`\n })\n }\n\n // 2. Append (header’s first item, header’s second item) to headers.\n headers.append(header[0], header[1])\n }\n } else if (typeof object === 'object' && object !== null) {\n // Note: null should throw\n\n // 2. Otherwise, object is a record, then for each key → value in object,\n // append (key, value) to headers\n for (const [key, value] of Object.entries(object)) {\n headers.append(key, value)\n }\n } else {\n throw webidl.errors.conversionFailed({\n prefix: 'Headers constructor',\n argument: 'Argument 1',\n types: ['sequence>', 'record']\n })\n }\n}\n\nclass HeadersList {\n /** @type {[string, string][]|null} */\n cookies = null\n\n constructor (init) {\n if (init instanceof HeadersList) {\n this[kHeadersMap] = new Map(init[kHeadersMap])\n this[kHeadersSortedMap] = init[kHeadersSortedMap]\n this.cookies = init.cookies\n } else {\n this[kHeadersMap] = new Map(init)\n this[kHeadersSortedMap] = null\n }\n }\n\n // https://fetch.spec.whatwg.org/#header-list-contains\n contains (name) {\n // A header list list contains a header name name if list\n // contains a header whose name is a byte-case-insensitive\n // match for name.\n name = name.toLowerCase()\n\n return this[kHeadersMap].has(name)\n }\n\n clear () {\n this[kHeadersMap].clear()\n this[kHeadersSortedMap] = null\n this.cookies = null\n }\n\n // https://fetch.spec.whatwg.org/#concept-header-list-append\n append (name, value) {\n this[kHeadersSortedMap] = null\n\n // 1. If list contains name, then set name to the first such\n // header’s name.\n const lowercaseName = name.toLowerCase()\n const exists = this[kHeadersMap].get(lowercaseName)\n\n // 2. Append (name, value) to list.\n if (exists) {\n const delimiter = lowercaseName === 'cookie' ? '; ' : ', '\n this[kHeadersMap].set(lowercaseName, {\n name: exists.name,\n value: `${exists.value}${delimiter}${value}`\n })\n } else {\n this[kHeadersMap].set(lowercaseName, { name, value })\n }\n\n if (lowercaseName === 'set-cookie') {\n this.cookies ??= []\n this.cookies.push(value)\n }\n }\n\n // https://fetch.spec.whatwg.org/#concept-header-list-set\n set (name, value) {\n this[kHeadersSortedMap] = null\n const lowercaseName = name.toLowerCase()\n\n if (lowercaseName === 'set-cookie') {\n this.cookies = [value]\n }\n\n // 1. If list contains name, then set the value of\n // the first such header to value and remove the\n // others.\n // 2. Otherwise, append header (name, value) to list.\n return this[kHeadersMap].set(lowercaseName, { name, value })\n }\n\n // https://fetch.spec.whatwg.org/#concept-header-list-delete\n delete (name) {\n this[kHeadersSortedMap] = null\n\n name = name.toLowerCase()\n\n if (name === 'set-cookie') {\n this.cookies = null\n }\n\n return this[kHeadersMap].delete(name)\n }\n\n // https://fetch.spec.whatwg.org/#concept-header-list-get\n get (name) {\n // 1. If list does not contain name, then return null.\n if (!this.contains(name)) {\n return null\n }\n\n // 2. Return the values of all headers in list whose name\n // is a byte-case-insensitive match for name,\n // separated from each other by 0x2C 0x20, in order.\n return this[kHeadersMap].get(name.toLowerCase())?.value ?? null\n }\n\n * [Symbol.iterator] () {\n // use the lowercased name\n for (const [name, { value }] of this[kHeadersMap]) {\n yield [name, value]\n }\n }\n\n get entries () {\n const headers = {}\n\n if (this[kHeadersMap].size) {\n for (const { name, value } of this[kHeadersMap].values()) {\n headers[name] = value\n }\n }\n\n return headers\n }\n}\n\n// https://fetch.spec.whatwg.org/#headers-class\nclass Headers {\n constructor (init = undefined) {\n this[kHeadersList] = new HeadersList()\n\n // The new Headers(init) constructor steps are:\n\n // 1. Set this’s guard to \"none\".\n this[kGuard] = 'none'\n\n // 2. If init is given, then fill this with init.\n if (init !== undefined) {\n init = webidl.converters.HeadersInit(init)\n fill(this, init)\n }\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-append\n append (name, value) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.append' })\n\n name = webidl.converters.ByteString(name)\n value = webidl.converters.ByteString(value)\n\n // 1. Normalize value.\n value = headerValueNormalize(value)\n\n // 2. If name is not a header name or value is not a\n // header value, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.append',\n value: name,\n type: 'header name'\n })\n } else if (!isValidHeaderValue(value)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.append',\n value,\n type: 'header value'\n })\n }\n\n // 3. If headers’s guard is \"immutable\", then throw a TypeError.\n // 4. Otherwise, if headers’s guard is \"request\" and name is a\n // forbidden header name, return.\n // Note: undici does not implement forbidden header names\n if (this[kGuard] === 'immutable') {\n throw new TypeError('immutable')\n } else if (this[kGuard] === 'request-no-cors') {\n // 5. Otherwise, if headers’s guard is \"request-no-cors\":\n // TODO\n }\n\n // 6. Otherwise, if headers’s guard is \"response\" and name is a\n // forbidden response-header name, return.\n\n // 7. Append (name, value) to headers’s header list.\n // 8. If headers’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from headers\n return this[kHeadersList].append(name, value)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-delete\n delete (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.delete' })\n\n name = webidl.converters.ByteString(name)\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.delete',\n value: name,\n type: 'header name'\n })\n }\n\n // 2. If this’s guard is \"immutable\", then throw a TypeError.\n // 3. Otherwise, if this’s guard is \"request\" and name is a\n // forbidden header name, return.\n // 4. Otherwise, if this’s guard is \"request-no-cors\", name\n // is not a no-CORS-safelisted request-header name, and\n // name is not a privileged no-CORS request-header name,\n // return.\n // 5. Otherwise, if this’s guard is \"response\" and name is\n // a forbidden response-header name, return.\n // Note: undici does not implement forbidden header names\n if (this[kGuard] === 'immutable') {\n throw new TypeError('immutable')\n } else if (this[kGuard] === 'request-no-cors') {\n // TODO\n }\n\n // 6. If this’s header list does not contain name, then\n // return.\n if (!this[kHeadersList].contains(name)) {\n return\n }\n\n // 7. Delete name from this’s header list.\n // 8. If this’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from this.\n return this[kHeadersList].delete(name)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-get\n get (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.get' })\n\n name = webidl.converters.ByteString(name)\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.get',\n value: name,\n type: 'header name'\n })\n }\n\n // 2. Return the result of getting name from this’s header\n // list.\n return this[kHeadersList].get(name)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-has\n has (name) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.has' })\n\n name = webidl.converters.ByteString(name)\n\n // 1. If name is not a header name, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.has',\n value: name,\n type: 'header name'\n })\n }\n\n // 2. Return true if this’s header list contains name;\n // otherwise false.\n return this[kHeadersList].contains(name)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-set\n set (name, value) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.set' })\n\n name = webidl.converters.ByteString(name)\n value = webidl.converters.ByteString(value)\n\n // 1. Normalize value.\n value = headerValueNormalize(value)\n\n // 2. If name is not a header name or value is not a\n // header value, then throw a TypeError.\n if (!isValidHeaderName(name)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.set',\n value: name,\n type: 'header name'\n })\n } else if (!isValidHeaderValue(value)) {\n throw webidl.errors.invalidArgument({\n prefix: 'Headers.set',\n value,\n type: 'header value'\n })\n }\n\n // 3. If this’s guard is \"immutable\", then throw a TypeError.\n // 4. Otherwise, if this’s guard is \"request\" and name is a\n // forbidden header name, return.\n // 5. Otherwise, if this’s guard is \"request-no-cors\" and\n // name/value is not a no-CORS-safelisted request-header,\n // return.\n // 6. Otherwise, if this’s guard is \"response\" and name is a\n // forbidden response-header name, return.\n // Note: undici does not implement forbidden header names\n if (this[kGuard] === 'immutable') {\n throw new TypeError('immutable')\n } else if (this[kGuard] === 'request-no-cors') {\n // TODO\n }\n\n // 7. Set (name, value) in this’s header list.\n // 8. If this’s guard is \"request-no-cors\", then remove\n // privileged no-CORS request headers from this\n return this[kHeadersList].set(name, value)\n }\n\n // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie\n getSetCookie () {\n webidl.brandCheck(this, Headers)\n\n // 1. If this’s header list does not contain `Set-Cookie`, then return « ».\n // 2. Return the values of all headers in this’s header list whose name is\n // a byte-case-insensitive match for `Set-Cookie`, in order.\n\n const list = this[kHeadersList].cookies\n\n if (list) {\n return [...list]\n }\n\n return []\n }\n\n // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine\n get [kHeadersSortedMap] () {\n if (this[kHeadersList][kHeadersSortedMap]) {\n return this[kHeadersList][kHeadersSortedMap]\n }\n\n // 1. Let headers be an empty list of headers with the key being the name\n // and value the value.\n const headers = []\n\n // 2. Let names be the result of convert header names to a sorted-lowercase\n // set with all the names of the headers in list.\n const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1)\n const cookies = this[kHeadersList].cookies\n\n // 3. For each name of names:\n for (const [name, value] of names) {\n // 1. If name is `set-cookie`, then:\n if (name === 'set-cookie') {\n // 1. Let values be a list of all values of headers in list whose name\n // is a byte-case-insensitive match for name, in order.\n\n // 2. For each value of values:\n // 1. Append (name, value) to headers.\n for (const value of cookies) {\n headers.push([name, value])\n }\n } else {\n // 2. Otherwise:\n\n // 1. Let value be the result of getting name from list.\n\n // 2. Assert: value is non-null.\n assert(value !== null)\n\n // 3. Append (name, value) to headers.\n headers.push([name, value])\n }\n }\n\n this[kHeadersList][kHeadersSortedMap] = headers\n\n // 4. Return headers.\n return headers\n }\n\n keys () {\n webidl.brandCheck(this, Headers)\n\n return makeIterator(\n () => [...this[kHeadersSortedMap].values()],\n 'Headers',\n 'key'\n )\n }\n\n values () {\n webidl.brandCheck(this, Headers)\n\n return makeIterator(\n () => [...this[kHeadersSortedMap].values()],\n 'Headers',\n 'value'\n )\n }\n\n entries () {\n webidl.brandCheck(this, Headers)\n\n return makeIterator(\n () => [...this[kHeadersSortedMap].values()],\n 'Headers',\n 'key+value'\n )\n }\n\n /**\n * @param {(value: string, key: string, self: Headers) => void} callbackFn\n * @param {unknown} thisArg\n */\n forEach (callbackFn, thisArg = globalThis) {\n webidl.brandCheck(this, Headers)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.forEach' })\n\n if (typeof callbackFn !== 'function') {\n throw new TypeError(\n \"Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'.\"\n )\n }\n\n for (const [key, value] of this) {\n callbackFn.apply(thisArg, [value, key, this])\n }\n }\n\n [Symbol.for('nodejs.util.inspect.custom')] () {\n webidl.brandCheck(this, Headers)\n\n return this[kHeadersList]\n }\n}\n\nHeaders.prototype[Symbol.iterator] = Headers.prototype.entries\n\nObject.defineProperties(Headers.prototype, {\n append: kEnumerableProperty,\n delete: kEnumerableProperty,\n get: kEnumerableProperty,\n has: kEnumerableProperty,\n set: kEnumerableProperty,\n getSetCookie: kEnumerableProperty,\n keys: kEnumerableProperty,\n values: kEnumerableProperty,\n entries: kEnumerableProperty,\n forEach: kEnumerableProperty,\n [Symbol.iterator]: { enumerable: false },\n [Symbol.toStringTag]: {\n value: 'Headers',\n configurable: true\n }\n})\n\nwebidl.converters.HeadersInit = function (V) {\n if (webidl.util.Type(V) === 'Object') {\n if (V[Symbol.iterator]) {\n return webidl.converters['sequence>'](V)\n }\n\n return webidl.converters['record'](V)\n }\n\n throw webidl.errors.conversionFailed({\n prefix: 'Headers constructor',\n argument: 'Argument 1',\n types: ['sequence>', 'record']\n })\n}\n\nmodule.exports = {\n fill,\n Headers,\n HeadersList\n}\n","// https://github.com/Ethan-Arrowood/undici-fetch\n\n'use strict'\n\nconst {\n Response,\n makeNetworkError,\n makeAppropriateNetworkError,\n filterResponse,\n makeResponse\n} = require('./response')\nconst { Headers } = require('./headers')\nconst { Request, makeRequest } = require('./request')\nconst zlib = require('zlib')\nconst {\n bytesMatch,\n makePolicyContainer,\n clonePolicyContainer,\n requestBadPort,\n TAOCheck,\n appendRequestOriginHeader,\n responseLocationURL,\n requestCurrentURL,\n setRequestReferrerPolicyOnRedirect,\n tryUpgradeRequestToAPotentiallyTrustworthyURL,\n createOpaqueTimingInfo,\n appendFetchMetadata,\n corsCheck,\n crossOriginResourcePolicyCheck,\n determineRequestsReferrer,\n coarsenedSharedCurrentTime,\n createDeferredPromise,\n isBlobLike,\n sameOrigin,\n isCancelled,\n isAborted,\n isErrorLike,\n fullyReadBody,\n readableStreamClose,\n isomorphicEncode,\n urlIsLocal,\n urlIsHttpHttpsScheme,\n urlHasHttpsScheme\n} = require('./util')\nconst { kState, kHeaders, kGuard, kRealm } = require('./symbols')\nconst assert = require('assert')\nconst { safelyExtractBody } = require('./body')\nconst {\n redirectStatusSet,\n nullBodyStatus,\n safeMethodsSet,\n requestBodyHeader,\n subresourceSet,\n DOMException\n} = require('./constants')\nconst { kHeadersList } = require('../core/symbols')\nconst EE = require('events')\nconst { Readable, pipeline } = require('stream')\nconst { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = require('../core/util')\nconst { dataURLProcessor, serializeAMimeType } = require('./dataURL')\nconst { TransformStream } = require('stream/web')\nconst { getGlobalDispatcher } = require('../global')\nconst { webidl } = require('./webidl')\nconst { STATUS_CODES } = require('http')\nconst GET_OR_HEAD = ['GET', 'HEAD']\n\n/** @type {import('buffer').resolveObjectURL} */\nlet resolveObjectURL\nlet ReadableStream = globalThis.ReadableStream\n\nclass Fetch extends EE {\n constructor (dispatcher) {\n super()\n\n this.dispatcher = dispatcher\n this.connection = null\n this.dump = false\n this.state = 'ongoing'\n // 2 terminated listeners get added per request,\n // but only 1 gets removed. If there are 20 redirects,\n // 21 listeners will be added.\n // See https://github.com/nodejs/undici/issues/1711\n // TODO (fix): Find and fix root cause for leaked listener.\n this.setMaxListeners(21)\n }\n\n terminate (reason) {\n if (this.state !== 'ongoing') {\n return\n }\n\n this.state = 'terminated'\n this.connection?.destroy(reason)\n this.emit('terminated', reason)\n }\n\n // https://fetch.spec.whatwg.org/#fetch-controller-abort\n abort (error) {\n if (this.state !== 'ongoing') {\n return\n }\n\n // 1. Set controller’s state to \"aborted\".\n this.state = 'aborted'\n\n // 2. Let fallbackError be an \"AbortError\" DOMException.\n // 3. Set error to fallbackError if it is not given.\n if (!error) {\n error = new DOMException('The operation was aborted.', 'AbortError')\n }\n\n // 4. Let serializedError be StructuredSerialize(error).\n // If that threw an exception, catch it, and let\n // serializedError be StructuredSerialize(fallbackError).\n\n // 5. Set controller’s serialized abort reason to serializedError.\n this.serializedAbortReason = error\n\n this.connection?.destroy(error)\n this.emit('terminated', error)\n }\n}\n\n// https://fetch.spec.whatwg.org/#fetch-method\nfunction fetch (input, init = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' })\n\n // 1. Let p be a new promise.\n const p = createDeferredPromise()\n\n // 2. Let requestObject be the result of invoking the initial value of\n // Request as constructor with input and init as arguments. If this throws\n // an exception, reject p with it and return p.\n let requestObject\n\n try {\n requestObject = new Request(input, init)\n } catch (e) {\n p.reject(e)\n return p.promise\n }\n\n // 3. Let request be requestObject’s request.\n const request = requestObject[kState]\n\n // 4. If requestObject’s signal’s aborted flag is set, then:\n if (requestObject.signal.aborted) {\n // 1. Abort the fetch() call with p, request, null, and\n // requestObject’s signal’s abort reason.\n abortFetch(p, request, null, requestObject.signal.reason)\n\n // 2. Return p.\n return p.promise\n }\n\n // 5. Let globalObject be request’s client’s global object.\n const globalObject = request.client.globalObject\n\n // 6. If globalObject is a ServiceWorkerGlobalScope object, then set\n // request’s service-workers mode to \"none\".\n if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') {\n request.serviceWorkers = 'none'\n }\n\n // 7. Let responseObject be null.\n let responseObject = null\n\n // 8. Let relevantRealm be this’s relevant Realm.\n const relevantRealm = null\n\n // 9. Let locallyAborted be false.\n let locallyAborted = false\n\n // 10. Let controller be null.\n let controller = null\n\n // 11. Add the following abort steps to requestObject’s signal:\n addAbortListener(\n requestObject.signal,\n () => {\n // 1. Set locallyAborted to true.\n locallyAborted = true\n\n // 2. Assert: controller is non-null.\n assert(controller != null)\n\n // 3. Abort controller with requestObject’s signal’s abort reason.\n controller.abort(requestObject.signal.reason)\n\n // 4. Abort the fetch() call with p, request, responseObject,\n // and requestObject’s signal’s abort reason.\n abortFetch(p, request, responseObject, requestObject.signal.reason)\n }\n )\n\n // 12. Let handleFetchDone given response response be to finalize and\n // report timing with response, globalObject, and \"fetch\".\n const handleFetchDone = (response) =>\n finalizeAndReportTiming(response, 'fetch')\n\n // 13. Set controller to the result of calling fetch given request,\n // with processResponseEndOfBody set to handleFetchDone, and processResponse\n // given response being these substeps:\n\n const processResponse = (response) => {\n // 1. If locallyAborted is true, terminate these substeps.\n if (locallyAborted) {\n return Promise.resolve()\n }\n\n // 2. If response’s aborted flag is set, then:\n if (response.aborted) {\n // 1. Let deserializedError be the result of deserialize a serialized\n // abort reason given controller’s serialized abort reason and\n // relevantRealm.\n\n // 2. Abort the fetch() call with p, request, responseObject, and\n // deserializedError.\n\n abortFetch(p, request, responseObject, controller.serializedAbortReason)\n return Promise.resolve()\n }\n\n // 3. If response is a network error, then reject p with a TypeError\n // and terminate these substeps.\n if (response.type === 'error') {\n p.reject(\n Object.assign(new TypeError('fetch failed'), { cause: response.error })\n )\n return Promise.resolve()\n }\n\n // 4. Set responseObject to the result of creating a Response object,\n // given response, \"immutable\", and relevantRealm.\n responseObject = new Response()\n responseObject[kState] = response\n responseObject[kRealm] = relevantRealm\n responseObject[kHeaders][kHeadersList] = response.headersList\n responseObject[kHeaders][kGuard] = 'immutable'\n responseObject[kHeaders][kRealm] = relevantRealm\n\n // 5. Resolve p with responseObject.\n p.resolve(responseObject)\n }\n\n controller = fetching({\n request,\n processResponseEndOfBody: handleFetchDone,\n processResponse,\n dispatcher: init.dispatcher ?? getGlobalDispatcher() // undici\n })\n\n // 14. Return p.\n return p.promise\n}\n\n// https://fetch.spec.whatwg.org/#finalize-and-report-timing\nfunction finalizeAndReportTiming (response, initiatorType = 'other') {\n // 1. If response is an aborted network error, then return.\n if (response.type === 'error' && response.aborted) {\n return\n }\n\n // 2. If response’s URL list is null or empty, then return.\n if (!response.urlList?.length) {\n return\n }\n\n // 3. Let originalURL be response’s URL list[0].\n const originalURL = response.urlList[0]\n\n // 4. Let timingInfo be response’s timing info.\n let timingInfo = response.timingInfo\n\n // 5. Let cacheState be response’s cache state.\n let cacheState = response.cacheState\n\n // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return.\n if (!urlIsHttpHttpsScheme(originalURL)) {\n return\n }\n\n // 7. If timingInfo is null, then return.\n if (timingInfo === null) {\n return\n }\n\n // 8. If response’s timing allow passed flag is not set, then:\n if (!timingInfo.timingAllowPassed) {\n // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo.\n timingInfo = createOpaqueTimingInfo({\n startTime: timingInfo.startTime\n })\n\n // 2. Set cacheState to the empty string.\n cacheState = ''\n }\n\n // 9. Set timingInfo’s end time to the coarsened shared current time\n // given global’s relevant settings object’s cross-origin isolated\n // capability.\n // TODO: given global’s relevant settings object’s cross-origin isolated\n // capability?\n timingInfo.endTime = coarsenedSharedCurrentTime()\n\n // 10. Set response’s timing info to timingInfo.\n response.timingInfo = timingInfo\n\n // 11. Mark resource timing for timingInfo, originalURL, initiatorType,\n // global, and cacheState.\n markResourceTiming(\n timingInfo,\n originalURL,\n initiatorType,\n globalThis,\n cacheState\n )\n}\n\n// https://w3c.github.io/resource-timing/#dfn-mark-resource-timing\nfunction markResourceTiming (timingInfo, originalURL, initiatorType, globalThis, cacheState) {\n if (nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 2)) {\n performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis, cacheState)\n }\n}\n\n// https://fetch.spec.whatwg.org/#abort-fetch\nfunction abortFetch (p, request, responseObject, error) {\n // Note: AbortSignal.reason was added in node v17.2.0\n // which would give us an undefined error to reject with.\n // Remove this once node v16 is no longer supported.\n if (!error) {\n error = new DOMException('The operation was aborted.', 'AbortError')\n }\n\n // 1. Reject promise with error.\n p.reject(error)\n\n // 2. If request’s body is not null and is readable, then cancel request’s\n // body with error.\n if (request.body != null && isReadable(request.body?.stream)) {\n request.body.stream.cancel(error).catch((err) => {\n if (err.code === 'ERR_INVALID_STATE') {\n // Node bug?\n return\n }\n throw err\n })\n }\n\n // 3. If responseObject is null, then return.\n if (responseObject == null) {\n return\n }\n\n // 4. Let response be responseObject’s response.\n const response = responseObject[kState]\n\n // 5. If response’s body is not null and is readable, then error response’s\n // body with error.\n if (response.body != null && isReadable(response.body?.stream)) {\n response.body.stream.cancel(error).catch((err) => {\n if (err.code === 'ERR_INVALID_STATE') {\n // Node bug?\n return\n }\n throw err\n })\n }\n}\n\n// https://fetch.spec.whatwg.org/#fetching\nfunction fetching ({\n request,\n processRequestBodyChunkLength,\n processRequestEndOfBody,\n processResponse,\n processResponseEndOfBody,\n processResponseConsumeBody,\n useParallelQueue = false,\n dispatcher // undici\n}) {\n // 1. Let taskDestination be null.\n let taskDestination = null\n\n // 2. Let crossOriginIsolatedCapability be false.\n let crossOriginIsolatedCapability = false\n\n // 3. If request’s client is non-null, then:\n if (request.client != null) {\n // 1. Set taskDestination to request’s client’s global object.\n taskDestination = request.client.globalObject\n\n // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin\n // isolated capability.\n crossOriginIsolatedCapability =\n request.client.crossOriginIsolatedCapability\n }\n\n // 4. If useParallelQueue is true, then set taskDestination to the result of\n // starting a new parallel queue.\n // TODO\n\n // 5. Let timingInfo be a new fetch timing info whose start time and\n // post-redirect start time are the coarsened shared current time given\n // crossOriginIsolatedCapability.\n const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability)\n const timingInfo = createOpaqueTimingInfo({\n startTime: currenTime\n })\n\n // 6. Let fetchParams be a new fetch params whose\n // request is request,\n // timing info is timingInfo,\n // process request body chunk length is processRequestBodyChunkLength,\n // process request end-of-body is processRequestEndOfBody,\n // process response is processResponse,\n // process response consume body is processResponseConsumeBody,\n // process response end-of-body is processResponseEndOfBody,\n // task destination is taskDestination,\n // and cross-origin isolated capability is crossOriginIsolatedCapability.\n const fetchParams = {\n controller: new Fetch(dispatcher),\n request,\n timingInfo,\n processRequestBodyChunkLength,\n processRequestEndOfBody,\n processResponse,\n processResponseConsumeBody,\n processResponseEndOfBody,\n taskDestination,\n crossOriginIsolatedCapability\n }\n\n // 7. If request’s body is a byte sequence, then set request’s body to\n // request’s body as a body.\n // NOTE: Since fetching is only called from fetch, body should already be\n // extracted.\n assert(!request.body || request.body.stream)\n\n // 8. If request’s window is \"client\", then set request’s window to request’s\n // client, if request’s client’s global object is a Window object; otherwise\n // \"no-window\".\n if (request.window === 'client') {\n // TODO: What if request.client is null?\n request.window =\n request.client?.globalObject?.constructor?.name === 'Window'\n ? request.client\n : 'no-window'\n }\n\n // 9. If request’s origin is \"client\", then set request’s origin to request’s\n // client’s origin.\n if (request.origin === 'client') {\n // TODO: What if request.client is null?\n request.origin = request.client?.origin\n }\n\n // 10. If all of the following conditions are true:\n // TODO\n\n // 11. If request’s policy container is \"client\", then:\n if (request.policyContainer === 'client') {\n // 1. If request’s client is non-null, then set request’s policy\n // container to a clone of request’s client’s policy container. [HTML]\n if (request.client != null) {\n request.policyContainer = clonePolicyContainer(\n request.client.policyContainer\n )\n } else {\n // 2. Otherwise, set request’s policy container to a new policy\n // container.\n request.policyContainer = makePolicyContainer()\n }\n }\n\n // 12. If request’s header list does not contain `Accept`, then:\n if (!request.headersList.contains('accept')) {\n // 1. Let value be `*/*`.\n const value = '*/*'\n\n // 2. A user agent should set value to the first matching statement, if\n // any, switching on request’s destination:\n // \"document\"\n // \"frame\"\n // \"iframe\"\n // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`\n // \"image\"\n // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5`\n // \"style\"\n // `text/css,*/*;q=0.1`\n // TODO\n\n // 3. Append `Accept`/value to request’s header list.\n request.headersList.append('accept', value)\n }\n\n // 13. If request’s header list does not contain `Accept-Language`, then\n // user agents should append `Accept-Language`/an appropriate value to\n // request’s header list.\n if (!request.headersList.contains('accept-language')) {\n request.headersList.append('accept-language', '*')\n }\n\n // 14. If request’s priority is null, then use request’s initiator and\n // destination appropriately in setting request’s priority to a\n // user-agent-defined object.\n if (request.priority === null) {\n // TODO\n }\n\n // 15. If request is a subresource request, then:\n if (subresourceSet.has(request.destination)) {\n // TODO\n }\n\n // 16. Run main fetch given fetchParams.\n mainFetch(fetchParams)\n .catch(err => {\n fetchParams.controller.terminate(err)\n })\n\n // 17. Return fetchParam's controller\n return fetchParams.controller\n}\n\n// https://fetch.spec.whatwg.org/#concept-main-fetch\nasync function mainFetch (fetchParams, recursive = false) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. If request’s local-URLs-only flag is set and request’s current URL is\n // not local, then set response to a network error.\n if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) {\n response = makeNetworkError('local URLs only')\n }\n\n // 4. Run report Content Security Policy violations for request.\n // TODO\n\n // 5. Upgrade request to a potentially trustworthy URL, if appropriate.\n tryUpgradeRequestToAPotentiallyTrustworthyURL(request)\n\n // 6. If should request be blocked due to a bad port, should fetching request\n // be blocked as mixed content, or should request be blocked by Content\n // Security Policy returns blocked, then set response to a network error.\n if (requestBadPort(request) === 'blocked') {\n response = makeNetworkError('bad port')\n }\n // TODO: should fetching request be blocked as mixed content?\n // TODO: should request be blocked by Content Security Policy?\n\n // 7. If request’s referrer policy is the empty string, then set request’s\n // referrer policy to request’s policy container’s referrer policy.\n if (request.referrerPolicy === '') {\n request.referrerPolicy = request.policyContainer.referrerPolicy\n }\n\n // 8. If request’s referrer is not \"no-referrer\", then set request’s\n // referrer to the result of invoking determine request’s referrer.\n if (request.referrer !== 'no-referrer') {\n request.referrer = determineRequestsReferrer(request)\n }\n\n // 9. Set request’s current URL’s scheme to \"https\" if all of the following\n // conditions are true:\n // - request’s current URL’s scheme is \"http\"\n // - request’s current URL’s host is a domain\n // - Matching request’s current URL’s host per Known HSTS Host Domain Name\n // Matching results in either a superdomain match with an asserted\n // includeSubDomains directive or a congruent match (with or without an\n // asserted includeSubDomains directive). [HSTS]\n // TODO\n\n // 10. If recursive is false, then run the remaining steps in parallel.\n // TODO\n\n // 11. If response is null, then set response to the result of running\n // the steps corresponding to the first matching statement:\n if (response === null) {\n response = await (async () => {\n const currentURL = requestCurrentURL(request)\n\n if (\n // - request’s current URL’s origin is same origin with request’s origin,\n // and request’s response tainting is \"basic\"\n (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') ||\n // request’s current URL’s scheme is \"data\"\n (currentURL.protocol === 'data:') ||\n // - request’s mode is \"navigate\" or \"websocket\"\n (request.mode === 'navigate' || request.mode === 'websocket')\n ) {\n // 1. Set request’s response tainting to \"basic\".\n request.responseTainting = 'basic'\n\n // 2. Return the result of running scheme fetch given fetchParams.\n return await schemeFetch(fetchParams)\n }\n\n // request’s mode is \"same-origin\"\n if (request.mode === 'same-origin') {\n // 1. Return a network error.\n return makeNetworkError('request mode cannot be \"same-origin\"')\n }\n\n // request’s mode is \"no-cors\"\n if (request.mode === 'no-cors') {\n // 1. If request’s redirect mode is not \"follow\", then return a network\n // error.\n if (request.redirect !== 'follow') {\n return makeNetworkError(\n 'redirect mode cannot be \"follow\" for \"no-cors\" request'\n )\n }\n\n // 2. Set request’s response tainting to \"opaque\".\n request.responseTainting = 'opaque'\n\n // 3. Return the result of running scheme fetch given fetchParams.\n return await schemeFetch(fetchParams)\n }\n\n // request’s current URL’s scheme is not an HTTP(S) scheme\n if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) {\n // Return a network error.\n return makeNetworkError('URL scheme must be a HTTP(S) scheme')\n }\n\n // - request’s use-CORS-preflight flag is set\n // - request’s unsafe-request flag is set and either request’s method is\n // not a CORS-safelisted method or CORS-unsafe request-header names with\n // request’s header list is not empty\n // 1. Set request’s response tainting to \"cors\".\n // 2. Let corsWithPreflightResponse be the result of running HTTP fetch\n // given fetchParams and true.\n // 3. If corsWithPreflightResponse is a network error, then clear cache\n // entries using request.\n // 4. Return corsWithPreflightResponse.\n // TODO\n\n // Otherwise\n // 1. Set request’s response tainting to \"cors\".\n request.responseTainting = 'cors'\n\n // 2. Return the result of running HTTP fetch given fetchParams.\n return await httpFetch(fetchParams)\n })()\n }\n\n // 12. If recursive is true, then return response.\n if (recursive) {\n return response\n }\n\n // 13. If response is not a network error and response is not a filtered\n // response, then:\n if (response.status !== 0 && !response.internalResponse) {\n // If request’s response tainting is \"cors\", then:\n if (request.responseTainting === 'cors') {\n // 1. Let headerNames be the result of extracting header list values\n // given `Access-Control-Expose-Headers` and response’s header list.\n // TODO\n // 2. If request’s credentials mode is not \"include\" and headerNames\n // contains `*`, then set response’s CORS-exposed header-name list to\n // all unique header names in response’s header list.\n // TODO\n // 3. Otherwise, if headerNames is not null or failure, then set\n // response’s CORS-exposed header-name list to headerNames.\n // TODO\n }\n\n // Set response to the following filtered response with response as its\n // internal response, depending on request’s response tainting:\n if (request.responseTainting === 'basic') {\n response = filterResponse(response, 'basic')\n } else if (request.responseTainting === 'cors') {\n response = filterResponse(response, 'cors')\n } else if (request.responseTainting === 'opaque') {\n response = filterResponse(response, 'opaque')\n } else {\n assert(false)\n }\n }\n\n // 14. Let internalResponse be response, if response is a network error,\n // and response’s internal response otherwise.\n let internalResponse =\n response.status === 0 ? response : response.internalResponse\n\n // 15. If internalResponse’s URL list is empty, then set it to a clone of\n // request’s URL list.\n if (internalResponse.urlList.length === 0) {\n internalResponse.urlList.push(...request.urlList)\n }\n\n // 16. If request’s timing allow failed flag is unset, then set\n // internalResponse’s timing allow passed flag.\n if (!request.timingAllowFailed) {\n response.timingAllowPassed = true\n }\n\n // 17. If response is not a network error and any of the following returns\n // blocked\n // - should internalResponse to request be blocked as mixed content\n // - should internalResponse to request be blocked by Content Security Policy\n // - should internalResponse to request be blocked due to its MIME type\n // - should internalResponse to request be blocked due to nosniff\n // TODO\n\n // 18. If response’s type is \"opaque\", internalResponse’s status is 206,\n // internalResponse’s range-requested flag is set, and request’s header\n // list does not contain `Range`, then set response and internalResponse\n // to a network error.\n if (\n response.type === 'opaque' &&\n internalResponse.status === 206 &&\n internalResponse.rangeRequested &&\n !request.headers.contains('range')\n ) {\n response = internalResponse = makeNetworkError()\n }\n\n // 19. If response is not a network error and either request’s method is\n // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status,\n // set internalResponse’s body to null and disregard any enqueuing toward\n // it (if any).\n if (\n response.status !== 0 &&\n (request.method === 'HEAD' ||\n request.method === 'CONNECT' ||\n nullBodyStatus.includes(internalResponse.status))\n ) {\n internalResponse.body = null\n fetchParams.controller.dump = true\n }\n\n // 20. If request’s integrity metadata is not the empty string, then:\n if (request.integrity) {\n // 1. Let processBodyError be this step: run fetch finale given fetchParams\n // and a network error.\n const processBodyError = (reason) =>\n fetchFinale(fetchParams, makeNetworkError(reason))\n\n // 2. If request’s response tainting is \"opaque\", or response’s body is null,\n // then run processBodyError and abort these steps.\n if (request.responseTainting === 'opaque' || response.body == null) {\n processBodyError(response.error)\n return\n }\n\n // 3. Let processBody given bytes be these steps:\n const processBody = (bytes) => {\n // 1. If bytes do not match request’s integrity metadata,\n // then run processBodyError and abort these steps. [SRI]\n if (!bytesMatch(bytes, request.integrity)) {\n processBodyError('integrity mismatch')\n return\n }\n\n // 2. Set response’s body to bytes as a body.\n response.body = safelyExtractBody(bytes)[0]\n\n // 3. Run fetch finale given fetchParams and response.\n fetchFinale(fetchParams, response)\n }\n\n // 4. Fully read response’s body given processBody and processBodyError.\n await fullyReadBody(response.body, processBody, processBodyError)\n } else {\n // 21. Otherwise, run fetch finale given fetchParams and response.\n fetchFinale(fetchParams, response)\n }\n}\n\n// https://fetch.spec.whatwg.org/#concept-scheme-fetch\n// given a fetch params fetchParams\nfunction schemeFetch (fetchParams) {\n // Note: since the connection is destroyed on redirect, which sets fetchParams to a\n // cancelled state, we do not want this condition to trigger *unless* there have been\n // no redirects. See https://github.com/nodejs/undici/issues/1776\n // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {\n return Promise.resolve(makeAppropriateNetworkError(fetchParams))\n }\n\n // 2. Let request be fetchParams’s request.\n const { request } = fetchParams\n\n const { protocol: scheme } = requestCurrentURL(request)\n\n // 3. Switch on request’s current URL’s scheme and run the associated steps:\n switch (scheme) {\n case 'about:': {\n // If request’s current URL’s path is the string \"blank\", then return a new response\n // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) »,\n // and body is the empty byte sequence as a body.\n\n // Otherwise, return a network error.\n return Promise.resolve(makeNetworkError('about scheme is not supported'))\n }\n case 'blob:': {\n if (!resolveObjectURL) {\n resolveObjectURL = require('buffer').resolveObjectURL\n }\n\n // 1. Let blobURLEntry be request’s current URL’s blob URL entry.\n const blobURLEntry = requestCurrentURL(request)\n\n // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56\n // Buffer.resolveObjectURL does not ignore URL queries.\n if (blobURLEntry.search.length !== 0) {\n return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.'))\n }\n\n const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString())\n\n // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s\n // object is not a Blob object, then return a network error.\n if (request.method !== 'GET' || !isBlobLike(blobURLEntryObject)) {\n return Promise.resolve(makeNetworkError('invalid method'))\n }\n\n // 3. Let bodyWithType be the result of safely extracting blobURLEntry’s object.\n const bodyWithType = safelyExtractBody(blobURLEntryObject)\n\n // 4. Let body be bodyWithType’s body.\n const body = bodyWithType[0]\n\n // 5. Let length be body’s length, serialized and isomorphic encoded.\n const length = isomorphicEncode(`${body.length}`)\n\n // 6. Let type be bodyWithType’s type if it is non-null; otherwise the empty byte sequence.\n const type = bodyWithType[1] ?? ''\n\n // 7. Return a new response whose status message is `OK`, header list is\n // « (`Content-Length`, length), (`Content-Type`, type) », and body is body.\n const response = makeResponse({\n statusText: 'OK',\n headersList: [\n ['content-length', { name: 'Content-Length', value: length }],\n ['content-type', { name: 'Content-Type', value: type }]\n ]\n })\n\n response.body = body\n\n return Promise.resolve(response)\n }\n case 'data:': {\n // 1. Let dataURLStruct be the result of running the\n // data: URL processor on request’s current URL.\n const currentURL = requestCurrentURL(request)\n const dataURLStruct = dataURLProcessor(currentURL)\n\n // 2. If dataURLStruct is failure, then return a\n // network error.\n if (dataURLStruct === 'failure') {\n return Promise.resolve(makeNetworkError('failed to fetch the data URL'))\n }\n\n // 3. Let mimeType be dataURLStruct’s MIME type, serialized.\n const mimeType = serializeAMimeType(dataURLStruct.mimeType)\n\n // 4. Return a response whose status message is `OK`,\n // header list is « (`Content-Type`, mimeType) »,\n // and body is dataURLStruct’s body as a body.\n return Promise.resolve(makeResponse({\n statusText: 'OK',\n headersList: [\n ['content-type', { name: 'Content-Type', value: mimeType }]\n ],\n body: safelyExtractBody(dataURLStruct.body)[0]\n }))\n }\n case 'file:': {\n // For now, unfortunate as it is, file URLs are left as an exercise for the reader.\n // When in doubt, return a network error.\n return Promise.resolve(makeNetworkError('not implemented... yet...'))\n }\n case 'http:':\n case 'https:': {\n // Return the result of running HTTP fetch given fetchParams.\n\n return httpFetch(fetchParams)\n .catch((err) => makeNetworkError(err))\n }\n default: {\n return Promise.resolve(makeNetworkError('unknown scheme'))\n }\n }\n}\n\n// https://fetch.spec.whatwg.org/#finalize-response\nfunction finalizeResponse (fetchParams, response) {\n // 1. Set fetchParams’s request’s done flag.\n fetchParams.request.done = true\n\n // 2, If fetchParams’s process response done is not null, then queue a fetch\n // task to run fetchParams’s process response done given response, with\n // fetchParams’s task destination.\n if (fetchParams.processResponseDone != null) {\n queueMicrotask(() => fetchParams.processResponseDone(response))\n }\n}\n\n// https://fetch.spec.whatwg.org/#fetch-finale\nfunction fetchFinale (fetchParams, response) {\n // 1. If response is a network error, then:\n if (response.type === 'error') {\n // 1. Set response’s URL list to « fetchParams’s request’s URL list[0] ».\n response.urlList = [fetchParams.request.urlList[0]]\n\n // 2. Set response’s timing info to the result of creating an opaque timing\n // info for fetchParams’s timing info.\n response.timingInfo = createOpaqueTimingInfo({\n startTime: fetchParams.timingInfo.startTime\n })\n }\n\n // 2. Let processResponseEndOfBody be the following steps:\n const processResponseEndOfBody = () => {\n // 1. Set fetchParams’s request’s done flag.\n fetchParams.request.done = true\n\n // If fetchParams’s process response end-of-body is not null,\n // then queue a fetch task to run fetchParams’s process response\n // end-of-body given response with fetchParams’s task destination.\n if (fetchParams.processResponseEndOfBody != null) {\n queueMicrotask(() => fetchParams.processResponseEndOfBody(response))\n }\n }\n\n // 3. If fetchParams’s process response is non-null, then queue a fetch task\n // to run fetchParams’s process response given response, with fetchParams’s\n // task destination.\n if (fetchParams.processResponse != null) {\n queueMicrotask(() => fetchParams.processResponse(response))\n }\n\n // 4. If response’s body is null, then run processResponseEndOfBody.\n if (response.body == null) {\n processResponseEndOfBody()\n } else {\n // 5. Otherwise:\n\n // 1. Let transformStream be a new a TransformStream.\n\n // 2. Let identityTransformAlgorithm be an algorithm which, given chunk,\n // enqueues chunk in transformStream.\n const identityTransformAlgorithm = (chunk, controller) => {\n controller.enqueue(chunk)\n }\n\n // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm\n // and flushAlgorithm set to processResponseEndOfBody.\n const transformStream = new TransformStream({\n start () {},\n transform: identityTransformAlgorithm,\n flush: processResponseEndOfBody\n }, {\n size () {\n return 1\n }\n }, {\n size () {\n return 1\n }\n })\n\n // 4. Set response’s body to the result of piping response’s body through transformStream.\n response.body = { stream: response.body.stream.pipeThrough(transformStream) }\n }\n\n // 6. If fetchParams’s process response consume body is non-null, then:\n if (fetchParams.processResponseConsumeBody != null) {\n // 1. Let processBody given nullOrBytes be this step: run fetchParams’s\n // process response consume body given response and nullOrBytes.\n const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes)\n\n // 2. Let processBodyError be this step: run fetchParams’s process\n // response consume body given response and failure.\n const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure)\n\n // 3. If response’s body is null, then queue a fetch task to run processBody\n // given null, with fetchParams’s task destination.\n if (response.body == null) {\n queueMicrotask(() => processBody(null))\n } else {\n // 4. Otherwise, fully read response’s body given processBody, processBodyError,\n // and fetchParams’s task destination.\n return fullyReadBody(response.body, processBody, processBodyError)\n }\n return Promise.resolve()\n }\n}\n\n// https://fetch.spec.whatwg.org/#http-fetch\nasync function httpFetch (fetchParams) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. Let actualResponse be null.\n let actualResponse = null\n\n // 4. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 5. If request’s service-workers mode is \"all\", then:\n if (request.serviceWorkers === 'all') {\n // TODO\n }\n\n // 6. If response is null, then:\n if (response === null) {\n // 1. If makeCORSPreflight is true and one of these conditions is true:\n // TODO\n\n // 2. If request’s redirect mode is \"follow\", then set request’s\n // service-workers mode to \"none\".\n if (request.redirect === 'follow') {\n request.serviceWorkers = 'none'\n }\n\n // 3. Set response and actualResponse to the result of running\n // HTTP-network-or-cache fetch given fetchParams.\n actualResponse = response = await httpNetworkOrCacheFetch(fetchParams)\n\n // 4. If request’s response tainting is \"cors\" and a CORS check\n // for request and response returns failure, then return a network error.\n if (\n request.responseTainting === 'cors' &&\n corsCheck(request, response) === 'failure'\n ) {\n return makeNetworkError('cors failure')\n }\n\n // 5. If the TAO check for request and response returns failure, then set\n // request’s timing allow failed flag.\n if (TAOCheck(request, response) === 'failure') {\n request.timingAllowFailed = true\n }\n }\n\n // 7. If either request’s response tainting or response’s type\n // is \"opaque\", and the cross-origin resource policy check with\n // request’s origin, request’s client, request’s destination,\n // and actualResponse returns blocked, then return a network error.\n if (\n (request.responseTainting === 'opaque' || response.type === 'opaque') &&\n crossOriginResourcePolicyCheck(\n request.origin,\n request.client,\n request.destination,\n actualResponse\n ) === 'blocked'\n ) {\n return makeNetworkError('blocked')\n }\n\n // 8. If actualResponse’s status is a redirect status, then:\n if (redirectStatusSet.has(actualResponse.status)) {\n // 1. If actualResponse’s status is not 303, request’s body is not null,\n // and the connection uses HTTP/2, then user agents may, and are even\n // encouraged to, transmit an RST_STREAM frame.\n // See, https://github.com/whatwg/fetch/issues/1288\n if (request.redirect !== 'manual') {\n fetchParams.controller.connection.destroy()\n }\n\n // 2. Switch on request’s redirect mode:\n if (request.redirect === 'error') {\n // Set response to a network error.\n response = makeNetworkError('unexpected redirect')\n } else if (request.redirect === 'manual') {\n // Set response to an opaque-redirect filtered response whose internal\n // response is actualResponse.\n // NOTE(spec): On the web this would return an `opaqueredirect` response,\n // but that doesn't make sense server side.\n // See https://github.com/nodejs/undici/issues/1193.\n response = actualResponse\n } else if (request.redirect === 'follow') {\n // Set response to the result of running HTTP-redirect fetch given\n // fetchParams and response.\n response = await httpRedirectFetch(fetchParams, response)\n } else {\n assert(false)\n }\n }\n\n // 9. Set response’s timing info to timingInfo.\n response.timingInfo = timingInfo\n\n // 10. Return response.\n return response\n}\n\n// https://fetch.spec.whatwg.org/#http-redirect-fetch\nfunction httpRedirectFetch (fetchParams, response) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let actualResponse be response, if response is not a filtered response,\n // and response’s internal response otherwise.\n const actualResponse = response.internalResponse\n ? response.internalResponse\n : response\n\n // 3. Let locationURL be actualResponse’s location URL given request’s current\n // URL’s fragment.\n let locationURL\n\n try {\n locationURL = responseLocationURL(\n actualResponse,\n requestCurrentURL(request).hash\n )\n\n // 4. If locationURL is null, then return response.\n if (locationURL == null) {\n return response\n }\n } catch (err) {\n // 5. If locationURL is failure, then return a network error.\n return Promise.resolve(makeNetworkError(err))\n }\n\n // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network\n // error.\n if (!urlIsHttpHttpsScheme(locationURL)) {\n return Promise.resolve(makeNetworkError('URL scheme must be a HTTP(S) scheme'))\n }\n\n // 7. If request’s redirect count is 20, then return a network error.\n if (request.redirectCount === 20) {\n return Promise.resolve(makeNetworkError('redirect count exceeded'))\n }\n\n // 8. Increase request’s redirect count by 1.\n request.redirectCount += 1\n\n // 9. If request’s mode is \"cors\", locationURL includes credentials, and\n // request’s origin is not same origin with locationURL’s origin, then return\n // a network error.\n if (\n request.mode === 'cors' &&\n (locationURL.username || locationURL.password) &&\n !sameOrigin(request, locationURL)\n ) {\n return Promise.resolve(makeNetworkError('cross origin not allowed for request mode \"cors\"'))\n }\n\n // 10. If request’s response tainting is \"cors\" and locationURL includes\n // credentials, then return a network error.\n if (\n request.responseTainting === 'cors' &&\n (locationURL.username || locationURL.password)\n ) {\n return Promise.resolve(makeNetworkError(\n 'URL cannot contain credentials for request mode \"cors\"'\n ))\n }\n\n // 11. If actualResponse’s status is not 303, request’s body is non-null,\n // and request’s body’s source is null, then return a network error.\n if (\n actualResponse.status !== 303 &&\n request.body != null &&\n request.body.source == null\n ) {\n return Promise.resolve(makeNetworkError())\n }\n\n // 12. If one of the following is true\n // - actualResponse’s status is 301 or 302 and request’s method is `POST`\n // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD`\n if (\n ([301, 302].includes(actualResponse.status) && request.method === 'POST') ||\n (actualResponse.status === 303 &&\n !GET_OR_HEAD.includes(request.method))\n ) {\n // then:\n // 1. Set request’s method to `GET` and request’s body to null.\n request.method = 'GET'\n request.body = null\n\n // 2. For each headerName of request-body-header name, delete headerName from\n // request’s header list.\n for (const headerName of requestBodyHeader) {\n request.headersList.delete(headerName)\n }\n }\n\n // 13. If request’s current URL’s origin is not same origin with locationURL’s\n // origin, then for each headerName of CORS non-wildcard request-header name,\n // delete headerName from request’s header list.\n if (!sameOrigin(requestCurrentURL(request), locationURL)) {\n // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name\n request.headersList.delete('authorization')\n\n // \"Cookie\" and \"Host\" are forbidden request-headers, which undici doesn't implement.\n request.headersList.delete('cookie')\n request.headersList.delete('host')\n }\n\n // 14. If request’s body is non-null, then set request’s body to the first return\n // value of safely extracting request’s body’s source.\n if (request.body != null) {\n assert(request.body.source != null)\n request.body = safelyExtractBody(request.body.source)[0]\n }\n\n // 15. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 16. Set timingInfo’s redirect end time and post-redirect start time to the\n // coarsened shared current time given fetchParams’s cross-origin isolated\n // capability.\n timingInfo.redirectEndTime = timingInfo.postRedirectStartTime =\n coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)\n\n // 17. If timingInfo’s redirect start time is 0, then set timingInfo’s\n // redirect start time to timingInfo’s start time.\n if (timingInfo.redirectStartTime === 0) {\n timingInfo.redirectStartTime = timingInfo.startTime\n }\n\n // 18. Append locationURL to request’s URL list.\n request.urlList.push(locationURL)\n\n // 19. Invoke set request’s referrer policy on redirect on request and\n // actualResponse.\n setRequestReferrerPolicyOnRedirect(request, actualResponse)\n\n // 20. Return the result of running main fetch given fetchParams and true.\n return mainFetch(fetchParams, true)\n}\n\n// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch\nasync function httpNetworkOrCacheFetch (\n fetchParams,\n isAuthenticationFetch = false,\n isNewConnectionFetch = false\n) {\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let httpFetchParams be null.\n let httpFetchParams = null\n\n // 3. Let httpRequest be null.\n let httpRequest = null\n\n // 4. Let response be null.\n let response = null\n\n // 5. Let storedResponse be null.\n // TODO: cache\n\n // 6. Let httpCache be null.\n const httpCache = null\n\n // 7. Let the revalidatingFlag be unset.\n const revalidatingFlag = false\n\n // 8. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. If request’s window is \"no-window\" and request’s redirect mode is\n // \"error\", then set httpFetchParams to fetchParams and httpRequest to\n // request.\n if (request.window === 'no-window' && request.redirect === 'error') {\n httpFetchParams = fetchParams\n httpRequest = request\n } else {\n // Otherwise:\n\n // 1. Set httpRequest to a clone of request.\n httpRequest = makeRequest(request)\n\n // 2. Set httpFetchParams to a copy of fetchParams.\n httpFetchParams = { ...fetchParams }\n\n // 3. Set httpFetchParams’s request to httpRequest.\n httpFetchParams.request = httpRequest\n }\n\n // 3. Let includeCredentials be true if one of\n const includeCredentials =\n request.credentials === 'include' ||\n (request.credentials === 'same-origin' &&\n request.responseTainting === 'basic')\n\n // 4. Let contentLength be httpRequest’s body’s length, if httpRequest’s\n // body is non-null; otherwise null.\n const contentLength = httpRequest.body ? httpRequest.body.length : null\n\n // 5. Let contentLengthHeaderValue be null.\n let contentLengthHeaderValue = null\n\n // 6. If httpRequest’s body is null and httpRequest’s method is `POST` or\n // `PUT`, then set contentLengthHeaderValue to `0`.\n if (\n httpRequest.body == null &&\n ['POST', 'PUT'].includes(httpRequest.method)\n ) {\n contentLengthHeaderValue = '0'\n }\n\n // 7. If contentLength is non-null, then set contentLengthHeaderValue to\n // contentLength, serialized and isomorphic encoded.\n if (contentLength != null) {\n contentLengthHeaderValue = isomorphicEncode(`${contentLength}`)\n }\n\n // 8. If contentLengthHeaderValue is non-null, then append\n // `Content-Length`/contentLengthHeaderValue to httpRequest’s header\n // list.\n if (contentLengthHeaderValue != null) {\n httpRequest.headersList.append('content-length', contentLengthHeaderValue)\n }\n\n // 9. If contentLengthHeaderValue is non-null, then append (`Content-Length`,\n // contentLengthHeaderValue) to httpRequest’s header list.\n\n // 10. If contentLength is non-null and httpRequest’s keepalive is true,\n // then:\n if (contentLength != null && httpRequest.keepalive) {\n // NOTE: keepalive is a noop outside of browser context.\n }\n\n // 11. If httpRequest’s referrer is a URL, then append\n // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded,\n // to httpRequest’s header list.\n if (httpRequest.referrer instanceof URL) {\n httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href))\n }\n\n // 12. Append a request `Origin` header for httpRequest.\n appendRequestOriginHeader(httpRequest)\n\n // 13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA]\n appendFetchMetadata(httpRequest)\n\n // 14. If httpRequest’s header list does not contain `User-Agent`, then\n // user agents should append `User-Agent`/default `User-Agent` value to\n // httpRequest’s header list.\n if (!httpRequest.headersList.contains('user-agent')) {\n httpRequest.headersList.append('user-agent', typeof esbuildDetection === 'undefined' ? 'undici' : 'node')\n }\n\n // 15. If httpRequest’s cache mode is \"default\" and httpRequest’s header\n // list contains `If-Modified-Since`, `If-None-Match`,\n // `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set\n // httpRequest’s cache mode to \"no-store\".\n if (\n httpRequest.cache === 'default' &&\n (httpRequest.headersList.contains('if-modified-since') ||\n httpRequest.headersList.contains('if-none-match') ||\n httpRequest.headersList.contains('if-unmodified-since') ||\n httpRequest.headersList.contains('if-match') ||\n httpRequest.headersList.contains('if-range'))\n ) {\n httpRequest.cache = 'no-store'\n }\n\n // 16. If httpRequest’s cache mode is \"no-cache\", httpRequest’s prevent\n // no-cache cache-control header modification flag is unset, and\n // httpRequest’s header list does not contain `Cache-Control`, then append\n // `Cache-Control`/`max-age=0` to httpRequest’s header list.\n if (\n httpRequest.cache === 'no-cache' &&\n !httpRequest.preventNoCacheCacheControlHeaderModification &&\n !httpRequest.headersList.contains('cache-control')\n ) {\n httpRequest.headersList.append('cache-control', 'max-age=0')\n }\n\n // 17. If httpRequest’s cache mode is \"no-store\" or \"reload\", then:\n if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') {\n // 1. If httpRequest’s header list does not contain `Pragma`, then append\n // `Pragma`/`no-cache` to httpRequest’s header list.\n if (!httpRequest.headersList.contains('pragma')) {\n httpRequest.headersList.append('pragma', 'no-cache')\n }\n\n // 2. If httpRequest’s header list does not contain `Cache-Control`,\n // then append `Cache-Control`/`no-cache` to httpRequest’s header list.\n if (!httpRequest.headersList.contains('cache-control')) {\n httpRequest.headersList.append('cache-control', 'no-cache')\n }\n }\n\n // 18. If httpRequest’s header list contains `Range`, then append\n // `Accept-Encoding`/`identity` to httpRequest’s header list.\n if (httpRequest.headersList.contains('range')) {\n httpRequest.headersList.append('accept-encoding', 'identity')\n }\n\n // 19. Modify httpRequest’s header list per HTTP. Do not append a given\n // header if httpRequest’s header list contains that header’s name.\n // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129\n if (!httpRequest.headersList.contains('accept-encoding')) {\n if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) {\n httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate')\n } else {\n httpRequest.headersList.append('accept-encoding', 'gzip, deflate')\n }\n }\n\n httpRequest.headersList.delete('host')\n\n // 20. If includeCredentials is true, then:\n if (includeCredentials) {\n // 1. If the user agent is not configured to block cookies for httpRequest\n // (see section 7 of [COOKIES]), then:\n // TODO: credentials\n // 2. If httpRequest’s header list does not contain `Authorization`, then:\n // TODO: credentials\n }\n\n // 21. If there’s a proxy-authentication entry, use it as appropriate.\n // TODO: proxy-authentication\n\n // 22. Set httpCache to the result of determining the HTTP cache\n // partition, given httpRequest.\n // TODO: cache\n\n // 23. If httpCache is null, then set httpRequest’s cache mode to\n // \"no-store\".\n if (httpCache == null) {\n httpRequest.cache = 'no-store'\n }\n\n // 24. If httpRequest’s cache mode is neither \"no-store\" nor \"reload\",\n // then:\n if (httpRequest.mode !== 'no-store' && httpRequest.mode !== 'reload') {\n // TODO: cache\n }\n\n // 9. If aborted, then return the appropriate network error for fetchParams.\n // TODO\n\n // 10. If response is null, then:\n if (response == null) {\n // 1. If httpRequest’s cache mode is \"only-if-cached\", then return a\n // network error.\n if (httpRequest.mode === 'only-if-cached') {\n return makeNetworkError('only if cached')\n }\n\n // 2. Let forwardResponse be the result of running HTTP-network fetch\n // given httpFetchParams, includeCredentials, and isNewConnectionFetch.\n const forwardResponse = await httpNetworkFetch(\n httpFetchParams,\n includeCredentials,\n isNewConnectionFetch\n )\n\n // 3. If httpRequest’s method is unsafe and forwardResponse’s status is\n // in the range 200 to 399, inclusive, invalidate appropriate stored\n // responses in httpCache, as per the \"Invalidation\" chapter of HTTP\n // Caching, and set storedResponse to null. [HTTP-CACHING]\n if (\n !safeMethodsSet.has(httpRequest.method) &&\n forwardResponse.status >= 200 &&\n forwardResponse.status <= 399\n ) {\n // TODO: cache\n }\n\n // 4. If the revalidatingFlag is set and forwardResponse’s status is 304,\n // then:\n if (revalidatingFlag && forwardResponse.status === 304) {\n // TODO: cache\n }\n\n // 5. If response is null, then:\n if (response == null) {\n // 1. Set response to forwardResponse.\n response = forwardResponse\n\n // 2. Store httpRequest and forwardResponse in httpCache, as per the\n // \"Storing Responses in Caches\" chapter of HTTP Caching. [HTTP-CACHING]\n // TODO: cache\n }\n }\n\n // 11. Set response’s URL list to a clone of httpRequest’s URL list.\n response.urlList = [...httpRequest.urlList]\n\n // 12. If httpRequest’s header list contains `Range`, then set response’s\n // range-requested flag.\n if (httpRequest.headersList.contains('range')) {\n response.rangeRequested = true\n }\n\n // 13. Set response’s request-includes-credentials to includeCredentials.\n response.requestIncludesCredentials = includeCredentials\n\n // 14. If response’s status is 401, httpRequest’s response tainting is not\n // \"cors\", includeCredentials is true, and request’s window is an environment\n // settings object, then:\n // TODO\n\n // 15. If response’s status is 407, then:\n if (response.status === 407) {\n // 1. If request’s window is \"no-window\", then return a network error.\n if (request.window === 'no-window') {\n return makeNetworkError()\n }\n\n // 2. ???\n\n // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams)) {\n return makeAppropriateNetworkError(fetchParams)\n }\n\n // 4. Prompt the end user as appropriate in request’s window and store\n // the result as a proxy-authentication entry. [HTTP-AUTH]\n // TODO: Invoke some kind of callback?\n\n // 5. Set response to the result of running HTTP-network-or-cache fetch given\n // fetchParams.\n // TODO\n return makeNetworkError('proxy authentication required')\n }\n\n // 16. If all of the following are true\n if (\n // response’s status is 421\n response.status === 421 &&\n // isNewConnectionFetch is false\n !isNewConnectionFetch &&\n // request’s body is null, or request’s body is non-null and request’s body’s source is non-null\n (request.body == null || request.body.source != null)\n ) {\n // then:\n\n // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.\n if (isCancelled(fetchParams)) {\n return makeAppropriateNetworkError(fetchParams)\n }\n\n // 2. Set response to the result of running HTTP-network-or-cache\n // fetch given fetchParams, isAuthenticationFetch, and true.\n\n // TODO (spec): The spec doesn't specify this but we need to cancel\n // the active response before we can start a new one.\n // https://github.com/whatwg/fetch/issues/1293\n fetchParams.controller.connection.destroy()\n\n response = await httpNetworkOrCacheFetch(\n fetchParams,\n isAuthenticationFetch,\n true\n )\n }\n\n // 17. If isAuthenticationFetch is true, then create an authentication entry\n if (isAuthenticationFetch) {\n // TODO\n }\n\n // 18. Return response.\n return response\n}\n\n// https://fetch.spec.whatwg.org/#http-network-fetch\nasync function httpNetworkFetch (\n fetchParams,\n includeCredentials = false,\n forceNewConnection = false\n) {\n assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed)\n\n fetchParams.controller.connection = {\n abort: null,\n destroyed: false,\n destroy (err) {\n if (!this.destroyed) {\n this.destroyed = true\n this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError'))\n }\n }\n }\n\n // 1. Let request be fetchParams’s request.\n const request = fetchParams.request\n\n // 2. Let response be null.\n let response = null\n\n // 3. Let timingInfo be fetchParams’s timing info.\n const timingInfo = fetchParams.timingInfo\n\n // 4. Let httpCache be the result of determining the HTTP cache partition,\n // given request.\n // TODO: cache\n const httpCache = null\n\n // 5. If httpCache is null, then set request’s cache mode to \"no-store\".\n if (httpCache == null) {\n request.cache = 'no-store'\n }\n\n // 6. Let networkPartitionKey be the result of determining the network\n // partition key given request.\n // TODO\n\n // 7. Let newConnection be \"yes\" if forceNewConnection is true; otherwise\n // \"no\".\n const newConnection = forceNewConnection ? 'yes' : 'no' // eslint-disable-line no-unused-vars\n\n // 8. Switch on request’s mode:\n if (request.mode === 'websocket') {\n // Let connection be the result of obtaining a WebSocket connection,\n // given request’s current URL.\n // TODO\n } else {\n // Let connection be the result of obtaining a connection, given\n // networkPartitionKey, request’s current URL’s origin,\n // includeCredentials, and forceNewConnection.\n // TODO\n }\n\n // 9. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. If connection is failure, then return a network error.\n\n // 2. Set timingInfo’s final connection timing info to the result of\n // calling clamp and coarsen connection timing info with connection’s\n // timing info, timingInfo’s post-redirect start time, and fetchParams’s\n // cross-origin isolated capability.\n\n // 3. If connection is not an HTTP/2 connection, request’s body is non-null,\n // and request’s body’s source is null, then append (`Transfer-Encoding`,\n // `chunked`) to request’s header list.\n\n // 4. Set timingInfo’s final network-request start time to the coarsened\n // shared current time given fetchParams’s cross-origin isolated\n // capability.\n\n // 5. Set response to the result of making an HTTP request over connection\n // using request with the following caveats:\n\n // - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS]\n // [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH]\n\n // - If request’s body is non-null, and request’s body’s source is null,\n // then the user agent may have a buffer of up to 64 kibibytes and store\n // a part of request’s body in that buffer. If the user agent reads from\n // request’s body beyond that buffer’s size and the user agent needs to\n // resend request, then instead return a network error.\n\n // - Set timingInfo’s final network-response start time to the coarsened\n // shared current time given fetchParams’s cross-origin isolated capability,\n // immediately after the user agent’s HTTP parser receives the first byte\n // of the response (e.g., frame header bytes for HTTP/2 or response status\n // line for HTTP/1.x).\n\n // - Wait until all the headers are transmitted.\n\n // - Any responses whose status is in the range 100 to 199, inclusive,\n // and is not 101, are to be ignored, except for the purposes of setting\n // timingInfo’s final network-response start time above.\n\n // - If request’s header list contains `Transfer-Encoding`/`chunked` and\n // response is transferred via HTTP/1.0 or older, then return a network\n // error.\n\n // - If the HTTP request results in a TLS client certificate dialog, then:\n\n // 1. If request’s window is an environment settings object, make the\n // dialog available in request’s window.\n\n // 2. Otherwise, return a network error.\n\n // To transmit request’s body body, run these steps:\n let requestBody = null\n // 1. If body is null and fetchParams’s process request end-of-body is\n // non-null, then queue a fetch task given fetchParams’s process request\n // end-of-body and fetchParams’s task destination.\n if (request.body == null && fetchParams.processRequestEndOfBody) {\n queueMicrotask(() => fetchParams.processRequestEndOfBody())\n } else if (request.body != null) {\n // 2. Otherwise, if body is non-null:\n\n // 1. Let processBodyChunk given bytes be these steps:\n const processBodyChunk = async function * (bytes) {\n // 1. If the ongoing fetch is terminated, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. Run this step in parallel: transmit bytes.\n yield bytes\n\n // 3. If fetchParams’s process request body is non-null, then run\n // fetchParams’s process request body given bytes’s length.\n fetchParams.processRequestBodyChunkLength?.(bytes.byteLength)\n }\n\n // 2. Let processEndOfBody be these steps:\n const processEndOfBody = () => {\n // 1. If fetchParams is canceled, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. If fetchParams’s process request end-of-body is non-null,\n // then run fetchParams’s process request end-of-body.\n if (fetchParams.processRequestEndOfBody) {\n fetchParams.processRequestEndOfBody()\n }\n }\n\n // 3. Let processBodyError given e be these steps:\n const processBodyError = (e) => {\n // 1. If fetchParams is canceled, then abort these steps.\n if (isCancelled(fetchParams)) {\n return\n }\n\n // 2. If e is an \"AbortError\" DOMException, then abort fetchParams’s controller.\n if (e.name === 'AbortError') {\n fetchParams.controller.abort()\n } else {\n fetchParams.controller.terminate(e)\n }\n }\n\n // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody,\n // processBodyError, and fetchParams’s task destination.\n requestBody = (async function * () {\n try {\n for await (const bytes of request.body.stream) {\n yield * processBodyChunk(bytes)\n }\n processEndOfBody()\n } catch (err) {\n processBodyError(err)\n }\n })()\n }\n\n try {\n // socket is only provided for websockets\n const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody })\n\n if (socket) {\n response = makeResponse({ status, statusText, headersList, socket })\n } else {\n const iterator = body[Symbol.asyncIterator]()\n fetchParams.controller.next = () => iterator.next()\n\n response = makeResponse({ status, statusText, headersList })\n }\n } catch (err) {\n // 10. If aborted, then:\n if (err.name === 'AbortError') {\n // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame.\n fetchParams.controller.connection.destroy()\n\n // 2. Return the appropriate network error for fetchParams.\n return makeAppropriateNetworkError(fetchParams, err)\n }\n\n return makeNetworkError(err)\n }\n\n // 11. Let pullAlgorithm be an action that resumes the ongoing fetch\n // if it is suspended.\n const pullAlgorithm = () => {\n fetchParams.controller.resume()\n }\n\n // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s\n // controller with reason, given reason.\n const cancelAlgorithm = (reason) => {\n fetchParams.controller.abort(reason)\n }\n\n // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by\n // the user agent.\n // TODO\n\n // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object\n // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent.\n // TODO\n\n // 15. Let stream be a new ReadableStream.\n // 16. Set up stream with pullAlgorithm set to pullAlgorithm,\n // cancelAlgorithm set to cancelAlgorithm, highWaterMark set to\n // highWaterMark, and sizeAlgorithm set to sizeAlgorithm.\n if (!ReadableStream) {\n ReadableStream = require('stream/web').ReadableStream\n }\n\n const stream = new ReadableStream(\n {\n async start (controller) {\n fetchParams.controller.controller = controller\n },\n async pull (controller) {\n await pullAlgorithm(controller)\n },\n async cancel (reason) {\n await cancelAlgorithm(reason)\n }\n },\n {\n highWaterMark: 0,\n size () {\n return 1\n }\n }\n )\n\n // 17. Run these steps, but abort when the ongoing fetch is terminated:\n\n // 1. Set response’s body to a new body whose stream is stream.\n response.body = { stream }\n\n // 2. If response is not a network error and request’s cache mode is\n // not \"no-store\", then update response in httpCache for request.\n // TODO\n\n // 3. If includeCredentials is true and the user agent is not configured\n // to block cookies for request (see section 7 of [COOKIES]), then run the\n // \"set-cookie-string\" parsing algorithm (see section 5.2 of [COOKIES]) on\n // the value of each header whose name is a byte-case-insensitive match for\n // `Set-Cookie` in response’s header list, if any, and request’s current URL.\n // TODO\n\n // 18. If aborted, then:\n // TODO\n\n // 19. Run these steps in parallel:\n\n // 1. Run these steps, but abort when fetchParams is canceled:\n fetchParams.controller.on('terminated', onAborted)\n fetchParams.controller.resume = async () => {\n // 1. While true\n while (true) {\n // 1-3. See onData...\n\n // 4. Set bytes to the result of handling content codings given\n // codings and bytes.\n let bytes\n let isFailure\n try {\n const { done, value } = await fetchParams.controller.next()\n\n if (isAborted(fetchParams)) {\n break\n }\n\n bytes = done ? undefined : value\n } catch (err) {\n if (fetchParams.controller.ended && !timingInfo.encodedBodySize) {\n // zlib doesn't like empty streams.\n bytes = undefined\n } else {\n bytes = err\n\n // err may be propagated from the result of calling readablestream.cancel,\n // which might not be an error. https://github.com/nodejs/undici/issues/2009\n isFailure = true\n }\n }\n\n if (bytes === undefined) {\n // 2. Otherwise, if the bytes transmission for response’s message\n // body is done normally and stream is readable, then close\n // stream, finalize response for fetchParams and response, and\n // abort these in-parallel steps.\n readableStreamClose(fetchParams.controller.controller)\n\n finalizeResponse(fetchParams, response)\n\n return\n }\n\n // 5. Increase timingInfo’s decoded body size by bytes’s length.\n timingInfo.decodedBodySize += bytes?.byteLength ?? 0\n\n // 6. If bytes is failure, then terminate fetchParams’s controller.\n if (isFailure) {\n fetchParams.controller.terminate(bytes)\n return\n }\n\n // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes\n // into stream.\n fetchParams.controller.controller.enqueue(new Uint8Array(bytes))\n\n // 8. If stream is errored, then terminate the ongoing fetch.\n if (isErrored(stream)) {\n fetchParams.controller.terminate()\n return\n }\n\n // 9. If stream doesn’t need more data ask the user agent to suspend\n // the ongoing fetch.\n if (!fetchParams.controller.controller.desiredSize) {\n return\n }\n }\n }\n\n // 2. If aborted, then:\n function onAborted (reason) {\n // 2. If fetchParams is aborted, then:\n if (isAborted(fetchParams)) {\n // 1. Set response’s aborted flag.\n response.aborted = true\n\n // 2. If stream is readable, then error stream with the result of\n // deserialize a serialized abort reason given fetchParams’s\n // controller’s serialized abort reason and an\n // implementation-defined realm.\n if (isReadable(stream)) {\n fetchParams.controller.controller.error(\n fetchParams.controller.serializedAbortReason\n )\n }\n } else {\n // 3. Otherwise, if stream is readable, error stream with a TypeError.\n if (isReadable(stream)) {\n fetchParams.controller.controller.error(new TypeError('terminated', {\n cause: isErrorLike(reason) ? reason : undefined\n }))\n }\n }\n\n // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame.\n // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so.\n fetchParams.controller.connection.destroy()\n }\n\n // 20. Return response.\n return response\n\n async function dispatch ({ body }) {\n const url = requestCurrentURL(request)\n /** @type {import('../..').Agent} */\n const agent = fetchParams.controller.dispatcher\n\n return new Promise((resolve, reject) => agent.dispatch(\n {\n path: url.pathname + url.search,\n origin: url.origin,\n method: request.method,\n body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body,\n headers: request.headersList.entries,\n maxRedirections: 0,\n upgrade: request.mode === 'websocket' ? 'websocket' : undefined\n },\n {\n body: null,\n abort: null,\n\n onConnect (abort) {\n // TODO (fix): Do we need connection here?\n const { connection } = fetchParams.controller\n\n if (connection.destroyed) {\n abort(new DOMException('The operation was aborted.', 'AbortError'))\n } else {\n fetchParams.controller.on('terminated', abort)\n this.abort = connection.abort = abort\n }\n },\n\n onHeaders (status, headersList, resume, statusText) {\n if (status < 200) {\n return\n }\n\n let codings = []\n let location = ''\n\n const headers = new Headers()\n\n // For H2, the headers are a plain JS object\n // We distinguish between them and iterate accordingly\n if (Array.isArray(headersList)) {\n for (let n = 0; n < headersList.length; n += 2) {\n const key = headersList[n + 0].toString('latin1')\n const val = headersList[n + 1].toString('latin1')\n if (key.toLowerCase() === 'content-encoding') {\n // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1\n // \"All content-coding values are case-insensitive...\"\n codings = val.toLowerCase().split(',').map((x) => x.trim())\n } else if (key.toLowerCase() === 'location') {\n location = val\n }\n\n headers.append(key, val)\n }\n } else {\n const keys = Object.keys(headersList)\n for (const key of keys) {\n const val = headersList[key]\n if (key.toLowerCase() === 'content-encoding') {\n // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1\n // \"All content-coding values are case-insensitive...\"\n codings = val.toLowerCase().split(',').map((x) => x.trim()).reverse()\n } else if (key.toLowerCase() === 'location') {\n location = val\n }\n\n headers.append(key, val)\n }\n }\n\n this.body = new Readable({ read: resume })\n\n const decoders = []\n\n const willFollow = request.redirect === 'follow' &&\n location &&\n redirectStatusSet.has(status)\n\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding\n if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {\n for (const coding of codings) {\n // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2\n if (coding === 'x-gzip' || coding === 'gzip') {\n decoders.push(zlib.createGunzip({\n // Be less strict when decoding compressed responses, since sometimes\n // servers send slightly invalid responses that are still accepted\n // by common browsers.\n // Always using Z_SYNC_FLUSH is what cURL does.\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n }))\n } else if (coding === 'deflate') {\n decoders.push(zlib.createInflate())\n } else if (coding === 'br') {\n decoders.push(zlib.createBrotliDecompress())\n } else {\n decoders.length = 0\n break\n }\n }\n }\n\n resolve({\n status,\n statusText,\n headersList: headers[kHeadersList],\n body: decoders.length\n ? pipeline(this.body, ...decoders, () => { })\n : this.body.on('error', () => {})\n })\n\n return true\n },\n\n onData (chunk) {\n if (fetchParams.controller.dump) {\n return\n }\n\n // 1. If one or more bytes have been transmitted from response’s\n // message body, then:\n\n // 1. Let bytes be the transmitted bytes.\n const bytes = chunk\n\n // 2. Let codings be the result of extracting header list values\n // given `Content-Encoding` and response’s header list.\n // See pullAlgorithm.\n\n // 3. Increase timingInfo’s encoded body size by bytes’s length.\n timingInfo.encodedBodySize += bytes.byteLength\n\n // 4. See pullAlgorithm...\n\n return this.body.push(bytes)\n },\n\n onComplete () {\n if (this.abort) {\n fetchParams.controller.off('terminated', this.abort)\n }\n\n fetchParams.controller.ended = true\n\n this.body.push(null)\n },\n\n onError (error) {\n if (this.abort) {\n fetchParams.controller.off('terminated', this.abort)\n }\n\n this.body?.destroy(error)\n\n fetchParams.controller.terminate(error)\n\n reject(error)\n },\n\n onUpgrade (status, headersList, socket) {\n if (status !== 101) {\n return\n }\n\n const headers = new Headers()\n\n for (let n = 0; n < headersList.length; n += 2) {\n const key = headersList[n + 0].toString('latin1')\n const val = headersList[n + 1].toString('latin1')\n\n headers.append(key, val)\n }\n\n resolve({\n status,\n statusText: STATUS_CODES[status],\n headersList: headers[kHeadersList],\n socket\n })\n\n return true\n }\n }\n ))\n }\n}\n\nmodule.exports = {\n fetch,\n Fetch,\n fetching,\n finalizeAndReportTiming\n}\n","/* globals AbortController */\n\n'use strict'\n\nconst { extractBody, mixinBody, cloneBody } = require('./body')\nconst { Headers, fill: fillHeaders, HeadersList } = require('./headers')\nconst { FinalizationRegistry } = require('../compat/dispatcher-weakref')()\nconst util = require('../core/util')\nconst {\n isValidHTTPToken,\n sameOrigin,\n normalizeMethod,\n makePolicyContainer\n} = require('./util')\nconst {\n forbiddenMethodsSet,\n corsSafeListedMethodsSet,\n referrerPolicy,\n requestRedirect,\n requestMode,\n requestCredentials,\n requestCache,\n requestDuplex\n} = require('./constants')\nconst { kEnumerableProperty } = util\nconst { kHeaders, kSignal, kState, kGuard, kRealm } = require('./symbols')\nconst { webidl } = require('./webidl')\nconst { getGlobalOrigin } = require('./global')\nconst { URLSerializer } = require('./dataURL')\nconst { kHeadersList } = require('../core/symbols')\nconst assert = require('assert')\nconst { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require('events')\n\nlet TransformStream = globalThis.TransformStream\n\nconst kInit = Symbol('init')\nconst kAbortController = Symbol('abortController')\n\nconst requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {\n signal.removeEventListener('abort', abort)\n})\n\n// https://fetch.spec.whatwg.org/#request-class\nclass Request {\n // https://fetch.spec.whatwg.org/#dom-request\n constructor (input, init = {}) {\n if (input === kInit) {\n return\n }\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Request constructor' })\n\n input = webidl.converters.RequestInfo(input)\n init = webidl.converters.RequestInit(init)\n\n // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object\n this[kRealm] = {\n settingsObject: {\n baseUrl: getGlobalOrigin(),\n get origin () {\n return this.baseUrl?.origin\n },\n policyContainer: makePolicyContainer()\n }\n }\n\n // 1. Let request be null.\n let request = null\n\n // 2. Let fallbackMode be null.\n let fallbackMode = null\n\n // 3. Let baseURL be this’s relevant settings object’s API base URL.\n const baseUrl = this[kRealm].settingsObject.baseUrl\n\n // 4. Let signal be null.\n let signal = null\n\n // 5. If input is a string, then:\n if (typeof input === 'string') {\n // 1. Let parsedURL be the result of parsing input with baseURL.\n // 2. If parsedURL is failure, then throw a TypeError.\n let parsedURL\n try {\n parsedURL = new URL(input, baseUrl)\n } catch (err) {\n throw new TypeError('Failed to parse URL from ' + input, { cause: err })\n }\n\n // 3. If parsedURL includes credentials, then throw a TypeError.\n if (parsedURL.username || parsedURL.password) {\n throw new TypeError(\n 'Request cannot be constructed from a URL that includes credentials: ' +\n input\n )\n }\n\n // 4. Set request to a new request whose URL is parsedURL.\n request = makeRequest({ urlList: [parsedURL] })\n\n // 5. Set fallbackMode to \"cors\".\n fallbackMode = 'cors'\n } else {\n // 6. Otherwise:\n\n // 7. Assert: input is a Request object.\n assert(input instanceof Request)\n\n // 8. Set request to input’s request.\n request = input[kState]\n\n // 9. Set signal to input’s signal.\n signal = input[kSignal]\n }\n\n // 7. Let origin be this’s relevant settings object’s origin.\n const origin = this[kRealm].settingsObject.origin\n\n // 8. Let window be \"client\".\n let window = 'client'\n\n // 9. If request’s window is an environment settings object and its origin\n // is same origin with origin, then set window to request’s window.\n if (\n request.window?.constructor?.name === 'EnvironmentSettingsObject' &&\n sameOrigin(request.window, origin)\n ) {\n window = request.window\n }\n\n // 10. If init[\"window\"] exists and is non-null, then throw a TypeError.\n if (init.window != null) {\n throw new TypeError(`'window' option '${window}' must be null`)\n }\n\n // 11. If init[\"window\"] exists, then set window to \"no-window\".\n if ('window' in init) {\n window = 'no-window'\n }\n\n // 12. Set request to a new request with the following properties:\n request = makeRequest({\n // URL request’s URL.\n // undici implementation note: this is set as the first item in request's urlList in makeRequest\n // method request’s method.\n method: request.method,\n // header list A copy of request’s header list.\n // undici implementation note: headersList is cloned in makeRequest\n headersList: request.headersList,\n // unsafe-request flag Set.\n unsafeRequest: request.unsafeRequest,\n // client This’s relevant settings object.\n client: this[kRealm].settingsObject,\n // window window.\n window,\n // priority request’s priority.\n priority: request.priority,\n // origin request’s origin. The propagation of the origin is only significant for navigation requests\n // being handled by a service worker. In this scenario a request can have an origin that is different\n // from the current client.\n origin: request.origin,\n // referrer request’s referrer.\n referrer: request.referrer,\n // referrer policy request’s referrer policy.\n referrerPolicy: request.referrerPolicy,\n // mode request’s mode.\n mode: request.mode,\n // credentials mode request’s credentials mode.\n credentials: request.credentials,\n // cache mode request’s cache mode.\n cache: request.cache,\n // redirect mode request’s redirect mode.\n redirect: request.redirect,\n // integrity metadata request’s integrity metadata.\n integrity: request.integrity,\n // keepalive request’s keepalive.\n keepalive: request.keepalive,\n // reload-navigation flag request’s reload-navigation flag.\n reloadNavigation: request.reloadNavigation,\n // history-navigation flag request’s history-navigation flag.\n historyNavigation: request.historyNavigation,\n // URL list A clone of request’s URL list.\n urlList: [...request.urlList]\n })\n\n // 13. If init is not empty, then:\n if (Object.keys(init).length > 0) {\n // 1. If request’s mode is \"navigate\", then set it to \"same-origin\".\n if (request.mode === 'navigate') {\n request.mode = 'same-origin'\n }\n\n // 2. Unset request’s reload-navigation flag.\n request.reloadNavigation = false\n\n // 3. Unset request’s history-navigation flag.\n request.historyNavigation = false\n\n // 4. Set request’s origin to \"client\".\n request.origin = 'client'\n\n // 5. Set request’s referrer to \"client\"\n request.referrer = 'client'\n\n // 6. Set request’s referrer policy to the empty string.\n request.referrerPolicy = ''\n\n // 7. Set request’s URL to request’s current URL.\n request.url = request.urlList[request.urlList.length - 1]\n\n // 8. Set request’s URL list to « request’s URL ».\n request.urlList = [request.url]\n }\n\n // 14. If init[\"referrer\"] exists, then:\n if (init.referrer !== undefined) {\n // 1. Let referrer be init[\"referrer\"].\n const referrer = init.referrer\n\n // 2. If referrer is the empty string, then set request’s referrer to \"no-referrer\".\n if (referrer === '') {\n request.referrer = 'no-referrer'\n } else {\n // 1. Let parsedReferrer be the result of parsing referrer with\n // baseURL.\n // 2. If parsedReferrer is failure, then throw a TypeError.\n let parsedReferrer\n try {\n parsedReferrer = new URL(referrer, baseUrl)\n } catch (err) {\n throw new TypeError(`Referrer \"${referrer}\" is not a valid URL.`, { cause: err })\n }\n\n // 3. If one of the following is true\n // - parsedReferrer’s scheme is \"about\" and path is the string \"client\"\n // - parsedReferrer’s origin is not same origin with origin\n // then set request’s referrer to \"client\".\n if (\n (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') ||\n (origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl))\n ) {\n request.referrer = 'client'\n } else {\n // 4. Otherwise, set request’s referrer to parsedReferrer.\n request.referrer = parsedReferrer\n }\n }\n }\n\n // 15. If init[\"referrerPolicy\"] exists, then set request’s referrer policy\n // to it.\n if (init.referrerPolicy !== undefined) {\n request.referrerPolicy = init.referrerPolicy\n }\n\n // 16. Let mode be init[\"mode\"] if it exists, and fallbackMode otherwise.\n let mode\n if (init.mode !== undefined) {\n mode = init.mode\n } else {\n mode = fallbackMode\n }\n\n // 17. If mode is \"navigate\", then throw a TypeError.\n if (mode === 'navigate') {\n throw webidl.errors.exception({\n header: 'Request constructor',\n message: 'invalid request mode navigate.'\n })\n }\n\n // 18. If mode is non-null, set request’s mode to mode.\n if (mode != null) {\n request.mode = mode\n }\n\n // 19. If init[\"credentials\"] exists, then set request’s credentials mode\n // to it.\n if (init.credentials !== undefined) {\n request.credentials = init.credentials\n }\n\n // 18. If init[\"cache\"] exists, then set request’s cache mode to it.\n if (init.cache !== undefined) {\n request.cache = init.cache\n }\n\n // 21. If request’s cache mode is \"only-if-cached\" and request’s mode is\n // not \"same-origin\", then throw a TypeError.\n if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {\n throw new TypeError(\n \"'only-if-cached' can be set only with 'same-origin' mode\"\n )\n }\n\n // 22. If init[\"redirect\"] exists, then set request’s redirect mode to it.\n if (init.redirect !== undefined) {\n request.redirect = init.redirect\n }\n\n // 23. If init[\"integrity\"] exists, then set request’s integrity metadata to it.\n if (init.integrity !== undefined && init.integrity != null) {\n request.integrity = String(init.integrity)\n }\n\n // 24. If init[\"keepalive\"] exists, then set request’s keepalive to it.\n if (init.keepalive !== undefined) {\n request.keepalive = Boolean(init.keepalive)\n }\n\n // 25. If init[\"method\"] exists, then:\n if (init.method !== undefined) {\n // 1. Let method be init[\"method\"].\n let method = init.method\n\n // 2. If method is not a method or method is a forbidden method, then\n // throw a TypeError.\n if (!isValidHTTPToken(init.method)) {\n throw TypeError(`'${init.method}' is not a valid HTTP method.`)\n }\n\n if (forbiddenMethodsSet.has(method.toUpperCase())) {\n throw TypeError(`'${init.method}' HTTP method is unsupported.`)\n }\n\n // 3. Normalize method.\n method = normalizeMethod(init.method)\n\n // 4. Set request’s method to method.\n request.method = method\n }\n\n // 26. If init[\"signal\"] exists, then set signal to it.\n if (init.signal !== undefined) {\n signal = init.signal\n }\n\n // 27. Set this’s request to request.\n this[kState] = request\n\n // 28. Set this’s signal to a new AbortSignal object with this’s relevant\n // Realm.\n // TODO: could this be simplified with AbortSignal.any\n // (https://dom.spec.whatwg.org/#dom-abortsignal-any)\n const ac = new AbortController()\n this[kSignal] = ac.signal\n this[kSignal][kRealm] = this[kRealm]\n\n // 29. If signal is not null, then make this’s signal follow signal.\n if (signal != null) {\n if (\n !signal ||\n typeof signal.aborted !== 'boolean' ||\n typeof signal.addEventListener !== 'function'\n ) {\n throw new TypeError(\n \"Failed to construct 'Request': member signal is not of type AbortSignal.\"\n )\n }\n\n if (signal.aborted) {\n ac.abort(signal.reason)\n } else {\n // Keep a strong ref to ac while request object\n // is alive. This is needed to prevent AbortController\n // from being prematurely garbage collected.\n // See, https://github.com/nodejs/undici/issues/1926.\n this[kAbortController] = ac\n\n const acRef = new WeakRef(ac)\n const abort = function () {\n const ac = acRef.deref()\n if (ac !== undefined) {\n ac.abort(this.reason)\n }\n }\n\n // Third-party AbortControllers may not work with these.\n // See, https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619.\n try {\n // If the max amount of listeners is equal to the default, increase it\n // This is only available in node >= v19.9.0\n if (typeof getMaxListeners === 'function' && getMaxListeners(signal) === defaultMaxListeners) {\n setMaxListeners(100, signal)\n } else if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) {\n setMaxListeners(100, signal)\n }\n } catch {}\n\n util.addAbortListener(signal, abort)\n requestFinalizer.register(ac, { signal, abort })\n }\n }\n\n // 30. Set this’s headers to a new Headers object with this’s relevant\n // Realm, whose header list is request’s header list and guard is\n // \"request\".\n this[kHeaders] = new Headers()\n this[kHeaders][kHeadersList] = request.headersList\n this[kHeaders][kGuard] = 'request'\n this[kHeaders][kRealm] = this[kRealm]\n\n // 31. If this’s request’s mode is \"no-cors\", then:\n if (mode === 'no-cors') {\n // 1. If this’s request’s method is not a CORS-safelisted method,\n // then throw a TypeError.\n if (!corsSafeListedMethodsSet.has(request.method)) {\n throw new TypeError(\n `'${request.method} is unsupported in no-cors mode.`\n )\n }\n\n // 2. Set this’s headers’s guard to \"request-no-cors\".\n this[kHeaders][kGuard] = 'request-no-cors'\n }\n\n // 32. If init is not empty, then:\n if (Object.keys(init).length !== 0) {\n // 1. Let headers be a copy of this’s headers and its associated header\n // list.\n let headers = new Headers(this[kHeaders])\n\n // 2. If init[\"headers\"] exists, then set headers to init[\"headers\"].\n if (init.headers !== undefined) {\n headers = init.headers\n }\n\n // 3. Empty this’s headers’s header list.\n this[kHeaders][kHeadersList].clear()\n\n // 4. If headers is a Headers object, then for each header in its header\n // list, append header’s name/header’s value to this’s headers.\n if (headers.constructor.name === 'Headers') {\n for (const [key, val] of headers) {\n this[kHeaders].append(key, val)\n }\n } else {\n // 5. Otherwise, fill this’s headers with headers.\n fillHeaders(this[kHeaders], headers)\n }\n }\n\n // 33. Let inputBody be input’s request’s body if input is a Request\n // object; otherwise null.\n const inputBody = input instanceof Request ? input[kState].body : null\n\n // 34. If either init[\"body\"] exists and is non-null or inputBody is\n // non-null, and request’s method is `GET` or `HEAD`, then throw a\n // TypeError.\n if (\n (init.body != null || inputBody != null) &&\n (request.method === 'GET' || request.method === 'HEAD')\n ) {\n throw new TypeError('Request with GET/HEAD method cannot have body.')\n }\n\n // 35. Let initBody be null.\n let initBody = null\n\n // 36. If init[\"body\"] exists and is non-null, then:\n if (init.body != null) {\n // 1. Let Content-Type be null.\n // 2. Set initBody and Content-Type to the result of extracting\n // init[\"body\"], with keepalive set to request’s keepalive.\n const [extractedBody, contentType] = extractBody(\n init.body,\n request.keepalive\n )\n initBody = extractedBody\n\n // 3, If Content-Type is non-null and this’s headers’s header list does\n // not contain `Content-Type`, then append `Content-Type`/Content-Type to\n // this’s headers.\n if (contentType && !this[kHeaders][kHeadersList].contains('content-type')) {\n this[kHeaders].append('content-type', contentType)\n }\n }\n\n // 37. Let inputOrInitBody be initBody if it is non-null; otherwise\n // inputBody.\n const inputOrInitBody = initBody ?? inputBody\n\n // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is\n // null, then:\n if (inputOrInitBody != null && inputOrInitBody.source == null) {\n // 1. If initBody is non-null and init[\"duplex\"] does not exist,\n // then throw a TypeError.\n if (initBody != null && init.duplex == null) {\n throw new TypeError('RequestInit: duplex option is required when sending a body.')\n }\n\n // 2. If this’s request’s mode is neither \"same-origin\" nor \"cors\",\n // then throw a TypeError.\n if (request.mode !== 'same-origin' && request.mode !== 'cors') {\n throw new TypeError(\n 'If request is made from ReadableStream, mode should be \"same-origin\" or \"cors\"'\n )\n }\n\n // 3. Set this’s request’s use-CORS-preflight flag.\n request.useCORSPreflightFlag = true\n }\n\n // 39. Let finalBody be inputOrInitBody.\n let finalBody = inputOrInitBody\n\n // 40. If initBody is null and inputBody is non-null, then:\n if (initBody == null && inputBody != null) {\n // 1. If input is unusable, then throw a TypeError.\n if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) {\n throw new TypeError(\n 'Cannot construct a Request with a Request object that has already been used.'\n )\n }\n\n // 2. Set finalBody to the result of creating a proxy for inputBody.\n if (!TransformStream) {\n TransformStream = require('stream/web').TransformStream\n }\n\n // https://streams.spec.whatwg.org/#readablestream-create-a-proxy\n const identityTransform = new TransformStream()\n inputBody.stream.pipeThrough(identityTransform)\n finalBody = {\n source: inputBody.source,\n length: inputBody.length,\n stream: identityTransform.readable\n }\n }\n\n // 41. Set this’s request’s body to finalBody.\n this[kState].body = finalBody\n }\n\n // Returns request’s HTTP method, which is \"GET\" by default.\n get method () {\n webidl.brandCheck(this, Request)\n\n // The method getter steps are to return this’s request’s method.\n return this[kState].method\n }\n\n // Returns the URL of request as a string.\n get url () {\n webidl.brandCheck(this, Request)\n\n // The url getter steps are to return this’s request’s URL, serialized.\n return URLSerializer(this[kState].url)\n }\n\n // Returns a Headers object consisting of the headers associated with request.\n // Note that headers added in the network layer by the user agent will not\n // be accounted for in this object, e.g., the \"Host\" header.\n get headers () {\n webidl.brandCheck(this, Request)\n\n // The headers getter steps are to return this’s headers.\n return this[kHeaders]\n }\n\n // Returns the kind of resource requested by request, e.g., \"document\"\n // or \"script\".\n get destination () {\n webidl.brandCheck(this, Request)\n\n // The destination getter are to return this’s request’s destination.\n return this[kState].destination\n }\n\n // Returns the referrer of request. Its value can be a same-origin URL if\n // explicitly set in init, the empty string to indicate no referrer, and\n // \"about:client\" when defaulting to the global’s default. This is used\n // during fetching to determine the value of the `Referer` header of the\n // request being made.\n get referrer () {\n webidl.brandCheck(this, Request)\n\n // 1. If this’s request’s referrer is \"no-referrer\", then return the\n // empty string.\n if (this[kState].referrer === 'no-referrer') {\n return ''\n }\n\n // 2. If this’s request’s referrer is \"client\", then return\n // \"about:client\".\n if (this[kState].referrer === 'client') {\n return 'about:client'\n }\n\n // Return this’s request’s referrer, serialized.\n return this[kState].referrer.toString()\n }\n\n // Returns the referrer policy associated with request.\n // This is used during fetching to compute the value of the request’s\n // referrer.\n get referrerPolicy () {\n webidl.brandCheck(this, Request)\n\n // The referrerPolicy getter steps are to return this’s request’s referrer policy.\n return this[kState].referrerPolicy\n }\n\n // Returns the mode associated with request, which is a string indicating\n // whether the request will use CORS, or will be restricted to same-origin\n // URLs.\n get mode () {\n webidl.brandCheck(this, Request)\n\n // The mode getter steps are to return this’s request’s mode.\n return this[kState].mode\n }\n\n // Returns the credentials mode associated with request,\n // which is a string indicating whether credentials will be sent with the\n // request always, never, or only when sent to a same-origin URL.\n get credentials () {\n // The credentials getter steps are to return this’s request’s credentials mode.\n return this[kState].credentials\n }\n\n // Returns the cache mode associated with request,\n // which is a string indicating how the request will\n // interact with the browser’s cache when fetching.\n get cache () {\n webidl.brandCheck(this, Request)\n\n // The cache getter steps are to return this’s request’s cache mode.\n return this[kState].cache\n }\n\n // Returns the redirect mode associated with request,\n // which is a string indicating how redirects for the\n // request will be handled during fetching. A request\n // will follow redirects by default.\n get redirect () {\n webidl.brandCheck(this, Request)\n\n // The redirect getter steps are to return this’s request’s redirect mode.\n return this[kState].redirect\n }\n\n // Returns request’s subresource integrity metadata, which is a\n // cryptographic hash of the resource being fetched. Its value\n // consists of multiple hashes separated by whitespace. [SRI]\n get integrity () {\n webidl.brandCheck(this, Request)\n\n // The integrity getter steps are to return this’s request’s integrity\n // metadata.\n return this[kState].integrity\n }\n\n // Returns a boolean indicating whether or not request can outlive the\n // global in which it was created.\n get keepalive () {\n webidl.brandCheck(this, Request)\n\n // The keepalive getter steps are to return this’s request’s keepalive.\n return this[kState].keepalive\n }\n\n // Returns a boolean indicating whether or not request is for a reload\n // navigation.\n get isReloadNavigation () {\n webidl.brandCheck(this, Request)\n\n // The isReloadNavigation getter steps are to return true if this’s\n // request’s reload-navigation flag is set; otherwise false.\n return this[kState].reloadNavigation\n }\n\n // Returns a boolean indicating whether or not request is for a history\n // navigation (a.k.a. back-foward navigation).\n get isHistoryNavigation () {\n webidl.brandCheck(this, Request)\n\n // The isHistoryNavigation getter steps are to return true if this’s request’s\n // history-navigation flag is set; otherwise false.\n return this[kState].historyNavigation\n }\n\n // Returns the signal associated with request, which is an AbortSignal\n // object indicating whether or not request has been aborted, and its\n // abort event handler.\n get signal () {\n webidl.brandCheck(this, Request)\n\n // The signal getter steps are to return this’s signal.\n return this[kSignal]\n }\n\n get body () {\n webidl.brandCheck(this, Request)\n\n return this[kState].body ? this[kState].body.stream : null\n }\n\n get bodyUsed () {\n webidl.brandCheck(this, Request)\n\n return !!this[kState].body && util.isDisturbed(this[kState].body.stream)\n }\n\n get duplex () {\n webidl.brandCheck(this, Request)\n\n return 'half'\n }\n\n // Returns a clone of request.\n clone () {\n webidl.brandCheck(this, Request)\n\n // 1. If this is unusable, then throw a TypeError.\n if (this.bodyUsed || this.body?.locked) {\n throw new TypeError('unusable')\n }\n\n // 2. Let clonedRequest be the result of cloning this’s request.\n const clonedRequest = cloneRequest(this[kState])\n\n // 3. Let clonedRequestObject be the result of creating a Request object,\n // given clonedRequest, this’s headers’s guard, and this’s relevant Realm.\n const clonedRequestObject = new Request(kInit)\n clonedRequestObject[kState] = clonedRequest\n clonedRequestObject[kRealm] = this[kRealm]\n clonedRequestObject[kHeaders] = new Headers()\n clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList\n clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]\n clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]\n\n // 4. Make clonedRequestObject’s signal follow this’s signal.\n const ac = new AbortController()\n if (this.signal.aborted) {\n ac.abort(this.signal.reason)\n } else {\n util.addAbortListener(\n this.signal,\n () => {\n ac.abort(this.signal.reason)\n }\n )\n }\n clonedRequestObject[kSignal] = ac.signal\n\n // 4. Return clonedRequestObject.\n return clonedRequestObject\n }\n}\n\nmixinBody(Request)\n\nfunction makeRequest (init) {\n // https://fetch.spec.whatwg.org/#requests\n const request = {\n method: 'GET',\n localURLsOnly: false,\n unsafeRequest: false,\n body: null,\n client: null,\n reservedClient: null,\n replacesClientId: '',\n window: 'client',\n keepalive: false,\n serviceWorkers: 'all',\n initiator: '',\n destination: '',\n priority: null,\n origin: 'client',\n policyContainer: 'client',\n referrer: 'client',\n referrerPolicy: '',\n mode: 'no-cors',\n useCORSPreflightFlag: false,\n credentials: 'same-origin',\n useCredentials: false,\n cache: 'default',\n redirect: 'follow',\n integrity: '',\n cryptoGraphicsNonceMetadata: '',\n parserMetadata: '',\n reloadNavigation: false,\n historyNavigation: false,\n userActivation: false,\n taintedOrigin: false,\n redirectCount: 0,\n responseTainting: 'basic',\n preventNoCacheCacheControlHeaderModification: false,\n done: false,\n timingAllowFailed: false,\n ...init,\n headersList: init.headersList\n ? new HeadersList(init.headersList)\n : new HeadersList()\n }\n request.url = request.urlList[0]\n return request\n}\n\n// https://fetch.spec.whatwg.org/#concept-request-clone\nfunction cloneRequest (request) {\n // To clone a request request, run these steps:\n\n // 1. Let newRequest be a copy of request, except for its body.\n const newRequest = makeRequest({ ...request, body: null })\n\n // 2. If request’s body is non-null, set newRequest’s body to the\n // result of cloning request’s body.\n if (request.body != null) {\n newRequest.body = cloneBody(request.body)\n }\n\n // 3. Return newRequest.\n return newRequest\n}\n\nObject.defineProperties(Request.prototype, {\n method: kEnumerableProperty,\n url: kEnumerableProperty,\n headers: kEnumerableProperty,\n redirect: kEnumerableProperty,\n clone: kEnumerableProperty,\n signal: kEnumerableProperty,\n duplex: kEnumerableProperty,\n destination: kEnumerableProperty,\n body: kEnumerableProperty,\n bodyUsed: kEnumerableProperty,\n isHistoryNavigation: kEnumerableProperty,\n isReloadNavigation: kEnumerableProperty,\n keepalive: kEnumerableProperty,\n integrity: kEnumerableProperty,\n cache: kEnumerableProperty,\n credentials: kEnumerableProperty,\n attribute: kEnumerableProperty,\n referrerPolicy: kEnumerableProperty,\n referrer: kEnumerableProperty,\n mode: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'Request',\n configurable: true\n }\n})\n\nwebidl.converters.Request = webidl.interfaceConverter(\n Request\n)\n\n// https://fetch.spec.whatwg.org/#requestinfo\nwebidl.converters.RequestInfo = function (V) {\n if (typeof V === 'string') {\n return webidl.converters.USVString(V)\n }\n\n if (V instanceof Request) {\n return webidl.converters.Request(V)\n }\n\n return webidl.converters.USVString(V)\n}\n\nwebidl.converters.AbortSignal = webidl.interfaceConverter(\n AbortSignal\n)\n\n// https://fetch.spec.whatwg.org/#requestinit\nwebidl.converters.RequestInit = webidl.dictionaryConverter([\n {\n key: 'method',\n converter: webidl.converters.ByteString\n },\n {\n key: 'headers',\n converter: webidl.converters.HeadersInit\n },\n {\n key: 'body',\n converter: webidl.nullableConverter(\n webidl.converters.BodyInit\n )\n },\n {\n key: 'referrer',\n converter: webidl.converters.USVString\n },\n {\n key: 'referrerPolicy',\n converter: webidl.converters.DOMString,\n // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy\n allowedValues: referrerPolicy\n },\n {\n key: 'mode',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#concept-request-mode\n allowedValues: requestMode\n },\n {\n key: 'credentials',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestcredentials\n allowedValues: requestCredentials\n },\n {\n key: 'cache',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestcache\n allowedValues: requestCache\n },\n {\n key: 'redirect',\n converter: webidl.converters.DOMString,\n // https://fetch.spec.whatwg.org/#requestredirect\n allowedValues: requestRedirect\n },\n {\n key: 'integrity',\n converter: webidl.converters.DOMString\n },\n {\n key: 'keepalive',\n converter: webidl.converters.boolean\n },\n {\n key: 'signal',\n converter: webidl.nullableConverter(\n (signal) => webidl.converters.AbortSignal(\n signal,\n { strict: false }\n )\n )\n },\n {\n key: 'window',\n converter: webidl.converters.any\n },\n {\n key: 'duplex',\n converter: webidl.converters.DOMString,\n allowedValues: requestDuplex\n }\n])\n\nmodule.exports = { Request, makeRequest }\n","'use strict'\n\nconst { Headers, HeadersList, fill } = require('./headers')\nconst { extractBody, cloneBody, mixinBody } = require('./body')\nconst util = require('../core/util')\nconst { kEnumerableProperty } = util\nconst {\n isValidReasonPhrase,\n isCancelled,\n isAborted,\n isBlobLike,\n serializeJavascriptValueToJSONString,\n isErrorLike,\n isomorphicEncode\n} = require('./util')\nconst {\n redirectStatusSet,\n nullBodyStatus,\n DOMException\n} = require('./constants')\nconst { kState, kHeaders, kGuard, kRealm } = require('./symbols')\nconst { webidl } = require('./webidl')\nconst { FormData } = require('./formdata')\nconst { getGlobalOrigin } = require('./global')\nconst { URLSerializer } = require('./dataURL')\nconst { kHeadersList } = require('../core/symbols')\nconst assert = require('assert')\nconst { types } = require('util')\n\nconst ReadableStream = globalThis.ReadableStream || require('stream/web').ReadableStream\nconst textEncoder = new TextEncoder('utf-8')\n\n// https://fetch.spec.whatwg.org/#response-class\nclass Response {\n // Creates network error Response.\n static error () {\n // TODO\n const relevantRealm = { settingsObject: {} }\n\n // The static error() method steps are to return the result of creating a\n // Response object, given a new network error, \"immutable\", and this’s\n // relevant Realm.\n const responseObject = new Response()\n responseObject[kState] = makeNetworkError()\n responseObject[kRealm] = relevantRealm\n responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList\n responseObject[kHeaders][kGuard] = 'immutable'\n responseObject[kHeaders][kRealm] = relevantRealm\n return responseObject\n }\n\n // https://fetch.spec.whatwg.org/#dom-response-json\n static json (data, init = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'Response.json' })\n\n if (init !== null) {\n init = webidl.converters.ResponseInit(init)\n }\n\n // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data.\n const bytes = textEncoder.encode(\n serializeJavascriptValueToJSONString(data)\n )\n\n // 2. Let body be the result of extracting bytes.\n const body = extractBody(bytes)\n\n // 3. Let responseObject be the result of creating a Response object, given a new response,\n // \"response\", and this’s relevant Realm.\n const relevantRealm = { settingsObject: {} }\n const responseObject = new Response()\n responseObject[kRealm] = relevantRealm\n responseObject[kHeaders][kGuard] = 'response'\n responseObject[kHeaders][kRealm] = relevantRealm\n\n // 4. Perform initialize a response given responseObject, init, and (body, \"application/json\").\n initializeResponse(responseObject, init, { body: body[0], type: 'application/json' })\n\n // 5. Return responseObject.\n return responseObject\n }\n\n // Creates a redirect Response that redirects to url with status status.\n static redirect (url, status = 302) {\n const relevantRealm = { settingsObject: {} }\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'Response.redirect' })\n\n url = webidl.converters.USVString(url)\n status = webidl.converters['unsigned short'](status)\n\n // 1. Let parsedURL be the result of parsing url with current settings\n // object’s API base URL.\n // 2. If parsedURL is failure, then throw a TypeError.\n // TODO: base-URL?\n let parsedURL\n try {\n parsedURL = new URL(url, getGlobalOrigin())\n } catch (err) {\n throw Object.assign(new TypeError('Failed to parse URL from ' + url), {\n cause: err\n })\n }\n\n // 3. If status is not a redirect status, then throw a RangeError.\n if (!redirectStatusSet.has(status)) {\n throw new RangeError('Invalid status code ' + status)\n }\n\n // 4. Let responseObject be the result of creating a Response object,\n // given a new response, \"immutable\", and this’s relevant Realm.\n const responseObject = new Response()\n responseObject[kRealm] = relevantRealm\n responseObject[kHeaders][kGuard] = 'immutable'\n responseObject[kHeaders][kRealm] = relevantRealm\n\n // 5. Set responseObject’s response’s status to status.\n responseObject[kState].status = status\n\n // 6. Let value be parsedURL, serialized and isomorphic encoded.\n const value = isomorphicEncode(URLSerializer(parsedURL))\n\n // 7. Append `Location`/value to responseObject’s response’s header list.\n responseObject[kState].headersList.append('location', value)\n\n // 8. Return responseObject.\n return responseObject\n }\n\n // https://fetch.spec.whatwg.org/#dom-response\n constructor (body = null, init = {}) {\n if (body !== null) {\n body = webidl.converters.BodyInit(body)\n }\n\n init = webidl.converters.ResponseInit(init)\n\n // TODO\n this[kRealm] = { settingsObject: {} }\n\n // 1. Set this’s response to a new response.\n this[kState] = makeResponse({})\n\n // 2. Set this’s headers to a new Headers object with this’s relevant\n // Realm, whose header list is this’s response’s header list and guard\n // is \"response\".\n this[kHeaders] = new Headers()\n this[kHeaders][kGuard] = 'response'\n this[kHeaders][kHeadersList] = this[kState].headersList\n this[kHeaders][kRealm] = this[kRealm]\n\n // 3. Let bodyWithType be null.\n let bodyWithType = null\n\n // 4. If body is non-null, then set bodyWithType to the result of extracting body.\n if (body != null) {\n const [extractedBody, type] = extractBody(body)\n bodyWithType = { body: extractedBody, type }\n }\n\n // 5. Perform initialize a response given this, init, and bodyWithType.\n initializeResponse(this, init, bodyWithType)\n }\n\n // Returns response’s type, e.g., \"cors\".\n get type () {\n webidl.brandCheck(this, Response)\n\n // The type getter steps are to return this’s response’s type.\n return this[kState].type\n }\n\n // Returns response’s URL, if it has one; otherwise the empty string.\n get url () {\n webidl.brandCheck(this, Response)\n\n const urlList = this[kState].urlList\n\n // The url getter steps are to return the empty string if this’s\n // response’s URL is null; otherwise this’s response’s URL,\n // serialized with exclude fragment set to true.\n const url = urlList[urlList.length - 1] ?? null\n\n if (url === null) {\n return ''\n }\n\n return URLSerializer(url, true)\n }\n\n // Returns whether response was obtained through a redirect.\n get redirected () {\n webidl.brandCheck(this, Response)\n\n // The redirected getter steps are to return true if this’s response’s URL\n // list has more than one item; otherwise false.\n return this[kState].urlList.length > 1\n }\n\n // Returns response’s status.\n get status () {\n webidl.brandCheck(this, Response)\n\n // The status getter steps are to return this’s response’s status.\n return this[kState].status\n }\n\n // Returns whether response’s status is an ok status.\n get ok () {\n webidl.brandCheck(this, Response)\n\n // The ok getter steps are to return true if this’s response’s status is an\n // ok status; otherwise false.\n return this[kState].status >= 200 && this[kState].status <= 299\n }\n\n // Returns response’s status message.\n get statusText () {\n webidl.brandCheck(this, Response)\n\n // The statusText getter steps are to return this’s response’s status\n // message.\n return this[kState].statusText\n }\n\n // Returns response’s headers as Headers.\n get headers () {\n webidl.brandCheck(this, Response)\n\n // The headers getter steps are to return this’s headers.\n return this[kHeaders]\n }\n\n get body () {\n webidl.brandCheck(this, Response)\n\n return this[kState].body ? this[kState].body.stream : null\n }\n\n get bodyUsed () {\n webidl.brandCheck(this, Response)\n\n return !!this[kState].body && util.isDisturbed(this[kState].body.stream)\n }\n\n // Returns a clone of response.\n clone () {\n webidl.brandCheck(this, Response)\n\n // 1. If this is unusable, then throw a TypeError.\n if (this.bodyUsed || (this.body && this.body.locked)) {\n throw webidl.errors.exception({\n header: 'Response.clone',\n message: 'Body has already been consumed.'\n })\n }\n\n // 2. Let clonedResponse be the result of cloning this’s response.\n const clonedResponse = cloneResponse(this[kState])\n\n // 3. Return the result of creating a Response object, given\n // clonedResponse, this’s headers’s guard, and this’s relevant Realm.\n const clonedResponseObject = new Response()\n clonedResponseObject[kState] = clonedResponse\n clonedResponseObject[kRealm] = this[kRealm]\n clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList\n clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]\n clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]\n\n return clonedResponseObject\n }\n}\n\nmixinBody(Response)\n\nObject.defineProperties(Response.prototype, {\n type: kEnumerableProperty,\n url: kEnumerableProperty,\n status: kEnumerableProperty,\n ok: kEnumerableProperty,\n redirected: kEnumerableProperty,\n statusText: kEnumerableProperty,\n headers: kEnumerableProperty,\n clone: kEnumerableProperty,\n body: kEnumerableProperty,\n bodyUsed: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'Response',\n configurable: true\n }\n})\n\nObject.defineProperties(Response, {\n json: kEnumerableProperty,\n redirect: kEnumerableProperty,\n error: kEnumerableProperty\n})\n\n// https://fetch.spec.whatwg.org/#concept-response-clone\nfunction cloneResponse (response) {\n // To clone a response response, run these steps:\n\n // 1. If response is a filtered response, then return a new identical\n // filtered response whose internal response is a clone of response’s\n // internal response.\n if (response.internalResponse) {\n return filterResponse(\n cloneResponse(response.internalResponse),\n response.type\n )\n }\n\n // 2. Let newResponse be a copy of response, except for its body.\n const newResponse = makeResponse({ ...response, body: null })\n\n // 3. If response’s body is non-null, then set newResponse’s body to the\n // result of cloning response’s body.\n if (response.body != null) {\n newResponse.body = cloneBody(response.body)\n }\n\n // 4. Return newResponse.\n return newResponse\n}\n\nfunction makeResponse (init) {\n return {\n aborted: false,\n rangeRequested: false,\n timingAllowPassed: false,\n requestIncludesCredentials: false,\n type: 'default',\n status: 200,\n timingInfo: null,\n cacheState: '',\n statusText: '',\n ...init,\n headersList: init.headersList\n ? new HeadersList(init.headersList)\n : new HeadersList(),\n urlList: init.urlList ? [...init.urlList] : []\n }\n}\n\nfunction makeNetworkError (reason) {\n const isError = isErrorLike(reason)\n return makeResponse({\n type: 'error',\n status: 0,\n error: isError\n ? reason\n : new Error(reason ? String(reason) : reason),\n aborted: reason && reason.name === 'AbortError'\n })\n}\n\nfunction makeFilteredResponse (response, state) {\n state = {\n internalResponse: response,\n ...state\n }\n\n return new Proxy(response, {\n get (target, p) {\n return p in state ? state[p] : target[p]\n },\n set (target, p, value) {\n assert(!(p in state))\n target[p] = value\n return true\n }\n })\n}\n\n// https://fetch.spec.whatwg.org/#concept-filtered-response\nfunction filterResponse (response, type) {\n // Set response to the following filtered response with response as its\n // internal response, depending on request’s response tainting:\n if (type === 'basic') {\n // A basic filtered response is a filtered response whose type is \"basic\"\n // and header list excludes any headers in internal response’s header list\n // whose name is a forbidden response-header name.\n\n // Note: undici does not implement forbidden response-header names\n return makeFilteredResponse(response, {\n type: 'basic',\n headersList: response.headersList\n })\n } else if (type === 'cors') {\n // A CORS filtered response is a filtered response whose type is \"cors\"\n // and header list excludes any headers in internal response’s header\n // list whose name is not a CORS-safelisted response-header name, given\n // internal response’s CORS-exposed header-name list.\n\n // Note: undici does not implement CORS-safelisted response-header names\n return makeFilteredResponse(response, {\n type: 'cors',\n headersList: response.headersList\n })\n } else if (type === 'opaque') {\n // An opaque filtered response is a filtered response whose type is\n // \"opaque\", URL list is the empty list, status is 0, status message\n // is the empty byte sequence, header list is empty, and body is null.\n\n return makeFilteredResponse(response, {\n type: 'opaque',\n urlList: Object.freeze([]),\n status: 0,\n statusText: '',\n body: null\n })\n } else if (type === 'opaqueredirect') {\n // An opaque-redirect filtered response is a filtered response whose type\n // is \"opaqueredirect\", status is 0, status message is the empty byte\n // sequence, header list is empty, and body is null.\n\n return makeFilteredResponse(response, {\n type: 'opaqueredirect',\n status: 0,\n statusText: '',\n headersList: [],\n body: null\n })\n } else {\n assert(false)\n }\n}\n\n// https://fetch.spec.whatwg.org/#appropriate-network-error\nfunction makeAppropriateNetworkError (fetchParams, err = null) {\n // 1. Assert: fetchParams is canceled.\n assert(isCancelled(fetchParams))\n\n // 2. Return an aborted network error if fetchParams is aborted;\n // otherwise return a network error.\n return isAborted(fetchParams)\n ? makeNetworkError(Object.assign(new DOMException('The operation was aborted.', 'AbortError'), { cause: err }))\n : makeNetworkError(Object.assign(new DOMException('Request was cancelled.'), { cause: err }))\n}\n\n// https://whatpr.org/fetch/1392.html#initialize-a-response\nfunction initializeResponse (response, init, body) {\n // 1. If init[\"status\"] is not in the range 200 to 599, inclusive, then\n // throw a RangeError.\n if (init.status !== null && (init.status < 200 || init.status > 599)) {\n throw new RangeError('init[\"status\"] must be in the range of 200 to 599, inclusive.')\n }\n\n // 2. If init[\"statusText\"] does not match the reason-phrase token production,\n // then throw a TypeError.\n if ('statusText' in init && init.statusText != null) {\n // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2:\n // reason-phrase = *( HTAB / SP / VCHAR / obs-text )\n if (!isValidReasonPhrase(String(init.statusText))) {\n throw new TypeError('Invalid statusText')\n }\n }\n\n // 3. Set response’s response’s status to init[\"status\"].\n if ('status' in init && init.status != null) {\n response[kState].status = init.status\n }\n\n // 4. Set response’s response’s status message to init[\"statusText\"].\n if ('statusText' in init && init.statusText != null) {\n response[kState].statusText = init.statusText\n }\n\n // 5. If init[\"headers\"] exists, then fill response’s headers with init[\"headers\"].\n if ('headers' in init && init.headers != null) {\n fill(response[kHeaders], init.headers)\n }\n\n // 6. If body was given, then:\n if (body) {\n // 1. If response's status is a null body status, then throw a TypeError.\n if (nullBodyStatus.includes(response.status)) {\n throw webidl.errors.exception({\n header: 'Response constructor',\n message: 'Invalid response status code ' + response.status\n })\n }\n\n // 2. Set response's body to body's body.\n response[kState].body = body.body\n\n // 3. If body's type is non-null and response's header list does not contain\n // `Content-Type`, then append (`Content-Type`, body's type) to response's header list.\n if (body.type != null && !response[kState].headersList.contains('Content-Type')) {\n response[kState].headersList.append('content-type', body.type)\n }\n }\n}\n\nwebidl.converters.ReadableStream = webidl.interfaceConverter(\n ReadableStream\n)\n\nwebidl.converters.FormData = webidl.interfaceConverter(\n FormData\n)\n\nwebidl.converters.URLSearchParams = webidl.interfaceConverter(\n URLSearchParams\n)\n\n// https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit\nwebidl.converters.XMLHttpRequestBodyInit = function (V) {\n if (typeof V === 'string') {\n return webidl.converters.USVString(V)\n }\n\n if (isBlobLike(V)) {\n return webidl.converters.Blob(V, { strict: false })\n }\n\n if (\n types.isAnyArrayBuffer(V) ||\n types.isTypedArray(V) ||\n types.isDataView(V)\n ) {\n return webidl.converters.BufferSource(V)\n }\n\n if (util.isFormDataLike(V)) {\n return webidl.converters.FormData(V, { strict: false })\n }\n\n if (V instanceof URLSearchParams) {\n return webidl.converters.URLSearchParams(V)\n }\n\n return webidl.converters.DOMString(V)\n}\n\n// https://fetch.spec.whatwg.org/#bodyinit\nwebidl.converters.BodyInit = function (V) {\n if (V instanceof ReadableStream) {\n return webidl.converters.ReadableStream(V)\n }\n\n // Note: the spec doesn't include async iterables,\n // this is an undici extension.\n if (V?.[Symbol.asyncIterator]) {\n return V\n }\n\n return webidl.converters.XMLHttpRequestBodyInit(V)\n}\n\nwebidl.converters.ResponseInit = webidl.dictionaryConverter([\n {\n key: 'status',\n converter: webidl.converters['unsigned short'],\n defaultValue: 200\n },\n {\n key: 'statusText',\n converter: webidl.converters.ByteString,\n defaultValue: ''\n },\n {\n key: 'headers',\n converter: webidl.converters.HeadersInit\n }\n])\n\nmodule.exports = {\n makeNetworkError,\n makeResponse,\n makeAppropriateNetworkError,\n filterResponse,\n Response,\n cloneResponse\n}\n","'use strict'\n\nmodule.exports = {\n kUrl: Symbol('url'),\n kHeaders: Symbol('headers'),\n kSignal: Symbol('signal'),\n kState: Symbol('state'),\n kGuard: Symbol('guard'),\n kRealm: Symbol('realm')\n}\n","'use strict'\n\nconst { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require('./constants')\nconst { getGlobalOrigin } = require('./global')\nconst { performance } = require('perf_hooks')\nconst { isBlobLike, toUSVString, ReadableStreamFrom } = require('../core/util')\nconst assert = require('assert')\nconst { isUint8Array } = require('util/types')\n\n// https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable\n/** @type {import('crypto')|undefined} */\nlet crypto\n\ntry {\n crypto = require('crypto')\n} catch {\n\n}\n\nfunction responseURL (response) {\n // https://fetch.spec.whatwg.org/#responses\n // A response has an associated URL. It is a pointer to the last URL\n // in response’s URL list and null if response’s URL list is empty.\n const urlList = response.urlList\n const length = urlList.length\n return length === 0 ? null : urlList[length - 1].toString()\n}\n\n// https://fetch.spec.whatwg.org/#concept-response-location-url\nfunction responseLocationURL (response, requestFragment) {\n // 1. If response’s status is not a redirect status, then return null.\n if (!redirectStatusSet.has(response.status)) {\n return null\n }\n\n // 2. Let location be the result of extracting header list values given\n // `Location` and response’s header list.\n let location = response.headersList.get('location')\n\n // 3. If location is a header value, then set location to the result of\n // parsing location with response’s URL.\n if (location !== null && isValidHeaderValue(location)) {\n location = new URL(location, responseURL(response))\n }\n\n // 4. If location is a URL whose fragment is null, then set location’s\n // fragment to requestFragment.\n if (location && !location.hash) {\n location.hash = requestFragment\n }\n\n // 5. Return location.\n return location\n}\n\n/** @returns {URL} */\nfunction requestCurrentURL (request) {\n return request.urlList[request.urlList.length - 1]\n}\n\nfunction requestBadPort (request) {\n // 1. Let url be request’s current URL.\n const url = requestCurrentURL(request)\n\n // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port,\n // then return blocked.\n if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {\n return 'blocked'\n }\n\n // 3. Return allowed.\n return 'allowed'\n}\n\nfunction isErrorLike (object) {\n return object instanceof Error || (\n object?.constructor?.name === 'Error' ||\n object?.constructor?.name === 'DOMException'\n )\n}\n\n// Check whether |statusText| is a ByteString and\n// matches the Reason-Phrase token production.\n// RFC 2616: https://tools.ietf.org/html/rfc2616\n// RFC 7230: https://tools.ietf.org/html/rfc7230\n// \"reason-phrase = *( HTAB / SP / VCHAR / obs-text )\"\n// https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116\nfunction isValidReasonPhrase (statusText) {\n for (let i = 0; i < statusText.length; ++i) {\n const c = statusText.charCodeAt(i)\n if (\n !(\n (\n c === 0x09 || // HTAB\n (c >= 0x20 && c <= 0x7e) || // SP / VCHAR\n (c >= 0x80 && c <= 0xff)\n ) // obs-text\n )\n ) {\n return false\n }\n }\n return true\n}\n\nfunction isTokenChar (c) {\n return !(\n c >= 0x7f ||\n c <= 0x20 ||\n c === '(' ||\n c === ')' ||\n c === '<' ||\n c === '>' ||\n c === '@' ||\n c === ',' ||\n c === ';' ||\n c === ':' ||\n c === '\\\\' ||\n c === '\"' ||\n c === '/' ||\n c === '[' ||\n c === ']' ||\n c === '?' ||\n c === '=' ||\n c === '{' ||\n c === '}'\n )\n}\n\n// See RFC 7230, Section 3.2.6.\n// https://github.com/chromium/chromium/blob/d7da0240cae77824d1eda25745c4022757499131/third_party/blink/renderer/platform/network/http_parsers.cc#L321\nfunction isValidHTTPToken (characters) {\n if (!characters || typeof characters !== 'string') {\n return false\n }\n for (let i = 0; i < characters.length; ++i) {\n const c = characters.charCodeAt(i)\n if (c > 0x7f || !isTokenChar(c)) {\n return false\n }\n }\n return true\n}\n\n// https://fetch.spec.whatwg.org/#header-name\n// https://github.com/chromium/chromium/blob/b3d37e6f94f87d59e44662d6078f6a12de845d17/net/http/http_util.cc#L342\nfunction isValidHeaderName (potentialValue) {\n if (potentialValue.length === 0) {\n return false\n }\n\n return isValidHTTPToken(potentialValue)\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#header-value\n * @param {string} potentialValue\n */\nfunction isValidHeaderValue (potentialValue) {\n // - Has no leading or trailing HTTP tab or space bytes.\n // - Contains no 0x00 (NUL) or HTTP newline bytes.\n if (\n potentialValue.startsWith('\\t') ||\n potentialValue.startsWith(' ') ||\n potentialValue.endsWith('\\t') ||\n potentialValue.endsWith(' ')\n ) {\n return false\n }\n\n if (\n potentialValue.includes('\\0') ||\n potentialValue.includes('\\r') ||\n potentialValue.includes('\\n')\n ) {\n return false\n }\n\n return true\n}\n\n// https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect\nfunction setRequestReferrerPolicyOnRedirect (request, actualResponse) {\n // Given a request request and a response actualResponse, this algorithm\n // updates request’s referrer policy according to the Referrer-Policy\n // header (if any) in actualResponse.\n\n // 1. Let policy be the result of executing § 8.1 Parse a referrer policy\n // from a Referrer-Policy header on actualResponse.\n\n // 8.1 Parse a referrer policy from a Referrer-Policy header\n // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list.\n const { headersList } = actualResponse\n // 2. Let policy be the empty string.\n // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token.\n // 4. Return policy.\n const policyHeader = (headersList.get('referrer-policy') ?? '').split(',')\n\n // Note: As the referrer-policy can contain multiple policies\n // separated by comma, we need to loop through all of them\n // and pick the first valid one.\n // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy\n let policy = ''\n if (policyHeader.length > 0) {\n // The right-most policy takes precedence.\n // The left-most policy is the fallback.\n for (let i = policyHeader.length; i !== 0; i--) {\n const token = policyHeader[i - 1].trim()\n if (referrerPolicyTokens.has(token)) {\n policy = token\n break\n }\n }\n }\n\n // 2. If policy is not the empty string, then set request’s referrer policy to policy.\n if (policy !== '') {\n request.referrerPolicy = policy\n }\n}\n\n// https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check\nfunction crossOriginResourcePolicyCheck () {\n // TODO\n return 'allowed'\n}\n\n// https://fetch.spec.whatwg.org/#concept-cors-check\nfunction corsCheck () {\n // TODO\n return 'success'\n}\n\n// https://fetch.spec.whatwg.org/#concept-tao-check\nfunction TAOCheck () {\n // TODO\n return 'success'\n}\n\nfunction appendFetchMetadata (httpRequest) {\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header\n // TODO\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header\n\n // 1. Assert: r’s url is a potentially trustworthy URL.\n // TODO\n\n // 2. Let header be a Structured Header whose value is a token.\n let header = null\n\n // 3. Set header’s value to r’s mode.\n header = httpRequest.mode\n\n // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list.\n httpRequest.headersList.set('sec-fetch-mode', header)\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header\n // TODO\n\n // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header\n // TODO\n}\n\n// https://fetch.spec.whatwg.org/#append-a-request-origin-header\nfunction appendRequestOriginHeader (request) {\n // 1. Let serializedOrigin be the result of byte-serializing a request origin with request.\n let serializedOrigin = request.origin\n\n // 2. If request’s response tainting is \"cors\" or request’s mode is \"websocket\", then append (`Origin`, serializedOrigin) to request’s header list.\n if (request.responseTainting === 'cors' || request.mode === 'websocket') {\n if (serializedOrigin) {\n request.headersList.append('origin', serializedOrigin)\n }\n\n // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then:\n } else if (request.method !== 'GET' && request.method !== 'HEAD') {\n // 1. Switch on request’s referrer policy:\n switch (request.referrerPolicy) {\n case 'no-referrer':\n // Set serializedOrigin to `null`.\n serializedOrigin = null\n break\n case 'no-referrer-when-downgrade':\n case 'strict-origin':\n case 'strict-origin-when-cross-origin':\n // If request’s origin is a tuple origin, its scheme is \"https\", and request’s current URL’s scheme is not \"https\", then set serializedOrigin to `null`.\n if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) {\n serializedOrigin = null\n }\n break\n case 'same-origin':\n // If request’s origin is not same origin with request’s current URL’s origin, then set serializedOrigin to `null`.\n if (!sameOrigin(request, requestCurrentURL(request))) {\n serializedOrigin = null\n }\n break\n default:\n // Do nothing.\n }\n\n if (serializedOrigin) {\n // 2. Append (`Origin`, serializedOrigin) to request’s header list.\n request.headersList.append('origin', serializedOrigin)\n }\n }\n}\n\nfunction coarsenedSharedCurrentTime (crossOriginIsolatedCapability) {\n // TODO\n return performance.now()\n}\n\n// https://fetch.spec.whatwg.org/#create-an-opaque-timing-info\nfunction createOpaqueTimingInfo (timingInfo) {\n return {\n startTime: timingInfo.startTime ?? 0,\n redirectStartTime: 0,\n redirectEndTime: 0,\n postRedirectStartTime: timingInfo.startTime ?? 0,\n finalServiceWorkerStartTime: 0,\n finalNetworkResponseStartTime: 0,\n finalNetworkRequestStartTime: 0,\n endTime: 0,\n encodedBodySize: 0,\n decodedBodySize: 0,\n finalConnectionTimingInfo: null\n }\n}\n\n// https://html.spec.whatwg.org/multipage/origin.html#policy-container\nfunction makePolicyContainer () {\n // Note: the fetch spec doesn't make use of embedder policy or CSP list\n return {\n referrerPolicy: 'strict-origin-when-cross-origin'\n }\n}\n\n// https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container\nfunction clonePolicyContainer (policyContainer) {\n return {\n referrerPolicy: policyContainer.referrerPolicy\n }\n}\n\n// https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer\nfunction determineRequestsReferrer (request) {\n // 1. Let policy be request's referrer policy.\n const policy = request.referrerPolicy\n\n // Note: policy cannot (shouldn't) be null or an empty string.\n assert(policy)\n\n // 2. Let environment be request’s client.\n\n let referrerSource = null\n\n // 3. Switch on request’s referrer:\n if (request.referrer === 'client') {\n // Note: node isn't a browser and doesn't implement document/iframes,\n // so we bypass this step and replace it with our own.\n\n const globalOrigin = getGlobalOrigin()\n\n if (!globalOrigin || globalOrigin.origin === 'null') {\n return 'no-referrer'\n }\n\n // note: we need to clone it as it's mutated\n referrerSource = new URL(globalOrigin)\n } else if (request.referrer instanceof URL) {\n // Let referrerSource be request’s referrer.\n referrerSource = request.referrer\n }\n\n // 4. Let request’s referrerURL be the result of stripping referrerSource for\n // use as a referrer.\n let referrerURL = stripURLForReferrer(referrerSource)\n\n // 5. Let referrerOrigin be the result of stripping referrerSource for use as\n // a referrer, with the origin-only flag set to true.\n const referrerOrigin = stripURLForReferrer(referrerSource, true)\n\n // 6. If the result of serializing referrerURL is a string whose length is\n // greater than 4096, set referrerURL to referrerOrigin.\n if (referrerURL.toString().length > 4096) {\n referrerURL = referrerOrigin\n }\n\n const areSameOrigin = sameOrigin(request, referrerURL)\n const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) &&\n !isURLPotentiallyTrustworthy(request.url)\n\n // 8. Execute the switch statements corresponding to the value of policy:\n switch (policy) {\n case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true)\n case 'unsafe-url': return referrerURL\n case 'same-origin':\n return areSameOrigin ? referrerOrigin : 'no-referrer'\n case 'origin-when-cross-origin':\n return areSameOrigin ? referrerURL : referrerOrigin\n case 'strict-origin-when-cross-origin': {\n const currentURL = requestCurrentURL(request)\n\n // 1. If the origin of referrerURL and the origin of request’s current\n // URL are the same, then return referrerURL.\n if (sameOrigin(referrerURL, currentURL)) {\n return referrerURL\n }\n\n // 2. If referrerURL is a potentially trustworthy URL and request’s\n // current URL is not a potentially trustworthy URL, then return no\n // referrer.\n if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {\n return 'no-referrer'\n }\n\n // 3. Return referrerOrigin.\n return referrerOrigin\n }\n case 'strict-origin': // eslint-disable-line\n /**\n * 1. If referrerURL is a potentially trustworthy URL and\n * request’s current URL is not a potentially trustworthy URL,\n * then return no referrer.\n * 2. Return referrerOrigin\n */\n case 'no-referrer-when-downgrade': // eslint-disable-line\n /**\n * 1. If referrerURL is a potentially trustworthy URL and\n * request’s current URL is not a potentially trustworthy URL,\n * then return no referrer.\n * 2. Return referrerOrigin\n */\n\n default: // eslint-disable-line\n return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin\n }\n}\n\n/**\n * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url\n * @param {URL} url\n * @param {boolean|undefined} originOnly\n */\nfunction stripURLForReferrer (url, originOnly) {\n // 1. Assert: url is a URL.\n assert(url instanceof URL)\n\n // 2. If url’s scheme is a local scheme, then return no referrer.\n if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') {\n return 'no-referrer'\n }\n\n // 3. Set url’s username to the empty string.\n url.username = ''\n\n // 4. Set url’s password to the empty string.\n url.password = ''\n\n // 5. Set url’s fragment to null.\n url.hash = ''\n\n // 6. If the origin-only flag is true, then:\n if (originOnly) {\n // 1. Set url’s path to « the empty string ».\n url.pathname = ''\n\n // 2. Set url’s query to null.\n url.search = ''\n }\n\n // 7. Return url.\n return url\n}\n\nfunction isURLPotentiallyTrustworthy (url) {\n if (!(url instanceof URL)) {\n return false\n }\n\n // If child of about, return true\n if (url.href === 'about:blank' || url.href === 'about:srcdoc') {\n return true\n }\n\n // If scheme is data, return true\n if (url.protocol === 'data:') return true\n\n // If file, return true\n if (url.protocol === 'file:') return true\n\n return isOriginPotentiallyTrustworthy(url.origin)\n\n function isOriginPotentiallyTrustworthy (origin) {\n // If origin is explicitly null, return false\n if (origin == null || origin === 'null') return false\n\n const originAsURL = new URL(origin)\n\n // If secure, return true\n if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') {\n return true\n }\n\n // If localhost or variants, return true\n if (/^127(?:\\.[0-9]+){0,2}\\.[0-9]+$|^\\[(?:0*:)*?:?0*1\\]$/.test(originAsURL.hostname) ||\n (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) ||\n (originAsURL.hostname.endsWith('.localhost'))) {\n return true\n }\n\n // If any other, return false\n return false\n }\n}\n\n/**\n * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist\n * @param {Uint8Array} bytes\n * @param {string} metadataList\n */\nfunction bytesMatch (bytes, metadataList) {\n // If node is not built with OpenSSL support, we cannot check\n // a request's integrity, so allow it by default (the spec will\n // allow requests if an invalid hash is given, as precedence).\n /* istanbul ignore if: only if node is built with --without-ssl */\n if (crypto === undefined) {\n return true\n }\n\n // 1. Let parsedMetadata be the result of parsing metadataList.\n const parsedMetadata = parseMetadata(metadataList)\n\n // 2. If parsedMetadata is no metadata, return true.\n if (parsedMetadata === 'no metadata') {\n return true\n }\n\n // 3. If parsedMetadata is the empty set, return true.\n if (parsedMetadata.length === 0) {\n return true\n }\n\n // 4. Let metadata be the result of getting the strongest\n // metadata from parsedMetadata.\n const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo))\n // get the strongest algorithm\n const strongest = list[0].algo\n // get all entries that use the strongest algorithm; ignore weaker\n const metadata = list.filter((item) => item.algo === strongest)\n\n // 5. For each item in metadata:\n for (const item of metadata) {\n // 1. Let algorithm be the alg component of item.\n const algorithm = item.algo\n\n // 2. Let expectedValue be the val component of item.\n let expectedValue = item.hash\n\n // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e\n // \"be liberal with padding\". This is annoying, and it's not even in the spec.\n\n if (expectedValue.endsWith('==')) {\n expectedValue = expectedValue.slice(0, -2)\n }\n\n // 3. Let actualValue be the result of applying algorithm to bytes.\n let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64')\n\n if (actualValue.endsWith('==')) {\n actualValue = actualValue.slice(0, -2)\n }\n\n // 4. If actualValue is a case-sensitive match for expectedValue,\n // return true.\n if (actualValue === expectedValue) {\n return true\n }\n\n let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest('base64url')\n\n if (actualBase64URL.endsWith('==')) {\n actualBase64URL = actualBase64URL.slice(0, -2)\n }\n\n if (actualBase64URL === expectedValue) {\n return true\n }\n }\n\n // 6. Return false.\n return false\n}\n\n// https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options\n// https://www.w3.org/TR/CSP2/#source-list-syntax\n// https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1\nconst parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\\x21-\\x7e]?)?/i\n\n/**\n * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata\n * @param {string} metadata\n */\nfunction parseMetadata (metadata) {\n // 1. Let result be the empty set.\n /** @type {{ algo: string, hash: string }[]} */\n const result = []\n\n // 2. Let empty be equal to true.\n let empty = true\n\n const supportedHashes = crypto.getHashes()\n\n // 3. For each token returned by splitting metadata on spaces:\n for (const token of metadata.split(' ')) {\n // 1. Set empty to false.\n empty = false\n\n // 2. Parse token as a hash-with-options.\n const parsedToken = parseHashWithOptions.exec(token)\n\n // 3. If token does not parse, continue to the next token.\n if (parsedToken === null || parsedToken.groups === undefined) {\n // Note: Chromium blocks the request at this point, but Firefox\n // gives a warning that an invalid integrity was given. The\n // correct behavior is to ignore these, and subsequently not\n // check the integrity of the resource.\n continue\n }\n\n // 4. Let algorithm be the hash-algo component of token.\n const algorithm = parsedToken.groups.algo\n\n // 5. If algorithm is a hash function recognized by the user\n // agent, add the parsed token to result.\n if (supportedHashes.includes(algorithm.toLowerCase())) {\n result.push(parsedToken.groups)\n }\n }\n\n // 4. Return no metadata if empty is true, otherwise return result.\n if (empty === true) {\n return 'no metadata'\n }\n\n return result\n}\n\n// https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request\nfunction tryUpgradeRequestToAPotentiallyTrustworthyURL (request) {\n // TODO\n}\n\n/**\n * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin}\n * @param {URL} A\n * @param {URL} B\n */\nfunction sameOrigin (A, B) {\n // 1. If A and B are the same opaque origin, then return true.\n if (A.origin === B.origin && A.origin === 'null') {\n return true\n }\n\n // 2. If A and B are both tuple origins and their schemes,\n // hosts, and port are identical, then return true.\n if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) {\n return true\n }\n\n // 3. Return false.\n return false\n}\n\nfunction createDeferredPromise () {\n let res\n let rej\n const promise = new Promise((resolve, reject) => {\n res = resolve\n rej = reject\n })\n\n return { promise, resolve: res, reject: rej }\n}\n\nfunction isAborted (fetchParams) {\n return fetchParams.controller.state === 'aborted'\n}\n\nfunction isCancelled (fetchParams) {\n return fetchParams.controller.state === 'aborted' ||\n fetchParams.controller.state === 'terminated'\n}\n\n// https://fetch.spec.whatwg.org/#concept-method-normalize\nfunction normalizeMethod (method) {\n return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method)\n ? method.toUpperCase()\n : method\n}\n\n// https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string\nfunction serializeJavascriptValueToJSONString (value) {\n // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »).\n const result = JSON.stringify(value)\n\n // 2. If result is undefined, then throw a TypeError.\n if (result === undefined) {\n throw new TypeError('Value is not JSON serializable')\n }\n\n // 3. Assert: result is a string.\n assert(typeof result === 'string')\n\n // 4. Return result.\n return result\n}\n\n// https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object\nconst esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))\n\n/**\n * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object\n * @param {() => unknown[]} iterator\n * @param {string} name name of the instance\n * @param {'key'|'value'|'key+value'} kind\n */\nfunction makeIterator (iterator, name, kind) {\n const object = {\n index: 0,\n kind,\n target: iterator\n }\n\n const i = {\n next () {\n // 1. Let interface be the interface for which the iterator prototype object exists.\n\n // 2. Let thisValue be the this value.\n\n // 3. Let object be ? ToObject(thisValue).\n\n // 4. If object is a platform object, then perform a security\n // check, passing:\n\n // 5. If object is not a default iterator object for interface,\n // then throw a TypeError.\n if (Object.getPrototypeOf(this) !== i) {\n throw new TypeError(\n `'next' called on an object that does not implement interface ${name} Iterator.`\n )\n }\n\n // 6. Let index be object’s index.\n // 7. Let kind be object’s kind.\n // 8. Let values be object’s target's value pairs to iterate over.\n const { index, kind, target } = object\n const values = target()\n\n // 9. Let len be the length of values.\n const len = values.length\n\n // 10. If index is greater than or equal to len, then return\n // CreateIterResultObject(undefined, true).\n if (index >= len) {\n return { value: undefined, done: true }\n }\n\n // 11. Let pair be the entry in values at index index.\n const pair = values[index]\n\n // 12. Set object’s index to index + 1.\n object.index = index + 1\n\n // 13. Return the iterator result for pair and kind.\n return iteratorResult(pair, kind)\n },\n // The class string of an iterator prototype object for a given interface is the\n // result of concatenating the identifier of the interface and the string \" Iterator\".\n [Symbol.toStringTag]: `${name} Iterator`\n }\n\n // The [[Prototype]] internal slot of an iterator prototype object must be %IteratorPrototype%.\n Object.setPrototypeOf(i, esIteratorPrototype)\n // esIteratorPrototype needs to be the prototype of i\n // which is the prototype of an empty object. Yes, it's confusing.\n return Object.setPrototypeOf({}, i)\n}\n\n// https://webidl.spec.whatwg.org/#iterator-result\nfunction iteratorResult (pair, kind) {\n let result\n\n // 1. Let result be a value determined by the value of kind:\n switch (kind) {\n case 'key': {\n // 1. Let idlKey be pair’s key.\n // 2. Let key be the result of converting idlKey to an\n // ECMAScript value.\n // 3. result is key.\n result = pair[0]\n break\n }\n case 'value': {\n // 1. Let idlValue be pair’s value.\n // 2. Let value be the result of converting idlValue to\n // an ECMAScript value.\n // 3. result is value.\n result = pair[1]\n break\n }\n case 'key+value': {\n // 1. Let idlKey be pair’s key.\n // 2. Let idlValue be pair’s value.\n // 3. Let key be the result of converting idlKey to an\n // ECMAScript value.\n // 4. Let value be the result of converting idlValue to\n // an ECMAScript value.\n // 5. Let array be ! ArrayCreate(2).\n // 6. Call ! CreateDataProperty(array, \"0\", key).\n // 7. Call ! CreateDataProperty(array, \"1\", value).\n // 8. result is array.\n result = pair\n break\n }\n }\n\n // 2. Return CreateIterResultObject(result, false).\n return { value: result, done: false }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#body-fully-read\n */\nasync function fullyReadBody (body, processBody, processBodyError) {\n // 1. If taskDestination is null, then set taskDestination to\n // the result of starting a new parallel queue.\n\n // 2. Let successSteps given a byte sequence bytes be to queue a\n // fetch task to run processBody given bytes, with taskDestination.\n const successSteps = processBody\n\n // 3. Let errorSteps be to queue a fetch task to run processBodyError,\n // with taskDestination.\n const errorSteps = processBodyError\n\n // 4. Let reader be the result of getting a reader for body’s stream.\n // If that threw an exception, then run errorSteps with that\n // exception and return.\n let reader\n\n try {\n reader = body.stream.getReader()\n } catch (e) {\n errorSteps(e)\n return\n }\n\n // 5. Read all bytes from reader, given successSteps and errorSteps.\n try {\n const result = await readAllBytes(reader)\n successSteps(result)\n } catch (e) {\n errorSteps(e)\n }\n}\n\n/** @type {ReadableStream} */\nlet ReadableStream = globalThis.ReadableStream\n\nfunction isReadableStreamLike (stream) {\n if (!ReadableStream) {\n ReadableStream = require('stream/web').ReadableStream\n }\n\n return stream instanceof ReadableStream || (\n stream[Symbol.toStringTag] === 'ReadableStream' &&\n typeof stream.tee === 'function'\n )\n}\n\nconst MAXIMUM_ARGUMENT_LENGTH = 65535\n\n/**\n * @see https://infra.spec.whatwg.org/#isomorphic-decode\n * @param {number[]|Uint8Array} input\n */\nfunction isomorphicDecode (input) {\n // 1. To isomorphic decode a byte sequence input, return a string whose code point\n // length is equal to input’s length and whose code points have the same values\n // as the values of input’s bytes, in the same order.\n\n if (input.length < MAXIMUM_ARGUMENT_LENGTH) {\n return String.fromCharCode(...input)\n }\n\n return input.reduce((previous, current) => previous + String.fromCharCode(current), '')\n}\n\n/**\n * @param {ReadableStreamController} controller\n */\nfunction readableStreamClose (controller) {\n try {\n controller.close()\n } catch (err) {\n // TODO: add comment explaining why this error occurs.\n if (!err.message.includes('Controller is already closed')) {\n throw err\n }\n }\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#isomorphic-encode\n * @param {string} input\n */\nfunction isomorphicEncode (input) {\n // 1. Assert: input contains no code points greater than U+00FF.\n for (let i = 0; i < input.length; i++) {\n assert(input.charCodeAt(i) <= 0xFF)\n }\n\n // 2. Return a byte sequence whose length is equal to input’s code\n // point length and whose bytes have the same values as the\n // values of input’s code points, in the same order\n return input\n}\n\n/**\n * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes\n * @see https://streams.spec.whatwg.org/#read-loop\n * @param {ReadableStreamDefaultReader} reader\n */\nasync function readAllBytes (reader) {\n const bytes = []\n let byteLength = 0\n\n while (true) {\n const { done, value: chunk } = await reader.read()\n\n if (done) {\n // 1. Call successSteps with bytes.\n return Buffer.concat(bytes, byteLength)\n }\n\n // 1. If chunk is not a Uint8Array object, call failureSteps\n // with a TypeError and abort these steps.\n if (!isUint8Array(chunk)) {\n throw new TypeError('Received non-Uint8Array chunk')\n }\n\n // 2. Append the bytes represented by chunk to bytes.\n bytes.push(chunk)\n byteLength += chunk.length\n\n // 3. Read-loop given reader, bytes, successSteps, and failureSteps.\n }\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#is-local\n * @param {URL} url\n */\nfunction urlIsLocal (url) {\n assert('protocol' in url) // ensure it's a url object\n\n const protocol = url.protocol\n\n return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:'\n}\n\n/**\n * @param {string|URL} url\n */\nfunction urlHasHttpsScheme (url) {\n if (typeof url === 'string') {\n return url.startsWith('https:')\n }\n\n return url.protocol === 'https:'\n}\n\n/**\n * @see https://fetch.spec.whatwg.org/#http-scheme\n * @param {URL} url\n */\nfunction urlIsHttpHttpsScheme (url) {\n assert('protocol' in url) // ensure it's a url object\n\n const protocol = url.protocol\n\n return protocol === 'http:' || protocol === 'https:'\n}\n\n/**\n * Fetch supports node >= 16.8.0, but Object.hasOwn was added in v16.9.0.\n */\nconst hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key))\n\nmodule.exports = {\n isAborted,\n isCancelled,\n createDeferredPromise,\n ReadableStreamFrom,\n toUSVString,\n tryUpgradeRequestToAPotentiallyTrustworthyURL,\n coarsenedSharedCurrentTime,\n determineRequestsReferrer,\n makePolicyContainer,\n clonePolicyContainer,\n appendFetchMetadata,\n appendRequestOriginHeader,\n TAOCheck,\n corsCheck,\n crossOriginResourcePolicyCheck,\n createOpaqueTimingInfo,\n setRequestReferrerPolicyOnRedirect,\n isValidHTTPToken,\n requestBadPort,\n requestCurrentURL,\n responseURL,\n responseLocationURL,\n isBlobLike,\n isURLPotentiallyTrustworthy,\n isValidReasonPhrase,\n sameOrigin,\n normalizeMethod,\n serializeJavascriptValueToJSONString,\n makeIterator,\n isValidHeaderName,\n isValidHeaderValue,\n hasOwn,\n isErrorLike,\n fullyReadBody,\n bytesMatch,\n isReadableStreamLike,\n readableStreamClose,\n isomorphicEncode,\n isomorphicDecode,\n urlIsLocal,\n urlHasHttpsScheme,\n urlIsHttpHttpsScheme,\n readAllBytes\n}\n","'use strict'\n\nconst { types } = require('util')\nconst { hasOwn, toUSVString } = require('./util')\n\n/** @type {import('../../types/webidl').Webidl} */\nconst webidl = {}\nwebidl.converters = {}\nwebidl.util = {}\nwebidl.errors = {}\n\nwebidl.errors.exception = function (message) {\n return new TypeError(`${message.header}: ${message.message}`)\n}\n\nwebidl.errors.conversionFailed = function (context) {\n const plural = context.types.length === 1 ? '' : ' one of'\n const message =\n `${context.argument} could not be converted to` +\n `${plural}: ${context.types.join(', ')}.`\n\n return webidl.errors.exception({\n header: context.prefix,\n message\n })\n}\n\nwebidl.errors.invalidArgument = function (context) {\n return webidl.errors.exception({\n header: context.prefix,\n message: `\"${context.value}\" is an invalid ${context.type}.`\n })\n}\n\n// https://webidl.spec.whatwg.org/#implements\nwebidl.brandCheck = function (V, I, opts = undefined) {\n if (opts?.strict !== false && !(V instanceof I)) {\n throw new TypeError('Illegal invocation')\n } else {\n return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag]\n }\n}\n\nwebidl.argumentLengthCheck = function ({ length }, min, ctx) {\n if (length < min) {\n throw webidl.errors.exception({\n message: `${min} argument${min !== 1 ? 's' : ''} required, ` +\n `but${length ? ' only' : ''} ${length} found.`,\n ...ctx\n })\n }\n}\n\nwebidl.illegalConstructor = function () {\n throw webidl.errors.exception({\n header: 'TypeError',\n message: 'Illegal constructor'\n })\n}\n\n// https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values\nwebidl.util.Type = function (V) {\n switch (typeof V) {\n case 'undefined': return 'Undefined'\n case 'boolean': return 'Boolean'\n case 'string': return 'String'\n case 'symbol': return 'Symbol'\n case 'number': return 'Number'\n case 'bigint': return 'BigInt'\n case 'function':\n case 'object': {\n if (V === null) {\n return 'Null'\n }\n\n return 'Object'\n }\n }\n}\n\n// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint\nwebidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) {\n let upperBound\n let lowerBound\n\n // 1. If bitLength is 64, then:\n if (bitLength === 64) {\n // 1. Let upperBound be 2^53 − 1.\n upperBound = Math.pow(2, 53) - 1\n\n // 2. If signedness is \"unsigned\", then let lowerBound be 0.\n if (signedness === 'unsigned') {\n lowerBound = 0\n } else {\n // 3. Otherwise let lowerBound be −2^53 + 1.\n lowerBound = Math.pow(-2, 53) + 1\n }\n } else if (signedness === 'unsigned') {\n // 2. Otherwise, if signedness is \"unsigned\", then:\n\n // 1. Let lowerBound be 0.\n lowerBound = 0\n\n // 2. Let upperBound be 2^bitLength − 1.\n upperBound = Math.pow(2, bitLength) - 1\n } else {\n // 3. Otherwise:\n\n // 1. Let lowerBound be -2^bitLength − 1.\n lowerBound = Math.pow(-2, bitLength) - 1\n\n // 2. Let upperBound be 2^bitLength − 1 − 1.\n upperBound = Math.pow(2, bitLength - 1) - 1\n }\n\n // 4. Let x be ? ToNumber(V).\n let x = Number(V)\n\n // 5. If x is −0, then set x to +0.\n if (x === 0) {\n x = 0\n }\n\n // 6. If the conversion is to an IDL type associated\n // with the [EnforceRange] extended attribute, then:\n if (opts.enforceRange === true) {\n // 1. If x is NaN, +∞, or −∞, then throw a TypeError.\n if (\n Number.isNaN(x) ||\n x === Number.POSITIVE_INFINITY ||\n x === Number.NEGATIVE_INFINITY\n ) {\n throw webidl.errors.exception({\n header: 'Integer conversion',\n message: `Could not convert ${V} to an integer.`\n })\n }\n\n // 2. Set x to IntegerPart(x).\n x = webidl.util.IntegerPart(x)\n\n // 3. If x < lowerBound or x > upperBound, then\n // throw a TypeError.\n if (x < lowerBound || x > upperBound) {\n throw webidl.errors.exception({\n header: 'Integer conversion',\n message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.`\n })\n }\n\n // 4. Return x.\n return x\n }\n\n // 7. If x is not NaN and the conversion is to an IDL\n // type associated with the [Clamp] extended\n // attribute, then:\n if (!Number.isNaN(x) && opts.clamp === true) {\n // 1. Set x to min(max(x, lowerBound), upperBound).\n x = Math.min(Math.max(x, lowerBound), upperBound)\n\n // 2. Round x to the nearest integer, choosing the\n // even integer if it lies halfway between two,\n // and choosing +0 rather than −0.\n if (Math.floor(x) % 2 === 0) {\n x = Math.floor(x)\n } else {\n x = Math.ceil(x)\n }\n\n // 3. Return x.\n return x\n }\n\n // 8. If x is NaN, +0, +∞, or −∞, then return +0.\n if (\n Number.isNaN(x) ||\n (x === 0 && Object.is(0, x)) ||\n x === Number.POSITIVE_INFINITY ||\n x === Number.NEGATIVE_INFINITY\n ) {\n return 0\n }\n\n // 9. Set x to IntegerPart(x).\n x = webidl.util.IntegerPart(x)\n\n // 10. Set x to x modulo 2^bitLength.\n x = x % Math.pow(2, bitLength)\n\n // 11. If signedness is \"signed\" and x ≥ 2^bitLength − 1,\n // then return x − 2^bitLength.\n if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) {\n return x - Math.pow(2, bitLength)\n }\n\n // 12. Otherwise, return x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#abstract-opdef-integerpart\nwebidl.util.IntegerPart = function (n) {\n // 1. Let r be floor(abs(n)).\n const r = Math.floor(Math.abs(n))\n\n // 2. If n < 0, then return -1 × r.\n if (n < 0) {\n return -1 * r\n }\n\n // 3. Otherwise, return r.\n return r\n}\n\n// https://webidl.spec.whatwg.org/#es-sequence\nwebidl.sequenceConverter = function (converter) {\n return (V) => {\n // 1. If Type(V) is not Object, throw a TypeError.\n if (webidl.util.Type(V) !== 'Object') {\n throw webidl.errors.exception({\n header: 'Sequence',\n message: `Value of type ${webidl.util.Type(V)} is not an Object.`\n })\n }\n\n // 2. Let method be ? GetMethod(V, @@iterator).\n /** @type {Generator} */\n const method = V?.[Symbol.iterator]?.()\n const seq = []\n\n // 3. If method is undefined, throw a TypeError.\n if (\n method === undefined ||\n typeof method.next !== 'function'\n ) {\n throw webidl.errors.exception({\n header: 'Sequence',\n message: 'Object is not an iterator.'\n })\n }\n\n // https://webidl.spec.whatwg.org/#create-sequence-from-iterable\n while (true) {\n const { done, value } = method.next()\n\n if (done) {\n break\n }\n\n seq.push(converter(value))\n }\n\n return seq\n }\n}\n\n// https://webidl.spec.whatwg.org/#es-to-record\nwebidl.recordConverter = function (keyConverter, valueConverter) {\n return (O) => {\n // 1. If Type(O) is not Object, throw a TypeError.\n if (webidl.util.Type(O) !== 'Object') {\n throw webidl.errors.exception({\n header: 'Record',\n message: `Value of type ${webidl.util.Type(O)} is not an Object.`\n })\n }\n\n // 2. Let result be a new empty instance of record.\n const result = {}\n\n if (!types.isProxy(O)) {\n // Object.keys only returns enumerable properties\n const keys = Object.keys(O)\n\n for (const key of keys) {\n // 1. Let typedKey be key converted to an IDL value of type K.\n const typedKey = keyConverter(key)\n\n // 2. Let value be ? Get(O, key).\n // 3. Let typedValue be value converted to an IDL value of type V.\n const typedValue = valueConverter(O[key])\n\n // 4. Set result[typedKey] to typedValue.\n result[typedKey] = typedValue\n }\n\n // 5. Return result.\n return result\n }\n\n // 3. Let keys be ? O.[[OwnPropertyKeys]]().\n const keys = Reflect.ownKeys(O)\n\n // 4. For each key of keys.\n for (const key of keys) {\n // 1. Let desc be ? O.[[GetOwnProperty]](key).\n const desc = Reflect.getOwnPropertyDescriptor(O, key)\n\n // 2. If desc is not undefined and desc.[[Enumerable]] is true:\n if (desc?.enumerable) {\n // 1. Let typedKey be key converted to an IDL value of type K.\n const typedKey = keyConverter(key)\n\n // 2. Let value be ? Get(O, key).\n // 3. Let typedValue be value converted to an IDL value of type V.\n const typedValue = valueConverter(O[key])\n\n // 4. Set result[typedKey] to typedValue.\n result[typedKey] = typedValue\n }\n }\n\n // 5. Return result.\n return result\n }\n}\n\nwebidl.interfaceConverter = function (i) {\n return (V, opts = {}) => {\n if (opts.strict !== false && !(V instanceof i)) {\n throw webidl.errors.exception({\n header: i.name,\n message: `Expected ${V} to be an instance of ${i.name}.`\n })\n }\n\n return V\n }\n}\n\nwebidl.dictionaryConverter = function (converters) {\n return (dictionary) => {\n const type = webidl.util.Type(dictionary)\n const dict = {}\n\n if (type === 'Null' || type === 'Undefined') {\n return dict\n } else if (type !== 'Object') {\n throw webidl.errors.exception({\n header: 'Dictionary',\n message: `Expected ${dictionary} to be one of: Null, Undefined, Object.`\n })\n }\n\n for (const options of converters) {\n const { key, defaultValue, required, converter } = options\n\n if (required === true) {\n if (!hasOwn(dictionary, key)) {\n throw webidl.errors.exception({\n header: 'Dictionary',\n message: `Missing required key \"${key}\".`\n })\n }\n }\n\n let value = dictionary[key]\n const hasDefault = hasOwn(options, 'defaultValue')\n\n // Only use defaultValue if value is undefined and\n // a defaultValue options was provided.\n if (hasDefault && value !== null) {\n value = value ?? defaultValue\n }\n\n // A key can be optional and have no default value.\n // When this happens, do not perform a conversion,\n // and do not assign the key a value.\n if (required || hasDefault || value !== undefined) {\n value = converter(value)\n\n if (\n options.allowedValues &&\n !options.allowedValues.includes(value)\n ) {\n throw webidl.errors.exception({\n header: 'Dictionary',\n message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.`\n })\n }\n\n dict[key] = value\n }\n }\n\n return dict\n }\n}\n\nwebidl.nullableConverter = function (converter) {\n return (V) => {\n if (V === null) {\n return V\n }\n\n return converter(V)\n }\n}\n\n// https://webidl.spec.whatwg.org/#es-DOMString\nwebidl.converters.DOMString = function (V, opts = {}) {\n // 1. If V is null and the conversion is to an IDL type\n // associated with the [LegacyNullToEmptyString]\n // extended attribute, then return the DOMString value\n // that represents the empty string.\n if (V === null && opts.legacyNullToEmptyString) {\n return ''\n }\n\n // 2. Let x be ? ToString(V).\n if (typeof V === 'symbol') {\n throw new TypeError('Could not convert argument of type symbol to string.')\n }\n\n // 3. Return the IDL DOMString value that represents the\n // same sequence of code units as the one the\n // ECMAScript String value x represents.\n return String(V)\n}\n\n// https://webidl.spec.whatwg.org/#es-ByteString\nwebidl.converters.ByteString = function (V) {\n // 1. Let x be ? ToString(V).\n // Note: DOMString converter perform ? ToString(V)\n const x = webidl.converters.DOMString(V)\n\n // 2. If the value of any element of x is greater than\n // 255, then throw a TypeError.\n for (let index = 0; index < x.length; index++) {\n const charCode = x.charCodeAt(index)\n\n if (charCode > 255) {\n throw new TypeError(\n 'Cannot convert argument to a ByteString because the character at ' +\n `index ${index} has a value of ${charCode} which is greater than 255.`\n )\n }\n }\n\n // 3. Return an IDL ByteString value whose length is the\n // length of x, and where the value of each element is\n // the value of the corresponding element of x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-USVString\nwebidl.converters.USVString = toUSVString\n\n// https://webidl.spec.whatwg.org/#es-boolean\nwebidl.converters.boolean = function (V) {\n // 1. Let x be the result of computing ToBoolean(V).\n const x = Boolean(V)\n\n // 2. Return the IDL boolean value that is the one that represents\n // the same truth value as the ECMAScript Boolean value x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-any\nwebidl.converters.any = function (V) {\n return V\n}\n\n// https://webidl.spec.whatwg.org/#es-long-long\nwebidl.converters['long long'] = function (V) {\n // 1. Let x be ? ConvertToInt(V, 64, \"signed\").\n const x = webidl.util.ConvertToInt(V, 64, 'signed')\n\n // 2. Return the IDL long long value that represents\n // the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-long-long\nwebidl.converters['unsigned long long'] = function (V) {\n // 1. Let x be ? ConvertToInt(V, 64, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 64, 'unsigned')\n\n // 2. Return the IDL unsigned long long value that\n // represents the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-long\nwebidl.converters['unsigned long'] = function (V) {\n // 1. Let x be ? ConvertToInt(V, 32, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 32, 'unsigned')\n\n // 2. Return the IDL unsigned long value that\n // represents the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#es-unsigned-short\nwebidl.converters['unsigned short'] = function (V, opts) {\n // 1. Let x be ? ConvertToInt(V, 16, \"unsigned\").\n const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts)\n\n // 2. Return the IDL unsigned short value that represents\n // the same numeric value as x.\n return x\n}\n\n// https://webidl.spec.whatwg.org/#idl-ArrayBuffer\nwebidl.converters.ArrayBuffer = function (V, opts = {}) {\n // 1. If Type(V) is not Object, or V does not have an\n // [[ArrayBufferData]] internal slot, then throw a\n // TypeError.\n // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances\n // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances\n if (\n webidl.util.Type(V) !== 'Object' ||\n !types.isAnyArrayBuffer(V)\n ) {\n throw webidl.errors.conversionFailed({\n prefix: `${V}`,\n argument: `${V}`,\n types: ['ArrayBuffer']\n })\n }\n\n // 2. If the conversion is not to an IDL type associated\n // with the [AllowShared] extended attribute, and\n // IsSharedArrayBuffer(V) is true, then throw a\n // TypeError.\n if (opts.allowShared === false && types.isSharedArrayBuffer(V)) {\n throw webidl.errors.exception({\n header: 'ArrayBuffer',\n message: 'SharedArrayBuffer is not allowed.'\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V) is true, then throw a\n // TypeError.\n // Note: resizable ArrayBuffers are currently a proposal.\n\n // 4. Return the IDL ArrayBuffer value that is a\n // reference to the same object as V.\n return V\n}\n\nwebidl.converters.TypedArray = function (V, T, opts = {}) {\n // 1. Let T be the IDL type V is being converted to.\n\n // 2. If Type(V) is not Object, or V does not have a\n // [[TypedArrayName]] internal slot with a value\n // equal to T’s name, then throw a TypeError.\n if (\n webidl.util.Type(V) !== 'Object' ||\n !types.isTypedArray(V) ||\n V.constructor.name !== T.name\n ) {\n throw webidl.errors.conversionFailed({\n prefix: `${T.name}`,\n argument: `${V}`,\n types: [T.name]\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowShared] extended attribute, and\n // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: 'ArrayBuffer',\n message: 'SharedArrayBuffer is not allowed.'\n })\n }\n\n // 4. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n // Note: resizable array buffers are currently a proposal\n\n // 5. Return the IDL value of type T that is a reference\n // to the same object as V.\n return V\n}\n\nwebidl.converters.DataView = function (V, opts = {}) {\n // 1. If Type(V) is not Object, or V does not have a\n // [[DataView]] internal slot, then throw a TypeError.\n if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) {\n throw webidl.errors.exception({\n header: 'DataView',\n message: 'Object is not a DataView.'\n })\n }\n\n // 2. If the conversion is not to an IDL type associated\n // with the [AllowShared] extended attribute, and\n // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true,\n // then throw a TypeError.\n if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {\n throw webidl.errors.exception({\n header: 'ArrayBuffer',\n message: 'SharedArrayBuffer is not allowed.'\n })\n }\n\n // 3. If the conversion is not to an IDL type associated\n // with the [AllowResizable] extended attribute, and\n // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is\n // true, then throw a TypeError.\n // Note: resizable ArrayBuffers are currently a proposal\n\n // 4. Return the IDL DataView value that is a reference\n // to the same object as V.\n return V\n}\n\n// https://webidl.spec.whatwg.org/#BufferSource\nwebidl.converters.BufferSource = function (V, opts = {}) {\n if (types.isAnyArrayBuffer(V)) {\n return webidl.converters.ArrayBuffer(V, opts)\n }\n\n if (types.isTypedArray(V)) {\n return webidl.converters.TypedArray(V, V.constructor)\n }\n\n if (types.isDataView(V)) {\n return webidl.converters.DataView(V, opts)\n }\n\n throw new TypeError(`Could not convert ${V} to a BufferSource.`)\n}\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.ByteString\n)\n\nwebidl.converters['sequence>'] = webidl.sequenceConverter(\n webidl.converters['sequence']\n)\n\nwebidl.converters['record'] = webidl.recordConverter(\n webidl.converters.ByteString,\n webidl.converters.ByteString\n)\n\nmodule.exports = {\n webidl\n}\n","'use strict'\n\n/**\n * @see https://encoding.spec.whatwg.org/#concept-encoding-get\n * @param {string|undefined} label\n */\nfunction getEncoding (label) {\n if (!label) {\n return 'failure'\n }\n\n // 1. Remove any leading and trailing ASCII whitespace from label.\n // 2. If label is an ASCII case-insensitive match for any of the\n // labels listed in the table below, then return the\n // corresponding encoding; otherwise return failure.\n switch (label.trim().toLowerCase()) {\n case 'unicode-1-1-utf-8':\n case 'unicode11utf8':\n case 'unicode20utf8':\n case 'utf-8':\n case 'utf8':\n case 'x-unicode20utf8':\n return 'UTF-8'\n case '866':\n case 'cp866':\n case 'csibm866':\n case 'ibm866':\n return 'IBM866'\n case 'csisolatin2':\n case 'iso-8859-2':\n case 'iso-ir-101':\n case 'iso8859-2':\n case 'iso88592':\n case 'iso_8859-2':\n case 'iso_8859-2:1987':\n case 'l2':\n case 'latin2':\n return 'ISO-8859-2'\n case 'csisolatin3':\n case 'iso-8859-3':\n case 'iso-ir-109':\n case 'iso8859-3':\n case 'iso88593':\n case 'iso_8859-3':\n case 'iso_8859-3:1988':\n case 'l3':\n case 'latin3':\n return 'ISO-8859-3'\n case 'csisolatin4':\n case 'iso-8859-4':\n case 'iso-ir-110':\n case 'iso8859-4':\n case 'iso88594':\n case 'iso_8859-4':\n case 'iso_8859-4:1988':\n case 'l4':\n case 'latin4':\n return 'ISO-8859-4'\n case 'csisolatincyrillic':\n case 'cyrillic':\n case 'iso-8859-5':\n case 'iso-ir-144':\n case 'iso8859-5':\n case 'iso88595':\n case 'iso_8859-5':\n case 'iso_8859-5:1988':\n return 'ISO-8859-5'\n case 'arabic':\n case 'asmo-708':\n case 'csiso88596e':\n case 'csiso88596i':\n case 'csisolatinarabic':\n case 'ecma-114':\n case 'iso-8859-6':\n case 'iso-8859-6-e':\n case 'iso-8859-6-i':\n case 'iso-ir-127':\n case 'iso8859-6':\n case 'iso88596':\n case 'iso_8859-6':\n case 'iso_8859-6:1987':\n return 'ISO-8859-6'\n case 'csisolatingreek':\n case 'ecma-118':\n case 'elot_928':\n case 'greek':\n case 'greek8':\n case 'iso-8859-7':\n case 'iso-ir-126':\n case 'iso8859-7':\n case 'iso88597':\n case 'iso_8859-7':\n case 'iso_8859-7:1987':\n case 'sun_eu_greek':\n return 'ISO-8859-7'\n case 'csiso88598e':\n case 'csisolatinhebrew':\n case 'hebrew':\n case 'iso-8859-8':\n case 'iso-8859-8-e':\n case 'iso-ir-138':\n case 'iso8859-8':\n case 'iso88598':\n case 'iso_8859-8':\n case 'iso_8859-8:1988':\n case 'visual':\n return 'ISO-8859-8'\n case 'csiso88598i':\n case 'iso-8859-8-i':\n case 'logical':\n return 'ISO-8859-8-I'\n case 'csisolatin6':\n case 'iso-8859-10':\n case 'iso-ir-157':\n case 'iso8859-10':\n case 'iso885910':\n case 'l6':\n case 'latin6':\n return 'ISO-8859-10'\n case 'iso-8859-13':\n case 'iso8859-13':\n case 'iso885913':\n return 'ISO-8859-13'\n case 'iso-8859-14':\n case 'iso8859-14':\n case 'iso885914':\n return 'ISO-8859-14'\n case 'csisolatin9':\n case 'iso-8859-15':\n case 'iso8859-15':\n case 'iso885915':\n case 'iso_8859-15':\n case 'l9':\n return 'ISO-8859-15'\n case 'iso-8859-16':\n return 'ISO-8859-16'\n case 'cskoi8r':\n case 'koi':\n case 'koi8':\n case 'koi8-r':\n case 'koi8_r':\n return 'KOI8-R'\n case 'koi8-ru':\n case 'koi8-u':\n return 'KOI8-U'\n case 'csmacintosh':\n case 'mac':\n case 'macintosh':\n case 'x-mac-roman':\n return 'macintosh'\n case 'iso-8859-11':\n case 'iso8859-11':\n case 'iso885911':\n case 'tis-620':\n case 'windows-874':\n return 'windows-874'\n case 'cp1250':\n case 'windows-1250':\n case 'x-cp1250':\n return 'windows-1250'\n case 'cp1251':\n case 'windows-1251':\n case 'x-cp1251':\n return 'windows-1251'\n case 'ansi_x3.4-1968':\n case 'ascii':\n case 'cp1252':\n case 'cp819':\n case 'csisolatin1':\n case 'ibm819':\n case 'iso-8859-1':\n case 'iso-ir-100':\n case 'iso8859-1':\n case 'iso88591':\n case 'iso_8859-1':\n case 'iso_8859-1:1987':\n case 'l1':\n case 'latin1':\n case 'us-ascii':\n case 'windows-1252':\n case 'x-cp1252':\n return 'windows-1252'\n case 'cp1253':\n case 'windows-1253':\n case 'x-cp1253':\n return 'windows-1253'\n case 'cp1254':\n case 'csisolatin5':\n case 'iso-8859-9':\n case 'iso-ir-148':\n case 'iso8859-9':\n case 'iso88599':\n case 'iso_8859-9':\n case 'iso_8859-9:1989':\n case 'l5':\n case 'latin5':\n case 'windows-1254':\n case 'x-cp1254':\n return 'windows-1254'\n case 'cp1255':\n case 'windows-1255':\n case 'x-cp1255':\n return 'windows-1255'\n case 'cp1256':\n case 'windows-1256':\n case 'x-cp1256':\n return 'windows-1256'\n case 'cp1257':\n case 'windows-1257':\n case 'x-cp1257':\n return 'windows-1257'\n case 'cp1258':\n case 'windows-1258':\n case 'x-cp1258':\n return 'windows-1258'\n case 'x-mac-cyrillic':\n case 'x-mac-ukrainian':\n return 'x-mac-cyrillic'\n case 'chinese':\n case 'csgb2312':\n case 'csiso58gb231280':\n case 'gb2312':\n case 'gb_2312':\n case 'gb_2312-80':\n case 'gbk':\n case 'iso-ir-58':\n case 'x-gbk':\n return 'GBK'\n case 'gb18030':\n return 'gb18030'\n case 'big5':\n case 'big5-hkscs':\n case 'cn-big5':\n case 'csbig5':\n case 'x-x-big5':\n return 'Big5'\n case 'cseucpkdfmtjapanese':\n case 'euc-jp':\n case 'x-euc-jp':\n return 'EUC-JP'\n case 'csiso2022jp':\n case 'iso-2022-jp':\n return 'ISO-2022-JP'\n case 'csshiftjis':\n case 'ms932':\n case 'ms_kanji':\n case 'shift-jis':\n case 'shift_jis':\n case 'sjis':\n case 'windows-31j':\n case 'x-sjis':\n return 'Shift_JIS'\n case 'cseuckr':\n case 'csksc56011987':\n case 'euc-kr':\n case 'iso-ir-149':\n case 'korean':\n case 'ks_c_5601-1987':\n case 'ks_c_5601-1989':\n case 'ksc5601':\n case 'ksc_5601':\n case 'windows-949':\n return 'EUC-KR'\n case 'csiso2022kr':\n case 'hz-gb-2312':\n case 'iso-2022-cn':\n case 'iso-2022-cn-ext':\n case 'iso-2022-kr':\n case 'replacement':\n return 'replacement'\n case 'unicodefffe':\n case 'utf-16be':\n return 'UTF-16BE'\n case 'csunicode':\n case 'iso-10646-ucs-2':\n case 'ucs-2':\n case 'unicode':\n case 'unicodefeff':\n case 'utf-16':\n case 'utf-16le':\n return 'UTF-16LE'\n case 'x-user-defined':\n return 'x-user-defined'\n default: return 'failure'\n }\n}\n\nmodule.exports = {\n getEncoding\n}\n","'use strict'\n\nconst {\n staticPropertyDescriptors,\n readOperation,\n fireAProgressEvent\n} = require('./util')\nconst {\n kState,\n kError,\n kResult,\n kEvents,\n kAborted\n} = require('./symbols')\nconst { webidl } = require('../fetch/webidl')\nconst { kEnumerableProperty } = require('../core/util')\n\nclass FileReader extends EventTarget {\n constructor () {\n super()\n\n this[kState] = 'empty'\n this[kResult] = null\n this[kError] = null\n this[kEvents] = {\n loadend: null,\n error: null,\n abort: null,\n load: null,\n progress: null,\n loadstart: null\n }\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer\n * @param {import('buffer').Blob} blob\n */\n readAsArrayBuffer (blob) {\n webidl.brandCheck(this, FileReader)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsArrayBuffer' })\n\n blob = webidl.converters.Blob(blob, { strict: false })\n\n // The readAsArrayBuffer(blob) method, when invoked,\n // must initiate a read operation for blob with ArrayBuffer.\n readOperation(this, blob, 'ArrayBuffer')\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#readAsBinaryString\n * @param {import('buffer').Blob} blob\n */\n readAsBinaryString (blob) {\n webidl.brandCheck(this, FileReader)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsBinaryString' })\n\n blob = webidl.converters.Blob(blob, { strict: false })\n\n // The readAsBinaryString(blob) method, when invoked,\n // must initiate a read operation for blob with BinaryString.\n readOperation(this, blob, 'BinaryString')\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#readAsDataText\n * @param {import('buffer').Blob} blob\n * @param {string?} encoding\n */\n readAsText (blob, encoding = undefined) {\n webidl.brandCheck(this, FileReader)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsText' })\n\n blob = webidl.converters.Blob(blob, { strict: false })\n\n if (encoding !== undefined) {\n encoding = webidl.converters.DOMString(encoding)\n }\n\n // The readAsText(blob, encoding) method, when invoked,\n // must initiate a read operation for blob with Text and encoding.\n readOperation(this, blob, 'Text', encoding)\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL\n * @param {import('buffer').Blob} blob\n */\n readAsDataURL (blob) {\n webidl.brandCheck(this, FileReader)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsDataURL' })\n\n blob = webidl.converters.Blob(blob, { strict: false })\n\n // The readAsDataURL(blob) method, when invoked, must\n // initiate a read operation for blob with DataURL.\n readOperation(this, blob, 'DataURL')\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dfn-abort\n */\n abort () {\n // 1. If this's state is \"empty\" or if this's state is\n // \"done\" set this's result to null and terminate\n // this algorithm.\n if (this[kState] === 'empty' || this[kState] === 'done') {\n this[kResult] = null\n return\n }\n\n // 2. If this's state is \"loading\" set this's state to\n // \"done\" and set this's result to null.\n if (this[kState] === 'loading') {\n this[kState] = 'done'\n this[kResult] = null\n }\n\n // 3. If there are any tasks from this on the file reading\n // task source in an affiliated task queue, then remove\n // those tasks from that task queue.\n this[kAborted] = true\n\n // 4. Terminate the algorithm for the read method being processed.\n // TODO\n\n // 5. Fire a progress event called abort at this.\n fireAProgressEvent('abort', this)\n\n // 6. If this's state is not \"loading\", fire a progress\n // event called loadend at this.\n if (this[kState] !== 'loading') {\n fireAProgressEvent('loadend', this)\n }\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate\n */\n get readyState () {\n webidl.brandCheck(this, FileReader)\n\n switch (this[kState]) {\n case 'empty': return this.EMPTY\n case 'loading': return this.LOADING\n case 'done': return this.DONE\n }\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dom-filereader-result\n */\n get result () {\n webidl.brandCheck(this, FileReader)\n\n // The result attribute’s getter, when invoked, must return\n // this's result.\n return this[kResult]\n }\n\n /**\n * @see https://w3c.github.io/FileAPI/#dom-filereader-error\n */\n get error () {\n webidl.brandCheck(this, FileReader)\n\n // The error attribute’s getter, when invoked, must return\n // this's error.\n return this[kError]\n }\n\n get onloadend () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].loadend\n }\n\n set onloadend (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].loadend) {\n this.removeEventListener('loadend', this[kEvents].loadend)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].loadend = fn\n this.addEventListener('loadend', fn)\n } else {\n this[kEvents].loadend = null\n }\n }\n\n get onerror () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].error\n }\n\n set onerror (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].error) {\n this.removeEventListener('error', this[kEvents].error)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].error = fn\n this.addEventListener('error', fn)\n } else {\n this[kEvents].error = null\n }\n }\n\n get onloadstart () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].loadstart\n }\n\n set onloadstart (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].loadstart) {\n this.removeEventListener('loadstart', this[kEvents].loadstart)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].loadstart = fn\n this.addEventListener('loadstart', fn)\n } else {\n this[kEvents].loadstart = null\n }\n }\n\n get onprogress () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].progress\n }\n\n set onprogress (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].progress) {\n this.removeEventListener('progress', this[kEvents].progress)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].progress = fn\n this.addEventListener('progress', fn)\n } else {\n this[kEvents].progress = null\n }\n }\n\n get onload () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].load\n }\n\n set onload (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].load) {\n this.removeEventListener('load', this[kEvents].load)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].load = fn\n this.addEventListener('load', fn)\n } else {\n this[kEvents].load = null\n }\n }\n\n get onabort () {\n webidl.brandCheck(this, FileReader)\n\n return this[kEvents].abort\n }\n\n set onabort (fn) {\n webidl.brandCheck(this, FileReader)\n\n if (this[kEvents].abort) {\n this.removeEventListener('abort', this[kEvents].abort)\n }\n\n if (typeof fn === 'function') {\n this[kEvents].abort = fn\n this.addEventListener('abort', fn)\n } else {\n this[kEvents].abort = null\n }\n }\n}\n\n// https://w3c.github.io/FileAPI/#dom-filereader-empty\nFileReader.EMPTY = FileReader.prototype.EMPTY = 0\n// https://w3c.github.io/FileAPI/#dom-filereader-loading\nFileReader.LOADING = FileReader.prototype.LOADING = 1\n// https://w3c.github.io/FileAPI/#dom-filereader-done\nFileReader.DONE = FileReader.prototype.DONE = 2\n\nObject.defineProperties(FileReader.prototype, {\n EMPTY: staticPropertyDescriptors,\n LOADING: staticPropertyDescriptors,\n DONE: staticPropertyDescriptors,\n readAsArrayBuffer: kEnumerableProperty,\n readAsBinaryString: kEnumerableProperty,\n readAsText: kEnumerableProperty,\n readAsDataURL: kEnumerableProperty,\n abort: kEnumerableProperty,\n readyState: kEnumerableProperty,\n result: kEnumerableProperty,\n error: kEnumerableProperty,\n onloadstart: kEnumerableProperty,\n onprogress: kEnumerableProperty,\n onload: kEnumerableProperty,\n onabort: kEnumerableProperty,\n onerror: kEnumerableProperty,\n onloadend: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'FileReader',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nObject.defineProperties(FileReader, {\n EMPTY: staticPropertyDescriptors,\n LOADING: staticPropertyDescriptors,\n DONE: staticPropertyDescriptors\n})\n\nmodule.exports = {\n FileReader\n}\n","'use strict'\n\nconst { webidl } = require('../fetch/webidl')\n\nconst kState = Symbol('ProgressEvent state')\n\n/**\n * @see https://xhr.spec.whatwg.org/#progressevent\n */\nclass ProgressEvent extends Event {\n constructor (type, eventInitDict = {}) {\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {})\n\n super(type, eventInitDict)\n\n this[kState] = {\n lengthComputable: eventInitDict.lengthComputable,\n loaded: eventInitDict.loaded,\n total: eventInitDict.total\n }\n }\n\n get lengthComputable () {\n webidl.brandCheck(this, ProgressEvent)\n\n return this[kState].lengthComputable\n }\n\n get loaded () {\n webidl.brandCheck(this, ProgressEvent)\n\n return this[kState].loaded\n }\n\n get total () {\n webidl.brandCheck(this, ProgressEvent)\n\n return this[kState].total\n }\n}\n\nwebidl.converters.ProgressEventInit = webidl.dictionaryConverter([\n {\n key: 'lengthComputable',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'loaded',\n converter: webidl.converters['unsigned long long'],\n defaultValue: 0\n },\n {\n key: 'total',\n converter: webidl.converters['unsigned long long'],\n defaultValue: 0\n },\n {\n key: 'bubbles',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'cancelable',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'composed',\n converter: webidl.converters.boolean,\n defaultValue: false\n }\n])\n\nmodule.exports = {\n ProgressEvent\n}\n","'use strict'\n\nmodule.exports = {\n kState: Symbol('FileReader state'),\n kResult: Symbol('FileReader result'),\n kError: Symbol('FileReader error'),\n kLastProgressEventFired: Symbol('FileReader last progress event fired timestamp'),\n kEvents: Symbol('FileReader events'),\n kAborted: Symbol('FileReader aborted')\n}\n","'use strict'\n\nconst {\n kState,\n kError,\n kResult,\n kAborted,\n kLastProgressEventFired\n} = require('./symbols')\nconst { ProgressEvent } = require('./progressevent')\nconst { getEncoding } = require('./encoding')\nconst { DOMException } = require('../fetch/constants')\nconst { serializeAMimeType, parseMIMEType } = require('../fetch/dataURL')\nconst { types } = require('util')\nconst { StringDecoder } = require('string_decoder')\nconst { btoa } = require('buffer')\n\n/** @type {PropertyDescriptor} */\nconst staticPropertyDescriptors = {\n enumerable: true,\n writable: false,\n configurable: false\n}\n\n/**\n * @see https://w3c.github.io/FileAPI/#readOperation\n * @param {import('./filereader').FileReader} fr\n * @param {import('buffer').Blob} blob\n * @param {string} type\n * @param {string?} encodingName\n */\nfunction readOperation (fr, blob, type, encodingName) {\n // 1. If fr’s state is \"loading\", throw an InvalidStateError\n // DOMException.\n if (fr[kState] === 'loading') {\n throw new DOMException('Invalid state', 'InvalidStateError')\n }\n\n // 2. Set fr’s state to \"loading\".\n fr[kState] = 'loading'\n\n // 3. Set fr’s result to null.\n fr[kResult] = null\n\n // 4. Set fr’s error to null.\n fr[kError] = null\n\n // 5. Let stream be the result of calling get stream on blob.\n /** @type {import('stream/web').ReadableStream} */\n const stream = blob.stream()\n\n // 6. Let reader be the result of getting a reader from stream.\n const reader = stream.getReader()\n\n // 7. Let bytes be an empty byte sequence.\n /** @type {Uint8Array[]} */\n const bytes = []\n\n // 8. Let chunkPromise be the result of reading a chunk from\n // stream with reader.\n let chunkPromise = reader.read()\n\n // 9. Let isFirstChunk be true.\n let isFirstChunk = true\n\n // 10. In parallel, while true:\n // Note: \"In parallel\" just means non-blocking\n // Note 2: readOperation itself cannot be async as double\n // reading the body would then reject the promise, instead\n // of throwing an error.\n ;(async () => {\n while (!fr[kAborted]) {\n // 1. Wait for chunkPromise to be fulfilled or rejected.\n try {\n const { done, value } = await chunkPromise\n\n // 2. If chunkPromise is fulfilled, and isFirstChunk is\n // true, queue a task to fire a progress event called\n // loadstart at fr.\n if (isFirstChunk && !fr[kAborted]) {\n queueMicrotask(() => {\n fireAProgressEvent('loadstart', fr)\n })\n }\n\n // 3. Set isFirstChunk to false.\n isFirstChunk = false\n\n // 4. If chunkPromise is fulfilled with an object whose\n // done property is false and whose value property is\n // a Uint8Array object, run these steps:\n if (!done && types.isUint8Array(value)) {\n // 1. Let bs be the byte sequence represented by the\n // Uint8Array object.\n\n // 2. Append bs to bytes.\n bytes.push(value)\n\n // 3. If roughly 50ms have passed since these steps\n // were last invoked, queue a task to fire a\n // progress event called progress at fr.\n if (\n (\n fr[kLastProgressEventFired] === undefined ||\n Date.now() - fr[kLastProgressEventFired] >= 50\n ) &&\n !fr[kAborted]\n ) {\n fr[kLastProgressEventFired] = Date.now()\n queueMicrotask(() => {\n fireAProgressEvent('progress', fr)\n })\n }\n\n // 4. Set chunkPromise to the result of reading a\n // chunk from stream with reader.\n chunkPromise = reader.read()\n } else if (done) {\n // 5. Otherwise, if chunkPromise is fulfilled with an\n // object whose done property is true, queue a task\n // to run the following steps and abort this algorithm:\n queueMicrotask(() => {\n // 1. Set fr’s state to \"done\".\n fr[kState] = 'done'\n\n // 2. Let result be the result of package data given\n // bytes, type, blob’s type, and encodingName.\n try {\n const result = packageData(bytes, type, blob.type, encodingName)\n\n // 4. Else:\n\n if (fr[kAborted]) {\n return\n }\n\n // 1. Set fr’s result to result.\n fr[kResult] = result\n\n // 2. Fire a progress event called load at the fr.\n fireAProgressEvent('load', fr)\n } catch (error) {\n // 3. If package data threw an exception error:\n\n // 1. Set fr’s error to error.\n fr[kError] = error\n\n // 2. Fire a progress event called error at fr.\n fireAProgressEvent('error', fr)\n }\n\n // 5. If fr’s state is not \"loading\", fire a progress\n // event called loadend at the fr.\n if (fr[kState] !== 'loading') {\n fireAProgressEvent('loadend', fr)\n }\n })\n\n break\n }\n } catch (error) {\n if (fr[kAborted]) {\n return\n }\n\n // 6. Otherwise, if chunkPromise is rejected with an\n // error error, queue a task to run the following\n // steps and abort this algorithm:\n queueMicrotask(() => {\n // 1. Set fr’s state to \"done\".\n fr[kState] = 'done'\n\n // 2. Set fr’s error to error.\n fr[kError] = error\n\n // 3. Fire a progress event called error at fr.\n fireAProgressEvent('error', fr)\n\n // 4. If fr’s state is not \"loading\", fire a progress\n // event called loadend at fr.\n if (fr[kState] !== 'loading') {\n fireAProgressEvent('loadend', fr)\n }\n })\n\n break\n }\n }\n })()\n}\n\n/**\n * @see https://w3c.github.io/FileAPI/#fire-a-progress-event\n * @see https://dom.spec.whatwg.org/#concept-event-fire\n * @param {string} e The name of the event\n * @param {import('./filereader').FileReader} reader\n */\nfunction fireAProgressEvent (e, reader) {\n // The progress event e does not bubble. e.bubbles must be false\n // The progress event e is NOT cancelable. e.cancelable must be false\n const event = new ProgressEvent(e, {\n bubbles: false,\n cancelable: false\n })\n\n reader.dispatchEvent(event)\n}\n\n/**\n * @see https://w3c.github.io/FileAPI/#blob-package-data\n * @param {Uint8Array[]} bytes\n * @param {string} type\n * @param {string?} mimeType\n * @param {string?} encodingName\n */\nfunction packageData (bytes, type, mimeType, encodingName) {\n // 1. A Blob has an associated package data algorithm, given\n // bytes, a type, a optional mimeType, and a optional\n // encodingName, which switches on type and runs the\n // associated steps:\n\n switch (type) {\n case 'DataURL': {\n // 1. Return bytes as a DataURL [RFC2397] subject to\n // the considerations below:\n // * Use mimeType as part of the Data URL if it is\n // available in keeping with the Data URL\n // specification [RFC2397].\n // * If mimeType is not available return a Data URL\n // without a media-type. [RFC2397].\n\n // https://datatracker.ietf.org/doc/html/rfc2397#section-3\n // dataurl := \"data:\" [ mediatype ] [ \";base64\" ] \",\" data\n // mediatype := [ type \"/\" subtype ] *( \";\" parameter )\n // data := *urlchar\n // parameter := attribute \"=\" value\n let dataURL = 'data:'\n\n const parsed = parseMIMEType(mimeType || 'application/octet-stream')\n\n if (parsed !== 'failure') {\n dataURL += serializeAMimeType(parsed)\n }\n\n dataURL += ';base64,'\n\n const decoder = new StringDecoder('latin1')\n\n for (const chunk of bytes) {\n dataURL += btoa(decoder.write(chunk))\n }\n\n dataURL += btoa(decoder.end())\n\n return dataURL\n }\n case 'Text': {\n // 1. Let encoding be failure\n let encoding = 'failure'\n\n // 2. If the encodingName is present, set encoding to the\n // result of getting an encoding from encodingName.\n if (encodingName) {\n encoding = getEncoding(encodingName)\n }\n\n // 3. If encoding is failure, and mimeType is present:\n if (encoding === 'failure' && mimeType) {\n // 1. Let type be the result of parse a MIME type\n // given mimeType.\n const type = parseMIMEType(mimeType)\n\n // 2. If type is not failure, set encoding to the result\n // of getting an encoding from type’s parameters[\"charset\"].\n if (type !== 'failure') {\n encoding = getEncoding(type.parameters.get('charset'))\n }\n }\n\n // 4. If encoding is failure, then set encoding to UTF-8.\n if (encoding === 'failure') {\n encoding = 'UTF-8'\n }\n\n // 5. Decode bytes using fallback encoding encoding, and\n // return the result.\n return decode(bytes, encoding)\n }\n case 'ArrayBuffer': {\n // Return a new ArrayBuffer whose contents are bytes.\n const sequence = combineByteSequences(bytes)\n\n return sequence.buffer\n }\n case 'BinaryString': {\n // Return bytes as a binary string, in which every byte\n // is represented by a code unit of equal value [0..255].\n let binaryString = ''\n\n const decoder = new StringDecoder('latin1')\n\n for (const chunk of bytes) {\n binaryString += decoder.write(chunk)\n }\n\n binaryString += decoder.end()\n\n return binaryString\n }\n }\n}\n\n/**\n * @see https://encoding.spec.whatwg.org/#decode\n * @param {Uint8Array[]} ioQueue\n * @param {string} encoding\n */\nfunction decode (ioQueue, encoding) {\n const bytes = combineByteSequences(ioQueue)\n\n // 1. Let BOMEncoding be the result of BOM sniffing ioQueue.\n const BOMEncoding = BOMSniffing(bytes)\n\n let slice = 0\n\n // 2. If BOMEncoding is non-null:\n if (BOMEncoding !== null) {\n // 1. Set encoding to BOMEncoding.\n encoding = BOMEncoding\n\n // 2. Read three bytes from ioQueue, if BOMEncoding is\n // UTF-8; otherwise read two bytes.\n // (Do nothing with those bytes.)\n slice = BOMEncoding === 'UTF-8' ? 3 : 2\n }\n\n // 3. Process a queue with an instance of encoding’s\n // decoder, ioQueue, output, and \"replacement\".\n\n // 4. Return output.\n\n const sliced = bytes.slice(slice)\n return new TextDecoder(encoding).decode(sliced)\n}\n\n/**\n * @see https://encoding.spec.whatwg.org/#bom-sniff\n * @param {Uint8Array} ioQueue\n */\nfunction BOMSniffing (ioQueue) {\n // 1. Let BOM be the result of peeking 3 bytes from ioQueue,\n // converted to a byte sequence.\n const [a, b, c] = ioQueue\n\n // 2. For each of the rows in the table below, starting with\n // the first one and going down, if BOM starts with the\n // bytes given in the first column, then return the\n // encoding given in the cell in the second column of that\n // row. Otherwise, return null.\n if (a === 0xEF && b === 0xBB && c === 0xBF) {\n return 'UTF-8'\n } else if (a === 0xFE && b === 0xFF) {\n return 'UTF-16BE'\n } else if (a === 0xFF && b === 0xFE) {\n return 'UTF-16LE'\n }\n\n return null\n}\n\n/**\n * @param {Uint8Array[]} sequences\n */\nfunction combineByteSequences (sequences) {\n const size = sequences.reduce((a, b) => {\n return a + b.byteLength\n }, 0)\n\n let offset = 0\n\n return sequences.reduce((a, b) => {\n a.set(b, offset)\n offset += b.byteLength\n return a\n }, new Uint8Array(size))\n}\n\nmodule.exports = {\n staticPropertyDescriptors,\n readOperation,\n fireAProgressEvent\n}\n","'use strict'\n\n// We include a version number for the Dispatcher API. In case of breaking changes,\n// this version number must be increased to avoid conflicts.\nconst globalDispatcher = Symbol.for('undici.globalDispatcher.1')\nconst { InvalidArgumentError } = require('./core/errors')\nconst Agent = require('./agent')\n\nif (getGlobalDispatcher() === undefined) {\n setGlobalDispatcher(new Agent())\n}\n\nfunction setGlobalDispatcher (agent) {\n if (!agent || typeof agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument agent must implement Agent')\n }\n Object.defineProperty(globalThis, globalDispatcher, {\n value: agent,\n writable: true,\n enumerable: false,\n configurable: false\n })\n}\n\nfunction getGlobalDispatcher () {\n return globalThis[globalDispatcher]\n}\n\nmodule.exports = {\n setGlobalDispatcher,\n getGlobalDispatcher\n}\n","'use strict'\n\nmodule.exports = class DecoratorHandler {\n constructor (handler) {\n this.handler = handler\n }\n\n onConnect (...args) {\n return this.handler.onConnect(...args)\n }\n\n onError (...args) {\n return this.handler.onError(...args)\n }\n\n onUpgrade (...args) {\n return this.handler.onUpgrade(...args)\n }\n\n onHeaders (...args) {\n return this.handler.onHeaders(...args)\n }\n\n onData (...args) {\n return this.handler.onData(...args)\n }\n\n onComplete (...args) {\n return this.handler.onComplete(...args)\n }\n\n onBodySent (...args) {\n return this.handler.onBodySent(...args)\n }\n}\n","'use strict'\n\nconst util = require('../core/util')\nconst { kBodyUsed } = require('../core/symbols')\nconst assert = require('assert')\nconst { InvalidArgumentError } = require('../core/errors')\nconst EE = require('events')\n\nconst redirectableStatusCodes = [300, 301, 302, 303, 307, 308]\n\nconst kBody = Symbol('body')\n\nclass BodyAsyncIterable {\n constructor (body) {\n this[kBody] = body\n this[kBodyUsed] = false\n }\n\n async * [Symbol.asyncIterator] () {\n assert(!this[kBodyUsed], 'disturbed')\n this[kBodyUsed] = true\n yield * this[kBody]\n }\n}\n\nclass RedirectHandler {\n constructor (dispatch, maxRedirections, opts, handler) {\n if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {\n throw new InvalidArgumentError('maxRedirections must be a positive number')\n }\n\n util.validateHandler(handler, opts.method, opts.upgrade)\n\n this.dispatch = dispatch\n this.location = null\n this.abort = null\n this.opts = { ...opts, maxRedirections: 0 } // opts must be a copy\n this.maxRedirections = maxRedirections\n this.handler = handler\n this.history = []\n\n if (util.isStream(this.opts.body)) {\n // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp\n // so that it can be dispatched again?\n // TODO (fix): Do we need 100-expect support to provide a way to do this properly?\n if (util.bodyLength(this.opts.body) === 0) {\n this.opts.body\n .on('data', function () {\n assert(false)\n })\n }\n\n if (typeof this.opts.body.readableDidRead !== 'boolean') {\n this.opts.body[kBodyUsed] = false\n EE.prototype.on.call(this.opts.body, 'data', function () {\n this[kBodyUsed] = true\n })\n }\n } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') {\n // TODO (fix): We can't access ReadableStream internal state\n // to determine whether or not it has been disturbed. This is just\n // a workaround.\n this.opts.body = new BodyAsyncIterable(this.opts.body)\n } else if (\n this.opts.body &&\n typeof this.opts.body !== 'string' &&\n !ArrayBuffer.isView(this.opts.body) &&\n util.isIterable(this.opts.body)\n ) {\n // TODO: Should we allow re-using iterable if !this.opts.idempotent\n // or through some other flag?\n this.opts.body = new BodyAsyncIterable(this.opts.body)\n }\n }\n\n onConnect (abort) {\n this.abort = abort\n this.handler.onConnect(abort, { history: this.history })\n }\n\n onUpgrade (statusCode, headers, socket) {\n this.handler.onUpgrade(statusCode, headers, socket)\n }\n\n onError (error) {\n this.handler.onError(error)\n }\n\n onHeaders (statusCode, headers, resume, statusText) {\n this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body)\n ? null\n : parseLocation(statusCode, headers)\n\n if (this.opts.origin) {\n this.history.push(new URL(this.opts.path, this.opts.origin))\n }\n\n if (!this.location) {\n return this.handler.onHeaders(statusCode, headers, resume, statusText)\n }\n\n const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)))\n const path = search ? `${pathname}${search}` : pathname\n\n // Remove headers referring to the original URL.\n // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers.\n // https://tools.ietf.org/html/rfc7231#section-6.4\n this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin)\n this.opts.path = path\n this.opts.origin = origin\n this.opts.maxRedirections = 0\n this.opts.query = null\n\n // https://tools.ietf.org/html/rfc7231#section-6.4.4\n // In case of HTTP 303, always replace method to be either HEAD or GET\n if (statusCode === 303 && this.opts.method !== 'HEAD') {\n this.opts.method = 'GET'\n this.opts.body = null\n }\n }\n\n onData (chunk) {\n if (this.location) {\n /*\n https://tools.ietf.org/html/rfc7231#section-6.4\n\n TLDR: undici always ignores 3xx response bodies.\n\n Redirection is used to serve the requested resource from another URL, so it is assumes that\n no body is generated (and thus can be ignored). Even though generating a body is not prohibited.\n\n For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually\n (which means it's optional and not mandated) contain just an hyperlink to the value of\n the Location response header, so the body can be ignored safely.\n\n For status 300, which is \"Multiple Choices\", the spec mentions both generating a Location\n response header AND a response body with the other possible location to follow.\n Since the spec explicitily chooses not to specify a format for such body and leave it to\n servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it.\n */\n } else {\n return this.handler.onData(chunk)\n }\n }\n\n onComplete (trailers) {\n if (this.location) {\n /*\n https://tools.ietf.org/html/rfc7231#section-6.4\n\n TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections\n and neither are useful if present.\n\n See comment on onData method above for more detailed informations.\n */\n\n this.location = null\n this.abort = null\n\n this.dispatch(this.opts, this)\n } else {\n this.handler.onComplete(trailers)\n }\n }\n\n onBodySent (chunk) {\n if (this.handler.onBodySent) {\n this.handler.onBodySent(chunk)\n }\n }\n}\n\nfunction parseLocation (statusCode, headers) {\n if (redirectableStatusCodes.indexOf(statusCode) === -1) {\n return null\n }\n\n for (let i = 0; i < headers.length; i += 2) {\n if (headers[i].toString().toLowerCase() === 'location') {\n return headers[i + 1]\n }\n }\n}\n\n// https://tools.ietf.org/html/rfc7231#section-6.4.4\nfunction shouldRemoveHeader (header, removeContent, unknownOrigin) {\n return (\n (header.length === 4 && header.toString().toLowerCase() === 'host') ||\n (removeContent && header.toString().toLowerCase().indexOf('content-') === 0) ||\n (unknownOrigin && header.length === 13 && header.toString().toLowerCase() === 'authorization') ||\n (unknownOrigin && header.length === 6 && header.toString().toLowerCase() === 'cookie')\n )\n}\n\n// https://tools.ietf.org/html/rfc7231#section-6.4\nfunction cleanRequestHeaders (headers, removeContent, unknownOrigin) {\n const ret = []\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i += 2) {\n if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) {\n ret.push(headers[i], headers[i + 1])\n }\n }\n } else if (headers && typeof headers === 'object') {\n for (const key of Object.keys(headers)) {\n if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {\n ret.push(key, headers[key])\n }\n }\n } else {\n assert(headers == null, 'headers must be an object or an array')\n }\n return ret\n}\n\nmodule.exports = RedirectHandler\n","'use strict'\n\nconst RedirectHandler = require('../handler/RedirectHandler')\n\nfunction createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) {\n return (dispatch) => {\n return function Intercept (opts, handler) {\n const { maxRedirections = defaultMaxRedirections } = opts\n\n if (!maxRedirections) {\n return dispatch(opts, handler)\n }\n\n const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler)\n opts = { ...opts, maxRedirections: 0 } // Stop sub dispatcher from also redirecting.\n return dispatch(opts, redirectHandler)\n }\n }\n}\n\nmodule.exports = createRedirectInterceptor\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0;\nconst utils_1 = require(\"./utils\");\n// C headers\nvar ERROR;\n(function (ERROR) {\n ERROR[ERROR[\"OK\"] = 0] = \"OK\";\n ERROR[ERROR[\"INTERNAL\"] = 1] = \"INTERNAL\";\n ERROR[ERROR[\"STRICT\"] = 2] = \"STRICT\";\n ERROR[ERROR[\"LF_EXPECTED\"] = 3] = \"LF_EXPECTED\";\n ERROR[ERROR[\"UNEXPECTED_CONTENT_LENGTH\"] = 4] = \"UNEXPECTED_CONTENT_LENGTH\";\n ERROR[ERROR[\"CLOSED_CONNECTION\"] = 5] = \"CLOSED_CONNECTION\";\n ERROR[ERROR[\"INVALID_METHOD\"] = 6] = \"INVALID_METHOD\";\n ERROR[ERROR[\"INVALID_URL\"] = 7] = \"INVALID_URL\";\n ERROR[ERROR[\"INVALID_CONSTANT\"] = 8] = \"INVALID_CONSTANT\";\n ERROR[ERROR[\"INVALID_VERSION\"] = 9] = \"INVALID_VERSION\";\n ERROR[ERROR[\"INVALID_HEADER_TOKEN\"] = 10] = \"INVALID_HEADER_TOKEN\";\n ERROR[ERROR[\"INVALID_CONTENT_LENGTH\"] = 11] = \"INVALID_CONTENT_LENGTH\";\n ERROR[ERROR[\"INVALID_CHUNK_SIZE\"] = 12] = \"INVALID_CHUNK_SIZE\";\n ERROR[ERROR[\"INVALID_STATUS\"] = 13] = \"INVALID_STATUS\";\n ERROR[ERROR[\"INVALID_EOF_STATE\"] = 14] = \"INVALID_EOF_STATE\";\n ERROR[ERROR[\"INVALID_TRANSFER_ENCODING\"] = 15] = \"INVALID_TRANSFER_ENCODING\";\n ERROR[ERROR[\"CB_MESSAGE_BEGIN\"] = 16] = \"CB_MESSAGE_BEGIN\";\n ERROR[ERROR[\"CB_HEADERS_COMPLETE\"] = 17] = \"CB_HEADERS_COMPLETE\";\n ERROR[ERROR[\"CB_MESSAGE_COMPLETE\"] = 18] = \"CB_MESSAGE_COMPLETE\";\n ERROR[ERROR[\"CB_CHUNK_HEADER\"] = 19] = \"CB_CHUNK_HEADER\";\n ERROR[ERROR[\"CB_CHUNK_COMPLETE\"] = 20] = \"CB_CHUNK_COMPLETE\";\n ERROR[ERROR[\"PAUSED\"] = 21] = \"PAUSED\";\n ERROR[ERROR[\"PAUSED_UPGRADE\"] = 22] = \"PAUSED_UPGRADE\";\n ERROR[ERROR[\"PAUSED_H2_UPGRADE\"] = 23] = \"PAUSED_H2_UPGRADE\";\n ERROR[ERROR[\"USER\"] = 24] = \"USER\";\n})(ERROR = exports.ERROR || (exports.ERROR = {}));\nvar TYPE;\n(function (TYPE) {\n TYPE[TYPE[\"BOTH\"] = 0] = \"BOTH\";\n TYPE[TYPE[\"REQUEST\"] = 1] = \"REQUEST\";\n TYPE[TYPE[\"RESPONSE\"] = 2] = \"RESPONSE\";\n})(TYPE = exports.TYPE || (exports.TYPE = {}));\nvar FLAGS;\n(function (FLAGS) {\n FLAGS[FLAGS[\"CONNECTION_KEEP_ALIVE\"] = 1] = \"CONNECTION_KEEP_ALIVE\";\n FLAGS[FLAGS[\"CONNECTION_CLOSE\"] = 2] = \"CONNECTION_CLOSE\";\n FLAGS[FLAGS[\"CONNECTION_UPGRADE\"] = 4] = \"CONNECTION_UPGRADE\";\n FLAGS[FLAGS[\"CHUNKED\"] = 8] = \"CHUNKED\";\n FLAGS[FLAGS[\"UPGRADE\"] = 16] = \"UPGRADE\";\n FLAGS[FLAGS[\"CONTENT_LENGTH\"] = 32] = \"CONTENT_LENGTH\";\n FLAGS[FLAGS[\"SKIPBODY\"] = 64] = \"SKIPBODY\";\n FLAGS[FLAGS[\"TRAILING\"] = 128] = \"TRAILING\";\n // 1 << 8 is unused\n FLAGS[FLAGS[\"TRANSFER_ENCODING\"] = 512] = \"TRANSFER_ENCODING\";\n})(FLAGS = exports.FLAGS || (exports.FLAGS = {}));\nvar LENIENT_FLAGS;\n(function (LENIENT_FLAGS) {\n LENIENT_FLAGS[LENIENT_FLAGS[\"HEADERS\"] = 1] = \"HEADERS\";\n LENIENT_FLAGS[LENIENT_FLAGS[\"CHUNKED_LENGTH\"] = 2] = \"CHUNKED_LENGTH\";\n LENIENT_FLAGS[LENIENT_FLAGS[\"KEEP_ALIVE\"] = 4] = \"KEEP_ALIVE\";\n})(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {}));\nvar METHODS;\n(function (METHODS) {\n METHODS[METHODS[\"DELETE\"] = 0] = \"DELETE\";\n METHODS[METHODS[\"GET\"] = 1] = \"GET\";\n METHODS[METHODS[\"HEAD\"] = 2] = \"HEAD\";\n METHODS[METHODS[\"POST\"] = 3] = \"POST\";\n METHODS[METHODS[\"PUT\"] = 4] = \"PUT\";\n /* pathological */\n METHODS[METHODS[\"CONNECT\"] = 5] = \"CONNECT\";\n METHODS[METHODS[\"OPTIONS\"] = 6] = \"OPTIONS\";\n METHODS[METHODS[\"TRACE\"] = 7] = \"TRACE\";\n /* WebDAV */\n METHODS[METHODS[\"COPY\"] = 8] = \"COPY\";\n METHODS[METHODS[\"LOCK\"] = 9] = \"LOCK\";\n METHODS[METHODS[\"MKCOL\"] = 10] = \"MKCOL\";\n METHODS[METHODS[\"MOVE\"] = 11] = \"MOVE\";\n METHODS[METHODS[\"PROPFIND\"] = 12] = \"PROPFIND\";\n METHODS[METHODS[\"PROPPATCH\"] = 13] = \"PROPPATCH\";\n METHODS[METHODS[\"SEARCH\"] = 14] = \"SEARCH\";\n METHODS[METHODS[\"UNLOCK\"] = 15] = \"UNLOCK\";\n METHODS[METHODS[\"BIND\"] = 16] = \"BIND\";\n METHODS[METHODS[\"REBIND\"] = 17] = \"REBIND\";\n METHODS[METHODS[\"UNBIND\"] = 18] = \"UNBIND\";\n METHODS[METHODS[\"ACL\"] = 19] = \"ACL\";\n /* subversion */\n METHODS[METHODS[\"REPORT\"] = 20] = \"REPORT\";\n METHODS[METHODS[\"MKACTIVITY\"] = 21] = \"MKACTIVITY\";\n METHODS[METHODS[\"CHECKOUT\"] = 22] = \"CHECKOUT\";\n METHODS[METHODS[\"MERGE\"] = 23] = \"MERGE\";\n /* upnp */\n METHODS[METHODS[\"M-SEARCH\"] = 24] = \"M-SEARCH\";\n METHODS[METHODS[\"NOTIFY\"] = 25] = \"NOTIFY\";\n METHODS[METHODS[\"SUBSCRIBE\"] = 26] = \"SUBSCRIBE\";\n METHODS[METHODS[\"UNSUBSCRIBE\"] = 27] = \"UNSUBSCRIBE\";\n /* RFC-5789 */\n METHODS[METHODS[\"PATCH\"] = 28] = \"PATCH\";\n METHODS[METHODS[\"PURGE\"] = 29] = \"PURGE\";\n /* CalDAV */\n METHODS[METHODS[\"MKCALENDAR\"] = 30] = \"MKCALENDAR\";\n /* RFC-2068, section 19.6.1.2 */\n METHODS[METHODS[\"LINK\"] = 31] = \"LINK\";\n METHODS[METHODS[\"UNLINK\"] = 32] = \"UNLINK\";\n /* icecast */\n METHODS[METHODS[\"SOURCE\"] = 33] = \"SOURCE\";\n /* RFC-7540, section 11.6 */\n METHODS[METHODS[\"PRI\"] = 34] = \"PRI\";\n /* RFC-2326 RTSP */\n METHODS[METHODS[\"DESCRIBE\"] = 35] = \"DESCRIBE\";\n METHODS[METHODS[\"ANNOUNCE\"] = 36] = \"ANNOUNCE\";\n METHODS[METHODS[\"SETUP\"] = 37] = \"SETUP\";\n METHODS[METHODS[\"PLAY\"] = 38] = \"PLAY\";\n METHODS[METHODS[\"PAUSE\"] = 39] = \"PAUSE\";\n METHODS[METHODS[\"TEARDOWN\"] = 40] = \"TEARDOWN\";\n METHODS[METHODS[\"GET_PARAMETER\"] = 41] = \"GET_PARAMETER\";\n METHODS[METHODS[\"SET_PARAMETER\"] = 42] = \"SET_PARAMETER\";\n METHODS[METHODS[\"REDIRECT\"] = 43] = \"REDIRECT\";\n METHODS[METHODS[\"RECORD\"] = 44] = \"RECORD\";\n /* RAOP */\n METHODS[METHODS[\"FLUSH\"] = 45] = \"FLUSH\";\n})(METHODS = exports.METHODS || (exports.METHODS = {}));\nexports.METHODS_HTTP = [\n METHODS.DELETE,\n METHODS.GET,\n METHODS.HEAD,\n METHODS.POST,\n METHODS.PUT,\n METHODS.CONNECT,\n METHODS.OPTIONS,\n METHODS.TRACE,\n METHODS.COPY,\n METHODS.LOCK,\n METHODS.MKCOL,\n METHODS.MOVE,\n METHODS.PROPFIND,\n METHODS.PROPPATCH,\n METHODS.SEARCH,\n METHODS.UNLOCK,\n METHODS.BIND,\n METHODS.REBIND,\n METHODS.UNBIND,\n METHODS.ACL,\n METHODS.REPORT,\n METHODS.MKACTIVITY,\n METHODS.CHECKOUT,\n METHODS.MERGE,\n METHODS['M-SEARCH'],\n METHODS.NOTIFY,\n METHODS.SUBSCRIBE,\n METHODS.UNSUBSCRIBE,\n METHODS.PATCH,\n METHODS.PURGE,\n METHODS.MKCALENDAR,\n METHODS.LINK,\n METHODS.UNLINK,\n METHODS.PRI,\n // TODO(indutny): should we allow it with HTTP?\n METHODS.SOURCE,\n];\nexports.METHODS_ICE = [\n METHODS.SOURCE,\n];\nexports.METHODS_RTSP = [\n METHODS.OPTIONS,\n METHODS.DESCRIBE,\n METHODS.ANNOUNCE,\n METHODS.SETUP,\n METHODS.PLAY,\n METHODS.PAUSE,\n METHODS.TEARDOWN,\n METHODS.GET_PARAMETER,\n METHODS.SET_PARAMETER,\n METHODS.REDIRECT,\n METHODS.RECORD,\n METHODS.FLUSH,\n // For AirPlay\n METHODS.GET,\n METHODS.POST,\n];\nexports.METHOD_MAP = utils_1.enumToMap(METHODS);\nexports.H_METHOD_MAP = {};\nObject.keys(exports.METHOD_MAP).forEach((key) => {\n if (/^H/.test(key)) {\n exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key];\n }\n});\nvar FINISH;\n(function (FINISH) {\n FINISH[FINISH[\"SAFE\"] = 0] = \"SAFE\";\n FINISH[FINISH[\"SAFE_WITH_CB\"] = 1] = \"SAFE_WITH_CB\";\n FINISH[FINISH[\"UNSAFE\"] = 2] = \"UNSAFE\";\n})(FINISH = exports.FINISH || (exports.FINISH = {}));\nexports.ALPHA = [];\nfor (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) {\n // Upper case\n exports.ALPHA.push(String.fromCharCode(i));\n // Lower case\n exports.ALPHA.push(String.fromCharCode(i + 0x20));\n}\nexports.NUM_MAP = {\n 0: 0, 1: 1, 2: 2, 3: 3, 4: 4,\n 5: 5, 6: 6, 7: 7, 8: 8, 9: 9,\n};\nexports.HEX_MAP = {\n 0: 0, 1: 1, 2: 2, 3: 3, 4: 4,\n 5: 5, 6: 6, 7: 7, 8: 8, 9: 9,\n A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF,\n a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf,\n};\nexports.NUM = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n];\nexports.ALPHANUM = exports.ALPHA.concat(exports.NUM);\nexports.MARK = ['-', '_', '.', '!', '~', '*', '\\'', '(', ')'];\nexports.USERINFO_CHARS = exports.ALPHANUM\n .concat(exports.MARK)\n .concat(['%', ';', ':', '&', '=', '+', '$', ',']);\n// TODO(indutny): use RFC\nexports.STRICT_URL_CHAR = [\n '!', '\"', '$', '%', '&', '\\'',\n '(', ')', '*', '+', ',', '-', '.', '/',\n ':', ';', '<', '=', '>',\n '@', '[', '\\\\', ']', '^', '_',\n '`',\n '{', '|', '}', '~',\n].concat(exports.ALPHANUM);\nexports.URL_CHAR = exports.STRICT_URL_CHAR\n .concat(['\\t', '\\f']);\n// All characters with 0x80 bit set to 1\nfor (let i = 0x80; i <= 0xff; i++) {\n exports.URL_CHAR.push(i);\n}\nexports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']);\n/* Tokens as defined by rfc 2616. Also lowercases them.\n * token = 1*\n * separators = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n * | \",\" | \";\" | \":\" | \"\\\" | <\">\n * | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n * | \"{\" | \"}\" | SP | HT\n */\nexports.STRICT_TOKEN = [\n '!', '#', '$', '%', '&', '\\'',\n '*', '+', '-', '.',\n '^', '_', '`',\n '|', '~',\n].concat(exports.ALPHANUM);\nexports.TOKEN = exports.STRICT_TOKEN.concat([' ']);\n/*\n * Verify that a char is a valid visible (printable) US-ASCII\n * character or %x80-FF\n */\nexports.HEADER_CHARS = ['\\t'];\nfor (let i = 32; i <= 255; i++) {\n if (i !== 127) {\n exports.HEADER_CHARS.push(i);\n }\n}\n// ',' = \\x44\nexports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44);\nexports.MAJOR = exports.NUM_MAP;\nexports.MINOR = exports.MAJOR;\nvar HEADER_STATE;\n(function (HEADER_STATE) {\n HEADER_STATE[HEADER_STATE[\"GENERAL\"] = 0] = \"GENERAL\";\n HEADER_STATE[HEADER_STATE[\"CONNECTION\"] = 1] = \"CONNECTION\";\n HEADER_STATE[HEADER_STATE[\"CONTENT_LENGTH\"] = 2] = \"CONTENT_LENGTH\";\n HEADER_STATE[HEADER_STATE[\"TRANSFER_ENCODING\"] = 3] = \"TRANSFER_ENCODING\";\n HEADER_STATE[HEADER_STATE[\"UPGRADE\"] = 4] = \"UPGRADE\";\n HEADER_STATE[HEADER_STATE[\"CONNECTION_KEEP_ALIVE\"] = 5] = \"CONNECTION_KEEP_ALIVE\";\n HEADER_STATE[HEADER_STATE[\"CONNECTION_CLOSE\"] = 6] = \"CONNECTION_CLOSE\";\n HEADER_STATE[HEADER_STATE[\"CONNECTION_UPGRADE\"] = 7] = \"CONNECTION_UPGRADE\";\n HEADER_STATE[HEADER_STATE[\"TRANSFER_ENCODING_CHUNKED\"] = 8] = \"TRANSFER_ENCODING_CHUNKED\";\n})(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {}));\nexports.SPECIAL_HEADERS = {\n 'connection': HEADER_STATE.CONNECTION,\n 'content-length': HEADER_STATE.CONTENT_LENGTH,\n 'proxy-connection': HEADER_STATE.CONNECTION,\n 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING,\n 'upgrade': HEADER_STATE.UPGRADE,\n};\n//# sourceMappingURL=constants.js.map","module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCsLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC1kAIABBGGpCADcDACAAQgA3AwAgAEE4akIANwMAIABBMGpCADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwHLAcoBuAHJAbkByAG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAQDcAQtBACEQDMYBC0EOIRAMxQELQQ0hEAzEAQtBDyEQDMMBC0EQIRAMwgELQRMhEAzBAQtBFCEQDMABC0EVIRAMvwELQRYhEAy+AQtBFyEQDL0BC0EYIRAMvAELQRkhEAy7AQtBGiEQDLoBC0EbIRAMuQELQRwhEAy4AQtBCCEQDLcBC0EdIRAMtgELQSAhEAy1AQtBHyEQDLQBC0EHIRAMswELQSEhEAyyAQtBIiEQDLEBC0EeIRAMsAELQSMhEAyvAQtBEiEQDK4BC0ERIRAMrQELQSQhEAysAQtBJSEQDKsBC0EmIRAMqgELQSchEAypAQtBwwEhEAyoAQtBKSEQDKcBC0ErIRAMpgELQSwhEAylAQtBLSEQDKQBC0EuIRAMowELQS8hEAyiAQtBxAEhEAyhAQtBMCEQDKABC0E0IRAMnwELQQwhEAyeAQtBMSEQDJ0BC0EyIRAMnAELQTMhEAybAQtBOSEQDJoBC0E1IRAMmQELQcUBIRAMmAELQQshEAyXAQtBOiEQDJYBC0E2IRAMlQELQQohEAyUAQtBNyEQDJMBC0E4IRAMkgELQTwhEAyRAQtBOyEQDJABC0E9IRAMjwELQQkhEAyOAQtBKCEQDI0BC0E+IRAMjAELQT8hEAyLAQtBwAAhEAyKAQtBwQAhEAyJAQtBwgAhEAyIAQtBwwAhEAyHAQtBxAAhEAyGAQtBxQAhEAyFAQtBxgAhEAyEAQtBKiEQDIMBC0HHACEQDIIBC0HIACEQDIEBC0HJACEQDIABC0HKACEQDH8LQcsAIRAMfgtBzQAhEAx9C0HMACEQDHwLQc4AIRAMewtBzwAhEAx6C0HQACEQDHkLQdEAIRAMeAtB0gAhEAx3C0HTACEQDHYLQdQAIRAMdQtB1gAhEAx0C0HVACEQDHMLQQYhEAxyC0HXACEQDHELQQUhEAxwC0HYACEQDG8LQQQhEAxuC0HZACEQDG0LQdoAIRAMbAtB2wAhEAxrC0HcACEQDGoLQQMhEAxpC0HdACEQDGgLQd4AIRAMZwtB3wAhEAxmC0HhACEQDGULQeAAIRAMZAtB4gAhEAxjC0HjACEQDGILQQIhEAxhC0HkACEQDGALQeUAIRAMXwtB5gAhEAxeC0HnACEQDF0LQegAIRAMXAtB6QAhEAxbC0HqACEQDFoLQesAIRAMWQtB7AAhEAxYC0HtACEQDFcLQe4AIRAMVgtB7wAhEAxVC0HwACEQDFQLQfEAIRAMUwtB8gAhEAxSC0HzACEQDFELQfQAIRAMUAtB9QAhEAxPC0H2ACEQDE4LQfcAIRAMTQtB+AAhEAxMC0H5ACEQDEsLQfoAIRAMSgtB+wAhEAxJC0H8ACEQDEgLQf0AIRAMRwtB/gAhEAxGC0H/ACEQDEULQYABIRAMRAtBgQEhEAxDC0GCASEQDEILQYMBIRAMQQtBhAEhEAxAC0GFASEQDD8LQYYBIRAMPgtBhwEhEAw9C0GIASEQDDwLQYkBIRAMOwtBigEhEAw6C0GLASEQDDkLQYwBIRAMOAtBjQEhEAw3C0GOASEQDDYLQY8BIRAMNQtBkAEhEAw0C0GRASEQDDMLQZIBIRAMMgtBkwEhEAwxC0GUASEQDDALQZUBIRAMLwtBlgEhEAwuC0GXASEQDC0LQZgBIRAMLAtBmQEhEAwrC0GaASEQDCoLQZsBIRAMKQtBnAEhEAwoC0GdASEQDCcLQZ4BIRAMJgtBnwEhEAwlC0GgASEQDCQLQaEBIRAMIwtBogEhEAwiC0GjASEQDCELQaQBIRAMIAtBpQEhEAwfC0GmASEQDB4LQacBIRAMHQtBqAEhEAwcC0GpASEQDBsLQaoBIRAMGgtBqwEhEAwZC0GsASEQDBgLQa0BIRAMFwtBrgEhEAwWC0EBIRAMFQtBrwEhEAwUC0GwASEQDBMLQbEBIRAMEgtBswEhEAwRC0GyASEQDBALQbQBIRAMDwtBtQEhEAwOC0G2ASEQDA0LQbcBIRAMDAtBuAEhEAwLC0G5ASEQDAoLQboBIRAMCQtBuwEhEAwIC0HGASEQDAcLQbwBIRAMBgtBvQEhEAwFC0G+ASEQDAQLQb8BIRAMAwtBwAEhEAwCC0HCASEQDAELQcEBIRALA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQDscBAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxweHyAhIyUoP0BBREVGR0hJSktMTU9QUVJT3gNXWVtcXWBiZWZnaGlqa2xtb3BxcnN0dXZ3eHl6e3x9foABggGFAYYBhwGJAYsBjAGNAY4BjwGQAZEBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAZkCpAKwAv4C/gILIAEiBCACRw3zAUHdASEQDP8DCyABIhAgAkcN3QFBwwEhEAz+AwsgASIBIAJHDZABQfcAIRAM/QMLIAEiASACRw2GAUHvACEQDPwDCyABIgEgAkcNf0HqACEQDPsDCyABIgEgAkcNe0HoACEQDPoDCyABIgEgAkcNeEHmACEQDPkDCyABIgEgAkcNGkEYIRAM+AMLIAEiASACRw0UQRIhEAz3AwsgASIBIAJHDVlBxQAhEAz2AwsgASIBIAJHDUpBPyEQDPUDCyABIgEgAkcNSEE8IRAM9AMLIAEiASACRw1BQTEhEAzzAwsgAC0ALkEBRg3rAwyHAgsgACABIgEgAhDAgICAAEEBRw3mASAAQgA3AyAM5wELIAAgASIBIAIQtICAgAAiEA3nASABIQEM9QILAkAgASIBIAJHDQBBBiEQDPADCyAAIAFBAWoiASACELuAgIAAIhAN6AEgASEBDDELIABCADcDIEESIRAM1QMLIAEiECACRw0rQR0hEAztAwsCQCABIgEgAkYNACABQQFqIQFBECEQDNQDC0EHIRAM7AMLIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN5QFBCCEQDOsDCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEUIRAM0gMLQQkhEAzqAwsgASEBIAApAyBQDeQBIAEhAQzyAgsCQCABIgEgAkcNAEELIRAM6QMLIAAgAUEBaiIBIAIQtoCAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3mASABIQEMDQsgACABIgEgAhC6gICAACIQDecBIAEhAQzwAgsCQCABIgEgAkcNAEEPIRAM5QMLIAEtAAAiEEE7Rg0IIBBBDUcN6AEgAUEBaiEBDO8CCyAAIAEiASACELqAgIAAIhAN6AEgASEBDPICCwNAAkAgAS0AAEHwtYCAAGotAAAiEEEBRg0AIBBBAkcN6wEgACgCBCEQIABBADYCBCAAIBAgAUEBaiIBELmAgIAAIhAN6gEgASEBDPQCCyABQQFqIgEgAkcNAAtBEiEQDOIDCyAAIAEiASACELqAgIAAIhAN6QEgASEBDAoLIAEiASACRw0GQRshEAzgAwsCQCABIgEgAkcNAEEWIRAM4AMLIABBioCAgAA2AgggACABNgIEIAAgASACELiAgIAAIhAN6gEgASEBQSAhEAzGAwsCQCABIgEgAkYNAANAAkAgAS0AAEHwt4CAAGotAAAiEEECRg0AAkAgEEF/ag4E5QHsAQDrAewBCyABQQFqIQFBCCEQDMgDCyABQQFqIgEgAkcNAAtBFSEQDN8DC0EVIRAM3gMLA0ACQCABLQAAQfC5gIAAai0AACIQQQJGDQAgEEF/ag4E3gHsAeAB6wHsAQsgAUEBaiIBIAJHDQALQRghEAzdAwsCQCABIgEgAkYNACAAQYuAgIAANgIIIAAgATYCBCABIQFBByEQDMQDC0EZIRAM3AMLIAFBAWohAQwCCwJAIAEiFCACRw0AQRohEAzbAwsgFCEBAkAgFC0AAEFzag4U3QLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gIA7gILQQAhECAAQQA2AhwgAEGvi4CAADYCECAAQQI2AgwgACAUQQFqNgIUDNoDCwJAIAEtAAAiEEE7Rg0AIBBBDUcN6AEgAUEBaiEBDOUCCyABQQFqIQELQSIhEAy/AwsCQCABIhAgAkcNAEEcIRAM2AMLQgAhESAQIQEgEC0AAEFQag435wHmAQECAwQFBgcIAAAAAAAAAAkKCwwNDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAREhMUAAtBHiEQDL0DC0ICIREM5QELQgMhEQzkAQtCBCERDOMBC0IFIREM4gELQgYhEQzhAQtCByERDOABC0IIIREM3wELQgkhEQzeAQtCCiERDN0BC0ILIREM3AELQgwhEQzbAQtCDSERDNoBC0IOIREM2QELQg8hEQzYAQtCCiERDNcBC0ILIREM1gELQgwhEQzVAQtCDSERDNQBC0IOIREM0wELQg8hEQzSAQtCACERAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQLQAAQVBqDjflAeQBAAECAwQFBgfmAeYB5gHmAeYB5gHmAQgJCgsMDeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gEODxAREhPmAQtCAiERDOQBC0IDIREM4wELQgQhEQziAQtCBSERDOEBC0IGIREM4AELQgchEQzfAQtCCCERDN4BC0IJIREM3QELQgohEQzcAQtCCyERDNsBC0IMIREM2gELQg0hEQzZAQtCDiERDNgBC0IPIREM1wELQgohEQzWAQtCCyERDNUBC0IMIREM1AELQg0hEQzTAQtCDiERDNIBC0IPIREM0QELIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN0gFBHyEQDMADCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEkIRAMpwMLQSAhEAy/AwsgACABIhAgAhC+gICAAEF/ag4FtgEAxQIB0QHSAQtBESEQDKQDCyAAQQE6AC8gECEBDLsDCyABIgEgAkcN0gFBJCEQDLsDCyABIg0gAkcNHkHGACEQDLoDCyAAIAEiASACELKAgIAAIhAN1AEgASEBDLUBCyABIhAgAkcNJkHQACEQDLgDCwJAIAEiASACRw0AQSghEAy4AwsgAEEANgIEIABBjICAgAA2AgggACABIAEQsYCAgAAiEA3TASABIQEM2AELAkAgASIQIAJHDQBBKSEQDLcDCyAQLQAAIgFBIEYNFCABQQlHDdMBIBBBAWohAQwVCwJAIAEiASACRg0AIAFBAWohAQwXC0EqIRAMtQMLAkAgASIQIAJHDQBBKyEQDLUDCwJAIBAtAAAiAUEJRg0AIAFBIEcN1QELIAAtACxBCEYN0wEgECEBDJEDCwJAIAEiASACRw0AQSwhEAy0AwsgAS0AAEEKRw3VASABQQFqIQEMyQILIAEiDiACRw3VAUEvIRAMsgMLA0ACQCABLQAAIhBBIEYNAAJAIBBBdmoOBADcAdwBANoBCyABIQEM4AELIAFBAWoiASACRw0AC0ExIRAMsQMLQTIhECABIhQgAkYNsAMgAiAUayAAKAIAIgFqIRUgFCABa0EDaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfC7gIAAai0AAEcNAQJAIAFBA0cNAEEGIQEMlgMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLEDCyAAQQA2AgAgFCEBDNkBC0EzIRAgASIUIAJGDa8DIAIgFGsgACgCACIBaiEVIBQgAWtBCGohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUH0u4CAAGotAABHDQECQCABQQhHDQBBBSEBDJUDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAywAwsgAEEANgIAIBQhAQzYAQtBNCEQIAEiFCACRg2uAyACIBRrIAAoAgAiAWohFSAUIAFrQQVqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw0BAkAgAUEFRw0AQQchAQyUAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMrwMLIABBADYCACAUIQEM1wELAkAgASIBIAJGDQADQAJAIAEtAABBgL6AgABqLQAAIhBBAUYNACAQQQJGDQogASEBDN0BCyABQQFqIgEgAkcNAAtBMCEQDK4DC0EwIRAMrQMLAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AIBBBdmoOBNkB2gHaAdkB2gELIAFBAWoiASACRw0AC0E4IRAMrQMLQTghEAysAwsDQAJAIAEtAAAiEEEgRg0AIBBBCUcNAwsgAUEBaiIBIAJHDQALQTwhEAyrAwsDQAJAIAEtAAAiEEEgRg0AAkACQCAQQXZqDgTaAQEB2gEACyAQQSxGDdsBCyABIQEMBAsgAUEBaiIBIAJHDQALQT8hEAyqAwsgASEBDNsBC0HAACEQIAEiFCACRg2oAyACIBRrIAAoAgAiAWohFiAUIAFrQQZqIRcCQANAIBQtAABBIHIgAUGAwICAAGotAABHDQEgAUEGRg2OAyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAypAwsgAEEANgIAIBQhAQtBNiEQDI4DCwJAIAEiDyACRw0AQcEAIRAMpwMLIABBjICAgAA2AgggACAPNgIEIA8hASAALQAsQX9qDgTNAdUB1wHZAYcDCyABQQFqIQEMzAELAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgciAQIBBBv39qQf8BcUEaSRtB/wFxIhBBCUYNACAQQSBGDQACQAJAAkACQCAQQZ1/ag4TAAMDAwMDAwMBAwMDAwMDAwMDAgMLIAFBAWohAUExIRAMkQMLIAFBAWohAUEyIRAMkAMLIAFBAWohAUEzIRAMjwMLIAEhAQzQAQsgAUEBaiIBIAJHDQALQTUhEAylAwtBNSEQDKQDCwJAIAEiASACRg0AA0ACQCABLQAAQYC8gIAAai0AAEEBRg0AIAEhAQzTAQsgAUEBaiIBIAJHDQALQT0hEAykAwtBPSEQDKMDCyAAIAEiASACELCAgIAAIhAN1gEgASEBDAELIBBBAWohAQtBPCEQDIcDCwJAIAEiASACRw0AQcIAIRAMoAMLAkADQAJAIAEtAABBd2oOGAAC/gL+AoQD/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4CAP4CCyABQQFqIgEgAkcNAAtBwgAhEAygAwsgAUEBaiEBIAAtAC1BAXFFDb0BIAEhAQtBLCEQDIUDCyABIgEgAkcN0wFBxAAhEAydAwsDQAJAIAEtAABBkMCAgABqLQAAQQFGDQAgASEBDLcCCyABQQFqIgEgAkcNAAtBxQAhEAycAwsgDS0AACIQQSBGDbMBIBBBOkcNgQMgACgCBCEBIABBADYCBCAAIAEgDRCvgICAACIBDdABIA1BAWohAQyzAgtBxwAhECABIg0gAkYNmgMgAiANayAAKAIAIgFqIRYgDSABa0EFaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGQwoCAAGotAABHDYADIAFBBUYN9AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmgMLQcgAIRAgASINIAJGDZkDIAIgDWsgACgCACIBaiEWIA0gAWtBCWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBlsKAgABqLQAARw3/AgJAIAFBCUcNAEECIQEM9QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJkDCwJAIAEiDSACRw0AQckAIRAMmQMLAkACQCANLQAAIgFBIHIgASABQb9/akH/AXFBGkkbQf8BcUGSf2oOBwCAA4ADgAOAA4ADAYADCyANQQFqIQFBPiEQDIADCyANQQFqIQFBPyEQDP8CC0HKACEQIAEiDSACRg2XAyACIA1rIAAoAgAiAWohFiANIAFrQQFqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaDCgIAAai0AAEcN/QIgAUEBRg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyXAwtBywAhECABIg0gAkYNlgMgAiANayAAKAIAIgFqIRYgDSABa0EOaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGiwoCAAGotAABHDfwCIAFBDkYN8AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlgMLQcwAIRAgASINIAJGDZUDIAIgDWsgACgCACIBaiEWIA0gAWtBD2ohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBwMKAgABqLQAARw37AgJAIAFBD0cNAEEDIQEM8QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJUDC0HNACEQIAEiDSACRg2UAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQdDCgIAAai0AAEcN+gICQCABQQVHDQBBBCEBDPACCyABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyUAwsCQCABIg0gAkcNAEHOACEQDJQDCwJAAkACQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZ1/ag4TAP0C/QL9Av0C/QL9Av0C/QL9Av0C/QL9AgH9Av0C/QICA/0CCyANQQFqIQFBwQAhEAz9AgsgDUEBaiEBQcIAIRAM/AILIA1BAWohAUHDACEQDPsCCyANQQFqIQFBxAAhEAz6AgsCQCABIgEgAkYNACAAQY2AgIAANgIIIAAgATYCBCABIQFBxQAhEAz6AgtBzwAhEAySAwsgECEBAkACQCAQLQAAQXZqDgQBqAKoAgCoAgsgEEEBaiEBC0EnIRAM+AILAkAgASIBIAJHDQBB0QAhEAyRAwsCQCABLQAAQSBGDQAgASEBDI0BCyABQQFqIQEgAC0ALUEBcUUNxwEgASEBDIwBCyABIhcgAkcNyAFB0gAhEAyPAwtB0wAhECABIhQgAkYNjgMgAiAUayAAKAIAIgFqIRYgFCABa0EBaiEXA0AgFC0AACABQdbCgIAAai0AAEcNzAEgAUEBRg3HASABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAyOAwsCQCABIgEgAkcNAEHVACEQDI4DCyABLQAAQQpHDcwBIAFBAWohAQzHAQsCQCABIgEgAkcNAEHWACEQDI0DCwJAAkAgAS0AAEF2ag4EAM0BzQEBzQELIAFBAWohAQzHAQsgAUEBaiEBQcoAIRAM8wILIAAgASIBIAIQroCAgAAiEA3LASABIQFBzQAhEAzyAgsgAC0AKUEiRg2FAwymAgsCQCABIgEgAkcNAEHbACEQDIoDC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgAS0AAEFQag4K1AHTAQABAgMEBQYI1QELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMzAELQQkhEEEBIRRBACEXQQAhFgzLAQsCQCABIgEgAkcNAEHdACEQDIkDCyABLQAAQS5HDcwBIAFBAWohAQymAgsgASIBIAJHDcwBQd8AIRAMhwMLAkAgASIBIAJGDQAgAEGOgICAADYCCCAAIAE2AgQgASEBQdAAIRAM7gILQeAAIRAMhgMLQeEAIRAgASIBIAJGDYUDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHiwoCAAGotAABHDc0BIBRBA0YNzAEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhQMLQeIAIRAgASIBIAJGDYQDIAIgAWsgACgCACIUaiEWIAEgFGtBAmohFwNAIAEtAAAgFEHmwoCAAGotAABHDcwBIBRBAkYNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhAMLQeMAIRAgASIBIAJGDYMDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHpwoCAAGotAABHDcsBIBRBA0YNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMgwMLAkAgASIBIAJHDQBB5QAhEAyDAwsgACABQQFqIgEgAhCogICAACIQDc0BIAEhAUHWACEQDOkCCwJAIAEiASACRg0AA0ACQCABLQAAIhBBIEYNAAJAAkACQCAQQbh/ag4LAAHPAc8BzwHPAc8BzwHPAc8BAs8BCyABQQFqIQFB0gAhEAztAgsgAUEBaiEBQdMAIRAM7AILIAFBAWohAUHUACEQDOsCCyABQQFqIgEgAkcNAAtB5AAhEAyCAwtB5AAhEAyBAwsDQAJAIAEtAABB8MKAgABqLQAAIhBBAUYNACAQQX5qDgPPAdAB0QHSAQsgAUEBaiIBIAJHDQALQeYAIRAMgAMLAkAgASIBIAJGDQAgAUEBaiEBDAMLQecAIRAM/wILA0ACQCABLQAAQfDEgIAAai0AACIQQQFGDQACQCAQQX5qDgTSAdMB1AEA1QELIAEhAUHXACEQDOcCCyABQQFqIgEgAkcNAAtB6AAhEAz+AgsCQCABIgEgAkcNAEHpACEQDP4CCwJAIAEtAAAiEEF2ag4augHVAdUBvAHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHKAdUB1QEA0wELIAFBAWohAQtBBiEQDOMCCwNAAkAgAS0AAEHwxoCAAGotAABBAUYNACABIQEMngILIAFBAWoiASACRw0AC0HqACEQDPsCCwJAIAEiASACRg0AIAFBAWohAQwDC0HrACEQDPoCCwJAIAEiASACRw0AQewAIRAM+gILIAFBAWohAQwBCwJAIAEiASACRw0AQe0AIRAM+QILIAFBAWohAQtBBCEQDN4CCwJAIAEiFCACRw0AQe4AIRAM9wILIBQhAQJAAkACQCAULQAAQfDIgIAAai0AAEF/ag4H1AHVAdYBAJwCAQLXAQsgFEEBaiEBDAoLIBRBAWohAQzNAQtBACEQIABBADYCHCAAQZuSgIAANgIQIABBBzYCDCAAIBRBAWo2AhQM9gILAkADQAJAIAEtAABB8MiAgABqLQAAIhBBBEYNAAJAAkAgEEF/ag4H0gHTAdQB2QEABAHZAQsgASEBQdoAIRAM4AILIAFBAWohAUHcACEQDN8CCyABQQFqIgEgAkcNAAtB7wAhEAz2AgsgAUEBaiEBDMsBCwJAIAEiFCACRw0AQfAAIRAM9QILIBQtAABBL0cN1AEgFEEBaiEBDAYLAkAgASIUIAJHDQBB8QAhEAz0AgsCQCAULQAAIgFBL0cNACAUQQFqIQFB3QAhEAzbAgsgAUF2aiIEQRZLDdMBQQEgBHRBiYCAAnFFDdMBDMoCCwJAIAEiASACRg0AIAFBAWohAUHeACEQDNoCC0HyACEQDPICCwJAIAEiFCACRw0AQfQAIRAM8gILIBQhAQJAIBQtAABB8MyAgABqLQAAQX9qDgPJApQCANQBC0HhACEQDNgCCwJAIAEiFCACRg0AA0ACQCAULQAAQfDKgIAAai0AACIBQQNGDQACQCABQX9qDgLLAgDVAQsgFCEBQd8AIRAM2gILIBRBAWoiFCACRw0AC0HzACEQDPECC0HzACEQDPACCwJAIAEiASACRg0AIABBj4CAgAA2AgggACABNgIEIAEhAUHgACEQDNcCC0H1ACEQDO8CCwJAIAEiASACRw0AQfYAIRAM7wILIABBj4CAgAA2AgggACABNgIEIAEhAQtBAyEQDNQCCwNAIAEtAABBIEcNwwIgAUEBaiIBIAJHDQALQfcAIRAM7AILAkAgASIBIAJHDQBB+AAhEAzsAgsgAS0AAEEgRw3OASABQQFqIQEM7wELIAAgASIBIAIQrICAgAAiEA3OASABIQEMjgILAkAgASIEIAJHDQBB+gAhEAzqAgsgBC0AAEHMAEcN0QEgBEEBaiEBQRMhEAzPAQsCQCABIgQgAkcNAEH7ACEQDOkCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRADQCAELQAAIAFB8M6AgABqLQAARw3QASABQQVGDc4BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQfsAIRAM6AILAkAgASIEIAJHDQBB/AAhEAzoAgsCQAJAIAQtAABBvX9qDgwA0QHRAdEB0QHRAdEB0QHRAdEB0QEB0QELIARBAWohAUHmACEQDM8CCyAEQQFqIQFB5wAhEAzOAgsCQCABIgQgAkcNAEH9ACEQDOcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDc8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH9ACEQDOcCCyAAQQA2AgAgEEEBaiEBQRAhEAzMAQsCQCABIgQgAkcNAEH+ACEQDOYCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUH2zoCAAGotAABHDc4BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH+ACEQDOYCCyAAQQA2AgAgEEEBaiEBQRYhEAzLAQsCQCABIgQgAkcNAEH/ACEQDOUCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUH8zoCAAGotAABHDc0BIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH/ACEQDOUCCyAAQQA2AgAgEEEBaiEBQQUhEAzKAQsCQCABIgQgAkcNAEGAASEQDOQCCyAELQAAQdkARw3LASAEQQFqIQFBCCEQDMkBCwJAIAEiBCACRw0AQYEBIRAM4wILAkACQCAELQAAQbJ/ag4DAMwBAcwBCyAEQQFqIQFB6wAhEAzKAgsgBEEBaiEBQewAIRAMyQILAkAgASIEIAJHDQBBggEhEAziAgsCQAJAIAQtAABBuH9qDggAywHLAcsBywHLAcsBAcsBCyAEQQFqIQFB6gAhEAzJAgsgBEEBaiEBQe0AIRAMyAILAkAgASIEIAJHDQBBgwEhEAzhAgsgAiAEayAAKAIAIgFqIRAgBCABa0ECaiEUAkADQCAELQAAIAFBgM+AgABqLQAARw3JASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBA2AgBBgwEhEAzhAgtBACEQIABBADYCACAUQQFqIQEMxgELAkAgASIEIAJHDQBBhAEhEAzgAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBg8+AgABqLQAARw3IASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhAEhEAzgAgsgAEEANgIAIBBBAWohAUEjIRAMxQELAkAgASIEIAJHDQBBhQEhEAzfAgsCQAJAIAQtAABBtH9qDggAyAHIAcgByAHIAcgBAcgBCyAEQQFqIQFB7wAhEAzGAgsgBEEBaiEBQfAAIRAMxQILAkAgASIEIAJHDQBBhgEhEAzeAgsgBC0AAEHFAEcNxQEgBEEBaiEBDIMCCwJAIAEiBCACRw0AQYcBIRAM3QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQYjPgIAAai0AAEcNxQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYcBIRAM3QILIABBADYCACAQQQFqIQFBLSEQDMIBCwJAIAEiBCACRw0AQYgBIRAM3AILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNxAEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYgBIRAM3AILIABBADYCACAQQQFqIQFBKSEQDMEBCwJAIAEiASACRw0AQYkBIRAM2wILQQEhECABLQAAQd8ARw3AASABQQFqIQEMgQILAkAgASIEIAJHDQBBigEhEAzaAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQA0AgBC0AACABQYzPgIAAai0AAEcNwQEgAUEBRg2vAiABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGKASEQDNkCCwJAIAEiBCACRw0AQYsBIRAM2QILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQY7PgIAAai0AAEcNwQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYsBIRAM2QILIABBADYCACAQQQFqIQFBAiEQDL4BCwJAIAEiBCACRw0AQYwBIRAM2AILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNwAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYwBIRAM2AILIABBADYCACAQQQFqIQFBHyEQDL0BCwJAIAEiBCACRw0AQY0BIRAM1wILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNvwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY0BIRAM1wILIABBADYCACAQQQFqIQFBCSEQDLwBCwJAIAEiBCACRw0AQY4BIRAM1gILAkACQCAELQAAQbd/ag4HAL8BvwG/Ab8BvwEBvwELIARBAWohAUH4ACEQDL0CCyAEQQFqIQFB+QAhEAy8AgsCQCABIgQgAkcNAEGPASEQDNUCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGRz4CAAGotAABHDb0BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGPASEQDNUCCyAAQQA2AgAgEEEBaiEBQRghEAy6AQsCQCABIgQgAkcNAEGQASEQDNQCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUGXz4CAAGotAABHDbwBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGQASEQDNQCCyAAQQA2AgAgEEEBaiEBQRchEAy5AQsCQCABIgQgAkcNAEGRASEQDNMCCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUGaz4CAAGotAABHDbsBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGRASEQDNMCCyAAQQA2AgAgEEEBaiEBQRUhEAy4AQsCQCABIgQgAkcNAEGSASEQDNICCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGhz4CAAGotAABHDboBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGSASEQDNICCyAAQQA2AgAgEEEBaiEBQR4hEAy3AQsCQCABIgQgAkcNAEGTASEQDNECCyAELQAAQcwARw24ASAEQQFqIQFBCiEQDLYBCwJAIAQgAkcNAEGUASEQDNACCwJAAkAgBC0AAEG/f2oODwC5AbkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AQG5AQsgBEEBaiEBQf4AIRAMtwILIARBAWohAUH/ACEQDLYCCwJAIAQgAkcNAEGVASEQDM8CCwJAAkAgBC0AAEG/f2oOAwC4AQG4AQsgBEEBaiEBQf0AIRAMtgILIARBAWohBEGAASEQDLUCCwJAIAQgAkcNAEGWASEQDM4CCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUGnz4CAAGotAABHDbYBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGWASEQDM4CCyAAQQA2AgAgEEEBaiEBQQshEAyzAQsCQCAEIAJHDQBBlwEhEAzNAgsCQAJAAkACQCAELQAAQVNqDiMAuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AQG4AbgBuAG4AbgBArgBuAG4AQO4AQsgBEEBaiEBQfsAIRAMtgILIARBAWohAUH8ACEQDLUCCyAEQQFqIQRBgQEhEAy0AgsgBEEBaiEEQYIBIRAMswILAkAgBCACRw0AQZgBIRAMzAILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQanPgIAAai0AAEcNtAEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZgBIRAMzAILIABBADYCACAQQQFqIQFBGSEQDLEBCwJAIAQgAkcNAEGZASEQDMsCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGuz4CAAGotAABHDbMBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGZASEQDMsCCyAAQQA2AgAgEEEBaiEBQQYhEAywAQsCQCAEIAJHDQBBmgEhEAzKAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBtM+AgABqLQAARw2yASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmgEhEAzKAgsgAEEANgIAIBBBAWohAUEcIRAMrwELAkAgBCACRw0AQZsBIRAMyQILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbbPgIAAai0AAEcNsQEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZsBIRAMyQILIABBADYCACAQQQFqIQFBJyEQDK4BCwJAIAQgAkcNAEGcASEQDMgCCwJAAkAgBC0AAEGsf2oOAgABsQELIARBAWohBEGGASEQDK8CCyAEQQFqIQRBhwEhEAyuAgsCQCAEIAJHDQBBnQEhEAzHAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBuM+AgABqLQAARw2vASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBnQEhEAzHAgsgAEEANgIAIBBBAWohAUEmIRAMrAELAkAgBCACRw0AQZ4BIRAMxgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbrPgIAAai0AAEcNrgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ4BIRAMxgILIABBADYCACAQQQFqIQFBAyEQDKsBCwJAIAQgAkcNAEGfASEQDMUCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDa0BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGfASEQDMUCCyAAQQA2AgAgEEEBaiEBQQwhEAyqAQsCQCAEIAJHDQBBoAEhEAzEAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBvM+AgABqLQAARw2sASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBoAEhEAzEAgsgAEEANgIAIBBBAWohAUENIRAMqQELAkAgBCACRw0AQaEBIRAMwwILAkACQCAELQAAQbp/ag4LAKwBrAGsAawBrAGsAawBrAGsAQGsAQsgBEEBaiEEQYsBIRAMqgILIARBAWohBEGMASEQDKkCCwJAIAQgAkcNAEGiASEQDMICCyAELQAAQdAARw2pASAEQQFqIQQM6QELAkAgBCACRw0AQaMBIRAMwQILAkACQCAELQAAQbd/ag4HAaoBqgGqAaoBqgEAqgELIARBAWohBEGOASEQDKgCCyAEQQFqIQFBIiEQDKYBCwJAIAQgAkcNAEGkASEQDMACCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHAz4CAAGotAABHDagBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGkASEQDMACCyAAQQA2AgAgEEEBaiEBQR0hEAylAQsCQCAEIAJHDQBBpQEhEAy/AgsCQAJAIAQtAABBrn9qDgMAqAEBqAELIARBAWohBEGQASEQDKYCCyAEQQFqIQFBBCEQDKQBCwJAIAQgAkcNAEGmASEQDL4CCwJAAkACQAJAAkAgBC0AAEG/f2oOFQCqAaoBqgGqAaoBqgGqAaoBqgGqAQGqAaoBAqoBqgEDqgGqAQSqAQsgBEEBaiEEQYgBIRAMqAILIARBAWohBEGJASEQDKcCCyAEQQFqIQRBigEhEAymAgsgBEEBaiEEQY8BIRAMpQILIARBAWohBEGRASEQDKQCCwJAIAQgAkcNAEGnASEQDL0CCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDaUBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGnASEQDL0CCyAAQQA2AgAgEEEBaiEBQREhEAyiAQsCQCAEIAJHDQBBqAEhEAy8AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBws+AgABqLQAARw2kASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqAEhEAy8AgsgAEEANgIAIBBBAWohAUEsIRAMoQELAkAgBCACRw0AQakBIRAMuwILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQcXPgIAAai0AAEcNowEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQakBIRAMuwILIABBADYCACAQQQFqIQFBKyEQDKABCwJAIAQgAkcNAEGqASEQDLoCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHKz4CAAGotAABHDaIBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGqASEQDLoCCyAAQQA2AgAgEEEBaiEBQRQhEAyfAQsCQCAEIAJHDQBBqwEhEAy5AgsCQAJAAkACQCAELQAAQb5/ag4PAAECpAGkAaQBpAGkAaQBpAGkAaQBpAGkAQOkAQsgBEEBaiEEQZMBIRAMogILIARBAWohBEGUASEQDKECCyAEQQFqIQRBlQEhEAygAgsgBEEBaiEEQZYBIRAMnwILAkAgBCACRw0AQawBIRAMuAILIAQtAABBxQBHDZ8BIARBAWohBAzgAQsCQCAEIAJHDQBBrQEhEAy3AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBzc+AgABqLQAARw2fASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrQEhEAy3AgsgAEEANgIAIBBBAWohAUEOIRAMnAELAkAgBCACRw0AQa4BIRAMtgILIAQtAABB0ABHDZ0BIARBAWohAUElIRAMmwELAkAgBCACRw0AQa8BIRAMtQILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNnQEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQa8BIRAMtQILIABBADYCACAQQQFqIQFBKiEQDJoBCwJAIAQgAkcNAEGwASEQDLQCCwJAAkAgBC0AAEGrf2oOCwCdAZ0BnQGdAZ0BnQGdAZ0BnQEBnQELIARBAWohBEGaASEQDJsCCyAEQQFqIQRBmwEhEAyaAgsCQCAEIAJHDQBBsQEhEAyzAgsCQAJAIAQtAABBv39qDhQAnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBAZwBCyAEQQFqIQRBmQEhEAyaAgsgBEEBaiEEQZwBIRAMmQILAkAgBCACRw0AQbIBIRAMsgILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQdnPgIAAai0AAEcNmgEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbIBIRAMsgILIABBADYCACAQQQFqIQFBISEQDJcBCwJAIAQgAkcNAEGzASEQDLECCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUHdz4CAAGotAABHDZkBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGzASEQDLECCyAAQQA2AgAgEEEBaiEBQRohEAyWAQsCQCAEIAJHDQBBtAEhEAywAgsCQAJAAkAgBC0AAEG7f2oOEQCaAZoBmgGaAZoBmgGaAZoBmgEBmgGaAZoBmgGaAQKaAQsgBEEBaiEEQZ0BIRAMmAILIARBAWohBEGeASEQDJcCCyAEQQFqIQRBnwEhEAyWAgsCQCAEIAJHDQBBtQEhEAyvAgsgAiAEayAAKAIAIgFqIRQgBCABa0EFaiEQAkADQCAELQAAIAFB5M+AgABqLQAARw2XASABQQVGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtQEhEAyvAgsgAEEANgIAIBBBAWohAUEoIRAMlAELAkAgBCACRw0AQbYBIRAMrgILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQerPgIAAai0AAEcNlgEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbYBIRAMrgILIABBADYCACAQQQFqIQFBByEQDJMBCwJAIAQgAkcNAEG3ASEQDK0CCwJAAkAgBC0AAEG7f2oODgCWAZYBlgGWAZYBlgGWAZYBlgGWAZYBlgEBlgELIARBAWohBEGhASEQDJQCCyAEQQFqIQRBogEhEAyTAgsCQCAEIAJHDQBBuAEhEAysAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB7c+AgABqLQAARw2UASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuAEhEAysAgsgAEEANgIAIBBBAWohAUESIRAMkQELAkAgBCACRw0AQbkBIRAMqwILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNkwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbkBIRAMqwILIABBADYCACAQQQFqIQFBICEQDJABCwJAIAQgAkcNAEG6ASEQDKoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHyz4CAAGotAABHDZIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG6ASEQDKoCCyAAQQA2AgAgEEEBaiEBQQ8hEAyPAQsCQCAEIAJHDQBBuwEhEAypAgsCQAJAIAQtAABBt39qDgcAkgGSAZIBkgGSAQGSAQsgBEEBaiEEQaUBIRAMkAILIARBAWohBEGmASEQDI8CCwJAIAQgAkcNAEG8ASEQDKgCCyACIARrIAAoAgAiAWohFCAEIAFrQQdqIRACQANAIAQtAAAgAUH0z4CAAGotAABHDZABIAFBB0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG8ASEQDKgCCyAAQQA2AgAgEEEBaiEBQRshEAyNAQsCQCAEIAJHDQBBvQEhEAynAgsCQAJAAkAgBC0AAEG+f2oOEgCRAZEBkQGRAZEBkQGRAZEBkQEBkQGRAZEBkQGRAZEBApEBCyAEQQFqIQRBpAEhEAyPAgsgBEEBaiEEQacBIRAMjgILIARBAWohBEGoASEQDI0CCwJAIAQgAkcNAEG+ASEQDKYCCyAELQAAQc4ARw2NASAEQQFqIQQMzwELAkAgBCACRw0AQb8BIRAMpQILAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBC0AAEG/f2oOFQABAgOcAQQFBpwBnAGcAQcICQoLnAEMDQ4PnAELIARBAWohAUHoACEQDJoCCyAEQQFqIQFB6QAhEAyZAgsgBEEBaiEBQe4AIRAMmAILIARBAWohAUHyACEQDJcCCyAEQQFqIQFB8wAhEAyWAgsgBEEBaiEBQfYAIRAMlQILIARBAWohAUH3ACEQDJQCCyAEQQFqIQFB+gAhEAyTAgsgBEEBaiEEQYMBIRAMkgILIARBAWohBEGEASEQDJECCyAEQQFqIQRBhQEhEAyQAgsgBEEBaiEEQZIBIRAMjwILIARBAWohBEGYASEQDI4CCyAEQQFqIQRBoAEhEAyNAgsgBEEBaiEEQaMBIRAMjAILIARBAWohBEGqASEQDIsCCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEGrASEQDIsCC0HAASEQDKMCCyAAIAUgAhCqgICAACIBDYsBIAUhAQxcCwJAIAYgAkYNACAGQQFqIQUMjQELQcIBIRAMoQILA0ACQCAQLQAAQXZqDgSMAQAAjwEACyAQQQFqIhAgAkcNAAtBwwEhEAygAgsCQCAHIAJGDQAgAEGRgICAADYCCCAAIAc2AgQgByEBQQEhEAyHAgtBxAEhEAyfAgsCQCAHIAJHDQBBxQEhEAyfAgsCQAJAIActAABBdmoOBAHOAc4BAM4BCyAHQQFqIQYMjQELIAdBAWohBQyJAQsCQCAHIAJHDQBBxgEhEAyeAgsCQAJAIActAABBdmoOFwGPAY8BAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAQCPAQsgB0EBaiEHC0GwASEQDIQCCwJAIAggAkcNAEHIASEQDJ0CCyAILQAAQSBHDY0BIABBADsBMiAIQQFqIQFBswEhEAyDAgsgASEXAkADQCAXIgcgAkYNASAHLQAAQVBqQf8BcSIQQQpPDcwBAkAgAC8BMiIUQZkzSw0AIAAgFEEKbCIUOwEyIBBB//8DcyAUQf7/A3FJDQAgB0EBaiEXIAAgFCAQaiIQOwEyIBBB//8DcUHoB0kNAQsLQQAhECAAQQA2AhwgAEHBiYCAADYCECAAQQ02AgwgACAHQQFqNgIUDJwCC0HHASEQDJsCCyAAIAggAhCugICAACIQRQ3KASAQQRVHDYwBIABByAE2AhwgACAINgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAyaAgsCQCAJIAJHDQBBzAEhEAyaAgtBACEUQQEhF0EBIRZBACEQAkACQAJAAkACQAJAAkACQAJAIAktAABBUGoOCpYBlQEAAQIDBAUGCJcBC0ECIRAMBgtBAyEQDAULQQQhEAwEC0EFIRAMAwtBBiEQDAILQQchEAwBC0EIIRALQQAhF0EAIRZBACEUDI4BC0EJIRBBASEUQQAhF0EAIRYMjQELAkAgCiACRw0AQc4BIRAMmQILIAotAABBLkcNjgEgCkEBaiEJDMoBCyALIAJHDY4BQdABIRAMlwILAkAgCyACRg0AIABBjoCAgAA2AgggACALNgIEQbcBIRAM/gELQdEBIRAMlgILAkAgBCACRw0AQdIBIRAMlgILIAIgBGsgACgCACIQaiEUIAQgEGtBBGohCwNAIAQtAAAgEEH8z4CAAGotAABHDY4BIBBBBEYN6QEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB0gEhEAyVAgsgACAMIAIQrICAgAAiAQ2NASAMIQEMuAELAkAgBCACRw0AQdQBIRAMlAILIAIgBGsgACgCACIQaiEUIAQgEGtBAWohDANAIAQtAAAgEEGB0ICAAGotAABHDY8BIBBBAUYNjgEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB1AEhEAyTAgsCQCAEIAJHDQBB1gEhEAyTAgsgAiAEayAAKAIAIhBqIRQgBCAQa0ECaiELA0AgBC0AACAQQYPQgIAAai0AAEcNjgEgEEECRg2QASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHWASEQDJICCwJAIAQgAkcNAEHXASEQDJICCwJAAkAgBC0AAEG7f2oOEACPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAY8BCyAEQQFqIQRBuwEhEAz5AQsgBEEBaiEEQbwBIRAM+AELAkAgBCACRw0AQdgBIRAMkQILIAQtAABByABHDYwBIARBAWohBAzEAQsCQCAEIAJGDQAgAEGQgICAADYCCCAAIAQ2AgRBvgEhEAz3AQtB2QEhEAyPAgsCQCAEIAJHDQBB2gEhEAyPAgsgBC0AAEHIAEYNwwEgAEEBOgAoDLkBCyAAQQI6AC8gACAEIAIQpoCAgAAiEA2NAUHCASEQDPQBCyAALQAoQX9qDgK3AbkBuAELA0ACQCAELQAAQXZqDgQAjgGOAQCOAQsgBEEBaiIEIAJHDQALQd0BIRAMiwILIABBADoALyAALQAtQQRxRQ2EAgsgAEEAOgAvIABBAToANCABIQEMjAELIBBBFUYN2gEgAEEANgIcIAAgATYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMiAILAkAgACAQIAIQtICAgAAiBA0AIBAhAQyBAgsCQCAEQRVHDQAgAEEDNgIcIAAgEDYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMiAILIABBADYCHCAAIBA2AhQgAEGnjoCAADYCECAAQRI2AgxBACEQDIcCCyAQQRVGDdYBIABBADYCHCAAIAE2AhQgAEHajYCAADYCECAAQRQ2AgxBACEQDIYCCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNjQEgAEEHNgIcIAAgEDYCFCAAIBQ2AgxBACEQDIUCCyAAIAAvATBBgAFyOwEwIAEhAQtBKiEQDOoBCyAQQRVGDdEBIABBADYCHCAAIAE2AhQgAEGDjICAADYCECAAQRM2AgxBACEQDIICCyAQQRVGDc8BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDIECCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyNAQsgAEEMNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDIACCyAQQRVGDcwBIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDP8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyMAQsgAEENNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDP4BCyAQQRVGDckBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDP0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyLAQsgAEEONgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPwBCyAAQQA2AhwgACABNgIUIABBwJWAgAA2AhAgAEECNgIMQQAhEAz7AQsgEEEVRg3FASAAQQA2AhwgACABNgIUIABBxoyAgAA2AhAgAEEjNgIMQQAhEAz6AQsgAEEQNgIcIAAgATYCFCAAIBA2AgxBACEQDPkBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQzxAQsgAEERNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPgBCyAQQRVGDcEBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPcBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyIAQsgAEETNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPYBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQztAQsgAEEUNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPUBCyAQQRVGDb0BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDPQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyGAQsgAEEWNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPMBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQt4CAgAAiBA0AIAFBAWohAQzpAQsgAEEXNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPIBCyAAQQA2AhwgACABNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzxAQtCASERCyAQQQFqIQECQCAAKQMgIhJC//////////8PVg0AIAAgEkIEhiARhDcDICABIQEMhAELIABBADYCHCAAIAE2AhQgAEGtiYCAADYCECAAQQw2AgxBACEQDO8BCyAAQQA2AhwgACAQNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzuAQsgACgCBCEXIABBADYCBCAQIBGnaiIWIQEgACAXIBAgFiAUGyIQELWAgIAAIhRFDXMgAEEFNgIcIAAgEDYCFCAAIBQ2AgxBACEQDO0BCyAAQQA2AhwgACAQNgIUIABBqpyAgAA2AhAgAEEPNgIMQQAhEAzsAQsgACAQIAIQtICAgAAiAQ0BIBAhAQtBDiEQDNEBCwJAIAFBFUcNACAAQQI2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAzqAQsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAM6QELIAFBAWohEAJAIAAvATAiAUGAAXFFDQACQCAAIBAgAhC7gICAACIBDQAgECEBDHALIAFBFUcNugEgAEEFNgIcIAAgEDYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAM6QELAkAgAUGgBHFBoARHDQAgAC0ALUECcQ0AIABBADYCHCAAIBA2AhQgAEGWk4CAADYCECAAQQQ2AgxBACEQDOkBCyAAIBAgAhC9gICAABogECEBAkACQAJAAkACQCAAIBAgAhCzgICAAA4WAgEABAQEBAQEBAQEBAQEBAQEBAQEAwQLIABBAToALgsgACAALwEwQcAAcjsBMCAQIQELQSYhEAzRAQsgAEEjNgIcIAAgEDYCFCAAQaWWgIAANgIQIABBFTYCDEEAIRAM6QELIABBADYCHCAAIBA2AhQgAEHVi4CAADYCECAAQRE2AgxBACEQDOgBCyAALQAtQQFxRQ0BQcMBIRAMzgELAkAgDSACRg0AA0ACQCANLQAAQSBGDQAgDSEBDMQBCyANQQFqIg0gAkcNAAtBJSEQDOcBC0ElIRAM5gELIAAoAgQhBCAAQQA2AgQgACAEIA0Qr4CAgAAiBEUNrQEgAEEmNgIcIAAgBDYCDCAAIA1BAWo2AhRBACEQDOUBCyAQQRVGDasBIABBADYCHCAAIAE2AhQgAEH9jYCAADYCECAAQR02AgxBACEQDOQBCyAAQSc2AhwgACABNgIUIAAgEDYCDEEAIRAM4wELIBAhAUEBIRQCQAJAAkACQAJAAkACQCAALQAsQX5qDgcGBQUDAQIABQsgACAALwEwQQhyOwEwDAMLQQIhFAwBC0EEIRQLIABBAToALCAAIAAvATAgFHI7ATALIBAhAQtBKyEQDMoBCyAAQQA2AhwgACAQNgIUIABBq5KAgAA2AhAgAEELNgIMQQAhEAziAQsgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDEEAIRAM4QELIABBADoALCAQIQEMvQELIBAhAUEBIRQCQAJAAkACQAJAIAAtACxBe2oOBAMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0EpIRAMxQELIABBADYCHCAAIAE2AhQgAEHwlICAADYCECAAQQM2AgxBACEQDN0BCwJAIA4tAABBDUcNACAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA5BAWohAQx1CyAAQSw2AhwgACABNgIMIAAgDkEBajYCFEEAIRAM3QELIAAtAC1BAXFFDQFBxAEhEAzDAQsCQCAOIAJHDQBBLSEQDNwBCwJAAkADQAJAIA4tAABBdmoOBAIAAAMACyAOQQFqIg4gAkcNAAtBLSEQDN0BCyAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA4hAQx0CyAAQSw2AhwgACAONgIUIAAgATYCDEEAIRAM3AELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHMLIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzbAQsgACgCBCEEIABBADYCBCAAIAQgDhCxgICAACIEDaABIA4hAQzOAQsgEEEsRw0BIAFBAWohEEEBIQECQAJAAkACQAJAIAAtACxBe2oOBAMBAgQACyAQIQEMBAtBAiEBDAELQQQhAQsgAEEBOgAsIAAgAC8BMCABcjsBMCAQIQEMAQsgACAALwEwQQhyOwEwIBAhAQtBOSEQDL8BCyAAQQA6ACwgASEBC0E0IRAMvQELIAAgAC8BMEEgcjsBMCABIQEMAgsgACgCBCEEIABBADYCBAJAIAAgBCABELGAgIAAIgQNACABIQEMxwELIABBNzYCHCAAIAE2AhQgACAENgIMQQAhEAzUAQsgAEEIOgAsIAEhAQtBMCEQDLkBCwJAIAAtAChBAUYNACABIQEMBAsgAC0ALUEIcUUNkwEgASEBDAMLIAAtADBBIHENlAFBxQEhEAy3AQsCQCAPIAJGDQACQANAAkAgDy0AAEFQaiIBQf8BcUEKSQ0AIA8hAUE1IRAMugELIAApAyAiEUKZs+bMmbPmzBlWDQEgACARQgp+IhE3AyAgESABrUL/AYMiEkJ/hVYNASAAIBEgEnw3AyAgD0EBaiIPIAJHDQALQTkhEAzRAQsgACgCBCECIABBADYCBCAAIAIgD0EBaiIEELGAgIAAIgINlQEgBCEBDMMBC0E5IRAMzwELAkAgAC8BMCIBQQhxRQ0AIAAtAChBAUcNACAALQAtQQhxRQ2QAQsgACABQff7A3FBgARyOwEwIA8hAQtBNyEQDLQBCyAAIAAvATBBEHI7ATAMqwELIBBBFUYNiwEgAEEANgIcIAAgATYCFCAAQfCOgIAANgIQIABBHDYCDEEAIRAMywELIABBwwA2AhwgACABNgIMIAAgDUEBajYCFEEAIRAMygELAkAgAS0AAEE6Rw0AIAAoAgQhECAAQQA2AgQCQCAAIBAgARCvgICAACIQDQAgAUEBaiEBDGMLIABBwwA2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMygELIABBADYCHCAAIAE2AhQgAEGxkYCAADYCECAAQQo2AgxBACEQDMkBCyAAQQA2AhwgACABNgIUIABBoJmAgAA2AhAgAEEeNgIMQQAhEAzIAQsgAEEANgIACyAAQYASOwEqIAAgF0EBaiIBIAIQqICAgAAiEA0BIAEhAQtBxwAhEAysAQsgEEEVRw2DASAAQdEANgIcIAAgATYCFCAAQeOXgIAANgIQIABBFTYCDEEAIRAMxAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDF4LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMwwELIABBADYCHCAAIBQ2AhQgAEHBqICAADYCECAAQQc2AgwgAEEANgIAQQAhEAzCAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAzBAQtBACEQIABBADYCHCAAIAE2AhQgAEGAkYCAADYCECAAQQk2AgwMwAELIBBBFUYNfSAAQQA2AhwgACABNgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAy/AQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgAUEBaiEBAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBAJAIAAgECABEK2AgIAAIhANACABIQEMXAsgAEHYADYCHCAAIAE2AhQgACAQNgIMQQAhEAy+AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMrQELIABB2QA2AhwgACABNgIUIAAgBDYCDEEAIRAMvQELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKsBCyAAQdoANgIcIAAgATYCFCAAIAQ2AgxBACEQDLwBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQypAQsgAEHcADYCHCAAIAE2AhQgACAENgIMQQAhEAy7AQsCQCABLQAAQVBqIhBB/wFxQQpPDQAgACAQOgAqIAFBAWohAUHPACEQDKIBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQynAQsgAEHeADYCHCAAIAE2AhQgACAENgIMQQAhEAy6AQsgAEEANgIAIBdBAWohAQJAIAAtAClBI08NACABIQEMWQsgAEEANgIcIAAgATYCFCAAQdOJgIAANgIQIABBCDYCDEEAIRAMuQELIABBADYCAAtBACEQIABBADYCHCAAIAE2AhQgAEGQs4CAADYCECAAQQg2AgwMtwELIABBADYCACAXQQFqIQECQCAALQApQSFHDQAgASEBDFYLIABBADYCHCAAIAE2AhQgAEGbioCAADYCECAAQQg2AgxBACEQDLYBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKSIQQV1qQQtPDQAgASEBDFULAkAgEEEGSw0AQQEgEHRBygBxRQ0AIAEhAQxVC0EAIRAgAEEANgIcIAAgATYCFCAAQfeJgIAANgIQIABBCDYCDAy1AQsgEEEVRg1xIABBADYCHCAAIAE2AhQgAEG5jYCAADYCECAAQRo2AgxBACEQDLQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxUCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLMBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAUNgIUIAAgATYCDEEAIRAMogELIABBADYCHCAAIBQ2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKEBCyAAQQA2AhwgACABNgIUIABBw4+AgAA2AhAgAEEHNgIMQQAhEAygAQtBACEQIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgwMnwELIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgxBACEQDJ4BCyAAQQA2AhwgACAUNgIUIABB/pGAgAA2AhAgAEEHNgIMQQAhEAydAQsgAEEANgIcIAAgATYCFCAAQY6bgIAANgIQIABBBjYCDEEAIRAMnAELIBBBFUYNVyAAQQA2AhwgACABNgIUIABBzI6AgAA2AhAgAEEgNgIMQQAhEAybAQsgAEEANgIAIBBBAWohAUEkIRALIAAgEDoAKSAAKAIEIRAgAEEANgIEIAAgECABEKuAgIAAIhANVCABIQEMPgsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQfGbgIAANgIQIABBBjYCDAyXAQsgAUEVRg1QIABBADYCHCAAIAU2AhQgAEHwjICAADYCECAAQRs2AgxBACEQDJYBCyAAKAIEIQUgAEEANgIEIAAgBSAQEKmAgIAAIgUNASAQQQFqIQULQa0BIRAMewsgAEHBATYCHCAAIAU2AgwgACAQQQFqNgIUQQAhEAyTAQsgACgCBCEGIABBADYCBCAAIAYgEBCpgICAACIGDQEgEEEBaiEGC0GuASEQDHgLIABBwgE2AhwgACAGNgIMIAAgEEEBajYCFEEAIRAMkAELIABBADYCHCAAIAc2AhQgAEGXi4CAADYCECAAQQ02AgxBACEQDI8BCyAAQQA2AhwgACAINgIUIABB45CAgAA2AhAgAEEJNgIMQQAhEAyOAQsgAEEANgIcIAAgCDYCFCAAQZSNgIAANgIQIABBITYCDEEAIRAMjQELQQEhFkEAIRdBACEUQQEhEAsgACAQOgArIAlBAWohCAJAAkAgAC0ALUEQcQ0AAkACQAJAIAAtACoOAwEAAgQLIBZFDQMMAgsgFA0BDAILIBdFDQELIAAoAgQhECAAQQA2AgQgACAQIAgQrYCAgAAiEEUNPSAAQckBNgIcIAAgCDYCFCAAIBA2AgxBACEQDIwBCyAAKAIEIQQgAEEANgIEIAAgBCAIEK2AgIAAIgRFDXYgAEHKATYCHCAAIAg2AhQgACAENgIMQQAhEAyLAQsgACgCBCEEIABBADYCBCAAIAQgCRCtgICAACIERQ10IABBywE2AhwgACAJNgIUIAAgBDYCDEEAIRAMigELIAAoAgQhBCAAQQA2AgQgACAEIAoQrYCAgAAiBEUNciAAQc0BNgIcIAAgCjYCFCAAIAQ2AgxBACEQDIkBCwJAIAstAABBUGoiEEH/AXFBCk8NACAAIBA6ACogC0EBaiEKQbYBIRAMcAsgACgCBCEEIABBADYCBCAAIAQgCxCtgICAACIERQ1wIABBzwE2AhwgACALNgIUIAAgBDYCDEEAIRAMiAELIABBADYCHCAAIAQ2AhQgAEGQs4CAADYCECAAQQg2AgwgAEEANgIAQQAhEAyHAQsgAUEVRg0/IABBADYCHCAAIAw2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDIYBCyAAQYEEOwEoIAAoAgQhECAAQgA3AwAgACAQIAxBAWoiDBCrgICAACIQRQ04IABB0wE2AhwgACAMNgIUIAAgEDYCDEEAIRAMhQELIABBADYCAAtBACEQIABBADYCHCAAIAQ2AhQgAEHYm4CAADYCECAAQQg2AgwMgwELIAAoAgQhECAAQgA3AwAgACAQIAtBAWoiCxCrgICAACIQDQFBxgEhEAxpCyAAQQI6ACgMVQsgAEHVATYCHCAAIAs2AhQgACAQNgIMQQAhEAyAAQsgEEEVRg03IABBADYCHCAAIAQ2AhQgAEGkjICAADYCECAAQRA2AgxBACEQDH8LIAAtADRBAUcNNCAAIAQgAhC8gICAACIQRQ00IBBBFUcNNSAAQdwBNgIcIAAgBDYCFCAAQdWWgIAANgIQIABBFTYCDEEAIRAMfgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQMfQtBACEQDGMLQQIhEAxiC0ENIRAMYQtBDyEQDGALQSUhEAxfC0ETIRAMXgtBFSEQDF0LQRYhEAxcC0EXIRAMWwtBGCEQDFoLQRkhEAxZC0EaIRAMWAtBGyEQDFcLQRwhEAxWC0EdIRAMVQtBHyEQDFQLQSEhEAxTC0EjIRAMUgtBxgAhEAxRC0EuIRAMUAtBLyEQDE8LQTshEAxOC0E9IRAMTQtByAAhEAxMC0HJACEQDEsLQcsAIRAMSgtBzAAhEAxJC0HOACEQDEgLQdEAIRAMRwtB1QAhEAxGC0HYACEQDEULQdkAIRAMRAtB2wAhEAxDC0HkACEQDEILQeUAIRAMQQtB8QAhEAxAC0H0ACEQDD8LQY0BIRAMPgtBlwEhEAw9C0GpASEQDDwLQawBIRAMOwtBwAEhEAw6C0G5ASEQDDkLQa8BIRAMOAtBsQEhEAw3C0GyASEQDDYLQbQBIRAMNQtBtQEhEAw0C0G6ASEQDDMLQb0BIRAMMgtBvwEhEAwxC0HBASEQDDALIABBADYCHCAAIAQ2AhQgAEHpi4CAADYCECAAQR82AgxBACEQDEgLIABB2wE2AhwgACAENgIUIABB+paAgAA2AhAgAEEVNgIMQQAhEAxHCyAAQfgANgIcIAAgDDYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMRgsgAEHRADYCHCAAIAU2AhQgAEGwl4CAADYCECAAQRU2AgxBACEQDEULIABB+QA2AhwgACABNgIUIAAgEDYCDEEAIRAMRAsgAEH4ADYCHCAAIAE2AhQgAEHKmICAADYCECAAQRU2AgxBACEQDEMLIABB5AA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAxCCyAAQdcANgIcIAAgATYCFCAAQcmXgIAANgIQIABBFTYCDEEAIRAMQQsgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMQAsgAEHCADYCHCAAIAE2AhQgAEHjmICAADYCECAAQRU2AgxBACEQDD8LIABBADYCBCAAIA8gDxCxgICAACIERQ0BIABBOjYCHCAAIAQ2AgwgACAPQQFqNgIUQQAhEAw+CyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBEUNACAAQTs2AhwgACAENgIMIAAgAUEBajYCFEEAIRAMPgsgAUEBaiEBDC0LIA9BAWohAQwtCyAAQQA2AhwgACAPNgIUIABB5JKAgAA2AhAgAEEENgIMQQAhEAw7CyAAQTY2AhwgACAENgIUIAAgAjYCDEEAIRAMOgsgAEEuNgIcIAAgDjYCFCAAIAQ2AgxBACEQDDkLIABB0AA2AhwgACABNgIUIABBkZiAgAA2AhAgAEEVNgIMQQAhEAw4CyANQQFqIQEMLAsgAEEVNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMNgsgAEEbNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNQsgAEEPNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNAsgAEELNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMMwsgAEEaNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMgsgAEELNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMQsgAEEKNgIcIAAgATYCFCAAQeSWgIAANgIQIABBFTYCDEEAIRAMMAsgAEEeNgIcIAAgATYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAMLwsgAEEANgIcIAAgEDYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMLgsgAEEENgIcIAAgATYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMLQsgAEEANgIAIAtBAWohCwtBuAEhEAwSCyAAQQA2AgAgEEEBaiEBQfUAIRAMEQsgASEBAkAgAC0AKUEFRw0AQeMAIRAMEQtB4gAhEAwQC0EAIRAgAEEANgIcIABB5JGAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAwoCyAAQQA2AgAgF0EBaiEBQcAAIRAMDgtBASEBCyAAIAE6ACwgAEEANgIAIBdBAWohAQtBKCEQDAsLIAEhAQtBOCEQDAkLAkAgASIPIAJGDQADQAJAIA8tAABBgL6AgABqLQAAIgFBAUYNACABQQJHDQMgD0EBaiEBDAQLIA9BAWoiDyACRw0AC0E+IRAMIgtBPiEQDCELIABBADoALCAPIQEMAQtBCyEQDAYLQTohEAwFCyABQQFqIQFBLSEQDAQLIAAgAToALCAAQQA2AgAgFkEBaiEBQQwhEAwDCyAAQQA2AgAgF0EBaiEBQQohEAwCCyAAQQA2AgALIABBADoALCANIQFBCSEQDAALC0EAIRAgAEEANgIcIAAgCzYCFCAAQc2QgIAANgIQIABBCTYCDAwXC0EAIRAgAEEANgIcIAAgCjYCFCAAQemKgIAANgIQIABBCTYCDAwWC0EAIRAgAEEANgIcIAAgCTYCFCAAQbeQgIAANgIQIABBCTYCDAwVC0EAIRAgAEEANgIcIAAgCDYCFCAAQZyRgIAANgIQIABBCTYCDAwUC0EAIRAgAEEANgIcIAAgATYCFCAAQc2QgIAANgIQIABBCTYCDAwTC0EAIRAgAEEANgIcIAAgATYCFCAAQemKgIAANgIQIABBCTYCDAwSC0EAIRAgAEEANgIcIAAgATYCFCAAQbeQgIAANgIQIABBCTYCDAwRC0EAIRAgAEEANgIcIAAgATYCFCAAQZyRgIAANgIQIABBCTYCDAwQC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwPC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwOC0EAIRAgAEEANgIcIAAgATYCFCAAQcCSgIAANgIQIABBCzYCDAwNC0EAIRAgAEEANgIcIAAgATYCFCAAQZWJgIAANgIQIABBCzYCDAwMC0EAIRAgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDAwLC0EAIRAgAEEANgIcIAAgATYCFCAAQfuPgIAANgIQIABBCjYCDAwKC0EAIRAgAEEANgIcIAAgATYCFCAAQfGZgIAANgIQIABBAjYCDAwJC0EAIRAgAEEANgIcIAAgATYCFCAAQcSUgIAANgIQIABBAjYCDAwIC0EAIRAgAEEANgIcIAAgATYCFCAAQfKVgIAANgIQIABBAjYCDAwHCyAAQQI2AhwgACABNgIUIABBnJqAgAA2AhAgAEEWNgIMQQAhEAwGC0EBIRAMBQtB1AAhECABIgQgAkYNBCADQQhqIAAgBCACQdjCgIAAQQoQxYCAgAAgAygCDCEEIAMoAggOAwEEAgALEMqAgIAAAAsgAEEANgIcIABBtZqAgAA2AhAgAEEXNgIMIAAgBEEBajYCFEEAIRAMAgsgAEEANgIcIAAgBDYCFCAAQcqagIAANgIQIABBCTYCDEEAIRAMAQsCQCABIgQgAkcNAEEiIRAMAQsgAEGJgICAADYCCCAAIAQ2AgRBISEQCyADQRBqJICAgIAAIBALrwEBAn8gASgCACEGAkACQCACIANGDQAgBCAGaiEEIAYgA2ogAmshByACIAZBf3MgBWoiBmohBQNAAkAgAi0AACAELQAARg0AQQIhBAwDCwJAIAYNAEEAIQQgBSECDAMLIAZBf2ohBiAEQQFqIQQgAkEBaiICIANHDQALIAchBiADIQILIABBATYCACABIAY2AgAgACACNgIEDwsgAUEANgIAIAAgBDYCACAAIAI2AgQLCgAgABDHgICAAAvyNgELfyOAgICAAEEQayIBJICAgIAAAkBBACgCoNCAgAANAEEAEMuAgIAAQYDUhIAAayICQdkASQ0AQQAhAwJAQQAoAuDTgIAAIgQNAEEAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEIakFwcUHYqtWqBXMiBDYC4NOAgABBAEEANgL004CAAEEAQQA2AsTTgIAAC0EAIAI2AszTgIAAQQBBgNSEgAA2AsjTgIAAQQBBgNSEgAA2ApjQgIAAQQAgBDYCrNCAgABBAEF/NgKo0ICAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALQYDUhIAAQXhBgNSEgABrQQ9xQQBBgNSEgABBCGpBD3EbIgNqIgRBBGogAkFIaiIFIANrIgNBAXI2AgBBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAQYDUhIAAIAVqQTg2AgQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFLDQACQEEAKAKI0ICAACIGQRAgAEETakFwcSAAQQtJGyICQQN2IgR2IgNBA3FFDQACQAJAIANBAXEgBHJBAXMiBUEDdCIEQbDQgIAAaiIDIARBuNCAgABqKAIAIgQoAggiAkcNAEEAIAZBfiAFd3E2AojQgIAADAELIAMgAjYCCCACIAM2AgwLIARBCGohAyAEIAVBA3QiBUEDcjYCBCAEIAVqIgQgBCgCBEEBcjYCBAwMCyACQQAoApDQgIAAIgdNDQECQCADRQ0AAkACQCADIAR0QQIgBHQiA0EAIANrcnEiA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqIgRBA3QiA0Gw0ICAAGoiBSADQbjQgIAAaigCACIDKAIIIgBHDQBBACAGQX4gBHdxIgY2AojQgIAADAELIAUgADYCCCAAIAU2AgwLIAMgAkEDcjYCBCADIARBA3QiBGogBCACayIFNgIAIAMgAmoiACAFQQFyNgIEAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQQCQAJAIAZBASAHQQN2dCIIcQ0AQQAgBiAIcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCAENgIMIAIgBDYCCCAEIAI2AgwgBCAINgIICyADQQhqIQNBACAANgKc0ICAAEEAIAU2ApDQgIAADAwLQQAoAozQgIAAIglFDQEgCUEAIAlrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqQQJ0QbjSgIAAaigCACIAKAIEQXhxIAJrIQQgACEFAkADQAJAIAUoAhAiAw0AIAVBFGooAgAiA0UNAgsgAygCBEF4cSACayIFIAQgBSAESSIFGyEEIAMgACAFGyEAIAMhBQwACwsgACgCGCEKAkAgACgCDCIIIABGDQAgACgCCCIDQQAoApjQgIAASRogCCADNgIIIAMgCDYCDAwLCwJAIABBFGoiBSgCACIDDQAgACgCECIDRQ0DIABBEGohBQsDQCAFIQsgAyIIQRRqIgUoAgAiAw0AIAhBEGohBSAIKAIQIgMNAAsgC0EANgIADAoLQX8hAiAAQb9/Sw0AIABBE2oiA0FwcSECQQAoAozQgIAAIgdFDQBBACELAkAgAkGAAkkNAEEfIQsgAkH///8HSw0AIANBCHYiAyADQYD+P2pBEHZBCHEiA3QiBCAEQYDgH2pBEHZBBHEiBHQiBSAFQYCAD2pBEHZBAnEiBXRBD3YgAyAEciAFcmsiA0EBdCACIANBFWp2QQFxckEcaiELC0EAIAJrIQQCQAJAAkACQCALQQJ0QbjSgIAAaigCACIFDQBBACEDQQAhCAwBC0EAIQMgAkEAQRkgC0EBdmsgC0EfRht0IQBBACEIA0ACQCAFKAIEQXhxIAJrIgYgBE8NACAGIQQgBSEIIAYNAEEAIQQgBSEIIAUhAwwDCyADIAVBFGooAgAiBiAGIAUgAEEddkEEcWpBEGooAgAiBUYbIAMgBhshAyAAQQF0IQAgBQ0ACwsCQCADIAhyDQBBACEIQQIgC3QiA0EAIANrciAHcSIDRQ0DIANBACADa3FBf2oiAyADQQx2QRBxIgN2IgVBBXZBCHEiACADciAFIAB2IgNBAnZBBHEiBXIgAyAFdiIDQQF2QQJxIgVyIAMgBXYiA0EBdkEBcSIFciADIAV2akECdEG40oCAAGooAgAhAwsgA0UNAQsDQCADKAIEQXhxIAJrIgYgBEkhAAJAIAMoAhAiBQ0AIANBFGooAgAhBQsgBiAEIAAbIQQgAyAIIAAbIQggBSEDIAUNAAsLIAhFDQAgBEEAKAKQ0ICAACACa08NACAIKAIYIQsCQCAIKAIMIgAgCEYNACAIKAIIIgNBACgCmNCAgABJGiAAIAM2AgggAyAANgIMDAkLAkAgCEEUaiIFKAIAIgMNACAIKAIQIgNFDQMgCEEQaiEFCwNAIAUhBiADIgBBFGoiBSgCACIDDQAgAEEQaiEFIAAoAhAiAw0ACyAGQQA2AgAMCAsCQEEAKAKQ0ICAACIDIAJJDQBBACgCnNCAgAAhBAJAAkAgAyACayIFQRBJDQAgBCACaiIAIAVBAXI2AgRBACAFNgKQ0ICAAEEAIAA2ApzQgIAAIAQgA2ogBTYCACAEIAJBA3I2AgQMAQsgBCADQQNyNgIEIAQgA2oiAyADKAIEQQFyNgIEQQBBADYCnNCAgABBAEEANgKQ0ICAAAsgBEEIaiEDDAoLAkBBACgClNCAgAAiACACTQ0AQQAoAqDQgIAAIgMgAmoiBCAAIAJrIgVBAXI2AgRBACAFNgKU0ICAAEEAIAQ2AqDQgIAAIAMgAkEDcjYCBCADQQhqIQMMCgsCQAJAQQAoAuDTgIAARQ0AQQAoAujTgIAAIQQMAQtBAEJ/NwLs04CAAEEAQoCAhICAgMAANwLk04CAAEEAIAFBDGpBcHFB2KrVqgVzNgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgABBgIAEIQQLQQAhAwJAIAQgAkHHAGoiB2oiBkEAIARrIgtxIgggAksNAEEAQTA2AvjTgIAADAoLAkBBACgCwNOAgAAiA0UNAAJAQQAoArjTgIAAIgQgCGoiBSAETQ0AIAUgA00NAQtBACEDQQBBMDYC+NOAgAAMCgtBAC0AxNOAgABBBHENBAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQAJAIAMoAgAiBSAESw0AIAUgAygCBGogBEsNAwsgAygCCCIDDQALC0EAEMuAgIAAIgBBf0YNBSAIIQYCQEEAKALk04CAACIDQX9qIgQgAHFFDQAgCCAAayAEIABqQQAgA2txaiEGCyAGIAJNDQUgBkH+////B0sNBQJAQQAoAsDTgIAAIgNFDQBBACgCuNOAgAAiBCAGaiIFIARNDQYgBSADSw0GCyAGEMuAgIAAIgMgAEcNAQwHCyAGIABrIAtxIgZB/v///wdLDQQgBhDLgICAACIAIAMoAgAgAygCBGpGDQMgACEDCwJAIANBf0YNACACQcgAaiAGTQ0AAkAgByAGa0EAKALo04CAACIEakEAIARrcSIEQf7///8HTQ0AIAMhAAwHCwJAIAQQy4CAgABBf0YNACAEIAZqIQYgAyEADAcLQQAgBmsQy4CAgAAaDAQLIAMhACADQX9HDQUMAwtBACEIDAcLQQAhAAwFCyAAQX9HDQILQQBBACgCxNOAgABBBHI2AsTTgIAACyAIQf7///8HSw0BIAgQy4CAgAAhAEEAEMuAgIAAIQMgAEF/Rg0BIANBf0YNASAAIANPDQEgAyAAayIGIAJBOGpNDQELQQBBACgCuNOAgAAgBmoiAzYCuNOAgAACQCADQQAoArzTgIAATQ0AQQAgAzYCvNOAgAALAkACQAJAAkBBACgCoNCAgAAiBEUNAEHI04CAACEDA0AgACADKAIAIgUgAygCBCIIakYNAiADKAIIIgMNAAwDCwsCQAJAQQAoApjQgIAAIgNFDQAgACADTw0BC0EAIAA2ApjQgIAAC0EAIQNBACAGNgLM04CAAEEAIAA2AsjTgIAAQQBBfzYCqNCAgABBAEEAKALg04CAADYCrNCAgABBAEEANgLU04CAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgQgBkFIaiIFIANrIgNBAXI2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAIAAgBWpBODYCBAwCCyADLQAMQQhxDQAgBCAFSQ0AIAQgAE8NACAEQXggBGtBD3FBACAEQQhqQQ9xGyIFaiIAQQAoApTQgIAAIAZqIgsgBWsiBUEBcjYCBCADIAggBmo2AgRBAEEAKALw04CAADYCpNCAgABBACAFNgKU0ICAAEEAIAA2AqDQgIAAIAQgC2pBODYCBAwBCwJAIABBACgCmNCAgAAiCE8NAEEAIAA2ApjQgIAAIAAhCAsgACAGaiEFQcjTgIAAIQMCQAJAAkACQAJAAkACQANAIAMoAgAgBUYNASADKAIIIgMNAAwCCwsgAy0ADEEIcUUNAQtByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiIFIARLDQMLIAMoAgghAwwACwsgAyAANgIAIAMgAygCBCAGajYCBCAAQXggAGtBD3FBACAAQQhqQQ9xG2oiCyACQQNyNgIEIAVBeCAFa0EPcUEAIAVBCGpBD3EbaiIGIAsgAmoiAmshAwJAIAYgBEcNAEEAIAI2AqDQgIAAQQBBACgClNCAgAAgA2oiAzYClNCAgAAgAiADQQFyNgIEDAMLAkAgBkEAKAKc0ICAAEcNAEEAIAI2ApzQgIAAQQBBACgCkNCAgAAgA2oiAzYCkNCAgAAgAiADQQFyNgIEIAIgA2ogAzYCAAwDCwJAIAYoAgQiBEEDcUEBRw0AIARBeHEhBwJAAkAgBEH/AUsNACAGKAIIIgUgBEEDdiIIQQN0QbDQgIAAaiIARhoCQCAGKAIMIgQgBUcNAEEAQQAoAojQgIAAQX4gCHdxNgKI0ICAAAwCCyAEIABGGiAEIAU2AgggBSAENgIMDAELIAYoAhghCQJAAkAgBigCDCIAIAZGDQAgBigCCCIEIAhJGiAAIAQ2AgggBCAANgIMDAELAkAgBkEUaiIEKAIAIgUNACAGQRBqIgQoAgAiBQ0AQQAhAAwBCwNAIAQhCCAFIgBBFGoiBCgCACIFDQAgAEEQaiEEIAAoAhAiBQ0ACyAIQQA2AgALIAlFDQACQAJAIAYgBigCHCIFQQJ0QbjSgIAAaiIEKAIARw0AIAQgADYCACAADQFBAEEAKAKM0ICAAEF+IAV3cTYCjNCAgAAMAgsgCUEQQRQgCSgCECAGRhtqIAA2AgAgAEUNAQsgACAJNgIYAkAgBigCECIERQ0AIAAgBDYCECAEIAA2AhgLIAYoAhQiBEUNACAAQRRqIAQ2AgAgBCAANgIYCyAHIANqIQMgBiAHaiIGKAIEIQQLIAYgBEF+cTYCBCACIANqIAM2AgAgAiADQQFyNgIEAkAgA0H/AUsNACADQXhxQbDQgIAAaiEEAkACQEEAKAKI0ICAACIFQQEgA0EDdnQiA3ENAEEAIAUgA3I2AojQgIAAIAQhAwwBCyAEKAIIIQMLIAMgAjYCDCAEIAI2AgggAiAENgIMIAIgAzYCCAwDC0EfIQQCQCADQf///wdLDQAgA0EIdiIEIARBgP4/akEQdkEIcSIEdCIFIAVBgOAfakEQdkEEcSIFdCIAIABBgIAPakEQdkECcSIAdEEPdiAEIAVyIAByayIEQQF0IAMgBEEVanZBAXFyQRxqIQQLIAIgBDYCHCACQgA3AhAgBEECdEG40oCAAGohBQJAQQAoAozQgIAAIgBBASAEdCIIcQ0AIAUgAjYCAEEAIAAgCHI2AozQgIAAIAIgBTYCGCACIAI2AgggAiACNgIMDAMLIANBAEEZIARBAXZrIARBH0YbdCEEIAUoAgAhAANAIAAiBSgCBEF4cSADRg0CIARBHXYhACAEQQF0IQQgBSAAQQRxakEQaiIIKAIAIgANAAsgCCACNgIAIAIgBTYCGCACIAI2AgwgAiACNgIIDAILIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgsgBkFIaiIIIANrIgNBAXI2AgQgACAIakE4NgIEIAQgBUE3IAVrQQ9xQQAgBUFJakEPcRtqQUFqIgggCCAEQRBqSRsiCEEjNgIEQQBBACgC8NOAgAA2AqTQgIAAQQAgAzYClNCAgABBACALNgKg0ICAACAIQRBqQQApAtDTgIAANwIAIAhBACkCyNOAgAA3AghBACAIQQhqNgLQ04CAAEEAIAY2AszTgIAAQQAgADYCyNOAgABBAEEANgLU04CAACAIQSRqIQMDQCADQQc2AgAgA0EEaiIDIAVJDQALIAggBEYNAyAIIAgoAgRBfnE2AgQgCCAIIARrIgA2AgAgBCAAQQFyNgIEAkAgAEH/AUsNACAAQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgAEEDdnQiAHENAEEAIAUgAHI2AojQgIAAIAMhBQwBCyADKAIIIQULIAUgBDYCDCADIAQ2AgggBCADNgIMIAQgBTYCCAwEC0EfIQMCQCAAQf///wdLDQAgAEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCIIIAhBgIAPakEQdkECcSIIdEEPdiADIAVyIAhyayIDQQF0IAAgA0EVanZBAXFyQRxqIQMLIAQgAzYCHCAEQgA3AhAgA0ECdEG40oCAAGohBQJAQQAoAozQgIAAIghBASADdCIGcQ0AIAUgBDYCAEEAIAggBnI2AozQgIAAIAQgBTYCGCAEIAQ2AgggBCAENgIMDAQLIABBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhCANAIAgiBSgCBEF4cSAARg0DIANBHXYhCCADQQF0IQMgBSAIQQRxakEQaiIGKAIAIggNAAsgBiAENgIAIAQgBTYCGCAEIAQ2AgwgBCAENgIIDAMLIAUoAggiAyACNgIMIAUgAjYCCCACQQA2AhggAiAFNgIMIAIgAzYCCAsgC0EIaiEDDAULIAUoAggiAyAENgIMIAUgBDYCCCAEQQA2AhggBCAFNgIMIAQgAzYCCAtBACgClNCAgAAiAyACTQ0AQQAoAqDQgIAAIgQgAmoiBSADIAJrIgNBAXI2AgRBACADNgKU0ICAAEEAIAU2AqDQgIAAIAQgAkEDcjYCBCAEQQhqIQMMAwtBACEDQQBBMDYC+NOAgAAMAgsCQCALRQ0AAkACQCAIIAgoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAA2AgAgAA0BQQAgB0F+IAV3cSIHNgKM0ICAAAwCCyALQRBBFCALKAIQIAhGG2ogADYCACAARQ0BCyAAIAs2AhgCQCAIKAIQIgNFDQAgACADNgIQIAMgADYCGAsgCEEUaigCACIDRQ0AIABBFGogAzYCACADIAA2AhgLAkACQCAEQQ9LDQAgCCAEIAJqIgNBA3I2AgQgCCADaiIDIAMoAgRBAXI2AgQMAQsgCCACaiIAIARBAXI2AgQgCCACQQNyNgIEIAAgBGogBDYCAAJAIARB/wFLDQAgBEF4cUGw0ICAAGohAwJAAkBBACgCiNCAgAAiBUEBIARBA3Z0IgRxDQBBACAFIARyNgKI0ICAACADIQQMAQsgAygCCCEECyAEIAA2AgwgAyAANgIIIAAgAzYCDCAAIAQ2AggMAQtBHyEDAkAgBEH///8HSw0AIARBCHYiAyADQYD+P2pBEHZBCHEiA3QiBSAFQYDgH2pBEHZBBHEiBXQiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAFciACcmsiA0EBdCAEIANBFWp2QQFxckEcaiEDCyAAIAM2AhwgAEIANwIQIANBAnRBuNKAgABqIQUCQCAHQQEgA3QiAnENACAFIAA2AgBBACAHIAJyNgKM0ICAACAAIAU2AhggACAANgIIIAAgADYCDAwBCyAEQQBBGSADQQF2ayADQR9GG3QhAyAFKAIAIQICQANAIAIiBSgCBEF4cSAERg0BIANBHXYhAiADQQF0IQMgBSACQQRxakEQaiIGKAIAIgINAAsgBiAANgIAIAAgBTYCGCAAIAA2AgwgACAANgIIDAELIAUoAggiAyAANgIMIAUgADYCCCAAQQA2AhggACAFNgIMIAAgAzYCCAsgCEEIaiEDDAELAkAgCkUNAAJAAkAgACAAKAIcIgVBAnRBuNKAgABqIgMoAgBHDQAgAyAINgIAIAgNAUEAIAlBfiAFd3E2AozQgIAADAILIApBEEEUIAooAhAgAEYbaiAINgIAIAhFDQELIAggCjYCGAJAIAAoAhAiA0UNACAIIAM2AhAgAyAINgIYCyAAQRRqKAIAIgNFDQAgCEEUaiADNgIAIAMgCDYCGAsCQAJAIARBD0sNACAAIAQgAmoiA0EDcjYCBCAAIANqIgMgAygCBEEBcjYCBAwBCyAAIAJqIgUgBEEBcjYCBCAAIAJBA3I2AgQgBSAEaiAENgIAAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQMCQAJAQQEgB0EDdnQiCCAGcQ0AQQAgCCAGcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCADNgIMIAIgAzYCCCADIAI2AgwgAyAINgIIC0EAIAU2ApzQgIAAQQAgBDYCkNCAgAALIABBCGohAwsgAUEQaiSAgICAACADCwoAIAAQyYCAgAAL4g0BB38CQCAARQ0AIABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAIAJBAXENACACQQNxRQ0BIAEgASgCACICayIBQQAoApjQgIAAIgRJDQEgAiAAaiEAAkAgAUEAKAKc0ICAAEYNAAJAIAJB/wFLDQAgASgCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgASgCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAwsgAiAGRhogAiAENgIIIAQgAjYCDAwCCyABKAIYIQcCQAJAIAEoAgwiBiABRg0AIAEoAggiAiAESRogBiACNgIIIAIgBjYCDAwBCwJAIAFBFGoiAigCACIEDQAgAUEQaiICKAIAIgQNAEEAIQYMAQsDQCACIQUgBCIGQRRqIgIoAgAiBA0AIAZBEGohAiAGKAIQIgQNAAsgBUEANgIACyAHRQ0BAkACQCABIAEoAhwiBEECdEG40oCAAGoiAigCAEcNACACIAY2AgAgBg0BQQBBACgCjNCAgABBfiAEd3E2AozQgIAADAMLIAdBEEEUIAcoAhAgAUYbaiAGNgIAIAZFDQILIAYgBzYCGAJAIAEoAhAiAkUNACAGIAI2AhAgAiAGNgIYCyABKAIUIgJFDQEgBkEUaiACNgIAIAIgBjYCGAwBCyADKAIEIgJBA3FBA0cNACADIAJBfnE2AgRBACAANgKQ0ICAACABIABqIAA2AgAgASAAQQFyNgIEDwsgASADTw0AIAMoAgQiAkEBcUUNAAJAAkAgAkECcQ0AAkAgA0EAKAKg0ICAAEcNAEEAIAE2AqDQgIAAQQBBACgClNCAgAAgAGoiADYClNCAgAAgASAAQQFyNgIEIAFBACgCnNCAgABHDQNBAEEANgKQ0ICAAEEAQQA2ApzQgIAADwsCQCADQQAoApzQgIAARw0AQQAgATYCnNCAgABBAEEAKAKQ0ICAACAAaiIANgKQ0ICAACABIABBAXI2AgQgASAAaiAANgIADwsgAkF4cSAAaiEAAkACQCACQf8BSw0AIAMoAggiBCACQQN2IgVBA3RBsNCAgABqIgZGGgJAIAMoAgwiAiAERw0AQQBBACgCiNCAgABBfiAFd3E2AojQgIAADAILIAIgBkYaIAIgBDYCCCAEIAI2AgwMAQsgAygCGCEHAkACQCADKAIMIgYgA0YNACADKAIIIgJBACgCmNCAgABJGiAGIAI2AgggAiAGNgIMDAELAkAgA0EUaiICKAIAIgQNACADQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQACQAJAIAMgAygCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAgsgB0EQQRQgBygCECADRhtqIAY2AgAgBkUNAQsgBiAHNgIYAkAgAygCECICRQ0AIAYgAjYCECACIAY2AhgLIAMoAhQiAkUNACAGQRRqIAI2AgAgAiAGNgIYCyABIABqIAA2AgAgASAAQQFyNgIEIAFBACgCnNCAgABHDQFBACAANgKQ0ICAAA8LIAMgAkF+cTYCBCABIABqIAA2AgAgASAAQQFyNgIECwJAIABB/wFLDQAgAEF4cUGw0ICAAGohAgJAAkBBACgCiNCAgAAiBEEBIABBA3Z0IgBxDQBBACAEIAByNgKI0ICAACACIQAMAQsgAigCCCEACyAAIAE2AgwgAiABNgIIIAEgAjYCDCABIAA2AggPC0EfIQICQCAAQf///wdLDQAgAEEIdiICIAJBgP4/akEQdkEIcSICdCIEIARBgOAfakEQdkEEcSIEdCIGIAZBgIAPakEQdkECcSIGdEEPdiACIARyIAZyayICQQF0IAAgAkEVanZBAXFyQRxqIQILIAEgAjYCHCABQgA3AhAgAkECdEG40oCAAGohBAJAAkBBACgCjNCAgAAiBkEBIAJ0IgNxDQAgBCABNgIAQQAgBiADcjYCjNCAgAAgASAENgIYIAEgATYCCCABIAE2AgwMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgBCgCACEGAkADQCAGIgQoAgRBeHEgAEYNASACQR12IQYgAkEBdCECIAQgBkEEcWpBEGoiAygCACIGDQALIAMgATYCACABIAQ2AhggASABNgIMIAEgATYCCAwBCyAEKAIIIgAgATYCDCAEIAE2AgggAUEANgIYIAEgBDYCDCABIAA2AggLQQBBACgCqNCAgABBf2oiAUF/IAEbNgKo0ICAAAsLBAAAAAtOAAJAIAANAD8AQRB0DwsCQCAAQf//A3ENACAAQX9MDQACQCAAQRB2QAAiAEF/Rw0AQQBBMDYC+NOAgABBfw8LIABBEHQPCxDKgICAAAAL8gICA38BfgJAIAJFDQAgACABOgAAIAIgAGoiA0F/aiABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBfWogAToAACADQX5qIAE6AAAgAkEHSQ0AIAAgAToAAyADQXxqIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIFayICQSBJDQAgAa1CgYCAgBB+IQYgAyAFaiEBA0AgASAGNwMYIAEgBjcDECABIAY3AwggASAGNwMAIAFBIGohASACQWBqIgJBH0sNAAsLIAALC45IAQBBgAgLhkgBAAAAAgAAAAMAAAAAAAAAAAAAAAQAAAAFAAAAAAAAAAAAAAAGAAAABwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEludmFsaWQgY2hhciBpbiB1cmwgcXVlcnkAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9ib2R5AENvbnRlbnQtTGVuZ3RoIG92ZXJmbG93AENodW5rIHNpemUgb3ZlcmZsb3cAUmVzcG9uc2Ugb3ZlcmZsb3cASW52YWxpZCBtZXRob2QgZm9yIEhUVFAveC54IHJlcXVlc3QASW52YWxpZCBtZXRob2QgZm9yIFJUU1AveC54IHJlcXVlc3QARXhwZWN0ZWQgU09VUkNFIG1ldGhvZCBmb3IgSUNFL3gueCByZXF1ZXN0AEludmFsaWQgY2hhciBpbiB1cmwgZnJhZ21lbnQgc3RhcnQARXhwZWN0ZWQgZG90AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fc3RhdHVzAEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8='\n","module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCrLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC0kBAXsgAEEQav0MAAAAAAAAAAAAAAAAAAAAACIB/QsDACAAIAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AcsBygG4AckBuQHIAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBANwBC0EAIRAMxgELQQ4hEAzFAQtBDSEQDMQBC0EPIRAMwwELQRAhEAzCAQtBEyEQDMEBC0EUIRAMwAELQRUhEAy/AQtBFiEQDL4BC0EXIRAMvQELQRghEAy8AQtBGSEQDLsBC0EaIRAMugELQRshEAy5AQtBHCEQDLgBC0EIIRAMtwELQR0hEAy2AQtBICEQDLUBC0EfIRAMtAELQQchEAyzAQtBISEQDLIBC0EiIRAMsQELQR4hEAywAQtBIyEQDK8BC0ESIRAMrgELQREhEAytAQtBJCEQDKwBC0ElIRAMqwELQSYhEAyqAQtBJyEQDKkBC0HDASEQDKgBC0EpIRAMpwELQSshEAymAQtBLCEQDKUBC0EtIRAMpAELQS4hEAyjAQtBLyEQDKIBC0HEASEQDKEBC0EwIRAMoAELQTQhEAyfAQtBDCEQDJ4BC0ExIRAMnQELQTIhEAycAQtBMyEQDJsBC0E5IRAMmgELQTUhEAyZAQtBxQEhEAyYAQtBCyEQDJcBC0E6IRAMlgELQTYhEAyVAQtBCiEQDJQBC0E3IRAMkwELQTghEAySAQtBPCEQDJEBC0E7IRAMkAELQT0hEAyPAQtBCSEQDI4BC0EoIRAMjQELQT4hEAyMAQtBPyEQDIsBC0HAACEQDIoBC0HBACEQDIkBC0HCACEQDIgBC0HDACEQDIcBC0HEACEQDIYBC0HFACEQDIUBC0HGACEQDIQBC0EqIRAMgwELQccAIRAMggELQcgAIRAMgQELQckAIRAMgAELQcoAIRAMfwtBywAhEAx+C0HNACEQDH0LQcwAIRAMfAtBzgAhEAx7C0HPACEQDHoLQdAAIRAMeQtB0QAhEAx4C0HSACEQDHcLQdMAIRAMdgtB1AAhEAx1C0HWACEQDHQLQdUAIRAMcwtBBiEQDHILQdcAIRAMcQtBBSEQDHALQdgAIRAMbwtBBCEQDG4LQdkAIRAMbQtB2gAhEAxsC0HbACEQDGsLQdwAIRAMagtBAyEQDGkLQd0AIRAMaAtB3gAhEAxnC0HfACEQDGYLQeEAIRAMZQtB4AAhEAxkC0HiACEQDGMLQeMAIRAMYgtBAiEQDGELQeQAIRAMYAtB5QAhEAxfC0HmACEQDF4LQecAIRAMXQtB6AAhEAxcC0HpACEQDFsLQeoAIRAMWgtB6wAhEAxZC0HsACEQDFgLQe0AIRAMVwtB7gAhEAxWC0HvACEQDFULQfAAIRAMVAtB8QAhEAxTC0HyACEQDFILQfMAIRAMUQtB9AAhEAxQC0H1ACEQDE8LQfYAIRAMTgtB9wAhEAxNC0H4ACEQDEwLQfkAIRAMSwtB+gAhEAxKC0H7ACEQDEkLQfwAIRAMSAtB/QAhEAxHC0H+ACEQDEYLQf8AIRAMRQtBgAEhEAxEC0GBASEQDEMLQYIBIRAMQgtBgwEhEAxBC0GEASEQDEALQYUBIRAMPwtBhgEhEAw+C0GHASEQDD0LQYgBIRAMPAtBiQEhEAw7C0GKASEQDDoLQYsBIRAMOQtBjAEhEAw4C0GNASEQDDcLQY4BIRAMNgtBjwEhEAw1C0GQASEQDDQLQZEBIRAMMwtBkgEhEAwyC0GTASEQDDELQZQBIRAMMAtBlQEhEAwvC0GWASEQDC4LQZcBIRAMLQtBmAEhEAwsC0GZASEQDCsLQZoBIRAMKgtBmwEhEAwpC0GcASEQDCgLQZ0BIRAMJwtBngEhEAwmC0GfASEQDCULQaABIRAMJAtBoQEhEAwjC0GiASEQDCILQaMBIRAMIQtBpAEhEAwgC0GlASEQDB8LQaYBIRAMHgtBpwEhEAwdC0GoASEQDBwLQakBIRAMGwtBqgEhEAwaC0GrASEQDBkLQawBIRAMGAtBrQEhEAwXC0GuASEQDBYLQQEhEAwVC0GvASEQDBQLQbABIRAMEwtBsQEhEAwSC0GzASEQDBELQbIBIRAMEAtBtAEhEAwPC0G1ASEQDA4LQbYBIRAMDQtBtwEhEAwMC0G4ASEQDAsLQbkBIRAMCgtBugEhEAwJC0G7ASEQDAgLQcYBIRAMBwtBvAEhEAwGC0G9ASEQDAULQb4BIRAMBAtBvwEhEAwDC0HAASEQDAILQcIBIRAMAQtBwQEhEAsDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB4fICEjJSg/QEFERUZHSElKS0xNT1BRUlPeA1dZW1xdYGJlZmdoaWprbG1vcHFyc3R1dnd4eXp7fH1+gAGCAYUBhgGHAYkBiwGMAY0BjgGPAZABkQGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMBmQKkArAC/gL+AgsgASIEIAJHDfMBQd0BIRAM/wMLIAEiECACRw3dAUHDASEQDP4DCyABIgEgAkcNkAFB9wAhEAz9AwsgASIBIAJHDYYBQe8AIRAM/AMLIAEiASACRw1/QeoAIRAM+wMLIAEiASACRw17QegAIRAM+gMLIAEiASACRw14QeYAIRAM+QMLIAEiASACRw0aQRghEAz4AwsgASIBIAJHDRRBEiEQDPcDCyABIgEgAkcNWUHFACEQDPYDCyABIgEgAkcNSkE/IRAM9QMLIAEiASACRw1IQTwhEAz0AwsgASIBIAJHDUFBMSEQDPMDCyAALQAuQQFGDesDDIcCCyAAIAEiASACEMCAgIAAQQFHDeYBIABCADcDIAznAQsgACABIgEgAhC0gICAACIQDecBIAEhAQz1AgsCQCABIgEgAkcNAEEGIRAM8AMLIAAgAUEBaiIBIAIQu4CAgAAiEA3oASABIQEMMQsgAEIANwMgQRIhEAzVAwsgASIQIAJHDStBHSEQDO0DCwJAIAEiASACRg0AIAFBAWohAUEQIRAM1AMLQQchEAzsAwsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3lAUEIIRAM6wMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQRQhEAzSAwtBCSEQDOoDCyABIQEgACkDIFAN5AEgASEBDPICCwJAIAEiASACRw0AQQshEAzpAwsgACABQQFqIgEgAhC2gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeYBIAEhAQwNCyAAIAEiASACELqAgIAAIhAN5wEgASEBDPACCwJAIAEiASACRw0AQQ8hEAzlAwsgAS0AACIQQTtGDQggEEENRw3oASABQQFqIQEM7wILIAAgASIBIAIQuoCAgAAiEA3oASABIQEM8gILA0ACQCABLQAAQfC1gIAAai0AACIQQQFGDQAgEEECRw3rASAAKAIEIRAgAEEANgIEIAAgECABQQFqIgEQuYCAgAAiEA3qASABIQEM9AILIAFBAWoiASACRw0AC0ESIRAM4gMLIAAgASIBIAIQuoCAgAAiEA3pASABIQEMCgsgASIBIAJHDQZBGyEQDOADCwJAIAEiASACRw0AQRYhEAzgAwsgAEGKgICAADYCCCAAIAE2AgQgACABIAIQuICAgAAiEA3qASABIQFBICEQDMYDCwJAIAEiASACRg0AA0ACQCABLQAAQfC3gIAAai0AACIQQQJGDQACQCAQQX9qDgTlAewBAOsB7AELIAFBAWohAUEIIRAMyAMLIAFBAWoiASACRw0AC0EVIRAM3wMLQRUhEAzeAwsDQAJAIAEtAABB8LmAgABqLQAAIhBBAkYNACAQQX9qDgTeAewB4AHrAewBCyABQQFqIgEgAkcNAAtBGCEQDN0DCwJAIAEiASACRg0AIABBi4CAgAA2AgggACABNgIEIAEhAUEHIRAMxAMLQRkhEAzcAwsgAUEBaiEBDAILAkAgASIUIAJHDQBBGiEQDNsDCyAUIQECQCAULQAAQXNqDhTdAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAgDuAgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQM2gMLAkAgAS0AACIQQTtGDQAgEEENRw3oASABQQFqIQEM5QILIAFBAWohAQtBIiEQDL8DCwJAIAEiECACRw0AQRwhEAzYAwtCACERIBAhASAQLQAAQVBqDjfnAeYBAQIDBAUGBwgAAAAAAAAACQoLDA0OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBESExQAC0EeIRAMvQMLQgIhEQzlAQtCAyERDOQBC0IEIREM4wELQgUhEQziAQtCBiERDOEBC0IHIREM4AELQgghEQzfAQtCCSERDN4BC0IKIREM3QELQgshEQzcAQtCDCERDNsBC0INIREM2gELQg4hEQzZAQtCDyERDNgBC0IKIREM1wELQgshEQzWAQtCDCERDNUBC0INIREM1AELQg4hEQzTAQtCDyERDNIBC0IAIRECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAtAABBUGoON+UB5AEAAQIDBAUGB+YB5gHmAeYB5gHmAeYBCAkKCwwN5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAQ4PEBESE+YBC0ICIREM5AELQgMhEQzjAQtCBCERDOIBC0IFIREM4QELQgYhEQzgAQtCByERDN8BC0IIIREM3gELQgkhEQzdAQtCCiERDNwBC0ILIREM2wELQgwhEQzaAQtCDSERDNkBC0IOIREM2AELQg8hEQzXAQtCCiERDNYBC0ILIREM1QELQgwhEQzUAQtCDSERDNMBC0IOIREM0gELQg8hEQzRAQsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3SAUEfIRAMwAMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQSQhEAynAwtBICEQDL8DCyAAIAEiECACEL6AgIAAQX9qDgW2AQDFAgHRAdIBC0ERIRAMpAMLIABBAToALyAQIQEMuwMLIAEiASACRw3SAUEkIRAMuwMLIAEiDSACRw0eQcYAIRAMugMLIAAgASIBIAIQsoCAgAAiEA3UASABIQEMtQELIAEiECACRw0mQdAAIRAMuAMLAkAgASIBIAJHDQBBKCEQDLgDCyAAQQA2AgQgAEGMgICAADYCCCAAIAEgARCxgICAACIQDdMBIAEhAQzYAQsCQCABIhAgAkcNAEEpIRAMtwMLIBAtAAAiAUEgRg0UIAFBCUcN0wEgEEEBaiEBDBULAkAgASIBIAJGDQAgAUEBaiEBDBcLQSohEAy1AwsCQCABIhAgAkcNAEErIRAMtQMLAkAgEC0AACIBQQlGDQAgAUEgRw3VAQsgAC0ALEEIRg3TASAQIQEMkQMLAkAgASIBIAJHDQBBLCEQDLQDCyABLQAAQQpHDdUBIAFBAWohAQzJAgsgASIOIAJHDdUBQS8hEAyyAwsDQAJAIAEtAAAiEEEgRg0AAkAgEEF2ag4EANwB3AEA2gELIAEhAQzgAQsgAUEBaiIBIAJHDQALQTEhEAyxAwtBMiEQIAEiFCACRg2wAyACIBRrIAAoAgAiAWohFSAUIAFrQQNqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB8LuAgABqLQAARw0BAkAgAUEDRw0AQQYhAQyWAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMsQMLIABBADYCACAUIQEM2QELQTMhECABIhQgAkYNrwMgAiAUayAAKAIAIgFqIRUgFCABa0EIaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfS7gIAAai0AAEcNAQJAIAFBCEcNAEEFIQEMlQMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLADCyAAQQA2AgAgFCEBDNgBC0E0IRAgASIUIAJGDa4DIAIgFGsgACgCACIBaiEVIBQgAWtBBWohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUHQwoCAAGotAABHDQECQCABQQVHDQBBByEBDJQDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAyvAwsgAEEANgIAIBQhAQzXAQsCQCABIgEgAkYNAANAAkAgAS0AAEGAvoCAAGotAAAiEEEBRg0AIBBBAkYNCiABIQEM3QELIAFBAWoiASACRw0AC0EwIRAMrgMLQTAhEAytAwsCQCABIgEgAkYNAANAAkAgAS0AACIQQSBGDQAgEEF2ag4E2QHaAdoB2QHaAQsgAUEBaiIBIAJHDQALQTghEAytAwtBOCEQDKwDCwNAAkAgAS0AACIQQSBGDQAgEEEJRw0DCyABQQFqIgEgAkcNAAtBPCEQDKsDCwNAAkAgAS0AACIQQSBGDQACQAJAIBBBdmoOBNoBAQHaAQALIBBBLEYN2wELIAEhAQwECyABQQFqIgEgAkcNAAtBPyEQDKoDCyABIQEM2wELQcAAIRAgASIUIAJGDagDIAIgFGsgACgCACIBaiEWIBQgAWtBBmohFwJAA0AgFC0AAEEgciABQYDAgIAAai0AAEcNASABQQZGDY4DIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADKkDCyAAQQA2AgAgFCEBC0E2IRAMjgMLAkAgASIPIAJHDQBBwQAhEAynAwsgAEGMgICAADYCCCAAIA82AgQgDyEBIAAtACxBf2oOBM0B1QHXAdkBhwMLIAFBAWohAQzMAQsCQCABIgEgAkYNAANAAkAgAS0AACIQQSByIBAgEEG/f2pB/wFxQRpJG0H/AXEiEEEJRg0AIBBBIEYNAAJAAkACQAJAIBBBnX9qDhMAAwMDAwMDAwEDAwMDAwMDAwMCAwsgAUEBaiEBQTEhEAyRAwsgAUEBaiEBQTIhEAyQAwsgAUEBaiEBQTMhEAyPAwsgASEBDNABCyABQQFqIgEgAkcNAAtBNSEQDKUDC0E1IRAMpAMLAkAgASIBIAJGDQADQAJAIAEtAABBgLyAgABqLQAAQQFGDQAgASEBDNMBCyABQQFqIgEgAkcNAAtBPSEQDKQDC0E9IRAMowMLIAAgASIBIAIQsICAgAAiEA3WASABIQEMAQsgEEEBaiEBC0E8IRAMhwMLAkAgASIBIAJHDQBBwgAhEAygAwsCQANAAkAgAS0AAEF3ag4YAAL+Av4ChAP+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gIA/gILIAFBAWoiASACRw0AC0HCACEQDKADCyABQQFqIQEgAC0ALUEBcUUNvQEgASEBC0EsIRAMhQMLIAEiASACRw3TAUHEACEQDJ0DCwNAAkAgAS0AAEGQwICAAGotAABBAUYNACABIQEMtwILIAFBAWoiASACRw0AC0HFACEQDJwDCyANLQAAIhBBIEYNswEgEEE6Rw2BAyAAKAIEIQEgAEEANgIEIAAgASANEK+AgIAAIgEN0AEgDUEBaiEBDLMCC0HHACEQIAEiDSACRg2aAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQZDCgIAAai0AAEcNgAMgAUEFRg30AiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyaAwtByAAhECABIg0gAkYNmQMgAiANayAAKAIAIgFqIRYgDSABa0EJaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGWwoCAAGotAABHDf8CAkAgAUEJRw0AQQIhAQz1AgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmQMLAkAgASINIAJHDQBByQAhEAyZAwsCQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZJ/ag4HAIADgAOAA4ADgAMBgAMLIA1BAWohAUE+IRAMgAMLIA1BAWohAUE/IRAM/wILQcoAIRAgASINIAJGDZcDIAIgDWsgACgCACIBaiEWIA0gAWtBAWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBoMKAgABqLQAARw39AiABQQFGDfACIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJcDC0HLACEQIAEiDSACRg2WAyACIA1rIAAoAgAiAWohFiANIAFrQQ5qIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaLCgIAAai0AAEcN/AIgAUEORg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyWAwtBzAAhECABIg0gAkYNlQMgAiANayAAKAIAIgFqIRYgDSABa0EPaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUHAwoCAAGotAABHDfsCAkAgAUEPRw0AQQMhAQzxAgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlQMLQc0AIRAgASINIAJGDZQDIAIgDWsgACgCACIBaiEWIA0gAWtBBWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw36AgJAIAFBBUcNAEEEIQEM8AILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJQDCwJAIAEiDSACRw0AQc4AIRAMlAMLAkACQAJAAkAgDS0AACIBQSByIAEgAUG/f2pB/wFxQRpJG0H/AXFBnX9qDhMA/QL9Av0C/QL9Av0C/QL9Av0C/QL9Av0CAf0C/QL9AgID/QILIA1BAWohAUHBACEQDP0CCyANQQFqIQFBwgAhEAz8AgsgDUEBaiEBQcMAIRAM+wILIA1BAWohAUHEACEQDPoCCwJAIAEiASACRg0AIABBjYCAgAA2AgggACABNgIEIAEhAUHFACEQDPoCC0HPACEQDJIDCyAQIQECQAJAIBAtAABBdmoOBAGoAqgCAKgCCyAQQQFqIQELQSchEAz4AgsCQCABIgEgAkcNAEHRACEQDJEDCwJAIAEtAABBIEYNACABIQEMjQELIAFBAWohASAALQAtQQFxRQ3HASABIQEMjAELIAEiFyACRw3IAUHSACEQDI8DC0HTACEQIAEiFCACRg2OAyACIBRrIAAoAgAiAWohFiAUIAFrQQFqIRcDQCAULQAAIAFB1sKAgABqLQAARw3MASABQQFGDccBIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADI4DCwJAIAEiASACRw0AQdUAIRAMjgMLIAEtAABBCkcNzAEgAUEBaiEBDMcBCwJAIAEiASACRw0AQdYAIRAMjQMLAkACQCABLQAAQXZqDgQAzQHNAQHNAQsgAUEBaiEBDMcBCyABQQFqIQFBygAhEAzzAgsgACABIgEgAhCugICAACIQDcsBIAEhAUHNACEQDPICCyAALQApQSJGDYUDDKYCCwJAIAEiASACRw0AQdsAIRAMigMLQQAhFEEBIRdBASEWQQAhEAJAAkACQAJAAkACQAJAAkACQCABLQAAQVBqDgrUAdMBAAECAwQFBgjVAQtBAiEQDAYLQQMhEAwFC0EEIRAMBAtBBSEQDAMLQQYhEAwCC0EHIRAMAQtBCCEQC0EAIRdBACEWQQAhFAzMAQtBCSEQQQEhFEEAIRdBACEWDMsBCwJAIAEiASACRw0AQd0AIRAMiQMLIAEtAABBLkcNzAEgAUEBaiEBDKYCCyABIgEgAkcNzAFB3wAhEAyHAwsCQCABIgEgAkYNACAAQY6AgIAANgIIIAAgATYCBCABIQFB0AAhEAzuAgtB4AAhEAyGAwtB4QAhECABIgEgAkYNhQMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQeLCgIAAai0AAEcNzQEgFEEDRg3MASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyFAwtB4gAhECABIgEgAkYNhAMgAiABayAAKAIAIhRqIRYgASAUa0ECaiEXA0AgAS0AACAUQebCgIAAai0AAEcNzAEgFEECRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyEAwtB4wAhECABIgEgAkYNgwMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQenCgIAAai0AAEcNywEgFEEDRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyDAwsCQCABIgEgAkcNAEHlACEQDIMDCyAAIAFBAWoiASACEKiAgIAAIhANzQEgASEBQdYAIRAM6QILAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AAkACQAJAIBBBuH9qDgsAAc8BzwHPAc8BzwHPAc8BzwECzwELIAFBAWohAUHSACEQDO0CCyABQQFqIQFB0wAhEAzsAgsgAUEBaiEBQdQAIRAM6wILIAFBAWoiASACRw0AC0HkACEQDIIDC0HkACEQDIEDCwNAAkAgAS0AAEHwwoCAAGotAAAiEEEBRg0AIBBBfmoOA88B0AHRAdIBCyABQQFqIgEgAkcNAAtB5gAhEAyAAwsCQCABIgEgAkYNACABQQFqIQEMAwtB5wAhEAz/AgsDQAJAIAEtAABB8MSAgABqLQAAIhBBAUYNAAJAIBBBfmoOBNIB0wHUAQDVAQsgASEBQdcAIRAM5wILIAFBAWoiASACRw0AC0HoACEQDP4CCwJAIAEiASACRw0AQekAIRAM/gILAkAgAS0AACIQQXZqDhq6AdUB1QG8AdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAcoB1QHVAQDTAQsgAUEBaiEBC0EGIRAM4wILA0ACQCABLQAAQfDGgIAAai0AAEEBRg0AIAEhAQyeAgsgAUEBaiIBIAJHDQALQeoAIRAM+wILAkAgASIBIAJGDQAgAUEBaiEBDAMLQesAIRAM+gILAkAgASIBIAJHDQBB7AAhEAz6AgsgAUEBaiEBDAELAkAgASIBIAJHDQBB7QAhEAz5AgsgAUEBaiEBC0EEIRAM3gILAkAgASIUIAJHDQBB7gAhEAz3AgsgFCEBAkACQAJAIBQtAABB8MiAgABqLQAAQX9qDgfUAdUB1gEAnAIBAtcBCyAUQQFqIQEMCgsgFEEBaiEBDM0BC0EAIRAgAEEANgIcIABBm5KAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAz2AgsCQANAAkAgAS0AAEHwyICAAGotAAAiEEEERg0AAkACQCAQQX9qDgfSAdMB1AHZAQAEAdkBCyABIQFB2gAhEAzgAgsgAUEBaiEBQdwAIRAM3wILIAFBAWoiASACRw0AC0HvACEQDPYCCyABQQFqIQEMywELAkAgASIUIAJHDQBB8AAhEAz1AgsgFC0AAEEvRw3UASAUQQFqIQEMBgsCQCABIhQgAkcNAEHxACEQDPQCCwJAIBQtAAAiAUEvRw0AIBRBAWohAUHdACEQDNsCCyABQXZqIgRBFksN0wFBASAEdEGJgIACcUUN0wEMygILAkAgASIBIAJGDQAgAUEBaiEBQd4AIRAM2gILQfIAIRAM8gILAkAgASIUIAJHDQBB9AAhEAzyAgsgFCEBAkAgFC0AAEHwzICAAGotAABBf2oOA8kClAIA1AELQeEAIRAM2AILAkAgASIUIAJGDQADQAJAIBQtAABB8MqAgABqLQAAIgFBA0YNAAJAIAFBf2oOAssCANUBCyAUIQFB3wAhEAzaAgsgFEEBaiIUIAJHDQALQfMAIRAM8QILQfMAIRAM8AILAkAgASIBIAJGDQAgAEGPgICAADYCCCAAIAE2AgQgASEBQeAAIRAM1wILQfUAIRAM7wILAkAgASIBIAJHDQBB9gAhEAzvAgsgAEGPgICAADYCCCAAIAE2AgQgASEBC0EDIRAM1AILA0AgAS0AAEEgRw3DAiABQQFqIgEgAkcNAAtB9wAhEAzsAgsCQCABIgEgAkcNAEH4ACEQDOwCCyABLQAAQSBHDc4BIAFBAWohAQzvAQsgACABIgEgAhCsgICAACIQDc4BIAEhAQyOAgsCQCABIgQgAkcNAEH6ACEQDOoCCyAELQAAQcwARw3RASAEQQFqIQFBEyEQDM8BCwJAIAEiBCACRw0AQfsAIRAM6QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEANAIAQtAAAgAUHwzoCAAGotAABHDdABIAFBBUYNzgEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBB+wAhEAzoAgsCQCABIgQgAkcNAEH8ACEQDOgCCwJAAkAgBC0AAEG9f2oODADRAdEB0QHRAdEB0QHRAdEB0QHRAQHRAQsgBEEBaiEBQeYAIRAMzwILIARBAWohAUHnACEQDM4CCwJAIAEiBCACRw0AQf0AIRAM5wILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNzwEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf0AIRAM5wILIABBADYCACAQQQFqIQFBECEQDMwBCwJAIAEiBCACRw0AQf4AIRAM5gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQfbOgIAAai0AAEcNzgEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf4AIRAM5gILIABBADYCACAQQQFqIQFBFiEQDMsBCwJAIAEiBCACRw0AQf8AIRAM5QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQfzOgIAAai0AAEcNzQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf8AIRAM5QILIABBADYCACAQQQFqIQFBBSEQDMoBCwJAIAEiBCACRw0AQYABIRAM5AILIAQtAABB2QBHDcsBIARBAWohAUEIIRAMyQELAkAgASIEIAJHDQBBgQEhEAzjAgsCQAJAIAQtAABBsn9qDgMAzAEBzAELIARBAWohAUHrACEQDMoCCyAEQQFqIQFB7AAhEAzJAgsCQCABIgQgAkcNAEGCASEQDOICCwJAAkAgBC0AAEG4f2oOCADLAcsBywHLAcsBywEBywELIARBAWohAUHqACEQDMkCCyAEQQFqIQFB7QAhEAzIAgsCQCABIgQgAkcNAEGDASEQDOECCyACIARrIAAoAgAiAWohECAEIAFrQQJqIRQCQANAIAQtAAAgAUGAz4CAAGotAABHDckBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgEDYCAEGDASEQDOECC0EAIRAgAEEANgIAIBRBAWohAQzGAQsCQCABIgQgAkcNAEGEASEQDOACCyACIARrIAAoAgAiAWohFCAEIAFrQQRqIRACQANAIAQtAAAgAUGDz4CAAGotAABHDcgBIAFBBEYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGEASEQDOACCyAAQQA2AgAgEEEBaiEBQSMhEAzFAQsCQCABIgQgAkcNAEGFASEQDN8CCwJAAkAgBC0AAEG0f2oOCADIAcgByAHIAcgByAEByAELIARBAWohAUHvACEQDMYCCyAEQQFqIQFB8AAhEAzFAgsCQCABIgQgAkcNAEGGASEQDN4CCyAELQAAQcUARw3FASAEQQFqIQEMgwILAkAgASIEIAJHDQBBhwEhEAzdAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBiM+AgABqLQAARw3FASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhwEhEAzdAgsgAEEANgIAIBBBAWohAUEtIRAMwgELAkAgASIEIAJHDQBBiAEhEAzcAgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw3EASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiAEhEAzcAgsgAEEANgIAIBBBAWohAUEpIRAMwQELAkAgASIBIAJHDQBBiQEhEAzbAgtBASEQIAEtAABB3wBHDcABIAFBAWohAQyBAgsCQCABIgQgAkcNAEGKASEQDNoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRADQCAELQAAIAFBjM+AgABqLQAARw3BASABQQFGDa8CIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYoBIRAM2QILAkAgASIEIAJHDQBBiwEhEAzZAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBjs+AgABqLQAARw3BASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiwEhEAzZAgsgAEEANgIAIBBBAWohAUECIRAMvgELAkAgASIEIAJHDQBBjAEhEAzYAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw3AASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjAEhEAzYAgsgAEEANgIAIBBBAWohAUEfIRAMvQELAkAgASIEIAJHDQBBjQEhEAzXAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8s+AgABqLQAARw2/ASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjQEhEAzXAgsgAEEANgIAIBBBAWohAUEJIRAMvAELAkAgASIEIAJHDQBBjgEhEAzWAgsCQAJAIAQtAABBt39qDgcAvwG/Ab8BvwG/AQG/AQsgBEEBaiEBQfgAIRAMvQILIARBAWohAUH5ACEQDLwCCwJAIAEiBCACRw0AQY8BIRAM1QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQZHPgIAAai0AAEcNvQEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY8BIRAM1QILIABBADYCACAQQQFqIQFBGCEQDLoBCwJAIAEiBCACRw0AQZABIRAM1AILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQZfPgIAAai0AAEcNvAEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZABIRAM1AILIABBADYCACAQQQFqIQFBFyEQDLkBCwJAIAEiBCACRw0AQZEBIRAM0wILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQZrPgIAAai0AAEcNuwEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZEBIRAM0wILIABBADYCACAQQQFqIQFBFSEQDLgBCwJAIAEiBCACRw0AQZIBIRAM0gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQaHPgIAAai0AAEcNugEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZIBIRAM0gILIABBADYCACAQQQFqIQFBHiEQDLcBCwJAIAEiBCACRw0AQZMBIRAM0QILIAQtAABBzABHDbgBIARBAWohAUEKIRAMtgELAkAgBCACRw0AQZQBIRAM0AILAkACQCAELQAAQb9/ag4PALkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AbkBAbkBCyAEQQFqIQFB/gAhEAy3AgsgBEEBaiEBQf8AIRAMtgILAkAgBCACRw0AQZUBIRAMzwILAkACQCAELQAAQb9/ag4DALgBAbgBCyAEQQFqIQFB/QAhEAy2AgsgBEEBaiEEQYABIRAMtQILAkAgBCACRw0AQZYBIRAMzgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQafPgIAAai0AAEcNtgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZYBIRAMzgILIABBADYCACAQQQFqIQFBCyEQDLMBCwJAIAQgAkcNAEGXASEQDM0CCwJAAkACQAJAIAQtAABBU2oOIwC4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBAbgBuAG4AbgBuAECuAG4AbgBA7gBCyAEQQFqIQFB+wAhEAy2AgsgBEEBaiEBQfwAIRAMtQILIARBAWohBEGBASEQDLQCCyAEQQFqIQRBggEhEAyzAgsCQCAEIAJHDQBBmAEhEAzMAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBqc+AgABqLQAARw20ASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmAEhEAzMAgsgAEEANgIAIBBBAWohAUEZIRAMsQELAkAgBCACRw0AQZkBIRAMywILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQa7PgIAAai0AAEcNswEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZkBIRAMywILIABBADYCACAQQQFqIQFBBiEQDLABCwJAIAQgAkcNAEGaASEQDMoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG0z4CAAGotAABHDbIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGaASEQDMoCCyAAQQA2AgAgEEEBaiEBQRwhEAyvAQsCQCAEIAJHDQBBmwEhEAzJAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBts+AgABqLQAARw2xASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmwEhEAzJAgsgAEEANgIAIBBBAWohAUEnIRAMrgELAkAgBCACRw0AQZwBIRAMyAILAkACQCAELQAAQax/ag4CAAGxAQsgBEEBaiEEQYYBIRAMrwILIARBAWohBEGHASEQDK4CCwJAIAQgAkcNAEGdASEQDMcCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG4z4CAAGotAABHDa8BIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGdASEQDMcCCyAAQQA2AgAgEEEBaiEBQSYhEAysAQsCQCAEIAJHDQBBngEhEAzGAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBus+AgABqLQAARw2uASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBngEhEAzGAgsgAEEANgIAIBBBAWohAUEDIRAMqwELAkAgBCACRw0AQZ8BIRAMxQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNrQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ8BIRAMxQILIABBADYCACAQQQFqIQFBDCEQDKoBCwJAIAQgAkcNAEGgASEQDMQCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUG8z4CAAGotAABHDawBIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGgASEQDMQCCyAAQQA2AgAgEEEBaiEBQQ0hEAypAQsCQCAEIAJHDQBBoQEhEAzDAgsCQAJAIAQtAABBun9qDgsArAGsAawBrAGsAawBrAGsAawBAawBCyAEQQFqIQRBiwEhEAyqAgsgBEEBaiEEQYwBIRAMqQILAkAgBCACRw0AQaIBIRAMwgILIAQtAABB0ABHDakBIARBAWohBAzpAQsCQCAEIAJHDQBBowEhEAzBAgsCQAJAIAQtAABBt39qDgcBqgGqAaoBqgGqAQCqAQsgBEEBaiEEQY4BIRAMqAILIARBAWohAUEiIRAMpgELAkAgBCACRw0AQaQBIRAMwAILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQcDPgIAAai0AAEcNqAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaQBIRAMwAILIABBADYCACAQQQFqIQFBHSEQDKUBCwJAIAQgAkcNAEGlASEQDL8CCwJAAkAgBC0AAEGuf2oOAwCoAQGoAQsgBEEBaiEEQZABIRAMpgILIARBAWohAUEEIRAMpAELAkAgBCACRw0AQaYBIRAMvgILAkACQAJAAkACQCAELQAAQb9/ag4VAKoBqgGqAaoBqgGqAaoBqgGqAaoBAaoBqgECqgGqAQOqAaoBBKoBCyAEQQFqIQRBiAEhEAyoAgsgBEEBaiEEQYkBIRAMpwILIARBAWohBEGKASEQDKYCCyAEQQFqIQRBjwEhEAylAgsgBEEBaiEEQZEBIRAMpAILAkAgBCACRw0AQacBIRAMvQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNpQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQacBIRAMvQILIABBADYCACAQQQFqIQFBESEQDKIBCwJAIAQgAkcNAEGoASEQDLwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHCz4CAAGotAABHDaQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGoASEQDLwCCyAAQQA2AgAgEEEBaiEBQSwhEAyhAQsCQCAEIAJHDQBBqQEhEAy7AgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBxc+AgABqLQAARw2jASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqQEhEAy7AgsgAEEANgIAIBBBAWohAUErIRAMoAELAkAgBCACRw0AQaoBIRAMugILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQcrPgIAAai0AAEcNogEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaoBIRAMugILIABBADYCACAQQQFqIQFBFCEQDJ8BCwJAIAQgAkcNAEGrASEQDLkCCwJAAkACQAJAIAQtAABBvn9qDg8AAQKkAaQBpAGkAaQBpAGkAaQBpAGkAaQBA6QBCyAEQQFqIQRBkwEhEAyiAgsgBEEBaiEEQZQBIRAMoQILIARBAWohBEGVASEQDKACCyAEQQFqIQRBlgEhEAyfAgsCQCAEIAJHDQBBrAEhEAy4AgsgBC0AAEHFAEcNnwEgBEEBaiEEDOABCwJAIAQgAkcNAEGtASEQDLcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHNz4CAAGotAABHDZ8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGtASEQDLcCCyAAQQA2AgAgEEEBaiEBQQ4hEAycAQsCQCAEIAJHDQBBrgEhEAy2AgsgBC0AAEHQAEcNnQEgBEEBaiEBQSUhEAybAQsCQCAEIAJHDQBBrwEhEAy1AgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw2dASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrwEhEAy1AgsgAEEANgIAIBBBAWohAUEqIRAMmgELAkAgBCACRw0AQbABIRAMtAILAkACQCAELQAAQat/ag4LAJ0BnQGdAZ0BnQGdAZ0BnQGdAQGdAQsgBEEBaiEEQZoBIRAMmwILIARBAWohBEGbASEQDJoCCwJAIAQgAkcNAEGxASEQDLMCCwJAAkAgBC0AAEG/f2oOFACcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAEBnAELIARBAWohBEGZASEQDJoCCyAEQQFqIQRBnAEhEAyZAgsCQCAEIAJHDQBBsgEhEAyyAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFB2c+AgABqLQAARw2aASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBsgEhEAyyAgsgAEEANgIAIBBBAWohAUEhIRAMlwELAkAgBCACRw0AQbMBIRAMsQILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQd3PgIAAai0AAEcNmQEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbMBIRAMsQILIABBADYCACAQQQFqIQFBGiEQDJYBCwJAIAQgAkcNAEG0ASEQDLACCwJAAkACQCAELQAAQbt/ag4RAJoBmgGaAZoBmgGaAZoBmgGaAQGaAZoBmgGaAZoBApoBCyAEQQFqIQRBnQEhEAyYAgsgBEEBaiEEQZ4BIRAMlwILIARBAWohBEGfASEQDJYCCwJAIAQgAkcNAEG1ASEQDK8CCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUHkz4CAAGotAABHDZcBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG1ASEQDK8CCyAAQQA2AgAgEEEBaiEBQSghEAyUAQsCQCAEIAJHDQBBtgEhEAyuAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB6s+AgABqLQAARw2WASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtgEhEAyuAgsgAEEANgIAIBBBAWohAUEHIRAMkwELAkAgBCACRw0AQbcBIRAMrQILAkACQCAELQAAQbt/ag4OAJYBlgGWAZYBlgGWAZYBlgGWAZYBlgGWAQGWAQsgBEEBaiEEQaEBIRAMlAILIARBAWohBEGiASEQDJMCCwJAIAQgAkcNAEG4ASEQDKwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDZQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG4ASEQDKwCCyAAQQA2AgAgEEEBaiEBQRIhEAyRAQsCQCAEIAJHDQBBuQEhEAyrAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw2TASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuQEhEAyrAgsgAEEANgIAIBBBAWohAUEgIRAMkAELAkAgBCACRw0AQboBIRAMqgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNkgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQboBIRAMqgILIABBADYCACAQQQFqIQFBDyEQDI8BCwJAIAQgAkcNAEG7ASEQDKkCCwJAAkAgBC0AAEG3f2oOBwCSAZIBkgGSAZIBAZIBCyAEQQFqIQRBpQEhEAyQAgsgBEEBaiEEQaYBIRAMjwILAkAgBCACRw0AQbwBIRAMqAILIAIgBGsgACgCACIBaiEUIAQgAWtBB2ohEAJAA0AgBC0AACABQfTPgIAAai0AAEcNkAEgAUEHRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbwBIRAMqAILIABBADYCACAQQQFqIQFBGyEQDI0BCwJAIAQgAkcNAEG9ASEQDKcCCwJAAkACQCAELQAAQb5/ag4SAJEBkQGRAZEBkQGRAZEBkQGRAQGRAZEBkQGRAZEBkQECkQELIARBAWohBEGkASEQDI8CCyAEQQFqIQRBpwEhEAyOAgsgBEEBaiEEQagBIRAMjQILAkAgBCACRw0AQb4BIRAMpgILIAQtAABBzgBHDY0BIARBAWohBAzPAQsCQCAEIAJHDQBBvwEhEAylAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAELQAAQb9/ag4VAAECA5wBBAUGnAGcAZwBBwgJCgucAQwNDg+cAQsgBEEBaiEBQegAIRAMmgILIARBAWohAUHpACEQDJkCCyAEQQFqIQFB7gAhEAyYAgsgBEEBaiEBQfIAIRAMlwILIARBAWohAUHzACEQDJYCCyAEQQFqIQFB9gAhEAyVAgsgBEEBaiEBQfcAIRAMlAILIARBAWohAUH6ACEQDJMCCyAEQQFqIQRBgwEhEAySAgsgBEEBaiEEQYQBIRAMkQILIARBAWohBEGFASEQDJACCyAEQQFqIQRBkgEhEAyPAgsgBEEBaiEEQZgBIRAMjgILIARBAWohBEGgASEQDI0CCyAEQQFqIQRBowEhEAyMAgsgBEEBaiEEQaoBIRAMiwILAkAgBCACRg0AIABBkICAgAA2AgggACAENgIEQasBIRAMiwILQcABIRAMowILIAAgBSACEKqAgIAAIgENiwEgBSEBDFwLAkAgBiACRg0AIAZBAWohBQyNAQtBwgEhEAyhAgsDQAJAIBAtAABBdmoOBIwBAACPAQALIBBBAWoiECACRw0AC0HDASEQDKACCwJAIAcgAkYNACAAQZGAgIAANgIIIAAgBzYCBCAHIQFBASEQDIcCC0HEASEQDJ8CCwJAIAcgAkcNAEHFASEQDJ8CCwJAAkAgBy0AAEF2ag4EAc4BzgEAzgELIAdBAWohBgyNAQsgB0EBaiEFDIkBCwJAIAcgAkcNAEHGASEQDJ4CCwJAAkAgBy0AAEF2ag4XAY8BjwEBjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAI8BCyAHQQFqIQcLQbABIRAMhAILAkAgCCACRw0AQcgBIRAMnQILIAgtAABBIEcNjQEgAEEAOwEyIAhBAWohAUGzASEQDIMCCyABIRcCQANAIBciByACRg0BIActAABBUGpB/wFxIhBBCk8NzAECQCAALwEyIhRBmTNLDQAgACAUQQpsIhQ7ATIgEEH//wNzIBRB/v8DcUkNACAHQQFqIRcgACAUIBBqIhA7ATIgEEH//wNxQegHSQ0BCwtBACEQIABBADYCHCAAQcGJgIAANgIQIABBDTYCDCAAIAdBAWo2AhQMnAILQccBIRAMmwILIAAgCCACEK6AgIAAIhBFDcoBIBBBFUcNjAEgAEHIATYCHCAAIAg2AhQgAEHJl4CAADYCECAAQRU2AgxBACEQDJoCCwJAIAkgAkcNAEHMASEQDJoCC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgCS0AAEFQag4KlgGVAQABAgMEBQYIlwELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMjgELQQkhEEEBIRRBACEXQQAhFgyNAQsCQCAKIAJHDQBBzgEhEAyZAgsgCi0AAEEuRw2OASAKQQFqIQkMygELIAsgAkcNjgFB0AEhEAyXAgsCQCALIAJGDQAgAEGOgICAADYCCCAAIAs2AgRBtwEhEAz+AQtB0QEhEAyWAgsCQCAEIAJHDQBB0gEhEAyWAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EEaiELA0AgBC0AACAQQfzPgIAAai0AAEcNjgEgEEEERg3pASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHSASEQDJUCCyAAIAwgAhCsgICAACIBDY0BIAwhAQy4AQsCQCAEIAJHDQBB1AEhEAyUAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EBaiEMA0AgBC0AACAQQYHQgIAAai0AAEcNjwEgEEEBRg2OASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHUASEQDJMCCwJAIAQgAkcNAEHWASEQDJMCCyACIARrIAAoAgAiEGohFCAEIBBrQQJqIQsDQCAELQAAIBBBg9CAgABqLQAARw2OASAQQQJGDZABIBBBAWohECAEQQFqIgQgAkcNAAsgACAUNgIAQdYBIRAMkgILAkAgBCACRw0AQdcBIRAMkgILAkACQCAELQAAQbt/ag4QAI8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwEBjwELIARBAWohBEG7ASEQDPkBCyAEQQFqIQRBvAEhEAz4AQsCQCAEIAJHDQBB2AEhEAyRAgsgBC0AAEHIAEcNjAEgBEEBaiEEDMQBCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEG+ASEQDPcBC0HZASEQDI8CCwJAIAQgAkcNAEHaASEQDI8CCyAELQAAQcgARg3DASAAQQE6ACgMuQELIABBAjoALyAAIAQgAhCmgICAACIQDY0BQcIBIRAM9AELIAAtAChBf2oOArcBuQG4AQsDQAJAIAQtAABBdmoOBACOAY4BAI4BCyAEQQFqIgQgAkcNAAtB3QEhEAyLAgsgAEEAOgAvIAAtAC1BBHFFDYQCCyAAQQA6AC8gAEEBOgA0IAEhAQyMAQsgEEEVRg3aASAAQQA2AhwgACABNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAyIAgsCQCAAIBAgAhC0gICAACIEDQAgECEBDIECCwJAIARBFUcNACAAQQM2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAyIAgsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMhwILIBBBFUYN1gEgAEEANgIcIAAgATYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMhgILIAAoAgQhFyAAQQA2AgQgECARp2oiFiEBIAAgFyAQIBYgFBsiEBC1gICAACIURQ2NASAAQQc2AhwgACAQNgIUIAAgFDYCDEEAIRAMhQILIAAgAC8BMEGAAXI7ATAgASEBC0EqIRAM6gELIBBBFUYN0QEgAEEANgIcIAAgATYCFCAAQYOMgIAANgIQIABBEzYCDEEAIRAMggILIBBBFUYNzwEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAMgQILIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDI0BCyAAQQw2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMgAILIBBBFUYNzAEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM/wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIwBCyAAQQ02AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/gELIBBBFUYNyQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM/QELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIsBCyAAQQ42AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/AELIABBADYCHCAAIAE2AhQgAEHAlYCAADYCECAAQQI2AgxBACEQDPsBCyAQQRVGDcUBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPoBCyAAQRA2AhwgACABNgIUIAAgEDYCDEEAIRAM+QELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDPEBCyAAQRE2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM+AELIBBBFUYNwQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM9wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIgBCyAAQRM2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM9gELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDO0BCyAAQRQ2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM9QELIBBBFUYNvQEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM9AELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIYBCyAAQRY2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM8wELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC3gICAACIEDQAgAUEBaiEBDOkBCyAAQRc2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM8gELIABBADYCHCAAIAE2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDPEBC0IBIRELIBBBAWohAQJAIAApAyAiEkL//////////w9WDQAgACASQgSGIBGENwMgIAEhAQyEAQsgAEEANgIcIAAgATYCFCAAQa2JgIAANgIQIABBDDYCDEEAIRAM7wELIABBADYCHCAAIBA2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDO4BCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNcyAAQQU2AhwgACAQNgIUIAAgFDYCDEEAIRAM7QELIABBADYCHCAAIBA2AhQgAEGqnICAADYCECAAQQ82AgxBACEQDOwBCyAAIBAgAhC0gICAACIBDQEgECEBC0EOIRAM0QELAkAgAUEVRw0AIABBAjYCHCAAIBA2AhQgAEGwmICAADYCECAAQRU2AgxBACEQDOoBCyAAQQA2AhwgACAQNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAzpAQsgAUEBaiEQAkAgAC8BMCIBQYABcUUNAAJAIAAgECACELuAgIAAIgENACAQIQEMcAsgAUEVRw26ASAAQQU2AhwgACAQNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAzpAQsCQCABQaAEcUGgBEcNACAALQAtQQJxDQAgAEEANgIcIAAgEDYCFCAAQZaTgIAANgIQIABBBDYCDEEAIRAM6QELIAAgECACEL2AgIAAGiAQIQECQAJAAkACQAJAIAAgECACELOAgIAADhYCAQAEBAQEBAQEBAQEBAQEBAQEBAQDBAsgAEEBOgAuCyAAIAAvATBBwAByOwEwIBAhAQtBJiEQDNEBCyAAQSM2AhwgACAQNgIUIABBpZaAgAA2AhAgAEEVNgIMQQAhEAzpAQsgAEEANgIcIAAgEDYCFCAAQdWLgIAANgIQIABBETYCDEEAIRAM6AELIAAtAC1BAXFFDQFBwwEhEAzOAQsCQCANIAJGDQADQAJAIA0tAABBIEYNACANIQEMxAELIA1BAWoiDSACRw0AC0ElIRAM5wELQSUhEAzmAQsgACgCBCEEIABBADYCBCAAIAQgDRCvgICAACIERQ2tASAAQSY2AhwgACAENgIMIAAgDUEBajYCFEEAIRAM5QELIBBBFUYNqwEgAEEANgIcIAAgATYCFCAAQf2NgIAANgIQIABBHTYCDEEAIRAM5AELIABBJzYCHCAAIAE2AhQgACAQNgIMQQAhEAzjAQsgECEBQQEhFAJAAkACQAJAAkACQAJAIAAtACxBfmoOBwYFBQMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0ErIRAMygELIABBADYCHCAAIBA2AhQgAEGrkoCAADYCECAAQQs2AgxBACEQDOIBCyAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMQQAhEAzhAQsgAEEAOgAsIBAhAQy9AQsgECEBQQEhFAJAAkACQAJAAkAgAC0ALEF7ag4EAwECAAULIAAgAC8BMEEIcjsBMAwDC0ECIRQMAQtBBCEUCyAAQQE6ACwgACAALwEwIBRyOwEwCyAQIQELQSkhEAzFAQsgAEEANgIcIAAgATYCFCAAQfCUgIAANgIQIABBAzYCDEEAIRAM3QELAkAgDi0AAEENRw0AIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHULIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzdAQsgAC0ALUEBcUUNAUHEASEQDMMBCwJAIA4gAkcNAEEtIRAM3AELAkACQANAAkAgDi0AAEF2ag4EAgAAAwALIA5BAWoiDiACRw0AC0EtIRAM3QELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDiEBDHQLIABBLDYCHCAAIA42AhQgACABNgIMQQAhEAzcAQsgACgCBCEBIABBADYCBAJAIAAgASAOELGAgIAAIgENACAOQQFqIQEMcwsgAEEsNgIcIAAgATYCDCAAIA5BAWo2AhRBACEQDNsBCyAAKAIEIQQgAEEANgIEIAAgBCAOELGAgIAAIgQNoAEgDiEBDM4BCyAQQSxHDQEgAUEBaiEQQQEhAQJAAkACQAJAAkAgAC0ALEF7ag4EAwECBAALIBAhAQwEC0ECIQEMAQtBBCEBCyAAQQE6ACwgACAALwEwIAFyOwEwIBAhAQwBCyAAIAAvATBBCHI7ATAgECEBC0E5IRAMvwELIABBADoALCABIQELQTQhEAy9AQsgACAALwEwQSByOwEwIAEhAQwCCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBA0AIAEhAQzHAQsgAEE3NgIcIAAgATYCFCAAIAQ2AgxBACEQDNQBCyAAQQg6ACwgASEBC0EwIRAMuQELAkAgAC0AKEEBRg0AIAEhAQwECyAALQAtQQhxRQ2TASABIQEMAwsgAC0AMEEgcQ2UAUHFASEQDLcBCwJAIA8gAkYNAAJAA0ACQCAPLQAAQVBqIgFB/wFxQQpJDQAgDyEBQTUhEAy6AQsgACkDICIRQpmz5syZs+bMGVYNASAAIBFCCn4iETcDICARIAGtQv8BgyISQn+FVg0BIAAgESASfDcDICAPQQFqIg8gAkcNAAtBOSEQDNEBCyAAKAIEIQIgAEEANgIEIAAgAiAPQQFqIgQQsYCAgAAiAg2VASAEIQEMwwELQTkhEAzPAQsCQCAALwEwIgFBCHFFDQAgAC0AKEEBRw0AIAAtAC1BCHFFDZABCyAAIAFB9/sDcUGABHI7ATAgDyEBC0E3IRAMtAELIAAgAC8BMEEQcjsBMAyrAQsgEEEVRg2LASAAQQA2AhwgACABNgIUIABB8I6AgAA2AhAgAEEcNgIMQQAhEAzLAQsgAEHDADYCHCAAIAE2AgwgACANQQFqNgIUQQAhEAzKAQsCQCABLQAAQTpHDQAgACgCBCEQIABBADYCBAJAIAAgECABEK+AgIAAIhANACABQQFqIQEMYwsgAEHDADYCHCAAIBA2AgwgACABQQFqNgIUQQAhEAzKAQsgAEEANgIcIAAgATYCFCAAQbGRgIAANgIQIABBCjYCDEEAIRAMyQELIABBADYCHCAAIAE2AhQgAEGgmYCAADYCECAAQR42AgxBACEQDMgBCyAAQQA2AgALIABBgBI7ASogACAXQQFqIgEgAhCogICAACIQDQEgASEBC0HHACEQDKwBCyAQQRVHDYMBIABB0QA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAzEAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAzDAQsgAEEANgIcIAAgFDYCFCAAQcGogIAANgIQIABBBzYCDCAAQQA2AgBBACEQDMIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxdCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDMEBC0EAIRAgAEEANgIcIAAgATYCFCAAQYCRgIAANgIQIABBCTYCDAzAAQsgEEEVRg19IABBADYCHCAAIAE2AhQgAEGUjYCAADYCECAAQSE2AgxBACEQDL8BC0EBIRZBACEXQQAhFEEBIRALIAAgEDoAKyABQQFqIQECQAJAIAAtAC1BEHENAAJAAkACQCAALQAqDgMBAAIECyAWRQ0DDAILIBQNAQwCCyAXRQ0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQrYCAgAAiEA0AIAEhAQxcCyAAQdgANgIcIAAgATYCFCAAIBA2AgxBACEQDL4BCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQytAQsgAEHZADYCHCAAIAE2AhQgACAENgIMQQAhEAy9AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMqwELIABB2gA2AhwgACABNgIUIAAgBDYCDEEAIRAMvAELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKkBCyAAQdwANgIcIAAgATYCFCAAIAQ2AgxBACEQDLsBCwJAIAEtAABBUGoiEEH/AXFBCk8NACAAIBA6ACogAUEBaiEBQc8AIRAMogELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKcBCyAAQd4ANgIcIAAgATYCFCAAIAQ2AgxBACEQDLoBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKUEjTw0AIAEhAQxZCyAAQQA2AhwgACABNgIUIABB04mAgAA2AhAgAEEINgIMQQAhEAy5AQsgAEEANgIAC0EAIRAgAEEANgIcIAAgATYCFCAAQZCzgIAANgIQIABBCDYCDAy3AQsgAEEANgIAIBdBAWohAQJAIAAtAClBIUcNACABIQEMVgsgAEEANgIcIAAgATYCFCAAQZuKgIAANgIQIABBCDYCDEEAIRAMtgELIABBADYCACAXQQFqIQECQCAALQApIhBBXWpBC08NACABIQEMVQsCQCAQQQZLDQBBASAQdEHKAHFFDQAgASEBDFULQQAhECAAQQA2AhwgACABNgIUIABB94mAgAA2AhAgAEEINgIMDLUBCyAQQRVGDXEgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMtAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFQLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMswELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMsgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMsQELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFELIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMsAELIABBADYCHCAAIAE2AhQgAEHGioCAADYCECAAQQc2AgxBACEQDK8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDK4BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDK0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDKwBCyAAQQA2AhwgACABNgIUIABB3IiAgAA2AhAgAEEHNgIMQQAhEAyrAQsgEEE/Rw0BIAFBAWohAQtBBSEQDJABC0EAIRAgAEEANgIcIAAgATYCFCAAQf2SgIAANgIQIABBBzYCDAyoAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAynAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAymAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMRgsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAylAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHSADYCHCAAIBQ2AhQgACABNgIMQQAhEAykAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHTADYCHCAAIBQ2AhQgACABNgIMQQAhEAyjAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMQwsgAEHlADYCHCAAIBQ2AhQgACABNgIMQQAhEAyiAQsgAEEANgIcIAAgFDYCFCAAQcOPgIAANgIQIABBBzYCDEEAIRAMoQELIABBADYCHCAAIAE2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKABC0EAIRAgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDAyfAQsgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDEEAIRAMngELIABBADYCHCAAIBQ2AhQgAEH+kYCAADYCECAAQQc2AgxBACEQDJ0BCyAAQQA2AhwgACABNgIUIABBjpuAgAA2AhAgAEEGNgIMQQAhEAycAQsgEEEVRg1XIABBADYCHCAAIAE2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDJsBCyAAQQA2AgAgEEEBaiEBQSQhEAsgACAQOgApIAAoAgQhECAAQQA2AgQgACAQIAEQq4CAgAAiEA1UIAEhAQw+CyAAQQA2AgALQQAhECAAQQA2AhwgACAENgIUIABB8ZuAgAA2AhAgAEEGNgIMDJcBCyABQRVGDVAgAEEANgIcIAAgBTYCFCAAQfCMgIAANgIQIABBGzYCDEEAIRAMlgELIAAoAgQhBSAAQQA2AgQgACAFIBAQqYCAgAAiBQ0BIBBBAWohBQtBrQEhEAx7CyAAQcEBNgIcIAAgBTYCDCAAIBBBAWo2AhRBACEQDJMBCyAAKAIEIQYgAEEANgIEIAAgBiAQEKmAgIAAIgYNASAQQQFqIQYLQa4BIRAMeAsgAEHCATYCHCAAIAY2AgwgACAQQQFqNgIUQQAhEAyQAQsgAEEANgIcIAAgBzYCFCAAQZeLgIAANgIQIABBDTYCDEEAIRAMjwELIABBADYCHCAAIAg2AhQgAEHjkICAADYCECAAQQk2AgxBACEQDI4BCyAAQQA2AhwgACAINgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAyNAQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgCUEBaiEIAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBCAAIBAgCBCtgICAACIQRQ09IABByQE2AhwgACAINgIUIAAgEDYCDEEAIRAMjAELIAAoAgQhBCAAQQA2AgQgACAEIAgQrYCAgAAiBEUNdiAAQcoBNgIcIAAgCDYCFCAAIAQ2AgxBACEQDIsBCyAAKAIEIQQgAEEANgIEIAAgBCAJEK2AgIAAIgRFDXQgAEHLATYCHCAAIAk2AhQgACAENgIMQQAhEAyKAQsgACgCBCEEIABBADYCBCAAIAQgChCtgICAACIERQ1yIABBzQE2AhwgACAKNgIUIAAgBDYCDEEAIRAMiQELAkAgCy0AAEFQaiIQQf8BcUEKTw0AIAAgEDoAKiALQQFqIQpBtgEhEAxwCyAAKAIEIQQgAEEANgIEIAAgBCALEK2AgIAAIgRFDXAgAEHPATYCHCAAIAs2AhQgACAENgIMQQAhEAyIAQsgAEEANgIcIAAgBDYCFCAAQZCzgIAANgIQIABBCDYCDCAAQQA2AgBBACEQDIcBCyABQRVGDT8gAEEANgIcIAAgDDYCFCAAQcyOgIAANgIQIABBIDYCDEEAIRAMhgELIABBgQQ7ASggACgCBCEQIABCADcDACAAIBAgDEEBaiIMEKuAgIAAIhBFDTggAEHTATYCHCAAIAw2AhQgACAQNgIMQQAhEAyFAQsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQdibgIAANgIQIABBCDYCDAyDAQsgACgCBCEQIABCADcDACAAIBAgC0EBaiILEKuAgIAAIhANAUHGASEQDGkLIABBAjoAKAxVCyAAQdUBNgIcIAAgCzYCFCAAIBA2AgxBACEQDIABCyAQQRVGDTcgAEEANgIcIAAgBDYCFCAAQaSMgIAANgIQIABBEDYCDEEAIRAMfwsgAC0ANEEBRw00IAAgBCACELyAgIAAIhBFDTQgEEEVRw01IABB3AE2AhwgACAENgIUIABB1ZaAgAA2AhAgAEEVNgIMQQAhEAx+C0EAIRAgAEEANgIcIABBr4uAgAA2AhAgAEECNgIMIAAgFEEBajYCFAx9C0EAIRAMYwtBAiEQDGILQQ0hEAxhC0EPIRAMYAtBJSEQDF8LQRMhEAxeC0EVIRAMXQtBFiEQDFwLQRchEAxbC0EYIRAMWgtBGSEQDFkLQRohEAxYC0EbIRAMVwtBHCEQDFYLQR0hEAxVC0EfIRAMVAtBISEQDFMLQSMhEAxSC0HGACEQDFELQS4hEAxQC0EvIRAMTwtBOyEQDE4LQT0hEAxNC0HIACEQDEwLQckAIRAMSwtBywAhEAxKC0HMACEQDEkLQc4AIRAMSAtB0QAhEAxHC0HVACEQDEYLQdgAIRAMRQtB2QAhEAxEC0HbACEQDEMLQeQAIRAMQgtB5QAhEAxBC0HxACEQDEALQfQAIRAMPwtBjQEhEAw+C0GXASEQDD0LQakBIRAMPAtBrAEhEAw7C0HAASEQDDoLQbkBIRAMOQtBrwEhEAw4C0GxASEQDDcLQbIBIRAMNgtBtAEhEAw1C0G1ASEQDDQLQboBIRAMMwtBvQEhEAwyC0G/ASEQDDELQcEBIRAMMAsgAEEANgIcIAAgBDYCFCAAQemLgIAANgIQIABBHzYCDEEAIRAMSAsgAEHbATYCHCAAIAQ2AhQgAEH6loCAADYCECAAQRU2AgxBACEQDEcLIABB+AA2AhwgACAMNgIUIABBypiAgAA2AhAgAEEVNgIMQQAhEAxGCyAAQdEANgIcIAAgBTYCFCAAQbCXgIAANgIQIABBFTYCDEEAIRAMRQsgAEH5ADYCHCAAIAE2AhQgACAQNgIMQQAhEAxECyAAQfgANgIcIAAgATYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMQwsgAEHkADYCHCAAIAE2AhQgAEHjl4CAADYCECAAQRU2AgxBACEQDEILIABB1wA2AhwgACABNgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAxBCyAAQQA2AhwgACABNgIUIABBuY2AgAA2AhAgAEEaNgIMQQAhEAxACyAAQcIANgIcIAAgATYCFCAAQeOYgIAANgIQIABBFTYCDEEAIRAMPwsgAEEANgIEIAAgDyAPELGAgIAAIgRFDQEgAEE6NgIcIAAgBDYCDCAAIA9BAWo2AhRBACEQDD4LIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCxgICAACIERQ0AIABBOzYCHCAAIAQ2AgwgACABQQFqNgIUQQAhEAw+CyABQQFqIQEMLQsgD0EBaiEBDC0LIABBADYCHCAAIA82AhQgAEHkkoCAADYCECAAQQQ2AgxBACEQDDsLIABBNjYCHCAAIAQ2AhQgACACNgIMQQAhEAw6CyAAQS42AhwgACAONgIUIAAgBDYCDEEAIRAMOQsgAEHQADYCHCAAIAE2AhQgAEGRmICAADYCECAAQRU2AgxBACEQDDgLIA1BAWohAQwsCyAAQRU2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAw2CyAAQRs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw1CyAAQQ82AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw0CyAAQQs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAwzCyAAQRo2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwyCyAAQQs2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwxCyAAQQo2AhwgACABNgIUIABB5JaAgAA2AhAgAEEVNgIMQQAhEAwwCyAAQR42AhwgACABNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAwvCyAAQQA2AhwgACAQNgIUIABB2o2AgAA2AhAgAEEUNgIMQQAhEAwuCyAAQQQ2AhwgACABNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAwtCyAAQQA2AgAgC0EBaiELC0G4ASEQDBILIABBADYCACAQQQFqIQFB9QAhEAwRCyABIQECQCAALQApQQVHDQBB4wAhEAwRC0HiACEQDBALQQAhECAAQQA2AhwgAEHkkYCAADYCECAAQQc2AgwgACAUQQFqNgIUDCgLIABBADYCACAXQQFqIQFBwAAhEAwOC0EBIQELIAAgAToALCAAQQA2AgAgF0EBaiEBC0EoIRAMCwsgASEBC0E4IRAMCQsCQCABIg8gAkYNAANAAkAgDy0AAEGAvoCAAGotAAAiAUEBRg0AIAFBAkcNAyAPQQFqIQEMBAsgD0EBaiIPIAJHDQALQT4hEAwiC0E+IRAMIQsgAEEAOgAsIA8hAQwBC0ELIRAMBgtBOiEQDAULIAFBAWohAUEtIRAMBAsgACABOgAsIABBADYCACAWQQFqIQFBDCEQDAMLIABBADYCACAXQQFqIQFBCiEQDAILIABBADYCAAsgAEEAOgAsIA0hAUEJIRAMAAsLQQAhECAAQQA2AhwgACALNgIUIABBzZCAgAA2AhAgAEEJNgIMDBcLQQAhECAAQQA2AhwgACAKNgIUIABB6YqAgAA2AhAgAEEJNgIMDBYLQQAhECAAQQA2AhwgACAJNgIUIABBt5CAgAA2AhAgAEEJNgIMDBULQQAhECAAQQA2AhwgACAINgIUIABBnJGAgAA2AhAgAEEJNgIMDBQLQQAhECAAQQA2AhwgACABNgIUIABBzZCAgAA2AhAgAEEJNgIMDBMLQQAhECAAQQA2AhwgACABNgIUIABB6YqAgAA2AhAgAEEJNgIMDBILQQAhECAAQQA2AhwgACABNgIUIABBt5CAgAA2AhAgAEEJNgIMDBELQQAhECAAQQA2AhwgACABNgIUIABBnJGAgAA2AhAgAEEJNgIMDBALQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA8LQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA4LQQAhECAAQQA2AhwgACABNgIUIABBwJKAgAA2AhAgAEELNgIMDA0LQQAhECAAQQA2AhwgACABNgIUIABBlYmAgAA2AhAgAEELNgIMDAwLQQAhECAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMDAsLQQAhECAAQQA2AhwgACABNgIUIABB+4+AgAA2AhAgAEEKNgIMDAoLQQAhECAAQQA2AhwgACABNgIUIABB8ZmAgAA2AhAgAEECNgIMDAkLQQAhECAAQQA2AhwgACABNgIUIABBxJSAgAA2AhAgAEECNgIMDAgLQQAhECAAQQA2AhwgACABNgIUIABB8pWAgAA2AhAgAEECNgIMDAcLIABBAjYCHCAAIAE2AhQgAEGcmoCAADYCECAAQRY2AgxBACEQDAYLQQEhEAwFC0HUACEQIAEiBCACRg0EIANBCGogACAEIAJB2MKAgABBChDFgICAACADKAIMIQQgAygCCA4DAQQCAAsQyoCAgAAACyAAQQA2AhwgAEG1moCAADYCECAAQRc2AgwgACAEQQFqNgIUQQAhEAwCCyAAQQA2AhwgACAENgIUIABBypqAgAA2AhAgAEEJNgIMQQAhEAwBCwJAIAEiBCACRw0AQSIhEAwBCyAAQYmAgIAANgIIIAAgBDYCBEEhIRALIANBEGokgICAgAAgEAuvAQECfyABKAIAIQYCQAJAIAIgA0YNACAEIAZqIQQgBiADaiACayEHIAIgBkF/cyAFaiIGaiEFA0ACQCACLQAAIAQtAABGDQBBAiEEDAMLAkAgBg0AQQAhBCAFIQIMAwsgBkF/aiEGIARBAWohBCACQQFqIgIgA0cNAAsgByEGIAMhAgsgAEEBNgIAIAEgBjYCACAAIAI2AgQPCyABQQA2AgAgACAENgIAIAAgAjYCBAsKACAAEMeAgIAAC/I2AQt/I4CAgIAAQRBrIgEkgICAgAACQEEAKAKg0ICAAA0AQQAQy4CAgABBgNSEgABrIgJB2QBJDQBBACEDAkBBACgC4NOAgAAiBA0AQQBCfzcC7NOAgABBAEKAgISAgIDAADcC5NOAgABBACABQQhqQXBxQdiq1aoFcyIENgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgAALQQAgAjYCzNOAgABBAEGA1ISAADYCyNOAgABBAEGA1ISAADYCmNCAgABBACAENgKs0ICAAEEAQX82AqjQgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAtBgNSEgABBeEGA1ISAAGtBD3FBAEGA1ISAAEEIakEPcRsiA2oiBEEEaiACQUhqIgUgA2siA0EBcjYCAEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgABBgNSEgAAgBWpBODYCBAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEHsAUsNAAJAQQAoAojQgIAAIgZBECAAQRNqQXBxIABBC0kbIgJBA3YiBHYiA0EDcUUNAAJAAkAgA0EBcSAEckEBcyIFQQN0IgRBsNCAgABqIgMgBEG40ICAAGooAgAiBCgCCCICRw0AQQAgBkF+IAV3cTYCiNCAgAAMAQsgAyACNgIIIAIgAzYCDAsgBEEIaiEDIAQgBUEDdCIFQQNyNgIEIAQgBWoiBCAEKAIEQQFyNgIEDAwLIAJBACgCkNCAgAAiB00NAQJAIANFDQACQAJAIAMgBHRBAiAEdCIDQQAgA2tycSIDQQAgA2txQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmoiBEEDdCIDQbDQgIAAaiIFIANBuNCAgABqKAIAIgMoAggiAEcNAEEAIAZBfiAEd3EiBjYCiNCAgAAMAQsgBSAANgIIIAAgBTYCDAsgAyACQQNyNgIEIAMgBEEDdCIEaiAEIAJrIgU2AgAgAyACaiIAIAVBAXI2AgQCQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhBAJAAkAgBkEBIAdBA3Z0IghxDQBBACAGIAhyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAQ2AgwgAiAENgIIIAQgAjYCDCAEIAg2AggLIANBCGohA0EAIAA2ApzQgIAAQQAgBTYCkNCAgAAMDAtBACgCjNCAgAAiCUUNASAJQQAgCWtxQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmpBAnRBuNKAgABqKAIAIgAoAgRBeHEgAmshBCAAIQUCQANAAkAgBSgCECIDDQAgBUEUaigCACIDRQ0CCyADKAIEQXhxIAJrIgUgBCAFIARJIgUbIQQgAyAAIAUbIQAgAyEFDAALCyAAKAIYIQoCQCAAKAIMIgggAEYNACAAKAIIIgNBACgCmNCAgABJGiAIIAM2AgggAyAINgIMDAsLAkAgAEEUaiIFKAIAIgMNACAAKAIQIgNFDQMgAEEQaiEFCwNAIAUhCyADIghBFGoiBSgCACIDDQAgCEEQaiEFIAgoAhAiAw0ACyALQQA2AgAMCgtBfyECIABBv39LDQAgAEETaiIDQXBxIQJBACgCjNCAgAAiB0UNAEEAIQsCQCACQYACSQ0AQR8hCyACQf///wdLDQAgA0EIdiIDIANBgP4/akEQdkEIcSIDdCIEIARBgOAfakEQdkEEcSIEdCIFIAVBgIAPakEQdkECcSIFdEEPdiADIARyIAVyayIDQQF0IAIgA0EVanZBAXFyQRxqIQsLQQAgAmshBAJAAkACQAJAIAtBAnRBuNKAgABqKAIAIgUNAEEAIQNBACEIDAELQQAhAyACQQBBGSALQQF2ayALQR9GG3QhAEEAIQgDQAJAIAUoAgRBeHEgAmsiBiAETw0AIAYhBCAFIQggBg0AQQAhBCAFIQggBSEDDAMLIAMgBUEUaigCACIGIAYgBSAAQR12QQRxakEQaigCACIFRhsgAyAGGyEDIABBAXQhACAFDQALCwJAIAMgCHINAEEAIQhBAiALdCIDQQAgA2tyIAdxIgNFDQMgA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBUEFdkEIcSIAIANyIAUgAHYiA0ECdkEEcSIFciADIAV2IgNBAXZBAnEiBXIgAyAFdiIDQQF2QQFxIgVyIAMgBXZqQQJ0QbjSgIAAaigCACEDCyADRQ0BCwNAIAMoAgRBeHEgAmsiBiAESSEAAkAgAygCECIFDQAgA0EUaigCACEFCyAGIAQgABshBCADIAggABshCCAFIQMgBQ0ACwsgCEUNACAEQQAoApDQgIAAIAJrTw0AIAgoAhghCwJAIAgoAgwiACAIRg0AIAgoAggiA0EAKAKY0ICAAEkaIAAgAzYCCCADIAA2AgwMCQsCQCAIQRRqIgUoAgAiAw0AIAgoAhAiA0UNAyAIQRBqIQULA0AgBSEGIAMiAEEUaiIFKAIAIgMNACAAQRBqIQUgACgCECIDDQALIAZBADYCAAwICwJAQQAoApDQgIAAIgMgAkkNAEEAKAKc0ICAACEEAkACQCADIAJrIgVBEEkNACAEIAJqIgAgBUEBcjYCBEEAIAU2ApDQgIAAQQAgADYCnNCAgAAgBCADaiAFNgIAIAQgAkEDcjYCBAwBCyAEIANBA3I2AgQgBCADaiIDIAMoAgRBAXI2AgRBAEEANgKc0ICAAEEAQQA2ApDQgIAACyAEQQhqIQMMCgsCQEEAKAKU0ICAACIAIAJNDQBBACgCoNCAgAAiAyACaiIEIAAgAmsiBUEBcjYCBEEAIAU2ApTQgIAAQQAgBDYCoNCAgAAgAyACQQNyNgIEIANBCGohAwwKCwJAAkBBACgC4NOAgABFDQBBACgC6NOAgAAhBAwBC0EAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEMakFwcUHYqtWqBXM2AuDTgIAAQQBBADYC9NOAgABBAEEANgLE04CAAEGAgAQhBAtBACEDAkAgBCACQccAaiIHaiIGQQAgBGsiC3EiCCACSw0AQQBBMDYC+NOAgAAMCgsCQEEAKALA04CAACIDRQ0AAkBBACgCuNOAgAAiBCAIaiIFIARNDQAgBSADTQ0BC0EAIQNBAEEwNgL404CAAAwKC0EALQDE04CAAEEEcQ0EAkACQAJAQQAoAqDQgIAAIgRFDQBByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiAESw0DCyADKAIIIgMNAAsLQQAQy4CAgAAiAEF/Rg0FIAghBgJAQQAoAuTTgIAAIgNBf2oiBCAAcUUNACAIIABrIAQgAGpBACADa3FqIQYLIAYgAk0NBSAGQf7///8HSw0FAkBBACgCwNOAgAAiA0UNAEEAKAK404CAACIEIAZqIgUgBE0NBiAFIANLDQYLIAYQy4CAgAAiAyAARw0BDAcLIAYgAGsgC3EiBkH+////B0sNBCAGEMuAgIAAIgAgAygCACADKAIEakYNAyAAIQMLAkAgA0F/Rg0AIAJByABqIAZNDQACQCAHIAZrQQAoAujTgIAAIgRqQQAgBGtxIgRB/v///wdNDQAgAyEADAcLAkAgBBDLgICAAEF/Rg0AIAQgBmohBiADIQAMBwtBACAGaxDLgICAABoMBAsgAyEAIANBf0cNBQwDC0EAIQgMBwtBACEADAULIABBf0cNAgtBAEEAKALE04CAAEEEcjYCxNOAgAALIAhB/v///wdLDQEgCBDLgICAACEAQQAQy4CAgAAhAyAAQX9GDQEgA0F/Rg0BIAAgA08NASADIABrIgYgAkE4ak0NAQtBAEEAKAK404CAACAGaiIDNgK404CAAAJAIANBACgCvNOAgABNDQBBACADNgK804CAAAsCQAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQCAAIAMoAgAiBSADKAIEIghqRg0CIAMoAggiAw0ADAMLCwJAAkBBACgCmNCAgAAiA0UNACAAIANPDQELQQAgADYCmNCAgAALQQAhA0EAIAY2AszTgIAAQQAgADYCyNOAgABBAEF/NgKo0ICAAEEAQQAoAuDTgIAANgKs0ICAAEEAQQA2AtTTgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiBCAGQUhqIgUgA2siA0EBcjYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgAAgACAFakE4NgIEDAILIAMtAAxBCHENACAEIAVJDQAgBCAATw0AIARBeCAEa0EPcUEAIARBCGpBD3EbIgVqIgBBACgClNCAgAAgBmoiCyAFayIFQQFyNgIEIAMgCCAGajYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAU2ApTQgIAAQQAgADYCoNCAgAAgBCALakE4NgIEDAELAkAgAEEAKAKY0ICAACIITw0AQQAgADYCmNCAgAAgACEICyAAIAZqIQVByNOAgAAhAwJAAkACQAJAAkACQAJAA0AgAygCACAFRg0BIAMoAggiAw0ADAILCyADLQAMQQhxRQ0BC0HI04CAACEDA0ACQCADKAIAIgUgBEsNACAFIAMoAgRqIgUgBEsNAwsgAygCCCEDDAALCyADIAA2AgAgAyADKAIEIAZqNgIEIABBeCAAa0EPcUEAIABBCGpBD3EbaiILIAJBA3I2AgQgBUF4IAVrQQ9xQQAgBUEIakEPcRtqIgYgCyACaiICayEDAkAgBiAERw0AQQAgAjYCoNCAgABBAEEAKAKU0ICAACADaiIDNgKU0ICAACACIANBAXI2AgQMAwsCQCAGQQAoApzQgIAARw0AQQAgAjYCnNCAgABBAEEAKAKQ0ICAACADaiIDNgKQ0ICAACACIANBAXI2AgQgAiADaiADNgIADAMLAkAgBigCBCIEQQNxQQFHDQAgBEF4cSEHAkACQCAEQf8BSw0AIAYoAggiBSAEQQN2IghBA3RBsNCAgABqIgBGGgJAIAYoAgwiBCAFRw0AQQBBACgCiNCAgABBfiAId3E2AojQgIAADAILIAQgAEYaIAQgBTYCCCAFIAQ2AgwMAQsgBigCGCEJAkACQCAGKAIMIgAgBkYNACAGKAIIIgQgCEkaIAAgBDYCCCAEIAA2AgwMAQsCQCAGQRRqIgQoAgAiBQ0AIAZBEGoiBCgCACIFDQBBACEADAELA0AgBCEIIAUiAEEUaiIEKAIAIgUNACAAQRBqIQQgACgCECIFDQALIAhBADYCAAsgCUUNAAJAAkAgBiAGKAIcIgVBAnRBuNKAgABqIgQoAgBHDQAgBCAANgIAIAANAUEAQQAoAozQgIAAQX4gBXdxNgKM0ICAAAwCCyAJQRBBFCAJKAIQIAZGG2ogADYCACAARQ0BCyAAIAk2AhgCQCAGKAIQIgRFDQAgACAENgIQIAQgADYCGAsgBigCFCIERQ0AIABBFGogBDYCACAEIAA2AhgLIAcgA2ohAyAGIAdqIgYoAgQhBAsgBiAEQX5xNgIEIAIgA2ogAzYCACACIANBAXI2AgQCQCADQf8BSw0AIANBeHFBsNCAgABqIQQCQAJAQQAoAojQgIAAIgVBASADQQN2dCIDcQ0AQQAgBSADcjYCiNCAgAAgBCEDDAELIAQoAgghAwsgAyACNgIMIAQgAjYCCCACIAQ2AgwgAiADNgIIDAMLQR8hBAJAIANB////B0sNACADQQh2IgQgBEGA/j9qQRB2QQhxIgR0IgUgBUGA4B9qQRB2QQRxIgV0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAQgBXIgAHJrIgRBAXQgAyAEQRVqdkEBcXJBHGohBAsgAiAENgIcIAJCADcCECAEQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiAEEBIAR0IghxDQAgBSACNgIAQQAgACAIcjYCjNCAgAAgAiAFNgIYIAIgAjYCCCACIAI2AgwMAwsgA0EAQRkgBEEBdmsgBEEfRht0IQQgBSgCACEAA0AgACIFKAIEQXhxIANGDQIgBEEddiEAIARBAXQhBCAFIABBBHFqQRBqIggoAgAiAA0ACyAIIAI2AgAgAiAFNgIYIAIgAjYCDCACIAI2AggMAgsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiCyAGQUhqIgggA2siA0EBcjYCBCAAIAhqQTg2AgQgBCAFQTcgBWtBD3FBACAFQUlqQQ9xG2pBQWoiCCAIIARBEGpJGyIIQSM2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAs2AqDQgIAAIAhBEGpBACkC0NOAgAA3AgAgCEEAKQLI04CAADcCCEEAIAhBCGo2AtDTgIAAQQAgBjYCzNOAgABBACAANgLI04CAAEEAQQA2AtTTgIAAIAhBJGohAwNAIANBBzYCACADQQRqIgMgBUkNAAsgCCAERg0DIAggCCgCBEF+cTYCBCAIIAggBGsiADYCACAEIABBAXI2AgQCQCAAQf8BSw0AIABBeHFBsNCAgABqIQMCQAJAQQAoAojQgIAAIgVBASAAQQN2dCIAcQ0AQQAgBSAAcjYCiNCAgAAgAyEFDAELIAMoAgghBQsgBSAENgIMIAMgBDYCCCAEIAM2AgwgBCAFNgIIDAQLQR8hAwJAIABB////B0sNACAAQQh2IgMgA0GA/j9qQRB2QQhxIgN0IgUgBUGA4B9qQRB2QQRxIgV0IgggCEGAgA9qQRB2QQJxIgh0QQ92IAMgBXIgCHJrIgNBAXQgACADQRVqdkEBcXJBHGohAwsgBCADNgIcIARCADcCECADQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiCEEBIAN0IgZxDQAgBSAENgIAQQAgCCAGcjYCjNCAgAAgBCAFNgIYIAQgBDYCCCAEIAQ2AgwMBAsgAEEAQRkgA0EBdmsgA0EfRht0IQMgBSgCACEIA0AgCCIFKAIEQXhxIABGDQMgA0EddiEIIANBAXQhAyAFIAhBBHFqQRBqIgYoAgAiCA0ACyAGIAQ2AgAgBCAFNgIYIAQgBDYCDCAEIAQ2AggMAwsgBSgCCCIDIAI2AgwgBSACNgIIIAJBADYCGCACIAU2AgwgAiADNgIICyALQQhqIQMMBQsgBSgCCCIDIAQ2AgwgBSAENgIIIARBADYCGCAEIAU2AgwgBCADNgIIC0EAKAKU0ICAACIDIAJNDQBBACgCoNCAgAAiBCACaiIFIAMgAmsiA0EBcjYCBEEAIAM2ApTQgIAAQQAgBTYCoNCAgAAgBCACQQNyNgIEIARBCGohAwwDC0EAIQNBAEEwNgL404CAAAwCCwJAIAtFDQACQAJAIAggCCgCHCIFQQJ0QbjSgIAAaiIDKAIARw0AIAMgADYCACAADQFBACAHQX4gBXdxIgc2AozQgIAADAILIAtBEEEUIAsoAhAgCEYbaiAANgIAIABFDQELIAAgCzYCGAJAIAgoAhAiA0UNACAAIAM2AhAgAyAANgIYCyAIQRRqKAIAIgNFDQAgAEEUaiADNgIAIAMgADYCGAsCQAJAIARBD0sNACAIIAQgAmoiA0EDcjYCBCAIIANqIgMgAygCBEEBcjYCBAwBCyAIIAJqIgAgBEEBcjYCBCAIIAJBA3I2AgQgACAEaiAENgIAAkAgBEH/AUsNACAEQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgBEEDdnQiBHENAEEAIAUgBHI2AojQgIAAIAMhBAwBCyADKAIIIQQLIAQgADYCDCADIAA2AgggACADNgIMIAAgBDYCCAwBC0EfIQMCQCAEQf///wdLDQAgBEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCICIAJBgIAPakEQdkECcSICdEEPdiADIAVyIAJyayIDQQF0IAQgA0EVanZBAXFyQRxqIQMLIAAgAzYCHCAAQgA3AhAgA0ECdEG40oCAAGohBQJAIAdBASADdCICcQ0AIAUgADYCAEEAIAcgAnI2AozQgIAAIAAgBTYCGCAAIAA2AgggACAANgIMDAELIARBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhAgJAA0AgAiIFKAIEQXhxIARGDQEgA0EddiECIANBAXQhAyAFIAJBBHFqQRBqIgYoAgAiAg0ACyAGIAA2AgAgACAFNgIYIAAgADYCDCAAIAA2AggMAQsgBSgCCCIDIAA2AgwgBSAANgIIIABBADYCGCAAIAU2AgwgACADNgIICyAIQQhqIQMMAQsCQCAKRQ0AAkACQCAAIAAoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAg2AgAgCA0BQQAgCUF+IAV3cTYCjNCAgAAMAgsgCkEQQRQgCigCECAARhtqIAg2AgAgCEUNAQsgCCAKNgIYAkAgACgCECIDRQ0AIAggAzYCECADIAg2AhgLIABBFGooAgAiA0UNACAIQRRqIAM2AgAgAyAINgIYCwJAAkAgBEEPSw0AIAAgBCACaiIDQQNyNgIEIAAgA2oiAyADKAIEQQFyNgIEDAELIAAgAmoiBSAEQQFyNgIEIAAgAkEDcjYCBCAFIARqIAQ2AgACQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhAwJAAkBBASAHQQN2dCIIIAZxDQBBACAIIAZyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAM2AgwgAiADNgIIIAMgAjYCDCADIAg2AggLQQAgBTYCnNCAgABBACAENgKQ0ICAAAsgAEEIaiEDCyABQRBqJICAgIAAIAMLCgAgABDJgICAAAviDQEHfwJAIABFDQAgAEF4aiIBIABBfGooAgAiAkF4cSIAaiEDAkAgAkEBcQ0AIAJBA3FFDQEgASABKAIAIgJrIgFBACgCmNCAgAAiBEkNASACIABqIQACQCABQQAoApzQgIAARg0AAkAgAkH/AUsNACABKAIIIgQgAkEDdiIFQQN0QbDQgIAAaiIGRhoCQCABKAIMIgIgBEcNAEEAQQAoAojQgIAAQX4gBXdxNgKI0ICAAAwDCyACIAZGGiACIAQ2AgggBCACNgIMDAILIAEoAhghBwJAAkAgASgCDCIGIAFGDQAgASgCCCICIARJGiAGIAI2AgggAiAGNgIMDAELAkAgAUEUaiICKAIAIgQNACABQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQECQAJAIAEgASgCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAwsgB0EQQRQgBygCECABRhtqIAY2AgAgBkUNAgsgBiAHNgIYAkAgASgCECICRQ0AIAYgAjYCECACIAY2AhgLIAEoAhQiAkUNASAGQRRqIAI2AgAgAiAGNgIYDAELIAMoAgQiAkEDcUEDRw0AIAMgAkF+cTYCBEEAIAA2ApDQgIAAIAEgAGogADYCACABIABBAXI2AgQPCyABIANPDQAgAygCBCICQQFxRQ0AAkACQCACQQJxDQACQCADQQAoAqDQgIAARw0AQQAgATYCoNCAgABBAEEAKAKU0ICAACAAaiIANgKU0ICAACABIABBAXI2AgQgAUEAKAKc0ICAAEcNA0EAQQA2ApDQgIAAQQBBADYCnNCAgAAPCwJAIANBACgCnNCAgABHDQBBACABNgKc0ICAAEEAQQAoApDQgIAAIABqIgA2ApDQgIAAIAEgAEEBcjYCBCABIABqIAA2AgAPCyACQXhxIABqIQACQAJAIAJB/wFLDQAgAygCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgAygCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAgsgAiAGRhogAiAENgIIIAQgAjYCDAwBCyADKAIYIQcCQAJAIAMoAgwiBiADRg0AIAMoAggiAkEAKAKY0ICAAEkaIAYgAjYCCCACIAY2AgwMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEGDAELA0AgAiEFIAQiBkEUaiICKAIAIgQNACAGQRBqIQIgBigCECIEDQALIAVBADYCAAsgB0UNAAJAAkAgAyADKAIcIgRBAnRBuNKAgABqIgIoAgBHDQAgAiAGNgIAIAYNAUEAQQAoAozQgIAAQX4gBHdxNgKM0ICAAAwCCyAHQRBBFCAHKAIQIANGG2ogBjYCACAGRQ0BCyAGIAc2AhgCQCADKAIQIgJFDQAgBiACNgIQIAIgBjYCGAsgAygCFCICRQ0AIAZBFGogAjYCACACIAY2AhgLIAEgAGogADYCACABIABBAXI2AgQgAUEAKAKc0ICAAEcNAUEAIAA2ApDQgIAADwsgAyACQX5xNgIEIAEgAGogADYCACABIABBAXI2AgQLAkAgAEH/AUsNACAAQXhxQbDQgIAAaiECAkACQEEAKAKI0ICAACIEQQEgAEEDdnQiAHENAEEAIAQgAHI2AojQgIAAIAIhAAwBCyACKAIIIQALIAAgATYCDCACIAE2AgggASACNgIMIAEgADYCCA8LQR8hAgJAIABB////B0sNACAAQQh2IgIgAkGA/j9qQRB2QQhxIgJ0IgQgBEGA4B9qQRB2QQRxIgR0IgYgBkGAgA9qQRB2QQJxIgZ0QQ92IAIgBHIgBnJrIgJBAXQgACACQRVqdkEBcXJBHGohAgsgASACNgIcIAFCADcCECACQQJ0QbjSgIAAaiEEAkACQEEAKAKM0ICAACIGQQEgAnQiA3ENACAEIAE2AgBBACAGIANyNgKM0ICAACABIAQ2AhggASABNgIIIAEgATYCDAwBCyAAQQBBGSACQQF2ayACQR9GG3QhAiAEKAIAIQYCQANAIAYiBCgCBEF4cSAARg0BIAJBHXYhBiACQQF0IQIgBCAGQQRxakEQaiIDKAIAIgYNAAsgAyABNgIAIAEgBDYCGCABIAE2AgwgASABNgIIDAELIAQoAggiACABNgIMIAQgATYCCCABQQA2AhggASAENgIMIAEgADYCCAtBAEEAKAKo0ICAAEF/aiIBQX8gARs2AqjQgIAACwsEAAAAC04AAkAgAA0APwBBEHQPCwJAIABB//8DcQ0AIABBf0wNAAJAIABBEHZAACIAQX9HDQBBAEEwNgL404CAAEF/DwsgAEEQdA8LEMqAgIAAAAvyAgIDfwF+AkAgAkUNACAAIAE6AAAgAiAAaiIDQX9qIAE6AAAgAkEDSQ0AIAAgAToAAiAAIAE6AAEgA0F9aiABOgAAIANBfmogAToAACACQQdJDQAgACABOgADIANBfGogAToAACACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiATYCACADIAIgBGtBfHEiBGoiAkF8aiABNgIAIARBCUkNACADIAE2AgggAyABNgIEIAJBeGogATYCACACQXRqIAE2AgAgBEEZSQ0AIAMgATYCGCADIAE2AhQgAyABNgIQIAMgATYCDCACQXBqIAE2AgAgAkFsaiABNgIAIAJBaGogATYCACACQWRqIAE2AgAgBCADQQRxQRhyIgVrIgJBIEkNACABrUKBgICAEH4hBiADIAVqIQEDQCABIAY3AxggASAGNwMQIAEgBjcDCCABIAY3AwAgAUEgaiEBIAJBYGoiAkEfSw0ACwsgAAsLjkgBAEGACAuGSAEAAAACAAAAAwAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAYAAAAHAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=='\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.enumToMap = void 0;\nfunction enumToMap(obj) {\n const res = {};\n Object.keys(obj).forEach((key) => {\n const value = obj[key];\n if (typeof value === 'number') {\n res[key] = value;\n }\n });\n return res;\n}\nexports.enumToMap = enumToMap;\n//# sourceMappingURL=utils.js.map","'use strict'\n\nconst { kClients } = require('../core/symbols')\nconst Agent = require('../agent')\nconst {\n kAgent,\n kMockAgentSet,\n kMockAgentGet,\n kDispatches,\n kIsMockActive,\n kNetConnect,\n kGetNetConnect,\n kOptions,\n kFactory\n} = require('./mock-symbols')\nconst MockClient = require('./mock-client')\nconst MockPool = require('./mock-pool')\nconst { matchValue, buildMockOptions } = require('./mock-utils')\nconst { InvalidArgumentError, UndiciError } = require('../core/errors')\nconst Dispatcher = require('../dispatcher')\nconst Pluralizer = require('./pluralizer')\nconst PendingInterceptorsFormatter = require('./pending-interceptors-formatter')\n\nclass FakeWeakRef {\n constructor (value) {\n this.value = value\n }\n\n deref () {\n return this.value\n }\n}\n\nclass MockAgent extends Dispatcher {\n constructor (opts) {\n super(opts)\n\n this[kNetConnect] = true\n this[kIsMockActive] = true\n\n // Instantiate Agent and encapsulate\n if ((opts && opts.agent && typeof opts.agent.dispatch !== 'function')) {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n const agent = opts && opts.agent ? opts.agent : new Agent(opts)\n this[kAgent] = agent\n\n this[kClients] = agent[kClients]\n this[kOptions] = buildMockOptions(opts)\n }\n\n get (origin) {\n let dispatcher = this[kMockAgentGet](origin)\n\n if (!dispatcher) {\n dispatcher = this[kFactory](origin)\n this[kMockAgentSet](origin, dispatcher)\n }\n return dispatcher\n }\n\n dispatch (opts, handler) {\n // Call MockAgent.get to perform additional setup before dispatching as normal\n this.get(opts.origin)\n return this[kAgent].dispatch(opts, handler)\n }\n\n async close () {\n await this[kAgent].close()\n this[kClients].clear()\n }\n\n deactivate () {\n this[kIsMockActive] = false\n }\n\n activate () {\n this[kIsMockActive] = true\n }\n\n enableNetConnect (matcher) {\n if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) {\n if (Array.isArray(this[kNetConnect])) {\n this[kNetConnect].push(matcher)\n } else {\n this[kNetConnect] = [matcher]\n }\n } else if (typeof matcher === 'undefined') {\n this[kNetConnect] = true\n } else {\n throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.')\n }\n }\n\n disableNetConnect () {\n this[kNetConnect] = false\n }\n\n // This is required to bypass issues caused by using global symbols - see:\n // https://github.com/nodejs/undici/issues/1447\n get isMockActive () {\n return this[kIsMockActive]\n }\n\n [kMockAgentSet] (origin, dispatcher) {\n this[kClients].set(origin, new FakeWeakRef(dispatcher))\n }\n\n [kFactory] (origin) {\n const mockOptions = Object.assign({ agent: this }, this[kOptions])\n return this[kOptions] && this[kOptions].connections === 1\n ? new MockClient(origin, mockOptions)\n : new MockPool(origin, mockOptions)\n }\n\n [kMockAgentGet] (origin) {\n // First check if we can immediately find it\n const ref = this[kClients].get(origin)\n if (ref) {\n return ref.deref()\n }\n\n // If the origin is not a string create a dummy parent pool and return to user\n if (typeof origin !== 'string') {\n const dispatcher = this[kFactory]('http://localhost:9999')\n this[kMockAgentSet](origin, dispatcher)\n return dispatcher\n }\n\n // If we match, create a pool and assign the same dispatches\n for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) {\n const nonExplicitDispatcher = nonExplicitRef.deref()\n if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) {\n const dispatcher = this[kFactory](origin)\n this[kMockAgentSet](origin, dispatcher)\n dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches]\n return dispatcher\n }\n }\n }\n\n [kGetNetConnect] () {\n return this[kNetConnect]\n }\n\n pendingInterceptors () {\n const mockAgentClients = this[kClients]\n\n return Array.from(mockAgentClients.entries())\n .flatMap(([origin, scope]) => scope.deref()[kDispatches].map(dispatch => ({ ...dispatch, origin })))\n .filter(({ pending }) => pending)\n }\n\n assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) {\n const pending = this.pendingInterceptors()\n\n if (pending.length === 0) {\n return\n }\n\n const pluralizer = new Pluralizer('interceptor', 'interceptors').pluralize(pending.length)\n\n throw new UndiciError(`\n${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending:\n\n${pendingInterceptorsFormatter.format(pending)}\n`.trim())\n }\n}\n\nmodule.exports = MockAgent\n","'use strict'\n\nconst { promisify } = require('util')\nconst Client = require('../client')\nconst { buildMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kMockAgent,\n kClose,\n kOriginalClose,\n kOrigin,\n kOriginalDispatch,\n kConnected\n} = require('./mock-symbols')\nconst { MockInterceptor } = require('./mock-interceptor')\nconst Symbols = require('../core/symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\n/**\n * MockClient provides an API that extends the Client to influence the mockDispatches.\n */\nclass MockClient extends Client {\n constructor (origin, opts) {\n super(origin, opts)\n\n if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n\n this[kMockAgent] = opts.agent\n this[kOrigin] = origin\n this[kDispatches] = []\n this[kConnected] = 1\n this[kOriginalDispatch] = this.dispatch\n this[kOriginalClose] = this.close.bind(this)\n\n this.dispatch = buildMockDispatch.call(this)\n this.close = this[kClose]\n }\n\n get [Symbols.kConnected] () {\n return this[kConnected]\n }\n\n /**\n * Sets up the base interceptor for mocking replies from undici.\n */\n intercept (opts) {\n return new MockInterceptor(opts, this[kDispatches])\n }\n\n async [kClose] () {\n await promisify(this[kOriginalClose])()\n this[kConnected] = 0\n this[kMockAgent][Symbols.kClients].delete(this[kOrigin])\n }\n}\n\nmodule.exports = MockClient\n","'use strict'\n\nconst { UndiciError } = require('../core/errors')\n\nclass MockNotMatchedError extends UndiciError {\n constructor (message) {\n super(message)\n Error.captureStackTrace(this, MockNotMatchedError)\n this.name = 'MockNotMatchedError'\n this.message = message || 'The request does not match any registered mock dispatches'\n this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'\n }\n}\n\nmodule.exports = {\n MockNotMatchedError\n}\n","'use strict'\n\nconst { getResponseData, buildKey, addMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kDispatchKey,\n kDefaultHeaders,\n kDefaultTrailers,\n kContentLength,\n kMockDispatch\n} = require('./mock-symbols')\nconst { InvalidArgumentError } = require('../core/errors')\nconst { buildURL } = require('../core/util')\n\n/**\n * Defines the scope API for an interceptor reply\n */\nclass MockScope {\n constructor (mockDispatch) {\n this[kMockDispatch] = mockDispatch\n }\n\n /**\n * Delay a reply by a set amount in ms.\n */\n delay (waitInMs) {\n if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) {\n throw new InvalidArgumentError('waitInMs must be a valid integer > 0')\n }\n\n this[kMockDispatch].delay = waitInMs\n return this\n }\n\n /**\n * For a defined reply, never mark as consumed.\n */\n persist () {\n this[kMockDispatch].persist = true\n return this\n }\n\n /**\n * Allow one to define a reply for a set amount of matching requests.\n */\n times (repeatTimes) {\n if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) {\n throw new InvalidArgumentError('repeatTimes must be a valid integer > 0')\n }\n\n this[kMockDispatch].times = repeatTimes\n return this\n }\n}\n\n/**\n * Defines an interceptor for a Mock\n */\nclass MockInterceptor {\n constructor (opts, mockDispatches) {\n if (typeof opts !== 'object') {\n throw new InvalidArgumentError('opts must be an object')\n }\n if (typeof opts.path === 'undefined') {\n throw new InvalidArgumentError('opts.path must be defined')\n }\n if (typeof opts.method === 'undefined') {\n opts.method = 'GET'\n }\n // See https://github.com/nodejs/undici/issues/1245\n // As per RFC 3986, clients are not supposed to send URI\n // fragments to servers when they retrieve a document,\n if (typeof opts.path === 'string') {\n if (opts.query) {\n opts.path = buildURL(opts.path, opts.query)\n } else {\n // Matches https://github.com/nodejs/undici/blob/main/lib/fetch/index.js#L1811\n const parsedURL = new URL(opts.path, 'data://')\n opts.path = parsedURL.pathname + parsedURL.search\n }\n }\n if (typeof opts.method === 'string') {\n opts.method = opts.method.toUpperCase()\n }\n\n this[kDispatchKey] = buildKey(opts)\n this[kDispatches] = mockDispatches\n this[kDefaultHeaders] = {}\n this[kDefaultTrailers] = {}\n this[kContentLength] = false\n }\n\n createMockScopeDispatchData (statusCode, data, responseOptions = {}) {\n const responseData = getResponseData(data)\n const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {}\n const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }\n const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }\n\n return { statusCode, data, headers, trailers }\n }\n\n validateReplyParameters (statusCode, data, responseOptions) {\n if (typeof statusCode === 'undefined') {\n throw new InvalidArgumentError('statusCode must be defined')\n }\n if (typeof data === 'undefined') {\n throw new InvalidArgumentError('data must be defined')\n }\n if (typeof responseOptions !== 'object') {\n throw new InvalidArgumentError('responseOptions must be an object')\n }\n }\n\n /**\n * Mock an undici request with a defined reply.\n */\n reply (replyData) {\n // Values of reply aren't available right now as they\n // can only be available when the reply callback is invoked.\n if (typeof replyData === 'function') {\n // We'll first wrap the provided callback in another function,\n // this function will properly resolve the data from the callback\n // when invoked.\n const wrappedDefaultsCallback = (opts) => {\n // Our reply options callback contains the parameter for statusCode, data and options.\n const resolvedData = replyData(opts)\n\n // Check if it is in the right format\n if (typeof resolvedData !== 'object') {\n throw new InvalidArgumentError('reply options callback must return an object')\n }\n\n const { statusCode, data = '', responseOptions = {} } = resolvedData\n this.validateReplyParameters(statusCode, data, responseOptions)\n // Since the values can be obtained immediately we return them\n // from this higher order function that will be resolved later.\n return {\n ...this.createMockScopeDispatchData(statusCode, data, responseOptions)\n }\n }\n\n // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data.\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback)\n return new MockScope(newMockDispatch)\n }\n\n // We can have either one or three parameters, if we get here,\n // we should have 1-3 parameters. So we spread the arguments of\n // this function to obtain the parameters, since replyData will always\n // just be the statusCode.\n const [statusCode, data = '', responseOptions = {}] = [...arguments]\n this.validateReplyParameters(statusCode, data, responseOptions)\n\n // Send in-already provided data like usual\n const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions)\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData)\n return new MockScope(newMockDispatch)\n }\n\n /**\n * Mock an undici request with a defined error.\n */\n replyWithError (error) {\n if (typeof error === 'undefined') {\n throw new InvalidArgumentError('error must be defined')\n }\n\n const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error })\n return new MockScope(newMockDispatch)\n }\n\n /**\n * Set default reply headers on the interceptor for subsequent replies\n */\n defaultReplyHeaders (headers) {\n if (typeof headers === 'undefined') {\n throw new InvalidArgumentError('headers must be defined')\n }\n\n this[kDefaultHeaders] = headers\n return this\n }\n\n /**\n * Set default reply trailers on the interceptor for subsequent replies\n */\n defaultReplyTrailers (trailers) {\n if (typeof trailers === 'undefined') {\n throw new InvalidArgumentError('trailers must be defined')\n }\n\n this[kDefaultTrailers] = trailers\n return this\n }\n\n /**\n * Set reply content length header for replies on the interceptor\n */\n replyContentLength () {\n this[kContentLength] = true\n return this\n }\n}\n\nmodule.exports.MockInterceptor = MockInterceptor\nmodule.exports.MockScope = MockScope\n","'use strict'\n\nconst { promisify } = require('util')\nconst Pool = require('../pool')\nconst { buildMockDispatch } = require('./mock-utils')\nconst {\n kDispatches,\n kMockAgent,\n kClose,\n kOriginalClose,\n kOrigin,\n kOriginalDispatch,\n kConnected\n} = require('./mock-symbols')\nconst { MockInterceptor } = require('./mock-interceptor')\nconst Symbols = require('../core/symbols')\nconst { InvalidArgumentError } = require('../core/errors')\n\n/**\n * MockPool provides an API that extends the Pool to influence the mockDispatches.\n */\nclass MockPool extends Pool {\n constructor (origin, opts) {\n super(origin, opts)\n\n if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {\n throw new InvalidArgumentError('Argument opts.agent must implement Agent')\n }\n\n this[kMockAgent] = opts.agent\n this[kOrigin] = origin\n this[kDispatches] = []\n this[kConnected] = 1\n this[kOriginalDispatch] = this.dispatch\n this[kOriginalClose] = this.close.bind(this)\n\n this.dispatch = buildMockDispatch.call(this)\n this.close = this[kClose]\n }\n\n get [Symbols.kConnected] () {\n return this[kConnected]\n }\n\n /**\n * Sets up the base interceptor for mocking replies from undici.\n */\n intercept (opts) {\n return new MockInterceptor(opts, this[kDispatches])\n }\n\n async [kClose] () {\n await promisify(this[kOriginalClose])()\n this[kConnected] = 0\n this[kMockAgent][Symbols.kClients].delete(this[kOrigin])\n }\n}\n\nmodule.exports = MockPool\n","'use strict'\n\nmodule.exports = {\n kAgent: Symbol('agent'),\n kOptions: Symbol('options'),\n kFactory: Symbol('factory'),\n kDispatches: Symbol('dispatches'),\n kDispatchKey: Symbol('dispatch key'),\n kDefaultHeaders: Symbol('default headers'),\n kDefaultTrailers: Symbol('default trailers'),\n kContentLength: Symbol('content length'),\n kMockAgent: Symbol('mock agent'),\n kMockAgentSet: Symbol('mock agent set'),\n kMockAgentGet: Symbol('mock agent get'),\n kMockDispatch: Symbol('mock dispatch'),\n kClose: Symbol('close'),\n kOriginalClose: Symbol('original agent close'),\n kOrigin: Symbol('origin'),\n kIsMockActive: Symbol('is mock active'),\n kNetConnect: Symbol('net connect'),\n kGetNetConnect: Symbol('get net connect'),\n kConnected: Symbol('connected')\n}\n","'use strict'\n\nconst { MockNotMatchedError } = require('./mock-errors')\nconst {\n kDispatches,\n kMockAgent,\n kOriginalDispatch,\n kOrigin,\n kGetNetConnect\n} = require('./mock-symbols')\nconst { buildURL, nop } = require('../core/util')\nconst { STATUS_CODES } = require('http')\nconst {\n types: {\n isPromise\n }\n} = require('util')\n\nfunction matchValue (match, value) {\n if (typeof match === 'string') {\n return match === value\n }\n if (match instanceof RegExp) {\n return match.test(value)\n }\n if (typeof match === 'function') {\n return match(value) === true\n }\n return false\n}\n\nfunction lowerCaseEntries (headers) {\n return Object.fromEntries(\n Object.entries(headers).map(([headerName, headerValue]) => {\n return [headerName.toLocaleLowerCase(), headerValue]\n })\n )\n}\n\n/**\n * @param {import('../../index').Headers|string[]|Record} headers\n * @param {string} key\n */\nfunction getHeaderByName (headers, key) {\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i += 2) {\n if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) {\n return headers[i + 1]\n }\n }\n\n return undefined\n } else if (typeof headers.get === 'function') {\n return headers.get(key)\n } else {\n return lowerCaseEntries(headers)[key.toLocaleLowerCase()]\n }\n}\n\n/** @param {string[]} headers */\nfunction buildHeadersFromArray (headers) { // fetch HeadersList\n const clone = headers.slice()\n const entries = []\n for (let index = 0; index < clone.length; index += 2) {\n entries.push([clone[index], clone[index + 1]])\n }\n return Object.fromEntries(entries)\n}\n\nfunction matchHeaders (mockDispatch, headers) {\n if (typeof mockDispatch.headers === 'function') {\n if (Array.isArray(headers)) { // fetch HeadersList\n headers = buildHeadersFromArray(headers)\n }\n return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {})\n }\n if (typeof mockDispatch.headers === 'undefined') {\n return true\n }\n if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') {\n return false\n }\n\n for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) {\n const headerValue = getHeaderByName(headers, matchHeaderName)\n\n if (!matchValue(matchHeaderValue, headerValue)) {\n return false\n }\n }\n return true\n}\n\nfunction safeUrl (path) {\n if (typeof path !== 'string') {\n return path\n }\n\n const pathSegments = path.split('?')\n\n if (pathSegments.length !== 2) {\n return path\n }\n\n const qp = new URLSearchParams(pathSegments.pop())\n qp.sort()\n return [...pathSegments, qp.toString()].join('?')\n}\n\nfunction matchKey (mockDispatch, { path, method, body, headers }) {\n const pathMatch = matchValue(mockDispatch.path, path)\n const methodMatch = matchValue(mockDispatch.method, method)\n const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true\n const headersMatch = matchHeaders(mockDispatch, headers)\n return pathMatch && methodMatch && bodyMatch && headersMatch\n}\n\nfunction getResponseData (data) {\n if (Buffer.isBuffer(data)) {\n return data\n } else if (typeof data === 'object') {\n return JSON.stringify(data)\n } else {\n return data.toString()\n }\n}\n\nfunction getMockDispatch (mockDispatches, key) {\n const basePath = key.query ? buildURL(key.path, key.query) : key.path\n const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath\n\n // Match path\n let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath))\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`)\n }\n\n // Match method\n matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method))\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`)\n }\n\n // Match body\n matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true)\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`)\n }\n\n // Match headers\n matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers))\n if (matchedMockDispatches.length === 0) {\n throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers}'`)\n }\n\n return matchedMockDispatches[0]\n}\n\nfunction addMockDispatch (mockDispatches, key, data) {\n const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false }\n const replyData = typeof data === 'function' ? { callback: data } : { ...data }\n const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }\n mockDispatches.push(newMockDispatch)\n return newMockDispatch\n}\n\nfunction deleteMockDispatch (mockDispatches, key) {\n const index = mockDispatches.findIndex(dispatch => {\n if (!dispatch.consumed) {\n return false\n }\n return matchKey(dispatch, key)\n })\n if (index !== -1) {\n mockDispatches.splice(index, 1)\n }\n}\n\nfunction buildKey (opts) {\n const { path, method, body, headers, query } = opts\n return {\n path,\n method,\n body,\n headers,\n query\n }\n}\n\nfunction generateKeyValues (data) {\n return Object.entries(data).reduce((keyValuePairs, [key, value]) => [\n ...keyValuePairs,\n Buffer.from(`${key}`),\n Array.isArray(value) ? value.map(x => Buffer.from(`${x}`)) : Buffer.from(`${value}`)\n ], [])\n}\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status\n * @param {number} statusCode\n */\nfunction getStatusText (statusCode) {\n return STATUS_CODES[statusCode] || 'unknown'\n}\n\nasync function getResponse (body) {\n const buffers = []\n for await (const data of body) {\n buffers.push(data)\n }\n return Buffer.concat(buffers).toString('utf8')\n}\n\n/**\n * Mock dispatch function used to simulate undici dispatches\n */\nfunction mockDispatch (opts, handler) {\n // Get mock dispatch from built key\n const key = buildKey(opts)\n const mockDispatch = getMockDispatch(this[kDispatches], key)\n\n mockDispatch.timesInvoked++\n\n // Here's where we resolve a callback if a callback is present for the dispatch data.\n if (mockDispatch.data.callback) {\n mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) }\n }\n\n // Parse mockDispatch data\n const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch\n const { timesInvoked, times } = mockDispatch\n\n // If it's used up and not persistent, mark as consumed\n mockDispatch.consumed = !persist && timesInvoked >= times\n mockDispatch.pending = timesInvoked < times\n\n // If specified, trigger dispatch error\n if (error !== null) {\n deleteMockDispatch(this[kDispatches], key)\n handler.onError(error)\n return true\n }\n\n // Handle the request with a delay if necessary\n if (typeof delay === 'number' && delay > 0) {\n setTimeout(() => {\n handleReply(this[kDispatches])\n }, delay)\n } else {\n handleReply(this[kDispatches])\n }\n\n function handleReply (mockDispatches, _data = data) {\n // fetch's HeadersList is a 1D string array\n const optsHeaders = Array.isArray(opts.headers)\n ? buildHeadersFromArray(opts.headers)\n : opts.headers\n const body = typeof _data === 'function'\n ? _data({ ...opts, headers: optsHeaders })\n : _data\n\n // util.types.isPromise is likely needed for jest.\n if (isPromise(body)) {\n // If handleReply is asynchronous, throwing an error\n // in the callback will reject the promise, rather than\n // synchronously throw the error, which breaks some tests.\n // Rather, we wait for the callback to resolve if it is a\n // promise, and then re-run handleReply with the new body.\n body.then((newData) => handleReply(mockDispatches, newData))\n return\n }\n\n const responseData = getResponseData(body)\n const responseHeaders = generateKeyValues(headers)\n const responseTrailers = generateKeyValues(trailers)\n\n handler.abort = nop\n handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode))\n handler.onData(Buffer.from(responseData))\n handler.onComplete(responseTrailers)\n deleteMockDispatch(mockDispatches, key)\n }\n\n function resume () {}\n\n return true\n}\n\nfunction buildMockDispatch () {\n const agent = this[kMockAgent]\n const origin = this[kOrigin]\n const originalDispatch = this[kOriginalDispatch]\n\n return function dispatch (opts, handler) {\n if (agent.isMockActive) {\n try {\n mockDispatch.call(this, opts, handler)\n } catch (error) {\n if (error instanceof MockNotMatchedError) {\n const netConnect = agent[kGetNetConnect]()\n if (netConnect === false) {\n throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`)\n }\n if (checkNetConnect(netConnect, origin)) {\n originalDispatch.call(this, opts, handler)\n } else {\n throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`)\n }\n } else {\n throw error\n }\n }\n } else {\n originalDispatch.call(this, opts, handler)\n }\n }\n}\n\nfunction checkNetConnect (netConnect, origin) {\n const url = new URL(origin)\n if (netConnect === true) {\n return true\n } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) {\n return true\n }\n return false\n}\n\nfunction buildMockOptions (opts) {\n if (opts) {\n const { agent, ...mockOptions } = opts\n return mockOptions\n }\n}\n\nmodule.exports = {\n getResponseData,\n getMockDispatch,\n addMockDispatch,\n deleteMockDispatch,\n buildKey,\n generateKeyValues,\n matchValue,\n getResponse,\n getStatusText,\n mockDispatch,\n buildMockDispatch,\n checkNetConnect,\n buildMockOptions,\n getHeaderByName\n}\n","'use strict'\n\nconst { Transform } = require('stream')\nconst { Console } = require('console')\n\n/**\n * Gets the output of `console.table(…)` as a string.\n */\nmodule.exports = class PendingInterceptorsFormatter {\n constructor ({ disableColors } = {}) {\n this.transform = new Transform({\n transform (chunk, _enc, cb) {\n cb(null, chunk)\n }\n })\n\n this.logger = new Console({\n stdout: this.transform,\n inspectOptions: {\n colors: !disableColors && !process.env.CI\n }\n })\n }\n\n format (pendingInterceptors) {\n const withPrettyHeaders = pendingInterceptors.map(\n ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({\n Method: method,\n Origin: origin,\n Path: path,\n 'Status code': statusCode,\n Persistent: persist ? '✅' : '❌',\n Invocations: timesInvoked,\n Remaining: persist ? Infinity : times - timesInvoked\n }))\n\n this.logger.table(withPrettyHeaders)\n return this.transform.read().toString()\n }\n}\n","'use strict'\n\nconst singulars = {\n pronoun: 'it',\n is: 'is',\n was: 'was',\n this: 'this'\n}\n\nconst plurals = {\n pronoun: 'they',\n is: 'are',\n was: 'were',\n this: 'these'\n}\n\nmodule.exports = class Pluralizer {\n constructor (singular, plural) {\n this.singular = singular\n this.plural = plural\n }\n\n pluralize (count) {\n const one = count === 1\n const keys = one ? singulars : plurals\n const noun = one ? this.singular : this.plural\n return { ...keys, count, noun }\n }\n}\n","/* eslint-disable */\n\n'use strict'\n\n// Extracted from node/lib/internal/fixed_queue.js\n\n// Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two.\nconst kSize = 2048;\nconst kMask = kSize - 1;\n\n// The FixedQueue is implemented as a singly-linked list of fixed-size\n// circular buffers. It looks something like this:\n//\n// head tail\n// | |\n// v v\n// +-----------+ <-----\\ +-----------+ <------\\ +-----------+\n// | [null] | \\----- | next | \\------- | next |\n// +-----------+ +-----------+ +-----------+\n// | item | <-- bottom | item | <-- bottom | [empty] |\n// | item | | item | | [empty] |\n// | item | | item | | [empty] |\n// | item | | item | | [empty] |\n// | item | | item | bottom --> | item |\n// | item | | item | | item |\n// | ... | | ... | | ... |\n// | item | | item | | item |\n// | item | | item | | item |\n// | [empty] | <-- top | item | | item |\n// | [empty] | | item | | item |\n// | [empty] | | [empty] | <-- top top --> | [empty] |\n// +-----------+ +-----------+ +-----------+\n//\n// Or, if there is only one circular buffer, it looks something\n// like either of these:\n//\n// head tail head tail\n// | | | |\n// v v v v\n// +-----------+ +-----------+\n// | [null] | | [null] |\n// +-----------+ +-----------+\n// | [empty] | | item |\n// | [empty] | | item |\n// | item | <-- bottom top --> | [empty] |\n// | item | | [empty] |\n// | [empty] | <-- top bottom --> | item |\n// | [empty] | | item |\n// +-----------+ +-----------+\n//\n// Adding a value means moving `top` forward by one, removing means\n// moving `bottom` forward by one. After reaching the end, the queue\n// wraps around.\n//\n// When `top === bottom` the current queue is empty and when\n// `top + 1 === bottom` it's full. This wastes a single space of storage\n// but allows much quicker checks.\n\nclass FixedCircularBuffer {\n constructor() {\n this.bottom = 0;\n this.top = 0;\n this.list = new Array(kSize);\n this.next = null;\n }\n\n isEmpty() {\n return this.top === this.bottom;\n }\n\n isFull() {\n return ((this.top + 1) & kMask) === this.bottom;\n }\n\n push(data) {\n this.list[this.top] = data;\n this.top = (this.top + 1) & kMask;\n }\n\n shift() {\n const nextItem = this.list[this.bottom];\n if (nextItem === undefined)\n return null;\n this.list[this.bottom] = undefined;\n this.bottom = (this.bottom + 1) & kMask;\n return nextItem;\n }\n}\n\nmodule.exports = class FixedQueue {\n constructor() {\n this.head = this.tail = new FixedCircularBuffer();\n }\n\n isEmpty() {\n return this.head.isEmpty();\n }\n\n push(data) {\n if (this.head.isFull()) {\n // Head is full: Creates a new queue, sets the old queue's `.next` to it,\n // and sets it as the new main queue.\n this.head = this.head.next = new FixedCircularBuffer();\n }\n this.head.push(data);\n }\n\n shift() {\n const tail = this.tail;\n const next = tail.shift();\n if (tail.isEmpty() && tail.next !== null) {\n // If there is another queue, it forms the new tail.\n this.tail = tail.next;\n }\n return next;\n }\n};\n","'use strict'\n\nconst DispatcherBase = require('./dispatcher-base')\nconst FixedQueue = require('./node/fixed-queue')\nconst { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require('./core/symbols')\nconst PoolStats = require('./pool-stats')\n\nconst kClients = Symbol('clients')\nconst kNeedDrain = Symbol('needDrain')\nconst kQueue = Symbol('queue')\nconst kClosedResolve = Symbol('closed resolve')\nconst kOnDrain = Symbol('onDrain')\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kGetDispatcher = Symbol('get dispatcher')\nconst kAddClient = Symbol('add client')\nconst kRemoveClient = Symbol('remove client')\nconst kStats = Symbol('stats')\n\nclass PoolBase extends DispatcherBase {\n constructor () {\n super()\n\n this[kQueue] = new FixedQueue()\n this[kClients] = []\n this[kQueued] = 0\n\n const pool = this\n\n this[kOnDrain] = function onDrain (origin, targets) {\n const queue = pool[kQueue]\n\n let needDrain = false\n\n while (!needDrain) {\n const item = queue.shift()\n if (!item) {\n break\n }\n pool[kQueued]--\n needDrain = !this.dispatch(item.opts, item.handler)\n }\n\n this[kNeedDrain] = needDrain\n\n if (!this[kNeedDrain] && pool[kNeedDrain]) {\n pool[kNeedDrain] = false\n pool.emit('drain', origin, [pool, ...targets])\n }\n\n if (pool[kClosedResolve] && queue.isEmpty()) {\n Promise\n .all(pool[kClients].map(c => c.close()))\n .then(pool[kClosedResolve])\n }\n }\n\n this[kOnConnect] = (origin, targets) => {\n pool.emit('connect', origin, [pool, ...targets])\n }\n\n this[kOnDisconnect] = (origin, targets, err) => {\n pool.emit('disconnect', origin, [pool, ...targets], err)\n }\n\n this[kOnConnectionError] = (origin, targets, err) => {\n pool.emit('connectionError', origin, [pool, ...targets], err)\n }\n\n this[kStats] = new PoolStats(this)\n }\n\n get [kBusy] () {\n return this[kNeedDrain]\n }\n\n get [kConnected] () {\n return this[kClients].filter(client => client[kConnected]).length\n }\n\n get [kFree] () {\n return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length\n }\n\n get [kPending] () {\n let ret = this[kQueued]\n for (const { [kPending]: pending } of this[kClients]) {\n ret += pending\n }\n return ret\n }\n\n get [kRunning] () {\n let ret = 0\n for (const { [kRunning]: running } of this[kClients]) {\n ret += running\n }\n return ret\n }\n\n get [kSize] () {\n let ret = this[kQueued]\n for (const { [kSize]: size } of this[kClients]) {\n ret += size\n }\n return ret\n }\n\n get stats () {\n return this[kStats]\n }\n\n async [kClose] () {\n if (this[kQueue].isEmpty()) {\n return Promise.all(this[kClients].map(c => c.close()))\n } else {\n return new Promise((resolve) => {\n this[kClosedResolve] = resolve\n })\n }\n }\n\n async [kDestroy] (err) {\n while (true) {\n const item = this[kQueue].shift()\n if (!item) {\n break\n }\n item.handler.onError(err)\n }\n\n return Promise.all(this[kClients].map(c => c.destroy(err)))\n }\n\n [kDispatch] (opts, handler) {\n const dispatcher = this[kGetDispatcher]()\n\n if (!dispatcher) {\n this[kNeedDrain] = true\n this[kQueue].push({ opts, handler })\n this[kQueued]++\n } else if (!dispatcher.dispatch(opts, handler)) {\n dispatcher[kNeedDrain] = true\n this[kNeedDrain] = !this[kGetDispatcher]()\n }\n\n return !this[kNeedDrain]\n }\n\n [kAddClient] (client) {\n client\n .on('drain', this[kOnDrain])\n .on('connect', this[kOnConnect])\n .on('disconnect', this[kOnDisconnect])\n .on('connectionError', this[kOnConnectionError])\n\n this[kClients].push(client)\n\n if (this[kNeedDrain]) {\n process.nextTick(() => {\n if (this[kNeedDrain]) {\n this[kOnDrain](client[kUrl], [this, client])\n }\n })\n }\n\n return this\n }\n\n [kRemoveClient] (client) {\n client.close(() => {\n const idx = this[kClients].indexOf(client)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n })\n\n this[kNeedDrain] = this[kClients].some(dispatcher => (\n !dispatcher[kNeedDrain] &&\n dispatcher.closed !== true &&\n dispatcher.destroyed !== true\n ))\n }\n}\n\nmodule.exports = {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kRemoveClient,\n kGetDispatcher\n}\n","const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require('./core/symbols')\nconst kPool = Symbol('pool')\n\nclass PoolStats {\n constructor (pool) {\n this[kPool] = pool\n }\n\n get connected () {\n return this[kPool][kConnected]\n }\n\n get free () {\n return this[kPool][kFree]\n }\n\n get pending () {\n return this[kPool][kPending]\n }\n\n get queued () {\n return this[kPool][kQueued]\n }\n\n get running () {\n return this[kPool][kRunning]\n }\n\n get size () {\n return this[kPool][kSize]\n }\n}\n\nmodule.exports = PoolStats\n","'use strict'\n\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kGetDispatcher\n} = require('./pool-base')\nconst Client = require('./client')\nconst {\n InvalidArgumentError\n} = require('./core/errors')\nconst util = require('./core/util')\nconst { kUrl, kInterceptors } = require('./core/symbols')\nconst buildConnector = require('./core/connect')\n\nconst kOptions = Symbol('options')\nconst kConnections = Symbol('connections')\nconst kFactory = Symbol('factory')\n\nfunction defaultFactory (origin, opts) {\n return new Client(origin, opts)\n}\n\nclass Pool extends PoolBase {\n constructor (origin, {\n connections,\n factory = defaultFactory,\n connect,\n connectTimeout,\n tls,\n maxCachedSessions,\n socketPath,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n allowH2,\n ...options\n } = {}) {\n super()\n\n if (connections != null && (!Number.isFinite(connections) || connections < 0)) {\n throw new InvalidArgumentError('invalid connections')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n socketPath,\n timeout: connectTimeout,\n ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n }\n\n this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool)\n ? options.interceptors.Pool\n : []\n this[kConnections] = connections || null\n this[kUrl] = util.parseOrigin(origin)\n this[kOptions] = { ...util.deepClone(options), connect, allowH2 }\n this[kOptions].interceptors = options.interceptors\n ? { ...options.interceptors }\n : undefined\n this[kFactory] = factory\n }\n\n [kGetDispatcher] () {\n let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain])\n\n if (dispatcher) {\n return dispatcher\n }\n\n if (!this[kConnections] || this[kClients].length < this[kConnections]) {\n dispatcher = this[kFactory](this[kUrl], this[kOptions])\n this[kAddClient](dispatcher)\n }\n\n return dispatcher\n }\n}\n\nmodule.exports = Pool\n","'use strict'\n\nconst { kProxy, kClose, kDestroy, kInterceptors } = require('./core/symbols')\nconst { URL } = require('url')\nconst Agent = require('./agent')\nconst Pool = require('./pool')\nconst DispatcherBase = require('./dispatcher-base')\nconst { InvalidArgumentError, RequestAbortedError } = require('./core/errors')\nconst buildConnector = require('./core/connect')\n\nconst kAgent = Symbol('proxy agent')\nconst kClient = Symbol('proxy client')\nconst kProxyHeaders = Symbol('proxy headers')\nconst kRequestTls = Symbol('request tls settings')\nconst kProxyTls = Symbol('proxy tls settings')\nconst kConnectEndpoint = Symbol('connect endpoint function')\n\nfunction defaultProtocolPort (protocol) {\n return protocol === 'https:' ? 443 : 80\n}\n\nfunction buildProxyOptions (opts) {\n if (typeof opts === 'string') {\n opts = { uri: opts }\n }\n\n if (!opts || !opts.uri) {\n throw new InvalidArgumentError('Proxy opts.uri is mandatory')\n }\n\n return {\n uri: opts.uri,\n protocol: opts.protocol || 'https'\n }\n}\n\nfunction defaultFactory (origin, opts) {\n return new Pool(origin, opts)\n}\n\nclass ProxyAgent extends DispatcherBase {\n constructor (opts) {\n super(opts)\n this[kProxy] = buildProxyOptions(opts)\n this[kAgent] = new Agent(opts)\n this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent)\n ? opts.interceptors.ProxyAgent\n : []\n\n if (typeof opts === 'string') {\n opts = { uri: opts }\n }\n\n if (!opts || !opts.uri) {\n throw new InvalidArgumentError('Proxy opts.uri is mandatory')\n }\n\n const { clientFactory = defaultFactory } = opts\n\n if (typeof clientFactory !== 'function') {\n throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')\n }\n\n this[kRequestTls] = opts.requestTls\n this[kProxyTls] = opts.proxyTls\n this[kProxyHeaders] = opts.headers || {}\n\n if (opts.auth && opts.token) {\n throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')\n } else if (opts.auth) {\n /* @deprecated in favour of opts.token */\n this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`\n } else if (opts.token) {\n this[kProxyHeaders]['proxy-authorization'] = opts.token\n }\n\n const resolvedUrl = new URL(opts.uri)\n const { origin, port, host } = resolvedUrl\n\n const connect = buildConnector({ ...opts.proxyTls })\n this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })\n this[kClient] = clientFactory(resolvedUrl, { connect })\n this[kAgent] = new Agent({\n ...opts,\n connect: async (opts, callback) => {\n let requestedHost = opts.host\n if (!opts.port) {\n requestedHost += `:${defaultProtocolPort(opts.protocol)}`\n }\n try {\n const { socket, statusCode } = await this[kClient].connect({\n origin,\n port,\n path: requestedHost,\n signal: opts.signal,\n headers: {\n ...this[kProxyHeaders],\n host\n }\n })\n if (statusCode !== 200) {\n socket.on('error', () => {}).destroy()\n callback(new RequestAbortedError('Proxy response !== 200 when HTTP Tunneling'))\n }\n if (opts.protocol !== 'https:') {\n callback(null, socket)\n return\n }\n let servername\n if (this[kRequestTls]) {\n servername = this[kRequestTls].servername\n } else {\n servername = opts.servername\n }\n this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback)\n } catch (err) {\n callback(err)\n }\n }\n })\n }\n\n dispatch (opts, handler) {\n const { host } = new URL(opts.origin)\n const headers = buildHeaders(opts.headers)\n throwIfProxyAuthIsSent(headers)\n return this[kAgent].dispatch(\n {\n ...opts,\n headers: {\n ...headers,\n host\n }\n },\n handler\n )\n }\n\n async [kClose] () {\n await this[kAgent].close()\n await this[kClient].close()\n }\n\n async [kDestroy] () {\n await this[kAgent].destroy()\n await this[kClient].destroy()\n }\n}\n\n/**\n * @param {string[] | Record} headers\n * @returns {Record}\n */\nfunction buildHeaders (headers) {\n // When using undici.fetch, the headers list is stored\n // as an array.\n if (Array.isArray(headers)) {\n /** @type {Record} */\n const headersPair = {}\n\n for (let i = 0; i < headers.length; i += 2) {\n headersPair[headers[i]] = headers[i + 1]\n }\n\n return headersPair\n }\n\n return headers\n}\n\n/**\n * @param {Record} headers\n *\n * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers\n * Nevertheless, it was changed and to avoid a security vulnerability by end users\n * this check was created.\n * It should be removed in the next major version for performance reasons\n */\nfunction throwIfProxyAuthIsSent (headers) {\n const existProxyAuth = headers && Object.keys(headers)\n .find((key) => key.toLowerCase() === 'proxy-authorization')\n if (existProxyAuth) {\n throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor')\n }\n}\n\nmodule.exports = ProxyAgent\n","'use strict'\n\nlet fastNow = Date.now()\nlet fastNowTimeout\n\nconst fastTimers = []\n\nfunction onTimeout () {\n fastNow = Date.now()\n\n let len = fastTimers.length\n let idx = 0\n while (idx < len) {\n const timer = fastTimers[idx]\n\n if (timer.state === 0) {\n timer.state = fastNow + timer.delay\n } else if (timer.state > 0 && fastNow >= timer.state) {\n timer.state = -1\n timer.callback(timer.opaque)\n }\n\n if (timer.state === -1) {\n timer.state = -2\n if (idx !== len - 1) {\n fastTimers[idx] = fastTimers.pop()\n } else {\n fastTimers.pop()\n }\n len -= 1\n } else {\n idx += 1\n }\n }\n\n if (fastTimers.length > 0) {\n refreshTimeout()\n }\n}\n\nfunction refreshTimeout () {\n if (fastNowTimeout && fastNowTimeout.refresh) {\n fastNowTimeout.refresh()\n } else {\n clearTimeout(fastNowTimeout)\n fastNowTimeout = setTimeout(onTimeout, 1e3)\n if (fastNowTimeout.unref) {\n fastNowTimeout.unref()\n }\n }\n}\n\nclass Timeout {\n constructor (callback, delay, opaque) {\n this.callback = callback\n this.delay = delay\n this.opaque = opaque\n\n // -2 not in timer list\n // -1 in timer list but inactive\n // 0 in timer list waiting for time\n // > 0 in timer list waiting for time to expire\n this.state = -2\n\n this.refresh()\n }\n\n refresh () {\n if (this.state === -2) {\n fastTimers.push(this)\n if (!fastNowTimeout || fastTimers.length === 1) {\n refreshTimeout()\n }\n }\n\n this.state = 0\n }\n\n clear () {\n this.state = -1\n }\n}\n\nmodule.exports = {\n setTimeout (callback, delay, opaque) {\n return delay < 1e3\n ? setTimeout(callback, delay, opaque)\n : new Timeout(callback, delay, opaque)\n },\n clearTimeout (timeout) {\n if (timeout instanceof Timeout) {\n timeout.clear()\n } else {\n clearTimeout(timeout)\n }\n }\n}\n","'use strict'\n\nconst diagnosticsChannel = require('diagnostics_channel')\nconst { uid, states } = require('./constants')\nconst {\n kReadyState,\n kSentClose,\n kByteParser,\n kReceivedClose\n} = require('./symbols')\nconst { fireEvent, failWebsocketConnection } = require('./util')\nconst { CloseEvent } = require('./events')\nconst { makeRequest } = require('../fetch/request')\nconst { fetching } = require('../fetch/index')\nconst { Headers } = require('../fetch/headers')\nconst { getGlobalDispatcher } = require('../global')\nconst { kHeadersList } = require('../core/symbols')\n\nconst channels = {}\nchannels.open = diagnosticsChannel.channel('undici:websocket:open')\nchannels.close = diagnosticsChannel.channel('undici:websocket:close')\nchannels.socketError = diagnosticsChannel.channel('undici:websocket:socket_error')\n\n/** @type {import('crypto')} */\nlet crypto\ntry {\n crypto = require('crypto')\n} catch {\n\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#concept-websocket-establish\n * @param {URL} url\n * @param {string|string[]} protocols\n * @param {import('./websocket').WebSocket} ws\n * @param {(response: any) => void} onEstablish\n * @param {Partial} options\n */\nfunction establishWebSocketConnection (url, protocols, ws, onEstablish, options) {\n // 1. Let requestURL be a copy of url, with its scheme set to \"http\", if url’s\n // scheme is \"ws\", and to \"https\" otherwise.\n const requestURL = url\n\n requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:'\n\n // 2. Let request be a new request, whose URL is requestURL, client is client,\n // service-workers mode is \"none\", referrer is \"no-referrer\", mode is\n // \"websocket\", credentials mode is \"include\", cache mode is \"no-store\" ,\n // and redirect mode is \"error\".\n const request = makeRequest({\n urlList: [requestURL],\n serviceWorkers: 'none',\n referrer: 'no-referrer',\n mode: 'websocket',\n credentials: 'include',\n cache: 'no-store',\n redirect: 'error'\n })\n\n // Note: undici extension, allow setting custom headers.\n if (options.headers) {\n const headersList = new Headers(options.headers)[kHeadersList]\n\n request.headersList = headersList\n }\n\n // 3. Append (`Upgrade`, `websocket`) to request’s header list.\n // 4. Append (`Connection`, `Upgrade`) to request’s header list.\n // Note: both of these are handled by undici currently.\n // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397\n\n // 5. Let keyValue be a nonce consisting of a randomly selected\n // 16-byte value that has been forgiving-base64-encoded and\n // isomorphic encoded.\n const keyValue = crypto.randomBytes(16).toString('base64')\n\n // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s\n // header list.\n request.headersList.append('sec-websocket-key', keyValue)\n\n // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s\n // header list.\n request.headersList.append('sec-websocket-version', '13')\n\n // 8. For each protocol in protocols, combine\n // (`Sec-WebSocket-Protocol`, protocol) in request’s header\n // list.\n for (const protocol of protocols) {\n request.headersList.append('sec-websocket-protocol', protocol)\n }\n\n // 9. Let permessageDeflate be a user-agent defined\n // \"permessage-deflate\" extension header value.\n // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673\n // TODO: enable once permessage-deflate is supported\n const permessageDeflate = '' // 'permessage-deflate; 15'\n\n // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to\n // request’s header list.\n // request.headersList.append('sec-websocket-extensions', permessageDeflate)\n\n // 11. Fetch request with useParallelQueue set to true, and\n // processResponse given response being these steps:\n const controller = fetching({\n request,\n useParallelQueue: true,\n dispatcher: options.dispatcher ?? getGlobalDispatcher(),\n processResponse (response) {\n // 1. If response is a network error or its status is not 101,\n // fail the WebSocket connection.\n if (response.type === 'error' || response.status !== 101) {\n failWebsocketConnection(ws, 'Received network error or non-101 status code.')\n return\n }\n\n // 2. If protocols is not the empty list and extracting header\n // list values given `Sec-WebSocket-Protocol` and response’s\n // header list results in null, failure, or the empty byte\n // sequence, then fail the WebSocket connection.\n if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) {\n failWebsocketConnection(ws, 'Server did not respond with sent protocols.')\n return\n }\n\n // 3. Follow the requirements stated step 2 to step 6, inclusive,\n // of the last set of steps in section 4.1 of The WebSocket\n // Protocol to validate response. This either results in fail\n // the WebSocket connection or the WebSocket connection is\n // established.\n\n // 2. If the response lacks an |Upgrade| header field or the |Upgrade|\n // header field contains a value that is not an ASCII case-\n // insensitive match for the value \"websocket\", the client MUST\n // _Fail the WebSocket Connection_.\n if (response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') {\n failWebsocketConnection(ws, 'Server did not set Upgrade header to \"websocket\".')\n return\n }\n\n // 3. If the response lacks a |Connection| header field or the\n // |Connection| header field doesn't contain a token that is an\n // ASCII case-insensitive match for the value \"Upgrade\", the client\n // MUST _Fail the WebSocket Connection_.\n if (response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') {\n failWebsocketConnection(ws, 'Server did not set Connection header to \"upgrade\".')\n return\n }\n\n // 4. If the response lacks a |Sec-WebSocket-Accept| header field or\n // the |Sec-WebSocket-Accept| contains a value other than the\n // base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket-\n // Key| (as a string, not base64-decoded) with the string \"258EAFA5-\n // E914-47DA-95CA-C5AB0DC85B11\" but ignoring any leading and\n // trailing whitespace, the client MUST _Fail the WebSocket\n // Connection_.\n const secWSAccept = response.headersList.get('Sec-WebSocket-Accept')\n const digest = crypto.createHash('sha1').update(keyValue + uid).digest('base64')\n if (secWSAccept !== digest) {\n failWebsocketConnection(ws, 'Incorrect hash received in Sec-WebSocket-Accept header.')\n return\n }\n\n // 5. If the response includes a |Sec-WebSocket-Extensions| header\n // field and this header field indicates the use of an extension\n // that was not present in the client's handshake (the server has\n // indicated an extension not requested by the client), the client\n // MUST _Fail the WebSocket Connection_. (The parsing of this\n // header field to determine which extensions are requested is\n // discussed in Section 9.1.)\n const secExtension = response.headersList.get('Sec-WebSocket-Extensions')\n\n if (secExtension !== null && secExtension !== permessageDeflate) {\n failWebsocketConnection(ws, 'Received different permessage-deflate than the one set.')\n return\n }\n\n // 6. If the response includes a |Sec-WebSocket-Protocol| header field\n // and this header field indicates the use of a subprotocol that was\n // not present in the client's handshake (the server has indicated a\n // subprotocol not requested by the client), the client MUST _Fail\n // the WebSocket Connection_.\n const secProtocol = response.headersList.get('Sec-WebSocket-Protocol')\n\n if (secProtocol !== null && secProtocol !== request.headersList.get('Sec-WebSocket-Protocol')) {\n failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.')\n return\n }\n\n response.socket.on('data', onSocketData)\n response.socket.on('close', onSocketClose)\n response.socket.on('error', onSocketError)\n\n if (channels.open.hasSubscribers) {\n channels.open.publish({\n address: response.socket.address(),\n protocol: secProtocol,\n extensions: secExtension\n })\n }\n\n onEstablish(response)\n }\n })\n\n return controller\n}\n\n/**\n * @param {Buffer} chunk\n */\nfunction onSocketData (chunk) {\n if (!this.ws[kByteParser].write(chunk)) {\n this.pause()\n }\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4\n */\nfunction onSocketClose () {\n const { ws } = this\n\n // If the TCP connection was closed after the\n // WebSocket closing handshake was completed, the WebSocket connection\n // is said to have been closed _cleanly_.\n const wasClean = ws[kSentClose] && ws[kReceivedClose]\n\n let code = 1005\n let reason = ''\n\n const result = ws[kByteParser].closingInfo\n\n if (result) {\n code = result.code ?? 1005\n reason = result.reason\n } else if (!ws[kSentClose]) {\n // If _The WebSocket\n // Connection is Closed_ and no Close control frame was received by the\n // endpoint (such as could occur if the underlying transport connection\n // is lost), _The WebSocket Connection Close Code_ is considered to be\n // 1006.\n code = 1006\n }\n\n // 1. Change the ready state to CLOSED (3).\n ws[kReadyState] = states.CLOSED\n\n // 2. If the user agent was required to fail the WebSocket\n // connection, or if the WebSocket connection was closed\n // after being flagged as full, fire an event named error\n // at the WebSocket object.\n // TODO\n\n // 3. Fire an event named close at the WebSocket object,\n // using CloseEvent, with the wasClean attribute\n // initialized to true if the connection closed cleanly\n // and false otherwise, the code attribute initialized to\n // the WebSocket connection close code, and the reason\n // attribute initialized to the result of applying UTF-8\n // decode without BOM to the WebSocket connection close\n // reason.\n fireEvent('close', ws, CloseEvent, {\n wasClean, code, reason\n })\n\n if (channels.close.hasSubscribers) {\n channels.close.publish({\n websocket: ws,\n code,\n reason\n })\n }\n}\n\nfunction onSocketError (error) {\n const { ws } = this\n\n ws[kReadyState] = states.CLOSING\n\n if (channels.socketError.hasSubscribers) {\n channels.socketError.publish(error)\n }\n\n this.destroy()\n}\n\nmodule.exports = {\n establishWebSocketConnection\n}\n","'use strict'\n\n// This is a Globally Unique Identifier unique used\n// to validate that the endpoint accepts websocket\n// connections.\n// See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3\nconst uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'\n\n/** @type {PropertyDescriptor} */\nconst staticPropertyDescriptors = {\n enumerable: true,\n writable: false,\n configurable: false\n}\n\nconst states = {\n CONNECTING: 0,\n OPEN: 1,\n CLOSING: 2,\n CLOSED: 3\n}\n\nconst opcodes = {\n CONTINUATION: 0x0,\n TEXT: 0x1,\n BINARY: 0x2,\n CLOSE: 0x8,\n PING: 0x9,\n PONG: 0xA\n}\n\nconst maxUnsigned16Bit = 2 ** 16 - 1 // 65535\n\nconst parserStates = {\n INFO: 0,\n PAYLOADLENGTH_16: 2,\n PAYLOADLENGTH_64: 3,\n READ_DATA: 4\n}\n\nconst emptyBuffer = Buffer.allocUnsafe(0)\n\nmodule.exports = {\n uid,\n staticPropertyDescriptors,\n states,\n opcodes,\n maxUnsigned16Bit,\n parserStates,\n emptyBuffer\n}\n","'use strict'\n\nconst { webidl } = require('../fetch/webidl')\nconst { kEnumerableProperty } = require('../core/util')\nconst { MessagePort } = require('worker_threads')\n\n/**\n * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent\n */\nclass MessageEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' })\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.MessageEventInit(eventInitDict)\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n }\n\n get data () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.data\n }\n\n get origin () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.origin\n }\n\n get lastEventId () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.lastEventId\n }\n\n get source () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.source\n }\n\n get ports () {\n webidl.brandCheck(this, MessageEvent)\n\n if (!Object.isFrozen(this.#eventInit.ports)) {\n Object.freeze(this.#eventInit.ports)\n }\n\n return this.#eventInit.ports\n }\n\n initMessageEvent (\n type,\n bubbles = false,\n cancelable = false,\n data = null,\n origin = '',\n lastEventId = '',\n source = null,\n ports = []\n ) {\n webidl.brandCheck(this, MessageEvent)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent.initMessageEvent' })\n\n return new MessageEvent(type, {\n bubbles, cancelable, data, origin, lastEventId, source, ports\n })\n }\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#the-closeevent-interface\n */\nclass CloseEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' })\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.CloseEventInit(eventInitDict)\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n }\n\n get wasClean () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.wasClean\n }\n\n get code () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.code\n }\n\n get reason () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.reason\n }\n}\n\n// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface\nclass ErrorEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'ErrorEvent constructor' })\n\n super(type, eventInitDict)\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {})\n\n this.#eventInit = eventInitDict\n }\n\n get message () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.message\n }\n\n get filename () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.filename\n }\n\n get lineno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.lineno\n }\n\n get colno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.colno\n }\n\n get error () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.error\n }\n}\n\nObject.defineProperties(MessageEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'MessageEvent',\n configurable: true\n },\n data: kEnumerableProperty,\n origin: kEnumerableProperty,\n lastEventId: kEnumerableProperty,\n source: kEnumerableProperty,\n ports: kEnumerableProperty,\n initMessageEvent: kEnumerableProperty\n})\n\nObject.defineProperties(CloseEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'CloseEvent',\n configurable: true\n },\n reason: kEnumerableProperty,\n code: kEnumerableProperty,\n wasClean: kEnumerableProperty\n})\n\nObject.defineProperties(ErrorEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'ErrorEvent',\n configurable: true\n },\n message: kEnumerableProperty,\n filename: kEnumerableProperty,\n lineno: kEnumerableProperty,\n colno: kEnumerableProperty,\n error: kEnumerableProperty\n})\n\nwebidl.converters.MessagePort = webidl.interfaceConverter(MessagePort)\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.MessagePort\n)\n\nconst eventInit = [\n {\n key: 'bubbles',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'cancelable',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'composed',\n converter: webidl.converters.boolean,\n defaultValue: false\n }\n]\n\nwebidl.converters.MessageEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'data',\n converter: webidl.converters.any,\n defaultValue: null\n },\n {\n key: 'origin',\n converter: webidl.converters.USVString,\n defaultValue: ''\n },\n {\n key: 'lastEventId',\n converter: webidl.converters.DOMString,\n defaultValue: ''\n },\n {\n key: 'source',\n // Node doesn't implement WindowProxy or ServiceWorker, so the only\n // valid value for source is a MessagePort.\n converter: webidl.nullableConverter(webidl.converters.MessagePort),\n defaultValue: null\n },\n {\n key: 'ports',\n converter: webidl.converters['sequence'],\n get defaultValue () {\n return []\n }\n }\n])\n\nwebidl.converters.CloseEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'wasClean',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'code',\n converter: webidl.converters['unsigned short'],\n defaultValue: 0\n },\n {\n key: 'reason',\n converter: webidl.converters.USVString,\n defaultValue: ''\n }\n])\n\nwebidl.converters.ErrorEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'message',\n converter: webidl.converters.DOMString,\n defaultValue: ''\n },\n {\n key: 'filename',\n converter: webidl.converters.USVString,\n defaultValue: ''\n },\n {\n key: 'lineno',\n converter: webidl.converters['unsigned long'],\n defaultValue: 0\n },\n {\n key: 'colno',\n converter: webidl.converters['unsigned long'],\n defaultValue: 0\n },\n {\n key: 'error',\n converter: webidl.converters.any\n }\n])\n\nmodule.exports = {\n MessageEvent,\n CloseEvent,\n ErrorEvent\n}\n","'use strict'\n\nconst { maxUnsigned16Bit } = require('./constants')\n\n/** @type {import('crypto')} */\nlet crypto\ntry {\n crypto = require('crypto')\n} catch {\n\n}\n\nclass WebsocketFrameSend {\n /**\n * @param {Buffer|undefined} data\n */\n constructor (data) {\n this.frameData = data\n this.maskKey = crypto.randomBytes(4)\n }\n\n createFrame (opcode) {\n const bodyLength = this.frameData?.byteLength ?? 0\n\n /** @type {number} */\n let payloadLength = bodyLength // 0-125\n let offset = 6\n\n if (bodyLength > maxUnsigned16Bit) {\n offset += 8 // payload length is next 8 bytes\n payloadLength = 127\n } else if (bodyLength > 125) {\n offset += 2 // payload length is next 2 bytes\n payloadLength = 126\n }\n\n const buffer = Buffer.allocUnsafe(bodyLength + offset)\n\n // Clear first 2 bytes, everything else is overwritten\n buffer[0] = buffer[1] = 0\n buffer[0] |= 0x80 // FIN\n buffer[0] = (buffer[0] & 0xF0) + opcode // opcode\n\n /*! ws. MIT License. Einar Otto Stangvik */\n buffer[offset - 4] = this.maskKey[0]\n buffer[offset - 3] = this.maskKey[1]\n buffer[offset - 2] = this.maskKey[2]\n buffer[offset - 1] = this.maskKey[3]\n\n buffer[1] = payloadLength\n\n if (payloadLength === 126) {\n buffer.writeUInt16BE(bodyLength, 2)\n } else if (payloadLength === 127) {\n // Clear extended payload length\n buffer[2] = buffer[3] = 0\n buffer.writeUIntBE(bodyLength, 4, 6)\n }\n\n buffer[1] |= 0x80 // MASK\n\n // mask body\n for (let i = 0; i < bodyLength; i++) {\n buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]\n }\n\n return buffer\n }\n}\n\nmodule.exports = {\n WebsocketFrameSend\n}\n","'use strict'\n\nconst { Writable } = require('stream')\nconst diagnosticsChannel = require('diagnostics_channel')\nconst { parserStates, opcodes, states, emptyBuffer } = require('./constants')\nconst { kReadyState, kSentClose, kResponse, kReceivedClose } = require('./symbols')\nconst { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = require('./util')\nconst { WebsocketFrameSend } = require('./frame')\n\n// This code was influenced by ws released under the MIT license.\n// Copyright (c) 2011 Einar Otto Stangvik \n// Copyright (c) 2013 Arnout Kazemier and contributors\n// Copyright (c) 2016 Luigi Pinca and contributors\n\nconst channels = {}\nchannels.ping = diagnosticsChannel.channel('undici:websocket:ping')\nchannels.pong = diagnosticsChannel.channel('undici:websocket:pong')\n\nclass ByteParser extends Writable {\n #buffers = []\n #byteOffset = 0\n\n #state = parserStates.INFO\n\n #info = {}\n #fragments = []\n\n constructor (ws) {\n super()\n\n this.ws = ws\n }\n\n /**\n * @param {Buffer} chunk\n * @param {() => void} callback\n */\n _write (chunk, _, callback) {\n this.#buffers.push(chunk)\n this.#byteOffset += chunk.length\n\n this.run(callback)\n }\n\n /**\n * Runs whenever a new chunk is received.\n * Callback is called whenever there are no more chunks buffering,\n * or not enough bytes are buffered to parse.\n */\n run (callback) {\n while (true) {\n if (this.#state === parserStates.INFO) {\n // If there aren't enough bytes to parse the payload length, etc.\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n\n this.#info.fin = (buffer[0] & 0x80) !== 0\n this.#info.opcode = buffer[0] & 0x0F\n\n // If we receive a fragmented message, we use the type of the first\n // frame to parse the full message as binary/text, when it's terminated\n this.#info.originalOpcode ??= this.#info.opcode\n\n this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION\n\n if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) {\n // Only text and binary frames can be fragmented\n failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.')\n return\n }\n\n const payloadLength = buffer[1] & 0x7F\n\n if (payloadLength <= 125) {\n this.#info.payloadLength = payloadLength\n this.#state = parserStates.READ_DATA\n } else if (payloadLength === 126) {\n this.#state = parserStates.PAYLOADLENGTH_16\n } else if (payloadLength === 127) {\n this.#state = parserStates.PAYLOADLENGTH_64\n }\n\n if (this.#info.fragmented && payloadLength > 125) {\n // A fragmented frame can't be fragmented itself\n failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.')\n return\n } else if (\n (this.#info.opcode === opcodes.PING ||\n this.#info.opcode === opcodes.PONG ||\n this.#info.opcode === opcodes.CLOSE) &&\n payloadLength > 125\n ) {\n // Control frames can have a payload length of 125 bytes MAX\n failWebsocketConnection(this.ws, 'Payload length for control frame exceeded 125 bytes.')\n return\n } else if (this.#info.opcode === opcodes.CLOSE) {\n if (payloadLength === 1) {\n failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.')\n return\n }\n\n const body = this.consume(payloadLength)\n\n this.#info.closeInfo = this.parseCloseBody(false, body)\n\n if (!this.ws[kSentClose]) {\n // If an endpoint receives a Close frame and did not previously send a\n // Close frame, the endpoint MUST send a Close frame in response. (When\n // sending a Close frame in response, the endpoint typically echos the\n // status code it received.)\n const body = Buffer.allocUnsafe(2)\n body.writeUInt16BE(this.#info.closeInfo.code, 0)\n const closeFrame = new WebsocketFrameSend(body)\n\n this.ws[kResponse].socket.write(\n closeFrame.createFrame(opcodes.CLOSE),\n (err) => {\n if (!err) {\n this.ws[kSentClose] = true\n }\n }\n )\n }\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n this.ws[kReadyState] = states.CLOSING\n this.ws[kReceivedClose] = true\n\n this.end()\n\n return\n } else if (this.#info.opcode === opcodes.PING) {\n // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in\n // response, unless it already received a Close frame.\n // A Pong frame sent in response to a Ping frame must have identical\n // \"Application data\"\n\n const body = this.consume(payloadLength)\n\n if (!this.ws[kReceivedClose]) {\n const frame = new WebsocketFrameSend(body)\n\n this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG))\n\n if (channels.ping.hasSubscribers) {\n channels.ping.publish({\n payload: body\n })\n }\n }\n\n this.#state = parserStates.INFO\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n return\n }\n } else if (this.#info.opcode === opcodes.PONG) {\n // A Pong frame MAY be sent unsolicited. This serves as a\n // unidirectional heartbeat. A response to an unsolicited Pong frame is\n // not expected.\n\n const body = this.consume(payloadLength)\n\n if (channels.pong.hasSubscribers) {\n channels.pong.publish({\n payload: body\n })\n }\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n return\n }\n }\n } else if (this.#state === parserStates.PAYLOADLENGTH_16) {\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n\n this.#info.payloadLength = buffer.readUInt16BE(0)\n this.#state = parserStates.READ_DATA\n } else if (this.#state === parserStates.PAYLOADLENGTH_64) {\n if (this.#byteOffset < 8) {\n return callback()\n }\n\n const buffer = this.consume(8)\n const upper = buffer.readUInt32BE(0)\n\n // 2^31 is the maxinimum bytes an arraybuffer can contain\n // on 32-bit systems. Although, on 64-bit systems, this is\n // 2^53-1 bytes.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e\n if (upper > 2 ** 31 - 1) {\n failWebsocketConnection(this.ws, 'Received payload length > 2^31 bytes.')\n return\n }\n\n const lower = buffer.readUInt32BE(4)\n\n this.#info.payloadLength = (upper << 8) + lower\n this.#state = parserStates.READ_DATA\n } else if (this.#state === parserStates.READ_DATA) {\n if (this.#byteOffset < this.#info.payloadLength) {\n // If there is still more data in this chunk that needs to be read\n return callback()\n } else if (this.#byteOffset >= this.#info.payloadLength) {\n // If the server sent multiple frames in a single chunk\n\n const body = this.consume(this.#info.payloadLength)\n\n this.#fragments.push(body)\n\n // If the frame is unfragmented, or a fragmented frame was terminated,\n // a message was received\n if (!this.#info.fragmented || (this.#info.fin && this.#info.opcode === opcodes.CONTINUATION)) {\n const fullMessage = Buffer.concat(this.#fragments)\n\n websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage)\n\n this.#info = {}\n this.#fragments.length = 0\n }\n\n this.#state = parserStates.INFO\n }\n }\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n break\n }\n }\n }\n\n /**\n * Take n bytes from the buffered Buffers\n * @param {number} n\n * @returns {Buffer|null}\n */\n consume (n) {\n if (n > this.#byteOffset) {\n return null\n } else if (n === 0) {\n return emptyBuffer\n }\n\n if (this.#buffers[0].length === n) {\n this.#byteOffset -= this.#buffers[0].length\n return this.#buffers.shift()\n }\n\n const buffer = Buffer.allocUnsafe(n)\n let offset = 0\n\n while (offset !== n) {\n const next = this.#buffers[0]\n const { length } = next\n\n if (length + offset === n) {\n buffer.set(this.#buffers.shift(), offset)\n break\n } else if (length + offset > n) {\n buffer.set(next.subarray(0, n - offset), offset)\n this.#buffers[0] = next.subarray(n - offset)\n break\n } else {\n buffer.set(this.#buffers.shift(), offset)\n offset += next.length\n }\n }\n\n this.#byteOffset -= n\n\n return buffer\n }\n\n parseCloseBody (onlyCode, data) {\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5\n /** @type {number|undefined} */\n let code\n\n if (data.length >= 2) {\n // _The WebSocket Connection Close Code_ is\n // defined as the status code (Section 7.4) contained in the first Close\n // control frame received by the application\n code = data.readUInt16BE(0)\n }\n\n if (onlyCode) {\n if (!isValidStatusCode(code)) {\n return null\n }\n\n return { code }\n }\n\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6\n /** @type {Buffer} */\n let reason = data.subarray(2)\n\n // Remove BOM\n if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) {\n reason = reason.subarray(3)\n }\n\n if (code !== undefined && !isValidStatusCode(code)) {\n return null\n }\n\n try {\n // TODO: optimize this\n reason = new TextDecoder('utf-8', { fatal: true }).decode(reason)\n } catch {\n return null\n }\n\n return { code, reason }\n }\n\n get closingInfo () {\n return this.#info.closeInfo\n }\n}\n\nmodule.exports = {\n ByteParser\n}\n","'use strict'\n\nmodule.exports = {\n kWebSocketURL: Symbol('url'),\n kReadyState: Symbol('ready state'),\n kController: Symbol('controller'),\n kResponse: Symbol('response'),\n kBinaryType: Symbol('binary type'),\n kSentClose: Symbol('sent close'),\n kReceivedClose: Symbol('received close'),\n kByteParser: Symbol('byte parser')\n}\n","'use strict'\n\nconst { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require('./symbols')\nconst { states, opcodes } = require('./constants')\nconst { MessageEvent, ErrorEvent } = require('./events')\n\n/* globals Blob */\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isEstablished (ws) {\n // If the server's response is validated as provided for above, it is\n // said that _The WebSocket Connection is Established_ and that the\n // WebSocket Connection is in the OPEN state.\n return ws[kReadyState] === states.OPEN\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isClosing (ws) {\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n return ws[kReadyState] === states.CLOSING\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isClosed (ws) {\n return ws[kReadyState] === states.CLOSED\n}\n\n/**\n * @see https://dom.spec.whatwg.org/#concept-event-fire\n * @param {string} e\n * @param {EventTarget} target\n * @param {EventInit | undefined} eventInitDict\n */\nfunction fireEvent (e, target, eventConstructor = Event, eventInitDict) {\n // 1. If eventConstructor is not given, then let eventConstructor be Event.\n\n // 2. Let event be the result of creating an event given eventConstructor,\n // in the relevant realm of target.\n // 3. Initialize event’s type attribute to e.\n const event = new eventConstructor(e, eventInitDict) // eslint-disable-line new-cap\n\n // 4. Initialize any other IDL attributes of event as described in the\n // invocation of this algorithm.\n\n // 5. Return the result of dispatching event at target, with legacy target\n // override flag set if set.\n target.dispatchEvent(event)\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @param {import('./websocket').WebSocket} ws\n * @param {number} type Opcode\n * @param {Buffer} data application data\n */\nfunction websocketMessageReceived (ws, type, data) {\n // 1. If ready state is not OPEN (1), then return.\n if (ws[kReadyState] !== states.OPEN) {\n return\n }\n\n // 2. Let dataForEvent be determined by switching on type and binary type:\n let dataForEvent\n\n if (type === opcodes.TEXT) {\n // -> type indicates that the data is Text\n // a new DOMString containing data\n try {\n dataForEvent = new TextDecoder('utf-8', { fatal: true }).decode(data)\n } catch {\n failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.')\n return\n }\n } else if (type === opcodes.BINARY) {\n if (ws[kBinaryType] === 'blob') {\n // -> type indicates that the data is Binary and binary type is \"blob\"\n // a new Blob object, created in the relevant Realm of the WebSocket\n // object, that represents data as its raw data\n dataForEvent = new Blob([data])\n } else {\n // -> type indicates that the data is Binary and binary type is \"arraybuffer\"\n // a new ArrayBuffer object, created in the relevant Realm of the\n // WebSocket object, whose contents are data\n dataForEvent = new Uint8Array(data).buffer\n }\n }\n\n // 3. Fire an event named message at the WebSocket object, using MessageEvent,\n // with the origin attribute initialized to the serialization of the WebSocket\n // object’s url's origin, and the data attribute initialized to dataForEvent.\n fireEvent('message', ws, MessageEvent, {\n origin: ws[kWebSocketURL].origin,\n data: dataForEvent\n })\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455\n * @see https://datatracker.ietf.org/doc/html/rfc2616\n * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407\n * @param {string} protocol\n */\nfunction isValidSubprotocol (protocol) {\n // If present, this value indicates one\n // or more comma-separated subprotocol the client wishes to speak,\n // ordered by preference. The elements that comprise this value\n // MUST be non-empty strings with characters in the range U+0021 to\n // U+007E not including separator characters as defined in\n // [RFC2616] and MUST all be unique strings.\n if (protocol.length === 0) {\n return false\n }\n\n for (const char of protocol) {\n const code = char.charCodeAt(0)\n\n if (\n code < 0x21 ||\n code > 0x7E ||\n char === '(' ||\n char === ')' ||\n char === '<' ||\n char === '>' ||\n char === '@' ||\n char === ',' ||\n char === ';' ||\n char === ':' ||\n char === '\\\\' ||\n char === '\"' ||\n char === '/' ||\n char === '[' ||\n char === ']' ||\n char === '?' ||\n char === '=' ||\n char === '{' ||\n char === '}' ||\n code === 32 || // SP\n code === 9 // HT\n ) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4\n * @param {number} code\n */\nfunction isValidStatusCode (code) {\n if (code >= 1000 && code < 1015) {\n return (\n code !== 1004 && // reserved\n code !== 1005 && // \"MUST NOT be set as a status code\"\n code !== 1006 // \"MUST NOT be set as a status code\"\n )\n }\n\n return code >= 3000 && code <= 4999\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n * @param {string|undefined} reason\n */\nfunction failWebsocketConnection (ws, reason) {\n const { [kController]: controller, [kResponse]: response } = ws\n\n controller.abort()\n\n if (response?.socket && !response.socket.destroyed) {\n response.socket.destroy()\n }\n\n if (reason) {\n fireEvent('error', ws, ErrorEvent, {\n error: new Error(reason)\n })\n }\n}\n\nmodule.exports = {\n isEstablished,\n isClosing,\n isClosed,\n fireEvent,\n isValidSubprotocol,\n isValidStatusCode,\n failWebsocketConnection,\n websocketMessageReceived\n}\n","'use strict'\n\nconst { webidl } = require('../fetch/webidl')\nconst { DOMException } = require('../fetch/constants')\nconst { URLSerializer } = require('../fetch/dataURL')\nconst { getGlobalOrigin } = require('../fetch/global')\nconst { staticPropertyDescriptors, states, opcodes, emptyBuffer } = require('./constants')\nconst {\n kWebSocketURL,\n kReadyState,\n kController,\n kBinaryType,\n kResponse,\n kSentClose,\n kByteParser\n} = require('./symbols')\nconst { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = require('./util')\nconst { establishWebSocketConnection } = require('./connection')\nconst { WebsocketFrameSend } = require('./frame')\nconst { ByteParser } = require('./receiver')\nconst { kEnumerableProperty, isBlobLike } = require('../core/util')\nconst { getGlobalDispatcher } = require('../global')\nconst { types } = require('util')\n\nlet experimentalWarned = false\n\n// https://websockets.spec.whatwg.org/#interface-definition\nclass WebSocket extends EventTarget {\n #events = {\n open: null,\n error: null,\n close: null,\n message: null\n }\n\n #bufferedAmount = 0\n #protocol = ''\n #extensions = ''\n\n /**\n * @param {string} url\n * @param {string|string[]} protocols\n */\n constructor (url, protocols = []) {\n super()\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket constructor' })\n\n if (!experimentalWarned) {\n experimentalWarned = true\n process.emitWarning('WebSockets are experimental, expect them to change at any time.', {\n code: 'UNDICI-WS'\n })\n }\n\n const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols)\n\n url = webidl.converters.USVString(url)\n protocols = options.protocols\n\n // 1. Let baseURL be this's relevant settings object's API base URL.\n const baseURL = getGlobalOrigin()\n\n // 1. Let urlRecord be the result of applying the URL parser to url with baseURL.\n let urlRecord\n\n try {\n urlRecord = new URL(url, baseURL)\n } catch (e) {\n // 3. If urlRecord is failure, then throw a \"SyntaxError\" DOMException.\n throw new DOMException(e, 'SyntaxError')\n }\n\n // 4. If urlRecord’s scheme is \"http\", then set urlRecord’s scheme to \"ws\".\n if (urlRecord.protocol === 'http:') {\n urlRecord.protocol = 'ws:'\n } else if (urlRecord.protocol === 'https:') {\n // 5. Otherwise, if urlRecord’s scheme is \"https\", set urlRecord’s scheme to \"wss\".\n urlRecord.protocol = 'wss:'\n }\n\n // 6. If urlRecord’s scheme is not \"ws\" or \"wss\", then throw a \"SyntaxError\" DOMException.\n if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') {\n throw new DOMException(\n `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`,\n 'SyntaxError'\n )\n }\n\n // 7. If urlRecord’s fragment is non-null, then throw a \"SyntaxError\"\n // DOMException.\n if (urlRecord.hash || urlRecord.href.endsWith('#')) {\n throw new DOMException('Got fragment', 'SyntaxError')\n }\n\n // 8. If protocols is a string, set protocols to a sequence consisting\n // of just that string.\n if (typeof protocols === 'string') {\n protocols = [protocols]\n }\n\n // 9. If any of the values in protocols occur more than once or otherwise\n // fail to match the requirements for elements that comprise the value\n // of `Sec-WebSocket-Protocol` fields as defined by The WebSocket\n // protocol, then throw a \"SyntaxError\" DOMException.\n if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n // 10. Set this's url to urlRecord.\n this[kWebSocketURL] = new URL(urlRecord.href)\n\n // 11. Let client be this's relevant settings object.\n\n // 12. Run this step in parallel:\n\n // 1. Establish a WebSocket connection given urlRecord, protocols,\n // and client.\n this[kController] = establishWebSocketConnection(\n urlRecord,\n protocols,\n this,\n (response) => this.#onConnectionEstablished(response),\n options\n )\n\n // Each WebSocket object has an associated ready state, which is a\n // number representing the state of the connection. Initially it must\n // be CONNECTING (0).\n this[kReadyState] = WebSocket.CONNECTING\n\n // The extensions attribute must initially return the empty string.\n\n // The protocol attribute must initially return the empty string.\n\n // Each WebSocket object has an associated binary type, which is a\n // BinaryType. Initially it must be \"blob\".\n this[kBinaryType] = 'blob'\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-close\n * @param {number|undefined} code\n * @param {string|undefined} reason\n */\n close (code = undefined, reason = undefined) {\n webidl.brandCheck(this, WebSocket)\n\n if (code !== undefined) {\n code = webidl.converters['unsigned short'](code, { clamp: true })\n }\n\n if (reason !== undefined) {\n reason = webidl.converters.USVString(reason)\n }\n\n // 1. If code is present, but is neither an integer equal to 1000 nor an\n // integer in the range 3000 to 4999, inclusive, throw an\n // \"InvalidAccessError\" DOMException.\n if (code !== undefined) {\n if (code !== 1000 && (code < 3000 || code > 4999)) {\n throw new DOMException('invalid code', 'InvalidAccessError')\n }\n }\n\n let reasonByteLength = 0\n\n // 2. If reason is present, then run these substeps:\n if (reason !== undefined) {\n // 1. Let reasonBytes be the result of encoding reason.\n // 2. If reasonBytes is longer than 123 bytes, then throw a\n // \"SyntaxError\" DOMException.\n reasonByteLength = Buffer.byteLength(reason)\n\n if (reasonByteLength > 123) {\n throw new DOMException(\n `Reason must be less than 123 bytes; received ${reasonByteLength}`,\n 'SyntaxError'\n )\n }\n }\n\n // 3. Run the first matching steps from the following list:\n if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) {\n // If this's ready state is CLOSING (2) or CLOSED (3)\n // Do nothing.\n } else if (!isEstablished(this)) {\n // If the WebSocket connection is not yet established\n // Fail the WebSocket connection and set this's ready state\n // to CLOSING (2).\n failWebsocketConnection(this, 'Connection was closed before it was established.')\n this[kReadyState] = WebSocket.CLOSING\n } else if (!isClosing(this)) {\n // If the WebSocket closing handshake has not yet been started\n // Start the WebSocket closing handshake and set this's ready\n // state to CLOSING (2).\n // - If neither code nor reason is present, the WebSocket Close\n // message must not have a body.\n // - If code is present, then the status code to use in the\n // WebSocket Close message must be the integer given by code.\n // - If reason is also present, then reasonBytes must be\n // provided in the Close message after the status code.\n\n const frame = new WebsocketFrameSend()\n\n // If neither code nor reason is present, the WebSocket Close\n // message must not have a body.\n\n // If code is present, then the status code to use in the\n // WebSocket Close message must be the integer given by code.\n if (code !== undefined && reason === undefined) {\n frame.frameData = Buffer.allocUnsafe(2)\n frame.frameData.writeUInt16BE(code, 0)\n } else if (code !== undefined && reason !== undefined) {\n // If reason is also present, then reasonBytes must be\n // provided in the Close message after the status code.\n frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength)\n frame.frameData.writeUInt16BE(code, 0)\n // the body MAY contain UTF-8-encoded data with value /reason/\n frame.frameData.write(reason, 2, 'utf-8')\n } else {\n frame.frameData = emptyBuffer\n }\n\n /** @type {import('stream').Duplex} */\n const socket = this[kResponse].socket\n\n socket.write(frame.createFrame(opcodes.CLOSE), (err) => {\n if (!err) {\n this[kSentClose] = true\n }\n })\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n this[kReadyState] = states.CLOSING\n } else {\n // Otherwise\n // Set this's ready state to CLOSING (2).\n this[kReadyState] = WebSocket.CLOSING\n }\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-send\n * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data\n */\n send (data) {\n webidl.brandCheck(this, WebSocket)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket.send' })\n\n data = webidl.converters.WebSocketSendData(data)\n\n // 1. If this's ready state is CONNECTING, then throw an\n // \"InvalidStateError\" DOMException.\n if (this[kReadyState] === WebSocket.CONNECTING) {\n throw new DOMException('Sent before connected.', 'InvalidStateError')\n }\n\n // 2. Run the appropriate set of steps from the following list:\n // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1\n // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n\n if (!isEstablished(this) || isClosing(this)) {\n return\n }\n\n /** @type {import('stream').Duplex} */\n const socket = this[kResponse].socket\n\n // If data is a string\n if (typeof data === 'string') {\n // If the WebSocket connection is established and the WebSocket\n // closing handshake has not yet started, then the user agent\n // must send a WebSocket Message comprised of the data argument\n // using a text frame opcode; if the data cannot be sent, e.g.\n // because it would need to be buffered but the buffer is full,\n // the user agent must flag the WebSocket as full and then close\n // the WebSocket connection. Any invocation of this method with a\n // string argument that does not throw an exception must increase\n // the bufferedAmount attribute by the number of bytes needed to\n // express the argument as UTF-8.\n\n const value = Buffer.from(data)\n const frame = new WebsocketFrameSend(value)\n const buffer = frame.createFrame(opcodes.TEXT)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n } else if (types.isArrayBuffer(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need\n // to be buffered but the buffer is full, the user agent must flag\n // the WebSocket as full and then close the WebSocket connection.\n // The data to be sent is the data stored in the buffer described\n // by the ArrayBuffer object. Any invocation of this method with an\n // ArrayBuffer argument that does not throw an exception must\n // increase the bufferedAmount attribute by the length of the\n // ArrayBuffer in bytes.\n\n const value = Buffer.from(data)\n const frame = new WebsocketFrameSend(value)\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n } else if (ArrayBuffer.isView(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The\n // data to be sent is the data stored in the section of the buffer\n // described by the ArrayBuffer object that data references. Any\n // invocation of this method with this kind of argument that does\n // not throw an exception must increase the bufferedAmount attribute\n // by the length of data’s buffer in bytes.\n\n const ab = Buffer.from(data, data.byteOffset, data.byteLength)\n\n const frame = new WebsocketFrameSend(ab)\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += ab.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= ab.byteLength\n })\n } else if (isBlobLike(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The data\n // to be sent is the raw data represented by the Blob object. Any\n // invocation of this method with a Blob argument that does not throw\n // an exception must increase the bufferedAmount attribute by the size\n // of the Blob object’s raw data, in bytes.\n\n const frame = new WebsocketFrameSend()\n\n data.arrayBuffer().then((ab) => {\n const value = Buffer.from(ab)\n frame.frameData = value\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n })\n }\n }\n\n get readyState () {\n webidl.brandCheck(this, WebSocket)\n\n // The readyState getter steps are to return this's ready state.\n return this[kReadyState]\n }\n\n get bufferedAmount () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#bufferedAmount\n }\n\n get url () {\n webidl.brandCheck(this, WebSocket)\n\n // The url getter steps are to return this's url, serialized.\n return URLSerializer(this[kWebSocketURL])\n }\n\n get extensions () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#extensions\n }\n\n get protocol () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#protocol\n }\n\n get onopen () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.open\n }\n\n set onopen (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.open) {\n this.removeEventListener('open', this.#events.open)\n }\n\n if (typeof fn === 'function') {\n this.#events.open = fn\n this.addEventListener('open', fn)\n } else {\n this.#events.open = null\n }\n }\n\n get onerror () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.error\n }\n\n set onerror (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.error) {\n this.removeEventListener('error', this.#events.error)\n }\n\n if (typeof fn === 'function') {\n this.#events.error = fn\n this.addEventListener('error', fn)\n } else {\n this.#events.error = null\n }\n }\n\n get onclose () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.close\n }\n\n set onclose (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.close) {\n this.removeEventListener('close', this.#events.close)\n }\n\n if (typeof fn === 'function') {\n this.#events.close = fn\n this.addEventListener('close', fn)\n } else {\n this.#events.close = null\n }\n }\n\n get onmessage () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.message\n }\n\n set onmessage (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.message) {\n this.removeEventListener('message', this.#events.message)\n }\n\n if (typeof fn === 'function') {\n this.#events.message = fn\n this.addEventListener('message', fn)\n } else {\n this.#events.message = null\n }\n }\n\n get binaryType () {\n webidl.brandCheck(this, WebSocket)\n\n return this[kBinaryType]\n }\n\n set binaryType (type) {\n webidl.brandCheck(this, WebSocket)\n\n if (type !== 'blob' && type !== 'arraybuffer') {\n this[kBinaryType] = 'blob'\n } else {\n this[kBinaryType] = type\n }\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n */\n #onConnectionEstablished (response) {\n // processResponse is called when the \"response’s header list has been received and initialized.\"\n // once this happens, the connection is open\n this[kResponse] = response\n\n const parser = new ByteParser(this)\n parser.on('drain', function onParserDrain () {\n this.ws[kResponse].socket.resume()\n })\n\n response.socket.ws = this\n this[kByteParser] = parser\n\n // 1. Change the ready state to OPEN (1).\n this[kReadyState] = states.OPEN\n\n // 2. Change the extensions attribute’s value to the extensions in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1\n const extensions = response.headersList.get('sec-websocket-extensions')\n\n if (extensions !== null) {\n this.#extensions = extensions\n }\n\n // 3. Change the protocol attribute’s value to the subprotocol in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9\n const protocol = response.headersList.get('sec-websocket-protocol')\n\n if (protocol !== null) {\n this.#protocol = protocol\n }\n\n // 4. Fire an event named open at the WebSocket object.\n fireEvent('open', this)\n }\n}\n\n// https://websockets.spec.whatwg.org/#dom-websocket-connecting\nWebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING\n// https://websockets.spec.whatwg.org/#dom-websocket-open\nWebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN\n// https://websockets.spec.whatwg.org/#dom-websocket-closing\nWebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING\n// https://websockets.spec.whatwg.org/#dom-websocket-closed\nWebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED\n\nObject.defineProperties(WebSocket.prototype, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors,\n url: kEnumerableProperty,\n readyState: kEnumerableProperty,\n bufferedAmount: kEnumerableProperty,\n onopen: kEnumerableProperty,\n onerror: kEnumerableProperty,\n onclose: kEnumerableProperty,\n close: kEnumerableProperty,\n onmessage: kEnumerableProperty,\n binaryType: kEnumerableProperty,\n send: kEnumerableProperty,\n extensions: kEnumerableProperty,\n protocol: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'WebSocket',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nObject.defineProperties(WebSocket, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors\n})\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.DOMString\n)\n\nwebidl.converters['DOMString or sequence'] = function (V) {\n if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) {\n return webidl.converters['sequence'](V)\n }\n\n return webidl.converters.DOMString(V)\n}\n\n// This implements the propsal made in https://github.com/whatwg/websockets/issues/42\nwebidl.converters.WebSocketInit = webidl.dictionaryConverter([\n {\n key: 'protocols',\n converter: webidl.converters['DOMString or sequence'],\n get defaultValue () {\n return []\n }\n },\n {\n key: 'dispatcher',\n converter: (V) => V,\n get defaultValue () {\n return getGlobalDispatcher()\n }\n },\n {\n key: 'headers',\n converter: webidl.nullableConverter(webidl.converters.HeadersInit)\n }\n])\n\nwebidl.converters['DOMString or sequence or WebSocketInit'] = function (V) {\n if (webidl.util.Type(V) === 'Object' && !(Symbol.iterator in V)) {\n return webidl.converters.WebSocketInit(V)\n }\n\n return { protocols: webidl.converters['DOMString or sequence'](V) }\n}\n\nwebidl.converters.WebSocketSendData = function (V) {\n if (webidl.util.Type(V) === 'Object') {\n if (isBlobLike(V)) {\n return webidl.converters.Blob(V, { strict: false })\n }\n\n if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) {\n return webidl.converters.BufferSource(V)\n }\n }\n\n return webidl.converters.USVString(V)\n}\n\nmodule.exports = {\n WebSocket\n}\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction getUserAgent() {\n if (typeof navigator === \"object\" && \"userAgent\" in navigator) {\n return navigator.userAgent;\n }\n\n if (typeof process === \"object\" && process.version !== undefined) {\n return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`;\n }\n\n return \"\";\n}\n\nexports.getUserAgent = getUserAgent;\n//# sourceMappingURL=index.js.map\n","'use strict'\n\nexports.fromCallback = function (fn) {\n return Object.defineProperty(function (...args) {\n if (typeof args[args.length - 1] === 'function') fn.apply(this, args)\n else {\n return new Promise((resolve, reject) => {\n args.push((err, res) => (err != null) ? reject(err) : resolve(res))\n fn.apply(this, args)\n })\n }\n }, 'name', { value: fn.name })\n}\n\nexports.fromPromise = function (fn) {\n return Object.defineProperty(function (...args) {\n const cb = args[args.length - 1]\n if (typeof cb !== 'function') return fn.apply(this, args)\n else {\n args.pop()\n fn.apply(this, args).then(r => cb(null, r), cb)\n }\n }, 'name', { value: fn.name })\n}\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"v1\", {\n enumerable: true,\n get: function () {\n return _v.default;\n }\n});\nObject.defineProperty(exports, \"v3\", {\n enumerable: true,\n get: function () {\n return _v2.default;\n }\n});\nObject.defineProperty(exports, \"v4\", {\n enumerable: true,\n get: function () {\n return _v3.default;\n }\n});\nObject.defineProperty(exports, \"v5\", {\n enumerable: true,\n get: function () {\n return _v4.default;\n }\n});\nObject.defineProperty(exports, \"NIL\", {\n enumerable: true,\n get: function () {\n return _nil.default;\n }\n});\nObject.defineProperty(exports, \"version\", {\n enumerable: true,\n get: function () {\n return _version.default;\n }\n});\nObject.defineProperty(exports, \"validate\", {\n enumerable: true,\n get: function () {\n return _validate.default;\n }\n});\nObject.defineProperty(exports, \"stringify\", {\n enumerable: true,\n get: function () {\n return _stringify.default;\n }\n});\nObject.defineProperty(exports, \"parse\", {\n enumerable: true,\n get: function () {\n return _parse.default;\n }\n});\n\nvar _v = _interopRequireDefault(require(\"./v1.js\"));\n\nvar _v2 = _interopRequireDefault(require(\"./v3.js\"));\n\nvar _v3 = _interopRequireDefault(require(\"./v4.js\"));\n\nvar _v4 = _interopRequireDefault(require(\"./v5.js\"));\n\nvar _nil = _interopRequireDefault(require(\"./nil.js\"));\n\nvar _version = _interopRequireDefault(require(\"./version.js\"));\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nvar _parse = _interopRequireDefault(require(\"./parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction md5(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n } else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n\n return _crypto.default.createHash('md5').update(bytes).digest();\n}\n\nvar _default = md5;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _default = '00000000-0000-0000-0000-000000000000';\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction parse(uuid) {\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n let v;\n const arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nvar _default = parse;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = rng;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\n\nfunction rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n _crypto.default.randomFillSync(rnds8Pool);\n\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction sha1(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n } else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n\n return _crypto.default.createHash('sha1').update(bytes).digest();\n}\n\nvar _default = sha1;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nvar _default = stringify;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _rng = _interopRequireDefault(require(\"./rng.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\nlet _nodeId;\n\nlet _clockseq; // Previous uuid creation time\n\n\nlet _lastMSecs = 0;\nlet _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n let i = buf && offset || 0;\n const b = buf || new Array(16);\n options = options || {};\n let node = options.node || _nodeId;\n let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n const seedBytes = options.random || (options.rng || _rng.default)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (let n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || (0, _stringify.default)(b);\n}\n\nvar _default = v1;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _v = _interopRequireDefault(require(\"./v35.js\"));\n\nvar _md = _interopRequireDefault(require(\"./md5.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst v3 = (0, _v.default)('v3', 0x30, _md.default);\nvar _default = v3;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = _default;\nexports.URL = exports.DNS = void 0;\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nvar _parse = _interopRequireDefault(require(\"./parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n const bytes = [];\n\n for (let i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nconst DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexports.DNS = DNS;\nconst URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexports.URL = URL;\n\nfunction _default(name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = (0, _parse.default)(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n let bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return (0, _stringify.default)(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _rng = _interopRequireDefault(require(\"./rng.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction v4(options, buf, offset) {\n options = options || {};\n\n const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return (0, _stringify.default)(rnds);\n}\n\nvar _default = v4;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _v = _interopRequireDefault(require(\"./v35.js\"));\n\nvar _sha = _interopRequireDefault(require(\"./sha1.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst v5 = (0, _v.default)('v5', 0x50, _sha.default);\nvar _default = v5;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _regex = _interopRequireDefault(require(\"./regex.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && _regex.default.test(uuid);\n}\n\nvar _default = validate;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction version(uuid) {\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nvar _default = version;\nexports.default = _default;","// Returns a wrapper function that returns a wrapped callback\n// The wrapper function should do some stuff, and return a\n// presumably different callback function.\n// This makes sure that own properties are retained, so that\n// decorations and such are not lost along the way.\nmodule.exports = wrappy\nfunction wrappy (fn, cb) {\n if (fn && cb) return wrappy(fn)(cb)\n\n if (typeof fn !== 'function')\n throw new TypeError('need wrapper function')\n\n Object.keys(fn).forEach(function (k) {\n wrapper[k] = fn[k]\n })\n\n return wrapper\n\n function wrapper() {\n var args = new Array(arguments.length)\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i]\n }\n var ret = fn.apply(this, args)\n var cb = args[args.length-1]\n if (typeof ret === 'function' && ret !== cb) {\n Object.keys(cb).forEach(function (k) {\n ret[k] = cb[k]\n })\n }\n return ret\n }\n}\n","module.exports = require(\"assert\");","module.exports = require(\"async_hooks\");","module.exports = require(\"buffer\");","module.exports = require(\"child_process\");","module.exports = require(\"console\");","module.exports = require(\"constants\");","module.exports = require(\"crypto\");","module.exports = require(\"diagnostics_channel\");","module.exports = require(\"events\");","module.exports = require(\"fs\");","module.exports = require(\"fs/promises\");","module.exports = require(\"http\");","module.exports = require(\"http2\");","module.exports = require(\"https\");","module.exports = require(\"net\");","module.exports = require(\"node:events\");","module.exports = require(\"node:fs\");","module.exports = require(\"node:path\");","module.exports = require(\"node:stream\");","module.exports = require(\"node:util\");","module.exports = require(\"node:zlib\");","module.exports = require(\"os\");","module.exports = require(\"path\");","module.exports = require(\"perf_hooks\");","module.exports = require(\"process\");","module.exports = require(\"querystring\");","module.exports = require(\"stream\");","module.exports = require(\"stream/web\");","module.exports = require(\"string_decoder\");","module.exports = require(\"tls\");","module.exports = require(\"tty\");","module.exports = require(\"url\");","module.exports = require(\"util\");","module.exports = require(\"util/types\");","module.exports = require(\"worker_threads\");","module.exports = require(\"zlib\");","'use strict'\n\nconst WritableStream = require('node:stream').Writable\nconst inherits = require('node:util').inherits\n\nconst StreamSearch = require('../../streamsearch/sbmh')\n\nconst PartStream = require('./PartStream')\nconst HeaderParser = require('./HeaderParser')\n\nconst DASH = 45\nconst B_ONEDASH = Buffer.from('-')\nconst B_CRLF = Buffer.from('\\r\\n')\nconst EMPTY_FN = function () {}\n\nfunction Dicer (cfg) {\n if (!(this instanceof Dicer)) { return new Dicer(cfg) }\n WritableStream.call(this, cfg)\n\n if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') }\n\n if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined }\n\n this._headerFirst = cfg.headerFirst\n\n this._dashes = 0\n this._parts = 0\n this._finished = false\n this._realFinish = false\n this._isPreamble = true\n this._justMatched = false\n this._firstWrite = true\n this._inHeader = true\n this._part = undefined\n this._cb = undefined\n this._ignoreData = false\n this._partOpts = { highWaterMark: cfg.partHwm }\n this._pause = false\n\n const self = this\n this._hparser = new HeaderParser(cfg)\n this._hparser.on('header', function (header) {\n self._inHeader = false\n self._part.emit('header', header)\n })\n}\ninherits(Dicer, WritableStream)\n\nDicer.prototype.emit = function (ev) {\n if (ev === 'finish' && !this._realFinish) {\n if (!this._finished) {\n const self = this\n process.nextTick(function () {\n self.emit('error', new Error('Unexpected end of multipart data'))\n if (self._part && !self._ignoreData) {\n const type = (self._isPreamble ? 'Preamble' : 'Part')\n self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data'))\n self._part.push(null)\n process.nextTick(function () {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n })\n return\n }\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n })\n }\n } else { WritableStream.prototype.emit.apply(this, arguments) }\n}\n\nDicer.prototype._write = function (data, encoding, cb) {\n // ignore unexpected data (e.g. extra trailer data after finished)\n if (!this._hparser && !this._bparser) { return cb() }\n\n if (this._headerFirst && this._isPreamble) {\n if (!this._part) {\n this._part = new PartStream(this._partOpts)\n if (this._events.preamble) { this.emit('preamble', this._part) } else { this._ignore() }\n }\n const r = this._hparser.push(data)\n if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() }\n }\n\n // allows for \"easier\" testing\n if (this._firstWrite) {\n this._bparser.push(B_CRLF)\n this._firstWrite = false\n }\n\n this._bparser.push(data)\n\n if (this._pause) { this._cb = cb } else { cb() }\n}\n\nDicer.prototype.reset = function () {\n this._part = undefined\n this._bparser = undefined\n this._hparser = undefined\n}\n\nDicer.prototype.setBoundary = function (boundary) {\n const self = this\n this._bparser = new StreamSearch('\\r\\n--' + boundary)\n this._bparser.on('info', function (isMatch, data, start, end) {\n self._oninfo(isMatch, data, start, end)\n })\n}\n\nDicer.prototype._ignore = function () {\n if (this._part && !this._ignoreData) {\n this._ignoreData = true\n this._part.on('error', EMPTY_FN)\n // we must perform some kind of read on the stream even though we are\n // ignoring the data, otherwise node's Readable stream will not emit 'end'\n // after pushing null to the stream\n this._part.resume()\n }\n}\n\nDicer.prototype._oninfo = function (isMatch, data, start, end) {\n let buf; const self = this; let i = 0; let r; let shouldWriteMore = true\n\n if (!this._part && this._justMatched && data) {\n while (this._dashes < 2 && (start + i) < end) {\n if (data[start + i] === DASH) {\n ++i\n ++this._dashes\n } else {\n if (this._dashes) { buf = B_ONEDASH }\n this._dashes = 0\n break\n }\n }\n if (this._dashes === 2) {\n if ((start + i) < end && this._events.trailer) { this.emit('trailer', data.slice(start + i, end)) }\n this.reset()\n this._finished = true\n // no more parts will be added\n if (self._parts === 0) {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n }\n }\n if (this._dashes) { return }\n }\n if (this._justMatched) { this._justMatched = false }\n if (!this._part) {\n this._part = new PartStream(this._partOpts)\n this._part._read = function (n) {\n self._unpause()\n }\n if (this._isPreamble && this._events.preamble) { this.emit('preamble', this._part) } else if (this._isPreamble !== true && this._events.part) { this.emit('part', this._part) } else { this._ignore() }\n if (!this._isPreamble) { this._inHeader = true }\n }\n if (data && start < end && !this._ignoreData) {\n if (this._isPreamble || !this._inHeader) {\n if (buf) { shouldWriteMore = this._part.push(buf) }\n shouldWriteMore = this._part.push(data.slice(start, end))\n if (!shouldWriteMore) { this._pause = true }\n } else if (!this._isPreamble && this._inHeader) {\n if (buf) { this._hparser.push(buf) }\n r = this._hparser.push(data.slice(start, end))\n if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) }\n }\n }\n if (isMatch) {\n this._hparser.reset()\n if (this._isPreamble) { this._isPreamble = false } else {\n if (start !== end) {\n ++this._parts\n this._part.on('end', function () {\n if (--self._parts === 0) {\n if (self._finished) {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n } else {\n self._unpause()\n }\n }\n })\n }\n }\n this._part.push(null)\n this._part = undefined\n this._ignoreData = false\n this._justMatched = true\n this._dashes = 0\n }\n}\n\nDicer.prototype._unpause = function () {\n if (!this._pause) { return }\n\n this._pause = false\n if (this._cb) {\n const cb = this._cb\n this._cb = undefined\n cb()\n }\n}\n\nmodule.exports = Dicer\n","'use strict'\n\nconst EventEmitter = require('node:events').EventEmitter\nconst inherits = require('node:util').inherits\nconst getLimit = require('../../../lib/utils/getLimit')\n\nconst StreamSearch = require('../../streamsearch/sbmh')\n\nconst B_DCRLF = Buffer.from('\\r\\n\\r\\n')\nconst RE_CRLF = /\\r\\n/g\nconst RE_HDR = /^([^:]+):[ \\t]?([\\x00-\\xFF]+)?$/ // eslint-disable-line no-control-regex\n\nfunction HeaderParser (cfg) {\n EventEmitter.call(this)\n\n cfg = cfg || {}\n const self = this\n this.nread = 0\n this.maxed = false\n this.npairs = 0\n this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000)\n this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024)\n this.buffer = ''\n this.header = {}\n this.finished = false\n this.ss = new StreamSearch(B_DCRLF)\n this.ss.on('info', function (isMatch, data, start, end) {\n if (data && !self.maxed) {\n if (self.nread + end - start >= self.maxHeaderSize) {\n end = self.maxHeaderSize - self.nread + start\n self.nread = self.maxHeaderSize\n self.maxed = true\n } else { self.nread += (end - start) }\n\n self.buffer += data.toString('binary', start, end)\n }\n if (isMatch) { self._finish() }\n })\n}\ninherits(HeaderParser, EventEmitter)\n\nHeaderParser.prototype.push = function (data) {\n const r = this.ss.push(data)\n if (this.finished) { return r }\n}\n\nHeaderParser.prototype.reset = function () {\n this.finished = false\n this.buffer = ''\n this.header = {}\n this.ss.reset()\n}\n\nHeaderParser.prototype._finish = function () {\n if (this.buffer) { this._parseHeader() }\n this.ss.matches = this.ss.maxMatches\n const header = this.header\n this.header = {}\n this.buffer = ''\n this.finished = true\n this.nread = this.npairs = 0\n this.maxed = false\n this.emit('header', header)\n}\n\nHeaderParser.prototype._parseHeader = function () {\n if (this.npairs === this.maxHeaderPairs) { return }\n\n const lines = this.buffer.split(RE_CRLF)\n const len = lines.length\n let m, h\n\n for (var i = 0; i < len; ++i) { // eslint-disable-line no-var\n if (lines[i].length === 0) { continue }\n if (lines[i][0] === '\\t' || lines[i][0] === ' ') {\n // folded header content\n // RFC2822 says to just remove the CRLF and not the whitespace following\n // it, so we follow the RFC and include the leading whitespace ...\n if (h) {\n this.header[h][this.header[h].length - 1] += lines[i]\n continue\n }\n }\n\n const posColon = lines[i].indexOf(':')\n if (\n posColon === -1 ||\n posColon === 0\n ) {\n return\n }\n m = RE_HDR.exec(lines[i])\n h = m[1].toLowerCase()\n this.header[h] = this.header[h] || []\n this.header[h].push((m[2] || ''))\n if (++this.npairs === this.maxHeaderPairs) { break }\n }\n}\n\nmodule.exports = HeaderParser\n","'use strict'\n\nconst inherits = require('node:util').inherits\nconst ReadableStream = require('node:stream').Readable\n\nfunction PartStream (opts) {\n ReadableStream.call(this, opts)\n}\ninherits(PartStream, ReadableStream)\n\nPartStream.prototype._read = function (n) {}\n\nmodule.exports = PartStream\n","'use strict'\n\n/**\n * Copyright Brian White. All rights reserved.\n *\n * @see https://github.com/mscdex/streamsearch\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n *\n * Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation\n * by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool\n */\nconst EventEmitter = require('node:events').EventEmitter\nconst inherits = require('node:util').inherits\n\nfunction SBMH (needle) {\n if (typeof needle === 'string') {\n needle = Buffer.from(needle)\n }\n\n if (!Buffer.isBuffer(needle)) {\n throw new TypeError('The needle has to be a String or a Buffer.')\n }\n\n const needleLength = needle.length\n\n if (needleLength === 0) {\n throw new Error('The needle cannot be an empty String/Buffer.')\n }\n\n if (needleLength > 256) {\n throw new Error('The needle cannot have a length bigger than 256.')\n }\n\n this.maxMatches = Infinity\n this.matches = 0\n\n this._occ = new Array(256)\n .fill(needleLength) // Initialize occurrence table.\n this._lookbehind_size = 0\n this._needle = needle\n this._bufpos = 0\n\n this._lookbehind = Buffer.alloc(needleLength)\n\n // Populate occurrence table with analysis of the needle,\n // ignoring last letter.\n for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var\n this._occ[needle[i]] = needleLength - 1 - i\n }\n}\ninherits(SBMH, EventEmitter)\n\nSBMH.prototype.reset = function () {\n this._lookbehind_size = 0\n this.matches = 0\n this._bufpos = 0\n}\n\nSBMH.prototype.push = function (chunk, pos) {\n if (!Buffer.isBuffer(chunk)) {\n chunk = Buffer.from(chunk, 'binary')\n }\n const chlen = chunk.length\n this._bufpos = pos || 0\n let r\n while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) }\n return r\n}\n\nSBMH.prototype._sbmh_feed = function (data) {\n const len = data.length\n const needle = this._needle\n const needleLength = needle.length\n const lastNeedleChar = needle[needleLength - 1]\n\n // Positive: points to a position in `data`\n // pos == 3 points to data[3]\n // Negative: points to a position in the lookbehind buffer\n // pos == -2 points to lookbehind[lookbehind_size - 2]\n let pos = -this._lookbehind_size\n let ch\n\n if (pos < 0) {\n // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool\n // search with character lookup code that considers both the\n // lookbehind buffer and the current round's haystack data.\n //\n // Loop until\n // there is a match.\n // or until\n // we've moved past the position that requires the\n // lookbehind buffer. In this case we switch to the\n // optimized loop.\n // or until\n // the character to look at lies outside the haystack.\n while (pos < 0 && pos <= len - needleLength) {\n ch = this._sbmh_lookup_char(data, pos + needleLength - 1)\n\n if (\n ch === lastNeedleChar &&\n this._sbmh_memcmp(data, pos, needleLength - 1)\n ) {\n this._lookbehind_size = 0\n ++this.matches\n this.emit('info', true)\n\n return (this._bufpos = pos + needleLength)\n }\n pos += this._occ[ch]\n }\n\n // No match.\n\n if (pos < 0) {\n // There's too few data for Boyer-Moore-Horspool to run,\n // so let's use a different algorithm to skip as much as\n // we can.\n // Forward pos until\n // the trailing part of lookbehind + data\n // looks like the beginning of the needle\n // or until\n // pos == 0\n while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos }\n }\n\n if (pos >= 0) {\n // Discard lookbehind buffer.\n this.emit('info', false, this._lookbehind, 0, this._lookbehind_size)\n this._lookbehind_size = 0\n } else {\n // Cut off part of the lookbehind buffer that has\n // been processed and append the entire haystack\n // into it.\n const bytesToCutOff = this._lookbehind_size + pos\n if (bytesToCutOff > 0) {\n // The cut off data is guaranteed not to contain the needle.\n this.emit('info', false, this._lookbehind, 0, bytesToCutOff)\n }\n\n this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff,\n this._lookbehind_size - bytesToCutOff)\n this._lookbehind_size -= bytesToCutOff\n\n data.copy(this._lookbehind, this._lookbehind_size)\n this._lookbehind_size += len\n\n this._bufpos = len\n return len\n }\n }\n\n pos += (pos >= 0) * this._bufpos\n\n // Lookbehind buffer is now empty. We only need to check if the\n // needle is in the haystack.\n if (data.indexOf(needle, pos) !== -1) {\n pos = data.indexOf(needle, pos)\n ++this.matches\n if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) }\n\n return (this._bufpos = pos + needleLength)\n } else {\n pos = len - needleLength\n }\n\n // There was no match. If there's trailing haystack data that we cannot\n // match yet using the Boyer-Moore-Horspool algorithm (because the trailing\n // data is less than the needle size) then match using a modified\n // algorithm that starts matching from the beginning instead of the end.\n // Whatever trailing data is left after running this algorithm is added to\n // the lookbehind buffer.\n while (\n pos < len &&\n (\n data[pos] !== needle[0] ||\n (\n (Buffer.compare(\n data.subarray(pos, pos + len - pos),\n needle.subarray(0, len - pos)\n ) !== 0)\n )\n )\n ) {\n ++pos\n }\n if (pos < len) {\n data.copy(this._lookbehind, 0, pos, pos + (len - pos))\n this._lookbehind_size = len - pos\n }\n\n // Everything until pos is guaranteed not to contain needle data.\n if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) }\n\n this._bufpos = len\n return len\n}\n\nSBMH.prototype._sbmh_lookup_char = function (data, pos) {\n return (pos < 0)\n ? this._lookbehind[this._lookbehind_size + pos]\n : data[pos]\n}\n\nSBMH.prototype._sbmh_memcmp = function (data, pos, len) {\n for (var i = 0; i < len; ++i) { // eslint-disable-line no-var\n if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false }\n }\n return true\n}\n\nmodule.exports = SBMH\n","'use strict'\n\nconst WritableStream = require('node:stream').Writable\nconst { inherits } = require('node:util')\nconst Dicer = require('../deps/dicer/lib/Dicer')\n\nconst MultipartParser = require('./types/multipart')\nconst UrlencodedParser = require('./types/urlencoded')\nconst parseParams = require('./utils/parseParams')\n\nfunction Busboy (opts) {\n if (!(this instanceof Busboy)) { return new Busboy(opts) }\n\n if (typeof opts !== 'object') {\n throw new TypeError('Busboy expected an options-Object.')\n }\n if (typeof opts.headers !== 'object') {\n throw new TypeError('Busboy expected an options-Object with headers-attribute.')\n }\n if (typeof opts.headers['content-type'] !== 'string') {\n throw new TypeError('Missing Content-Type-header.')\n }\n\n const {\n headers,\n ...streamOptions\n } = opts\n\n this.opts = {\n autoDestroy: false,\n ...streamOptions\n }\n WritableStream.call(this, this.opts)\n\n this._done = false\n this._parser = this.getParserByHeaders(headers)\n this._finished = false\n}\ninherits(Busboy, WritableStream)\n\nBusboy.prototype.emit = function (ev) {\n if (ev === 'finish') {\n if (!this._done) {\n this._parser?.end()\n return\n } else if (this._finished) {\n return\n }\n this._finished = true\n }\n WritableStream.prototype.emit.apply(this, arguments)\n}\n\nBusboy.prototype.getParserByHeaders = function (headers) {\n const parsed = parseParams(headers['content-type'])\n\n const cfg = {\n defCharset: this.opts.defCharset,\n fileHwm: this.opts.fileHwm,\n headers,\n highWaterMark: this.opts.highWaterMark,\n isPartAFile: this.opts.isPartAFile,\n limits: this.opts.limits,\n parsedConType: parsed,\n preservePath: this.opts.preservePath\n }\n\n if (MultipartParser.detect.test(parsed[0])) {\n return new MultipartParser(this, cfg)\n }\n if (UrlencodedParser.detect.test(parsed[0])) {\n return new UrlencodedParser(this, cfg)\n }\n throw new Error('Unsupported Content-Type.')\n}\n\nBusboy.prototype._write = function (chunk, encoding, cb) {\n this._parser.write(chunk, cb)\n}\n\nmodule.exports = Busboy\nmodule.exports.default = Busboy\nmodule.exports.Busboy = Busboy\n\nmodule.exports.Dicer = Dicer\n","'use strict'\n\n// TODO:\n// * support 1 nested multipart level\n// (see second multipart example here:\n// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data)\n// * support limits.fieldNameSize\n// -- this will require modifications to utils.parseParams\n\nconst { Readable } = require('node:stream')\nconst { inherits } = require('node:util')\n\nconst Dicer = require('../../deps/dicer/lib/Dicer')\n\nconst parseParams = require('../utils/parseParams')\nconst decodeText = require('../utils/decodeText')\nconst basename = require('../utils/basename')\nconst getLimit = require('../utils/getLimit')\n\nconst RE_BOUNDARY = /^boundary$/i\nconst RE_FIELD = /^form-data$/i\nconst RE_CHARSET = /^charset$/i\nconst RE_FILENAME = /^filename$/i\nconst RE_NAME = /^name$/i\n\nMultipart.detect = /^multipart\\/form-data/i\nfunction Multipart (boy, cfg) {\n let i\n let len\n const self = this\n let boundary\n const limits = cfg.limits\n const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined))\n const parsedConType = cfg.parsedConType || []\n const defCharset = cfg.defCharset || 'utf8'\n const preservePath = cfg.preservePath\n const fileOpts = { highWaterMark: cfg.fileHwm }\n\n for (i = 0, len = parsedConType.length; i < len; ++i) {\n if (Array.isArray(parsedConType[i]) &&\n RE_BOUNDARY.test(parsedConType[i][0])) {\n boundary = parsedConType[i][1]\n break\n }\n }\n\n function checkFinished () {\n if (nends === 0 && finished && !boy._done) {\n finished = false\n self.end()\n }\n }\n\n if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') }\n\n const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)\n const fileSizeLimit = getLimit(limits, 'fileSize', Infinity)\n const filesLimit = getLimit(limits, 'files', Infinity)\n const fieldsLimit = getLimit(limits, 'fields', Infinity)\n const partsLimit = getLimit(limits, 'parts', Infinity)\n const headerPairsLimit = getLimit(limits, 'headerPairs', 2000)\n const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024)\n\n let nfiles = 0\n let nfields = 0\n let nends = 0\n let curFile\n let curField\n let finished = false\n\n this._needDrain = false\n this._pause = false\n this._cb = undefined\n this._nparts = 0\n this._boy = boy\n\n const parserCfg = {\n boundary,\n maxHeaderPairs: headerPairsLimit,\n maxHeaderSize: headerSizeLimit,\n partHwm: fileOpts.highWaterMark,\n highWaterMark: cfg.highWaterMark\n }\n\n this.parser = new Dicer(parserCfg)\n this.parser.on('drain', function () {\n self._needDrain = false\n if (self._cb && !self._pause) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n }).on('part', function onPart (part) {\n if (++self._nparts > partsLimit) {\n self.parser.removeListener('part', onPart)\n self.parser.on('part', skipPart)\n boy.hitPartsLimit = true\n boy.emit('partsLimit')\n return skipPart(part)\n }\n\n // hack because streams2 _always_ doesn't emit 'end' until nextTick, so let\n // us emit 'end' early since we know the part has ended if we are already\n // seeing the next part\n if (curField) {\n const field = curField\n field.emit('end')\n field.removeAllListeners('end')\n }\n\n part.on('header', function (header) {\n let contype\n let fieldname\n let parsed\n let charset\n let encoding\n let filename\n let nsize = 0\n\n if (header['content-type']) {\n parsed = parseParams(header['content-type'][0])\n if (parsed[0]) {\n contype = parsed[0].toLowerCase()\n for (i = 0, len = parsed.length; i < len; ++i) {\n if (RE_CHARSET.test(parsed[i][0])) {\n charset = parsed[i][1].toLowerCase()\n break\n }\n }\n }\n }\n\n if (contype === undefined) { contype = 'text/plain' }\n if (charset === undefined) { charset = defCharset }\n\n if (header['content-disposition']) {\n parsed = parseParams(header['content-disposition'][0])\n if (!RE_FIELD.test(parsed[0])) { return skipPart(part) }\n for (i = 0, len = parsed.length; i < len; ++i) {\n if (RE_NAME.test(parsed[i][0])) {\n fieldname = parsed[i][1]\n } else if (RE_FILENAME.test(parsed[i][0])) {\n filename = parsed[i][1]\n if (!preservePath) { filename = basename(filename) }\n }\n }\n } else { return skipPart(part) }\n\n if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' }\n\n let onData,\n onEnd\n\n if (isPartAFile(fieldname, contype, filename)) {\n // file/binary field\n if (nfiles === filesLimit) {\n if (!boy.hitFilesLimit) {\n boy.hitFilesLimit = true\n boy.emit('filesLimit')\n }\n return skipPart(part)\n }\n\n ++nfiles\n\n if (!boy._events.file) {\n self.parser._ignore()\n return\n }\n\n ++nends\n const file = new FileStream(fileOpts)\n curFile = file\n file.on('end', function () {\n --nends\n self._pause = false\n checkFinished()\n if (self._cb && !self._needDrain) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n })\n file._read = function (n) {\n if (!self._pause) { return }\n self._pause = false\n if (self._cb && !self._needDrain) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n }\n boy.emit('file', fieldname, file, filename, encoding, contype)\n\n onData = function (data) {\n if ((nsize += data.length) > fileSizeLimit) {\n const extralen = fileSizeLimit - nsize + data.length\n if (extralen > 0) { file.push(data.slice(0, extralen)) }\n file.truncated = true\n file.bytesRead = fileSizeLimit\n part.removeAllListeners('data')\n file.emit('limit')\n return\n } else if (!file.push(data)) { self._pause = true }\n\n file.bytesRead = nsize\n }\n\n onEnd = function () {\n curFile = undefined\n file.push(null)\n }\n } else {\n // non-file field\n if (nfields === fieldsLimit) {\n if (!boy.hitFieldsLimit) {\n boy.hitFieldsLimit = true\n boy.emit('fieldsLimit')\n }\n return skipPart(part)\n }\n\n ++nfields\n ++nends\n let buffer = ''\n let truncated = false\n curField = part\n\n onData = function (data) {\n if ((nsize += data.length) > fieldSizeLimit) {\n const extralen = (fieldSizeLimit - (nsize - data.length))\n buffer += data.toString('binary', 0, extralen)\n truncated = true\n part.removeAllListeners('data')\n } else { buffer += data.toString('binary') }\n }\n\n onEnd = function () {\n curField = undefined\n if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) }\n boy.emit('field', fieldname, buffer, false, truncated, encoding, contype)\n --nends\n checkFinished()\n }\n }\n\n /* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become\n broken. Streams2/streams3 is a huge black box of confusion, but\n somehow overriding the sync state seems to fix things again (and still\n seems to work for previous node versions).\n */\n part._readableState.sync = false\n\n part.on('data', onData)\n part.on('end', onEnd)\n }).on('error', function (err) {\n if (curFile) { curFile.emit('error', err) }\n })\n }).on('error', function (err) {\n boy.emit('error', err)\n }).on('finish', function () {\n finished = true\n checkFinished()\n })\n}\n\nMultipart.prototype.write = function (chunk, cb) {\n const r = this.parser.write(chunk)\n if (r && !this._pause) {\n cb()\n } else {\n this._needDrain = !r\n this._cb = cb\n }\n}\n\nMultipart.prototype.end = function () {\n const self = this\n\n if (self.parser.writable) {\n self.parser.end()\n } else if (!self._boy._done) {\n process.nextTick(function () {\n self._boy._done = true\n self._boy.emit('finish')\n })\n }\n}\n\nfunction skipPart (part) {\n part.resume()\n}\n\nfunction FileStream (opts) {\n Readable.call(this, opts)\n\n this.bytesRead = 0\n\n this.truncated = false\n}\n\ninherits(FileStream, Readable)\n\nFileStream.prototype._read = function (n) {}\n\nmodule.exports = Multipart\n","'use strict'\n\nconst Decoder = require('../utils/Decoder')\nconst decodeText = require('../utils/decodeText')\nconst getLimit = require('../utils/getLimit')\n\nconst RE_CHARSET = /^charset$/i\n\nUrlEncoded.detect = /^application\\/x-www-form-urlencoded/i\nfunction UrlEncoded (boy, cfg) {\n const limits = cfg.limits\n const parsedConType = cfg.parsedConType\n this.boy = boy\n\n this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)\n this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100)\n this.fieldsLimit = getLimit(limits, 'fields', Infinity)\n\n let charset\n for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var\n if (Array.isArray(parsedConType[i]) &&\n RE_CHARSET.test(parsedConType[i][0])) {\n charset = parsedConType[i][1].toLowerCase()\n break\n }\n }\n\n if (charset === undefined) { charset = cfg.defCharset || 'utf8' }\n\n this.decoder = new Decoder()\n this.charset = charset\n this._fields = 0\n this._state = 'key'\n this._checkingBytes = true\n this._bytesKey = 0\n this._bytesVal = 0\n this._key = ''\n this._val = ''\n this._keyTrunc = false\n this._valTrunc = false\n this._hitLimit = false\n}\n\nUrlEncoded.prototype.write = function (data, cb) {\n if (this._fields === this.fieldsLimit) {\n if (!this.boy.hitFieldsLimit) {\n this.boy.hitFieldsLimit = true\n this.boy.emit('fieldsLimit')\n }\n return cb()\n }\n\n let idxeq; let idxamp; let i; let p = 0; const len = data.length\n\n while (p < len) {\n if (this._state === 'key') {\n idxeq = idxamp = undefined\n for (i = p; i < len; ++i) {\n if (!this._checkingBytes) { ++p }\n if (data[i] === 0x3D/* = */) {\n idxeq = i\n break\n } else if (data[i] === 0x26/* & */) {\n idxamp = i\n break\n }\n if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) {\n this._hitLimit = true\n break\n } else if (this._checkingBytes) { ++this._bytesKey }\n }\n\n if (idxeq !== undefined) {\n // key with assignment\n if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) }\n this._state = 'val'\n\n this._hitLimit = false\n this._checkingBytes = true\n this._val = ''\n this._bytesVal = 0\n this._valTrunc = false\n this.decoder.reset()\n\n p = idxeq + 1\n } else if (idxamp !== undefined) {\n // key with no assignment\n ++this._fields\n let key; const keyTrunc = this._keyTrunc\n if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key }\n\n this._hitLimit = false\n this._checkingBytes = true\n this._key = ''\n this._bytesKey = 0\n this._keyTrunc = false\n this.decoder.reset()\n\n if (key.length) {\n this.boy.emit('field', decodeText(key, 'binary', this.charset),\n '',\n keyTrunc,\n false)\n }\n\n p = idxamp + 1\n if (this._fields === this.fieldsLimit) { return cb() }\n } else if (this._hitLimit) {\n // we may not have hit the actual limit if there are encoded bytes...\n if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) }\n p = i\n if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) {\n // yep, we actually did hit the limit\n this._checkingBytes = false\n this._keyTrunc = true\n }\n } else {\n if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) }\n p = len\n }\n } else {\n idxamp = undefined\n for (i = p; i < len; ++i) {\n if (!this._checkingBytes) { ++p }\n if (data[i] === 0x26/* & */) {\n idxamp = i\n break\n }\n if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) {\n this._hitLimit = true\n break\n } else if (this._checkingBytes) { ++this._bytesVal }\n }\n\n if (idxamp !== undefined) {\n ++this._fields\n if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) }\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n decodeText(this._val, 'binary', this.charset),\n this._keyTrunc,\n this._valTrunc)\n this._state = 'key'\n\n this._hitLimit = false\n this._checkingBytes = true\n this._key = ''\n this._bytesKey = 0\n this._keyTrunc = false\n this.decoder.reset()\n\n p = idxamp + 1\n if (this._fields === this.fieldsLimit) { return cb() }\n } else if (this._hitLimit) {\n // we may not have hit the actual limit if there are encoded bytes...\n if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) }\n p = i\n if ((this._val === '' && this.fieldSizeLimit === 0) ||\n (this._bytesVal = this._val.length) === this.fieldSizeLimit) {\n // yep, we actually did hit the limit\n this._checkingBytes = false\n this._valTrunc = true\n }\n } else {\n if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) }\n p = len\n }\n }\n }\n cb()\n}\n\nUrlEncoded.prototype.end = function () {\n if (this.boy._done) { return }\n\n if (this._state === 'key' && this._key.length > 0) {\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n '',\n this._keyTrunc,\n false)\n } else if (this._state === 'val') {\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n decodeText(this._val, 'binary', this.charset),\n this._keyTrunc,\n this._valTrunc)\n }\n this.boy._done = true\n this.boy.emit('finish')\n}\n\nmodule.exports = UrlEncoded\n","'use strict'\n\nconst RE_PLUS = /\\+/g\n\nconst HEX = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,\n 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n]\n\nfunction Decoder () {\n this.buffer = undefined\n}\nDecoder.prototype.write = function (str) {\n // Replace '+' with ' ' before decoding\n str = str.replace(RE_PLUS, ' ')\n let res = ''\n let i = 0; let p = 0; const len = str.length\n for (; i < len; ++i) {\n if (this.buffer !== undefined) {\n if (!HEX[str.charCodeAt(i)]) {\n res += '%' + this.buffer\n this.buffer = undefined\n --i // retry character\n } else {\n this.buffer += str[i]\n ++p\n if (this.buffer.length === 2) {\n res += String.fromCharCode(parseInt(this.buffer, 16))\n this.buffer = undefined\n }\n }\n } else if (str[i] === '%') {\n if (i > p) {\n res += str.substring(p, i)\n p = i\n }\n this.buffer = ''\n ++p\n }\n }\n if (p < len && this.buffer === undefined) { res += str.substring(p) }\n return res\n}\nDecoder.prototype.reset = function () {\n this.buffer = undefined\n}\n\nmodule.exports = Decoder\n","'use strict'\n\nmodule.exports = function basename (path) {\n if (typeof path !== 'string') { return '' }\n for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var\n switch (path.charCodeAt(i)) {\n case 0x2F: // '/'\n case 0x5C: // '\\'\n path = path.slice(i + 1)\n return (path === '..' || path === '.' ? '' : path)\n }\n }\n return (path === '..' || path === '.' ? '' : path)\n}\n","'use strict'\n\n// Node has always utf-8\nconst utf8Decoder = new TextDecoder('utf-8')\nconst textDecoders = new Map([\n ['utf-8', utf8Decoder],\n ['utf8', utf8Decoder]\n])\n\nfunction getDecoder (charset) {\n let lc\n while (true) {\n switch (charset) {\n case 'utf-8':\n case 'utf8':\n return decoders.utf8\n case 'latin1':\n case 'ascii': // TODO: Make these a separate, strict decoder?\n case 'us-ascii':\n case 'iso-8859-1':\n case 'iso8859-1':\n case 'iso88591':\n case 'iso_8859-1':\n case 'windows-1252':\n case 'iso_8859-1:1987':\n case 'cp1252':\n case 'x-cp1252':\n return decoders.latin1\n case 'utf16le':\n case 'utf-16le':\n case 'ucs2':\n case 'ucs-2':\n return decoders.utf16le\n case 'base64':\n return decoders.base64\n default:\n if (lc === undefined) {\n lc = true\n charset = charset.toLowerCase()\n continue\n }\n return decoders.other.bind(charset)\n }\n }\n}\n\nconst decoders = {\n utf8: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n return data.utf8Slice(0, data.length)\n },\n\n latin1: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n return data\n }\n return data.latin1Slice(0, data.length)\n },\n\n utf16le: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n return data.ucs2Slice(0, data.length)\n },\n\n base64: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n return data.base64Slice(0, data.length)\n },\n\n other: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n\n if (textDecoders.has(this.toString())) {\n try {\n return textDecoders.get(this).decode(data)\n } catch (e) { }\n }\n return typeof data === 'string'\n ? data\n : data.toString()\n }\n}\n\nfunction decodeText (text, sourceEncoding, destEncoding) {\n if (text) {\n return getDecoder(destEncoding)(text, sourceEncoding)\n }\n return text\n}\n\nmodule.exports = decodeText\n","'use strict'\n\nmodule.exports = function getLimit (limits, name, defaultLimit) {\n if (\n !limits ||\n limits[name] === undefined ||\n limits[name] === null\n ) { return defaultLimit }\n\n if (\n typeof limits[name] !== 'number' ||\n isNaN(limits[name])\n ) { throw new TypeError('Limit ' + name + ' is not a valid number') }\n\n return limits[name]\n}\n","/* eslint-disable object-property-newline */\n'use strict'\n\nconst decodeText = require('./decodeText')\n\nconst RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g\n\nconst EncodedLookup = {\n '%00': '\\x00', '%01': '\\x01', '%02': '\\x02', '%03': '\\x03', '%04': '\\x04',\n '%05': '\\x05', '%06': '\\x06', '%07': '\\x07', '%08': '\\x08', '%09': '\\x09',\n '%0a': '\\x0a', '%0A': '\\x0a', '%0b': '\\x0b', '%0B': '\\x0b', '%0c': '\\x0c',\n '%0C': '\\x0c', '%0d': '\\x0d', '%0D': '\\x0d', '%0e': '\\x0e', '%0E': '\\x0e',\n '%0f': '\\x0f', '%0F': '\\x0f', '%10': '\\x10', '%11': '\\x11', '%12': '\\x12',\n '%13': '\\x13', '%14': '\\x14', '%15': '\\x15', '%16': '\\x16', '%17': '\\x17',\n '%18': '\\x18', '%19': '\\x19', '%1a': '\\x1a', '%1A': '\\x1a', '%1b': '\\x1b',\n '%1B': '\\x1b', '%1c': '\\x1c', '%1C': '\\x1c', '%1d': '\\x1d', '%1D': '\\x1d',\n '%1e': '\\x1e', '%1E': '\\x1e', '%1f': '\\x1f', '%1F': '\\x1f', '%20': '\\x20',\n '%21': '\\x21', '%22': '\\x22', '%23': '\\x23', '%24': '\\x24', '%25': '\\x25',\n '%26': '\\x26', '%27': '\\x27', '%28': '\\x28', '%29': '\\x29', '%2a': '\\x2a',\n '%2A': '\\x2a', '%2b': '\\x2b', '%2B': '\\x2b', '%2c': '\\x2c', '%2C': '\\x2c',\n '%2d': '\\x2d', '%2D': '\\x2d', '%2e': '\\x2e', '%2E': '\\x2e', '%2f': '\\x2f',\n '%2F': '\\x2f', '%30': '\\x30', '%31': '\\x31', '%32': '\\x32', '%33': '\\x33',\n '%34': '\\x34', '%35': '\\x35', '%36': '\\x36', '%37': '\\x37', '%38': '\\x38',\n '%39': '\\x39', '%3a': '\\x3a', '%3A': '\\x3a', '%3b': '\\x3b', '%3B': '\\x3b',\n '%3c': '\\x3c', '%3C': '\\x3c', '%3d': '\\x3d', '%3D': '\\x3d', '%3e': '\\x3e',\n '%3E': '\\x3e', '%3f': '\\x3f', '%3F': '\\x3f', '%40': '\\x40', '%41': '\\x41',\n '%42': '\\x42', '%43': '\\x43', '%44': '\\x44', '%45': '\\x45', '%46': '\\x46',\n '%47': '\\x47', '%48': '\\x48', '%49': '\\x49', '%4a': '\\x4a', '%4A': '\\x4a',\n '%4b': '\\x4b', '%4B': '\\x4b', '%4c': '\\x4c', '%4C': '\\x4c', '%4d': '\\x4d',\n '%4D': '\\x4d', '%4e': '\\x4e', '%4E': '\\x4e', '%4f': '\\x4f', '%4F': '\\x4f',\n '%50': '\\x50', '%51': '\\x51', '%52': '\\x52', '%53': '\\x53', '%54': '\\x54',\n '%55': '\\x55', '%56': '\\x56', '%57': '\\x57', '%58': '\\x58', '%59': '\\x59',\n '%5a': '\\x5a', '%5A': '\\x5a', '%5b': '\\x5b', '%5B': '\\x5b', '%5c': '\\x5c',\n '%5C': '\\x5c', '%5d': '\\x5d', '%5D': '\\x5d', '%5e': '\\x5e', '%5E': '\\x5e',\n '%5f': '\\x5f', '%5F': '\\x5f', '%60': '\\x60', '%61': '\\x61', '%62': '\\x62',\n '%63': '\\x63', '%64': '\\x64', '%65': '\\x65', '%66': '\\x66', '%67': '\\x67',\n '%68': '\\x68', '%69': '\\x69', '%6a': '\\x6a', '%6A': '\\x6a', '%6b': '\\x6b',\n '%6B': '\\x6b', '%6c': '\\x6c', '%6C': '\\x6c', '%6d': '\\x6d', '%6D': '\\x6d',\n '%6e': '\\x6e', '%6E': '\\x6e', '%6f': '\\x6f', '%6F': '\\x6f', '%70': '\\x70',\n '%71': '\\x71', '%72': '\\x72', '%73': '\\x73', '%74': '\\x74', '%75': '\\x75',\n '%76': '\\x76', '%77': '\\x77', '%78': '\\x78', '%79': '\\x79', '%7a': '\\x7a',\n '%7A': '\\x7a', '%7b': '\\x7b', '%7B': '\\x7b', '%7c': '\\x7c', '%7C': '\\x7c',\n '%7d': '\\x7d', '%7D': '\\x7d', '%7e': '\\x7e', '%7E': '\\x7e', '%7f': '\\x7f',\n '%7F': '\\x7f', '%80': '\\x80', '%81': '\\x81', '%82': '\\x82', '%83': '\\x83',\n '%84': '\\x84', '%85': '\\x85', '%86': '\\x86', '%87': '\\x87', '%88': '\\x88',\n '%89': '\\x89', '%8a': '\\x8a', '%8A': '\\x8a', '%8b': '\\x8b', '%8B': '\\x8b',\n '%8c': '\\x8c', '%8C': '\\x8c', '%8d': '\\x8d', '%8D': '\\x8d', '%8e': '\\x8e',\n '%8E': '\\x8e', '%8f': '\\x8f', '%8F': '\\x8f', '%90': '\\x90', '%91': '\\x91',\n '%92': '\\x92', '%93': '\\x93', '%94': '\\x94', '%95': '\\x95', '%96': '\\x96',\n '%97': '\\x97', '%98': '\\x98', '%99': '\\x99', '%9a': '\\x9a', '%9A': '\\x9a',\n '%9b': '\\x9b', '%9B': '\\x9b', '%9c': '\\x9c', '%9C': '\\x9c', '%9d': '\\x9d',\n '%9D': '\\x9d', '%9e': '\\x9e', '%9E': '\\x9e', '%9f': '\\x9f', '%9F': '\\x9f',\n '%a0': '\\xa0', '%A0': '\\xa0', '%a1': '\\xa1', '%A1': '\\xa1', '%a2': '\\xa2',\n '%A2': '\\xa2', '%a3': '\\xa3', '%A3': '\\xa3', '%a4': '\\xa4', '%A4': '\\xa4',\n '%a5': '\\xa5', '%A5': '\\xa5', '%a6': '\\xa6', '%A6': '\\xa6', '%a7': '\\xa7',\n '%A7': '\\xa7', '%a8': '\\xa8', '%A8': '\\xa8', '%a9': '\\xa9', '%A9': '\\xa9',\n '%aa': '\\xaa', '%Aa': '\\xaa', '%aA': '\\xaa', '%AA': '\\xaa', '%ab': '\\xab',\n '%Ab': '\\xab', '%aB': '\\xab', '%AB': '\\xab', '%ac': '\\xac', '%Ac': '\\xac',\n '%aC': '\\xac', '%AC': '\\xac', '%ad': '\\xad', '%Ad': '\\xad', '%aD': '\\xad',\n '%AD': '\\xad', '%ae': '\\xae', '%Ae': '\\xae', '%aE': '\\xae', '%AE': '\\xae',\n '%af': '\\xaf', '%Af': '\\xaf', '%aF': '\\xaf', '%AF': '\\xaf', '%b0': '\\xb0',\n '%B0': '\\xb0', '%b1': '\\xb1', '%B1': '\\xb1', '%b2': '\\xb2', '%B2': '\\xb2',\n '%b3': '\\xb3', '%B3': '\\xb3', '%b4': '\\xb4', '%B4': '\\xb4', '%b5': '\\xb5',\n '%B5': '\\xb5', '%b6': '\\xb6', '%B6': '\\xb6', '%b7': '\\xb7', '%B7': '\\xb7',\n '%b8': '\\xb8', '%B8': '\\xb8', '%b9': '\\xb9', '%B9': '\\xb9', '%ba': '\\xba',\n '%Ba': '\\xba', '%bA': '\\xba', '%BA': '\\xba', '%bb': '\\xbb', '%Bb': '\\xbb',\n '%bB': '\\xbb', '%BB': '\\xbb', '%bc': '\\xbc', '%Bc': '\\xbc', '%bC': '\\xbc',\n '%BC': '\\xbc', '%bd': '\\xbd', '%Bd': '\\xbd', '%bD': '\\xbd', '%BD': '\\xbd',\n '%be': '\\xbe', '%Be': '\\xbe', '%bE': '\\xbe', '%BE': '\\xbe', '%bf': '\\xbf',\n '%Bf': '\\xbf', '%bF': '\\xbf', '%BF': '\\xbf', '%c0': '\\xc0', '%C0': '\\xc0',\n '%c1': '\\xc1', '%C1': '\\xc1', '%c2': '\\xc2', '%C2': '\\xc2', '%c3': '\\xc3',\n '%C3': '\\xc3', '%c4': '\\xc4', '%C4': '\\xc4', '%c5': '\\xc5', '%C5': '\\xc5',\n '%c6': '\\xc6', '%C6': '\\xc6', '%c7': '\\xc7', '%C7': '\\xc7', '%c8': '\\xc8',\n '%C8': '\\xc8', '%c9': '\\xc9', '%C9': '\\xc9', '%ca': '\\xca', '%Ca': '\\xca',\n '%cA': '\\xca', '%CA': '\\xca', '%cb': '\\xcb', '%Cb': '\\xcb', '%cB': '\\xcb',\n '%CB': '\\xcb', '%cc': '\\xcc', '%Cc': '\\xcc', '%cC': '\\xcc', '%CC': '\\xcc',\n '%cd': '\\xcd', '%Cd': '\\xcd', '%cD': '\\xcd', '%CD': '\\xcd', '%ce': '\\xce',\n '%Ce': '\\xce', '%cE': '\\xce', '%CE': '\\xce', '%cf': '\\xcf', '%Cf': '\\xcf',\n '%cF': '\\xcf', '%CF': '\\xcf', '%d0': '\\xd0', '%D0': '\\xd0', '%d1': '\\xd1',\n '%D1': '\\xd1', '%d2': '\\xd2', '%D2': '\\xd2', '%d3': '\\xd3', '%D3': '\\xd3',\n '%d4': '\\xd4', '%D4': '\\xd4', '%d5': '\\xd5', '%D5': '\\xd5', '%d6': '\\xd6',\n '%D6': '\\xd6', '%d7': '\\xd7', '%D7': '\\xd7', '%d8': '\\xd8', '%D8': '\\xd8',\n '%d9': '\\xd9', '%D9': '\\xd9', '%da': '\\xda', '%Da': '\\xda', '%dA': '\\xda',\n '%DA': '\\xda', '%db': '\\xdb', '%Db': '\\xdb', '%dB': '\\xdb', '%DB': '\\xdb',\n '%dc': '\\xdc', '%Dc': '\\xdc', '%dC': '\\xdc', '%DC': '\\xdc', '%dd': '\\xdd',\n '%Dd': '\\xdd', '%dD': '\\xdd', '%DD': '\\xdd', '%de': '\\xde', '%De': '\\xde',\n '%dE': '\\xde', '%DE': '\\xde', '%df': '\\xdf', '%Df': '\\xdf', '%dF': '\\xdf',\n '%DF': '\\xdf', '%e0': '\\xe0', '%E0': '\\xe0', '%e1': '\\xe1', '%E1': '\\xe1',\n '%e2': '\\xe2', '%E2': '\\xe2', '%e3': '\\xe3', '%E3': '\\xe3', '%e4': '\\xe4',\n '%E4': '\\xe4', '%e5': '\\xe5', '%E5': '\\xe5', '%e6': '\\xe6', '%E6': '\\xe6',\n '%e7': '\\xe7', '%E7': '\\xe7', '%e8': '\\xe8', '%E8': '\\xe8', '%e9': '\\xe9',\n '%E9': '\\xe9', '%ea': '\\xea', '%Ea': '\\xea', '%eA': '\\xea', '%EA': '\\xea',\n '%eb': '\\xeb', '%Eb': '\\xeb', '%eB': '\\xeb', '%EB': '\\xeb', '%ec': '\\xec',\n '%Ec': '\\xec', '%eC': '\\xec', '%EC': '\\xec', '%ed': '\\xed', '%Ed': '\\xed',\n '%eD': '\\xed', '%ED': '\\xed', '%ee': '\\xee', '%Ee': '\\xee', '%eE': '\\xee',\n '%EE': '\\xee', '%ef': '\\xef', '%Ef': '\\xef', '%eF': '\\xef', '%EF': '\\xef',\n '%f0': '\\xf0', '%F0': '\\xf0', '%f1': '\\xf1', '%F1': '\\xf1', '%f2': '\\xf2',\n '%F2': '\\xf2', '%f3': '\\xf3', '%F3': '\\xf3', '%f4': '\\xf4', '%F4': '\\xf4',\n '%f5': '\\xf5', '%F5': '\\xf5', '%f6': '\\xf6', '%F6': '\\xf6', '%f7': '\\xf7',\n '%F7': '\\xf7', '%f8': '\\xf8', '%F8': '\\xf8', '%f9': '\\xf9', '%F9': '\\xf9',\n '%fa': '\\xfa', '%Fa': '\\xfa', '%fA': '\\xfa', '%FA': '\\xfa', '%fb': '\\xfb',\n '%Fb': '\\xfb', '%fB': '\\xfb', '%FB': '\\xfb', '%fc': '\\xfc', '%Fc': '\\xfc',\n '%fC': '\\xfc', '%FC': '\\xfc', '%fd': '\\xfd', '%Fd': '\\xfd', '%fD': '\\xfd',\n '%FD': '\\xfd', '%fe': '\\xfe', '%Fe': '\\xfe', '%fE': '\\xfe', '%FE': '\\xfe',\n '%ff': '\\xff', '%Ff': '\\xff', '%fF': '\\xff', '%FF': '\\xff'\n}\n\nfunction encodedReplacer (match) {\n return EncodedLookup[match]\n}\n\nconst STATE_KEY = 0\nconst STATE_VALUE = 1\nconst STATE_CHARSET = 2\nconst STATE_LANG = 3\n\nfunction parseParams (str) {\n const res = []\n let state = STATE_KEY\n let charset = ''\n let inquote = false\n let escaping = false\n let p = 0\n let tmp = ''\n const len = str.length\n\n for (var i = 0; i < len; ++i) { // eslint-disable-line no-var\n const char = str[i]\n if (char === '\\\\' && inquote) {\n if (escaping) { escaping = false } else {\n escaping = true\n continue\n }\n } else if (char === '\"') {\n if (!escaping) {\n if (inquote) {\n inquote = false\n state = STATE_KEY\n } else { inquote = true }\n continue\n } else { escaping = false }\n } else {\n if (escaping && inquote) { tmp += '\\\\' }\n escaping = false\n if ((state === STATE_CHARSET || state === STATE_LANG) && char === \"'\") {\n if (state === STATE_CHARSET) {\n state = STATE_LANG\n charset = tmp.substring(1)\n } else { state = STATE_VALUE }\n tmp = ''\n continue\n } else if (state === STATE_KEY &&\n (char === '*' || char === '=') &&\n res.length) {\n state = char === '*'\n ? STATE_CHARSET\n : STATE_VALUE\n res[p] = [tmp, undefined]\n tmp = ''\n continue\n } else if (!inquote && char === ';') {\n state = STATE_KEY\n if (charset) {\n if (tmp.length) {\n tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),\n 'binary',\n charset)\n }\n charset = ''\n } else if (tmp.length) {\n tmp = decodeText(tmp, 'binary', 'utf8')\n }\n if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp }\n tmp = ''\n ++p\n continue\n } else if (!inquote && (char === ' ' || char === '\\t')) { continue }\n }\n tmp += char\n }\n if (charset && tmp.length) {\n tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),\n 'binary',\n charset)\n } else if (tmp) {\n tmp = decodeText(tmp, 'binary', 'utf8')\n }\n\n if (res[p] === undefined) {\n if (tmp) { res[p] = tmp }\n } else { res[p][1] = tmp }\n\n return res\n}\n\nmodule.exports = parseParams\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tvar threw = true;\n\ttry {\n\t\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\t\tthrew = false;\n\t} finally {\n\t\tif(threw) delete __webpack_module_cache__[moduleId];\n\t}\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","\nif (typeof __webpack_require__ !== 'undefined') __webpack_require__.ab = __dirname + \"/\";","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(94822);\n",""],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/licenses.txt b/dist/licenses.txt index b119c30..5b85361 100644 --- a/dist/licenses.txt +++ b/dist/licenses.txt @@ -47,8 +47,9 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -@aws-cdk/cfnspec +@aws-cdk/aws-service-spec Apache-2.0 + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -237,7 +238,7 @@ Apache-2.0 same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -662,6 +663,212 @@ Apache-2.0 limitations under the License. +@aws-cdk/service-spec-types +Apache-2.0 + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + @aws-crypto/crc32 Apache-2.0 Apache License @@ -5167,7 +5374,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License. -@aws-sdk/types +@aws-sdk/util-endpoints Apache-2.0 Apache License Version 2.0, January 2004 @@ -5371,9 +5578,9 @@ Apache License See the License for the specific language governing permissions and limitations under the License. -@aws-sdk/util-endpoints +@aws-sdk/util-user-agent-node Apache-2.0 -Apache License + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -5575,9 +5782,10 @@ Apache License See the License for the specific language governing permissions and limitations under the License. -@aws-sdk/util-user-agent-node + +@aws-sdk/util-utf8-browser Apache-2.0 - Apache License +Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -5779,10 +5987,10 @@ Apache-2.0 See the License for the specific language governing permissions and limitations under the License. - -@aws-sdk/util-utf8-browser +@cdklabs/tskb Apache-2.0 -Apache License + + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -5962,7 +6170,7 @@ Apache License APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -5970,7 +6178,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -5984,6 +6192,7 @@ Apache License See the License for the specific language governing permissions and limitations under the License. + @fastify/busboy MIT Copyright Brian White. All rights reserved. @@ -11697,6 +11906,210 @@ Apache-2.0 limitations under the License. +@smithy/util-endpoints +Apache-2.0 +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + @smithy/util-hex-encoding Apache-2.0 Apache License diff --git a/package.json b/package.json index 0cedc0d..1c4d924 100644 --- a/package.json +++ b/package.json @@ -26,10 +26,10 @@ "organization": false }, "devDependencies": { - "@swc/core": "^1.3.95", + "@swc/core": "^1.3.96", "@swc/jest": "^0.2.29", - "@types/fs-extra": "^11.0.3", - "@types/jest": "^29.5.6", + "@types/fs-extra": "^11.0.4", + "@types/jest": "^29.5.8", "@types/mock-fs": "^4", "@types/node": "^18", "@typescript-eslint/eslint-plugin": "^6", @@ -37,16 +37,16 @@ "@vercel/ncc": "^0.38.1", "action-docs": "^1.2.0", "aws-sdk-client-mock": "^3.0.0", + "constructs": "^10.0.0", "eslint": "^8", - "eslint-import-resolver-node": "^0.3.9", "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-import": "^2.28.1", + "eslint-plugin-import": "^2.29.0", "jest": "^29.7.0", "jest-junit": "^15", "mock-fs": "^5", "npm-check-updates": "^16", - "projen": "^0.76.0", - "projen-github-action-typescript": "^0.0.392", + "projen": "^0.76.27", + "projen-github-action-typescript": "^0.0.395", "standard-version": "^9", "ts-jest": "^29.1.1", "ts-node": "^10.9.1", @@ -58,12 +58,12 @@ "@actions/github": "^6.0.0", "@actions/io": "^1.1.3", "@actions/tool-cache": "^2.0.0", - "@aws-cdk/cloud-assembly-schema": "^2.103.1", - "@aws-cdk/cloudformation-diff": "^2.103.1", - "@aws-sdk/client-cloudformation": "^3.437.0", - "@aws-sdk/credential-providers": "^3.437.0", + "@aws-cdk/cloud-assembly-schema": "^2.107.0", + "@aws-cdk/cloudformation-diff": "^2.107.0", + "@aws-sdk/client-cloudformation": "^3.450.0", + "@aws-sdk/credential-providers": "^3.450.0", "@octokit/webhooks-definitions": "^3.67.3", - "@smithy/types": "^2.4.0", + "@smithy/types": "^2.5.0", "chalk": "^4", "fs-extra": "^11.1.1" }, diff --git a/yarn.lock b/yarn.lock index 73c386c..e32ba36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -65,34 +65,42 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@aws-cdk/cfnspec@2.103.1-alpha.0": - version "2.103.1-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/cfnspec/-/cfnspec-2.103.1-alpha.0.tgz#4a5a0fd46d187a6b6a8b82c18607282ca67e3e20" - integrity sha512-57jRkYmmZgeFkkqacPrstIPIeKmbSBro1koC/qjRDg65YJfIdruXzzE5M3Cv0rhk4lcPGsyzobJ4szAOFF6pQQ== +"@aws-cdk/aws-service-spec@^0.0.26": + version "0.0.26" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-service-spec/-/aws-service-spec-0.0.26.tgz#0031f1dad37018222dbe5a0fcc0f1b3af78bf9f8" + integrity sha512-GHqTx1qTSBk9C008x7dxKuoV/J2FLPT4KDAhLAHa9ux5wb7eWy+3aXZNEOv0LDMh2G0HcZ5pBkOH+dIUBqADLA== dependencies: - fs-extra "^9.1.0" - md5 "^2.3.0" + "@aws-cdk/service-spec-types" "^0.0.26" + "@cdklabs/tskb" "^0.0.3" -"@aws-cdk/cloud-assembly-schema@^2.103.1": - version "2.103.1" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-2.103.1.tgz#160fcc567ddce2080ea387f0662afc74ef4305be" - integrity sha512-suG6LI7lW1OTWd+STusIFTNy+nM+NftBRFqz6cj+qMDNYVEF38sckY0EmvdRxlA+58Ddg3NS7B6gZyNJZ69Gqw== +"@aws-cdk/cloud-assembly-schema@^2.107.0": + version "2.107.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-2.107.0.tgz#616922ce3b00597cf61beb649bd30cc4fd2254c1" + integrity sha512-CHkNSuQzhEMTPU0dS/+6hnMoDMoxwSgKb4aCBrw3mfNQuUa0Lhoi20PE1zv3bAQRYSfacoBCVacHUQLe18dMtw== dependencies: jsonschema "^1.4.1" semver "^7.5.4" -"@aws-cdk/cloudformation-diff@^2.103.1": - version "2.103.1" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloudformation-diff/-/cloudformation-diff-2.103.1.tgz#456d22ed45dd5350c6971b9f5045f9542a7e2533" - integrity sha512-U8hSla3i1Jd1Vhh+8tzVYWyGm/wkuY3wUfVTif0gNAnPgInhw/dFTOKLEeryhLbVT1xHAHaFWcemDUuwrnmDKw== +"@aws-cdk/cloudformation-diff@^2.107.0": + version "2.107.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/cloudformation-diff/-/cloudformation-diff-2.107.0.tgz#a1277de904c83abaca2eca820b4ccc275d950085" + integrity sha512-BLSJqHHMU8ugcKfTZiU3K/xi2L4epYpVeDR6k5kmY340jXCRigJor1rgkqnWSGjj9MThDDnGvYEYVA7MFFfcig== dependencies: - "@aws-cdk/cfnspec" "2.103.1-alpha.0" + "@aws-cdk/aws-service-spec" "^0.0.26" + "@aws-cdk/service-spec-types" "^0.0.26" chalk "^4" diff "^5.1.0" fast-deep-equal "^3.1.3" string-width "^4.2.3" table "^6.8.1" +"@aws-cdk/service-spec-types@^0.0.26": + version "0.0.26" + resolved "https://registry.yarnpkg.com/@aws-cdk/service-spec-types/-/service-spec-types-0.0.26.tgz#a00d43361767664bad022ad4e742d94cbf2f45e0" + integrity sha512-zjn8tfrazrzh97khRabWRaGuqPZbTFaIMC74W3/Pe789WM+S4t/cRtqQNfxk1puSMwzhxpsluBLY1PfszIhGtg== + dependencies: + "@cdklabs/tskb" "^0.0.3" + "@aws-crypto/crc32@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" @@ -148,26 +156,26 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-sdk/client-cloudformation@^3.437.0": - version "3.437.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudformation/-/client-cloudformation-3.437.0.tgz#157c8fd5a117cf69e1307588779250e8968c1651" - integrity sha512-QzoDkQXv0ybXfAlURSAH9HQzoOUgMid3O1fnwAMX61A0lB/EddSbi3pWRHe+YfqYT9k/F986h7dEw1Gb022hqg== +"@aws-sdk/client-cloudformation@^3.450.0": + version "3.450.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudformation/-/client-cloudformation-3.450.0.tgz#535dd3b48f227d848d4474826c0de751e86cd21e" + integrity sha512-7Smx4DPYPomhOY4JF8HN2ZWeMjk+LN5mW/78yrDvxZOV9UXPAPzStAJ82o+nbGQphqJO98ukXbQWcBjcFaTSYg== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.437.0" - "@aws-sdk/core" "3.436.0" - "@aws-sdk/credential-provider-node" "3.437.0" - "@aws-sdk/middleware-host-header" "3.433.0" - "@aws-sdk/middleware-logger" "3.433.0" - "@aws-sdk/middleware-recursion-detection" "3.433.0" - "@aws-sdk/middleware-signing" "3.433.0" - "@aws-sdk/middleware-user-agent" "3.433.0" + "@aws-sdk/client-sts" "3.450.0" + "@aws-sdk/core" "3.445.0" + "@aws-sdk/credential-provider-node" "3.450.0" + "@aws-sdk/middleware-host-header" "3.449.0" + "@aws-sdk/middleware-logger" "3.449.0" + "@aws-sdk/middleware-recursion-detection" "3.449.0" + "@aws-sdk/middleware-signing" "3.449.0" + "@aws-sdk/middleware-user-agent" "3.449.0" "@aws-sdk/region-config-resolver" "3.433.0" - "@aws-sdk/types" "3.433.0" - "@aws-sdk/util-endpoints" "3.433.0" - "@aws-sdk/util-user-agent-browser" "3.433.0" - "@aws-sdk/util-user-agent-node" "3.437.0" + "@aws-sdk/types" "3.449.0" + "@aws-sdk/util-endpoints" "3.449.0" + "@aws-sdk/util-user-agent-browser" "3.449.0" + "@aws-sdk/util-user-agent-node" "3.449.0" "@smithy/config-resolver" "^2.0.16" "@smithy/fetch-http-handler" "^2.2.4" "@smithy/hash-node" "^2.0.12" @@ -188,6 +196,7 @@ "@smithy/util-body-length-node" "^2.1.0" "@smithy/util-defaults-mode-browser" "^2.0.16" "@smithy/util-defaults-mode-node" "^2.0.21" + "@smithy/util-endpoints" "^1.0.2" "@smithy/util-retry" "^2.0.5" "@smithy/util-utf8" "^2.0.0" "@smithy/util-waiter" "^2.0.12" @@ -195,26 +204,26 @@ tslib "^2.5.0" uuid "^8.3.2" -"@aws-sdk/client-cognito-identity@3.437.0": - version "3.437.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.437.0.tgz#3085501e6e90e381efa3e167c14118f7fa02bf9a" - integrity sha512-7mI0WT21ru2H6T13J5xNHMIE/dXj1tEeObvwAvUcwQl1J1ZKzFFM/fth3AHX+KACJJ/B5WD+xiTuv62/SXE7AA== +"@aws-sdk/client-cognito-identity@3.450.0": + version "3.450.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.450.0.tgz#551e811d23dcb9f62d8f0dc02e6c7467bbc1bc1f" + integrity sha512-CO04SicNOQApzmoRbR3y9xACeh8j2xichrotlRYdYj8Yf/9XUyyTDEBoMpaXe3jmAlD+Q6+fOW86MckTVMFKww== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.437.0" - "@aws-sdk/core" "3.436.0" - "@aws-sdk/credential-provider-node" "3.437.0" - "@aws-sdk/middleware-host-header" "3.433.0" - "@aws-sdk/middleware-logger" "3.433.0" - "@aws-sdk/middleware-recursion-detection" "3.433.0" - "@aws-sdk/middleware-signing" "3.433.0" - "@aws-sdk/middleware-user-agent" "3.433.0" + "@aws-sdk/client-sts" "3.450.0" + "@aws-sdk/core" "3.445.0" + "@aws-sdk/credential-provider-node" "3.450.0" + "@aws-sdk/middleware-host-header" "3.449.0" + "@aws-sdk/middleware-logger" "3.449.0" + "@aws-sdk/middleware-recursion-detection" "3.449.0" + "@aws-sdk/middleware-signing" "3.449.0" + "@aws-sdk/middleware-user-agent" "3.449.0" "@aws-sdk/region-config-resolver" "3.433.0" - "@aws-sdk/types" "3.433.0" - "@aws-sdk/util-endpoints" "3.433.0" - "@aws-sdk/util-user-agent-browser" "3.433.0" - "@aws-sdk/util-user-agent-node" "3.437.0" + "@aws-sdk/types" "3.449.0" + "@aws-sdk/util-endpoints" "3.449.0" + "@aws-sdk/util-user-agent-browser" "3.449.0" + "@aws-sdk/util-user-agent-node" "3.449.0" "@smithy/config-resolver" "^2.0.16" "@smithy/fetch-http-handler" "^2.2.4" "@smithy/hash-node" "^2.0.12" @@ -235,27 +244,28 @@ "@smithy/util-body-length-node" "^2.1.0" "@smithy/util-defaults-mode-browser" "^2.0.16" "@smithy/util-defaults-mode-node" "^2.0.21" + "@smithy/util-endpoints" "^1.0.2" "@smithy/util-retry" "^2.0.5" "@smithy/util-utf8" "^2.0.0" tslib "^2.5.0" -"@aws-sdk/client-sso@3.437.0": - version "3.437.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.437.0.tgz#25114f5fd734f5c897dd000575cfc051b9e3a9b2" - integrity sha512-AxlLWz9ec3b8Bt+RqRb2Q1ucGQtKrLdKDna+UTjz7AouB/jpoMiegV9NHXVX64N6YFnQnvB0UEGigXiOQE+y/g== +"@aws-sdk/client-sso@3.450.0": + version "3.450.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.450.0.tgz#107f4a389f4113bf4440df4db8639c2414ec7b7e" + integrity sha512-xutima6DhrTLMyBc1nmLhWXarvrqbH1zizrQpG7cLdwfqHEOi3thR3SWu+pUC4XN9kiXQUb2HUMcv/vdqmknkQ== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/core" "3.436.0" - "@aws-sdk/middleware-host-header" "3.433.0" - "@aws-sdk/middleware-logger" "3.433.0" - "@aws-sdk/middleware-recursion-detection" "3.433.0" - "@aws-sdk/middleware-user-agent" "3.433.0" + "@aws-sdk/core" "3.445.0" + "@aws-sdk/middleware-host-header" "3.449.0" + "@aws-sdk/middleware-logger" "3.449.0" + "@aws-sdk/middleware-recursion-detection" "3.449.0" + "@aws-sdk/middleware-user-agent" "3.449.0" "@aws-sdk/region-config-resolver" "3.433.0" - "@aws-sdk/types" "3.433.0" - "@aws-sdk/util-endpoints" "3.433.0" - "@aws-sdk/util-user-agent-browser" "3.433.0" - "@aws-sdk/util-user-agent-node" "3.437.0" + "@aws-sdk/types" "3.449.0" + "@aws-sdk/util-endpoints" "3.449.0" + "@aws-sdk/util-user-agent-browser" "3.449.0" + "@aws-sdk/util-user-agent-node" "3.449.0" "@smithy/config-resolver" "^2.0.16" "@smithy/fetch-http-handler" "^2.2.4" "@smithy/hash-node" "^2.0.12" @@ -276,30 +286,31 @@ "@smithy/util-body-length-node" "^2.1.0" "@smithy/util-defaults-mode-browser" "^2.0.16" "@smithy/util-defaults-mode-node" "^2.0.21" + "@smithy/util-endpoints" "^1.0.2" "@smithy/util-retry" "^2.0.5" "@smithy/util-utf8" "^2.0.0" tslib "^2.5.0" -"@aws-sdk/client-sts@3.437.0": - version "3.437.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.437.0.tgz#d0842b58c52858cdef7f979da2672192897db4d5" - integrity sha512-ilLcrCVwH81UbKNpB9Vax1Fw/mNx2d/bWXkCNXPvrExO+K39VFGS/VijOuSrru2iBq844NlG3uQV8DL/nbiKdA== +"@aws-sdk/client-sts@3.450.0": + version "3.450.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.450.0.tgz#08aefc9af12b3f74332615869fe644e68952d41b" + integrity sha512-pHZ/3NHHtK5YbjYrh2jT8eePSYSunyvcIhdASMqYVg3Enw/BxA0IKL8bZ/slolhqR1sAQx4sKRAO7dZK418Q6w== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/core" "3.436.0" - "@aws-sdk/credential-provider-node" "3.437.0" - "@aws-sdk/middleware-host-header" "3.433.0" - "@aws-sdk/middleware-logger" "3.433.0" - "@aws-sdk/middleware-recursion-detection" "3.433.0" - "@aws-sdk/middleware-sdk-sts" "3.433.0" - "@aws-sdk/middleware-signing" "3.433.0" - "@aws-sdk/middleware-user-agent" "3.433.0" + "@aws-sdk/core" "3.445.0" + "@aws-sdk/credential-provider-node" "3.450.0" + "@aws-sdk/middleware-host-header" "3.449.0" + "@aws-sdk/middleware-logger" "3.449.0" + "@aws-sdk/middleware-recursion-detection" "3.449.0" + "@aws-sdk/middleware-sdk-sts" "3.449.0" + "@aws-sdk/middleware-signing" "3.449.0" + "@aws-sdk/middleware-user-agent" "3.449.0" "@aws-sdk/region-config-resolver" "3.433.0" - "@aws-sdk/types" "3.433.0" - "@aws-sdk/util-endpoints" "3.433.0" - "@aws-sdk/util-user-agent-browser" "3.433.0" - "@aws-sdk/util-user-agent-node" "3.437.0" + "@aws-sdk/types" "3.449.0" + "@aws-sdk/util-endpoints" "3.449.0" + "@aws-sdk/util-user-agent-browser" "3.449.0" + "@aws-sdk/util-user-agent-node" "3.449.0" "@smithy/config-resolver" "^2.0.16" "@smithy/fetch-http-handler" "^2.2.4" "@smithy/hash-node" "^2.0.12" @@ -320,45 +331,47 @@ "@smithy/util-body-length-node" "^2.1.0" "@smithy/util-defaults-mode-browser" "^2.0.16" "@smithy/util-defaults-mode-node" "^2.0.21" + "@smithy/util-endpoints" "^1.0.2" "@smithy/util-retry" "^2.0.5" "@smithy/util-utf8" "^2.0.0" fast-xml-parser "4.2.5" tslib "^2.5.0" -"@aws-sdk/core@3.436.0": - version "3.436.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.436.0.tgz#d85ecde9ac524a8f3cfe7e29b9e16942d7291723" - integrity sha512-vX5/LjXvCejC2XUY6TSg1oozjqK6BvkE75t0ys9dgqyr5PlZyZksMoeAFHUlj0sCjhT3ziWCujP1oiSpPWY9hg== +"@aws-sdk/core@3.445.0": + version "3.445.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.445.0.tgz#1df472d976a02533784b6fe606f1cc4d524cbb29" + integrity sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg== dependencies: "@smithy/smithy-client" "^2.1.12" + tslib "^2.5.0" -"@aws-sdk/credential-provider-cognito-identity@3.437.0": - version "3.437.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.437.0.tgz#4c7bfbc6242461e562c0b259f1967f109fadfed6" - integrity sha512-XCIb6yfX9YlEc7Hn4dfSkLny31OMpekA7usFsXEnoOn3geCKC1xFvrpa9LhHbxkMqLTVzWPGji2DGlJAb2xxpw== +"@aws-sdk/credential-provider-cognito-identity@3.450.0": + version "3.450.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.450.0.tgz#234a389302044b00f939f9acf83a86cf654f511d" + integrity sha512-XBcifT9L1WLu6/WluOcmH04jHYtZGNnygrD1WMd6Y5JlW+JctUHfmevFHQ5IO48rJA8qV/Sl87yvL37EcVSZjA== dependencies: - "@aws-sdk/client-cognito-identity" "3.437.0" - "@aws-sdk/types" "3.433.0" + "@aws-sdk/client-cognito-identity" "3.450.0" + "@aws-sdk/types" "3.449.0" "@smithy/property-provider" "^2.0.0" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/credential-provider-env@3.433.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz#7cceca1002ba2e79e10a9dfb119442bea7b88e7c" - integrity sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ== +"@aws-sdk/credential-provider-env@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.449.0.tgz#37ff1673f83325b746314e6dd6afb1b61ac993d1" + integrity sha512-SwO9XQcBoyA0XrsSmgnMqCnR99wIyp+BjGhvzDU+Wetib7QPt++E2slJkLM/iCNc6YiqiHZtHsvXapSV7RzBJw== dependencies: - "@aws-sdk/types" "3.433.0" + "@aws-sdk/types" "3.449.0" "@smithy/property-provider" "^2.0.0" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/credential-provider-http@3.435.0": - version "3.435.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.435.0.tgz#07686526082824f49dd3a910c857faba4d9587ed" - integrity sha512-i07YSy3+IrXwAzp3goCMo2OYzAwqRGIWPNMUX5ziFgA1eMlRWNC2slnbqJzax6xHrU8HdpNESAfflnQvUVBqYQ== +"@aws-sdk/credential-provider-http@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.449.0.tgz#a12db5877071ac4566ccbad81e681ce39cf0f08b" + integrity sha512-oIcww6Xsyux3LZVQr89Ps2FkULwCe3ZDUxzlyQNGD7gsMxJRD/fUBffpv+7ZmXUVoN8ZthlxuPwjpP568JVBJw== dependencies: - "@aws-sdk/types" "3.433.0" + "@aws-sdk/types" "3.449.0" "@smithy/fetch-http-handler" "^2.2.4" "@smithy/node-http-handler" "^2.1.8" "@smithy/property-provider" "^2.0.0" @@ -368,140 +381,140 @@ "@smithy/util-stream" "^2.0.17" tslib "^2.5.0" -"@aws-sdk/credential-provider-ini@3.437.0": - version "3.437.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.437.0.tgz#2beea3bfa90e10770a1e06b8178e31ec31414f31" - integrity sha512-UybiJxYPvdwok5OcI9LakaHmaWZBdkX0gY8yU2n7TomYgWOwDJ88MpQgjXUJJ249PH+9/+How5H3vnFp0xJ0uQ== +"@aws-sdk/credential-provider-ini@3.450.0": + version "3.450.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.450.0.tgz#139842b36f0bf51b19f80b3670f9644e0b79799f" + integrity sha512-quil0bUH43irhEtHBBpnleVQd1ZBX9kDVf8HziK/LIhujTmHDAoDODnjhUczdJU6srMJgAJi1oVTaVek5emh9Q== dependencies: - "@aws-sdk/credential-provider-env" "3.433.0" - "@aws-sdk/credential-provider-process" "3.433.0" - "@aws-sdk/credential-provider-sso" "3.437.0" - "@aws-sdk/credential-provider-web-identity" "3.433.0" - "@aws-sdk/types" "3.433.0" + "@aws-sdk/credential-provider-env" "3.449.0" + "@aws-sdk/credential-provider-process" "3.449.0" + "@aws-sdk/credential-provider-sso" "3.450.0" + "@aws-sdk/credential-provider-web-identity" "3.449.0" + "@aws-sdk/types" "3.449.0" "@smithy/credential-provider-imds" "^2.0.0" "@smithy/property-provider" "^2.0.0" "@smithy/shared-ini-file-loader" "^2.0.6" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/credential-provider-node@3.437.0": - version "3.437.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.437.0.tgz#8faf3cd8f9987dabfdd8622f5f399a5c18092cde" - integrity sha512-FMtgEe/me68xZQsymEpMcw7OuuiHaHx/Tp5EqZP5FC0Yv1yX3qr/ncIWU2zY3a9K0iLERmzQI1g3CMd8r4sy8A== - dependencies: - "@aws-sdk/credential-provider-env" "3.433.0" - "@aws-sdk/credential-provider-ini" "3.437.0" - "@aws-sdk/credential-provider-process" "3.433.0" - "@aws-sdk/credential-provider-sso" "3.437.0" - "@aws-sdk/credential-provider-web-identity" "3.433.0" - "@aws-sdk/types" "3.433.0" +"@aws-sdk/credential-provider-node@3.450.0": + version "3.450.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.450.0.tgz#44344f9bc534e8073f756e760c64d092811afaca" + integrity sha512-d4tQklhvsydNCer5Axd2sNptqqdalE78esDk0zA/cYaj56GniKqk3HLJLgb/wdv2/Ho6/4DhWeM5W4LaJNRivA== + dependencies: + "@aws-sdk/credential-provider-env" "3.449.0" + "@aws-sdk/credential-provider-ini" "3.450.0" + "@aws-sdk/credential-provider-process" "3.449.0" + "@aws-sdk/credential-provider-sso" "3.450.0" + "@aws-sdk/credential-provider-web-identity" "3.449.0" + "@aws-sdk/types" "3.449.0" "@smithy/credential-provider-imds" "^2.0.0" "@smithy/property-provider" "^2.0.0" "@smithy/shared-ini-file-loader" "^2.0.6" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/credential-provider-process@3.433.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz#dd51c92480ed620e4c3f989852ee408ab1209d59" - integrity sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A== +"@aws-sdk/credential-provider-process@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.449.0.tgz#031bff93ba3c6910aba851904cf424fcaba5914b" + integrity sha512-IofhAgpwdSnaEg9H0dhydac07GCQ55Mc5oRzdzp/tm0Rl0MqnGdIvN8wYsxAeVhEi9pBSNla4eRiTu3LY6Z5+A== dependencies: - "@aws-sdk/types" "3.433.0" + "@aws-sdk/types" "3.449.0" "@smithy/property-provider" "^2.0.0" "@smithy/shared-ini-file-loader" "^2.0.6" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/credential-provider-sso@3.437.0": - version "3.437.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.437.0.tgz#0c299745d961674a9631fd11651b63caff39f791" - integrity sha512-kijtnyyA6/+ipOef4KACsLDUTFWDZ97DSWKU0hJFyGEfelaon6o7NNVufuVOWrBNyklNWZqvPLuwWWQCxb6fuQ== +"@aws-sdk/credential-provider-sso@3.450.0": + version "3.450.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.450.0.tgz#a17778067199412cea10479d0b0d0302a5ff8b9d" + integrity sha512-zzr9s5bG38TRn82eJXzG1/AglDihrcINn9TBfwOL8OBl0J6MF7EPAS92VpOuYs09H70MOWSZkmzEftq1urwC0g== dependencies: - "@aws-sdk/client-sso" "3.437.0" - "@aws-sdk/token-providers" "3.437.0" - "@aws-sdk/types" "3.433.0" + "@aws-sdk/client-sso" "3.450.0" + "@aws-sdk/token-providers" "3.449.0" + "@aws-sdk/types" "3.449.0" "@smithy/property-provider" "^2.0.0" "@smithy/shared-ini-file-loader" "^2.0.6" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/credential-provider-web-identity@3.433.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz#32403ba9cc47d3c46500f3c8e5e0041d20e4dbe8" - integrity sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg== +"@aws-sdk/credential-provider-web-identity@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.449.0.tgz#6033ecc7939d08dd2492e3983fd21b0b5a9dfc8a" + integrity sha512-BdqATzdqg39z2VXnEH7I6dzuX/Di6F/4C8FyiiJYx2+VciYdqt6GPprlpGdpngtWct/f8pA/LxQysNBVuwU/RA== dependencies: - "@aws-sdk/types" "3.433.0" + "@aws-sdk/types" "3.449.0" "@smithy/property-provider" "^2.0.0" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/credential-providers@^3.437.0": - version "3.437.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.437.0.tgz#42ec98f2a65d440c3509b1e80b8f6b3ad724ecd7" - integrity sha512-aLgwo45dTDxAO2Gtx+9y4CfiEhvvGfWz2M+IMS48dQ2gmp1z+GXMiJv1zBhoidL2AvQMOpkgO0bl+qFlC4Cmmw== - dependencies: - "@aws-sdk/client-cognito-identity" "3.437.0" - "@aws-sdk/client-sso" "3.437.0" - "@aws-sdk/client-sts" "3.437.0" - "@aws-sdk/credential-provider-cognito-identity" "3.437.0" - "@aws-sdk/credential-provider-env" "3.433.0" - "@aws-sdk/credential-provider-http" "3.435.0" - "@aws-sdk/credential-provider-ini" "3.437.0" - "@aws-sdk/credential-provider-node" "3.437.0" - "@aws-sdk/credential-provider-process" "3.433.0" - "@aws-sdk/credential-provider-sso" "3.437.0" - "@aws-sdk/credential-provider-web-identity" "3.433.0" - "@aws-sdk/types" "3.433.0" +"@aws-sdk/credential-providers@^3.450.0": + version "3.450.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.450.0.tgz#f10698c85a69b4834be0fb3bf4384c592ae576c5" + integrity sha512-AWLYcwxNEsTX4hZBqq4cQsVuhVkYIwZP4DDaTAUoK6tR/WqmOFImuNB8DSPRGTEljdg+Q0qIWhMUGDWSKeJffw== + dependencies: + "@aws-sdk/client-cognito-identity" "3.450.0" + "@aws-sdk/client-sso" "3.450.0" + "@aws-sdk/client-sts" "3.450.0" + "@aws-sdk/credential-provider-cognito-identity" "3.450.0" + "@aws-sdk/credential-provider-env" "3.449.0" + "@aws-sdk/credential-provider-http" "3.449.0" + "@aws-sdk/credential-provider-ini" "3.450.0" + "@aws-sdk/credential-provider-node" "3.450.0" + "@aws-sdk/credential-provider-process" "3.449.0" + "@aws-sdk/credential-provider-sso" "3.450.0" + "@aws-sdk/credential-provider-web-identity" "3.449.0" + "@aws-sdk/types" "3.449.0" "@smithy/credential-provider-imds" "^2.0.0" "@smithy/property-provider" "^2.0.0" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/middleware-host-header@3.433.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz#3b6687ee4021c2b56c96cff61b45a33fb762b1c7" - integrity sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA== +"@aws-sdk/middleware-host-header@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.449.0.tgz#7d5808b2f7972cfa618eb79e9b871f095f92bc67" + integrity sha512-uO7ao5eFhqEEPk8uqkhNhYqqJPPv/+i2aLchvSYrviDcmcbz9HURc8j+Q9WkmIj3jf0hjAJ9UVMQggBUfoLEgg== dependencies: - "@aws-sdk/types" "3.433.0" + "@aws-sdk/types" "3.449.0" "@smithy/protocol-http" "^3.0.8" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/middleware-logger@3.433.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz#fcd4e31a8f134861cd519477b959c218a3600186" - integrity sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ== +"@aws-sdk/middleware-logger@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.449.0.tgz#d08821565e160cc8b2ef8189fc0838504e69e224" + integrity sha512-YwmPLuSx5Zjdnloxr7bArT2KgF+VvlSe5+p5T/woZWEQgINRaCLdvDB37p7x/LlHrxxZRmk20MaFwSKlJU85qQ== dependencies: - "@aws-sdk/types" "3.433.0" + "@aws-sdk/types" "3.449.0" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/middleware-recursion-detection@3.433.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz#5b4b7878ea46c70f507c9ea7c30ad0e5ee4ae6bf" - integrity sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ== +"@aws-sdk/middleware-recursion-detection@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.449.0.tgz#b9fc2ea6c51a5d8a862c97690ca0cf0916dae554" + integrity sha512-8kWxxpPBHwFUADf8JaZsUbJ+FtS3K9MGQpMx0AZhh3P9xLaoh602CL0y0+UEEdb2uh6FJJjQiIk4eQXEolhG6Q== dependencies: - "@aws-sdk/types" "3.433.0" + "@aws-sdk/types" "3.449.0" "@smithy/protocol-http" "^3.0.8" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/middleware-sdk-sts@3.433.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz#9b30f17a922ecc5fd46b93f1edcd20d7146b814f" - integrity sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA== +"@aws-sdk/middleware-sdk-sts@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.449.0.tgz#5ad8f27ddd22f96a3a5873743b1cad43cb242af1" + integrity sha512-a+mknJkS9jDiDoHg2sFW24B0f6MgT2zs/oF6zMFvVmImvUHjbhSgBzYStE+Phl/uM1zwp1lJfbuO+I+5tVwZEw== dependencies: - "@aws-sdk/middleware-signing" "3.433.0" - "@aws-sdk/types" "3.433.0" + "@aws-sdk/middleware-signing" "3.449.0" + "@aws-sdk/types" "3.449.0" "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/middleware-signing@3.433.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz#670557ace5b97729dbabb6a991815e44eb0ef03b" - integrity sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ== +"@aws-sdk/middleware-signing@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.449.0.tgz#d6e7e7a380b1b30fe67364b5ed7ee2ecfc5662db" + integrity sha512-L33efrgdDDY3myjLwraeS2tzUlebaZL6WS7ooACsOwkB9mRs6UQRpSpT90HbcSAjwLaa+xGqaxTA0biAuRjT5A== dependencies: - "@aws-sdk/types" "3.433.0" + "@aws-sdk/types" "3.449.0" "@smithy/property-provider" "^2.0.0" "@smithy/protocol-http" "^3.0.8" "@smithy/signature-v4" "^2.0.0" @@ -509,13 +522,13 @@ "@smithy/util-middleware" "^2.0.5" tslib "^2.5.0" -"@aws-sdk/middleware-user-agent@3.433.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.433.0.tgz#21b874708e015b6f5cc33bf0545d2a0f9d9ab3a5" - integrity sha512-jMgA1jHfisBK4oSjMKrtKEZf0sl2vzADivkFmyZFzORpSZxBnF6hC21RjaI+70LJLcc9rSCzLgcoz5lHb9LLDg== +"@aws-sdk/middleware-user-agent@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.449.0.tgz#cee2bb09dd92e34c9d8a5802cb8f695224e8e3ff" + integrity sha512-0cRptIhIthxUYadrgb5FmcTgGhPIeXnFATBILaa2gA/ivfVY/CiqMAvOvLHxtBAYNK8/VXM9DFL5TfOt8mF2UQ== dependencies: - "@aws-sdk/types" "3.433.0" - "@aws-sdk/util-endpoints" "3.433.0" + "@aws-sdk/types" "3.449.0" + "@aws-sdk/util-endpoints" "3.449.0" "@smithy/protocol-http" "^3.0.8" "@smithy/types" "^2.4.0" tslib "^2.5.0" @@ -531,22 +544,22 @@ "@smithy/util-middleware" "^2.0.5" tslib "^2.5.0" -"@aws-sdk/token-providers@3.437.0": - version "3.437.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.437.0.tgz#743b6e556a810c9555c697effbd8b2a81d5bc0c9" - integrity sha512-nV9qIuG0+6XJb7hWpCC+/K7RoY3PZUWndP8BRQv7PQhhpd8tG/I5Kxb0V83h2XFBXyyjnv0aOHO8ehz3Kfcv2Q== +"@aws-sdk/token-providers@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.449.0.tgz#538a8888271195e3bd7ace0520a53f82f5610e4b" + integrity sha512-Tgu6Z/l75uFuNQpKIidbn1gc5bI7OKmGdH5+E/ZAc58XYvxYs9N77HjhrhAGvYQEnXY6gRm26/WSeHAAh5wlgQ== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/middleware-host-header" "3.433.0" - "@aws-sdk/middleware-logger" "3.433.0" - "@aws-sdk/middleware-recursion-detection" "3.433.0" - "@aws-sdk/middleware-user-agent" "3.433.0" + "@aws-sdk/middleware-host-header" "3.449.0" + "@aws-sdk/middleware-logger" "3.449.0" + "@aws-sdk/middleware-recursion-detection" "3.449.0" + "@aws-sdk/middleware-user-agent" "3.449.0" "@aws-sdk/region-config-resolver" "3.433.0" - "@aws-sdk/types" "3.433.0" - "@aws-sdk/util-endpoints" "3.433.0" - "@aws-sdk/util-user-agent-browser" "3.433.0" - "@aws-sdk/util-user-agent-node" "3.437.0" + "@aws-sdk/types" "3.449.0" + "@aws-sdk/util-endpoints" "3.449.0" + "@aws-sdk/util-user-agent-browser" "3.449.0" + "@aws-sdk/util-user-agent-node" "3.449.0" "@smithy/config-resolver" "^2.0.16" "@smithy/fetch-http-handler" "^2.2.4" "@smithy/hash-node" "^2.0.12" @@ -569,24 +582,26 @@ "@smithy/util-body-length-node" "^2.1.0" "@smithy/util-defaults-mode-browser" "^2.0.16" "@smithy/util-defaults-mode-node" "^2.0.21" + "@smithy/util-endpoints" "^1.0.2" "@smithy/util-retry" "^2.0.5" "@smithy/util-utf8" "^2.0.0" tslib "^2.5.0" -"@aws-sdk/types@3.433.0", "@aws-sdk/types@^3.222.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.433.0.tgz#0f94eae2a4a3525ca872c9ab04e143c01806d755" - integrity sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA== +"@aws-sdk/types@3.449.0", "@aws-sdk/types@^3.222.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.449.0.tgz#0da2f8cdb344fbe9846de371a04c6dde1bcaf83f" + integrity sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww== dependencies: "@smithy/types" "^2.4.0" tslib "^2.5.0" -"@aws-sdk/util-endpoints@3.433.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.433.0.tgz#d1e00b3f0d7c3f77597787aef265fe1b247a1083" - integrity sha512-LFNUh9FH7RMtYjSjPGz9lAJQMzmJ3RcXISzc5X5k2R/9mNwMK7y1k2VAfvx+RbuDbll6xwsXlgv6QHcxVdF2zw== +"@aws-sdk/util-endpoints@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.449.0.tgz#bf6427105d25dd612077bc940afea41708c54de3" + integrity sha512-hWGM/e+BnbCExXLaIEa6gRb0JW3+XGfcHgRqWkAxsKCaxQuXVIPUA3HyifimxTZDKmTbGZcyWfxCnKGS7I19rw== dependencies: - "@aws-sdk/types" "3.433.0" + "@aws-sdk/types" "3.449.0" + "@smithy/util-endpoints" "^1.0.2" tslib "^2.5.0" "@aws-sdk/util-locate-window@^3.0.0": @@ -596,22 +611,22 @@ dependencies: tslib "^2.5.0" -"@aws-sdk/util-user-agent-browser@3.433.0": - version "3.433.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz#b5ed0c0cca0db34a2c1c2ffc1b65e7cdd8dc88ff" - integrity sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ== +"@aws-sdk/util-user-agent-browser@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.449.0.tgz#436013796ce49a3f774b14d6d59f327cc0db407c" + integrity sha512-MUQ8YIVZNZZso5w1qlatHu9c1JKYvdjlAugzKhj7npgV4U8D9RBOJUd2Ct8meXPaH4DTfW1qohPlZu/fWWqNVQ== dependencies: - "@aws-sdk/types" "3.433.0" + "@aws-sdk/types" "3.449.0" "@smithy/types" "^2.4.0" bowser "^2.11.0" tslib "^2.5.0" -"@aws-sdk/util-user-agent-node@3.437.0": - version "3.437.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz#f77729854ddf049ccaba8bae3d8fa279812b4716" - integrity sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA== +"@aws-sdk/util-user-agent-node@3.449.0": + version "3.449.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.449.0.tgz#04ba6452b855bb2d225358914046b9be54a6c674" + integrity sha512-PFMnFMSQTdhMAS63anMFFkzz56kWKcjGscgl0bBheEaxo8zgfLf1AAdFuBM+Ob2KYXeMezUbxYu9zOC/0S2hvw== dependencies: - "@aws-sdk/types" "3.433.0" + "@aws-sdk/types" "3.449.0" "@smithy/node-config-provider" "^2.1.3" "@smithy/types" "^2.4.0" tslib "^2.5.0" @@ -632,37 +647,37 @@ chalk "^2.4.2" "@babel/compat-data@^7.22.9": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" - integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.3.tgz#3febd552541e62b5e883a25eb3effd7c7379db11" + integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== "@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.3.tgz#5ec09c8803b91f51cc887dedc2654a35852849c9" + integrity sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/generator" "^7.23.3" "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" + "@babel/parser" "^7.23.3" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.23.3" + "@babel/types" "^7.23.3" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@^7.23.3", "@babel/generator@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.3.tgz#86e6e83d95903fbe7613f448613b8b319f330a8e" + integrity sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg== dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.23.3" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -705,10 +720,10 @@ dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -768,10 +783,10 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.3.tgz#0ce0be31a4ca4f1884b5786057cadcb6c3be58f9" + integrity sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -809,9 +824,9 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -865,9 +880,9 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -880,26 +895,26 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== +"@babel/traverse@^7.23.2", "@babel/traverse@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.3.tgz#26ee5f252e725aa7aca3474aa5b324eaf7908b5b" + integrity sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ== dependencies: "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/generator" "^7.23.3" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" + "@babel/parser" "^7.23.3" + "@babel/types" "^7.23.3" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.3.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.3.tgz#d5ea892c07f2ec371ac704420f4dcdb07b5f9598" + integrity sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw== dependencies: "@babel/helper-string-parser" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.20" @@ -910,6 +925,11 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@cdklabs/tskb@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@cdklabs/tskb/-/tskb-0.0.3.tgz#4b79846d9381eb1252ba85d5d20b7cd7d99b6ecb" + integrity sha512-JR+MuD4awAXvutu7HArephXfZm09GPTaSAQUqNcJB5+ZENRm4kV+L6vJL6Tn1xHjCcHksO+HAqj3gYtm5K94vA== + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -930,14 +950,14 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" - integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@eslint/eslintrc@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== +"@eslint/eslintrc@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" + integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -949,15 +969,20 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.52.0": - version "8.52.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.52.0.tgz#78fe5f117840f69dc4a353adf9b9cd926353378c" - integrity sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA== +"@eslint/js@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.53.0.tgz#bea56f2ed2b5baea164348ff4d5a879f6f81f20d" + integrity sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w== "@fastify/busboy@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" - integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + +"@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== "@humanwhocodes/config-array@^0.11.13": version "0.11.13" @@ -1287,6 +1312,14 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + "@npmcli/fs@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" @@ -1316,6 +1349,14 @@ npm-bundled "^3.0.0" npm-normalize-package-bin "^3.0.0" +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@npmcli/node-gyp@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" @@ -1358,9 +1399,9 @@ universal-user-agent "^6.0.0" "@octokit/endpoint@^9.0.0": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.1.tgz#c3f69d27accddcb04a3199fcef541804288149d2" - integrity sha512-hRlOKAovtINHQPYHZlfyFwaM8OyetxeoC81lAkBy34uLb8exrZB50SQdeW3EROqiY9G9yxQTpp5OHTV54QD+vA== + version "9.0.2" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.2.tgz#f9098bf15b893ac30c144c5e77da0322ad41b008" + integrity sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ== dependencies: "@octokit/types" "^12.0.0" is-plain-object "^5.0.0" @@ -1375,24 +1416,24 @@ "@octokit/types" "^12.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^19.0.0": - version "19.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.0.0.tgz#0101bf62ab14c1946149a0f8385440963e1253c4" - integrity sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw== +"@octokit/openapi-types@^19.0.2": + version "19.0.2" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.0.2.tgz#d72778fe2f6151314b6f0201fbc771bb741276fc" + integrity sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ== "@octokit/plugin-paginate-rest@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.0.0.tgz#21fd12816c2dc158a775ed20be5abcbc61052a46" - integrity sha512-oIJzCpttmBTlEhBmRvb+b9rlnGpmFgDtZ0bB6nq39qIod6A5DP+7RkVLMOixIgRCYSHDTeayWqmiJ2SZ6xgfdw== + version "9.1.4" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.4.tgz#9eca55e3e88f15b574e072732769e933bfa88d8b" + integrity sha512-MvZx4WvfhBnt7PtH5XE7HORsO7bBk4er1FgRIUr1qJ89NR2I6bWjGyKsxk8z42FPQ34hFQm0Baanh4gzdZR4gQ== dependencies: - "@octokit/types" "^12.0.0" + "@octokit/types" "^12.3.0" "@octokit/plugin-rest-endpoint-methods@^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.0.1.tgz#0587a8ae2391287fdfc7961a41cec7bfd1ef4968" - integrity sha512-fgS6HPkPvJiz8CCliewLyym9qAx0RZ/LKh3sATaPfM41y/O2wQ4Z9MrdYeGPVh04wYmHFmWiGlKPC7jWVtZXQA== + version "10.1.4" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.1.4.tgz#1bb5bcd5ce932ef385a6c613f4784cbac6b6f25e" + integrity sha512-e8dSb9ypW1Q2I+qkOPzs3A9f4/EGpSZSI45wWBfXiqcvpoxSywVcZajZRhFwAutKI+/NNoeKxsxMwCx73oQyWw== dependencies: - "@octokit/types" "^12.0.0" + "@octokit/types" "^12.3.0" "@octokit/request-error@^5.0.0": version "5.0.1" @@ -1404,9 +1445,9 @@ once "^1.4.0" "@octokit/request@^8.0.1", "@octokit/request@^8.0.2": - version "8.1.4" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.4.tgz#12dfaebdb2ea375eaabb41d39d45182531ac2857" - integrity sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA== + version "8.1.5" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.5.tgz#902ae9565117a1dc410d10b5dbc44c4d27a89b71" + integrity sha512-zVKbNbX1xUluD9ZR4/tPs1yuYrK9xeh5fGZUXA6u04XGsTvomg0YO8/ZUC0FqAd49hAOEMFPAVUTh+2lBhOhLA== dependencies: "@octokit/endpoint" "^9.0.0" "@octokit/request-error" "^5.0.0" @@ -1414,12 +1455,12 @@ is-plain-object "^5.0.0" universal-user-agent "^6.0.0" -"@octokit/types@^12.0.0": - version "12.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.0.0.tgz#6b34309288b6f5ac9761d2589e3165cde1b95fee" - integrity sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg== +"@octokit/types@^12.0.0", "@octokit/types@^12.3.0": + version "12.3.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.3.0.tgz#e3f8bc53f65ef551e19cc1a0fea15adadec17d2d" + integrity sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ== dependencies: - "@octokit/openapi-types" "^19.0.0" + "@octokit/openapi-types" "^19.0.2" "@octokit/webhooks-definitions@^3.67.3": version "3.67.3" @@ -1569,73 +1610,73 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== -"@smithy/abort-controller@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-2.0.12.tgz#62cd47c81fa1d7d6c2d6fde0c2f54ea89892fb6a" - integrity sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA== +"@smithy/abort-controller@^2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-2.0.13.tgz#d050a969bf1a478e548a323ea0f1b83532cbc136" + integrity sha512-eeOPD+GF9BzF/Mjy3PICLePx4l0f3rG/nQegQHRLTloN5p1lSJJNZsyn+FzDnW8P2AduragZqJdtKNCxXozB1Q== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@smithy/config-resolver@^2.0.16": - version "2.0.16" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-2.0.16.tgz#f2abf65a21f56731fdab2d39d2df2dd0e377c9cc" - integrity sha512-1k+FWHQDt2pfpXhJsOmNMmlAZ3NUQ98X5tYsjQhVGq+0X6cOBMhfh6Igd0IX3Ut6lEO6DQAdPMI/blNr3JZfMQ== +"@smithy/config-resolver@^2.0.16", "@smithy/config-resolver@^2.0.18": + version "2.0.18" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-2.0.18.tgz#5692b491a423bfb821d12e6eca0eb5f0ca63e789" + integrity sha512-761sJSgNbvsqcsKW6/WZbrZr4H+0Vp/QKKqwyrxCPwD8BsiPEXNHyYnqNgaeK9xRWYswjon0Uxbpe3DWQo0j/g== dependencies: - "@smithy/node-config-provider" "^2.1.3" - "@smithy/types" "^2.4.0" + "@smithy/node-config-provider" "^2.1.5" + "@smithy/types" "^2.5.0" "@smithy/util-config-provider" "^2.0.0" - "@smithy/util-middleware" "^2.0.5" + "@smithy/util-middleware" "^2.0.6" tslib "^2.5.0" -"@smithy/credential-provider-imds@^2.0.0", "@smithy/credential-provider-imds@^2.0.18": - version "2.0.18" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.18.tgz#9a5b8be3f268bb4ac7b7ef321f57b0e9a61e2940" - integrity sha512-QnPBi6D2zj6AHJdUTo5zXmk8vwHJ2bNevhcVned1y+TZz/OI5cizz5DsYNkqFUIDn8tBuEyKNgbmKVNhBbuY3g== +"@smithy/credential-provider-imds@^2.0.0", "@smithy/credential-provider-imds@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.1.tgz#18607cbfce633ed81a2832889efb660c33a974e9" + integrity sha512-gw5G3FjWC6sNz8zpOJgPpH5HGKrpoVFQpToNAwLwJVyI/LJ2jDJRjSKEsM6XI25aRpYjMSE/Qptxx305gN1vHw== dependencies: - "@smithy/node-config-provider" "^2.1.3" - "@smithy/property-provider" "^2.0.13" - "@smithy/types" "^2.4.0" - "@smithy/url-parser" "^2.0.12" + "@smithy/node-config-provider" "^2.1.5" + "@smithy/property-provider" "^2.0.14" + "@smithy/types" "^2.5.0" + "@smithy/url-parser" "^2.0.13" tslib "^2.5.0" -"@smithy/eventstream-codec@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz#99fab750d0ac3941f341d912d3c3a1ab985e1a7a" - integrity sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A== +"@smithy/eventstream-codec@^2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-2.0.13.tgz#10c57a80508125a64759e79b42ff848bee8498dc" + integrity sha512-CExbelIYp+DxAHG8RIs0l9QL7ElqhG4ym9BNoSpkPa4ptBQfzJdep3LbOSVJIE2VUdBAeObdeL6EDB3Jo85n3g== dependencies: "@aws-crypto/crc32" "3.0.0" - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" "@smithy/util-hex-encoding" "^2.0.0" tslib "^2.5.0" -"@smithy/fetch-http-handler@^2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.4.tgz#405716581a5a336f2c162daf4169bff600fc47ce" - integrity sha512-gIPRFEGi+c6V52eauGKrjDzPWF2Cu7Z1r5F8A3j2wcwz25sPG/t8kjsbEhli/tS/2zJp/ybCZXe4j4ro3yv/HA== +"@smithy/fetch-http-handler@^2.2.4", "@smithy/fetch-http-handler@^2.2.6": + version "2.2.6" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.6.tgz#c3390c1c0533d024a5e2b1d1e8e778bcdcb66bf4" + integrity sha512-PStY3XO1Ksjwn3wMKye5U6m6zxXpXrXZYqLy/IeCbh3nM9QB3Jgw/B0PUSLUWKdXg4U8qgEu300e3ZoBvZLsDg== dependencies: - "@smithy/protocol-http" "^3.0.8" - "@smithy/querystring-builder" "^2.0.12" - "@smithy/types" "^2.4.0" - "@smithy/util-base64" "^2.0.0" + "@smithy/protocol-http" "^3.0.9" + "@smithy/querystring-builder" "^2.0.13" + "@smithy/types" "^2.5.0" + "@smithy/util-base64" "^2.0.1" tslib "^2.5.0" "@smithy/hash-node@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-2.0.12.tgz#514586ca3f54840322273029eef66c41d9001e39" - integrity sha512-fDZnTr5j9t5qcbeJ037aMZXxMka13Znqwrgy3PAqYj6Dm3XHXHftTH3q+NWgayUxl1992GFtQt1RuEzRMy3NnQ== + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-2.0.15.tgz#fd60ba5dd9a80f14c317bc668813a734f64786fb" + integrity sha512-t/qjEJZu/G46A22PAk1k/IiJZT4ncRkG5GOCNWN9HPPy5rCcSZUbh7gwp7CGKgJJ7ATMMg+0Td7i9o1lQTwOfQ== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" "@smithy/util-buffer-from" "^2.0.0" - "@smithy/util-utf8" "^2.0.0" + "@smithy/util-utf8" "^2.0.2" tslib "^2.5.0" "@smithy/invalid-dependency@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz#de78a5e9457cc397aad0648e18c0260b522fe604" - integrity sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA== + version "2.0.13" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-2.0.13.tgz#6f4c5d809906bbb069074c5c11028a2631abed8d" + integrity sha512-XsGYhVhvEikX1Yz0kyIoLssJf2Rs6E0U2w2YuKdT4jSra5A/g8V2oLROC1s56NldbgnpesTYB2z55KCHHbKyjw== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" tslib "^2.5.0" "@smithy/is-array-buffer@^2.0.0": @@ -1646,170 +1687,170 @@ tslib "^2.5.0" "@smithy/middleware-content-length@^2.0.14": - version "2.0.14" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz#ee1aa842490cee90b6ac208fb13a7d56d3ed84f2" - integrity sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg== + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-2.0.15.tgz#cd419737202f66eb441a233e9e8c8bc6bbd6a6f0" + integrity sha512-xH4kRBw01gJgWiU+/mNTrnyFXeozpZHw39gLb3JKGsFDVmSrJZ8/tRqu27tU/ki1gKkxr2wApu+dEYjI3QwV1Q== dependencies: - "@smithy/protocol-http" "^3.0.8" - "@smithy/types" "^2.4.0" + "@smithy/protocol-http" "^3.0.9" + "@smithy/types" "^2.5.0" tslib "^2.5.0" "@smithy/middleware-endpoint@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.3.tgz#ab7ebff4ecbc9b02ec70dd57179f47c4f16bf03f" - integrity sha512-ZrQ0/YX6hNVTxqMEHtEaDbDv6pNeEji/a5Vk3HuFC5R3ZY8lfoATyxmOGxBVYnF3NUvZLNC7umEv1WzWGWvCGQ== - dependencies: - "@smithy/middleware-serde" "^2.0.12" - "@smithy/node-config-provider" "^2.1.3" - "@smithy/shared-ini-file-loader" "^2.2.2" - "@smithy/types" "^2.4.0" - "@smithy/url-parser" "^2.0.12" - "@smithy/util-middleware" "^2.0.5" + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.0.tgz#b5d065e8459216502adf3d8ccb7a589cfe1ba147" + integrity sha512-tddRmaig5URk2106PVMiNX6mc5BnKIKajHHDxb7K0J5MLdcuQluHMGnjkv18iY9s9O0tF+gAcPd/pDXA5L9DZw== + dependencies: + "@smithy/middleware-serde" "^2.0.13" + "@smithy/node-config-provider" "^2.1.5" + "@smithy/shared-ini-file-loader" "^2.2.4" + "@smithy/types" "^2.5.0" + "@smithy/url-parser" "^2.0.13" + "@smithy/util-middleware" "^2.0.6" tslib "^2.5.0" "@smithy/middleware-retry@^2.0.18": - version "2.0.18" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-2.0.18.tgz#37982552a1d3815148797831df025e470423fc5e" - integrity sha512-VyrHQRldGSb3v9oFOB5yPxmLT7U2sQic2ytylOnYlnsmVOLlFIaI6sW22c+w2675yq+XZ6HOuzV7x2OBYCWRNA== - dependencies: - "@smithy/node-config-provider" "^2.1.3" - "@smithy/protocol-http" "^3.0.8" - "@smithy/service-error-classification" "^2.0.5" - "@smithy/types" "^2.4.0" - "@smithy/util-middleware" "^2.0.5" - "@smithy/util-retry" "^2.0.5" + version "2.0.20" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-2.0.20.tgz#19f18ead244f609acc15481219cb8c944fb4620e" + integrity sha512-X2yrF/SHDk2WDd8LflRNS955rlzQ9daz9UWSp15wW8KtzoTXg3bhHM78HbK1cjr48/FWERSJKh9AvRUUGlIawg== + dependencies: + "@smithy/node-config-provider" "^2.1.5" + "@smithy/protocol-http" "^3.0.9" + "@smithy/service-error-classification" "^2.0.6" + "@smithy/types" "^2.5.0" + "@smithy/util-middleware" "^2.0.6" + "@smithy/util-retry" "^2.0.6" tslib "^2.5.0" uuid "^8.3.2" -"@smithy/middleware-serde@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz#edc93c400a5ffec6c068419163f9d880bdff5e5b" - integrity sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A== +"@smithy/middleware-serde@^2.0.12", "@smithy/middleware-serde@^2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-2.0.13.tgz#1d105ff5ffee5563c453a8546480182912cd169b" + integrity sha512-tBGbeXw+XsE6pPr4UaXOh+UIcXARZeiA8bKJWxk2IjJcD1icVLhBSUQH9myCIZLNNzJIH36SDjUX8Wqk4xJCJg== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@smithy/middleware-stack@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz#c58d6e4ffc4498bf47fd27adcddd142395d3ba84" - integrity sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A== +"@smithy/middleware-stack@^2.0.6", "@smithy/middleware-stack@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-2.0.7.tgz#e462bb3b33a9d3a29b80e8a7e13b8ba4726967c9" + integrity sha512-L1KLAAWkXbGx1t2jjCI/mDJ2dDNq+rp4/ifr/HcC6FHngxho5O7A5bQLpKHGlkfATH6fUnOEx0VICEVFA4sUzw== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@smithy/node-config-provider@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-2.1.3.tgz#bf4cee69df08d43618ad4329d234351b14d98ef7" - integrity sha512-J6lXvRHGVnSX3n1PYi+e1L5HN73DkkJpUviV3Ebf+8wSaIjAf+eVNbzyvh/S5EQz7nf4KVfwbD5vdoZMAthAEQ== +"@smithy/node-config-provider@^2.1.3", "@smithy/node-config-provider@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-2.1.5.tgz#f4be47e87c55791bf07c86c8e41383016753153f" + integrity sha512-3Omb5/h4tOCuKRx4p4pkYTvEYRCYoKk52bOYbKUyz/G/8gERbagsN8jFm4FjQubkrcIqQEghTpQaUw6uk+0edw== dependencies: - "@smithy/property-provider" "^2.0.13" - "@smithy/shared-ini-file-loader" "^2.2.2" - "@smithy/types" "^2.4.0" + "@smithy/property-provider" "^2.0.14" + "@smithy/shared-ini-file-loader" "^2.2.4" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@smithy/node-http-handler@^2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz#aad989d5445c43a677e7e6161c6fa4abd0e46023" - integrity sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA== +"@smithy/node-http-handler@^2.1.8", "@smithy/node-http-handler@^2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-2.1.9.tgz#903c353dcd58990ea46e2793a10160004e2e09e4" + integrity sha512-+K0q3SlNcocmo9OZj+fz67gY4lwhOCvIJxVbo/xH+hfWObvaxrMTx7JEzzXcluK0thnnLz++K3Qe7Z/8MDUreA== dependencies: - "@smithy/abort-controller" "^2.0.12" - "@smithy/protocol-http" "^3.0.8" - "@smithy/querystring-builder" "^2.0.12" - "@smithy/types" "^2.4.0" + "@smithy/abort-controller" "^2.0.13" + "@smithy/protocol-http" "^3.0.9" + "@smithy/querystring-builder" "^2.0.13" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@smithy/property-provider@^2.0.0", "@smithy/property-provider@^2.0.13": - version "2.0.13" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-2.0.13.tgz#45ee47ad79d638082523f944c49fd2e851312098" - integrity sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w== +"@smithy/property-provider@^2.0.0", "@smithy/property-provider@^2.0.14": + version "2.0.14" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-2.0.14.tgz#142e018ee624ae0c966c72886d4fb5d708f086d6" + integrity sha512-k3D2qp9o6imTrLaXRj6GdLYEJr1sXqS99nLhzq8fYmJjSVOeMg/G+1KVAAc7Oxpu71rlZ2f8SSZxcSxkevuR0A== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@smithy/protocol-http@^3.0.8": - version "3.0.8" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-3.0.8.tgz#0f7c114f6b8e23a57dff7a275d085bac97b9233c" - integrity sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw== +"@smithy/protocol-http@^3.0.8", "@smithy/protocol-http@^3.0.9": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-3.0.9.tgz#a1d973394b6da093bc8fd71556b589190352310d" + integrity sha512-U1wl+FhYu4/BC+rjwh1lg2gcJChQhytiNQSggREgQ9G2FzmoK9sACBZvx7thyWMvRyHQTE22mO2d5UM8gMKDBg== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@smithy/querystring-builder@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz#d13e0eea08d43596bdbb182206ccdee0956d06fd" - integrity sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw== +"@smithy/querystring-builder@^2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-2.0.13.tgz#3eae3ce5a99df9c3c70214ac90b6f3c4ff2a5341" + integrity sha512-JhXKwp3JtsFUe96XLHy/nUPEbaXqn6r7xE4sNaH8bxEyytE5q1fwt0ew/Ke6+vIC7gP87HCHgQpJHg1X1jN2Fw== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" "@smithy/util-uri-escape" "^2.0.0" tslib "^2.5.0" -"@smithy/querystring-parser@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz#d2c234031e266359716a0c62c8c1208a5bd2557e" - integrity sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg== +"@smithy/querystring-parser@^2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-2.0.13.tgz#9825239eceb2ab6a8906d7a3fa8241d20794b5a7" + integrity sha512-TEiT6o8CPZVxJ44Rly/rrsATTQsE+b/nyBVzsYn2sa75xAaZcurNxsFd8z1haoUysONiyex24JMHoJY6iCfLdA== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@smithy/service-error-classification@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz#22c84fad456730adfa31cae91d47acd31304c346" - integrity sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw== +"@smithy/service-error-classification@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-2.0.6.tgz#173c0067c9fce7641c4634e5f2f7e0b6fe11a051" + integrity sha512-fCQ36frtYra2fqY2/DV8+3/z2d0VB/1D1hXbjRcM5wkxTToxq6xHbIY/NGGY6v4carskMyG8FHACxgxturJ9Pg== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" -"@smithy/shared-ini-file-loader@^2.0.6", "@smithy/shared-ini-file-loader@^2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.2.tgz#b52064c5254a01f5c98a821207448de439938667" - integrity sha512-noyQUPn7b1M8uB0GEXc/Zyxq+5K2b7aaqWnLp+hgJ7+xu/FCvtyWy5eWLDjQEsHnAet2IZhS5QF8872OR69uNg== +"@smithy/shared-ini-file-loader@^2.0.6", "@smithy/shared-ini-file-loader@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.4.tgz#ed86a5afa76025ef827d84f5e07bb757174fe7c8" + integrity sha512-9dRknGgvYlRIsoTcmMJXuoR/3ekhGwhRq4un3ns2/byre4Ql5hyUN4iS0x8eITohjU90YOnUCsbRwZRvCkbRfw== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" tslib "^2.5.0" "@smithy/signature-v4@^2.0.0": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-2.0.12.tgz#4f9f5bba25e784d110fdc4a276b715feae82bb28" - integrity sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw== + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-2.0.15.tgz#14085ba126d6dc5e38099fb3df50ce480c858186" + integrity sha512-SRTEJSEhQYVlBKIIdZ9SZpqW+KFqxqcNnEcBX+8xkDdWx+DItme9VcCDkdN32yTIrICC+irUufnUdV7mmHPjoA== dependencies: - "@smithy/eventstream-codec" "^2.0.12" + "@smithy/eventstream-codec" "^2.0.13" "@smithy/is-array-buffer" "^2.0.0" - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" "@smithy/util-hex-encoding" "^2.0.0" - "@smithy/util-middleware" "^2.0.5" + "@smithy/util-middleware" "^2.0.6" "@smithy/util-uri-escape" "^2.0.0" - "@smithy/util-utf8" "^2.0.0" + "@smithy/util-utf8" "^2.0.2" tslib "^2.5.0" -"@smithy/smithy-client@^2.1.12": - version "2.1.12" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-2.1.12.tgz#a7f10ab846d41ce1042eb81f087c4c9eb438b481" - integrity sha512-XXqhridfkKnpj+lt8vM6HRlZbqUAqBjVC74JIi13F/AYQd/zTj9SOyGfxnbp4mjY9q28LityxIuV8CTinr9r5w== +"@smithy/smithy-client@^2.1.12", "@smithy/smithy-client@^2.1.15": + version "2.1.15" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-2.1.15.tgz#8a6e142f52fe253fd7f868eedce0e6d308415098" + integrity sha512-rngZcQu7Jvs9UbHihK1EI67RMPuzkc3CJmu4MBgB7D7yBnMGuFR86tq5rqHfL2gAkNnMelBN/8kzQVvZjNKefQ== dependencies: - "@smithy/middleware-stack" "^2.0.6" - "@smithy/types" "^2.4.0" - "@smithy/util-stream" "^2.0.17" + "@smithy/middleware-stack" "^2.0.7" + "@smithy/types" "^2.5.0" + "@smithy/util-stream" "^2.0.20" tslib "^2.5.0" -"@smithy/types@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.4.0.tgz#ed35e429e3ea3d089c68ed1bf951d0ccbdf2692e" - integrity sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g== +"@smithy/types@^2.4.0", "@smithy/types@^2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.5.0.tgz#f1bd5b906e7d3c6fd559b9b4f05e4707c7039180" + integrity sha512-/a31lYofrMBkJb3BuPlYJTMKDj0hUmKUP6JFZQu6YVuQVoAjubiY0A52U9S0Uysd33n/djexCUSNJ+G9bf3/aA== dependencies: tslib "^2.5.0" -"@smithy/url-parser@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-2.0.12.tgz#a4cdd1b66176e48f10d119298f8f90b06b7e8a01" - integrity sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA== +"@smithy/url-parser@^2.0.12", "@smithy/url-parser@^2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-2.0.13.tgz#1e5f2812c1d5a78ae69fc248487bdd8a8902afc5" + integrity sha512-okWx2P/d9jcTsZWTVNnRMpFOE7fMkzloSFyM53fA7nLKJQObxM2T4JlZ5KitKKuXq7pxon9J6SF2kCwtdflIrA== dependencies: - "@smithy/querystring-parser" "^2.0.12" - "@smithy/types" "^2.4.0" + "@smithy/querystring-parser" "^2.0.13" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@smithy/util-base64@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-2.0.0.tgz#1beeabfb155471d1d41c8d0603be1351f883c444" - integrity sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA== +"@smithy/util-base64@^2.0.0", "@smithy/util-base64@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-2.0.1.tgz#57f782dafc187eddea7c8a1ff2a7c188ed1a02c4" + integrity sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ== dependencies: "@smithy/util-buffer-from" "^2.0.0" tslib "^2.5.0" @@ -1844,27 +1885,36 @@ tslib "^2.5.0" "@smithy/util-defaults-mode-browser@^2.0.16": - version "2.0.16" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.16.tgz#7d60c4e1d00ed569f47fd6343b822c4ff3c2c9f8" - integrity sha512-Uv5Cu8nVkuvLn0puX+R9zWbSNpLIR3AxUlPoLJ7hC5lvir8B2WVqVEkJLwtixKAncVLasnTVjPDCidtAUTGEQw== + version "2.0.19" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.19.tgz#fe437b62e589812cf97b269e689b18f7bcb1d008" + integrity sha512-VHP8xdFR7/orpiABJwgoTB0t8Zhhwpf93gXhNfUBiwAE9O0rvsv7LwpQYjgvbOUDDO8JfIYQB2GYJNkqqGWsXw== dependencies: - "@smithy/property-provider" "^2.0.13" - "@smithy/smithy-client" "^2.1.12" - "@smithy/types" "^2.4.0" + "@smithy/property-provider" "^2.0.14" + "@smithy/smithy-client" "^2.1.15" + "@smithy/types" "^2.5.0" bowser "^2.11.0" tslib "^2.5.0" "@smithy/util-defaults-mode-node@^2.0.21": - version "2.0.21" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.21.tgz#d10c887b3e641c63e235ce95ba32137fd0bd1838" - integrity sha512-cUEsttVZ79B7Al2rWK2FW03HBpD9LyuqFtm+1qFty5u9sHSdesr215gS2Ln53fTopNiPgeXpdoM3IgjvIO0rJw== + version "2.0.25" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.25.tgz#76a62b8a6602b1414a0af5d0ac11fa1dfdadb308" + integrity sha512-jkmep6/JyWmn2ADw9VULDeGbugR4N/FJCKOt+gYyVswmN1BJOfzF2umaYxQ1HhQDvna3kzm1Dbo1qIfBW4iuHA== + dependencies: + "@smithy/config-resolver" "^2.0.18" + "@smithy/credential-provider-imds" "^2.1.1" + "@smithy/node-config-provider" "^2.1.5" + "@smithy/property-provider" "^2.0.14" + "@smithy/smithy-client" "^2.1.15" + "@smithy/types" "^2.5.0" + tslib "^2.5.0" + +"@smithy/util-endpoints@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-1.0.4.tgz#2b18aa7175e956e839be7aad5c5f0e0f6016d10d" + integrity sha512-FPry8j1xye5yzrdnf4xKUXVnkQErxdN7bUIaqC0OFoGsv2NfD9b2UUMuZSSt+pr9a8XWAqj0HoyVNUfPiZ/PvQ== dependencies: - "@smithy/config-resolver" "^2.0.16" - "@smithy/credential-provider-imds" "^2.0.18" - "@smithy/node-config-provider" "^2.1.3" - "@smithy/property-provider" "^2.0.13" - "@smithy/smithy-client" "^2.1.12" - "@smithy/types" "^2.4.0" + "@smithy/node-config-provider" "^2.1.5" + "@smithy/types" "^2.5.0" tslib "^2.5.0" "@smithy/util-hex-encoding@^2.0.0": @@ -1874,35 +1924,35 @@ dependencies: tslib "^2.5.0" -"@smithy/util-middleware@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-2.0.5.tgz#c63dc491de81641c99ade9309f30c54ad0e28fbd" - integrity sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw== +"@smithy/util-middleware@^2.0.5", "@smithy/util-middleware@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-2.0.6.tgz#fbc23119436baaa1494c11803abaabef8cb3e2c4" + integrity sha512-7W4uuwBvSLgKoLC1x4LfeArCVcbuHdtVaC4g30kKsD1erfICyQ45+tFhhs/dZNeQg+w392fhunCm/+oCcb6BSA== dependencies: - "@smithy/types" "^2.4.0" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@smithy/util-retry@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-2.0.5.tgz#1a93721da082301aca61d8b42380369761a7e80d" - integrity sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw== +"@smithy/util-retry@^2.0.5", "@smithy/util-retry@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-2.0.6.tgz#c887c2c3e356661c1336efb3f085e32fce777124" + integrity sha512-PSO41FofOBmyhPQJwBQJ6mVlaD7Sp9Uff9aBbnfBJ9eqXOE/obrqQjn0PNdkfdvViiPXl49BINfnGcFtSP4kYw== dependencies: - "@smithy/service-error-classification" "^2.0.5" - "@smithy/types" "^2.4.0" + "@smithy/service-error-classification" "^2.0.6" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@smithy/util-stream@^2.0.17": - version "2.0.17" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-2.0.17.tgz#4c980891b0943e9e64949d7afcf1ec4a7b510ea8" - integrity sha512-fP/ZQ27rRvHsqItds8yB7jerwMpZFTL3QqbQbidUiG0+mttMoKdP0ZqnvM8UK5q0/dfc3/pN7g4XKPXOU7oRWw== +"@smithy/util-stream@^2.0.17", "@smithy/util-stream@^2.0.20": + version "2.0.20" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-2.0.20.tgz#0dbff46b07856b608512688437e685c638d75431" + integrity sha512-tT8VASuD8jJu0yjHEMTCPt1o5E3FVzgdsxK6FQLAjXKqVv5V8InCnc0EOsYrijgspbfDqdAJg7r0o2sySfcHVg== dependencies: - "@smithy/fetch-http-handler" "^2.2.4" - "@smithy/node-http-handler" "^2.1.8" - "@smithy/types" "^2.4.0" - "@smithy/util-base64" "^2.0.0" + "@smithy/fetch-http-handler" "^2.2.6" + "@smithy/node-http-handler" "^2.1.9" + "@smithy/types" "^2.5.0" + "@smithy/util-base64" "^2.0.1" "@smithy/util-buffer-from" "^2.0.0" "@smithy/util-hex-encoding" "^2.0.0" - "@smithy/util-utf8" "^2.0.0" + "@smithy/util-utf8" "^2.0.2" tslib "^2.5.0" "@smithy/util-uri-escape@^2.0.0": @@ -1912,91 +1962,91 @@ dependencies: tslib "^2.5.0" -"@smithy/util-utf8@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.0.0.tgz#b4da87566ea7757435e153799df9da717262ad42" - integrity sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ== +"@smithy/util-utf8@^2.0.0", "@smithy/util-utf8@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.0.2.tgz#626b3e173ad137208e27ed329d6bea70f4a1a7f7" + integrity sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA== dependencies: "@smithy/util-buffer-from" "^2.0.0" tslib "^2.5.0" "@smithy/util-waiter@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-2.0.12.tgz#a7348f9fd2bade5f2f3ee7ecf7c43ab86ed244ee" - integrity sha512-3sENmyVa1NnOPoiT2NCApPmu7ukP7S/v7kL9IxNmnygkDldn7/yK0TP42oPJLwB2k3mospNsSePIlqdXEUyPHA== + version "2.0.13" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-2.0.13.tgz#ececb65f582b2808b1a327c1513a840b236d9a9d" + integrity sha512-YovIQatiuM7giEsRFotqJa2i3EbU2EE3PgtpXgtLgpx5rXiZMAwPxXYDFVFhuO0lbqvc/Zx4n+ZIisXOHPSqyg== dependencies: - "@smithy/abort-controller" "^2.0.12" - "@smithy/types" "^2.4.0" + "@smithy/abort-controller" "^2.0.13" + "@smithy/types" "^2.5.0" tslib "^2.5.0" -"@swc/core-darwin-arm64@1.3.95": - version "1.3.95" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.95.tgz#e6b6363fc0a22ee3cd9a63130d2042d5027aae2c" - integrity sha512-VAuBAP3MNetO/yBIBzvorUXq7lUBwhfpJxYViSxyluMwtoQDhE/XWN598TWMwMl1ZuImb56d7eUsuFdjgY7pJw== - -"@swc/core-darwin-x64@1.3.95": - version "1.3.95" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.95.tgz#7911a03f4e0f9359710d3d6ad1dba7b5569efe5d" - integrity sha512-20vF2rvUsN98zGLZc+dsEdHvLoCuiYq/1B+TDeE4oolgTFDmI1jKO+m44PzWjYtKGU9QR95sZ6r/uec0QC5O4Q== - -"@swc/core-linux-arm-gnueabihf@1.3.95": - version "1.3.95" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.95.tgz#95a2c9fc6849df9f1944957669c82c559d65b24f" - integrity sha512-oEudEM8PST1MRNGs+zu0cx5i9uP8TsLE4/L9HHrS07Ck0RJ3DCj3O2fU832nmLe2QxnAGPwBpSO9FntLfOiWEQ== - -"@swc/core-linux-arm64-gnu@1.3.95": - version "1.3.95" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.95.tgz#1914d42041469582e3cc56619890edbcc54e83d6" - integrity sha512-pIhFI+cuC1aYg+0NAPxwT/VRb32f2ia8oGxUjQR6aJg65gLkUYQzdwuUmpMtFR2WVf7WVFYxUnjo4UyMuyh3ng== - -"@swc/core-linux-arm64-musl@1.3.95": - version "1.3.95" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.95.tgz#8d73822a5807575a572d6a2d6cb64587a9f19ce6" - integrity sha512-ZpbTr+QZDT4OPJfjPAmScqdKKaT+wGurvMU5AhxLaf85DuL8HwUwwlL0n1oLieLc47DwIJEMuKQkYhXMqmJHlg== - -"@swc/core-linux-x64-gnu@1.3.95": - version "1.3.95" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.95.tgz#80467727ec11da3de49e6be2abf735964a808483" - integrity sha512-n9SuHEFtdfSJ+sHdNXNRuIOVprB8nbsz+08apKfdo4lEKq6IIPBBAk5kVhPhkjmg2dFVHVo4Tr/OHXM1tzWCCw== - -"@swc/core-linux-x64-musl@1.3.95": - version "1.3.95" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.95.tgz#675a53ac037846bd1bb9840a95ebcb5289265d3b" - integrity sha512-L1JrVlsXU3LC0WwmVnMK9HrOT2uhHahAoPNMJnZQpc18a0paO9fqifPG8M/HjNRffMUXR199G/phJsf326UvVg== - -"@swc/core-win32-arm64-msvc@1.3.95": - version "1.3.95" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.95.tgz#7f0b5d0d0a090c5c625bbc54ffaf427d861c068a" - integrity sha512-YaP4x/aZbUyNdqCBpC2zL8b8n58MEpOUpmOIZK6G1SxGi+2ENht7gs7+iXpWPc0sy7X3YPKmSWMAuui0h8lgAA== - -"@swc/core-win32-ia32-msvc@1.3.95": - version "1.3.95" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.95.tgz#06e2778549a37f0b505b24fd8f40c1c038e29f3e" - integrity sha512-w0u3HI916zT4BC/57gOd+AwAEjXeUlQbGJ9H4p/gzs1zkSHtoDQghVUNy3n/ZKp9KFod/95cA8mbVF9t1+6epQ== - -"@swc/core-win32-x64-msvc@1.3.95": - version "1.3.95" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.95.tgz#40f6b131e84ba6ed97f516edf0f9d5a766c0da64" - integrity sha512-5RGnMt0S6gg4Gc6QtPUJ3Qs9Un4sKqccEzgH/tj7V/DVTJwKdnBKxFZfgQ34OR2Zpz7zGOn889xwsFVXspVWNA== - -"@swc/core@^1.3.95": - version "1.3.95" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.95.tgz#2743b8460e6f29385e3dbe49f3f66277ab233536" - integrity sha512-PMrNeuqIusq9DPDooV3FfNEbZuTu5jKAc04N3Hm6Uk2Fl49cqElLFQ4xvl4qDmVDz97n3n/C1RE0/f6WyGPEiA== +"@swc/core-darwin-arm64@1.3.96": + version "1.3.96" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.96.tgz#7c1c4245ce3f160a5b36a48ed071e3061a839e1d" + integrity sha512-8hzgXYVd85hfPh6mJ9yrG26rhgzCmcLO0h1TIl8U31hwmTbfZLzRitFQ/kqMJNbIBCwmNH1RU2QcJnL3d7f69A== + +"@swc/core-darwin-x64@1.3.96": + version "1.3.96" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.96.tgz#4720ff897ca3f22fe77d0be688968161480c80f0" + integrity sha512-mFp9GFfuPg+43vlAdQZl0WZpZSE8sEzqL7sr/7Reul5McUHP0BaLsEzwjvD035ESfkY8GBZdLpMinblIbFNljQ== + +"@swc/core-linux-arm-gnueabihf@1.3.96": + version "1.3.96" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.96.tgz#2c238ae00b13918ac058b132a31dc57dbcf94e39" + integrity sha512-8UEKkYJP4c8YzYIY/LlbSo8z5Obj4hqcv/fUTHiEePiGsOddgGf7AWjh56u7IoN/0uEmEro59nc1ChFXqXSGyg== + +"@swc/core-linux-arm64-gnu@1.3.96": + version "1.3.96" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.96.tgz#be2e84506b9761b561fb9a341e587f8594a8e55d" + integrity sha512-c/IiJ0s1y3Ymm2BTpyC/xr6gOvoqAVETrivVXHq68xgNms95luSpbYQ28rqaZC8bQC8M5zdXpSc0T8DJu8RJGw== + +"@swc/core-linux-arm64-musl@1.3.96": + version "1.3.96" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.96.tgz#22c9ce17bd923ae358760e668ca33c90210c2ae5" + integrity sha512-i5/UTUwmJLri7zhtF6SAo/4QDQJDH2fhYJaBIUhrICmIkRO/ltURmpejqxsM/ye9Jqv5zG7VszMC0v/GYn/7BQ== + +"@swc/core-linux-x64-gnu@1.3.96": + version "1.3.96" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.96.tgz#c17c072e338341c0ac3507a31ab2a36d16d79c98" + integrity sha512-USdaZu8lTIkm4Yf9cogct/j5eqtdZqTgcTib4I+NloUW0E/hySou3eSyp3V2UAA1qyuC72ld1otXuyKBna0YKQ== + +"@swc/core-linux-x64-musl@1.3.96": + version "1.3.96" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.96.tgz#eb74594a48b4e9cabdce7f5525b3b946f8d6dd16" + integrity sha512-QYErutd+G2SNaCinUVobfL7jWWjGTI0QEoQ6hqTp7PxCJS/dmKmj3C5ZkvxRYcq7XcZt7ovrYCTwPTHzt6lZBg== + +"@swc/core-win32-arm64-msvc@1.3.96": + version "1.3.96" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.96.tgz#6f7c0d20d80534b0676dc6761904288c16e93857" + integrity sha512-hjGvvAduA3Un2cZ9iNP4xvTXOO4jL3G9iakhFsgVhpkU73SGmK7+LN8ZVBEu4oq2SUcHO6caWvnZ881cxGuSpg== + +"@swc/core-win32-ia32-msvc@1.3.96": + version "1.3.96" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.96.tgz#47bb24ef2e4c81407a6786649246983cc69e7854" + integrity sha512-Far2hVFiwr+7VPCM2GxSmbh3ikTpM3pDombE+d69hkedvYHYZxtTF+2LTKl/sXtpbUnsoq7yV/32c9R/xaaWfw== + +"@swc/core-win32-x64-msvc@1.3.96": + version "1.3.96" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.96.tgz#c796e3df7afe2875d227c74add16a7d09c77d8bd" + integrity sha512-4VbSAniIu0ikLf5mBX81FsljnfqjoVGleEkCQv4+zRlyZtO3FHoDPkeLVoy6WRlj7tyrRcfUJ4mDdPkbfTO14g== + +"@swc/core@^1.3.96": + version "1.3.96" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.96.tgz#f04d58b227ceed2fee6617ce2cdddf21d0803f96" + integrity sha512-zwE3TLgoZwJfQygdv2SdCK9mRLYluwDOM53I+dT6Z5ZvrgVENmY3txvWDvduzkV+/8IuvrRbVezMpxcojadRdQ== dependencies: "@swc/counter" "^0.1.1" "@swc/types" "^0.1.5" optionalDependencies: - "@swc/core-darwin-arm64" "1.3.95" - "@swc/core-darwin-x64" "1.3.95" - "@swc/core-linux-arm-gnueabihf" "1.3.95" - "@swc/core-linux-arm64-gnu" "1.3.95" - "@swc/core-linux-arm64-musl" "1.3.95" - "@swc/core-linux-x64-gnu" "1.3.95" - "@swc/core-linux-x64-musl" "1.3.95" - "@swc/core-win32-arm64-msvc" "1.3.95" - "@swc/core-win32-ia32-msvc" "1.3.95" - "@swc/core-win32-x64-msvc" "1.3.95" + "@swc/core-darwin-arm64" "1.3.96" + "@swc/core-darwin-x64" "1.3.96" + "@swc/core-linux-arm-gnueabihf" "1.3.96" + "@swc/core-linux-arm64-gnu" "1.3.96" + "@swc/core-linux-arm64-musl" "1.3.96" + "@swc/core-linux-x64-gnu" "1.3.96" + "@swc/core-linux-x64-musl" "1.3.96" + "@swc/core-win32-arm64-msvc" "1.3.96" + "@swc/core-win32-ia32-msvc" "1.3.96" + "@swc/core-win32-x64-msvc" "1.3.96" "@swc/counter@^0.1.1": version "0.1.2" @@ -2062,9 +2112,9 @@ minimatch "^9.0.0" "@types/babel__core@^7.1.14": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.3.tgz#d5625a50b6f18244425a1359a858c73d70340778" - integrity sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA== + version "7.20.4" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.4.tgz#26a87347e6c6f753b3668398e34496d6d9ac6ac0" + integrity sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -2073,78 +2123,78 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.6" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.6.tgz#676f89f67dc8ddaae923f70ebc5f1fa800c031a8" - integrity sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w== + version "7.6.7" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.7.tgz#a7aebf15c7bc0eb9abd638bdb5c0b8700399c9d0" + integrity sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.3.tgz#db9ac539a2fe05cfe9e168b24f360701bde41f5f" - integrity sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.3.tgz#a971aa47441b28ef17884ff945d0551265a2d058" - integrity sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw== + version "7.20.4" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" + integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== dependencies: "@babel/types" "^7.20.7" -"@types/fs-extra@^11.0.3": - version "11.0.3" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.3.tgz#72c3a247c8dd5703c93d900c584e006476146866" - integrity sha512-sF59BlXtUdzEAL1u0MSvuzWd7PdZvZEtnaVkzX5mjpdWTJ8brG0jUqve3jPCzSzvAKKMHTG8F8o/WMQLtleZdQ== +"@types/fs-extra@^11.0.4": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.4.tgz#e16a863bb8843fba8c5004362b5a73e17becca45" + integrity sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ== dependencies: "@types/jsonfile" "*" "@types/node" "*" "@types/graceful-fs@^4.1.3": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.8.tgz#417e461e4dc79d957dc3107f45fe4973b09c2915" - integrity sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/http-cache-semantics@^4.0.2": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#a3ff232bf7d5c55f38e4e45693eda2ebb545794d" - integrity sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA== + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" - integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz#394798d5f727402eb5ec99eb9618ffcd2b7645a1" - integrity sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz#0313e2608e6d6955d195f55361ddeebd4b74c6e7" - integrity sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.5.6": - version "29.5.6" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.6.tgz#f4cf7ef1b5b0bfc1aa744e41b24d9cc52533130b" - integrity sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w== +"@types/jest@^29.5.8": + version "29.5.8" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.8.tgz#ed5c256fe2bc7c38b1915ee5ef1ff24a3427e120" + integrity sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g== dependencies: expect "^29.0.0" pretty-format "^29.0.0" "@types/json-schema@^7.0.12": - version "7.0.14" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" - integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" @@ -2152,47 +2202,47 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/jsonfile@*": - version "6.1.3" - resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.3.tgz#683d447b413119393e913ecd414a2bc0e5d0f4b9" - integrity sha512-/yqTk2SZ1wIezK0hiRZD7RuSf4B3whFxFamB1kGStv+8zlWScTMcHanzfc0XKWs5vA1TkHeckBlOyM8jxU8nHA== + version "6.1.4" + resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.4.tgz#614afec1a1164e7d670b4a7ad64df3e7beb7b702" + integrity sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ== dependencies: "@types/node" "*" "@types/minimist@^1.2.0": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.4.tgz#81f886786411c45bba3f33e781ab48bd56bfca2e" - integrity sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/mock-fs@^4": - version "4.13.3" - resolved "https://registry.yarnpkg.com/@types/mock-fs/-/mock-fs-4.13.3.tgz#57a53413bd27bca41509053b105430eaf6bf1cce" - integrity sha512-PeXnRqMVBkVjHNCxu1wzPBi9cv5uWVl6535XD11NXt8pasJXh2MHxWvJs6d7eyt/V6BGgHZ4O3LF71CVMdMasA== + version "4.13.4" + resolved "https://registry.yarnpkg.com/@types/mock-fs/-/mock-fs-4.13.4.tgz#e73edb4b4889d44d23f1ea02d6eebe50aa30b09a" + integrity sha512-mXmM0o6lULPI8z3XNnQCpL0BGxPwx1Ul1wXYEPBGl4efShyxW2Rln0JOPEWGyZaYZMM6OVXM/15zUuFMY52ljg== dependencies: "@types/node" "*" "@types/node@*": - version "20.8.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" - integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== + version "20.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" + integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== dependencies: - undici-types "~5.25.1" + undici-types "~5.26.4" "@types/node@^18": - version "18.18.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.7.tgz#bb3a7068dc4ba421b6968f2a259298b3a4e129e8" - integrity sha512-bw+lEsxis6eqJYW8Ql6+yTqkE6RuFtsQPSe5JxXbqYRFQEER5aJA9a5UH9igqDWm3X4iLHIKOHlnAXLM4mi7uQ== + version "18.18.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.9.tgz#5527ea1832db3bba8eb8023ce8497b7d3f299592" + integrity sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ== dependencies: undici-types "~5.26.4" "@types/normalize-package-data@^2.4.0": - version "2.4.3" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" - integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/semver@^7.5.0": - version "7.5.4" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff" - integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ== + version "7.5.5" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.5.tgz#deed5ab7019756c9c90ea86139106b0346223f35" + integrity sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg== "@types/sinon@^10.0.10": version "10.0.20" @@ -2202,44 +2252,44 @@ "@types/sinonjs__fake-timers" "*" "@types/sinonjs__fake-timers@*": - version "8.1.4" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.4.tgz#663bb44e01f6bae4eaae3719d8b037411217c992" - integrity sha512-GDV68H0mBSN449sa5HEj51E0wfpVQb8xNSMzxf/PrypMFcLTMwJMOM/cgXiv71Mq5drkOQmUGvL1okOZcu6RrQ== + version "8.1.5" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz#5fd3592ff10c1e9695d377020c033116cc2889f2" + integrity sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ== "@types/stack-utils@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.2.tgz#01284dde9ef4e6d8cef6422798d9a3ad18a66f8b" - integrity sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/yargs-parser@*": - version "21.0.2" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.2.tgz#7bd04c5da378496ef1695a1008bf8f71847a8b8b" - integrity sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^16.0.0": - version "16.0.7" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.7.tgz#b0d0502cb5f6c17994df72a600049f10bbf17203" - integrity sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg== + version "16.0.8" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.8.tgz#0d57a5a491d85ae75d372a32e657b1779b86c65d" + integrity sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.29" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.29.tgz#06aabc72497b798c643c812a8b561537fea760cf" - integrity sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA== + version "17.0.31" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.31.tgz#8fd0089803fd55d8a285895a18b88cb71a99683c" + integrity sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^6": - version "6.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz#06abe4265e7c82f20ade2dcc0e3403c32d4f148b" - integrity sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw== + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz#52aae65174ff526576351f9ccd41cea01001463f" + integrity sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.8.0" - "@typescript-eslint/type-utils" "6.8.0" - "@typescript-eslint/utils" "6.8.0" - "@typescript-eslint/visitor-keys" "6.8.0" + "@typescript-eslint/scope-manager" "6.11.0" + "@typescript-eslint/type-utils" "6.11.0" + "@typescript-eslint/utils" "6.11.0" + "@typescript-eslint/visitor-keys" "6.11.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -2248,71 +2298,71 @@ ts-api-utils "^1.0.1" "@typescript-eslint/parser@^6": - version "6.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.8.0.tgz#bb2a969d583db242f1ee64467542f8b05c2e28cb" - integrity sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg== - dependencies: - "@typescript-eslint/scope-manager" "6.8.0" - "@typescript-eslint/types" "6.8.0" - "@typescript-eslint/typescript-estree" "6.8.0" - "@typescript-eslint/visitor-keys" "6.8.0" + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.11.0.tgz#9640d9595d905f3be4f278bf515130e6129b202e" + integrity sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ== + dependencies: + "@typescript-eslint/scope-manager" "6.11.0" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/typescript-estree" "6.11.0" + "@typescript-eslint/visitor-keys" "6.11.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@6.8.0": - version "6.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz#5cac7977385cde068ab30686889dd59879811efd" - integrity sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g== +"@typescript-eslint/scope-manager@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz#621f603537c89f4d105733d949aa4d55eee5cea8" + integrity sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A== dependencies: - "@typescript-eslint/types" "6.8.0" - "@typescript-eslint/visitor-keys" "6.8.0" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/visitor-keys" "6.11.0" -"@typescript-eslint/type-utils@6.8.0": - version "6.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz#50365e44918ca0fd159844b5d6ea96789731e11f" - integrity sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g== +"@typescript-eslint/type-utils@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz#d0b8b1ab6c26b974dbf91de1ebc5b11fea24e0d1" + integrity sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA== dependencies: - "@typescript-eslint/typescript-estree" "6.8.0" - "@typescript-eslint/utils" "6.8.0" + "@typescript-eslint/typescript-estree" "6.11.0" + "@typescript-eslint/utils" "6.11.0" debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/types@6.8.0": - version "6.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.8.0.tgz#1ab5d4fe1d613e3f65f6684026ade6b94f7e3ded" - integrity sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ== +"@typescript-eslint/types@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.11.0.tgz#8ad3aa000cbf4bdc4dcceed96e9b577f15e0bf53" + integrity sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA== -"@typescript-eslint/typescript-estree@6.8.0": - version "6.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz#9565f15e0cd12f55cf5aa0dfb130a6cb0d436ba1" - integrity sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg== +"@typescript-eslint/typescript-estree@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz#7b52c12a623bf7f8ec7f8a79901b9f98eb5c7990" + integrity sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ== dependencies: - "@typescript-eslint/types" "6.8.0" - "@typescript-eslint/visitor-keys" "6.8.0" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/visitor-keys" "6.11.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.8.0": - version "6.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.8.0.tgz#d42939c2074c6b59844d0982ce26a51d136c4029" - integrity sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q== +"@typescript-eslint/utils@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.11.0.tgz#11374f59ef4cea50857b1303477c08aafa2ca604" + integrity sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.8.0" - "@typescript-eslint/types" "6.8.0" - "@typescript-eslint/typescript-estree" "6.8.0" + "@typescript-eslint/scope-manager" "6.11.0" + "@typescript-eslint/types" "6.11.0" + "@typescript-eslint/typescript-estree" "6.11.0" semver "^7.5.4" -"@typescript-eslint/visitor-keys@6.8.0": - version "6.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz#cffebed56ae99c45eba901c378a6447b06be58b8" - integrity sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg== +"@typescript-eslint/visitor-keys@6.11.0": + version "6.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz#d991538788923f92ec40d44389e7075b359f3458" + integrity sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ== dependencies: - "@typescript-eslint/types" "6.8.0" + "@typescript-eslint/types" "6.11.0" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": @@ -2344,14 +2394,14 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" + integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== acorn@^8.4.1, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== action-docs@^1.2.0: version "1.2.0" @@ -2510,7 +2560,7 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.6: +array-includes@^3.1.7: version "3.1.7" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== @@ -2531,7 +2581,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlastindex@^1.2.2: +array.prototype.findlastindex@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== @@ -2542,7 +2592,7 @@ array.prototype.findlastindex@^1.2.2: es-shim-unscopables "^1.0.0" get-intrinsic "^1.2.1" -array.prototype.flat@^1.3.1: +array.prototype.flat@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== @@ -2552,7 +2602,7 @@ array.prototype.flat@^1.3.1: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.1: +array.prototype.flatmap@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== @@ -2585,11 +2635,6 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" @@ -2751,6 +2796,30 @@ builtins@^5.0.0: dependencies: semver "^7.0.0" +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" + cacache@^17.0.0: version "17.1.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" @@ -2826,9 +2895,9 @@ camelcase@^7.0.1: integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== caniuse-lite@^1.0.30001541: - version "1.0.30001551" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz#1f2cfa8820bd97c971a57349d7fd8f6e08664a3e" - integrity sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg== + version "1.0.30001561" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz#752f21f56f96f1b1a52e97aae98c57c562d5d9da" + integrity sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw== case@^1.6.3: version "1.6.3" @@ -2862,11 +2931,6 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -3021,6 +3085,11 @@ console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +constructs@^10.0.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/constructs/-/constructs-10.3.0.tgz#4c246fce9cf8e77711ad45944e9fbd41f1501965" + integrity sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ== + conventional-changelog-angular@^5.0.12: version "5.0.13" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" @@ -3221,11 +3290,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - crypto-random-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" @@ -3404,9 +3468,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.4.535: - version "1.4.563" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz#dabb424202754c1fed2d2938ff564b23d3bbf0d3" - integrity sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw== + version "1.4.582" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.582.tgz#4908215182266793499ac57d80e2680d7dd9b3db" + integrity sha512-89o0MGoocwYbzqUUjc+VNpeOFSOK9nIdC5wY4N+PVUarUK0MtjyTjks75AZS2bW4Kl8MdewdFsWaH0jLy+JNoA== emittery@^0.13.1: version "0.13.1" @@ -3550,7 +3614,7 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-import-resolver-node@^0.3.7, eslint-import-resolver-node@^0.3.9: +eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== @@ -3579,26 +3643,26 @@ eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: dependencies: debug "^3.2.7" -eslint-plugin-import@^2.28.1: - version "2.28.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" - integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== +eslint-plugin-import@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" + integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== dependencies: - array-includes "^3.1.6" - array.prototype.findlastindex "^1.2.2" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" + eslint-import-resolver-node "^0.3.9" eslint-module-utils "^2.8.0" - has "^1.0.3" - is-core-module "^2.13.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.6" - object.groupby "^1.0.0" - object.values "^1.1.6" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" semver "^6.3.1" tsconfig-paths "^3.14.2" @@ -3616,14 +3680,14 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8: - version "8.52.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.52.0.tgz#d0cd4a1fac06427a61ef9242b9353f36ea7062fc" - integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg== + version "8.53.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.53.0.tgz#14f2c8244298fcae1f46945459577413ba2697ce" + integrity sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.52.0" + "@eslint/eslintrc" "^2.1.3" + "@eslint/js" "8.53.0" "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -3739,9 +3803,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.9, fast-glob@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -3847,9 +3911,9 @@ find-up@^4.0.0, find-up@^4.1.0: path-exists "^4.0.0" flat-cache@^3.0.4: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" - integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" keyv "^4.5.3" @@ -3894,17 +3958,7 @@ fs-extra@^11.1.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^2.0.0: +fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== @@ -4093,7 +4147,7 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8: +glob@^8, glob@^8.0.1: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -4252,11 +4306,6 @@ has-yarn@^3.0.0: resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== -has@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - hasown@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" @@ -4295,7 +4344,7 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-cache-semantics@^4.1.1: +http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -4310,9 +4359,9 @@ http-proxy-agent@^5.0.0: debug "4" http2-wrapper@^2.1.10: - version "2.2.0" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" - integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== dependencies: quick-lru "^5.1.1" resolve-alpn "^1.2.0" @@ -4387,6 +4436,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -4463,11 +4517,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -4480,7 +4529,7 @@ is-ci@^3.0.1: dependencies: ci-info "^3.2.0" -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1: +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== @@ -4657,9 +4706,9 @@ isexe@^2.0.0: integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4: version "5.2.1" @@ -5351,9 +5400,11 @@ lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== "lru-cache@^9.1.1 || ^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" - integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + version "10.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.2.tgz#34504678cc3266b09b8dfd6fab4e1515258271b7" + integrity sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg== + dependencies: + semver "^7.3.5" make-dir@^4.0.0: version "4.0.0" @@ -5367,7 +5418,29 @@ make-error@1.x, make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.0.3, make-fetch-happen@^11.1.1: +make-fetch-happen@^10.0.3: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== @@ -5405,15 +5478,6 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== -md5@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - meow@^8.0.0: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" @@ -5511,6 +5575,17 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + minipass-fetch@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" @@ -5551,7 +5626,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0: +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -5628,15 +5703,15 @@ nise@^5.1.2: path-to-regexp "^1.7.0" node-gyp@^9.0.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" - integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== + version "9.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== dependencies: env-paths "^2.2.0" exponential-backoff "^3.1.1" glob "^7.1.4" graceful-fs "^4.2.6" - make-fetch-happen "^11.0.3" + make-fetch-happen "^10.0.3" nopt "^6.0.0" npmlog "^6.0.0" rimraf "^3.0.2" @@ -5835,7 +5910,7 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.fromentries@^2.0.6: +object.fromentries@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== @@ -5844,7 +5919,7 @@ object.fromentries@^2.0.6: define-properties "^1.2.0" es-abstract "^1.22.1" -object.groupby@^1.0.0: +object.groupby@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== @@ -5854,7 +5929,7 @@ object.groupby@^1.0.0: es-abstract "^1.22.1" get-intrinsic "^1.2.1" -object.values@^1.1.6: +object.values@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== @@ -6137,41 +6212,21 @@ progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -projen-github-action-typescript@^0.0.392: - version "0.0.392" - resolved "https://registry.yarnpkg.com/projen-github-action-typescript/-/projen-github-action-typescript-0.0.392.tgz#4fb64839b80ec285bfde9b9c5621844c69cc2b67" - integrity sha512-m5qLOnDGLN8hgXaVwvMuj8gAyumV4IROdF4q4Ty8i30oUbY9q6s+lKSHPi5lndnbKm7Ng+nzUeVxlewuEogt+A== - dependencies: - projen "^0.72.28" - -projen@^0.72.28: - version "0.72.31" - resolved "https://registry.yarnpkg.com/projen/-/projen-0.72.31.tgz#05dfbd5067901725e9e09b2acfe4d4b3e8480fcd" - integrity sha512-MCrciIRtKvqJJjA78FlRsNVMT9w6vb9gfQgooOEs+yqdhneMDBiEX7sPYHA1FW6XEFWgK1mkSPxUdQFGbrG24w== - dependencies: - "@iarna/toml" "^2.2.5" - case "^1.6.3" - chalk "^4.1.2" - comment-json "4.2.2" - conventional-changelog-config-spec "^2.1.0" - fast-json-patch "^3.1.1" - glob "^8" - ini "^2.0.0" - semver "^7.5.4" - shx "^0.3.4" - xmlbuilder2 "^3.1.1" - yaml "^2.2.2" - yargs "^17.7.2" +projen-github-action-typescript@^0.0.395: + version "0.0.395" + resolved "https://registry.yarnpkg.com/projen-github-action-typescript/-/projen-github-action-typescript-0.0.395.tgz#b302e18eed9b8f8737614c54b1249b0cc7642fd8" + integrity sha512-6wYEbV3MVt1ikzt1WKfFCFGi2QW94vZF6UU/UkIPY9al9YxfYkS9H3jJ2sz2gtRAXSX9JBk8g3IvmphRpqGsDg== -projen@^0.76.0: - version "0.76.0" - resolved "https://registry.yarnpkg.com/projen/-/projen-0.76.0.tgz#9e16e09f1fd873eb5df86c97b7f35645d13032c2" - integrity sha512-j5PFs/cLJhWtb6yTMxFBTgERLO8kPmKfTDKvvtgNwp33W8bykESiznPAEJVOyzpkxKxi9a7qq+jwwDovHK494w== +projen@^0.76.27: + version "0.76.27" + resolved "https://registry.yarnpkg.com/projen/-/projen-0.76.27.tgz#b3b4dace99ef22170b1f2e8a15a9b8a2e655a0e2" + integrity sha512-f/9MibFkrEk1KYIXcvYI9gWQgb0MU6Vhk/vB3L4CxUla8N5BvfihgWHRAlwTTRBiuwOE1/nQ7u/bskurugxCTw== dependencies: "@iarna/toml" "^2.2.5" case "^1.6.3" chalk "^4.1.2" comment-json "4.2.2" + constructs "^10.0.0" conventional-changelog-config-spec "^2.1.0" fast-json-patch "^3.1.1" glob "^8" @@ -6217,9 +6272,9 @@ proto-list@~1.2.1: integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pupa@^3.1.0: version "3.1.0" @@ -6779,6 +6834,13 @@ ssri@^10.0.0: dependencies: minipass "^7.0.3" +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -7239,23 +7301,25 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici-types@~5.25.1: - version "5.25.3" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" - integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== - undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== undici@^5.25.4: - version "5.26.4" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.26.4.tgz#dc861c35fb53ae025a173a790d984aa9b2e279a1" - integrity sha512-OG+QOf0fTLtazL9P9X7yqWxQ+Z0395Wk6DSkyTxtaq3wQEjIroVe7Y4asCX/vcCxYpNGMnwz8F0qbRYUoaQVMw== + version "5.27.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411" + integrity sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ== dependencies: "@fastify/busboy" "^2.0.0" +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== + dependencies: + unique-slug "^3.0.0" + unique-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -7263,6 +7327,13 @@ unique-filename@^3.0.0: dependencies: unique-slug "^4.0.0" +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== + dependencies: + imurmurhash "^0.1.4" + unique-slug@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" @@ -7278,14 +7349,14 @@ unique-string@^3.0.0: crypto-random-string "^4.0.0" universal-user-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== untildify@^4.0.0: version "4.0.0" @@ -7515,9 +7586,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.2.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9" - integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== + version "2.3.4" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" + integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9"